Commit release 6.4
diff --git a/ANNOUNCE b/ANNOUNCE
new file mode 100644
index 0000000..45b1a0e
--- /dev/null
+++ b/ANNOUNCE
@@ -0,0 +1,673 @@
+                            Announcing ncurses 6.4
+
+Overview
+
+   The  ncurses  (new  curses)  library  is  a free software emulation of
+   curses  in  System  V  Release  4.0 (SVr4), and more. It uses terminfo
+   format,  supports  pads  and  color  and multiple highlights and forms
+   characters and function-key mapping, and has all the other SVr4-curses
+   enhancements  over  BSD curses. SVr4 curses became the basis of X/Open
+   Curses.
+
+   In  mid-June  1995,  the  maintainer of 4.4BSD curses declared that he
+   considered  4.4BSD curses obsolete, and encouraged the keepers of unix
+   releases such as BSD/OS, FreeBSD and NetBSD to switch over to ncurses.
+
+   Since 1995, ncurses has been ported to many systems:
+     * It is used in almost every system based on the Linux kernel (aside
+       from some embedded applications).
+     * It  is  used  as the system curses library on OpenBSD, FreeBSD and
+       MacOS.
+     * It  is used in environments such as Cygwin and MinGW. The first of
+       these was EMX on OS/2 Warp.
+     * It is used (though usually not as the system curses) on all of the
+       vendor  unix  systems,  e.g.,  AIX,  HP-UX,  IRIX64, SCO, Solaris,
+       Tru64.
+     * It should work readily on any ANSI/POSIX-conforming unix.
+
+   The distribution includes the library and support utilities, including
+     * captoinfo, a termcap conversion tool
+     * clear, utility for clearing the screen
+     * infocmp, the terminfo decompiler
+     * tabs, set tabs on a terminal
+     * tic, the terminfo compiler
+     * toe, list (table of) terminfo entries
+     * tput,  utility  for  retrieving  terminal  capabilities  in  shell
+       scripts
+     * tset, to initialize the terminal
+
+   Full manual pages are provided for the library and tools.
+
+   The ncurses distribution is available at ncurses' homepage:
+
+     https://invisible-island.net/archives/ncurses/ or
+     https://invisible-mirror.net/archives/ncurses/ .
+
+   It is also available at the GNU distribution site
+
+     https://ftp.gnu.org/gnu/ncurses/ .
+
+Release Notes
+
+   These notes are for ncurses 6.4, released December 31, 2022.
+
+   This  release  is  designed  to  be source-compatible with ncurses 5.0
+   through  6.3; providing extensions to the application binary interface
+   (ABI).  Although  the  source  can  still be configured to support the
+   ncurses  5  ABI, the reason for the release is to reflect improvements
+   to the ncurses 6 ABI and the supporting utility programs.
+
+   There  are,  of  course,  numerous  other improvements, listed in this
+   announcement.
+
+   The   most  important  bug-fixes/improvements  dealt  with  robustness
+   issues.  The  release notes also mention some other bug-fixes, but are
+   focused  on  new  features and improvements to existing features since
+   ncurses 6.3 release.
+
+  Library improvements
+
+    New features
+
+   There are no new features in this release.
+
+    Other improvements
+
+   These are improvements to existing features:
+     * modify  delscreen  to  more  effectively delete all windows on the
+       given screen.
+     * modify  wnoutrefresh  to  call  pnoutrefresh if its parameter is a
+       pad,  rather than treating it as an error, and modify new_panel to
+       permit its window-parameter to be a pad
+     * modify  curses_trace()  to  show  the trace-mask as symbols, e.g.,
+       TRACE_ORDINARY, DEBUG_LEVEL(3).
+     * improve  checks  for valid mouse events when an intermediate mouse
+       state is not part of the mousemask specified by the caller
+     * allow extended-color number in opts parameter of wattr_on.
+     * improve _tracecchar_t2 formatting of base+combining character.
+     * trim  out some unwanted linker options from ncurses*config and .pc
+       files seen in Fedora 36+.
+     * improve shell-scripts with shellcheck
+     * improve use of "trap" in shell scripts, using a script.
+     * modify make-tar.sh scripts to make timestamps more predictable.
+
+   These are corrections to existing features:
+     * modify  misc/gen-pkgconfig.in  to  allow  for  the  case where the
+       library  directory  does  not  yet  exist, since this is processed
+       before doing an install
+     * set trailing null on string passed from winsnstr to wins_nwstr.
+     * modify  waddch_literal  to  allow  for double-width base character
+       when merging a combining character
+
+  Program improvements
+
+   Several improvements were made to the utility programs:
+
+   infocmp
+
+          + rewrite  canonical_name  function of infocmp to ensure buffer
+            size
+          + improve  readability  of  long parameterized expressions with
+            the  infocmp  "-f"  option  by  allowing  split before a "%p"
+            marker.
+          + modify   verbose-option   of  infocmp,  tic,  toe  to  enable
+            debug-tracing if that is configured.
+
+   tabs
+          limit tab-stop values to max-columns
+
+   tic
+          add   consistency   check   in   tic  for  u6/u7/u8/u9  and  NQ
+          capabilities.
+
+   tput
+          corrected use of original tty-modes in init/reset subcommands
+
+    Examples
+
+   Along  with  the  library and utilities, improvements were made to the
+   ncurses-examples.  Most  of  this  activity  aimed  at  improving  the
+   test-packages:
+     * add  minimal  -h  (usage)  and  -V  (version)  getopt logic to all
+       ncurses-examples programs.
+     * fix an error in "@" command in test/ncurses.c F-menu
+     * add curses_trace to ifdef's for START_TRACE in test/test.priv.h
+     * improve pthread-configuration for test/worm.c
+     * add setlocale call to several test-programs.
+     * workaround  in  test/picsmap.c  for  use of floating point for rgb
+       values by ImageMagick 6.9.11, which appears to use the wrong upper
+       limit.
+     * use  static libraries for AdaCurses test-package for Mageia, since
+       no gprbuild package is available.
+     * install  Ada95  sample  programs  in  libexecdir, adding a wrapper
+       script to invoke those.
+     * install  ncurses-examples programs in libexecdir, adding a wrapper
+       script to invoke those.
+
+   There are other new demo/test programs and reusable examples:
+
+   test/combine
+          demonstrate combining characters
+
+   test/test_delwin
+          demonstrate deleting a window
+
+   test/test_mouse
+          observe  mouse  events  in  the  raw terminal or parsed ncurses
+          modes
+
+   test/test_unget_wch
+          demonstrate the unget_wch and unget functions
+
+  Terminal database
+
+   There are several new terminal descriptions:
+     * mosh
+     * mosh-256color
+     * teken-16color
+     * teken-sc
+     * teken-vt
+     * xgterm
+
+   There  are  many  changes to existing terminal descriptions. Some were
+   updates to several descriptions:
+     * make description-fields distinct
+     * fix errata in description fields
+     * add/use several building-blocks:
+          + aixterm+sl
+          + ansi+cpr
+          + apollo+vt132
+          + decid+cpr
+          + ncr260vp+sl
+          + wyse+sl
+          + x10term+sl
+          + xterm+acs
+          + xterm+alt47
+
+   while  others  affected specific descriptions. These were retested, to
+   take into account changes by their developers:
+     * kitty
+     * teken
+
+   while  these are specific fixes based on reviewing documentation, user
+   reports, or warnings from tic:
+
+   att610+cvis0
+          amended note as per documentation for att610, att620, att730
+
+   kon, kon2, jfbterm
+          revise to undo "linux2.6" change to smacs/rmacs/enacs
+
+   st-0.6
+          add dim, ecma+strikeout
+
+   foot+base
+          add xterm+sl-alt
+
+   dec+sl
+          correct dsl in dec+sl
+
+   mintty and tmux
+          correct setal in mintty/tmux entries, add to vte-2018
+
+   nsterm
+          modify nsterm to use xterm+alt1049
+
+   putty
+          modify putty to use xterm+alt1049
+
+   vte-2018
+          add blink and setal
+
+   A few entries use extensions (user-defined terminal capabilities):
+     * use  ansi+enq  and  decid+cpr in cases where the terminal probably
+       supported the u6-u9 extension
+     * remove u6-u9 from teken-2018
+     * use  NQ  to flag entries where the terminal does not support query
+       and response
+     * add/use bracketed+paste to help identify terminals supporting this
+       xterm feature
+     * modify  samples  for xterm mouse 1002/1003 modes to use 1006 mode,
+       and also provide for focus in/out responses
+     * xterm  patch  #371 supports DEC-compatible status-line. add dec+sl
+       to  xterm-new, per xterm #371, add xterm-p371, add xterm-p370, for
+       use  in  older  terminals, and set "xterm-new" to "xterm-p370" (to
+       ease adoption).
+
+  Documentation
+
+   As usual, this release
+     * improves documentation by describing new features,
+     * attempts  to  improve the description of features which users have
+       found confusing
+     * fills  in overlooked descriptions of features which were described
+       in the NEWS file but treated sketchily in manual pages.
+
+   In  addition  to  providing  background  information  to explain these
+   features   and   show   how   they  evolved,  there  are  corrections,
+   clarifications, etc.:
+     * Corrections:
+          + remove a stray '/' from description of %g in terminfo(5).
+          + correct/improve  font-formatting in curs_getch.3x, as well as
+            other manual pages.
+     * New/improved history and portability sections:
+          + add portability notes for delscreen and delwin in manual.
+          + improve curs_slk.3x discussion of extensions and portability
+     * Other improvements:
+          + improve  curs_bkgd.3x,  explaining  that  bkgdset  can affect
+            results for bkgd
+          + add note on portable memory-leak checking in curs_memleaks.3x
+          + expanded description in resizeterm.3x
+          + add  section  on  releasing  memory  to  curs_termcap.3x  and
+            curs_terminfo.3x manpages.
+          + add  clarification  of  the  scope  of  dynamic  variables in
+            terminfo(5).
+          + improve formatting of ncurses-intro.html and hackguide.html
+          + improve curs_clear.3x links to other pages
+          + update  ncurses-howto,  making documentation fixes along with
+            corrections to example programs.
+          + use  newer  version  1.36 of gnathtml for generating Ada html
+            files.
+          + update external links in Ada95.html
+
+   There  are  no new manual pages (all of the manual page updates are to
+   existing pages).
+
+  Interesting bug-fixes
+
+   While  there  were  many bugs fixed during development of ncurses 6.4,
+   only  a  few  (the  reason  for  this release) were both important and
+   interesting. Most of the bug-fixes were for local issues which did not
+   affect  compatibility across releases. Since those are detailed in the
+   NEWS file no elaboration is needed here.
+
+   The  interesting  bugs were those dealing with memory leaks and buffer
+   overflows.  Although  the utilities are designed for text files (which
+   they do properly), some choose to test them with non-text files.
+     * Text  files  contain  no  embedded  nulls.  Also,  they end with a
+       newline.  Feeding tic non-text files exposed a few cases where the
+       program  did  not  check  for  those  issues. As a result, further
+       processing  of the input found limit-checks whose assumptions were
+       invalid.
+     * Fixing  the limit-checks (first) found a problem with tic managing
+       the  list  of  strings  in  a terminal description. In merging two
+       terminal  descriptions  (i.e.,  the  "use="  feature), tic was not
+       allocating  a  complete copy. A quick repair for that introduced a
+       memory leak.
+     * The  checks  for non-text files are improved (i.e., embedded nulls
+       in  the  input  file  will  cause  tic  to  reject  it rather than
+       attempting to process it).
+     * The string allocations in tic are likewise improved.
+
+  Configuration changes
+
+    Major changes
+
+   There  are  no  major  changes.  No  new  options  were added. Several
+   improvements were made to configure checks.
+
+    Configuration options
+
+   There are a few new/modified configure options:
+
+   --with-abi-version
+          add ABI 7 defaults to configure script.
+
+   --with-caps
+          add   warning   in  configure  script  if  file  specified  for
+          "--with-caps" does not exist.
+
+   --with-manpage-format
+          bzip2 and xz compression are now supported
+
+   --with-xterm-kbs
+          add    check/warning    in    configure    script   if   option
+          "--with-xterm-kbs" is missing or inconsistent
+
+  Portability
+
+   Many  of  the  portability  changes  are implemented via the configure
+   script:
+     * amend  configure option's auto-search to account for systems where
+       none of the directories known to pkg-config exist
+     * corrected regex needed for older pkg-config used in Solaris 10
+     * improve  handling of --with-pkg-config-libdir option, allowing for
+       the case where either $PKG_CONFIG_LIBDIR or the option value has a
+       colon-separated list of directories
+     * if   the   --with-pkg-config-libdir   option  is  not  given,  use
+       ${libdir}/pkgconfig as a default
+     * improve search-path check for pkg-config, e.g., for Debian testing
+       which installs pkg-config with architecture-prefixes.
+     * build-fix for cross-compiling to MingW, conditionally add -lssp
+     * improve configure check for getttynam
+     * fixes to build with dietlibc:
+          + add configure check for fpathconf
+          + add   configure   check   for  math  sine/cosine,  needed  in
+            test/tclock, and eliminate pow() from test/hanoi
+          + use wcsnlen as an alternative to wmemchr if it is not found
+     * modify  configure macro CF_BUILD_CC to check if the build-compiler
+       works,  rather  than that it is different from the cross-compiler,
+       e.g.,  to  accommodate  a  compiler  which  can be used for either
+       purpose with different flags
+     * modify  configure/scripts  to work around interference by GNU grep
+       3.8
+
+   Here are some of the other portability fixes:
+     * change  man_db.renames  to  template,  to  handle  ncurses*-config
+       script with the --extra-suffix configure option.
+     * update   CF_XOPEN_SOURCE  macro,  adding  variants  "gnueabi"  and
+       "gnueabihf" to get _DEFAULT_SOURCE special case, as well as adding
+       GNU  libc  suffixes for "abi64", "abin32", "x32" to distinguish it
+       from other libc flavors.
+     * work  around  musl's  nonstandard  use  of  feature test macros by
+       adding  a  definition  for NCURSES_WIDECHAR to the generated ".pc"
+       and *-config files.
+     * use  "command  -v"  rather than "type" in Ada95/gen/Makefile.in to
+       fix a portability issue.
+     _________________________________________________________________
+
+Features of ncurses
+
+   The  ncurses  package  is  fully upward-compatible with SVr4 (System V
+   Release 4) curses:
+     * All of the SVr4 calls have been implemented (and are documented).
+     * ncurses  supports  all  of  the for SVr4 curses features including
+       keyboard  mapping,  color,  forms-drawing with ACS characters, and
+       automatic recognition of keypad and function keys.
+     * ncurses  provides  these SVr4 add-on libraries (not part of X/Open
+       Curses):
+          + the  panels  library,  supporting  a  stack  of  windows with
+            backing store.
+          + the   menus   library,  supporting  a  uniform  but  flexible
+            interface for menu programming.
+          + the   form   library,   supporting  data  collection  through
+            on-screen forms.
+     * ncurses's  terminal database is fully compatible with that used by
+       SVr4 curses.
+          + ncurses  supports user-defined capabilities which it can see,
+            but  which are hidden from SVr4 curses applications using the
+            same terminal database.
+          + It  can  be optionally configured to match the format used in
+            related systems such as AIX and Tru64.
+          + Alternatively,  ncurses  can  be  configured  to  use  hashed
+            databases  rather  than  the  directory of files used by SVr4
+            curses.
+     * The ncurses utilities have options to allow you to filter terminfo
+       entries for use with less capable curses/terminfo versions such as
+       the HP-UX and AIX ports.
+
+   The ncurses package also has many useful extensions over SVr4:
+     * The  API  is 8-bit clean and base-level conformant with the X/OPEN
+       curses  specification, XSI curses (that is, it implements all BASE
+       level  features,  and  most  EXTENDED  features). It includes many
+       function calls not supported under SVr4 curses (but portability of
+       all calls is documented so you can use the SVr4 subset only).
+     * Unlike  SVr3 curses, ncurses can write to the rightmost-bottommost
+       corner  of  the  screen  if  your terminal has an insert-character
+       capability.
+     * Ada95 and C++ bindings.
+     * Support  for mouse event reporting with X Window xterm and FreeBSD
+       and OS/2 console windows.
+     * Extended mouse support via Alessandro Rubini's gpm package.
+     * The  function  wresize  allows  you  to resize windows, preserving
+       their data.
+     * The  function  use_default_colors allows you to use the terminal's
+       default colors for the default color pair, achieving the effect of
+       transparent colors.
+     * The functions keyok and define_key allow you to better control the
+       use of function keys, e.g., disabling the ncurses KEY_MOUSE, or by
+       defining  more  than  one  control  sequence to map to a given key
+       code.
+     * Support for direct-color terminals, such as modern xterm.
+     * Support for 256-color terminals, such as modern xterm.
+     * Support for 16-color terminals, such as aixterm and modern xterm.
+     * Better  cursor-movement  optimization.  The package now features a
+       cursor-local-movement computation more efficient than either BSD's
+       or System V's.
+     * Super   hardware   scrolling   support.   The  screen-update  code
+       incorporates  a novel, simple, and cheap algorithm that enables it
+       to  make  optimal  use  of hardware scrolling, line-insertion, and
+       line-deletion  for  screen-line  movements. This algorithm is more
+       powerful than the 4.4BSD curses quickch routine.
+     * Real  support  for  terminals  with  the  magic-cookie glitch. The
+       screen-update  code  will  refrain from drawing a highlight if the
+       magic-   cookie  unattributed  spaces  required  just  before  the
+       beginning  and  after the end would step on a non-space character.
+       It  will  automatically  shift  highlight boundaries when doing so
+       would  make it possible to draw the highlight without changing the
+       visual appearance of the screen.
+     * It  is  possible to generate the library with a list of pre-loaded
+       fallback  entries linked to it so that it can serve those terminal
+       types  even  when  no  terminfo tree or termcap file is accessible
+       (this  may  be useful for support of screen-oriented programs that
+       must run in single-user mode).
+     * The tic/captoinfo utility provided with ncurses has the ability to
+       translate  many  termcaps  from  the XENIX, IBM and AT&T extension
+       sets.
+     * A BSD-like tset utility is provided.
+     * The ncurses library and utilities will automatically read terminfo
+       entries  from  $HOME/.terminfo  if  it exists, and compile to that
+       directory  if  it  exists  and the user has no write access to the
+       system  directory.  This feature makes it easier for users to have
+       personal  terminfo  entries without giving up access to the system
+       terminfo directory.
+     * You  may  specify  a  path  of  directories to search for compiled
+       descriptions  with  the  environment  variable TERMINFO_DIRS (this
+       generalizes  the  feature  provided by TERMINFO under stock System
+       V.)
+     * In  terminfo  source files, use capabilities may refer not just to
+       other entries in the same source file (as in System V) but also to
+       compiled  entries  in  either the system terminfo directory or the
+       user's $HOME/.terminfo directory.
+     * The  table-of-entries  utility  toe makes it easy for users to see
+       exactly what terminal types are available on the system.
+     * The library meets the XSI requirement that every macro entry point
+       has  a  corresponding  function  which  may be linked (and will be
+       prototype-checked)  if  the  macro  definition  is  disabled  with
+       #undef.
+     * Extensive  documentation  is  provided (see the Additional Reading
+       section of the ncurses FAQ for online documentation).
+
+Applications using ncurses
+
+   The  ncurses  distribution  includes  a  selection  of  test  programs
+   (including   a   few   games).   These  are  available  separately  as
+   ncurses-examples
+
+   The   ncurses   library  has  been  tested  with  a  wide  variety  of
+   applications including:
+
+   aptitude
+          FrontEnd to Apt, the debian package manager
+
+          https://wiki.debian.org/Aptitude
+
+   cdk
+          Curses Development Kit
+
+          https://invisible-island.net/cdk/
+
+   ded
+          directory-editor
+
+          https://invisible-island.net/ded/
+
+   dialog
+          the  underlying  application used in Slackware's setup, and the
+          basis   for  similar  install/configure  applications  on  many
+          systems.
+
+          https://invisible-island.net/dialog/
+
+   lynx
+          the text WWW browser
+
+          https://lynx.invisible-island.net/
+
+   mutt
+          mail utility
+
+          http://www.mutt.org/
+
+   ncftp
+          file-transfer utility
+
+          https://www.ncftp.com/
+
+   nvi
+          New vi uses ncurses.
+
+          https://sites.google.com/a/bostic.com/keithbostic/vi
+
+   ranger
+          A console file manager with VI key bindings in Python.
+
+          https://ranger.github.io/
+
+   tin
+          newsreader, supporting color, MIME
+
+          http://www.tin.org/
+
+   vifm
+          File manager with vi like keybindings
+
+          https://vifm.info/
+
+   as well as some that use ncurses for the terminfo support alone:
+
+   minicom
+          terminal emulator for serial modem connections
+
+          https://alioth.debian.org/projects/minicom/
+
+   mosh
+          a replacement for ssh.
+
+          https://mosh.org/
+
+   tack
+          terminfo action checker
+
+          https://invisible-island.net/ncurses/tack.html
+
+   tmux
+          terminal multiplexor
+
+          https://github.com/tmux/tmux/wiki
+
+   vile
+          vi-like-emacs  may  be  built  to  use the terminfo, termcap or
+          curses interfaces.
+
+          https://invisible-island.net/vile/
+
+   and finally, those which use only the termcap interface:
+
+   emacs
+          text editor
+
+          https://www.gnu.org/software/emacs/
+
+   less
+          The  most  commonly  used  pager  (a program that displays text
+          files).
+
+          http://www.greenwoodsoftware.com/less/
+
+   screen
+          terminal multiplexor
+
+          https://www.gnu.org/software/screen/
+
+   vim
+          text editor
+
+          https://www.vim.org/
+
+Development activities
+
+   Zeyd  Ben-Halim  started  ncurses  from  a  previous  package pcurses,
+   written  by  Pavel  Curtis.  Eric  S.  Raymond  continued development.
+   Juergen Pfeifer wrote most of the form and menu libraries.
+
+   Ongoing development work is done by Thomas E. Dickey. Thomas E. Dickey
+   has  acted  as  the maintainer for the Free Software Foundation, which
+   held  a  copyright  on ncurses for releases 4.2 through 6.1. Following
+   the release of ncurses 6.1, effective as of release 6.2, copyright for
+   ncurses  reverted  to  Thomas  E.  Dickey  (see  the  ncurses  FAQ for
+   additional information).
+
+   Contact the current maintainers at
+
+     bug-ncurses@gnu.org
+
+   To join the ncurses mailing list, please write email to
+
+     bug-ncurses-request@gnu.org
+
+   containing the line:
+
+     subscribe <name>@<host.domain>
+
+   This list is open to anyone interested in helping with the development
+   and testing of this package.
+
+   Beta versions of ncurses are made available at
+
+     https://invisible-island.net/archives/ncurses/current/ and
+     https://invisible-mirror.net/archives/ncurses/current/ .
+
+   Patches to the current release are made available at
+
+     https://invisible-island.net/archives/ncurses/6.3/ and
+     https://invisible-mirror.net/archives/ncurses/6.3/ .
+
+   There is an archive of the mailing list here:
+
+     http://lists.gnu.org/archive/html/bug-ncurses (also https)
+
+Related resources
+
+   The  release notes make scattered references to these pages, which may
+   be interesting by themselves:
+     * ncurses licensing
+     * Symbol versioning in ncurses
+     * Comments on ncurses versus slang (S-Lang)
+     * Comments on OpenBSD
+     * tack - terminfo action checker
+     * tctest - termcap library checker
+     * Terminal Database
+
+Other resources
+
+   The  distribution  provides  a  newer  version  of the terminfo-format
+   terminal description file once maintained by Eric Raymond . Unlike the
+   older  version, the termcap and terminfo data are provided in the same
+   file, which also provides several user-definable extensions beyond the
+   X/Open specification.
+
+   You  can  find  lots  of  information  on  terminal-related topics not
+   covered  in  the  terminfo  file  at  Richard  Shuford's archive . The
+   collection of computer manuals at bitsavers.org has also been useful.
+
+     * Overview
+     * Release Notes
+          + Library improvements
+               o New features
+               o Other improvements
+          + Program improvements
+               o Utilities
+               o Examples
+          + Terminal database
+          + Documentation
+          + Interesting bug-fixes
+          + Configuration changes
+               o Major changes
+               o Configuration options
+          + Portability
+     * Features of ncurses
+     * Applications using ncurses
+     * Development activities
+     * Related resources
+     * Other resources
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..09dfc9a
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,40 @@
+-------------------------------------------------------------------------------
+-- Copyright 2020,2021 Thomas E. Dickey                                      --
+-- Copyright 2006,2017 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: AUTHORS,v 1.5 2021/06/17 21:20:30 tom Exp $
+-------------------------------------------------------------------------------
+These are the principal authors/contributors of ncurses since 1.9.9e,
+in decreasing order of their contribution:
+
+TD	Thomas E. Dickey
+JPF	Juergen Pfeifer
+ESR	Eric S Raymond
+AVL	Alexander V Lukyanov
+PB	Philippe Blain
+SV	Sven Verdoolaege
+NB  Nicolas Boulenguez
diff --git a/Ada95/Makefile.in b/Ada95/Makefile.in
new file mode 100644
index 0000000..22b922e
--- /dev/null
+++ b/Ada95/Makefile.in
@@ -0,0 +1,121 @@
+# $Id: Makefile.in,v 1.30 2022/12/17 23:33:33 tom Exp $
+##############################################################################
+# Copyright 2020-2021,2022 Thomas E. Dickey                                  #
+# Copyright 1998-2010,2015 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.                                                             #
+##############################################################################
+#
+#  Author:  Juergen Pfeifer, 1996
+#
+#  Version Control
+#  $Revision: 1.30 $
+#
+SHELL		= @SHELL@
+VPATH		= @srcdir@
+THIS		= Makefile
+
+srcdir		= @srcdir@
+prefix		= @prefix@
+exec_prefix	= @exec_prefix@
+bindir		= @bindir@
+datarootdir	= @datarootdir@
+datadir		= @datadir@
+libdir		= @libdir@
+libexecdir	= @libexecdir@
+includedir	= @includedir@
+
+BINDIR		= $(DESTDIR)$(bindir)
+DATADIR		= $(DESTDIR)$(datadir)
+LIBDIR		= $(DESTDIR)$(libdir)
+LIBEXECDIR	= $(DESTDIR)$(libexecdir)
+
+SUBDIRS         = @ADA_SUBDIRS@
+
+INSTALL		= @INSTALL@ @INSTALL_OPT_O@
+INSTALL_SCRIPT	= @INSTALL@
+
+TOP_MFLAGS	= @cf_cv_makeflags@ DESTDIR="$(DESTDIR)" RPATH_LIST="$(RPATH_LIST)"
+@SET_MAKE@
+
+################################################################################
+
+@MAKE_PHONY@.PHONY :	all
+@MAKE_PHONY@.PHONY :	clean
+@MAKE_PHONY@.PHONY :	depend
+@MAKE_PHONY@.PHONY :	distclean
+@MAKE_PHONY@.PHONY :	install
+@MAKE_PHONY@.PHONY :	install.libs
+@MAKE_PHONY@.PHONY :	libs
+@MAKE_PHONY@.PHONY :	mostlyclean
+@MAKE_PHONY@.PHONY :	realclean
+@MAKE_PHONY@.PHONY :	sources
+@MAKE_PHONY@.PHONY :	uninstall
+@MAKE_PHONY@.PHONY :	uninstall.libs
+
+all \
+libs \
+sources \
+install \
+install.libs \
+uninstall \
+uninstall.libs ::
+	for d in $(SUBDIRS); do \
+		( cd $$d && $(MAKE) $(TOP_MFLAGS) $@ ) ;\
+	done
+
+clean \
+mostlyclean ::
+	for d in $(SUBDIRS); do \
+		( cd $$d && $(MAKE) $(TOP_MFLAGS) $@ ) ;\
+	done
+
+distclean \
+realclean ::
+	for d in $(SUBDIRS); do \
+		( cd $$d && $(MAKE) $(TOP_MFLAGS) $@ ) ;\
+	done
+	rm -rf lib
+	for lib_kind in static dynamic; do \
+		rm -rf $${lib_kind}-ali; \
+		rm -rf $${lib_kind}-obj; \
+	done
+	-rm -f config.cache config.log config.status include/ncurses_cfg.h
+	-rm -f Makefile
+
+depend :
+	@
+
+check :
+	@echo "The test-programs are interactive"
+
+tags :
+	@
+
+preinstall :
+	@
+
+install.data :
+	@
diff --git a/Ada95/README b/Ada95/README
new file mode 100644
index 0000000..2e66625
--- /dev/null
+++ b/Ada95/README
@@ -0,0 +1,34 @@
+-------------------------------------------------------------------------------
+-- Copyright 2020,2021 Thomas E. Dickey                                      --
+-- Copyright 1998-2002,2003 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.                                                            --
+-------------------------------------------------------------------------------
+
+--  Author:  Juergen Pfeifer, 1996
+
+The documentation is provided in HTML format in the ./html
+subdirectory. The main document is named index.html
+
diff --git a/Ada95/TODO b/Ada95/TODO
new file mode 100644
index 0000000..1035495
--- /dev/null
+++ b/Ada95/TODO
@@ -0,0 +1,56 @@
+-------------------------------------------------------------------------------
+-- Copyright 2020,2021 Thomas E. Dickey                                      --
+-- Copyright 1998-1999,2006 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: TODO,v 1.8 2021/09/01 23:22:33 tom Exp $
+-------------------------------------------------------------------------------
+
+--  Intensive testing
+    Perhaps the delivery of the Beta will help a bit.
+
+--  Documentation
+    Like most WEB pages: under continuous construction
+
+--  Style cleanup
+
+--  Alternate functions for procedures with out params
+    Comfort purpose
+
+--  Sample program
+    Under continuous construction (and it is not a WEB page!!!)
+
+--  Make the binding objects a shared library
+    They are rather large, so it would make sense, otherwise Ada95
+    would look too large, although the generated code is as compact
+    as C or C++. I'll wait a bit until the GNAT people provide some
+    better support to construct shared libraries.
+
+--  Think about more inlining
+
+--  Check for memory leaks.
+    Oh I would like it so much if the GNAT guys would put an optional
+    GC into their system.
diff --git a/Ada95/aclocal.m4 b/Ada95/aclocal.m4
new file mode 100644
index 0000000..5636b3c
--- /dev/null
+++ b/Ada95/aclocal.m4
@@ -0,0 +1,5186 @@
+dnl***************************************************************************
+dnl Copyright 2018-2021,2022 Thomas E. Dickey                                *
+dnl Copyright 2010-2017,2018 Free Software Foundation, Inc.                  *
+dnl                                                                          *
+dnl Permission is hereby granted, free of charge, to any person obtaining a  *
+dnl copy of this software and associated documentation files (the            *
+dnl "Software"), to deal in the Software without restriction, including      *
+dnl without limitation the rights to use, copy, modify, merge, publish,      *
+dnl distribute, distribute with modifications, sublicense, and/or sell       *
+dnl copies of the Software, and to permit persons to whom the Software is    *
+dnl furnished to do so, subject to the following conditions:                 *
+dnl                                                                          *
+dnl The above copyright notice and this permission notice shall be included  *
+dnl in all copies or substantial portions of the Software.                   *
+dnl                                                                          *
+dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
+dnl OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
+dnl MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
+dnl IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
+dnl DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
+dnl OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
+dnl THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
+dnl                                                                          *
+dnl Except as contained in this notice, the name(s) of the above copyright   *
+dnl holders shall not be used in advertising or otherwise to promote the     *
+dnl sale, use or other dealings in this Software without prior written       *
+dnl authorization.                                                           *
+dnl***************************************************************************
+dnl
+dnl Author: Thomas E. Dickey
+dnl
+dnl $Id: aclocal.m4,v 1.196 2022/10/02 23:55:56 tom Exp $
+dnl Macros used in NCURSES Ada95 auto-configuration script.
+dnl
+dnl These macros are maintained separately from NCURSES.  The copyright on
+dnl this file applies to the aggregation of macros and does not affect use of
+dnl these macros in other applications.
+dnl
+dnl See these pages for additional information:
+dnl		https://invisible-island.net/autoconf/
+dnl		https://invisible-island.net/autoconf/my-autoconf.html
+dnl
+dnl ---------------------------------------------------------------------------
+dnl ---------------------------------------------------------------------------
+dnl CF_ACVERSION_CHECK version: 5 updated: 2014/06/04 19:11:49
+dnl ------------------
+dnl Conditionally generate script according to whether we're using a given autoconf.
+dnl
+dnl $1 = version to compare against
+dnl $2 = code to use if AC_ACVERSION is at least as high as $1.
+dnl $3 = code to use if AC_ACVERSION is older than $1.
+define([CF_ACVERSION_CHECK],
+[
+ifdef([AC_ACVERSION], ,[ifdef([AC_AUTOCONF_VERSION],[m4_copy([AC_AUTOCONF_VERSION],[AC_ACVERSION])],[m4_copy([m4_PACKAGE_VERSION],[AC_ACVERSION])])])dnl
+ifdef([m4_version_compare],
+[m4_if(m4_version_compare(m4_defn([AC_ACVERSION]), [$1]), -1, [$3], [$2])],
+[CF_ACVERSION_COMPARE(
+AC_PREREQ_CANON(AC_PREREQ_SPLIT([$1])),
+AC_PREREQ_CANON(AC_PREREQ_SPLIT(AC_ACVERSION)), AC_ACVERSION, [$2], [$3])])])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ACVERSION_COMPARE version: 3 updated: 2012/10/03 18:39:53
+dnl --------------------
+dnl CF_ACVERSION_COMPARE(MAJOR1, MINOR1, TERNARY1,
+dnl                      MAJOR2, MINOR2, TERNARY2,
+dnl                      PRINTABLE2, not FOUND, FOUND)
+define([CF_ACVERSION_COMPARE],
+[ifelse(builtin([eval], [$2 < $5]), 1,
+[ifelse([$8], , ,[$8])],
+[ifelse([$9], , ,[$9])])])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ADA_INCLUDE_DIRS version: 8 updated: 2013/10/14 04:24:07
+dnl -------------------
+dnl Construct the list of include-options for the C programs in the Ada95
+dnl binding.
+AC_DEFUN([CF_ADA_INCLUDE_DIRS],
+[
+ACPPFLAGS="-I. -I../include -I../../include $ACPPFLAGS"
+if test "$srcdir" != "."; then
+	ACPPFLAGS="-I\${srcdir}/../../include $ACPPFLAGS"
+fi
+if test "$GCC" != yes; then
+	ACPPFLAGS="$ACPPFLAGS -I\${includedir}"
+elif test "$includedir" != "/usr/include"; then
+	if test "$includedir" = '${prefix}/include' ; then
+		if test x$prefix != x/usr ; then
+			ACPPFLAGS="$ACPPFLAGS -I\${includedir}"
+		fi
+	else
+		ACPPFLAGS="$ACPPFLAGS -I\${includedir}"
+	fi
+fi
+AC_SUBST(ACPPFLAGS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ADD_ADAFLAGS version: 1 updated: 2010/06/19 15:22:18
+dnl ---------------
+dnl Add to $ADAFLAGS, which is substituted into makefile and scripts.
+AC_DEFUN([CF_ADD_ADAFLAGS],[
+ 	ADAFLAGS="$ADAFLAGS $1"
+	AC_SUBST(ADAFLAGS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ADD_CFLAGS version: 15 updated: 2020/12/31 10:54:15
+dnl -------------
+dnl Copy non-preprocessor flags to $CFLAGS, preprocessor flags to $CPPFLAGS
+dnl $1 = flags to add
+dnl $2 = if given makes this macro verbose.
+dnl
+dnl Put any preprocessor definitions that use quoted strings in $EXTRA_CPPFLAGS,
+dnl to simplify use of $CPPFLAGS in compiler checks, etc., that are easily
+dnl confused by the quotes (which require backslashes to keep them usable).
+AC_DEFUN([CF_ADD_CFLAGS],
+[
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $1
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[[^=]]*='\''\"[[^"]]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+				CF_APPEND_TEXT(cf_new_extra_cppflags,$cf_add_cflags)
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+				CF_APPEND_TEXT(cf_new_extra_cppflags,$cf_add_cflags)
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+				CF_REMOVE_DEFINE(CPPFLAGS,$CPPFLAGS,$cf_tst_cppflags)
+				;;
+			esac
+			CF_APPEND_TEXT(cf_new_cppflags,$cf_add_cflags)
+			;;
+		esac
+		;;
+	(*)
+		CF_APPEND_TEXT(cf_new_cflags,$cf_add_cflags)
+		;;
+	esac
+	;;
+(yes)
+	CF_APPEND_TEXT(cf_new_extra_cppflags,$cf_add_cflags)
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[[^"]]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+	ifelse([$2],,,[CF_VERBOSE(add to \$CFLAGS $cf_new_cflags)])
+	CF_APPEND_TEXT(CFLAGS,$cf_new_cflags)
+fi
+
+if test -n "$cf_new_cppflags" ; then
+	ifelse([$2],,,[CF_VERBOSE(add to \$CPPFLAGS $cf_new_cppflags)])
+	CF_APPEND_TEXT(CPPFLAGS,$cf_new_cppflags)
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+	ifelse([$2],,,[CF_VERBOSE(add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags)])
+	CF_APPEND_TEXT(EXTRA_CPPFLAGS,$cf_new_extra_cppflags)
+fi
+
+AC_SUBST(EXTRA_CPPFLAGS)
+
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ADD_INCDIR version: 17 updated: 2021/09/04 06:35:04
+dnl -------------
+dnl Add an include-directory to $CPPFLAGS.  Don't add /usr/include, since it is
+dnl redundant.  We don't normally need to add -I/usr/local/include for gcc,
+dnl but old versions (and some misinstalled ones) need that.  To make things
+dnl worse, gcc 3.x may give error messages if -I/usr/local/include is added to
+dnl the include-path).
+AC_DEFUN([CF_ADD_INCDIR],
+[
+if test -n "$1" ; then
+  for cf_add_incdir in $1
+  do
+	while test "$cf_add_incdir" != /usr/include
+	do
+	  if test -d "$cf_add_incdir"
+	  then
+		cf_have_incdir=no
+		if test -n "$CFLAGS$CPPFLAGS" ; then
+		  # a loop is needed to ensure we can add subdirs of existing dirs
+		  for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+			if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+			  cf_have_incdir=yes; break
+			fi
+		  done
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  if test "$cf_add_incdir" = /usr/local/include ; then
+			if test "$GCC" = yes
+			then
+			  cf_save_CPPFLAGS=$CPPFLAGS
+			  CF_APPEND_TEXT(CPPFLAGS,-I$cf_add_incdir)
+			  AC_TRY_COMPILE([#include <stdio.h>],
+				  [printf("Hello")],
+				  [],
+				  [cf_have_incdir=yes])
+			  CPPFLAGS=$cf_save_CPPFLAGS
+			fi
+		  fi
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  CF_VERBOSE(adding $cf_add_incdir to include-path)
+		  ifelse([$2],,CPPFLAGS,[$2])="$ifelse([$2],,CPPFLAGS,[$2]) -I$cf_add_incdir"
+
+		  cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+		  test "$cf_top_incdir" = "$cf_add_incdir" && break
+		  cf_add_incdir="$cf_top_incdir"
+		else
+		  break
+		fi
+	  else
+		break
+	  fi
+	done
+  done
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ADD_LIB version: 2 updated: 2010/06/02 05:03:05
+dnl ----------
+dnl Add a library, used to enforce consistency.
+dnl
+dnl $1 = library to add, without the "-l"
+dnl $2 = variable to update (default $LIBS)
+AC_DEFUN([CF_ADD_LIB],[CF_ADD_LIBS(-l$1,ifelse($2,,LIBS,[$2]))])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ADD_LIBDIR version: 11 updated: 2020/12/31 20:19:42
+dnl -------------
+dnl	Adds to the library-path
+dnl
+dnl	Some machines have trouble with multiple -L options.
+dnl
+dnl $1 is the (list of) directory(s) to add
+dnl $2 is the optional name of the variable to update (default LDFLAGS)
+dnl
+AC_DEFUN([CF_ADD_LIBDIR],
+[
+if test -n "$1" ; then
+	for cf_add_libdir in $1
+	do
+		if test "$cf_add_libdir" = /usr/lib ; then
+			:
+		elif test -d "$cf_add_libdir"
+		then
+			cf_have_libdir=no
+			if test -n "$LDFLAGS$LIBS" ; then
+				# a loop is needed to ensure we can add subdirs of existing dirs
+				for cf_test_libdir in $LDFLAGS $LIBS ; do
+					if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+						cf_have_libdir=yes; break
+					fi
+				done
+			fi
+			if test "$cf_have_libdir" = no ; then
+				CF_VERBOSE(adding $cf_add_libdir to library-path)
+				ifelse([$2],,LDFLAGS,[$2])="-L$cf_add_libdir $ifelse([$2],,LDFLAGS,[$2])"
+			fi
+		fi
+	done
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ADD_LIBS version: 3 updated: 2019/11/02 16:47:33
+dnl -----------
+dnl Add one or more libraries, used to enforce consistency.  Libraries are
+dnl prepended to an existing list, since their dependencies are assumed to
+dnl already exist in the list.
+dnl
+dnl $1 = libraries to add, with the "-l", etc.
+dnl $2 = variable to update (default $LIBS)
+AC_DEFUN([CF_ADD_LIBS],[
+cf_add_libs="[$]ifelse($2,,LIBS,[$2])"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $1; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+ifelse($2,,LIBS,[$2])="$cf_add_libs"
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ADD_SUBDIR_PATH version: 5 updated: 2020/12/31 20:19:42
+dnl ------------------
+dnl Append to a search-list for a nonstandard header/lib-file
+dnl	$1 = the variable to return as result
+dnl	$2 = the package name
+dnl	$3 = the subdirectory, e.g., bin, include or lib
+dnl $4 = the directory under which we will test for subdirectories
+dnl $5 = a directory that we do not want $4 to match
+AC_DEFUN([CF_ADD_SUBDIR_PATH],
+[
+test "x$4" != "x$5" && \
+test -d "$4" && \
+ifelse([$5],NONE,,[{ test -z "$5" || test "x$5" = xNONE || test "x$4" != "x$5"; } &&]) {
+	test -n "$verbose" && echo "	... testing for $3-directories under $4"
+	test -d "$4/$3" &&          $1="[$]$1 $4/$3"
+	test -d "$4/$3/$2" &&       $1="[$]$1 $4/$3/$2"
+	test -d "$4/$3/$2/$3" &&    $1="[$]$1 $4/$3/$2/$3"
+	test -d "$4/$2/$3" &&       $1="[$]$1 $4/$2/$3"
+	test -d "$4/$2/$3/$2" &&    $1="[$]$1 $4/$2/$3/$2"
+}
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_APPEND_CFLAGS version: 3 updated: 2021/09/05 17:25:40
+dnl ----------------
+dnl Use CF_ADD_CFLAGS after first checking for potential redefinitions.
+dnl $1 = flags to add
+dnl $2 = if given makes this macro verbose.
+define([CF_APPEND_CFLAGS],
+[
+for cf_add_cflags in $1
+do
+	case "x$cf_add_cflags" in
+	(x-[[DU]]*)
+		CF_REMOVE_CFLAGS($cf_add_cflags,CFLAGS,[$2])
+		CF_REMOVE_CFLAGS($cf_add_cflags,CPPFLAGS,[$2])
+		;;
+	esac
+	CF_ADD_CFLAGS([$cf_add_cflags],[$2])
+done
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_APPEND_TEXT version: 1 updated: 2017/02/25 18:58:55
+dnl --------------
+dnl use this macro for appending text without introducing an extra blank at
+dnl the beginning
+define([CF_APPEND_TEXT],
+[
+	test -n "[$]$1" && $1="[$]$1 "
+	$1="[$]{$1}$2"
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ARG_DISABLE version: 3 updated: 1999/03/30 17:24:31
+dnl --------------
+dnl Allow user to disable a normally-on option.
+AC_DEFUN([CF_ARG_DISABLE],
+[CF_ARG_OPTION($1,[$2],[$3],[$4],yes)])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ARG_ENABLE version: 3 updated: 1999/03/30 17:24:31
+dnl -------------
+dnl Allow user to enable a normally-off option.
+AC_DEFUN([CF_ARG_ENABLE],
+[CF_ARG_OPTION($1,[$2],[$3],[$4],no)])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ARG_OPTION version: 5 updated: 2015/05/10 19:52:14
+dnl -------------
+dnl Restricted form of AC_ARG_ENABLE that ensures user doesn't give bogus
+dnl values.
+dnl
+dnl Parameters:
+dnl $1 = option name
+dnl $2 = help-string
+dnl $3 = action to perform if option is not default
+dnl $4 = action if perform if option is default
+dnl $5 = default option value (either 'yes' or 'no')
+AC_DEFUN([CF_ARG_OPTION],
+[AC_ARG_ENABLE([$1],[$2],[test "$enableval" != ifelse([$5],no,yes,no) && enableval=ifelse([$5],no,no,yes)
+	if test "$enableval" != "$5" ; then
+ifelse([$3],,[    :]dnl
+,[    $3]) ifelse([$4],,,[
+	else
+		$4])
+	fi],[enableval=$5 ifelse([$4],,,[
+	$4
+])dnl
+])])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_AR_FLAGS version: 9 updated: 2021/01/01 13:31:04
+dnl -----------
+dnl Check for suitable "ar" (archiver) options for updating an archive.
+dnl
+dnl In particular, handle some obsolete cases where the "-" might be omitted,
+dnl as well as a workaround for breakage of make's archive rules by the GNU
+dnl binutils "ar" program.
+AC_DEFUN([CF_AR_FLAGS],[
+AC_REQUIRE([CF_PROG_AR])
+
+AC_CACHE_CHECK(for options to update archives, cf_cv_ar_flags,[
+	case "$cf_cv_system_name" in
+	(*-msvc*)
+		cf_cv_ar_flags=''
+		cat >mk_static_lib.sh <<-EOF
+		#!$SHELL
+		MSVC_BIN="[$]AR"
+		out="\[$]1"
+		shift
+		exec \[$]MSVC_BIN -out:"\[$]out" \[$]@
+		EOF
+		chmod +x mk_static_lib.sh
+		AR=`pwd`/mk_static_lib.sh
+		;;
+	(*)
+		cf_cv_ar_flags=unknown
+		for cf_ar_flags in -curvU -curv curv -crv crv -cqv cqv -rv rv
+		do
+
+			# check if $ARFLAGS already contains this choice
+			if test "x$ARFLAGS" != "x" ; then
+				cf_check_ar_flags=`echo "x$ARFLAGS" | sed -e "s/$cf_ar_flags\$//" -e "s/$cf_ar_flags / /"`
+				if test "x$ARFLAGS" != "$cf_check_ar_flags" ; then
+					cf_cv_ar_flags=
+					break
+				fi
+			fi
+
+			rm -f "conftest.$ac_cv_objext"
+			rm -f conftest.a
+
+			cat >"conftest.$ac_ext" <<EOF
+#line __oline__ "configure"
+int	testdata[[3]] = { 123, 456, 789 };
+EOF
+			if AC_TRY_EVAL(ac_compile) ; then
+				echo "$AR $ARFLAGS $cf_ar_flags conftest.a conftest.$ac_cv_objext" >&AC_FD_CC
+				$AR $ARFLAGS "$cf_ar_flags" conftest.a "conftest.$ac_cv_objext" 2>&AC_FD_CC 1>/dev/null
+				if test -f conftest.a ; then
+					cf_cv_ar_flags="$cf_ar_flags"
+					break
+				fi
+			else
+				CF_VERBOSE(cannot compile test-program)
+				break
+			fi
+		done
+		rm -f conftest.a "conftest.$ac_ext" "conftest.$ac_cv_objext"
+		;;
+	esac
+])
+
+if test -n "$ARFLAGS" ; then
+	if test -n "$cf_cv_ar_flags" ; then
+		ARFLAGS="$ARFLAGS $cf_cv_ar_flags"
+	fi
+else
+	ARFLAGS=$cf_cv_ar_flags
+fi
+
+AC_SUBST(ARFLAGS)
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_BUILD_CC version: 10 updated: 2022/09/24 16:36:41
+dnl -----------
+dnl If we're cross-compiling, allow the user to override the tools and their
+dnl options.  The configure script is oriented toward identifying the host
+dnl compiler, etc., but we need a build compiler to generate parts of the
+dnl source.
+dnl
+dnl $1 = default for $CPPFLAGS
+dnl $2 = default for $LIBS
+AC_DEFUN([CF_BUILD_CC],[
+CF_ACVERSION_CHECK(2.52,,
+	[AC_REQUIRE([CF_PROG_EXT])])
+if test "$cross_compiling" = yes ; then
+
+	# defaults that we might want to override
+	: ${BUILD_CFLAGS:=''}
+	: ${BUILD_CPPFLAGS:='ifelse([$1],,,[$1])'}
+	: ${BUILD_LDFLAGS:=''}
+	: ${BUILD_LIBS:='ifelse([$2],,,[$2])'}
+	: ${BUILD_EXEEXT:='$x'}
+	: ${BUILD_OBJEXT:='o'}
+
+	AC_ARG_WITH(build-cc,
+		[  --with-build-cc=XXX     the build C compiler ($BUILD_CC)],
+		[BUILD_CC="$withval"],
+		[AC_CHECK_PROGS(BUILD_CC, [gcc clang c99 c89 cc cl],none)])
+	AC_MSG_CHECKING(for native build C compiler)
+	AC_MSG_RESULT($BUILD_CC)
+
+	AC_MSG_CHECKING(for native build C preprocessor)
+	AC_ARG_WITH(build-cpp,
+		[  --with-build-cpp=XXX    the build C preprocessor ($BUILD_CPP)],
+		[BUILD_CPP="$withval"],
+		[BUILD_CPP='${BUILD_CC} -E'])
+	AC_MSG_RESULT($BUILD_CPP)
+
+	AC_MSG_CHECKING(for native build C flags)
+	AC_ARG_WITH(build-cflags,
+		[  --with-build-cflags=XXX the build C compiler-flags ($BUILD_CFLAGS)],
+		[BUILD_CFLAGS="$withval"])
+	AC_MSG_RESULT($BUILD_CFLAGS)
+
+	AC_MSG_CHECKING(for native build C preprocessor-flags)
+	AC_ARG_WITH(build-cppflags,
+		[  --with-build-cppflags=XXX the build C preprocessor-flags ($BUILD_CPPFLAGS)],
+		[BUILD_CPPFLAGS="$withval"])
+	AC_MSG_RESULT($BUILD_CPPFLAGS)
+
+	AC_MSG_CHECKING(for native build linker-flags)
+	AC_ARG_WITH(build-ldflags,
+		[  --with-build-ldflags=XXX the build linker-flags ($BUILD_LDFLAGS)],
+		[BUILD_LDFLAGS="$withval"])
+	AC_MSG_RESULT($BUILD_LDFLAGS)
+
+	AC_MSG_CHECKING(for native build linker-libraries)
+	AC_ARG_WITH(build-libs,
+		[  --with-build-libs=XXX   the build libraries (${BUILD_LIBS})],
+		[BUILD_LIBS="$withval"])
+	AC_MSG_RESULT($BUILD_LIBS)
+
+	# this assumes we're on Unix.
+	BUILD_EXEEXT=
+	BUILD_OBJEXT=o
+
+	: ${BUILD_CC:='${CC}'}
+
+	AC_MSG_CHECKING(if the build-compiler "$BUILD_CC" works)
+
+	cf_save_crossed=$cross_compiling
+	cf_save_ac_link=$ac_link
+	cross_compiling=no
+	ac_link='$BUILD_CC -o "conftest$ac_exeext" $BUILD_CFLAGS $BUILD_CPPFLAGS $BUILD_LDFLAGS "conftest.$ac_ext" $BUILD_LIBS >&AS_MESSAGE_LOG_FD'
+
+	AC_TRY_RUN([#include <stdio.h>
+		int main(int argc, char *argv[])
+		{
+			${cf_cv_main_return:-return}(argc < 0 || argv == 0 || argv[0] == 0);
+		}
+	],
+		cf_ok_build_cc=yes,
+		cf_ok_build_cc=no,
+		cf_ok_build_cc=unknown)
+
+	cross_compiling=$cf_save_crossed
+	ac_link=$cf_save_ac_link
+
+	AC_MSG_RESULT($cf_ok_build_cc)
+
+	if test "$cf_ok_build_cc" != yes
+	then
+		AC_MSG_ERROR([Cross-build requires two compilers.
+Use --with-build-cc to specify the native compiler.])
+	fi
+
+else
+	: ${BUILD_CC:='${CC}'}
+	: ${BUILD_CPP:='${CPP}'}
+	: ${BUILD_CFLAGS:='${CFLAGS}'}
+	: ${BUILD_CPPFLAGS:='${CPPFLAGS}'}
+	: ${BUILD_LDFLAGS:='${LDFLAGS}'}
+	: ${BUILD_LIBS:='${LIBS}'}
+	: ${BUILD_EXEEXT:='$x'}
+	: ${BUILD_OBJEXT:='o'}
+fi
+
+AC_SUBST(BUILD_CC)
+AC_SUBST(BUILD_CPP)
+AC_SUBST(BUILD_CFLAGS)
+AC_SUBST(BUILD_CPPFLAGS)
+AC_SUBST(BUILD_LDFLAGS)
+AC_SUBST(BUILD_LIBS)
+AC_SUBST(BUILD_EXEEXT)
+AC_SUBST(BUILD_OBJEXT)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_C11_NORETURN version: 3 updated: 2021/03/28 11:36:23
+dnl ---------------
+AC_DEFUN([CF_C11_NORETURN],
+[
+AC_MSG_CHECKING(if you want to use C11 _Noreturn feature)
+CF_ARG_ENABLE(stdnoreturn,
+	[  --enable-stdnoreturn    enable C11 _Noreturn feature for diagnostics],
+	[enable_stdnoreturn=yes],
+	[enable_stdnoreturn=no])
+AC_MSG_RESULT($enable_stdnoreturn)
+
+if test $enable_stdnoreturn = yes; then
+AC_CACHE_CHECK([for C11 _Noreturn feature], cf_cv_c11_noreturn,
+	[AC_TRY_COMPILE([
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdnoreturn.h>
+static _Noreturn void giveup(void) { exit(0); }
+	],
+	[if (feof(stdin)) giveup()],
+	cf_cv_c11_noreturn=yes,
+	cf_cv_c11_noreturn=no)
+	])
+else
+	cf_cv_c11_noreturn=no,
+fi
+
+if test "$cf_cv_c11_noreturn" = yes; then
+	AC_DEFINE(HAVE_STDNORETURN_H, 1,[Define if <stdnoreturn.h> header is available and working])
+	AC_DEFINE_UNQUOTED(STDC_NORETURN,_Noreturn,[Define if C11 _Noreturn keyword is supported])
+	HAVE_STDNORETURN_H=1
+else
+	HAVE_STDNORETURN_H=0
+fi
+
+AC_SUBST(HAVE_STDNORETURN_H)
+AC_SUBST(STDC_NORETURN)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CC_ENV_FLAGS version: 10 updated: 2020/12/31 18:40:20
+dnl ---------------
+dnl Check for user's environment-breakage by stuffing CFLAGS/CPPFLAGS content
+dnl into CC.  This will not help with broken scripts that wrap the compiler
+dnl with options, but eliminates a more common category of user confusion.
+dnl
+dnl In particular, it addresses the problem of being able to run the C
+dnl preprocessor in a consistent manner.
+dnl
+dnl Caveat: this also disallows blanks in the pathname for the compiler, but
+dnl the nuisance of having inconsistent settings for compiler and preprocessor
+dnl outweighs that limitation.
+AC_DEFUN([CF_CC_ENV_FLAGS],
+[
+# This should have been defined by AC_PROG_CC
+: "${CC:=cc}"
+
+AC_MSG_CHECKING(\$CFLAGS variable)
+case "x$CFLAGS" in
+(*-[[IUD]]*)
+	AC_MSG_RESULT(broken)
+	AC_MSG_WARN(your environment uses the CFLAGS variable to hold CPPFLAGS options)
+	cf_flags="$CFLAGS"
+	CFLAGS=
+	for cf_arg in $cf_flags
+	do
+		CF_ADD_CFLAGS($cf_arg)
+	done
+	;;
+(*)
+	AC_MSG_RESULT(ok)
+	;;
+esac
+
+AC_MSG_CHECKING(\$CC variable)
+case "$CC" in
+(*[[\ \	]]-*)
+	AC_MSG_RESULT(broken)
+	AC_MSG_WARN(your environment uses the CC variable to hold CFLAGS/CPPFLAGS options)
+	# humor him...
+	cf_prog=`echo "$CC" | sed -e 's/	/ /g' -e 's/[[ ]]* / /g' -e 's/[[ ]]*[[ ]]-[[^ ]].*//'`
+	cf_flags=`echo "$CC" | ${AWK:-awk} -v prog="$cf_prog" '{ printf("%s", [substr]([$]0,1+length(prog))); }'`
+	CC="$cf_prog"
+	for cf_arg in $cf_flags
+	do
+		case "x$cf_arg" in
+		(x-[[IUDfgOW]]*)
+			CF_ADD_CFLAGS($cf_arg)
+			;;
+		(*)
+			CC="$CC $cf_arg"
+			;;
+		esac
+	done
+	CF_VERBOSE(resulting CC: '$CC')
+	CF_VERBOSE(resulting CFLAGS: '$CFLAGS')
+	CF_VERBOSE(resulting CPPFLAGS: '$CPPFLAGS')
+	;;
+(*)
+	AC_MSG_RESULT(ok)
+	;;
+esac
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CFG_DEFAULTS version: 16 updated: 2021/01/04 19:33:05
+dnl ---------------
+dnl Determine the default configuration into which we'll install ncurses.  This
+dnl can be overridden by the user's command-line options.  There's two items to
+dnl look for:
+dnl	1. the prefix (e.g., /usr)
+dnl	2. the header files (e.g., /usr/include/ncurses)
+dnl We'll look for a previous installation of ncurses and use the same defaults.
+dnl
+dnl We don't use AC_PREFIX_DEFAULT, because it gets evaluated too soon, and
+dnl we don't use AC_PREFIX_PROGRAM, because we cannot distinguish ncurses's
+dnl programs from a vendor's.
+AC_DEFUN([CF_CFG_DEFAULTS],
+[AC_REQUIRE([AC_PROG_FGREP])dnl
+
+AC_MSG_CHECKING(for prefix)
+if test "x$prefix" = "xNONE" ; then
+	case "$cf_cv_system_name" in
+		# non-vendor systems don't have a conflict
+	(openbsd*|freebsd*|mirbsd*|linux*|cygwin*|msys*|k*bsd*-gnu|mingw*)
+		prefix=/usr
+		;;
+	(*)	prefix=$ac_default_prefix
+		;;
+	esac
+fi
+AC_MSG_RESULT($prefix)
+
+if test "x$prefix" = "xNONE" ; then
+AC_MSG_CHECKING(for default include-directory)
+test -n "$verbose" && echo 1>&AC_FD_MSG
+for cf_symbol in \
+	"$includedir" \
+	"$includedir/ncurses" \
+	"$prefix/include" \
+	"$prefix/include/ncurses" \
+	/usr/local/include \
+	/usr/local/include/ncurses \
+	/usr/include \
+	/usr/include/ncurses
+do
+	cf_dir=`eval echo "$cf_symbol"`
+	if test -f "$cf_dir/curses.h" ; then
+	if ( ${FGREP-fgrep} NCURSES_VERSION "$cf_dir/curses.h" >/dev/null 2>&1 ) ; then
+		includedir="$cf_symbol"
+		test -n "$verbose"  && echo $ECHO_N "	found " 1>&AC_FD_MSG
+		break
+	fi
+	fi
+	test -n "$verbose"  && echo "	tested $cf_dir" 1>&AC_FD_MSG
+done
+AC_MSG_RESULT($includedir)
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CHECK_CACHE version: 13 updated: 2020/12/31 10:54:15
+dnl --------------
+dnl Check if we're accidentally using a cache from a different machine.
+dnl Derive the system name, as a check for reusing the autoconf cache.
+dnl
+dnl If we've packaged config.guess and config.sub, run that (since it does a
+dnl better job than uname).  Normally we'll use AC_CANONICAL_HOST, but allow
+dnl an extra parameter that we may override, e.g., for AC_CANONICAL_SYSTEM
+dnl which is useful in cross-compiles.
+dnl
+dnl Note: we would use $ac_config_sub, but that is one of the places where
+dnl autoconf 2.5x broke compatibility with autoconf 2.13
+AC_DEFUN([CF_CHECK_CACHE],
+[
+if test -f "$srcdir/config.guess" || test -f "$ac_aux_dir/config.guess" ; then
+	ifelse([$1],,[AC_CANONICAL_HOST],[$1])
+	system_name="$host_os"
+else
+	system_name="`(uname -s -r) 2>/dev/null`"
+	if test -z "$system_name" ; then
+		system_name="`(hostname) 2>/dev/null`"
+	fi
+fi
+test -n "$system_name" && AC_DEFINE_UNQUOTED(SYSTEM_NAME,"$system_name",[Define to the system name.])
+AC_CACHE_VAL(cf_cv_system_name,[cf_cv_system_name="$system_name"])
+
+test -z "$system_name" && system_name="$cf_cv_system_name"
+test -n "$cf_cv_system_name" && AC_MSG_RESULT(Configuring for $cf_cv_system_name)
+
+if test ".$system_name" != ".$cf_cv_system_name" ; then
+	AC_MSG_RESULT(Cached system name ($system_name) does not agree with actual ($cf_cv_system_name))
+	AC_MSG_ERROR("Please remove config.cache and try again.")
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CHECK_GNAT_VERSION version: 4 updated: 2021/01/01 13:31:04
+dnl ---------------------
+AC_DEFUN([CF_CHECK_GNAT_VERSION],
+[
+AC_REQUIRE([CF_GNAT_VERSION])
+case "$cf_cv_gnat_version" in
+(3.1[[1-9]]*|3.[[2-9]]*|[[4-9]].*|[[1-9]][[0-9]].[[0-9]]*|20[[0-9]][[0-9]])
+	cf_cv_prog_gnat_correct=yes
+	;;
+(*)
+	AC_MSG_WARN(Unsupported GNAT version $cf_cv_gnat_version. We require 3.11 or better. Disabling Ada95 binding.)
+	cf_cv_prog_gnat_correct=no
+	;;
+esac
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_CHECK_LIBSSP version: 1 updated: 2021/10/30 10:40:19
+dnl ---------------
+dnl Check if libssp is needed, e.g., to work around misconfigured libraries
+dnl used in cross-compiling to MinGW.
+AC_DEFUN([CF_CHECK_LIBSSP],[
+AC_CACHE_CHECK(if ssp library is needed,cf_cv_need_libssp,[
+AC_TRY_LINK([
+#include <sys/types.h>
+#include <dirent.h>
+],[
+       DIR *dp = opendir(".");
+],cf_cv_need_libssp=no,[
+	cf_save_LIBS="$LIBS"
+	LIBS="$LIBS -lssp"
+	AC_TRY_LINK([
+#include <sys/types.h>
+#include <dirent.h>
+	],[
+		   DIR *dp = opendir(".");
+	],cf_cv_need_libssp=yes,
+	  cf_cv_need_libssp=maybe)
+	LIBS="$cf_save_LIBS"
+])dnl
+])
+
+if test "x$cf_cv_need_libssp" = xyes
+then
+	CF_ADD_LIB(ssp)
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CLANG_COMPILER version: 8 updated: 2021/01/01 13:31:04
+dnl -----------------
+dnl Check if the given compiler is really clang.  clang's C driver defines
+dnl __GNUC__ (fooling the configure script into setting $GCC to yes) but does
+dnl not ignore some gcc options.
+dnl
+dnl This macro should be run "soon" after AC_PROG_CC or AC_PROG_CPLUSPLUS, to
+dnl ensure that it is not mistaken for gcc/g++.  It is normally invoked from
+dnl the wrappers for gcc and g++ warnings.
+dnl
+dnl $1 = GCC (default) or GXX
+dnl $2 = CLANG_COMPILER (default)
+dnl $3 = CFLAGS (default) or CXXFLAGS
+AC_DEFUN([CF_CLANG_COMPILER],[
+ifelse([$2],,CLANG_COMPILER,[$2])=no
+
+if test "$ifelse([$1],,[$1],GCC)" = yes ; then
+	AC_MSG_CHECKING(if this is really Clang ifelse([$1],GXX,C++,C) compiler)
+	cf_save_CFLAGS="$ifelse([$3],,CFLAGS,[$3])"
+	AC_TRY_COMPILE([],[
+#ifdef __clang__
+#else
+make an error
+#endif
+],[ifelse([$2],,CLANG_COMPILER,[$2])=yes
+],[])
+	ifelse([$3],,CFLAGS,[$3])="$cf_save_CFLAGS"
+	AC_MSG_RESULT($ifelse([$2],,CLANG_COMPILER,[$2]))
+fi
+
+CLANG_VERSION=none
+
+if test "x$ifelse([$2],,CLANG_COMPILER,[$2])" = "xyes" ; then
+	case "$CC" in
+	(c[[1-9]][[0-9]]|*/c[[1-9]][[0-9]])
+		AC_MSG_WARN(replacing broken compiler alias $CC)
+		CFLAGS="$CFLAGS -std=`echo "$CC" | sed -e 's%.*/%%'`"
+		CC=clang
+		;;
+	esac
+
+	AC_MSG_CHECKING(version of $CC)
+	CLANG_VERSION="`$CC --version 2>/dev/null | sed -e '2,$d' -e 's/^.*(CLANG[[^)]]*) //' -e 's/^.*(Debian[[^)]]*) //' -e 's/^[[^0-9.]]*//' -e 's/[[^0-9.]].*//'`"
+	test -z "$CLANG_VERSION" && CLANG_VERSION=unknown
+	AC_MSG_RESULT($CLANG_VERSION)
+
+	for cf_clang_opt in \
+		-Qunused-arguments \
+		-Wno-error=implicit-function-declaration
+	do
+		AC_MSG_CHECKING(if option $cf_clang_opt works)
+		cf_save_CFLAGS="$CFLAGS"
+		CFLAGS="$CFLAGS $cf_clang_opt"
+		AC_TRY_LINK([
+			#include <stdio.h>],[
+			printf("hello!\\n");],[
+			cf_clang_optok=yes],[
+			cf_clang_optok=no])
+		AC_MSG_RESULT($cf_clang_optok)
+		CFLAGS="$cf_save_CFLAGS"
+		if test "$cf_clang_optok" = yes; then
+			CF_VERBOSE(adding option $cf_clang_opt)
+			CF_APPEND_TEXT(CFLAGS,$cf_clang_opt)
+		fi
+	done
+fi
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_CONST_X_STRING version: 7 updated: 2021/06/07 17:39:17
+dnl -----------------
+dnl The X11R4-X11R6 Xt specification uses an ambiguous String type for most
+dnl character-strings.
+dnl
+dnl It is ambiguous because the specification accommodated the pre-ANSI
+dnl compilers bundled by more than one vendor in lieu of providing a standard C
+dnl compiler other than by costly add-ons.  Because of this, the specification
+dnl did not take into account the use of const for telling the compiler that
+dnl string literals would be in readonly memory.
+dnl
+dnl As a workaround, one could (starting with X11R5) define XTSTRINGDEFINES, to
+dnl let the compiler decide how to represent Xt's strings which were #define'd.
+dnl That does not solve the problem of using the block of Xt's strings which
+dnl are compiled into the library (and is less efficient than one might want).
+dnl
+dnl Xt specification 7 introduces the _CONST_X_STRING symbol which is used both
+dnl when compiling the library and compiling using the library, to tell the
+dnl compiler that String is const.
+AC_DEFUN([CF_CONST_X_STRING],
+[
+AC_REQUIRE([AC_PATH_XTRA])
+
+CF_SAVE_XTRA_FLAGS([CF_CONST_X_STRING])
+
+AC_TRY_COMPILE(
+[
+#include <stdlib.h>
+#include <X11/Intrinsic.h>
+],
+[String foo = malloc(1); free((void*)foo)],[
+
+AC_CACHE_CHECK(for X11/Xt const-feature,cf_cv_const_x_string,[
+	AC_TRY_COMPILE(
+		[
+#define _CONST_X_STRING	/* X11R7.8 (perhaps) */
+#undef  XTSTRINGDEFINES	/* X11R5 and later */
+#include <stdlib.h>
+#include <X11/Intrinsic.h>
+		],[String foo = malloc(1); *foo = 0],[
+			cf_cv_const_x_string=no
+		],[
+			cf_cv_const_x_string=yes
+		])
+])
+
+CF_RESTORE_XTRA_FLAGS([CF_CONST_X_STRING])
+
+case "$cf_cv_const_x_string" in
+(no)
+	CF_APPEND_TEXT(CPPFLAGS,-DXTSTRINGDEFINES)
+	;;
+(*)
+	CF_APPEND_TEXT(CPPFLAGS,-D_CONST_X_STRING)
+	;;
+esac
+
+])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CONST_X_STRING version: 7 updated: 2021/06/07 17:39:17
+dnl -----------------
+dnl The X11R4-X11R6 Xt specification uses an ambiguous String type for most
+dnl character-strings.
+dnl
+dnl It is ambiguous because the specification accommodated the pre-ANSI
+dnl compilers bundled by more than one vendor in lieu of providing a standard C
+dnl compiler other than by costly add-ons.  Because of this, the specification
+dnl did not take into account the use of const for telling the compiler that
+dnl string literals would be in readonly memory.
+dnl
+dnl As a workaround, one could (starting with X11R5) define XTSTRINGDEFINES, to
+dnl let the compiler decide how to represent Xt's strings which were #define'd.
+dnl That does not solve the problem of using the block of Xt's strings which
+dnl are compiled into the library (and is less efficient than one might want).
+dnl
+dnl Xt specification 7 introduces the _CONST_X_STRING symbol which is used both
+dnl when compiling the library and compiling using the library, to tell the
+dnl compiler that String is const.
+AC_DEFUN([CF_CONST_X_STRING],
+[
+AC_REQUIRE([AC_PATH_XTRA])
+
+CF_SAVE_XTRA_FLAGS([CF_CONST_X_STRING])
+
+AC_TRY_COMPILE(
+[
+#include <stdlib.h>
+#include <X11/Intrinsic.h>
+],
+[String foo = malloc(1); free((void*)foo)],[
+
+AC_CACHE_CHECK(for X11/Xt const-feature,cf_cv_const_x_string,[
+	AC_TRY_COMPILE(
+		[
+#define _CONST_X_STRING	/* X11R7.8 (perhaps) */
+#undef  XTSTRINGDEFINES	/* X11R5 and later */
+#include <stdlib.h>
+#include <X11/Intrinsic.h>
+		],[String foo = malloc(1); *foo = 0],[
+			cf_cv_const_x_string=no
+		],[
+			cf_cv_const_x_string=yes
+		])
+])
+
+CF_RESTORE_XTRA_FLAGS([CF_CONST_X_STRING])
+
+case "$cf_cv_const_x_string" in
+(no)
+	CF_APPEND_TEXT(CPPFLAGS,-DXTSTRINGDEFINES)
+	;;
+(*)
+	CF_APPEND_TEXT(CPPFLAGS,-D_CONST_X_STRING)
+	;;
+esac
+
+])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CURSES_HEADER version: 5 updated: 2015/04/23 20:35:30
+dnl ----------------
+dnl Find a "curses" header file, e.g,. "curses.h", or one of the more common
+dnl variations of ncurses' installs.
+dnl
+dnl $1 = ncurses when looking for ncurses, or is empty
+AC_DEFUN([CF_CURSES_HEADER],[
+AC_CACHE_CHECK(if we have identified curses headers,cf_cv_ncurses_header,[
+cf_cv_ncurses_header=none
+for cf_header in \
+	ncurses.h ifelse($1,,,[$1/ncurses.h]) \
+	curses.h ifelse($1,,,[$1/curses.h]) ifelse($1,,[ncurses/ncurses.h ncurses/curses.h])
+do
+AC_TRY_COMPILE([#include <${cf_header}>],
+	[initscr(); tgoto("?", 0,0)],
+	[cf_cv_ncurses_header=$cf_header; break],[])
+done
+])
+
+if test "$cf_cv_ncurses_header" = none ; then
+	AC_MSG_ERROR(No curses header-files found)
+fi
+
+# cheat, to get the right #define's for HAVE_NCURSES_H, etc.
+AC_CHECK_HEADERS($cf_cv_ncurses_header)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_DIRNAME version: 5 updated: 2020/12/31 20:19:42
+dnl ----------
+dnl "dirname" is not portable, so we fake it with a shell script.
+AC_DEFUN([CF_DIRNAME],[$1=`echo "$2" | sed -e 's%/[[^/]]*$%%'`])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_DISABLE_ECHO version: 14 updated: 2021/09/04 06:35:04
+dnl ---------------
+dnl You can always use "make -n" to see the actual options, but it is hard to
+dnl pick out/analyze warning messages when the compile-line is long.
+dnl
+dnl Sets:
+dnl	ECHO_LT - symbol to control if libtool is verbose
+dnl	ECHO_LD - symbol to prefix "cc -o" lines
+dnl	RULE_CC - symbol to put before implicit "cc -c" lines (e.g., .c.o)
+dnl	SHOW_CC - symbol to put before explicit "cc -c" lines
+dnl	ECHO_CC - symbol to put before any "cc" line
+dnl
+AC_DEFUN([CF_DISABLE_ECHO],[
+AC_MSG_CHECKING(if you want to see long compiling messages)
+CF_ARG_DISABLE(echo,
+	[  --disable-echo          do not display "compiling" commands],
+	[
+	ECHO_LT='--silent'
+	ECHO_LD='@echo linking [$]@;'
+	RULE_CC='@echo compiling [$]<'
+	SHOW_CC='@echo compiling [$]@'
+	ECHO_CC='@'
+],[
+	ECHO_LT=''
+	ECHO_LD=''
+	RULE_CC=''
+	SHOW_CC=''
+	ECHO_CC=''
+])
+AC_MSG_RESULT($enableval)
+AC_SUBST(ECHO_LT)
+AC_SUBST(ECHO_LD)
+AC_SUBST(RULE_CC)
+AC_SUBST(SHOW_CC)
+AC_SUBST(ECHO_CC)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_DISABLE_GNAT_PROJECTS version: 1 updated: 2014/06/01 11:34:00
+dnl ------------------------
+AC_DEFUN([CF_DISABLE_GNAT_PROJECTS],[
+AC_MSG_CHECKING(if we want to use GNAT projects)
+CF_ARG_DISABLE(gnat-projects,
+	[  --disable-gnat-projects test: disable GNAT projects even if usable],
+	[enable_gnat_projects=no],
+	[enable_gnat_projects=yes])
+AC_MSG_RESULT($enable_gnat_projects)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ENABLE_BROKEN_LINKER version: 2 updated: 2021/01/02 17:09:14
+dnl -----------------------
+dnl Some linkers cannot reference a data-only object.  Cygwin used to be one.
+dnl This usually follows CF_LINK_DATAONLY, but is not required in case we need
+dnl an unconditional feature.
+AC_DEFUN([CF_ENABLE_BROKEN_LINKER],[
+
+AC_MSG_CHECKING(if you want broken-linker support code)
+AC_ARG_ENABLE(broken_linker,
+	[  --enable-broken_linker  compile with broken-linker support code],
+	[with_broken_linker=$enableval],
+	[with_broken_linker=no])
+AC_MSG_RESULT($with_broken_linker)
+
+: "${BROKEN_LINKER:=0}"
+if test "x$with_broken_linker" = xyes ; then
+	AC_DEFINE(BROKEN_LINKER,1,[Define to 1 to work around linkers which cannot link data-only modules])
+	BROKEN_LINKER=1
+fi
+AC_SUBST(BROKEN_LINKER)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ENABLE_WARNINGS version: 9 updated: 2021/01/05 19:40:50
+dnl ------------------
+dnl Configure-option to enable gcc warnings
+dnl
+dnl $1 = extra options to add, if supported
+dnl $2 = option for checking attributes.  By default, this is done when
+dnl      warnings are enabled.  For other values:
+dnl      yes: always do this, e.g., to use in generated library-headers
+dnl      no: never do this
+AC_DEFUN([CF_ENABLE_WARNINGS],[
+if test "$GCC" = yes || test "$GXX" = yes
+then
+CF_FIX_WARNINGS(CFLAGS)
+CF_FIX_WARNINGS(CPPFLAGS)
+CF_FIX_WARNINGS(LDFLAGS)
+AC_MSG_CHECKING(if you want to turn on gcc warnings)
+CF_ARG_ENABLE(warnings,
+	[  --enable-warnings       test: turn on gcc compiler warnings],
+	[enable_warnings=yes],
+	[enable_warnings=no])
+AC_MSG_RESULT($enable_warnings)
+if test "$enable_warnings" = "yes"
+then
+	ifelse($2,,[CF_GCC_ATTRIBUTES])
+	CF_GCC_WARNINGS($1)
+fi
+ifelse($2,yes,[CF_GCC_ATTRIBUTES])
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_FIND_LIBRARY version: 11 updated: 2021/01/02 09:31:20
+dnl ---------------
+dnl Look for a non-standard library, given parameters for AC_TRY_LINK.  We
+dnl prefer a standard location, and use -L options only if we do not find the
+dnl library in the standard library location(s).
+dnl	$1 = library name
+dnl	$2 = library class, usually the same as library name
+dnl	$3 = includes
+dnl	$4 = code fragment to compile/link
+dnl	$5 = corresponding function-name
+dnl	$6 = flag, nonnull if failure should not cause an error-exit
+dnl
+dnl Sets the variable "$cf_libdir" as a side-effect, so we can see if we had
+dnl to use a -L option.
+AC_DEFUN([CF_FIND_LIBRARY],
+[
+	eval 'cf_cv_have_lib_'"$1"'=no'
+	cf_libdir=""
+	AC_CHECK_FUNC($5,
+		eval 'cf_cv_have_lib_'"$1"'=yes',[
+		cf_save_LIBS="$LIBS"
+		AC_MSG_CHECKING(for $5 in -l$1)
+		LIBS="-l$1 $LIBS"
+		AC_TRY_LINK([$3],[$4],
+			[AC_MSG_RESULT(yes)
+			 eval 'cf_cv_have_lib_'"$1"'=yes'
+			],
+			[AC_MSG_RESULT(no)
+			CF_LIBRARY_PATH(cf_search,$2)
+			for cf_libdir in $cf_search
+			do
+				AC_MSG_CHECKING(for -l$1 in $cf_libdir)
+				LIBS="-L$cf_libdir -l$1 $cf_save_LIBS"
+				AC_TRY_LINK([$3],[$4],
+					[AC_MSG_RESULT(yes)
+			 		 eval 'cf_cv_have_lib_'"$1"'=yes'
+					 break],
+					[AC_MSG_RESULT(no)
+					 LIBS="$cf_save_LIBS"])
+			done
+			])
+		])
+eval 'cf_found_library="[$]cf_cv_have_lib_'"$1"\"
+ifelse($6,,[
+if test "$cf_found_library" = no ; then
+	AC_MSG_ERROR(Cannot link $1 library)
+fi
+])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_FIND_LINKAGE version: 22 updated: 2020/12/31 20:19:42
+dnl ---------------
+dnl Find a library (specifically the linkage used in the code fragment),
+dnl searching for it if it is not already in the library path.
+dnl See also CF_ADD_SEARCHPATH.
+dnl
+dnl Parameters (4-on are optional):
+dnl     $1 = headers for library entrypoint
+dnl     $2 = code fragment for library entrypoint
+dnl     $3 = the library name without the "-l" option or ".so" suffix.
+dnl     $4 = action to perform if successful (default: update CPPFLAGS, etc)
+dnl     $5 = action to perform if not successful
+dnl     $6 = module name, if not the same as the library name
+dnl     $7 = extra libraries
+dnl
+dnl Sets these variables:
+dnl     $cf_cv_find_linkage_$3 - yes/no according to whether linkage is found
+dnl     $cf_cv_header_path_$3 - include-directory if needed
+dnl     $cf_cv_library_path_$3 - library-directory if needed
+dnl     $cf_cv_library_file_$3 - library-file if needed, e.g., -l$3
+AC_DEFUN([CF_FIND_LINKAGE],[
+
+# If the linkage is not already in the $CPPFLAGS/$LDFLAGS configuration, these
+# will be set on completion of the AC_TRY_LINK below.
+cf_cv_header_path_$3=
+cf_cv_library_path_$3=
+
+CF_MSG_LOG([Starting [FIND_LINKAGE]($3,$6)])
+
+cf_save_LIBS="$LIBS"
+
+AC_TRY_LINK([$1],[$2],[
+	cf_cv_find_linkage_$3=yes
+	cf_cv_header_path_$3=/usr/include
+	cf_cv_library_path_$3=/usr/lib
+],[
+
+LIBS="-l$3 $7 $cf_save_LIBS"
+
+AC_TRY_LINK([$1],[$2],[
+	cf_cv_find_linkage_$3=yes
+	cf_cv_header_path_$3=/usr/include
+	cf_cv_library_path_$3=/usr/lib
+	cf_cv_library_file_$3="-l$3"
+],[
+	cf_cv_find_linkage_$3=no
+	LIBS="$cf_save_LIBS"
+
+	CF_VERBOSE(find linkage for $3 library)
+	CF_MSG_LOG([Searching for headers in [FIND_LINKAGE]($3,$6)])
+
+	cf_save_CPPFLAGS="$CPPFLAGS"
+	cf_test_CPPFLAGS="$CPPFLAGS"
+
+	CF_HEADER_PATH(cf_search,ifelse([$6],,[$3],[$6]))
+	for cf_cv_header_path_$3 in $cf_search
+	do
+		if test -d "$cf_cv_header_path_$3" ; then
+			CF_VERBOSE(... testing $cf_cv_header_path_$3)
+			CPPFLAGS="$cf_save_CPPFLAGS"
+			CF_APPEND_TEXT(CPPFLAGS,-I$cf_cv_header_path_$3)
+			AC_TRY_COMPILE([$1],[$2],[
+				CF_VERBOSE(... found $3 headers in $cf_cv_header_path_$3)
+				cf_cv_find_linkage_$3=maybe
+				cf_test_CPPFLAGS="$CPPFLAGS"
+				break],[
+				CPPFLAGS="$cf_save_CPPFLAGS"
+				])
+		fi
+	done
+
+	if test "$cf_cv_find_linkage_$3" = maybe ; then
+
+		CF_MSG_LOG([Searching for $3 library in [FIND_LINKAGE]($3,$6)])
+
+		cf_save_LIBS="$LIBS"
+		cf_save_LDFLAGS="$LDFLAGS"
+
+		ifelse([$6],,,[
+		CPPFLAGS="$cf_test_CPPFLAGS"
+		LIBS="-l$3 $7 $cf_save_LIBS"
+		AC_TRY_LINK([$1],[$2],[
+			CF_VERBOSE(... found $3 library in system)
+			cf_cv_find_linkage_$3=yes])
+			CPPFLAGS="$cf_save_CPPFLAGS"
+			LIBS="$cf_save_LIBS"
+			])
+
+		if test "$cf_cv_find_linkage_$3" != yes ; then
+			CF_LIBRARY_PATH(cf_search,$3)
+			for cf_cv_library_path_$3 in $cf_search
+			do
+				if test -d "$cf_cv_library_path_$3" ; then
+					CF_VERBOSE(... testing $cf_cv_library_path_$3)
+					CPPFLAGS="$cf_test_CPPFLAGS"
+					LIBS="-l$3 $7 $cf_save_LIBS"
+					LDFLAGS="$cf_save_LDFLAGS -L$cf_cv_library_path_$3"
+					AC_TRY_LINK([$1],[$2],[
+					CF_VERBOSE(... found $3 library in $cf_cv_library_path_$3)
+					cf_cv_find_linkage_$3=yes
+					cf_cv_library_file_$3="-l$3"
+					break],[
+					CPPFLAGS="$cf_save_CPPFLAGS"
+					LIBS="$cf_save_LIBS"
+					LDFLAGS="$cf_save_LDFLAGS"
+					])
+				fi
+			done
+			CPPFLAGS="$cf_save_CPPFLAGS"
+			LDFLAGS="$cf_save_LDFLAGS"
+		fi
+
+	else
+		cf_cv_find_linkage_$3=no
+	fi
+	],$7)
+])
+
+LIBS="$cf_save_LIBS"
+
+if test "$cf_cv_find_linkage_$3" = yes ; then
+ifelse([$4],,[
+	CF_ADD_INCDIR($cf_cv_header_path_$3)
+	CF_ADD_LIBDIR($cf_cv_library_path_$3)
+	CF_ADD_LIB($3)
+],[$4])
+else
+ifelse([$5],,AC_MSG_WARN(Cannot find $3 library),[$5])
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_FIXUP_ADAFLAGS version: 2 updated: 2015/04/17 21:13:04
+dnl -----------------
+dnl make ADAFLAGS consistent with CFLAGS
+AC_DEFUN([CF_FIXUP_ADAFLAGS],[
+	AC_MSG_CHECKING(optimization options for ADAFLAGS)
+	case "$CFLAGS" in
+	(*-g*)
+		CF_ADD_ADAFLAGS(-g)
+		;;
+	esac
+	case "$CFLAGS" in
+	(*-O*)
+		cf_O_flag=`echo "$CFLAGS" |sed -e 's/^.*-O/-O/' -e 's/[[ 	]].*//'`
+		CF_ADD_ADAFLAGS($cf_O_flag)
+		;;
+	esac
+	AC_MSG_RESULT($ADAFLAGS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_FIX_WARNINGS version: 4 updated: 2021/12/16 18:22:31
+dnl ---------------
+dnl Warning flags do not belong in CFLAGS, CPPFLAGS, etc.  Any of gcc's
+dnl "-Werror" flags can interfere with configure-checks.  Those go into
+dnl EXTRA_CFLAGS.
+dnl
+dnl $1 = variable name to repair
+define([CF_FIX_WARNINGS],[
+if test "$GCC" = yes || test "$GXX" = yes
+then
+	case [$]$1 in
+	(*-Werror=*)
+		cf_temp_flags=
+		for cf_temp_scan in [$]$1
+		do
+			case "x$cf_temp_scan" in
+			(x-Werror=format*)
+				CF_APPEND_TEXT(cf_temp_flags,$cf_temp_scan)
+				;;
+			(x-Werror=*)
+				CF_APPEND_TEXT(EXTRA_CFLAGS,$cf_temp_scan)
+				;;
+			(*)
+				CF_APPEND_TEXT(cf_temp_flags,$cf_temp_scan)
+				;;
+			esac
+		done
+		if test "x[$]$1" != "x$cf_temp_flags"
+		then
+			CF_VERBOSE(repairing $1: [$]$1)
+			$1="$cf_temp_flags"
+			CF_VERBOSE(... fixed [$]$1)
+			CF_VERBOSE(... extra $EXTRA_CFLAGS)
+		fi
+		;;
+	esac
+fi
+AC_SUBST(EXTRA_CFLAGS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_GCC_ATTRIBUTES version: 24 updated: 2021/03/20 12:00:25
+dnl -----------------
+dnl Test for availability of useful gcc __attribute__ directives to quiet
+dnl compiler warnings.  Though useful, not all are supported -- and contrary
+dnl to documentation, unrecognized directives cause older compilers to barf.
+AC_DEFUN([CF_GCC_ATTRIBUTES],
+[AC_REQUIRE([AC_PROG_FGREP])dnl
+AC_REQUIRE([CF_C11_NORETURN])dnl
+
+if test "$GCC" = yes || test "$GXX" = yes
+then
+cat > conftest.i <<EOF
+#ifndef GCC_PRINTF
+#define GCC_PRINTF 0
+#endif
+#ifndef GCC_SCANF
+#define GCC_SCANF 0
+#endif
+#ifndef GCC_NORETURN
+#define GCC_NORETURN /* nothing */
+#endif
+#ifndef GCC_UNUSED
+#define GCC_UNUSED /* nothing */
+#endif
+EOF
+if test "$GCC" = yes
+then
+	AC_CHECKING([for $CC __attribute__ directives])
+cat > "conftest.$ac_ext" <<EOF
+#line __oline__ "${as_me:-configure}"
+#include "confdefs.h"
+#include "conftest.h"
+#include "conftest.i"
+#if	GCC_PRINTF
+#define GCC_PRINTFLIKE(fmt,var) __attribute__((format(printf,fmt,var)))
+#else
+#define GCC_PRINTFLIKE(fmt,var) /*nothing*/
+#endif
+#if	GCC_SCANF
+#define GCC_SCANFLIKE(fmt,var)  __attribute__((format(scanf,fmt,var)))
+#else
+#define GCC_SCANFLIKE(fmt,var)  /*nothing*/
+#endif
+extern void wow(char *,...) GCC_SCANFLIKE(1,2);
+extern GCC_NORETURN void oops(char *,...) GCC_PRINTFLIKE(1,2);
+extern GCC_NORETURN void foo(void);
+int main(int argc GCC_UNUSED, char *argv[[]] GCC_UNUSED) { (void)argc; (void)argv; return 0; }
+EOF
+	cf_printf_attribute=no
+	cf_scanf_attribute=no
+	for cf_attribute in scanf printf unused noreturn
+	do
+		CF_UPPER(cf_ATTRIBUTE,$cf_attribute)
+		cf_directive="__attribute__(($cf_attribute))"
+		echo "checking for $CC $cf_directive" 1>&AC_FD_CC
+
+		case "$cf_attribute" in
+		(printf)
+			cf_printf_attribute=yes
+			cat >conftest.h <<EOF
+#define GCC_$cf_ATTRIBUTE 1
+EOF
+			;;
+		(scanf)
+			cf_scanf_attribute=yes
+			cat >conftest.h <<EOF
+#define GCC_$cf_ATTRIBUTE 1
+EOF
+			;;
+		(*)
+			cat >conftest.h <<EOF
+#define GCC_$cf_ATTRIBUTE $cf_directive
+EOF
+			;;
+		esac
+
+		if AC_TRY_EVAL(ac_compile); then
+			test -n "$verbose" && AC_MSG_RESULT(... $cf_attribute)
+			cat conftest.h >>confdefs.h
+			case "$cf_attribute" in
+			(noreturn)
+				AC_DEFINE_UNQUOTED(GCC_NORETURN,$cf_directive,[Define to noreturn-attribute for gcc])
+				;;
+			(printf)
+				cf_value='/* nothing */'
+				if test "$cf_printf_attribute" != no ; then
+					cf_value='__attribute__((format(printf,fmt,var)))'
+					AC_DEFINE(GCC_PRINTF,1,[Define to 1 if the compiler supports gcc-like printf attribute.])
+				fi
+				AC_DEFINE_UNQUOTED(GCC_PRINTFLIKE(fmt,var),$cf_value,[Define to printf-attribute for gcc])
+				;;
+			(scanf)
+				cf_value='/* nothing */'
+				if test "$cf_scanf_attribute" != no ; then
+					cf_value='__attribute__((format(scanf,fmt,var)))'
+					AC_DEFINE(GCC_SCANF,1,[Define to 1 if the compiler supports gcc-like scanf attribute.])
+				fi
+				AC_DEFINE_UNQUOTED(GCC_SCANFLIKE(fmt,var),$cf_value,[Define to sscanf-attribute for gcc])
+				;;
+			(unused)
+				AC_DEFINE_UNQUOTED(GCC_UNUSED,$cf_directive,[Define to unused-attribute for gcc])
+				;;
+			esac
+		fi
+	done
+else
+	${FGREP-fgrep} define conftest.i >>confdefs.h
+fi
+rm -rf ./conftest*
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_GCC_VERSION version: 8 updated: 2019/09/07 13:38:36
+dnl --------------
+dnl Find version of gcc, and (because icc/clang pretend to be gcc without being
+dnl compatible), attempt to determine if icc/clang is actually used.
+AC_DEFUN([CF_GCC_VERSION],[
+AC_REQUIRE([AC_PROG_CC])
+GCC_VERSION=none
+if test "$GCC" = yes ; then
+	AC_MSG_CHECKING(version of $CC)
+	GCC_VERSION="`${CC} --version 2>/dev/null | sed -e '2,$d' -e 's/^.*(GCC[[^)]]*) //' -e 's/^.*(Debian[[^)]]*) //' -e 's/^[[^0-9.]]*//' -e 's/[[^0-9.]].*//'`"
+	test -z "$GCC_VERSION" && GCC_VERSION=unknown
+	AC_MSG_RESULT($GCC_VERSION)
+fi
+CF_INTEL_COMPILER(GCC,INTEL_COMPILER,CFLAGS)
+CF_CLANG_COMPILER(GCC,CLANG_COMPILER,CFLAGS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_GCC_WARNINGS version: 41 updated: 2021/01/01 16:53:59
+dnl ---------------
+dnl Check if the compiler supports useful warning options.  There's a few that
+dnl we don't use, simply because they're too noisy:
+dnl
+dnl	-Wconversion (useful in older versions of gcc, but not in gcc 2.7.x)
+dnl	-Winline (usually not worthwhile)
+dnl	-Wredundant-decls (system headers make this too noisy)
+dnl	-Wtraditional (combines too many unrelated messages, only a few useful)
+dnl	-Wwrite-strings (too noisy, but should review occasionally).  This
+dnl		is enabled for ncurses using "--enable-const".
+dnl	-pedantic
+dnl
+dnl Parameter:
+dnl	$1 is an optional list of gcc warning flags that a particular
+dnl		application might want to use, e.g., "no-unused" for
+dnl		-Wno-unused
+dnl Special:
+dnl	If $with_ext_const is "yes", add a check for -Wwrite-strings
+dnl
+AC_DEFUN([CF_GCC_WARNINGS],
+[
+AC_REQUIRE([CF_GCC_VERSION])
+if test "x$have_x" = xyes; then CF_CONST_X_STRING fi
+cat > "conftest.$ac_ext" <<EOF
+#line __oline__ "${as_me:-configure}"
+int main(int argc, char *argv[[]]) { return (argv[[argc-1]] == 0) ; }
+EOF
+if test "$INTEL_COMPILER" = yes
+then
+# The "-wdXXX" options suppress warnings:
+# remark #1419: external declaration in primary source file
+# remark #1683: explicit conversion of a 64-bit integral type to a smaller integral type (potential portability problem)
+# remark #1684: conversion from pointer to same-sized integral type (potential portability problem)
+# remark #193: zero used for undefined preprocessing identifier
+# remark #593: variable "curs_sb_left_arrow" was set but never used
+# remark #810: conversion from "int" to "Dimension={unsigned short}" may lose significant bits
+# remark #869: parameter "tw" was never referenced
+# remark #981: operands are evaluated in unspecified order
+# warning #279: controlling expression is constant
+
+	AC_CHECKING([for $CC warning options])
+	cf_save_CFLAGS="$CFLAGS"
+	EXTRA_CFLAGS="$EXTRA_CFLAGS -Wall"
+	for cf_opt in \
+		wd1419 \
+		wd1683 \
+		wd1684 \
+		wd193 \
+		wd593 \
+		wd279 \
+		wd810 \
+		wd869 \
+		wd981
+	do
+		CFLAGS="$cf_save_CFLAGS $EXTRA_CFLAGS -$cf_opt"
+		if AC_TRY_EVAL(ac_compile); then
+			test -n "$verbose" && AC_MSG_RESULT(... -$cf_opt)
+			EXTRA_CFLAGS="$EXTRA_CFLAGS -$cf_opt"
+		fi
+	done
+	CFLAGS="$cf_save_CFLAGS"
+elif test "$GCC" = yes && test "$GCC_VERSION" != "unknown"
+then
+	AC_CHECKING([for $CC warning options])
+	cf_save_CFLAGS="$CFLAGS"
+	cf_warn_CONST=""
+	test "$with_ext_const" = yes && cf_warn_CONST="Wwrite-strings"
+	cf_gcc_warnings="Wignored-qualifiers Wlogical-op Wvarargs"
+	test "x$CLANG_COMPILER" = xyes && cf_gcc_warnings=
+	for cf_opt in W Wall \
+		Wbad-function-cast \
+		Wcast-align \
+		Wcast-qual \
+		Wdeclaration-after-statement \
+		Wextra \
+		Winline \
+		Wmissing-declarations \
+		Wmissing-prototypes \
+		Wnested-externs \
+		Wpointer-arith \
+		Wshadow \
+		Wstrict-prototypes \
+		Wundef Wno-inline $cf_gcc_warnings $cf_warn_CONST $1
+	do
+		CFLAGS="$cf_save_CFLAGS $EXTRA_CFLAGS -$cf_opt"
+		if AC_TRY_EVAL(ac_compile); then
+			test -n "$verbose" && AC_MSG_RESULT(... -$cf_opt)
+			case "$cf_opt" in
+			(Winline)
+				case "$GCC_VERSION" in
+				([[34]].*)
+					CF_VERBOSE(feature is broken in gcc $GCC_VERSION)
+					continue;;
+				esac
+				;;
+			(Wpointer-arith)
+				case "$GCC_VERSION" in
+				([[12]].*)
+					CF_VERBOSE(feature is broken in gcc $GCC_VERSION)
+					continue;;
+				esac
+				;;
+			esac
+			EXTRA_CFLAGS="$EXTRA_CFLAGS -$cf_opt"
+		fi
+	done
+	CFLAGS="$cf_save_CFLAGS"
+fi
+rm -rf ./conftest*
+
+AC_SUBST(EXTRA_CFLAGS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_GNATPREP_OPT_T version: 1 updated: 2014/08/02 18:37:25
+dnl -----------------
+AC_DEFUN([CF_GNATPREP_OPT_T],[
+AC_CACHE_CHECK(if GNATPREP supports -T option,cf_cv_gnatprep_opt_t,[
+cf_cv_gnatprep_opt_t=no
+gnatprep -T 2>/dev/null >/dev/null && cf_cv_gnatprep_opt_t=yes
+])
+test "$cf_cv_gnatprep_opt_t" = yes && GNATPREP_OPTS="-T $GNATPREP_OPTS"
+AC_SUBST(GNATPREP_OPTS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_GNAT_GENERICS version: 7 updated: 2021/01/01 13:31:04
+dnl ----------------
+AC_DEFUN([CF_GNAT_GENERICS],
+[
+AC_REQUIRE([CF_GNAT_VERSION])
+
+AC_MSG_CHECKING(if GNAT supports generics)
+case "$cf_cv_gnat_version" in
+(3.1[[1-9]]*|3.[[2-9]]*|[[4-9]].*|[[1-9]][[0-9]].[[0-9]]*|20[[0-9]][[0-9]])
+	cf_gnat_generics=yes
+	;;
+(*)
+	cf_gnat_generics=no
+	;;
+esac
+AC_MSG_RESULT($cf_gnat_generics)
+
+if test "$cf_gnat_generics" = yes
+then
+	cf_compile_generics=generics
+	cf_generic_objects="\${GENOBJS}"
+else
+	cf_compile_generics=
+	cf_generic_objects=
+fi
+
+AC_SUBST(cf_compile_generics)
+AC_SUBST(cf_generic_objects)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_GNAT_PROJECTS version: 13 updated: 2021/01/02 17:09:14
+dnl ----------------
+dnl GNAT projects are configured with ".gpr" project files.
+dnl GNAT libraries are a further development, using the project feature.
+AC_DEFUN([CF_GNAT_PROJECTS],
+[
+AC_REQUIRE([CF_GNAT_VERSION])
+AC_REQUIRE([CF_DISABLE_GNAT_PROJECTS])
+
+cf_gnat_libraries=no
+cf_gnat_projects=no
+
+if test "$enable_gnat_projects" != no ; then
+AC_MSG_CHECKING(if GNAT supports project files)
+case "$cf_cv_gnat_version" in
+(3.[[0-9]]*)
+	;;
+(*)
+	case "$cf_cv_system_name" in
+	(cygwin*|msys*)
+		;;
+	(*)
+		rm -rf ./conftest* ./*~conftest*
+		if mkdir conftest.src conftest.bin conftest.lib
+		then
+			cd conftest.src
+			rm -rf ./conftest* ./*~conftest*
+			cat >>library.gpr <<CF_EOF
+project Library is
+  Kind := External ("LIB_KIND");
+  for Library_Name use "ConfTest";
+  for Object_Dir use ".";
+  for Library_ALI_Dir use External("LIBRARY_DIR");
+  for Library_Version use External ("SONAME");
+  for Library_Kind use Kind;
+  for Library_Dir use External("BUILD_DIR");
+  Source_Dir := External ("SOURCE_DIR");
+  for Source_Dirs use (Source_Dir);
+end Library;
+CF_EOF
+			cat >>confpackage.ads <<CF_EOF
+package ConfPackage is
+   procedure conftest;
+end ConfPackage;
+CF_EOF
+			cat >>confpackage.adb <<CF_EOF
+with Text_IO;
+package body ConfPackage is
+   procedure conftest is
+   begin
+      Text_IO.Put ("Hello World");
+      Text_IO.New_Line;
+   end conftest;
+end ConfPackage;
+CF_EOF
+			if ( "$cf_ada_make" $ADAFLAGS \
+					-Plibrary.gpr \
+					-XBUILD_DIR="`cd ../conftest.bin;pwd`" \
+					-XLIBRARY_DIR="`cd ../conftest.lib;pwd`" \
+					-XSOURCE_DIR="`pwd`" \
+					-XSONAME=libConfTest.so.1 \
+					-XLIB_KIND=static 1>&AC_FD_CC 2>&1 ) ; then
+				cf_gnat_projects=yes
+			fi
+			cd ..
+		fi
+		if test -f conftest.lib/confpackage.ali
+		then
+			cf_gnat_libraries=yes
+		fi
+		rm -rf ./conftest* ./*~conftest*
+		;;
+	esac
+	;;
+esac
+AC_MSG_RESULT($cf_gnat_projects)
+fi # enable_gnat_projects
+
+if test "$cf_gnat_projects" = yes
+then
+	AC_MSG_CHECKING(if GNAT supports libraries)
+	AC_MSG_RESULT($cf_gnat_libraries)
+fi
+
+USE_OLD_MAKERULES=""
+USE_GNAT_PROJECTS="#"
+USE_GNAT_MAKE_GPR="#"
+USE_GNAT_GPRBUILD="#"
+
+if test "$cf_gnat_projects" = yes
+then
+	USE_OLD_MAKERULES="#"
+	USE_GNAT_PROJECTS=""
+	if test "$cf_cv_VERSION_GPRBUILD" != no
+	then
+		USE_GNAT_GPRBUILD=""
+	elif test "$cf_cv_VERSION_GNATMAKE" != no
+	then
+		USE_GNAT_MAKE_GPR=""
+	else
+		AC_MSG_WARN(use old makefile rules since tools are missing)
+	fi
+fi
+
+if test "$cf_gnat_libraries" = yes
+then
+	USE_GNAT_LIBRARIES=""
+else
+	USE_GNAT_LIBRARIES="#"
+fi
+
+AC_SUBST(USE_OLD_MAKERULES)
+AC_SUBST(USE_GNAT_PROJECTS)
+AC_SUBST(USE_GNAT_LIBRARIES)
+AC_SUBST(USE_GNAT_MAKE_GPR)
+AC_SUBST(USE_GNAT_GPRBUILD)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_GNAT_SIGINT version: 2 updated: 2021/01/01 13:31:04
+dnl --------------
+dnl Check if gnat supports SIGINT, and presumably tasking.  For the latter, it
+dnl is noted that gnat may compile a tasking unit even for configurations which
+dnl fail at runtime.
+AC_DEFUN([CF_GNAT_SIGINT],[
+AC_CACHE_CHECK(if GNAT supports SIGINT,cf_cv_gnat_sigint,[
+CF_GNAT_TRY_LINK([with Ada.Interrupts.Names;
+
+package ConfTest is
+
+   pragma Warnings (Off);  --  the next pragma exists since 3.11p
+   pragma Unreserve_All_Interrupts;
+   pragma Warnings (On);
+
+   protected Process is
+      procedure Stop;
+      function Continue return Boolean;
+      pragma Attach_Handler (Stop, Ada.Interrupts.Names.SIGINT);
+   private
+      Done : Boolean := False;
+   end Process;
+
+end ConfTest;],
+[package body ConfTest is
+   protected body Process is
+      procedure Stop is
+      begin
+         Done := True;
+      end Stop;
+      function Continue return Boolean is
+      begin
+         return not Done;
+      end Continue;
+   end Process;
+end ConfTest;],
+	[cf_cv_gnat_sigint=yes],
+	[cf_cv_gnat_sigint=no])])
+
+if test "$cf_cv_gnat_sigint" = yes ; then
+	USE_GNAT_SIGINT=""
+else
+	USE_GNAT_SIGINT="#"
+fi
+AC_SUBST(USE_GNAT_SIGINT)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_GNAT_TRY_LINK version: 4 updated: 2021/01/01 13:31:04
+dnl ----------------
+dnl Verify that a test program compiles/links with GNAT.
+dnl $cf_ada_make is set to the program that compiles/links
+dnl $ADAFLAGS may be set to the GNAT flags.
+dnl
+dnl $1 is the text of the spec
+dnl $2 is the text of the body
+dnl $3 is the shell command to execute if successful
+dnl $4 is the shell command to execute if not successful
+AC_DEFUN([CF_GNAT_TRY_LINK],
+[
+rm -rf ./conftest* ./*~conftest*
+cat >>conftest.ads <<CF_EOF
+$1
+CF_EOF
+cat >>conftest.adb <<CF_EOF
+$2
+CF_EOF
+if ( "$cf_ada_make" $ADAFLAGS conftest 1>&AC_FD_CC 2>&1 ) ; then
+ifelse($3,,      :,[      $3])
+ifelse($4,,,[else
+   $4])
+fi
+rm -rf ./conftest* ./*~conftest*
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_GNAT_TRY_RUN version: 6 updated: 2021/01/01 13:31:04
+dnl ---------------
+dnl Verify that a test program compiles and runs with GNAT
+dnl $cf_ada_make is set to the program that compiles/links
+dnl $ADAFLAGS may be set to the GNAT flags.
+dnl
+dnl $1 is the text of the spec
+dnl $2 is the text of the body
+dnl $3 is the shell command to execute if successful
+dnl $4 is the shell command to execute if not successful
+AC_DEFUN([CF_GNAT_TRY_RUN],
+[
+rm -rf ./conftest* ./*~conftest*
+cat >>conftest.ads <<CF_EOF
+$1
+CF_EOF
+cat >>conftest.adb <<CF_EOF
+$2
+CF_EOF
+if ( "$cf_ada_make" $ADAFLAGS conftest 1>&AC_FD_CC 2>&1 ) ; then
+   if ( ./conftest 1>&AC_FD_CC 2>&1 ) ; then
+ifelse($3,,      :,[      $3])
+ifelse($4,,,[   else
+      $4])
+   fi
+ifelse($4,,,[else
+   $4])
+fi
+rm -rf ./conftest* ./*~conftest*
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_GNAT_VERSION version: 22 updated: 2019/12/31 08:53:54
+dnl ---------------
+dnl $1 = cache variable to update
+dnl $2 = program name
+dnl Verify version of GNAT or related tool
+AC_DEFUN([CF_GNAT_VERSION],
+[
+AC_CACHE_CHECK(for ifelse($2,,gnat,$2) version, cf_cv_gnat_version,[
+cf_cv_gnat_version=`ifelse($2,,${cf_ada_make:-gnatmake},$2) --version 2>&1 | \
+	grep '[[0-9]].[[0-9]][[0-9]]*' |\
+	sed -e '2,$d' -e 's/[[^0-9 \.]]//g' -e 's/^[[ ]]*//' -e 's/ .*//'`
+])
+test -z "$cf_cv_gnat_version" && cf_cv_gnat_version=no
+ifelse($1,,,[eval $1=$cf_cv_gnat_version; unset cf_cv_gnat_version])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_GNU_SOURCE version: 10 updated: 2018/12/10 20:09:41
+dnl -------------
+dnl Check if we must define _GNU_SOURCE to get a reasonable value for
+dnl _XOPEN_SOURCE, upon which many POSIX definitions depend.  This is a defect
+dnl (or misfeature) of glibc2, which breaks portability of many applications,
+dnl since it is interwoven with GNU extensions.
+dnl
+dnl Well, yes we could work around it...
+dnl
+dnl Parameters:
+dnl	$1 is the nominal value for _XOPEN_SOURCE
+AC_DEFUN([CF_GNU_SOURCE],
+[
+cf_gnu_xopen_source=ifelse($1,,500,$1)
+
+AC_CACHE_CHECK(if this is the GNU C library,cf_cv_gnu_library,[
+AC_TRY_COMPILE([#include <sys/types.h>],[
+	#if __GLIBC__ > 0 && __GLIBC_MINOR__ >= 0
+		return 0;
+	#elif __NEWLIB__ > 0 && __NEWLIB_MINOR__ >= 0
+		return 0;
+	#else
+	#	error not GNU C library
+	#endif],
+	[cf_cv_gnu_library=yes],
+	[cf_cv_gnu_library=no])
+])
+
+if test x$cf_cv_gnu_library = xyes; then
+
+	# With glibc 2.19 (13 years after this check was begun), _DEFAULT_SOURCE
+	# was changed to help a little.  newlib incorporated the change about 4
+	# years later.
+	AC_CACHE_CHECK(if _DEFAULT_SOURCE can be used as a basis,cf_cv_gnu_library_219,[
+		cf_save="$CPPFLAGS"
+		CF_APPEND_TEXT(CPPFLAGS,-D_DEFAULT_SOURCE)
+		AC_TRY_COMPILE([#include <sys/types.h>],[
+			#if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 19) || (__GLIBC__ > 2)
+				return 0;
+			#elif (__NEWLIB__ == 2 && __NEWLIB_MINOR__ >= 4) || (__GLIBC__ > 3)
+				return 0;
+			#else
+			#	error GNU C library __GLIBC__.__GLIBC_MINOR__ is too old
+			#endif],
+			[cf_cv_gnu_library_219=yes],
+			[cf_cv_gnu_library_219=no])
+		CPPFLAGS="$cf_save"
+	])
+
+	if test "x$cf_cv_gnu_library_219" = xyes; then
+		cf_save="$CPPFLAGS"
+		AC_CACHE_CHECK(if _XOPEN_SOURCE=$cf_gnu_xopen_source works with _DEFAULT_SOURCE,cf_cv_gnu_dftsrc_219,[
+			CF_ADD_CFLAGS(-D_DEFAULT_SOURCE -D_XOPEN_SOURCE=$cf_gnu_xopen_source)
+			AC_TRY_COMPILE([
+				#include <limits.h>
+				#include <sys/types.h>
+				],[
+				#if (_XOPEN_SOURCE >= $cf_gnu_xopen_source) && (MB_LEN_MAX > 1)
+					return 0;
+				#else
+				#	error GNU C library is too old
+				#endif],
+				[cf_cv_gnu_dftsrc_219=yes],
+				[cf_cv_gnu_dftsrc_219=no])
+			])
+		test "x$cf_cv_gnu_dftsrc_219" = "xyes" || CPPFLAGS="$cf_save"
+	else
+		cf_cv_gnu_dftsrc_219=maybe
+	fi
+
+	if test "x$cf_cv_gnu_dftsrc_219" != xyes; then
+
+		AC_CACHE_CHECK(if we must define _GNU_SOURCE,cf_cv_gnu_source,[
+		AC_TRY_COMPILE([#include <sys/types.h>],[
+			#ifndef _XOPEN_SOURCE
+			#error	expected _XOPEN_SOURCE to be defined
+			#endif],
+			[cf_cv_gnu_source=no],
+			[cf_save="$CPPFLAGS"
+			 CF_ADD_CFLAGS(-D_GNU_SOURCE)
+			 AC_TRY_COMPILE([#include <sys/types.h>],[
+				#ifdef _XOPEN_SOURCE
+				#error	expected _XOPEN_SOURCE to be undefined
+				#endif],
+				[cf_cv_gnu_source=no],
+				[cf_cv_gnu_source=yes])
+			CPPFLAGS="$cf_save"
+			])
+		])
+
+		if test "$cf_cv_gnu_source" = yes
+		then
+		AC_CACHE_CHECK(if we should also define _DEFAULT_SOURCE,cf_cv_default_source,[
+			CF_APPEND_TEXT(CPPFLAGS,-D_GNU_SOURCE)
+			AC_TRY_COMPILE([#include <sys/types.h>],[
+				#ifdef _DEFAULT_SOURCE
+				#error	expected _DEFAULT_SOURCE to be undefined
+				#endif],
+				[cf_cv_default_source=no],
+				[cf_cv_default_source=yes])
+			])
+			if test "$cf_cv_default_source" = yes
+			then
+				CF_APPEND_TEXT(CPPFLAGS,-D_DEFAULT_SOURCE)
+			fi
+		fi
+	fi
+
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_HEADER_PATH version: 15 updated: 2021/01/01 13:31:04
+dnl --------------
+dnl Construct a search-list of directories for a nonstandard header-file
+dnl
+dnl Parameters
+dnl	$1 = the variable to return as result
+dnl	$2 = the package name
+AC_DEFUN([CF_HEADER_PATH],
+[
+$1=
+
+# collect the current set of include-directories from compiler flags
+cf_header_path_list=""
+if test -n "${CFLAGS}${CPPFLAGS}" ; then
+	for cf_header_path in $CPPFLAGS $CFLAGS
+	do
+		case "$cf_header_path" in
+		(-I*)
+			cf_header_path=`echo ".$cf_header_path" |sed -e 's/^...//' -e 's,/include$,,'`
+			CF_ADD_SUBDIR_PATH($1,$2,include,$cf_header_path,NONE)
+			cf_header_path_list="$cf_header_path_list [$]$1"
+			;;
+		esac
+	done
+fi
+
+# add the variations for the package we are looking for
+CF_SUBDIR_PATH($1,$2,include)
+
+test "$includedir" != NONE && \
+test "$includedir" != "/usr/include" && \
+test -d "$includedir" && {
+	test -d "$includedir" &&    $1="[$]$1 $includedir"
+	test -d "$includedir/$2" && $1="[$]$1 $includedir/$2"
+}
+
+test "$oldincludedir" != NONE && \
+test "$oldincludedir" != "/usr/include" && \
+test -d "$oldincludedir" && {
+	test -d "$oldincludedir"    && $1="[$]$1 $oldincludedir"
+	test -d "$oldincludedir/$2" && $1="[$]$1 $oldincludedir/$2"
+}
+
+$1="[$]$1 $cf_header_path_list"
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_HELP_MESSAGE version: 4 updated: 2019/12/31 08:53:54
+dnl ---------------
+dnl Insert text into the help-message, for readability, from AC_ARG_WITH.
+AC_DEFUN([CF_HELP_MESSAGE],
+[CF_ACVERSION_CHECK(2.53,[],[
+AC_DIVERT_HELP($1)])dnl
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_INCLUDE_DIRS version: 10 updated: 2014/09/19 20:58:42
+dnl ---------------
+dnl Construct the list of include-options according to whether we're building
+dnl in the source directory or using '--srcdir=DIR' option.
+AC_DEFUN([CF_INCLUDE_DIRS],
+[
+if test "$srcdir" != "."; then
+	CPPFLAGS="-I\${srcdir}/../include $CPPFLAGS"
+fi
+CPPFLAGS="-I../include $CPPFLAGS"
+if test "$srcdir" != "."; then
+	CPPFLAGS="-I\${srcdir} $CPPFLAGS"
+fi
+CPPFLAGS="-I. $CPPFLAGS"
+AC_SUBST(CPPFLAGS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_INSTALL_OPTS version: 2 updated: 2018/08/18 12:19:21
+dnl ---------------
+dnl prompt for/fill-in useful install-program options
+AC_DEFUN([CF_INSTALL_OPTS],
+[
+CF_INSTALL_OPT_S
+CF_INSTALL_OPT_P
+CF_INSTALL_OPT_O
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_INSTALL_OPT_O version: 3 updated: 2020/12/31 20:19:42
+dnl ----------------
+dnl Almost all "install" programs default to the current user's ownership.
+dnl Almost - MINIX is an exception.
+AC_DEFUN([CF_INSTALL_OPT_O],
+[
+AC_MSG_CHECKING(if install needs to be told about ownership)
+case `$ac_config_guess` in
+(*minix)
+	with_install_o=yes
+	;;
+(*)
+	with_install_o=no
+	;;
+esac
+
+AC_MSG_RESULT($with_install_o)
+if test "x$with_install_o" = xyes
+then
+	INSTALL_OPT_O="`id root|sed -e 's/uid=[[0-9]]*(/ -o /' -e 's/gid=[[0-9]]*(/ -g /' -e 's/ [[^=[:space:]]][[^=[:space:]]]*=.*/ /' -e 's/)//g'`"
+else
+	INSTALL_OPT_O=
+fi
+
+AC_SUBST(INSTALL_OPT_O)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_INSTALL_OPT_P version: 3 updated: 2021/01/01 13:31:04
+dnl ----------------
+dnl Some install-programs accept a "-p" option to preserve file modification
+dnl timestamps.  That can be useful as an install option, as well as a way to
+dnl avoid the need for ranlib after copying a static archive.
+AC_DEFUN([CF_INSTALL_OPT_P],
+[
+: "${INSTALL:=install}"
+AC_CACHE_CHECK(if install accepts -p option, cf_cv_install_p,[
+	rm -rf ./conftest*
+	date >conftest.in
+	mkdir conftest.out
+	sleep 3
+	if $INSTALL -p conftest.in conftest.out 2>/dev/null
+	then
+		if test -f conftest.out/conftest.in
+		then
+			test conftest.in -nt conftest.out/conftest.in 2>conftest.err && \
+			test conftest.out/conftest.in -nt conftest.in 2>conftest.err
+			if test -s conftest.err
+			then
+				cf_cv_install_p=no
+			else
+				cf_cv_install_p=yes
+			fi
+		else
+			cf_cv_install_p=no
+		fi
+	else
+		cf_cv_install_p=no
+	fi
+	rm -rf ./conftest*
+])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_INSTALL_OPT_S version: 3 updated: 2021/01/05 19:23:48
+dnl ----------------
+dnl By default, we should strip executables which are installed, but leave the
+dnl ability to suppress that for unit-testing.
+AC_DEFUN([CF_INSTALL_OPT_S],
+[
+AC_MSG_CHECKING(if you want to install stripped executables)
+CF_ARG_DISABLE(stripping,
+	[  --disable-stripping     do not strip (debug info) installed executables],
+	[enable_stripping=no],
+	[enable_stripping=yes])
+AC_MSG_RESULT($enable_stripping)
+
+if test "$enable_stripping" = yes
+then
+	INSTALL_OPT_S="-s"
+else
+	INSTALL_OPT_S=
+fi
+AC_SUBST(INSTALL_OPT_S)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_INTEL_COMPILER version: 8 updated: 2021/01/01 16:53:59
+dnl -----------------
+dnl Check if the given compiler is really the Intel compiler for Linux.  It
+dnl tries to imitate gcc, but does not return an error when it finds a mismatch
+dnl between prototypes, e.g., as exercised by CF_MISSING_CHECK.
+dnl
+dnl This macro should be run "soon" after AC_PROG_CC or AC_PROG_CPLUSPLUS, to
+dnl ensure that it is not mistaken for gcc/g++.  It is normally invoked from
+dnl the wrappers for gcc and g++ warnings.
+dnl
+dnl $1 = GCC (default) or GXX
+dnl $2 = INTEL_COMPILER (default) or INTEL_CPLUSPLUS
+dnl $3 = CFLAGS (default) or CXXFLAGS
+AC_DEFUN([CF_INTEL_COMPILER],[
+AC_REQUIRE([AC_CANONICAL_HOST])
+ifelse([$2],,INTEL_COMPILER,[$2])=no
+
+if test "$ifelse([$1],,[$1],GCC)" = yes ; then
+	case "$host_os" in
+	(linux*|gnu*)
+		AC_MSG_CHECKING(if this is really Intel ifelse([$1],GXX,C++,C) compiler)
+		cf_save_CFLAGS="$ifelse([$3],,CFLAGS,[$3])"
+		ifelse([$3],,CFLAGS,[$3])="$ifelse([$3],,CFLAGS,[$3]) -no-gcc"
+		AC_TRY_COMPILE([],[
+#ifdef __INTEL_COMPILER
+#else
+make an error
+#endif
+],[ifelse([$2],,INTEL_COMPILER,[$2])=yes
+cf_save_CFLAGS="$cf_save_CFLAGS -we147"
+],[])
+		ifelse([$3],,CFLAGS,[$3])="$cf_save_CFLAGS"
+		AC_MSG_RESULT($ifelse([$2],,INTEL_COMPILER,[$2]))
+		;;
+	esac
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_LARGEFILE version: 12 updated: 2020/03/19 20:23:48
+dnl ------------
+dnl Add checks for large file support.
+AC_DEFUN([CF_LARGEFILE],[
+ifdef([AC_FUNC_FSEEKO],[
+	AC_SYS_LARGEFILE
+	if test "$enable_largefile" != no ; then
+	AC_FUNC_FSEEKO
+
+	# Normally we would collect these definitions in the config.h,
+	# but (like _XOPEN_SOURCE), some environments rely on having these
+	# defined before any of the system headers are included.  Another
+	# case comes up with C++, e.g., on AIX the compiler compiles the
+	# header files by themselves before looking at the body files it is
+	# told to compile.  For ncurses, those header files do not include
+	# the config.h
+	if test "$ac_cv_sys_large_files" != no
+	then
+		CF_APPEND_TEXT(CPPFLAGS,-D_LARGE_FILES)
+	fi
+	if test "$ac_cv_sys_largefile_source" != no
+	then
+		CF_APPEND_TEXT(CPPFLAGS,-D_LARGEFILE_SOURCE)
+	fi
+	if test "$ac_cv_sys_file_offset_bits" != no
+	then
+		CF_APPEND_TEXT(CPPFLAGS,-D_FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits)
+	fi
+
+	AC_CACHE_CHECK(whether to use struct dirent64, cf_cv_struct_dirent64,[
+		AC_TRY_COMPILE([
+#pragma GCC diagnostic error "-Wincompatible-pointer-types"
+#include <sys/types.h>
+#include <dirent.h>
+		],[
+		/* if transitional largefile support is setup, this is true */
+		extern struct dirent64 * readdir(DIR *);
+		struct dirent64 *x = readdir((DIR *)0);
+		struct dirent *y = readdir((DIR *)0);
+		int z = x - y;
+		(void)z;
+		],
+		[cf_cv_struct_dirent64=yes],
+		[cf_cv_struct_dirent64=no])
+	])
+	test "$cf_cv_struct_dirent64" = yes && AC_DEFINE(HAVE_STRUCT_DIRENT64,1,[Define to 1 if we have struct dirent64])
+	fi
+])
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_LD_RPATH_OPT version: 9 updated: 2021/01/01 13:31:04
+dnl ---------------
+dnl For the given system and compiler, find the compiler flags to pass to the
+dnl loader to use the "rpath" feature.
+AC_DEFUN([CF_LD_RPATH_OPT],
+[
+AC_REQUIRE([CF_CHECK_CACHE])
+
+LD_RPATH_OPT=
+if test "x$cf_cv_enable_rpath" != xno
+then
+	AC_MSG_CHECKING(for an rpath option)
+	case "$cf_cv_system_name" in
+	(irix*)
+		if test "$GCC" = yes; then
+			LD_RPATH_OPT="-Wl,-rpath,"
+		else
+			LD_RPATH_OPT="-rpath "
+		fi
+		;;
+	(linux*|gnu*|k*bsd*-gnu|freebsd*)
+		LD_RPATH_OPT="-Wl,-rpath,"
+		;;
+	(openbsd[[2-9]].*|mirbsd*)
+		LD_RPATH_OPT="-Wl,-rpath,"
+		;;
+	(dragonfly*)
+		LD_RPATH_OPT="-rpath "
+		;;
+	(netbsd*)
+		LD_RPATH_OPT="-Wl,-rpath,"
+		;;
+	(osf*|mls+*)
+		LD_RPATH_OPT="-rpath "
+		;;
+	(solaris2*)
+		LD_RPATH_OPT="-R"
+		;;
+	(*)
+		;;
+	esac
+	AC_MSG_RESULT($LD_RPATH_OPT)
+
+	case "x$LD_RPATH_OPT" in
+	(x-R*)
+		AC_MSG_CHECKING(if we need a space after rpath option)
+		cf_save_LIBS="$LIBS"
+		CF_ADD_LIBS(${LD_RPATH_OPT}$libdir)
+		AC_TRY_LINK(, , cf_rpath_space=no, cf_rpath_space=yes)
+		LIBS="$cf_save_LIBS"
+		AC_MSG_RESULT($cf_rpath_space)
+		test "$cf_rpath_space" = yes && LD_RPATH_OPT="$LD_RPATH_OPT "
+		;;
+	esac
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_LIBRARY_PATH version: 11 updated: 2021/01/01 13:31:04
+dnl ---------------
+dnl Construct a search-list of directories for a nonstandard library-file
+dnl
+dnl Parameters
+dnl	$1 = the variable to return as result
+dnl	$2 = the package name
+AC_DEFUN([CF_LIBRARY_PATH],
+[
+$1=
+cf_library_path_list=""
+if test -n "${LDFLAGS}${LIBS}" ; then
+	for cf_library_path in $LDFLAGS $LIBS
+	do
+		case "$cf_library_path" in
+		(-L*)
+			cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'`
+			CF_ADD_SUBDIR_PATH($1,$2,lib,$cf_library_path,NONE)
+			cf_library_path_list="$cf_library_path_list [$]$1"
+			;;
+		esac
+	done
+fi
+
+CF_SUBDIR_PATH($1,$2,lib)
+
+$1="$cf_library_path_list [$]$1"
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_LIB_PREFIX version: 14 updated: 2021/01/01 13:31:04
+dnl -------------
+dnl Compute the library-prefix for the given host system
+dnl $1 = variable to set
+define([CF_LIB_PREFIX],
+[
+	case "$cf_cv_system_name" in
+	(OS/2*|os2*)
+		if test "$DFT_LWR_MODEL" = libtool; then
+			LIB_PREFIX='lib'
+		else
+			LIB_PREFIX=''
+		fi
+		;;
+	(*-msvc*)
+		LIB_PREFIX=''
+		;;
+	(*)	LIB_PREFIX='lib'
+		;;
+	esac
+ifelse($1,,,[$1=$LIB_PREFIX])
+	AC_SUBST(LIB_PREFIX)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_LIB_SUFFIX version: 28 updated: 2021/01/01 16:53:59
+dnl -------------
+dnl Compute the library file-suffix from the given model name
+dnl $1 = model name
+dnl $2 = variable to set (the nominal library suffix)
+dnl $3 = dependency variable to set (actual filename)
+dnl The variable $LIB_SUFFIX, if set, prepends the variable to set.
+AC_DEFUN([CF_LIB_SUFFIX],
+[
+	case X$1 in
+	(Xlibtool)
+		$2='.la'
+		$3=[$]$2
+		;;
+	(Xdebug)
+		case "$cf_cv_system_name" in
+		(*-msvc*)
+			$2='_g.lib'
+			;;
+		(*)
+			$2='_g.a'
+			;;
+		esac
+		$3=[$]$2
+		;;
+	(Xprofile)
+		case "$cf_cv_system_name" in
+		(*-msvc*)
+			$2='_p.lib'
+			;;
+		(*)
+			$2='_p.a'
+			;;
+		esac
+		$3=[$]$2
+		;;
+	(Xshared)
+		case "$cf_cv_system_name" in
+		(aix[[5-7]]*)
+			$2='.so'
+			$3=[$]$2
+			;;
+		(*-msvc*)
+			$2='.dll'
+			$3='.dll.lib'
+			;;
+		(cygwin*|msys*|mingw*)
+			$2='.dll'
+			$3='.dll.a'
+			;;
+		(darwin*)
+			$2='.dylib'
+			$3=[$]$2
+			;;
+		(hpux*)
+			case "$target" in
+			(ia64*)
+				$2='.so'
+				$3=[$]$2
+				;;
+			(*)
+				$2='.sl'
+				$3=[$]$2
+				;;
+			esac
+			;;
+		(*)
+			$2='.so'
+			$3=[$]$2
+			;;
+		esac
+		;;
+	(*)
+		case "$target" in
+		(*-msvc*)
+			$2='.lib'
+			;;
+		(*)
+			$2='.a'
+			;;
+		esac
+		$3=[$]$2
+		;;
+	esac
+	if test -n "${LIB_SUFFIX}${EXTRA_SUFFIX}"
+	then
+		$2="${LIB_SUFFIX}${EXTRA_SUFFIX}[$]{$2}"
+		$3="${LIB_SUFFIX}${EXTRA_SUFFIX}[$]{$3}"
+	fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_LIB_TYPE version: 5 updated: 2015/04/17 21:13:04
+dnl -----------
+dnl Compute the string to append to -library from the given model name
+dnl $1 = model name
+dnl $2 = variable to set
+dnl The variable $LIB_SUFFIX, if set, prepends the variable to set.
+AC_DEFUN([CF_LIB_TYPE],
+[
+	case $1 in
+	(libtool) $2=''   ;;
+	(normal)  $2=''   ;;
+	(debug)   $2='_g' ;;
+	(profile) $2='_p' ;;
+	(shared)  $2=''   ;;
+	esac
+	test -n "$LIB_SUFFIX" && $2="${LIB_SUFFIX}[$]{$2}"
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_LINK_DATAONLY version: 13 updated: 2020/02/08 15:59:30
+dnl ----------------
+dnl Some systems have a non-ANSI linker that doesn't pull in modules that have
+dnl only data (i.e., no functions), for example NeXT.  On those systems we'll
+dnl have to provide wrappers for global tables to ensure they're linked
+dnl properly.
+AC_DEFUN([CF_LINK_DATAONLY],
+[
+AC_MSG_CHECKING([if data-only library module links])
+AC_CACHE_VAL(cf_cv_link_dataonly,[
+	rm -f conftest.a
+	cat >conftest.$ac_ext <<EOF
+#line __oline__ "configure"
+int	testdata[[3]] = { 123, 456, 789 };
+EOF
+	if AC_TRY_EVAL(ac_compile) ; then
+		mv conftest.o data.o && \
+		( $AR $ARFLAGS conftest.a data.o ) 2>&AC_FD_CC 1>/dev/null
+	fi
+	rm -f conftest.$ac_ext data.o
+	cat >conftest.$ac_ext <<EOF
+#line __oline__ "configure"
+int	testfunc(void)
+{
+#if defined(NeXT)
+	${cf_cv_main_return:-return}(1);	/* I'm told this linker is broken */
+#else
+	extern int testdata[[3]];
+	return testdata[[0]] == 123
+	   &&  testdata[[1]] == 456
+	   &&  testdata[[2]] == 789;
+#endif
+}
+EOF
+	if AC_TRY_EVAL(ac_compile); then
+		mv conftest.o func.o && \
+		( $AR $ARFLAGS conftest.a func.o ) 2>&AC_FD_CC 1>/dev/null
+	fi
+	rm -f conftest.$ac_ext func.o
+	( eval $RANLIB conftest.a ) 2>&AC_FD_CC >/dev/null
+	cf_saveLIBS="$LIBS"
+	LIBS="conftest.a $LIBS"
+	AC_TRY_RUN([
+	int main(void)
+	{
+		extern int testfunc();
+		${cf_cv_main_return:-return} (!testfunc());
+	}
+	],
+	[cf_cv_link_dataonly=yes],
+	[cf_cv_link_dataonly=no],
+	[cf_cv_link_dataonly=unknown])
+	LIBS="$cf_saveLIBS"
+	])
+AC_MSG_RESULT($cf_cv_link_dataonly)
+
+if test "$cf_cv_link_dataonly" = no ; then
+	AC_DEFINE(BROKEN_LINKER,1,[if data-only library module does not link])
+	BROKEN_LINKER=1
+fi
+AC_SUBST(BROKEN_LINKER)
+
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_MAKEFLAGS version: 21 updated: 2021/09/04 06:47:34
+dnl ------------
+dnl Some 'make' programs support ${MAKEFLAGS}, some ${MFLAGS}, to pass 'make'
+dnl options to lower-levels.  It is very useful for "make -n" -- if we have it.
+dnl (GNU 'make' does both, something POSIX 'make', which happens to make the
+dnl ${MAKEFLAGS} variable incompatible because it adds the assignments :-)
+AC_DEFUN([CF_MAKEFLAGS],
+[AC_REQUIRE([AC_PROG_FGREP])dnl
+
+AC_CACHE_CHECK(for makeflags variable, cf_cv_makeflags,[
+	cf_cv_makeflags=''
+	for cf_option in '-${MAKEFLAGS}' '${MFLAGS}'
+	do
+		cat >cf_makeflags.tmp <<CF_EOF
+SHELL = $SHELL
+all :
+	@ echo '.$cf_option'
+CF_EOF
+		cf_result=`${MAKE:-make} -k -f cf_makeflags.tmp 2>/dev/null | ${FGREP-fgrep} -v "ing directory" | sed -e 's,[[ 	]]*$,,'`
+		case "$cf_result" in
+		(.*k|.*kw)
+			cf_result="`${MAKE:-make} -k -f cf_makeflags.tmp CC=cc 2>/dev/null`"
+			case "$cf_result" in
+			(.*CC=*)	cf_cv_makeflags=
+				;;
+			(*)	cf_cv_makeflags=$cf_option
+				;;
+			esac
+			break
+			;;
+		(.-)
+			;;
+		(*)
+			CF_MSG_LOG(given option \"$cf_option\", no match \"$cf_result\")
+			;;
+		esac
+	done
+	rm -f cf_makeflags.tmp
+])
+
+AC_SUBST(cf_cv_makeflags)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_MAKE_PHONY version: 3 updated: 2021/01/08 16:08:21
+dnl -------------
+dnl Check if the make-program handles a ".PHONY" target, e.g,. a target which
+dnl acts as a placeholder.
+dnl
+dnl The ".PHONY" feature was proposed in 2011 here
+dnl     https://www.austingroupbugs.net/view.php?id=523
+dnl and is scheduled for release in P1003.1 Issue 8 (late 2022).
+dnl
+dnl This is not supported by SVr4 make (or SunOS 4, 4.3SD, etc), but works with
+dnl a few others (i.e., GNU make and the non-POSIX "BSD" make):
+dnl
+dnl + This is a GNU make feature (since April 1988, but in turn from binutils,
+dnl   date unspecified).
+dnl
+dnl + It was adopted in NetBSD make in June 1995.
+dnl
+dnl + The other BSD make programs are derived from the NetBSD make (and for
+dnl   that reason are not actually different "implementations").
+dnl
+dnl + Some features of NetBSD make were actually adapted from pmake, which
+dnl   began as a modified GNU make starting in 1993.
+dnl
+dnl + Version 3.8 of the dmake program in January 1992 also implemented this
+dnl   GNU make extension, but is less well known than the BSD make.
+AC_DEFUN([CF_MAKE_PHONY],[
+AC_CACHE_CHECK(for \".PHONY\" make-support, cf_cv_make_PHONY,[
+	rm -rf conftest*
+	(
+		mkdir conftest || exit 1
+		cd conftest
+		cat >makefile <<'CF_EOF'
+.PHONY: always
+DATA=0
+always:	always.out
+	@echo "** making [$]@ [$](DATA)"
+once: once.out
+	@echo "** making [$]@ [$](DATA)"
+always.out:
+	@echo "** making [$]@ [$](DATA)"
+	echo [$](DATA) > [$]@
+once.out:
+	@echo "** making [$]@ [$](DATA)"
+	echo [$](DATA) > [$]@
+CF_EOF
+		for cf_data in 1 2 3
+		do
+			${MAKE:-make} always DATA=$cf_data
+			${MAKE:-make} once   DATA=$cf_data
+			${MAKE:-make} -t always once
+			if test -f always ; then
+				echo "no (case 1)" > ../conftest.tmp
+			elif test ! -f always.out ; then
+				echo "no (case 2)" > ../conftest.tmp
+			elif test ! -f once.out ; then
+				echo "no (case 3)" > ../conftest.tmp
+			elif ! cmp -s always.out once.out ; then
+				echo "no (case 4)" > ../conftest.tmp
+				diff always.out once.out
+			else
+				cf_check="`cat always.out`"
+				if test "x$cf_check" != "x$cf_data" ; then
+					echo "no (case 5)" > ../conftest.tmp
+				else
+					echo yes > ../conftest.tmp
+					rm -f ./*.out
+					continue
+				fi
+			fi
+			break
+		done
+	) >&AC_FD_CC 2>&1
+	cf_cv_make_PHONY="`cat conftest.tmp`"
+	rm -rf conftest*
+])
+MAKE_NO_PHONY="#"
+MAKE_PHONY="#"
+test "x$cf_cv_make_PHONY" = xyes && MAKE_PHONY=
+test "x$cf_cv_make_PHONY" != xyes && MAKE_NO_PHONY=
+AC_SUBST(MAKE_NO_PHONY)
+AC_SUBST(MAKE_PHONY)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_MAKE_TAGS version: 6 updated: 2010/10/23 15:52:32
+dnl ------------
+dnl Generate tags/TAGS targets for makefiles.  Do not generate TAGS if we have
+dnl a monocase filesystem.
+AC_DEFUN([CF_MAKE_TAGS],[
+AC_REQUIRE([CF_MIXEDCASE_FILENAMES])
+
+AC_CHECK_PROGS(CTAGS, exctags ctags)
+AC_CHECK_PROGS(ETAGS, exetags etags)
+
+AC_CHECK_PROG(MAKE_LOWER_TAGS, ${CTAGS:-ctags}, yes, no)
+
+if test "$cf_cv_mixedcase" = yes ; then
+	AC_CHECK_PROG(MAKE_UPPER_TAGS, ${ETAGS:-etags}, yes, no)
+else
+	MAKE_UPPER_TAGS=no
+fi
+
+if test "$MAKE_UPPER_TAGS" = yes ; then
+	MAKE_UPPER_TAGS=
+else
+	MAKE_UPPER_TAGS="#"
+fi
+
+if test "$MAKE_LOWER_TAGS" = yes ; then
+	MAKE_LOWER_TAGS=
+else
+	MAKE_LOWER_TAGS="#"
+fi
+
+AC_SUBST(CTAGS)
+AC_SUBST(ETAGS)
+
+AC_SUBST(MAKE_UPPER_TAGS)
+AC_SUBST(MAKE_LOWER_TAGS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_MIXEDCASE_FILENAMES version: 9 updated: 2021/01/01 16:53:59
+dnl ----------------------
+dnl Check if the file-system supports mixed-case filenames.  If we're able to
+dnl create a lowercase name and see it as uppercase, it doesn't support that.
+AC_DEFUN([CF_MIXEDCASE_FILENAMES],
+[
+AC_CACHE_CHECK(if filesystem supports mixed-case filenames,cf_cv_mixedcase,[
+if test "$cross_compiling" = yes ; then
+	case "$target_alias" in
+	(*-os2-emx*|*-msdosdjgpp*|*-cygwin*|*-msys*|*-mingw*|*-uwin*|darwin*)
+		cf_cv_mixedcase=no
+		;;
+	(*)
+		cf_cv_mixedcase=yes
+		;;
+	esac
+else
+	rm -f conftest CONFTEST
+	echo test >conftest
+	if test -f CONFTEST ; then
+		cf_cv_mixedcase=no
+	else
+		cf_cv_mixedcase=yes
+	fi
+	rm -f conftest CONFTEST
+fi
+])
+test "$cf_cv_mixedcase" = yes && AC_DEFINE(MIXEDCASE_FILENAMES,1,[Define to 1 if filesystem supports mixed-case filenames.])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_MKSTEMP version: 11 updated: 2021/01/01 13:31:04
+dnl ----------
+dnl Check for a working mkstemp.  This creates two files, checks that they are
+dnl successfully created and distinct (AmigaOS apparently fails on the last).
+AC_DEFUN([CF_MKSTEMP],[
+AC_CHECK_HEADERS( \
+unistd.h \
+)
+AC_CACHE_CHECK(for working mkstemp, cf_cv_func_mkstemp,[
+rm -rf ./conftest*
+AC_TRY_RUN([
+#include <sys/types.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/stat.h>
+int main(void)
+{
+	char *tmpl = "conftestXXXXXX";
+	char name[2][80];
+	int n;
+	int result = 0;
+	int fd;
+	struct stat sb;
+
+	umask(077);
+	for (n = 0; n < 2; ++n) {
+		strcpy(name[n], tmpl);
+		if ((fd = mkstemp(name[n])) >= 0) {
+			if (!strcmp(name[n], tmpl)
+			 || stat(name[n], &sb) != 0
+			 || (sb.st_mode & S_IFMT) != S_IFREG
+			 || (sb.st_mode & 077) != 0) {
+				result = 1;
+			}
+			close(fd);
+		}
+	}
+	if (result == 0
+	 && !strcmp(name[0], name[1]))
+		result = 1;
+	${cf_cv_main_return:-return}(result);
+}
+],[cf_cv_func_mkstemp=yes
+],[cf_cv_func_mkstemp=no
+],[cf_cv_func_mkstemp=maybe])
+])
+if test "x$cf_cv_func_mkstemp" = xmaybe ; then
+	AC_CHECK_FUNC(mkstemp)
+fi
+if test "x$cf_cv_func_mkstemp" = xyes || test "x$ac_cv_func_mkstemp" = xyes ; then
+	AC_DEFINE(HAVE_MKSTEMP,1,[Define to 1 if mkstemp() is available and working.])
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_MSG_LOG version: 5 updated: 2010/10/23 15:52:32
+dnl ----------
+dnl Write a debug message to config.log, along with the line number in the
+dnl configure script.
+AC_DEFUN([CF_MSG_LOG],[
+echo "${as_me:-configure}:__oline__: testing $* ..." 1>&AC_FD_CC
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_NCURSES_ADDON version: 6 updated: 2021/01/04 19:33:05
+dnl ----------------
+dnl Configure an ncurses add-on, built outside the ncurses tree.
+AC_DEFUN([CF_NCURSES_ADDON],[
+AC_REQUIRE([CF_NCURSES_CONFIG])
+
+AC_PROVIDE([CF_SUBST_NCURSES_VERSION])
+
+AC_MSG_CHECKING(if you want wide-character code)
+AC_ARG_ENABLE(widec,
+	[  --enable-widec          compile with wide-char/UTF-8 code],
+	[with_widec=$enableval],
+	[with_widec=no])
+AC_MSG_RESULT($with_widec)
+if test "$with_widec" = yes ; then
+	CF_UTF8_LIB
+	CF_NCURSES_CONFIG(ncursesw)
+else
+	CF_NCURSES_CONFIG(ncurses)
+fi
+
+if test "$NCURSES_CONFIG_PKG" != none ; then
+	cf_version=`$PKG_CONFIG --modversion $NCURSES_CONFIG_PKG 2>/dev/null`
+
+	NCURSES_MAJOR=`echo "$cf_version" | sed -e 's/\..*//'`
+	NCURSES_MINOR=`echo "$cf_version" | sed -e 's/^[[0-9]][[0-9]]*\.//' -e 's/\..*//'`
+	NCURSES_PATCH=`echo "$cf_version" | sed -e 's/^[[0-9]][[0-9]]*\.[[0-9]][[0-9]]*\.//'`
+
+	cf_cv_abi_version=`$PKG_CONFIG --variable=abi_version $NCURSES_CONFIG_PKG 2>/dev/null`
+	if test -z "$cf_cv_abi_version"
+	then
+		cf_cv_abi_version=`$PKG_CONFIG --variable=major_version $NCURSES_CONFIG_PKG 2>/dev/null`
+	fi
+
+elif test "$NCURSES_CONFIG" != none ; then
+
+	cf_version=`$NCURSES_CONFIG --version 2>/dev/null`
+
+	NCURSES_MAJOR=`echo "$cf_version" | sed -e 's/\..*//'`
+	NCURSES_MINOR=`echo "$cf_version" | sed -e 's/^[[0-9]][[0-9]]*\.//' -e 's/\..*//'`
+	NCURSES_PATCH=`echo "$cf_version" | sed -e 's/^[[0-9]][[0-9]]*\.[[0-9]][[0-9]]*\.//'`
+
+	# ABI version is not available from headers
+	cf_cv_abi_version=`$NCURSES_CONFIG --abi-version 2>/dev/null`
+
+else
+
+	for cf_name in MAJOR MINOR PATCH
+	do
+	cat >conftest.$ac_ext <<CF_EOF
+	#include <${cf_cv_ncurses_header:-curses.h}>
+	AUTOCONF_$cf_name NCURSES_VERSION_$cf_name
+CF_EOF
+		cf_try="$ac_cpp conftest.$ac_ext 2>&5 | fgrep AUTOCONF_$cf_name >conftest.out"
+		AC_TRY_EVAL(cf_try)
+		if test -f conftest.out ; then
+			cf_result=`sed -e "s/^.*AUTOCONF_${cf_name}[[ 	]][[ 	]]*//" conftest.out`
+			eval NCURSES_$cf_name=\"$cf_result\"
+			# cat conftest.$ac_ext
+			# cat conftest.out
+		fi
+	done
+
+	cf_cv_abi_version=${NCURSES_MAJOR}
+
+fi
+
+cf_cv_rel_version=${NCURSES_MAJOR}.${NCURSES_MINOR}
+
+dnl Show the computed version, for logging
+cf_cv_timestamp=`date`
+
+AC_MSG_RESULT(Configuring NCURSES $cf_cv_rel_version ABI $cf_cv_abi_version ($cf_cv_timestamp))
+
+dnl We need these values in the generated headers
+AC_SUBST(NCURSES_MAJOR)
+AC_SUBST(NCURSES_MINOR)
+AC_SUBST(NCURSES_PATCH)
+
+dnl We need these values in the generated makefiles
+AC_SUBST(cf_cv_rel_version)
+AC_SUBST(cf_cv_abi_version)
+
+dnl FIXME - not needed for Ada95
+AC_SUBST(cf_cv_builtin_bool)
+AC_SUBST(cf_cv_header_stdbool_h)
+AC_SUBST(cf_cv_type_of_bool)dnl
+
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_NCURSES_CC_CHECK version: 5 updated: 2020/12/31 20:19:42
+dnl -------------------
+dnl Check if we can compile with ncurses' header file
+dnl $1 is the cache variable to set
+dnl $2 is the header-file to include
+dnl $3 is the root name (ncurses or ncursesw)
+AC_DEFUN([CF_NCURSES_CC_CHECK],[
+	AC_TRY_COMPILE([
+]ifelse($3,ncursesw,[
+#define _XOPEN_SOURCE_EXTENDED
+#undef  HAVE_LIBUTF8_H	/* in case we used CF_UTF8_LIB */
+#define HAVE_LIBUTF8_H	/* to force ncurses' header file to use cchar_t */
+])[
+#include <$2>],[
+#ifdef NCURSES_VERSION
+]ifelse($3,ncursesw,[
+#ifndef WACS_BSSB
+	make an error
+#endif
+])[
+printf("%s\\n", NCURSES_VERSION);
+#else
+#ifdef __NCURSES_H
+printf("old\\n");
+#else
+	make an error
+#endif
+#endif
+	]
+	,[$1=$2]
+	,[$1=no])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_NCURSES_CONFIG version: 28 updated: 2021/08/28 15:20:37
+dnl -----------------
+dnl Tie together the configure-script macros for ncurses, preferring these in
+dnl order:
+dnl a) ".pc" files for pkg-config, using $NCURSES_CONFIG_PKG
+dnl b) the "-config" script from ncurses, using $NCURSES_CONFIG
+dnl c) just plain libraries
+dnl
+dnl $1 is the root library name (default: "ncurses")
+AC_DEFUN([CF_NCURSES_CONFIG],[
+AC_REQUIRE([CF_PKG_CONFIG])
+cf_ncuconfig_root=ifelse($1,,ncurses,$1)
+cf_have_ncuconfig=no
+
+if test "x${PKG_CONFIG:=none}" != xnone; then
+	AC_MSG_CHECKING(pkg-config for $cf_ncuconfig_root)
+	if "$PKG_CONFIG" --exists $cf_ncuconfig_root ; then
+		AC_MSG_RESULT(yes)
+
+		AC_MSG_CHECKING(if the $cf_ncuconfig_root package files work)
+		cf_have_ncuconfig=unknown
+
+		cf_save_CFLAGS="$CFLAGS"
+		cf_save_CPPFLAGS="$CPPFLAGS"
+		cf_save_LIBS="$LIBS"
+
+		cf_pkg_cflags="`$PKG_CONFIG --cflags $cf_ncuconfig_root`"
+		cf_pkg_libs="`$PKG_CONFIG --libs $cf_ncuconfig_root`"
+
+		# while -W for passing linker flags is prevalent, it is not "standard".
+		# At least one wrapper for c89/c99 (in Apple's xcode) has its own
+		# incompatible _and_ non-standard -W option which gives an error.  Work
+		# around that pitfall.
+		case "x${CC}@@${cf_pkg_libs}@${cf_pkg_cflags}" in
+		(x*c[[89]]9@@*-W*)
+			CF_ADD_CFLAGS($cf_pkg_cflags)
+			CF_ADD_LIBS($cf_pkg_libs)
+
+			AC_TRY_LINK([#include <${cf_cv_ncurses_header:-curses.h}>],
+				[initscr(); mousemask(0,0); tigetstr((char *)0);],
+				[AC_TRY_RUN([#include <${cf_cv_ncurses_header:-curses.h}>
+					int main(void)
+					{ const char *xx = curses_version(); return (xx == 0); }],
+					[cf_test_ncuconfig=yes],
+					[cf_test_ncuconfig=no],
+					[cf_test_ncuconfig=maybe])],
+				[cf_test_ncuconfig=no])
+
+			CFLAGS="$cf_save_CFLAGS"
+			CPPFLAGS="$cf_save_CPPFLAGS"
+			LIBS="$cf_save_LIBS"
+
+			if test "x$cf_test_ncuconfig" != xyes; then
+				cf_temp=`echo "x$cf_pkg_cflags" | sed -e s/^x// -e 's/-W[[^ 	]]*//g'`
+				cf_pkg_cflags="$cf_temp"
+				cf_temp=`echo "x$cf_pkg_libs" | sed -e s/^x// -e 's/-W[[^ 	]]*//g'`
+				cf_pkg_libs="$cf_temp"
+			fi
+			;;
+		esac
+
+		CF_APPEND_CFLAGS($cf_pkg_cflags)
+		CF_ADD_LIBS($cf_pkg_libs)
+
+		AC_TRY_LINK([#include <${cf_cv_ncurses_header:-curses.h}>],
+			[initscr(); mousemask(0,0); tigetstr((char *)0);],
+			[AC_TRY_RUN([#include <${cf_cv_ncurses_header:-curses.h}>
+				int main(void)
+				{ const char *xx = curses_version(); return (xx == 0); }],
+				[cf_have_ncuconfig=yes],
+				[cf_have_ncuconfig=no],
+				[cf_have_ncuconfig=maybe])],
+			[cf_have_ncuconfig=no])
+		AC_MSG_RESULT($cf_have_ncuconfig)
+		test "$cf_have_ncuconfig" = maybe && cf_have_ncuconfig=yes
+		if test "$cf_have_ncuconfig" != "yes"
+		then
+			CPPFLAGS="$cf_save_CPPFLAGS"
+			LIBS="$cf_save_LIBS"
+			NCURSES_CONFIG_PKG=none
+		else
+			AC_DEFINE(NCURSES,1,[Define to 1 if we are using ncurses headers/libraries])
+			NCURSES_CONFIG_PKG=$cf_ncuconfig_root
+			CF_TERM_HEADER
+		fi
+
+	else
+		AC_MSG_RESULT(no)
+		NCURSES_CONFIG_PKG=none
+	fi
+else
+	NCURSES_CONFIG_PKG=none
+fi
+
+if test "x$cf_have_ncuconfig" = "xno"; then
+	cf_ncurses_config="${cf_ncuconfig_root}${NCURSES_CONFIG_SUFFIX}-config"; echo "Looking for ${cf_ncurses_config}"
+
+	CF_ACVERSION_CHECK(2.52,
+		[AC_CHECK_TOOLS(NCURSES_CONFIG, ${cf_ncurses_config} ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}5-config, none)],
+		[AC_PATH_PROGS(NCURSES_CONFIG,  ${cf_ncurses_config} ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}5-config, none)])
+
+	if test "$NCURSES_CONFIG" != none ; then
+
+		CF_APPEND_CFLAGS(`$NCURSES_CONFIG --cflags`)
+		CF_ADD_LIBS(`$NCURSES_CONFIG --libs`)
+
+		# even with config script, some packages use no-override for curses.h
+		CF_CURSES_HEADER(ifelse($1,,ncurses,$1))
+
+		dnl like CF_NCURSES_CPPFLAGS
+		AC_DEFINE(NCURSES,1,[Define to 1 if we are using ncurses headers/libraries])
+
+		dnl like CF_NCURSES_LIBS
+		CF_UPPER(cf_nculib_ROOT,HAVE_LIB$cf_ncuconfig_root)
+		AC_DEFINE_UNQUOTED($cf_nculib_ROOT)
+
+		dnl like CF_NCURSES_VERSION
+		cf_cv_ncurses_version="`$NCURSES_CONFIG --version`"
+
+	else
+
+		CF_NCURSES_CPPFLAGS(ifelse($1,,ncurses,$1))
+		CF_NCURSES_LIBS(ifelse($1,,ncurses,$1))
+
+	fi
+else
+	NCURSES_CONFIG=none
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_NCURSES_CPPFLAGS version: 22 updated: 2021/01/02 09:31:20
+dnl -------------------
+dnl Look for the SVr4 curses clone 'ncurses' in the standard places, adjusting
+dnl the CPPFLAGS variable so we can include its header.
+dnl
+dnl The header files may be installed as either curses.h, or ncurses.h (would
+dnl be obsolete, except that some packagers prefer this name to distinguish it
+dnl from a "native" curses implementation).  If not installed for overwrite,
+dnl the curses.h file would be in an ncurses subdirectory (e.g.,
+dnl /usr/include/ncurses), but someone may have installed overwriting the
+dnl vendor's curses.  Only very old versions (pre-1.9.2d, the first autoconf'd
+dnl version) of ncurses don't define either __NCURSES_H or NCURSES_VERSION in
+dnl the header.
+dnl
+dnl If the installer has set $CFLAGS or $CPPFLAGS so that the ncurses header
+dnl is already in the include-path, don't even bother with this, since we cannot
+dnl easily determine which file it is.  In this case, it has to be <curses.h>.
+dnl
+dnl The optional parameter gives the root name of the library, in case it is
+dnl not installed as the default curses library.  That is how the
+dnl wide-character version of ncurses is installed.
+AC_DEFUN([CF_NCURSES_CPPFLAGS],
+[AC_REQUIRE([CF_WITH_CURSES_DIR])
+
+AC_PROVIDE([CF_CURSES_CPPFLAGS])dnl
+cf_ncuhdr_root=ifelse($1,,ncurses,$1)
+
+test -n "$cf_cv_curses_dir" && \
+test "$cf_cv_curses_dir" != "no" && { \
+  CF_ADD_INCDIR($cf_cv_curses_dir/include/$cf_ncuhdr_root)
+}
+
+AC_CACHE_CHECK(for $cf_ncuhdr_root header in include-path, cf_cv_ncurses_h,[
+	cf_header_list="$cf_ncuhdr_root/curses.h $cf_ncuhdr_root/ncurses.h"
+	{ test "$cf_ncuhdr_root" = ncurses || test "$cf_ncuhdr_root" = ncursesw; } && cf_header_list="$cf_header_list curses.h ncurses.h"
+	for cf_header in $cf_header_list
+	do
+		CF_NCURSES_CC_CHECK(cf_cv_ncurses_h,$cf_header,$1)
+		test "$cf_cv_ncurses_h" != no && break
+	done
+])
+
+CF_NCURSES_HEADER
+CF_TERM_HEADER
+
+# some applications need this, but should check for NCURSES_VERSION
+AC_DEFINE(NCURSES,1,[Define to 1 if we are using ncurses headers/libraries])
+
+CF_NCURSES_VERSION
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_NCURSES_HEADER version: 7 updated: 2021/01/04 19:33:05
+dnl -----------------
+dnl Find a "curses" header file, e.g,. "curses.h", or one of the more common
+dnl variations of ncurses' installs.
+dnl
+dnl See also CF_CURSES_HEADER, which sets the same cache variable.
+AC_DEFUN([CF_NCURSES_HEADER],[
+
+if test "$cf_cv_ncurses_h" != no ; then
+	cf_cv_ncurses_header=$cf_cv_ncurses_h
+else
+
+AC_CACHE_CHECK(for $cf_ncuhdr_root include-path, cf_cv_ncurses_h2,[
+	test -n "$verbose" && echo
+	CF_HEADER_PATH(cf_search,$cf_ncuhdr_root)
+	test -n "$verbose" && echo "search path $cf_search"
+	cf_save2_CPPFLAGS="$CPPFLAGS"
+	for cf_incdir in $cf_search
+	do
+		CF_ADD_INCDIR($cf_incdir)
+		for cf_header in \
+			ncurses.h \
+			curses.h
+		do
+			CF_NCURSES_CC_CHECK(cf_cv_ncurses_h2,$cf_header,$1)
+			if test "$cf_cv_ncurses_h2" != no ; then
+				cf_cv_ncurses_h2=$cf_incdir/$cf_header
+				test -n "$verbose" && echo $ECHO_N "	... found $ECHO_C" 1>&AC_FD_MSG
+				break
+			fi
+			test -n "$verbose" && echo "	... tested $cf_incdir/$cf_header" 1>&AC_FD_MSG
+		done
+		CPPFLAGS="$cf_save2_CPPFLAGS"
+		test "$cf_cv_ncurses_h2" != no && break
+	done
+	test "$cf_cv_ncurses_h2" = no && AC_MSG_ERROR(not found)
+	])
+
+	CF_DIRNAME(cf_1st_incdir,$cf_cv_ncurses_h2)
+	cf_cv_ncurses_header="`basename "$cf_cv_ncurses_h2"`"
+	if test "`basename "$cf_1st_incdir"`" = "$cf_ncuhdr_root" ; then
+		cf_cv_ncurses_header="$cf_ncuhdr_root/$cf_cv_ncurses_header"
+	fi
+	CF_ADD_INCDIR($cf_1st_incdir)
+
+fi
+
+# Set definitions to allow ifdef'ing for ncurses.h
+
+case "$cf_cv_ncurses_header" in
+(*ncurses.h)
+	AC_DEFINE(HAVE_NCURSES_H,1,[Define to 1 if we have ncurses.h])
+	;;
+esac
+
+case "$cf_cv_ncurses_header" in
+(ncurses/curses.h|ncurses/ncurses.h)
+	AC_DEFINE(HAVE_NCURSES_NCURSES_H,1,[Define to 1 if we have ncurses/ncurses.h])
+	;;
+(ncursesw/curses.h|ncursesw/ncurses.h)
+	AC_DEFINE(HAVE_NCURSESW_NCURSES_H,1,[Define to 1 if we have ncursesw/ncurses.h])
+	;;
+esac
+
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_NCURSES_LIBS version: 21 updated: 2021/09/04 06:37:12
+dnl ---------------
+dnl Look for the ncurses library.  This is a little complicated on Linux,
+dnl because it may be linked with the gpm (general purpose mouse) library.
+dnl Some distributions have gpm linked with (bsd) curses, which makes it
+dnl unusable with ncurses.  However, we don't want to link with gpm unless
+dnl ncurses has a dependency, since gpm is normally set up as a shared library,
+dnl and the linker will record a dependency.
+dnl
+dnl The optional parameter gives the root name of the library, in case it is
+dnl not installed as the default curses library.  That is how the
+dnl wide-character version of ncurses is installed.
+AC_DEFUN([CF_NCURSES_LIBS],
+[AC_REQUIRE([CF_NCURSES_CPPFLAGS])
+
+cf_nculib_root=ifelse($1,,ncurses,$1)
+	# This works, except for the special case where we find gpm, but
+	# ncurses is in a nonstandard location via $LIBS, and we really want
+	# to link gpm.
+cf_ncurses_LIBS=""
+cf_ncurses_SAVE="$LIBS"
+AC_CHECK_LIB(gpm,Gpm_Open,
+	[AC_CHECK_LIB(gpm,initscr,
+		[LIBS="$cf_ncurses_SAVE"],
+		[cf_ncurses_LIBS="-lgpm"])])
+
+case "$host_os" in
+(freebsd*)
+	# This is only necessary if you are linking against an obsolete
+	# version of ncurses (but it should do no harm, since it is static).
+	if test "$cf_nculib_root" = ncurses ; then
+		AC_CHECK_LIB(mytinfo,tgoto,[cf_ncurses_LIBS="-lmytinfo $cf_ncurses_LIBS"])
+	fi
+	;;
+esac
+
+CF_ADD_LIBS($cf_ncurses_LIBS)
+
+if test -n "$cf_cv_curses_dir" && test "$cf_cv_curses_dir" != "no"
+then
+	CF_ADD_LIBS(-l$cf_nculib_root)
+else
+	CF_FIND_LIBRARY($cf_nculib_root,$cf_nculib_root,
+		[#include <${cf_cv_ncurses_header:-curses.h}>],
+		[initscr()],
+		initscr)
+fi
+
+if test -n "$cf_ncurses_LIBS" ; then
+	AC_MSG_CHECKING(if we can link $cf_nculib_root without $cf_ncurses_LIBS)
+	cf_ncurses_SAVE="$LIBS"
+	for p in $cf_ncurses_LIBS ; do
+		q=`echo "$LIBS" | sed -e "s%$p %%" -e "s%$p$%%"`
+		if test "$q" != "$LIBS" ; then
+			LIBS="$q"
+		fi
+	done
+	AC_TRY_LINK([#include <${cf_cv_ncurses_header:-curses.h}>],
+		[initscr(); mousemask(0,0); tigetstr((char *)0);],
+		[AC_MSG_RESULT(yes)],
+		[AC_MSG_RESULT(no)
+		 LIBS="$cf_ncurses_SAVE"])
+fi
+
+CF_UPPER(cf_nculib_ROOT,HAVE_LIB$cf_nculib_root)
+AC_DEFINE_UNQUOTED($cf_nculib_ROOT)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_NCURSES_VERSION version: 16 updated: 2020/12/31 20:19:42
+dnl ------------------
+dnl Check for the version of ncurses, to aid in reporting bugs, etc.
+dnl Call CF_CURSES_CPPFLAGS first, or CF_NCURSES_CPPFLAGS.  We don't use
+dnl AC_REQUIRE since that does not work with the shell's if/then/else/fi.
+AC_DEFUN([CF_NCURSES_VERSION],
+[
+AC_REQUIRE([CF_CURSES_CPPFLAGS])dnl
+AC_CACHE_CHECK(for ncurses version, cf_cv_ncurses_version,[
+	cf_cv_ncurses_version=no
+	cf_tempfile=out$$
+	rm -f "$cf_tempfile"
+	AC_TRY_RUN([
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <stdio.h>
+int main(void)
+{
+	FILE *fp = fopen("$cf_tempfile", "w");
+#ifdef NCURSES_VERSION
+# ifdef NCURSES_VERSION_PATCH
+	fprintf(fp, "%s.%d\\n", NCURSES_VERSION, NCURSES_VERSION_PATCH);
+# else
+	fprintf(fp, "%s\\n", NCURSES_VERSION);
+# endif
+#else
+# ifdef __NCURSES_H
+	fprintf(fp, "old\\n");
+# else
+	make an error
+# endif
+#endif
+	${cf_cv_main_return:-return}(0);
+}],[
+	cf_cv_ncurses_version=`cat $cf_tempfile`],,[
+
+	# This will not work if the preprocessor splits the line after the
+	# Autoconf token.  The 'unproto' program does that.
+	cat > "conftest.$ac_ext" <<EOF
+#include <${cf_cv_ncurses_header:-curses.h}>
+#undef Autoconf
+#ifdef NCURSES_VERSION
+Autoconf NCURSES_VERSION
+#else
+#ifdef __NCURSES_H
+Autoconf "old"
+#endif
+;
+#endif
+EOF
+	cf_try="$ac_cpp conftest.$ac_ext 2>&AC_FD_CC | grep '^Autoconf ' >conftest.out"
+	AC_TRY_EVAL(cf_try)
+	if test -f conftest.out ; then
+		cf_out=`sed -e 's%^Autoconf %%' -e 's%^[[^"]]*"%%' -e 's%".*%%' conftest.out`
+		test -n "$cf_out" && cf_cv_ncurses_version="$cf_out"
+		rm -f conftest.out
+	fi
+])
+	rm -f "$cf_tempfile"
+])
+test "$cf_cv_ncurses_version" = no || AC_DEFINE(NCURSES,1,[Define to 1 if we are using ncurses headers/libraries])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_OBJ_SUBDIR version: 8 updated: 2021/01/01 13:31:04
+dnl -------------
+dnl Compute the object-directory name from the given model name
+AC_DEFUN([CF_OBJ_SUBDIR],
+[
+	case $1 in
+	(libtool) $2='obj_lo'  ;;
+	(normal)  $2='objects' ;;
+	(debug)   $2='obj_g' ;;
+	(profile) $2='obj_p' ;;
+	(shared)
+		case "$cf_cv_system_name" in
+		(cygwin|msys)
+			$2='objects' ;;
+		(*)
+			$2='obj_s' ;;
+		esac
+	esac
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PATHSEP version: 8 updated: 2021/01/01 13:31:04
+dnl ----------
+dnl Provide a value for the $PATH and similar separator (or amend the value
+dnl as provided in autoconf 2.5x).
+AC_DEFUN([CF_PATHSEP],
+[
+	AC_MSG_CHECKING(for PATH separator)
+	case "$cf_cv_system_name" in
+	(os2*)	PATH_SEPARATOR=';'  ;;
+	(*)	${PATH_SEPARATOR:=':'}  ;;
+	esac
+ifelse([$1],,,[$1=$PATH_SEPARATOR])
+	AC_SUBST(PATH_SEPARATOR)
+	AC_MSG_RESULT($PATH_SEPARATOR)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PATH_SYNTAX version: 18 updated: 2020/12/31 18:40:20
+dnl --------------
+dnl Check the argument to see that it looks like a pathname.  Rewrite it if it
+dnl begins with one of the prefix/exec_prefix variables, and then again if the
+dnl result begins with 'NONE'.  This is necessary to work around autoconf's
+dnl delayed evaluation of those symbols.
+AC_DEFUN([CF_PATH_SYNTAX],[
+if test "x$prefix" != xNONE; then
+	cf_path_syntax="$prefix"
+else
+	cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".[$]$1" in
+(.\[$]\(*\)*|.\'*\'*)
+	;;
+(..|./*|.\\*)
+	;;
+(.[[a-zA-Z]]:[[\\/]]*) # OS/2 EMX
+	;;
+(.\[$]\{*prefix\}*|.\[$]\{*dir\}*)
+	eval $1="[$]$1"
+	case ".[$]$1" in
+	(.NONE/*)
+		$1=`echo "[$]$1" | sed -e s%NONE%$cf_path_syntax%`
+		;;
+	esac
+	;;
+(.no|.NONE/*)
+	$1=`echo "[$]$1" | sed -e s%NONE%$cf_path_syntax%`
+	;;
+(*)
+	ifelse([$2],,[AC_MSG_ERROR([expected a pathname, not \"[$]$1\"])],$2)
+	;;
+esac
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PKG_CONFIG version: 12 updated: 2021/10/10 20:18:09
+dnl -------------
+dnl Check for the package-config program, unless disabled by command-line.
+dnl
+dnl Sets $PKG_CONFIG to the pathname of the pkg-config program.
+AC_DEFUN([CF_PKG_CONFIG],
+[
+AC_MSG_CHECKING(if you want to use pkg-config)
+AC_ARG_WITH(pkg-config,
+	[  --with-pkg-config{=path} enable/disable use of pkg-config],
+	[cf_pkg_config=$withval],
+	[cf_pkg_config=yes])
+AC_MSG_RESULT($cf_pkg_config)
+
+case "$cf_pkg_config" in
+(no)
+	PKG_CONFIG=none
+	;;
+(yes)
+	CF_ACVERSION_CHECK(2.52,
+		[AC_PATH_TOOL(PKG_CONFIG, pkg-config, none)],
+		[AC_PATH_PROG(PKG_CONFIG, pkg-config, none)])
+	;;
+(*)
+	PKG_CONFIG=$withval
+	;;
+esac
+
+test -z "$PKG_CONFIG" && PKG_CONFIG=none
+if test "$PKG_CONFIG" != none ; then
+	CF_PATH_SYNTAX(PKG_CONFIG)
+elif test "x$cf_pkg_config" != xno ; then
+	AC_MSG_WARN(pkg-config is not installed)
+fi
+
+AC_SUBST(PKG_CONFIG)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_POSIX_C_SOURCE version: 11 updated: 2018/12/31 20:46:17
+dnl -----------------
+dnl Define _POSIX_C_SOURCE to the given level, and _POSIX_SOURCE if needed.
+dnl
+dnl	POSIX.1-1990				_POSIX_SOURCE
+dnl	POSIX.1-1990 and			_POSIX_SOURCE and
+dnl		POSIX.2-1992 C-Language			_POSIX_C_SOURCE=2
+dnl		Bindings Option
+dnl	POSIX.1b-1993				_POSIX_C_SOURCE=199309L
+dnl	POSIX.1c-1996				_POSIX_C_SOURCE=199506L
+dnl	X/Open 2000				_POSIX_C_SOURCE=200112L
+dnl
+dnl Parameters:
+dnl	$1 is the nominal value for _POSIX_C_SOURCE
+AC_DEFUN([CF_POSIX_C_SOURCE],
+[AC_REQUIRE([CF_POSIX_VISIBLE])dnl
+
+if test "$cf_cv_posix_visible" = no; then
+
+cf_POSIX_C_SOURCE=ifelse([$1],,199506L,[$1])
+
+cf_save_CFLAGS="$CFLAGS"
+cf_save_CPPFLAGS="$CPPFLAGS"
+
+CF_REMOVE_DEFINE(cf_trim_CFLAGS,$cf_save_CFLAGS,_POSIX_C_SOURCE)
+CF_REMOVE_DEFINE(cf_trim_CPPFLAGS,$cf_save_CPPFLAGS,_POSIX_C_SOURCE)
+
+AC_CACHE_CHECK(if we should define _POSIX_C_SOURCE,cf_cv_posix_c_source,[
+	CF_MSG_LOG(if the symbol is already defined go no further)
+	AC_TRY_COMPILE([#include <sys/types.h>],[
+#ifndef _POSIX_C_SOURCE
+make an error
+#endif],
+	[cf_cv_posix_c_source=no],
+	[cf_want_posix_source=no
+	 case .$cf_POSIX_C_SOURCE in
+	 (.[[12]]??*)
+		cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE"
+		;;
+	 (.2)
+		cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE"
+		cf_want_posix_source=yes
+		;;
+	 (.*)
+		cf_want_posix_source=yes
+		;;
+	 esac
+	 if test "$cf_want_posix_source" = yes ; then
+		AC_TRY_COMPILE([#include <sys/types.h>],[
+#ifdef _POSIX_SOURCE
+make an error
+#endif],[],
+		cf_cv_posix_c_source="$cf_cv_posix_c_source -D_POSIX_SOURCE")
+	 fi
+	 CF_MSG_LOG(ifdef from value $cf_POSIX_C_SOURCE)
+	 CFLAGS="$cf_trim_CFLAGS"
+	 CPPFLAGS="$cf_trim_CPPFLAGS"
+	 CF_APPEND_TEXT(CPPFLAGS,$cf_cv_posix_c_source)
+	 CF_MSG_LOG(if the second compile does not leave our definition intact error)
+	 AC_TRY_COMPILE([#include <sys/types.h>],[
+#ifndef _POSIX_C_SOURCE
+make an error
+#endif],,
+	 [cf_cv_posix_c_source=no])
+	 CFLAGS="$cf_save_CFLAGS"
+	 CPPFLAGS="$cf_save_CPPFLAGS"
+	])
+])
+
+if test "$cf_cv_posix_c_source" != no ; then
+	CFLAGS="$cf_trim_CFLAGS"
+	CPPFLAGS="$cf_trim_CPPFLAGS"
+	CF_ADD_CFLAGS($cf_cv_posix_c_source)
+fi
+
+fi # cf_cv_posix_visible
+
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_POSIX_VISIBLE version: 1 updated: 2018/12/31 20:46:17
+dnl ----------------
+dnl POSIX documents test-macros which an application may set before any system
+dnl headers are included to make features available.
+dnl
+dnl Some BSD platforms (originally FreeBSD, but copied by a few others)
+dnl diverged from POSIX in 2002 by setting symbols which make all of the most
+dnl recent features visible in the system header files unless the application
+dnl overrides the corresponding test-macros.  Doing that introduces portability
+dnl problems.
+dnl
+dnl This macro makes a special check for the symbols used for this, to avoid a
+dnl conflicting definition.
+AC_DEFUN([CF_POSIX_VISIBLE],
+[
+AC_CACHE_CHECK(if the POSIX test-macros are already defined,cf_cv_posix_visible,[
+AC_TRY_COMPILE([#include <stdio.h>],[
+#if defined(__POSIX_VISIBLE) && ((__POSIX_VISIBLE - 0L) > 0) \
+	&& defined(__XSI_VISIBLE) && ((__XSI_VISIBLE - 0L) > 0) \
+	&& defined(__BSD_VISIBLE) && ((__BSD_VISIBLE - 0L) > 0) \
+	&& defined(__ISO_C_VISIBLE) && ((__ISO_C_VISIBLE - 0L) > 0)
+#error conflicting symbols found
+#endif
+],[cf_cv_posix_visible=no],[cf_cv_posix_visible=yes])
+])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PROG_AR version: 1 updated: 2009/01/01 20:15:22
+dnl ----------
+dnl Check for archiver "ar".
+AC_DEFUN([CF_PROG_AR],[
+AC_CHECK_TOOL(AR, ar, ar)
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_PROG_AWK version: 1 updated: 2006/09/16 11:40:59
+dnl -----------
+dnl Check for awk, ensure that the check found something.
+AC_DEFUN([CF_PROG_AWK],
+[
+AC_PROG_AWK
+test -z "$AWK" && AC_MSG_ERROR(No awk program found)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PROG_CC version: 5 updated: 2019/12/31 08:53:54
+dnl ----------
+dnl standard check for CC, plus followup sanity checks
+dnl $1 = optional parameter to pass to AC_PROG_CC to specify compiler name
+AC_DEFUN([CF_PROG_CC],[
+CF_ACVERSION_CHECK(2.53,
+	[AC_MSG_WARN(this will incorrectly handle gnatgcc choice)
+	 AC_REQUIRE([AC_PROG_CC])],
+	[])
+ifelse($1,,[AC_PROG_CC],[AC_PROG_CC($1)])
+CF_GCC_VERSION
+CF_ACVERSION_CHECK(2.52,
+	[AC_PROG_CC_STDC],
+	[CF_ANSI_CC_REQD])
+CF_CC_ENV_FLAGS
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PROG_CC_C_O version: 6 updated: 2021/01/01 13:31:04
+dnl --------------
+dnl Analogous to AC_PROG_CC_C_O, but more useful: tests only $CC, ensures that
+dnl the output file can be renamed, and allows for a shell variable that can
+dnl be used later.  The parameter is either CC or CXX.  The result is the
+dnl cache variable:
+dnl	$cf_cv_prog_CC_c_o
+dnl	$cf_cv_prog_CXX_c_o
+dnl
+dnl $1 = compiler
+dnl $2 = compiler options, if any
+AC_DEFUN([CF_PROG_CC_C_O],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_MSG_CHECKING([whether [$]$1 understands -c and -o together])
+AC_CACHE_VAL(cf_cv_prog_$1_c_o,
+[
+cat > conftest.$ac_ext <<CF_EOF
+int main(void)
+{
+	${cf_cv_main_return:-return}(0);
+}
+CF_EOF
+# We do the test twice because some compilers refuse to overwrite an
+# existing .o file with -o, though they will create one.
+ac_try='[$]$1 $2 -c conftest.$ac_ext -o conftest2.$ac_objext >&AC_FD_CC'
+if AC_TRY_EVAL(ac_try) &&
+  test -f conftest2.$ac_objext && AC_TRY_EVAL(ac_try);
+then
+  eval cf_cv_prog_$1_c_o=yes
+else
+  eval cf_cv_prog_$1_c_o=no
+fi
+rm -rf ./conftest*
+])dnl
+if test "$cf_cv_prog_$1_c_o" = yes; then
+  AC_MSG_RESULT([yes])
+else
+  AC_MSG_RESULT([no])
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PROG_EGREP version: 2 updated: 2015/04/18 08:56:57
+dnl -------------
+dnl AC_PROG_EGREP was introduced in autoconf 2.53.
+dnl This macro adds a check to ensure the script found something.
+AC_DEFUN([CF_PROG_EGREP],
+[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep],
+	[if echo a | (grep -E '(a|b)') >/dev/null 2>&1
+		then ac_cv_prog_egrep='grep -E'
+		else ac_cv_prog_egrep='egrep'
+	fi])
+	EGREP=$ac_cv_prog_egrep
+	AC_SUBST([EGREP])
+	test -z "$EGREP" && AC_MSG_ERROR(No egrep program found)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PROG_EXT version: 15 updated: 2021/01/02 09:31:20
+dnl -----------
+dnl Compute $PROG_EXT, used for non-Unix ports, such as OS/2 EMX.
+AC_DEFUN([CF_PROG_EXT],
+[
+AC_REQUIRE([CF_CHECK_CACHE])
+case "$cf_cv_system_name" in
+(os2*)
+	CFLAGS="$CFLAGS -Zmt"
+	CF_APPEND_TEXT(CPPFLAGS,-D__ST_MT_ERRNO__)
+	CXXFLAGS="$CXXFLAGS -Zmt"
+	# autoconf's macro sets -Zexe and suffix both, which conflict:w
+	LDFLAGS="$LDFLAGS -Zmt -Zcrtdll"
+	ac_cv_exeext=.exe
+	;;
+esac
+
+AC_EXEEXT
+AC_OBJEXT
+
+PROG_EXT="$EXEEXT"
+AC_SUBST(PROG_EXT)
+test -n "$PROG_EXT" && AC_DEFINE_UNQUOTED(PROG_EXT,"$PROG_EXT",[Define to the program extension (normally blank)])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PROG_GNAT version: 12 updated: 2021/01/02 17:09:14
+dnl ------------
+dnl Check for gnat/gnatmake/etc, ensure that the toolset is complete.
+AC_DEFUN([CF_PROG_GNAT],[
+for cf_prog_gnat in gnat gnatmake gprconfig gprbuild
+do
+	CF_UPPER(cf_upper_prog_gnat,${cf_prog_gnat})
+
+	unset ac_cv_path_cf_TEMP_gnat
+	unset cf_TEMP_gnat
+	AC_PATH_PROG(cf_TEMP_gnat,$cf_prog_gnat,no)
+	eval "cf_cv_PATH_$cf_upper_prog_gnat=[$]ac_cv_path_cf_TEMP_gnat"
+
+	if test "x$cf_TEMP_gnat" != xno; then
+		unset cf_cv_gnat_version
+		unset cf_TEMP_gnat
+		CF_GNAT_VERSION(cf_TEMP_gnat,$cf_prog_gnat)
+	fi
+	eval "cf_cv_VERSION_$cf_upper_prog_gnat=[$]cf_TEMP_gnat"
+
+	unset cf_TEMP_gnat
+	unset cf_cv_gnat_version
+	unset ac_cv_path_cf_TEMP_gnat
+done
+
+if test "x$cf_cv_VERSION_GNATMAKE" = "xno"; then
+	cf_ada_make=
+	cf_cv_prog_gnat_correct=no
+else
+	cf_ada_make=gnatmake
+	if test "x$cf_cv_VERSION_GPRCONFIG" = "xno"; then
+		# gprconfig is newer than gnatmake; we can continue...
+		cf_ada_config="##"
+	else
+		rm -rf ./conftest* ./*~conftest*
+		if mkdir conftest.src
+		then
+			cf_ada_config=""
+			cd conftest.src
+			for cf_gprconfig in Ada C
+			do
+				AC_MSG_CHECKING(for gprconfig name for $cf_gprconfig)
+				if test "$cf_gprconfig" = C
+				then
+					for cf_gprconfig_param in \
+						"$cf_gprconfig,,,,GNATGCC" \
+						"$cf_gprconfig,,,,GCC" \
+						"$cf_gprconfig"
+					do
+						cf_gprconfig_value=`echo s| gprconfig --config=$cf_gprconfig_param 2>&AC_FD_CC | ${AWK:-awk} '/^\*/{print [$]3;}' | head -n 1`
+						test -n "$cf_gprconfig_value" && break
+					done
+				else
+					cf_gprconfig_param=$cf_gprconfig
+					cf_gprconfig_value=`echo s| gprconfig --config=$cf_gprconfig_param 2>&AC_FD_CC | ${AWK:-awk} '/^\*/{print [$]3;}' | head -n 1`
+				fi
+				if test -n "$cf_gprconfig_value"
+				then
+					eval "cf_ada_config_[$]cf_gprconfig=[$]cf_gprconfig_value"
+					AC_MSG_RESULT($cf_gprconfig_value)
+				else
+					AC_MSG_RESULT(missing)
+					cf_ada_config="#"
+					break
+				fi
+			done
+			cd ..
+			rm -rf ./conftest* ./*~conftest*
+		fi
+	fi
+	if test "x$cf_ada_config" != "x#"
+	then
+		CF_GNAT_VERSION
+		CF_CHECK_GNAT_VERSION
+		AC_CHECK_PROG(M4_exists, m4, yes, no)
+		if test "$ac_cv_prog_M4_exists" = no; then
+			cf_cv_prog_gnat_correct=no
+			AC_MSG_WARN(Ada95 binding required program m4 not found. Ada95 binding disabled)
+		fi
+		if test "$cf_cv_prog_gnat_correct" = yes; then
+			AC_MSG_CHECKING(if GNAT works)
+			CF_GNAT_TRY_RUN([procedure conftest;],
+[with Text_IO;
+with GNAT.OS_Lib;
+procedure conftest is
+begin
+   Text_IO.Put ("Hello World");
+   Text_IO.New_Line;
+   GNAT.OS_Lib.OS_Exit (0);
+end conftest;],
+[cf_cv_prog_gnat_correct=yes],
+[cf_cv_prog_gnat_correct=no])
+			AC_MSG_RESULT($cf_cv_prog_gnat_correct)
+		fi
+	else
+		cf_cv_prog_gnat_correct=no
+	fi
+fi
+
+AC_SUBST(cf_ada_make)
+AC_SUBST(cf_ada_config)
+AC_SUBST(cf_ada_config_Ada)
+AC_SUBST(cf_ada_config_C)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PROG_INSTALL version: 10 updated: 2021/01/04 19:33:05
+dnl ---------------
+dnl Force $INSTALL to be an absolute-path.  Otherwise, edit_man.sh and the
+dnl misc/tabset install won't work properly.  Usually this happens only when
+dnl using the fallback mkinstalldirs script
+AC_DEFUN([CF_PROG_INSTALL],
+[AC_PROG_INSTALL
+case $INSTALL in
+(/*)
+	;;
+(*)
+	CF_DIRNAME(cf_dir,$INSTALL)
+	test -z "$cf_dir" && cf_dir=.
+	INSTALL="`cd \"$cf_dir\" && pwd`"/"`echo "$INSTALL" | sed -e 's%^.*/%%'`"
+	;;
+esac
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PROG_LN_S version: 2 updated: 2010/08/14 18:25:37
+dnl ------------
+dnl Combine checks for "ln -s" and "ln -sf", updating $LN_S to include "-f"
+dnl option if it is supported.
+AC_DEFUN([CF_PROG_LN_S],[
+AC_PROG_LN_S
+AC_MSG_CHECKING(if $LN_S -f options work)
+
+rm -f conf$$.src conf$$dst
+echo >conf$$.dst
+echo first >conf$$.src
+if $LN_S -f conf$$.src conf$$.dst 2>/dev/null; then
+	cf_prog_ln_sf=yes
+else
+	cf_prog_ln_sf=no
+fi
+rm -f conf$$.dst conf$$src
+AC_MSG_RESULT($cf_prog_ln_sf)
+
+test "$cf_prog_ln_sf" = yes && LN_S="$LN_S -f"
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_REMOVE_CFLAGS version: 3 updated: 2021/09/05 17:25:40
+dnl ----------------
+dnl Remove a given option from CFLAGS/CPPFLAGS
+dnl $1 = option to remove
+dnl $2 = variable to update
+dnl $3 = nonempty to allow verbose message
+define([CF_REMOVE_CFLAGS],
+[
+cf_tmp_cflag=`echo "x$1" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x[$]$2" | sed -e 's/^.//' -e 's/[[ 	]][[ 	]]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[[^ 	]][[^ 	]]*\\)\?%%" -e 's/^[[ 	]]*//' -e 's%[[ ]][[ ]]*-D% -D%g' -e 's%[[ ]][[ ]]*-I% -I%g'`
+	test "[$]$2" != "$cf_old_cflag" || break
+	ifelse([$3],,,[CF_VERBOSE(removing old option $1 from $2)])
+	$2="$cf_old_cflag"
+done
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_REMOVE_DEFINE version: 3 updated: 2010/01/09 11:05:50
+dnl ----------------
+dnl Remove all -U and -D options that refer to the given symbol from a list
+dnl of C compiler options.  This works around the problem that not all
+dnl compilers process -U and -D options from left-to-right, so a -U option
+dnl cannot be used to cancel the effect of a preceding -D option.
+dnl
+dnl $1 = target (which could be the same as the source variable)
+dnl $2 = source (including '$')
+dnl $3 = symbol to remove
+define([CF_REMOVE_DEFINE],
+[
+$1=`echo "$2" | \
+	sed	-e 's/-[[UD]]'"$3"'\(=[[^ 	]]*\)\?[[ 	]]/ /g' \
+		-e 's/-[[UD]]'"$3"'\(=[[^ 	]]*\)\?[$]//g'`
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_REMOVE_LIB version: 1 updated: 2007/02/17 14:11:52
+dnl -------------
+dnl Remove the given library from the symbol
+dnl
+dnl $1 = target (which could be the same as the source variable)
+dnl $2 = source (including '$')
+dnl $3 = library to remove
+define([CF_REMOVE_LIB],
+[
+# remove $3 library from $2
+$1=`echo "$2" | sed -e 's/-l$3[[ 	]]//g' -e 's/-l$3[$]//'`
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_RESTORE_XTRA_FLAGS version: 1 updated: 2020/01/11 16:47:45
+dnl ---------------------
+dnl Restore flags saved in CF_SAVE_XTRA_FLAGS
+dnl $1 = name of current macro
+define([CF_RESTORE_XTRA_FLAGS],
+[
+LIBS="$cf_save_LIBS_$1"
+CFLAGS="$cf_save_CFLAGS_$1"
+CPPFLAGS="$cf_save_CPPFLAGS_$1"
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_SAVE_XTRA_FLAGS version: 1 updated: 2020/01/11 16:46:44
+dnl ------------------
+dnl Use this macro to save CFLAGS/CPPFLAGS/LIBS before checks against X headers
+dnl and libraries which do not update those variables.
+dnl
+dnl $1 = name of current macro
+define([CF_SAVE_XTRA_FLAGS],
+[
+cf_save_LIBS_$1="$LIBS"
+cf_save_CFLAGS_$1="$CFLAGS"
+cf_save_CPPFLAGS_$1="$CPPFLAGS"
+LIBS="$LIBS ${X_PRE_LIBS} ${X_LIBS} ${X_EXTRA_LIBS}"
+for cf_X_CFLAGS in $X_CFLAGS
+do
+	case "x$cf_X_CFLAGS" in
+	x-[[IUD]]*)
+		CPPFLAGS="$CPPFLAGS $cf_X_CFLAGS"
+		;;
+	*)
+		CFLAGS="$CFLAGS $cf_X_CFLAGS"
+		;;
+	esac
+done
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_SHARED_OPTS version: 107 updated: 2021/09/04 06:47:34
+dnl --------------
+dnl --------------
+dnl Attempt to determine the appropriate CC/LD options for creating a shared
+dnl library.
+dnl
+dnl Notes:
+dnl a) ${LOCAL_LDFLAGS} is used to link executables that will run within
+dnl the build-tree, i.e., by making use of the libraries that are compiled in
+dnl $rel_builddir/lib We avoid compiling-in a $rel_builddir/lib path for the
+dnl shared library since that can lead to unexpected results at runtime.
+dnl b) ${LOCAL_LDFLAGS2} has the same intention but assumes that the shared
+dnl libraries are compiled in ../../lib
+dnl
+dnl The variable 'cf_cv_do_symlinks' is used to control whether we configure
+dnl to install symbolic links to the rel/abi versions of shared libraries.
+dnl
+dnl The variable 'cf_cv_shlib_version' controls whether we use the rel or abi
+dnl version when making symbolic links.
+dnl
+dnl The variable 'cf_cv_shlib_version_infix' controls whether shared library
+dnl version numbers are infix (ex: libncurses.<ver>.dylib) or postfix
+dnl (ex: libncurses.so.<ver>).
+dnl
+dnl Some loaders leave 'so_locations' lying around.  It is nice to clean up.
+AC_DEFUN([CF_SHARED_OPTS],
+[
+	AC_REQUIRE([CF_LD_RPATH_OPT])
+
+	RM_SHARED_OPTS=
+	LOCAL_LDFLAGS=
+	LOCAL_LDFLAGS2=
+	LD_SHARED_OPTS=
+	INSTALL_LIB="-m 644"
+	: ${rel_builddir:=.}
+
+	shlibdir=$libdir
+	AC_SUBST(shlibdir)
+
+	MAKE_DLLS="#"
+	AC_SUBST(MAKE_DLLS)
+
+	cf_cv_do_symlinks=no
+	cf_ld_rpath_opt=
+	test "$cf_cv_enable_rpath" = yes && cf_ld_rpath_opt="$LD_RPATH_OPT"
+
+	AC_MSG_CHECKING(if release/abi version should be used for shared libs)
+	AC_ARG_WITH(shlib-version,
+	[  --with-shlib-version=X  Specify rel or abi version for shared libs],
+	[test -z "$withval" && withval=auto
+	case "$withval" in
+	(yes)
+		cf_cv_shlib_version=auto
+		;;
+	(rel|abi|auto)
+		cf_cv_shlib_version=$withval
+		;;
+	(*)
+		AC_MSG_RESULT($withval)
+		AC_MSG_ERROR([option value must be one of: rel, abi, or auto])
+		;;
+	esac
+	],[cf_cv_shlib_version=auto])
+	AC_MSG_RESULT($cf_cv_shlib_version)
+
+	cf_cv_rm_so_locs=no
+	cf_try_cflags=
+
+	# Some less-capable ports of gcc support only -fpic
+	CC_SHARED_OPTS=
+
+	cf_try_fPIC=no
+	if test "$GCC" = yes
+	then
+		cf_try_fPIC=yes
+	else
+		case "$cf_cv_system_name" in
+		(*linux*)	# e.g., PGI compiler
+			cf_try_fPIC=yes
+			;;
+		esac
+	fi
+
+	if test "$cf_try_fPIC" = yes
+	then
+		AC_MSG_CHECKING(which $CC option to use)
+		cf_save_CFLAGS="$CFLAGS"
+		for CC_SHARED_OPTS in -fPIC -fpic ''
+		do
+			CFLAGS="$cf_save_CFLAGS $CC_SHARED_OPTS"
+			AC_TRY_COMPILE([#include <stdio.h>],[int x = 1],[break],[])
+		done
+		AC_MSG_RESULT($CC_SHARED_OPTS)
+		CFLAGS="$cf_save_CFLAGS"
+	fi
+
+	cf_cv_shlib_version_infix=no
+
+	case "$cf_cv_system_name" in
+	(aix4.[3-9]*|aix[[5-7]]*)
+		if test "$GCC" = yes; then
+			CC_SHARED_OPTS='-Wl,-brtl'
+			MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-brtl -Wl,-blibpath:${RPATH_LIST}:/usr/lib -o [$]@'
+		else
+			CC_SHARED_OPTS='-brtl'
+			# as well as '-qpic=large -G' or perhaps "-bM:SRE -bnoentry -bexpall"
+			MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -G -Wl,-brtl -Wl,-blibpath:${RPATH_LIST}:/usr/lib -o [$]@'
+		fi
+		;;
+	(beos*)
+		MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -o $[@] -Xlinker -soname=`basename $[@]` -nostart -e 0'
+		;;
+	(cygwin*)
+		CC_SHARED_OPTS=
+		MK_SHARED_LIB=$SHELL' '$rel_builddir'/mk_shared_lib.sh [$]@ [$]{CC} [$]{CFLAGS}'
+		RM_SHARED_OPTS="$RM_SHARED_OPTS $rel_builddir/mk_shared_lib.sh *.dll.a"
+		cf_cv_shlib_version=cygdll
+		cf_cv_shlib_version_infix=cygdll
+		shlibdir=$bindir
+		MAKE_DLLS=
+		cat >mk_shared_lib.sh <<-CF_EOF
+		#!$SHELL
+		SHARED_LIB=\[$]1
+		IMPORT_LIB=\`echo "\[$]1" | sed -e 's/cyg/lib/' -e 's/[[0-9]]*\.dll[$]/.dll.a/'\`
+		shift
+		cat <<-EOF
+		Linking shared library
+		** SHARED_LIB \[$]SHARED_LIB
+		** IMPORT_LIB \[$]IMPORT_LIB
+EOF
+		exec \[$]* ${LDFLAGS} -shared -Wl,--out-implib=\[$]{IMPORT_LIB} -Wl,--export-all-symbols -o \[$]{SHARED_LIB}
+CF_EOF
+		chmod +x mk_shared_lib.sh
+		;;
+	(msys*)
+		CC_SHARED_OPTS=
+		MK_SHARED_LIB=$SHELL' '$rel_builddir'/mk_shared_lib.sh [$]@ [$]{CC} [$]{CFLAGS}'
+		RM_SHARED_OPTS="$RM_SHARED_OPTS $rel_builddir/mk_shared_lib.sh *.dll.a"
+		cf_cv_shlib_version=msysdll
+		cf_cv_shlib_version_infix=msysdll
+		shlibdir=$bindir
+		MAKE_DLLS=
+		cat >mk_shared_lib.sh <<-CF_EOF
+		#!$SHELL
+		SHARED_LIB=\[$]1
+		IMPORT_LIB=\`echo "\[$]1" | sed -e 's/msys-/lib/' -e 's/[[0-9]]*\.dll[$]/.dll.a/'\`
+		shift
+		cat <<-EOF
+		Linking shared library
+		** SHARED_LIB \[$]SHARED_LIB
+		** IMPORT_LIB \[$]IMPORT_LIB
+EOF
+		exec \[$]* ${LDFLAGS} -shared -Wl,--out-implib=\[$]{IMPORT_LIB} -Wl,--export-all-symbols -o \[$]{SHARED_LIB}
+CF_EOF
+		chmod +x mk_shared_lib.sh
+		;;
+	(darwin*)
+		cf_try_cflags="no-cpp-precomp"
+		CC_SHARED_OPTS="-dynamic"
+		MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -dynamiclib -install_name ${libdir}/`basename $[@]` -compatibility_version ${ABI_VERSION} -current_version ${ABI_VERSION} -o $[@]'
+		test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=abi
+		cf_cv_shlib_version_infix=yes
+		AC_CACHE_CHECK([if ld -search_paths_first works], cf_cv_ldflags_search_paths_first, [
+			cf_save_LDFLAGS=$LDFLAGS
+			LDFLAGS="$LDFLAGS -Wl,-search_paths_first"
+			AC_TRY_LINK(, [int i;], cf_cv_ldflags_search_paths_first=yes, cf_cv_ldflags_search_paths_first=no)
+				LDFLAGS=$cf_save_LDFLAGS])
+		if test "$cf_cv_ldflags_search_paths_first" = yes; then
+			LDFLAGS="$LDFLAGS -Wl,-search_paths_first"
+		fi
+		;;
+	(haiku*)
+		CF_SHARED_SONAME
+		MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,'$cf_cv_shared_soname',-stats,-lc -o $[@]'
+		;;
+	(hpux[[7-8]]*)
+		# HP-UX 8.07 ld lacks "+b" option used for libdir search-list
+		if test "$GCC" != yes; then
+			CC_SHARED_OPTS='+Z'
+		fi
+		MK_SHARED_LIB='${LD} ${LDFLAGS} -b -o $[@]'
+		INSTALL_LIB="-m 555"
+		;;
+	(hpux*)
+		# (tested with gcc 2.7.2 -- I don't have c89)
+		if test "$GCC" = yes; then
+			LD_SHARED_OPTS='-Xlinker +b -Xlinker ${libdir}'
+		else
+			CC_SHARED_OPTS='+Z'
+			LD_SHARED_OPTS='-Wl,+b,${libdir}'
+		fi
+		MK_SHARED_LIB='${LD} ${LDFLAGS} +b ${libdir} -b -o $[@]'
+		# HP-UX shared libraries must be executable, and should be
+		# readonly to exploit a quirk in the memory manager.
+		INSTALL_LIB="-m 555"
+		;;
+	(interix*)
+		test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel
+		if test "$cf_cv_shlib_version" = rel; then
+			cf_shared_soname='`basename $[@] .${REL_VERSION}`.${ABI_VERSION}'
+		else
+			cf_shared_soname='`basename $[@]`'
+		fi
+		CC_SHARED_OPTS=
+		MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-rpath,${RPATH_LIST} -Wl,-h,'$cf_shared_soname' -o $[@]'
+		;;
+	(irix*)
+		if test "$cf_cv_enable_rpath" = yes ; then
+			EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS"
+		fi
+		# tested with IRIX 5.2 and 'cc'.
+		if test "$GCC" != yes; then
+			CC_SHARED_OPTS='-KPIC'
+			MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -rdata_shared -soname `basename $[@]` -o $[@]'
+		else
+			MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,`basename $[@]` -o $[@]'
+		fi
+		cf_cv_rm_so_locs=yes
+		;;
+	(linux*|gnu*|k*bsd*-gnu)
+		if test "$DFT_LWR_MODEL" = "shared" && test -n "$LD_RPATH_OPT" ; then
+			LOCAL_LDFLAGS="${LD_RPATH_OPT}\$(LOCAL_LIBDIR)"
+			LOCAL_LDFLAGS2="$LOCAL_LDFLAGS"
+		fi
+		if test "$cf_cv_enable_rpath" = yes ; then
+			EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS"
+		fi
+		CF_SHARED_SONAME
+		MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,'$cf_cv_shared_soname',-stats,-lc -o $[@]'
+		;;
+	(mingw*msvc*)
+		cf_cv_shlib_version=msvcdll
+		cf_cv_shlib_version_infix=msvcdll
+		shlibdir=$bindir
+		MAKE_DLLS=
+		if test "$DFT_LWR_MODEL" = "shared" ; then
+			LOCAL_LDFLAGS="-link -dll"
+			LOCAL_LDFLAGS2="$LOCAL_LDFLAGS"
+			EXTRA_LDFLAGS="-link -dll $EXTRA_LDFLAGS"
+		fi
+		CC_SHARED_OPTS=
+		MK_SHARED_LIB=$SHELL' '$rel_builddir'/mk_shared_lib.sh [$]@ ${LD} [$]{CFLAGS}'
+		RM_SHARED_OPTS="$RM_SHARED_OPTS $rel_builddir/mk_shared_lib.sh *.dll.lib"
+		cat >mk_shared_lib.sh <<-CF_EOF
+		#!$SHELL
+		SHARED_LIB=\[$]1
+		IMPORT_LIB=\`echo "\[$]1" | sed -e 's/[[0-9]]*\.dll[$]/.dll.lib/'\`
+		shift
+		my_ld=\[$]1
+		shift
+		cat <<-EOF
+		Linking shared library
+		** SHARED LIB \$SHARED_LIB
+		** IMPORT_LIB \$IMPORT_LIB
+EOF
+		args=\$(echo \[$]* | sed -E "s#-l(\w*)#\1.dll.lib#g" | sed -E "s#-L(\w*)#-LIBPATH:\1#g")
+		exec \$my_ld -DLL -IMPLIB:"\${IMPORT_LIB}" -OUT:"\${SHARED_LIB}" ${LDFLAGS} \$args
+		mv "\${IMPORT_LIB}" "\${IMPORT_LIB}"
+CF_EOF
+		chmod +x mk_shared_lib.sh
+		cat >mk_prog.sh <<-CF_EOF
+		#!$SHELL
+		shift
+		# Ignore first argument (compiler) and use LD (link.exe) unconditionally
+		LD="[$]LD"
+		clopts=()
+		ldopts=("/subsystem:console")
+		libs=()
+		isdll=0
+		while test \[$]# -gt 0; do
+			case "\[$]1" in
+				-link)
+					# ignore -link argument
+					;;
+				-M[[TD]] | -M[[TD]]d)
+					# ignore runtime-library option
+					;;
+				-dll)
+					isdll=1
+					;;
+				-W* | -w*)
+					# ignore warnings
+					;;
+				-D*)
+					clopts+=("\[$]1")
+					;;
+				-I*)
+					clopts+=("\[$]1")
+					;;
+				-l*)
+					libs+=("\`echo \"\[$]1\" | sed \"s/^-l//\"\`")
+					;;
+				-L*)
+					ldopts+=("\`echo \"\[$]1\" | sed \"s/^-L/-LIBPATH:/\"\`")
+					;;
+				*.obj | *.o)
+					ldopts+=("\[$]1")
+					;;
+				-Wl,*)
+					for linkarg in \`echo '\[$]1' | sed -e 's/-Wl,//' -e 's/,/ /'\`; do
+						ldopts+=("\[$]{linkarg}")
+					done
+					;;
+				*.lib)
+					ldopts+=("\[$]1")
+					;;
+				-o)
+					shift
+					ldopts+=("-out:\[$]1")
+					;;
+				*)
+					clopts+=("\[$]1")
+					ldopts+=("\[$]1")
+					;;
+			esac
+			shift
+		done
+		if [[ "\$isdll" -ne 0 ]]; then
+			for lib in \[$]{libs[[*]]}; do
+				ldopts+=("\[$]lib.dll.lib")
+			done
+		else
+			for lib in \[$]{libs[[*]]}; do
+				ldopts+=("\[$]lib.lib")
+			done
+		fi
+		cat <<-EOF
+		Creating program
+		** ld options:   "\[$]{ldopts[[@]]}"
+EOF
+		exec \[$]LD \[$]{ldopts[[@]]}
+CF_EOF
+		chmod +x mk_prog.sh
+		LINK_PROGS="$SHELL ${rel_builddir}/mk_prog.sh"
+		LINK_TESTS="$SHELL ${rel_builddir}/mk_prog.sh"
+		;;
+	(mingw*)
+		cf_cv_shlib_version=mingw
+		cf_cv_shlib_version_infix=mingw
+		shlibdir=$bindir
+		MAKE_DLLS=
+		if test "$DFT_LWR_MODEL" = "shared" ; then
+			LOCAL_LDFLAGS="-Wl,--enable-auto-import"
+			LOCAL_LDFLAGS2="$LOCAL_LDFLAGS"
+			EXTRA_LDFLAGS="-Wl,--enable-auto-import $EXTRA_LDFLAGS"
+		fi
+		CC_SHARED_OPTS=
+		MK_SHARED_LIB=$SHELL' '$rel_builddir'/mk_shared_lib.sh [$]@ [$]{CC} [$]{CFLAGS}'
+		RM_SHARED_OPTS="$RM_SHARED_OPTS $rel_builddir/mk_shared_lib.sh *.dll.a"
+		cat >mk_shared_lib.sh <<-CF_EOF
+		#!$SHELL
+		SHARED_LIB=\[$]1
+		IMPORT_LIB=\`echo "\[$]1" | sed -e 's/[[0-9]]*\.dll[$]/.dll.a/'\`
+		shift
+		cat <<-EOF
+		Linking shared library
+		** SHARED_LIB \[$]SHARED_LIB
+		** IMPORT_LIB \[$]IMPORT_LIB
+EOF
+		exec \[$]* ${LDFLAGS} -shared -Wl,--enable-auto-import,--out-implib=\[$]{IMPORT_LIB} -Wl,--export-all-symbols -o \[$]{SHARED_LIB}
+CF_EOF
+		chmod +x mk_shared_lib.sh
+		;;
+	(openbsd[[2-9]].*|mirbsd*)
+		if test "$DFT_LWR_MODEL" = "shared" && test -n "$LD_RPATH_OPT" ; then
+			LOCAL_LDFLAGS="${LD_RPATH_OPT}\$(LOCAL_LIBDIR)"
+			LOCAL_LDFLAGS2="$LOCAL_LDFLAGS"
+		fi
+		if test "$cf_cv_enable_rpath" = yes ; then
+			EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS"
+		fi
+		CC_SHARED_OPTS="$CC_SHARED_OPTS -DPIC"
+		CF_SHARED_SONAME
+		MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-Bshareable,-soname,'$cf_cv_shared_soname',-stats,-lc -o $[@]'
+		;;
+	(nskJ*)
+		CC_SHARED_OPTS=
+		MK_SHARED_LIB='${LD} -Wshared -Weld=-export_all -o $[@]'
+		;;
+	(nskL*)
+		CC_SHARED_OPTS=
+		MK_SHARED_LIB='${LD} -Wshared -Wxld=-export_all -o $[@]'
+		;;
+	(nto-qnx*|openbsd*|freebsd[[12]].*)
+		CC_SHARED_OPTS="$CC_SHARED_OPTS -DPIC"
+		MK_SHARED_LIB='${LD} ${LDFLAGS} -Bshareable -o $[@]'
+		test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel
+		;;
+	(dragonfly*|freebsd*)
+		CC_SHARED_OPTS="$CC_SHARED_OPTS -DPIC"
+		if test "$DFT_LWR_MODEL" = "shared" && test "$cf_cv_enable_rpath" = yes ; then
+			LOCAL_LDFLAGS="${cf_ld_rpath_opt}\$(LOCAL_LIBDIR)"
+			LOCAL_LDFLAGS2="${cf_ld_rpath_opt}\${RPATH_LIST} $LOCAL_LDFLAGS"
+			EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS"
+		fi
+		CF_SHARED_SONAME
+		MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,'$cf_cv_shared_soname',-stats,-lc -o $[@]'
+		;;
+	(netbsd*)
+		CC_SHARED_OPTS="$CC_SHARED_OPTS -DPIC"
+		if test "$DFT_LWR_MODEL" = "shared" && test "$cf_cv_enable_rpath" = yes ; then
+			LOCAL_LDFLAGS="${cf_ld_rpath_opt}\$(LOCAL_LIBDIR)"
+			LOCAL_LDFLAGS2="$LOCAL_LDFLAGS"
+			EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS"
+			if test "$cf_cv_shlib_version" = auto; then
+			if test -f /usr/libexec/ld.elf_so; then
+				cf_cv_shlib_version=abi
+			else
+				cf_cv_shlib_version=rel
+			fi
+			fi
+			CF_SHARED_SONAME
+			MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,'$cf_cv_shared_soname' -o $[@]'
+		else
+			MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -o $[@]'
+		fi
+		;;
+	(osf*|mls+*)
+		# tested with OSF/1 V3.2 and 'cc'
+		# tested with OSF/1 V3.2 and gcc 2.6.3 (but the c++ demo didn't
+		# link with shared libs).
+		MK_SHARED_LIB='${LD} ${LDFLAGS} -set_version ${REL_VERSION}:${ABI_VERSION} -expect_unresolved "*" -shared -soname `basename $[@]`'
+		case "$host_os" in
+		(osf4*)
+			MK_SHARED_LIB="${MK_SHARED_LIB} -msym"
+			;;
+		esac
+		MK_SHARED_LIB="${MK_SHARED_LIB}"' -o $[@]'
+		if test "$DFT_LWR_MODEL" = "shared" && test -n "$LD_RPATH_OPT" ; then
+			LOCAL_LDFLAGS="${LD_RPATH_OPT}\$(LOCAL_LIBDIR)"
+			LOCAL_LDFLAGS2="$LOCAL_LDFLAGS"
+		fi
+		cf_cv_rm_so_locs=yes
+		;;
+	(sco3.2v5*)  # also uw2* and UW7: hops 13-Apr-98
+		# tested with osr5.0.5
+		if test "$GCC" != yes; then
+			CC_SHARED_OPTS='-belf -KPIC'
+		fi
+		MK_SHARED_LIB='${LD} ${LDFLAGS} -dy -G -h `basename $[@] .${REL_VERSION}`.${ABI_VERSION} -o [$]@'
+		if test "$cf_cv_enable_rpath" = yes ; then
+			# only way is to set LD_RUN_PATH but no switch for it
+			RUN_PATH=$libdir
+		fi
+		test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel
+		LINK_PROGS='LD_RUN_PATH=${libdir}'
+		LINK_TESTS='Pwd=`pwd`;LD_RUN_PATH=`dirname $${Pwd}`/lib'
+		;;
+	(sunos4*)
+		# tested with SunOS 4.1.1 and gcc 2.7.0
+		if test "$GCC" != yes; then
+			CC_SHARED_OPTS='-KPIC'
+		fi
+		MK_SHARED_LIB='${LD} ${LDFLAGS} -assert pure-text -o $[@]'
+		test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel
+		;;
+	(solaris2*)
+		# tested with SunOS 5.5.1 (solaris 2.5.1) and gcc 2.7.2
+		# tested with SunOS 5.10 (solaris 10) and gcc 3.4.3
+		if test "$DFT_LWR_MODEL" = "shared" ; then
+			LOCAL_LDFLAGS="-R \$(LOCAL_LIBDIR):\${libdir}"
+			LOCAL_LDFLAGS2="$LOCAL_LDFLAGS"
+		fi
+		if test "$cf_cv_enable_rpath" = yes ; then
+			EXTRA_LDFLAGS="-R \${libdir} $EXTRA_LDFLAGS"
+		fi
+		CF_SHARED_SONAME
+		if test "$GCC" != yes; then
+			cf_save_CFLAGS="$CFLAGS"
+			for cf_shared_opts in -xcode=pic32 -xcode=pic13 -KPIC -Kpic -O
+			do
+				CFLAGS="$cf_shared_opts $cf_save_CFLAGS"
+				AC_TRY_COMPILE([#include <stdio.h>],[printf("Hello\\n");],[break])
+			done
+			CFLAGS="$cf_save_CFLAGS"
+			CC_SHARED_OPTS=$cf_shared_opts
+			MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -dy -G -h '$cf_cv_shared_soname' -o $[@]'
+		else
+			MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -dy -G -h '$cf_cv_shared_soname' -o $[@]'
+		fi
+		;;
+	(sysv5uw7*|unix_sv*)
+		# tested with UnixWare 7.1.0 (gcc 2.95.2 and cc)
+		if test "$GCC" != yes; then
+			CC_SHARED_OPTS='-KPIC'
+		fi
+		MK_SHARED_LIB='${LD} ${LDFLAGS} -d y -G -o [$]@'
+		;;
+	(*)
+		CC_SHARED_OPTS='unknown'
+		MK_SHARED_LIB='echo unknown'
+		;;
+	esac
+
+	# This works if the last tokens in $MK_SHARED_LIB are the -o target.
+	case "$cf_cv_shlib_version" in
+	(rel|abi)
+		case "$MK_SHARED_LIB" in
+		(*'-o $[@]')
+			test "$cf_cv_do_symlinks" = no && cf_cv_do_symlinks=yes
+			;;
+		(*)
+			AC_MSG_WARN(ignored --with-shlib-version)
+			;;
+		esac
+		;;
+	esac
+
+	if test -n "$cf_try_cflags"
+	then
+cat > conftest.$ac_ext <<EOF
+#line __oline__ "${as_me:-configure}"
+#include <stdio.h>
+int main(int argc, char *argv[[]])
+{
+	printf("hello\\n");
+	return (argv[[argc-1]] == 0) ;
+}
+EOF
+		cf_save_CFLAGS="$CFLAGS"
+		for cf_opt in $cf_try_cflags
+		do
+			CFLAGS="$cf_save_CFLAGS -$cf_opt"
+			AC_MSG_CHECKING(if CFLAGS option -$cf_opt works)
+			if AC_TRY_EVAL(ac_compile); then
+				AC_MSG_RESULT(yes)
+				cf_save_CFLAGS="$CFLAGS"
+			else
+				AC_MSG_RESULT(no)
+			fi
+		done
+		CFLAGS="$cf_save_CFLAGS"
+	fi
+
+
+	# RPATH_LIST is a colon-separated list of directories
+	test -n "$cf_ld_rpath_opt" && MK_SHARED_LIB="$MK_SHARED_LIB $cf_ld_rpath_opt\${RPATH_LIST}"
+	test -z "$RPATH_LIST" && RPATH_LIST="\${libdir}"
+
+	test "$cf_cv_rm_so_locs" = yes && RM_SHARED_OPTS="$RM_SHARED_OPTS so_locations"
+
+	CF_VERBOSE(CC_SHARED_OPTS: $CC_SHARED_OPTS)
+	CF_VERBOSE(MK_SHARED_LIB:  $MK_SHARED_LIB)
+
+	AC_SUBST(CC_SHARED_OPTS)
+	AC_SUBST(LD_RPATH_OPT)
+	AC_SUBST(LD_SHARED_OPTS)
+	AC_SUBST(MK_SHARED_LIB)
+	AC_SUBST(RM_SHARED_OPTS)
+
+	AC_SUBST(LINK_PROGS)
+	AC_SUBST(LINK_TESTS)
+
+	AC_SUBST(EXTRA_LDFLAGS)
+	AC_SUBST(LOCAL_LDFLAGS)
+	AC_SUBST(LOCAL_LDFLAGS2)
+
+	AC_SUBST(INSTALL_LIB)
+	AC_SUBST(RPATH_LIST)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_SHARED_SONAME version: 3 updated: 2008/09/08 18:34:43
+dnl ----------------
+dnl utility macro for CF_SHARED_OPTS, constructs "$cf_cv_shared_soname" for
+dnl substitution into MK_SHARED_LIB string for the "-soname" (or similar)
+dnl option.
+dnl
+dnl $1 is the default that should be used for "$cf_cv_shlib_version".
+dnl If missing, use "rel".
+define([CF_SHARED_SONAME],
+[
+	test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=ifelse($1,,rel,$1)
+	if test "$cf_cv_shlib_version" = rel; then
+		cf_cv_shared_soname='`basename $[@] .${REL_VERSION}`.${ABI_VERSION}'
+	else
+		cf_cv_shared_soname='`basename $[@]`'
+	fi
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_STRIP_G_OPT version: 4 updated: 2021/01/02 09:31:20
+dnl --------------
+dnl	Remove "-g" option from the compiler options
+AC_DEFUN([CF_STRIP_G_OPT],
+[$1=`echo "${$1}" | CF__SED_TRIMBLANKS(-e 's%-g %%' -e 's%-g$%%')`])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_SUBDIR_PATH version: 7 updated: 2014/12/04 04:33:06
+dnl --------------
+dnl Construct a search-list for a nonstandard header/lib-file
+dnl	$1 = the variable to return as result
+dnl	$2 = the package name
+dnl	$3 = the subdirectory, e.g., bin, include or lib
+AC_DEFUN([CF_SUBDIR_PATH],
+[
+$1=
+
+CF_ADD_SUBDIR_PATH($1,$2,$3,$prefix,NONE)
+
+for cf_subdir_prefix in \
+	/usr \
+	/usr/local \
+	/usr/pkg \
+	/opt \
+	/opt/local \
+	[$]HOME
+do
+	CF_ADD_SUBDIR_PATH($1,$2,$3,$cf_subdir_prefix,$prefix)
+done
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_TERM_HEADER version: 6 updated: 2021/01/02 09:31:20
+dnl --------------
+dnl Look for term.h, which is part of X/Open curses.  It defines the interface
+dnl to terminfo database.  Usually it is in the same include-path as curses.h,
+dnl but some packagers change this, breaking various applications.
+AC_DEFUN([CF_TERM_HEADER],[
+AC_CACHE_CHECK(for terminfo header, cf_cv_term_header,[
+case "${cf_cv_ncurses_header}" in
+(*/ncurses.h|*/ncursesw.h)
+	cf_term_header=`echo "$cf_cv_ncurses_header" | sed -e 's%ncurses[[^.]]*\.h$%term.h%'`
+	;;
+(*)
+	cf_term_header=term.h
+	;;
+esac
+
+for cf_test in $cf_term_header "ncurses/term.h" "ncursesw/term.h"
+do
+AC_TRY_COMPILE([#include <stdio.h>
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <$cf_test>
+],[int x = auto_left_margin; (void)x],[
+	cf_cv_term_header="$cf_test"],[
+	cf_cv_term_header=unknown
+	])
+	test "$cf_cv_term_header" != unknown && break
+done
+])
+
+# Set definitions to allow ifdef'ing to accommodate subdirectories
+
+case "$cf_cv_term_header" in
+(*term.h)
+	AC_DEFINE(HAVE_TERM_H,1,[Define to 1 if we have term.h])
+	;;
+esac
+
+case "$cf_cv_term_header" in
+(ncurses/term.h)
+	AC_DEFINE(HAVE_NCURSES_TERM_H,1,[Define to 1 if we have ncurses/term.h])
+	;;
+(ncursesw/term.h)
+	AC_DEFINE(HAVE_NCURSESW_TERM_H,1,[Define to 1 if we have ncursesw/term.h])
+	;;
+esac
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_TOP_BUILDDIR version: 2 updated: 2013/07/27 17:38:32
+dnl ---------------
+dnl Define a top_builddir symbol, for applications that need an absolute path.
+AC_DEFUN([CF_TOP_BUILDDIR],
+[
+top_builddir=ifelse($1,,`pwd`,$1)
+AC_SUBST(top_builddir)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_TRY_XOPEN_SOURCE version: 4 updated: 2022/09/10 15:16:16
+dnl -------------------
+dnl If _XOPEN_SOURCE is not defined in the compile environment, check if we
+dnl can define it successfully.
+AC_DEFUN([CF_TRY_XOPEN_SOURCE],[
+AC_CACHE_CHECK(if we should define _XOPEN_SOURCE,cf_cv_xopen_source,[
+	AC_TRY_COMPILE(CF__XOPEN_SOURCE_HEAD,CF__XOPEN_SOURCE_BODY,
+	[cf_cv_xopen_source=no],
+	[cf_save="$CPPFLAGS"
+	 CF_APPEND_TEXT(CPPFLAGS,-D_XOPEN_SOURCE=$cf_XOPEN_SOURCE)
+	 AC_TRY_COMPILE(CF__XOPEN_SOURCE_HEAD,CF__XOPEN_SOURCE_BODY,
+		[cf_cv_xopen_source=no],
+		[cf_cv_xopen_source=$cf_XOPEN_SOURCE])
+		CPPFLAGS="$cf_save"
+	])
+])
+
+if test "$cf_cv_xopen_source" != no ; then
+	CF_REMOVE_DEFINE(CFLAGS,$CFLAGS,_XOPEN_SOURCE)
+	CF_REMOVE_DEFINE(CPPFLAGS,$CPPFLAGS,_XOPEN_SOURCE)
+	cf_temp_xopen_source="-D_XOPEN_SOURCE=$cf_cv_xopen_source"
+	CF_APPEND_CFLAGS($cf_temp_xopen_source)
+fi
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_UPPER version: 5 updated: 2001/01/29 23:40:59
+dnl --------
+dnl Make an uppercase version of a variable
+dnl $1=uppercase($2)
+AC_DEFUN([CF_UPPER],
+[
+$1=`echo "$2" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_UTF8_LIB version: 9 updated: 2021/05/19 19:35:25
+dnl -----------
+dnl Check for multibyte support, and if not found, utf8 compatibility library
+AC_DEFUN([CF_UTF8_LIB],
+[
+AC_HAVE_HEADERS(wchar.h)
+AC_CACHE_CHECK(for multibyte character support,cf_cv_utf8_lib,[
+	cf_save_LIBS="$LIBS"
+	AC_TRY_LINK([
+#include <stdlib.h>
+#include <stdio.h>
+#ifdef HAVE_WCHAR_H
+#include <wchar.h>
+#endif
+],[putwc(0,0);],
+	[cf_cv_utf8_lib=yes],
+	[CF_FIND_LINKAGE([
+#include <libutf8.h>],[putwc(0,0);],utf8,
+		[cf_cv_utf8_lib=add-on],
+		[cf_cv_utf8_lib=no])
+])])
+
+# HAVE_LIBUTF8_H is used by ncurses if curses.h is shared between
+# ncurses/ncursesw:
+if test "$cf_cv_utf8_lib" = "add-on" ; then
+	AC_DEFINE(HAVE_LIBUTF8_H,1,[Define to 1 if we should include libutf8.h])
+	CF_ADD_INCDIR($cf_cv_header_path_utf8)
+	CF_ADD_LIBDIR($cf_cv_library_path_utf8)
+	CF_ADD_LIBS($cf_cv_library_file_utf8)
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_VERBOSE version: 3 updated: 2007/07/29 09:55:12
+dnl ----------
+dnl Use AC_VERBOSE w/o the warnings
+AC_DEFUN([CF_VERBOSE],
+[test -n "$verbose" && echo "	$1" 1>&AC_FD_MSG
+CF_MSG_LOG([$1])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WEAK_SYMBOLS version: 1 updated: 2008/08/16 19:18:06
+dnl ---------------
+dnl Check for compiler-support for weak symbols.
+dnl This works with "recent" gcc.
+AC_DEFUN([CF_WEAK_SYMBOLS],[
+AC_CACHE_CHECK(if $CC supports weak symbols,cf_cv_weak_symbols,[
+
+AC_TRY_COMPILE([
+#include <stdio.h>],
+[
+#if defined(__GNUC__)
+#  if defined __USE_ISOC99
+#    define _cat_pragma(exp)	_Pragma(#exp)
+#    define _weak_pragma(exp)	_cat_pragma(weak name)
+#  else
+#    define _weak_pragma(exp)
+#  endif
+#  define _declare(name)	__extension__ extern __typeof__(name) name
+#  define weak_symbol(name)	_weak_pragma(name) _declare(name) __attribute__((weak))
+#endif
+
+weak_symbol(fopen);
+],[cf_cv_weak_symbols=yes],[cf_cv_weak_symbols=no])
+])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_ADA_COMPILER version: 2 updated: 2010/06/26 17:35:58
+dnl --------------------
+dnl Command-line option to specify the Ada95 compiler.
+AC_DEFUN([CF_WITH_ADA_COMPILER],[
+AC_MSG_CHECKING(for ada-compiler)
+AC_ARG_WITH(ada-compiler,
+	[  --with-ada-compiler=CMD specify Ada95 compiler command (default gnatmake)],
+	[cf_ada_compiler=$withval],
+	[cf_ada_compiler=gnatmake])
+AC_SUBST(cf_ada_compiler)
+AC_MSG_RESULT($cf_ada_compiler)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_ADA_INCLUDE version: 2 updated: 2010/06/26 17:35:58
+dnl -------------------
+dnl Command-line option to specify where Ada includes will install.
+AC_DEFUN([CF_WITH_ADA_INCLUDE],[
+AC_MSG_CHECKING(for ada-include)
+CF_WITH_PATH(ada-include,
+   [  --with-ada-include=DIR  Ada includes are in DIR],
+   ADA_INCLUDE,
+   PREFIX/share/ada/adainclude,
+   [$]prefix/share/ada/adainclude)
+AC_SUBST(ADA_INCLUDE)
+AC_MSG_RESULT($ADA_INCLUDE)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_ADA_LIBNAME version: 1 updated: 2019/09/07 18:59:41
+dnl -------------------
+dnl CF_WITH_ADA_LIBNAME
+dnl -------------------
+dnl Command-line option to specify how to name the resulting Ada library.
+dnl $1 = default value
+AC_DEFUN([CF_WITH_ADA_LIBNAME],[
+AC_MSG_CHECKING(for ada-libname)
+AC_ARG_WITH(ada-libname,
+   [  --with-ada-libname=XXX  override default Ada library-name],
+   ADA_LIBNAME=[$]withval,
+   ADA_LIBNAME=$1)
+case "x$ADA_LIBNAME" in
+(x|xyes|xno)
+	ADA_LIBNAME=$1
+	;;
+esac
+AC_SUBST(ADA_LIBNAME)
+AC_MSG_RESULT($ADA_LIBNAME)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_ADA_OBJECTS version: 2 updated: 2010/06/26 17:35:58
+dnl -------------------
+dnl Command-line option to specify where Ada objects will install.
+AC_DEFUN([CF_WITH_ADA_OBJECTS],[
+AC_MSG_CHECKING(for ada-objects)
+CF_WITH_PATH(ada-objects,
+   [  --with-ada-objects=DIR  Ada objects are in DIR],
+   ADA_OBJECTS,
+   PREFIX/lib/ada/adalib,
+   [$]prefix/lib/ada/adalib)
+AC_SUBST(ADA_OBJECTS)
+AC_MSG_RESULT($ADA_OBJECTS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_ADA_SHAREDLIB version: 5 updated: 2018/07/21 19:10:35
+dnl ---------------------
+dnl Command-line option to specify if an Ada95 shared-library should be built,
+dnl and optionally what its soname should be.
+AC_DEFUN([CF_WITH_ADA_SHAREDLIB],[
+AC_REQUIRE([CF_GNAT_PROJECTS])
+AC_MSG_CHECKING(if an Ada95 shared-library should be built)
+AC_ARG_WITH(ada-sharedlib,
+	[  --with-ada-sharedlib=soname build shared-library (requires GNAT projects)],
+	[with_ada_sharedlib=$withval],
+	[with_ada_sharedlib=no])
+AC_MSG_RESULT($with_ada_sharedlib)
+
+if test "x$with_ada_sharedlib" != xno
+then
+	if test "x$cf_gnat_projects" != xyes
+	then
+		AC_MSG_WARN(disabling shared-library since GNAT projects are not supported)
+		with_ada_sharedlib=no
+	fi
+fi
+
+ADA_SHAREDLIB='lib$(LIB_NAME).so.1'
+MAKE_ADA_SHAREDLIB="#"
+
+if test "x$with_ada_sharedlib" != xno
+then
+	MAKE_ADA_SHAREDLIB=
+	if test "x$with_ada_sharedlib" != xyes
+	then
+		ADA_SHAREDLIB="$with_ada_sharedlib"
+	fi
+fi
+
+AC_SUBST(ADA_SHAREDLIB)
+AC_SUBST(MAKE_ADA_SHAREDLIB)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_CURSES_DIR version: 4 updated: 2021/01/02 19:22:58
+dnl ------------------
+dnl Wrapper for AC_ARG_WITH to specify directory under which to look for curses
+dnl libraries.
+AC_DEFUN([CF_WITH_CURSES_DIR],[
+
+AC_MSG_CHECKING(for specific curses-directory)
+AC_ARG_WITH(curses-dir,
+	[  --with-curses-dir=DIR   directory in which (n)curses is installed],
+	[cf_cv_curses_dir=$withval],
+	[cf_cv_curses_dir=no])
+AC_MSG_RESULT($cf_cv_curses_dir)
+
+if test -n "$cf_cv_curses_dir" && test "$cf_cv_curses_dir" != "no"
+then
+	CF_PATH_SYNTAX(withval)
+	if test -d "$cf_cv_curses_dir"
+	then
+		CF_ADD_INCDIR($cf_cv_curses_dir/include)
+		CF_ADD_LIBDIR($cf_cv_curses_dir/lib)
+	fi
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_LIB_PREFIX version: 2 updated: 2021/01/01 16:53:59
+dnl ------------------
+dnl Allow the library-prefix to be overridden.  OS/2 EMX originally had no
+dnl "lib" prefix, e.g., because it used the dll naming convention.
+dnl
+dnl $1 = variable to set
+AC_DEFUN([CF_WITH_LIB_PREFIX],
+[
+AC_MSG_CHECKING(if you want to have a library-prefix)
+AC_ARG_WITH(lib-prefix,
+	[  --with-lib-prefix       override library-prefix],
+	[with_lib_prefix=$withval],
+	[with_lib_prefix=auto])
+AC_MSG_RESULT($with_lib_prefix)
+
+if test "$with_lib_prefix" = auto
+then
+	CF_LIB_PREFIX($1)
+elif test "$with_lib_prefix" = no
+then
+	LIB_PREFIX=
+else
+	LIB_PREFIX=$with_lib_prefix
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_PATH version: 12 updated: 2021/09/04 06:35:04
+dnl ------------
+dnl Wrapper for AC_ARG_WITH to ensure that user supplies a pathname, not just
+dnl defaulting to yes/no.
+dnl
+dnl $1 = option name
+dnl $2 = help-text
+dnl $3 = environment variable to set
+dnl $4 = default value, shown in the help-message, must be a constant
+dnl $5 = default value, if it is an expression & cannot be in the help-message
+dnl
+AC_DEFUN([CF_WITH_PATH],
+[AC_ARG_WITH($1,[$2 ](default: ifelse([$4],,empty,[$4])),,
+ifelse([$4],,[withval="${$3}"],[withval="${$3:-ifelse([$5],,[$4],[$5])}"]))dnl
+if ifelse([$5],,true,[test -n "$5"]) ; then
+CF_PATH_SYNTAX(withval)
+fi
+eval $3="$withval"
+AC_SUBST($3)dnl
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_PKG_CONFIG_LIBDIR version: 20 updated: 2022/01/29 17:03:42
+dnl -------------------------
+dnl Allow the choice of the pkg-config library directory to be overridden.
+dnl
+dnl pkg-config uses a search-list built from these colon-separated lists of
+dnl directories:
+dnl a) $PKG_CONFIG_PATH (tested first, added if set)
+dnl b) $PKG_CONFIG_LIBDIR (tested second, added if set)
+dnl c) builtin-list (added if $PKG_CONFIG_LIBDIR is not set)
+dnl
+dnl pkgconf (used with some systems such as FreeBSD in place of pkg-config)
+dnl optionally ignores $PKG_CONFIG_LIBDIR.
+AC_DEFUN([CF_WITH_PKG_CONFIG_LIBDIR],[
+
+case "$PKG_CONFIG" in
+(no|none|yes)
+	AC_MSG_CHECKING(for pkg-config library directory)
+	;;
+(*)
+	AC_MSG_CHECKING(for $PKG_CONFIG library directory)
+	;;
+esac
+
+# if $PKG_CONFIG_LIBDIR is set, try to use that
+cf_search_path=`echo "$PKG_CONFIG_LIBDIR" | sed -e 's/:/ /g' -e 's,^[[ 	]]*,,'`
+
+# if the option is used, let that override.  otherwise default to "libdir"
+AC_ARG_WITH(pkg-config-libdir,
+	[  --with-pkg-config-libdir=XXX use given directory for installing pc-files],
+	[cf_search_path=$withval],
+	[test "x$PKG_CONFIG" != xnone && test -z "$cf_search_path" && cf_search_path=libdir])
+
+case "x$cf_search_path" in
+(xlibdir)
+	PKG_CONFIG_LIBDIR='${libdir}/pkgconfig'
+	AC_MSG_RESULT($PKG_CONFIG_LIBDIR)
+	cf_search_path=
+	;;
+(x)
+	;;
+(x/*\ *)
+	PKG_CONFIG_LIBDIR=
+	;;
+(x/*)
+	PKG_CONFIG_LIBDIR="$cf_search_path"
+	AC_MSG_RESULT($PKG_CONFIG_LIBDIR)
+	cf_search_path=
+	;;
+(xyes|xauto)
+	AC_MSG_RESULT(auto)
+	cf_search_path=
+	# Look for the library directory using the same prefix as the executable
+	AC_MSG_CHECKING(for search-list)
+	if test "x$PKG_CONFIG" != xnone
+	then
+		# works for pkg-config since version 0.24 (2009)
+		# works for pkgconf since version 0.8.3 (2012)
+		for cf_pkg_program in \
+			`echo "$PKG_CONFIG" | sed -e 's,^.*/,,'` \
+			pkg-config \
+			pkgconf
+		do
+			cf_search_path=`"$PKG_CONFIG" --variable=pc_path "$cf_pkg_program" 2>/dev/null | tr : ' '`
+			test -n "$cf_search_path" && break
+		done
+
+		# works for pkg-config since import in 2005 of original 2001 HP code.
+		test -z "$cf_search_path" && \
+		cf_search_path=`
+		"$PKG_CONFIG" --debug --exists no-such-package 2>&1 | $AWK "\
+/^Scanning directory (#[1-9][0-9]* )?'.*'$/{ \
+	sub(\"^[[^']]*'\",\"\"); \
+	sub(\"'.*\",\"\"); \
+	printf \" %s\", \\[$]0; } \
+{ next; } \
+"`
+	fi
+
+	AC_MSG_RESULT($cf_search_path)
+	;;
+(*)
+	AC_MSG_ERROR(Unexpected option value: $cf_search_path)
+	;;
+esac
+
+if test -n "$cf_search_path"
+then
+	AC_MSG_CHECKING(for first directory)
+	cf_pkg_config_path=none
+	for cf_config in $cf_search_path
+	do
+		if test -d "$cf_config"
+		then
+			cf_pkg_config_path=$cf_config
+			break
+		fi
+	done
+	AC_MSG_RESULT($cf_pkg_config_path)
+
+	if test "x$cf_pkg_config_path" != xnone ; then
+		# limit this to the first directory found
+		PKG_CONFIG_LIBDIR="$cf_pkg_config_path"
+	fi
+
+	if test -z "$PKG_CONFIG_LIBDIR" && test -n "$cf_search_path"
+	then
+		AC_MSG_CHECKING(for workaround)
+		if test "$prefix" = "NONE" ; then
+			cf_prefix="$ac_default_prefix"
+		else
+			cf_prefix="$prefix"
+		fi
+		eval cf_libdir=$libdir
+		cf_libdir=`echo "$cf_libdir" | sed -e "s,^NONE,$cf_prefix,"`
+		cf_backup=
+		for cf_config in $cf_search_path
+		do
+			case $cf_config in
+			$cf_libdir/pkgconfig)
+				PKG_CONFIG_LIBDIR=$cf_libdir/pkgconfig
+				break
+				;;
+			*)
+				test -z "$cf_backup" && cf_backup=$cf_config
+				;;
+			esac
+		done
+		test -z "$PKG_CONFIG_LIBDIR" && PKG_CONFIG_LIBDIR=$cf_backup
+		AC_MSG_RESULT($PKG_CONFIG_LIBDIR)
+	fi
+fi
+
+AC_SUBST(PKG_CONFIG_LIBDIR)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_PTHREAD version: 7 updated: 2015/04/18 08:56:57
+dnl ---------------
+dnl Check for POSIX thread library.
+AC_DEFUN([CF_WITH_PTHREAD],
+[
+AC_MSG_CHECKING(if you want to link with the pthread library)
+AC_ARG_WITH(pthread,
+	[  --with-pthread          use POSIX thread library],
+	[with_pthread=$withval],
+	[with_pthread=no])
+AC_MSG_RESULT($with_pthread)
+
+if test "$with_pthread" != no ; then
+	AC_CHECK_HEADER(pthread.h,[
+	AC_DEFINE(HAVE_PTHREADS_H,1,[Define to 1 if we have pthreads.h header])
+
+	for cf_lib_pthread in pthread c_r
+	do
+	    AC_MSG_CHECKING(if we can link with the $cf_lib_pthread library)
+	    cf_save_LIBS="$LIBS"
+	    CF_ADD_LIB($cf_lib_pthread)
+	    AC_TRY_LINK([
+#include <pthread.h>
+],[
+		int rc = pthread_create(0,0,0,0);
+		int r2 = pthread_mutexattr_settype(0, 0);
+],[with_pthread=yes],[with_pthread=no])
+	    LIBS="$cf_save_LIBS"
+	    AC_MSG_RESULT($with_pthread)
+	    test "$with_pthread" = yes && break
+	done
+
+	if test "$with_pthread" = yes ; then
+	    CF_ADD_LIB($cf_lib_pthread)
+	    AC_DEFINE(HAVE_LIBPTHREADS,1,[Define to 1 if we have pthreads library])
+	else
+	    AC_MSG_ERROR(Cannot link with pthread library)
+	fi
+	])
+fi
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_SYSTYPE version: 1 updated: 2013/01/26 16:26:12
+dnl ---------------
+dnl For testing, override the derived host system-type which is used to decide
+dnl things such as the linker commands used to build shared libraries.  This is
+dnl normally chosen automatically based on the type of system which you are
+dnl building on.  We use it for testing the configure script.
+dnl
+dnl This is different from the --host option: it is used only for testing parts
+dnl of the configure script which would not be reachable with --host since that
+dnl relies on the build environment being real, rather than mocked up.
+AC_DEFUN([CF_WITH_SYSTYPE],[
+CF_CHECK_CACHE([AC_CANONICAL_SYSTEM])
+AC_ARG_WITH(system-type,
+	[  --with-system-type=XXX  test: override derived host system-type],
+[AC_MSG_WARN(overriding system type to $withval)
+	cf_cv_system_name=$withval
+	host_os=$withval
+])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_XOPEN_SOURCE version: 62 updated: 2022/10/02 19:55:56
+dnl ---------------
+dnl Try to get _XOPEN_SOURCE defined properly that we can use POSIX functions,
+dnl or adapt to the vendor's definitions to get equivalent functionality,
+dnl without losing the common non-POSIX features.
+dnl
+dnl Parameters:
+dnl	$1 is the nominal value for _XOPEN_SOURCE
+dnl	$2 is the nominal value for _POSIX_C_SOURCE
+AC_DEFUN([CF_XOPEN_SOURCE],[
+AC_REQUIRE([AC_CANONICAL_HOST])
+AC_REQUIRE([CF_POSIX_VISIBLE])
+
+if test "$cf_cv_posix_visible" = no; then
+
+cf_XOPEN_SOURCE=ifelse([$1],,500,[$1])
+cf_POSIX_C_SOURCE=ifelse([$2],,199506L,[$2])
+cf_xopen_source=
+
+case "$host_os" in
+(aix[[4-7]]*)
+	cf_xopen_source="-D_ALL_SOURCE"
+	;;
+(msys)
+	cf_XOPEN_SOURCE=600
+	;;
+(darwin[[0-8]].*)
+	cf_xopen_source="-D_APPLE_C_SOURCE"
+	;;
+(darwin*)
+	cf_xopen_source="-D_DARWIN_C_SOURCE"
+	cf_XOPEN_SOURCE=
+	;;
+(freebsd*|dragonfly*|midnightbsd*)
+	# 5.x headers associate
+	#	_XOPEN_SOURCE=600 with _POSIX_C_SOURCE=200112L
+	#	_XOPEN_SOURCE=500 with _POSIX_C_SOURCE=199506L
+	cf_POSIX_C_SOURCE=200112L
+	cf_XOPEN_SOURCE=600
+	cf_xopen_source="-D_BSD_TYPES -D__BSD_VISIBLE -D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE -D_XOPEN_SOURCE=$cf_XOPEN_SOURCE"
+	;;
+(hpux11*)
+	cf_xopen_source="-D_HPUX_SOURCE -D_XOPEN_SOURCE=500"
+	;;
+(hpux*)
+	cf_xopen_source="-D_HPUX_SOURCE"
+	;;
+(irix[[56]].*)
+	cf_xopen_source="-D_SGI_SOURCE"
+	cf_XOPEN_SOURCE=
+	;;
+(linux*gnu|linux*gnuabi64|linux*gnuabin32|linux*gnueabi|linux*gnueabihf|linux*gnux32|uclinux*|gnu*|mint*|k*bsd*-gnu|cygwin)
+	CF_GNU_SOURCE($cf_XOPEN_SOURCE)
+	;;
+(minix*)
+	cf_xopen_source="-D_NETBSD_SOURCE" # POSIX.1-2001 features are ifdef'd with this...
+	;;
+(mirbsd*)
+	# setting _XOPEN_SOURCE or _POSIX_SOURCE breaks <sys/select.h> and other headers which use u_int / u_short types
+	cf_XOPEN_SOURCE=
+	CF_POSIX_C_SOURCE($cf_POSIX_C_SOURCE)
+	;;
+(netbsd*)
+	cf_xopen_source="-D_NETBSD_SOURCE" # setting _XOPEN_SOURCE breaks IPv6 for lynx on NetBSD 1.6, breaks xterm, is not needed for ncursesw
+	;;
+(openbsd[[6-9]]*)
+	# OpenBSD 6.x has broken locale support, both compile-time and runtime.
+	# see https://www.mail-archive.com/bugs@openbsd.org/msg13200.html
+	# Abusing the conformance level is a workaround.
+	AC_MSG_WARN(this system does not provide usable locale support)
+	cf_xopen_source="-D_BSD_SOURCE"
+	cf_XOPEN_SOURCE=700
+	;;
+(openbsd[[4-5]]*)
+	# setting _XOPEN_SOURCE lower than 500 breaks g++ compile with wchar.h, needed for ncursesw
+	cf_xopen_source="-D_BSD_SOURCE"
+	cf_XOPEN_SOURCE=600
+	;;
+(openbsd*)
+	# setting _XOPEN_SOURCE breaks xterm on OpenBSD 2.8, is not needed for ncursesw
+	;;
+(osf[[45]]*)
+	cf_xopen_source="-D_OSF_SOURCE"
+	;;
+(nto-qnx*)
+	cf_xopen_source="-D_QNX_SOURCE"
+	;;
+(sco*)
+	# setting _XOPEN_SOURCE breaks Lynx on SCO Unix / OpenServer
+	;;
+(solaris2.*)
+	cf_xopen_source="-D__EXTENSIONS__"
+	cf_cv_xopen_source=broken
+	;;
+(sysv4.2uw2.*) # Novell/SCO UnixWare 2.x (tested on 2.1.2)
+	cf_XOPEN_SOURCE=
+	cf_POSIX_C_SOURCE=
+	;;
+(*)
+	CF_TRY_XOPEN_SOURCE
+	cf_save_xopen_cppflags="$CPPFLAGS"
+	CF_POSIX_C_SOURCE($cf_POSIX_C_SOURCE)
+	# Some of these niche implementations use copy/paste, double-check...
+	CF_VERBOSE(checking if _POSIX_C_SOURCE inteferes)
+	AC_TRY_COMPILE(CF__XOPEN_SOURCE_HEAD,CF__XOPEN_SOURCE_BODY,,[
+		AC_MSG_WARN(_POSIX_C_SOURCE definition is not usable)
+		CPPFLAGS="$cf_save_xopen_cppflags"])
+	;;
+esac
+
+if test -n "$cf_xopen_source" ; then
+	CF_APPEND_CFLAGS($cf_xopen_source,true)
+fi
+
+dnl In anything but the default case, we may have system-specific setting
+dnl which is still not guaranteed to provide all of the entrypoints that
+dnl _XOPEN_SOURCE would yield.
+if test -n "$cf_XOPEN_SOURCE" && test -z "$cf_cv_xopen_source" ; then
+	AC_MSG_CHECKING(if _XOPEN_SOURCE really is set)
+	AC_TRY_COMPILE([#include <stdlib.h>],[
+#ifndef _XOPEN_SOURCE
+make an error
+#endif],
+	[cf_XOPEN_SOURCE_set=yes],
+	[cf_XOPEN_SOURCE_set=no])
+	AC_MSG_RESULT($cf_XOPEN_SOURCE_set)
+	if test "$cf_XOPEN_SOURCE_set" = yes
+	then
+		AC_TRY_COMPILE([#include <stdlib.h>],[
+#if (_XOPEN_SOURCE - 0) < $cf_XOPEN_SOURCE
+make an error
+#endif],
+		[cf_XOPEN_SOURCE_set_ok=yes],
+		[cf_XOPEN_SOURCE_set_ok=no])
+		if test "$cf_XOPEN_SOURCE_set_ok" = no
+		then
+			AC_MSG_WARN(_XOPEN_SOURCE is lower than requested)
+		fi
+	else
+		CF_TRY_XOPEN_SOURCE
+	fi
+fi
+fi # cf_cv_posix_visible
+])
+dnl ---------------------------------------------------------------------------
+dnl CF__SED_TRIMBLANKS version: 1 updated: 2021/01/02 09:31:20
+dnl ------------------
+dnl Trim something using sed, then trim extra whitespace
+dnl $1 = extra parameters, e.g., in CF_STRIP_G_OPT
+define([CF__SED_TRIMBLANKS],[sed ifelse($1,,,[$1] )-e 's%[[	]]% %g' -e 's% [[ ]]*% %g' -e 's%^ %%' -e 's% [$]%%'])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF__XOPEN_SOURCE_BODY version: 1 updated: 2022/09/10 15:17:35
+dnl ---------------------
+dnl body of test when test-compiling for _XOPEN_SOURCE check
+define([CF__XOPEN_SOURCE_BODY],
+[
+#ifndef _XOPEN_SOURCE
+make an error
+#endif
+])
+dnl ---------------------------------------------------------------------------
+dnl CF__XOPEN_SOURCE_HEAD version: 1 updated: 2022/09/10 15:17:03
+dnl ---------------------
+dnl headers to include when test-compiling for _XOPEN_SOURCE check
+define([CF__XOPEN_SOURCE_HEAD],
+[
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+])
diff --git a/Ada95/configure b/Ada95/configure
new file mode 100755
index 0000000..5dece4c
--- /dev/null
+++ b/Ada95/configure
@@ -0,0 +1,19445 @@
+#! /bin/sh
+# From configure.in Revision: 1.88 .
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by Autoconf 2.52.20221202.
+#
+# Copyright 2003-2021,2022	Thomas E. Dickey
+# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
+# Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g"
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+
+# Name of the executable.
+as_me=`echo "$0" |sed 's,.*[\\/],,'`
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr="expr"
+else
+  as_expr="false"
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s='ln'
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+as_executable_p="test -f"
+
+# Support unset when possible.
+if (FOO=FOO; unset FOO) >/dev/null 2>&1; then
+  as_unset="unset"
+else
+  as_unset="false"
+fi
+
+# NLS nuisances.
+$as_unset LANG || test "${LANG+set}" != set || { LANG=C; export LANG; }
+$as_unset LC_ALL || test "${LC_ALL+set}" != set || { LC_ALL=C; export LC_ALL; }
+$as_unset LC_TIME || test "${LC_TIME+set}" != set || { LC_TIME=C; export LC_TIME; }
+$as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set || { LC_CTYPE=C; export LC_CTYPE; }
+$as_unset LANGUAGE || test "${LANGUAGE+set}" != set || { LANGUAGE=C; export LANGUAGE; }
+$as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set || { LC_COLLATE=C; export LC_COLLATE; }
+$as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set || { LC_NUMERIC=C; export LC_NUMERIC; }
+$as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set || { LC_MESSAGES=C; export LC_MESSAGES; }
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" 	$as_nl"
+
+# CDPATH.
+$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=:; export CDPATH; }
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+exec 6>&1
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Maximum number of lines to put in a shell here document.
+# This variable seems obsolete.  It should probably be removed, and
+# only ac_max_sed_lines should be used.
+: "${ac_max_here_lines=38}"
+
+ac_unique_file="gen/gen.c"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#if HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#if STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# if HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif
+#if HAVE_STRING_H
+# if !STDC_HEADERS && HAVE_MEMORY_H
+#  include <memory.h>
+# endif
+# include <string.h>
+#endif
+#if HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#else
+# if HAVE_STDINT_H
+#  include <stdint.h>
+# endif
+#endif
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+runstatedir='${localstatedir}/run'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${datarootdir}/info'
+mandir='${datarootdir}/man'
+
+# Identity of this package.
+PACKAGE_NAME=
+PACKAGE_TARNAME=
+PACKAGE_VERSION=
+PACKAGE_STRING=
+PACKAGE_BUGREPORT=
+
+ac_prev=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval "$ac_prev=\$ac_option"
+    ac_prev=
+    continue
+  fi
+
+  ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case "$ac_option" in
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+  | --da=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo "$ac_feature" | sed 's/-/_/g'`
+    eval "enable_$ac_feature=no" ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo "$ac_feature" | sed 's/-/_/g'`
+    case "$ac_option" in
+      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "enable_$ac_feature='$ac_optarg'" ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst \
+  | --locals | --local | --loca | --loc | --lo)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+    localstatedir=$ac_optarg ;;
+
+  -runstatedir | --runstatedir | --runstatedi | --runstated \
+  | --runstate | --runstat | --runsta | --runst \
+  | --runs | --run | --ru)
+    ac_prev=runstatedir ;;
+  -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
+  | --runstate=* | --runstat=* | --runsta=* | --runst=* \
+  | --runs=* | --run=* | --ru=*)
+    runstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo "$ac_package" | sed 's/-/_/g'`
+    case "$ac_option" in
+      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "with_$ac_package='$ac_optarg'" ;;
+
+  -without-* | --without-*)
+    ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo "$ac_package" | sed 's/-/_/g'`
+    eval "with_$ac_package=no" ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; }
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+   { (exit 1); exit 1; }; }
+    ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
+    eval "$ac_envvar='$ac_optarg'"
+    export "$ac_envvar" ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : "${build_alias=$ac_option}" "${host_alias=$ac_option}" "${target_alias=$ac_option}"
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo "$ac_prev" | sed 's/_/-/g'`
+  { echo "$as_me: error: missing argument to $ac_option" >&2
+   { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute paths.
+for ac_var in exec_prefix prefix
+do
+  eval ac_val=$`echo "$ac_var"`
+  case "$ac_val" in
+    [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
+    *)  { echo "$as_me: error: expected an absolute path for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# Be sure to have absolute paths.
+for ac_var in bindir sbindir libexecdir datarootdir datadir sysconfdir sharedstatedir \
+              localstatedir libdir includedir oldincludedir infodir mandir
+do
+  eval ac_val=$`echo "$ac_var"`
+  case "$ac_val" in
+    [\\/$]* | ?:[\\/]* ) ;;
+    *)  { echo "$as_me: error: expected an absolute path for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: should be removed in autoconf 3.0.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used." >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then its parent.
+  ac_prog=$0
+  ac_confdir=`echo "$ac_prog" | sed 's%[\\/][^\\/][^\\/]*$%%'`
+  test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  if test "$ac_srcdir_defaulted" = yes; then
+    { echo "$as_me: error: cannot find sources in $ac_confdir or .." >&2
+   { (exit 1); exit 1; }; }
+  else
+    { echo "$as_me: error: cannot find sources in $srcdir" >&2
+   { (exit 1); exit 1; }; }
+  fi
+fi
+srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
+ac_env_build_alias_set=${build_alias+set}
+ac_env_build_alias_value=$build_alias
+ac_cv_env_build_alias_set=${build_alias+set}
+ac_cv_env_build_alias_value=$build_alias
+ac_env_host_alias_set=${host_alias+set}
+ac_env_host_alias_value=$host_alias
+ac_cv_env_host_alias_set=${host_alias+set}
+ac_cv_env_host_alias_value=$host_alias
+ac_env_target_alias_set=${target_alias+set}
+ac_env_target_alias_value=$target_alias
+ac_cv_env_target_alias_set=${target_alias+set}
+ac_cv_env_target_alias_value=$target_alias
+ac_env_CC_set=${CC+set}
+ac_env_CC_value=$CC
+ac_cv_env_CC_set=${CC+set}
+ac_cv_env_CC_value=$CC
+ac_env_CFLAGS_set=${CFLAGS+set}
+ac_env_CFLAGS_value=$CFLAGS
+ac_cv_env_CFLAGS_set=${CFLAGS+set}
+ac_cv_env_CFLAGS_value=$CFLAGS
+ac_env_LDFLAGS_set=${LDFLAGS+set}
+ac_env_LDFLAGS_value=$LDFLAGS
+ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
+ac_cv_env_LDFLAGS_value=$LDFLAGS
+ac_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_env_CPPFLAGS_value=$CPPFLAGS
+ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_cv_env_CPPFLAGS_value=$CPPFLAGS
+ac_env_CPP_set=${CPP+set}
+ac_env_CPP_value=$CPP
+ac_cv_env_CPP_set=${CPP+set}
+ac_cv_env_CPP_value=$CPP
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<EOF
+\`configure' configures this package to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+EOF
+
+  cat <<EOF
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR            user executables [EPREFIX/bin]
+  --sbindir=DIR           system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR        program executables [EPREFIX/libexec]
+  --datarootdir=DIR       read-only architecture-independent data [PREFIX/share]
+  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
+  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --runstatedir=DIR       extra definition of runtime data [LOCALSTATEDIR/run]
+  --libdir=DIR            object code libraries [EPREFIX/lib]
+  --includedir=DIR        C header files [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
+  --infodir=DIR           info documentation [DATAROOTDIR/info]
+  --mandir=DIR            man documentation [DATAROOTDIR/man]
+EOF
+
+  cat <<\EOF
+
+Program names:
+  --program-prefix=PREFIX            prepend PREFIX to installed program names
+  --program-suffix=SUFFIX            append SUFFIX to installed program names
+  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
+
+System types:
+  --build=BUILD           configure for building on BUILD [guessed]
+  --host=HOST       build programs to run on HOST [BUILD]
+  --target=TARGET   configure for building compilers for TARGET [HOST]
+EOF
+fi
+
+if test -n "$ac_init_help"; then
+
+  cat <<\EOF
+
+Optional Packages:
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+
+Optional Features:
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+
+General Options:
+  --with-system-type=XXX  test: override derived host system-type
+  --disable-stripping     do not strip (debug info) installed executables
+  --with-pkg-config{=path} enable/disable use of pkg-config
+  --with-pkg-config-libdir=XXX use given directory for installing pc-files
+  --without-tests         suppress build with test-programs
+  --enable-mixed-case     tic should assume mixed-case filenames
+  --with-install-prefix   prefixes actual install-location ($DESTDIR)
+Build-Tools Needed to Compile Temporary Applications for Cross-compiling:
+  --with-build-cc=XXX     the build C compiler ($BUILD_CC)
+  --with-build-cpp=XXX    the build C preprocessor ($BUILD_CPP)
+  --with-build-cflags=XXX the build C compiler-flags ($BUILD_CFLAGS)
+  --with-build-cppflags=XXX the build C preprocessor-flags ($BUILD_CPPFLAGS)
+  --with-build-ldflags=XXX the build linker-flags ($BUILD_LDFLAGS)
+  --with-build-libs=XXX   the build libraries (${BUILD_LIBS})
+Options to Specify the Libraries Built/Used:
+  --with-shared           generate shared C-objects (needed for --with-ada-sharedlib)
+  --with-curses-dir=DIR   directory in which (n)curses is installed
+  --enable-widec          compile with wide-char/UTF-8 code
+  --with-lib-prefix       override library-prefix
+  --with-shlib-version=X  Specify rel or abi version for shared libs
+  --enable-rpath-link     link sample programs with rpath option
+Fine-Tuning Your Configuration:
+  --enable-broken_linker  compile with broken-linker support code
+  --disable-largefile     omit support for large files
+  --with-rcs-ids          compile-in RCS identifiers
+Extensions:
+  --disable-ext-funcs     disable function-extensions
+  --enable-const          compile with extra/non-standard const
+Development Code:
+  --without-develop       disable development options
+Experimental Code:
+  --with-pthread          use POSIX thread library
+  --enable-weak-symbols   enable weak-symbols for pthreads
+  --enable-reentrant      compile with experimental reentrant code
+  --with-wrap-prefix=XXX  override prefix used for public variables
+Testing/development Options:
+  --disable-echo          do not display "compiling" commands
+  --enable-warnings       test: turn on gcc compiler warnings
+  --enable-stdnoreturn    enable C11 _Noreturn feature for diagnostics
+  --enable-assertions     test: turn on generation of assertion code
+  --enable-expanded       test: generate functions for certain macros
+  --disable-macros        test: use functions rather than macros
+  --with-trace            test: add trace() function to all models of ncurses
+  --disable-gnat-projects test: disable GNAT projects even if usable
+Ada95 Binding Options:
+  --with-ada-compiler=CMD specify Ada95 compiler command (default gnatmake)
+  --with-ada-include=DIR  Ada includes are in DIR (default: PREFIX/share/ada/adainclude)
+  --with-ada-objects=DIR  Ada objects are in DIR (default: PREFIX/lib/ada/adalib)
+  --with-ada-sharedlib=soname build shared-library (requires GNAT projects)
+  --with-ada-libname=XXX  override default Ada library-name
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  CPPFLAGS    C/C++ preprocessor flags, e.g. -I<include dir> if you have
+              headers in a nonstandard directory <include dir>
+  CPP         C preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+EOF
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  ac_popdir=`pwd`
+  for ac_subdir in : $ac_subdirs_all; do test "x$ac_subdir" = x: && continue
+    cd "$ac_subdir"
+    # A "../" for each directory in /$ac_subdir.
+    ac_dots=`echo "$ac_subdir" |
+             sed 's,^\./,,;s,[^/]$,&/,;s,[^/]*/,../,g'`
+
+    case "$srcdir" in
+    .) # No --srcdir option.  We are building in place.
+      ac_sub_srcdir="$srcdir" ;;
+    [\\/]* | ?:[\\/]* ) # Absolute path.
+      ac_sub_srcdir="$srcdir/$ac_subdir" ;;
+    *) # Relative path.
+      ac_sub_srcdir="$ac_dots$srcdir/$ac_subdir" ;;
+    esac
+
+    # Check for guested configure; otherwise get Cygnus style configure.
+    if test -f "$ac_sub_srcdir/configure.gnu"; then
+      echo
+      $SHELL "$ac_sub_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_sub_srcdir/configure"; then
+      echo
+      $SHELL "$ac_sub_srcdir/configure" --help=recursive
+    elif test -f "$ac_sub_srcdir/configure.ac" ||
+           test -f "$ac_sub_srcdir/configure.in"; then
+      echo
+      "$ac_configure" --help
+    else
+      echo "$as_me: WARNING: no configuration information is in $ac_subdir" >&2
+    fi
+    cd "$ac_popdir"
+  done
+fi
+
+test -n "$ac_init_help" && exit 0
+if "$ac_init_version"; then
+  cat <<\EOF
+
+Copyright 2003-2021,2022	Thomas E. Dickey
+Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+EOF
+  exit 0
+fi
+exec 5>config.log
+cat >&5 <<EOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by $as_me, which was
+generated by GNU Autoconf 2.52.20221202.  Invocation command line was
+
+  $ $0 $@
+
+EOF
+{
+cat <<_ASUNAME
+## ---------- ##
+## Platform.  ##
+## ---------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+hostinfo               = `(hostinfo) 2>/dev/null               || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+PATH = $PATH
+
+_ASUNAME
+} >&5
+
+cat >&5 <<EOF
+## ------------ ##
+## Core tests.  ##
+## ------------ ##
+
+EOF
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell meta-characters.
+ac_configure_args=
+ac_sep=
+for ac_arg
+do
+  case "$ac_arg" in
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c) ;;
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+  *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+    ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"`
+    ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
+    ac_sep=" " ;;
+  *) ac_configure_args="$ac_configure_args$ac_sep$ac_arg"
+     ac_sep=" " ;;
+  esac
+  # Get rid of the leading space.
+done
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  echo >&5
+  echo "## ----------------- ##" >&5
+  echo "## Cache variables.  ##" >&5
+  echo "## ----------------- ##" >&5
+  echo >&5
+  # The following way of writing the cache mishandles newlines in values,
+{
+  (set) 2>&1 |
+    case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
+    *ac_space=\ *)
+      sed -n \
+        "s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
+    	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
+      ;;
+    *)
+      sed -n \
+        "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      ;;
+    esac;
+} >&5
+  sed "/^$/d" confdefs.h >conftest.log
+  if test -s conftest.log; then
+    echo >&5
+    echo "## ------------ ##" >&5
+    echo "## confdefs.h.  ##" >&5
+    echo "## ------------ ##" >&5
+    echo >&5
+    cat conftest.log >&5
+  fi
+  (echo; echo) >&5
+  test "$ac_signal" != 0 &&
+    echo "$as_me: caught signal $ac_signal" >&5
+  echo "$as_me: exit $exit_status" >&5
+  rm -rf conftest* confdefs* core core.* *.core conf$$* $ac_clean_files &&
+    exit $exit_status
+     ' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' "$ac_signal"
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo >confdefs.h
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+  if test "x$prefix" != xNONE; then
+    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+  else
+    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+  fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+  if test -r "$ac_site_file"; then
+    { echo "$as_me:949: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+    cat "$ac_site_file" >&5
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special
+  # files actually), so we avoid doing that.
+  if test -f "$cache_file"; then
+    { echo "$as_me:960: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . $cache_file;;
+      *)                      . ./$cache_file;;
+    esac
+  fi
+else
+  { echo "$as_me:968: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in `(set) 2>&1 |
+               sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val="\$ac_cv_env_${ac_var}_value"
+  eval ac_new_val="\$ac_env_${ac_var}_value"
+  case "$ac_old_set,$ac_new_set" in
+    set,)
+      { echo "$as_me:984: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { echo "$as_me:988: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+        { echo "$as_me:994: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+        { echo "$as_me:996:   former value:  $ac_old_val" >&5
+echo "$as_me:   former value:  $ac_old_val" >&2;}
+        { echo "$as_me:998:   current value: $ac_new_val" >&5
+echo "$as_me:   current value: $ac_new_val" >&2;}
+        ac_cache_corrupted=:
+      fi;;
+  esac
+  # Pass precious variables to config.status.  It doesn't matter if
+  # we pass some twice (in addition to the command line arguments).
+  if test "$ac_new_set" = set; then
+    case "$ac_new_val" in
+    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+      ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"`
+      ac_configure_args="$ac_configure_args '$ac_arg'"
+      ;;
+    *) ac_configure_args="$ac_configure_args $ac_var=$ac_new_val"
+       ;;
+    esac
+  fi
+done
+if "$ac_cache_corrupted"; then
+  { echo "$as_me:1017: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  { { echo "$as_me:1019: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
+ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_main_return="return"
+
+case `echo "testing\c" 2>/dev/null; echo 1,2,3`,`echo -n testing 2>/dev/null; echo 1,2,3` in
+  *c*,-n*) ECHO_N=
+           ECHO_C=      # newlines do not sed ;-) only broken shells would use this case anyway
+           ECHO_T='	'
+           ;;
+  *c*,*  ) ECHO_N=-n
+           ECHO_C=
+           ECHO_T=
+           ;;
+  *)       ECHO_N=
+           ECHO_C='\c'
+           ECHO_T=
+           ;;
+esac
+echo "#! $SHELL" >conftest.sh
+echo  "exit 0"   >>conftest.sh
+chmod +x conftest.sh
+if { (echo "$as_me:1048: PATH=\".;.\"; conftest.sh") >&5
+  (PATH=".;."; conftest.sh) 2>&5
+  ac_status=$?
+  echo "$as_me:1051: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; then
+  ac_path_separator=';'
+else
+  ac_path_separator=:
+fi
+PATH_SEPARATOR="$ac_path_separator"
+rm -f conftest.sh
+
+ac_config_headers="$ac_config_headers include/ncurses_cfg.h:include/ncurses_cfg.hin"
+
+PACKAGE="AdaCurses"
+
+top_builddir=`pwd`
+
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+  if test -f "$ac_dir/install-sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f "$ac_dir/install.sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f "$ac_dir/shtool"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  { { echo "$as_me:1083: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5
+echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"
+ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
+
+# Make sure we can run config.sub.
+$ac_config_sub sun4 >/dev/null 2>&1 ||
+  { { echo "$as_me:1093: error: cannot run $ac_config_sub" >&5
+echo "$as_me: error: cannot run $ac_config_sub" >&2;}
+   { (exit 1); exit 1; }; }
+
+echo "$as_me:1097: checking build system type" >&5
+echo $ECHO_N "checking build system type... $ECHO_C" >&6
+if test "${ac_cv_build+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_build_alias=$build_alias
+test -z "$ac_cv_build_alias" &&
+  ac_cv_build_alias=`$ac_config_guess`
+test -z "$ac_cv_build_alias" &&
+  { { echo "$as_me:1106: error: cannot guess build type; you must specify one" >&5
+echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
+   { (exit 1); exit 1; }; }
+ac_cv_build=`$ac_config_sub "$ac_cv_build_alias"` ||
+  { { echo "$as_me:1110: error: $ac_config_sub $ac_cv_build_alias failed." >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed." >&2;}
+   { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:1115: result: $ac_cv_build" >&5
+echo "${ECHO_T}$ac_cv_build" >&6
+build=$ac_cv_build
+build_cpu=`echo "$ac_cv_build" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo "$ac_cv_build" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo "$ac_cv_build" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+echo "$as_me:1122: checking host system type" >&5
+echo $ECHO_N "checking host system type... $ECHO_C" >&6
+if test "${ac_cv_host+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_host_alias=$host_alias
+test -z "$ac_cv_host_alias" &&
+  ac_cv_host_alias=$ac_cv_build_alias
+ac_cv_host=`$ac_config_sub "$ac_cv_host_alias"` ||
+  { { echo "$as_me:1131: error: $ac_config_sub $ac_cv_host_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;}
+   { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:1136: result: $ac_cv_host" >&5
+echo "${ECHO_T}$ac_cv_host" >&6
+host=$ac_cv_host
+host_cpu=`echo "$ac_cv_host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo "$ac_cv_host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo "$ac_cv_host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+if test -f "$srcdir/config.guess" || test -f "$ac_aux_dir/config.guess" ; then
+	echo "$as_me:1144: checking target system type" >&5
+echo $ECHO_N "checking target system type... $ECHO_C" >&6
+if test "${ac_cv_target+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_target_alias=$target_alias
+test "x$ac_cv_target_alias" = "x" &&
+  ac_cv_target_alias=$ac_cv_host_alias
+ac_cv_target=`$ac_config_sub "$ac_cv_target_alias"` ||
+  { { echo "$as_me:1153: error: $ac_config_sub $ac_cv_target_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_target_alias failed" >&2;}
+   { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:1158: result: $ac_cv_target" >&5
+echo "${ECHO_T}$ac_cv_target" >&6
+target=$ac_cv_target
+target_cpu=`echo "$ac_cv_target" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+target_vendor=`echo "$ac_cv_target" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+target_os=`echo "$ac_cv_target" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+test -n "$target_alias" &&
+  test "$program_prefix$program_suffix$program_transform_name" = \
+    NONENONEs,x,x, &&
+  program_prefix=${target_alias}-
+	system_name="$host_os"
+else
+	system_name="`(uname -s -r) 2>/dev/null`"
+	if test -z "$system_name" ; then
+		system_name="`(hostname) 2>/dev/null`"
+	fi
+fi
+test -n "$system_name" &&
+cat >>confdefs.h <<EOF
+#define SYSTEM_NAME "$system_name"
+EOF
+
+if test "${cf_cv_system_name+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cf_cv_system_name="$system_name"
+fi
+
+test -z "$system_name" && system_name="$cf_cv_system_name"
+test -n "$cf_cv_system_name" && echo "$as_me:1190: result: Configuring for $cf_cv_system_name" >&5
+echo "${ECHO_T}Configuring for $cf_cv_system_name" >&6
+
+if test ".$system_name" != ".$cf_cv_system_name" ; then
+	echo "$as_me:1194: result: Cached system name ($system_name) does not agree with actual ($cf_cv_system_name)" >&5
+echo "${ECHO_T}Cached system name ($system_name) does not agree with actual ($cf_cv_system_name)" >&6
+	{ { echo "$as_me:1196: error: \"Please remove config.cache and try again.\"" >&5
+echo "$as_me: error: \"Please remove config.cache and try again.\"" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+# Check whether --with-system-type or --without-system-type was given.
+if test "${with_system_type+set}" = set; then
+  withval="$with_system_type"
+  { echo "$as_me:1204: WARNING: overriding system type to $withval" >&5
+echo "$as_me: WARNING: overriding system type to $withval" >&2;}
+	cf_cv_system_name=$withval
+	host_os=$withval
+
+fi;
+
+###	Save the given $CFLAGS to allow user-override.
+cf_user_CFLAGS="$CFLAGS"
+
+###	Default install-location
+for ac_prog in ggrep grep
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:1219: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_GREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$GREP"; then
+  ac_cv_prog_GREP="$GREP" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_GREP="$ac_prog"
+echo "$as_me:1234: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+GREP=$ac_cv_prog_GREP
+if test -n "$GREP"; then
+  echo "$as_me:1242: result: $GREP" >&5
+echo "${ECHO_T}$GREP" >&6
+else
+  echo "$as_me:1245: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$GREP" && break
+done
+test -n "$GREP" || GREP=": "
+
+echo "$as_me:1253: checking for fgrep" >&5
+echo $ECHO_N "checking for fgrep... $ECHO_C" >&6
+if test "${ac_cv_path_FGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
+   then ac_cv_path_FGREP="$GREP -F"
+   else
+     for ac_prog in gfgrep fgrep
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:1265: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_FGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $FGREP in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_FGREP="$FGREP" # Let the user override the test with a path.
+  ;;
+  *)
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  if $as_executable_p "$ac_dir/$ac_word"; then
+   ac_cv_path_FGREP="$ac_dir/$ac_word"
+   echo "$as_me:1282: found $ac_dir/$ac_word" >&5
+   break
+fi
+done
+
+  ;;
+esac
+fi
+FGREP=$ac_cv_path_FGREP
+
+if test -n "$FGREP"; then
+  echo "$as_me:1293: result: $FGREP" >&5
+echo "${ECHO_T}$FGREP" >&6
+else
+  echo "$as_me:1296: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$FGREP" && break
+done
+test -n "$FGREP" || FGREP=": "
+
+     test "x$ac_cv_path_FGREP" = "x:" && { { echo "$as_me:1304: error: cannot find workable fgrep" >&5
+echo "$as_me: error: cannot find workable fgrep" >&2;}
+   { (exit 1); exit 1; }; }
+   fi
+fi
+echo "$as_me:1309: result: $ac_cv_path_FGREP" >&5
+echo "${ECHO_T}$ac_cv_path_FGREP" >&6
+ FGREP="$ac_cv_path_FGREP"
+
+echo "$as_me:1313: checking for prefix" >&5
+echo $ECHO_N "checking for prefix... $ECHO_C" >&6
+if test "x$prefix" = "xNONE" ; then
+	case "$cf_cv_system_name" in
+		# non-vendor systems don't have a conflict
+	(openbsd*|freebsd*|mirbsd*|linux*|cygwin*|msys*|k*bsd*-gnu|mingw*)
+		prefix=/usr
+		;;
+	(*)	prefix=$ac_default_prefix
+		;;
+	esac
+fi
+echo "$as_me:1325: result: $prefix" >&5
+echo "${ECHO_T}$prefix" >&6
+
+if test "x$prefix" = "xNONE" ; then
+echo "$as_me:1329: checking for default include-directory" >&5
+echo $ECHO_N "checking for default include-directory... $ECHO_C" >&6
+test -n "$verbose" && echo 1>&6
+for cf_symbol in \
+	"$includedir" \
+	"$includedir/ncurses" \
+	"$prefix/include" \
+	"$prefix/include/ncurses" \
+	/usr/local/include \
+	/usr/local/include/ncurses \
+	/usr/include \
+	/usr/include/ncurses
+do
+	cf_dir=`eval echo "$cf_symbol"`
+	if test -f "$cf_dir/curses.h" ; then
+	if ( ${FGREP-fgrep} NCURSES_VERSION "$cf_dir/curses.h" >/dev/null 2>&1 ) ; then
+		includedir="$cf_symbol"
+		test -n "$verbose"  && echo $ECHO_N "	found " 1>&6
+		break
+	fi
+	fi
+	test -n "$verbose"  && echo "	tested $cf_dir" 1>&6
+done
+echo "$as_me:1352: result: $includedir" >&5
+echo "${ECHO_T}$includedir" >&6
+fi
+
+###	Checks for programs.
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
+ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_main_return="return"
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in gnatgcc gcc cc
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:1369: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+echo "$as_me:1384: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:1392: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:1395: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in gnatgcc gcc cc
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:1408: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ac_ct_CC="$ac_prog"
+echo "$as_me:1423: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:1431: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:1434: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$ac_ct_CC" && break
+done
+
+  CC=$ac_ct_CC
+fi
+
+test -z "$CC" && { { echo "$as_me:1444: error: no acceptable cc found in \$PATH" >&5
+echo "$as_me: error: no acceptable cc found in \$PATH" >&2;}
+   { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:1449:" \
+     "checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo "$2"`
+{ (eval echo "$as_me:1452: \"$ac_compiler --version </dev/null >&5\"") >&5
+  (eval $ac_compiler --version </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:1455: \$? = $ac_status" >&5
+  (exit "$ac_status"); }
+{ (eval echo "$as_me:1457: \"$ac_compiler -v </dev/null >&5\"") >&5
+  (eval $ac_compiler -v </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:1460: \$? = $ac_status" >&5
+  (exit "$ac_status"); }
+{ (eval echo "$as_me:1462: \"$ac_compiler -V </dev/null >&5\"") >&5
+  (eval $ac_compiler -V </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:1465: \$? = $ac_status" >&5
+  (exit "$ac_status"); }
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 1469 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+echo "$as_me:1485: checking for C compiler default output" >&5
+echo $ECHO_N "checking for C compiler default output... $ECHO_C" >&6
+ac_link_default=`echo "$ac_link" | sed 's/ -o *"conftest[^"]*"//'`
+if { (eval echo "$as_me:1488: \"$ac_link_default\"") >&5
+  (eval $ac_link_default) 2>&5
+  ac_status=$?
+  echo "$as_me:1491: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; then
+  # Find the output, starting from the most likely.  This scheme is
+# not robust to junk in `.', hence go to wildcards (a.*) only as a last
+# resort.
+for ac_file in `ls a.exe conftest.exe 2>/dev/null;
+                ls a.out conftest 2>/dev/null;
+                ls a.* conftest.* 2>/dev/null`; do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.dbg | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+    a.out ) # We found the default executable, but exeext='' is most
+            # certainly right.
+            break;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+          # FIXME: I believe we export ac_cv_exeext for Libtool --akim.
+          export ac_cv_exeext
+          break;;
+    * ) break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+{ { echo "$as_me:1514: error: C compiler cannot create executables" >&5
+echo "$as_me: error: C compiler cannot create executables" >&2;}
+   { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+echo "$as_me:1520: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6
+
+# Check the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:1525: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+  if { ac_try='./$ac_file'
+  { (eval echo "$as_me:1531: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:1534: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+	cross_compiling=yes
+    else
+	{ { echo "$as_me:1541: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'." >&5
+echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'." >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+  fi
+fi
+echo "$as_me:1549: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+rm -f a.out a.exe "conftest$ac_cv_exeext"
+ac_clean_files=$ac_clean_files_save
+# Check the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:1556: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
+echo "$as_me:1558: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6
+
+echo "$as_me:1561: checking for executable suffix" >&5
+echo $ECHO_N "checking for executable suffix... $ECHO_C" >&6
+if { (eval echo "$as_me:1563: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:1566: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; then
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in `(ls conftest.exe; ls conftest; ls conftest.*) 2>/dev/null`; do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.dbg | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+          export ac_cv_exeext
+          break;;
+    * ) break;;
+  esac
+done
+else
+  { { echo "$as_me:1582: error: cannot compute EXEEXT: cannot compile and link" >&5
+echo "$as_me: error: cannot compute EXEEXT: cannot compile and link" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f "conftest$ac_cv_exeext"
+echo "$as_me:1588: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6
+
+rm -f "conftest.$ac_ext"
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+echo "$as_me:1594: checking for object suffix" >&5
+echo $ECHO_N "checking for object suffix... $ECHO_C" >&6
+if test "${ac_cv_objext+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 1600 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (eval echo "$as_me:1612: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:1615: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; then
+  for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.dbg | *.pdb | *.xSYM | *.map | *.inf ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+{ { echo "$as_me:1627: error: cannot compute OBJEXT: cannot compile" >&5
+echo "$as_me: error: cannot compute OBJEXT: cannot compile" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f "conftest.$ac_cv_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:1634: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+echo "$as_me:1638: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 1644 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:1659: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:1662: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:1665: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:1668: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_compiler_gnu=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:1680: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+CFLAGS="-g"
+echo "$as_me:1686: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 1692 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:1704: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:1707: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:1710: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:1713: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_prog_cc_g=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:1723: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+# Some people use a C++ compiler to compile C.  Since we use `exit',
+# in C++ we need to declare it.  In case someone uses the same compiler
+# for both compiling C and C++ we need to have the C++ compiler decide
+# the declaration of exit, since it's the most demanding environment.
+cat >"conftest.$ac_ext" <<_ACEOF
+#ifndef __cplusplus
+  choke me
+#endif
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:1750: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:1753: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:1756: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:1759: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  for ac_declaration in \
+   ''\
+   '#include <stdlib.h>' \
+   'extern "C" void std::exit (int) throw (); using std::exit;' \
+   'extern "C" void std::exit (int); using std::exit;' \
+   'extern "C" void exit (int) throw ();' \
+   'extern "C" void exit (int);' \
+   'void exit (int);'
+do
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 1771 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+$ac_declaration
+int
+main (void)
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:1784: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:1787: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:1790: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:1793: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+continue
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 1803 "configure"
+#include "confdefs.h"
+$ac_declaration
+int
+main (void)
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:1815: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:1818: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:1821: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:1824: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+done
+rm -rf conftest*
+if test -n "$ac_declaration"; then
+  echo '#ifdef __cplusplus' >>confdefs.h
+  echo "$ac_declaration"    >>confdefs.h
+  echo '#endif'             >>confdefs.h
+fi
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
+ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_main_return="return"
+
+GCC_VERSION=none
+if test "$GCC" = yes ; then
+	echo "$as_me:1854: checking version of $CC" >&5
+echo $ECHO_N "checking version of $CC... $ECHO_C" >&6
+	GCC_VERSION="`${CC} --version 2>/dev/null | sed -e '2,$d' -e 's/^.*(GCC[^)]*) //' -e 's/^.*(Debian[^)]*) //' -e 's/^[^0-9.]*//' -e 's/[^0-9.].*//'`"
+	test -z "$GCC_VERSION" && GCC_VERSION=unknown
+	echo "$as_me:1858: result: $GCC_VERSION" >&5
+echo "${ECHO_T}$GCC_VERSION" >&6
+fi
+
+INTEL_COMPILER=no
+
+if test "$GCC" = yes ; then
+	case "$host_os" in
+	(linux*|gnu*)
+		echo "$as_me:1867: checking if this is really Intel C compiler" >&5
+echo $ECHO_N "checking if this is really Intel C compiler... $ECHO_C" >&6
+		cf_save_CFLAGS="$CFLAGS"
+		CFLAGS="$CFLAGS -no-gcc"
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 1872 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+
+#ifdef __INTEL_COMPILER
+#else
+make an error
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:1889: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:1892: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:1895: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:1898: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  INTEL_COMPILER=yes
+cf_save_CFLAGS="$cf_save_CFLAGS -we147"
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+		CFLAGS="$cf_save_CFLAGS"
+		echo "$as_me:1909: result: $INTEL_COMPILER" >&5
+echo "${ECHO_T}$INTEL_COMPILER" >&6
+		;;
+	esac
+fi
+
+CLANG_COMPILER=no
+
+if test "$GCC" = yes ; then
+	echo "$as_me:1918: checking if this is really Clang C compiler" >&5
+echo $ECHO_N "checking if this is really Clang C compiler... $ECHO_C" >&6
+	cf_save_CFLAGS="$CFLAGS"
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 1922 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+
+#ifdef __clang__
+#else
+make an error
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:1939: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:1942: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:1945: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:1948: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  CLANG_COMPILER=yes
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+	CFLAGS="$cf_save_CFLAGS"
+	echo "$as_me:1958: result: $CLANG_COMPILER" >&5
+echo "${ECHO_T}$CLANG_COMPILER" >&6
+fi
+
+CLANG_VERSION=none
+
+if test "x$CLANG_COMPILER" = "xyes" ; then
+	case "$CC" in
+	(c[1-9][0-9]|*/c[1-9][0-9])
+		{ echo "$as_me:1967: WARNING: replacing broken compiler alias $CC" >&5
+echo "$as_me: WARNING: replacing broken compiler alias $CC" >&2;}
+		CFLAGS="$CFLAGS -std=`echo "$CC" | sed -e 's%.*/%%'`"
+		CC=clang
+		;;
+	esac
+
+	echo "$as_me:1974: checking version of $CC" >&5
+echo $ECHO_N "checking version of $CC... $ECHO_C" >&6
+	CLANG_VERSION="`$CC --version 2>/dev/null | sed -e '2,$d' -e 's/^.*(CLANG[^)]*) //' -e 's/^.*(Debian[^)]*) //' -e 's/^[^0-9.]*//' -e 's/[^0-9.].*//'`"
+	test -z "$CLANG_VERSION" && CLANG_VERSION=unknown
+	echo "$as_me:1978: result: $CLANG_VERSION" >&5
+echo "${ECHO_T}$CLANG_VERSION" >&6
+
+	for cf_clang_opt in \
+		-Qunused-arguments \
+		-Wno-error=implicit-function-declaration
+	do
+		echo "$as_me:1985: checking if option $cf_clang_opt works" >&5
+echo $ECHO_N "checking if option $cf_clang_opt works... $ECHO_C" >&6
+		cf_save_CFLAGS="$CFLAGS"
+		CFLAGS="$CFLAGS $cf_clang_opt"
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 1990 "configure"
+#include "confdefs.h"
+
+			#include <stdio.h>
+int
+main (void)
+{
+
+			printf("hello!\\n");
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:2004: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:2007: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:2010: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:2013: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+			cf_clang_optok=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+			cf_clang_optok=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+		echo "$as_me:2024: result: $cf_clang_optok" >&5
+echo "${ECHO_T}$cf_clang_optok" >&6
+		CFLAGS="$cf_save_CFLAGS"
+		if test "$cf_clang_optok" = yes; then
+			test -n "$verbose" && echo "	adding option $cf_clang_opt" 1>&6
+
+echo "${as_me:-configure}:2030: testing adding option $cf_clang_opt ..." 1>&5
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_clang_opt"
+
+		fi
+	done
+fi
+
+echo "$as_me:2039: checking for $CC option to accept ANSI C" >&5
+echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_stdc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_prog_cc_stdc=no
+ac_save_CC=$CC
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 2047 "configure"
+#include "confdefs.h"
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main (void)
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX			-qlanglvl=ansi
+# Ultrix and OSF/1	-std1
+# HP-UX 10.20 and later	-Ae
+# HP-UX older versions	-Aa -D_HPUX_SOURCE
+# SVR4			-Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:2096: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:2099: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:2102: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:2105: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_prog_cc_stdc=$ac_arg
+break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext"
+done
+rm -f "conftest.$ac_ext" "conftest.$ac_objext"
+CC=$ac_save_CC
+
+fi
+
+case "x$ac_cv_prog_cc_stdc" in
+  x|xno)
+    echo "$as_me:2122: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6 ;;
+  *)
+    echo "$as_me:2125: result: $ac_cv_prog_cc_stdc" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
+    CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+
+# This should have been defined by AC_PROG_CC
+: "${CC:=cc}"
+
+echo "$as_me:2133: checking \$CFLAGS variable" >&5
+echo $ECHO_N "checking \$CFLAGS variable... $ECHO_C" >&6
+case "x$CFLAGS" in
+(*-[IUD]*)
+	echo "$as_me:2137: result: broken" >&5
+echo "${ECHO_T}broken" >&6
+	{ echo "$as_me:2139: WARNING: your environment uses the CFLAGS variable to hold CPPFLAGS options" >&5
+echo "$as_me: WARNING: your environment uses the CFLAGS variable to hold CPPFLAGS options" >&2;}
+	cf_flags="$CFLAGS"
+	CFLAGS=
+	for cf_arg in $cf_flags
+	do
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_arg
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+	done
+	;;
+(*)
+	echo "$as_me:2247: result: ok" >&5
+echo "${ECHO_T}ok" >&6
+	;;
+esac
+
+echo "$as_me:2252: checking \$CC variable" >&5
+echo $ECHO_N "checking \$CC variable... $ECHO_C" >&6
+case "$CC" in
+(*[\ \	]-*)
+	echo "$as_me:2256: result: broken" >&5
+echo "${ECHO_T}broken" >&6
+	{ echo "$as_me:2258: WARNING: your environment uses the CC variable to hold CFLAGS/CPPFLAGS options" >&5
+echo "$as_me: WARNING: your environment uses the CC variable to hold CFLAGS/CPPFLAGS options" >&2;}
+	# humor him...
+	cf_prog=`echo "$CC" | sed -e 's/	/ /g' -e 's/[ ]* / /g' -e 's/[ ]*[ ]-[^ ].*//'`
+	cf_flags=`echo "$CC" | ${AWK:-awk} -v prog="$cf_prog" '{ printf("%s", substr($0,1+length(prog))); }'`
+	CC="$cf_prog"
+	for cf_arg in $cf_flags
+	do
+		case "x$cf_arg" in
+		(x-[IUDfgOW]*)
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_arg
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+			;;
+		(*)
+			CC="$CC $cf_arg"
+			;;
+		esac
+	done
+	test -n "$verbose" && echo "	resulting CC: '$CC'" 1>&6
+
+echo "${as_me:-configure}:2375: testing resulting CC: '$CC' ..." 1>&5
+
+	test -n "$verbose" && echo "	resulting CFLAGS: '$CFLAGS'" 1>&6
+
+echo "${as_me:-configure}:2379: testing resulting CFLAGS: '$CFLAGS' ..." 1>&5
+
+	test -n "$verbose" && echo "	resulting CPPFLAGS: '$CPPFLAGS'" 1>&6
+
+echo "${as_me:-configure}:2383: testing resulting CPPFLAGS: '$CPPFLAGS' ..." 1>&5
+
+	;;
+(*)
+	echo "$as_me:2387: result: ok" >&5
+echo "${ECHO_T}ok" >&6
+	;;
+esac
+
+echo "$as_me:2392: checking for egrep" >&5
+echo $ECHO_N "checking for egrep... $ECHO_C" >&6
+if test "${ac_cv_path_EGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     for ac_prog in gegrep egrep
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:2404: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_EGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $EGREP in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_EGREP="$EGREP" # Let the user override the test with a path.
+  ;;
+  *)
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  if $as_executable_p "$ac_dir/$ac_word"; then
+   ac_cv_path_EGREP="$ac_dir/$ac_word"
+   echo "$as_me:2421: found $ac_dir/$ac_word" >&5
+   break
+fi
+done
+
+  ;;
+esac
+fi
+EGREP=$ac_cv_path_EGREP
+
+if test -n "$EGREP"; then
+  echo "$as_me:2432: result: $EGREP" >&5
+echo "${ECHO_T}$EGREP" >&6
+else
+  echo "$as_me:2435: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$EGREP" && break
+done
+test -n "$EGREP" || EGREP=": "
+
+     test "x$ac_cv_path_EGREP" = "x:" && { { echo "$as_me:2443: error: cannot find workable egrep" >&5
+echo "$as_me: error: cannot find workable egrep" >&2;}
+   { (exit 1); exit 1; }; }
+   fi
+fi
+echo "$as_me:2448: result: $ac_cv_path_EGREP" >&5
+echo "${ECHO_T}$ac_cv_path_EGREP" >&6
+ EGREP="$ac_cv_path_EGREP"
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
+ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_main_return="return"
+echo "$as_me:2458: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if test "${ac_cv_prog_CPP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 2479 "configure"
+#include "confdefs.h"
+#include <assert.h>
+                     Syntax error
+_ACEOF
+if { (eval echo "$as_me:2484: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:2490: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err "conftest.$ac_ext"
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 2513 "configure"
+#include "confdefs.h"
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:2517: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:2523: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err "conftest.$ac_ext"
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err "conftest.$ac_ext"
+if $ac_preproc_ok; then
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+echo "$as_me:2560: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 2570 "configure"
+#include "confdefs.h"
+#include <assert.h>
+                     Syntax error
+_ACEOF
+if { (eval echo "$as_me:2575: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:2581: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err "conftest.$ac_ext"
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 2604 "configure"
+#include "confdefs.h"
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:2608: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:2614: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err "conftest.$ac_ext"
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err "conftest.$ac_ext"
+if $ac_preproc_ok; then
+  :
+else
+  { { echo "$as_me:2642: error: C preprocessor \"$CPP\" fails sanity check" >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
+ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_main_return="return"
+
+if test $ac_cv_c_compiler_gnu = yes; then
+    echo "$as_me:2655: checking whether $CC needs -traditional" >&5
+echo $ECHO_N "checking whether $CC needs -traditional... $ECHO_C" >&6
+if test "${ac_cv_prog_gcc_traditional+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+    ac_pattern="Autoconf.*'x'"
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 2662 "configure"
+#include "confdefs.h"
+#include <sgtty.h>
+int Autoconf = TIOCGETP;
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "$ac_pattern" >/dev/null 2>&1; then
+  ac_cv_prog_gcc_traditional=yes
+else
+  ac_cv_prog_gcc_traditional=no
+fi
+rm -rf conftest*
+
+  if test $ac_cv_prog_gcc_traditional = no; then
+    cat >"conftest.$ac_ext" <<_ACEOF
+#line 2677 "configure"
+#include "confdefs.h"
+#include <termio.h>
+int Autoconf = TCGETA;
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "$ac_pattern" >/dev/null 2>&1; then
+  ac_cv_prog_gcc_traditional=yes
+fi
+rm -rf conftest*
+
+  fi
+fi
+echo "$as_me:2690: result: $ac_cv_prog_gcc_traditional" >&5
+echo "${ECHO_T}$ac_cv_prog_gcc_traditional" >&6
+  if test $ac_cv_prog_gcc_traditional = yes; then
+    CC="$CC -traditional"
+  fi
+fi
+
+echo "$as_me:2697: checking whether $CC understands -c and -o together" >&5
+echo $ECHO_N "checking whether $CC understands -c and -o together... $ECHO_C" >&6
+if test "${cf_cv_prog_CC_c_o+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat > conftest.$ac_ext <<CF_EOF
+int main(void)
+{
+	${cf_cv_main_return:-return}(0);
+}
+CF_EOF
+# We do the test twice because some compilers refuse to overwrite an
+# existing .o file with -o, though they will create one.
+ac_try='$CC $CFLAGS $CPPFLAGS -c conftest.$ac_ext -o conftest2.$ac_objext >&5'
+if { (eval echo "$as_me:2712: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:2715: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+  test -f conftest2.$ac_objext && { (eval echo "$as_me:2717: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:2720: \$? = $ac_status" >&5
+  (exit "$ac_status"); };
+then
+  eval cf_cv_prog_CC_c_o=yes
+else
+  eval cf_cv_prog_CC_c_o=no
+fi
+rm -rf ./conftest*
+
+fi
+if test "$cf_cv_prog_CC_c_o" = yes; then
+  echo "$as_me:2731: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+  echo "$as_me:2734: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+test "$program_prefix" != NONE &&
+  program_transform_name="s,^,$program_prefix,;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s,\$,$program_suffix,;$program_transform_name"
+# Double any \ or $.  echo might interpret backslashes.
+# By default was `s,x,x', remove it if useless.
+cat <<\_ACEOF >conftest.sed
+s/[\\$]/&&/g;s/;s,x,x,$//
+_ACEOF
+program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
+rm conftest.sed
+
+for ac_prog in mawk gawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:2755: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_AWK+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_AWK="$ac_prog"
+echo "$as_me:2770: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  echo "$as_me:2778: result: $AWK" >&5
+echo "${ECHO_T}$AWK" >&6
+else
+  echo "$as_me:2781: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$AWK" && break
+done
+
+test -z "$AWK" && { { echo "$as_me:2788: error: No awk program found" >&5
+echo "$as_me: error: No awk program found" >&2;}
+   { (exit 1); exit 1; }; }
+
+echo "$as_me:2792: checking for egrep" >&5
+echo $ECHO_N "checking for egrep... $ECHO_C" >&6
+if test "${ac_cv_prog_egrep+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if echo a | (grep -E '(a|b)') >/dev/null 2>&1
+		then ac_cv_prog_egrep='grep -E'
+		else ac_cv_prog_egrep='egrep'
+	fi
+fi
+echo "$as_me:2802: result: $ac_cv_prog_egrep" >&5
+echo "${ECHO_T}$ac_cv_prog_egrep" >&6
+	EGREP=$ac_cv_prog_egrep
+
+	test -z "$EGREP" && { { echo "$as_me:2806: error: No egrep program found" >&5
+echo "$as_me: error: No egrep program found" >&2;}
+   { (exit 1); exit 1; }; }
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo "$as_me:2822: checking for a BSD compatible install" >&5
+echo $ECHO_N "checking for a BSD compatible install... $ECHO_C" >&6
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+    ac_save_IFS=$IFS; IFS=$ac_path_separator
+  for ac_dir in $PATH; do
+    IFS=$ac_save_IFS
+    # Account for people who put trailing slashes in PATH elements.
+    case $ac_dir/ in
+    / | ./ | .// | /cC/* \
+    | /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* \
+    | /usr/ucb/* ) ;;
+    *)
+      # OSF1 and SCO ODT 3.0 have their own names for install.
+      # Don't use installbsd from OSF since it installs stuff as root
+      # by default.
+      for ac_prog in ginstall scoinst install; do
+        if $as_executable_p "$ac_dir/$ac_prog"; then
+	  if test $ac_prog = install &&
+            grep dspmsg "$ac_dir/$ac_prog" >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    :
+	  elif test $ac_prog = install &&
+	    grep pwplus "$ac_dir/$ac_prog" >/dev/null 2>&1; then
+	    # program-specific install script used by HP pwplus--don't use.
+	    :
+	  else
+	    ac_cv_path_install="$ac_dir/$ac_prog -c"
+	    break 2
+	  fi
+	fi
+      done
+      ;;
+    esac
+  done
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  We don't cache a
+    # path for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the path is relative.
+    INSTALL=$ac_install_sh
+  fi
+fi
+echo "$as_me:2871: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo "$as_me:2882: checking whether ln -s works" >&5
+echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+  echo "$as_me:2886: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+  echo "$as_me:2889: result: no, using $LN_S" >&5
+echo "${ECHO_T}no, using $LN_S" >&6
+fi
+
+echo "$as_me:2893: checking if $LN_S -f options work" >&5
+echo $ECHO_N "checking if $LN_S -f options work... $ECHO_C" >&6
+
+rm -f conf$$.src conf$$dst
+echo >conf$$.dst
+echo first >conf$$.src
+if $LN_S -f conf$$.src conf$$.dst 2>/dev/null; then
+	cf_prog_ln_sf=yes
+else
+	cf_prog_ln_sf=no
+fi
+rm -f conf$$.dst conf$$src
+echo "$as_me:2905: result: $cf_prog_ln_sf" >&5
+echo "${ECHO_T}$cf_prog_ln_sf" >&6
+
+test "$cf_prog_ln_sf" = yes && LN_S="$LN_S -f"
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo "$as_me:2922: checking for a BSD compatible install" >&5
+echo $ECHO_N "checking for a BSD compatible install... $ECHO_C" >&6
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+    ac_save_IFS=$IFS; IFS=$ac_path_separator
+  for ac_dir in $PATH; do
+    IFS=$ac_save_IFS
+    # Account for people who put trailing slashes in PATH elements.
+    case $ac_dir/ in
+    / | ./ | .// | /cC/* \
+    | /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* \
+    | /usr/ucb/* ) ;;
+    *)
+      # OSF1 and SCO ODT 3.0 have their own names for install.
+      # Don't use installbsd from OSF since it installs stuff as root
+      # by default.
+      for ac_prog in ginstall scoinst install; do
+        if $as_executable_p "$ac_dir/$ac_prog"; then
+	  if test $ac_prog = install &&
+            grep dspmsg "$ac_dir/$ac_prog" >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    :
+	  elif test $ac_prog = install &&
+	    grep pwplus "$ac_dir/$ac_prog" >/dev/null 2>&1; then
+	    # program-specific install script used by HP pwplus--don't use.
+	    :
+	  else
+	    ac_cv_path_install="$ac_dir/$ac_prog -c"
+	    break 2
+	  fi
+	fi
+      done
+      ;;
+    esac
+  done
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  We don't cache a
+    # path for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the path is relative.
+    INSTALL=$ac_install_sh
+  fi
+fi
+echo "$as_me:2971: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+case $INSTALL in
+(/*)
+	;;
+(*)
+	cf_dir=`echo "$INSTALL" | sed -e 's%/[^/]*$%%'`
+	test -z "$cf_dir" && cf_dir=.
+	INSTALL="`cd \"$cf_dir\" && pwd`"/"`echo "$INSTALL" | sed -e 's%^.*/%%'`"
+	;;
+esac
+
+echo "$as_me:2992: checking if you want to install stripped executables" >&5
+echo $ECHO_N "checking if you want to install stripped executables... $ECHO_C" >&6
+
+# Check whether --enable-stripping or --disable-stripping was given.
+if test "${enable_stripping+set}" = set; then
+  enableval="$enable_stripping"
+  test "$enableval" != no && enableval=yes
+	if test "$enableval" != "yes" ; then
+    enable_stripping=no
+	else
+		enable_stripping=yes
+	fi
+else
+  enableval=yes
+	enable_stripping=yes
+
+fi;
+echo "$as_me:3009: result: $enable_stripping" >&5
+echo "${ECHO_T}$enable_stripping" >&6
+
+if test "$enable_stripping" = yes
+then
+	INSTALL_OPT_S="-s"
+else
+	INSTALL_OPT_S=
+fi
+
+: "${INSTALL:=install}"
+echo "$as_me:3020: checking if install accepts -p option" >&5
+echo $ECHO_N "checking if install accepts -p option... $ECHO_C" >&6
+if test "${cf_cv_install_p+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	rm -rf ./conftest*
+	date >conftest.in
+	mkdir conftest.out
+	sleep 3
+	if $INSTALL -p conftest.in conftest.out 2>/dev/null
+	then
+		if test -f conftest.out/conftest.in
+		then
+			test conftest.in -nt conftest.out/conftest.in 2>conftest.err && \
+			test conftest.out/conftest.in -nt conftest.in 2>conftest.err
+			if test -s conftest.err
+			then
+				cf_cv_install_p=no
+			else
+				cf_cv_install_p=yes
+			fi
+		else
+			cf_cv_install_p=no
+		fi
+	else
+		cf_cv_install_p=no
+	fi
+	rm -rf ./conftest*
+
+fi
+echo "$as_me:3051: result: $cf_cv_install_p" >&5
+echo "${ECHO_T}$cf_cv_install_p" >&6
+
+echo "$as_me:3054: checking if install needs to be told about ownership" >&5
+echo $ECHO_N "checking if install needs to be told about ownership... $ECHO_C" >&6
+case `$ac_config_guess` in
+(*minix)
+	with_install_o=yes
+	;;
+(*)
+	with_install_o=no
+	;;
+esac
+
+echo "$as_me:3065: result: $with_install_o" >&5
+echo "${ECHO_T}$with_install_o" >&6
+if test "x$with_install_o" = xyes
+then
+	INSTALL_OPT_O="`id root|sed -e 's/uid=[0-9]*(/ -o /' -e 's/gid=[0-9]*(/ -g /' -e 's/ [^=[:space:]][^=[:space:]]*=.*/ /' -e 's/)//g'`"
+else
+	INSTALL_OPT_O=
+fi
+
+echo "$as_me:3074: checking for long file names" >&5
+echo $ECHO_N "checking for long file names... $ECHO_C" >&6
+if test "${ac_cv_sys_long_file_names+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_sys_long_file_names=yes
+# Test for long file names in all the places we know might matter:
+#      .		the current directory, where building will happen
+#      $prefix/lib	where we will be installing things
+#      $exec_prefix/lib	likewise
+# eval it to expand exec_prefix.
+#      $TMPDIR		if set, where it might want to write temporary files
+# if $TMPDIR is not set:
+#      /tmp		where it might want to write temporary files
+#      /var/tmp		likewise
+#      /usr/tmp		likewise
+if test -n "$TMPDIR" && test -d "$TMPDIR" && test -w "$TMPDIR"; then
+  ac_tmpdirs=$TMPDIR
+else
+  ac_tmpdirs='/tmp /var/tmp /usr/tmp'
+fi
+for ac_dir in  . $ac_tmpdirs `eval echo "$prefix/lib" "$exec_prefix/lib"` ; do
+  test -d "$ac_dir" || continue
+  test -w "$ac_dir" || continue # It is less confusing to not echo anything here.
+  ac_xdir=$ac_dir/cf$$
+  (umask 077 && mkdir "$ac_xdir" 2>/dev/null) || continue
+  ac_tf1=$ac_xdir/conftest9012345
+  ac_tf2=$ac_xdir/conftest9012346
+  (echo 1 >"$ac_tf1") 2>/dev/null
+  (echo 2 >"$ac_tf2") 2>/dev/null
+  ac_val=`cat "$ac_tf1" 2>/dev/null`
+  if test ! -f "$ac_tf1" || test "$ac_val" != 1; then
+    ac_cv_sys_long_file_names=no
+    rm -rf "$ac_xdir" 2>/dev/null
+    break
+  fi
+  rm -rf "$ac_xdir" 2>/dev/null
+done
+fi
+echo "$as_me:3113: result: $ac_cv_sys_long_file_names" >&5
+echo "${ECHO_T}$ac_cv_sys_long_file_names" >&6
+if test "$ac_cv_sys_long_file_names" = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_LONG_FILE_NAMES 1
+EOF
+
+fi
+
+# if we find pkg-config, check if we should install the ".pc" files.
+
+echo "$as_me:3125: checking if you want to use pkg-config" >&5
+echo $ECHO_N "checking if you want to use pkg-config... $ECHO_C" >&6
+
+# Check whether --with-pkg-config or --without-pkg-config was given.
+if test "${with_pkg_config+set}" = set; then
+  withval="$with_pkg_config"
+  cf_pkg_config=$withval
+else
+  cf_pkg_config=yes
+fi;
+echo "$as_me:3135: result: $cf_pkg_config" >&5
+echo "${ECHO_T}$cf_pkg_config" >&6
+
+case "$cf_pkg_config" in
+(no)
+	PKG_CONFIG=none
+	;;
+(yes)
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+echo "$as_me:3147: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_PKG_CONFIG+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  if $as_executable_p "$ac_dir/$ac_word"; then
+   ac_cv_path_PKG_CONFIG="$ac_dir/$ac_word"
+   echo "$as_me:3164: found $ac_dir/$ac_word" >&5
+   break
+fi
+done
+
+  ;;
+esac
+fi
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+
+if test -n "$PKG_CONFIG"; then
+  echo "$as_me:3175: result: $PKG_CONFIG" >&5
+echo "${ECHO_T}$PKG_CONFIG" >&6
+else
+  echo "$as_me:3178: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_path_PKG_CONFIG"; then
+  ac_pt_PKG_CONFIG=$PKG_CONFIG
+  # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+echo "$as_me:3187: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $ac_pt_PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  if $as_executable_p "$ac_dir/$ac_word"; then
+   ac_cv_path_ac_pt_PKG_CONFIG="$ac_dir/$ac_word"
+   echo "$as_me:3204: found $ac_dir/$ac_word" >&5
+   break
+fi
+done
+
+  test -z "$ac_cv_path_ac_pt_PKG_CONFIG" && ac_cv_path_ac_pt_PKG_CONFIG="none"
+  ;;
+esac
+fi
+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
+
+if test -n "$ac_pt_PKG_CONFIG"; then
+  echo "$as_me:3216: result: $ac_pt_PKG_CONFIG" >&5
+echo "${ECHO_T}$ac_pt_PKG_CONFIG" >&6
+else
+  echo "$as_me:3219: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  PKG_CONFIG=$ac_pt_PKG_CONFIG
+else
+  PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
+fi
+
+	;;
+(*)
+	PKG_CONFIG=$withval
+	;;
+esac
+
+test -z "$PKG_CONFIG" && PKG_CONFIG=none
+if test "$PKG_CONFIG" != none ; then
+
+if test "x$prefix" != xNONE; then
+	cf_path_syntax="$prefix"
+else
+	cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$PKG_CONFIG" in
+(.\$\(*\)*|.\'*\'*)
+	;;
+(..|./*|.\\*)
+	;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+	;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+	eval PKG_CONFIG="$PKG_CONFIG"
+	case ".$PKG_CONFIG" in
+	(.NONE/*)
+		PKG_CONFIG=`echo "$PKG_CONFIG" | sed -e s%NONE%$cf_path_syntax%`
+		;;
+	esac
+	;;
+(.no|.NONE/*)
+	PKG_CONFIG=`echo "$PKG_CONFIG" | sed -e s%NONE%$cf_path_syntax%`
+	;;
+(*)
+	{ { echo "$as_me:3262: error: expected a pathname, not \"$PKG_CONFIG\"" >&5
+echo "$as_me: error: expected a pathname, not \"$PKG_CONFIG\"" >&2;}
+   { (exit 1); exit 1; }; }
+	;;
+esac
+
+elif test "x$cf_pkg_config" != xno ; then
+	{ echo "$as_me:3269: WARNING: pkg-config is not installed" >&5
+echo "$as_me: WARNING: pkg-config is not installed" >&2;}
+fi
+
+case "$PKG_CONFIG" in
+(no|none|yes)
+	echo "$as_me:3275: checking for pkg-config library directory" >&5
+echo $ECHO_N "checking for pkg-config library directory... $ECHO_C" >&6
+	;;
+(*)
+	echo "$as_me:3279: checking for $PKG_CONFIG library directory" >&5
+echo $ECHO_N "checking for $PKG_CONFIG library directory... $ECHO_C" >&6
+	;;
+esac
+
+# if $PKG_CONFIG_LIBDIR is set, try to use that
+cf_search_path=`echo "$PKG_CONFIG_LIBDIR" | sed -e 's/:/ /g' -e 's,^[ 	]*,,'`
+
+# if the option is used, let that override.  otherwise default to "libdir"
+
+# Check whether --with-pkg-config-libdir or --without-pkg-config-libdir was given.
+if test "${with_pkg_config_libdir+set}" = set; then
+  withval="$with_pkg_config_libdir"
+  cf_search_path=$withval
+else
+  test "x$PKG_CONFIG" != xnone && test -z "$cf_search_path" && cf_search_path=libdir
+fi;
+
+case "x$cf_search_path" in
+(xlibdir)
+	PKG_CONFIG_LIBDIR='${libdir}/pkgconfig'
+	echo "$as_me:3300: result: $PKG_CONFIG_LIBDIR" >&5
+echo "${ECHO_T}$PKG_CONFIG_LIBDIR" >&6
+	cf_search_path=
+	;;
+(x)
+	;;
+(x/*\ *)
+	PKG_CONFIG_LIBDIR=
+	;;
+(x/*)
+	PKG_CONFIG_LIBDIR="$cf_search_path"
+	echo "$as_me:3311: result: $PKG_CONFIG_LIBDIR" >&5
+echo "${ECHO_T}$PKG_CONFIG_LIBDIR" >&6
+	cf_search_path=
+	;;
+(xyes|xauto)
+	echo "$as_me:3316: result: auto" >&5
+echo "${ECHO_T}auto" >&6
+	cf_search_path=
+	# Look for the library directory using the same prefix as the executable
+	echo "$as_me:3320: checking for search-list" >&5
+echo $ECHO_N "checking for search-list... $ECHO_C" >&6
+	if test "x$PKG_CONFIG" != xnone
+	then
+		# works for pkg-config since version 0.24 (2009)
+		# works for pkgconf since version 0.8.3 (2012)
+		for cf_pkg_program in \
+			`echo "$PKG_CONFIG" | sed -e 's,^.*/,,'` \
+			pkg-config \
+			pkgconf
+		do
+			cf_search_path=`"$PKG_CONFIG" --variable=pc_path "$cf_pkg_program" 2>/dev/null | tr : ' '`
+			test -n "$cf_search_path" && break
+		done
+
+		# works for pkg-config since import in 2005 of original 2001 HP code.
+		test -z "$cf_search_path" && \
+		cf_search_path=`
+		"$PKG_CONFIG" --debug --exists no-such-package 2>&1 | $AWK "\
+/^Scanning directory (#[1-9][0-9]* )?'.*'$/{ \
+	sub(\"^[^']*'\",\"\"); \
+	sub(\"'.*\",\"\"); \
+	printf \" %s\", \\$0; } \
+{ next; } \
+"`
+	fi
+
+	echo "$as_me:3347: result: $cf_search_path" >&5
+echo "${ECHO_T}$cf_search_path" >&6
+	;;
+(*)
+	{ { echo "$as_me:3351: error: Unexpected option value: $cf_search_path" >&5
+echo "$as_me: error: Unexpected option value: $cf_search_path" >&2;}
+   { (exit 1); exit 1; }; }
+	;;
+esac
+
+if test -n "$cf_search_path"
+then
+	echo "$as_me:3359: checking for first directory" >&5
+echo $ECHO_N "checking for first directory... $ECHO_C" >&6
+	cf_pkg_config_path=none
+	for cf_config in $cf_search_path
+	do
+		if test -d "$cf_config"
+		then
+			cf_pkg_config_path=$cf_config
+			break
+		fi
+	done
+	echo "$as_me:3370: result: $cf_pkg_config_path" >&5
+echo "${ECHO_T}$cf_pkg_config_path" >&6
+
+	if test "x$cf_pkg_config_path" != xnone ; then
+		# limit this to the first directory found
+		PKG_CONFIG_LIBDIR="$cf_pkg_config_path"
+	fi
+
+	if test -z "$PKG_CONFIG_LIBDIR" && test -n "$cf_search_path"
+	then
+		echo "$as_me:3380: checking for workaround" >&5
+echo $ECHO_N "checking for workaround... $ECHO_C" >&6
+		if test "$prefix" = "NONE" ; then
+			cf_prefix="$ac_default_prefix"
+		else
+			cf_prefix="$prefix"
+		fi
+		eval cf_libdir=$libdir
+		cf_libdir=`echo "$cf_libdir" | sed -e "s,^NONE,$cf_prefix,"`
+		cf_backup=
+		for cf_config in $cf_search_path
+		do
+			case $cf_config in
+			$cf_libdir/pkgconfig)
+				PKG_CONFIG_LIBDIR=$cf_libdir/pkgconfig
+				break
+				;;
+			*)
+				test -z "$cf_backup" && cf_backup=$cf_config
+				;;
+			esac
+		done
+		test -z "$PKG_CONFIG_LIBDIR" && PKG_CONFIG_LIBDIR=$cf_backup
+		echo "$as_me:3403: result: $PKG_CONFIG_LIBDIR" >&5
+echo "${ECHO_T}$PKG_CONFIG_LIBDIR" >&6
+	fi
+fi
+
+echo "$as_me:3408: checking if you want to build test-programs" >&5
+echo $ECHO_N "checking if you want to build test-programs... $ECHO_C" >&6
+
+# Check whether --with-tests or --without-tests was given.
+if test "${with_tests+set}" = set; then
+  withval="$with_tests"
+  cf_with_tests=$withval
+else
+  cf_with_tests=yes
+fi;
+echo "$as_me:3418: result: $cf_with_tests" >&5
+echo "${ECHO_T}$cf_with_tests" >&6
+
+echo "$as_me:3421: checking if we should assume mixed-case filenames" >&5
+echo $ECHO_N "checking if we should assume mixed-case filenames... $ECHO_C" >&6
+
+# Check whether --enable-mixed-case or --disable-mixed-case was given.
+if test "${enable_mixed_case+set}" = set; then
+  enableval="$enable_mixed_case"
+  enable_mixedcase=$enableval
+else
+  enable_mixedcase=auto
+fi;
+echo "$as_me:3431: result: $enable_mixedcase" >&5
+echo "${ECHO_T}$enable_mixedcase" >&6
+if test "$enable_mixedcase" = "auto" ; then
+
+echo "$as_me:3435: checking if filesystem supports mixed-case filenames" >&5
+echo $ECHO_N "checking if filesystem supports mixed-case filenames... $ECHO_C" >&6
+if test "${cf_cv_mixedcase+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+if test "$cross_compiling" = yes ; then
+	case "$target_alias" in
+	(*-os2-emx*|*-msdosdjgpp*|*-cygwin*|*-msys*|*-mingw*|*-uwin*|darwin*)
+		cf_cv_mixedcase=no
+		;;
+	(*)
+		cf_cv_mixedcase=yes
+		;;
+	esac
+else
+	rm -f conftest CONFTEST
+	echo test >conftest
+	if test -f CONFTEST ; then
+		cf_cv_mixedcase=no
+	else
+		cf_cv_mixedcase=yes
+	fi
+	rm -f conftest CONFTEST
+fi
+
+fi
+echo "$as_me:3462: result: $cf_cv_mixedcase" >&5
+echo "${ECHO_T}$cf_cv_mixedcase" >&6
+test "$cf_cv_mixedcase" = yes &&
+cat >>confdefs.h <<\EOF
+#define MIXEDCASE_FILENAMES 1
+EOF
+
+else
+	cf_cv_mixedcase=$enable_mixedcase
+	if test "$enable_mixedcase" = "yes" ; then
+		cat >>confdefs.h <<\EOF
+#define MIXEDCASE_FILENAMES 1
+EOF
+
+	fi
+fi
+
+# do this after mixed-case option (tags/TAGS is not as important as tic).
+echo "$as_me:3480: checking whether ${MAKE-make} sets \${MAKE}" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \${MAKE}... $ECHO_C" >&6
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,./+-,__p_,'`
+if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.make <<\EOF
+all:
+	@echo 'ac_maketemp="${MAKE}"'
+EOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+  eval ac_cv_prog_make_${ac_make}_set=yes
+else
+  eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftest.make
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+  echo "$as_me:3500: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+  SET_MAKE=
+else
+  echo "$as_me:3504: result: no" >&5
+echo "${ECHO_T}no" >&6
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+echo "$as_me:3509: checking for \".PHONY\" make-support" >&5
+echo $ECHO_N "checking for \".PHONY\" make-support... $ECHO_C" >&6
+if test "${cf_cv_make_PHONY+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	rm -rf conftest*
+	(
+		mkdir conftest || exit 1
+		cd conftest
+		cat >makefile <<'CF_EOF'
+.PHONY: always
+DATA=0
+always:	always.out
+	@echo "** making $@ $(DATA)"
+once: once.out
+	@echo "** making $@ $(DATA)"
+always.out:
+	@echo "** making $@ $(DATA)"
+	echo $(DATA) > $@
+once.out:
+	@echo "** making $@ $(DATA)"
+	echo $(DATA) > $@
+CF_EOF
+		for cf_data in 1 2 3
+		do
+			${MAKE:-make} always DATA=$cf_data
+			${MAKE:-make} once   DATA=$cf_data
+			${MAKE:-make} -t always once
+			if test -f always ; then
+				echo "no (case 1)" > ../conftest.tmp
+			elif test ! -f always.out ; then
+				echo "no (case 2)" > ../conftest.tmp
+			elif test ! -f once.out ; then
+				echo "no (case 3)" > ../conftest.tmp
+			elif ! cmp -s always.out once.out ; then
+				echo "no (case 4)" > ../conftest.tmp
+				diff always.out once.out
+			else
+				cf_check="`cat always.out`"
+				if test "x$cf_check" != "x$cf_data" ; then
+					echo "no (case 5)" > ../conftest.tmp
+				else
+					echo yes > ../conftest.tmp
+					rm -f ./*.out
+					continue
+				fi
+			fi
+			break
+		done
+	) >&5 2>&1
+	cf_cv_make_PHONY="`cat conftest.tmp`"
+	rm -rf conftest*
+
+fi
+echo "$as_me:3564: result: $cf_cv_make_PHONY" >&5
+echo "${ECHO_T}$cf_cv_make_PHONY" >&6
+MAKE_NO_PHONY="#"
+MAKE_PHONY="#"
+test "x$cf_cv_make_PHONY" = xyes && MAKE_PHONY=
+test "x$cf_cv_make_PHONY" != xyes && MAKE_NO_PHONY=
+
+for ac_prog in exctags ctags
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:3575: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CTAGS+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CTAGS"; then
+  ac_cv_prog_CTAGS="$CTAGS" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_CTAGS="$ac_prog"
+echo "$as_me:3590: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+CTAGS=$ac_cv_prog_CTAGS
+if test -n "$CTAGS"; then
+  echo "$as_me:3598: result: $CTAGS" >&5
+echo "${ECHO_T}$CTAGS" >&6
+else
+  echo "$as_me:3601: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$CTAGS" && break
+done
+
+for ac_prog in exetags etags
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:3612: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ETAGS+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ETAGS"; then
+  ac_cv_prog_ETAGS="$ETAGS" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ETAGS="$ac_prog"
+echo "$as_me:3627: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+ETAGS=$ac_cv_prog_ETAGS
+if test -n "$ETAGS"; then
+  echo "$as_me:3635: result: $ETAGS" >&5
+echo "${ECHO_T}$ETAGS" >&6
+else
+  echo "$as_me:3638: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$ETAGS" && break
+done
+
+# Extract the first word of "${CTAGS:-ctags}", so it can be a program name with args.
+set dummy ${CTAGS:-ctags}; ac_word=$2
+echo "$as_me:3647: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_MAKE_LOWER_TAGS+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$MAKE_LOWER_TAGS"; then
+  ac_cv_prog_MAKE_LOWER_TAGS="$MAKE_LOWER_TAGS" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_MAKE_LOWER_TAGS="yes"
+echo "$as_me:3662: found $ac_dir/$ac_word" >&5
+break
+done
+
+  test -z "$ac_cv_prog_MAKE_LOWER_TAGS" && ac_cv_prog_MAKE_LOWER_TAGS="no"
+fi
+fi
+MAKE_LOWER_TAGS=$ac_cv_prog_MAKE_LOWER_TAGS
+if test -n "$MAKE_LOWER_TAGS"; then
+  echo "$as_me:3671: result: $MAKE_LOWER_TAGS" >&5
+echo "${ECHO_T}$MAKE_LOWER_TAGS" >&6
+else
+  echo "$as_me:3674: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+if test "$cf_cv_mixedcase" = yes ; then
+	# Extract the first word of "${ETAGS:-etags}", so it can be a program name with args.
+set dummy ${ETAGS:-etags}; ac_word=$2
+echo "$as_me:3681: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_MAKE_UPPER_TAGS+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$MAKE_UPPER_TAGS"; then
+  ac_cv_prog_MAKE_UPPER_TAGS="$MAKE_UPPER_TAGS" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_MAKE_UPPER_TAGS="yes"
+echo "$as_me:3696: found $ac_dir/$ac_word" >&5
+break
+done
+
+  test -z "$ac_cv_prog_MAKE_UPPER_TAGS" && ac_cv_prog_MAKE_UPPER_TAGS="no"
+fi
+fi
+MAKE_UPPER_TAGS=$ac_cv_prog_MAKE_UPPER_TAGS
+if test -n "$MAKE_UPPER_TAGS"; then
+  echo "$as_me:3705: result: $MAKE_UPPER_TAGS" >&5
+echo "${ECHO_T}$MAKE_UPPER_TAGS" >&6
+else
+  echo "$as_me:3708: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+else
+	MAKE_UPPER_TAGS=no
+fi
+
+if test "$MAKE_UPPER_TAGS" = yes ; then
+	MAKE_UPPER_TAGS=
+else
+	MAKE_UPPER_TAGS="#"
+fi
+
+if test "$MAKE_LOWER_TAGS" = yes ; then
+	MAKE_LOWER_TAGS=
+else
+	MAKE_LOWER_TAGS="#"
+fi
+
+echo "$as_me:3728: checking for makeflags variable" >&5
+echo $ECHO_N "checking for makeflags variable... $ECHO_C" >&6
+if test "${cf_cv_makeflags+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cf_cv_makeflags=''
+	for cf_option in '-${MAKEFLAGS}' '${MFLAGS}'
+	do
+		cat >cf_makeflags.tmp <<CF_EOF
+SHELL = $SHELL
+all :
+	@ echo '.$cf_option'
+CF_EOF
+		cf_result=`${MAKE:-make} -k -f cf_makeflags.tmp 2>/dev/null | ${FGREP-fgrep} -v "ing directory" | sed -e 's,[ 	]*$,,'`
+		case "$cf_result" in
+		(.*k|.*kw)
+			cf_result="`${MAKE:-make} -k -f cf_makeflags.tmp CC=cc 2>/dev/null`"
+			case "$cf_result" in
+			(.*CC=*)	cf_cv_makeflags=
+				;;
+			(*)	cf_cv_makeflags=$cf_option
+				;;
+			esac
+			break
+			;;
+		(.-)
+			;;
+		(*)
+
+echo "${as_me:-configure}:3758: testing given option \"$cf_option\",no match \"$cf_result\" ..." 1>&5
+
+			;;
+		esac
+	done
+	rm -f cf_makeflags.tmp
+
+fi
+echo "$as_me:3766: result: $cf_cv_makeflags" >&5
+echo "${ECHO_T}$cf_cv_makeflags" >&6
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+echo "$as_me:3772: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_RANLIB+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+echo "$as_me:3787: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+  echo "$as_me:3795: result: $RANLIB" >&5
+echo "${ECHO_T}$RANLIB" >&6
+else
+  echo "$as_me:3798: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+  ac_ct_RANLIB=$RANLIB
+  # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo "$as_me:3807: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_RANLIB"; then
+  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ac_ct_RANLIB="ranlib"
+echo "$as_me:3822: found $ac_dir/$ac_word" >&5
+break
+done
+
+  test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB="':'"
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+  echo "$as_me:3831: result: $ac_ct_RANLIB" >&5
+echo "${ECHO_T}$ac_ct_RANLIB" >&6
+else
+  echo "$as_me:3834: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  RANLIB=$ac_ct_RANLIB
+else
+  RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ld", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ld; ac_word=$2
+echo "$as_me:3846: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_LD+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$LD"; then
+  ac_cv_prog_LD="$LD" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_LD="${ac_tool_prefix}ld"
+echo "$as_me:3861: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+LD=$ac_cv_prog_LD
+if test -n "$LD"; then
+  echo "$as_me:3869: result: $LD" >&5
+echo "${ECHO_T}$LD" >&6
+else
+  echo "$as_me:3872: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_LD"; then
+  ac_ct_LD=$LD
+  # Extract the first word of "ld", so it can be a program name with args.
+set dummy ld; ac_word=$2
+echo "$as_me:3881: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_LD+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_LD"; then
+  ac_cv_prog_ac_ct_LD="$ac_ct_LD" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ac_ct_LD="ld"
+echo "$as_me:3896: found $ac_dir/$ac_word" >&5
+break
+done
+
+  test -z "$ac_cv_prog_ac_ct_LD" && ac_cv_prog_ac_ct_LD="ld"
+fi
+fi
+ac_ct_LD=$ac_cv_prog_ac_ct_LD
+if test -n "$ac_ct_LD"; then
+  echo "$as_me:3905: result: $ac_ct_LD" >&5
+echo "${ECHO_T}$ac_ct_LD" >&6
+else
+  echo "$as_me:3908: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  LD=$ac_ct_LD
+else
+  LD="$ac_cv_prog_LD"
+fi
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ar; ac_word=$2
+echo "$as_me:3920: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_AR+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_AR="${ac_tool_prefix}ar"
+echo "$as_me:3935: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+  echo "$as_me:3943: result: $AR" >&5
+echo "${ECHO_T}$AR" >&6
+else
+  echo "$as_me:3946: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_AR"; then
+  ac_ct_AR=$AR
+  # Extract the first word of "ar", so it can be a program name with args.
+set dummy ar; ac_word=$2
+echo "$as_me:3955: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_AR+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_AR"; then
+  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ac_ct_AR="ar"
+echo "$as_me:3970: found $ac_dir/$ac_word" >&5
+break
+done
+
+  test -z "$ac_cv_prog_ac_ct_AR" && ac_cv_prog_ac_ct_AR="ar"
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+  echo "$as_me:3979: result: $ac_ct_AR" >&5
+echo "${ECHO_T}$ac_ct_AR" >&6
+else
+  echo "$as_me:3982: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  AR=$ac_ct_AR
+else
+  AR="$ac_cv_prog_AR"
+fi
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ar; ac_word=$2
+echo "$as_me:3994: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_AR+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_AR="${ac_tool_prefix}ar"
+echo "$as_me:4009: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+  echo "$as_me:4017: result: $AR" >&5
+echo "${ECHO_T}$AR" >&6
+else
+  echo "$as_me:4020: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_AR"; then
+  ac_ct_AR=$AR
+  # Extract the first word of "ar", so it can be a program name with args.
+set dummy ar; ac_word=$2
+echo "$as_me:4029: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_AR+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_AR"; then
+  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ac_ct_AR="ar"
+echo "$as_me:4044: found $ac_dir/$ac_word" >&5
+break
+done
+
+  test -z "$ac_cv_prog_ac_ct_AR" && ac_cv_prog_ac_ct_AR="ar"
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+  echo "$as_me:4053: result: $ac_ct_AR" >&5
+echo "${ECHO_T}$ac_ct_AR" >&6
+else
+  echo "$as_me:4056: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  AR=$ac_ct_AR
+else
+  AR="$ac_cv_prog_AR"
+fi
+
+echo "$as_me:4065: checking for options to update archives" >&5
+echo $ECHO_N "checking for options to update archives... $ECHO_C" >&6
+if test "${cf_cv_ar_flags+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	case "$cf_cv_system_name" in
+	(*-msvc*)
+		cf_cv_ar_flags=''
+		cat >mk_static_lib.sh <<-EOF
+		#!$SHELL
+		MSVC_BIN="$AR"
+		out="\$1"
+		shift
+		exec \$MSVC_BIN -out:"\$out" \$@
+		EOF
+		chmod +x mk_static_lib.sh
+		AR=`pwd`/mk_static_lib.sh
+		;;
+	(*)
+		cf_cv_ar_flags=unknown
+		for cf_ar_flags in -curvU -curv curv -crv crv -cqv cqv -rv rv
+		do
+
+			# check if $ARFLAGS already contains this choice
+			if test "x$ARFLAGS" != "x" ; then
+				cf_check_ar_flags=`echo "x$ARFLAGS" | sed -e "s/$cf_ar_flags\$//" -e "s/$cf_ar_flags / /"`
+				if test "x$ARFLAGS" != "$cf_check_ar_flags" ; then
+					cf_cv_ar_flags=
+					break
+				fi
+			fi
+
+			rm -f "conftest.$ac_cv_objext"
+			rm -f conftest.a
+
+			cat >"conftest.$ac_ext" <<EOF
+#line 4102 "configure"
+int	testdata[3] = { 123, 456, 789 };
+EOF
+			if { (eval echo "$as_me:4105: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:4108: \$? = $ac_status" >&5
+  (exit "$ac_status"); } ; then
+				echo "$AR $ARFLAGS $cf_ar_flags conftest.a conftest.$ac_cv_objext" >&5
+				$AR $ARFLAGS "$cf_ar_flags" conftest.a "conftest.$ac_cv_objext" 2>&5 1>/dev/null
+				if test -f conftest.a ; then
+					cf_cv_ar_flags="$cf_ar_flags"
+					break
+				fi
+			else
+				test -n "$verbose" && echo "	cannot compile test-program" 1>&6
+
+echo "${as_me:-configure}:4119: testing cannot compile test-program ..." 1>&5
+
+				break
+			fi
+		done
+		rm -f conftest.a "conftest.$ac_ext" "conftest.$ac_cv_objext"
+		;;
+	esac
+
+fi
+echo "$as_me:4129: result: $cf_cv_ar_flags" >&5
+echo "${ECHO_T}$cf_cv_ar_flags" >&6
+
+if test -n "$ARFLAGS" ; then
+	if test -n "$cf_cv_ar_flags" ; then
+		ARFLAGS="$ARFLAGS $cf_cv_ar_flags"
+	fi
+else
+	ARFLAGS=$cf_cv_ar_flags
+fi
+
+	echo "$as_me:4140: checking for PATH separator" >&5
+echo $ECHO_N "checking for PATH separator... $ECHO_C" >&6
+	case "$cf_cv_system_name" in
+	(os2*)	PATH_SEPARATOR=';'  ;;
+	(*)	${PATH_SEPARATOR:=':'}  ;;
+	esac
+
+	echo "$as_me:4147: result: $PATH_SEPARATOR" >&5
+echo "${ECHO_T}$PATH_SEPARATOR" >&6
+
+echo "$as_me:4150: checking if you have specified an install-prefix" >&5
+echo $ECHO_N "checking if you have specified an install-prefix... $ECHO_C" >&6
+
+# Check whether --with-install-prefix or --without-install-prefix was given.
+if test "${with_install_prefix+set}" = set; then
+  withval="$with_install_prefix"
+  case "$withval" in
+	(yes|no)
+		;;
+	(*)	DESTDIR="$withval"
+		;;
+	esac
+fi;
+echo "$as_me:4163: result: $DESTDIR" >&5
+echo "${ECHO_T}$DESTDIR" >&6
+
+###############################################################################
+
+# If we're cross-compiling, allow the user to override the tools and their
+# options.  The configure script is oriented toward identifying the host
+# compiler, etc., but we need a build compiler to generate parts of the source.
+
+if test "$cross_compiling" = yes ; then
+
+	# defaults that we might want to override
+	: ${BUILD_CFLAGS:=''}
+	: ${BUILD_CPPFLAGS:=''}
+	: ${BUILD_LDFLAGS:=''}
+	: ${BUILD_LIBS:=''}
+	: ${BUILD_EXEEXT:='$x'}
+	: ${BUILD_OBJEXT:='o'}
+
+# Check whether --with-build-cc or --without-build-cc was given.
+if test "${with_build_cc+set}" = set; then
+  withval="$with_build_cc"
+  BUILD_CC="$withval"
+else
+  for ac_prog in gcc clang c99 c89 cc cl
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:4191: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_BUILD_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$BUILD_CC"; then
+  ac_cv_prog_BUILD_CC="$BUILD_CC" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_BUILD_CC="$ac_prog"
+echo "$as_me:4206: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+BUILD_CC=$ac_cv_prog_BUILD_CC
+if test -n "$BUILD_CC"; then
+  echo "$as_me:4214: result: $BUILD_CC" >&5
+echo "${ECHO_T}$BUILD_CC" >&6
+else
+  echo "$as_me:4217: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$BUILD_CC" && break
+done
+test -n "$BUILD_CC" || BUILD_CC="none"
+
+fi;
+	echo "$as_me:4226: checking for native build C compiler" >&5
+echo $ECHO_N "checking for native build C compiler... $ECHO_C" >&6
+	echo "$as_me:4228: result: $BUILD_CC" >&5
+echo "${ECHO_T}$BUILD_CC" >&6
+
+	echo "$as_me:4231: checking for native build C preprocessor" >&5
+echo $ECHO_N "checking for native build C preprocessor... $ECHO_C" >&6
+
+# Check whether --with-build-cpp or --without-build-cpp was given.
+if test "${with_build_cpp+set}" = set; then
+  withval="$with_build_cpp"
+  BUILD_CPP="$withval"
+else
+  BUILD_CPP='${BUILD_CC} -E'
+fi;
+	echo "$as_me:4241: result: $BUILD_CPP" >&5
+echo "${ECHO_T}$BUILD_CPP" >&6
+
+	echo "$as_me:4244: checking for native build C flags" >&5
+echo $ECHO_N "checking for native build C flags... $ECHO_C" >&6
+
+# Check whether --with-build-cflags or --without-build-cflags was given.
+if test "${with_build_cflags+set}" = set; then
+  withval="$with_build_cflags"
+  BUILD_CFLAGS="$withval"
+fi;
+	echo "$as_me:4252: result: $BUILD_CFLAGS" >&5
+echo "${ECHO_T}$BUILD_CFLAGS" >&6
+
+	echo "$as_me:4255: checking for native build C preprocessor-flags" >&5
+echo $ECHO_N "checking for native build C preprocessor-flags... $ECHO_C" >&6
+
+# Check whether --with-build-cppflags or --without-build-cppflags was given.
+if test "${with_build_cppflags+set}" = set; then
+  withval="$with_build_cppflags"
+  BUILD_CPPFLAGS="$withval"
+fi;
+	echo "$as_me:4263: result: $BUILD_CPPFLAGS" >&5
+echo "${ECHO_T}$BUILD_CPPFLAGS" >&6
+
+	echo "$as_me:4266: checking for native build linker-flags" >&5
+echo $ECHO_N "checking for native build linker-flags... $ECHO_C" >&6
+
+# Check whether --with-build-ldflags or --without-build-ldflags was given.
+if test "${with_build_ldflags+set}" = set; then
+  withval="$with_build_ldflags"
+  BUILD_LDFLAGS="$withval"
+fi;
+	echo "$as_me:4274: result: $BUILD_LDFLAGS" >&5
+echo "${ECHO_T}$BUILD_LDFLAGS" >&6
+
+	echo "$as_me:4277: checking for native build linker-libraries" >&5
+echo $ECHO_N "checking for native build linker-libraries... $ECHO_C" >&6
+
+# Check whether --with-build-libs or --without-build-libs was given.
+if test "${with_build_libs+set}" = set; then
+  withval="$with_build_libs"
+  BUILD_LIBS="$withval"
+fi;
+	echo "$as_me:4285: result: $BUILD_LIBS" >&5
+echo "${ECHO_T}$BUILD_LIBS" >&6
+
+	# this assumes we're on Unix.
+	BUILD_EXEEXT=
+	BUILD_OBJEXT=o
+
+	: ${BUILD_CC:='${CC}'}
+
+	echo "$as_me:4294: checking if the build-compiler \"$BUILD_CC\" works" >&5
+echo $ECHO_N "checking if the build-compiler \"$BUILD_CC\" works... $ECHO_C" >&6
+
+	cf_save_crossed=$cross_compiling
+	cf_save_ac_link=$ac_link
+	cross_compiling=no
+	ac_link='$BUILD_CC -o "conftest$ac_exeext" $BUILD_CFLAGS $BUILD_CPPFLAGS $BUILD_LDFLAGS "conftest.$ac_ext" $BUILD_LIBS >&5'
+
+	if test "$cross_compiling" = yes; then
+  cf_ok_build_cc=unknown
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 4306 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+		int main(int argc, char *argv[])
+		{
+			${cf_cv_main_return:-return}(argc < 0 || argv == 0 || argv[0] == 0);
+		}
+
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:4316: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:4319: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:4321: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:4324: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_ok_build_cc=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_ok_build_cc=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+
+	cross_compiling=$cf_save_crossed
+	ac_link=$cf_save_ac_link
+
+	echo "$as_me:4339: result: $cf_ok_build_cc" >&5
+echo "${ECHO_T}$cf_ok_build_cc" >&6
+
+	if test "$cf_ok_build_cc" != yes
+	then
+		{ { echo "$as_me:4344: error: Cross-build requires two compilers.
+Use --with-build-cc to specify the native compiler." >&5
+echo "$as_me: error: Cross-build requires two compilers.
+Use --with-build-cc to specify the native compiler." >&2;}
+   { (exit 1); exit 1; }; }
+	fi
+
+else
+	: ${BUILD_CC:='${CC}'}
+	: ${BUILD_CPP:='${CPP}'}
+	: ${BUILD_CFLAGS:='${CFLAGS}'}
+	: ${BUILD_CPPFLAGS:='${CPPFLAGS}'}
+	: ${BUILD_LDFLAGS:='${LDFLAGS}'}
+	: ${BUILD_LIBS:='${LIBS}'}
+	: ${BUILD_EXEEXT:='$x'}
+	: ${BUILD_OBJEXT:='o'}
+fi
+
+###############################################################################
+
+### Options to allow the user to specify the set of libraries which are used.
+### Use "--without-normal --with-shared" to allow the default model to be
+### shared, for example.
+cf_list_models=""
+
+echo "$as_me:4369: checking if you want to build shared C-objects" >&5
+echo $ECHO_N "checking if you want to build shared C-objects... $ECHO_C" >&6
+
+# Check whether --with-shared or --without-shared was given.
+if test "${with_shared+set}" = set; then
+  withval="$with_shared"
+  with_shared=$withval
+else
+  with_shared=no
+fi;
+echo "$as_me:4379: result: $with_shared" >&5
+echo "${ECHO_T}$with_shared" >&6
+test "$with_shared" = "yes" && cf_list_models="$cf_list_models shared"
+
+echo "$as_me:4383: checking for specified models" >&5
+echo $ECHO_N "checking for specified models... $ECHO_C" >&6
+test -z "$cf_list_models" && cf_list_models=normal
+echo "$as_me:4386: result: $cf_list_models" >&5
+echo "${ECHO_T}$cf_list_models" >&6
+
+### Use the first model as the default, and save its suffix for use in building
+### up test-applications.
+echo "$as_me:4391: checking for default model" >&5
+echo $ECHO_N "checking for default model... $ECHO_C" >&6
+DFT_LWR_MODEL=`echo "$cf_list_models" | $AWK '{print $1}'`
+echo "$as_me:4394: result: $DFT_LWR_MODEL" >&5
+echo "${ECHO_T}$DFT_LWR_MODEL" >&6
+
+DFT_UPR_MODEL=`echo "$DFT_LWR_MODEL" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+echo "$as_me:4399: checking for specific curses-directory" >&5
+echo $ECHO_N "checking for specific curses-directory... $ECHO_C" >&6
+
+# Check whether --with-curses-dir or --without-curses-dir was given.
+if test "${with_curses_dir+set}" = set; then
+  withval="$with_curses_dir"
+  cf_cv_curses_dir=$withval
+else
+  cf_cv_curses_dir=no
+fi;
+echo "$as_me:4409: result: $cf_cv_curses_dir" >&5
+echo "${ECHO_T}$cf_cv_curses_dir" >&6
+
+if test -n "$cf_cv_curses_dir" && test "$cf_cv_curses_dir" != "no"
+then
+
+if test "x$prefix" != xNONE; then
+	cf_path_syntax="$prefix"
+else
+	cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$withval" in
+(.\$\(*\)*|.\'*\'*)
+	;;
+(..|./*|.\\*)
+	;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+	;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+	eval withval="$withval"
+	case ".$withval" in
+	(.NONE/*)
+		withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%`
+		;;
+	esac
+	;;
+(.no|.NONE/*)
+	withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%`
+	;;
+(*)
+	{ { echo "$as_me:4440: error: expected a pathname, not \"$withval\"" >&5
+echo "$as_me: error: expected a pathname, not \"$withval\"" >&2;}
+   { (exit 1); exit 1; }; }
+	;;
+esac
+
+	if test -d "$cf_cv_curses_dir"
+	then
+
+if test -n "$cf_cv_curses_dir/include" ; then
+  for cf_add_incdir in $cf_cv_curses_dir/include
+  do
+	while test "$cf_add_incdir" != /usr/include
+	do
+	  if test -d "$cf_add_incdir"
+	  then
+		cf_have_incdir=no
+		if test -n "$CFLAGS$CPPFLAGS" ; then
+		  # a loop is needed to ensure we can add subdirs of existing dirs
+		  for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+			if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+			  cf_have_incdir=yes; break
+			fi
+		  done
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  if test "$cf_add_incdir" = /usr/local/include ; then
+			if test "$GCC" = yes
+			then
+			  cf_save_CPPFLAGS=$CPPFLAGS
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+			  cat >"conftest.$ac_ext" <<_ACEOF
+#line 4476 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:4488: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:4491: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:4494: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:4497: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+			  CPPFLAGS=$cf_save_CPPFLAGS
+			fi
+		  fi
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  test -n "$verbose" && echo "	adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:4514: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+		  CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+		  cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+		  test "$cf_top_incdir" = "$cf_add_incdir" && break
+		  cf_add_incdir="$cf_top_incdir"
+		else
+		  break
+		fi
+	  else
+		break
+	  fi
+	done
+  done
+fi
+
+if test -n "$cf_cv_curses_dir/lib" ; then
+	for cf_add_libdir in $cf_cv_curses_dir/lib
+	do
+		if test "$cf_add_libdir" = /usr/lib ; then
+			:
+		elif test -d "$cf_add_libdir"
+		then
+			cf_have_libdir=no
+			if test -n "$LDFLAGS$LIBS" ; then
+				# a loop is needed to ensure we can add subdirs of existing dirs
+				for cf_test_libdir in $LDFLAGS $LIBS ; do
+					if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+						cf_have_libdir=yes; break
+					fi
+				done
+			fi
+			if test "$cf_have_libdir" = no ; then
+				test -n "$verbose" && echo "	adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:4550: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+				LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+			fi
+		fi
+	done
+fi
+
+	fi
+fi
+
+cf_ncuconfig_root=ncurses
+cf_have_ncuconfig=no
+
+if test "x${PKG_CONFIG:=none}" != xnone; then
+	echo "$as_me:4565: checking pkg-config for $cf_ncuconfig_root" >&5
+echo $ECHO_N "checking pkg-config for $cf_ncuconfig_root... $ECHO_C" >&6
+	if "$PKG_CONFIG" --exists $cf_ncuconfig_root ; then
+		echo "$as_me:4568: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+		echo "$as_me:4571: checking if the $cf_ncuconfig_root package files work" >&5
+echo $ECHO_N "checking if the $cf_ncuconfig_root package files work... $ECHO_C" >&6
+		cf_have_ncuconfig=unknown
+
+		cf_save_CFLAGS="$CFLAGS"
+		cf_save_CPPFLAGS="$CPPFLAGS"
+		cf_save_LIBS="$LIBS"
+
+		cf_pkg_cflags="`$PKG_CONFIG --cflags $cf_ncuconfig_root`"
+		cf_pkg_libs="`$PKG_CONFIG --libs $cf_ncuconfig_root`"
+
+		# while -W for passing linker flags is prevalent, it is not "standard".
+		# At least one wrapper for c89/c99 (in Apple's xcode) has its own
+		# incompatible _and_ non-standard -W option which gives an error.  Work
+		# around that pitfall.
+		case "x${CC}@@${cf_pkg_libs}@${cf_pkg_cflags}" in
+		(x*c[89]9@@*-W*)
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_pkg_cflags
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_pkg_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+			cat >"conftest.$ac_ext" <<_ACEOF
+#line 4704 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+initscr(); mousemask(0,0); tigetstr((char *)0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:4716: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:4719: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:4722: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:4725: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  if test "$cross_compiling" = yes; then
+  cf_test_ncuconfig=maybe
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 4731 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+					int main(void)
+					{ const char *xx = curses_version(); return (xx == 0); }
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:4738: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:4741: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:4743: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:4746: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_test_ncuconfig=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_test_ncuconfig=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_test_ncuconfig=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+			CFLAGS="$cf_save_CFLAGS"
+			CPPFLAGS="$cf_save_CPPFLAGS"
+			LIBS="$cf_save_LIBS"
+
+			if test "x$cf_test_ncuconfig" != xyes; then
+				cf_temp=`echo "x$cf_pkg_cflags" | sed -e s/^x// -e 's/-W[^ 	]*//g'`
+				cf_pkg_cflags="$cf_temp"
+				cf_temp=`echo "x$cf_pkg_libs" | sed -e s/^x// -e 's/-W[^ 	]*//g'`
+				cf_pkg_libs="$cf_temp"
+			fi
+			;;
+		esac
+
+for cf_add_cflags in $cf_pkg_cflags
+do
+	case "x$cf_add_cflags" in
+	(x-[DU]*)
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CFLAGS" != "$cf_old_cflag" || break
+
+	CFLAGS="$cf_old_cflag"
+done
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CPPFLAGS" != "$cf_old_cflag" || break
+
+	CPPFLAGS="$cf_old_cflag"
+done
+
+		;;
+	esac
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_add_cflags
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+done
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_pkg_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 4920 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+initscr(); mousemask(0,0); tigetstr((char *)0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:4932: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:4935: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:4938: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:4941: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  if test "$cross_compiling" = yes; then
+  cf_have_ncuconfig=maybe
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 4947 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+				int main(void)
+				{ const char *xx = curses_version(); return (xx == 0); }
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:4954: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:4957: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:4959: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:4962: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_have_ncuconfig=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_ncuconfig=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_ncuconfig=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+		echo "$as_me:4979: result: $cf_have_ncuconfig" >&5
+echo "${ECHO_T}$cf_have_ncuconfig" >&6
+		test "$cf_have_ncuconfig" = maybe && cf_have_ncuconfig=yes
+		if test "$cf_have_ncuconfig" != "yes"
+		then
+			CPPFLAGS="$cf_save_CPPFLAGS"
+			LIBS="$cf_save_LIBS"
+			NCURSES_CONFIG_PKG=none
+		else
+
+cat >>confdefs.h <<\EOF
+#define NCURSES 1
+EOF
+
+			NCURSES_CONFIG_PKG=$cf_ncuconfig_root
+
+echo "$as_me:4995: checking for terminfo header" >&5
+echo $ECHO_N "checking for terminfo header... $ECHO_C" >&6
+if test "${cf_cv_term_header+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+case "${cf_cv_ncurses_header}" in
+(*/ncurses.h|*/ncursesw.h)
+	cf_term_header=`echo "$cf_cv_ncurses_header" | sed -e 's%ncurses[^.]*\.h$%term.h%'`
+	;;
+(*)
+	cf_term_header=term.h
+	;;
+esac
+
+for cf_test in $cf_term_header "ncurses/term.h" "ncursesw/term.h"
+do
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 5013 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <$cf_test>
+
+int
+main (void)
+{
+int x = auto_left_margin; (void)x
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:5028: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:5031: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:5034: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:5037: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+	cf_cv_term_header="$cf_test"
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+	cf_cv_term_header=unknown
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+	test "$cf_cv_term_header" != unknown && break
+done
+
+fi
+echo "$as_me:5053: result: $cf_cv_term_header" >&5
+echo "${ECHO_T}$cf_cv_term_header" >&6
+
+# Set definitions to allow ifdef'ing to accommodate subdirectories
+
+case "$cf_cv_term_header" in
+(*term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_TERM_H 1
+EOF
+
+	;;
+esac
+
+case "$cf_cv_term_header" in
+(ncurses/term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSES_TERM_H 1
+EOF
+
+	;;
+(ncursesw/term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSESW_TERM_H 1
+EOF
+
+	;;
+esac
+
+		fi
+
+	else
+		echo "$as_me:5088: result: no" >&5
+echo "${ECHO_T}no" >&6
+		NCURSES_CONFIG_PKG=none
+	fi
+else
+	NCURSES_CONFIG_PKG=none
+fi
+
+if test "x$cf_have_ncuconfig" = "xno"; then
+	cf_ncurses_config="${cf_ncuconfig_root}${NCURSES_CONFIG_SUFFIX}-config"; echo "Looking for ${cf_ncurses_config}"
+
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in ${cf_ncurses_config} ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}5-config
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:5104: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_NCURSES_CONFIG+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$NCURSES_CONFIG"; then
+  ac_cv_prog_NCURSES_CONFIG="$NCURSES_CONFIG" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_NCURSES_CONFIG="$ac_tool_prefix$ac_prog"
+echo "$as_me:5119: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+NCURSES_CONFIG=$ac_cv_prog_NCURSES_CONFIG
+if test -n "$NCURSES_CONFIG"; then
+  echo "$as_me:5127: result: $NCURSES_CONFIG" >&5
+echo "${ECHO_T}$NCURSES_CONFIG" >&6
+else
+  echo "$as_me:5130: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    test -n "$NCURSES_CONFIG" && break
+  done
+fi
+if test -z "$NCURSES_CONFIG"; then
+  ac_ct_NCURSES_CONFIG=$NCURSES_CONFIG
+  for ac_prog in ${cf_ncurses_config} ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}5-config
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:5143: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_NCURSES_CONFIG+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_NCURSES_CONFIG"; then
+  ac_cv_prog_ac_ct_NCURSES_CONFIG="$ac_ct_NCURSES_CONFIG" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ac_ct_NCURSES_CONFIG="$ac_prog"
+echo "$as_me:5158: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+ac_ct_NCURSES_CONFIG=$ac_cv_prog_ac_ct_NCURSES_CONFIG
+if test -n "$ac_ct_NCURSES_CONFIG"; then
+  echo "$as_me:5166: result: $ac_ct_NCURSES_CONFIG" >&5
+echo "${ECHO_T}$ac_ct_NCURSES_CONFIG" >&6
+else
+  echo "$as_me:5169: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$ac_ct_NCURSES_CONFIG" && break
+done
+test -n "$ac_ct_NCURSES_CONFIG" || ac_ct_NCURSES_CONFIG="none"
+
+  NCURSES_CONFIG=$ac_ct_NCURSES_CONFIG
+fi
+
+	if test "$NCURSES_CONFIG" != none ; then
+
+for cf_add_cflags in `$NCURSES_CONFIG --cflags`
+do
+	case "x$cf_add_cflags" in
+	(x-[DU]*)
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CFLAGS" != "$cf_old_cflag" || break
+
+	CFLAGS="$cf_old_cflag"
+done
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CPPFLAGS" != "$cf_old_cflag" || break
+
+	CPPFLAGS="$cf_old_cflag"
+done
+
+		;;
+	esac
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_add_cflags
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+done
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in `$NCURSES_CONFIG --libs`; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+		# even with config script, some packages use no-override for curses.h
+
+echo "$as_me:5326: checking if we have identified curses headers" >&5
+echo $ECHO_N "checking if we have identified curses headers... $ECHO_C" >&6
+if test "${cf_cv_ncurses_header+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cf_cv_ncurses_header=none
+for cf_header in \
+	ncurses.h ncurses/ncurses.h \
+	curses.h ncurses/curses.h
+do
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 5338 "configure"
+#include "confdefs.h"
+#include <${cf_header}>
+int
+main (void)
+{
+initscr(); tgoto("?", 0,0)
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:5350: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:5353: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:5356: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:5359: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_ncurses_header=$cf_header; break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+done
+
+fi
+echo "$as_me:5370: result: $cf_cv_ncurses_header" >&5
+echo "${ECHO_T}$cf_cv_ncurses_header" >&6
+
+if test "$cf_cv_ncurses_header" = none ; then
+	{ { echo "$as_me:5374: error: No curses header-files found" >&5
+echo "$as_me: error: No curses header-files found" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+# cheat, to get the right #define's for HAVE_NCURSES_H, etc.
+
+for ac_header in $cf_cv_ncurses_header
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:5384: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 5390 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:5394: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:5400: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:5419: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+cat >>confdefs.h <<\EOF
+#define NCURSES 1
+EOF
+
+cf_nculib_ROOT=`echo "HAVE_LIB$cf_ncuconfig_root" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+		cat >>confdefs.h <<EOF
+#define $cf_nculib_ROOT 1
+EOF
+
+				cf_cv_ncurses_version="`$NCURSES_CONFIG --version`"
+
+	else
+
+cf_ncuhdr_root=ncurses
+
+test -n "$cf_cv_curses_dir" && \
+test "$cf_cv_curses_dir" != "no" && { \
+
+if test -n "$cf_cv_curses_dir/include/$cf_ncuhdr_root" ; then
+  for cf_add_incdir in $cf_cv_curses_dir/include/$cf_ncuhdr_root
+  do
+	while test "$cf_add_incdir" != /usr/include
+	do
+	  if test -d "$cf_add_incdir"
+	  then
+		cf_have_incdir=no
+		if test -n "$CFLAGS$CPPFLAGS" ; then
+		  # a loop is needed to ensure we can add subdirs of existing dirs
+		  for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+			if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+			  cf_have_incdir=yes; break
+			fi
+		  done
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  if test "$cf_add_incdir" = /usr/local/include ; then
+			if test "$GCC" = yes
+			then
+			  cf_save_CPPFLAGS=$CPPFLAGS
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+			  cat >"conftest.$ac_ext" <<_ACEOF
+#line 5475 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:5487: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:5490: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:5493: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:5496: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+			  CPPFLAGS=$cf_save_CPPFLAGS
+			fi
+		  fi
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  test -n "$verbose" && echo "	adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:5513: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+		  CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+		  cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+		  test "$cf_top_incdir" = "$cf_add_incdir" && break
+		  cf_add_incdir="$cf_top_incdir"
+		else
+		  break
+		fi
+	  else
+		break
+	  fi
+	done
+  done
+fi
+
+}
+
+echo "$as_me:5532: checking for $cf_ncuhdr_root header in include-path" >&5
+echo $ECHO_N "checking for $cf_ncuhdr_root header in include-path... $ECHO_C" >&6
+if test "${cf_cv_ncurses_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cf_header_list="$cf_ncuhdr_root/curses.h $cf_ncuhdr_root/ncurses.h"
+	{ test "$cf_ncuhdr_root" = ncurses || test "$cf_ncuhdr_root" = ncursesw; } && cf_header_list="$cf_header_list curses.h ncurses.h"
+	for cf_header in $cf_header_list
+	do
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 5544 "configure"
+#include "confdefs.h"
+
+#include <$cf_header>
+int
+main (void)
+{
+
+#ifdef NCURSES_VERSION
+
+printf("%s\\n", NCURSES_VERSION);
+#else
+#ifdef __NCURSES_H
+printf("old\\n");
+#else
+	make an error
+#endif
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:5568: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:5571: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:5574: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:5577: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_ncurses_h=$cf_header
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_ncurses_h=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+		test "$cf_cv_ncurses_h" != no && break
+	done
+
+fi
+echo "$as_me:5592: result: $cf_cv_ncurses_h" >&5
+echo "${ECHO_T}$cf_cv_ncurses_h" >&6
+
+if test "$cf_cv_ncurses_h" != no ; then
+	cf_cv_ncurses_header=$cf_cv_ncurses_h
+else
+
+echo "$as_me:5599: checking for $cf_ncuhdr_root include-path" >&5
+echo $ECHO_N "checking for $cf_ncuhdr_root include-path... $ECHO_C" >&6
+if test "${cf_cv_ncurses_h2+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	test -n "$verbose" && echo
+
+cf_search=
+
+# collect the current set of include-directories from compiler flags
+cf_header_path_list=""
+if test -n "${CFLAGS}${CPPFLAGS}" ; then
+	for cf_header_path in $CPPFLAGS $CFLAGS
+	do
+		case "$cf_header_path" in
+		(-I*)
+			cf_header_path=`echo ".$cf_header_path" |sed -e 's/^...//' -e 's,/include$,,'`
+
+test "x$cf_header_path" != "xNONE" && \
+test -d "$cf_header_path" && \
+ {
+	test -n "$verbose" && echo "	... testing for include-directories under $cf_header_path"
+	test -d "$cf_header_path/include" &&          cf_search="$cf_search $cf_header_path/include"
+	test -d "$cf_header_path/include/$cf_ncuhdr_root" &&       cf_search="$cf_search $cf_header_path/include/$cf_ncuhdr_root"
+	test -d "$cf_header_path/include/$cf_ncuhdr_root/include" &&    cf_search="$cf_search $cf_header_path/include/$cf_ncuhdr_root/include"
+	test -d "$cf_header_path/$cf_ncuhdr_root/include" &&       cf_search="$cf_search $cf_header_path/$cf_ncuhdr_root/include"
+	test -d "$cf_header_path/$cf_ncuhdr_root/include/$cf_ncuhdr_root" &&    cf_search="$cf_search $cf_header_path/$cf_ncuhdr_root/include/$cf_ncuhdr_root"
+}
+
+			cf_header_path_list="$cf_header_path_list $cf_search"
+			;;
+		esac
+	done
+fi
+
+# add the variations for the package we are looking for
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+	test -n "$verbose" && echo "	... testing for include-directories under $prefix"
+	test -d "$prefix/include" &&          cf_search="$cf_search $prefix/include"
+	test -d "$prefix/include/$cf_ncuhdr_root" &&       cf_search="$cf_search $prefix/include/$cf_ncuhdr_root"
+	test -d "$prefix/include/$cf_ncuhdr_root/include" &&    cf_search="$cf_search $prefix/include/$cf_ncuhdr_root/include"
+	test -d "$prefix/$cf_ncuhdr_root/include" &&       cf_search="$cf_search $prefix/$cf_ncuhdr_root/include"
+	test -d "$prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root" &&    cf_search="$cf_search $prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root"
+}
+
+for cf_subdir_prefix in \
+	/usr \
+	/usr/local \
+	/usr/pkg \
+	/opt \
+	/opt/local \
+	$HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+	test -n "$verbose" && echo "	... testing for include-directories under $cf_subdir_prefix"
+	test -d "$cf_subdir_prefix/include" &&          cf_search="$cf_search $cf_subdir_prefix/include"
+	test -d "$cf_subdir_prefix/include/$cf_ncuhdr_root" &&       cf_search="$cf_search $cf_subdir_prefix/include/$cf_ncuhdr_root"
+	test -d "$cf_subdir_prefix/include/$cf_ncuhdr_root/include" &&    cf_search="$cf_search $cf_subdir_prefix/include/$cf_ncuhdr_root/include"
+	test -d "$cf_subdir_prefix/$cf_ncuhdr_root/include" &&       cf_search="$cf_search $cf_subdir_prefix/$cf_ncuhdr_root/include"
+	test -d "$cf_subdir_prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root" &&    cf_search="$cf_search $cf_subdir_prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root"
+}
+
+done
+
+test "$includedir" != NONE && \
+test "$includedir" != "/usr/include" && \
+test -d "$includedir" && {
+	test -d "$includedir" &&    cf_search="$cf_search $includedir"
+	test -d "$includedir/$cf_ncuhdr_root" && cf_search="$cf_search $includedir/$cf_ncuhdr_root"
+}
+
+test "$oldincludedir" != NONE && \
+test "$oldincludedir" != "/usr/include" && \
+test -d "$oldincludedir" && {
+	test -d "$oldincludedir"    && cf_search="$cf_search $oldincludedir"
+	test -d "$oldincludedir/$cf_ncuhdr_root" && cf_search="$cf_search $oldincludedir/$cf_ncuhdr_root"
+}
+
+cf_search="$cf_search $cf_header_path_list"
+
+	test -n "$verbose" && echo "search path $cf_search"
+	cf_save2_CPPFLAGS="$CPPFLAGS"
+	for cf_incdir in $cf_search
+	do
+
+if test -n "$cf_incdir" ; then
+  for cf_add_incdir in $cf_incdir
+  do
+	while test "$cf_add_incdir" != /usr/include
+	do
+	  if test -d "$cf_add_incdir"
+	  then
+		cf_have_incdir=no
+		if test -n "$CFLAGS$CPPFLAGS" ; then
+		  # a loop is needed to ensure we can add subdirs of existing dirs
+		  for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+			if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+			  cf_have_incdir=yes; break
+			fi
+		  done
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  if test "$cf_add_incdir" = /usr/local/include ; then
+			if test "$GCC" = yes
+			then
+			  cf_save_CPPFLAGS=$CPPFLAGS
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+			  cat >"conftest.$ac_ext" <<_ACEOF
+#line 5720 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:5732: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:5735: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:5738: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:5741: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+			  CPPFLAGS=$cf_save_CPPFLAGS
+			fi
+		  fi
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  test -n "$verbose" && echo "	adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:5758: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+		  CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+		  cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+		  test "$cf_top_incdir" = "$cf_add_incdir" && break
+		  cf_add_incdir="$cf_top_incdir"
+		else
+		  break
+		fi
+	  else
+		break
+	  fi
+	done
+  done
+fi
+
+		for cf_header in \
+			ncurses.h \
+			curses.h
+		do
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 5781 "configure"
+#include "confdefs.h"
+
+#include <$cf_header>
+int
+main (void)
+{
+
+#ifdef NCURSES_VERSION
+
+printf("%s\\n", NCURSES_VERSION);
+#else
+#ifdef __NCURSES_H
+printf("old\\n");
+#else
+	make an error
+#endif
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:5805: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:5808: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:5811: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:5814: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_ncurses_h2=$cf_header
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_ncurses_h2=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+			if test "$cf_cv_ncurses_h2" != no ; then
+				cf_cv_ncurses_h2=$cf_incdir/$cf_header
+				test -n "$verbose" && echo $ECHO_N "	... found $ECHO_C" 1>&6
+				break
+			fi
+			test -n "$verbose" && echo "	... tested $cf_incdir/$cf_header" 1>&6
+		done
+		CPPFLAGS="$cf_save2_CPPFLAGS"
+		test "$cf_cv_ncurses_h2" != no && break
+	done
+	test "$cf_cv_ncurses_h2" = no && { { echo "$as_me:5835: error: not found" >&5
+echo "$as_me: error: not found" >&2;}
+   { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:5840: result: $cf_cv_ncurses_h2" >&5
+echo "${ECHO_T}$cf_cv_ncurses_h2" >&6
+
+	cf_1st_incdir=`echo "$cf_cv_ncurses_h2" | sed -e 's%/[^/]*$%%'`
+	cf_cv_ncurses_header="`basename "$cf_cv_ncurses_h2"`"
+	if test "`basename "$cf_1st_incdir"`" = "$cf_ncuhdr_root" ; then
+		cf_cv_ncurses_header="$cf_ncuhdr_root/$cf_cv_ncurses_header"
+	fi
+
+if test -n "$cf_1st_incdir" ; then
+  for cf_add_incdir in $cf_1st_incdir
+  do
+	while test "$cf_add_incdir" != /usr/include
+	do
+	  if test -d "$cf_add_incdir"
+	  then
+		cf_have_incdir=no
+		if test -n "$CFLAGS$CPPFLAGS" ; then
+		  # a loop is needed to ensure we can add subdirs of existing dirs
+		  for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+			if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+			  cf_have_incdir=yes; break
+			fi
+		  done
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  if test "$cf_add_incdir" = /usr/local/include ; then
+			if test "$GCC" = yes
+			then
+			  cf_save_CPPFLAGS=$CPPFLAGS
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+			  cat >"conftest.$ac_ext" <<_ACEOF
+#line 5876 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:5888: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:5891: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:5894: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:5897: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+			  CPPFLAGS=$cf_save_CPPFLAGS
+			fi
+		  fi
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  test -n "$verbose" && echo "	adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:5914: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+		  CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+		  cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+		  test "$cf_top_incdir" = "$cf_add_incdir" && break
+		  cf_add_incdir="$cf_top_incdir"
+		else
+		  break
+		fi
+	  else
+		break
+	  fi
+	done
+  done
+fi
+
+fi
+
+# Set definitions to allow ifdef'ing for ncurses.h
+
+case "$cf_cv_ncurses_header" in
+(*ncurses.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSES_H 1
+EOF
+
+	;;
+esac
+
+case "$cf_cv_ncurses_header" in
+(ncurses/curses.h|ncurses/ncurses.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSES_NCURSES_H 1
+EOF
+
+	;;
+(ncursesw/curses.h|ncursesw/ncurses.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSESW_NCURSES_H 1
+EOF
+
+	;;
+esac
+
+echo "$as_me:5962: checking for terminfo header" >&5
+echo $ECHO_N "checking for terminfo header... $ECHO_C" >&6
+if test "${cf_cv_term_header+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+case "${cf_cv_ncurses_header}" in
+(*/ncurses.h|*/ncursesw.h)
+	cf_term_header=`echo "$cf_cv_ncurses_header" | sed -e 's%ncurses[^.]*\.h$%term.h%'`
+	;;
+(*)
+	cf_term_header=term.h
+	;;
+esac
+
+for cf_test in $cf_term_header "ncurses/term.h" "ncursesw/term.h"
+do
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 5980 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <$cf_test>
+
+int
+main (void)
+{
+int x = auto_left_margin; (void)x
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:5995: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:5998: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:6001: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:6004: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+	cf_cv_term_header="$cf_test"
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+	cf_cv_term_header=unknown
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+	test "$cf_cv_term_header" != unknown && break
+done
+
+fi
+echo "$as_me:6020: result: $cf_cv_term_header" >&5
+echo "${ECHO_T}$cf_cv_term_header" >&6
+
+# Set definitions to allow ifdef'ing to accommodate subdirectories
+
+case "$cf_cv_term_header" in
+(*term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_TERM_H 1
+EOF
+
+	;;
+esac
+
+case "$cf_cv_term_header" in
+(ncurses/term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSES_TERM_H 1
+EOF
+
+	;;
+(ncursesw/term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSESW_TERM_H 1
+EOF
+
+	;;
+esac
+
+# some applications need this, but should check for NCURSES_VERSION
+
+cat >>confdefs.h <<\EOF
+#define NCURSES 1
+EOF
+
+echo "$as_me:6058: checking for ncurses version" >&5
+echo $ECHO_N "checking for ncurses version... $ECHO_C" >&6
+if test "${cf_cv_ncurses_version+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cf_cv_ncurses_version=no
+	cf_tempfile=out$$
+	rm -f "$cf_tempfile"
+	if test "$cross_compiling" = yes; then
+
+	# This will not work if the preprocessor splits the line after the
+	# Autoconf token.  The 'unproto' program does that.
+	cat > "conftest.$ac_ext" <<EOF
+#include <${cf_cv_ncurses_header:-curses.h}>
+#undef Autoconf
+#ifdef NCURSES_VERSION
+Autoconf NCURSES_VERSION
+#else
+#ifdef __NCURSES_H
+Autoconf "old"
+#endif
+;
+#endif
+EOF
+	cf_try="$ac_cpp conftest.$ac_ext 2>&5 | grep '^Autoconf ' >conftest.out"
+	{ (eval echo "$as_me:6084: \"$cf_try\"") >&5
+  (eval $cf_try) 2>&5
+  ac_status=$?
+  echo "$as_me:6087: \$? = $ac_status" >&5
+  (exit "$ac_status"); }
+	if test -f conftest.out ; then
+		cf_out=`sed -e 's%^Autoconf %%' -e 's%^[^"]*"%%' -e 's%".*%%' conftest.out`
+		test -n "$cf_out" && cf_cv_ncurses_version="$cf_out"
+		rm -f conftest.out
+	fi
+
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 6097 "configure"
+#include "confdefs.h"
+
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <stdio.h>
+int main(void)
+{
+	FILE *fp = fopen("$cf_tempfile", "w");
+#ifdef NCURSES_VERSION
+# ifdef NCURSES_VERSION_PATCH
+	fprintf(fp, "%s.%d\\n", NCURSES_VERSION, NCURSES_VERSION_PATCH);
+# else
+	fprintf(fp, "%s\\n", NCURSES_VERSION);
+# endif
+#else
+# ifdef __NCURSES_H
+	fprintf(fp, "old\\n");
+# else
+	make an error
+# endif
+#endif
+	${cf_cv_main_return:-return}(0);
+}
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:6122: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:6125: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:6127: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:6130: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+	cf_cv_ncurses_version=`cat $cf_tempfile`
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+	rm -f "$cf_tempfile"
+
+fi
+echo "$as_me:6144: result: $cf_cv_ncurses_version" >&5
+echo "${ECHO_T}$cf_cv_ncurses_version" >&6
+test "$cf_cv_ncurses_version" = no ||
+cat >>confdefs.h <<\EOF
+#define NCURSES 1
+EOF
+
+cf_nculib_root=ncurses
+	# This works, except for the special case where we find gpm, but
+	# ncurses is in a nonstandard location via $LIBS, and we really want
+	# to link gpm.
+cf_ncurses_LIBS=""
+cf_ncurses_SAVE="$LIBS"
+echo "$as_me:6157: checking for Gpm_Open in -lgpm" >&5
+echo $ECHO_N "checking for Gpm_Open in -lgpm... $ECHO_C" >&6
+if test "${ac_cv_lib_gpm_Gpm_Open+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lgpm  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 6165 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char Gpm_Open ();
+int
+main (void)
+{
+Gpm_Open ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:6184: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:6187: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:6190: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:6193: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_gpm_Gpm_Open=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_gpm_Gpm_Open=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:6204: result: $ac_cv_lib_gpm_Gpm_Open" >&5
+echo "${ECHO_T}$ac_cv_lib_gpm_Gpm_Open" >&6
+if test "$ac_cv_lib_gpm_Gpm_Open" = yes; then
+  echo "$as_me:6207: checking for initscr in -lgpm" >&5
+echo $ECHO_N "checking for initscr in -lgpm... $ECHO_C" >&6
+if test "${ac_cv_lib_gpm_initscr+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lgpm  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 6215 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char initscr ();
+int
+main (void)
+{
+initscr ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:6234: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:6237: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:6240: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:6243: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_gpm_initscr=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_gpm_initscr=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:6254: result: $ac_cv_lib_gpm_initscr" >&5
+echo "${ECHO_T}$ac_cv_lib_gpm_initscr" >&6
+if test "$ac_cv_lib_gpm_initscr" = yes; then
+  LIBS="$cf_ncurses_SAVE"
+else
+  cf_ncurses_LIBS="-lgpm"
+fi
+
+fi
+
+case "$host_os" in
+(freebsd*)
+	# This is only necessary if you are linking against an obsolete
+	# version of ncurses (but it should do no harm, since it is static).
+	if test "$cf_nculib_root" = ncurses ; then
+		echo "$as_me:6269: checking for tgoto in -lmytinfo" >&5
+echo $ECHO_N "checking for tgoto in -lmytinfo... $ECHO_C" >&6
+if test "${ac_cv_lib_mytinfo_tgoto+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lmytinfo  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 6277 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char tgoto ();
+int
+main (void)
+{
+tgoto ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:6296: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:6299: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:6302: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:6305: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_mytinfo_tgoto=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_mytinfo_tgoto=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:6316: result: $ac_cv_lib_mytinfo_tgoto" >&5
+echo "${ECHO_T}$ac_cv_lib_mytinfo_tgoto" >&6
+if test "$ac_cv_lib_mytinfo_tgoto" = yes; then
+  cf_ncurses_LIBS="-lmytinfo $cf_ncurses_LIBS"
+fi
+
+	fi
+	;;
+esac
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_ncurses_LIBS; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+if test -n "$cf_cv_curses_dir" && test "$cf_cv_curses_dir" != "no"
+then
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -l$cf_nculib_root; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+else
+
+	eval 'cf_cv_have_lib_'"$cf_nculib_root"'=no'
+	cf_libdir=""
+	echo "$as_me:6365: checking for initscr" >&5
+echo $ECHO_N "checking for initscr... $ECHO_C" >&6
+if test "${ac_cv_func_initscr+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 6371 "configure"
+#include "confdefs.h"
+#define initscr autoconf_temporary
+#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
+#undef initscr
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char initscr (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_initscr) || defined (__stub___initscr)
+#error found stub for initscr
+#endif
+
+	return initscr ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:6402: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:6405: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:6408: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:6411: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_func_initscr=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_initscr=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:6421: result: $ac_cv_func_initscr" >&5
+echo "${ECHO_T}$ac_cv_func_initscr" >&6
+if test "$ac_cv_func_initscr" = yes; then
+  eval 'cf_cv_have_lib_'"$cf_nculib_root"'=yes'
+else
+
+		cf_save_LIBS="$LIBS"
+		echo "$as_me:6428: checking for initscr in -l$cf_nculib_root" >&5
+echo $ECHO_N "checking for initscr in -l$cf_nculib_root... $ECHO_C" >&6
+		LIBS="-l$cf_nculib_root $LIBS"
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 6432 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+initscr()
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:6444: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:6447: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:6450: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:6453: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  echo "$as_me:6455: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+			 eval 'cf_cv_have_lib_'"$cf_nculib_root"'=yes'
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+echo "$as_me:6462: result: no" >&5
+echo "${ECHO_T}no" >&6
+
+cf_search=
+cf_library_path_list=""
+if test -n "${LDFLAGS}${LIBS}" ; then
+	for cf_library_path in $LDFLAGS $LIBS
+	do
+		case "$cf_library_path" in
+		(-L*)
+			cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'`
+
+test "x$cf_library_path" != "xNONE" && \
+test -d "$cf_library_path" && \
+ {
+	test -n "$verbose" && echo "	... testing for lib-directories under $cf_library_path"
+	test -d "$cf_library_path/lib" &&          cf_search="$cf_search $cf_library_path/lib"
+	test -d "$cf_library_path/lib/$cf_nculib_root" &&       cf_search="$cf_search $cf_library_path/lib/$cf_nculib_root"
+	test -d "$cf_library_path/lib/$cf_nculib_root/lib" &&    cf_search="$cf_search $cf_library_path/lib/$cf_nculib_root/lib"
+	test -d "$cf_library_path/$cf_nculib_root/lib" &&       cf_search="$cf_search $cf_library_path/$cf_nculib_root/lib"
+	test -d "$cf_library_path/$cf_nculib_root/lib/$cf_nculib_root" &&    cf_search="$cf_search $cf_library_path/$cf_nculib_root/lib/$cf_nculib_root"
+}
+
+			cf_library_path_list="$cf_library_path_list $cf_search"
+			;;
+		esac
+	done
+fi
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+	test -n "$verbose" && echo "	... testing for lib-directories under $prefix"
+	test -d "$prefix/lib" &&          cf_search="$cf_search $prefix/lib"
+	test -d "$prefix/lib/$cf_nculib_root" &&       cf_search="$cf_search $prefix/lib/$cf_nculib_root"
+	test -d "$prefix/lib/$cf_nculib_root/lib" &&    cf_search="$cf_search $prefix/lib/$cf_nculib_root/lib"
+	test -d "$prefix/$cf_nculib_root/lib" &&       cf_search="$cf_search $prefix/$cf_nculib_root/lib"
+	test -d "$prefix/$cf_nculib_root/lib/$cf_nculib_root" &&    cf_search="$cf_search $prefix/$cf_nculib_root/lib/$cf_nculib_root"
+}
+
+for cf_subdir_prefix in \
+	/usr \
+	/usr/local \
+	/usr/pkg \
+	/opt \
+	/opt/local \
+	$HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+	test -n "$verbose" && echo "	... testing for lib-directories under $cf_subdir_prefix"
+	test -d "$cf_subdir_prefix/lib" &&          cf_search="$cf_search $cf_subdir_prefix/lib"
+	test -d "$cf_subdir_prefix/lib/$cf_nculib_root" &&       cf_search="$cf_search $cf_subdir_prefix/lib/$cf_nculib_root"
+	test -d "$cf_subdir_prefix/lib/$cf_nculib_root/lib" &&    cf_search="$cf_search $cf_subdir_prefix/lib/$cf_nculib_root/lib"
+	test -d "$cf_subdir_prefix/$cf_nculib_root/lib" &&       cf_search="$cf_search $cf_subdir_prefix/$cf_nculib_root/lib"
+	test -d "$cf_subdir_prefix/$cf_nculib_root/lib/$cf_nculib_root" &&    cf_search="$cf_search $cf_subdir_prefix/$cf_nculib_root/lib/$cf_nculib_root"
+}
+
+done
+
+cf_search="$cf_library_path_list $cf_search"
+
+			for cf_libdir in $cf_search
+			do
+				echo "$as_me:6530: checking for -l$cf_nculib_root in $cf_libdir" >&5
+echo $ECHO_N "checking for -l$cf_nculib_root in $cf_libdir... $ECHO_C" >&6
+				LIBS="-L$cf_libdir -l$cf_nculib_root $cf_save_LIBS"
+				cat >"conftest.$ac_ext" <<_ACEOF
+#line 6534 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+initscr()
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:6546: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:6549: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:6552: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:6555: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  echo "$as_me:6557: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+			 		 eval 'cf_cv_have_lib_'"$cf_nculib_root"'=yes'
+					 break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+echo "$as_me:6564: result: no" >&5
+echo "${ECHO_T}no" >&6
+					 LIBS="$cf_save_LIBS"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+			done
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+
+eval 'cf_found_library="$cf_cv_have_lib_'"$cf_nculib_root"\"
+
+if test "$cf_found_library" = no ; then
+	{ { echo "$as_me:6579: error: Cannot link $cf_nculib_root library" >&5
+echo "$as_me: error: Cannot link $cf_nculib_root library" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+fi
+
+if test -n "$cf_ncurses_LIBS" ; then
+	echo "$as_me:6587: checking if we can link $cf_nculib_root without $cf_ncurses_LIBS" >&5
+echo $ECHO_N "checking if we can link $cf_nculib_root without $cf_ncurses_LIBS... $ECHO_C" >&6
+	cf_ncurses_SAVE="$LIBS"
+	for p in $cf_ncurses_LIBS ; do
+		q=`echo "$LIBS" | sed -e "s%$p %%" -e "s%$p$%%"`
+		if test "$q" != "$LIBS" ; then
+			LIBS="$q"
+		fi
+	done
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 6597 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+initscr(); mousemask(0,0); tigetstr((char *)0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:6609: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:6612: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:6615: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:6618: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  echo "$as_me:6620: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+echo "$as_me:6625: result: no" >&5
+echo "${ECHO_T}no" >&6
+		 LIBS="$cf_ncurses_SAVE"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+
+cf_nculib_ROOT=`echo "HAVE_LIB$cf_nculib_root" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+cat >>confdefs.h <<EOF
+#define $cf_nculib_ROOT 1
+EOF
+
+	fi
+else
+	NCURSES_CONFIG=none
+fi
+
+echo "$as_me:6643: checking if you want wide-character code" >&5
+echo $ECHO_N "checking if you want wide-character code... $ECHO_C" >&6
+
+# Check whether --enable-widec or --disable-widec was given.
+if test "${enable_widec+set}" = set; then
+  enableval="$enable_widec"
+  with_widec=$enableval
+else
+  with_widec=no
+fi;
+echo "$as_me:6653: result: $with_widec" >&5
+echo "${ECHO_T}$with_widec" >&6
+if test "$with_widec" = yes ; then
+
+for ac_header in wchar.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:6660: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 6666 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:6670: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:6676: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:6695: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+echo "$as_me:6705: checking for multibyte character support" >&5
+echo $ECHO_N "checking for multibyte character support... $ECHO_C" >&6
+if test "${cf_cv_utf8_lib+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cf_save_LIBS="$LIBS"
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 6713 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#ifdef HAVE_WCHAR_H
+#include <wchar.h>
+#endif
+
+int
+main (void)
+{
+putwc(0,0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:6731: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:6734: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:6737: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:6740: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_utf8_lib=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+# If the linkage is not already in the $CPPFLAGS/$LDFLAGS configuration, these
+# will be set on completion of the AC_TRY_LINK below.
+cf_cv_header_path_utf8=
+cf_cv_library_path_utf8=
+
+echo "${as_me:-configure}:6752: testing Starting FIND_LINKAGE(utf8,) ..." 1>&5
+
+cf_save_LIBS="$LIBS"
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 6757 "configure"
+#include "confdefs.h"
+
+#include <libutf8.h>
+int
+main (void)
+{
+putwc(0,0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:6770: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:6773: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:6776: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:6779: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+	cf_cv_find_linkage_utf8=yes
+	cf_cv_header_path_utf8=/usr/include
+	cf_cv_library_path_utf8=/usr/lib
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+LIBS="-lutf8  $cf_save_LIBS"
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 6793 "configure"
+#include "confdefs.h"
+
+#include <libutf8.h>
+int
+main (void)
+{
+putwc(0,0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:6806: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:6809: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:6812: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:6815: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+	cf_cv_find_linkage_utf8=yes
+	cf_cv_header_path_utf8=/usr/include
+	cf_cv_library_path_utf8=/usr/lib
+	cf_cv_library_file_utf8="-lutf8"
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+	cf_cv_find_linkage_utf8=no
+	LIBS="$cf_save_LIBS"
+
+	test -n "$verbose" && echo "	find linkage for utf8 library" 1>&6
+
+echo "${as_me:-configure}:6832: testing find linkage for utf8 library ..." 1>&5
+
+echo "${as_me:-configure}:6834: testing Searching for headers in FIND_LINKAGE(utf8,) ..." 1>&5
+
+	cf_save_CPPFLAGS="$CPPFLAGS"
+	cf_test_CPPFLAGS="$CPPFLAGS"
+
+cf_search=
+
+# collect the current set of include-directories from compiler flags
+cf_header_path_list=""
+if test -n "${CFLAGS}${CPPFLAGS}" ; then
+	for cf_header_path in $CPPFLAGS $CFLAGS
+	do
+		case "$cf_header_path" in
+		(-I*)
+			cf_header_path=`echo ".$cf_header_path" |sed -e 's/^...//' -e 's,/include$,,'`
+
+test "x$cf_header_path" != "xNONE" && \
+test -d "$cf_header_path" && \
+ {
+	test -n "$verbose" && echo "	... testing for include-directories under $cf_header_path"
+	test -d "$cf_header_path/include" &&          cf_search="$cf_search $cf_header_path/include"
+	test -d "$cf_header_path/include/utf8" &&       cf_search="$cf_search $cf_header_path/include/utf8"
+	test -d "$cf_header_path/include/utf8/include" &&    cf_search="$cf_search $cf_header_path/include/utf8/include"
+	test -d "$cf_header_path/utf8/include" &&       cf_search="$cf_search $cf_header_path/utf8/include"
+	test -d "$cf_header_path/utf8/include/utf8" &&    cf_search="$cf_search $cf_header_path/utf8/include/utf8"
+}
+
+			cf_header_path_list="$cf_header_path_list $cf_search"
+			;;
+		esac
+	done
+fi
+
+# add the variations for the package we are looking for
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+	test -n "$verbose" && echo "	... testing for include-directories under $prefix"
+	test -d "$prefix/include" &&          cf_search="$cf_search $prefix/include"
+	test -d "$prefix/include/utf8" &&       cf_search="$cf_search $prefix/include/utf8"
+	test -d "$prefix/include/utf8/include" &&    cf_search="$cf_search $prefix/include/utf8/include"
+	test -d "$prefix/utf8/include" &&       cf_search="$cf_search $prefix/utf8/include"
+	test -d "$prefix/utf8/include/utf8" &&    cf_search="$cf_search $prefix/utf8/include/utf8"
+}
+
+for cf_subdir_prefix in \
+	/usr \
+	/usr/local \
+	/usr/pkg \
+	/opt \
+	/opt/local \
+	$HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+	test -n "$verbose" && echo "	... testing for include-directories under $cf_subdir_prefix"
+	test -d "$cf_subdir_prefix/include" &&          cf_search="$cf_search $cf_subdir_prefix/include"
+	test -d "$cf_subdir_prefix/include/utf8" &&       cf_search="$cf_search $cf_subdir_prefix/include/utf8"
+	test -d "$cf_subdir_prefix/include/utf8/include" &&    cf_search="$cf_search $cf_subdir_prefix/include/utf8/include"
+	test -d "$cf_subdir_prefix/utf8/include" &&       cf_search="$cf_search $cf_subdir_prefix/utf8/include"
+	test -d "$cf_subdir_prefix/utf8/include/utf8" &&    cf_search="$cf_search $cf_subdir_prefix/utf8/include/utf8"
+}
+
+done
+
+test "$includedir" != NONE && \
+test "$includedir" != "/usr/include" && \
+test -d "$includedir" && {
+	test -d "$includedir" &&    cf_search="$cf_search $includedir"
+	test -d "$includedir/utf8" && cf_search="$cf_search $includedir/utf8"
+}
+
+test "$oldincludedir" != NONE && \
+test "$oldincludedir" != "/usr/include" && \
+test -d "$oldincludedir" && {
+	test -d "$oldincludedir"    && cf_search="$cf_search $oldincludedir"
+	test -d "$oldincludedir/utf8" && cf_search="$cf_search $oldincludedir/utf8"
+}
+
+cf_search="$cf_search $cf_header_path_list"
+
+	for cf_cv_header_path_utf8 in $cf_search
+	do
+		if test -d "$cf_cv_header_path_utf8" ; then
+			test -n "$verbose" && echo "	... testing $cf_cv_header_path_utf8" 1>&6
+
+echo "${as_me:-configure}:6925: testing ... testing $cf_cv_header_path_utf8 ..." 1>&5
+
+			CPPFLAGS="$cf_save_CPPFLAGS"
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-I$cf_cv_header_path_utf8"
+
+			cat >"conftest.$ac_ext" <<_ACEOF
+#line 6933 "configure"
+#include "confdefs.h"
+
+#include <libutf8.h>
+int
+main (void)
+{
+putwc(0,0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:6946: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:6949: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:6952: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:6955: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+				test -n "$verbose" && echo "	... found utf8 headers in $cf_cv_header_path_utf8" 1>&6
+
+echo "${as_me:-configure}:6960: testing ... found utf8 headers in $cf_cv_header_path_utf8 ..." 1>&5
+
+				cf_cv_find_linkage_utf8=maybe
+				cf_test_CPPFLAGS="$CPPFLAGS"
+				break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+				CPPFLAGS="$cf_save_CPPFLAGS"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+		fi
+	done
+
+	if test "$cf_cv_find_linkage_utf8" = maybe ; then
+
+echo "${as_me:-configure}:6978: testing Searching for utf8 library in FIND_LINKAGE(utf8,) ..." 1>&5
+
+		cf_save_LIBS="$LIBS"
+		cf_save_LDFLAGS="$LDFLAGS"
+
+		if test "$cf_cv_find_linkage_utf8" != yes ; then
+
+cf_search=
+cf_library_path_list=""
+if test -n "${LDFLAGS}${LIBS}" ; then
+	for cf_library_path in $LDFLAGS $LIBS
+	do
+		case "$cf_library_path" in
+		(-L*)
+			cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'`
+
+test "x$cf_library_path" != "xNONE" && \
+test -d "$cf_library_path" && \
+ {
+	test -n "$verbose" && echo "	... testing for lib-directories under $cf_library_path"
+	test -d "$cf_library_path/lib" &&          cf_search="$cf_search $cf_library_path/lib"
+	test -d "$cf_library_path/lib/utf8" &&       cf_search="$cf_search $cf_library_path/lib/utf8"
+	test -d "$cf_library_path/lib/utf8/lib" &&    cf_search="$cf_search $cf_library_path/lib/utf8/lib"
+	test -d "$cf_library_path/utf8/lib" &&       cf_search="$cf_search $cf_library_path/utf8/lib"
+	test -d "$cf_library_path/utf8/lib/utf8" &&    cf_search="$cf_search $cf_library_path/utf8/lib/utf8"
+}
+
+			cf_library_path_list="$cf_library_path_list $cf_search"
+			;;
+		esac
+	done
+fi
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+	test -n "$verbose" && echo "	... testing for lib-directories under $prefix"
+	test -d "$prefix/lib" &&          cf_search="$cf_search $prefix/lib"
+	test -d "$prefix/lib/utf8" &&       cf_search="$cf_search $prefix/lib/utf8"
+	test -d "$prefix/lib/utf8/lib" &&    cf_search="$cf_search $prefix/lib/utf8/lib"
+	test -d "$prefix/utf8/lib" &&       cf_search="$cf_search $prefix/utf8/lib"
+	test -d "$prefix/utf8/lib/utf8" &&    cf_search="$cf_search $prefix/utf8/lib/utf8"
+}
+
+for cf_subdir_prefix in \
+	/usr \
+	/usr/local \
+	/usr/pkg \
+	/opt \
+	/opt/local \
+	$HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+	test -n "$verbose" && echo "	... testing for lib-directories under $cf_subdir_prefix"
+	test -d "$cf_subdir_prefix/lib" &&          cf_search="$cf_search $cf_subdir_prefix/lib"
+	test -d "$cf_subdir_prefix/lib/utf8" &&       cf_search="$cf_search $cf_subdir_prefix/lib/utf8"
+	test -d "$cf_subdir_prefix/lib/utf8/lib" &&    cf_search="$cf_search $cf_subdir_prefix/lib/utf8/lib"
+	test -d "$cf_subdir_prefix/utf8/lib" &&       cf_search="$cf_search $cf_subdir_prefix/utf8/lib"
+	test -d "$cf_subdir_prefix/utf8/lib/utf8" &&    cf_search="$cf_search $cf_subdir_prefix/utf8/lib/utf8"
+}
+
+done
+
+cf_search="$cf_library_path_list $cf_search"
+
+			for cf_cv_library_path_utf8 in $cf_search
+			do
+				if test -d "$cf_cv_library_path_utf8" ; then
+					test -n "$verbose" && echo "	... testing $cf_cv_library_path_utf8" 1>&6
+
+echo "${as_me:-configure}:7053: testing ... testing $cf_cv_library_path_utf8 ..." 1>&5
+
+					CPPFLAGS="$cf_test_CPPFLAGS"
+					LIBS="-lutf8  $cf_save_LIBS"
+					LDFLAGS="$cf_save_LDFLAGS -L$cf_cv_library_path_utf8"
+					cat >"conftest.$ac_ext" <<_ACEOF
+#line 7059 "configure"
+#include "confdefs.h"
+
+#include <libutf8.h>
+int
+main (void)
+{
+putwc(0,0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:7072: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:7075: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:7078: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:7081: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+					test -n "$verbose" && echo "	... found utf8 library in $cf_cv_library_path_utf8" 1>&6
+
+echo "${as_me:-configure}:7086: testing ... found utf8 library in $cf_cv_library_path_utf8 ..." 1>&5
+
+					cf_cv_find_linkage_utf8=yes
+					cf_cv_library_file_utf8="-lutf8"
+					break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+					CPPFLAGS="$cf_save_CPPFLAGS"
+					LIBS="$cf_save_LIBS"
+					LDFLAGS="$cf_save_LDFLAGS"
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+				fi
+			done
+			CPPFLAGS="$cf_save_CPPFLAGS"
+			LDFLAGS="$cf_save_LDFLAGS"
+		fi
+
+	else
+		cf_cv_find_linkage_utf8=no
+	fi
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+LIBS="$cf_save_LIBS"
+
+if test "$cf_cv_find_linkage_utf8" = yes ; then
+cf_cv_utf8_lib=add-on
+else
+cf_cv_utf8_lib=no
+fi
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:7128: result: $cf_cv_utf8_lib" >&5
+echo "${ECHO_T}$cf_cv_utf8_lib" >&6
+
+# HAVE_LIBUTF8_H is used by ncurses if curses.h is shared between
+# ncurses/ncursesw:
+if test "$cf_cv_utf8_lib" = "add-on" ; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_LIBUTF8_H 1
+EOF
+
+if test -n "$cf_cv_header_path_utf8" ; then
+  for cf_add_incdir in $cf_cv_header_path_utf8
+  do
+	while test "$cf_add_incdir" != /usr/include
+	do
+	  if test -d "$cf_add_incdir"
+	  then
+		cf_have_incdir=no
+		if test -n "$CFLAGS$CPPFLAGS" ; then
+		  # a loop is needed to ensure we can add subdirs of existing dirs
+		  for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+			if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+			  cf_have_incdir=yes; break
+			fi
+		  done
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  if test "$cf_add_incdir" = /usr/local/include ; then
+			if test "$GCC" = yes
+			then
+			  cf_save_CPPFLAGS=$CPPFLAGS
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+			  cat >"conftest.$ac_ext" <<_ACEOF
+#line 7166 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:7178: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:7181: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:7184: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:7187: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+			  CPPFLAGS=$cf_save_CPPFLAGS
+			fi
+		  fi
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  test -n "$verbose" && echo "	adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:7204: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+		  CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+		  cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+		  test "$cf_top_incdir" = "$cf_add_incdir" && break
+		  cf_add_incdir="$cf_top_incdir"
+		else
+		  break
+		fi
+	  else
+		break
+	  fi
+	done
+  done
+fi
+
+if test -n "$cf_cv_library_path_utf8" ; then
+	for cf_add_libdir in $cf_cv_library_path_utf8
+	do
+		if test "$cf_add_libdir" = /usr/lib ; then
+			:
+		elif test -d "$cf_add_libdir"
+		then
+			cf_have_libdir=no
+			if test -n "$LDFLAGS$LIBS" ; then
+				# a loop is needed to ensure we can add subdirs of existing dirs
+				for cf_test_libdir in $LDFLAGS $LIBS ; do
+					if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+						cf_have_libdir=yes; break
+					fi
+				done
+			fi
+			if test "$cf_have_libdir" = no ; then
+				test -n "$verbose" && echo "	adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:7240: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+				LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+			fi
+		fi
+	done
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_cv_library_file_utf8; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+fi
+
+cf_ncuconfig_root=ncursesw
+cf_have_ncuconfig=no
+
+if test "x${PKG_CONFIG:=none}" != xnone; then
+	echo "$as_me:7270: checking pkg-config for $cf_ncuconfig_root" >&5
+echo $ECHO_N "checking pkg-config for $cf_ncuconfig_root... $ECHO_C" >&6
+	if "$PKG_CONFIG" --exists $cf_ncuconfig_root ; then
+		echo "$as_me:7273: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+		echo "$as_me:7276: checking if the $cf_ncuconfig_root package files work" >&5
+echo $ECHO_N "checking if the $cf_ncuconfig_root package files work... $ECHO_C" >&6
+		cf_have_ncuconfig=unknown
+
+		cf_save_CFLAGS="$CFLAGS"
+		cf_save_CPPFLAGS="$CPPFLAGS"
+		cf_save_LIBS="$LIBS"
+
+		cf_pkg_cflags="`$PKG_CONFIG --cflags $cf_ncuconfig_root`"
+		cf_pkg_libs="`$PKG_CONFIG --libs $cf_ncuconfig_root`"
+
+		# while -W for passing linker flags is prevalent, it is not "standard".
+		# At least one wrapper for c89/c99 (in Apple's xcode) has its own
+		# incompatible _and_ non-standard -W option which gives an error.  Work
+		# around that pitfall.
+		case "x${CC}@@${cf_pkg_libs}@${cf_pkg_cflags}" in
+		(x*c[89]9@@*-W*)
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_pkg_cflags
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_pkg_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+			cat >"conftest.$ac_ext" <<_ACEOF
+#line 7409 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+initscr(); mousemask(0,0); tigetstr((char *)0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:7421: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:7424: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:7427: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:7430: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  if test "$cross_compiling" = yes; then
+  cf_test_ncuconfig=maybe
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 7436 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+					int main(void)
+					{ const char *xx = curses_version(); return (xx == 0); }
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:7443: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:7446: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:7448: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:7451: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_test_ncuconfig=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_test_ncuconfig=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_test_ncuconfig=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+			CFLAGS="$cf_save_CFLAGS"
+			CPPFLAGS="$cf_save_CPPFLAGS"
+			LIBS="$cf_save_LIBS"
+
+			if test "x$cf_test_ncuconfig" != xyes; then
+				cf_temp=`echo "x$cf_pkg_cflags" | sed -e s/^x// -e 's/-W[^ 	]*//g'`
+				cf_pkg_cflags="$cf_temp"
+				cf_temp=`echo "x$cf_pkg_libs" | sed -e s/^x// -e 's/-W[^ 	]*//g'`
+				cf_pkg_libs="$cf_temp"
+			fi
+			;;
+		esac
+
+for cf_add_cflags in $cf_pkg_cflags
+do
+	case "x$cf_add_cflags" in
+	(x-[DU]*)
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CFLAGS" != "$cf_old_cflag" || break
+
+	CFLAGS="$cf_old_cflag"
+done
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CPPFLAGS" != "$cf_old_cflag" || break
+
+	CPPFLAGS="$cf_old_cflag"
+done
+
+		;;
+	esac
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_add_cflags
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+done
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_pkg_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 7625 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+initscr(); mousemask(0,0); tigetstr((char *)0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:7637: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:7640: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:7643: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:7646: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  if test "$cross_compiling" = yes; then
+  cf_have_ncuconfig=maybe
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 7652 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+				int main(void)
+				{ const char *xx = curses_version(); return (xx == 0); }
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:7659: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:7662: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:7664: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:7667: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_have_ncuconfig=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_ncuconfig=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_ncuconfig=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+		echo "$as_me:7684: result: $cf_have_ncuconfig" >&5
+echo "${ECHO_T}$cf_have_ncuconfig" >&6
+		test "$cf_have_ncuconfig" = maybe && cf_have_ncuconfig=yes
+		if test "$cf_have_ncuconfig" != "yes"
+		then
+			CPPFLAGS="$cf_save_CPPFLAGS"
+			LIBS="$cf_save_LIBS"
+			NCURSES_CONFIG_PKG=none
+		else
+
+cat >>confdefs.h <<\EOF
+#define NCURSES 1
+EOF
+
+			NCURSES_CONFIG_PKG=$cf_ncuconfig_root
+
+echo "$as_me:7700: checking for terminfo header" >&5
+echo $ECHO_N "checking for terminfo header... $ECHO_C" >&6
+if test "${cf_cv_term_header+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+case "${cf_cv_ncurses_header}" in
+(*/ncurses.h|*/ncursesw.h)
+	cf_term_header=`echo "$cf_cv_ncurses_header" | sed -e 's%ncurses[^.]*\.h$%term.h%'`
+	;;
+(*)
+	cf_term_header=term.h
+	;;
+esac
+
+for cf_test in $cf_term_header "ncurses/term.h" "ncursesw/term.h"
+do
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 7718 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <$cf_test>
+
+int
+main (void)
+{
+int x = auto_left_margin; (void)x
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:7733: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:7736: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:7739: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:7742: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+	cf_cv_term_header="$cf_test"
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+	cf_cv_term_header=unknown
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+	test "$cf_cv_term_header" != unknown && break
+done
+
+fi
+echo "$as_me:7758: result: $cf_cv_term_header" >&5
+echo "${ECHO_T}$cf_cv_term_header" >&6
+
+# Set definitions to allow ifdef'ing to accommodate subdirectories
+
+case "$cf_cv_term_header" in
+(*term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_TERM_H 1
+EOF
+
+	;;
+esac
+
+case "$cf_cv_term_header" in
+(ncurses/term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSES_TERM_H 1
+EOF
+
+	;;
+(ncursesw/term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSESW_TERM_H 1
+EOF
+
+	;;
+esac
+
+		fi
+
+	else
+		echo "$as_me:7793: result: no" >&5
+echo "${ECHO_T}no" >&6
+		NCURSES_CONFIG_PKG=none
+	fi
+else
+	NCURSES_CONFIG_PKG=none
+fi
+
+if test "x$cf_have_ncuconfig" = "xno"; then
+	cf_ncurses_config="${cf_ncuconfig_root}${NCURSES_CONFIG_SUFFIX}-config"; echo "Looking for ${cf_ncurses_config}"
+
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in ${cf_ncurses_config} ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}5-config
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:7809: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_NCURSES_CONFIG+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$NCURSES_CONFIG"; then
+  ac_cv_prog_NCURSES_CONFIG="$NCURSES_CONFIG" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_NCURSES_CONFIG="$ac_tool_prefix$ac_prog"
+echo "$as_me:7824: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+NCURSES_CONFIG=$ac_cv_prog_NCURSES_CONFIG
+if test -n "$NCURSES_CONFIG"; then
+  echo "$as_me:7832: result: $NCURSES_CONFIG" >&5
+echo "${ECHO_T}$NCURSES_CONFIG" >&6
+else
+  echo "$as_me:7835: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    test -n "$NCURSES_CONFIG" && break
+  done
+fi
+if test -z "$NCURSES_CONFIG"; then
+  ac_ct_NCURSES_CONFIG=$NCURSES_CONFIG
+  for ac_prog in ${cf_ncurses_config} ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}5-config
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:7848: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_NCURSES_CONFIG+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_NCURSES_CONFIG"; then
+  ac_cv_prog_ac_ct_NCURSES_CONFIG="$ac_ct_NCURSES_CONFIG" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ac_ct_NCURSES_CONFIG="$ac_prog"
+echo "$as_me:7863: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+ac_ct_NCURSES_CONFIG=$ac_cv_prog_ac_ct_NCURSES_CONFIG
+if test -n "$ac_ct_NCURSES_CONFIG"; then
+  echo "$as_me:7871: result: $ac_ct_NCURSES_CONFIG" >&5
+echo "${ECHO_T}$ac_ct_NCURSES_CONFIG" >&6
+else
+  echo "$as_me:7874: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$ac_ct_NCURSES_CONFIG" && break
+done
+test -n "$ac_ct_NCURSES_CONFIG" || ac_ct_NCURSES_CONFIG="none"
+
+  NCURSES_CONFIG=$ac_ct_NCURSES_CONFIG
+fi
+
+	if test "$NCURSES_CONFIG" != none ; then
+
+for cf_add_cflags in `$NCURSES_CONFIG --cflags`
+do
+	case "x$cf_add_cflags" in
+	(x-[DU]*)
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CFLAGS" != "$cf_old_cflag" || break
+
+	CFLAGS="$cf_old_cflag"
+done
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CPPFLAGS" != "$cf_old_cflag" || break
+
+	CPPFLAGS="$cf_old_cflag"
+done
+
+		;;
+	esac
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_add_cflags
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+done
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in `$NCURSES_CONFIG --libs`; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+		# even with config script, some packages use no-override for curses.h
+
+echo "$as_me:8031: checking if we have identified curses headers" >&5
+echo $ECHO_N "checking if we have identified curses headers... $ECHO_C" >&6
+if test "${cf_cv_ncurses_header+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cf_cv_ncurses_header=none
+for cf_header in \
+	ncurses.h ncursesw/ncurses.h \
+	curses.h ncursesw/curses.h
+do
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 8043 "configure"
+#include "confdefs.h"
+#include <${cf_header}>
+int
+main (void)
+{
+initscr(); tgoto("?", 0,0)
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:8055: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:8058: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:8061: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:8064: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_ncurses_header=$cf_header; break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+done
+
+fi
+echo "$as_me:8075: result: $cf_cv_ncurses_header" >&5
+echo "${ECHO_T}$cf_cv_ncurses_header" >&6
+
+if test "$cf_cv_ncurses_header" = none ; then
+	{ { echo "$as_me:8079: error: No curses header-files found" >&5
+echo "$as_me: error: No curses header-files found" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+# cheat, to get the right #define's for HAVE_NCURSES_H, etc.
+
+for ac_header in $cf_cv_ncurses_header
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:8089: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 8095 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:8099: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:8105: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:8124: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+cat >>confdefs.h <<\EOF
+#define NCURSES 1
+EOF
+
+cf_nculib_ROOT=`echo "HAVE_LIB$cf_ncuconfig_root" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+		cat >>confdefs.h <<EOF
+#define $cf_nculib_ROOT 1
+EOF
+
+				cf_cv_ncurses_version="`$NCURSES_CONFIG --version`"
+
+	else
+
+cf_ncuhdr_root=ncursesw
+
+test -n "$cf_cv_curses_dir" && \
+test "$cf_cv_curses_dir" != "no" && { \
+
+if test -n "$cf_cv_curses_dir/include/$cf_ncuhdr_root" ; then
+  for cf_add_incdir in $cf_cv_curses_dir/include/$cf_ncuhdr_root
+  do
+	while test "$cf_add_incdir" != /usr/include
+	do
+	  if test -d "$cf_add_incdir"
+	  then
+		cf_have_incdir=no
+		if test -n "$CFLAGS$CPPFLAGS" ; then
+		  # a loop is needed to ensure we can add subdirs of existing dirs
+		  for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+			if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+			  cf_have_incdir=yes; break
+			fi
+		  done
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  if test "$cf_add_incdir" = /usr/local/include ; then
+			if test "$GCC" = yes
+			then
+			  cf_save_CPPFLAGS=$CPPFLAGS
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+			  cat >"conftest.$ac_ext" <<_ACEOF
+#line 8180 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:8192: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:8195: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:8198: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:8201: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+			  CPPFLAGS=$cf_save_CPPFLAGS
+			fi
+		  fi
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  test -n "$verbose" && echo "	adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:8218: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+		  CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+		  cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+		  test "$cf_top_incdir" = "$cf_add_incdir" && break
+		  cf_add_incdir="$cf_top_incdir"
+		else
+		  break
+		fi
+	  else
+		break
+	  fi
+	done
+  done
+fi
+
+}
+
+echo "$as_me:8237: checking for $cf_ncuhdr_root header in include-path" >&5
+echo $ECHO_N "checking for $cf_ncuhdr_root header in include-path... $ECHO_C" >&6
+if test "${cf_cv_ncurses_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cf_header_list="$cf_ncuhdr_root/curses.h $cf_ncuhdr_root/ncurses.h"
+	{ test "$cf_ncuhdr_root" = ncurses || test "$cf_ncuhdr_root" = ncursesw; } && cf_header_list="$cf_header_list curses.h ncurses.h"
+	for cf_header in $cf_header_list
+	do
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 8249 "configure"
+#include "confdefs.h"
+
+#define _XOPEN_SOURCE_EXTENDED
+#undef  HAVE_LIBUTF8_H	/* in case we used CF_UTF8_LIB */
+#define HAVE_LIBUTF8_H	/* to force ncurses' header file to use cchar_t */
+
+#include <$cf_header>
+int
+main (void)
+{
+
+#ifdef NCURSES_VERSION
+
+#ifndef WACS_BSSB
+	make an error
+#endif
+
+printf("%s\\n", NCURSES_VERSION);
+#else
+#ifdef __NCURSES_H
+printf("old\\n");
+#else
+	make an error
+#endif
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:8281: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:8284: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:8287: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:8290: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_ncurses_h=$cf_header
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_ncurses_h=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+		test "$cf_cv_ncurses_h" != no && break
+	done
+
+fi
+echo "$as_me:8305: result: $cf_cv_ncurses_h" >&5
+echo "${ECHO_T}$cf_cv_ncurses_h" >&6
+
+if test "$cf_cv_ncurses_h" != no ; then
+	cf_cv_ncurses_header=$cf_cv_ncurses_h
+else
+
+echo "$as_me:8312: checking for $cf_ncuhdr_root include-path" >&5
+echo $ECHO_N "checking for $cf_ncuhdr_root include-path... $ECHO_C" >&6
+if test "${cf_cv_ncurses_h2+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	test -n "$verbose" && echo
+
+cf_search=
+
+# collect the current set of include-directories from compiler flags
+cf_header_path_list=""
+if test -n "${CFLAGS}${CPPFLAGS}" ; then
+	for cf_header_path in $CPPFLAGS $CFLAGS
+	do
+		case "$cf_header_path" in
+		(-I*)
+			cf_header_path=`echo ".$cf_header_path" |sed -e 's/^...//' -e 's,/include$,,'`
+
+test "x$cf_header_path" != "xNONE" && \
+test -d "$cf_header_path" && \
+ {
+	test -n "$verbose" && echo "	... testing for include-directories under $cf_header_path"
+	test -d "$cf_header_path/include" &&          cf_search="$cf_search $cf_header_path/include"
+	test -d "$cf_header_path/include/$cf_ncuhdr_root" &&       cf_search="$cf_search $cf_header_path/include/$cf_ncuhdr_root"
+	test -d "$cf_header_path/include/$cf_ncuhdr_root/include" &&    cf_search="$cf_search $cf_header_path/include/$cf_ncuhdr_root/include"
+	test -d "$cf_header_path/$cf_ncuhdr_root/include" &&       cf_search="$cf_search $cf_header_path/$cf_ncuhdr_root/include"
+	test -d "$cf_header_path/$cf_ncuhdr_root/include/$cf_ncuhdr_root" &&    cf_search="$cf_search $cf_header_path/$cf_ncuhdr_root/include/$cf_ncuhdr_root"
+}
+
+			cf_header_path_list="$cf_header_path_list $cf_search"
+			;;
+		esac
+	done
+fi
+
+# add the variations for the package we are looking for
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+	test -n "$verbose" && echo "	... testing for include-directories under $prefix"
+	test -d "$prefix/include" &&          cf_search="$cf_search $prefix/include"
+	test -d "$prefix/include/$cf_ncuhdr_root" &&       cf_search="$cf_search $prefix/include/$cf_ncuhdr_root"
+	test -d "$prefix/include/$cf_ncuhdr_root/include" &&    cf_search="$cf_search $prefix/include/$cf_ncuhdr_root/include"
+	test -d "$prefix/$cf_ncuhdr_root/include" &&       cf_search="$cf_search $prefix/$cf_ncuhdr_root/include"
+	test -d "$prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root" &&    cf_search="$cf_search $prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root"
+}
+
+for cf_subdir_prefix in \
+	/usr \
+	/usr/local \
+	/usr/pkg \
+	/opt \
+	/opt/local \
+	$HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+	test -n "$verbose" && echo "	... testing for include-directories under $cf_subdir_prefix"
+	test -d "$cf_subdir_prefix/include" &&          cf_search="$cf_search $cf_subdir_prefix/include"
+	test -d "$cf_subdir_prefix/include/$cf_ncuhdr_root" &&       cf_search="$cf_search $cf_subdir_prefix/include/$cf_ncuhdr_root"
+	test -d "$cf_subdir_prefix/include/$cf_ncuhdr_root/include" &&    cf_search="$cf_search $cf_subdir_prefix/include/$cf_ncuhdr_root/include"
+	test -d "$cf_subdir_prefix/$cf_ncuhdr_root/include" &&       cf_search="$cf_search $cf_subdir_prefix/$cf_ncuhdr_root/include"
+	test -d "$cf_subdir_prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root" &&    cf_search="$cf_search $cf_subdir_prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root"
+}
+
+done
+
+test "$includedir" != NONE && \
+test "$includedir" != "/usr/include" && \
+test -d "$includedir" && {
+	test -d "$includedir" &&    cf_search="$cf_search $includedir"
+	test -d "$includedir/$cf_ncuhdr_root" && cf_search="$cf_search $includedir/$cf_ncuhdr_root"
+}
+
+test "$oldincludedir" != NONE && \
+test "$oldincludedir" != "/usr/include" && \
+test -d "$oldincludedir" && {
+	test -d "$oldincludedir"    && cf_search="$cf_search $oldincludedir"
+	test -d "$oldincludedir/$cf_ncuhdr_root" && cf_search="$cf_search $oldincludedir/$cf_ncuhdr_root"
+}
+
+cf_search="$cf_search $cf_header_path_list"
+
+	test -n "$verbose" && echo "search path $cf_search"
+	cf_save2_CPPFLAGS="$CPPFLAGS"
+	for cf_incdir in $cf_search
+	do
+
+if test -n "$cf_incdir" ; then
+  for cf_add_incdir in $cf_incdir
+  do
+	while test "$cf_add_incdir" != /usr/include
+	do
+	  if test -d "$cf_add_incdir"
+	  then
+		cf_have_incdir=no
+		if test -n "$CFLAGS$CPPFLAGS" ; then
+		  # a loop is needed to ensure we can add subdirs of existing dirs
+		  for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+			if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+			  cf_have_incdir=yes; break
+			fi
+		  done
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  if test "$cf_add_incdir" = /usr/local/include ; then
+			if test "$GCC" = yes
+			then
+			  cf_save_CPPFLAGS=$CPPFLAGS
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+			  cat >"conftest.$ac_ext" <<_ACEOF
+#line 8433 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:8445: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:8448: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:8451: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:8454: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+			  CPPFLAGS=$cf_save_CPPFLAGS
+			fi
+		  fi
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  test -n "$verbose" && echo "	adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:8471: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+		  CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+		  cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+		  test "$cf_top_incdir" = "$cf_add_incdir" && break
+		  cf_add_incdir="$cf_top_incdir"
+		else
+		  break
+		fi
+	  else
+		break
+	  fi
+	done
+  done
+fi
+
+		for cf_header in \
+			ncurses.h \
+			curses.h
+		do
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 8494 "configure"
+#include "confdefs.h"
+
+#include <$cf_header>
+int
+main (void)
+{
+
+#ifdef NCURSES_VERSION
+
+printf("%s\\n", NCURSES_VERSION);
+#else
+#ifdef __NCURSES_H
+printf("old\\n");
+#else
+	make an error
+#endif
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:8518: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:8521: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:8524: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:8527: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_ncurses_h2=$cf_header
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_ncurses_h2=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+			if test "$cf_cv_ncurses_h2" != no ; then
+				cf_cv_ncurses_h2=$cf_incdir/$cf_header
+				test -n "$verbose" && echo $ECHO_N "	... found $ECHO_C" 1>&6
+				break
+			fi
+			test -n "$verbose" && echo "	... tested $cf_incdir/$cf_header" 1>&6
+		done
+		CPPFLAGS="$cf_save2_CPPFLAGS"
+		test "$cf_cv_ncurses_h2" != no && break
+	done
+	test "$cf_cv_ncurses_h2" = no && { { echo "$as_me:8548: error: not found" >&5
+echo "$as_me: error: not found" >&2;}
+   { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:8553: result: $cf_cv_ncurses_h2" >&5
+echo "${ECHO_T}$cf_cv_ncurses_h2" >&6
+
+	cf_1st_incdir=`echo "$cf_cv_ncurses_h2" | sed -e 's%/[^/]*$%%'`
+	cf_cv_ncurses_header="`basename "$cf_cv_ncurses_h2"`"
+	if test "`basename "$cf_1st_incdir"`" = "$cf_ncuhdr_root" ; then
+		cf_cv_ncurses_header="$cf_ncuhdr_root/$cf_cv_ncurses_header"
+	fi
+
+if test -n "$cf_1st_incdir" ; then
+  for cf_add_incdir in $cf_1st_incdir
+  do
+	while test "$cf_add_incdir" != /usr/include
+	do
+	  if test -d "$cf_add_incdir"
+	  then
+		cf_have_incdir=no
+		if test -n "$CFLAGS$CPPFLAGS" ; then
+		  # a loop is needed to ensure we can add subdirs of existing dirs
+		  for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+			if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+			  cf_have_incdir=yes; break
+			fi
+		  done
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  if test "$cf_add_incdir" = /usr/local/include ; then
+			if test "$GCC" = yes
+			then
+			  cf_save_CPPFLAGS=$CPPFLAGS
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+			  cat >"conftest.$ac_ext" <<_ACEOF
+#line 8589 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:8601: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:8604: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:8607: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:8610: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+			  CPPFLAGS=$cf_save_CPPFLAGS
+			fi
+		  fi
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  test -n "$verbose" && echo "	adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:8627: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+		  CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+		  cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+		  test "$cf_top_incdir" = "$cf_add_incdir" && break
+		  cf_add_incdir="$cf_top_incdir"
+		else
+		  break
+		fi
+	  else
+		break
+	  fi
+	done
+  done
+fi
+
+fi
+
+# Set definitions to allow ifdef'ing for ncurses.h
+
+case "$cf_cv_ncurses_header" in
+(*ncurses.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSES_H 1
+EOF
+
+	;;
+esac
+
+case "$cf_cv_ncurses_header" in
+(ncurses/curses.h|ncurses/ncurses.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSES_NCURSES_H 1
+EOF
+
+	;;
+(ncursesw/curses.h|ncursesw/ncurses.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSESW_NCURSES_H 1
+EOF
+
+	;;
+esac
+
+echo "$as_me:8675: checking for terminfo header" >&5
+echo $ECHO_N "checking for terminfo header... $ECHO_C" >&6
+if test "${cf_cv_term_header+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+case "${cf_cv_ncurses_header}" in
+(*/ncurses.h|*/ncursesw.h)
+	cf_term_header=`echo "$cf_cv_ncurses_header" | sed -e 's%ncurses[^.]*\.h$%term.h%'`
+	;;
+(*)
+	cf_term_header=term.h
+	;;
+esac
+
+for cf_test in $cf_term_header "ncurses/term.h" "ncursesw/term.h"
+do
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 8693 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <$cf_test>
+
+int
+main (void)
+{
+int x = auto_left_margin; (void)x
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:8708: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:8711: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:8714: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:8717: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+	cf_cv_term_header="$cf_test"
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+	cf_cv_term_header=unknown
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+	test "$cf_cv_term_header" != unknown && break
+done
+
+fi
+echo "$as_me:8733: result: $cf_cv_term_header" >&5
+echo "${ECHO_T}$cf_cv_term_header" >&6
+
+# Set definitions to allow ifdef'ing to accommodate subdirectories
+
+case "$cf_cv_term_header" in
+(*term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_TERM_H 1
+EOF
+
+	;;
+esac
+
+case "$cf_cv_term_header" in
+(ncurses/term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSES_TERM_H 1
+EOF
+
+	;;
+(ncursesw/term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSESW_TERM_H 1
+EOF
+
+	;;
+esac
+
+# some applications need this, but should check for NCURSES_VERSION
+
+cat >>confdefs.h <<\EOF
+#define NCURSES 1
+EOF
+
+echo "$as_me:8771: checking for ncurses version" >&5
+echo $ECHO_N "checking for ncurses version... $ECHO_C" >&6
+if test "${cf_cv_ncurses_version+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cf_cv_ncurses_version=no
+	cf_tempfile=out$$
+	rm -f "$cf_tempfile"
+	if test "$cross_compiling" = yes; then
+
+	# This will not work if the preprocessor splits the line after the
+	# Autoconf token.  The 'unproto' program does that.
+	cat > "conftest.$ac_ext" <<EOF
+#include <${cf_cv_ncurses_header:-curses.h}>
+#undef Autoconf
+#ifdef NCURSES_VERSION
+Autoconf NCURSES_VERSION
+#else
+#ifdef __NCURSES_H
+Autoconf "old"
+#endif
+;
+#endif
+EOF
+	cf_try="$ac_cpp conftest.$ac_ext 2>&5 | grep '^Autoconf ' >conftest.out"
+	{ (eval echo "$as_me:8797: \"$cf_try\"") >&5
+  (eval $cf_try) 2>&5
+  ac_status=$?
+  echo "$as_me:8800: \$? = $ac_status" >&5
+  (exit "$ac_status"); }
+	if test -f conftest.out ; then
+		cf_out=`sed -e 's%^Autoconf %%' -e 's%^[^"]*"%%' -e 's%".*%%' conftest.out`
+		test -n "$cf_out" && cf_cv_ncurses_version="$cf_out"
+		rm -f conftest.out
+	fi
+
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 8810 "configure"
+#include "confdefs.h"
+
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <stdio.h>
+int main(void)
+{
+	FILE *fp = fopen("$cf_tempfile", "w");
+#ifdef NCURSES_VERSION
+# ifdef NCURSES_VERSION_PATCH
+	fprintf(fp, "%s.%d\\n", NCURSES_VERSION, NCURSES_VERSION_PATCH);
+# else
+	fprintf(fp, "%s\\n", NCURSES_VERSION);
+# endif
+#else
+# ifdef __NCURSES_H
+	fprintf(fp, "old\\n");
+# else
+	make an error
+# endif
+#endif
+	${cf_cv_main_return:-return}(0);
+}
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:8835: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:8838: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:8840: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:8843: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+	cf_cv_ncurses_version=`cat $cf_tempfile`
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+	rm -f "$cf_tempfile"
+
+fi
+echo "$as_me:8857: result: $cf_cv_ncurses_version" >&5
+echo "${ECHO_T}$cf_cv_ncurses_version" >&6
+test "$cf_cv_ncurses_version" = no ||
+cat >>confdefs.h <<\EOF
+#define NCURSES 1
+EOF
+
+cf_nculib_root=ncursesw
+	# This works, except for the special case where we find gpm, but
+	# ncurses is in a nonstandard location via $LIBS, and we really want
+	# to link gpm.
+cf_ncurses_LIBS=""
+cf_ncurses_SAVE="$LIBS"
+echo "$as_me:8870: checking for Gpm_Open in -lgpm" >&5
+echo $ECHO_N "checking for Gpm_Open in -lgpm... $ECHO_C" >&6
+if test "${ac_cv_lib_gpm_Gpm_Open+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lgpm  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 8878 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char Gpm_Open ();
+int
+main (void)
+{
+Gpm_Open ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:8897: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:8900: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:8903: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:8906: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_gpm_Gpm_Open=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_gpm_Gpm_Open=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:8917: result: $ac_cv_lib_gpm_Gpm_Open" >&5
+echo "${ECHO_T}$ac_cv_lib_gpm_Gpm_Open" >&6
+if test "$ac_cv_lib_gpm_Gpm_Open" = yes; then
+  echo "$as_me:8920: checking for initscr in -lgpm" >&5
+echo $ECHO_N "checking for initscr in -lgpm... $ECHO_C" >&6
+if test "${ac_cv_lib_gpm_initscr+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lgpm  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 8928 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char initscr ();
+int
+main (void)
+{
+initscr ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:8947: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:8950: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:8953: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:8956: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_gpm_initscr=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_gpm_initscr=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:8967: result: $ac_cv_lib_gpm_initscr" >&5
+echo "${ECHO_T}$ac_cv_lib_gpm_initscr" >&6
+if test "$ac_cv_lib_gpm_initscr" = yes; then
+  LIBS="$cf_ncurses_SAVE"
+else
+  cf_ncurses_LIBS="-lgpm"
+fi
+
+fi
+
+case "$host_os" in
+(freebsd*)
+	# This is only necessary if you are linking against an obsolete
+	# version of ncurses (but it should do no harm, since it is static).
+	if test "$cf_nculib_root" = ncurses ; then
+		echo "$as_me:8982: checking for tgoto in -lmytinfo" >&5
+echo $ECHO_N "checking for tgoto in -lmytinfo... $ECHO_C" >&6
+if test "${ac_cv_lib_mytinfo_tgoto+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lmytinfo  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 8990 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char tgoto ();
+int
+main (void)
+{
+tgoto ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:9009: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:9012: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:9015: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:9018: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_mytinfo_tgoto=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_mytinfo_tgoto=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:9029: result: $ac_cv_lib_mytinfo_tgoto" >&5
+echo "${ECHO_T}$ac_cv_lib_mytinfo_tgoto" >&6
+if test "$ac_cv_lib_mytinfo_tgoto" = yes; then
+  cf_ncurses_LIBS="-lmytinfo $cf_ncurses_LIBS"
+fi
+
+	fi
+	;;
+esac
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_ncurses_LIBS; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+if test -n "$cf_cv_curses_dir" && test "$cf_cv_curses_dir" != "no"
+then
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -l$cf_nculib_root; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+else
+
+	eval 'cf_cv_have_lib_'"$cf_nculib_root"'=no'
+	cf_libdir=""
+	echo "$as_me:9078: checking for initscr" >&5
+echo $ECHO_N "checking for initscr... $ECHO_C" >&6
+if test "${ac_cv_func_initscr+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 9084 "configure"
+#include "confdefs.h"
+#define initscr autoconf_temporary
+#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
+#undef initscr
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char initscr (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_initscr) || defined (__stub___initscr)
+#error found stub for initscr
+#endif
+
+	return initscr ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:9115: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:9118: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:9121: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:9124: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_func_initscr=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_initscr=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:9134: result: $ac_cv_func_initscr" >&5
+echo "${ECHO_T}$ac_cv_func_initscr" >&6
+if test "$ac_cv_func_initscr" = yes; then
+  eval 'cf_cv_have_lib_'"$cf_nculib_root"'=yes'
+else
+
+		cf_save_LIBS="$LIBS"
+		echo "$as_me:9141: checking for initscr in -l$cf_nculib_root" >&5
+echo $ECHO_N "checking for initscr in -l$cf_nculib_root... $ECHO_C" >&6
+		LIBS="-l$cf_nculib_root $LIBS"
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 9145 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+initscr()
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:9157: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:9160: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:9163: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:9166: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  echo "$as_me:9168: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+			 eval 'cf_cv_have_lib_'"$cf_nculib_root"'=yes'
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+echo "$as_me:9175: result: no" >&5
+echo "${ECHO_T}no" >&6
+
+cf_search=
+cf_library_path_list=""
+if test -n "${LDFLAGS}${LIBS}" ; then
+	for cf_library_path in $LDFLAGS $LIBS
+	do
+		case "$cf_library_path" in
+		(-L*)
+			cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'`
+
+test "x$cf_library_path" != "xNONE" && \
+test -d "$cf_library_path" && \
+ {
+	test -n "$verbose" && echo "	... testing for lib-directories under $cf_library_path"
+	test -d "$cf_library_path/lib" &&          cf_search="$cf_search $cf_library_path/lib"
+	test -d "$cf_library_path/lib/$cf_nculib_root" &&       cf_search="$cf_search $cf_library_path/lib/$cf_nculib_root"
+	test -d "$cf_library_path/lib/$cf_nculib_root/lib" &&    cf_search="$cf_search $cf_library_path/lib/$cf_nculib_root/lib"
+	test -d "$cf_library_path/$cf_nculib_root/lib" &&       cf_search="$cf_search $cf_library_path/$cf_nculib_root/lib"
+	test -d "$cf_library_path/$cf_nculib_root/lib/$cf_nculib_root" &&    cf_search="$cf_search $cf_library_path/$cf_nculib_root/lib/$cf_nculib_root"
+}
+
+			cf_library_path_list="$cf_library_path_list $cf_search"
+			;;
+		esac
+	done
+fi
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+	test -n "$verbose" && echo "	... testing for lib-directories under $prefix"
+	test -d "$prefix/lib" &&          cf_search="$cf_search $prefix/lib"
+	test -d "$prefix/lib/$cf_nculib_root" &&       cf_search="$cf_search $prefix/lib/$cf_nculib_root"
+	test -d "$prefix/lib/$cf_nculib_root/lib" &&    cf_search="$cf_search $prefix/lib/$cf_nculib_root/lib"
+	test -d "$prefix/$cf_nculib_root/lib" &&       cf_search="$cf_search $prefix/$cf_nculib_root/lib"
+	test -d "$prefix/$cf_nculib_root/lib/$cf_nculib_root" &&    cf_search="$cf_search $prefix/$cf_nculib_root/lib/$cf_nculib_root"
+}
+
+for cf_subdir_prefix in \
+	/usr \
+	/usr/local \
+	/usr/pkg \
+	/opt \
+	/opt/local \
+	$HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+	test -n "$verbose" && echo "	... testing for lib-directories under $cf_subdir_prefix"
+	test -d "$cf_subdir_prefix/lib" &&          cf_search="$cf_search $cf_subdir_prefix/lib"
+	test -d "$cf_subdir_prefix/lib/$cf_nculib_root" &&       cf_search="$cf_search $cf_subdir_prefix/lib/$cf_nculib_root"
+	test -d "$cf_subdir_prefix/lib/$cf_nculib_root/lib" &&    cf_search="$cf_search $cf_subdir_prefix/lib/$cf_nculib_root/lib"
+	test -d "$cf_subdir_prefix/$cf_nculib_root/lib" &&       cf_search="$cf_search $cf_subdir_prefix/$cf_nculib_root/lib"
+	test -d "$cf_subdir_prefix/$cf_nculib_root/lib/$cf_nculib_root" &&    cf_search="$cf_search $cf_subdir_prefix/$cf_nculib_root/lib/$cf_nculib_root"
+}
+
+done
+
+cf_search="$cf_library_path_list $cf_search"
+
+			for cf_libdir in $cf_search
+			do
+				echo "$as_me:9243: checking for -l$cf_nculib_root in $cf_libdir" >&5
+echo $ECHO_N "checking for -l$cf_nculib_root in $cf_libdir... $ECHO_C" >&6
+				LIBS="-L$cf_libdir -l$cf_nculib_root $cf_save_LIBS"
+				cat >"conftest.$ac_ext" <<_ACEOF
+#line 9247 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+initscr()
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:9259: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:9262: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:9265: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:9268: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  echo "$as_me:9270: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+			 		 eval 'cf_cv_have_lib_'"$cf_nculib_root"'=yes'
+					 break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+echo "$as_me:9277: result: no" >&5
+echo "${ECHO_T}no" >&6
+					 LIBS="$cf_save_LIBS"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+			done
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+
+eval 'cf_found_library="$cf_cv_have_lib_'"$cf_nculib_root"\"
+
+if test "$cf_found_library" = no ; then
+	{ { echo "$as_me:9292: error: Cannot link $cf_nculib_root library" >&5
+echo "$as_me: error: Cannot link $cf_nculib_root library" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+fi
+
+if test -n "$cf_ncurses_LIBS" ; then
+	echo "$as_me:9300: checking if we can link $cf_nculib_root without $cf_ncurses_LIBS" >&5
+echo $ECHO_N "checking if we can link $cf_nculib_root without $cf_ncurses_LIBS... $ECHO_C" >&6
+	cf_ncurses_SAVE="$LIBS"
+	for p in $cf_ncurses_LIBS ; do
+		q=`echo "$LIBS" | sed -e "s%$p %%" -e "s%$p$%%"`
+		if test "$q" != "$LIBS" ; then
+			LIBS="$q"
+		fi
+	done
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 9310 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+initscr(); mousemask(0,0); tigetstr((char *)0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:9322: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:9325: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:9328: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:9331: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  echo "$as_me:9333: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+echo "$as_me:9338: result: no" >&5
+echo "${ECHO_T}no" >&6
+		 LIBS="$cf_ncurses_SAVE"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+
+cf_nculib_ROOT=`echo "HAVE_LIB$cf_nculib_root" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+cat >>confdefs.h <<EOF
+#define $cf_nculib_ROOT 1
+EOF
+
+	fi
+else
+	NCURSES_CONFIG=none
+fi
+
+else
+
+cf_ncuconfig_root=ncurses
+cf_have_ncuconfig=no
+
+if test "x${PKG_CONFIG:=none}" != xnone; then
+	echo "$as_me:9362: checking pkg-config for $cf_ncuconfig_root" >&5
+echo $ECHO_N "checking pkg-config for $cf_ncuconfig_root... $ECHO_C" >&6
+	if "$PKG_CONFIG" --exists $cf_ncuconfig_root ; then
+		echo "$as_me:9365: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+		echo "$as_me:9368: checking if the $cf_ncuconfig_root package files work" >&5
+echo $ECHO_N "checking if the $cf_ncuconfig_root package files work... $ECHO_C" >&6
+		cf_have_ncuconfig=unknown
+
+		cf_save_CFLAGS="$CFLAGS"
+		cf_save_CPPFLAGS="$CPPFLAGS"
+		cf_save_LIBS="$LIBS"
+
+		cf_pkg_cflags="`$PKG_CONFIG --cflags $cf_ncuconfig_root`"
+		cf_pkg_libs="`$PKG_CONFIG --libs $cf_ncuconfig_root`"
+
+		# while -W for passing linker flags is prevalent, it is not "standard".
+		# At least one wrapper for c89/c99 (in Apple's xcode) has its own
+		# incompatible _and_ non-standard -W option which gives an error.  Work
+		# around that pitfall.
+		case "x${CC}@@${cf_pkg_libs}@${cf_pkg_cflags}" in
+		(x*c[89]9@@*-W*)
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_pkg_cflags
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_pkg_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+			cat >"conftest.$ac_ext" <<_ACEOF
+#line 9501 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+initscr(); mousemask(0,0); tigetstr((char *)0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:9513: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:9516: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:9519: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:9522: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  if test "$cross_compiling" = yes; then
+  cf_test_ncuconfig=maybe
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 9528 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+					int main(void)
+					{ const char *xx = curses_version(); return (xx == 0); }
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:9535: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:9538: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:9540: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:9543: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_test_ncuconfig=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_test_ncuconfig=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_test_ncuconfig=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+			CFLAGS="$cf_save_CFLAGS"
+			CPPFLAGS="$cf_save_CPPFLAGS"
+			LIBS="$cf_save_LIBS"
+
+			if test "x$cf_test_ncuconfig" != xyes; then
+				cf_temp=`echo "x$cf_pkg_cflags" | sed -e s/^x// -e 's/-W[^ 	]*//g'`
+				cf_pkg_cflags="$cf_temp"
+				cf_temp=`echo "x$cf_pkg_libs" | sed -e s/^x// -e 's/-W[^ 	]*//g'`
+				cf_pkg_libs="$cf_temp"
+			fi
+			;;
+		esac
+
+for cf_add_cflags in $cf_pkg_cflags
+do
+	case "x$cf_add_cflags" in
+	(x-[DU]*)
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CFLAGS" != "$cf_old_cflag" || break
+
+	CFLAGS="$cf_old_cflag"
+done
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CPPFLAGS" != "$cf_old_cflag" || break
+
+	CPPFLAGS="$cf_old_cflag"
+done
+
+		;;
+	esac
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_add_cflags
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+done
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_pkg_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 9717 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+initscr(); mousemask(0,0); tigetstr((char *)0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:9729: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:9732: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:9735: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:9738: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  if test "$cross_compiling" = yes; then
+  cf_have_ncuconfig=maybe
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 9744 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+				int main(void)
+				{ const char *xx = curses_version(); return (xx == 0); }
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:9751: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:9754: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:9756: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:9759: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_have_ncuconfig=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_ncuconfig=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_ncuconfig=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+		echo "$as_me:9776: result: $cf_have_ncuconfig" >&5
+echo "${ECHO_T}$cf_have_ncuconfig" >&6
+		test "$cf_have_ncuconfig" = maybe && cf_have_ncuconfig=yes
+		if test "$cf_have_ncuconfig" != "yes"
+		then
+			CPPFLAGS="$cf_save_CPPFLAGS"
+			LIBS="$cf_save_LIBS"
+			NCURSES_CONFIG_PKG=none
+		else
+
+cat >>confdefs.h <<\EOF
+#define NCURSES 1
+EOF
+
+			NCURSES_CONFIG_PKG=$cf_ncuconfig_root
+
+echo "$as_me:9792: checking for terminfo header" >&5
+echo $ECHO_N "checking for terminfo header... $ECHO_C" >&6
+if test "${cf_cv_term_header+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+case "${cf_cv_ncurses_header}" in
+(*/ncurses.h|*/ncursesw.h)
+	cf_term_header=`echo "$cf_cv_ncurses_header" | sed -e 's%ncurses[^.]*\.h$%term.h%'`
+	;;
+(*)
+	cf_term_header=term.h
+	;;
+esac
+
+for cf_test in $cf_term_header "ncurses/term.h" "ncursesw/term.h"
+do
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 9810 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <$cf_test>
+
+int
+main (void)
+{
+int x = auto_left_margin; (void)x
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:9825: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:9828: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:9831: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:9834: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+	cf_cv_term_header="$cf_test"
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+	cf_cv_term_header=unknown
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+	test "$cf_cv_term_header" != unknown && break
+done
+
+fi
+echo "$as_me:9850: result: $cf_cv_term_header" >&5
+echo "${ECHO_T}$cf_cv_term_header" >&6
+
+# Set definitions to allow ifdef'ing to accommodate subdirectories
+
+case "$cf_cv_term_header" in
+(*term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_TERM_H 1
+EOF
+
+	;;
+esac
+
+case "$cf_cv_term_header" in
+(ncurses/term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSES_TERM_H 1
+EOF
+
+	;;
+(ncursesw/term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSESW_TERM_H 1
+EOF
+
+	;;
+esac
+
+		fi
+
+	else
+		echo "$as_me:9885: result: no" >&5
+echo "${ECHO_T}no" >&6
+		NCURSES_CONFIG_PKG=none
+	fi
+else
+	NCURSES_CONFIG_PKG=none
+fi
+
+if test "x$cf_have_ncuconfig" = "xno"; then
+	cf_ncurses_config="${cf_ncuconfig_root}${NCURSES_CONFIG_SUFFIX}-config"; echo "Looking for ${cf_ncurses_config}"
+
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in ${cf_ncurses_config} ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}5-config
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:9901: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_NCURSES_CONFIG+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$NCURSES_CONFIG"; then
+  ac_cv_prog_NCURSES_CONFIG="$NCURSES_CONFIG" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_NCURSES_CONFIG="$ac_tool_prefix$ac_prog"
+echo "$as_me:9916: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+NCURSES_CONFIG=$ac_cv_prog_NCURSES_CONFIG
+if test -n "$NCURSES_CONFIG"; then
+  echo "$as_me:9924: result: $NCURSES_CONFIG" >&5
+echo "${ECHO_T}$NCURSES_CONFIG" >&6
+else
+  echo "$as_me:9927: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    test -n "$NCURSES_CONFIG" && break
+  done
+fi
+if test -z "$NCURSES_CONFIG"; then
+  ac_ct_NCURSES_CONFIG=$NCURSES_CONFIG
+  for ac_prog in ${cf_ncurses_config} ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}5-config
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:9940: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_NCURSES_CONFIG+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_NCURSES_CONFIG"; then
+  ac_cv_prog_ac_ct_NCURSES_CONFIG="$ac_ct_NCURSES_CONFIG" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ac_ct_NCURSES_CONFIG="$ac_prog"
+echo "$as_me:9955: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+ac_ct_NCURSES_CONFIG=$ac_cv_prog_ac_ct_NCURSES_CONFIG
+if test -n "$ac_ct_NCURSES_CONFIG"; then
+  echo "$as_me:9963: result: $ac_ct_NCURSES_CONFIG" >&5
+echo "${ECHO_T}$ac_ct_NCURSES_CONFIG" >&6
+else
+  echo "$as_me:9966: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$ac_ct_NCURSES_CONFIG" && break
+done
+test -n "$ac_ct_NCURSES_CONFIG" || ac_ct_NCURSES_CONFIG="none"
+
+  NCURSES_CONFIG=$ac_ct_NCURSES_CONFIG
+fi
+
+	if test "$NCURSES_CONFIG" != none ; then
+
+for cf_add_cflags in `$NCURSES_CONFIG --cflags`
+do
+	case "x$cf_add_cflags" in
+	(x-[DU]*)
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CFLAGS" != "$cf_old_cflag" || break
+
+	CFLAGS="$cf_old_cflag"
+done
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CPPFLAGS" != "$cf_old_cflag" || break
+
+	CPPFLAGS="$cf_old_cflag"
+done
+
+		;;
+	esac
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_add_cflags
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+done
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in `$NCURSES_CONFIG --libs`; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+		# even with config script, some packages use no-override for curses.h
+
+echo "$as_me:10123: checking if we have identified curses headers" >&5
+echo $ECHO_N "checking if we have identified curses headers... $ECHO_C" >&6
+if test "${cf_cv_ncurses_header+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cf_cv_ncurses_header=none
+for cf_header in \
+	ncurses.h ncurses/ncurses.h \
+	curses.h ncurses/curses.h
+do
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 10135 "configure"
+#include "confdefs.h"
+#include <${cf_header}>
+int
+main (void)
+{
+initscr(); tgoto("?", 0,0)
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:10147: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:10150: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:10153: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:10156: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_ncurses_header=$cf_header; break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+done
+
+fi
+echo "$as_me:10167: result: $cf_cv_ncurses_header" >&5
+echo "${ECHO_T}$cf_cv_ncurses_header" >&6
+
+if test "$cf_cv_ncurses_header" = none ; then
+	{ { echo "$as_me:10171: error: No curses header-files found" >&5
+echo "$as_me: error: No curses header-files found" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+# cheat, to get the right #define's for HAVE_NCURSES_H, etc.
+
+for ac_header in $cf_cv_ncurses_header
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:10181: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 10187 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:10191: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:10197: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:10216: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+cat >>confdefs.h <<\EOF
+#define NCURSES 1
+EOF
+
+cf_nculib_ROOT=`echo "HAVE_LIB$cf_ncuconfig_root" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+		cat >>confdefs.h <<EOF
+#define $cf_nculib_ROOT 1
+EOF
+
+				cf_cv_ncurses_version="`$NCURSES_CONFIG --version`"
+
+	else
+
+cf_ncuhdr_root=ncurses
+
+test -n "$cf_cv_curses_dir" && \
+test "$cf_cv_curses_dir" != "no" && { \
+
+if test -n "$cf_cv_curses_dir/include/$cf_ncuhdr_root" ; then
+  for cf_add_incdir in $cf_cv_curses_dir/include/$cf_ncuhdr_root
+  do
+	while test "$cf_add_incdir" != /usr/include
+	do
+	  if test -d "$cf_add_incdir"
+	  then
+		cf_have_incdir=no
+		if test -n "$CFLAGS$CPPFLAGS" ; then
+		  # a loop is needed to ensure we can add subdirs of existing dirs
+		  for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+			if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+			  cf_have_incdir=yes; break
+			fi
+		  done
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  if test "$cf_add_incdir" = /usr/local/include ; then
+			if test "$GCC" = yes
+			then
+			  cf_save_CPPFLAGS=$CPPFLAGS
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+			  cat >"conftest.$ac_ext" <<_ACEOF
+#line 10272 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:10284: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:10287: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:10290: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:10293: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+			  CPPFLAGS=$cf_save_CPPFLAGS
+			fi
+		  fi
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  test -n "$verbose" && echo "	adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:10310: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+		  CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+		  cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+		  test "$cf_top_incdir" = "$cf_add_incdir" && break
+		  cf_add_incdir="$cf_top_incdir"
+		else
+		  break
+		fi
+	  else
+		break
+	  fi
+	done
+  done
+fi
+
+}
+
+echo "$as_me:10329: checking for $cf_ncuhdr_root header in include-path" >&5
+echo $ECHO_N "checking for $cf_ncuhdr_root header in include-path... $ECHO_C" >&6
+if test "${cf_cv_ncurses_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cf_header_list="$cf_ncuhdr_root/curses.h $cf_ncuhdr_root/ncurses.h"
+	{ test "$cf_ncuhdr_root" = ncurses || test "$cf_ncuhdr_root" = ncursesw; } && cf_header_list="$cf_header_list curses.h ncurses.h"
+	for cf_header in $cf_header_list
+	do
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 10341 "configure"
+#include "confdefs.h"
+
+#include <$cf_header>
+int
+main (void)
+{
+
+#ifdef NCURSES_VERSION
+
+printf("%s\\n", NCURSES_VERSION);
+#else
+#ifdef __NCURSES_H
+printf("old\\n");
+#else
+	make an error
+#endif
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:10365: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:10368: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:10371: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:10374: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_ncurses_h=$cf_header
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_ncurses_h=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+		test "$cf_cv_ncurses_h" != no && break
+	done
+
+fi
+echo "$as_me:10389: result: $cf_cv_ncurses_h" >&5
+echo "${ECHO_T}$cf_cv_ncurses_h" >&6
+
+if test "$cf_cv_ncurses_h" != no ; then
+	cf_cv_ncurses_header=$cf_cv_ncurses_h
+else
+
+echo "$as_me:10396: checking for $cf_ncuhdr_root include-path" >&5
+echo $ECHO_N "checking for $cf_ncuhdr_root include-path... $ECHO_C" >&6
+if test "${cf_cv_ncurses_h2+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	test -n "$verbose" && echo
+
+cf_search=
+
+# collect the current set of include-directories from compiler flags
+cf_header_path_list=""
+if test -n "${CFLAGS}${CPPFLAGS}" ; then
+	for cf_header_path in $CPPFLAGS $CFLAGS
+	do
+		case "$cf_header_path" in
+		(-I*)
+			cf_header_path=`echo ".$cf_header_path" |sed -e 's/^...//' -e 's,/include$,,'`
+
+test "x$cf_header_path" != "xNONE" && \
+test -d "$cf_header_path" && \
+ {
+	test -n "$verbose" && echo "	... testing for include-directories under $cf_header_path"
+	test -d "$cf_header_path/include" &&          cf_search="$cf_search $cf_header_path/include"
+	test -d "$cf_header_path/include/$cf_ncuhdr_root" &&       cf_search="$cf_search $cf_header_path/include/$cf_ncuhdr_root"
+	test -d "$cf_header_path/include/$cf_ncuhdr_root/include" &&    cf_search="$cf_search $cf_header_path/include/$cf_ncuhdr_root/include"
+	test -d "$cf_header_path/$cf_ncuhdr_root/include" &&       cf_search="$cf_search $cf_header_path/$cf_ncuhdr_root/include"
+	test -d "$cf_header_path/$cf_ncuhdr_root/include/$cf_ncuhdr_root" &&    cf_search="$cf_search $cf_header_path/$cf_ncuhdr_root/include/$cf_ncuhdr_root"
+}
+
+			cf_header_path_list="$cf_header_path_list $cf_search"
+			;;
+		esac
+	done
+fi
+
+# add the variations for the package we are looking for
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+	test -n "$verbose" && echo "	... testing for include-directories under $prefix"
+	test -d "$prefix/include" &&          cf_search="$cf_search $prefix/include"
+	test -d "$prefix/include/$cf_ncuhdr_root" &&       cf_search="$cf_search $prefix/include/$cf_ncuhdr_root"
+	test -d "$prefix/include/$cf_ncuhdr_root/include" &&    cf_search="$cf_search $prefix/include/$cf_ncuhdr_root/include"
+	test -d "$prefix/$cf_ncuhdr_root/include" &&       cf_search="$cf_search $prefix/$cf_ncuhdr_root/include"
+	test -d "$prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root" &&    cf_search="$cf_search $prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root"
+}
+
+for cf_subdir_prefix in \
+	/usr \
+	/usr/local \
+	/usr/pkg \
+	/opt \
+	/opt/local \
+	$HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+	test -n "$verbose" && echo "	... testing for include-directories under $cf_subdir_prefix"
+	test -d "$cf_subdir_prefix/include" &&          cf_search="$cf_search $cf_subdir_prefix/include"
+	test -d "$cf_subdir_prefix/include/$cf_ncuhdr_root" &&       cf_search="$cf_search $cf_subdir_prefix/include/$cf_ncuhdr_root"
+	test -d "$cf_subdir_prefix/include/$cf_ncuhdr_root/include" &&    cf_search="$cf_search $cf_subdir_prefix/include/$cf_ncuhdr_root/include"
+	test -d "$cf_subdir_prefix/$cf_ncuhdr_root/include" &&       cf_search="$cf_search $cf_subdir_prefix/$cf_ncuhdr_root/include"
+	test -d "$cf_subdir_prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root" &&    cf_search="$cf_search $cf_subdir_prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root"
+}
+
+done
+
+test "$includedir" != NONE && \
+test "$includedir" != "/usr/include" && \
+test -d "$includedir" && {
+	test -d "$includedir" &&    cf_search="$cf_search $includedir"
+	test -d "$includedir/$cf_ncuhdr_root" && cf_search="$cf_search $includedir/$cf_ncuhdr_root"
+}
+
+test "$oldincludedir" != NONE && \
+test "$oldincludedir" != "/usr/include" && \
+test -d "$oldincludedir" && {
+	test -d "$oldincludedir"    && cf_search="$cf_search $oldincludedir"
+	test -d "$oldincludedir/$cf_ncuhdr_root" && cf_search="$cf_search $oldincludedir/$cf_ncuhdr_root"
+}
+
+cf_search="$cf_search $cf_header_path_list"
+
+	test -n "$verbose" && echo "search path $cf_search"
+	cf_save2_CPPFLAGS="$CPPFLAGS"
+	for cf_incdir in $cf_search
+	do
+
+if test -n "$cf_incdir" ; then
+  for cf_add_incdir in $cf_incdir
+  do
+	while test "$cf_add_incdir" != /usr/include
+	do
+	  if test -d "$cf_add_incdir"
+	  then
+		cf_have_incdir=no
+		if test -n "$CFLAGS$CPPFLAGS" ; then
+		  # a loop is needed to ensure we can add subdirs of existing dirs
+		  for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+			if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+			  cf_have_incdir=yes; break
+			fi
+		  done
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  if test "$cf_add_incdir" = /usr/local/include ; then
+			if test "$GCC" = yes
+			then
+			  cf_save_CPPFLAGS=$CPPFLAGS
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+			  cat >"conftest.$ac_ext" <<_ACEOF
+#line 10517 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:10529: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:10532: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:10535: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:10538: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+			  CPPFLAGS=$cf_save_CPPFLAGS
+			fi
+		  fi
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  test -n "$verbose" && echo "	adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:10555: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+		  CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+		  cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+		  test "$cf_top_incdir" = "$cf_add_incdir" && break
+		  cf_add_incdir="$cf_top_incdir"
+		else
+		  break
+		fi
+	  else
+		break
+	  fi
+	done
+  done
+fi
+
+		for cf_header in \
+			ncurses.h \
+			curses.h
+		do
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 10578 "configure"
+#include "confdefs.h"
+
+#include <$cf_header>
+int
+main (void)
+{
+
+#ifdef NCURSES_VERSION
+
+printf("%s\\n", NCURSES_VERSION);
+#else
+#ifdef __NCURSES_H
+printf("old\\n");
+#else
+	make an error
+#endif
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:10602: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:10605: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:10608: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:10611: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_ncurses_h2=$cf_header
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_ncurses_h2=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+			if test "$cf_cv_ncurses_h2" != no ; then
+				cf_cv_ncurses_h2=$cf_incdir/$cf_header
+				test -n "$verbose" && echo $ECHO_N "	... found $ECHO_C" 1>&6
+				break
+			fi
+			test -n "$verbose" && echo "	... tested $cf_incdir/$cf_header" 1>&6
+		done
+		CPPFLAGS="$cf_save2_CPPFLAGS"
+		test "$cf_cv_ncurses_h2" != no && break
+	done
+	test "$cf_cv_ncurses_h2" = no && { { echo "$as_me:10632: error: not found" >&5
+echo "$as_me: error: not found" >&2;}
+   { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:10637: result: $cf_cv_ncurses_h2" >&5
+echo "${ECHO_T}$cf_cv_ncurses_h2" >&6
+
+	cf_1st_incdir=`echo "$cf_cv_ncurses_h2" | sed -e 's%/[^/]*$%%'`
+	cf_cv_ncurses_header="`basename "$cf_cv_ncurses_h2"`"
+	if test "`basename "$cf_1st_incdir"`" = "$cf_ncuhdr_root" ; then
+		cf_cv_ncurses_header="$cf_ncuhdr_root/$cf_cv_ncurses_header"
+	fi
+
+if test -n "$cf_1st_incdir" ; then
+  for cf_add_incdir in $cf_1st_incdir
+  do
+	while test "$cf_add_incdir" != /usr/include
+	do
+	  if test -d "$cf_add_incdir"
+	  then
+		cf_have_incdir=no
+		if test -n "$CFLAGS$CPPFLAGS" ; then
+		  # a loop is needed to ensure we can add subdirs of existing dirs
+		  for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+			if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+			  cf_have_incdir=yes; break
+			fi
+		  done
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  if test "$cf_add_incdir" = /usr/local/include ; then
+			if test "$GCC" = yes
+			then
+			  cf_save_CPPFLAGS=$CPPFLAGS
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+			  cat >"conftest.$ac_ext" <<_ACEOF
+#line 10673 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:10685: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:10688: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:10691: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:10694: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+			  CPPFLAGS=$cf_save_CPPFLAGS
+			fi
+		  fi
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  test -n "$verbose" && echo "	adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:10711: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+		  CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+		  cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+		  test "$cf_top_incdir" = "$cf_add_incdir" && break
+		  cf_add_incdir="$cf_top_incdir"
+		else
+		  break
+		fi
+	  else
+		break
+	  fi
+	done
+  done
+fi
+
+fi
+
+# Set definitions to allow ifdef'ing for ncurses.h
+
+case "$cf_cv_ncurses_header" in
+(*ncurses.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSES_H 1
+EOF
+
+	;;
+esac
+
+case "$cf_cv_ncurses_header" in
+(ncurses/curses.h|ncurses/ncurses.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSES_NCURSES_H 1
+EOF
+
+	;;
+(ncursesw/curses.h|ncursesw/ncurses.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSESW_NCURSES_H 1
+EOF
+
+	;;
+esac
+
+echo "$as_me:10759: checking for terminfo header" >&5
+echo $ECHO_N "checking for terminfo header... $ECHO_C" >&6
+if test "${cf_cv_term_header+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+case "${cf_cv_ncurses_header}" in
+(*/ncurses.h|*/ncursesw.h)
+	cf_term_header=`echo "$cf_cv_ncurses_header" | sed -e 's%ncurses[^.]*\.h$%term.h%'`
+	;;
+(*)
+	cf_term_header=term.h
+	;;
+esac
+
+for cf_test in $cf_term_header "ncurses/term.h" "ncursesw/term.h"
+do
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 10777 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <$cf_test>
+
+int
+main (void)
+{
+int x = auto_left_margin; (void)x
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:10792: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:10795: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:10798: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:10801: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+	cf_cv_term_header="$cf_test"
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+	cf_cv_term_header=unknown
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+	test "$cf_cv_term_header" != unknown && break
+done
+
+fi
+echo "$as_me:10817: result: $cf_cv_term_header" >&5
+echo "${ECHO_T}$cf_cv_term_header" >&6
+
+# Set definitions to allow ifdef'ing to accommodate subdirectories
+
+case "$cf_cv_term_header" in
+(*term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_TERM_H 1
+EOF
+
+	;;
+esac
+
+case "$cf_cv_term_header" in
+(ncurses/term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSES_TERM_H 1
+EOF
+
+	;;
+(ncursesw/term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSESW_TERM_H 1
+EOF
+
+	;;
+esac
+
+# some applications need this, but should check for NCURSES_VERSION
+
+cat >>confdefs.h <<\EOF
+#define NCURSES 1
+EOF
+
+echo "$as_me:10855: checking for ncurses version" >&5
+echo $ECHO_N "checking for ncurses version... $ECHO_C" >&6
+if test "${cf_cv_ncurses_version+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cf_cv_ncurses_version=no
+	cf_tempfile=out$$
+	rm -f "$cf_tempfile"
+	if test "$cross_compiling" = yes; then
+
+	# This will not work if the preprocessor splits the line after the
+	# Autoconf token.  The 'unproto' program does that.
+	cat > "conftest.$ac_ext" <<EOF
+#include <${cf_cv_ncurses_header:-curses.h}>
+#undef Autoconf
+#ifdef NCURSES_VERSION
+Autoconf NCURSES_VERSION
+#else
+#ifdef __NCURSES_H
+Autoconf "old"
+#endif
+;
+#endif
+EOF
+	cf_try="$ac_cpp conftest.$ac_ext 2>&5 | grep '^Autoconf ' >conftest.out"
+	{ (eval echo "$as_me:10881: \"$cf_try\"") >&5
+  (eval $cf_try) 2>&5
+  ac_status=$?
+  echo "$as_me:10884: \$? = $ac_status" >&5
+  (exit "$ac_status"); }
+	if test -f conftest.out ; then
+		cf_out=`sed -e 's%^Autoconf %%' -e 's%^[^"]*"%%' -e 's%".*%%' conftest.out`
+		test -n "$cf_out" && cf_cv_ncurses_version="$cf_out"
+		rm -f conftest.out
+	fi
+
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 10894 "configure"
+#include "confdefs.h"
+
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <stdio.h>
+int main(void)
+{
+	FILE *fp = fopen("$cf_tempfile", "w");
+#ifdef NCURSES_VERSION
+# ifdef NCURSES_VERSION_PATCH
+	fprintf(fp, "%s.%d\\n", NCURSES_VERSION, NCURSES_VERSION_PATCH);
+# else
+	fprintf(fp, "%s\\n", NCURSES_VERSION);
+# endif
+#else
+# ifdef __NCURSES_H
+	fprintf(fp, "old\\n");
+# else
+	make an error
+# endif
+#endif
+	${cf_cv_main_return:-return}(0);
+}
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:10919: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:10922: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:10924: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:10927: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+	cf_cv_ncurses_version=`cat $cf_tempfile`
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+	rm -f "$cf_tempfile"
+
+fi
+echo "$as_me:10941: result: $cf_cv_ncurses_version" >&5
+echo "${ECHO_T}$cf_cv_ncurses_version" >&6
+test "$cf_cv_ncurses_version" = no ||
+cat >>confdefs.h <<\EOF
+#define NCURSES 1
+EOF
+
+cf_nculib_root=ncurses
+	# This works, except for the special case where we find gpm, but
+	# ncurses is in a nonstandard location via $LIBS, and we really want
+	# to link gpm.
+cf_ncurses_LIBS=""
+cf_ncurses_SAVE="$LIBS"
+echo "$as_me:10954: checking for Gpm_Open in -lgpm" >&5
+echo $ECHO_N "checking for Gpm_Open in -lgpm... $ECHO_C" >&6
+if test "${ac_cv_lib_gpm_Gpm_Open+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lgpm  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 10962 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char Gpm_Open ();
+int
+main (void)
+{
+Gpm_Open ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:10981: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:10984: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:10987: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:10990: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_gpm_Gpm_Open=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_gpm_Gpm_Open=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:11001: result: $ac_cv_lib_gpm_Gpm_Open" >&5
+echo "${ECHO_T}$ac_cv_lib_gpm_Gpm_Open" >&6
+if test "$ac_cv_lib_gpm_Gpm_Open" = yes; then
+  echo "$as_me:11004: checking for initscr in -lgpm" >&5
+echo $ECHO_N "checking for initscr in -lgpm... $ECHO_C" >&6
+if test "${ac_cv_lib_gpm_initscr+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lgpm  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 11012 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char initscr ();
+int
+main (void)
+{
+initscr ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:11031: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:11034: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:11037: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:11040: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_gpm_initscr=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_gpm_initscr=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:11051: result: $ac_cv_lib_gpm_initscr" >&5
+echo "${ECHO_T}$ac_cv_lib_gpm_initscr" >&6
+if test "$ac_cv_lib_gpm_initscr" = yes; then
+  LIBS="$cf_ncurses_SAVE"
+else
+  cf_ncurses_LIBS="-lgpm"
+fi
+
+fi
+
+case "$host_os" in
+(freebsd*)
+	# This is only necessary if you are linking against an obsolete
+	# version of ncurses (but it should do no harm, since it is static).
+	if test "$cf_nculib_root" = ncurses ; then
+		echo "$as_me:11066: checking for tgoto in -lmytinfo" >&5
+echo $ECHO_N "checking for tgoto in -lmytinfo... $ECHO_C" >&6
+if test "${ac_cv_lib_mytinfo_tgoto+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lmytinfo  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 11074 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char tgoto ();
+int
+main (void)
+{
+tgoto ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:11093: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:11096: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:11099: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:11102: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_mytinfo_tgoto=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_mytinfo_tgoto=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:11113: result: $ac_cv_lib_mytinfo_tgoto" >&5
+echo "${ECHO_T}$ac_cv_lib_mytinfo_tgoto" >&6
+if test "$ac_cv_lib_mytinfo_tgoto" = yes; then
+  cf_ncurses_LIBS="-lmytinfo $cf_ncurses_LIBS"
+fi
+
+	fi
+	;;
+esac
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_ncurses_LIBS; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+if test -n "$cf_cv_curses_dir" && test "$cf_cv_curses_dir" != "no"
+then
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -l$cf_nculib_root; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+else
+
+	eval 'cf_cv_have_lib_'"$cf_nculib_root"'=no'
+	cf_libdir=""
+	echo "$as_me:11162: checking for initscr" >&5
+echo $ECHO_N "checking for initscr... $ECHO_C" >&6
+if test "${ac_cv_func_initscr+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 11168 "configure"
+#include "confdefs.h"
+#define initscr autoconf_temporary
+#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
+#undef initscr
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char initscr (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_initscr) || defined (__stub___initscr)
+#error found stub for initscr
+#endif
+
+	return initscr ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:11199: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:11202: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:11205: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:11208: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_func_initscr=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_initscr=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:11218: result: $ac_cv_func_initscr" >&5
+echo "${ECHO_T}$ac_cv_func_initscr" >&6
+if test "$ac_cv_func_initscr" = yes; then
+  eval 'cf_cv_have_lib_'"$cf_nculib_root"'=yes'
+else
+
+		cf_save_LIBS="$LIBS"
+		echo "$as_me:11225: checking for initscr in -l$cf_nculib_root" >&5
+echo $ECHO_N "checking for initscr in -l$cf_nculib_root... $ECHO_C" >&6
+		LIBS="-l$cf_nculib_root $LIBS"
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 11229 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+initscr()
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:11241: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:11244: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:11247: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:11250: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  echo "$as_me:11252: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+			 eval 'cf_cv_have_lib_'"$cf_nculib_root"'=yes'
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+echo "$as_me:11259: result: no" >&5
+echo "${ECHO_T}no" >&6
+
+cf_search=
+cf_library_path_list=""
+if test -n "${LDFLAGS}${LIBS}" ; then
+	for cf_library_path in $LDFLAGS $LIBS
+	do
+		case "$cf_library_path" in
+		(-L*)
+			cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'`
+
+test "x$cf_library_path" != "xNONE" && \
+test -d "$cf_library_path" && \
+ {
+	test -n "$verbose" && echo "	... testing for lib-directories under $cf_library_path"
+	test -d "$cf_library_path/lib" &&          cf_search="$cf_search $cf_library_path/lib"
+	test -d "$cf_library_path/lib/$cf_nculib_root" &&       cf_search="$cf_search $cf_library_path/lib/$cf_nculib_root"
+	test -d "$cf_library_path/lib/$cf_nculib_root/lib" &&    cf_search="$cf_search $cf_library_path/lib/$cf_nculib_root/lib"
+	test -d "$cf_library_path/$cf_nculib_root/lib" &&       cf_search="$cf_search $cf_library_path/$cf_nculib_root/lib"
+	test -d "$cf_library_path/$cf_nculib_root/lib/$cf_nculib_root" &&    cf_search="$cf_search $cf_library_path/$cf_nculib_root/lib/$cf_nculib_root"
+}
+
+			cf_library_path_list="$cf_library_path_list $cf_search"
+			;;
+		esac
+	done
+fi
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+	test -n "$verbose" && echo "	... testing for lib-directories under $prefix"
+	test -d "$prefix/lib" &&          cf_search="$cf_search $prefix/lib"
+	test -d "$prefix/lib/$cf_nculib_root" &&       cf_search="$cf_search $prefix/lib/$cf_nculib_root"
+	test -d "$prefix/lib/$cf_nculib_root/lib" &&    cf_search="$cf_search $prefix/lib/$cf_nculib_root/lib"
+	test -d "$prefix/$cf_nculib_root/lib" &&       cf_search="$cf_search $prefix/$cf_nculib_root/lib"
+	test -d "$prefix/$cf_nculib_root/lib/$cf_nculib_root" &&    cf_search="$cf_search $prefix/$cf_nculib_root/lib/$cf_nculib_root"
+}
+
+for cf_subdir_prefix in \
+	/usr \
+	/usr/local \
+	/usr/pkg \
+	/opt \
+	/opt/local \
+	$HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+	test -n "$verbose" && echo "	... testing for lib-directories under $cf_subdir_prefix"
+	test -d "$cf_subdir_prefix/lib" &&          cf_search="$cf_search $cf_subdir_prefix/lib"
+	test -d "$cf_subdir_prefix/lib/$cf_nculib_root" &&       cf_search="$cf_search $cf_subdir_prefix/lib/$cf_nculib_root"
+	test -d "$cf_subdir_prefix/lib/$cf_nculib_root/lib" &&    cf_search="$cf_search $cf_subdir_prefix/lib/$cf_nculib_root/lib"
+	test -d "$cf_subdir_prefix/$cf_nculib_root/lib" &&       cf_search="$cf_search $cf_subdir_prefix/$cf_nculib_root/lib"
+	test -d "$cf_subdir_prefix/$cf_nculib_root/lib/$cf_nculib_root" &&    cf_search="$cf_search $cf_subdir_prefix/$cf_nculib_root/lib/$cf_nculib_root"
+}
+
+done
+
+cf_search="$cf_library_path_list $cf_search"
+
+			for cf_libdir in $cf_search
+			do
+				echo "$as_me:11327: checking for -l$cf_nculib_root in $cf_libdir" >&5
+echo $ECHO_N "checking for -l$cf_nculib_root in $cf_libdir... $ECHO_C" >&6
+				LIBS="-L$cf_libdir -l$cf_nculib_root $cf_save_LIBS"
+				cat >"conftest.$ac_ext" <<_ACEOF
+#line 11331 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+initscr()
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:11343: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:11346: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:11349: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:11352: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  echo "$as_me:11354: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+			 		 eval 'cf_cv_have_lib_'"$cf_nculib_root"'=yes'
+					 break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+echo "$as_me:11361: result: no" >&5
+echo "${ECHO_T}no" >&6
+					 LIBS="$cf_save_LIBS"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+			done
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+
+eval 'cf_found_library="$cf_cv_have_lib_'"$cf_nculib_root"\"
+
+if test "$cf_found_library" = no ; then
+	{ { echo "$as_me:11376: error: Cannot link $cf_nculib_root library" >&5
+echo "$as_me: error: Cannot link $cf_nculib_root library" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+fi
+
+if test -n "$cf_ncurses_LIBS" ; then
+	echo "$as_me:11384: checking if we can link $cf_nculib_root without $cf_ncurses_LIBS" >&5
+echo $ECHO_N "checking if we can link $cf_nculib_root without $cf_ncurses_LIBS... $ECHO_C" >&6
+	cf_ncurses_SAVE="$LIBS"
+	for p in $cf_ncurses_LIBS ; do
+		q=`echo "$LIBS" | sed -e "s%$p %%" -e "s%$p$%%"`
+		if test "$q" != "$LIBS" ; then
+			LIBS="$q"
+		fi
+	done
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 11394 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+initscr(); mousemask(0,0); tigetstr((char *)0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:11406: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:11409: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:11412: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:11415: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  echo "$as_me:11417: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+echo "$as_me:11422: result: no" >&5
+echo "${ECHO_T}no" >&6
+		 LIBS="$cf_ncurses_SAVE"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+
+cf_nculib_ROOT=`echo "HAVE_LIB$cf_nculib_root" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+cat >>confdefs.h <<EOF
+#define $cf_nculib_ROOT 1
+EOF
+
+	fi
+else
+	NCURSES_CONFIG=none
+fi
+
+fi
+
+if test "$NCURSES_CONFIG_PKG" != none ; then
+	cf_version=`$PKG_CONFIG --modversion $NCURSES_CONFIG_PKG 2>/dev/null`
+
+	NCURSES_MAJOR=`echo "$cf_version" | sed -e 's/\..*//'`
+	NCURSES_MINOR=`echo "$cf_version" | sed -e 's/^[0-9][0-9]*\.//' -e 's/\..*//'`
+	NCURSES_PATCH=`echo "$cf_version" | sed -e 's/^[0-9][0-9]*\.[0-9][0-9]*\.//'`
+
+	cf_cv_abi_version=`$PKG_CONFIG --variable=abi_version $NCURSES_CONFIG_PKG 2>/dev/null`
+	if test -z "$cf_cv_abi_version"
+	then
+		cf_cv_abi_version=`$PKG_CONFIG --variable=major_version $NCURSES_CONFIG_PKG 2>/dev/null`
+	fi
+
+elif test "$NCURSES_CONFIG" != none ; then
+
+	cf_version=`$NCURSES_CONFIG --version 2>/dev/null`
+
+	NCURSES_MAJOR=`echo "$cf_version" | sed -e 's/\..*//'`
+	NCURSES_MINOR=`echo "$cf_version" | sed -e 's/^[0-9][0-9]*\.//' -e 's/\..*//'`
+	NCURSES_PATCH=`echo "$cf_version" | sed -e 's/^[0-9][0-9]*\.[0-9][0-9]*\.//'`
+
+	# ABI version is not available from headers
+	cf_cv_abi_version=`$NCURSES_CONFIG --abi-version 2>/dev/null`
+
+else
+
+	for cf_name in MAJOR MINOR PATCH
+	do
+	cat >conftest.$ac_ext <<CF_EOF
+	#include <${cf_cv_ncurses_header:-curses.h}>
+	AUTOCONF_$cf_name NCURSES_VERSION_$cf_name
+CF_EOF
+		cf_try="$ac_cpp conftest.$ac_ext 2>&5 | fgrep AUTOCONF_$cf_name >conftest.out"
+		{ (eval echo "$as_me:11475: \"$cf_try\"") >&5
+  (eval $cf_try) 2>&5
+  ac_status=$?
+  echo "$as_me:11478: \$? = $ac_status" >&5
+  (exit "$ac_status"); }
+		if test -f conftest.out ; then
+			cf_result=`sed -e "s/^.*AUTOCONF_${cf_name}[ 	][ 	]*//" conftest.out`
+			eval NCURSES_$cf_name=\"$cf_result\"
+			# cat conftest.$ac_ext
+			# cat conftest.out
+		fi
+	done
+
+	cf_cv_abi_version=${NCURSES_MAJOR}
+
+fi
+
+cf_cv_rel_version=${NCURSES_MAJOR}.${NCURSES_MINOR}
+
+cf_cv_timestamp=`date`
+
+echo "$as_me:11496: result: Configuring NCURSES $cf_cv_rel_version ABI $cf_cv_abi_version ($cf_cv_timestamp)" >&5
+echo "${ECHO_T}Configuring NCURSES $cf_cv_rel_version ABI $cf_cv_abi_version ($cf_cv_timestamp)" >&6
+
+echo "$as_me:11499: checking if you want to have a library-prefix" >&5
+echo $ECHO_N "checking if you want to have a library-prefix... $ECHO_C" >&6
+
+# Check whether --with-lib-prefix or --without-lib-prefix was given.
+if test "${with_lib_prefix+set}" = set; then
+  withval="$with_lib_prefix"
+  with_lib_prefix=$withval
+else
+  with_lib_prefix=auto
+fi;
+echo "$as_me:11509: result: $with_lib_prefix" >&5
+echo "${ECHO_T}$with_lib_prefix" >&6
+
+if test "$with_lib_prefix" = auto
+then
+
+	case "$cf_cv_system_name" in
+	(OS/2*|os2*)
+		if test "$DFT_LWR_MODEL" = libtool; then
+			LIB_PREFIX='lib'
+		else
+			LIB_PREFIX=''
+		fi
+		;;
+	(*-msvc*)
+		LIB_PREFIX=''
+		;;
+	(*)	LIB_PREFIX='lib'
+		;;
+	esac
+cf_prefix=$LIB_PREFIX
+
+elif test "$with_lib_prefix" = no
+then
+	LIB_PREFIX=
+else
+	LIB_PREFIX=$with_lib_prefix
+fi
+
+LIB_SUFFIX=
+
+###############################################################################
+
+if test X"$CC_G_OPT" = X"" ; then
+	CC_G_OPT='-g'
+	test -n "$GCC" && test "${ac_cv_prog_cc_g}" != yes && CC_G_OPT=''
+fi
+
+echo "$as_me:11547: checking for default loader flags" >&5
+echo $ECHO_N "checking for default loader flags... $ECHO_C" >&6
+case $DFT_LWR_MODEL in
+(normal)  LD_MODEL=''   ;;
+(debug)   LD_MODEL=$CC_G_OPT ;;
+(profile) LD_MODEL='-pg';;
+(shared)  LD_MODEL=''   ;;
+esac
+echo "$as_me:11555: result: $LD_MODEL" >&5
+echo "${ECHO_T}$LD_MODEL" >&6
+
+LD_RPATH_OPT=
+if test "x$cf_cv_enable_rpath" != xno
+then
+	echo "$as_me:11561: checking for an rpath option" >&5
+echo $ECHO_N "checking for an rpath option... $ECHO_C" >&6
+	case "$cf_cv_system_name" in
+	(irix*)
+		if test "$GCC" = yes; then
+			LD_RPATH_OPT="-Wl,-rpath,"
+		else
+			LD_RPATH_OPT="-rpath "
+		fi
+		;;
+	(linux*|gnu*|k*bsd*-gnu|freebsd*)
+		LD_RPATH_OPT="-Wl,-rpath,"
+		;;
+	(openbsd[2-9].*|mirbsd*)
+		LD_RPATH_OPT="-Wl,-rpath,"
+		;;
+	(dragonfly*)
+		LD_RPATH_OPT="-rpath "
+		;;
+	(netbsd*)
+		LD_RPATH_OPT="-Wl,-rpath,"
+		;;
+	(osf*|mls+*)
+		LD_RPATH_OPT="-rpath "
+		;;
+	(solaris2*)
+		LD_RPATH_OPT="-R"
+		;;
+	(*)
+		;;
+	esac
+	echo "$as_me:11592: result: $LD_RPATH_OPT" >&5
+echo "${ECHO_T}$LD_RPATH_OPT" >&6
+
+	case "x$LD_RPATH_OPT" in
+	(x-R*)
+		echo "$as_me:11597: checking if we need a space after rpath option" >&5
+echo $ECHO_N "checking if we need a space after rpath option... $ECHO_C" >&6
+		cf_save_LIBS="$LIBS"
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in ${LD_RPATH_OPT}$libdir; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 11618 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:11630: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:11633: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:11636: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:11639: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_rpath_space=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_rpath_space=yes
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+		LIBS="$cf_save_LIBS"
+		echo "$as_me:11649: result: $cf_rpath_space" >&5
+echo "${ECHO_T}$cf_rpath_space" >&6
+		test "$cf_rpath_space" = yes && LD_RPATH_OPT="$LD_RPATH_OPT "
+		;;
+	esac
+fi
+
+	RM_SHARED_OPTS=
+	LOCAL_LDFLAGS=
+	LOCAL_LDFLAGS2=
+	LD_SHARED_OPTS=
+	INSTALL_LIB="-m 644"
+	: ${rel_builddir:=.}
+
+	shlibdir=$libdir
+
+	MAKE_DLLS="#"
+
+	cf_cv_do_symlinks=no
+	cf_ld_rpath_opt=
+	test "$cf_cv_enable_rpath" = yes && cf_ld_rpath_opt="$LD_RPATH_OPT"
+
+	echo "$as_me:11671: checking if release/abi version should be used for shared libs" >&5
+echo $ECHO_N "checking if release/abi version should be used for shared libs... $ECHO_C" >&6
+
+# Check whether --with-shlib-version or --without-shlib-version was given.
+if test "${with_shlib_version+set}" = set; then
+  withval="$with_shlib_version"
+  test -z "$withval" && withval=auto
+	case "$withval" in
+	(yes)
+		cf_cv_shlib_version=auto
+		;;
+	(rel|abi|auto)
+		cf_cv_shlib_version=$withval
+		;;
+	(*)
+		echo "$as_me:11686: result: $withval" >&5
+echo "${ECHO_T}$withval" >&6
+		{ { echo "$as_me:11688: error: option value must be one of: rel, abi, or auto" >&5
+echo "$as_me: error: option value must be one of: rel, abi, or auto" >&2;}
+   { (exit 1); exit 1; }; }
+		;;
+	esac
+
+else
+  cf_cv_shlib_version=auto
+fi;
+	echo "$as_me:11697: result: $cf_cv_shlib_version" >&5
+echo "${ECHO_T}$cf_cv_shlib_version" >&6
+
+	cf_cv_rm_so_locs=no
+	cf_try_cflags=
+
+	# Some less-capable ports of gcc support only -fpic
+	CC_SHARED_OPTS=
+
+	cf_try_fPIC=no
+	if test "$GCC" = yes
+	then
+		cf_try_fPIC=yes
+	else
+		case "$cf_cv_system_name" in
+		(*linux*)	# e.g., PGI compiler
+			cf_try_fPIC=yes
+			;;
+		esac
+	fi
+
+	if test "$cf_try_fPIC" = yes
+	then
+		echo "$as_me:11720: checking which $CC option to use" >&5
+echo $ECHO_N "checking which $CC option to use... $ECHO_C" >&6
+		cf_save_CFLAGS="$CFLAGS"
+		for CC_SHARED_OPTS in -fPIC -fpic ''
+		do
+			CFLAGS="$cf_save_CFLAGS $CC_SHARED_OPTS"
+			cat >"conftest.$ac_ext" <<_ACEOF
+#line 11727 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+int x = 1
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:11739: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:11742: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:11745: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:11748: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+		done
+		echo "$as_me:11757: result: $CC_SHARED_OPTS" >&5
+echo "${ECHO_T}$CC_SHARED_OPTS" >&6
+		CFLAGS="$cf_save_CFLAGS"
+	fi
+
+	cf_cv_shlib_version_infix=no
+
+	case "$cf_cv_system_name" in
+	(aix4.3-9*|aix[5-7]*)
+		if test "$GCC" = yes; then
+			CC_SHARED_OPTS='-Wl,-brtl'
+			MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-brtl -Wl,-blibpath:${RPATH_LIST}:/usr/lib -o $@'
+		else
+			CC_SHARED_OPTS='-brtl'
+			# as well as '-qpic=large -G' or perhaps "-bM:SRE -bnoentry -bexpall"
+			MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -G -Wl,-brtl -Wl,-blibpath:${RPATH_LIST}:/usr/lib -o $@'
+		fi
+		;;
+	(beos*)
+		MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -o $@ -Xlinker -soname=`basename $@` -nostart -e 0'
+		;;
+	(cygwin*)
+		CC_SHARED_OPTS=
+		MK_SHARED_LIB=$SHELL' '$rel_builddir'/mk_shared_lib.sh $@ ${CC} ${CFLAGS}'
+		RM_SHARED_OPTS="$RM_SHARED_OPTS $rel_builddir/mk_shared_lib.sh *.dll.a"
+		cf_cv_shlib_version=cygdll
+		cf_cv_shlib_version_infix=cygdll
+		shlibdir=$bindir
+		MAKE_DLLS=
+		cat >mk_shared_lib.sh <<-CF_EOF
+		#!$SHELL
+		SHARED_LIB=\$1
+		IMPORT_LIB=\`echo "\$1" | sed -e 's/cyg/lib/' -e 's/[0-9]*\.dll$/.dll.a/'\`
+		shift
+		cat <<-EOF
+		Linking shared library
+		** SHARED_LIB \$SHARED_LIB
+		** IMPORT_LIB \$IMPORT_LIB
+EOF
+		exec \$* ${LDFLAGS} -shared -Wl,--out-implib=\${IMPORT_LIB} -Wl,--export-all-symbols -o \${SHARED_LIB}
+CF_EOF
+		chmod +x mk_shared_lib.sh
+		;;
+	(msys*)
+		CC_SHARED_OPTS=
+		MK_SHARED_LIB=$SHELL' '$rel_builddir'/mk_shared_lib.sh $@ ${CC} ${CFLAGS}'
+		RM_SHARED_OPTS="$RM_SHARED_OPTS $rel_builddir/mk_shared_lib.sh *.dll.a"
+		cf_cv_shlib_version=msysdll
+		cf_cv_shlib_version_infix=msysdll
+		shlibdir=$bindir
+		MAKE_DLLS=
+		cat >mk_shared_lib.sh <<-CF_EOF
+		#!$SHELL
+		SHARED_LIB=\$1
+		IMPORT_LIB=\`echo "\$1" | sed -e 's/msys-/lib/' -e 's/[0-9]*\.dll$/.dll.a/'\`
+		shift
+		cat <<-EOF
+		Linking shared library
+		** SHARED_LIB \$SHARED_LIB
+		** IMPORT_LIB \$IMPORT_LIB
+EOF
+		exec \$* ${LDFLAGS} -shared -Wl,--out-implib=\${IMPORT_LIB} -Wl,--export-all-symbols -o \${SHARED_LIB}
+CF_EOF
+		chmod +x mk_shared_lib.sh
+		;;
+	(darwin*)
+		cf_try_cflags="no-cpp-precomp"
+		CC_SHARED_OPTS="-dynamic"
+		MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -dynamiclib -install_name ${libdir}/`basename $@` -compatibility_version ${ABI_VERSION} -current_version ${ABI_VERSION} -o $@'
+		test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=abi
+		cf_cv_shlib_version_infix=yes
+		echo "$as_me:11828: checking if ld -search_paths_first works" >&5
+echo $ECHO_N "checking if ld -search_paths_first works... $ECHO_C" >&6
+if test "${cf_cv_ldflags_search_paths_first+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+			cf_save_LDFLAGS=$LDFLAGS
+			LDFLAGS="$LDFLAGS -Wl,-search_paths_first"
+			cat >"conftest.$ac_ext" <<_ACEOF
+#line 11837 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+int i;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:11849: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:11852: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:11855: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:11858: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_ldflags_search_paths_first=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_ldflags_search_paths_first=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+				LDFLAGS=$cf_save_LDFLAGS
+fi
+echo "$as_me:11869: result: $cf_cv_ldflags_search_paths_first" >&5
+echo "${ECHO_T}$cf_cv_ldflags_search_paths_first" >&6
+		if test "$cf_cv_ldflags_search_paths_first" = yes; then
+			LDFLAGS="$LDFLAGS -Wl,-search_paths_first"
+		fi
+		;;
+	(haiku*)
+
+	test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel
+	if test "$cf_cv_shlib_version" = rel; then
+		cf_cv_shared_soname='`basename $@ .${REL_VERSION}`.${ABI_VERSION}'
+	else
+		cf_cv_shared_soname='`basename $@`'
+	fi
+
+		MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,'$cf_cv_shared_soname',-stats,-lc -o $@'
+		;;
+	(hpux[7-8]*)
+		# HP-UX 8.07 ld lacks "+b" option used for libdir search-list
+		if test "$GCC" != yes; then
+			CC_SHARED_OPTS='+Z'
+		fi
+		MK_SHARED_LIB='${LD} ${LDFLAGS} -b -o $@'
+		INSTALL_LIB="-m 555"
+		;;
+	(hpux*)
+		# (tested with gcc 2.7.2 -- I don't have c89)
+		if test "$GCC" = yes; then
+			LD_SHARED_OPTS='-Xlinker +b -Xlinker ${libdir}'
+		else
+			CC_SHARED_OPTS='+Z'
+			LD_SHARED_OPTS='-Wl,+b,${libdir}'
+		fi
+		MK_SHARED_LIB='${LD} ${LDFLAGS} +b ${libdir} -b -o $@'
+		# HP-UX shared libraries must be executable, and should be
+		# readonly to exploit a quirk in the memory manager.
+		INSTALL_LIB="-m 555"
+		;;
+	(interix*)
+		test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel
+		if test "$cf_cv_shlib_version" = rel; then
+			cf_shared_soname='`basename $@ .${REL_VERSION}`.${ABI_VERSION}'
+		else
+			cf_shared_soname='`basename $@`'
+		fi
+		CC_SHARED_OPTS=
+		MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-rpath,${RPATH_LIST} -Wl,-h,'$cf_shared_soname' -o $@'
+		;;
+	(irix*)
+		if test "$cf_cv_enable_rpath" = yes ; then
+			EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS"
+		fi
+		# tested with IRIX 5.2 and 'cc'.
+		if test "$GCC" != yes; then
+			CC_SHARED_OPTS='-KPIC'
+			MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -rdata_shared -soname `basename $@` -o $@'
+		else
+			MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,`basename $@` -o $@'
+		fi
+		cf_cv_rm_so_locs=yes
+		;;
+	(linux*|gnu*|k*bsd*-gnu)
+		if test "$DFT_LWR_MODEL" = "shared" && test -n "$LD_RPATH_OPT" ; then
+			LOCAL_LDFLAGS="${LD_RPATH_OPT}\$(LOCAL_LIBDIR)"
+			LOCAL_LDFLAGS2="$LOCAL_LDFLAGS"
+		fi
+		if test "$cf_cv_enable_rpath" = yes ; then
+			EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS"
+		fi
+
+	test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel
+	if test "$cf_cv_shlib_version" = rel; then
+		cf_cv_shared_soname='`basename $@ .${REL_VERSION}`.${ABI_VERSION}'
+	else
+		cf_cv_shared_soname='`basename $@`'
+	fi
+
+		MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,'$cf_cv_shared_soname',-stats,-lc -o $@'
+		;;
+	(mingw*msvc*)
+		cf_cv_shlib_version=msvcdll
+		cf_cv_shlib_version_infix=msvcdll
+		shlibdir=$bindir
+		MAKE_DLLS=
+		if test "$DFT_LWR_MODEL" = "shared" ; then
+			LOCAL_LDFLAGS="-link -dll"
+			LOCAL_LDFLAGS2="$LOCAL_LDFLAGS"
+			EXTRA_LDFLAGS="-link -dll $EXTRA_LDFLAGS"
+		fi
+		CC_SHARED_OPTS=
+		MK_SHARED_LIB=$SHELL' '$rel_builddir'/mk_shared_lib.sh $@ ${LD} ${CFLAGS}'
+		RM_SHARED_OPTS="$RM_SHARED_OPTS $rel_builddir/mk_shared_lib.sh *.dll.lib"
+		cat >mk_shared_lib.sh <<-CF_EOF
+		#!$SHELL
+		SHARED_LIB=\$1
+		IMPORT_LIB=\`echo "\$1" | sed -e 's/[0-9]*\.dll$/.dll.lib/'\`
+		shift
+		my_ld=\$1
+		shift
+		cat <<-EOF
+		Linking shared library
+		** SHARED LIB \$SHARED_LIB
+		** IMPORT_LIB \$IMPORT_LIB
+EOF
+		args=\$(echo \$* | sed -E "s#-l(\w*)#\1.dll.lib#g" | sed -E "s#-L(\w*)#-LIBPATH:\1#g")
+		exec \$my_ld -DLL -IMPLIB:"\${IMPORT_LIB}" -OUT:"\${SHARED_LIB}" ${LDFLAGS} \$args
+		mv "\${IMPORT_LIB}" "\${IMPORT_LIB}"
+CF_EOF
+		chmod +x mk_shared_lib.sh
+		cat >mk_prog.sh <<-CF_EOF
+		#!$SHELL
+		shift
+		# Ignore first argument (compiler) and use LD (link.exe) unconditionally
+		LD="$LD"
+		clopts=()
+		ldopts=("/subsystem:console")
+		libs=()
+		isdll=0
+		while test \$# -gt 0; do
+			case "\$1" in
+				-link)
+					# ignore -link argument
+					;;
+				-M[TD] | -M[TD]d)
+					# ignore runtime-library option
+					;;
+				-dll)
+					isdll=1
+					;;
+				-W* | -w*)
+					# ignore warnings
+					;;
+				-D*)
+					clopts+=("\$1")
+					;;
+				-I*)
+					clopts+=("\$1")
+					;;
+				-l*)
+					libs+=("\`echo \"\$1\" | sed \"s/^-l//\"\`")
+					;;
+				-L*)
+					ldopts+=("\`echo \"\$1\" | sed \"s/^-L/-LIBPATH:/\"\`")
+					;;
+				*.obj | *.o)
+					ldopts+=("\$1")
+					;;
+				-Wl,*)
+					for linkarg in \`echo '\$1' | sed -e 's/-Wl,//' -e 's/,/ /'\`; do
+						ldopts+=("\${linkarg}")
+					done
+					;;
+				*.lib)
+					ldopts+=("\$1")
+					;;
+				-o)
+					shift
+					ldopts+=("-out:\$1")
+					;;
+				*)
+					clopts+=("\$1")
+					ldopts+=("\$1")
+					;;
+			esac
+			shift
+		done
+		if [ "\$isdll" -ne 0 ]; then
+			for lib in \${libs[*]}; do
+				ldopts+=("\$lib.dll.lib")
+			done
+		else
+			for lib in \${libs[*]}; do
+				ldopts+=("\$lib.lib")
+			done
+		fi
+		cat <<-EOF
+		Creating program
+		** ld options:   "\${ldopts[@]}"
+EOF
+		exec \$LD \${ldopts[@]}
+CF_EOF
+		chmod +x mk_prog.sh
+		LINK_PROGS="$SHELL ${rel_builddir}/mk_prog.sh"
+		LINK_TESTS="$SHELL ${rel_builddir}/mk_prog.sh"
+		;;
+	(mingw*)
+		cf_cv_shlib_version=mingw
+		cf_cv_shlib_version_infix=mingw
+		shlibdir=$bindir
+		MAKE_DLLS=
+		if test "$DFT_LWR_MODEL" = "shared" ; then
+			LOCAL_LDFLAGS="-Wl,--enable-auto-import"
+			LOCAL_LDFLAGS2="$LOCAL_LDFLAGS"
+			EXTRA_LDFLAGS="-Wl,--enable-auto-import $EXTRA_LDFLAGS"
+		fi
+		CC_SHARED_OPTS=
+		MK_SHARED_LIB=$SHELL' '$rel_builddir'/mk_shared_lib.sh $@ ${CC} ${CFLAGS}'
+		RM_SHARED_OPTS="$RM_SHARED_OPTS $rel_builddir/mk_shared_lib.sh *.dll.a"
+		cat >mk_shared_lib.sh <<-CF_EOF
+		#!$SHELL
+		SHARED_LIB=\$1
+		IMPORT_LIB=\`echo "\$1" | sed -e 's/[0-9]*\.dll$/.dll.a/'\`
+		shift
+		cat <<-EOF
+		Linking shared library
+		** SHARED_LIB \$SHARED_LIB
+		** IMPORT_LIB \$IMPORT_LIB
+EOF
+		exec \$* ${LDFLAGS} -shared -Wl,--enable-auto-import,--out-implib=\${IMPORT_LIB} -Wl,--export-all-symbols -o \${SHARED_LIB}
+CF_EOF
+		chmod +x mk_shared_lib.sh
+		;;
+	(openbsd[2-9].*|mirbsd*)
+		if test "$DFT_LWR_MODEL" = "shared" && test -n "$LD_RPATH_OPT" ; then
+			LOCAL_LDFLAGS="${LD_RPATH_OPT}\$(LOCAL_LIBDIR)"
+			LOCAL_LDFLAGS2="$LOCAL_LDFLAGS"
+		fi
+		if test "$cf_cv_enable_rpath" = yes ; then
+			EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS"
+		fi
+		CC_SHARED_OPTS="$CC_SHARED_OPTS -DPIC"
+
+	test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel
+	if test "$cf_cv_shlib_version" = rel; then
+		cf_cv_shared_soname='`basename $@ .${REL_VERSION}`.${ABI_VERSION}'
+	else
+		cf_cv_shared_soname='`basename $@`'
+	fi
+
+		MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-Bshareable,-soname,'$cf_cv_shared_soname',-stats,-lc -o $@'
+		;;
+	(nskJ*)
+		CC_SHARED_OPTS=
+		MK_SHARED_LIB='${LD} -Wshared -Weld=-export_all -o $@'
+		;;
+	(nskL*)
+		CC_SHARED_OPTS=
+		MK_SHARED_LIB='${LD} -Wshared -Wxld=-export_all -o $@'
+		;;
+	(nto-qnx*|openbsd*|freebsd[12].*)
+		CC_SHARED_OPTS="$CC_SHARED_OPTS -DPIC"
+		MK_SHARED_LIB='${LD} ${LDFLAGS} -Bshareable -o $@'
+		test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel
+		;;
+	(dragonfly*|freebsd*)
+		CC_SHARED_OPTS="$CC_SHARED_OPTS -DPIC"
+		if test "$DFT_LWR_MODEL" = "shared" && test "$cf_cv_enable_rpath" = yes ; then
+			LOCAL_LDFLAGS="${cf_ld_rpath_opt}\$(LOCAL_LIBDIR)"
+			LOCAL_LDFLAGS2="${cf_ld_rpath_opt}\${RPATH_LIST} $LOCAL_LDFLAGS"
+			EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS"
+		fi
+
+	test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel
+	if test "$cf_cv_shlib_version" = rel; then
+		cf_cv_shared_soname='`basename $@ .${REL_VERSION}`.${ABI_VERSION}'
+	else
+		cf_cv_shared_soname='`basename $@`'
+	fi
+
+		MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,'$cf_cv_shared_soname',-stats,-lc -o $@'
+		;;
+	(netbsd*)
+		CC_SHARED_OPTS="$CC_SHARED_OPTS -DPIC"
+		if test "$DFT_LWR_MODEL" = "shared" && test "$cf_cv_enable_rpath" = yes ; then
+			LOCAL_LDFLAGS="${cf_ld_rpath_opt}\$(LOCAL_LIBDIR)"
+			LOCAL_LDFLAGS2="$LOCAL_LDFLAGS"
+			EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS"
+			if test "$cf_cv_shlib_version" = auto; then
+			if test -f /usr/libexec/ld.elf_so; then
+				cf_cv_shlib_version=abi
+			else
+				cf_cv_shlib_version=rel
+			fi
+			fi
+
+	test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel
+	if test "$cf_cv_shlib_version" = rel; then
+		cf_cv_shared_soname='`basename $@ .${REL_VERSION}`.${ABI_VERSION}'
+	else
+		cf_cv_shared_soname='`basename $@`'
+	fi
+
+			MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,'$cf_cv_shared_soname' -o $@'
+		else
+			MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -o $@'
+		fi
+		;;
+	(osf*|mls+*)
+		# tested with OSF/1 V3.2 and 'cc'
+		# tested with OSF/1 V3.2 and gcc 2.6.3 (but the c++ demo didn't
+		# link with shared libs).
+		MK_SHARED_LIB='${LD} ${LDFLAGS} -set_version ${REL_VERSION}:${ABI_VERSION} -expect_unresolved "*" -shared -soname `basename $@`'
+		case "$host_os" in
+		(osf4*)
+			MK_SHARED_LIB="${MK_SHARED_LIB} -msym"
+			;;
+		esac
+		MK_SHARED_LIB="${MK_SHARED_LIB}"' -o $@'
+		if test "$DFT_LWR_MODEL" = "shared" && test -n "$LD_RPATH_OPT" ; then
+			LOCAL_LDFLAGS="${LD_RPATH_OPT}\$(LOCAL_LIBDIR)"
+			LOCAL_LDFLAGS2="$LOCAL_LDFLAGS"
+		fi
+		cf_cv_rm_so_locs=yes
+		;;
+	(sco3.2v5*)  # also uw2* and UW7: hops 13-Apr-98
+		# tested with osr5.0.5
+		if test "$GCC" != yes; then
+			CC_SHARED_OPTS='-belf -KPIC'
+		fi
+		MK_SHARED_LIB='${LD} ${LDFLAGS} -dy -G -h `basename $@ .${REL_VERSION}`.${ABI_VERSION} -o $@'
+		if test "$cf_cv_enable_rpath" = yes ; then
+			# only way is to set LD_RUN_PATH but no switch for it
+			RUN_PATH=$libdir
+		fi
+		test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel
+		LINK_PROGS='LD_RUN_PATH=${libdir}'
+		LINK_TESTS='Pwd=`pwd`;LD_RUN_PATH=`dirname $${Pwd}`/lib'
+		;;
+	(sunos4*)
+		# tested with SunOS 4.1.1 and gcc 2.7.0
+		if test "$GCC" != yes; then
+			CC_SHARED_OPTS='-KPIC'
+		fi
+		MK_SHARED_LIB='${LD} ${LDFLAGS} -assert pure-text -o $@'
+		test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel
+		;;
+	(solaris2*)
+		# tested with SunOS 5.5.1 (solaris 2.5.1) and gcc 2.7.2
+		# tested with SunOS 5.10 (solaris 10) and gcc 3.4.3
+		if test "$DFT_LWR_MODEL" = "shared" ; then
+			LOCAL_LDFLAGS="-R \$(LOCAL_LIBDIR):\${libdir}"
+			LOCAL_LDFLAGS2="$LOCAL_LDFLAGS"
+		fi
+		if test "$cf_cv_enable_rpath" = yes ; then
+			EXTRA_LDFLAGS="-R \${libdir} $EXTRA_LDFLAGS"
+		fi
+
+	test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel
+	if test "$cf_cv_shlib_version" = rel; then
+		cf_cv_shared_soname='`basename $@ .${REL_VERSION}`.${ABI_VERSION}'
+	else
+		cf_cv_shared_soname='`basename $@`'
+	fi
+
+		if test "$GCC" != yes; then
+			cf_save_CFLAGS="$CFLAGS"
+			for cf_shared_opts in -xcode=pic32 -xcode=pic13 -KPIC -Kpic -O
+			do
+				CFLAGS="$cf_shared_opts $cf_save_CFLAGS"
+				cat >"conftest.$ac_ext" <<_ACEOF
+#line 12219 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello\\n");
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:12231: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:12234: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:12237: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:12240: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+			done
+			CFLAGS="$cf_save_CFLAGS"
+			CC_SHARED_OPTS=$cf_shared_opts
+			MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -dy -G -h '$cf_cv_shared_soname' -o $@'
+		else
+			MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -dy -G -h '$cf_cv_shared_soname' -o $@'
+		fi
+		;;
+	(sysv5uw7*|unix_sv*)
+		# tested with UnixWare 7.1.0 (gcc 2.95.2 and cc)
+		if test "$GCC" != yes; then
+			CC_SHARED_OPTS='-KPIC'
+		fi
+		MK_SHARED_LIB='${LD} ${LDFLAGS} -d y -G -o $@'
+		;;
+	(*)
+		CC_SHARED_OPTS='unknown'
+		MK_SHARED_LIB='echo unknown'
+		;;
+	esac
+
+	# This works if the last tokens in $MK_SHARED_LIB are the -o target.
+	case "$cf_cv_shlib_version" in
+	(rel|abi)
+		case "$MK_SHARED_LIB" in
+		(*'-o $@')
+			test "$cf_cv_do_symlinks" = no && cf_cv_do_symlinks=yes
+			;;
+		(*)
+			{ echo "$as_me:12277: WARNING: ignored --with-shlib-version" >&5
+echo "$as_me: WARNING: ignored --with-shlib-version" >&2;}
+			;;
+		esac
+		;;
+	esac
+
+	if test -n "$cf_try_cflags"
+	then
+cat > conftest.$ac_ext <<EOF
+#line 12287 "${as_me:-configure}"
+#include <stdio.h>
+int main(int argc, char *argv[])
+{
+	printf("hello\\n");
+	return (argv[argc-1] == 0) ;
+}
+EOF
+		cf_save_CFLAGS="$CFLAGS"
+		for cf_opt in $cf_try_cflags
+		do
+			CFLAGS="$cf_save_CFLAGS -$cf_opt"
+			echo "$as_me:12299: checking if CFLAGS option -$cf_opt works" >&5
+echo $ECHO_N "checking if CFLAGS option -$cf_opt works... $ECHO_C" >&6
+			if { (eval echo "$as_me:12301: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:12304: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; then
+				echo "$as_me:12306: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+				cf_save_CFLAGS="$CFLAGS"
+			else
+				echo "$as_me:12310: result: no" >&5
+echo "${ECHO_T}no" >&6
+			fi
+		done
+		CFLAGS="$cf_save_CFLAGS"
+	fi
+
+	# RPATH_LIST is a colon-separated list of directories
+	test -n "$cf_ld_rpath_opt" && MK_SHARED_LIB="$MK_SHARED_LIB $cf_ld_rpath_opt\${RPATH_LIST}"
+	test -z "$RPATH_LIST" && RPATH_LIST="\${libdir}"
+
+	test "$cf_cv_rm_so_locs" = yes && RM_SHARED_OPTS="$RM_SHARED_OPTS so_locations"
+
+	test -n "$verbose" && echo "	CC_SHARED_OPTS: $CC_SHARED_OPTS" 1>&6
+
+echo "${as_me:-configure}:12325: testing CC_SHARED_OPTS: $CC_SHARED_OPTS ..." 1>&5
+
+	test -n "$verbose" && echo "	MK_SHARED_LIB:  $MK_SHARED_LIB" 1>&6
+
+echo "${as_me:-configure}:12329: testing MK_SHARED_LIB:  $MK_SHARED_LIB ..." 1>&5
+
+# The test/sample programs in the original tree link using rpath option.
+# Make it optional for packagers.
+if test -n "$LOCAL_LDFLAGS"
+then
+	echo "$as_me:12335: checking if you want to link sample programs with rpath option" >&5
+echo $ECHO_N "checking if you want to link sample programs with rpath option... $ECHO_C" >&6
+
+# Check whether --enable-rpath-link or --disable-rpath-link was given.
+if test "${enable_rpath_link+set}" = set; then
+  enableval="$enable_rpath_link"
+  with_rpath_link=$enableval
+else
+  with_rpath_link=yes
+fi;
+	echo "$as_me:12345: result: $with_rpath_link" >&5
+echo "${ECHO_T}$with_rpath_link" >&6
+	if test "$with_rpath_link" = no
+	then
+		LOCAL_LDFLAGS=
+		LOCAL_LDFLAGS2=
+	fi
+fi
+
+###############################################################################
+
+###   use option --enable-broken-linker to force on use of broken-linker support
+
+echo "$as_me:12358: checking if you want broken-linker support code" >&5
+echo $ECHO_N "checking if you want broken-linker support code... $ECHO_C" >&6
+
+# Check whether --enable-broken_linker or --disable-broken_linker was given.
+if test "${enable_broken_linker+set}" = set; then
+  enableval="$enable_broken_linker"
+  with_broken_linker=$enableval
+else
+  with_broken_linker=no
+fi;
+echo "$as_me:12368: result: $with_broken_linker" >&5
+echo "${ECHO_T}$with_broken_linker" >&6
+
+: "${BROKEN_LINKER:=0}"
+if test "x$with_broken_linker" = xyes ; then
+
+cat >>confdefs.h <<\EOF
+#define BROKEN_LINKER 1
+EOF
+
+	BROKEN_LINKER=1
+fi
+
+# Check to define _XOPEN_SOURCE "automatically"
+
+echo "$as_me:12383: checking if the POSIX test-macros are already defined" >&5
+echo $ECHO_N "checking if the POSIX test-macros are already defined... $ECHO_C" >&6
+if test "${cf_cv_posix_visible+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 12390 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+
+#if defined(__POSIX_VISIBLE) && ((__POSIX_VISIBLE - 0L) > 0) \
+	&& defined(__XSI_VISIBLE) && ((__XSI_VISIBLE - 0L) > 0) \
+	&& defined(__BSD_VISIBLE) && ((__BSD_VISIBLE - 0L) > 0) \
+	&& defined(__ISO_C_VISIBLE) && ((__ISO_C_VISIBLE - 0L) > 0)
+#error conflicting symbols found
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:12409: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:12412: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:12415: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:12418: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_posix_visible=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_posix_visible=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:12429: result: $cf_cv_posix_visible" >&5
+echo "${ECHO_T}$cf_cv_posix_visible" >&6
+
+if test "$cf_cv_posix_visible" = no; then
+
+cf_XOPEN_SOURCE=600
+cf_POSIX_C_SOURCE=199506L
+cf_xopen_source=
+
+case "$host_os" in
+(aix[4-7]*)
+	cf_xopen_source="-D_ALL_SOURCE"
+	;;
+(msys)
+	cf_XOPEN_SOURCE=600
+	;;
+(darwin[0-8].*)
+	cf_xopen_source="-D_APPLE_C_SOURCE"
+	;;
+(darwin*)
+	cf_xopen_source="-D_DARWIN_C_SOURCE"
+	cf_XOPEN_SOURCE=
+	;;
+(freebsd*|dragonfly*|midnightbsd*)
+	# 5.x headers associate
+	#	_XOPEN_SOURCE=600 with _POSIX_C_SOURCE=200112L
+	#	_XOPEN_SOURCE=500 with _POSIX_C_SOURCE=199506L
+	cf_POSIX_C_SOURCE=200112L
+	cf_XOPEN_SOURCE=600
+	cf_xopen_source="-D_BSD_TYPES -D__BSD_VISIBLE -D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE -D_XOPEN_SOURCE=$cf_XOPEN_SOURCE"
+	;;
+(hpux11*)
+	cf_xopen_source="-D_HPUX_SOURCE -D_XOPEN_SOURCE=500"
+	;;
+(hpux*)
+	cf_xopen_source="-D_HPUX_SOURCE"
+	;;
+(irix[56].*)
+	cf_xopen_source="-D_SGI_SOURCE"
+	cf_XOPEN_SOURCE=
+	;;
+(linux*gnu|linux*gnuabi64|linux*gnuabin32|linux*gnueabi|linux*gnueabihf|linux*gnux32|uclinux*|gnu*|mint*|k*bsd*-gnu|cygwin)
+
+cf_gnu_xopen_source=$cf_XOPEN_SOURCE
+
+echo "$as_me:12474: checking if this is the GNU C library" >&5
+echo $ECHO_N "checking if this is the GNU C library... $ECHO_C" >&6
+if test "${cf_cv_gnu_library+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 12481 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+	#if __GLIBC__ > 0 && __GLIBC_MINOR__ >= 0
+		return 0;
+	#elif __NEWLIB__ > 0 && __NEWLIB_MINOR__ >= 0
+		return 0;
+	#else
+	#	error not GNU C library
+	#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:12500: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:12503: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:12506: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:12509: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_gnu_library=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_gnu_library=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:12520: result: $cf_cv_gnu_library" >&5
+echo "${ECHO_T}$cf_cv_gnu_library" >&6
+
+if test x$cf_cv_gnu_library = xyes; then
+
+	# With glibc 2.19 (13 years after this check was begun), _DEFAULT_SOURCE
+	# was changed to help a little.  newlib incorporated the change about 4
+	# years later.
+	echo "$as_me:12528: checking if _DEFAULT_SOURCE can be used as a basis" >&5
+echo $ECHO_N "checking if _DEFAULT_SOURCE can be used as a basis... $ECHO_C" >&6
+if test "${cf_cv_gnu_library_219+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+		cf_save="$CPPFLAGS"
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-D_DEFAULT_SOURCE"
+
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 12540 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+			#if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 19) || (__GLIBC__ > 2)
+				return 0;
+			#elif (__NEWLIB__ == 2 && __NEWLIB_MINOR__ >= 4) || (__GLIBC__ > 3)
+				return 0;
+			#else
+			#	error GNU C library __GLIBC__.__GLIBC_MINOR__ is too old
+			#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:12559: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:12562: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:12565: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:12568: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_gnu_library_219=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_gnu_library_219=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+		CPPFLAGS="$cf_save"
+
+fi
+echo "$as_me:12580: result: $cf_cv_gnu_library_219" >&5
+echo "${ECHO_T}$cf_cv_gnu_library_219" >&6
+
+	if test "x$cf_cv_gnu_library_219" = xyes; then
+		cf_save="$CPPFLAGS"
+		echo "$as_me:12585: checking if _XOPEN_SOURCE=$cf_gnu_xopen_source works with _DEFAULT_SOURCE" >&5
+echo $ECHO_N "checking if _XOPEN_SOURCE=$cf_gnu_xopen_source works with _DEFAULT_SOURCE... $ECHO_C" >&6
+if test "${cf_cv_gnu_dftsrc_219+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=$cf_gnu_xopen_source
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+			cat >"conftest.$ac_ext" <<_ACEOF
+#line 12690 "configure"
+#include "confdefs.h"
+
+				#include <limits.h>
+				#include <sys/types.h>
+
+int
+main (void)
+{
+
+				#if (_XOPEN_SOURCE >= $cf_gnu_xopen_source) && (MB_LEN_MAX > 1)
+					return 0;
+				#else
+				#	error GNU C library is too old
+				#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:12710: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:12713: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:12716: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:12719: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_gnu_dftsrc_219=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_gnu_dftsrc_219=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:12730: result: $cf_cv_gnu_dftsrc_219" >&5
+echo "${ECHO_T}$cf_cv_gnu_dftsrc_219" >&6
+		test "x$cf_cv_gnu_dftsrc_219" = "xyes" || CPPFLAGS="$cf_save"
+	else
+		cf_cv_gnu_dftsrc_219=maybe
+	fi
+
+	if test "x$cf_cv_gnu_dftsrc_219" != xyes; then
+
+		echo "$as_me:12739: checking if we must define _GNU_SOURCE" >&5
+echo $ECHO_N "checking if we must define _GNU_SOURCE... $ECHO_C" >&6
+if test "${cf_cv_gnu_source+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 12746 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+			#ifndef _XOPEN_SOURCE
+			#error	expected _XOPEN_SOURCE to be defined
+			#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:12761: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:12764: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:12767: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:12770: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_gnu_source=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_save="$CPPFLAGS"
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in -D_GNU_SOURCE
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+			 cat >"conftest.$ac_ext" <<_ACEOF
+#line 12877 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+				#ifdef _XOPEN_SOURCE
+				#error	expected _XOPEN_SOURCE to be undefined
+				#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:12892: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:12895: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:12898: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:12901: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_gnu_source=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_gnu_source=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+			CPPFLAGS="$cf_save"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:12916: result: $cf_cv_gnu_source" >&5
+echo "${ECHO_T}$cf_cv_gnu_source" >&6
+
+		if test "$cf_cv_gnu_source" = yes
+		then
+		echo "$as_me:12921: checking if we should also define _DEFAULT_SOURCE" >&5
+echo $ECHO_N "checking if we should also define _DEFAULT_SOURCE... $ECHO_C" >&6
+if test "${cf_cv_default_source+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-D_GNU_SOURCE"
+
+			cat >"conftest.$ac_ext" <<_ACEOF
+#line 12931 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+				#ifdef _DEFAULT_SOURCE
+				#error	expected _DEFAULT_SOURCE to be undefined
+				#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:12946: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:12949: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:12952: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:12955: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_default_source=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_default_source=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:12966: result: $cf_cv_default_source" >&5
+echo "${ECHO_T}$cf_cv_default_source" >&6
+			if test "$cf_cv_default_source" = yes
+			then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-D_DEFAULT_SOURCE"
+
+			fi
+		fi
+	fi
+
+fi
+
+	;;
+(minix*)
+	cf_xopen_source="-D_NETBSD_SOURCE" # POSIX.1-2001 features are ifdef'd with this...
+	;;
+(mirbsd*)
+	# setting _XOPEN_SOURCE or _POSIX_SOURCE breaks <sys/select.h> and other headers which use u_int / u_short types
+	cf_XOPEN_SOURCE=
+
+if test "$cf_cv_posix_visible" = no; then
+
+cf_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE
+
+cf_save_CFLAGS="$CFLAGS"
+cf_save_CPPFLAGS="$CPPFLAGS"
+
+cf_trim_CFLAGS=`echo "$cf_save_CFLAGS" | \
+	sed	-e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ 	]*\)\?$//g'`
+
+cf_trim_CPPFLAGS=`echo "$cf_save_CPPFLAGS" | \
+	sed	-e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ 	]*\)\?$//g'`
+
+echo "$as_me:13003: checking if we should define _POSIX_C_SOURCE" >&5
+echo $ECHO_N "checking if we should define _POSIX_C_SOURCE... $ECHO_C" >&6
+if test "${cf_cv_posix_c_source+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+echo "${as_me:-configure}:13009: testing if the symbol is already defined go no further ..." 1>&5
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 13012 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+#ifndef _POSIX_C_SOURCE
+make an error
+#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:13027: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:13030: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:13033: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:13036: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_posix_c_source=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_want_posix_source=no
+	 case .$cf_POSIX_C_SOURCE in
+	 (.[12]??*)
+		cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE"
+		;;
+	 (.2)
+		cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE"
+		cf_want_posix_source=yes
+		;;
+	 (.*)
+		cf_want_posix_source=yes
+		;;
+	 esac
+	 if test "$cf_want_posix_source" = yes ; then
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 13057 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+#ifdef _POSIX_SOURCE
+make an error
+#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:13072: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:13075: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:13078: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:13081: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_posix_c_source="$cf_cv_posix_c_source -D_POSIX_SOURCE"
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+	 fi
+
+echo "${as_me:-configure}:13092: testing ifdef from value $cf_POSIX_C_SOURCE ..." 1>&5
+
+	 CFLAGS="$cf_trim_CFLAGS"
+	 CPPFLAGS="$cf_trim_CPPFLAGS"
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_cv_posix_c_source"
+
+echo "${as_me:-configure}:13100: testing if the second compile does not leave our definition intact error ..." 1>&5
+
+	 cat >"conftest.$ac_ext" <<_ACEOF
+#line 13103 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+#ifndef _POSIX_C_SOURCE
+make an error
+#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:13118: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:13121: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:13124: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:13127: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_posix_c_source=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+	 CFLAGS="$cf_save_CFLAGS"
+	 CPPFLAGS="$cf_save_CPPFLAGS"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:13143: result: $cf_cv_posix_c_source" >&5
+echo "${ECHO_T}$cf_cv_posix_c_source" >&6
+
+if test "$cf_cv_posix_c_source" != no ; then
+	CFLAGS="$cf_trim_CFLAGS"
+	CPPFLAGS="$cf_trim_CPPFLAGS"
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_cv_posix_c_source
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+fi
+
+fi # cf_cv_posix_visible
+
+	;;
+(netbsd*)
+	cf_xopen_source="-D_NETBSD_SOURCE" # setting _XOPEN_SOURCE breaks IPv6 for lynx on NetBSD 1.6, breaks xterm, is not needed for ncursesw
+	;;
+(openbsd[6-9]*)
+	# OpenBSD 6.x has broken locale support, both compile-time and runtime.
+	# see https://www.mail-archive.com/bugs@openbsd.org/msg13200.html
+	# Abusing the conformance level is a workaround.
+	{ echo "$as_me:13260: WARNING: this system does not provide usable locale support" >&5
+echo "$as_me: WARNING: this system does not provide usable locale support" >&2;}
+	cf_xopen_source="-D_BSD_SOURCE"
+	cf_XOPEN_SOURCE=700
+	;;
+(openbsd[4-5]*)
+	# setting _XOPEN_SOURCE lower than 500 breaks g++ compile with wchar.h, needed for ncursesw
+	cf_xopen_source="-D_BSD_SOURCE"
+	cf_XOPEN_SOURCE=600
+	;;
+(openbsd*)
+	# setting _XOPEN_SOURCE breaks xterm on OpenBSD 2.8, is not needed for ncursesw
+	;;
+(osf[45]*)
+	cf_xopen_source="-D_OSF_SOURCE"
+	;;
+(nto-qnx*)
+	cf_xopen_source="-D_QNX_SOURCE"
+	;;
+(sco*)
+	# setting _XOPEN_SOURCE breaks Lynx on SCO Unix / OpenServer
+	;;
+(solaris2.*)
+	cf_xopen_source="-D__EXTENSIONS__"
+	cf_cv_xopen_source=broken
+	;;
+(sysv4.2uw2.*) # Novell/SCO UnixWare 2.x (tested on 2.1.2)
+	cf_XOPEN_SOURCE=
+	cf_POSIX_C_SOURCE=
+	;;
+(*)
+
+echo "$as_me:13292: checking if we should define _XOPEN_SOURCE" >&5
+echo $ECHO_N "checking if we should define _XOPEN_SOURCE... $ECHO_C" >&6
+if test "${cf_cv_xopen_source+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 13299 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+int
+main (void)
+{
+
+#ifndef _XOPEN_SOURCE
+make an error
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:13319: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:13322: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:13325: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:13328: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_xopen_source=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_save="$CPPFLAGS"
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-D_XOPEN_SOURCE=$cf_XOPEN_SOURCE"
+
+	 cat >"conftest.$ac_ext" <<_ACEOF
+#line 13340 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+int
+main (void)
+{
+
+#ifndef _XOPEN_SOURCE
+make an error
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:13360: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:13363: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:13366: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:13369: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_xopen_source=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_xopen_source=$cf_XOPEN_SOURCE
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+		CPPFLAGS="$cf_save"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:13384: result: $cf_cv_xopen_source" >&5
+echo "${ECHO_T}$cf_cv_xopen_source" >&6
+
+if test "$cf_cv_xopen_source" != no ; then
+
+CFLAGS=`echo "$CFLAGS" | \
+	sed	-e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ 	]*\)\?$//g'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ 	]*\)\?$//g'`
+
+	cf_temp_xopen_source="-D_XOPEN_SOURCE=$cf_cv_xopen_source"
+
+for cf_add_cflags in $cf_temp_xopen_source
+do
+	case "x$cf_add_cflags" in
+	(x-[DU]*)
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CFLAGS" != "$cf_old_cflag" || break
+
+	CFLAGS="$cf_old_cflag"
+done
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CPPFLAGS" != "$cf_old_cflag" || break
+
+	CPPFLAGS="$cf_old_cflag"
+done
+
+		;;
+	esac
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_add_cflags
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+done
+
+fi
+
+	cf_save_xopen_cppflags="$CPPFLAGS"
+
+if test "$cf_cv_posix_visible" = no; then
+
+cf_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE
+
+cf_save_CFLAGS="$CFLAGS"
+cf_save_CPPFLAGS="$CPPFLAGS"
+
+cf_trim_CFLAGS=`echo "$cf_save_CFLAGS" | \
+	sed	-e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ 	]*\)\?$//g'`
+
+cf_trim_CPPFLAGS=`echo "$cf_save_CPPFLAGS" | \
+	sed	-e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ 	]*\)\?$//g'`
+
+echo "$as_me:13544: checking if we should define _POSIX_C_SOURCE" >&5
+echo $ECHO_N "checking if we should define _POSIX_C_SOURCE... $ECHO_C" >&6
+if test "${cf_cv_posix_c_source+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+echo "${as_me:-configure}:13550: testing if the symbol is already defined go no further ..." 1>&5
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 13553 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+#ifndef _POSIX_C_SOURCE
+make an error
+#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:13568: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:13571: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:13574: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:13577: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_posix_c_source=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_want_posix_source=no
+	 case .$cf_POSIX_C_SOURCE in
+	 (.[12]??*)
+		cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE"
+		;;
+	 (.2)
+		cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE"
+		cf_want_posix_source=yes
+		;;
+	 (.*)
+		cf_want_posix_source=yes
+		;;
+	 esac
+	 if test "$cf_want_posix_source" = yes ; then
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 13598 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+#ifdef _POSIX_SOURCE
+make an error
+#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:13613: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:13616: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:13619: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:13622: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_posix_c_source="$cf_cv_posix_c_source -D_POSIX_SOURCE"
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+	 fi
+
+echo "${as_me:-configure}:13633: testing ifdef from value $cf_POSIX_C_SOURCE ..." 1>&5
+
+	 CFLAGS="$cf_trim_CFLAGS"
+	 CPPFLAGS="$cf_trim_CPPFLAGS"
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_cv_posix_c_source"
+
+echo "${as_me:-configure}:13641: testing if the second compile does not leave our definition intact error ..." 1>&5
+
+	 cat >"conftest.$ac_ext" <<_ACEOF
+#line 13644 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+#ifndef _POSIX_C_SOURCE
+make an error
+#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:13659: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:13662: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:13665: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:13668: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_posix_c_source=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+	 CFLAGS="$cf_save_CFLAGS"
+	 CPPFLAGS="$cf_save_CPPFLAGS"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:13684: result: $cf_cv_posix_c_source" >&5
+echo "${ECHO_T}$cf_cv_posix_c_source" >&6
+
+if test "$cf_cv_posix_c_source" != no ; then
+	CFLAGS="$cf_trim_CFLAGS"
+	CPPFLAGS="$cf_trim_CPPFLAGS"
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_cv_posix_c_source
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+fi
+
+fi # cf_cv_posix_visible
+
+	# Some of these niche implementations use copy/paste, double-check...
+	test -n "$verbose" && echo "	checking if _POSIX_C_SOURCE inteferes" 1>&6
+
+echo "${as_me:-configure}:13796: testing checking if _POSIX_C_SOURCE inteferes ..." 1>&5
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 13799 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+int
+main (void)
+{
+
+#ifndef _XOPEN_SOURCE
+make an error
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:13819: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:13822: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:13825: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:13828: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+		{ echo "$as_me:13835: WARNING: _POSIX_C_SOURCE definition is not usable" >&5
+echo "$as_me: WARNING: _POSIX_C_SOURCE definition is not usable" >&2;}
+		CPPFLAGS="$cf_save_xopen_cppflags"
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+	;;
+esac
+
+if test -n "$cf_xopen_source" ; then
+
+for cf_add_cflags in $cf_xopen_source
+do
+	case "x$cf_add_cflags" in
+	(x-[DU]*)
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CFLAGS" != "$cf_old_cflag" || break
+	test -n "$verbose" && echo "	removing old option $cf_add_cflags from CFLAGS" 1>&6
+
+echo "${as_me:-configure}:13857: testing removing old option $cf_add_cflags from CFLAGS ..." 1>&5
+
+	CFLAGS="$cf_old_cflag"
+done
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CPPFLAGS" != "$cf_old_cflag" || break
+	test -n "$verbose" && echo "	removing old option $cf_add_cflags from CPPFLAGS" 1>&6
+
+echo "${as_me:-configure}:13869: testing removing old option $cf_add_cflags from CPPFLAGS ..." 1>&5
+
+	CPPFLAGS="$cf_old_cflag"
+done
+
+		;;
+	esac
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_add_cflags
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+	test -n "$verbose" && echo "	add to \$CFLAGS $cf_new_cflags" 1>&6
+
+echo "${as_me:-configure}:13957: testing add to \$CFLAGS $cf_new_cflags ..." 1>&5
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+	test -n "$verbose" && echo "	add to \$CPPFLAGS $cf_new_cppflags" 1>&6
+
+echo "${as_me:-configure}:13967: testing add to \$CPPFLAGS $cf_new_cppflags ..." 1>&5
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+	test -n "$verbose" && echo "	add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags" 1>&6
+
+echo "${as_me:-configure}:13977: testing add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags ..." 1>&5
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+done
+
+fi
+
+if test -n "$cf_XOPEN_SOURCE" && test -z "$cf_cv_xopen_source" ; then
+	echo "$as_me:13989: checking if _XOPEN_SOURCE really is set" >&5
+echo $ECHO_N "checking if _XOPEN_SOURCE really is set... $ECHO_C" >&6
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 13992 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+int
+main (void)
+{
+
+#ifndef _XOPEN_SOURCE
+make an error
+#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:14007: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:14010: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:14013: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:14016: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_XOPEN_SOURCE_set=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_XOPEN_SOURCE_set=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+	echo "$as_me:14025: result: $cf_XOPEN_SOURCE_set" >&5
+echo "${ECHO_T}$cf_XOPEN_SOURCE_set" >&6
+	if test "$cf_XOPEN_SOURCE_set" = yes
+	then
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 14030 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+int
+main (void)
+{
+
+#if (_XOPEN_SOURCE - 0) < $cf_XOPEN_SOURCE
+make an error
+#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:14045: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:14048: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:14051: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:14054: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_XOPEN_SOURCE_set_ok=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_XOPEN_SOURCE_set_ok=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+		if test "$cf_XOPEN_SOURCE_set_ok" = no
+		then
+			{ echo "$as_me:14065: WARNING: _XOPEN_SOURCE is lower than requested" >&5
+echo "$as_me: WARNING: _XOPEN_SOURCE is lower than requested" >&2;}
+		fi
+	else
+
+echo "$as_me:14070: checking if we should define _XOPEN_SOURCE" >&5
+echo $ECHO_N "checking if we should define _XOPEN_SOURCE... $ECHO_C" >&6
+if test "${cf_cv_xopen_source+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 14077 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+int
+main (void)
+{
+
+#ifndef _XOPEN_SOURCE
+make an error
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:14097: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:14100: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:14103: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:14106: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_xopen_source=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_save="$CPPFLAGS"
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-D_XOPEN_SOURCE=$cf_XOPEN_SOURCE"
+
+	 cat >"conftest.$ac_ext" <<_ACEOF
+#line 14118 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+int
+main (void)
+{
+
+#ifndef _XOPEN_SOURCE
+make an error
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:14138: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:14141: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:14144: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:14147: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_xopen_source=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_xopen_source=$cf_XOPEN_SOURCE
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+		CPPFLAGS="$cf_save"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:14162: result: $cf_cv_xopen_source" >&5
+echo "${ECHO_T}$cf_cv_xopen_source" >&6
+
+if test "$cf_cv_xopen_source" != no ; then
+
+CFLAGS=`echo "$CFLAGS" | \
+	sed	-e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ 	]*\)\?$//g'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ 	]*\)\?$//g'`
+
+	cf_temp_xopen_source="-D_XOPEN_SOURCE=$cf_cv_xopen_source"
+
+for cf_add_cflags in $cf_temp_xopen_source
+do
+	case "x$cf_add_cflags" in
+	(x-[DU]*)
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CFLAGS" != "$cf_old_cflag" || break
+
+	CFLAGS="$cf_old_cflag"
+done
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CPPFLAGS" != "$cf_old_cflag" || break
+
+	CPPFLAGS="$cf_old_cflag"
+done
+
+		;;
+	esac
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_add_cflags
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+done
+
+fi
+
+	fi
+fi
+fi # cf_cv_posix_visible
+
+# Check whether --enable-largefile or --disable-largefile was given.
+if test "${enable_largefile+set}" = set; then
+  enableval="$enable_largefile"
+
+fi;
+if test "$enable_largefile" != no; then
+
+  echo "$as_me:14316: checking for special C compiler options needed for large files" >&5
+echo $ECHO_N "checking for special C compiler options needed for large files... $ECHO_C" >&6
+if test "${ac_cv_sys_largefile_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_sys_largefile_CC=no
+     if test "$GCC" != yes; then
+       ac_save_CC=$CC
+       while :; do
+     	 # IRIX 6.2 and later do not support large files by default,
+     	 # so use the C compiler's -n32 option if that helps.
+         cat >"conftest.$ac_ext" <<_ACEOF
+#line 14328 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+     	 rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:14348: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:14351: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:14354: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:14357: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext"
+     	 CC="$CC -n32"
+     	 rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:14367: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:14370: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:14373: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:14376: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_sys_largefile_CC=' -n32'; break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext"
+         break
+       done
+       CC=$ac_save_CC
+       rm -f "conftest.$ac_ext"
+    fi
+fi
+echo "$as_me:14390: result: $ac_cv_sys_largefile_CC" >&5
+echo "${ECHO_T}$ac_cv_sys_largefile_CC" >&6
+  if test "$ac_cv_sys_largefile_CC" != no; then
+    CC=$CC$ac_cv_sys_largefile_CC
+  fi
+
+  echo "$as_me:14396: checking for _FILE_OFFSET_BITS value needed for large files" >&5
+echo $ECHO_N "checking for _FILE_OFFSET_BITS value needed for large files... $ECHO_C" >&6
+if test "${ac_cv_sys_file_offset_bits+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  while :; do
+  ac_cv_sys_file_offset_bits=no
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 14404 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:14424: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:14427: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:14430: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:14433: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 14442 "configure"
+#include "confdefs.h"
+#define _FILE_OFFSET_BITS 64
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:14463: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:14466: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:14469: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:14472: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_sys_file_offset_bits=64; break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+  break
+done
+fi
+echo "$as_me:14483: result: $ac_cv_sys_file_offset_bits" >&5
+echo "${ECHO_T}$ac_cv_sys_file_offset_bits" >&6
+if test "$ac_cv_sys_file_offset_bits" != no; then
+
+cat >>confdefs.h <<EOF
+#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits
+EOF
+
+fi
+rm -rf conftest*
+  echo "$as_me:14493: checking for _LARGE_FILES value needed for large files" >&5
+echo $ECHO_N "checking for _LARGE_FILES value needed for large files... $ECHO_C" >&6
+if test "${ac_cv_sys_large_files+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  while :; do
+  ac_cv_sys_large_files=no
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 14501 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:14521: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:14524: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:14527: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:14530: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 14539 "configure"
+#include "confdefs.h"
+#define _LARGE_FILES 1
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:14560: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:14563: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:14566: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:14569: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_sys_large_files=1; break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+  break
+done
+fi
+echo "$as_me:14580: result: $ac_cv_sys_large_files" >&5
+echo "${ECHO_T}$ac_cv_sys_large_files" >&6
+if test "$ac_cv_sys_large_files" != no; then
+
+cat >>confdefs.h <<EOF
+#define _LARGE_FILES $ac_cv_sys_large_files
+EOF
+
+fi
+rm -rf conftest*
+fi
+
+	if test "$enable_largefile" != no ; then
+	echo "$as_me:14593: checking for _LARGEFILE_SOURCE value needed for large files" >&5
+echo $ECHO_N "checking for _LARGEFILE_SOURCE value needed for large files... $ECHO_C" >&6
+if test "${ac_cv_sys_largefile_source+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  while :; do
+  ac_cv_sys_largefile_source=no
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 14601 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+return !fseeko;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:14613: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:14616: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:14619: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:14622: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 14631 "configure"
+#include "confdefs.h"
+#define _LARGEFILE_SOURCE 1
+#include <stdio.h>
+int
+main (void)
+{
+return !fseeko;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:14644: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:14647: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:14650: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:14653: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_sys_largefile_source=1; break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+  break
+done
+fi
+echo "$as_me:14664: result: $ac_cv_sys_largefile_source" >&5
+echo "${ECHO_T}$ac_cv_sys_largefile_source" >&6
+if test "$ac_cv_sys_largefile_source" != no; then
+
+cat >>confdefs.h <<EOF
+#define _LARGEFILE_SOURCE $ac_cv_sys_largefile_source
+EOF
+
+fi
+rm -rf conftest*
+
+# We used to try defining _XOPEN_SOURCE=500 too, to work around a bug
+# in glibc 2.1.3, but that breaks too many other things.
+# If you want fseeko and ftello with glibc, upgrade to a fixed glibc.
+echo "$as_me:14678: checking for fseeko" >&5
+echo $ECHO_N "checking for fseeko... $ECHO_C" >&6
+if test "${ac_cv_func_fseeko+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 14684 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+return fseeko && fseeko (stdin, 0, 0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:14696: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:14699: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:14702: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:14705: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_func_fseeko=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_fseeko=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:14715: result: $ac_cv_func_fseeko" >&5
+echo "${ECHO_T}$ac_cv_func_fseeko" >&6
+if test $ac_cv_func_fseeko = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_FSEEKO 1
+EOF
+
+fi
+
+	# Normally we would collect these definitions in the config.h,
+	# but (like _XOPEN_SOURCE), some environments rely on having these
+	# defined before any of the system headers are included.  Another
+	# case comes up with C++, e.g., on AIX the compiler compiles the
+	# header files by themselves before looking at the body files it is
+	# told to compile.  For ncurses, those header files do not include
+	# the config.h
+	if test "$ac_cv_sys_large_files" != no
+	then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-D_LARGE_FILES"
+
+	fi
+	if test "$ac_cv_sys_largefile_source" != no
+	then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-D_LARGEFILE_SOURCE"
+
+	fi
+	if test "$ac_cv_sys_file_offset_bits" != no
+	then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-D_FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits"
+
+	fi
+
+	echo "$as_me:14754: checking whether to use struct dirent64" >&5
+echo $ECHO_N "checking whether to use struct dirent64... $ECHO_C" >&6
+if test "${cf_cv_struct_dirent64+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 14761 "configure"
+#include "confdefs.h"
+
+#pragma GCC diagnostic error "-Wincompatible-pointer-types"
+#include <sys/types.h>
+#include <dirent.h>
+
+int
+main (void)
+{
+
+		/* if transitional largefile support is setup, this is true */
+		extern struct dirent64 * readdir(DIR *);
+		struct dirent64 *x = readdir((DIR *)0);
+		struct dirent *y = readdir((DIR *)0);
+		int z = x - y;
+		(void)z;
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:14784: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:14787: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:14790: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:14793: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_struct_dirent64=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_struct_dirent64=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:14804: result: $cf_cv_struct_dirent64" >&5
+echo "${ECHO_T}$cf_cv_struct_dirent64" >&6
+	test "$cf_cv_struct_dirent64" = yes &&
+cat >>confdefs.h <<\EOF
+#define HAVE_STRUCT_DIRENT64 1
+EOF
+
+	fi
+
+### Enable compiling-in rcs id's
+echo "$as_me:14814: checking if RCS identifiers should be compiled-in" >&5
+echo $ECHO_N "checking if RCS identifiers should be compiled-in... $ECHO_C" >&6
+
+# Check whether --with-rcs-ids or --without-rcs-ids was given.
+if test "${with_rcs_ids+set}" = set; then
+  withval="$with_rcs_ids"
+  with_rcs_ids=$withval
+else
+  with_rcs_ids=no
+fi;
+echo "$as_me:14824: result: $with_rcs_ids" >&5
+echo "${ECHO_T}$with_rcs_ids" >&6
+test "$with_rcs_ids" = yes &&
+cat >>confdefs.h <<\EOF
+#define USE_RCS_IDS 1
+EOF
+
+###############################################################################
+
+### Note that some functions (such as const) are normally disabled anyway.
+echo "$as_me:14834: checking if you want to build with function extensions" >&5
+echo $ECHO_N "checking if you want to build with function extensions... $ECHO_C" >&6
+
+# Check whether --enable-ext-funcs or --disable-ext-funcs was given.
+if test "${enable_ext_funcs+set}" = set; then
+  enableval="$enable_ext_funcs"
+  with_ext_funcs=$enableval
+else
+  with_ext_funcs=yes
+fi;
+echo "$as_me:14844: result: $with_ext_funcs" >&5
+echo "${ECHO_T}$with_ext_funcs" >&6
+if test "$with_ext_funcs" = yes ; then
+	NCURSES_EXT_FUNCS=1
+
+cat >>confdefs.h <<\EOF
+#define HAVE_USE_DEFAULT_COLORS 1
+EOF
+
+cat >>confdefs.h <<\EOF
+#define NCURSES_EXT_FUNCS 1
+EOF
+
+else
+	NCURSES_EXT_FUNCS=0
+fi
+
+###   use option --enable-const to turn on use of const beyond that in XSI.
+echo "$as_me:14862: checking for extended use of const keyword" >&5
+echo $ECHO_N "checking for extended use of const keyword... $ECHO_C" >&6
+
+# Check whether --enable-const or --disable-const was given.
+if test "${enable_const+set}" = set; then
+  enableval="$enable_const"
+  with_ext_const=$enableval
+else
+  with_ext_const=no
+fi;
+echo "$as_me:14872: result: $with_ext_const" >&5
+echo "${ECHO_T}$with_ext_const" >&6
+NCURSES_CONST='/*nothing*/'
+if test "$with_ext_const" = yes ; then
+	NCURSES_CONST=const
+fi
+
+###############################################################################
+# These options are relatively safe to experiment with.
+
+echo "$as_me:14882: checking if you want all development code" >&5
+echo $ECHO_N "checking if you want all development code... $ECHO_C" >&6
+
+# Check whether --with-develop or --without-develop was given.
+if test "${with_develop+set}" = set; then
+  withval="$with_develop"
+  with_develop=$withval
+else
+  with_develop=no
+fi;
+echo "$as_me:14892: result: $with_develop" >&5
+echo "${ECHO_T}$with_develop" >&6
+
+###############################################################################
+# These are just experimental, probably should not be in a package:
+
+# This is still experimental (20080329), but should ultimately be moved to
+# the script-block --with-normal, etc.
+
+echo "$as_me:14901: checking if you want to link with the pthread library" >&5
+echo $ECHO_N "checking if you want to link with the pthread library... $ECHO_C" >&6
+
+# Check whether --with-pthread or --without-pthread was given.
+if test "${with_pthread+set}" = set; then
+  withval="$with_pthread"
+  with_pthread=$withval
+else
+  with_pthread=no
+fi;
+echo "$as_me:14911: result: $with_pthread" >&5
+echo "${ECHO_T}$with_pthread" >&6
+
+if test "$with_pthread" != no ; then
+	echo "$as_me:14915: checking for pthread.h" >&5
+echo $ECHO_N "checking for pthread.h... $ECHO_C" >&6
+if test "${ac_cv_header_pthread_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 14921 "configure"
+#include "confdefs.h"
+#include <pthread.h>
+_ACEOF
+if { (eval echo "$as_me:14925: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:14931: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_cv_header_pthread_h=yes
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  ac_cv_header_pthread_h=no
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:14950: result: $ac_cv_header_pthread_h" >&5
+echo "${ECHO_T}$ac_cv_header_pthread_h" >&6
+if test "$ac_cv_header_pthread_h" = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_PTHREADS_H 1
+EOF
+
+	for cf_lib_pthread in pthread c_r
+	do
+	    echo "$as_me:14960: checking if we can link with the $cf_lib_pthread library" >&5
+echo $ECHO_N "checking if we can link with the $cf_lib_pthread library... $ECHO_C" >&6
+	    cf_save_LIBS="$LIBS"
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -l$cf_lib_pthread; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+	    cat >"conftest.$ac_ext" <<_ACEOF
+#line 14981 "configure"
+#include "confdefs.h"
+
+#include <pthread.h>
+
+int
+main (void)
+{
+
+		int rc = pthread_create(0,0,0,0);
+		int r2 = pthread_mutexattr_settype(0, 0);
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:14998: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:15001: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:15004: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:15007: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  with_pthread=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+with_pthread=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+	    LIBS="$cf_save_LIBS"
+	    echo "$as_me:15017: result: $with_pthread" >&5
+echo "${ECHO_T}$with_pthread" >&6
+	    test "$with_pthread" = yes && break
+	done
+
+	if test "$with_pthread" = yes ; then
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -l$cf_lib_pthread; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+cat >>confdefs.h <<\EOF
+#define HAVE_LIBPTHREADS 1
+EOF
+
+	else
+	    { { echo "$as_me:15045: error: Cannot link with pthread library" >&5
+echo "$as_me: error: Cannot link with pthread library" >&2;}
+   { (exit 1); exit 1; }; }
+	fi
+
+fi
+
+fi
+
+echo "$as_me:15054: checking if you want to use weak-symbols for pthreads" >&5
+echo $ECHO_N "checking if you want to use weak-symbols for pthreads... $ECHO_C" >&6
+
+# Check whether --enable-weak-symbols or --disable-weak-symbols was given.
+if test "${enable_weak_symbols+set}" = set; then
+  enableval="$enable_weak_symbols"
+  use_weak_symbols=$withval
+else
+  use_weak_symbols=no
+fi;
+echo "$as_me:15064: result: $use_weak_symbols" >&5
+echo "${ECHO_T}$use_weak_symbols" >&6
+if test "$use_weak_symbols" = yes ; then
+
+echo "$as_me:15068: checking if $CC supports weak symbols" >&5
+echo $ECHO_N "checking if $CC supports weak symbols... $ECHO_C" >&6
+if test "${cf_cv_weak_symbols+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 15075 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+int
+main (void)
+{
+
+#if defined(__GNUC__)
+#  if defined __USE_ISOC99
+#    define _cat_pragma(exp)	_Pragma(#exp)
+#    define _weak_pragma(exp)	_cat_pragma(weak name)
+#  else
+#    define _weak_pragma(exp)
+#  endif
+#  define _declare(name)	__extension__ extern __typeof__(name) name
+#  define weak_symbol(name)	_weak_pragma(name) _declare(name) __attribute__((weak))
+#endif
+
+weak_symbol(fopen);
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:15101: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:15104: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:15107: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:15110: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_weak_symbols=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_weak_symbols=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:15121: result: $cf_cv_weak_symbols" >&5
+echo "${ECHO_T}$cf_cv_weak_symbols" >&6
+
+else
+	cf_cv_weak_symbols=no
+fi
+
+if test $cf_cv_weak_symbols = yes ; then
+
+cat >>confdefs.h <<\EOF
+#define USE_WEAK_SYMBOLS 1
+EOF
+
+fi
+
+PTHREAD=
+if test "$with_pthread" = "yes" ; then
+
+cat >>confdefs.h <<\EOF
+#define USE_PTHREADS 1
+EOF
+
+	enable_reentrant=yes
+	if test $cf_cv_weak_symbols = yes ; then
+		PTHREAD=-lpthread
+	fi
+fi
+
+# OpenSUSE is installing ncurses6, using reentrant option.
+echo "$as_me:15150: checking for _nc_TABSIZE" >&5
+echo $ECHO_N "checking for _nc_TABSIZE... $ECHO_C" >&6
+if test "${ac_cv_func__nc_TABSIZE+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 15156 "configure"
+#include "confdefs.h"
+#define _nc_TABSIZE autoconf_temporary
+#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
+#undef _nc_TABSIZE
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char _nc_TABSIZE (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub__nc_TABSIZE) || defined (__stub____nc_TABSIZE)
+#error found stub for _nc_TABSIZE
+#endif
+
+	return _nc_TABSIZE ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:15187: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:15190: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:15193: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:15196: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_func__nc_TABSIZE=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func__nc_TABSIZE=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:15206: result: $ac_cv_func__nc_TABSIZE" >&5
+echo "${ECHO_T}$ac_cv_func__nc_TABSIZE" >&6
+if test "$ac_cv_func__nc_TABSIZE" = yes; then
+  assume_reentrant=yes
+else
+  assume_reentrant=no
+fi
+
+# Reentrant code has to be opaque; there's little advantage to making ncurses
+# opaque outside of that, so there is no --enable-opaque option.  We can use
+# this option without --with-pthreads, but this will be always set for
+# pthreads.
+echo "$as_me:15218: checking if you want experimental reentrant code" >&5
+echo $ECHO_N "checking if you want experimental reentrant code... $ECHO_C" >&6
+
+# Check whether --enable-reentrant or --disable-reentrant was given.
+if test "${enable_reentrant+set}" = set; then
+  enableval="$enable_reentrant"
+  with_reentrant=$enableval
+else
+  with_reentrant=$assume_reentrant
+fi;
+echo "$as_me:15228: result: $with_reentrant" >&5
+echo "${ECHO_T}$with_reentrant" >&6
+if test "$with_reentrant" = yes ; then
+	cf_cv_enable_reentrant=1
+	if test $cf_cv_weak_symbols = yes ; then
+
+# remove pthread library from $LIBS
+LIBS=`echo "$LIBS" | sed -e 's/-lpthread[ 	]//g' -e 's/-lpthread$//'`
+
+	elif test "$assume_reentrant" = no ; then
+		LIB_SUFFIX="t${LIB_SUFFIX}"
+	fi
+
+cat >>confdefs.h <<\EOF
+#define USE_REENTRANT 1
+EOF
+
+else
+	cf_cv_enable_reentrant=0
+fi
+
+### Allow using a different wrap-prefix
+if test "$cf_cv_enable_reentrant" != 0 || test "$BROKEN_LINKER" = 1 ; then
+	echo "$as_me:15251: checking for prefix used to wrap public variables" >&5
+echo $ECHO_N "checking for prefix used to wrap public variables... $ECHO_C" >&6
+
+# Check whether --with-wrap-prefix or --without-wrap-prefix was given.
+if test "${with_wrap_prefix+set}" = set; then
+  withval="$with_wrap_prefix"
+  NCURSES_WRAP_PREFIX=$withval
+else
+  NCURSES_WRAP_PREFIX=_nc_
+fi;
+	echo "$as_me:15261: result: $NCURSES_WRAP_PREFIX" >&5
+echo "${ECHO_T}$NCURSES_WRAP_PREFIX" >&6
+else
+	NCURSES_WRAP_PREFIX=_nc_
+fi
+
+cat >>confdefs.h <<EOF
+#define NCURSES_WRAP_PREFIX "$NCURSES_WRAP_PREFIX"
+EOF
+
+###############################################################################
+
+###	use option --disable-echo to suppress full display compiling commands
+
+echo "$as_me:15275: checking if you want to see long compiling messages" >&5
+echo $ECHO_N "checking if you want to see long compiling messages... $ECHO_C" >&6
+
+# Check whether --enable-echo or --disable-echo was given.
+if test "${enable_echo+set}" = set; then
+  enableval="$enable_echo"
+  test "$enableval" != no && enableval=yes
+	if test "$enableval" != "yes" ; then
+
+	ECHO_LT='--silent'
+	ECHO_LD='@echo linking $@;'
+	RULE_CC='@echo compiling $<'
+	SHOW_CC='@echo compiling $@'
+	ECHO_CC='@'
+
+	else
+
+	ECHO_LT=''
+	ECHO_LD=''
+	RULE_CC=''
+	SHOW_CC=''
+	ECHO_CC=''
+
+	fi
+else
+  enableval=yes
+
+	ECHO_LT=''
+	ECHO_LD=''
+	RULE_CC=''
+	SHOW_CC=''
+	ECHO_CC=''
+
+fi;
+echo "$as_me:15309: result: $enableval" >&5
+echo "${ECHO_T}$enableval" >&6
+
+echo "$as_me:15312: checking if you want to use C11 _Noreturn feature" >&5
+echo $ECHO_N "checking if you want to use C11 _Noreturn feature... $ECHO_C" >&6
+
+# Check whether --enable-stdnoreturn or --disable-stdnoreturn was given.
+if test "${enable_stdnoreturn+set}" = set; then
+  enableval="$enable_stdnoreturn"
+  test "$enableval" != yes && enableval=no
+	if test "$enableval" != "no" ; then
+    enable_stdnoreturn=yes
+	else
+		enable_stdnoreturn=no
+	fi
+else
+  enableval=no
+	enable_stdnoreturn=no
+
+fi;
+echo "$as_me:15329: result: $enable_stdnoreturn" >&5
+echo "${ECHO_T}$enable_stdnoreturn" >&6
+
+if test $enable_stdnoreturn = yes; then
+echo "$as_me:15333: checking for C11 _Noreturn feature" >&5
+echo $ECHO_N "checking for C11 _Noreturn feature... $ECHO_C" >&6
+if test "${cf_cv_c11_noreturn+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 15339 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdnoreturn.h>
+static _Noreturn void giveup(void) { exit(0); }
+
+int
+main (void)
+{
+if (feof(stdin)) giveup()
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:15356: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:15359: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:15362: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:15365: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_c11_noreturn=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_c11_noreturn=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:15376: result: $cf_cv_c11_noreturn" >&5
+echo "${ECHO_T}$cf_cv_c11_noreturn" >&6
+else
+	cf_cv_c11_noreturn=no,
+fi
+
+if test "$cf_cv_c11_noreturn" = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_STDNORETURN_H 1
+EOF
+
+cat >>confdefs.h <<EOF
+#define STDC_NORETURN _Noreturn
+EOF
+
+	HAVE_STDNORETURN_H=1
+else
+	HAVE_STDNORETURN_H=0
+fi
+
+if test "$GCC" = yes || test "$GXX" = yes
+then
+
+if test "$GCC" = yes || test "$GXX" = yes
+then
+	case $CFLAGS in
+	(*-Werror=*)
+		cf_temp_flags=
+		for cf_temp_scan in $CFLAGS
+		do
+			case "x$cf_temp_scan" in
+			(x-Werror=format*)
+
+	test -n "$cf_temp_flags" && cf_temp_flags="$cf_temp_flags "
+	cf_temp_flags="${cf_temp_flags}$cf_temp_scan"
+
+				;;
+			(x-Werror=*)
+
+	test -n "$EXTRA_CFLAGS" && EXTRA_CFLAGS="$EXTRA_CFLAGS "
+	EXTRA_CFLAGS="${EXTRA_CFLAGS}$cf_temp_scan"
+
+				;;
+			(*)
+
+	test -n "$cf_temp_flags" && cf_temp_flags="$cf_temp_flags "
+	cf_temp_flags="${cf_temp_flags}$cf_temp_scan"
+
+				;;
+			esac
+		done
+		if test "x$CFLAGS" != "x$cf_temp_flags"
+		then
+			test -n "$verbose" && echo "	repairing CFLAGS: $CFLAGS" 1>&6
+
+echo "${as_me:-configure}:15432: testing repairing CFLAGS: $CFLAGS ..." 1>&5
+
+			CFLAGS="$cf_temp_flags"
+			test -n "$verbose" && echo "	... fixed $CFLAGS" 1>&6
+
+echo "${as_me:-configure}:15437: testing ... fixed $CFLAGS ..." 1>&5
+
+			test -n "$verbose" && echo "	... extra $EXTRA_CFLAGS" 1>&6
+
+echo "${as_me:-configure}:15441: testing ... extra $EXTRA_CFLAGS ..." 1>&5
+
+		fi
+		;;
+	esac
+fi
+
+if test "$GCC" = yes || test "$GXX" = yes
+then
+	case $CPPFLAGS in
+	(*-Werror=*)
+		cf_temp_flags=
+		for cf_temp_scan in $CPPFLAGS
+		do
+			case "x$cf_temp_scan" in
+			(x-Werror=format*)
+
+	test -n "$cf_temp_flags" && cf_temp_flags="$cf_temp_flags "
+	cf_temp_flags="${cf_temp_flags}$cf_temp_scan"
+
+				;;
+			(x-Werror=*)
+
+	test -n "$EXTRA_CFLAGS" && EXTRA_CFLAGS="$EXTRA_CFLAGS "
+	EXTRA_CFLAGS="${EXTRA_CFLAGS}$cf_temp_scan"
+
+				;;
+			(*)
+
+	test -n "$cf_temp_flags" && cf_temp_flags="$cf_temp_flags "
+	cf_temp_flags="${cf_temp_flags}$cf_temp_scan"
+
+				;;
+			esac
+		done
+		if test "x$CPPFLAGS" != "x$cf_temp_flags"
+		then
+			test -n "$verbose" && echo "	repairing CPPFLAGS: $CPPFLAGS" 1>&6
+
+echo "${as_me:-configure}:15480: testing repairing CPPFLAGS: $CPPFLAGS ..." 1>&5
+
+			CPPFLAGS="$cf_temp_flags"
+			test -n "$verbose" && echo "	... fixed $CPPFLAGS" 1>&6
+
+echo "${as_me:-configure}:15485: testing ... fixed $CPPFLAGS ..." 1>&5
+
+			test -n "$verbose" && echo "	... extra $EXTRA_CFLAGS" 1>&6
+
+echo "${as_me:-configure}:15489: testing ... extra $EXTRA_CFLAGS ..." 1>&5
+
+		fi
+		;;
+	esac
+fi
+
+if test "$GCC" = yes || test "$GXX" = yes
+then
+	case $LDFLAGS in
+	(*-Werror=*)
+		cf_temp_flags=
+		for cf_temp_scan in $LDFLAGS
+		do
+			case "x$cf_temp_scan" in
+			(x-Werror=format*)
+
+	test -n "$cf_temp_flags" && cf_temp_flags="$cf_temp_flags "
+	cf_temp_flags="${cf_temp_flags}$cf_temp_scan"
+
+				;;
+			(x-Werror=*)
+
+	test -n "$EXTRA_CFLAGS" && EXTRA_CFLAGS="$EXTRA_CFLAGS "
+	EXTRA_CFLAGS="${EXTRA_CFLAGS}$cf_temp_scan"
+
+				;;
+			(*)
+
+	test -n "$cf_temp_flags" && cf_temp_flags="$cf_temp_flags "
+	cf_temp_flags="${cf_temp_flags}$cf_temp_scan"
+
+				;;
+			esac
+		done
+		if test "x$LDFLAGS" != "x$cf_temp_flags"
+		then
+			test -n "$verbose" && echo "	repairing LDFLAGS: $LDFLAGS" 1>&6
+
+echo "${as_me:-configure}:15528: testing repairing LDFLAGS: $LDFLAGS ..." 1>&5
+
+			LDFLAGS="$cf_temp_flags"
+			test -n "$verbose" && echo "	... fixed $LDFLAGS" 1>&6
+
+echo "${as_me:-configure}:15533: testing ... fixed $LDFLAGS ..." 1>&5
+
+			test -n "$verbose" && echo "	... extra $EXTRA_CFLAGS" 1>&6
+
+echo "${as_me:-configure}:15537: testing ... extra $EXTRA_CFLAGS ..." 1>&5
+
+		fi
+		;;
+	esac
+fi
+
+echo "$as_me:15544: checking if you want to turn on gcc warnings" >&5
+echo $ECHO_N "checking if you want to turn on gcc warnings... $ECHO_C" >&6
+
+# Check whether --enable-warnings or --disable-warnings was given.
+if test "${enable_warnings+set}" = set; then
+  enableval="$enable_warnings"
+  test "$enableval" != yes && enableval=no
+	if test "$enableval" != "no" ; then
+    enable_warnings=yes
+	else
+		enable_warnings=no
+	fi
+else
+  enableval=no
+	enable_warnings=no
+
+fi;
+echo "$as_me:15561: result: $enable_warnings" >&5
+echo "${ECHO_T}$enable_warnings" >&6
+if test "$enable_warnings" = "yes"
+then
+
+if test "x$have_x" = xyes; then
+
+cf_save_LIBS_CF_CONST_X_STRING="$LIBS"
+cf_save_CFLAGS_CF_CONST_X_STRING="$CFLAGS"
+cf_save_CPPFLAGS_CF_CONST_X_STRING="$CPPFLAGS"
+LIBS="$LIBS ${X_PRE_LIBS} ${X_LIBS} ${X_EXTRA_LIBS}"
+for cf_X_CFLAGS in $X_CFLAGS
+do
+	case "x$cf_X_CFLAGS" in
+	x-[IUD]*)
+		CPPFLAGS="$CPPFLAGS $cf_X_CFLAGS"
+		;;
+	*)
+		CFLAGS="$CFLAGS $cf_X_CFLAGS"
+		;;
+	esac
+done
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 15585 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <X11/Intrinsic.h>
+
+int
+main (void)
+{
+String foo = malloc(1); free((void*)foo)
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:15600: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:15603: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:15606: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:15609: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+echo "$as_me:15612: checking for X11/Xt const-feature" >&5
+echo $ECHO_N "checking for X11/Xt const-feature... $ECHO_C" >&6
+if test "${cf_cv_const_x_string+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 15619 "configure"
+#include "confdefs.h"
+
+#define _CONST_X_STRING	/* X11R7.8 (perhaps) */
+#undef  XTSTRINGDEFINES	/* X11R5 and later */
+#include <stdlib.h>
+#include <X11/Intrinsic.h>
+
+int
+main (void)
+{
+String foo = malloc(1); *foo = 0
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:15636: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:15639: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:15642: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:15645: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+			cf_cv_const_x_string=no
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+			cf_cv_const_x_string=yes
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:15660: result: $cf_cv_const_x_string" >&5
+echo "${ECHO_T}$cf_cv_const_x_string" >&6
+
+LIBS="$cf_save_LIBS_CF_CONST_X_STRING"
+CFLAGS="$cf_save_CFLAGS_CF_CONST_X_STRING"
+CPPFLAGS="$cf_save_CPPFLAGS_CF_CONST_X_STRING"
+
+case "$cf_cv_const_x_string" in
+(no)
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-DXTSTRINGDEFINES"
+
+	;;
+(*)
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-D_CONST_X_STRING"
+
+	;;
+esac
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ fi
+cat > "conftest.$ac_ext" <<EOF
+#line 15689 "${as_me:-configure}"
+int main(int argc, char *argv[]) { return (argv[argc-1] == 0) ; }
+EOF
+if test "$INTEL_COMPILER" = yes
+then
+# The "-wdXXX" options suppress warnings:
+# remark #1419: external declaration in primary source file
+# remark #1683: explicit conversion of a 64-bit integral type to a smaller integral type (potential portability problem)
+# remark #1684: conversion from pointer to same-sized integral type (potential portability problem)
+# remark #193: zero used for undefined preprocessing identifier
+# remark #593: variable "curs_sb_left_arrow" was set but never used
+# remark #810: conversion from "int" to "Dimension={unsigned short}" may lose significant bits
+# remark #869: parameter "tw" was never referenced
+# remark #981: operands are evaluated in unspecified order
+# warning #279: controlling expression is constant
+
+	{ echo "$as_me:15705: checking for $CC warning options..." >&5
+echo "$as_me: checking for $CC warning options..." >&6;}
+	cf_save_CFLAGS="$CFLAGS"
+	EXTRA_CFLAGS="$EXTRA_CFLAGS -Wall"
+	for cf_opt in \
+		wd1419 \
+		wd1683 \
+		wd1684 \
+		wd193 \
+		wd593 \
+		wd279 \
+		wd810 \
+		wd869 \
+		wd981
+	do
+		CFLAGS="$cf_save_CFLAGS $EXTRA_CFLAGS -$cf_opt"
+		if { (eval echo "$as_me:15721: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:15724: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; then
+			test -n "$verbose" && echo "$as_me:15726: result: ... -$cf_opt" >&5
+echo "${ECHO_T}... -$cf_opt" >&6
+			EXTRA_CFLAGS="$EXTRA_CFLAGS -$cf_opt"
+		fi
+	done
+	CFLAGS="$cf_save_CFLAGS"
+elif test "$GCC" = yes && test "$GCC_VERSION" != "unknown"
+then
+	{ echo "$as_me:15734: checking for $CC warning options..." >&5
+echo "$as_me: checking for $CC warning options..." >&6;}
+	cf_save_CFLAGS="$CFLAGS"
+	cf_warn_CONST=""
+	test "$with_ext_const" = yes && cf_warn_CONST="Wwrite-strings"
+	cf_gcc_warnings="Wignored-qualifiers Wlogical-op Wvarargs"
+	test "x$CLANG_COMPILER" = xyes && cf_gcc_warnings=
+	for cf_opt in W Wall \
+		Wbad-function-cast \
+		Wcast-align \
+		Wcast-qual \
+		Wdeclaration-after-statement \
+		Wextra \
+		Winline \
+		Wmissing-declarations \
+		Wmissing-prototypes \
+		Wnested-externs \
+		Wpointer-arith \
+		Wshadow \
+		Wstrict-prototypes \
+		Wundef Wno-inline $cf_gcc_warnings $cf_warn_CONST Wno-unknown-pragmas Wswitch-enum
+	do
+		CFLAGS="$cf_save_CFLAGS $EXTRA_CFLAGS -$cf_opt"
+		if { (eval echo "$as_me:15757: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:15760: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; then
+			test -n "$verbose" && echo "$as_me:15762: result: ... -$cf_opt" >&5
+echo "${ECHO_T}... -$cf_opt" >&6
+			case "$cf_opt" in
+			(Winline)
+				case "$GCC_VERSION" in
+				([34].*)
+					test -n "$verbose" && echo "	feature is broken in gcc $GCC_VERSION" 1>&6
+
+echo "${as_me:-configure}:15770: testing feature is broken in gcc $GCC_VERSION ..." 1>&5
+
+					continue;;
+				esac
+				;;
+			(Wpointer-arith)
+				case "$GCC_VERSION" in
+				([12].*)
+					test -n "$verbose" && echo "	feature is broken in gcc $GCC_VERSION" 1>&6
+
+echo "${as_me:-configure}:15780: testing feature is broken in gcc $GCC_VERSION ..." 1>&5
+
+					continue;;
+				esac
+				;;
+			esac
+			EXTRA_CFLAGS="$EXTRA_CFLAGS -$cf_opt"
+		fi
+	done
+	CFLAGS="$cf_save_CFLAGS"
+fi
+rm -rf ./conftest*
+
+fi
+
+if test "$GCC" = yes || test "$GXX" = yes
+then
+cat > conftest.i <<EOF
+#ifndef GCC_PRINTF
+#define GCC_PRINTF 0
+#endif
+#ifndef GCC_SCANF
+#define GCC_SCANF 0
+#endif
+#ifndef GCC_NORETURN
+#define GCC_NORETURN /* nothing */
+#endif
+#ifndef GCC_UNUSED
+#define GCC_UNUSED /* nothing */
+#endif
+EOF
+if test "$GCC" = yes
+then
+	{ echo "$as_me:15813: checking for $CC __attribute__ directives..." >&5
+echo "$as_me: checking for $CC __attribute__ directives..." >&6;}
+cat > "conftest.$ac_ext" <<EOF
+#line 15816 "${as_me:-configure}"
+#include "confdefs.h"
+#include "conftest.h"
+#include "conftest.i"
+#if	GCC_PRINTF
+#define GCC_PRINTFLIKE(fmt,var) __attribute__((format(printf,fmt,var)))
+#else
+#define GCC_PRINTFLIKE(fmt,var) /*nothing*/
+#endif
+#if	GCC_SCANF
+#define GCC_SCANFLIKE(fmt,var)  __attribute__((format(scanf,fmt,var)))
+#else
+#define GCC_SCANFLIKE(fmt,var)  /*nothing*/
+#endif
+extern void wow(char *,...) GCC_SCANFLIKE(1,2);
+extern GCC_NORETURN void oops(char *,...) GCC_PRINTFLIKE(1,2);
+extern GCC_NORETURN void foo(void);
+int main(int argc GCC_UNUSED, char *argv[] GCC_UNUSED) { (void)argc; (void)argv; return 0; }
+EOF
+	cf_printf_attribute=no
+	cf_scanf_attribute=no
+	for cf_attribute in scanf printf unused noreturn
+	do
+
+cf_ATTRIBUTE=`echo "$cf_attribute" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+		cf_directive="__attribute__(($cf_attribute))"
+		echo "checking for $CC $cf_directive" 1>&5
+
+		case "$cf_attribute" in
+		(printf)
+			cf_printf_attribute=yes
+			cat >conftest.h <<EOF
+#define GCC_$cf_ATTRIBUTE 1
+EOF
+			;;
+		(scanf)
+			cf_scanf_attribute=yes
+			cat >conftest.h <<EOF
+#define GCC_$cf_ATTRIBUTE 1
+EOF
+			;;
+		(*)
+			cat >conftest.h <<EOF
+#define GCC_$cf_ATTRIBUTE $cf_directive
+EOF
+			;;
+		esac
+
+		if { (eval echo "$as_me:15865: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:15868: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; then
+			test -n "$verbose" && echo "$as_me:15870: result: ... $cf_attribute" >&5
+echo "${ECHO_T}... $cf_attribute" >&6
+			cat conftest.h >>confdefs.h
+			case "$cf_attribute" in
+			(noreturn)
+
+cat >>confdefs.h <<EOF
+#define GCC_NORETURN $cf_directive
+EOF
+
+				;;
+			(printf)
+				cf_value='/* nothing */'
+				if test "$cf_printf_attribute" != no ; then
+					cf_value='__attribute__((format(printf,fmt,var)))'
+
+cat >>confdefs.h <<\EOF
+#define GCC_PRINTF 1
+EOF
+
+				fi
+
+cat >>confdefs.h <<EOF
+#define GCC_PRINTFLIKE(fmt,var) $cf_value
+EOF
+
+				;;
+			(scanf)
+				cf_value='/* nothing */'
+				if test "$cf_scanf_attribute" != no ; then
+					cf_value='__attribute__((format(scanf,fmt,var)))'
+
+cat >>confdefs.h <<\EOF
+#define GCC_SCANF 1
+EOF
+
+				fi
+
+cat >>confdefs.h <<EOF
+#define GCC_SCANFLIKE(fmt,var) $cf_value
+EOF
+
+				;;
+			(unused)
+
+cat >>confdefs.h <<EOF
+#define GCC_UNUSED $cf_directive
+EOF
+
+				;;
+			esac
+		fi
+	done
+else
+	${FGREP-fgrep} define conftest.i >>confdefs.h
+fi
+rm -rf ./conftest*
+fi
+
+fi
+
+if test "x$enable_warnings" = "xyes"; then
+
+ 	ADAFLAGS="$ADAFLAGS -gnatwa -gnatyg"
+
+fi
+
+###	use option --enable-assertions to turn on generation of assertion code
+echo "$as_me:15938: checking if you want to enable runtime assertions" >&5
+echo $ECHO_N "checking if you want to enable runtime assertions... $ECHO_C" >&6
+
+# Check whether --enable-assertions or --disable-assertions was given.
+if test "${enable_assertions+set}" = set; then
+  enableval="$enable_assertions"
+  with_assertions=$enableval
+else
+  with_assertions=no
+fi;
+echo "$as_me:15948: result: $with_assertions" >&5
+echo "${ECHO_T}$with_assertions" >&6
+if test -n "$GCC"
+then
+	if test "$with_assertions" = no
+	then
+		CPPFLAGS="$CPPFLAGS -DNDEBUG"
+	else
+
+ 	ADAFLAGS="$ADAFLAGS -gnata"
+
+	fi
+fi
+
+###	use option --disable-leaks to suppress "permanent" leaks, for testing
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NC_ALLOC_H 1
+EOF
+
+###	use option --enable-expanded to generate certain macros as functions
+
+# Check whether --enable-expanded or --disable-expanded was given.
+if test "${enable_expanded+set}" = set; then
+  enableval="$enable_expanded"
+  test "$enableval" = yes &&
+cat >>confdefs.h <<\EOF
+#define NCURSES_EXPANDED 1
+EOF
+
+fi;
+
+###	use option --disable-macros to suppress macros in favor of functions
+
+# Check whether --enable-macros or --disable-macros was given.
+if test "${enable_macros+set}" = set; then
+  enableval="$enable_macros"
+  test "$enableval" = no &&
+cat >>confdefs.h <<\EOF
+#define NCURSES_NOMACROS 1
+EOF
+
+fi;
+
+# Normally we only add trace() to the debug-library.  Allow this to be
+# extended to all models of the ncurses library:
+cf_all_traces=no
+case "$CFLAGS $CPPFLAGS" in
+(*-DTRACE*)
+	cf_all_traces=yes
+	;;
+esac
+
+echo "$as_me:16001: checking whether to add trace feature to all models" >&5
+echo $ECHO_N "checking whether to add trace feature to all models... $ECHO_C" >&6
+
+# Check whether --with-trace or --without-trace was given.
+if test "${with_trace+set}" = set; then
+  withval="$with_trace"
+  cf_with_trace=$withval
+else
+  cf_with_trace=$cf_all_traces
+fi;
+echo "$as_me:16011: result: $cf_with_trace" >&5
+echo "${ECHO_T}$cf_with_trace" >&6
+
+if test "$cf_with_trace" = yes ; then
+	ADA_TRACE=TRUE
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in -DTRACE
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+else
+	ADA_TRACE=FALSE
+fi
+
+echo "$as_me:16119: checking if we want to use GNAT projects" >&5
+echo $ECHO_N "checking if we want to use GNAT projects... $ECHO_C" >&6
+
+# Check whether --enable-gnat-projects or --disable-gnat-projects was given.
+if test "${enable_gnat_projects+set}" = set; then
+  enableval="$enable_gnat_projects"
+  test "$enableval" != no && enableval=yes
+	if test "$enableval" != "yes" ; then
+    enable_gnat_projects=no
+	else
+		enable_gnat_projects=yes
+	fi
+else
+  enableval=yes
+	enable_gnat_projects=yes
+
+fi;
+echo "$as_me:16136: result: $enable_gnat_projects" >&5
+echo "${ECHO_T}$enable_gnat_projects" >&6
+
+###	Checks for libraries.
+case $cf_cv_system_name in
+(*mingw32*)
+
+echo "$as_me:16143: checking if ssp library is needed" >&5
+echo $ECHO_N "checking if ssp library is needed... $ECHO_C" >&6
+if test "${cf_cv_need_libssp+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 16150 "configure"
+#include "confdefs.h"
+
+#include <sys/types.h>
+#include <dirent.h>
+
+int
+main (void)
+{
+
+       DIR *dp = opendir(".");
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:16167: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:16170: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:16173: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:16176: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_need_libssp=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+	cf_save_LIBS="$LIBS"
+	LIBS="$LIBS -lssp"
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 16186 "configure"
+#include "confdefs.h"
+
+#include <sys/types.h>
+#include <dirent.h>
+
+int
+main (void)
+{
+
+		   DIR *dp = opendir(".");
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:16203: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:16206: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:16209: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:16212: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_need_libssp=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_need_libssp=maybe
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+	LIBS="$cf_save_LIBS"
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:16226: result: $cf_cv_need_libssp" >&5
+echo "${ECHO_T}$cf_cv_need_libssp" >&6
+
+if test "x$cf_cv_need_libssp" = xyes
+then
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lssp; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+fi
+
+	;;
+(*)
+echo "$as_me:16252: checking for gettimeofday" >&5
+echo $ECHO_N "checking for gettimeofday... $ECHO_C" >&6
+if test "${ac_cv_func_gettimeofday+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 16258 "configure"
+#include "confdefs.h"
+#define gettimeofday autoconf_temporary
+#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
+#undef gettimeofday
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char gettimeofday (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_gettimeofday) || defined (__stub___gettimeofday)
+#error found stub for gettimeofday
+#endif
+
+	return gettimeofday ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:16289: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:16292: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:16295: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:16298: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_func_gettimeofday=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_gettimeofday=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:16308: result: $ac_cv_func_gettimeofday" >&5
+echo "${ECHO_T}$ac_cv_func_gettimeofday" >&6
+if test "$ac_cv_func_gettimeofday" = yes; then
+  cat >>confdefs.h <<\EOF
+#define HAVE_GETTIMEOFDAY 1
+EOF
+
+else
+
+echo "$as_me:16317: checking for gettimeofday in -lbsd" >&5
+echo $ECHO_N "checking for gettimeofday in -lbsd... $ECHO_C" >&6
+if test "${ac_cv_lib_bsd_gettimeofday+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lbsd  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 16325 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char gettimeofday ();
+int
+main (void)
+{
+gettimeofday ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:16344: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:16347: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:16350: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:16353: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_bsd_gettimeofday=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_bsd_gettimeofday=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:16364: result: $ac_cv_lib_bsd_gettimeofday" >&5
+echo "${ECHO_T}$ac_cv_lib_bsd_gettimeofday" >&6
+if test "$ac_cv_lib_bsd_gettimeofday" = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_GETTIMEOFDAY 1
+EOF
+
+	LIBS="$LIBS -lbsd"
+fi
+
+fi
+	;;
+esac
+
+###	Checks for header files.
+echo "$as_me:16380: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
+if test "${ac_cv_header_stdc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 16386 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+_ACEOF
+if { (eval echo "$as_me:16394: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:16400: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_cv_header_stdc=yes
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  ac_cv_header_stdc=no
+fi
+rm -f conftest.err "conftest.$ac_ext"
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 16422 "configure"
+#include "confdefs.h"
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -rf conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 16440 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -rf conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then
+  :
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 16461 "configure"
+#include "confdefs.h"
+#include <ctype.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) (('a' <= (c) && (c) <= 'i') \
+                     || ('j' <= (c) && (c) <= 'r') \
+                     || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main (void)
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+        || toupper (i) != TOUPPER (i))
+      $ac_main_return(2);
+  $ac_main_return (0);
+}
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:16487: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:16490: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:16492: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:16495: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_header_stdc=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+fi
+fi
+echo "$as_me:16508: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6
+if test $ac_cv_header_stdc = yes; then
+
+cat >>confdefs.h <<\EOF
+#define STDC_HEADERS 1
+EOF
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+                  inttypes.h stdint.h unistd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:16524: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 16530 "configure"
+#include "confdefs.h"
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:16536: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:16539: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:16542: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:16545: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_Header=no"
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:16555: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+echo "$as_me:16565: checking for signed char" >&5
+echo $ECHO_N "checking for signed char... $ECHO_C" >&6
+if test "${ac_cv_type_signed_char+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 16571 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+if ((signed char *) 0)
+  return 0;
+if (sizeof (signed char))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:16586: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:16589: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:16592: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:16595: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_type_signed_char=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_type_signed_char=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:16605: result: $ac_cv_type_signed_char" >&5
+echo "${ECHO_T}$ac_cv_type_signed_char" >&6
+
+echo "$as_me:16608: checking size of signed char" >&5
+echo $ECHO_N "checking size of signed char... $ECHO_C" >&6
+if test "${ac_cv_sizeof_signed_char+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$ac_cv_type_signed_char" = yes; then
+  if test "$cross_compiling" = yes; then
+  # Depending upon the size, compute the lo and hi bounds.
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 16617 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+int _array_ [1 - 2 * !((sizeof (signed char)) >= 0)]
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:16629: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:16632: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:16635: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:16638: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat >"conftest.$ac_ext" <<_ACEOF
+#line 16643 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+int _array_ [1 - 2 * !((sizeof (signed char)) <= $ac_mid)]
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:16655: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:16658: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:16661: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:16664: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_hi=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_lo=`expr "$ac_mid" + 1`; ac_mid=`expr 2 '*' "$ac_mid" + 1`
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+  done
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_hi=-1 ac_mid=-1
+  while :; do
+    cat >"conftest.$ac_ext" <<_ACEOF
+#line 16680 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+int _array_ [1 - 2 * !((sizeof (signed char)) >= $ac_mid)]
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:16692: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:16695: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:16698: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:16701: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_lo=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_hi=`expr "$ac_mid" - 1`; ac_mid=`expr 2 '*' "$ac_mid"`
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+  done
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  ac_mid=`expr '(' "$ac_hi" - "$ac_lo" ')' / 2 + "$ac_lo"`
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 16717 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+int _array_ [1 - 2 * !((sizeof (signed char)) <= $ac_mid)]
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:16729: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:16732: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:16735: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:16738: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_hi=$ac_mid
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_lo=`expr "$ac_mid" + 1`
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+done
+ac_cv_sizeof_signed_char=$ac_lo
+else
+  if test "$cross_compiling" = yes; then
+  { { echo "$as_me:16751: error: cannot run test program while cross compiling" >&5
+echo "$as_me: error: cannot run test program while cross compiling" >&2;}
+   { (exit 1); exit 1; }; }
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 16756 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+FILE *f = fopen ("conftest.val", "w");
+if (!f)
+  $ac_main_return (1);
+fprintf (f, "%ld", (long)(sizeof (signed char)));
+fclose (f);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:16772: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:16775: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:16777: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:16780: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_sizeof_signed_char=`cat conftest.val`
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+fi
+rm -f conftest.val
+else
+  ac_cv_sizeof_signed_char=0
+fi
+fi
+echo "$as_me:16796: result: $ac_cv_sizeof_signed_char" >&5
+echo "${ECHO_T}$ac_cv_sizeof_signed_char" >&6
+cat >>confdefs.h <<EOF
+#define SIZEOF_SIGNED_CHAR $ac_cv_sizeof_signed_char
+EOF
+
+echo "$as_me:16802: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
+if test "${ac_cv_header_stdc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 16808 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+_ACEOF
+if { (eval echo "$as_me:16816: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:16822: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_cv_header_stdc=yes
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  ac_cv_header_stdc=no
+fi
+rm -f conftest.err "conftest.$ac_ext"
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 16844 "configure"
+#include "confdefs.h"
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -rf conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 16862 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -rf conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then
+  :
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 16883 "configure"
+#include "confdefs.h"
+#include <ctype.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) (('a' <= (c) && (c) <= 'i') \
+                     || ('j' <= (c) && (c) <= 'r') \
+                     || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main (void)
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+        || toupper (i) != TOUPPER (i))
+      $ac_main_return(2);
+  $ac_main_return (0);
+}
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:16909: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:16912: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:16914: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:16917: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_header_stdc=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+fi
+fi
+echo "$as_me:16930: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6
+if test $ac_cv_header_stdc = yes; then
+
+cat >>confdefs.h <<\EOF
+#define STDC_HEADERS 1
+EOF
+
+fi
+
+ac_header_dirent=no
+for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do
+  as_ac_Header=`echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh`
+echo "$as_me:16943: checking for $ac_hdr that defines DIR" >&5
+echo $ECHO_N "checking for $ac_hdr that defines DIR... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 16949 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <$ac_hdr>
+
+int
+main (void)
+{
+if ((DIR *) 0)
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:16964: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:16967: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:16970: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:16973: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_Header=no"
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:16983: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_hdr" | $as_tr_cpp` 1
+EOF
+
+ac_header_dirent=$ac_hdr; break
+fi
+
+done
+# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
+if test $ac_header_dirent = dirent.h; then
+  echo "$as_me:16996: checking for opendir in -ldir" >&5
+echo $ECHO_N "checking for opendir in -ldir... $ECHO_C" >&6
+if test "${ac_cv_lib_dir_opendir+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldir  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 17004 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char opendir ();
+int
+main (void)
+{
+opendir ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:17023: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:17026: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:17029: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:17032: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_dir_opendir=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_dir_opendir=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:17043: result: $ac_cv_lib_dir_opendir" >&5
+echo "${ECHO_T}$ac_cv_lib_dir_opendir" >&6
+if test "$ac_cv_lib_dir_opendir" = yes; then
+  LIBS="$LIBS -ldir"
+fi
+
+else
+  echo "$as_me:17050: checking for opendir in -lx" >&5
+echo $ECHO_N "checking for opendir in -lx... $ECHO_C" >&6
+if test "${ac_cv_lib_x_opendir+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lx  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 17058 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char opendir ();
+int
+main (void)
+{
+opendir ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:17077: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:17080: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:17083: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:17086: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_x_opendir=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_x_opendir=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:17097: result: $ac_cv_lib_x_opendir" >&5
+echo "${ECHO_T}$ac_cv_lib_x_opendir" >&6
+if test "$ac_cv_lib_x_opendir" = yes; then
+  LIBS="$LIBS -lx"
+fi
+
+fi
+
+echo "$as_me:17105: checking whether time.h and sys/time.h may both be included" >&5
+echo $ECHO_N "checking whether time.h and sys/time.h may both be included... $ECHO_C" >&6
+if test "${ac_cv_header_time+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 17111 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <sys/time.h>
+#include <time.h>
+
+int
+main (void)
+{
+if ((struct tm *) 0)
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:17127: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:17130: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:17133: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:17136: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_header_time=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_header_time=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:17146: result: $ac_cv_header_time" >&5
+echo "${ECHO_T}$ac_cv_header_time" >&6
+if test $ac_cv_header_time = yes; then
+
+cat >>confdefs.h <<\EOF
+#define TIME_WITH_SYS_TIME 1
+EOF
+
+fi
+
+###	checks for compiler characteristics
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
+ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_main_return="return"
+
+echo "$as_me:17164: checking for an ANSI C-conforming const" >&5
+echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6
+if test "${ac_cv_c_const+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 17170 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+/* FIXME: Include the comments suggested by Paul. */
+#ifndef __cplusplus
+  /* Ultrix mips cc rejects this.  */
+  typedef int charset[2];
+  const charset x;
+  /* SunOS 4.1.1 cc rejects this.  */
+  char const *const *ccp;
+  char **p;
+  /* NEC SVR4.0.2 mips cc rejects this.  */
+  struct point {int x, y;};
+  static struct point const zero = {0,0};
+  /* AIX XL C 1.02.0.0 rejects this.
+     It does not let you subtract one const X* pointer from another in
+     an arm of an if-expression whose if-part is not a constant
+     expression */
+  const char *g = "string";
+  ccp = &g + (g ? g-g : 0);
+  /* HPUX 7.0 cc rejects these. */
+  ++ccp;
+  p = (char**) ccp;
+  ccp = (char const *const *) p;
+  { /* SCO 3.2v4 cc rejects this.  */
+    char *t;
+    char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+    *t++ = 0;
+  }
+  { /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
+    int x[] = {25, 17};
+    const int *foo = &x[0];
+    ++foo;
+  }
+  { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+    typedef const int *iptr;
+    iptr p = 0;
+    ++p;
+  }
+  { /* AIX XL C 1.02.0.0 rejects this saying
+       "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+    struct s { int j; const int *ap[3]; };
+    struct s *b; b->j = 5;
+  }
+  { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+    const int foo = 10;
+  }
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:17228: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:17231: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:17234: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:17237: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_c_const=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_c_const=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:17247: result: $ac_cv_c_const" >&5
+echo "${ECHO_T}$ac_cv_c_const" >&6
+if test $ac_cv_c_const = no; then
+
+cat >>confdefs.h <<\EOF
+#define const
+EOF
+
+fi
+
+###	Checks for external-data
+
+echo "$as_me:17259: checking if data-only library module links" >&5
+echo $ECHO_N "checking if data-only library module links... $ECHO_C" >&6
+if test "${cf_cv_link_dataonly+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	rm -f conftest.a
+	cat >conftest.$ac_ext <<EOF
+#line 17267 "configure"
+int	testdata[3] = { 123, 456, 789 };
+EOF
+	if { (eval echo "$as_me:17270: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:17273: \$? = $ac_status" >&5
+  (exit "$ac_status"); } ; then
+		mv conftest.o data.o && \
+		( $AR $ARFLAGS conftest.a data.o ) 2>&5 1>/dev/null
+	fi
+	rm -f conftest.$ac_ext data.o
+	cat >conftest.$ac_ext <<EOF
+#line 17280 "configure"
+int	testfunc(void)
+{
+#if defined(NeXT)
+	${cf_cv_main_return:-return}(1);	/* I'm told this linker is broken */
+#else
+	extern int testdata[3];
+	return testdata[0] == 123
+	   &&  testdata[1] == 456
+	   &&  testdata[2] == 789;
+#endif
+}
+EOF
+	if { (eval echo "$as_me:17293: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:17296: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; then
+		mv conftest.o func.o && \
+		( $AR $ARFLAGS conftest.a func.o ) 2>&5 1>/dev/null
+	fi
+	rm -f conftest.$ac_ext func.o
+	( eval $RANLIB conftest.a ) 2>&5 >/dev/null
+	cf_saveLIBS="$LIBS"
+	LIBS="conftest.a $LIBS"
+	if test "$cross_compiling" = yes; then
+  cf_cv_link_dataonly=unknown
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 17309 "configure"
+#include "confdefs.h"
+
+	int main(void)
+	{
+		extern int testfunc();
+		${cf_cv_main_return:-return} (!testfunc());
+	}
+
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:17320: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:17323: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:17325: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:17328: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_link_dataonly=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_link_dataonly=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+	LIBS="$cf_saveLIBS"
+
+fi
+
+echo "$as_me:17343: result: $cf_cv_link_dataonly" >&5
+echo "${ECHO_T}$cf_cv_link_dataonly" >&6
+
+if test "$cf_cv_link_dataonly" = no ; then
+
+cat >>confdefs.h <<\EOF
+#define BROKEN_LINKER 1
+EOF
+
+	BROKEN_LINKER=1
+fi
+
+###	Checks for library functions.
+
+for ac_header in \
+unistd.h \
+
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:17362: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 17368 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:17372: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:17378: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:17397: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+echo "$as_me:17407: checking for working mkstemp" >&5
+echo $ECHO_N "checking for working mkstemp... $ECHO_C" >&6
+if test "${cf_cv_func_mkstemp+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+rm -rf ./conftest*
+if test "$cross_compiling" = yes; then
+  cf_cv_func_mkstemp=maybe
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 17418 "configure"
+#include "confdefs.h"
+
+#include <sys/types.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/stat.h>
+int main(void)
+{
+	char *tmpl = "conftestXXXXXX";
+	char name[2][80];
+	int n;
+	int result = 0;
+	int fd;
+	struct stat sb;
+
+	umask(077);
+	for (n = 0; n < 2; ++n) {
+		strcpy(name[n], tmpl);
+		if ((fd = mkstemp(name[n])) >= 0) {
+			if (!strcmp(name[n], tmpl)
+			 || stat(name[n], &sb) != 0
+			 || (sb.st_mode & S_IFMT) != S_IFREG
+			 || (sb.st_mode & 077) != 0) {
+				result = 1;
+			}
+			close(fd);
+		}
+	}
+	if (result == 0
+	 && !strcmp(name[0], name[1]))
+		result = 1;
+	${cf_cv_main_return:-return}(result);
+}
+
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:17459: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:17462: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:17464: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:17467: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_func_mkstemp=yes
+
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_func_mkstemp=no
+
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+
+fi
+echo "$as_me:17482: result: $cf_cv_func_mkstemp" >&5
+echo "${ECHO_T}$cf_cv_func_mkstemp" >&6
+if test "x$cf_cv_func_mkstemp" = xmaybe ; then
+	echo "$as_me:17485: checking for mkstemp" >&5
+echo $ECHO_N "checking for mkstemp... $ECHO_C" >&6
+if test "${ac_cv_func_mkstemp+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 17491 "configure"
+#include "confdefs.h"
+#define mkstemp autoconf_temporary
+#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
+#undef mkstemp
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char mkstemp (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_mkstemp) || defined (__stub___mkstemp)
+#error found stub for mkstemp
+#endif
+
+	return mkstemp ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:17522: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:17525: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:17528: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:17531: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_func_mkstemp=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_mkstemp=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:17541: result: $ac_cv_func_mkstemp" >&5
+echo "${ECHO_T}$ac_cv_func_mkstemp" >&6
+
+fi
+if test "x$cf_cv_func_mkstemp" = xyes || test "x$ac_cv_func_mkstemp" = xyes ; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_MKSTEMP 1
+EOF
+
+fi
+
+if test -z "$cf_user_CFLAGS" && test "$with_no_leaks" = no ; then
+	CFLAGS=`echo "${CFLAGS}" | sed -e 's%-g %%' -e 's%-g$%%' -e 's%[	]% %g' -e 's% [ ]*% %g' -e 's%^ %%' -e 's% $%%'`
+	CXXFLAGS=`echo "${CXXFLAGS}" | sed -e 's%-g %%' -e 's%-g$%%' -e 's%[	]% %g' -e 's% [ ]*% %g' -e 's%^ %%' -e 's% $%%'`
+fi
+
+cf_with_ada=yes
+if test "$cf_with_ada" != "no" ; then
+
+for cf_prog_gnat in gnat gnatmake gprconfig gprbuild
+do
+
+cf_upper_prog_gnat=`echo "${cf_prog_gnat}" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+	unset ac_cv_path_cf_TEMP_gnat
+	unset cf_TEMP_gnat
+	# Extract the first word of "$cf_prog_gnat", so it can be a program name with args.
+set dummy $cf_prog_gnat; ac_word=$2
+echo "$as_me:17570: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_cf_TEMP_gnat+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $cf_TEMP_gnat in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_cf_TEMP_gnat="$cf_TEMP_gnat" # Let the user override the test with a path.
+  ;;
+  *)
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  if $as_executable_p "$ac_dir/$ac_word"; then
+   ac_cv_path_cf_TEMP_gnat="$ac_dir/$ac_word"
+   echo "$as_me:17587: found $ac_dir/$ac_word" >&5
+   break
+fi
+done
+
+  test -z "$ac_cv_path_cf_TEMP_gnat" && ac_cv_path_cf_TEMP_gnat="no"
+  ;;
+esac
+fi
+cf_TEMP_gnat=$ac_cv_path_cf_TEMP_gnat
+
+if test -n "$cf_TEMP_gnat"; then
+  echo "$as_me:17599: result: $cf_TEMP_gnat" >&5
+echo "${ECHO_T}$cf_TEMP_gnat" >&6
+else
+  echo "$as_me:17602: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+	eval "cf_cv_PATH_$cf_upper_prog_gnat=$ac_cv_path_cf_TEMP_gnat"
+
+	if test "x$cf_TEMP_gnat" != xno; then
+		unset cf_cv_gnat_version
+		unset cf_TEMP_gnat
+
+echo "$as_me:17612: checking for $cf_prog_gnat version" >&5
+echo $ECHO_N "checking for $cf_prog_gnat version... $ECHO_C" >&6
+if test "${cf_cv_gnat_version+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cf_cv_gnat_version=`$cf_prog_gnat --version 2>&1 | \
+	grep '[0-9].[0-9][0-9]*' |\
+	sed -e '2,$d' -e 's/[^0-9 \.]//g' -e 's/^[ ]*//' -e 's/ .*//'`
+
+fi
+echo "$as_me:17623: result: $cf_cv_gnat_version" >&5
+echo "${ECHO_T}$cf_cv_gnat_version" >&6
+test -z "$cf_cv_gnat_version" && cf_cv_gnat_version=no
+eval cf_TEMP_gnat=$cf_cv_gnat_version; unset cf_cv_gnat_version
+
+	fi
+	eval "cf_cv_VERSION_$cf_upper_prog_gnat=$cf_TEMP_gnat"
+
+	unset cf_TEMP_gnat
+	unset cf_cv_gnat_version
+	unset ac_cv_path_cf_TEMP_gnat
+done
+
+if test "x$cf_cv_VERSION_GNATMAKE" = "xno"; then
+	cf_ada_make=
+	cf_cv_prog_gnat_correct=no
+else
+	cf_ada_make=gnatmake
+	if test "x$cf_cv_VERSION_GPRCONFIG" = "xno"; then
+		# gprconfig is newer than gnatmake; we can continue...
+		cf_ada_config="##"
+	else
+		rm -rf ./conftest* ./*~conftest*
+		if mkdir conftest.src
+		then
+			cf_ada_config=""
+			cd conftest.src
+			for cf_gprconfig in Ada C
+			do
+				echo "$as_me:17652: checking for gprconfig name for $cf_gprconfig" >&5
+echo $ECHO_N "checking for gprconfig name for $cf_gprconfig... $ECHO_C" >&6
+				if test "$cf_gprconfig" = C
+				then
+					for cf_gprconfig_param in \
+						"$cf_gprconfig,,,,GNATGCC" \
+						"$cf_gprconfig,,,,GCC" \
+						"$cf_gprconfig"
+					do
+						cf_gprconfig_value=`echo s| gprconfig --config=$cf_gprconfig_param 2>&5 | ${AWK:-awk} '/^\*/{print $3;}' | head -n 1`
+						test -n "$cf_gprconfig_value" && break
+					done
+				else
+					cf_gprconfig_param=$cf_gprconfig
+					cf_gprconfig_value=`echo s| gprconfig --config=$cf_gprconfig_param 2>&5 | ${AWK:-awk} '/^\*/{print $3;}' | head -n 1`
+				fi
+				if test -n "$cf_gprconfig_value"
+				then
+					eval "cf_ada_config_$cf_gprconfig=$cf_gprconfig_value"
+					echo "$as_me:17671: result: $cf_gprconfig_value" >&5
+echo "${ECHO_T}$cf_gprconfig_value" >&6
+				else
+					echo "$as_me:17674: result: missing" >&5
+echo "${ECHO_T}missing" >&6
+					cf_ada_config="#"
+					break
+				fi
+			done
+			cd ..
+			rm -rf ./conftest* ./*~conftest*
+		fi
+	fi
+	if test "x$cf_ada_config" != "x#"
+	then
+
+echo "$as_me:17687: checking for gnat version" >&5
+echo $ECHO_N "checking for gnat version... $ECHO_C" >&6
+if test "${cf_cv_gnat_version+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cf_cv_gnat_version=`${cf_ada_make:-gnatmake} --version 2>&1 | \
+	grep '[0-9].[0-9][0-9]*' |\
+	sed -e '2,$d' -e 's/[^0-9 \.]//g' -e 's/^[ ]*//' -e 's/ .*//'`
+
+fi
+echo "$as_me:17698: result: $cf_cv_gnat_version" >&5
+echo "${ECHO_T}$cf_cv_gnat_version" >&6
+test -z "$cf_cv_gnat_version" && cf_cv_gnat_version=no
+
+case "$cf_cv_gnat_version" in
+(3.1[1-9]*|3.[2-9]*|[4-9].*|[1-9][0-9].[0-9]*|20[0-9][0-9])
+	cf_cv_prog_gnat_correct=yes
+	;;
+(*)
+	{ echo "$as_me:17707: WARNING: Unsupported GNAT version $cf_cv_gnat_version. We require 3.11 or better. Disabling Ada95 binding." >&5
+echo "$as_me: WARNING: Unsupported GNAT version $cf_cv_gnat_version. We require 3.11 or better. Disabling Ada95 binding." >&2;}
+	cf_cv_prog_gnat_correct=no
+	;;
+esac
+
+		# Extract the first word of "m4", so it can be a program name with args.
+set dummy m4; ac_word=$2
+echo "$as_me:17715: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_M4_exists+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$M4_exists"; then
+  ac_cv_prog_M4_exists="$M4_exists" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_M4_exists="yes"
+echo "$as_me:17730: found $ac_dir/$ac_word" >&5
+break
+done
+
+  test -z "$ac_cv_prog_M4_exists" && ac_cv_prog_M4_exists="no"
+fi
+fi
+M4_exists=$ac_cv_prog_M4_exists
+if test -n "$M4_exists"; then
+  echo "$as_me:17739: result: $M4_exists" >&5
+echo "${ECHO_T}$M4_exists" >&6
+else
+  echo "$as_me:17742: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+		if test "$ac_cv_prog_M4_exists" = no; then
+			cf_cv_prog_gnat_correct=no
+			{ echo "$as_me:17748: WARNING: Ada95 binding required program m4 not found. Ada95 binding disabled" >&5
+echo "$as_me: WARNING: Ada95 binding required program m4 not found. Ada95 binding disabled" >&2;}
+		fi
+		if test "$cf_cv_prog_gnat_correct" = yes; then
+			echo "$as_me:17752: checking if GNAT works" >&5
+echo $ECHO_N "checking if GNAT works... $ECHO_C" >&6
+
+rm -rf ./conftest* ./*~conftest*
+cat >>conftest.ads <<CF_EOF
+procedure conftest;
+CF_EOF
+cat >>conftest.adb <<CF_EOF
+with Text_IO;
+with GNAT.OS_Lib;
+procedure conftest is
+begin
+   Text_IO.Put ("Hello World");
+   Text_IO.New_Line;
+   GNAT.OS_Lib.OS_Exit (0);
+end conftest;
+CF_EOF
+if ( "$cf_ada_make" $ADAFLAGS conftest 1>&5 2>&1 ) ; then
+   if ( ./conftest 1>&5 2>&1 ) ; then
+      cf_cv_prog_gnat_correct=yes
+   else
+      cf_cv_prog_gnat_correct=no
+   fi
+else
+   cf_cv_prog_gnat_correct=no
+fi
+rm -rf ./conftest* ./*~conftest*
+
+			echo "$as_me:17780: result: $cf_cv_prog_gnat_correct" >&5
+echo "${ECHO_T}$cf_cv_prog_gnat_correct" >&6
+		fi
+	else
+		cf_cv_prog_gnat_correct=no
+	fi
+fi
+
+	if test	"$cf_cv_prog_gnat_correct" = yes; then
+
+	echo "$as_me:17790: checking optimization options for ADAFLAGS" >&5
+echo $ECHO_N "checking optimization options for ADAFLAGS... $ECHO_C" >&6
+	case "$CFLAGS" in
+	(*-g*)
+
+ 	ADAFLAGS="$ADAFLAGS -g"
+
+		;;
+	esac
+	case "$CFLAGS" in
+	(*-O*)
+		cf_O_flag=`echo "$CFLAGS" |sed -e 's/^.*-O/-O/' -e 's/[ 	].*//'`
+
+ 	ADAFLAGS="$ADAFLAGS $cf_O_flag"
+
+		;;
+	esac
+	echo "$as_me:17807: result: $ADAFLAGS" >&5
+echo "${ECHO_T}$ADAFLAGS" >&6
+
+echo "$as_me:17810: checking if GNATPREP supports -T option" >&5
+echo $ECHO_N "checking if GNATPREP supports -T option... $ECHO_C" >&6
+if test "${cf_cv_gnatprep_opt_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cf_cv_gnatprep_opt_t=no
+gnatprep -T 2>/dev/null >/dev/null && cf_cv_gnatprep_opt_t=yes
+
+fi
+echo "$as_me:17820: result: $cf_cv_gnatprep_opt_t" >&5
+echo "${ECHO_T}$cf_cv_gnatprep_opt_t" >&6
+test "$cf_cv_gnatprep_opt_t" = yes && GNATPREP_OPTS="-T $GNATPREP_OPTS"
+
+echo "$as_me:17824: checking if GNAT supports generics" >&5
+echo $ECHO_N "checking if GNAT supports generics... $ECHO_C" >&6
+case "$cf_cv_gnat_version" in
+(3.1[1-9]*|3.[2-9]*|[4-9].*|[1-9][0-9].[0-9]*|20[0-9][0-9])
+	cf_gnat_generics=yes
+	;;
+(*)
+	cf_gnat_generics=no
+	;;
+esac
+echo "$as_me:17834: result: $cf_gnat_generics" >&5
+echo "${ECHO_T}$cf_gnat_generics" >&6
+
+if test "$cf_gnat_generics" = yes
+then
+	cf_compile_generics=generics
+	cf_generic_objects="\${GENOBJS}"
+else
+	cf_compile_generics=
+	cf_generic_objects=
+fi
+
+echo "$as_me:17846: checking if GNAT supports SIGINT" >&5
+echo $ECHO_N "checking if GNAT supports SIGINT... $ECHO_C" >&6
+if test "${cf_cv_gnat_sigint+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+rm -rf ./conftest* ./*~conftest*
+cat >>conftest.ads <<CF_EOF
+with Ada.Interrupts.Names;
+
+package ConfTest is
+
+   pragma Warnings (Off);  --  the next pragma exists since 3.11p
+   pragma Unreserve_All_Interrupts;
+   pragma Warnings (On);
+
+   protected Process is
+      procedure Stop;
+      function Continue return Boolean;
+      pragma Attach_Handler (Stop, Ada.Interrupts.Names.SIGINT);
+   private
+      Done : Boolean := False;
+   end Process;
+
+end ConfTest;
+CF_EOF
+cat >>conftest.adb <<CF_EOF
+package body ConfTest is
+   protected body Process is
+      procedure Stop is
+      begin
+         Done := True;
+      end Stop;
+      function Continue return Boolean is
+      begin
+         return not Done;
+      end Continue;
+   end Process;
+end ConfTest;
+CF_EOF
+if ( "$cf_ada_make" $ADAFLAGS conftest 1>&5 2>&1 ) ; then
+      cf_cv_gnat_sigint=yes
+else
+   cf_cv_gnat_sigint=no
+fi
+rm -rf ./conftest* ./*~conftest*
+
+fi
+echo "$as_me:17894: result: $cf_cv_gnat_sigint" >&5
+echo "${ECHO_T}$cf_cv_gnat_sigint" >&6
+
+if test "$cf_cv_gnat_sigint" = yes ; then
+	USE_GNAT_SIGINT=""
+else
+	USE_GNAT_SIGINT="#"
+fi
+
+cf_gnat_libraries=no
+cf_gnat_projects=no
+
+if test "$enable_gnat_projects" != no ; then
+echo "$as_me:17907: checking if GNAT supports project files" >&5
+echo $ECHO_N "checking if GNAT supports project files... $ECHO_C" >&6
+case "$cf_cv_gnat_version" in
+(3.[0-9]*)
+	;;
+(*)
+	case "$cf_cv_system_name" in
+	(cygwin*|msys*)
+		;;
+	(*)
+		rm -rf ./conftest* ./*~conftest*
+		if mkdir conftest.src conftest.bin conftest.lib
+		then
+			cd conftest.src
+			rm -rf ./conftest* ./*~conftest*
+			cat >>library.gpr <<CF_EOF
+project Library is
+  Kind := External ("LIB_KIND");
+  for Library_Name use "ConfTest";
+  for Object_Dir use ".";
+  for Library_ALI_Dir use External("LIBRARY_DIR");
+  for Library_Version use External ("SONAME");
+  for Library_Kind use Kind;
+  for Library_Dir use External("BUILD_DIR");
+  Source_Dir := External ("SOURCE_DIR");
+  for Source_Dirs use (Source_Dir);
+end Library;
+CF_EOF
+			cat >>confpackage.ads <<CF_EOF
+package ConfPackage is
+   procedure conftest;
+end ConfPackage;
+CF_EOF
+			cat >>confpackage.adb <<CF_EOF
+with Text_IO;
+package body ConfPackage is
+   procedure conftest is
+   begin
+      Text_IO.Put ("Hello World");
+      Text_IO.New_Line;
+   end conftest;
+end ConfPackage;
+CF_EOF
+			if ( "$cf_ada_make" $ADAFLAGS \
+					-Plibrary.gpr \
+					-XBUILD_DIR="`cd ../conftest.bin;pwd`" \
+					-XLIBRARY_DIR="`cd ../conftest.lib;pwd`" \
+					-XSOURCE_DIR="`pwd`" \
+					-XSONAME=libConfTest.so.1 \
+					-XLIB_KIND=static 1>&5 2>&1 ) ; then
+				cf_gnat_projects=yes
+			fi
+			cd ..
+		fi
+		if test -f conftest.lib/confpackage.ali
+		then
+			cf_gnat_libraries=yes
+		fi
+		rm -rf ./conftest* ./*~conftest*
+		;;
+	esac
+	;;
+esac
+echo "$as_me:17970: result: $cf_gnat_projects" >&5
+echo "${ECHO_T}$cf_gnat_projects" >&6
+fi # enable_gnat_projects
+
+if test "$cf_gnat_projects" = yes
+then
+	echo "$as_me:17976: checking if GNAT supports libraries" >&5
+echo $ECHO_N "checking if GNAT supports libraries... $ECHO_C" >&6
+	echo "$as_me:17978: result: $cf_gnat_libraries" >&5
+echo "${ECHO_T}$cf_gnat_libraries" >&6
+fi
+
+USE_OLD_MAKERULES=""
+USE_GNAT_PROJECTS="#"
+USE_GNAT_MAKE_GPR="#"
+USE_GNAT_GPRBUILD="#"
+
+if test "$cf_gnat_projects" = yes
+then
+	USE_OLD_MAKERULES="#"
+	USE_GNAT_PROJECTS=""
+	if test "$cf_cv_VERSION_GPRBUILD" != no
+	then
+		USE_GNAT_GPRBUILD=""
+	elif test "$cf_cv_VERSION_GNATMAKE" != no
+	then
+		USE_GNAT_MAKE_GPR=""
+	else
+		{ echo "$as_me:17998: WARNING: use old makefile rules since tools are missing" >&5
+echo "$as_me: WARNING: use old makefile rules since tools are missing" >&2;}
+	fi
+fi
+
+if test "$cf_gnat_libraries" = yes
+then
+	USE_GNAT_LIBRARIES=""
+else
+	USE_GNAT_LIBRARIES="#"
+fi
+
+echo "$as_me:18010: checking for ada-compiler" >&5
+echo $ECHO_N "checking for ada-compiler... $ECHO_C" >&6
+
+# Check whether --with-ada-compiler or --without-ada-compiler was given.
+if test "${with_ada_compiler+set}" = set; then
+  withval="$with_ada_compiler"
+  cf_ada_compiler=$withval
+else
+  cf_ada_compiler=gnatmake
+fi;
+
+echo "$as_me:18021: result: $cf_ada_compiler" >&5
+echo "${ECHO_T}$cf_ada_compiler" >&6
+
+		cf_ada_package=terminal_interface
+
+echo "$as_me:18026: checking for ada-include" >&5
+echo $ECHO_N "checking for ada-include... $ECHO_C" >&6
+
+# Check whether --with-ada-include or --without-ada-include was given.
+if test "${with_ada_include+set}" = set; then
+  withval="$with_ada_include"
+
+else
+  withval="${ADA_INCLUDE:-$prefix/share/ada/adainclude}"
+fi; if test -n "$prefix/share/ada/adainclude" ; then
+
+if test "x$prefix" != xNONE; then
+	cf_path_syntax="$prefix"
+else
+	cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$withval" in
+(.\$\(*\)*|.\'*\'*)
+	;;
+(..|./*|.\\*)
+	;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+	;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+	eval withval="$withval"
+	case ".$withval" in
+	(.NONE/*)
+		withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%`
+		;;
+	esac
+	;;
+(.no|.NONE/*)
+	withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%`
+	;;
+(*)
+	{ { echo "$as_me:18062: error: expected a pathname, not \"$withval\"" >&5
+echo "$as_me: error: expected a pathname, not \"$withval\"" >&2;}
+   { (exit 1); exit 1; }; }
+	;;
+esac
+
+fi
+eval ADA_INCLUDE="$withval"
+
+echo "$as_me:18071: result: $ADA_INCLUDE" >&5
+echo "${ECHO_T}$ADA_INCLUDE" >&6
+
+echo "$as_me:18074: checking for ada-objects" >&5
+echo $ECHO_N "checking for ada-objects... $ECHO_C" >&6
+
+# Check whether --with-ada-objects or --without-ada-objects was given.
+if test "${with_ada_objects+set}" = set; then
+  withval="$with_ada_objects"
+
+else
+  withval="${ADA_OBJECTS:-$prefix/lib/ada/adalib}"
+fi; if test -n "$prefix/lib/ada/adalib" ; then
+
+if test "x$prefix" != xNONE; then
+	cf_path_syntax="$prefix"
+else
+	cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$withval" in
+(.\$\(*\)*|.\'*\'*)
+	;;
+(..|./*|.\\*)
+	;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+	;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+	eval withval="$withval"
+	case ".$withval" in
+	(.NONE/*)
+		withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%`
+		;;
+	esac
+	;;
+(.no|.NONE/*)
+	withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%`
+	;;
+(*)
+	{ { echo "$as_me:18110: error: expected a pathname, not \"$withval\"" >&5
+echo "$as_me: error: expected a pathname, not \"$withval\"" >&2;}
+   { (exit 1); exit 1; }; }
+	;;
+esac
+
+fi
+eval ADA_OBJECTS="$withval"
+
+echo "$as_me:18119: result: $ADA_OBJECTS" >&5
+echo "${ECHO_T}$ADA_OBJECTS" >&6
+
+echo "$as_me:18122: checking if an Ada95 shared-library should be built" >&5
+echo $ECHO_N "checking if an Ada95 shared-library should be built... $ECHO_C" >&6
+
+# Check whether --with-ada-sharedlib or --without-ada-sharedlib was given.
+if test "${with_ada_sharedlib+set}" = set; then
+  withval="$with_ada_sharedlib"
+  with_ada_sharedlib=$withval
+else
+  with_ada_sharedlib=no
+fi;
+echo "$as_me:18132: result: $with_ada_sharedlib" >&5
+echo "${ECHO_T}$with_ada_sharedlib" >&6
+
+if test "x$with_ada_sharedlib" != xno
+then
+	if test "x$cf_gnat_projects" != xyes
+	then
+		{ echo "$as_me:18139: WARNING: disabling shared-library since GNAT projects are not supported" >&5
+echo "$as_me: WARNING: disabling shared-library since GNAT projects are not supported" >&2;}
+		with_ada_sharedlib=no
+	fi
+fi
+
+ADA_SHAREDLIB='lib$(LIB_NAME).so.1'
+MAKE_ADA_SHAREDLIB="#"
+
+if test "x$with_ada_sharedlib" != xno
+then
+	MAKE_ADA_SHAREDLIB=
+	if test "x$with_ada_sharedlib" != xyes
+	then
+		ADA_SHAREDLIB="$with_ada_sharedlib"
+	fi
+fi
+
+		# allow the Ada binding to be renamed
+
+echo "$as_me:18159: checking for ada-libname" >&5
+echo $ECHO_N "checking for ada-libname... $ECHO_C" >&6
+
+# Check whether --with-ada-libname or --without-ada-libname was given.
+if test "${with_ada_libname+set}" = set; then
+  withval="$with_ada_libname"
+  ADA_LIBNAME=$withval
+else
+  ADA_LIBNAME=AdaCurses
+fi;
+case "x$ADA_LIBNAME" in
+(x|xyes|xno)
+	ADA_LIBNAME=AdaCurses
+	;;
+esac
+
+echo "$as_me:18175: result: $ADA_LIBNAME" >&5
+echo "${ECHO_T}$ADA_LIBNAME" >&6
+
+	else
+		{ { echo "$as_me:18179: error: No usable Ada compiler found" >&5
+echo "$as_me: error: No usable Ada compiler found" >&2;}
+   { (exit 1); exit 1; }; }
+	fi
+else
+	{ { echo "$as_me:18184: error: The Ada compiler is needed for this package" >&5
+echo "$as_me: error: The Ada compiler is needed for this package" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+################################################################################
+
+# not needed
+TINFO_LDFLAGS2=
+
+TINFO_LIBS=
+
+### Construct the list of include-directories to be generated
+
+if test "$srcdir" != "."; then
+	CPPFLAGS="-I\${srcdir}/../include $CPPFLAGS"
+fi
+CPPFLAGS="-I../include $CPPFLAGS"
+if test "$srcdir" != "."; then
+	CPPFLAGS="-I\${srcdir} $CPPFLAGS"
+fi
+CPPFLAGS="-I. $CPPFLAGS"
+
+ACPPFLAGS="-I. -I../include -I../../include $ACPPFLAGS"
+if test "$srcdir" != "."; then
+	ACPPFLAGS="-I\${srcdir}/../../include $ACPPFLAGS"
+fi
+if test "$GCC" != yes; then
+	ACPPFLAGS="$ACPPFLAGS -I\${includedir}"
+elif test "$includedir" != "/usr/include"; then
+	if test "$includedir" = '${prefix}/include' ; then
+		if test x$prefix != x/usr ; then
+			ACPPFLAGS="$ACPPFLAGS -I\${includedir}"
+		fi
+	else
+		ACPPFLAGS="$ACPPFLAGS -I\${includedir}"
+	fi
+fi
+
+### Build up pieces for makefile rules
+echo "$as_me:18224: checking default library suffix" >&5
+echo $ECHO_N "checking default library suffix... $ECHO_C" >&6
+
+	case $DFT_LWR_MODEL in
+	(libtool) DFT_ARG_SUFFIX=''   ;;
+	(normal)  DFT_ARG_SUFFIX=''   ;;
+	(debug)   DFT_ARG_SUFFIX='_g' ;;
+	(profile) DFT_ARG_SUFFIX='_p' ;;
+	(shared)  DFT_ARG_SUFFIX=''   ;;
+	esac
+	test -n "$LIB_SUFFIX" && DFT_ARG_SUFFIX="${LIB_SUFFIX}${DFT_ARG_SUFFIX}"
+echo "$as_me:18235: result: $DFT_ARG_SUFFIX" >&5
+echo "${ECHO_T}$DFT_ARG_SUFFIX" >&6
+
+echo "$as_me:18238: checking default library-dependency suffix" >&5
+echo $ECHO_N "checking default library-dependency suffix... $ECHO_C" >&6
+
+	case X$DFT_LWR_MODEL in
+	(Xlibtool)
+		DFT_LIB_SUFFIX='.la'
+		DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX
+		;;
+	(Xdebug)
+		case "$cf_cv_system_name" in
+		(*-msvc*)
+			DFT_LIB_SUFFIX='_g.lib'
+			;;
+		(*)
+			DFT_LIB_SUFFIX='_g.a'
+			;;
+		esac
+		DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX
+		;;
+	(Xprofile)
+		case "$cf_cv_system_name" in
+		(*-msvc*)
+			DFT_LIB_SUFFIX='_p.lib'
+			;;
+		(*)
+			DFT_LIB_SUFFIX='_p.a'
+			;;
+		esac
+		DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX
+		;;
+	(Xshared)
+		case "$cf_cv_system_name" in
+		(aix[5-7]*)
+			DFT_LIB_SUFFIX='.so'
+			DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX
+			;;
+		(*-msvc*)
+			DFT_LIB_SUFFIX='.dll'
+			DFT_DEP_SUFFIX='.dll.lib'
+			;;
+		(cygwin*|msys*|mingw*)
+			DFT_LIB_SUFFIX='.dll'
+			DFT_DEP_SUFFIX='.dll.a'
+			;;
+		(darwin*)
+			DFT_LIB_SUFFIX='.dylib'
+			DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX
+			;;
+		(hpux*)
+			case "$target" in
+			(ia64*)
+				DFT_LIB_SUFFIX='.so'
+				DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX
+				;;
+			(*)
+				DFT_LIB_SUFFIX='.sl'
+				DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX
+				;;
+			esac
+			;;
+		(*)
+			DFT_LIB_SUFFIX='.so'
+			DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX
+			;;
+		esac
+		;;
+	(*)
+		case "$target" in
+		(*-msvc*)
+			DFT_LIB_SUFFIX='.lib'
+			;;
+		(*)
+			DFT_LIB_SUFFIX='.a'
+			;;
+		esac
+		DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX
+		;;
+	esac
+	if test -n "${LIB_SUFFIX}${EXTRA_SUFFIX}"
+	then
+		DFT_LIB_SUFFIX="${LIB_SUFFIX}${EXTRA_SUFFIX}${DFT_LIB_SUFFIX}"
+		DFT_DEP_SUFFIX="${LIB_SUFFIX}${EXTRA_SUFFIX}${DFT_DEP_SUFFIX}"
+	fi
+echo "$as_me:18321: result: $DFT_DEP_SUFFIX" >&5
+echo "${ECHO_T}$DFT_DEP_SUFFIX" >&6
+
+echo "$as_me:18324: checking default object directory" >&5
+echo $ECHO_N "checking default object directory... $ECHO_C" >&6
+
+	case $DFT_LWR_MODEL in
+	(libtool) DFT_OBJ_SUBDIR='obj_lo'  ;;
+	(normal)  DFT_OBJ_SUBDIR='objects' ;;
+	(debug)   DFT_OBJ_SUBDIR='obj_g' ;;
+	(profile) DFT_OBJ_SUBDIR='obj_p' ;;
+	(shared)
+		case "$cf_cv_system_name" in
+		(cygwin|msys)
+			DFT_OBJ_SUBDIR='objects' ;;
+		(*)
+			DFT_OBJ_SUBDIR='obj_s' ;;
+		esac
+	esac
+echo "$as_me:18340: result: $DFT_OBJ_SUBDIR" >&5
+echo "${ECHO_T}$DFT_OBJ_SUBDIR" >&6
+
+### Set up low-level terminfo dependencies for makefiles.
+
+if test "$DFT_LWR_MODEL" = shared ; then
+	case $cf_cv_system_name in
+	(cygwin*)
+		# "lib" files have ".dll.a" suffix, "cyg" files have ".dll"
+		;;
+	(msys*)
+		# "lib" files have ".dll.a" suffix, "msys-" files have ".dll"
+		;;
+	esac
+fi
+
+USE_ARG_SUFFIX=${DFT_ARG_SUFFIX}
+
+USE_LIB_SUFFIX=${DFT_ARG_SUFFIX}
+
+USE_CFG_SUFFIX=${DFT_ARG_SUFFIX}
+
+### Construct the list of subdirectories for which we'll customize makefiles
+### with the appropriate compile-rules.
+
+SUB_MAKEFILES="gen/adacurses${USE_ARG_SUFFIX}-config:gen/adacurses-config.in"
+
+cat >>confdefs.h <<EOF
+#define NCURSES_PATHSEP '$PATH_SEPARATOR'
+EOF
+
+################################################################################
+
+TEST_ARG2=
+
+TEST_LIBS2=
+
+NCURSES_SHLIB2="sh -c"
+
+ADA_SUBDIRS="include gen src doc"
+if test "x$cf_with_tests" != "xno" ; then
+	ADA_SUBDIRS="$ADA_SUBDIRS samples"
+fi
+for cf_dir in $ADA_SUBDIRS
+do
+	SUB_MAKEFILES="$SUB_MAKEFILES $cf_dir/Makefile"
+done
+
+NCURSES_TREE="#"
+
+EXTERNAL_TREE=
+
+# match layout used by make-tar.sh
+ADAHTML_DIR=../doc/ada
+
+if test "x$cross_compiling" = xyes ; then
+	ADAGEN_LDFLAGS='$(CROSS_LDFLAGS)'
+else
+	ADAGEN_LDFLAGS='$(NATIVE_LDFLAGS)'
+fi
+
+ac_config_files="$ac_config_files $SUB_MAKEFILES src/library.gpr:src/library.gpr.in doc/adacurses${DFT_ARG_SUFFIX}-config.1:doc/MKada_config.in Makefile"
+ac_config_commands="$ac_config_commands default"
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overriden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+{
+  (set) 2>&1 |
+    case `(ac_space=' '; set | grep ac_space) 2>&1` in
+    *ac_space=\ *)
+      # `set' does not quote correctly, so add quotes (double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \).
+      sed -n \
+        "s/'/'\\\\''/g;
+    	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;;
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n \
+        "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      ;;
+    esac;
+} |
+  sed '
+     t clear
+     : clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     : end' >>confcache
+if cmp -s $cache_file confcache; then :; else
+  if test -w $cache_file; then
+    test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
+    cat confcache >$cache_file
+  else
+    echo "not updating unwritable cache $cache_file"
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[ 	]*VPATH[ 	]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[ 	]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[ 	]*$//;
+}'
+fi
+
+DEFS=-DHAVE_CONFIG_H
+
+: "${CONFIG_STATUS=./config.status}"
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:18482: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >"$CONFIG_STATUS" <<_ACEOF
+#! $SHELL
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+me=\`echo "\$0" | sed -e 's,.*\\/,,'\`
+
+debug=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+ac_cs_invocation="\$0 \$@"
+
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+_ACEOF
+
+cat >>"$CONFIG_STATUS" <<\_ACEOF
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+
+# Name of the executable.
+as_me=`echo "$0" |sed 's,.*[\\/],,'`
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr="expr"
+else
+  as_expr="false"
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s='ln'
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+as_executable_p="test -f"
+
+# Support unset when possible.
+if (FOO=FOO; unset FOO) >/dev/null 2>&1; then
+  as_unset="unset"
+else
+  as_unset="false"
+fi
+
+# NLS nuisances.
+$as_unset LANG || test "${LANG+set}" != set || { LANG=C; export LANG; }
+$as_unset LC_ALL || test "${LC_ALL+set}" != set || { LC_ALL=C; export LC_ALL; }
+$as_unset LC_TIME || test "${LC_TIME+set}" != set || { LC_TIME=C; export LC_TIME; }
+$as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set || { LC_CTYPE=C; export LC_CTYPE; }
+$as_unset LANGUAGE || test "${LANGUAGE+set}" != set || { LANGUAGE=C; export LANGUAGE; }
+$as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set || { LC_COLLATE=C; export LC_COLLATE; }
+$as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set || { LC_NUMERIC=C; export LC_NUMERIC; }
+$as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set || { LC_MESSAGES=C; export LC_MESSAGES; }
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" 	$as_nl"
+
+# CDPATH.
+$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=:; export CDPATH; }
+
+exec 6>&1
+
+_ACEOF
+
+# Files that config.status was made for.
+if test -n "$ac_config_files"; then
+  echo "config_files=\"$ac_config_files\"" >>"$CONFIG_STATUS"
+fi
+
+if test -n "$ac_config_headers"; then
+  echo "config_headers=\"$ac_config_headers\"" >>"$CONFIG_STATUS"
+fi
+
+if test -n "$ac_config_links"; then
+  echo "config_links=\"$ac_config_links\"" >>"$CONFIG_STATUS"
+fi
+
+if test -n "$ac_config_commands"; then
+  echo "config_commands=\"$ac_config_commands\"" >>"$CONFIG_STATUS"
+fi
+
+cat >>"$CONFIG_STATUS" <<\EOF
+
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number, then exit
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+  --file=FILE[:TEMPLATE]
+                   instantiate the configuration file FILE
+  --header=FILE[:TEMPLATE]
+                   instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <dickey@invisible-island.net>."
+EOF
+
+cat >>"$CONFIG_STATUS" <<EOF
+ac_cs_version="\\
+config.status
+configured by $0, generated by GNU Autoconf 2.52.20221202,
+  with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright 2003-2021,2022	Thomas E. Dickey
+Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir="$srcdir"
+INSTALL="$INSTALL"
+EOF
+
+cat >>"$CONFIG_STATUS" <<\EOF
+# If no file are specified by the user, then we need to provide default
+# value.  By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=*)
+    ac_option=`expr "x$1" : 'x\([^=]*\)='`
+    ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+    shift
+    set dummy "$ac_option" "$ac_optarg" ${1+"$@"}
+    shift
+    ;;
+  -*);;
+  *) # This is not an option, so the user has probably given explicit
+     # arguments.
+     ac_need_defaults=false;;
+  esac
+
+  case $1 in
+  # Handling of the options.
+EOF
+cat >>"$CONFIG_STATUS" <<EOF
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    echo "running $SHELL $0 " $ac_configure_args " --no-create --no-recursion"
+    exec $SHELL $0 $ac_configure_args --no-create --no-recursion ;;
+EOF
+cat >>"$CONFIG_STATUS" <<\EOF
+  --version | --vers* | -V )
+    echo "$ac_cs_version"; exit 0 ;;
+  --he | --h)
+    # Conflict between --help and --header
+    { { echo "$as_me:18663: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; };;
+  --help | --hel | -h )
+    echo "$ac_cs_usage"; exit 0 ;;
+  --debug | --d* | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    shift
+    CONFIG_FILES="$CONFIG_FILES $1"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    shift
+    CONFIG_HEADERS="$CONFIG_HEADERS $1"
+    ac_need_defaults=false;;
+
+  # This is an error.
+  -*) { { echo "$as_me:18682: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; } ;;
+
+  *) ac_config_targets="$ac_config_targets $1" ;;
+
+  esac
+  shift
+done
+
+exec 5>>config.log
+cat >&5 << _ACEOF
+
+## ----------------------- ##
+## Running config.status.  ##
+## ----------------------- ##
+
+This file was extended by $as_me 2.52.20221202, executed with
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  > "$ac_cs_invocation"
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+
+_ACEOF
+EOF
+
+cat >>"$CONFIG_STATUS" <<EOF
+#
+# INIT-COMMANDS section.
+#
+
+### Special initialization commands, used to pass information from the
+### configuration-run into config.status
+
+AWK="$AWK"
+DFT_ARG_SUFFIX="$DFT_ARG_SUFFIX"
+DFT_LWR_MODEL="$DFT_LWR_MODEL"
+LIB_NAME="$LIB_NAME"
+LIB_PREFIX="$LIB_PREFIX"
+LIB_SUFFIX="$LIB_SUFFIX"
+LN_S="$LN_S"
+NCURSES_MAJOR="$NCURSES_MAJOR"
+NCURSES_MINOR="$NCURSES_MINOR"
+NCURSES_PATCH="$NCURSES_PATCH"
+PACKAGE="$PACKAGE"
+USE_OLD_MAKERULES="$USE_OLD_MAKERULES"
+cf_cv_VERSION_GNATMAKE=$cf_cv_VERSION_GNATMAKE
+cf_cv_VERSION_GPRBUILD=$cf_cv_VERSION_GPRBUILD
+cf_cv_abi_version="$cf_cv_abi_version"
+cf_cv_rel_version="$cf_cv_rel_version"
+cf_cv_rm_so_locs="$cf_cv_rm_so_locs"
+cf_cv_shared_soname='$cf_cv_shared_soname'
+cf_cv_shlib_version="$cf_cv_shlib_version"
+cf_cv_shlib_version_infix="$cf_cv_shlib_version_infix"
+cf_cv_system_name="$cf_cv_system_name"
+host="$host"
+target="$target"
+
+EOF
+
+cat >>"$CONFIG_STATUS" <<\EOF
+for ac_config_target in $ac_config_targets
+do
+  case "$ac_config_target" in
+  # Handling of arguments.
+  "$SUB_MAKEFILES" ) CONFIG_FILES="$CONFIG_FILES $SUB_MAKEFILES" ;;
+  "src/library.gpr" ) CONFIG_FILES="$CONFIG_FILES src/library.gpr:src/library.gpr.in" ;;
+  "doc/adacurses${DFT_ARG_SUFFIX}-config.1" ) CONFIG_FILES="$CONFIG_FILES doc/adacurses${DFT_ARG_SUFFIX}-config.1:doc/MKada_config.in" ;;
+  "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+  "default" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;;
+  "include/ncurses_cfg.h" ) CONFIG_HEADERS="$CONFIG_HEADERS include/ncurses_cfg.h:include/ncurses_cfg.hin" ;;
+  *) { { echo "$as_me:18757: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if "$ac_need_defaults"; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+  trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+  trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+: "${TMPDIR=/tmp}"
+{
+  tmp=`(umask 077 && mktemp -d -q "$TMPDIR/csXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=$TMPDIR/cs$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} ||
+{
+   echo "$me: cannot create a temporary directory in $TMPDIR" >&2
+   { (exit 1); exit 1; }
+}
+
+EOF
+
+cat >>"$CONFIG_STATUS" <<EOF
+
+#
+# CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "\$CONFIG_FILES"; then
+  # Protect against being on the right side of a sed subst in config.status.
+  sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
+   s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >"\$tmp"/subs.sed <<\\CEOF
+s,@SHELL@,$SHELL,;t t
+s,@exec_prefix@,$exec_prefix,;t t
+s,@prefix@,$prefix,;t t
+s,@program_transform_name@,$program_transform_name,;t t
+s,@bindir@,$bindir,;t t
+s,@sbindir@,$sbindir,;t t
+s,@libexecdir@,$libexecdir,;t t
+s,@datarootdir@,$datarootdir,;t t
+s,@datadir@,$datadir,;t t
+s,@sysconfdir@,$sysconfdir,;t t
+s,@sharedstatedir@,$sharedstatedir,;t t
+s,@localstatedir@,$localstatedir,;t t
+s,@runstatedir@,$runstatedir,;t t
+s,@libdir@,$libdir,;t t
+s,@includedir@,$includedir,;t t
+s,@oldincludedir@,$oldincludedir,;t t
+s,@infodir@,$infodir,;t t
+s,@mandir@,$mandir,;t t
+s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t
+s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
+s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
+s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t
+s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
+s,@build_alias@,$build_alias,;t t
+s,@host_alias@,$host_alias,;t t
+s,@target_alias@,$target_alias,;t t
+s,@ECHO_C@,$ECHO_C,;t t
+s,@ECHO_N@,$ECHO_N,;t t
+s,@ECHO_T@,$ECHO_T,;t t
+s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
+s,@DEFS@,$DEFS,;t t
+s,@LIBS@,$LIBS,;t t
+s,@PACKAGE@,$PACKAGE,;t t
+s,@top_builddir@,$top_builddir,;t t
+s,@build@,$build,;t t
+s,@build_cpu@,$build_cpu,;t t
+s,@build_vendor@,$build_vendor,;t t
+s,@build_os@,$build_os,;t t
+s,@host@,$host,;t t
+s,@host_cpu@,$host_cpu,;t t
+s,@host_vendor@,$host_vendor,;t t
+s,@host_os@,$host_os,;t t
+s,@target@,$target,;t t
+s,@target_cpu@,$target_cpu,;t t
+s,@target_vendor@,$target_vendor,;t t
+s,@target_os@,$target_os,;t t
+s,@GREP@,$GREP,;t t
+s,@FGREP@,$FGREP,;t t
+s,@CC@,$CC,;t t
+s,@CFLAGS@,$CFLAGS,;t t
+s,@LDFLAGS@,$LDFLAGS,;t t
+s,@CPPFLAGS@,$CPPFLAGS,;t t
+s,@ac_ct_CC@,$ac_ct_CC,;t t
+s,@EXEEXT@,$EXEEXT,;t t
+s,@OBJEXT@,$OBJEXT,;t t
+s,@EXTRA_CPPFLAGS@,$EXTRA_CPPFLAGS,;t t
+s,@CPP@,$CPP,;t t
+s,@EGREP@,$EGREP,;t t
+s,@AWK@,$AWK,;t t
+s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
+s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
+s,@INSTALL_DATA@,$INSTALL_DATA,;t t
+s,@LN_S@,$LN_S,;t t
+s,@INSTALL_OPT_S@,$INSTALL_OPT_S,;t t
+s,@INSTALL_OPT_O@,$INSTALL_OPT_O,;t t
+s,@PKG_CONFIG@,$PKG_CONFIG,;t t
+s,@ac_pt_PKG_CONFIG@,$ac_pt_PKG_CONFIG,;t t
+s,@PKG_CONFIG_LIBDIR@,$PKG_CONFIG_LIBDIR,;t t
+s,@SET_MAKE@,$SET_MAKE,;t t
+s,@MAKE_NO_PHONY@,$MAKE_NO_PHONY,;t t
+s,@MAKE_PHONY@,$MAKE_PHONY,;t t
+s,@CTAGS@,$CTAGS,;t t
+s,@ETAGS@,$ETAGS,;t t
+s,@MAKE_LOWER_TAGS@,$MAKE_LOWER_TAGS,;t t
+s,@MAKE_UPPER_TAGS@,$MAKE_UPPER_TAGS,;t t
+s,@cf_cv_makeflags@,$cf_cv_makeflags,;t t
+s,@RANLIB@,$RANLIB,;t t
+s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t
+s,@LD@,$LD,;t t
+s,@ac_ct_LD@,$ac_ct_LD,;t t
+s,@AR@,$AR,;t t
+s,@ac_ct_AR@,$ac_ct_AR,;t t
+s,@ARFLAGS@,$ARFLAGS,;t t
+s,@DESTDIR@,$DESTDIR,;t t
+s,@BUILD_CC@,$BUILD_CC,;t t
+s,@BUILD_CPP@,$BUILD_CPP,;t t
+s,@BUILD_CFLAGS@,$BUILD_CFLAGS,;t t
+s,@BUILD_CPPFLAGS@,$BUILD_CPPFLAGS,;t t
+s,@BUILD_LDFLAGS@,$BUILD_LDFLAGS,;t t
+s,@BUILD_LIBS@,$BUILD_LIBS,;t t
+s,@BUILD_EXEEXT@,$BUILD_EXEEXT,;t t
+s,@BUILD_OBJEXT@,$BUILD_OBJEXT,;t t
+s,@DFT_LWR_MODEL@,$DFT_LWR_MODEL,;t t
+s,@DFT_UPR_MODEL@,$DFT_UPR_MODEL,;t t
+s,@NCURSES_CONFIG@,$NCURSES_CONFIG,;t t
+s,@ac_ct_NCURSES_CONFIG@,$ac_ct_NCURSES_CONFIG,;t t
+s,@NCURSES_MAJOR@,$NCURSES_MAJOR,;t t
+s,@NCURSES_MINOR@,$NCURSES_MINOR,;t t
+s,@NCURSES_PATCH@,$NCURSES_PATCH,;t t
+s,@cf_cv_rel_version@,$cf_cv_rel_version,;t t
+s,@cf_cv_abi_version@,$cf_cv_abi_version,;t t
+s,@cf_cv_builtin_bool@,$cf_cv_builtin_bool,;t t
+s,@cf_cv_header_stdbool_h@,$cf_cv_header_stdbool_h,;t t
+s,@cf_cv_type_of_bool@,$cf_cv_type_of_bool,;t t
+s,@LIB_PREFIX@,$LIB_PREFIX,;t t
+s,@LIB_SUFFIX@,$LIB_SUFFIX,;t t
+s,@CC_G_OPT@,$CC_G_OPT,;t t
+s,@LD_MODEL@,$LD_MODEL,;t t
+s,@shlibdir@,$shlibdir,;t t
+s,@MAKE_DLLS@,$MAKE_DLLS,;t t
+s,@CC_SHARED_OPTS@,$CC_SHARED_OPTS,;t t
+s,@LD_RPATH_OPT@,$LD_RPATH_OPT,;t t
+s,@LD_SHARED_OPTS@,$LD_SHARED_OPTS,;t t
+s,@MK_SHARED_LIB@,$MK_SHARED_LIB,;t t
+s,@RM_SHARED_OPTS@,$RM_SHARED_OPTS,;t t
+s,@LINK_PROGS@,$LINK_PROGS,;t t
+s,@LINK_TESTS@,$LINK_TESTS,;t t
+s,@EXTRA_LDFLAGS@,$EXTRA_LDFLAGS,;t t
+s,@LOCAL_LDFLAGS@,$LOCAL_LDFLAGS,;t t
+s,@LOCAL_LDFLAGS2@,$LOCAL_LDFLAGS2,;t t
+s,@INSTALL_LIB@,$INSTALL_LIB,;t t
+s,@RPATH_LIST@,$RPATH_LIST,;t t
+s,@BROKEN_LINKER@,$BROKEN_LINKER,;t t
+s,@NCURSES_EXT_FUNCS@,$NCURSES_EXT_FUNCS,;t t
+s,@NCURSES_CONST@,$NCURSES_CONST,;t t
+s,@PTHREAD@,$PTHREAD,;t t
+s,@cf_cv_enable_reentrant@,$cf_cv_enable_reentrant,;t t
+s,@NCURSES_WRAP_PREFIX@,$NCURSES_WRAP_PREFIX,;t t
+s,@ECHO_LT@,$ECHO_LT,;t t
+s,@ECHO_LD@,$ECHO_LD,;t t
+s,@RULE_CC@,$RULE_CC,;t t
+s,@SHOW_CC@,$SHOW_CC,;t t
+s,@ECHO_CC@,$ECHO_CC,;t t
+s,@EXTRA_CFLAGS@,$EXTRA_CFLAGS,;t t
+s,@HAVE_STDNORETURN_H@,$HAVE_STDNORETURN_H,;t t
+s,@STDC_NORETURN@,$STDC_NORETURN,;t t
+s,@ADAFLAGS@,$ADAFLAGS,;t t
+s,@ADA_TRACE@,$ADA_TRACE,;t t
+s,@cf_TEMP_gnat@,$cf_TEMP_gnat,;t t
+s,@M4_exists@,$M4_exists,;t t
+s,@cf_ada_make@,$cf_ada_make,;t t
+s,@cf_ada_config@,$cf_ada_config,;t t
+s,@cf_ada_config_Ada@,$cf_ada_config_Ada,;t t
+s,@cf_ada_config_C@,$cf_ada_config_C,;t t
+s,@GNATPREP_OPTS@,$GNATPREP_OPTS,;t t
+s,@cf_compile_generics@,$cf_compile_generics,;t t
+s,@cf_generic_objects@,$cf_generic_objects,;t t
+s,@USE_GNAT_SIGINT@,$USE_GNAT_SIGINT,;t t
+s,@USE_OLD_MAKERULES@,$USE_OLD_MAKERULES,;t t
+s,@USE_GNAT_PROJECTS@,$USE_GNAT_PROJECTS,;t t
+s,@USE_GNAT_LIBRARIES@,$USE_GNAT_LIBRARIES,;t t
+s,@USE_GNAT_MAKE_GPR@,$USE_GNAT_MAKE_GPR,;t t
+s,@USE_GNAT_GPRBUILD@,$USE_GNAT_GPRBUILD,;t t
+s,@cf_ada_compiler@,$cf_ada_compiler,;t t
+s,@cf_ada_package@,$cf_ada_package,;t t
+s,@ADA_INCLUDE@,$ADA_INCLUDE,;t t
+s,@ADA_OBJECTS@,$ADA_OBJECTS,;t t
+s,@ADA_SHAREDLIB@,$ADA_SHAREDLIB,;t t
+s,@MAKE_ADA_SHAREDLIB@,$MAKE_ADA_SHAREDLIB,;t t
+s,@ADA_LIBNAME@,$ADA_LIBNAME,;t t
+s,@TINFO_LDFLAGS2@,$TINFO_LDFLAGS2,;t t
+s,@TINFO_LIBS@,$TINFO_LIBS,;t t
+s,@ACPPFLAGS@,$ACPPFLAGS,;t t
+s,@DFT_ARG_SUFFIX@,$DFT_ARG_SUFFIX,;t t
+s,@DFT_DEP_SUFFIX@,$DFT_DEP_SUFFIX,;t t
+s,@DFT_OBJ_SUBDIR@,$DFT_OBJ_SUBDIR,;t t
+s,@USE_ARG_SUFFIX@,$USE_ARG_SUFFIX,;t t
+s,@USE_LIB_SUFFIX@,$USE_LIB_SUFFIX,;t t
+s,@USE_CFG_SUFFIX@,$USE_CFG_SUFFIX,;t t
+s,@TEST_ARG2@,$TEST_ARG2,;t t
+s,@TEST_LIBS2@,$TEST_LIBS2,;t t
+s,@NCURSES_SHLIB2@,$NCURSES_SHLIB2,;t t
+s,@ADA_SUBDIRS@,$ADA_SUBDIRS,;t t
+s,@NCURSES_TREE@,$NCURSES_TREE,;t t
+s,@EXTERNAL_TREE@,$EXTERNAL_TREE,;t t
+s,@ADAHTML_DIR@,$ADAHTML_DIR,;t t
+s,@ADAGEN_LDFLAGS@,$ADAGEN_LDFLAGS,;t t
+CEOF
+
+EOF
+
+  cat >>"$CONFIG_STATUS" <<\EOF
+  # Split the substitutions into bite-sized pieces for seds with
+  # small command number limits, like on Digital OSF/1 and HP-UX.
+  ac_max_sed_lines=48
+  ac_sed_frag=1 # Number of current file.
+  ac_beg=1 # First line for current file.
+  ac_end=$ac_max_sed_lines # Line after last line for current file.
+  ac_more_lines=:
+  ac_sed_cmds=
+  while "$ac_more_lines"; do
+    if test "$ac_beg" -gt 1; then
+      sed "1,${ac_beg}d; ${ac_end}q" "$tmp"/subs.sed >"$tmp"/subs.frag
+    else
+      sed "${ac_end}q" "$tmp"/subs.sed >"$tmp"/subs.frag
+    fi
+    if test ! -s "$tmp"/subs.frag; then
+      ac_more_lines=false
+    else
+      # The purpose of the label and of the branching condition is to
+      # speed up the sed processing (if there are no `@' at all, there
+      # is no need to browse any of the substitutions).
+      # These are the two extra sed commands mentioned above.
+      (echo ':t
+  /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat "$tmp"/subs.frag) >"$tmp"/subs-$ac_sed_frag.sed
+      # It is possible to make a multiline substitution using escaped newlines.
+      # Ensure that we do not split the substitution between script fragments.
+      ac_BEG=$ac_end
+      ac_END=`expr "$ac_end" + "$ac_max_sed_lines"`
+      sed "1,${ac_BEG}d; ${ac_END}p; q" "$tmp"/subs.sed >"$tmp"/subs.next
+      if test -s "$tmp"/subs.next; then
+        grep '^s,@[^@,][^@,]*@,.*\\$' "$tmp"/subs.next >"$tmp"/subs.edit
+        if test ! -s "$tmp"/subs.edit; then
+          grep "^s,@[^@,][^@,]*@,.*,;t t$" "$tmp"/subs.next >"$tmp"/subs.edit
+          if test ! -s "$tmp"/subs.edit; then
+            if test "$ac_beg" -gt 1; then
+              ac_end=`expr "$ac_end" - 1`
+              continue
+            fi
+          fi
+        fi
+      fi
+
+      if test -z "$ac_sed_cmds"; then
+        ac_sed_cmds="sed -f \"$tmp\"/subs-$ac_sed_frag.sed"
+      else
+        ac_sed_cmds="$ac_sed_cmds | sed -f \"$tmp\"/subs-$ac_sed_frag.sed"
+      fi
+      ac_sed_frag=`expr "$ac_sed_frag" + 1`
+      ac_beg=$ac_end
+      ac_end=`expr "$ac_end" + "$ac_max_sed_lines"`
+    fi
+  done
+  if test -z "$ac_sed_cmds"; then
+    ac_sed_cmds="cat"
+  fi
+fi # test -n "$CONFIG_FILES"
+
+EOF
+cat >>"$CONFIG_STATUS" <<\EOF
+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case "$ac_file" in
+  - | *:- | *:-:* ) # input from stdin
+        cat >"$tmp"/stdin
+        ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+        ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+        ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  * )   ac_file_in=$ac_file.in ;;
+  esac
+
+  # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
+  ac_dir=`$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+         X"$ac_file" : 'X\(//\)[^/]' \| \
+         X"$ac_file" : 'X\(//\)$' \| \
+         X"$ac_file" : 'X\(/\)' \| \
+         .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+    { case "$ac_dir" in
+  [\\/]* | ?:[\\/]* ) as_incr_dir=;;
+  *)                      as_incr_dir=.;;
+esac
+as_dummy="$ac_dir"
+for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do
+  case $as_mkdir_dir in
+    # Skip DOS drivespec
+    ?:) as_incr_dir=$as_mkdir_dir ;;
+    *)
+      as_incr_dir=$as_incr_dir/$as_mkdir_dir
+      test -d "$as_incr_dir" || mkdir "$as_incr_dir"
+    ;;
+  esac
+done; }
+
+    ac_dir_suffix="/`echo "$ac_dir"|sed 's,^\./,,'`"
+    # A "../" for each directory in $ac_dir_suffix.
+    ac_dots=`echo "$ac_dir_suffix" | sed 's,/[^/]*,../,g'`
+  else
+    ac_dir_suffix= ac_dots=
+  fi
+
+  case "$srcdir" in
+  .)  ac_srcdir=.
+      if test -z "$ac_dots"; then
+         ac_top_srcdir=.
+      else
+         ac_top_srcdir=`echo "$ac_dots" | sed 's,/$,,'`
+      fi ;;
+  [\\/]* | ?:[\\/]* )
+      ac_srcdir="$srcdir$ac_dir_suffix";
+      ac_top_srcdir="$srcdir" ;;
+  *) # Relative path.
+    ac_srcdir="$ac_dots$srcdir$ac_dir_suffix"
+    ac_top_srcdir="$ac_dots$srcdir" ;;
+  esac
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_dots$INSTALL ;;
+  esac
+
+  if test x"$ac_file" != x-; then
+    { echo "$as_me:19118: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+    rm -f "$ac_file"
+  fi
+  # Let's still pretend it is `configure' which instantiates (i.e., don't
+  # use $as_me), people would be surprised to read:
+  #    /* config.h.  Generated automatically by config.status.  */
+  configure_input="Generated automatically from `echo $ac_file_in |
+                                                 sed 's,.*/,,'` by configure."
+
+  # First look for the input files in the build tree, otherwise in the
+  # src tree.
+  ac_file_inputs=`IFS=:
+    for f in $ac_file_in; do
+      case $f in
+      -) echo "$tmp"/stdin ;;
+      [\\/$]*)
+         # Absolute (can't be DOS-style, as IFS=:)
+         test -f "$f" || { { echo "$as_me:19136: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+         echo "$f";;
+      *) # Relative
+         if test -f "$f"; then
+           # Build tree
+           echo "$f"
+         elif test -f "$srcdir/$f"; then
+           # Source tree
+           echo "$srcdir/$f"
+         else
+           # /dev/null tree
+           { { echo "$as_me:19149: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+         fi;;
+      esac
+    done` || { (exit 1); exit 1; }
+EOF
+cat >>"$CONFIG_STATUS" <<\EOF
+  ac_warn_datarootdir=no
+  if test x"$ac_file" != x-; then
+    for ac_item in $ac_file_inputs
+    do
+      ac_seen=`grep '@\(datadir\|mandir\|infodir\)@' "$ac_item"`
+      if test -n "$ac_seen"; then
+        ac_used=`grep '@datarootdir@' "$ac_item"`
+        if test -z "$ac_used"; then
+          { echo "$as_me:19165: WARNING: datarootdir was used implicitly but not set:
+$ac_seen" >&5
+echo "$as_me: WARNING: datarootdir was used implicitly but not set:
+$ac_seen" >&2;}
+          ac_warn_datarootdir=yes
+        fi
+      fi
+      ac_seen=`grep '${datarootdir}' "$ac_item"`
+      if test -n "$ac_seen"; then
+        { echo "$as_me:19174: WARNING: datarootdir was used explicitly but not set:
+$ac_seen" >&5
+echo "$as_me: WARNING: datarootdir was used explicitly but not set:
+$ac_seen" >&2;}
+        ac_warn_datarootdir=yes
+      fi
+    done
+  fi
+
+if test "x$ac_warn_datarootdir" = xyes; then
+  ac_sed_cmds="$ac_sed_cmds | sed -e 's,@datarootdir@,\${prefix}/share,g' -e 's,\${datarootdir},\${prefix}/share,g'"
+fi
+
+EOF
+cat >>"$CONFIG_STATUS" <<EOF
+  sed "$ac_vpsub
+$extrasub
+EOF
+cat >>"$CONFIG_STATUS" <<\EOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s,@configure_input@,$configure_input,;t t
+s,@srcdir@,$ac_srcdir,;t t
+s,@top_srcdir@,$ac_top_srcdir,;t t
+s,@INSTALL@,$ac_INSTALL,;t t
+" $ac_file_inputs | (eval "$ac_sed_cmds") >"$tmp"/out
+  rm -f "$tmp"/stdin
+EOF
+: "${FGREP:=grep -F}"
+: "${EGREP:=grep -E}"
+cat >>"$CONFIG_STATUS" <<EOF
+  : "\${FGREP:=$FGREP}"
+  : "\${EGREP:=$EGREP}"
+EOF
+cat >>"$CONFIG_STATUS" <<\EOF
+  if test x"$ac_file" != x-; then
+    cp "$tmp/out" "$ac_file"
+
+    for ac_name in prefix exec_prefix datarootdir
+    do
+        ac_seen=`$FGREP -n '${'$ac_name'[:=].*}' "$ac_file"`
+        if test -n "$ac_seen"; then
+            ac_init=`$EGREP '[ 	]*'$ac_name'[ 	]*=' "$ac_file"`
+            if test -z "$ac_init"; then
+              ac_seen=`echo "$ac_seen" |sed -e 's,^,'"$ac_file"':,'`
+              { echo "$as_me:19219: WARNING: Variable $ac_name is used but was not set:
+$ac_seen" >&5
+echo "$as_me: WARNING: Variable $ac_name is used but was not set:
+$ac_seen" >&2;}
+            fi
+        fi
+    done
+    $EGREP -n '@[a-z_][a-z_0-9]+@' "$ac_file" >"$tmp"/out
+    $EGREP -n '@[A-Z_][A-Z_0-9]+@' "$ac_file" >>"$tmp"/out
+    if test -s "$tmp"/out; then
+      ac_seen=`sed -e 's,^,'"$ac_file"':,' < "$tmp"/out`
+      { echo "$as_me:19230: WARNING: Some variables may not be substituted:
+$ac_seen" >&5
+echo "$as_me: WARNING: Some variables may not be substituted:
+$ac_seen" >&2;}
+    fi
+  else
+    cat "$tmp"/out
+  fi
+  rm -f "$tmp"/out
+
+done
+EOF
+cat >>"$CONFIG_STATUS" <<\EOF
+
+#
+# CONFIG_HEADER section.
+#
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s,^\([ 	]*\)#\([ 	]*define[ 	][ 	]*\)'
+ac_dB='[ 	].*$,\1#\2'
+ac_dC=' '
+ac_dD=',;t'
+# ac_i turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
+ac_iA='s,^\([ 	]*\)#\([ 	]*\)undef\([ 	][ 	]*\)'
+ac_iB='\([ 	]\),\1#\2define\3'
+ac_iC=' '
+ac_iD='\4,;t'
+# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_uA='s,^\([ 	]*\)#\([ 	]*\)undef\([ 	][ 	]*\)'
+ac_uB='$,\1#\2define\3'
+ac_uC=' '
+ac_uD=',;t'
+
+for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case "$ac_file" in
+  - | *:- | *:-:* ) # input from stdin
+        cat >"$tmp"/stdin
+        ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+        ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+        ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  * )   ac_file_in=$ac_file.in ;;
+  esac
+
+  test x"$ac_file" != x- && { echo "$as_me:19279: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+
+  # First look for the input files in the build tree, otherwise in the
+  # src tree.
+  ac_file_inputs=`IFS=:
+    for f in $ac_file_in; do
+      case $f in
+      -) echo "$tmp"/stdin ;;
+      [\\/$]*)
+         # Absolute (can't be DOS-style, as IFS=:)
+         test -f "$f" || { { echo "$as_me:19290: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+         echo $f;;
+      *) # Relative
+         if test -f "$f"; then
+           # Build tree
+           echo $f
+         elif test -f "$srcdir/$f"; then
+           # Source tree
+           echo "$srcdir/$f"
+         else
+           # /dev/null tree
+           { { echo "$as_me:19303: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+         fi;;
+      esac
+    done` || { (exit 1); exit 1; }
+  # Remove the trailing spaces.
+  sed 's/[ 	]*$//' $ac_file_inputs >"$tmp"/in
+
+EOF
+
+# Transform confdefs.h into a list of #define's.  We won't use it as a sed
+# script, but as data to insert where we see @DEFS@.  We expect AC_SAVE_DEFS to
+# be either 'cat' or 'sort'.
+cat confdefs.h | uniq >conftest.vals
+
+# Break up conftest.vals because some shells have a limit on
+# the size of here documents, and old seds have small limits too.
+
+rm -f conftest.tail
+echo '  rm -f conftest.frag' >> "$CONFIG_STATUS"
+while grep . conftest.vals >/dev/null
+do
+  # Write chunks of a limited-size here document to conftest.frag.
+  echo '  cat >> conftest.frag <<CEOF' >> "$CONFIG_STATUS"
+  sed "${ac_max_here_lines}q" conftest.vals | sed -e 's/#ifdef.*/#if 0/' >> "$CONFIG_STATUS"
+  echo 'CEOF' >> "$CONFIG_STATUS"
+  sed "1,${ac_max_here_lines}d" conftest.vals > conftest.tail
+  rm -f conftest.vals
+  mv conftest.tail conftest.vals
+done
+rm -f conftest.vals
+
+# Run sed to substitute the contents of conftest.frag into $tmp/in at the
+# marker @DEFS@.
+echo '  cat >> conftest.edit <<CEOF
+/@DEFS@/r conftest.frag
+/@DEFS@/d
+CEOF
+sed -f conftest.edit "$tmp"/in > "$tmp"/out
+rm -f "$tmp"/in
+mv "$tmp"/out "$tmp"/in
+rm -f conftest.edit conftest.frag
+' >> "$CONFIG_STATUS"
+
+cat >>"$CONFIG_STATUS" <<\EOF
+  # Let's still pretend it is `configure' which instantiates (i.e., don't
+  # use $as_me), people would be surprised to read:
+  #    /* config.h.  Generated automatically by config.status.  */
+  if test x"$ac_file" = x-; then
+    echo "/* Generated automatically by configure.  */" >"$tmp"/config.h
+  else
+    echo "/* $ac_file.  Generated automatically by configure.  */" >"$tmp"/config.h
+  fi
+  cat "$tmp"/in >>"$tmp"/config.h
+  rm -f "$tmp"/in
+  if test x"$ac_file" != x-; then
+    if cmp -s "$ac_file" "$tmp/config.h" 2>/dev/null; then
+      { echo "$as_me:19361: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      ac_dir=`$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+         X"$ac_file" : 'X\(//\)[^/]' \| \
+         X"$ac_file" : 'X\(//\)$' \| \
+         X"$ac_file" : 'X\(/\)' \| \
+         .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+      if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+        { case "$ac_dir" in
+  [\\/]* | ?:[\\/]* ) as_incr_dir=;;
+  *)                      as_incr_dir=.;;
+esac
+as_dummy="$ac_dir"
+for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do
+  case $as_mkdir_dir in
+    # Skip DOS drivespec
+    ?:) as_incr_dir=$as_mkdir_dir ;;
+    *)
+      as_incr_dir=$as_incr_dir/$as_mkdir_dir
+      test -d "$as_incr_dir" || mkdir "$as_incr_dir"
+    ;;
+  esac
+done; }
+
+      fi
+      rm -f "$ac_file"
+      mv "$tmp/config.h" "$ac_file"
+    fi
+  else
+    cat "$tmp"/config.h
+    rm -f "$tmp"/config.h
+  fi
+done
+EOF
+cat >>"$CONFIG_STATUS" <<\EOF
+#
+# CONFIG_COMMANDS section.
+#
+for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
+  ac_dest=`echo "$ac_file" | sed 's,:.*,,'`
+  ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
+
+  case "$ac_dest" in
+    default )
+$AWK -v PACKAGE=$PACKAGE -f $srcdir/mk-pkg.awk </dev/null >> Makefile
+if test -z "$USE_OLD_MAKERULES" ; then
+	$AWK -f $srcdir/mk-1st.awk <$srcdir/src/modules >>src/Makefile
+fi
+ ;;
+  esac
+done
+EOF
+
+cat >>"$CONFIG_STATUS" <<\EOF
+
+{ (exit 0); exit 0; }
+EOF
+chmod +x "$CONFIG_STATUS"
+ac_clean_files=$ac_clean_files_save
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  exec 5>/dev/null
+  $SHELL "$CONFIG_STATUS" || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  "$ac_cs_success" || { (exit 1); exit 1; }
+fi
+${MAKE:-make} preinstall
diff --git a/Ada95/configure.in b/Ada95/configure.in
new file mode 100644
index 0000000..416bba1
--- /dev/null
+++ b/Ada95/configure.in
@@ -0,0 +1,626 @@
+dnl***************************************************************************
+dnl Copyright 2018-2021,2022 Thomas E. Dickey                                *
+dnl Copyright 2010-2016,2018 Free Software Foundation, Inc.                  *
+dnl                                                                          *
+dnl Permission is hereby granted, free of charge, to any person obtaining a  *
+dnl copy of this software and associated documentation files (the            *
+dnl "Software"), to deal in the Software without restriction, including      *
+dnl without limitation the rights to use, copy, modify, merge, publish,      *
+dnl distribute, distribute with modifications, sublicense, and/or sell       *
+dnl copies of the Software, and to permit persons to whom the Software is    *
+dnl furnished to do so, subject to the following conditions:                 *
+dnl                                                                          *
+dnl The above copyright notice and this permission notice shall be included  *
+dnl in all copies or substantial portions of the Software.                   *
+dnl                                                                          *
+dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
+dnl OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
+dnl MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
+dnl IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
+dnl DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
+dnl OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
+dnl THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
+dnl                                                                          *
+dnl Except as contained in this notice, the name(s) of the above copyright   *
+dnl holders shall not be used in advertising or otherwise to promote the     *
+dnl sale, use or other dealings in this Software without prior written       *
+dnl authorization.                                                           *
+dnl***************************************************************************
+dnl
+dnl Author: Thomas E. Dickey
+dnl
+dnl $Id: configure.in,v 1.88 2022/12/17 22:05:22 tom Exp $
+dnl Process this file with autoconf to produce a configure script.
+dnl
+dnl For additional information, see
+dnl     https://invisible-island.net/autoconf/
+dnl     https://invisible-island.net/autoconf/my-autoconf.html
+dnl
+dnl ---------------------------------------------------------------------------
+AC_PREREQ(2.52.20210509)
+AC_REVISION($Revision: 1.88 $)
+AC_INIT(gen/gen.c)
+AC_CONFIG_HEADER(include/ncurses_cfg.h:include/ncurses_cfg.hin)
+
+AC_DEFUN([AC_PATH_XTRA],[])dnl ignore dependencies on this
+
+PACKAGE="AdaCurses"		AC_SUBST(PACKAGE)
+
+CF_TOP_BUILDDIR
+
+CF_HELP_MESSAGE(General Options:)
+
+CF_WITH_SYSTYPE
+
+###	Save the given $CFLAGS to allow user-override.
+cf_user_CFLAGS="$CFLAGS"
+
+###	Default install-location
+CF_CFG_DEFAULTS
+
+###	Checks for programs.
+CF_PROG_CC(gnatgcc gcc cc)
+AC_PROG_CPP
+AC_PROG_GCC_TRADITIONAL
+CF_PROG_CC_C_O(CC,[$CFLAGS $CPPFLAGS])
+
+AC_ARG_PROGRAM
+
+CF_PROG_AWK
+CF_PROG_EGREP
+AC_PROG_INSTALL
+CF_PROG_LN_S
+
+CF_PROG_INSTALL
+CF_INSTALL_OPTS
+
+AC_SYS_LONG_FILE_NAMES
+
+# if we find pkg-config, check if we should install the ".pc" files.
+CF_PKG_CONFIG
+CF_WITH_PKG_CONFIG_LIBDIR
+
+AC_MSG_CHECKING(if you want to build test-programs)
+AC_ARG_WITH(tests,
+	[  --without-tests         suppress build with test-programs],
+	[cf_with_tests=$withval],
+	[cf_with_tests=yes])
+AC_MSG_RESULT($cf_with_tests)
+
+AC_MSG_CHECKING(if we should assume mixed-case filenames)
+AC_ARG_ENABLE(mixed-case,
+	[  --enable-mixed-case     tic should assume mixed-case filenames],
+	[enable_mixedcase=$enableval],
+	[enable_mixedcase=auto])
+AC_MSG_RESULT($enable_mixedcase)
+if test "$enable_mixedcase" = "auto" ; then
+	CF_MIXEDCASE_FILENAMES
+else
+	cf_cv_mixedcase=$enable_mixedcase
+	if test "$enable_mixedcase" = "yes" ; then
+		AC_DEFINE(MIXEDCASE_FILENAMES)
+	fi
+fi
+
+# do this after mixed-case option (tags/TAGS is not as important as tic).
+AC_PROG_MAKE_SET
+CF_MAKE_PHONY
+CF_MAKE_TAGS
+CF_MAKEFLAGS
+
+dnl These are standard among *NIX systems, but not when cross-compiling
+AC_CHECK_TOOL(RANLIB, ranlib, ':')
+AC_CHECK_TOOL(LD, ld, ld)
+AC_CHECK_TOOL(AR, ar, ar)
+CF_AR_FLAGS
+CF_PATHSEP
+
+dnl Special option for use by system-builders: the install-prefix is used to
+dnl adjust the location into which the actual install is done, so that an
+dnl archive can be built without modifying the host system's configuration.
+AC_MSG_CHECKING(if you have specified an install-prefix)
+AC_ARG_WITH(install-prefix,
+	[  --with-install-prefix   prefixes actual install-location ($DESTDIR)],
+	[case "$withval" in
+	(yes|no)
+		;;
+	(*)	DESTDIR="$withval"
+		;;
+	esac])
+AC_MSG_RESULT($DESTDIR)
+AC_SUBST(DESTDIR)
+
+###############################################################################
+CF_HELP_MESSAGE(Build-Tools Needed to Compile Temporary Applications for Cross-compiling:)
+# If we're cross-compiling, allow the user to override the tools and their
+# options.  The configure script is oriented toward identifying the host
+# compiler, etc., but we need a build compiler to generate parts of the source.
+CF_BUILD_CC
+
+###############################################################################
+CF_HELP_MESSAGE(Options to Specify the Libraries Built/Used:)
+
+### Options to allow the user to specify the set of libraries which are used.
+### Use "--without-normal --with-shared" to allow the default model to be
+### shared, for example.
+cf_list_models=""
+
+AC_MSG_CHECKING(if you want to build shared C-objects)
+AC_ARG_WITH(shared,
+	[  --with-shared           generate shared C-objects (needed for --with-ada-sharedlib)],
+	[with_shared=$withval],
+	[with_shared=no])
+AC_MSG_RESULT($with_shared)
+test "$with_shared" = "yes" && cf_list_models="$cf_list_models shared"
+
+AC_MSG_CHECKING(for specified models)
+test -z "$cf_list_models" && cf_list_models=normal
+AC_MSG_RESULT($cf_list_models)
+
+### Use the first model as the default, and save its suffix for use in building
+### up test-applications.
+AC_MSG_CHECKING(for default model)
+DFT_LWR_MODEL=`echo "$cf_list_models" | $AWK '{print $1}'`
+AC_MSG_RESULT($DFT_LWR_MODEL)
+
+CF_UPPER(DFT_UPR_MODEL,$DFT_LWR_MODEL)dnl
+
+AC_SUBST(DFT_LWR_MODEL)dnl	the default model ("normal")
+AC_SUBST(DFT_UPR_MODEL)dnl	the default model ("NORMAL")
+
+CF_NCURSES_ADDON
+
+CF_WITH_LIB_PREFIX(cf_prefix)
+
+LIB_SUFFIX=
+AC_SUBST(LIB_SUFFIX)
+
+###############################################################################
+
+dnl Not all ports of gcc support the -g option
+
+if test X"$CC_G_OPT" = X"" ; then
+	CC_G_OPT='-g'
+	test -n "$GCC" && test "${ac_cv_prog_cc_g}" != yes && CC_G_OPT=''
+fi
+AC_SUBST(CC_G_OPT)
+
+AC_MSG_CHECKING(for default loader flags)
+case $DFT_LWR_MODEL in
+(normal)  LD_MODEL=''   ;;
+(debug)   LD_MODEL=$CC_G_OPT ;;
+(profile) LD_MODEL='-pg';;
+(shared)  LD_MODEL=''   ;;
+esac
+AC_SUBST(LD_MODEL)dnl		the type of link (e.g., -g or -pg)
+AC_MSG_RESULT($LD_MODEL)
+
+CF_SHARED_OPTS
+
+# The test/sample programs in the original tree link using rpath option.
+# Make it optional for packagers.
+if test -n "$LOCAL_LDFLAGS"
+then
+	AC_MSG_CHECKING(if you want to link sample programs with rpath option)
+	AC_ARG_ENABLE(rpath-link,
+		[  --enable-rpath-link     link sample programs with rpath option],
+		[with_rpath_link=$enableval],
+		[with_rpath_link=yes])
+	AC_MSG_RESULT($with_rpath_link)
+	if test "$with_rpath_link" = no
+	then
+		LOCAL_LDFLAGS=
+		LOCAL_LDFLAGS2=
+	fi
+fi
+
+###############################################################################
+CF_HELP_MESSAGE(Fine-Tuning Your Configuration:)
+
+###   use option --enable-broken-linker to force on use of broken-linker support
+CF_ENABLE_BROKEN_LINKER
+
+# Check to define _XOPEN_SOURCE "automatically"
+CF_XOPEN_SOURCE(600)
+
+CF_LARGEFILE
+
+### Enable compiling-in rcs id's
+AC_MSG_CHECKING(if RCS identifiers should be compiled-in)
+AC_ARG_WITH(rcs-ids,
+	[  --with-rcs-ids          compile-in RCS identifiers],
+	[with_rcs_ids=$withval],
+	[with_rcs_ids=no])
+AC_MSG_RESULT($with_rcs_ids)
+test "$with_rcs_ids" = yes && AC_DEFINE(USE_RCS_IDS,1,[Define to 1 if RCS identifiers should be compiled-in)])
+
+###############################################################################
+CF_HELP_MESSAGE(Extensions:)
+
+### Note that some functions (such as const) are normally disabled anyway.
+AC_MSG_CHECKING(if you want to build with function extensions)
+AC_ARG_ENABLE(ext-funcs,
+	[  --disable-ext-funcs     disable function-extensions],
+	[with_ext_funcs=$enableval],
+	[with_ext_funcs=yes])
+AC_MSG_RESULT($with_ext_funcs)
+if test "$with_ext_funcs" = yes ; then
+	NCURSES_EXT_FUNCS=1
+	AC_DEFINE(HAVE_USE_DEFAULT_COLORS,1,[Define to 1 if we have use_default_colors function])
+	AC_DEFINE(NCURSES_EXT_FUNCS,1,[Define to 1 if we have ncurses extended functions])
+else
+	NCURSES_EXT_FUNCS=0
+fi
+AC_SUBST(NCURSES_EXT_FUNCS)
+
+###   use option --enable-const to turn on use of const beyond that in XSI.
+AC_MSG_CHECKING(for extended use of const keyword)
+AC_ARG_ENABLE(const,
+	[  --enable-const          compile with extra/non-standard const],
+	[with_ext_const=$enableval],
+	[with_ext_const=no])
+AC_MSG_RESULT($with_ext_const)
+NCURSES_CONST='/*nothing*/'
+if test "$with_ext_const" = yes ; then
+	NCURSES_CONST=const
+fi
+AC_SUBST(NCURSES_CONST)
+
+###############################################################################
+# These options are relatively safe to experiment with.
+CF_HELP_MESSAGE(Development Code:)
+AC_MSG_CHECKING(if you want all development code)
+AC_ARG_WITH(develop,
+	[  --without-develop       disable development options],
+	[with_develop=$withval],
+	[with_develop=no])
+AC_MSG_RESULT($with_develop)
+
+###############################################################################
+# These are just experimental, probably should not be in a package:
+CF_HELP_MESSAGE(Experimental Code:)
+
+# This is still experimental (20080329), but should ultimately be moved to
+# the script-block --with-normal, etc.
+CF_WITH_PTHREAD
+
+AC_MSG_CHECKING(if you want to use weak-symbols for pthreads)
+AC_ARG_ENABLE(weak-symbols,
+	[  --enable-weak-symbols   enable weak-symbols for pthreads],
+	[use_weak_symbols=$withval],
+	[use_weak_symbols=no])
+AC_MSG_RESULT($use_weak_symbols)
+if test "$use_weak_symbols" = yes ; then
+	CF_WEAK_SYMBOLS
+else
+	cf_cv_weak_symbols=no
+fi
+
+if test $cf_cv_weak_symbols = yes ; then
+	AC_DEFINE(USE_WEAK_SYMBOLS,1,[Define to 1 to enable weak-symbols for pthreads])
+fi
+
+PTHREAD=
+if test "$with_pthread" = "yes" ; then
+	AC_DEFINE(USE_PTHREADS,1,[Define to 1 to use the pthreads library])
+	enable_reentrant=yes
+	if test $cf_cv_weak_symbols = yes ; then
+		PTHREAD=-lpthread
+	fi
+fi
+AC_SUBST(PTHREAD)
+
+# OpenSUSE is installing ncurses6, using reentrant option.
+AC_CHECK_FUNC(_nc_TABSIZE,[assume_reentrant=yes], [assume_reentrant=no])
+
+# Reentrant code has to be opaque; there's little advantage to making ncurses
+# opaque outside of that, so there is no --enable-opaque option.  We can use
+# this option without --with-pthreads, but this will be always set for
+# pthreads.
+AC_MSG_CHECKING(if you want experimental reentrant code)
+AC_ARG_ENABLE(reentrant,
+	[  --enable-reentrant      compile with experimental reentrant code],
+	[with_reentrant=$enableval],
+	[with_reentrant=$assume_reentrant])
+AC_MSG_RESULT($with_reentrant)
+if test "$with_reentrant" = yes ; then
+	cf_cv_enable_reentrant=1
+	if test $cf_cv_weak_symbols = yes ; then
+		CF_REMOVE_LIB(LIBS,$LIBS,pthread)
+	elif test "$assume_reentrant" = no ; then
+		LIB_SUFFIX="t${LIB_SUFFIX}"
+	fi
+	AC_DEFINE(USE_REENTRANT,1,[Define to 1 to compile with experimental reentrant code])
+else
+	cf_cv_enable_reentrant=0
+fi
+AC_SUBST(cf_cv_enable_reentrant)
+
+### Allow using a different wrap-prefix
+if test "$cf_cv_enable_reentrant" != 0 || test "$BROKEN_LINKER" = 1 ; then
+	AC_MSG_CHECKING(for prefix used to wrap public variables)
+	AC_ARG_WITH(wrap-prefix,
+		[  --with-wrap-prefix=XXX  override prefix used for public variables],
+		[NCURSES_WRAP_PREFIX=$withval],
+		[NCURSES_WRAP_PREFIX=_nc_])
+	AC_MSG_RESULT($NCURSES_WRAP_PREFIX)
+else
+	NCURSES_WRAP_PREFIX=_nc_
+fi
+AC_SUBST(NCURSES_WRAP_PREFIX)
+AC_DEFINE_UNQUOTED(NCURSES_WRAP_PREFIX,"$NCURSES_WRAP_PREFIX",[Define to override _nc_ ncurses internal prefix])
+
+###############################################################################
+CF_HELP_MESSAGE(Testing/development Options:)
+
+###	use option --disable-echo to suppress full display compiling commands
+CF_DISABLE_ECHO
+
+CF_ENABLE_WARNINGS(Wno-unknown-pragmas Wswitch-enum,yes)
+if test "x$enable_warnings" = "xyes"; then
+ 	CF_ADD_ADAFLAGS(-gnatwa -gnatyg)
+fi
+
+###	use option --enable-assertions to turn on generation of assertion code
+AC_MSG_CHECKING(if you want to enable runtime assertions)
+AC_ARG_ENABLE(assertions,
+	[  --enable-assertions     test: turn on generation of assertion code],
+	[with_assertions=$enableval],
+	[with_assertions=no])
+AC_MSG_RESULT($with_assertions)
+if test -n "$GCC"
+then
+	if test "$with_assertions" = no
+	then
+		CPPFLAGS="$CPPFLAGS -DNDEBUG"
+	else
+		CF_ADD_ADAFLAGS(-gnata)
+	fi
+fi
+
+###	use option --disable-leaks to suppress "permanent" leaks, for testing
+AC_DEFINE(HAVE_NC_ALLOC_H,1,[Define to 1 if we have nc_alloc.h header])
+
+###	use option --enable-expanded to generate certain macros as functions
+AC_ARG_ENABLE(expanded,
+	[  --enable-expanded       test: generate functions for certain macros],
+	[test "$enableval" = yes && AC_DEFINE(NCURSES_EXPANDED,1,[Define to 1 if ncurses macros should be expanded as functions])])
+
+###	use option --disable-macros to suppress macros in favor of functions
+AC_ARG_ENABLE(macros,
+	[  --disable-macros        test: use functions rather than macros],
+	[test "$enableval" = no && AC_DEFINE(NCURSES_NOMACROS,1,[Define to 1 if ncurses macros should be expanded as functions])])
+
+# Normally we only add trace() to the debug-library.  Allow this to be
+# extended to all models of the ncurses library:
+cf_all_traces=no
+case "$CFLAGS $CPPFLAGS" in
+(*-DTRACE*)
+	cf_all_traces=yes
+	;;
+esac
+
+AC_MSG_CHECKING(whether to add trace feature to all models)
+AC_ARG_WITH(trace,
+[  --with-trace            test: add trace() function to all models of ncurses],
+[cf_with_trace=$withval],
+[cf_with_trace=$cf_all_traces])
+AC_MSG_RESULT($cf_with_trace)
+
+if test "$cf_with_trace" = yes ; then
+	ADA_TRACE=TRUE
+	CF_ADD_CFLAGS(-DTRACE)
+else
+	ADA_TRACE=FALSE
+fi
+
+AC_SUBST(ADA_TRACE)
+
+CF_DISABLE_GNAT_PROJECTS
+
+###	Checks for libraries.
+case $cf_cv_system_name in
+(*mingw32*)
+	CF_CHECK_LIBSSP
+	;;
+(*)
+AC_CHECK_FUNC(gettimeofday,
+	AC_DEFINE(HAVE_GETTIMEOFDAY),[
+
+AC_CHECK_LIB(bsd, gettimeofday,
+	AC_DEFINE(HAVE_GETTIMEOFDAY,1,[Define to 1 if we have gettimeofday])
+	LIBS="$LIBS -lbsd")])dnl CLIX: bzero, select, gettimeofday
+	;;
+esac
+
+###	Checks for header files.
+AC_CHECK_SIZEOF([signed char])
+AC_STDC_HEADERS
+AC_HEADER_DIRENT
+AC_HEADER_TIME
+
+###	checks for compiler characteristics
+AC_LANG_C
+AC_C_CONST
+
+###	Checks for external-data
+CF_LINK_DATAONLY
+
+###	Checks for library functions.
+CF_MKSTEMP
+
+dnl We'll do our own -g libraries, unless the user's overridden via $CFLAGS
+if test -z "$cf_user_CFLAGS" && test "$with_no_leaks" = no ; then
+	CF_STRIP_G_OPT(CFLAGS)
+	CF_STRIP_G_OPT(CXXFLAGS)
+fi
+
+CF_HELP_MESSAGE(Ada95 Binding Options:)
+cf_with_ada=yes
+dnl Check for availability of GNU Ada Translator (GNAT).
+dnl At the moment we support no other Ada95 compiler.
+if test "$cf_with_ada" != "no" ; then
+	CF_PROG_GNAT
+	if test	"$cf_cv_prog_gnat_correct" = yes; then
+		CF_FIXUP_ADAFLAGS
+
+		CF_GNATPREP_OPT_T
+
+		CF_GNAT_GENERICS
+		CF_GNAT_SIGINT
+		CF_GNAT_PROJECTS
+
+		CF_WITH_ADA_COMPILER
+
+		cf_ada_package=terminal_interface
+		AC_SUBST(cf_ada_package)
+
+		CF_WITH_ADA_INCLUDE
+		CF_WITH_ADA_OBJECTS
+		CF_WITH_ADA_SHAREDLIB
+
+		# allow the Ada binding to be renamed
+		CF_WITH_ADA_LIBNAME(AdaCurses)
+	else
+		AC_MSG_ERROR(No usable Ada compiler found)
+	fi
+else
+	AC_MSG_ERROR(The Ada compiler is needed for this package)
+fi
+
+################################################################################
+
+# not needed
+TINFO_LDFLAGS2=
+AC_SUBST(TINFO_LDFLAGS2)
+TINFO_LIBS=
+AC_SUBST(TINFO_LIBS)
+
+### Construct the list of include-directories to be generated
+CF_INCLUDE_DIRS
+CF_ADA_INCLUDE_DIRS
+
+### Build up pieces for makefile rules
+AC_MSG_CHECKING(default library suffix)
+CF_LIB_TYPE($DFT_LWR_MODEL,DFT_ARG_SUFFIX)dnl
+AC_SUBST(DFT_ARG_SUFFIX)dnl the string to append to "-lncurses" ("")
+AC_MSG_RESULT($DFT_ARG_SUFFIX)
+
+AC_MSG_CHECKING(default library-dependency suffix)
+CF_LIB_SUFFIX($DFT_LWR_MODEL,DFT_LIB_SUFFIX,DFT_DEP_SUFFIX)dnl
+AC_SUBST(DFT_DEP_SUFFIX)dnl the corresponding library-suffix (".a")
+AC_MSG_RESULT($DFT_DEP_SUFFIX)
+
+AC_MSG_CHECKING(default object directory)
+CF_OBJ_SUBDIR($DFT_LWR_MODEL,DFT_OBJ_SUBDIR)dnl
+AC_SUBST(DFT_OBJ_SUBDIR)dnl the default object-directory ("obj")
+AC_MSG_RESULT($DFT_OBJ_SUBDIR)
+
+### Set up low-level terminfo dependencies for makefiles.
+
+if test "$DFT_LWR_MODEL" = shared ; then
+	case $cf_cv_system_name in
+	(cygwin*)
+		# "lib" files have ".dll.a" suffix, "cyg" files have ".dll"
+		;;
+	(msys*)
+		# "lib" files have ".dll.a" suffix, "msys-" files have ".dll"
+		;;
+	esac
+fi
+
+USE_ARG_SUFFIX=${DFT_ARG_SUFFIX}
+AC_SUBST(USE_ARG_SUFFIX)
+
+USE_LIB_SUFFIX=${DFT_ARG_SUFFIX}
+AC_SUBST(USE_LIB_SUFFIX)
+
+USE_CFG_SUFFIX=${DFT_ARG_SUFFIX}
+AC_SUBST(USE_CFG_SUFFIX)
+
+### Construct the list of subdirectories for which we'll customize makefiles
+### with the appropriate compile-rules.
+
+SUB_MAKEFILES="gen/adacurses${USE_ARG_SUFFIX}-config:gen/adacurses-config.in"
+
+AC_DEFINE_UNQUOTED(NCURSES_PATHSEP,'$PATH_SEPARATOR',[Define to override ':' as the library path-separator])
+
+################################################################################
+
+TEST_ARG2=
+AC_SUBST(TEST_ARG2)
+
+TEST_LIBS2=
+AC_SUBST(TEST_LIBS2)
+
+dnl for separate build, this is good enough for "sh $(top_srcdir)/misc/shlib"
+NCURSES_SHLIB2="sh -c"
+AC_SUBST(NCURSES_SHLIB2)
+
+ADA_SUBDIRS="include gen src doc"
+if test "x$cf_with_tests" != "xno" ; then
+	ADA_SUBDIRS="$ADA_SUBDIRS samples"
+fi
+for cf_dir in $ADA_SUBDIRS
+do
+	SUB_MAKEFILES="$SUB_MAKEFILES $cf_dir/Makefile"
+done
+AC_SUBST(ADA_SUBDIRS)
+
+NCURSES_TREE="#"
+AC_SUBST(NCURSES_TREE)
+
+EXTERNAL_TREE=
+AC_SUBST(EXTERNAL_TREE)
+
+# match layout used by make-tar.sh
+ADAHTML_DIR=../doc/ada
+AC_SUBST(ADAHTML_DIR)
+
+if test "x$cross_compiling" = xyes ; then
+	ADAGEN_LDFLAGS='$(CROSS_LDFLAGS)'
+else
+	ADAGEN_LDFLAGS='$(NATIVE_LDFLAGS)'
+fi
+
+AC_SUBST(ADAGEN_LDFLAGS)
+
+AC_OUTPUT( \
+	$SUB_MAKEFILES \
+	src/library.gpr:src/library.gpr.in \
+	doc/adacurses${DFT_ARG_SUFFIX}-config.1:doc/MKada_config.in \
+	Makefile,[
+$AWK -v PACKAGE=$PACKAGE -f $srcdir/mk-pkg.awk </dev/null >> Makefile
+if test -z "$USE_OLD_MAKERULES" ; then
+	$AWK -f $srcdir/mk-1st.awk <$srcdir/src/modules >>src/Makefile
+fi
+],[
+### Special initialization commands, used to pass information from the
+### configuration-run into config.status
+
+AWK="$AWK"
+DFT_ARG_SUFFIX="$DFT_ARG_SUFFIX"
+DFT_LWR_MODEL="$DFT_LWR_MODEL"
+LIB_NAME="$LIB_NAME"
+LIB_PREFIX="$LIB_PREFIX"
+LIB_SUFFIX="$LIB_SUFFIX"
+LN_S="$LN_S"
+NCURSES_MAJOR="$NCURSES_MAJOR"
+NCURSES_MINOR="$NCURSES_MINOR"
+NCURSES_PATCH="$NCURSES_PATCH"
+PACKAGE="$PACKAGE"
+USE_OLD_MAKERULES="$USE_OLD_MAKERULES"
+cf_cv_VERSION_GNATMAKE=$cf_cv_VERSION_GNATMAKE
+cf_cv_VERSION_GPRBUILD=$cf_cv_VERSION_GPRBUILD
+cf_cv_abi_version="$cf_cv_abi_version"
+cf_cv_rel_version="$cf_cv_rel_version"
+cf_cv_rm_so_locs="$cf_cv_rm_so_locs"
+cf_cv_shared_soname='$cf_cv_shared_soname'
+cf_cv_shlib_version="$cf_cv_shlib_version"
+cf_cv_shlib_version_infix="$cf_cv_shlib_version_infix"
+cf_cv_system_name="$cf_cv_system_name"
+host="$host"
+target="$target"
+
+],cat)dnl
+${MAKE:-make} preinstall
diff --git a/Ada95/doc/Makefile.in b/Ada95/doc/Makefile.in
new file mode 100644
index 0000000..0aed33f
--- /dev/null
+++ b/Ada95/doc/Makefile.in
@@ -0,0 +1,100 @@
+# $Id: Makefile.in,v 1.9 2021/07/03 15:45:33 tom Exp $
+##############################################################################
+# Copyright 2019-2020,2021 Thomas E. Dickey                                  #
+# Copyright 2011-2015,2018 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey
+#
+# Makefile for AdaCurses manual pages.
+
+SHELL		= @SHELL@
+VPATH		= @srcdir@
+
+DESTDIR		= @DESTDIR@
+srcdir		= @srcdir@
+prefix		= @prefix@
+exec_prefix	= @exec_prefix@
+datarootdir	= @datarootdir@
+datadir		= @datadir@
+mandir		= @mandir@
+
+INSTALL		= @INSTALL@ @INSTALL_OPT_O@
+INSTALL_DATA	= @INSTALL_DATA@
+
+DFT_ARG_SUFFIX	= @DFT_ARG_SUFFIX@
+
+THIS		= @ADA_LIBNAME@
+DOCDIR		= $(DESTDIR)$(datadir)/doc/$(THIS)
+MANDIR		= $(DESTDIR)$(mandir)/man1
+
+################################################################################
+
+@MAKE_PHONY@.PHONY :	all
+@MAKE_PHONY@.PHONY :	check
+@MAKE_PHONY@.PHONY :	clean
+@MAKE_PHONY@.PHONY :	distclean
+@MAKE_PHONY@.PHONY :	install
+@MAKE_PHONY@.PHONY :	install.html
+@MAKE_PHONY@.PHONY :	install.man
+@MAKE_PHONY@.PHONY :	libs
+@MAKE_PHONY@.PHONY :	lint
+@MAKE_PHONY@.PHONY :	mostlyclean
+@MAKE_PHONY@.PHONY :	realclean
+@MAKE_PHONY@.PHONY :	sources
+@MAKE_PHONY@.PHONY :	uninstall
+@MAKE_PHONY@.PHONY :	uninstall.html
+@MAKE_PHONY@.PHONY :	uninstall.man
+
+all \
+sources \
+tags :
+
+$(DOCDIR) \
+$(MANDIR) :
+	mkdir -p $@
+
+install install.man : $(MANDIR)
+	$(INSTALL_DATA) adacurses${DFT_ARG_SUFFIX}-config.1 $(MANDIR)
+
+uninstall uninstall.man :
+	-rm -f $(MANDIR)/adacurses${DFT_ARG_SUFFIX}-config.1
+
+# HTML documentation is optional, usually in a separate package.
+install.html : $(DOCDIR)
+	( cd $(srcdir) && tar -cf - *.htm* ada | tar -C $(DOCDIR) -xf - )
+
+uninstall.html :
+	-rm -rf $(DOCDIR)
+
+mostlyclean :
+	-rm -f core tags TAGS *~ *.bak *.ln *.atac trace
+
+clean:	mostlyclean
+
+distclean realclean: clean
+	-rm -f Makefile *-config.1
diff --git a/Ada95/gen/Makefile.in b/Ada95/gen/Makefile.in
new file mode 100644
index 0000000..0533137
--- /dev/null
+++ b/Ada95/gen/Makefile.in
@@ -0,0 +1,368 @@
+##############################################################################
+# Copyright 2019-2021,2022 Thomas E. Dickey                                  #
+# Copyright 1998-2015,2018 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.                                                             #
+##############################################################################
+#
+#  Author:  Juergen Pfeifer, 1996
+#     and:  Thomas E. Dickey, 1997
+#
+#  $Id: Makefile.in,v 1.101 2022/12/03 19:45:12 Nicolas.Boulenguez Exp $
+#
+.SUFFIXES:
+
+SHELL		= @SHELL@
+VPATH		= @srcdir@
+THIS		= Makefile
+
+x		= @EXEEXT@
+
+top_srcdir	= @top_srcdir@
+DESTDIR		= @DESTDIR@
+srcdir		= @srcdir@
+prefix		= @prefix@
+exec_prefix	= @exec_prefix@
+bindir		= @bindir@
+includedir	= @includedir@
+
+INSTALL		= @INSTALL@ @INSTALL_OPT_O@
+INSTALL_SCRIPT	= @INSTALL_SCRIPT@
+INSTALL_DATA	= @INSTALL_DATA@
+
+AWK		= @AWK@
+LN_S		= @LN_S@
+
+CC		= @CC@
+HOST_CC		= @BUILD_CC@
+
+CFLAGS		= @CFLAGS@ @EXTRA_CFLAGS@
+HOST_CFLAGS	= @BUILD_CFLAGS@
+
+CPPFLAGS	= @CPPFLAGS@
+HOST_CPPFLAGS	= @ACPPFLAGS@ @BUILD_CPPFLAGS@ \
+		  -DHAVE_CONFIG_H -I$(srcdir)
+
+CCFLAGS		= $(HOST_CPPFLAGS) $(HOST_CFLAGS)
+CFLAGS_NORMAL	= $(CCFLAGS) -DNCURSES_STATIC
+CFLAGS_DEBUG	= $(CCFLAGS) -DNCURSES_STATIC @CC_G_OPT@ -DTRACE
+CFLAGS_PROFILE	= $(CCFLAGS) -DNCURSES_STATIC -pg
+CFLAGS_SHARED	= $(CCFLAGS) @CC_SHARED_OPTS@
+
+CFLAGS_DEFAULT	= $(CFLAGS_@DFT_UPR_MODEL@)
+
+REL_VERSION	= @cf_cv_rel_version@
+ABI_VERSION	= @cf_cv_abi_version@
+LOCAL_LIBDIR	= @top_builddir@/lib
+
+LINK		= $(HOST_CC)
+LDFLAGS		= @LDFLAGS@
+LIBS		= @LIBS@
+
+# For the wide-character configuration combined with broken_linker, we need
+# addresses of ACS_xxx constants, which requires linking with the newly built
+# ncurses library.  If cross-compiling, the developer has to fill in a workable
+# native library for this purpose.
+NATIVE_LDFLAGS	= @LD_MODEL@ $(LOCAL_LIBS) @TINFO_LDFLAGS2@ $(LDFLAGS) @LIBS@ @LOCAL_LDFLAGS2@ $(LDFLAGS) @TINFO_LIBS@
+CROSS_LDFLAGS	= @BUILD_LDFLAGS@ @BUILD_LIBS@
+
+ACTUAL_LDFLAGS	= @ADAGEN_LDFLAGS@
+
+RANLIB		= @RANLIB@
+
+M4		= m4
+M4FLAGS		= -DNCURSES_EXT_FUNCS=@NCURSES_EXT_FUNCS@
+
+ADACURSES_CONFIG = adacurses@USE_CFG_SUFFIX@-config
+
+WRAPPER		= @NCURSES_SHLIB2@
+
+PROG_GENERATE	= ./generate$x
+GENERATE	= $(PROG_GENERATE) '@USE_ARG_SUFFIX@'
+DEL_ADAMODE	= sed -e '/^\-\-\ \ \-\*\-\ ada\ \-\*\-.*/d'
+
+GNATHTML	= `command -v gnathtml || command -v gnathtml.pl`
+
+################################################################################
+ALIB            = @cf_ada_package@
+ABASE		= $(ALIB)-curses
+
+ADA_SRCDIR	= ../src
+
+GEN_TARGETS     = $(ADA_SRCDIR)/$(ABASE).ads         			\
+		  $(ADA_SRCDIR)/$(ABASE).adb         			\
+	          $(ADA_SRCDIR)/$(ABASE)-aux.ads   			\
+	          $(ADA_SRCDIR)/$(ABASE)-trace.ads   			\
+	          $(ADA_SRCDIR)/$(ABASE)-menus.ads   			\
+	          $(ADA_SRCDIR)/$(ABASE)-forms.ads   			\
+	          $(ADA_SRCDIR)/$(ABASE)-mouse.ads 			\
+	          $(ADA_SRCDIR)/$(ABASE)-panels.ads			\
+	          $(ADA_SRCDIR)/$(ABASE)-menus-menu_user_data.ads	\
+	          $(ADA_SRCDIR)/$(ABASE)-menus-item_user_data.ads	\
+	          $(ADA_SRCDIR)/$(ABASE)-forms-form_user_data.ads	\
+	          $(ADA_SRCDIR)/$(ABASE)-forms-field_types.ads		\
+	          $(ADA_SRCDIR)/$(ABASE)-forms-field_user_data.ads	\
+	          $(ADA_SRCDIR)/$(ABASE)-panels-user_data.ads           \
+                  $(ADA_SRCDIR)/$(ABASE)_constants.ads
+
+GEN_SRC		= $(srcdir)/$(ABASE).ads.m4				\
+		  $(srcdir)/$(ABASE).adb.m4				\
+	          $(srcdir)/$(ABASE)-aux.ads.m4 	  		\
+	          $(srcdir)/$(ABASE)-trace.ads.m4 	  		\
+	          $(srcdir)/$(ABASE)-menus.ads.m4 	  		\
+	          $(srcdir)/$(ABASE)-forms.ads.m4   			\
+	          $(srcdir)/$(ABASE)-mouse.ads.m4			\
+	          $(srcdir)/$(ABASE)-panels.ads.m4			\
+	          $(srcdir)/$(ABASE)-menus-menu_user_data.ads.m4	\
+	          $(srcdir)/$(ABASE)-menus-item_user_data.ads.m4	\
+	          $(srcdir)/$(ABASE)-forms-form_user_data.ads.m4	\
+	          $(srcdir)/$(ABASE)-forms-field_types.ads.m4		\
+	          $(srcdir)/$(ABASE)-forms-field_user_data.ads.m4	\
+	          $(srcdir)/$(ABASE)-panels-user_data.ads.m4
+
+################################################################################
+
+@MAKE_PHONY@.PHONY :	all
+@MAKE_PHONY@.PHONY :	clean
+@MAKE_PHONY@.PHONY :	distclean
+@MAKE_PHONY@.PHONY :	install
+@MAKE_PHONY@.PHONY :	install.libs
+@MAKE_PHONY@.PHONY :	libs
+@MAKE_PHONY@.PHONY :	mostlyclean
+@MAKE_PHONY@.PHONY :	realclean
+@MAKE_PHONY@.PHONY :	sources
+@MAKE_PHONY@.PHONY :	uninstall
+@MAKE_PHONY@.PHONY :	uninstall.libs
+
+all \
+libs :	$(GEN_TARGETS)
+	@echo made $@
+
+sources:
+
+$(DESTDIR)$(bindir) :
+	mkdir -p $@
+
+install \
+install.libs :: $(DESTDIR)$(bindir) $(ADACURSES_CONFIG)
+	$(INSTALL_SCRIPT) $(ADACURSES_CONFIG) $(DESTDIR)$(bindir)/$(ADACURSES_CONFIG)
+
+uninstall \
+uninstall.libs ::
+	-rm -f $(DESTDIR)$(bindir)/$(ADACURSES_CONFIG)
+
+$(PROG_GENERATE):  gen.o
+	@ECHO_LD@ $(LINK) $(CFLAGS_NORMAL) gen.o $(ACTUAL_LDFLAGS) -o $@
+
+gen.o:	$(srcdir)/gen.c
+	$(HOST_CC) $(CFLAGS_NORMAL) -c -o $@ $(srcdir)/gen.c
+
+$(ADA_SRCDIR)/$(ABASE)_constants.ads: $(PROG_GENERATE)
+	$(WRAPPER) "$(GENERATE) $@"
+################################################################################
+$(ADA_SRCDIR)/$(ABASE).ads: 	$(srcdir)/$(ABASE).ads.m4 \
+				$(srcdir)/normal.m4
+	$(M4) $(M4FLAGS) -DM4MACRO=$(srcdir)/normal.m4 \
+	$(srcdir)/$(ABASE).ads.m4 |\
+	$(DEL_ADAMODE) >$@
+
+$(ADA_SRCDIR)/$(ABASE).adb: 	$(srcdir)/$(ABASE).adb.m4 \
+				$(srcdir)/normal.m4
+	$(M4) $(M4FLAGS) -DM4MACRO=$(srcdir)/normal.m4 \
+	$(srcdir)/$(ABASE).adb.m4 |\
+	$(DEL_ADAMODE) >$@
+
+$(ADA_SRCDIR)/$(ABASE)-aux.ads: $(srcdir)/$(ABASE)-aux.ads.m4 \
+				$(srcdir)/normal.m4
+	$(M4) $(M4FLAGS) -DM4MACRO=$(srcdir)/normal.m4 \
+	$(srcdir)/$(ABASE)-aux.ads.m4 |\
+	$(DEL_ADAMODE) >$@
+
+$(ADA_SRCDIR)/$(ABASE)-trace.ads: $(srcdir)/$(ABASE)-trace.ads.m4 \
+				  $(srcdir)/normal.m4
+	$(M4) $(M4FLAGS) -DM4MACRO=$(srcdir)/normal.m4 \
+	$(srcdir)/$(ABASE)-trace.ads.m4 |\
+	$(DEL_ADAMODE) >$@
+
+$(ADA_SRCDIR)/$(ABASE)-menus.ads: $(srcdir)/$(ABASE)-menus.ads.m4 \
+				  $(srcdir)/normal.m4
+	$(M4) $(M4FLAGS) -DM4MACRO=$(srcdir)/normal.m4 \
+	$(srcdir)/$(ABASE)-menus.ads.m4 |\
+	$(DEL_ADAMODE) >$@
+
+$(ADA_SRCDIR)/$(ABASE)-forms.ads: $(srcdir)/$(ABASE)-forms.ads.m4 \
+				  $(srcdir)/normal.m4
+	$(M4) $(M4FLAGS) -DM4MACRO=$(srcdir)/normal.m4 \
+	$(srcdir)/$(ABASE)-forms.ads.m4 |\
+	$(DEL_ADAMODE) >$@
+
+$(ADA_SRCDIR)/$(ABASE)-mouse.ads: $(srcdir)/$(ABASE)-mouse.ads.m4 \
+				  $(srcdir)/normal.m4
+	$(M4) $(M4FLAGS) -DM4MACRO=$(srcdir)/normal.m4 \
+	$(srcdir)/$(ABASE)-mouse.ads.m4 |\
+	$(DEL_ADAMODE) >$@
+
+$(ADA_SRCDIR)/$(ABASE)-panels.ads: $(srcdir)/$(ABASE)-panels.ads.m4 \
+				   $(srcdir)/normal.m4
+	$(M4) $(M4FLAGS) -DM4MACRO=$(srcdir)/normal.m4 \
+	$(srcdir)/$(ABASE)-panels.ads.m4 |\
+	$(DEL_ADAMODE) >$@
+
+$(ADA_SRCDIR)/$(ABASE)-menus-menu_user_data.ads: \
+		$(srcdir)/$(ABASE)-menus-menu_user_data.ads.m4 \
+		$(srcdir)/normal.m4
+	$(M4) $(M4FLAGS) -DM4MACRO=$(srcdir)/normal.m4 \
+	$(srcdir)/$(ABASE)-menus-menu_user_data.ads.m4 |\
+	$(DEL_ADAMODE) >$@
+
+$(ADA_SRCDIR)/$(ABASE)-menus-item_user_data.ads: \
+		$(srcdir)/$(ABASE)-menus-item_user_data.ads.m4 \
+		$(srcdir)/normal.m4
+	$(M4) $(M4FLAGS) -DM4MACRO=$(srcdir)/normal.m4 \
+	$(srcdir)/$(ABASE)-menus-item_user_data.ads.m4 |\
+	$(DEL_ADAMODE) >$@
+
+$(ADA_SRCDIR)/$(ABASE)-forms-form_user_data.ads: \
+		$(srcdir)/$(ABASE)-forms-form_user_data.ads.m4 \
+		$(srcdir)/normal.m4
+	$(M4) $(M4FLAGS) -DM4MACRO=$(srcdir)/normal.m4 \
+	$(srcdir)/$(ABASE)-forms-form_user_data.ads.m4 |\
+	$(DEL_ADAMODE) >$@
+
+$(ADA_SRCDIR)/$(ABASE)-forms-field_types.ads: \
+		$(srcdir)/$(ABASE)-forms-field_types.ads.m4 \
+		$(srcdir)/normal.m4
+	$(M4) $(M4FLAGS) -DM4MACRO=$(srcdir)/normal.m4 \
+	$(srcdir)/$(ABASE)-forms-field_types.ads.m4 |\
+	$(DEL_ADAMODE) >$@
+
+$(ADA_SRCDIR)/$(ABASE)-forms-field_user_data.ads: \
+		$(srcdir)/$(ABASE)-forms-field_user_data.ads.m4 \
+		$(srcdir)/normal.m4
+	$(M4) $(M4FLAGS) -DM4MACRO=$(srcdir)/normal.m4 \
+	$(srcdir)/$(ABASE)-forms-field_user_data.ads.m4 |\
+	$(DEL_ADAMODE) >$@
+
+$(ADA_SRCDIR)/$(ABASE)-panels-user_data.ads: \
+		$(srcdir)/$(ABASE)-panels-user_data.ads.m4 \
+		$(srcdir)/normal.m4
+	$(M4) $(M4FLAGS) -DM4MACRO=$(srcdir)/normal.m4 \
+	$(srcdir)/$(ABASE)-panels-user_data.ads.m4 |\
+	$(DEL_ADAMODE) >$@
+
+install.progs ::
+
+tags:
+	ctags *.[ch]
+
+@MAKE_UPPER_TAGS@TAGS:
+@MAKE_UPPER_TAGS@	etags *.[ch]
+
+mostlyclean ::
+	-rm -f a.out core $(PROG_GENERATE) *.o
+
+clean :: mostlyclean
+	-rm -f $(GEN_TARGETS) instab.tmp *.ad[bs] *.html *.ali *.tmp
+
+distclean :: clean
+	-rm -f $(ADACURSES_CONFIG)
+	-rm -f Makefile
+
+realclean :: distclean
+
+HTML_DIR = @ADAHTML_DIR@
+
+instab.tmp : table.m4 $(GEN_SRC)
+	@rm -f $@
+	@for f in $(GEN_SRC) ; do \
+	  $(M4) $(M4FLAGS) -DM4MACRO=table.m4 $$f | $(DEL_ADAMODE) >> $@ ;\
+	done;
+
+TABLE_TITLE=Correspondence between ncurses C and Ada functions
+
+$(HTML_DIR)/table.html : instab.tmp
+	@-touch $@
+	@-chmod +w $@
+	@echo '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">' > $@
+	@echo '<html>' >> $@
+	@echo '<head>' >> $@
+	@echo '<title>$(TABLE_TITLE)</title>' >>$@
+	@echo '</head>' >> $@
+	@echo '<body>' >> $@
+	@echo '<h1>$(TABLE_TITLE)</h1>' >>$@
+	@echo '<h2>Sorted by C function name</h2>' >>$@
+	@echo '<table align="center" border summary="$(TABLE_TITLE)">' >>$@
+	@echo '<tr align="left">' >>$@
+	@echo '<th>C name</th><th>Ada name</th><th>man page</th></tr>' >>$@
+	@sort < instab.tmp >> $@
+	@echo '</table></body></html>' >>$@
+	@rm -f instab.tmp
+
+adahtml:
+	test -n "$(GNATHTML)" || exit 1
+	@find $(HTML_DIR) -type f -exec rm -f {} \;
+	@mkdir -p $(HTML_DIR)
+	( cp -p ../src/*.ad[sb] . && chmod +w *.ad[sb] )
+@USE_OLD_MAKERULES@	ln -sf ../src/*.ali .
+@USE_GNAT_PROJECTS@	ln -sf ../static-ali/*.ali .
+	@echo "Filtering generated files"
+	@for f in $(GEN_SRC); do \
+	   h=`basename $$f` ;\
+	   g=`basename $$f .ads.m4` ;\
+	   if test "$$g" != "$$h" ; then \
+	      $(M4) $(M4FLAGS) -DM4MACRO=html.m4 $$f | $(DEL_ADAMODE) > $$g.ads ;\
+	      echo "... $$g.ads" ;\
+	   fi \
+	done
+	@-rm -f $(HTML_DIR)/$(ALIB)*.htm*
+	$(GNATHTML) -d -f $(ALIB)*.ads
+	for f in html/$(ALIB)*.htm*; do \
+	   a=`basename $$f` ; \
+	   sed -e 's/You may also.*body.*//' <$$f |\
+	   sed -e 's%\<GNAT\>%<strong>GNAT</strong>%g' |\
+	   sed -e 's%&lt;A HREF%<A HREF%g' |\
+	   sed -e 's%"&gt;%">%g' |\
+	   sed -e 's%#1A\([[:space:]]*NAME="[^"]*"\)#2%<A\1>%' |\
+	   sed -e 's%#1/A#2%</A>%' |\
+	   sed -e 's/3X/3x/g' |\
+	   sed -e 's/$$\([ABCDEFGHIJKLMNOPQRSTUVWXZabcdefghijklmnopqrstuvwxz0123456789_]*:.*\)\$$/@\1@/' |\
+	   sed -e 's%&lt;/A&gt;%</A>%g' > $$a.tmp ;\
+	   mv $$a.tmp $$f ;\
+	done
+	@rm -f *.ad[sb] *.ali *.tmp
+	@for f in funcs.htm main.htm ; do \
+	  sed -e "\%<A HREF=funcs/ .htm>\[ \]</A>%d" < html/$$f > $$f ;\
+	  mv $$f html/$$f ;\
+	done
+	@rm -f "html/funcs/ .htm"
+	@cp -pdrf html/* $(HTML_DIR)/
+	@rm -rf html
+
+html : adahtml $(HTML_DIR)/table.html
+	@echo made $@
+
+###############################################################################
+# The remainder of this file is automatically generated during configuration
+###############################################################################
diff --git a/Ada95/gen/adacurses-config.in b/Ada95/gen/adacurses-config.in
new file mode 100644
index 0000000..a539417
--- /dev/null
+++ b/Ada95/gen/adacurses-config.in
@@ -0,0 +1,83 @@
+#! /bin/sh
+# $Id: adacurses-config.in,v 1.15 2022/07/16 21:16:43 tom Exp $
+##############################################################################
+# Copyright 2019-2020,2022 Thomas E. Dickey                                  #
+# Copyright 2007-2014,2016 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.                                                             #
+##############################################################################
+#
+# This script returns the options to add to `gnatmake' for using AdaCurses.
+
+DESTDIR=@DESTDIR@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+
+ADA_INCLUDE=@ADA_INCLUDE@
+ADA_OBJECTS=@ADA_OBJECTS@
+
+VERSION=@NCURSES_MAJOR@.@NCURSES_MINOR@.@NCURSES_PATCH@
+
+CFLAGS="-aI$ADA_INCLUDE -aO$ADA_OBJECTS"
+LIBS="-L$ADA_OBJECTS -l@ADA_LIBNAME@"
+
+THIS="@ADA_LIBNAME@"
+THIS_CFG="${THIS}@DFT_ARG_SUFFIX@-config"
+
+case "x$1" in
+	x--version)
+		echo @ADA_LIBNAME@ $VERSION
+		;;
+	x--cflags)
+		echo "$CFLAGS"
+		;;
+	x--libs)
+		echo "$LIBS"
+		;;
+	x)
+		# if no parameter is given, give what gnatmake needs
+		echo "$CFLAGS -largs $LIBS"
+		;;
+	x--help)
+		cat <<ENDHELP
+Usage: ${THIS_CFG} [options]
+
+Options:
+  --cflags           echos the gnat (Ada compiler) flags needed to compile with ${THIS}
+  --libs             echos the gnat libraries needed to link with ${THIS}
+
+  --version          echos the release+patchdate version of ${THIS}
+
+  --help             prints this message
+
+If no options are given, echos the full set of flags needed by gnatmake.
+ENDHELP
+		;;
+	*)
+		echo "Usage: ${THIS_CFG} [--version | --cflags | --libs]" >&2
+		exit 1
+		;;
+esac
diff --git a/Ada95/gen/gen.c b/Ada95/gen/gen.c
new file mode 100644
index 0000000..d92fa68
--- /dev/null
+++ b/Ada95/gen/gen.c
@@ -0,0 +1,580 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2014,2016 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1996                                         *
+ *      and:  Thomas E. Dickey, 1998                                        *
+ *      and:  Nicolas Boulenguez, 2011                                      *
+ ****************************************************************************/
+
+/*
+    Version Control
+    $Id: gen.c,v 1.78 2021/12/11 21:03:21 tom Exp $
+  --------------------------------------------------------------------------*/
+/*
+  This program prints on its standard output the source for the
+  Terminal_Interface.Curses_Constants Ada package specification. This pure
+  package only exports C constants to the Ada compiler.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <ncurses_cfg.h>
+#else
+#include <ncurses.h>
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#include <menu.h>
+#include <form.h>
+
+#undef UCHAR
+#undef UINT
+#undef ULONG
+
+typedef unsigned char UCHAR;
+typedef unsigned int UINT;
+typedef unsigned long ULONG;
+
+/* These global variables will be set by main () */
+static int little_endian;
+static const char *my_program_invocation_name = NULL;
+
+static void
+my_error(const char *message)
+{
+  fprintf(stderr, "%s: %s\n", my_program_invocation_name, message);
+  exit(EXIT_FAILURE);
+}
+
+static void
+print_constant(FILE * fp,
+	       const char *name,
+	       UINT value)
+{
+  fprintf(fp, "   %-28s : constant := %u;\n", name, value);
+}
+
+static void
+print_long_val(FILE * fp,
+	       const char *name,
+	       long value)
+{
+  fprintf(fp, "   %-28s : constant := %ld;\n", name, value);
+}
+
+static void
+print_size_of(FILE * fp,
+	      const char *name,
+	      size_t value)
+{
+  fprintf(fp, "   %-28s : constant := %lu;\n", name, (unsigned long)value);
+}
+
+#define PRINT_NAMED_CONSTANT(name) \
+  print_long_val (fp, #name, name)
+
+static void
+print_comment(FILE * fp, const char *message)
+{
+  fprintf(fp, "\n   --  %s\n\n", message);
+}
+
+/*
+ * Make sure that KEY_MIN and KEY_MAX are defined.
+ * main () will protest if KEY_MIN == 256
+ */
+#ifndef KEY_MAX
+#  define KEY_MAX 0777
+#endif
+#ifndef KEY_MIN
+#  define KEY_MIN 0401
+#endif
+
+static UCHAR
+bit_is_set(const UCHAR * const data,
+	   const UINT offset)
+{
+  const UCHAR byte = data[offset >> 3];
+  UINT bit;
+
+  if (little_endian)
+    bit = offset;		/* offset */
+  else				/* or */
+    bit = ~offset;		/* 7 - offset */
+  bit &= 7;			/* modulo 8 */
+  return (UCHAR) (byte & (1 << bit));
+}
+
+/* Find lowest and highest used offset in a byte array. */
+/* Returns 0 if and only if all bits are unset. */
+static int
+find_pos(const UCHAR * const data,
+	 const UINT sizeof_data,
+	 UINT * const low,
+	 UINT * const high)
+{
+  const UINT last = (sizeof_data << 3) - 1;
+  UINT offset;
+
+  for (offset = last; !bit_is_set(data, offset); offset--)
+    if (!offset)		/* All bits are 0. */
+      return 0;
+  *high = offset;
+
+  for (offset = 0; !bit_is_set(data, offset); offset++)
+    {
+    }
+  *low = offset;
+
+  return -1;
+}
+
+#define PRINT_BITMASK(c_type, ada_name, mask_macro)                     \
+  {                                                                     \
+    UINT first, last;                                                   \
+    c_type mask = (mask_macro);                                         \
+    if (!find_pos ((UCHAR *)&mask, sizeof (mask), &first, &last))       \
+      my_error ("failed to locate " ada_name);                          \
+    print_constant (fp, ada_name "_First", first);                      \
+    print_constant (fp, ada_name "_Last", last);                        \
+  }
+
+#define PRINT_NAMED_BITMASK(c_type, mask_macro)         \
+  PRINT_BITMASK (c_type, #mask_macro, mask_macro)
+
+#define STRUCT_OFFSET(record, field)                                    \
+  {                                                                     \
+    UINT first, last;                                                   \
+    record mask;                                                        \
+    memset (&mask, 0, sizeof (mask));                                   \
+    memset (&mask.field, 0xff, sizeof(mask.field));                     \
+    if (!find_pos ((UCHAR *)&mask, sizeof (mask), &first, &last))       \
+      my_error ("failed to locate" #record "_" #field);                 \
+    print_constant (fp, #record "_" #field "_First", first);            \
+    print_constant (fp, #record "_" #field "_Last", last);              \
+  }
+
+/*--------------------*/
+/*  Start of main (). */
+/*--------------------*/
+
+int
+main(int argc, const char *argv[])
+{
+  FILE *fp = 0;
+  const int x = 0x12345678;
+
+  little_endian = (*((const char *)&x) == 0x78);
+
+  my_program_invocation_name = argv[0];
+
+  if (KEY_MIN == 256)
+    my_error("unexpected value for KEY_MIN: 256");
+
+  if (argc == 3)
+    {
+      fp = fopen(argv[2], "wb");
+    }
+  else if (argc == 2)
+    {
+      fp = stdout;
+    }
+  else
+    {
+      my_error("Only one or two arguments expected (DFT_ARG_SUFFIX)");
+    }
+
+  if ((strlen(argv[0]) + strlen(__FILE__)) > 25)
+    {
+      fprintf(fp, "--  Generated by the C program %.40s.\n",
+	      my_program_invocation_name);
+    }
+  else
+    {
+      fprintf(fp, "--  Generated by the C program %s (source %s).\n",
+	      my_program_invocation_name,
+	      __FILE__);
+    }
+  fprintf(fp, "--  Do not edit this file directly.\n");
+  fprintf(fp, "--  The values provided here may vary on your system.\n");
+  fprintf(fp, "\n");
+  fprintf(fp, "with System;\n");
+  fprintf(fp, "package Terminal_Interface.Curses_Constants is\n");
+  fprintf(fp, "   pragma Pure;\n");
+  fprintf(fp, "\n");
+
+  fprintf(fp, "   DFT_ARG_SUFFIX : constant String := \"%s\";\n", argv[1]);
+  fprintf(fp,
+	  "   Bit_Order : constant System.Bit_Order := System.%s_Order_First;\n",
+	  little_endian ? "Low" : "High");
+  print_size_of(fp, "Sizeof_Bool", 8 * sizeof(bool));
+
+  PRINT_NAMED_CONSTANT(OK);
+  PRINT_NAMED_CONSTANT(ERR);
+  fprintf(fp,
+	  "   pragma Warnings (Off); -- redefinition of Standard.True and False\n");
+  PRINT_NAMED_CONSTANT(TRUE);
+  PRINT_NAMED_CONSTANT(FALSE);
+  fprintf(fp, "   pragma Warnings (On);\n");
+
+  print_comment(fp, "Version of the ncurses library from extensions(3NCURSES)");
+  PRINT_NAMED_CONSTANT(NCURSES_VERSION_MAJOR);
+  PRINT_NAMED_CONSTANT(NCURSES_VERSION_MINOR);
+  fprintf(fp, "   Version : constant String := \"%d.%d\";\n",
+	  NCURSES_VERSION_MAJOR, NCURSES_VERSION_MINOR);
+
+  print_comment(fp, "Character non-color attributes from attr(3NCURSES)");
+  fprintf(fp, "   --  attr_t and chtype may be signed in C.\n");
+  fprintf(fp, "   type attr_t is mod 2 ** %lu;\n", (long unsigned)(8 * sizeof(attr_t)));
+  PRINT_NAMED_BITMASK(attr_t, A_CHARTEXT);
+  PRINT_NAMED_BITMASK(attr_t, A_COLOR);
+  PRINT_BITMASK(attr_t, "Attr", A_ATTRIBUTES & ~A_COLOR);
+  PRINT_NAMED_BITMASK(attr_t, A_STANDOUT);
+  PRINT_NAMED_BITMASK(attr_t, A_UNDERLINE);
+  PRINT_NAMED_BITMASK(attr_t, A_REVERSE);
+  PRINT_NAMED_BITMASK(attr_t, A_BLINK);
+  PRINT_NAMED_BITMASK(attr_t, A_DIM);
+  PRINT_NAMED_BITMASK(attr_t, A_BOLD);
+  PRINT_NAMED_BITMASK(attr_t, A_PROTECT);
+  PRINT_NAMED_BITMASK(attr_t, A_INVIS);
+  PRINT_NAMED_BITMASK(attr_t, A_ALTCHARSET);
+  PRINT_NAMED_BITMASK(attr_t, A_HORIZONTAL);
+  PRINT_NAMED_BITMASK(attr_t, A_LEFT);
+  PRINT_NAMED_BITMASK(attr_t, A_LOW);
+  PRINT_NAMED_BITMASK(attr_t, A_RIGHT);
+  PRINT_NAMED_BITMASK(attr_t, A_TOP);
+  PRINT_NAMED_BITMASK(attr_t, A_VERTICAL);
+  print_size_of(fp, "chtype_Size", 8 * sizeof(chtype));
+
+  print_comment(fp, "predefined color numbers from color(3NCURSES)");
+  PRINT_NAMED_CONSTANT(COLOR_BLACK);
+  PRINT_NAMED_CONSTANT(COLOR_RED);
+  PRINT_NAMED_CONSTANT(COLOR_GREEN);
+  PRINT_NAMED_CONSTANT(COLOR_YELLOW);
+  PRINT_NAMED_CONSTANT(COLOR_BLUE);
+  PRINT_NAMED_CONSTANT(COLOR_MAGENTA);
+  PRINT_NAMED_CONSTANT(COLOR_CYAN);
+  PRINT_NAMED_CONSTANT(COLOR_WHITE);
+
+  print_comment(fp, "ETI return codes from ncurses.h");
+  PRINT_NAMED_CONSTANT(E_OK);
+  PRINT_NAMED_CONSTANT(E_SYSTEM_ERROR);
+  PRINT_NAMED_CONSTANT(E_BAD_ARGUMENT);
+  PRINT_NAMED_CONSTANT(E_POSTED);
+  PRINT_NAMED_CONSTANT(E_CONNECTED);
+  PRINT_NAMED_CONSTANT(E_BAD_STATE);
+  PRINT_NAMED_CONSTANT(E_NO_ROOM);
+  PRINT_NAMED_CONSTANT(E_NOT_POSTED);
+  PRINT_NAMED_CONSTANT(E_UNKNOWN_COMMAND);
+  PRINT_NAMED_CONSTANT(E_NO_MATCH);
+  PRINT_NAMED_CONSTANT(E_NOT_SELECTABLE);
+  PRINT_NAMED_CONSTANT(E_NOT_CONNECTED);
+  PRINT_NAMED_CONSTANT(E_REQUEST_DENIED);
+  PRINT_NAMED_CONSTANT(E_INVALID_FIELD);
+  PRINT_NAMED_CONSTANT(E_CURRENT);
+
+  print_comment(fp, "Input key codes not defined in any ncurses manpage");
+  PRINT_NAMED_CONSTANT(KEY_MIN);
+  PRINT_NAMED_CONSTANT(KEY_MAX);
+#ifdef KEY_CODE_YES
+  PRINT_NAMED_CONSTANT(KEY_CODE_YES);
+#endif
+
+  print_comment(fp, "Input key codes from getch(3NCURSES)");
+  PRINT_NAMED_CONSTANT(KEY_BREAK);
+  PRINT_NAMED_CONSTANT(KEY_DOWN);
+  PRINT_NAMED_CONSTANT(KEY_UP);
+  PRINT_NAMED_CONSTANT(KEY_LEFT);
+  PRINT_NAMED_CONSTANT(KEY_RIGHT);
+  PRINT_NAMED_CONSTANT(KEY_HOME);
+  PRINT_NAMED_CONSTANT(KEY_BACKSPACE);
+  PRINT_NAMED_CONSTANT(KEY_F0);
+#define PRINT_NAMED_FUNC_KEY(name) print_constant(fp, "KEY_F"#name, KEY_F(name))
+  PRINT_NAMED_FUNC_KEY(1);
+  PRINT_NAMED_FUNC_KEY(2);
+  PRINT_NAMED_FUNC_KEY(3);
+  PRINT_NAMED_FUNC_KEY(4);
+  PRINT_NAMED_FUNC_KEY(5);
+  PRINT_NAMED_FUNC_KEY(6);
+  PRINT_NAMED_FUNC_KEY(7);
+  PRINT_NAMED_FUNC_KEY(8);
+  PRINT_NAMED_FUNC_KEY(9);
+  PRINT_NAMED_FUNC_KEY(10);
+  PRINT_NAMED_FUNC_KEY(11);
+  PRINT_NAMED_FUNC_KEY(12);
+  PRINT_NAMED_FUNC_KEY(13);
+  PRINT_NAMED_FUNC_KEY(14);
+  PRINT_NAMED_FUNC_KEY(15);
+  PRINT_NAMED_FUNC_KEY(16);
+  PRINT_NAMED_FUNC_KEY(17);
+  PRINT_NAMED_FUNC_KEY(18);
+  PRINT_NAMED_FUNC_KEY(19);
+  PRINT_NAMED_FUNC_KEY(20);
+  PRINT_NAMED_FUNC_KEY(21);
+  PRINT_NAMED_FUNC_KEY(22);
+  PRINT_NAMED_FUNC_KEY(23);
+  PRINT_NAMED_FUNC_KEY(24);
+  PRINT_NAMED_CONSTANT(KEY_DL);
+  PRINT_NAMED_CONSTANT(KEY_IL);
+  PRINT_NAMED_CONSTANT(KEY_DC);
+  PRINT_NAMED_CONSTANT(KEY_IC);
+  PRINT_NAMED_CONSTANT(KEY_EIC);
+  PRINT_NAMED_CONSTANT(KEY_CLEAR);
+  PRINT_NAMED_CONSTANT(KEY_EOS);
+  PRINT_NAMED_CONSTANT(KEY_EOL);
+  PRINT_NAMED_CONSTANT(KEY_SF);
+  PRINT_NAMED_CONSTANT(KEY_SR);
+  PRINT_NAMED_CONSTANT(KEY_NPAGE);
+  PRINT_NAMED_CONSTANT(KEY_PPAGE);
+  PRINT_NAMED_CONSTANT(KEY_STAB);
+  PRINT_NAMED_CONSTANT(KEY_CTAB);
+  PRINT_NAMED_CONSTANT(KEY_CATAB);
+  PRINT_NAMED_CONSTANT(KEY_ENTER);
+  PRINT_NAMED_CONSTANT(KEY_SRESET);
+  PRINT_NAMED_CONSTANT(KEY_RESET);
+  PRINT_NAMED_CONSTANT(KEY_PRINT);
+  PRINT_NAMED_CONSTANT(KEY_LL);
+  PRINT_NAMED_CONSTANT(KEY_A1);
+  PRINT_NAMED_CONSTANT(KEY_A3);
+  PRINT_NAMED_CONSTANT(KEY_B2);
+  PRINT_NAMED_CONSTANT(KEY_C1);
+  PRINT_NAMED_CONSTANT(KEY_C3);
+  PRINT_NAMED_CONSTANT(KEY_BTAB);
+  PRINT_NAMED_CONSTANT(KEY_BEG);
+  PRINT_NAMED_CONSTANT(KEY_CANCEL);
+  PRINT_NAMED_CONSTANT(KEY_CLOSE);
+  PRINT_NAMED_CONSTANT(KEY_COMMAND);
+  PRINT_NAMED_CONSTANT(KEY_COPY);
+  PRINT_NAMED_CONSTANT(KEY_CREATE);
+  PRINT_NAMED_CONSTANT(KEY_END);
+  PRINT_NAMED_CONSTANT(KEY_EXIT);
+  PRINT_NAMED_CONSTANT(KEY_FIND);
+  PRINT_NAMED_CONSTANT(KEY_HELP);
+  PRINT_NAMED_CONSTANT(KEY_MARK);
+  PRINT_NAMED_CONSTANT(KEY_MESSAGE);
+  PRINT_NAMED_CONSTANT(KEY_MOVE);
+  PRINT_NAMED_CONSTANT(KEY_NEXT);
+  PRINT_NAMED_CONSTANT(KEY_OPEN);
+  PRINT_NAMED_CONSTANT(KEY_OPTIONS);
+  PRINT_NAMED_CONSTANT(KEY_PREVIOUS);
+  PRINT_NAMED_CONSTANT(KEY_REDO);
+  PRINT_NAMED_CONSTANT(KEY_REFERENCE);
+  PRINT_NAMED_CONSTANT(KEY_REFRESH);
+  PRINT_NAMED_CONSTANT(KEY_REPLACE);
+  PRINT_NAMED_CONSTANT(KEY_RESTART);
+  PRINT_NAMED_CONSTANT(KEY_RESUME);
+  PRINT_NAMED_CONSTANT(KEY_SAVE);
+  PRINT_NAMED_CONSTANT(KEY_SBEG);
+  PRINT_NAMED_CONSTANT(KEY_SCANCEL);
+  PRINT_NAMED_CONSTANT(KEY_SCOMMAND);
+  PRINT_NAMED_CONSTANT(KEY_SCOPY);
+  PRINT_NAMED_CONSTANT(KEY_SCREATE);
+  PRINT_NAMED_CONSTANT(KEY_SDC);
+  PRINT_NAMED_CONSTANT(KEY_SDL);
+  PRINT_NAMED_CONSTANT(KEY_SELECT);
+  PRINT_NAMED_CONSTANT(KEY_SEND);
+  PRINT_NAMED_CONSTANT(KEY_SEOL);
+  PRINT_NAMED_CONSTANT(KEY_SEXIT);
+  PRINT_NAMED_CONSTANT(KEY_SFIND);
+  PRINT_NAMED_CONSTANT(KEY_SHELP);
+  PRINT_NAMED_CONSTANT(KEY_SHOME);
+  PRINT_NAMED_CONSTANT(KEY_SIC);
+  PRINT_NAMED_CONSTANT(KEY_SLEFT);
+  PRINT_NAMED_CONSTANT(KEY_SMESSAGE);
+  PRINT_NAMED_CONSTANT(KEY_SMOVE);
+  PRINT_NAMED_CONSTANT(KEY_SNEXT);
+  PRINT_NAMED_CONSTANT(KEY_SOPTIONS);
+  PRINT_NAMED_CONSTANT(KEY_SPREVIOUS);
+  PRINT_NAMED_CONSTANT(KEY_SPRINT);
+  PRINT_NAMED_CONSTANT(KEY_SREDO);
+  PRINT_NAMED_CONSTANT(KEY_SREPLACE);
+  PRINT_NAMED_CONSTANT(KEY_SRIGHT);
+  PRINT_NAMED_CONSTANT(KEY_SRSUME);
+  PRINT_NAMED_CONSTANT(KEY_SSAVE);
+  PRINT_NAMED_CONSTANT(KEY_SSUSPEND);
+  PRINT_NAMED_CONSTANT(KEY_SUNDO);
+  PRINT_NAMED_CONSTANT(KEY_SUSPEND);
+  PRINT_NAMED_CONSTANT(KEY_UNDO);
+  PRINT_NAMED_CONSTANT(KEY_MOUSE);
+  PRINT_NAMED_CONSTANT(KEY_RESIZE);
+
+  print_comment(fp, "alternate character codes (ACS) from addch(3NCURSES)");
+#define PRINT_ACS(name) print_size_of (fp, #name, (size_t)(&name - &acs_map[0]))
+  PRINT_ACS(ACS_ULCORNER);
+  PRINT_ACS(ACS_LLCORNER);
+  PRINT_ACS(ACS_URCORNER);
+  PRINT_ACS(ACS_LRCORNER);
+  PRINT_ACS(ACS_LTEE);
+  PRINT_ACS(ACS_RTEE);
+  PRINT_ACS(ACS_BTEE);
+  PRINT_ACS(ACS_TTEE);
+  PRINT_ACS(ACS_HLINE);
+  PRINT_ACS(ACS_VLINE);
+  PRINT_ACS(ACS_PLUS);
+  PRINT_ACS(ACS_S1);
+  PRINT_ACS(ACS_S9);
+  PRINT_ACS(ACS_DIAMOND);
+  PRINT_ACS(ACS_CKBOARD);
+  PRINT_ACS(ACS_DEGREE);
+  PRINT_ACS(ACS_PLMINUS);
+  PRINT_ACS(ACS_BULLET);
+  PRINT_ACS(ACS_LARROW);
+  PRINT_ACS(ACS_RARROW);
+  PRINT_ACS(ACS_DARROW);
+  PRINT_ACS(ACS_UARROW);
+  PRINT_ACS(ACS_BOARD);
+  PRINT_ACS(ACS_LANTERN);
+  PRINT_ACS(ACS_BLOCK);
+  PRINT_ACS(ACS_S3);
+  PRINT_ACS(ACS_S7);
+  PRINT_ACS(ACS_LEQUAL);
+  PRINT_ACS(ACS_GEQUAL);
+  PRINT_ACS(ACS_PI);
+  PRINT_ACS(ACS_NEQUAL);
+  PRINT_ACS(ACS_STERLING);
+
+  print_comment(fp, "Menu_Options from opts(3MENU)");
+  PRINT_NAMED_BITMASK(Menu_Options, O_ONEVALUE);
+  PRINT_NAMED_BITMASK(Menu_Options, O_SHOWDESC);
+  PRINT_NAMED_BITMASK(Menu_Options, O_ROWMAJOR);
+  PRINT_NAMED_BITMASK(Menu_Options, O_IGNORECASE);
+  PRINT_NAMED_BITMASK(Menu_Options, O_SHOWMATCH);
+  PRINT_NAMED_BITMASK(Menu_Options, O_NONCYCLIC);
+  print_size_of(fp, "Menu_Options_Size", 8 * sizeof(Menu_Options));
+
+  print_comment(fp, "Item_Options from menu_opts(3MENU)");
+  PRINT_NAMED_BITMASK(Item_Options, O_SELECTABLE);
+  print_size_of(fp, "Item_Options_Size", 8 * sizeof(Item_Options));
+
+  print_comment(fp, "Field_Options from field_opts(3FORM)");
+  PRINT_NAMED_BITMASK(Field_Options, O_VISIBLE);
+  PRINT_NAMED_BITMASK(Field_Options, O_ACTIVE);
+  PRINT_NAMED_BITMASK(Field_Options, O_PUBLIC);
+  PRINT_NAMED_BITMASK(Field_Options, O_EDIT);
+  PRINT_NAMED_BITMASK(Field_Options, O_WRAP);
+  PRINT_NAMED_BITMASK(Field_Options, O_BLANK);
+  PRINT_NAMED_BITMASK(Field_Options, O_AUTOSKIP);
+  PRINT_NAMED_BITMASK(Field_Options, O_NULLOK);
+  PRINT_NAMED_BITMASK(Field_Options, O_PASSOK);
+  PRINT_NAMED_BITMASK(Field_Options, O_STATIC);
+  print_size_of(fp, "Field_Options_Size", 8 * sizeof(Field_Options));
+
+  print_comment(fp, "Field_Options from opts(3FORM)");
+  PRINT_NAMED_BITMASK(Field_Options, O_NL_OVERLOAD);
+  PRINT_NAMED_BITMASK(Field_Options, O_BS_OVERLOAD);
+
+  /*  Field_Options_Size is defined below */
+
+  print_comment(fp, "MEVENT structure from mouse(3NCURSES)");
+  STRUCT_OFFSET(MEVENT, id);
+  STRUCT_OFFSET(MEVENT, x);
+  STRUCT_OFFSET(MEVENT, y);
+  STRUCT_OFFSET(MEVENT, z);
+  STRUCT_OFFSET(MEVENT, bstate);
+  print_size_of(fp, "MEVENT_Size", 8 * sizeof(MEVENT));
+
+  print_comment(fp, "mouse events from mouse(3NCURSES)");
+  {
+    mmask_t all_events;
+
+#define PRINT_MOUSE_EVENT(event)                \
+    print_constant (fp, #event, event);         \
+    all_events |= event
+
+    all_events = 0;
+    PRINT_MOUSE_EVENT(BUTTON1_RELEASED);
+    PRINT_MOUSE_EVENT(BUTTON1_PRESSED);
+    PRINT_MOUSE_EVENT(BUTTON1_CLICKED);
+    PRINT_MOUSE_EVENT(BUTTON1_DOUBLE_CLICKED);
+    PRINT_MOUSE_EVENT(BUTTON1_TRIPLE_CLICKED);
+#ifdef BUTTON1_RESERVED_EVENT
+    PRINT_MOUSE_EVENT(BUTTON1_RESERVED_EVENT);
+#endif
+    print_constant(fp, "all_events_button_1", (UINT) all_events);
+
+    all_events = 0;
+    PRINT_MOUSE_EVENT(BUTTON2_RELEASED);
+    PRINT_MOUSE_EVENT(BUTTON2_PRESSED);
+    PRINT_MOUSE_EVENT(BUTTON2_CLICKED);
+    PRINT_MOUSE_EVENT(BUTTON2_DOUBLE_CLICKED);
+    PRINT_MOUSE_EVENT(BUTTON2_TRIPLE_CLICKED);
+#ifdef BUTTON2_RESERVED_EVENT
+    PRINT_MOUSE_EVENT(BUTTON2_RESERVED_EVENT);
+#endif
+    print_constant(fp, "all_events_button_2", (UINT) all_events);
+
+    all_events = 0;
+    PRINT_MOUSE_EVENT(BUTTON3_RELEASED);
+    PRINT_MOUSE_EVENT(BUTTON3_PRESSED);
+    PRINT_MOUSE_EVENT(BUTTON3_CLICKED);
+    PRINT_MOUSE_EVENT(BUTTON3_DOUBLE_CLICKED);
+    PRINT_MOUSE_EVENT(BUTTON3_TRIPLE_CLICKED);
+#ifdef BUTTON3_RESERVED_EVENT
+    PRINT_MOUSE_EVENT(BUTTON3_RESERVED_EVENT);
+#endif
+    print_constant(fp, "all_events_button_3", (UINT) all_events);
+
+    all_events = 0;
+    PRINT_MOUSE_EVENT(BUTTON4_RELEASED);
+    PRINT_MOUSE_EVENT(BUTTON4_PRESSED);
+    PRINT_MOUSE_EVENT(BUTTON4_CLICKED);
+    PRINT_MOUSE_EVENT(BUTTON4_DOUBLE_CLICKED);
+    PRINT_MOUSE_EVENT(BUTTON4_TRIPLE_CLICKED);
+#ifdef BUTTON4_RESERVED_EVENT
+    PRINT_MOUSE_EVENT(BUTTON4_RESERVED_EVENT);
+#endif
+    print_constant(fp, "all_events_button_4", (UINT) all_events);
+  }
+  PRINT_NAMED_CONSTANT(BUTTON_CTRL);
+  PRINT_NAMED_CONSTANT(BUTTON_SHIFT);
+  PRINT_NAMED_CONSTANT(BUTTON_ALT);
+  PRINT_NAMED_CONSTANT(REPORT_MOUSE_POSITION);
+  PRINT_NAMED_CONSTANT(ALL_MOUSE_EVENTS);
+
+  print_comment(fp, "trace selection from trace(3NCURSES)");
+  PRINT_NAMED_BITMASK(UINT, TRACE_TIMES);
+  PRINT_NAMED_BITMASK(UINT, TRACE_TPUTS);
+  PRINT_NAMED_BITMASK(UINT, TRACE_UPDATE);
+  PRINT_NAMED_BITMASK(UINT, TRACE_MOVE);
+  PRINT_NAMED_BITMASK(UINT, TRACE_CHARPUT);
+  PRINT_NAMED_BITMASK(UINT, TRACE_CALLS);
+  PRINT_NAMED_BITMASK(UINT, TRACE_VIRTPUT);
+  PRINT_NAMED_BITMASK(UINT, TRACE_IEVENT);
+  PRINT_NAMED_BITMASK(UINT, TRACE_BITS);
+  PRINT_NAMED_BITMASK(UINT, TRACE_ICALLS);
+  PRINT_NAMED_BITMASK(UINT, TRACE_CCALLS);
+  PRINT_NAMED_BITMASK(UINT, TRACE_DATABASE);
+  PRINT_NAMED_BITMASK(UINT, TRACE_ATTRS);
+  print_size_of(fp, "Trace_Size", 8 * sizeof(UINT));
+
+  fprintf(fp, "end Terminal_Interface.Curses_Constants;\n");
+  exit(EXIT_SUCCESS);
+}
diff --git a/Ada95/gen/html.m4 b/Ada95/gen/html.m4
new file mode 100644
index 0000000..22374f6
--- /dev/null
+++ b/Ada95/gen/html.m4
@@ -0,0 +1,41 @@
+dnl***************************************************************************
+dnl Copyright 2019,2020 Thomas E. Dickey                                     *
+dnl Copyright 2000-2006,2007 Free Software Foundation, Inc.                  *
+dnl                                                                          *
+dnl Permission is hereby granted, free of charge, to any person obtaining a  *
+dnl copy of this software and associated documentation files (the            *
+dnl "Software"), to deal in the Software without restriction, including      *
+dnl without limitation the rights to use, copy, modify, merge, publish,      *
+dnl distribute, distribute with modifications, sublicense, and/or sell       *
+dnl copies of the Software, and to permit persons to whom the Software is    *
+dnl furnished to do so, subject to the following conditions:                 *
+dnl                                                                          *
+dnl The above copyright notice and this permission notice shall be included  *
+dnl in all copies or substantial portions of the Software.                   *
+dnl                                                                          *
+dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
+dnl OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
+dnl MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
+dnl IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
+dnl DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
+dnl OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
+dnl THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
+dnl                                                                          *
+dnl Except as contained in this notice, the name(s) of the above copyright   *
+dnl holders shall not be used in advertising or otherwise to promote the     *
+dnl sale, use or other dealings in this Software without prior written       *
+dnl authorization.                                                           *
+dnl***************************************************************************
+dnl
+dnl $Id: html.m4,v 1.5 2020/02/02 23:34:34 tom Exp $
+define(`ANCHORIDX',`0')dnl
+define(`MANPAGE',`define(`MANPG',$1)dnl
+|=====================================================================
+   --  | Man page <A HREF="../man/MANPG.html">MANPG</A>
+   --  |=====================================================================')dnl
+define(`ANCHOR',`define(`ANCHORIDX',incr(ANCHORIDX))dnl
+`#'1A NAME="AFU`_'ANCHORIDX"`#'2dnl
+define(`CFUNAME',`$1')define(`AFUNAME',`$2')dnl
+|#1/A#2')dnl
+define(`AKA',``AKA': <A HREF="../man/MANPG.html">CFUNAME</A>')dnl
+define(`ALIAS',``AKA': $1')dnl
diff --git a/Ada95/gen/normal.m4 b/Ada95/gen/normal.m4
new file mode 100644
index 0000000..5132702
--- /dev/null
+++ b/Ada95/gen/normal.m4
@@ -0,0 +1,38 @@
+dnl***************************************************************************
+dnl Copyright 2020 Thomas E. Dickey                                          *
+dnl Copyright 1998,2006 Free Software Foundation, Inc.                       *
+dnl                                                                          *
+dnl Permission is hereby granted, free of charge, to any person obtaining a  *
+dnl copy of this software and associated documentation files (the            *
+dnl "Software"), to deal in the Software without restriction, including      *
+dnl without limitation the rights to use, copy, modify, merge, publish,      *
+dnl distribute, distribute with modifications, sublicense, and/or sell       *
+dnl copies of the Software, and to permit persons to whom the Software is    *
+dnl furnished to do so, subject to the following conditions:                 *
+dnl                                                                          *
+dnl The above copyright notice and this permission notice shall be included  *
+dnl in all copies or substantial portions of the Software.                   *
+dnl                                                                          *
+dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
+dnl OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
+dnl MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
+dnl IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
+dnl DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
+dnl OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
+dnl THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
+dnl                                                                          *
+dnl Except as contained in this notice, the name(s) of the above copyright   *
+dnl holders shall not be used in advertising or otherwise to promote the     *
+dnl sale, use or other dealings in this Software without prior written       *
+dnl authorization.                                                           *
+dnl***************************************************************************
+dnl
+dnl $Id: normal.m4,v 1.3 2020/02/02 23:34:34 tom Exp $
+define(`MANPAGE',`define(`MANPG',$1)dnl
+|=====================================================================
+   --  | Man page MANPG
+   --  |=====================================================================')dnl
+define(`ANCHOR',`define(`CFUNAME',`$1')define(`AFUNAME',`$2')'dnl
+|)dnl
+define(`AKA',``AKA': CFUNAME')dnl
+define(`ALIAS',``AKA': $1')dnl
diff --git a/Ada95/gen/table.m4 b/Ada95/gen/table.m4
new file mode 100644
index 0000000..7de07d3
--- /dev/null
+++ b/Ada95/gen/table.m4
@@ -0,0 +1,36 @@
+dnl***************************************************************************
+dnl Copyright 2020 Thomas E. Dickey                                          *
+dnl Copyright 2000,2006 Free Software Foundation, Inc.                       *
+dnl                                                                          *
+dnl Permission is hereby granted, free of charge, to any person obtaining a  *
+dnl copy of this software and associated documentation files (the            *
+dnl "Software"), to deal in the Software without restriction, including      *
+dnl without limitation the rights to use, copy, modify, merge, publish,      *
+dnl distribute, distribute with modifications, sublicense, and/or sell       *
+dnl copies of the Software, and to permit persons to whom the Software is    *
+dnl furnished to do so, subject to the following conditions:                 *
+dnl                                                                          *
+dnl The above copyright notice and this permission notice shall be included  *
+dnl in all copies or substantial portions of the Software.                   *
+dnl                                                                          *
+dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
+dnl OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
+dnl MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
+dnl IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
+dnl DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
+dnl OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
+dnl THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
+dnl                                                                          *
+dnl Except as contained in this notice, the name(s) of the above copyright   *
+dnl holders shall not be used in advertising or otherwise to promote the     *
+dnl sale, use or other dealings in this Software without prior written       *
+dnl authorization.                                                           *
+dnl***************************************************************************
+dnl
+dnl $Id: table.m4,v 1.3 2020/02/02 23:34:34 tom Exp $
+define(`ANCHORIDX',`0')dnl
+define(`MANPAGE',`define(`MANPG',$1)')dnl
+divert(-1)dnl
+define(`ANCHOR',`divert(0)define(`ANCHORIDX',incr(ANCHORIDX))dnl
+<TR><TD>$1</TD><TD><A HREF="HTMLNAME`#'AFU`_'ANCHORIDX">$2</A></TD><TD><A HREF="../man/MANPG.html">MANPG</A></TD></TR>
+divert(-1)')
diff --git a/Ada95/gen/terminal_interface-curses-aux.ads.m4 b/Ada95/gen/terminal_interface-curses-aux.ads.m4
new file mode 100644
index 0000000..94eaad8
--- /dev/null
+++ b/Ada95/gen/terminal_interface-curses-aux.ads.m4
@@ -0,0 +1,121 @@
+--  -*- ada -*-
+define(`HTMLNAME',`terminal_interface-curses-aux__ads.htm')dnl
+include(M4MACRO)dnl
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                       Terminal_Interface.Curses.Aux                      --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2018,2020 Thomas E. Dickey                                     --
+-- Copyright 1998-2011,2014 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.25 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with System;
+with Interfaces.C;
+with Interfaces.C.Strings; use Interfaces.C.Strings;
+
+package Terminal_Interface.Curses.Aux is
+   pragma Preelaborate (Terminal_Interface.Curses.Aux);
+
+   subtype C_Int      is Interfaces.C.int;
+   subtype C_Short    is Interfaces.C.short;
+   subtype C_Long_Int is Interfaces.C.long;
+   subtype C_Size_T   is Interfaces.C.size_t;
+   subtype C_UInt     is Interfaces.C.unsigned;
+   subtype C_ULong    is Interfaces.C.unsigned_long;
+   subtype C_Char_Ptr is Interfaces.C.Strings.chars_ptr;
+   type    C_Void_Ptr is new System.Address;
+
+   --  This is how those constants are defined in ncurses. I see them also
+   --  exactly like this in all ETI implementations I ever tested. So it
+   --  could be that this is quite general, but please check with your curses.
+   --  This is critical, because curses sometime mixes Boolean returns with
+   --  returning an error status.
+   Curses_Ok    : constant C_Int := Curses_Constants.OK;
+   Curses_Err   : constant C_Int := Curses_Constants.ERR;
+
+   Curses_True  : constant C_Int := Curses_Constants.TRUE;
+   Curses_False : constant C_Int := Curses_Constants.FALSE;
+
+   --  Eti_Error: type for error codes returned by the menu and form subsystem
+   type Eti_Error is
+     (E_Current,
+      E_Invalid_Field,
+      E_Request_Denied,
+      E_Not_Connected,
+      E_Not_Selectable,
+      E_No_Match,
+      E_Unknown_Command,
+      E_Not_Posted,
+      E_No_Room,
+      E_Bad_State,
+      E_Connected,
+      E_Posted,
+      E_Bad_Argument,
+      E_System_Error,
+      E_Ok);
+
+   procedure Eti_Exception (Code : Eti_Error);
+   --  Do nothing if Code = E_Ok.
+   --  Else dispatch the error code and raise the appropriate exception.
+
+   procedure Fill_String (Cp  : chars_ptr;
+                          Str : out String);
+   --  Fill the Str parameter with the string denoted by the chars_ptr
+   --  C-Style string.
+
+   function Fill_String (Cp : chars_ptr) return String;
+   --  Same but as function.
+
+private
+   for Eti_Error'Size use C_Int'Size;
+   pragma Convention (C, Eti_Error);
+   for Eti_Error use
+     (E_Current         => Curses_Constants.E_CURRENT,
+      E_Invalid_Field   => Curses_Constants.E_INVALID_FIELD,
+      E_Request_Denied  => Curses_Constants.E_REQUEST_DENIED,
+      E_Not_Connected   => Curses_Constants.E_NOT_CONNECTED,
+      E_Not_Selectable  => Curses_Constants.E_NOT_SELECTABLE,
+      E_No_Match        => Curses_Constants.E_NO_MATCH,
+      E_Unknown_Command => Curses_Constants.E_UNKNOWN_COMMAND,
+      E_Not_Posted      => Curses_Constants.E_NOT_POSTED,
+      E_No_Room         => Curses_Constants.E_NO_ROOM,
+      E_Bad_State       => Curses_Constants.E_BAD_STATE,
+      E_Connected       => Curses_Constants.E_CONNECTED,
+      E_Posted          => Curses_Constants.E_POSTED,
+      E_Bad_Argument    => Curses_Constants.E_BAD_ARGUMENT,
+      E_System_Error    => Curses_Constants.E_SYSTEM_ERROR,
+      E_Ok              => Curses_Constants.E_OK);
+end Terminal_Interface.Curses.Aux;
diff --git a/Ada95/gen/terminal_interface-curses-forms-field_types.ads.m4 b/Ada95/gen/terminal_interface-curses-forms-field_types.ads.m4
new file mode 100644
index 0000000..0f5db6c
--- /dev/null
+++ b/Ada95/gen/terminal_interface-curses-forms-field_types.ads.m4
@@ -0,0 +1,239 @@
+--  -*- ada -*-
+define(`HTMLNAME',`terminal_interface-curses-forms-field_user_data__ads.htm')dnl
+include(M4MACRO)dnl
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                 Terminal_Interface.Curses.Forms.Field_Types              --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2018,2020 Thomas E. Dickey                                     --
+-- Copyright 1998-2011,2014 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.21 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Interfaces.C;
+with Terminal_Interface.Curses.Aux;
+
+package Terminal_Interface.Curses.Forms.Field_Types is
+   pragma Preelaborate (Terminal_Interface.Curses.Forms.Field_Types);
+   subtype C_Int is Interfaces.C.int;
+
+   --  MANPAGE(`form_fieldtype.3x')
+
+   type Field_Type is abstract tagged null record;
+   --  Abstract base type for all field types. A concrete field type
+   --  is an extension that adds some data elements describing formats or
+   --  boundary values for the type and validation routines.
+   --  For the builtin low-level fieldtypes, the validation routines are
+   --  already defined by the low-level C library.
+   --  The builtin types like Alpha or AlphaNumeric etc. are defined in
+   --  child packages of this package. You may use one of them as example
+   --  how to create you own child packages for low-level field types that
+   --  you may have already written in C.
+
+   type Field_Type_Access is access all Field_Type'Class;
+
+   --  ANCHOR(`set_field_type()',`Set_Type')
+   procedure Set_Field_Type (Fld      : Field;
+                             Fld_Type : Field_Type) is abstract;
+   --  AKA
+   --  But: we hide the vararg mechanism of the C interface. You always
+   --       have to pass a single Field_Type parameter.
+
+   --  ---------------------------------------------------------------------
+
+   --  MANPAGE(`form_field_validation.3x')
+
+   --  ANCHOR(`field_type()',`Get_Type')
+   function Get_Type (Fld : Field) return Field_Type_Access;
+   --  AKA
+   --  ALIAS(`field_arg()')
+   --  In Ada95 we can combine these. If you try to retrieve the field type
+   --  that is not defined as extension of the abstract tagged type above,
+   --  you will raise a Form_Exception.
+   --  This is not inlined
+
+   --  +----------------------------------------------------------------------
+   --  | Private Part.
+   --  | Most of this is used by the implementations of the child packages.
+   --  |
+private
+   type Makearg_Function is access
+     function (Args : System.Address) return System.Address;
+   pragma Convention (C, Makearg_Function);
+
+   type Copyarg_Function is access
+     function (Usr : System.Address) return System.Address;
+   pragma Convention (C, Copyarg_Function);
+
+   type Freearg_Function is access
+     procedure (Usr : System.Address);
+   pragma Convention (C, Freearg_Function);
+
+   type Field_Check_Function is access
+     function (Fld : Field; Usr : System.Address) return Curses_Bool;
+   pragma Convention (C, Field_Check_Function);
+
+   type Char_Check_Function is access
+     function (Ch : C_Int; Usr : System.Address) return Curses_Bool;
+   pragma Convention (C, Char_Check_Function);
+
+   type Choice_Function is access
+     function (Fld : Field; Usr : System.Address) return Curses_Bool;
+   pragma Convention (C, Choice_Function);
+
+   --  +----------------------------------------------------------------------
+   --  | This must be in sync with the FIELDTYPE structure in form.h
+   --  |
+   type Low_Level_Field_Type is
+      record
+         Status :              Interfaces.C.unsigned_short;
+         Ref_Count :           Interfaces.C.long;
+         Left, Right :         System.Address;
+         Makearg :             Makearg_Function;
+         Copyarg :             Copyarg_Function;
+         Freearg :             Freearg_Function;
+         Fcheck :              Field_Check_Function;
+         Ccheck :              Char_Check_Function;
+         Next, Prev :          Choice_Function;
+      end record;
+   pragma Convention (C, Low_Level_Field_Type);
+   type C_Field_Type is access all Low_Level_Field_Type;
+
+   Null_Field_Type   : constant C_Field_Type := null;
+
+   --  +----------------------------------------------------------------------
+   --  | This four low-level fieldtypes are the ones associated with
+   --  | fieldtypes handled by this binding. Any other low-level fieldtype
+   --  | will result in a Form_Exception is function Get_Type.
+   --  |
+   M_Generic_Type   : C_Field_Type := null;
+   M_Generic_Choice : C_Field_Type := null;
+   M_Builtin_Router : C_Field_Type := null;
+   M_Choice_Router  : C_Field_Type := null;
+
+   --  Two wrapper functions to access those low-level fieldtypes defined
+   --  in this package.
+   function C_Builtin_Router return C_Field_Type;
+   function C_Choice_Router  return C_Field_Type;
+
+   procedure Wrap_Builtin (Fld : Field;
+                           Typ : Field_Type'Class;
+                           Cft : C_Field_Type := C_Builtin_Router);
+   --  This procedure has to be called by the Set_Field_Type implementation
+   --  for builtin low-level fieldtypes to replace it by an Ada95
+   --  conformant Field_Type object.
+   --  The parameter Cft must be C_Builtin_Router for regular low-level
+   --  fieldtypes (like TYP_ALPHA or TYP_ALNUM) and C_Choice_Router for
+   --  low-level fieldtypes witch choice functions (like TYP_ENUM).
+   --  Any other value will raise a Form_Exception.
+
+   function Make_Arg (Args : System.Address) return System.Address;
+   pragma Import (C, Make_Arg, "void_star_make_arg");
+   --  This is the Makearg_Function for the internal low-level types
+   --  introduced by this binding.
+
+   function Copy_Arg (Usr : System.Address) return System.Address;
+   pragma Convention (C, Copy_Arg);
+   --  This is the Copyarg_Function for the internal low-level types
+   --  introduced by this binding.
+
+   procedure Free_Arg (Usr : System.Address);
+   pragma Convention (C, Free_Arg);
+   --  This is the Freearg_Function for the internal low-level types
+   --  introduced by this binding.
+
+   function Field_Check_Router (Fld : Field;
+                                Usr : System.Address) return Curses_Bool;
+   pragma Convention (C, Field_Check_Router);
+   --  This is the Field_Check_Function for the internal low-level types
+   --  introduced to wrap the low-level types by a Field_Type derived
+   --  type. It routes the call to the corresponding low-level validation
+   --  function.
+
+   function Char_Check_Router (Ch : C_Int;
+                               Usr : System.Address) return Curses_Bool;
+   pragma Convention (C, Char_Check_Router);
+   --  This is the Char_Check_Function for the internal low-level types
+   --  introduced to wrap the low-level types by a Field_Type derived
+   --  type. It routes the call to the corresponding low-level validation
+   --  function.
+
+   function Next_Router (Fld : Field;
+                         Usr : System.Address) return Curses_Bool;
+   pragma Convention (C, Next_Router);
+   --  This is the Choice_Function for the internal low-level types
+   --  introduced to wrap the low-level types by a Field_Type derived
+   --  type. It routes the call to the corresponding low-level next_choice
+   --  function.
+
+   function Prev_Router (Fld : Field;
+                         Usr : System.Address) return Curses_Bool;
+   pragma Convention (C, Prev_Router);
+   --  This is the Choice_Function for the internal low-level types
+   --  introduced to wrap the low-level types by a Field_Type derived
+   --  type. It routes the call to the corresponding low-level prev_choice
+   --  function.
+
+   --  This is the Argument structure maintained by all low-level field types
+   --  introduced by this binding.
+   type Argument is record
+      Typ : Field_Type_Access;   --  the Field_Type creating this record
+      Usr : System.Address;      --  original arg for builtin low-level types
+      Cft : C_Field_Type;        --  the original low-level type
+   end record;
+   type Argument_Access is access all Argument;
+
+   --  +----------------------------------------------------------------------
+   --  |
+   --  | Some Imports of libform routines to deal with low-level fieldtypes.
+   --  |
+   function New_Fieldtype (Fcheck : Field_Check_Function;
+                           Ccheck : Char_Check_Function)
+     return C_Field_Type;
+   pragma Import (C, New_Fieldtype, "new_fieldtype");
+
+   function Set_Fieldtype_Arg (Cft : C_Field_Type;
+                               Mak : Makearg_Function := Make_Arg'Access;
+                               Cop : Copyarg_Function := Copy_Arg'Access;
+                               Fre : Freearg_Function := Free_Arg'Access)
+     return Aux.Eti_Error;
+   pragma Import (C, Set_Fieldtype_Arg, "set_fieldtype_arg");
+
+   function Set_Fieldtype_Choice (Cft : C_Field_Type;
+                                  Next, Prev : Choice_Function)
+     return Aux.Eti_Error;
+   pragma Import (C, Set_Fieldtype_Choice, "set_fieldtype_choice");
+
+end Terminal_Interface.Curses.Forms.Field_Types;
diff --git a/Ada95/gen/terminal_interface-curses-forms-field_user_data.ads.m4 b/Ada95/gen/terminal_interface-curses-forms-field_user_data.ads.m4
new file mode 100644
index 0000000..71334b6
--- /dev/null
+++ b/Ada95/gen/terminal_interface-curses-forms-field_user_data.ads.m4
@@ -0,0 +1,71 @@
+--  -*- ada -*-
+define(`HTMLNAME',`terminal_interface-curses-forms-field_user_data__ads.htm')dnl
+include(M4MACRO)dnl
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--               Terminal_Interface.Curses.Forms.Field_User_Data            --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2003,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.17 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+
+generic
+   type User is limited private;
+   type User_Access is access User;
+package Terminal_Interface.Curses.Forms.Field_User_Data is
+   pragma Preelaborate (Terminal_Interface.Curses.Forms.Field_User_Data);
+
+   --  MANPAGE(`form_field_userptr.3x')
+
+   --  ANCHOR(`set_field_userptr',`Set_User_Data')
+   procedure Set_User_Data (Fld  : Field;
+                            Data : User_Access);
+   --  AKA
+   pragma Inline (Set_User_Data);
+
+   --  ANCHOR(`field_userptr',`Get_User_Data')
+   procedure Get_User_Data (Fld  : Field;
+                            Data : out User_Access);
+   --  AKA
+
+   --  ANCHOR(`field_userptr',`Get_User_Data')
+   function Get_User_Data (Fld  : Field) return User_Access;
+   --  AKA
+   --  Sama as function
+   pragma Inline (Get_User_Data);
+
+end Terminal_Interface.Curses.Forms.Field_User_Data;
diff --git a/Ada95/gen/terminal_interface-curses-forms-form_user_data.ads.m4 b/Ada95/gen/terminal_interface-curses-forms-form_user_data.ads.m4
new file mode 100644
index 0000000..4a98949
--- /dev/null
+++ b/Ada95/gen/terminal_interface-curses-forms-form_user_data.ads.m4
@@ -0,0 +1,71 @@
+--  -*- ada -*-
+define(`HTMLNAME',`terminal_interface-curses-forms-form_user_data__ads.htm')dnl
+include(M4MACRO)dnl
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                Terminal_Interface.Curses.Forms.Form_User_Data            --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2003,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.16 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+
+generic
+   type User is limited private;
+   type User_Access is access User;
+package Terminal_Interface.Curses.Forms.Form_User_Data is
+   pragma Preelaborate (Terminal_Interface.Curses.Forms.Form_User_Data);
+
+   --  MANPAGE(`form_userptr.3x')
+
+   --  ANCHOR(`set_form_userptr',`Set_User_Data')
+   procedure Set_User_Data (Frm  : Form;
+                            Data : User_Access);
+   --  AKA
+   pragma Inline (Set_User_Data);
+
+   --  ANCHOR(`form_userptr',`Get_User_Data')
+   procedure Get_User_Data (Frm  : Form;
+                            Data : out User_Access);
+   --  AKA
+
+   --  ANCHOR(`form_userptr',`Get_User_Data')
+   function Get_User_Data (Frm  : Form) return User_Access;
+   --  AKA
+   --  Same as function
+   pragma Inline (Get_User_Data);
+
+end Terminal_Interface.Curses.Forms.Form_User_Data;
diff --git a/Ada95/gen/terminal_interface-curses-forms.ads.m4 b/Ada95/gen/terminal_interface-curses-forms.ads.m4
new file mode 100644
index 0000000..1293d37
--- /dev/null
+++ b/Ada95/gen/terminal_interface-curses-forms.ads.m4
@@ -0,0 +1,749 @@
+--  -*- ada -*-
+define(`HTMLNAME',`terminal_interface-curses-forms__ads.htm')dnl
+include(M4MACRO)dnl
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                      Terminal_Interface.Curses.Form                      --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2009,2014 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.34 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with System;
+with Ada.Characters.Latin_1;
+
+package Terminal_Interface.Curses.Forms is
+   pragma Preelaborate (Terminal_Interface.Curses.Forms);
+   pragma Linker_Options ("-lform" & Curses_Constants.DFT_ARG_SUFFIX);
+
+   Space : Character renames Ada.Characters.Latin_1.Space;
+
+   type Field        is private;
+   type Form         is private;
+
+   Null_Field        : constant Field;
+   Null_Form         : constant Form;
+
+   type Field_Justification is (None,
+                                Left,
+                                Center,
+                                Right);
+
+   type Field_Option_Set is
+      record
+         Visible   : Boolean;
+         Active    : Boolean;
+         Public    : Boolean;
+         Edit      : Boolean;
+         Wrap      : Boolean;
+         Blank     : Boolean;
+         Auto_Skip : Boolean;
+         Null_Ok   : Boolean;
+         Pass_Ok   : Boolean;
+         Static    : Boolean;
+      end record;
+   pragma Convention (C_Pass_By_Copy, Field_Option_Set);
+
+   for Field_Option_Set use
+      record
+         Visible   at 0 range Curses_Constants.O_VISIBLE_First
+           .. Curses_Constants.O_VISIBLE_Last;
+         Active    at 0 range Curses_Constants.O_ACTIVE_First
+           .. Curses_Constants.O_ACTIVE_Last;
+         Public    at 0 range Curses_Constants.O_PUBLIC_First
+           .. Curses_Constants.O_PUBLIC_Last;
+         Edit      at 0 range Curses_Constants.O_EDIT_First
+           .. Curses_Constants.O_EDIT_Last;
+         Wrap      at 0 range Curses_Constants.O_WRAP_First
+           .. Curses_Constants.O_WRAP_Last;
+         Blank     at 0 range Curses_Constants.O_BLANK_First
+           .. Curses_Constants.O_BLANK_Last;
+         Auto_Skip at 0 range Curses_Constants.O_AUTOSKIP_First
+           .. Curses_Constants.O_AUTOSKIP_Last;
+         Null_Ok   at 0 range Curses_Constants.O_NULLOK_First
+           .. Curses_Constants.O_NULLOK_Last;
+         Pass_Ok   at 0 range Curses_Constants.O_PASSOK_First
+           .. Curses_Constants.O_PASSOK_Last;
+         Static    at 0 range Curses_Constants.O_STATIC_First
+           .. Curses_Constants.O_STATIC_Last;
+      end record;
+   pragma Warnings (Off);
+   for Field_Option_Set'Size use Curses_Constants.Field_Options_Size;
+   pragma Warnings (On);
+
+   function Default_Field_Options return Field_Option_Set;
+   --  The initial defaults for the field options.
+   pragma Inline (Default_Field_Options);
+
+   type Form_Option_Set is
+      record
+         NL_Overload : Boolean;
+         BS_Overload : Boolean;
+      end record;
+   pragma Convention (C_Pass_By_Copy, Form_Option_Set);
+
+   for Form_Option_Set use
+      record
+         NL_Overload at 0 range Curses_Constants.O_NL_OVERLOAD_First
+           .. Curses_Constants.O_NL_OVERLOAD_Last;
+         BS_Overload at 0 range Curses_Constants.O_BS_OVERLOAD_First
+           .. Curses_Constants.O_BS_OVERLOAD_Last;
+      end record;
+   pragma Warnings (Off);
+   for Form_Option_Set'Size use Curses_Constants.Field_Options_Size;
+   pragma Warnings (On);
+
+   function Default_Form_Options return Form_Option_Set;
+   --  The initial defaults for the form options.
+   pragma Inline (Default_Form_Options);
+
+   type Buffer_Number is new Natural;
+
+   type Field_Array is array (Positive range <>) of aliased Field;
+   pragma Convention (C, Field_Array);
+
+   type Field_Array_Access is access Field_Array;
+
+   procedure Free (FA          : in out Field_Array_Access;
+                   Free_Fields : Boolean := False);
+   --  Release the memory for an allocated field array
+   --  If Free_Fields is True, call Delete() for all the fields in
+   --  the array.
+
+   subtype Form_Request_Code is Key_Code range (Key_Max + 1) .. (Key_Max + 57);
+
+   --  The prefix F_ stands for "Form Request"
+   F_Next_Page                : constant Form_Request_Code := Key_Max + 1;
+   F_Previous_Page            : constant Form_Request_Code := Key_Max + 2;
+   F_First_Page               : constant Form_Request_Code := Key_Max + 3;
+   F_Last_Page                : constant Form_Request_Code := Key_Max + 4;
+
+   F_Next_Field               : constant Form_Request_Code := Key_Max + 5;
+   F_Previous_Field           : constant Form_Request_Code := Key_Max + 6;
+   F_First_Field              : constant Form_Request_Code := Key_Max + 7;
+   F_Last_Field               : constant Form_Request_Code := Key_Max + 8;
+   F_Sorted_Next_Field        : constant Form_Request_Code := Key_Max + 9;
+   F_Sorted_Previous_Field    : constant Form_Request_Code := Key_Max + 10;
+   F_Sorted_First_Field       : constant Form_Request_Code := Key_Max + 11;
+   F_Sorted_Last_Field        : constant Form_Request_Code := Key_Max + 12;
+   F_Left_Field               : constant Form_Request_Code := Key_Max + 13;
+   F_Right_Field              : constant Form_Request_Code := Key_Max + 14;
+   F_Up_Field                 : constant Form_Request_Code := Key_Max + 15;
+   F_Down_Field               : constant Form_Request_Code := Key_Max + 16;
+
+   F_Next_Char                : constant Form_Request_Code := Key_Max + 17;
+   F_Previous_Char            : constant Form_Request_Code := Key_Max + 18;
+   F_Next_Line                : constant Form_Request_Code := Key_Max + 19;
+   F_Previous_Line            : constant Form_Request_Code := Key_Max + 20;
+   F_Next_Word                : constant Form_Request_Code := Key_Max + 21;
+   F_Previous_Word            : constant Form_Request_Code := Key_Max + 22;
+   F_Begin_Field              : constant Form_Request_Code := Key_Max + 23;
+   F_End_Field                : constant Form_Request_Code := Key_Max + 24;
+   F_Begin_Line               : constant Form_Request_Code := Key_Max + 25;
+   F_End_Line                 : constant Form_Request_Code := Key_Max + 26;
+   F_Left_Char                : constant Form_Request_Code := Key_Max + 27;
+   F_Right_Char               : constant Form_Request_Code := Key_Max + 28;
+   F_Up_Char                  : constant Form_Request_Code := Key_Max + 29;
+   F_Down_Char                : constant Form_Request_Code := Key_Max + 30;
+
+   F_New_Line                 : constant Form_Request_Code := Key_Max + 31;
+   F_Insert_Char              : constant Form_Request_Code := Key_Max + 32;
+   F_Insert_Line              : constant Form_Request_Code := Key_Max + 33;
+   F_Delete_Char              : constant Form_Request_Code := Key_Max + 34;
+   F_Delete_Previous          : constant Form_Request_Code := Key_Max + 35;
+   F_Delete_Line              : constant Form_Request_Code := Key_Max + 36;
+   F_Delete_Word              : constant Form_Request_Code := Key_Max + 37;
+   F_Clear_EOL                : constant Form_Request_Code := Key_Max + 38;
+   F_Clear_EOF                : constant Form_Request_Code := Key_Max + 39;
+   F_Clear_Field              : constant Form_Request_Code := Key_Max + 40;
+   F_Overlay_Mode             : constant Form_Request_Code := Key_Max + 41;
+   F_Insert_Mode              : constant Form_Request_Code := Key_Max + 42;
+
+   --  Vertical Scrolling
+   F_ScrollForward_Line       : constant Form_Request_Code := Key_Max + 43;
+   F_ScrollBackward_Line      : constant Form_Request_Code := Key_Max + 44;
+   F_ScrollForward_Page       : constant Form_Request_Code := Key_Max + 45;
+   F_ScrollBackward_Page      : constant Form_Request_Code := Key_Max + 46;
+   F_ScrollForward_HalfPage   : constant Form_Request_Code := Key_Max + 47;
+   F_ScrollBackward_HalfPage  : constant Form_Request_Code := Key_Max + 48;
+
+   --  Horizontal Scrolling
+   F_HScrollForward_Char      : constant Form_Request_Code := Key_Max + 49;
+   F_HScrollBackward_Char     : constant Form_Request_Code := Key_Max + 50;
+   F_HScrollForward_Line      : constant Form_Request_Code := Key_Max + 51;
+   F_HScrollBackward_Line     : constant Form_Request_Code := Key_Max + 52;
+   F_HScrollForward_HalfLine  : constant Form_Request_Code := Key_Max + 53;
+   F_HScrollBackward_HalfLine : constant Form_Request_Code := Key_Max + 54;
+
+   F_Validate_Field           : constant Form_Request_Code := Key_Max + 55;
+   F_Next_Choice              : constant Form_Request_Code := Key_Max + 56;
+   F_Previous_Choice          : constant Form_Request_Code := Key_Max + 57;
+
+   --  For those who like the old 'C' style request names
+   REQ_NEXT_PAGE    : Form_Request_Code renames F_Next_Page;
+   REQ_PREV_PAGE    : Form_Request_Code renames F_Previous_Page;
+   REQ_FIRST_PAGE   : Form_Request_Code renames F_First_Page;
+   REQ_LAST_PAGE    : Form_Request_Code renames F_Last_Page;
+
+   REQ_NEXT_FIELD   : Form_Request_Code renames F_Next_Field;
+   REQ_PREV_FIELD   : Form_Request_Code renames F_Previous_Field;
+   REQ_FIRST_FIELD  : Form_Request_Code renames F_First_Field;
+   REQ_LAST_FIELD   : Form_Request_Code renames F_Last_Field;
+   REQ_SNEXT_FIELD  : Form_Request_Code renames F_Sorted_Next_Field;
+   REQ_SPREV_FIELD  : Form_Request_Code renames F_Sorted_Previous_Field;
+   REQ_SFIRST_FIELD : Form_Request_Code renames F_Sorted_First_Field;
+   REQ_SLAST_FIELD  : Form_Request_Code renames F_Sorted_Last_Field;
+   REQ_LEFT_FIELD   : Form_Request_Code renames F_Left_Field;
+   REQ_RIGHT_FIELD  : Form_Request_Code renames F_Right_Field;
+   REQ_UP_FIELD     : Form_Request_Code renames F_Up_Field;
+   REQ_DOWN_FIELD   : Form_Request_Code renames F_Down_Field;
+
+   REQ_NEXT_CHAR    : Form_Request_Code renames F_Next_Char;
+   REQ_PREV_CHAR    : Form_Request_Code renames F_Previous_Char;
+   REQ_NEXT_LINE    : Form_Request_Code renames F_Next_Line;
+   REQ_PREV_LINE    : Form_Request_Code renames F_Previous_Line;
+   REQ_NEXT_WORD    : Form_Request_Code renames F_Next_Word;
+   REQ_PREV_WORD    : Form_Request_Code renames F_Previous_Word;
+   REQ_BEG_FIELD    : Form_Request_Code renames F_Begin_Field;
+   REQ_END_FIELD    : Form_Request_Code renames F_End_Field;
+   REQ_BEG_LINE     : Form_Request_Code renames F_Begin_Line;
+   REQ_END_LINE     : Form_Request_Code renames F_End_Line;
+   REQ_LEFT_CHAR    : Form_Request_Code renames F_Left_Char;
+   REQ_RIGHT_CHAR   : Form_Request_Code renames F_Right_Char;
+   REQ_UP_CHAR      : Form_Request_Code renames F_Up_Char;
+   REQ_DOWN_CHAR    : Form_Request_Code renames F_Down_Char;
+
+   REQ_NEW_LINE     : Form_Request_Code renames F_New_Line;
+   REQ_INS_CHAR     : Form_Request_Code renames F_Insert_Char;
+   REQ_INS_LINE     : Form_Request_Code renames F_Insert_Line;
+   REQ_DEL_CHAR     : Form_Request_Code renames F_Delete_Char;
+   REQ_DEL_PREV     : Form_Request_Code renames F_Delete_Previous;
+   REQ_DEL_LINE     : Form_Request_Code renames F_Delete_Line;
+   REQ_DEL_WORD     : Form_Request_Code renames F_Delete_Word;
+   REQ_CLR_EOL      : Form_Request_Code renames F_Clear_EOL;
+   REQ_CLR_EOF      : Form_Request_Code renames F_Clear_EOF;
+   REQ_CLR_FIELD    : Form_Request_Code renames F_Clear_Field;
+   REQ_OVL_MODE     : Form_Request_Code renames F_Overlay_Mode;
+   REQ_INS_MODE     : Form_Request_Code renames F_Insert_Mode;
+
+   REQ_SCR_FLINE    : Form_Request_Code renames F_ScrollForward_Line;
+   REQ_SCR_BLINE    : Form_Request_Code renames F_ScrollBackward_Line;
+   REQ_SCR_FPAGE    : Form_Request_Code renames F_ScrollForward_Page;
+   REQ_SCR_BPAGE    : Form_Request_Code renames F_ScrollBackward_Page;
+   REQ_SCR_FHPAGE   : Form_Request_Code renames F_ScrollForward_HalfPage;
+   REQ_SCR_BHPAGE   : Form_Request_Code renames F_ScrollBackward_HalfPage;
+
+   REQ_SCR_FCHAR    : Form_Request_Code renames F_HScrollForward_Char;
+   REQ_SCR_BCHAR    : Form_Request_Code renames F_HScrollBackward_Char;
+   REQ_SCR_HFLINE   : Form_Request_Code renames F_HScrollForward_Line;
+   REQ_SCR_HBLINE   : Form_Request_Code renames F_HScrollBackward_Line;
+   REQ_SCR_HFHALF   : Form_Request_Code renames F_HScrollForward_HalfLine;
+   REQ_SCR_HBHALF   : Form_Request_Code renames F_HScrollBackward_HalfLine;
+
+   REQ_VALIDATION   : Form_Request_Code renames F_Validate_Field;
+   REQ_NEXT_CHOICE  : Form_Request_Code renames F_Next_Choice;
+   REQ_PREV_CHOICE  : Form_Request_Code renames F_Previous_Choice;
+
+   procedure Request_Name (Key  : Form_Request_Code;
+                           Name : out String);
+
+   function  Request_Name (Key : Form_Request_Code) return String;
+   --  Same as function
+   pragma Inline (Request_Name);
+
+   ------------------
+   --  Exceptions  --
+   ------------------
+   Form_Exception : exception;
+
+   --  MANPAGE(`form_field_new.3x')
+
+   --  ANCHOR(`new_field()',`Create')
+   function Create (Height       : Line_Count;
+                    Width        : Column_Count;
+                    Top          : Line_Position;
+                    Left         : Column_Position;
+                    Off_Screen   : Natural := 0;
+                    More_Buffers : Buffer_Number := Buffer_Number'First)
+                    return Field;
+   --  AKA
+   --  An overloaded Create is defined later. Pragma Inline appears there.
+
+   --  ANCHOR(`new_field()',`New_Field')
+   function New_Field (Height       : Line_Count;
+                       Width        : Column_Count;
+                       Top          : Line_Position;
+                       Left         : Column_Position;
+                       Off_Screen   : Natural := 0;
+                       More_Buffers : Buffer_Number := Buffer_Number'First)
+                       return Field renames Create;
+   --  AKA
+   pragma Inline (New_Field);
+
+   --  ANCHOR(`free_field()',`Delete')
+   procedure Delete (Fld : in out Field);
+   --  AKA
+   --  Reset Fld to Null_Field
+   --  An overloaded Delete is defined later. Pragma Inline appears there.
+
+   --  ANCHOR(`dup_field()',`Duplicate')
+   function Duplicate (Fld  : Field;
+                       Top  : Line_Position;
+                       Left : Column_Position) return Field;
+   --  AKA
+   pragma Inline (Duplicate);
+
+   --  ANCHOR(`link_field()',`Link')
+   function Link (Fld  : Field;
+                  Top  : Line_Position;
+                  Left : Column_Position) return Field;
+   --  AKA
+   pragma Inline (Link);
+
+   --  MANPAGE(`form_field_just.3x')
+
+   --  ANCHOR(`set_field_just()',`Set_Justification')
+   procedure Set_Justification (Fld  : Field;
+                                Just : Field_Justification := None);
+   --  AKA
+   pragma Inline (Set_Justification);
+
+   --  ANCHOR(`field_just()',`Get_Justification')
+   function Get_Justification (Fld : Field) return Field_Justification;
+   --  AKA
+   pragma Inline (Get_Justification);
+
+   --  MANPAGE(`form_field_buffer.3x')
+
+   --  ANCHOR(`set_field_buffer()',`Set_Buffer')
+   procedure Set_Buffer
+     (Fld    : Field;
+      Buffer : Buffer_Number := Buffer_Number'First;
+      Str    : String);
+   --  AKA
+   --  Not inlined
+
+   --  ANCHOR(`field_buffer()',`Get_Buffer')
+   procedure Get_Buffer
+     (Fld    : Field;
+      Buffer : Buffer_Number := Buffer_Number'First;
+      Str    : out String);
+   --  AKA
+
+   function Get_Buffer
+     (Fld    : Field;
+      Buffer : Buffer_Number := Buffer_Number'First) return String;
+   --  AKA
+   --  Same but as function
+   pragma Inline (Get_Buffer);
+
+   --  ANCHOR(`set_field_status()',`Set_Status')
+   procedure Set_Status (Fld    : Field;
+                         Status : Boolean := True);
+   --  AKA
+   pragma Inline (Set_Status);
+
+   --  ANCHOR(`field_status()',`Changed')
+   function Changed (Fld : Field) return Boolean;
+   --  AKA
+   pragma Inline (Changed);
+
+   --  ANCHOR(`set_field_max()',`Set_Maximum_Size')
+   procedure Set_Maximum_Size (Fld : Field;
+                               Max : Natural := 0);
+   --  AKA
+   pragma Inline (Set_Maximum_Size);
+
+   --  MANPAGE(`form_field_opts.3x')
+
+   --  ANCHOR(`set_field_opts()',`Set_Options')
+   procedure Set_Options (Fld     : Field;
+                          Options : Field_Option_Set);
+   --  AKA
+   --  An overloaded version is defined later. Pragma Inline appears there
+
+   --  ANCHOR(`field_opts_on()',`Switch_Options')
+   procedure Switch_Options (Fld     : Field;
+                             Options : Field_Option_Set;
+                             On      : Boolean := True);
+   --  AKA
+   --  ALIAS(`field_opts_off()')
+   --  An overloaded version is defined later. Pragma Inline appears there
+
+   --  ANCHOR(`field_opts()',`Get_Options')
+   procedure Get_Options (Fld     : Field;
+                          Options : out Field_Option_Set);
+   --  AKA
+
+   --  ANCHOR(`field_opts()',`Get_Options')
+   function Get_Options (Fld : Field := Null_Field)
+                         return Field_Option_Set;
+   --  AKA
+   --  An overloaded version is defined later. Pragma Inline appears there
+
+   --  MANPAGE(`form_field_attributes.3x')
+
+   --  ANCHOR(`set_field_fore()',`Set_Foreground')
+   procedure Set_Foreground
+     (Fld   : Field;
+      Fore  : Character_Attribute_Set := Normal_Video;
+      Color : Color_Pair := Color_Pair'First);
+   --  AKA
+   pragma Inline (Set_Foreground);
+
+   --  ANCHOR(`field_fore()',`Foreground')
+   procedure Foreground (Fld  : Field;
+                         Fore : out Character_Attribute_Set);
+   --  AKA
+
+   --  ANCHOR(`field_fore()',`Foreground')
+   procedure Foreground (Fld   : Field;
+                         Fore  : out Character_Attribute_Set;
+                         Color : out Color_Pair);
+   --  AKA
+   pragma Inline (Foreground);
+
+   --  ANCHOR(`set_field_back()',`Set_Background')
+   procedure Set_Background
+     (Fld   : Field;
+      Back  : Character_Attribute_Set := Normal_Video;
+      Color : Color_Pair := Color_Pair'First);
+   --  AKA
+   pragma Inline (Set_Background);
+
+   --  ANCHOR(`field_back()',`Background')
+   procedure Background (Fld  : Field;
+                         Back : out Character_Attribute_Set);
+   --  AKA
+
+   --  ANCHOR(`field_back()',`Background')
+   procedure Background (Fld   : Field;
+                         Back  : out Character_Attribute_Set;
+                         Color : out Color_Pair);
+   --  AKA
+   pragma Inline (Background);
+
+   --  ANCHOR(`set_field_pad()',`Set_Pad_Character')
+   procedure Set_Pad_Character (Fld : Field;
+                                Pad : Character := Space);
+   --  AKA
+   pragma Inline (Set_Pad_Character);
+
+   --  ANCHOR(`field_pad()',`Pad_Character')
+   procedure Pad_Character (Fld : Field;
+                            Pad : out Character);
+   --  AKA
+   pragma Inline (Pad_Character);
+
+   --  MANPAGE(`form_field_info.3x')
+
+   --  ANCHOR(`field_info()',`Info')
+   procedure Info (Fld                : Field;
+                   Lines              : out Line_Count;
+                   Columns            : out Column_Count;
+                   First_Row          : out Line_Position;
+                   First_Column       : out Column_Position;
+                   Off_Screen         : out Natural;
+                   Additional_Buffers : out Buffer_Number);
+   --  AKA
+   pragma Inline (Info);
+
+   --  ANCHOR(`dynamic_field_info()',`Dynamic_Info')
+   procedure Dynamic_Info (Fld     : Field;
+                           Lines   : out Line_Count;
+                           Columns : out Column_Count;
+                           Max     : out Natural);
+   --  AKA
+   pragma Inline (Dynamic_Info);
+
+   --  MANPAGE(`form_win.3x')
+
+   --  ANCHOR(`set_form_win()',`Set_Window')
+   procedure Set_Window (Frm : Form;
+                         Win : Window);
+   --  AKA
+   pragma Inline (Set_Window);
+
+   --  ANCHOR(`form_win()',`Get_Window')
+   function Get_Window (Frm : Form) return Window;
+   --  AKA
+   pragma Inline (Get_Window);
+
+   --  ANCHOR(`set_form_sub()',`Set_Sub_Window')
+   procedure Set_Sub_Window (Frm : Form;
+                             Win : Window);
+   --  AKA
+   pragma Inline (Set_Sub_Window);
+
+   --  ANCHOR(`form_sub()',`Get_Sub_Window')
+   function Get_Sub_Window (Frm : Form) return Window;
+   --  AKA
+   pragma Inline (Get_Sub_Window);
+
+   --  ANCHOR(`scale_form()',`Scale')
+   procedure Scale (Frm     : Form;
+                    Lines   : out Line_Count;
+                    Columns : out Column_Count);
+   --  AKA
+   pragma Inline (Scale);
+
+   --  MANPAGE(`form_hook.3x')
+
+   type Form_Hook_Function is access procedure (Frm : Form);
+   pragma Convention (C, Form_Hook_Function);
+
+   --  ANCHOR(`set_field_init()',`Set_Field_Init_Hook')
+   procedure Set_Field_Init_Hook (Frm  : Form;
+                                  Proc : Form_Hook_Function);
+   --  AKA
+   pragma Inline (Set_Field_Init_Hook);
+
+   --  ANCHOR(`set_field_term()',`Set_Field_Term_Hook')
+   procedure Set_Field_Term_Hook (Frm  : Form;
+                                  Proc : Form_Hook_Function);
+   --  AKA
+   pragma Inline (Set_Field_Term_Hook);
+
+   --  ANCHOR(`set_form_init()',`Set_Form_Init_Hook')
+   procedure Set_Form_Init_Hook (Frm  : Form;
+                                 Proc : Form_Hook_Function);
+   --  AKA
+   pragma Inline (Set_Form_Init_Hook);
+
+   --  ANCHOR(`set_form_term()',`Set_Form_Term_Hook')
+   procedure Set_Form_Term_Hook (Frm  : Form;
+                                 Proc : Form_Hook_Function);
+   --  AKA
+   pragma Inline (Set_Form_Term_Hook);
+
+   --  ANCHOR(`field_init()',`Get_Field_Init_Hook')
+   function Get_Field_Init_Hook (Frm : Form) return Form_Hook_Function;
+   --  AKA
+   pragma Import (C, Get_Field_Init_Hook, "field_init");
+
+   --  ANCHOR(`field_term()',`Get_Field_Term_Hook')
+   function Get_Field_Term_Hook (Frm : Form) return Form_Hook_Function;
+   --  AKA
+   pragma Import (C, Get_Field_Term_Hook, "field_term");
+
+   --  ANCHOR(`form_init()',`Get_Form_Init_Hook')
+   function Get_Form_Init_Hook (Frm : Form) return Form_Hook_Function;
+   --  AKA
+   pragma Import (C, Get_Form_Init_Hook, "form_init");
+
+   --  ANCHOR(`form_term()',`Get_Form_Term_Hook')
+   function Get_Form_Term_Hook (Frm : Form) return Form_Hook_Function;
+   --  AKA
+   pragma Import (C, Get_Form_Term_Hook, "form_term");
+
+   --  MANPAGE(`form_field.3x')
+
+   --  ANCHOR(`set_form_fields()',`Redefine')
+   procedure Redefine (Frm  : Form;
+                       Flds : Field_Array_Access);
+   --  AKA
+   pragma Inline (Redefine);
+
+   --  ANCHOR(`set_form_fields()',`Set_Fields')
+   procedure Set_Fields (Frm  : Form;
+                         Flds : Field_Array_Access) renames Redefine;
+   --  AKA
+   --  pragma Inline (Set_Fields);
+
+   --  ANCHOR(`form_fields()',`Fields')
+   function Fields (Frm   : Form;
+                    Index : Positive) return Field;
+   --  AKA
+   pragma Inline (Fields);
+
+   --  ANCHOR(`field_count()',`Field_Count')
+   function Field_Count (Frm : Form) return Natural;
+   --  AKA
+   pragma Inline (Field_Count);
+
+   --  ANCHOR(`move_field()',`Move')
+   procedure Move (Fld    : Field;
+                   Line   : Line_Position;
+                   Column : Column_Position);
+   --  AKA
+   pragma Inline (Move);
+
+   --  MANPAGE(`form_new.3x')
+
+   --  ANCHOR(`new_form()',`Create')
+   function Create (Fields : Field_Array_Access) return Form;
+   --  AKA
+   pragma Inline (Create);
+
+   --  ANCHOR(`new_form()',`New_Form')
+   function New_Form (Fields : Field_Array_Access) return Form
+     renames Create;
+   --  AKA
+   --  pragma Inline (New_Form);
+
+   --  ANCHOR(`free_form()',`Delete')
+   procedure Delete (Frm : in out Form);
+   --  AKA
+   --  Reset Frm to Null_Form
+   pragma Inline (Delete);
+
+   --  MANPAGE(`form_opts.3x')
+
+   --  ANCHOR(`set_form_opts()',`Set_Options')
+   procedure Set_Options (Frm     : Form;
+                          Options : Form_Option_Set);
+   --  AKA
+   pragma Inline (Set_Options);
+
+   --  ANCHOR(`form_opts_on()',`Switch_Options')
+   procedure Switch_Options (Frm     : Form;
+                             Options : Form_Option_Set;
+                             On      : Boolean := True);
+   --  AKA
+   --  ALIAS(`form_opts_off()')
+   pragma Inline (Switch_Options);
+
+   --  ANCHOR(`form_opts()',`Get_Options')
+   procedure Get_Options (Frm     : Form;
+                          Options : out Form_Option_Set);
+   --  AKA
+
+   --  ANCHOR(`form_opts()',`Get_Options')
+   function Get_Options (Frm : Form := Null_Form) return Form_Option_Set;
+   --  AKA
+   pragma Inline (Get_Options);
+
+   --  MANPAGE(`form_post.3x')
+
+   --  ANCHOR(`post_form()',`Post')
+   procedure Post (Frm  : Form;
+                   Post : Boolean := True);
+   --  AKA
+   --  ALIAS(`unpost_form()')
+   pragma Inline (Post);
+
+   --  MANPAGE(`form_cursor.3x')
+
+   --  ANCHOR(`pos_form_cursor()',`Position_Cursor')
+   procedure Position_Cursor (Frm : Form);
+   --  AKA
+   pragma Inline (Position_Cursor);
+
+   --  MANPAGE(`form_data.3x')
+
+   --  ANCHOR(`data_ahead()',`Data_Ahead')
+   function Data_Ahead (Frm : Form) return Boolean;
+   --  AKA
+   pragma Inline (Data_Ahead);
+
+   --  ANCHOR(`data_behind()',`Data_Behind')
+   function Data_Behind (Frm : Form) return Boolean;
+   --  AKA
+   pragma Inline (Data_Behind);
+
+   --  MANPAGE(`form_driver.3x')
+
+   type Driver_Result is (Form_Ok,
+                          Request_Denied,
+                          Unknown_Request,
+                          Invalid_Field);
+
+   --  ANCHOR(`form_driver()',`Driver')
+   function Driver (Frm : Form;
+                    Key : Key_Code) return Driver_Result;
+   --  AKA
+   --  Driver not inlined
+
+   --  MANPAGE(`form_page.3x')
+
+   type Page_Number is new Natural;
+
+   --  ANCHOR(`set_current_field()',`Set_Current')
+   procedure Set_Current (Frm : Form;
+                          Fld : Field);
+   --  AKA
+   pragma Inline (Set_Current);
+
+   --  ANCHOR(`current_field()',`Current')
+   function Current (Frm : Form) return Field;
+   --  AKA
+   pragma Inline (Current);
+
+   --  ANCHOR(`set_form_page()',`Set_Page')
+   procedure Set_Page (Frm  : Form;
+                       Page : Page_Number := Page_Number'First);
+   --  AKA
+   pragma Inline (Set_Page);
+
+   --  ANCHOR(`form_page()',`Page')
+   function Page (Frm : Form) return Page_Number;
+   --  AKA
+   pragma Inline (Page);
+
+   --  ANCHOR(`field_index()',`Get_Index')
+   function Get_Index (Fld : Field) return Positive;
+   --  AKA
+   --  Please note that in this binding we start the numbering of fields
+   --  with 1. So this is number is one more than you get from the low
+   --  level call.
+   pragma Inline (Get_Index);
+
+   --  MANPAGE(`form_new_page.3x')
+
+   --  ANCHOR(`set_new_page()',`Set_New_Page')
+   procedure Set_New_Page (Fld      : Field;
+                           New_Page : Boolean := True);
+   --  AKA
+   pragma Inline (Set_New_Page);
+
+   --  ANCHOR(`new_page()',`Is_New_Page')
+   function Is_New_Page (Fld : Field) return Boolean;
+   --  AKA
+   pragma Inline (Is_New_Page);
+
+   --  MANPAGE(`form_requestname.3x')
+   --  Not Implemented: form_request_name, form_request_by_name
+
+------------------------------------------------------------------------------
+private
+   type Field is new System.Storage_Elements.Integer_Address;
+   type Form  is new System.Storage_Elements.Integer_Address;
+
+   Null_Field : constant Field := 0;
+   Null_Form  : constant Form  := 0;
+
+end Terminal_Interface.Curses.Forms;
diff --git a/Ada95/gen/terminal_interface-curses-menus-item_user_data.ads.m4 b/Ada95/gen/terminal_interface-curses-menus-item_user_data.ads.m4
new file mode 100644
index 0000000..57dc963
--- /dev/null
+++ b/Ada95/gen/terminal_interface-curses-menus-item_user_data.ads.m4
@@ -0,0 +1,76 @@
+--  -*- ada -*-
+define(`HTMLNAME',`terminal_interface-curses-menus-item_user_data__ads.htm')dnl
+include(M4MACRO)dnl
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--               Terminal_Interface.Curses.Menus.Item_User_Data             --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2006,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.18 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+
+generic
+   type User is limited private;
+   type User_Access is access User;
+package Terminal_Interface.Curses.Menus.Item_User_Data is
+   pragma Preelaborate (Terminal_Interface.Curses.Menus.Item_User_Data);
+
+   --  The binding uses the same user pointer for menu items
+   --  as the low level C implementation. So you can safely
+   --  read or write the user pointer also with the C routines
+   --
+   --  MANPAGE(`mitem_userptr.3x')
+
+   --  ANCHOR(`set_item_userptr',`Set_User_Data')
+   procedure Set_User_Data (Itm  : Item;
+                            Data : User_Access);
+   --  AKA
+   pragma Inline (Set_User_Data);
+
+   --  ANCHOR(`item_userptr',`Get_User_Data')
+   procedure Get_User_Data (Itm  : Item;
+                            Data : out User_Access);
+   --  AKA
+
+   --  ANCHOR(`item_userptr',`Get_User_Data')
+   function Get_User_Data (Itm  : Item) return User_Access;
+   --  AKA
+   --  Same as function
+   pragma Inline (Get_User_Data);
+
+end Terminal_Interface.Curses.Menus.Item_User_Data;
diff --git a/Ada95/gen/terminal_interface-curses-menus-menu_user_data.ads.m4 b/Ada95/gen/terminal_interface-curses-menus-menu_user_data.ads.m4
new file mode 100644
index 0000000..af8ae12
--- /dev/null
+++ b/Ada95/gen/terminal_interface-curses-menus-menu_user_data.ads.m4
@@ -0,0 +1,71 @@
+--  -*- ada -*-
+define(`HTMLNAME',`terminal_interface-curses-menus-menu_user_data__ads.htm')dnl
+include(M4MACRO)dnl
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--               Terminal_Interface.Curses.Menus.Menu_User_Data             --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2003,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.16 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+
+generic
+   type User is limited private;
+   type User_Access is access User;
+package Terminal_Interface.Curses.Menus.Menu_User_Data is
+   pragma Preelaborate (Terminal_Interface.Curses.Menus.Menu_User_Data);
+
+   --  MANPAGE(`menu_userptr.3x')
+
+   --  ANCHOR(`set_menu_userptr',`Set_User_Data')
+   procedure Set_User_Data (Men  : Menu;
+                            Data : User_Access);
+   --  AKA
+   pragma Inline (Set_User_Data);
+
+   --  ANCHOR(`menu_userptr',`Get_User_Data')
+   procedure Get_User_Data (Men  : Menu;
+                            Data : out User_Access);
+   --  AKA
+
+   --  ANCHOR(`menu_userptr',`Get_User_Data')
+   function Get_User_Data (Men  : Menu) return User_Access;
+   --  AKA
+   --  Same as function
+   pragma Inline (Get_User_Data);
+
+end Terminal_Interface.Curses.Menus.Menu_User_Data;
diff --git a/Ada95/gen/terminal_interface-curses-menus.ads.m4 b/Ada95/gen/terminal_interface-curses-menus.ads.m4
new file mode 100644
index 0000000..6914c16
--- /dev/null
+++ b/Ada95/gen/terminal_interface-curses-menus.ads.m4
@@ -0,0 +1,639 @@
+--  -*- ada -*-
+define(`HTMLNAME',`terminal_interface-curses-menus__ads.htm')dnl
+include(M4MACRO)dnl
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                      Terminal_Interface.Curses.Menu                      --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2009,2014 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.32 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with System;
+with Ada.Characters.Latin_1;
+
+package Terminal_Interface.Curses.Menus is
+   pragma Preelaborate (Terminal_Interface.Curses.Menus);
+   pragma Linker_Options ("-lmenu" & Curses_Constants.DFT_ARG_SUFFIX);
+
+   Space : Character renames Ada.Characters.Latin_1.Space;
+
+   type Item is private;
+   type Menu is private;
+
+   ---------------------------
+   --  Interface constants  --
+   ---------------------------
+   Null_Item : constant Item;
+   Null_Menu : constant Menu;
+
+   subtype Menu_Request_Code is Key_Code
+     range (Key_Max + 1) .. (Key_Max + 17);
+
+   --  The prefix M_ stands for "Menu Request"
+   M_Left_Item       : constant Menu_Request_Code := Key_Max + 1;
+   M_Right_Item      : constant Menu_Request_Code := Key_Max + 2;
+   M_Up_Item         : constant Menu_Request_Code := Key_Max + 3;
+   M_Down_Item       : constant Menu_Request_Code := Key_Max + 4;
+   M_ScrollUp_Line   : constant Menu_Request_Code := Key_Max + 5;
+   M_ScrollDown_Line : constant Menu_Request_Code := Key_Max + 6;
+   M_ScrollDown_Page : constant Menu_Request_Code := Key_Max + 7;
+   M_ScrollUp_Page   : constant Menu_Request_Code := Key_Max + 8;
+   M_First_Item      : constant Menu_Request_Code := Key_Max + 9;
+   M_Last_Item       : constant Menu_Request_Code := Key_Max + 10;
+   M_Next_Item       : constant Menu_Request_Code := Key_Max + 11;
+   M_Previous_Item   : constant Menu_Request_Code := Key_Max + 12;
+   M_Toggle_Item     : constant Menu_Request_Code := Key_Max + 13;
+   M_Clear_Pattern   : constant Menu_Request_Code := Key_Max + 14;
+   M_Back_Pattern    : constant Menu_Request_Code := Key_Max + 15;
+   M_Next_Match      : constant Menu_Request_Code := Key_Max + 16;
+   M_Previous_Match  : constant Menu_Request_Code := Key_Max + 17;
+
+   --  For those who like the old 'C' names for the request codes
+   REQ_LEFT_ITEM     : Menu_Request_Code renames M_Left_Item;
+   REQ_RIGHT_ITEM    : Menu_Request_Code renames M_Right_Item;
+   REQ_UP_ITEM       : Menu_Request_Code renames M_Up_Item;
+   REQ_DOWN_ITEM     : Menu_Request_Code renames M_Down_Item;
+   REQ_SCR_ULINE     : Menu_Request_Code renames M_ScrollUp_Line;
+   REQ_SCR_DLINE     : Menu_Request_Code renames M_ScrollDown_Line;
+   REQ_SCR_DPAGE     : Menu_Request_Code renames M_ScrollDown_Page;
+   REQ_SCR_UPAGE     : Menu_Request_Code renames M_ScrollUp_Page;
+   REQ_FIRST_ITEM    : Menu_Request_Code renames M_First_Item;
+   REQ_LAST_ITEM     : Menu_Request_Code renames M_Last_Item;
+   REQ_NEXT_ITEM     : Menu_Request_Code renames M_Next_Item;
+   REQ_PREV_ITEM     : Menu_Request_Code renames M_Previous_Item;
+   REQ_TOGGLE_ITEM   : Menu_Request_Code renames M_Toggle_Item;
+   REQ_CLEAR_PATTERN : Menu_Request_Code renames M_Clear_Pattern;
+   REQ_BACK_PATTERN  : Menu_Request_Code renames M_Back_Pattern;
+   REQ_NEXT_MATCH    : Menu_Request_Code renames M_Next_Match;
+   REQ_PREV_MATCH    : Menu_Request_Code renames M_Previous_Match;
+
+   procedure Request_Name (Key  : Menu_Request_Code;
+                           Name : out String);
+
+   function  Request_Name (Key : Menu_Request_Code) return String;
+   --  Same as function
+
+   ------------------
+   --  Exceptions  --
+   ------------------
+
+   Menu_Exception : exception;
+   --
+   --  Menu options
+   --
+   type Menu_Option_Set is
+      record
+         One_Valued        : Boolean;
+         Show_Descriptions : Boolean;
+         Row_Major_Order   : Boolean;
+         Ignore_Case       : Boolean;
+         Show_Matches      : Boolean;
+         Non_Cyclic        : Boolean;
+      end record;
+   pragma Convention (C_Pass_By_Copy, Menu_Option_Set);
+
+   for Menu_Option_Set use
+      record
+         One_Valued        at 0 range Curses_Constants.O_ONEVALUE_First
+           .. Curses_Constants.O_ONEVALUE_Last;
+         Show_Descriptions at 0 range Curses_Constants.O_SHOWDESC_First
+           .. Curses_Constants.O_SHOWDESC_Last;
+         Row_Major_Order   at 0 range Curses_Constants.O_ROWMAJOR_First
+           .. Curses_Constants.O_ROWMAJOR_Last;
+         Ignore_Case       at 0 range Curses_Constants.O_IGNORECASE_First
+           .. Curses_Constants.O_IGNORECASE_Last;
+         Show_Matches      at 0 range Curses_Constants.O_SHOWMATCH_First
+           .. Curses_Constants.O_SHOWMATCH_Last;
+         Non_Cyclic        at 0 range Curses_Constants.O_NONCYCLIC_First
+           .. Curses_Constants.O_NONCYCLIC_Last;
+      end record;
+   pragma Warnings (Off);
+   for Menu_Option_Set'Size use Curses_Constants.Menu_Options_Size;
+   pragma Warnings (On);
+
+   function Default_Menu_Options return Menu_Option_Set;
+   --  Initial default options for a menu.
+   pragma Inline (Default_Menu_Options);
+   --
+   --  Item options
+   --
+   type Item_Option_Set is
+      record
+         Selectable : Boolean;
+      end record;
+   pragma Convention (C_Pass_By_Copy, Item_Option_Set);
+
+   for Item_Option_Set use
+      record
+         Selectable at 0 range Curses_Constants.O_SELECTABLE_First
+           ..  Curses_Constants.O_SELECTABLE_Last;
+      end record;
+   pragma Warnings (Off);
+   for Item_Option_Set'Size use Curses_Constants.Item_Options_Size;
+   pragma Warnings (On);
+
+   function Default_Item_Options return Item_Option_Set;
+   --  Initial default options for an item.
+   pragma Inline (Default_Item_Options);
+
+   --
+   --  Item Array
+   --
+   type Item_Array is array (Positive range <>) of aliased Item;
+   pragma Convention (C, Item_Array);
+
+   type Item_Array_Access is access Item_Array;
+
+   procedure Free (IA         : in out Item_Array_Access;
+                   Free_Items : Boolean := False);
+   --  Release the memory for an allocated item array
+   --  If Free_Items is True, call Delete() for all the items in
+   --  the array.
+
+   --  MANPAGE(`mitem_new.3x')
+
+   --  ANCHOR(`new_item()',`Create')
+   function Create (Name        : String;
+                    Description : String := "") return Item;
+   --  AKA
+   --  Not inlined.
+
+   --  ANCHOR(`new_item()',`New_Item')
+   function New_Item (Name        : String;
+                      Description : String := "") return Item
+     renames Create;
+   --  AKA
+
+   --  ANCHOR(`free_item()',`Delete')
+   procedure Delete (Itm : in out Item);
+   --  AKA
+   --  Resets Itm to Null_Item
+
+   --  MANPAGE(`mitem_value.3x')
+
+   --  ANCHOR(`set_item_value()',`Set_Value')
+   procedure Set_Value (Itm   : Item;
+                        Value : Boolean := True);
+   --  AKA
+   pragma Inline (Set_Value);
+
+   --  ANCHOR(`item_value()',`Value')
+   function Value (Itm : Item) return Boolean;
+   --  AKA
+   pragma Inline (Value);
+
+   --  MANPAGE(`mitem_visible.3x')
+
+   --  ANCHOR(`item_visible()',`Visible')
+   function Visible (Itm : Item) return Boolean;
+   --  AKA
+   pragma Inline (Visible);
+
+   --  MANPAGE(`mitem_opts.3x')
+
+   --  ANCHOR(`set_item_opts()',`Set_Options')
+   procedure Set_Options (Itm     : Item;
+                          Options : Item_Option_Set);
+   --  AKA
+   --  An overloaded Set_Options is defined later. Pragma Inline appears there
+
+   --  ANCHOR(`item_opts_on()',`Switch_Options')
+   procedure Switch_Options (Itm     : Item;
+                             Options : Item_Option_Set;
+                             On      : Boolean := True);
+   --  AKA
+   --  ALIAS(`item_opts_off()')
+   --  An overloaded Switch_Options is defined later.
+   --  Pragma Inline appears there
+
+   --  ANCHOR(`item_opts()',`Get_Options')
+   procedure Get_Options (Itm     : Item;
+                          Options : out Item_Option_Set);
+   --  AKA
+
+   --  ANCHOR(`item_opts()',`Get_Options')
+   function Get_Options (Itm : Item := Null_Item) return Item_Option_Set;
+   --  AKA
+   --  An overloaded Get_Options is defined later. Pragma Inline appears there
+
+   --  MANPAGE(`mitem_name.3x')
+
+   --  ANCHOR(`item_name()',`Name')
+   procedure Name (Itm  : Item;
+                   Name : out String);
+   --  AKA
+   function  Name (Itm : Item) return String;
+   --  AKA
+   --  Implemented as function
+   pragma Inline (Name);
+
+   --  ANCHOR(`item_description();',`Description')
+   procedure Description (Itm         : Item;
+                          Description : out String);
+   --  AKA
+
+   function  Description (Itm : Item) return String;
+   --  AKA
+   --  Implemented as function
+   pragma Inline (Description);
+
+   --  MANPAGE(`mitem_current.3x')
+
+   --  ANCHOR(`set_current_item()',`Set_Current')
+   procedure Set_Current (Men : Menu;
+                          Itm : Item);
+   --  AKA
+   pragma Inline (Set_Current);
+
+   --  ANCHOR(`current_item()',`Current')
+   function Current (Men : Menu) return Item;
+   --  AKA
+   pragma Inline (Current);
+
+   --  ANCHOR(`set_top_row()',`Set_Top_Row')
+   procedure Set_Top_Row (Men  : Menu;
+                          Line : Line_Position);
+   --  AKA
+   pragma Inline (Set_Top_Row);
+
+   --  ANCHOR(`top_row()',`Top_Row')
+   function Top_Row (Men : Menu) return Line_Position;
+   --  AKA
+   pragma Inline (Top_Row);
+
+   --  ANCHOR(`item_index()',`Get_Index')
+   function Get_Index (Itm : Item) return Positive;
+   --  AKA
+   --  Please note that in this binding we start the numbering of items
+   --  with 1. So this is number is one more than you get from the low
+   --  level call.
+   pragma Inline (Get_Index);
+
+   --  MANPAGE(`menu_post.3x')
+
+   --  ANCHOR(`post_menu()',`Post')
+   procedure Post (Men  : Menu;
+                   Post : Boolean := True);
+   --  AKA
+   --  ALIAS(`unpost_menu()')
+   pragma Inline (Post);
+
+   --  MANPAGE(`menu_opts.3x')
+
+   --  ANCHOR(`set_menu_opts()',`Set_Options')
+   procedure Set_Options (Men     : Menu;
+                          Options : Menu_Option_Set);
+   --  AKA
+   pragma Inline (Set_Options);
+
+   --  ANCHOR(`menu_opts_on()',`Switch_Options')
+   procedure Switch_Options (Men     : Menu;
+                             Options : Menu_Option_Set;
+                             On      : Boolean := True);
+   --  AKA
+   --  ALIAS(`menu_opts_off()')
+   pragma Inline (Switch_Options);
+
+   --  ANCHOR(`menu_opts()',`Get_Options')
+   procedure Get_Options (Men     : Menu;
+                          Options : out Menu_Option_Set);
+   --  AKA
+
+   --  ANCHOR(`menu_opts()',`Get_Options')
+   function Get_Options (Men : Menu := Null_Menu) return Menu_Option_Set;
+   --  AKA
+   pragma Inline (Get_Options);
+
+   --  MANPAGE(`menu_win.3x')
+
+   --  ANCHOR(`set_menu_win()',`Set_Window')
+   procedure Set_Window (Men : Menu;
+                         Win : Window);
+   --  AKA
+   pragma Inline (Set_Window);
+
+   --  ANCHOR(`menu_win()',`Get_Window')
+   function Get_Window (Men : Menu) return Window;
+   --  AKA
+   pragma Inline (Get_Window);
+
+   --  ANCHOR(`set_menu_sub()',`Set_Sub_Window')
+   procedure Set_Sub_Window (Men : Menu;
+                             Win : Window);
+   --  AKA
+   pragma Inline (Set_Sub_Window);
+
+   --  ANCHOR(`menu_sub()',`Get_Sub_Window')
+   function Get_Sub_Window (Men : Menu) return Window;
+   --  AKA
+   pragma Inline (Get_Sub_Window);
+
+   --  ANCHOR(`scale_menu()',`Scale')
+   procedure Scale (Men     : Menu;
+                    Lines   : out Line_Count;
+                    Columns : out Column_Count);
+   --  AKA
+   pragma Inline (Scale);
+
+   --  MANPAGE(`menu_cursor.3x')
+
+   --  ANCHOR(`pos_menu_cursor()',`Position_Cursor')
+   procedure Position_Cursor (Men : Menu);
+   --  AKA
+   pragma Inline (Position_Cursor);
+
+   --  MANPAGE(`menu_mark.3x')
+
+   --  ANCHOR(`set_menu_mark()',`Set_Mark')
+   procedure Set_Mark (Men  : Menu;
+                       Mark : String);
+   --  AKA
+   pragma Inline (Set_Mark);
+
+   --  ANCHOR(`menu_mark()',`Mark')
+   procedure Mark (Men  : Menu;
+                   Mark : out String);
+   --  AKA
+
+   function  Mark (Men : Menu) return String;
+   --  AKA
+   --  Implemented as function
+   pragma Inline (Mark);
+
+   --  MANPAGE(`menu_attributes.3x')
+
+   --  ANCHOR(`set_menu_fore()',`Set_Foreground')
+   procedure Set_Foreground
+     (Men   : Menu;
+      Fore  : Character_Attribute_Set := Normal_Video;
+      Color : Color_Pair := Color_Pair'First);
+   --  AKA
+   pragma Inline (Set_Foreground);
+
+   --  ANCHOR(`menu_fore()',`Foreground')
+   procedure Foreground (Men   : Menu;
+                         Fore  : out Character_Attribute_Set);
+   --  AKA
+
+   --  ANCHOR(`menu_fore()',`Foreground')
+   procedure Foreground (Men   : Menu;
+                         Fore  : out Character_Attribute_Set;
+                         Color : out Color_Pair);
+   --  AKA
+   pragma Inline (Foreground);
+
+   --  ANCHOR(`set_menu_back()',`Set_Background')
+   procedure Set_Background
+     (Men   : Menu;
+      Back  : Character_Attribute_Set := Normal_Video;
+      Color : Color_Pair := Color_Pair'First);
+   --  AKA
+   pragma Inline (Set_Background);
+
+   --  ANCHOR(`menu_back()',`Background')
+   procedure Background (Men  : Menu;
+                         Back : out Character_Attribute_Set);
+   --  AKA
+   --  ANCHOR(`menu_back()',`Background')
+
+   procedure Background (Men   : Menu;
+                         Back  : out Character_Attribute_Set;
+                         Color : out Color_Pair);
+   --  AKA
+   pragma Inline (Background);
+
+   --  ANCHOR(`set_menu_grey()',`Set_Grey')
+   procedure Set_Grey
+     (Men   : Menu;
+      Grey  : Character_Attribute_Set := Normal_Video;
+      Color : Color_Pair := Color_Pair'First);
+   --  AKA
+   pragma Inline (Set_Grey);
+
+   --  ANCHOR(`menu_grey()',`Grey')
+   procedure Grey (Men  : Menu;
+                   Grey : out Character_Attribute_Set);
+   --  AKA
+
+   --  ANCHOR(`menu_grey()',`Grey')
+   procedure Grey
+     (Men   : Menu;
+      Grey  : out Character_Attribute_Set;
+      Color : out Color_Pair);
+   --  AKA
+   pragma Inline (Grey);
+
+   --  ANCHOR(`set_menu_pad()',`Set_Pad_Character')
+   procedure Set_Pad_Character (Men : Menu;
+                                Pad : Character := Space);
+   --  AKA
+   pragma Inline (Set_Pad_Character);
+
+   --  ANCHOR(`menu_pad()',`Pad_Character')
+   procedure Pad_Character (Men : Menu;
+                            Pad : out Character);
+   --  AKA
+   pragma Inline (Pad_Character);
+
+   --  MANPAGE(`menu_spacing.3x')
+
+   --  ANCHOR(`set_menu_spacing()',`Set_Spacing')
+   procedure Set_Spacing (Men   : Menu;
+                          Descr : Column_Position := 0;
+                          Row   : Line_Position   := 0;
+                          Col   : Column_Position := 0);
+   --  AKA
+   pragma Inline (Set_Spacing);
+
+   --  ANCHOR(`menu_spacing()',`Spacing')
+   procedure Spacing (Men   : Menu;
+                      Descr : out Column_Position;
+                      Row   : out Line_Position;
+                      Col   : out Column_Position);
+   --  AKA
+   pragma Inline (Spacing);
+
+   --  MANPAGE(`menu_pattern.3x')
+
+   --  ANCHOR(`set_menu_pattern()',`Set_Pattern')
+   function Set_Pattern (Men  : Menu;
+                         Text : String) return Boolean;
+   --  AKA
+   --  Return TRUE if the pattern matches, FALSE otherwise
+   pragma Inline (Set_Pattern);
+
+   --  ANCHOR(`menu_pattern()',`Pattern')
+   procedure Pattern (Men  : Menu;
+                      Text : out String);
+   --  AKA
+   pragma Inline (Pattern);
+
+   --  MANPAGE(`menu_format.3x')
+
+   --  ANCHOR(`set_menu_format()',`Set_Format')
+   procedure Set_Format (Men     : Menu;
+                         Lines   : Line_Count;
+                         Columns : Column_Count);
+   --  Not implemented: 0 argument for Lines or Columns;
+   --  instead use Format to get the current sizes
+   --      The  default  format  is  16  rows,  1  column.    Calling
+   --      set_menu_format  with a null menu pointer will change this
+   --      default.  A zero row or column argument to set_menu_format
+   --      is  interpreted  as  a  request  not to change the current
+   --      value.
+   --  AKA
+   pragma Inline (Set_Format);
+
+   --  ANCHOR(`menu_format()',`Format')
+   procedure Format (Men     : Menu;
+                     Lines   : out Line_Count;
+                     Columns : out Column_Count);
+   --  AKA
+   pragma Inline (Format);
+
+   --  MANPAGE(`menu_hook.3x')
+
+   type Menu_Hook_Function is access procedure (Men : Menu);
+   pragma Convention (C, Menu_Hook_Function);
+
+   --  ANCHOR(`set_item_init()',`Set_Item_Init_Hook')
+   procedure Set_Item_Init_Hook (Men  : Menu;
+                                 Proc : Menu_Hook_Function);
+   --  AKA
+   pragma Inline (Set_Item_Init_Hook);
+
+   --  ANCHOR(`set_item_term()',`Set_Item_Term_Hook')
+   procedure Set_Item_Term_Hook (Men  : Menu;
+                                 Proc : Menu_Hook_Function);
+   --  AKA
+   pragma Inline (Set_Item_Term_Hook);
+
+   --  ANCHOR(`set_menu_init()',`Set_Menu_Init_Hook')
+   procedure Set_Menu_Init_Hook (Men  : Menu;
+                                 Proc : Menu_Hook_Function);
+   --  AKA
+   pragma Inline (Set_Menu_Init_Hook);
+
+   --  ANCHOR(`set_menu_term()',`Set_Menu_Term_Hook')
+   procedure Set_Menu_Term_Hook (Men  : Menu;
+                                 Proc : Menu_Hook_Function);
+   --  AKA
+   pragma Inline (Set_Menu_Term_Hook);
+
+   --  ANCHOR(`item_init()',`Get_Item_Init_Hook')
+   function Get_Item_Init_Hook (Men : Menu) return Menu_Hook_Function;
+   --  AKA
+   pragma Inline (Get_Item_Init_Hook);
+
+   --  ANCHOR(`item_term()',`Get_Item_Term_Hook')
+   function Get_Item_Term_Hook (Men : Menu) return Menu_Hook_Function;
+   --  AKA
+   pragma Inline (Get_Item_Term_Hook);
+
+   --  ANCHOR(`menu_init()',`Get_Menu_Init_Hook')
+   function Get_Menu_Init_Hook (Men : Menu) return Menu_Hook_Function;
+   --  AKA
+   pragma Inline (Get_Menu_Init_Hook);
+
+   --  ANCHOR(`menu_term()',`Get_Menu_Term_Hook')
+   function Get_Menu_Term_Hook (Men : Menu) return Menu_Hook_Function;
+   --  AKA
+   pragma Inline (Get_Menu_Term_Hook);
+
+   --  MANPAGE(`menu_items.3x')
+
+   --  ANCHOR(`set_menu_items()',`Redefine')
+   procedure Redefine (Men   : Menu;
+                       Items : Item_Array_Access);
+   --  AKA
+   pragma Inline (Redefine);
+
+   procedure Set_Items (Men   : Menu;
+                        Items : Item_Array_Access) renames Redefine;
+   --  pragma Inline (Set_Items);
+
+   --  ANCHOR(`menu_items()',`Items')
+   function Items (Men   : Menu;
+                   Index : Positive) return Item;
+   --  AKA
+   pragma Inline (Items);
+
+   --  ANCHOR(`item_count()',`Item_Count')
+   function Item_Count (Men : Menu) return Natural;
+   --  AKA
+   pragma Inline (Item_Count);
+
+   --  MANPAGE(`menu_new.3x')
+
+   --  ANCHOR(`new_menu()',`Create')
+   function Create (Items : Item_Array_Access) return Menu;
+   --  AKA
+   --  Not inlined
+
+   function New_Menu (Items : Item_Array_Access) return Menu renames Create;
+
+   --  ANCHOR(`free_menu()',`Delete')
+   procedure Delete (Men : in out Menu);
+   --  AKA
+   --  Reset Men to Null_Menu
+   --  Not inlined
+
+   --  MANPAGE(`menu_driver.3x')
+
+   type Driver_Result is (Menu_Ok,
+                          Request_Denied,
+                          Unknown_Request,
+                          No_Match);
+
+   --  ANCHOR(`menu_driver()',`Driver')
+   function Driver (Men : Menu;
+                    Key : Key_Code) return Driver_Result;
+   --  AKA
+   --  Driver is not inlined
+
+   --  ANCHOR(`menu_requestname.3x')
+   --  Not Implemented: menu_request_name, menu_request_by_name
+-------------------------------------------------------------------------------
+private
+   type Item   is new System.Storage_Elements.Integer_Address;
+   type Menu   is new System.Storage_Elements.Integer_Address;
+
+   Null_Item : constant Item := 0;
+   Null_Menu : constant Menu := 0;
+
+end Terminal_Interface.Curses.Menus;
diff --git a/Ada95/gen/terminal_interface-curses-mouse.ads.m4 b/Ada95/gen/terminal_interface-curses-mouse.ads.m4
new file mode 100644
index 0000000..6506b4e
--- /dev/null
+++ b/Ada95/gen/terminal_interface-curses-mouse.ads.m4
@@ -0,0 +1,204 @@
+--  -*- ada -*-
+define(`HTMLNAME',`terminal_interface-curses-mouse__ads.htm')dnl
+include(M4MACRO)dnl
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                      Terminal_Interface.Curses.Mouse                     --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2014,2015 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.33 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with System;
+
+package Terminal_Interface.Curses.Mouse is
+   pragma Preelaborate (Terminal_Interface.Curses.Mouse);
+
+   --  MANPAGE(`curs_mouse.3x')
+   --  mouse_trafo, wmouse_trafo are implemented as Transform_Coordinates
+   --  in the parent package.
+   --
+   --  Not implemented:
+   --  REPORT_MOUSE_POSITION (i.e. as a parameter to Register_Reportable_Event
+   --  or Start_Mouse)
+   type Event_Mask is private;
+   No_Events  : constant Event_Mask;
+   All_Events : constant Event_Mask;
+
+   type Mouse_Button is (Left,     -- aka: Button 1
+                         Middle,   -- aka: Button 2
+                         Right,    -- aka: Button 3
+                         Button4,  -- aka: Button 4
+                         Control,  -- Control Key
+                         Shift,    -- Shift Key
+                         Alt);     -- ALT Key
+
+   subtype Real_Buttons  is Mouse_Button range Left .. Button4;
+   subtype Modifier_Keys is Mouse_Button range Control .. Alt;
+
+   type Button_State is (Released,
+                         Pressed,
+                         Clicked,
+                         Double_Clicked,
+                         Triple_Clicked);
+
+   type Button_States is array (Button_State) of Boolean;
+   pragma Pack (Button_States);
+
+   All_Clicks : constant Button_States := (Clicked .. Triple_Clicked => True,
+                                           others => False);
+   All_States : constant Button_States := (others => True);
+
+   type Mouse_Event is private;
+
+   --  MANPAGE(`curs_mouse.3x')
+
+   function Has_Mouse return Boolean;
+   --  Return true if a mouse device is supported, false otherwise.
+
+   procedure Register_Reportable_Event
+     (Button : Mouse_Button;
+      State  : Button_State;
+      Mask   : in out Event_Mask);
+   --  Stores the event described by the button and the state in the mask.
+   --  Before you call this the first time, you should initialize the mask
+   --  with the Empty_Mask constant
+   pragma Inline (Register_Reportable_Event);
+
+   procedure Register_Reportable_Events
+     (Button : Mouse_Button;
+      State  : Button_States;
+      Mask   : in out Event_Mask);
+   --  Register all events described by the Button and the State bitmap.
+   --  Before you call this the first time, you should initialize the mask
+   --  with the Empty_Mask constant
+
+   --  ANCHOR(`mousemask()',`Start_Mouse')
+   --  There is one difference to mousmask(): we return the value of the
+   --  old mask, that means the event mask value before this call.
+   --  Not Implemented: The library version
+   --  returns a Mouse_Mask that tells which events are reported.
+   function Start_Mouse (Mask : Event_Mask := All_Events)
+                         return Event_Mask;
+   --  AKA
+   pragma Inline (Start_Mouse);
+
+   procedure End_Mouse (Mask : Event_Mask := No_Events);
+   --  Terminates the mouse, restores the specified event mask
+   pragma Inline (End_Mouse);
+
+   --  ANCHOR(`getmouse()',`Get_Mouse')
+   function Get_Mouse return Mouse_Event;
+   --  AKA
+   pragma Inline (Get_Mouse);
+
+   procedure Get_Event (Event  : Mouse_Event;
+                        Y      : out Line_Position;
+                        X      : out Column_Position;
+                        Button : out Mouse_Button;
+                        State  : out Button_State);
+   --  !!! Warning: X and Y are screen coordinates. Due to ripped of lines they
+   --  may not be identical to window coordinates.
+   --  Not Implemented: Get_Event only reports one event, the C library
+   --  version supports multiple events, e.g. {click-1, click-3}
+   pragma Inline (Get_Event);
+
+   --  ANCHOR(`ungetmouse()',`Unget_Mouse')
+   procedure Unget_Mouse (Event : Mouse_Event);
+   --  AKA
+   pragma Inline (Unget_Mouse);
+
+   --  ANCHOR(`wenclose()',`Enclosed_In_Window')
+   function Enclosed_In_Window (Win    : Window := Standard_Window;
+                                Event  : Mouse_Event) return Boolean;
+   --  AKA
+   --  But : use event instead of screen coordinates.
+   pragma Inline (Enclosed_In_Window);
+
+   --  ANCHOR(`mouseinterval()',`Mouse_Interval')
+   function Mouse_Interval (Msec : Natural := 200) return Natural;
+   --  AKA
+   pragma Inline (Mouse_Interval);
+
+private
+   --  This can be as little as 32 bits (unsigned), or as long as the system's
+   --  unsigned long.  Declare it as the minimum size to handle all valid
+   --  sizes.
+   type Event_Mask is mod 4294967296;
+
+   type Mouse_Event is
+      record
+         Id      : Integer range Integer (Interfaces.C.short'First) ..
+                                 Integer (Interfaces.C.short'Last);
+         X, Y, Z : Integer range Integer (Interfaces.C.int'First) ..
+                                 Integer (Interfaces.C.int'Last);
+         Bstate  : Event_Mask;
+      end record;
+   pragma Convention (C, Mouse_Event);
+
+   for Mouse_Event use
+      record
+         Id     at 0 range Curses_Constants.MEVENT_id_First
+           .. Curses_Constants.MEVENT_id_Last;
+         X      at 0 range Curses_Constants.MEVENT_x_First
+           .. Curses_Constants.MEVENT_x_Last;
+         Y      at 0 range Curses_Constants.MEVENT_y_First
+           .. Curses_Constants.MEVENT_y_Last;
+         Z      at 0 range Curses_Constants.MEVENT_z_First
+           .. Curses_Constants.MEVENT_z_Last;
+         Bstate at 0 range Curses_Constants.MEVENT_bstate_First
+           .. Curses_Constants.MEVENT_bstate_Last;
+      end record;
+   for Mouse_Event'Size use Curses_Constants.MEVENT_Size;
+   Generation_Bit_Order : System.Bit_Order renames Curses_Constants.Bit_Order;
+
+   BUTTON_CTRL      : constant Event_Mask := Curses_Constants.BUTTON_CTRL;
+   BUTTON_SHIFT     : constant Event_Mask := Curses_Constants.BUTTON_SHIFT;
+   BUTTON_ALT       : constant Event_Mask := Curses_Constants.BUTTON_ALT;
+   BUTTON1_EVENTS   : constant Event_Mask
+     := Curses_Constants.all_events_button_1;
+   BUTTON2_EVENTS   : constant Event_Mask
+     := Curses_Constants.all_events_button_2;
+   BUTTON3_EVENTS   : constant Event_Mask
+     := Curses_Constants.all_events_button_3;
+   BUTTON4_EVENTS   : constant Event_Mask
+     := Curses_Constants.all_events_button_4;
+   ALL_MOUSE_EVENTS : constant Event_Mask := Curses_Constants.ALL_MOUSE_EVENTS;
+   No_Events        : constant Event_Mask := 0;
+   All_Events       : constant Event_Mask := ALL_MOUSE_EVENTS;
+
+end Terminal_Interface.Curses.Mouse;
diff --git a/Ada95/gen/terminal_interface-curses-panels-user_data.ads.m4 b/Ada95/gen/terminal_interface-curses-panels-user_data.ads.m4
new file mode 100644
index 0000000..4d60e52
--- /dev/null
+++ b/Ada95/gen/terminal_interface-curses-panels-user_data.ads.m4
@@ -0,0 +1,71 @@
+--  -*- ada -*-
+define(`HTMLNAME',`terminal_interface-curses-panels-user_data__ads.htm')dnl
+include(M4MACRO)dnl
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                 Terminal_Interface.Curses.Panels.User_Data               --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2003,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.16 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+
+generic
+   type User is limited private;
+   type User_Access is access all User;
+package Terminal_Interface.Curses.Panels.User_Data is
+   pragma Preelaborate (Terminal_Interface.Curses.Panels.User_Data);
+
+   --  MANPAGE(`panel.3x')
+
+   --  ANCHOR(`set_panel_userptr',`Set_User_Data')
+   procedure Set_User_Data (Pan  : Panel;
+                            Data : User_Access);
+   --  AKA
+   pragma Inline (Set_User_Data);
+
+   --  ANCHOR(`panel_userptr',`Get_User_Data')
+   procedure Get_User_Data (Pan  : Panel;
+                            Data : out User_Access);
+   --  AKA
+
+   --  ANCHOR(`panel_userptr',`Get_User_Data')
+   function Get_User_Data (Pan  : Panel) return User_Access;
+   --  AKA
+   --  Same as function
+   pragma Inline (Get_User_Data);
+
+end Terminal_Interface.Curses.Panels.User_Data;
diff --git a/Ada95/gen/terminal_interface-curses-panels.ads.m4 b/Ada95/gen/terminal_interface-curses-panels.ads.m4
new file mode 100644
index 0000000..1175343
--- /dev/null
+++ b/Ada95/gen/terminal_interface-curses-panels.ads.m4
@@ -0,0 +1,148 @@
+--  -*- ada -*-
+define(`HTMLNAME',`terminal_interface-curses-panels__ads.htm')dnl
+include(M4MACRO)dnl
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                      Terminal_Interface.Curses.Panels                    --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2009,2014 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.23 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with System;
+
+package Terminal_Interface.Curses.Panels is
+   pragma Preelaborate (Terminal_Interface.Curses.Panels);
+   pragma Linker_Options ("-lpanel" & Curses_Constants.DFT_ARG_SUFFIX);
+
+   type Panel is private;
+
+   ---------------------------
+   --  Interface constants  --
+   ---------------------------
+   Null_Panel : constant Panel;
+
+   -------------------
+   --  Exceptions   --
+   -------------------
+
+   Panel_Exception : exception;
+
+   --  MANPAGE(`panel.3x')
+
+   --  ANCHOR(`new_panel()',`Create')
+   function Create (Win : Window) return Panel;
+   --  AKA
+   pragma Inline (Create);
+
+   --  ANCHOR(`new_panel()',`New_Panel')
+   function New_Panel (Win : Window) return Panel renames Create;
+   --  AKA
+   --  pragma Inline (New_Panel);
+
+   --  ANCHOR(`bottom_panel()',`Bottom')
+   procedure Bottom (Pan : Panel);
+   --  AKA
+   pragma Inline (Bottom);
+
+   --  ANCHOR(`top_panel()',`Top')
+   procedure Top (Pan : Panel);
+   --  AKA
+   pragma Inline (Top);
+
+   --  ANCHOR(`show_panel()',`Show')
+   procedure Show (Pan : Panel);
+   --  AKA
+   pragma Inline (Show);
+
+   --  ANCHOR(`update_panels()',`Update_Panels')
+   procedure Update_Panels;
+   --  AKA
+   pragma Import (C, Update_Panels, "update_panels");
+
+   --  ANCHOR(`hide_panel()',`Hide')
+   procedure Hide (Pan : Panel);
+   --  AKA
+   pragma Inline (Hide);
+
+   --  ANCHOR(`panel_window()',`Get_Window')
+   function Get_Window (Pan : Panel) return Window;
+   --  AKA
+   pragma Inline (Get_Window);
+
+   --  ANCHOR(`panel_window()',`Panel_Window')
+   function Panel_Window (Pan : Panel) return Window renames Get_Window;
+   --  pragma Inline (Panel_Window);
+
+   --  ANCHOR(`replace_panel()',`Replace')
+   procedure Replace (Pan : Panel;
+                      Win : Window);
+   --  AKA
+   pragma Inline (Replace);
+
+   --  ANCHOR(`move_panel()',`Move')
+   procedure Move (Pan    : Panel;
+                   Line   : Line_Position;
+                   Column : Column_Position);
+   --  AKA
+   pragma Inline (Move);
+
+   --  ANCHOR(`panel_hidden()',`Is_Hidden')
+   function Is_Hidden (Pan : Panel) return Boolean;
+   --  AKA
+   pragma Inline (Is_Hidden);
+
+   --  ANCHOR(`panel_above()',`Above')
+   function Above (Pan : Panel) return Panel;
+   --  AKA
+   pragma Import (C, Above, "panel_above");
+
+   --  ANCHOR(`panel_below()',`Below')
+   function Below (Pan : Panel) return Panel;
+   --  AKA
+   pragma Import (C, Below, "panel_below");
+
+   --  ANCHOR(`del_panel()',`Delete')
+   procedure Delete (Pan : in out Panel);
+   --  AKA
+   pragma Inline (Delete);
+
+private
+      type Panel is new System.Storage_Elements.Integer_Address;
+      Null_Panel : constant Panel := 0;
+
+end Terminal_Interface.Curses.Panels;
diff --git a/Ada95/gen/terminal_interface-curses-trace.ads.m4 b/Ada95/gen/terminal_interface-curses-trace.ads.m4
new file mode 100644
index 0000000..794d132
--- /dev/null
+++ b/Ada95/gen/terminal_interface-curses-trace.ads.m4
@@ -0,0 +1,125 @@
+--  -*- ada -*-
+define(`HTMLNAME',`terminal_interface-curses-trace__ads.htm')dnl
+include(M4MACRO)------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                      Terminal_Interface.Curses.Trace                     --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000,2014 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.                                                           --
+------------------------------------------------------------------------------
+--  Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
+--  Version Control:
+--  $Revision: 1.5 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+
+package Terminal_Interface.Curses.Trace is
+   pragma Preelaborate (Terminal_Interface.Curses.Trace);
+
+   type Trace_Attribute_Set is
+      record
+         Times            : Boolean;
+         Tputs            : Boolean;
+         Update           : Boolean;
+         Cursor_Move      : Boolean;
+         Character_Output : Boolean;
+         Calls            : Boolean;
+         Virtual_Puts     : Boolean;
+         Input_Events     : Boolean;
+         TTY_State        : Boolean;
+         Internal_Calls   : Boolean;
+         Character_Calls  : Boolean;
+         Termcap_TermInfo : Boolean;
+         Attribute_Color  : Boolean;
+      end record;
+   pragma Convention (C_Pass_By_Copy, Trace_Attribute_Set);
+
+   for Trace_Attribute_Set use
+      record
+         Times            at 0 range Curses_Constants.TRACE_TIMES_First
+           .. Curses_Constants.TRACE_TIMES_Last;
+         Tputs            at 0 range Curses_Constants.TRACE_TPUTS_First
+           .. Curses_Constants.TRACE_TPUTS_Last;
+         Update           at 0 range Curses_Constants.TRACE_UPDATE_First
+           .. Curses_Constants.TRACE_UPDATE_Last;
+         Cursor_Move      at 0 range Curses_Constants.TRACE_MOVE_First
+           .. Curses_Constants.TRACE_MOVE_Last;
+         Character_Output at 0 range Curses_Constants.TRACE_CHARPUT_First
+           .. Curses_Constants.TRACE_CHARPUT_Last;
+         Calls            at 0 range Curses_Constants.TRACE_CALLS_First
+           .. Curses_Constants.TRACE_CALLS_Last;
+         Virtual_Puts     at 0 range Curses_Constants.TRACE_VIRTPUT_First
+           .. Curses_Constants.TRACE_VIRTPUT_Last;
+         Input_Events     at 0 range Curses_Constants.TRACE_IEVENT_First
+           .. Curses_Constants.TRACE_IEVENT_Last;
+         TTY_State        at 0 range Curses_Constants.TRACE_BITS_First
+           .. Curses_Constants.TRACE_BITS_Last;
+         Internal_Calls   at 0 range Curses_Constants.TRACE_ICALLS_First
+           .. Curses_Constants.TRACE_ICALLS_Last;
+         Character_Calls  at 0 range Curses_Constants.TRACE_CCALLS_First
+           .. Curses_Constants.TRACE_CCALLS_Last;
+         Termcap_TermInfo at 0 range Curses_Constants.TRACE_DATABASE_First
+           .. Curses_Constants.TRACE_DATABASE_Last;
+         Attribute_Color  at 0 range Curses_Constants.TRACE_ATTRS_First
+           .. Curses_Constants.TRACE_ATTRS_Last;
+      end record;
+   pragma Warnings (Off);
+   for Trace_Attribute_Set'Size use Curses_Constants.Trace_Size;
+   pragma Warnings (On);
+
+   Trace_Disable  : constant Trace_Attribute_Set := (others => False);
+
+   Trace_Ordinary : constant Trace_Attribute_Set :=
+     (Times            => True,
+      Tputs            => True,
+      Update           => True,
+      Cursor_Move      => True,
+      Character_Output => True,
+      others           => False);
+   Trace_Maximum : constant Trace_Attribute_Set := (others => True);
+
+------------------------------------------------------------------------------
+
+   --  MANPAGE(`curs_trace.3x')
+
+   --  ANCHOR(`trace()',`Trace_on')
+   procedure Trace_On (x : Trace_Attribute_Set);
+   --  The debugging library has trace.
+
+   --  ANCHOR(`_tracef()',`Trace_Put')
+   procedure Trace_Put (str : String);
+   --  AKA
+
+   Current_Trace_Setting : Trace_Attribute_Set;
+   pragma Import (C, Current_Trace_Setting, "_nc_tracing");
+
+end Terminal_Interface.Curses.Trace;
diff --git a/Ada95/gen/terminal_interface-curses.adb.m4 b/Ada95/gen/terminal_interface-curses.adb.m4
new file mode 100644
index 0000000..3f34d20
--- /dev/null
+++ b/Ada95/gen/terminal_interface-curses.adb.m4
@@ -0,0 +1,2559 @@
+--  -*- ada -*-
+define(`HTMLNAME',`terminal_interface-curses__adb.htm')dnl
+include(M4MACRO)------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                        Terminal_Interface.Curses                         --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2018,2020 Thomas E. Dickey                                     --
+-- Copyright 2007-2011,2014 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.                                                           --
+------------------------------------------------------------------------------
+--  Author: Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.16 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with System;
+
+with Terminal_Interface.Curses.Aux;
+with Interfaces.C;                  use Interfaces.C;
+with Interfaces.C.Strings;          use Interfaces.C.Strings;
+with Ada.Characters.Handling;       use Ada.Characters.Handling;
+with Ada.Strings.Fixed;
+
+package body Terminal_Interface.Curses is
+
+   use Aux;
+
+   package ASF renames Ada.Strings.Fixed;
+
+   type chtype_array is array (size_t range <>)
+      of aliased Attributed_Character;
+   pragma Convention (C, chtype_array);
+
+------------------------------------------------------------------------------
+   function Key_Name (Key : Real_Key_Code) return String
+   is
+      function Keyname (K : C_Int) return chars_ptr;
+      pragma Import (C, Keyname, "keyname");
+
+      Ch : Character;
+   begin
+      if Key <= Character'Pos (Character'Last) then
+         Ch := Character'Val (Key);
+         if Is_Control (Ch) then
+            return Un_Control (Attributed_Character'(Ch    => Ch,
+                                                     Color => Color_Pair'First,
+                                                     Attr  => Normal_Video));
+         elsif Is_Graphic (Ch) then
+            declare
+               S : String (1 .. 1);
+            begin
+               S (1) := Ch;
+               return S;
+            end;
+         else
+            return "";
+         end if;
+      else
+         return Fill_String (Keyname (C_Int (Key)));
+      end if;
+   end Key_Name;
+
+   procedure Key_Name (Key  :  Real_Key_Code;
+                       Name : out String)
+   is
+   begin
+      ASF.Move (Key_Name (Key), Name);
+   end Key_Name;
+
+------------------------------------------------------------------------------
+   procedure Init_Screen
+   is
+      function Initscr return Window;
+      pragma Import (C, Initscr, "initscr");
+
+      W : Window;
+   begin
+      W := Initscr;
+      if W = Null_Window then
+         raise Curses_Exception;
+      end if;
+   end Init_Screen;
+
+   procedure End_Windows
+   is
+      function Endwin return C_Int;
+      pragma Import (C, Endwin, "endwin");
+   begin
+      if Endwin = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end End_Windows;
+
+   function Is_End_Window return Boolean
+   is
+      function Isendwin return Curses_Bool;
+      pragma Import (C, Isendwin, "isendwin");
+   begin
+      if Isendwin = Curses_Bool_False then
+         return False;
+      else
+         return True;
+      end if;
+   end Is_End_Window;
+------------------------------------------------------------------------------
+   procedure Move_Cursor (Win    : Window := Standard_Window;
+                          Line   : Line_Position;
+                          Column : Column_Position)
+   is
+      function Wmove (Win    : Window;
+                      Line   : C_Int;
+                      Column : C_Int
+                     ) return C_Int;
+      pragma Import (C, Wmove, "wmove");
+   begin
+      if Wmove (Win, C_Int (Line), C_Int (Column)) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Move_Cursor;
+------------------------------------------------------------------------------
+   procedure Add (Win : Window := Standard_Window;
+                  Ch  : Attributed_Character)
+   is
+      function Waddch (W  : Window;
+                       Ch : Attributed_Character) return C_Int;
+      pragma Import (C, Waddch, "waddch");
+   begin
+      if Waddch (Win, Ch) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Add;
+
+   procedure Add (Win : Window := Standard_Window;
+                  Ch  : Character)
+   is
+   begin
+      Add (Win,
+           Attributed_Character'(Ch    => Ch,
+                                 Color => Color_Pair'First,
+                                 Attr  => Normal_Video));
+   end Add;
+
+   procedure Add
+     (Win    : Window := Standard_Window;
+      Line   : Line_Position;
+      Column : Column_Position;
+      Ch     : Attributed_Character)
+   is
+      function mvwaddch (W  : Window;
+                         Y  : C_Int;
+                         X  : C_Int;
+                         Ch : Attributed_Character) return C_Int;
+      pragma Import (C, mvwaddch, "mvwaddch");
+   begin
+      if mvwaddch (Win, C_Int (Line),
+                   C_Int (Column),
+                   Ch) = Curses_Err
+      then
+         raise Curses_Exception;
+      end if;
+   end Add;
+
+   procedure Add
+     (Win    : Window := Standard_Window;
+      Line   : Line_Position;
+      Column : Column_Position;
+      Ch     : Character)
+   is
+   begin
+      Add (Win,
+           Line,
+           Column,
+           Attributed_Character'(Ch    => Ch,
+                                 Color => Color_Pair'First,
+                                 Attr  => Normal_Video));
+   end Add;
+
+   procedure Add_With_Immediate_Echo
+     (Win : Window := Standard_Window;
+      Ch  : Attributed_Character)
+   is
+      function Wechochar (W  : Window;
+                          Ch : Attributed_Character) return C_Int;
+      pragma Import (C, Wechochar, "wechochar");
+   begin
+      if Wechochar (Win, Ch) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Add_With_Immediate_Echo;
+
+   procedure Add_With_Immediate_Echo
+     (Win : Window := Standard_Window;
+      Ch  : Character)
+   is
+   begin
+      Add_With_Immediate_Echo
+        (Win,
+         Attributed_Character'(Ch    => Ch,
+                               Color => Color_Pair'First,
+                               Attr  => Normal_Video));
+   end Add_With_Immediate_Echo;
+------------------------------------------------------------------------------
+   function Create (Number_Of_Lines       : Line_Count;
+                    Number_Of_Columns     : Column_Count;
+                    First_Line_Position   : Line_Position;
+                    First_Column_Position : Column_Position) return Window
+   is
+      function Newwin (Number_Of_Lines       : C_Int;
+                       Number_Of_Columns     : C_Int;
+                       First_Line_Position   : C_Int;
+                       First_Column_Position : C_Int) return Window;
+      pragma Import (C, Newwin, "newwin");
+
+      W : Window;
+   begin
+      W := Newwin (C_Int (Number_Of_Lines),
+                   C_Int (Number_Of_Columns),
+                   C_Int (First_Line_Position),
+                   C_Int (First_Column_Position));
+      if W = Null_Window then
+         raise Curses_Exception;
+      end if;
+      return W;
+   end Create;
+
+   procedure Delete (Win : in out Window)
+   is
+      function Wdelwin (W : Window) return C_Int;
+      pragma Import (C, Wdelwin, "delwin");
+   begin
+      if Wdelwin (Win) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+      Win := Null_Window;
+   end Delete;
+
+   function Sub_Window
+     (Win                   : Window := Standard_Window;
+      Number_Of_Lines       : Line_Count;
+      Number_Of_Columns     : Column_Count;
+      First_Line_Position   : Line_Position;
+      First_Column_Position : Column_Position) return Window
+   is
+      function Subwin
+        (Win                   : Window;
+         Number_Of_Lines       : C_Int;
+         Number_Of_Columns     : C_Int;
+         First_Line_Position   : C_Int;
+         First_Column_Position : C_Int) return Window;
+      pragma Import (C, Subwin, "subwin");
+
+      W : Window;
+   begin
+      W := Subwin (Win,
+                   C_Int (Number_Of_Lines),
+                   C_Int (Number_Of_Columns),
+                   C_Int (First_Line_Position),
+                   C_Int (First_Column_Position));
+      if W = Null_Window then
+         raise Curses_Exception;
+      end if;
+      return W;
+   end Sub_Window;
+
+   function Derived_Window
+     (Win                   : Window := Standard_Window;
+      Number_Of_Lines       : Line_Count;
+      Number_Of_Columns     : Column_Count;
+      First_Line_Position   : Line_Position;
+      First_Column_Position : Column_Position) return Window
+   is
+      function Derwin
+        (Win                   : Window;
+         Number_Of_Lines       : C_Int;
+         Number_Of_Columns     : C_Int;
+         First_Line_Position   : C_Int;
+         First_Column_Position : C_Int) return Window;
+      pragma Import (C, Derwin, "derwin");
+
+      W : Window;
+   begin
+      W := Derwin (Win,
+                   C_Int (Number_Of_Lines),
+                   C_Int (Number_Of_Columns),
+                   C_Int (First_Line_Position),
+                   C_Int (First_Column_Position));
+      if W = Null_Window then
+         raise Curses_Exception;
+      end if;
+      return W;
+   end Derived_Window;
+
+   function Duplicate (Win : Window) return Window
+   is
+      function Dupwin (Win : Window) return Window;
+      pragma Import (C, Dupwin, "dupwin");
+
+      W : constant Window := Dupwin (Win);
+   begin
+      if W = Null_Window then
+         raise Curses_Exception;
+      end if;
+      return W;
+   end Duplicate;
+
+   procedure Move_Window (Win    : Window;
+                          Line   : Line_Position;
+                          Column : Column_Position)
+   is
+      function Mvwin (Win    : Window;
+                      Line   : C_Int;
+                      Column : C_Int) return C_Int;
+      pragma Import (C, Mvwin, "mvwin");
+   begin
+      if Mvwin (Win, C_Int (Line), C_Int (Column)) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Move_Window;
+
+   procedure Move_Derived_Window (Win    : Window;
+                                  Line   : Line_Position;
+                                  Column : Column_Position)
+   is
+      function Mvderwin (Win    : Window;
+                         Line   : C_Int;
+                         Column : C_Int) return C_Int;
+      pragma Import (C, Mvderwin, "mvderwin");
+   begin
+      if Mvderwin (Win, C_Int (Line), C_Int (Column)) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Move_Derived_Window;
+
+   procedure Set_Synch_Mode (Win  : Window  := Standard_Window;
+                             Mode : Boolean := False)
+   is
+      function Syncok (Win  : Window;
+                       Mode : Curses_Bool) return C_Int;
+      pragma Import (C, Syncok, "syncok");
+   begin
+      if Syncok (Win, Curses_Bool (Boolean'Pos (Mode))) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Set_Synch_Mode;
+------------------------------------------------------------------------------
+   procedure Add (Win : Window := Standard_Window;
+                  Str : String;
+                  Len : Integer := -1)
+   is
+      function Waddnstr (Win : Window;
+                         Str : char_array;
+                         Len : C_Int := -1) return C_Int;
+      pragma Import (C, Waddnstr, "waddnstr");
+
+      Txt    : char_array (0 .. Str'Length);
+      Length : size_t;
+   begin
+      To_C (Str, Txt, Length);
+      if Waddnstr (Win, Txt, C_Int (Len)) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Add;
+
+   procedure Add
+     (Win    : Window := Standard_Window;
+      Line   : Line_Position;
+      Column : Column_Position;
+      Str    : String;
+      Len    : Integer := -1)
+   is
+   begin
+      Move_Cursor (Win, Line, Column);
+      Add (Win, Str, Len);
+   end Add;
+------------------------------------------------------------------------------
+   procedure Add
+     (Win : Window := Standard_Window;
+      Str : Attributed_String;
+      Len : Integer := -1)
+   is
+      function Waddchnstr (Win : Window;
+                           Str : chtype_array;
+                           Len : C_Int := -1) return C_Int;
+      pragma Import (C, Waddchnstr, "waddchnstr");
+
+      Txt : chtype_array (0 .. Str'Length);
+   begin
+      for Length in 1 .. size_t (Str'Length) loop
+         Txt (Length - 1) := Str (Natural (Length));
+      end loop;
+      Txt (Str'Length) := Default_Character;
+      if Waddchnstr (Win,
+                     Txt,
+                     C_Int (Len)) = Curses_Err
+      then
+         raise Curses_Exception;
+      end if;
+   end Add;
+
+   procedure Add
+     (Win    : Window := Standard_Window;
+      Line   : Line_Position;
+      Column : Column_Position;
+      Str    : Attributed_String;
+      Len    : Integer := -1)
+   is
+   begin
+      Move_Cursor (Win, Line, Column);
+      Add (Win, Str, Len);
+   end Add;
+------------------------------------------------------------------------------
+   procedure Border
+     (Win                       : Window := Standard_Window;
+      Left_Side_Symbol          : Attributed_Character := Default_Character;
+      Right_Side_Symbol         : Attributed_Character := Default_Character;
+      Top_Side_Symbol           : Attributed_Character := Default_Character;
+      Bottom_Side_Symbol        : Attributed_Character := Default_Character;
+      Upper_Left_Corner_Symbol  : Attributed_Character := Default_Character;
+      Upper_Right_Corner_Symbol : Attributed_Character := Default_Character;
+      Lower_Left_Corner_Symbol  : Attributed_Character := Default_Character;
+      Lower_Right_Corner_Symbol : Attributed_Character := Default_Character)
+   is
+      function Wborder (W   : Window;
+                        LS  : Attributed_Character;
+                        RS  : Attributed_Character;
+                        TS  : Attributed_Character;
+                        BS  : Attributed_Character;
+                        ULC : Attributed_Character;
+                        URC : Attributed_Character;
+                        LLC : Attributed_Character;
+                        LRC : Attributed_Character) return C_Int;
+      pragma Import (C, Wborder, "wborder");
+   begin
+      if Wborder (Win,
+                  Left_Side_Symbol,
+                  Right_Side_Symbol,
+                  Top_Side_Symbol,
+                  Bottom_Side_Symbol,
+                  Upper_Left_Corner_Symbol,
+                  Upper_Right_Corner_Symbol,
+                  Lower_Left_Corner_Symbol,
+                  Lower_Right_Corner_Symbol) = Curses_Err
+      then
+         raise Curses_Exception;
+      end if;
+   end Border;
+
+   procedure Box
+     (Win               : Window := Standard_Window;
+      Vertical_Symbol   : Attributed_Character := Default_Character;
+      Horizontal_Symbol : Attributed_Character := Default_Character)
+   is
+   begin
+      Border (Win,
+              Vertical_Symbol, Vertical_Symbol,
+              Horizontal_Symbol, Horizontal_Symbol);
+   end Box;
+
+   procedure Horizontal_Line
+     (Win         : Window := Standard_Window;
+      Line_Size   : Natural;
+      Line_Symbol : Attributed_Character := Default_Character)
+   is
+      function Whline (W   : Window;
+                       Ch  : Attributed_Character;
+                       Len : C_Int) return C_Int;
+      pragma Import (C, Whline, "whline");
+   begin
+      if Whline (Win,
+                 Line_Symbol,
+                 C_Int (Line_Size)) = Curses_Err
+      then
+         raise Curses_Exception;
+      end if;
+   end Horizontal_Line;
+
+   procedure Vertical_Line
+     (Win         : Window := Standard_Window;
+      Line_Size   : Natural;
+      Line_Symbol : Attributed_Character := Default_Character)
+   is
+      function Wvline (W   : Window;
+                       Ch  : Attributed_Character;
+                       Len : C_Int) return C_Int;
+      pragma Import (C, Wvline, "wvline");
+   begin
+      if Wvline (Win,
+                 Line_Symbol,
+                 C_Int (Line_Size)) = Curses_Err
+      then
+         raise Curses_Exception;
+      end if;
+   end Vertical_Line;
+
+------------------------------------------------------------------------------
+   function Get_Keystroke (Win : Window := Standard_Window)
+     return Real_Key_Code
+   is
+      function Wgetch (W : Window) return C_Int;
+      pragma Import (C, Wgetch, "wgetch");
+
+      C : constant C_Int := Wgetch (Win);
+   begin
+      if C = Curses_Err then
+         return Key_None;
+      else
+         return Real_Key_Code (C);
+      end if;
+   end Get_Keystroke;
+
+   procedure Undo_Keystroke (Key : Real_Key_Code)
+   is
+      function Ungetch (Ch : C_Int) return C_Int;
+      pragma Import (C, Ungetch, "ungetch");
+   begin
+      if Ungetch (C_Int (Key)) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Undo_Keystroke;
+
+   function Has_Key (Key : Special_Key_Code) return Boolean
+   is
+      function Haskey (Key : C_Int) return C_Int;
+      pragma Import (C, Haskey, "has_key");
+   begin
+      if Haskey (C_Int (Key)) = Curses_False then
+         return False;
+      else
+         return True;
+      end if;
+   end Has_Key;
+
+   function Is_Function_Key (Key : Special_Key_Code) return Boolean
+   is
+      L : constant Special_Key_Code  := Special_Key_Code (Natural (Key_F0) +
+        Natural (Function_Key_Number'Last));
+   begin
+      if (Key >= Key_F0) and then (Key <= L) then
+         return True;
+      else
+         return False;
+      end if;
+   end Is_Function_Key;
+
+   function Function_Key (Key : Real_Key_Code)
+                          return Function_Key_Number
+   is
+   begin
+      if Is_Function_Key (Key) then
+         return Function_Key_Number (Key - Key_F0);
+      else
+         raise Constraint_Error;
+      end if;
+   end Function_Key;
+
+   function Function_Key_Code (Key : Function_Key_Number) return Real_Key_Code
+   is
+   begin
+      return Real_Key_Code (Natural (Key_F0) + Natural (Key));
+   end Function_Key_Code;
+------------------------------------------------------------------------------
+   procedure Standout (Win : Window  := Standard_Window;
+                       On  : Boolean := True)
+   is
+      function wstandout (Win : Window) return C_Int;
+      pragma Import (C, wstandout, "wstandout");
+      function wstandend (Win : Window) return C_Int;
+      pragma Import (C, wstandend, "wstandend");
+
+      Err : C_Int;
+   begin
+      if On then
+         Err := wstandout (Win);
+      else
+         Err := wstandend (Win);
+      end if;
+      if Err = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Standout;
+
+   procedure Switch_Character_Attribute
+     (Win  : Window := Standard_Window;
+      Attr : Character_Attribute_Set := Normal_Video;
+      On   : Boolean := True)
+   is
+      function Wattron (Win    : Window;
+                        C_Attr : Attributed_Character) return C_Int;
+      pragma Import (C, Wattron, "wattr_on");
+      function Wattroff (Win    : Window;
+                         C_Attr : Attributed_Character) return C_Int;
+      pragma Import (C, Wattroff, "wattr_off");
+      --  In Ada we use the On Boolean to control whether or not we want to
+      --  switch on or off the attributes in the set.
+      Err : C_Int;
+      AC  : constant Attributed_Character := (Ch    => Character'First,
+                                              Color => Color_Pair'First,
+                                              Attr  => Attr);
+   begin
+      if On then
+         Err := Wattron  (Win, AC);
+      else
+         Err := Wattroff (Win, AC);
+      end if;
+      if Err = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Switch_Character_Attribute;
+
+   procedure Set_Character_Attributes
+     (Win   : Window := Standard_Window;
+      Attr  : Character_Attribute_Set := Normal_Video;
+      Color : Color_Pair := Color_Pair'First)
+   is
+      function Wattrset (Win    : Window;
+                         C_Attr : Attributed_Character) return C_Int;
+      pragma Import (C, Wattrset, "wattrset"); -- ??? wattr_set
+   begin
+      if Wattrset (Win, (Ch => Character'First,
+                         Color => Color,
+                         Attr => Attr)) = Curses_Err
+      then
+         raise Curses_Exception;
+      end if;
+   end Set_Character_Attributes;
+
+   function Get_Character_Attribute (Win : Window := Standard_Window)
+                                     return Character_Attribute_Set
+   is
+      function Wattrget (Win : Window;
+                         Atr : access Attributed_Character;
+                         Col : access C_Short;
+                         Opt : System.Address) return C_Int;
+      pragma Import (C, Wattrget, "wattr_get");
+
+      Attr : aliased Attributed_Character;
+      Col  : aliased C_Short;
+      Res  : constant C_Int := Wattrget (Win, Attr'Access, Col'Access,
+                                         System.Null_Address);
+   begin
+      if Res = Curses_Ok then
+         return Attr.Attr;
+      else
+         raise Curses_Exception;
+      end if;
+   end Get_Character_Attribute;
+
+   function Get_Character_Attribute (Win : Window := Standard_Window)
+                                     return Color_Pair
+   is
+      function Wattrget (Win : Window;
+                         Atr : access Attributed_Character;
+                         Col : access C_Short;
+                         Opt : System.Address) return C_Int;
+      pragma Import (C, Wattrget, "wattr_get");
+
+      Attr : aliased Attributed_Character;
+      Col  : aliased C_Short;
+      Res  : constant C_Int := Wattrget (Win, Attr'Access, Col'Access,
+                                         System.Null_Address);
+   begin
+      if Res = Curses_Ok then
+         return Attr.Color;
+      else
+         raise Curses_Exception;
+      end if;
+   end Get_Character_Attribute;
+
+   procedure Set_Color (Win  : Window := Standard_Window;
+                        Pair : Color_Pair)
+   is
+      function Wset_Color (Win   : Window;
+                           Color : C_Short;
+                           Opts  : C_Void_Ptr) return C_Int;
+      pragma Import (C, Wset_Color, "wcolor_set");
+   begin
+      if Wset_Color (Win,
+                     C_Short (Pair),
+                     C_Void_Ptr (System.Null_Address)) = Curses_Err
+      then
+         raise Curses_Exception;
+      end if;
+   end Set_Color;
+
+   procedure Change_Attributes
+     (Win   : Window := Standard_Window;
+      Count : Integer := -1;
+      Attr  : Character_Attribute_Set := Normal_Video;
+      Color : Color_Pair := Color_Pair'First)
+   is
+      function Wchgat (Win   : Window;
+                       Cnt   : C_Int;
+                       Attr  : Attributed_Character;
+                       Color : C_Short;
+                       Opts  : System.Address := System.Null_Address)
+                       return C_Int;
+      pragma Import (C, Wchgat, "wchgat");
+   begin
+      if Wchgat (Win,
+                 C_Int (Count),
+                 (Ch => Character'First,
+                  Color => Color_Pair'First,
+                  Attr => Attr),
+                 C_Short (Color)) = Curses_Err
+      then
+         raise Curses_Exception;
+      end if;
+   end Change_Attributes;
+
+   procedure Change_Attributes
+     (Win    : Window := Standard_Window;
+      Line   : Line_Position := Line_Position'First;
+      Column : Column_Position := Column_Position'First;
+      Count  : Integer := -1;
+      Attr   : Character_Attribute_Set := Normal_Video;
+      Color  : Color_Pair := Color_Pair'First)
+   is
+   begin
+      Move_Cursor (Win, Line, Column);
+      Change_Attributes (Win, Count, Attr, Color);
+   end Change_Attributes;
+------------------------------------------------------------------------------
+   procedure Beep
+   is
+      function Beeper return C_Int;
+      pragma Import (C, Beeper, "beep");
+   begin
+      if Beeper = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Beep;
+
+   procedure Flash_Screen
+   is
+      function Flash return C_Int;
+      pragma Import (C, Flash, "flash");
+   begin
+      if Flash = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Flash_Screen;
+------------------------------------------------------------------------------
+   procedure Set_Cbreak_Mode (SwitchOn : Boolean := True)
+   is
+      function Cbreak return C_Int;
+      pragma Import (C, Cbreak, "cbreak");
+      function NoCbreak return C_Int;
+      pragma Import (C, NoCbreak, "nocbreak");
+
+      Err : C_Int;
+   begin
+      if SwitchOn then
+         Err := Cbreak;
+      else
+         Err := NoCbreak;
+      end if;
+      if Err = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Set_Cbreak_Mode;
+
+   procedure Set_Raw_Mode (SwitchOn : Boolean := True)
+   is
+      function Raw return C_Int;
+      pragma Import (C, Raw, "raw");
+      function NoRaw return C_Int;
+      pragma Import (C, NoRaw, "noraw");
+
+      Err : C_Int;
+   begin
+      if SwitchOn then
+         Err := Raw;
+      else
+         Err := NoRaw;
+      end if;
+      if Err = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Set_Raw_Mode;
+
+   procedure Set_Echo_Mode (SwitchOn : Boolean := True)
+   is
+      function Echo return C_Int;
+      pragma Import (C, Echo, "echo");
+      function NoEcho return C_Int;
+      pragma Import (C, NoEcho, "noecho");
+
+      Err : C_Int;
+   begin
+      if SwitchOn then
+         Err := Echo;
+      else
+         Err := NoEcho;
+      end if;
+      if Err = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Set_Echo_Mode;
+
+   procedure Set_Meta_Mode (Win      : Window := Standard_Window;
+                            SwitchOn : Boolean := True)
+   is
+      function Meta (W : Window; Mode : Curses_Bool) return C_Int;
+      pragma Import (C, Meta, "meta");
+   begin
+      if Meta (Win, Curses_Bool (Boolean'Pos (SwitchOn))) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Set_Meta_Mode;
+
+   procedure Set_KeyPad_Mode (Win      : Window := Standard_Window;
+                              SwitchOn : Boolean := True)
+   is
+      function Keypad (W : Window; Mode : Curses_Bool) return C_Int;
+      pragma Import (C, Keypad, "keypad");
+   begin
+      if Keypad (Win, Curses_Bool (Boolean'Pos (SwitchOn))) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Set_KeyPad_Mode;
+
+   function Get_KeyPad_Mode (Win : Window := Standard_Window)
+                             return Boolean
+   is
+      function Is_Keypad (W : Window) return Curses_Bool;
+      pragma Import (C, Is_Keypad, "is_keypad");
+   begin
+      return (Is_Keypad (Win) /= Curses_Bool_False);
+   end Get_KeyPad_Mode;
+
+   procedure Half_Delay (Amount : Half_Delay_Amount)
+   is
+      function Halfdelay (Amount : C_Int) return C_Int;
+      pragma Import (C, Halfdelay, "halfdelay");
+   begin
+      if Halfdelay (C_Int (Amount)) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Half_Delay;
+
+   procedure Set_Flush_On_Interrupt_Mode
+     (Win  : Window := Standard_Window;
+      Mode : Boolean := True)
+   is
+      function Intrflush (Win : Window; Mode : Curses_Bool) return C_Int;
+      pragma Import (C, Intrflush, "intrflush");
+   begin
+      if Intrflush (Win, Curses_Bool (Boolean'Pos (Mode))) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Set_Flush_On_Interrupt_Mode;
+
+   procedure Set_Queue_Interrupt_Mode
+     (Win   : Window := Standard_Window;
+      Flush : Boolean := True)
+   is
+      procedure Qiflush;
+      pragma Import (C, Qiflush, "qiflush");
+      procedure No_Qiflush;
+      pragma Import (C, No_Qiflush, "noqiflush");
+   begin
+      if Win = Null_Window then
+         raise Curses_Exception;
+      end if;
+      if Flush then
+         Qiflush;
+      else
+         No_Qiflush;
+      end if;
+   end Set_Queue_Interrupt_Mode;
+
+   procedure Set_NoDelay_Mode
+     (Win  : Window := Standard_Window;
+      Mode : Boolean := False)
+   is
+      function Nodelay (Win : Window; Mode : Curses_Bool) return C_Int;
+      pragma Import (C, Nodelay, "nodelay");
+   begin
+      if Nodelay (Win, Curses_Bool (Boolean'Pos (Mode))) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Set_NoDelay_Mode;
+
+   procedure Set_Timeout_Mode (Win    : Window := Standard_Window;
+                               Mode   : Timeout_Mode;
+                               Amount : Natural)
+   is
+      procedure Wtimeout (Win : Window; Amount : C_Int);
+      pragma Import (C, Wtimeout, "wtimeout");
+
+      Time : C_Int;
+   begin
+      case Mode is
+         when Blocking     => Time := -1;
+         when Non_Blocking => Time := 0;
+         when Delayed      =>
+            if Amount = 0 then
+               raise Constraint_Error;
+            end if;
+            Time := C_Int (Amount);
+      end case;
+      Wtimeout (Win, Time);
+   end Set_Timeout_Mode;
+
+   procedure Set_Escape_Timer_Mode
+     (Win       : Window := Standard_Window;
+      Timer_Off : Boolean := False)
+   is
+      function Notimeout (Win : Window; Mode : Curses_Bool) return C_Int;
+      pragma Import (C, Notimeout, "notimeout");
+   begin
+      if Notimeout (Win, Curses_Bool (Boolean'Pos (Timer_Off)))
+        = Curses_Err
+      then
+         raise Curses_Exception;
+      end if;
+   end Set_Escape_Timer_Mode;
+
+------------------------------------------------------------------------------
+   procedure Set_NL_Mode (SwitchOn : Boolean := True)
+   is
+      function NL return C_Int;
+      pragma Import (C, NL, "nl");
+      function NoNL return C_Int;
+      pragma Import (C, NoNL, "nonl");
+
+      Err : C_Int;
+   begin
+      if SwitchOn then
+         Err := NL;
+      else
+         Err := NoNL;
+      end if;
+      if Err = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Set_NL_Mode;
+
+   procedure Clear_On_Next_Update
+     (Win      : Window := Standard_Window;
+      Do_Clear : Boolean := True)
+   is
+      function Clear_Ok (W : Window; Flag : Curses_Bool) return C_Int;
+      pragma Import (C, Clear_Ok, "clearok");
+   begin
+      if Clear_Ok (Win, Curses_Bool (Boolean'Pos (Do_Clear))) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Clear_On_Next_Update;
+
+   procedure Use_Insert_Delete_Line
+     (Win    : Window := Standard_Window;
+      Do_Idl : Boolean := True)
+   is
+      function IDL_Ok (W : Window; Flag : Curses_Bool) return C_Int;
+      pragma Import (C, IDL_Ok, "idlok");
+   begin
+      if IDL_Ok (Win, Curses_Bool (Boolean'Pos (Do_Idl))) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Use_Insert_Delete_Line;
+
+   procedure Use_Insert_Delete_Character
+     (Win    : Window := Standard_Window;
+      Do_Idc : Boolean := True)
+   is
+      procedure IDC_Ok (W : Window; Flag : Curses_Bool);
+      pragma Import (C, IDC_Ok, "idcok");
+   begin
+      IDC_Ok (Win, Curses_Bool (Boolean'Pos (Do_Idc)));
+   end Use_Insert_Delete_Character;
+
+   procedure Leave_Cursor_After_Update
+     (Win      : Window := Standard_Window;
+      Do_Leave : Boolean := True)
+   is
+      function Leave_Ok (W : Window; Flag : Curses_Bool) return C_Int;
+      pragma Import (C, Leave_Ok, "leaveok");
+   begin
+      if Leave_Ok (Win, Curses_Bool (Boolean'Pos (Do_Leave))) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Leave_Cursor_After_Update;
+
+   procedure Immediate_Update_Mode
+     (Win  : Window := Standard_Window;
+      Mode : Boolean := False)
+   is
+      procedure Immedok (Win : Window; Mode : Curses_Bool);
+      pragma Import (C, Immedok, "immedok");
+   begin
+      Immedok (Win, Curses_Bool (Boolean'Pos (Mode)));
+   end Immediate_Update_Mode;
+
+   procedure Allow_Scrolling
+     (Win  : Window  := Standard_Window;
+      Mode : Boolean := False)
+   is
+      function Scrollok (Win : Window; Mode : Curses_Bool) return C_Int;
+      pragma Import (C, Scrollok, "scrollok");
+   begin
+      if Scrollok (Win, Curses_Bool (Boolean'Pos (Mode))) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Allow_Scrolling;
+
+   function Scrolling_Allowed (Win : Window := Standard_Window)
+                               return Boolean
+   is
+      function Is_Scroll_Ok (W : Window) return Curses_Bool;
+      pragma Import (C, Is_Scroll_Ok, "is_scrollok");
+   begin
+      return (Is_Scroll_Ok (Win) /= Curses_Bool_False);
+   end Scrolling_Allowed;
+
+   procedure Set_Scroll_Region
+     (Win         : Window := Standard_Window;
+      Top_Line    : Line_Position;
+      Bottom_Line : Line_Position)
+   is
+      function Wsetscrreg (Win : Window;
+                           Lin : C_Int;
+                           Col : C_Int) return C_Int;
+      pragma Import (C, Wsetscrreg, "wsetscrreg");
+   begin
+      if Wsetscrreg (Win, C_Int (Top_Line), C_Int (Bottom_Line))
+        = Curses_Err
+      then
+         raise Curses_Exception;
+      end if;
+   end Set_Scroll_Region;
+------------------------------------------------------------------------------
+   procedure Update_Screen
+   is
+      function Do_Update return C_Int;
+      pragma Import (C, Do_Update, "doupdate");
+   begin
+      if Do_Update = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Update_Screen;
+
+   procedure Refresh (Win : Window := Standard_Window)
+   is
+      function Wrefresh (W : Window) return C_Int;
+      pragma Import (C, Wrefresh, "wrefresh");
+   begin
+      if Wrefresh (Win) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Refresh;
+
+   procedure Refresh_Without_Update
+     (Win : Window := Standard_Window)
+   is
+      function Wnoutrefresh (W : Window) return C_Int;
+      pragma Import (C, Wnoutrefresh, "wnoutrefresh");
+   begin
+      if Wnoutrefresh (Win) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Refresh_Without_Update;
+
+   procedure Redraw (Win : Window := Standard_Window)
+   is
+      function Redrawwin (Win : Window) return C_Int;
+      pragma Import (C, Redrawwin, "redrawwin");
+   begin
+      if Redrawwin (Win) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Redraw;
+
+   procedure Redraw
+     (Win        : Window := Standard_Window;
+      Begin_Line : Line_Position;
+      Line_Count : Positive)
+   is
+      function Wredrawln (Win : Window; First : C_Int; Cnt : C_Int)
+                          return C_Int;
+      pragma Import (C, Wredrawln, "wredrawln");
+   begin
+      if Wredrawln (Win,
+                    C_Int (Begin_Line),
+                    C_Int (Line_Count)) = Curses_Err
+      then
+         raise Curses_Exception;
+      end if;
+   end Redraw;
+
+------------------------------------------------------------------------------
+   procedure Erase (Win : Window := Standard_Window)
+   is
+      function Werase (W : Window) return C_Int;
+      pragma Import (C, Werase, "werase");
+   begin
+      if Werase (Win) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Erase;
+
+   procedure Clear (Win : Window := Standard_Window)
+   is
+      function Wclear (W : Window) return C_Int;
+      pragma Import (C, Wclear, "wclear");
+   begin
+      if Wclear (Win) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Clear;
+
+   procedure Clear_To_End_Of_Screen (Win : Window := Standard_Window)
+   is
+      function Wclearbot (W : Window) return C_Int;
+      pragma Import (C, Wclearbot, "wclrtobot");
+   begin
+      if Wclearbot (Win) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Clear_To_End_Of_Screen;
+
+   procedure Clear_To_End_Of_Line (Win : Window := Standard_Window)
+   is
+      function Wcleareol (W : Window) return C_Int;
+      pragma Import (C, Wcleareol, "wclrtoeol");
+   begin
+      if Wcleareol (Win) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Clear_To_End_Of_Line;
+------------------------------------------------------------------------------
+   procedure Set_Background
+     (Win : Window := Standard_Window;
+      Ch  : Attributed_Character)
+   is
+      procedure WBackground (W : Window; Ch : Attributed_Character);
+      pragma Import (C, WBackground, "wbkgdset");
+   begin
+      WBackground (Win, Ch);
+   end Set_Background;
+
+   procedure Change_Background
+     (Win : Window := Standard_Window;
+      Ch  : Attributed_Character)
+   is
+      function WChangeBkgd (W : Window; Ch : Attributed_Character)
+         return C_Int;
+      pragma Import (C, WChangeBkgd, "wbkgd");
+   begin
+      if WChangeBkgd (Win, Ch) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Change_Background;
+
+   function Get_Background (Win : Window := Standard_Window)
+     return Attributed_Character
+   is
+      function Wgetbkgd (Win : Window) return Attributed_Character;
+      pragma Import (C, Wgetbkgd, "getbkgd");
+   begin
+      return Wgetbkgd (Win);
+   end Get_Background;
+------------------------------------------------------------------------------
+   procedure Change_Lines_Status (Win   : Window := Standard_Window;
+                                  Start : Line_Position;
+                                  Count : Positive;
+                                  State : Boolean)
+   is
+      function Wtouchln (Win : Window;
+                         Sta : C_Int;
+                         Cnt : C_Int;
+                         Chg : C_Int) return C_Int;
+      pragma Import (C, Wtouchln, "wtouchln");
+   begin
+      if Wtouchln (Win, C_Int (Start), C_Int (Count),
+                   C_Int (Boolean'Pos (State))) = Curses_Err
+      then
+         raise Curses_Exception;
+      end if;
+   end Change_Lines_Status;
+
+   procedure Touch (Win : Window := Standard_Window)
+   is
+      Y : Line_Position;
+      X : Column_Position;
+   begin
+      Get_Size (Win, Y, X);
+      pragma Warnings (Off, X);         --  unreferenced
+      Change_Lines_Status (Win, 0, Positive (Y), True);
+   end Touch;
+
+   procedure Untouch (Win : Window := Standard_Window)
+   is
+      Y : Line_Position;
+      X : Column_Position;
+   begin
+      Get_Size (Win, Y, X);
+      pragma Warnings (Off, X);         --  unreferenced
+      Change_Lines_Status (Win, 0, Positive (Y), False);
+   end Untouch;
+
+   procedure Touch (Win   : Window := Standard_Window;
+                    Start : Line_Position;
+                    Count : Positive)
+   is
+   begin
+      Change_Lines_Status (Win, Start, Count, True);
+   end Touch;
+
+   function Is_Touched
+     (Win  : Window := Standard_Window;
+      Line : Line_Position) return Boolean
+   is
+      function WLineTouched (W : Window; L : C_Int) return Curses_Bool;
+      pragma Import (C, WLineTouched, "is_linetouched");
+   begin
+      if WLineTouched (Win, C_Int (Line)) = Curses_Bool_False then
+         return False;
+      else
+         return True;
+      end if;
+   end Is_Touched;
+
+   function Is_Touched
+     (Win : Window := Standard_Window) return Boolean
+   is
+      function WWinTouched (W : Window) return Curses_Bool;
+      pragma Import (C, WWinTouched, "is_wintouched");
+   begin
+      if WWinTouched (Win) = Curses_Bool_False then
+         return False;
+      else
+         return True;
+      end if;
+   end Is_Touched;
+------------------------------------------------------------------------------
+   procedure Copy
+     (Source_Window            : Window;
+      Destination_Window       : Window;
+      Source_Top_Row           : Line_Position;
+      Source_Left_Column       : Column_Position;
+      Destination_Top_Row      : Line_Position;
+      Destination_Left_Column  : Column_Position;
+      Destination_Bottom_Row   : Line_Position;
+      Destination_Right_Column : Column_Position;
+      Non_Destructive_Mode     : Boolean := True)
+   is
+      function Copywin (Src : Window;
+                        Dst : Window;
+                        Str : C_Int;
+                        Slc : C_Int;
+                        Dtr : C_Int;
+                        Dlc : C_Int;
+                        Dbr : C_Int;
+                        Drc : C_Int;
+                        Ndm : C_Int) return C_Int;
+      pragma Import (C, Copywin, "copywin");
+   begin
+      if Copywin (Source_Window,
+                  Destination_Window,
+                  C_Int (Source_Top_Row),
+                  C_Int (Source_Left_Column),
+                  C_Int (Destination_Top_Row),
+                  C_Int (Destination_Left_Column),
+                  C_Int (Destination_Bottom_Row),
+                  C_Int (Destination_Right_Column),
+                  Boolean'Pos (Non_Destructive_Mode)
+                 ) = Curses_Err
+      then
+         raise Curses_Exception;
+      end if;
+   end Copy;
+
+   procedure Overwrite
+     (Source_Window      : Window;
+      Destination_Window : Window)
+   is
+      function Overwrite (Src : Window; Dst : Window) return C_Int;
+      pragma Import (C, Overwrite, "overwrite");
+   begin
+      if Overwrite (Source_Window, Destination_Window) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Overwrite;
+
+   procedure Overlay
+     (Source_Window      : Window;
+      Destination_Window : Window)
+   is
+      function Overlay (Src : Window; Dst : Window) return C_Int;
+      pragma Import (C, Overlay, "overlay");
+   begin
+      if Overlay (Source_Window, Destination_Window) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Overlay;
+
+------------------------------------------------------------------------------
+   procedure Insert_Delete_Lines
+     (Win   : Window := Standard_Window;
+      Lines : Integer       := 1) -- default is to insert one line above
+   is
+      function Winsdelln (W : Window; N : C_Int) return C_Int;
+      pragma Import (C, Winsdelln, "winsdelln");
+   begin
+      if Winsdelln (Win, C_Int (Lines)) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Insert_Delete_Lines;
+
+   procedure Delete_Line (Win : Window := Standard_Window)
+   is
+   begin
+      Insert_Delete_Lines (Win, -1);
+   end Delete_Line;
+
+   procedure Insert_Line (Win : Window := Standard_Window)
+   is
+   begin
+      Insert_Delete_Lines (Win, 1);
+   end Insert_Line;
+------------------------------------------------------------------------------
+
+   procedure Get_Size
+     (Win               : Window := Standard_Window;
+      Number_Of_Lines   : out Line_Count;
+      Number_Of_Columns : out Column_Count)
+   is
+      function GetMaxY (W : Window) return C_Int;
+      pragma Import (C, GetMaxY, "getmaxy");
+
+      function GetMaxX (W : Window) return C_Int;
+      pragma Import (C, GetMaxX, "getmaxx");
+
+      Y : constant C_Int := GetMaxY (Win);
+      X : constant C_Int := GetMaxX (Win);
+   begin
+      Number_Of_Lines   := Line_Count (Y);
+      Number_Of_Columns := Column_Count (X);
+   end Get_Size;
+
+   procedure Get_Window_Position
+     (Win             : Window := Standard_Window;
+      Top_Left_Line   : out Line_Position;
+      Top_Left_Column : out Column_Position)
+   is
+      function GetBegY (W : Window) return C_Int;
+      pragma Import (C, GetBegY, "getbegy");
+
+      function GetBegX (W : Window) return C_Int;
+      pragma Import (C, GetBegX, "getbegx");
+
+      Y : constant C_Short := C_Short (GetBegY (Win));
+      X : constant C_Short := C_Short (GetBegX (Win));
+   begin
+      Top_Left_Line   := Line_Position (Y);
+      Top_Left_Column := Column_Position (X);
+   end Get_Window_Position;
+
+   procedure Get_Cursor_Position
+     (Win    :  Window := Standard_Window;
+      Line   : out Line_Position;
+      Column : out Column_Position)
+   is
+      function GetCurY (W : Window) return C_Int;
+      pragma Import (C, GetCurY, "getcury");
+
+      function GetCurX (W : Window) return C_Int;
+      pragma Import (C, GetCurX, "getcurx");
+
+      Y : constant C_Short := C_Short (GetCurY (Win));
+      X : constant C_Short := C_Short (GetCurX (Win));
+   begin
+      Line   := Line_Position (Y);
+      Column := Column_Position (X);
+   end Get_Cursor_Position;
+
+   procedure Get_Origin_Relative_To_Parent
+     (Win                :  Window;
+      Top_Left_Line      : out Line_Position;
+      Top_Left_Column    : out Column_Position;
+      Is_Not_A_Subwindow : out Boolean)
+   is
+      function GetParY (W : Window) return C_Int;
+      pragma Import (C, GetParY, "getpary");
+
+      function GetParX (W : Window) return C_Int;
+      pragma Import (C, GetParX, "getparx");
+
+      Y : constant C_Int := GetParY (Win);
+      X : constant C_Int := GetParX (Win);
+   begin
+      if Y = -1 then
+         Top_Left_Line   := Line_Position'Last;
+         Top_Left_Column := Column_Position'Last;
+         Is_Not_A_Subwindow := True;
+      else
+         Top_Left_Line   := Line_Position (Y);
+         Top_Left_Column := Column_Position (X);
+         Is_Not_A_Subwindow := False;
+      end if;
+   end Get_Origin_Relative_To_Parent;
+------------------------------------------------------------------------------
+   function New_Pad (Lines   : Line_Count;
+                     Columns : Column_Count) return Window
+   is
+      function Newpad (Lines : C_Int; Columns : C_Int) return Window;
+      pragma Import (C, Newpad, "newpad");
+
+      W : Window;
+   begin
+      W := Newpad (C_Int (Lines), C_Int (Columns));
+      if W = Null_Window then
+         raise Curses_Exception;
+      end if;
+      return W;
+   end New_Pad;
+
+   function Sub_Pad
+     (Pad                   : Window;
+      Number_Of_Lines       : Line_Count;
+      Number_Of_Columns     : Column_Count;
+      First_Line_Position   : Line_Position;
+      First_Column_Position : Column_Position) return Window
+   is
+      function Subpad
+        (Pad                   : Window;
+         Number_Of_Lines       : C_Int;
+         Number_Of_Columns     : C_Int;
+         First_Line_Position   : C_Int;
+         First_Column_Position : C_Int) return Window;
+      pragma Import (C, Subpad, "subpad");
+
+      W : Window;
+   begin
+      W := Subpad (Pad,
+                   C_Int (Number_Of_Lines),
+                   C_Int (Number_Of_Columns),
+                   C_Int (First_Line_Position),
+                   C_Int (First_Column_Position));
+      if W = Null_Window then
+         raise Curses_Exception;
+      end if;
+      return W;
+   end Sub_Pad;
+
+   procedure Refresh
+     (Pad                      : Window;
+      Source_Top_Row           : Line_Position;
+      Source_Left_Column       : Column_Position;
+      Destination_Top_Row      : Line_Position;
+      Destination_Left_Column  : Column_Position;
+      Destination_Bottom_Row   : Line_Position;
+      Destination_Right_Column : Column_Position)
+   is
+      function Prefresh
+        (Pad                      : Window;
+         Source_Top_Row           : C_Int;
+         Source_Left_Column       : C_Int;
+         Destination_Top_Row      : C_Int;
+         Destination_Left_Column  : C_Int;
+         Destination_Bottom_Row   : C_Int;
+         Destination_Right_Column : C_Int) return C_Int;
+      pragma Import (C, Prefresh, "prefresh");
+   begin
+      if Prefresh (Pad,
+                   C_Int (Source_Top_Row),
+                   C_Int (Source_Left_Column),
+                   C_Int (Destination_Top_Row),
+                   C_Int (Destination_Left_Column),
+                   C_Int (Destination_Bottom_Row),
+                   C_Int (Destination_Right_Column)) = Curses_Err
+      then
+         raise Curses_Exception;
+      end if;
+   end Refresh;
+
+   procedure Refresh_Without_Update
+     (Pad                      : Window;
+      Source_Top_Row           : Line_Position;
+      Source_Left_Column       : Column_Position;
+      Destination_Top_Row      : Line_Position;
+      Destination_Left_Column  : Column_Position;
+      Destination_Bottom_Row   : Line_Position;
+      Destination_Right_Column : Column_Position)
+   is
+      function Pnoutrefresh
+        (Pad                      : Window;
+         Source_Top_Row           : C_Int;
+         Source_Left_Column       : C_Int;
+         Destination_Top_Row      : C_Int;
+         Destination_Left_Column  : C_Int;
+         Destination_Bottom_Row   : C_Int;
+         Destination_Right_Column : C_Int) return C_Int;
+      pragma Import (C, Pnoutrefresh, "pnoutrefresh");
+   begin
+      if Pnoutrefresh (Pad,
+                       C_Int (Source_Top_Row),
+                       C_Int (Source_Left_Column),
+                       C_Int (Destination_Top_Row),
+                       C_Int (Destination_Left_Column),
+                       C_Int (Destination_Bottom_Row),
+                       C_Int (Destination_Right_Column)) = Curses_Err
+      then
+         raise Curses_Exception;
+      end if;
+   end Refresh_Without_Update;
+
+   procedure Add_Character_To_Pad_And_Echo_It
+     (Pad : Window;
+      Ch  : Attributed_Character)
+   is
+      function Pechochar (Pad : Window; Ch : Attributed_Character)
+                          return C_Int;
+      pragma Import (C, Pechochar, "pechochar");
+   begin
+      if Pechochar (Pad, Ch) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Add_Character_To_Pad_And_Echo_It;
+
+   procedure Add_Character_To_Pad_And_Echo_It
+     (Pad : Window;
+      Ch  : Character)
+   is
+   begin
+      Add_Character_To_Pad_And_Echo_It
+        (Pad,
+         Attributed_Character'(Ch    => Ch,
+                               Color => Color_Pair'First,
+                               Attr  => Normal_Video));
+   end Add_Character_To_Pad_And_Echo_It;
+------------------------------------------------------------------------------
+   procedure Scroll (Win    : Window := Standard_Window;
+                     Amount : Integer := 1)
+   is
+      function Wscrl (Win : Window; N : C_Int) return C_Int;
+      pragma Import (C, Wscrl, "wscrl");
+
+   begin
+      if Wscrl (Win, C_Int (Amount)) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Scroll;
+
+------------------------------------------------------------------------------
+   procedure Delete_Character (Win : Window := Standard_Window)
+   is
+      function Wdelch (Win : Window) return C_Int;
+      pragma Import (C, Wdelch, "wdelch");
+   begin
+      if Wdelch (Win) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Delete_Character;
+
+   procedure Delete_Character
+     (Win    : Window := Standard_Window;
+      Line   : Line_Position;
+      Column : Column_Position)
+   is
+      function Mvwdelch (Win : Window;
+                         Lin : C_Int;
+                         Col : C_Int) return C_Int;
+      pragma Import (C, Mvwdelch, "mvwdelch");
+   begin
+      if Mvwdelch (Win, C_Int (Line), C_Int (Column)) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Delete_Character;
+------------------------------------------------------------------------------
+   function Peek (Win : Window := Standard_Window)
+     return Attributed_Character
+   is
+      function Winch (Win : Window) return Attributed_Character;
+      pragma Import (C, Winch, "winch");
+   begin
+      return Winch (Win);
+   end Peek;
+
+   function Peek
+     (Win    : Window := Standard_Window;
+      Line   : Line_Position;
+      Column : Column_Position) return Attributed_Character
+   is
+      function Mvwinch (Win : Window;
+                        Lin : C_Int;
+                        Col : C_Int) return Attributed_Character;
+      pragma Import (C, Mvwinch, "mvwinch");
+   begin
+      return Mvwinch (Win, C_Int (Line), C_Int (Column));
+   end Peek;
+------------------------------------------------------------------------------
+   procedure Insert (Win : Window := Standard_Window;
+                     Ch  : Attributed_Character)
+   is
+      function Winsch (Win : Window; Ch : Attributed_Character) return C_Int;
+      pragma Import (C, Winsch, "winsch");
+   begin
+      if Winsch (Win, Ch) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Insert;
+
+   procedure Insert
+     (Win    : Window := Standard_Window;
+      Line   : Line_Position;
+      Column : Column_Position;
+      Ch     : Attributed_Character)
+   is
+      function Mvwinsch (Win : Window;
+                         Lin : C_Int;
+                         Col : C_Int;
+                         Ch  : Attributed_Character) return C_Int;
+      pragma Import (C, Mvwinsch, "mvwinsch");
+   begin
+      if Mvwinsch (Win,
+                   C_Int (Line),
+                   C_Int (Column),
+                   Ch) = Curses_Err
+      then
+         raise Curses_Exception;
+      end if;
+   end Insert;
+------------------------------------------------------------------------------
+   procedure Insert (Win : Window := Standard_Window;
+                     Str : String;
+                     Len : Integer := -1)
+   is
+      function Winsnstr (Win : Window;
+                         Str : char_array;
+                         Len : Integer := -1) return C_Int;
+      pragma Import (C, Winsnstr, "winsnstr");
+
+      Txt    : char_array (0 .. Str'Length);
+      Length : size_t;
+   begin
+      To_C (Str, Txt, Length);
+      if Winsnstr (Win, Txt, Len) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Insert;
+
+   procedure Insert
+     (Win    : Window := Standard_Window;
+      Line   : Line_Position;
+      Column : Column_Position;
+      Str    : String;
+      Len    : Integer := -1)
+   is
+      function Mvwinsnstr (Win    : Window;
+                           Line   : C_Int;
+                           Column : C_Int;
+                           Str    : char_array;
+                           Len    : C_Int) return C_Int;
+      pragma Import (C, Mvwinsnstr, "mvwinsnstr");
+
+      Txt    : char_array (0 .. Str'Length);
+      Length : size_t;
+   begin
+      To_C (Str, Txt, Length);
+      if Mvwinsnstr (Win, C_Int (Line), C_Int (Column), Txt, C_Int (Len))
+        = Curses_Err
+      then
+         raise Curses_Exception;
+      end if;
+   end Insert;
+------------------------------------------------------------------------------
+   procedure Peek (Win :  Window := Standard_Window;
+                   Str : out String;
+                   Len :  Integer := -1)
+   is
+      function Winnstr (Win : Window;
+                        Str : char_array;
+                        Len : C_Int) return C_Int;
+      pragma Import (C, Winnstr, "winnstr");
+
+      N   : Integer := Len;
+      Txt : char_array (0 .. Str'Length);
+      Cnt : Natural;
+   begin
+      if N < 0 then
+         N := Str'Length;
+      end if;
+      if N > Str'Length then
+         raise Constraint_Error;
+      end if;
+      Txt (0) := Interfaces.C.char'First;
+      if Winnstr (Win, Txt, C_Int (N)) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+      To_Ada (Txt, Str, Cnt, True);
+      if Cnt < Str'Length then
+         Str ((Str'First + Cnt) .. Str'Last) := (others => ' ');
+      end if;
+   end Peek;
+
+   procedure Peek
+     (Win    :  Window := Standard_Window;
+      Line   :  Line_Position;
+      Column :  Column_Position;
+      Str    : out String;
+      Len    :  Integer := -1)
+   is
+   begin
+      Move_Cursor (Win, Line, Column);
+      Peek (Win, Str, Len);
+   end Peek;
+------------------------------------------------------------------------------
+   procedure Peek
+     (Win :  Window := Standard_Window;
+      Str : out Attributed_String;
+      Len :  Integer := -1)
+   is
+      function Winchnstr (Win : Window;
+                          Str : chtype_array;             -- out
+                          Len : C_Int) return C_Int;
+      pragma Import (C, Winchnstr, "winchnstr");
+
+      N   : Integer := Len;
+      Txt : constant chtype_array (0 .. Str'Length)
+          := (0 => Default_Character);
+      Cnt : Natural := 0;
+   begin
+      if N < 0 then
+         N := Str'Length;
+      end if;
+      if N > Str'Length then
+         raise Constraint_Error;
+      end if;
+      if Winchnstr (Win, Txt, C_Int (N)) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+      for To in Str'Range loop
+         exit when Txt (size_t (Cnt)) = Default_Character;
+         Str (To) := Txt (size_t (Cnt));
+         Cnt := Cnt + 1;
+      end loop;
+      if Cnt < Str'Length then
+         Str ((Str'First + Cnt) .. Str'Last) :=
+           (others => (Ch => ' ',
+                       Color => Color_Pair'First,
+                       Attr => Normal_Video));
+      end if;
+   end Peek;
+
+   procedure Peek
+     (Win    :  Window := Standard_Window;
+      Line   :  Line_Position;
+      Column :  Column_Position;
+      Str    : out Attributed_String;
+      Len    : Integer := -1)
+   is
+   begin
+      Move_Cursor (Win, Line, Column);
+      Peek (Win, Str, Len);
+   end Peek;
+------------------------------------------------------------------------------
+   procedure Get (Win :  Window := Standard_Window;
+                  Str : out String;
+                  Len :  Integer := -1)
+   is
+      function Wgetnstr (Win : Window;
+                         Str : char_array;
+                         Len : C_Int) return C_Int;
+      pragma Import (C, Wgetnstr, "wgetnstr");
+
+      N   : Integer := Len;
+      Txt : char_array (0 .. Str'Length);
+      Cnt : Natural;
+   begin
+      if N < 0 then
+         N := Str'Length;
+      end if;
+      if N > Str'Length then
+         raise Constraint_Error;
+      end if;
+      Txt (0) := Interfaces.C.char'First;
+      if Wgetnstr (Win, Txt, C_Int (N)) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+      To_Ada (Txt, Str, Cnt, True);
+      if Cnt < Str'Length then
+         Str ((Str'First + Cnt) .. Str'Last) := (others => ' ');
+      end if;
+   end Get;
+
+   procedure Get
+     (Win    :  Window := Standard_Window;
+      Line   :  Line_Position;
+      Column :  Column_Position;
+      Str    : out String;
+      Len    :  Integer := -1)
+   is
+   begin
+      Move_Cursor (Win, Line, Column);
+      Get (Win, Str, Len);
+   end Get;
+------------------------------------------------------------------------------
+   procedure Init_Soft_Label_Keys
+     (Format : Soft_Label_Key_Format := Three_Two_Three)
+   is
+      function Slk_Init (Fmt : C_Int) return C_Int;
+      pragma Import (C, Slk_Init, "slk_init");
+   begin
+      if Slk_Init (Soft_Label_Key_Format'Pos (Format)) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Init_Soft_Label_Keys;
+
+   procedure Set_Soft_Label_Key (Label : Label_Number;
+                                 Text  : String;
+                                 Fmt   : Label_Justification := Left)
+   is
+      function Slk_Set (Label : C_Int;
+                        Txt   : char_array;
+                        Fmt   : C_Int) return C_Int;
+      pragma Import (C, Slk_Set, "slk_set");
+
+      Txt : char_array (0 .. Text'Length);
+      Len : size_t;
+   begin
+      To_C (Text, Txt, Len);
+      if Slk_Set (C_Int (Label), Txt,
+                  C_Int (Label_Justification'Pos (Fmt))) = Curses_Err
+      then
+         raise Curses_Exception;
+      end if;
+   end Set_Soft_Label_Key;
+
+   procedure Refresh_Soft_Label_Keys
+   is
+      function Slk_Refresh return C_Int;
+      pragma Import (C, Slk_Refresh, "slk_refresh");
+   begin
+      if Slk_Refresh = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Refresh_Soft_Label_Keys;
+
+   procedure Refresh_Soft_Label_Keys_Without_Update
+   is
+      function Slk_Noutrefresh return C_Int;
+      pragma Import (C, Slk_Noutrefresh, "slk_noutrefresh");
+   begin
+      if Slk_Noutrefresh = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Refresh_Soft_Label_Keys_Without_Update;
+
+   procedure Get_Soft_Label_Key (Label : Label_Number;
+                                 Text  : out String)
+   is
+      function Slk_Label (Label : C_Int) return chars_ptr;
+      pragma Import (C, Slk_Label, "slk_label");
+   begin
+      Fill_String (Slk_Label (C_Int (Label)), Text);
+   end Get_Soft_Label_Key;
+
+   function Get_Soft_Label_Key (Label : Label_Number) return String
+   is
+      function Slk_Label (Label : C_Int) return chars_ptr;
+      pragma Import (C, Slk_Label, "slk_label");
+   begin
+      return Fill_String (Slk_Label (C_Int (Label)));
+   end Get_Soft_Label_Key;
+
+   procedure Clear_Soft_Label_Keys
+   is
+      function Slk_Clear return C_Int;
+      pragma Import (C, Slk_Clear, "slk_clear");
+   begin
+      if Slk_Clear = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Clear_Soft_Label_Keys;
+
+   procedure Restore_Soft_Label_Keys
+   is
+      function Slk_Restore return C_Int;
+      pragma Import (C, Slk_Restore, "slk_restore");
+   begin
+      if Slk_Restore = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Restore_Soft_Label_Keys;
+
+   procedure Touch_Soft_Label_Keys
+   is
+      function Slk_Touch return C_Int;
+      pragma Import (C, Slk_Touch, "slk_touch");
+   begin
+      if Slk_Touch = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Touch_Soft_Label_Keys;
+
+   procedure Switch_Soft_Label_Key_Attributes
+     (Attr : Character_Attribute_Set;
+      On   : Boolean := True)
+   is
+      function Slk_Attron (Ch : Attributed_Character) return C_Int;
+      pragma Import (C, Slk_Attron, "slk_attron");
+      function Slk_Attroff (Ch : Attributed_Character) return C_Int;
+      pragma Import (C, Slk_Attroff, "slk_attroff");
+
+      Err : C_Int;
+      Ch  : constant Attributed_Character := (Ch    => Character'First,
+                                              Attr  => Attr,
+                                              Color => Color_Pair'First);
+   begin
+      if On then
+         Err := Slk_Attron  (Ch);
+      else
+         Err := Slk_Attroff (Ch);
+      end if;
+      if Err = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Switch_Soft_Label_Key_Attributes;
+
+   procedure Set_Soft_Label_Key_Attributes
+     (Attr  : Character_Attribute_Set := Normal_Video;
+      Color : Color_Pair := Color_Pair'First)
+   is
+      function Slk_Attrset (Ch : Attributed_Character) return C_Int;
+      pragma Import (C, Slk_Attrset, "slk_attrset");
+
+      Ch : constant Attributed_Character := (Ch    => Character'First,
+                                             Attr  => Attr,
+                                             Color => Color);
+   begin
+      if Slk_Attrset (Ch) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Set_Soft_Label_Key_Attributes;
+
+   function Get_Soft_Label_Key_Attributes return Character_Attribute_Set
+   is
+      function Slk_Attr return Attributed_Character;
+      pragma Import (C, Slk_Attr, "slk_attr");
+
+      Attr : constant Attributed_Character := Slk_Attr;
+   begin
+      return Attr.Attr;
+   end Get_Soft_Label_Key_Attributes;
+
+   function Get_Soft_Label_Key_Attributes return Color_Pair
+   is
+      function Slk_Attr return Attributed_Character;
+      pragma Import (C, Slk_Attr, "slk_attr");
+
+      Attr : constant Attributed_Character := Slk_Attr;
+   begin
+      return Attr.Color;
+   end Get_Soft_Label_Key_Attributes;
+
+   procedure Set_Soft_Label_Key_Color (Pair : Color_Pair)
+   is
+      function Slk_Color (Color : C_Short) return C_Int;
+      pragma Import (C, Slk_Color, "slk_color");
+   begin
+      if Slk_Color (C_Short (Pair)) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Set_Soft_Label_Key_Color;
+
+------------------------------------------------------------------------------
+   procedure Enable_Key (Key    : Special_Key_Code;
+                         Enable : Boolean := True)
+   is
+      function Keyok (Keycode : C_Int;
+                      On_Off  : Curses_Bool) return C_Int;
+      pragma Import (C, Keyok, "keyok");
+   begin
+      if Keyok (C_Int (Key), Curses_Bool (Boolean'Pos (Enable)))
+        = Curses_Err
+      then
+         raise Curses_Exception;
+      end if;
+   end Enable_Key;
+------------------------------------------------------------------------------
+   procedure Define_Key (Definition : String;
+                         Key        : Special_Key_Code)
+   is
+      function Defkey (Def : char_array;
+                       Key : C_Int) return C_Int;
+      pragma Import (C, Defkey, "define_key");
+
+      Txt    : char_array (0 .. Definition'Length);
+      Length : size_t;
+   begin
+      To_C (Definition, Txt, Length);
+      if Defkey (Txt, C_Int (Key)) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Define_Key;
+------------------------------------------------------------------------------
+   procedure Un_Control (Ch  : Attributed_Character;
+                         Str : out String)
+   is
+      function Unctrl (Ch : Attributed_Character) return chars_ptr;
+      pragma Import (C, Unctrl, "unctrl");
+   begin
+      Fill_String (Unctrl (Ch), Str);
+   end Un_Control;
+
+   function Un_Control (Ch : Attributed_Character) return String
+   is
+      function Unctrl (Ch : Attributed_Character) return chars_ptr;
+      pragma Import (C, Unctrl, "unctrl");
+   begin
+      return Fill_String (Unctrl (Ch));
+   end Un_Control;
+
+   procedure Delay_Output (Msecs : Natural)
+   is
+      function Delayoutput (Msecs : C_Int) return C_Int;
+      pragma Import (C, Delayoutput, "delay_output");
+   begin
+      if Delayoutput (C_Int (Msecs)) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Delay_Output;
+
+   procedure Flush_Input
+   is
+      function Flushinp return C_Int;
+      pragma Import (C, Flushinp, "flushinp");
+   begin
+      if Flushinp = Curses_Err then  -- docu says that never happens, but...
+         raise Curses_Exception;
+      end if;
+   end Flush_Input;
+------------------------------------------------------------------------------
+   function Baudrate return Natural
+   is
+      function Baud return C_Int;
+      pragma Import (C, Baud, "baudrate");
+   begin
+      return Natural (Baud);
+   end Baudrate;
+
+   function Erase_Character return Character
+   is
+      function Erasechar return C_Int;
+      pragma Import (C, Erasechar, "erasechar");
+   begin
+      return Character'Val (Erasechar);
+   end Erase_Character;
+
+   function Kill_Character return Character
+   is
+      function Killchar return C_Int;
+      pragma Import (C, Killchar, "killchar");
+   begin
+      return Character'Val (Killchar);
+   end Kill_Character;
+
+   function Has_Insert_Character return Boolean
+   is
+      function Has_Ic return Curses_Bool;
+      pragma Import (C, Has_Ic, "has_ic");
+   begin
+      if Has_Ic = Curses_Bool_False then
+         return False;
+      else
+         return True;
+      end if;
+   end Has_Insert_Character;
+
+   function Has_Insert_Line return Boolean
+   is
+      function Has_Il return Curses_Bool;
+      pragma Import (C, Has_Il, "has_il");
+   begin
+      if Has_Il = Curses_Bool_False then
+         return False;
+      else
+         return True;
+      end if;
+   end Has_Insert_Line;
+
+   function Supported_Attributes return Character_Attribute_Set
+   is
+      function Termattrs return Attributed_Character;
+      pragma Import (C, Termattrs, "termattrs");
+
+      Ch : constant Attributed_Character := Termattrs;
+   begin
+      return Ch.Attr;
+   end Supported_Attributes;
+
+   procedure Long_Name (Name : out String)
+   is
+      function Longname return chars_ptr;
+      pragma Import (C, Longname, "longname");
+   begin
+      Fill_String (Longname, Name);
+   end Long_Name;
+
+   function Long_Name return String
+   is
+      function Longname return chars_ptr;
+      pragma Import (C, Longname, "longname");
+   begin
+      return Fill_String (Longname);
+   end Long_Name;
+
+   procedure Terminal_Name (Name : out String)
+   is
+      function Termname return chars_ptr;
+      pragma Import (C, Termname, "termname");
+   begin
+      Fill_String (Termname, Name);
+   end Terminal_Name;
+
+   function Terminal_Name return String
+   is
+      function Termname return chars_ptr;
+      pragma Import (C, Termname, "termname");
+   begin
+      return Fill_String (Termname);
+   end Terminal_Name;
+------------------------------------------------------------------------------
+   procedure Init_Pair (Pair : Redefinable_Color_Pair;
+                        Fore : Color_Number;
+                        Back : Color_Number)
+   is
+      function Initpair (Pair : C_Short;
+                         Fore : C_Short;
+                         Back : C_Short) return C_Int;
+      pragma Import (C, Initpair, "init_pair");
+   begin
+      if Integer (Pair) >= Number_Of_Color_Pairs then
+         raise Constraint_Error;
+      end if;
+      if Integer (Fore) >= Number_Of_Colors or else
+         Integer (Back) >= Number_Of_Colors
+      then
+         raise Constraint_Error;
+      end if;
+      if Initpair (C_Short (Pair), C_Short (Fore), C_Short (Back))
+        = Curses_Err
+      then
+         raise Curses_Exception;
+      end if;
+   end Init_Pair;
+
+   procedure Pair_Content (Pair : Color_Pair;
+                           Fore : out Color_Number;
+                           Back : out Color_Number)
+   is
+      type C_Short_Access is access all C_Short;
+      function Paircontent (Pair : C_Short;
+                            Fp   : C_Short_Access;
+                            Bp   : C_Short_Access) return C_Int;
+      pragma Import (C, Paircontent, "pair_content");
+
+      F, B : aliased C_Short;
+   begin
+      if Paircontent (C_Short (Pair), F'Access, B'Access) = Curses_Err then
+         raise Curses_Exception;
+      else
+         Fore := Color_Number (F);
+         Back := Color_Number (B);
+      end if;
+   end Pair_Content;
+
+   function Has_Colors return Boolean
+   is
+      function Hascolors return Curses_Bool;
+      pragma Import (C, Hascolors, "has_colors");
+   begin
+      if Hascolors = Curses_Bool_False then
+         return False;
+      else
+         return True;
+      end if;
+   end Has_Colors;
+
+   procedure Init_Color (Color : Color_Number;
+                         Red   : RGB_Value;
+                         Green : RGB_Value;
+                         Blue  : RGB_Value)
+   is
+      function Initcolor (Col   : C_Short;
+                          Red   : C_Short;
+                          Green : C_Short;
+                          Blue  : C_Short) return C_Int;
+      pragma Import (C, Initcolor, "init_color");
+   begin
+      if Initcolor (C_Short (Color), C_Short (Red), C_Short (Green),
+                    C_Short (Blue)) = Curses_Err
+      then
+            raise Curses_Exception;
+      end if;
+   end Init_Color;
+
+   function Can_Change_Color return Boolean
+   is
+      function Canchangecolor return Curses_Bool;
+      pragma Import (C, Canchangecolor, "can_change_color");
+   begin
+      if Canchangecolor = Curses_Bool_False then
+         return False;
+      else
+         return True;
+      end if;
+   end Can_Change_Color;
+
+   procedure Color_Content (Color :  Color_Number;
+                            Red   : out RGB_Value;
+                            Green : out RGB_Value;
+                            Blue  : out RGB_Value)
+   is
+      type C_Short_Access is access all C_Short;
+
+      function Colorcontent (Color : C_Short; R, G, B : C_Short_Access)
+                             return C_Int;
+      pragma Import (C, Colorcontent, "color_content");
+
+      R, G, B : aliased C_Short;
+   begin
+      if Colorcontent (C_Short (Color), R'Access, G'Access, B'Access) =
+        Curses_Err
+      then
+         raise Curses_Exception;
+      else
+         Red   := RGB_Value (R);
+         Green := RGB_Value (G);
+         Blue  := RGB_Value (B);
+      end if;
+   end Color_Content;
+
+------------------------------------------------------------------------------
+   procedure Save_Curses_Mode (Mode : Curses_Mode)
+   is
+      function Def_Prog_Mode return C_Int;
+      pragma Import (C, Def_Prog_Mode, "def_prog_mode");
+      function Def_Shell_Mode return C_Int;
+      pragma Import (C, Def_Shell_Mode, "def_shell_mode");
+
+      Err : C_Int;
+   begin
+      case Mode is
+         when Curses => Err := Def_Prog_Mode;
+         when Shell  => Err := Def_Shell_Mode;
+      end case;
+      if Err = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Save_Curses_Mode;
+
+   procedure Reset_Curses_Mode (Mode : Curses_Mode)
+   is
+      function Reset_Prog_Mode return C_Int;
+      pragma Import (C, Reset_Prog_Mode, "reset_prog_mode");
+      function Reset_Shell_Mode return C_Int;
+      pragma Import (C, Reset_Shell_Mode, "reset_shell_mode");
+
+      Err : C_Int;
+   begin
+      case Mode is
+         when Curses => Err := Reset_Prog_Mode;
+         when Shell  => Err := Reset_Shell_Mode;
+      end case;
+      if Err = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Reset_Curses_Mode;
+
+   procedure Save_Terminal_State
+   is
+      function Savetty return C_Int;
+      pragma Import (C, Savetty, "savetty");
+   begin
+      if Savetty = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Save_Terminal_State;
+
+   procedure Reset_Terminal_State
+   is
+      function Resetty return C_Int;
+      pragma Import (C, Resetty, "resetty");
+   begin
+      if Resetty = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Reset_Terminal_State;
+
+   procedure Rip_Off_Lines (Lines : Integer;
+                            Proc  : Stdscr_Init_Proc)
+   is
+      function Ripoffline (Lines : C_Int;
+                           Proc  : Stdscr_Init_Proc) return C_Int;
+      pragma Import (C, Ripoffline, "_nc_ripoffline");
+   begin
+      if Ripoffline (C_Int (Lines), Proc) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Rip_Off_Lines;
+
+   procedure Set_Cursor_Visibility (Visibility : in out Cursor_Visibility)
+   is
+      function Curs_Set (Curs : C_Int) return C_Int;
+      pragma Import (C, Curs_Set, "curs_set");
+
+      Res : C_Int;
+   begin
+      Res := Curs_Set (Cursor_Visibility'Pos (Visibility));
+      if Res /= Curses_Err then
+         Visibility := Cursor_Visibility'Val (Res);
+      end if;
+   end Set_Cursor_Visibility;
+
+   procedure Nap_Milli_Seconds (Ms : Natural)
+   is
+      function Napms (Ms : C_Int) return C_Int;
+      pragma Import (C, Napms, "napms");
+   begin
+      if Napms (C_Int (Ms)) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Nap_Milli_Seconds;
+------------------------------------------------------------------------------
+   function Lines return Line_Count
+   is
+      function LINES_As_Function return Interfaces.C.int;
+      pragma Import (C, LINES_As_Function, "LINES_as_function");
+   begin
+      return Line_Count (LINES_As_Function);
+   end Lines;
+
+   function Columns return Column_Count
+   is
+      function COLS_As_Function return Interfaces.C.int;
+      pragma Import (C, COLS_As_Function, "COLS_as_function");
+   begin
+      return Column_Count (COLS_As_Function);
+   end Columns;
+
+   function Tab_Size return Natural
+   is
+      function TABSIZE_As_Function return Interfaces.C.int;
+      pragma Import (C, TABSIZE_As_Function, "TABSIZE_as_function");
+
+   begin
+      return Natural (TABSIZE_As_Function);
+   end Tab_Size;
+
+   function Number_Of_Colors return Natural
+   is
+      function COLORS_As_Function return Interfaces.C.int;
+      pragma Import (C, COLORS_As_Function, "COLORS_as_function");
+   begin
+      return Natural (COLORS_As_Function);
+   end Number_Of_Colors;
+
+   function Number_Of_Color_Pairs return Natural
+   is
+      function COLOR_PAIRS_As_Function return Interfaces.C.int;
+      pragma Import (C, COLOR_PAIRS_As_Function, "COLOR_PAIRS_as_function");
+   begin
+      return Natural (COLOR_PAIRS_As_Function);
+   end Number_Of_Color_Pairs;
+------------------------------------------------------------------------------
+   procedure Transform_Coordinates
+     (W      : Window := Standard_Window;
+      Line   : in out Line_Position;
+      Column : in out Column_Position;
+      Dir    : Transform_Direction := From_Screen)
+   is
+      type Int_Access is access all C_Int;
+      function Transform (W    : Window;
+                          Y, X : Int_Access;
+                          Dir  : Curses_Bool) return C_Int;
+      pragma Import (C, Transform, "wmouse_trafo");
+
+      X : aliased C_Int := C_Int (Column);
+      Y : aliased C_Int := C_Int (Line);
+      D : Curses_Bool := Curses_Bool_False;
+      R : C_Int;
+   begin
+      if Dir = To_Screen then
+         D := 1;
+      end if;
+      R := Transform (W, Y'Access, X'Access, D);
+      if R = Curses_False then
+         raise Curses_Exception;
+      else
+         Line   := Line_Position (Y);
+         Column := Column_Position (X);
+      end if;
+   end Transform_Coordinates;
+------------------------------------------------------------------------------
+   procedure Use_Default_Colors is
+      function C_Use_Default_Colors return C_Int;
+      pragma Import (C, C_Use_Default_Colors, "use_default_colors");
+      Err : constant C_Int := C_Use_Default_Colors;
+   begin
+      if Err = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Use_Default_Colors;
+
+   procedure Assume_Default_Colors (Fore : Color_Number := Default_Color;
+                                    Back : Color_Number := Default_Color)
+   is
+      function C_Assume_Default_Colors (Fore : C_Int;
+                                        Back : C_Int) return C_Int;
+      pragma Import (C, C_Assume_Default_Colors, "assume_default_colors");
+
+      Err : constant C_Int := C_Assume_Default_Colors (C_Int (Fore),
+                                                       C_Int (Back));
+   begin
+      if Err = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Assume_Default_Colors;
+------------------------------------------------------------------------------
+   function Curses_Version return String
+   is
+      function curses_versionC return chars_ptr;
+      pragma Import (C, curses_versionC, "curses_version");
+      Result : constant chars_ptr := curses_versionC;
+   begin
+      return Fill_String (Result);
+   end Curses_Version;
+------------------------------------------------------------------------------
+   procedure Curses_Free_All is
+      procedure curses_freeall;
+      pragma Import (C, curses_freeall, "_nc_freeall");
+   begin
+      --  Use this only for testing: you cannot use curses after calling it,
+      --  so it has to be the "last" thing done before exiting the program.
+      --  This will not really free ALL of memory used by curses.  That is
+      --  because it cannot free the memory used for stdout's setbuf.  The
+      --  _nc_free_and_exit() procedure can do that, but it can be invoked
+      --  safely only from C - and again, that only as the "last" thing done
+      --  before exiting the program.
+      curses_freeall;
+   end Curses_Free_All;
+------------------------------------------------------------------------------
+   function Use_Extended_Names (Enable : Boolean) return Boolean
+   is
+      function use_extended_namesC (e : Curses_Bool) return C_Int;
+      pragma Import (C, use_extended_namesC, "use_extended_names");
+
+      Res : constant C_Int :=
+         use_extended_namesC (Curses_Bool (Boolean'Pos (Enable)));
+   begin
+      if Res = C_Int (Curses_Bool_False) then
+         return False;
+      else
+         return True;
+      end if;
+   end Use_Extended_Names;
+------------------------------------------------------------------------------
+   procedure Screen_Dump_To_File (Filename : String)
+   is
+      function scr_dump (f : char_array) return C_Int;
+      pragma Import (C, scr_dump, "scr_dump");
+      Txt    : char_array (0 .. Filename'Length);
+      Length : size_t;
+   begin
+      To_C (Filename, Txt, Length);
+      if Curses_Err = scr_dump (Txt) then
+         raise Curses_Exception;
+      end if;
+   end Screen_Dump_To_File;
+
+   procedure Screen_Restore_From_File (Filename : String)
+   is
+      function scr_restore (f : char_array) return C_Int;
+      pragma Import (C, scr_restore, "scr_restore");
+      Txt    : char_array (0 .. Filename'Length);
+      Length : size_t;
+   begin
+      To_C (Filename, Txt, Length);
+      if Curses_Err = scr_restore (Txt)  then
+         raise Curses_Exception;
+      end if;
+   end Screen_Restore_From_File;
+
+   procedure Screen_Init_From_File (Filename : String)
+   is
+      function scr_init (f : char_array) return C_Int;
+      pragma Import (C, scr_init, "scr_init");
+      Txt    : char_array (0 .. Filename'Length);
+      Length : size_t;
+   begin
+      To_C (Filename, Txt, Length);
+      if Curses_Err = scr_init (Txt) then
+         raise Curses_Exception;
+      end if;
+   end Screen_Init_From_File;
+
+   procedure Screen_Set_File (Filename : String)
+   is
+      function scr_set (f : char_array) return C_Int;
+      pragma Import (C, scr_set, "scr_set");
+      Txt    : char_array (0 .. Filename'Length);
+      Length : size_t;
+   begin
+      To_C (Filename, Txt, Length);
+      if Curses_Err = scr_set (Txt) then
+         raise Curses_Exception;
+      end if;
+   end Screen_Set_File;
+------------------------------------------------------------------------------
+   procedure Resize (Win               : Window := Standard_Window;
+                     Number_Of_Lines   : Line_Count;
+                     Number_Of_Columns : Column_Count) is
+      function wresize (win     : Window;
+                        lines   : C_Int;
+                        columns : C_Int) return C_Int;
+      pragma Import (C, wresize);
+   begin
+      if wresize (Win,
+                  C_Int (Number_Of_Lines),
+                  C_Int (Number_Of_Columns)) = Curses_Err
+      then
+         raise Curses_Exception;
+      end if;
+   end Resize;
+------------------------------------------------------------------------------
+
+end Terminal_Interface.Curses;
diff --git a/Ada95/gen/terminal_interface-curses.ads.m4 b/Ada95/gen/terminal_interface-curses.ads.m4
new file mode 100644
index 0000000..a5e9103
--- /dev/null
+++ b/Ada95/gen/terminal_interface-curses.ads.m4
@@ -0,0 +1,2015 @@
+--  -*- ada -*-
+define(`HTMLNAME',`terminal_interface-curses__ads.htm')dnl
+include(M4MACRO)------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                         Terminal_Interface.Curses                        --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2011,2014 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.48 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with System.Storage_Elements;
+with Interfaces.C;   --  We need this for some assertions.
+
+with Terminal_Interface.Curses_Constants;
+
+package Terminal_Interface.Curses is
+   pragma Preelaborate (Terminal_Interface.Curses);
+   pragma Linker_Options ("-lncurses" & Curses_Constants.DFT_ARG_SUFFIX);
+
+   Major_Version : constant := Curses_Constants.NCURSES_VERSION_MAJOR;
+   Minor_Version : constant := Curses_Constants.NCURSES_VERSION_MINOR;
+   NC_Version : String renames Curses_Constants.Version;
+
+   type Window is private;
+   Null_Window : constant Window;
+
+   type Line_Position   is new Integer; --  line coordinate
+   type Column_Position is new Integer; --  column coordinate
+
+   subtype Line_Count   is Line_Position   range 1 .. Line_Position'Last;
+   --  Type to count lines. We do not allow null windows, so must be positive
+   subtype Column_Count is Column_Position range 1 .. Column_Position'Last;
+   --  Type to count columns. We do not allow null windows, so must be positive
+
+   type Key_Code is new Integer;
+   --  That is anything including real characters, special keys and logical
+   --  request codes.
+
+   --  FIXME: The "-1" should be Curses_Err
+   subtype Real_Key_Code is Key_Code range -1 .. Curses_Constants.KEY_MAX;
+   --  This are the codes that potentially represent a real keystroke.
+   --  Not all codes may be possible on a specific terminal. To check the
+   --  availability of a special key, the Has_Key function is provided.
+
+   subtype Special_Key_Code is Real_Key_Code
+     range Curses_Constants. KEY_MIN - 1 .. Real_Key_Code'Last;
+   --  Type for a function- or special key number
+
+   subtype Normal_Key_Code is Real_Key_Code range
+     Character'Pos (Character'First) .. Character'Pos (Character'Last);
+   --  This are the codes for regular (incl. non-graphical) characters.
+
+   --  For those who like to use the original key names we produce them were
+   --  they differ from the original.
+
+   --  Constants for function- and special keys
+   Key_None                    : constant Special_Key_Code
+     := Curses_Constants.KEY_MIN - 1;
+   Key_Min                     : constant Special_Key_Code
+     := Curses_Constants.KEY_MIN;
+   Key_Break                   : constant Special_Key_Code
+     := Curses_Constants.KEY_BREAK;
+   KEY_DOWN                    : constant Special_Key_Code
+     := Curses_Constants.KEY_DOWN;
+   Key_Cursor_Down             : Special_Key_Code renames KEY_DOWN;
+   KEY_UP                      : constant Special_Key_Code
+     := Curses_Constants.KEY_UP;
+   Key_Cursor_Up               : Special_Key_Code renames KEY_UP;
+   KEY_LEFT                    : constant Special_Key_Code
+     := Curses_Constants.KEY_LEFT;
+   Key_Cursor_Left             : Special_Key_Code renames KEY_LEFT;
+   KEY_RIGHT                   : constant Special_Key_Code
+     := Curses_Constants.KEY_RIGHT;
+   Key_Cursor_Right            : Special_Key_Code renames KEY_RIGHT;
+   Key_Home                    : constant Special_Key_Code
+     := Curses_Constants.KEY_HOME;
+   Key_Backspace               : constant Special_Key_Code
+     := Curses_Constants.KEY_BACKSPACE;
+   Key_F0                      : constant Special_Key_Code
+     := Curses_Constants.KEY_F0;
+   Key_F1                      : constant Special_Key_Code
+     := Curses_Constants.KEY_F1;
+   Key_F2                      : constant Special_Key_Code
+     := Curses_Constants.KEY_F2;
+   Key_F3                      : constant Special_Key_Code
+     := Curses_Constants.KEY_F3;
+   Key_F4                      : constant Special_Key_Code
+     := Curses_Constants.KEY_F4;
+   Key_F5                      : constant Special_Key_Code
+     := Curses_Constants.KEY_F5;
+   Key_F6                      : constant Special_Key_Code
+     := Curses_Constants.KEY_F6;
+   Key_F7                      : constant Special_Key_Code
+     := Curses_Constants.KEY_F7;
+   Key_F8                      : constant Special_Key_Code
+     := Curses_Constants.KEY_F8;
+   Key_F9                      : constant Special_Key_Code
+     := Curses_Constants.KEY_F9;
+   Key_F10                     : constant Special_Key_Code
+     := Curses_Constants.KEY_F10;
+   Key_F11                     : constant Special_Key_Code
+     := Curses_Constants.KEY_F11;
+   Key_F12                     : constant Special_Key_Code
+     := Curses_Constants.KEY_F12;
+   Key_F13                     : constant Special_Key_Code
+     := Curses_Constants.KEY_F13;
+   Key_F14                     : constant Special_Key_Code
+     := Curses_Constants.KEY_F14;
+   Key_F15                     : constant Special_Key_Code
+     := Curses_Constants.KEY_F15;
+   Key_F16                     : constant Special_Key_Code
+     := Curses_Constants.KEY_F16;
+   Key_F17                     : constant Special_Key_Code
+     := Curses_Constants.KEY_F17;
+   Key_F18                     : constant Special_Key_Code
+     := Curses_Constants.KEY_F18;
+   Key_F19                     : constant Special_Key_Code
+     := Curses_Constants.KEY_F19;
+   Key_F20                     : constant Special_Key_Code
+     := Curses_Constants.KEY_F20;
+   Key_F21                     : constant Special_Key_Code
+     := Curses_Constants.KEY_F21;
+   Key_F22                     : constant Special_Key_Code
+     := Curses_Constants.KEY_F22;
+   Key_F23                     : constant Special_Key_Code
+     := Curses_Constants.KEY_F23;
+   Key_F24                     : constant Special_Key_Code
+     := Curses_Constants.KEY_F24;
+   KEY_DL                      : constant Special_Key_Code
+     := Curses_Constants.KEY_DL;
+   Key_Delete_Line             : Special_Key_Code renames KEY_DL;
+   KEY_IL                      : constant Special_Key_Code
+     := Curses_Constants.KEY_IL;
+   Key_Insert_Line             : Special_Key_Code renames KEY_IL;
+   KEY_DC                      : constant Special_Key_Code
+     := Curses_Constants.KEY_DC;
+   Key_Delete_Char             : Special_Key_Code renames KEY_DC;
+   KEY_IC                      : constant Special_Key_Code
+     := Curses_Constants.KEY_IC;
+   Key_Insert_Char             : Special_Key_Code renames KEY_IC;
+   KEY_EIC                     : constant Special_Key_Code
+     := Curses_Constants.KEY_EIC;
+   Key_Exit_Insert_Mode        : Special_Key_Code renames KEY_EIC;
+   KEY_CLEAR                   : constant Special_Key_Code
+     := Curses_Constants.KEY_CLEAR;
+   Key_Clear_Screen            : Special_Key_Code renames KEY_CLEAR;
+   KEY_EOS                     : constant Special_Key_Code
+     := Curses_Constants.KEY_EOS;
+   Key_Clear_End_Of_Screen     : Special_Key_Code renames KEY_EOS;
+   KEY_EOL                     : constant Special_Key_Code
+     := Curses_Constants.KEY_EOL;
+   Key_Clear_End_Of_Line       : Special_Key_Code renames KEY_EOL;
+   KEY_SF                      : constant Special_Key_Code
+     := Curses_Constants.KEY_SF;
+   Key_Scroll_1_Forward        : Special_Key_Code renames KEY_SF;
+   KEY_SR                      : constant Special_Key_Code
+     := Curses_Constants.KEY_SR;
+   Key_Scroll_1_Backward       : Special_Key_Code renames KEY_SR;
+   KEY_NPAGE                   : constant Special_Key_Code
+     := Curses_Constants.KEY_NPAGE;
+   Key_Next_Page               : Special_Key_Code renames KEY_NPAGE;
+   KEY_PPAGE                   : constant Special_Key_Code
+     := Curses_Constants.KEY_PPAGE;
+   Key_Previous_Page           : Special_Key_Code renames KEY_PPAGE;
+   KEY_STAB                    : constant Special_Key_Code
+     := Curses_Constants.KEY_STAB;
+   Key_Set_Tab                 : Special_Key_Code renames KEY_STAB;
+   KEY_CTAB                    : constant Special_Key_Code
+     := Curses_Constants.KEY_CTAB;
+   Key_Clear_Tab               : Special_Key_Code renames KEY_CTAB;
+   KEY_CATAB                   : constant Special_Key_Code
+     := Curses_Constants.KEY_CATAB;
+   Key_Clear_All_Tabs          : Special_Key_Code renames KEY_CATAB;
+   KEY_ENTER                   : constant Special_Key_Code
+     := Curses_Constants.KEY_ENTER;
+   Key_Enter_Or_Send           : Special_Key_Code renames KEY_ENTER;
+   KEY_SRESET                  : constant Special_Key_Code
+     := Curses_Constants.KEY_SRESET;
+   Key_Soft_Reset              : Special_Key_Code renames KEY_SRESET;
+   Key_Reset                   : constant Special_Key_Code
+     := Curses_Constants.KEY_RESET;
+   Key_Print                   : constant Special_Key_Code
+     := Curses_Constants.KEY_PRINT;
+   KEY_LL                      : constant Special_Key_Code
+     := Curses_Constants.KEY_LL;
+   Key_Bottom                  : Special_Key_Code renames KEY_LL;
+   KEY_A1                      : constant Special_Key_Code
+     := Curses_Constants.KEY_A1;
+   Key_Upper_Left_Of_Keypad    : Special_Key_Code renames KEY_A1;
+   KEY_A3                      : constant Special_Key_Code
+     := Curses_Constants.KEY_A3;
+   Key_Upper_Right_Of_Keypad   : Special_Key_Code renames KEY_A3;
+   KEY_B2                      : constant Special_Key_Code
+     := Curses_Constants.KEY_B2;
+   Key_Center_Of_Keypad        : Special_Key_Code renames KEY_B2;
+   KEY_C1                      : constant Special_Key_Code
+     := Curses_Constants.KEY_C1;
+   Key_Lower_Left_Of_Keypad    : Special_Key_Code renames KEY_C1;
+   KEY_C3                      : constant Special_Key_Code
+     := Curses_Constants.KEY_C3;
+   Key_Lower_Right_Of_Keypad   : Special_Key_Code renames KEY_C3;
+   KEY_BTAB                    : constant Special_Key_Code
+     := Curses_Constants.KEY_BTAB;
+   Key_Back_Tab                : Special_Key_Code renames KEY_BTAB;
+   KEY_BEG                     : constant Special_Key_Code
+     := Curses_Constants.KEY_BEG;
+   Key_Beginning               : Special_Key_Code renames KEY_BEG;
+   Key_Cancel                  : constant Special_Key_Code
+     := Curses_Constants.KEY_CANCEL;
+   Key_Close                   : constant Special_Key_Code
+     := Curses_Constants.KEY_CLOSE;
+   Key_Command                 : constant Special_Key_Code
+     := Curses_Constants.KEY_COMMAND;
+   Key_Copy                    : constant Special_Key_Code
+     := Curses_Constants.KEY_COPY;
+   Key_Create                  : constant Special_Key_Code
+     := Curses_Constants.KEY_CREATE;
+   Key_End                     : constant Special_Key_Code
+     := Curses_Constants.KEY_END;
+   Key_Exit                    : constant Special_Key_Code
+     := Curses_Constants.KEY_EXIT;
+   Key_Find                    : constant Special_Key_Code
+     := Curses_Constants.KEY_FIND;
+   Key_Help                    : constant Special_Key_Code
+     := Curses_Constants.KEY_HELP;
+   Key_Mark                    : constant Special_Key_Code
+     := Curses_Constants.KEY_MARK;
+   Key_Message                 : constant Special_Key_Code
+     := Curses_Constants.KEY_MESSAGE;
+   Key_Move                    : constant Special_Key_Code
+     := Curses_Constants.KEY_MOVE;
+   Key_Next                    : constant Special_Key_Code
+     := Curses_Constants.KEY_NEXT;
+   Key_Open                    : constant Special_Key_Code
+     := Curses_Constants.KEY_OPEN;
+   Key_Options                 : constant Special_Key_Code
+     := Curses_Constants.KEY_OPTIONS;
+   Key_Previous                : constant Special_Key_Code
+     := Curses_Constants.KEY_PREVIOUS;
+   Key_Redo                    : constant Special_Key_Code
+     := Curses_Constants.KEY_REDO;
+   Key_Reference               : constant Special_Key_Code
+     := Curses_Constants.KEY_REFERENCE;
+   Key_Refresh                 : constant Special_Key_Code
+     := Curses_Constants.KEY_REFRESH;
+   Key_Replace                 : constant Special_Key_Code
+     := Curses_Constants.KEY_REPLACE;
+   Key_Restart                 : constant Special_Key_Code
+     := Curses_Constants.KEY_RESTART;
+   Key_Resume                  : constant Special_Key_Code
+     := Curses_Constants.KEY_RESUME;
+   Key_Save                    : constant Special_Key_Code
+     := Curses_Constants.KEY_SAVE;
+   KEY_SBEG                    : constant Special_Key_Code
+     := Curses_Constants.KEY_SBEG;
+   Key_Shift_Begin             : Special_Key_Code renames KEY_SBEG;
+   KEY_SCANCEL                 : constant Special_Key_Code
+     := Curses_Constants.KEY_SCANCEL;
+   Key_Shift_Cancel            : Special_Key_Code renames KEY_SCANCEL;
+   KEY_SCOMMAND                : constant Special_Key_Code
+     := Curses_Constants.KEY_SCOMMAND;
+   Key_Shift_Command           : Special_Key_Code renames KEY_SCOMMAND;
+   KEY_SCOPY                   : constant Special_Key_Code
+     := Curses_Constants.KEY_SCOPY;
+   Key_Shift_Copy              : Special_Key_Code renames KEY_SCOPY;
+   KEY_SCREATE                 : constant Special_Key_Code
+     := Curses_Constants.KEY_SCREATE;
+   Key_Shift_Create            : Special_Key_Code renames KEY_SCREATE;
+   KEY_SDC                     : constant Special_Key_Code
+     := Curses_Constants.KEY_SDC;
+   Key_Shift_Delete_Char       : Special_Key_Code renames KEY_SDC;
+   KEY_SDL                     : constant Special_Key_Code
+     := Curses_Constants.KEY_SDL;
+   Key_Shift_Delete_Line       : Special_Key_Code renames KEY_SDL;
+   Key_Select                  : constant Special_Key_Code
+     := Curses_Constants.KEY_SELECT;
+   KEY_SEND                    : constant Special_Key_Code
+     := Curses_Constants.KEY_SEND;
+   Key_Shift_End               : Special_Key_Code renames KEY_SEND;
+   KEY_SEOL                    : constant Special_Key_Code
+     := Curses_Constants.KEY_SEOL;
+   Key_Shift_Clear_End_Of_Line : Special_Key_Code renames KEY_SEOL;
+   KEY_SEXIT                   : constant Special_Key_Code
+     := Curses_Constants.KEY_SEXIT;
+   Key_Shift_Exit              : Special_Key_Code renames KEY_SEXIT;
+   KEY_SFIND                   : constant Special_Key_Code
+     := Curses_Constants.KEY_SFIND;
+   Key_Shift_Find              : Special_Key_Code renames KEY_SFIND;
+   KEY_SHELP                   : constant Special_Key_Code
+     := Curses_Constants.KEY_SHELP;
+   Key_Shift_Help              : Special_Key_Code renames KEY_SHELP;
+   KEY_SHOME                   : constant Special_Key_Code
+     := Curses_Constants.KEY_SHOME;
+   Key_Shift_Home              : Special_Key_Code renames KEY_SHOME;
+   KEY_SIC                     : constant Special_Key_Code
+     := Curses_Constants.KEY_SIC;
+   Key_Shift_Insert_Char       : Special_Key_Code renames KEY_SIC;
+   KEY_SLEFT                   : constant Special_Key_Code
+     := Curses_Constants.KEY_SLEFT;
+   Key_Shift_Cursor_Left       : Special_Key_Code renames KEY_SLEFT;
+   KEY_SMESSAGE                : constant Special_Key_Code
+     := Curses_Constants.KEY_SMESSAGE;
+   Key_Shift_Message           : Special_Key_Code renames KEY_SMESSAGE;
+   KEY_SMOVE                   : constant Special_Key_Code
+     := Curses_Constants.KEY_SMOVE;
+   Key_Shift_Move              : Special_Key_Code renames KEY_SMOVE;
+   KEY_SNEXT                   : constant Special_Key_Code
+     := Curses_Constants.KEY_SNEXT;
+   Key_Shift_Next_Page         : Special_Key_Code renames KEY_SNEXT;
+   KEY_SOPTIONS                : constant Special_Key_Code
+     := Curses_Constants.KEY_SOPTIONS;
+   Key_Shift_Options           : Special_Key_Code renames KEY_SOPTIONS;
+   KEY_SPREVIOUS               : constant Special_Key_Code
+     := Curses_Constants.KEY_SPREVIOUS;
+   Key_Shift_Previous_Page     : Special_Key_Code renames KEY_SPREVIOUS;
+   KEY_SPRINT                  : constant Special_Key_Code
+     := Curses_Constants.KEY_SPRINT;
+   Key_Shift_Print             : Special_Key_Code renames KEY_SPRINT;
+   KEY_SREDO                   : constant Special_Key_Code
+     := Curses_Constants.KEY_SREDO;
+   Key_Shift_Redo              : Special_Key_Code renames KEY_SREDO;
+   KEY_SREPLACE                : constant Special_Key_Code
+     := Curses_Constants.KEY_SREPLACE;
+   Key_Shift_Replace           : Special_Key_Code renames KEY_SREPLACE;
+   KEY_SRIGHT                  : constant Special_Key_Code
+     := Curses_Constants.KEY_SRIGHT;
+   Key_Shift_Cursor_Right      : Special_Key_Code renames KEY_SRIGHT;
+   KEY_SRSUME                  : constant Special_Key_Code
+     := Curses_Constants.KEY_SRSUME;
+   Key_Shift_Resume            : Special_Key_Code renames KEY_SRSUME;
+   KEY_SSAVE                   : constant Special_Key_Code
+     := Curses_Constants.KEY_SSAVE;
+   Key_Shift_Save              : Special_Key_Code renames KEY_SSAVE;
+   KEY_SSUSPEND                : constant Special_Key_Code
+     := Curses_Constants.KEY_SSUSPEND;
+   Key_Shift_Suspend           : Special_Key_Code renames KEY_SSUSPEND;
+   KEY_SUNDO                   : constant Special_Key_Code
+     := Curses_Constants.KEY_SUNDO;
+   Key_Shift_Undo              : Special_Key_Code renames KEY_SUNDO;
+   Key_Suspend                 : constant Special_Key_Code
+     := Curses_Constants.KEY_SUSPEND;
+   Key_Undo                    : constant Special_Key_Code
+     := Curses_Constants.KEY_UNDO;
+   Key_Mouse                   : constant Special_Key_Code
+     := Curses_Constants.KEY_MOUSE;
+   Key_Resize                  : constant Special_Key_Code
+     := Curses_Constants.KEY_RESIZE;
+   Key_Max                     : constant Special_Key_Code
+     := Special_Key_Code'Last;
+
+   subtype User_Key_Code is Key_Code
+     range (Key_Max + 129) .. Key_Code'Last;
+   --  This is reserved for user defined key codes. The range between Key_Max
+   --  and the first user code is reserved for subsystems like menu and forms.
+
+   --------------------------------------------------------------------------
+
+   type Color_Number is range -1 .. Integer (Interfaces.C.short'Last);
+   for Color_Number'Size use Interfaces.C.short'Size;
+   --  (n)curses uses a short for the color index
+   --  The model is, that a Color_Number is an index into an array of
+   --  (potentially) definable colors. Some of those indices are
+   --  predefined (see below), although they may not really exist.
+
+   Black   : constant Color_Number := Curses_Constants.COLOR_BLACK;
+   Red     : constant Color_Number := Curses_Constants.COLOR_RED;
+   Green   : constant Color_Number := Curses_Constants.COLOR_GREEN;
+   Yellow  : constant Color_Number := Curses_Constants.COLOR_YELLOW;
+   Blue    : constant Color_Number := Curses_Constants.COLOR_BLUE;
+   Magenta : constant Color_Number := Curses_Constants.COLOR_MAGENTA;
+   Cyan    : constant Color_Number := Curses_Constants.COLOR_CYAN;
+   White   : constant Color_Number := Curses_Constants.COLOR_WHITE;
+
+   type RGB_Value is range 0 .. Integer (Interfaces.C.short'Last);
+   for RGB_Value'Size use Interfaces.C.short'Size;
+   --  Some system may allow to redefine a color by setting RGB values.
+
+   type Color_Pair is range 0 .. 255;
+   for Color_Pair'Size use 8;
+   subtype Redefinable_Color_Pair is Color_Pair range 1 .. 255;
+   --  (n)curses reserves 1 Byte for the color-pair number. Color Pair 0
+   --  is fixed (Black & White). A color pair is simply a combination of
+   --  two colors described by Color_Numbers, one for the foreground and
+   --  the other for the background
+
+   type Character_Attribute_Set is
+      record
+         Stand_Out               : Boolean;
+         Under_Line              : Boolean;
+         Reverse_Video           : Boolean;
+         Blink                   : Boolean;
+         Dim_Character           : Boolean;
+         Bold_Character          : Boolean;
+         Protected_Character     : Boolean;
+         Invisible_Character     : Boolean;
+         Alternate_Character_Set : Boolean;
+         Horizontal              : Boolean;
+         Left                    : Boolean;
+         Low                     : Boolean;
+         Right                   : Boolean;
+         Top                     : Boolean;
+         Vertical                : Boolean;
+      end record;
+
+   for Character_Attribute_Set use
+      record
+         Stand_Out at 0 range
+           Curses_Constants.A_STANDOUT_First - Curses_Constants.Attr_First
+           .. Curses_Constants.A_STANDOUT_Last - Curses_Constants.Attr_First;
+         Under_Line at 0 range
+           Curses_Constants.A_UNDERLINE_First - Curses_Constants.Attr_First
+           .. Curses_Constants.A_UNDERLINE_Last - Curses_Constants.Attr_First;
+         Reverse_Video at 0 range
+           Curses_Constants.A_REVERSE_First - Curses_Constants.Attr_First
+           .. Curses_Constants.A_REVERSE_Last - Curses_Constants.Attr_First;
+         Blink at 0 range
+           Curses_Constants.A_BLINK_First - Curses_Constants.Attr_First
+           .. Curses_Constants.A_BLINK_Last - Curses_Constants.Attr_First;
+         Dim_Character at 0 range
+           Curses_Constants.A_DIM_First - Curses_Constants.Attr_First
+           .. Curses_Constants.A_DIM_Last - Curses_Constants.Attr_First;
+         Bold_Character at 0 range
+           Curses_Constants.A_BOLD_First - Curses_Constants.Attr_First
+           .. Curses_Constants.A_BOLD_Last - Curses_Constants.Attr_First;
+         Protected_Character at 0 range
+           Curses_Constants.A_PROTECT_First - Curses_Constants.Attr_First
+           .. Curses_Constants.A_PROTECT_Last - Curses_Constants.Attr_First;
+         Invisible_Character at 0 range
+           Curses_Constants.A_INVIS_First - Curses_Constants.Attr_First
+           .. Curses_Constants.A_INVIS_Last - Curses_Constants.Attr_First;
+         Alternate_Character_Set at 0 range
+           Curses_Constants.A_ALTCHARSET_First - Curses_Constants.Attr_First
+           .. Curses_Constants.A_ALTCHARSET_Last - Curses_Constants.Attr_First;
+         Horizontal at 0 range
+           Curses_Constants.A_HORIZONTAL_First - Curses_Constants.Attr_First
+           .. Curses_Constants.A_HORIZONTAL_Last - Curses_Constants.Attr_First;
+         Left at 0 range
+           Curses_Constants.A_LEFT_First - Curses_Constants.Attr_First
+           .. Curses_Constants.A_LEFT_Last - Curses_Constants.Attr_First;
+         Low at 0 range
+           Curses_Constants.A_LOW_First - Curses_Constants.Attr_First
+           .. Curses_Constants.A_LOW_Last - Curses_Constants.Attr_First;
+         Right at 0 range
+           Curses_Constants.A_RIGHT_First - Curses_Constants.Attr_First
+           .. Curses_Constants.A_RIGHT_Last - Curses_Constants.Attr_First;
+         Top at 0 range
+           Curses_Constants.A_TOP_First - Curses_Constants.Attr_First
+           .. Curses_Constants.A_TOP_Last - Curses_Constants.Attr_First;
+         Vertical at 0 range
+           Curses_Constants.A_VERTICAL_First - Curses_Constants.Attr_First
+           .. Curses_Constants.A_VERTICAL_Last - Curses_Constants.Attr_First;
+      end record;
+
+   Normal_Video : constant Character_Attribute_Set := (others => False);
+
+   type Attributed_Character is
+      record
+         Attr  : Character_Attribute_Set;
+         Color : Color_Pair;
+         Ch    : Character;
+      end record;
+   pragma Convention (C_Pass_By_Copy, Attributed_Character);
+   --  This is the counterpart for the chtype in C.
+
+   for Attributed_Character use
+      record
+         Ch    at 0 range Curses_Constants.A_CHARTEXT_First
+           .. Curses_Constants.A_CHARTEXT_Last;
+         Color at 0 range Curses_Constants.A_COLOR_First
+           .. Curses_Constants.A_COLOR_Last;
+         pragma Warnings (Off);
+         Attr  at 0 range Curses_Constants.Attr_First
+           .. Curses_Constants.Attr_Last;
+         pragma Warnings (On);
+      end record;
+   for Attributed_Character'Size use Curses_Constants.chtype_Size;
+
+   Default_Character : constant Attributed_Character
+     := (Ch    => Character'First,
+         Color => Color_Pair'First,
+         Attr  => (others => False));  --  preelaboratable Normal_Video
+
+   type Attributed_String is array (Positive range <>) of Attributed_Character;
+   pragma Convention (C, Attributed_String);
+   --  In this binding we allow strings of attributed characters.
+
+   ------------------
+   --  Exceptions  --
+   ------------------
+   Curses_Exception     : exception;
+   Wrong_Curses_Version : exception;
+
+   --  Those exceptions are raised by the ETI (Extended Terminal Interface)
+   --  subpackets for Menu and Forms handling.
+   --
+   Eti_System_Error    : exception;
+   Eti_Bad_Argument    : exception;
+   Eti_Posted          : exception;
+   Eti_Connected       : exception;
+   Eti_Bad_State       : exception;
+   Eti_No_Room         : exception;
+   Eti_Not_Posted      : exception;
+   Eti_Unknown_Command : exception;
+   Eti_No_Match        : exception;
+   Eti_Not_Selectable  : exception;
+   Eti_Not_Connected   : exception;
+   Eti_Request_Denied  : exception;
+   Eti_Invalid_Field   : exception;
+   Eti_Current         : exception;
+
+   --------------------------------------------------------------------------
+   --  External C variables
+   --  Conceptually even in C this are kind of constants, but they are
+   --  initialized and sometimes changed by the library routines at runtime
+   --  depending on the type of terminal. I believe the best way to model
+   --  this is to use functions.
+   --------------------------------------------------------------------------
+
+   function Lines            return Line_Count;
+   pragma Inline (Lines);
+
+   function Columns          return Column_Count;
+   pragma Inline (Columns);
+
+   function Tab_Size         return Natural;
+   pragma Inline (Tab_Size);
+
+   function Number_Of_Colors return Natural;
+   pragma Inline (Number_Of_Colors);
+
+   function Number_Of_Color_Pairs return Natural;
+   pragma Inline (Number_Of_Color_Pairs);
+
+   subtype ACS_Index is Character range
+     Character'Val (0) .. Character'Val (127);
+   function ACS_Map (Index : ACS_Index) return Attributed_Character;
+   pragma Import (C, ACS_Map, "acs_map_as_function");
+
+   --  Constants for several characters from the Alternate Character Set
+   --  You must use these constants as indices into the ACS_Map function
+   --  to get the corresponding attributed character at runtime
+   ACS_Upper_Left_Corner  : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_ULCORNER);
+   ACS_Lower_Left_Corner  : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_LLCORNER);
+   ACS_Upper_Right_Corner : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_URCORNER);
+   ACS_Lower_Right_Corner : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_LRCORNER);
+   ACS_Left_Tee           : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_LTEE);
+   ACS_Right_Tee          : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_RTEE);
+   ACS_Bottom_Tee         : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_BTEE);
+   ACS_Top_Tee            : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_TTEE);
+   ACS_Horizontal_Line    : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_HLINE);
+   ACS_Vertical_Line      : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_VLINE);
+   ACS_Plus_Symbol        : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_PLUS);
+   ACS_Scan_Line_1        : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_S1);
+   ACS_Scan_Line_9        : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_S9);
+   ACS_Diamond            : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_DIAMOND);
+   ACS_Checker_Board      : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_CKBOARD);
+   ACS_Degree             : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_DEGREE);
+   ACS_Plus_Minus         : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_PLMINUS);
+   ACS_Bullet             : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_BULLET);
+   ACS_Left_Arrow         : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_LARROW);
+   ACS_Right_Arrow        : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_RARROW);
+   ACS_Down_Arrow         : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_DARROW);
+   ACS_Up_Arrow           : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_UARROW);
+   ACS_Board_Of_Squares   : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_BOARD);
+   ACS_Lantern            : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_LANTERN);
+   ACS_Solid_Block        : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_BLOCK);
+   ACS_Scan_Line_3        : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_S3);
+   ACS_Scan_Line_7        : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_S7);
+   ACS_Less_Or_Equal      : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_LEQUAL);
+   ACS_Greater_Or_Equal   : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_GEQUAL);
+   ACS_PI                 : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_PI);
+   ACS_Not_Equal          : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_NEQUAL);
+   ACS_Sterling           : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_STERLING);
+
+   --  MANPAGE(`curs_initscr.3x')
+   --  | Not implemented: newterm, set_term, delscreen
+
+   --  ANCHOR(`stdscr',`Standard_Window')
+   function Standard_Window return Window;
+   --  AKA
+   pragma Import (C, Standard_Window, "stdscr_as_function");
+   pragma Inline (Standard_Window);
+
+   --  ANCHOR(`curscr',`Current_Window')
+   function Current_Window return Window;
+   --  AKA
+   pragma Import (C, Current_Window, "curscr_as_function");
+   pragma Inline (Current_Window);
+
+   --  ANCHOR(`initscr()',`Init_Screen')
+   procedure Init_Screen;
+
+   --  ANCHOR(`initscr()',`Init_Windows')
+   procedure Init_Windows renames Init_Screen;
+   --  AKA
+   pragma Inline (Init_Screen);
+   --  pragma Inline (Init_Windows);
+
+   --  ANCHOR(`endwin()',`End_Windows')
+   procedure End_Windows;
+   --  AKA
+   procedure End_Screen renames End_Windows;
+   pragma Inline (End_Windows);
+   --  pragma Inline (End_Screen);
+
+   --  ANCHOR(`isendwin()',`Is_End_Window')
+   function Is_End_Window return Boolean;
+   --  AKA
+   pragma Inline (Is_End_Window);
+
+   --  MANPAGE(`curs_move.3x')
+
+   --  ANCHOR(`wmove()',`Move_Cursor')
+   procedure Move_Cursor (Win    : Window := Standard_Window;
+                          Line   : Line_Position;
+                          Column : Column_Position);
+   --  AKA
+   --  ALIAS(`move()')
+   pragma Inline (Move_Cursor);
+
+   --  MANPAGE(`curs_addch.3x')
+
+   --  ANCHOR(`waddch()',`Add')
+   procedure Add (Win : Window := Standard_Window;
+                  Ch  : Attributed_Character);
+   --  AKA
+   --  ALIAS(`addch()')
+
+   procedure Add (Win : Window := Standard_Window;
+                  Ch  : Character);
+   --  Add a single character at the current logical cursor position to
+   --  the window. Use the current windows attributes.
+
+   --  ANCHOR(`mvwaddch()',`Add')
+   procedure Add
+     (Win    : Window := Standard_Window;
+      Line   : Line_Position;
+      Column : Column_Position;
+      Ch     : Attributed_Character);
+   --  AKA
+   --  ALIAS(`mvaddch()')
+
+   procedure Add
+     (Win    : Window := Standard_Window;
+      Line   : Line_Position;
+      Column : Column_Position;
+      Ch     : Character);
+   --  Move to the position and add a single character into the window
+   --  There are more Add routines, so the Inline pragma follows later
+
+   --  ANCHOR(`wechochar()',`Add_With_Immediate_Echo')
+   procedure Add_With_Immediate_Echo
+     (Win : Window := Standard_Window;
+      Ch  : Attributed_Character);
+   --  AKA
+   --  ALIAS(`echochar()')
+
+   procedure Add_With_Immediate_Echo
+     (Win : Window := Standard_Window;
+      Ch  : Character);
+   --  Add a character and do an immediate refresh of the screen.
+   pragma Inline (Add_With_Immediate_Echo);
+
+   --  MANPAGE(`curs_window.3x')
+   --  Not Implemented: wcursyncup
+
+   --  ANCHOR(`newwin()',`Create')
+   function Create
+     (Number_Of_Lines       : Line_Count;
+      Number_Of_Columns     : Column_Count;
+      First_Line_Position   : Line_Position;
+      First_Column_Position : Column_Position) return Window;
+   --  Not Implemented: Default Number_Of_Lines, Number_Of_Columns
+   --  the C version lets them be 0, see the man page.
+   --  AKA
+   pragma Inline (Create);
+
+   function New_Window
+     (Number_Of_Lines       : Line_Count;
+      Number_Of_Columns     : Column_Count;
+      First_Line_Position   : Line_Position;
+      First_Column_Position : Column_Position) return Window
+     renames Create;
+   --  pragma Inline (New_Window);
+
+   --  ANCHOR(`delwin()',`Delete')
+   procedure Delete (Win : in out Window);
+   --  AKA
+   --  Reset Win to Null_Window
+   pragma Inline (Delete);
+
+   --  ANCHOR(`subwin()',`Sub_Window')
+   function Sub_Window
+     (Win                   : Window := Standard_Window;
+      Number_Of_Lines       : Line_Count;
+      Number_Of_Columns     : Column_Count;
+      First_Line_Position   : Line_Position;
+      First_Column_Position : Column_Position) return Window;
+   --  AKA
+   pragma Inline (Sub_Window);
+
+   --  ANCHOR(`derwin()',`Derived_Window')
+   function Derived_Window
+     (Win                   : Window := Standard_Window;
+      Number_Of_Lines       : Line_Count;
+      Number_Of_Columns     : Column_Count;
+      First_Line_Position   : Line_Position;
+      First_Column_Position : Column_Position) return Window;
+   --  AKA
+   pragma Inline (Derived_Window);
+
+   --  ANCHOR(`dupwin()',`Duplicate')
+   function Duplicate (Win : Window) return Window;
+   --  AKA
+   pragma Inline (Duplicate);
+
+   --  ANCHOR(`mvwin()',`Move_Window')
+   procedure Move_Window (Win    : Window;
+                          Line   : Line_Position;
+                          Column : Column_Position);
+   --  AKA
+   pragma Inline (Move_Window);
+
+   --  ANCHOR(`mvderwin()',`Move_Derived_Window')
+   procedure Move_Derived_Window (Win    : Window;
+                                  Line   : Line_Position;
+                                  Column : Column_Position);
+   --  AKA
+   pragma Inline (Move_Derived_Window);
+
+   --  ANCHOR(`wsyncup()',`Synchronize_Upwards')
+   procedure Synchronize_Upwards (Win : Window);
+   --  AKA
+   pragma Import (C, Synchronize_Upwards, "wsyncup");
+
+   --  ANCHOR(`wsyncdown()',`Synchronize_Downwards')
+   procedure Synchronize_Downwards (Win : Window);
+   --  AKA
+   pragma Import (C, Synchronize_Downwards, "wsyncdown");
+
+   --  ANCHOR(`syncok()',`Set_Synch_Mode')
+   procedure Set_Synch_Mode (Win  : Window := Standard_Window;
+                             Mode : Boolean := False);
+   --  AKA
+   pragma Inline (Set_Synch_Mode);
+
+   --  MANPAGE(`curs_addstr.3x')
+
+   --  ANCHOR(`waddnstr()',`Add')
+   procedure Add (Win : Window := Standard_Window;
+                  Str : String;
+                  Len : Integer := -1);
+   --  AKA
+   --  ALIAS(`waddstr()')
+   --  ALIAS(`addnstr()')
+   --  ALIAS(`addstr()')
+
+   --  ANCHOR(`mvwaddnstr()',`Add')
+   procedure Add (Win    : Window := Standard_Window;
+                  Line   : Line_Position;
+                  Column : Column_Position;
+                  Str    : String;
+                  Len    : Integer := -1);
+   --  AKA
+   --  ALIAS(`mvwaddstr()')
+   --  ALIAS(`mvaddnstr()')
+   --  ALIAS(`mvaddstr()')
+
+   --  MANPAGE(`curs_addchstr.3x')
+
+   --  ANCHOR(`waddchnstr()',`Add')
+   procedure Add (Win : Window := Standard_Window;
+                  Str : Attributed_String;
+                  Len : Integer := -1);
+   --  AKA
+   --  ALIAS(`waddchstr()')
+   --  ALIAS(`addchnstr()')
+   --  ALIAS(`addchstr()')
+
+   --  ANCHOR(`mvwaddchnstr()',`Add')
+   procedure Add (Win    : Window := Standard_Window;
+                  Line   : Line_Position;
+                  Column : Column_Position;
+                  Str    : Attributed_String;
+                  Len    : Integer := -1);
+   --  AKA
+   --  ALIAS(`mvwaddchstr()')
+   --  ALIAS(`mvaddchnstr()')
+   --  ALIAS(`mvaddchstr()')
+   pragma Inline (Add);
+
+   --  MANPAGE(`curs_border.3x')
+   --  | Not implemented: mvhline,  mvwhline, mvvline, mvwvline
+   --  | use Move_Cursor then Horizontal_Line or Vertical_Line
+
+   --  ANCHOR(`wborder()',`Border')
+   procedure Border
+     (Win                       : Window := Standard_Window;
+      Left_Side_Symbol          : Attributed_Character := Default_Character;
+      Right_Side_Symbol         : Attributed_Character := Default_Character;
+      Top_Side_Symbol           : Attributed_Character := Default_Character;
+      Bottom_Side_Symbol        : Attributed_Character := Default_Character;
+      Upper_Left_Corner_Symbol  : Attributed_Character := Default_Character;
+      Upper_Right_Corner_Symbol : Attributed_Character := Default_Character;
+      Lower_Left_Corner_Symbol  : Attributed_Character := Default_Character;
+      Lower_Right_Corner_Symbol : Attributed_Character := Default_Character
+     );
+   --  AKA
+   --  ALIAS(`border()')
+   pragma Inline (Border);
+
+   --  ANCHOR(`box()',`Box')
+   procedure Box
+     (Win               : Window := Standard_Window;
+      Vertical_Symbol   : Attributed_Character := Default_Character;
+      Horizontal_Symbol : Attributed_Character := Default_Character);
+   --  AKA
+   pragma Inline (Box);
+
+   --  ANCHOR(`whline()',`Horizontal_Line')
+   procedure Horizontal_Line
+     (Win         : Window := Standard_Window;
+      Line_Size   : Natural;
+      Line_Symbol : Attributed_Character := Default_Character);
+   --  AKA
+   --  ALIAS(`hline()')
+   pragma Inline (Horizontal_Line);
+
+   --  ANCHOR(`wvline()',`Vertical_Line')
+   procedure Vertical_Line
+     (Win         : Window := Standard_Window;
+      Line_Size   : Natural;
+      Line_Symbol : Attributed_Character := Default_Character);
+   --  AKA
+   --  ALIAS(`vline()')
+   pragma Inline (Vertical_Line);
+
+   --  MANPAGE(`curs_getch.3x')
+   --  Not implemented: mvgetch, mvwgetch
+
+   --  ANCHOR(`wgetch()',`Get_Keystroke')
+   function Get_Keystroke (Win : Window := Standard_Window)
+                           return Real_Key_Code;
+   --  AKA
+   --  ALIAS(`getch()')
+   --  Get a character from the keyboard and echo it - if enabled - to the
+   --  window.
+   --  If for any reason (i.e. a timeout) we could not get a character the
+   --  returned keycode is Key_None.
+   pragma Inline (Get_Keystroke);
+
+   --  ANCHOR(`ungetch()',`Undo_Keystroke')
+   procedure Undo_Keystroke (Key : Real_Key_Code);
+   --  AKA
+   pragma Inline (Undo_Keystroke);
+
+   --  ANCHOR(`has_key()',`Has_Key')
+   function Has_Key (Key : Special_Key_Code) return Boolean;
+   --  AKA
+   pragma Inline (Has_Key);
+
+   --  |
+   --  | Some helper functions
+   --  |
+   function Is_Function_Key (Key : Special_Key_Code) return Boolean;
+   --  Return True if the Key is a function key (i.e. one of F0 .. F63)
+   pragma Inline (Is_Function_Key);
+
+   subtype Function_Key_Number is Integer range 0 .. 63;
+   --  (n)curses allows for 64 function keys.
+
+   function Function_Key (Key : Real_Key_Code) return Function_Key_Number;
+   --  Return the number of the function key. If the code is not a
+   --  function key, a CONSTRAINT_ERROR will be raised.
+   pragma Inline (Function_Key);
+
+   function Function_Key_Code (Key : Function_Key_Number) return Real_Key_Code;
+   --  Return the key code for a given function-key number.
+   pragma Inline (Function_Key_Code);
+
+   --  MANPAGE(`curs_attr.3x')
+   --  | Not implemented attr_off,  wattr_off,
+   --  |  attr_on, wattr_on, attr_set, wattr_set
+
+   --  PAIR_NUMBER
+   --  PAIR_NUMBER(c) is the same as c.Color
+
+   --  ANCHOR(`standout()',`Standout')
+   procedure Standout (Win : Window  := Standard_Window;
+                       On  : Boolean := True);
+   --  ALIAS(`wstandout()')
+   --  ALIAS(`wstandend()')
+
+   --  ANCHOR(`wattron()',`Switch_Character_Attribute')
+   procedure Switch_Character_Attribute
+     (Win  : Window := Standard_Window;
+      Attr : Character_Attribute_Set := Normal_Video;
+      On   : Boolean := True); --  if False we switch Off.
+   --  Switches those Attributes set to true in the list.
+   --  AKA
+   --  ALIAS(`wattroff()')
+   --  ALIAS(`attron()')
+   --  ALIAS(`attroff()')
+
+   --  ANCHOR(`wattrset()',`Set_Character_Attributes')
+   procedure Set_Character_Attributes
+     (Win   : Window := Standard_Window;
+      Attr  : Character_Attribute_Set := Normal_Video;
+      Color : Color_Pair := Color_Pair'First);
+   --  AKA
+   --  ALIAS(`attrset()')
+   pragma Inline (Set_Character_Attributes);
+
+   --  ANCHOR(`wattr_get()',`Get_Character_Attributes')
+   function Get_Character_Attribute
+     (Win : Window := Standard_Window) return Character_Attribute_Set;
+   --  AKA
+   --  ALIAS(`attr_get()')
+
+   --  ANCHOR(`wattr_get()',`Get_Character_Attribute')
+   function Get_Character_Attribute
+     (Win : Window := Standard_Window) return Color_Pair;
+   --  AKA
+   pragma Inline (Get_Character_Attribute);
+
+   --  ANCHOR(`wcolor_set()',`Set_Color')
+   procedure Set_Color (Win  : Window := Standard_Window;
+                        Pair : Color_Pair);
+   --  AKA
+   --  ALIAS(`color_set()')
+   pragma Inline (Set_Color);
+
+   --  ANCHOR(`wchgat()',`Change_Attributes')
+   procedure Change_Attributes
+     (Win   : Window := Standard_Window;
+      Count : Integer := -1;
+      Attr  : Character_Attribute_Set := Normal_Video;
+      Color : Color_Pair := Color_Pair'First);
+   --  AKA
+   --  ALIAS(`chgat()')
+
+   --  ANCHOR(`mvwchgat()',`Change_Attributes')
+   procedure Change_Attributes
+     (Win    : Window := Standard_Window;
+      Line   : Line_Position := Line_Position'First;
+      Column : Column_Position := Column_Position'First;
+      Count  : Integer := -1;
+      Attr   : Character_Attribute_Set := Normal_Video;
+      Color  : Color_Pair := Color_Pair'First);
+   --  AKA
+   --  ALIAS(`mvchgat()')
+   pragma Inline (Change_Attributes);
+
+   --  MANPAGE(`curs_beep.3x')
+
+   --  ANCHOR(`beep()',`Beep')
+   procedure Beep;
+   --  AKA
+   pragma Inline (Beep);
+
+   --  ANCHOR(`flash()',`Flash_Screen')
+   procedure Flash_Screen;
+   --  AKA
+   pragma Inline (Flash_Screen);
+
+   --  MANPAGE(`curs_inopts.3x')
+
+   --  | Not implemented : typeahead
+   --
+   --  ANCHOR(`cbreak()',`Set_Cbreak_Mode')
+   procedure Set_Cbreak_Mode (SwitchOn : Boolean := True);
+   --  AKA
+   --  ALIAS(`nocbreak()')
+   pragma Inline (Set_Cbreak_Mode);
+
+   --  ANCHOR(`raw()',`Set_Raw_Mode')
+   procedure Set_Raw_Mode (SwitchOn : Boolean := True);
+   --  AKA
+   --  ALIAS(`noraw()')
+   pragma Inline (Set_Raw_Mode);
+
+   --  ANCHOR(`echo()',`Set_Echo_Mode')
+   procedure Set_Echo_Mode (SwitchOn : Boolean := True);
+   --  AKA
+   --  ALIAS(`noecho()')
+   pragma Inline (Set_Echo_Mode);
+
+   --  ANCHOR(`meta()',`Set_Meta_Mode')
+   procedure Set_Meta_Mode (Win      : Window := Standard_Window;
+                            SwitchOn : Boolean := True);
+   --  AKA
+   pragma Inline (Set_Meta_Mode);
+
+   --  ANCHOR(`keypad()',`Set_KeyPad_Mode')
+   procedure Set_KeyPad_Mode (Win      : Window := Standard_Window;
+                              SwitchOn : Boolean := True);
+   --  AKA
+   pragma Inline (Set_KeyPad_Mode);
+
+   function Get_KeyPad_Mode (Win : Window := Standard_Window)
+                             return Boolean;
+   --  This has no pendant in C. There you've to look into the WINDOWS
+   --  structure to get the value. Bad practice, not repeated in Ada.
+
+   type Half_Delay_Amount is range 1 .. 255;
+
+   --  ANCHOR(`halfdelay()',`Half_Delay')
+   procedure Half_Delay (Amount : Half_Delay_Amount);
+   --  AKA
+   pragma Inline (Half_Delay);
+
+   --  ANCHOR(`intrflush()',`Set_Flush_On_Interrupt_Mode')
+   procedure Set_Flush_On_Interrupt_Mode
+     (Win  : Window := Standard_Window;
+      Mode : Boolean := True);
+   --  AKA
+   pragma Inline (Set_Flush_On_Interrupt_Mode);
+
+   --  ANCHOR(`qiflush()',`Set_Queue_Interrupt_Mode')
+   procedure Set_Queue_Interrupt_Mode
+     (Win   : Window := Standard_Window;
+      Flush : Boolean := True);
+   --  AKA
+   --  ALIAS(`noqiflush()')
+   pragma Inline (Set_Queue_Interrupt_Mode);
+
+   --  ANCHOR(`nodelay()',`Set_NoDelay_Mode')
+   procedure Set_NoDelay_Mode
+     (Win  : Window := Standard_Window;
+      Mode : Boolean := False);
+   --  AKA
+   pragma Inline (Set_NoDelay_Mode);
+
+   type Timeout_Mode is (Blocking, Non_Blocking, Delayed);
+
+   --  ANCHOR(`wtimeout()',`Set_Timeout_Mode')
+   procedure Set_Timeout_Mode (Win    : Window := Standard_Window;
+                               Mode   : Timeout_Mode;
+                               Amount : Natural); --  in Milliseconds
+   --  AKA
+   --  ALIAS(`timeout()')
+   --  Instead of overloading the semantic of the sign of amount, we
+   --  introduce the Timeout_Mode parameter. This should improve
+   --  readability. For Blocking and Non_Blocking, the Amount is not
+   --  evaluated.
+   --  We do not inline this procedure.
+
+   --  ANCHOR(`notimeout()',`Set_Escape_Time_Mode')
+   procedure Set_Escape_Timer_Mode
+     (Win       : Window := Standard_Window;
+      Timer_Off : Boolean := False);
+   --  AKA
+   pragma Inline (Set_Escape_Timer_Mode);
+
+   --  MANPAGE(`curs_outopts.3x')
+
+   --  ANCHOR(`nl()',`Set_NL_Mode')
+   procedure Set_NL_Mode (SwitchOn : Boolean := True);
+   --  AKA
+   --  ALIAS(`nonl()')
+   pragma Inline (Set_NL_Mode);
+
+   --  ANCHOR(`clearok()',`Clear_On_Next_Update')
+   procedure Clear_On_Next_Update
+     (Win      : Window := Standard_Window;
+      Do_Clear : Boolean := True);
+   --  AKA
+   pragma Inline (Clear_On_Next_Update);
+
+   --  ANCHOR(`idlok()',`Use_Insert_Delete_Line')
+   procedure Use_Insert_Delete_Line
+     (Win    : Window := Standard_Window;
+      Do_Idl : Boolean := True);
+   --  AKA
+   pragma Inline (Use_Insert_Delete_Line);
+
+   --  ANCHOR(`idcok()',`Use_Insert_Delete_Character')
+   procedure Use_Insert_Delete_Character
+     (Win    : Window := Standard_Window;
+      Do_Idc : Boolean := True);
+   --  AKA
+   pragma Inline (Use_Insert_Delete_Character);
+
+   --  ANCHOR(`leaveok()',`Leave_Cursor_After_Update')
+   procedure Leave_Cursor_After_Update
+     (Win      : Window := Standard_Window;
+      Do_Leave : Boolean := True);
+   --  AKA
+   pragma Inline (Leave_Cursor_After_Update);
+
+   --  ANCHOR(`immedok()',`Immediate_Update_Mode')
+   procedure Immediate_Update_Mode
+     (Win  : Window := Standard_Window;
+      Mode : Boolean := False);
+   --  AKA
+   pragma Inline (Immediate_Update_Mode);
+
+   --  ANCHOR(`scrollok()',`Allow_Scrolling')
+   procedure Allow_Scrolling
+     (Win  : Window := Standard_Window;
+      Mode : Boolean := False);
+   --  AKA
+   pragma Inline (Allow_Scrolling);
+
+   function Scrolling_Allowed (Win : Window := Standard_Window) return Boolean;
+   --  There is no such function in the C interface.
+   pragma Inline (Scrolling_Allowed);
+
+   --  ANCHOR(`wsetscrreg()',`Set_Scroll_Region')
+   procedure Set_Scroll_Region
+     (Win         : Window := Standard_Window;
+      Top_Line    : Line_Position;
+      Bottom_Line : Line_Position);
+   --  AKA
+   --  ALIAS(`setscrreg()')
+   pragma Inline (Set_Scroll_Region);
+
+   --  MANPAGE(`curs_refresh.3x')
+
+   --  ANCHOR(`doupdate()',`Update_Screen')
+   procedure Update_Screen;
+   --  AKA
+   pragma Inline (Update_Screen);
+
+   --  ANCHOR(`wrefresh()',`Refresh')
+   procedure Refresh (Win : Window := Standard_Window);
+   --  AKA
+   --  There is an overloaded Refresh for Pads.
+   --  The Inline pragma appears there
+   --  ALIAS(`refresh()')
+
+   --  ANCHOR(`wnoutrefresh()',`Refresh_Without_Update')
+   procedure Refresh_Without_Update
+     (Win : Window := Standard_Window);
+   --  AKA
+   --  There is an overloaded Refresh_Without_Update for Pads.
+   --  The Inline pragma appears there
+
+   --  ANCHOR(`redrawwin()',`Redraw')
+   procedure Redraw (Win : Window := Standard_Window);
+   --  AKA
+
+   --  ANCHOR(`wredrawln()',`Redraw')
+   procedure Redraw (Win        : Window := Standard_Window;
+                     Begin_Line : Line_Position;
+                     Line_Count : Positive);
+   --  AKA
+   pragma Inline (Redraw);
+
+   --  MANPAGE(`curs_clear.3x')
+
+   --  ANCHOR(`werase()',`Erase')
+   procedure Erase (Win : Window := Standard_Window);
+   --  AKA
+   --  ALIAS(`erase()')
+   pragma Inline (Erase);
+
+   --  ANCHOR(`wclear()',`Clear')
+   procedure Clear
+     (Win : Window := Standard_Window);
+   --  AKA
+   --  ALIAS(`clear()')
+   pragma Inline (Clear);
+
+   --  ANCHOR(`wclrtobot()',`Clear_To_End_Of_Screen')
+   procedure Clear_To_End_Of_Screen
+     (Win : Window := Standard_Window);
+   --  AKA
+   --  ALIAS(`clrtobot()')
+   pragma Inline (Clear_To_End_Of_Screen);
+
+   --  ANCHOR(`wclrtoeol()',`Clear_To_End_Of_Line')
+   procedure Clear_To_End_Of_Line
+     (Win : Window := Standard_Window);
+   --  AKA
+   --  ALIAS(`clrtoeol()')
+   pragma Inline (Clear_To_End_Of_Line);
+
+   --  MANPAGE(`curs_bkgd.3x')
+
+   --  ANCHOR(`wbkgdset()',`Set_Background')
+   --  TODO: we could have Set_Background(Window; Character_Attribute_Set)
+   --  because in C it is common to see bkgdset(A_BOLD) or
+   --  bkgdset(COLOR_PAIR(n))
+   procedure Set_Background
+     (Win : Window := Standard_Window;
+      Ch  : Attributed_Character);
+   --  AKA
+   --  ALIAS(`bkgdset()')
+   pragma Inline (Set_Background);
+
+   --  ANCHOR(`wbkgd()',`Change_Background')
+   procedure Change_Background
+     (Win : Window := Standard_Window;
+      Ch  : Attributed_Character);
+   --  AKA
+   --  ALIAS(`bkgd()')
+   pragma Inline (Change_Background);
+
+   --  ANCHOR(`wbkgdget()',`Get_Background')
+   --  ? wbkgdget is not listed in curs_bkgd, getbkgd is thpough.
+   function Get_Background (Win : Window := Standard_Window)
+     return Attributed_Character;
+   --  AKA
+   --  ALIAS(`bkgdget()')
+   pragma Inline (Get_Background);
+
+   --  MANPAGE(`curs_touch.3x')
+
+   --  ANCHOR(`untouchwin()',`Untouch')
+   procedure Untouch (Win : Window := Standard_Window);
+   --  AKA
+   pragma Inline (Untouch);
+
+   --  ANCHOR(`touchwin()',`Touch')
+   procedure Touch (Win : Window := Standard_Window);
+   --  AKA
+
+   --  ANCHOR(`touchline()',`Touch')
+   procedure Touch (Win   : Window := Standard_Window;
+                    Start : Line_Position;
+                    Count : Positive);
+   --  AKA
+   pragma Inline (Touch);
+
+   --  ANCHOR(`wtouchln()',`Change_Line_Status')
+   procedure Change_Lines_Status (Win   : Window := Standard_Window;
+                                  Start : Line_Position;
+                                  Count : Positive;
+                                  State : Boolean);
+   --  AKA
+   pragma Inline (Change_Lines_Status);
+
+   --  ANCHOR(`is_linetouched()',`Is_Touched')
+   function Is_Touched (Win  : Window := Standard_Window;
+                        Line : Line_Position) return Boolean;
+   --  AKA
+
+   --  ANCHOR(`is_wintouched()',`Is_Touched')
+   function Is_Touched (Win : Window := Standard_Window) return Boolean;
+   --  AKA
+   pragma Inline (Is_Touched);
+
+   --  MANPAGE(`curs_overlay.3x')
+
+   --  ANCHOR(`copywin()',`Copy')
+   procedure Copy
+     (Source_Window            : Window;
+      Destination_Window       : Window;
+      Source_Top_Row           : Line_Position;
+      Source_Left_Column       : Column_Position;
+      Destination_Top_Row      : Line_Position;
+      Destination_Left_Column  : Column_Position;
+      Destination_Bottom_Row   : Line_Position;
+      Destination_Right_Column : Column_Position;
+      Non_Destructive_Mode     : Boolean := True);
+   --  AKA
+   pragma Inline (Copy);
+
+   --  ANCHOR(`overwrite()',`Overwrite')
+   procedure Overwrite (Source_Window      : Window;
+                        Destination_Window : Window);
+   --  AKA
+   pragma Inline (Overwrite);
+
+   --  ANCHOR(`overlay()',`Overlay')
+   procedure Overlay (Source_Window      : Window;
+                      Destination_Window : Window);
+   --  AKA
+   pragma Inline (Overlay);
+
+   --  MANPAGE(`curs_deleteln.3x')
+
+   --  ANCHOR(`winsdelln()',`Insert_Delete_Lines')
+   procedure Insert_Delete_Lines
+     (Win   : Window  := Standard_Window;
+      Lines : Integer := 1); --  default is to insert one line above
+   --  AKA
+   --  ALIAS(`insdelln()')
+   pragma Inline (Insert_Delete_Lines);
+
+   --  ANCHOR(`wdeleteln()',`Delete_Line')
+   procedure Delete_Line (Win : Window := Standard_Window);
+   --  AKA
+   --  ALIAS(`deleteln()')
+   pragma Inline (Delete_Line);
+
+   --  ANCHOR(`winsertln()',`Insert_Line')
+   procedure Insert_Line (Win : Window := Standard_Window);
+   --  AKA
+   --  ALIAS(`insertln()')
+   pragma Inline (Insert_Line);
+
+   --  MANPAGE(`curs_getyx.3x')
+
+   --  ANCHOR(`getmaxyx()',`Get_Size')
+   procedure Get_Size
+     (Win               : Window := Standard_Window;
+      Number_Of_Lines   : out Line_Count;
+      Number_Of_Columns : out Column_Count);
+   --  AKA
+   pragma Inline (Get_Size);
+
+   --  ANCHOR(`getbegyx()',`Get_Window_Position')
+   procedure Get_Window_Position
+     (Win             : Window := Standard_Window;
+      Top_Left_Line   : out Line_Position;
+      Top_Left_Column : out Column_Position);
+   --  AKA
+   pragma Inline (Get_Window_Position);
+
+   --  ANCHOR(`getyx()',`Get_Cursor_Position')
+   procedure Get_Cursor_Position
+     (Win    : Window := Standard_Window;
+      Line   : out Line_Position;
+      Column : out Column_Position);
+   --  AKA
+   pragma Inline (Get_Cursor_Position);
+
+   --  ANCHOR(`getparyx()',`Get_Origin_Relative_To_Parent')
+   procedure Get_Origin_Relative_To_Parent
+     (Win                : Window;
+      Top_Left_Line      : out Line_Position;
+      Top_Left_Column    : out Column_Position;
+      Is_Not_A_Subwindow : out Boolean);
+   --  AKA
+   --  Instead of placing -1 in the coordinates as return, we use a Boolean
+   --  to return the info that the window has no parent.
+   pragma Inline (Get_Origin_Relative_To_Parent);
+
+   --  MANPAGE(`curs_pad.3x')
+
+   --  ANCHOR(`newpad()',`New_Pad')
+   function New_Pad (Lines   : Line_Count;
+                     Columns : Column_Count) return Window;
+   --  AKA
+   pragma Inline (New_Pad);
+
+   --  ANCHOR(`subpad()',`Sub_Pad')
+   function Sub_Pad
+     (Pad                   : Window;
+      Number_Of_Lines       : Line_Count;
+      Number_Of_Columns     : Column_Count;
+      First_Line_Position   : Line_Position;
+      First_Column_Position : Column_Position) return Window;
+   --  AKA
+   pragma Inline (Sub_Pad);
+
+   --  ANCHOR(`prefresh()',`Refresh')
+   procedure Refresh
+     (Pad                      : Window;
+      Source_Top_Row           : Line_Position;
+      Source_Left_Column       : Column_Position;
+      Destination_Top_Row      : Line_Position;
+      Destination_Left_Column  : Column_Position;
+      Destination_Bottom_Row   : Line_Position;
+      Destination_Right_Column : Column_Position);
+   --  AKA
+   pragma Inline (Refresh);
+
+   --  ANCHOR(`pnoutrefresh()',`Refresh_Without_Update')
+   procedure Refresh_Without_Update
+     (Pad                      : Window;
+      Source_Top_Row           : Line_Position;
+      Source_Left_Column       : Column_Position;
+      Destination_Top_Row      : Line_Position;
+      Destination_Left_Column  : Column_Position;
+      Destination_Bottom_Row   : Line_Position;
+      Destination_Right_Column : Column_Position);
+   --  AKA
+   pragma Inline (Refresh_Without_Update);
+
+   --  ANCHOR(`pechochar()',`Add_Character_To_Pad_And_Echo_It')
+   procedure Add_Character_To_Pad_And_Echo_It
+     (Pad : Window;
+      Ch  : Attributed_Character);
+   --  AKA
+
+   procedure Add_Character_To_Pad_And_Echo_It
+     (Pad : Window;
+      Ch  : Character);
+   pragma Inline (Add_Character_To_Pad_And_Echo_It);
+
+   --  MANPAGE(`curs_scroll.3x')
+
+   --  ANCHOR(`wscrl()',`Scroll')
+   procedure Scroll (Win    : Window  := Standard_Window;
+                     Amount : Integer := 1);
+   --  AKA
+   --  ALIAS(`scroll()')
+   --  ALIAS(`scrl()')
+   pragma Inline (Scroll);
+
+   --  MANPAGE(`curs_delch.3x')
+
+   --  ANCHOR(`wdelch()',`Delete_Character')
+   procedure Delete_Character (Win : Window := Standard_Window);
+   --  AKA
+   --  ALIAS(`delch()')
+
+   --  ANCHOR(`mvwdelch()',`Delete_Character')
+   procedure Delete_Character
+     (Win    : Window := Standard_Window;
+      Line   : Line_Position;
+      Column : Column_Position);
+   --  AKA
+   --  ALIAS(`mvdelch()')
+   pragma Inline (Delete_Character);
+
+   --  MANPAGE(`curs_inch.3x')
+
+   --  ANCHOR(`winch()',`Peek')
+   function Peek (Win : Window := Standard_Window)
+     return Attributed_Character;
+   --  ALIAS(`inch()')
+   --  AKA
+
+   --  ANCHOR(`mvwinch()',`Peek')
+   function Peek
+     (Win    : Window := Standard_Window;
+      Line   : Line_Position;
+      Column : Column_Position) return Attributed_Character;
+   --  AKA
+   --  ALIAS(`mvinch()')
+   --  More Peek's follow, pragma Inline appears later.
+
+   --  MANPAGE(`curs_insch.3x')
+
+   --  ANCHOR(`winsch()',`Insert')
+   procedure Insert (Win : Window := Standard_Window;
+                     Ch  : Attributed_Character);
+   --  AKA
+   --  ALIAS(`insch()')
+
+   --  ANCHOR(`mvwinsch()',`Insert')
+   procedure Insert (Win    : Window := Standard_Window;
+                     Line   : Line_Position;
+                     Column : Column_Position;
+                     Ch     : Attributed_Character);
+   --  AKA
+   --  ALIAS(`mvinsch()')
+
+   --  MANPAGE(`curs_insstr.3x')
+
+   --  ANCHOR(`winsnstr()',`Insert')
+   procedure Insert (Win : Window := Standard_Window;
+                     Str : String;
+                     Len : Integer := -1);
+   --  AKA
+   --  ALIAS(`winsstr()')
+   --  ALIAS(`insnstr()')
+   --  ALIAS(`insstr()')
+
+   --  ANCHOR(`mvwinsnstr()',`Insert')
+   procedure Insert (Win    : Window := Standard_Window;
+                     Line   : Line_Position;
+                     Column : Column_Position;
+                     Str    : String;
+                     Len    : Integer := -1);
+   --  AKA
+   --  ALIAS(`mvwinsstr()')
+   --  ALIAS(`mvinsnstr()')
+   --  ALIAS(`mvinsstr()')
+   pragma Inline (Insert);
+
+   --  MANPAGE(`curs_instr.3x')
+
+   --  ANCHOR(`winnstr()',`Peek')
+   procedure Peek (Win : Window := Standard_Window;
+                   Str : out String;
+                   Len : Integer := -1);
+   --  AKA
+   --  ALIAS(`winstr()')
+   --  ALIAS(`innstr()')
+   --  ALIAS(`instr()')
+
+   --  ANCHOR(`mvwinnstr()',`Peek')
+   procedure Peek (Win    : Window := Standard_Window;
+                   Line   : Line_Position;
+                   Column : Column_Position;
+                   Str    : out String;
+                   Len    : Integer := -1);
+   --  AKA
+   --  ALIAS(`mvwinstr()')
+   --  ALIAS(`mvinnstr()')
+   --  ALIAS(`mvinstr()')
+
+   --  MANPAGE(`curs_inchstr.3x')
+
+   --  ANCHOR(`winchnstr()',`Peek')
+   procedure Peek (Win : Window := Standard_Window;
+                   Str : out Attributed_String;
+                   Len : Integer := -1);
+   --  AKA
+   --  ALIAS(`winchstr()')
+   --  ALIAS(`inchnstr()')
+   --  ALIAS(`inchstr()')
+
+   --  ANCHOR(`mvwinchnstr()',`Peek')
+   procedure Peek (Win    : Window := Standard_Window;
+                   Line   : Line_Position;
+                   Column : Column_Position;
+                   Str    : out Attributed_String;
+                   Len    : Integer := -1);
+   --  AKA
+   --  ALIAS(`mvwinchstr()')
+   --  ALIAS(`mvinchnstr()')
+   --  ALIAS(`mvinchstr()')
+   --  We do not inline the Peek procedures
+
+   --  MANPAGE(`curs_getstr.3x')
+
+   --  ANCHOR(`wgetnstr()',`Get')
+   procedure Get (Win : Window := Standard_Window;
+                  Str : out String;
+                  Len : Integer := -1);
+   --  AKA
+   --  ALIAS(`wgetstr()')
+   --  ALIAS(`getnstr()')
+   --  ALIAS(`getstr()')
+   --  actually getstr is not supported because that results in buffer
+   --  overflows.
+
+   --  ANCHOR(`mvwgetnstr()',`Get')
+   procedure Get (Win    : Window := Standard_Window;
+                  Line   : Line_Position;
+                  Column : Column_Position;
+                  Str    : out String;
+                  Len    : Integer := -1);
+   --  AKA
+   --  ALIAS(`mvwgetstr()')
+   --  ALIAS(`mvgetnstr()')
+   --  ALIAS(`mvgetstr()')
+   --  Get is not inlined
+
+   --  MANPAGE(`curs_slk.3x')
+
+   --  Not Implemented: slk_attr_on, slk_attr_off, slk_attr_set
+
+   type Soft_Label_Key_Format is (Three_Two_Three,
+                                  Four_Four,
+                                  PC_Style,              --  ncurses specific
+                                  PC_Style_With_Index);  --  "
+   type Label_Number is new Positive range 1 .. 12;
+   type Label_Justification is (Left, Centered, Right);
+
+   --  ANCHOR(`slk_init()',`Init_Soft_Label_Keys')
+   procedure Init_Soft_Label_Keys
+     (Format : Soft_Label_Key_Format := Three_Two_Three);
+   --  AKA
+   pragma Inline (Init_Soft_Label_Keys);
+
+   --  ANCHOR(`slk_set()',`Set_Soft_Label_Key')
+   procedure Set_Soft_Label_Key (Label : Label_Number;
+                                 Text  : String;
+                                 Fmt   : Label_Justification := Left);
+   --  AKA
+   --  We do not inline this procedure
+
+   --  ANCHOR(`slk_refresh()',`Refresh_Soft_Label_Key')
+   procedure Refresh_Soft_Label_Keys;
+   --  AKA
+   pragma Inline (Refresh_Soft_Label_Keys);
+
+   --  ANCHOR(`slk_noutrefresh()',`Refresh_Soft_Label_Keys_Without_Update')
+   procedure Refresh_Soft_Label_Keys_Without_Update;
+   --  AKA
+   pragma Inline (Refresh_Soft_Label_Keys_Without_Update);
+
+   --  ANCHOR(`slk_label()',`Get_Soft_Label_Key')
+   procedure Get_Soft_Label_Key (Label : Label_Number;
+                                 Text  : out String);
+   --  AKA
+
+   --  ANCHOR(`slk_label()',`Get_Soft_Label_Key')
+   function Get_Soft_Label_Key (Label : Label_Number) return String;
+   --  AKA
+   --  Same as function
+   pragma Inline (Get_Soft_Label_Key);
+
+   --  ANCHOR(`slk_clear()',`Clear_Soft_Label_Keys')
+   procedure Clear_Soft_Label_Keys;
+   --  AKA
+   pragma Inline (Clear_Soft_Label_Keys);
+
+   --  ANCHOR(`slk_restore()',`Restore_Soft_Label_Keys')
+   procedure Restore_Soft_Label_Keys;
+   --  AKA
+   pragma Inline (Restore_Soft_Label_Keys);
+
+   --  ANCHOR(`slk_touch()',`Touch_Soft_Label_Keys')
+   procedure Touch_Soft_Label_Keys;
+   --  AKA
+   pragma Inline (Touch_Soft_Label_Keys);
+
+   --  ANCHOR(`slk_attron()',`Switch_Soft_Label_Key_Attributes')
+   procedure Switch_Soft_Label_Key_Attributes
+     (Attr : Character_Attribute_Set;
+      On   : Boolean := True);
+   --  AKA
+   --  ALIAS(`slk_attroff()')
+   pragma Inline (Switch_Soft_Label_Key_Attributes);
+
+   --  ANCHOR(`slk_attrset()',`Set_Soft_Label_Key_Attributes')
+   procedure Set_Soft_Label_Key_Attributes
+     (Attr  : Character_Attribute_Set := Normal_Video;
+      Color : Color_Pair := Color_Pair'First);
+   --  AKA
+   pragma Inline (Set_Soft_Label_Key_Attributes);
+
+   --  ANCHOR(`slk_attr()',`Get_Soft_Label_Key_Attributes')
+   function Get_Soft_Label_Key_Attributes return Character_Attribute_Set;
+   --  AKA
+
+   --  ANCHOR(`slk_attr()',`Get_Soft_Label_Key_Attributes')
+   function Get_Soft_Label_Key_Attributes return Color_Pair;
+   --  AKA
+   pragma Inline (Get_Soft_Label_Key_Attributes);
+
+   --  ANCHOR(`slk_color()',`Set_Soft_Label_Key_Color')
+   procedure Set_Soft_Label_Key_Color (Pair : Color_Pair);
+   --  AKA
+   pragma Inline (Set_Soft_Label_Key_Color);
+
+   --  MANPAGE(`keybound.3x')
+   --  Not Implemented: keybound
+
+   --  MANPAGE(`keyok.3x')
+
+   --  ANCHOR(`keyok()',`Enable_Key')
+   procedure Enable_Key (Key    : Special_Key_Code;
+                         Enable : Boolean := True);
+   --  AKA
+   pragma Inline (Enable_Key);
+
+   --  MANPAGE(`define_key.3x')
+
+   --  ANCHOR(`define_key()',`Define_Key')
+   procedure Define_Key (Definition : String;
+                         Key        : Special_Key_Code);
+   --  AKA
+   pragma Inline (Define_Key);
+
+   --  MANPAGE(`curs_util.3x')
+
+   --  | Not implemented : filter, use_env
+   --  | putwin, getwin are in the child package PutWin
+   --
+
+   --  ANCHOR(`keyname()',`Key_Name')
+   procedure Key_Name (Key  : Real_Key_Code;
+                       Name : out String);
+   --  AKA
+   --  The external name for a real keystroke.
+
+   --  ANCHOR(`keyname()',`Key_Name')
+   function Key_Name (Key  : Real_Key_Code) return String;
+   --  AKA
+   --  Same as function
+   --  We do not inline this routine
+
+   --  ANCHOR(`unctrl()',`Un_Control')
+   procedure Un_Control (Ch  : Attributed_Character;
+                         Str : out String);
+   --  AKA
+
+   --  ANCHOR(`unctrl()',`Un_Control')
+   function Un_Control (Ch  : Attributed_Character) return String;
+   --  AKA
+   --  Same as function
+   pragma Inline (Un_Control);
+
+   --  ANCHOR(`delay_output()',`Delay_Output')
+   procedure Delay_Output (Msecs : Natural);
+   --  AKA
+   pragma Inline (Delay_Output);
+
+   --  ANCHOR(`flushinp()',`Flush_Input')
+   procedure Flush_Input;
+   --  AKA
+   pragma Inline (Flush_Input);
+
+   --  MANPAGE(`curs_termattrs.3x')
+
+   --  ANCHOR(`baudrate()',`Baudrate')
+   function Baudrate return Natural;
+   --  AKA
+   pragma Inline (Baudrate);
+
+   --  ANCHOR(`erasechar()',`Erase_Character')
+   function Erase_Character return Character;
+   --  AKA
+   pragma Inline (Erase_Character);
+
+   --  ANCHOR(`killchar()',`Kill_Character')
+   function Kill_Character return Character;
+   --  AKA
+   pragma Inline (Kill_Character);
+
+   --  ANCHOR(`has_ic()',`Has_Insert_Character')
+   function Has_Insert_Character return Boolean;
+   --  AKA
+   pragma Inline (Has_Insert_Character);
+
+   --  ANCHOR(`has_il()',`Has_Insert_Line')
+   function Has_Insert_Line return Boolean;
+   --  AKA
+   pragma Inline (Has_Insert_Line);
+
+   --  ANCHOR(`termattrs()',`Supported_Attributes')
+   function Supported_Attributes return Character_Attribute_Set;
+   --  AKA
+   pragma Inline (Supported_Attributes);
+
+   --  ANCHOR(`longname()',`Long_Name')
+   procedure Long_Name (Name : out String);
+   --  AKA
+
+   --  ANCHOR(`longname()',`Long_Name')
+   function Long_Name return String;
+   --  AKA
+   --  Same as function
+   pragma Inline (Long_Name);
+
+   --  ANCHOR(`termname()',`Terminal_Name')
+   procedure Terminal_Name (Name : out String);
+   --  AKA
+
+   --  ANCHOR(`termname()',`Terminal_Name')
+   function Terminal_Name return String;
+   --  AKA
+   --  Same as function
+   pragma Inline (Terminal_Name);
+
+   --  MANPAGE(`curs_color.3x')
+
+   --  COLOR_PAIR
+   --  COLOR_PAIR(n) in C is the same as
+   --  Attributed_Character(Ch => Nul, Color => n, Attr => Normal_Video)
+   --  In C you often see something like c = c | COLOR_PAIR(n);
+   --  This is equivalent to c.Color := n;
+
+   --  ANCHOR(`start_color()',`Start_Color')
+   procedure Start_Color;
+   --  AKA
+   pragma Import (C, Start_Color, "start_color");
+
+   --  ANCHOR(`init_pair()',`Init_Pair')
+   procedure Init_Pair (Pair : Redefinable_Color_Pair;
+                        Fore : Color_Number;
+                        Back : Color_Number);
+   --  AKA
+   pragma Inline (Init_Pair);
+
+   --  ANCHOR(`pair_content()',`Pair_Content')
+   procedure Pair_Content (Pair : Color_Pair;
+                           Fore : out Color_Number;
+                           Back : out Color_Number);
+   --  AKA
+   pragma Inline (Pair_Content);
+
+   --  ANCHOR(`has_colors()',`Has_Colors')
+   function Has_Colors return Boolean;
+   --  AKA
+   pragma Inline (Has_Colors);
+
+   --  ANCHOR(`init_color()',`Init_Color')
+   procedure Init_Color (Color : Color_Number;
+                         Red   : RGB_Value;
+                         Green : RGB_Value;
+                         Blue  : RGB_Value);
+   --  AKA
+   pragma Inline (Init_Color);
+
+   --  ANCHOR(`can_change_color()',`Can_Change_Color')
+   function Can_Change_Color return Boolean;
+   --  AKA
+   pragma Inline (Can_Change_Color);
+
+   --  ANCHOR(`color_content()',`Color_Content')
+   procedure Color_Content (Color : Color_Number;
+                            Red   : out RGB_Value;
+                            Green : out RGB_Value;
+                            Blue  : out RGB_Value);
+   --  AKA
+   pragma Inline (Color_Content);
+
+   --  MANPAGE(`curs_kernel.3x')
+   --  | Not implemented: getsyx, setsyx
+   --
+   type Curses_Mode is (Curses, Shell);
+
+   --  ANCHOR(`def_prog_mode()',`Save_Curses_Mode')
+   procedure Save_Curses_Mode (Mode : Curses_Mode);
+   --  AKA
+   --  ALIAS(`def_shell_mode()')
+   pragma Inline (Save_Curses_Mode);
+
+   --  ANCHOR(`reset_prog_mode()',`Reset_Curses_Mode')
+   procedure Reset_Curses_Mode (Mode : Curses_Mode);
+   --  AKA
+   --  ALIAS(`reset_shell_mode()')
+   pragma Inline (Reset_Curses_Mode);
+
+   --  ANCHOR(`savetty()',`Save_Terminal_State')
+   procedure Save_Terminal_State;
+   --  AKA
+   pragma Inline (Save_Terminal_State);
+
+   --  ANCHOR(`resetty();',`Reset_Terminal_State')
+   procedure Reset_Terminal_State;
+   --  AKA
+   pragma Inline (Reset_Terminal_State);
+
+   type Stdscr_Init_Proc is access
+      function (Win     : Window;
+                Columns : Column_Count) return Integer;
+   pragma Convention (C, Stdscr_Init_Proc);
+   --  N.B.: the return value is actually ignored, but it seems to be
+   --        a good practice to return 0 if you think all went fine
+   --        and -1 otherwise.
+
+   --  ANCHOR(`ripoffline()',`Rip_Off_Lines')
+   procedure Rip_Off_Lines (Lines : Integer;
+                            Proc  : Stdscr_Init_Proc);
+   --  AKA
+   --  N.B.: to be more precise, this uses a ncurses specific enhancement of
+   --        ripoffline(), in which the Lines argument absolute value is the
+   --        number of lines to be ripped of. The official ripoffline() only
+   --        uses the sign of Lines to remove a single line from bottom or top.
+   pragma Inline (Rip_Off_Lines);
+
+   type Cursor_Visibility is (Invisible, Normal, Very_Visible);
+
+   --  ANCHOR(`curs_set()',`Set_Cursor_Visibility')
+   procedure Set_Cursor_Visibility (Visibility : in out Cursor_Visibility);
+   --  AKA
+   pragma Inline (Set_Cursor_Visibility);
+
+   --  ANCHOR(`napms()',`Nap_Milli_Seconds')
+   procedure Nap_Milli_Seconds (Ms : Natural);
+   --  AKA
+   pragma Inline (Nap_Milli_Seconds);
+
+   --  |=====================================================================
+   --  | Some useful helpers.
+   --  |=====================================================================
+   type Transform_Direction is (From_Screen, To_Screen);
+   procedure Transform_Coordinates
+     (W      : Window := Standard_Window;
+      Line   : in out Line_Position;
+      Column : in out Column_Position;
+      Dir    : Transform_Direction := From_Screen);
+   --  This procedure transforms screen coordinates into coordinates relative
+   --  to the window and vice versa, depending on the Dir parameter.
+   --  Screen coordinates are the position information for the physical device.
+   --  An Curses_Exception will be raised if Line and Column are not in the
+   --  Window or if you pass the Null_Window as argument.
+   --  We do not inline this procedure
+
+   --  MANPAGE(`default_colors.3x')
+
+   Default_Color : constant Color_Number := -1;
+
+   --  ANCHOR(`use_default_colors()',`Use_Default_Colors')
+   procedure Use_Default_Colors;
+   --  AKA
+   pragma Inline (Use_Default_Colors);
+
+   --  ANCHOR(`assume_default_colors()',`Assume_Default_Colors')
+   procedure Assume_Default_Colors (Fore : Color_Number := Default_Color;
+                                    Back : Color_Number := Default_Color);
+   --  AKA
+   pragma Inline (Assume_Default_Colors);
+
+   --  MANPAGE(`curs_extend.3x')
+
+   --  ANCHOR(`curses_version()',`Curses_Version')
+   function Curses_Version return String;
+   --  AKA
+
+   --  ANCHOR(`use_extended_names()',`Use_Extended_Names')
+   --  The returnvalue is the previous setting of the flag
+   function Use_Extended_Names (Enable : Boolean) return Boolean;
+   --  AKA
+
+   --  MANPAGE(`curs_trace.3x')
+
+   --  ANCHOR(`_nc_freeall()',`Curses_Free_All')
+   procedure Curses_Free_All;
+   --  AKA
+
+   --  MANPAGE(`curs_scr_dump.3x')
+
+   --  ANCHOR(`scr_dump()',`Screen_Dump_To_File')
+   procedure Screen_Dump_To_File (Filename : String);
+   --  AKA
+
+   --  ANCHOR(`scr_restore()',`Screen_Restore_From_File')
+   procedure Screen_Restore_From_File (Filename : String);
+   --  AKA
+
+   --  ANCHOR(`scr_init()',`Screen_Init_From_File')
+   procedure Screen_Init_From_File (Filename : String);
+   --  AKA
+
+   --  ANCHOR(`scr_set()',`Screen_Set_File')
+   procedure Screen_Set_File (Filename : String);
+   --  AKA
+
+   --  MANPAGE(`curs_print.3x')
+   --  Not implemented: mcprint
+
+   --  MANPAGE(`curs_printw.3x')
+   --  Not implemented: printw,  wprintw, mvprintw, mvwprintw, vwprintw,
+   --                   vw_printw
+   --  Please use the Ada style Text_IO child packages for formatted
+   --  printing. It does not make a lot of sense to map the printf style
+   --  C functions to Ada.
+
+   --  MANPAGE(`curs_scanw.3x')
+   --  Not implemented: scanw, wscanw, mvscanw, mvwscanw, vwscanw, vw_scanw
+
+   --  MANPAGE(`resizeterm.3x')
+   --  Not Implemented: resizeterm
+
+   --  MANPAGE(`wresize.3x')
+
+   --  ANCHOR(`wresize()',`Resize')
+   procedure Resize (Win               : Window := Standard_Window;
+                     Number_Of_Lines   : Line_Count;
+                     Number_Of_Columns : Column_Count);
+   --  AKA
+
+private
+   type Window is new System.Storage_Elements.Integer_Address;
+   Null_Window : constant Window := 0;
+
+   --  The next constants are generated and may be different on your
+   --  architecture.
+   --
+
+   Sizeof_Bool : constant := Curses_Constants.Sizeof_Bool;
+
+   type Curses_Bool is mod 2 ** Sizeof_Bool;
+
+   Curses_Bool_False : constant Curses_Bool := 0;
+
+end Terminal_Interface.Curses;
diff --git a/Ada95/include/MKncurses_def.sh b/Ada95/include/MKncurses_def.sh
new file mode 100755
index 0000000..9d80244
--- /dev/null
+++ b/Ada95/include/MKncurses_def.sh
@@ -0,0 +1,81 @@
+#! /bin/sh
+# $Id: MKncurses_def.sh,v 1.5 2022/07/16 17:03:59 tom Exp $
+##############################################################################
+# Copyright 2020,2022 Thomas E. Dickey                                       #
+# Copyright 2003 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.                                                             #
+##############################################################################
+#
+# MKncurses_def.sh -- generate fallback definitions for ncurses_cfg.h
+#
+# Author: Thomas E. Dickey 2000
+#
+# Given the choice between constructs such as
+#
+#	#if defined(foo) && foo
+#	#if foo
+#
+# we chose the latter.  It is guaranteed by the language standard, and there
+# appear to be no broken compilers that do not honor that detail.  But some
+# people want to use gcc's -Wundef option (corresponding to one of the less
+# useful features in Watcom's compiler) to check for misspellings.  So we
+# generate a set of fallback definitions to quiet the warnings without making
+# the code ugly.
+#
+DEFS="${1-ncurses_defs}"
+cat <<EOF
+/*
+ * This file is generated by $0
+ */
+
+#ifndef NC_DEFINE_H
+#define NC_DEFINE_H 1
+
+EOF
+
+"${AWK-awk}" <"$DEFS" '
+!/^[@#]/ {
+	if ( NF == 1 )
+	{
+		print "#ifndef", $1
+		print "#define", $1, "0"
+		print "#endif"
+		print ""
+	} else if ( NF != 0 ) {
+		print "#ifndef", $1
+		printf "#define"
+		for (n = 1; n <= NF; n++) {
+			printf " %s", $n
+		}
+		print ""
+		print "#endif"
+		print ""
+	}
+}
+END	{
+print "#endif /* NC_DEFINE_H */"
+	}
+'
diff --git a/Ada95/include/Makefile.in b/Ada95/include/Makefile.in
new file mode 100644
index 0000000..89bb27d
--- /dev/null
+++ b/Ada95/include/Makefile.in
@@ -0,0 +1,105 @@
+# $Id: Makefile.in,v 1.7 2021/07/03 15:45:33 tom Exp $
+##############################################################################
+# Copyright 2020,2021 Thomas E. Dickey                                       #
+# Copyright 2010-2015,2018 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey
+#
+# Makefile for ncurses source code.
+#
+# This makes header files used when building Ada95 as a separate tree.
+#
+# The variable 'srcdir' refers to the source-distribution, and can be set with
+# the configure script by "--srcdir=DIR".
+
+# turn off _all_ suffix rules; we'll generate our own
+.SUFFIXES:
+
+SHELL		= @SHELL@
+VPATH		= @srcdir@
+THIS		= Makefile
+
+DESTDIR		= @DESTDIR@
+srcdir		= @srcdir@
+prefix		= @prefix@
+exec_prefix	= @exec_prefix@
+includedir	= @includedir@
+
+INSTALL		= @INSTALL@ @INSTALL_OPT_O@
+INSTALL_DATA	= @INSTALL_DATA@
+
+AWK		= @AWK@
+
+# These files are generated by this makefile
+AUTO_SRC = \
+	ncurses_def.h
+
+################################################################################
+
+@MAKE_PHONY@.PHONY :	all
+@MAKE_PHONY@.PHONY :	clean
+@MAKE_PHONY@.PHONY :	distclean
+@MAKE_PHONY@.PHONY :	install
+@MAKE_PHONY@.PHONY :	install.libs
+@MAKE_PHONY@.PHONY :	libs
+@MAKE_PHONY@.PHONY :	mostlyclean
+@MAKE_PHONY@.PHONY :	realclean
+@MAKE_PHONY@.PHONY :	sources
+@MAKE_PHONY@.PHONY :	uninstall
+@MAKE_PHONY@.PHONY :	uninstall.libs
+
+all \
+libs \
+sources \
+install ::	$(AUTO_SRC)
+
+uninstall ::
+
+ncurses_def.h: $(srcdir)/ncurses_defs $(srcdir)/MKncurses_def.sh
+	AWK=$(AWK) $(SHELL) $(srcdir)/MKncurses_def.sh $(srcdir)/ncurses_defs >$@
+
+tags:
+	ctags *.[ch]
+
+@MAKE_UPPER_TAGS@TAGS:
+@MAKE_UPPER_TAGS@	etags *.[ch]
+
+mostlyclean ::
+	-rm -f core tags TAGS *~ *.bak *.i *.ln *.atac trace
+
+clean :: mostlyclean
+	-rm -f $(AUTO_SRC)
+
+distclean :: clean
+	-rm -f Makefile
+
+realclean :: distclean
+
+###############################################################################
+# The remainder of this file is automatically generated during configuration
+###############################################################################
diff --git a/Ada95/include/ncurses_cfg.hin b/Ada95/include/ncurses_cfg.hin
new file mode 100644
index 0000000..f8bcb66
--- /dev/null
+++ b/Ada95/include/ncurses_cfg.hin
@@ -0,0 +1,73 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 2005-2017,2018 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey <dickey@clark.net> 1997                        *
+ ****************************************************************************/
+/*
+ * $Id: ncurses_cfg.hin,v 1.11 2020/02/02 23:34:34 tom Exp $
+ *
+ * This is a template-file used to generate the "ncurses_cfg.h" file.
+ *
+ * Rather than list every definition, the configuration script substitutes the
+ * definitions that it finds using 'sed'.  You need a patch (original date
+ * 971222) to autoconf 2.12 or 2.13 to do this.
+ *
+ * See:
+ *	https://invisible-island.net/autoconf/
+ *	ftp://ftp.invisible-island.net/autoconf/
+ */
+#ifndef NC_CONFIG_H
+#define NC_CONFIG_H
+@DEFS@
+
+#include <ncurses_def.h>
+
+	/* The C compiler may not treat these properly but C++ has to */
+#ifdef __cplusplus
+#undef const
+#undef inline
+#else
+#if defined(lint) || defined(TRACE)
+#undef inline
+#define inline /* nothing */
+#endif
+#endif
+
+	/* On HP-UX, the C compiler doesn't grok mbstate_t without
+	   -D_XOPEN_SOURCE=500. However, this causes problems on
+	   IRIX. So, we #define mbstate_t to int in configure.in
+	   only for the C compiler if needed. */
+#ifndef __cplusplus
+#ifdef NEED_MBSTATE_T_DEF
+#define mbstate_t int
+#endif
+#endif
+
+#endif /* NC_CONFIG_H */
diff --git a/Ada95/include/ncurses_defs b/Ada95/include/ncurses_defs
new file mode 100644
index 0000000..adc1b24
--- /dev/null
+++ b/Ada95/include/ncurses_defs
@@ -0,0 +1,200 @@
+# $Id: ncurses_defs,v 1.47 2021/12/04 23:08:11 tom Exp $
+##############################################################################
+# Copyright 2020,2021 Thomas E. Dickey                                       #
+# Copyright 2008-2012,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.                                                             #
+##############################################################################
+#
+# See "MKncurses_def.sh" for an explanation.
+#
+# (hint: don't try to define NDEBUG ;-)
+
+BROKEN_LINKER
+BSD_TPUTS
+CPP_HAS_PARAM_INIT
+CURSES_ACS_ARRAY	acs_map
+CURSES_WACS_ARRAY	_nc_wacs
+DECL_ERRNO
+ETIP_NEEDS_MATH_H
+GCC_NORETURN	/* nothing */
+GCC_UNUSED	/* nothing */
+HAVE_BIG_CORE
+HAVE_BSD_CGETENT
+HAVE_BSD_SIGNAL_H
+HAVE_BTOWC
+HAVE_BUILTIN_H
+HAVE_CHGAT	1
+HAVE_COLOR_SET	1
+HAVE_DIRENT_H
+HAVE_ERRNO
+HAVE_FCNTL_H
+HAVE_FILTER	1
+HAVE_FORM_H
+HAVE_GETBEGX	1
+HAVE_GETCURX	1
+HAVE_GETCWD
+HAVE_GETEGID
+HAVE_GETEUID
+HAVE_GETMAXX	1
+HAVE_GETNSTR
+HAVE_GETOPT_H
+HAVE_GETPARX	1
+HAVE_GETTIMEOFDAY
+HAVE_GETWIN	1
+HAVE_GPM_H
+HAVE_GPP_BUILTIN_H
+HAVE_GXX_BUILTIN_H
+HAVE_HAS_KEY
+HAVE_IOSTREAM
+HAVE_ISASCII
+HAVE_ISSETUGID
+HAVE_LANGINFO_CODESET
+HAVE_LIBC_H
+HAVE_LIBDBMALLOC
+HAVE_LIBDMALLOC
+HAVE_LIBFORM
+HAVE_LIBGPM
+HAVE_LIBMENU
+HAVE_LIBMPATROL
+HAVE_LIBPANEL
+HAVE_LIMITS_H
+HAVE_LINK
+HAVE_LOCALE_H
+HAVE_LONG_FILE_NAMES
+HAVE_MBLEN
+HAVE_MBRLEN
+HAVE_MBRTOWC
+HAVE_MBSRTOWCS
+HAVE_MBSTOWCS
+HAVE_MBTOWC
+HAVE_MENU_H
+HAVE_MKSTEMP
+HAVE_MVVLINE	1
+HAVE_MVWVLINE	1
+HAVE_NANOSLEEP
+HAVE_NC_ALLOC_H
+HAVE_PANEL_H
+HAVE_POLL
+HAVE_POLL_H
+HAVE_PURIFY
+HAVE_PUTWC
+HAVE_PUTWIN	1
+HAVE_REGEXPR_H_FUNCS
+HAVE_REGEXP_H_FUNCS
+HAVE_REGEX_H_FUNCS
+HAVE_REMOVE
+HAVE_RESIZETERM
+HAVE_RESIZE_TERM
+HAVE_RIPOFFLINE	1
+HAVE_SELECT
+HAVE_SETUPTERM	1
+HAVE_SIGACTION
+HAVE_SIGVEC
+HAVE_SIZECHANGE
+HAVE_SLK_COLOR
+HAVE_SLK_INIT	1
+HAVE_STRSTR
+HAVE_SYMLINK
+HAVE_SYS_BSDTYPES_H
+HAVE_SYS_IOCTL_H
+HAVE_SYS_PARAM_H
+HAVE_SYS_POLL_H
+HAVE_SYS_SELECT_H
+HAVE_SYS_TERMIO_H
+HAVE_SYS_TIMES_H
+HAVE_SYS_TIME_H
+HAVE_SYS_TIME_SELECT
+HAVE_TCGETATTR
+HAVE_TCGETPGRP
+HAVE_TELL
+HAVE_TERMATTRS	1
+HAVE_TERMIOS_H
+HAVE_TERMIO_H
+HAVE_TERMNAME	1
+HAVE_TERM_H	1
+HAVE_TGETENT	1
+HAVE_TIGETNUM	1
+HAVE_TIGETSTR	1
+HAVE_TIMES
+HAVE_TYPEAHEAD	1
+HAVE_TYPEINFO
+HAVE_TYPE_ATTR_T
+HAVE_TYPE_SIGACTION
+HAVE_UNISTD_H
+HAVE_UNLINK
+HAVE_USE_DEFAULT_COLORS
+HAVE_VFSCANF
+HAVE_VSNPRINTF
+HAVE_VSSCANF
+HAVE_WCSRTOMBS
+HAVE_WCSTOMBS
+HAVE_WCTOB
+HAVE_WCTOMB
+HAVE_WCTYPE_H
+HAVE_WINSSTR	1
+HAVE_WORKING_POLL
+HAVE_WRESIZE
+HAVE__DOSCAN
+MIXEDCASE_FILENAMES
+NCURSES_CHAR_EQ
+NCURSES_EXPANDED
+NCURSES_EXT_COLORS
+NCURSES_EXT_FUNCS
+NCURSES_NO_PADDING
+NCURSES_PATHSEP	':'
+NEED_PTEM_H
+NO_LEAKS
+PURE_TERMINFO
+STDC_HEADERS
+SVR4_ACTION
+SVR4_TERMIO
+SYSTEM_NAME	"unknown"
+TERMINFO	"none"
+TERMPATH	"none"
+TIME_WITH_SYS_TIME
+TYPEOF_CHTYPE
+USE_COLORFGBG
+USE_DATABASE
+USE_GETCAP
+USE_GETCAP_CACHE
+USE_HARD_TABS
+USE_HASHED_DB
+USE_HASHMAP
+USE_HOME_TERMINFO
+USE_LINKS
+USE_MY_MEMMOVE
+USE_OK_BCOPY
+USE_RCS_IDS
+USE_REENTRANT
+USE_SAFE_SPRINTF
+USE_SCROLL_HINTS
+USE_SIGWINCH
+USE_SYMLINKS
+USE_SYSMOUSE
+USE_TERMCAP
+USE_WEAK_SYMBOLS
+USE_WIDEC_SUPPORT
+USE_XMC_SUPPORT
diff --git a/Ada95/make-tar.sh b/Ada95/make-tar.sh
new file mode 100755
index 0000000..083812d
--- /dev/null
+++ b/Ada95/make-tar.sh
@@ -0,0 +1,174 @@
+#!/bin/sh
+# $Id: make-tar.sh,v 1.23 2022/11/05 20:29:41 tom Exp $
+##############################################################################
+# Copyright 2019-2021,2022 Thomas E. Dickey                                  #
+# Copyright 2010-2015,2017 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.                                                             #
+##############################################################################
+# Construct a tar-file containing only the Ada95 tree as well as its associated
+# documentation.  The reason for doing that is to simplify distributing the
+# ada binding as a separate package.
+
+CDPATH=:
+export CDPATH
+
+TARGET=`pwd`
+
+: "${ROOTNAME:=ncurses-Ada95}"
+: "${PKG_NAME:=AdaCurses}"
+: "${DESTDIR:=$TARGET}"
+: "${TMPDIR:=/tmp}"
+
+# make timestamps of generated files predictable
+same_timestamp() {
+	touch -r ../NEWS "$1"
+}
+
+grep_assign() {
+	grep_assign=`grep -E "^$2\>" "$1" | sed -e "s/^$2[ 	]*=[ 	]*//" -e 's/"//g'`
+	eval "$2"=\""$grep_assign"\"
+}
+
+grep_patchdate() {
+	grep_assign ../dist.mk NCURSES_MAJOR
+	grep_assign ../dist.mk NCURSES_MINOR
+	grep_assign ../dist.mk NCURSES_PATCH
+}
+
+# The rpm spec-file in the ncurses tree is a template.  Fill in the version
+# information from dist.mk
+edit_specfile() {
+	sed \
+		-e "s/\\<MAJOR\\>/$NCURSES_MAJOR/g" \
+		-e "s/\\<MINOR\\>/$NCURSES_MINOR/g" \
+		-e "s/\\<YYYYMMDD\\>/$NCURSES_PATCH/g" "$1" >"$1.new"
+	chmod u+w "$1"
+	mv "$1.new" "$1"
+	same_timestamp "$1"
+}
+
+make_changelog() {
+	[ -f "$1" ] && chmod u+w "$1"
+	cat >"$1" <<EOF
+`echo $PKG_NAME|tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` ($NCURSES_MAJOR.$NCURSES_MINOR+$NCURSES_PATCH) unstable; urgency=low
+
+  * snapshot of ncurses subpackage for $PKG_NAME.
+
+ -- `head -n 1 "$HOME"/.signature`  `date -R`
+EOF
+	same_timestamp "$1"
+}
+
+# This can be run from either the subdirectory, or from the top-level
+# source directory.  We will put the tar file in the original directory.
+if [ -d ./Ada95 ]
+then
+	cd ./Ada95 || exit
+fi
+SOURCE=`cd ..;pwd`
+
+BUILD=$TMPDIR/make-tar$$
+trap "cd /; rm -rf $BUILD; exit 1" 1 2 3 15
+trap "cd /; rm -rf $BUILD" 0
+
+umask 077
+if ! ( mkdir $BUILD )
+then
+	echo "? cannot make build directory $BUILD"
+fi
+
+umask 022
+mkdir $BUILD/$ROOTNAME
+
+cp -p -r ./* $BUILD/$ROOTNAME/ || exit
+
+# Add the config.* utility scripts from the top-level directory.
+for i in . ..
+do
+	for j in COPYING config.guess config.sub install-sh tar-copy.sh
+	do
+		[ -f $i/$j ] && cp -p $i/$j $BUILD/$ROOTNAME/
+	done
+done
+
+# Make rpm and dpkg scripts for test-builds
+grep_patchdate
+for spec in "$BUILD/$ROOTNAME"/package/*.spec
+do
+	edit_specfile "$spec"
+done
+for spec in "$BUILD/$ROOTNAME"/package/debian*
+do
+	make_changelog "$spec"/changelog
+done
+
+cp -p ../man/MKada_config.in $BUILD/$ROOTNAME/doc/
+if [ -z "$NO_HTML_DOCS" ]
+then
+	# Add the ada documentation.
+	cd ../doc/html || exit
+
+	cp -p -r Ada* $BUILD/$ROOTNAME/doc/
+	cp -p -r ada $BUILD/$ROOTNAME/doc/
+
+	cd ../../Ada95 || exit
+fi
+
+cp -p "$SOURCE/NEWS" $BUILD/$ROOTNAME
+
+# cleanup empty directories (an artifact of ncurses source archives)
+
+touch $BUILD/$ROOTNAME/MANIFEST
+( cd $BUILD/$ROOTNAME && find . -type f -print | "$SOURCE/misc/csort" >MANIFEST )
+same_timestamp $BUILD/$ROOTNAME/MANIFEST
+
+cd $BUILD || exit
+
+# Remove build-artifacts.
+find . -name RCS -exec rm -rf {} \;
+find $BUILD/$ROOTNAME -type d -exec rmdir {} \; 2>/dev/null
+find $BUILD/$ROOTNAME -type d -exec rmdir {} \; 2>/dev/null
+find $BUILD/$ROOTNAME -type d -exec rmdir {} \; 2>/dev/null
+
+# There is no need for this script in the tar file.
+rm -f $ROOTNAME/make-tar.sh
+
+# Remove build-artifacts.
+find . -name "*.gz" -exec rm -rf {} \;
+
+# Make the files writable...
+chmod -R u+w .
+
+# Cleanup timestamps
+[ -n "$TOUCH_DIRS" ] && "$TOUCH_DIRS" "$ROOTNAME"
+
+tar cf - $TAR_OPTIONS $ROOTNAME | gzip >"$DESTDIR/$ROOTNAME.tar.gz"
+cd "$DESTDIR" || exit
+
+pwd
+ls -l $ROOTNAME.tar.gz
+
+# vi:ts=4 sw=4
diff --git a/Ada95/mk-1st.awk b/Ada95/mk-1st.awk
new file mode 100644
index 0000000..616bfa6
--- /dev/null
+++ b/Ada95/mk-1st.awk
@@ -0,0 +1,91 @@
+# $Id: mk-1st.awk,v 1.5 2020/02/02 23:34:34 tom Exp $
+##############################################################################
+# Copyright 2020 Thomas E. Dickey                                            #
+# Copyright 2010,2011 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey
+#
+# Generate compile-rules for the Ada95 modules that we are using in libraries
+# or programs.  This script is used for older versions of gnatmake, which do
+# not build libraries reliably, e.g., gnatmake 3.15.
+#
+# Fields in src/modules:
+#	$1 = module name
+#	$2 = directory where spec-dependency ".ads" is found
+#	$3 = directory where body-dependency ".adb" is found
+#	$4 = unit to compile (spec or body)
+#
+BEGIN	{
+		printf "\n";
+		printf "# generated by Ada95/mk-1st.awk\n";
+	}
+	/^[#]/ {
+		next
+	}
+	/^$/ {
+		next
+	}
+	{
+		printf "\n";
+		printf "%s.o :", $1;
+
+		if ( $2 == "none" ) {
+			pre_spec = "";
+		} else if ( $2 == "." ) {
+			pre_spec = "";
+			printf " \\\n\t\t%s.ads", $1;
+		} else {
+			pre_spec = sprintf("%s/", $2);
+			printf " \\\n\t\t%s%s.ads", pre_spec, $1;
+		}
+
+		if ( $3 == "none" ) {
+			pre_body = "";
+		} else if ( $3 == "." ) {
+			pre_body = "";
+			printf " \\\n\t\t%s.adb", $1;
+		} else {
+			pre_body = sprintf("%s/", $3);
+			printf " \\\n\t\t%s%s.adb", pre_body, $1;
+			printf " \\\n\t\t$(BASEDEPS)";
+		}
+
+		if ( $4 == "spec" ) {
+			suffix = "ads";
+			prefix = pre_spec;
+		} else {
+			suffix = "adb";
+			prefix = pre_body;
+		}
+
+		printf  "\n";
+		printf "\t$(ADA) $(ADAFLAGS) -c -o $@ %s%s.%s\n", prefix, $1, suffix
+	}
+END	{
+		print  ""
+	}
diff --git a/Ada95/mk-pkg.awk b/Ada95/mk-pkg.awk
new file mode 100644
index 0000000..bb07abe
--- /dev/null
+++ b/Ada95/mk-pkg.awk
@@ -0,0 +1,90 @@
+# $Id: mk-pkg.awk,v 1.1 2022/12/17 23:41:18 tom Exp $
+##############################################################################
+# Copyright 2022 Thomas E. Dickey                                            #
+#                                                                            #
+# 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey
+#
+# add rules to Makefile for AdaCurses binding package.
+BEGIN	{
+		print "# generated by mk-pkg.awk\n";
+	}
+END	{
+	printf	"PACKAGE 	= %s\n", PACKAGE
+	print	"real_bindir	= $(libexecdir)/$(PACKAGE)"
+	print	"REAL_BINDIR	= $(LIBEXECDIR)/$(PACKAGE)"
+	print	"SUB_MFLAGS	= $(TOP_MFLAGS) BINDIR=$(REAL_BINDIR)"
+	print	"samples 	= samples"
+	print	""
+	print	"TESTS = \\"
+	print	"	$(samples)/ncurses \\"
+	print	"	$(samples)/rain \\"
+	print	"	$(samples)/tour"
+	print	""
+	print	"DATAFILES = \\"
+	print	"	$(samples)/explain.txt"
+	print	""
+	print	"all:: $(TESTS)"
+	print	""
+	print	"# we might install the example-programs"
+	print	"$(PACKAGE) :"
+	print	"	@echo \"creating $(PACKAGE) script\""
+	print	"	@$(SHELL) -c '\\"
+	print	"	L=$(real_bindir);                            \\"
+	print	"	rm -f $@;                                    \\"
+	print	"	echo \"#!$(SHELL)\" >                     $@;\\"
+	print	"	echo \"PATH=\\\"$$L\\\":\\$$PATH\"      >>$@;\\"
+	print	"	echo \"export PATH\"                    >>$@;\\"
+	print	"	echo \"if test \\$$# != 0; then\"       >>$@;\\"
+	print	"	echo \"  exec \\\"\\$$@\\\"\"           >>$@;\\"
+	print	"	echo \"elif test -t 1; then\"           >>$@;\\"
+	print	"	echo \"  cd \\\"$$L\\\" || exit\"       >>$@;\\"
+	print	"	echo \"  ls -l | \\$${PAGER:-less}\"    >>$@;\\"
+	print	"	echo \"fi\"                             >>$@;\\"
+	print	"	echo \"echo \\\"usage: $@ [program]\\\"\" >>$@'"
+	print	""
+	print	"install \\"
+	print	"install.examples:: $(PACKAGE) $(BINDIR) $(REAL_BINDIR) $(DATADIR) $(TESTS)"
+	print	"	@echo \"installing $(PACKAGE) -> $(BINDIR)/\""
+	print	"	$(INSTALL_SCRIPT) $(PACKAGE) $(BINDIR)"
+	print	"	( cd samples && $(MAKE) $(SUB_MFLAGS) install.examples )"
+	print	""
+	print	"uninstall \\"
+	print	"uninstall.examples ::"
+	print	"	-rm -f $(BINDIR)/$(PACKAGE)"
+	print	"	( cd samples && $(MAKE) $(SUB_MFLAGS) uninstall.examples )"
+	print	""
+	print	"clean \\"
+	print	"mostlyclean \\"
+	print	"realclean \\"
+	print	"distclean ::"
+	print	"	-rm -f $(PACKAGE)"
+	print	""
+	print	"$(BINDIR) $(REAL_BINDIR) $(DATADIR) :"
+	print	"	mkdir -p $@"
+
+	}
diff --git a/Ada95/package/AdaCurses-doc.spec b/Ada95/package/AdaCurses-doc.spec
new file mode 100644
index 0000000..c5b68dd
--- /dev/null
+++ b/Ada95/package/AdaCurses-doc.spec
@@ -0,0 +1,61 @@
+Summary: AdaCurses - Ada95 binding documentation for ncurses
+%define AppProgram AdaCurses
+%define AppVersion MAJOR.MINOR
+%define AppRelease YYYYMMDD
+%define AppPackage %{AppProgram}-doc
+# $Id: AdaCurses-doc.spec,v 1.7 2019/11/23 21:15:53 tom Exp $
+Name: %{AppPackage}
+Version: %{AppVersion}
+Release: %{AppRelease}
+License: MIT
+Group: Applications/Development
+URL: ftp://ftp.invisible-island.net/%{AppProgram}
+Source0: %{AppProgram}-%{AppRelease}.tgz
+Packager: Thomas Dickey <dickey@invisible-island.net>
+
+%description
+This is the Ada95 binding documentation from the ncurses MAJOR.MINOR
+distribution, for patch-date YYYYMMDD.
+%prep
+
+%define debug_package %{nil}
+
+%setup -q -n %{AppProgram}-%{AppRelease}
+
+%build
+
+INSTALL_PROGRAM='${INSTALL}' \
+%configure \
+	--target %{_target_platform} \
+	--prefix=%{_prefix} \
+	--datadir=%{_datadir} \
+	--with-ada-sharedlib
+
+%install
+[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT
+
+(cd doc && make install.html DESTDIR=$RPM_BUILD_ROOT )
+
+%clean
+if rm -rf $RPM_BUILD_ROOT; then
+  echo OK
+else
+  find $RPM_BUILD_ROOT -type f | grep -F -v /.nfs && exit 1
+fi
+exit 0
+
+%files
+%defattr(-,root,root)
+%{_datadir}/doc/%{AppProgram}
+
+%changelog
+# each patch should add its ChangeLog entries here
+
+* Sat Nov 16 2019 Thomas Dickey
+- modify clean-rule to work around Fedora NFS bugs.
+
+* Sat Sep 07 2019 Thomas Dickey
+- use AppProgram to replace "AdaCurses" globally
+
+* Sat Mar 26 2011 Thomas Dickey
+- initial version
diff --git a/Ada95/package/AdaCurses.spec b/Ada95/package/AdaCurses.spec
new file mode 100644
index 0000000..540e8e5
--- /dev/null
+++ b/Ada95/package/AdaCurses.spec
@@ -0,0 +1,136 @@
+Summary: Ada95 binding for ncurses
+%define AppProgram AdaCurses
+%define AppVersion MAJOR.MINOR
+%define AppRelease YYYYMMDD
+# $Id: AdaCurses.spec,v 1.31 2022/12/18 00:08:17 tom Exp $
+Name: %{AppProgram}
+Version: %{AppVersion}
+Release: %{AppRelease}
+License: MIT
+Group: Applications/Development
+URL: ftp://ftp.invisible-island.net/%{AppProgram}
+Source0: %{AppProgram}-%{AppRelease}.tgz
+Packager: Thomas Dickey <dickey@invisible-island.net>
+
+%description
+This is the Ada95 binding from the ncurses MAJOR.MINOR distribution, for
+patch-date YYYYMMDD.
+
+In addition to a library, this package installs sample programs in
+"bin/%{AppProgram}" to avoid conflict with other packages.
+%prep
+
+%global is_mandriva %(test -f /etc/mandriva-release && echo 1 || echo 0)
+%global is_redhat   %(test -f /etc/redhat-release && echo 1 || echo 0)
+%global is_suse     %(if grep -E -i '(opensuse)' /etc/issue >/dev/null; then echo 1; else echo 0; fi)
+
+%define debug_package %{nil}
+
+%define need_filter %(if grep -E -i '(red hat|fedora)' /etc/issue >/dev/null; then echo 1; elif test -f /etc/fedora-release; then echo 1; else echo 0; fi)
+
+%if %{need_filter} == 1
+# http://fedoraproject.org/wiki/EPEL:Packaging_Autoprovides_and_Requires_Filtering
+%filter_from_requires /lib%{AppProgram}.so.1/d
+%filter_setup
+%endif
+
+%setup -q -n %{AppProgram}-%{AppRelease}
+
+%build
+
+%define ada_libdir %{_libdir}/ada/adalib
+%define ada_include %{_prefix}/share/ada/adainclude
+
+%if %{is_mandriva}
+# Mageia 8 lacks gprbuild, needed for building shared libraries.
+%define ada_model --without-shared --without-ada-sharedlib --with-ada-objects=%{_libdir}/adalib
+%else
+# OpenSUSE actually lacks gprbuild, but there is a workable "community" package.
+%define ada_model --with-shared --with-ada-sharedlib
+%if %{is_redhat}
+# Fedora 36 LTO does not work with gprbuild system configuration.
+unset CFLAGS
+unset LDFLAGS
+unset LT_SYS_LIBRARY_PATH
+%endif
+%endif
+
+INSTALL_PROGRAM='${INSTALL}' \
+	./configure %{ada_model} \
+		--target %{_target_platform} \
+		--prefix=%{_prefix} \
+		--bindir=%{_bindir} \
+		--libdir=%{_libdir} \
+		--libexecdir=%{_libexecdir} \
+		--with-ada-include=%{ada_include} \
+		--with-ada-objects=%{ada_libdir} \
+		--mandir=%{_mandir} \
+		--datadir=%{_datadir} \
+		--disable-rpath-link \
+		--disable-echo \
+		--verbose \
+		--enable-warnings
+
+make
+
+%install
+[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT
+
+make install DESTDIR=$RPM_BUILD_ROOT
+make install.examples DESTDIR=$RPM_BUILD_ROOT
+
+%clean
+if rm -rf $RPM_BUILD_ROOT; then
+  echo OK
+else
+  find $RPM_BUILD_ROOT -type f | grep -F -v /.nfs && exit 1
+fi
+exit 0
+
+%files
+%defattr(-,root,root)
+%{_bindir}/%{AppProgram}
+%{_bindir}/adacurses*-config
+%{_libexecdir}/%{AppProgram}/*
+%{ada_libdir}/
+%if %{need_filter} == 1
+%{_libdir}/lib%{AppProgram}.*
+%endif
+%if %{is_suse}
+%{_libdir}/lib%{AppProgram}.*
+%endif
+%{_mandir}/man1/adacurses*-config.1*
+%{_datadir}/%{AppProgram}/*
+%{ada_include}/
+
+%changelog
+# each patch should add its ChangeLog entries here
+
+* Sat Dec 17 2022 Thomas Dickey
+- install sample programs in libexec
+
+* Sat Nov 19 2022 Thomas Dickey
+- use static libraries for Mageia.
+
+* Sat Nov 12 2022 Thomas Dickey
+- unset environment variables to work around Fedora LTO bugs.
+- build-fix for OpenSUSE with gprbuild.
+
+* Sat Nov 16 2019 Thomas Dickey
+- modify clean-rule to work around Fedora NFS bugs.
+
+* Sat Sep 14 2019 Thomas Dickey
+- build-fixes for Fedora29, OpenSUSE
+
+* Sat Sep 07 2019 Thomas Dickey
+- use AppProgram to replace "AdaCurses" globally
+- amend install-paths to work with Fedora30
+
+* Thu Mar 31 2011 Thomas Dickey
+- use --with-shared option for consistency with --with-ada-sharelib
+- ensure that MY_DATADIR is set when installing examples
+- add ada_libdir symbol to handle special case where libdir is /usr/lib64
+- use --disable-rpath-link to link sample programs without rpath
+
+* Fri Mar 25 2011 Thomas Dickey
+- initial version
diff --git a/Ada95/package/debian/compat b/Ada95/package/debian/compat
new file mode 100644
index 0000000..48082f7
--- /dev/null
+++ b/Ada95/package/debian/compat
@@ -0,0 +1 @@
+12
diff --git a/Ada95/package/debian/control b/Ada95/package/debian/control
new file mode 100644
index 0000000..1a9aefd
--- /dev/null
+++ b/Ada95/package/debian/control
@@ -0,0 +1,19 @@
+Source: adacurses
+Maintainer: Thomas E. Dickey <dickey@invisible-island.net>
+Section: misc
+Priority: optional
+Build-Depends: debhelper (>= 5),
+  gnat,
+  gprbuild
+Homepage: https://invisible-island.net/adacurses/
+Standards-Version: 4.6.1.0
+
+Package: adacurses
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}
+Description: Ada95 binding for ncurses
+ This package installs as "adacurses" to avoid conflict with other packages.
+ This is the Ada95 binding from the ncurses distribution.
+ .
+ In addition to a library, this package installs sample programs in
+ "bin/AdaCurses" to avoid conflict with other packages.
diff --git a/Ada95/package/debian/copyright b/Ada95/package/debian/copyright
new file mode 100644
index 0000000..b9ba9f8
--- /dev/null
+++ b/Ada95/package/debian/copyright
@@ -0,0 +1,79 @@
+Upstream source https://invisible-island.net/ncurses/Ada95.html
+
+Current ncurses maintainer: Thomas Dickey <dickey@invisible-island.net>
+
+-------------------------------------------------------------------------------
+Files: *
+Copyright: 2017-2021,2022 by Thomas E. Dickey
+Copyright: 1998-2016,2017 Free Software Foundation, Inc.
+License: X11
+
+Files: aclocal.m4 package
+Copyright: 2010-2020,2021 by Thomas E. Dickey
+License: X11
+
+    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.
+
+-------------------------------------------------------------------------------
+Files: install-sh
+Copyright:  1994 X Consortium
+License: X11
+
+    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, 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
+    X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+    AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+    TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+    Except as contained in this notice, the name of the X Consortium shall not
+    be used in advertising or otherwise to promote the sale, use or other deal-
+    ings in this Software without prior written authorization from the X Consor-
+    tium.
+
+    FSF changes to this file are in the public domain.
+
+    Calling this script install-sh is preferred over install.sh, to prevent
+    `make' implicit rules from creating a file called install from it
+    when there is no Makefile.
+
+    This script is compatible with the BSD install script, but was written
+    from scratch.  It can only install one file at a time, a restriction
+    shared with many OS's install programs.
+
+On Debian systems, the complete text of the GNU General
+Public License can be found in '/usr/share/common-licenses/GPL-2'
+
+-- vile: txtmode file-encoding=utf-8
diff --git a/Ada95/package/debian/docs b/Ada95/package/debian/docs
new file mode 100644
index 0000000..e845566
--- /dev/null
+++ b/Ada95/package/debian/docs
@@ -0,0 +1 @@
+README
diff --git a/Ada95/package/debian/rules b/Ada95/package/debian/rules
new file mode 100755
index 0000000..0adde8d
--- /dev/null
+++ b/Ada95/package/debian/rules
@@ -0,0 +1,103 @@
+#!/usr/bin/make -f
+# MAde with the aid of dh_make, by Craig Small
+# Sample debian/rules that uses debhelper. GNU copyright 1997 by Joey Hess.
+# Some lines taken from debmake, by Cristoph Lameter.
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+# These are used for cross-compiling and for saving the configure script
+# from having to guess our platform (since we know it already)
+DEB_HOST_GNU_TYPE   ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
+DEB_BUILD_GNU_TYPE  ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
+
+TARGET_DIR = $(CURDIR)/debian/adacurses
+SAMPLE_DIR = $(TARGET_DIR)/usr/libexec/AdaCurses
+
+CFLAGS   = $(shell dpkg-buildflags --get CFLAGS) $(CC_NORMAL)
+CPPFLAGS = $(shell dpkg-buildflags --get CPPFLAGS)
+LDFLAGS  = $(shell dpkg-buildflags --get LDFLAGS)
+
+ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
+        CFLAGS += -O0
+else
+        CFLAGS += -O2
+endif
+ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS)))
+        INSTALL_PROGRAM += -s
+endif
+
+
+configure: configure-stamp
+configure-stamp:
+	dh_testdir
+
+	CFLAGS="$(CFLAGS)" \
+	CPPFLAGS="$(CPPFLAGS)" \
+	LDFLAGS="$(LDFLAGS)" ./configure \
+		--host=$(DEB_HOST_GNU_TYPE) \
+		--build=$(DEB_BUILD_GNU_TYPE) \
+		--prefix=/usr \
+		--disable-rpath-link \
+		--with-shared \
+		--with-ada-sharedlib \
+		--without-pkg-config
+
+	touch configure-stamp
+
+build: build-stamp
+build-stamp: configure-stamp
+	dh_testdir
+
+	$(MAKE)
+
+	touch build-stamp
+
+clean:
+	dh_testdir
+	dh_testroot
+
+	[ ! -f makefile ] || $(MAKE) distclean
+
+	rm -f configure-stamp build-stamp install-stamp
+
+	dh_clean
+
+install: install-stamp
+install-stamp: build-stamp
+	dh_testdir
+	dh_testroot
+	dh_prep
+	dh_installdirs
+
+	$(MAKE) install DESTDIR=$(TARGET_DIR)
+
+	# FIXME: it would be nice to make these into separate packages
+	( cd samples && $(MAKE) install.examples DESTDIR=$(TARGET_DIR) BINDIR=$(SAMPLE_DIR) )
+	( cd doc && $(MAKE) install.html DESTDIR=$(TARGET_DIR) )
+
+	touch install-stamp
+
+# Build architecture-independent files here.
+binary-indep: build install
+# No binary-indep target.
+
+# Build architecture-dependent files here.
+binary-arch: build install
+	dh_testdir
+	dh_testroot
+	dh_installdocs
+	dh_installexamples
+	dh_installchangelogs NEWS
+	dh_strip
+	dh_compress
+	dh_fixperms
+	dh_installdeb
+	dh_makeshlibs
+	dh_shlibdeps
+	dh_gencontrol
+	dh_md5sums
+	dh_builddeb
+
+binary: binary-indep binary-arch
+.PHONY: build clean binary-indep binary-arch binary install install-stamp
diff --git a/Ada95/package/debian/source/format b/Ada95/package/debian/source/format
new file mode 100644
index 0000000..89ae9db
--- /dev/null
+++ b/Ada95/package/debian/source/format
@@ -0,0 +1 @@
+3.0 (native)
diff --git a/Ada95/package/debian/watch b/Ada95/package/debian/watch
new file mode 100644
index 0000000..1b870ba
--- /dev/null
+++ b/Ada95/package/debian/watch
@@ -0,0 +1,4 @@
+version=3
+
+opts=passive ftp://ftp.invisible-island.net/AdaCurses/AdaCurses-([\d.]+)\.tgz \
+ debian  uupdate
diff --git a/Ada95/samples/Makefile.in b/Ada95/samples/Makefile.in
new file mode 100644
index 0000000..3731085
--- /dev/null
+++ b/Ada95/samples/Makefile.in
@@ -0,0 +1,186 @@
+##############################################################################
+# Copyright 2018-2020,2021 Thomas E. Dickey                                  #
+# Copyright 1998-2015,2018 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.                                                             #
+##############################################################################
+#
+#  Author:  Juergen Pfeifer, 1996
+#
+#  $Id: Makefile.in,v 1.64 2021/07/03 15:45:33 tom Exp $
+#
+.SUFFIXES:
+
+SHELL		= @SHELL@
+VPATH		= @srcdir@
+THIS		= Makefile
+
+x		= @EXEEXT@
+
+srcdir		= @srcdir@
+prefix		= @prefix@
+exec_prefix	= @exec_prefix@
+bindir		= @bindir@
+datarootdir	= @datarootdir@
+datadir		= @datadir@
+libdir		= @libdir@
+includedir	= @includedir@
+
+INSTALL		= @INSTALL@ @INSTALL_OPT_O@
+INSTALL_DATA	= @INSTALL_DATA@
+
+AWK		= @AWK@
+LN_S		= @LN_S@
+
+CC		= @CC@
+CFLAGS		= @CFLAGS@ @EXTRA_CFLAGS@
+
+CPPFLAGS	= @ACPPFLAGS@ \
+		  -DHAVE_CONFIG_H -I$(srcdir)
+
+CCFLAGS		= $(CPPFLAGS) $(CFLAGS)
+
+CFLAGS_NORMAL	= $(CCFLAGS) -DNCURSES_STATIC
+CFLAGS_DEBUG	= $(CCFLAGS) -DNCURSES_STATIC @CC_G_OPT@ -DTRACE
+CFLAGS_PROFILE	= $(CCFLAGS) -DNCURSES_STATIC -pg
+CFLAGS_SHARED	= $(CCFLAGS) @CC_SHARED_OPTS@
+
+CFLAGS_DEFAULT	= $(CFLAGS_@DFT_UPR_MODEL@)
+
+REL_VERSION	= @cf_cv_rel_version@
+ABI_VERSION	= @cf_cv_abi_version@
+LOCAL_LIBDIR	= @top_builddir@/lib
+
+LINK		= $(CC)
+LDFLAGS		= @LDFLAGS@ @LD_MODEL@ @LIBS@
+
+RANLIB		= @RANLIB@
+################################################################################
+BINDIR		= $(DESTDIR)$(bindir)
+DATADIR		= $(DESTDIR)$(datadir)
+LIBDIR		= $(DESTDIR)$(libdir)
+
+MY_DATADIR	= $(DATADIR)/@ADA_LIBNAME@
+THIS_DATADIR	= $(datadir)/@ADA_LIBNAME@
+
+################################################################################
+ada_srcdir	= ../src
+
+LD_FLAGS	= @LD_MODEL@ $(LOCAL_LIBS) @LDFLAGS@ @LIBS@ @LOCAL_LDFLAGS2@ $(LDFLAGS)
+
+ADA		= @cf_ada_compiler@
+ADAPREP		= gnatprep
+ADAFLAGS	= @ADAFLAGS@ -I$(srcdir)
+
+ADAMAKE		= @cf_ada_make@
+ADAMAKEFLAGS	= -a \
+	-A$(srcdir) \
+	-A$(ada_srcdir) \
+	-A$(srcdir)/$(ada_srcdir)
+
+ALIB		= @cf_ada_package@
+ABASE		= $(ALIB)-curses
+THISLIB		= sample
+
+CARGS		= -cargs $(ADAFLAGS)
+LARGS		= -largs -L../lib -l@ADA_LIBNAME@ @TEST_ARG2@ $(LD_FLAGS) @TEST_LIBS2@
+
+PROGS		= tour$x ncurses$x @USE_GNAT_SIGINT@ rain$x
+
+################################################################################
+
+@MAKE_PHONY@.PHONY :	all
+@MAKE_PHONY@.PHONY :	clean
+@MAKE_PHONY@.PHONY :	distclean
+@MAKE_PHONY@.PHONY :	install
+@MAKE_PHONY@.PHONY :	install.examples
+@MAKE_PHONY@.PHONY :	install.libs
+@MAKE_PHONY@.PHONY :	libs
+@MAKE_PHONY@.PHONY :	mostlyclean
+@MAKE_PHONY@.PHONY :	realclean
+@MAKE_PHONY@.PHONY :	sources
+@MAKE_PHONY@.PHONY :	uninstall
+@MAKE_PHONY@.PHONY :	uninstall.examples
+@MAKE_PHONY@.PHONY :	uninstall.libs
+
+all ::  $(PROGS)
+	@echo made $@
+
+sources :
+	@echo made $@
+
+libs \
+install \
+install.libs ::
+	@echo made $@
+
+uninstall \
+uninstall.libs ::
+	@echo made $@
+
+install.examples :: $(BINDIR) $(PROGS)
+	$(INSTALL) $(PROGS) $(BINDIR)
+
+install.examples :: $(MY_DATADIR)
+	$(INSTALL_DATA) explain.txt $(MY_DATADIR)
+
+uninstall.examples ::
+	-( cd $(BINDIR) && rm -f $(PROGS) )
+	-rmdir $(BINDIR)
+	-rm -f $(MY_DATADIR)/explain.txt
+	-rmdir $(MY_DATADIR)
+
+$(BINDIR) \
+$(MY_DATADIR) :
+	mkdir -p $@
+
+AUTO_SRC = $(THISLIB)-explanation.adb
+
+ncurses$x : $(AUTO_SRC)
+	$(ADAMAKE) $(ADAMAKEFLAGS) ncurses $(CARGS) $(LARGS)
+
+tour$x : $(AUTO_SRC)
+	$(ADAMAKE) $(ADAMAKEFLAGS) tour $(CARGS) $(LARGS)
+
+rain$x : $(AUTO_SRC)
+	$(ADAMAKE) $(ADAMAKEFLAGS) rain $(CARGS) $(LARGS)
+
+mostlyclean:
+	@echo made $@
+
+clean :: mostlyclean
+	rm -f *.o *.ali b_t*.* *.s $(PROGS) a.out core b_*_test.c *.xr[bs] \
+	rm -f $(AUTO_SRC)
+	rm -f trace screendump b~*.ad[bs]
+
+distclean :: clean
+	rm -f Makefile
+
+realclean :: distclean
+	@echo made $@
+
+$(THISLIB)-explanation.adb : $(srcdir)/$(THISLIB)-explanation.adb_p
+	rm -f $@
+	$(AWK) -v this_datadir=$(THIS_DATADIR) -f $(srcdir)/split-path.awk < $(srcdir)/$(THISLIB)-explanation.adb_p  >$@
diff --git a/Ada95/samples/README b/Ada95/samples/README
new file mode 100644
index 0000000..8562343
--- /dev/null
+++ b/Ada95/samples/README
@@ -0,0 +1,36 @@
+-------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                           --
+-- Copyright 1998,2006 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: README,v 1.3 2020/02/02 23:34:34 tom Exp $
+-------------------------------------------------------------------------------
+
+The intention of the demo at this point in time is not to demonstrate all
+the features of (n)curses and its subsystems, but to give some sample
+sources how to use the binding at all.
+
+Ideally in the future we can combine both goals.
diff --git a/Ada95/samples/explain.txt b/Ada95/samples/explain.txt
new file mode 100644
index 0000000..f05eede
--- /dev/null
+++ b/Ada95/samples/explain.txt
@@ -0,0 +1,186 @@
+#VERSION
+This is Version 00.90.00 of the demo package.
+#MENUKEYS
+In a menu you can use the following Keys in the whole application:
+
+   - CTRL-X        eXit the menu
+   - CTRL-N        Go to next item
+   - CTRL-P        Go to previous item
+   - CTRL-U        Scroll up one line
+   - CTRL-D        Scroll down one line
+   - CTRL-F        Scroll down one page
+   - PAGE DOWN     Scroll down one page
+   - PAGE UP       Scroll back one page
+   - CTRL-B        Scroll back one page
+   - CTRL-Y        Clear pattern
+   - CTRL-H        Delete last character from pattern
+   - Backspace     Delete last character from pattern
+   - CTRL-A        Next pattern match
+   - CTRL-E        Previous pattern match
+   - CTRL-T        Toggle item in a multi-selection menu
+   - CR or LF      Select an item
+   - HOME Key      Go to the first item
+   - F3            Quit the menu
+   - Cursor Down   Down one item
+   - Cursor Up     Up one item
+   - Cursor Left   Left one item
+   - Cursor Right  Right one item
+   - END Key       Go to last item
+#FORMKEYS
+   - CTRL-X	   eXit the form
+   - CTRL-F	   Go forward to the next field
+   - CTRL-B	   Go backward to the previous field
+   - CTRL-L	   Go to the field left of the current one
+   - CTRL-R	   Go to the field right of the current one
+   - CTRL-U	   Go to the field above the current one
+   - CTRL-D	   Go to the field below the current one
+
+   - CTRL-W	   Go to the next word in the field
+   - CTRL-T	   Go to the previous word in the field
+
+   - CTRL-A	   Go to the beginning of the field
+   - CTRL-E	   Go to the end of the field
+
+   - CTRL-I	   Insert a blank character at the current position
+   - CTRL-O	   Insert a line
+   - CTRL-V	   Delete a character
+   - CTRL-H	   Delete previous character
+   - CTRL-Y	   Delete a line
+   - CTRL-G	   Delete a word
+   - CTRL-K	   Clear to end of field
+
+   - CTRL-N	   Next choice in a choice field (Enumerations etc.)
+   - CTRL-P	   Previous choice in a choice field.
+#HELP
+#HELPKEYS
+You may scroll with the Cursor Up/Down Keys.
+You may leave the help with the Function Key labeled 'Quit'.
+#INHELP
+You are already in the help system.
+You may leave the help with the Function Key labeled 'Quit'.
+#MAIN
+This is the main menu of the sample program for the ncurses Ada95
+binding. The main intention of the demo is not to demonstrate or
+test all the features of ncurses and its subsystems, but to provide
+to you some sample code how to use the binding with Ada95.
+
+You may select this options:
+
+   * Look at some ncurses core functions
+   * Look at some features of the menu subsystem
+   * Look at some features of the form subsystem
+   * Look at the output of the Ada.Text_IO like functions
+     for ncurses.
+
+#MAINPAD
+You may press at any place in this demo CTRL-C. This will give you a command
+window. You can just type in the Label-String of a function key, then this
+key will be simulated. This should help you to run the application even if
+you run it on a terminal with no or only a few function keys. With CTRL-N
+and CTRL-P you may browse through the possible values in the command window.
+#MENU00
+Here we give you a selection of various menu demonstrations.
+#MENU-PAD00
+This menu itself is a demo for a single valued, 1-column menu with
+descriptions for the items, a marker and a padding character between
+the item name and the description.
+#MENU01
+This is a demo of the some of the menu layout options. One of them
+is the spacing functionality. Just press the Key labeled "Flip" to
+flip between the non-spaced and a spaced version of the menu. Please
+note that this functionality is unique for ncurses and is not found
+in the SVr4 menu implementation.
+
+This is a menu that sometimes does not fit into its window and
+therefore it becomes a scroll menu.
+
+You can also see here very nicely the pattern matching functionality
+of menus. Type for example a 'J' and you will be positioned to the
+next item after the current starting with a 'J'. Any more characters
+you type in make the pattern more specific. With CTRL-A and CTRL-Z
+(for more details press the Key labeled "Keys") you can browse
+through all the items matching the pattern.
+
+You may change the format of the menu. Just press one of the keys
+labeled "4x1", "4x2" or "4x3" to get a menu with that many rows
+and columns.
+
+With the Keys "O-Row" or "O-Col" (they occupy the same label and
+switch on selection) you can change the major order scheme for
+the menu. If "O-Col" is visible, the menu is currently major
+ordered by rows, you can switch to major column order by pressing
+the key. If "O-Row" is visible, it is just the reverse situation.
+This Key is not visible in "4x1" layout mode, because in this case
+the functionality makes no sense.
+
+With the Keys "Multi" or "Singl" (they occupy the same label and
+switch on selection) you can change whether or not the menu allows
+multiple or only single selection.
+
+With the Keys "+Desc" or "-Desc" (they occupy the same label and
+switch on selection) you can change whether or not the descriptions
+for each item should be displayed. Please not that this key is
+not visible in the "4x3" layout mode, because in this case the
+menu would not fit on a typical 80x24 screen.
+
+With the Keys "Disab" or "Enab" (they occupy the same label and
+switch on selection) you can dis- or enable the selectability of
+the month with 31 days.
+#MENU-PAD01
+You may press "Flip" to see the effect of ncurses unique menu-spacing.
+The Keys "4x1", "4x2" and "4x3" will change the format of the menu.
+Please note that this is a scrolling menu. You may also play with the
+pattern matching functionality or try to change the format of the menu.
+For more details press the Key labeled "Help".
+#FORM00
+This is a demo of the forms package.
+#FORM-PAD00
+Please note that this demo is far from being complete. It really shows
+only a small part of the functionality of the forms package. Let's hope
+the next version will have a richer demo (You want to contribute ?).
+#NOTIMPL
+Sorry this functionality of the demo is not implemented at the moment.
+Remember this is a freeware project, so I can use only my very rare
+free time to continue coding. If you would like to contribute, you
+are very welcome !
+#CURSES00
+This is a menu where you can select some different demos of the ncurses
+functionality.
+#CURSES-PAD00
+Please note that this demo is far from being complete. It really shows
+only a small part of the functionality of the curses package. Let's hope
+the next version will have a richer demo (You want to contribute ?).
+#MOUSEKEYS
+In this demo you may use this keys:
+
+   - Key labeled "Help"  to get a help
+   - Key labeled "Keys"  is what you are reading now
+   - Key labeled "Quit"  to leave the demo
+
+You may click the mouse buttons at any location at the screen and look
+at the protocol window !
+#MOUSE00
+A rather simple use of a mouse as demo. It is there just to test the
+code and to provide the sample source.
+
+It might be of interest, that the output into the protocol window is
+done by the (n)curses Text_IO subpackages. Especially the output of
+the button and state names is done by Ads's enumeration IO, which
+allows you to print the names of enumeration literals. That's really
+nice.
+#MOUSE-PAD00
+This is a very simple demo of the mouse features of ncurses. It is there
+just to test whether or not the generated code for the binding really
+works on the different architectures (seems so).
+#ATTRIBDEMO
+Again this is a more than simple demo and just here to give you the
+sourcecode.
+#ATTRIBKEYS
+You may press one of the three well known standard keys of this demo.
+#ATTRIB-PAD00
+Again this is a more than simple demo and just here to give you the
+source code. Feel free to contribute more.
+#TEXTIO
+#TEXTIOKEYS
+#TEXTIO-PAD00
+#END
diff --git a/Ada95/samples/ncurses.adb b/Ada95/samples/ncurses.adb
new file mode 100644
index 0000000..39ba7dc
--- /dev/null
+++ b/Ada95/samples/ncurses.adb
@@ -0,0 +1,48 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                 ncurses                                  --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000 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.                                                           --
+------------------------------------------------------------------------------
+--  Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
+--  Version Control
+--  $Revision: 1.2 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with ncurses2.m; use ncurses2.m;
+with GNAT.OS_Lib; use GNAT.OS_Lib;
+
+procedure ncurses is
+begin
+   OS_Exit (main);
+end ncurses;
diff --git a/Ada95/samples/ncurses2-acs_and_scroll.adb b/Ada95/samples/ncurses2-acs_and_scroll.adb
new file mode 100644
index 0000000..7bb492c
--- /dev/null
+++ b/Ada95/samples/ncurses2-acs_and_scroll.adb
@@ -0,0 +1,712 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                 ncurses                                  --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2018,2020 Thomas E. Dickey                                     --
+-- Copyright 2000-2009,2011 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.                                                           --
+------------------------------------------------------------------------------
+--  Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
+--  Version Control
+--  $Revision: 1.13 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+--  Windows and scrolling tester.
+--  Demonstrate windows
+
+with Ada.Strings.Fixed;
+with Ada.Strings;
+
+with ncurses2.util; use ncurses2.util;
+with ncurses2.genericPuts;
+with Terminal_Interface.Curses; use Terminal_Interface.Curses;
+with Terminal_Interface.Curses.Mouse; use Terminal_Interface.Curses.Mouse;
+with Terminal_Interface.Curses.PutWin; use Terminal_Interface.Curses.PutWin;
+
+with Ada.Streams.Stream_IO; use Ada.Streams.Stream_IO;
+with Ada.Streams; use Ada.Streams;
+
+procedure ncurses2.acs_and_scroll is
+
+   Macro_Quit   : constant Key_Code := Character'Pos ('Q') mod 16#20#;
+   Macro_Escape : constant Key_Code := Character'Pos ('[') mod 16#20#;
+
+   Quit : constant Key_Code := CTRL ('Q');
+   Escape : constant Key_Code := CTRL ('[');
+
+   Botlines : constant Line_Position := 4;
+
+   type pair is record
+      y : Line_Position;
+      x : Column_Position;
+   end record;
+
+   type Frame;
+   type FrameA is access Frame;
+
+   f : File_Type;
+   dumpfile : constant String := "screendump";
+
+   procedure Outerbox (ul, lr : pair; onoff : Boolean);
+   function  HaveKeyPad (w : Window) return Boolean;
+   function  HaveScroll (w : Window) return Boolean;
+   procedure newwin_legend (curpw : Window);
+   procedure transient (curpw : Window; msg : String);
+   procedure newwin_report (win : Window := Standard_Window);
+   procedure selectcell (uli : Line_Position;
+                         ulj : Column_Position;
+                         lri : Line_Position;
+                         lrj : Column_Position;
+                         p   : out pair;
+                         b   : out Boolean);
+   function  getwindow return Window;
+   procedure newwin_move (win : Window;
+                          dy  : Line_Position;
+                          dx  : Column_Position);
+   function delete_framed (fp : FrameA; showit : Boolean) return FrameA;
+
+   --  A linked list
+   --  I  wish there was a standard library linked list. Oh well.
+   type Frame is record
+      next, last : FrameA;
+      do_scroll : Boolean;
+      do_keypad : Boolean;
+      wind : Window;
+   end record;
+
+   current : FrameA;
+
+   c : Key_Code;
+
+   procedure Outerbox (ul, lr : pair; onoff : Boolean) is
+   begin
+      if onoff then
+         --  Note the fix of an obscure bug
+         --  try making a 1x1 box then enlarging it, the is a blank
+         --  upper left corner!
+         Add (Line => ul.y - 1, Column => ul.x - 1,
+             Ch => ACS_Map (ACS_Upper_Left_Corner));
+         Add (Line => ul.y - 1, Column => lr.x + 1,
+             Ch => ACS_Map (ACS_Upper_Right_Corner));
+         Add (Line => lr.y + 1, Column => lr.x + 1,
+             Ch => ACS_Map (ACS_Lower_Right_Corner));
+         Add (Line => lr.y + 1, Column => ul.x - 1,
+             Ch => ACS_Map (ACS_Lower_Left_Corner));
+
+         Move_Cursor (Line => ul.y - 1, Column => ul.x);
+         Horizontal_Line (Line_Symbol => ACS_Map (ACS_Horizontal_Line),
+                          Line_Size => Integer (lr.x - ul.x) + 1);
+         Move_Cursor (Line => ul.y, Column => ul.x - 1);
+         Vertical_Line (Line_Symbol => ACS_Map (ACS_Vertical_Line),
+                        Line_Size => Integer (lr.y - ul.y) + 1);
+         Move_Cursor (Line => lr.y + 1, Column => ul.x);
+         Horizontal_Line (Line_Symbol => ACS_Map (ACS_Horizontal_Line),
+                          Line_Size => Integer (lr.x - ul.x) + 1);
+         Move_Cursor (Line => ul.y, Column => lr.x + 1);
+         Vertical_Line (Line_Symbol => ACS_Map (ACS_Vertical_Line),
+                        Line_Size => Integer (lr.y - ul.y) + 1);
+      else
+         Add (Line => ul.y - 1, Column => ul.x - 1, Ch => ' ');
+         Add (Line => ul.y - 1, Column => lr.x + 1, Ch => ' ');
+         Add (Line => lr.y + 1, Column => lr.x + 1, Ch => ' ');
+         Add (Line => lr.y + 1, Column => ul.x - 1, Ch => ' ');
+
+         Move_Cursor (Line => ul.y - 1, Column => ul.x);
+         Horizontal_Line (Line_Symbol => Blank2,
+                          Line_Size => Integer (lr.x - ul.x) + 1);
+         Move_Cursor (Line => ul.y, Column => ul.x - 1);
+         Vertical_Line (Line_Symbol => Blank2,
+                        Line_Size => Integer (lr.y - ul.y) + 1);
+         Move_Cursor (Line => lr.y + 1, Column => ul.x);
+         Horizontal_Line (Line_Symbol => Blank2,
+                          Line_Size => Integer (lr.x - ul.x) + 1);
+         Move_Cursor (Line => ul.y, Column => lr.x + 1);
+         Vertical_Line (Line_Symbol => Blank2,
+                        Line_Size => Integer (lr.y - ul.y) + 1);
+      end if;
+   end Outerbox;
+
+   function HaveKeyPad (w : Window) return Boolean is
+   begin
+      return Get_KeyPad_Mode (w);
+   exception
+      when Curses_Exception => return False;
+   end HaveKeyPad;
+
+   function HaveScroll (w : Window) return Boolean is
+   begin
+      return Scrolling_Allowed (w);
+   exception
+      when Curses_Exception => return False;
+   end HaveScroll;
+
+   procedure newwin_legend (curpw : Window) is
+
+      package p is new genericPuts (200);
+      use p;
+      use p.BS;
+
+      type string_a is access String;
+
+      type rrr is record
+         msg : string_a;
+         code : Integer range 0 .. 3;
+      end record;
+
+      legend : constant array (Positive range <>) of rrr :=
+        (
+         (
+          new String'("^C = create window"), 0
+          ),
+         (
+          new String'("^N = next window"), 0
+          ),
+         (
+          new String'("^P = previous window"), 0
+          ),
+         (
+          new String'("^F = scroll forward"), 0
+          ),
+         (
+          new String'("^B = scroll backward"), 0
+          ),
+         (
+          new String'("^K = keypad(%s)"), 1
+          ),
+         (
+          new String'("^S = scrollok(%s)"), 2
+          ),
+         (
+          new String'("^W = save window to file"), 0
+          ),
+         (
+          new String'("^R = restore window"), 0
+          ),
+         (
+          new String'("^X = resize"), 0
+          ),
+         (
+          new String'("^Q%s = exit"), 3
+          )
+         );
+
+      buf : Bounded_String;
+      do_keypad : constant Boolean := HaveKeyPad (curpw);
+      do_scroll : constant Boolean := HaveScroll (curpw);
+
+      pos : Natural;
+
+      mypair : pair;
+
+   begin
+      Move_Cursor (Line => Lines - 4, Column => 0);
+      for n in legend'Range loop
+         pos := Ada.Strings.Fixed.Index (Source => legend (n).msg.all,
+                                         Pattern => "%s");
+         buf := To_Bounded_String (legend (n).msg.all);
+         case legend (n).code is
+            when 0 => null;
+            when 1 =>
+               if do_keypad then
+                  Replace_Slice (buf, pos, pos + 1, "yes");
+               else
+                  Replace_Slice (buf, pos, pos + 1, "no");
+               end if;
+            when 2 =>
+               if do_scroll then
+                  Replace_Slice (buf, pos, pos + 1, "yes");
+               else
+                  Replace_Slice (buf, pos, pos + 1, "no");
+               end if;
+            when 3 =>
+               if do_keypad then
+                  Replace_Slice (buf, pos, pos + 1, "/ESC");
+               else
+                  Replace_Slice (buf, pos, pos + 1, "");
+               end if;
+         end case;
+         Get_Cursor_Position (Line => mypair.y, Column => mypair.x);
+         if Columns < mypair.x + 3 + Column_Position (Length (buf)) then
+            Add (Ch => newl);
+         elsif n /= 1 then -- n /= legen'First
+            Add (Str => ", ");
+         end if;
+         myAdd (Str => buf);
+      end loop;
+      Clear_To_End_Of_Line;
+   end newwin_legend;
+
+   procedure transient (curpw : Window; msg : String) is
+   begin
+      newwin_legend (curpw);
+      if msg /= "" then
+         Add (Line => Lines - 1, Column => 0, Str => msg);
+         Refresh;
+         Nap_Milli_Seconds (1000);
+      end if;
+
+      Move_Cursor (Line => Lines - 1, Column => 0);
+
+      if HaveKeyPad (curpw) then
+         Add (Str => "Non-arrow");
+      else
+         Add (Str => "All other");
+      end if;
+      Add (Str => " characters are echoed, window should ");
+      if not HaveScroll (curpw) then
+         Add (Str => "not ");
+      end if;
+      Add (Str => "scroll");
+
+      Clear_To_End_Of_Line;
+   end transient;
+
+   procedure newwin_report (win : Window := Standard_Window) is
+      y : Line_Position;
+      x : Column_Position;
+      use Int_IO;
+      tmp2a : String (1 .. 2);
+      tmp2b : String (1 .. 2);
+   begin
+      if win /= Standard_Window then
+         transient (win, "");
+      end if;
+      Get_Cursor_Position (win, y, x);
+      Move_Cursor (Line => Lines - 1, Column => Columns - 17);
+      Put (tmp2a, Integer (y));
+      Put (tmp2b, Integer (x));
+      Add (Str => "Y = " & tmp2a & " X = " & tmp2b);
+      if win /= Standard_Window then
+         Refresh;
+      else
+         Move_Cursor (win, y, x);
+      end if;
+   end newwin_report;
+
+   procedure selectcell (uli : Line_Position;
+                         ulj : Column_Position;
+                         lri : Line_Position;
+                         lrj : Column_Position;
+                         p   : out pair;
+                         b   : out Boolean) is
+      c : Key_Code;
+      res : pair;
+      i : Line_Position := 0;
+      j : Column_Position := 0;
+      si : constant Line_Position := lri - uli + 1;
+      sj : constant Column_Position := lrj - ulj + 1;
+   begin
+      res.y := uli;
+      res.x := ulj;
+      loop
+         Move_Cursor (Line => uli + i, Column => ulj + j);
+         newwin_report;
+
+         c := Getchar;
+         case c is
+            when
+              Macro_Quit   |
+              Macro_Escape =>
+               --  on the same line macro calls interfere due to the # comment
+               --  this is needed because keypad off affects all windows.
+               --  try removing the ESCAPE and see what happens.
+               b := False;
+               return;
+            when KEY_UP =>
+               i := i + si - 1;
+               --  same as  i := i - 1 because of Modulus arithmetic,
+               --  on Line_Position, which is a Natural
+               --  the C version uses this form too, interestingly.
+            when KEY_DOWN =>
+               i := i + 1;
+            when KEY_LEFT =>
+               j := j + sj - 1;
+            when KEY_RIGHT =>
+               j := j + 1;
+            when Key_Mouse =>
+               declare
+                  event : Mouse_Event;
+                  y : Line_Position;
+                  x : Column_Position;
+                  Button : Mouse_Button;
+                  State : Button_State;
+
+               begin
+                  event := Get_Mouse;
+                  Get_Event (Event => event,
+                             Y => y,
+                             X => x,
+                             Button => Button,
+                             State  => State);
+                  if y > uli and x > ulj then
+                     i := y - uli;
+                     j := x - ulj;
+                     --  same as when others =>
+                     res.y := uli + i;
+                     res.x := ulj + j;
+                     p := res;
+                     b := True;
+                     return;
+                  else
+                     Beep;
+                  end if;
+               end;
+            when others =>
+               res.y := uli + i;
+               res.x := ulj + j;
+               p := res;
+               b := True;
+               return;
+         end case;
+         i := i mod si;
+         j := j mod sj;
+      end loop;
+   end selectcell;
+
+   function getwindow return Window is
+      rwindow : Window;
+      ul, lr : pair;
+      result : Boolean;
+   begin
+      Move_Cursor (Line => 0, Column => 0);
+      Clear_To_End_Of_Line;
+      Add (Str => "Use arrows to move cursor, anything else to mark corner 1");
+      Refresh;
+      selectcell (2, 1, Lines - Botlines - 2, Columns - 2, ul, result);
+      if not result then
+         return Null_Window;
+      end if;
+      Add (Line => ul.y - 1, Column => ul.x - 1,
+           Ch => ACS_Map (ACS_Upper_Left_Corner));
+      Move_Cursor (Line => 0, Column => 0);
+      Clear_To_End_Of_Line;
+      Add (Str => "Use arrows to move cursor, anything else to mark corner 2");
+      Refresh;
+      selectcell (ul.y, ul.x, Lines - Botlines - 2, Columns - 2, lr, result);
+      if not result then
+         return Null_Window;
+      end if;
+
+      rwindow := Sub_Window (Number_Of_Lines => lr.y - ul.y + 1,
+                             Number_Of_Columns => lr.x - ul.x + 1,
+                             First_Line_Position => ul.y,
+                             First_Column_Position => ul.x);
+
+      Outerbox (ul, lr, True);
+      Refresh;
+
+      Refresh (rwindow);
+
+      Move_Cursor (Line => 0, Column => 0);
+      Clear_To_End_Of_Line;
+      return rwindow;
+   end getwindow;
+
+   procedure newwin_move (win : Window;
+                          dy  : Line_Position;
+                          dx  : Column_Position) is
+      cur_y, max_y : Line_Position;
+      cur_x, max_x : Column_Position;
+   begin
+      Get_Cursor_Position (win, cur_y, cur_x);
+      Get_Size (win, max_y, max_x);
+      cur_x := Column_Position'Min (Column_Position'Max (cur_x + dx, 0),
+                                    max_x - 1);
+      cur_y := Line_Position'Min (Line_Position'Max (cur_y + dy, 0),
+                                  max_y - 1);
+
+      Move_Cursor (win, Line => cur_y, Column => cur_x);
+   end newwin_move;
+
+   function delete_framed (fp : FrameA; showit : Boolean) return FrameA is
+      np : FrameA;
+   begin
+      fp.all.last.all.next := fp.all.next;
+      fp.all.next.all.last := fp.all.last;
+
+      if showit then
+         Erase (fp.all.wind);
+         Refresh (fp.all.wind);
+      end if;
+      Delete (fp.all.wind);
+
+      if fp = fp.all.next then
+         np := null;
+      else
+         np := fp.all.next;
+      end if;
+      --  TODO free(fp);
+      return np;
+   end delete_framed;
+
+   Mask : Event_Mask := No_Events;
+   Mask2 : Event_Mask;
+
+   usescr : Window;
+
+begin
+   if Has_Mouse then
+      Register_Reportable_Event (
+                                 Button => Left,
+                                 State => Clicked,
+                                 Mask => Mask);
+      Mask2 := Start_Mouse (Mask);
+   end if;
+   c := CTRL ('C');
+   Set_Raw_Mode (SwitchOn => True);
+   loop
+      transient (Standard_Window, "");
+      case c is
+         when Character'Pos ('c') mod 16#20# => --  Ctrl('c')
+            declare
+               neww : constant FrameA := new Frame'(null, null,
+                                                    False, False,
+                                                    Null_Window);
+            begin
+               neww.all.wind := getwindow;
+               if neww.all.wind = Null_Window  then
+                  exit;
+                  --  was goto breakout; ha ha ha
+               else
+
+                  if current = null  then
+                     neww.all.next := neww;
+                     neww.all.last := neww;
+                  else
+                     neww.all.next := current.all.next;
+                     neww.all.last := current;
+                     neww.all.last.all.next := neww;
+                     neww.all.next.all.last := neww;
+                  end if;
+                  current := neww;
+
+                  Set_KeyPad_Mode (current.all.wind, True);
+                  current.all.do_keypad := HaveKeyPad (current.all.wind);
+                  current.all.do_scroll := HaveScroll (current.all.wind);
+               end if;
+            end;
+         when Character'Pos ('N') mod 16#20#  => --  Ctrl('N')
+            if current /= null then
+               current := current.all.next;
+            end if;
+         when Character'Pos ('P') mod 16#20#  => --  Ctrl('P')
+            if current /= null then
+               current := current.all.last;
+            end if;
+         when Character'Pos ('F') mod 16#20#  => --  Ctrl('F')
+            if current /= null and then HaveScroll (current.all.wind) then
+               Scroll (current.all.wind, 1);
+            end if;
+         when Character'Pos ('B') mod 16#20#  => --  Ctrl('B')
+            if current /= null and then HaveScroll (current.all.wind) then
+            --  The C version of Scroll may return ERR which is ignored
+            --  we need to avoid the exception
+            --  with the 'and HaveScroll(current.wind)'
+               Scroll (current.all.wind, -1);
+            end if;
+         when Character'Pos ('K') mod 16#20#  => --  Ctrl('K')
+            if current /= null then
+               current.all.do_keypad := not current.all.do_keypad;
+               Set_KeyPad_Mode (current.all.wind, current.all.do_keypad);
+            end if;
+         when Character'Pos ('S') mod 16#20#  => --  Ctrl('S')
+            if current /= null then
+               current.all.do_scroll := not current.all.do_scroll;
+               Allow_Scrolling (current.all.wind, current.all.do_scroll);
+            end if;
+         when Character'Pos ('W') mod 16#20#  => --  Ctrl('W')
+            if current /= current.all.next then
+               Create (f, Name => dumpfile); -- TODO error checking
+               if not Is_Open (f) then
+                  raise Curses_Exception;
+               end if;
+               Put_Window (current.all.wind, f);
+               Close (f);
+               current := delete_framed (current, True);
+            end if;
+         when Character'Pos ('R') mod 16#20#  => --  Ctrl('R')
+            declare
+               neww : FrameA := new Frame'(null, null, False, False,
+                                           Null_Window);
+            begin
+               Open (f, Mode => In_File, Name => dumpfile);
+               neww := new Frame'(null, null, False, False, Null_Window);
+
+               neww.all.next := current.all.next;
+               neww.all.last := current;
+               neww.all.last.all.next := neww;
+               neww.all.next.all.last := neww;
+
+               neww.all.wind := Get_Window (f);
+               Close (f);
+
+               Refresh (neww.all.wind);
+            end;
+         when Character'Pos ('X') mod 16#20# => --  Ctrl('X')
+            if current /= null then
+               declare
+                  tmp, ul, lr : pair;
+                  mx : Column_Position;
+                  my : Line_Position;
+                  tmpbool : Boolean;
+               begin
+                  Move_Cursor (Line => 0, Column => 0);
+                  Clear_To_End_Of_Line;
+                  Add (Str => "Use arrows to move cursor, anything else " &
+                       "to mark new corner");
+                  Refresh;
+
+                  Get_Window_Position (current.all.wind, ul.y, ul.x);
+
+                  selectcell (ul.y, ul.x, Lines - Botlines - 2, Columns - 2,
+                              tmp, tmpbool);
+                  if not tmpbool then
+                     --  the C version had a goto. I refuse gotos.
+                     Beep;
+                  else
+                     Get_Size (current.all.wind, lr.y, lr.x);
+                     lr.y := lr.y + ul.y - 1;
+                     lr.x := lr.x + ul.x - 1;
+                     Outerbox (ul, lr, False);
+                     Refresh_Without_Update;
+
+                     Get_Size (current.all.wind, my, mx);
+                     if my > tmp.y - ul.y then
+                        Get_Cursor_Position (current.all.wind, lr.y, lr.x);
+                        Move_Cursor (current.all.wind, tmp.y - ul.y + 1, 0);
+                        Clear_To_End_Of_Screen (current.all.wind);
+                        Move_Cursor (current.all.wind, lr.y, lr.x);
+                     end if;
+                     if mx > tmp.x - ul.x then
+                        for i in 0 .. my - 1 loop
+                           Move_Cursor (current.all.wind, i, tmp.x - ul.x + 1);
+                           Clear_To_End_Of_Line (current.all.wind);
+                        end loop;
+                     end if;
+                     Refresh_Without_Update (current.all.wind);
+
+                     lr := tmp;
+                     --  The C version passes invalid args to resize
+                     --  which returns an ERR. For Ada we avoid the exception.
+                     if lr.y /= ul.y and lr.x /= ul.x then
+                        Resize (current.all.wind, lr.y - ul.y + 0,
+                                lr.x - ul.x + 0);
+                     end if;
+
+                     Get_Window_Position (current.all.wind, ul.y, ul.x);
+                     Get_Size (current.all.wind, lr.y, lr.x);
+                     lr.y := lr.y + ul.y - 1;
+                     lr.x := lr.x + ul.x - 1;
+                     Outerbox (ul, lr, True);
+                     Refresh_Without_Update;
+
+                     Refresh_Without_Update (current.all.wind);
+                     Move_Cursor (Line => 0, Column => 0);
+                     Clear_To_End_Of_Line;
+                     Update_Screen;
+                  end if;
+               end;
+            end if;
+         when Key_F10  =>
+            declare tmp : pair; tmpbool : Boolean;
+            begin
+               --  undocumented --- use this to test area clears
+               selectcell (0, 0, Lines - 1, Columns - 1, tmp, tmpbool);
+               Clear_To_End_Of_Screen;
+               Refresh;
+            end;
+         when Key_Cursor_Up =>
+            newwin_move (current.all.wind, -1, 0);
+         when Key_Cursor_Down  =>
+            newwin_move (current.all.wind, 1, 0);
+         when Key_Cursor_Left  =>
+            newwin_move (current.all.wind, 0, -1);
+         when Key_Cursor_Right  =>
+            newwin_move (current.all.wind, 0, 1);
+         when Key_Backspace | Key_Delete_Char  =>
+            declare
+               y : Line_Position;
+               x : Column_Position;
+               tmp : Line_Position;
+            begin
+               Get_Cursor_Position (current.all.wind, y, x);
+               --  x := x - 1;
+               --  I got tricked by the -1 = Max_Natural - 1 result
+               --  y := y - 1;
+               if not (x = 0 and y = 0) then
+                  if x = 0 then
+                     y := y - 1;
+                     Get_Size (current.all.wind, tmp, x);
+                  end if;
+                  x := x - 1;
+                  Delete_Character (current.all.wind, y, x);
+               end if;
+            end;
+         when others =>
+            --  TODO c = '\r' ?
+            if current /= null then
+               declare
+               begin
+                  Add (current.all.wind, Ch => Code_To_Char (c));
+               exception
+                  when Curses_Exception => null;
+                     --  this happens if we are at the
+                     --  lower right of a window and add a character.
+               end;
+            else
+               Beep;
+            end if;
+      end case;
+      newwin_report (current.all.wind);
+      if current /= null then
+         usescr := current.all.wind;
+      else
+         usescr := Standard_Window;
+      end if;
+      Refresh (usescr);
+      c := Getchar (usescr);
+      exit when c = Quit or (c = Escape and HaveKeyPad (usescr));
+      --  TODO when does c = ERR happen?
+   end loop;
+
+   --  TODO while current /= null loop
+   --  current := delete_framed(current, False);
+   --  end loop;
+
+   Allow_Scrolling (Mode => True);
+
+   End_Mouse (Mask2);
+   Set_Raw_Mode (SwitchOn => True);
+   Erase;
+   End_Windows;
+
+end ncurses2.acs_and_scroll;
diff --git a/Ada95/samples/ncurses2-acs_and_scroll.ads b/Ada95/samples/ncurses2-acs_and_scroll.ads
new file mode 100644
index 0000000..bd2759a
--- /dev/null
+++ b/Ada95/samples/ncurses2-acs_and_scroll.ads
@@ -0,0 +1,42 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                 ncurses                                  --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000 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.                                                           --
+------------------------------------------------------------------------------
+--  Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
+--  Version Control
+--  $Revision: 1.2 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+procedure ncurses2.acs_and_scroll;
diff --git a/Ada95/samples/ncurses2-acs_display.adb b/Ada95/samples/ncurses2-acs_display.adb
new file mode 100644
index 0000000..2916e15
--- /dev/null
+++ b/Ada95/samples/ncurses2-acs_display.adb
@@ -0,0 +1,236 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                 ncurses                                  --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000-2006,2008 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.                                                           --
+------------------------------------------------------------------------------
+--  Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
+--  Version Control
+--  $Revision: 1.7 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with ncurses2.util; use ncurses2.util;
+with ncurses2.genericPuts;
+with Terminal_Interface.Curses; use Terminal_Interface.Curses;
+
+with Ada.Strings.Unbounded;
+with Ada.Strings.Fixed;
+
+procedure ncurses2.acs_display is
+   use Int_IO;
+
+   procedure show_upper_chars (first : Integer);
+   function  show_1_acs (N    : Integer;
+                         name : String;
+                         code :  Attributed_Character)
+                        return Integer;
+   procedure show_acs_chars;
+
+   procedure show_upper_chars (first : Integer)  is
+      C1 : constant Boolean := (first = 128);
+      last : constant Integer := first + 31;
+      package p is new ncurses2.genericPuts (200);
+      use p;
+      use p.BS;
+      use Ada.Strings.Unbounded;
+
+      tmpa : Unbounded_String;
+      tmpb : BS.Bounded_String;
+   begin
+      Erase;
+      Switch_Character_Attribute
+        (Attr => (Bold_Character => True, others => False));
+      Move_Cursor (Line => 0, Column => 20);
+      tmpa := To_Unbounded_String ("Display of ");
+      if C1 then
+         tmpa := tmpa & "C1";
+      else
+         tmpa := tmpa & "GR";
+      end if;
+      tmpa := tmpa & " Character Codes ";
+      myPut (tmpb, first);
+      Append (tmpa, To_String (tmpb));
+      Append (tmpa, " to ");
+      myPut (tmpb, last);
+      Append (tmpa, To_String (tmpb));
+      Add (Str => To_String (tmpa));
+      Switch_Character_Attribute
+        (On => False,
+         Attr => (Bold_Character => True, others => False));
+      Refresh;
+
+      for code in first .. last loop
+         declare
+            row : constant Line_Position
+                := Line_Position (4 + ((code - first) mod 16));
+            col : constant Column_Position
+                := Column_Position (((code - first) / 16) *
+                                    Integer (Columns) / 2);
+            tmp3 : String (1 .. 3);
+            tmpx : String (1 .. Integer (Columns / 4));
+            reply : Key_Code;
+         begin
+            Put (tmp3, code);
+            myPut (tmpb, code, 16);
+            tmpa := To_Unbounded_String (tmp3 & " (" & To_String (tmpb) & ')');
+
+            Ada.Strings.Fixed.Move (To_String (tmpa), tmpx,
+                                    Justify => Ada.Strings.Right);
+            Add (Line => row, Column => col,
+                 Str => tmpx & ' ' & ':' & ' ');
+            if C1 then
+               Set_NoDelay_Mode (Mode => True);
+            end if;
+            Add_With_Immediate_Echo (Ch => Code_To_Char (Key_Code (code)));
+            --  TODO check this
+            if C1 then
+               reply := Getchar;
+               while reply /= Key_None loop
+                  Add (Ch => Code_To_Char (reply));
+                  Nap_Milli_Seconds (10);
+                  reply := Getchar;
+               end loop;
+               Set_NoDelay_Mode (Mode => False);
+            end if;
+         end;
+      end loop;
+   end show_upper_chars;
+
+   function show_1_acs (N    : Integer;
+                        name : String;
+                        code :  Attributed_Character)
+                       return Integer is
+      height : constant Integer := 16;
+      row : constant Line_Position := Line_Position (4 + (N mod height));
+      col : constant Column_Position := Column_Position ((N / height) *
+                                                Integer (Columns) / 2);
+      tmpx : String (1 .. Integer (Columns) / 3);
+   begin
+      Ada.Strings.Fixed.Move (name, tmpx,
+                              Justify => Ada.Strings.Right,
+                              Drop => Ada.Strings.Left);
+      Add (Line => row, Column => col, Str => tmpx & ' ' & ':' & ' ');
+      --  we need more room than C because our identifiers are longer
+      --  22 chars actually
+      Add (Ch => code);
+      return N + 1;
+   end show_1_acs;
+
+   procedure show_acs_chars is
+      n : Integer;
+   begin
+      Erase;
+      Switch_Character_Attribute
+        (Attr => (Bold_Character => True, others => False));
+      Add (Line => 0, Column => 20,
+           Str => "Display of the ACS Character Set");
+      Switch_Character_Attribute (On => False,
+                                  Attr => (Bold_Character => True,
+                                           others => False));
+      Refresh;
+
+      --  the following is useful to generate the below
+      --  grep '^[ ]*ACS_' ../src/terminal_interface-curses.ads |
+      --  awk '{print  "n := show_1_acs(n, \""$1"\", ACS_Map("$1"));"}'
+
+      n := show_1_acs (0, "ACS_Upper_Left_Corner",
+                       ACS_Map (ACS_Upper_Left_Corner));
+      n := show_1_acs (n, "ACS_Lower_Left_Corner",
+                       ACS_Map (ACS_Lower_Left_Corner));
+      n := show_1_acs (n, "ACS_Upper_Right_Corner",
+                       ACS_Map (ACS_Upper_Right_Corner));
+      n := show_1_acs (n, "ACS_Lower_Right_Corner",
+                       ACS_Map (ACS_Lower_Right_Corner));
+      n := show_1_acs (n, "ACS_Left_Tee", ACS_Map (ACS_Left_Tee));
+      n := show_1_acs (n, "ACS_Right_Tee", ACS_Map (ACS_Right_Tee));
+      n := show_1_acs (n, "ACS_Bottom_Tee", ACS_Map (ACS_Bottom_Tee));
+      n := show_1_acs (n, "ACS_Top_Tee", ACS_Map (ACS_Top_Tee));
+      n := show_1_acs (n, "ACS_Horizontal_Line",
+                       ACS_Map (ACS_Horizontal_Line));
+      n := show_1_acs (n, "ACS_Vertical_Line", ACS_Map (ACS_Vertical_Line));
+      n := show_1_acs (n, "ACS_Plus_Symbol", ACS_Map (ACS_Plus_Symbol));
+      n := show_1_acs (n, "ACS_Scan_Line_1", ACS_Map (ACS_Scan_Line_1));
+      n := show_1_acs (n, "ACS_Scan_Line_9", ACS_Map (ACS_Scan_Line_9));
+      n := show_1_acs (n, "ACS_Diamond", ACS_Map (ACS_Diamond));
+      n := show_1_acs (n, "ACS_Checker_Board", ACS_Map (ACS_Checker_Board));
+      n := show_1_acs (n, "ACS_Degree", ACS_Map (ACS_Degree));
+      n := show_1_acs (n, "ACS_Plus_Minus", ACS_Map (ACS_Plus_Minus));
+      n := show_1_acs (n, "ACS_Bullet", ACS_Map (ACS_Bullet));
+      n := show_1_acs (n, "ACS_Left_Arrow", ACS_Map (ACS_Left_Arrow));
+      n := show_1_acs (n, "ACS_Right_Arrow", ACS_Map (ACS_Right_Arrow));
+      n := show_1_acs (n, "ACS_Down_Arrow", ACS_Map (ACS_Down_Arrow));
+      n := show_1_acs (n, "ACS_Up_Arrow", ACS_Map (ACS_Up_Arrow));
+      n := show_1_acs (n, "ACS_Board_Of_Squares",
+                       ACS_Map (ACS_Board_Of_Squares));
+      n := show_1_acs (n, "ACS_Lantern", ACS_Map (ACS_Lantern));
+      n := show_1_acs (n, "ACS_Solid_Block", ACS_Map (ACS_Solid_Block));
+      n := show_1_acs (n, "ACS_Scan_Line_3", ACS_Map (ACS_Scan_Line_3));
+      n := show_1_acs (n, "ACS_Scan_Line_7", ACS_Map (ACS_Scan_Line_7));
+      n := show_1_acs (n, "ACS_Less_Or_Equal", ACS_Map (ACS_Less_Or_Equal));
+      n := show_1_acs (n, "ACS_Greater_Or_Equal",
+                       ACS_Map (ACS_Greater_Or_Equal));
+      n := show_1_acs (n, "ACS_PI", ACS_Map (ACS_PI));
+      n := show_1_acs (n, "ACS_Not_Equal", ACS_Map (ACS_Not_Equal));
+      n := show_1_acs (n, "ACS_Sterling", ACS_Map (ACS_Sterling));
+
+      if n = 0 then
+         raise Constraint_Error;
+      end if;
+   end show_acs_chars;
+
+   c1 : Key_Code;
+   c : Character := 'a';
+begin
+   loop
+      case c is
+         when 'a' =>
+            show_acs_chars;
+         when '0' | '1' | '2' | '3' =>
+            show_upper_chars (ctoi (c) * 32 + 128);
+         when others =>
+            null;
+      end case;
+      Add (Line => Lines - 3, Column => 0,
+           Str => "Note: ANSI terminals may not display C1 characters.");
+      Add (Line => Lines - 2, Column => 0,
+           Str => "Select: a=ACS, 0=C1, 1,2,3=GR characters, q=quit");
+      Refresh;
+      c1 := Getchar;
+      c := Code_To_Char (c1);
+      exit when c = 'q' or c = 'x';
+   end loop;
+   Pause;
+   Erase;
+   End_Windows;
+end ncurses2.acs_display;
diff --git a/Ada95/samples/ncurses2-acs_display.ads b/Ada95/samples/ncurses2-acs_display.ads
new file mode 100644
index 0000000..d685e58
--- /dev/null
+++ b/Ada95/samples/ncurses2-acs_display.ads
@@ -0,0 +1,42 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                 ncurses                                  --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000 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.                                                           --
+------------------------------------------------------------------------------
+--  Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
+--  Version Control
+--  $Revision: 1.2 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+procedure ncurses2.acs_display;
diff --git a/Ada95/samples/ncurses2-attr_test.adb b/Ada95/samples/ncurses2-attr_test.adb
new file mode 100644
index 0000000..b41cc80
--- /dev/null
+++ b/Ada95/samples/ncurses2-attr_test.adb
@@ -0,0 +1,363 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                 ncurses                                  --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000-2007,2008 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.                                                           --
+------------------------------------------------------------------------------
+--  Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
+--  Version Control
+--  $Revision: 1.10 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with ncurses2.util; use ncurses2.util;
+with Terminal_Interface.Curses; use Terminal_Interface.Curses;
+with Terminal_Interface.Curses.Terminfo;
+use Terminal_Interface.Curses.Terminfo;
+with Ada.Characters.Handling;
+with Ada.Strings.Fixed;
+
+procedure ncurses2.attr_test is
+
+   function  subset (super, sub : Character_Attribute_Set) return Boolean;
+   function  intersect (b, a : Character_Attribute_Set) return Boolean;
+   function  has_A_COLOR (attr : Attributed_Character) return Boolean;
+   function  show_attr (row  : Line_Position;
+                        skip : Natural;
+                        attr : Character_Attribute_Set;
+                        name : String;
+                        once : Boolean) return Line_Position;
+   procedure attr_getc (skip : in out Integer;
+                        fg, bg : in out Color_Number;
+                        result : out Boolean);
+
+   function subset (super, sub : Character_Attribute_Set) return Boolean is
+   begin
+      if
+        (super.Stand_Out or not sub.Stand_Out) and
+        (super.Under_Line or not sub.Under_Line) and
+        (super.Reverse_Video or not sub.Reverse_Video) and
+        (super.Blink or not sub.Blink) and
+        (super.Dim_Character or not sub.Dim_Character) and
+        (super.Bold_Character or not sub.Bold_Character) and
+        (super.Alternate_Character_Set or not sub.Alternate_Character_Set) and
+        (super.Invisible_Character or not sub.Invisible_Character) -- and
+--      (super.Protected_Character or not sub.Protected_Character) and
+--      (super.Horizontal or not sub.Horizontal) and
+--      (super.Left or not sub.Left) and
+--      (super.Low or not sub.Low) and
+--      (super.Right or not sub.Right) and
+--      (super.Top or not sub.Top) and
+--      (super.Vertical or not sub.Vertical)
+      then
+         return True;
+      else
+         return False;
+      end if;
+   end subset;
+
+   function intersect (b, a : Character_Attribute_Set) return Boolean is
+   begin
+      if
+        (a.Stand_Out and b.Stand_Out) or
+        (a.Under_Line and b.Under_Line) or
+        (a.Reverse_Video and b.Reverse_Video) or
+        (a.Blink and b.Blink) or
+        (a.Dim_Character and b.Dim_Character) or
+        (a.Bold_Character and b.Bold_Character) or
+        (a.Alternate_Character_Set and b.Alternate_Character_Set) or
+        (a.Invisible_Character and b.Invisible_Character) -- or
+--      (a.Protected_Character and b.Protected_Character) or
+--      (a.Horizontal and b.Horizontal) or
+--      (a.Left and b.Left) or
+--      (a.Low and b.Low) or
+--      (a.Right and b.Right) or
+--      (a.Top and b.Top) or
+--      (a.Vertical and b.Vertical)
+      then
+         return True;
+      else
+         return False;
+      end if;
+   end intersect;
+
+   function has_A_COLOR (attr : Attributed_Character) return Boolean is
+   begin
+      if attr.Color /= Color_Pair (0) then
+         return True;
+      else
+         return False;
+      end if;
+   end has_A_COLOR;
+
+   --  Print some text with attributes.
+   function show_attr (row  : Line_Position;
+                       skip : Natural;
+                       attr : Character_Attribute_Set;
+                       name : String;
+                       once : Boolean) return Line_Position is
+
+      function make_record (n : Integer) return Character_Attribute_Set;
+      function make_record (n : Integer) return Character_Attribute_Set is
+         --  unsupported means true
+         a : Character_Attribute_Set := (others => False);
+         m : Integer;
+         rest : Integer;
+      begin
+         --  ncv is a bitmap with these fields
+         --              A_STANDOUT,
+         --              A_UNDERLINE,
+         --              A_REVERSE,
+         --              A_BLINK,
+         --              A_DIM,
+         --              A_BOLD,
+         --              A_INVIS,
+         --              A_PROTECT,
+         --              A_ALTCHARSET
+         --  It means no_color_video,
+         --  video attributes that can't be used with colors
+         --  see man terminfo.5
+         m := n mod 2;
+         rest := n / 2;
+         if 1 = m then
+            a.Stand_Out := True;
+         end if;
+         m := rest mod 2;
+         rest := rest / 2;
+         if 1 = m then
+            a.Under_Line := True;
+         end if;
+         m := rest mod 2;
+         rest := rest / 2;
+         if 1 = m then
+            a.Reverse_Video := True;
+         end if;
+         m := rest mod 2;
+         rest := rest / 2;
+         if 1 = m then
+            a.Blink := True;
+         end if;
+         m := rest mod 2;
+         rest := rest / 2;
+         if 1 = m then
+            a.Bold_Character := True;
+         end if;
+         m := rest mod 2;
+         rest := rest / 2;
+         if 1 = m then
+            a.Invisible_Character := True;
+         end if;
+         m := rest mod 2;
+         rest := rest / 2;
+         if 1 = m then
+            a.Protected_Character := True;
+         end if;
+         m := rest mod 2;
+         rest := rest / 2;
+         if 1 = m then
+            a.Alternate_Character_Set := True;
+         end if;
+
+         return a;
+      end make_record;
+
+      ncv : constant Integer := Get_Number ("ncv");
+
+   begin
+      Move_Cursor (Line => row, Column => 8);
+      Add (Str => name & " mode:");
+      Move_Cursor (Line => row, Column => 24);
+      Add (Ch => '|');
+      if skip /= 0 then
+         --  printw("%*s", skip, " ")
+         Add (Str => Ada.Strings.Fixed."*" (skip, ' '));
+      end if;
+      if once then
+         Switch_Character_Attribute (Attr => attr);
+      else
+         Set_Character_Attributes (Attr => attr);
+      end if;
+      Add (Str => "abcde fghij klmno pqrst uvwxy z");
+      if once then
+         Switch_Character_Attribute (Attr => attr, On => False);
+      end if;
+      if skip /= 0 then
+         Add (Str => Ada.Strings.Fixed."*" (skip, ' '));
+      end if;
+      Add (Ch => '|');
+      if attr /= Normal_Video then
+         declare begin
+            if not subset (super => Supported_Attributes, sub => attr) then
+               Add (Str => " (N/A)");
+            elsif ncv > 0 and has_A_COLOR (Get_Background) then
+               declare
+                  Color_Supported_Attributes :
+                    constant Character_Attribute_Set := make_record (ncv);
+               begin
+                  if intersect (Color_Supported_Attributes, attr) then
+                     Add (Str => " (NCV) ");
+                  end if;
+               end;
+            end if;
+         end;
+      end if;
+      return row + 2;
+   end show_attr;
+
+   procedure attr_getc (skip : in out Integer;
+                        fg, bg : in out Color_Number;
+                        result : out Boolean) is
+      ch : constant Key_Code := Getchar;
+      nc : constant Color_Number := Color_Number (Number_Of_Colors);
+   begin
+      result := True;
+      if Ada.Characters.Handling.Is_Digit (Character'Val (ch)) then
+         skip := ctoi (Code_To_Char (ch));
+      elsif ch = CTRL ('L') then
+         Touch;
+         Touch (Current_Window);
+         Refresh;
+      elsif Has_Colors then
+         case ch is
+            --  Note the mathematical elegance compared to the C version.
+            when Character'Pos ('f') => fg := (fg + 1) mod nc;
+            when Character'Pos ('F') => fg := (fg - 1) mod nc;
+            when Character'Pos ('b') => bg := (bg + 1) mod nc;
+            when Character'Pos ('B') => bg := (bg - 1) mod nc;
+            when others =>
+               result := False;
+         end case;
+      else
+         result := False;
+      end if;
+   end attr_getc;
+
+   --      pairs could be defined as array ( Color_Number(0) .. colors - 1) of
+   --      array (Color_Number(0).. colors - 1) of Boolean;
+   pairs : array (Color_Pair'Range) of Boolean := (others => False);
+   fg, bg : Color_Number := Black; -- = 0;
+   xmc : constant Integer := Get_Number ("xmc");
+   skip : Integer := xmc;
+   n : Integer;
+
+   use Int_IO;
+
+begin
+   pairs (0) := True;
+
+   if skip < 0 then
+      skip := 0;
+   end if;
+   n := skip;
+
+   loop
+      declare
+         row : Line_Position := 2;
+         normal : Attributed_Character := Blank2;
+         --  ???
+      begin
+         --  row := 2; -- weird, row is set to 0 without this.
+         --  TODO delete the above line, it was a gdb quirk that confused me
+         if Has_Colors then
+            declare pair : constant Color_Pair :=
+              Color_Pair (fg * Color_Number (Number_Of_Colors) + bg);
+            begin
+               --  Go though each color pair. Assume that the number of
+               --  Redefinable_Color_Pairs is 8*8 with predefined Colors 0..7
+               if not pairs (pair) then
+                  Init_Pair (pair, fg, bg);
+                  pairs (pair) := True;
+               end if;
+               normal.Color := pair;
+            end;
+         end if;
+         Set_Background (Ch => normal);
+         Erase;
+
+         Add (Line => 0, Column => 20,
+              Str => "Character attribute test display");
+
+         row := show_attr (row, n, (Stand_Out => True, others => False),
+                           "STANDOUT", True);
+         row := show_attr (row, n, (Reverse_Video => True, others => False),
+                           "REVERSE", True);
+         row := show_attr (row, n, (Bold_Character => True, others => False),
+                           "BOLD", True);
+         row := show_attr (row, n, (Under_Line => True, others => False),
+                           "UNDERLINE", True);
+         row := show_attr (row, n, (Dim_Character => True, others => False),
+                           "DIM", True);
+         row := show_attr (row, n, (Blink => True, others => False),
+                           "BLINK", True);
+--       row := show_attr (row, n, (Protected_Character => True,
+--                                  others => False), "PROTECT", True);
+         row := show_attr (row, n, (Invisible_Character => True,
+                                    others => False), "INVISIBLE", True);
+         row := show_attr (row, n, Normal_Video, "NORMAL", False);
+
+         Move_Cursor (Line => row, Column => 8);
+         if xmc > -1 then
+            Add (Str => "This terminal does have the magic-cookie glitch");
+         else
+            Add (Str => "This terminal does not have the magic-cookie glitch");
+         end if;
+         Move_Cursor (Line => row + 1, Column => 8);
+         Add (Str => "Enter a digit to set gaps on each side of " &
+              "displayed attributes");
+         Move_Cursor (Line => row + 2, Column => 8);
+         Add (Str => "^L = repaint");
+         if Has_Colors then
+            declare tmp1 : String (1 .. 1);
+            begin
+               Add (Str => ".  f/F/b/F toggle colors (");
+               Put (tmp1, Integer (fg));
+               Add (Str => tmp1);
+               Add (Ch => '/');
+               Put (tmp1, Integer (bg));
+               Add (Str => tmp1);
+               Add (Ch => ')');
+            end;
+         end if;
+         Refresh;
+      end;
+
+      declare result : Boolean; begin
+         attr_getc (n, fg, bg, result);
+         exit when not result;
+      end;
+   end loop;
+
+   Set_Background (Ch => Blank2);
+   Erase;
+   End_Windows;
+end ncurses2.attr_test;
diff --git a/Ada95/samples/ncurses2-attr_test.ads b/Ada95/samples/ncurses2-attr_test.ads
new file mode 100644
index 0000000..08931ee
--- /dev/null
+++ b/Ada95/samples/ncurses2-attr_test.ads
@@ -0,0 +1,43 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                 ncurses                                  --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000,2006 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.                                                           --
+------------------------------------------------------------------------------
+--  Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
+--  Version Control
+--  $Revision: 1.3 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+procedure ncurses2.attr_test;
diff --git a/Ada95/samples/ncurses2-color_edit.adb b/Ada95/samples/ncurses2-color_edit.adb
new file mode 100644
index 0000000..7c30c66
--- /dev/null
+++ b/Ada95/samples/ncurses2-color_edit.adb
@@ -0,0 +1,260 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                 ncurses                                  --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000-2006,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
+--  Version Control
+--  $Revision: 1.7 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with ncurses2.util; use ncurses2.util;
+with ncurses2.genericPuts;
+with Terminal_Interface.Curses; use Terminal_Interface.Curses;
+
+procedure ncurses2.color_edit is
+   use Int_IO;
+
+   type RGB_Enum is (Redx, Greenx, Bluex);
+
+   procedure change_color (current : Color_Number;
+                           field   : RGB_Enum;
+                           value   : RGB_Value;
+                           usebase : Boolean);
+
+   procedure change_color (current : Color_Number;
+                           field   : RGB_Enum;
+                           value   : RGB_Value;
+                           usebase : Boolean)  is
+      red, green, blue : RGB_Value;
+   begin
+      if usebase then
+         Color_Content (current, red, green, blue);
+      else
+         red := 0;
+         green := 0;
+         blue := 0;
+      end if;
+
+      case field is
+         when Redx => red :=  red + value;
+         when Greenx => green := green + value;
+         when Bluex => blue := blue + value;
+      end case;
+
+      declare
+      begin
+         Init_Color (current, red, green, blue);
+      exception
+         when Curses_Exception => Beep;
+      end;
+
+   end change_color;
+
+   package x is new ncurses2.genericPuts (100); use x;
+
+   tmpb : x.BS.Bounded_String;
+
+   tmp4 : String (1 .. 4);
+   tmp6 : String (1 .. 6);
+   tmp8 : String (1 .. 8);
+   --  This would be easier if Ada had a Bounded_String
+   --  defined as a class instead of the inferior generic package,
+   --  then I could define Put, Add, and Get for them. Blech.
+   value : RGB_Value := 0;
+   red, green, blue : RGB_Value;
+   max_colors : constant Natural := Number_Of_Colors;
+   current : Color_Number := 0;
+   field : RGB_Enum := Redx;
+   this_c : Key_Code := 0;
+begin
+   Refresh;
+
+   for i in Color_Number'(0) .. Color_Number (Number_Of_Colors) loop
+      Init_Pair (Color_Pair (i), White, i);
+   end loop;
+
+   Move_Cursor (Line => Lines - 2, Column => 0);
+   Add (Str => "Number: ");
+   myPut (tmpb, Integer (value));
+   myAdd (Str => tmpb);
+
+   loop
+
+      Switch_Character_Attribute (On => False,
+                                  Attr => (Bold_Character => True,
+                                           others => False));
+      Add (Line => 0, Column => 20, Str => "Color RGB Value Editing");
+
+      Switch_Character_Attribute (On => False,
+                                  Attr => (Bold_Character => True,
+                                           others => False));
+
+      for i in Color_Number'(0) .. Color_Number (Number_Of_Colors) loop
+         Move_Cursor (Line => 2 + Line_Position (i), Column => 0);
+         if current = i then
+            Add (Ch => '>');
+         else
+            Add (Ch => ' ');
+         end if;
+         --  TODO if i <= color_names'Max  then
+         Put (tmp8, Integer (i));
+         Set_Character_Attributes (Color => Color_Pair (i));
+         Add (Str => "        ");
+         Set_Character_Attributes;
+
+         Refresh;
+
+         Color_Content (i, red, green, blue);
+         Add (Str => "   R = ");
+         if current = i and field = Redx then
+            Switch_Character_Attribute (On => True,
+                                        Attr => (Stand_Out => True,
+                                                 others => False));
+         end if;
+         Put (tmp4, Integer (red));
+         Add (Str => tmp4);
+         if current = i and field = Redx then
+            Set_Character_Attributes;
+         end if;
+         Add (Str => "   G = ");
+         if current = i and field =  Greenx then
+            Switch_Character_Attribute (On => True,
+                                        Attr => (Stand_Out => True,
+                                                 others => False));
+         end if;
+         Put (tmp4, Integer (green));
+         Add (Str => tmp4);
+         if current = i and field = Greenx then
+            Set_Character_Attributes;
+         end if;
+         Add (Str => "   B = ");
+         if current = i and field = Bluex then
+            Switch_Character_Attribute (On => True,
+                                        Attr => (Stand_Out => True,
+                                                 others => False));
+         end if;
+         Put (tmp4, Integer (blue));
+         Add (Str => tmp4);
+         if current = i and field = Bluex then
+            Set_Character_Attributes;
+         end if;
+         Set_Character_Attributes;
+         Add (Ch => ')');
+      end loop;
+      Add (Line => Line_Position (Number_Of_Colors + 3), Column => 0,
+           Str => "Use up/down to select a color, left/right to change " &
+           "fields.");
+      Add (Line => Line_Position (Number_Of_Colors + 4), Column => 0,
+           Str => "Modify field by typing nnn=, nnn-, or nnn+.  ? for help.");
+
+      Move_Cursor (Line => 2 + Line_Position (current), Column => 0);
+
+      this_c := Getchar;
+      if Is_Digit (this_c) then
+         value := 0;
+      end if;
+
+      case this_c is
+         when KEY_UP =>
+            current := (current - 1) mod Color_Number (max_colors);
+         when KEY_DOWN =>
+            current := (current + 1) mod Color_Number (max_colors);
+         when KEY_RIGHT =>
+            field := RGB_Enum'Val ((RGB_Enum'Pos (field) + 1) mod 3);
+         when KEY_LEFT =>
+            field := RGB_Enum'Val ((RGB_Enum'Pos (field) - 1) mod 3);
+         when
+           Character'Pos ('0') |
+           Character'Pos ('1') |
+           Character'Pos ('2') |
+           Character'Pos ('3') |
+           Character'Pos ('4') |
+           Character'Pos ('5') |
+           Character'Pos ('6') |
+           Character'Pos ('7') |
+           Character'Pos ('8') |
+           Character'Pos ('9')  =>
+            value := value * 10 + RGB_Value (ctoi (Code_To_Char (this_c)));
+
+         when Character'Pos ('+') =>
+            change_color (current, field,  value, True);
+
+         when Character'Pos ('-') =>
+            change_color (current, field, -value, True);
+
+         when Character'Pos ('=') =>
+            change_color (current, field,  value, False);
+
+         when Character'Pos ('?') =>
+            Erase;
+            P ("                      RGB Value Editing Help");
+            P ("");
+            P ("You are in the RGB value editor.  Use the arrow keys to " &
+               "select one of");
+            P ("the fields in one of the RGB triples of the current colors;" &
+               " the one");
+            P ("currently selected will be reverse-video highlighted.");
+            P ("");
+            P ("To change a field, enter the digits of the new value; they" &
+               " are echoed");
+            P ("as entered.  Finish by typing `='.  The change will take" &
+               " effect instantly.");
+            P ("To increment or decrement a value, use the same procedure," &
+               " but finish");
+            P ("with a `+' or `-'.");
+            P ("");
+            P ("To quit, do `x' or 'q'");
+
+            Pause;
+            Erase;
+         when Character'Pos ('q') |
+           Character'Pos ('x') =>
+            null;
+         when others =>
+            Beep;
+      end case;
+      Move_Cursor (Line => Lines - 2, Column => 0);
+      Put (tmp6, Integer (value));
+      Add (Str => "Number: " & tmp6);
+
+      Clear_To_End_Of_Line;
+      exit when this_c = Character'Pos ('x') or
+        this_c = Character'Pos ('q');
+   end loop;
+
+   Erase;
+   End_Windows;
+end ncurses2.color_edit;
diff --git a/Ada95/samples/ncurses2-color_edit.ads b/Ada95/samples/ncurses2-color_edit.ads
new file mode 100644
index 0000000..a44889b
--- /dev/null
+++ b/Ada95/samples/ncurses2-color_edit.ads
@@ -0,0 +1,42 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                 ncurses                                  --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000 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.                                                           --
+------------------------------------------------------------------------------
+--  Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
+--  Version Control
+--  $Revision: 1.2 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+procedure ncurses2.color_edit;
diff --git a/Ada95/samples/ncurses2-color_test.adb b/Ada95/samples/ncurses2-color_test.adb
new file mode 100644
index 0000000..ca35e04
--- /dev/null
+++ b/Ada95/samples/ncurses2-color_test.adb
@@ -0,0 +1,164 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                 ncurses                                  --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000-2006,2008 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.                                                           --
+------------------------------------------------------------------------------
+--  Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
+--  Version Control
+--  $Revision: 1.4 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with ncurses2.util; use ncurses2.util;
+
+with Terminal_Interface.Curses; use Terminal_Interface.Curses;
+with Ada.Strings.Fixed;
+
+procedure ncurses2.color_test is
+   use Int_IO;
+
+   procedure show_color_name (y, x : Integer; color : Integer);
+
+   color_names : constant array (0 .. 15) of String (1 .. 7) :=
+     (
+      "black  ",
+      "red    ",
+      "green  ",
+      "yellow ",
+      "blue   ",
+      "magenta",
+      "cyan   ",
+      "white  ",
+      "BLACK  ",
+      "RED    ",
+      "GREEN  ",
+      "YELLOW ",
+      "BLUE   ",
+      "MAGENTA",
+      "CYAN   ",
+      "WHITE  "
+      );
+
+   procedure show_color_name (y, x : Integer; color : Integer) is
+      tmp5 : String (1 .. 5);
+   begin
+      if Number_Of_Colors > 8 then
+
+         Put (tmp5, color);
+         Add (Line => Line_Position (y), Column => Column_Position (x),
+              Str => tmp5);
+      else
+         Add (Line => Line_Position (y), Column => Column_Position (x),
+              Str => color_names (color));
+      end if;
+   end show_color_name;
+
+   top, width : Integer;
+   hello : String (1 .. 5);
+   --  tmp3 : String (1 .. 3);
+   --  tmp2 : String (1 .. 2);
+
+begin
+   Refresh;
+   Add (Str => "There are ");
+   --  Put(tmp3, Number_Of_Colors*Number_Of_Colors);
+   Add (Str => Ada.Strings.Fixed.Trim (Integer'Image (Number_Of_Colors *
+                                                      Number_Of_Colors),
+                                       Ada.Strings.Left));
+   Add (Str => " color pairs");
+   Add (Ch => newl);
+
+   if Number_Of_Colors > 8 then
+      width := 4;
+   else
+      width := 8;
+   end if;
+
+   if Number_Of_Colors > 8 then
+      hello := "Test ";
+   else
+      hello := "Hello";
+   end if;
+
+   for Bright in Boolean loop
+      if Number_Of_Colors > 8 then
+         top := 0;
+      else
+         top := Boolean'Pos (Bright) * (Number_Of_Colors + 3);
+      end if;
+      Clear_To_End_Of_Screen;
+      Move_Cursor (Line => Line_Position (top) + 1, Column => 0);
+      --  Put(tmp2, Number_Of_Colors);
+      Add (Str => Ada.Strings.Fixed.Trim (Integer'Image (Number_Of_Colors),
+                                          Ada.Strings.Left));
+      Add (Ch => 'x');
+      Add (Str => Ada.Strings.Fixed.Trim (Integer'Image (Number_Of_Colors),
+                                          Ada.Strings.Left));
+      Add (Str => "  matrix of foreground/background colors, bright *");
+      if Bright then
+         Add (Str => "on");
+      else
+         Add (Str => "off");
+      end if;
+      Add (Ch => '*');
+
+      for i in 0 .. Number_Of_Colors - 1 loop
+         show_color_name (top + 2, (i + 1) * width, i);
+      end loop;
+      for i in 0 .. Number_Of_Colors - 1 loop
+         show_color_name (top + 3 + i, 0, i);
+      end loop;
+      for i in 1 .. Number_Of_Color_Pairs - 1 loop
+         Init_Pair (Color_Pair (i), Color_Number (i mod Number_Of_Colors),
+                    Color_Number (i / Number_Of_Colors));
+         --  attron((attr_t) COLOR_PAIR(i)) -- Huh?
+         Set_Color (Pair => Color_Pair (i));
+         if Bright then
+            Switch_Character_Attribute (Attr => (Bold_Character => True,
+                                                 others => False));
+         end if;
+         Add (Line => Line_Position (top + 3 + (i / Number_Of_Colors)),
+              Column => Column_Position ((i mod Number_Of_Colors + 1) *
+                                         width),
+              Str => hello);
+         Set_Character_Attributes;
+      end loop;
+      if Number_Of_Colors > 8 or Bright then
+         Pause;
+      end if;
+   end loop;
+
+   Erase;
+   End_Windows;
+end ncurses2.color_test;
diff --git a/Ada95/samples/ncurses2-color_test.ads b/Ada95/samples/ncurses2-color_test.ads
new file mode 100644
index 0000000..e927fdd
--- /dev/null
+++ b/Ada95/samples/ncurses2-color_test.ads
@@ -0,0 +1,42 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                 ncurses                                  --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000 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.                                                           --
+------------------------------------------------------------------------------
+--  Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
+--  Version Control
+--  $Revision: 1.2 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+procedure ncurses2.color_test;
diff --git a/Ada95/samples/ncurses2-demo_forms.adb b/Ada95/samples/ncurses2-demo_forms.adb
new file mode 100644
index 0000000..b2d72ba
--- /dev/null
+++ b/Ada95/samples/ncurses2-demo_forms.adb
@@ -0,0 +1,499 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                 ncurses                                  --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020,2021 Thomas E. Dickey                                     --
+-- Copyright 2000-2011,2014 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.                                                           --
+------------------------------------------------------------------------------
+--  Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
+--  Version Control
+--  $Revision: 1.9 $
+--  $Date: 2021/09/04 10:52:55 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with ncurses2.util; use ncurses2.util;
+with Terminal_Interface.Curses; use Terminal_Interface.Curses;
+with Terminal_Interface.Curses.Forms; use Terminal_Interface.Curses.Forms;
+with Terminal_Interface.Curses.Forms.Field_User_Data;
+with Ada.Characters.Handling;
+with Ada.Strings;
+with Ada.Strings.Bounded;
+
+procedure ncurses2.demo_forms is
+   package BS is new Ada.Strings.Bounded.Generic_Bounded_Length (80);
+
+   type myptr is access Integer;
+
+   --  The C version stores a pointer in the userptr and
+   --  converts it into a long integer.
+   --  The correct, but inconvenient  way to do it is to use a
+   --  pointer to long and keep the pointer constant.
+   --  It just adds one memory piece to allocate and deallocate (not done here)
+
+   package StringData is new
+     Terminal_Interface.Curses.Forms.Field_User_Data (Integer, myptr);
+
+   function edit_secure (me : Field; c_in : Key_Code) return Key_Code;
+   function form_virtualize (f : Form; w : Window) return Key_Code;
+   function my_form_driver (f : Form; c : Key_Code) return Boolean;
+   function make_label (frow  : Line_Position;
+                        fcol  : Column_Position;
+                        label : String) return Field;
+   function make_field (frow   : Line_Position;
+                        fcol   : Column_Position;
+                        rows   : Line_Count;
+                        cols   : Column_Count;
+                        secure : Boolean) return Field;
+   procedure display_form (f : Form);
+   procedure erase_form (f : Form);
+
+   --  prints '*' instead of characters.
+   --  Not that this keeps a bug from the C version:
+   --  type in the psasword field then move off and back.
+   --  the cursor is at position one, but
+   --  this assumes it as at the end so text gets appended instead
+   --  of overwtitting.
+   function edit_secure (me : Field; c_in : Key_Code) return Key_Code is
+      rows, frow : Line_Position;
+      nrow : Natural;
+      cols, fcol : Column_Position;
+      nbuf : Buffer_Number;
+      c : Key_Code := c_in;
+      c2 :  Character;
+
+      use StringData;
+   begin
+      Info (me, rows, cols, frow, fcol, nrow, nbuf);
+      --  TODO         if result = Form_Ok and nbuf > 0 then
+      --  C version checked the return value
+      --  of Info, the Ada binding throws an exception I think.
+      if nbuf > 0 then
+         declare
+            temp : BS.Bounded_String;
+            temps : String (1 .. 10);
+            --  TODO Get_Buffer povides no information on the field length?
+            len : myptr;
+         begin
+            Get_Buffer (me, 1, Str => temps);
+            --  strcpy(temp, field_buffer(me, 1));
+            Get_User_Data (me, len);
+            temp := BS.To_Bounded_String (temps (1 .. len.all));
+            if c <= Key_Max then
+               c2 := Code_To_Char (c);
+               if Ada.Characters.Handling.Is_Graphic (c2) then
+                  BS.Append (temp, c2);
+                  len.all := len.all + 1;
+                  Set_Buffer (me, 1, BS.To_String (temp));
+                  c := Character'Pos ('*');
+               else
+                  c := 0;
+               end if;
+            else
+               case c is
+                  when  REQ_BEG_FIELD |
+                    REQ_CLR_EOF |
+                    REQ_CLR_EOL |
+                    REQ_DEL_LINE |
+                    REQ_DEL_WORD |
+                    REQ_DOWN_CHAR |
+                    REQ_END_FIELD |
+                    REQ_INS_CHAR |
+                    REQ_INS_LINE |
+                    REQ_LEFT_CHAR |
+                    REQ_NEW_LINE |
+                    REQ_NEXT_WORD |
+                    REQ_PREV_WORD |
+                    REQ_RIGHT_CHAR |
+                    REQ_UP_CHAR =>
+                     c := 0;         -- we don't want to do inline editing
+                  when REQ_CLR_FIELD =>
+                     if len.all /= 0 then
+                        temp := BS.To_Bounded_String ("");
+                        Set_Buffer (me, 1, BS.To_String (temp));
+                        len.all := 0;
+                     end if;
+
+                  when REQ_DEL_CHAR |
+                    REQ_DEL_PREV =>
+                     if len.all /= 0 then
+                        BS.Delete (temp, BS.Length (temp), BS.Length (temp));
+                        Set_Buffer (me, 1, BS.To_String (temp));
+                        len.all := len.all - 1;
+                     end if;
+                  when others => null;
+               end case;
+            end if;
+         end;
+      end if;
+      return c;
+   end edit_secure;
+
+   mode : Key_Code := REQ_INS_MODE;
+
+   function form_virtualize (f : Form; w : Window) return Key_Code is
+      type lookup_t is record
+         code : Key_Code;
+         result : Key_Code;
+         --  should be Form_Request_Code, but we need MAX_COMMAND + 1
+      end record;
+
+      lookup : constant array (Positive range <>) of lookup_t :=
+        (
+         (
+          Character'Pos ('A') mod 16#20#, REQ_NEXT_CHOICE
+          ),
+         (
+          Character'Pos ('B') mod 16#20#, REQ_PREV_WORD
+          ),
+         (
+          Character'Pos ('C') mod 16#20#, REQ_CLR_EOL
+          ),
+         (
+          Character'Pos ('D') mod 16#20#, REQ_DOWN_FIELD
+          ),
+         (
+          Character'Pos ('E') mod 16#20#, REQ_END_FIELD
+          ),
+         (
+          Character'Pos ('F') mod 16#20#, REQ_NEXT_PAGE
+          ),
+         (
+          Character'Pos ('G') mod 16#20#, REQ_DEL_WORD
+          ),
+         (
+          Character'Pos ('H') mod 16#20#, REQ_DEL_PREV
+          ),
+         (
+          Character'Pos ('I') mod 16#20#, REQ_INS_CHAR
+          ),
+         (
+          Character'Pos ('K') mod 16#20#, REQ_CLR_EOF
+          ),
+         (
+          Character'Pos ('L') mod 16#20#, REQ_LEFT_FIELD
+          ),
+         (
+          Character'Pos ('M') mod 16#20#, REQ_NEW_LINE
+          ),
+         (
+          Character'Pos ('N') mod 16#20#, REQ_NEXT_FIELD
+          ),
+         (
+          Character'Pos ('O') mod 16#20#, REQ_INS_LINE
+          ),
+         (
+          Character'Pos ('P') mod 16#20#, REQ_PREV_FIELD
+          ),
+         (
+          Character'Pos ('R') mod 16#20#, REQ_RIGHT_FIELD
+          ),
+         (
+          Character'Pos ('S') mod 16#20#, REQ_BEG_FIELD
+          ),
+         (
+          Character'Pos ('U') mod 16#20#, REQ_UP_FIELD
+          ),
+         (
+          Character'Pos ('V') mod 16#20#, REQ_DEL_CHAR
+          ),
+         (
+          Character'Pos ('W') mod 16#20#, REQ_NEXT_WORD
+          ),
+         (
+          Character'Pos ('X') mod 16#20#, REQ_CLR_FIELD
+          ),
+         (
+          Character'Pos ('Y') mod 16#20#, REQ_DEL_LINE
+          ),
+         (
+          Character'Pos ('Z') mod 16#20#, REQ_PREV_CHOICE
+          ),
+         (
+          Character'Pos ('[') mod 16#20#, --  ESCAPE
+          Form_Request_Code'Last + 1
+          ),
+         (
+          Key_Backspace, REQ_DEL_PREV
+          ),
+         (
+          KEY_DOWN, REQ_DOWN_CHAR
+          ),
+         (
+          Key_End, REQ_LAST_FIELD
+          ),
+         (
+          Key_Home, REQ_FIRST_FIELD
+          ),
+         (
+          KEY_LEFT, REQ_LEFT_CHAR
+          ),
+         (
+          KEY_LL, REQ_LAST_FIELD
+          ),
+         (
+          Key_Next, REQ_NEXT_FIELD
+          ),
+         (
+          KEY_NPAGE, REQ_NEXT_PAGE
+          ),
+         (
+          KEY_PPAGE, REQ_PREV_PAGE
+          ),
+         (
+          Key_Previous, REQ_PREV_FIELD
+          ),
+         (
+          KEY_RIGHT, REQ_RIGHT_CHAR
+          ),
+         (
+          KEY_UP, REQ_UP_CHAR
+          ),
+         (
+          Character'Pos ('Q') mod 16#20#, --  QUIT
+          Form_Request_Code'Last + 1      --  TODO MAX_FORM_COMMAND + 1
+          )
+         );
+
+      c : Key_Code := Getchar (w);
+      me : constant Field := Current (f);
+
+   begin
+      if c = Character'Pos (']') mod 16#20# then
+         if mode = REQ_INS_MODE then
+            mode := REQ_OVL_MODE;
+         else
+            mode := REQ_INS_MODE;
+         end if;
+         c := mode;
+      else
+         for n in lookup'Range loop
+            if lookup (n).code = c then
+               c := lookup (n).result;
+               exit;
+            end if;
+         end loop;
+      end if;
+
+      --  Force the field that the user is typing into to be in reverse video,
+      --  while the other fields are shown underlined.
+      if c <= Key_Max then
+         c := edit_secure (me, c);
+         Set_Background (me, (Reverse_Video => True, others => False));
+      elsif c <= Form_Request_Code'Last then
+         c := edit_secure (me, c);
+         Set_Background (me, (Under_Line => True, others => False));
+      end if;
+      return c;
+   end form_virtualize;
+
+   function my_form_driver (f : Form; c : Key_Code) return Boolean is
+      flag : constant Driver_Result := Driver (f, F_Validate_Field);
+   begin
+      if c = Form_Request_Code'Last + 1 and
+         flag = Form_Ok
+      then
+         return True;
+      else
+         Beep;
+         return False;
+      end if;
+   end my_form_driver;
+
+   function make_label (frow  : Line_Position;
+                        fcol  : Column_Position;
+                        label : String) return Field is
+      f : constant Field := Create (1, label'Length, frow, fcol, 0, 0);
+      o : Field_Option_Set := Get_Options (f);
+   begin
+      if f /= Null_Field then
+         Set_Buffer (f, 0, label);
+         o.Active := False;
+         Set_Options (f, o);
+      end if;
+      return f;
+   end make_label;
+
+   function make_field (frow   : Line_Position;
+                        fcol   : Column_Position;
+                        rows   : Line_Count;
+                        cols   : Column_Count;
+                        secure : Boolean) return Field is
+      f : Field;
+      use StringData;
+      len : myptr;
+   begin
+      if secure then
+         f := Create (rows, cols, frow, fcol, 0, 1);
+      else
+         f := Create (rows, cols, frow, fcol, 0, 0);
+      end if;
+
+      if f /= Null_Field then
+         Set_Background (f, (Under_Line => True, others => False));
+         len := new Integer;
+         len.all := 0;
+         Set_User_Data (f, len);
+      end if;
+      return f;
+   end make_field;
+
+   procedure display_form (f : Form) is
+      w : Window;
+      rows : Line_Count;
+      cols : Column_Count;
+   begin
+      Scale (f, rows, cols);
+
+      w := New_Window (rows + 2, cols + 4, 0, 0);
+      if w /= Null_Window then
+         Set_Window (f, w);
+         Set_Sub_Window (f, Derived_Window (w, rows, cols, 1, 2));
+         Box (w); -- 0,0
+         Set_KeyPad_Mode (w, True);
+      end if;
+
+      --  TODO if Post(f) /= Form_Ok then it is a procedure
+      declare
+      begin
+         Post (f);
+      exception
+         when
+           Eti_System_Error    |
+           Eti_Bad_Argument    |
+           Eti_Posted          |
+           Eti_Connected       |
+           Eti_Bad_State       |
+           Eti_No_Room         |
+           Eti_Not_Posted      |
+           Eti_Unknown_Command |
+           Eti_No_Match        |
+           Eti_Not_Selectable  |
+           Eti_Not_Connected   |
+           Eti_Request_Denied  |
+           Eti_Invalid_Field   |
+           Eti_Current         =>
+            Refresh (w);
+      end;
+      --  end if;
+   end display_form;
+
+   procedure erase_form (f : Form) is
+      w : Window := Get_Window (f);
+      s : Window := Get_Sub_Window (f);
+   begin
+      Post (f, False);
+      Erase (w);
+      Refresh (w);
+      Delete (s);
+      Delete (w);
+   end erase_form;
+
+   finished : Boolean := False;
+   f : constant Field_Array_Access := new Field_Array (1 .. 12);
+   secure : Field;
+   myform : Form;
+   w : Window;
+   c : Key_Code;
+   result : Driver_Result;
+begin
+   Move_Cursor (Line => 18, Column => 0);
+   Add (Str => "Defined form-traversal keys:   ^Q/ESC- exit form");
+   Add (Ch => newl);
+   Add (Str => "^N   -- go to next field       ^P  -- go to previous field");
+   Add (Ch => newl);
+   Add (Str => "Home -- go to first field      End -- go to last field");
+   Add (Ch => newl);
+   Add (Str => "^L   -- go to field to left    ^R  -- go to field to right");
+   Add (Ch => newl);
+   Add (Str => "^U   -- move upward to field   ^D  -- move downward to field");
+   Add (Ch => newl);
+   Add (Str => "^W   -- go to next word        ^B  -- go to previous word");
+   Add (Ch => newl);
+   Add (Str => "^S   -- go to start of field   ^E  -- go to end of field");
+   Add (Ch => newl);
+   Add (Str => "^H   -- delete previous char   ^Y  -- delete line");
+   Add (Ch => newl);
+   Add (Str => "^G   -- delete current word    ^C  -- clear to end of line");
+   Add (Ch => newl);
+   Add (Str => "^K   -- clear to end of field  ^X  -- clear field");
+   Add (Ch => newl);
+   Add (Str => "Arrow keys move within a field as you would expect.");
+
+   Add (Line => 4, Column => 57, Str => "Forms Entry Test");
+
+   Refresh;
+
+   --  describe the form
+   f.all (1) := make_label (0, 15, "Sample Form");
+   f.all (2) := make_label (2, 0, "Last Name");
+   f.all (3) := make_field (3, 0, 1, 18, False);
+   f.all (4) := make_label (2, 20, "First Name");
+   f.all (5) := make_field (3, 20, 1, 12, False);
+   f.all (6) := make_label (2, 34, "Middle Name");
+   f.all (7) := make_field (3, 34, 1, 12, False);
+   f.all (8) := make_label (5, 0, "Comments");
+   f.all (9) := make_field (6, 0, 4, 46, False);
+   f.all (10) := make_label (5, 20, "Password:");
+   f.all (11) := make_field (5, 30, 1, 9, True);
+   secure := f.all (11);
+   f.all (12) := Null_Field;
+
+   myform := New_Form (f);
+
+   display_form (myform);
+
+   w := Get_Window (myform);
+   Set_Raw_Mode (SwitchOn => True);
+   Set_NL_Mode (SwitchOn => True);     --  lets us read ^M's
+   while not finished loop
+      c := form_virtualize (myform, w);
+      result := Driver (myform, c);
+      case result is
+         when Form_Ok =>
+            Add (Line => 5, Column => 57, Str => Get_Buffer (secure, 1));
+            Clear_To_End_Of_Line;
+            Refresh;
+         when Unknown_Request =>
+            finished := my_form_driver (myform, c);
+         when others =>
+            Beep;
+      end case;
+   end loop;
+
+   erase_form (myform);
+
+   --  TODO Free_Form(myform);
+   --     for (c = 0; f[c] != 0; c++) free_field(f[c]);
+   Set_Raw_Mode (SwitchOn => False);
+   Set_NL_Mode (SwitchOn => True);
+
+end ncurses2.demo_forms;
diff --git a/Ada95/samples/ncurses2-demo_forms.ads b/Ada95/samples/ncurses2-demo_forms.ads
new file mode 100644
index 0000000..775e777
--- /dev/null
+++ b/Ada95/samples/ncurses2-demo_forms.ads
@@ -0,0 +1,42 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                 ncurses                                  --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000 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.                                                           --
+------------------------------------------------------------------------------
+--  Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
+--  Version Control
+--  $Revision: 1.2 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+procedure ncurses2.demo_forms;
diff --git a/Ada95/samples/ncurses2-demo_pad.adb b/Ada95/samples/ncurses2-demo_pad.adb
new file mode 100644
index 0000000..86bfb2d
--- /dev/null
+++ b/Ada95/samples/ncurses2-demo_pad.adb
@@ -0,0 +1,678 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                 ncurses                                  --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000-2011,2014 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.                                                           --
+------------------------------------------------------------------------------
+--  Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
+--  Version Control
+--  $Revision: 1.11 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with ncurses2.util; use ncurses2.util;
+
+with Terminal_Interface.Curses; use Terminal_Interface.Curses;
+
+with Interfaces.C;
+with System.Storage_Elements;
+with System.Address_To_Access_Conversions;
+
+with Ada.Text_IO;
+--  with Ada.Real_Time; use Ada.Real_Time;
+--  TODO is there a way to use Real_Time or Ada.Calendar in place of
+--  gettimeofday?
+
+--  Demonstrate pads.
+procedure ncurses2.demo_pad is
+
+   type timestruct is record
+      seconds : Integer;
+      microseconds : Integer;
+   end record;
+
+   type myfunc is access function (w : Window) return Key_Code;
+
+   function  gettime return timestruct;
+   procedure do_h_line (y  : Line_Position;
+                        x  : Column_Position;
+                        c  : Attributed_Character;
+                        to : Column_Position);
+   procedure do_v_line (y  : Line_Position;
+                        x  : Column_Position;
+                        c  : Attributed_Character;
+                        to : Line_Position);
+   function  padgetch (win : Window) return Key_Code;
+   function  panner_legend (line : Line_Position) return Boolean;
+   procedure panner_legend (line : Line_Position);
+   procedure panner_h_cleanup (from_y : Line_Position;
+                               from_x : Column_Position;
+                               to_x   : Column_Position);
+   procedure panner_v_cleanup (from_y : Line_Position;
+                               from_x : Column_Position;
+                               to_y   : Line_Position);
+   procedure panner (pad    : Window;
+                     top_xp : Column_Position;
+                     top_yp : Line_Position;
+                     portyp : Line_Position;
+                     portxp : Column_Position;
+                     pgetc  : myfunc);
+
+   function gettime return timestruct is
+
+      retval : timestruct;
+
+      use Interfaces.C;
+      type timeval is record
+         tv_sec : long;
+         tv_usec : long;
+      end record;
+      pragma Convention (C, timeval);
+
+      --      TODO    function from_timeval is new Ada.Unchecked_Conversion(
+      --                  timeval_a, System.Storage_Elements.Integer_Address);
+      --  should Interfaces.C.Pointers be used here?
+
+      package myP is new System.Address_To_Access_Conversions (timeval);
+      use myP;
+
+      t : constant Object_Pointer := new timeval;
+
+      function gettimeofday
+        (TP : System.Storage_Elements.Integer_Address;
+         TZP : System.Storage_Elements.Integer_Address) return int;
+      pragma Import (C, gettimeofday, "gettimeofday");
+      tmp : int;
+   begin
+      tmp := gettimeofday (System.Storage_Elements.To_Integer
+                           (myP.To_Address (t)),
+                           System.Storage_Elements.To_Integer
+                           (myP.To_Address (null)));
+      if tmp < 0 then
+         retval.seconds := 0;
+         retval.microseconds := 0;
+      else
+         retval.seconds := Integer (t.all.tv_sec);
+         retval.microseconds := Integer (t.all.tv_usec);
+      end if;
+      return retval;
+   end gettime;
+
+   --  in C, The behavior of mvhline, mvvline for negative/zero length is
+   --  unspecified, though we can rely on negative x/y values to stop the
+   --  macro. Except Ada makes Line_Position(-1) = Natural - 1 so forget it.
+   procedure do_h_line (y  : Line_Position;
+                        x  : Column_Position;
+                        c  : Attributed_Character;
+                        to : Column_Position) is
+   begin
+      if to > x then
+         Move_Cursor (Line => y, Column => x);
+         Horizontal_Line (Line_Size => Natural (to - x), Line_Symbol => c);
+      end if;
+   end do_h_line;
+
+   procedure do_v_line (y  : Line_Position;
+                        x  : Column_Position;
+                        c  : Attributed_Character;
+                        to : Line_Position) is
+   begin
+      if to > y then
+         Move_Cursor (Line => y, Column => x);
+         Vertical_Line (Line_Size => Natural (to - y), Line_Symbol => c);
+      end if;
+   end do_v_line;
+
+   function padgetch (win : Window) return Key_Code is
+      c : Key_Code;
+      c2 : Character;
+   begin
+      c := Getchar (win);
+      c2 := Code_To_Char (c);
+
+      case c2 is
+         when '!' =>
+            ShellOut (False);
+            return Key_Refresh;
+         when Character'Val (Character'Pos ('r') mod 16#20#) => --  CTRL('r')
+            End_Windows;
+            Refresh;
+            return Key_Refresh;
+         when Character'Val (Character'Pos ('l') mod 16#20#) => --  CTRL('l')
+            return Key_Refresh;
+         when 'U' =>
+            return Key_Cursor_Up;
+         when 'D' =>
+            return Key_Cursor_Down;
+         when 'R' =>
+            return Key_Cursor_Right;
+         when 'L' =>
+            return Key_Cursor_Left;
+         when '+' =>
+            return Key_Insert_Line;
+         when '-' =>
+            return Key_Delete_Line;
+         when '>' =>
+            return Key_Insert_Char;
+         when '<' =>
+            return Key_Delete_Char;
+            --  when ERR=>                   /* FALLTHRU */
+         when 'q' =>
+            return (Key_Exit);
+         when others =>
+            return (c);
+      end case;
+   end padgetch;
+
+   show_panner_legend : Boolean := True;
+
+   function panner_legend (line : Line_Position) return Boolean is
+      legend : constant array (0 .. 3) of String (1 .. 61) :=
+        (
+         "Use arrow keys (or U,D,L,R) to pan, q to quit (?,t,s flags)  ",
+         "Use ! to shell-out.  Toggle legend:?, timer:t, scroll mark:s.",
+         "Use +,- (or j,k) to grow/shrink the panner vertically.       ",
+         "Use <,> (or h,l) to grow/shrink the panner horizontally.     ");
+      legendsize : constant := 4;
+
+      n : constant Integer := legendsize - Integer (Lines - line);
+   begin
+      if line < Lines and n >= 0 then
+         Move_Cursor (Line => line, Column => 0);
+         if show_panner_legend then
+            Add (Str => legend (n));
+         end if;
+         Clear_To_End_Of_Line;
+         return show_panner_legend;
+      end if;
+      return False;
+   end panner_legend;
+
+   procedure panner_legend (line : Line_Position) is
+   begin
+      if not panner_legend (line) then
+         Beep;
+      end if;
+   end panner_legend;
+
+   procedure panner_h_cleanup (from_y : Line_Position;
+                               from_x : Column_Position;
+                               to_x   : Column_Position) is
+   begin
+      if not panner_legend (from_y) then
+         do_h_line (from_y, from_x, Blank2, to_x);
+      end if;
+   end panner_h_cleanup;
+
+   procedure panner_v_cleanup (from_y : Line_Position;
+                               from_x : Column_Position;
+                               to_y   : Line_Position) is
+   begin
+      if not panner_legend (from_y) then
+         do_v_line (from_y, from_x, Blank2, to_y);
+      end if;
+   end panner_v_cleanup;
+
+   procedure panner (pad    : Window;
+                     top_xp : Column_Position;
+                     top_yp : Line_Position;
+                     portyp : Line_Position;
+                     portxp : Column_Position;
+                     pgetc  : myfunc) is
+
+      function f (y : Line_Position) return Line_Position;
+      function f (x : Column_Position) return Column_Position;
+      function greater (y1, y2 : Line_Position) return Integer;
+      function greater (x1, x2 : Column_Position) return Integer;
+
+      top_x : Column_Position := top_xp;
+      top_y : Line_Position := top_yp;
+      porty : Line_Position := portyp;
+      portx : Column_Position := portxp;
+
+      --  f[x] returns max[x - 1, 0]
+      function f (y : Line_Position) return Line_Position is
+      begin
+         if y > 0 then
+            return y - 1;
+         else
+            return y; -- 0
+         end if;
+      end f;
+
+      function f (x : Column_Position) return Column_Position is
+      begin
+         if x > 0 then
+            return x - 1;
+         else
+            return x; -- 0
+         end if;
+      end f;
+
+      function greater (y1, y2 : Line_Position) return Integer is
+      begin
+         if y1 > y2 then
+            return 1;
+         else
+            return 0;
+         end if;
+      end greater;
+
+      function greater (x1, x2 : Column_Position) return Integer is
+      begin
+         if x1 > x2 then
+            return 1;
+         else
+            return 0;
+         end if;
+      end greater;
+
+      pymax : Line_Position;
+      basey : Line_Position := 0;
+      pxmax : Column_Position;
+      basex : Column_Position := 0;
+      c : Key_Code;
+      scrollers : Boolean := True;
+      before, after : timestruct;
+      timing : Boolean := True;
+
+      package floatio is new Ada.Text_IO.Float_IO (Long_Float);
+   begin
+      Get_Size (pad, pymax, pxmax);
+      Allow_Scrolling (Mode => False); -- we don't want stdscr to scroll!
+
+      c := Key_Refresh;
+      loop
+         --  During shell-out, the user may have resized the window.  Adjust
+         --  the port size of the pad to accommodate this.  Ncurses
+         --  automatically resizes all of the normal windows to fit on the
+         --  new screen.
+         if top_x > Columns then
+            top_x := Columns;
+         end if;
+         if portx > Columns then
+            portx := Columns;
+         end if;
+         if top_y > Lines then
+            top_y := Lines;
+         end if;
+         if porty > Lines then
+            porty := Lines;
+         end if;
+
+         case c is
+            when Key_Refresh | Character'Pos ('?') =>
+               if c = Key_Refresh then
+                  Erase;
+               else -- '?'
+                  show_panner_legend := not show_panner_legend;
+               end if;
+               panner_legend (Lines - 4);
+               panner_legend (Lines - 3);
+               panner_legend (Lines - 2);
+               panner_legend (Lines - 1);
+            when Character'Pos ('t') =>
+               timing := not timing;
+               if not timing then
+                  panner_legend (Lines - 1);
+               end if;
+            when Character'Pos ('s') =>
+               scrollers := not scrollers;
+
+               --  Move the top-left corner of the pad, keeping the
+               --  bottom-right corner fixed.
+            when Character'Pos ('h') =>
+               --  increase-columns: move left edge to left
+               if top_x = 0 then
+                  Beep;
+               else
+                  panner_v_cleanup (top_y, top_x, porty);
+                  top_x := top_x - 1;
+               end if;
+
+            when Character'Pos ('j') =>
+               --  decrease-lines: move top-edge down
+               if top_y >= porty then
+                  Beep;
+               else
+                  if top_y /= 0 then
+                     panner_h_cleanup (top_y - 1, f (top_x), portx);
+                  end if;
+                  top_y := top_y + 1;
+               end if;
+            when Character'Pos ('k') =>
+               --  increase-lines: move top-edge up
+               if top_y = 0 then
+                  Beep;
+               else
+                  top_y := top_y - 1;
+                  panner_h_cleanup (top_y, top_x, portx);
+               end if;
+
+            when Character'Pos ('l') =>
+               --  decrease-columns: move left-edge to right
+               if top_x >= portx then
+                  Beep;
+               else
+                  if top_x /= 0 then
+                     panner_v_cleanup (f (top_y), top_x - 1, porty);
+                  end if;
+                  top_x := top_x + 1;
+               end if;
+
+               --  Move the bottom-right corner of the pad, keeping the
+               --  top-left corner fixed.
+            when Key_Insert_Char =>
+               --  increase-columns: move right-edge to right
+               if portx >= pxmax or portx >= Columns then
+                  Beep;
+               else
+                  panner_v_cleanup (f (top_y), portx - 1, porty);
+                  portx := portx + 1;
+                  --  C had ++portx instead of portx++, weird.
+               end if;
+            when Key_Insert_Line =>
+               --  increase-lines: move bottom-edge down
+               if porty >= pymax or porty >= Lines then
+                  Beep;
+               else
+                  panner_h_cleanup (porty - 1, f (top_x), portx);
+                  porty := porty + 1;
+               end if;
+
+            when Key_Delete_Char =>
+               --  decrease-columns: move bottom edge up
+               if portx <= top_x then
+                  Beep;
+               else
+                  portx := portx - 1;
+                  panner_v_cleanup (f (top_y), portx, porty);
+               end if;
+
+            when Key_Delete_Line =>
+               --  decrease-lines
+               if porty <= top_y then
+                  Beep;
+               else
+                  porty := porty - 1;
+                  panner_h_cleanup (porty, f (top_x), portx);
+               end if;
+            when Key_Cursor_Left =>
+               --  pan leftwards
+               if basex > 0 then
+                  basex := basex - 1;
+               else
+                  Beep;
+               end if;
+            when Key_Cursor_Right =>
+               --  pan rightwards
+               --  if (basex + portx - (pymax > porty) < pxmax)
+               if basex + portx -
+                   Column_Position (greater (pymax, porty)) < pxmax
+               then
+                  --  if basex + portx  < pxmax or
+                  --      (pymax > porty and basex + portx - 1 < pxmax) then
+                  basex := basex + 1;
+               else
+                  Beep;
+               end if;
+
+            when Key_Cursor_Up =>
+               --  pan upwards
+               if basey > 0 then
+                  basey := basey - 1;
+               else
+                  Beep;
+               end if;
+
+            when Key_Cursor_Down =>
+               --  pan downwards
+               --  same as if (basey + porty - (pxmax > portx) < pymax)
+               if basey + porty -
+                   Line_Position (greater (pxmax, portx)) < pymax
+               then
+                  --  if (basey + porty  < pymax) or
+                  --      (pxmax > portx and basey + porty - 1 < pymax) then
+                  basey := basey + 1;
+               else
+                  Beep;
+               end if;
+
+            when  Character'Pos ('H') |
+              Key_Home |
+              Key_Find =>
+               basey := 0;
+
+            when   Character'Pos ('E') |
+              Key_End |
+              Key_Select =>
+               if pymax < porty then
+                  basey := 0;
+               else
+                  basey := pymax - porty;
+               end if;
+
+            when others =>
+               Beep;
+         end case;
+
+         --  more writing off the screen.
+         --  Interestingly, the exception is not handled if
+         --  we put a block around this.
+         --  declare --begin
+         if top_y /= 0 and top_x /= 0 then
+            Add (Line => top_y - 1, Column => top_x - 1,
+                 Ch => ACS_Map (ACS_Upper_Left_Corner));
+         end if;
+         if top_x /= 0 then
+            do_v_line (top_y, top_x - 1, ACS_Map (ACS_Vertical_Line), porty);
+         end if;
+         if top_y /= 0 then
+            do_h_line (top_y - 1, top_x, ACS_Map (ACS_Horizontal_Line), portx);
+         end if;
+         --  exception when Curses_Exception => null; end;
+
+         --  in C was ... pxmax > portx - 1
+         if scrollers and pxmax >= portx then
+            declare
+               length : constant Column_Position := portx - top_x - 1;
+               lowend, highend : Column_Position;
+            begin
+               --  Instead of using floats, I'll use integers only.
+               lowend := top_x + (basex * length) / pxmax;
+               highend := top_x + ((basex + length) * length) / pxmax;
+
+               do_h_line (porty - 1, top_x, ACS_Map (ACS_Horizontal_Line),
+                          lowend);
+               if highend < portx then
+                  Switch_Character_Attribute
+                    (Attr => (Reverse_Video => True, others => False),
+                     On => True);
+                  do_h_line (porty - 1, lowend, Blank2, highend + 1);
+                  Switch_Character_Attribute
+                    (Attr => (Reverse_Video => True, others => False),
+                     On => False);
+                  do_h_line (porty - 1, highend + 1,
+                             ACS_Map (ACS_Horizontal_Line), portx);
+               end if;
+            end;
+         else
+            do_h_line (porty - 1, top_x, ACS_Map (ACS_Horizontal_Line), portx);
+         end if;
+
+         if scrollers and pymax >= porty then
+            declare
+               length : constant Line_Position := porty - top_y - 1;
+               lowend, highend : Line_Position;
+            begin
+               lowend := top_y + (basey * length) / pymax;
+               highend := top_y + ((basey + length) * length) / pymax;
+
+               do_v_line (top_y, portx - 1, ACS_Map (ACS_Vertical_Line),
+                          lowend);
+               if highend < porty then
+                  Switch_Character_Attribute
+                    (Attr => (Reverse_Video => True, others => False),
+                     On => True);
+                  do_v_line (lowend, portx - 1, Blank2, highend + 1);
+                  Switch_Character_Attribute
+                    (Attr => (Reverse_Video => True, others => False),
+                     On => False);
+                  do_v_line (highend + 1, portx - 1,
+                             ACS_Map (ACS_Vertical_Line), porty);
+               end if;
+            end;
+         else
+            do_v_line (top_y, portx - 1, ACS_Map (ACS_Vertical_Line), porty);
+         end if;
+
+         if top_y /= 0 then
+            Add (Line => top_y - 1, Column => portx - 1,
+                 Ch => ACS_Map (ACS_Upper_Right_Corner));
+         end if;
+         if top_x /= 0 then
+            Add (Line => porty - 1, Column => top_x - 1,
+                 Ch => ACS_Map (ACS_Lower_Left_Corner));
+         end if;
+         declare
+         begin
+            --  Here is another place where it is possible
+            --  to write to the corner of the screen.
+            Add (Line => porty - 1, Column => portx - 1,
+                 Ch => ACS_Map (ACS_Lower_Right_Corner));
+            exception
+            when Curses_Exception => null;
+         end;
+
+         before := gettime;
+
+         Refresh_Without_Update;
+
+         declare
+            --  the C version allows the panel to have a zero height
+            --  which raise the exception
+         begin
+            Refresh_Without_Update
+              (
+               pad,
+               basey, basex,
+               top_y, top_x,
+               porty - Line_Position (greater (pxmax, portx)) - 1,
+               portx - Column_Position (greater (pymax, porty)) - 1);
+            exception
+            when Curses_Exception => null;
+         end;
+
+         Update_Screen;
+
+         if timing then
+            declare
+               s : String (1 .. 7);
+               elapsed : Long_Float;
+            begin
+               after := gettime;
+               elapsed := (Long_Float (after.seconds - before.seconds) +
+                           Long_Float (after.microseconds
+                                     - before.microseconds)
+                           / 1.0e6);
+               Move_Cursor (Line => Lines - 1, Column => Columns - 20);
+               floatio.Put (s, elapsed, Aft => 3, Exp => 0);
+               Add (Str => s);
+               Refresh;
+            end;
+         end if;
+
+         c := pgetc (pad);
+         exit when c = Key_Exit;
+
+      end loop;
+
+      Allow_Scrolling (Mode => True);
+
+   end panner;
+
+   Gridsize : constant := 3;
+   Gridcount : Integer := 0;
+
+   Pad_High : constant Line_Count :=  200;
+   Pad_Wide : constant Column_Count := 200;
+   panpad : Window := New_Pad (Pad_High, Pad_Wide);
+begin
+   if panpad = Null_Window then
+      Cannot ("cannot create requested pad");
+      return;
+   end if;
+
+   for i in 0 .. Pad_High - 1 loop
+      for j in 0 .. Pad_Wide - 1  loop
+         if i mod Gridsize = 0 and j mod Gridsize = 0 then
+            if i = 0 or j = 0 then
+               Add (panpad, '+');
+            else
+               --  depends on ASCII?
+               Add (panpad,
+                    Ch => Character'Val (Character'Pos ('A') +
+                                         Gridcount mod 26));
+               Gridcount := Gridcount + 1;
+            end if;
+         elsif i mod Gridsize = 0 then
+            Add (panpad, '-');
+         elsif j mod Gridsize = 0 then
+            Add (panpad, '|');
+         else
+            declare
+               --  handle the write to the lower right corner error
+            begin
+               Add (panpad, ' ');
+               exception
+               when Curses_Exception => null;
+            end;
+         end if;
+      end loop;
+   end loop;
+   panner_legend (Lines - 4);
+   panner_legend (Lines - 3);
+   panner_legend (Lines - 2);
+   panner_legend (Lines - 1);
+
+   Set_KeyPad_Mode (panpad, True);
+   --  Make the pad (initially) narrow enough that a trace file won't wrap.
+   --  We'll still be able to widen it during a test, since that's required
+   --  for testing boundaries.
+
+   panner (panpad, 2, 2, Lines - 5, Columns - 15, padgetch'Access);
+
+   Delete (panpad);
+   End_Windows; --  Hmm, Erase after End_Windows
+   Erase;
+end ncurses2.demo_pad;
diff --git a/Ada95/samples/ncurses2-demo_pad.ads b/Ada95/samples/ncurses2-demo_pad.ads
new file mode 100644
index 0000000..f110632
--- /dev/null
+++ b/Ada95/samples/ncurses2-demo_pad.ads
@@ -0,0 +1,42 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                 ncurses                                  --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000 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.                                                           --
+------------------------------------------------------------------------------
+--  Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
+--  Version Control
+--  $Revision: 1.2 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+procedure ncurses2.demo_pad;
diff --git a/Ada95/samples/ncurses2-demo_panels.adb b/Ada95/samples/ncurses2-demo_panels.adb
new file mode 100644
index 0000000..aa6ca36
--- /dev/null
+++ b/Ada95/samples/ncurses2-demo_panels.adb
@@ -0,0 +1,382 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                 ncurses                                  --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2018,2020 Thomas E. Dickey                                     --
+-- Copyright 2000-2008,2011 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.                                                           --
+------------------------------------------------------------------------------
+--  Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
+--  Version Control
+--  $Revision: 1.9 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with ncurses2.util; use ncurses2.util;
+with Terminal_Interface.Curses; use Terminal_Interface.Curses;
+with Terminal_Interface.Curses.Panels; use Terminal_Interface.Curses.Panels;
+with Terminal_Interface.Curses.Panels.User_Data;
+
+with ncurses2.genericPuts;
+
+procedure ncurses2.demo_panels (nap_mseci : Integer) is
+
+   function  mkpanel (color : Color_Number;
+                      rows  : Line_Count;
+                      cols  : Column_Count;
+                      tly   : Line_Position;
+                      tlx   : Column_Position) return Panel;
+   procedure rmpanel (pan : in out Panel);
+   procedure pflush;
+   procedure wait_a_while (msec : Integer);
+   procedure saywhat (text : String);
+   procedure fill_panel (pan : Panel);
+
+   nap_msec : Integer := nap_mseci;
+
+   function mkpanel (color : Color_Number;
+                     rows  : Line_Count;
+                     cols  : Column_Count;
+                     tly   : Line_Position;
+                     tlx   : Column_Position) return Panel is
+      win : Window;
+      pan : Panel := Null_Panel;
+   begin
+      win := New_Window (rows, cols, tly, tlx);
+      if Null_Window /= win then
+         pan := New_Panel (win);
+         if pan = Null_Panel then
+            Delete (win);
+         elsif Has_Colors then
+            declare
+               fg, bg : Color_Number;
+            begin
+               if color = Blue then
+                  fg := White;
+               else
+                  fg := Black;
+               end if;
+               bg := color;
+               Init_Pair (Color_Pair (color), fg, bg);
+               Set_Background (win, (Ch => ' ',
+                                     Attr => Normal_Video,
+                                     Color => Color_Pair (color)));
+            end;
+         else
+            Set_Background (win, (Ch => ' ',
+                                  Attr => (Bold_Character => True,
+                                           others => False),
+                                  Color => Color_Pair (color)));
+         end if;
+      end if;
+      return pan;
+   end mkpanel;
+
+   procedure rmpanel (pan : in out Panel) is
+      win : Window := Panel_Window (pan);
+   begin
+      Delete (pan);
+      Delete (win);
+   end rmpanel;
+
+   procedure pflush is
+   begin
+      Update_Panels;
+      Update_Screen;
+   end pflush;
+
+   procedure wait_a_while (msec : Integer) is
+   begin
+      --  The C version had some #ifdef blocks here
+      if msec = 1 then
+         Getchar;
+      else
+         Nap_Milli_Seconds (msec);
+      end if;
+   end wait_a_while;
+
+   procedure saywhat (text : String) is
+   begin
+      Move_Cursor (Line => Lines - 1, Column => 0);
+      Clear_To_End_Of_Line;
+      Add (Str => text);
+   end saywhat;
+
+   --  from sample-curses_demo.adb
+   type User_Data is new String (1 .. 2);
+   type User_Data_Access is access all User_Data;
+   package PUD is new Panels.User_Data (User_Data, User_Data_Access);
+
+   use PUD;
+
+   procedure fill_panel (pan : Panel) is
+      win : constant Window := Panel_Window (pan);
+      num : constant Character := Get_User_Data (pan).all (2);
+      tmp6 : String (1 .. 6) := "-panx-";
+      maxy : Line_Count;
+      maxx : Column_Count;
+
+   begin
+      Move_Cursor (win, 1, 1);
+      tmp6 (5) := num;
+      Add (win, Str => tmp6);
+      Clear_To_End_Of_Line (win);
+      Box (win);
+      Get_Size (win, maxy, maxx);
+      for y in 2 .. maxy - 3 loop
+         for x in 1 .. maxx - 3 loop
+            Move_Cursor (win, y, x);
+            Add (win, num);
+         end loop;
+      end loop;
+   exception
+   when Curses_Exception => null;
+   end fill_panel;
+
+   modstr : constant array (0 .. 5) of String (1 .. 5) :=
+     ("test ",
+      "TEST ",
+      "(**) ",
+      "*()* ",
+      "<--> ",
+      "LAST "
+      );
+
+   package p is new ncurses2.genericPuts (1024);
+   use p;
+   use p.BS;
+   --  the C version said register int y, x;
+   tmpb : BS.Bounded_String;
+
+begin
+   Refresh;
+
+   for y in 0 .. Integer (Lines - 2) loop
+      for x in 0 .. Integer (Columns - 1) loop
+         myPut (tmpb, (y + x) mod 10);
+         myAdd (Str => tmpb);
+      end loop;
+   end loop;
+   for y in 0 .. 4 loop
+      declare
+         p1, p2, p3, p4, p5 : Panel;
+         U1 : constant User_Data_Access := new User_Data'("p1");
+         U2 : constant User_Data_Access := new User_Data'("p2");
+         U3 : constant User_Data_Access := new User_Data'("p3");
+         U4 : constant User_Data_Access := new User_Data'("p4");
+         U5 : constant User_Data_Access := new User_Data'("p5");
+
+      begin
+         p1 := mkpanel (Red, Lines / 2 - 2, Columns / 8 + 1, 0, 0);
+         Set_User_Data (p1, U1);
+         p2 := mkpanel (Green, Lines / 2 + 1, Columns / 7, Lines / 4,
+                        Columns / 10);
+         Set_User_Data (p2, U2);
+         p3 := mkpanel (Yellow, Lines / 4, Columns / 10, Lines / 2,
+                        Columns / 9);
+         Set_User_Data (p3, U3);
+         p4 := mkpanel (Blue, Lines / 2 - 2, Columns / 8,  Lines / 2 - 2,
+                        Columns / 3);
+         Set_User_Data (p4, U4);
+         p5 := mkpanel (Magenta, Lines / 2 - 2, Columns / 8,  Lines / 2,
+                        Columns / 2 - 2);
+         Set_User_Data (p5, U5);
+
+         fill_panel (p1);
+         fill_panel (p2);
+         fill_panel (p3);
+         fill_panel (p4);
+         fill_panel (p5);
+         Hide (p4);
+         Hide (p5);
+         pflush;
+         saywhat ("press any key to continue");
+         wait_a_while (nap_msec);
+
+         saywhat ("h3 s1 s2 s4 s5; press any key to continue");
+         Move (p1, 0, 0);
+         Hide (p3);
+         Show (p1);
+         Show (p2);
+         Show (p4);
+         Show (p5);
+         pflush;
+         wait_a_while (nap_msec);
+
+         saywhat ("s1; press any key to continue");
+         Show (p1);
+         pflush;
+         wait_a_while (nap_msec);
+
+         saywhat ("s2; press any key to continue");
+         Show (p2);
+         pflush;
+         wait_a_while (nap_msec);
+
+         saywhat ("m2; press any key to continue");
+         Move (p2, Lines / 3 + 1, Columns / 8);
+         pflush;
+         wait_a_while (nap_msec);
+
+         saywhat ("s3;");
+         Show (p3);
+         pflush;
+         wait_a_while (nap_msec);
+
+         saywhat ("m3; press any key to continue");
+         Move (p3, Lines / 4 + 1, Columns / 15);
+         pflush;
+         wait_a_while (nap_msec);
+
+         saywhat ("b3; press any key to continue");
+         Bottom (p3);
+         pflush;
+         wait_a_while (nap_msec);
+
+         saywhat ("s4; press any key to continue");
+         Show (p4);
+         pflush;
+         wait_a_while (nap_msec);
+
+         saywhat ("s5; press any key to continue");
+         Show (p5);
+         pflush;
+         wait_a_while (nap_msec);
+
+         saywhat ("t3; press any key to continue");
+         Top (p3);
+         pflush;
+         wait_a_while (nap_msec);
+
+         saywhat ("t1; press any key to continue");
+         Top (p1);
+         pflush;
+         wait_a_while (nap_msec);
+
+         saywhat ("t2; press any key to continue");
+         Top (p2);
+         pflush;
+         wait_a_while (nap_msec);
+
+         saywhat ("t3; press any key to continue");
+         Top (p3);
+         pflush;
+         wait_a_while (nap_msec);
+
+         saywhat ("t4; press any key to continue");
+         Top (p4);
+         pflush;
+         wait_a_while (nap_msec);
+
+         for itmp in  0 ..  5 loop
+            declare
+               w4 : constant Window := Panel_Window (p4);
+               w5 : constant Window := Panel_Window (p5);
+            begin
+
+               saywhat ("m4; press any key to continue");
+               Move_Cursor (w4, Lines / 8, 1);
+               Add (w4, modstr (itmp));
+               Move (p4, Lines / 6, Column_Position (itmp) * (Columns / 8));
+               Move_Cursor (w5, Lines / 6, 1);
+               Add (w5, modstr (itmp));
+               pflush;
+               wait_a_while (nap_msec);
+
+               saywhat ("m5; press any key to continue");
+               Move_Cursor (w4, Lines / 6, 1);
+               Add (w4, modstr (itmp));
+               Move (p5, Lines / 3 - 1, (Column_Position (itmp) * 10) + 6);
+               Move_Cursor (w5, Lines / 8, 1);
+               Add (w5, modstr (itmp));
+               pflush;
+               wait_a_while (nap_msec);
+            end;
+         end loop;
+
+         saywhat ("m4; press any key to continue");
+         Move (p4, Lines / 6, 6 * (Columns / 8));
+         --  Move(p4, Lines / 6, itmp * (Columns / 8));
+         pflush;
+         wait_a_while (nap_msec);
+
+         saywhat ("t5; press any key to continue");
+         Top (p5);
+         pflush;
+         wait_a_while (nap_msec);
+
+         saywhat ("t2; press any key to continue");
+         Top (p2);
+         pflush;
+         wait_a_while (nap_msec);
+
+         saywhat ("t1; press any key to continue");
+         Top (p1);
+         pflush;
+         wait_a_while (nap_msec);
+
+         saywhat ("d2; press any key to continue");
+         rmpanel (p2);
+         pflush;
+         wait_a_while (nap_msec);
+
+         saywhat ("h3; press any key to continue");
+         Hide (p3);
+         pflush;
+         wait_a_while (nap_msec);
+
+         saywhat ("d1; press any key to continue");
+         rmpanel (p1);
+         pflush;
+         wait_a_while (nap_msec);
+
+         saywhat ("d4; press any key to continue");
+         rmpanel (p4);
+         pflush;
+         wait_a_while (nap_msec);
+
+         saywhat ("d5; press any key to continue");
+         rmpanel (p5);
+         pflush;
+         wait_a_while (nap_msec);
+         if nap_msec = 1 then
+            exit;
+         else
+            nap_msec := 100;
+         end if;
+
+      end;
+   end loop;
+
+   Erase;
+   End_Windows;
+
+end ncurses2.demo_panels;
diff --git a/Ada95/samples/ncurses2-demo_panels.ads b/Ada95/samples/ncurses2-demo_panels.ads
new file mode 100644
index 0000000..a35842d
--- /dev/null
+++ b/Ada95/samples/ncurses2-demo_panels.ads
@@ -0,0 +1,42 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                 ncurses                                  --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000 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.                                                           --
+------------------------------------------------------------------------------
+--  Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
+--  Version Control
+--  $Revision: 1.2 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+procedure ncurses2.demo_panels (nap_mseci : Integer);
diff --git a/Ada95/samples/ncurses2-flushinp_test.adb b/Ada95/samples/ncurses2-flushinp_test.adb
new file mode 100644
index 0000000..eca4733
--- /dev/null
+++ b/Ada95/samples/ncurses2-flushinp_test.adb
@@ -0,0 +1,136 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                 ncurses                                  --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000 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.                                                           --
+------------------------------------------------------------------------------
+--  Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
+--  Version Control
+--  $Revision: 1.2 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Terminal_Interface.Curses; use Terminal_Interface.Curses;
+with ncurses2.util; use ncurses2.util;
+
+procedure ncurses2.flushinp_test (win : Window) is
+
+   procedure Continue (win : Window);
+
+   procedure Continue (win : Window) is
+   begin
+      Set_Echo_Mode (False);
+      Move_Cursor (win, 10, 1);
+      Add (win, 10, 1, " Press any key to continue");
+      Refresh (win);
+      Getchar (win);
+   end Continue;
+
+   h, by, sh : Line_Position;
+   w, bx, sw : Column_Position;
+
+   subWin : Window;
+
+begin
+   Clear (win);
+   Get_Size (win, h, w);
+   Get_Window_Position (win, by, bx);
+   sw := w / 3;
+   sh := h / 3;
+   subWin := Sub_Window (win, sh, sw, by + h - sh - 2, bx + w - sw - 2);
+
+   if Has_Colors then
+      Init_Pair (2, Cyan, Blue);
+      Change_Background (subWin,
+                         Attributed_Character'(Ch => ' ', Color => 2,
+                                               Attr => Normal_Video));
+   end if;
+
+   Set_Character_Attributes (subWin,
+                             (Bold_Character => True, others => False));
+   Box (subWin);
+   Add (subWin, 2, 1, "This is a subwindow");
+   Refresh (win);
+
+   Set_Cbreak_Mode (True);
+   Add (win, 0, 1, "This is a test of the flushinp() call.");
+
+   Add (win, 2, 1, "Type random keys for 5 seconds.");
+   Add (win, 3, 1,
+        "These should be discarded (not echoed) after the subwindow " &
+        "goes away.");
+   Refresh (win);
+
+   for i in 0 .. 4 loop
+      Move_Cursor (subWin, 1, 1);
+      Add (subWin, Str => "Time = ");
+      Add (subWin, Str => Integer'Image (i));
+      Refresh (subWin);
+      Nap_Milli_Seconds (1000);
+      Flush_Input;
+   end loop;
+
+   Delete (subWin);
+   Erase (win);
+   Flash_Screen;
+   Refresh (win);
+   Nap_Milli_Seconds (1000);
+
+   Add (win, 2, 1,
+        Str => "If you were still typing when the window timer expired,");
+   Add (win, 3, 1,
+        "or else you typed nothing at all while it was running,");
+   Add (win, 4, 1,
+        "test was invalid.  You'll see garbage or nothing at all. ");
+   Add (win, 6, 1, "Press a key");
+   Move_Cursor (win, 9, 10);
+   Refresh (win);
+   Set_Echo_Mode (True);
+   Getchar (win);
+   Flush_Input;
+   Add (win, 12, 0,
+        "If you see any key other than what you typed, flushinp() is broken.");
+   Continue (win);
+
+   Move_Cursor (win, 9, 10);
+   Delete_Character (win);
+   Refresh (win);
+   Move_Cursor (win, 12, 0);
+   Clear_To_End_Of_Line;
+   Add (win,
+        "What you typed should now have been deleted; if not, wdelch() " &
+        "failed.");
+   Continue (win);
+
+   Set_Cbreak_Mode (True);
+
+end ncurses2.flushinp_test;
diff --git a/Ada95/samples/ncurses2-flushinp_test.ads b/Ada95/samples/ncurses2-flushinp_test.ads
new file mode 100644
index 0000000..ca8244e
--- /dev/null
+++ b/Ada95/samples/ncurses2-flushinp_test.ads
@@ -0,0 +1,44 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                 ncurses                                  --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000 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.                                                           --
+------------------------------------------------------------------------------
+--  Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
+--  Version Control
+--  $Revision: 1.2 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Terminal_Interface.Curses;
+
+procedure ncurses2.flushinp_test (win : Terminal_Interface.Curses.Window);
diff --git a/Ada95/samples/ncurses2-genericputs.adb b/Ada95/samples/ncurses2-genericputs.adb
new file mode 100644
index 0000000..71d1c16
--- /dev/null
+++ b/Ada95/samples/ncurses2-genericputs.adb
@@ -0,0 +1,118 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                 ncurses                                  --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000-2008,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
+--  Version Control
+--  $Revision: 1.5 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Terminal_Interface.Curses; use Terminal_Interface.Curses;
+with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux;
+
+package body ncurses2.genericPuts is
+
+   procedure myGet (Win : Window := Standard_Window;
+                    Str : out BS.Bounded_String;
+                    Len : Integer := -1)
+   is
+      function Wgetnstr (Win : Window;
+                         Str : char_array;
+                         Len : int) return int;
+      pragma Import (C, Wgetnstr, "wgetnstr");
+
+      N        : Integer := Len;
+      Txt : char_array (0 .. size_t (Max_Length));
+      xStr : String (1 .. Max_Length);
+      Cnt : Natural;
+   begin
+      if N < 0 then
+         N := Max_Length;
+      end if;
+      if N > Max_Length then
+         raise Constraint_Error;
+      end if;
+      Txt (0) := Interfaces.C.char'First;
+      if Wgetnstr (Win, Txt, C_Int (N)) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+      To_Ada (Txt, xStr, Cnt, True);
+      Str := To_Bounded_String (xStr (1 .. Cnt));
+   end myGet;
+
+   procedure myPut (Str  : out BS.Bounded_String;
+                    i    : Integer;
+                    Base : Number_Base := 10) is
+      package Int_IO is new Integer_IO (Integer); use Int_IO;
+      tmp : String (1 .. BS.Max_Length);
+   begin
+      Put (tmp, i, Base);
+      Str := To_Bounded_String (tmp);
+      Trim (Str, Ada.Strings.Trim_End'(Ada.Strings.Left));
+   end myPut;
+
+   procedure myAdd (Str : BS.Bounded_String) is
+   begin
+      Add (Str => To_String (Str));
+   end myAdd;
+
+   --  from ncurses-aux
+   procedure Fill_String (Cp  : chars_ptr;
+                          Str : out BS.Bounded_String)
+   is
+      --  Fill the string with the characters referenced by the
+      --  chars_ptr.
+      --
+      Len : Natural;
+   begin
+      if Cp /= Null_Ptr then
+         Len := Natural (Strlen (Cp));
+         if Max_Length < Len then
+            raise Constraint_Error;
+         end if;
+         declare
+            S : String (1 .. Len);
+         begin
+            S := Value (Cp);
+            Str := To_Bounded_String (S);
+         end;
+      else
+         Str := Null_Bounded_String;
+      end if;
+
+   end Fill_String;
+
+end ncurses2.genericPuts;
diff --git a/Ada95/samples/ncurses2-genericputs.ads b/Ada95/samples/ncurses2-genericputs.ads
new file mode 100644
index 0000000..41f2c9b
--- /dev/null
+++ b/Ada95/samples/ncurses2-genericputs.ads
@@ -0,0 +1,73 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                 ncurses                                  --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000-2006,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
+--  Version Control
+--  $Revision: 1.4 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+
+with Ada.Text_IO; use Ada.Text_IO;
+with Ada.Strings.Bounded;
+use Ada.Strings.Bounded;
+with Interfaces.C; use Interfaces.C;
+with Interfaces.C.Strings; use Interfaces.C.Strings;
+with Terminal_Interface.Curses;
+
+generic
+   Max : Natural;
+   --   type mystring is private;
+   --   type myint is
+package ncurses2.genericPuts is
+   package BS is new
+     Ada.Strings.Bounded.Generic_Bounded_Length (Max);
+   use BS;
+
+   procedure myGet (Win : Terminal_Interface.Curses.Window
+                       := Terminal_Interface.Curses.Standard_Window;
+                    Str : out BS.Bounded_String;
+                    Len :  Integer := -1);
+
+   procedure myPut (Str  : out BS.Bounded_String;
+                    i    : Integer;
+                    Base : Number_Base := 10);
+   --  the default should be Ada.Text_IO.Integer_IO.Default_Base
+   --  but Default_Base is hidden in the generic so doesn't exist!
+   procedure myAdd (Str : BS.Bounded_String);
+
+   procedure Fill_String (Cp : chars_ptr; Str : out BS.Bounded_String);
+end ncurses2.genericPuts;
diff --git a/Ada95/samples/ncurses2-getch.ads b/Ada95/samples/ncurses2-getch.ads
new file mode 100644
index 0000000..7fabce9
--- /dev/null
+++ b/Ada95/samples/ncurses2-getch.ads
@@ -0,0 +1,42 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                 ncurses                                  --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000 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.                                                           --
+------------------------------------------------------------------------------
+--  Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
+--  Version Control
+--  $Revision: 1.2 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+procedure getch_test;
diff --git a/Ada95/samples/ncurses2-getch_test.adb b/Ada95/samples/ncurses2-getch_test.adb
new file mode 100644
index 0000000..8bcb7a4
--- /dev/null
+++ b/Ada95/samples/ncurses2-getch_test.adb
@@ -0,0 +1,257 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                 ncurses                                  --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000-2009,2014 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.                                                           --
+------------------------------------------------------------------------------
+--  Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
+--  Version Control
+--  $Revision: 1.10 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+--  Character input test
+--  test the keypad feature
+
+with ncurses2.util; use ncurses2.util;
+
+with Terminal_Interface.Curses; use Terminal_Interface.Curses;
+with Terminal_Interface.Curses.Mouse; use Terminal_Interface.Curses.Mouse;
+with Ada.Characters.Handling;
+with Ada.Strings.Bounded;
+
+with ncurses2.genericPuts;
+
+procedure ncurses2.getch_test is
+   use Int_IO;
+
+   function mouse_decode (ep : Mouse_Event) return String;
+
+   function mouse_decode (ep : Mouse_Event) return String is
+      Y      : Line_Position;
+      X      : Column_Position;
+      Button : Mouse_Button;
+      State  : Button_State;
+      package BS is new Ada.Strings.Bounded.Generic_Bounded_Length (200);
+      use BS;
+      buf : Bounded_String := To_Bounded_String ("");
+   begin
+      --  Note that these bindings do not allow
+      --  two button states,
+      --  The C version can print {click-1, click-3} for example.
+      --  They also don't have the 'id' or z coordinate.
+      Get_Event (ep, Y, X, Button, State);
+
+      --  TODO Append (buf, "id "); from C version
+      Append (buf, "at (");
+      Append (buf, Column_Position'Image (X));
+      Append (buf, ", ");
+      Append (buf, Line_Position'Image (Y));
+      Append (buf, ") state");
+      Append (buf, Mouse_Button'Image (Button));
+
+      Append (buf, " = ");
+      Append (buf, Button_State'Image (State));
+      return To_String (buf);
+   end mouse_decode;
+
+   buf : String (1 .. 1024); --  TODO was BUFSIZE
+   n : Integer;
+   c : Key_Code;
+   blockflag : Timeout_Mode := Blocking;
+   firsttime : Boolean := True;
+   tmp2  : Event_Mask;
+   tmp6 : String (1 .. 6);
+   tmp20 : String (1 .. 20);
+   x : Column_Position;
+   y : Line_Position;
+   tmpx : Integer;
+   incount : Integer := 0;
+
+begin
+   Refresh;
+   tmp2 := Start_Mouse (All_Events);
+   Add (Str => "Delay in 10ths of a second (<CR> for blocking input)? ");
+   Set_Echo_Mode (SwitchOn => True);
+   Get (Str => buf);
+
+   Set_Echo_Mode (SwitchOn => False);
+   Set_NL_Mode (SwitchOn => False);
+
+   if Ada.Characters.Handling.Is_Digit (buf (1)) then
+      Get (Item => n, From => buf, Last => tmpx);
+      Set_Timeout_Mode (Mode => Delayed, Amount => n * 100);
+      blockflag := Delayed;
+   end if;
+
+   c := Character'Pos ('?');
+   Set_Raw_Mode (SwitchOn => True);
+   loop
+      if not firsttime then
+         Add (Str => "Key pressed: ");
+         Put (tmp6, Integer (c), 8);
+         Add (Str => tmp6);
+         Add (Ch => ' ');
+         if c = Key_Mouse then
+            declare
+               event : Mouse_Event;
+            begin
+               event := Get_Mouse;
+               Add (Str => "KEY_MOUSE, ");
+               Add (Str => mouse_decode (event));
+               Add (Ch => newl);
+            end;
+         elsif c >= Key_Min then
+            Key_Name (c, tmp20);
+            Add (Str => tmp20);
+            --  I used tmp and got bitten by the length problem:->
+            Add (Ch => newl);
+         elsif c > 16#80# then --  TODO fix, use constant if possible
+            declare
+               c2 : constant Character := Character'Val (c mod 16#80#);
+            begin
+               if Ada.Characters.Handling.Is_Graphic (c2) then
+                  Add (Str => "M-");
+                  Add (Ch => c2);
+               else
+                  Add (Str => "M-");
+                  Add (Str => Un_Control ((Ch => c2,
+                                           Color => Color_Pair'First,
+                                           Attr => Normal_Video)));
+               end if;
+               Add (Str => " (high-half character)");
+               Add (Ch => newl);
+            end;
+         else
+            declare
+               c2 : constant Character := Character'Val (c mod 16#80#);
+            begin
+               if Ada.Characters.Handling.Is_Graphic (c2) then
+                  Add (Ch => c2);
+                  Add (Str => " (ASCII printable character)");
+                  Add (Ch => newl);
+               else
+                  Add (Str => Un_Control ((Ch => c2,
+                                          Color => Color_Pair'First,
+                                          Attr => Normal_Video)));
+                  Add (Str => " (ASCII control character)");
+                  Add (Ch => newl);
+               end if;
+            end;
+         end if;
+         --  TODO I am not sure why this was in the C version
+         --  the delay statement scroll anyway.
+         Get_Cursor_Position (Line => y, Column => x);
+         if y >= Lines - 1 then
+            Move_Cursor (Line => 0, Column => 0);
+         end if;
+         Clear_To_End_Of_Line;
+      end if;
+
+      firsttime := False;
+      if c = Character'Pos ('g') then
+         declare
+            package p is new ncurses2.genericPuts (1024);
+            use p;
+            use p.BS;
+            timedout : Boolean := False;
+            boundedbuf : Bounded_String;
+         begin
+            Add (Str => "getstr test: ");
+            Set_Echo_Mode (SwitchOn => True);
+            --  Note that if delay mode is set
+            --  Get can raise an exception.
+            --  The C version would print the string it had so far
+            --  also TODO get longer length string, like the C version
+            declare begin
+               myGet (Str => boundedbuf);
+            exception when Curses_Exception =>
+               Add (Str => "Timed out.");
+               Add (Ch => newl);
+               timedout := True;
+            end;
+            --  note that the Ada Get will stop reading at 1024.
+            if not timedout then
+               Set_Echo_Mode (SwitchOn => False);
+               Add (Str => " I saw '");
+               myAdd (Str => boundedbuf);
+               Add (Str => "'.");
+               Add (Ch => newl);
+            end if;
+         end;
+      elsif c = Character'Pos ('s') then
+         ShellOut (True);
+      elsif c = Character'Pos ('x') or
+            c = Character'Pos ('q') or
+           (c = Key_None and blockflag = Blocking)
+      then
+         exit;
+      elsif c = Character'Pos ('?') then
+         Add (Str => "Type any key to see its keypad value.  Also:");
+         Add (Ch => newl);
+         Add (Str => "g -- triggers a getstr test");
+         Add (Ch => newl);
+         Add (Str => "s -- shell out");
+         Add (Ch => newl);
+         Add (Str => "q -- quit");
+         Add (Ch => newl);
+         Add (Str => "? -- repeats this help message");
+         Add (Ch => newl);
+      end if;
+
+      loop
+         c := Getchar;
+         exit when c /= Key_None;
+         if blockflag /= Blocking then
+            Put (tmp6, incount); --  argh string length!
+            Add (Str => tmp6);
+            Add (Str => ": input timed out");
+            Add (Ch => newl);
+         else
+            Put (tmp6, incount);
+            Add (Str => tmp6);
+            Add (Str => ": input error");
+            Add (Ch => newl);
+            exit;
+         end if;
+         incount := incount + 1;
+      end loop;
+   end loop;
+
+   End_Mouse (tmp2);
+   Set_Timeout_Mode (Mode => Blocking, Amount => 0); --  amount is ignored
+   Set_Raw_Mode (SwitchOn => False);
+   Set_NL_Mode (SwitchOn => True);
+   Erase;
+   End_Windows;
+end ncurses2.getch_test;
diff --git a/Ada95/samples/ncurses2-getch_test.ads b/Ada95/samples/ncurses2-getch_test.ads
new file mode 100644
index 0000000..01e1928
--- /dev/null
+++ b/Ada95/samples/ncurses2-getch_test.ads
@@ -0,0 +1,42 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                 ncurses                                  --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000 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.                                                           --
+------------------------------------------------------------------------------
+--  Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
+--  Version Control
+--  $Revision: 1.2 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+procedure ncurses2.getch_test;
diff --git a/Ada95/samples/ncurses2-getopt.adb b/Ada95/samples/ncurses2-getopt.adb
new file mode 100644
index 0000000..7c902f9
--- /dev/null
+++ b/Ada95/samples/ncurses2-getopt.adb
@@ -0,0 +1,164 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                 ncurses                                  --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000-2008,2011 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.                                                           --
+------------------------------------------------------------------------------
+--  Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
+--  Version Control
+--  $Revision: 1.9 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+--  A simplified version of the  GNU getopt function
+--  copyright Free Software Foundtion
+
+with Ada.Strings.Fixed;
+with Ada.Strings.Bounded;
+with Ada.Text_IO; use Ada.Text_IO;
+
+package body ncurses2.getopt is
+
+   nextchar : Natural := 0;
+
+   --  Ncurses doesn't use the non option elements so we are spared
+   --  the job of computing those.
+
+   --  also the user is not allowed to modify argv or argc
+   --  Doing so is Erroneous execution.
+
+   --  long options are not handled.
+
+   procedure Qgetopt (retval : out Integer;
+                      argc : Integer;
+                      argv : stringfunc;
+                        --  argv will be the Argument function.
+                      optstring : String;
+                      optind : in out Integer;
+                        --  ignored for ncurses, must be initialized to 1 by
+                        --  the caller
+                      Optarg : out stringa
+                        --  a garbage collector would be useful here.
+                     ) is
+
+      package BS is new Ada.Strings.Bounded.Generic_Bounded_Length (200);
+      use BS;
+      optargx : Bounded_String;
+   begin
+
+      if argc < optind then
+         retval := -1;
+         return;
+      end if;
+
+      optargx := To_Bounded_String ("");
+
+      if nextchar = 0 then
+
+         if argv (optind) = "--" then
+                           --  the rest are non-options, we ignore them
+            retval := -1;
+            return;
+         end if;
+
+         if argv (optind)(1) /= '-' or argv (optind)'Length = 1 then
+            optind := optind + 1;
+            Optarg := new String'(argv (optind));
+            retval := 1;
+            return;
+         end if;
+
+         nextchar := 2; -- skip the one hyphen.
+      end if;
+
+      --  Look at and handle the next short option-character.
+      declare
+         c : Character := argv (optind) (nextchar);
+         temp : constant Natural :=
+           Ada.Strings.Fixed.Index (optstring, String'(1 => c));
+      begin
+         if temp = 0 or c = ':' then
+            Put_Line (Standard_Error,
+                      argv (optind) & ": invalid option -- " & c);
+            c := '?';
+            return;
+         end if;
+
+         if optstring (temp + 1) = ':' then
+            if optstring (temp + 2) = ':' then
+               --  This is an option that accepts an argument optionally.
+               if nextchar /= argv (optind)'Length then
+                  optargx := To_Bounded_String
+                    (argv (optind) (nextchar .. argv (optind)'Length));
+               else
+                  Optarg := null;
+               end if;
+            else
+               --  This is an option that requires an argument.
+               if nextchar /= argv (optind)'Length then
+                  optargx := To_Bounded_String
+                    (argv (optind) (nextchar .. argv (optind)'Length));
+                  optind := optind + 1;
+               elsif optind = argc then
+                  Put_Line (Standard_Error,
+                            argv (optind) &
+                            ": option requires an argument -- " & c);
+                  if optstring (optstring'First) = ':'  then
+                     c := ':';
+                  else
+                     c := '?';
+                  end if;
+               else
+                  --  increment it again when taking next ARGV-elt as argument.
+                  optind := optind + 1;
+                  optargx := To_Bounded_String (argv (optind));
+                  optind := optind + 1;
+               end if;
+            end if;
+            nextchar := 0;
+         else -- no argument for the option
+            if nextchar = argv (optind)'Length then
+               optind := optind + 1;
+               nextchar := 0;
+            else
+               nextchar := nextchar + 1;
+            end if;
+         end if;
+
+         retval := Character'Pos (c);
+         Optarg := new String'(To_String (optargx));
+         return;
+      end;
+   end Qgetopt;
+
+end ncurses2.getopt;
diff --git a/Ada95/samples/ncurses2-getopt.ads b/Ada95/samples/ncurses2-getopt.ads
new file mode 100644
index 0000000..09d997c
--- /dev/null
+++ b/Ada95/samples/ncurses2-getopt.ads
@@ -0,0 +1,61 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                 ncurses                                  --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000,2006 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.                                                           --
+------------------------------------------------------------------------------
+--  Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
+--  Version Control
+--  $Revision: 1.3 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+package ncurses2.getopt is
+
+   type stringa is access String;
+
+   type stringfunc is access
+     function (n : Positive) return String;
+
+   procedure Qgetopt (retval    : out Integer;
+                      argc      : Integer;
+                      argv      : stringfunc;
+                      optstring : String;
+                      optind    : in out Integer;
+                        --  ignored for ncurses, must be initialized to 0
+                        --  by the caller
+                      Optarg    : out stringa
+                        --  a garbage collector would be useful here.
+                     );
+
+end ncurses2.getopt;
diff --git a/Ada95/samples/ncurses2-m.adb b/Ada95/samples/ncurses2-m.adb
new file mode 100644
index 0000000..e8a837d
--- /dev/null
+++ b/Ada95/samples/ncurses2-m.adb
@@ -0,0 +1,446 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                 ncurses                                  --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2018,2020 Thomas E. Dickey                                     --
+-- Copyright 2000-2007,2008 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.                                                           --
+------------------------------------------------------------------------------
+--  Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
+--  Version Control
+--  $Revision: 1.11 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+--  TODO use Default_Character where appropriate
+
+--  This is an Ada version of ncurses
+--  I translated this because it tests the most features.
+
+with Terminal_Interface.Curses; use Terminal_Interface.Curses;
+with Terminal_Interface.Curses.Trace; use Terminal_Interface.Curses.Trace;
+
+with Ada.Text_IO; use Ada.Text_IO;
+
+with Ada.Characters.Latin_1;
+
+with Ada.Command_Line; use Ada.Command_Line;
+
+with Ada.Strings.Unbounded;
+
+with ncurses2.util; use ncurses2.util;
+with ncurses2.getch_test;
+with ncurses2.attr_test;
+with ncurses2.color_test;
+with ncurses2.demo_panels;
+with ncurses2.color_edit;
+with ncurses2.slk_test;
+with ncurses2.acs_display;
+with ncurses2.acs_and_scroll;
+with ncurses2.flushinp_test;
+with ncurses2.test_sgr_attributes;
+with ncurses2.menu_test;
+with ncurses2.demo_pad;
+with ncurses2.demo_forms;
+with ncurses2.overlap_test;
+with ncurses2.trace_set;
+
+with ncurses2.getopt; use ncurses2.getopt;
+
+package body ncurses2.m is
+
+   function To_trace (n : Integer) return Trace_Attribute_Set;
+   procedure usage;
+   procedure Set_Terminal_Modes;
+   function Do_Single_Test (c : Character) return Boolean;
+
+   function To_trace (n : Integer) return Trace_Attribute_Set is
+      a : Trace_Attribute_Set := (others => False);
+      m : Integer;
+      rest : Integer;
+   begin
+      m := n  mod 2;
+      if 1 = m then
+         a.Times := True;
+      end if;
+      rest := n / 2;
+
+      m := rest mod 2;
+      if 1 = m then
+         a.Tputs := True;
+      end if;
+      rest := rest / 2;
+      m := rest mod 2;
+      if 1 = m then
+         a.Update := True;
+      end if;
+      rest := rest / 2;
+      m := rest mod 2;
+      if 1 = m then
+         a.Cursor_Move := True;
+      end if;
+      rest := rest / 2;
+      m := rest mod 2;
+      if 1 = m then
+         a.Character_Output := True;
+      end if;
+      rest := rest / 2;
+      m := rest mod 2;
+      if 1 = m then
+         a.Calls := True;
+      end if;
+      rest := rest / 2;
+      m := rest mod 2;
+      if 1 = m then
+         a.Virtual_Puts := True;
+      end if;
+      rest := rest / 2;
+      m := rest mod 2;
+      if 1 = m then
+         a.Input_Events := True;
+      end if;
+      rest := rest / 2;
+      m := rest mod 2;
+      if 1 = m then
+         a.TTY_State := True;
+      end if;
+      rest := rest / 2;
+      m := rest mod 2;
+      if 1 = m then
+         a.Internal_Calls := True;
+      end if;
+      rest := rest / 2;
+      m := rest mod 2;
+      if 1 = m then
+         a.Character_Calls := True;
+      end if;
+      rest := rest / 2;
+      m := rest mod 2;
+      if 1 = m then
+         a.Termcap_TermInfo := True;
+      end if;
+
+      return a;
+   end To_trace;
+
+   --   these are type Stdscr_Init_Proc;
+
+   function rip_footer (
+                        Win : Window;
+                        Columns : Column_Count) return Integer;
+   pragma Convention (C, rip_footer);
+
+   function rip_footer (
+                        Win : Window;
+                        Columns : Column_Count) return Integer is
+   begin
+      Set_Background (Win, (Ch => ' ',
+                            Attr => (Reverse_Video => True, others => False),
+                            Color => 0));
+      Erase (Win);
+      Move_Cursor (Win, 0, 0);
+      Add (Win, "footer:"  & Columns'Img & " columns");
+      Refresh_Without_Update (Win);
+      return 0; -- Curses_OK;
+   end rip_footer;
+
+   function rip_header (
+                        Win : Window;
+                        Columns : Column_Count) return Integer;
+   pragma Convention (C, rip_header);
+
+   function rip_header (
+                        Win : Window;
+                        Columns : Column_Count) return Integer is
+   begin
+      Set_Background (Win, (Ch => ' ',
+                            Attr => (Reverse_Video => True, others => False),
+                            Color => 0));
+      Erase (Win);
+      Move_Cursor (Win, 0, 0);
+      Add (Win, "header:"  & Columns'Img & " columns");
+      --  'Img is a GNAT extension
+      Refresh_Without_Update (Win);
+      return 0; -- Curses_OK;
+   end rip_header;
+
+   procedure usage is
+      --  type Stringa is access String;
+      use Ada.Strings.Unbounded;
+      --  tbl : constant array (Positive range <>) of Stringa := (
+      tbl : constant array (Positive range <>) of Unbounded_String
+        := (
+            To_Unbounded_String ("Usage: ncurses [options]"),
+            To_Unbounded_String (""),
+            To_Unbounded_String ("Options:"),
+            To_Unbounded_String ("  -a f,b   set default-colors " &
+                                 "(assumed white-on-black)"),
+            To_Unbounded_String ("  -d       use default-colors if terminal " &
+                                 "supports them"),
+            To_Unbounded_String ("  -e fmt   specify format for soft-keys " &
+                                 "test (e)"),
+            To_Unbounded_String ("  -f       rip-off footer line " &
+                                 "(can repeat)"),
+            To_Unbounded_String ("  -h       rip-off header line " &
+                                 "(can repeat)"),
+            To_Unbounded_String ("  -s msec  specify nominal time for " &
+                                 "panel-demo (default: 1, to hold)"),
+            To_Unbounded_String ("  -t mask  specify default trace-level " &
+                                 "(may toggle with ^T)")
+            );
+   begin
+      for n in tbl'Range loop
+         Put_Line (Standard_Error, To_String (tbl (n)));
+      end loop;
+      --     exit(EXIT_FAILURE);
+      --  TODO should we use Set_Exit_Status and throw and exception?
+   end usage;
+
+   procedure Set_Terminal_Modes is begin
+      Set_Raw_Mode (SwitchOn => False);
+      Set_Cbreak_Mode (SwitchOn => True);
+      Set_Echo_Mode (SwitchOn => False);
+      Allow_Scrolling (Mode => True);
+      Use_Insert_Delete_Line (Do_Idl => True);
+      Set_KeyPad_Mode (SwitchOn => True);
+   end Set_Terminal_Modes;
+
+   nap_msec : Integer := 1;
+
+   function Do_Single_Test (c : Character) return Boolean is
+   begin
+      case c is
+         when 'a' =>
+            getch_test;
+         when 'b' =>
+            attr_test;
+         when 'c' =>
+            if not Has_Colors then
+               Cannot ("does not support color.");
+            else
+               color_test;
+            end if;
+         when 'd' =>
+            if not Has_Colors then
+               Cannot ("does not support color.");
+            elsif not Can_Change_Color then
+               Cannot ("has hardwired color values.");
+            else
+               color_edit;
+            end if;
+         when 'e' =>
+            slk_test;
+         when 'f' =>
+            acs_display;
+         when 'o' =>
+            demo_panels (nap_msec);
+         when 'g' =>
+            acs_and_scroll;
+         when 'i' =>
+            flushinp_test (Standard_Window);
+         when 'k' =>
+            test_sgr_attributes;
+         when 'm' =>
+            menu_test;
+         when 'p' =>
+            demo_pad;
+         when 'r' =>
+            demo_forms;
+         when 's' =>
+            overlap_test;
+         when 't' =>
+            trace_set;
+         when '?' =>
+            null;
+         when others => return False;
+      end case;
+      return True;
+   end Do_Single_Test;
+
+   command : Character;
+   my_e_param : Soft_Label_Key_Format := Four_Four;
+   assumed_colors : Boolean := False;
+   default_colors : Boolean := False;
+   default_fg : Color_Number := White;
+   default_bg : Color_Number := Black;
+   --  nap_msec was an unsigned long integer in the C version,
+   --  yet napms only takes an int!
+
+   c : Integer;
+   c2 : Character;
+   optind : Integer := 1; -- must be initialized to one.
+   optarg : getopt.stringa;
+
+   length : Integer;
+   tmpi : Integer;
+
+   package myio is new Ada.Text_IO.Integer_IO (Integer);
+
+   save_trace : Integer := 0;
+   save_trace_set : Trace_Attribute_Set;
+
+   function main return Integer is
+   begin
+      loop
+         Qgetopt (c, Argument_Count, Argument'Access,
+                  "a:de:fhs:t:", optind, optarg);
+         exit when c = -1;
+         c2 := Character'Val (c);
+         case c2 is
+            when 'a' =>
+               --  Ada doesn't have scanf, it doesn't even have a
+               --  regular expression library.
+               assumed_colors := True;
+               myio.Get (optarg.all, Integer (default_fg), length);
+               myio.Get (optarg.all (length + 2 .. optarg.all'Length),
+                         Integer (default_bg), length);
+            when 'd' =>
+               default_colors := True;
+            when 'e' =>
+               myio.Get (optarg.all, tmpi, length);
+               if tmpi > 3 then
+                  usage;
+                  return 1;
+               end if;
+               my_e_param := Soft_Label_Key_Format'Val (tmpi);
+            when 'f' =>
+               Rip_Off_Lines (-1, rip_footer'Access);
+            when 'h' =>
+               Rip_Off_Lines (1, rip_header'Access);
+            when 's' =>
+               myio.Get (optarg.all, nap_msec, length);
+            when 't' =>
+               myio.Get (optarg.all, save_trace, length);
+            when others =>
+               usage;
+               return 1;
+         end case;
+      end loop;
+
+      --  the C version had a bunch of macros here.
+
+      --   if (!isatty(fileno(stdin)))
+      --   isatty is not available in the standard Ada so skip it.
+      save_trace_set := To_trace (save_trace);
+      Trace_On (save_trace_set);
+
+      Init_Soft_Label_Keys (my_e_param);
+
+      Init_Screen;
+      Set_Background (Ch => (Ch    => Blank,
+                             Attr  => Normal_Video,
+                             Color => Color_Pair'First));
+
+      if Has_Colors then
+         Start_Color;
+         if default_colors then
+            Use_Default_Colors;
+         elsif assumed_colors then
+            Assume_Default_Colors (default_fg, default_bg);
+         end if;
+      end if;
+
+      Set_Terminal_Modes;
+      Save_Curses_Mode (Curses);
+
+      End_Windows;
+
+      --  TODO add macro #if blocks.
+      Put_Line ("Welcome to " & Curses_Version & ".  Press ? for help.");
+
+      loop
+         Put_Line ("This is the ncurses main menu");
+         Put_Line ("a = keyboard and mouse input test");
+         Put_Line ("b = character attribute test");
+         Put_Line ("c = color test pattern");
+         Put_Line ("d = edit RGB color values");
+         Put_Line ("e = exercise soft keys");
+         Put_Line ("f = display ACS characters");
+         Put_Line ("g = display windows and scrolling");
+         Put_Line ("i = test of flushinp()");
+         Put_Line ("k = display character attributes");
+         Put_Line ("m = menu code test");
+         Put_Line ("o = exercise panels library");
+         Put_Line ("p = exercise pad features");
+         Put_Line ("q = quit");
+         Put_Line ("r = exercise forms code");
+         Put_Line ("s = overlapping-refresh test");
+         Put_Line ("t = set trace level");
+         Put_Line ("? = repeat this command summary");
+
+         Put ("> ");
+         Flush;
+
+         command := Ada.Characters.Latin_1.NUL;
+         --              get_input:
+         --              loop
+         declare
+            Ch : Character;
+         begin
+            Get (Ch);
+            --  TODO if read(ch) <= 0
+            --  TODO ada doesn't have an Is_Space function
+            command := Ch;
+            --  TODO if ch = '\n' or '\r' are these in Ada?
+         end;
+         --              end loop get_input;
+
+         declare
+         begin
+            if Do_Single_Test (command) then
+               Flush_Input;
+               Set_Terminal_Modes;
+               Reset_Curses_Mode (Curses);
+               Clear;
+               Refresh;
+               End_Windows;
+               if command = '?' then
+                  Put_Line ("This is the ncurses capability tester.");
+                  Put_Line ("You may select a test from the main menu by " &
+                            "typing the");
+                  Put_Line ("key letter of the choice (the letter to left " &
+                            "of the =)");
+                  Put_Line ("at the > prompt.  The commands `x' or `q' will " &
+                            "exit.");
+               end if;
+               --  continue; --why continue in the C version?
+            end if;
+         exception
+            when Curses_Exception => End_Windows;
+         end;
+
+         exit when command = 'q';
+      end loop;
+      Curses_Free_All;
+      return 0; -- TODO ExitProgram(EXIT_SUCCESS);
+   end main;
+
+end ncurses2.m;
diff --git a/Ada95/samples/ncurses2-m.ads b/Ada95/samples/ncurses2-m.ads
new file mode 100644
index 0000000..3c87da7
--- /dev/null
+++ b/Ada95/samples/ncurses2-m.ads
@@ -0,0 +1,44 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                 ncurses                                  --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000 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.                                                           --
+------------------------------------------------------------------------------
+--  Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
+--  Version Control
+--  $Revision: 1.2 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+package ncurses2.m is
+   function main return Integer;
+end ncurses2.m;
diff --git a/Ada95/samples/ncurses2-menu_test.adb b/Ada95/samples/ncurses2-menu_test.adb
new file mode 100644
index 0000000..721f750
--- /dev/null
+++ b/Ada95/samples/ncurses2-menu_test.adb
@@ -0,0 +1,169 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                 ncurses                                  --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000-2006,2011 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.                                                           --
+------------------------------------------------------------------------------
+--  Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
+--  Version Control
+--  $Revision: 1.9 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with ncurses2.util; use ncurses2.util;
+
+with Terminal_Interface.Curses; use Terminal_Interface.Curses;
+with Terminal_Interface.Curses.Menus; use Terminal_Interface.Curses.Menus;
+with Terminal_Interface.Curses.Mouse; use Terminal_Interface.Curses.Mouse;
+
+procedure ncurses2.menu_test is
+   function menu_virtualize (c : Key_Code) return Key_Code;
+   procedure xAdd (l : Line_Position; c : Column_Position; s : String);
+
+   function menu_virtualize (c : Key_Code) return Key_Code is
+   begin
+      case c is
+         when Character'Pos (newl) | Key_Exit =>
+            return Menu_Request_Code'Last + 1; --  MAX_COMMAND? TODO
+         when  Character'Pos ('u')  =>
+            return M_ScrollUp_Line;
+         when  Character'Pos ('d') =>
+            return M_ScrollDown_Line;
+         when  Character'Pos ('b') |  Key_Next_Page =>
+            return M_ScrollUp_Page;
+         when  Character'Pos ('f') |  Key_Previous_Page =>
+            return M_ScrollDown_Page;
+         when  Character'Pos ('n') |  Key_Cursor_Down =>
+            return M_Next_Item;
+         when  Character'Pos ('p') |  Key_Cursor_Up =>
+            return M_Previous_Item;
+         when  Character'Pos (' ') =>
+            return M_Toggle_Item;
+         when  Key_Mouse =>
+            return c;
+         when others =>
+            Beep;
+            return c;
+      end case;
+   end menu_virtualize;
+
+   MENU_Y : constant Line_Count := 8;
+   MENU_X : constant Column_Count := 8;
+
+   type String_Access is access String;
+
+   animals : constant array (Positive range <>) of String_Access :=
+     (new String'("Lions"),
+      new String'("Tigers"),
+      new String'("Bears"),
+      new String'("(Oh my!)"),
+      new String'("Newts"),
+      new String'("Platypi"),
+      new String'("Lemurs"));
+
+   items_a : constant Item_Array_Access :=
+      new Item_Array (1 .. animals'Last + 1);
+
+   tmp : Event_Mask;
+
+   procedure xAdd (l : Line_Position; c : Column_Position; s : String) is
+   begin
+      Add (Line => l, Column => c, Str => s);
+   end xAdd;
+
+   mrows : Line_Count;
+   mcols : Column_Count;
+
+   menuwin : Window;
+
+   m : Menu;
+
+   c1 : Key_Code;
+
+   c : Driver_Result;
+   r : Key_Code;
+begin
+   tmp := Start_Mouse;
+   xAdd (0, 0, "This is the menu test:");
+   xAdd (2, 0, "  Use up and down arrow to move the select bar.");
+   xAdd (3, 0, "  'n' and 'p' act like arrows.");
+   xAdd (4, 0, "  'b' and 'f' scroll up/down (page), 'u' and 'd' (line).");
+   xAdd (5, 0, "  Press return to exit.");
+   Refresh;
+
+   for i in animals'Range loop
+      items_a.all (i) := New_Item (animals (i).all);
+   end loop;
+   items_a.all (animals'Last + 1) := Null_Item;
+
+   m := New_Menu (items_a);
+
+   Set_Format (m, Line_Position (animals'Last + 1) / 2, 1);
+   Scale (m, mrows, mcols);
+
+   menuwin := Create (mrows + 2, mcols + 2, MENU_Y, MENU_X);
+   Set_Window (m, menuwin);
+   Set_KeyPad_Mode (menuwin, True);
+   Box (menuwin); -- 0,0?
+
+   Set_Sub_Window (m, Derived_Window (menuwin, mrows, mcols, 1, 1));
+
+   Post (m);
+
+   loop
+      c1 := Getchar (menuwin);
+      r := menu_virtualize (c1);
+      c := Driver (m, r);
+      exit when c = Unknown_Request; -- E_UNKNOWN_COMMAND?
+      if c = Request_Denied then
+         Beep;
+      end if;
+      --  continue ?
+   end loop;
+
+   Move_Cursor (Line => Lines - 2, Column => 0);
+   Add (Str => "You chose: ");
+   Add (Str => Name (Current (m)));
+   Add (Ch => newl);
+   Pause; -- the C version didn't use Pause, it spelled it out
+
+   Post (m, False); --  unpost, not clear :-(
+   declare begin
+      Delete (menuwin);
+   exception when Curses_Exception => null; end;
+   --  menuwin has children so will raise the exception.
+
+   Delete (m);
+
+   End_Mouse (tmp);
+end ncurses2.menu_test;
diff --git a/Ada95/samples/ncurses2-menu_test.ads b/Ada95/samples/ncurses2-menu_test.ads
new file mode 100644
index 0000000..1b7e74b
--- /dev/null
+++ b/Ada95/samples/ncurses2-menu_test.ads
@@ -0,0 +1,42 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                 ncurses                                  --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000 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.                                                           --
+------------------------------------------------------------------------------
+--  Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
+--  Version Control
+--  $Revision: 1.2 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+procedure ncurses2.menu_test;
diff --git a/Ada95/samples/ncurses2-overlap_test.adb b/Ada95/samples/ncurses2-overlap_test.adb
new file mode 100644
index 0000000..c0fd620
--- /dev/null
+++ b/Ada95/samples/ncurses2-overlap_test.adb
@@ -0,0 +1,159 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                 ncurses                                  --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020,2021 Thomas E. Dickey                                     --
+-- Copyright 2000-2014,2015 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.                                                           --
+------------------------------------------------------------------------------
+--  Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
+--  Version Control
+--  $Revision: 1.9 $
+--  $Date: 2021/09/04 10:52:55 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with ncurses2.util; use ncurses2.util;
+with Terminal_Interface.Curses; use Terminal_Interface.Curses;
+
+--  test effects of overlapping windows
+
+procedure ncurses2.overlap_test is
+
+   procedure fillwin (win : Window; ch : Character);
+   procedure crosswin (win : Window; ch : Character);
+
+   procedure fillwin (win : Window; ch : Character) is
+      y1 : Line_Position;
+      x1 : Column_Position;
+   begin
+      Get_Size (win, y1, x1);
+      for y in 0 .. y1 - 1 loop
+         Move_Cursor (win, y, 0);
+         for x in 0 .. x1 - 1 loop
+            Add (win, Ch => ch);
+         end loop;
+      end loop;
+   exception
+      when Curses_Exception => null;
+         --  write to lower right corner
+   end fillwin;
+
+   procedure crosswin (win : Window; ch : Character) is
+      y1 : Line_Position;
+      x1 : Column_Position;
+   begin
+      Get_Size (win, y1, x1);
+      for y in 0 .. y1 - 1 loop
+         for x in 0 .. x1 - 1 loop
+            if ((x > (x1 - 1) / 3) and (x <= (2 * (x1 - 1)) / 3)) or
+               (((y > (y1 - 1) / 3) and (y <= (2 * (y1 - 1)) / 3)))
+            then
+               Move_Cursor (win, y, x);
+               Add (win, Ch => ch);
+            end if;
+         end loop;
+      end loop;
+   end crosswin;
+
+   --  In a 24x80 screen like some xterms are, the instructions will
+   --  be overwritten.
+   ch : Character;
+   win1 : Window := New_Window (9, 20, 3, 3);
+   win2 : Window := New_Window (9, 20, 9, 16);
+begin
+   Set_Raw_Mode (SwitchOn => True);
+   Refresh;
+   Move_Cursor (Line => 0, Column => 0);
+   Add (Str => "This test shows the behavior of wnoutrefresh() with " &
+        "respect to");
+   Add (Ch => newl);
+   Add (Str => "the shared region of two overlapping windows A and B. " &
+        "The cross");
+   Add (Ch => newl);
+   Add (Str => "pattern in each window does not overlap the other.");
+   Add (Ch => newl);
+
+   Move_Cursor (Line => 18, Column => 0);
+   Add (Str => "a = refresh A, then B, then doupdate. b = refresh B, " &
+        "then A, then doupdate");
+   Add (Ch => newl);
+   Add (Str => "c = fill window A with letter A.      d = fill window B " &
+        "with letter B.");
+   Add (Ch => newl);
+   Add (Str => "e = cross pattern in window A.        f = cross pattern " &
+        "in window B.");
+   Add (Ch => newl);
+   Add (Str => "g = clear window A.                   h = clear window B.");
+   Add (Ch => newl);
+   Add (Str => "i = overwrite A onto B.               j = overwrite " &
+        "B onto A.");
+   Add (Ch => newl);
+   Add (Str => "^Q/ESC = terminate test.");
+
+   loop
+      ch := Code_To_Char (Getchar);
+      exit when ch = CTRL ('Q') or ch = CTRL ('['); --  QUIT or ESCAPE
+      case ch is
+         when 'a' => --  refresh window A first, then B
+            Refresh_Without_Update (win1);
+            Refresh_Without_Update (win2);
+            Update_Screen;
+         when 'b' => --  refresh window B first, then A
+            Refresh_Without_Update (win2);
+            Refresh_Without_Update (win1);
+            Update_Screen;
+         when 'c' => --  fill window A so it is visible
+            fillwin (win1, 'A');
+         when 'd' => --  fill window B so it is visible
+            fillwin (win2, 'B');
+         when 'e' => --  cross test pattern in window A
+            crosswin (win1, 'A');
+         when 'f' => --  cross test pattern in window B
+            crosswin (win2, 'B');
+         when 'g' => --  clear window A
+            Clear (win1);
+            Move_Cursor (win1, 0, 0);
+         when 'h' => --  clear window B
+            Clear (win2);
+            Move_Cursor (win2, 0, 0);
+         when 'i' => --  overwrite A onto B
+            Overwrite (win1, win2);
+         when 'j' => --  overwrite B onto A
+            Overwrite (win2, win1);
+         when others => null;
+      end case;
+   end loop;
+
+   Delete (win2);
+   Delete (win1);
+   Erase;
+   End_Windows;
+end ncurses2.overlap_test;
diff --git a/Ada95/samples/ncurses2-overlap_test.ads b/Ada95/samples/ncurses2-overlap_test.ads
new file mode 100644
index 0000000..d6589ea
--- /dev/null
+++ b/Ada95/samples/ncurses2-overlap_test.ads
@@ -0,0 +1,42 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                 ncurses                                  --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000 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.                                                           --
+------------------------------------------------------------------------------
+--  Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
+--  Version Control
+--  $Revision: 1.2 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+procedure ncurses2.overlap_test;
diff --git a/Ada95/samples/ncurses2-slk_test.adb b/Ada95/samples/ncurses2-slk_test.adb
new file mode 100644
index 0000000..4971ed6
--- /dev/null
+++ b/Ada95/samples/ncurses2-slk_test.adb
@@ -0,0 +1,173 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                 ncurses                                  --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2018,2020 Thomas E. Dickey                                     --
+-- Copyright 2000-2009,2011 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.                                                           --
+------------------------------------------------------------------------------
+--  Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
+--  Version Control
+--  $Revision: 1.11 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with ncurses2.util; use ncurses2.util;
+with Terminal_Interface.Curses; use Terminal_Interface.Curses;
+
+with Ada.Strings.Unbounded;
+with Interfaces.C;
+with Terminal_Interface.Curses.Aux;
+
+procedure ncurses2.slk_test is
+   procedure myGet (Win : Window := Standard_Window;
+                    Str : out Ada.Strings.Unbounded.Unbounded_String;
+                    Len : Integer := -1);
+
+   procedure myGet (Win : Window := Standard_Window;
+                    Str : out Ada.Strings.Unbounded.Unbounded_String;
+                    Len : Integer := -1)
+   is
+      use Ada.Strings.Unbounded;
+      use Interfaces.C;
+      use Terminal_Interface.Curses.Aux;
+
+      function Wgetnstr (Win : Window;
+                         Str : char_array;
+                         Len : int) return int;
+      pragma Import (C, Wgetnstr, "wgetnstr");
+
+      --  FIXME: how to construct "(Len > 0) ? Len : 80"?
+      Ask : constant Interfaces.C.size_t := Interfaces.C.size_t'Val (Len + 80);
+      Txt : char_array (0 .. Ask);
+
+   begin
+      Txt (0) := Interfaces.C.char'First;
+      if Wgetnstr (Win, Txt, Txt'Length) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+      Str := To_Unbounded_String (To_Ada (Txt, True));
+   end myGet;
+
+   use Ada.Strings.Unbounded;
+
+   c : Key_Code;
+   buf : Unbounded_String;
+   c2 : Character;
+   fmt : Label_Justification := Centered;
+   tmp : Integer;
+
+begin
+   c := CTRL ('l');
+   loop
+      Move_Cursor (Line => 0, Column => 0);
+      c2 := Code_To_Char (c);
+      case c2 is
+         when Character'Val (Character'Pos ('l') mod 16#20#) => --  CTRL('l')
+            Erase;
+            Switch_Character_Attribute (Attr => (Bold_Character => True,
+                                                 others => False));
+            Add (Line => 0, Column => 20,
+                 Str => "Soft Key Exerciser");
+            Switch_Character_Attribute (On => False,
+                                        Attr => (Bold_Character => True,
+                                                 others => False));
+
+            Move_Cursor (Line => 2, Column => 0);
+            P ("Available commands are:");
+            P ("");
+            P ("^L         -- refresh screen");
+            P ("a          -- activate or restore soft keys");
+            P ("d          -- disable soft keys");
+            P ("c          -- set centered format for labels");
+            P ("l          -- set left-justified format for labels");
+            P ("r          -- set right-justified format for labels");
+            P ("[12345678] -- set label; labels are numbered 1 through 8");
+            P ("e          -- erase stdscr (should not erase labels)");
+            P ("s          -- test scrolling of shortened screen");
+            P ("x, q       -- return to main menu");
+            P ("");
+            P ("Note: if activating the soft keys causes your terminal to");
+            P ("scroll up one line, your terminal auto-scrolls when anything");
+            P ("is written to the last screen position.  The ncurses code");
+            P ("does not yet handle this gracefully.");
+            Refresh;
+            Restore_Soft_Label_Keys;
+
+         when 'a' =>
+            Restore_Soft_Label_Keys;
+         when 'e' =>
+            Clear;
+         when 's' =>
+            Add (Line => 20, Column => 0,
+                Str => "Press Q to stop the scrolling-test: ");
+            loop
+               c := Getchar;
+               c2 := Code_To_Char (c);
+               exit when c2 = 'Q';
+               --  c = ERR?
+               --  TODO when c is not a character (arrow key)
+               --  the behavior is different from the C version.
+               Add (Ch => c2);
+            end loop;
+         when 'd' =>
+            Clear_Soft_Label_Keys;
+         when 'l' =>
+            fmt := Left;
+         when 'c' =>
+            fmt := Centered;
+         when 'r' =>
+            fmt := Right;
+         when '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8'  =>
+            Add (Line => 20, Column => 0,
+                 Str => "Please enter the label value: ");
+            Set_Echo_Mode (SwitchOn => True);
+            myGet (Str => buf);
+            Set_Echo_Mode (SwitchOn => False);
+            tmp := ctoi (c2);
+            Set_Soft_Label_Key (Label_Number (tmp), To_String (buf), fmt);
+            Refresh_Soft_Label_Keys;
+            Move_Cursor (Line => 20, Column => 0);
+            Clear_To_End_Of_Line;
+         when 'x' | 'q' =>
+            exit;
+            --  the C version needed a goto, ha ha
+            --  breaks exit the case not the loop because fall-through
+            --  happens in C!
+         when others =>
+            Beep;
+      end case;
+      c := Getchar;
+      --  TODO exit when c = EOF
+   end loop;
+   Erase;
+   End_Windows;
+end ncurses2.slk_test;
diff --git a/Ada95/samples/ncurses2-slk_test.ads b/Ada95/samples/ncurses2-slk_test.ads
new file mode 100644
index 0000000..1aff9d0
--- /dev/null
+++ b/Ada95/samples/ncurses2-slk_test.ads
@@ -0,0 +1,42 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                 ncurses                                  --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000 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.                                                           --
+------------------------------------------------------------------------------
+--  Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
+--  Version Control
+--  $Revision: 1.2 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+procedure ncurses2.slk_test;
diff --git a/Ada95/samples/ncurses2-test_sgr_attributes.adb b/Ada95/samples/ncurses2-test_sgr_attributes.adb
new file mode 100644
index 0000000..ac6df4a
--- /dev/null
+++ b/Ada95/samples/ncurses2-test_sgr_attributes.adb
@@ -0,0 +1,186 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                 ncurses                                  --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000,2006 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.                                                           --
+------------------------------------------------------------------------------
+--  Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
+--  Version Control
+--  $Revision: 1.3 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Terminal_Interface.Curses; use Terminal_Interface.Curses;
+with ncurses2.util; use ncurses2.util;
+
+--  Graphic-rendition test (adapted from vttest)
+
+procedure ncurses2.test_sgr_attributes is
+
+   procedure xAdd (l : Line_Position; c : Column_Position; s : String);
+
+   procedure xAdd (l : Line_Position; c : Column_Position; s : String) is
+   begin
+      Add (Line => l, Column => c, Str => s);
+   end xAdd;
+
+   normal, current : Attributed_Character;
+begin
+   for pass in reverse Boolean loop
+      if pass then
+         normal := (Ch => ' ', Attr => Normal_Video, Color => 0);
+      else
+         normal := (Ch => ' ', Attr =>
+                      (Reverse_Video => True, others => False), Color => 0);
+      end if;
+
+      --  Use non-default colors if possible to exercise bce a little
+      if Has_Colors then
+         Init_Pair (1, White, Blue);
+         normal.Color := 1;
+      end if;
+      Set_Background (Ch => normal);
+      Erase;
+      xAdd (1, 20, "Graphic rendition test pattern:");
+
+      xAdd (4, 1, "vanilla");
+
+      current := normal;
+      current.Attr.Bold_Character := not current.Attr.Bold_Character;
+      Set_Background (Ch => current);
+      xAdd (4, 40, "bold");
+
+      current := normal;
+      current.Attr.Under_Line := not current.Attr.Under_Line;
+      Set_Background (Ch => current);
+      xAdd (6, 6, "underline");
+
+      current := normal;
+      current.Attr.Bold_Character  := not current.Attr.Bold_Character;
+      current.Attr.Under_Line := not current.Attr.Under_Line;
+      Set_Background (Ch => current);
+      xAdd (6, 45, "bold underline");
+
+      current := normal;
+      current.Attr.Blink := not current.Attr.Blink;
+      Set_Background (Ch => current);
+      xAdd (8, 1, "blink");
+
+      current := normal;
+      current.Attr.Blink  := not current.Attr.Blink;
+      current.Attr.Bold_Character := not current.Attr.Bold_Character;
+      Set_Background (Ch => current);
+      xAdd (8, 40, "bold blink");
+
+      current := normal;
+      current.Attr.Under_Line  := not current.Attr.Under_Line;
+      current.Attr.Blink := not current.Attr.Blink;
+      Set_Background (Ch => current);
+      xAdd (10, 6, "underline blink");
+
+      current := normal;
+      current.Attr.Bold_Character  := not current.Attr.Bold_Character;
+      current.Attr.Under_Line  := not current.Attr.Under_Line;
+      current.Attr.Blink := not current.Attr.Blink;
+      Set_Background (Ch => current);
+      xAdd (10, 45, "bold underline blink");
+
+      current := normal;
+      current.Attr.Reverse_Video := not current.Attr.Reverse_Video;
+      Set_Background (Ch => current);
+      xAdd (12, 1, "negative");
+
+      current := normal;
+      current.Attr.Bold_Character  := not current.Attr.Bold_Character;
+      current.Attr.Reverse_Video := not current.Attr.Reverse_Video;
+      Set_Background (Ch => current);
+      xAdd (12, 40, "bold negative");
+
+      current := normal;
+      current.Attr.Under_Line  := not current.Attr.Under_Line;
+      current.Attr.Reverse_Video := not current.Attr.Reverse_Video;
+      Set_Background (Ch => current);
+      xAdd (14, 6, "underline negative");
+
+      current := normal;
+      current.Attr.Bold_Character  := not current.Attr.Bold_Character;
+      current.Attr.Under_Line  := not current.Attr.Under_Line;
+      current.Attr.Reverse_Video := not current.Attr.Reverse_Video;
+      Set_Background (Ch => current);
+      xAdd (14, 45, "bold underline negative");
+
+      current := normal;
+      current.Attr.Blink  := not current.Attr.Blink;
+      current.Attr.Reverse_Video := not current.Attr.Reverse_Video;
+      Set_Background (Ch => current);
+      xAdd (16, 1, "blink negative");
+
+      current := normal;
+      current.Attr.Bold_Character  := not current.Attr.Bold_Character;
+      current.Attr.Blink  := not current.Attr.Blink;
+      current.Attr.Reverse_Video := not current.Attr.Reverse_Video;
+      Set_Background (Ch => current);
+      xAdd (16, 40, "bold blink negative");
+
+      current := normal;
+      current.Attr.Under_Line  := not current.Attr.Under_Line;
+      current.Attr.Blink  := not current.Attr.Blink;
+      current.Attr.Reverse_Video := not current.Attr.Reverse_Video;
+      Set_Background (Ch => current);
+      xAdd (18, 6, "underline blink negative");
+
+      current := normal;
+      current.Attr.Bold_Character  := not current.Attr.Bold_Character;
+      current.Attr.Under_Line  := not current.Attr.Under_Line;
+      current.Attr.Blink  := not current.Attr.Blink;
+      current.Attr.Reverse_Video := not current.Attr.Reverse_Video;
+      Set_Background (Ch => current);
+      xAdd (18, 45, "bold underline blink negative");
+
+      Set_Background (Ch => normal);
+      Move_Cursor (Line => Lines - 2, Column => 1);
+      if pass then
+         Add (Str => "Dark");
+      else
+         Add (Str => "Light");
+      end if;
+      Add (Str => " background. ");
+      Clear_To_End_Of_Line;
+      Pause;
+   end loop;
+
+   Set_Background (Ch => Blank2);
+   Erase;
+   End_Windows;
+
+end ncurses2.test_sgr_attributes;
diff --git a/Ada95/samples/ncurses2-test_sgr_attributes.ads b/Ada95/samples/ncurses2-test_sgr_attributes.ads
new file mode 100644
index 0000000..5589547
--- /dev/null
+++ b/Ada95/samples/ncurses2-test_sgr_attributes.ads
@@ -0,0 +1,42 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                 ncurses                                  --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000 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.                                                           --
+------------------------------------------------------------------------------
+--  Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
+--  Version Control
+--  $Revision: 1.2 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+procedure ncurses2.test_sgr_attributes;
diff --git a/Ada95/samples/ncurses2-trace_set.adb b/Ada95/samples/ncurses2-trace_set.adb
new file mode 100644
index 0000000..d273980
--- /dev/null
+++ b/Ada95/samples/ncurses2-trace_set.adb
@@ -0,0 +1,496 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                            ncurses2.trace_set                            --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000-2011,2014 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.                                                           --
+------------------------------------------------------------------------------
+--  Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
+--  Version Control
+--  $Revision: 1.7 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with ncurses2.util; use ncurses2.util;
+with Terminal_Interface.Curses; use Terminal_Interface.Curses;
+with Terminal_Interface.Curses.Trace; use Terminal_Interface.Curses.Trace;
+with Terminal_Interface.Curses.Menus; use Terminal_Interface.Curses.Menus;
+
+with Ada.Strings.Bounded;
+
+--  interactively set the trace level
+
+procedure ncurses2.trace_set is
+
+   function menu_virtualize (c : Key_Code) return Key_Code;
+   function subset (super, sub : Trace_Attribute_Set) return Boolean;
+   function trace_or (a, b : Trace_Attribute_Set) return Trace_Attribute_Set;
+   function trace_num (tlevel : Trace_Attribute_Set) return String;
+   function tracetrace (tlevel : Trace_Attribute_Set) return String;
+   function run_trace_menu (m : Menu; count : Integer) return Boolean;
+
+   function menu_virtualize (c : Key_Code) return Key_Code is
+   begin
+      case c is
+         when Character'Pos (newl) | Key_Exit =>
+            return Menu_Request_Code'Last + 1; --  MAX_COMMAND? TODO
+         when Character'Pos ('u') =>
+            return M_ScrollUp_Line;
+         when Character'Pos ('d') =>
+            return M_ScrollDown_Line;
+         when Character'Pos ('b') | Key_Next_Page =>
+            return M_ScrollUp_Page;
+         when Character'Pos ('f') | Key_Previous_Page =>
+            return M_ScrollDown_Page;
+         when Character'Pos ('n') | Key_Cursor_Down =>
+            return M_Next_Item;
+         when Character'Pos ('p') | Key_Cursor_Up =>
+            return M_Previous_Item;
+         when Character'Pos (' ') =>
+            return M_Toggle_Item;
+         when Key_Mouse =>
+            return c;
+         when others =>
+            Beep;
+            return c;
+      end case;
+   end menu_virtualize;
+
+   type string_a is access String;
+   type tbl_entry is record
+      name : string_a;
+      mask : Trace_Attribute_Set;
+   end record;
+
+   t_tbl : constant array (Positive range <>) of tbl_entry :=
+     (
+      (new String'("Disable"),
+       Trace_Disable),
+      (new String'("Times"),
+       Trace_Attribute_Set'(Times => True, others => False)),
+      (new String'("Tputs"),
+       Trace_Attribute_Set'(Tputs => True, others => False)),
+      (new String'("Update"),
+       Trace_Attribute_Set'(Update => True, others => False)),
+      (new String'("Cursor_Move"),
+       Trace_Attribute_Set'(Cursor_Move => True, others => False)),
+      (new String'("Character_Output"),
+       Trace_Attribute_Set'(Character_Output => True, others => False)),
+      (new String'("Ordinary"),
+       Trace_Ordinary),
+      (new String'("Calls"),
+       Trace_Attribute_Set'(Calls => True, others => False)),
+      (new String'("Virtual_Puts"),
+       Trace_Attribute_Set'(Virtual_Puts => True, others => False)),
+      (new String'("Input_Events"),
+       Trace_Attribute_Set'(Input_Events => True, others => False)),
+      (new String'("TTY_State"),
+       Trace_Attribute_Set'(TTY_State => True, others => False)),
+      (new String'("Internal_Calls"),
+       Trace_Attribute_Set'(Internal_Calls => True, others => False)),
+      (new String'("Character_Calls"),
+       Trace_Attribute_Set'(Character_Calls => True, others => False)),
+      (new String'("Termcap_TermInfo"),
+       Trace_Attribute_Set'(Termcap_TermInfo => True, others => False)),
+      (new String'("Maximium"),
+       Trace_Maximum)
+      );
+
+   package BS is new Ada.Strings.Bounded.Generic_Bounded_Length (300);
+
+   function subset (super, sub : Trace_Attribute_Set) return Boolean is
+   begin
+      if
+        (super.Times or not sub.Times) and
+        (super.Tputs or not sub.Tputs) and
+        (super.Update or not sub.Update) and
+        (super.Cursor_Move or not sub.Cursor_Move) and
+        (super.Character_Output or not sub.Character_Output) and
+        (super.Calls or not sub.Calls) and
+        (super.Virtual_Puts or not sub.Virtual_Puts) and
+        (super.Input_Events or not sub.Input_Events) and
+        (super.TTY_State or not sub.TTY_State) and
+        (super.Internal_Calls or not sub.Internal_Calls) and
+        (super.Character_Calls or not sub.Character_Calls) and
+        (super.Termcap_TermInfo or not sub.Termcap_TermInfo) and
+        True
+      then
+         return True;
+      else
+         return False;
+      end if;
+   end subset;
+
+   function trace_or (a, b : Trace_Attribute_Set) return Trace_Attribute_Set is
+      retval : Trace_Attribute_Set := Trace_Disable;
+   begin
+      retval.Times := (a.Times or b.Times);
+      retval.Tputs := (a.Tputs or b.Tputs);
+      retval.Update := (a.Update or b.Update);
+      retval.Cursor_Move := (a.Cursor_Move or b.Cursor_Move);
+      retval.Character_Output := (a.Character_Output or b.Character_Output);
+      retval.Calls := (a.Calls or b.Calls);
+      retval.Virtual_Puts := (a.Virtual_Puts or b.Virtual_Puts);
+      retval.Input_Events := (a.Input_Events or b.Input_Events);
+      retval.TTY_State := (a.TTY_State or b.TTY_State);
+      retval.Internal_Calls := (a.Internal_Calls or b.Internal_Calls);
+      retval.Character_Calls := (a.Character_Calls or b.Character_Calls);
+      retval.Termcap_TermInfo := (a.Termcap_TermInfo or b.Termcap_TermInfo);
+
+      return retval;
+   end trace_or;
+
+   --  Print the hexadecimal value of the mask so
+   --  users can set it from the command line.
+
+   function trace_num (tlevel : Trace_Attribute_Set) return String is
+      result : Integer := 0;
+      m : Integer := 1;
+   begin
+
+      if tlevel.Times then
+         result := result + m;
+      end if;
+      m := m * 2;
+
+      if tlevel.Tputs then
+         result := result + m;
+      end if;
+      m := m * 2;
+
+      if tlevel.Update then
+         result := result + m;
+      end if;
+      m := m * 2;
+
+      if tlevel.Cursor_Move then
+         result := result + m;
+      end if;
+      m := m * 2;
+
+      if tlevel.Character_Output then
+         result := result + m;
+      end if;
+      m := m * 2;
+
+      if tlevel.Calls then
+         result := result + m;
+      end if;
+      m := m * 2;
+
+      if tlevel.Virtual_Puts then
+         result := result + m;
+      end if;
+      m := m * 2;
+
+      if tlevel.Input_Events then
+         result := result + m;
+      end if;
+      m := m * 2;
+
+      if tlevel.TTY_State then
+         result := result + m;
+      end if;
+      m := m * 2;
+
+      if tlevel.Internal_Calls then
+         result := result + m;
+      end if;
+      m := m * 2;
+
+      if tlevel.Character_Calls then
+         result := result + m;
+      end if;
+      m := m * 2;
+
+      if tlevel.Termcap_TermInfo then
+         result := result + m;
+      end if;
+      m := m * 2;
+      return result'Img;
+   end trace_num;
+
+   function tracetrace (tlevel : Trace_Attribute_Set) return String is
+
+      use BS;
+      buf : Bounded_String := To_Bounded_String ("");
+   begin
+      --  The C version prints the hexadecimal value of the mask, we
+      --  won't do that here because this is Ada.
+
+      if tlevel = Trace_Disable then
+         Append (buf, "Trace_Disable");
+      else
+
+         if subset (tlevel,
+                    Trace_Attribute_Set'(Times => True, others => False))
+         then
+            Append (buf, "Times");
+            Append (buf, ", ");
+         end if;
+
+         if subset (tlevel,
+                    Trace_Attribute_Set'(Tputs => True, others => False))
+         then
+            Append (buf, "Tputs");
+            Append (buf, ", ");
+         end if;
+
+         if subset (tlevel,
+                    Trace_Attribute_Set'(Update => True, others => False))
+         then
+            Append (buf, "Update");
+            Append (buf, ", ");
+         end if;
+
+         if subset (tlevel,
+                    Trace_Attribute_Set'(Cursor_Move => True,
+                                         others => False))
+         then
+            Append (buf, "Cursor_Move");
+            Append (buf, ", ");
+         end if;
+
+         if subset (tlevel,
+                    Trace_Attribute_Set'(Character_Output => True,
+                                         others => False))
+         then
+            Append (buf, "Character_Output");
+            Append (buf, ", ");
+         end if;
+
+         if subset (tlevel,
+                    Trace_Ordinary)
+         then
+            Append (buf, "Ordinary");
+            Append (buf, ", ");
+         end if;
+
+         if subset (tlevel,
+                    Trace_Attribute_Set'(Calls => True, others => False))
+         then
+            Append (buf, "Calls");
+            Append (buf, ", ");
+         end if;
+
+         if subset (tlevel,
+                    Trace_Attribute_Set'(Virtual_Puts => True,
+                                         others => False))
+         then
+            Append (buf, "Virtual_Puts");
+            Append (buf, ", ");
+         end if;
+
+         if subset (tlevel,
+                    Trace_Attribute_Set'(Input_Events => True,
+                                         others => False))
+         then
+            Append (buf, "Input_Events");
+            Append (buf, ", ");
+         end if;
+
+         if subset (tlevel,
+                    Trace_Attribute_Set'(TTY_State => True,
+                                         others => False))
+         then
+            Append (buf, "TTY_State");
+            Append (buf, ", ");
+         end if;
+
+         if subset (tlevel,
+                    Trace_Attribute_Set'(Internal_Calls => True,
+                                         others => False))
+         then
+            Append (buf, "Internal_Calls");
+            Append (buf, ", ");
+         end if;
+
+         if subset (tlevel,
+                    Trace_Attribute_Set'(Character_Calls => True,
+                                         others => False))
+         then
+            Append (buf, "Character_Calls");
+            Append (buf, ", ");
+         end if;
+
+         if subset (tlevel,
+                    Trace_Attribute_Set'(Termcap_TermInfo => True,
+                                         others => False))
+         then
+            Append (buf, "Termcap_TermInfo");
+            Append (buf, ", ");
+         end if;
+
+         if subset (tlevel,
+                    Trace_Maximum)
+         then
+            Append (buf, "Maximium");
+            Append (buf, ", ");
+         end if;
+      end if;
+
+      if To_String (buf) (Length (buf) - 1) = ',' then
+         Delete (buf, Length (buf) - 1, Length (buf));
+      end if;
+
+      return To_String (buf);
+   end tracetrace;
+
+   function run_trace_menu (m : Menu; count : Integer) return Boolean is
+      i, p : Item;
+      changed : Boolean;
+      c, v : Key_Code;
+   begin
+      loop
+         changed := (count /= 0);
+         c := Getchar (Get_Window (m));
+         v := menu_virtualize (c);
+         case Driver (m, v) is
+            when Unknown_Request =>
+               return False;
+            when others =>
+               i := Current (m);
+               if i = Menus.Items (m, 1) then -- the first item
+                  for n in t_tbl'First + 1 .. t_tbl'Last loop
+                     if Value (i) then
+                        Set_Value (i, False);
+                        changed := True;
+                     end if;
+                  end loop;
+               else
+                  for n in t_tbl'First + 1 .. t_tbl'Last loop
+                     p := Menus.Items (m, n);
+                     if Value (p) then
+                        Set_Value (Menus.Items (m, 1), False);
+                        changed := True;
+                        exit;
+                     end if;
+                  end loop;
+               end if;
+               if not changed then
+                  return True;
+               end if;
+         end case;
+      end loop;
+   end run_trace_menu;
+
+   nc_tracing, mask : Trace_Attribute_Set;
+   pragma Import (C, nc_tracing, "_nc_tracing");
+   items_a : constant Item_Array_Access :=
+     new Item_Array (t_tbl'First .. t_tbl'Last + 1);
+   mrows : Line_Count;
+   mcols : Column_Count;
+   menuwin : Window;
+   menu_y : constant Line_Position := 8;
+   menu_x : constant Column_Position := 8;
+   ip : Item;
+   m : Menu;
+   count : Integer;
+   newtrace : Trace_Attribute_Set;
+begin
+   Add (Line => 0, Column => 0, Str => "Interactively set trace level:");
+   Add (Line => 2, Column => 0,
+        Str => "  Press space bar to toggle a selection.");
+   Add (Line => 3, Column => 0,
+        Str => "  Use up and down arrow to move the select bar.");
+   Add (Line => 4, Column => 0,
+        Str => "  Press return to set the trace level.");
+   Add (Line => 6, Column => 0, Str => "(Current trace level is ");
+   Add (Str => tracetrace (nc_tracing) & " numerically: " &
+        trace_num (nc_tracing));
+   Add (Ch => ')');
+
+   Refresh;
+
+   for n in t_tbl'Range loop
+      items_a.all (n) := New_Item (t_tbl (n).name.all);
+   end loop;
+   items_a.all (t_tbl'Last + 1) := Null_Item;
+
+   m := New_Menu (items_a);
+
+   Set_Format (m, 16, 2);
+   Scale (m, mrows, mcols);
+
+   Switch_Options (m, (One_Valued => True, others => False), On => False);
+   menuwin := New_Window (mrows + 2, mcols + 2, menu_y, menu_x);
+   Set_Window (m, menuwin);
+   Set_KeyPad_Mode (menuwin, SwitchOn => True);
+   Box (menuwin);
+
+   Set_Sub_Window (m, Derived_Window (menuwin, mrows, mcols, 1, 1));
+
+   Post (m);
+
+   for n in t_tbl'Range loop
+      ip := Items (m, n);
+      mask := t_tbl (n).mask;
+      if mask = Trace_Disable then
+         Set_Value (ip, nc_tracing = Trace_Disable);
+      elsif subset (sub => mask, super => nc_tracing) then
+         Set_Value (ip, True);
+      end if;
+   end loop;
+
+   count := 1;
+   while run_trace_menu (m, count) loop
+      count := count + 1;
+   end loop;
+
+   newtrace := Trace_Disable;
+   for n in t_tbl'Range loop
+      ip := Items (m, n);
+      if Value (ip) then
+         mask := t_tbl (n).mask;
+         newtrace := trace_or (newtrace, mask);
+      end if;
+   end loop;
+
+   Trace_On (newtrace);
+   Trace_Put ("trace level interactively set to " &
+              tracetrace (nc_tracing));
+
+   Move_Cursor (Line => Lines - 4, Column => 0);
+   Add (Str => "Trace level is ");
+   Add (Str => tracetrace (nc_tracing));
+   Add (Ch => newl);
+   Pause; -- was just Add(); Getchar
+
+   Post (m, False);
+   --  menuwin has subwindows I think, which makes an error.
+   declare begin
+      Delete (menuwin);
+   exception when Curses_Exception => null; end;
+
+   --  free_menu(m);
+   --  free_item()
+end ncurses2.trace_set;
diff --git a/Ada95/samples/ncurses2-trace_set.ads b/Ada95/samples/ncurses2-trace_set.ads
new file mode 100644
index 0000000..352736c
--- /dev/null
+++ b/Ada95/samples/ncurses2-trace_set.ads
@@ -0,0 +1,42 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                            ncurses2.trace_set                            --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000 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.                                                           --
+------------------------------------------------------------------------------
+--  Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
+--  Version Control
+--  $Revision: 1.2 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+procedure ncurses2.trace_set;
diff --git a/Ada95/samples/ncurses2-util.adb b/Ada95/samples/ncurses2-util.adb
new file mode 100644
index 0000000..152a5d3
--- /dev/null
+++ b/Ada95/samples/ncurses2-util.adb
@@ -0,0 +1,186 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                               ncurses2.util                              --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000-2008,2014 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.                                                           --
+------------------------------------------------------------------------------
+--  Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
+--  Version Control
+--  $Revision: 1.10 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Ada.Text_IO; use Ada.Text_IO;
+
+with Terminal_Interface.Curses.Trace; use Terminal_Interface.Curses.Trace;
+
+with Interfaces.C;
+with Interfaces.C.Strings;
+
+with Ada.Characters.Handling;
+
+with ncurses2.genericPuts;
+
+package body ncurses2.util is
+
+   --  #defines from C
+   --  #define CTRL(x)         ((x) & 0x1f)
+   function CTRL (c : Character) return Key_Code is
+   begin
+      return Character'Pos (c) mod 16#20#;
+      --  uses a property of ASCII
+      --  A = 16#41#; a = 16#61#; ^A = 1 or 16#1#
+   end CTRL;
+
+   function CTRL (c : Character) return Character is
+   begin
+      return Character'Val (Character'Pos (c) mod 16#20#);
+      --  uses a property of ASCII
+      --  A = 16#41#; a = 16#61#; ^A = 1 or 16#1#
+   end CTRL;
+
+   save_trace : Trace_Attribute_Set;
+   --  Common function to allow ^T to toggle trace-mode in the middle of a test
+   --  so that trace-files can be made smaller.
+   function Getchar (win : Window := Standard_Window) return Key_Code is
+      c : Key_Code;
+   begin
+      --  #ifdef TRACE
+      c := Get_Keystroke (win);
+      while c = CTRL ('T') loop
+         --  if _nc_tracing  in C
+         if Current_Trace_Setting /= Trace_Disable then
+            save_trace := Current_Trace_Setting;
+            Trace_Put ("TOGGLE-TRACING OFF");
+            Current_Trace_Setting := Trace_Disable;
+         else
+            Current_Trace_Setting := save_trace;
+         end if;
+         Trace_On (Current_Trace_Setting);
+         if Current_Trace_Setting /= Trace_Disable then
+            Trace_Put ("TOGGLE-TRACING ON");
+         end if;
+      end loop;
+      --  #else c := Get_Keystroke;
+      return c;
+   end Getchar;
+
+   procedure Getchar (win : Window := Standard_Window) is
+   begin
+      if Getchar (win) < 0 then
+         Beep;
+      end if;
+   end Getchar;
+
+   procedure Pause is
+   begin
+      Move_Cursor (Line => Lines - 1, Column => 0);
+      Add (Str => "Press any key to continue... ");
+      Getchar;
+   end Pause;
+
+   procedure Cannot (s : String) is
+      use Interfaces.C;
+      use Interfaces.C.Strings;
+      function getenv (x : char_array)  return chars_ptr;
+      pragma Import (C, getenv, "getenv");
+      tmp1 : char_array (0 .. 10);
+      package p is new ncurses2.genericPuts (1024);
+      use p;
+      use p.BS;
+
+      tmpb : BS.Bounded_String;
+
+      Length : size_t;
+   begin
+      To_C ("TERM", tmp1, Length);
+      Fill_String (getenv (tmp1), tmpb);
+      Add (Ch => newl);
+      myAdd (Str => "This " & tmpb & " terminal " & s);
+      Pause;
+   end Cannot;
+
+   procedure ShellOut (message : Boolean) is
+      use Interfaces.C;
+      Txt : char_array (0 .. 10);
+      Length : size_t;
+      procedure system (x : char_array);
+      pragma Import (C, system, "system");
+   begin
+      To_C ("sh", Txt,  Length);
+      if message then
+         Add (Str => "Shelling out...");
+      end if;
+      Save_Curses_Mode (Mode => Curses);
+      End_Windows;
+      system (Txt);
+      if message then
+         Add (Str => "returned from shellout.");
+         Add (Ch => newl);
+      end if;
+      Refresh;
+   end ShellOut;
+
+   function Is_Digit (c : Key_Code) return Boolean is
+   begin
+      if c >= 16#100# then
+         return False;
+      else
+         return Ada.Characters.Handling.Is_Digit (Character'Val (c));
+      end if;
+   end Is_Digit;
+
+   procedure P (s : String) is
+   begin
+      Add (Str => s);
+      Add (Ch => newl);
+   end P;
+
+   function Code_To_Char (c : Key_Code) return Character is
+   begin
+      if c > Character'Pos (Character'Last) then
+         return Character'Val (0);
+         --  maybe raise exception?
+      else
+         return Character'Val (c);
+      end if;
+   end Code_To_Char;
+
+   --  This was untestable due to a bug in GNAT (3.12p)
+   --  Hmm, what bug? I don't remember.
+   function ctoi (c : Character) return Integer is
+   begin
+      return Character'Pos (c) - Character'Pos ('0');
+   end ctoi;
+
+end ncurses2.util;
diff --git a/Ada95/samples/ncurses2-util.ads b/Ada95/samples/ncurses2-util.ads
new file mode 100644
index 0000000..5d71d73
--- /dev/null
+++ b/Ada95/samples/ncurses2-util.ads
@@ -0,0 +1,77 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                              ncurses2.util                               --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000,2006 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.                                                           --
+------------------------------------------------------------------------------
+--  Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
+--  Version Control
+--  $Revision: 1.3 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Terminal_Interface.Curses; use Terminal_Interface.Curses;
+
+with Ada.Text_IO;
+package ncurses2.util is
+
+   Blank : constant Character := ' ';
+   Blank2 : constant Attributed_Character :=
+     (Ch => Blank, Attr => Normal_Video, Color => Color_Pair'First);
+
+   newl : constant Character :=  Character'Val (10);
+
+   function CTRL (c : Character) return Key_Code;
+
+   function CTRL (c : Character) return Character;
+
+   function Getchar (win : Window := Standard_Window) return Key_Code;
+
+   procedure Getchar (win : Window := Standard_Window);
+
+   procedure Pause;
+
+   procedure Cannot (s : String);
+
+   procedure ShellOut (message : Boolean);
+
+   package Int_IO is new Ada.Text_IO.Integer_IO (Integer);
+
+   function Is_Digit (c : Key_Code) return Boolean;
+
+   procedure P (s : String);
+
+   function Code_To_Char (c : Key_Code) return Character;
+   function ctoi (c : Character) return Integer;
+
+end ncurses2.util;
diff --git a/Ada95/samples/ncurses2.ads b/Ada95/samples/ncurses2.ads
new file mode 100644
index 0000000..42e66f3
--- /dev/null
+++ b/Ada95/samples/ncurses2.ads
@@ -0,0 +1,45 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                 ncurses                                  --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000 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.                                                           --
+------------------------------------------------------------------------------
+--  Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
+--  Version Control
+--  $Revision: 1.2 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+
+package ncurses2 is
+   pragma Pure (ncurses2);
+end ncurses2;
diff --git a/Ada95/samples/rain.adb b/Ada95/samples/rain.adb
new file mode 100644
index 0000000..2649252
--- /dev/null
+++ b/Ada95/samples/rain.adb
@@ -0,0 +1,180 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                   Rain                                   --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2007,2008 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Laurent Pautet <pautet@gnat.com>
+--  Modified by:  Juergen Pfeifer, 1997
+--  Version Control
+--  $Revision: 1.9 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+--                                                                          --
+with ncurses2.util; use ncurses2.util;
+with Ada.Numerics.Float_Random; use Ada.Numerics.Float_Random;
+with Status; use Status;
+with Terminal_Interface.Curses; use Terminal_Interface.Curses;
+
+procedure Rain is
+
+   Visibility : Cursor_Visibility;
+
+   subtype X_Position is Line_Position;
+   subtype Y_Position is Column_Position;
+
+   Xpos    : array (1 .. 5) of X_Position;
+   Ypos    : array (1 .. 5) of Y_Position;
+
+   done : Boolean;
+
+   c : Key_Code;
+
+   N : Integer;
+
+   G : Generator;
+
+   Max_X, X : X_Position;
+   Max_Y, Y : Y_Position;
+
+   procedure Next (J : in out Integer);
+   procedure Cursor (X : X_Position; Y : Y_Position);
+
+   procedure Next (J : in out Integer) is
+   begin
+      if J = 5 then
+         J := 1;
+      else
+         J := J + 1;
+      end if;
+   end Next;
+
+   procedure Cursor (X : X_Position; Y : Y_Position) is
+   begin
+      Move_Cursor (Line => X, Column => Y);
+   end Cursor;
+   pragma Inline (Cursor);
+
+begin
+
+   Init_Screen;
+   Set_NL_Mode;
+   Set_Echo_Mode (False);
+
+   Visibility := Invisible;
+   Set_Cursor_Visibility (Visibility);
+   Set_Timeout_Mode (Standard_Window, Non_Blocking, 0);
+
+   Max_X := Lines - 5;
+   Max_Y := Columns - 5;
+
+   for I in Xpos'Range loop
+      Xpos (I) := X_Position (Float (Max_X) * Random (G)) + 2;
+      Ypos (I) := Y_Position (Float (Max_Y) * Random (G)) + 2;
+   end loop;
+
+   N := 1;
+   done := False;
+   while not done and Process.Continue loop
+
+      X := X_Position (Float (Max_X) * Random (G)) + 2;
+      Y := Y_Position (Float (Max_Y) * Random (G)) + 2;
+
+      Cursor (X, Y);
+      Add (Ch => '.');
+
+      Cursor (Xpos (N), Ypos (N));
+      Add (Ch => 'o');
+
+      --
+      Next (N);
+      Cursor (Xpos (N), Ypos (N));
+      Add (Ch => 'O');
+
+      --
+      Next (N);
+      Cursor (Xpos (N) - 1, Ypos (N));
+      Add (Ch => '-');
+      Cursor (Xpos (N), Ypos (N) - 1);
+      Add (Str => "|.|");
+      Cursor (Xpos (N) + 1, Ypos (N));
+      Add (Ch => '-');
+
+      --
+      Next (N);
+      Cursor (Xpos (N) - 2, Ypos (N));
+      Add (Ch => '-');
+      Cursor (Xpos (N) - 1, Ypos (N) - 1);
+      Add (Str => "/\\");
+      Cursor (Xpos (N), Ypos (N) - 2);
+      Add (Str => "| O |");
+      Cursor (Xpos (N) + 1, Ypos (N) - 1);
+      Add (Str => "\\/");
+      Cursor (Xpos (N) + 2, Ypos (N));
+      Add (Ch => '-');
+
+      --
+      Next (N);
+      Cursor (Xpos (N) - 2, Ypos (N));
+      Add (Ch => ' ');
+      Cursor (Xpos (N) - 1, Ypos (N) - 1);
+      Add (Str => "   ");
+      Cursor (Xpos (N), Ypos (N) - 2);
+      Add (Str => "     ");
+      Cursor (Xpos (N) + 1, Ypos (N) - 1);
+      Add (Str => "   ");
+      Cursor (Xpos (N) + 2, Ypos (N));
+      Add (Ch => ' ');
+
+      Xpos (N) := X;
+      Ypos (N) := Y;
+
+      c := Getchar;
+      case c is
+      when Character'Pos ('q') => done := True;
+      when Character'Pos ('Q') => done := True;
+      when Character'Pos ('s') => Set_NoDelay_Mode (Standard_Window, False);
+      when Character'Pos (' ') => Set_NoDelay_Mode (Standard_Window, True);
+      when others => null;
+      end case;
+
+      Nap_Milli_Seconds (50);
+   end loop;
+
+   Visibility := Normal;
+   Set_Cursor_Visibility (Visibility);
+   End_Windows;
+   Curses_Free_All;
+
+end Rain;
diff --git a/Ada95/samples/rain.ads b/Ada95/samples/rain.ads
new file mode 100644
index 0000000..20ec065
--- /dev/null
+++ b/Ada95/samples/rain.ads
@@ -0,0 +1,44 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                   Rain                                   --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2002,2003 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Laurent Pautet <pautet@gnat.com>
+--  Modified by:  Juergen Pfeifer, 1997
+--  Version Control
+--  $Revision: 1.8 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+--                                                                          --
+procedure Rain;
diff --git a/Ada95/samples/sample-curses_demo-attributes.adb b/Ada95/samples/sample-curses_demo-attributes.adb
new file mode 100644
index 0000000..ed93711
--- /dev/null
+++ b/Ada95/samples/sample-curses_demo-attributes.adb
@@ -0,0 +1,123 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                       Sample.Curses_Demo.Attributes                      --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2002,2003 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control
+--  $Revision: 1.14 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Terminal_Interface.Curses; use Terminal_Interface.Curses;
+with Terminal_Interface.Curses.Panels;  use Terminal_Interface.Curses.Panels;
+
+with Sample.Manifest; use Sample.Manifest;
+with Sample.Function_Key_Setting; use Sample.Function_Key_Setting;
+with Sample.Keyboard_Handler; use Sample.Keyboard_Handler;
+with Sample.Explanation; use Sample.Explanation;
+
+package body Sample.Curses_Demo.Attributes is
+
+   procedure Demo
+   is
+      P : Panel := Create (Standard_Window);
+      K : Real_Key_Code;
+   begin
+      Set_Meta_Mode;
+      Set_KeyPad_Mode;
+
+      Top (P);
+
+      Push_Environment ("ATTRIBDEMO");
+      Default_Labels;
+      Notepad ("ATTRIB-PAD00");
+
+      Set_Character_Attributes (Attr => (others => False));
+      Add (Line => 1, Column => Columns / 2 - 10,
+           Str => "This is NORMAL");
+
+      Set_Character_Attributes (Attr => (Stand_Out => True,
+                                          others => False));
+      Add (Line => 2, Column => Columns / 2 - 10,
+           Str => "This is Stand_Out");
+
+      Set_Character_Attributes (Attr => (Under_Line => True,
+                                          others => False));
+      Add (Line => 3, Column => Columns / 2 - 10,
+           Str => "This is Under_Line");
+
+      Set_Character_Attributes (Attr => (Reverse_Video => True,
+                                          others => False));
+      Add (Line => 4, Column => Columns / 2 - 10,
+           Str => "This is Reverse_Video");
+
+      Set_Character_Attributes (Attr => (Blink => True,
+                                          others => False));
+      Add (Line => 5, Column => Columns / 2 - 10,
+           Str => "This is Blink");
+
+      Set_Character_Attributes (Attr => (Dim_Character => True,
+                                          others => False));
+      Add (Line => 6, Column => Columns / 2 - 10,
+           Str => "This is Dim_Character");
+
+      Set_Character_Attributes (Attr => (Bold_Character => True,
+                                          others => False));
+      Add (Line => 7, Column => Columns / 2 - 10,
+           Str => "This is Bold_Character");
+
+      Refresh_Without_Update;
+      Update_Panels; Update_Screen;
+
+      loop
+         K := Get_Key;
+         if K in Special_Key_Code'Range then
+            case K is
+               when QUIT_CODE     => exit;
+               when HELP_CODE     => Explain_Context;
+               when EXPLAIN_CODE  => Explain ("ATTRIBKEYS");
+               when others        => null;
+            end case;
+         end if;
+      end loop;
+
+      Pop_Environment;
+      Clear;
+      Refresh_Without_Update;
+      Delete (P);
+      Update_Panels; Update_Screen;
+
+   end Demo;
+
+end Sample.Curses_Demo.Attributes;
diff --git a/Ada95/samples/sample-curses_demo-attributes.ads b/Ada95/samples/sample-curses_demo-attributes.ads
new file mode 100644
index 0000000..636c12f
--- /dev/null
+++ b/Ada95/samples/sample-curses_demo-attributes.ads
@@ -0,0 +1,46 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                       Sample.Curses_Demo.Attributes                      --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2002,2003 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control
+--  $Revision: 1.11 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+package Sample.Curses_Demo.Attributes is
+
+   procedure Demo;
+
+end Sample.Curses_Demo.Attributes;
diff --git a/Ada95/samples/sample-curses_demo-mouse.adb b/Ada95/samples/sample-curses_demo-mouse.adb
new file mode 100644
index 0000000..d388e4c
--- /dev/null
+++ b/Ada95/samples/sample-curses_demo-mouse.adb
@@ -0,0 +1,221 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                         Sample.Curses_Demo.Mouse                         --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2006,2008 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control
+--  $Revision: 1.17 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Terminal_Interface.Curses; use Terminal_Interface.Curses;
+with Terminal_Interface.Curses.Panels; use Terminal_Interface.Curses.Panels;
+with Terminal_Interface.Curses.Mouse; use Terminal_Interface.Curses.Mouse;
+with Terminal_Interface.Curses.Text_IO; use Terminal_Interface.Curses.Text_IO;
+with Terminal_Interface.Curses.Text_IO.Integer_IO;
+with Terminal_Interface.Curses.Text_IO.Enumeration_IO;
+
+with Sample.Helpers; use Sample.Helpers;
+with Sample.Manifest; use Sample.Manifest;
+with Sample.Keyboard_Handler; use Sample.Keyboard_Handler;
+with Sample.Function_Key_Setting; use Sample.Function_Key_Setting;
+with Sample.Explanation; use Sample.Explanation;
+
+package body Sample.Curses_Demo.Mouse is
+
+   package Int_IO is new
+     Terminal_Interface.Curses.Text_IO.Integer_IO (Integer);
+   use Int_IO;
+
+   package Button_IO is new
+     Terminal_Interface.Curses.Text_IO.Enumeration_IO (Mouse_Button);
+   use Button_IO;
+
+   package State_IO is new
+     Terminal_Interface.Curses.Text_IO.Enumeration_IO (Button_State);
+   use State_IO;
+
+   procedure Demo is
+
+      type Controls is array (1 .. 3) of Panel;
+
+      Frame : Window;
+      Msg   : Window;
+      Ctl   : Controls;
+      Pan   : Panel;
+      K     : Real_Key_Code;
+      V     : Cursor_Visibility := Invisible;
+      W     : Window;
+      Note  : Window;
+      Msg_L : constant Line_Count := 8;
+      Lins  : Line_Position := Lines;
+      Cols  : Column_Position;
+      Mask  : Event_Mask;
+      procedure Show_Mouse_Event;
+
+      procedure Show_Mouse_Event
+      is
+         Evt    : constant Mouse_Event := Get_Mouse;
+         Y      : Line_Position;
+         X      : Column_Position;
+         Button : Mouse_Button;
+         State  : Button_State;
+         W      : Window;
+      begin
+         Get_Event (Evt, Y, X, Button, State);
+         Put (Msg, "Event at");
+         Put (Msg, "  X=");    Put (Msg, Integer (X), 3);
+         Put (Msg, ", Y=");    Put (Msg, Integer (Y), 3);
+         Put (Msg, ", Btn=");  Put (Msg, Button, 10);
+         Put (Msg, ", Stat="); Put (Msg, State, 15);
+         for I in Ctl'Range loop
+            W := Get_Window (Ctl (I));
+            if Enclosed_In_Window (W, Evt) then
+               Transform_Coordinates (W, Y, X, From_Screen);
+               Put (Msg, ",Box(");
+               Put (Msg, (I), 1); Put (Msg, ",");
+               Put (Msg, Integer (Y), 1); Put (Msg, ",");
+               Put (Msg, Integer (X), 1); Put (Msg, ")");
+            end if;
+         end loop;
+         New_Line (Msg);
+         Flush (Msg);
+         Update_Panels; Update_Screen;
+      end Show_Mouse_Event;
+
+   begin
+      Push_Environment ("MOUSE00");
+      Notepad ("MOUSE-PAD00");
+      Default_Labels;
+      Set_Cursor_Visibility (V);
+
+      Note  := Notepad_Window;
+      if Note /= Null_Window then
+         Get_Window_Position (Note, Lins, Cols);
+      end if;
+      Frame := Create (Msg_L, Columns, Lins - Msg_L, 0);
+      if Has_Colors then
+         Set_Background (Win => Frame,
+                         Ch => (Color => Default_Colors,
+                                Attr  => Normal_Video,
+                                Ch    => ' '));
+         Set_Character_Attributes (Win   => Frame,
+                                   Attr  => Normal_Video,
+                                   Color => Default_Colors);
+         Erase (Frame);
+      end if;
+      Msg   := Derived_Window (Frame, Msg_L - 2, Columns - 2, 1, 1);
+      Pan   := Create (Frame);
+
+      Set_Meta_Mode;
+      Set_KeyPad_Mode;
+      Mask := Start_Mouse;
+
+      Box (Frame);
+      Window_Title (Frame, "Mouse Protocol");
+      Refresh_Without_Update (Frame);
+      Allow_Scrolling (Msg, True);
+
+      declare
+         Middle_Column : constant Integer := Integer (Columns) / 2;
+         Middle_Index  : constant Natural := Ctl'First + (Ctl'Length / 2);
+         Width         : constant Column_Count := 5;
+         Height        : constant Line_Count   := 3;
+         Half          : constant Column_Count := Width / 2;
+         Space         : constant Column_Count := 3;
+         Position      : Integer;
+         W             : Window;
+      begin
+         for I in Ctl'Range loop
+            Position := ((I) - Integer (Middle_Index)) *
+              Integer (Half + Space + Width) + Middle_Column;
+            W := Create (Height,
+                         Width,
+                         1,
+                         Column_Position (Position));
+            if Has_Colors then
+               Set_Background (Win => W,
+                               Ch => (Color => Menu_Back_Color,
+                                      Attr  => Normal_Video,
+                                      Ch    => ' '));
+               Set_Character_Attributes (Win   => W,
+                                         Attr  => Normal_Video,
+                                         Color => Menu_Fore_Color);
+               Erase (W);
+            end if;
+            Ctl (I) := Create (W);
+            Box (W);
+            Move_Cursor (W, 1, Half);
+            Put (W, (I), 1);
+            Refresh_Without_Update (W);
+         end loop;
+      end;
+
+      Update_Panels; Update_Screen;
+
+      loop
+         K := Get_Key;
+         if K in Special_Key_Code'Range then
+            case K is
+               when QUIT_CODE     => exit;
+               when HELP_CODE     => Explain_Context;
+               when EXPLAIN_CODE  => Explain ("MOUSEKEYS");
+               when Key_Mouse     => Show_Mouse_Event;
+               when others        => null;
+            end case;
+         end if;
+      end loop;
+
+      for I in Ctl'Range loop
+         W := Get_Window (Ctl (I));
+         Clear (W);
+         Delete (Ctl (I));
+         Delete (W);
+      end loop;
+
+      Clear (Frame);
+      Delete (Pan);
+      Delete (Msg);
+      Delete (Frame);
+
+      Set_Cursor_Visibility (V);
+      End_Mouse (Mask);
+
+      Pop_Environment;
+      Update_Panels; Update_Screen;
+
+   end Demo;
+
+end Sample.Curses_Demo.Mouse;
diff --git a/Ada95/samples/sample-curses_demo-mouse.ads b/Ada95/samples/sample-curses_demo-mouse.ads
new file mode 100644
index 0000000..fbaebab
--- /dev/null
+++ b/Ada95/samples/sample-curses_demo-mouse.ads
@@ -0,0 +1,46 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                         Sample.Curses_Demo.Mouse                         --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2002,2003 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control
+--  $Revision: 1.11 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+package Sample.Curses_Demo.Mouse is
+
+   procedure Demo;
+
+end Sample.Curses_Demo.Mouse;
diff --git a/Ada95/samples/sample-curses_demo.adb b/Ada95/samples/sample-curses_demo.adb
new file mode 100644
index 0000000..f342a32
--- /dev/null
+++ b/Ada95/samples/sample-curses_demo.adb
@@ -0,0 +1,144 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                            Sample.Curses_Demo                            --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2004,2011 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control
+--  $Revision: 1.18 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Terminal_Interface.Curses; use Terminal_Interface.Curses;
+with Terminal_Interface.Curses.Menus; use Terminal_Interface.Curses.Menus;
+with Terminal_Interface.Curses.Mouse;  use Terminal_Interface.Curses.Mouse;
+with Terminal_Interface.Curses.Panels;  use Terminal_Interface.Curses.Panels;
+with Terminal_Interface.Curses.Panels.User_Data;
+
+with Sample.Manifest; use Sample.Manifest;
+with Sample.Helpers; use Sample.Helpers;
+with Sample.Function_Key_Setting; use Sample.Function_Key_Setting;
+
+with Sample.Explanation; use Sample.Explanation;
+
+with Sample.Menu_Demo.Handler;
+with Sample.Curses_Demo.Mouse;
+with Sample.Curses_Demo.Attributes;
+
+package body Sample.Curses_Demo is
+
+   type User_Data is new Integer;
+   type User_Data_Access is access all User_Data;
+   package PUD is new Panels.User_Data (User_Data, User_Data_Access);
+   --  We use above instantiation of the generic User_Data package to
+   --  demonstrate and test the use of the user data mechanism.
+
+   procedure Demo
+   is
+      function My_Driver (M : Menu;
+                          K : Key_Code;
+                          Pan : Panel) return Boolean;
+      package Mh is new Sample.Menu_Demo.Handler (My_Driver);
+
+      Itm : Item_Array_Access := new Item_Array'
+        (New_Item ("Attributes Demo"),
+         New_Item ("Mouse Demo"),
+         Null_Item);
+      M  : Menu := New_Menu (Itm);
+      U1 : constant User_Data_Access := new User_Data'(4711);
+      U2 : User_Data_Access;
+
+      function My_Driver (M : Menu;
+                          K : Key_Code;
+                          Pan : Panel) return Boolean
+      is
+         Idx : constant Positive := Get_Index (Current (M));
+         Result : Boolean := False;
+      begin
+         PUD.Set_User_Data (Pan, U1); --  set some user data, just for fun
+         if K in User_Key_Code'Range then
+            if K = QUIT then
+               Result := True;
+            elsif K = SELECT_ITEM then
+               if Idx in Itm'Range then
+                  Hide (Pan);
+                  Update_Panels;
+               end if;
+               case Idx is
+                  when 1 => Sample.Curses_Demo.Attributes.Demo;
+                  when 2 => Sample.Curses_Demo.Mouse.Demo;
+                  when others => Not_Implemented;
+               end case;
+               if Idx in Itm'Range then
+                  Top (Pan);
+                  Show (Pan);
+                  Update_Panels;
+                  Update_Screen;
+               end if;
+            end if;
+         end if;
+         PUD.Get_User_Data (Pan, U2); --  get the user data
+         pragma Assert (U1.all = U2.all and then U1 = U2);
+         return Result;
+      end My_Driver;
+
+   begin
+
+      if (1 + Item_Count (M)) /= Itm'Length then
+         raise Constraint_Error;
+      end if;
+
+      if not Has_Mouse then
+         declare
+            O : Item_Option_Set;
+         begin
+            Get_Options (Itm.all (2), O);
+            O.Selectable := False;
+            Set_Options (Itm.all (2), O);
+         end;
+      end if;
+
+      Push_Environment ("CURSES00");
+      Notepad ("CURSES-PAD00");
+      Default_Labels;
+      Refresh_Soft_Label_Keys_Without_Update;
+
+      Mh.Drive_Me (M, " Demo ");
+      Pop_Environment;
+
+      Delete (M);
+      Free (Itm, True);
+   end Demo;
+
+end Sample.Curses_Demo;
diff --git a/Ada95/samples/sample-curses_demo.ads b/Ada95/samples/sample-curses_demo.ads
new file mode 100644
index 0000000..264c4c0
--- /dev/null
+++ b/Ada95/samples/sample-curses_demo.ads
@@ -0,0 +1,46 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                            Sample.Curses_Demo                            --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2002,2003 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control
+--  $Revision: 1.11 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+package Sample.Curses_Demo is
+
+   procedure Demo;
+
+end Sample.Curses_Demo;
diff --git a/Ada95/samples/sample-explanation.adb_p b/Ada95/samples/sample-explanation.adb_p
new file mode 100644
index 0000000..f99ceb6
--- /dev/null
+++ b/Ada95/samples/sample-explanation.adb_p
@@ -0,0 +1,441 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                           Sample.Explanation                             --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2019,2020 Thomas E. Dickey                                     --
+--                                                                          --
+-- 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control
+--  $Revision: 1.5 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+--  Poor mans help system. This scans a sequential file for key lines and
+--  then reads the lines up to the next key. Those lines are presented in
+--  a window as help or explanation.
+--
+with Ada.Text_IO; use Ada.Text_IO;
+with Ada.Unchecked_Deallocation;
+with Terminal_Interface.Curses; use Terminal_Interface.Curses;
+with Terminal_Interface.Curses.Panels; use Terminal_Interface.Curses.Panels;
+
+with Sample.Keyboard_Handler; use Sample.Keyboard_Handler;
+with Sample.Manifest; use Sample.Manifest;
+with Sample.Function_Key_Setting; use Sample.Function_Key_Setting;
+with Sample.Helpers; use Sample.Helpers;
+
+package body Sample.Explanation is
+
+   Help_Keys : constant String := "HELPKEYS";
+   In_Help   : constant String := "INHELP";
+
+   File_Name : constant String := "explain.txt";
+   F : File_Type;
+
+   type Help_Line;
+   type Help_Line_Access is access Help_Line;
+   pragma Controlled (Help_Line_Access);
+   type String_Access is access String;
+   pragma Controlled (String_Access);
+
+   type Help_Line is
+      record
+         Prev, Next : Help_Line_Access;
+         Line : String_Access;
+      end record;
+
+   procedure Explain (Key : String;
+                      Win : Window);
+
+   procedure Release_String is
+     new Ada.Unchecked_Deallocation (String,
+                                     String_Access);
+   procedure Release_Help_Line is
+     new Ada.Unchecked_Deallocation (Help_Line,
+                                     Help_Line_Access);
+
+   function Search (Key : String) return Help_Line_Access;
+   procedure Release_Help (Root : in out Help_Line_Access);
+
+   function Check_File (Name : String) return Boolean;
+
+   procedure Explain (Key : String)
+   is
+   begin
+      Explain (Key, Null_Window);
+   end Explain;
+
+   procedure Explain (Key : String;
+                      Win : Window)
+   is
+      --  Retrieve the text associated with this key and display it in this
+      --  window. If no window argument is passed, the routine will create
+      --  a temporary window and use it.
+
+      function Filter_Key return Real_Key_Code;
+      procedure Unknown_Key;
+      procedure Redo;
+      procedure To_Window (C   : in out Help_Line_Access;
+                          More : in out Boolean);
+
+      Frame : Window := Null_Window;
+
+      W : Window := Win;
+      K : Real_Key_Code;
+      P : Panel;
+
+      Height   : Line_Count;
+      Width    : Column_Count;
+      Help     : Help_Line_Access := Search (Key);
+      Current  : Help_Line_Access;
+      Top_Line : Help_Line_Access;
+
+      Has_More : Boolean := True;
+
+      procedure Unknown_Key
+      is
+      begin
+         Add (W, "Help message with ID ");
+         Add (W, Key);
+         Add (W, " not found.");
+         Add (W, Character'Val (10));
+         Add (W, "Press the Function key labeled 'Quit' key to continue.");
+      end Unknown_Key;
+
+      procedure Redo
+      is
+         H : Help_Line_Access := Top_Line;
+      begin
+         if Top_Line /= null then
+            for L in 0 .. (Height - 1) loop
+               Add (W, L, 0, H.all.Line.all);
+               exit when H.all.Next = null;
+               H := H.all.Next;
+            end loop;
+         else
+            Unknown_Key;
+         end if;
+      end Redo;
+
+      function Filter_Key return Real_Key_Code
+      is
+         K : Real_Key_Code;
+      begin
+         loop
+            K := Get_Key (W);
+            if K in Special_Key_Code'Range then
+               case K is
+                  when HELP_CODE =>
+                     if not Find_Context (In_Help) then
+                        Push_Environment (In_Help, False);
+                        Explain (In_Help, W);
+                        Pop_Environment;
+                        Redo;
+                     end if;
+                  when EXPLAIN_CODE =>
+                     if not Find_Context (Help_Keys) then
+                        Push_Environment (Help_Keys, False);
+                        Explain (Help_Keys, W);
+                        Pop_Environment;
+                        Redo;
+                     end if;
+                  when others => exit;
+               end case;
+            else
+               exit;
+            end if;
+         end loop;
+         return K;
+      end Filter_Key;
+
+      procedure To_Window (C   : in out Help_Line_Access;
+                          More : in out Boolean)
+      is
+         L : Line_Position := 0;
+      begin
+         loop
+            Add (W, L, 0, C.all.Line.all);
+            L := L + 1;
+            exit when C.all.Next = null or else L = Height;
+            C := C.all.Next;
+         end loop;
+         if C.all.Next /= null then
+            pragma Assert (L = Height);
+            More := True;
+         else
+            More := False;
+         end if;
+      end To_Window;
+
+   begin
+      if W = Null_Window then
+         Push_Environment ("HELP");
+         Default_Labels;
+         Frame := New_Window (Lines - 2, Columns, 0, 0);
+         if Has_Colors then
+            Set_Background (Win => Frame,
+                            Ch  => (Ch    => ' ',
+                                    Color => Help_Color,
+                                    Attr  => Normal_Video));
+            Set_Character_Attributes (Win   => Frame,
+                                      Attr  => Normal_Video,
+                                      Color => Help_Color);
+            Erase (Frame);
+         end if;
+         Box (Frame);
+         Set_Character_Attributes (Frame, (Reverse_Video => True,
+                                           others        => False));
+         Add (Frame, Lines - 3, 2, "Cursor Up/Down scrolls");
+         Set_Character_Attributes (Frame); -- Back to default.
+         Window_Title (Frame, "Explanation");
+         W := Derived_Window (Frame, Lines - 4, Columns - 2, 1, 1);
+         Refresh_Without_Update (Frame);
+         Get_Size (W, Height, Width);
+         Set_Meta_Mode (W);
+         Set_KeyPad_Mode (W);
+         Allow_Scrolling (W, True);
+         Set_Echo_Mode (False);
+         P := Create (Frame);
+         Top (P);
+         Update_Panels;
+      else
+         Clear (W);
+         Refresh_Without_Update (W);
+      end if;
+
+      Current := Help; Top_Line := Help;
+
+      if null = Help then
+         Unknown_Key;
+         loop
+            K := Filter_Key;
+            exit when K = QUIT_CODE;
+         end loop;
+      else
+         To_Window (Current, Has_More);
+         if Has_More then
+            --  This means there are more lines available, so we have to go
+            --  into a scroll manager.
+            loop
+               K := Filter_Key;
+               if K in Special_Key_Code'Range then
+                  case K is
+                     when Key_Cursor_Down =>
+                        if Current.all.Next /= null then
+                           Move_Cursor (W, Height - 1, 0);
+                           Scroll (W, 1);
+                           Current := Current.all.Next;
+                           Top_Line := Top_Line.all.Next;
+                           Add (W, Current.all.Line.all);
+                        end if;
+                     when Key_Cursor_Up =>
+                        if Top_Line.all.Prev /= null then
+                           Move_Cursor (W, 0, 0);
+                           Scroll (W, -1);
+                           Top_Line := Top_Line.all.Prev;
+                           Current := Current.all.Prev;
+                           Add (W, Top_Line.all.Line.all);
+                        end if;
+                     when QUIT_CODE => exit;
+                        when others => null;
+                  end case;
+               end if;
+            end loop;
+         else
+            loop
+               K := Filter_Key;
+               exit when K = QUIT_CODE;
+            end loop;
+         end if;
+      end if;
+
+      Clear (W);
+
+      if Frame /= Null_Window then
+         Clear (Frame);
+         Delete (P);
+         Delete (W);
+         Delete (Frame);
+         Pop_Environment;
+      end if;
+
+      Update_Panels;
+      Update_Screen;
+
+      Release_Help (Help);
+
+   end Explain;
+
+   function Search (Key : String) return Help_Line_Access
+   is
+      Last    : Natural;
+      Buffer  : String (1 .. 256);
+      Root    : Help_Line_Access := null;
+      Current : Help_Line_Access;
+      Tail    : Help_Line_Access := null;
+
+      function Next_Line return Boolean;
+
+      function Next_Line return Boolean
+      is
+         H_End : constant String := "#END";
+      begin
+         Get_Line (F, Buffer, Last);
+         if Last = H_End'Length and then H_End = Buffer (1 .. Last) then
+            return False;
+         else
+            return True;
+         end if;
+      end Next_Line;
+   begin
+      Reset (F);
+      Outer :
+      loop
+         exit Outer when not Next_Line;
+         if Last = (1 + Key'Length)
+           and then Key = Buffer (2 .. Last)
+           and then Buffer (1) = '#'
+         then
+            loop
+               exit when not Next_Line;
+               exit when Buffer (1) = '#';
+               Current := new Help_Line'(null, null,
+                                         new String'(Buffer (1 .. Last)));
+               if Tail = null then
+                  Release_Help (Root);
+                  Root := Current;
+               else
+                  Tail.all.Next := Current;
+                  Current.all.Prev := Tail;
+               end if;
+               Tail := Current;
+            end loop;
+            exit Outer;
+         end if;
+      end loop Outer;
+      return Root;
+   end Search;
+
+   procedure Release_Help (Root : in out Help_Line_Access)
+   is
+      Next : Help_Line_Access;
+   begin
+      loop
+         exit when Root = null;
+         Next := Root.all.Next;
+         Release_String (Root.all.Line);
+         Release_Help_Line (Root);
+         Root := Next;
+      end loop;
+   end Release_Help;
+
+   procedure Explain_Context
+   is
+   begin
+      Explain (Context);
+   end Explain_Context;
+
+   procedure Notepad (Key : String)
+   is
+      H : constant Help_Line_Access := Search (Key);
+      T : Help_Line_Access := H;
+      N : Line_Count := 1;
+      L : Line_Position := 0;
+      W : Window;
+      P : Panel;
+   begin
+      if H /= null then
+         loop
+            T := T.all.Next;
+            exit when T = null;
+            N := N + 1;
+         end loop;
+         W := New_Window (N + 2, Columns, Lines - N - 2, 0);
+         if Has_Colors then
+            Set_Background (Win => W,
+                            Ch  => (Ch    => ' ',
+                                    Color => Notepad_Color,
+                                    Attr  => Normal_Video));
+            Set_Character_Attributes (Win   => W,
+                                      Attr  => Normal_Video,
+                                      Color => Notepad_Color);
+            Erase (W);
+         end if;
+         Box (W);
+         Window_Title (W, "Notepad");
+         P := New_Panel (W);
+         T := H;
+         loop
+            Add (W, L + 1, 1, T.all.Line.all, Integer (Columns - 2));
+            L := L + 1;
+            T := T.all.Next;
+            exit when T = null;
+         end loop;
+         T := H;
+         Release_Help (T);
+         Refresh_Without_Update (W);
+         Notepad_To_Context (P);
+      end if;
+   end Notepad;
+
+   function Check_File (Name : String) return Boolean is
+      The_File : File_Type;
+   begin
+      Open (The_File, In_File, Name);
+      Close (The_File);
+      return True;
+   exception
+      when Name_Error =>
+         return False;
+   end Check_File;
+
+begin
+   if Check_File
+      ($THIS_DATADIR
+       & File_Name)
+   then
+      Open (F, In_File,
+            $THIS_DATADIR
+            & File_Name);
+   elsif Check_File (File_Name) then
+      Open (F, In_File, File_Name);
+   else
+      Put_Line (Standard_Error,
+                "The file "
+                & File_Name
+                & " was not found in "
+                & $THIS_DATADIR
+                );
+      raise Name_Error;
+   end if;
+end Sample.Explanation;
+--  vile:adamode
diff --git a/Ada95/samples/sample-explanation.ads b/Ada95/samples/sample-explanation.ads
new file mode 100644
index 0000000..6e955b4
--- /dev/null
+++ b/Ada95/samples/sample-explanation.ads
@@ -0,0 +1,60 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                           Sample.Explanation                             --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2003,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control
+--  $Revision: 1.12 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+--  Poor mans help system. This scans a sequential file for key lines and
+--  then reads the lines up to the next key. Those lines are presented in
+--  a window as help or explanation.
+--
+package Sample.Explanation is
+
+   procedure Explain (Key : String);
+   --  Retrieve the text associated with this key and display it.
+
+   procedure Explain_Context;
+   --  Explain the current context.
+
+   procedure Notepad (Key : String);
+   --  Put a note on the screen and maintain it with the context
+
+   Explanation_Not_Found : exception;
+   Explanation_Error     : exception;
+
+end Sample.Explanation;
diff --git a/Ada95/samples/sample-form_demo-aux.adb b/Ada95/samples/sample-form_demo-aux.adb
new file mode 100644
index 0000000..072b187
--- /dev/null
+++ b/Ada95/samples/sample-form_demo-aux.adb
@@ -0,0 +1,264 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                            Sample.Form_Demo.Aux                          --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2004,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control
+--  $Revision: 1.18 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Ada.Characters.Latin_1; use Ada.Characters.Latin_1;
+
+with Sample.Manifest; use Sample.Manifest;
+with Sample.Helpers; use Sample.Helpers;
+with Sample.Keyboard_Handler; use Sample.Keyboard_Handler;
+with Sample.Explanation; use Sample.Explanation;
+
+package body Sample.Form_Demo.Aux is
+
+   procedure Geometry (F  : Form;
+                       L  : out Line_Count;        -- Lines used for menu
+                       C  : out Column_Count;      -- Columns used for menu
+                       Y  : out Line_Position;     -- Proposed Line for menu
+                       X  : out Column_Position)   -- Proposed Column for menu
+   is
+   begin
+      Scale (F, L, C);
+
+      L := L + 2;  -- count for frame at top and bottom
+      C := C + 2;  -- "
+
+      --  Calculate horizontal coordinate at the screen center
+      X := (Columns - C) / 2;
+      Y := 1; -- start always in line 1
+   end Geometry;
+
+   function Create (F     : Form;
+                    Title : String;
+                    Lin   : Line_Position;
+                    Col   : Column_Position) return Panel
+   is
+      W, S : Window;
+      L : Line_Count;
+      C : Column_Count;
+      Y : Line_Position;
+      X : Column_Position;
+      Pan : Panel;
+   begin
+      Geometry (F, L, C, Y, X);
+      W := New_Window (L, C, Lin, Col);
+      Set_Meta_Mode (W);
+      Set_KeyPad_Mode (W);
+      if Has_Colors then
+         Set_Background (Win => W,
+                         Ch  => (Ch    => ' ',
+                                 Color => Default_Colors,
+                                 Attr  => Normal_Video));
+         Set_Character_Attributes (Win => W,
+                                   Color => Default_Colors,
+                                   Attr  => Normal_Video);
+         Erase (W);
+      end if;
+      S := Derived_Window (W, L - 2, C - 2, 1, 1);
+      Set_Meta_Mode (S);
+      Set_KeyPad_Mode (S);
+      Box (W);
+      Set_Window (F, W);
+      Set_Sub_Window (F, S);
+      if Title'Length > 0 then
+         Window_Title (W, Title);
+      end if;
+      Pan := New_Panel (W);
+      Post (F);
+      return Pan;
+   end Create;
+
+   procedure Destroy (F : Form;
+                      P : in out Panel)
+   is
+      W, S : Window;
+   begin
+      W := Get_Window (F);
+      S := Get_Sub_Window (F);
+      Post (F, False);
+      Erase (W);
+      Delete (P);
+      Set_Window (F, Null_Window);
+      Set_Sub_Window (F, Null_Window);
+      Delete (S);
+      Delete (W);
+      Update_Panels;
+   end Destroy;
+
+   function Get_Request (F           : Form;
+                         P           : Panel;
+                         Handle_CRLF : Boolean := True) return Key_Code
+   is
+      W  : constant Window := Get_Window (F);
+      K  : Real_Key_Code;
+      Ch : Character;
+   begin
+      Top (P);
+      loop
+         K := Get_Key (W);
+         if K in Special_Key_Code'Range then
+            case K is
+               when HELP_CODE             => Explain_Context;
+               when EXPLAIN_CODE          => Explain ("FORMKEYS");
+               when Key_Home              => return F_First_Field;
+               when Key_End               => return F_Last_Field;
+               when QUIT_CODE             => return QUIT;
+               when Key_Cursor_Down       => return F_Down_Char;
+               when Key_Cursor_Up         => return F_Up_Char;
+               when Key_Cursor_Left       => return F_Previous_Char;
+               when Key_Cursor_Right      => return F_Next_Char;
+               when Key_Next_Page         => return F_Next_Page;
+               when Key_Previous_Page     => return F_Previous_Page;
+               when Key_Backspace         => return F_Delete_Previous;
+               when Key_Clear_Screen      => return F_Clear_Field;
+               when Key_Clear_End_Of_Line => return F_Clear_EOF;
+               when others                => return K;
+            end case;
+         elsif K in Normal_Key_Code'Range then
+            Ch := Character'Val (K);
+            case Ch is
+               when CAN => return QUIT;                  -- CTRL-X
+
+               when ACK => return F_Next_Field;          -- CTRL-F
+               when STX => return F_Previous_Field;      -- CTRL-B
+               when FF  => return F_Left_Field;          -- CTRL-L
+               when DC2 => return F_Right_Field;         -- CTRL-R
+               when NAK => return F_Up_Field;            -- CTRL-U
+               when EOT => return F_Down_Field;          -- CTRL-D
+
+               when ETB => return F_Next_Word;           -- CTRL-W
+               when DC4 => return F_Previous_Word;       -- CTRL-T
+
+               when SOH => return F_Begin_Field;         -- CTRL-A
+               when ENQ => return F_End_Field;           -- CTRL-E
+
+               when HT  => return F_Insert_Char;         -- CTRL-I
+               when SI  => return F_Insert_Line;         -- CTRL-O
+               when SYN => return F_Delete_Char;         -- CTRL-V
+               when BS  => return F_Delete_Previous;     -- CTRL-H
+               when EM  => return F_Delete_Line;         -- CTRL-Y
+               when BEL => return F_Delete_Word;         -- CTRL-G
+               when VT  => return F_Clear_EOF;           -- CTRL-K
+
+               when SO  => return F_Next_Choice;         -- CTRL-N
+               when DLE => return F_Previous_Choice;     -- CTRL-P
+
+               when CR | LF  =>
+                  if Handle_CRLF then
+                     return F_New_Line;
+                  else
+                     return K;
+                  end if;
+               when others => return K;
+            end case;
+         else
+            return K;
+         end if;
+      end loop;
+   end Get_Request;
+
+   function Make (Top         : Line_Position;
+                  Left        : Column_Position;
+                  Text        : String) return Field
+   is
+      Fld : Field;
+      C : constant Column_Count := Column_Count (Text'Length);
+   begin
+      Fld := New_Field (1, C, Top, Left);
+      Set_Buffer (Fld, 0, Text);
+      Switch_Options (Fld, (Active => True, others => False), False);
+      if Has_Colors then
+         Set_Background (Fld => Fld, Color => Default_Colors);
+      end if;
+      return Fld;
+   end Make;
+
+   function Make  (Height      : Line_Count := 1;
+                   Width       : Column_Count;
+                   Top         : Line_Position;
+                   Left        : Column_Position;
+                   Off_Screen  : Natural := 0) return Field
+   is
+      Fld : constant Field := New_Field (Height, Width, Top, Left, Off_Screen);
+   begin
+      if Has_Colors then
+         Set_Foreground (Fld => Fld, Color => Form_Fore_Color);
+         Set_Background (Fld => Fld, Color => Form_Back_Color);
+      else
+         Set_Background (Fld, (Reverse_Video => True, others => False));
+      end if;
+      return Fld;
+   end Make;
+
+   function Default_Driver (F : Form;
+                            K : Key_Code;
+                            P : Panel) return Boolean
+   is
+   begin
+      if P = Null_Panel then
+         raise Panel_Exception;
+      end if;
+      if K in User_Key_Code'Range and then K = QUIT then
+         if Driver (F, F_Validate_Field) = Form_Ok  then
+            return True;
+         end if;
+      end if;
+      return False;
+   end Default_Driver;
+
+   function Count_Active (F : Form) return Natural
+   is
+      N : Natural := 0;
+      O : Field_Option_Set;
+      H : constant Natural := Field_Count (F);
+   begin
+      if H > 0 then
+         for I in 1 .. H loop
+            Get_Options (Fields (F, I), O);
+            if O.Active then
+               N := N + 1;
+            end if;
+         end loop;
+      end if;
+      return N;
+   end Count_Active;
+
+end Sample.Form_Demo.Aux;
diff --git a/Ada95/samples/sample-form_demo-aux.ads b/Ada95/samples/sample-form_demo-aux.ads
new file mode 100644
index 0000000..7e7f286
--- /dev/null
+++ b/Ada95/samples/sample-form_demo-aux.ads
@@ -0,0 +1,93 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                            Sample.Form_Demo.Aux                          --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2009,2011 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control
+--  $Revision: 1.12 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Terminal_Interface.Curses; use  Terminal_Interface.Curses;
+with Terminal_Interface.Curses.Panels; use  Terminal_Interface.Curses.Panels;
+with Terminal_Interface.Curses.Forms;  use  Terminal_Interface.Curses.Forms;
+
+package Sample.Form_Demo.Aux is
+
+   procedure Geometry (F  : Form;
+                       L  : out Line_Count;
+                       C  : out Column_Count;
+                       Y  : out Line_Position;
+                       X  : out Column_Position);
+   --  Calculate the geometry for a panel being able to be used to display
+   --  the menu.
+
+   function Create (F     : Form;
+                    Title : String;
+                    Lin   : Line_Position;
+                    Col   : Column_Position) return Panel;
+   --  Create a panel decorated with a frame and the title at the specified
+   --  position. The dimension of the panel is derived from the menus layout.
+
+   procedure Destroy (F : Form;
+                      P : in out Panel);
+   --  Destroy all the windowing structures associated with this menu and
+   --  panel.
+
+   function Get_Request (F           : Form;
+                         P           : Panel;
+                         Handle_CRLF : Boolean := True) return Key_Code;
+   --  Centralized request driver for all menus in this sample. This
+   --  gives us a common key binding for all menus.
+
+   function Make (Top         : Line_Position;
+                  Left        : Column_Position;
+                  Text        : String) return Field;
+   --  create a label
+
+   function Make  (Height      : Line_Count := 1;
+                   Width       : Column_Count;
+                   Top         : Line_Position;
+                   Left        : Column_Position;
+                   Off_Screen  : Natural := 0) return Field;
+   --  create a editable field
+
+   function Default_Driver (F : Form;
+                            K : Key_Code;
+                            P : Panel) return Boolean;
+
+   function Count_Active (F : Form) return Natural;
+   --  Count the number of active fields in the form
+
+end Sample.Form_Demo.Aux;
diff --git a/Ada95/samples/sample-form_demo-handler.adb b/Ada95/samples/sample-form_demo-handler.adb
new file mode 100644
index 0000000..d180b1d
--- /dev/null
+++ b/Ada95/samples/sample-form_demo-handler.adb
@@ -0,0 +1,99 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                          Sample.Form_Demo.Handler                        --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2004,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control
+--  $Revision: 1.15 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Sample.Form_Demo.Aux;
+
+package body Sample.Form_Demo.Handler is
+
+   package Aux renames Sample.Form_Demo.Aux;
+
+   procedure Drive_Me (F     : Form;
+                       Title : String := "")
+   is
+      L : Line_Count;
+      C : Column_Count;
+      Y : Line_Position;
+      X : Column_Position;
+   begin
+      Aux.Geometry (F, L, C, Y, X);
+      Drive_Me (F, Y, X, Title);
+   end Drive_Me;
+
+   procedure Drive_Me (F     : Form;
+                       Lin   : Line_Position;
+                       Col   : Column_Position;
+                       Title : String := "")
+   is
+      Pan : Panel := Aux.Create (F, Title, Lin, Col);
+      V   : Cursor_Visibility := Normal;
+      Handle_CRLF : Boolean := True;
+
+   begin
+      Set_Cursor_Visibility (V);
+      if Aux.Count_Active (F) = 1 then
+         Handle_CRLF := False;
+      end if;
+      loop
+         declare
+            K : constant Key_Code := Aux.Get_Request (F, Pan, Handle_CRLF);
+            R : Driver_Result;
+         begin
+            if (K = 13 or else K = 10) and then not Handle_CRLF then
+               R := Unknown_Request;
+            else
+               R := Driver (F, K);
+            end if;
+            case R is
+               when Form_Ok => null;
+               when Unknown_Request =>
+                  if My_Driver (F, K, Pan) then
+                     exit;
+                  end if;
+               when others => Beep;
+            end case;
+         end;
+      end loop;
+      Set_Cursor_Visibility (V);
+      Aux.Destroy (F, Pan);
+   end Drive_Me;
+
+end Sample.Form_Demo.Handler;
diff --git a/Ada95/samples/sample-form_demo-handler.ads b/Ada95/samples/sample-form_demo-handler.ads
new file mode 100644
index 0000000..8966e5b
--- /dev/null
+++ b/Ada95/samples/sample-form_demo-handler.ads
@@ -0,0 +1,65 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                          Sample.Form_Demo.Handler                        --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2003,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control
+--  $Revision: 1.11 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Terminal_Interface.Curses;
+use  Terminal_Interface.Curses;
+with Terminal_Interface.Curses.Panels;
+use  Terminal_Interface.Curses.Panels;
+with Terminal_Interface.Curses.Forms;
+use  Terminal_Interface.Curses.Forms;
+
+generic
+   with function  My_Driver (Frm : Form;
+                             K   : Key_Code;
+                             Pan : Panel) return Boolean;
+package Sample.Form_Demo.Handler is
+
+   procedure Drive_Me (F     : Form;
+                       Lin   : Line_Position;
+                       Col   : Column_Position;
+                       Title : String := "");
+   --  Position the menu at the given point and drive it.
+
+   procedure Drive_Me (F     : Form;
+                       Title : String := "");
+   --  Center menu and drive it.
+
+end Sample.Form_Demo.Handler;
diff --git a/Ada95/samples/sample-form_demo.adb b/Ada95/samples/sample-form_demo.adb
new file mode 100644
index 0000000..72ca51c
--- /dev/null
+++ b/Ada95/samples/sample-form_demo.adb
@@ -0,0 +1,131 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                             Sample.Form_Demo                             --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2006,2011 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control
+--  $Revision: 1.17 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Terminal_Interface.Curses; use Terminal_Interface.Curses;
+with Terminal_Interface.Curses.Forms; use Terminal_Interface.Curses.Forms;
+with Terminal_Interface.Curses.Forms.Field_User_Data;
+with Sample.My_Field_Type; use Sample.My_Field_Type;
+with Sample.Explanation; use Sample.Explanation;
+with Sample.Form_Demo.Aux; use Sample.Form_Demo.Aux;
+with Sample.Function_Key_Setting; use Sample.Function_Key_Setting;
+with Sample.Form_Demo.Handler;
+
+with Terminal_Interface.Curses.Forms.Field_Types.Enumeration.Ada;
+with Terminal_Interface.Curses.Forms.Field_Types.Enumeration;
+use  Terminal_Interface.Curses.Forms.Field_Types.Enumeration;
+with Terminal_Interface.Curses.Forms.Field_Types.IntField;
+use  Terminal_Interface.Curses.Forms.Field_Types.IntField;
+
+package body Sample.Form_Demo is
+
+   type User_Data is
+      record
+         Data : Integer;
+      end record;
+   type User_Access is access User_Data;
+
+   package Fld_U is new
+     Terminal_Interface.Curses.Forms.Field_User_Data (User_Data,
+                                                      User_Access);
+
+   type Weekday is (Sunday, Monday, Tuesday, Wednesday, Thursday,
+                    Friday, Saturday);
+
+   package Weekday_Enum is new
+     Terminal_Interface.Curses.Forms.Field_Types.Enumeration.Ada (Weekday);
+
+   Enum_Field : constant Enumeration_Field :=
+     Weekday_Enum.Create;
+
+   procedure Demo
+   is
+
+      Mft : constant My_Data := (Ch => 'X');
+
+      FA : Field_Array_Access := new Field_Array'
+        (Make (0, 14, "Sample Entry Form"),
+         Make (2, 0,  "WeekdayEnumeration"),
+         Make (2, 20, "Numeric 1-10"),
+         Make (2, 34, "Only 'X'"),
+         Make (5, 0, "Multiple Lines offscreen(Scroll)"),
+         Make (Width => 18, Top => 3, Left =>  0),
+         Make (Width => 12, Top => 3, Left => 20),
+         Make (Width => 12, Top => 3, Left => 34),
+         Make (Width => 46, Top => 6, Left => 0, Height => 4, Off_Screen => 2),
+         Null_Field
+         );
+
+      Frm : Terminal_Interface.Curses.Forms.Form := Create (FA);
+
+      I_F : constant Integer_Field := (Precision   => 0,
+                                       Lower_Limit => 1,
+                                       Upper_Limit => 10);
+
+      F1, F2 : User_Access;
+
+      package Fh is new Sample.Form_Demo.Handler (Default_Driver);
+
+   begin
+      Push_Environment ("FORM00");
+      Notepad ("FORM-PAD00");
+      Default_Labels;
+
+      Set_Field_Type (FA.all (6), Enum_Field);
+      Set_Field_Type (FA.all (7), I_F);
+      Set_Field_Type (FA.all (8), Mft);
+
+      F1 := new User_Data'(Data => 4711);
+      Fld_U.Set_User_Data (FA.all (1), F1);
+
+      Fh.Drive_Me (Frm);
+
+      Fld_U.Get_User_Data (FA.all (1), F2);
+      pragma Assert (F1 = F2);
+      pragma Assert (F1.Data = F2.Data);
+
+      Pop_Environment;
+      Delete (Frm);
+
+      Free (FA, True);
+   end Demo;
+
+end Sample.Form_Demo;
diff --git a/Ada95/samples/sample-form_demo.ads b/Ada95/samples/sample-form_demo.ads
new file mode 100644
index 0000000..0dda071
--- /dev/null
+++ b/Ada95/samples/sample-form_demo.ads
@@ -0,0 +1,46 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                             Sample.Form_Demo                             --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2002,2003 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control
+--  $Revision: 1.11 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+package Sample.Form_Demo is
+
+   procedure Demo;
+
+end Sample.Form_Demo;
diff --git a/Ada95/samples/sample-function_key_setting.adb b/Ada95/samples/sample-function_key_setting.adb
new file mode 100644
index 0000000..6c5a804
--- /dev/null
+++ b/Ada95/samples/sample-function_key_setting.adb
@@ -0,0 +1,215 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                         Sample.Function_Key_Setting                      --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2009,2011 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control
+--  $Revision: 1.16 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Ada.Unchecked_Deallocation;
+with Sample.Manifest; use  Sample.Manifest;
+
+--  This package implements a simple stack of function key label environments.
+--
+package body Sample.Function_Key_Setting is
+
+   Max_Label_Length : constant Positive := 8;
+   Number_Of_Keys   : Label_Number := Label_Number'Last;
+   Justification    : Label_Justification := Left;
+
+   subtype Label is String (1 .. Max_Label_Length);
+   type Label_Array is array (Label_Number range <>) of Label;
+
+   type Key_Environment (N : Label_Number := Label_Number'Last);
+   type Env_Ptr is access Key_Environment;
+   pragma Controlled (Env_Ptr);
+
+   type String_Access is access String;
+   pragma Controlled (String_Access);
+
+   Active_Context : String_Access := new String'("MAIN");
+   Active_Notepad : Panel := Null_Panel;
+
+   type Key_Environment  (N : Label_Number := Label_Number'Last) is
+      record
+         Prev    : Env_Ptr;
+         Help    : String_Access;
+         Notepad : Panel;
+         Labels  : Label_Array (1 .. N);
+      end record;
+
+   procedure Release_String is
+     new Ada.Unchecked_Deallocation (String,
+                                     String_Access);
+
+   procedure Release_Environment is
+      new Ada.Unchecked_Deallocation (Key_Environment,
+                                      Env_Ptr);
+
+   Top_Of_Stack : Env_Ptr := null;
+
+   procedure Push_Environment (Key   : String;
+                               Reset : Boolean := True)
+   is
+      P : constant Env_Ptr := new Key_Environment (Number_Of_Keys);
+   begin
+      --  Store the current labels in the environment
+      for I in 1 .. Number_Of_Keys loop
+         Get_Soft_Label_Key (I, P.all.Labels (I));
+         if Reset then
+            Set_Soft_Label_Key (I, " ");
+         end if;
+      end loop;
+      P.all.Prev := Top_Of_Stack;
+      --  now store active help context and notepad
+      P.all.Help := Active_Context;
+      P.all.Notepad := Active_Notepad;
+      --  The notepad must now vanish and the new notepad is empty.
+      if P.all.Notepad /= Null_Panel then
+         Hide (P.all.Notepad);
+         Update_Panels;
+      end if;
+      Active_Notepad := Null_Panel;
+      Active_Context := new String'(Key);
+
+      Top_Of_Stack := P;
+      if Reset then
+         Refresh_Soft_Label_Keys_Without_Update;
+      end if;
+   end Push_Environment;
+
+   procedure Pop_Environment
+   is
+      P : Env_Ptr := Top_Of_Stack;
+   begin
+      if Top_Of_Stack = null then
+         raise Function_Key_Stack_Error;
+      else
+         for I in 1 .. Number_Of_Keys loop
+            Set_Soft_Label_Key (I, P.all.Labels (I), Justification);
+         end loop;
+         pragma Assert (Active_Context /= null);
+         Release_String (Active_Context);
+         Active_Context := P.all.Help;
+         Refresh_Soft_Label_Keys_Without_Update;
+         Notepad_To_Context (P.all.Notepad);
+         Top_Of_Stack := P.all.Prev;
+         Release_Environment (P);
+      end if;
+   end Pop_Environment;
+
+   function Context return String
+   is
+   begin
+      if Active_Context /= null then
+         return Active_Context.all;
+      else
+         return "";
+      end if;
+   end Context;
+
+   function Find_Context (Key : String) return Boolean
+   is
+      P : Env_Ptr := Top_Of_Stack;
+   begin
+      if Active_Context.all = Key then
+         return True;
+      else
+         loop
+            exit when P = null;
+            if P.all.Help.all = Key then
+               return True;
+            else
+               P := P.all.Prev;
+            end if;
+         end loop;
+         return False;
+      end if;
+   end Find_Context;
+
+   procedure Notepad_To_Context (Pan : Panel)
+   is
+      W : Window;
+   begin
+      if Active_Notepad /= Null_Panel then
+         W := Get_Window (Active_Notepad);
+         Clear (W);
+         Delete (Active_Notepad);
+         Delete (W);
+      end if;
+      Active_Notepad := Pan;
+      if Pan /= Null_Panel then
+         Top  (Pan);
+      end if;
+      Update_Panels;
+      Update_Screen;
+   end Notepad_To_Context;
+
+   procedure Initialize (Mode : Soft_Label_Key_Format := PC_Style;
+                         Just : Label_Justification := Left)
+   is
+   begin
+      case Mode is
+         when PC_Style .. PC_Style_With_Index
+           => Number_Of_Keys := 12;
+         when others
+           => Number_Of_Keys := 8;
+      end case;
+      Init_Soft_Label_Keys (Mode);
+      Justification := Just;
+   end Initialize;
+
+   procedure Default_Labels
+   is
+   begin
+      Set_Soft_Label_Key (FKEY_QUIT, "Quit");
+      Set_Soft_Label_Key (FKEY_HELP, "Help");
+      Set_Soft_Label_Key (FKEY_EXPLAIN, "Keys");
+      Refresh_Soft_Label_Keys_Without_Update;
+   end Default_Labels;
+
+   function Notepad_Window return Window
+   is
+   begin
+      if Active_Notepad /= Null_Panel then
+         return Get_Window (Active_Notepad);
+      else
+         return Null_Window;
+      end if;
+   end Notepad_Window;
+
+end Sample.Function_Key_Setting;
diff --git a/Ada95/samples/sample-function_key_setting.ads b/Ada95/samples/sample-function_key_setting.ads
new file mode 100644
index 0000000..daf1453
--- /dev/null
+++ b/Ada95/samples/sample-function_key_setting.ads
@@ -0,0 +1,83 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                         Sample.Function_Key_Setting                      --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2009,2011 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control
+--  $Revision: 1.12 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Terminal_Interface.Curses; use Terminal_Interface.Curses;
+with Terminal_Interface.Curses.Panels; use Terminal_Interface.Curses.Panels;
+
+--  This package implements a simple stack of function key label environments.
+--
+package Sample.Function_Key_Setting is
+
+   procedure Push_Environment (Key   : String;
+                               Reset : Boolean := True);
+   --  Push the definition of the current function keys on an internal
+   --  stack. If the reset flag is true, all labels are reset while
+   --  pushed, so the new environment can assume a tabula rasa.
+   --  The Key defines the new Help Context associated with the new
+   --  Environment. This saves also the currently active Notepad.
+
+   procedure Pop_Environment;
+   --  Pop the Definitions from the stack and make them the current ones.
+   --  This also restores the Help context and the previous Notepad.
+
+   procedure Initialize (Mode : Soft_Label_Key_Format := PC_Style;
+                         Just : Label_Justification := Left);
+   --  Initialize the environment
+
+   function Context return String;
+   --  Return the current context identifier
+
+   function Find_Context (Key : String) return Boolean;
+   --  Look for a context, return true if it is in the stack,
+   --  false otherwise.
+
+   procedure Notepad_To_Context (Pan : Panel);
+   --  Add a panel representing a notepad to the current context.
+
+   Function_Key_Stack_Error : exception;
+
+   procedure Default_Labels;
+   --  Set the default labels used in all environments
+
+   function Notepad_Window return Window;
+   --  Return the current notepad window or Null_Window if there is none.
+
+end Sample.Function_Key_Setting;
diff --git a/Ada95/samples/sample-header_handler.adb b/Ada95/samples/sample-header_handler.adb
new file mode 100644
index 0000000..572aa8a
--- /dev/null
+++ b/Ada95/samples/sample-header_handler.adb
@@ -0,0 +1,186 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                            Sample.Header_Handler                         --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2011,2014 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control
+--  $Revision: 1.21 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Ada.Calendar; use Ada.Calendar;
+with Terminal_Interface.Curses.Text_IO.Integer_IO;
+with Sample.Manifest; use Sample.Manifest;
+
+pragma Elaborate_All (Terminal_Interface.Curses.Text_Io.Integer_IO);
+
+--  This package handles the painting of the header line of the screen.
+--
+package body Sample.Header_Handler is
+
+   package Int_IO is new
+     Terminal_Interface.Curses.Text_IO.Integer_IO (Integer);
+   use Int_IO;
+
+   Header_Window : Window := Null_Window;
+
+   Display_Hour  : Integer := -1; -- hour last displayed
+   Display_Min   : Integer := -1; -- minute last displayed
+   Display_Day   : Integer := -1; -- day last displayed
+   Display_Month : Integer := -1; -- month last displayed
+
+   --  This is the routine handed over to the curses library to be called
+   --  as initialization routine when ripping of the header lines from
+   --  the screen. This routine must follow C conventions.
+   function Init_Header_Window (Win     : Window;
+                                Columns : Column_Count) return Integer;
+   pragma Convention (C, Init_Header_Window);
+
+   procedure Internal_Update_Header_Window (Do_Update : Boolean);
+
+   --  The initialization must be called before Init_Screen. It steals two
+   --  lines from the top of the screen.
+   procedure Init_Header_Handler
+   is
+   begin
+      Rip_Off_Lines (2, Init_Header_Window'Access);
+   end Init_Header_Handler;
+
+   procedure N_Out (N : Integer);
+
+   --  Emit a two digit number and ensure that a leading zero is generated if
+   --  necessary.
+   procedure N_Out (N : Integer)
+   is
+   begin
+      if N < 10 then
+         Add (Header_Window, '0');
+         Put (Header_Window, N, 1);
+      else
+         Put (Header_Window, N, 2);
+      end if;
+   end N_Out;
+
+   --  Paint the header window. The input parameter is a flag indicating
+   --  whether or not the screen should be updated physically after painting.
+   procedure Internal_Update_Header_Window (Do_Update : Boolean)
+   is
+      type Month_Name_Array is
+         array (Month_Number'First .. Month_Number'Last) of String (1 .. 9);
+
+      Month_Names : constant Month_Name_Array :=
+        ("January  ",
+         "February ",
+         "March    ",
+         "April    ",
+         "May      ",
+         "June     ",
+         "July     ",
+         "August   ",
+         "September",
+         "October  ",
+         "November ",
+         "December ");
+
+      Now    : constant Time         := Clock;
+      Sec    : constant Integer      := Integer (Seconds (Now));
+      Hour   : constant Integer      := Sec / 3600;
+      Minute : constant Integer      := (Sec - Hour * 3600) / 60;
+      Mon    : constant Month_Number := Month (Now);
+      D      : constant Day_Number   := Day (Now);
+   begin
+      if Header_Window /= Null_Window then
+         if Minute /= Display_Min
+           or else Hour /= Display_Hour
+           or else Display_Day /= D
+           or else Display_Month /= Mon
+         then
+            Move_Cursor (Header_Window, 0, 0);
+            N_Out (D); Add (Header_Window, '.');
+            Add (Header_Window, Month_Names (Mon));
+            Move_Cursor (Header_Window, 1, 0);
+            N_Out (Hour); Add (Header_Window, ':');
+            N_Out (Minute);
+            Display_Min   := Minute;
+            Display_Hour  := Hour;
+            Display_Month := Mon;
+            Display_Day   := D;
+            Refresh_Without_Update (Header_Window);
+            if Do_Update then
+               Update_Screen;
+            end if;
+         end if;
+      end if;
+   end Internal_Update_Header_Window;
+
+   --  This routine is called in the keyboard input timeout handler. So it will
+   --  periodically update the header line of the screen.
+   procedure Update_Header_Window
+   is
+   begin
+      Internal_Update_Header_Window (True);
+   end Update_Header_Window;
+
+   function Init_Header_Window (Win     : Window;
+                                Columns : Column_Count) return Integer
+   is
+      Title  : constant String := "Ada 95 ncurses Binding Sample";
+      Pos    : Column_Position;
+   begin
+      Header_Window := Win;
+      if Win /= Null_Window then
+         if Has_Colors then
+            Set_Background (Win => Win,
+                            Ch  => (Ch    => ' ',
+                                    Color => Header_Color,
+                                    Attr  => Normal_Video));
+            Set_Character_Attributes (Win   => Win,
+                                      Attr  => Normal_Video,
+                                      Color => Header_Color);
+            Erase (Win);
+         end if;
+         Leave_Cursor_After_Update (Win, True);
+         Pos := Columns - Column_Position (Title'Length);
+         Add (Win, 0, Pos / 2, Title);
+         --  In this phase we must not allow a physical update, because
+         --  ncurses is not properly initialized at this point.
+         Internal_Update_Header_Window (False);
+         return 0;
+      else
+         return -1;
+      end if;
+   end Init_Header_Window;
+
+end Sample.Header_Handler;
diff --git a/Ada95/samples/sample-header_handler.ads b/Ada95/samples/sample-header_handler.ads
new file mode 100644
index 0000000..18f76d7
--- /dev/null
+++ b/Ada95/samples/sample-header_handler.ads
@@ -0,0 +1,54 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                            Sample.Header_Handler                         --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2002,2003 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control
+--  $Revision: 1.11 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Terminal_Interface.Curses; use Terminal_Interface.Curses;
+
+--  This package handles the painting of the header line of the screen.
+--
+package Sample.Header_Handler is
+
+   procedure Init_Header_Handler;
+   --  Initialize the handler for the headerlines.
+
+   procedure Update_Header_Window;
+   --  Update the information in the header window
+
+end Sample.Header_Handler;
diff --git a/Ada95/samples/sample-helpers.adb b/Ada95/samples/sample-helpers.adb
new file mode 100644
index 0000000..4dbdd40
--- /dev/null
+++ b/Ada95/samples/sample-helpers.adb
@@ -0,0 +1,69 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                              Sample.Helpers                              --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2009,2011 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control
+--  $Revision: 1.15 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Sample.Explanation; use Sample.Explanation;
+
+--  This package contains some convenient helper routines used throughout
+--  this example.
+--
+package body Sample.Helpers is
+
+   procedure Window_Title (Win   : Window;
+                           Title : String)
+   is
+      Height : Line_Count;
+      Width  : Column_Count;
+      Pos    : Column_Position := 0;
+   begin
+      Get_Size (Win, Height, Width);
+      if Title'Length < Width then
+         Pos := (Width - Title'Length) / 2;
+      end if;
+      Add (Win, 0, Pos, Title);
+   end Window_Title;
+
+   procedure Not_Implemented is
+   begin
+      Explain ("NOTIMPL");
+   end Not_Implemented;
+
+end Sample.Helpers;
diff --git a/Ada95/samples/sample-helpers.ads b/Ada95/samples/sample-helpers.ads
new file mode 100644
index 0000000..5b7d3d7
--- /dev/null
+++ b/Ada95/samples/sample-helpers.ads
@@ -0,0 +1,55 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                              Sample.Helpers                              --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2009,2011 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control
+--  $Revision: 1.12 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Terminal_Interface.Curses; use Terminal_Interface.Curses;
+
+--  This package contains some convenient helper routines used throughout
+--  this example.
+--
+package Sample.Helpers is
+
+   procedure Window_Title (Win   : Window;
+                           Title : String);
+   --  Put a title string into the first line of the window
+
+   procedure Not_Implemented;
+
+end Sample.Helpers;
diff --git a/Ada95/samples/sample-keyboard_handler.adb b/Ada95/samples/sample-keyboard_handler.adb
new file mode 100644
index 0000000..5a671fa
--- /dev/null
+++ b/Ada95/samples/sample-keyboard_handler.adb
@@ -0,0 +1,195 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                            Sample.Keyboard_Handler                       --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2006,2011 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control
+--  $Revision: 1.17 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Ada.Strings; use Ada.Strings;
+with Ada.Strings.Fixed; use Ada.Strings.Fixed;
+with Ada.Strings.Maps.Constants; use Ada.Strings.Maps.Constants;
+with Ada.Characters.Latin_1; use Ada.Characters.Latin_1;
+with Ada.Characters.Handling; use Ada.Characters.Handling;
+
+with Terminal_Interface.Curses.Panels; use Terminal_Interface.Curses.Panels;
+with Terminal_Interface.Curses.Forms; use Terminal_Interface.Curses.Forms;
+with Terminal_Interface.Curses.Forms.Field_Types.Enumeration;
+use  Terminal_Interface.Curses.Forms.Field_Types.Enumeration;
+
+with Sample.Header_Handler; use Sample.Header_Handler;
+with Sample.Form_Demo.Aux; use Sample.Form_Demo.Aux;
+with Sample.Manifest; use Sample.Manifest;
+with Sample.Form_Demo.Handler;
+
+--  This package contains a centralized keyboard handler used throughout
+--  this example. The handler establishes a timeout mechanism that provides
+--  periodical updates of the common header lines used in this example.
+--
+
+package body Sample.Keyboard_Handler is
+
+   In_Command : Boolean := False;
+
+   function Get_Key (Win : Window := Standard_Window) return Real_Key_Code
+   is
+      K : Real_Key_Code;
+
+      function Command return Real_Key_Code;
+
+      function Command return Real_Key_Code
+      is
+         function My_Driver (F : Form;
+                             C : Key_Code;
+                             P : Panel) return Boolean;
+         package Fh is new Sample.Form_Demo.Handler (My_Driver);
+
+         type Label_Array is array (Label_Number) of String (1 .. 8);
+
+         Labels : Label_Array;
+
+         FA : Field_Array_Access := new Field_Array'
+           (Make (0, 0, "Command:"),
+            Make (Top => 0, Left => 9, Width => Columns - 11),
+            Null_Field);
+
+         K  : Real_Key_Code := Key_None;
+         N  : Natural := 0;
+
+         function My_Driver (F : Form;
+                             C : Key_Code;
+                             P : Panel) return Boolean
+         is
+            Ch : Character;
+         begin
+            if P = Null_Panel then
+               raise Panel_Exception;
+            end if;
+            if C in User_Key_Code'Range and then C = QUIT then
+               if Driver (F, F_Validate_Field) = Form_Ok  then
+                  K := Key_None;
+                  return True;
+               end if;
+            elsif C in Normal_Key_Code'Range then
+               Ch := Character'Val (C);
+               if Ch = LF or else Ch = CR then
+                  if Driver (F, F_Validate_Field) = Form_Ok  then
+                     declare
+                        Buffer : String (1 .. Positive (Columns - 11));
+                        Cmdc : String (1 .. 8);
+                     begin
+                        Get_Buffer (Fld => FA.all (2), Str => Buffer);
+                        Trim (Buffer, Left);
+                        if Buffer (1) /= ' ' then
+                           Cmdc := To_Upper (Buffer (Cmdc'Range));
+                           for I in Labels'Range loop
+                              if Cmdc = Labels (I) then
+                                 K := Function_Key_Code
+                                   (Function_Key_Number (I));
+                                 exit;
+                              end if;
+                           end loop;
+                        end if;
+                        return True;
+                     end;
+                  end if;
+               end if;
+            end if;
+            return False;
+         end My_Driver;
+
+      begin
+         In_Command := True;
+         for I in Label_Number'Range loop
+            Get_Soft_Label_Key (I, Labels (I));
+            Trim (Labels (I), Left);
+            Translate (Labels (I), Upper_Case_Map);
+            if Labels (I) (1) /= ' ' then
+               N := N + 1;
+            end if;
+         end loop;
+         if N > 0 then --  some labels were really set
+            declare
+               Enum_Info    : Enumeration_Info (N);
+               Enum_Field   : Enumeration_Field;
+               J : Positive := Enum_Info.Names'First;
+
+               Frm : Form := Create (FA);
+
+            begin
+               for I in Label_Number'Range loop
+                  if Labels (I) (1) /= ' ' then
+                     Enum_Info.Names (J) := new String'(Labels (I));
+                     J := J + 1;
+                  end if;
+               end loop;
+               Enum_Field := Create (Enum_Info, True);
+               Set_Field_Type (FA.all (2), Enum_Field);
+               Set_Background (FA.all (2), Normal_Video);
+
+               Fh.Drive_Me (Frm, Lines - 3, 0);
+               Delete (Frm);
+               Update_Panels; Update_Screen;
+            end;
+         end if;
+         Free (FA, True);
+         In_Command := False;
+         return K;
+      end Command;
+
+   begin
+      Set_Timeout_Mode (Win, Delayed, 30000);
+      loop
+         K := Get_Keystroke (Win);
+         if K = Key_None then  -- a timeout occurred
+            Update_Header_Window;
+         elsif K = 3 and then not In_Command  then  -- CTRL-C
+            K := Command;
+            exit when K /= Key_None;
+         else
+            exit;
+         end if;
+      end loop;
+      return K;
+   end Get_Key;
+
+   procedure Init_Keyboard_Handler is
+   begin
+      null;
+   end Init_Keyboard_Handler;
+
+end Sample.Keyboard_Handler;
diff --git a/Ada95/samples/sample-keyboard_handler.ads b/Ada95/samples/sample-keyboard_handler.ads
new file mode 100644
index 0000000..6daecc8
--- /dev/null
+++ b/Ada95/samples/sample-keyboard_handler.ads
@@ -0,0 +1,56 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                           Sample.Keyboard_Handler                        --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2002,2003 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control
+--  $Revision: 1.11 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Terminal_Interface.Curses; use Terminal_Interface.Curses;
+
+--  This package contains a centralized keyboard handler used throughout
+--  this example. The handler establishes a timeout mechanism that provides
+--  periodical updates of the common header lines used in this example.
+--
+package Sample.Keyboard_Handler is
+
+   function Get_Key (Win : Window := Standard_Window) return Real_Key_Code;
+   --  The central routine for handling keystrokes.
+
+   procedure Init_Keyboard_Handler;
+   --  Initialize the keyboard
+
+end Sample.Keyboard_Handler;
diff --git a/Ada95/samples/sample-manifest.ads b/Ada95/samples/sample-manifest.ads
new file mode 100644
index 0000000..1fa33a9
--- /dev/null
+++ b/Ada95/samples/sample-manifest.ads
@@ -0,0 +1,68 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                             Sample.Manifest                              --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2002,2003 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control
+--  $Revision: 1.13 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Terminal_Interface.Curses; use Terminal_Interface.Curses;
+
+package Sample.Manifest is
+
+   QUIT         : constant User_Key_Code    := User_Key_Code'First;
+   SELECT_ITEM  : constant User_Key_Code    := QUIT + 1;
+
+   FKEY_HELP    : constant Label_Number     := 1;
+   HELP_CODE    : constant Special_Key_Code := Key_F1;
+   FKEY_EXPLAIN : constant Label_Number     := 2;
+   EXPLAIN_CODE : constant Special_Key_Code := Key_F2;
+   FKEY_QUIT    : constant Label_Number     := 3;
+   QUIT_CODE    : constant Special_Key_Code := Key_F3;
+
+   Menu_Marker : constant String := "=> ";
+
+   Default_Colors  : constant Redefinable_Color_Pair := 1;
+   Menu_Fore_Color : constant Redefinable_Color_Pair := 2;
+   Menu_Back_Color : constant Redefinable_Color_Pair := 3;
+   Menu_Grey_Color : constant Redefinable_Color_Pair := 4;
+   Form_Fore_Color : constant Redefinable_Color_Pair := 5;
+   Form_Back_Color : constant Redefinable_Color_Pair := 6;
+   Notepad_Color   : constant Redefinable_Color_Pair := 7;
+   Help_Color      : constant Redefinable_Color_Pair := 8;
+   Header_Color    : constant Redefinable_Color_Pair := 9;
+
+end Sample.Manifest;
diff --git a/Ada95/samples/sample-menu_demo-aux.adb b/Ada95/samples/sample-menu_demo-aux.adb
new file mode 100644
index 0000000..f430c88
--- /dev/null
+++ b/Ada95/samples/sample-menu_demo-aux.adb
@@ -0,0 +1,205 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                            Sample.Menu_Demo.Aux                          --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2006,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control
+--  $Revision: 1.15 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Ada.Characters.Latin_1; use Ada.Characters.Latin_1;
+
+with Sample.Manifest; use Sample.Manifest;
+with Sample.Helpers; use Sample.Helpers;
+with Sample.Keyboard_Handler; use Sample.Keyboard_Handler;
+with Sample.Explanation; use Sample.Explanation;
+
+package body Sample.Menu_Demo.Aux is
+
+   procedure Geometry (M  : Menu;
+                       L  : out Line_Count;
+                       C  : out Column_Count;
+                       Y  : out Line_Position;
+                       X  : out Column_Position;
+                       Fy : out Line_Position;
+                       Fx : out Column_Position);
+
+   procedure Geometry (M  : Menu;
+                       L  : out Line_Count;        -- Lines used for menu
+                       C  : out Column_Count;      -- Columns used for menu
+                       Y  : out Line_Position;     -- Proposed Line for menu
+                       X  : out Column_Position;   -- Proposed Column for menu
+                       Fy : out Line_Position;     -- Vertical inner frame
+                       Fx : out Column_Position)   -- Horiz. inner frame
+   is
+      Spc_Desc : Column_Position; -- spaces between description and item
+   begin
+      Set_Mark (M, Menu_Marker);
+
+      Spacing (M, Spc_Desc, Fy, Fx);
+      Scale (M, L, C);
+
+      Fx := Fx + Column_Position (Fy - 1); -- looks a bit nicer
+
+      L := L + 2 * Fy;  -- count for frame at top and bottom
+      C := C + 2 * Fx;  -- "
+
+      --  Calculate horizontal coordinate at the screen center
+      X := (Columns - C) / 2;
+      Y := 1;  -- always startin line 1
+
+   end Geometry;
+
+   procedure Geometry (M : Menu;
+                       L : out Line_Count;        -- Lines used for menu
+                       C : out Column_Count;      -- Columns used for menu
+                       Y : out Line_Position;     -- Proposed Line for menu
+                       X : out Column_Position)   -- Proposed Column for menu
+   is
+      Fy : Line_Position;
+      Fx : Column_Position;
+   begin
+      Geometry (M, L, C, Y, X, Fy, Fx);
+   end Geometry;
+
+   function Create (M     : Menu;
+                    Title : String;
+                    Lin   : Line_Position;
+                    Col   : Column_Position) return Panel
+   is
+      W, S : Window;
+      L : Line_Count;
+      C : Column_Count;
+      Y, Fy : Line_Position;
+      X, Fx : Column_Position;
+      Pan : Panel;
+   begin
+      Geometry (M, L, C, Y, X, Fy, Fx);
+      W := New_Window (L, C, Lin, Col);
+      Set_Meta_Mode (W);
+      Set_KeyPad_Mode (W);
+      if Has_Colors then
+         Set_Background (Win => W,
+                         Ch  => (Ch    => ' ',
+                                 Color => Menu_Back_Color,
+                                 Attr  => Normal_Video));
+         Set_Foreground (Men => M, Color => Menu_Fore_Color);
+         Set_Background (Men => M, Color => Menu_Back_Color);
+         Set_Grey (Men => M, Color => Menu_Grey_Color);
+         Erase (W);
+      end if;
+      S := Derived_Window (W, L - Fy, C - Fx, Fy, Fx);
+      Set_Meta_Mode (S);
+      Set_KeyPad_Mode (S);
+      Box (W);
+      Set_Window (M, W);
+      Set_Sub_Window (M, S);
+      if Title'Length > 0 then
+         Window_Title (W, Title);
+      end if;
+      Pan := New_Panel (W);
+      Post (M);
+      return Pan;
+   end Create;
+
+   procedure Destroy (M : Menu;
+                      P : in out Panel)
+   is
+      W, S : Window;
+   begin
+      W := Get_Window (M);
+      S := Get_Sub_Window (M);
+      Post (M, False);
+      Erase (W);
+      Delete (P);
+      Set_Window (M, Null_Window);
+      Set_Sub_Window (M, Null_Window);
+      Delete (S);
+      Delete (W);
+      Update_Panels;
+   end Destroy;
+
+   function Get_Request (M : Menu; P : Panel) return Key_Code
+   is
+      W  : constant Window := Get_Window (M);
+      K  : Real_Key_Code;
+      Ch : Character;
+   begin
+      Top (P);
+      loop
+         K := Get_Key (W);
+         if K in Special_Key_Code'Range then
+            case K is
+               when HELP_CODE           => Explain_Context;
+               when EXPLAIN_CODE        => Explain ("MENUKEYS");
+               when Key_Home            => return REQ_FIRST_ITEM;
+               when QUIT_CODE           => return QUIT;
+               when Key_Cursor_Down     => return REQ_DOWN_ITEM;
+               when Key_Cursor_Up       => return REQ_UP_ITEM;
+               when Key_Cursor_Left     => return REQ_LEFT_ITEM;
+               when Key_Cursor_Right    => return REQ_RIGHT_ITEM;
+               when Key_End             => return REQ_LAST_ITEM;
+               when Key_Backspace       => return REQ_BACK_PATTERN;
+               when Key_Next_Page       => return REQ_SCR_DPAGE;
+               when Key_Previous_Page   => return REQ_SCR_UPAGE;
+               when others              => return K;
+            end case;
+         elsif K in Normal_Key_Code'Range then
+            Ch := Character'Val (K);
+            case Ch is
+               when CAN => return QUIT;                  --  CTRL-X
+               when SO  => return REQ_NEXT_ITEM;         --  CTRL-N
+               when DLE => return REQ_PREV_ITEM;         --  CTRL-P
+               when NAK => return REQ_SCR_ULINE;         --  CTRL-U
+               when EOT => return REQ_SCR_DLINE;         --  CTRL-D
+               when ACK => return REQ_SCR_DPAGE;         --  CTRL-F
+               when STX => return REQ_SCR_UPAGE;         --  CTRL-B
+               when EM  => return REQ_CLEAR_PATTERN;     --  CTRL-Y
+               when BS  => return REQ_BACK_PATTERN;      --  CTRL-H
+               when SOH => return REQ_NEXT_MATCH;        --  CTRL-A
+               when ENQ => return REQ_PREV_MATCH;        --  CTRL-E
+               when DC4 => return REQ_TOGGLE_ITEM;       --  CTRL-T
+
+               when CR | LF  => return SELECT_ITEM;
+               when others   => return K;
+            end case;
+         else
+            return K;
+         end if;
+      end loop;
+   end Get_Request;
+
+end Sample.Menu_Demo.Aux;
diff --git a/Ada95/samples/sample-menu_demo-aux.ads b/Ada95/samples/sample-menu_demo-aux.ads
new file mode 100644
index 0000000..778b34c
--- /dev/null
+++ b/Ada95/samples/sample-menu_demo-aux.ads
@@ -0,0 +1,72 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                            Sample.Menu_Demo.Aux                          --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2009,2011 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control
+--  $Revision: 1.12 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Terminal_Interface.Curses; use  Terminal_Interface.Curses;
+with Terminal_Interface.Curses.Panels; use  Terminal_Interface.Curses.Panels;
+with Terminal_Interface.Curses.Menus; use  Terminal_Interface.Curses.Menus;
+
+package Sample.Menu_Demo.Aux is
+
+   procedure Geometry (M  : Menu;
+                       L  : out Line_Count;
+                       C  : out Column_Count;
+                       Y  : out Line_Position;
+                       X  : out Column_Position);
+   --  Calculate the geometry for a panel being able to be used to display
+   --  the menu.
+
+   function Create (M     : Menu;
+                    Title : String;
+                    Lin   : Line_Position;
+                    Col   : Column_Position) return Panel;
+   --  Create a panel decorated with a frame and the title at the specified
+   --  position. The dimension of the panel is derived from the menus layout.
+
+   procedure Destroy (M : Menu;
+                      P : in out Panel);
+   --  Destroy all the windowing structures associated with this menu and
+   --  panel.
+
+   function Get_Request (M : Menu; P : Panel) return Key_Code;
+   --  Centralized request driver for all menus in this sample. This
+   --  gives us a common key binding for all menus.
+
+end Sample.Menu_Demo.Aux;
diff --git a/Ada95/samples/sample-menu_demo-handler.adb b/Ada95/samples/sample-menu_demo-handler.adb
new file mode 100644
index 0000000..ebbaf43
--- /dev/null
+++ b/Ada95/samples/sample-menu_demo-handler.adb
@@ -0,0 +1,109 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                          Sample.Menu_Demo.Handler                        --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2004,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control
+--  $Revision: 1.17 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Sample.Menu_Demo.Aux;
+with Sample.Manifest; use Sample.Manifest;
+with Terminal_Interface.Curses.Mouse;  use Terminal_Interface.Curses.Mouse;
+
+package body Sample.Menu_Demo.Handler is
+
+   package Aux renames Sample.Menu_Demo.Aux;
+
+   procedure Drive_Me (M     : Menu;
+                       Title : String := "")
+   is
+      L : Line_Count;
+      C : Column_Count;
+      Y : Line_Position;
+      X : Column_Position;
+   begin
+      Aux.Geometry (M, L, C, Y, X);
+      Drive_Me (M, Y, X, Title);
+   end Drive_Me;
+
+   procedure Drive_Me (M     : Menu;
+                       Lin   : Line_Position;
+                       Col   : Column_Position;
+                       Title : String := "")
+   is
+      Mask : Event_Mask := No_Events;
+      Old  : Event_Mask;
+      Pan  : Panel := Aux.Create (M, Title, Lin, Col);
+      V    : Cursor_Visibility := Invisible;
+   begin
+      --  We are only interested in Clicks with the left button
+      Register_Reportable_Events (Left, All_Clicks, Mask);
+      Old := Start_Mouse (Mask);
+      Set_Cursor_Visibility (V);
+      loop
+         declare
+            K : Key_Code := Aux.Get_Request (M, Pan);
+            R : constant Driver_Result := Driver (M, K);
+         begin
+            case R is
+               when Menu_Ok => null;
+               when Unknown_Request =>
+                  declare
+                     I : constant Item := Current (M);
+                     O : Item_Option_Set;
+                  begin
+                     if K = Key_Mouse then
+                        K := SELECT_ITEM;
+                     end if;
+                     Get_Options (I, O);
+                     if K = SELECT_ITEM and then not O.Selectable then
+                        Beep;
+                     else
+                        if My_Driver (M, K, Pan) then
+                           exit;
+                        end if;
+                     end if;
+                  end;
+               when others => Beep;
+            end case;
+         end;
+      end loop;
+      End_Mouse (Old);
+      Aux.Destroy (M, Pan);
+   end Drive_Me;
+
+end Sample.Menu_Demo.Handler;
diff --git a/Ada95/samples/sample-menu_demo-handler.ads b/Ada95/samples/sample-menu_demo-handler.ads
new file mode 100644
index 0000000..eff73e0
--- /dev/null
+++ b/Ada95/samples/sample-menu_demo-handler.ads
@@ -0,0 +1,65 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                          Sample.Menu_Demo.Handler                        --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2003,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control
+--  $Revision: 1.11 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Terminal_Interface.Curses;
+use  Terminal_Interface.Curses;
+with Terminal_Interface.Curses.Panels;
+use  Terminal_Interface.Curses.Panels;
+with Terminal_Interface.Curses.Menus;
+use  Terminal_Interface.Curses.Menus;
+
+generic
+   with function  My_Driver (Men : Menu;
+                             K   : Key_Code;
+                             Pan : Panel) return Boolean;
+package Sample.Menu_Demo.Handler is
+
+   procedure Drive_Me (M     : Menu;
+                       Lin   : Line_Position;
+                       Col   : Column_Position;
+                       Title : String := "");
+   --  Position the menu at the given point and drive it.
+
+   procedure Drive_Me (M     : Menu;
+                       Title : String := "");
+   --  Center menu and drive it.
+
+end Sample.Menu_Demo.Handler;
diff --git a/Ada95/samples/sample-menu_demo.adb b/Ada95/samples/sample-menu_demo.adb
new file mode 100644
index 0000000..7e49ddd
--- /dev/null
+++ b/Ada95/samples/sample-menu_demo.adb
@@ -0,0 +1,397 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                              Sample.Menu_Demo                            --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2008,2011 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control
+--  $Revision: 1.20 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Terminal_Interface.Curses; use Terminal_Interface.Curses;
+with Terminal_Interface.Curses.Panels; use Terminal_Interface.Curses.Panels;
+with Terminal_Interface.Curses.Menus; use Terminal_Interface.Curses.Menus;
+with Terminal_Interface.Curses.Menus.Menu_User_Data;
+with Terminal_Interface.Curses.Menus.Item_User_Data;
+
+with Sample.Manifest; use Sample.Manifest;
+with Sample.Function_Key_Setting; use Sample.Function_Key_Setting;
+with Sample.Menu_Demo.Handler;
+with Sample.Helpers; use Sample.Helpers;
+with Sample.Explanation; use Sample.Explanation;
+
+package body Sample.Menu_Demo is
+
+   package Spacing_Demo is
+      procedure Spacing_Test;
+   end Spacing_Demo;
+
+   package body Spacing_Demo is
+
+      procedure Spacing_Test
+      is
+         function My_Driver (M : Menu;
+                             K : Key_Code;
+                             P : Panel) return Boolean;
+
+         procedure Set_Option_Key;
+         procedure Set_Select_Key;
+         procedure Set_Description_Key;
+         procedure Set_Hide_Key;
+
+         package Mh is new Sample.Menu_Demo.Handler (My_Driver);
+
+         I : Item_Array_Access := new Item_Array'
+           (New_Item ("January",   "31 Days"),
+            New_Item ("February",  "28/29 Days"),
+            New_Item ("March",     "31 Days"),
+            New_Item ("April",     "30 Days"),
+            New_Item ("May",       "31 Days"),
+            New_Item ("June",      "30 Days"),
+            New_Item ("July",      "31 Days"),
+            New_Item ("August",    "31 Days"),
+            New_Item ("September", "30 Days"),
+            New_Item ("October",   "31 Days"),
+            New_Item ("November",  "30 Days"),
+            New_Item ("December",  "31 Days"),
+            Null_Item);
+
+         M : Menu   := New_Menu (I);
+         Flip_State : Boolean := True;
+         Hide_Long  : Boolean := False;
+
+         type Format_Code is (Four_By_1, Four_By_2, Four_By_3);
+         type Operations  is (Flip, Reorder, Reformat, Reselect, Describe);
+
+         type Change is array (Operations) of Boolean;
+         pragma Pack (Change);
+         No_Change : constant Change := Change'(others => False);
+
+         Current_Format : Format_Code := Four_By_1;
+         To_Change : Change := No_Change;
+
+         function My_Driver (M : Menu;
+                             K : Key_Code;
+                             P : Panel) return Boolean
+         is
+         begin
+            if M = Null_Menu then
+               raise Menu_Exception;
+            end if;
+            if P = Null_Panel then
+               raise Panel_Exception;
+            end if;
+            To_Change := No_Change;
+            if K in User_Key_Code'Range then
+               if K = QUIT then
+                  return True;
+               end if;
+            end if;
+            if K in Special_Key_Code'Range then
+               case K is
+                  when Key_F4 =>
+                     To_Change (Flip) := True;
+                     return True;
+                  when Key_F5 =>
+                     To_Change (Reformat)  := True;
+                     Current_Format := Four_By_1;
+                     return True;
+                  when Key_F6 =>
+                     To_Change (Reformat)  := True;
+                     Current_Format := Four_By_2;
+                     return True;
+                  when Key_F7 =>
+                     To_Change (Reformat)  := True;
+                     Current_Format := Four_By_3;
+                     return True;
+                  when Key_F8 =>
+                     To_Change (Reorder) := True;
+                     return True;
+                  when Key_F9 =>
+                     To_Change (Reselect) := True;
+                     return True;
+                  when Key_F10 =>
+                     if Current_Format /= Four_By_3 then
+                        To_Change (Describe) := True;
+                        return True;
+                     else
+                        return False;
+                     end if;
+                  when Key_F11 =>
+                     Hide_Long := not Hide_Long;
+                     declare
+                        O : Item_Option_Set;
+                     begin
+                        for J in I'Range loop
+                           Get_Options (I.all (J), O);
+                           O.Selectable := True;
+                           if Hide_Long then
+                              case J is
+                                 when 1 | 3 | 5 | 7 | 8 | 10 | 12 =>
+                                    O.Selectable := False;
+                                 when others => null;
+                              end case;
+                           end if;
+                           Set_Options (I.all (J), O);
+                        end loop;
+                     end;
+                     return False;
+                  when others => null;
+               end case;
+            end if;
+            return False;
+         end My_Driver;
+
+         procedure Set_Option_Key
+         is
+            O : Menu_Option_Set;
+         begin
+            if Current_Format = Four_By_1 then
+               Set_Soft_Label_Key (8, "");
+            else
+               Get_Options (M, O);
+               if O.Row_Major_Order then
+                  Set_Soft_Label_Key (8, "O-Col");
+               else
+                  Set_Soft_Label_Key (8, "O-Row");
+               end if;
+            end if;
+            Refresh_Soft_Label_Keys_Without_Update;
+         end Set_Option_Key;
+
+         procedure Set_Select_Key
+         is
+            O : Menu_Option_Set;
+         begin
+            Get_Options (M, O);
+            if O.One_Valued then
+               Set_Soft_Label_Key (9, "Multi");
+            else
+               Set_Soft_Label_Key (9, "Singl");
+            end if;
+            Refresh_Soft_Label_Keys_Without_Update;
+         end Set_Select_Key;
+
+         procedure Set_Description_Key
+         is
+            O : Menu_Option_Set;
+         begin
+            if Current_Format = Four_By_3 then
+               Set_Soft_Label_Key (10, "");
+            else
+               Get_Options (M, O);
+               if O.Show_Descriptions then
+                  Set_Soft_Label_Key (10, "-Desc");
+               else
+                  Set_Soft_Label_Key (10, "+Desc");
+               end if;
+            end if;
+            Refresh_Soft_Label_Keys_Without_Update;
+         end Set_Description_Key;
+
+         procedure Set_Hide_Key
+         is
+         begin
+            if Hide_Long then
+               Set_Soft_Label_Key (11, "Enab");
+            else
+               Set_Soft_Label_Key (11, "Disab");
+            end if;
+            Refresh_Soft_Label_Keys_Without_Update;
+         end Set_Hide_Key;
+
+      begin
+         Push_Environment ("MENU01");
+         Notepad ("MENU-PAD01");
+         Default_Labels;
+         Set_Soft_Label_Key (4, "Flip");
+         Set_Soft_Label_Key (5, "4x1");
+         Set_Soft_Label_Key (6, "4x2");
+         Set_Soft_Label_Key (7, "4x3");
+         Set_Option_Key;
+         Set_Select_Key;
+         Set_Description_Key;
+         Set_Hide_Key;
+
+         Set_Format (M, 4, 1);
+         loop
+            Mh.Drive_Me (M);
+            exit when To_Change = No_Change;
+            if To_Change (Flip) then
+               if Flip_State then
+                  Flip_State := False;
+                  Set_Spacing (M, 3, 2, 0);
+               else
+                  Flip_State := True;
+                  Set_Spacing (M);
+               end if;
+            elsif To_Change (Reformat) then
+               case Current_Format is
+                  when Four_By_1 => Set_Format (M, 4, 1);
+                  when Four_By_2 => Set_Format (M, 4, 2);
+                  when Four_By_3 =>
+                     declare
+                        O : Menu_Option_Set;
+                     begin
+                        Get_Options (M, O);
+                        O.Show_Descriptions := False;
+                        Set_Options (M, O);
+                        Set_Format (M, 4, 3);
+                     end;
+               end case;
+               Set_Option_Key;
+               Set_Description_Key;
+            elsif To_Change (Reorder) then
+               declare
+                  O : Menu_Option_Set;
+               begin
+                  Get_Options (M, O);
+                  O.Row_Major_Order := not O.Row_Major_Order;
+                  Set_Options (M, O);
+                  Set_Option_Key;
+               end;
+            elsif To_Change (Reselect) then
+               declare
+                  O : Menu_Option_Set;
+               begin
+                  Get_Options (M, O);
+                  O.One_Valued := not O.One_Valued;
+                  Set_Options (M, O);
+                  Set_Select_Key;
+               end;
+            elsif To_Change (Describe) then
+               declare
+                  O : Menu_Option_Set;
+               begin
+                  Get_Options (M, O);
+                  O.Show_Descriptions := not O.Show_Descriptions;
+                  Set_Options (M, O);
+                  Set_Description_Key;
+               end;
+            else
+               null;
+            end if;
+         end loop;
+         Set_Spacing (M);
+
+         Pop_Environment;
+         pragma Assert (Get_Index (Items (M, 1)) = Get_Index (I (1)));
+         Delete (M);
+         Free (I, True);
+      end Spacing_Test;
+   end Spacing_Demo;
+
+   procedure Demo
+   is
+      --  We use this datatype only to test the instantiation of
+      --  the Menu_User_Data generic package. No functionality
+      --  behind it.
+      type User_Data is new Integer;
+      type User_Data_Access is access User_Data;
+
+      --  Those packages are only instantiated to test the usability.
+      --  No real functionality is shown in the demo.
+      package MUD is new Menu_User_Data (User_Data, User_Data_Access);
+      package IUD is new Item_User_Data (User_Data, User_Data_Access);
+
+      function My_Driver (M : Menu;
+                          K : Key_Code;
+                          P : Panel) return Boolean;
+
+      package Mh is new Sample.Menu_Demo.Handler (My_Driver);
+
+      Itm : Item_Array_Access := new Item_Array'
+        (New_Item ("Menu Layout Options"),
+         New_Item ("Demo of Hook functions"),
+         Null_Item);
+      M : Menu := New_Menu (Itm);
+
+      U1 : constant User_Data_Access := new User_Data'(4711);
+      U2 : User_Data_Access;
+      U3 : constant User_Data_Access := new User_Data'(4712);
+      U4 : User_Data_Access;
+
+      function My_Driver (M : Menu;
+                          K : Key_Code;
+                          P : Panel) return Boolean
+      is
+         Idx   : constant Positive := Get_Index (Current (M));
+      begin
+         if K in User_Key_Code'Range then
+            if K = QUIT then
+               return True;
+            elsif K = SELECT_ITEM then
+               if Idx in Itm'Range then
+                  Hide (P);
+                  Update_Panels;
+               end if;
+               case Idx is
+                  when 1 => Spacing_Demo.Spacing_Test;
+                  when others => Not_Implemented;
+               end case;
+               if Idx in Itm'Range then
+                  Top (P);
+                  Show (P);
+                  Update_Panels;
+                  Update_Screen;
+               end if;
+            end if;
+         end if;
+         return False;
+      end My_Driver;
+   begin
+      Push_Environment ("MENU00");
+      Notepad ("MENU-PAD00");
+      Default_Labels;
+      Refresh_Soft_Label_Keys_Without_Update;
+      Set_Pad_Character (M, '|');
+
+      MUD.Set_User_Data (M, U1);
+      IUD.Set_User_Data (Itm.all (1), U3);
+
+      Mh.Drive_Me (M);
+
+      MUD.Get_User_Data (M, U2);
+      pragma Assert (U1 = U2 and U1.all = 4711);
+
+      IUD.Get_User_Data (Itm.all (1), U4);
+      pragma Assert (U3 = U4 and U3.all = 4712);
+
+      Pop_Environment;
+      Delete (M);
+      Free (Itm, True);
+   end Demo;
+
+end Sample.Menu_Demo;
diff --git a/Ada95/samples/sample-menu_demo.ads b/Ada95/samples/sample-menu_demo.ads
new file mode 100644
index 0000000..84b5a69
--- /dev/null
+++ b/Ada95/samples/sample-menu_demo.ads
@@ -0,0 +1,46 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                              Sample.Menu_Demo                            --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2002,2003 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control
+--  $Revision: 1.11 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+package Sample.Menu_Demo is
+
+   procedure Demo;
+
+end Sample.Menu_Demo;
diff --git a/Ada95/samples/sample-my_field_type.adb b/Ada95/samples/sample-my_field_type.adb
new file mode 100644
index 0000000..dbdd88a
--- /dev/null
+++ b/Ada95/samples/sample-my_field_type.adb
@@ -0,0 +1,69 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                           Sample.My_Field_Type                           --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2006,2008 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control
+--  $Revision: 1.17 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+
+--  This is a very simple user defined field type. It accepts only a
+--  defined character as input into the field.
+--
+package body Sample.My_Field_Type is
+
+   --  That's simple. There are minimal field validity checks.
+   function Field_Check (Fld : Field;
+                         Typ : My_Data) return Boolean
+   is
+   begin
+      if Fld = Null_Field or Typ.Ch = Character'Val (0) then
+         return False;
+      end if;
+      return True;
+   end Field_Check;
+
+   --  Check exactly against the specified character.
+   function Character_Check (Ch  : Character;
+                             Typ : My_Data) return Boolean
+   is
+      C : constant Character := Typ.Ch;
+   begin
+      return Ch = C;
+   end Character_Check;
+
+end Sample.My_Field_Type;
diff --git a/Ada95/samples/sample-my_field_type.ads b/Ada95/samples/sample-my_field_type.ads
new file mode 100644
index 0000000..1f1e65f
--- /dev/null
+++ b/Ada95/samples/sample-my_field_type.ads
@@ -0,0 +1,62 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                           Sample.My_Field_Type                           --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2003,2006 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control
+--  $Revision: 1.13 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Terminal_Interface.Curses.Forms; use Terminal_Interface.Curses.Forms;
+with Terminal_Interface.Curses.Forms.Field_Types.User;
+use Terminal_Interface.Curses.Forms.Field_Types.User;
+
+--  This is a very simple user defined field type. It accepts only a
+--  defined character as input into the field.
+--
+package Sample.My_Field_Type is
+
+   type My_Data is new User_Defined_Field_Type with
+      record
+        Ch : Character;
+      end record;
+
+   function Field_Check (Fld  : Field;
+                         Typ  : My_Data) return Boolean;
+
+   function Character_Check (Ch  : Character;
+                             Typ : My_Data) return Boolean;
+
+end Sample.My_Field_Type;
diff --git a/Ada95/samples/sample-text_io_demo.adb b/Ada95/samples/sample-text_io_demo.adb
new file mode 100644
index 0000000..f23fe7c
--- /dev/null
+++ b/Ada95/samples/sample-text_io_demo.adb
@@ -0,0 +1,189 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                            Sample.Text_IO_Demo                           --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2018,2020 Thomas E. Dickey                                     --
+-- Copyright 1998-2006,2011 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control
+--  $Revision: 1.19 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Ada.Numerics.Generic_Elementary_Functions;
+
+with Ada.Numerics.Complex_Types;
+use  Ada.Numerics.Complex_Types;
+
+with Terminal_Interface.Curses;
+use  Terminal_Interface.Curses;
+
+with Terminal_Interface.Curses.Panels;
+use  Terminal_Interface.Curses.Panels;
+
+with Terminal_Interface.Curses.Text_IO;
+use  Terminal_Interface.Curses.Text_IO;
+
+with Terminal_Interface.Curses.Text_IO.Integer_IO;
+with Terminal_Interface.Curses.Text_IO.Float_IO;
+with Terminal_Interface.Curses.Text_IO.Enumeration_IO;
+with Terminal_Interface.Curses.Text_IO.Complex_IO;
+with Terminal_Interface.Curses.Text_IO.Decimal_IO;
+with Terminal_Interface.Curses.Text_IO.Modular_IO;
+
+with Sample.Manifest; use Sample.Manifest;
+with Sample.Function_Key_Setting; use Sample.Function_Key_Setting;
+with Sample.Keyboard_Handler; use Sample.Keyboard_Handler;
+with Sample.Explanation; use Sample.Explanation;
+
+pragma Elaborate_All (Terminal_Interface.Curses.Text_Io.Complex_IO);
+pragma Elaborate_All (Terminal_Interface.Curses.Text_Io.Decimal_IO);
+pragma Elaborate_All (Terminal_Interface.Curses.Text_Io.Enumeration_IO);
+pragma Elaborate_All (Terminal_Interface.Curses.Text_Io.Float_IO);
+pragma Elaborate_All (Terminal_Interface.Curses.Text_Io.Integer_IO);
+pragma Elaborate_All (Terminal_Interface.Curses.Text_Io.Modular_IO);
+
+package body Sample.Text_IO_Demo is
+
+   type Weekday is (Sunday,
+                    Monday,
+                    Tuesday,
+                    Wednesday,
+                    Thursday,
+                    Friday,
+                    Saturday);
+
+   type Dec is delta 0.01 digits 5 range 0.0 .. 4.0;
+   type Md is mod 5;
+
+   package Math is new
+     Ada.Numerics.Generic_Elementary_Functions (Float);
+
+   package Int_IO is new
+     Terminal_Interface.Curses.Text_IO.Integer_IO (Integer);
+   use Int_IO;
+
+   package Real_IO is new
+     Terminal_Interface.Curses.Text_IO.Float_IO (Float);
+   use Real_IO;
+
+   package Enum_IO is new
+     Terminal_Interface.Curses.Text_IO.Enumeration_IO (Weekday);
+   use Enum_IO;
+
+   package C_IO is new
+     Terminal_Interface.Curses.Text_IO.Complex_IO (Ada.Numerics.Complex_Types);
+   use C_IO;
+
+   package D_IO is new
+     Terminal_Interface.Curses.Text_IO.Decimal_IO (Dec);
+   use D_IO;
+
+   package M_IO is new
+     Terminal_Interface.Curses.Text_IO.Modular_IO (Md);
+   use M_IO;
+
+   procedure Demo
+   is
+      W : Window;
+      P : Panel := Create (Standard_Window);
+      K : Real_Key_Code;
+      Im : constant Complex := (0.0, 1.0);
+      Fx : constant Dec := 3.14;
+      Dc : constant Dec := 2.72;
+      L : Md;
+
+   begin
+      Push_Environment ("TEXTIO");
+      Default_Labels;
+      Notepad ("TEXTIO-PAD00");
+
+      Set_Echo_Mode (False);
+      Set_Meta_Mode;
+      Set_KeyPad_Mode;
+      W := Sub_Window (Standard_Window, Lines - 2, Columns - 2, 1, 1);
+      Box;
+      Refresh_Without_Update;
+      Set_Meta_Mode (W);
+      Set_KeyPad_Mode (W);
+      Immediate_Update_Mode (W, True);
+
+      Set_Window (W);
+
+      for I in 1 .. 10 loop
+         Put ("Square root of ");
+         Put (Item => I, Width => 5);
+         Put (" is ");
+         Put (Item => Math.Sqrt (Float (I)), Exp => 0, Aft => 7);
+         New_Line;
+      end loop;
+
+      for W in Weekday loop
+         Put (Item => W); Put (' ');
+      end loop;
+      New_Line;
+
+      L := Md'First;
+      for I in 1 .. 2 loop
+         for J in Md'Range loop
+            Put (L); Put (' ');
+            L := L + 1;
+         end loop;
+      end loop;
+      New_Line;
+
+      Put (Im); New_Line;
+      Put (Fx); New_Line;
+      Put (Dc); New_Line;
+
+      loop
+         K := Get_Key;
+         if K in Special_Key_Code'Range then
+            case K is
+               when QUIT_CODE     => exit;
+               when HELP_CODE     => Explain_Context;
+               when EXPLAIN_CODE  => Explain ("TEXTIOKEYS");
+               when others        => null;
+            end case;
+         end if;
+      end loop;
+
+      Set_Window (Null_Window);
+      Erase; Refresh_Without_Update;
+      Delete (P);
+      Delete (W);
+
+      Pop_Environment;
+   end Demo;
+
+end Sample.Text_IO_Demo;
diff --git a/Ada95/samples/sample-text_io_demo.ads b/Ada95/samples/sample-text_io_demo.ads
new file mode 100644
index 0000000..307f370
--- /dev/null
+++ b/Ada95/samples/sample-text_io_demo.ads
@@ -0,0 +1,46 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                            Sample.Text_IO_Demo                           --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2002,2003 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control
+--  $Revision: 1.11 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+package Sample.Text_IO_Demo is
+
+   procedure Demo;
+
+end Sample.Text_IO_Demo;
diff --git a/Ada95/samples/sample.adb b/Ada95/samples/sample.adb
new file mode 100644
index 0000000..e10294b
--- /dev/null
+++ b/Ada95/samples/sample.adb
@@ -0,0 +1,221 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                 Sample                                   --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2008,2011 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control
+--  $Revision: 1.19 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Text_IO;
+
+with Ada.Exceptions; use Ada.Exceptions;
+
+with Terminal_Interface.Curses; use Terminal_Interface.Curses;
+with Terminal_Interface.Curses.Panels; use Terminal_Interface.Curses.Panels;
+with Terminal_Interface.Curses.Menus; use Terminal_Interface.Curses.Menus;
+with Terminal_Interface.Curses.Menus.Menu_User_Data;
+with Terminal_Interface.Curses.Menus.Item_User_Data;
+
+with Sample.Manifest; use Sample.Manifest;
+with Sample.Function_Key_Setting; use Sample.Function_Key_Setting;
+with Sample.Keyboard_Handler; use Sample.Keyboard_Handler;
+with Sample.Header_Handler; use Sample.Header_Handler;
+with Sample.Explanation; use Sample.Explanation;
+
+with Sample.Menu_Demo.Handler;
+with Sample.Curses_Demo;
+with Sample.Form_Demo;
+with Sample.Menu_Demo;
+with Sample.Text_IO_Demo;
+
+with GNAT.OS_Lib;
+
+package body Sample is
+
+   type User_Data is
+      record
+         Data : Integer;
+      end record;
+   type User_Access is access User_Data;
+
+   package Ud is new
+     Terminal_Interface.Curses.Menus.Menu_User_Data
+     (User_Data, User_Access);
+
+   package Id is new
+     Terminal_Interface.Curses.Menus.Item_User_Data
+     (User_Data, User_Access);
+
+   procedure Whow is
+      procedure Main_Menu;
+      procedure Main_Menu
+      is
+         function My_Driver (M : Menu;
+                             K : Key_Code;
+                             Pan : Panel) return Boolean;
+
+         package Mh is new Sample.Menu_Demo.Handler (My_Driver);
+
+         I : Item_Array_Access := new Item_Array'
+           (New_Item ("Curses Core Demo"),
+            New_Item ("Menu Demo"),
+            New_Item ("Form Demo"),
+            New_Item ("Text IO Demo"),
+            Null_Item);
+
+         M : Menu := New_Menu (I);
+
+         D1, D2 : User_Access;
+         I1, I2 : User_Access;
+
+         function My_Driver (M : Menu;
+                             K : Key_Code;
+                             Pan : Panel) return Boolean
+         is
+            Idx : constant Positive := Get_Index (Current (M));
+         begin
+            if K in User_Key_Code'Range then
+               if K = QUIT then
+                  return True;
+               elsif K = SELECT_ITEM then
+                  if Idx <= 4 then
+                     Hide (Pan);
+                     Update_Panels;
+                  end if;
+                  case Idx is
+                     when 1 => Sample.Curses_Demo.Demo;
+                     when 2 => Sample.Menu_Demo.Demo;
+                     when 3 => Sample.Form_Demo.Demo;
+                     when 4 => Sample.Text_IO_Demo.Demo;
+                     when others => null;
+                  end case;
+                  if Idx <= 4 then
+                     Top (Pan);
+                     Show (Pan);
+                     Update_Panels;
+                     Update_Screen;
+                  end if;
+               end if;
+            end if;
+            return False;
+         end My_Driver;
+
+      begin
+
+         if (1 + Item_Count (M)) /= I'Length then
+            raise Constraint_Error;
+         end if;
+
+         D1 := new User_Data'(Data => 4711);
+         Ud.Set_User_Data (M, D1);
+
+         I1 := new User_Data'(Data => 1174);
+         Id.Set_User_Data (I.all (1), I1);
+
+         Set_Spacing (Men => M, Row => 2);
+
+         Default_Labels;
+         Notepad ("MAINPAD");
+
+         Mh.Drive_Me (M, " Demo ");
+
+         Ud.Get_User_Data (M, D2);
+         pragma Assert (D1 = D2);
+         pragma Assert (D1.Data = D2.Data);
+
+         Id.Get_User_Data (I.all (1), I2);
+         pragma Assert (I1 = I2);
+         pragma Assert (I1.Data = I2.Data);
+
+         Delete (M);
+         Free (I, True);
+      end Main_Menu;
+
+   begin
+      Initialize (PC_Style_With_Index);
+      Init_Header_Handler;
+      Init_Screen;
+
+      if Has_Colors then
+         Start_Color;
+
+         Init_Pair (Pair => Default_Colors,  Fore => Black,   Back => White);
+         Init_Pair (Pair => Menu_Back_Color, Fore => Black,   Back => Cyan);
+         Init_Pair (Pair => Menu_Fore_Color, Fore => Red,     Back => Cyan);
+         Init_Pair (Pair => Menu_Grey_Color, Fore => White,   Back => Cyan);
+         Init_Pair (Pair => Notepad_Color,   Fore => Black,   Back => Yellow);
+         Init_Pair (Pair => Help_Color,      Fore => Blue,    Back => Cyan);
+         Init_Pair (Pair => Form_Back_Color, Fore => Black,   Back => Cyan);
+         Init_Pair (Pair => Form_Fore_Color, Fore => Red,     Back => Cyan);
+         Init_Pair (Pair => Header_Color,    Fore => Black,   Back => Green);
+
+         Set_Background (Ch => (Color => Default_Colors,
+                                Attr  => Normal_Video,
+                                Ch    => ' '));
+         Set_Character_Attributes (Attr  => Normal_Video,
+                                   Color => Default_Colors);
+         Erase;
+
+         Set_Soft_Label_Key_Attributes (Color => Header_Color);
+         --  This propagates the attributes to the label window
+         Refresh_Soft_Label_Keys;
+      end if;
+
+      Init_Keyboard_Handler;
+
+      Set_Echo_Mode (False);
+      Set_Raw_Mode;
+      Set_Meta_Mode;
+      Set_KeyPad_Mode;
+
+      --  Initialize the Function Key Environment
+      --  We have some fixed key throughout this sample
+      Main_Menu;
+      End_Windows;
+      Curses_Free_All;
+
+   exception
+      when Event : others =>
+         Terminal_Interface.Curses.End_Windows;
+         Text_IO.Put ("Exception: ");
+         Text_IO.Put (Exception_Name (Event));
+         Text_IO.New_Line;
+         GNAT.OS_Lib.OS_Exit (1);
+
+   end Whow;
+
+end Sample;
diff --git a/Ada95/samples/sample.ads b/Ada95/samples/sample.ads
new file mode 100644
index 0000000..fecab98
--- /dev/null
+++ b/Ada95/samples/sample.ads
@@ -0,0 +1,44 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                 Sample                                   --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2002,2003 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control
+--  $Revision: 1.11 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+package Sample is
+   procedure Whow;
+end Sample;
diff --git a/Ada95/samples/split-path.awk b/Ada95/samples/split-path.awk
new file mode 100644
index 0000000..5b340ba
--- /dev/null
+++ b/Ada95/samples/split-path.awk
@@ -0,0 +1,56 @@
+##############################################################################
+# Copyright 2020,2022 Thomas E. Dickey                                       #
+#                                                                            #
+# 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.                                                             #
+##############################################################################
+#
+#  Author:  Thomas E. Dickey
+#
+#  $Id: split-path.awk,v 1.4 2022/11/26 23:46:20 tom Exp $
+BEGIN	{ cols = 72; }
+/[$]THIS_DATADIR/ {
+	if (substr(this_datadir, length(this_datadir)) != "/")
+		this_datadir = this_datadir "/";
+	gsub("[$]THIS_DATADIR", "\"" this_datadir "\"");
+	if ( length ($0) > cols ) {
+		indent = index($0, "\"") - 1;
+		broken = index($0, "&");
+		if (broken > 0 && broken < indent)
+			indent = broken - 1;
+		leader = sprintf ("%*s& ", indent, " ");
+		buffer = $0;
+		first  = 1;
+		while ( length(buffer) > cols ) {
+			printf("%.*s\"\n", cols, buffer);
+			buffer = leader "\"" substr(buffer, cols + 1);
+		}
+		if ( buffer != "" && buffer != leader "\"\"" )
+			printf("%.*s\n", cols, buffer);
+		next;
+	}
+}
+{
+	print;
+}
diff --git a/Ada95/samples/status.adb b/Ada95/samples/status.adb
new file mode 100644
index 0000000..eb55c75
--- /dev/null
+++ b/Ada95/samples/status.adb
@@ -0,0 +1,58 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                  Status                                  --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2002,2003 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Laurent Pautet <pautet@gnat.com>
+--  Modified by:  Juergen Pfeifer, 1997
+--  Version Control
+--  $Revision: 1.9 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+--  This package has been contributed by Laurent Pautet <pautet@gnat.com>   --
+--                                                                          --
+package body Status is
+
+   protected body Process is
+      procedure Stop is
+      begin
+         Done := True;
+      end Stop;
+      function Continue return Boolean is
+      begin
+         return not Done;
+      end Continue;
+   end Process;
+
+end Status;
diff --git a/Ada95/samples/status.ads b/Ada95/samples/status.ads
new file mode 100644
index 0000000..66fd19e
--- /dev/null
+++ b/Ada95/samples/status.ads
@@ -0,0 +1,61 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                  Status                                  --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2002,2003 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Laurent Pautet <pautet@gnat.com>
+--  Modified by:  Juergen Pfeifer, 1997
+--  Version Control
+--  $Revision: 1.11 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+--  This package has been contributed by Laurent Pautet <pautet@gnat.com>   --
+--                                                                          --
+with Ada.Interrupts.Names;
+
+package Status is
+
+   pragma Warnings (Off);  --  the next pragma exists since 3.11p
+   pragma Unreserve_All_Interrupts;
+   pragma Warnings (On);
+
+   protected Process is
+      procedure Stop;
+      function Continue return Boolean;
+      pragma Attach_Handler (Stop, Ada.Interrupts.Names.SIGINT);
+   private
+      Done : Boolean := False;
+   end Process;
+
+end Status;
diff --git a/Ada95/samples/tour.adb b/Ada95/samples/tour.adb
new file mode 100644
index 0000000..07f206e
--- /dev/null
+++ b/Ada95/samples/tour.adb
@@ -0,0 +1,47 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                   tour                                   --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2002,2003 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control
+--  $Revision: 1.11 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Sample; use Sample;
+
+procedure Tour is
+begin
+   Whow;
+end Tour;
diff --git a/Ada95/samples/tour.ads b/Ada95/samples/tour.ads
new file mode 100644
index 0000000..0011bbf
--- /dev/null
+++ b/Ada95/samples/tour.ads
@@ -0,0 +1,42 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                       GNAT ncurses Binding Samples                       --
+--                                                                          --
+--                                   Tour                                   --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2002,2003 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control
+--  $Revision: 1.11 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+procedure Tour;
diff --git a/Ada95/src/Makefile.in b/Ada95/src/Makefile.in
new file mode 100644
index 0000000..eb4489b
--- /dev/null
+++ b/Ada95/src/Makefile.in
@@ -0,0 +1,428 @@
+##############################################################################
+# Copyright 2018-2020,2021 Thomas E. Dickey                                  #
+# Copyright 1999-2016,2018 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.                                                             #
+##############################################################################
+#
+#  Author:  Juergen Pfeifer, 1996
+#
+#  $Id: Makefile.in,v 1.96 2021/07/03 15:45:33 tom Exp $
+#
+.SUFFIXES:
+
+SHELL		= @SHELL@
+VPATH		= @srcdir@
+THIS		= Makefile
+
+ADA_MFLAGS 	= @cf_cv_makeflags@
+@SET_MAKE@
+
+MODEL		= ../../@DFT_OBJ_SUBDIR@
+
+DESTDIR		= @DESTDIR@
+
+top_srcdir	= @top_srcdir@
+srcdir		= @srcdir@
+prefix		= @prefix@
+exec_prefix	= @exec_prefix@
+includedir	= @includedir@
+libdir		= @libdir@
+
+LIBDIR		= $(DESTDIR)$(libdir)
+ADA_INCLUDE	= $(DESTDIR)@ADA_INCLUDE@
+ADA_OBJECTS	= $(DESTDIR)@ADA_OBJECTS@
+
+INSTALL		= @INSTALL@ @INSTALL_OPT_O@
+INSTALL_LIB	= @INSTALL@ @INSTALL_LIB@
+
+AR		= @AR@
+ARFLAGS		= @ARFLAGS@
+AWK		= @AWK@
+LN_S		= @LN_S@
+
+CC		= @CC@
+CFLAGS		= @CFLAGS@ @EXTRA_CFLAGS@
+
+CPPFLAGS	= @ACPPFLAGS@ @CPPFLAGS@ \
+		  -DHAVE_CONFIG_H -I$(srcdir)
+
+CCFLAGS		= $(CPPFLAGS) $(CFLAGS)
+
+CFLAGS_NORMAL	= $(CCFLAGS) -DNCURSES_STATIC
+CFLAGS_DEBUG	= $(CCFLAGS) -DNCURSES_STATIC @CC_G_OPT@ -DTRACE
+CFLAGS_PROFILE	= $(CCFLAGS) -DNCURSES_STATIC -pg
+CFLAGS_SHARED	= $(CCFLAGS) @CC_SHARED_OPTS@
+
+CFLAGS_DEFAULT	= $(CFLAGS_@DFT_UPR_MODEL@)
+
+LINK		= $(CC)
+LDFLAGS		= @LDFLAGS@ @LD_MODEL@ @LIBS@
+
+RANLIB		= @RANLIB@
+
+################################################################################
+ADA		= @cf_ada_compiler@
+ADAPREP		= gnatprep
+ADAFLAGS	= @ADAFLAGS@ -I. -I$(srcdir)
+
+LIB_NAME	= @ADA_LIBNAME@
+SONAME		= @ADA_SHAREDLIB@
+
+GNAT_PROJECT	= @ADA_LIBNAME@.gpr
+
+# build/source are the Ada95 tree
+BUILD_DIR	= ..
+SOURCE_DIR	= ..
+
+BUILD_DIR_LIB	= $(BUILD_DIR)/lib
+SOURCE_DIR_SRC	= $(SOURCE_DIR)/src
+
+ADAMAKE		= @cf_ada_make@
+ADAMAKEFLAGS	= \
+	-P$(GNAT_PROJECT) \
+	-XBUILD_DIR=`cd $(BUILD_DIR);pwd` \
+	-XSOURCE_DIR=`cd $(SOURCE_DIR);pwd` \
+	-XSOURCE_DIR2=`cd $(srcdir);pwd` \
+	-XLIB_NAME=$(LIB_NAME) \
+	-XSONAME=$(SONAME)
+
+CARGS           = -cargs $(ADAFLAGS)
+LARGS           =
+
+STATIC_LIBNAME	= lib$(LIB_NAME).a
+SHARED_LIBNAME	= $(SONAME)
+SHARED_SYMLINK	= lib$(LIB_NAME).so
+
+ALIB            = @cf_ada_package@
+ABASE           = $(ALIB)-curses
+################################################################################
+GENERATED_SOURCES=$(ABASE).ads         			\
+		  $(ABASE).adb         			\
+	          $(ABASE)-aux.ads   			\
+	          $(ABASE)-trace.ads   			\
+	          $(ABASE)-menus.ads   			\
+	          $(ABASE)-forms.ads   			\
+	          $(ABASE)-mouse.ads 			\
+	          $(ABASE)-panels.ads			\
+	          $(ABASE)-menus-menu_user_data.ads	\
+	          $(ABASE)-menus-item_user_data.ads	\
+	          $(ABASE)-forms-form_user_data.ads	\
+	          $(ABASE)-forms-field_types.ads	\
+	          $(ABASE)-forms-field_user_data.ads	\
+	          $(ABASE)-panels-user_data.ads
+################################################################################
+LIBOBJS=$(ALIB).o                			\
+	$(ABASE)-aux.o           			\
+	$(ABASE).o               			\
+	$(ABASE)-terminfo.o				\
+	$(ABASE)-termcap.o				\
+	$(ABASE)-putwin.o				\
+	$(ABASE)-trace.o				\
+	$(ABASE)-mouse.o         			\
+	$(ABASE)-panels.o        			\
+	$(ABASE)-menus.o         			\
+	$(ABASE)-forms.o         			\
+	$(ABASE)-forms-field_types.o      		\
+	$(ABASE)-forms-field_types-alpha.o      	\
+	$(ABASE)-forms-field_types-alphanumeric.o	\
+	$(ABASE)-forms-field_types-intfield.o     	\
+	$(ABASE)-forms-field_types-numeric.o     	\
+	$(ABASE)-forms-field_types-regexp.o       	\
+	$(ABASE)-forms-field_types-enumeration.o	\
+	$(ABASE)-forms-field_types-ipv4_address.o	\
+	$(ABASE)-forms-field_types-user.o 		\
+	$(ABASE)-forms-field_types-user-choice.o 	\
+	$(ABASE)-text_io.o       			\
+	$(ABASE)-text_io-aux.o
+
+# Ada object files for generic packages. Since gnat 3.10 they are
+# also compiled
+GENOBJS=$(ABASE)-menus-menu_user_data.o			\
+	$(ABASE)-menus-item_user_data.o			\
+	$(ABASE)-forms-form_user_data.o			\
+	$(ABASE)-forms-field_user_data.o		\
+	$(ABASE)-forms-field_types-enumeration-ada.o	\
+	$(ABASE)-panels-user_data.o			\
+	$(ABASE)-text_io-integer_io.o			\
+	$(ABASE)-text_io-float_io.o			\
+	$(ABASE)-text_io-fixed_io.o			\
+	$(ABASE)-text_io-decimal_io.o			\
+	$(ABASE)-text_io-enumeration_io.o		\
+	$(ABASE)-text_io-modular_io.o			\
+	$(ABASE)-text_io-complex_io.o
+
+################################################################################
+
+@MAKE_PHONY@.PHONY :	all
+@MAKE_PHONY@.PHONY :	clean
+@MAKE_PHONY@.PHONY :	distclean
+@MAKE_PHONY@.PHONY :	install
+@MAKE_PHONY@.PHONY :	install.libs
+@MAKE_PHONY@.PHONY :	libs
+@MAKE_PHONY@.PHONY :	mostlyclean
+@MAKE_PHONY@.PHONY :	realclean
+@MAKE_PHONY@.PHONY :	sources
+@MAKE_PHONY@.PHONY :	uninstall
+@MAKE_PHONY@.PHONY :	uninstall.libs
+
+all ::  $(BUILD_DIR_LIB)/$(STATIC_LIBNAME)
+	@echo done
+
+$(ADA_INCLUDE) \
+$(ADA_OBJECTS) \
+$(LIBDIR) \
+$(BUILD_DIR_LIB) :
+	mkdir -p $@
+
+$(GENERATED_SOURCES) :
+	( cd ../gen; $(MAKE) $(ADA_MFLAGS) )
+
+sources : $(GENERATED_SOURCES)
+	@echo made $@
+
+libs \
+install \
+install.libs :: \
+		$(BUILD_DIR_LIB)/$(STATIC_LIBNAME)
+	@echo made $(STATIC_LIBNAME)
+
+#OLD:BEGIN
+install \
+install.libs :: \
+		$(BUILD_DIR_LIB)/$(STATIC_LIBNAME) \
+		$(ADA_OBJECTS)
+	@$(INSTALL_LIB) \
+		$(BUILD_DIR_LIB)/$(STATIC_LIBNAME) \
+		$(ADA_OBJECTS)
+
+uninstall \
+uninstall.libs ::
+	@rm -f $(ADA_OBJECTS)/$(STATIC_LIBNAME)
+#OLD:END
+
+mostlyclean ::
+	rm -f *.o *.ali b_t*.* *.s $(PROGS) a.out core b_*_test.c *.xr[bs] *.a
+
+clean :: mostlyclean
+	rm -f $(ABASE)-trace.adb
+
+distclean :: clean
+	rm -f Makefile library.gpr
+
+realclean :: distclean
+
+BASEDEPS=$(ABASE).ads $(ABASE)-aux.ads $(ABASE).adb
+
+$(ABASE)-trace.adb : $(srcdir)/$(ABASE)-trace.adb_p
+	rm -f $@
+	$(ADAPREP) -DADA_TRACE=@ADA_TRACE@ @GNATPREP_OPTS@ $(srcdir)/$(ABASE)-trace.adb_p $@
+
+###############################################################################
+# Use these definitions when building a shared library.
+SHARED_C_OBJS	= c_varargs_to_ada.o c_threaded_variables.o ncurses_compat.o
+SHARED_OBJS 	= $(SHARED_C_OBJS) @USE_OLD_MAKERULES@$(LIBOBJS) @cf_generic_objects@
+
+c_varargs_to_ada.o :	$(srcdir)/c_varargs_to_ada.c
+	$(CC) $(CFLAGS_DEFAULT) -c -o $@ $(srcdir)/c_varargs_to_ada.c
+
+c_threaded_variables.o : $(srcdir)/c_threaded_variables.c
+	$(CC) $(CFLAGS_DEFAULT) -c -o $@ $(srcdir)/c_threaded_variables.c
+
+ncurses_compat.o :	$(srcdir)/ncurses_compat.c
+	$(CC) $(CFLAGS_DEFAULT) -c -o $@ $(srcdir)/ncurses_compat.c
+
+###############################################################################
+# Use these definitions when building a static library.
+STATIC_C_OBJS	= static_c_varargs_to_ada.o static_c_threaded_variables.o static_ncurses_compat.o
+STATIC_OBJS 	= $(STATIC_C_OBJS) @USE_OLD_MAKERULES@$(LIBOBJS) @cf_generic_objects@
+
+static_c_varargs_to_ada.o :	$(srcdir)/c_varargs_to_ada.c
+	$(CC) $(CFLAGS_NORMAL) -c -o $@ $(srcdir)/c_varargs_to_ada.c
+
+static_c_threaded_variables.o : $(srcdir)/c_threaded_variables.c
+	$(CC) $(CFLAGS_NORMAL) -c -o $@ $(srcdir)/c_threaded_variables.c
+
+static_ncurses_compat.o :	$(srcdir)/ncurses_compat.c
+	$(CC) $(CFLAGS_NORMAL) -c -o $@ $(srcdir)/ncurses_compat.c
+
+###############################################################################
+
+@USE_OLD_MAKERULES@$(BUILD_DIR_LIB)/$(STATIC_LIBNAME) :: \
+@USE_OLD_MAKERULES@		$(BUILD_DIR_LIB) \
+@USE_OLD_MAKERULES@		$(STATIC_OBJS)
+@USE_OLD_MAKERULES@	$(AR) $(ARFLAGS) $@ $(STATIC_OBJS)
+
+$(BUILD_DIR)/static-ali : ; mkdir -p $@
+$(BUILD_DIR)/static-obj : ; mkdir -p $@
+
+STATIC_DIRS = \
+	$(BUILD_DIR_LIB) \
+	$(BUILD_DIR)/static-ali \
+	$(BUILD_DIR)/static-obj
+
+@USE_GNAT_PROJECTS@$(BUILD_DIR_LIB)/$(STATIC_LIBNAME) :: \
+@USE_GNAT_PROJECTS@		$(ABASE)-trace.adb \
+@USE_GNAT_PROJECTS@		$(STATIC_C_OBJS) \
+@USE_GNAT_PROJECTS@		$(STATIC_DIRS)
+@USE_GNAT_PROJECTS@	@cf_ada_config@gprconfig --batch --config=Ada --config=C,,,,@cf_ada_config_C@
+@USE_GNAT_PROJECTS@	-rm -f $(GNAT_PROJECT)
+@USE_GNAT_PROJECTS@	$(SHELL) $(srcdir)/library-cfg.sh static library.gpr $(CFLAGS_NORMAL) >$(GNAT_PROJECT)
+@USE_GNAT_PROJECTS@	@echo "Using GNAT Project:"
+@USE_GNAT_MAKE_GPR@	@-$(SHELL) -c "diff -c $(srcdir)/library.gpr $(GNAT_PROJECT); exit 0"
+@USE_GNAT_MAKE_GPR@	$(ADAMAKE) $(ADAMAKEFLAGS) -XLIB_KIND=static
+@USE_GNAT_MAKE_GPR@	$(AR) $(ARFLAGS) $@ $(STATIC_C_OBJS)
+@USE_GNAT_MAKE_GPR@	-rm -f $(GNAT_PROJECT)
+@USE_GNAT_GPRBUILD@	@-$(SHELL) -c "diff -c library.gpr $(GNAT_PROJECT); exit 0"
+@USE_GNAT_GPRBUILD@	gprbuild -p $(ADAMAKEFLAGS) -XLIB_KIND=static
+@USE_GNAT_GPRBUILD@	-rm -f $(GNAT_PROJECT)
+
+#OLD:BEGIN
+@USE_GNAT_LIBRARIES@install \
+@USE_GNAT_LIBRARIES@install.libs :: \
+@USE_GNAT_LIBRARIES@		$(ADA_OBJECTS)
+@USE_GNAT_LIBRARIES@	$(INSTALL_LIB) \
+@USE_GNAT_LIBRARIES@		$(BUILD_DIR)/static-ali/*.ali \
+@USE_GNAT_LIBRARIES@		$(ADA_OBJECTS)
+#OLD:END
+# While gprinstall is the "recommended" tool, it is rather brittle, with
+# hardcoded assumptions about the use of the install-name which prevent using
+# that tool to make the directory layout of older versions of the AdaCurses
+# package.
+#
+# In principle, one might just do
+#	--install-name=""
+# and in dry-run mode, gprinstall pretends to handle it properly (trimming the
+# empty directory level), but without the dry-run option, it fails (tested
+# with gnat 10.1.1).
+#NEW:BEGIN
+#@USE_GNAT_LIBRARIES@install \
+#@USE_GNAT_LIBRARIES@install.libs ::
+#@USE_GNAT_LIBRARIES@	@cf_ada_config@gprconfig --batch --config=Ada --config=C,,,,@cf_ada_config_C@
+#@USE_GNAT_LIBRARIES@	-rm -f $(GNAT_PROJECT)
+#@USE_GNAT_LIBRARIES@	$(SHELL) $(srcdir)/library-cfg.sh static library.gpr $(CFLAGS_NORMAL) >$(GNAT_PROJECT)
+#@USE_GNAT_LIBRARIES@	@echo "Using GNAT Project:"
+#@USE_GNAT_LIBRARIES@	@-$(SHELL) -c "diff -c library.gpr $(GNAT_PROJECT); exit 0"
+#@USE_GNAT_LIBRARIES@
+#@USE_GNAT_LIBRARIES@	gprinstall -m -v -f -p \
+#@USE_GNAT_LIBRARIES@		--prefix="$(DESTDIR)$(prefix)" \
+#@USE_GNAT_LIBRARIES@		$(ADAMAKEFLAGS) -XLIB_KIND=static \
+#@USE_GNAT_LIBRARIES@		--lib-subdir="$(DESTDIR)$(prefix)"/lib \
+#@USE_GNAT_LIBRARIES@		--ali-subdir="$(DESTDIR)$(prefix)"/lib/ada/adalib \
+#@USE_GNAT_LIBRARIES@		--sources-subdir="$(DESTDIR)$(prefix)"/share/ada/adainclude
+#@USE_GNAT_LIBRARIES@
+#@USE_GNAT_LIBRARIES@	-rm -f $(GNAT_PROJECT)
+#NEW:END
+
+#OLD:BEGIN
+uninstall \
+uninstall.libs ::
+	@rm -f $(ADA_OBJECTS)/$(STATIC_LIBNAME)
+#OLD:END
+#NEW:BEGIN
+#@USE_GNAT_LIBRARIES@uninstall \
+#@USE_GNAT_LIBRARIES@uninstall.libs ::
+#@USE_GNAT_LIBRARIES@	@cf_ada_config@gprconfig --batch --config=Ada --config=C,,,,@cf_ada_config_C@
+#@USE_GNAT_LIBRARIES@	-rm -f $(GNAT_PROJECT)
+#@USE_GNAT_LIBRARIES@	$(SHELL) $(srcdir)/library-cfg.sh static library.gpr $(CFLAGS_NORMAL) >$(GNAT_PROJECT)
+#@USE_GNAT_LIBRARIES@	@echo "Using GNAT Project:"
+#@USE_GNAT_LIBRARIES@	@-$(SHELL) -c "diff -c library.gpr $(GNAT_PROJECT); exit 0"
+#@USE_GNAT_LIBRARIES@
+#@USE_GNAT_LIBRARIES@	gprinstall -v -f --prefix="$(DESTDIR)$(prefix)" --uninstall $(ADAMAKEFLAGS) -XLIB_KIND=static
+#@USE_GNAT_LIBRARIES@
+#@USE_GNAT_LIBRARIES@	-rm -f $(GNAT_PROJECT)
+#NEW:END
+
+@USE_GNAT_LIBRARIES@uninstall \
+@USE_GNAT_LIBRARIES@uninstall.libs ::
+@USE_GNAT_LIBRARIES@	@$(SHELL) -c 'for name in $(BUILD_DIR)/static-ali/*.ali ; do rm -f $(ADA_OBJECTS)/`basename $$name`; done'
+
+$(BUILD_DIR)/dynamic-ali : ; mkdir -p $@
+$(BUILD_DIR)/dynamic-obj : ; mkdir -p $@
+
+SHARED_DIRS = \
+	$(BUILD_DIR_LIB) \
+	$(BUILD_DIR)/dynamic-ali \
+	$(BUILD_DIR)/dynamic-obj
+
+@MAKE_ADA_SHAREDLIB@all :: $(BUILD_DIR_LIB)/$(SHARED_LIBNAME)
+@MAKE_ADA_SHAREDLIB@$(BUILD_DIR_LIB)/$(SHARED_LIBNAME) :: \
+@MAKE_ADA_SHAREDLIB@		$(ABASE)-trace.adb \
+@MAKE_ADA_SHAREDLIB@		$(SHARED_DIRS) \
+@MAKE_ADA_SHAREDLIB@		$(SHARED_OBJS)
+@MAKE_ADA_SHAREDLIB@	cp $(SHARED_OBJS) $(BUILD_DIR)/dynamic-obj/
+@MAKE_ADA_SHAREDLIB@	@cf_ada_config@gprconfig --batch --config=Ada --config=C,,,,@cf_ada_config_C@
+@MAKE_ADA_SHAREDLIB@	-rm -f $(GNAT_PROJECT)
+@MAKE_ADA_SHAREDLIB@	$(SHELL) $(srcdir)/library-cfg.sh dynamic library.gpr $(CFLAGS_SHARED) >$(GNAT_PROJECT)
+@MAKE_ADA_SHAREDLIB@	@echo "Making Ada shared-lib:"
+@MAKE_ADA_SHAREDLIB@	@-$(SHELL) -c "diff -c library.gpr $(GNAT_PROJECT); exit 0"
+@MAKE_ADA_SHAREDLIB@	$(ADAMAKE) $(ADAMAKEFLAGS) -XLIB_KIND=dynamic
+@MAKE_ADA_SHAREDLIB@	-rm -f $(GNAT_PROJECT)
+
+install \
+install.libs :: $(ADA_INCLUDE)
+	$(INSTALL_LIB) \
+		$(SOURCE_DIR_SRC)/*.ad[sb] \
+		$(ADA_INCLUDE)
+
+install \
+install.libs :: $(ADA_INCLUDE)
+	$(INSTALL_LIB) \
+		$(GENERATED_SOURCES) \
+		$(ADA_INCLUDE)
+
+uninstall \
+uninstall.libs ::
+	$(SHELL) -c 'for name in $(SOURCE_DIR_SRC)/*.ad[sb] $(GENERATED_SOURCES); do rm -f $(ADA_INCLUDE)/`basename $$name`; done'
+
+@MAKE_ADA_SHAREDLIB@install \
+@MAKE_ADA_SHAREDLIB@install.libs :: $(ADA_OBJECTS) $(LIBDIR)
+@MAKE_ADA_SHAREDLIB@	$(INSTALL_LIB) \
+@MAKE_ADA_SHAREDLIB@		$(BUILD_DIR)/dynamic-ali/* \
+@MAKE_ADA_SHAREDLIB@		$(ADA_OBJECTS)
+@MAKE_ADA_SHAREDLIB@	$(INSTALL_LIB) \
+@MAKE_ADA_SHAREDLIB@		$(BUILD_DIR_LIB)/$(SHARED_LIBNAME) \
+@MAKE_ADA_SHAREDLIB@		$(LIBDIR)
+@MAKE_ADA_SHAREDLIB@	( cd $(LIBDIR) && $(LN_S) $(SHARED_LIBNAME) $(SHARED_SYMLINK) )
+@MAKE_ADA_SHAREDLIB@
+@MAKE_ADA_SHAREDLIB@uninstall \
+@MAKE_ADA_SHAREDLIB@uninstall.libs ::
+@MAKE_ADA_SHAREDLIB@	$(SHELL) -c 'for name in $(BUILD_DIR)/dynamic-ali/* ; do rm -f $(ADA_OBJECTS)/`basename $$name`; done'
+@MAKE_ADA_SHAREDLIB@
+@MAKE_ADA_SHAREDLIB@uninstall \
+@MAKE_ADA_SHAREDLIB@uninstall.libs ::
+@MAKE_ADA_SHAREDLIB@	rm -f $(LIBDIR)/$(SHARED_SYMLINK)
+@MAKE_ADA_SHAREDLIB@	rm -f $(LIBDIR)/$(SHARED_LIBNAME)
+
+#rm-docs :
+#	gnatdoc --enable-build $(ADAMAKEFLAGS) -XLIB_KIND=static
+
+clean ::
+	-rm -f default.cgpr
+	-rm -rf $(BUILD_DIR)/*-ali
+	-rm -rf $(BUILD_DIR)/*-obj
+	-rm -rf $(BUILD_DIR_LIB)
+#@USE_GNAT_PROJECTS@	gprclean $(ADAMAKEFLAGS) -XLIB_KIND=static
+#@MAKE_ADA_SHAREDLIB@	gprclean $(ADAMAKEFLAGS) -XLIB_KIND=dynamic
diff --git a/Ada95/src/c_threaded_variables.c b/Ada95/src/c_threaded_variables.c
new file mode 100644
index 0000000..44b4bcb
--- /dev/null
+++ b/Ada95/src/c_threaded_variables.c
@@ -0,0 +1,57 @@
+/****************************************************************************
+ * Copyright 2020,2022 Thomas E. Dickey                                     *
+ * Copyright 2014 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Nicolas Boulenguez, 2011                                      *
+ ****************************************************************************/
+
+#include "c_threaded_variables.h"
+
+#define WRAP(type, name)        \
+  type                          \
+  name ## _as_function (void)   \
+  {                             \
+    return name;                \
+  }
+/* *INDENT-OFF* */
+WRAP(WINDOW *, stdscr)
+WRAP(WINDOW *, curscr)
+
+WRAP(int, LINES)
+WRAP(int, COLS)
+WRAP(int, TABSIZE)
+WRAP(int, COLORS)
+WRAP(int, COLOR_PAIRS)
+
+chtype
+acs_map_as_function(char inx)
+{
+  return acs_map[(unsigned char) inx];
+}
+/* *INDENT-ON* */
diff --git a/Ada95/src/c_threaded_variables.h b/Ada95/src/c_threaded_variables.h
new file mode 100644
index 0000000..e27ff7c
--- /dev/null
+++ b/Ada95/src/c_threaded_variables.h
@@ -0,0 +1,59 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 2014,2015 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: c_threaded_variables.h,v 1.4 2020/02/02 23:34:34 tom Exp $ */
+
+#ifndef __C_THREADED_VARIABLES_H
+#define __C_THREADED_VARIABLES_H
+
+#include <ncurses_cfg.h>
+
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#else
+# if HAVE_STDINT_H
+#  include <stdint.h>
+# endif
+#endif
+
+#include <curses.h>
+
+extern WINDOW *stdscr_as_function(void);
+extern WINDOW *curscr_as_function(void);
+
+extern int LINES_as_function(void);
+extern int LINES_as_function(void);
+extern int COLS_as_function(void);
+extern int TABSIZE_as_function(void);
+extern int COLORS_as_function(void);
+extern int COLOR_PAIRS_as_function(void);
+
+extern chtype acs_map_as_function(char /* index */ );
+
+#endif /* __C_THREADED_VARIABLES_H */
diff --git a/Ada95/src/c_varargs_to_ada.c b/Ada95/src/c_varargs_to_ada.c
new file mode 100644
index 0000000..7561911
--- /dev/null
+++ b/Ada95/src/c_varargs_to_ada.c
@@ -0,0 +1,118 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 2011,2014 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Nicolas Boulenguez, 2011                                      *
+ ****************************************************************************/
+
+/*
+    Version Control
+    $Id: c_varargs_to_ada.c,v 1.7 2020/02/02 23:34:34 tom Exp $
+  --------------------------------------------------------------------------*/
+/*
+  */
+
+#include "c_varargs_to_ada.h"
+
+int
+set_field_type_alnum(FIELD *field,
+		     int minimum_width)
+{
+  return set_field_type(field, TYPE_ALNUM, minimum_width);
+}
+
+int
+set_field_type_alpha(FIELD *field,
+		     int minimum_width)
+{
+  return set_field_type(field, TYPE_ALPHA, minimum_width);
+}
+
+int
+set_field_type_enum(FIELD *field,
+		    char **value_list,
+		    int case_sensitive,
+		    int unique_match)
+{
+  return set_field_type(field, TYPE_ENUM, value_list, case_sensitive,
+			unique_match);
+}
+
+int
+set_field_type_integer(FIELD *field,
+		       int precision,
+		       long minimum,
+		       long maximum)
+{
+  return set_field_type(field, TYPE_INTEGER, precision, minimum, maximum);
+}
+
+int
+set_field_type_numeric(FIELD *field,
+		       int precision,
+		       double minimum,
+		       double maximum)
+{
+  return set_field_type(field, TYPE_NUMERIC, precision, minimum, maximum);
+}
+
+int
+set_field_type_regexp(FIELD *field,
+		      char *regular_expression)
+{
+  return set_field_type(field, TYPE_REGEXP, regular_expression);
+}
+
+int
+set_field_type_ipv4(FIELD *field)
+{
+  return set_field_type(field, TYPE_IPV4);
+}
+
+int
+set_field_type_user(FIELD *field,
+		    FIELDTYPE *fieldtype,
+		    void *arg)
+{
+  return set_field_type(field, fieldtype, arg);
+}
+
+void *
+void_star_make_arg(va_list *list)
+{
+  return va_arg(*list, void *);
+}
+
+#ifdef TRACE
+void
+_traces(const char *fmt, char *arg)
+{
+  _tracef(fmt, arg);
+}
+#endif
diff --git a/Ada95/src/c_varargs_to_ada.h b/Ada95/src/c_varargs_to_ada.h
new file mode 100644
index 0000000..8b78219
--- /dev/null
+++ b/Ada95/src/c_varargs_to_ada.h
@@ -0,0 +1,82 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 2011,2015 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: c_varargs_to_ada.h,v 1.5 2020/02/02 23:34:34 tom Exp $ */
+
+#ifndef __C_VARARGS_TO_ADA_H
+#define __C_VARARGS_TO_ADA_H
+
+#ifdef HAVE_CONFIG_H
+#include <ncurses_cfg.h>
+#else
+#include <ncurses.h>
+#endif
+
+#include <stdlib.h>
+
+#include <form.h>
+
+extern int set_field_type_alnum(FIELD * /* field */ ,
+				int /* minimum_width */ );
+
+extern int set_field_type_alpha(FIELD * /* field */ ,
+				int /* minimum_width */ );
+
+extern int set_field_type_enum(FIELD * /* field */ ,
+			       char ** /* value_list */ ,
+			       int /* case_sensitive */ ,
+			       int /* unique_match */ );
+
+extern int set_field_type_integer(FIELD * /* field */ ,
+				  int /* precision */ ,
+				  long /* minimum */ ,
+				  long /* maximum */ );
+
+extern int set_field_type_numeric(FIELD * /* field */ ,
+				  int /* precision */ ,
+				  double /* minimum */ ,
+				  double /* maximum */ );
+
+extern int set_field_type_regexp(FIELD * /* field */ ,
+				 char * /* regular_expression */ );
+
+extern int set_field_type_ipv4(FIELD * /* field */ );
+
+extern int set_field_type_user(FIELD * /* field */ ,
+			       FIELDTYPE * /* fieldtype */ ,
+			       void * /* arg */ );
+
+extern void *void_star_make_arg(va_list * /* list */ );
+
+#ifdef TRACE
+extern void _traces(const char *	/* fmt */
+		    ,char * /* arg */ );
+#endif
+
+#endif /* __C_VARARGS_TO_ADA_H */
diff --git a/Ada95/src/library-cfg.sh b/Ada95/src/library-cfg.sh
new file mode 100755
index 0000000..b9b5c93
--- /dev/null
+++ b/Ada95/src/library-cfg.sh
@@ -0,0 +1,73 @@
+#!/bin/sh
+##############################################################################
+# Copyright 2018-2020,2022 Thomas E. Dickey                                  #
+# Copyright 2016,2018 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: library-cfg.sh,v 1.8 2022/07/16 17:03:59 tom Exp $
+#
+# Work around incompatible behavior introduced with gnat6, which causes
+# gnatmake to attempt to compile all of the C objects which might be part of
+# the project.  This can only work if we provide the compiler flags (done here
+# by making a copy of the project file with that information filled in).
+model=$1
+shift 1
+input=$1
+shift 1
+param=
+while test $# != 0
+do
+	case "x$1" in
+	*-[OgDIWf]*)
+		test -n "$param" && param="$param,"
+		param="$param\"$1\""
+		;;
+	*)
+		echo "${0##*/}: ignored option $1" >&2
+		;;
+	esac
+	shift 1
+done
+
+SHARE="-- "
+test "x$model" = "xdynamic" && SHARE=
+
+SCRIPT=library-cfg.tmp
+cat >$SCRIPT <<EOF
+/for Library_Options use /{
+	s,-- ,$SHARE,
+}
+/for Default_Switches ("C") use/{
+	s,-- ,,
+	s% use .*% use($param);%
+}
+EOF
+
+sed -f "$SCRIPT" "$input"
+rc=$?
+rm -f "$SCRIPT"
+exit $rc
diff --git a/Ada95/src/library.gpr.in b/Ada95/src/library.gpr.in
new file mode 100644
index 0000000..37cbb9d
--- /dev/null
+++ b/Ada95/src/library.gpr.in
@@ -0,0 +1,71 @@
+------------------------------------------------------------------------------
+-- Copyright 2019,2020 Thomas E. Dickey                                     --
+--                                                                          --
+-- 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: library.gpr.in,v 1.3 2020/06/27 20:47:40 tom Exp $
+-- http://gcc.gnu.org/onlinedocs/gnat_ugn_unw/Library-Projects.html
+-- http://www.adaworld.com/debian/debian-ada-policy.html
+project AdaCurses is
+  Build_Dir := External ("BUILD_DIR");
+  Source_Dir := External ("SOURCE_DIR");
+  Source_Dir2 := External ("SOURCE_DIR2");
+  Kind := External ("LIB_KIND");
+  for Library_Name use External ("LIB_NAME");
+  for Library_Version use External ("SONAME");
+
+  for Library_Kind use Kind;
+  for Library_Dir use Build_Dir & "/lib";
+  for Object_Dir use Build_Dir & "/" & Kind & "-obj";
+  for Library_ALI_Dir use Build_Dir & "/" & Kind & "-ali";
+  for Source_Dirs use (Source_Dir & "/src",
+                       Source_Dir2,
+                       Build_Dir & "/src");
+  -- for Library_Options use ("-lncurses@USE_LIB_SUFFIX@", "-lpanel@USE_LIB_SUFFIX@", "-lmenu@USE_LIB_SUFFIX@", "-lform@USE_LIB_SUFFIX@");
+  package Compiler is
+     for Default_Switches ("Ada") use
+       ("-g",
+        "-O2",
+        "-Wall",
+        "-gnatafno",
+        "-gnatVa",   -- All validity checks
+        "-gnatwa");  -- Activate all optional errors
+     -- for Default_Switches ("C") use (CFLAGS)
+  end Compiler;
+  for Languages use ("C", "Ada");
+  package Install is
+     for Install_Name use "adacurses";
+     -- for Artifacts ("share/doc/adacurses") use ("../doc/Ada95.html", "../doc/ada");
+     -- for Artifacts ("share/doc/adacurses/adacurses_rm") use ("../" & Kind & "-obj" & "/gnatdoc/*");
+     for Artifacts ("lib/ada/adalib") use
+        ("../src/*.ali");
+     for Artifacts ("share/ada/adainclude") use
+        ("../src/*.ad?");
+     -- for Artifacts ("share/examples/adacurses") use
+     --    ("../samples/*.ad?", "../samples/explain.txt", "../samples/Makefile", "../samples/README");
+     -- for Artifacts ("share/man/man1") use ("../doc/adacurses-config.1");
+     for Artifacts ("bin") use ("../gen/adacurses-config");
+  end Install;
+end AdaCurses;
diff --git a/Ada95/src/modules b/Ada95/src/modules
new file mode 100644
index 0000000..29a0d8b
--- /dev/null
+++ b/Ada95/src/modules
@@ -0,0 +1,71 @@
+# $Id: modules,v 1.4 2020/02/02 23:34:34 tom Exp $
+##############################################################################
+# Copyright 2020 Thomas E. Dickey                                            #
+# Copyright 2010 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey	2010
+#
+
+# Library objects
+# rootname				depend-spec	depend-body	unit
+$(ALIB)					$(srcdir)	none		spec
+$(ABASE)-aux				none		$(srcdir)	body
+$(ABASE)				none		.		body
+$(ABASE)-terminfo			$(srcdir)	$(srcdir)	body
+$(ABASE)-termcap			$(srcdir)	$(srcdir)	body
+$(ABASE)-putwin				$(srcdir)	$(srcdir)	body
+$(ABASE)-trace				.		.		body
+$(ABASE)-mouse				.		$(srcdir)	body
+$(ABASE)-panels				.		$(srcdir)	body
+$(ABASE)-menus				.		$(srcdir)	body
+$(ABASE)-forms				.		$(srcdir)	body
+$(ABASE)-forms-field_types		.		$(srcdir)	body
+$(ABASE)-forms-field_types-alpha	$(srcdir)	$(srcdir)	body
+$(ABASE)-forms-field_types-alphanumeric	$(srcdir)	$(srcdir)	body
+$(ABASE)-forms-field_types-intfield	$(srcdir)	$(srcdir)	body
+$(ABASE)-forms-field_types-numeric	$(srcdir)	$(srcdir)	body
+$(ABASE)-forms-field_types-regexp	$(srcdir)	$(srcdir)	body
+$(ABASE)-forms-field_types-enumeration	$(srcdir)	$(srcdir)	body
+$(ABASE)-forms-field_types-ipv4_address	$(srcdir)	$(srcdir)	body
+$(ABASE)-forms-field_types-user		$(srcdir)	$(srcdir)	body
+$(ABASE)-forms-field_types-user-choice	$(srcdir)	$(srcdir)	body
+$(ABASE)-text_io			$(srcdir)	$(srcdir)	body
+$(ABASE)-text_io-aux			$(srcdir)	$(srcdir)	body
+$(ABASE)-menus-menu_user_data		.		$(srcdir)	body
+$(ABASE)-menus-item_user_data		.		$(srcdir)	body
+$(ABASE)-forms-form_user_data		.		$(srcdir)	body
+$(ABASE)-forms-field_user_data		.		$(srcdir)	body
+$(ABASE)-forms-field_types-enumeration-ada $(srcdir)	$(srcdir)	body
+$(ABASE)-panels-user_data		.		$(srcdir)	body
+$(ABASE)-text_io-integer_io		$(srcdir)	$(srcdir)	body
+$(ABASE)-text_io-float_io		$(srcdir)	$(srcdir)	body
+$(ABASE)-text_io-fixed_io		$(srcdir)	$(srcdir)	body
+$(ABASE)-text_io-decimal_io		$(srcdir)	$(srcdir)	body
+$(ABASE)-text_io-enumeration_io		$(srcdir)	$(srcdir)	body
+$(ABASE)-text_io-modular_io		$(srcdir)	$(srcdir)	body
+$(ABASE)-text_io-complex_io		$(srcdir)	$(srcdir)	body
diff --git a/Ada95/src/ncurses_compat.c b/Ada95/src/ncurses_compat.c
new file mode 100644
index 0000000..f2de222
--- /dev/null
+++ b/Ada95/src/ncurses_compat.c
@@ -0,0 +1,146 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 2011,2015 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Thomas E. Dickey, 2011                                        *
+ ****************************************************************************/
+
+/*
+    Version Control
+    $Id: ncurses_compat.c,v 1.4 2020/02/02 23:34:34 tom Exp $
+  --------------------------------------------------------------------------*/
+
+/*
+ * Provide compatibility with older versions of ncurses.
+ */
+#include <ncurses_cfg.h>
+
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#else
+# if HAVE_STDINT_H
+#  include <stdint.h>
+# endif
+#endif
+
+#include <curses.h>
+
+#if defined(NCURSES_VERSION_PATCH)
+
+#if NCURSES_VERSION_PATCH < 20081122
+extern bool has_mouse(void);
+extern int _nc_has_mouse(void);
+
+bool
+has_mouse(void)
+{
+  return (bool)_nc_has_mouse();
+}
+#endif
+
+/*
+ * These are provided by lib_gen.c:
+ */
+#if NCURSES_VERSION_PATCH < 20070331
+extern bool (is_keypad) (const WINDOW *);
+extern bool (is_scrollok) (const WINDOW *);
+
+bool
+is_keypad(const WINDOW *win)
+{
+  return ((win)->_use_keypad);
+}
+
+bool
+  (is_scrollok) (const WINDOW *win)
+{
+  return ((win)->_scroll);
+}
+#endif
+
+#if NCURSES_VERSION_PATCH < 20060107
+extern int (getbegx) (WINDOW *);
+extern int (getbegy) (WINDOW *);
+extern int (getcurx) (WINDOW *);
+extern int (getcury) (WINDOW *);
+extern int (getmaxx) (WINDOW *);
+extern int (getmaxy) (WINDOW *);
+extern int (getparx) (WINDOW *);
+extern int (getpary) (WINDOW *);
+
+int
+  (getbegy) (WINDOW *win)
+{
+  return ((win) ? (win)->_begy : ERR);
+}
+
+int
+  (getbegx) (WINDOW *win)
+{
+  return ((win) ? (win)->_begx : ERR);
+}
+
+int
+  (getcury) (WINDOW *win)
+{
+  return ((win) ? (win)->_cury : ERR);
+}
+
+int
+  (getcurx) (WINDOW *win)
+{
+  return ((win) ? (win)->_curx : ERR);
+}
+
+int
+  (getmaxy) (WINDOW *win)
+{
+  return ((win) ? ((win)->_maxy + 1) : ERR);
+}
+
+int
+  (getmaxx) (WINDOW *win)
+{
+  return ((win) ? ((win)->_maxx + 1) : ERR);
+}
+
+int
+  (getpary) (WINDOW *win)
+{
+  return ((win) ? (win)->_pary : ERR);
+}
+
+int
+  (getparx) (WINDOW *win)
+{
+  return ((win) ? (win)->_parx : ERR);
+}
+#endif
+
+#endif
diff --git a/Ada95/src/terminal_interface-curses-aux.adb b/Ada95/src/terminal_interface-curses-aux.adb
new file mode 100644
index 0000000..2f506af
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-aux.adb
@@ -0,0 +1,117 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                      Terminal_Interface.Curses.Aux                       --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.12 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+package body Terminal_Interface.Curses.Aux is
+   --
+   --  Some helpers
+   procedure Fill_String (Cp  : chars_ptr;
+                          Str : out String)
+   is
+      --  Fill the string with the characters referenced by the
+      --  chars_ptr.
+      --
+      Len : Natural;
+   begin
+      if Cp /= Null_Ptr then
+         Len := Natural (Strlen (Cp));
+         if Str'Length < Len then
+            raise Constraint_Error;
+         end if;
+         declare
+            S : String (1 .. Len);
+         begin
+            S := Value (Cp);
+            Str (Str'First .. (Str'First + Len - 1)) := S (S'Range);
+         end;
+      else
+         Len := 0;
+      end if;
+
+      if Len < Str'Length then
+         Str ((Str'First + Len) .. Str'Last) := (others => ' ');
+      end if;
+
+   end Fill_String;
+
+   function Fill_String (Cp : chars_ptr) return String
+   is
+      Len : Natural;
+   begin
+      if Cp /= Null_Ptr then
+         Len := Natural (Strlen (Cp));
+         if Len = 0 then
+            return "";
+         else
+            declare
+               S : String (1 .. Len);
+            begin
+               Fill_String (Cp, S);
+               return S;
+            end;
+         end if;
+      else
+         return "";
+      end if;
+   end Fill_String;
+
+   procedure Eti_Exception (Code : Eti_Error)
+   is
+   begin
+      case Code is
+         when E_Ok              => null;
+         when E_System_Error    => raise Eti_System_Error;
+         when E_Bad_Argument    => raise Eti_Bad_Argument;
+         when E_Posted          => raise Eti_Posted;
+         when E_Connected       => raise Eti_Connected;
+         when E_Bad_State       => raise Eti_Bad_State;
+         when E_No_Room         => raise Eti_No_Room;
+         when E_Not_Posted      => raise Eti_Not_Posted;
+         when E_Unknown_Command => raise Eti_Unknown_Command;
+         when E_No_Match        => raise Eti_No_Match;
+         when E_Not_Selectable  => raise Eti_Not_Selectable;
+         when E_Not_Connected   => raise Eti_Not_Connected;
+         when E_Request_Denied  => raise Eti_Request_Denied;
+         when E_Invalid_Field   => raise Eti_Invalid_Field;
+         when E_Current         => raise Eti_Current;
+      end case;
+   end Eti_Exception;
+
+end Terminal_Interface.Curses.Aux;
diff --git a/Ada95/src/terminal_interface-curses-forms-field_types-alpha.adb b/Ada95/src/terminal_interface-curses-forms-field_types-alpha.adb
new file mode 100644
index 0000000..23cf7b7
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-forms-field_types-alpha.adb
@@ -0,0 +1,59 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--              Terminal_Interface.Curses.Forms.Field_Types.Alpha           --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2011,2014 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.14 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux;
+
+package body Terminal_Interface.Curses.Forms.Field_Types.Alpha is
+
+   procedure Set_Field_Type (Fld : Field;
+                             Typ : Alpha_Field)
+   is
+      function Set_Fld_Type (F    : Field := Fld;
+                             Arg1 : C_Int) return Eti_Error;
+      pragma Import (C, Set_Fld_Type, "set_field_type_alpha");
+
+   begin
+      Eti_Exception (Set_Fld_Type (Arg1 => C_Int (Typ.Minimum_Field_Width)));
+      Wrap_Builtin (Fld, Typ);
+   end Set_Field_Type;
+
+end Terminal_Interface.Curses.Forms.Field_Types.Alpha;
diff --git a/Ada95/src/terminal_interface-curses-forms-field_types-alpha.ads b/Ada95/src/terminal_interface-curses-forms-field_types-alpha.ads
new file mode 100644
index 0000000..3cfadb6
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-forms-field_types-alpha.ads
@@ -0,0 +1,54 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--              Terminal_Interface.Curses.Forms.Field_Types.Alpha           --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.13 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+package Terminal_Interface.Curses.Forms.Field_Types.Alpha is
+   pragma Preelaborate (Terminal_Interface.Curses.Forms.Field_Types.Alpha);
+
+   type Alpha_Field is new Field_Type
+     with record
+        Minimum_Field_Width : Natural := 0;
+     end record;
+
+   procedure Set_Field_Type (Fld : Field;
+                             Typ : Alpha_Field);
+   pragma Inline (Set_Field_Type);
+
+end Terminal_Interface.Curses.Forms.Field_Types.Alpha;
diff --git a/Ada95/src/terminal_interface-curses-forms-field_types-alphanumeric.adb b/Ada95/src/terminal_interface-curses-forms-field_types-alphanumeric.adb
new file mode 100644
index 0000000..55db15c
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-forms-field_types-alphanumeric.adb
@@ -0,0 +1,59 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--          Terminal_Interface.Curses.Forms.Field_Types.AlphaNumeric        --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2011,2014 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.14 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux;
+
+package body Terminal_Interface.Curses.Forms.Field_Types.AlphaNumeric is
+
+   procedure Set_Field_Type (Fld : Field;
+                             Typ : AlphaNumeric_Field)
+   is
+      function Set_Fld_Type (F    : Field := Fld;
+                             Arg1 : C_Int) return Eti_Error;
+      pragma Import (C, Set_Fld_Type, "set_field_type_alnum");
+
+   begin
+      Eti_Exception (Set_Fld_Type (Arg1 => C_Int (Typ.Minimum_Field_Width)));
+      Wrap_Builtin (Fld, Typ);
+   end Set_Field_Type;
+
+end Terminal_Interface.Curses.Forms.Field_Types.AlphaNumeric;
diff --git a/Ada95/src/terminal_interface-curses-forms-field_types-alphanumeric.ads b/Ada95/src/terminal_interface-curses-forms-field_types-alphanumeric.ads
new file mode 100644
index 0000000..ef17c25
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-forms-field_types-alphanumeric.ads
@@ -0,0 +1,55 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--          Terminal_Interface.Curses.Forms.Field_Types.AlphaNumeric        --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.13 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+package Terminal_Interface.Curses.Forms.Field_Types.AlphaNumeric is
+   pragma Preelaborate
+     (Terminal_Interface.Curses.Forms.Field_Types.AlphaNumeric);
+
+   type AlphaNumeric_Field is new Field_Type
+     with record
+        Minimum_Field_Width : Natural := 0;
+     end record;
+
+   procedure Set_Field_Type (Fld : Field;
+                             Typ : AlphaNumeric_Field);
+   pragma Inline (Set_Field_Type);
+
+end Terminal_Interface.Curses.Forms.Field_Types.AlphaNumeric;
diff --git a/Ada95/src/terminal_interface-curses-forms-field_types-enumeration-ada.adb b/Ada95/src/terminal_interface-curses-forms-field_types-enumeration-ada.adb
new file mode 100644
index 0000000..472aa23
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-forms-field_types-enumeration-ada.adb
@@ -0,0 +1,82 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--         Terminal_Interface.Curses.Forms.Field_Types.Enumeration.Ada      --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2004,2011 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.12 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Ada.Characters.Handling; use Ada.Characters.Handling;
+
+package body Terminal_Interface.Curses.Forms.Field_Types.Enumeration.Ada is
+
+   function Create (Set            : Type_Set := Mixed_Case;
+                    Case_Sensitive : Boolean  := False;
+                    Must_Be_Unique : Boolean  := False)
+                    return Enumeration_Field
+   is
+      I : Enumeration_Info (T'Pos (T'Last) - T'Pos (T'First) + 1);
+      J : Positive := 1;
+   begin
+      I.Case_Sensitive := Case_Sensitive;
+      I.Match_Must_Be_Unique := Must_Be_Unique;
+
+      for E in T'Range loop
+         I.Names (J) := new String'(T'Image (E));
+         --  The Image attribute defaults to upper case, so we have to handle
+         --  only the other ones...
+         if Set /= Upper_Case then
+            I.Names (J).all := To_Lower (I.Names (J).all);
+            if Set = Mixed_Case then
+               I.Names (J).all (I.Names (J).all'First) :=
+                 To_Upper (I.Names (J).all (I.Names (J).all'First));
+            end if;
+         end if;
+         J := J + 1;
+      end loop;
+
+      return Create (I, True);
+   end Create;
+
+   function Value (Fld : Field;
+                   Buf : Buffer_Number := Buffer_Number'First) return T
+   is
+   begin
+      return T'Value (Get_Buffer (Fld, Buf));
+   end Value;
+
+end Terminal_Interface.Curses.Forms.Field_Types.Enumeration.Ada;
diff --git a/Ada95/src/terminal_interface-curses-forms-field_types-enumeration-ada.ads b/Ada95/src/terminal_interface-curses-forms-field_types-enumeration-ada.ads
new file mode 100644
index 0000000..33bc343
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-forms-field_types-enumeration-ada.ads
@@ -0,0 +1,60 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--         Terminal_Interface.Curses.Forms.Field_Types.Enumeration.Ada      --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2002,2003 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.12 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+generic
+   type T is (<>);
+
+package Terminal_Interface.Curses.Forms.Field_Types.Enumeration.Ada is
+   pragma Preelaborate
+     (Terminal_Interface.Curses.Forms.Field_Types.Enumeration.Ada);
+
+   function Create (Set            : Type_Set := Mixed_Case;
+                    Case_Sensitive : Boolean  := False;
+                    Must_Be_Unique : Boolean  := False)
+                    return Enumeration_Field;
+
+   function Value (Fld : Field;
+                   Buf : Buffer_Number := Buffer_Number'First) return T;
+   --  Translate the content of the fields buffer - indicated by the
+   --  buffer number - into an enumeration value. If the buffer is empty
+   --  or the content is invalid, a Constraint_Error is raises.
+
+end Terminal_Interface.Curses.Forms.Field_Types.Enumeration.Ada;
diff --git a/Ada95/src/terminal_interface-curses-forms-field_types-enumeration.adb b/Ada95/src/terminal_interface-curses-forms-field_types-enumeration.adb
new file mode 100644
index 0000000..d45a9e9
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-forms-field_types-enumeration.adb
@@ -0,0 +1,113 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--          Terminal_Interface.Curses.Forms.Field_Types.Enumeration         --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2011,2014 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.13 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Ada.Unchecked_Deallocation;
+with Interfaces.C; use Interfaces.C;
+with Interfaces.C.Strings; use Interfaces.C.Strings;
+with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux;
+
+package body Terminal_Interface.Curses.Forms.Field_Types.Enumeration is
+
+   function Create (Info               : Enumeration_Info;
+                    Auto_Release_Names : Boolean := False)
+                    return Enumeration_Field
+   is
+      procedure Release_String is
+        new Ada.Unchecked_Deallocation (String,
+                                        String_Access);
+      E : Enumeration_Field;
+      L : constant size_t := 1 + size_t (Info.C);
+      S : String_Access;
+   begin
+      E.Case_Sensitive       := Info.Case_Sensitive;
+      E.Match_Must_Be_Unique := Info.Match_Must_Be_Unique;
+      E.Arr := new chars_ptr_array (size_t (1) .. L);
+      for I in 1 .. Positive (L - 1) loop
+         if Info.Names (I) = null then
+            raise Form_Exception;
+         end if;
+         E.Arr.all (size_t (I)) := New_String (Info.Names (I).all);
+         if Auto_Release_Names then
+            S := Info.Names (I);
+            Release_String (S);
+         end if;
+      end loop;
+      E.Arr.all (L) := Null_Ptr;
+      return E;
+   end Create;
+
+   procedure Release (Enum : in out Enumeration_Field)
+   is
+      I : size_t := 0;
+      P : chars_ptr;
+   begin
+      loop
+         P := Enum.Arr.all (I);
+         exit when P = Null_Ptr;
+         Free (P);
+         Enum.Arr.all (I) := Null_Ptr;
+         I := I + 1;
+      end loop;
+      Enum.Arr := null;
+   end Release;
+
+   procedure Set_Field_Type (Fld : Field;
+                             Typ : Enumeration_Field)
+   is
+      function Set_Fld_Type (F    : Field := Fld;
+                             Arg1 : chars_ptr_array;
+                             Arg2 : C_Int;
+                             Arg3 : C_Int) return Eti_Error;
+      pragma Import (C, Set_Fld_Type, "set_field_type_enum");
+
+   begin
+      if Typ.Arr = null then
+         raise Form_Exception;
+      end if;
+      Eti_Exception
+        (Set_Fld_Type
+           (Arg1 => Typ.Arr.all,
+            Arg2 => C_Int (Boolean'Pos (Typ.Case_Sensitive)),
+            Arg3 => C_Int (Boolean'Pos (Typ.Match_Must_Be_Unique))));
+      Wrap_Builtin (Fld, Typ, C_Choice_Router);
+   end Set_Field_Type;
+
+end Terminal_Interface.Curses.Forms.Field_Types.Enumeration;
diff --git a/Ada95/src/terminal_interface-curses-forms-field_types-enumeration.ads b/Ada95/src/terminal_interface-curses-forms-field_types-enumeration.ads
new file mode 100644
index 0000000..ca9ab52
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-forms-field_types-enumeration.ads
@@ -0,0 +1,99 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--           Terminal_Interface.Curses.Forms.Field_Types.Enumeration        --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2018,2020 Thomas E. Dickey                                     --
+-- Copyright 1999-2003,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.15 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Interfaces.C.Strings;
+
+package Terminal_Interface.Curses.Forms.Field_Types.Enumeration is
+   pragma Preelaborate
+     (Terminal_Interface.Curses.Forms.Field_Types.Enumeration);
+
+   type String_Access is access String;
+
+   --  Type_Set is used by the child package Ada
+   type Type_Set is (Lower_Case, Upper_Case, Mixed_Case);
+
+   type Enum_Array is array (Positive range <>)
+     of String_Access;
+
+   type Enumeration_Info (C : Positive) is
+      record
+         Case_Sensitive       : Boolean := False;
+         Match_Must_Be_Unique : Boolean := False;
+         Names                : Enum_Array (1 .. C);
+      end record;
+
+   type Enumeration_Field is new Field_Type with private;
+
+   function Create (Info : Enumeration_Info;
+                    Auto_Release_Names : Boolean := False)
+                    return Enumeration_Field;
+   --  Make an fieldtype from the info. Enumerations are special, because
+   --  they normally don't copy the enum values into a private store, so
+   --  we have to care for the lifetime of the info we provide.
+   --  The Auto_Release_Names flag may be used to automatically releases
+   --  the strings in the Names array of the Enumeration_Info.
+
+   function Make_Enumeration_Type (Info : Enumeration_Info;
+                                   Auto_Release_Names : Boolean := False)
+                                   return Enumeration_Field renames Create;
+
+   procedure Release (Enum : in out Enumeration_Field);
+   --  But we may want to release the field to release the memory allocated
+   --  by it internally. After that the Enumeration field is no longer usable.
+
+   --  The next type definitions are all ncurses extensions. They are typically
+   --  not available in other curses implementations.
+
+   procedure Set_Field_Type (Fld : Field;
+                             Typ : Enumeration_Field);
+   pragma Inline (Set_Field_Type);
+
+private
+   type CPA_Access is access Interfaces.C.Strings.chars_ptr_array;
+
+   type Enumeration_Field is new Field_Type with
+      record
+         Case_Sensitive       : Boolean := False;
+         Match_Must_Be_Unique : Boolean := False;
+         Arr                  : CPA_Access := null;
+      end record;
+
+end Terminal_Interface.Curses.Forms.Field_Types.Enumeration;
diff --git a/Ada95/src/terminal_interface-curses-forms-field_types-intfield.adb b/Ada95/src/terminal_interface-curses-forms-field_types-intfield.adb
new file mode 100644
index 0000000..59e9d1e
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-forms-field_types-intfield.adb
@@ -0,0 +1,63 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--            Terminal_Interface.Curses.Forms.Field_Types.IntField          --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2011,2014 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.14 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux;
+
+package body Terminal_Interface.Curses.Forms.Field_Types.IntField is
+
+   procedure Set_Field_Type (Fld : Field;
+                             Typ : Integer_Field)
+   is
+      function Set_Fld_Type (F    : Field := Fld;
+                             Arg1 : C_Int;
+                             Arg2 : C_Long_Int;
+                             Arg3 : C_Long_Int) return Eti_Error;
+      pragma Import (C, Set_Fld_Type, "set_field_type_integer");
+
+   begin
+      Eti_Exception (Set_Fld_Type (Arg1 => C_Int (Typ.Precision),
+                                   Arg2 => C_Long_Int (Typ.Lower_Limit),
+                                   Arg3 => C_Long_Int (Typ.Upper_Limit)));
+      Wrap_Builtin (Fld, Typ);
+   end Set_Field_Type;
+
+end Terminal_Interface.Curses.Forms.Field_Types.IntField;
diff --git a/Ada95/src/terminal_interface-curses-forms-field_types-intfield.ads b/Ada95/src/terminal_interface-curses-forms-field_types-intfield.ads
new file mode 100644
index 0000000..1217824
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-forms-field_types-intfield.ads
@@ -0,0 +1,56 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--            Terminal_Interface.Curses.Forms.Field_Types.IntField          --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.13 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+package Terminal_Interface.Curses.Forms.Field_Types.IntField is
+   pragma Preelaborate (Terminal_Interface.Curses.Forms.Field_Types.IntField);
+
+   type Integer_Field is new Field_Type with
+      record
+         Precision   : Natural;
+         Lower_Limit : Integer;
+         Upper_Limit : Integer;
+      end record;
+
+   procedure Set_Field_Type (Fld : Field;
+                             Typ : Integer_Field);
+   pragma Inline (Set_Field_Type);
+
+end Terminal_Interface.Curses.Forms.Field_Types.IntField;
diff --git a/Ada95/src/terminal_interface-curses-forms-field_types-ipv4_address.adb b/Ada95/src/terminal_interface-curses-forms-field_types-ipv4_address.adb
new file mode 100644
index 0000000..4b5d10b
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-forms-field_types-ipv4_address.adb
@@ -0,0 +1,59 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--          Terminal_Interface.Curses.Forms.Field_Types.IPV4_Address        --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2011,2014 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.14 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux;
+
+package body Terminal_Interface.Curses.Forms.Field_Types.IPV4_Address is
+
+   procedure Set_Field_Type (Fld : Field;
+                             Typ : Internet_V4_Address_Field)
+   is
+      function Set_Fld_Type (F : Field := Fld)
+                             return Eti_Error;
+      pragma Import (C, Set_Fld_Type, "set_field_type_ipv4");
+
+   begin
+      Eti_Exception (Set_Fld_Type);
+      Wrap_Builtin (Fld, Typ);
+   end Set_Field_Type;
+
+end Terminal_Interface.Curses.Forms.Field_Types.IPV4_Address;
diff --git a/Ada95/src/terminal_interface-curses-forms-field_types-ipv4_address.ads b/Ada95/src/terminal_interface-curses-forms-field_types-ipv4_address.ads
new file mode 100644
index 0000000..bf3b77d
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-forms-field_types-ipv4_address.ads
@@ -0,0 +1,52 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--          Terminal_Interface.Curses.Forms.Field_Types.IPV4_Address        --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.13 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+package Terminal_Interface.Curses.Forms.Field_Types.IPV4_Address is
+   pragma Preelaborate
+     (Terminal_Interface.Curses.Forms.Field_Types.IPV4_Address);
+
+   type Internet_V4_Address_Field is new Field_Type with null record;
+
+   procedure Set_Field_Type (Fld : Field;
+                             Typ : Internet_V4_Address_Field);
+   pragma Inline (Set_Field_Type);
+
+end Terminal_Interface.Curses.Forms.Field_Types.IPV4_Address;
diff --git a/Ada95/src/terminal_interface-curses-forms-field_types-numeric.adb b/Ada95/src/terminal_interface-curses-forms-field_types-numeric.adb
new file mode 100644
index 0000000..7b1d931
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-forms-field_types-numeric.adb
@@ -0,0 +1,66 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--            Terminal_Interface.Curses.Forms.Field_Types.Numeric           --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2011,2014 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.15 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Interfaces.C;
+with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux;
+
+package body Terminal_Interface.Curses.Forms.Field_Types.Numeric is
+
+   procedure Set_Field_Type (Fld : Field;
+                             Typ : Numeric_Field)
+   is
+      type Double is new Interfaces.C.double;
+
+      function Set_Fld_Type (F    : Field := Fld;
+                             Arg1 : C_Int;
+                             Arg2 : Double;
+                             Arg3 : Double) return Eti_Error;
+      pragma Import (C, Set_Fld_Type, "set_field_type_numeric");
+
+   begin
+      Eti_Exception (Set_Fld_Type (Arg1 => C_Int (Typ.Precision),
+                                   Arg2 => Double (Typ.Lower_Limit),
+                                   Arg3 => Double (Typ.Upper_Limit)));
+      Wrap_Builtin (Fld, Typ);
+   end Set_Field_Type;
+
+end Terminal_Interface.Curses.Forms.Field_Types.Numeric;
diff --git a/Ada95/src/terminal_interface-curses-forms-field_types-numeric.ads b/Ada95/src/terminal_interface-curses-forms-field_types-numeric.ads
new file mode 100644
index 0000000..a7df7a4
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-forms-field_types-numeric.ads
@@ -0,0 +1,56 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--             Terminal_Interface.Curses.Forms.Field_Types.Numeric          --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.13 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+package Terminal_Interface.Curses.Forms.Field_Types.Numeric is
+   pragma Preelaborate (Terminal_Interface.Curses.Forms.Field_Types.Numeric);
+
+   type Numeric_Field is new Field_Type with
+      record
+         Precision   : Natural;
+         Lower_Limit : Float;
+         Upper_Limit : Float;
+      end record;
+
+   procedure Set_Field_Type (Fld : Field;
+                             Typ : Numeric_Field);
+   pragma Inline (Set_Field_Type);
+
+end Terminal_Interface.Curses.Forms.Field_Types.Numeric;
diff --git a/Ada95/src/terminal_interface-curses-forms-field_types-regexp.adb b/Ada95/src/terminal_interface-curses-forms-field_types-regexp.adb
new file mode 100644
index 0000000..fbc42e9
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-forms-field_types-regexp.adb
@@ -0,0 +1,59 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--             Terminal_Interface.Curses.Forms.Field_Types.RegExp           --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2011,2014 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.13 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Interfaces.C; use Interfaces.C;
+with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux;
+
+package body Terminal_Interface.Curses.Forms.Field_Types.RegExp is
+
+   procedure Set_Field_Type (Fld : Field;
+                             Typ : Regular_Expression_Field)
+   is
+      function Set_Ftyp (F    : Field := Fld;
+                         Arg1 : char_array) return Eti_Error;
+      pragma Import (C, Set_Ftyp, "set_field_type_regexp");
+
+   begin
+      Eti_Exception (Set_Ftyp (Arg1 => To_C (Typ.Regular_Expression.all)));
+      Wrap_Builtin (Fld, Typ);
+   end Set_Field_Type;
+
+end Terminal_Interface.Curses.Forms.Field_Types.RegExp;
diff --git a/Ada95/src/terminal_interface-curses-forms-field_types-regexp.ads b/Ada95/src/terminal_interface-curses-forms-field_types-regexp.ads
new file mode 100644
index 0000000..ee5146b
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-forms-field_types-regexp.ads
@@ -0,0 +1,56 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--              Terminal_Interface.Curses.Forms.Field_Types.RegExp          --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.13 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+package Terminal_Interface.Curses.Forms.Field_Types.RegExp is
+   pragma Preelaborate (Terminal_Interface.Curses.Forms.Field_Types.RegExp);
+
+   type String_Access is access String;
+
+   type Regular_Expression_Field is new Field_Type with
+      record
+         Regular_Expression : String_Access;
+      end record;
+
+   procedure Set_Field_Type (Fld : Field;
+                             Typ : Regular_Expression_Field);
+   pragma Inline (Set_Field_Type);
+
+end Terminal_Interface.Curses.Forms.Field_Types.RegExp;
diff --git a/Ada95/src/terminal_interface-curses-forms-field_types-user-choice.adb b/Ada95/src/terminal_interface-curses-forms-field_types-user-choice.adb
new file mode 100644
index 0000000..913cec0
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-forms-field_types-user-choice.adb
@@ -0,0 +1,105 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--          Terminal_Interface.Curses.Forms.Field_Types.User.Choice         --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2011,2014 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.21 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with System.Address_To_Access_Conversions;
+with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux;
+
+package body Terminal_Interface.Curses.Forms.Field_Types.User.Choice is
+
+   package Argument_Conversions is
+      new System.Address_To_Access_Conversions (Argument);
+
+   function Generic_Next (Fld : Field;
+                          Usr : System.Address) return Curses_Bool
+   is
+      Result : Boolean;
+      Udf    : constant User_Defined_Field_Type_With_Choice_Access :=
+        User_Defined_Field_Type_With_Choice_Access
+        (Argument_Access (Argument_Conversions.To_Pointer (Usr)).all.Typ);
+   begin
+      Result := Next (Fld, Udf.all);
+      return Curses_Bool (Boolean'Pos (Result));
+   end Generic_Next;
+
+   function Generic_Prev (Fld : Field;
+                          Usr : System.Address) return Curses_Bool
+   is
+      Result : Boolean;
+      Udf    : constant User_Defined_Field_Type_With_Choice_Access :=
+        User_Defined_Field_Type_With_Choice_Access
+        (Argument_Access (Argument_Conversions.To_Pointer (Usr)).all.Typ);
+   begin
+      Result := Previous (Fld, Udf.all);
+      return Curses_Bool (Boolean'Pos (Result));
+   end Generic_Prev;
+
+   --  -----------------------------------------------------------------------
+   --
+   function C_Generic_Choice return C_Field_Type
+   is
+      Res : Eti_Error;
+      T   : C_Field_Type;
+   begin
+      if M_Generic_Choice = Null_Field_Type then
+         T := New_Fieldtype (Generic_Field_Check'Access,
+                             Generic_Char_Check'Access);
+         if T = Null_Field_Type then
+            raise Form_Exception;
+         else
+            Res := Set_Fieldtype_Arg (T,
+                                      Make_Arg'Access,
+                                      Copy_Arg'Access,
+                                      Free_Arg'Access);
+            Eti_Exception (Res);
+
+            Res := Set_Fieldtype_Choice (T,
+                                         Generic_Next'Access,
+                                         Generic_Prev'Access);
+            Eti_Exception (Res);
+         end if;
+         M_Generic_Choice := T;
+      end if;
+      pragma Assert (M_Generic_Choice /= Null_Field_Type);
+      return M_Generic_Choice;
+   end C_Generic_Choice;
+
+end Terminal_Interface.Curses.Forms.Field_Types.User.Choice;
diff --git a/Ada95/src/terminal_interface-curses-forms-field_types-user-choice.ads b/Ada95/src/terminal_interface-curses-forms-field_types-user-choice.ads
new file mode 100644
index 0000000..518c192
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-forms-field_types-user-choice.ads
@@ -0,0 +1,95 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--           Terminal_Interface.Curses.Forms.Field_Types.User.Choice        --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2008,2011 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.15 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Interfaces.C;
+
+package Terminal_Interface.Curses.Forms.Field_Types.User.Choice is
+   pragma Preelaborate
+     (Terminal_Interface.Curses.Forms.Field_Types.User.Choice);
+
+   subtype C_Int is Interfaces.C.int;
+
+   type User_Defined_Field_Type_With_Choice is abstract new
+     User_Defined_Field_Type with null record;
+   --  This is the root of the mechanism we use to create field types in
+   --  Ada95 that allow the prev/next mechanism. You should your own type
+   --  derive from this one and implement the Field_Check, Character_Check
+   --  Next and Previous functions for your own type.
+
+   type User_Defined_Field_Type_With_Choice_Access is access all
+     User_Defined_Field_Type_With_Choice'Class;
+
+   function Next
+     (Fld : Field;
+      Typ : User_Defined_Field_Type_With_Choice) return Boolean
+      is abstract;
+   --  If True is returned, the function successfully generated a next
+   --  value into the fields buffer.
+
+   function Previous
+     (Fld : Field;
+      Typ : User_Defined_Field_Type_With_Choice) return Boolean
+      is abstract;
+   --  If True is returned, the function successfully generated a previous
+   --  value into the fields buffer.
+
+   --  +----------------------------------------------------------------------
+   --  | Private Part.
+   --  |
+private
+   function C_Generic_Choice return C_Field_Type;
+
+   function Generic_Next (Fld : Field;
+                          Usr : System.Address) return Curses_Bool;
+   pragma Convention (C, Generic_Next);
+   --  This is the generic next Choice_Function for the low-level fieldtype
+   --  representing all the User_Defined_Field_Type derivatives. It routes
+   --  the call to the Next implementation for the type.
+
+   function Generic_Prev (Fld : Field;
+                          Usr : System.Address) return Curses_Bool;
+   pragma Convention (C, Generic_Prev);
+   --  This is the generic prev Choice_Function for the low-level fieldtype
+   --  representing all the User_Defined_Field_Type derivatives. It routes
+   --  the call to the Previous implementation for the type.
+
+end Terminal_Interface.Curses.Forms.Field_Types.User.Choice;
diff --git a/Ada95/src/terminal_interface-curses-forms-field_types-user.adb b/Ada95/src/terminal_interface-curses-forms-field_types-user.adb
new file mode 100644
index 0000000..3f90b95
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-forms-field_types-user.adb
@@ -0,0 +1,127 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--              Terminal_Interface.Curses.Forms.Field_Types.User            --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2011,2014 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.24 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with System.Address_To_Access_Conversions;
+with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux;
+
+package body Terminal_Interface.Curses.Forms.Field_Types.User is
+
+   procedure Set_Field_Type (Fld : Field;
+                             Typ : User_Defined_Field_Type)
+   is
+      function Allocate_Arg (T : User_Defined_Field_Type'Class)
+                             return Argument_Access;
+
+      function Set_Fld_Type (F    : Field := Fld;
+                             Cft  : C_Field_Type := C_Generic_Type;
+                             Arg1 : Argument_Access)
+                             return Eti_Error;
+      pragma Import (C, Set_Fld_Type, "set_field_type_user");
+
+      function Allocate_Arg (T : User_Defined_Field_Type'Class)
+                             return Argument_Access
+      is
+         Ptr : constant Field_Type_Access
+             := new User_Defined_Field_Type'Class'(T);
+      begin
+         return new Argument'(Usr => System.Null_Address,
+                              Typ => Ptr,
+                              Cft => Null_Field_Type);
+      end Allocate_Arg;
+
+   begin
+      Eti_Exception (Set_Fld_Type (Arg1 => Allocate_Arg (Typ)));
+   end Set_Field_Type;
+
+   package Argument_Conversions is
+      new System.Address_To_Access_Conversions (Argument);
+
+   function Generic_Field_Check (Fld : Field;
+                                 Usr : System.Address) return Curses_Bool
+   is
+      Result : Boolean;
+      Udf    : constant User_Defined_Field_Type_Access :=
+        User_Defined_Field_Type_Access
+          (Argument_Access (Argument_Conversions.To_Pointer (Usr)).all.Typ);
+   begin
+      Result := Field_Check (Fld, Udf.all);
+      return Curses_Bool (Boolean'Pos (Result));
+   end Generic_Field_Check;
+
+   function Generic_Char_Check (Ch  : C_Int;
+                                Usr : System.Address) return Curses_Bool
+   is
+      Result : Boolean;
+      Udf    : constant User_Defined_Field_Type_Access :=
+        User_Defined_Field_Type_Access
+          (Argument_Access (Argument_Conversions.To_Pointer (Usr)).all.Typ);
+   begin
+      Result := Character_Check (Character'Val (Ch), Udf.all);
+      return Curses_Bool (Boolean'Pos (Result));
+   end Generic_Char_Check;
+
+   --  -----------------------------------------------------------------------
+   --
+   function C_Generic_Type return C_Field_Type
+   is
+      Res : Eti_Error;
+      T   : C_Field_Type;
+   begin
+      if M_Generic_Type = Null_Field_Type then
+         T := New_Fieldtype (Generic_Field_Check'Access,
+                             Generic_Char_Check'Access);
+         if T = Null_Field_Type then
+            raise Form_Exception;
+         else
+            Res := Set_Fieldtype_Arg (T,
+                                      Make_Arg'Access,
+                                      Copy_Arg'Access,
+                                      Free_Arg'Access);
+            Eti_Exception (Res);
+         end if;
+         M_Generic_Type := T;
+      end if;
+      pragma Assert (M_Generic_Type /= Null_Field_Type);
+      return M_Generic_Type;
+   end C_Generic_Type;
+
+end Terminal_Interface.Curses.Forms.Field_Types.User;
diff --git a/Ada95/src/terminal_interface-curses-forms-field_types-user.ads b/Ada95/src/terminal_interface-curses-forms-field_types-user.ads
new file mode 100644
index 0000000..c82a70c
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-forms-field_types-user.ads
@@ -0,0 +1,96 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--               Terminal_Interface.Curses.Forms.Field_Types.User           --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2009,2011 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.16 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Interfaces.C;
+
+package Terminal_Interface.Curses.Forms.Field_Types.User is
+   pragma Preelaborate (Terminal_Interface.Curses.Forms.Field_Types.User);
+   subtype C_Int is Interfaces.C.int;
+
+   type User_Defined_Field_Type is abstract new Field_Type with null record;
+   --  This is the root of the mechanism we use to create field types in
+   --  Ada95. You should your own type derive from this one and implement
+   --  the Field_Check and Character_Check functions for your own type.
+
+   type User_Defined_Field_Type_Access is access all
+     User_Defined_Field_Type'Class;
+
+   function Field_Check
+     (Fld : Field;
+      Typ : User_Defined_Field_Type) return Boolean
+      is abstract;
+   --  If True is returned, the field is considered valid, otherwise it is
+   --  invalid.
+
+   function Character_Check
+     (Ch  : Character;
+      Typ : User_Defined_Field_Type) return Boolean
+      is abstract;
+   --  If True is returned, the character is considered as valid for the
+   --  field, otherwise as invalid.
+
+   procedure Set_Field_Type (Fld : Field;
+                             Typ : User_Defined_Field_Type);
+   --  This should work for all types derived from User_Defined_Field_Type.
+   --  No need to reimplement it for your derived type.
+
+   --  +----------------------------------------------------------------------
+   --  | Private Part.
+   --  | Used by the Choice child package.
+private
+   function C_Generic_Type   return C_Field_Type;
+
+   function Generic_Field_Check (Fld : Field;
+                                 Usr : System.Address) return Curses_Bool;
+   pragma Convention (C, Generic_Field_Check);
+   --  This is the generic Field_Check_Function for the low-level fieldtype
+   --  representing all the User_Defined_Field_Type derivatives. It routes
+   --  the call to the Field_Check implementation for the type.
+
+   function Generic_Char_Check (Ch  : C_Int;
+                                Usr : System.Address) return Curses_Bool;
+   pragma Convention (C, Generic_Char_Check);
+   --  This is the generic Char_Check_Function for the low-level fieldtype
+   --  representing all the User_Defined_Field_Type derivatives. It routes
+   --  the call to the Character_Check implementation for the type.
+
+end Terminal_Interface.Curses.Forms.Field_Types.User;
diff --git a/Ada95/src/terminal_interface-curses-forms-field_types.adb b/Ada95/src/terminal_interface-curses-forms-field_types.adb
new file mode 100644
index 0000000..19f4aee
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-forms-field_types.adb
@@ -0,0 +1,270 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                 Terminal_Interface.Curses.Forms.Field_Types              --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2011,2014 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.29 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux;
+with Ada.Unchecked_Deallocation;
+with System.Address_To_Access_Conversions;
+
+--  |
+--  |=====================================================================
+--  | man page form_fieldtype.3x
+--  |=====================================================================
+--  |
+package body Terminal_Interface.Curses.Forms.Field_Types is
+
+   use type System.Address;
+
+   package Argument_Conversions is
+      new System.Address_To_Access_Conversions (Argument);
+
+   function Get_Fieldtype (F : Field) return C_Field_Type;
+   pragma Import (C, Get_Fieldtype, "field_type");
+
+   function Get_Arg (F : Field) return System.Address;
+   pragma Import (C, Get_Arg, "field_arg");
+   --  |
+   --  |=====================================================================
+   --  | man page form_field_validation.3x
+   --  |=====================================================================
+   --  |
+   --  |
+   --  |
+   function Get_Type (Fld : Field) return Field_Type_Access
+   is
+      Low_Level : constant C_Field_Type := Get_Fieldtype (Fld);
+      Arg : Argument_Access;
+   begin
+      if Low_Level = Null_Field_Type then
+         return null;
+      else
+         if Low_Level = M_Builtin_Router or else
+            Low_Level = M_Generic_Type or else
+            Low_Level = M_Choice_Router or else
+            Low_Level = M_Generic_Choice
+         then
+            Arg := Argument_Access
+         (Argument_Conversions.To_Pointer (Get_Arg (Fld)));
+            if Arg = null then
+               raise Form_Exception;
+            else
+               return Arg.all.Typ;
+            end if;
+         else
+            raise Form_Exception;
+         end if;
+      end if;
+   end Get_Type;
+
+   function Copy_Arg (Usr : System.Address) return System.Address
+   is
+   begin
+      return Usr;
+   end Copy_Arg;
+
+   procedure Free_Arg (Usr : System.Address)
+   is
+      procedure Free_Type is new Ada.Unchecked_Deallocation
+        (Field_Type'Class, Field_Type_Access);
+      procedure Freeargs is new Ada.Unchecked_Deallocation
+        (Argument, Argument_Access);
+
+      To_Be_Free : Argument_Access
+   := Argument_Access (Argument_Conversions.To_Pointer (Usr));
+      Low_Level  : C_Field_Type;
+   begin
+      if To_Be_Free /= null then
+         if To_Be_Free.all.Usr /= System.Null_Address then
+            Low_Level := To_Be_Free.all.Cft;
+            if Low_Level.all.Freearg /= null then
+               Low_Level.all.Freearg (To_Be_Free.all.Usr);
+            end if;
+         end if;
+         if To_Be_Free.all.Typ /= null then
+            Free_Type (To_Be_Free.all.Typ);
+         end if;
+         Freeargs (To_Be_Free);
+      end if;
+   end Free_Arg;
+
+   procedure Wrap_Builtin (Fld : Field;
+                           Typ : Field_Type'Class;
+                           Cft : C_Field_Type := C_Builtin_Router)
+   is
+      Usr_Arg   : constant System.Address := Get_Arg (Fld);
+      Low_Level : constant C_Field_Type := Get_Fieldtype (Fld);
+      Arg : Argument_Access;
+      function Set_Fld_Type (F    : Field := Fld;
+                             Cf   : C_Field_Type := Cft;
+                             Arg1 : Argument_Access) return Eti_Error;
+      pragma Import (C, Set_Fld_Type, "set_field_type_user");
+
+   begin
+      pragma Assert (Low_Level /= Null_Field_Type);
+      if Cft /= C_Builtin_Router and then Cft /= C_Choice_Router then
+         raise Form_Exception;
+      else
+         Arg := new Argument'(Usr => System.Null_Address,
+                              Typ => new Field_Type'Class'(Typ),
+                              Cft => Get_Fieldtype (Fld));
+         if Usr_Arg /= System.Null_Address then
+            if Low_Level.all.Copyarg /= null then
+               Arg.all.Usr := Low_Level.all.Copyarg (Usr_Arg);
+            else
+               Arg.all.Usr := Usr_Arg;
+            end if;
+         end if;
+
+         Eti_Exception (Set_Fld_Type (Arg1 => Arg));
+      end if;
+   end Wrap_Builtin;
+
+   function Field_Check_Router (Fld : Field;
+                                Usr : System.Address) return Curses_Bool
+   is
+      Arg  : constant Argument_Access
+   := Argument_Access (Argument_Conversions.To_Pointer (Usr));
+   begin
+      pragma Assert (Arg /= null and then Arg.all.Cft /= Null_Field_Type
+                     and then Arg.all.Typ /= null);
+      if Arg.all.Cft.all.Fcheck /= null then
+         return Arg.all.Cft.all.Fcheck (Fld, Arg.all.Usr);
+      else
+         return 1;
+      end if;
+   end Field_Check_Router;
+
+   function Char_Check_Router (Ch  : C_Int;
+                               Usr : System.Address) return Curses_Bool
+   is
+      Arg  : constant Argument_Access
+   := Argument_Access (Argument_Conversions.To_Pointer (Usr));
+   begin
+      pragma Assert (Arg /= null and then Arg.all.Cft /= Null_Field_Type
+                     and then Arg.all.Typ /= null);
+      if Arg.all.Cft.all.Ccheck /= null then
+         return Arg.all.Cft.all.Ccheck (Ch, Arg.all.Usr);
+      else
+         return 1;
+      end if;
+   end Char_Check_Router;
+
+   function Next_Router (Fld : Field;
+                         Usr : System.Address) return Curses_Bool
+   is
+      Arg  : constant Argument_Access
+   := Argument_Access (Argument_Conversions.To_Pointer (Usr));
+   begin
+      pragma Assert (Arg /= null and then Arg.all.Cft /= Null_Field_Type
+                     and then Arg.all.Typ /= null);
+      if Arg.all.Cft.all.Next /= null then
+         return Arg.all.Cft.all.Next (Fld, Arg.all.Usr);
+      else
+         return 1;
+      end if;
+   end Next_Router;
+
+   function Prev_Router (Fld : Field;
+                         Usr : System.Address) return Curses_Bool
+   is
+      Arg  : constant Argument_Access :=
+               Argument_Access (Argument_Conversions.To_Pointer (Usr));
+   begin
+      pragma Assert (Arg /= null and then Arg.all.Cft /= Null_Field_Type
+                     and then Arg.all.Typ /= null);
+      if Arg.all.Cft.all.Prev /= null then
+         return Arg.all.Cft.all.Prev (Fld, Arg.all.Usr);
+      else
+         return 1;
+      end if;
+   end Prev_Router;
+
+   --  -----------------------------------------------------------------------
+   --
+   function C_Builtin_Router return C_Field_Type
+   is
+      T   : C_Field_Type;
+   begin
+      if M_Builtin_Router = Null_Field_Type then
+         T := New_Fieldtype (Field_Check_Router'Access,
+                             Char_Check_Router'Access);
+         if T = Null_Field_Type then
+            raise Form_Exception;
+         else
+            Eti_Exception (Set_Fieldtype_Arg (T,
+                                              Make_Arg'Access,
+                                              Copy_Arg'Access,
+                                              Free_Arg'Access));
+         end if;
+         M_Builtin_Router := T;
+      end if;
+      pragma Assert (M_Builtin_Router /= Null_Field_Type);
+      return M_Builtin_Router;
+   end C_Builtin_Router;
+
+   --  -----------------------------------------------------------------------
+   --
+   function C_Choice_Router return C_Field_Type
+   is
+      T   : C_Field_Type;
+   begin
+      if M_Choice_Router = Null_Field_Type then
+         T := New_Fieldtype (Field_Check_Router'Access,
+                             Char_Check_Router'Access);
+         if T = Null_Field_Type then
+            raise Form_Exception;
+         else
+            Eti_Exception (Set_Fieldtype_Arg (T,
+                                              Make_Arg'Access,
+                                              Copy_Arg'Access,
+                                              Free_Arg'Access));
+
+            Eti_Exception (Set_Fieldtype_Choice (T,
+                                                 Next_Router'Access,
+                                                 Prev_Router'Access));
+         end if;
+         M_Choice_Router := T;
+      end if;
+      pragma Assert (M_Choice_Router /= Null_Field_Type);
+      return M_Choice_Router;
+   end C_Choice_Router;
+
+end Terminal_Interface.Curses.Forms.Field_Types;
diff --git a/Ada95/src/terminal_interface-curses-forms-field_user_data.adb b/Ada95/src/terminal_interface-curses-forms-field_user_data.adb
new file mode 100644
index 0000000..8b947d5
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-forms-field_user_data.adb
@@ -0,0 +1,81 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--               Terminal_Interface.Curses.Forms.Field_User_Data            --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2018,2020 Thomas E. Dickey                                     --
+-- Copyright 1999-2009,2014 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.17 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Terminal_Interface.Curses.Aux; use  Terminal_Interface.Curses.Aux;
+
+--  |
+--  |=====================================================================
+--  | man page form_field_userptr.3x
+--  |=====================================================================
+--  |
+package body Terminal_Interface.Curses.Forms.Field_User_Data is
+   --  |
+   --  |
+   --  |
+   procedure Set_User_Data (Fld  : Field;
+                            Data : User_Access)
+   is
+      function Set_Field_Userptr (Fld : Field;
+                                  Usr : User_Access) return Eti_Error;
+      pragma Import (C, Set_Field_Userptr, "set_field_userptr");
+
+   begin
+      Eti_Exception (Set_Field_Userptr (Fld, Data));
+   end Set_User_Data;
+   --  |
+   --  |
+   --  |
+   function Get_User_Data (Fld  : Field) return User_Access
+   is
+      function Field_Userptr (Fld : Field) return User_Access;
+      pragma Import (C, Field_Userptr, "field_userptr");
+   begin
+      return Field_Userptr (Fld);
+   end Get_User_Data;
+
+   procedure Get_User_Data (Fld  : Field;
+                            Data : out User_Access)
+   is
+   begin
+      Data := Get_User_Data (Fld);
+   end Get_User_Data;
+
+end Terminal_Interface.Curses.Forms.Field_User_Data;
diff --git a/Ada95/src/terminal_interface-curses-forms-form_user_data.adb b/Ada95/src/terminal_interface-curses-forms-form_user_data.adb
new file mode 100644
index 0000000..5091c22
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-forms-form_user_data.adb
@@ -0,0 +1,82 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                Terminal_Interface.Curses.Forms.Form_User_Data            --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2018,2020 Thomas E. Dickey                                     --
+-- Copyright 1999-2009,2014 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.17 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+--  |
+--  |=====================================================================
+--  | man page form__userptr.3x
+--  |=====================================================================
+--  |
+with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux;
+
+package body Terminal_Interface.Curses.Forms.Form_User_Data is
+
+   --  |
+   --  |
+   --  |
+   procedure Set_User_Data (Frm  : Form;
+                            Data : User_Access)
+   is
+      function Set_Form_Userptr (Frm  : Form;
+                                 Data : User_Access)  return Eti_Error;
+      pragma Import (C, Set_Form_Userptr, "set_form_userptr");
+
+   begin
+      Eti_Exception (Set_Form_Userptr (Frm, Data));
+   end Set_User_Data;
+   --  |
+   --  |
+   --  |
+   function Get_User_Data (Frm  : Form) return User_Access
+   is
+      function Form_Userptr (Frm : Form) return User_Access;
+      pragma Import (C, Form_Userptr, "form_userptr");
+   begin
+      return Form_Userptr (Frm);
+   end Get_User_Data;
+
+   procedure Get_User_Data (Frm  : Form;
+                            Data : out User_Access)
+   is
+   begin
+      Data := Get_User_Data (Frm);
+   end Get_User_Data;
+
+end Terminal_Interface.Curses.Forms.Form_User_Data;
diff --git a/Ada95/src/terminal_interface-curses-forms.adb b/Ada95/src/terminal_interface-curses-forms.adb
new file mode 100644
index 0000000..f50420e
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-forms.adb
@@ -0,0 +1,1032 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                      Terminal_Interface.Curses.Forms                     --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2011,2014 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.33 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Ada.Unchecked_Deallocation;
+
+with Interfaces.C; use Interfaces.C;
+with Interfaces.C.Strings; use Interfaces.C.Strings;
+with Interfaces.C.Pointers;
+
+with Terminal_Interface.Curses.Aux;
+
+package body Terminal_Interface.Curses.Forms is
+
+   use Terminal_Interface.Curses.Aux;
+
+   type C_Field_Array is array (Natural range <>) of aliased Field;
+   package F_Array is new
+     Interfaces.C.Pointers (Natural, Field, C_Field_Array, Null_Field);
+
+------------------------------------------------------------------------------
+   --  |
+   --  |
+   --  |
+   --  subtype chars_ptr is Interfaces.C.Strings.chars_ptr;
+
+   procedure Request_Name (Key  : Form_Request_Code;
+                                Name : out String)
+   is
+      function Form_Request_Name (Key : C_Int) return chars_ptr;
+      pragma Import (C, Form_Request_Name, "form_request_name");
+   begin
+      Fill_String (Form_Request_Name (C_Int (Key)), Name);
+   end Request_Name;
+
+   function Request_Name (Key : Form_Request_Code) return String
+   is
+      function Form_Request_Name (Key : C_Int) return chars_ptr;
+      pragma Import (C, Form_Request_Name, "form_request_name");
+   begin
+      return Fill_String (Form_Request_Name (C_Int (Key)));
+   end Request_Name;
+------------------------------------------------------------------------------
+   --  |
+   --  |
+   --  |
+   --  |
+   --  |=====================================================================
+   --  | man page form_field_new.3x
+   --  |=====================================================================
+   --  |
+   --  |
+   --  |
+   function Create (Height       : Line_Count;
+                    Width        : Column_Count;
+                    Top          : Line_Position;
+                    Left         : Column_Position;
+                    Off_Screen   : Natural := 0;
+                    More_Buffers : Buffer_Number := Buffer_Number'First)
+                    return Field
+   is
+      function Newfield (H, W, T, L, O, M : C_Int) return Field;
+      pragma Import (C, Newfield, "new_field");
+      Fld : constant Field := Newfield (C_Int (Height), C_Int (Width),
+                                        C_Int (Top), C_Int (Left),
+                                        C_Int (Off_Screen),
+                                        C_Int (More_Buffers));
+   begin
+      if Fld = Null_Field then
+         raise Form_Exception;
+      end if;
+      return Fld;
+   end Create;
+--  |
+--  |
+--  |
+   procedure Delete (Fld : in out Field)
+   is
+      function Free_Field (Fld : Field) return Eti_Error;
+      pragma Import (C, Free_Field, "free_field");
+
+   begin
+      Eti_Exception (Free_Field (Fld));
+      Fld := Null_Field;
+   end Delete;
+   --  |
+   --  |
+   --  |
+   function Duplicate (Fld  : Field;
+                       Top  : Line_Position;
+                       Left : Column_Position) return Field
+   is
+      function Dup_Field (Fld  : Field;
+                          Top  : C_Int;
+                          Left : C_Int) return Field;
+      pragma Import (C, Dup_Field, "dup_field");
+
+      F : constant Field := Dup_Field (Fld,
+                                       C_Int (Top),
+                                       C_Int (Left));
+   begin
+      if F = Null_Field then
+         raise Form_Exception;
+      end if;
+      return F;
+   end Duplicate;
+   --  |
+   --  |
+   --  |
+   function Link (Fld  : Field;
+                  Top  : Line_Position;
+                  Left : Column_Position) return Field
+   is
+      function Lnk_Field (Fld  : Field;
+                          Top  : C_Int;
+                          Left : C_Int) return Field;
+      pragma Import (C, Lnk_Field, "link_field");
+
+      F : constant Field := Lnk_Field (Fld,
+                                       C_Int (Top),
+                                       C_Int (Left));
+   begin
+      if F = Null_Field then
+         raise Form_Exception;
+      end if;
+      return F;
+   end Link;
+   --  |
+   --  |=====================================================================
+   --  | man page form_field_just.3x
+   --  |=====================================================================
+   --  |
+   --  |
+   --  |
+   procedure Set_Justification (Fld  : Field;
+                                Just : Field_Justification := None)
+   is
+      function Set_Field_Just (Fld  : Field;
+                               Just : C_Int) return Eti_Error;
+      pragma Import (C, Set_Field_Just, "set_field_just");
+
+   begin
+      Eti_Exception (Set_Field_Just (Fld,
+                                     C_Int (Field_Justification'Pos (Just))));
+   end Set_Justification;
+   --  |
+   --  |
+   --  |
+   function Get_Justification (Fld : Field) return Field_Justification
+   is
+      function Field_Just (Fld : Field) return C_Int;
+      pragma Import (C, Field_Just, "field_just");
+   begin
+      return Field_Justification'Val (Field_Just (Fld));
+   end Get_Justification;
+   --  |
+   --  |=====================================================================
+   --  | man page form_field_buffer.3x
+   --  |=====================================================================
+   --  |
+   --  |
+   --  |
+   procedure Set_Buffer
+     (Fld    : Field;
+      Buffer : Buffer_Number := Buffer_Number'First;
+      Str    : String)
+   is
+      function Set_Fld_Buffer (Fld    : Field;
+                                 Bufnum : C_Int;
+                                 S      : char_array)
+        return Eti_Error;
+      pragma Import (C, Set_Fld_Buffer, "set_field_buffer");
+
+   begin
+      Eti_Exception (Set_Fld_Buffer (Fld, C_Int (Buffer), To_C (Str)));
+   end Set_Buffer;
+   --  |
+   --  |
+   --  |
+   procedure Get_Buffer
+     (Fld    : Field;
+      Buffer : Buffer_Number := Buffer_Number'First;
+      Str    : out String)
+   is
+      function Field_Buffer (Fld : Field;
+                             B   : C_Int) return chars_ptr;
+      pragma Import (C, Field_Buffer, "field_buffer");
+   begin
+      Fill_String (Field_Buffer (Fld, C_Int (Buffer)), Str);
+   end Get_Buffer;
+
+   function Get_Buffer
+     (Fld    : Field;
+      Buffer : Buffer_Number := Buffer_Number'First) return String
+   is
+      function Field_Buffer (Fld : Field;
+                             B   : C_Int) return chars_ptr;
+      pragma Import (C, Field_Buffer, "field_buffer");
+   begin
+      return Fill_String (Field_Buffer (Fld, C_Int (Buffer)));
+   end Get_Buffer;
+   --  |
+   --  |
+   --  |
+   procedure Set_Status (Fld    : Field;
+                         Status : Boolean := True)
+   is
+      function Set_Fld_Status (Fld : Field;
+                               St  : C_Int) return Eti_Error;
+      pragma Import (C, Set_Fld_Status, "set_field_status");
+
+   begin
+      if Set_Fld_Status (Fld, Boolean'Pos (Status)) /= E_Ok then
+         raise Form_Exception;
+      end if;
+   end Set_Status;
+   --  |
+   --  |
+   --  |
+   function Changed (Fld : Field) return Boolean
+   is
+      function Field_Status (Fld : Field) return C_Int;
+      pragma Import (C, Field_Status, "field_status");
+
+      Res : constant C_Int := Field_Status (Fld);
+   begin
+      if Res = Curses_False then
+         return False;
+      else
+         return True;
+      end if;
+   end Changed;
+   --  |
+   --  |
+   --  |
+   procedure Set_Maximum_Size (Fld : Field;
+                               Max : Natural := 0)
+   is
+      function Set_Field_Max (Fld : Field;
+                              M   : C_Int) return Eti_Error;
+      pragma Import (C, Set_Field_Max, "set_max_field");
+
+   begin
+      Eti_Exception (Set_Field_Max (Fld, C_Int (Max)));
+   end Set_Maximum_Size;
+   --  |
+   --  |=====================================================================
+   --  | man page form_field_opts.3x
+   --  |=====================================================================
+   --  |
+   --  |
+   --  |
+   procedure Set_Options (Fld     : Field;
+                          Options : Field_Option_Set)
+   is
+      function Set_Field_Opts (Fld : Field;
+                               Opt : Field_Option_Set) return Eti_Error;
+      pragma Import (C, Set_Field_Opts, "set_field_opts");
+
+   begin
+      Eti_Exception (Set_Field_Opts (Fld, Options));
+   end Set_Options;
+   --  |
+   --  |
+   --  |
+   procedure Switch_Options (Fld     : Field;
+                             Options : Field_Option_Set;
+                             On      : Boolean := True)
+   is
+      function Field_Opts_On (Fld : Field;
+                              Opt : Field_Option_Set) return Eti_Error;
+      pragma Import (C, Field_Opts_On, "field_opts_on");
+      function Field_Opts_Off (Fld : Field;
+                               Opt : Field_Option_Set) return Eti_Error;
+      pragma Import (C, Field_Opts_Off, "field_opts_off");
+
+   begin
+      if On then
+         Eti_Exception (Field_Opts_On (Fld, Options));
+      else
+         Eti_Exception (Field_Opts_Off (Fld, Options));
+      end if;
+   end Switch_Options;
+   --  |
+   --  |
+   --  |
+   procedure Get_Options (Fld     : Field;
+                          Options : out Field_Option_Set)
+   is
+      function Field_Opts (Fld : Field) return Field_Option_Set;
+      pragma Import (C, Field_Opts, "field_opts");
+
+   begin
+      Options := Field_Opts (Fld);
+   end Get_Options;
+   --  |
+   --  |
+   --  |
+   function Get_Options (Fld : Field := Null_Field)
+                         return Field_Option_Set
+   is
+      Fos : Field_Option_Set;
+   begin
+      Get_Options (Fld, Fos);
+      return Fos;
+   end Get_Options;
+   --  |
+   --  |=====================================================================
+   --  | man page form_field_attributes.3x
+   --  |=====================================================================
+   --  |
+   --  |
+   --  |
+   procedure Set_Foreground
+     (Fld   : Field;
+      Fore  : Character_Attribute_Set := Normal_Video;
+      Color : Color_Pair := Color_Pair'First)
+   is
+      function Set_Field_Fore (Fld  : Field;
+                               Attr : Attributed_Character) return Eti_Error;
+      pragma Import (C, Set_Field_Fore, "set_field_fore");
+
+   begin
+      Eti_Exception (Set_Field_Fore (Fld, (Ch    => Character'First,
+                                           Color => Color,
+                                           Attr  => Fore)));
+   end Set_Foreground;
+   --  |
+   --  |
+   --  |
+   procedure Foreground (Fld  : Field;
+                         Fore : out Character_Attribute_Set)
+   is
+      function Field_Fore (Fld : Field) return Attributed_Character;
+      pragma Import (C, Field_Fore, "field_fore");
+   begin
+      Fore := Field_Fore (Fld).Attr;
+   end Foreground;
+
+   procedure Foreground (Fld   : Field;
+                         Fore  : out Character_Attribute_Set;
+                         Color : out Color_Pair)
+   is
+      function Field_Fore (Fld : Field) return Attributed_Character;
+      pragma Import (C, Field_Fore, "field_fore");
+   begin
+      Fore  := Field_Fore (Fld).Attr;
+      Color := Field_Fore (Fld).Color;
+   end Foreground;
+   --  |
+   --  |
+   --  |
+   procedure Set_Background
+     (Fld   : Field;
+      Back  : Character_Attribute_Set := Normal_Video;
+      Color : Color_Pair := Color_Pair'First)
+   is
+      function Set_Field_Back (Fld  : Field;
+                               Attr : Attributed_Character) return Eti_Error;
+      pragma Import (C, Set_Field_Back, "set_field_back");
+
+   begin
+      Eti_Exception (Set_Field_Back (Fld, (Ch    => Character'First,
+                                           Color => Color,
+                                           Attr  => Back)));
+   end Set_Background;
+   --  |
+   --  |
+   --  |
+   procedure Background (Fld  : Field;
+                         Back : out Character_Attribute_Set)
+   is
+      function Field_Back (Fld : Field) return Attributed_Character;
+      pragma Import (C, Field_Back, "field_back");
+   begin
+      Back := Field_Back (Fld).Attr;
+   end Background;
+
+   procedure Background (Fld   : Field;
+                         Back  : out Character_Attribute_Set;
+                         Color : out Color_Pair)
+   is
+      function Field_Back (Fld : Field) return Attributed_Character;
+      pragma Import (C, Field_Back, "field_back");
+   begin
+      Back  := Field_Back (Fld).Attr;
+      Color := Field_Back (Fld).Color;
+   end Background;
+   --  |
+   --  |
+   --  |
+   procedure Set_Pad_Character (Fld : Field;
+                                Pad : Character := Space)
+   is
+      function Set_Field_Pad (Fld : Field;
+                              Ch  : C_Int) return Eti_Error;
+      pragma Import (C, Set_Field_Pad, "set_field_pad");
+
+   begin
+      Eti_Exception (Set_Field_Pad (Fld,
+                                    C_Int (Character'Pos (Pad))));
+   end Set_Pad_Character;
+   --  |
+   --  |
+   --  |
+   procedure Pad_Character (Fld : Field;
+                            Pad : out Character)
+   is
+      function Field_Pad (Fld : Field) return C_Int;
+      pragma Import (C, Field_Pad, "field_pad");
+   begin
+      Pad := Character'Val (Field_Pad (Fld));
+   end Pad_Character;
+   --  |
+   --  |=====================================================================
+   --  | man page form_field_info.3x
+   --  |=====================================================================
+   --  |
+   --  |
+   --  |
+   procedure Info (Fld                : Field;
+                   Lines              : out Line_Count;
+                   Columns            : out Column_Count;
+                   First_Row          : out Line_Position;
+                   First_Column       : out Column_Position;
+                   Off_Screen         : out Natural;
+                   Additional_Buffers : out Buffer_Number)
+   is
+      type C_Int_Access is access all C_Int;
+      function Fld_Info (Fld : Field;
+                         L, C, Fr, Fc, Os, Ab : C_Int_Access)
+                         return Eti_Error;
+      pragma Import (C, Fld_Info, "field_info");
+
+      L, C, Fr, Fc, Os, Ab : aliased C_Int;
+   begin
+      Eti_Exception (Fld_Info (Fld,
+                               L'Access, C'Access,
+                               Fr'Access, Fc'Access,
+                               Os'Access, Ab'Access));
+      Lines              := Line_Count (L);
+      Columns            := Column_Count (C);
+      First_Row          := Line_Position (Fr);
+      First_Column       := Column_Position (Fc);
+      Off_Screen         := Natural (Os);
+      Additional_Buffers := Buffer_Number (Ab);
+   end Info;
+--  |
+--  |
+--  |
+   procedure Dynamic_Info (Fld     : Field;
+                           Lines   : out Line_Count;
+                           Columns : out Column_Count;
+                           Max     : out Natural)
+   is
+      type C_Int_Access is access all C_Int;
+      function Dyn_Info (Fld : Field; L, C, M : C_Int_Access) return Eti_Error;
+      pragma Import (C, Dyn_Info, "dynamic_field_info");
+
+      L, C, M : aliased C_Int;
+   begin
+      Eti_Exception (Dyn_Info (Fld,
+                               L'Access, C'Access,
+                               M'Access));
+      Lines   := Line_Count (L);
+      Columns := Column_Count (C);
+      Max     := Natural (M);
+   end Dynamic_Info;
+   --  |
+   --  |=====================================================================
+   --  | man page form_win.3x
+   --  |=====================================================================
+   --  |
+   --  |
+   --  |
+   procedure Set_Window (Frm : Form;
+                         Win : Window)
+   is
+      function Set_Form_Win (Frm : Form;
+                             Win : Window) return Eti_Error;
+      pragma Import (C, Set_Form_Win, "set_form_win");
+
+   begin
+      Eti_Exception (Set_Form_Win (Frm, Win));
+   end Set_Window;
+   --  |
+   --  |
+   --  |
+   function Get_Window (Frm : Form) return Window
+   is
+      function Form_Win (Frm : Form) return Window;
+      pragma Import (C, Form_Win, "form_win");
+
+      W : constant Window := Form_Win (Frm);
+   begin
+      return W;
+   end Get_Window;
+   --  |
+   --  |
+   --  |
+   procedure Set_Sub_Window (Frm : Form;
+                             Win : Window)
+   is
+      function Set_Form_Sub (Frm : Form;
+                             Win : Window) return Eti_Error;
+      pragma Import (C, Set_Form_Sub, "set_form_sub");
+
+   begin
+      Eti_Exception (Set_Form_Sub (Frm, Win));
+   end Set_Sub_Window;
+   --  |
+   --  |
+   --  |
+   function Get_Sub_Window (Frm : Form) return Window
+   is
+      function Form_Sub (Frm : Form) return Window;
+      pragma Import (C, Form_Sub, "form_sub");
+
+      W : constant Window := Form_Sub (Frm);
+   begin
+      return W;
+   end Get_Sub_Window;
+   --  |
+   --  |
+   --  |
+   procedure Scale (Frm     : Form;
+                    Lines   : out Line_Count;
+                    Columns : out Column_Count)
+   is
+      type C_Int_Access is access all C_Int;
+      function M_Scale (Frm : Form; Yp, Xp : C_Int_Access) return Eti_Error;
+      pragma Import (C, M_Scale, "scale_form");
+
+      X, Y : aliased C_Int;
+   begin
+      Eti_Exception (M_Scale (Frm, Y'Access, X'Access));
+      Lines   := Line_Count (Y);
+      Columns := Column_Count (X);
+   end Scale;
+   --  |
+   --  |=====================================================================
+   --  | man page menu_hook.3x
+   --  |=====================================================================
+   --  |
+   --  |
+   --  |
+   procedure Set_Field_Init_Hook (Frm  : Form;
+                                  Proc : Form_Hook_Function)
+   is
+      function Set_Field_Init (Frm  : Form;
+                               Proc : Form_Hook_Function) return Eti_Error;
+      pragma Import (C, Set_Field_Init, "set_field_init");
+
+   begin
+      Eti_Exception (Set_Field_Init (Frm, Proc));
+   end Set_Field_Init_Hook;
+   --  |
+   --  |
+   --  |
+   procedure Set_Field_Term_Hook (Frm  : Form;
+                                  Proc : Form_Hook_Function)
+   is
+      function Set_Field_Term (Frm  : Form;
+                               Proc : Form_Hook_Function) return Eti_Error;
+      pragma Import (C, Set_Field_Term, "set_field_term");
+
+   begin
+      Eti_Exception (Set_Field_Term (Frm, Proc));
+   end Set_Field_Term_Hook;
+   --  |
+   --  |
+   --  |
+   procedure Set_Form_Init_Hook (Frm  : Form;
+                                 Proc : Form_Hook_Function)
+   is
+      function Set_Form_Init (Frm  : Form;
+                              Proc : Form_Hook_Function) return Eti_Error;
+      pragma Import (C, Set_Form_Init, "set_form_init");
+
+   begin
+      Eti_Exception (Set_Form_Init (Frm, Proc));
+   end Set_Form_Init_Hook;
+   --  |
+   --  |
+   --  |
+   procedure Set_Form_Term_Hook (Frm  : Form;
+                                 Proc : Form_Hook_Function)
+   is
+      function Set_Form_Term (Frm  : Form;
+                              Proc : Form_Hook_Function) return Eti_Error;
+      pragma Import (C, Set_Form_Term, "set_form_term");
+
+   begin
+      Eti_Exception (Set_Form_Term (Frm, Proc));
+   end Set_Form_Term_Hook;
+   --  |
+   --  |=====================================================================
+   --  | man page form_fields.3x
+   --  |=====================================================================
+   --  |
+   --  |
+   --  |
+   procedure Redefine (Frm  : Form;
+                       Flds : Field_Array_Access)
+   is
+      function Set_Frm_Fields (Frm   : Form;
+                               Items : System.Address) return Eti_Error;
+      pragma Import (C, Set_Frm_Fields, "set_form_fields");
+
+   begin
+      pragma Assert (Flds.all (Flds'Last) = Null_Field);
+      if Flds.all (Flds'Last) /= Null_Field then
+         raise Form_Exception;
+      else
+         Eti_Exception (Set_Frm_Fields (Frm, Flds.all (Flds'First)'Address));
+      end if;
+   end Redefine;
+   --  |
+   --  |
+   --  |
+   function Fields (Frm   : Form;
+                    Index : Positive) return Field
+   is
+      use F_Array;
+
+      function C_Fields (Frm : Form) return Pointer;
+      pragma Import (C, C_Fields, "form_fields");
+
+      P : Pointer := C_Fields (Frm);
+   begin
+      if P = null or else Index > Field_Count (Frm) then
+         raise Form_Exception;
+      else
+         P := P + ptrdiff_t (C_Int (Index) - 1);
+         return P.all;
+      end if;
+   end Fields;
+   --  |
+   --  |
+   --  |
+   function Field_Count (Frm : Form) return Natural
+   is
+      function Count (Frm : Form) return C_Int;
+      pragma Import (C, Count, "field_count");
+   begin
+      return Natural (Count (Frm));
+   end Field_Count;
+   --  |
+   --  |
+   --  |
+   procedure Move (Fld    : Field;
+                   Line   : Line_Position;
+                   Column : Column_Position)
+   is
+      function Move (Fld : Field; L, C : C_Int) return Eti_Error;
+      pragma Import (C, Move, "move_field");
+
+   begin
+      Eti_Exception (Move (Fld, C_Int (Line), C_Int (Column)));
+   end Move;
+   --  |
+   --  |=====================================================================
+   --  | man page form_new.3x
+   --  |=====================================================================
+   --  |
+   --  |
+   --  |
+   function Create (Fields : Field_Array_Access) return Form
+   is
+      function NewForm (Fields : System.Address) return Form;
+      pragma Import (C, NewForm, "new_form");
+
+      M   : Form;
+   begin
+      pragma Assert (Fields.all (Fields'Last) = Null_Field);
+      if Fields.all (Fields'Last) /= Null_Field then
+         raise Form_Exception;
+      else
+         M := NewForm (Fields.all (Fields'First)'Address);
+         if M = Null_Form then
+            raise Form_Exception;
+         end if;
+         return M;
+      end if;
+   end Create;
+   --  |
+   --  |
+   --  |
+   procedure Delete (Frm : in out Form)
+   is
+      function Free (Frm : Form) return Eti_Error;
+      pragma Import (C, Free, "free_form");
+
+   begin
+      Eti_Exception (Free (Frm));
+      Frm := Null_Form;
+   end Delete;
+   --  |
+   --  |=====================================================================
+   --  | man page form_opts.3x
+   --  |=====================================================================
+   --  |
+   --  |
+   --  |
+   procedure Set_Options (Frm     : Form;
+                          Options : Form_Option_Set)
+   is
+      function Set_Form_Opts (Frm : Form;
+                              Opt : Form_Option_Set) return Eti_Error;
+      pragma Import (C, Set_Form_Opts, "set_form_opts");
+
+   begin
+      Eti_Exception (Set_Form_Opts (Frm, Options));
+   end Set_Options;
+   --  |
+   --  |
+   --  |
+   procedure Switch_Options (Frm     : Form;
+                             Options : Form_Option_Set;
+                             On      : Boolean := True)
+   is
+      function Form_Opts_On (Frm : Form;
+                             Opt : Form_Option_Set) return Eti_Error;
+      pragma Import (C, Form_Opts_On, "form_opts_on");
+      function Form_Opts_Off (Frm : Form;
+                              Opt : Form_Option_Set) return Eti_Error;
+      pragma Import (C, Form_Opts_Off, "form_opts_off");
+
+   begin
+      if On then
+         Eti_Exception (Form_Opts_On (Frm, Options));
+      else
+         Eti_Exception (Form_Opts_Off (Frm, Options));
+      end if;
+   end Switch_Options;
+   --  |
+   --  |
+   --  |
+   procedure Get_Options (Frm     : Form;
+                          Options : out Form_Option_Set)
+   is
+      function Form_Opts (Frm : Form) return Form_Option_Set;
+      pragma Import (C, Form_Opts, "form_opts");
+
+   begin
+      Options := Form_Opts (Frm);
+   end Get_Options;
+   --  |
+   --  |
+   --  |
+   function Get_Options (Frm : Form := Null_Form) return Form_Option_Set
+   is
+      Fos : Form_Option_Set;
+   begin
+      Get_Options (Frm, Fos);
+      return Fos;
+   end Get_Options;
+   --  |
+   --  |=====================================================================
+   --  | man page form_post.3x
+   --  |=====================================================================
+   --  |
+   --  |
+   --  |
+   procedure Post (Frm  : Form;
+                   Post : Boolean := True)
+   is
+      function M_Post (Frm : Form) return Eti_Error;
+      pragma Import (C, M_Post, "post_form");
+      function M_Unpost (Frm : Form) return Eti_Error;
+      pragma Import (C, M_Unpost, "unpost_form");
+
+   begin
+      if Post then
+         Eti_Exception (M_Post (Frm));
+      else
+         Eti_Exception (M_Unpost (Frm));
+      end if;
+   end Post;
+   --  |
+   --  |=====================================================================
+   --  | man page form_cursor.3x
+   --  |=====================================================================
+   --  |
+   --  |
+   --  |
+   procedure Position_Cursor (Frm : Form)
+   is
+      function Pos_Form_Cursor (Frm : Form) return Eti_Error;
+      pragma Import (C, Pos_Form_Cursor, "pos_form_cursor");
+
+   begin
+      Eti_Exception (Pos_Form_Cursor (Frm));
+   end Position_Cursor;
+   --  |
+   --  |=====================================================================
+   --  | man page form_data.3x
+   --  |=====================================================================
+   --  |
+   --  |
+   --  |
+   function Data_Ahead (Frm : Form) return Boolean
+   is
+      function Ahead (Frm : Form) return C_Int;
+      pragma Import (C, Ahead, "data_ahead");
+
+      Res : constant C_Int := Ahead (Frm);
+   begin
+      if Res = Curses_False then
+         return False;
+      else
+         return True;
+      end if;
+   end Data_Ahead;
+   --  |
+   --  |
+   --  |
+   function Data_Behind (Frm : Form) return Boolean
+   is
+      function Behind (Frm : Form) return C_Int;
+      pragma Import (C, Behind, "data_behind");
+
+      Res : constant C_Int := Behind (Frm);
+   begin
+      if Res = Curses_False then
+         return False;
+      else
+         return True;
+      end if;
+   end Data_Behind;
+   --  |
+   --  |=====================================================================
+   --  | man page form_driver.3x
+   --  |=====================================================================
+   --  |
+   --  |
+   --  |
+   function Driver (Frm : Form;
+                    Key : Key_Code) return Driver_Result
+   is
+      function Frm_Driver (Frm : Form; Key : C_Int) return Eti_Error;
+      pragma Import (C, Frm_Driver, "form_driver");
+
+      R : constant Eti_Error := Frm_Driver (Frm, C_Int (Key));
+   begin
+      case R is
+         when E_Unknown_Command =>
+            return Unknown_Request;
+         when E_Invalid_Field =>
+            return Invalid_Field;
+         when E_Request_Denied =>
+            return Request_Denied;
+         when others =>
+            Eti_Exception (R);
+            return Form_Ok;
+      end case;
+   end Driver;
+   --  |
+   --  |=====================================================================
+   --  | man page form_page.3x
+   --  |=====================================================================
+   --  |
+   --  |
+   --  |
+   procedure Set_Current (Frm : Form;
+                          Fld : Field)
+   is
+      function Set_Current_Fld (Frm : Form; Fld : Field) return Eti_Error;
+      pragma Import (C, Set_Current_Fld, "set_current_field");
+
+   begin
+      Eti_Exception (Set_Current_Fld (Frm, Fld));
+   end Set_Current;
+   --  |
+   --  |
+   --  |
+   function Current (Frm : Form) return Field
+   is
+      function Current_Fld (Frm : Form) return Field;
+      pragma Import (C, Current_Fld, "current_field");
+
+      Fld : constant Field := Current_Fld (Frm);
+   begin
+      if Fld = Null_Field then
+         raise Form_Exception;
+      end if;
+      return Fld;
+   end Current;
+   --  |
+   --  |
+   --  |
+   procedure Set_Page (Frm  : Form;
+                       Page : Page_Number := Page_Number'First)
+   is
+      function Set_Frm_Page (Frm : Form; Pg : C_Int) return Eti_Error;
+      pragma Import (C, Set_Frm_Page, "set_form_page");
+
+   begin
+      Eti_Exception (Set_Frm_Page (Frm, C_Int (Page)));
+   end Set_Page;
+   --  |
+   --  |
+   --  |
+   function Page (Frm : Form) return Page_Number
+   is
+      function Get_Page (Frm : Form) return C_Int;
+      pragma Import (C, Get_Page, "form_page");
+
+      P : constant C_Int := Get_Page (Frm);
+   begin
+      if P < 0 then
+         raise Form_Exception;
+      else
+         return Page_Number (P);
+      end if;
+   end Page;
+
+   function Get_Index (Fld : Field) return Positive
+   is
+      function Get_Fieldindex (Fld : Field) return C_Int;
+      pragma Import (C, Get_Fieldindex, "field_index");
+
+      Res : constant C_Int := Get_Fieldindex (Fld);
+   begin
+      if Res = Curses_Err then
+         raise Form_Exception;
+      end if;
+      return Positive (Natural (Res) + Positive'First);
+   end Get_Index;
+
+   --  |
+   --  |=====================================================================
+   --  | man page form_new_page.3x
+   --  |=====================================================================
+   --  |
+   --  |
+   --  |
+   procedure Set_New_Page (Fld      : Field;
+                           New_Page : Boolean := True)
+   is
+      function Set_Page (Fld : Field; Flg : C_Int) return Eti_Error;
+      pragma Import (C, Set_Page, "set_new_page");
+
+   begin
+      Eti_Exception (Set_Page (Fld, Boolean'Pos (New_Page)));
+   end Set_New_Page;
+   --  |
+   --  |
+   --  |
+   function Is_New_Page (Fld : Field) return Boolean
+   is
+      function Is_New (Fld : Field) return C_Int;
+      pragma Import (C, Is_New, "new_page");
+
+      Res : constant C_Int := Is_New (Fld);
+   begin
+      if Res = Curses_False then
+         return False;
+      else
+         return True;
+      end if;
+   end Is_New_Page;
+
+   procedure Free (FA          : in out Field_Array_Access;
+                   Free_Fields : Boolean := False)
+   is
+      procedure Release is new Ada.Unchecked_Deallocation
+        (Field_Array, Field_Array_Access);
+   begin
+      if FA /= null and then Free_Fields then
+         for I in FA'First .. (FA'Last - 1) loop
+            if FA.all (I) /= Null_Field then
+               Delete (FA.all (I));
+            end if;
+         end loop;
+      end if;
+      Release (FA);
+   end Free;
+
+   --  |=====================================================================
+
+   function Default_Field_Options return Field_Option_Set
+   is
+   begin
+      return Get_Options (Null_Field);
+   end Default_Field_Options;
+
+   function Default_Form_Options return Form_Option_Set
+   is
+   begin
+      return Get_Options (Null_Form);
+   end Default_Form_Options;
+
+end Terminal_Interface.Curses.Forms;
diff --git a/Ada95/src/terminal_interface-curses-menus-item_user_data.adb b/Ada95/src/terminal_interface-curses-menus-item_user_data.adb
new file mode 100644
index 0000000..6374376
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-menus-item_user_data.adb
@@ -0,0 +1,72 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--               Terminal_Interface.Curses.Menus.Item_User_Data             --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2018,2020 Thomas E. Dickey                                     --
+-- Copyright 1999-2009,2014 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.16 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux;
+
+package body Terminal_Interface.Curses.Menus.Item_User_Data is
+
+   procedure Set_User_Data (Itm  : Item;
+                            Data : User_Access)
+   is
+      function Set_Item_Userptr (Itm  : Item;
+                                 Addr : User_Access)  return Eti_Error;
+      pragma Import (C, Set_Item_Userptr, "set_item_userptr");
+
+   begin
+      Eti_Exception (Set_Item_Userptr (Itm, Data));
+   end Set_User_Data;
+
+   function Get_User_Data (Itm  : Item) return User_Access
+   is
+      function Item_Userptr (Itm : Item) return User_Access;
+      pragma Import (C, Item_Userptr, "item_userptr");
+   begin
+      return Item_Userptr (Itm);
+   end Get_User_Data;
+
+   procedure Get_User_Data (Itm  : Item;
+                            Data : out User_Access)
+   is
+   begin
+      Data := Get_User_Data (Itm);
+   end Get_User_Data;
+
+end Terminal_Interface.Curses.Menus.Item_User_Data;
diff --git a/Ada95/src/terminal_interface-curses-menus-menu_user_data.adb b/Ada95/src/terminal_interface-curses-menus-menu_user_data.adb
new file mode 100644
index 0000000..7c3ccfa
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-menus-menu_user_data.adb
@@ -0,0 +1,73 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--               Terminal_Interface.Curses.Menus.Menu_User_Data             --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2018,2020 Thomas E. Dickey                                     --
+-- Copyright 1999-2009,2014 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.17 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux;
+
+package body Terminal_Interface.Curses.Menus.Menu_User_Data is
+
+   procedure Set_User_Data (Men  : Menu;
+                            Data : User_Access)
+   is
+      function Set_Menu_Userptr (Men  : Menu;
+                                 Data : User_Access)  return Eti_Error;
+      pragma Import (C, Set_Menu_Userptr, "set_menu_userptr");
+
+   begin
+      Eti_Exception (Set_Menu_Userptr (Men, Data));
+
+   end Set_User_Data;
+
+   function Get_User_Data (Men  : Menu) return User_Access
+   is
+      function Menu_Userptr (Men : Menu) return User_Access;
+      pragma Import (C, Menu_Userptr, "menu_userptr");
+   begin
+      return Menu_Userptr (Men);
+   end Get_User_Data;
+
+   procedure Get_User_Data (Men  : Menu;
+                            Data : out User_Access)
+   is
+   begin
+      Data := Get_User_Data (Men);
+   end Get_User_Data;
+
+end Terminal_Interface.Curses.Menus.Menu_User_Data;
diff --git a/Ada95/src/terminal_interface-curses-menus.adb b/Ada95/src/terminal_interface-curses-menus.adb
new file mode 100644
index 0000000..76f3e36
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-menus.adb
@@ -0,0 +1,904 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                      Terminal_Interface.Curses.Menus                     --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2018,2020 Thomas E. Dickey                                     --
+-- Copyright 1999-2011,2014 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.34 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Ada.Unchecked_Deallocation;
+with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux;
+
+with Interfaces.C; use Interfaces.C;
+with Interfaces.C.Strings; use Interfaces.C.Strings;
+with Interfaces.C.Pointers;
+
+package body Terminal_Interface.Curses.Menus is
+
+   type C_Item_Array is array (Natural range <>) of aliased Item;
+   package I_Array is new
+     Interfaces.C.Pointers (Natural, Item, C_Item_Array, Null_Item);
+
+   subtype chars_ptr is Interfaces.C.Strings.chars_ptr;
+
+------------------------------------------------------------------------------
+   procedure Request_Name (Key  : Menu_Request_Code;
+                           Name : out String)
+   is
+      function Request_Name (Key : C_Int) return chars_ptr;
+      pragma Import (C, Request_Name, "menu_request_name");
+   begin
+      Fill_String (Request_Name (C_Int (Key)), Name);
+   end Request_Name;
+
+   function Request_Name (Key : Menu_Request_Code) return String
+   is
+      function Request_Name (Key : C_Int) return chars_ptr;
+      pragma Import (C, Request_Name, "menu_request_name");
+   begin
+      return Fill_String (Request_Name (C_Int (Key)));
+   end Request_Name;
+
+   function Create (Name        : String;
+                    Description : String := "") return Item
+   is
+      type Char_Ptr is access all Interfaces.C.char;
+      function Newitem (Name, Desc : Char_Ptr) return Item;
+      pragma Import (C, Newitem, "new_item");
+
+      type Name_String is new char_array (0 .. Name'Length);
+      type Name_String_Ptr is access Name_String;
+      pragma Controlled (Name_String_Ptr);
+
+      type Desc_String is new char_array (0 .. Description'Length);
+      type Desc_String_Ptr is access Desc_String;
+      pragma Controlled (Desc_String_Ptr);
+
+      Name_Str : constant Name_String_Ptr := new Name_String;
+      Desc_Str : constant Desc_String_Ptr := new Desc_String;
+      Name_Len, Desc_Len : size_t;
+      Result : Item;
+   begin
+      To_C (Name, Name_Str.all, Name_Len);
+      To_C (Description, Desc_Str.all, Desc_Len);
+      Result := Newitem (Name_Str.all (Name_Str.all'First)'Access,
+                         Desc_Str.all (Desc_Str.all'First)'Access);
+      if Result = Null_Item then
+         raise Eti_System_Error;
+      end if;
+      return Result;
+   end Create;
+
+   procedure Delete (Itm : in out Item)
+   is
+      function Descname (Itm  : Item) return chars_ptr;
+      pragma Import (C, Descname, "item_description");
+      function Itemname (Itm  : Item) return chars_ptr;
+      pragma Import (C, Itemname, "item_name");
+
+      function Freeitem (Itm : Item) return Eti_Error;
+      pragma Import (C, Freeitem, "free_item");
+
+      Ptr : chars_ptr;
+   begin
+      Ptr := Descname (Itm);
+      if Ptr /= Null_Ptr then
+         Interfaces.C.Strings.Free (Ptr);
+      end if;
+      Ptr := Itemname (Itm);
+      if Ptr /= Null_Ptr then
+         Interfaces.C.Strings.Free (Ptr);
+      end if;
+      Eti_Exception (Freeitem (Itm));
+      Itm := Null_Item;
+   end Delete;
+-------------------------------------------------------------------------------
+   procedure Set_Value (Itm   : Item;
+                        Value : Boolean := True)
+   is
+      function Set_Item_Val (Itm : Item;
+                             Val : C_Int) return Eti_Error;
+      pragma Import (C, Set_Item_Val, "set_item_value");
+
+   begin
+      Eti_Exception (Set_Item_Val (Itm, Boolean'Pos (Value)));
+   end Set_Value;
+
+   function Value (Itm : Item) return Boolean
+   is
+      function Item_Val (Itm : Item) return C_Int;
+      pragma Import (C, Item_Val, "item_value");
+   begin
+      if Item_Val (Itm) = Curses_False then
+         return False;
+      else
+         return True;
+      end if;
+   end Value;
+
+-------------------------------------------------------------------------------
+   function Visible (Itm : Item) return Boolean
+   is
+      function Item_Vis (Itm : Item) return C_Int;
+      pragma Import (C, Item_Vis, "item_visible");
+   begin
+      if Item_Vis (Itm) = Curses_False then
+         return False;
+      else
+         return True;
+      end if;
+   end Visible;
+-------------------------------------------------------------------------------
+   procedure Set_Options (Itm     : Item;
+                          Options : Item_Option_Set)
+   is
+      function Set_Item_Opts (Itm : Item;
+                              Opt : Item_Option_Set) return Eti_Error;
+      pragma Import (C, Set_Item_Opts, "set_item_opts");
+
+   begin
+      Eti_Exception (Set_Item_Opts (Itm, Options));
+   end Set_Options;
+
+   procedure Switch_Options (Itm     : Item;
+                             Options : Item_Option_Set;
+                             On      : Boolean := True)
+   is
+      function Item_Opts_On (Itm : Item;
+                             Opt : Item_Option_Set) return Eti_Error;
+      pragma Import (C, Item_Opts_On, "item_opts_on");
+      function Item_Opts_Off (Itm : Item;
+                              Opt : Item_Option_Set) return Eti_Error;
+      pragma Import (C, Item_Opts_Off, "item_opts_off");
+
+   begin
+      if On then
+         Eti_Exception (Item_Opts_On (Itm, Options));
+      else
+         Eti_Exception (Item_Opts_Off (Itm, Options));
+      end if;
+   end Switch_Options;
+
+   procedure Get_Options (Itm     : Item;
+                          Options : out Item_Option_Set)
+   is
+      function Item_Opts (Itm : Item) return Item_Option_Set;
+      pragma Import (C, Item_Opts, "item_opts");
+
+   begin
+      Options := Item_Opts (Itm);
+   end Get_Options;
+
+   function Get_Options (Itm : Item := Null_Item) return Item_Option_Set
+   is
+      Ios : Item_Option_Set;
+   begin
+      Get_Options (Itm, Ios);
+      return Ios;
+   end Get_Options;
+-------------------------------------------------------------------------------
+   procedure Name (Itm  : Item;
+                   Name : out String)
+   is
+      function Itemname (Itm : Item) return chars_ptr;
+      pragma Import (C, Itemname, "item_name");
+   begin
+      Fill_String (Itemname (Itm), Name);
+   end Name;
+
+   function Name (Itm : Item) return String
+   is
+      function Itemname (Itm : Item) return chars_ptr;
+      pragma Import (C, Itemname, "item_name");
+   begin
+      return Fill_String (Itemname (Itm));
+   end Name;
+
+   procedure Description (Itm         : Item;
+                          Description : out String)
+   is
+      function Descname (Itm  : Item) return chars_ptr;
+      pragma Import (C, Descname, "item_description");
+   begin
+      Fill_String (Descname (Itm), Description);
+   end Description;
+
+   function Description (Itm : Item) return String
+   is
+      function Descname (Itm  : Item) return chars_ptr;
+      pragma Import (C, Descname, "item_description");
+   begin
+      return Fill_String (Descname (Itm));
+   end Description;
+-------------------------------------------------------------------------------
+   procedure Set_Current (Men : Menu;
+                          Itm : Item)
+   is
+      function Set_Curr_Item (Men : Menu;
+                              Itm : Item) return Eti_Error;
+      pragma Import (C, Set_Curr_Item, "set_current_item");
+
+   begin
+      Eti_Exception (Set_Curr_Item (Men, Itm));
+   end Set_Current;
+
+   function Current (Men : Menu) return Item
+   is
+      function Curr_Item (Men : Menu) return Item;
+      pragma Import (C, Curr_Item, "current_item");
+
+      Res : constant Item := Curr_Item (Men);
+   begin
+      if Res = Null_Item then
+         raise Menu_Exception;
+      end if;
+      return Res;
+   end Current;
+
+   procedure Set_Top_Row (Men  : Menu;
+                          Line : Line_Position)
+   is
+      function Set_Toprow (Men  : Menu;
+                           Line : C_Int) return Eti_Error;
+      pragma Import (C, Set_Toprow, "set_top_row");
+
+   begin
+      Eti_Exception (Set_Toprow (Men, C_Int (Line)));
+   end Set_Top_Row;
+
+   function Top_Row (Men : Menu) return Line_Position
+   is
+      function Toprow (Men : Menu) return C_Int;
+      pragma Import (C, Toprow, "top_row");
+
+      Res : constant C_Int := Toprow (Men);
+   begin
+      if Res = Curses_Err then
+         raise Menu_Exception;
+      end if;
+      return Line_Position (Res);
+   end Top_Row;
+
+   function Get_Index (Itm : Item) return Positive
+   is
+      function Get_Itemindex (Itm : Item) return C_Int;
+      pragma Import (C, Get_Itemindex, "item_index");
+
+      Res : constant C_Int := Get_Itemindex (Itm);
+   begin
+      if Res = Curses_Err then
+         raise Menu_Exception;
+      end if;
+      return Positive (Natural (Res) + Positive'First);
+   end Get_Index;
+-------------------------------------------------------------------------------
+   procedure Post (Men  : Menu;
+                   Post : Boolean := True)
+   is
+      function M_Post (Men : Menu) return Eti_Error;
+      pragma Import (C, M_Post, "post_menu");
+      function M_Unpost (Men : Menu) return Eti_Error;
+      pragma Import (C, M_Unpost, "unpost_menu");
+
+   begin
+      if Post then
+         Eti_Exception (M_Post (Men));
+      else
+         Eti_Exception (M_Unpost (Men));
+      end if;
+   end Post;
+-------------------------------------------------------------------------------
+   procedure Set_Options (Men     : Menu;
+                          Options : Menu_Option_Set)
+   is
+      function Set_Menu_Opts (Men : Menu;
+                              Opt : Menu_Option_Set) return Eti_Error;
+      pragma Import (C, Set_Menu_Opts, "set_menu_opts");
+
+   begin
+      Eti_Exception (Set_Menu_Opts (Men, Options));
+   end Set_Options;
+
+   procedure Switch_Options (Men     : Menu;
+                             Options : Menu_Option_Set;
+                             On      : Boolean := True)
+   is
+      function Menu_Opts_On (Men : Menu;
+                             Opt : Menu_Option_Set) return Eti_Error;
+      pragma Import (C, Menu_Opts_On, "menu_opts_on");
+      function Menu_Opts_Off (Men : Menu;
+                              Opt : Menu_Option_Set) return Eti_Error;
+      pragma Import (C, Menu_Opts_Off, "menu_opts_off");
+
+   begin
+      if On then
+         Eti_Exception (Menu_Opts_On  (Men, Options));
+      else
+         Eti_Exception (Menu_Opts_Off (Men, Options));
+      end if;
+   end Switch_Options;
+
+   procedure Get_Options (Men     : Menu;
+                          Options : out Menu_Option_Set)
+   is
+      function Menu_Opts (Men : Menu) return Menu_Option_Set;
+      pragma Import (C, Menu_Opts, "menu_opts");
+
+   begin
+      Options := Menu_Opts (Men);
+   end Get_Options;
+
+   function Get_Options (Men : Menu := Null_Menu) return Menu_Option_Set
+   is
+      Mos : Menu_Option_Set;
+   begin
+      Get_Options (Men, Mos);
+      return Mos;
+   end Get_Options;
+-------------------------------------------------------------------------------
+   procedure Set_Window (Men : Menu;
+                         Win : Window)
+   is
+      function Set_Menu_Win (Men : Menu;
+                             Win : Window) return Eti_Error;
+      pragma Import (C, Set_Menu_Win, "set_menu_win");
+
+   begin
+      Eti_Exception (Set_Menu_Win (Men, Win));
+   end Set_Window;
+
+   function Get_Window (Men : Menu) return Window
+   is
+      function Menu_Win (Men : Menu) return Window;
+      pragma Import (C, Menu_Win, "menu_win");
+
+      W : constant Window := Menu_Win (Men);
+   begin
+      return W;
+   end Get_Window;
+
+   procedure Set_Sub_Window (Men : Menu;
+                             Win : Window)
+   is
+      function Set_Menu_Sub (Men : Menu;
+                             Win : Window) return Eti_Error;
+      pragma Import (C, Set_Menu_Sub, "set_menu_sub");
+
+   begin
+      Eti_Exception (Set_Menu_Sub (Men, Win));
+   end Set_Sub_Window;
+
+   function Get_Sub_Window (Men : Menu) return Window
+   is
+      function Menu_Sub (Men : Menu) return Window;
+      pragma Import (C, Menu_Sub, "menu_sub");
+
+      W : constant Window := Menu_Sub (Men);
+   begin
+      return W;
+   end Get_Sub_Window;
+
+   procedure Scale (Men     : Menu;
+                    Lines   : out Line_Count;
+                    Columns : out Column_Count)
+   is
+      type C_Int_Access is access all C_Int;
+      function M_Scale (Men    : Menu;
+                        Yp, Xp : C_Int_Access) return Eti_Error;
+      pragma Import (C, M_Scale, "scale_menu");
+
+      X, Y : aliased C_Int;
+   begin
+      Eti_Exception (M_Scale (Men, Y'Access, X'Access));
+      Lines := Line_Count (Y);
+      Columns := Column_Count (X);
+   end Scale;
+-------------------------------------------------------------------------------
+   procedure Position_Cursor (Men : Menu)
+   is
+      function Pos_Menu_Cursor (Men : Menu) return Eti_Error;
+      pragma Import (C, Pos_Menu_Cursor, "pos_menu_cursor");
+
+   begin
+      Eti_Exception (Pos_Menu_Cursor (Men));
+   end Position_Cursor;
+
+-------------------------------------------------------------------------------
+   procedure Set_Mark (Men  : Menu;
+                       Mark : String)
+   is
+      type Char_Ptr is access all Interfaces.C.char;
+      function Set_Mark (Men  : Menu;
+                         Mark : Char_Ptr) return Eti_Error;
+      pragma Import (C, Set_Mark, "set_menu_mark");
+
+      Txt : char_array (0 .. Mark'Length);
+      Len : size_t;
+   begin
+      To_C (Mark, Txt, Len);
+      Eti_Exception (Set_Mark (Men, Txt (Txt'First)'Access));
+   end Set_Mark;
+
+   procedure Mark (Men  : Menu;
+                   Mark : out String)
+   is
+      function Get_Menu_Mark (Men : Menu) return chars_ptr;
+      pragma Import (C, Get_Menu_Mark, "menu_mark");
+   begin
+      Fill_String (Get_Menu_Mark (Men), Mark);
+   end Mark;
+
+   function Mark (Men : Menu) return String
+   is
+      function Get_Menu_Mark (Men : Menu) return chars_ptr;
+      pragma Import (C, Get_Menu_Mark, "menu_mark");
+   begin
+      return Fill_String (Get_Menu_Mark (Men));
+   end Mark;
+
+-------------------------------------------------------------------------------
+   procedure Set_Foreground
+     (Men   : Menu;
+      Fore  : Character_Attribute_Set := Normal_Video;
+      Color : Color_Pair := Color_Pair'First)
+   is
+      function Set_Menu_Fore (Men  : Menu;
+                              Attr : Attributed_Character) return Eti_Error;
+      pragma Import (C, Set_Menu_Fore, "set_menu_fore");
+
+      Ch : constant Attributed_Character := (Ch    => Character'First,
+                                             Color => Color,
+                                             Attr  => Fore);
+   begin
+      Eti_Exception (Set_Menu_Fore (Men, Ch));
+   end Set_Foreground;
+
+   procedure Foreground (Men  : Menu;
+                         Fore : out Character_Attribute_Set)
+   is
+      function Menu_Fore (Men : Menu) return Attributed_Character;
+      pragma Import (C, Menu_Fore, "menu_fore");
+   begin
+      Fore := Menu_Fore (Men).Attr;
+   end Foreground;
+
+   procedure Foreground (Men   : Menu;
+                         Fore  : out Character_Attribute_Set;
+                         Color : out Color_Pair)
+   is
+      function Menu_Fore (Men : Menu) return Attributed_Character;
+      pragma Import (C, Menu_Fore, "menu_fore");
+   begin
+      Fore  := Menu_Fore (Men).Attr;
+      Color := Menu_Fore (Men).Color;
+   end Foreground;
+
+   procedure Set_Background
+     (Men   : Menu;
+      Back  : Character_Attribute_Set := Normal_Video;
+      Color : Color_Pair := Color_Pair'First)
+   is
+      function Set_Menu_Back (Men  : Menu;
+                              Attr : Attributed_Character) return Eti_Error;
+      pragma Import (C, Set_Menu_Back, "set_menu_back");
+
+      Ch : constant Attributed_Character := (Ch    => Character'First,
+                                             Color => Color,
+                                             Attr  => Back);
+   begin
+      Eti_Exception (Set_Menu_Back (Men, Ch));
+   end Set_Background;
+
+   procedure Background (Men  : Menu;
+                         Back : out Character_Attribute_Set)
+   is
+      function Menu_Back (Men : Menu) return Attributed_Character;
+      pragma Import (C, Menu_Back, "menu_back");
+   begin
+      Back := Menu_Back (Men).Attr;
+   end Background;
+
+   procedure Background (Men   : Menu;
+                         Back  : out Character_Attribute_Set;
+                         Color : out Color_Pair)
+   is
+      function Menu_Back (Men : Menu) return Attributed_Character;
+      pragma Import (C, Menu_Back, "menu_back");
+   begin
+      Back  := Menu_Back (Men).Attr;
+      Color := Menu_Back (Men).Color;
+   end Background;
+
+   procedure Set_Grey (Men   : Menu;
+                       Grey  : Character_Attribute_Set := Normal_Video;
+                       Color : Color_Pair := Color_Pair'First)
+   is
+      function Set_Menu_Grey (Men  : Menu;
+                              Attr : Attributed_Character) return Eti_Error;
+      pragma Import (C, Set_Menu_Grey, "set_menu_grey");
+
+      Ch : constant Attributed_Character := (Ch    => Character'First,
+                                             Color => Color,
+                                             Attr  => Grey);
+
+   begin
+      Eti_Exception (Set_Menu_Grey (Men, Ch));
+   end Set_Grey;
+
+   procedure Grey (Men  : Menu;
+                   Grey : out Character_Attribute_Set)
+   is
+      function Menu_Grey (Men : Menu) return Attributed_Character;
+      pragma Import (C, Menu_Grey, "menu_grey");
+   begin
+      Grey := Menu_Grey (Men).Attr;
+   end Grey;
+
+   procedure Grey (Men  : Menu;
+                   Grey : out Character_Attribute_Set;
+                   Color : out Color_Pair)
+   is
+      function Menu_Grey (Men : Menu) return Attributed_Character;
+      pragma Import (C, Menu_Grey, "menu_grey");
+   begin
+      Grey  := Menu_Grey (Men).Attr;
+      Color := Menu_Grey (Men).Color;
+   end Grey;
+
+   procedure Set_Pad_Character (Men : Menu;
+                                Pad : Character := Space)
+   is
+      function Set_Menu_Pad (Men : Menu;
+                             Ch  : C_Int) return Eti_Error;
+      pragma Import (C, Set_Menu_Pad, "set_menu_pad");
+
+   begin
+      Eti_Exception (Set_Menu_Pad (Men, C_Int (Character'Pos (Pad))));
+   end Set_Pad_Character;
+
+   procedure Pad_Character (Men : Menu;
+                            Pad : out Character)
+   is
+      function Menu_Pad (Men : Menu) return C_Int;
+      pragma Import (C, Menu_Pad, "menu_pad");
+   begin
+      Pad := Character'Val (Menu_Pad (Men));
+   end Pad_Character;
+-------------------------------------------------------------------------------
+   procedure Set_Spacing (Men   : Menu;
+                          Descr : Column_Position := 0;
+                          Row   : Line_Position   := 0;
+                          Col   : Column_Position := 0)
+   is
+      function Set_Spacing (Men     : Menu;
+                            D, R, C : C_Int) return Eti_Error;
+      pragma Import (C, Set_Spacing, "set_menu_spacing");
+
+   begin
+      Eti_Exception (Set_Spacing (Men,
+                                  C_Int (Descr),
+                                  C_Int (Row),
+                                  C_Int (Col)));
+   end Set_Spacing;
+
+   procedure Spacing (Men   : Menu;
+                      Descr : out Column_Position;
+                      Row   : out Line_Position;
+                      Col   : out Column_Position)
+   is
+      type C_Int_Access is access all C_Int;
+      function Get_Spacing (Men     : Menu;
+                            D, R, C : C_Int_Access) return Eti_Error;
+      pragma Import (C, Get_Spacing, "menu_spacing");
+
+      D, R, C : aliased C_Int;
+   begin
+      Eti_Exception (Get_Spacing (Men,
+                                  D'Access,
+                                  R'Access,
+                                  C'Access));
+      Descr := Column_Position (D);
+      Row   := Line_Position (R);
+      Col   := Column_Position (C);
+   end Spacing;
+-------------------------------------------------------------------------------
+   function Set_Pattern (Men  : Menu;
+                         Text : String) return Boolean
+   is
+      type Char_Ptr is access all Interfaces.C.char;
+      function Set_Pattern (Men     : Menu;
+                            Pattern : Char_Ptr) return Eti_Error;
+      pragma Import (C, Set_Pattern, "set_menu_pattern");
+
+      S   : char_array (0 .. Text'Length);
+      L   : size_t;
+      Res : Eti_Error;
+   begin
+      To_C (Text, S, L);
+      Res := Set_Pattern (Men, S (S'First)'Access);
+      case Res is
+         when E_No_Match =>
+            return False;
+         when others =>
+            Eti_Exception (Res);
+            return True;
+      end case;
+   end Set_Pattern;
+
+   procedure Pattern (Men  : Menu;
+                      Text : out String)
+   is
+      function Get_Pattern (Men : Menu) return chars_ptr;
+      pragma Import (C, Get_Pattern, "menu_pattern");
+   begin
+      Fill_String (Get_Pattern (Men), Text);
+   end Pattern;
+-------------------------------------------------------------------------------
+   procedure Set_Format (Men     : Menu;
+                         Lines   : Line_Count;
+                         Columns : Column_Count)
+   is
+      function Set_Menu_Fmt (Men : Menu;
+                             Lin : C_Int;
+                             Col : C_Int) return Eti_Error;
+      pragma Import (C, Set_Menu_Fmt, "set_menu_format");
+
+   begin
+      Eti_Exception (Set_Menu_Fmt (Men,
+                                   C_Int (Lines),
+                                   C_Int (Columns)));
+
+   end Set_Format;
+
+   procedure Format (Men     : Menu;
+                     Lines   : out Line_Count;
+                     Columns : out Column_Count)
+   is
+      type C_Int_Access is access all C_Int;
+      function Menu_Fmt (Men  : Menu;
+                         Y, X : C_Int_Access) return Eti_Error;
+      pragma Import (C, Menu_Fmt, "menu_format");
+
+      L, C : aliased C_Int;
+   begin
+      Eti_Exception (Menu_Fmt (Men, L'Access, C'Access));
+      Lines   := Line_Count (L);
+      Columns := Column_Count (C);
+   end Format;
+-------------------------------------------------------------------------------
+   procedure Set_Item_Init_Hook (Men  : Menu;
+                                 Proc : Menu_Hook_Function)
+   is
+      function Set_Item_Init (Men  : Menu;
+                              Proc : Menu_Hook_Function) return Eti_Error;
+      pragma Import (C, Set_Item_Init, "set_item_init");
+
+   begin
+      Eti_Exception (Set_Item_Init (Men, Proc));
+   end Set_Item_Init_Hook;
+
+   procedure Set_Item_Term_Hook (Men  : Menu;
+                                 Proc : Menu_Hook_Function)
+   is
+      function Set_Item_Term (Men  : Menu;
+                              Proc : Menu_Hook_Function) return Eti_Error;
+      pragma Import (C, Set_Item_Term, "set_item_term");
+
+   begin
+      Eti_Exception (Set_Item_Term (Men, Proc));
+   end Set_Item_Term_Hook;
+
+   procedure Set_Menu_Init_Hook (Men  : Menu;
+                                 Proc : Menu_Hook_Function)
+   is
+      function Set_Menu_Init (Men  : Menu;
+                              Proc : Menu_Hook_Function) return Eti_Error;
+      pragma Import (C, Set_Menu_Init, "set_menu_init");
+
+   begin
+      Eti_Exception (Set_Menu_Init (Men, Proc));
+   end Set_Menu_Init_Hook;
+
+   procedure Set_Menu_Term_Hook (Men  : Menu;
+                                 Proc : Menu_Hook_Function)
+   is
+      function Set_Menu_Term (Men  : Menu;
+                              Proc : Menu_Hook_Function) return Eti_Error;
+      pragma Import (C, Set_Menu_Term, "set_menu_term");
+
+   begin
+      Eti_Exception (Set_Menu_Term (Men, Proc));
+   end Set_Menu_Term_Hook;
+
+   function Get_Item_Init_Hook (Men : Menu) return Menu_Hook_Function
+   is
+      function Item_Init (Men : Menu) return Menu_Hook_Function;
+      pragma Import (C, Item_Init, "item_init");
+   begin
+      return Item_Init (Men);
+   end Get_Item_Init_Hook;
+
+   function Get_Item_Term_Hook (Men : Menu) return Menu_Hook_Function
+   is
+      function Item_Term (Men : Menu) return Menu_Hook_Function;
+      pragma Import (C, Item_Term, "item_term");
+   begin
+      return Item_Term (Men);
+   end Get_Item_Term_Hook;
+
+   function Get_Menu_Init_Hook (Men : Menu) return Menu_Hook_Function
+   is
+      function Menu_Init (Men : Menu) return Menu_Hook_Function;
+      pragma Import (C, Menu_Init, "menu_init");
+   begin
+      return Menu_Init (Men);
+   end Get_Menu_Init_Hook;
+
+   function Get_Menu_Term_Hook (Men : Menu) return Menu_Hook_Function
+   is
+      function Menu_Term (Men : Menu) return Menu_Hook_Function;
+      pragma Import (C, Menu_Term, "menu_term");
+   begin
+      return Menu_Term (Men);
+   end Get_Menu_Term_Hook;
+-------------------------------------------------------------------------------
+   procedure Redefine (Men   : Menu;
+                       Items : Item_Array_Access)
+   is
+      function Set_Items (Men   : Menu;
+                          Items : System.Address) return Eti_Error;
+      pragma Import (C, Set_Items, "set_menu_items");
+
+   begin
+      pragma Assert (Items.all (Items'Last) = Null_Item);
+      if Items.all (Items'Last) /= Null_Item then
+         raise Menu_Exception;
+      else
+         Eti_Exception (Set_Items (Men, Items.all'Address));
+      end if;
+   end Redefine;
+
+   function Item_Count (Men : Menu) return Natural
+   is
+      function Count (Men : Menu) return C_Int;
+      pragma Import (C, Count, "item_count");
+   begin
+      return Natural (Count (Men));
+   end Item_Count;
+
+   function Items (Men   : Menu;
+                   Index : Positive) return Item
+   is
+      use I_Array;
+
+      function C_Mitems (Men : Menu) return Pointer;
+      pragma Import (C, C_Mitems, "menu_items");
+
+      P : Pointer := C_Mitems (Men);
+   begin
+      if P = null or else Index > Item_Count (Men) then
+         raise Menu_Exception;
+      else
+         P := P + ptrdiff_t (C_Int (Index) - 1);
+         return P.all;
+      end if;
+   end Items;
+
+-------------------------------------------------------------------------------
+   function Create (Items : Item_Array_Access) return Menu
+   is
+      function Newmenu (Items : System.Address) return Menu;
+      pragma Import (C, Newmenu, "new_menu");
+
+      M   : Menu;
+   begin
+      pragma Assert (Items.all (Items'Last) = Null_Item);
+      if Items.all (Items'Last) /= Null_Item then
+         raise Menu_Exception;
+      else
+         M := Newmenu (Items.all'Address);
+         if M = Null_Menu then
+            raise Menu_Exception;
+         end if;
+         return M;
+      end if;
+   end Create;
+
+   procedure Delete (Men : in out Menu)
+   is
+      function Free (Men : Menu) return Eti_Error;
+      pragma Import (C, Free, "free_menu");
+
+   begin
+      Eti_Exception (Free (Men));
+      Men := Null_Menu;
+   end Delete;
+
+------------------------------------------------------------------------------
+   function Driver (Men : Menu;
+                    Key : Key_Code) return Driver_Result
+   is
+      function Driver (Men : Menu;
+                       Key : C_Int) return Eti_Error;
+      pragma Import (C, Driver, "menu_driver");
+
+      R : constant Eti_Error := Driver (Men, C_Int (Key));
+   begin
+      case R is
+         when E_Unknown_Command =>
+            return Unknown_Request;
+         when E_No_Match =>
+            return No_Match;
+         when E_Request_Denied | E_Not_Selectable =>
+            return Request_Denied;
+         when others =>
+            Eti_Exception (R);
+            return Menu_Ok;
+      end case;
+   end Driver;
+
+   procedure Free (IA         : in out Item_Array_Access;
+                   Free_Items : Boolean := False)
+   is
+      procedure Release is new Ada.Unchecked_Deallocation
+        (Item_Array, Item_Array_Access);
+   begin
+      if IA /= null and then Free_Items then
+         for I in IA'First .. (IA'Last - 1) loop
+            if IA.all (I) /= Null_Item then
+               Delete (IA.all (I));
+            end if;
+         end loop;
+      end if;
+      Release (IA);
+   end Free;
+
+-------------------------------------------------------------------------------
+   function Default_Menu_Options return Menu_Option_Set
+   is
+   begin
+      return Get_Options (Null_Menu);
+   end Default_Menu_Options;
+
+   function Default_Item_Options return Item_Option_Set
+   is
+   begin
+      return Get_Options (Null_Item);
+   end Default_Item_Options;
+-------------------------------------------------------------------------------
+
+end Terminal_Interface.Curses.Menus;
diff --git a/Ada95/src/terminal_interface-curses-mouse.adb b/Ada95/src/terminal_interface-curses-mouse.adb
new file mode 100644
index 0000000..a8efd34
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-mouse.adb
@@ -0,0 +1,218 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                     Terminal_Interface.Curses.Mouse                      --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2018,2020 Thomas E. Dickey                                     --
+-- Copyright 1999-2009,2014 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.28 $
+--  $Date: 2020/06/27 18:50:44 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux;
+with Interfaces.C; use Interfaces.C;
+use Interfaces;
+
+package body Terminal_Interface.Curses.Mouse is
+
+   function Has_Mouse return Boolean
+   is
+      function Mouse_Avail return C_Int;
+      pragma Import (C, Mouse_Avail, "has_mouse");
+   begin
+      if Has_Key (Key_Mouse) or else Mouse_Avail /= 0 then
+         return True;
+      else
+         return False;
+      end if;
+   end Has_Mouse;
+
+   function Get_Mouse return Mouse_Event
+   is
+      type Event_Access is access all Mouse_Event;
+
+      function Getmouse (Ev : Event_Access) return C_Int;
+      pragma Import (C, Getmouse, "getmouse");
+
+      Event : aliased Mouse_Event;
+   begin
+      if Getmouse (Event'Access) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+      return Event;
+   end Get_Mouse;
+
+   procedure Register_Reportable_Event (Button : Mouse_Button;
+                                        State  : Button_State;
+                                        Mask   : in out Event_Mask)
+   is
+      Button_Nr : constant Natural := Mouse_Button'Pos (Button);
+      State_Nr  : constant Natural := Button_State'Pos (State);
+   begin
+      if Button in Modifier_Keys and then State /= Pressed then
+         raise Curses_Exception;
+      else
+         if Button in Real_Buttons then
+            Mask := Mask or ((2 ** (6 * Button_Nr)) ** State_Nr);
+         else
+            Mask := Mask or (BUTTON_CTRL ** (Button_Nr - 4));
+         end if;
+      end if;
+   end Register_Reportable_Event;
+
+   procedure Register_Reportable_Events (Button : Mouse_Button;
+                                         State  : Button_States;
+                                         Mask   : in out Event_Mask)
+   is
+   begin
+      for S in Button_States'Range loop
+         if State (S) then
+            Register_Reportable_Event (Button, S, Mask);
+         end if;
+      end loop;
+   end Register_Reportable_Events;
+
+   function Start_Mouse (Mask : Event_Mask := All_Events)
+                         return Event_Mask
+   is
+      function MMask (M : Event_Mask;
+                      O : access Event_Mask) return Event_Mask;
+      pragma Import (C, MMask, "mousemask");
+      R   : Event_Mask;
+      Old : aliased Event_Mask;
+   begin
+      R := MMask (Mask, Old'Access);
+      if R = No_Events then
+         Beep;
+      end if;
+      return Old;
+   end Start_Mouse;
+
+   procedure End_Mouse (Mask : Event_Mask := No_Events)
+   is
+   begin
+      if Mask /= No_Events then
+         Beep;
+      end if;
+   end End_Mouse;
+
+   procedure Dispatch_Event (Mask   : Event_Mask;
+                             Button : out Mouse_Button;
+                             State  : out Button_State);
+
+   procedure Dispatch_Event (Mask   : Event_Mask;
+                             Button : out Mouse_Button;
+                             State  : out Button_State) is
+      L : Event_Mask;
+   begin
+      Button := Alt;  --  preset to non real button;
+      if (Mask and BUTTON1_EVENTS) /= 0 then
+         Button := Left;
+      elsif (Mask and BUTTON2_EVENTS) /= 0 then
+         Button := Middle;
+      elsif (Mask and BUTTON3_EVENTS) /= 0 then
+         Button := Right;
+      elsif (Mask and BUTTON4_EVENTS) /= 0 then
+         Button := Button4;
+      end if;
+      if Button in Real_Buttons then
+         State := Released;  --  preset to non real button;
+         L := 2 ** (6 * Mouse_Button'Pos (Button));
+         for I in Button_State'Range loop
+            if (Mask and L) /= 0 then
+               State := I;
+               exit;
+            end if;
+            L := 2 * L;
+         end loop;
+      else
+         State := Pressed;
+         if (Mask and BUTTON_CTRL) /= 0 then
+            Button := Control;
+         elsif (Mask and BUTTON_SHIFT) /= 0 then
+            Button := Shift;
+         elsif (Mask and BUTTON_ALT) /= 0 then
+            Button := Alt;
+         end if;
+      end if;
+   end Dispatch_Event;
+
+   procedure Get_Event (Event  : Mouse_Event;
+                        Y      : out Line_Position;
+                        X      : out Column_Position;
+                        Button : out Mouse_Button;
+                        State  : out Button_State)
+   is
+      Mask  : constant Event_Mask := Event.Bstate;
+   begin
+      X := Column_Position (Event.X);
+      Y := Line_Position   (Event.Y);
+      Dispatch_Event (Mask, Button, State);
+   end Get_Event;
+
+   procedure Unget_Mouse (Event : Mouse_Event)
+   is
+      function Ungetmouse (Ev : Mouse_Event) return C_Int;
+      pragma Import (C, Ungetmouse, "ungetmouse");
+   begin
+      if Ungetmouse (Event) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Unget_Mouse;
+
+   function Enclosed_In_Window (Win    : Window := Standard_Window;
+                                Event  : Mouse_Event) return Boolean
+   is
+      function Wenclose (Win : Window; Y : C_Int; X : C_Int)
+                         return Curses_Bool;
+      pragma Import (C, Wenclose, "wenclose");
+   begin
+      if Wenclose (Win, C_Int (Event.Y), C_Int (Event.X))
+        = Curses_Bool_False
+      then
+         return False;
+      else
+         return True;
+      end if;
+   end Enclosed_In_Window;
+
+   function Mouse_Interval (Msec : Natural := 200) return Natural
+   is
+      function Mouseinterval (Msec : C_Int) return C_Int;
+      pragma Import (C, Mouseinterval, "mouseinterval");
+   begin
+      return Natural (Mouseinterval (C_Int (Msec)));
+   end Mouse_Interval;
+
+end Terminal_Interface.Curses.Mouse;
diff --git a/Ada95/src/terminal_interface-curses-panels-user_data.adb b/Ada95/src/terminal_interface-curses-panels-user_data.adb
new file mode 100644
index 0000000..504b07d
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-panels-user_data.adb
@@ -0,0 +1,79 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                 Terminal_Interface.Curses.Panels.User_Data               --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.13 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Interfaces.C;
+with Terminal_Interface.Curses.Aux;
+use  Terminal_Interface.Curses.Aux;
+with Terminal_Interface.Curses.Panels;
+use  Terminal_Interface.Curses.Panels;
+
+package body Terminal_Interface.Curses.Panels.User_Data is
+
+   use type Interfaces.C.int;
+
+   procedure Set_User_Data (Pan  : Panel;
+                            Data : User_Access)
+   is
+      function Set_Panel_Userptr (Pan  : Panel;
+                                  Addr : User_Access) return C_Int;
+      pragma Import (C, Set_Panel_Userptr, "set_panel_userptr");
+   begin
+      if Set_Panel_Userptr (Pan, Data) = Curses_Err then
+         raise Panel_Exception;
+      end if;
+   end Set_User_Data;
+
+   function Get_User_Data (Pan  : Panel) return User_Access
+   is
+      function Panel_Userptr (Pan : Panel) return User_Access;
+      pragma Import (C, Panel_Userptr, "panel_userptr");
+   begin
+      return Panel_Userptr (Pan);
+   end Get_User_Data;
+
+   procedure Get_User_Data (Pan  : Panel;
+                            Data : out User_Access)
+   is
+   begin
+      Data := Get_User_Data (Pan);
+   end Get_User_Data;
+
+end Terminal_Interface.Curses.Panels.User_Data;
diff --git a/Ada95/src/terminal_interface-curses-panels.adb b/Ada95/src/terminal_interface-curses-panels.adb
new file mode 100644
index 0000000..8602f32
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-panels.adb
@@ -0,0 +1,166 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                      Terminal_Interface.Curses.Panels                    --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2004,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.15 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux;
+with Interfaces.C;
+
+package body Terminal_Interface.Curses.Panels is
+
+   use type Interfaces.C.int;
+
+   function Create (Win : Window) return Panel
+   is
+      function Newpanel (Win : Window) return Panel;
+      pragma Import (C, Newpanel, "new_panel");
+
+      Pan : Panel;
+   begin
+      Pan := Newpanel (Win);
+      if Pan = Null_Panel then
+         raise Panel_Exception;
+      end if;
+      return Pan;
+   end Create;
+
+   procedure Bottom (Pan : Panel)
+   is
+      function Bottompanel (Pan : Panel) return C_Int;
+      pragma Import (C, Bottompanel, "bottom_panel");
+   begin
+      if Bottompanel (Pan) = Curses_Err then
+         raise Panel_Exception;
+      end if;
+   end Bottom;
+
+   procedure Top (Pan : Panel)
+   is
+      function Toppanel (Pan : Panel) return C_Int;
+      pragma Import (C, Toppanel, "top_panel");
+   begin
+      if Toppanel (Pan) = Curses_Err then
+         raise Panel_Exception;
+      end if;
+   end Top;
+
+   procedure Show (Pan : Panel)
+   is
+      function Showpanel (Pan : Panel) return C_Int;
+      pragma Import (C, Showpanel, "show_panel");
+   begin
+      if Showpanel (Pan) = Curses_Err then
+         raise Panel_Exception;
+      end if;
+   end Show;
+
+   procedure Hide (Pan : Panel)
+   is
+      function Hidepanel (Pan : Panel) return C_Int;
+      pragma Import (C, Hidepanel, "hide_panel");
+   begin
+      if Hidepanel (Pan) = Curses_Err then
+         raise Panel_Exception;
+      end if;
+   end Hide;
+
+   function Get_Window (Pan : Panel) return Window
+   is
+      function Panel_Win (Pan : Panel) return Window;
+      pragma Import (C, Panel_Win, "panel_window");
+
+      Win : constant Window := Panel_Win (Pan);
+   begin
+      if Win = Null_Window then
+         raise Panel_Exception;
+      end if;
+      return Win;
+   end Get_Window;
+
+   procedure Replace (Pan : Panel;
+                      Win : Window)
+   is
+      function Replace_Pan (Pan : Panel;
+                            Win : Window) return C_Int;
+      pragma Import (C, Replace_Pan, "replace_panel");
+   begin
+      if Replace_Pan (Pan, Win) = Curses_Err then
+         raise Panel_Exception;
+      end if;
+   end Replace;
+
+   procedure Move (Pan    : Panel;
+                   Line   : Line_Position;
+                   Column : Column_Position)
+   is
+      function Move (Pan    : Panel;
+                     Line   : C_Int;
+                     Column : C_Int) return C_Int;
+      pragma Import (C, Move, "move_panel");
+   begin
+      if Move (Pan, C_Int (Line), C_Int (Column)) = Curses_Err then
+         raise Panel_Exception;
+      end if;
+   end Move;
+
+   function Is_Hidden (Pan : Panel) return Boolean
+   is
+      function Panel_Hidden (Pan : Panel) return C_Int;
+      pragma Import (C, Panel_Hidden, "panel_hidden");
+   begin
+      if Panel_Hidden (Pan) = Curses_False then
+         return False;
+      else
+         return True;
+      end if;
+   end Is_Hidden;
+
+   procedure Delete (Pan : in out Panel)
+   is
+      function Del_Panel (Pan : Panel) return C_Int;
+      pragma Import (C, Del_Panel, "del_panel");
+   begin
+      if Del_Panel (Pan) = Curses_Err then
+         raise Panel_Exception;
+      end if;
+      Pan := Null_Panel;
+   end Delete;
+
+end Terminal_Interface.Curses.Panels;
diff --git a/Ada95/src/terminal_interface-curses-putwin.adb b/Ada95/src/terminal_interface-curses-putwin.adb
new file mode 100644
index 0000000..cbaeaf2
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-putwin.adb
@@ -0,0 +1,78 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                    Terminal_Interface.Curses.PutWin                      --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000-2002,2003 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.5 $
+--  Binding Version 01.00
+
+with Ada.Streams.Stream_IO.C_Streams;
+with Interfaces.C_Streams;
+with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux;
+
+package body Terminal_Interface.Curses.PutWin is
+
+   package ICS renames Interfaces.C_Streams;
+   package ACS renames Ada.Streams.Stream_IO.C_Streams;
+   use type C_Int;
+
+   procedure Put_Window (Win  : Window;
+                         File : Ada.Streams.Stream_IO.File_Type) is
+      function putwin (Win : Window; f : ICS.FILEs) return C_Int;
+      pragma Import (C, putwin, "putwin");
+
+      R : constant C_Int := putwin (Win, ACS.C_Stream (File));
+   begin
+      if R /= Curses_Ok then
+         raise Curses_Exception;
+      end if;
+   end Put_Window;
+
+   function Get_Window (File : Ada.Streams.Stream_IO.File_Type)
+                        return Window is
+      function getwin (f : ICS.FILEs) return Window;
+      pragma Import (C, getwin, "getwin");
+
+      W : constant Window := getwin (ACS.C_Stream (File));
+   begin
+      if W = Null_Window then
+         raise Curses_Exception;
+      else
+         return W;
+      end if;
+   end Get_Window;
+
+end Terminal_Interface.Curses.PutWin;
diff --git a/Ada95/src/terminal_interface-curses-putwin.ads b/Ada95/src/terminal_interface-curses-putwin.ads
new file mode 100644
index 0000000..df7b0d1
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-putwin.ads
@@ -0,0 +1,51 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                    Terminal_Interface.Curses.PutWin                      --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000-2002,2003 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.5 $
+--  Binding Version 01.00
+
+with Ada.Streams.Stream_IO;
+
+package Terminal_Interface.Curses.PutWin is
+
+   procedure Put_Window (Win  : Window;
+                         File : Ada.Streams.Stream_IO.File_Type);
+
+   function Get_Window (File  : Ada.Streams.Stream_IO.File_Type) return Window;
+
+end Terminal_Interface.Curses.PutWin;
diff --git a/Ada95/src/terminal_interface-curses-termcap.adb b/Ada95/src/terminal_interface-curses-termcap.adb
new file mode 100644
index 0000000..d09457c
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-termcap.adb
@@ -0,0 +1,164 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                    Terminal_Interface.Curses.Termcap                     --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000-2006,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.13 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+
+with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux;
+with Interfaces.C; use Interfaces.C;
+with Interfaces.C.Strings; use Interfaces.C.Strings;
+
+package body Terminal_Interface.Curses.Termcap is
+
+   function Get_Entry (Name : String) return Boolean
+   is
+      function tgetent (name : char_array; val : char_array)
+                        return C_Int;
+      pragma Import (C, tgetent, "tgetent");
+      NameTxt : char_array (0 .. Name'Length);
+      Length  : size_t;
+      ignored : constant char_array (0 .. 0) := (0 => nul);
+      result  : C_Int;
+   begin
+      To_C (Name, NameTxt, Length);
+      result := tgetent (char_array (ignored), NameTxt);
+      if result = -1 then
+         raise Curses_Exception;
+      else
+         return Boolean'Val (result);
+      end if;
+   end Get_Entry;
+
+------------------------------------------------------------------------------
+   function Get_Flag (Name : String) return Boolean
+   is
+      function tgetflag (id : char_array) return C_Int;
+      pragma Import (C, tgetflag, "tgetflag");
+      Txt    : char_array (0 .. Name'Length);
+      Length : size_t;
+   begin
+      To_C (Name, Txt, Length);
+      if tgetflag (Txt) = 0 then
+         return False;
+      else
+         return True;
+      end if;
+   end Get_Flag;
+
+------------------------------------------------------------------------------
+   procedure Get_Number (Name   : String;
+                         Value  : out Integer;
+                         Result : out Boolean)
+   is
+      function tgetnum (id : char_array) return C_Int;
+      pragma Import (C, tgetnum, "tgetnum");
+      Txt    : char_array (0 .. Name'Length);
+      Length : size_t;
+   begin
+      To_C (Name, Txt, Length);
+      Value := Integer (tgetnum (Txt));
+      if Value = -1 then
+         Result := False;
+      else
+         Result :=  True;
+      end if;
+   end Get_Number;
+
+------------------------------------------------------------------------------
+   procedure Get_String (Name   : String;
+                         Value  : out String;
+                         Result : out Boolean)
+   is
+      function tgetstr (id  : char_array;
+                        buf : char_array) return chars_ptr;
+      pragma Import (C, tgetstr, "tgetstr");
+      Txt    : char_array (0 .. Name'Length);
+      Length : size_t;
+      Txt2   : chars_ptr;
+      type t is new char_array (0 .. 1024); --  does it need to be 1024?
+      Return_Buffer : constant t := (others => nul);
+   begin
+      To_C (Name, Txt, Length);
+      Txt2 := tgetstr (Txt, char_array (Return_Buffer));
+      if Txt2 = Null_Ptr then
+         Result := False;
+      else
+         Value := Fill_String (Txt2);
+         Result := True;
+      end if;
+   end Get_String;
+
+   function Get_String (Name : String) return Boolean
+   is
+      function tgetstr (Id  : char_array;
+                        buf : char_array) return chars_ptr;
+      pragma Import (C, tgetstr, "tgetstr");
+      Txt    : char_array (0 .. Name'Length);
+      Length : size_t;
+      Txt2   : chars_ptr;
+      type t is new char_array (0 .. 1024); --  does it need to be 1024?
+      Phony_Txt : constant t := (others => nul);
+   begin
+      To_C (Name, Txt, Length);
+      Txt2 := tgetstr (Txt, char_array (Phony_Txt));
+      if Txt2 = Null_Ptr then
+         return False;
+      else
+         return True;
+      end if;
+   end Get_String;
+
+------------------------------------------------------------------------------
+   function TGoto (Cap : String;
+                   Col : Column_Position;
+                   Row : Line_Position) return Termcap_String is
+      function tgoto (cap : char_array;
+                      col : C_Int;
+                      row : C_Int) return chars_ptr;
+      pragma Import (C, tgoto);
+      Txt    : char_array (0 .. Cap'Length);
+      Length : size_t;
+   begin
+      To_C (Cap, Txt, Length);
+      return Termcap_String (Fill_String
+                             (tgoto (Txt, C_Int (Col), C_Int (Row))));
+   end TGoto;
+
+end Terminal_Interface.Curses.Termcap;
diff --git a/Ada95/src/terminal_interface-curses-termcap.ads b/Ada95/src/terminal_interface-curses-termcap.ads
new file mode 100644
index 0000000..1450cba
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-termcap.ads
@@ -0,0 +1,81 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                     Terminal_Interface.Curses.Termcap                    --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000-2002,2003 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.5 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+
+package Terminal_Interface.Curses.Termcap is
+   pragma Preelaborate (Terminal_Interface.Curses.Termcap);
+
+   --  |=====================================================================
+   --  | Man page curs_termcap.3x
+   --  |=====================================================================
+   --  Not implemented:  tputs (see curs_terminfo)
+
+   type Termcap_String is new String;
+
+   --  |
+   function TGoto (Cap : String;
+                   Col : Column_Position;
+                   Row : Line_Position) return Termcap_String;
+   --  AKA: tgoto()
+
+   --  |
+   function Get_Entry (Name : String) return Boolean;
+   --  AKA: tgetent()
+
+   --  |
+   function Get_Flag (Name : String) return Boolean;
+   --  AKA: tgetflag()
+
+   --  |
+   procedure Get_Number (Name   : String;
+                         Value  : out Integer;
+                         Result : out Boolean);
+   --  AKA: tgetnum()
+
+   --  |
+   procedure Get_String (Name   : String;
+                         Value  : out String;
+                         Result : out Boolean);
+   function Get_String (Name : String) return Boolean;
+   --  Returns True if the string is found.
+   --  AKA: tgetstr()
+
+end Terminal_Interface.Curses.Termcap;
diff --git a/Ada95/src/terminal_interface-curses-terminfo.adb b/Ada95/src/terminal_interface-curses-terminfo.adb
new file mode 100644
index 0000000..c15fa3d
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-terminfo.adb
@@ -0,0 +1,162 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                    Terminal_Interface.Curses.Terminfo                    --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000-2006,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.7 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+
+with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux;
+with Interfaces.C; use Interfaces.C;
+with Interfaces.C.Strings; use Interfaces.C.Strings;
+with Ada.Unchecked_Conversion;
+
+package body Terminal_Interface.Curses.Terminfo is
+
+   function Is_MinusOne_Pointer (P : chars_ptr) return Boolean;
+
+   function Is_MinusOne_Pointer (P : chars_ptr) return Boolean is
+      type Weird_Address is new System.Storage_Elements.Integer_Address;
+      Invalid_Pointer : constant Weird_Address := -1;
+      function To_Weird is new Ada.Unchecked_Conversion
+        (Source => chars_ptr, Target => Weird_Address);
+   begin
+      if To_Weird (P) = Invalid_Pointer then
+         return True;
+      else
+         return False;
+      end if;
+   end Is_MinusOne_Pointer;
+   pragma Inline (Is_MinusOne_Pointer);
+
+------------------------------------------------------------------------------
+   function Get_Flag (Name : String) return Boolean
+   is
+      function tigetflag (id : char_array) return Curses_Bool;
+      pragma Import (C, tigetflag);
+      Txt    : char_array (0 .. Name'Length);
+      Length : size_t;
+   begin
+      To_C (Name, Txt, Length);
+      if tigetflag (Txt) = Curses_Bool (Curses_True) then
+         return True;
+      else
+         return False;
+      end if;
+   end Get_Flag;
+
+------------------------------------------------------------------------------
+   procedure Get_String (Name   : String;
+                         Value  : out Terminfo_String;
+                         Result : out Boolean)
+   is
+      function tigetstr (id : char_array) return chars_ptr;
+      pragma Import (C, tigetstr, "tigetstr");
+      Txt    : char_array (0 .. Name'Length);
+      Length : size_t;
+      Txt2 : chars_ptr;
+   begin
+      To_C (Name, Txt, Length);
+      Txt2 := tigetstr (Txt);
+      if Txt2 = Null_Ptr then
+         Result := False;
+      elsif Is_MinusOne_Pointer (Txt2) then
+         raise Curses_Exception;
+      else
+         Value  := Terminfo_String (Fill_String (Txt2));
+         Result := True;
+      end if;
+   end Get_String;
+
+------------------------------------------------------------------------------
+   function Has_String (Name : String) return Boolean
+   is
+      function tigetstr (id : char_array) return chars_ptr;
+      pragma Import (C, tigetstr, "tigetstr");
+      Txt    : char_array (0 .. Name'Length);
+      Length : size_t;
+      Txt2 : chars_ptr;
+   begin
+      To_C (Name, Txt, Length);
+      Txt2 := tigetstr (Txt);
+      if Txt2 = Null_Ptr then
+         return False;
+      elsif Is_MinusOne_Pointer (Txt2) then
+         raise Curses_Exception;
+      else
+         return True;
+      end if;
+   end Has_String;
+
+------------------------------------------------------------------------------
+   function Get_Number (Name : String) return Integer is
+      function tigetstr (s : char_array) return C_Int;
+      pragma Import (C, tigetstr);
+      Txt    : char_array (0 .. Name'Length);
+      Length : size_t;
+   begin
+      To_C (Name, Txt, Length);
+      return Integer (tigetstr (Txt));
+   end Get_Number;
+
+------------------------------------------------------------------------------
+   procedure Put_String (Str    : Terminfo_String;
+                         affcnt : Natural := 1;
+                         putc   : putctype := null) is
+      function tputs (str    : char_array;
+                      affcnt : C_Int;
+                      putc   : putctype) return C_Int;
+      function putp (str : char_array) return C_Int;
+      pragma Import (C, tputs);
+      pragma Import (C, putp);
+      Txt    : char_array (0 .. Str'Length);
+      Length : size_t;
+      Err : C_Int;
+   begin
+      To_C (String (Str), Txt, Length);
+      if putc = null then
+         Err := putp (Txt);
+      else
+         Err := tputs (Txt, C_Int (affcnt), putc);
+      end if;
+      if Err = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Put_String;
+
+end Terminal_Interface.Curses.Terminfo;
diff --git a/Ada95/src/terminal_interface-curses-terminfo.ads b/Ada95/src/terminal_interface-curses-terminfo.ads
new file mode 100644
index 0000000..efde241
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-terminfo.ads
@@ -0,0 +1,82 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                     Terminal_Interface.Curses.Terminfo                   --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000-2002,2003 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.5 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+
+with Interfaces.C;
+
+package Terminal_Interface.Curses.Terminfo is
+   pragma Preelaborate (Terminal_Interface.Curses.Terminfo);
+
+   --  |=====================================================================
+   --  | Man page curs_terminfo.3x
+   --  |=====================================================================
+   --  Not implemented:  setupterm, setterm, set_curterm, del_curterm,
+   --                    restartterm, tparm, putp, vidputs,  vidattr,
+   --                    mvcur
+
+   type Terminfo_String is new String;
+
+   --  |
+   procedure Get_String (Name   : String;
+                         Value  : out Terminfo_String;
+                         Result : out Boolean);
+   function Has_String (Name : String) return Boolean;
+   --  AKA: tigetstr()
+
+   --  |
+   function Get_Flag (Name : String) return Boolean;
+   --  AKA: tigetflag()
+
+   --  |
+   function Get_Number (Name : String) return Integer;
+   --  AKA: tigetnum()
+
+   type putctype is access function (c : Interfaces.C.int)
+                                    return Interfaces.C.int;
+   pragma Convention (C, putctype);
+
+   --  |
+   procedure Put_String (Str    : Terminfo_String;
+                         affcnt : Natural := 1;
+                         putc   : putctype := null);
+   --  AKA: tputs()
+
+end Terminal_Interface.Curses.Terminfo;
diff --git a/Ada95/src/terminal_interface-curses-text_io-aux.adb b/Ada95/src/terminal_interface-curses-text_io-aux.adb
new file mode 100644
index 0000000..91307b7
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-text_io-aux.adb
@@ -0,0 +1,129 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                   Terminal_Interface.Curses.Text_IO.Aux                  --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2006,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.14 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+package body Terminal_Interface.Curses.Text_IO.Aux is
+
+   procedure Put_Buf
+     (Win    : Window;
+      Buf    : String;
+      Width  : Field;
+      Signal : Boolean := True;
+      Ljust  : Boolean := False)
+   is
+      L   : Field;
+      Len : Field;
+      W   : Field := Width;
+      LC  : Line_Count;
+      CC  : Column_Count;
+      Y   : Line_Position;
+      X   : Column_Position;
+
+      procedure Output (From, To : Field);
+
+      procedure Output (From, To : Field)
+      is
+      begin
+         if Len > 0 then
+            if W = 0 then
+               W := Len;
+            end if;
+            if Len > W then
+               --  LRM A10.6 (7) says this
+               W := Len;
+            end if;
+
+            pragma Assert (Len <= W);
+            Get_Size (Win, LC, CC);
+            if Column_Count (Len) > CC then
+               if Signal then
+                  raise Layout_Error;
+               else
+                  return;
+               end if;
+            else
+               if Len < W and then not Ljust then
+                  declare
+                     Filler : constant String (1 .. (W - Len))
+                       := (others => ' ');
+                  begin
+                     Put (Win, Filler);
+                  end;
+               end if;
+               Get_Cursor_Position (Win, Y, X);
+               if (X + Column_Position (Len)) > CC then
+                  New_Line (Win);
+               end if;
+               Put (Win, Buf (From .. To));
+               if Len < W and then Ljust then
+                  declare
+                     Filler : constant String (1 .. (W - Len))
+                       := (others => ' ');
+                  begin
+                     Put (Win, Filler);
+                  end;
+               end if;
+            end if;
+         end if;
+      end Output;
+
+   begin
+      pragma Assert (Win /= Null_Window);
+      if Ljust then
+         L := 1;
+         for I in 1 .. Buf'Length loop
+            exit when Buf (L) = ' ';
+            L := L + 1;
+         end loop;
+         Len := L - 1;
+         Output (1, Len);
+      else  -- input buffer is not left justified
+         L := Buf'Length;
+         for I in 1 .. Buf'Length loop
+            exit when Buf (L) = ' ';
+            L := L - 1;
+         end loop;
+         Len := Buf'Length - L;
+         Output (L + 1, Buf'Length);
+      end if;
+   end Put_Buf;
+
+end Terminal_Interface.Curses.Text_IO.Aux;
diff --git a/Ada95/src/terminal_interface-curses-text_io-aux.ads b/Ada95/src/terminal_interface-curses-text_io-aux.ads
new file mode 100644
index 0000000..946e415
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-text_io-aux.ads
@@ -0,0 +1,56 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                   Terminal_Interface.Curses.Text_IO.Aux                  --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2006,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.15 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+private package Terminal_Interface.Curses.Text_IO.Aux is
+   --  pragma Preelaborate (Aux);
+
+   --  This routine is called from the Text_IO output routines for numeric
+   --  and enumeration types.
+   --
+   procedure Put_Buf
+     (Win    : Window;               -- The output window
+      Buf    : String;               -- The buffer containing the text
+      Width  : Field;                -- The width of the output field
+      Signal : Boolean := True;      -- If true, we raise Layout_Error
+      Ljust  : Boolean := False);    -- The Buf is left justified
+
+end Terminal_Interface.Curses.Text_IO.Aux;
diff --git a/Ada95/src/terminal_interface-curses-text_io-complex_io.adb b/Ada95/src/terminal_interface-curses-text_io-complex_io.adb
new file mode 100644
index 0000000..e05571d
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-text_io-complex_io.adb
@@ -0,0 +1,74 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--               Terminal_Interface.Curses.Text_IO.Complex_IO               --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.12 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Terminal_Interface.Curses.Text_IO.Float_IO;
+
+package body Terminal_Interface.Curses.Text_IO.Complex_IO is
+
+   package FIO is new
+     Terminal_Interface.Curses.Text_IO.Float_IO (Complex_Types.Real'Base);
+
+   procedure Put
+     (Win  : Window;
+      Item : Complex;
+      Fore : Field := Default_Fore;
+      Aft  : Field := Default_Aft;
+      Exp  : Field := Default_Exp)
+   is
+   begin
+      Put (Win, '(');
+      FIO.Put (Win, Item.Re, Fore, Aft, Exp);
+      Put (Win, ',');
+      FIO.Put (Win, Item.Im, Fore, Aft, Exp);
+      Put (Win, ')');
+   end Put;
+
+   procedure Put
+     (Item : Complex;
+      Fore : Field := Default_Fore;
+      Aft  : Field := Default_Aft;
+      Exp  : Field := Default_Exp)
+   is
+   begin
+      Put (Get_Window, Item, Fore, Aft, Exp);
+   end Put;
+
+end Terminal_Interface.Curses.Text_IO.Complex_IO;
diff --git a/Ada95/src/terminal_interface-curses-text_io-complex_io.ads b/Ada95/src/terminal_interface-curses-text_io-complex_io.ads
new file mode 100644
index 0000000..f70cd81
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-text_io-complex_io.ads
@@ -0,0 +1,71 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--               Terminal_Interface.Curses.Text_IO.Complex_IO               --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.12 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Ada.Numerics.Generic_Complex_Types;
+
+generic
+   with package Complex_Types is new Ada.Numerics.Generic_Complex_Types (<>);
+
+package Terminal_Interface.Curses.Text_IO.Complex_IO is
+
+   use Complex_Types;
+
+   Default_Fore : Field := 2;
+   Default_Aft  : Field := Real'Digits - 1;
+   Default_Exp  : Field := 3;
+
+   procedure Put
+     (Win  : Window;
+      Item : Complex;
+      Fore : Field := Default_Fore;
+      Aft  : Field := Default_Aft;
+      Exp  : Field := Default_Exp);
+
+   procedure Put
+     (Item : Complex;
+      Fore : Field := Default_Fore;
+      Aft  : Field := Default_Aft;
+      Exp  : Field := Default_Exp);
+
+private
+   pragma Inline (Put);
+
+end Terminal_Interface.Curses.Text_IO.Complex_IO;
diff --git a/Ada95/src/terminal_interface-curses-text_io-decimal_io.adb b/Ada95/src/terminal_interface-curses-text_io-decimal_io.adb
new file mode 100644
index 0000000..a8bea13
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-text_io-decimal_io.adb
@@ -0,0 +1,76 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--               Terminal_Interface.Curses.Text_IO.Decimal_IO               --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.12 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Ada.Text_IO;
+with Terminal_Interface.Curses.Text_IO.Aux;
+
+package body Terminal_Interface.Curses.Text_IO.Decimal_IO is
+
+   package Aux renames Terminal_Interface.Curses.Text_IO.Aux;
+   package DIO is new Ada.Text_IO.Decimal_IO (Num);
+
+   procedure Put
+     (Win  : Window;
+      Item : Num;
+      Fore : Field := Default_Fore;
+      Aft  : Field := Default_Aft;
+      Exp  : Field := Default_Exp)
+   is
+      Buf : String (1 .. Field'Last);
+      Len : Field := Fore + 1 + Aft;
+   begin
+      if Exp > 0 then
+         Len := Len + 1 + Exp;
+      end if;
+      DIO.Put (Buf, Item, Aft, Exp);
+      Aux.Put_Buf (Win, Buf, Len, False);
+   end Put;
+
+   procedure Put
+     (Item : Num;
+      Fore : Field := Default_Fore;
+      Aft  : Field := Default_Aft;
+      Exp  : Field := Default_Exp) is
+   begin
+      Put (Get_Window, Item, Fore, Aft, Exp);
+   end Put;
+
+end Terminal_Interface.Curses.Text_IO.Decimal_IO;
diff --git a/Ada95/src/terminal_interface-curses-text_io-decimal_io.ads b/Ada95/src/terminal_interface-curses-text_io-decimal_io.ads
new file mode 100644
index 0000000..7678ee0
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-text_io-decimal_io.ads
@@ -0,0 +1,67 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--               Terminal_Interface.Curses.Text_IO.Decimal_IO               --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.13 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+generic
+   type Num is delta <> digits <>;
+
+package Terminal_Interface.Curses.Text_IO.Decimal_IO is
+
+   Default_Fore : Field := Num'Fore;
+   Default_Aft  : Field := Num'Aft;
+   Default_Exp  : Field := 0;
+
+   procedure Put
+     (Win  : Window;
+      Item : Num;
+      Fore : Field := Default_Fore;
+      Aft  : Field := Default_Aft;
+      Exp  : Field := Default_Exp);
+
+   procedure Put
+     (Item : Num;
+      Fore : Field := Default_Fore;
+      Aft  : Field := Default_Aft;
+      Exp  : Field := Default_Exp);
+
+private
+   pragma Inline (Put);
+
+end Terminal_Interface.Curses.Text_IO.Decimal_IO;
diff --git a/Ada95/src/terminal_interface-curses-text_io-enumeration_io.adb b/Ada95/src/terminal_interface-curses-text_io-enumeration_io.adb
new file mode 100644
index 0000000..b1d53b1
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-text_io-enumeration_io.adb
@@ -0,0 +1,81 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--             Terminal_Interface.Curses.Text_IO.Enumeration_IO             --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.12 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Ada.Text_IO;
+with Ada.Characters.Handling; use Ada.Characters.Handling;
+with Terminal_Interface.Curses.Text_IO.Aux;
+
+package body Terminal_Interface.Curses.Text_IO.Enumeration_IO is
+
+   package Aux renames Terminal_Interface.Curses.Text_IO.Aux;
+   package EIO is new Ada.Text_IO.Enumeration_IO (Enum);
+
+   procedure Put
+     (Win   : Window;
+      Item  : Enum;
+      Width : Field := Default_Width;
+      Set   : Type_Set := Default_Setting)
+   is
+      Buf  : String (1 .. Field'Last);
+      Tset : Ada.Text_IO.Type_Set;
+   begin
+      if Set /= Mixed_Case then
+         Tset := Ada.Text_IO.Type_Set'Val (Type_Set'Pos (Set));
+      else
+         Tset := Ada.Text_IO.Lower_Case;
+      end if;
+      EIO.Put (Buf, Item, Tset);
+      if Set = Mixed_Case then
+         Buf (Buf'First) := To_Upper (Buf (Buf'First));
+      end if;
+      Aux.Put_Buf (Win, Buf, Width, True, True);
+   end Put;
+
+   procedure Put
+     (Item  : Enum;
+      Width : Field := Default_Width;
+      Set   : Type_Set := Default_Setting)
+   is
+   begin
+      Put (Get_Window, Item, Width, Set);
+   end Put;
+
+end Terminal_Interface.Curses.Text_IO.Enumeration_IO;
diff --git a/Ada95/src/terminal_interface-curses-text_io-enumeration_io.ads b/Ada95/src/terminal_interface-curses-text_io-enumeration_io.ads
new file mode 100644
index 0000000..11aa198
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-text_io-enumeration_io.ads
@@ -0,0 +1,64 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--             Terminal_Interface.Curses.Text_IO.Enumeration_IO             --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.13 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+generic
+   type Enum is (<>);
+
+package Terminal_Interface.Curses.Text_IO.Enumeration_IO is
+
+   Default_Width : Field := 0;
+   Default_Setting : Type_Set := Mixed_Case;
+
+   procedure Put
+     (Win   : Window;
+      Item  : Enum;
+      Width : Field := Default_Width;
+      Set   : Type_Set := Default_Setting);
+
+   procedure Put
+     (Item  : Enum;
+      Width : Field := Default_Width;
+      Set   : Type_Set := Default_Setting);
+
+private
+   pragma Inline (Put);
+
+end Terminal_Interface.Curses.Text_IO.Enumeration_IO;
diff --git a/Ada95/src/terminal_interface-curses-text_io-fixed_io.adb b/Ada95/src/terminal_interface-curses-text_io-fixed_io.adb
new file mode 100644
index 0000000..79474d2
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-text_io-fixed_io.adb
@@ -0,0 +1,76 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                Terminal_Interface.Curses.Text_IO.Fixed_IO                --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.12 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Ada.Text_IO;
+with Terminal_Interface.Curses.Text_IO.Aux;
+
+package body Terminal_Interface.Curses.Text_IO.Fixed_IO is
+
+   package Aux renames Terminal_Interface.Curses.Text_IO.Aux;
+   package FIXIO is new Ada.Text_IO.Fixed_IO (Num);
+
+   procedure Put
+     (Win  : Window;
+      Item : Num;
+      Fore : Field := Default_Fore;
+      Aft  : Field := Default_Aft;
+      Exp  : Field := Default_Exp)
+   is
+      Buf : String (1 .. Field'Last);
+      Len : Field := Fore + 1 + Aft;
+   begin
+      if Exp > 0 then
+         Len := Len + 1 + Exp;
+      end if;
+      FIXIO.Put (Buf, Item, Aft, Exp);
+      Aux.Put_Buf (Win, Buf, Len, False);
+   end Put;
+
+   procedure Put
+     (Item : Num;
+      Fore : Field := Default_Fore;
+      Aft  : Field := Default_Aft;
+      Exp  : Field := Default_Exp) is
+   begin
+      Put (Get_Window, Item, Fore, Aft, Exp);
+   end Put;
+
+end Terminal_Interface.Curses.Text_IO.Fixed_IO;
diff --git a/Ada95/src/terminal_interface-curses-text_io-fixed_io.ads b/Ada95/src/terminal_interface-curses-text_io-fixed_io.ads
new file mode 100644
index 0000000..8205581
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-text_io-fixed_io.ads
@@ -0,0 +1,67 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                Terminal_Interface.Curses.Text_IO.Fixed_IO                --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.13 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+generic
+   type Num is delta <>;
+
+package Terminal_Interface.Curses.Text_IO.Fixed_IO is
+
+   Default_Fore : Field := Num'Fore;
+   Default_Aft  : Field := Num'Aft;
+   Default_Exp  : Field := 0;
+
+   procedure Put
+     (Win  : Window;
+      Item : Num;
+      Fore : Field := Default_Fore;
+      Aft  : Field := Default_Aft;
+      Exp  : Field := Default_Exp);
+
+   procedure Put
+     (Item : Num;
+      Fore : Field := Default_Fore;
+      Aft  : Field := Default_Aft;
+      Exp  : Field := Default_Exp);
+
+private
+   pragma Inline (Put);
+
+end Terminal_Interface.Curses.Text_IO.Fixed_IO;
diff --git a/Ada95/src/terminal_interface-curses-text_io-float_io.adb b/Ada95/src/terminal_interface-curses-text_io-float_io.adb
new file mode 100644
index 0000000..a9aa156
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-text_io-float_io.adb
@@ -0,0 +1,77 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                Terminal_Interface.Curses.Text_IO.Float_IO                --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.12 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Ada.Text_IO;
+with Terminal_Interface.Curses.Text_IO.Aux;
+
+package body Terminal_Interface.Curses.Text_IO.Float_IO is
+
+   package Aux renames Terminal_Interface.Curses.Text_IO.Aux;
+   package FIO is new Ada.Text_IO.Float_IO (Num);
+
+   procedure Put
+     (Win  : Window;
+      Item : Num;
+      Fore : Field := Default_Fore;
+      Aft  : Field := Default_Aft;
+      Exp  : Field := Default_Exp)
+   is
+      Buf : String (1 .. Field'Last);
+      Len : Field := Fore + 1 + Aft;
+   begin
+      if Exp > 0 then
+         Len := Len + 1 + Exp;
+      end if;
+      FIO.Put (Buf, Item, Aft, Exp);
+      Aux.Put_Buf (Win, Buf, Len, False);
+   end Put;
+
+   procedure Put
+     (Item : Num;
+      Fore : Field := Default_Fore;
+      Aft  : Field := Default_Aft;
+      Exp  : Field := Default_Exp)
+   is
+   begin
+      Put (Get_Window, Item, Fore, Aft, Exp);
+   end Put;
+
+end Terminal_Interface.Curses.Text_IO.Float_IO;
diff --git a/Ada95/src/terminal_interface-curses-text_io-float_io.ads b/Ada95/src/terminal_interface-curses-text_io-float_io.ads
new file mode 100644
index 0000000..9797bcf
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-text_io-float_io.ads
@@ -0,0 +1,67 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                Terminal_Interface.Curses.Text_IO.Float_IO                --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.13 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+generic
+   type Num is digits <>;
+
+package Terminal_Interface.Curses.Text_IO.Float_IO is
+
+   Default_Fore : Field := 2;
+   Default_Aft  : Field := Num'Digits - 1;
+   Default_Exp  : Field := 3;
+
+   procedure Put
+     (Win  : Window;
+      Item : Num;
+      Fore : Field := Default_Fore;
+      Aft  : Field := Default_Aft;
+      Exp  : Field := Default_Exp);
+
+   procedure Put
+     (Item : Num;
+      Fore : Field := Default_Fore;
+      Aft  : Field := Default_Aft;
+      Exp  : Field := Default_Exp);
+
+private
+   pragma Inline (Put);
+
+end Terminal_Interface.Curses.Text_IO.Float_IO;
diff --git a/Ada95/src/terminal_interface-curses-text_io-integer_io.adb b/Ada95/src/terminal_interface-curses-text_io-integer_io.adb
new file mode 100644
index 0000000..0161151
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-text_io-integer_io.adb
@@ -0,0 +1,71 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--               Terminal_Interface.Curses.Text_IO.Integer_IO               --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.12 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Ada.Text_IO;
+with Terminal_Interface.Curses.Text_IO.Aux;
+
+package body Terminal_Interface.Curses.Text_IO.Integer_IO is
+
+   package Aux renames Terminal_Interface.Curses.Text_IO.Aux;
+   package IIO is new Ada.Text_IO.Integer_IO (Num);
+
+   procedure Put
+     (Win   : Window;
+      Item  : Num;
+      Width : Field := Default_Width;
+      Base  : Number_Base := Default_Base)
+   is
+      Buf : String (1 .. Field'Last);
+   begin
+      IIO.Put (Buf, Item, Base);
+      Aux.Put_Buf (Win, Buf, Width);
+   end Put;
+
+   procedure Put
+     (Item  : Num;
+      Width : Field := Default_Width;
+      Base  : Number_Base := Default_Base)
+   is
+   begin
+      Put (Get_Window, Item, Width, Base);
+   end Put;
+
+end Terminal_Interface.Curses.Text_IO.Integer_IO;
diff --git a/Ada95/src/terminal_interface-curses-text_io-integer_io.ads b/Ada95/src/terminal_interface-curses-text_io-integer_io.ads
new file mode 100644
index 0000000..4ef79d8
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-text_io-integer_io.ads
@@ -0,0 +1,64 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--               Terminal_Interface.Curses.Text_IO.Integer_IO               --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.13 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+generic
+   type Num is range <>;
+
+package Terminal_Interface.Curses.Text_IO.Integer_IO is
+
+   Default_Width : Field := Num'Width;
+   Default_Base  : Number_Base := 10;
+
+   procedure Put
+     (Win   : Window;
+      Item  : Num;
+      Width : Field := Default_Width;
+      Base  : Number_Base := Default_Base);
+
+   procedure Put
+     (Item  : Num;
+      Width : Field := Default_Width;
+      Base  : Number_Base := Default_Base);
+
+private
+   pragma Inline (Put);
+
+end Terminal_Interface.Curses.Text_IO.Integer_IO;
diff --git a/Ada95/src/terminal_interface-curses-text_io-modular_io.adb b/Ada95/src/terminal_interface-curses-text_io-modular_io.adb
new file mode 100644
index 0000000..85c6db4
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-text_io-modular_io.adb
@@ -0,0 +1,71 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--               Terminal_Interface.Curses.Text_IO.Modular_IO               --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.12 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Ada.Text_IO;
+with Terminal_Interface.Curses.Text_IO.Aux;
+
+package body Terminal_Interface.Curses.Text_IO.Modular_IO is
+
+   package Aux renames Terminal_Interface.Curses.Text_IO.Aux;
+   package MIO is new Ada.Text_IO.Modular_IO (Num);
+
+   procedure Put
+     (Win   : Window;
+      Item  : Num;
+      Width : Field := Default_Width;
+      Base  : Number_Base := Default_Base)
+   is
+      Buf : String (1 .. Field'Last);
+   begin
+      MIO.Put (Buf, Item, Base);
+      Aux.Put_Buf (Win, Buf, Width);
+   end Put;
+
+   procedure Put
+     (Item  : Num;
+      Width : Field := Default_Width;
+      Base  : Number_Base := Default_Base)
+   is
+   begin
+      Put (Get_Window, Item, Width, Base);
+   end Put;
+
+end Terminal_Interface.Curses.Text_IO.Modular_IO;
diff --git a/Ada95/src/terminal_interface-curses-text_io-modular_io.ads b/Ada95/src/terminal_interface-curses-text_io-modular_io.ads
new file mode 100644
index 0000000..d876447
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-text_io-modular_io.ads
@@ -0,0 +1,64 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--               Terminal_Interface.Curses.Text_IO.Modular_IO               --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.13 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+generic
+   type Num is mod <>;
+
+package Terminal_Interface.Curses.Text_IO.Modular_IO is
+
+   Default_Width : Field := Num'Width;
+   Default_Base  : Number_Base := 10;
+
+   procedure Put
+     (Win   : Window;
+      Item  : Num;
+      Width : Field := Default_Width;
+      Base  : Number_Base := Default_Base);
+
+   procedure Put
+     (Item  : Num;
+      Width : Field := Default_Width;
+      Base  : Number_Base := Default_Base);
+
+private
+   pragma Inline (Put);
+
+end Terminal_Interface.Curses.Text_IO.Modular_IO;
diff --git a/Ada95/src/terminal_interface-curses-text_io.adb b/Ada95/src/terminal_interface-curses-text_io.adb
new file mode 100644
index 0000000..c7238e2
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-text_io.adb
@@ -0,0 +1,339 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                     Terminal_Interface.Curses.Text_IO                    --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2011,2014 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.23 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+package body Terminal_Interface.Curses.Text_IO is
+
+   Default_Window : Window := Null_Window;
+
+   procedure Set_Window (Win : Window)
+   is
+   begin
+      Default_Window := Win;
+   end Set_Window;
+
+   function Get_Window return Window
+   is
+   begin
+      if Default_Window = Null_Window then
+         return Standard_Window;
+      else
+         return Default_Window;
+      end if;
+   end Get_Window;
+   pragma Inline (Get_Window);
+
+   procedure Flush (Win : Window)
+   is
+   begin
+      Refresh (Win);
+   end Flush;
+
+   procedure Flush
+   is
+   begin
+      Flush (Get_Window);
+   end Flush;
+
+   --------------------------------------------
+   -- Specification of line and page lengths --
+   --------------------------------------------
+
+   --  There are no set routines in this package. I assume, that you allocate
+   --  the window with an appropriate size.
+   --  A scroll-window is interpreted as an page with unbounded page length,
+   --  i.e. it returns the conventional 0 as page length.
+
+   function Line_Length (Win : Window) return Count
+   is
+      N_Lines : Line_Count;
+      N_Cols  : Column_Count;
+   begin
+      Get_Size (Win, N_Lines, N_Cols);
+      --  if Natural (N_Cols) > Natural (Count'Last) then
+      --     raise Layout_Error;
+      --  end if;
+      return Count (N_Cols);
+   end Line_Length;
+
+   function Line_Length return Count
+   is
+   begin
+      return Line_Length (Get_Window);
+   end Line_Length;
+
+   function Page_Length (Win : Window) return Count
+   is
+      N_Lines : Line_Count;
+      N_Cols  : Column_Count;
+   begin
+      if Scrolling_Allowed (Win) then
+         return 0;
+      else
+         Get_Size (Win, N_Lines, N_Cols);
+         --  if Natural (N_Lines) > Natural (Count'Last) then
+         --     raise Layout_Error;
+         --  end if;
+         return Count (N_Lines);
+      end if;
+   end Page_Length;
+
+   function Page_Length return Count
+   is
+   begin
+      return Page_Length (Get_Window);
+   end Page_Length;
+
+   ------------------------------------
+   -- Column, Line, and Page Control --
+   ------------------------------------
+   procedure New_Line (Win : Window; Spacing : Positive_Count := 1)
+   is
+      P_Size : constant Count := Page_Length (Win);
+   begin
+      if not Spacing'Valid then
+         raise Constraint_Error;
+      end if;
+
+      for I in 1 .. Spacing loop
+         if P_Size > 0 and then Line (Win) >= P_Size then
+            New_Page (Win);
+         else
+            Add (Win, ASCII.LF);
+         end if;
+      end loop;
+   end New_Line;
+
+   procedure New_Line (Spacing : Positive_Count := 1)
+   is
+   begin
+      New_Line (Get_Window, Spacing);
+   end New_Line;
+
+   procedure New_Page (Win : Window)
+   is
+   begin
+      Clear (Win);
+   end New_Page;
+
+   procedure New_Page
+   is
+   begin
+      New_Page (Get_Window);
+   end New_Page;
+
+   procedure Set_Col (Win : Window;  To : Positive_Count)
+   is
+      Y  : Line_Position;
+      X1 : Column_Position;
+      X2 : Column_Position;
+      N  : Natural;
+   begin
+      if not To'Valid then
+         raise Constraint_Error;
+      end if;
+
+      Get_Cursor_Position (Win, Y, X1);
+      N  := Natural (To); N := N - 1;
+      X2 := Column_Position (N);
+      if X1 > X2 then
+         New_Line (Win, 1);
+         X1 := 0;
+      end if;
+      if X1 < X2 then
+         declare
+            Filler : constant String (Integer (X1) .. (Integer (X2) - 1))
+              := (others => ' ');
+         begin
+            Put (Win, Filler);
+         end;
+      end if;
+   end Set_Col;
+
+   procedure Set_Col (To : Positive_Count)
+   is
+   begin
+      Set_Col (Get_Window, To);
+   end Set_Col;
+
+   procedure Set_Line (Win : Window; To : Positive_Count)
+   is
+      Y1 : Line_Position;
+      Y2 : Line_Position;
+      X  : Column_Position;
+      N  : Natural;
+   begin
+      if not To'Valid then
+         raise Constraint_Error;
+      end if;
+
+      Get_Cursor_Position (Win, Y1, X);
+      pragma Warnings (Off, X);         --  unreferenced
+      N  := Natural (To); N := N - 1;
+      Y2 := Line_Position (N);
+      if Y2 < Y1 then
+         New_Page (Win);
+         Y1 := 0;
+      end if;
+      if Y1 < Y2 then
+         New_Line (Win, Positive_Count (Y2 - Y1));
+      end if;
+   end Set_Line;
+
+   procedure Set_Line (To : Positive_Count)
+   is
+   begin
+      Set_Line (Get_Window, To);
+   end Set_Line;
+
+   function Col (Win : Window) return Positive_Count
+   is
+      Y : Line_Position;
+      X : Column_Position;
+      N : Natural;
+   begin
+      Get_Cursor_Position (Win, Y, X);
+      N := Natural (X); N := N + 1;
+      --  if N > Natural (Count'Last) then
+      --     raise Layout_Error;
+      --  end if;
+      return Positive_Count (N);
+   end Col;
+
+   function Col return Positive_Count
+   is
+   begin
+      return Col (Get_Window);
+   end Col;
+
+   function Line (Win : Window) return Positive_Count
+   is
+      Y : Line_Position;
+      X : Column_Position;
+      N : Natural;
+   begin
+      Get_Cursor_Position (Win, Y, X);
+      N := Natural (Y); N := N + 1;
+      --  if N > Natural (Count'Last) then
+      --     raise Layout_Error;
+      --  end if;
+      return Positive_Count (N);
+   end Line;
+
+   function Line return Positive_Count
+   is
+   begin
+      return Line (Get_Window);
+   end Line;
+
+   -----------------------
+   -- Characters Output --
+   -----------------------
+
+   procedure Put (Win  : Window; Item : Character)
+   is
+      P_Size : constant Count := Page_Length (Win);
+      Y : Line_Position;
+      X : Column_Position;
+      L : Line_Count;
+      C : Column_Count;
+   begin
+      if P_Size > 0 then
+         Get_Cursor_Position (Win, Y, X);
+         Get_Size (Win, L, C);
+         if (Y + 1) = L and then (X + 1) = C then
+            New_Page (Win);
+         end if;
+      end if;
+      Add (Win, Item);
+   end Put;
+
+   procedure Put (Item : Character)
+   is
+   begin
+      Put (Get_Window, Item);
+   end Put;
+
+   --------------------
+   -- Strings-Output --
+   --------------------
+
+   procedure Put (Win  : Window; Item : String)
+   is
+      P_Size : constant Count := Page_Length (Win);
+      Y : Line_Position;
+      X : Column_Position;
+      L : Line_Count;
+      C : Column_Count;
+   begin
+      if P_Size > 0 then
+         Get_Cursor_Position (Win, Y, X);
+         Get_Size (Win, L, C);
+         if (Y + 1) = L and then (X + 1 + Item'Length) >= C then
+            New_Page (Win);
+         end if;
+      end if;
+      Add (Win, Item);
+   end Put;
+
+   procedure Put (Item : String)
+   is
+   begin
+      Put (Get_Window, Item);
+   end Put;
+
+   procedure Put_Line
+     (Win  : Window;
+      Item : String)
+   is
+   begin
+      Put (Win, Item);
+      New_Line (Win, 1);
+   end Put_Line;
+
+   procedure Put_Line
+     (Item : String)
+   is
+   begin
+      Put_Line (Get_Window, Item);
+   end Put_Line;
+
+end Terminal_Interface.Curses.Text_IO;
diff --git a/Ada95/src/terminal_interface-curses-text_io.ads b/Ada95/src/terminal_interface-curses-text_io.ads
new file mode 100644
index 0000000..33c1942
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-text_io.ads
@@ -0,0 +1,137 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                     Terminal_Interface.Curses.Text_IO                    --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.15 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Ada.Text_IO;
+with Ada.IO_Exceptions;
+
+package Terminal_Interface.Curses.Text_IO is
+
+   use type Ada.Text_IO.Count;
+   subtype Count is Ada.Text_IO.Count;
+   subtype Positive_Count is Count range 1 .. Count'Last;
+
+   subtype Field is Ada.Text_IO.Field;
+   subtype Number_Base is Integer range 2 .. 16;
+
+   type Type_Set is (Lower_Case, Upper_Case, Mixed_Case);
+
+   --  For most of the routines you will see a version without a Window
+   --  type parameter. They will operate on a default window, which can
+   --  be set by the user. It is initially equal to Standard_Window.
+
+   procedure Set_Window (Win : Window);
+   --  Set Win as the default window
+
+   function Get_Window return Window;
+   --  Get the current default window
+
+   procedure Flush (Win : Window);
+   procedure Flush;
+
+   --------------------------------------------
+   -- Specification of line and page lengths --
+   --------------------------------------------
+
+   --  There are no set routines in this package. I assume, that you allocate
+   --  the window with an appropriate size.
+   --  A scroll-window is interpreted as an page with unbounded page length,
+   --  i.e. it returns the conventional 0 as page length.
+
+   function Line_Length (Win : Window) return Count;
+   function Line_Length return Count;
+
+   function Page_Length (Win : Window) return Count;
+   function Page_Length return Count;
+
+   ------------------------------------
+   -- Column, Line, and Page Control --
+   ------------------------------------
+   procedure New_Line (Win : Window; Spacing : Positive_Count := 1);
+   procedure New_Line (Spacing : Positive_Count := 1);
+
+   procedure New_Page (Win : Window);
+   procedure New_Page;
+
+   procedure Set_Col (Win : Window;  To : Positive_Count);
+   procedure Set_Col (To : Positive_Count);
+
+   procedure Set_Line (Win : Window; To : Positive_Count);
+   procedure Set_Line (To : Positive_Count);
+
+   function Col (Win : Window) return Positive_Count;
+   function Col return Positive_Count;
+
+   function Line (Win : Window) return Positive_Count;
+   function Line return Positive_Count;
+
+   -----------------------
+   -- Characters-Output --
+   -----------------------
+
+   procedure Put (Win  : Window; Item : Character);
+   procedure Put (Item : Character);
+
+   --------------------
+   -- Strings-Output --
+   --------------------
+
+   procedure Put (Win  : Window; Item : String);
+   procedure Put (Item : String);
+
+   procedure Put_Line
+     (Win  : Window;
+      Item : String);
+
+   procedure Put_Line
+     (Item : String);
+
+   --  Exceptions
+
+   Status_Error : exception renames Ada.IO_Exceptions.Status_Error;
+   Mode_Error   : exception renames Ada.IO_Exceptions.Mode_Error;
+   Name_Error   : exception renames Ada.IO_Exceptions.Name_Error;
+   Use_Error    : exception renames Ada.IO_Exceptions.Use_Error;
+   Device_Error : exception renames Ada.IO_Exceptions.Device_Error;
+   End_Error    : exception renames Ada.IO_Exceptions.End_Error;
+   Data_Error   : exception renames Ada.IO_Exceptions.Data_Error;
+   Layout_Error : exception renames Ada.IO_Exceptions.Layout_Error;
+
+end Terminal_Interface.Curses.Text_IO;
diff --git a/Ada95/src/terminal_interface-curses-trace.adb_p b/Ada95/src/terminal_interface-curses-trace.adb_p
new file mode 100644
index 0000000..11acf3d
--- /dev/null
+++ b/Ada95/src/terminal_interface-curses-trace.adb_p
@@ -0,0 +1,77 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                      Terminal_Interface.Curses.Trace                     --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2001-2011,2014 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.12 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+#if ADA_TRACE then
+with Interfaces.C; use Interfaces.C;
+#end if;
+
+package body Terminal_Interface.Curses.Trace is
+
+#if ADA_TRACE then
+   procedure Trace_On (x : Trace_Attribute_Set) is
+      procedure traceC (y : Trace_Attribute_Set);
+      pragma Import (C, traceC, "trace");
+   begin
+      traceC (x);
+   end Trace_On;
+
+   procedure Trace_Put (str : String) is
+      procedure tracef (format : char_array; s : char_array);
+      pragma Import (C, tracef, "_traces");
+      --  _traces() is defined in c_varargs_to_ada.h
+   begin
+      tracef (To_C ("%s"), To_C (str));
+   end Trace_Put;
+#else
+   procedure Trace_On (x : Trace_Attribute_Set) is
+      pragma Warnings (Off, x);         --  unreferenced
+   begin
+      null;
+   end Trace_On;
+
+   procedure Trace_Put (str : String) is
+      pragma Warnings (Off, str);       --  unreferenced
+   begin
+      null;
+   end Trace_Put;
+#end if;
+
+end Terminal_Interface.Curses.Trace;
diff --git a/Ada95/src/terminal_interface.ads b/Ada95/src/terminal_interface.ads
new file mode 100644
index 0000000..a78f145
--- /dev/null
+++ b/Ada95/src/terminal_interface.ads
@@ -0,0 +1,48 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                            Terminal_Interface                            --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2006 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.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  $Revision: 1.15 $
+--  $Date: 2020/02/02 23:34:34 $
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+package Terminal_Interface is
+   pragma Pure (Terminal_Interface);
+--
+--  Everything is in the child units
+--
+end Terminal_Interface;
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..57b2be4
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,29 @@
+Copyright 2018-2021,2022 Thomas E. Dickey
+Copyright 1998-2017,2018 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.
+
+-- vile:txtmode fc=72
+-- $Id: COPYING,v 1.11 2022/01/01 11:47:50 tom Exp $
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..d9c1dd1
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,2470 @@
+-------------------------------------------------------------------------------
+-- Copyright 2018-2021,2022 Thomas E. Dickey                                 --
+-- Copyright 1998-2017,2018 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: INSTALL,v 1.238 2022/12/29 20:30:06 tom Exp $
+---------------------------------------------------------------------
+             How to install Ncurses/Terminfo on your system
+---------------------------------------------------------------------
+
+    ************************************************************
+    * READ ALL OF THIS FILE BEFORE YOU TRY TO INSTALL NCURSES. *
+    ************************************************************
+
+You should be reading the file INSTALL in a directory called ncurses-d.d, where
+d.d is the current version number.  There should be several subdirectories,
+including `c++', `form', `man', `menu', 'misc', `ncurses', `panel', `progs',
+and `test'.  See the README file for a roadmap to the package.
+
+If you are a distribution integrator or packager, please read and act on the
+section titled FOR SYSTEM INTEGRATORS below.
+
+If you are converting from BSD curses and do not have root access, be sure
+to read the BSD CONVERSION NOTES section below.
+
+If you are trying to build applications using gpm with ncurses,
+read the USING NCURSES WITH GPM section below.
+
+If you are cross-compiling, see the note below on BUILDING WITH A CROSS-COMPILER.
+
+If you want to build the Ada95 binding, go to the Ada95 directory and
+follow the instructions there.  The Ada95 binding is not covered below.
+
+
+REQUIREMENTS:
+------------
+
+You will need the following to build and install ncurses under UNIX:
+
+	* ANSI C compiler  (gcc, for instance)
+	* sh               (bash will do)
+	* awk              (mawk or gawk will do)
+	* sed
+	* BSD or System V style install (a script is enclosed)
+
+Ncurses has been also built in the OS/2 EMX environment.
+
+
+INSTALLATION PROCEDURE:
+----------------------
+
+1.  First, decide whether you want ncurses to replace your existing library (in
+    which case you'll need super-user privileges) or be installed in parallel
+    with it.
+
+    The --prefix option to configure changes the root directory for installing
+    ncurses.  The default is normally in subdirectories of /usr/local, except
+    for systems where ncurses is normally installed as a system library (see
+    "IF YOU ARE A SYSTEM INTEGRATOR").  Use --prefix=/usr to replace your
+    default curses distribution.
+
+    The package gets installed beneath the --prefix directory as follows:
+
+    In $(prefix)/bin:          tic, infocmp, captoinfo, tset,
+				reset, clear, tput, toe, tabs
+    In $(prefix)/lib:          libncurses*.* libcurses.a
+    In $(prefix)/share/terminfo: compiled terminal descriptions
+    In $(prefix)/include:      C header files
+    Under $(prefix)/man:       the manual pages
+
+    Note that the configure script attempts to locate previous installation of
+    ncurses, and will set the default prefix according to where it finds the
+    ncurses headers.
+
+    Do not use commands such as
+
+	make install prefix=XXX
+
+    to change the prefix after configuration, since the prefix value is used
+    for some absolute pathnames such as TERMINFO.  Instead do this
+
+	make install DESTDIR=XXX
+
+    See also the discussion of --with-install-prefix.
+
+2.  Type `./configure' in the top-level directory of the distribution to
+    configure ncurses for your operating system and create the Makefiles.
+    Besides --prefix, various configuration options are available to customize
+    the installation; use `./configure --help' to list the available options.
+
+    If your operating system is not supported, read the PORTABILITY section in
+    the file ncurses/README for information on how to create a configuration
+    file for your system.
+
+    The `configure' script generates makefile rules for one or more object
+    models and their associated libraries:
+
+	libncurses.a (normal)
+
+	libcurses.a (normal, a link to libncurses.a)
+		This gets left out if you configure with --disable-overwrite.
+
+	libncurses.so (shared)
+
+	libncurses_g.a (debug)
+
+	libncurses_p.a (profile)
+
+	libncurses.la (libtool)
+
+    If you configure using the --enable-widec option, a "w" is appended to the
+    library names (e.g., libncursesw.a), and the resulting libraries support
+    wide-characters, e.g., via a UTF-8 locale.  The corresponding header files
+    are compatible with the non-wide-character configuration; wide-character
+    features are provided by ifdef's in the header files.  The wide-character
+    library interfaces are not binary-compatible with the non-wide-character
+    version.  Building and running the wide-character code relies on a fairly
+    recent implementation of libiconv.  We have built this configuration on
+    various systems using libiconv, sometimes requiring libutf8.
+
+    If you configure using the --with-pthread option, a "t" is appended to
+    the library names (e.g., libncursest.a, libncursestw.a).
+
+    If you do not specify any models, the normal and debug libraries will be
+    configured.  Typing `configure' with no arguments is equivalent to:
+
+	./configure --with-normal --with-debug --enable-overwrite
+
+    Typing
+
+	./configure --with-shared
+
+    makes the shared libraries the default, resulting in
+
+	./configure --with-shared --with-normal --with-debug --enable-overwrite
+
+    If you want only shared libraries, type
+
+	./configure --with-shared --without-normal --without-debug
+
+    Rules for generating shared libraries are highly dependent upon the choice
+    of host system and compiler.  We've been testing shared libraries on
+    several systems, but more work needs to be done to make shared libraries
+    work on other systems.
+
+    If you have libtool installed, you can type
+
+	./configure --with-libtool
+
+    to generate the appropriate static and/or shared libraries for your
+    platform using libtool.
+
+    You can make curses and terminfo fall back to an existing file of termcap
+    definitions by configuring with --enable-termcap.  If you do this, the
+    library will search /etc/termcap before the terminfo database, and will
+    also interpret the contents of the TERM environment variable.  See the
+    section BSD CONVERSION NOTES below.
+
+3.  Type `make'.  Ignore any warnings, no error messages should be produced.
+    This should compile the ncurses library, the terminfo compiler tic(1),
+    captoinfo(1), infocmp(1), toe(1), clear(1) tset(1), reset(1), and tput(1)
+    programs (see the manual pages for explanation of what they do), some test
+    programs, and the panels, menus, and forms libraries.
+
+4.  Run ncurses and several other test programs in the test directory to
+    verify that ncurses functions correctly before doing an install that
+    may overwrite system files.  Read the file test/README for details on
+    the test programs.
+
+    NOTE: You must have installed the terminfo database, or set the
+    environment variable $TERMINFO to point to a SVr4-compatible terminfo
+    database before running the test programs.  Not all vendors' terminfo
+    databases are SVr4-compatible, but most seem to be.
+
+    It is possible to configure ncurses to use other terminfo database formats.
+    A few are provided as examples in the include-directory (see --with-caps).
+
+    If you run the test programs WITHOUT installing terminfo, ncurses may
+    read the termcap file and cache that in $HOME/.terminfo, which will
+    thereafter be used instead of the terminfo database.  See the comments
+    on "--enable-getcap-cache", to see why this is a Bad Thing.
+
+    The ncurses program is designed specifically to test the ncurses library.
+    You can use it to verify that the screen highlights work correctly, that
+    cursor addressing and window scrolling works OK, etc.
+
+5.  Once you've tested, you can type `make install' to install libraries,
+    the programs, the terminfo database and the manual pages.  Alternately, you
+    can type `make install' in each directory you want to install.  In the
+    top-level directory, you can do a partial install using these commands:
+
+	'make install.progs'    installs tic, infocmp, etc...
+	'make install.includes' installs the headers.
+	'make install.libs'     installs the libraries (and the headers).
+	'make install.data'     installs the terminfo data. (Note: `tic' must
+				be installed before the terminfo data can be
+				compiled).
+	'make install.man'      installs the manual pages.
+
+  ############################################################################
+  #     CAVEAT EMPTOR: `install.data' run as root will NUKE any existing     #
+  #  terminfo database. If you have any custom or unusual entries SAVE them  #
+  #  before you install ncurses.                                             #
+  ############################################################################
+
+    The terminfo(5) manual page must be preprocessed with tbl(1) before
+    being formatted by nroff(1).  Modern man(1) implementations tend to do
+    this by default, but you may want to look at your version's manual page
+    to be sure.  You may also install the manual pages after preprocessing
+    with tbl(1) by specifying the configure option --with-manpage-tbl.
+
+    If the system already has a curses library that you need to keep using
+    you'll need to distinguish between it and ncurses.  See the discussion of
+    --disable-overwrite.  If ncurses is installed outside the standard
+    directories (/usr/include and /usr/lib) then all your users will need to
+    use the -I option to compile programs and -L to link them.
+
+    If you have another curses installed in your system and you accidentally
+    compile using its curses.h you'll end up with a large number of
+    undefined symbols at link time.
+
+    IF YOU DO NOT HAVE ROOT: Change directory to the `progs' subdirectory
+    and run the `capconvert' script.  This script will deduce various things
+    about your environment and use them to build you a private terminfo tree,
+    so you can use ncurses applications.
+
+    If more than one user at your site does this, the space for the duplicate
+    trees is wasted.  Try to get your site administrators to install a system-
+    wide terminfo tree instead.
+
+    See the BSD CONVERSION NOTES section below for a few more details.
+
+6.  The c++ directory has C++ classes that are built on top of ncurses and
+    panels.  You must have c++ (and its libraries) installed before you can
+    compile and run the demo.
+
+    Use --without-cxx-binding to tell configure to not build the C++ bindings
+    and demo.
+
+    If you do not have C++, you must use the --without-cxx option to tell
+    the configure script to not attempt to determine the type of 'bool'
+    which may be supported by C++.  IF YOU USE THIS OPTION, BE ADVISED THAT
+    YOU MAY NOT BE ABLE TO COMPILE (OR RUN) NCURSES APPLICATIONS WITH C++.
+
+
+CONFIGURE OPTIONS:
+-----------------
+
+    The configure script provides a short list of its options when you type
+
+	./configure --help
+
+    The --help and several options are common to all configure scripts that are
+    generated with autoconf.  Those are all listed before the line
+
+	--enable and --with options recognized:
+
+    The other options are specific to this package.  We list them in alphabetic
+    order.
+
+    --disable-assumed-color
+	With ncurses 5.1, we introduced a new function, assume_default_colors()
+	which allows applications to specify what the default foreground and
+	background color are assumed to be.  Most color applications use
+	full-screen color; but a few do not color the background.  While the
+	assumed values can be overridden by invoking assume_default_colors(),
+	you may find it useful to set the assumed values to the pre-5.1
+	convention, using this configure option.
+
+    --disable-big-core
+	Assume machine has little memory.  The configure script attempts to
+	determine if your machine has enough memory (about 6Mb) to compile the
+	terminfo database without writing portions to disk.  Some allocators
+	return deceptive results, so you may have to override the configure
+	script.  Or you may be building tic for a smaller machine.
+
+    --disable-big-strings
+	Disable compile-time optimization of predefined tables which puts
+	all of their strings into a very long string, to reduce relocation
+	overhead.
+
+    --disable-database
+	Use only built-in data.  The ncurses libraries normally read terminfo
+	and termcap data from disk.  You can configure ncurses to have a
+	built-in database, aka "fallback" entries.  Embedded applications may
+	have no need for an external database.  Some, but not all of the
+	programs are useful in this configuration, e.g., tset and tput versus
+	infocmp and tic.
+
+    --disable-db-install
+	Do not install the terminal database.  This is used to omit features
+	for packages, as done with --without-progs.
+
+    --disable-echo
+	Use the option --disable-echo to make the build-log less verbose by
+	suppressing the display of the compile and link commands.  This makes
+	it easier to see the compiler warnings.  (You can always use "make -n"
+	to see the options that are used).
+
+    --disable-ext-funcs
+	Disable function-extensions.  Configure ncurses without the functions
+	that are not specified by XSI.  See ncurses/modules for the exact
+	list of library modules that would be suppressed.
+
+    --disable-gnat-projects
+	Disable GNAT projects even if usable, for testing old makefile rules.
+
+    --disable-hashmap
+	Compile without hashmap scrolling-optimization code.  This algorithm is
+	the default.
+
+    --disable-home-terminfo
+	The $HOME/.terminfo directory is normally added to ncurses' search
+	list for reading/writing terminfo entries, since that directory is
+	more likely writable than the system terminfo database.  Use this
+	option to disable the feature altogether.
+
+    --disable-largefile
+	Disable compiler flags needed to use large-file interfaces.
+
+    --disable-leaks
+	For testing, compile-in code that frees memory that normally would not
+	be freed, to simplify analysis of memory-leaks.
+
+	Any implementation of curses must not free the memory associated with
+	a screen, since (even after calling endwin()), it must be available
+	for use in the next call to refresh().  There are also chunks of
+	memory held for performance reasons.  That makes it hard to analyze
+	curses applications for memory leaks.  To work around this, build a
+	debugging version of the ncurses library which frees those chunks
+	which it can, and provides the _nc_free_and_exit() function to free
+	the remainder and then exit.  The ncurses utility and test programs
+	use this feature, e.g., via the ExitProgram() macro.
+
+	Because this lies outside of the library's intended usage, it is not
+	normally considered part of the ABI.  If there were some (as yet
+	unplanned) extension which frees memory in a manner that would let the
+	library resume and reallocate memory, then that would not use a "_nc_"
+	prefix.
+
+    --disable-lib-suffixes
+	Suppress the "w", "t" or "tw" suffixes which normally would be added
+	to the library names for the --enable-widec and --with-pthread options.
+
+    --disable-libtool-version
+	when using --with-libtool, control how the major/minor version numbers
+	are used for constructing the library name.
+
+	The default uses the -version-number feature of libtool, which makes
+	the library names compatible (though not identical) with the standard
+	build using --with-shared.
+
+	Use --disable-libtool-version to use the libtool -version-info feature.
+	This corresponds to the setting used before patch 20100515.
+
+	Starting with patch 20141115, using this option causes the configure
+	script to apply the top-level VERSION file to the ABI version used
+	for libtool.
+
+    --disable-lp64
+	The header files will ignore use of the _LP64 symbol to make chtype
+	and mmask_t types 32 bits (they may be long on 64-bit hosts, for
+	compatibility with older releases).
+
+	NOTE: this is potentially an ABI change, depending on existing
+	packages.  The default for this option is "disabled" for ncurses
+	ABI 5, and "enabled" for ABI 6.
+
+    --disable-macros
+	For testing, use functions rather than macros.  The program will run
+	more slowly, but it is simpler to debug.  This defines NCURSES_NOMACROS
+	at build time.  See also the --enable-expanded option.
+
+    --disable-overwrite
+	If you are installing ncurses on a system which contains another
+	development version of curses, or which could be confused by the loader
+	for another version, we recommend that you leave out the link to
+	-lcurses.  The ncurses library is always available as -lncurses.
+	Disabling overwrite also causes the ncurses header files to be
+	installed into a subdirectory, e.g., /usr/local/include/ncurses,
+	rather than the include directory.  This makes it simpler to avoid
+	compile-time conflicts with other versions of curses.h
+
+	Putting the header files into a subdirectory assumes that applications
+	will follow the (standard) practice of including the headers with
+	reference to the subdirectory name.  For instance, the normal ncurses
+	header would be included using
+
+		#include <ncurses/curses.h>
+		#include <ncurses/term.h>
+
+	while the ncursesw headers would be found this way:
+
+		#include <ncursesw/curses.h>
+		#include <ncursesw/term.h>
+
+	In either case (with or without the --disable-overwrite option),
+	almost all applications are designed to include a related set of
+	curses header files from the same directory.
+
+	Manipulating the --includedir configure option to put header files
+	directly in a subdirectory of the normal include-directory defeats
+	this, and breaks builds of portable applications.  Likewise, putting
+	some headers in /usr/include, and others in a subdirectory is a good
+	way to break builds.
+
+	When configured with --disable-overwrite, the installed header files'
+	embedded #include's are adjusted to use the same style of includes
+	noted above.  In particular, the unctrl.h header is included from
+	curses.h, which means that a makefile which tells the compiler to
+	include directly from the subdirectory will fail to compile correctly.
+	Without some special effort, it will either fail to compile at all,
+	or the compiler may find a different unctrl.h file.
+
+	In addition to the curses library, a system may provide its own
+	versions of the add-on libraries (form, menu, panel), which would
+	not be compatible with ncurses.  These options allow you to rename
+	ncurses' add-on libraries to avoid conflicts when linking:
+
+		--with-form-libname=XXX
+		--with-menu-libname=XXX
+		--with-panel-libname=XXX
+
+	Rather than renaming them abitrarily, a prefix or suffix is
+	recommended.  An "n" prefix provides consistency with ncurses versus
+	curses, i.e.,
+
+		--with-form-libname=nform
+		--with-menu-libname=nmenu
+		--with-panel-libname=npanel
+
+    --disable-pkg-ldflags
+	Omit options in $LDFLAGS and $EXTRA_LDFLAGS from the pkg-config ".pc"
+	and corresponding ncurses*-config script which normally are listed via
+	the "--libs" option.  These options are normally used to facilitate
+	linking to ncurses when it was configured to use the rpath feature.
+
+	See also --enable-rpath and --disable-rpath-hack.
+
+    --disable-relink
+	If --enable-rpath is given, the generated makefiles normally will
+	rebuild shared libraries during install.  Use this option to simply
+	copy whatever the linker produced.
+
+	Static libraries cannot simply be copied because tools use timestamps
+	to determine if the library's symbol table is up to date.  If your
+	install program supports the "-p" (preserve timestamp) option, that
+	is used when --disable-relink is given, to avoid rebuilding the symbol
+	table.
+
+	Finally, some tools ignore the subsecond timestamps supported by some
+	filesystems.  This option adds a 1-second sleep to help those tools
+	avoid unnecessary relinking during the install process.
+
+    --disable-root-access
+	Compile with environment restriction, so most file-access is limited
+	when running via a setuid/setgid application.
+
+    --disable-root-environ
+	Compile with environment restriction, so certain environment variables
+	are not available when running as root, or via a setuid/setgid
+	application.  These are (for example $TERMINFO) those that allow the
+	search path for the terminfo or termcap entry to be customized.
+
+    --disable-rpath-hack
+	Normally the configure script helps link libraries found in unusual
+	places by adding an rpath option to the link command.  If you are
+	building packages, this feature may be redundant.  Use this option
+	to suppress the feature.
+
+    --disable-scroll-hints
+	Compile without scroll-hints code.  This option is ignored when
+	hashmap scrolling is configured, which is the default.
+
+    --disable-stripping
+	Do not strip installed executables.
+
+    --disable-tic-depends
+	When building shared libraries, normally the tic library is linked to
+	depend upon the ncurses library (or equivalently, on the tinfo-library
+	if the --with-termlib option was given).  The tic- and tinfo-library
+	ABIs do not depend on the --enable-widec option.  Some packagers have
+	used this to reduce the number of library files which are packaged by
+	using only one copy of those libraries.  To make this work properly,
+	the tic library must be built without an explicit dependency on the
+	underlying library (ncurses vs ncursesw, tinfo vs tinfow).  Use this
+	configure option to do that.
+	For example
+		configure --with-ticlib --with-shared --disable-tic-depends
+
+    --disable-tparm-varargs
+	Portable programs should call tparm() using the fixed-length parameter
+	list documented in X/Open.  ncurses provides varargs support for this
+	function.  Use --disable-tparm-varargs to disable this support.
+
+    --enable-assertions
+	For testing, compile-in assertion code.  This is used only for a few
+	places where ncurses cannot easily recover by returning an error code.
+
+    --enable-broken_linker
+	A few platforms have what we consider a broken linker:  it cannot link
+	objects from an archive solely by referring to data objects in those
+	files, but requires a function reference.  This configure option
+	changes several data references to functions to work around this
+	problem.
+
+	NOTE: With ncurses 5.1, this may not be necessary, since we are
+	told that some linkers interpret uninitialized global data as a
+	different type of reference which behaves as described above.  We have
+	explicitly initialized all of the global data to work around the
+	problem.
+
+    --enable-bsdpad
+	Recognize BSD-style prefix padding.  Some ancient BSD programs (such as
+	nethack) call tputs("50") to implement delays.
+
+    --enable-colorfgbg
+	Compile with experimental $COLORFGBG code.  That environment variable
+	is set by some terminal emulators as a hint to applications, by
+	advertising the default foreground and background colors.  During
+	initialization, ncurses sets color pair 0 to match this.
+
+    --enable-const
+	The curses interface as documented in XSI is rather old, in fact
+	including features that precede ANSI C.  The prototypes generally do
+	not make effective use of "const".  When using stricter compilers (or
+	gcc with appropriate warnings), you may see warnings about the mismatch
+	between const and non-const data.  We provide a configure option which
+	changes the interfaces to use const - quieting these warnings and
+	reflecting the actual use of the parameters more closely.  The ncurses
+	library uses the symbol NCURSES_CONST for these instances of const,
+	and if you have asked for compiler warnings, will add gcc's const-qual
+	warning.  There will still be warnings due to subtle inconsistencies
+	in the interface, but at a lower level.
+
+	NOTE: configuring ncurses with this option may detract from the
+	portability of your applications by encouraging you to use const in
+	places where the XSI curses interface would not allow them.  Similar
+	issues arise when porting to SVr4 curses, which uses const in even
+	fewer places.
+
+    --enable-expanded
+	For testing, generate functions for certain macros to make them visible
+	as such to the debugger.  See also the --disable-macros option.
+
+    --enable-exp-win32
+	When configuring for MinGW, use the experimental Windows 10 driver.
+
+    --enable-ext-colors
+	Extend the cchar_t structure to allow more than 16 colors to be
+	encoded.  This applies only to the wide-character (--enable-widec)
+	configuration.
+
+	NOTE: using this option will make libraries which are not binary-
+	compatible with libncursesw 5.4.  None of the interfaces change, but
+	applications which have an array of cchar_t's must be recompiled.
+
+    --enable-ext-mouse
+	Modify the encoding of mouse state to make room for a 5th mouse button.
+	That allows one to use ncurses with a wheel mouse with xterm or
+	similar X terminal emulators.
+
+	NOTE: using this option will make libraries which are not binary-
+	compatible with libncursesw 5.4.  None of the interfaces change, but
+	applications which have mouse mask mmask_t's must be recompiled.
+
+    --enable-ext-putwin
+	Modify the file-format written by putwin() to use printable text rather
+	than binary files, allowing getwin() to read screen dumps written by
+	differently-configured ncurses libraries.  The extended getwin() can
+	still read binary screen dumps from the "same" configuration of
+	ncurses.  This does not change the ABI (the binary interface seen by
+	calling applications).
+
+    --enable-fvisibility
+    	Use the gcc "-fvisibility=hidden" option to make symbols which are not
+	explicitly exported, "hidden".  Doing this may reduce the number of
+	symbols exported in the C++ binding; it should have less effect on the
+	C libraries when symbol-versioning is used.
+
+    --enable-getcap
+	Use the 4.4BSD getcap code if available, or a bundled version of it to
+	fetch termcap entries.  Entries read in this way cannot use (make
+	cross-references to) the terminfo tree, but it is faster than reading
+	/etc/termcap.
+
+	If configured for one of the *BSD systems, this automatically uses
+	the hashed database system produced using cap_mkdb or similar tools.
+	In that case, there is no advantage in using the --enable-getcap-cache
+	option.
+
+	See also the --with-hashed-db option.
+
+    --enable-getcap-cache
+	Cache translated termcaps under the directory $HOME/.terminfo
+
+	NOTE: this sounds good - it makes ncurses run faster the second time.
+	But look where the data comes from - an /etc/termcap containing lots of
+	entries that are not up to date.  If you configure with this option and
+	forget to install the terminfo database before running an ncurses
+	application, you will end up with a hidden terminfo database that
+	generally does not support color and will miss some function keys.
+
+    --enable-hard-tabs
+	Compile-in cursor-optimization code that uses hard-tabs.  We would make
+	this a standard feature except for the concern that the terminfo entry
+	may not be accurate, or that your stty settings have disabled the use
+	of tabs.
+
+    --enable-interop
+	Compile-in experimental interop bindings.  These provide generic types
+	for the form-library.
+
+    --enable-mixed-case
+	Controls whether the filesystem on which the terminfo database resides
+	supports mixed-case filenames (normal for UNIX, but not on other
+	systems).  If you do not specify this option, the configure script
+	checks the current filesystem.
+
+    --enable-no-padding
+	Compile-in support for the $NCURSES_NO_PADDING environment variable,
+	which allows you to suppress the effect of non-mandatory padding in
+	terminfo entries.  This is the default, unless you have disabled the
+	extended functions.
+
+    --enable-opaque-curses
+    --enable-opaque-form
+    --enable-opaque-menu
+    --enable-opaque-panel
+	Define symbol in curses.h which controls whether some library
+	structures are treated as "opaque".  The --enable-opaque-curses option
+	is overridden by the --enable-reentrant option.
+
+    --enable-pc-files
+	If pkg-config is found (see --with-pkg-config), generate ".pc" files
+	for each of the libraries, and install them in pkg-config's library
+	directory.
+
+    --enable-pthreads-eintr
+	add logic in threaded configuration to ensure that a read(2) system
+	call can be interrupted for SIGWINCH.
+
+    --enable-reentrant
+	Compile configuration which improves reentrant use of the library by
+	reducing global and static variables.  This option is also set if
+	--with-pthread is used.
+
+	Enabling this option adds a "t" to the library names, except for the
+	special case when --enable-weak-symbols is also used.
+
+    --enable-rpath
+	Use rpath option when generating shared libraries, and (with some
+	restrictions) when linking the corresponding programs.  This originally
+	(in 1997) applied mainly to systems using the GNU linker (read the
+	manpage).
+
+	More recently it is useful for systems that require special treatment
+	shared libraries in "unusual" locations.  The "system" libraries reside
+	in directories which are on the loader's default search-path.  While
+	you may be able to use workarounds such as the $LD_LIBRARY_PATH
+	environment variable, they do not work with setuid applications since
+	the LD_LIBRARY_PATH variable would be unset in that situation.
+
+	This option does not apply to --with-libtool, since libtool makes
+	extra assumptions about rpath.
+
+    --enable-safe-sprintf
+	Compile with experimental safe-sprintf code.  You may consider using
+	this if you are building ncurses for a system that has neither
+	vsnprintf() or vsprintf().  It is slow, however, and is used only on
+	very old systems which lack vsnprintf().
+
+    --enable-signed-char
+	The term.h header declares a Booleans[] array typed "char".  But it
+	stores signed values there and "char" is not necessarily signed.
+	Some packagers choose to alter the type of Booleans[] though this
+	is not strictly compatible.  This option allows one to implement this
+	alteration without patching the source code.
+
+    --enable-sigwinch
+	Compile support for ncurses' SIGWINCH handler.  If your application has
+	its own SIGWINCH handler, ncurses will not use its own.  The ncurses
+	handler causes wgetch() to return KEY_RESIZE when the screen-size
+	changes.  This option is the default, unless you have disabled the
+	extended functions.
+
+    --enable-sp-funcs
+	Compile-in support for extended functions which accept a SCREEN pointer,
+	reducing the need for juggling the global SP value with set_term() and
+	delscreen().
+
+    --enable-stdnoreturn
+	When enabled, check if the <stdnoreturn.h> header exists, and if found
+	define GCC_NORETURN to _Noreturn rather than either the gcc-specific
+	__attribute__((noreturn)) or an empty token.  Doing this may require
+	calling programs which use GCC_NORETURN in their own function
+	definitions to be modified, because _Noreturn is only accepted as
+	the first token in a declaration.
+
+    --enable-string-hacks
+	Controls whether strlcat and strlcpy may be used.  The same issue
+	applies to OpenBSD's warnings about snprintf, noting that this function
+	is weakly standardized.
+
+	Aside from stifling these warnings, there is no functional improvement
+	in ncurses.
+
+    --enable-symlinks
+	If your system supports symbolic links, make tic use symbolic links
+	rather than hard links to save diskspace when writing aliases in the
+	terminfo database.
+
+    --enable-tcap-names
+	Compile-in support for user-definable terminal capabilities.  Use the
+	-x option of tic and infocmp to treat unrecognized terminal
+	capabilities as user-defined strings.  This option is the default,
+	unless you have disabled the extended functions.
+
+    --enable-term-driver
+	Enable experimental terminal-driver.  This is currently used for the
+	MinGW port, by providing a way to substitute the low-level terminfo
+	library with different terminal drivers.
+
+    --enable-termcap
+	Compile in support for reading terminal descriptions from termcap if no
+	match is found in the terminfo database.  See also the --enable-getcap
+	and --enable-getcap-cache options.
+
+	Termcap support requires run-time parsing rather than loading
+	predigested data.  If you have specified --with-ticlib, then you
+	cannot have termcap support since run-time parsing is done in the
+	tic library, which is intentionally not part of normal linkage
+	dependencies.
+
+    --enable-warnings
+	Turn on GCC compiler warnings.  There should be only a few.
+
+    --enable-wattr-macros
+	The 6.0 ABI adds support for extended colors and for extended mouse.
+	The former is a noticeable problem when developers inadvertently
+	compile using the ncurses6 header files and link with an ncurses5
+	library, because the wattr* macros use a new field in the WINDOW
+	structure.  These macros are used in several applications.
+
+	Since ncurses provides an actual function for each of these macros,
+	suppressing them from the curses.h header allows the ncurses5 libraries
+	to be used in most applications.
+
+	NOTE: The extended colors also are used in the cchar_t structure, but
+	fewer applications use that.
+
+	NOTE: This workaround does not help with mismatches in the ncurses
+	mouse version.  The extended mouse feature uses one less fewer bit for
+	each button, so that only the first button will work as expected with
+	a mismatch between header and library.  Again, most applications will
+	work, since most use only the first button.
+
+    --enable-weak-symbols
+	If the --with-pthread option is set, check if the compiler supports
+	weak-symbols.  If it does, then name the thread-capable library without
+	the "t" (libncurses rather than libncursest), and provide for
+	dynamically loading the pthreads entrypoints at runtime.  This allows
+	one to reduce the number of library files for ncurses.
+
+    --enable-wgetch-events
+	Compile with experimental wgetch-events code.  See ncurses/README.IZ
+
+    --enable-widec
+	Compile with wide-character code.  This makes a different version of
+	the libraries (e.g., libncursesw.so), which stores characters as
+	wide-characters,
+
+	NOTE: applications compiled with this configuration are not compatible
+	with those built for 8-bit characters.  You cannot simply make a
+	symbolic link to equate libncurses.so with libncursesw.so
+
+	NOTE: the Ada95 binding may be built against either version of the the
+	ncurses library, but you must decide which:  the binding installs the
+	same set of files for either version.  Currently (2002/6/22) it does
+	not use the extended features from the wide-character code, so it is
+	probably better to not install the binding for that configuration.
+
+    --enable-xmc-glitch
+	Compile-in support experimental xmc (magic cookie) code.
+
+    --with-abi-version=NUM
+	Override the ABI version, which is used in shared library filenames.
+	Normally this is the same as the release version; some ports have
+	special requirements for compatibility.
+
+	This option does not affect linking with libtool, which uses the
+	release major/minor numbers.
+
+    --with-ada-compiler=CMD
+	Specify the Ada95 compiler command (default "gnatmake")
+
+    --with-ada-include=DIR
+	Tell where to install the Ada includes (default:
+	PREFIX/lib/ada/adainclude)
+
+    --with-ada-libname=NAME
+	Override the name of the Ada binding (default: "AdaCurses")
+
+    --with-ada-objects=DIR
+	Tell where to install the Ada objects (default:  PREFIX/lib/ada/adalib)
+
+    --with-ada-sharedlib
+	Build a shared library for Ada95 binding, if the compiler permits.
+
+	NOTE: You must also set the --with-shared option on some platforms
+	for a successful build.  You need not use this option when you set
+	--with-shared, unless you want to use the Ada shared library.
+
+    --with-bool=TYPE
+	If --without-cxx is specified, override the type used for the "bool"
+	declared in curses.h (normally the type is automatically chosen to
+	correspond with that in <stdbool.h>, or defaults to platform-specific
+	sizes).
+
+    --with-build-cc=XXX
+	If cross-compiling, specify a host C compiler, which is needed to
+	compile a few utilities which generate source modules for ncurses.
+	If you do not give this option, the configure script checks if the
+	$BUILD_CC variable is set, and otherwise defaults to gcc or cc.
+
+    --with-build-cflags=XXX
+	If cross-compiling, specify the host C compiler-flags.  You might need
+	to do this if the target compiler has unusual flags which confuse the
+	host compiler.
+
+	You can also set the environment variable $BUILD_CFLAGS rather than
+	use this option.
+
+    --with-build-cpp=XXX
+	This option is provided by the same macro used for $BUILD_CC, etc.,
+	but is not directly used by ncurses.
+
+    --with-build-cppflags=XXX
+	If cross-compiling, specify the host C preprocessor-flags.  You might
+	need to do this if the target compiler has unusual flags which confuse
+	the host compiler.
+
+	You can also set the environment variable $BUILD_CPPFLAGS rather than
+	use this option.
+
+    --with-build-ldflags=XXX
+	If cross-compiling, specify the host linker-flags.  You might need to
+	do this if the target linker has unusual flags which confuse the host
+	compiler.
+
+	You can also set the environment variable $BUILD_LDFLAGS rather than
+	use this option.
+
+    --with-build-libs=XXX
+	If cross-compiling, the host libraries.  You might need to do this if
+	the target environment requires unusual libraries.
+
+	You can also set the environment variable $BUILD_LIBS rather than
+	use this option.
+
+    --with-caps=XXX
+	Specify an alternate terminfo capabilities file, which makes the
+	configure script look for "include/Caps.XXX".  A few systems, e.g.,
+	AIX 4.x use the same overall file-format as ncurses for terminfo
+	data, but use different alignments within the tables to support
+	legacy applications.  For those systems, you can configure ncurses
+	to use a terminfo database which is compatible with the native
+	applications.
+
+    --with-ccharw-max=XXX
+	Override the size of the wide-character array in cchar_t structures.
+	Changing this will alter the binary interface.  This defaults to 5.
+
+    --with-chtype=TYPE
+	Override type of chtype, which stores the video attributes and (if
+	--enable-widec is not given) a character.  Prior to ncurses 5.5, this
+	was always unsigned long, but with ncurses 5.5, it may be unsigned.
+	Use this option if you need to preserve compatibility with 64-bit
+	executables, e.g., by setting "--with-chtype=long" (the configure
+	script supplies "unsigned").
+
+    --with-config-suffix=XXX
+	Specify a suffix for the ncursesw6-config file, etc., used to work
+	around conflicts with packages.
+
+    --with-cxx-libname=NAME
+	Override the basename of the ncurses++ library (default: "ncurses++")
+
+    --with-cxx-shared
+	When --with-shared is set, build libncurses++ as a shared library.
+	This implicitly relies upon building with gcc/g++, since other
+	compiler suites may have differences in the way shared libraries are
+	built.  libtool by the way has similar limitations.
+
+    --with-database=XXX
+	Specify the terminfo source file to install.  Usually you will wish
+	to install ncurses' default (misc/terminfo.src).  Certain systems
+	have special requirements, e.g, OS/2 EMX has a customized terminfo
+	source file.
+
+    --with-dbmalloc
+	For testing, compile and link with Conor Cahill's dbmalloc library.
+	This also sets the --disable-leaks option.
+
+    --with-debug
+	Generate debug-libraries (default).  These are named by adding "_g"
+	to the root, e.g., libncurses_g.a
+
+    --with-default-terminfo-dir=XXX
+	Specify the default terminfo database directory.  This is normally
+	DATADIR/terminfo, e.g., /usr/share/terminfo.
+
+    --with-dmalloc
+	For testing, compile and link with Gray Watson's dmalloc library.
+	This also sets the --disable-leaks option.
+
+    --with-export-syms[=XXX]
+	Limit exported symbols using libtool.  The configure script
+	automatically chooses an appropriate ".sym" file, which lists the
+	symbols which are part of the ABI.
+
+    --with-extra-suffix[=XXX]
+	Add the given suffix to header- and library-names to simplify
+	installing incompatible ncurses libraries, e.g., those using a
+	different ABI.  The renaming affects the name of the
+	include-subdirectory if --disable-overwrite is given.
+
+    --with-fallbacks=XXX
+	Specify a list of fallback terminal descriptions which will be
+	compiled into the ncurses library.  See CONFIGURING FALLBACK ENTRIES.
+
+	See also "--with-tic-path" and "--with-infocmp-path".
+
+    --with-form-libname=NAME
+	Override the basename of the form library (default: "form")
+
+    --with-gpm
+	use Alessandro Rubini's GPM library to provide mouse support on the
+	Linux console.  Prior to ncurses 5.5, this introduced a dependency on
+	the GPM library.
+
+	Currently ncurses uses the dlsym() function to bind to the library at
+	runtime, so it is only necessary that the library be present when
+	ncurses is built, to obtain the filename (or soname) used in the
+	corresponding dlopen() call.  If you give a value for this option,
+	e.g.,
+
+		--with-gpm=$HOME/tmp/test-gpm.so
+
+	that overrides the configure check for the soname.
+
+	See also --without-dlsym
+
+    --with-hashed-db[=XXX]
+	Use a hashed database for storing terminfo data rather than storing
+	each compiled entry in a separate binary file within a directory
+	tree.
+
+	In particular, this uses the Berkeley database 1.8.5 interface, as
+	provided by that and its successors db 2, 3, and 4.  The actual
+	interface is slightly different in the successor versions of the
+	Berkeley database.  The database should have been configured using
+	"--enable-compat185".
+
+	If you use this option for configuring ncurses, tic will only be able
+	to write entries in the hashed database.  infocmp can still read
+	entries from a directory tree as well as reading entries from the
+	hashed database.  To do this, infocmp determines whether the $TERMINFO
+	variable points to a directory or a file, and reads the directory-tree
+	or hashed database respectively.
+
+	You cannot have a directory containing both hashed-database and
+	filesystem-based terminfo entries.
+
+	Use the parameter value to give the install-prefix used for the
+	database, e.g.,
+		--with-hashed-db=/usr/local/BigBase
+	to find the corresponding include- and lib-directories under the
+	given directory.  Alternatively, you can specify a directory leaf
+	name, e.g.,
+		--with-hashed-db=db4
+	to make the configure script look for files in a subdirectory such as
+		/usr/include/db4/db.h
+		/usr/lib/db4/libdb.so
+
+	See also the --enable-getcap option.
+
+    --with-infocmp-path[=XXX]
+	Use this option to override the automatic detection of tic in your
+	$PATH when building fallbacks (see "--with-fallbacks").
+
+    --with-install-prefix=XXX
+	Allows you to specify an alternate location for installing ncurses
+	after building it.  The value you specify is prepended to the "real"
+	install location.  This simplifies making binary packages.  The
+	makefile variable DESTDIR is set by this option.  It is also possible
+	to use
+		make install DESTDIR=XXX
+	since the makefiles pass that variable to subordinate makes.
+
+	NOTE: a few systems build shared libraries with fixed pathnames; this
+	option probably will not work for those configurations.
+
+    --with-lib-prefix=XXX
+	OS/2 EMX used a different naming convention from most Unix-like
+	platforms.  It required that the "lib" part of a library name was
+	omitted.  Newer EMX as part of eComStation does not follow that
+	convention.  Use this option to override the configure script's
+	assumptions about the library-prefix.  If this option is omitted, it
+	uses the original OS/2 EMX convention for that platform.  Use
+	"--with-lib-prefix=lib" for the newer EMX in eComStation.  Use
+	"--without-lib-prefix" to suppress it for other odd platforms.
+
+    --with-libtool[=XXX]
+	Generate libraries with libtool.  If this option is selected, then it
+	overrides all other library model specifications.  Note that libtool
+	must already be installed, uses makefile rules dependent on GNU make,
+	and does not promise to follow the version numbering convention of
+	other shared libraries on your system.  However, if the --with-shared
+	option does not succeed, you may get better results with this option.
+
+	If a parameter value is given, it must be the full pathname of the
+	particular version of libtool, e.g.,
+		/usr/bin/libtool-1.2.3
+
+	It is possible to rebuild the configure script to use the automake
+	macros for libtool, e.g., AC_PROG_LIBTOOL.  See the comments in
+	aclocal.m4 for CF_PROG_LIBTOOL, and ensure that you build configure
+	using the appropriate patch for autoconf from
+		https://invisible-island.net/autoconf/
+
+    --with-libtool-opts=XXX
+	Allow user to pass additional libtool options into the library creation
+	and link steps.  The main use for this is to do something like
+		./configure --with-libtool-opts=-static
+	to get the same behavior as automake-flavored
+		./configure --enable-static
+
+    --with-manpage-aliases
+	Tell the configure script you wish to create entries in the
+	man-directory for aliases to manpages which list them, e.g., the
+	functions in the panel manpage.  This is the default.  You can disable
+	it if your man program does this.  You can also disable
+	--with-manpage-symlinks to install files containing a ".so" command
+	rather than symbolic links.
+
+    --with-manpage-format=XXX
+	Tell the configure script how you would like to install man-pages.  The
+	option value must be one of these:  gzip, compress, BSDI, normal,
+	formatted.  If you do not give this option, the configure script
+	attempts to determine which is the case.
+
+    --with-manpage-renames=XXX
+	Tell the configure script that you wish to rename the manpages while
+	installing.  Currently the only distribution which does this is Debian.
+	The option value specifies the name of a file that lists the renamed
+	files, e.g., $srcdir/man/man_db.renames
+
+    --with-manpage-symlinks
+	Tell the configure script that you wish to make symbolic links in the
+	man-directory for aliases to the man-pages.  This is the default, but
+	can be disabled for systems that provide this automatically.  Doing
+	this on systems that do not support symbolic links will result in
+	copying the man-page for each alias.
+
+    --with-manpage-tbl
+	Tell the configure script that you wish to preprocess the manpages
+	by running them through tbl to generate tables understandable by
+	nroff.
+
+    --with-menu-libname=NAME
+	Override the basename of the menu library (default: "menu")
+
+    --with-mmask-t=TYPE
+	Override type of mmask_t, which stores the mouse mask.  Prior to
+	ncurses 5.5, this was always unsigned long, but with ncurses 5.5, it
+	may be unsigned.  Use this option if you need to preserve compatibility
+	with 64-bit executables.
+
+    --with-normal
+	Generate normal (i.e., static) libraries (default).
+
+	Note:  on Linux, the configure script will attempt to use the GPM
+	library via the dlsym() function call.  Use --without-dlsym to disable
+	this feature, or --without-gpm, depending on whether you wish to use
+	GPM.
+
+    --with-ospeed=TYPE
+	Override type of ospeed variable, which is part of the termcap
+	compatibility interface.  In termcap, this is a 'short', which works
+	for a wide range of baudrates because ospeed is not the actual speed
+	but the encoded value, e.g., B9600 would be a small number such as 13.
+	However the encoding scheme originally allowed for values "only" up to
+	38400bd.  A newer set of definitions past 38400bd is not encoded as
+	compactly, and is not guaranteed to fit into a short (see the function
+	cfgetospeed(), which returns a speed_t for this reason).  In practice,
+	applications that required knowledge of the ospeed variable, i.e.,
+	those using termcap, do not use the higher speeds.  Your application
+	(or system, in general) may or may not.
+
+    --with-panel-libname=NAME
+	Override the basename of the panel library (default: "panel")
+
+    --with-pc-suffix=SUFFIX
+	If ".pc" files are installed, optionally add a suffix to the files
+	and corresponding package names to separate unusual configurations.
+	If no option value is given (or if it is "none"), no suffix is added.
+
+    --with-pcre2
+	Add PCRE2 (Perl-compatible regular expressions v2) to the build if it
+	is available and the user requests it.  Assume the application will
+	otherwise use the POSIX interface.
+
+	This is useful for MinGW builds because the usual POSIX interface is
+	not supplied by the development environment, while ncurses' form
+	library uses a regular expression feature for one of the field types.
+
+    --with-pkg-config=[DIR]
+	Check for pkg-config, optionally specifying its path.
+
+    --with-pkg-config-libdir=[DIR]
+	If pkg-config was found, override the automatic check for its library
+	path.  The configure script allows only a single directory, because
+	that is used as the directory in which to install ".pc" files.
+
+	The automatic check for the library path prefers the first directory
+	which currently exists.  If none of the directories listed by
+	pkg-config exist, the check prefers a pkgconfig directory under the
+	"libdir" set by the configure script (which may not be the system
+	default), or if pkg-config lists nothing suitable, the first one which
+	is listed by pkg-config is used.
+
+	Automatic selection is overridden by providing an option-value
+	beginning with "/".
+
+	If this option is omitted, the default directory for installing
+	".pc" files is ${libdir}/pkgconfig
+
+    --with-profile
+	Generate profile-libraries These are named by adding "_p" to the root,
+	e.g., libncurses_p.a
+
+    --with-pthread
+	Link with POSIX threads, set --enable-reentrant.  The use_window() and
+	use_screen() functions will use mutex's, allowing rudimentary support
+	for multithreaded applications.
+
+    --with-rcs-ids
+	Compile-in RCS identifiers.  Most of the C files have an identifier.
+
+    --with-rel-version=NUM
+	Override the release version, which may be used in shared library
+	filenames.  This consists of a major and minor version number separated
+	by ".".  Normally the major version number is the same as the ABI
+	version; some ports have special requirements for compatibility.
+
+    --with-shared
+	Generate shared-libraries.  The names given depend on the system for
+	which you are building, typically using a ".so" suffix, along with
+	symbolic links that refer to the release version.
+
+	NOTE: Unless you override the configure script by setting the $CFLAGS
+	environment variable, these will not be built with the -g debugging
+	option.
+
+	NOTE: For some configurations, e.g., installing a new version of
+	ncurses shared libraries on a machine which already has ncurses
+	shared libraries, you may encounter problems with the linker.
+	For example, it may prevent you from running  the build tree's
+	copy of tic (for installing the terminfo database) because it
+	loads the system's copy of the ncurses shared libraries.
+
+	In that case, using the misc/shlib script may be helpful, since it
+	sets $LD_LIBRARY_PATH to point to the build tree, e.g.,
+
+		./misc/shlib make install
+
+	Alternatively, for most platforms, the linker accepts a list of
+	directories which will be searched for libraries at run-time.  The
+	configure script allows you to modify this list using the
+	RPATH_LIST environment variable.  It is a colon-separated list of
+	directories (default:  the "libdir" set via the configure script).
+	If you set that to put "../lib" first in the list, the linker will
+	look first at the build-directory, and avoid conflict with libraries
+	already installed.  One drawback to this approach is that libraries
+	can be accidentally searched in any "../lib" directory.
+
+	NOTE: If you use the --with-ada-sharedlib option, you should also
+	set this option, to ensure that C-language modules needed for the
+	Ada binding use appropriate compiler options.
+
+    --with-shlib-version=XXX
+	Specify whether to use the release or ABI version for shared libraries.
+	This is normally chosen automatically based on the type of system
+	which you are building on.  We use it for testing the configure script.
+
+    --with-sysmouse
+	use FreeBSD sysmouse interface provide mouse support on the console.
+
+    --with-system-type=XXX
+	For testing, override the derived host system-type which is used to
+	decide things such as the linker commands used to build shared
+	libraries.  This is normally chosen automatically based on the type of
+	system which you are building on.  We use it for testing the configure
+	script.
+
+    --with-terminfo-dirs=XXX
+	Specify a search-list of terminfo directories which will be compiled
+	into the ncurses library (default: DATADIR/terminfo)
+
+	This is a colon-separated list, like the TERMINFO_DIRS environment
+	variable.
+
+    --with-termlib[=XXX]
+	When building the ncurses library, organize this as two parts:  the
+	curses library (libncurses) and the low-level terminfo library
+	(libtinfo).  This is done to accommodate applications that use only
+	the latter.  The terminfo library is about half the size of the total.
+
+	If an option value is given, that overrides the name of the terminfo
+	library.  For instance, if the wide-character version is built, the
+	terminfo library would be named libtinfow.  But the libtinfow interface
+	is upward compatible from libtinfo, so it would be possible to overlay
+	libtinfo.so with a "wide" version of libtinfow.so by renaming it with
+	this option.
+
+    --with-termpath=XXX
+	Specify a search-list of termcap files which will be compiled into the
+	ncurses library (default:  /etc/termcap:/usr/share/misc/termcap)
+
+    --with-tic-path[=XXX]
+	Use this option to override the automatic detection of tic in your
+	$PATH when building fallbacks (see "--with-fallbacks").
+
+    --with-ticlib[=XXX]
+	When building the ncurses library, build a separate library for
+	the modules that are used only by the utility programs.  Normally
+	those would be bundled with the termlib or ncurses libraries.
+
+	If an option value is given, that overrides the name of the tic
+	library.  As in termlib, there is no ABI difference between the
+	"wide" libticw.so and libtic.so
+
+	NOTE: Overriding the name of the tic library may be useful if you are
+	also using the --with-termlib option to rename libtinfo.  If you are
+	not doing that, renaming the tic library can result in conflicting
+	library dependencies for tic and other programs built with the tic
+	library.
+
+    --with-tparm-arg[=XXX]
+	Override the type used for tparm() arguments, which normally is a
+	"long".  However the function must assume that its arguments can hold a
+	pointer to char's which is not always workable for 64-bit platforms.  A
+	better choice would be intptr_t, which was not available at the time
+	tparm's interface was defined.
+
+	If the option is not given, this defaults to "long".
+
+    --with-trace
+	Configure the trace() function as part of the all models of the ncurses
+	library.  Normally it is part of the debug (libncurses_g) library only.
+
+    --with-valgrind
+	For testing, compile with debug option.
+	This also sets the --disable-leaks option.
+
+    --with-versioned-syms[=XXX]
+	The Solaris, GNU and reportedly some other linkers (ld) accept a
+	"--version-script" option which tells the linker to annotate the
+	resulting objects with version identifiers.
+
+	Use "objdump -T" on a library to see the annotations.
+
+	The configure script attempts to automatically apply a suitable ".map"
+	file to provide this information for Linux.  Solaris mapfiles differ:
+
+	a) comments are not accepted
+	b) wildcards are not accepted, except for a special case of "_*".
+	c) each symbol listed in the map file must exist in the library
+
+	The Solaris limitations conflict with the development goal of providing
+	a small set of ".map" files as examples, which cover the most common
+	configurations.  Because that coverage is done by merging together
+	several builds, some symbols will be listed in the the ".map" files
+	that do not happen to be present in one configuration or another.
+
+	The sample ".map" (and ".sym") files are generated using a set of
+	scripts which build several configurations for each release version,
+	checking to see which of the "_nc_" symbols can be made local.  In
+	addition to the ncurses libraries and programs, the symbols used
+	by the "tack" program before version 1.08 are made global.
+
+	These sample ".map" files will not cover all possible combinations.
+	In some cases, e.g., when using the --with-weak-symbols option, you
+	may prefer to use a different ".map" file by setting this option's
+	value.
+
+    --with-wrap-prefix=XXX
+	When using the --enable-reentrant option, ncurses redefines variables
+	that would be global in curses, e.g., LINES, as a macro that calls a
+	"wrapping" function which fetches the data from the current SCREEN
+	structure.  Normally that function is named by prepending "_nc_" to the
+	variable's name.  The function is technically private (since portable
+	applications would not refer directly to it).  But according to one
+	line of reasoning, it is not the same type of "private" as functions
+	which applications should not call even via a macro.  This configure
+	option lets you choose the prefix for these wrapped variables.
+
+    --with-x11-rgb=FILE
+	Provide a pathname for the X11 rgb file, used by the picsmap program.
+	This overrides a configure check which usually works, but is needed
+	due to the lack of standardization for X11's files.
+
+    --with-xterm-kbs=XXX
+	Configure xterm's terminfo entries to use either BS (^H, i.e., ASCII
+	backspace) or DEL (^?, or 127).  XXX can be BS (or bs, 8) or DEL
+	(or del, 127).
+
+	During installation, the makefile and scripts modifies the "xterm+kbs"
+	terminfo entry to use this setting.
+
+    --without-ada
+	Suppress the configure script's check for Ada95, do not build the
+	Ada95 binding and related demo.
+
+    --without-curses-h
+	Don't install the ncurses header with the name "curses.h".  Rather,
+	install as "ncurses.h" and modify the installed headers and manpages
+	accordingly.
+
+	Likewise, do not install an alias "curses" for the ncurses manpage.
+
+    --without-cxx
+	XSI curses declares "bool" as part of the interface.  C++ also declares
+	"bool".  Neither specifies the size and type of booleans, but both
+	insist on the same name.  We chose to accommodate this by making the
+	configure script check for the size and type (e.g., unsigned or signed)
+	that your C++ compiler uses for booleans.  If you do not wish to use
+	ncurses with C++, use this option to tell the configure script to not
+	adjust ncurses bool to match C++.
+
+    --without-cxx-binding
+	Suppress the configure script's check for C++, do not build the
+	C++ binding and related demo.
+
+    --without-develop
+	Disable development options.  This does not include those that change
+	the interface, such as --enable-widec.
+
+    --without-dlsym
+	Do not use dlsym() to load GPM dynamically.
+
+    --without-manpages
+	Tell the configure script to suppress the install of ncurses' manpages.
+
+    --without-progs
+	Tell the configure script to suppress the build of ncurses' application
+	programs (e.g., tic).  The test applications will still be built if you
+	type "make", though not if you simply do "make install".
+
+    --without-tack
+	Suppress build/install with tack program, if it happens to be
+	in the same build-tree (tack was moved out of the ncurses source-tree
+	in 20070203).
+
+    --without-tests
+	Tell the configure script to suppress the build of ncurses' test
+	programs.
+
+    --without-xterm-new
+	Tell the configure script to use "xterm-old" for the entry used in
+	the terminfo database.  This will work with variations such as
+	X11R5 and X11R6 xterm.
+
+
+COMPATIBILITY WITH OLDER RELEASES:
+---------------------------------
+
+    Because ncurses implements X/Open Curses, its interface is fairly stable.
+    That does not mean the interface does not change.  Changes are made to the
+    documented interfaces when we find differences between ncurses and X/Open
+    or implementations which largely correspond to X/Open (such as Solaris).
+    We add extensions to those interfaces to solve problems not addressed by
+    the original curses design, but those must not conflict with the X/Open
+    documentation.
+
+    Here are some of the major interface changes, and related problems which
+    you may encounter when building a system with different versions of
+    ncurses:
+
+    6.4 (Dec 31, 2022)
+	Interface changes:
+
+	+ none
+
+	Added extensions:
+
+	+ none
+
+	Added internal functions (other than "_sp" variants):
+
+	+ add _nc_free_termtype1 and _nc_free_tparm, for memory-leaks
+
+	Removed internal functions:
+
+	+ none
+
+	Modified internal functions:
+
+	+ none
+
+    6.3 (Oct 21, 2021)
+	Interface changes:
+
+	+ the definition of TERMTYPE2 is now internal, not visible in the ABI,
+	  like the enclosing TERMINAL which was previously made opaque.  This
+	  was done to provide SCREEN-specific "static" variables in terminfo.
+
+	Added extensions:
+
+	+ add sp-funcs for erasewchar, killwchar.
+
+	Added internal functions (other than "_sp" variants):
+
+	+ _nc_safe_fopen and _nc_safe_open3 limit privileges if possible when
+	  opening a file; otherwise disallow access for updating files.
+
+	+ _nc_tiparm is a variant of tiparm which is used when all of the
+	  parameters are known to be numbers rather than possibly strings.
+
+	+ _nc_reset_tparm improves tic's checks by resetting the terminfo
+	  "static variables" before calling functions which may update them.
+
+	Removed internal functions:
+
+	+ none
+
+	Modified internal functions:
+
+	+ _nc_trace_ttymode passes pointer to const data
+
+	+ _nc_tparm_analyze passes pointer to int*, not int[]
+
+    6.2 (Feb 12, 2020)
+	Interface changes:
+
+	+ the terminal database must be compiled with ncurses 6.2 tic;
+	  older versions of tic/infocmp will not work.  Aside from that,
+	  the compiled database will work with older applications.
+
+	+ "*.pc" and "ncurses*-config" files give the same information.
+
+	+ vwprintw and vwscanw are deprecated.
+
+	Added extensions:
+
+	+ These make it simpler to substitute a debug-configuration of the
+	  library for non-debug:
+		curses_trace
+		exit_curses
+		exit_terminfo
+
+	Added internal functions (other than "_sp" variants):
+
+	+ These provide fast-lookup of common user-defined capabilities:
+		_nc_find_user_entry
+		_nc_get_userdefs_table
+		_nc_get_hash_user
+
+	+ This is added to work around compiler-warnings:
+		_nc_fmt_funcptr
+
+	Removed internal functions:
+
+	+ _nc_import_termtype
+
+	Modified internal functions:
+
+	+ _nc_reserve_pairs no longer returns a value
+
+    6.1 (Jan 27, 2018)
+	Interface changes:
+
+	+ X/Open Curses specifies a "reserved" void* parameter in several
+	  functions, saying that it must be NULL.  In this release, if the
+	  parameter is non-NULL, it is interpreted as a point to an integer
+	  containing a color pair.  In previous releases, a non-NULL parameter
+	  caused an error return.  Portable applications are unaffected.  Here
+	  are the functions which have been extended:
+		attr_get
+		attr_off
+		attr_on
+		attr_set
+		chgat
+		color_set
+		mvchgat
+		mvwchgat
+		slk_attr_off
+		slk_attr_on
+		slk_attr_set
+		wattr_get
+		wattr_on
+		wattr_off
+		wattr_set
+		wchgat
+		wcolor_set
+
+	+ the TERMINAL structure declared in <term.h> has been made opaque,
+	  and its size increased to handle the increased size of color pair
+	  and color value, as well as other numeric capabilities.
+
+	  A few applications required change, e.g., to use def_prog_mode;
+	  only one application (tack) is known to have a valid reason for
+	  accessing these internal details, and that was addressed by the
+	  release of tack 1.08 in 2017.  Internal functions marked as used
+	  by tack will be deprecated in future releases.
+
+	Added extensions:
+
+	+ Several new functions were added to manipulate extended color pairs
+	  and color values.  These include:
+		alloc_pair
+		extended_color_content
+		extended_pair_content
+		extended_slk_color
+		find_pair
+		free_pair
+		init_extended_color
+		init_extended_pair
+		reset_color_pairs
+
+	  as well as corresponding sp-functions.
+
+	+ A new terminfo capability "RGB" tells the ncurses library that the
+	  color values are red/green/blue, to eliminate the need for palettes
+	  in that special case for the color_content function.
+
+	Added internal functions (other than "_sp" variants):
+		_nc_copy_termtype2
+		_nc_export_termtype2
+		_nc_fallback2
+		_nc_find_prescr
+		_nc_forget_prescr
+		_nc_free_termtype2
+		_nc_read_entry2
+		_nc_write_object
+
+	Removed internal functions:
+		_nc_check_termtype
+		_nc_resolve_uses
+
+	Modified internal functions:
+
+	+ symbols are used by tic/infocmp/toe:
+		_nc_align_termtype - change parameters to TERMTYPE2*
+		_nc_check_termtype2 - change parameter to TERMTYPE2*
+		_nc_read_file_entry - change parameter to TERMTYPE2*
+		_nc_read_termtype - change parameter to TERMTYPE2*
+		_nc_trim_sgr0 - change parameter to TERMTYPE2*
+		_nc_write_entry - change parameter to TERMTYPE2*
+
+	+ symbols used only within the library:
+		_nc_fallback - change return type to TERMTYPE2*
+		_nc_init_termtype - change parameter to TERMTYPE2*
+
+    6.0 (Aug 08, 2015)
+	Interface changes:
+
+	+ The 6.0 ABI modifies the defaults for these configure options:
+	   --enable-const
+	   --enable-ext-colors
+	   --enable-ext-mouse
+	   --enable-ext-putwin
+	   --enable-interop
+	   --enable-lp64
+	   --enable-sp-funcs
+	   --with-chtype=uint32_t
+	   --with-mmask_t=uint32_t
+	   --with-tparm-arg=intptr_t
+
+	+ ncurses supports symbol versioning.  If you use this feature, about
+	  half of the "_nc_" private symbols are changed to local symbols.
+
+	+ a few applications may need to explicitly flush the standard output
+	  when switching between printf's and (curses) printw.
+
+	Added extensions:
+
+	+ use_tioctl is an improvement over use_env
+
+	+ added wgetdelay to support the NCURSES_OPAQUE feature.
+
+	Added internal functions (other than "_sp" variants):
+		_nc_init_termtype
+		_nc_mvcur
+		_nc_putchar
+		_nc_setenv_num
+		_nc_trace_mmask_t
+
+	Removed internal functions:
+		none
+
+	Modified internal functions:
+		_nc_do_color - change parameters from short/bool to int
+		_nc_keypad - change parameter from bool to int
+		_nc_setupscreen - change parameter from bool to int
+		_nc_signal_handler - change parameter from bool to int
+
+    5.9 (Apr 04, 2011)
+    5.8 (Feb 26, 2011)
+	Interface changes:
+
+	+ add an alternate library configuration, i.e., "terminal driver" to
+	  support port to Windows, built with MinGW.  There are two drivers
+	  (terminfo and Windows console).  The terminfo driver works on other
+	  platforms.
+
+	+ add a new set of functions which accept a SCREEN* parameter, in
+	  contrast with the original set which use the global value "sp".
+	  By default, these names end with "_sp", and are otherwise
+	  functionally identical with the originals.
+
+	  In addition to the "_sp" functions, there are a few new functions
+	  associated with this feature:  ceiling_panel, ground_panel,
+	  new_prescr.
+
+	  If the library is not built with the sp-funcs extension, there
+	  are no related interface changes.
+
+	+ add tiparm function based on review of X/Open Curses Issue 7.
+
+	+ change internal _nc_has_mouse function to public has_mouse function
+
+	Added extensions:
+
+	+ add a few more functions to support the NCURSES_OPAQUE feature:
+	  get_escdelay, is_pad, is_subwin
+
+	Added internal functions (other than "_sp" variants):
+		_nc_curscr_of
+		_nc_format_slks
+		_nc_get_alias_table
+		_nc_get_hash_info
+		_nc_insert_wch
+		_nc_newscr_of
+		_nc_outc_wrapper
+		_nc_retrace_char
+		_nc_retrace_int_attr_t
+		_nc_retrace_mmask_t
+		_nc_setup_tinfo
+		_nc_stdscr_of
+		_nc_tinfo_cmdch
+
+	Removed internal functions:
+		_nc_makenew (some configurations replace by _nc_makenew_sp)
+
+	Modified internal functions:
+		_nc_UpdateAttrs
+		_nc_get_hash_table
+		_nc_has_mouse
+		_nc_insert_ch
+		_nc_wgetch
+
+    5.7 (November 2, 2008)
+	Interface changes:
+
+	+ generate linkable stubs for some macros:
+		getattrs
+
+	+ Add new library configuration for tic-library (the non-curses portion
+	  of the ncurses library used for the tic program as well as some
+	  others such as tack.  There is no API change, but makefiles would be
+	  changed to use the tic-library built separately.
+
+	  tack, distributed separately from ncurses, uses some of the internal
+	  _nc_XXX functions, which are declared in the tic.h header file.
+
+	  The reason for providing this separate library is that none of the
+	  functions in it are suitable for threaded applications.
+
+	+ Add new library configuration (ncursest, ncurseswt) which provides
+	  rudimentary support for POSIX threads.  This introduces opaque
+	  access functions to the WINDOW structure and adds a parameter to
+	  several internal functions.
+
+	+ move most internal variables (except tic-library) into data blocks
+	  _nc_globals and _nc_prescreen to simplify analysis.  Those were
+	  globally accessible, but since they were not part of the documented
+	  API, there is no ABI change.
+
+	+ changed static tables of strings to be indices into long strings, to
+	  improve startup performance.  This changes parameter lists for some
+	  of the internal functions.
+
+	Added extensions:
+
+	+ add NCURSES_OPAQUE definition in curses.h to control whether internal
+	  details of the WINDOW structure are visible to an application.  This
+	  is always defined when the threaded library is built, and is optional
+	  otherwise.  New functions for this:  is_cleared, is_idcok, is_idlok,
+	  is_immedok, is_keypad, is_leaveok, is_nodelay, is_notimeout,
+	  is_scrollok, is_syncok, wgetparent and wgetscrreg.
+
+	+ the threaded library (ncursest) also disallows direct updating of
+	  global curses-level variables, providing functions (via macros) for
+	  obtaining their value.  A few of those variables can be modified by
+	  the application, using new functions:  set_escdelay, set_tabsize
+
+	+ added functions use_window() and use_screen() which wrap a mutex
+	  (if threading is configured) around a call to a user-supplied
+	  function.
+
+	Added internal functions:
+		_nc_get_alias_table
+		_nc_get_screensize
+		_nc_keyname
+		_nc_screen_of
+		_nc_set_no_padding
+		_nc_tracechar
+		_nc_tracemouse
+		_nc_unctrl
+		_nc_ungetch
+
+		These are used for leak-testing, and are stubs for
+		ABI compatibility when ncurses is not configured for that
+		using the --disable-leaks configure script option:
+
+		_nc_free_and_exit
+		_nc_leaks_tinfo
+
+	Removed internal functions:
+		none
+
+	Modified internal functions:
+		_nc_fifo_dump
+		_nc_find_entry
+		_nc_handle_sigwinch
+		_nc_init_keytry
+		_nc_keypad
+		_nc_locale_breaks_acs
+		_nc_timed_wait
+		_nc_update_screensize
+
+		Use new typedef TRIES to replace "struct tries":
+
+		_nc_add_to_try
+		_nc_expand_try
+		_nc_remove_key
+		_nc_remove_string
+		_nc_trace_tries
+
+    5.6 (December 17, 2006)
+	Interface changes:
+
+	+ generate linkable stubs for some macros:
+
+	  getbegx, getbegy, getcurx, getcury, getmaxx, getmaxy, getparx,
+	  getpary, getpary,
+
+	  and (for libncursesw)
+
+	  wgetbkgrnd
+
+	Added extensions:
+		nofilter()
+		use_legacy_coding()
+
+	Added internal functions:
+		_nc_first_db
+		_nc_get_source
+		_nc_handle_sigwinch
+		_nc_is_abs_path
+		_nc_is_dir_path
+		_nc_is_file_path
+		_nc_keep_tic_dir
+		_nc_keep_tic_dir
+		_nc_last_db
+		_nc_next_db
+		_nc_read_termtype
+		_nc_tic_dir
+
+		Also (if using the hashed database configuration):
+
+		_nc_db_close
+		_nc_db_first
+		_nc_db_get
+		_nc_db_have_data
+		_nc_db_have_index
+		_nc_db_next
+		_nc_db_open
+		_nc_db_put
+
+		otherwise
+
+		_nc_hashed_db
+
+	Removed internal functions:
+		none
+
+	Modified internal functions:
+		_nc_add_to_try
+		_nc_do_color
+		_nc_expand_try
+		_nc_remove_key
+		_nc_setupscreen
+
+    5.5 (October 10, 2005)
+	Interface changes:
+
+	+ terminfo installs "xterm-new" as "xterm" entry rather than
+	  "xterm-old" (aka xterm-r6).
+
+	+ terminfo data is installed using the tic -x option (few systems
+	  still use ncurses 4.2).
+
+	+ modify C++ binding to work with newer C++ compilers by providing
+	  initializers and using modern casts.  Old-style header names are
+	  still used in this release to allow compiling with not-so-old
+	  compilers.
+
+	+ form and menu libraries now work with wide-character data.
+	  Applications which bypassed the form library and manipulated the
+	  FIELD.buf data directly will not work properly with libformw, since
+	  that no longer points to an array of char.  The set_field_buffer()
+	  and field_buffer() functions translate to/from the actual field
+	  data.
+
+	+ change SP->_current_attr to a pointer, adjust ifdef's to ensure that
+	  libtinfo.so and libtinfow.so have the same ABI.  The reason for this
+	  is that the corresponding data which belongs to the upper-level
+	  ncurses library has a different size in each model.
+
+	+ winnstr() now returns multibyte character strings for the
+	  wide-character configuration.
+
+	+ assume_default_colors() no longer requires that use_default_colors()
+	  be called first.
+
+	+ data_ahead() now works with wide-characters.
+
+	+ slk_set() and slk_wset() now accept and store multibyte or
+	  multicolumn characters.
+
+	+ start_color() now returns OK if colors have already been started.
+	  start_color() also returns ERR if it cannot allocate memory.
+
+	+ pair_content() now returns -1 for consistency with init_pair() if it
+	  corresponds to the default-color.
+
+	+ unctrl() now returns null if its parameter does not correspond
+	  to an unsigned char.
+
+	Added extensions:
+		Experimental mouse version 2 supports wheel mice with buttons
+		4 and 5.  This requires ABI 6 because it modifies the encoding
+		of mouse events.
+
+		Experimental extended colors allows encoding of 256 foreground
+		and background colors, e.g., with the xterm-256color or
+		xterm-88color terminfo entries.  This requires ABI 6 because
+		it changes the size of cchar_t.
+
+	Added internal functions:
+		_nc_check_termtype2
+		_nc_resolve_uses2
+		_nc_retrace_cptr
+		_nc_retrace_cvoid_ptr
+		_nc_retrace_void_ptr
+		_nc_setup_term
+
+	Removed internal functions:
+		none
+
+	Modified internal functions:
+		_nc_insert_ch
+		_nc_save_str
+		_nc_trans_string
+
+    5.4 (February 8, 2004)
+	Interface changes:
+
+	+ add the remaining functions for X/Open curses wide-character support.
+	  These are only available if the library is configured using the
+	  --enable-widec option.
+		pecho_wchar()
+		slk_wset()
+
+	+ write getyx() and related 2-return macros in terms of getcury(),
+	  getcurx(), etc.
+
+	+ simplify ifdef for bool declaration in curses.h
+
+	+ modify ifdef's in curses.h that disabled use of __attribute__() for
+	  g++, since recent versions implement the cases which ncurses uses.
+
+	+ change some interfaces to use const:
+		define_key()
+		mvprintw()
+		mvwprintw()
+		printw()
+		vw_printw()
+		winsnstr()
+		wprintw()
+
+	Added extensions:
+		key_defined()
+
+	Added internal functions:
+		_nc_get_locale()
+		_nc_insert_ch()
+		_nc_is_charable()	wide
+		_nc_locale_breaks_acs()
+		_nc_pathlast()
+		_nc_to_char()		wide
+		_nc_to_widechar()	wide
+		_nc_tparm_analyze()
+		_nc_trace_bufcat()	debug
+		_nc_unicode_locale()
+
+	Removed internal functions:
+		_nc_outstr()
+		_nc_sigaction()
+
+	Modified internal functions:
+		_nc_remove_string()
+		_nc_retrace_chtype()
+
+    5.3 (October 12, 2002)
+	Interface changes:
+
+	+ change type for bool used in headers to NCURSES_BOOL, which usually
+	  is the same as the compiler's definition for 'bool'.
+
+	+ add all but two functions for X/Open curses wide-character support.
+	  These are only available if the library is configured using the
+	  --enable-widec option.  Missing functions are
+		pecho_wchar()
+		slk_wset()
+
+	+ add environment variable $NCURSES_ASSUMED_COLORS to modify the
+	  assume_default_colors() extension.
+
+	Added extensions:
+		is_term_resized()
+		resize_term()
+
+	Added internal functions:
+		_nc_altcharset_name()	debug
+		_nc_reset_colors()
+		_nc_retrace_bool()	debug
+		_nc_retrace_unsigned()	debug
+		_nc_rootname()
+		_nc_trace_ttymode()	debug
+		_nc_varargs()		debug
+		_nc_visbufn()		debug
+		_nc_wgetch()
+
+	Removed internal functions:
+		_nc_background()
+
+	Modified internal functions:
+		_nc_freeall()		debug
+
+    5.2 (October 21, 2000)
+	Interface changes:
+
+	+ revert termcap ospeed variable to 'short' (see discussion of the
+	  --with-ospeed configure option).
+
+    5.1 (July 8, 2000)
+	Interface changes:
+
+	+ made the extended terminal capabilities
+	  (configure --enable-tcap-names) a standard feature.  This should
+	  be transparent to applications that do not require it.
+
+	+ removed the trace() function and related trace support from the
+	  production library.
+
+	+ modified curses.h.in, undef'ing some symbols to avoid conflict
+	  with C++ STL.
+
+	Added extensions:  assume_default_colors().
+
+    5.0 (October 23, 1999)
+	Interface changes:
+
+	+ implemented the wcolor_set() and slk_color() functions.
+
+	+ move macro winch to a function, to hide details of struct ldat
+
+	+ corrected prototypes for slk_* functions, using chtype rather than
+	  attr_t.
+
+	+ the slk_attr_{set,off,on} functions need an additional void*
+	  parameter according to XSI.
+
+	+ modified several prototypes to correspond with 1997 version of X/Open
+	  Curses:  [w]attr_get(), [w]attr_set(), border_set() have different
+	  parameters.  Some functions were renamed or misspelled:
+	  erase_wchar(), in_wchntr(), mvin_wchntr().  Some developers have used
+	  attr_get().
+
+	Added extensions:  keybound(), curses_version().
+
+	Terminfo database changes:
+
+	+ change translation for termcap 'rs' to terminfo 'rs2', which is
+	  the documented equivalent, rather than 'rs1'.
+
+	The problems are subtler in recent releases.
+
+	a) This release provides users with the ability to define their own
+	   terminal capability extensions, like termcap.  To accomplish this,
+	   we redesigned the TERMTYPE struct (in term.h).  Very few
+	   applications use this struct.  They must be recompiled to work with
+	   the 5.0 library.
+
+	a) If you use the extended terminfo names (i.e., you used configure
+	   --enable-tcap-names), the resulting terminfo database can have some
+	   entries which are not readable by older versions of ncurses.  This
+	   is a bug in the older versions:
+
+	   + the terminfo database stores booleans, numbers and strings in
+	     arrays.  The capabilities that are listed in the arrays are
+	     specified by X/Open.  ncurses recognizes a number of obsolete and
+	     extended names which are stored past the end of the specified
+	     entries.
+
+	   + a change to read_entry.c in 951001 made the library do an lseek()
+	     call incorrectly skipping data which is already read from the
+	     string array.  This happens when the number of strings in the
+	     terminfo data file is greater than STRCOUNT, the number of
+	     specified and obsolete or extended strings.
+
+	   + as part of alignment with the X/Open final specification, in the
+	     990109 patch we added two new terminfo capabilities:
+	     set_a_attributes and set_pglen_inch).  This makes the indices for
+	     the obsolete and extended capabilities shift up by 2.
+
+	   + the last two capabilities in the obsolete/extended list are memu
+	     and meml, which are found in most terminfo descriptions for xterm.
+
+	     When trying to read this terminfo entry, the spurious lseek()
+	     causes the library to attempt to read the final portion of the
+	     terminfo data (the text of the string capabilities) 4 characters
+	     past its starting point, and reads 4 characters too few.  The
+	     library rejects the data, and applications are unable to
+	     initialize that terminal type.
+
+	   FIX: remove memu and meml from the xterm description.  They are
+	   obsolete, not used by ncurses.  (It appears that the feature was
+	   added to xterm to make it more like hpterm).
+
+	   This is not a problem if you do not use the -x option of tic to
+	   create a terminfo database with extended names.  Note that the
+	   user-defined terminal capabilities are not affected by this bug,
+	   since they are stored in a table after the older terminfo data ends,
+	   and are invisible to the older libraries.
+
+	c) Some developers did not wish to use the C++ binding, and used the
+	   configure --without-cxx option.  This causes problems if someone
+	   uses the ncurses library from C++ because that configure test
+	   determines the type for C++'s bool and makes ncurses match it, since
+	   both C++ and curses are specified to declare bool.  Calling ncurses
+	   functions with the incorrect type for bool will cause execution
+	   errors.  In 5.0 we added a configure option "--without-cxx-binding"
+	   which controls whether the binding itself is built and installed.
+
+    4.2 (March 2, 1998)
+	Interface changes:
+
+	+ correct prototype for termattrs() as per XPG4 version 2.
+
+	+ add placeholder prototypes for color_set(), erasewchar(),
+	  term_attrs(), wcolor_set() as per XPG4 version 2.
+
+	+ add macros getcur[xy] getbeg[xy] getpar[xy], which are defined in
+	  SVr4 headers.
+
+	New extensions: keyok() and define_key().
+
+	Terminfo database changes:
+
+	+ corrected definition in curses.h for ACS_LANTERN, which was 'I'
+	  rather than 'i'.
+
+    4.1 (May 15, 1997)
+
+	We added these extensions:  use_default_colors().  Also added
+	configure option --enable-const, to support the use of const where
+	X/Open should have, but did not, specify.
+
+	The terminfo database content changed the representation of color for
+	most entries that use ANSI colors.  SVr4 curses treats the setaf/setab
+	and setf/setb capabilities differently, interchanging the red/blue
+	colors in the latter.
+
+    4.0 (December 24, 1996)
+
+	We bumped to version 4.0 because the newly released Linux dynamic
+	loader (ld.so.1.8.5) did not load shared libraries whose ABI and REL
+	versions were inconsistent.  At that point, ncurses ABI was 3.4 and the
+	REL was 1.9.9g, so we made them consistent.
+
+    1.9.9g (December 1, 1996)
+
+	This fixed most of the problems with 1.9.9e, and made these interface
+	changes:
+
+	+ remove tparam(), which had been provided for compatibility with
+	  some termcap.  tparm() is standard, and does not conflict with
+	  application's fallback for missing tparam().
+
+	+ turn off hardware echo in initscr().  This changes the sense of the
+	  echo() function, which was initialized to echoing rather than
+	  nonechoing (the latter is specified).  There were several other
+	  corrections to the terminal I/O settings which cause applications to
+	  behave differently.
+
+	+ implemented several functions (such as attr_on()) which were
+	  available only as macros.
+
+	+ corrected several typos in curses.h.in (i.e., the mvXXXX macros).
+
+	+ corrected prototypes for delay_output(),
+	  has_color, immedok() and idcok().
+
+	+ corrected misspelled getbkgd().  Some applications used the
+	  misspelled name.
+
+	+ added _yoffset to WINDOW.  The size of WINDOW does not impact
+	  applications, since they use only pointers to WINDOW structs.
+
+	These changes were made to the terminfo database:
+
+	+ removed boolean 'getm' which was available as an extended name.
+
+	We added these extensions: wresize(), resizeterm(), has_key() and
+	mcprint().
+
+    1.9.9e (March 24, 1996)
+
+	not recommended (a last-minute/untested change left the forms and
+	menus libraries unusable since they do not repaint the screen).
+	Foreground/background colors are combined incorrectly, working properly
+	only on a black background.  When this was released, the X/Open
+	specification was available only in draft form.
+
+	Some applications (such as lxdialog) were "fixed" to work with the
+	incorrect color scheme.
+
+
+FOR SYSTEM INTEGRATORS:
+----------------------
+
+    Configuration and Installation:
+
+	On platforms where ncurses is assumed to be installed in /usr/lib,
+	the configure script uses "/usr" as a default.  These include any
+	that use the Linux kernel, as well as these special cases:
+
+		FreeBSD, NetBSD, OpenBSD, Cygwin, MinGW
+
+	For other platforms, the default is "/usr/local".  See the discussion
+	of the "--disable-overwrite" option.
+
+	The location of the terminfo is set indirectly by the "--datadir"
+	configure option, e.g., /usr/share/terminfo, given a datadir of
+	/usr/share.  You may want to override this if you are installing
+	ncurses libraries in nonstandard locations, but wish to share the
+	terminfo database.
+
+	Normally the ncurses library is configured in a pure-terminfo mode;
+	that is, with the --disable-termcap option.  This makes the ncurses
+	library smaller and faster.  The ncurses library includes a termcap
+	emulation that queries the terminfo database, so even applications that
+	use raw termcap to query terminal characteristics will win (providing
+	you recompile and relink them!).
+
+	If you must configure with termcap fallback enabled, you may also wish
+	to use the --enable-getcap option.  This speeds up termcap-based
+	startups, at the expense of not allowing personal termcap entries to
+	reference the terminfo tree.  See comments in
+	ncurses/tinfo/read_termcap.c for further details.
+
+	Note that if you have $TERMCAP set, ncurses will use that value
+	to locate termcap data.  In particular, running from xterm will
+	set $TERMCAP to the contents of the xterm's termcap entry.
+	If ncurses sees that, it will not examine /etc/termcap.
+
+    Keyboard Mapping:
+
+	The terminfo file assumes that Shift-Tab generates \E[Z (the ECMA-48
+	reverse-tabulation sequence) rather than ^I.  Here are the loadkeys -d
+	mappings that will set this up:
+
+		keycode	 15 = Tab	      Tab
+			alt     keycode  15 = Meta_Tab
+			shift	keycode  15 = F26
+		string F26 ="\033[Z"
+
+    Naming the Console Terminal
+
+	In various systems there has been a practice of designating the system
+	console driver type as `console'.  Please do not do this!  It
+	complicates peoples' lives, because it can mean that several different
+	terminfo entries from different operating systems all logically want to
+	be called `console'.
+
+	Please pick a name unique to your console driver and set that up
+	in the /etc/inittab table or local equivalent.  Send the entry to the
+	terminfo maintainer (listed in the misc/terminfo file) to be included
+	in the terminfo file, if it is not already there.  See the
+	term(7) manual page included with this distribution for more on
+	conventions for choosing type names.
+
+	Here are some recommended primary console names:
+
+		linux	-- Linux console driver
+		freebsd	-- FreeBSD
+		netbsd	-- NetBSD
+		bsdos	-- BSD/OS
+
+	If you are responsible for integrating ncurses for one of these
+	distributions, please either use the recommended name or get back
+	to us explaining why you don't want to, so we can work out nomenclature
+	that will make users' lives easier rather than harder.
+
+
+MODERN XTERM VERSIONS:
+---------------------
+
+	The terminfo database file included with this distribution assumes you
+	are running a modern xterm based on XFree86 (i.e., xterm-new).  The
+	earlier X11R6 entry (xterm-r6) and X11R5 entry (xterm-r5) is provided
+	as well.  See the --without-xterm-new configure script option if you
+	are unable to update your system.
+
+
+CONFIGURING FALLBACK ENTRIES:
+----------------------------
+
+	In order to support operation of ncurses programs before the terminfo
+	tree is accessible (that is, in single-user mode or at OS installation
+	time) the ncurses library can be compiled to include an array of
+	pre-fetched fallback entries.
+
+	NOTE: This must be done on a machine which has ncurses' infocmp and
+	terminfo database installed (as well as ncurses' tic and infocmp
+	programs).  That is because the fallback sources are generated and
+	compiled into the library before the build-tree's copy of infocmp is
+	available.
+
+	These entries are checked by setupterm() only when the conventional
+	fetches from the terminfo tree and the termcap fallback (if configured)
+	have been tried and failed.  Thus, the presence of a fallback will not
+	shadow modifications to the on-disk entry for the same type, when that
+	entry is accessible.
+
+	By default, there are no entries on the fallback list.  After you have
+	built the ncurses suite for the first time, you can change the list
+	(the process needs infocmp(1)).  To do so, use the script
+	ncurses/tinfo/MKfallback.sh.  The configure script option
+	--with-fallbacks does this (it accepts a comma-separated list of the
+	names you wish, and does not require a rebuild).
+
+	If you wanted (say) to have linux, vt100, and xterm fallbacks, you
+	might use the commands
+
+		cd ncurses;
+		tinfo/MKfallback.sh \
+			$TERMINFO \
+			../misc/terminfo.src \
+			`which tic` \
+			`which infocmp` \
+			linux vt100 xterm >fallback.c
+
+	The first four parameters of the script are normally supplied by
+	the configured makefiles via the "--with-fallbacks" option.  They
+	are
+
+		1) the location of the terminfo database
+		2) the source for the terminfo entries
+		3) the location of the tic program, used to create a terminfo
+		   database.
+		4) the location of the infocmp program, used to print a terminfo
+		   description.
+
+	Then just rebuild and reinstall the library as you would normally.
+	You can restore the default empty fallback list with
+
+		tinfo/MKfallback.sh \
+			$TERMINFO \
+			../misc/terminfo.src \
+			`which tic` \
+			`which infocmp` \
+			>fallback.c
+
+	The overhead for an empty fallback list is one trivial stub function.
+	Any non-empty fallback list is const'd and therefore lives in shareable
+	text space.  You can look at the comment trailing each initializer in
+	the generated ncurses/fallback.c file to see the core cost of the
+	fallbacks.  A good rule of thumb for modern vt100-like entries is that
+	each one will cost about 2.5K of text space.
+
+
+BSD CONVERSION NOTES:
+--------------------
+
+	If you need to support really ancient BSD programs, you probably
+	want to configure with the --enable-bsdpad option.  What this does
+	is enable code in tputs() that recognizes a numeric prefix on a
+	capability as a request for that much trailing padding in milliseconds.
+	There are old BSD programs that do things like tputs("50").
+
+	(If you are distributing ncurses as a support-library component of
+	an application you probably want to put the remainder of this section
+	in the package README file.)
+
+	The following note applies only if you have configured ncurses with
+	--enable-termcap.
+
+------------------------------- CUT HERE --------------------------------
+
+If you are installing this application privately (either because you
+have no root access or want to experiment with it before doing a root
+installation), there are a couple of details you need to be aware of.
+They have to do with the ncurses library, which uses terminfo rather
+than termcap for describing terminal characteristics.
+
+Though the ncurses library is terminfo-based, it can interpret your
+TERMCAP variable (if present), any local termcap files you reference
+through it, and the system termcap file.  However, to avoid slowing
+down your application startup, it does this only once per terminal type!
+
+The first time you load a given terminal type from your termcap
+database, the library initialization code will automatically write it
+in terminfo format to a subdirectory under $HOME/.terminfo.  After
+that, the initialization code will find it there and do a (much
+faster) terminfo fetch.
+
+Usually, all this means is that your home directory will silently grow
+an invisible .terminfo subdirectory which will get filled in with
+terminfo descriptions of terminal types as you invoke them.  If anyone
+ever installs a global terminfo tree on your system, this will quietly
+stop happening and your $HOME/.terminfo will become redundant.
+
+The objective of all this logic is to make converting from BSD termcap
+as painless as possible without slowing down your application (termcap
+compilation is expensive).
+
+If you don't have a TERMCAP variable or custom personal termcap file,
+you can skip the rest of this dissertation.
+
+If you *do* have a TERMCAP variable and/or a custom personal termcap file
+that defines a terminal type, that definition will stop being visible
+to this application after the first time you run it, because it will
+instead see the terminfo entry that it wrote to $HOME/terminfo the
+first time around.
+
+Subsequently, editing the TERMCAP variable or personal TERMCAP file
+will have no effect unless you explicitly remove the terminfo entry
+under $HOME/terminfo.  If you do that, the entry will be recompiled
+from your termcap resources the next time it is invoked.
+
+To avoid these complications, use infocmp(1) and tic(1) to edit the
+terminfo directory directly.
+
+------------------------------- CUT HERE --------------------------------
+
+USING GPM:
+---------
+	Ncurses 4.1 and up can be configured to use GPM (General Purpose Mouse)
+	which is used with Linux console.  Be aware that GPM is commonly
+	installed as a shared library which contains a wrapper for the curses
+	wgetch() function (libcurses.o).  Some integrators have simplified
+	linking applications by combining all or part of libcurses.so into the
+	libgpm.so file, producing symbol conflicts with ncurses (specifically
+	the wgetch function).  This was originally the BSD curses, but
+	generally whatever curses library exists on the system.
+
+	You may be able to work around this problem by linking as follows:
+
+		cc -o foo foo.o -lncurses -lgpm -lncurses
+
+	but the linker may not cooperate, producing mysterious errors.
+	See the FAQ, as well as the discussion under the --with-gpm option:
+
+	https://invisible-island.net/ncurses/ncurses.faq.html#using_gpm_lib
+
+
+BUILDING WITH A CROSS-COMPILER:
+------------------------------
+	Ncurses can be built with a cross-compiler.  Some parts must be built
+	with the host's compiler since they are used for building programs
+	(e.g., ncurses/make_hash and ncurses/make_keys) that generate tables
+	that are compiled into the ncurses library.  The essential thing to do
+	is set the BUILD_CC environment variable to your host's compiler, and
+	run the configure script configuring for the cross-compiler.
+
+	The configure options --with-build-cc, etc., are provided to make this
+	simpler.  Since make_hash and make_keys use only ANSI C features, it
+	is normally not necessary to provide the other options such as
+	--with-build-libs, but they are provided for completeness.
+
+	Note that all of the generated source-files which are part of ncurses
+	will be made if you use
+
+		make sources
+
+	This would be useful in porting to an environment which has little
+	support for the tools used to generate the sources, e.g., sed, awk and
+	Bourne-shell.
+
+	When ncurses has been successfully cross-compiled, you may want to use
+	"make install" (with a suitable target directory) to construct an
+	install tree.  Note that in this case (as with the --with-fallbacks
+	option), ncurses uses the development platform's tic to do the "make
+	install.data" portion.
+
+	The system's tic program is used to install the terminal database,
+	even for cross-compiles.  For best results, the tic program should be
+	from the most current version of ncurses.
+
+	NOTE:  the system's tic program may use a different terminfo database
+	format than the target system.  For instance, as described in term(5),
+	the conventional terminfo layout uses a directory hierarchy with one
+	letter names, while some platforms use two-letter names to work with
+	case-insensitive filesystems.  The configure script searches for a tic
+	program using the AC_CHECK_TOOL macro, which will prefer programs
+	using the canonical host prefix in their name.  You can use this fact
+	to provide a cross-compiler support utility tic, otherwise you can
+	override the configure script's choice using --with-tic-path
+
+
+BUG REPORTS:
+-----------
+	Send any feedback to the ncurses mailing list at
+	bug-ncurses@gnu.org. To subscribe send mail to
+	bug-ncurses-request@gnu.org with body that reads:
+	subscribe ncurses <your-email-address-here>
+
+	The Hacker's Guide in the doc directory includes some guidelines
+	on how to report bugs in ways that will get them fixed most quickly.
+
+-- vile:txtmode
diff --git a/MANIFEST b/MANIFEST
new file mode 100644
index 0000000..1156b49
--- /dev/null
+++ b/MANIFEST
@@ -0,0 +1,1249 @@
+./ANNOUNCE
+./AUTHORS
+./Ada95/Makefile.in
+./Ada95/README
+./Ada95/TODO
+./Ada95/aclocal.m4
+./Ada95/configure
+./Ada95/configure.in
+./Ada95/doc/Makefile.in
+./Ada95/gen/Makefile.in
+./Ada95/gen/adacurses-config.in
+./Ada95/gen/gen.c
+./Ada95/gen/html.m4
+./Ada95/gen/normal.m4
+./Ada95/gen/table.m4
+./Ada95/gen/terminal_interface-curses-aux.ads.m4
+./Ada95/gen/terminal_interface-curses-forms-field_types.ads.m4
+./Ada95/gen/terminal_interface-curses-forms-field_user_data.ads.m4
+./Ada95/gen/terminal_interface-curses-forms-form_user_data.ads.m4
+./Ada95/gen/terminal_interface-curses-forms.ads.m4
+./Ada95/gen/terminal_interface-curses-menus-item_user_data.ads.m4
+./Ada95/gen/terminal_interface-curses-menus-menu_user_data.ads.m4
+./Ada95/gen/terminal_interface-curses-menus.ads.m4
+./Ada95/gen/terminal_interface-curses-mouse.ads.m4
+./Ada95/gen/terminal_interface-curses-panels-user_data.ads.m4
+./Ada95/gen/terminal_interface-curses-panels.ads.m4
+./Ada95/gen/terminal_interface-curses-trace.ads.m4
+./Ada95/gen/terminal_interface-curses.adb.m4
+./Ada95/gen/terminal_interface-curses.ads.m4
+./Ada95/include/MKncurses_def.sh
+./Ada95/include/Makefile.in
+./Ada95/include/ncurses_cfg.hin
+./Ada95/include/ncurses_defs
+./Ada95/make-tar.sh
+./Ada95/mk-1st.awk
+./Ada95/mk-pkg.awk
+./Ada95/package/AdaCurses-doc.spec
+./Ada95/package/AdaCurses.spec
+./Ada95/package/debian/compat
+./Ada95/package/debian/control
+./Ada95/package/debian/copyright
+./Ada95/package/debian/docs
+./Ada95/package/debian/rules
+./Ada95/package/debian/source/format
+./Ada95/package/debian/watch
+./Ada95/samples/Makefile.in
+./Ada95/samples/README
+./Ada95/samples/explain.txt
+./Ada95/samples/ncurses.adb
+./Ada95/samples/ncurses2-acs_and_scroll.adb
+./Ada95/samples/ncurses2-acs_and_scroll.ads
+./Ada95/samples/ncurses2-acs_display.adb
+./Ada95/samples/ncurses2-acs_display.ads
+./Ada95/samples/ncurses2-attr_test.adb
+./Ada95/samples/ncurses2-attr_test.ads
+./Ada95/samples/ncurses2-color_edit.adb
+./Ada95/samples/ncurses2-color_edit.ads
+./Ada95/samples/ncurses2-color_test.adb
+./Ada95/samples/ncurses2-color_test.ads
+./Ada95/samples/ncurses2-demo_forms.adb
+./Ada95/samples/ncurses2-demo_forms.ads
+./Ada95/samples/ncurses2-demo_pad.adb
+./Ada95/samples/ncurses2-demo_pad.ads
+./Ada95/samples/ncurses2-demo_panels.adb
+./Ada95/samples/ncurses2-demo_panels.ads
+./Ada95/samples/ncurses2-flushinp_test.adb
+./Ada95/samples/ncurses2-flushinp_test.ads
+./Ada95/samples/ncurses2-genericputs.adb
+./Ada95/samples/ncurses2-genericputs.ads
+./Ada95/samples/ncurses2-getch.ads
+./Ada95/samples/ncurses2-getch_test.adb
+./Ada95/samples/ncurses2-getch_test.ads
+./Ada95/samples/ncurses2-getopt.adb
+./Ada95/samples/ncurses2-getopt.ads
+./Ada95/samples/ncurses2-m.adb
+./Ada95/samples/ncurses2-m.ads
+./Ada95/samples/ncurses2-menu_test.adb
+./Ada95/samples/ncurses2-menu_test.ads
+./Ada95/samples/ncurses2-overlap_test.adb
+./Ada95/samples/ncurses2-overlap_test.ads
+./Ada95/samples/ncurses2-slk_test.adb
+./Ada95/samples/ncurses2-slk_test.ads
+./Ada95/samples/ncurses2-test_sgr_attributes.adb
+./Ada95/samples/ncurses2-test_sgr_attributes.ads
+./Ada95/samples/ncurses2-trace_set.adb
+./Ada95/samples/ncurses2-trace_set.ads
+./Ada95/samples/ncurses2-util.adb
+./Ada95/samples/ncurses2-util.ads
+./Ada95/samples/ncurses2.ads
+./Ada95/samples/rain.adb
+./Ada95/samples/rain.ads
+./Ada95/samples/sample-curses_demo-attributes.adb
+./Ada95/samples/sample-curses_demo-attributes.ads
+./Ada95/samples/sample-curses_demo-mouse.adb
+./Ada95/samples/sample-curses_demo-mouse.ads
+./Ada95/samples/sample-curses_demo.adb
+./Ada95/samples/sample-curses_demo.ads
+./Ada95/samples/sample-explanation.adb_p
+./Ada95/samples/sample-explanation.ads
+./Ada95/samples/sample-form_demo-aux.adb
+./Ada95/samples/sample-form_demo-aux.ads
+./Ada95/samples/sample-form_demo-handler.adb
+./Ada95/samples/sample-form_demo-handler.ads
+./Ada95/samples/sample-form_demo.adb
+./Ada95/samples/sample-form_demo.ads
+./Ada95/samples/sample-function_key_setting.adb
+./Ada95/samples/sample-function_key_setting.ads
+./Ada95/samples/sample-header_handler.adb
+./Ada95/samples/sample-header_handler.ads
+./Ada95/samples/sample-helpers.adb
+./Ada95/samples/sample-helpers.ads
+./Ada95/samples/sample-keyboard_handler.adb
+./Ada95/samples/sample-keyboard_handler.ads
+./Ada95/samples/sample-manifest.ads
+./Ada95/samples/sample-menu_demo-aux.adb
+./Ada95/samples/sample-menu_demo-aux.ads
+./Ada95/samples/sample-menu_demo-handler.adb
+./Ada95/samples/sample-menu_demo-handler.ads
+./Ada95/samples/sample-menu_demo.adb
+./Ada95/samples/sample-menu_demo.ads
+./Ada95/samples/sample-my_field_type.adb
+./Ada95/samples/sample-my_field_type.ads
+./Ada95/samples/sample-text_io_demo.adb
+./Ada95/samples/sample-text_io_demo.ads
+./Ada95/samples/sample.adb
+./Ada95/samples/sample.ads
+./Ada95/samples/split-path.awk
+./Ada95/samples/status.adb
+./Ada95/samples/status.ads
+./Ada95/samples/tour.adb
+./Ada95/samples/tour.ads
+./Ada95/src/Makefile.in
+./Ada95/src/c_threaded_variables.c
+./Ada95/src/c_threaded_variables.h
+./Ada95/src/c_varargs_to_ada.c
+./Ada95/src/c_varargs_to_ada.h
+./Ada95/src/library-cfg.sh
+./Ada95/src/library.gpr.in
+./Ada95/src/modules
+./Ada95/src/ncurses_compat.c
+./Ada95/src/terminal_interface-curses-aux.adb
+./Ada95/src/terminal_interface-curses-forms-field_types-alpha.adb
+./Ada95/src/terminal_interface-curses-forms-field_types-alpha.ads
+./Ada95/src/terminal_interface-curses-forms-field_types-alphanumeric.adb
+./Ada95/src/terminal_interface-curses-forms-field_types-alphanumeric.ads
+./Ada95/src/terminal_interface-curses-forms-field_types-enumeration-ada.adb
+./Ada95/src/terminal_interface-curses-forms-field_types-enumeration-ada.ads
+./Ada95/src/terminal_interface-curses-forms-field_types-enumeration.adb
+./Ada95/src/terminal_interface-curses-forms-field_types-enumeration.ads
+./Ada95/src/terminal_interface-curses-forms-field_types-intfield.adb
+./Ada95/src/terminal_interface-curses-forms-field_types-intfield.ads
+./Ada95/src/terminal_interface-curses-forms-field_types-ipv4_address.adb
+./Ada95/src/terminal_interface-curses-forms-field_types-ipv4_address.ads
+./Ada95/src/terminal_interface-curses-forms-field_types-numeric.adb
+./Ada95/src/terminal_interface-curses-forms-field_types-numeric.ads
+./Ada95/src/terminal_interface-curses-forms-field_types-regexp.adb
+./Ada95/src/terminal_interface-curses-forms-field_types-regexp.ads
+./Ada95/src/terminal_interface-curses-forms-field_types-user-choice.adb
+./Ada95/src/terminal_interface-curses-forms-field_types-user-choice.ads
+./Ada95/src/terminal_interface-curses-forms-field_types-user.adb
+./Ada95/src/terminal_interface-curses-forms-field_types-user.ads
+./Ada95/src/terminal_interface-curses-forms-field_types.adb
+./Ada95/src/terminal_interface-curses-forms-field_user_data.adb
+./Ada95/src/terminal_interface-curses-forms-form_user_data.adb
+./Ada95/src/terminal_interface-curses-forms.adb
+./Ada95/src/terminal_interface-curses-menus-item_user_data.adb
+./Ada95/src/terminal_interface-curses-menus-menu_user_data.adb
+./Ada95/src/terminal_interface-curses-menus.adb
+./Ada95/src/terminal_interface-curses-mouse.adb
+./Ada95/src/terminal_interface-curses-panels-user_data.adb
+./Ada95/src/terminal_interface-curses-panels.adb
+./Ada95/src/terminal_interface-curses-putwin.adb
+./Ada95/src/terminal_interface-curses-putwin.ads
+./Ada95/src/terminal_interface-curses-termcap.adb
+./Ada95/src/terminal_interface-curses-termcap.ads
+./Ada95/src/terminal_interface-curses-terminfo.adb
+./Ada95/src/terminal_interface-curses-terminfo.ads
+./Ada95/src/terminal_interface-curses-text_io-aux.adb
+./Ada95/src/terminal_interface-curses-text_io-aux.ads
+./Ada95/src/terminal_interface-curses-text_io-complex_io.adb
+./Ada95/src/terminal_interface-curses-text_io-complex_io.ads
+./Ada95/src/terminal_interface-curses-text_io-decimal_io.adb
+./Ada95/src/terminal_interface-curses-text_io-decimal_io.ads
+./Ada95/src/terminal_interface-curses-text_io-enumeration_io.adb
+./Ada95/src/terminal_interface-curses-text_io-enumeration_io.ads
+./Ada95/src/terminal_interface-curses-text_io-fixed_io.adb
+./Ada95/src/terminal_interface-curses-text_io-fixed_io.ads
+./Ada95/src/terminal_interface-curses-text_io-float_io.adb
+./Ada95/src/terminal_interface-curses-text_io-float_io.ads
+./Ada95/src/terminal_interface-curses-text_io-integer_io.adb
+./Ada95/src/terminal_interface-curses-text_io-integer_io.ads
+./Ada95/src/terminal_interface-curses-text_io-modular_io.adb
+./Ada95/src/terminal_interface-curses-text_io-modular_io.ads
+./Ada95/src/terminal_interface-curses-text_io.adb
+./Ada95/src/terminal_interface-curses-text_io.ads
+./Ada95/src/terminal_interface-curses-trace.adb_p
+./Ada95/src/terminal_interface.ads
+./COPYING
+./INSTALL
+./MANIFEST
+./Makefile.in
+./Makefile.os2
+./NEWS
+./README
+./README.MinGW
+./README.emx
+./TO-DO
+./VERSION
+./aclocal.m4
+./announce.html.in
+./c++/Makefile.in
+./c++/NEWS
+./c++/PROBLEMS
+./c++/README-first
+./c++/cursesapp.cc
+./c++/cursesapp.h
+./c++/cursesf.cc
+./c++/cursesf.h
+./c++/cursesm.cc
+./c++/cursesm.h
+./c++/cursesmain.cc
+./c++/cursesp.cc
+./c++/cursesp.h
+./c++/cursespad.cc
+./c++/cursesw.cc
+./c++/cursesw.h
+./c++/cursslk.cc
+./c++/cursslk.h
+./c++/demo.cc
+./c++/edit_cfg.sh
+./c++/etip.h.in
+./c++/headers
+./c++/internal.h
+./c++/modules
+./config.guess
+./config.sub
+./configure
+./configure.in
+./dist.mk
+./doc/hackguide.doc
+./doc/html/Ada95.html
+./doc/html/NCURSES-Programming-HOWTO.html
+./doc/html/ada/files.htm
+./doc/html/ada/files/T.htm
+./doc/html/ada/funcs.htm
+./doc/html/ada/funcs/A.htm
+./doc/html/ada/funcs/B.htm
+./doc/html/ada/funcs/C.htm
+./doc/html/ada/funcs/D.htm
+./doc/html/ada/funcs/E.htm
+./doc/html/ada/funcs/F.htm
+./doc/html/ada/funcs/G.htm
+./doc/html/ada/funcs/H.htm
+./doc/html/ada/funcs/I.htm
+./doc/html/ada/funcs/K.htm
+./doc/html/ada/funcs/L.htm
+./doc/html/ada/funcs/M.htm
+./doc/html/ada/funcs/N.htm
+./doc/html/ada/funcs/O.htm
+./doc/html/ada/funcs/P.htm
+./doc/html/ada/funcs/Q.htm
+./doc/html/ada/funcs/R.htm
+./doc/html/ada/funcs/S.htm
+./doc/html/ada/funcs/T.htm
+./doc/html/ada/funcs/U.htm
+./doc/html/ada/funcs/V.htm
+./doc/html/ada/funcs/W.htm
+./doc/html/ada/index.htm
+./doc/html/ada/main.htm
+./doc/html/ada/table.html
+./doc/html/ada/terminal_interface-curses-aux__adb.htm
+./doc/html/ada/terminal_interface-curses-aux__ads.htm
+./doc/html/ada/terminal_interface-curses-forms-field_types-alpha__adb.htm
+./doc/html/ada/terminal_interface-curses-forms-field_types-alpha__ads.htm
+./doc/html/ada/terminal_interface-curses-forms-field_types-alphanumeric__adb.htm
+./doc/html/ada/terminal_interface-curses-forms-field_types-alphanumeric__ads.htm
+./doc/html/ada/terminal_interface-curses-forms-field_types-enumeration-ada__adb.htm
+./doc/html/ada/terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm
+./doc/html/ada/terminal_interface-curses-forms-field_types-enumeration__adb.htm
+./doc/html/ada/terminal_interface-curses-forms-field_types-enumeration__ads.htm
+./doc/html/ada/terminal_interface-curses-forms-field_types-intfield__adb.htm
+./doc/html/ada/terminal_interface-curses-forms-field_types-intfield__ads.htm
+./doc/html/ada/terminal_interface-curses-forms-field_types-ipv4_address__adb.htm
+./doc/html/ada/terminal_interface-curses-forms-field_types-ipv4_address__ads.htm
+./doc/html/ada/terminal_interface-curses-forms-field_types-numeric__adb.htm
+./doc/html/ada/terminal_interface-curses-forms-field_types-numeric__ads.htm
+./doc/html/ada/terminal_interface-curses-forms-field_types-regexp__adb.htm
+./doc/html/ada/terminal_interface-curses-forms-field_types-regexp__ads.htm
+./doc/html/ada/terminal_interface-curses-forms-field_types-user-choice__adb.htm
+./doc/html/ada/terminal_interface-curses-forms-field_types-user-choice__ads.htm
+./doc/html/ada/terminal_interface-curses-forms-field_types-user__adb.htm
+./doc/html/ada/terminal_interface-curses-forms-field_types-user__ads.htm
+./doc/html/ada/terminal_interface-curses-forms-field_types__adb.htm
+./doc/html/ada/terminal_interface-curses-forms-field_types__ads.htm
+./doc/html/ada/terminal_interface-curses-forms-field_user_data__adb.htm
+./doc/html/ada/terminal_interface-curses-forms-field_user_data__ads.htm
+./doc/html/ada/terminal_interface-curses-forms-form_user_data__adb.htm
+./doc/html/ada/terminal_interface-curses-forms-form_user_data__ads.htm
+./doc/html/ada/terminal_interface-curses-forms__adb.htm
+./doc/html/ada/terminal_interface-curses-forms__ads.htm
+./doc/html/ada/terminal_interface-curses-menus-item_user_data__adb.htm
+./doc/html/ada/terminal_interface-curses-menus-item_user_data__ads.htm
+./doc/html/ada/terminal_interface-curses-menus-menu_user_data__adb.htm
+./doc/html/ada/terminal_interface-curses-menus-menu_user_data__ads.htm
+./doc/html/ada/terminal_interface-curses-menus__adb.htm
+./doc/html/ada/terminal_interface-curses-menus__ads.htm
+./doc/html/ada/terminal_interface-curses-mouse__adb.htm
+./doc/html/ada/terminal_interface-curses-mouse__ads.htm
+./doc/html/ada/terminal_interface-curses-panels-user_data__adb.htm
+./doc/html/ada/terminal_interface-curses-panels-user_data__ads.htm
+./doc/html/ada/terminal_interface-curses-panels__adb.htm
+./doc/html/ada/terminal_interface-curses-panels__ads.htm
+./doc/html/ada/terminal_interface-curses-putwin__adb.htm
+./doc/html/ada/terminal_interface-curses-putwin__ads.htm
+./doc/html/ada/terminal_interface-curses-termcap__adb.htm
+./doc/html/ada/terminal_interface-curses-termcap__ads.htm
+./doc/html/ada/terminal_interface-curses-terminfo__adb.htm
+./doc/html/ada/terminal_interface-curses-terminfo__ads.htm
+./doc/html/ada/terminal_interface-curses-text_io-aux__adb.htm
+./doc/html/ada/terminal_interface-curses-text_io-aux__ads.htm
+./doc/html/ada/terminal_interface-curses-text_io-complex_io__adb.htm
+./doc/html/ada/terminal_interface-curses-text_io-complex_io__ads.htm
+./doc/html/ada/terminal_interface-curses-text_io-decimal_io__adb.htm
+./doc/html/ada/terminal_interface-curses-text_io-decimal_io__ads.htm
+./doc/html/ada/terminal_interface-curses-text_io-enumeration_io__adb.htm
+./doc/html/ada/terminal_interface-curses-text_io-enumeration_io__ads.htm
+./doc/html/ada/terminal_interface-curses-text_io-fixed_io__adb.htm
+./doc/html/ada/terminal_interface-curses-text_io-fixed_io__ads.htm
+./doc/html/ada/terminal_interface-curses-text_io-float_io__adb.htm
+./doc/html/ada/terminal_interface-curses-text_io-float_io__ads.htm
+./doc/html/ada/terminal_interface-curses-text_io-integer_io__adb.htm
+./doc/html/ada/terminal_interface-curses-text_io-integer_io__ads.htm
+./doc/html/ada/terminal_interface-curses-text_io-modular_io__adb.htm
+./doc/html/ada/terminal_interface-curses-text_io-modular_io__ads.htm
+./doc/html/ada/terminal_interface-curses-text_io__adb.htm
+./doc/html/ada/terminal_interface-curses-text_io__ads.htm
+./doc/html/ada/terminal_interface-curses-trace__adb.htm
+./doc/html/ada/terminal_interface-curses-trace__ads.htm
+./doc/html/ada/terminal_interface-curses__adb.htm
+./doc/html/ada/terminal_interface-curses__ads.htm
+./doc/html/ada/terminal_interface-curses_constants__ads.htm
+./doc/html/ada/terminal_interface__ads.htm
+./doc/html/announce.html
+./doc/html/hackguide.html
+./doc/html/index.html
+./doc/html/man/adacurses6-config.1.html
+./doc/html/man/captoinfo.1m.html
+./doc/html/man/clear.1.html
+./doc/html/man/curs_add_wch.3x.html
+./doc/html/man/curs_add_wchstr.3x.html
+./doc/html/man/curs_addch.3x.html
+./doc/html/man/curs_addchstr.3x.html
+./doc/html/man/curs_addstr.3x.html
+./doc/html/man/curs_addwstr.3x.html
+./doc/html/man/curs_attr.3x.html
+./doc/html/man/curs_beep.3x.html
+./doc/html/man/curs_bkgd.3x.html
+./doc/html/man/curs_bkgrnd.3x.html
+./doc/html/man/curs_border.3x.html
+./doc/html/man/curs_border_set.3x.html
+./doc/html/man/curs_clear.3x.html
+./doc/html/man/curs_color.3x.html
+./doc/html/man/curs_delch.3x.html
+./doc/html/man/curs_deleteln.3x.html
+./doc/html/man/curs_extend.3x.html
+./doc/html/man/curs_get_wch.3x.html
+./doc/html/man/curs_get_wstr.3x.html
+./doc/html/man/curs_getcchar.3x.html
+./doc/html/man/curs_getch.3x.html
+./doc/html/man/curs_getstr.3x.html
+./doc/html/man/curs_getyx.3x.html
+./doc/html/man/curs_in_wch.3x.html
+./doc/html/man/curs_in_wchstr.3x.html
+./doc/html/man/curs_inch.3x.html
+./doc/html/man/curs_inchstr.3x.html
+./doc/html/man/curs_initscr.3x.html
+./doc/html/man/curs_inopts.3x.html
+./doc/html/man/curs_ins_wch.3x.html
+./doc/html/man/curs_ins_wstr.3x.html
+./doc/html/man/curs_insch.3x.html
+./doc/html/man/curs_insstr.3x.html
+./doc/html/man/curs_instr.3x.html
+./doc/html/man/curs_inwstr.3x.html
+./doc/html/man/curs_kernel.3x.html
+./doc/html/man/curs_legacy.3x.html
+./doc/html/man/curs_memleaks.3x.html
+./doc/html/man/curs_mouse.3x.html
+./doc/html/man/curs_move.3x.html
+./doc/html/man/curs_opaque.3x.html
+./doc/html/man/curs_outopts.3x.html
+./doc/html/man/curs_overlay.3x.html
+./doc/html/man/curs_pad.3x.html
+./doc/html/man/curs_print.3x.html
+./doc/html/man/curs_printw.3x.html
+./doc/html/man/curs_refresh.3x.html
+./doc/html/man/curs_scanw.3x.html
+./doc/html/man/curs_scr_dump.3x.html
+./doc/html/man/curs_scroll.3x.html
+./doc/html/man/curs_slk.3x.html
+./doc/html/man/curs_sp_funcs.3x.html
+./doc/html/man/curs_termattrs.3x.html
+./doc/html/man/curs_termcap.3x.html
+./doc/html/man/curs_terminfo.3x.html
+./doc/html/man/curs_threads.3x.html
+./doc/html/man/curs_touch.3x.html
+./doc/html/man/curs_trace.3x.html
+./doc/html/man/curs_util.3x.html
+./doc/html/man/curs_variables.3x.html
+./doc/html/man/curs_window.3x.html
+./doc/html/man/default_colors.3x.html
+./doc/html/man/define_key.3x.html
+./doc/html/man/form.3x.html
+./doc/html/man/form_cursor.3x.html
+./doc/html/man/form_data.3x.html
+./doc/html/man/form_driver.3x.html
+./doc/html/man/form_field.3x.html
+./doc/html/man/form_field_attributes.3x.html
+./doc/html/man/form_field_buffer.3x.html
+./doc/html/man/form_field_info.3x.html
+./doc/html/man/form_field_just.3x.html
+./doc/html/man/form_field_new.3x.html
+./doc/html/man/form_field_opts.3x.html
+./doc/html/man/form_field_userptr.3x.html
+./doc/html/man/form_field_validation.3x.html
+./doc/html/man/form_fieldtype.3x.html
+./doc/html/man/form_hook.3x.html
+./doc/html/man/form_new.3x.html
+./doc/html/man/form_new_page.3x.html
+./doc/html/man/form_opts.3x.html
+./doc/html/man/form_page.3x.html
+./doc/html/man/form_post.3x.html
+./doc/html/man/form_requestname.3x.html
+./doc/html/man/form_userptr.3x.html
+./doc/html/man/form_variables.3x.html
+./doc/html/man/form_win.3x.html
+./doc/html/man/index.html
+./doc/html/man/infocmp.1m.html
+./doc/html/man/infotocap.1m.html
+./doc/html/man/key_defined.3x.html
+./doc/html/man/keybound.3x.html
+./doc/html/man/keyok.3x.html
+./doc/html/man/legacy_coding.3x.html
+./doc/html/man/menu.3x.html
+./doc/html/man/menu_attributes.3x.html
+./doc/html/man/menu_cursor.3x.html
+./doc/html/man/menu_driver.3x.html
+./doc/html/man/menu_format.3x.html
+./doc/html/man/menu_hook.3x.html
+./doc/html/man/menu_items.3x.html
+./doc/html/man/menu_mark.3x.html
+./doc/html/man/menu_new.3x.html
+./doc/html/man/menu_opts.3x.html
+./doc/html/man/menu_pattern.3x.html
+./doc/html/man/menu_post.3x.html
+./doc/html/man/menu_requestname.3x.html
+./doc/html/man/menu_spacing.3x.html
+./doc/html/man/menu_userptr.3x.html
+./doc/html/man/menu_win.3x.html
+./doc/html/man/mitem_current.3x.html
+./doc/html/man/mitem_name.3x.html
+./doc/html/man/mitem_new.3x.html
+./doc/html/man/mitem_opts.3x.html
+./doc/html/man/mitem_userptr.3x.html
+./doc/html/man/mitem_value.3x.html
+./doc/html/man/mitem_visible.3x.html
+./doc/html/man/ncurses.3x.html
+./doc/html/man/ncurses6-config.1.html
+./doc/html/man/new_pair.3x.html
+./doc/html/man/panel.3x.html
+./doc/html/man/resizeterm.3x.html
+./doc/html/man/scr_dump.5.html
+./doc/html/man/tabs.1.html
+./doc/html/man/term.5.html
+./doc/html/man/term.7.html
+./doc/html/man/term_variables.3x.html
+./doc/html/man/terminfo.5.html
+./doc/html/man/tic.1m.html
+./doc/html/man/toe.1m.html
+./doc/html/man/tput.1.html
+./doc/html/man/tset.1.html
+./doc/html/man/user_caps.5.html
+./doc/html/man/wresize.3x.html
+./doc/html/ncurses-intro.html
+./doc/ncurses-intro.doc
+./form/Makefile.in
+./form/READ.ME
+./form/f_trace.c
+./form/fld_arg.c
+./form/fld_attr.c
+./form/fld_current.c
+./form/fld_def.c
+./form/fld_dup.c
+./form/fld_ftchoice.c
+./form/fld_ftlink.c
+./form/fld_info.c
+./form/fld_just.c
+./form/fld_link.c
+./form/fld_max.c
+./form/fld_move.c
+./form/fld_newftyp.c
+./form/fld_opts.c
+./form/fld_pad.c
+./form/fld_page.c
+./form/fld_stat.c
+./form/fld_type.c
+./form/fld_user.c
+./form/form.h
+./form/form.priv.h
+./form/frm_cursor.c
+./form/frm_data.c
+./form/frm_def.c
+./form/frm_driver.c
+./form/frm_hook.c
+./form/frm_opts.c
+./form/frm_page.c
+./form/frm_post.c
+./form/frm_req_name.c
+./form/frm_scale.c
+./form/frm_sub.c
+./form/frm_user.c
+./form/frm_win.c
+./form/fty_alnum.c
+./form/fty_alpha.c
+./form/fty_enum.c
+./form/fty_generic.c
+./form/fty_int.c
+./form/fty_ipv4.c
+./form/fty_num.c
+./form/fty_regex.c
+./form/headers
+./form/llib-lform
+./form/llib-lformt
+./form/llib-lformtw
+./form/llib-lformw
+./form/modules
+./include/Caps
+./include/Caps-ncurses
+./include/Caps.aix4
+./include/Caps.hpux11
+./include/Caps.keys
+./include/Caps.osf1r5
+./include/Caps.uwin
+./include/MKhashsize.sh
+./include/MKkey_defs.sh
+./include/MKncurses_def.sh
+./include/MKparametrized.sh
+./include/MKterm.h.awk.in
+./include/Makefile.in
+./include/capdefaults.c
+./include/curses.events
+./include/curses.h.in
+./include/curses.tail
+./include/curses.wide
+./include/edit_cfg.sh
+./include/hashed_db.h
+./include/headers
+./include/nc_access.h
+./include/nc_alloc.h
+./include/nc_mingw.h
+./include/nc_panel.h
+./include/nc_string.h
+./include/nc_termios.h
+./include/nc_tparm.h
+./include/nc_win32.h
+./include/ncurses_cfg.hin
+./include/ncurses_defs
+./include/ncurses_dll.h.in
+./include/ncurses_mingw.h
+./include/term_entry.h
+./include/termcap.h.in
+./include/tic.h
+./include/unctrl.h.in
+./include/win32_curses.h
+./install-sh
+./man/MKada_config.in
+./man/MKncu_config.in
+./man/MKterminfo.sh
+./man/Makefile.in
+./man/captoinfo.1m
+./man/clear.1
+./man/curs_add_wch.3x
+./man/curs_add_wchstr.3x
+./man/curs_addch.3x
+./man/curs_addchstr.3x
+./man/curs_addstr.3x
+./man/curs_addwstr.3x
+./man/curs_attr.3x
+./man/curs_beep.3x
+./man/curs_bkgd.3x
+./man/curs_bkgrnd.3x
+./man/curs_border.3x
+./man/curs_border_set.3x
+./man/curs_clear.3x
+./man/curs_color.3x
+./man/curs_delch.3x
+./man/curs_deleteln.3x
+./man/curs_extend.3x
+./man/curs_get_wch.3x
+./man/curs_get_wstr.3x
+./man/curs_getcchar.3x
+./man/curs_getch.3x
+./man/curs_getstr.3x
+./man/curs_getyx.3x
+./man/curs_in_wch.3x
+./man/curs_in_wchstr.3x
+./man/curs_inch.3x
+./man/curs_inchstr.3x
+./man/curs_initscr.3x
+./man/curs_inopts.3x
+./man/curs_ins_wch.3x
+./man/curs_ins_wstr.3x
+./man/curs_insch.3x
+./man/curs_insstr.3x
+./man/curs_instr.3x
+./man/curs_inwstr.3x
+./man/curs_kernel.3x
+./man/curs_legacy.3x
+./man/curs_memleaks.3x
+./man/curs_mouse.3x
+./man/curs_move.3x
+./man/curs_opaque.3x
+./man/curs_outopts.3x
+./man/curs_overlay.3x
+./man/curs_pad.3x
+./man/curs_print.3x
+./man/curs_printw.3x
+./man/curs_refresh.3x
+./man/curs_scanw.3x
+./man/curs_scr_dump.3x
+./man/curs_scroll.3x
+./man/curs_slk.3x
+./man/curs_sp_funcs.3x
+./man/curs_termattrs.3x
+./man/curs_termcap.3x
+./man/curs_terminfo.3x
+./man/curs_threads.3x
+./man/curs_touch.3x
+./man/curs_trace.3x
+./man/curs_util.3x
+./man/curs_variables.3x
+./man/curs_window.3x
+./man/default_colors.3x
+./man/define_key.3x
+./man/form.3x
+./man/form_cursor.3x
+./man/form_data.3x
+./man/form_driver.3x
+./man/form_field.3x
+./man/form_field_attributes.3x
+./man/form_field_buffer.3x
+./man/form_field_info.3x
+./man/form_field_just.3x
+./man/form_field_new.3x
+./man/form_field_opts.3x
+./man/form_field_userptr.3x
+./man/form_field_validation.3x
+./man/form_fieldtype.3x
+./man/form_hook.3x
+./man/form_new.3x
+./man/form_new_page.3x
+./man/form_opts.3x
+./man/form_page.3x
+./man/form_post.3x
+./man/form_requestname.3x
+./man/form_userptr.3x
+./man/form_variables.3x
+./man/form_win.3x
+./man/infocmp.1m
+./man/infotocap.1m
+./man/key_defined.3x
+./man/keybound.3x
+./man/keyok.3x
+./man/legacy_coding.3x
+./man/make_sed.sh
+./man/man_db.renames.in
+./man/manhtml.aliases
+./man/manhtml.externs
+./man/manlinks.sed
+./man/menu.3x
+./man/menu_attributes.3x
+./man/menu_cursor.3x
+./man/menu_driver.3x
+./man/menu_format.3x
+./man/menu_hook.3x
+./man/menu_items.3x
+./man/menu_mark.3x
+./man/menu_new.3x
+./man/menu_opts.3x
+./man/menu_pattern.3x
+./man/menu_post.3x
+./man/menu_requestname.3x
+./man/menu_spacing.3x
+./man/menu_userptr.3x
+./man/menu_win.3x
+./man/mitem_current.3x
+./man/mitem_name.3x
+./man/mitem_new.3x
+./man/mitem_opts.3x
+./man/mitem_userptr.3x
+./man/mitem_value.3x
+./man/mitem_visible.3x
+./man/ncurses.3x
+./man/new_pair.3x
+./man/panel.3x
+./man/resizeterm.3x
+./man/scr_dump.5
+./man/tabs.1
+./man/term.5
+./man/term.7
+./man/term_variables.3x
+./man/terminfo.head
+./man/terminfo.tail
+./man/tic.1m
+./man/toe.1m
+./man/tput.1
+./man/tset.1
+./man/user_caps.5
+./man/wresize.3x
+./menu/Makefile.in
+./menu/READ.ME
+./menu/eti.h
+./menu/headers
+./menu/llib-lmenu
+./menu/llib-lmenut
+./menu/llib-lmenutw
+./menu/llib-lmenuw
+./menu/m_attribs.c
+./menu/m_cursor.c
+./menu/m_driver.c
+./menu/m_format.c
+./menu/m_global.c
+./menu/m_hook.c
+./menu/m_item_cur.c
+./menu/m_item_nam.c
+./menu/m_item_new.c
+./menu/m_item_opt.c
+./menu/m_item_top.c
+./menu/m_item_use.c
+./menu/m_item_val.c
+./menu/m_item_vis.c
+./menu/m_items.c
+./menu/m_new.c
+./menu/m_opts.c
+./menu/m_pad.c
+./menu/m_pattern.c
+./menu/m_post.c
+./menu/m_req_name.c
+./menu/m_scale.c
+./menu/m_spacing.c
+./menu/m_sub.c
+./menu/m_trace.c
+./menu/m_userptr.c
+./menu/m_win.c
+./menu/menu.h
+./menu/menu.priv.h
+./menu/mf_common.h
+./menu/modules
+./misc/Makefile.in
+./misc/chkdef.cmd
+./misc/cleantic.cmd
+./misc/cmpdef.cmd
+./misc/csort
+./misc/emx.src
+./misc/form.def
+./misc/form.ref
+./misc/gen-pkgconfig.in
+./misc/gen_edit.sh
+./misc/magic
+./misc/makedef.cmd
+./misc/makellib
+./misc/menu.def
+./misc/menu.ref
+./misc/ncu2openbsd
+./misc/ncurses-config.in
+./misc/ncurses.def
+./misc/ncurses.ref
+./misc/ncurses.supp
+./misc/panel.def
+./misc/panel.ref
+./misc/run_tic.in
+./misc/shlib
+./misc/tabset/std
+./misc/tabset/stdcrt
+./misc/tabset/vt100
+./misc/tabset/vt300
+./misc/tdlint
+./misc/terminfo.src
+./mk-0th.awk
+./mk-1st.awk
+./mk-2nd.awk
+./mk-hdr.awk
+./ncurses/Makefile.in
+./ncurses/README
+./ncurses/README.IZ
+./ncurses/SigAction.h
+./ncurses/base/MKkeyname.awk
+./ncurses/base/MKlib_gen.sh
+./ncurses/base/MKunctrl.awk
+./ncurses/base/README
+./ncurses/base/define_key.c
+./ncurses/base/key_defined.c
+./ncurses/base/keybound.c
+./ncurses/base/keyok.c
+./ncurses/base/legacy_coding.c
+./ncurses/base/lib_addch.c
+./ncurses/base/lib_addstr.c
+./ncurses/base/lib_beep.c
+./ncurses/base/lib_bkgd.c
+./ncurses/base/lib_box.c
+./ncurses/base/lib_chgat.c
+./ncurses/base/lib_clear.c
+./ncurses/base/lib_clearok.c
+./ncurses/base/lib_clrbot.c
+./ncurses/base/lib_clreol.c
+./ncurses/base/lib_color.c
+./ncurses/base/lib_colorset.c
+./ncurses/base/lib_delch.c
+./ncurses/base/lib_delwin.c
+./ncurses/base/lib_dft_fgbg.c
+./ncurses/base/lib_driver.c
+./ncurses/base/lib_echo.c
+./ncurses/base/lib_endwin.c
+./ncurses/base/lib_erase.c
+./ncurses/base/lib_flash.c
+./ncurses/base/lib_freeall.c
+./ncurses/base/lib_getch.c
+./ncurses/base/lib_getstr.c
+./ncurses/base/lib_hline.c
+./ncurses/base/lib_immedok.c
+./ncurses/base/lib_inchstr.c
+./ncurses/base/lib_initscr.c
+./ncurses/base/lib_insch.c
+./ncurses/base/lib_insdel.c
+./ncurses/base/lib_insnstr.c
+./ncurses/base/lib_instr.c
+./ncurses/base/lib_isendwin.c
+./ncurses/base/lib_leaveok.c
+./ncurses/base/lib_mouse.c
+./ncurses/base/lib_move.c
+./ncurses/base/lib_mvwin.c
+./ncurses/base/lib_newterm.c
+./ncurses/base/lib_newwin.c
+./ncurses/base/lib_nl.c
+./ncurses/base/lib_overlay.c
+./ncurses/base/lib_pad.c
+./ncurses/base/lib_printw.c
+./ncurses/base/lib_redrawln.c
+./ncurses/base/lib_refresh.c
+./ncurses/base/lib_restart.c
+./ncurses/base/lib_scanw.c
+./ncurses/base/lib_screen.c
+./ncurses/base/lib_scroll.c
+./ncurses/base/lib_scrollok.c
+./ncurses/base/lib_scrreg.c
+./ncurses/base/lib_set_term.c
+./ncurses/base/lib_slk.c
+./ncurses/base/lib_slkatr_set.c
+./ncurses/base/lib_slkatrof.c
+./ncurses/base/lib_slkatron.c
+./ncurses/base/lib_slkatrset.c
+./ncurses/base/lib_slkattr.c
+./ncurses/base/lib_slkclear.c
+./ncurses/base/lib_slkcolor.c
+./ncurses/base/lib_slkinit.c
+./ncurses/base/lib_slklab.c
+./ncurses/base/lib_slkrefr.c
+./ncurses/base/lib_slkset.c
+./ncurses/base/lib_slktouch.c
+./ncurses/base/lib_touch.c
+./ncurses/base/lib_ungetch.c
+./ncurses/base/lib_vline.c
+./ncurses/base/lib_wattroff.c
+./ncurses/base/lib_wattron.c
+./ncurses/base/lib_winch.c
+./ncurses/base/lib_window.c
+./ncurses/base/nc_panel.c
+./ncurses/base/new_pair.c
+./ncurses/base/resizeterm.c
+./ncurses/base/safe_sprintf.c
+./ncurses/base/sigaction.c
+./ncurses/base/tries.c
+./ncurses/base/use_window.c
+./ncurses/base/version.c
+./ncurses/base/vsscanf.c
+./ncurses/base/wresize.c
+./ncurses/build.priv.h
+./ncurses/curses.priv.h
+./ncurses/fifo_defs.h
+./ncurses/llib-lncurses
+./ncurses/llib-lncursest
+./ncurses/llib-lncursestw
+./ncurses/llib-lncursesw
+./ncurses/llib-ltic
+./ncurses/llib-ltict
+./ncurses/llib-ltictw
+./ncurses/llib-lticw
+./ncurses/llib-ltinfo
+./ncurses/llib-ltinfot
+./ncurses/llib-ltinfotw
+./ncurses/llib-ltinfow
+./ncurses/modules
+./ncurses/new_pair.h
+./ncurses/report_hashing.c
+./ncurses/report_offsets.c
+./ncurses/term.priv.h
+./ncurses/tinfo/MKcaptab.awk
+./ncurses/tinfo/MKcaptab.sh
+./ncurses/tinfo/MKcodes.awk
+./ncurses/tinfo/MKfallback.sh
+./ncurses/tinfo/MKkeys_list.sh
+./ncurses/tinfo/MKnames.awk
+./ncurses/tinfo/MKuserdefs.sh
+./ncurses/tinfo/README
+./ncurses/tinfo/access.c
+./ncurses/tinfo/add_tries.c
+./ncurses/tinfo/alloc_entry.c
+./ncurses/tinfo/alloc_ttype.c
+./ncurses/tinfo/captoinfo.c
+./ncurses/tinfo/comp_error.c
+./ncurses/tinfo/comp_expand.c
+./ncurses/tinfo/comp_hash.c
+./ncurses/tinfo/comp_parse.c
+./ncurses/tinfo/comp_scan.c
+./ncurses/tinfo/db_iterator.c
+./ncurses/tinfo/doalloc.c
+./ncurses/tinfo/entries.c
+./ncurses/tinfo/free_ttype.c
+./ncurses/tinfo/getenv_num.c
+./ncurses/tinfo/hashed_db.c
+./ncurses/tinfo/home_terminfo.c
+./ncurses/tinfo/init_keytry.c
+./ncurses/tinfo/lib_acs.c
+./ncurses/tinfo/lib_baudrate.c
+./ncurses/tinfo/lib_cur_term.c
+./ncurses/tinfo/lib_data.c
+./ncurses/tinfo/lib_has_cap.c
+./ncurses/tinfo/lib_kernel.c
+./ncurses/tinfo/lib_longname.c
+./ncurses/tinfo/lib_napms.c
+./ncurses/tinfo/lib_options.c
+./ncurses/tinfo/lib_print.c
+./ncurses/tinfo/lib_raw.c
+./ncurses/tinfo/lib_setup.c
+./ncurses/tinfo/lib_termcap.c
+./ncurses/tinfo/lib_termname.c
+./ncurses/tinfo/lib_tgoto.c
+./ncurses/tinfo/lib_ti.c
+./ncurses/tinfo/lib_tparm.c
+./ncurses/tinfo/lib_tputs.c
+./ncurses/tinfo/lib_ttyflags.c
+./ncurses/tinfo/lib_win32con.c
+./ncurses/tinfo/lib_win32util.c
+./ncurses/tinfo/make_hash.c
+./ncurses/tinfo/make_keys.c
+./ncurses/tinfo/name_match.c
+./ncurses/tinfo/obsolete.c
+./ncurses/tinfo/parse_entry.c
+./ncurses/tinfo/read_entry.c
+./ncurses/tinfo/read_termcap.c
+./ncurses/tinfo/strings.c
+./ncurses/tinfo/tinfo_driver.c
+./ncurses/tinfo/trim_sgr0.c
+./ncurses/tinfo/use_screen.c
+./ncurses/tinfo/write_entry.c
+./ncurses/trace/README
+./ncurses/trace/lib_trace.c
+./ncurses/trace/lib_traceatr.c
+./ncurses/trace/lib_tracebits.c
+./ncurses/trace/lib_tracechr.c
+./ncurses/trace/lib_tracedmp.c
+./ncurses/trace/lib_tracemse.c
+./ncurses/trace/trace_buf.c
+./ncurses/trace/trace_tries.c
+./ncurses/trace/trace_xnames.c
+./ncurses/trace/varargs.c
+./ncurses/trace/visbuf.c
+./ncurses/tty/MKexpanded.sh
+./ncurses/tty/hardscroll.c
+./ncurses/tty/hashmap.c
+./ncurses/tty/lib_mvcur.c
+./ncurses/tty/lib_tstp.c
+./ncurses/tty/lib_twait.c
+./ncurses/tty/lib_vidattr.c
+./ncurses/tty/tty_update.c
+./ncurses/wcwidth.h
+./ncurses/widechar/charable.c
+./ncurses/widechar/lib_add_wch.c
+./ncurses/widechar/lib_box_set.c
+./ncurses/widechar/lib_cchar.c
+./ncurses/widechar/lib_erasewchar.c
+./ncurses/widechar/lib_get_wch.c
+./ncurses/widechar/lib_get_wstr.c
+./ncurses/widechar/lib_hline_set.c
+./ncurses/widechar/lib_in_wch.c
+./ncurses/widechar/lib_in_wchnstr.c
+./ncurses/widechar/lib_ins_wch.c
+./ncurses/widechar/lib_inwstr.c
+./ncurses/widechar/lib_key_name.c
+./ncurses/widechar/lib_pecho_wchar.c
+./ncurses/widechar/lib_slk_wset.c
+./ncurses/widechar/lib_unget_wch.c
+./ncurses/widechar/lib_vid_attr.c
+./ncurses/widechar/lib_vline_set.c
+./ncurses/widechar/lib_wacs.c
+./ncurses/widechar/lib_wunctrl.c
+./ncurses/widechar/widechars.c
+./ncurses/win32con/gettimeofday.c
+./ncurses/win32con/wcwidth.c
+./ncurses/win32con/win32_driver.c
+./ncurses/win32con/win_driver.c
+./package/debian-mingw/changelog
+./package/debian-mingw/compat
+./package/debian-mingw/control
+./package/debian-mingw/copyright
+./package/debian-mingw/mingw32-ncurses6.lintian-overrides
+./package/debian-mingw/rules
+./package/debian-mingw/source/format
+./package/debian-mingw/watch
+./package/debian-mingw64/changelog
+./package/debian-mingw64/compat
+./package/debian-mingw64/control
+./package/debian-mingw64/copyright
+./package/debian-mingw64/mingw64-ncurses6.lintian-overrides
+./package/debian-mingw64/rules
+./package/debian-mingw64/source/format
+./package/debian-mingw64/watch
+./package/debian/changelog
+./package/debian/compat
+./package/debian/control
+./package/debian/copyright
+./package/debian/ncurses6.lintian-overrides
+./package/debian/ncurses6.triggers
+./package/debian/ncursest6.lintian-overrides
+./package/debian/ncursest6.triggers
+./package/debian/rules
+./package/debian/source/format
+./package/debian/watch
+./package/mingw-ncurses.nsi
+./package/mingw-ncurses.spec
+./package/ncurses.map
+./package/ncurses.spec
+./package/ncurses.sym
+./package/ncursest.map
+./package/ncursest.spec
+./package/ncursest.sym
+./package/ncursestw.map
+./package/ncursestw.sym
+./package/ncursesw.map
+./package/ncursesw.sym
+./panel/Makefile.in
+./panel/headers
+./panel/llib-lpanel
+./panel/llib-lpanelt
+./panel/llib-lpaneltw
+./panel/llib-lpanelw
+./panel/modules
+./panel/p_above.c
+./panel/p_below.c
+./panel/p_bottom.c
+./panel/p_delete.c
+./panel/p_hidden.c
+./panel/p_hide.c
+./panel/p_move.c
+./panel/p_new.c
+./panel/p_replace.c
+./panel/p_show.c
+./panel/p_top.c
+./panel/p_update.c
+./panel/p_user.c
+./panel/p_win.c
+./panel/panel.c
+./panel/panel.h
+./panel/panel.priv.h
+./progs/MKtermsort.sh
+./progs/Makefile.in
+./progs/capconvert
+./progs/clear.c
+./progs/clear.sh
+./progs/clear_cmd.c
+./progs/clear_cmd.h
+./progs/dump_entry.c
+./progs/dump_entry.h
+./progs/infocmp.c
+./progs/modules
+./progs/progs.priv.h
+./progs/reset_cmd.c
+./progs/reset_cmd.h
+./progs/tabs.c
+./progs/tic.c
+./progs/toe.c
+./progs/tparm_type.c
+./progs/tparm_type.h
+./progs/tput.c
+./progs/transform.c
+./progs/tset.c
+./progs/tty_settings.c
+./progs/tty_settings.h
+./test/Makefile.in
+./test/README
+./test/aclocal.m4
+./test/back_ground.c
+./test/background.c
+./test/blue.c
+./test/bs.6
+./test/bs.c
+./test/bulgarian-utf8-tabs.txt
+./test/bulgarian-utf8.txt
+./test/cardfile.c
+./test/cardfile.dat
+./test/chgat.c
+./test/clip_printw.c
+./test/color_content.c
+./test/color_name.h
+./test/color_set.c
+./test/combine.c
+./test/configure
+./test/configure.in
+./test/demo_altkeys.c
+./test/demo_defkey.c
+./test/demo_forms.c
+./test/demo_forms.txt
+./test/demo_keyok.c
+./test/demo_menus.c
+./test/demo_new_pair.c
+./test/demo_panels.c
+./test/demo_tabs.c
+./test/demo_termcap.c
+./test/demo_terminfo.c
+./test/ditto.c
+./test/dots.c
+./test/dots_curses.c
+./test/dots_mvcur.c
+./test/dots_termcap.c
+./test/dots_xcurses.c
+./test/dump_window.c
+./test/dump_window.h
+./test/dup_field.c
+./test/echochar.c
+./test/edit_field.c
+./test/edit_field.h
+./test/escherknot.xbm
+./test/extended_color.c
+./test/filter.c
+./test/firework.c
+./test/firstlast.c
+./test/foldkeys.c
+./test/form_driver_w.c
+./test/gdc.6
+./test/gdc.c
+./test/hanoi.c
+./test/hashtest.c
+./test/inch_wide.c
+./test/inchs.c
+./test/ins_wide.c
+./test/insdelln.c
+./test/inserts.c
+./test/key_names.c
+./test/keynames.c
+./test/knight.c
+./test/linedata.h
+./test/linux-color.dat
+./test/list_keys.c
+./test/listused.sh
+./test/lrtest.c
+./test/make-tar.sh
+./test/mensetmanus.xbm
+./test/mini.xterm_48x48.xpm
+./test/mk-test.awk
+./test/modules
+./test/move_field.c
+./test/movewindow.c
+./test/ncurses.c
+./test/ncurses_tst.hin
+./test/newdemo.c
+./test/package/debian-mingw/compat
+./test/package/debian-mingw/control
+./test/package/debian-mingw/copyright
+./test/package/debian-mingw/docs
+./test/package/debian-mingw/rules
+./test/package/debian-mingw/source/format
+./test/package/debian-mingw/watch
+./test/package/debian-mingw64/compat
+./test/package/debian-mingw64/control
+./test/package/debian-mingw64/copyright
+./test/package/debian-mingw64/docs
+./test/package/debian-mingw64/rules
+./test/package/debian-mingw64/source/format
+./test/package/debian-mingw64/watch
+./test/package/debian/compat
+./test/package/debian/control
+./test/package/debian/copyright
+./test/package/debian/docs
+./test/package/debian/rules
+./test/package/debian/source/format
+./test/package/debian/watch
+./test/package/mingw-ncurses-examples.spec
+./test/package/ncurses-examples.spec
+./test/padview.c
+./test/pair_content.c
+./test/parse_rgb.h
+./test/picsmap.c
+./test/picsmap.h
+./test/popup_msg.c
+./test/popup_msg.h
+./test/programs
+./test/railroad.c
+./test/rain.c
+./test/redraw.c
+./test/savescreen.c
+./test/savescreen.sh
+./test/sp_tinfo.c
+./test/tclock.c
+./test/terminal.xbm
+./test/test.priv.h
+./test/test_add_wchstr.c
+./test/test_addchstr.c
+./test/test_addstr.c
+./test/test_addwstr.c
+./test/test_arrays.c
+./test/test_delwin.c
+./test/test_get_wstr.c
+./test/test_getstr.c
+./test/test_instr.c
+./test/test_inwstr.c
+./test/test_mouse.c
+./test/test_opaque.c
+./test/test_setupterm.c
+./test/test_sgr.c
+./test/test_termattrs.c
+./test/test_tparm.c
+./test/test_unget_wch.c
+./test/test_vid_puts.c
+./test/test_vidputs.c
+./test/testaddch.c
+./test/testcurs.c
+./test/testscanw.c
+./test/tput-colorcube
+./test/tput-initc
+./test/tracemunch
+./test/view.c
+./test/widechars-utf8-tabs.txt
+./test/widechars-utf8.txt
+./test/widechars.h
+./test/worm.c
+./test/xmas.c
+./test/xterm-16color.dat
+./test/xterm-256color.dat
+./test/xterm-88color.dat
+./test/xterm-color_48x48.xpm
diff --git a/Makefile.in b/Makefile.in
new file mode 100644
index 0000000..1303e17
--- /dev/null
+++ b/Makefile.in
@@ -0,0 +1,132 @@
+# $Id: Makefile.in,v 1.46 2022/10/01 22:53:36 tom Exp $
+##############################################################################
+# Copyright 2018-2021,2022 Thomas E. Dickey                                  #
+# Copyright 1998-2014,2015 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey		1996-on
+#
+# Master Makefile for ncurses library.
+
+SHELL 		= @SHELL@
+VPATH		= @srcdir@
+
+DESTDIR=@DESTDIR@
+RPATH_LIST=@RPATH_LIST@
+TOP_MFLAGS = @cf_cv_makeflags@ DESTDIR="$(DESTDIR)" RPATH_LIST="$(RPATH_LIST)"
+
+@SET_MAKE@
+
+NCURSES_MAJOR	= @NCURSES_MAJOR@
+NCURSES_MINOR	= @NCURSES_MINOR@
+NCURSES_PATCH	= @NCURSES_PATCH@
+
+top_srcdir	= @top_srcdir@
+srcdir		= @srcdir@
+
+prefix		= @prefix@
+exec_prefix	= @exec_prefix@
+datarootdir	= @datarootdir@
+
+bindir		= @bindir@
+ticdir		= @TERMINFO@
+includedir	= @includedir@
+includesubdir	= @includesubdir@
+libdir		= @libdir@
+mandir		= @mandir@
+pkgdir		= @PKG_CONFIG_LIBDIR@
+
+include_dir	= ${includedir}${includesubdir}
+
+FGREP		= @FGREP@
+
+INSTALL		= @INSTALL@
+INSTALL_DATA	= @INSTALL_DATA@
+
+DIRS_TO_MAKE	= @DIRS_TO_MAKE@
+
+@MAKE_PHONY@.PHONY :	all
+@MAKE_PHONY@.PHONY :	check
+@MAKE_PHONY@.PHONY :	clean
+@MAKE_PHONY@.PHONY :	depend
+@MAKE_PHONY@.PHONY :	distclean
+@MAKE_PHONY@.PHONY :	install
+@MAKE_PHONY@.PHONY :	mostlyclean
+@MAKE_PHONY@.PHONY :	preinstall
+@MAKE_PHONY@.PHONY :	realclean
+@MAKE_PHONY@.PHONY :	sources
+@MAKE_PHONY@.PHONY :	tags
+@MAKE_PHONY@.PHONY :	uninstall
+
+all ::	$(DIRS_TO_MAKE)
+
+$(DIRS_TO_MAKE) :
+	mkdir $@
+
+preinstall :
+	@ echo ''
+	@ echo '** Configuration summary for NCURSES $(NCURSES_MAJOR).$(NCURSES_MINOR) $(NCURSES_PATCH):'
+	@ echo ''
+	@ echo '       extended funcs: '`test @NCURSES_EXT_FUNCS@ != 0 && echo yes || echo no`
+	@ echo '       xterm terminfo: '@WHICH_XTERM@
+	@ echo ''
+	@ echo '        bin directory: '$(bindir)
+	@ echo '        lib directory: '$(libdir)
+	@ echo '    include directory: '$(include_dir)
+	@ echo '        man directory: '$(mandir)
+@MAKE_TERMINFO@	@ echo '   terminfo directory: '$(ticdir)
+@USE_FALLBACKS@	@ echo '  using fallback-list: '@FALLBACK_LIST@
+@MAKE_PC_FILES@	@ echo ' pkg-config directory: '$(pkgdir)
+	@ echo ''
+	@ test "$(include_dir)" = "$(prefix)/include" || \
+		echo '** Include-directory is not in a standard location'
+	@ test ! -f $(include_dir)/termcap.h || \
+		$(FGREP) NCURSES_VERSION $(include_dir)/termcap.h >/dev/null || \
+		echo '** Will overwrite non-ncurses termcap.h'
+	@ test ! -f $(include_dir)/curses.h || \
+		$(FGREP) NCURSES_VERSION $(include_dir)/curses.h >/dev/null || \
+		echo '** Will overwrite non-ncurses curses.h'
+
+distclean \
+realclean ::
+
+check :
+	@ echo The test-programs are interactive
+
+
+# Put the common rules here so that we can easily construct the list of
+# directories to visit.
+all \
+clean \
+distclean \
+mostlyclean \
+realclean \
+depend \
+sources \
+tags \
+uninstall \
+install ::
diff --git a/Makefile.os2 b/Makefile.os2
new file mode 100644
index 0000000..bc3407d
--- /dev/null
+++ b/Makefile.os2
@@ -0,0 +1,260 @@
+##############################################################################
+# Copyright 2020,2021 Thomas E. Dickey                                       #
+# Copyright 1998-2000,2006 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: Makefile.os2,v 1.13 2021/06/17 21:20:30 tom Exp $
+#
+# Wrapper Makefile for ncurses library under OS/2.
+# Author:  Juan Jose Garcia Ripoll <worm@arrakis.es>.
+# Webpage: http://www.arrakis.es/~worm/
+################################################################################
+#
+# Notes (from I Zakharevich)
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~
+# I could build the library with the following sequence of commands:
+#
+#   touch Makefile
+#   make -f Makefile.os2 config
+#   make -f Makefile.os2 CC=gcc HOSTCC=gcc CXX=gcc
+#
+# Ignoring the following errors:
+#   Invalid configuration `os2'...
+#   ... ac_maketemp="make": not found
+#   ... syntax error: `done' unexpected
+#   No rule to make target `lib/ncurses4.dll'
+#
+# You may need to run
+#
+#   rm make.defs
+#   make -f Makefile.os2 make.defs
+#
+# if the build of misc/panel.def fails.
+#
+# If you do not have perl, the configuration will fail.  Use autoconf to
+# generate the EMX-specific configure script (see README.emx), and run the
+# configure script to generate the makefiles.  Then, run
+#
+#   make -f Makefile.os2 make.dlls
+#
+# Notes (from J J G Ripoll)
+# ~~~~~~~~~~~~~~~~~~~~~~~~~
+# The `make.defs' rule creates the new '.def' files and outputs a diagnostic
+# about symbols that disappear from one release to the other, as well as
+# checks about the new '.def' consistency.  If there were no problems, the
+# maintainer is free to replace the `.ref' files with the newer ones using the
+# `save.defs' rule.  So, the only tough work is ensuring that the symbols that
+# disappear are not essential.
+#
+# I first thought about killing '_nc_*' symbols, but it seems that some of
+# them --_nc_panel_hook, _nc_ada*, etc-- are needed outside ncurses.dll.
+# However, the whole size of the export table will not be larger than 1k or
+# so.
+#
+# [installation]
+#
+# The way things are handled in misc/Makefile is not well suited for OS/2,
+# where only emx.src is needed.  Thus, I've written a few wrapper rules in
+# Makefile.os2 that handle installation/deinstallation.
+#
+# [distribution]
+#
+# There's also a new rule that configures and builds a sort of binary
+# distribution, much like the one I prepared for 1.9.9e.  It's `os2dist'.
+#
+################################################################################
+
+all :: config
+
+# This is for configuring
+
+# What is a useful value for this?
+CONFIG_OPTS	= --enable-termcap
+WWWGET		= lynx -source
+MV_F		= mv -f
+DLL_LN_OPTS	= -Zcrtdll -Zdll -Zomf -Zmt
+
+config: config.cache
+
+config.cache: configure.cmd configure
+	-$(MV_F) $@ $@.ref
+	configure.cmd $(CONFIG_OPTS)
+
+configure.cmd: configure convert_configure.pl
+	perl convert_configure.pl configure > $@
+
+convert_configure.pl:
+	$(WWWGET) ftp://ftp.math.ohio-state.edu/pub/users/ilya/os2/$@ > $@
+
+install ::
+	echo ***
+	echo *** Do not use this command. Use install.os2 instead.
+	echo ***
+	exit 2
+
+install.os2 : install.emxdata install.libs install.progs
+
+include ./Makefile
+
+all :: make.dlls
+
+#
+# DLLs and that stuff
+#
+
+LIBRARIES = ncurses form menu panel
+
+DLL_TAG = $(NCURSES_MAJOR)
+LIB_TAG = _s
+
+DLL_ROOTS = $(addsuffix $(DLL_TAG), $(LIBRARIES))
+DLLS = $(addsuffix .dll, $(addprefix ./lib/, $(DLL_ROOTS)))
+
+LIB_ROOTS = $(addsuffix $(LIB_TAG), $(LIBRARIES))
+LIBS = $(addsuffix .lib, $(addprefix ./lib/, $(LIB_ROOTS)))
+
+LIBS_AOUT = $(addsuffix .a, $(addprefix ./lib/, $(LIB_ROOTS)))
+
+DEFS = $(addsuffix .def, $(addprefix ./misc/, $(LIBRARIES)))
+
+DLL_SIGNATURE = NCurses-$(NCURSES_MAJOR)-$(NCURSES_MINOR)-$(NCURSES_PATCH)
+
+./lib/%$(LIB_TAG).lib : ./misc/%.def
+	emximp -o $@ $<
+
+./lib/%$(LIB_TAG).a : ./misc/%.def
+	emximp -o $@ $<
+
+./lib/%$(DLL_TAG).dll : ./lib/%.a
+	emxomf -o ./lib/$*$(DLL_TAG).lib $<
+	if [ "$*" = "ncurses" ]; then \
+		gcc $(LDFLAGS) $(DLL_LN_OPTS) ./lib/$*$(DLL_TAG).lib \
+				./misc/$*.def -o $@; \
+	else \
+		gcc $(LDFLAGS) $(DLL_LN_OPTS) ./lib/$*$(DLL_TAG).lib \
+				./lib/ncurses$(LIB_TAG).lib ./misc/$*.def -o $@; \
+	fi
+	-rm -f ./lib/$*$(DLL_TAG).lib
+
+make.dlls : $(DEFS) $(LIBS) $(DLLS) $(LIBS_AOUT)
+
+$(DEFS) : make.defs
+
+LIBDIR	= $(DESTDIR)$(libdir)
+$(LIBDIR) :
+	mkdir -p $@
+
+install.libs :: $(LIBS) $(DLLS) $(LIBDIR)
+	@for i in $(DLL_ROOTS); do \
+	echo installing ./lib/$$i.dll as $(LIBDIR)/$$i.dll; \
+	$(INSTALL_DATA) ./lib/$$i.dll $(LIBDIR)/$$i.dll; done
+	@for i in $(LIB_ROOTS); do \
+	echo installing ./lib/$$i.lib as $(LIBDIR)/$$i.lib; \
+	$(INSTALL_DATA) ./lib/$$i.lib $(LIBDIR)/$$i.lib; done
+
+uninstall.libs ::
+	-@for i in $(DLL_ROOTS); do \
+	echo uninstalling $(LIBDIR)/$$i.dll; \
+	rm -f $(LIBDIR)/$$i.dll; done
+	-@for i in $(LIB_ROOTS); do \
+	echo uninstalling $(LIBDIR)/$$i.lib; \
+	rm -f $(LIBDIR)/$$i.lib; done
+
+make.defs :
+	for i in $(LIBRARIES); do \
+	echo LIBRARY $${i}$(DLL_TAG) INITINSTANCE TERMINSTANCE > ./misc/$$i.def; \
+	echo DESCRIPTION \"$(DLL_SIGNATURE), module $$i\" >> ./misc/$$i.def; \
+	echo CODE LOADONCALL >> ./misc/$$i.def; \
+	echo DATA LOADONCALL NONSHARED MULTIPLE >> ./misc/$$i.def; \
+	echo EXPORTS >> ./misc/$$i.def; \
+	echo Creating $$i.def; \
+	(cmd /C ".\\misc\\makedef.cmd ./lib/$$i.a ./misc/$$i.ref >> ./misc/$$i.def" \
+	 && cmd /C ".\\misc\\chkdef.cmd ./misc/$$i.def") \
+	|| exit 1; \
+	done
+	touch make.defs
+
+save.defs :
+	for i in $(LIBRARIES); do \
+	test -f ./misc/$$i.def && cp ./misc/$$i.def ./misc/$$i.ref; \
+	done
+
+clean \
+os2clean ::
+	-rm -f $(DLLS) $(LIBS)
+
+realclean ::
+	-rm -f $(addprefix ./misc/, $(addsuffix .def, $(LIBRARIES)))
+
+#
+# This is a simplified version of misc/Makefile
+#
+
+TICDIR = $(DESTDIR)$(datadir)/terminfo
+TABSETDIR = $(DESTDIR)$(datadir)/tabset
+
+$(TICDIR) :
+	mkdir -p $@
+
+install \
+install.emxdata :: $(TICDIR)
+	-@rm -fr $(TICDIR)/*
+	echo Building terminfo database, please wait...
+	set TERMINFO=$(TICDIR); ./progs/tic ./misc/emx.src
+	echo Installing the terminfo cleaner and the sources...
+	cp ./misc/emx.src ./misc/cleantic.cmd $(TICDIR)
+	./misc/cleantic.cmd $(TICDIR)
+
+uninstall \
+uninstall.emxdata ::
+	-cd $(TICDIR) && rm -rf *
+	-cd $(TABSETDIR) && rm -rf *
+
+#
+# This is for preparing binary distributions
+#
+
+OS2NAME=ncurses-$(NCURSES_MAJOR).$(NCURSES_MINOR)-emx
+
+#
+# FIXME: this assumes that we can rerun the configure script, changing only
+# the install-prefix.  That means we cannot provide "interesting" options
+# when building.
+#
+os2dist :
+	$(MAKE) -f Makefile.os2 os2clean
+	./configure --without-debug --with-install-prefix=`pwd|sed -e 's@^.:@@'`/$(OS2NAME)
+	$(MAKE) -f Makefile.os2 $(CF_MFLAGS) install.os2
+	-rm -f $(OS2NAME).zip
+	echo NCurses-$(NCURSES_MAJOR).$(NCURSES_MINOR)-$(NCURSES_PATCH) for emx > $(OS2NAME)/FILE_ID.DIZ
+	echo Binary release. >> $(OS2NAME)/FILE_ID.DIZ
+	zip -r $(OS2NAME).zip ./$(OS2NAME)
+
+clean \
+os2clean ::
+	-rm -rf $(OS2NAME)
+	-rm -f $(OS2NAME).zip
+
diff --git a/NEWS b/NEWS
new file mode 100644
index 0000000..66e63a3
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,15179 @@
+-------------------------------------------------------------------------------
+-- Copyright 2018-2021,2022 Thomas E. Dickey                                 --
+-- Copyright 1998-2017,2018 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: NEWS,v 1.3895 2022/12/31 20:43:21 tom Exp $
+-------------------------------------------------------------------------------
+
+This is a log of changes that ncurses has gone through since Zeyd started
+working with Pavel Curtis' original work, pcurses, in 1992.
+
+Changes through 1.9.9e are recorded by Zeyd M Ben-Halim.
+Changes since 1.9.9e are recorded by Thomas E Dickey.
+
+Contributors include those who have provided patches (even small ones), as well
+as those who provide useful information (bug reports, analyses).  Changes with
+no cited author are the work of Thomas E Dickey (TD).
+
+A few contributors may be cited in this file by their initials.
+Each accounts for half of one percent or more of the changes since 1.9.9e.
+See the AUTHORS file for the corresponding full names.
+
+Changes through 1.9.9e did not credit all contributions;
+it is not possible to add this information.
+
+20221231 6.4 release for upload to ftp.gnu.org
+	+ update release notes
+	+ regenerate llib-* files.
+	+ correct PS vs PE names in bracketed+paste (report by Bram Moolenaar)
+	  -TD
+
+20221224
+	+ add mutex lock/unlock in a few places reported by thread-sanitizer
+	+ add/use bracketed+paste to help identify terminals supporting this
+	  xterm feature (prompted by discussion with Bram Moolenaar) -TD
+
+20221217
+	+ install Ada95 sample programs in libexecdir, adding a wrapper
+	  script to invoke those.
+
+20221210
+	+ add minimal -h/-V getopt logic to the remaining test-programs.
+	+ free new_pair() data in delscreen (report by "magiblot").
+	+ add clarification of the scope of dynamic variables in terminfo(5).
+	+ remove a stray '/' from description of %g in terminfo(5).
+
+20221203
+	+ add -h usage and -V version options to the test-programs which use
+	  getopt.
+	+ use "command -v" rather than "type" in Ada95/gen/Makefile.in to fix
+	  a portability issue (patch by Nicolas Boulenguez).
+	+ update ncurses-howto, more documentation fixes along with corrections
+	  to example programs.
+
+20221126
+	+ fix an error in pathname of explain.txt (cf: 20200201).
+	+ fix an error in "@" command in test/ncurses.c F-menu (cf: 20190121).
+	+ improve formatting of ncurses-intro.html and hackguide.html
+	+ improve man/curs_clear.3x links to other pages
+
+20221119
+	+ use static libraries for AdaCurses test-package for Mageia, since no
+	  gprbuild package is available.
+	+ updated test packages for Debian.
+
+20221112
+	+ build-fixes for AdaCurses RPM test-package.
+
+20221105
+	+ regenerate configure scripts with autoconf 2.52.20221009
+	+ modify "--with-manpage-format" to support bzip2 and xz compression
+	  (prompted by discussion with Sam James).
+	+ modify make-tar.sh scripts to make timestamps more predictable.
+
+20221029
+	+ improve curs_slk.3x discussion of extensions and portability (report
+	  by Bill Gray).
+
+20221023
+	+ change man_db.renames to template, to handle ncurses*-config script
+	  with the extra-suffix configure option.
+
+20221015
+	+ fix another memory-leak in tic.
+	+ update install-sh script from autoconf, to fix install problem for
+	  Ada95 with Arch; as noted in
+	  https://lists.gnu.org/archive/html/automake/2018-09/msg00005.html
+	  there are unaddressed issues.
+	+ update CF_XOPEN_SOURCE, adding GNU libc suffixes for abi64, abin32,
+	  x32 (report by Sven Joachim):
+	+ correct ifdef's for _nc_set_read_thread() (patch by Mikhail Korolev,
+	  cf: 20220813).
+
+20221008
+	+ correct a switch-statement case in configure script to allow for test
+	  builds with ABI=7.
+	+ modify misc/gen-pkgconfig.in to allow for the case where the library
+	  directory does not yet exist, since this is processed before doing an
+	  install (report by Michal Liszcz).
+
+20221001
+	+ modify configure/scripts to work around interference by GNU grep 3.8
+	  (report by Sam James).
+	+ update CF_XOPEN_SOURCE, adding variants "gnueabi" and "gnueabihf" to
+	  get _DEFAULT_SOURCE special case (report by Adam Sampson)
+
+20220924
+	+ modify configure macro CF_BUILD_CC to check if the build-compiler
+	  works, rather than that it is different from the cross-compiler, e.g.,
+	  to accommodate a compiler which can be used for either purpose with
+	  different flags (report by Mikhail Korolev).
+	+ fix another memory-leak in tic.
+	+ correct change for cppcheck in menu library (report/analysis by
+	  "tuxway", cf: 20220903).
+	+ update config.guess, config.sub
+
+20220917
+	+ reduce memory-leak in tic by separating allocations for struct entry
+	  from TERMTYPE2 (cf: 20220430).
+	+ improve interaction between tic -v option and NCURSES_TRACE, by
+	  processing the latter only when -v option does not set _nc_tracing.
+	+ modify curses_trace() to show the trace-mask as symbols, e.g.,
+	  TRACE_ORDINARY, DEBUG_LEVEL(3).
+
+20220910
+	+ amend verbose-option change to make this affect level 3, e.g., using
+	  "tic -cv3 terminfo".
+	+ work around musl's nonstandard use of feature test macros by adding
+	  a definition for NCURSES_WIDECHAR to the generated ".pc" and *-config
+	  files (report by Sam James).
+
+20220903
+	+ modify verbose-option of infocmp, tic, toe to enable debug-tracing
+	  if that is configured.
+
+20220827
+	+ modify configure scripts to use overlooked cases for LD and
+	  PKG_CONFIG variables (report by Alan Webb, Gentoo #866398).
+	+ modify nsterm to use xterm+alt1049 (report by Paul Handly) -TD
+	+ modify putty to use xterm+alt1049 -TD
+
+20220820
+	+ fix some cppcheck warnings, mostly style, in ncurses and c++
+	  libraries and progs directory.
+	+ add curses_trace to ifdef's for START_TRACE in test/test.priv.h
+	+ update config.guess
+
+20220813
+	+ modify delscreen to more effectively delete all windows on the given
+	  screen.
+	+ amend portability note for delwin in manual page.
+	+ adapt test/test_delwin.c from example by Bill Gray.
+	+ account for prescreen data if freeing leaks in pthread-configuration
+	+ split-out _nc_set_read_thread(), to reduce compiler warnings about
+	  pthread_self(), which may/may not be a weak symbol.
+	+ improve pthread-configuration for test/worm.c
+
+20220806
+	+ amend end_of_stream() to allow for input files without a final
+	  newline.
+	+ check for non-textfiles to tic.
+
+20220729
+	+ fixes to build with dietlibc:
+	  + add configure check for fpathconf (report by Georg Lehner).
+	  + add configure check for math sine/cosine, needed in test/tclock,
+	    and eliminate pow() from test/hanoi (report by Georg Lehner).
+	  + use wcsnlen as an alternative to wmemchr if it is not found
+	    (adapted from patch by Georg Lehner).
+	+ trim out some unwanted linker options from ncurses*config and .pc
+	  files seen in Fedora 36+.
+
+20220724
+	+ add portability notes for delscreen and delwin in manual.
+	+ improve pthread-configuration for test/worm.c, test/rain.c
+	+ improve pointer/limit checks associated with deleting a screen
+	  (Debian #1015756).
+
+20220716
+	+ build-fix for test_mouse.c, for non-standard cfmakeraw.
+	+ improve shell-scripts with shellcheck
+	+ fix typo in run_tic.in (report/patch by Jan Starke).
+
+20220709
+	+ lock the prescreen data consistently in newterm, etc., for the
+	  pthreads configuration (report by Tom de Vries).
+
+20220703
+	+ add consistency check in tic for u6/u7/u8/u9 and NQ capabilities.
+	+ use NQ to flag entries where the terminal does not support query and
+	  response -TD
+	+ use ansi+enq and decid+cpr in cases where the terminal probably
+	  supported the u6-u9 extension -TD
+	+ add/use apollo+vt132, xterm+alt47 -TD
+
+20220625
+	+ improve man/curs_bkgd.3x, explaining that bkgdset can affect results
+	  for bkgd (report by Anton Vidovic).
+	+ correct dsl in dec+sl (report by Rajeev Pillai) -TD
+	+ add/use ansi+cpr, decid+cpr -TD
+
+20220618
+	+ add a null-pointer check for term_names field in copy_termtype(),
+	  needed for MinGW port (report by Peiyuan Song, cf: 20220521).
+	+ revise kon/kon2/jfbterm to undo "linux2.6" change to
+	  smacs/rmacs/enacs (Debian #1012800) -TD
+	+ amended note for att610+cvis0, as per documentation for att610,
+	  att620, att730 -TD
+
+20220612
+	+ modify waddch_literal() to allow for double-width base character when
+	  merging a combining character (report by Gavin Troy).
+	+ improve _tracecchar_t2() formatting of base+combining character.
+
+20220604
+	+ add note on portable memory-leak checking in man/curs_memleaks.3x
+	+ remove u6-u9 from teken-2018 -TD
+	+ set "xterm-new" to "xterm-p370", add "xterm-p371" -TD
+
+20220529
+	+ expanded notes for teken/syscons -TD
+	+ fix overlooked copying of extended string-heap in copy_termtype
+	  (cf: 20220430).
+	+ update config.guess
+
+20220521
+	+ improve memory-leak checking in several test-programs.
+	+ set trailing null on string passed from winsnstr() to wins_nwstr().
+	+ modify del_curterm() to fix memory-leak introduced by change to
+	  copy_termtype().
+
+20220514
+	+ further improvements to test/test_mouse.c; compare with ncurses test
+	  program menu A/a.
+
+20220507
+	+ add test/test_mouse.c (patch by Leonid S Usov).
+	+ add a few debug-traces for tic, fix a couple of memory-leaks.
+
+20220501
+	+ build-fix for debug-traces (report/patch by Chris Clayton).
+
+20220430
+	+ modify samples for xterm mouse 1002/1003 modes to use 1006 mode, and
+	  also provide for focus in/out responses -TD
+	+ modify default case in handle_wheel() to always report button-release
+	  events, e.g., for xterm mouse mode 1003 (patch by Leonid S Usov).
+	+ improve valid_entryname() to disallow characters used in terminfo
+	  syntax: '#', '=', '|', '\'.
+	+ alter copy_termtype() to allocate new str_table and ext_str_table
+	  data rather than relying upon its callers.
+	+ use calloc in _nc_init_entry() when allocating stringbuf, to ensure
+	  it is initialized.
+	+ add library-level TYPE_CALLOC for consistency with TYPE_MALLOC.
+	+ add some debug-traces for tic/infocmp.
+
+20220423
+	+ in-progress work on invalid_merge(), disable it (cf: 20220402).
+	+ fix memory leak in _nc_tic_dir() when called from _nc_set_writedir().
+	+ fix memory leak in tic when "-c" option is used.
+
+20220416
+	+ add a limit-check to guard against corrupt terminfo data
+	  (report/testcase by NCNIPC of China).
+	+ add check/warning in configure script if option --with-xterm-kbs is
+	  missing or inconsistent (Arch #74379).
+	+ add setlocale call to several test-programs.
+	+ allow extended-color number in opts parameter of wattr_on.
+
+20220409
+	+ add test/test_unget_wch.c
+
+20220402
+	+ amend extended_captype(), returning CANCEL if a string is explicitly
+	  cancelled.
+	+ make description-fields distinct -TD
+
+20220326
+	+ update teken -TD
+	+ add teken-16color, teken-vt and teken-sc -TD
+	+ add a few missing details for vte-2018 (report by Robert Lange) -TD
+
+20220319
+	+ add xgterm -TD
+	+ correct setal in mintty/tmux entries, add to vte-2018 (report by
+	  Robert Lange)
+	+ add blink to vte-2018 (report by Robert Lange)
+	+ improve tic warning about XT versus redundant tsl, etc.
+
+20220312
+	+ add xterm+acs building-block -TD
+	+ add xterm-p370, for use in older terminals -TD
+	+ add dec+sl to xterm-new, per xterm patch #371 -TD
+	+ add mosh and mosh-256color -TD
+
+20220305
+	+ replace obsolescent "-gnatg" option with "-gnatwa" and "-gnatyg", to
+	  work around build problems with gnat 12.
+	+ update external links in Ada95.html
+	+ trim unused return-value from canonical_name().
+
+20220226
+	+ fix issues found with coverity:
+	  + rewrite canonical_name() function of infocmp to ensure buffer size
+	  + corrected use of original tty-modes in tput init/reset subcommands
+	  + modify tabs program to limit tab-stop values to max-columns
+	  + add limit-checks for palette rgb values in test/ncurses.c
+	+ add a few null-pointer checks to help with static-analysis.
+	+ enforce limit on number of soft-keys used in c++ binding.
+	+ adjust a buffer-limit in write_entry.c to quiet a bogus warning from
+	  gcc 12.0.1
+
+20220219
+	+ expanded description in man/resizeterm.3x
+	+ additional workaround for ImageMagick in test/picsmap.c
+
+20220212
+	+ improve font-formatting in other manpages, for consistency.
+	+ correct/improve font-formatting in curs_wgetch.3x (patch by Benno
+	  Schulenberg).
+
+20220205
+	+ workaround in test/picsmap.c for use of floating point for rgb values
+	  by ImageMagick 6.9.11, which appears to use the wrong upper limit.
+	+ improve use of "trap" in shell scripts, using "fixup-trap".
+
+20220129
+	+ minor updates for test-packages
+	+ improve handling of --with-pkg-config-libdir option, allowing for the
+	  case where either $PKG_CONFIG_LIBDIR or the option value has a
+	  colon-separated list of directories (report by Rudi Heitbaum,
+	  cf: 20211113).
+	+ update kitty -TD
+
+20220122
+	+ add ABI 7 defaults to configure script.
+	+ add warning in configure script if file specified for "--with-caps"
+	  does not exist.
+	+ use fix for CF_FIX_WARNINGS from cdk-perl, ignoring error-exit on
+	  format-warnings.
+	+ improve readability of long parameterized expressions with the
+	  infocmp "-f" option by allowing split before a "%p" marker.
+
+20220115
+	+ improve checks for valid mouse events when an intermediate mouse
+	  state is not part of the mousemask specified by the caller (report by
+	  Anton Vidovic, cf: 20111022).
+	+ use newer version 1.36 of gnathtml for generating Ada html files.
+
+20220101
+	+ add section on releasing memory to curs_termcap.3x and
+	  curs_terminfo.3x manpages.
+
+20211225
+	+ improve markup, e.g., for external manpage links in the manpages
+	  (prompted by report by Helge Kreutzmann).
+
+20211219
+	+ install ncurses-examples programs in libexecdir, adding a wrapper
+	  script to invoke those.
+	+ add help-screen and screen-dump to test/combine.c
+
+20211211
+	+ add test/combine.c, to demo/test combining characters.
+
+20211204
+	+ improve configure check for getttynam (report by Werner Fink).
+
+20211127
+	+ fix errata in description fields (report by Eric Lindblad) -TD
+	+ add x10term+sl, aixterm+sl, ncr260vp+sl, ncr260vp+vt, wyse+sl -TD
+
+20211120
+	+ add dim, ecma+strikeout to st-0.6 -TD
+	+ deallocate the tparm cache when del_curterm is called for the last
+	  allocated TERMINAL structure (report/testcase by Bram Moolenaar,
+	  cf: 20200531).
+	+ modify test-package to more closely conform to Debian multi-arch.
+	+ if the --with-pkg-config-libdir option is not given, use
+	  ${libdir}/pkgconfig as a default (prompted by discussion with Ross
+	  Burton).
+
+20211115
+	+ fix memory-leak in delwin for pads (report by Werner Fink, OpenSUSE
+	  #1192668, cf:  20211106),
+
+20211113
+	+ minor clarification to clear.1 (Debian #999437).
+	+ add xterm+sl-alt, use that in foot+base (report by Jonas Grosse
+	  Sundrup) -TD
+	+ improve search-path check for pkg-config, for Debian testing which
+	  installs pkg-config with architecture-prefixes.
+
+20211106
+	+ improve check in misc/Makefile.in for empty $PKG_CONFIG_LIBDIR
+	+ modify wnoutrefresh to call pnoutrefresh if its parameter is a pad,
+	  rather than treating it as an error, and modify new_panel to permit
+	  its window-parameter to be a pad (report by Giorgos Xou).
+	+ fix a memory-leak in del_curterm (prompted by discussion with Bram
+	  Moolenaar, cf: 20210821).
+
+20211030
+	+ simplify some references to WINDOWS._flags using macros.
+	+ add a "check" rule in Ada95 makefile, to help with test-packages.
+	+ build-fix for cross-compiling to MingW, conditionally add -lssp
+
+20211026
+	+ corrected regex needed for older pkg-config used in Solaris 10.
+	+ amend configure option's auto-search to account for systems where
+	  none of the directories known to pkg-config exist, adapted from
+	  mailing-list comment (report by Milan P. Stanic).
+
+20211021 6.3 release for upload to ftp.gnu.org
+	+ update release notes
+	+ add "ncu2openbsd" script, to illustrate how to update an OpenBSD
+	  system to use a current ncurses release.
+
+20211018
+	+ check for screen size-change in scr_init() and scr_restore(), in case
+	  a screen dump does not match the current screen dimensions (report by
+	  Frank Tkalcevic).
+
+20211017
+	+ amend change for pkg-config to account for "none" being returned in
+	  the libdir-path result rather than "no" (report by Gabriele Balducci).
+
+20211016
+	+ build-fix for pmake with libtool.
+	+ improve make-tar.sh scripts, adding COPYING to tar file, and clean up
+	  shellcheck warnings.
+	+ add link for "reset6" manpage in test-package ncurses6-doc
+	+ revise configure option --with-pkg-config-libdir, using the actual
+	  search path from pkg-config or pkgconf using the output from --debug
+	  (report by Pascal Pignard).
+	+ freeze ABI in ".map" files.
+
+20211009
+	+ implement "+m" option in tabs program.
+	+ fill in some details for infoton -TD
+	+ fix spelling/consistency in several descriptions -TD
+	+ use vt420+lrmm in vt420 -TD
+	+ modify save_tty_settings() to avoid opening /dev/tty for cases other
+	  than reset/init, e.g., for clear.
+	+ modify output of "toe -as" to show first description found rather
+	  than the last.
+	+ improve tic checks for number of parameters of smglp, smgrp, smgtp,
+	  and smgbp (cf: 20020525).
+	+ correct off-by-one comparison in last_char(), which did not allow
+	  special case of ":" in a terminfo description field (cf: 20120407).
+	+ remove check in tic that assumes that none or both parameterized and
+	  non-parameterized margin-setting capabilities are present
+	  (cf: 20101002).
+
+20211002
+	+ use return-value from vsnprintf to reallocate as needed to allow for
+	  buffers larger than the screen size (report by "_RuRo_").
+	+ modify tset "-q" option to refrain from modifying terminal modes, to
+	  match the documentation.
+	+ add section on margins to terminfo.5, adapted from X/Open Curses.
+	+ make tput/tset warning messages consistently using alias names when
+	  those are used, rather than the underlying program's name.
+	+ improve tput usage message for aliases such as clear, by eliminating
+	  tput-specific portions.
+	+ add a check in toe to ensure that a "termcap file" is text rather
+	  than binary.
+	+ further build-fixes for OpenBSD 6.9, whose header files differ from
+	  the other BSDs.
+
+20210925
+	+ add kbeg to xterm+keypad to accommodate termcap applications -TD
+	+ add smglp and smgrp to vt420+lrmm, to provide useful data for the
+	  "tabs" +m option -TD
+	+ build-fix for gcc 3.4.3 with Solaris10, which does not allow forward
+	  reference of anonymous struct typedef.
+	+ modify tput to allow multiple commands per line.
+	+ minor fixes for tset manpage.
+
+20210911
+	+ adjust ifdef in test_opaque.c to fix build with ncurses 5.7
+	+ add testing note for xterm-{hp|sco|sun} -TD
+	+ corrected description for ansi.sys-old -TD
+	+ add xterm+nopcfkeys, to fill in keys for xterm-hp, xterm-sun -TD
+	+ use hp+arrows in a few places -TD
+	+ use hp+pfk-cr in a few places -TD
+
+20210905
+	+ correct logic in filtering of redefinitions (report by Sven Joachim,
+	  cf: 20210828).
+
+20210904
+	+ modify linux3.0 entry to reflect default mapping of shift-tab by
+	  kbd 1.14 (report by Jan Engelhardt) -TD
+	+ add historical note to tput, curses-terminfo and curses-color
+	  manpages based on source-code for SVr2, SVr3 and SVr4.
+	+ minor grammatical fixes for "it's" vs "its" (report by Nick Black).
+	+ amend fix for --disable-root-environ (report by Arnav Singh).
+	+ build-fix for compiling link_test
+	+ drop symbols GCC_PRINTF and GCC_SCANF from curses.h.in, to simplify
+	  use (Debian #993179).
+
+20210828
+	+ correct reversed check for --disable-root-environ (report/analysis
+	  by Arnav Singh, cf: 20210626).
+	+ apply gcc format attribute to prototypes which use a va_list
+	  parameter rather than a "..." variable-length parameter list
+	  (prompted by discussion in a tmux pull-request).
+	+ modify configure scripts to filter out redefinitions of _XOPEN_SOURCE,
+	  e.g., for NetBSD which generally supports 500, but 600 is needed for
+	  ncursesw.
+	+ improve documentation for tparm and static/dynamic variables.
+	+ improve typography in terminfo.5 (patch by Branden Robinson).
+
+20210821
+	+ improve tparm implementation of %P and %g, more closely matching
+	  SVr4 terminfo.
+	+ move internals of TERMINAL structure to new header term.priv.h
+	+ add "check" rule for ncurses/Makefile
+	+ corrected tsl capability for terminator -TD
+	+ add check in tic to report instances where tparm would detect an
+	  error in an expression (cf: 20201010).
+	+ correct a few places where SP->_pair_limit was used rather than
+	  SP->_pair_alloc (cf: 20170812).
+	+ fix missing "%d" for setaf/setab code 8-15 in xterm+direct16 (report
+	  by Florian Weimer) -TD
+	+ fix some documentation errata from OpenBSD changes.
+	+ update config.sub
+
+20210814
+	+ add workaround for broken pcre2 package in Debian 10, from xterm #369.
+
+20210807
+	+ ignore "--dynamic-linker" option in generated pkg/config files,
+	  adapted from "distr1" patch.
+	+ add CF_SHARED_OPTS case for Haiku, from patch in haikuports.
+
+20210731
+	+ add extensions in xterm+tmux and ecma+strikeout to ms-terminal,
+	  but cancel the non-working Cr and Ms capabilities -TD
+	+ add foot and foot-direct -TD
+
+20210724
+	+ add workaround for Windows Terminal's problems with CR/LF mapping to
+	  ms-terminal (patch by Juergen Pfeifer).
+	+ review/update current Windows Terminal vs ms-terminal -TD
+
+20210718
+	+ correct typo in "vip" comments (report by Nick Black), reviewed this
+	  against Glink manual -TD
+	+ fill in some missing pieces for pccons, to make it comparable to the
+	  vt220 entry -TD
+	+ modify mk-1st.awk to account for extra-suffix configure option
+	  (report by Juergen Pfeifer).
+	+ change default for --disable-wattr-macros option to help packagers
+	  who reuse wide ncursesw header file with non-wide ncurses library.
+	+ build-fix for test/test_opaque.c, for configurations without opaque
+	  curses structs.
+
+20210710
+	+ improve history section for tset manpage based on the 1BSD tarball,
+	  which preceded BSD's SCCS checkins by more than three years.
+	+ improve CF_XOPEN_CURSES macro used in test/configure (report by Urs
+	  Jansen).
+	+ further improvement of libtool configuration, adding a dependency of
+	  the install.tic rule, etc., on the library in the build-tree.
+	+ update config.sub
+
+20210703
+	+ amend libtool configuration to add dependency for install.tic, etc.,
+	  in ncurses/Makefile on the lower-level libraries.
+	+ modify configure script to support ".PHONY" make program feature.
+
+20210626
+	+ add configure option --disable-root-access, which tells ncurses to
+	  disallow most file-opens by setuid processes.
+	+ use default colors in pccon "op" -TD
+	+ correct rmacs/smacs in aaa+dec, aaa+rv -TD
+	+ add hpterm-color2 and hp98550-color (Martin Trusler)
+	+ regenerate man-html documentation.
+
+20210619
+	+ improve configure-macro used for dependencies of --disable-leaks such
+	  as --with-valgrind
+	+ trim trailing blanks from files
+
+20210612
+	+ fixes for scan-build, valgrind build/testing.
+	+ update config.guess
+
+20210605
+	+ add a summary of ncurses-specific preprocessor symbols to curses.h
+	  (prompted by discussion with Peter Farley, Bill Gray).
+
+20210522
+	+ regenerate configure scripts with autoconf 2.52.20210509 to eliminate
+	  an unnecessary warning in config.log (report by Miroslav Lichvar).
+	+ add a note in manual page to explain ungetch vs unget_wch (prompted
+	  by discussion with Peter Farley).
+	+ add sp-funcs for erasewchar, killwchar.
+	+ modify wgetnstr, wgetn_wstr to improve compatibility with SVr4 curses
+	  in its treatment of interrupt and quit characters (prompted by
+	  report/testcase by Bill Gray)
+	+ update config.guess, config.sub
+
+20210515
+	+ improve manual pages for wgetnstr, newwin (prompted by
+	  report/testcase by Bill Gray).
+
+20210508
+	+ modify tputs' error check to allow it to be used without first
+	  calling tgetent or setupterm, noting that terminfo initialization
+	  is required for supporting the terminfo delay feature (report by
+	  Sebastiano Vigna).
+	+ fix several warnings from clang --analyze
+	+ add null-pointer check in comp_parse.c, when a "use=" clause refers
+	  to a nonexisting terminal description (report/patch by Miroslav
+	  Lichvar, cf: 20210227).
+
+20210501
+	+ add a special case in the configure script to work around one of the
+	  build-time breakages reported for OpenBSD 6 here:
+	     https://www.mail-archive.com/bugs@openbsd.org/msg13200.html
+	  There is no workaround for the other issue, a broken linker spec.
+	+ modify configure check for libtool to prevent accidental use of an
+	  OpenBSD program which uses the same name.
+	+ update config.guess, config.sub
+
+20210424
+	+ avoid using broken system macros for snprintf which interfere with
+	  _nc_SLIMIT's conditionally adding a parameter when the string-hacks
+	  configure option is enabled.
+	+ add a "all::" rule before the new "check" rule in test/Makefile.in
+
+20210418
+	+ improve CF_LINK_FUNCS by ensuring that the source-file is closed
+	  before linking to the target.
+	+ add "check" rules for headers in c++, progs and test-directories.
+	+ build-fix for termsort module when configured with termcap (reports
+	  by Rajeev V Pillai, Rudi Heitbaum).
+
+20210417
+	+ extend --disable-pkg-ldflags option to also control whether $LDFLAGS
+	  from the build is provided in -config and .pc files (Debian #986764).
+	+ fix some cppcheck warnings, mostly style, in ncurses and c++
+	  libraries and progs directory.
+	+ fix off-by-one limit for tput's processing command-line arguments
+	  (patch by Hadrien Lacour).
+
+20210403
+	+ fix some cppcheck warnings, mostly style, in ncurses library and
+	  progs directory.
+	+ improve description of BSD-style padding in curs_termcap.3x
+	+ improved CF_C11_NORETURN macro, from byacc changes.
+	+ fix "--enable-leak" in CF_DISABLE_LEAKS to allow turning
+	  leak-checking off later in a set of options.
+	+ relax modification-time comparison in CF_LINK_FUNCS to allow it to
+	  accept link() function with NFS filesystems which change the mtime
+	  on the link target, e.g., several BSD systems.
+	+ call delay_output_sp to handle BSD-style padding when tputs_sp is
+	  called, whether directly or internally, to ensure that the SCREEN
+	  pointer is passed correctly (reports by Henric Jungheim, Juraj
+	  Lutter).
+
+20210327
+	+ build-fixes for Solaris10 /bin/sh
+	+ fix some cppcheck warnings, mostly style, in ncurses test-programs,
+	  form and menu libraries.
+
+20210323
+	+ add configure option --enable-stdnoreturn, making the _Noreturn
+	  keyword optional to ease transition (prompted by report by
+	  Rajeev V Pillai).
+
+20210320
+	+ improve parameter-checking in tput by forcing it to analyze any
+	  extended string capability, e.g., as used in the Cs and Ms
+	  capabilities of the tmux description (report by Brad Town,
+	  cf: 20200531).
+	+ remove an incorrect free in the fallback (non-checking) version of
+	  _nc_free_and_exit (report by Miroslav Lichvar).
+	+ correct use-ordering in some xterm-direct flavors -TD
+	+ add hterm, hterm-256color (Mike Frysinger)
+	+ if the build-time compiler accepts c11's _Noreturn keyword, use that
+	  rather than gcc's attribute.
+	+ change configure-check for gcc's noreturn attribute to assume it is
+	  a prefix rather than suffix, matching c11's _Noreturn convention.
+	+ add "lint" rule to c++/Makefile, e.g., with cppcheck.
+
+20210313
+	+ improve configure CF_LD_SEARCHPATH macro used for ncurses*-config and
+	  ".pc" files, from dialog changes.
+	+ reduce dependency of math-library in test programs.
+	+ minor fixes for test_tparm.c (cf: 20210306)
+	+ mention "ncurses" prefix in curses_version() manpage (report by
+	  Michal Bielinski).
+
+20210306
+	+ improved test/test_tparm.c, by limiting the tests to capabilities
+	  that might have parameters or padding, and combined with tputs test.
+	+ improve discussion of padding versus tparm and tputs in
+	  man/curs_terminfo.3x
+	+ update portability note for FreeBSD in man/tput.1
+
+20210227
+	+ modify tic/infocmp to eliminate unnecessary "\" to escape ":" in
+	  terminfo format.
+	+ add check in tic for duplicate "use=" clauses.
+
+20210220
+	+ improve tic warning when oc/op do not mention SGR 39/49 for xterm
+	  compatible XT flag.
+	+ revert change to lib_addch.c in waddch_literal() from 20210130, since
+	  the followup fix in PutCharLR() actually corrects the problem while
+	  this change causes too-early filling/wrapping (report by Johannes
+	  Altmanninger).
+	+ add/use vt220+pcedit and vt220+vtedit  -TD
+	+ add scrt/securecrt and absolute -TD
+	+ add nel to xterm-new, though supported since X11R5 -TD
+	+ add/use xterm+nofkeys -TD
+	+ move use of ecma+italics from xterm-basic to xterm+nofkeys -TD
+
+20210213
+	+ add test/back_ground.c, to exercise the wide-character background
+	  functions.
+	+ add a check in _nc_build_wch() in case the background character is a
+	  wide-character, rather than a new part of a multibyte character.
+	+ improve tracemunch's coverage of form/menu/panel libraries.
+	+ improve tracemunch's checking/reporting the type for the first
+	  parameter, e.g., "WINDOW*" rather than "#1".
+
+20210206
+	+ provide for wide-characters as background character in wbkgrnd
+	  (report/testcase by Anton Vidovic)
+	+ add name for Fedora's pcre2 to configure check for "--with-pcre2"
+	  option, from xterm #363 -TD
+	+ modify adjustment in PutCharLR to restore the cursor position before
+	  writing to the lower-right corner, rather than decrementing the
+	  cursor column, in case it was a double-width character (cf: 20210130).
+
+20210130
+	+ correct an off-by-one in comparison in waddch_literal() which caused
+	  scrolling when a double-cell character would not fit at the lower
+	  right corner of the screen (report by Benno Schulenberg).
+	+ split-out att610+cvis, vt220+cvis, vt220+cvis8 -TD
+	+ add vt220-base, for terminal emulators which generally have not
+	  supported att610's blinking cursor control -TD
+	+ use vt220+cvis in vt220, etc -TD
+	+ use att610+cvis, xterm+tmux and ansi+enq in kitty -TD
+	+ use vt220+cvis in st, terminology, termite since they ignore
+	  blinking-cursor detail in att610+cvis -TD
+
+20210123
+	+ modify package/config scripts to provide an explicit -L option for
+	  cases when the loader search path has other directories preceding
+	  the one in which ncurses is installed (report by Yuri Victorovich).
+	+ minor build-fixes in configure script and makefiles to work around
+	  quirks of pmake.
+
+20210116
+	+ add comment for linux2.6 regarding CONFIG_CONSOLE_TRANSLATIONS
+	  (report by Patrick McDermott) -TD
+	+ make opts extension for getcchar work as documented for ncurses 6.1,
+	  adding "-g" flag to test/demo_new_pair to illustrate.
+
+20210109
+	+ fix errata in man/ncurses.3x from recent updates.
+	+ improve quoting/escaping in configure script, uses some features of
+	  autoconf 2.52.20210105
+
+20210102
+	+ update man/curs_memleaks.3x, to include <term.h> which declares
+	  exit_terminfo.
+	+ clarify man/curs_terminfo.3x, to mention why the macro setterm is
+	  defined in <curses.h>, and remove it from the list of prototypes
+	  (prompted by patch by Graeme McCutcheon).
+	+ amend man/curs_terminfo.3x, to note that <curses.h> is required
+	  for certain functions, e.g., those using chtype or attr_t for
+	  types, as well as mvcur (cf: 20201031).
+	+ use parameter-names in prototypes in curs_sp_funcs.3x, for
+	  consistency with other manpages.
+
+20201227
+	+ update terminology entry to 1.8.1 -TD
+	+ fix some compiler-warnings which gcc8 reports incorrectly.
+
+20201219
+	+ suppress hyphenation in generated html for manpages, to address
+	  regression in upgrade of groff 1.22.2 to 1.22.3.
+	+ fix inconsistent sort-order in see-also sections of manpages (report
+	  by Chris Bennett).
+
+20201212
+	+ improve manual pages for form field-types.
+
+20201205
+	+ amend build-fixes for gnat 10 to work with certain systems lacking
+	  gprbuild (cf: 20200627).
+	+ eliminate an additional strlen and wsclen.
+	+ eliminate an unnecessary strlen in waddnstr() (suggested by Benjamin
+	  Abendroth).
+	+ modify inopts manpage, separating the items for nodelay and notimeout
+	  (patch by Benno Schulenberg).
+	+ correct mlterm3 kf1-kf4 (Debian #975322) -TD
+	+ add flash to mlterm3 -TD
+
+20201128
+	+ add Smulx to alacritty (Christian Duerr).
+	+ add rep to PuTTY -TD
+	+ add putty+keypad -TD
+	+ add another fflush(stdout) in _nc_flush() to handle time-delays in
+	  the middle of strings such as flash when the application uses
+	  low-level calls rather than curses (cf: 20161217).
+	+ modify configure check for c89/c99 aliases of clang to use its
+	  -std option instead, because some platforms, in particular macOS,
+	  do not provide workable c89/c99 aliases.
+
+20201121
+	+ fix some compiler-warnings in experimental Windows-10 driver.
+	+ add the definitions needed in recent configure-check for clang
+	  (report by Steven Pitman).
+
+20201114
+	+ fix some compiler-warnings in experimental Windows-10 driver.
+	+ modify a check for parameters in terminfo capabilities to handle the
+	  special case where short extended capability strings were not
+	  converted from terminfo to termcap format.
+	+ modify CF_MIXEDCASE_FILENAMES macro, adding darwin as special case
+	  when cross-compiling (report by Eli Rykoff).
+
+20201107
+	+ update kitty+common -TD
+	+ add putty+screen and putty-screen (suggested by Alexandre Montaron).
+	+ explain in ncurses.3x that functions in the tinfo library do not rely
+	  upon wide-characters (prompted by discussion with Reuben Thomas).
+
+20201031
+	+ modify MKterm.h.in so that it is not necessary to include <curses.h>
+	  before <term.h> (prompted by discussion with Reuben Thomas).
+	+ review/improve synopsis for curs_sp_funcs.3x (prompted by discussion
+	  with Reuben Thomas).
+	+ improve format of output in tic's check_infotocap() function, to
+	  ensure that the messages contain only printable text.
+	+ modify configure-check for clang to verify that -Qunused-arguments
+	  is supported.  IBM's xlclang does not support it (report by Steven
+	  Pitman).
+
+20201024
+	+ provide workaround configure-check for bool when cross-compiling.
+	+ fix a potential indexing error in _nc_parse_entry(), seen with
+	  Herlim's test data using address-sanitizer.
+	+ change a null-pointer check in set_curterm to a valid-string check,
+	  needed in to tic's use-resolution when pad_char is cancelled
+	  (report/testcase by Robert Sebastian Herlim)
+	+ improve tic's -c option to validate the number and type of parameters
+	  and compare against expected number/type before deciding which set of
+	  parameter-lists to use in tparm calls (report/testcase by Robert
+	  Sebastian Herlim).
+	+ fix a link for tabs.1 manpage in announce.html.in (report by Nick
+	  Black), as well as some fixes via linklint.
+
+20201017
+	+ improve manpage typography.
+	+ improve discussion in curs_addch.3x of the use of unctrl to display
+	  nonprintable characters.
+	+ add a note in terminfo.5 explaining that no-parameter strings such
+	  as sgr0 or cnorm should not be used with tparm.
+
+20201010
+	+ correct sgr in aaa+rv (report by Florian Weimer) -TD
+	+ fix some sgr inconsistencies in d230c, ibm6153, ibm6154,
+	  ncrvt100an -TD
+	+ improve tic's check for errors detected in tparm (prompted by
+	  discussion with Florian Weimer).
+	+ set output-mode to binary in experimental Windows-10 driver (Juergen
+	  Pfeifer).
+
+20201003
+	+ remove output-related checks for nl/nonl (report by Leon Winter).
+	+ change tmux's kbs to ^? (report by Premysl Eric Janouch)
+	+ simplify mlterm initialization with DECSTR -TD
+	+ fix a typo in man/curs_terminfo.3 (Reuben Thomas).
+	+ add tmux-direct (tmux #2370, Debian #895754)
+	+ add user-defined capabilities from mintty to Caps-ncurses, for
+	  checking consistency with tic.
+
+20200926
+	+ correct configure-check for gnurx library.
+	+ regenerate llib-* files.
+	+ modify tracemunch and the panel library to show readable traces for
+	  panel- and user-pointers.
+
+20200919
+	+ update mlterm3 for 3.9.0 (report by Premysl Eric Janouch) -TD
+
+20200918
+	+ corrected condition for appending curses.events to the generated
+	  curses.h (report by Sven Joachim, Debian #970545).
+
+20200912
+	+ add configure-check for systre/tre with mingw configuration, to get
+	  the library-dependencies as seen in msys2 configuration for mingw64.
+	+ build-fixes for the win32-driver configuration.
+	+ use more defensive binary mode setting for Win32 (Juergen Pfeifer).
+
+20200907
+	+ fix regression in setupterm validating non-empty $TERM (report by
+	  Soren Tempel).
+
+20200906
+	+ merge/adapt in-progress work by Juergen Pfeifer for new version of
+	  win32-driver.
+	+ correct description of vt330/vt340 (Ross Combs).
+
+20200831
+	+ build-fix for awk-scripts modified for win32-driver (report by Werner
+	  Fink).
+
+20200829
+	+ remove a redundant NCURSES_EXPORT as a build-fix for "Maarten
+	  Anonymous".
+	+ merge/adapt in-progress work by Juergen Pfeifer for new version of
+	  win32-driver.
+	+ modify configure script, moving gcc -Werror options to EXTRA_CFLAGS
+	  to avoid breaking configure-checks (adapted from ongoing work on
+	  mawk and lynx).
+	> errata for terminfo.src (report by Florian Weimer):
+	+ correct icl6404 csr
+	+ correct ti916 cup
+	+ improve ndr9500
+
+20200822
+	+ improve version-number extraction in MKlib_gen.sh
+	+ make the test-package for manpages installable by adjusting the
+	  man_db.renames file.
+	+ correct an off-by-one loop-limit in convert_strings function
+	  (report by Yue Tai).
+	+ add CF_SHARED_OPTS cases for HPE NonStop systems (Randall S Becker).
+	+ modify CF_SHARED_OPTS case for NetBSD to use the same "-shared"
+	  option for the non-rpath case as for the rpath case, to allow gcc to
+	  provide suitable runtime initialization (report by Rajeev V Pillai).
+
+20200817
+	+ reduce build-warnings by excluding ncurses-internals from deprecation
+	  warnings.
+	+ mark wgetch-events feature as deprecated.
+	+ add definition for $(LIBS) to ncurses/Makefile.in, to simplify builds
+	  using the string-hacks option.
+	+ prevent KEY_EVENT from appearing in curses.h unless the configure
+	  option --enable-wgetch-events is used (report by Werner Fink).
+
+20200816
+	+ amend tic/infocmp check to allow for the respective tool's absence
+	  (report by Steve Wills, cf: 20200808).
+	+ improved some of the build-scripts with shellcheck
+	+ filter out -MT/-MD/-MTd/-MDd options in script for Visual Studio C++
+	  (discussion with "Maarten Anonymous").
+
+20200808
+	+ improve discussion of the system's tic utility when used as part
+	  of cross-compiling (discussion with Keith Marshall).
+	+ modify configuration checks for build-time tic/infocmp to use
+	  AC_CHECK_TOOL. That can still be overridden by --with-tic-path and
+	  --with-infocmp-path when fallbacks are used, but even if not using
+	  fallbacks, the improved check may help with cross-compiling
+	  (discussion with Keith Marshall).
+	+ other build-fixes for Ada95 with MinGW.
+	+ modify Ada95 source-generation utility to write to a file given as
+	  parameter rather than to the standard output, allowing builds with
+	  MinGW.
+
+20200801
+	+ remove remaining parts of checks for ISC Unix (cf: 20121006).
+	+ add user32.lib to LDFLAGS for Visual Studio C++ configuration
+	  (discussion with "Maarten Anonymous").
+	+ modify MKkey_defs.sh to hide ncurses' definition of KEY_EVENTS to
+	  reduce Visual Studio C++ redefinition warnings.
+	+ improve/update checks for external functions in test/configure
+
+20200725
+	+ set LINK_TESTS in CF_SHARED_OPTS for msvc (patch by
+	  "Maarten Anonymous")
+	+ improved workaround for redefinition-warnings for KEY_EVENT.
+	+ improve man/term.5 section on legacy storage format (report by
+	  Florian Weimer).
+
+20200718
+	+ reduce redefinition-warnings for KEY_EVENT when building with Visual
+	  Studio C++.
+	+ define NCURSES_STATIC when compiling programs to link with static
+	  libraries, to work with MinGW vs Visual Studio C++.
+	> additional changes for building with Visual Studio C++ and msys2
+	  (reports/patches by "Maarten Anonymous")
+	+ modify c++/Makefile.in to set the current directory while compiling
+	  the main program, so the linker can find related objects.
+	+ several changes to allow the c++/demo program to compile/link.
+	+ change an ifdef in test-directory, to use VC++ wide-character funcs.
+
+20200711
+	+ fix pound-sign mapping in acsc of linux2.6 entry (report by Ingo
+	  Bruckl).
+	+ additional changes for building with Visual Studio C++ and msys2
+	  (reports/patches by "Maarten Anonymous")
+	+ build-improvements for Windows 10 and MinGW (patch by Juergen
+	  Pfeifer).
+	+ fix a typo in curs_printw.3x (patch by William Pursell).
+	+ fix two errors in infotocap which allowed indexing outside the
+	  buffer (report/testcases by Zhang Gan).
+	+ update length of strings in infocmp's usage function to restore a
+	  trailing null on the longest string (report/testcase by Zhang Gen).
+
+20200704
+	+ modify version-check with Ada generics to use the same pattern as in
+	  the check for supported gnat versions (report by Pascal Pignard).
+	> additional changes for building with Visual Studio C++ and msys2
+	  (patches by "Maarten Anonymous"):
+	+ adjust headers/declarations to provide for "dllimport" vs "dllexport"
+	  declarations when constructing DLLs, to worko with Visual Studio C++.
+
+20200627
+	+ build-fixes for gnat 10.1.1, whose gnatmake drops integration with
+	  gprbuild.
+	+ correct buffer-length in test/color_name.h
+
+20200613
+	+ update list of functions in ncurses.3x
+	+ move dlclose() call from lib_mouse.c to delscreen() to avoid a case
+	  in the former which could be called from SIGTSTP handler (Debian
+	  #961097).
+
+20200606
+	+ add xterm+256color2, xterm+88color2, to deprecate nonstandard usage
+	  in xterm+256color, xterm+88color -TD
+	+ add shifted Linux console keys in linux+sfkeys entry for
+	  screen.linux (report by Alexandre Montaron).
+	+ use vt100+enq in screen (report by Alexandre Montaron).
+	+ add screen.linux-s alias (suggested by Alexandre Montaron).
+
+20200531
+	+ correct configure version-check/warnng for g++ to allow for 10.x
+	+ re-enable "bel" in konsole-base (report by Nia Huang)
+	+ add linux-s entry (patch by Alexandre Montaron).
+	+ drop long-obsolete convert_configure.pl
+	+ add test/test_tparm.c, for checking tparm changes.
+	+ improve parameter-checking for tparm, adding function _nc_tiparm() to
+	  handle the most-used case, which accepts only numeric parameters
+	  (report/testcase by "puppet-meteor").
+	+ use a more conservative estimate of the buffer-size in lib_tparm.c's
+	  save_text() and save_number(), in case the sprintf() function
+	  passes-through unexpected characters from a format specifier
+	  (report/testcase by "puppet-meteor").
+	+ add a check for end-of-string in cvtchar to handle a malformed
+	  string in infotocap (report/testcase by "puppet-meteor").
+
+20200523
+	+ update version-check for gnat to allow for gnat 10.x to 99.x
+	+ fix an uninitialized variable in lib_mouse.c changes (cf: 20200502)
+	+ add a check in EmitRange to guard against repeat_char emitting digits
+	  which could be interpreted as BSD-style padding when --enable-bsdpad
+	  is configured (report/patch by Hiltjo Posthuma).
+	+ add --disable-pkg-ldflags to suppress EXTRA_LDFLAGS from the
+	  generated pkg-config and ncurses*-config files, to simplify
+	  configuring in the case where rpath is used but the packager wants
+	  to hide the feature (report by Michael Stapelberg).
+	> fixes for building with Visual Studio C++ and msys2 (patches by
+	  "Maarten Anonymous"):
+	+ modify CF_SHARED_OPTS to generate a script which translates linker
+	  options into Visual Studio's dialect.
+	+ omit parentheses around function-names in generated lib_gen.c to
+	  work around a Visual Studio C++ limitation.
+
+20200516
+	+ add notes on termcap.h header in curs_termcap.3x
+	+ update notes on vscode / xterm.js -TD
+
+20200509
+	+ add "-r" option to the dots test-programs, to help with scripting
+	  a performance comparison.
+	+ build-fix test/move_field.c for NetBSD curses, whose form headers
+	  use different names than SVr4 or ncurses.
+
+20200502
+	+ add details on the change to Linux SGR 21 in 2018 -TD
+	+ add xterm-direct16 and xterm-direct256 -TD
+	+ modify lib_mouse.c to check for out-of-range button numbers, convert
+	  those to position reports.
+
+20200425
+	+ use vt100+fnkeys in putty -TD
+	+ fix a typo in tput.1; "columns" should be "cols".
+
+20200418
+	+ improve tracemunch logic for "RUN" compaction.
+	+ fix a special case in wresize() where copying the old text did not
+	  check if the last cell on a row was the beginning of a fullwidth
+	  character (adapted from patch by Benno Schulenberg).
+	+ use vt52+keypad in xterm-vt52, from xterm #354 -TD
+	+ improve see-also section of user_caps.5
+
+20200411
+	+ fix find_pair(), overlooked when refactoring for _nc_reserve_pairs()
+	  (report/testcase by Brad Town, cf: 20170812).
+	+ add a trailing null for magic-string in putwin, flagged by gcc 10
+	+ update check for gcc version versus gnat to work with gcc 10.x
+
+20200404
+	+ modify -fvisibility check to work with g++
+	> fixes for building with Visual Studio C++ and msys2 (patches by
+	  "Maarten Anonymous"):
+	+ add configure option and check for gcc -fvisibility=hidden feature
+	+ define NCURSES_NOMACROS in lib_gen.c to work around Visual Studio
+	  C++ preprocessor limitations.
+	+ modify some of the configure-macros, as well as mk-1st.awk to work
+	  with Visual Studio C++ default filenaming.
+
+20200328
+	+ correct length of buffer copied in dup_field().
+	+ remove "$(srcdir)/" from path of library.gpr, needed for out-of-tree
+	  builds of Ada95 (patch by Adam Van Ymeren).
+
+20200321
+	+ improve configure-checks to reduce warnings about unused variables.
+	+ improve description of error-returns in waddch and waddnstr manual
+	  pages (prompted by patch by Benno Schulenberg).
+	+ add test/move_field.c to demonstrate move_field(), and a stub for
+	  a corresponding demo of dup_field().
+
+20200314
+	+ add history note to curs_scanw.3x for <stdarg.h> and <varargs.h>
+	+ add history note to curs_printw.3x for <stdarg.h> and <varargs.h>
+	+ add portability note to ncurses.3x regarding <stdarg.h>
+
+20200308
+	+ update copyright notices in test-packages.
+	+ modify tracemunch to guard against errors in its known_p1 table.
+	+ add several --with-xxx-libname options, to help with pkgsrc (prompted
+	  by discussion with Thomas Klausner).
+
+20200301
+	+ modify wbkgd() and wbkgrnd() to avoid storing a null in the
+	  background character, because it may be used in cases where the
+	  corresponding 0x80 is not treated as a null (report by Marc Rechte,
+	  cf: 20181208).
+
+20200229
+	+ modify CF_NCURSES_CONFIG to work around xcode's c99 "-W" option,
+	  which conflicts with conventional use for passing linker options.
+	> fixes for building with Visual Studio C++ and msys2 (patches by
+	  "Maarten Anonymous"):
+	+ check for pcre2posix.h instead of pcre2-posix.h
+	+ add case in CF_SHARED_OPTS for msys2 + msvc
+	+ add fallback definition for STDIN_FILENO in progs.priv.h
+	+ modify win_driver.c to use _alloca() rather than gcc's variable
+	  length array feature.
+	+ add NCURSES_IMPEXP to ncurses wrapped-variable declarations
+	+ remove NCURSES_IMPEXP from class variables in c++/cursslk.h
+	+ remove fallback prototype for exit() from c++/etip.h.in
+	+ use configured check for <sys/time.h> in a couple of places
+	+ conditionally include winsock.h in ncurses/win32con/gettimeofday.c,
+	  because Visual Studio needs this for the timestruct declaration.
+	+ adjust syntax in a couple of files using the NCURSES_API symbol.
+
+20200222
+	+ expanded note in ncurses.3x regarding automatically-included headers
+	+ improve vt50h and vt52 based on DECScope manual -TD
+	+ add/use vt52+keypad and vt52-basic -TD
+	+ check/workaround for line-too-long in Ada95 generate utility when
+	  building out-of-tree.
+	+ improve/update HEADER_DEPS in */Makefile.in
+	+ add "check" rule to include/Makefile, to demonstrate that the headers
+	  include all of the required headers for the types used.
+
+20200215
+	+ improve manual page for panel library, extending the portability
+	  section as well as documenting error-returns.
+	+ show tic's version when installing terminal database in run_tic.sh
+	+ correct check for gcc vs other compilers used in ncurses 6.0, from
+	  FreeBSD patch by Kyle Evans (cf: 20150725).
+	+ add notes for 6.2 to INSTALL.
+
+20200212 6.2 release for upload to ftp.gnu.org
+	+ update release notes
+	+ minor build-fixes, mostly to test-package scripts
+
+20200208
+	+ modify check for sizeof(wchar_t) to ensure it gives useful result
+	  when cross-compiling.
+	+ drop assumption in configure script that Cygwin's linker is broken.
+	+ define NCURSES_BROKEN_LINKER if the broken-linker feature is used,
+	  to simplify configure-checks for ncurses-examples.
+
+20200202
+	+ reassert copyright on ncurses, per discussion in ncurses FAQ:
+	  https://invisible-island.net/ncurses/ncurses.faq.html#relicensed
+
+20200201
+	+ modify comparison in make_hash.c to correct a special case in
+	  collision handling for Caps-hpux11
+	+ add testing utility report_hashing to check hash-tables used for
+	  terminfo and termcap names.
+	+ fix a missing prototype for _nc_free_and_exit().
+	+ update a few comments about tack 1.07
+	+ use an awk script to split too-long pathnames used in Ada95 sample
+	  programs for explain.txt
+
+20200118
+	+ expanded description of XM in user_caps.5
+	+ improve xm example for xterm+x11mouse, xterm+sm+1006 -TD
+	+ add history section to curs_slk.3x and curs_terminfo.3x manpages.
+	+ update alacritty entries for 0.4.0 (prompted by patch by
+	  Christian Durr) -TD
+	+ correct spelling errors found with codespell.
+	+ fix for test/configure, from xterm #352.
+
+20200111
+	+ improve configure macros which check for the X11/Intrinsic.h header,
+	  to accommodate recent MacOS changes.
+	+ suppress gcc's -Winline warning; it has not been useful for some time
+	+ update config.guess, config.sub
+
+20200104
+	+ modify a couple of macros in aclocal.m4 to allow autoconf 2.69 to
+	  "work", to help illustrate discussion in
+	  https://invisible-island.net/autoconf/my-autoconf.html
+	+ fix some warnings from autoheader-252
+
+20191228
+	+ in gen-pkgconfig.in, move the RPATH_LIST and PRIVATE_LIBS assignments
+	  past the various prefix/libdir assignments, to allow for using those
+	  symbols, e.g., as done via CF_SHARED_OPTS.
+	+ improve ncurses*-config and pc-files by filtering out linker-specs.
+	+ modify test-package to more closely match Fedora's configuration
+	  for PIE/PIC feature and debug-packages.
+
+20191221
+	+ correct pathname used in Ada95 sample programs for explain.txt, to
+	  work with test-packages.
+	+ improve tracemunch:
+	  + keep track of TERMINAL* values
+	  + if tracing was first turned on after initialization, attempt to
+	    show distinct screen, window and terminal names anyway.
+	+ ensure that GCC_NORETURN is defined in term.h, because the prototype
+	  for exit_terminfo() uses it (report by Werner Fink).
+
+20191214
+	+ add exit_curses() and exit_terminfo() to replace internal symbols for
+	  leak-checking.
+
+20191207
+	+ fix a few warnings for test-package builds
+	+ add curses_trace(), to replace trace().
+
+20191130
+	+ add portability section to curs_getcchar manpage (prompted by
+	  discussion with Nick Black).
+	+ improve portability discussion of ACS characters in curs_addch
+	  manpage.
+	+ improve typography for double-quotes in manpages.
+
+20191123
+	+ fix typo for MinGW rpm test-package.
+	+ workaround in rpm specs for NFS problems in Fedora 31.
+
+20191116
+	+ modify ncurses/Makefile.in to fix a case where Debian/testing changes
+	  to the ld --as-needed configuration broke ncurses-examples test
+	  packages.
+	+ drop library-dependency on psapi for MinGW port, since win_driver.c
+	  defines PSAPI_VERSION to 2, making it use GetProcessImageFileName
+	  from kernel32.dll (prompted by patch by Simon Sobish, cf: 20140503).
+
+20191109
+	+ add warning-check in tic for terminals with parm_dch vs parm_ich.
+	+ drop ich1 from rxvt-basic, Eterm and mlterm to improve compatibility
+	  with old non-curses programs -TD
+	+ reviewed st 0.8.2, updated some details -TD
+	+ use ansi+rep several places -TD
+	+ corrected tic's check for ich1 (report by Sebastian J. Bronner,
+	  cf: 20020901).
+
+20191102
+	+ check parameter of set_escdelay, return ERR if negative.
+	+ check parameter of set_tabsize, return ERR if not greater than zero
+	  (report/patch by Anthony Sottile).
+	+ revise CF_ADD_LIBS macro to prepend rather than append libraries.
+	+ add "xterm-mono" to help packagers (report by Sven Joachim) -TD
+
+20191026
+	+ add a note in man/curs_add_wch.3x about Unicode terminology for the
+	  line-drawing characters (report by Nick Black).
+	+ improve comment in lib_tgoto.c regarding the use of \200 where a
+	  \0 would be intended by the caller (report by "64 bit", cf: 20000923).
+	+ modify linux-16color to accommodate Linux console driver change in
+	  early 2018 (report by Dino Petrucci).
+
+20191019
+	+ modify make_hash to not require --disable-leaks, to simplify building
+	  with address-sanitizer.
+	+ modify tic to exit if it cannot remove a conflicting name, because
+	  treating that as a partial success can cause an infinite loop in
+	  use-resolution (report/testcase by Hongxu Chen, cf: 20111001).
+
+20191015
+	+ improve buffer-checks in captoinfo.c, for some cases when the
+	  input string is shorter than expected.
+	> fix two errata in tic (report/testcases by Hongxu Chen):
+	+ check for missing character after backslash in write_it
+	+ check for missing characters after "%>" when converting from termcap
+	  syntax (cf: 980530).
+
+20191012
+	+ amend recent changes to ncurses*-config and pc-files to filter out
+	  Debian linker-flags (report by Sven Joachim, cf: 20150516).
+	+ clarify relationship between tic, infocmp and captoinfo in manpage.
+	+ check for invalid hashcode in _nc_find_type_entry and
+	  _nc_find_name_entry.
+	> fix several errata in tic (reports/testcases by "zjuchenyuan"):
+	+ check for invalid hashcode in _nc_find_entry.
+	+ check for missing character after backslash in fmt_entry
+	+ check for acsc with odd length in dump_entry in check for one-one
+	  mapping (cf: 20060415);
+	+ check length when converting from old AIX box_chars_1 capability,
+	  overlooked in changes to eliminate strcpy (cf: 20001007).
+
+20191005
+	+ modify the ncurse*-config and pc-files to more closely match for the
+	  -I and -l options.
+
+20190928
+	+ amend the ncurses*-config and pc-files to take into account the rpath
+	  hack which differed between those files.
+	+ improve -L option filtering in ncurses*-config
+	+ improve recovery from error when reading command-character in
+	  test/ncurses.c, showing the relevant error message and not exiting on
+	  EINTR (cf: 20180922)
+
+20190921
+	+ add a note in resizeterm manpage about top-level windows which touch
+	  the screen's borders.
+	+ modify configure-checks for gnat to identify each of the tools path
+	  and version.
+
+20190914
+	+ build-fixes for Ada95 configure-script and corresponding test package
+
+20190907
+	+ add --with-ada-libname option and modify Ada95 configuration to
+	  allow renaming the "AdaCurses" library (prompted by proposed changes
+	  by Pascal Pignard).
+	+ modify configure script to distinguish gcc from icc and clang when
+	  the --enable-warnings option is not used, to avoid unnecessary
+	  warnings about unrecognized inline options (report by Sven Joachim).
+
+20190831
+	+ build-fixes for configuration using --program-suffix with Ada95,
+	  noticed with MacOS but applicable to other platforms without
+	  libpanelw, etc.
+
+20190824
+	+ fix some cppcheck warnings, mostly style, in ncurses test-programs.
+
+20190817
+	+ amend 20181208 changes for wbkgd() and wbkgrnd(), fixing a few
+	  details where it still differed from SVr4.
+	+ fix some cppcheck warnings, mostly style, in ncurses test-programs.
+
+20190810
+	+ fix a few more coverity warnings.
+
+20190803
+	+ improve loop limits in _nc_scroll_window() to handle a case where
+	  the scrolled data is a pad which is taller than the window (patch
+	  by Rob King).
+	+ amend the change to screen, because tmux relies upon that entry
+	  and does not support that feature (Debian #933572) -TD
+	+ updated ms-terminal entry & notes -TD
+	+ updated kitty entry & notes -TD
+	+ updated alacritty+common entry & notes -TD
+	+ use xterm+sl-twm for consistency -TD
+
+20190728
+	+ fix a few more coverity warnings.
+	+ more documentation updates based on tctest.
+
+20190727
+	+ fix a few coverity warnings.
+	+ documentation updates based on tctest.
+
+20190720
+	+ fix a few warnings for gcc 4.x
+	+ add some portability/historical details to the tic, toe and infocmp
+	  manual pages.
+	+ correct fix for broken link from terminfo(5) to tabs(1) manpage
+	  (report by Sven Joachim).
+
+20190713
+	+ change reset's behavior for margins to simply clear soft-margins if
+	  possible, rather than clearing and then setting them according to the
+	  terminal's width (suggested by Thomas Wolff).
+	+ correct order of one wbkgd versus start_color call in test/padview.c
+
+20190706
+	+ add domterm -TD
+	+ improve comments for recent changes, add alias xterm.js -TD
+
+20190630
+	+ add --with-tic-path and --with-infocmp-path to work around problems
+	  building fallback source using pre-6.0 tic/infocmp.
+	+ add a check in tic for paired indn/rin
+	+ correct a buffer-limit in write_entry.c for systems that use caseless
+	  filenames.
+	+ add ms-terminal -TD
+	+ add vscode, vscode-direct -TD
+
+20190623
+	+ improve the tabs.1 manual page to distinguish the PWB/Unix and 7th
+	  Edition versions of the tabs utility.
+	+ add configure check for getenv() to work around implementation shown
+	  in Emscripten #6766, use that to optionally suppress START_TRACE
+	  macro, whose call to getenv() may not work properly (report by Ilya
+	  Ig Petrov).
+	+ modify initialization functions to avoid relying upon persistent
+	  data for the result from getenv().
+	+ update config.guess, config.sub
+
+20190615
+	+ expand the portability section of the man/tabs.1 manual page.
+	+ regenerate HTML manpages.
+
+20190609
+	+ add mintty, mintty-direct (adapted from patch by Thomas Wolff).
+	  Some of the suggested user-defined capabilities are commented-out,
+	  to allow builds with ncurses 5.9 and 6.0
+	+ add Smol/Rmol for tmux, vte-2018 (patch by Nicholas Marriott).
+	+ add rs1 to konsole, mlterm -TD
+	+ modify _nc_merge_entry() to make a copy of the data which it merges,
+	  to avoid modifying the source-data when aligning extended names.
+
+20190601
+	+ modify an internal call to vid_puts to pass extended color pairs
+	  e.g., from tty_update.c and lib_mvcur.c (report by Niegodziwy Beru).
+	+ improve manual page description of init_tabs capability and TABSIZE
+	  variable.
+
+20190525
+	+ modify reset_cmd.c to allow for tabstops at intervals other than 8
+	  (report by Vincent Huisman).
+
+20190518
+	+ update xterm-new to xterm patch #345 -TD
+	+ add/use xterm+keypad in xterm-new (report by Alain D D Williams) -TD
+	+ update terminator entry -TD
+	+ remove hard-tabs from ti703 (report by Robert Clausecker)
+	+ mention meml/memu/box1 in user_caps manual page.
+	+ mention user_caps.5 in tic and infocmp manual pages.
+
+20190511
+	+ fix a spurious blank line seen with "infocmp -1fx xterm+x11mouse"
+	+ add checks in repair_subwindows() to keep the current position and
+	  scroll-margins inside the resized subwindow.
+	+ add a limit check in newline_forces_scroll() for the case where the
+	  row is inside scroll-margins, but not at the end (report by Toshio
+	  Kuratomi, cf: 20170729).
+	+ corrected a warning message in tic for extended capabilities versus
+	  number of parameters.
+
+20190504
+	+ improve workaround for Solaris wcwidth versus line-drawing characters
+	  (report by Pavel Stehule).
+	+ add special case in tic to validate RGB string-capability extension.
+	+ corrected string/parameter-field for RGB in Caps-ncurses.
+
+20190427
+	+ corrected problem in terminfo load/realignment which prevented
+	  infocmp from comparing extended capabilities with the same name
+	  but different types.
+
+20190420
+	+ improve ifdef's for TABSIZE variable, to help with AIX/HPUX ports.
+
+20190413
+	+ check for TABSIZE variable in test/configure script.
+	+ used test/test_arrays.c to improve Caps.aix1 and Caps.hpux11
+	+ corrected filtering of comments in MKparametrized.sh
+	+ reduce duplication across Caps* files by moving some parts which do
+	  not depend on order into Caps-ncurses.
+
+20190406
+	+ modify MKcaptab.sh, MKkey_defs.sh, and MKhashsize.sh to handle
+	  split-up Caps-files.
+	+ build-fixes if extended-functions are disabled.
+
+20190330
+	+ add "screen5", to mention italics (report by Stefan Assmann)
+	+ modify description of xterm+x11hilite to eliminate unused p5 -TD
+	+ add configure script checks to help with a port to Ultrix 3.1
+	  (report by Dennis Grevenstein).
+	  + check if "b" binary feature of fopen works
+	  + check for missing feature of locale.h
+	  + add fallback for strstr() in test-programs
+	  + add fallback for STDOUT_FILENO in test-programs
+	+ update config.guess, config.sub
+
+20190323
+	+ move macro for is_linetouched() inside NCURSES_NOMACROS ifndef.
+	+ corrected prototypes in several manpages using script to extract
+	  those in compilable form.
+	+ use _nc_copy_termtype2() rather than direct assignment in setupterm,
+	  in case it is called repeatedly using fallback terminfo descriptions
+	  (report/patch by Werner Fink).
+
+20190317
+	+ regenerate llib-* files.
+	+ modify tic to also use new function for user-defined capability info.
+	+ modify _nc_parse_entry() to check if a user-defined capability has
+	  an unexpected type; ignore it in that case.
+	+ fix a special case of link-anchors in generated Ada html files.
+	+ use newer rel=author tag in generated html rather than rev=made,
+	  which did not become accepted.
+
+20190309
+	+ in-progress changes to add parameter-checking for common user-defined
+	  capabilities in tic.
+	+ update MKcodes.awk and MKnames.awk to ignore the new "userdef"
+	  data in Caps-ncurses (cf: 20190302).
+
+20190302
+	+ corrected some of the undocumented terminfo names in Caps.hpux11
+	+ add "Caps-ncurses" file to help with checking inconsistencies in some
+	  user-defined capabilities.
+	+ amend check for repeat_char to handle a case where setlocale() was
+	  called after initscr() (report by "Ampera").
+
+20190223
+	+ fix typo in adds200 -TD
+	+ add tic check for consistent alternate character set capabilities.
+	+ improve check in mvcur() to decide whether to use hard-tabs, using
+	  xt, tbc and hts as clues.
+	+ replace check in reset command for obsolete "pt" capability using
+	  tbc and hts capabilities as clues (report by Nicolas Marriott).
+
+20190216
+	+ improve manual page description of TABSIZE.
+	+ add test/demo_tabs program.
+
+20190209
+	+ add check in tic to provide warnings for mismatched number of
+	  parameters in the documented user-capability extensions.
+
+20190202
+	+ modify rpm test-package ".spec" file to work around naming conflict
+	  with Redhat's package for ncurses6.
+	+ modify no-leaks code in test/picsmap to avoid non-standard tdestroy.
+	+ amend change to configure script which altered the top-level makefile
+	  to avoid attempting to install the terminfo database when it was not
+	  configured, to allow for installing the ".pc" files which are also
+	  in the misc directory (report by Steve Wills).
+
+20190126
+	+ change some "%define" statements in test-packages for RPMs to
+	  "%global" to work around changes in rpm 4.14 from recent Redhat.
+	+ fixes for O_INPUT_FIELD extension (patch by Leon Winter).
+	+ eliminate fixed buffer-size when reading $TERMCAP variable.
+	+ correct logic in read_entry.c which prevented $TERMCAP variable from
+	  being interpreted as a fallback to terminfo entry (prompted by
+	  Savannah #54556, cf: 20110924).
+
+20190121
+	+ add a check in test/configure to work around non-ncurses termcap.h
+	  file in Slackware.
+	+ corrected flag for "seq" method of db 1.8.5 interface, needed by toe
+	  on some of the BSDs.
+	+ updated "string-hacks" feature.
+	+ minor improvements to manpage typography.
+	+ corrected conditionally-compiled limit on color pairs (report by
+	  "Hudd").
+	+ add -x option to test/pair_content, test/color_content for testing
+	  init_extended_pair, extended_pair_content, init_extended_color,
+	  extended_color_content
+	+ add -p option to test/pair_content, test/color_content to show the
+	  return values from the tested functions.
+	+ improve manual page curs_color.3x discussion of error returns and
+	  extensions.
+	+ add O_INPUT_FIELD extension to form library (patch by Leon Winter).
+	+ override/suppress --enable-db-install if --disable-database configure
+	  option was given.
+	+ change a too-large terminal entry in tic from a fatal error to a
+	  warning (prompted by discussion with Gabriele Balducci).
+
+20190112
+	+ fix typo in term(5), improve explanation of format (report by Otto
+	  Modinos).
+	+ add nsterm-direct -TD
+	+ use SGR 1006 mouse for konsole-base -TD
+	+ use SGR 1006 mouse for putty -TD
+	+ add ti703/ti707, ti703-w/ti707-w (Robert Clausecker)
+
+20190105
+	+ add dummy "check" rule in top-level and test-Makefile to simply
+	  building test-packages for Arch.
+	+ modify configure script to avoid conflict with a non-POSIX feature
+	  that enables all parts of the system headers by default.  Some
+	  packagers have come to rely upon this behavior (FreeBSD #234049).
+	+ update config.guess, config.sub
+
+20181229
+	+ improve man/curs_mouse.3x with regard to xterm
+	+ modify tracemunch to accept filename parameters in addition to use
+	  as a pipe/filter.
+	+ minor optimization to reduce calls to _nc_reserve_pairs (prompted by
+	  discussion with Bryan Christ).
+	+ add test/pair_content.c and test/color_content.c
+	+ modify infocmp to omit filtering of "OTxx" names which are used for
+	  obsolete capabilities, when the output is sorted by long-names.
+	  Doing this helps when making a table of the short/long capability
+	  names.
+
+20181215
+	+ several fixes for gcc8 strict compiler warnings.
+	+ fix a typo in comments (Aaron Gyes).
+	+ add nsterm-build309 to replace nsterm-256color, assigning the latter
+	  as an alias of nsterm, to make mouse work with nsterm-256color -TD
+	+ base gnome-256color entry on "gnome", not "vte", for consistency -TD
+	+ updates for configure macros from work on tin and xterm:
+	  + CF_GNU_SOURCE, allow for Cygwin's newlib when checking for the
+	    _DEFAULT_SOURCE symbol.
+	  + CF_VA_COPY, add fallback check if neither va_copy/__va_copy is
+	    supported, to try copying the pointers for va_list, or as an array.
+	    Also add another fallback check, for __builtin_va_copy(), which
+	    could be used with AIX xlc in c89 mode.
+
+20181208
+	+ modify wbkgd() and wbkgrnd() to improve compatibility with SVr4
+	  curses, changing the way the window rendition is updated when the
+	  background character is modified (report by Valery Ushakov).
+
+20181201
+	+ add midnightbsd to CF_XOPEN_SOURCE macro (patch by Urs Jansen).
+	+ add "@" command to test/ncurses F-test, to allow rapid jump to
+	  different character pages.
+	+ update config.guess, config.sub from
+		http://git.savannah.gnu.org/cgit/config.git
+
+20181125
+	+ build-fix (reports by Chih-Hsuan Yen, Sven Joachim).
+
+20181124
+	+ check --with-fallbacks option to ensure there is a value, and add
+	  the fallback information to top-level Makefile summary.
+	+ add some traces in initialization to show whether a fallback entry is
+	  used.
+	+ build-fix for test/movewindow with ncurses-examples on Solaris.
+	+ add "-l" option to test/background, to dump screen contents in a form
+	  that lets different curses implementations be compared.
+	+ modify the initialization checks for mouse so that the xterm+sm+1006
+	  block will work with terminal descriptions not mentioning xterm
+	  (report by Tomas Janousek).
+
+20181117
+	+ ignore the hex/b64 $TERMINFO in toe's listing.
+	+ correct a status-check in _nc_read_tic_entry() so that if reading
+	  a hex/b64 $TERMINFO, and the $TERM does not match, fall-through to
+	  the compiled-in search list.
+
+20181110
+	+ several workarounds to ensure proper C compiler used in parts of
+	  Ada95 tree.
+	+ update config.guess, config.sub from
+		http://git.savannah.gnu.org/cgit/config.git
+
+20181027
+	+ add OpenGL clients alacritty and kitty -TD
+	+ add Smulx for tmux, vte-2018 -Nicholas Marriott
+
+20181020
+	+ ignore $TERMINFO as a default value in configure script if it came
+	  from the infocmp -Q option.
+	+ allow value for --with-versioned-syms to be a relative pathname
+	+ add a couple of broken-linker symbols to the list of versioned
+	  symbols to help with link-time optimization versus weak symbols.
+	+ apply shift/control/alt logic when decoding xterm's 1006 mode to
+	  wheel-mouse events (Redhat #1610681).
+
+20181013
+	+ amend change from 20180818, which undid a fix for the $INSTALL value
+	  to make it an absolute path.
+
+20181006
+	+ improve a configure check to work with newer optimizers (report by
+	  Denis Pronin, Gentoo #606142).
+	+ fix typo in tput.c (Sven Joachim, cf: 20180825).
+
+20180929
+	+ fix typo in tvi955 -TD
+	+ corrected acsc for regent60 -TD
+	+ add alias n7900 -TD
+	+ corrected acsc for tvi950 -TD
+	+ remove bogus kf0 from tvi950 -TD
+	+ added function-key definitions to agree with Televideo 950 manual -TD
+	+ add bel to tvi950 -TD
+	+ add shifted function-keys to regent60 -TD
+	+ renumber regent40 function-keys to match manual -TD
+	+ add cd (clr_eos) to adds200 -TD
+
+20180923
+	+ build-fix: remove a _tracef call which was used for debugging (report
+	  by Chris Clayton).
+
+20180922
+	+ ignore interrupted system-call in test/ncurses's command-line, e.g.,
+	  if the terminal were resized.
+	+ add shift/control/alt logic for decoding xterm's 1006 mode (Redhat
+	  #1610681, cf: 20141011).
+	+ modify rpm test-packages to not use --disable-relink with Redhat,
+	  since Fedora 28's tools do not work with that feature.
+
+20180908
+	+ document --with-pcre2 configure option in INSTALL.
+	+ improve workaround for special case in PutAttrChar() where a cell is
+	  marked as alternate-character set, to handle a case where the
+	  character in the cell does not correspond to any of the ASCII
+	  fallbacks (report by Leon Winter, cf: 20180505).
+	+ amend change to form library which attempted to avoid unnecessary
+	  update of cursor position in non-public fields, to simply disable
+	  output in this case (patch by Leon Winter, cf: 20180414).
+	+ improve check for LINE_MAX runtime limit, to accommodate broken
+	  implementations of sysconf().
+
+20180901
+	+ improve manual page for wgetnstr, giving background for the length
+	  parameter.
+	+ define a limit for wgetnstr, wgetn_wstr when length is negative or
+	  "too large".
+	+ update configure script to autoconf 2.52.20180819 (Debian #887390).
+
+20180825
+	+ add a section to tput manual page clarifying how it determines the
+	  terminal size (prompted by discussion with Grant Jenks).
+	+ add "--disable-relink" to rpm test-packages, for consistency with the
+	  deb test-packages.
+	+ split spec-file into ncurses6.spec and ncursest6.spec to work around
+	  toolset breakage in Fedora 28.
+	+ drop mention of "--disable-touching", which was not in the final
+	  20180818 updates.
+
+20180818
+	+ build-fix for PDCurses with ncurses-examples.
+	+ improved CF_CC_ENV_FLAGS.
+	+ modify configure scripts to reduce relinking/ranlib during library
+	  install (Debian #903790):
+	  + use "install -p" when available, to avoid need for ranlib of
+	    static libraries.
+	  + modify scripts which use "--disable-relink" to add a 1-second
+	    sleep to work around tools which use whole-second timestamps, e.g.,
+	    in utime() rather than the actual file system resolution.
+
+20180804
+	+ improve logic for clear with E3 extension, in case the terminal
+	  scrolls content onto its saved-lines before actually clearing
+	  the display, by clearing the saved-lines after clearing the
+	  display (report/patch by Nicholas Marriott).
+
+20180728
+	+ improve documentation regarding feature-test macros in curses.h
+	+ improve documentation regarding the virtual and physical screens.
+	+ formatting fixes for manpages, regenerate man-html documentation.
+
+20180721
+	+ build-fixes for gcc8.
+	+ corrected acsc for wy50 -TD
+	+ add wy50 and wy60 shifted function-keys as kF1 to kF16 -TD
+	+ remove ansi+rep mis-added to interix in 2018-02-23 -TD
+
+20180714
+	+ add enum, regex examples to test/demo_forms
+	+ add configure check for pcre-posix library to help with MinGW port.
+
+20180707
+	+ build-fixes for gcc8.
+	+ correct order of WINDOW._ttytype versus WINDOW._windowlist in
+	  report_offsets.
+	+ fix a case where tiparm could return null if the format-string was
+	  empty (Debian #902630).
+
+20180630
+	+ add acsc string to vi200 (Nibby Nebbulous)
+	  add right/down-arrow to vi200's acsc -TD
+	+ add "x" to tput's getopt string so that "tput -x clear" works
+	  (Nicholas Marriott).
+	+ minor fixes prompted by anonymous report on stack overflow:
+	  + correct order of checks in _nc_get_locale(), for systems lacking
+	    locale support.
+	  + add "#error" in a few places to flag unsupported configurations
+
+20180623
+	+ use _WIN32/_WIN64 in preference to __MINGW32__/__MINGW64__ symbols
+	  to simplify building with MSVC, since the former are defined in both
+	  compiler configurations (report by Ali Abdulkadir).
+	+ further improvements to configure-checks from work on dialog, i.e.,
+	  updated CF_ADD_INCDIR, CF_FIND_LINKAGE, CF_GCC_WARNINGS,
+	  CF_GNU_SOURCE, CF_LARGEFILE, CF_POSIX_C_SOURCE, CF_SIZECHANGE, and
+	  CF_TRY_XOPEN_SOURCE.
+	+ update config.guess, config.sub from
+		http://git.savannah.gnu.org/cgit/config.git
+
+20180616
+	+ build-fix for ncurses-examples related to gcc8-fixes (cf: 20180526).
+	+ reduce use of _GNU_SOURCE for current glibc where _DEFAULT_SOURCE
+	  combines with _XOPEN_SOURCE (Debian #900987).
+	+ change target configure level for _XOPEN_SOURCE to 600 to address
+	  use of vsscanf and setenv.
+	+ improved configure-checks CF_SIZECHANGE and CF_STRUCT_TERMIOS from
+	  work on dialog.
+
+20180609
+	+ modify generated ncurses*config and ncurses.pc, ncursesw.pc, etc.,
+	  to list helper libraries such as gpm for static linking (Debian
+	  #900839).
+	+ marked vwprintw and vwscanw as deprecated; recommend using vw_printw
+	  and vw_scanw, respectively.
+
+20180602
+	+ add RPM test-package "ncursest-examples".
+	+ modified RPM test-package to work with Mageia6.
+
+20180526
+	+ add note in curs_util.3x about unctrl.h
+	+ review/improve header files to ensure that those include necessary
+	  files except for the previously-documented cases (report by Isaac
+	  Pascual Monells).
+	+ improved test-package scripts, adapted from byacc 1.9 20180525.
+	+ fix some gcc8 warnings seen in Redhat package build, but
+	  work around bug in gcc8 compiler warnings in comp_parse.c
+
+20180519
+	+ formatting fixes for manpages, regenerate man-html documentation.
+	+ trim spurious whitespace from tmux in 2018-02-24 changes;
+	  fix some inconsistencies in/between tmux- and iterm2-entries for SGR
+	  (report by C Anthony Risinger)
+	+ improve iterm2 using some xterm features which it has adapted -TD
+	+ add check in pair_content() to handle the case where caller asks
+	  for an uninitialized pair (Debian #898658).
+
+20180512
+	+ remove trailing ';' from GCC_DEPRECATED definition.
+	+ repair a change from 20110730 which left an error-check/warning dead.
+	+ fix several minor Coverity warnings.
+
+20180505
+	+ add deprecation warnings for internal functions called by older
+	  versions of tack.
+	+ fix a special case in PutAttrChar() where a cell is marked as
+	  alternate-character set, but the terminal does not actually support
+	  the given graphic character.  This would happen in an older terminal
+	  such as vt52, which lacks most line-drawing capability.
+	+ use configure --with-config-suffix option to work around filename
+	  conflict with Debian packages versus test-packages.
+	+ update tracemunch to work with perl 5.26.2, which changed the rules
+	  for escaping regular expressions.
+
+20180428
+	+ document new form-extension O_EDGE_INSERT_STAY (report by Leon
+	  Winter).
+	+ correct error-returns listed in manual pages for a few form functions
+	  (report by Leon Winter).
+	+ add a check in form-library for null-pointer dereference:
+		unfocus_current_field (form);
+		form_driver (form, REQ_VALIDATION);
+	  (patch by Leon Winter).
+
+20180414
+	+ modify form library to optionally delay cursor movement on a field
+	  edge/boundary (patch by Leon Winter).
+	+ modify form library to avoid unnecessary update of cursor position in
+	  non-public fields (patch by Leon Winter).
+	+ remove unused _nc_import_termtype2() function.
+	+ also add/improve null-pointer checks in other places
+	+ add a null-pointer check in _nc_parse_entry to handle an error when
+	  a use-name is invalid syntax (report by Chung-Yi Lin).
+
+20180407
+	+ clarify in manual pages that vwprintw and vwscanw are obsolete,
+	  not part of X/Open Curses since 2007.
+	+ use "const" in some prototypes rather than NCURSES_CONST where X/Open
+	  Curses was updated to do this, e.g., wscanw, newterm, the terminfo
+	  interface.  Also use "const" for consistency in the termcap
+	  interface, which was withdrawn by X/Open Curses in Issue 5 (2007).
+	  As of Issue 7, X/Open Curses still lacks "const" for certain return
+	  values, e.g., keyname().
+
+20180331
+	+ improve terminfo write/read by modifying the fourth item of the
+	  extended header to denote the number of valid strings in the extended
+	  string table (prompted by a comment in unibilium's sources).
+
+20180324
+	+ amend Scaled256() macro in test/picsmap.c to cover the full range
+	  0..1000 (report by Roger Pau Monne).
+	+ add some checks in tracemunch for undefined variables.
+	+ trim some redundant capabilities from st-0.7 -TD
+	+ trim unnecessary setf/setb from interix -TD
+
+20180317
+	+ fix a check in infotocap which may not have detected a problem when
+	  it should have.
+	+ add a check in tic for the case where setf/setb are given using
+	  different strings, but provide identical results to setaf/setab.
+	+ further improve fix for terminfo.5 (patch by Kir Kolyshkin).
+	+ reorder loop-limit checks in winsnstr() in case the string has no
+	  terminating null and only the number of characters is used (patch
+	  by Gyorgy Jeney).
+
+20180303
+	+ modify TurnOn/TurnOff macros in lib_vidattr.c and lib_vid_attr.c to
+	  avoid expansion of "CUR" in trace.
+	+ improve a few lintian warnings in test-packages.
+	+ modify lib_setup to avoid calling pthread_self() without first
+	  verifying that the address is valid, i.e., for weak symbols
+	  (report/patch by Werner Fink).
+	+ modify generated terminfo.5 to not use "expand" and related width
+	  on the last column of tables, making layout on wide terminals look
+	  better (adapted from patch by Kir Kolyshkin).
+	+ add a category to report_offsets, e.g., "w" for wide-character, "t"
+	  for threads to make the report more readable.  Reorganized the
+	  structures reported to make the categories more apparent.
+	+ simplify some ifdef's for extended-colors.
+	+ add NCURSES_GLOBALS and NCURSES_PRESCREEN to report_offsets, to show
+	  how similar the different tinfo configurations are.
+
+20180224
+	+ modify _nc_resolve_uses2() to detect incompatible types when merging
+	  a "use=" clause of extended capabilities.  The problem was seen in a
+	  defective terminfo integrated from simpleterm sources in 20171111,
+	  compounded by repair in 20180121.
+	+ correct Ss/Ms interchange in st-0.7 entry (tmux #1264) -TD
+	+ fix remaining flash capabilities with trailing mandatory delays -TD
+	+ correct cut/paste in NEWS (report by Sven Joachim).
+
+20180217
+	+ remove incorrect free() from 20170617 changes (report by David Macek).
+	+ correct type for "U8" in user_caps.5; it is a number not boolean.
+	+ add a null-pointer check in safe_sprintf.c (report by Steven Noonan).
+	+ improve fix for Debian #882620 by reusing limit2 variable (report by
+	  Julien Cristau, Sven Joachim).
+
+20180210
+	+ modify misc/Makefile.in to install/uninstall explicit list in case
+	  the build-directory happens to have no ".pc" files when an uninstall
+	  is performed (report by Jeffrey Walton).
+	+ deprecate safe-sprintf, since the vsnprintf function, which does what
+	  was needed, was standardized long ago.
+	+ add several development/experimental options to development packages.
+	+ minor reordering of options in configure script to make the threaded
+	  and reentrant options distinct from the other extensions which are
+	  normally enabled.
+
+20180203
+	+ minor fixes to test/*.h to make them idempotent.
+	+ add/use test/parse_rgb.h to show how the "RGB" capability works.
+	+ add a clarification in user_caps.5 regarding "RGB" capability.
+	+ add extended_slk_color{,_sp} symbols to the appropriate
+	  package/*.{map,sym} files (report by Sven Joachim, cf: 20170401).
+
+20180129
+	+ update "VERSION" file, used in shared-library naming.
+
+20180127 6.1 release for upload to ftp.gnu.org
+
+20180127
+	+ updated release notes
+	+ amend a warning message from tic which should have flagged misuse
+	  of "XT" capability in "screen" terminal description.
+	> terminfo changes:
+	+ trim "XT" from screen entry, add comments to explain why it was
+	  not suitable -TD
+	+ modify iterm to use xterm+sl-twm building block -TD
+	+ mark konsole-420pc, konsole-vt100, konsole-xf3x obsolete reflecting
+	  konsole's removal in 2008 -TD
+	+ expanded the history section of konsole to explain its flawed
+	  imitation of xterm's keyboard -TD
+	+ use xterm+x11mouse in screen.* entries because screen does not yet
+	  support xterm's 1006 mode -TD
+	+ add nsterm-build400 for macOS 10.13 -TD
+	+ add ansi+idc1, use that in ansi+idc adding dch for consistency -TD
+	+ update vte to vte-2017 -TD
+	+ add ecma+strikeout to vte-2017 -TD
+	+ add iterm2-direct -TD
+	+ updated teraterm, added teraterm-256color -TD
+	+ add mlterm-direct -TD
+	+ add descriptions for ANSI building-blocks -TD
+
+20180121 pre-release
+	> terminfo changes:
+	+ add xterm+noalt, xterm+titlestack, xterm+alt1049, xterm+alt+title
+	  blocks from xterm #331 -TD
+	+ add xterm+direct, xterm+indirect, xterm-direct entries from xterm
+	  #331 -TD
+	+ modify xterm+256color and xterm+256setaf to use correct number of
+	  color pairs, for ncurses 6.1 -TD
+	+ add rs1 capability to xterm-256color -TD
+	+ modify xterm-r5, xterm-r6 and xterm-xf86-v32 to use xterm+kbs to
+	  match xterm #272, reflecting packager's changes -TD
+	+ remove "boolean" Se, Ss from st-0.7 -TD
+	+ add konsole-direct and st-direct -TD
+	+ remove unsupported "Tc" capability from st-0.7; use st-direct if
+	  direct-colors are wanted -TD
+	+ add vte-direct -TD
+	+ add XT, hpa, indn, and vpa to screen, and invis, E3 to tmux (patch by
+	  Pierre Carru)
+	+ use xterm+sm+1006 in xterm-new, vte-2014 -TD
+	+ use xterm+x11mouse in iterm, iterm2, mlterm3 because xterm's 1006
+	  mode does not work with those programs.  konsole is debatable -TD
+	+ add "termite" entry (report by Markus Pfeiffer) -TD
+	> merge branch begun April 2, 2017 which provides these features:
+	+ support read/write new binary-format for terminfo which stores
+	  numeric capabilities as a signed 32-bit integer.  The test programs
+	  such as picsmap, ncurses were created or updated during 2017 to use
+	  this feature.
+	+ the new format is written by the wide-character configuration of
+	  tic when it finds a numeric capability larger than 32767.
+	+ other applications such as infocmp built with the wide-character
+	  ncurses library work as expected.
+	+ applications built with the "narrow" (8-bit) configuration will
+	  read the new format, but will limit those extended values to 32767.
+	+ in either wide/narrow configuration, the structure defined in
+	  term.h still uses signed 16-bit values.
+	+ because it is incompatible with the legacy (mid-1980s) binary format,
+	  a new magic value is provided for the "file" program.
+	+ the term.5 manual page is updated to describe this new format.
+	+ the limit on file-size for compiled terminfo is increased in the
+	  wide-character configuration to 32768.
+
+20180120
+	+ build-fix in picsmap.c for stdint.h existence.
+	+ add --disable-stripping option to configure scripts.
+	+ modify ncurses-examples to install test-scripts in the data directory.
+	+ work around tool-breakage in Debian 9 and later by invoking
+	  gprconfig to specify the C compiler to be used by gnatmake,
+	  and conditionally suppressing Library_Options line for static
+	  libraries.
+	+ bump the compat level for test-packages to 7, i.e., Debian 5.
+
+20180106
+	+ fixes for writing extended color pairs in putwin.
+	+ modify test/savescreen.c to add test patterns that exercise 88-,
+	  256-, etc., colors.
+	+ modify configure option --with-build-cc, adding clang, c89 and c99
+	  as possible default values.
+	+ modify ncurses-examples configure script to use pkg-config for the
+	  extra form/menu/panel libraries, to be more consistent with the
+	  handling of the curses/ncurses library.
+	+ modify test-packages for mingw to supply "pc" files.
+	+ modify gen-pkgconfig.in to list -lpthread as a private library when
+	  configured to access it via weak symbols.
+	+ simplify gen-pkgconfig.in, adding -ltinfo without the special linker
+	  checks because some versions of the linker simply hard-code the
+	  behavior.
+	+ update URLs for ncurses website to use https.
+	+ modify CF_CURSES_LIBS to fill in $cf_nculib_root in case the
+	  ncurses-examples are built with a system ncurses that lacks the
+	  standard "curses" symbolic link, as done by SuSE.  The symbol is
+	  needed to make a followup check for the pthread library work, and
+	  would be set properly using the options "--with-screen", etc.
+	+ generate misc/*.pc with "all" rule, as done for "sources" rule
+	  (report by Jeffrey Walton).
+
+20171230
+	+ build-fix for ncurses-examples with Fedora27, adding check for
+	  reset_color_pairs() -- not yet in Fedora's package.
+	+ consistently add $CFLAGS to $MK_SHARED_LIB symbol in configure
+	  script when the latter happens to use the C compiler rather than
+	  directly using the loader (report by Jeffrey Walton).
+	+ set ABI for upcoming 6.1 release in "*.map" files.  While there are
+	  some remaining internals to apply, no ABI-related changes are
+	  anticipated.
+	+ add configure --with-config-suffix option to work around filename
+	  conflict with Redhat packages versus test-packages.
+
+20171223
+	+ modify ncurses-examples to quiet const-warnings when building with
+	  PDCurses.
+	+ modify toe to not exit if unable to read a terminal description,
+	  e.g., if there is a permission problem.
+	+ minor fix for progs/toe.c, using _nc_free_termtype2.
+	+ assign 0 to pointer in _nc_tgetent_leak() after freeing it. Also
+	  avoid reusing pointer from previous successful call to tgetent
+	  if the latest call is unsuccessful (patch by Michael Schroeder,
+	  OpenSuSE #1070450).
+	+ minor fix for test/tracemunch, initialize $awaiting variable.
+
+20171216
+	+ repair template in test/package/ncurses-examples.spec (cf: 20171111).
+	+ improve tic's warning about the number of parameters tparm might use
+	  for u1-u9 by making a special case for u6.
+	+ improve curs_attr.3x discussion of color pairs.
+
+20171209
+	+ modify misc/ncurses-config.in to make output with --includedir
+	  consistent with --cflags, i.e., when --disable-overwrite option was
+	  configured the output should show the subdirectory where headers
+	  are.
+	+ modify MKlib_gen.sh to suppress macros when calling an "implemented"
+	  function in link_test.c
+	+ updated ftp-url used in test-packages, etc.
+	+ modify order of -pie/-shared options in configure script in case
+	  LDFLAGS uses "-pie", working around a defect or limitation in the GNU
+	  linker (prompted by patch by Yogesh Prasad, forwarded by Jay Shah).
+	+ add entry in man_db.renames for user_caps.5
+
+20171125
+	+ modify MKlib_gen.sh to avoid tracing result from getstr/getnstr
+	  before initialized.
+	+ add "-a" aspect-ratio option to picsmap.
+	+ add configure check for default path of rgb.txt, used in picsmap.
+	+ modify _nc_write_entry() to truncate too-long filename (report by
+	  Hosein Askari, Debian #882620).
+	+ build-fix for ncurses-examples with NetBSD curses:
+	  + it lacks the use_env() function.
+	  + it lacks libpanel; a recent change used the wrong ifdef symbol.
+	+ add a macro for is_linetouched() and adjust the function's return
+	  value to make it possible for most applications to check for an
+	  error-return (report by Midolikawa H).
+	+ additional manpage cleanup.
+	+ update config.guess, config.sub from
+		http://git.savannah.gnu.org/cgit/config.git
+
+20171118
+	+ add a note to curs_addch.3x on portability.
+	+ add a note to curs_pad.3x on the origin and portability of pads.
+	+ improve manpage description of getattrs (report by Midolikawa H).
+	+ improve manpage macros (prompted by discussion in Debian #880551.
+	+ reviewed test-programs using KEY_RESIZE, made fixes to test/worm.c
+	+ add a "-d" option to picsmap for default-colors.
+	+ modify old terminology entry and a few other terminal emulators to
+	  account for xon -TD
+	+ correct sgr string for tmux, which used screen's "standout" code
+	  rather than the standard code (patch by Roman Kagan)
+	+ correct sgr/sgr0 strings in a few other cases reported by tic, making
+	  those correspond to the non-sgr settings where they differ, but
+	  otherwise use ECMA-48 consistently:
+	  jaixterm, aixterm, att5420_2, att4424, att500, decansi, d410-7b,
+	  dm80, hpterm, emu-220, hp2, iTerm2.app, mterm-ansi, ncrvt100an,
+	  st-0.7, vi603, vwmterm -TD
+	+ build-fix for diagnostics warning in lib_mouse.c for pre-5.0 versions
+	  of gcc which did not recognize the diagnostic "push" pragma (patch by
+	  Vassili Courzakis).
+
+20171111
+	+ add "op" to xterm+256setaf -TD
+	+ reviewed terminology 1.0.0 -TD
+	+ reviewed st 0.7 -TD
+	+ suppress debug-package for ncurses-examples rpm build.
+
+20171104
+	+ check for interrupt in color-pair initialization of dots_curses.c,
+	  dots_xcurses.c
+	+ add z/Z zoom feature to test/ncurses.c C/c screens.
+	+ add '<' and '>' commands to test/ncurses.c S/s screens, to better
+	  test off-by-ones in the overlap/copywin functions.
+
+20171028
+	+ improve man/curs_inwstr.3x, correct end-logic for lib_inwstr.c
+	  (report by Midolikawa H).
+	+ fix typo in a few places for "improvements" (patch by Sven Joachim).
+	+ clear the other half of a double-width character on which a line
+	  drawing character is drawn.
+	+ make test/ncurses.c "s" test easier to understand which subtests are
+	  available; add a "S" wide-character overlap test-screen.
+	+ modify test/ncurses.c C/c tests to allow for extended color pairs.
+	+ add endwin() call in error-returns from test/ncurses.c omitted in
+	  recent redesign of its menu (cf: 20170923).
+	+ improve install of hashed-db by removing the ".db" file as done for
+	  directory-tree terminal databases.
+	+ repair a few overlooked items in include/ncurses_defs from recent
+	  port/refactoring of test-programs (cf: 20170909).
+	+ add test/padview.c, to compare pads with direct updates in view.c
+
+20171021
+	+ modify test/view.c to expand tabs using the ncurses library rather
+	  than in the test-program.
+	+ remove very old SIGWINCH example in test/view.c, just use KEY_RESIZE.
+	+ add -T, -e, -f -m options to "dots" test-programs.
+	+ fix a few typos in usage-messages for test-programs.
+
+20171014
+	+ minor cleanup to test/view.c:
+	  + eliminate "-n" option by simply reading the whole file.
+	  + implement page up/down commands.
+	+ add check in tput for init/reset operands to ensure those use a
+	  terminal.
+	+ improve manual pages which discuss chtype, cchar_t types and the
+	  attribute values which can be stored in those types.
+	+ correct array-index when parsing "-T" command-line option in tabs
+	  program.
+	+ modify demo_new_pair.c to pass extended pairs to setcchar().
+	+ add test/dots_xcurses.c to illustrate a different approach used for
+	  extended colors which can be contrasted with dots_curses.c.
+	+ add a check in tic to note when a description uses non-mandatory
+	  delays without xon_xoff.  This is not an error, but some descriptions
+	  for a terminal emulator may use the combination incorrectly.
+
+20171007
+	+ modify "-T" option of clear and tput to call use_tioctl() to obtain
+	  the operating system's notion of the screensize if possible.
+	+ review/repair some exit-codes for tput, making usage-message exit
+	  with 2 rather than 1, and a failure to open terminal 4+errno.
+	+ amend check in tput, tabs and clear to allow those to use the
+	  database-only features in cron if a -T option gives a suitable
+	  terminal name (report by Lauri Tirkkonen).
+	+ correct an ifdef in test/ncurses.c for systems with soft-keys but
+	  not slk_color().
+	+ regenerate man-html documentation.
+
+20170930
+	+ fix a symbol conflict that made ncurses.c C/c menu not work with
+	  Solaris xpg4 curses.
+	+ add refresh() call to dots_mvcur.c, needed to use mvcur() with
+	  Solaris xpg4 curses after calling newterm().
+	+ minor fixes for configure script from work on ncurses-examples and
+	  tin.
+	+ improve animation in test/xmas.c by adding a time-delay in blinkit().
+	+ modify several test programs to reflect that ncurses honors existing
+	  signal handlers in initscr(), while other implementations do not.
+	+ modify bs.c to make it easier to quit.
+	+ change ncurses-examples to use attr_t vs chtype to follow X/Open
+	  documentation more closely since Solaris xpg4-curses uses different
+	  values for WA_xxx vs A_xxx that rely on attr_t being an unsigned
+	  short.  Tru64 aka OSF1, HPUX, AIX did as ncurses does, equating the
+	  two sets.
+
+20170923
+	+ modify menu for test/ncurses.c to fit on 24-line screen.
+	+ build-fix for configure --with-caps=uwin
+	+ add options to test_arrays.c, for selecting termcap vs terminfo, etc.
+
+20170916
+	+ minor fix to test/filter.c to avoid clearing the command in one case.
+	+ modify filter() to discard clr_eos if back_color_erase is set.
+
+20170909
+	+ improve wide-character implementation of myADDNSTR() in frm_driver.c,
+	  which was inconsistent with the normal implementation.
+	+ save/restore cursor position in Undo_Justification(), matching
+	  behavior of Buffer_To_Window() (report by Leon Winter).
+	+ modify test/knight to provide the "slow" solution for small screens
+	  using "R", noting that Warnsdorf's method is easily done with "a".
+	+ modify several test-programs which call use_default_colors() to
+	  consistently do this only if "-d" option is given.
+	+ additional changes to test with non-standard variants of curses:
+	  + modify a loop limit in firework.c to work around absence of limit
+	    checks in some libraries.
+	  + fill the last row of a window with "?" in firstlast if waddch does
+	    not return ERR on the lower-right corner.
+	+ add checks in test/configure for some functions not in 4.3BSD curses.
+	+ fix a regression in test/configure (cf: 20170826).
+
+20170902
+	+ amend change for endwin-state for better consistency with the older
+	  logic (report/patch by Jeb Rosen, cf: 20170722).
+	+ modify check in fmt_entry() to handle a cancelled reset string
+	  (Debian #873746).  Make similar fixes in other parts of dump_entry.c
+	  and tput.c
+
+20170827
+	+ fix a bug in repeat_char logic (cf: 20170729, report by Chris Clayton).
+
+20170826
+	+ fixes for "iterm2" (report by Leonardo Brondani Schenkel) -TD
+	+ corrected a warning from tic about keys which are the same, to skip
+	  over missing/cancelled values.
+	+ add check in tic for unnecessary use of "2" to denote a shifted
+	  special key.
+	+ improve checks in trim_sgr0, comp_parse.c and parse_entry.c, for
+	  cancelled string capabilities.
+	+ add check in _nc_parse_entry() for invalid entry name, setting the
+	  name to "invalid" to avoid problems storing entries.
+	+ add/improve checks in tic's parser to address invalid input
+	  + add a check in comp_scan.c to handle the special case where a
+	    nontext file ending with a NUL rather than newline is given to tic
+	    as input (Redhat #1484274).
+	  + allow for cancelled capabilities in _nc_save_str (Redhat #1484276).
+	  + add validity checks for "use=" target in _nc_parse_entry (Redhat
+	    #1484284).
+	  + check for invalid strings in postprocess_termcap (Redhat #1484285)
+	  + reset secondary pointers on EOF in next_char() (Redhat #1484287).
+	  + guard _nc_safe_strcpy() and _nc_safe_strcat() against calls using
+	    cancelled strings (Redhat #1484291).
+	+ correct typo in curs_memleaks.3x (Sven Joachim).
+	+ improve test/configure checks for some curses variants not based on
+	  X/Open Curses.
+	+ add options for test/configure to disable checks for form, menu and
+	  panel libraries.
+
+20170819
+	+ update "iterm" entry -TD
+	+ add "iterm2" entry (report by Leonardo Brondani Schenkel) -TD
+	+ regenerate llib-* files.
+	+ regenerate HTML manpages.
+	+ improve picsmap test-program:
+	  + reduce memory used for tsearch
+	  + add report in log file showing cumulative color coverage.
+	+ add -x option to clear/tput to make the E3 extension optional
+	  (cf: 20130622).
+	+ add options -T and -V to clear command for compatibility with tput.
+	+ add usage message to clear command (Debian #371855).
+	+ improve usage messages for tset and tput.
+	+ minor fixes to "RGB" extension and reset_color_pairs().
+
+20170812
+	+ improve description of -R option in infocmp manual page (report by
+	  Stephane Chazelas).
+	+ add reset_color_pairs() function.
+	+ add user_caps.5 manual page to document the terminfo extensions used
+	  by ncurses.
+	+ improve build scripts, using SIGQUIT vs SIGTRAP; add other configure
+	  script fixes from work on xterm, lynx and tack.
+	+ modify install-rule for ncurses-examples to put the data files in
+	  /usr/share/ncurses-examples
+	+ improve tracemunch, by changing address-parameters of add_wch(),
+	  color_content() and pair_content() to dummy parameters.
+	+ minor optimization to _nc_change_pair, to return quickly when the
+	  current screen is marked for clearing.
+	+ in-progress changes to improve performance of test/picsmap.c for
+	  loading image files.
+	+ modify allocation for SCREEN's color-pair table to start small, grow
+	  on demand up to the existing limit.
+	+ add "RGB" extension capability for direct-color support, use this to
+	  improve color_content().
+	+ improve picsmap test-program:
+	  + if no palette file is needed, attempt to load one based on $TERM,
+	    checking first in the current directory, then by adding ".dat"
+	    suffix, and finally in the data-directory, e.g.,
+	    /usr/share/ncurses-examples
+	  + add "-l" option for logging
+	  + add "-d" option for debugging
+	  + add "-s" option for stepping automatically through list of images,
+	    with time delay.
+	  + use tsearch to improve time for loading color table for images.
+	+ update config.guess, config.sub from
+		http://git.savannah.gnu.org/cgit/config.git
+
+20170729
+	+ update interix entry using tack and SFU on Windows 7 Ultimate -TD
+	+ use ^? for kdch1 in interix (reported by Jonathan de Boyne Pollard)
+	+ add "rep" to xterm-new, available since 1997/01/26 -TD
+	+ move SGR 24 and 27 from vte-2014 to vte-2012 (request by Alain
+	  Williams) -TD
+	+ add a check in newline_forces_scroll() in case a program moves the
+	  cursor outside scrolling margins (report by Robert King).
+	+ improve _nc_tparm_analyze, using that to extend the checks made by
+	  tic for reporting inconsistencies between the expected number of
+	  parameters for a capability and the actual.
+	+ amend handling of repeat_char capability in EmitRange (adapted from
+	  report/patch by Dick Wesseling):
+	  + translate the character to the alternate character set when the
+	    alternate character set is enabled.
+	  + do not use repeat_char for characters past 255.
+	+ document "_nc_free_tinfo" in manual page, because it could be used in
+	  tack for memory-leak checking.
+	+ add "--without-tack" configure option to refine "--with-progs"
+	  configure option.  Normally tack is no longer built in-tree, but
+	  a few packagers combine it during the build.  If term_entry.h is
+	  installed, there is no advantage to in-tree builds.
+	+ adjust configure-script to define HAVE_CURSES_DATA_BOOLNAMES symbol
+	  needed for tack 1.08 when built in-tree.  Rather than relying upon
+	  internal "_nc_" functions, tack now uses the boolean, number and
+	  string capability name-arrays provided by ncurses and SVr4 Unix
+	  curses.  It still uses term_entry.h for the definitions of the
+	  extended capability arrays.
+	+ add an overlooked null-pointer check in mvcur changes from 20170722
+
+20170722
+	+ improve test-packages for ncurses-examples and AdaCurses for lintian
+	+ modify logic for endwin-state to be able to detect the case where
+	  the screen was never initialized, using that to trigger a flush of
+	  ncurses' buffer for mvcur, e.g., in test/dots_mvcur.c for the
+	  term-driver configuration.
+	+ add dependency upon ncurses_cfg.h to a few other internal header
+	  files to allow each to be compiled separately.
+	+ add dependency upon ncurses_cfg.h to tic's header-files; any program
+	  using tic-library will have to supply this file.  Legacy tack
+	  versions supply this file; ongoing tack development has dropped the
+	  dependency upon tic-library and new releases will not be affected.
+
+20170715
+	+ modify command-line parameters for "convert" used in picsmap to work
+	  with ImageMagick 6.8 and newer.
+	+ fix build-problem with tack and ABI-5 (Debian #868328).
+	+ repair termcap-format from tic/infocmp broken in 20170701 fixes
+	  (Debian #868266).
+	+ reformat terminfo.src with 20170513 updates.
+	+ improve test-packages to address lintian warnings.
+
+20170708
+	+ add a note to tic manual page about -W versus -f options.
+	+ correct a limit-check in fixes from 20170701 (report by Sven Joachim).
+
+20170701
+	+ modify update_getenv() in db_iterator.c to ensure that environment
+	  variables which are not initially set will be checked later if an
+	  application happens to set them (patch by Guillaume Maudoux).
+	+ remove initialization-check for calling napms() in the term-driver
+	  configuration; none is needed.
+	+ add help-screen to test/test_getstr.c and test/test_get_wstr.c
+	+ improve compatibility between different configurations of new_prescr,
+	  fixing a case with threaded code and term-driver where c++/demo did
+	  not work (cf: 20160213).
+	+ the fixes for Redhat #1464685 obscured a problem subsequently
+	  reported in Redhat #1464687; the given test-case was no longer
+	  reproducible.  Testing without the fixes for the earlier reports
+	  showed a problem with buffer overflow in dump_entry.c, which is
+	  addressed by reducing the use of a fixed-size buffer.
+	+ add/improve checks in tic's parser to address invalid input
+	  (Redhat #1464684, #1464685, #1464686, #1464691).
+	  + alloc_entry.c, add a check for a null-pointer.
+	  + parse_entry.c, add several checks for valid pointers as well as
+	    one check to ensure that a single character on a line is not
+	    treated as the 2-character termcap short-name.
+	+ fix a memory leak in delscreen() (report by Bai Junq).
+	+ improve tracemunch, showing thread identifiers as names.
+	+ fix a use-after-free in NCursesMenu::~NCursesMenu()
+	+ further amend incorrect calls for memory-leaks from 20170617 changes
+	  (report by Allen Hewes).
+
+20170624
+	+ modify c++/etip.h.in to accommodate deprecation of throw() and
+	  throws() in c++17 (prompted by patch by Romain Geissler).
+	+ remove some incorrect calls for memory-leaks from 20170617 changes
+	  (report by Allen Hewes).
+	+ add test-programs for termattrs and term_attrs.
+	+ modify _nc_outc_wrapper to use the standard output if the screen was
+	  not initialized, rather than returning an error.
+	+ improve checks for low-level terminfo functions when the terminal
+	  has not been initialized (Redhat #1345963).
+	+ modify make_hash to allow building with address-sanitizer,
+	  assuming that --disable-leaks is configured.
+	+ amend changes for number_format() in 20170506 to avoid undefined
+	  behavior when shifting (patch by Emanuele Giaquinta).
+
+20170617
+	+ fill in some places where TERMTYPE2 vs TERMTYPE was not used
+	  (report by Allen Hewes).
+	+ use ExitTerminfo() internally in error-exits for ncurses' setupterm
+	  to help with leak checking.
+	+ use ExitProgram() in error-exit from initscr() to help with leak
+	  checking.
+	+ review test-programs, adding checks for cases where the terminal
+	  cannot be initialized.
+
+20170610
+	+ add option "-xp" to picsmap.c, to use init_extended_pair().
+	+ make simple performance fixes for picsmap.c
+	+ improve aspect ratio of images read from "convert" in picsmap.c
+
+20170603
+	+ add option to picsmap to use color-palette files, e.g., for mapping
+	  to xterm-256color.
+	+ move the data in SCREEN used for the alloc_pair() function to the
+	  end, to restore compatibility between ncurses/ncursesw libtinfo
+	  (report/patch by Miroslav Lichvar).
+	+ add build-time utility "report_offsets" to help show when the various
+	  configurations of tinfo library are compatible or not.
+
+20170527
+	+ improved test/picsmap.c:
+	  + lookup named colors for xpm files in rgb.txt
+	  + accept blanks in color-keys for xpm files.
+	  + if neither xbm/xpm work, try "convert", which may be available.
+
+20170520
+	+ modify test/picsmap.c to read xpm files.
+	+ modify package/debian/* to create documentation packages, so the
+	  related files can be checked with lintian.
+	+ fix some typos in manpages (report/patch by Sven Joachim).
+
+20170513
+	+ add test/picsmap.c to fill in some testing issues not met by dots.
+	  The initial version reads X bitmap (".xbm") files.
+	+ repair logic which forces a repaint where a color-pair's content is
+	  changed (cf: 20170311).
+	+ improve tracemunch, showing screenXX pointers as names.
+
+20170506
+	+ modify tic/infocmp display of numeric values to use hexadecimal when
+	  they are "close" to a power of two, making the result more readable.
+	+ improve discussion of portability in curs_mouse.3x
+	+ change line-length for generated html/manpages to 78 columns from 65.
+	+ improve discussion of line-drawing characters in curs_add_wch.3x
+	  (prompted by discussion with Lorinczy Zsigmond).
+	+ cleanup formatting of hackguide.html and ncurses-intro.html
+	+ add examples for WACS_D_PLUS and WACS_T_PLUS to test/ncurses.c
+
+20170429
+	+ corrected a case where $with_gpm was set to "maybe" after CF_WITH_GPM,
+	  overlooked in 20160528 fixes (report by Alexandre Bury).
+	+ improve a couple of test-program's help-messages.
+	+ corrected loop in rain.c from 20170415 changes.
+	+ modify winnstr and winchnstr to return error if the output pointer is
+	  null, as well as adding a null pointer check of the window pointer
+	  for better compatibility with other implementations.
+	+ improve discussion of NetBSD curses in scr_dump.5
+	+ modify LIMIT_TYPED macro in new_pair.h to avoid changing sign of the
+	  value to be limited (reports by Darby Payne, Rob Boudreau).
+	+ update config.guess, config.sub from
+		http://git.savannah.gnu.org/cgit/config.git
+
+20170422
+	+ build-fix for termcap-configuration (report by Chi-Hsuan Yen).
+	+ improve terminfo manual page discussion of control- and graphics-
+	  characters.
+	+ remove tic warning about "^?" in string capabilities, which was
+	  marked as an extension (cf: 20000610, 20110820); however all Unix
+	  implementations support this and X/Open Curses does not address it.
+	  On the other hand, termcap never did support this feature.
+	+ correct missing comma-separator between string capabilities in
+	  icl6402 and m2-nam -TD
+	+ restore rmir/smir in ansi+idc to better match original ansiterm+idc,
+	  add alias ansiterm (report by Robert King).
+	+ amend an old check for ambiguous use of "ma" in terminfo versus
+	  a termcap use, if the capability is cancelled to treat it as number.
+	+ correct a case in _nc_captoinfo() which read "%%" and emitted "%".
+	+ modify sscanf calls in _nc_infotocap() for patterns "%{number}%+%c"
+	  and "%'char'%+%c" to check that the final character is really 'c',
+	  avoiding a case in icl6404 which cannot be converted to termcap.
+	+ in _nc_infotocap(), add a check to ensure that terminfo "^?" is not
+	  written to termcap, because the BSDs did not implement that.
+	+ in _nc_tic_expand() and _nc_infotocap(), improve string-length check
+	  when deciding whether to use "^X" or "\xxx" format for control
+	  characters, to make the output of tic/infocmp more predictable.
+	+ limit termcap "%d" width to 2 digits on input, and use "%2" in
+	  preference to "%02" on output.
+	+ correct terminfo/termcap conversion of "%02" and "%03" into "%2" and
+	  "%3"; the result repeated the last character.
+	+ add man/scr_dump.5 to document screen-dump format.
+
+20170415
+	+ modify several test programs to use new popup_msgs, adapted from
+	  help-screen used in test/edit_field.c
+	+ drop two symbols obsoleted in 2004: _nc_check_termtype, and
+	  _nc_resolve_uses
+	+ fix some old copyright dates (cf: 20031025).
+	+ build-fixes for test/savescreen.c to work with AIX and HPUX.
+	+ minor fix to configure script, adding a backslash/continuation.
+	+ extend TERMINAL structure for ABI 6 to store numbers internally as
+	  integers rather than short, by adding new data for this purpose.
+	+ more fixes for minor memory-leaks in test-programs.
+
+20170408
+	+ change logic in wins_nwstr() to avoid addressing data past the output
+	  of mbstowcs().
+	+ correct a call to setcchar() in Data_Entry_w() from 20131207 changes.
+	+ fix minor memory-leaks in test-programs.
+	+ further improve ifdef in term_entry.h for internal definitions not
+	  used by tack.
+
+20170401
+	+ minor fixes for vt100+4bsd, e.g., delay in sgr for consistency -TD
+	+ add smso for env230, to match sgr -TD
+	+ remove p7/protect from sgr in fbterm -TD
+	+ drop setf/setb from fbterm; setaf/setab are enough -TD
+	+ make xterm-pcolor sgr consistent with other capabilities -TD
+	+ add rmxx/smxx ECMA-48 strikeout extension to tmux and xterm-basic
+	  (discussion with Nicholas Marriott)
+	+ add test-programs sp_tinfo and extended_color
+	+ modify no-leaks code for lib_cur_term.c to account for the tgetent()
+	  cache.
+	+ modify setupterm() to save original tty-modes so that erasechar()
+	  works as expected.  Also modify _nc_setupscreen() to avoid redundant
+	  calls to get original tty-modes.
+	+ modify set_curterm() to update ttytype[] data used by longname().
+	+ modify wattr_set() and wattr_get() to return ERR if win-parameter is
+	  null, as documented.
+	+ improve cast used for null-pointer checks in header macros, to
+	  reduce compiler warnings.
+	+ modify several functions, using the reserved "opts" parameter to pass
+	  color- and pair-values larger than 16-bits:
+	  + getcchar(), setcchar(), slk_attr_set(), vid_puts(), wattr_get(),
+	    wattr_set(), wchgat(), wcolor_set().
+	  + Other functions call these with the corresponding altered behavior,
+	    including chgat(), mvchgat(), mvwchgat(), slk_color_on(),
+	    slk_color_off(), vid_attr().
+	+ add new functions for manipulating color- and pair-values larger
+	  than 16-bits.  These are extended_color_content(),
+	  extended_pair_content(), extended_slk_color(), init_extended_color(),
+	  init_extended_pair(), and the corresponding sp-funcs.
+
+20170325
+	+ fix a memory leak in the window-list when creating multiple screens
+	  (reports by Andres Martinelli, Debian #783486).
+	+ reviewed calls from link_test.c, added a few more null-pointer
+	  checks.
+	+ add a null-pointer check in ungetmouse, in case mousemask was not
+	  called (report by "Kau").
+	+ updated curs_sp_funcs.3x for new functions.
+
+20170318
+	+ change TERMINAL structure in term.h to make it opaque.  Some
+	  applications misuse its members, e.g., directly modifying it
+	  rather than using def_prog_mode().
+	+ modify utility headers such as tic.h to make it clearer which are
+	  externals that are used by tack.
+	+ improve curs_slk.3x in particular its discussion of portability.
+	+ fix cut/paste in legacy_encoding.3x
+	+ add prototype for find_pair() to new_pair.3x (report by Branden
+	  Robinson).
+	+ fix a couple of broken links in generated man-html documentation.
+	+ regenerate man-html documentation.
+
+20170311
+	+ modify vt100 rs2 string to reset vt52 mode and scrolling regions
+	  (report/analysis by Robert King) -TD
+	+ add vt100+4bsd building block, use that for older terminals rather
+	  than "vt100" which is now mostly used as a building block for
+	  terminal emulators -TD
+	+ correct a few spelling errors in terminfo.src comments -TD
+	+ add fbterm -TD
+	+ fix a typo in ncurses.c test_attr legend (patch by Petr Vanek).
+	+ changed internal colorpair_t to a struct, eliminating an internal
+	  8-bit limit on colors
+	+ add ncurses/new_pair.h
+	+ add ncurses/base/new_pair.c with alloc_pair(), find_pair() and
+	  free_pair() functions
+	+ add test/demo_new_pair.c
+
+20170304
+	+ improve terminfo manual description of terminfo syntax.
+	+ clarify the use of wint_t vs wchar_t in curs_get_wstr.3x
+	+ improve description of endwin() in manual.
+	+ modify setcchar() and getcchar() to treat negative color-pair as an
+	  error.
+	+ fix a typo in include/hashed_db.h (Andre Sa).
+
+20170225
+	+ fixes for CF_CC_ENV_FLAGS (report by Ross Burton).
+
+20170218
+	+ fix several formatting issues with manual pages.
+	+ correct read of terminfo entry in which all strings are absent or
+	  explicitly cancelled.  Before this fix, the result was that all were
+	  treated as only absent.
+	+ modify infocmp to suppress mixture of absent/cancelled capabilities
+	  that would only show as "NULL, NULL", unless the -q option is used,
+	  e.g., to show "-, @" or "@, -".
+
+20170212
+	+ build-fixes for PGI compilers (report by Adam J. Stewart)
+	  + accept whitespace in sed expression for generating expanded.c
+	  + modify configure check that g++ compiler warnings are not used.
+	  + add configure check for -fPIC option needed for shared libraries.
+	+ let configure --disable-ext-funcs override the default for the
+	  --enable-sp-funcs option.
+	+ mark some structs in form/menu/panel libraries as potentially opaque
+	  without modifying API/ABI.
+	+ add configure option --enable-opaque-curses for ncurses library and
+	  similar options for the other libraries.
+
+20170204
+	+ trim newlines, tabs and escaped newlines from terminfo "paths" passed
+	  to db-iterator.
+	+ ignore zero-length files in db-iterator; these are useful for
+	  instance to suppress "$HOME/.terminfo" when not wanted.
+	+ amended "b64:" encoder to work with the terminfo reader.
+	+ modify terminfo reader to accept "b64:" format using RFC-3548 in
+	  as well as RFC-4648 url/filename-safe format.
+	+ modify terminfo reader to accept "hex:" format as generated by
+	  "infocmp -0qQ1" (cf: 20150905).
+	+ adjust authors comment to reflect drop below 1% for SV.
+
+20170128
+	+ minor comment-fixes to help automate links to bug-urls -TD
+	+ add dvtm, dvtm-256color -TD
+	+ add settings corresponding to xterm-keys option to tmux entry to
+	  reflect upcoming change to make that option "on" by default
+	  (patch by Nicholas Marriott).
+	+ uncancel Ms in tmux entry (Harry Gindi, Nicholas Marriott).
+	+ add dumb-emacs-ansi -TD
+
+20170121
+	+ improve discussion of early history of tput program.
+	+ incorporate A_COLOR mask into COLOR_PAIR(), in case user application
+	  provides an out-of-range pair number (report by Elijah Stone).
+	+ clarify description in tput manual page regarding support for
+	  termcap names (prompted by FreeBSD #214709).
+	+ remove a restriction in tput's support for termcap names which
+	  omitted capabilities normally not shown in termcap translations
+	  (cf: 990123).
+	+ modify configure script for clang as used on FreeBSD, to work around
+	  clang's differences in exit codes vs gcc.
+
+20170114
+	+ improve discussion of early history of tset/reset programs.
+	+ clarify in manual pages that the optional verbose option level is
+	  available only when ncurses is configured for tracing.
+	+ amend change from 20161231 to avoid writing traces to the standard
+	  error after initializing the trace feature using the environment
+	  variable.
+
+20170107
+	+ amend changes for tput to reset tty modes to "sane" if the program
+	  is run as "reset", like tset.  Likewise, ensure that tset sends
+	  either reset- or init-strings.
+	+ improve manual page descriptions of tput init/reset and tset/reset,
+	  to make it easier to see how they are similar and different.
+	+ move a static result from key_name() to _nc_globals
+	+ modify _nc_get_screensize to allow for use_env() and use_tioctl()
+	  state to be per-screen when sp-funcs are configured, better matching
+	  the behavior when using the term-driver configuration.
+	+ improve cross-references in manual pages for often used functions
+	+ move SCREEN field for use_tioctl() data before the ncursesw fields,
+	  and limit that to the sp-funcs configuration to improve termlib
+	  compatibility (cf:  20120714).
+	+ correct order of initialization for traces in use_env() and
+	  use_tioctl() versus first trace calls.
+
+20161231
+	+ fix errata for ncurses-howto (report by Damien Ruscoe).
+	+ fix a few places in configure/build scripts where DESTDIR and rpath
+	  were combined (report by Thomas Klausner).
+	+ merge current st description (report by Harry Gindi) -TD
+	+ modify flash capability for linux and wyse entries to put the delay
+	  between the reverse/normal escapes rather than after -TD
+	+ modify program tabs to pass the actual tty file descriptor to
+	  setupterm rather than the standard output, making padding work
+	  consistently.
+	+ explain in clear's manual page that it writes to stdout.
+	+ add special case for verbose debugging traces of command-line
+	  utilities which write to stderr (cf: 20161126).
+	+ remove a trace with literal escapes from skip_DECSCNM(), added in
+	  20161203.
+	+ update config.guess, config.sub from
+		http://git.savannah.gnu.org/cgit/config.git
+
+20161224
+	+ correct parameters for copywin call in _nc_Synchronize_Attributes()
+	  (patch by Leon Winter).
+	+ improve color-handling section in terminfo manual page (prompted by
+	  patch by Mihail Konev).
+	+ modify programs clear, tput and tset to pass the actual tty file
+	  descriptor to setupterm rather than the standard output, making
+	  padding work.
+
+20161217
+	+ add tput-colorcube demo script.
+	+ add -r and -s options to tput-initc demo, to match usage in xterm.
+	+ flush the standard output in _nc_flush for the case where SP is zero,
+	  e.g., when called via putp.  This fixes a scenario where "tput flash"
+	  did not work after changes in 20130112.
+
+20161210
+	+ add configure script option --disable-wattr-macros for use in cases
+	  where one wants to use the same headers for ncurses5/ncurses6
+	  development, by suppressing the wattr* macros which differ due to
+	  the introduction of extended colors (prompted by comments in
+	  Debian #230990, Redhat #1270534).
+	+ add test/tput-initc to demonstrate tput used to initialize palette
+	  from a data file.
+	+ modify test/xterm*.dat to use the newer color4/color12 values.
+
+20161203
+	+ improve discussion of field validation in form_driver.3x manual page.
+	+ update curs_trace.3x manual page.
+
+20161126
+	+ modify linux-16color to not mask dim, standout or reverse with the
+	  ncv capability -TD
+	+ add 0.1sec mandatory delay to flash capabilities using the VT100
+	  reverse-video control -TD
+	+ omit selection of ISO-8859-1 for G0 in enacs capability from linux2.6
+	  entry, to avoid conflict with the user-defined mapping.  The reset
+	  feature will use ISO-8859-1 in any case (Mikulas Patocka).
+	+ improve check in tic for delays by also warning about beep/flash
+	  when a delay is not embedded, or if those use the VT100 reverse
+	  video escape without using a delay.
+	+ minor fix for syntax-check of delays from 20161119 changes.
+	+ modify trace() to avoid overwriting existing file (report by Maor
+	  Shwartz).
+
+20161119
+	+ add check in tic for some syntax errors of delays, as well as use of
+	  proportional delays for non-line capabilities.
+	+ document history of the clear program and the E3 extension, prompted
+	  by various discussions including
+	  http://unix.stackexchange.com/questions/87469/clearing-the-old-scrollback-buffer
+
+20161112
+	+ improve -W option in tic/infocmp:
+	  + correct order of size-adjustments in wrapped lines
+	  + if -f option splits line, do not further split it with -W
+	  + begin a new line when adding "use=" after a wrapped line
+
+20161105
+	+ fix typo in man/terminfo.tail (Alain Williams).
+	+ correct program-name in adacurses6-config.1 manual page.
+
+20161029
+	+ add new function "unfocus_current_field" (Leon Winter)
+
+20161022
+	+ modify tset -w (and tput reset) to update the program's copy of the
+	  screensize if it was already set in the system, to improve tabstop
+	  setting which relies upon knowing the actual screensize.
+	+ add functionality of tset -w to tput, like the "-c" feature this is
+	  not optional in tput.
+	+ add "clear" as a possible link/alias to tput.
+	+ improve tput's check for being called as "init" or "reset" to allow
+	  for transformed names.
+	+ split-out the "clear" function from progs/clear.c, share with
+	  tput to get the same behavior, e.g., the E3 extension.
+
+20161015
+	+ amend internal use of tputs to consistently use the number of lines
+	  affected, e.g., for insert/delete character operations.  While
+	  merging terminfo source early in 1995, several descriptions used the
+	  "*" proportional delay for these operations, prompting a change in
+	  doupdate.
+	+ regenerate llib-* files.
+	+ regenerate HTML manpages.
+	+ fix several formatting issues with manual pages.
+
+20161008
+	+ adjust size in infocmp/tic to work with strlcpy.
+	+ fix configure script to record when strlcat is found on OpenBSD.
+	+ build-fix for "recent" OpenBSD vs baudrate.
+
+20161001
+	+ add -W option to tic/infocmp to force long strings to wrap.  This is
+	  in addition to the -w option which attempts to fit capabilities into
+	  a given line-length.
+	+ add linux-m1 minitel entries (patch by Alexandre Montaron).
+	+ correct rs2 string for vt100-nam -TD
+
+20160924
+	+ modify _nc_tic_expand to escape comma if it immediately follows a
+	  percent sign, to work with minitel change.
+	+ updated minitel and viewdata descriptions (Alexandre Montaron).
+
+20160917
+	+ build-fix for gnat6, which unhelpfully attempts to compile C files.
+	+ fix typo in 20160910 changes (Debian #837892, patch by Sven Joachim).
+
+20160910
+	+ trim dead code ifdef'd with HIDE_EINTR since 970830 (discussion with
+	  Leon Winter).
+	+ trim some obsolete/incorrect wording about EINTR from wgetch manual
+	  page (patch by Leon Winter).
+	+ really correct 20100515 change (patch by Rich Coe).
+	+ add "--enable-string-hacks" option to test/configure
+	+ completed string-hacks for "sprintf", etc., including test-programs.
+	+ make "--enable-string-hacks" work with Debian by checking for the
+	  "bsd" library and its associated "<bsd/string.h>" header.
+
+20160903
+	+ correct 20100515 change for weak signals versus sigprocmask (report
+	  by Rich Coe).
+	+ modify misc/Makefile.in to work around OpenBSD "make" which unlike
+	  all other versions of "make" does not recognize continuation lines
+	  of comments.
+	+ amend the last change to CF_C_ENV_FLAGS to move only the
+	  preprocessor, optimization and warning flags to CPPFLAGS and CFLAGS,
+	  leaving the residue in CC.  That happens to work for gcc's various
+	  "model" options, but may require tuning for other compilers (report
+	  by Sven Joachim).
+
+20160827
+	+ add "v" menu entry to test/ncurses.c to show baudrate and other
+	  values.
+	+ add "newer" baudrate symbols from Linux and FreeBSD to progs/tset.c,
+	  lib_baudrate.c
+	+ modify CF_XOPEN_SOURCE macro:
+	  + add "uclinux" to case for "linux" (patch by Yann E. Morin)
+	  + modify _GNU_SOURCE for cygwin headers, tested with cygwin 2.3, 2.5
+	    (patch by Corinna Vinschen, from changes to tin).
+	+ improve CF_CC_ENV_FLAGS macro to allow for compiler wrappers such
+	  as "ccache" (report by Enrico Scholz).
+	+ update config.guess, config.sub from
+		http://git.savannah.gnu.org/cgit/config.git
+
+20160820
+	+ update tput manual page to reflect changes to manipulate terminal
+	  modes by sharing functions with tset.
+	+ add the terminal-mode parts of "reset" (aka tset) to the "tput reset"
+	  command, making the two almost the same except for window-size.
+	+ adapt logic used in dialog "--keep-tite" option for test/filter.c as
+	  "-a" option.  When set, test/filter attempts to suppress the
+	  alternate screen.
+	+ correct a typo in interix entry -TD
+
+20160813
+	+ add a dependency upon generated-sources in Ada95/src/Makefile.in to
+	  handle a case of "configure && make install".
+	+ trim trailing blanks from include/Caps*, to work around a problem
+	  in sed (Debian #818067).
+
+20160806
+	+ improve CF_GNU_SOURCE configure macro to optionally define
+	  _DEFAULT_SOURCE work around a nuisance in recent glibc releases.
+	+ move the terminfo-specific parts of tput's "reset" function into
+	  the shared reset_cmd.c, making the two forms of reset use the same
+	  strings.
+	+ split-out the terminal initialization functions from tset as
+	  progs/reset_cmd.c, as part of changes to merge the reset-feature
+	  with tput.
+
+20160730
+	+ change tset's initialization to allow it to get settings from the
+	  standard input as well as /dev/tty, to be more effective when
+	  output or error are redirected.
+	+ improve discussion of history and portability for tset/reset/tput
+	  manual pages.
+
+20160723
+	+ improve error message from tset/reset when both stderr/stdout are
+	  redirected to a file or pipe.
+	+ improve organization of curs_attr.3x, curs_color.3x
+
+20160709
+	+ work around Debian's antique/unmaintained version of mawk when
+	  building link_test.
+	+ improve test/list_keys.c, showing ncurses's convention of modifiers
+	  for special keys, based on xterm.
+
+20160702
+	+ improve test/list_keys.c, using $TERM if no parameters are given.
+
+20160625
+	+ build-fixes for ncurses "test_progs" rule.
+	+ amend change to CF_CC_ENV_FLAGS in 20160521 to make multilib build
+	  work (report by Sven Joachim).
+
+20160618
+	+ build-fixes for ncurses-examples with NetBSD curses.
+	+ improve test/list_keys.c, fixing column-widths and sorting the list
+	  to make it more readable.
+
+20160611
+	+ revise fix for Debian #805618 (report by Vlado Potisk, cf: 20151128).
+	+ modify test/ncurses.c a/A screens to make exiting on an escape
+	  character depend on the start of keypad and timeout modes, to allow
+	  better testing of function-keys.
+	+ modify rs1 for xterm-16color, xterm-88color and xterm-256color to
+	  reset palette using "oc" string as in linux -TD
+	+ use ANSI reply for u8 in xterm-new, to reflect vt220-style responses
+	  that could be returned -TD
+	+ added a few capabilities fixed in recent vte -TD
+
+20160604
+	+ correct logic for -f option in test/demo_terminfo.c
+	+ add test/list_keys.c
+
+20160528
+	+ further workaround for PIE/PIC breakage which causes gpm to not link.
+	+ fix most cppcheck warnings, mostly style, in ncurses library.
+
+20160521
+	+ improved manual page description of tset/reset versus window-size.
+	+ fixes to work with a slightly broken compiler configuration which
+	  cannot compile "Hello World!" without adding compiler options
+	  (report by Ola x Nilsson):
+	  + pass appropriate compiler options to the CF_PROG_CC_C_O macro.
+	  + when separating compiler and options in CF_CC_ENV_FLAGS, ensure
+	    that all options are split-off into CFLAGS or CPPFLAGS
+	  + restore some -I options removed in 20140726 because they appeared
+	    to be redundant.  In fact, they are needed for a compiler that
+	    cannot combine -c and -o options.
+
+20160514
+	+ regenerate HTML manpages.
+	+ improve manual pages for wgetch and wget_wch to point out that they
+	  might return values without names in curses.h (Debian #822426).
+	+ make linux3.0 entry the default linux entry (Debian #823658) -TD
+	+ modify linux2.6 entry to improve line-drawing so that the linux3.0
+	  entry can be used in non-UTF-8 mode -TD
+	+ document return value of use_extended_names (report by Mike Gran).
+
+20160507
+	+ amend change to _nc_do_color to restore the early return for the
+	  special case used in _nc_screen_wrap (report by Dick Streefland,
+	  cf: 20151017).
+	+ modify test/ncurses.c:
+	  + check return-value of putwin
+	  + correct ifdef which made the 'g' test's legend not reflect changes
+	    to keypad- and scroll-modes.
+	+ correct return-value of extended putwin (report by Mike Gran).
+
+20160423
+	+ modify test/ncurses.c 'd' edit-color menu to optionally read xterm
+	  color palette directly from terminal, as well as handling KEY_RESIZE
+	  and screen-repainting with control/L and control/R.
+	+ add 'oc' capability to xterm+256color, allowing palette reset for
+	  xterm -TD
+
+20160416
+	+ add workaround in configure script for inept transition to PIE vs
+	  PIC builds documented in
+		  https://fedoraproject.org/wiki/Changes/Harden_All_Packages
+	+ add "reset" to list of programs whose names might change in manpages
+	  due to program-transformation configure options.
+	+ drop long-obsolete "-n" option from tset.
+
+20160409
+	+ modify test/blue.c to use Unicode values for card-glyphs when
+	  available, as well as improving the check for CP437 and CP850.
+
+20160402
+	+ regenerate HTML manpages.
+	+ improve manual pages for utilities with respect to POSIX versus
+	  X/Open Curses.
+
+20160326
+	+ regenerate HTML manpages.
+	+ improve test/demo_menus.c, allowing mouse-click on the menu-headers
+	  to switch the active menu.  This requires a new extension option
+	  O_MOUSE_MENU to tell the menu driver to put mouse events which do not
+	  apply to the active menu back into the queue so that the application
+	  can handle the event.
+
+20160319
+	+ improve description of tgoto parameters (report by Steffen Nurpmeso).
+	+ amend workaround for Solaris line-drawing to restore a special case
+	  that maps Unicode line-drawing characters into the acsc string for
+	  non-Unicode locales (Debian #816888).
+
+20160312
+	+ modified test/filter.c to illustrate an alternative to getnstr, that
+	  polls for input while updating a clock on the right margin as well
+	  as responding to window size-changes.
+
+20160305
+	+ omit a redefinition of "inline" when traces are enabled, since this
+	  does not work with gcc 5.3.x MinGW cross-compiling (cf: 20150912).
+
+20160220
+	+ modify test/configure script to check for pthread dependency of
+	  ncursest or ncursestw library when building ncurses examples, e.g.,
+	  in case weak symbols are used.
+	+ modify configure macro for shared-library rules to use -Wl,-rpath
+	  rather than -rpath to work around a bug in scons (FreeBSD #178732,
+	  cf: 20061021).
+	+ double-width multibyte characters were not counted properly in
+	  winsnstr and wins_nwstr (report/example by Eric Pruitt).
+	+ update config.guess, config.sub from
+		http://git.savannah.gnu.org/cgit/config.git
+
+20160213
+	+ amend fix for _nc_ripoffline from 20091031 to make test/ditto.c work
+	  in threaded configuration.
+	+ move _nc_tracebits, _tracedump and _tracemouse to curses.priv.h,
+	  since they are not part of the suggested ABI6.
+
+20160206
+	+ define WIN32_LEAN_AND_MEAN for MinGW port, making builds faster.
+	+ modify test/ditto.c to allow $XTERM_PROG environment variable to
+	  override "xterm" as the name of the program to run in the threaded
+	  configuration.
+
+20160130
+	+ improve formatting of man/curs_refresh.3x and man/tset.1 manpages
+	+ regenerate HTML manpages using newer man2html to eliminate some
+	  unwanted blank lines.
+
+20160123
+	+ ifdef'd header-file definition of mouse_trafo() with NCURSES_NOMACROS
+	  (report by Corey Minyard).
+	+ fix some strict compiler-warnings in traces.
+
+20160116
+	+ tidy up comments about hardcoded 256color palette (report by
+	  Leonardo Brondani Schenkel) -TD
+	+ add putty-noapp entry, and amend putty entry to use application mode
+	  for better consistency with xterm (report by Leonardo Brondani
+	  Schenkel) -TD
+	+ modify _nc_viscbuf2() and _tracecchar_t2() to trace wide-characters
+	  as a whole rather than their multibyte equivalents.
+	+ minor fix in wadd_wchnstr() to ensure that each cell has nonzero
+	  width.
+	+ move PUTC_INIT calls next to wcrtomb calls, to avoid carry-over of
+	  error status when processing Unicode values which are not mapped.
+
+20160102
+	+ modify ncurses c/C color test-screens to take advantage of wide
+	  screens, reducing the number of lines used for 88- and 256-colors.
+	+ minor refinement to check versus ncv to ignore two parameters of
+	  SGR 38 and 48 when those come from color-capabilities.
+
+20151226
+	+ add check in tic for use of bold, etc., video attributes in the
+	  color capabilities, accounting whether the feature is listed in ncv.
+	+ add check in tic for conflict between ritm, rmso, rmul versus sgr0.
+
+20151219
+	+ add a paragraph to curs_getch.3x discussing key naming (discussion
+	  with James Crippen).
+	+ amend workaround for Solaris vs line-drawing to take the configure
+	  check into account.
+	+ add a configure check for wcwidth() versus the ncurses line-drawing
+	  characters, to use in special-casing systems such as Solaris.
+
+20151212
+	+ improve CF_XOPEN_CURSES macro used in test/configure, to define as
+	  needed NCURSES_WIDECHAR for platforms where _XOPEN_SOURCE_EXTENDED
+	  does not work.  Also modified the test program to ensure that if
+	  building with ncurses, that the cchar_t type is checked, since that
+	  normally is since 20111030 ifdef'd depending on this test.
+	+ improve 20121222 workaround for broken acs, letting Solaris "work"
+	  in spite of its misconfigured wcwidth which marks all of the line
+	  drawing characters as double-width.
+
+20151205
+	+ update form_cursor.3x, form_post.3x, menu_attributes.3x to list
+	  function names in NAME section (patch by Jason McIntyre).
+	+ minor fixes to manpage NAME/SYNOPSIS sections to consistently use
+	  rule that either all functions which are prototyped in SYNOPSIS are
+	  listed in the NAME section, or the manual-page name is the sole item
+	  listed in the NAME section.  The latter is used to reduce clutter,
+	  e.g., for the top-level library manual pages as well as for certain
+	  feature-pages such as SP-funcs and threading (prompted by patches by
+	  Jason McIntyre).
+
+20151128
+	+ add option to preserve leading whitespace in form fields (patch by
+	  Leon Winter).
+	+ add missing assignment in lib_getch.c to make notimeout() work
+	  (Debian #805618).
+	+ add 't' toggle for notimeout() function in test/ncurses.c a/A screens
+	+ add viewdata terminal description (Alexandre Montaron).
+	+ fix a case in tic/infocmp for formatting capabilities where a
+	  backslash at the end of a string was mishandled.
+	+ fix some typos in curs_inopts.3x (Benno Schulenberg).
+
+20151121
+	+ fix some inconsistencies in the pccon* entries -TD
+	+ add bold to pccon+sgr+acs and pccon-base (Tati Chevron).
+	+ add keys f12-f124 to pccon+keys (Tati Chevron).
+	+ add test/test_sgr.c program to exercise all combinations of sgr.
+
+20151107
+	+ modify tset's assignment to TERM in its output to reflect the name by
+	  which the terminal description is found, rather than the primary
+	  name.  That was an unnecessary part from the initial conversion of
+	  tset from termcap to terminfo.  The termcap program in 4.3BSD did
+	  this to avoid using the short 2-character name (report by Rich
+	  Burridge).
+	+ minor fix to configure script to ensure that rules for resulting.map
+	  are only generated when needed (cf: 20151101).
+	+ modify configure script to handle the case where tic-library is
+	  renamed, but the --with-debug option is used by itself without
+	  normal or shared libraries (prompted by comment in Debian #803482).
+
+20151101
+	+ amend change for pkg-config which allows build of pc-files when no
+	  valid pkg-config library directory was configured to suppress the
+	  actual install if it is not overridden to a valid directory at
+	  install time (cf: 20150822).
+	+ modify editing script which generates resulting.map to work with the
+	  clang configuration on recent FreeBSD, which gives an error on an
+	  empty "local" section.
+	+ fix a spurious "(Part)" message in test/ncurses.c b/B tests due
+	  to incorrect attribute-masking.
+
+20151024
+	+ modify MKexpanded.sh to update the expansion of a temporary filename
+	  to "expanded.c", for use in trace statements.
+	+ modify layout of b/B tests in test/ncurses.c to allow for additional
+	  annotation on the right margin; some terminals with partial support
+	  did not display well.
+	+ fix typo in curs_attr.3x (patch by Sven Joachim).
+	+ fix typo in INSTALL (patch by Tomas Cech).
+	+ improve configure check for setting WILDCARD_SYMS variable; on ppc64
+	  the variable is in the Data section rather than Text (patch by Michel
+	  Normand, Novell #946048).
+	+ using configure option "--without-fallbacks" incorrectly caused
+	  FALLBACK_LIST to be set to "no" (patch by Tomas Cech).
+	+ updated minitel entries to fix kel problem with emacs, and add
+	  minitel1b-nb (Alexandre Montaron).
+	+ reviewed/updated nsterm entry Terminal.app in OSX -TD
+	+ replace some dead URLs in comments with equivalents from the
+	  Internet Archive -TD
+	+ update config.guess, config.sub from
+		http://git.savannah.gnu.org/cgit/config.git
+
+20151017
+	+ modify ncurses/Makefile.in to sort keys.list in POSIX locale
+	  (Debian #801864, patch by Esa Peuha).
+	+ remove an early-return from _nc_do_color, which can interfere with
+	  data needed by bkgd when ncurses is configured with extended colors
+	  (patch by Denis Tikhomirov).
+	> fixes for OS/2 (patches by KO Myung-Hun)
+	+ use button instead of kbuf[0] in EMX-specific part of lib_mouse.c
+	+ support building with libtool on OS/2
+	+ use stdc++ on OS/2 kLIBC
+	+ clear cf_XOPEN_SOURCE on OS/2
+
+20151010
+	+ add configure check for openpty to test/configure script, for ditto.
+	+ minor fixes to test/view.c in investigating Debian #790847.
+	+ update autoconf patch to 2.52.20150926, incorporates a fix for Cdk.
+	+ add workaround for breakage of POSIX makefiles by recent binutils
+	  change.
+	+ improve check for working poll() by using posix_openpt() as a
+	  fallback in case there is no valid terminal on the standard input
+	  (prompted by discussion on bug-ncurses mailing list, Debian #676461).
+
+20150926
+	+ change makefile rule for removing resulting.map to distclean rather
+	  than clean.
+	+ add /lib/terminfo to terminfo-dirs in ".deb" test-package.
+	+ add note on portability of resizeterm and wresize to manual pages.
+
+20150919
+	+ clarify in resizeterm.3x how KEY_RESIZE is pushed onto the input
+	  stream.
+	+ clarify in curs_getch.3x that the keypad mode affects ability to
+	  read KEY_MOUSE codes, but does not affect KEY_RESIZE.
+	+ add overlooked build-fix needed with Cygwin for separate Ada95
+	  configure script, cf: 20150606 (report by Nicolas Boulenguez)
+
+20150912
+	+ fixes for configure/build using clang on OSX (prompted by report by
+	  William Gallafent).
+	  + do not redefine "inline" in ncurses_cfg.h; this was originally to
+	    solve a problem with gcc/g++, but is aggravated by clang's misuse
+	    of symbols to pretend it is gcc.
+	  + add braces to configure script to prevent unwanted add of
+	    "-lstdc++" to the CXXLIBS symbol.
+	  + improve/update test-program used for checking existence of stdc++
+	    library.
+	  + if $CXXLIBS is set, the linkage test uses that in addition to $LIBS
+
+20150905
+	+ add note in curs_addch.3x about line-drawing when it depends upon
+	  UTF-8.
+	+ add tic -q option for consistency with infocmp, use it to suppress
+	  all comments from the "tic -I" output.
+	+ modify infocmp -q option to suppress the "Reconstructed from"
+	  header.
+	+ add infocmp/tic -Q option, which allows one to dump the compiled
+	  form of the terminal entry, in hexadecimal or base64.
+
+20150822
+	+ sort options in usage message for infocmp, to make it simpler to
+	  see unused letters.
+	+ update usage message for tic, adding "-0" option.
+	+ documented differences in ESCDELAY versus AIX's implementation.
+	+ fix some compiler warnings from ports.
+	+ modify --with-pkg-config-libdir option to make it possible to install
+	  ".pc" files even if pkg-config is not found (adapted from patch by
+	  Joshua Root).
+
+20150815
+	+ disallow "no" as a possible value for "--with-shlib-version" option,
+	  overlooked in cleanup-changes for 20000708 (report by Tommy Alex).
+	+ update release notes in INSTALL.
+	+ regenerate llib-* files to help with review for release notes.
+
+20150810
+	+ workaround for Debian #65617, which was fixed in mawk's upstream
+	  releases in 2009 (report by Sven Joachim).  See
+	  	https://invisible-island.net/mawk/CHANGES.html#t20090727
+
+20150808 6.0 release for upload to ftp.gnu.org
+
+20150808
+	+ build-fix for Ada95 on older platforms without stdint.h
+	+ build-fix for Solaris, whose /bin/sh and /usr/bin/sed are non-POSIX.
+	+ update release announcement, summarizing more than 800 changes across
+	  more than 200 snapshots.
+	+ minor fixes to manpages, etc., to simplify linking from announcement
+	  page.
+
+20150725
+	+ updated llib-* files.
+	+ build-fixes for ncurses library "test_progs" rule.
+	+ use alternate workaround for gcc 5.x feature (adapted from patch by
+	  Mikhail Peselnik).
+	+ add status line to tmux via xterm+sl (patch by Nicholas Marriott).
+	+ fixes for st 0.5 from testing with tack -TD
+	+ review/improve several manual pages to break up wall-of-text:
+	  curs_add_wch.3x, curs_attr.3x, curs_bkgd.3x, curs_bkgrnd.3x,
+	  curs_getcchar.3x, curs_getch.3x, curs_kernel.3x, curs_mouse.3x,
+	  curs_outopts.3x, curs_overlay.3x, curs_pad.3x, curs_termattrs.3x
+	  curs_trace.3x, and curs_window.3x
+
+20150719
+	+ correct an old logic error for %A and %O in tparm (report by "zreed").
+	+ improve documentation for signal handlers by adding section in the
+	  curs_initscr.3x page.
+	+ modify logic in make_keys.c to not assume anything about the size
+	  of strnames and strfnames variables, since those may be functions
+	  in the thread- or broken-linker configurations (problem found by
+	  Coverity).
+	+ modify test/configure script to check for pthreads configuration,
+	  e.g., ncursestw library.
+
+20150711
+	+ modify scripts to build/use test-packages for the pthreads
+	  configuration of ncurses6.
+	+ add references to ttytype and termcap symbols in demo_terminfo.c and
+	  demo_termcap.c to ensure that when building ncursest.map, etc., that
+	  the corresponding names such as _nc_ttytype are added to the list of
+	  versioned symbols (report by Werner Fink)
+	+ fix regression from 20150704 (report/patch by Werner Fink).
+
+20150704
+	+ fix a few problems reported by Coverity.
+	+ fix comparison against "/usr/include" in misc/gen-pkgconfig.in
+	  (report by Daiki Ueno, Debian #790548, cf:  20141213).
+
+20150627
+	+ modify configure script to remove deprecated ABI 5 symbols when
+	  building ABI 6.
+	+ add symbols _nc_Default_Field, _nc_Default_Form, _nc_has_mouse to
+	  map-files, but marked as deprecated so that they can easily be
+	  suppressed from ABI 6 builds (Debian #788610).
+	+ comment-out "screen.xterm" entry, and inherit screen.xterm-256color
+	  from xterm-new (report by Richard Birkett) -TD
+	+ modify read_entry.c to set the error-return to -1 if no terminal
+	  databases were found, as documented for setupterm.
+	+ add test_setupterm.c to demonstrate normal/error returns from the
+	  setupterm and restartterm functions.
+	+ amend cleanup change from 20110813 which removed redundant definition
+	  of ret_error, etc., from tinfo_driver.c, to account for the fact that
+	  it should return a bool rather than int (report/analysis by Johannes
+	  Schindelin).
+
+20150613
+	+ fix overflow warning for OSX with lib_baudrate.c (cf: 20010630).
+	+ modify script used to generate map/sym files to mark 5.9.20150530 as
+	  the last "5.9" version, and regenerated the files.  That makes the
+	  files not use ".current" for the post-5.9 symbols.  This also
+	  corrects the label for _nc_sigprocmask used in when weak symbols are
+	  configured for the ncursest/ncursestw libraries (prompted by
+	  discussion with Sven Joachim).
+	+ fix typo in NEWS (report by Sven Joachim).
+
+20150606 pre-release
+	+ make ABI 6 the default by updates to dist.mk and VERSION, with the
+	  intention that the existing ABI 5 should build as before using the
+	  "--with-abi-version=5" option.
+	+ regenerate ada- and man-html documentation.
+	+ minor fixes to color- and util-manpages.
+	+ fix a regression in Ada95/gen/Makefile.in, to handle special case of
+	  Cygwin, which uses the broken-linker feature.
+	+ amend fix for CF_NCURSES_CONFIG used in test/configure to assume that
+	  ncurses package scripts work when present for cross-compiling, as the
+	  lessor of two evils (cf: 20150530).
+	+ add check in configure script to disallow conflicting options
+	  "--with-termlib" and "--enable-term-driver".
+	+ move defaults for "--disable-lp64" and "--with-versioned-syms" into
+	  CF_ABI_DEFAULTS macro.
+
+20150530
+	+ change private type for Event_Mask in Ada95 binding to work when
+	  mmask_t is set to 32-bits.
+	+ remove spurious "%;" from st entry (report by Daniel Pitts) -TD
+	+ add vte-2014, update vte to use that -TD
+	+ modify tic and infocmp to "move" a diagnostic for tparm strings that
+	  have a syntax error to tic's "-c" option (report by Daniel Pitts).
+	+ fix two problems with configure script macros (Debian #786436,
+	  cf: 20150425, cf: 20100529).
+
+20150523
+	+ add 'P' menu item to test/ncurses.c, to show pad in color.
+	+ improve discussion in curs_color.3x about color rendering (prompted
+	  by comment on Stack Overflow forum):
+	+ remove screen-bce.mlterm, since mlterm does not do "bce" -TD
+	+ add several screen.XXX entries to support the respective variations
+	  for 256 colors -TD
+	+ add putty+fnkeys* building-block entries -TD
+	+ add smkx/rmkx to capabilities analyzed with infocmp "-i" option.
+
+20150516
+	+ amend change to ".pc" files to only use the extra loader flags which
+	  may have rpath options (report by Sven Joachim, cf: 20150502).
+	+ change versioning for dpkg's in test-packages for Ada95 and
+	  ncurses-examples for consistency with Debian, to work with package
+	  updates.
+	+ regenerate html manpages.
+	+ clarify handling of carriage return in waddch manual page; it was
+	  discussed only in the portability section (prompted by comment on
+	  Stack Overflow forum):
+
+20150509
+	+ add test-packages for cross-compiling ncurses-examples using the
+	  MinGW test-packages.  These are only the Debian packages; RPM later.
+	+ cleanup format of debian/copyright files
+	+ add pc-files to the MinGW cross-compiling test-packages.
+	+ correct a couple of places in gen-pkgconfig.in to handle renaming of
+	  the tinfo library.
+
+20150502
+	+ modify the configure script to allow different default values
+	  for ABI 5 versus ABI 6.
+	+ add wgetch-events to test-packages.
+	+ add a note on how to build ncurses-examples to test/README.
+	+ fix a memory leak in delscreen (report by Daniel Kahn Gillmor,
+	  Debian #783486) -TD
+	+ remove unnecessary ';' from E3 capabilities -TD
+	+ add tmux entry, derived from screen (patch by Nicholas Marriott).
+	+ split-out recent change to nsterm-bce as nsterm-build326, and add
+	  nsterm-build342 to reflect changes with successive releases of OSX
+	  (discussion with Leonardo B Schenkel)
+	+ add xon, ich1, il1 to ibm3161 (patch by Stephen Powell, Debian
+	  #783806)
+	+ add sample "magic" file, to document ext-putwin.
+	+ modify gen-pkgconfig.in to add explicit -ltinfo, etc., to the
+	  generated ".pc" file when ld option "--as-needed" is used, or when
+	  ncurses and tinfo are installed without using rpath (prompted by
+	  discussion with Sylvain Bertrand).
+	+ modify test-package for ncurses6 to omit rpath feature when installed
+	  in /usr.
+	+ add OSX's "*.dSYM" to clean-rules in makefiles.
+	+ make extra-suffix work for OSX configuration, e.g., for shared
+	  libraries.
+	+ modify Ada95/configure script to work with pkg-config
+	+ move test-package for ncurses6 to /usr, since filename-conflicts have
+	  been eliminated.
+	+ corrected build rules for Ada95/gen/generate; it does not depend on
+	  the ncurses library aside from headers.
+	+ reviewed man pages, fixed a few other spelling errors.
+	+ fix a typo in curs_util.3x (Sven Joachim).
+	+ use extra-suffix in some overlooked shared library dependencies
+	  found by 20150425 changes for test-packages.
+	+ update config.guess, config.sub from
+		http://git.savannah.gnu.org/cgit/config.git
+
+20150425
+	+ expanded description of tgetstr's area pointer in manual page
+	  (report by Todd M Lewis).
+	+ in-progress changes to modify test-packages to use ncursesw6 rather
+	  than ncursesw, with updated configure scripts.
+	+ modify CF_NCURSES_CONFIG in Ada95- and test-configure scripts to
+	  check for ".pc" files via pkg-config, but add a linkage check since
+	  frequently pkg-config configurations are broken.
+	+ modify misc/gen-pkgconfig.in to include EXTRA_LDFLAGS, e.g., for the
+	  rpath option.
+	+ add 'dim' capability to screen entry (report by Leonardo B Schenkel)
+	+ add several key definitions to nsterm-bce to match preconfigured
+	  keys, e.g., with OSX 10.9 and 10.10 (report by Leonardo B Schenkel)
+	+ fix repeated "extra-suffix" in ncurses-config.in (cf: 20150418).
+	+ improve term_variables manual page, adding section on the terminfo
+	  long-name symbols which are defined in the term.h header.
+	+ fix bug in lib_tracebits.c introduced in const-fixes (cf: 20150404).
+
+20150418
+	+ avoid a blank line in output from tabs program by ending it with
+	  a carriage return as done in FreeBSD (patch by James Clarke).
+	+ build-fix for the "--enable-ext-putwin" feature when not using
+	  wide characters (report by Werner Fink).
+	+ modify autoconf macros to use scripting improvement from xterm.
+	+ add -brtl option to compiler options on AIX 5-7, needed to link
+	  with the shared libraries.
+	+ add --with-extra-suffix option to help with installing nonconflicting
+	  ncurses6 packages, e.g., avoiding header- and library-conflicts.
+	  NOTE: as a side-effect, this renames
+		  adacurses-config to adacurses5-config and
+		  adacursesw-config to adacursesw5-config
+	+ modify debian/rules test package to suffix programs with "6".
+	+ clarify in curs_inopts.3x that window-specific settings do not
+	  inherit into new windows.
+
+20150404
+	+ improve description of start_color() in the manual.
+	+ modify several files in ncurses- and progs-directories to allow
+	  const data used in internal tables to be put by the linker into the
+	  readonly text segment.
+
+20150329
+	+ correct cut/paste error for "--enable-ext-putwin" that made it the
+	  same as "--enable-ext-colors" (report by Roumen Petrov)
+
+20150328
+	+ add "-f" option to test/savescreen.c to help with testing/debugging
+	  the extended putwin/getwin.
+	+ add logic for writing/reading combining characters in the extended
+	  putwin/getwin.
+	+ add "--enable-ext-putwin" configure option to turn on the extended
+	  putwin/getwin.
+
+20150321
+	+ in-progress changes to provide an extended version of putwin and
+	  getwin which will be capable of reading screen-dumps between the
+	  wide/normal ncurses configurations.  These are text files, except
+	  for a magic code at the beginning:
+	  0       string          \210\210        Screen-dump (ncurses)
+
+20150307
+	+ document limitations of getwin in manual page (prompted by discussion
+	  with John S Urban).
+	+ extend test/savescreen.c to demonstrate that color pair values
+	  and graphic characters can be restored using getwin.
+
+20150228
+	+ modify win_driver.c to eliminate the constructor, to make it more
+	  usable in an application which may/may not need the console window
+	  (report by Grady Martin).
+
+20150221
+	+ capture define's related to -D_XOPEN_SOURCE from the configure check
+	  and add those to the *-config and *.pc files, to simplify use for
+	  the wide-character libraries.
+	+ modify ncurses.spec to accommodate Fedora21's location of pkg-config
+	  directory.
+	+ correct sense of "--disable-lib-suffixes" configure option (report
+	  by Nicolas Boos, cf: 20140426).
+
+20150214
+	+ regenerate html manpages using improved man2html from work on xterm.
+	+ regenerated ".map" and ".sym" files using improved script, accounting
+	  for the "--enable-weak-symbols" configure option (report by Werner
+	  Fink).
+
+20150131
+	+ regenerated ".map" and ".sym" files using improved script, showing
+	  the combinations of configure options used at each stage.
+
+20150124
+	+ add configure check to determine if "local: _*;" can be used in the
+	  ".map" files to selectively omit symbols beginning with "_".  On at
+	  least recent FreeBSD, the wildcard applies to all "_" symbols.
+	+ remove obsolete/conflicting rule for ncurses.map from
+	  ncurses/Makefile.in (cf:  20130706).
+
+20150117
+	+ improve description in INSTALL of the --with-versioned-syms option.
+	+ add combination of --with-hashed-db and --with-ticlib to
+	  configurations for ".map" files (report by Werner Fink).
+
+20150110
+	+ add a step to generating ".map" files, to declare any remaining
+	  symbols beginning with "_" as local, at the last version node.
+	+ improve configure checks for pkg-config, addressing a variant found
+	  with FreeBSD ports.
+	+ modify win_driver.c to provide characters for special keys, like
+	  ansi.sys, when keypad mode is off, rather than returning nothing at
+	  all (discussion with Eli Zaretskii).
+	+ add "broken_linker" and "hashed-db" configure options to combinations
+	  use for generating the ".map" and ".sym" files.
+	+ avoid using "ld" directly when creating shared library, to simplify
+	  cross-compiles.  Also drop "-Bsharable" option from shared-library
+	  rules for FreeBSD and DragonFly (FreeBSD #196592).
+	+ fix a memory leak in form library Free_RegularExpression_Type()
+	  (report by Pavel Balaev).
+
+20150103
+	+ modify_nc_flush() to retry if interrupted (patch by Stian Skjelstad).
+	+ change map files to make _nc_freeall a global, since it may be used
+	  via the Ada95 binding when checking for memory leaks.
+	+ improve sed script used in 20141220 to account for wide-, threaded-
+	  variations in ABI 6.
+
+20141227
+	+ regenerate ".map" files, using step overlooked in 20141213 to use
+	  the same patch-dates across each file to match ncurses.map (report by
+	  Sven Joachim).
+
+20141221
+	+ fix an incorrect variable assignment in 20141220 changes (report by
+	  Sven Joachim).
+
+20141220
+	+ updated Ada95/configure with macro changes from 20141213
+	+ tie configure options --with-abi-version and --with-versioned-syms
+	  together, so that ABI 6 libraries have distinct symbol versions from
+	  the ABI 5 libraries.
+	+ replace obsolete/nonworking link to man2html with current one,
+	  regenerate html-manpages.
+
+20141213
+	+ modify misc/gen-pkgconfig.in to add -I option for include-directory
+	  when using both --prefix and --disable-overwrite (report by Misty
+	  De Meo).
+	+ add configure option --with-pc-suffix to allow minor renaming of
+	  ".pc" files and the corresponding library.  Use this in the test
+	  package for ncurses6.
+	+ modify configure script so that if pkg-config is not installed, it
+	  is still possible to install ".pc" files (report by Misty De Meo).
+	+ updated ".sym" files, removing symbols which are marked as "local"
+	  in the corresponding ".map" files.
+	+ updated ".map" files to reflect move of comp_captab and comp_hash
+	  from tic-library to tinfo-library in 20090711 (report by Sven
+	  Joachim).
+
+20141206
+	+ updated ".map" files so that each symbol that may be shared across
+	  the different library configurations has the same label.  Some
+	  review is needed to ensure these are really compatible.
+	+ modify MKlib_gen.sh to work around change in development version of
+	  gcc introduced here:
+		  https://gcc.gnu.org/ml/gcc-patches/2014-06/msg02185.html
+		  https://gcc.gnu.org/ml/gcc-patches/2014-07/msg00236.html
+	  (reports by Marcus Shawcroft, Maohui Lei).
+	+ improved configure macro CF_SUBDIR_PATH, from lynx changes.
+
+20141129
+	+ improved ".map" files by generating them with a script that builds
+	  ncurses with several related configurations and merges the results.
+	  A further refinement is planned, to make the tic- and tinfo-library
+	  symbols use the same versions across each of the four configurations
+	  which are represented (reports by Sven Joachim, Werner Fink).
+
+20141115
+	+ improve description of limits for color values and color pairs in
+	  curs_color.3x (prompted by patch by Tim van der Molen).
+	+ add VERSION file, using first field in that to record the ABI version
+	  used for configure --with-libtool --disable-libtool-version
+	+ add configure options for applying the ".map" and ".sym" files to
+	  the ncurses, form, menu and panel libraries.
+	+ add ".map" and ".sym" files to show exported symbols, e.g., for
+	  symbol-versioning.
+
+20141101
+	+ improve strict compiler-warnings by adding a cast in TRACE_RETURN
+	  and making a new TRACE_RETURN1 macro for cases where the cast does
+	  not apply.
+
+20141025
+	+ in-progress changes to integrate the win32 console driver with the
+	  msys2 configuration.
+
+20141018
+	+ reviewed terminology 0.6.1, add function key definitions.  None of
+	  the vt100-compatibility issues were improved -TD
+	+ improve infocmp conversion of extended capabilities to termcap by
+	  correcting the limit check against parametrized[], as well as filling
+	  in a check if the string happens to have parameters, e.g., "xm"
+	  in recent changes.
+	+ add check for zero/negative dimensions for resizeterm and resize_term
+	  (report by Mike Gran).
+
+20141011
+	+ add experimental support for xterm's 1005 mouse mode, to use in a
+	  demonstration of its limitations.
+	+ add experimental support for "%u" format to terminfo.
+	+ modify test/ncurses.c to also show position reports in 'a' test.
+	+ minor formatting fixes to _nc_trace_mmask_t, make this function
+	  exported to help with debugging mouse changes.
+	+ improve behavior of wheel-mice for xterm protocol, noting that there
+	  are only button-presses for buttons "4" and "5", so there is no need
+	  to wait to combine events into double-clicks (report/analysis by
+	  Greg Field).
+	+ provide examples xterm-1005 and xterm-1006 terminfo entries -TD
+	+ implement decoder for xterm SGR 1006 mouse mode.
+
+20140927
+	+ implement curs_set in win_driver.c
+	+ implement flash in win_driver.c
+	+ fix an infinite loop in win_driver.c if the command-window loses
+	  focus.
+	+ improve the non-buffered mode, i.e., NCURSES_CONSOLE2, of
+	  win_driver.c by temporarily changing the buffer-size to match the
+	  window-size to eliminate the scrollback.  Also enforce a minimum
+	  screen-size of 24x80 in the non-buffered mode.
+	+ modify generated misc/Makefile to suppress install.data from the
+	  dependencies if the --disable-db-install option is used, compensating
+	  for the top-level makefile changes used to add ncurses*-config in the
+	  20140920 changes (report by Steven Honeyman).
+
+20140920
+	+ add ncurses*-config to bin-directory of sample package-scripts.
+	+ add check to ensure that getopt is available; this is a problem in
+	  some older cross-compiler environments.
+	+ expanded on the description of --disable-overwrite in INSTALL
+	  (prompted by reports by Joakim Tjernlund, Thomas Klausner).
+	  See Gentoo #522586 and NetBSD #49200 for examples.
+	  which relates to the clarified guidelines.
+	+ remove special logic from CF_INCLUDE_DIRS which adds the directory
+	  for the --includedir from the build (report by Joakim Tjernlund).
+	+ add case for Unixware to CF_XOPEN_SOURCE, from lynx changes.
+	+ update config.sub from
+		http://git.savannah.gnu.org/cgit/config.git
+
+20140913
+	+ add a configure check to ignore some of the plethora of non-working
+	  C++ cross-compilers.
+	+ build-fixes for Ada95 with gnat 4.9
+
+20140906
+	+ build-fix and other improvements for port of ncurses-examples to
+	  NetBSD.
+	+ minor compiler-warning fixes.
+
+20140831
+	+ modify test/demo_termcap.c and test/demo_terminfo.c to make their
+	  options more directly comparable, and add "-i" option to specify
+	  a terminal description filename to parse for names to lookup.
+
+20140823
+	+ fix special case where double-width character overwrites a single-
+	  width character in the first column (report by Egmont Koblinger,
+	  cf: 20050813).
+
+20140816
+	+ fix colors in ncurses 'b' test which did not work after changing
+	  it to put the test-strings in subwindows (cf: 20140705).
+	+ merge redundant SEE-ALSO sections in form and menu manpages.
+
+20140809
+	+ modify declarations for user-data pointers in C++ binding to use
+	  reinterpret_cast to facilitate converting typed pointers to void*
+	  in user's application (patch by Adam Jiang).
+	+ regenerated html manpages.
+	+ add note regarding cause and effect for TERM in ncurses manpage,
+	  having noted clueless verbiage in Terminal.app's "help" file
+	  which reverses cause/effect.
+	+ remove special fallback definition for NCURSES_ATTR_T, since macros
+	  have resolved type-mismatches using casts (cf: 970412).
+	+ fixes for win_driver.c:
+	  + handle repainting on endwin/refresh combination.
+	  + implement beep().
+	  + minor cleanup.
+
+20140802
+	+ minor portability fixes for MinGW:
+	  + ensure WINVER is defined in makefiles rather than using headers
+	  + add check for gnatprep "-T" option
+	  + work around bug introduced by gcc 4.8.1 in MinGW which breaks
+	    "trace" feature:
+	    http://stackoverflow.com/questions/20877689/gcc-4-8-1-minggw-d-option-does-not-work-as-usual
+	+ fix most compiler warnings for Cygwin ncurses-examples.
+	+ restore "redundant" -I options in test/Makefile.in, since they are
+	  typically needed when building the derived ncurses-examples package
+	  (cf: 20140726).
+
+20140726
+	+ eliminate some redundant -I options used for building libraries, and
+	  ensure that ${srcdir} is added to the include-options (prompted by
+	  discussion with Paul Gilmartin).
+	+ modify configure script to work with Minix3.2
+	+ add form library extension O_DYNAMIC_JUSTIFY option which can be
+	  used to override the different treatment of justification for static
+	  versus dynamic fields (adapted from patch by Leon Winter).
+	+ add a null pointer check in test/edit_field.c (report/analysis by
+	  Leon Winter, cf: 20130608).
+
+20140719
+	+ make workarounds for compiling test-programs with NetBSD curses.
+	+ improve configure macro CF_ADD_LIBS, to eliminate repeated -l/-L
+	  options, from xterm changes.
+
+20140712
+	+ correct Charable() macro check for A_ALTCHARSET in wide-characters.
+	+ build-fix for position-debug code in tty_update.c, to work with or
+	  without sp-funcs.
+
+20140705
+	+ add w/W toggle to ncurses.c 'B' test, to demonstrate permutation of
+	  video-attributes and colors with double-width character strings.
+
+20140629
+	+ correct check in win_driver.c for saving screen contents, e.g., when
+	  NCURSES_CONSOLE2 is set (cf: 20140503).
+	+ reorganize b/B menu items in ncurses.c, putting the test-strings into
+	  subwindows.  This is needed for a planned change to use Unicode
+	  fullwidth characters in the test-screens.
+	+ correct update to form status for _NEWTOP, broken by fixes for
+	  compiler warnings (patch by Leon Winter, cf: 20120616).
+
+20140621
+	+ change shared-library suffix for AIX 5 and 6 to ".so", avoiding
+	  conflict with the static library (report by Ben Lentz).
+	+ document RPATH_LIST in INSTALLATION file, as part of workarounds for
+	  upgrading an ncurses library using the "--with-shared" option.
+	+ modify test/ncurses.c c/C tests to cycle through subsets of the
+	  total number of colors, to better illustrate 8/16/88/256-colors by
+	  providing directly comparable screens.
+	+ add test/dots_curses.c, for comparison with the low-level examples.
+
+20140614
+	+ fix dereference before null check found by Coverity in tic.c
+	  (cf: 20140524).
+	+ fix sign-extension bug in read_entry.c which prevented "toe" from
+	  reading empty "screen+italics" entry.
+	+ modify sgr for screen.xterm-new to support dim capability -TD
+	+ add dim capability to nsterm+7 -TD
+	+ cancel dim capability for iterm -TD
+	+ add dim, invis capabilities to vte-2012 -TD
+	+ add sitm/ritm to konsole-base and mlterm3 -TD
+
+20140609
+	> fix regression in screen terminfo entries (reports by Christian
+	  Ebert, Gabriele Balducci) -TD
+	+ revert the change to screen; see notes for why this did not work -TD
+	+ cancel sitm/ritm for entries which extend "screen", to work around
+	  screen's hardcoded behavior for SGR 3 -TD
+
+20140607
+	+ separate masking for sgr in vidputs from sitm/ritm, which do not
+	  overlap with sgr functionality.
+	+ remove unneeded -i option from adacurses-config; put -a in the -I
+	  option for consistency (patch by Pascal Pignard).
+	+ update xterm-new terminfo entry to xterm patch #305 -TD
+	+ change format of test-scripts for Debian Ada95 and ncurses-examples
+	  packages to quilted to work around Debian #700177 (cf: 20130907).
+	+ build fix for form_driver_w.c as part of ncurses-examples package for
+	  older ncurses than 20131207.
+	+ add Hello World example to adacurses-config manpage.
+	+ remove unused --enable-pc-files option from Ada95/configure.
+	+ add --disable-gnat-projects option for testing.
+	+ revert changes to Ada95 project-files configuration (cf: 20140524).
+	+ corrected usage message in adacurses-config.
+
+20140524
+	+ fix typo in ncurses manpage for the NCURSES_NO_MAGIC_COOKIE
+	  environment variable.
+	+ improve discussion of input-echoing in curs_getch.3x
+	+ clarify discussion in curs_addch.3x of wrapping.
+	+ modify parametrized.h to make fln non-padded.
+	+ correct several entries which had termcap-style padding used in
+	  terminfo: adm21, aj510, alto-h19, att605-pc, x820 -TD
+	+ correct syntax for padding in some entries: dg211, h19 -TD
+	+ correct ti924-8 which had confused padding versus octal escapes -TD
+	+ correct padding in sbi entry -TD
+	+ fix an old bug in the termcap emulation; "%i" was ignored in tparm()
+	  because the parameters to be incremented were already on the internal
+	  stack (report by Corinna Vinschen).
+	+ modify tic's "-c" option to take into account the "-C" option to
+	  activate additional checks which compare the results from running
+	  tparm() on the terminfo expressions versus the translated termcap
+	  expressions.
+	+ modify tic to allow it to read from FIFOs (report by Matthieu Fronton,
+	  cf: 20120324).
+	> patches by Nicolas Boulenguez:
+	+ explicit dereferences to suppress some style warnings.
+	+ when c_varargs_to_ada.c includes its header, use double quotes
+	  instead of <>.
+	+ samples/ncurses2-util.adb:  removed unused with clause.  The warning
+	  was removed by an obsolete pragma.
+	+ replaced Unreferenced pragmas with Warnings (Off).  The latter,
+	  available with older GNATs, needs no configure test.  This also
+	  replaces 3 untested Unreferenced pragmas.
+	+ simplified To_C usage in trace handling.  Using two parameters allows
+	  some basic formatting, and avoids a warning about security with some
+	  compiler flags.
+	+ for generated Ada sources, replace many snippets with one pure
+	  package.
+	+ removed C_Chtype and its conversions.
+	+ removed C_AttrType and its conversions.
+	+ removed conversions between int, Item_Option_Set, Menu_Option_Set.
+	+ removed int, Field_Option_Set, Item_Option_Set conversions.
+	+ removed C_TraceType, Attribute_Option_Set conversions.
+	+ replaced C.int with direct use of Eti_Error, now enumerated.  As it
+	  was used in a case statement, values were tested by the Ada compiler
+	  to be consecutive anyway.
+	+ src/Makefile.in: remove duplicate stanza
+	+ only consider using a project for shared libraries.
+	+ style. Silent gnat-4.9 warning about misplaced "then".
+	+ generate shared library project to honor ADAFLAGS, LDFLAGS.
+
+20140510
+	+ cleanup recently introduced compiler warnings for MingW port.
+	+ workaround for ${MAKEFLAGS} configure check versus GNU make 4.0,
+	  which introduces more than one gratuitous incompatibility.
+
+20140503
+	+ add vt520ansi terminfo entry (patch by Mike Gran)
+	+ further improve MinGW support for the scenario where there is an
+	  ANSI-escapes handler such as ansicon running in the console window
+	  (patch by Juergen Pfeifer).
+
+20140426
+	+ add --disable-lib-suffixes option (adapted from patch by Juergen
+	  Pfeifer).
+	+ merge some changes from Juergen Pfeifer's work with MSYS2, to
+	  simplify later merging:
+	  + use NC_ISATTY() macro for isatty() in library
+	  + add _nc_mingw_isatty() and related functions to windows-driver
+	  + rename terminal driver entrypoints to simplify grep's
+	+ remove a check in the sp-funcs flavor of newterm() which allowed only
+	  the first call to newterm() to succeed (report by Thomas Beierlein,
+	  cf: 20090927).
+
+20140419
+	+ update config.guess, config.sub from
+		http://git.savannah.gnu.org/cgit/config.git
+
+20140412
+	+ modify configure script:
+	  + drop the -no-gcc option from Intel compiler, from lynx changes.
+	  + extend the --with-hashed-db configure option to simplify building
+	    with different versions of Berkeley database using FreeBSD ports.
+	+ improve initialization for MinGW port (Juergen Pfeifer):
+	  + enforce Windows-style path-separator if cross-compiling,
+	  + add a driver-name method to each of the drivers,
+	  + allow the Windows driver name to match "unknown", ignoring case,
+	  + lengthen the built-in name for the Windows console driver to
+	    "#win32console", and
+	  + move the comparison of driver-names allowing abbreviation, e.g.,
+	    to "#win32con" into the Windows console driver.
+
+20140329
+	+ add check in tic for mismatch between ccc and initp/initc
+	+ cancel ccc in putty-256color and konsole-256color for consistency
+	  with the cancelled initc capability (patch by Sven Zuhlsdorf).
+	+ add xterm+256setaf building block for various terminals which only
+	  get the 256-color feature half-implemented -TD
+	+ updated "st" entry (leaving the 0.1.1 version as "simpleterm") to
+	  0.4.1 -TD
+
+20140323
+	+ fix typo in "mlterm" entry (report by Gabriele Balducci) -TD
+
+20140322
+	+ use types from <stdint.h> in sample build-scripts for chtype, etc.
+	+ modify configure script and curses.h.in to allow the types specified
+	  using --with-chtype and related options to be defined in <stdint.h>
+	+ add terminology entry -TD
+	+ add mlterm3 entry, use that as "mlterm" -TD
+	+ inherit mlterm-256color from mlterm -TD
+
+20140315
+	+ modify _nc_New_TopRow_and_CurrentItem() to ensure that the menu's
+	  top-row is adjusted as needed to ensure that the current item is
+	  on the screen (patch by Johann Klammer).
+	+ add wgetdelay() to retrieve _delay member of WINDOW if it happens to
+	  be opaque, e.g., in the pthread configuration (prompted by patch by
+	  Soren Brinkmann).
+
+20140308
+	+ modify ifdef in read_entry.c to handle the case where
+	  NCURSES_USE_DATABASE is not defined (patch by Xin Li).
+	+ add cast in form_driver_w() to fix ARM build (patch by Xin Li).
+	+ add logic to win_driver.c to save/restore screen contents when not
+	  allocating a console-buffer (cf: 20140215).
+
+20140301
+	+ clarify error-returns from newwin (report by Ruslan Nabioullin).
+
+20140222
+	+ fix some compiler warnings in win_driver.c
+	+ updated notes for wsvt25 based on tack and vttest -TD
+	+ add teken entry to show actual properties of FreeBSD's "xterm"
+	  console -TD
+
+20140215
+	+ in-progress changes to win_driver.c to implement output without
+	  allocating a console-buffer.  This uses a pre-existing environment
+	  variable NCGDB used by Juergen Pfeifer for debugging (prompted by
+	  discussion with Erwin Waterlander regarding Console2, which hangs
+	  when reading in an allocated console-buffer).
+	+ add -t option to gdc.c, and modify to accept "S" to step through the
+	  scrolling-stages.
+	+ regenerate NCURSES-Programming-HOWTO.html to fix some of the broken
+	  html emitted by docbook.
+
+20140209
+	+ modify CF_XOPEN_SOURCE macro to omit followup check to determine if
+	  _XOPEN_SOURCE can/should be defined.  g++ 4.7.2 built on Solaris 10
+	  has some header breakage due to its own predefinition of this symbol
+	  (report by Jean-Pierre Flori, Sage #15796).
+
+20140201
+	+ add/use symbol NCURSES_PAIRS_T like NCURSES_COLOR_T, to illustrate
+	  which "short" types are for color pairs and which are color values.
+	+ fix build for s390x, by correcting field bit offsets in generated
+	  representation clauses when int=32 long=64 and endian=big, or at
+	  least on s390x (patch by Nicolas Boulenguez).
+	+ minor cleanup change to test/form_driver_w.c (patch by Gaute Hope).
+
+20140125
+	+ remove unnecessary ifdef's in Ada95/gen/gen.c, which reportedly do
+	  not work as is with gcc 4.8 due to fixes using chtype cast made for
+	  new compiler warnings by gcc 4.8 in 20130824 (Debian #735753, patch
+	  by Nicolas Boulenguez).
+
+20140118
+	+ apply includesubdir variable which was introduced in 20130805 to
+	  gen-pkgconfig.in (Debian #735782).
+
+20131221
+	+ further improved man2html, used this to fix broken links in html
+	  manpages.  See
+	  ftp://ftp.invisible-island.net/ncurses/patches/man2html
+
+20131214
+	+ modify configure-script/ifdef's to allow OLD_TTY feature to be
+	  suppressed if the type of ospeed is configured using the option
+	  --with-ospeed to not be a short.  By default, it is a short for
+	  termcap-compatibility (adapted from suggestion by Christian
+	  Weisgerber).
+	+ correct a typo in _nc_baudrate() (patch by Christian Weisgerber,
+	  cf: 20061230).
+	+ fix a few -Wlogical-op warnings.
+	+ updated llib-l* files.
+
+20131207
+	+ add form_driver_w() entrypoint to wide-character forms library, as
+	  well as test program form_driver_w (adapted from patch by Gaute
+	  Hope).
+
+20131123
+	+ minor fix for CF_GCC_WARNINGS to special-case options which are not
+	  recognized by clang.
+
+20131116
+	+ add special case to configure script to move _XOPEN_SOURCE_EXTENDED
+	  definition from CPPFLAGS to CFLAGS if it happens to be needed for
+	  Solaris, because g++ errors with that definition (report by
+	  Jean-Pierre Flori, Sage #15268).
+	+ correct logic in infocmp's -i option which was intended to ignore
+	  strings which correspond to function-keys as candidates for piecing
+	  together initialization- or reset-strings.  The problem dates to
+	  1.9.7a, but was overlooked until changes in -Wlogical-op warnings for
+	  gcc 4.8 (report by David Binderman).
+	+ updated CF_GCC_WARNINGS to documented options for gcc 4.9.0, moving
+	  checks for -Wextra and -Wdeclaration-after-statement into the macro,
+	  and adding checks for -Wignored-qualifiers, -Wlogical-op and
+	  -Wvarargs
+	+ updated CF_CURSES_UNCTRL_H and CF_SHARED_OPTS macros from ongoing
+	  work on cdk.
+	+ update config.sub from
+		http://git.savannah.gnu.org/cgit/config.git
+
+20131110
+	+ minor cleanup of terminfo.tail
+
+20131102
+	+ use TS extension to describe xterm's title-escapes -TD
+	+ modify terminator and nsterm-s to use xterm+sl-twm building block -TD
+	+ update hurd.ti, add xenl to reflect 2011-03-06 change in
+	  http://git.savannah.gnu.org/cgit/hurd/hurd.git/log/console/display.c
+	  (Debian #727119).
+	+ simplify pfkey expression in ansi.sys -TD
+
+20131027
+	+ correct/simplify ifdef's for cur_term versus broken-linker and
+	  reentrant options (report by Jean-Pierre Flori, cf: 20090530).
+	+ modify release/version combinations in test build-scripts to make
+	  them more consistent with other packages.
+
+20131019
+	+ add nc_mingw.h to installed headers for MinGW port; needed for
+	  compiling ncurses-examples.
+	+ add rpm-script for testing cross-compile of ncurses-examples.
+
+20131014
+	+ fix new typo in CF_ADA_INCLUDE_DIRS macro (report by Roumen Petrov).
+
+20131012
+	+ fix a few compiler warnings in progs and test.
+	+ minor fix to package/debian-mingw/rules, do not strip dll's.
+	+ minor fixes to configure script for empty $prefix, e.g., when doing
+	  cross-compiles to MinGW.
+	+ add script for building test-packages of binaries cross-compiled to
+	  MinGW using NSIS.
+
+20131005
+	+ minor fixes for ncurses-example package and makefile.
+	+ add scripts for test-builds of cross-compiler packages for ncurses6
+	  to MinGW.
+
+20130928
+	+ some build-fixes for ncurses-examples with NetBSD-6.0 curses, though
+	  it lacks some common functions such as use_env() which is not yet
+	  addressed.
+	+ build-fix and some compiler warning fixes for ncurses-examples with
+	  OpenBSD 5.3
+	+ fix a possible null-pointer reference in a trace message from newterm.
+	+ quiet a few warnings from NetBSD 6.0 namespace pollution by
+	  nonstandard popcount() function in standard strings.h header.
+	+ ignore g++ 4.2.1 warnings for "-Weffc++" in c++/cursesmain.cc
+	+ fix a few overlooked places for --enable-string-hacks option.
+
+20130921
+	+ fix typo in curs_attr.3x (patch by Sven Joachim, cf: 20130831).
+	+ build-fix for --with-shared option for DragonFly and FreeBSD (report
+	  by Rong-En Fan, cf: 20130727).
+
+20130907
+	+ build-fixes for MSYS for two test-programs (patches by Ray Donnelly,
+	  Alexey Pavlov).
+	+ revert change to two of the dpkg format files, to work with dpkg
+	  before/after Debian #700177.
+	+ fix gcc -Wconversion warning in wattr_get() macro.
+	+ add msys and msysdll to known host/configuration types (patch by
+	  Alexey Pavlov).
+	+ modify CF_RPATH_HACK configure macro to not rely upon "-u" option
+	  of sort, improving portability.
+	+ minor improvements for test-programs from reviewing Solaris port.
+	+ update config.guess, config.sub from
+		http://git.savannah.gnu.org/cgit/config.git
+
+20130831
+	+ modify test/ncurses.c b/B tests to display lines only for the
+	  attributes which a given terminal supports, to make room for an
+	  italics test.
+	+ completed ncv table in terminfo.tail; it did not list the wide
+	  character codes listed in X/Open Curses issue 7.
+	+ add A_ITALIC extension (prompted by discussion with Egmont Koblinger).
+
+20130824
+	+ fix some gcc 4.8 -Wconversion warnings.
+	+ change format of dpkg test-scripts to quilted to work around bug
+	  introduced by Debian #700177.
+	+ discard cached keyname() values if meta() is changed after a value
+	  was cached using (report by Kurban Mallachiev).
+
+20130816
+	+ add checks in tic to warn about terminals which lack cursor
+	  addressing, capabilities or having those, are marked as hard_copy or
+	  generic_type.
+	+ use --without-progs in mingw-ncurses rpm.
+	+ split out _nc_init_termtype() from alloc_entry.c to use in MinGW
+	  port when tic and other programs are not needed.
+
+20130805
+	+ minor fixes to the --disable-overwrite logic, to ensure that the
+	  configured $(includedir) is not cancelled by the mingwxx-filesystem
+	  rpm macros.
+	+ add --disable-db-install configure option, to simplify building
+	  cross-compile support packages.
+	+ add mingw-ncurses.spec file, for testing cross-compiles.
+
+20130727
+	+ improve configure macros from ongoing work on cdk, dialog, xterm:
+	  + CF_ADD_LIB_AFTER - fix a problem with -Wl options
+	  + CF_RPATH_HACK - add missing result-message
+	  + CF_SHARED_OPTS - modify to use $rel_builddir in cygwin and mingw
+	    dll symbols (which can be overridden) rather than explicit "../".
+	  + CF_SHARED_OPTS - modify NetBSD and DragonFly symbols to use ${CC}
+	    rather than ${LD} to improve rpath support.
+	  + CF_SHARED_OPTS - add a symbol to denote the temporary files that
+	    are created by the macro, to simplify clean-rules.
+	  + CF_X_ATHENA - trim extra libraries to work with -Wl,--as-needed
+	+ fix a regression in hashed-database support for NetBSD, which uses
+	  the key-size differently from other implementations (cf: 20121229).
+
+20130720
+	+ further improvements for setupterm manpage, clarifying the
+	  initialization of cur_term.
+
+20130713
+	+ improve manpages for initscr and setupterm.
+	+ minor compiler-warning fixes
+
+20130706
+	+ add fallback defs for <inttypes.h> and <stdint.h> (cf: 20120225).
+	+ add check for size of wchar_t, use that to suppress a chunk of
+	  wcwidth.h in MinGW port.
+	+ quiet linker warnings for MinGW cross-compile with dll's using the
+	  --enable-auto-import flag.
+	+ add ncurses.map rule to ncurses/Makefile to help diagnose symbol
+	  table issues.
+
+20130622
+	+ modify the clear program to take into account the E3 extended
+	  capability to clear the terminal's scrollback buffer (patch by
+	  Miroslav Lichvar, Redhat #815790).
+	+ clarify in resizeterm manpage that LINES and COLS are updated.
+	+ updated ansi example in terminfo.tail, correct misordered example
+	  of sgr.
+	+ fix other doclifter warnings for manpages
+	+ remove unnecessary ".ta" in terminfo.tail, add missing ".fi"
+	  (patch by Eric Raymond).
+
+20130615
+	+ minor changes to some configure macros to make them more reusable.
+	+ fixes for tabs program (prompted by report by Nick Andrik).
+	  + corrected logic in command-line parsing of -a and -c predefined
+	    tab-lists options.
+	  + allow "-0" and "-8" options to be combined with others, e.g.,"-0d".
+	  + make warning messages more consistent with the other utilities by
+	    not printing the full pathname of the program.
+	  + add -V option for consistency with other utilities.
+	+ fix off-by-one in columns for tabs program when processing an option
+	  such as "-5" (patch by Nick Andrik).
+
+20130608
+	+ add to test/demo_forms.c examples of using the menu-hooks as well
+	  as showing how the menu item user-data can be used to pass a callback
+	  function pointer.
+	+ add test/dots_termcap.c
+	+ remove setupterm call from test/demo_termcap.c
+	+ build-fix if --disable-ext-funcs configure option is used.
+	+ modified test/edit_field.c and test/demo_forms.c to move the lengths
+	  into a user-data structure, keeping the original string for later
+	  expansion to free-format input/out demo.
+	+ modified test/demo_forms.c to load data from file.
+	+ added note to clarify Terminal.app's non-emulation of the various
+	  terminal types listed in the preferences dialog -TD
+	+ fix regression in error-reporting in lib_setup.c (Debian #711134,
+	  cf: 20121117).
+	+ build-fix for a case where --enable-broken_linker and
+	  --enable-reentrant options are combined (report by George R Goffe).
+
+20130525
+	+ modify mvcur() to distinguish between internal use by the ncurses
+	  library, and external callers, preventing it from reading the content
+	  of the screen which is only nonblank when curses calls have updated
+	  it.  This makes test/dots_mvcur.c avoid painting colored cells in
+	  the left margin of the display.
+	+ minor fix to test/dots_mvcur.c
+	+ move configured symbols USE_DATABASE and USE_TERMCAP to term.h as
+	  NCURSES_USE_DATABASE and NCURSES_USE_TERMCAP to allow consistent
+	  use of these symbols in term_entry.h
+
+20130518
+	+ corrected ifdefs in test/testcurs.c to allow comparison of mouse
+	  interface versus pdcurses (cf: 20130316).
+	+ add pow() to configure-check for math library, needed since
+	  20121208 for test/hanoi (Debian #708056).
+	+ regenerated html manpages.
+	+ update doctype used for html documentation.
+
+20130511
+	+ move nsterm-related entries out of "obsolete" section to more
+	  plausible "ansi consoles" -TD
+	+ additional cleanup of table-of-contents by reordering -TD
+	+ revise fix for check for 8-bit value in _nc_insert_ch(); prior fix
+	  prevented inserts when video attributes were attached to the data
+	  (cf: 20121215) (Redhat #959534).
+
+20130504
+	+ fixes for issues found by Coverity:
+	  + correct FNKEY() macro in progs/dump_entry.c, allowing kf11-kf63 to
+	    display when infocmp's -R option is used for HP or AIX subsets.
+	  + fix dead-code issue with test/movewindow.c
+	  + improve limited-checking in _nc_read_termtype().
+
+20130427
+	+ fix clang 3.2 warning in progs/dump_entry.c
+	+ drop AC_TYPE_SIGNAL check; ncurses relies on c89 and later.
+
+20130413
+	+ add MinGW to cases where ncurses installs by default into /usr
+	  (prompted by discussion with Daniel Silva Ferreira).
+	+ add -D option to infocmp's usage-message (patch by Miroslav Lichvar).
+	+ add a missing 'int' type for main function in configure check for
+	  type of bool variable, to work with clang 3.2 (report by Dmitri
+	  Gribenko).
+	+ improve configure check for static_cast, to work with clang 3.2
+	  (report by Dmitri Gribenko).
+	+ re-order rule for demo.o and macros defining header dependencies in
+	  c++/Makefile.in to accommodate gmake (report by Dmitri Gribenko).
+
+20130406
+	+ improve parameter checking in copywin().
+	+ modify configure script to work around OS X's "libtool" program, to
+	  choose glibtool instead.  At the same time, chance the autoconf macro
+	  to look for a "tool" rather than a "prog", to help with potential use
+	  in cross-compiling.
+	+ separate the rpath usage for c++ library from demo program
+	  (Redhat #911540)
+	+ update/correct header-dependencies in c++ makefile (report by Werner
+	  Fink).
+	+ add --with-cxx-shared to dpkg-script, as done for rpm-script.
+
+20130324
+	+ build-fix for libtool configuration (reports by Daniel Silva Ferreira
+	  and Roumen Petrov).
+
+20130323
+	+ build-fix for OS X, to handle changes for --with-cxx-shared feature
+	  (report by Christian Ebert).
+	+ change initialization for vt220, similar entries for consistency
+	  with cursor-key strings (NetBSD #47674) -TD
+	+ further improvements to linux-16color (Benjamin Sittler)
+
+20130316
+	+ additional fix for tic.c, to allocate missing buffer space.
+	+ eliminate configure-script warnings for gen-pkgconfig.in
+	+ correct typo in sgr string for sun-color,
+	  add bold for consistency with sgr,
+	  change smso for consistency with sgr -TD
+	+ correct typo in sgr string for terminator -TD
+	+ add blink to the attributes masked by ncv in linux-16color (report
+	  by Benjamin Sittler)
+	+ improve warning message from post-load checking for missing "%?"
+	  operator by tic/infocmp by showing the entry name and capability.
+	+ minor formatting improvement to tic/infocmp -f option to ensure
+	  line split after "%;".
+	+ amend scripting for --with-cxx-shared option to handle the debug
+	  library "libncurses++_g.a" (report by Sven Joachim).
+
+20130309
+	+ amend change to toe.c for reading from /dev/zero, to ensure that
+	  there is a buffer for the temporary filename (cf: 20120324).
+	+ regenerated html manpages.
+	+ fix typo in terminfo.head (report by Sven Joachim, cf: 20130302).
+	+ updated some autoconf macros:
+	  + CF_ACVERSION_CHECK, from byacc 1.9 20130304
+	  + CF_INTEL_COMPILER, CF_XOPEN_SOURCE from luit 2.0-20130217
+	+ add configure option --with-cxx-shared to permit building
+	  libncurses++ as a shared library when using g++, e.g., the same
+	  limitations as libtool but better integrated with the usual build
+	  configuration (Redhat #911540).
+	+ modify MKkey_defs.sh to filter out build-path which was unnecessarily
+	  shown in curses.h (Debian #689131).
+
+20130302
+	+ add section to terminfo manpage discussing user-defined capabilities.
+	+ update manpage description of NCURSES_NO_SETBUF, explaining why it
+	  is obsolete.
+	+ add a check in waddch_nosync() to ensure that tab characters are
+	  treated as control characters; some broken locales claim they are
+	  printable.
+	+ add some traces to the Windows console driver.
+	+ initialize a temporary array in _nc_mbtowc, needed for some cases
+	  of raw input in MinGW port.
+
+20130218
+	+ correct ifdef on change to lib_twait.c (report by  Werner Fink).
+	+ update config.guess, config.sub
+
+20130216
+	+ modify test/testcurs.c to work with mouse for ncurses as it does for
+	  pdcurses.
+	+ modify test/knight.c to work with mouse for pdcurses as it does for
+	  ncurses.
+	+ modify internal recursion in wgetch() which handles cooked mode to
+	  check if the call to wgetnstr() returned an error.  This can happen
+	  when both nocbreak() and nodelay() are set, for instance (report by
+	  Nils Christopher Brause) (cf: 960418).
+	+ fixes for issues found by Coverity:
+	  + add a check for valid position in ClearToEOS()
+	  + fix in lib_twait.c when --enable-wgetch-events is used, pointer
+	    use after free.
+	  + improve a limit-check in make_hash.c
+	  + fix a memory leak in hashed_db.c
+
+20130209
+	+ modify test/configure script to make it simpler to override names
+	  of curses-related libraries, to help with linking with pdcurses in
+	  MinGW environment.
+	+ if the --with-terminfo-dirs configure option is not used, there is
+	  no corresponding compiled-in value for that.  Fill in "no default
+	  value" for that part of the manpage substitution.
+
+20130202
+	+ correct initialization in knight.c which let it occasionally make
+	  an incorrect move (cf: 20001028).
+	+ improve documentation of the terminfo/termcap search path.
+
+20130126
+	+ further fixes to mvcur to pass callback function (cf: 20130112),
+	  needed to make test/dots_mvcur work.
+	+ reduce calls to SetConsoleActiveScreenBuffer in win_driver.c, to
+	  help reduce flicker.
+	+ modify configure script to omit "+b" from linker options for very
+	  old HP-UX systems (report by Dennis Grevenstein)
+	+ add HP-UX workaround for missing EILSEQ on old HP-UX systems (patch
+	  by Dennis Grevenstein).
+	+ restore memmove/strdup support for antique systems (request by
+	  Dennis Grevenstein).
+	+ change %l behavior in tparm to push the string length onto the stack
+	  rather than saving the formatted length into the output buffer
+	  (report by Roy Marples, cf: 980620).
+
+20130119
+	+ fixes for issues found by Coverity:
+	  + fix memory leak in safe_sprintf.c
+	  + add check for return-value in tty_update.c
+	  + correct initialization for -s option in test/view.c
+	  + add check for numeric overflow in lib_instr.c
+	  + improve error-checking in copywin
+	+ add advice in infocmp manpage for termcap users (Debian #698469).
+	+ add "-y" option to test/demo_termcap and test/demo_terminfo to
+	  demonstrate behavior with/without extended capabilities.
+	+ updated termcap manpage to document legacy termcap behavior for
+	  matching capability names.
+	+ modify name-comparison for tgetstr, etc., to accommodate legacy
+	  applications as well as to improve compatibility with BSD 4.2
+	  termcap implementations (Debian #698299) (cf: 980725).
+
+20130112
+	+ correct prototype in manpage for vid_puts.
+	+ drop ncurses/tty/tty_display.h, ncurses/tty/tty_input.h, since they
+	  are unused in the current driver model.
+	+ modify mvcur to use stdout except when called within the ncurses
+	  library.
+	+ modify vidattr and vid_attr to use stdout as documented in manpage.
+	+ amend changes made to buffering in 20120825 so that the low-level
+	  putp() call uses stdout rather than ncurses' internal buffering.
+	  The putp_sp() call does the same, for consistency (Redhat #892674).
+
+20130105
+	+ add "-s" option to test/view.c to allow it to start in single-step
+	  mode, reducing size of trace files when it is used for debugging
+	  MinGW changes.
+	+ revert part of 20121222 change to tinfo_driver.c
+	+ add experimental logic in win_driver.c to improve optimization of
+	  screen updates.  This does not yet work with double-width characters,
+	  so it is ifdef'd out for the moment (prompted by report by Erwin
+	  Waterlander regarding screen flicker).
+
+20121229
+	+ fix Coverity warnings regarding copying into fixed-size buffers.
+	+ add throw-declarations in the c++ binding per Coverity warning.
+	+ minor changes to new-items for consistent reference to bug-report
+	  numbers.
+
+20121222
+	+ add *.dSYM directories to clean-rule in ncurses directory makefile,
+	  for Mac OS builds.
+	+ add a configure check for gcc option -no-cpp-precomp, which is not
+	  available in all Mac OS X configurations (report by Andras Salamon,
+	  cf: 20011208).
+	+ improve 20021221 workaround for broken acs, handling a case where
+	  that ACS_xxx character is not in the acsc string but there is a known
+	  wide-character which can be used.
+
+20121215
+	+ fix several warnings from clang 3.1 --analyze, includes correcting
+	  a null-pointer check in _nc_mvcur_resume.
+	+ correct display of double-width characters with MinGW port (report
+	  by Erwin Waterlander).
+	+ replace MinGW's wcrtomb(), fixing a problem with _nc_viscbuf
+	> fixes based on Coverity report:
+	+ correct coloring in test/bs.c
+	+ correct check for 8-bit value in _nc_insert_ch().
+	+ remove dead code in progs/tset.c, test/linedata.h
+	+ add null-pointer checks in lib_tracemse.c, panel.priv.h, and some
+	  test-programs.
+
+20121208
+	+ modify test/knight.c to show the number of choices possible for
+	  each position in automove option, e.g., to allow user to follow
+	  Warnsdorff's rule to solve the puzzle.
+	+ modify test/hanoi.c to show the minimum number of moves possible for
+	  the given number of tiles (prompted by patch by Lucas Gioia).
+	> fixes based on Coverity report:
+	+ remove a few redundant checks.
+	+ correct logic in test/bs.c, when randomly placing a specific type of
+	  ship.
+	+ check return value from remove/unlink in tic.
+	+ check return value from sscanf in test/ncurses.c
+	+ fix a null dereference in c++/cursesw.cc
+	+ fix two instances of uninitialized variables when configuring for the
+	  terminal driver.
+	+ correct scope of variable used in SetSafeOutcWrapper macro.
+	+ set umask when calling mkstemp in tic.
+	+ initialize wbkgrndset() temporary variable when extended-colors are
+	  used.
+
+20121201
+	+ also replace MinGW's wctomb(), fixing a problem with setcchar().
+	+ modify test/view.c to load UTF-8 when built with MinGW by using
+	  regular win32 API because the MinGW functions mblen() and mbtowc()
+	  do not work.
+
+20121124
+	+ correct order of color initialization versus display in some of the
+	  test-programs, e.g., test_addstr.c
+	> fixes based on Coverity report:
+	+ delete windows on exit from some of the test-programs.
+
+20121117
+	> fixes based on Coverity report:
+	+ add missing braces around FreeAndNull in two places.
+	+ various fixes in test/ncurses.c
+	+ improve limit-checks in tinfo/make_hash.c, tinfo/read_entry.c
+	+ correct malloc size in progs/infocmp.c
+	+ guard against negative array indices in test/knight.c
+	+ fix off-by-one limit check in test/color_name.h
+	+ add null-pointer check in progs/tabs.c, test/bs.c, test/demo_forms.c,
+	  test/inchs.c
+	+ fix memory-leak in tinfo/lib_setup.c, progs/toe.c,
+	  test/clip_printw.c, test/demo_menus.c
+	+ delete unused windows in test/chgat.c, test/clip_printw.c,
+	  test/insdelln.c, test/newdemo.c on error-return.
+
+20121110
+	+ modify configure macro CF_INCLUDE_DIRS to put $CPPFLAGS after the
+	  local -I include options in case someone has set conflicting -I
+	  options in $CPPFLAGS (prompted by patch for ncurses/Makefile.in by
+	  Vassili Courzakis).
+	+ modify the ncurses*-config scripts to eliminate relative paths from
+	  the RPATH_LIST variable, e.g., "../lib" as used in installing shared
+	  libraries or executables.
+
+20121102
+	+ realign these related pages:
+	    curs_add_wchstr.3x
+	    curs_addchstr.3x
+	    curs_addstr.3x
+	    curs_addwstr.3x
+	  and fix a long-ago error in curs_addstr.3x which said that a -1
+	  length parameter would only write as much as fit onto one line
+	  (report by Reuben Thomas).
+	+ remove obsolete fallback _nc_memmove() for memmove()/bcopy().
+	+ remove obsolete fallback _nc_strdup() for strdup().
+	+ cancel any debug-rpm in package/ncurses.spec
+	+ reviewed vte-2012, reverted most of the change since it was incorrect
+	  based on testing with tack -TD
+	+ un-cancel the initc in vte-256color, since this was implemented
+	  starting with version 0.20 in 2009 -TD
+
+20121026
+	+ improve malloc/realloc checking (prompted by discussion in Redhat
+	  #866989).
+	+ add ncurses test-program as "ncurses6" to the rpm- and dpkg-scripts.
+	+ updated configure macros CF_GCC_VERSION and CF_WITH_PATHLIST.  The
+	  first corrects pattern used for Mac OS X's customization of gcc.
+
+20121017
+	+ fix change to _nc_scroll_optimize(), which incorrectly freed memory
+	  (Redhat #866989).
+
+20121013
+	+ add vte-2012, gnome-2012, making these the defaults for vte/gnome
+	  (patch by Christian Persch).
+
+20121006
+	+ improve CF_GCC_VERSION to work around Debian's customization of gcc
+	  --version message.
+	+ improve configure macros as done in byacc:
+	  + drop 2.13 compatibility; use 2.52.xxxx version only since EMX port
+	    has used that for a while.
+	  + add 3rd parameter to AC_DEFINE's to allow autoheader to run, i.e.,
+	    for experimental use.
+	  + remove unused configure macros.
+	+ modify configure script and makefiles to quiet new autoconf warning
+	  for LIBS_TO_MAKE variable.
+	+ modify configure script to show $PATH_SEPARATOR variable.
+	+ update config.guess, config.sub
+
+20120922
+	+ modify setupterm to set its copy of TERM to "unknown" if configured
+	  for the terminal driver and TERM was null or empty.
+	+ modify treatment of TERM variable for MinGW port to allow explicit
+	  use of the windows console driver by checking if $TERM is set to
+	  "#win32con" or an abbreviation of that.
+	+ undo recent change to fallback definition of vsscanf() to build with
+	  older Solaris compilers (cf: 20120728).
+
+20120908
+	+ add test-screens to test/ncurses to show 256-characters at a time,
+	  to help with MinGW port.
+
+20120903
+	+ simplify varargs logic in lib_printw.c; va_copy is no longer needed
+	  there.
+	+ modifications for MinGW port to make wide-character display usable.
+
+20120902
+	+ regenerate configure script (report by Sven Joachim, cf: 20120901).
+
+20120901
+	+ add a null-pointer check in _nc_flush (cf: 20120825).
+	+ fix a case in _nc_scroll_optimize() where the _oldnums_list array
+	  might not be allocated.
+	+ improve comparisons in configure.in for unset shell variables.
+
+20120826
+	+ increase size of ncurses' output-buffer, in case of very small
+	  initial screen-sizes.
+	+ fix evaluation of TERMINFO and TERMINFO_DIRS default values as needed
+	  after changes to use --datarootdir (reports by Gabriele Balducci,
+	  Roumen Petrov).
+
+20120825
+	+ change output buffering scheme, using buffer maintained by ncurses
+	  rather than stdio, to avoid problems with SIGTSTP handling (report
+	  by Brian Bloniarz).
+
+20120811
+	+ update autoconf patch to 2.52.20120811, adding --datarootdir
+	  (prompted by discussion with Erwin Waterlander).
+	+ improve description of --enable-reentrant option in README and the
+	  INSTALL file.
+	+ add nsterm-256color, make this the default nsterm -TD
+	+ remove bw from nsterm-bce, per testing with tack -TD
+
+20120804
+	+ update test/configure, adding check for tinfo library.
+	+ improve limit-checks for the getch fifo (report by Werner Fink).
+	+ fix a remaining mismatch between $with_echo and the symbols updated
+	  for CF_DISABLE_ECHO affecting parameters for mk-2nd.awk (report by
+	  Sven Joachim, cf:  20120317).
+	+ modify followup check for pkg-config's library directory in the
+	  --enable-pc-files option to validate syntax (report by Sven Joachim,
+	  cf: 20110716).
+
+20120728
+	+ correct path for ncurses_mingw.h in include/headers, in case build
+	  is done outside source-tree (patch by Roumen Petrov).
+	+ modify some older xterm entries to align with xterm source -TD
+	+ separate "xterm-old" alias from "xterm-r6" -TD
+	+ add E3 extended capability to xterm-basic and putty -TD
+	+ parenthesize parameters of other macros in curses.h -TD
+	+ parenthesize parameter of COLOR_PAIR and PAIR_NUMBER in curses.h
+	  in case it happens to be a comma-expression, etc.  (patch by Nick
+	  Black).
+
+20120721
+	+ improved form_request_by_name() and menu_request_by_name().
+	+ eliminate two fixed-size buffers in toe.c
+	+ extend use_tioctl() to have expected behavior when use_env(FALSE) and
+	  use_tioctl(TRUE) are called.
+	+ modify ncurses test-program, adding -E and -T options to demonstrate
+	  use_env() versus use_tioctl().
+
+20120714
+	+ add use_tioctl() function (adapted from patch by Werner Fink,
+	  Novell #769788):
+
+20120707
+	+ add ncurses_mingw.h to installed headers (prompted by patch by
+	  Juergen Pfeifer).
+	+ clarify return-codes from wgetch() in response to SIGWINCH (prompted
+	  by Novell #769788).
+	+ modify resizeterm() to always push a KEY_RESIZE onto the fifo, even
+	  if screensize is unchanged.  Modify _nc_update_screensize() to push a
+	  KEY_RESIZE if there was a SIGWINCH, even if it does not call
+	  resizeterm().  These changes eliminate the case where a SIGWINCH is
+	  received, but ERR returned from wgetch or wgetnstr because the screen
+	  dimensions did not change (Novell #769788).
+
+20120630
+	+ add --enable-interop to sample package scripts (suggested by Juergen
+	  Pfeifer).
+	+ update CF_PATH_SYNTAX macro, from mawk changes.
+	+ modify mk-0th.awk to allow for generating llib-ltic, etc., though
+	  some work is needed on cproto to work with lib_gen.c to update
+	  llib-lncurses.
+	+ remove redundant getenv() cal in database-iterator leftover from
+	  cleanup in 20120622 changes (report by Sven Joachim).
+
+20120622
+	+ add -d, -e and -q options to test/demo_terminfo and test/demo_termcap
+	+ fix caching of environment variables in database-iterator (patch by
+	  Philippe Troin, Redhat #831366).
+
+20120616
+	+ add configure check to distinguish clang from gcc to eliminate
+	  warnings about unused command-line parameters when compiler warnings
+	  are enabled.
+	+ improve behavior when updating terminfo entries which are hardlinked
+	  by allowing for the possibility that an alias has been repurposed to
+	  a new primary name.
+	+ fix some strict compiler warnings based on package scripts.
+	+ further fixes for configure check for working poll (Debian #676461).
+
+20120608
+	+ fix an uninitialized variable in -c/-n logic for infocmp changes
+	  (cf: 20120526).
+	+ corrected fix for building c++ binding with clang 3.0 (report/patch
+	  by Richard Yao, Gentoo #417613, cf: 20110409)
+	+ correct configure check for working poll, fixing the case where stdin
+	  is redirected, e.g., in rpm/dpkg builds (Debian #676461).
+	+ add rpm- and dpkg-scripts, to test those build-environments.
+	  The resulting packages are used only for testing.
+
+20120602
+	+ add kdch1 aka "Remove" to vt220 and vt220-8 entries -TD
+	+ add kdch1, etc., to qvt108 -TD
+	+ add dl1/il1 to some entries based on dl/il values -TD
+	+ add dl to simpleterm -TD
+	+ add consistency-checks in tic for insert-line vs delete-line
+	  controls, and insert/delete-char keys
+	+ correct no-leaks logic in infocmp when doing comparisons, fixing
+	  duplicate free of entries given via the command-line, and freeing
+	  entries loaded from the last-but-one of files specified on the
+	  command-line.
+	+ add kdch1 to wsvt25 entry from NetBSD CVS (reported by David Lord,
+	  analysis by Martin Husemann).
+	+ add cnorm/civis to wsvt25 entry from NetBSD CVS (report/analysis by
+	  Onno van der Linden).
+
+20120526
+	+ extend -c and -n options of infocmp to allow comparing more than two
+	  entries.
+	+ correct check in infocmp for number of terminal names when more than
+	  two are given.
+	+ correct typo in curs_threads.3x (report by Yanhui Shen on
+	  freebsd-hackers mailing list).
+
+20120512
+	+ corrected 'op' for bterm (report by Samuel Thibault) -TD
+	+ modify test/background.c to demonstrate a background character
+	  holding a colored ACS_HLINE.  The behavior differs from SVr4 due to
+	  the thick- and double-line extension (cf: 20091003).
+	+ modify handling of acs characters in PutAttrChar to avoid mapping an
+	  unmapped character to a space with A_ALTCHARSET set.
+	+ rewrite vt520 entry based on vt420 -TD
+
+20120505
+	+ remove p6 (bold) from opus3n1+ for consistency -TD
+	+ remove acs stuff from env230 per clues in Ingres termcap -TD
+	+ modify env230 sgr/sgr0 to match other capabilities -TD
+	+ modify smacs/rmacs in bq300-8 to match sgr/sgr0 -TD
+	+ make sgr for dku7202 agree with other caps -TD
+	+ make sgr for ibmpc agree with other caps -TD
+	+ make sgr for tek4107 agree with other caps -TD
+	+ make sgr for ndr9500 agree with other caps -TD
+	+ make sgr for sco-ansi agree with other caps -TD
+	+ make sgr for d410 agree with other caps -TD
+	+ make sgr for d210 agree with other caps -TD
+	+ make sgr for d470c, d470c-7b agree with other caps -TD
+	+ remove redundant AC_DEFINE for NDEBUG versus Makefile definition.
+	+ fix a back-link in _nc_delink_entry(), which is needed if ncurses is
+	  configured with --enable-termcap and --disable-getcap.
+
+20120428
+	+ fix some inconsistencies between vt320/vt420, e.g., cnorm/civis -TD
+	+ add eslok flag to dec+sl -TD
+	+ dec+sl applies to vt320 and up -TD
+	+ drop wsl width from xterm+sl -TD
+	+ reuse xterm+sl in putty and nsca-m -TD
+	+ add ansi+tabs to vt520 -TD
+	+ add ansi+enq to vt220-vt520 -TD
+	+ fix a compiler warning in example in ncurses-intro.doc (Paul Waring).
+	+ added paragraph in keyname manpage telling how extended capabilities
+	  are interpreted as key definitions.
+	+ modify tic's check of conflicting key definitions to include extended
+	  capability strings in addition to the existing check on predefined
+	  keys.
+
+20120421
+	+ improve cleanup of temporary files in tic using atexit().
+	+ add msgr to vt420, similar DEC vtXXX entries -TD
+	+ add several missing vt420 capabilities from vt220 -TD
+	+ factor out ansi+pp from several entries -TD
+	+ change xterm+sl and xterm+sl-twm to include only the status-line
+	  capabilities and not "use=xterm", making them more generally useful
+	  as building-blocks -TD
+	+ add dec+sl building block, as example -TD
+
+20120414
+	+ add XT to some terminfo entries to improve usefulness for other
+	  applications than screen, which would like to pretend that xterm's
+	  title is a status-line.  -TD
+	+ change use-clauses in ansi-mtabs, hp2626, and hp2622 based on review
+	  of ordering and overrides -TD
+	+ add consistency check in tic for screen's "XT" capability.
+	+ add section in terminfo.src summarizing the user-defined capabilities
+	  used in that file -TD
+
+20120407
+	+ fix an inconsistency between tic/infocmp "-x" option; tic omits all
+	  non-standard capabilities, while infocmp was ignoring only the user
+	  definable capabilities.
+	+ improve special case in tic parsing of description to allow it to be
+	  followed by terminfo capabilities.  Previously the description had to
+	  be the last field on an input line to allow tic to distinguish
+	  between termcap and terminfo format while still allowing commas to be
+	  embedded in the description.
+	+ correct variable name in gen_edit.sh which broke configurability of
+	  the --with-xterm-kbs option.
+	+ revert 2011-07-16 change to "linux" alias, return to "linux2.2" -TD
+	+ further amend 20110910 change, providing for configure-script
+	  override of the "linux" terminfo entry to install and changing the
+	  default for that to "linux2.2" (Debian #665959).
+
+20120331
+	+ update Ada95/configure to use CF_DISABLE_ECHO (cf: 20120317).
+	+ correct order of use-clauses in st-256color -TD
+	+ modify configure script to look for gnatgcc if the Ada95 binding
+	  is built, in preference to the default gcc/cc (suggested by
+	  Nicolas Boulenguez).
+	+ modify configure script to ensure that the same -On option used for
+	  the C compiler in CFLAGS is used for ADAFLAGS rather than simply
+	  using "-O3" (suggested by Nicolas Boulenguez)
+
+20120324
+	+ amend an old fix so that next_char() exits properly for empty files,
+	  e.g., from reading /dev/null (cf: 20080804).
+	+ modify tic so that it can read from the standard input, or from
+	  a character device.  Because tic uses seek's, this requires writing
+	  the data to a temporary file first (prompted by remark by Sven
+	  Joachim) (cf: 20000923).
+
+20120317
+	+ correct a check made in lib_napms.c, so that terminfo applications
+	  can again use napms() (cf: 20110604).
+	+ add a note in tic.h regarding required casts for ABSENT_BOOLEAN
+	  (cf: 20040327).
+	+ correct scripting for --disable-echo option in test/configure.
+	+ amend check for missing c++ compiler to work when no error is
+	  reported, and no variables set (cf: 20021206).
+	+ add/use configure macro CF_DISABLE_ECHO.
+
+20120310
+	+ fix some strict compiler warnings for abi6 and 64-bits.
+	+ use begin_va_copy/end_va_copy macros in lib_printw.c (cf: 20120303).
+	+ improve a limit-check in infocmp.c (Werner Fink):
+
+20120303
+	+ minor tidying of terminfo.tail, clarify reason for limitation
+	  regarding mapping of \0 to \200
+	+ minor improvement to _nc_copy_termtype(), using memcpy to replace
+	  loops.
+	+ fix no-leaks checking in test/demo_termcap.c to account for multiple
+	  calls to setupterm().
+	+ modified the libgpm change to show previous load as a problem in the
+	  debug-trace.
+	> merge some patches from OpenSUSE rpm (Werner Fink):
+	+ ncurses-5.7-printw.dif, fixes for varargs handling in lib_printw.c
+	+ ncurses-5.7-gpm.dif, do not dlopen libgpm if already loaded by
+	  runtime linker
+	+ ncurses-5.6-fallback.dif, do not free arrays and strings from static
+	  fallback entries
+
+20120228
+	+ fix breakage in tic/infocmp from 20120225 (report by Werner Fink).
+
+20120225
+	+ modify configure script to allow creating dll's for MinGW when
+	  cross-compiling.
+	+ add --enable-string-hacks option to control whether strlcat and
+	  strlcpy may be used.  The same issue applies to OpenBSD's warnings
+	  about snprintf, noting that this function is weakly standardized.
+	+ add configure checks for strlcat, strlcpy and snprintf, to help
+	  reduce bogus warnings with OpenBSD builds.
+	+ build-fix for OpenBSD 4.9 to supply consistent intptr_t declaration
+	  (cf:20111231)
+	+ update config.guess, config.sub
+
+20120218
+	+ correct CF_ETIP_DEFINES configure macro, making it exit properly on
+	  the first success (patch by Pierre Labastie).
+	+ improve configure macro CF_MKSTEMP by moving existence-check for
+	  mkstemp out of the AC_TRY_RUN, to help with cross-compiles.
+	+ improve configure macro CF_FUNC_POLL from luit changes to detect
+	  broken implementations, e.g., with Mac OS X.
+	+ add configure option --with-tparm-arg
+	+ build-fix for MinGW cross-compiling, so that make_hash does not
+	  depend on TTY definition (cf: 20111008).
+
+20120211
+	+ make sgr for xterm-pcolor agree with other caps -TD
+	+ make sgr for att5425 agree with other caps -TD
+	+ make sgr for att630 agree with other caps -TD
+	+ make sgr for linux entries agree with other caps -TD
+	+ make sgr for tvi9065 agree with other caps -TD
+	+ make sgr for ncr260vt200an agree with other caps -TD
+	+ make sgr for ncr160vt100pp agree with other caps -TD
+	+ make sgr for ncr260vt300an agree with other caps -TD
+	+ make sgr for aaa-60-dec-rv, aaa+dec agree with other caps -TD
+	+ make sgr for cygwin, cygwinDBG agree with other caps -TD
+	+ add configure option --with-xterm-kbs to simplify configuration for
+	  Linux versus most other systems.
+
+20120204
+	+ improved tic -D option, avoid making target directory and provide
+	  better diagnostics.
+
+20120128
+	+ add mach-gnu (Debian #614316, patch by Samuel Thibault)
+	+ add mach-gnu-color, tweaks to mach-gnu terminfo -TD
+	+ make sgr for sun-color agree with smso -TD
+	+ make sgr for prism9 agree with other caps -TD
+	+ make sgr for icl6404 agree with other caps -TD
+	+ make sgr for ofcons agree with other caps -TD
+	+ make sgr for att5410v1, att4415, att620 agree with other caps -TD
+	+ make sgr for aaa-unk, aaa-rv agree with other caps -TD
+	+ make sgr for avt-ns agree with other caps -TD
+	+ amend fix intended to separate fixups for acsc to allow "tic -cv" to
+	  give verbose warnings (cf:  20110730).
+	+ modify misc/gen-edit.sh to make the location of the tabset directory
+	  consistent with misc/Makefile.in, i.e., using ${datadir}/tabset
+	  (Debian #653435, patch by Sven Joachim).
+
+20120121
+	+ add --with-lib-prefix option to allow configuring for old/new flavors
+	  of OS/2 EMX.
+	+ modify check for gnat version to allow for year, as used in FreeBSD
+	  port.
+	+ modify check_existence() in db_iterator.c to simply check if the
+	  path is a directory or file, according to the need.  Checking for
+	  directory size also gives no usable result with OS/2 (cf: 20120107).
+	+ support OS/2 kLIBC (patch by KO Myung-Hun).
+
+20120114
+	+ several improvements to test/movewindow.c (prompted by discussion on
+	  Linux Mint forum):
+	  + modify movement commands to make them continuous
+	  + rewrote the test for mvderwin
+	  + rewrote the test for recursive mvwin
+	+ split-out reusable CF_WITH_NCURSES_ETC macro in test/configure.in
+	+ updated configure macro CF_XOPEN_SOURCE, build-fixes for Mac OS X
+	  and OpenBSD.
+	+ regenerated html manpages.
+
+20120107
+	+ various improvements for MinGW (Juergen Pfeifer):
+	  + modify stat() calls to ignore the st_size member
+	  + drop mk-dlls.sh script.
+	  + change recommended regular expression library.
+	  + modify rain.c to allow for threaded configuration.
+	  + modify tset.c to allow for case when size-change logic is not used.
+
+20111231
+	+ modify toe's report when -a and -s options are combined, to add
+	  a column showing which entries belong to a given database.
+	+ add -s option to toe, to sort its output.
+	+ modify progs/toe.c, simplifying use of db-iterator results to use
+	  caching improvements from 20111001 and 20111126.
+	+ correct generation of pc-files when ticlib or termlib options are
+	  given to rename the corresponding tic- or tinfo-libraries (report
+	  by Sven Joachim).
+
+20111224
+	+ document a portability issue with tput, i.e., that scripts which work
+	  with ncurses may fail in other implementations that do no parameter
+	  analysis.
+	+ add putty-sco entry -TD
+
+20111217
+	+ review/fix places in manpages where --program-prefix configure option
+	  was not being used.
+	+ add -D option to infocmp, to show the database locations that it
+	  could use.
+	+ fix build for the special case where term-driver, ticlib and termlib
+	  are all enabled.  The terminal driver depends on a few features in
+	  the base ncurses library, so tic's dependencies include both ncurses
+	  and termlib.
+	+ fix build work for term-driver when --enable-wgetch-events option is
+	  enabled.
+	+ use <stdint.h> types to fix some questionable casts to void*.
+
+20111210
+	+ modify configure script to check if thread library provides
+	  pthread_mutexattr_settype(), e.g., not provided by Solaris 2.6
+	+ modify configure script to suppress check to define _XOPEN_SOURCE
+	  for IRIX64, since its header files have a conflict versus
+	  _SGI_SOURCE.
+	+ modify configure script to add ".pc" files for tic- and
+	  tinfo-libraries, which were omitted in recent change (cf: 20111126).
+	+ fix inconsistent checks on $PKG_CONFIG variable in configure script.
+
+20111203
+	+ modify configure-check for etip.h dependencies, supplying a temporary
+	  copy of ncurses_dll.h since it is a generated file (prompted by
+	  Debian #646977).
+	+ modify CF_CPP_PARAM_INIT "main" function to work with current C++.
+
+20111126
+	+ correct database iterator's check for duplicate entries
+	  (cf: 20111001).
+	+ modify database iterator to ignore $TERMCAP when it is not an
+	  absolute pathname.
+	+ add -D option to tic, to show the database locations that it could
+	  use.
+	+ improve description of database locations in tic manpage.
+	+ modify the configure script to generate a list of the ".pc" files to
+	  generate, rather than deriving the list from the libraries which have
+	  been built (patch by Mike Frysinger).
+	+ use AC_CHECK_TOOLS in preference to AC_PATH_PROGS when searching for
+	  ncurses*-config, e.g., in Ada95/configure and test/configure (adapted
+	  from patch by Mike Frysinger).
+
+20111119
+	+ remove obsolete/conflicting fallback definition for _POSIX_SOURCE
+	  from curses.priv.h, fixing a regression with IRIX64 and Tru64
+	  (cf: 20110416)
+	+ modify _nc_tic_dir() to ensure that its return-value is nonnull,
+	  i.e., the database iterator was not initialized.  This case is needed
+	  to when tic is translating to termcap, rather than loading the
+	  database (cf:  20111001).
+
+20111112
+	+ add pccon entries for OpenBSD console (Alexei Malinin).
+	+ build-fix for OpenBSD 4.9 with gcc 4.2.1, setting _XOPEN_SOURCE to
+	  600 to work around inconsistent ifdef'ing of wcstof between C and
+	  C++ header files.
+	+ modify capconvert script to accept more than exact match on "xterm",
+	  e.g., the "xterm-*" variants, to exclude from the conversion (patch
+	  by Robert Millan).
+	+ add -lc_r as alternative for -lpthread, allows build of threaded code
+	  in older FreeBSD machines.
+	+ build-fix for MirBSD, which fails when either _XOPEN_SOURCE or
+	  _POSIX_SOURCE are defined.
+	+ fix a typo misc/Makefile.in, used in uninstalling pc-files.
+
+20111030
+	+ modify make_db_path() to allow creating "terminfo.db" in the same
+	  directory as an existing "terminfo" directory.  This fixes a case
+	  where switching between hashed/filesystem databases would cause the
+	  new hashed database to be installed in the next best location -
+	  root's home directory.
+	+ add variable cf_cv_prog_gnat_correct to those passed to
+	  config.status, fixing a problem with Ada95 builds (cf: 20111022).
+	+ change feature test from _XPG5 to _XOPEN_SOURCE in two places, to
+	  accommodate broken implementations for _XPG6.
+	+ eliminate usage of NULL symbol from etip.h, to reduce header
+	  interdependencies.
+	+ add configure check to decide when to add _XOPEN_SOURCE define to
+	  compiler options, i.e., for Solaris 10 and later (cf: 20100403).
+	  This is a workaround for gcc 4.6, which fails to build the c++
+	  binding if that symbol is defined by the application, due to
+	  incorrectly combining the corresponding feature test macros
+	  (report by Peter Kruse).
+
+20111022
+	+ correct logic for discarding mouse events, retaining the partial
+	  events used to build up click, double-click, etc, until needed
+	  (cf: 20110917).
+	+ fix configure script to avoid creating unused Ada95 makefile when
+	  gnat does not work.
+	+ cleanup width-related gcc 3.4.3 warnings for 64-bit platform, for the
+	  internal functions of libncurses.  The external interface of courses
+	  uses bool, which still produces these warnings.
+
+20111015
+	+ improve description of --disable-tic-depends option to make it
+	  clear that it may be useful whether or not the --with-termlib
+	  option is also given (report by Sven Joachim).
+	+ amend termcap equivalent for set_pglen_inch to use the X/Open
+	  "YI" rather than the obsolete Solaris 2.5 "sL" (cf: 990109).
+	+ improve manpage for tgetent differences from termcap library.
+
+20111008
+	+ moved static data from db_iterator.c to lib_data.c
+	+ modify db_iterator.c for memory-leak checking, fix one leak.
+	+ modify misc/gen-pkgconfig.in to use Requires.private for the parts
+	  of ncurses rather than Requires, as well as Libs.private for the
+	  other library dependencies (prompted by Debian #644728).
+
+20111001
+	+ modify tic "-K" option to only set the strict-flag rather than force
+	  source-output.  That allows the same flag to control the parser for
+	  input and output of termcap source.
+	+ modify _nc_getent() to ignore backslash at the end of a comment line,
+	  making it consistent with ncurses' parser.
+	+ restore a special-case check for directory needed to make termcap
+	  text files load as if they were databases (cf: 20110924).
+	+ modify tic's resolution/collision checking to attempt to remove the
+	  conflicting alias from the second entry in the pair, which is
+	  normally following in the source file.  Also improved the warning
+	  message to make it simpler to see which alias is the problem.
+	+ improve performance of the database iterator by caching search-list.
+
+20110925
+	+ add a missing "else" in changes to _nc_read_tic_entry().
+
+20110924
+	+ modify _nc_read_tic_entry() so that hashed-database is checked before
+	  filesystem.
+	+ updated CF_CURSES_LIBS check in test/configure script.
+	+ modify configure script and makefiles to split TIC_ARGS and
+	  TINFO_ARGS into pieces corresponding to LDFLAGS and LIBS variables,
+	  to help separate searches for tic- and tinfo-libraries (patch by Nick
+	  Alcock aka "Nix").
+	+ build-fix for lib_mouse.c changes (cf: 20110917).
+
+20110917
+	+ fix compiler warning for clang 2.9
+	+ improve merging of mouse events (integrated patch by Damien
+	  Guibouret).
+	+ correct mask-check used in lib_mouse for wheel mouse buttons 4/5
+	  (patch by Damien Guibouret).
+
+20110910
+	+ modify misc/gen_edit.sh to select a "linux" entry which works with
+	  the current kernel rather than assuming it is always "linux3.0"
+	  (cf: 20110716).
+	+ revert a change to getmouse() which had the undesirable side-effect
+	  of suppressing button-release events (report by Damien Guibouret,
+	  cf: 20100102).
+	+ add xterm+kbs fragment from xterm #272 -TD
+	+ add configure option --with-pkg-config-libdir to provide control over
+	  the actual directory into which pc-files are installed, do not use
+	  the pkg-config environment variables (discussion with Frederic L W
+	  Meunier).
+	+ add link to mailing-list archive in announce.html.in, as done in
+	  FAQ (prompted by question by Andrius Bentkus).
+	+ improve manpage install by adjusting the "#include" examples to
+	  show the ncurses-subdirectory used when --disable-overwrite option
+	  is used.
+	+ install an alias for "curses" to the ncurses manpage, tied to the
+	  --with-curses-h configure option (suggested by Reuben Thomas).
+
+20110903
+	+ propagate error-returns from wresize, i.e., the internal
+	  increase_size and decrease_size functions through resize_term (report
+	  by Tim van der Molen, cf:  20020713).
+	+ fix typo in tset manpage (patch by Sven Joachim).
+
+20110820
+	+ add a check to ensure that termcap files which might have "^?" do
+	  not use the terminfo interpretation as "\177".
+	+ minor cleanup of X-terminal emulator section of terminfo.src -TD
+	+ add terminator entry -TD
+	+ add simpleterm entry -TD
+	+ improve wattr_get macros by ensuring that if the window pointer is
+	  null, then the attribute and color values returned will be zero
+	  (cf: 20110528).
+
+20110813
+	+ add substitution for $RPATH_LIST to misc/ncurses-config.in
+	+ improve performance of tic with hashed-database by caching the
+	  database connection, using atexit() to cleanup.
+	+ modify treatment of 2-character aliases at the beginning of termcap
+	  entries so they are not counted in use-resolution, since these are
+	  guaranteed to be unique.  Also ignore these aliases when reporting
+	  the primary name of the entry (cf: 20040501)
+	+ double-check gn (generic) flag in terminal descriptions to
+	  accommodate old/buggy termcap databases which misused that feature.
+	+ minor fixes to _nc_tgetent(), ensure buffer is initialized even on
+	  error-return.
+
+20110807
+	+ improve rpath fix from 20110730 by ensuring that the new $RPATH_LIST
+	  variable is defined in the makefiles which use it.
+	+ build-fix for DragonFlyBSD's pkgsrc in test/configure script.
+	+ build-fixes for NetBSD 5.1 with termcap support enabled.
+	+ corrected k9 in dg460-ansi, add other features based on manuals -TD
+	+ improve trimming of whitespace at the end of terminfo/termcap output
+	  from tic/infocmp.
+	+ when writing termcap source, ensure that colons in the description
+	  field are translated to a non-delimiter, i.e., "=".
+	+ add "-0" option to tic/infocmp, to make the termcap/terminfo source
+	  use a single line.
+	+ add a null-pointer check when handling the $CC variable.
+
+20110730
+	+ modify configure script and makefiles in c++ and progs to allow the
+	  directory used for rpath option to be overridden, e.g., to work
+	  around updates to the variables used by tic during an install.
+	+ add -K option to tic/infocmp, to provide stricter BSD-compatibility
+	  for termcap output.
+	+ add _nc_strict_bsd variable in tic library which controls the
+	  "strict" BSD termcap compatibility from 20110723, plus these
+	  features:
+	  + allow escapes such as "\8" and "\9" when reading termcap
+	  + disallow "\a", "\e", "\l", "\s" and "\:" escapes when reading
+	    termcap files, passing through "a", "e", etc.
+	  + expand "\:" as "\072" on output.
+	+ modify _nc_get_token() to reset the token's string value in case
+	  there is a string-typed token lacking the "=" marker.
+	+ fix a few memory leaks in _nc_tgetent.
+	+ fix a few places where reading from a termcap file could refer to
+	  freed memory.
+	+ add an overflow check when converting terminfo/termcap numeric
+	  values, since terminfo stores those in a short, and they must be
+	  positive.
+	+ correct internal variables used for translating to termcap "%>"
+	  feature, and translating from termcap %B to terminfo, needed by
+	  tctest (cf: 19991211).
+	+ amend a minor fix to acsc when loading a termcap file to separate it
+	  from warnings needed for tic (cf: 20040710)
+	+ modify logic in _nc_read_entry() and _nc_read_tic_entry() to allow
+	  a termcap file to be handled via TERMINFO_DIRS.
+	+ modify _nc_infotocap() to include non-mandatory padding when
+	  translating to termcap.
+	+ modify _nc_read_termcap_entry(), passing a flag in the case where
+	  getcap is used, to reduce interactive warning messages.
+
+20110723
+	+ add a check in start_color() to limit color-pairs to 256 when
+	  extended colors are not supported (patch by David Benjamin).
+	+ modify setcchar to omit no-longer-needed OR'ing of color pair in
+	  the SetAttr() macro (patch by David Benjamin).
+	+ add kich1 to sun terminfo entry (Yuri Pankov)
+	+ use bold rather than reverse for smso in sun-color terminfo entry
+	  (Yuri Pankov).
+	+ improve generation of termcap using tic/infocmp -C option, e.g.,
+	  to correspond with 4.2BSD (prompted by discussion with Yuri Pankov
+	  regarding Schilling's test program):
+	  + translate %02 and %03 to %2 and %3 respectively.
+	  + suppress string capabilities which use %s, not supported by tgoto
+	  + use \040 rather than \s
+	  + expand null characters as \200 rather than \0
+	+ modify configure script to support shared libraries for DragonFlyBSD.
+
+20110716
+	+ replace an assert() in _nc_Free_Argument() with a regular null
+	  pointer check (report/analysis by Franjo Ivancic).
+	+ modify configure --enable-pc-files option to take into account the
+	  PKG_CONFIG_PATH variable (report by Frederic L W Meunier).
+	+ add/use xterm+tmux chunk from xterm #271 -TD
+	+ resync xterm-new entry from xterm #271 -TD
+	+ add E3 extended capability to linux-basic (Miroslav Lichvar)
+	+ add linux2.2, linux2.6, linux3.0 entries to give context for E3 -TD
+	+ add SI/SO change to linux2.6 entry (Debian #515609) -TD
+	+ fix inconsistent tabset path in pcmw (Todd C. Miller).
+	+ remove a backslash which continued comment, obscuring altos3
+	  definition with OpenBSD toolset (Nicholas Marriott).
+
+20110702
+	+ add workaround from xterm #271 changes to ensure that compiler flags
+	  are not used in the $CC variable.
+	+ improve support for shared libraries, tested with AIX 5.3, 6.1 and
+	  7.1 with both gcc 4.2.4 and cc.
+	+ modify configure checks for AIX to include release 7.x
+	+ add loader flags/libraries to libtool options so that dynamic loading
+	  works properly, adapted from ncurses-5.7-ldflags-with-libtool.patch
+	  at gentoo prefix repository (patch by Michael Haubenwallner).
+
+20110626
+	+ move include of nc_termios.h out of term_entry.h, since the latter
+	  is installed, e.g., for tack while the former is not (report by
+	  Sven Joachim).
+
+20110625
+	+ improve cleanup() function in lib_tstp.c, using _exit() rather than
+	  exit() and checking for SIGTERM rather than SIGQUIT (prompted by
+	  comments forwarded by Nicholas Marriott).
+	+ reduce name pollution from term.h, moving fallback #define's for
+	  tcgetattr(), etc., to new private header nc_termios.h (report by
+	  Sergio NNX).
+	+ two minor fixes for tracing (patch by Vassili Courzakis).
+	+ improve trace initialization by starting it in use_env() and
+	  ripoffline().
+	+ review old email, add details for some changelog entries.
+
+20110611
+	+ update minix entry to minix 3.2 (Thomas Cort).
+	+ fix a strict compiler warning in change to wattr_get (cf: 20110528).
+
+20110604
+	+ fixes for MirBSD port:
+	  + set default prefix to /usr.
+	  + add support for shared libraries in configure script.
+	  + use S_ISREG and S_ISDIR consistently, with fallback definitions.
+	+ add a few more checks based on ncurses/link_test.
+	+ modify MKlib_gen.sh to handle sp-funcs renaming of NCURSES_OUTC type.
+
+20110528
+	+ add case to CF_SHARED_OPTS for Interix (patch by Markus Duft).
+	+ used ncurses/link_test to check for behavior when the terminal has
+	  not been initialized and when an application passes null pointers
+	  to the library.  Added checks to cover this (prompted by Redhat
+	  #707344).
+	+ modify MKlib_gen.sh to make its main() function call each function
+	  with zero parameters, to help find inconsistent checking for null
+	  pointers, etc.
+
+20110521
+	+ fix warnings from clang 2.7 "--analyze"
+
+20110514
+	+ compiler-warning fixes in panel and progs.
+	+ modify CF_PKG_CONFIG macro, from changes to tin -TD
+	+ modify CF_CURSES_FUNCS configure macro, used in test directory
+	  configure script:
+	  + work around (non-optimizer) bug in gcc 4.2.1 which caused
+	    test-expression to be omitted from executable.
+	  + force the linker to see a link-time expression of a symbol, to
+	    help work around weak-symbol issues.
+
+20110507
+	+ update discussion of MKfallback.sh script in INSTALL; normally the
+	  script is used automatically via the configured makefiles.  However
+	  there are still occasions when it might be used directly by packagers
+	  (report by Gunter Schaffler).
+	+ modify misc/ncurses-config.in to omit the "-L" option from the
+	  "--libs" output if the library directory is /usr/lib.
+	+ change order of tests for curses.h versus ncurses.h headers in the
+	  configure scripts for Ada95 and test-directories, to look for
+	  ncurses.h, from fixes to tin -TD
+	+ modify ncurses/tinfo/access.c to account for Tandem's root uid
+	  (report by Joachim Schmitz).
+
+20110430
+	+ modify rules in Ada95/src/Makefile.in to ensure that the PIC option
+	  is not used when building a static library (report by Nicolas
+	  Boulenguez):
+	+ Ada95 build-fix for big-endian architectures such as sparc.  This
+	  undoes one of the fixes from 20110319, which added an "Unused" member
+	  to representation clauses, replacing that with pragmas to suppress
+	  warnings about unused bits (patch by Nicolas Boulenguez).
+
+20110423
+	+ add check in test/configure for use_window, use_screen.
+	+ add configure-checks for getopt's variables, which may be declared
+	  as different types on some Unix systems.
+	+ add check in test/configure for some legacy curses types of the
+	  function pointer passed to tputs().
+	+ modify init_pair() to accept -1's for color value after
+	  assume_default_colors() has been called (Debian #337095).
+	+ modify test/background.c, adding commmand-line options to demonstrate
+	  assume_default_colors() and use_default_colors().
+
+20110416
+	+ modify configure script/source-code to only define _POSIX_SOURCE if
+	  the checks for sigaction and/or termios fail, and if _POSIX_C_SOURCE
+	  and _XOPEN_SOURCE are undefined (report by Valentin Ochs).
+	+ update config.guess, config.sub
+
+20110409
+	+ fixes to build c++ binding with clang 3.0 (patch by Alexander
+	  Kolesen).
+	+ add check for unctrl.h in test/configure, to work around breakage in
+	  some ncurses packages.
+	+ add "--disable-widec" option to test/configure script.
+	+ add "--with-curses-colr" and "--with-curses-5lib" options to the
+	  test/configure script to address testing with very old machines.
+
+20110404 5.9 release for upload to ftp.gnu.org
+
+20110402
+	+ various build-fixes for the rpm/dpkg scripts.
+	+ add "--enable-rpath-link" option to Ada95/configure, to allow
+	  packages to suppress the rpath feature which is normally used for
+	  the in-tree build of sample programs.
+	+ corrected definition of libdir variable in Ada95/src/Makefile.in,
+	  needed for rpm script.
+	+ add "--with-shared" option to Ada95/configure script, to allow
+	  making the C-language parts of the binding use appropriate compiler
+	  options if building a shared library with gnat.
+
+20110329
+	> portability fixes for Ada95 binding:
+	+ add configure check to ensure that SIGINT works with gnat.  This is
+	  needed for the "rain" sample program.  If SIGINT does not work, omit
+	  that sample program.
+	+ correct typo in check of $PKG_CONFIG variable in Ada95/configure
+	+ add ncurses_compat.c, to supply functions used in the Ada95 binding
+	  which were added in 5.7 and later.
+	+ modify sed expression in CF_NCURSES_ADDON to eliminate a dependency
+	  upon GNU sed.
+
+20110326
+	+ add special check in Ada95/configure script for ncurses6 reentrant
+	  code.
+	+ regen Ada html documentation.
+	+ build-fix for Ada shared libraries versus the varargs workaround.
+	+ add rpm and dpkg scripts for Ada95 and test directories, for test
+	  builds.
+	+ update test/configure macros CF_CURSES_LIBS, CF_XOPEN_SOURCE and
+	  CF_X_ATHENA_LIBS.
+	+ add configure check to determine if gnat's project feature supports
+	  libraries, i.e., collections of .ali files.
+	+ make all dereferences in Ada95 samples explicit.
+	+ fix typo in comment in lib_add_wch.c (patch by Petr Pavlu).
+	+ add configure check for, ifdef's for math.h which is in a separate
+	  package on Solaris and potentially not installed (report by Petr
+	  Pavlu).
+	> fixes for Ada95 binding (Nicolas Boulenguez):
+	+ improve type-checking in Ada95 by eliminating a few warning-suppress
+	  pragmas.
+	+ suppress unreferenced warnings.
+	+ make all dereferences in binding explicit.
+
+20110319
+	+ regen Ada html documentation.
+	+ change order of -I options from ncurses*-config script when the
+	  --disable-overwrite option was used, so that the subdirectory include
+	  is listed first.
+	+ modify the make-tar.sh scripts to add a MANIFEST and NEWS file.
+	+ modify configure script to provide value for HTML_DIR in
+	  Ada95/gen/Makefile.in, which depends on whether the Ada95 binding is
+	  distributed separately (report by Nicolas Boulenguez).
+	+ modify configure script to add "-g" and/or "-O3" to ADAFLAGS if the
+	  CFLAGS for the build has these options.
+	+ amend change from 20070324, to not add 1 to the result of getmaxx
+	  and getmaxy in the Ada binding (report by Nicolas Boulenguez for
+	  thread in comp.lang.ada).
+	+ build-fix Ada95/samples for gnat 4.5
+	+ spelling fixes for Ada95/samples/explain.txt
+	> fixes for Ada95 binding (Nicolas Boulenguez):
+	+ add item in Trace_Attribute_Set corresponding to TRACE_ATTRS.
+	+ add workaround for binding to set_field_type(), which uses varargs.
+	  The original binding from 990220 relied on the prevalent
+	  implementation of varargs which did not support or need va_copy().
+	+ add dependency on gen/Makefile.in needed for *-panels.ads
+	+ add Library_Options to library.gpr
+	+ add Languages to library.gpr, for gprbuild
+
+20110307
+	+ revert changes to limit-checks from 20110122 (Debian #616711).
+	> minor type-cleanup of Ada95 binding (Nicolas Boulenguez):
+	+ corrected a minor sign error in a field of Low_Level_Field_Type, to
+	  conform to form.h.
+	+ replaced C_Int by Curses_Bool as return type for some callbacks, see
+	  fieldtype(3FORM).
+	+ modify samples/sample-explain.adb to provide explicit message when
+	  explain.txt is not found.
+
+20110305
+	+ improve makefiles for Ada95 tree (patch by Nicolas Boulenguez).
+	+ fix an off-by-one error in _nc_slk_initialize() from 20100605 fixes
+	  for compiler warnings (report by Nicolas Boulenguez).
+	+ modify Ada95/gen/gen.c to declare unused bits in generated layouts,
+	  needed to compile when chtype is 64-bits using gnat 4.4.5
+
+20110226 5.8 release for upload to ftp.gnu.org
+
+20110226
+	+ update release notes, for 5.8.
+	+ regenerated html manpages.
+	+ change open() in _nc_read_file_entry() to fopen() for consistency
+	  with write_file().
+	+ modify misc/run_tic.in to create parent directory, in case this is
+	  a new install of hashed database.
+	+ fix typo in Ada95/mk-1st.awk which causes error with original awk.
+
+20110220
+	+ configure script rpath fixes from xterm #269.
+	+ workaround for cygwin's non-functional features.h, to force ncurses'
+	  configure script to define _XOPEN_SOURCE_EXTENDED when building
+	  wide-character configuration.
+	+ build-fix in run_tic.sh for OS/2 EMX install
+	+ add cons25-debian entry (patch by Brian M Carlson, Debian #607662).
+
+20110212
+	+ regenerated html manpages.
+	+ use _tracef() in show_where() function of tic, to work correctly with
+	  special case of trace configuration.
+
+20110205
+	+ add xterm-utf8 entry as a demo of the U8 feature -TD
+	+ add U8 feature to denote entries for terminal emulators which do not
+	  support VT100 SI/SO when processing UTF-8 encoding -TD
+	+ improve the NCURSES_NO_UTF8_ACS feature by adding a check for an
+	  extended terminfo capability U8 (prompted by mailing list
+	  discussion).
+
+20110122
+	+ start documenting interface changes for upcoming 5.8 release.
+	+ correct limit-checks in derwin().
+	+ correct limit-checks in newwin(), to ensure that windows have nonzero
+	  size (report by Garrett Cooper).
+	+ fix a missing "weak" declaration for pthread_kill (patch by Nicholas
+	  Alcock).
+	+ improve documentation of KEY_ENTER in curs_getch.3x manpage (prompted
+	  by discussion with Kevin Martin).
+
+20110115
+	+ modify Ada95/configure script to make the --with-curses-dir option
+	  work without requiring the --with-ncurses option.
+	+ modify test programs to allow them to be built with NetBSD curses.
+	+ document thick- and double-line symbols in curs_add_wch.3x manpage.
+	+ document WACS_xxx constants in curs_add_wch.3x manpage.
+	+ fix some warnings for clang 2.6 "--analyze"
+	+ modify Ada95 makefiles to make html-documentation with the project
+	  file configuration if that is used.
+	+ update config.guess, config.sub
+
+20110108
+	+ regenerated html manpages.
+	+ minor fixes to enable lint when trace is not enabled, e.g., with
+	  clang --analyze.
+	+ fix typo in man/default_colors.3x (patch by Tim van der Molen).
+	+ update ncurses/llib-lncurses*
+
+20110101
+	+ fix remaining strict compiler warnings in ncurses library ABI=5,
+	  except those dealing with function pointers, etc.
+
+20101225
+	+ modify nc_tparm.h, adding guards against repeated inclusion, and
+	  allowing TPARM_ARG to be overridden.
+	+ fix some strict compiler warnings in ncurses library.
+
+20101211
+	+ suppress ncv in screen entry, allowing underline (patch by Alejandro
+	  R Sedeno).
+	+ also suppress ncv in konsole-base -TD
+	+ fixes in wins_nwstr() and related functions to ensure that special
+	  characters, i.e., control characters are handled properly with the
+	  wide-character configuration.
+	+ correct a comparison in wins_nwstr() (Redhat #661506).
+	+ correct help-messages in some of the test-programs, which still
+	  referred to quitting with 'q'.
+
+20101204
+	+ add special case to _nc_infotocap() to recognize the setaf/setab
+	  strings from xterm+256color and xterm+88color, and provide a reduced
+	  version which works with termcap.
+	+ remove obsolete emacs "Local Variables" section from documentation
+	  (request by Sven Joachim).
+	+ update doc/html/index.html to include NCURSES-Programming-HOWTO.html
+	  (report by Sven Joachim).
+
+20101128
+	+ modify test/configure and test/Makefile.in to handle this special
+	  case of building within a build-tree (Debian #34182):
+		mkdir -p build && cd build && ../test/configure && make
+
+20101127
+	+ miscellaneous build-fixes for Ada95 and test-directories when built
+	  out-of-tree.
+	+ use VPATH in makefiles to simplify out-of-tree builds (Debian #34182).
+	+ fix typo in rmso for tek4106 entry -Goran Weinholt
+
+20101120
+	+ improve checks in test/configure for X libraries, from xterm #267
+	  changes.
+	+ modify test/configure to allow it to use the build-tree's libraries
+	  e.g., when using that to configure the test-programs without the
+	  rpath feature (request by Sven Joachim).
+	+ repurpose "gnome" terminfo entries as "vte", retaining "gnome" items
+	  for compatibility, but generally deprecating those since the VTE
+	  library is what actually defines the behavior of "gnome", etc.,
+	  since 2003 -TD
+
+20101113
+	+ compiler warning fixes for test programs.
+	+ various build-fixes for test-programs with pdcurses.
+	+ updated configure checks for X packages in test/configure from xterm
+	  #267 changes.
+	+ add configure check to gnatmake, to accommodate cygwin.
+
+20101106
+	+ correct list of sub-directories needed in Ada95 tree for building as
+	  a separate package.
+	+ modify scripts in test-directory to improve builds as a separate
+	  package.
+
+20101023
+	+ correct parsing of relative tab-stops in tabs program (report by
+	  Philip Ganchev).
+	+ adjust configure script so that "t" is not added to library suffix
+	  when weak-symbols are used, allowing the pthread configuration to
+	  more closely match the non-thread naming (report by Werner Fink).
+	+ modify configure check for tic program, used for fallbacks, to a
+	  warning if not found.  This makes it simpler to use additional
+	  scripts to bootstrap the fallbacks code using tic from the build
+	  tree (report by Werner Fink).
+	+ fix several places in configure script using ${variable-value} form.
+	+ modify configure macro CF_LDFLAGS_STATIC to accommodate some loaders
+	  which do not support selectively linking against static libraries
+	  (report by John P. Hartmann)
+	+ fix an unescaped dash in man/tset.1 (report by Sven Joachim).
+
+20101009
+	+ correct comparison used for setting 16-colors in linux-16color
+	  entry (Novell #644831) -TD
+	+ improve linux-16color entry, using "dim" for color-8 which makes it
+	  gray rather than black like color-0 -TD
+	+ drop misc/ncu-indent and misc/jpf-indent; they are provided by an
+	  external package "cindent".
+
+20101002
+	+ improve linkages in html manpages, adding references to the newer
+	  pages, e.g., *_variables, curs_sp_funcs, curs_threads.
+	+ add checks in tic for inconsistent cursor-movement controls, and for
+	  inconsistent printer-controls.
+	+ fill in no-parameter forms of cursor-movement where a parameterized
+	  form is available -TD
+	+ fill in missing cursor controls where the form of the controls is
+	  ANSI -TD
+	+ fix inconsistent punctuation in form_variables manpage (patch by
+	  Sven Joachim).
+	+ add parameterized cursor-controls to linux-basic (report by Dae) -TD
+	> patch by Juergen Pfeifer:
+	+ document how to build 32-bit libraries in README.MinGW
+	+ fixes to filename computation in mk-dlls.sh.in
+	+ use POSIX locale in mk-dlls.sh.in rather than en_US (report by Sven
+	  Joachim).
+	+ add a check in mk-dlls.sh.in to obtain the size of a pointer to
+	  distinguish between 32-bit and 64-bit hosts.  The result is stored
+	  in mingw_arch
+
+20100925
+	+ add "XT" capability to entries for terminals that support both
+	  xterm-style mouse- and title-controls, for "screen" which
+	  special-cases TERM beginning with "xterm" or "rxvt" -TD
+	> patch by Juergen Pfeifer:
+	+ use 64-Bit MinGW toolchain (recommended package from TDM, see
+	  README.MinGW).
+	+ support pthreads when using the TDM MinGW toolchain
+
+20100918
+	+ regenerated html manpages.
+	+ minor fixes for symlinks to curs_legacy.3x and curs_slk.3x manpages.
+	+ add manpage for sp-funcs.
+	+ add sp-funcs to test/listused.sh, for documentation aids.
+
+20100911
+	+ add manpages for summarizing public variables of curses-, terminfo-
+	  and form-libraries.
+	+ minor fixes to manpages for consistency (patch by Jason McIntyre).
+	+ modify tic's -I/-C dump to reformat acsc strings into canonical form
+	  (sorted, unique mapping) (cf: 971004).
+	+ add configure check for pthread_kill(), needed for some old
+	  platforms.
+
+20100904
+	+ add configure option --without-tests, to suppress building test
+	  programs (request by Frederic L W Meunier).
+
+20100828
+	+ modify nsterm, xnuppc and tek4115 to make sgr/sgr0 consistent -TD
+	+ add check in terminfo source-reader to provide more informative
+	  message when someone attempts to run tic on a compiled terminal
+	  description (prompted by Debian #593920).
+	+ note in infotocap and captoinfo manpages that they read terminal
+	  descriptions from text-files (Debian #593920).
+	+ improve acsc string for vt52, show arrow keys (patch by Benjamin
+	  Sittler).
+
+20100814
+	+ document in manpages that "mv" functions first use wmove() to check
+	  the window pointer and whether the position lies within the window
+	  (suggested by Poul-Henning Kamp).
+	+ fixes to curs_color.3x, curs_kernel.3x and wresize.3x manpages (patch
+	  by Tim van der Molen).
+	+ modify configure script to transform library names for tic- and
+	  tinfo-libraries so that those build properly with Mac OS X shared
+	  library configuration.
+	+ modify configure script to ensure that it removes conftest.dSYM
+	  directory leftover on checks with Mac OS X.
+	+ modify configure script to cleanup after check for symbolic links.
+
+20100807
+	+ correct a typo in mk-1st.awk (patch by Gabriele Balducci)
+	  (cf: 20100724)
+	+ improve configure checks for location of tic and infocmp programs
+	  used for installing database and for generating fallback data,
+	  e.g., for cross-compiling.
+	+ add Markus Kuhn's wcwidth function for compiling MinGW
+	+ add special case to CF_REGEX for cross-compiling to MinGW target.
+
+20100731
+	+ modify initialization check for win32con driver to eliminate need for
+	  special case for TERM "unknown", using terminal database if available
+	  (prompted by discussion with Roumen Petrov).
+	+ for MinGW port, ensure that terminal driver is setup if tgetent()
+	  is called (patch by Roumen Petrov).
+	+ document tabs "-0" and "-8" options in manpage.
+	+ fix Debian "lintian" issues with manpages reported in
+	  http://lintian.debian.org/full/csmall@debian.org.html#ncurses
+
+20100724
+	+ add a check in tic for missing set_tab if clear_all_tabs given.
+	+ improve use of symbolic links in makefiles by using "-f" option if
+	  it is supported, to eliminate temporary removal of the target
+	  (prompted by http://www.t2-project.org/packages/ncurses.html)
+	+ minor improvement to test/ncurses.c, reset color pairs in 'd' test
+	  after exit from 'm' main-menu command.
+	+ improved ncu-indent, from mawk changes, allows more than one of
+	  GCC_NORETURN, GCC_PRINTFLIKE and GCC_SCANFLIKE on a single line.
+
+20100717
+	+ add hard-reset for rs2 to wsvt25 to help ensure that reset ends
+	  the alternate character set (patch by Nicholas Marriott)
+	+ remove tar-copy.sh and related configure/Makefile chunks, since the
+	  Ada95 binding is now installed using rules in Ada95/src.
+
+20100703
+	+ continue integrating changes to use gnatmake project files in Ada95
+	  + add/use configure check to turn on project rules for Ada95/src.
+	+ revert the vfork change from 20100130, since it does not work.
+
+20100626
+	+ continue integrating changes to use gnatmake project files in Ada95
+	  + old gnatmake (3.15) does not produce libraries using project-file;
+	    work around by adding script to generate alternate makefile.
+
+20100619
+	+ continue integrating changes to use gnatmake project files in Ada95
+	  + add configure --with-ada-sharedlib option, for the test_make rule.
+	  + move Ada95-related logic into aclocal.m4, since additional checks
+	    will be needed to distinguish old/new implementations of gnat.
+
+20100612
+	+ start integrating changes to use gnatmake project files in Ada95 tree
+	  + add test_make / test_clean / test_install rules in Ada95/src
+	  + change install-path for adainclude directory to /usr/share/ada (was
+	    /usr/lib/ada).
+	+ update Ada95/configure.
+	+ add mlterm+256color entry, for mlterm 3.0.0 -TD
+	+ modify test/configure to use macros to ensure consistent order
+	  of updating LIBS variable.
+
+20100605
+	+ change search order of options for Solaris in CF_SHARED_OPTS, to
+	  work with 64-bit compiles.
+	+ correct quoting of assignment in CF_SHARED_OPTS case for aix
+	  (cf: 20081227)
+
+20100529
+	+ regenerated html documentation.
+	+ modify test/configure to support pkg-config for checking X libraries
+	  used by PDCurses.
+	+ add/use configure macro CF_ADD_LIB to force consistency of
+	  assignments to $LIBS, etc.
+	+ fix configure script for combining --with-pthread
+	  and --enable-weak-symbols options.
+
+20100522
+	+ correct cross-compiling configure check for CF_MKSTEMP macro, by
+	  adding a check cache variable set by AC_CHECK_FUNC (report by
+	  Pierre Labastie).
+	+ simplify include-dependencies of make_hash and make_keys, to reduce
+	  the need for setting BUILD_CPPFLAGS in cross-compiling when the
+	  build- and target-machines differ.
+	+ repair broken-linker configuration by restoring a definition of SP
+	  variable to curses.priv.h, and adjusting for cases where sp-funcs
+	  are used.
+	+ improve configure macro CF_AR_FLAGS, allowing ARFLAGS environment
+	  variable to override (prompted by report by Pablo Cazallas).
+
+20100515
+	+ add configure option --enable-pthreads-eintr to control whether the
+	  new EINTR feature is enabled.
+	+ modify logic in pthread configuration to allow EINTR to interrupt
+	  a read operation in wgetch() (Novell #540571, patch by Werner Fink).
+	+ drop mkdirs.sh, use "mkdir -p".
+	+ add configure option --disable-libtool-version, to use the
+	  "-version-number" feature which was added in libtool 1.5 (report by
+	  Peter Haering).  The default value for the option uses the newer
+	  feature, which makes libraries generated using libtool compatible
+	  with the standard builds of ncurses.
+	+ updated test/configure to match configure script macros.
+	+ fixes for configure script from lynx changes:
+	  + improve CF_FIND_LINKAGE logic for the case where a function is
+	    found in predefined libraries.
+	  + revert part of change to CF_HEADER (cf: 20100424)
+
+20100501
+	+ correct limit-check in wredrawln, accounting for begy/begx values
+	  (patch by David Benjamin).
+	+ fix most compiler warnings from clang.
+	+ amend build-fix for OpenSolaris, to ensure that a system header is
+	  included in curses.h before testing feature symbols, since they
+	  may be defined by that route.
+
+20100424
+	+ fix some strict compiler warnings in ncurses library.
+	+ modify configure macro CF_HEADER_PATH to not look for variations in
+	  the predefined include directories.
+	+ improve configure macros CF_GCC_VERSION and CF_GCC_WARNINGS to work
+	  with gcc 4.x's c89 alias, which gives warning messages for cases
+	  where older versions would produce an error.
+
+20100417
+	+ modify _nc_capcmp() to work with cancelled strings.
+	+ correct translation of "^" in _nc_infotocap(), used to transform
+	  terminfo to termcap strings
+	+ add configure --disable-rpath-hack, to allow disabling the feature
+	  which adds rpath options for libraries in unusual places.
+	+ improve CF_RPATH_HACK_2 by checking if the rpath option for a given
+	  directory was already added.
+	+ improve CF_RPATH_HACK_2 by using ldd to provide a standard list of
+	  directories (which will be ignored).
+
+20100410
+	+ improve win_driver.c handling of mouse:
+	  + discard motion events
+	  + avoid calling _nc_timed_wait when there is a mouse event
+	  + handle 4th and "rightmost" buttons.
+	+ quote substitutions in CF_RPATH_HACK_2 configure macro, needed for
+	  cases where there are embedded blanks in the rpath option.
+
+20100403
+	+ add configure check for exctags vs ctags, to work around pkgsrc.
+	+ simplify logic in _nc_get_screensize() to make it easier to see how
+	  environment variables may override system- and terminfo-values
+	  (prompted by discussion with Igor Bujna).
+	+ make debug-traces for COLOR_PAIR and PAIR_NUMBER less verbose.
+	+ improve handling of color-pairs embedded in attributes for the
+	  extended-colors configuration.
+	+ modify MKlib_gen.sh to build link_test with sp-funcs.
+	+ build-fixes for OpenSolaris aka Solaris 11, for wide-character
+	  configuration as well as for rpath feature in *-config scripts.
+
+20100327
+	+ refactor CF_SHARED_OPTS configure macro, making CF_RPATH_HACK more
+	  reusable.
+	+ improve configure CF_REGEX, similar fixes.
+	+ improve configure CF_FIND_LINKAGE, adding add check between system
+	  (default) and explicit paths, where we can find the entrypoint in the
+	  given library.
+	+ add check if Gpm_Open() returns a -2, e.g., for "xterm".  This is
+	  normally suppressed but can be overridden using $NCURSES_GPM_TERMS.
+	  Ensure that Gpm_Close() is called in this case.
+
+20100320
+	+ rename atari and st52 terminfo entries to atari-old, st52-old, use
+	  newer entries from FreeMiNT by Guido Flohr (from patch/report by Alan
+	  Hourihane).
+
+20100313
+	+ modify install-rule for manpages so that *-config manpages will
+	  install when building with --srcdir (report by Sven Joachim).
+	+ modify CF_DISABLE_LEAKS configure macro so that the --enable-leaks
+	  option is not the same as --disable-leaks (GenToo #305889).
+	+ modify #define's for build-compiler to suppress cchar_t symbol from
+	  compile of make_hash and make_keys, improving cross-compilation of
+	  ncursesw (report by Bernhard Rosenkraenzer).
+	+ modify CF_MAN_PAGES configure macro to replace all occurrences of
+	  TPUT in tput.1's manpage (Debian #573597, report/analysis by Anders
+	  Kaseorg).
+
+20100306
+	+ generate manpages for the *-config scripts, adapted from help2man
+	  (suggested by Sven Joachim).
+	+ use va_copy() in _nc_printf_string() to avoid conflicting use of
+	  va_list value in _nc_printf_length() (report by Wim Lewis).
+
+20100227
+	+ add Ada95/configure script, to use in tar-file created by
+	  Ada95/make-tar.sh
+	+ fix typo in wresize.3x (patch by Tim van der Molen).
+	+ modify screen-bce.XXX entries to exclude ech, since screen's color
+	  model does not clear with color for that feature -TD
+
+20100220
+	+ add make-tar.sh scripts to Ada95 and test subdirectories to help with
+	  making those separately distributable.
+	+ build-fix for static libraries without dlsym (Debian #556378).
+	+ fix a syntax error in man/form_field_opts.3x (patch by Ingo
+	  Schwarze).
+
+20100213
+	+ add several screen-bce.XXX entries -TD
+
+20100206
+	+ update mrxvt terminfo entry -TD
+	+ modify win_driver.c to support mouse single-clicks.
+	+ correct name for termlib in ncurses*-config, e.g., if it is renamed
+	  to provide a single file for ncurses/ncursesw libraries (patch by
+	  Miroslav Lichvar).
+
+20100130
+	+ use vfork in test/ditto.c if available (request by Mike Frysinger).
+	+ miscellaneous cleanup of manpages.
+	+ fix typo in curs_bkgd.3x (patch by Tim van der Molen).
+	+ build-fix for --srcdir (patch by Miroslav Lichvar).
+
+20100123
+	+ for term-driver configuration, ensure that the driver pointer is
+	  initialized in setupterm so that terminfo/termcap programs work.
+	+ amend fix for Debian #542031 to ensure that wattrset() returns only
+	  OK or ERR, rather than the attribute value (report by Miroslav
+	  Lichvar).
+	+ reorder WINDOWLIST to put WINDOW data after SCREEN pointer, making
+	  _nc_screen_of() compatible between normal/wide libraries again (patch
+	  by Miroslav Lichvar)
+	+ review/fix include-dependencies in modules files (report by Miroslav
+	  Lichvar).
+
+20100116
+	+ modify win_driver.c to initialize acs_map for win32 console, so
+	  that line-drawing works.
+	+ modify win_driver.c to initialize TERMINAL struct so that programs
+	  such as test/lrtest.c and test/ncurses.c which test string
+	  capabilities can run.
+	+ modify term-driver modules to eliminate forward-reference
+	  declarations.
+
+20100109
+	+ modify configure macro CF_XOPEN_SOURCE, etc., to use CF_ADD_CFLAGS
+	  consistently to add new -D's while removing duplicates.
+	+ modify a few configure macros to consistently put new options
+	  before older in the list.
+	+ add tiparm(), based on review of X/Open Curses Issue 7.
+	+ minor documentation cleanup.
+	+ update config.guess, config.sub from
+		http://savannah.gnu.org/projects/config
+	  (caveat - its maintainer put 2010 copyright date on files dated 2009)
+
+20100102
+	+ minor improvement to tic's checking of similar SGR's to allow for the
+	  most common case of SGR 0.
+	+ modify getmouse() to act as its documentation implied, returning on
+	  each call the preceding event until none are left.  When no more
+	  events remain, it will return ERR.
+
+20091227
+	+ change order of lookup in progs/tput.c, looking for terminfo data
+	  first.  This fixes a confusion between termcap "sg" and terminfo
+	  "sgr" or "sgr0", originally from 990123 changes, but exposed by
+	  20091114 fixes for hashing.  With this change, only "dl" and "ed" are
+	  ambiguous (Mandriva #56272).
+
+20091226
+	+ add bterm terminfo entry, based on bogl 0.1.18 -TD
+	+ minor fix to rxvt+pcfkeys terminfo entry -TD
+	+ build-fixes for Ada95 tree for gnat 4.4 "style".
+
+20091219
+	+ remove old check in mvderwin() which prevented moving a derived
+	  window whose origin happened to coincide with its parent's origin
+	  (report by Katarina Machalkova).
+	+ improve test/ncurses.c to put mouse droppings in the proper window.
+	+ update minix terminfo entry -TD
+	+ add bw (auto-left-margin) to nsterm* entries (Benjamin Sittler)
+
+20091212
+	+ correct transfer of multicolumn characters in multirow
+	  field_buffer(), which stopped at the end of the first row due to
+	  filling of unused entries in a cchar_t array with nulls.
+	+ updated nsterm* entries (Benjamin Sittler, Emanuele Giaquinta)
+	+ modify _nc_viscbuf2() and _tracecchar_t2() to show wide-character
+	  nulls.
+	+ use strdup() in set_menu_mark(), restore .marklen struct member on
+	  failure.
+	+ eliminate clause 3 from the UCB copyrights in read_termcap.c and
+	  tset.c per
+		ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change
+	  (patch by Nicholas Marriott).
+	+ replace a malloc in tic.c with strdup, checking for failure (patch by
+	  Nicholas Marriott).
+	+ update config.guess, config.sub from
+		http://savannah.gnu.org/projects/config
+
+20091205
+	+ correct layout of working window used to extract data in
+	  wide-character configured by set_field_buffer (patch by Rafael
+	  Garrido Fernandez)
+	+ improve some limit-checks related to filename length in reading and
+	  writing terminfo entries.
+	+ ensure that filename is always filled in when attempting to read
+	  a terminfo entry, so that infocmp can report the filename (patch
+	  by Nicholas Marriott).
+
+20091128
+	+ modify mk-1st.awk to allow tinfo library to be built when term-driver
+	  is enabled.
+	+ add error-check to configure script to ensure that sp-funcs is
+	  enabled if term-driver is, since some internal interfaces rely upon
+	  this.
+
+20091121
+	+ fix case where progs/tput is used while sp-funcs is configure; this
+	  requires save/restore of out-character function from _nc_prescreen
+	  rather than the SCREEN structure (report by Charles Wilson).
+	+ fix typo in man/curs_trace.3x which caused incorrect symbolic links
+	+ improved configure macros CF_GCC_ATTRIBUTES, CF_PROG_LINT.
+
+20091114
+	+ updated man/curs_trace.3x
+	+ limit hashing for termcap-names to 2-characters (Ubuntu #481740).
+	+ change a variable name in lib_newwin.c to make it clearer which
+	  value is being freed on error (patch by Nicholas Marriott).
+
+20091107
+	+ improve test/ncurses.c color-cycling test by reusing attribute-
+	  and color-cycling logic from the video-attributes screen.
+	+ add ifdef'd with NCURSES_INTEROP_FUNCS experimental bindings in form
+	  library which help make it compatible with interop applications
+	  (patch by Juergen Pfeifer).
+	+ add configure option --enable-interop, for integrating changes
+	  for generic/interop support to form-library by Juergen Pfeifer
+
+20091031
+	+ modify use of $CC environment variable which is defined by X/Open
+	  as a curses feature, to ignore it if it is not a single character
+	  (prompted by discussion with Benjamin C W Sittler).
+	+ add START_TRACE in slk_init
+	+ fix a regression in _nc_ripoffline which made test/ncurses.c not show
+	  soft-keys, broken in 20090927 merging.
+	+ change initialization of "hidden" flag for soft-keys from true to
+	  false, broken in 20090704 merging (Ubuntu #464274).
+	+ update nsterm entries (patch by Benjamin C W Sittler, prompted by
+	  discussion with Fabian Groffen in GenToo #206201).
+	+ add test/xterm-256color.dat
+
+20091024
+	+ quiet some pedantic gcc warnings.
+	+ modify _nc_wgetch() to check for a -1 in the fifo, e.g., after a
+	  SIGWINCH, and discard that value, to avoid confusing application
+	  (patch by Eygene Ryabinkin, FreeBSD #136223).
+
+20091017
+	+ modify handling of $PKG_CONFIG_LIBDIR to use only the first item in
+	  a possibly colon-separated list (Debian #550716).
+
+20091010
+	+ supply a null-terminator to buffer in _nc_viswibuf().
+	+ fix a sign-extension bug in unget_wch() (report by Mike Gran).
+	+ minor fixes to error-returns in default function for tputs, as well
+	  as in lib_screen.c
+
+20091003
+	+ add WACS_xxx definitions to wide-character configuration for thick-
+	  and double-lines (discussion with Slava Zanko).
+	+ remove unnecessary kcan assignment to ^C from putty (Sven Joachim)
+	+ add ccc and initc capabilities to xterm-16color -TD
+	> patch by Benjamin C W Sittler:
+	+ add linux-16color
+	+ correct initc capability of linux-c-nc end-of-range
+	+ similar change for dg+ccc and dgunix+ccc
+
+20090927
+	+ move leak-checking for comp_captab.c into _nc_leaks_tinfo() since
+	  that module since 20090711 is in libtinfo.
+	+ add configure option --enable-term-driver, to allow compiling with
+	  terminal-driver.  That is used in MinGW port, and (being somewhat
+	  more complicated) is an experimental alternative to the conventional
+	  termlib internals.  Currently, it requires the sp-funcs feature to
+	  be enabled.
+	+ completed integrating "sp-funcs" by Juergen Pfeifer in ncurses
+	  library (some work remains for forms library).
+
+20090919
+	+ document return code from define_key (report by Mike Gran).
+	+ make some symbolic links in the terminfo directory-tree shorter
+	  (patch by Daniel Jacobowitz, forwarded by Sven Joachim).).
+	+ fix some groff warnings in terminfo.5, etc., from recent Debian
+	  changes.
+	+ change ncv and op capabilities in sun-color terminfo entry to match
+	  Sun's entry for this (report by Laszlo Peter).
+	+ improve interix smso terminfo capability by using reverse rather than
+	  bold (report by Kristof Zelechovski).
+
+20090912
+	+ add some test programs (and make these use the same special keys
+	  by sharing linedata.h functions):
+	  test/test_addstr.c
+	  test/test_addwstr.c
+	  test/test_addchstr.c
+	  test/test_add_wchstr.c
+	+ correct internal _nc_insert_ch() to use _nc_insert_wch() when
+	  inserting wide characters, since the wins_wch() function that it used
+	  did not update the cursor position (report by Ciprian Craciun).
+
+20090906
+	+ fix typo s/is_timeout/is_notimeout/ which made "man is_notimeout" not
+	  work.
+	+ add null-pointer checks to other opaque-functions.
+	+ add is_pad() and is_subwin() functions for opaque access to WINDOW
+	  (discussion with Mark Dickinson).
+	+ correct merge to lib_newterm.c, which broke when sp-funcs was
+	  enabled.
+
+20090905
+	+ build-fix for building outside source-tree (report by Sven Joachim).
+	+ fix Debian lintian warning for man/tabs.1 by making section number
+	  agree with file-suffix (report by Sven Joachim).
+	+ continue integrating "sp-funcs" by Juergen Pfeifer (incomplete).
+
+20090829
+	+ workaround for bug in g++ 4.1-4.4 warnings for wattrset() macro on
+	  amd64 (Debian #542031).
+	+ fix typo in curs_mouse.3x (Debian #429198).
+
+20090822
+	+ continue integrating "sp-funcs" by Juergen Pfeifer (incomplete).
+
+20090815
+	+ correct use of terminfo capabilities for initializing soft-keys,
+	  broken in 20090510 merging.
+	+ modify wgetch() to ensure it checks SIGWINCH when it gets an error
+	  in non-blocking mode (patch by Clemens Ladisch).
+	+ use PATH_SEPARATOR symbol when substituting into run_tic.sh, to
+	  help with builds on non-Unix platforms such as OS/2 EMX.
+	+ modify scripting for misc/run_tic.sh to test configure script's
+	  $cross_compiling variable directly rather than comparing host/build
+	  compiler names (prompted by comment in GenToo #249363).
+	+ fix configure script option --with-database, which was coded as an
+	  enable-type switch.
+	+ build-fixes for --srcdir (report by Frederic L W Meunier).
+
+20090808
+	+ separate _nc_find_entry() and _nc_find_type_entry() from
+	  implementation details of hash function.
+
+20090803
+	+ add tabs.1 to man/man_db.renames
+	+ modify lib_addch.c to compensate for removal of wide-character test
+	  from unctrl() in 20090704 (Debian #539735).
+
+20090801
+	+ improve discussion in INSTALL for use of system's tic/infocmp for
+	  cross-compiling and building fallbacks.
+	+ modify test/demo_termcap.c to correspond better to options in
+	  test/demo_terminfo.c
+	+ continue integrating "sp-funcs" by Juergen Pfeifer (incomplete).
+	+ fix logic for 'V' in test/ncurses.c tests f/F.
+
+20090728
+	+ correct logic in tigetnum(), which caused tput program to treat all
+	  string capabilities as numeric (report by Rajeev V Pillai,
+	  cf: 20090711).
+
+20090725
+	+ continue integrating "sp-funcs" by Juergen Pfeifer (incomplete).
+
+20090718
+	+ fix a null-pointer check in _nc_format_slks() in lib_slk.c, from
+	  20090704 changes.
+	+ modify _nc_find_type_entry() to use hashing.
+	+ make CCHARW_MAX value configurable, noting that changing this would
+	  change the size of cchar_t, and would be ABI-incompatible.
+	+ modify test-programs, e.g,.  test/view.c, to address subtle
+	  differences between Tru64/Solaris and HPUX/AIX getcchar() return
+	  values.
+	+ modify length returned by getcchar() to count the trailing null
+	  which is documented in X/Open (cf: 20020427).
+	+ fixes for test programs to build/work on HPUX and AIX, etc.
+
+20090711
+	+ improve performance of tigetstr, etc., by using hashing code from tic.
+	+ minor fixes for memory-leak checking.
+	+ add test/demo_terminfo, for comparison with demo_termcap
+
+20090704
+	+ remove wide-character checks from unctrl() (patch by Clemens Ladisch).
+	+ revise wadd_wch() and wecho_wchar() to eliminate dependency on
+	  unctrl().
+	+ continue integrating "sp-funcs" by Juergen Pfeifer (incomplete).
+
+20090627
+	+ update llib-lncurses[wt] to use sp-funcs.
+	+ various code-fixes to build/work with --disable-macros configure
+	  option.
+	+ add several new files from Juergen Pfeifer which will be used when
+	  integration of "sp-funcs" is complete.  This includes a port to
+	  MinGW.
+
+20090613
+	+ move definition for NCURSES_WRAPPED_VAR back to ncurses_dll.h, to
+	  make includes of term.h without curses.h work (report by "Nix").
+	+ continue integrating "sp-funcs" by Juergen Pfeifer (incomplete).
+
+20090607
+	+ fix a regression in lib_tputs.c, from ongoing merges.
+
+20090606
+	+ continue integrating "sp-funcs" by Juergen Pfeifer (incomplete).
+
+20090530
+	+ fix an infinite recursion when adding a legacy-coding 8-bit value
+	  using insch() (report by Clemens Ladisch).
+	+ free home-terminfo string in del_curterm() (patch by Dan Weber).
+	+ continue integrating "sp-funcs" by Juergen Pfeifer (incomplete).
+
+20090523
+	+ continue integrating "sp-funcs" by Juergen Pfeifer (incomplete).
+
+20090516
+	+ work around antique BSD game's manipulation of stdscr, etc., versus
+	  SCREEN's copy of the pointer (Debian #528411).
+	+ add a cast to wattrset macro to avoid compiler warning when comparing
+	  its result against ERR (adapted from patch by Matt Kraii, Debian
+	  #528374).
+
+20090510
+	+ continue integrating "sp-funcs" by Juergen Pfeifer (incomplete).
+
+20090502
+	+ continue integrating "sp-funcs" by Juergen Pfeifer (incomplete).
+	+ add vwmterm terminfo entry (patch by Bryan Christ).
+
+20090425
+	+ continue integrating "sp-funcs" by Juergen Pfeifer (incomplete).
+
+20090419
+	+ build fix for _nc_free_and_exit() change in 20090418 (report by
+	  Christian Ebert).
+
+20090418
+	+ continue integrating "sp-funcs" by Juergen Pfeifer (incomplete).
+
+20090411
+	+ continue integrating "sp-funcs" by Juergen Pfeifer (incomplete).
+	  This change finishes merging for menu and panel libraries, does
+	  part of the form library.
+
+20090404
+	+ suppress configure check for static/dynamic linker flags for gcc on
+	  Darwin (report by Nelson Beebe).
+
+20090328
+	+ extend ansi.sys pfkey capability from kf1-kf10 to kf1-kf48, moving
+	  function key definitions from emx-base for consistency -TD
+	+ correct missing final 'p' in pfkey capability of ansi.sys-old (report
+	  by Kalle Olavi Niemitalo).
+	+ improve test/ncurses.c 'F' test, show combining characters in color.
+	+ quiet a false report by cppcheck in c++/cursesw.cc by eliminating
+	  a temporary variable.
+	+ use _nc_doalloc() rather than realloc() in a few places in ncurses
+	  library to avoid leak in out-of-memory condition (reports by William
+	  Egert and Martin Ettl based on cppcheck tool).
+	+ add --with-ncurses-wrap-prefix option to test/configure (discussion
+	  with Charles Wilson).
+	+ use ncurses*-config scripts if available for test/configure.
+	+ update test/aclocal.m4 and test/configure
+	> patches by Charles Wilson:
+	+ modify CF_WITH_LIBTOOL configure check to allow unreleased libtool
+	  version numbers (e.g.  which include alphabetic chars, as well as
+	  digits, after the final '.').
+	+ improve use of -no-undefined option for libtool by setting an
+	  intermediate variable LT_UNDEF in the configure script, and then
+	  using that in the libtool link-commands.
+	+ fix an missing use of NCURSES_PUBLIC_VAR() in tinfo/MKcodes.awk
+	  from 20090321 changes.
+	+ improve mk-1st.awk script by writing separate cases for the
+	  LIBTOOL_LINK command, depending on which library (ncurses, ticlib,
+	  termlib) is to be linked.
+	+ modify configure.in to allow broken-linker configurations, not just
+	  enable-reentrant, to set public wrap prefix.
+
+20090321
+	+ add TICS_LIST and SHLIB_LIST to allow libtool 2.2.6 on Cygwin to
+	  build with tic and term libraries (patch by Charles Wilson).
+	+ add -no-undefined option to libtool for Cygwin, MinGW, U/Win and AIX
+	  (report by Charles Wilson).
+	+ fix definition for c++/Makefile.in's SHLIB_LIST, which did not list
+	  the form, menu or panel libraries (patch by Charles Wilson).
+	+ add configure option --with-wrap-prefix to allow setting the prefix
+	  for functions used to wrap global variables to something other than
+	  "_nc_" (discussion with Charles Wilson).
+
+20090314
+	+ modify scripts to generate ncurses*-config and pc-files to add
+	  dependency for tinfo library (patch by Charles Wilson).
+	+ improve comparison of program-names when checking for linked flavors
+	  such as "reset" by ignoring the executable suffix (reports by Charles
+	  Wilson, Samuel Thibault and Cedric Bretaudeau on Cygwin mailing
+	  list).
+	+ suppress configure check for static/dynamic linker flags for gcc on
+	  Solaris 10, since gcc is confused by absence of static libc, and
+	  does not switch back to dynamic mode before finishing the libraries
+	  (reports by Joel Bertrand, Alan Pae).
+	+ minor fixes to Intel compiler warning checks in configure script.
+	+ modify _nc_leaks_tinfo() so leak-checking in test/railroad.c works.
+	+ modify set_curterm() to make broken-linker configuration work with
+	  changes from 20090228 (report by Charles Wilson).
+
+20090228
+	+ continue integrating "sp-funcs" by Juergen Pfeifer (incomplete).
+	+ modify declaration of cur_term when broken-linker is used, but
+	  enable-reentrant is not, to match pre-5.7 (report by Charles Wilson).
+
+20090221
+	+ continue integrating "sp-funcs" by Juergen Pfeifer (incomplete).
+
+20090214
+	+ add configure script --enable-sp-funcs to enable the new set of
+	  extended functions.
+	+ start integrating patches by Juergen Pfeifer:
+	  + add extended functions which specify the SCREEN pointer for several
+	    curses functions which use the global SP (these are incomplete;
+	    some internals work is needed to complete these).
+	  + add special cases to configure script for MinGW port.
+
+20090207
+	+ update several configure macros from lynx changes
+	  + append (not prepend) to CFLAGS/CPPFLAGS
+	  + change variable from PATHSEP to PATH_SEPARATOR
+	+ improve install-rules for pc-files (patch by Miroslav Lichvar).
+	  + make it work with $DESTDIR
+	  + create the pkg-config library directory if needed.
+
+20090124
+	+ modify init_pair() to allow caller to create extra color pairs beyond
+	  the color_pairs limit, which use default colors (request by Emanuele
+	  Giaquinta).
+	+ add misc/terminfo.tmp and misc/*.pc to "sources" rule.
+	+ fix typo "==" where "=" is needed in ncurses-config.in and
+	  gen-pkgconfig.in files (Debian #512161).
+
+20090117
+	+ add -shared option to MK_SHARED_LIB when -Bsharable is used, for
+	  *BSD's, without which "main" might be one of the shared library's
+	  dependencies (report/analysis by Ken Dickey).
+	+ modify waddch_literal(), updating line-pointer after a multicolumn
+	  character is found to not fit on the current row, and wrapping is
+	  done.  Since the line-pointer was not updated, the wrapped
+	  multicolumn character was written to the beginning of the current row
+	  (cf: 20041023, reported by "Nick" regarding problem with ncmpc
+	  http://musicpd.org/mantis/bug_view_page.php?bug_id=1930).
+
+20090110
+	+ add screen.Eterm terminfo entry (GenToo #124887) -TD
+	+ modify adacurses-config to look for ".ali" files in the adalib
+	  directory.
+	+ correct install for Ada95, which omitted libAdaCurses.a used in
+	  adacurses-config
+	+ change install for adacurses-config to provide additional flavors
+	  such as adacursesw-config, for ncursesw (GenToo #167849).
+
+20090105
+	+ remove undeveloped feature in ncurses-config.in for setting
+	  prefix variable.
+	+ recent change to ncurses-config.in did not take into account the
+	  --disable-overwrite option, which sets $includedir to the
+	  subdirectory and using just that for a -I option does not work - fix
+	  (report by Frederic L W Meunier).
+
+20090104
+	+ modify gen-pkgconfig.in to eliminate a dependency on rpath when
+	  deciding whether to add $LIBS to --libs output; that should be shown
+	  for the ncurses and tinfo libraries without taking rpath into
+	  account.
+	+ fix an overlooked change from $AR_OPTS to $ARFLAGS in mk-1st.awk,
+	  used in static libraries (report by Marty Jack).
+
+20090103
+	+ add a configure-time check to pick a suitable value for
+	  CC_SHARED_OPTS for Solaris (report by Dagobert Michelsen).
+	+ add configure --with-pkg-config and --enable-pc-files options, along
+	  with misc/gen-pkgconfig.in which can be used to generate ".pc" files
+	  for pkg-config (request by Jan Engelhardt).
+	+ use $includedir symbol in misc/ncurses-config.in, add --includedir
+	  option.
+	+ change makefiles to use $ARFLAGS rather than $AR_OPTS, provide a
+	  configure check to detect whether a "-" is needed before "ar"
+	  options.
+	+ update config.guess, config.sub from
+		http://savannah.gnu.org/projects/config
+
+20081227
+	+ modify mk-1st.awk to work with extra categories for tinfo library.
+	+ modify configure script to allow building shared libraries with gcc
+	  on AIX 5 or 6 (adapted from patch by Lital Natan).
+
+20081220
+	+ modify to omit the opaque-functions from lib_gen.o when
+	  --disable-ext-funcs is used.
+	+ add test/clip_printw.c to illustrate how to use printw without
+	  wrapping.
+	+ modify ncurses 'F' test to demo wborder_set() with colored lines.
+	+ modify ncurses 'f' test to demo wborder() with colored lines.
+
+20081213
+	+ add check for failure to open hashed-database needed for db4.6
+	  (GenToo #245370).
+	+ corrected --without-manpages option; previous change only suppressed
+	  the auxiliary rules install.man and uninstall.man
+	+ add case for FreeMINT to configure macro CF_XOPEN_SOURCE (patch from
+	  GenToo #250454).
+	+ fixes from NetBSD port at
+	  http://cvsweb.netbsd.org/bsdweb.cgi/pkgsrc/devel/ncurses/patches
+	  patch-ac (build-fix for DragonFly)
+	  patch-ae (use INSTALL_SCRIPT for installing misc/ncurses*-config).
+	+ improve configure script macros CF_HEADER_PATH and CF_LIBRARY_PATH
+	  by adding CFLAGS, CPPFLAGS and LDFLAGS, LIBS values to the
+	  search-lists.
+	+ correct title string for keybound manpage (patch by Frederic Culot,
+	  OpenBSD documentation/6019),
+
+20081206
+	+ move del_curterm() call from _nc_freeall() to _nc_leaks_tinfo() to
+	  work for progs/clear, progs/tabs, etc.
+	+ correct buffer-size after internal resizing of wide-character
+	  set_field_buffer(), broken in 20081018 changes (report by Mike Gran).
+	+ add "-i" option to test/filter.c to tell it to use initscr() rather
+	  than newterm(), to investigate report on comp.unix.programmer that
+	  ncurses would clear the screen in that case (it does not - the issue
+	  was xterm's alternate screen feature).
+	+ add check in mouse-driver to disable connection if GPM returns a
+	  zero, indicating that the connection is closed (Debian #506717,
+	  adapted from patch by Samuel Thibault).
+
+20081129
+	+ improve a workaround in adding wide-characters, when a control
+	  character is found.  The library (cf: 20040207) uses unctrl() to
+	  obtain a printable version of the control character, but was not
+	  passing color or video attributes.
+	+ improve test/ncurses.c 'a' test, using unctrl() more consistently to
+	  display meta-characters.
+	+ turn on _XOPEN_CURSES definition in curses.h
+	+ add eterm-color entry (report by Vincent Lefevre) -TD
+	+ correct use of key_name() in test/ncurses.c 'A' test, which only
+	  displays wide-characters, not key-codes since 20070612 (report by
+	  Ricardo Cantu).
+
+20081122
+	+ change _nc_has_mouse() to has_mouse(), reflect its use in C++ and
+	  Ada95 (patch by Juergen Pfeifer).
+	+ document in TO-DO an issue with Cygwin's package for GNAT (report
+	  by Mike Dennison).
+	+ improve error-checking of command-line options in "tabs" program.
+
+20081115
+	+ change several terminfo entries to make consistent use of ANSI
+	  clear-all-tabs -TD
+	+ add "tabs" program (prompted by Debian #502260).
+	+ add configure --without-manpages option (request by Mike Frysinger).
+
+20081102 5.7 release for upload to ftp.gnu.org
+
+20081025
+	+ add a manpage to discuss memory leaks.
+	+ add support for shared libraries for QNX (other than libtool, which
+	  does not work well on that platform).
+	+ build-fix for QNX C++ binding.
+
+20081018
+	+ build-fixes for OS/2 EMX.
+	+ modify form library to accept control characters such as newline
+	  in set_field_buffer(), which is compatible with Solaris (report by
+	  Nit Khair).
+	+ modify configure script to assume --without-hashed-db when
+	  --disable-database is used.
+	+ add "-e" option in ncurses/Makefile.in when generating source-files
+	  to force earlier exit if the build environment fails unexpectedly
+	  (prompted by patch by Adrian Bunk).
+	+ change configure script to use CF_UTF8_LIB, improved variant of
+	  CF_LIBUTF8.
+
+20081012
+	+ add teraterm4.59 terminfo entry, use that as primary teraterm entry, rename
+	  original to teraterm2.3 -TD
+	+ update "gnome" terminfo to 2.22.3 -TD
+	+ update "konsole" terminfo to 1.6.6, needs today's fix for tic -TD
+	+ add "aterm" terminfo -TD
+	+ add "linux2.6.26" terminfo -TD
+	+ add logic to tic for cancelling strings in user-defined capabilities,
+	  overlooked til now.
+
+20081011
+	+ regenerated html documentation.
+	+ add -m and -s options to test/keynames.c and test/key_names.c to test
+	  the meta() function with keyname() or key_name(), respectively.
+	+ correct return value of key_name() on error; it is null.
+	+ document some unresolved issues for rpath and pthreads in TO-DO.
+	+ fix a missing prototype for ioctl() on OpenBSD in tset.c
+	+ add configure option --disable-tic-depends to make explicit whether
+	  tic library depends on ncurses/ncursesw library, amends change from
+	  20080823 (prompted by Debian #501421).
+
+20081004
+	+ some build-fixes for configure --disable-ext-funcs (incomplete, but
+	  works for C/C++ parts).
+	+ improve configure-check for awks unable to handle large strings, e.g.
+	  AIX 5.1 whose awk silently gives up on large printf's.
+
+20080927
+	+ fix build for --with-dmalloc by workaround for redefinition of
+	  strndup between string.h and dmalloc.h
+	+ fix build for --disable-sigwinch
+	+ add environment variable NCURSES_GPM_TERMS to allow override to use
+	  GPM on terminals other than "linux", etc.
+	+ disable GPM mouse support when $TERM does not happen to contain
+	  "linux", since Gpm_Open() no longer limits its assertion to terminals
+	  that it might handle, e.g., within "screen" in xterm.
+	+ reset mouse file-descriptor when unloading GPM library (report by
+	  Miroslav Lichvar).
+	+ fix build for --disable-leaks --enable-widec --with-termlib
+	> patch by Juergen Pfeifer:
+	+ use improved initialization for soft-label keys in Ada95 sample code.
+	+ discard internal symbol _nc_slk_format (unused since 20080112).
+	+ move call of slk_paint_info() from _nc_slk_initialize() to
+	  slk_intern_refresh(), improving initialization.
+
+20080925
+	+ fix bug in mouse code for GPM from 20080920 changes (reported in
+	  Debian #500103, also Miroslav Lichvar).
+
+20080920
+	+ fix shared-library rules for cygwin with tic- and tinfo-libraries.
+	+ fix a memory leak when failure to connect to GPM.
+	+ correct check for notimeout() in wgetch() (report on linux.redhat
+	  newsgroup by FurtiveBertie).
+	+ add an example warning-suppression file for valgrind,
+	  misc/ncurses.supp (based on example from Reuben Thomas)
+
+20080913
+	+ change shared-library configuration for OpenBSD, make rpath work.
+	+ build-fixes for using libutf8, e.g., on OpenBSD 3.7
+
+20080907
+	+ corrected fix for --enable-weak-symbols (report by Frederic L W
+	  Meunier).
+
+20080906
+	+ corrected gcc options for building shared libraries on IRIX64.
+	+ add configure check for awk programs unable to handle big-strings,
+	  use that to improve the default for --enable-big-strings option.
+	+ makefile-fixes for --enable-weak-symbols (report by Frederic L W
+	  Meunier).
+	+ update test/configure script.
+	+ adapt ifdef's from library to make test/view.c build when mbrtowc()
+	  is unavailable, e.g., with HPUX 10.20.
+	+ add configure check for wcsrtombs, mbsrtowcs, which are used in
+	  test/ncurses.c, and use wcstombs, mbstowcs instead if available,
+	  fixing build of ncursew for HPUX 11.00
+
+20080830
+	+ fixes to make Ada95 demo_panels() example work.
+	+ modify Ada95 'rain' test program to accept keyboard commands like the
+	  C-version.
+	+ modify BeOS-specific ifdef's to build on Haiku (patch by Scott
+	  Mccreary).
+	+ add configure-check to see if the std namespace is legal for cerr
+	  and endl, to fix a build issue with Tru64.
+	+ consistently use NCURSES_BOOL in lib_gen.c
+	+ filter #line's from lib_gen.c
+	+ change delimiter in MKlib_gen.sh from '%' to '@', to avoid
+	  substitution by IBM xlc to '#' as part of its extensions to digraphs.
+	+ update config.guess, config.sub from
+		http://savannah.gnu.org/projects/config
+	  (caveat - its maintainer removed support for older Linux systems).
+
+20080823
+	+ modify configure check for pthread library to work with OSF/1 5.1,
+	  which uses #define's to associate its header and library.
+	+ use pthread_mutexattr_init() for initializing pthread_mutexattr_t,
+	  makes threaded code work on HPUX 11.23
+	+ fix a bug in demo_menus in freeing menus (cf: 20080804).
+	+ modify configure script for the case where tic library is used (and
+	  possibly renamed) to remove its dependency upon ncurses/ncursew
+	  library (patch by Dr Werner Fink).
+	+ correct manpage for menu_fore() which gave wrong default for
+	  the attribute used to display a selected entry (report by Mike Gran).
+	+ add Eterm-256color, Eterm-88color and rxvt-88color (prompted by
+	  Debian #495815) -TD
+
+20080816
+	+ add configure option --enable-weak-symbols to turn on new feature.
+	+ add configure-check for availability of weak symbols.
+	+ modify linkage with pthread library to use weak symbols so that
+	  applications not linked to that library will not use the mutexes,
+	  etc.  This relies on gcc, and may be platform-specific (patch by Dr
+	  Werner Fink).
+	+ add note to INSTALL to document limitation of renaming of tic library
+	  using the --with-ticlib configure option (report by Dr Werner Fink).
+	+ document (in manpage) why tputs does not detect I/O errors (prompted
+	  by comments by Samuel Thibault).
+	+ fix remaining warnings from Klocwork report.
+
+20080804
+	+ modify _nc_panelhook() data to account for a permanent memory leak.
+	+ fix memory leaks in test/demo_menus
+	+ fix most warnings from Klocwork tool (report by Larry Zhou).
+	+ modify configure script CF_XOPEN_SOURCE macro to add case for
+	  "dragonfly" from xterm #236 changes.
+	+ modify configure script --with-hashed-db to let $LIBS override the
+	  search for the db library (prompted by report by Samson Pierre).
+
+20080726
+	+ build-fixes for gcc 4.3.1 (changes to gnat "warnings", and C inlining
+	  thresholds).
+
+20080713
+	+ build-fix (reports by Christian Ebert, Funda Wang).
+
+20080712
+	+ compiler-warning fixes for Solaris.
+
+20080705
+	+ use NCURSES_MOUSE_MASK() in definition of BUTTON_RELEASE(), etc., to
+	  make those work properly with the "--enable-ext-mouse" configuration
+	  (cf: 20050205).
+	+ improve documentation of build-cc options in INSTALL.
+	+ work-around a bug in gcc 4.2.4 on AIX, which does not pass the
+	  -static/-dynamic flags properly to linker, causing test/bs to
+	  not link.
+
+20080628
+	+ correct some ifdef's needed for the broken-linker configuration.
+	+ make debugging library's $BAUDRATE feature work for termcap
+	  interface.
+	+ make $NCURSES_NO_PADDING feature work for termcap interface (prompted
+	  by comment on FreeBSD mailing list).
+	+ add screen.mlterm terminfo entry -TD
+	+ improve mlterm and mlterm+pcfkeys terminfo entries -TD
+
+20080621
+	+ regenerated html documentation.
+	+ expand manpage description of parameters for form_driver() and
+	  menu_driver() (prompted by discussion with Adam Spragg).
+	+ add null-pointer checks for cur_term in baudrate() and
+	  def_shell_mode(), def_prog_mode()
+	+ fix some memory leaks in delscreen() and wide acs.
+
+20080614
+	+ modify test/ditto.c to illustrate multi-threaded use_screen().
+	+ change CC_SHARED_OPTS from -KPIC to -xcode=pic32 for Solaris.
+	+ add "-shared" option to MK_SHARED_LIB for gcc on Solaris (report
+	  by Poor Yorick).
+
+20080607
+	+ finish changes to wgetch(), making it switch as needed to the
+	  window's actual screen when calling wrefresh() and wgetnstr().  That
+	  allows wgetch() to get used concurrently in different threads with
+	  some minor restrictions, e.g., the application should not delete a
+	  window which is being used in a wgetch().
+	+ simplify mutex's, combining the window- and screen-mutex's.
+
+20080531
+	+ modify wgetch() to use the screen which corresponds to its window
+	  parameter rather than relying on SP; some dependent functions still
+	  use SP internally.
+	+ factor out most use of SP in lib_mouse.c, using parameter.
+	+ add internal _nc_keyname(), replacing keyname() to associate with a
+	  particular SCREEN rather than the global SP.
+	+ add internal _nc_unctrl(), replacing unctrl() to associate with a
+	  particular SCREEN rather than the global SP.
+	+ add internal _nc_tracemouse(), replacing _tracemouse() to eliminate
+	  its associated global buffer _nc_globals.tracemse_buf now in SCREEN.
+	+ add internal _nc_tracechar(), replacing _tracechar() to use SCREEN in
+	  preference to the global _nc_globals.tracechr_buf buffer.
+
+20080524
+	+ modify _nc_keypad() to make it switch temporarily as needed to the
+	  screen which must be updated.
+	+ wrap cur_term variable to help make _nc_keymap() thread-safe, and
+	  always set the screen's copy of this variable in set_curterm().
+	+ restore curs_set() state after endwin()/refresh() (report/patch
+	  Miroslav Lichvar)
+
+20080517
+	+ modify configure script to note that --enable-ext-colors and
+	  --enable-ext-mouse are not experimental, but extensions from
+	  the ncurses ABI 5.
+	+ corrected manpage description of setcchar() (discussion with
+	  Emanuele Giaquinta).
+	+ fix for adding a non-spacing character at the beginning of a line
+	  (report/patch by Miroslav Lichvar).
+
+20080503
+	+ modify screen.* terminfo entries using new screen+fkeys to fix
+	  overridden keys in screen.rxvt (Debian #478094) -TD
+	+ modify internal interfaces to reduce wgetch()'s dependency on the
+	  global SP.
+	+ simplify some loops with macros each_screen(), each_window() and
+	  each_ripoff().
+
+20080426
+	+ continue modifying test/ditto.c toward making it demonstrate
+	  multithreaded use_screen(), using fifos to pass data between screens.
+	+ fix typo in form.3x (report by Mike Gran).
+
+20080419
+	+ add screen.rxvt terminfo entry -TD
+	+ modify tic -f option to format spaces as \s to prevent them from
+	  being lost when that is read back in unformatted strings.
+	+ improve test/ditto.c, using a "talk"-style layout.
+
+20080412
+	+ change test/ditto.c to use openpty() and xterm.
+	+ add locks for copywin(), dupwin(), overlap(), overlay() on their
+	  window parameters.
+	+ add locks for initscr() and newterm() on updates to the SCREEN
+	  pointer.
+	+ finish table in curs_thread.3x manpage.
+
+20080405
+	+ begin table in curs_thread.3x manpage describing the scope of data
+	  used by each function (or symbol) for threading analysis.
+	+ add null-pointer checks to setsyx() and getsyx() (prompted by
+	  discussion by Martin v. Lowis and Jeroen Ruigrok van der Werven on
+	  python-dev2 mailing list).
+
+20080329
+	+ add null-pointer checks in set_term() and delscreen().
+	+ move _nc_windows into _nc_globals, since windows can be pads, which
+	  are not associated with a particular screen.
+	+ change use_screen() to pass the SCREEN* parameter rather than
+	  stdscr to the callback function.
+	+ force libtool to use tag for 'CC' in case it does not detect this,
+	  e.g., on aix when using CC=powerpc-ibm-aix5.3.0.0-gcc
+	  (report/patch by Michael Haubenwallner).
+	+ override OBJEXT to "lo" when building with libtool, to work on
+	  platforms such as AIX where libtool may use a different suffix for
+	  the object files than ".o" (report/patch by Michael Haubenwallner).
+	+ add configure --with-pthread option, for building with the POSIX
+	  thread library.
+
+20080322
+	+ fill in extended-color pair two more places in wbkgrndset() and
+	  waddch_nosync() (prompted by Sedeno's patch).
+	+ fill in extended-color pair in _nc_build_wch() to make colors work
+	  for wide-characters using extended-colors (patch by Alejandro R
+	  Sedeno).
+	+ add x/X toggles to ncurses.c C color test to test/demo
+	  wide-characters with extended-colors.
+	+ add a/A toggles to ncurses.c c/C color tests.
+	+ modify test/ditto.c to use use_screen().
+	+ finish modifying test/rain.c to demonstrate threads.
+
+20080308
+	+ start modifying test/rain.c for threading demo.
+	+ modify test/ncurses.c to make 'f' test accept the f/F/b/F/</> toggles
+	  that the 'F' accepts.
+	+ modify test/worm.c to show trail in reverse-video when other threads
+	  are working concurrently.
+	+ fix a deadlock from improper nesting of mutexes for windowlist and
+	  window.
+
+20080301
+	+ fixes from 20080223 resolved issue with mutexes; change to use
+	  recursive mutexes to fix memory leak in delwin() as called from
+	  _nc_free_and_exit().
+
+20080223
+	+ fix a size-difference in _nc_globals which caused hanging of mutex
+	  lock/unlock when termlib was built separately.
+
+20080216
+	+ avoid using nanosleep() in threaded configuration since that often
+	  is implemented to suspend the entire process.
+
+20080209
+	+ update test programs to build/work with various UNIX curses for
+	  comparisons.  This was to reinvestigate statement in X/Open Curses
+	  that insnstr and winsnstr perform wrapping.  None of the Unix-branded
+	  implementations do this, as noted in manpage (cf: 20040228).
+
+20080203
+	+ modify _nc_setupscreen() to set the legacy-coding value the same
+	  for both narrow/wide models.  It had been set only for wide model,
+	  but is needed to make unctrl() work with locale in the narrow model.
+	+ improve waddch() and winsch() handling of EILSEQ from mbrtowc() by
+	  using unctrl() to display illegal bytes rather than trying to append
+	  further bytes to make up a valid sequence (reported by Andrey A
+	  Chernov).
+	+ modify unctrl() to check codes in 128-255 range versus isprint().
+	  If they are not printable, and locale was set, use a "M-" or "~"
+	  sequence.
+
+20080126
+	+ improve threading in test/worm.c (wrap refresh calls, and KEY_RESIZE
+	  handling).  Now it hangs in napms(), no matter whether nanosleep()
+	  or poll() or select() are used on Linux.
+
+20080119
+	+ fixes to build with --disable-ext-funcs
+	+ add manpage for use_window and use_screen.
+	+ add set_tabsize() and set_escdelay() functions.
+
+20080112
+	+ remove recursive-mutex definitions, finish threading demo for worm.c
+	+ remove a redundant adjustment of lines in resizeterm.c's
+	  adjust_window() which caused occasional misadjustment of stdscr when
+	  softkeys were used.
+
+20080105
+	+ several improvements to terminfo entries based on xterm #230 -TD
+	+ modify MKlib_gen.sh to handle keyname/key_name prototypes, so the
+	  "link_test" builds properly.
+	+ fix for toe command-line options -u/-U to ensure filename is given.
+	+ fix allocation-size for command-line parsing in infocmp from 20070728
+	  (report by Miroslav Lichvar)
+	+ improve resizeterm() by moving ripped-off lines, and repainting the
+	  soft-keys (report by Katarina Machalkova)
+	+ add clarification in wclear's manpage noting that the screen will be
+	  cleared even if a subwindow is cleared (prompted by Christer Enfors
+	  question).
+	+ change test/ncurses.c soft-key tests to work with KEY_RESIZE.
+
+20071222
+	+ continue implementing support for threading demo by adding mutex
+	  for delwin().
+
+20071215
+	+ add several functions to C++ binding which wrap C functions that
+	  pass a WINDOW* parameter (request by Chris Lee).
+
+20071201
+	+ add note about configure options needed for Berkeley database to the
+	  INSTALL file.
+	+ improve checks for version of Berkeley database libraries.
+	+ amend fix for rpath to not modify LDFLAGS if the platform has no
+	  applicable transformation (report by Christian Ebert, cf: 20071124).
+
+20071124
+	+ modify configure option --with-hashed-db to accept a parameter which
+	  is the install-prefix of a given Berkeley Database (prompted by
+	  pierre4d2 comments).
+	+ rewrite wrapper for wcrtomb(), making it work on Solaris.  This is
+	  used in the form library to determine the length of the buffer needed
+	  by field_buffer (report by Alfred Fung).
+	+ remove unneeded window-parameter from C++ binding for wresize (report
+	  by Chris Lee).
+
+20071117
+	+ modify the support for filesystems which do not support mixed-case to
+	  generate 2-character (hexadecimal) codes for the lower-level of the
+	  filesystem terminfo database (request by Michail Vidiassov).
+	+ add configure option --enable-mixed-case, to allow overriding the
+	  configure script's check if the filesystem supports mixed-case
+	  filenames.
+	+ add wresize() to C++ binding (request by Chris Lee).
+	+ define NCURSES_EXT_FUNCS and NCURSES_EXT_COLORS in curses.h to make
+	  it simpler to tell if the extended functions and/or colors are
+	  declared.
+
+20071103
+	+ update memory-leak checks for changes to names.c and codes.c
+	+ correct acsc strings in h19, z100 (patch by Benjamin C W Sittler).
+
+20071020
+	+ continue implementing support for threading demo by adding mutex
+	  for use_window().
+	+ add mrxvt terminfo entry, add/fix xterm building blocks for modified
+	  cursor keys -TD
+	+ compile with FreeBSD "contemporary" TTY interface (patch by
+	  Rong-En Fan).
+
+20071013
+	+ modify makefile rules to allow clear, tput and tset to be built
+	  without libtic.  The other programs (infocmp, tic and toe) rely on
+	  that library.
+	+ add/modify null-pointer checks in several functions for SP and/or
+	  the WINDOW* parameter (report by Thorben Krueger).
+	+ fixes for field_buffer() in formw library (see Redhat #310071,
+	  patches by Miroslav Lichvar).
+	+ improve performance of NCURSES_CHAR_EQ code (patch by Miroslav
+	  Lichvar).
+	+ update/improve mlterm and rxvt terminfo entries, e.g., for
+	  the modified cursor- and keypad-keys -TD
+
+20071006
+	+ add code to curses.priv.h ifdef'd with NCURSES_CHAR_EQ, which
+	  changes the CharEq() macro to an inline function to allow comparing
+	  cchar_t struct's without comparing gaps in a possibly unpacked
+	  memory layout (report by Miroslav Lichvar).
+
+20070929
+	+ add new functions to lib_trace.c to setup mutex's for the _tracef()
+	  calls within the ncurses library.
+	+ for the reentrant model, move _nc_tputs_trace and _nc_outchars into
+	  the SCREEN.
+	+ start modifying test/worm.c to provide threading demo (incomplete).
+	+ separated ifdef's for some BSD-related symbols in tset.c, to make
+	  it compile on LynxOS (report by Greg Gemmer).
+20070915
+	+ modify Ada95/gen/Makefile to use shlib script, to simplify building
+	  shared-library configuration on platforms lacking rpath support.
+	+ build-fix for Ada95/src/Makefile to reflect changed dependency for
+	  the terminal-interface-curses-aux.adb file which is now generated.
+	+ restructuring test/worm.c, for use_window() example.
+
+20070908
+	+ add use_window() and use_screen() functions, to develop into support
+	  for threaded library (incomplete).
+	+ fix typos in man/curs_opaque.3x which kept the install script from
+	  creating symbolic links to two aliases created in 20070818 (report by
+	  Rong-En Fan).
+
+20070901
+	+ remove a spurious newline from output of html.m4, which caused links
+	  for Ada95 html to be incorrect for the files generated using m4.
+	+ start investigating mutex's for SCREEN manipulation (incomplete).
+	+ minor cleanup of codes.c/names.c for --enable-const
+	+ expand/revise "Routine and Argument Names" section of ncurses manpage
+	  to address report by David Givens in newsgroup discussion.
+	+ fix interaction between --without-progs/--with-termcap configure
+	  options (report by Michail Vidiassov).
+	+ fix typo in "--disable-relink" option (report by Michail Vidiassov).
+
+20070825
+	+ fix a sign-extension bug in infocmp's repair_acsc() function
+	  (cf: 971004).
+	+ fix old configure script bug which prevented "--disable-warnings"
+	  option from working (patch by Mike Frysinger).
+
+20070818
+	+ add 9term terminal description (request by Juhapekka Tolvanen) -TD
+	+ modify comp_hash.c's string output to avoid misinterpreting a null
+	  "\0" followed by a digit.
+	+ modify MKnames.awk and MKcodes.awk to support big-strings.
+	  This only applies to the cases (broken linker, reentrant) where
+	  the corresponding arrays are accessed via wrapper functions.
+	+ split MKnames.awk into two scripts, eliminating the shell redirection
+	  which complicated the make process and also the bogus timestamp file
+	  which was introduced to fix "make -j".
+	+ add test/test_opaque.c, test/test_arrays.c
+	+ add wgetscrreg() and wgetparent() for applications that may need it
+	  when NCURSES_OPAQUE is defined (prompted by Bryan Christ).
+
+20070812
+	+ amend treatment of infocmp "-r" option to retain the 1023-byte limit
+	  unless "-T" is given (cf: 981017).
+	+ modify comp_captab.c generation to use big-strings.
+	+ make _nc_capalias_table and _nc_infoalias_table private accessed via
+	  _nc_get_alias_table() since the tables are used only within the tic
+	  library.
+	+ modify configure script to skip Intel compiler in CF_C_INLINE.
+	+ make _nc_info_hash_table and _nc_cap_hash_table private accessed via
+	  _nc_get_hash_table() since the tables are used only within the tic
+	  library.
+
+20070728
+	+ make _nc_capalias_table and _nc_infoalias_table private, accessed via
+	  _nc_get_alias_table() since they are used only by parse_entry.c
+	+ make _nc_key_names private since it is used only by lib_keyname.c
+	+ add --disable-big-strings configure option to control whether
+	  unctrl.c is generated using the big-string optimization - which may
+	  use strings longer than supported by a given compiler.
+	+ reduce relocation tables for tic, infocmp by changing type of
+	  internal hash tables to short, and make those private symbols.
+	+ eliminate large fixed arrays from progs/infocmp.c
+
+20070721
+	+ change winnstr() to stop at the end of the line (cf: 970315).
+	+ add test/test_get_wstr.c
+	+ add test/test_getstr.c
+	+ add test/test_inwstr.c
+	+ add test/test_instr.c
+
+20070716
+	+ restore a call to obtain screen-size in _nc_setupterm(), which
+	  is used in tput and other non-screen applications via setupterm()
+	  (Debian #433357, reported by Florent Bayle, Christian Ohm,
+	  cf: 20070310).
+
+20070714
+	+ add test/savescreen.c test-program
+	+ add check to trace-file open, if the given name is a directory, add
+	  ".log" to the name and try again.
+	+ add konsole-256color entry -TD
+	+ add extra gcc warning options from xterm.
+	+ minor fixes for ncurses/hashmap test-program.
+	+ modify configure script to quiet c++ build with libtool when the
+	  --disable-echo option is used.
+	+ modify configure script to disable ada95 if libtool is selected,
+	  writing a warning message (addresses FreeBSD #114493).
+	+ update config.guess, config.sub
+
+20070707
+	+ add continuous-move "M" to demo_panels to help test refresh changes.
+	+ improve fix for refresh of window on top of multi-column characters,
+	  taking into account some split characters on left/right window
+	  boundaries.
+
+20070630
+	+ add "widec" row to _tracedump() output to help diagnose remaining
+	  problems with multi-column characters.
+	+ partial fix for refresh of window on top of multi-column characters
+	  which are partly overwritten (report by Sadrul H Chowdhury).
+	+ ignore A_CHARTEXT bits in vidattr() and vid_attr(), in case
+	  multi-column extension bits are passed there.
+	+ add setlocale() call to demo_panels.c, needed for wide-characters.
+	+ add some output flags to _nc_trace_ttymode to help diagnose a bug
+	  report by Larry Virden, i.e., ONLCR, OCRNL, ONOCR and ONLRET,
+
+20070623
+	+ add test/demo_panels.c
+	+ implement opaque version of setsyx() and getsyx().
+
+20070612
+	+ corrected xterm+pcf2 terminfo modifiers for F1-F4, to match xterm
+	  #226 -TD
+	+ split-out key_name() from MKkeyname.awk since it now depends upon
+	  wunctrl() which is not in libtinfo (report by Rong-En Fan).
+
+20070609
+	+ add test/key_name.c
+	+ add stdscr cases to test/inchs.c and test/inch_wide.c
+	+ update test/configure
+	+ correct formatting of DEL (0x7f) in _nc_vischar().
+	+ null-terminate result of wunctrl().
+	+ add null-pointer check in key_name() (report by Andreas Krennmair,
+	  cf: 20020901).
+
+20070602
+	+ adapt mouse-handling code from menu library in form-library
+	  (discussion with Clive Nicolson).
+	+ add a modification of test/dots.c, i.e., test/dots_mvcur.c to
+	  illustrate how to use mvcur().
+	+ modify wide-character flavor of SetAttr() to preserve the
+	  WidecExt() value stored in the .attr field, e.g., in case it
+	  is overwritten by chgat (report by Aleksi Torhamo).
+	+ correct buffer-size for _nc_viswbuf2n() (report by Aleksi Torhamo).
+	+ build-fixes for Solaris 2.6 and 2.7 (patch by Peter O'Gorman).
+
+20070526
+	+ modify keyname() to use "^X" form only if meta() has been called, or
+	  if keyname() is called without initializing curses, e.g., via
+	  initscr() or newterm() (prompted by LinuxBase #1604).
+	+ document some portability issues in man/curs_util.3x
+	+ add a shadow copy of TTY buffer to _nc_prescreen to fix applications
+	  broken by moving that data into SCREEN (cf: 20061230).
+
+20070512
+	+ add 'O' (wide-character panel test) in ncurses.c to demonstrate a
+	  problem reported by Sadrul H Chowdhury with repainting parts of
+	  a fullwidth cell.
+	+ modify slk_init() so that if there are preceding calls to
+	  ripoffline(), those affect the available lines for soft-keys (adapted
+	  from patch by Clive Nicolson).
+	+ document some portability issues in man/curs_getyx.3x
+
+20070505
+	+ fix a bug in Ada95/samples/ncurses which caused a variable to
+	  become uninitialized in the "b" test.
+	+ fix Ada95/gen/Makefile.in adahtml rule to account for recent
+	  movement of files, fix a few incorrect manpage references in the
+	  generated html.
+	+ add Ada95 binding to _nc_freeall() as Curses_Free_All to help with
+	  memory-checking.
+	+ correct some functions in Ada95 binding which were using return value
+	  from C where none was returned:  idcok(), immedok() and wtimeout().
+	+ amend recent changes for Ada95 binding to make it build with
+	  Cygwin's linker, e.g., with configure options
+		--enable-broken-linker --with-ticlib
+
+20070428
+	+ add a configure check for gcc's options for inlining, use that to
+	  quiet a warning message where gcc's default behavior changed from
+	  3.x to 4.x.
+	+ improve warning message when checking if GPM is linked to curses
+	  library by not warning if its use of "wgetch" is via a weak symbol.
+	+ add loader options when building with static libraries to ensure that
+	  an installed shared library for ncurses does not conflict.  This is
+	  reported as problem with Tru64, but could affect other platforms
+	  (report Martin Mokrejs, analysis by Tim Mooney).
+	+ fix build on cygwin after recent ticlib/termlib changes, i.e.,
+	  + adjust TINFO_SUFFIX value to work with cygwin's dll naming
+	  + revert a change from 20070303 which commented out dependency of
+	    SHLIB_LIST in form/menu/panel/c++ libraries.
+	+ fix initialization of ripoff stack pointer (cf: 20070421).
+
+20070421
+	+ move most static variables into structures _nc_globals and
+	  _nc_prescreen, to simplify storage.
+	+ add/use configure script macro CF_SIG_ATOMIC_T, use the corresponding
+	  type for data manipulated by signal handlers (prompted by comments
+	  in mailing.openbsd.bugs newsgroup).
+	+ modify CF_WITH_LIBTOOL to allow one to pass options such as -static
+	  to the libtool create- and link-operations.
+
+20070414
+	+ fix whitespace in curs_opaque.3x which caused a spurious ';' in
+	  the installed aliases (report by Peter Santoro).
+	+ fix configure script to not try to generate adacurses-config when
+	  Ada95 tree is not built.
+
+20070407
+	+ add man/curs_legacy.3x, man/curs_opaque.3x
+	+ fix acs_map binding for Ada95 when --enable-reentrant is used.
+	+ add adacurses-config to the Ada95 install, based on version from
+	  FreeBSD port, in turn by Juergen Pfeifer in 2000 (prompted by
+	  comment on comp.lang.ada newsgroup).
+	+ fix includes in c++ binding to build with Intel compiler
+	  (cf: 20061209).
+	+ update install rule in Ada95 to use mkdirs.sh
+	> other fixes prompted by inspection for Coverity report:
+	+ modify ifdef's for c++ binding to use try/catch/throw statements
+	+ add a null-pointer check in tack/ansi.c request_cfss()
+	+ fix a memory leak in ncurses/base/wresize.c
+	+ corrected check for valid memu/meml capabilities in
+	  progs/dump_entry.c when handling V_HPUX case.
+	> fixes based on Coverity report:
+	+ remove dead code in test/bs.c
+	+ remove dead code in test/demo_defkey.c
+	+ remove an unused assignment in progs/infocmp.c
+	+ fix a limit check in tack/ansi.c tools_charset()
+	+ fix tack/ansi.c tools_status() to perform the VT320/VT420
+	  tests in request_cfss().  The function had exited too soon.
+	+ fix a memory leak in tic.c's make_namelist()
+	+ fix a couple of places in tack/output.c which did not check for EOF.
+	+ fix a loop-condition in test/bs.c
+	+ add index checks in lib_color.c for color palettes
+	+ add index checks in progs/dump_entry.c for version_filter() handling
+	  of V_BSD case.
+	+ fix a possible null-pointer dereference in copywin()
+	+ fix a possible null-pointer dereference in waddchnstr()
+	+ add a null-pointer check in _nc_expand_try()
+	+ add a null-pointer check in tic.c's make_namelist()
+	+ add a null-pointer check in _nc_expand_try()
+	+ add null-pointer checks in test/cardfile.c
+	+ fix a double-free in ncurses/tinfo/trim_sgr0.c
+	+ fix a double-free in ncurses/base/wresize.c
+	+ add try/catch block to c++/cursesmain.cc
+
+20070331
+	+ modify Ada95 binding to build with --enable-reentrant by wrapping
+	  global variables (bug: acs_map does not yet work).
+	+ modify Ada95 binding to use the new access-functions, allowing it
+	  to build/run when NCURSES_OPAQUE is set.
+	+ add access-functions and macros to return properties of the WINDOW
+	  structure, e.g., when NCURSES_OPAQUE is set.
+	+ improved install-sh's quoting.
+	+ use mkdirs.sh rather than mkinstalldirs, e.g., to use fixes from
+	  other programs.
+
+20070324
+	+ eliminate part of the direct use of WINDOW data from Ada95 interface.
+	+ fix substitutions for termlib filename to make configure option
+	  --enable-reentrant work with --with-termlib.
+	+ change a constructor for NCursesWindow to allow compiling with
+	  NCURSES_OPAQUE set, since we cannot pass a reference to
+	  an opaque pointer.
+
+20070317
+	+ ignore --with-chtype=unsigned since unsigned is always added to
+	  the type in curses.h; do the same for --with-mmask-t.
+	+ change warning regarding --enable-ext-colors and wide-character
+	  in the configure script to an error.
+	+ tweak error message in CF_WITH_LIBTOOL to distinguish other programs
+	  such as Darwin's libtool program (report by Michail Vidiassov)
+	+ modify edit_man.sh to allow for multiple substitutions per line.
+	+ set locale in misc/ncurses-config.in since it uses a range
+	+ change permissions libncurses++.a install (report by Michail
+	  Vidiassov).
+	+ corrected length of temporary buffer in wide-character version
+	  of set_field_buffer() (related to report by Bryan Christ).
+
+20070311
+	+ fix mk-1st.awk script install_shlib() function, broken in 20070224
+	  changes for cygwin (report by  Michail Vidiassov).
+
+20070310
+	+ increase size of array in _nc_visbuf2n() to make "tic -v" work
+	  properly in its similar_sgr() function (report/analysis by Peter
+	  Santoro).
+	+ add --enable-reentrant configure option for ongoing changes to
+	  implement a reentrant version of ncurses:
+	  + libraries are suffixed with "t"
+	  + wrap several global variables (curscr, newscr, stdscr, ttytype,
+	    COLORS, COLOR_PAIRS, COLS, ESCDELAY, LINES and TABSIZE) as
+	    functions returning values stored in SCREEN or cur_term.
+	  + move some initialization (LINES, COLS) from lib_setup.c,
+	    i.e., setupterm() to _nc_setupscreen(), i.e., newterm().
+
+20070303
+	+ regenerated html documentation.
+	+ add NCURSES_OPAQUE symbol to curses.h, will use to make structs
+	  opaque in selected configurations.
+	+ move the chunk in lib_acs.c which resets acs capabilities when
+	  running on a terminal whose locale interferes with those into
+	  _nc_setupscreen(), so the libtinfo/libtinfow files can be made
+	  identical (requested by Miroslav Lichvar).
+	+ do not use configure variable SHLIB_LIBS for building libraries
+	  outside the ncurses directory, since that symbol is customized
+	  only for that directory, and using it introduces an unneeded
+	  dependency on libdl (requested by Miroslav Lichvar).
+	+ modify mk-1st.awk so the generated makefile rules for linking or
+	  installing shared libraries do not first remove the library, in
+	  case it is in use, e.g., libncurses.so by /bin/sh (report by Jeff
+	  Chua).
+	+ revised section "Using NCURSES under XTERM" in ncurses-intro.html
+	  (prompted by newsgroup comment by Nick Guenther).
+
+20070224
+	+ change internal return codes of _nc_wgetch() to check for cases
+	  where KEY_CODE_YES should be returned, e.g., if a KEY_RESIZE was
+	  ungetch'd, and read by wget_wch().
+	+ fix static-library build broken in 20070217 changes to remove "-ldl"
+	  (report by Miroslav Lichvar).
+	+ change makefile/scripts for cygwin to allow building termlib.
+	+ use Form_Hook in manpages to match form.h
+	+ use Menu_Hook in manpages, as well as a few places in menu.h
+	+ correct form- and menu-manpages to use specific Field_Options,
+	  Menu_Options and Item_Options types.
+	+ correct prototype for _tracechar() in manpage (cf: 20011229).
+	+ correct prototype for wunctrl() in manpage.
+
+20070217
+	+ fixes for $(TICS_LIST) in ncurses/Makefile (report by Miroslav
+	  Lichvar).
+	+ modify relinking of shared libraries to apply only when rpath is
+	  enabled, and add --disable-relink option which can be used to
+	  disable the feature altogether (reports by Michail Vidiassov,
+	  Adam J Richter).
+	+ fix --with-termlib option for wide-character configuration, stripping
+	  the "w" suffix in one place (report by Miroslav Lichvar).
+	+ remove "-ldl" from some library lists to reduce dependencies in
+	  programs (report by Miroslav Lichvar).
+	+ correct description of --enable-signed-char in configure --help
+	  (report by Michail Vidiassov).
+	+ add pattern for GNU/kFreeBSD configuration to CF_XOPEN_SOURCE,
+	  which matches an earlier change to CF_SHARED_OPTS, from xterm #224
+	  fixes.
+	+ remove "${DESTDIR}" from -install_name option used for linking
+	  shared libraries on Darwin (report by Michail Vidiassov).
+
+20070210
+	+ add test/inchs.c, test/inch_wide.c, to test win_wchnstr().
+	+ remove libdl from library list for termlib (report by Miroslav
+	  Lichvar).
+	+ fix configure.in to allow --without-progs --with-termlib (patch by
+	  Miroslav Lichvar).
+	+ modify win_wchnstr() to ensure that only a base cell is returned
+	  for each multi-column character (prompted by report by Wei Kong
+	  regarding change in mvwin_wch() cf: 20041023).
+
+20070203
+	+ modify fix_wchnstr() in form library to strip attributes (and color)
+	  from the cchar_t array (field cells) read from a field's window.
+	  Otherwise, when copying the field cells back to the window, the
+	  associated color overrides the field's background color (report by
+	  Ricardo Cantu).
+	+ improve tracing for form library, showing created forms, fields, etc.
+	+ ignore --enable-rpath configure option if --with-shared was omitted.
+	+ add _nc_leaks_tinfo(), _nc_free_tic(), _nc_free_tinfo() entrypoints
+	  to allow leak-checking when both tic- and tinfo-libraries are built.
+	+ drop CF_CPP_VSCAN_FUNC macro from configure script, since C++ binding
+	  no longer relies on it.
+	+ disallow combining configure script options --with-ticlib and
+	  --enable-termcap (report by Rong-En Fan).
+	+ remove tack from ncurses tree.
+
+20070128
+	+ fix typo in configure script that broke --with-termlib option
+	  (report by Rong-En Fan).
+
+20070127
+	+ improve fix for FreeBSD gnu/98975, to allow for null pointer passed
+	  to tgetent() (report by Rong-en Fan).
+	+ update tack/HISTORY and tack/README to tell how to build it after
+	  it is removed from the ncurses tree.
+	+ fix configure check for libtool's version to trim blank lines
+	  (report by sci-fi@hush.ai).
+	+ review/eliminate other original-file artifacts in cursesw.cc, making
+	  its license consistent with ncurses.
+	+ use ncurses vw_scanw() rather than reading into a fixed buffer in
+	  the c++ binding for scanw() methods (prompted by report by Nuno Dias).
+	+ eliminate fixed-buffer vsprintf() calls in c++ binding.
+
+20070120
+	+ add _nc_leaks_tic() to separate leak-checking of tic library from
+	  term/ncurses libraries, and thereby eliminate a library dependency.
+	+ fix test/mk-test.awk to ignore blank lines.
+	+ correct paths in include/headers, for --srcdir (patch by Miroslav
+	  Lichvar).
+
+20070113
+	+ add a break-statement in misc/shlib to ensure that it exits on the
+	  _first_ matched directory (report by Paul Novak).
+	+ add tack/configure, which can be used to build tack outside the
+	  ncurses build-tree.
+	+ add --with-ticlib option, to build/install the tic-support functions
+	  in a separate library (suggested by Miroslav Lichvar).
+
+20070106
+	+ change MKunctrl.awk to reduce relocation table for unctrl.o
+	+ change MKkeyname.awk to reduce relocation table for keyname.o
+	  (patch by Miroslav Lichvar).
+
+20061230
+	+ modify configure check for libtool's version to trim blank lines
+	  (report by sci-fi@hush.ai).
+	+ modify some modules to allow them to be reentrant if _REENTRANT is
+	  defined: lib_baudrate.c, resizeterm.c (local data only)
+	+ eliminate static data from some modules: add_tries.c, hardscroll.c,
+	  lib_ttyflags.c, lib_twait.c
+	+ improve manpage install to add aliases for the transformed program
+	  names, e.g., from --program-prefix.
+	+ used linklint to verify links in the HTML documentation, made fixes
+	  to manpages as needed.
+	+ fix a typo in curs_mouse.3x (report by William McBrine).
+	+ fix install-rule for ncurses5-config to make the bin-directory.
+
+20061223
+	+ modify configure script to omit the tic (terminfo compiler) support
+	  from ncurses library if --without-progs option is given.
+	+ modify install rule for ncurses5-config to do this via "install.libs"
+	+ modify shared-library rules to allow FreeBSD 3.x to use rpath.
+	+ update config.guess, config.sub
+
+20061217 5.6 release for upload to ftp.gnu.org
+
+20061217
+	+ add ifdef's for <wctype.h> for HPUX, which has the corresponding
+	  definitions in <wchar.h>.
+	+ revert the va_copy() change from 20061202, since it was neither
+	  correct nor portable.
+	+ add $(LOCAL_LIBS) definition to progs/Makefile.in, needed for
+	  rpath on Solaris.
+	+ ignore wide-acs line-drawing characters that wcwidth() claims are
+	  not one-column.  This is a workaround for Solaris' broken locale
+	  support.
+
+20061216
+	+ modify configure --with-gpm option to allow it to accept a parameter,
+	  i.e., the name of the dynamic GPM library to load via dlopen()
+	  (requested by Bryan Henderson).
+	+ add configure option --with-valgrind, changes from vile.
+	+ modify configure script AC_TRY_RUN and AC_TRY_LINK checks to use
+	  'return' in preference to 'exit()'.
+
+20061209
+	+ change default for --with-develop back to "no".
+	+ add XTABS to tracing of TTY bits.
+	+ updated autoconf patch to ifdef-out the misfeature which declares
+	  exit() for configure tests.  This fixes a redefinition warning on
+	  Solaris.
+	+ use ${CC} rather than ${LD} in shared library rules for IRIX64,
+	  Solaris to help ensure that initialization sections are provided for
+	  extra linkage requirements, e.g., of C++ applications (prompted by
+	  comment by Casper Dik in newsgroup).
+	+ rename "$target" in CF_MAN_PAGES to make it easier to distinguish
+	  from the autoconf predefined symbol.  There was no conflict,
+	  since "$target" was used only in the generated edit_man.sh file,
+	  but SuSE's rpm package contains a patch.
+
+20061202
+	+ update man/term.5 to reflect extended terminfo support and hashed
+	  database configuration.
+	+ updates for test/configure script.
+	+ adapted from SuSE rpm package:
+	  + remove long-obsolete workaround for broken-linker which declared
+	    cur_term in tic.c
+	  + improve error recovery in PUTC() macro when wcrtomb() does not
+	    return usable results for an 8-bit character.
+	+ patches from rpm package (SuSE):
+	  + use va_copy() in extra varargs manipulation for tracing version
+	    of printw, etc.
+	  + use a va_list rather than a null in _nc_freeall()'s call to
+	    _nc_printf_string().
+	+ add some see-also references in manpages to show related
+	  wide-character functions (suggested by Claus Fischer).
+
+20061125
+	+ add a check in lib_color.c to ensure caller does not increase COLORS
+	  above max_colors, which is used as an array index (discussion with
+	  Simon Sasburg).
+	+ add ifdef's allowing ncurses to be built with tparm() using either
+	  varargs (the existing status), or using a fixed-parameter list (to
+	  match X/Open).
+
+20061104
+	+ fix redrawing of windows other than stdscr using wredrawln() by
+	  touching the corresponding rows in curscr (discussion with Dan
+	  Gookin).
+	+ add test/redraw.c
+	+ add test/echochar.c
+	+ review/cleanup manpage descriptions of error-returns for form- and
+	  menu-libraries (prompted by FreeBSD docs/46196).
+
+20061028
+	+ add AUTHORS file -TD
+	+ omit the -D options from output of the new config script --cflags
+	  option (suggested by Ralf S Engelschall).
+	+ make NCURSES_INLINE unconditionally defined in curses.h
+
+20061021
+	+ revert change to accommodate bash 3.2, since that breaks other
+	  platforms, e.g., Solaris.
+	+ minor fixes to NEWS file to simplify scripting to obtain list of
+	  contributors.
+	+ improve some shared-library configure scripting for Linux, FreeBSD
+	  and NetBSD to make "--with-shlib-version" work.
+	+ change configure-script rules for FreeBSD shared libraries to allow
+	  for rpath support in versions past 3.
+	+ use $(DESTDIR) in makefile rules for installing/uninstalling the
+	  package config script (reports/patches by Christian Wiese,
+	  Ralf S Engelschall).
+	+ fix a warning in the configure script for NetBSD 2.0, working around
+	  spurious blanks embedded in its ${MAKEFLAGS} symbol.
+	+ change test/Makefile to simplify installing test programs in a
+	  different directory when --enable-rpath is used.
+
+20061014
+	+ work around bug in bash 3.2 by adding extra quotes (Jim Gifford).
+	+ add/install a package config script, e.g., "ncurses5-config" or
+	  "ncursesw5-config", according to configuration options.
+
+20061007
+	+ add several GNU Screen terminfo variations with 16- and 256-colors,
+	  and status line (Alain Bench).
+	+ change the way shared libraries (other than libtool) are installed.
+	  Rather than copying the build-tree's libraries, link the shared
+	  objects into the install directory.  This makes the --with-rpath
+	  option work except with $(DESTDIR) (cf: 20000930).
+
+20060930
+	+ fix ifdef in c++/internal.h for QNX 6.1
+	+ test-compiled with (old) egcs-1.1.2, modified configure script to
+	  not unset the $CXX and related variables which would prevent this.
+	+ fix a few terminfo.src typos exposed by improvements to "-f" option.
+	+ improve infocmp/tic "-f" option formatting.
+
+20060923
+	+ make --disable-largefile option work (report by Thomas M Ott).
+	+ updated html documentation.
+	+ add ka2, kb1, kb3, kc2 to vt220-keypad as an extension -TD
+	+ minor improvements to rxvt+pcfkeys -TD
+
+20060916
+	+ move static data from lib_mouse.c into SCREEN struct.
+	+ improve ifdef's for _POSIX_VDISABLE in tset to work with Mac OS X
+	  (report by Michail Vidiassov).
+	+ modify CF_PATH_SYNTAX to ensure it uses the result from --prefix
+	  option (from lynx changes) -TD
+	+ adapt AC_PROG_EGREP check, noting that this is likely to be another
+	  place aggravated by POSIXLY_CORRECT.
+	+ modify configure check for awk to ensure that it is found (prompted
+	  by report by Christopher Parker).
+	+ update config.sub
+
+20060909
+	+ add kon, kon2 and jfbterm terminfo entry (request by Till Maas) -TD
+	+ remove invis capability from klone+sgr, mainly used by linux entry,
+	  since it does not really do this -TD
+
+20060903
+	+ correct logic in wadd_wch() and wecho_wch(), which did not guard
+	  against passing the multi-column attribute into a call on waddch(),
+	  e.g., using data returned by win_wch() (cf: 20041023)
+	  (report by Sadrul H Chowdhury).
+
+20060902
+	+ fix kterm's acsc string -TD
+	+ fix for change to tic/infocmp in 20060819 to ensure no blank is
+	  embedded into a termcap description.
+	+ workaround for 20050806 ifdef's change to allow visbuf.c to compile
+	  when using --with-termlib --with-trace options.
+	+ improve tgetstr() by making the return value point into the user's
+	  buffer, if provided (patch by Miroslav Lichvar (see Redhat #202480)).
+	+ correct libraries needed for foldkeys (report by Stanislav Ievlev)
+
+20060826
+	+ add terminfo entries for xfce terminal (xfce) and multi gnome
+	  terminal (mgt) -TD
+	+ add test/foldkeys.c
+
+20060819
+	+ modify tic and infocmp to avoid writing trailing blanks on terminfo
+	  source output (Debian #378783).
+	+ modify configure script to ensure that if the C compiler is used
+	  rather than the loader in making shared libraries, the $(CFLAGS)
+	  variable is also used (Redhat #199369).
+	+ port hashed-db code to db2 and db3.
+	+ fix a bug in tgetent() from 20060625 and 20060715 changes
+	  (patch/analysis by Miroslav Lichvar (see Redhat #202480)).
+
+20060805
+	+ updated xterm function-keys terminfo to match xterm #216 -TD
+	+ add configure --with-hashed-db option (tested only with FreeBSD 6.0,
+	  e.g., the db 1.8.5 interface).
+
+20060729
+	+ modify toe to access termcap data, e.g., via cgetent() functions,
+	  or as a text file if those are not available.
+	+ use _nc_basename() in tset to improve $SHELL check for csh/sh.
+	+ modify _nc_read_entry() and _nc_read_termcap_entry() so infocmp,
+	  can access termcap data when the terminfo database is disabled.
+
+20060722
+	+ widen the test for xterm kmous a little to allow for other strings
+	  than \E[M, e.g., for xterm-sco functionality in xterm.
+	+ update xterm-related terminfo entries to match xterm patch #216 -TD
+	+ update config.guess, config.sub
+
+20060715
+	+ fix for install-rule in Ada95 to add terminal_interface.ads
+	  and terminal_interface.ali (anonymous posting in comp.lang.ada).
+	+ correction to manpage for getcchar() (report by William McBrine).
+	+ add test/chgat.c
+	+ modify wchgat() to mark updated cells as changed so a refresh will
+	  repaint those cells (comments by Sadrul H Chowdhury and William
+	  McBrine).
+	+ split up dependency of names.c and codes.c in ncurses/Makefile to
+	  work with parallel make (report/analysis by Joseph S Myers).
+	+ suppress a warning message (which is ignored) for systems without
+	  an ldconfig program (patch by Justin Hibbits).
+	+ modify configure script --disable-symlinks option to allow one to
+	  disable symlink() in tic even when link() does not work (report by
+	  Nigel Horne).
+	+ modify MKfallback.sh to use tic -x when constructing fallback tables
+	  to allow extended capabilities to be retrieved from a fallback entry.
+	+ improve leak-checking logic in tgetent() from 20060625 to ensure that
+	  it does not free the current screen (report by Miroslav Lichvar).
+
+20060708
+	+ add a check for _POSIX_VDISABLE in tset (NetBSD #33916).
+	+ correct _nc_free_entries() and related functions used for memory leak
+	  checking of tic.
+
+20060701
+	+ revert a minor change for magic-cookie support from 20060513, which
+	  caused unexpected reset of attributes, e.g., when resizing test/view
+	  in color mode.
+	+ note in clear manpage that the program ignores command-line
+	  parameters (prompted by Debian #371855).
+	+ fixes to make lib_gen.c build properly with changes to the configure
+	  --disable-macros option and NCURSES_NOMACROS (cf:  20060527)
+	+ update/correct several terminfo entries -TD
+	+ add some notes regarding copyright to terminfo.src -TD
+
+20060625
+	+ fixes to build Ada95 binding with gnat-4.1.0
+	+ modify read_termtype() so the term_names data is always allocated as
+	  part of the str_table, a better fix for a memory leak (cf: 20030809).
+	+ reduce memory leaks in repeated calls to tgetent() by remembering the
+	  last TERMINAL* value allocated to hold the corresponding data and
+	  freeing that if the tgetent() result buffer is the same as the
+	  previous call (report by "Matt" for FreeBSD gnu/98975).
+	+ modify tack to test extended capability function-key strings.
+	+ improved gnome terminfo entry (GenToo #122566).
+	+ improved xterm-256color terminfo entry (patch by Alain Bench).
+
+20060617
+	+ fix two small memory leaks related to repeated tgetent() calls
+	  with TERM=screen (report by "Matt" for FreeBSD gnu/98975).
+	+ add --enable-signed-char to simplify Debian package.
+	+ reduce name-pollution in term.h by removing #define's for HAVE_xxx
+	  symbols.
+	+ correct typo in curs_terminfo.3x (Debian #369168).
+
+20060603
+	+ enable the mouse in test/movewindow.c
+	+ improve a limit-check in frm_def.c (John Heasley).
+	+ minor copyright fixes.
+	+ change configure script to produce test/Makefile from data file.
+
+20060527
+	+ add a configure option --enable-wgetch-events to enable
+	  NCURSES_WGETCH_EVENTS, and correct the associated loop-logic in
+	  lib_twait.c (report by Bernd Jendrissek).
+	+ remove include/nomacros.h from build, since the ifdef for
+	  NCURSES_NOMACROS makes that obsolete.
+	+ add entrypoints for some functions which were only provided as macros
+	  to make NCURSES_NOMACROS ifdef work properly:  getcurx(), getcury(),
+	  getbegx(), getbegy(), getmaxx(), getmaxy(), getparx() and getpary(),
+	  wgetbkgrnd().
+	+ provide ifdef for NCURSES_NOMACROS which suppresses most macro
+	  definitions from curses.h, i.e., where a macro is defined to override
+	  a function to improve performance.  Allowing a developer to suppress
+	  these definitions can simplify some application (discussion with
+	  Stanislav Ievlev).
+	+ improve description of memu/meml in terminfo manpage.
+
+20060520
+	+ if msgr is false, reset video attributes when doing an automargin
+	  wrap to the next line.  This makes the ncurses 'k' test work properly
+	  for hpterm.
+	+ correct caching of keyname(), which was using only half of its table.
+	+ minor fixes to memory-leak checking.
+	+ make SCREEN._acs_map and SCREEN._screen_acs_map pointers rather than
+	  arrays, making ACS_LEN less visible to applications (suggested by
+	  Stanislav Ievlev).
+	+ move chunk in SCREEN ifdef'd for USE_WIDEC_SUPPORT to the end, so
+	  _screen_acs_map will have the same offset in both ncurses/ncursesw,
+	  making the corresponding tinfo/tinfow libraries binary-compatible
+	  (cf: 20041016, report by Stanislav Ievlev).
+
+20060513
+	+ improve debug-tracing for EmitRange().
+	+ change default for --with-develop to "yes".  Add NCURSES_NO_HARD_TABS
+	  and NCURSES_NO_MAGIC_COOKIE environment variables to allow runtime
+	  suppression of the related hard-tabs and xmc-glitch features.
+	+ add ncurses version number to top-level manpages, e.g., ncurses, tic,
+	  infocmp, terminfo as well as form, menu, panel.
+	+ update config.guess, config.sub
+	+ modify ncurses.c to work around a bug in NetBSD 3.0 curses
+	  (field_buffer returning null for a valid field).  The 'r' test
+	  appears to not work with that configuration since the new_fieldtype()
+	  function is broken in that implementation.
+
+20060506
+	+ add hpterm-color terminfo entry -TD
+	+ fixes to compile test-programs with HPUX 11.23
+
+20060422
+	+ add copyright notices to files other than those that are generated,
+	  data or adapted from pdcurses (reports by William McBrine, David
+	  Taylor).
+	+ improve rendering on hpterm by not resetting attributes at the end
+	  of doupdate() if the terminal has the magic-cookie feature (report
+	  by Bernd Rieke).
+	+ add 256color variants of terminfo entries for programs which are
+	  reported to implement this feature -TD
+
+20060416
+	+ fix typo in change to NewChar() macro from 20060311 changes, which
+	  broke tab-expansion (report by Frederic L W Meunier).
+
+20060415
+	+ document -U option of tic and infocmp.
+	+ modify tic/infocmp to suppress smacs/rmacs when acsc is suppressed
+	  due to size limit, e.g., converting to termcap format.  Also
+	  suppress them if the output format does not contain acsc and it
+	  was not VT100-like, i.e., a one-one mapping (Novell #163715).
+	+ add configure check to ensure that SIGWINCH is defined on platforms
+	  such as OS X which exclude that when _XOPEN_SOURCE, etc., are
+	  defined (report by Nicholas Cole)
+
+20060408
+	+ modify write_object() to not write coincidental extensions of an
+	  entry made due to it being referenced in a use= clause (report by
+	  Alain Bench).
+	+ another fix for infocmp -i option, which did not ensure that some
+	  escape sequences had comparable prefixes (report by Alain Bench).
+
+20060401
+	+ improve discussion of init/reset in terminfo and tput manpages
+	  (report by Alain Bench).
+	+ use is3 string for a fallback of rs3 in the reset program; it was
+	  using is2 (report by Alain Bench).
+	+ correct logic for infocmp -i option, which did not account for
+	  multiple digits in a parameter (cf: 20040828) (report by Alain
+	  Bench).
+	+ move _nc_handle_sigwinch() to lib_setup.c to make --with-termlib
+	  option work after 20060114 changes (report by Arkadiusz Miskiewicz).
+	+ add copyright notices to test-programs as needed (report by William
+	  McBrine).
+
+20060318
+	+ modify ncurses.c 'F' test to combine the wide-characters with color
+	  and/or video attributes.
+	+ modify test/ncurses to use CTL/Q or ESC consistently for exiting
+	  a test-screen (some commands used 'x' or 'q').
+
+20060312
+	+ fix an off-by-one in the scrolling-region change (cf_ 20060311).
+
+20060311
+	+ add checks in waddchnstr() and wadd_wchnstr() to stop copying when
+	  a null character is found (report by Igor Bogomazov).
+	+ modify progs/Makefile.in to make "tput init" work properly with
+	  cygwin, i.e., do not pass a ".exe" in the reference string used
+	  in check_aliases (report by Samuel Thibault).
+	+ add some checks to ensure current position is within scrolling
+	  region before scrolling on a new line (report by Dan Gookin).
+	+ change some NewChar() usage to static variables to work around
+	  stack garbage introduced when cchar_t is not packed (Redhat #182024).
+
+20060225
+	+ workarounds to build test/movewindow with PDcurses 2.7.
+	+ fix for nsterm-16color entry (patch by Alain Bench).
+	+ correct a typo in infocmp manpage (Debian #354281).
+
+20060218
+	+ add nsterm-16color entry -TD
+	+ updated mlterm terminfo entry -TD
+	+ remove 970913 feature for copying subwindows as they are moved in
+	  mvwin() (discussion with Bryan Christ).
+	+ modify test/demo_menus.c to demonstrate moving a menu (both the
+	  window and subwindow) using shifted cursor-keys.
+	+ start implementing recursive mvwin() in movewindow.c (incomplete).
+	+ add a fallback definition for GCC_PRINTFLIKE() in test.priv.h,
+	  for movewindow.c (report by William McBrine).
+	+ add help-message to test/movewindow.c
+
+20060211
+	+ add test/movewindow.c, to test mvderwin().
+	+ fix ncurses soft-key test so color changes are shown immediately
+	  rather than delayed.
+	+ modify ncurses soft-key test to hide the keys when exiting the test
+	  screen.
+	+ fixes to build test programs with PDCurses 2.7, e.g., its headers
+	  rely on autoconf symbols, and it declares stubs for nonfunctional
+	  terminfo and termcap entrypoints.
+
+20060204
+	+ improved test/configure to build test/ncurses on HPUX 11 using the
+	  vendor curses.
+	+ documented ALTERNATE CONFIGURATIONS in the ncurses manpage, for the
+	  benefit of developers who do not read INSTALL.
+
+20060128
+	+ correct form library Window_To_Buffer() change (cf:  20040516), which
+	  should ignore the video attributes (report by Ricardo Cantu).
+
+20060121
+	+ minor fixes to xmc-glitch experimental code:
+	  + suppress line-drawing
+	  + implement max_attributes
+	  tested with xterm.
+	+ minor fixes for the database iterator.
+	+ fix some buffer limits in c++ demo (comment by Falk Hueffner in
+	  Debian #348117).
+
+20060114
+	+ add toe -a option, to show all databases.  This uses new private
+	  interfaces in the ncurses library for iterating through the list of
+	  databases.
+	+ fix toe from 20000909 changes which made it not look at
+	  $HOME/.terminfo
+	+ make toe's -v option parameter optional as per manpage.
+	+ improve SIGWINCH handling by postponing its effect during newterm(),
+	  etc., when allocating screens.
+
+20060111
+	+ modify wgetnstr() to return KEY_RESIZE if a sigwinch occurs.  Use
+	  this in test/filter.c
+	+ fix an error in filter() modification which caused some applications
+	  to fail.
+
+20060107
+	+ check if filter() was called when getting the screensize.  Keep it
+	  at 1 if so (based on Redhat #174498).
+	+ add extension nofilter().
+	+ refined the workaround for ACS mapping.
+	+ make ifdef's consistent in curses.h for the extended colors so the
+	  header file can be used for the normal curses library.  The header
+	  file installed for extended colors is a variation of the
+	  wide-character configuration (report by Frederic L W Meunier).
+
+20051231
+	+ add a workaround to ACS mapping to allow applications such as
+	  test/blue.c to use the "PC ROM" characters by masking them with
+	  A_ALTCHARSET.  This worked up til 5.5, but was lost in the revision
+	  of legacy coding (report by Michael Deutschmann).
+	+ add a null-pointer check in the wide-character version of
+	  calculate_actual_width() (report by Victor Julien).
+	+ improve test/ncurses 'd' (color-edit) test by allowing the RGB
+	  values to be set independently (patch by William McBrine).
+	+ modify test/configure script to allow building test programs with
+	  PDCurses/X11.
+	+ modified test programs to allow some to work with NetBSD curses.
+	  Several do not because NetBSD curses implements a subset of X/Open
+	  curses, and also lacks much of SVr4 additions.  But it's enough for
+	  comparison.
+	+ update config.guess and config.sub
+
+20051224
+	+ use BSD-specific fix for return-value from cgetent() from CVS where
+	  an unknown terminal type would be reportd as "database not found".
+	+ make tgetent() return code more readable using new symbols
+	  TGETENT_YES, etc.
+	+ remove references to non-existent "tctest" program.
+	+ remove TESTPROGS from progs/Makefile.in (it was referring to code
+	  that was never built in that directory).
+	+ typos in curs_addchstr.3x, some doc files (noticed in OpenBSD CVS).
+
+20051217
+	+ add use_legacy_coding() function to support lynx's font-switching
+	  feature.
+	+ fix formatting in curs_termcap.3x (report by Mike Frysinger).
+	+ modify MKlib_gen.sh to change preprocessor-expanded _Bool back to
+	  bool.
+
+20051210
+	+ extend test/ncurses.c 's' (overlay window) test to exercise overlay(),
+	  overwrite() and copywin() with different combinations of colors and
+	  attributes (including background color) to make it easy to see the
+	  effect of the different functions.
+	+ corrections to menu/m_global.c for wide-characters (report by
+	  Victor Julien).
+
+20051203
+	+ add configure option --without-dlsym, allowing developers to
+	  configure GPM support without using dlsym() (discussion with Michael
+	  Setzer).
+	+ fix wins_nwstr(), which did not handle single-column non-8bit codes
+	  (Debian #341661).
+
+20051126
+	+ move prototypes for wide-character trace functions from curses.tail
+	  to curses.wide to avoid accidental reference to those if
+	  _XOPEN_SOURCE_EXTENDED is defined without ensuring that <wchar.h> is
+	  included.
+	+ add/use NCURSES_INLINE definition.
+	+ change some internal functions to use int/unsigned rather than the
+	  short equivalents.
+
+20051119
+	+ remove a redundant check in lib_color.c (Debian #335655).
+	+ use ld's -search_paths_first option on Darwin to work around odd
+	  search rules on that platform (report by Christian Gennerat, analysis
+	  by Andrea Govoni).
+	+ remove special case for Darwin in CF_XOPEN_SOURCE configure macro.
+	+ ignore EINTR in tcgetattr/tcsetattr calls (Debian #339518).
+	+ fix several bugs in test/bs.c (patch by Stephen Lindholm).
+
+20051112
+	+ other minor fixes to cygwin based on tack -TD
+	+ correct smacs in cygwin (Debian #338234, report by Baurzhan
+	  Ismagulov, who noted that it was fixed in Cygwin).
+
+20051029
+	+ add shifted up/down arrow codes to xterm-new as kind/kri strings -TD
+	+ modify wbkgrnd() to avoid clearing the A_CHARTEXT attribute bits
+	  since those record the state of multicolumn characters (Debian
+	  #316663).
+	+ modify werase to clear multicolumn characters that extend into
+	  a derived window (Debian #316663).
+
+20051022
+	+ move assignment from environment variable ESCDELAY from initscr()
+	  down to newterm() so the environment variable affects timeouts for
+	  terminals opened with newterm() as well.
+	+ fix a memory leak in keyname().
+	+ add test/demo_altkeys.c
+	+ modify test/demo_defkey.c to exit from loop via 'q' to allow
+	  leak-checking, as well as fix a buffer size in winnstr() call.
+
+20051015
+	+ correct order of use-clauses in rxvt-basic entry which made codes for
+	  f1-f4 vt100-style rather than vt220-style (report by Gabor Z Papp).
+	+ suppress configure check for gnatmake if Ada95/Makefile.in is not
+	  found.
+	+ correct a typo in configure --with-bool option for the case where
+	  --without-cxx is used (report by Daniel Jacobowitz).
+	+ add a note to INSTALL's discussion of --with-normal, pointing out
+	  that one may wish to use --without-gpm to ensure a completely
+	  static link (prompted by report by Felix von Leitner).
+
+20051010 5.5 release for upload to ftp.gnu.org
+
+20051008
+	+ document in demo_forms.c some portability issues.
+
+20051001
+	+ document side-effect of werase() which sets the cursor position.
+	+ save/restore the current position in form field editing to make
+	  overlay mode work.
+
+20050924
+	+ correct header dependencies in progs, allowing parallel make (report
+	  by Daniel Jacobowitz).
+	+ modify CF_BUILD_CC to ensure that pre-setting $BUILD_CC overrides
+	  the configure check for --with-build-cc (report by Daniel Jacobowitz).
+	+ modify CF_CFG_DEFAULTS to not use /usr as the default prefix for
+	  NetBSD.
+	+ update config.guess and config.sub from
+		http://subversions.gnu.org/cgi-bin/viewcvs/config/config/
+
+20050917
+	+ modify sed expression which computes path for /usr/lib/terminfo
+	  symbolic link in install to ensure that it does not change unexpected
+	  levels of the path (Gentoo #42336).
+	+ modify default for --disable-lp64 configure option to reduce impact
+	  on existing 64-bit builds.  Enabling the _LP64 option may change the
+	  size of chtype and mmask_t.  However, for ABI 6, it is enabled by
+	  default (report by Mike Frysinger).
+	+ add configure script check for --enable-ext-mouse, bump ABI to 6 by
+	  default if it is used.
+	+ improve configure script logic for bumping ABI to omit this if the
+	  --with-abi-version option was used.
+	+ update address for Free Software Foundation in tack's source.
+	+ correct wins_wch(), which was not marking the filler-cells of
+	  multi-column characters (cf:  20041023).
+
+20050910
+	+ modify mouse initialization to ensure that Gpm_Open() is called only
+	  once.  Otherwise GPM gets confused in its initialization of signal
+	  handlers (Debian #326709).
+
+20050903
+	+ modify logic for backspacing in a multiline form field to ensure that
+	  it works even when the preceding line is full (report by Frank van
+	  Vugt).
+	+ remove comment about BUGS section of ncurses manpage (Debian #325481)
+
+20050827
+	+ document some workarounds for shared and libtool library
+	  configurations in INSTALL (see --with-shared and --with-libtool).
+	+ modify CF_GCC_VERSION and CF_GXX_VERSION macros to accommodate
+	  cross-compilers which emit the platform name in their version
+	  message, e.g.,
+		arm-sa1100-linux-gnu-g++ (GCC) 4.0.1
+	  (report by Frank van Vugt).
+
+20050820
+	+ start updating documentation for upcoming 5.5 release.
+	+ fix to make libtool  and libtinfo work together again (cf: 20050122).
+	+ fixes to allow building traces into libtinfo
+	+ add debug trace to tic that shows if/how ncurses will write to the
+	  lower corner of a terminal's screen.
+	+ update llib-l* files.
+
+20050813
+	+ modify initializers in c++ binding to build with old versions of g++.
+	+ improve special case for 20050115 repainting fix, ensuring that if
+	  the first changed cell is not a character that the range to be
+	  repainted is adjusted to start at a character's beginning (Debian
+	  #316663).
+
+20050806
+	+ fixes to build on QNX 6.1
+	+ improve configure script checks for Intel 9.0 compiler.
+	+ remove #include's for libc.h (obsolete).
+	+ adjust ifdef's in curses.priv.h so that when cross-compiling to
+	  produce comp_hash and make_keys, no dependency on wchar.h is needed.
+	  That simplifies the build-cppflags (report by Frank van Vugt).
+	+ move modules related to key-binding into libtinfo to fix linkage
+	  problem caused by 20050430 changes to MKkeyname.sh (report by
+	  Konstantin Andreev).
+
+20050723
+	+ updates/fixes for configure script macros from vile -TD
+	+ make prism9's sgr string agree with the rest of the terminfo -TD
+	+ make vt220's sgr0 string consistent with sgr string, do this for
+	  several related cases -TD
+	+ improve translation to termcap by filtering the 'me' (sgr0) strings
+	  as in the runtime call to tgetent() (prompted by a discussion with
+	  Thomas Klausner).
+	+ improve tic check for sgr0 versus sgr(0), to help ensure that sgr0
+	  resets line-drawing.
+
+20050716
+	+ fix special cases for trimming sgr0 for hurd and vt220 (Debian
+	  #318621).
+	+ split-out _nc_trim_sgr0() from modifications made to tgetent(), to
+	  allow it to be used by tic to provide information about the runtime
+	  changes that would be made to sgr0 for termcap applications.
+	+ modify make_sed.sh to make the group-name in the NAME section of
+	  form/menu library manpage agree with the TITLE string when renaming
+	  is done for Debian (Debian #78866).
+
+20050702
+	+ modify parameter type in c++ binding for insch() and mvwinsch() to
+	  be consistent with underlying ncurses library (was char, is chtype).
+	+ modify treatment of Intel compiler to allow _GNU_SOURCE to be defined
+	  on Linux.
+	+ improve configure check for nanosleep(), checking that it works since
+	  some older systems such as AIX 4.3 have a nonworking version.
+
+20050625
+	+ update config.guess and config.sub from
+		http://subversions.gnu.org/cgi-bin/viewcvs/config/config/
+	+ modify misc/shlib to work in test-directory.
+	+ suppress $suffix in misc/run_tic.sh when cross-compiling.  This
+	  allows cross-compiles to use the host's tic program to handle the
+	  "make install.data" step.
+	+ improve description of $LINES and $COLUMNS variables in manpages
+	  (prompted by report by Dave Ulrick).
+	+ improve description of cross-compiling in INSTALL
+	+ add NCURSES-Programming-HOWTO.html by Pradeep Padala
+	  (see http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/).
+	+ modify configure script to obtain soname for GPM library (discussion
+	  with Daniel Jacobowitz).
+	+ modify configure script so that --with-chtype option will still
+	  compute the unsigned literals suffix for constants in curses.h
+	  (report by Daniel Jacobowitz:
+	+ patches from Daniel Jacobowitz:
+	  + the man_db.renames entry for tack.1 was backwards.
+	  + tack.1 had some 1m's that should have been 1M's.
+	  + the section for curs_inwstr.3 was wrong.
+
+20050619
+	+ correction to --with-chtype option (report by Daniel Jacobowitz).
+
+20050618
+	+ move build-time edit_man.sh and edit_man.sed scripts to top directory
+	  to simplify reusing them for renaming tack's manpage (prompted by a
+	  review of Debian package).
+	+ revert minor optimization from 20041030 (Debian #313609).
+	+ libtool-specific fixes, tested with libtool 1.4.3, 1.5.0, 1.5.6,
+	  1.5.10 and 1.5.18 (all work except as noted previously for the c++
+	  install using libtool 1.5.0):
+	  + modify the clean-rule in c++/Makefile.in to work with IRIX64 make
+	    program.
+	  + use $(LIBTOOL_UNINSTALL) symbol, overlooked in 20030830
+	+ add configure options --with-chtype and --with-mmask-t, to allow
+	  overriding of the non-LP64 model's use of the corresponding types.
+	+ revise test for size of chtype (and mmask_t), which always returned
+	  "long" due to an uninitialized variable (report by Daniel Jacobowitz).
+
+20050611
+	+ change _tracef's that used "%p" format for va_list values to ignore
+	  that, since on some platforms those are not pointers.
+	+ fixes for long-formats in printf's due to largefile support.
+
+20050604
+	+ fixes for termcap support:
+	  + reset pointer to _nc_curr_token.tk_name when the input stream is
+	    closed, which could point to free memory (cf: 20030215).
+	  + delink TERMTYPE data which is used by the termcap reader, so that
+	    extended names data will be freed consistently.
+	  + free pointer to TERMTYPE data in _nc_free_termtype() rather than
+	    its callers.
+	  + add some entrypoints for freeing permanently allocated data via
+	    _nc_freeall() when NO_LEAKS is defined.
+	+ amend 20041030 change to _nc_do_color to ensure that optimization is
+	  applied only when the terminal supports back_color_erase (bce).
+
+20050528
+	+ add sun-color terminfo entry -TD
+	+ correct a missing assignment in c++ binding's method
+	  NCursesPanel::UserPointer() from 20050409 changes.
+	+ improve configure check for large-files, adding check for dirent64
+	  from vile -TD
+	+ minor change to configure script to improve linker options for the
+	  Ada95 tree.
+
+20050515
+	+ document error conditions for ncurses library functions (report by
+	  Stanislav Ievlev).
+	+ regenerated html documentation for ada binding.
+	  see ftp://ftp.invisible-island.net/ncurses/patches/gnathtml
+
+20050507
+	+ regenerated html documentation for manpages.
+	+ add $(BUILD_EXEEXT) suffix to invocation of make_keys in
+	  ncurses/Makefile (Gentoo #89772).
+	+ modify c++/demo.cc to build with g++ -fno-implicit-templates option
+	  (patch by Mike Frysinger).
+	+ modify tic to filter out long extended names when translating to
+	  termcap format.  Only two characters are permissible for termcap
+	  capability names.
+
+20050430
+	+ modify terminfo entries xterm-new and rxvt to add strings for
+	  shift-, control-cursor keys.
+	+ workaround to allow c++ binding to compile with g++ 2.95.3, which
+	  has a broken implementation of static_cast<> (patch by Jeff Chua).
+	+ modify initialization of key lookup table so that if an extended
+	  capability (tic -x) string is defined, and its name begins with 'k',
+	  it will automatically be treated as a key.
+	+ modify test/keynames.c to allow for the possibility of extended
+	  key names, e.g., via define_key(), or via "tic -x".
+	+ add test/demo_termcap.c to show the contents of given entry via the
+	  termcap interface.
+
+20050423
+	+ minor fixes for vt100/vt52 entries -TD
+	+ add configure option --enable-largefile
+	+ corrected libraries used to build Ada95/gen/gen, found in testing
+	  gcc 4.0.0.
+
+20050416
+	+ update config.guess, config.sub
+	+ modify configure script check for _XOPEN_SOURCE, disable that on
+	  Darwin whose header files have problems (patch by Chris Zubrzycki).
+	+ modify form library Is_Printable_String() to use iswprint() rather
+	  than wcwidth() for determining if a character is printable.  The
+	  latter caused it to reject menu items containing non-spacing
+	  characters.
+	+ modify ncurses test program's F-test to handle non-spacing characters
+	  by combining them with a reverse-video blank.
+	+ review/fix several gcc -Wconversion warnings.
+
+20050409
+	+ correct an off-by-one error in m_driver() for mouse-clicks used to
+	  position the mouse to a particular item.
+	+ implement test/demo_menus.c
+	+ add some checks in lib_mouse to ensure SP is set.
+	+ modify C++ binding to make 20050403 changes work with the configure
+	  --enable-const option.
+
+20050403
+	+ modify start_color() to return ERR if it cannot allocate memory.
+	+ address g++ compiler warnings in C++ binding by adding explicit
+	  member initialization, assignment operators and copy constructors.
+	  Most of the changes simply preserve the existing semantics of the
+	  binding, which can leak memory, etc., but by making these features
+	  visible, it provides a framework for improving the binding.
+	+ improve C++ binding using static_cast, etc.
+	+ modify configure script --enable-warnings to add options to g++ to
+	  correspond to the gcc --enable-warnings.
+	+ modify C++ binding to use some C internal functions to make it
+	  compile properly on Solaris (and other platforms).
+
+20050327
+	+ amend change from 20050320 to limit it to configurations with a
+	  valid locale.
+	+ fix a bug introduced in 20050320 which broke the translation of
+	  nonprinting characters to uparrow form (report by Takahashi Tamotsu).
+
+20050326
+	+ add ifdef's for _LP64 in curses.h to avoid using wasteful 64-bits for
+	  chtype and mmask_t, but add configure option --disable-lp64 in case
+	  anyone used that configuration.
+	+ update misc/shlib script to account for Mac OS X (report by Michail
+	  Vidiassov).
+	+ correct comparison for wrapping multibyte characters in
+	  waddch_literal() (report by Takahashi Tamotsu).
+
+20050320
+	+ add -c and -w options to tset to allow user to suppress ncurses'
+	  resizing of the terminal emulator window in the special case where it
+	  is not able to detect the true size (report by Win Delvaux, Debian
+	  #300419).
+	+ modify waddch_nosync() to account for locale zn_CH.GBK, which uses
+	  codes 128-159 as part of multibyte characters (report by Wang
+	  WenRui, Debian #300512).
+
+20050319
+	+ modify ncurses.c 'd' test to make it work with 88-color
+	  configuration, i.e., by implementing scrolling.
+	+ improve scrolling in ncurses.c 'c' and 'C' tests, e.g., for 88-color
+	  configuration.
+
+20050312
+	+ change tracemunch to use strict checking.
+	+ modify ncurses.c 'p' test to test line-drawing within a pad.
+	+ implement environment variable NCURSES_NO_UTF8_ACS to support
+	  miscellaneous terminal emulators which ignore alternate character
+	  set escape sequences when in UTF-8 mode.
+
+20050305
+	+ change NCursesWindow::err_handler() to a virtual function (request by
+	  Steve Beal).
+	+ modify fty_int.c and fty_num.c to handle wide characters (report by
+	  Wolfgang Gutjahr).
+	+ adapt fix for fty_alpha.c to fty_alnum.c, which also handled normal
+	  and wide characters inconsistently (report by Wolfgang Gutjahr).
+	+ update llib-* files to reflect internal interface additions/changes.
+
+20050226
+	+ improve test/configure script, adding tests for _XOPEN_SOURCE, etc.,
+	  from lynx.
+	+ add aixterm-16color terminfo entry -TD
+	+ modified xterm-new terminfo entry to work with tgetent() changes -TD
+	+ extended changes in tgetent() from 20040710 to allow the substring of
+	  sgr0 which matches rmacs to be at the beginning of the sgr0 string
+	  (request by Thomas Wolff).  Wolff says the visual effect in
+	  combination with pre-20040710 ncurses is improved.
+	+ fix off-by-one in winnstr() call which caused form field validation
+	  of multibyte characters to ignore the last character in a field.
+	+ correct logic in winsch() for inserting multibyte strings; the code
+	  would clear cells after the insertion rather than push them to the
+	  right (cf: 20040228).
+	+ fix an inconsistency in Check_Alpha_Field() between normal and wide
+	  character logic (report by Wolfgang Gutjahr).
+
+20050219
+	+ fix a bug in editing wide-characters in form library: deleting a
+	  nonwide character modified the previous wide-character.
+	+ update manpage to describe NCURSES_MOUSE_VERSION 2.
+	+ correct manpage description of mouseinterval() (Debian #280687).
+	+ add a note to default_colors.3x explaining why this extension was
+	  added (Debian #295083).
+	+ add traces to panel library.
+
+20050212
+	+ improve editing of wide-characters in form library:  left/right
+	  cursor movement, and single-character deletions work properly.
+	+ disable GPM mouse support when $TERM happens to be prefixed with
+	  "xterm".  Gpm_Open() would otherwise assert that it can deal with
+	  mouse events in this case.
+	+ modify GPM mouse support so it closes the server connection when
+	  the caller disables the mouse (report by Stanislav Ievlev).
+
+20050205
+	+ add traces for callback functions in form library.
+	+ add experimental configure option --enable-ext-mouse, which defines
+	  NCURSES_MOUSE_VERSION 2, and modifies the encoding of mouse events to
+	  support wheel mice, which may transmit buttons 4 and 5.  This works
+	  with xterm and similar X terminal emulators (prompted by question by
+	  Andreas Henningsson, this is also related to Debian #230990).
+	+ improve configure macros CF_XOPEN_SOURCE and CF_POSIX_C_SOURCE to
+	  avoid redefinition warnings on cygwin.
+
+20050129
+	+ merge remaining development changes for extended colors (mostly
+	  complete, does not appear to break other configurations).
+	+ add xterm-88color.dat (part of extended colors testing).
+	+ improve _tracedump() handling of color pairs past 96.
+	+ modify return-value from start_color() to return OK if colors have
+	  already been started.
+	+ modify curs_color.3x list error conditions for init_pair(),
+	  pair_content() and color_content().
+	+ modify pair_content() to return -1 for consistency with init_pair()
+	  if it corresponds to the default-color.
+	+ change internal representation of default-color to allow application
+	  to use color number 255.  This does not affect the total number of
+	  color pairs which are allowed.
+	+ add a top-level tags rule.
+
+20050122
+	+ add a null-pointer check in wgetch() in case it is called without
+	  first calling initscr().
+	+ add some null-pointer checks for SP, which is not set by libtinfo.
+	+ modify misc/shlib to ensure that absolute pathnames are used.
+	+ modify test/Makefile.in, etc., to link test programs only against the
+	  libraries needed, e.g., omit form/menu/panel library for the ones
+	  that are curses-specific.
+	+ change SP->_current_attr to a pointer, adjust ifdef's to ensure that
+	  libtinfo.so and libtinfow.so have the same ABI.  The reason for this
+	  is that the corresponding data which belongs to the upper-level
+	  ncurses library has a different size in each model (report by
+	  Stanislav Ievlev).
+
+20050115
+	+ minor fixes to allow test-compiles with g++.
+	+ correct column value shown in tic's warnings, which did not account
+	  for leading whitespace.
+	+ add a check in _nc_trans_string() for improperly ended strings, i.e.,
+	  where a following line begins in column 1.
+	+ modify _nc_save_str() to return a null pointer on buffer overflow.
+	+ improve repainting while scrolling wide-character data (Eungkyu Song).
+
+20050108
+	+ merge some development changes to extend color capabilities.
+
+20050101
+	+ merge some development changes to extend color capabilities.
+	+ fix manpage typo (FreeBSD report docs/75544).
+	+ update config.guess, config.sub
+	> patches for configure script (Albert Chin-A-Young):
+	+ improved fix to make mbstate_t recognized on HPUX 11i (cf:
+	  20030705), making vsscanf() prototype visible on IRIX64.  Tested for
+	  on HP-UX 11i, Solaris 7, 8, 9, AIX 4.3.3, 5.2, Tru64 UNIX 4.0D, 5.1,
+	  IRIX64 6.5, Redhat Linux 7.1, 9, and RHEL 2.1, 3.0.
+	+ print the result of the --disable-home-terminfo option.
+	+ use -rpath when compiling with SGI C compiler.
+
+20041225
+	+ add trace calls to remaining public functions in form and menu
+	  libraries.
+	+ fix check for numeric digits in test/ncurses.c 'b' and 'B' tests.
+	+ fix typo in test/ncurses.c 'c' test from 20041218.
+
+20041218
+	+ revise test/ncurses.c 'c' color test to improve use for xterm-88color
+	  and xterm-256color, added 'C' test using the wide-character color_set
+	  and attr_set functions.
+
+20041211
+	+ modify configure script to work with Intel compiler.
+	+ fix an limit-check in wadd_wchnstr() which caused labels in the
+	  forms-demo to be one character short.
+	+ fix typo in curs_addchstr.3x (Jared Yanovich).
+	+ add trace calls to most functions in form and menu libraries.
+	+ update working-position for adding wide-characters when window is
+	  scrolled (prompted by related report by Eungkyu Song).
+
+20041204
+	+ replace some references on Linux to wcrtomb() which use it to obtain
+	  the length of a multibyte string with _nc_wcrtomb, since wcrtomb() is
+	  broken in glibc (see Debian #284260).
+	+ corrected length-computation in wide-character support for
+	  field_buffer().
+	+ some fixes to frm_driver.c to allow it to accept multibyte input.
+	+ modify configure script to work with Intel 8.0 compiler.
+
+20041127
+	+ amend change to setupterm() in 20030405 which would reuse the value
+	  of cur_term if the same output was selected.  This now reuses it only
+	  when setupterm() is called from tgetent(), which has no notion of
+	  separate SCREENs.  Note that tgetent() must be called after initscr()
+	  or newterm() to use this feature (Redhat #140326).
+	+ add a check in CF_BUILD_CC macro to ensure that developer has given
+	  the --with-build-cc option when cross-compiling (report by Alexandre
+	  Campo).
+	+ improved configure script checks for _XOPEN_SOURCE and
+	  _POSIX_C_SOURCE (fix for IRIX 5.3 from Georg Schwarz, _POSIX_C_SOURCE
+	  updates from lynx).
+	+ cosmetic fix to test/gdc.c to recolor the bottom edge of the box
+	  for consistency (comment by Dan Nelson).
+
+20041120
+	+ update wsvt25 terminfo entry -TD
+	+ modify test/ins_wide.c to test all flavors of ins_wstr().
+	+ ignore filler-cells in wadd_wchnstr() when adding a cchar_t array
+	  which consists of multi-column characters, since this function
+	  constructs them (cf: 20041023).
+	+ modify winnstr() to return multibyte character strings for the
+	  wide-character configuration.
+
+20041106
+	+ fixes to make slk_set() and slk_wset() accept and store multibyte
+	  or multicolumn characters.
+
+20041030
+	+ improve color optimization a little by making _nc_do_color() check
+	  if the old/new pairs are equivalent to the default pair 0.
+	+ modify assume_default_colors() to not require that
+	  use_default_colors() be called first.
+
+20041023
+	+ modify term_attrs() to use termattrs(), add the extended attributes
+	  such as enter_horizontal_hl_mode for WA_HORIZONTAL to term_attrs().
+	+ add logic in waddch_literal() to clear orphaned cells when one
+	  multi-column character partly overwrites another.
+	+ improved logic for clearing cells when a multi-column character
+	  must be wrapped to a new line.
+	+ revise storage of cells for multi-column characters to correct a
+	  problem with repainting.  In the old scheme, it was possible for
+	  doupdate() to decide that only part of a multi-column character
+	  should be repainted since the filler cells stored only an attribute
+	  to denote them as fillers, rather than the character value and the
+	  attribute.
+
+20041016
+	+ minor fixes for traces.
+	+ add SP->_screen_acs_map[], used to ensure that mapping of missing
+	  line-drawing characters is handled properly.  For example, ACS_DARROW
+	  is absent from xterm-new, and it was coincidentally displayed the
+	  same as ACS_BTEE.
+
+20041009
+	+ amend 20021221 workaround for broken acs to reset the sgr, rmacs
+	  and smacs strings as well.  Also modify the check for screen's
+	  limitations in that area to allow the multi-character shift-in
+	  and shift-out which seem to work.
+	+ change GPM initialization, using dl library to load it dynamically
+	  at runtime (Debian #110586).
+
+20041002
+	+ correct logic for color pair in setcchar() and getcchar() (patch by
+	  Marcin 'Qrczak' Kowalczyk).
+	+ add t/T commands to ncurses b/B tests to allow a different color to
+	  be tested for the attrset part of the test than is used in the
+	  background color.
+
+20040925
+	+ fix to make setcchar() to work when its wchar_t* parameter is
+	  pointing to a string which contains more data than can be converted.
+	+ modify wget_wstr() and example in ncurses.c to work if wchar_t and
+	  wint_t are different sizes (report by Marcin 'Qrczak' Kowalczyk).
+
+20040918
+	+ remove check in wget_wch() added to fix an infinite loop, appears to
+	  have been working around a transitory glibc bug, and interferes
+	  with normal operation (report by Marcin 'Qrczak' Kowalczyk).
+	+ correct wadd_wch() and wecho_wch(), which did not pass the rendition
+	  information (report by Marcin 'Qrczak' Kowalczyk).
+	+ fix aclocal.m4 so that the wide-character version of ncurses gets
+	  compiled as libncursesw.5.dylib, instead of libncurses.5w.dylib
+	  (adapted from patch by James J Ramsey).
+	+ change configure script for --with-caps option to indicate that it
+	  is no longer experimental.
+	+ change configure script to reflect the fact that --enable-widec has
+	  not been "experimental" since 5.3 (report by Bruno Lustosa).
+
+20040911
+	+ add 'B' test to ncurses.c, to exercise some wide-character functions.
+
+20040828
+	+ modify infocmp -i option to match 8-bit controls against its table
+	  entries, e.g., so it can analyze the xterm-8bit entry.
+	+ add morphos terminfo entry, improve amiga-8bit entry (Pavel Fedin).
+	+ correct translation of "%%" in terminfo format to termcap, e.g.,
+	  using "tic -C" (Redhat #130921).
+	+ modified configure script CF_XOPEN_SOURCE macro to ensure that if
+	  it defines _POSIX_C_SOURCE, that it defines it to a specific value
+	  (comp.os.stratus newsgroup comment).
+
+20040821
+	+ fixes to build with Ada95 binding with gnat 3.4 (all warnings are
+	  fatal, and gnat does not follow the guidelines for pragmas).
+	  However that did find a coding error in Assume_Default_Colors().
+	+ modify several terminfo entries to ensure xterm mouse and cursor
+	  visibility are reset in rs2 string:  hurd, putty, gnome,
+	  konsole-base, mlterm, Eterm, screen (Debian #265784, Debian #55637).
+	  The xterm entries are left alone - old ones for compatibility, and
+	  the new ones do not require this change. -TD
+
+20040814
+	+ fake a SIGWINCH in newterm() to accommodate buggy terminal emulators
+	  and window managers (Debian #265631).
+	> terminfo updates -TD
+	+ remove dch/dch1 from rxvt because they are implemented inconsistently
+	  with the common usage of bce/ech
+	+ remove khome from vt220 (vt220's have no home key)
+	+ add rxvt+pcfkeys
+
+20040807
+	+ modify test/ncurses.c 'b' test, adding v/V toggles to cycle through
+	  combinations of video attributes so that for instance bold and
+	  underline can be tested.  This made the legend too crowded, added
+	  a help window as well.
+	+ modify test/ncurses.c 'b' test to cycle through default colors if
+	  the -d option is set.
+	+ update putty terminfo entry (Robert de Bath).
+
+20040731
+	+ modify test/cardfile.c to allow it to read more data than can be
+	  displayed.
+	+ correct logic in resizeterm.c which kept it from processing all
+	  levels of window hierarchy (reports by Folkert van Heusden,
+	  Chris Share).
+
+20040724
+	+ modify "tic -cv" to ignore delays when comparing strings.  Also
+	  modify it to ignore a canceled sgr string, e.g., for terminals which
+	  cannot properly combine attributes in one control sequence.
+	+ corrections for gnome and konsole entries (Redhat #122815, patch by
+	  Hans de Goede)
+	> terminfo updates -TD
+	+ make ncsa-m rmacs/smacs consistent with sgr
+	+ add sgr, rc/sc and ech to syscons entries
+	+ add function-keys to decansi
+	+ add sgr to mterm-ansi
+	+ add sgr, civis, cnorm to emu
+	+ correct/simplify cup in addrinfo
+
+20040717
+	> terminfo updates -TD
+	+ add xterm-pc-fkeys
+	+ review/update gnome and gnome-rh90 entries (prompted by Redhat
+	  #122815).
+	+ review/update konsole entries
+	+ add sgr, correct sgr0 for kterm and mlterm
+	+ correct tsl string in kterm
+
+20040711
+	+ add configure option --without-xterm-new
+
+20040710
+	+ add check in wget_wch() for printable bytes that are not part of a
+	  multibyte character.
+	+ modify wadd_wchnstr() to render text using window's background
+	  attributes.
+	+ improve tic's check to compare sgr and sgr0.
+	+ fix c++ directory's .cc.i rule.
+	+ modify logic in tgetent() which adjusts the termcap "me" string
+	  to work with ISO-2022 string used in xterm-new (cf: 20010908).
+	+ modify tic's check for conflicting function keys to omit that if
+	  converting termcap to termcap format.
+	+ add -U option to tic and infocmp.
+	+ add rmam/smam to linux terminfo entry (Trevor Van Bremen)
+	> terminfo updates -TD
+	+ minor fixes for emu
+	+ add emu-220
+	+ change wyse acsc strings to use 'i' map rather than 'I'
+	+ fixes for avatar0
+	+ fixes for vp3a+
+
+20040703
+	+ use tic -x to install terminfo database -TD
+	+ add -x to infocmp's usage message.
+	+ correct field used for comparing O_ROWMAJOR in set_menu_format()
+	  (report/patch by Tony Li).
+	+ fix a missing nul check in set_field_buffer() from 20040508 changes.
+	> terminfo updates -TD
+	  + make xterm-xf86-v43 derived from xterm-xf86-v40 rather than
+	    xterm-basic -TD
+	  + align with xterm patch #192's use of xterm-new -TD
+	  + update xterm-new and xterm-8bit for cvvis/cnorm strings -TD
+	  + make xterm-new the default "xterm" entry -TD
+
+20040626
+	+ correct BUILD_CPPFLAGS substitution in ncurses/Makefile.in, to allow
+	  cross-compiling from a separate directory tree (report/patch by
+	  Dan Engel).
+	+ modify is_term_resized() to ensure that window sizes are nonzero,
+	  as documented in the manpage (report by Ian Collier).
+	+ modify CF_XOPEN_SOURCE configure macro to make Hurd port build
+	  (Debian #249214, report/patch by Jeff Bailey).
+	+ configure-script mods from xterm, e.g., updates to CF_ADD_CFLAGS
+	+ update config.guess, config.sub
+	> terminfo updates -TD
+	  + add mlterm
+	  + add xterm-xf86-v44
+	  + modify xterm-new aka xterm-xfree86 to accommodate luit, which
+	    relies on G1 being used via an ISO-2022 escape sequence (report by
+	    Juliusz Chroboczek)
+	  + add 'hurd' entry
+
+20040619
+	+ reconsidered winsnstr(), decided after comparing other
+	  implementations that wrapping is an X/Open documentation error.
+	+ modify test/inserts.c to test all flavors of insstr().
+
+20040605
+	+ add setlocale() calls to a few test programs which may require it:
+	  demo_forms.c, filter.c, ins_wide.c, inserts.c
+	+ correct a few misspelled function names in ncurses-intro.html (report
+	  by Tony Li).
+	+ correct internal name of key_defined() manpage, which conflicted with
+	  define_key().
+
+20040529
+	+ correct size of internal pad used for holding wide-character
+	  field_buffer() results.
+	+ modify data_ahead() to work with wide-characters.
+
+20040522
+	+ improve description of terminfo if-then-else expressions (suggested
+	  by Arne Thomassen).
+	+ improve test/ncurses.c 'd' test, allow it to use external file for
+	  initial palette (added xterm-16color.dat and linux-color.dat), and
+	  reset colors to the initial palette when starting/ending the test.
+	+ change limit-check in init_color() to allow r/g/b component to
+	  reach 1000 (cf: 20020928).
+
+20040516
+	+ modify form library to use cchar_t's rather than char's in the
+	  wide-character configuration for storing data for field buffers.
+	+ correct logic of win_wchnstr(), which did not work for more than
+	  one cell.
+
+20040508
+	+ replace memset/memcpy usage in form library with for-loops to
+	  simplify changing the datatype of FIELD.buf, part of wide-character
+	  changes.
+	+ fix some inconsistent use of #if/#ifdef (report by Alain Guibert).
+
+20040501
+	+ modify menu library to account for actual number of columns used by
+	  multibyte character strings, in the wide-character configuration
+	  (adapted from patch by Philipp Tomsich).
+	+ add "-x" option to infocmp like tic's "-x", for use in "-F"
+	  comparisons.  This modifies infocmp to only report extended
+	  capabilities if the -x option is given, making this more consistent
+	  with tic.  Some scripts may break, since infocmp previous gave this
+	  information without an option.
+	+ modify termcap-parsing to retain 2-character aliases at the beginning
+	  of an entry if the "-x" option is used in tic.
+
+20040424
+	+ minor compiler-warning and test-program fixes.
+
+20040417
+	+ modify tic's missing-sgr warning to apply to terminfo only.
+	+ free some memory leaks in tic.
+	+ remove check in post_menu() that prevented menus from extending
+	  beyond the screen (request by Max J. Werner).
+	+ remove check in newwin() that prevents allocating windows
+	  that extend beyond the screen.  Solaris curses does this.
+	+ add ifdef in test/color_set.c to allow it to compile with older
+	  curses.
+	+ add napms() calls to test/dots.c to make it not be a CPU hog.
+
+20040403
+	+ modify unctrl() to return null if its parameter does not correspond
+	  to an unsigned char.
+	+ add some limit-checks to guard isprint(), etc., from being used on
+	  values that do not fit into an unsigned char (report by Sami Farin).
+
+20040328
+	+ fix a typo in the _nc_get_locale() change.
+
+20040327
+	+ modify _nc_get_locale() to use setlocale() to query the program's
+	  current locale rather than using getenv().  This fixes a case in tin
+	  which relies on legacy treatment of 8-bit characters when the locale
+	  is not initialized (reported by Urs Jansen).
+	+ add sgr string to screen's and rxvt's terminfo entries -TD.
+	+ add a check in tic for terminfo entries having an sgr0 but no sgr
+	  string.  This confuses Tru64 and HPUX curses when combined with
+	  color, e.g., making them leave line-drawing characters in odd places.
+	+ correct casts used in ABSENT_BOOLEAN, CANCELLED_BOOLEAN, matches the
+	  original definitions used in Debian package to fix PowerPC bug before
+	  20030802 (Debian #237629).
+
+20040320
+	+ modify PutAttrChar() and PUTC() macro to improve use of
+	  A_ALTCHARSET attribute to prevent line-drawing characters from
+	  being lost in situations where the locale would otherwise treat the
+	  raw data as nonprintable (Debian #227879).
+
+20040313
+	+ fix a redefinition of CTRL() macro in test/view.c for AIX 5.2 (report
+	  by Jim Idle).
+	+ remove ".PP" after ".SH NAME" in a few manpages; this confuses
+	  some apropos script (Debian #237831).
+
+20040306
+	+ modify ncurses.c 'r' test so editing commands, like inserted text,
+	  set the field background, and the state of insert/overlay editing
+	  mode is shown in that test.
+	+ change syntax of dummy targets in Ada95 makefiles to work with pmake.
+	+ correct logic in test/ncurses.c 'b' for noncolor terminals which
+	  did not recognize a quit-command (cf: 20030419).
+
+20040228
+	+ modify _nc_insert_ch() to allow for its input to be part of a
+	  multibyte string.
+	+ split out lib_insnstr.c, to prepare to rewrite it.  X/Open states
+	  that this function performs wrapping, unlike all of the other
+	  insert-functions.  Currently it does not wrap.
+	+ check for nl_langinfo(CODESET), use it if available (report by
+	  Stanislav Ievlev).
+	+ split-out CF_BUILD_CC macro, actually did this for lynx first.
+	+ fixes for configure script CF_WITH_DBMALLOC and CF_WITH_DMALLOC,
+	  which happened to work with bash, but not with Bourne shell (report
+	  by Marco d'Itri via tin-dev).
+
+20040221
+	+ some changes to adapt the form library to wide characters, incomplete
+	  (request by Mike Aubury).
+	+ add symbol to curses.h which can be used to suppress include of
+	  stdbool.h, e.g.,
+		#define NCURSES_ENABLE_STDBOOL_H 0
+		#include <curses.h>
+	  (discussion on XFree86 mailing list).
+
+20040214
+	+ modify configure --with-termlib option to accept a value which sets
+	  the name of the terminfo library.  This would allow a packager to
+	  build libtinfow.so renamed to coincide with libtinfo.so (discussion
+	  with Stanislav Ievlev).
+	+ improve documentation of --with-install-prefix, --prefix and
+	  $(DESTDIR) in INSTALL (prompted by discussion with Paul Lew).
+	+ add configure check if the compiler can use -c -o options to rename
+	  its output file, use that to omit the 'cd' command which was used to
+	  ensure object files are created in a separate staging directory
+	  (prompted by comments by Johnny Wezel, Martin Mokrejs).
+
+20040208 5.4 release for upload to ftp.gnu.org
+	+ update TO-DO.
+
+20040207 pre-release
+	+ minor fixes to _nc_tparm_analyze(), i.e., do not count %i as a param,
+	  and do not count %d if it follows a %p.
+	+ correct an inconsistency between handling of codes in the 128-255
+	  range, e.g., as illustrated by test/ncurses.c f/F tests.  In POSIX
+	  locale, the latter did not show printable results, while the former
+	  did.
+	+ modify MKlib_gen.sh to compensate for broken C preprocessor on Mac
+	  OS X, which alters "%%" to "% % " (report by Robert Simms, fix
+	  verified by Scott Corscadden).
+
+20040131 pre-release
+	+ modify SCREEN struct to align it between normal/wide curses flavors
+	  to simplify future changes to build a single version of libtinfo
+	  (patch by Stanislav Ievlev).
+	+ document handling of carriage return by addch() in manpage.
+	+ document special features of unctrl() in manpage.
+	+ documented interface changes in INSTALL.
+	+ corrected control-char test in lib_addch.c to account for locale
+	  (Debian #230335, cf: 971206).
+	+ updated test/configure.in to use AC_EXEEXT and AC_OBJEXT.
+	+ fixes to compile Ada95 binding with Debian gnat 3.15p-4 package.
+	+ minor configure-script fixes for older ports, e.g., BeOS R4.5.
+
+20040125 pre-release
+	+ amend change to PutAttrChar() from 20030614 which computed the number
+	  of cells for a possibly multi-cell character.  The 20030614 change
+	  forced the cell to a blank if the result from wcwidth() was not
+	  greater than zero.  However, wcwidth() called for parameters in the
+	  range 128-255 can give this return value.  The logic now simply
+	  ensures that the number of cells is greater than zero without
+	  modifying the displayed value.
+
+20040124 pre-release
+	+ looked good for 5.4 release for upload to ftp.gnu.org (but see above)
+	+ modify configure script check for ranlib to use AC_CHECK_TOOL, since
+	  that works better for cross-compiling.
+
+20040117 pre-release
+	+ modify lib_get_wch.c to prefer mblen/mbtowc over mbrlen/mbrtowc to
+	  work around core dump in Solaris 8's locale support, e.g., for
+	  zh_CN.GB18030 (report by Saravanan Bellan).
+	+ add includes for <stdarg.h> and <stdio.h> in configure script macro
+	  to make <wchar.h> check work with Tru64 4.0d.
+	+ add terminfo entry for U/Win -TD
+	+ add terminfo entries for SFU aka Interix aka OpenNT (Federico
+	  Bianchi).
+	+ modify tput's error messages to prefix them with the program name
+	  (report by Vincent Lefevre, patch by Daniel Jacobowitz (see Debian
+	  #227586)).
+	+ correct a place in tack where exit_standout_mode was used instead of
+	  exit_attribute_mode (patch by Jochen Voss (see Debian #224443)).
+	+ modify c++/cursesf.h to use const in the Enumeration_Field method.
+	+ remove an ambiguous (actually redundant) method from c++/cursesf.h
+	+ make $HOME/.terminfo update optional (suggested by Stanislav Ievlev).
+	+ improve sed script which extracts libtool's version in the
+	  CF_WITH_LIBTOOL macro.
+	+ add ifdef'd call to AC_PROG_LIBTOOL to CF_WITH_LIBTOOL macro (to
+	  simplify local patch for Albert Chin-A-Young)..
+	+ add $(CXXFLAGS) to link command in c++/Makefile.in (adapted from
+	  patch by Albert Chin-A-Young)..
+	+ fix a missing substitution in configure.in for "$target" needed for
+	  HPUX .so/.sl case.
+	+ resync CF_XOPEN_SOURCE configure macro with lynx; fixes IRIX64 and
+	  NetBSD 1.6 conflicts with _XOPEN_SOURCE.
+	+ make check for stdbool.h more specific, to ensure that including it
+	  will actually define/declare bool for the configured compiler.
+	+ rewrite ifdef's in curses.h relating NCURSES_BOOL and bool.  The
+	  intention of that is to #define NCURSES_BOOL as bool when the
+	  compiler declares bool, and to #define bool as NCURSES_BOOL when it
+	  does not (reported by Jim Gifford, Sam Varshavchik, cf: 20031213).
+
+20040110 pre-release
+	+ change minor version to 4, i.e., ncurses 5.4
+	+ revised/improved terminfo entries for tvi912b, tvi920b (Benjamin C W
+	  Sittler).
+	+ simplified ncurses/base/version.c by defining the result from the
+	  configure script rather than using sprintf (suggested by Stanislav
+	  Ievlev).
+	+ remove obsolete casts from c++/cursesw.h (reported by Stanislav
+	  Ievlev).
+	+ modify configure script so that when configuring for termlib, programs
+	  such as tic are not linked with the upper-level ncurses library
+	  (suggested by Stanislav Ievlev).
+	+ move version.c from ncurses/base to ncurses/tinfo to allow linking
+	  of tic, etc., using libtinfo (suggested by Stanislav Ievlev).
+
+20040103
+	+ adjust -D's to build ncursesw on OpenBSD.
+	+ modify CF_PROG_EXT to make OS/2 build with EXEEXT.
+	+ add pecho_wchar().
+	+ remove <wctype.h> include from lib_slk_wset.c which is not needed (or
+	  available) on older platforms.
+
+20031227
+	+ add -D's to build ncursew on FreeBSD 5.1.
+	+ modify shared library configuration for FreeBSD 4.x/5.x to add the
+	  soname information (request by Marc Glisse).
+	+ modify _nc_read_tic_entry() to not use MAX_ALIAS, but PATH_MAX only
+	  for limiting the length of a filename in the terminfo database.
+	+ modify termname() to return the terminal name used by setupterm()
+	  rather than $TERM, without truncating to 14 characters as documented
+	  by X/Open (report by Stanislav Ievlev, cf:  970719).
+	+ re-add definition for _BSD_TYPES, lost in merge (cf: 20031206).
+
+20031220
+	+ add configure option --with-manpage-format=catonly to address
+	  behavior of BSDI, allow install of man+cat files on NetBSD, whose
+	  behavior has diverged by requiring both to be present.
+	+ remove leading blanks from comment-lines in manlinks.sed script to
+	  work with Tru64 4.0d.
+	+ add screen.linux terminfo entry (discussion on mutt-users mailing
+	  list).
+
+20031213
+	+ add a check for tic to flag missing backslashes for termcap
+	  continuation lines.  ncurses reads the whole entry, but termcap
+	  applications do not.
+	+ add configure option "--with-manpage-aliases" extending
+	  "--with-manpage-aliases" to provide the option of generating ".so"
+	  files rather than symbolic links for manpage aliases.
+	+ add bool definition in include/curses.h.in for configurations with no
+	  usable C++ compiler (cf: 20030607).
+	+ fix pathname of SigAction.h for building with --srcdir (reported by
+	  Mike Castle).
+
+20031206
+	+ folded ncurses/base/sigaction.c into includes of ncurses/SigAction.h,
+	  since that header is used only within ncurses/tty/lib_tstp.c, for
+	  non-POSIX systems (discussion with Stanislav Ievlev).
+	+ remove obsolete _nc_outstr() function (report by Stanislav Ievlev
+	  <inger@altlinux.org>).
+	+ add test/background.c and test/color_set.c
+	+ modify color_set() function to work with color pair 0 (report by
+	  George Andreou <gbandreo@tem.uoc.gr>).
+	+ add configure option --with-trace, since defining TRACE seems too
+	  awkward for some cases.
+	+ remove a call to _nc_free_termtype() from read_termtype(), since the
+	  corresponding buffer contents were already zeroed by a memset (cf:
+	  20000101).
+	+ improve configure check for _XOPEN_SOURCE and related definitions,
+	  adding special cases for Solaris' __EXTENSIONS__ and FreeBSD's
+	  __BSD_TYPES (reports by Marc Glisse <marc.glisse@normalesup.org>).
+	+ small fixes to compile on Solaris and IRIX64 using cc.
+	+ correct typo in check for pre-POSIX sort options in MKkey_defs.sh
+	  (cf: 20031101).
+
+20031129
+	+ modify _nc_gettime() to avoid a problem with arithmetic on unsigned
+	  values (Philippe Blain).
+	+ improve the nanosleep() logic in napms() by checking for EINTR and
+	  restarting (Philippe Blain).
+	+ correct expression for "%D" in lib_tgoto.c (Juha Jarvi
+	  <mooz@welho.com>).
+
+20031122
+	+ add linux-vt terminfo entry (Andrey V Lukyanov <land@long.yar.ru>).
+	+ allow "\|" escape in terminfo; tic should not warn about this.
+	+ save the full pathname of the trace-file the first time it is opened,
+	  to avoid creating it in different directories if the application
+	  opens and closes it while changing its working directory.
+	+ modify configure script to provide a non-empty default for
+	  $BROKEN_LINKER
+
+20031108
+	+ add DJGPP to special case of DOS-style drive letters potentially
+	  appearing in TERMCAP environment variable.
+	+ fix some spelling in comments (reports by Jason McIntyre, Jonathon
+	  Gray).
+	+ update config.guess, config.sub
+
+20031101
+	+ fix a memory leak in error-return from setupterm() (report by
+	  Stanislav Ievlev <inger@altlinux.org>).
+	+ use EXEEXT and OBJEXT consistently in makefiles.
+	+ amend fixes for cross-compiling to use separate executable-suffix
+	  BUILD_EXEEXT (cf: 20031018).
+	+ modify MKkey_defs.sh to check for sort utility that does not
+	  recognize key options, e.g., busybox (report by Peter S Mazinger
+	  <ps.m@gmx.net>).
+	+ fix potential out-of-bounds indexing in _nc_infotocap() (found by
+	  David Krause using some of the new malloc debugging features
+	  under OpenBSD, patch by Ted Unangst).
+	+ modify CF_LIB_SUFFIX for Itanium releases of HP-UX, which use a
+	  ".so" suffix (patch by Jonathan Ward <Jonathan.Ward@hp.com>).
+
+20031025
+	+ update terminfo for xterm-xfree86 -TD
+	+ add check for multiple "tc=" clauses in a termcap to tic.
+	+ check for missing op/oc in tic.
+	+ correct _nc_resolve_uses() and _nc_merge_entry() to allow infocmp and
+	  tic to show cancelled capabilities.  These functions were ignoring
+	  the state of the target entry, which should be untouched if cancelled.
+	+ correct comment in tack/output.c (Debian #215806).
+	+ add some null-pointer checks to lib_options.c (report by Michael
+	  Bienia).
+	+ regenerated html documentation.
+	+ correction to tar-copy.sh, remove a trap command that resulted in
+	  leaving temporary files (cf: 20030510).
+	+ remove contact/maintainer addresses for Juergen Pfeifer (his request).
+
+20031018
+	+ updated test/configure to reflect changes for libtool (cf: 20030830).
+	+ fix several places in tack/pad.c which tested and used the parameter-
+	  and parameterless strings inconsistently, i.e., in pad_rin(),
+	  pad_il(), pad_indn() and pad_dl() (Debian #215805).
+	+ minor fixes for configure script and makefiles to cleanup executables
+	  generated when cross-compiling for DJGPP.
+	+ modify infocmp to omit check for $TERM for operations that do not
+	  require it, e.g., "infocmp -e" used to build fallback list (report by
+	  Egmont Koblinger).
+
+20031004
+	+ add terminfo entries for DJGPP.
+	+ updated note about maintainer in ncurses-intro.html
+
+20030927
+	+ update terminfo entries for gnome terminal.
+	+ modify tack to reset colors after each color test, correct a place
+	  where exit_standout_mode was used instead of exit_attribute_mode.
+	+ improve tack's bce test by making it set colors other than black
+	  on white.
+	+ plug a potential recursion between napms() and _nc_timed_wait()
+	  (report by Philippe Blain).
+
+20030920
+	+ add --with-rel-version option to allow workaround to allow making
+	  libtool on Darwin generate the "same" library names as with the
+	  --with-shared option.  The Darwin ld program does not work well
+	  with a zero as the minor-version value (request by Chris Zubrzycki).
+	+ modify CF_MIXEDCASE_FILENAMES macro to work with cross-compiling.
+	+ modify tack to allow it to run from fallback terminfo data.
+	> patch by Philippe Blain:
+	+ improve PutRange() by adjusting call to EmitRange() and corresponding
+	  return-value to not emit unchanged characters on the end of the
+	  range.
+	+ improve a check for changed-attribute by exiting a loop when the
+	  change is found.
+	+ improve logic in TransformLine(), eliminating a duplicated comparison
+	  in the clr_bol logic.
+
+20030913
+	> patch by Philippe Blain:
+	+ in ncurses/tty/lib_mvcur.c,
+	  move the label 'nonlocal' just before the second gettimeofday() to
+	  be able to compute the diff time when 'goto nonlocal' used.
+	  Rename 'msec' to 'microsec' in the debug-message.
+	+ in ncurses/tty/lib_mvcur.c,
+	  Use _nc_outch() in carriage return/newline movement instead of
+	  putchar() which goes to stdout.  Move test for xold>0 out of loop.
+	+ in ncurses/tinfo/setbuf.c,
+	  Set the flag SP->_buffered at the end of operations when all has been
+	  successful (typeMalloc can fail).
+	+ simplify NC_BUFFERED macro by moving check inside _nc_setbuf().
+
+20030906
+	+ modify configure script to avoid using "head -1", which does not
+	  work if POSIXLY_CORRECT (sic) is set.
+	+ modify run_tic.in to avoid using wrong shared libraries when
+	  cross-compiling (Dan Kegel).
+
+20030830
+	+ alter configure script help message to make it clearer that
+	  --with-build-cc does not specify a cross-compiler (suggested by Dan
+	  Kegel <dank@kegel.com>).
+	+ modify configure script to accommodate libtool 1.5, as well as add an
+	  parameter to the "--with-libtool" option which can specify the
+	  pathname of libtool (report by Chris Zubrzycki).  We note that
+	  libtool 1.5 has more than one bug in its C++ support, so it is not
+	  able to install libncurses++, for instance, if $DESTDIR or the option
+	  --with-install-prefix is used.
+
+20030823
+	> patch by Philippe Blain:
+	+ move assignments to SP->_cursrow, SP->_curscol into online_mvcur().
+	+ make baudrate computation in delay_output() consistent with the
+	  assumption in _nc_mvcur_init(), i.e., a byte is 9 bits.
+
+20030816
+	+ modify logic in waddch_literal() to take into account zh_TW.Big5
+	  whose multibyte sequences may contain "printable" characters, e.g.,
+	  a "g" in the sequence "\247g" (Debian #204889, cf: 20030621).
+	+ improve storage used by _nc_safe_strcpy() by ensuring that the size
+	  is reset based on the initialization call, in case it were called
+	  after other strcpy/strcat calls (report by Philippe Blain).
+	> patch by Philippe Blain:
+	+ remove an unused ifdef for REAL_ATTR & WANT_CHAR
+	+ correct a place where _cup_cost was used rather than _cuu_cost
+
+20030809
+	+ fix a small memory leak in _nc_free_termtype().
+	+ close trace-file if trace() is called with a zero parameter.
+	+ free memory allocated for soft-key strings, in delscreen().
+	+ fix an allocation size in safe_sprintf.c for the "*" format code.
+	+ correct safe_sprintf.c to not return a null pointer if the format
+	  happens to be an empty string.  This applies to the "configure
+	  --enable-safe-sprintf" option (Redhat #101486).
+
+20030802
+	+ modify casts used for ABSENT_BOOLEAN and CANCELLED_BOOLEAN (report by
+	  Daniel Jacobowitz).
+	> patch by Philippe Blain:
+	+ change padding for change_scroll_region to not be proportional to
+	  the size of the scroll-region.
+	+ correct error-return in _nc_safe_strcat().
+
+20030726
+	+ correct limit-checks in _nc_scroll_window() (report and test-case by
+	  Thomas Graf <graf@dms.at> cf: 20011020).
+	+ re-order configure checks for _XOPEN_SOURCE to avoid conflict with
+	  _GNU_SOURCE check.
+
+20030719
+	+ use clr_eol in preference to blanks for bce terminals, so select and
+	  paste will have fewer trailing blanks, e.g., when using xterm
+	  (request by Vincent Lefevre).
+	+ correct prototype for wunctrl() in manpage.
+	+ add configure --with-abi-version option (discussion with Charles
+	  Wilson).
+	> cygwin changes from Charles Wilson:
+	  + aclocal.m4: on cygwin, use autodetected prefix for import
+	    and static lib, but use "cyg" for DLL.
+	  + include/ncurses_dll.h: correct the comments to reflect current
+	    status of cygwin/mingw port.  Fix compiler warning.
+	  + misc/run_tic.in: ensure that tic.exe can find the uninstalled
+	    DLL, by adding the lib-directory to the PATH variable.
+	  + misc/terminfo.src (nxterm|xterm-color): make xterm-color
+	    primary instead of nxterm, to match XFree86's xterm.terminfo
+	    usage and to prevent circular links.
+	    (rxvt): add additional codes from rxvt.org.
+	    (rxvt-color): new alias
+	    (rxvt-xpm): new alias
+	    (rxvt-cygwin): like rxvt, but with special acsc codes.
+	    (rxvt-cygwin-native): ditto.  rxvt may be run under XWindows, or
+	    with a "native" MSWin GUI.	Each takes different acsc codes,
+	    which are both different from the "normal" rxvt's acsc.
+	    (cygwin): cygwin-in-cmd.exe window.	 Lots of fixes.
+	    (cygwinDBG): ditto.
+	  + mk-1st.awk: use "cyg" for the DLL prefix, but "lib" for import
+	    and static libs.
+
+20030712
+	+ update config.guess, config.sub
+	+ add triples for configuring shared libraries with the Debian
+	  GNU/FreeBSD packages (patch by Robert Millan <zeratul2@wanadoo.es>).
+
+20030705
+	+ modify CF_GCC_WARNINGS so it only applies to gcc, not g++.  Some
+	  platforms have installed g++ along with the native C compiler, which
+	  would not accept gcc warning options.
+	+ add -D_XOPEN_SOURCE=500 when configuring with --enable-widec, to
+	  get mbstate_t declaration on HPUX 11.11 (report by David Ellement).
+	+ add _nc_pathlast() to get rid of casts in _nc_basename() calls.
+	+ correct a sign-extension in wadd_wch() and wecho_wchar() from
+	  20030628 (report by Tomohiro Kubota).
+	+ work around omission of btowc() and wctob() from wide-character
+	  support (sic) in NetBSD 1.6 using mbtowc() and wctomb() (report by
+	  Gabor Z Papp).
+	+ add portability note to curs_get_wstr.3x (Debian #199957).
+
+20030628
+	+ rewrite wadd_wch() and wecho_wchar() to call waddch() and wechochar()
+	  respectively, to avoid calling waddch_noecho() with wide-character
+	  data, since that function assumes its input is 8-bit data.
+	  Similarly, modify waddnwstr() to call wadd_wch().
+	+ remove logic from waddnstr() which transformed multibyte character
+	  strings into wide-characters.  Rewrite of waddch_literal() from
+	  20030621 assumes its input is raw multibyte data rather than wide
+	  characters (report by Tomohiro Kubota).
+
+20030621
+	+ write getyx() and related 2-return macros in terms of getcury(),
+	  getcurx(), etc.
+	+ modify waddch_literal() in case an application passes bytes of a
+	  multibyte character directly to waddch().  In this case, waddch()
+	  must reassemble the bytes into a wide-character (report by Tomohiro
+	  Kubota <kubota@debian.org>).
+
+20030614
+	+ modify waddch_literal() in case a multibyte value occupies more than
+	  two cells.
+	+ modify PutAttrChar() to compute the number of character cells that
+	  are used in multibyte values.  This fixes a problem displaying
+	  double-width characters (report/test by Mitsuru Chinen
+	  <mchinen@yamato.ibm.com>).
+	+ add a null-pointer check for result of keyname() in _tracechar()
+	+ modify _tracechar() to work around glibc sprintf bug.
+
+20030607
+	+ add a call to setlocale() in cursesmain.cc, making demo display
+	  properly in a UTF-8 locale.
+	+ add a fallback definition in curses.priv.h for MB_LEN_MAX (prompted
+	  by discussion with Gabor Z Papp).
+	+ use macros NCURSES_ACS() and NCURSES_WACS() to hide cast needed to
+	  appease -Wchar-subscript with g++ 3.3 (Debian #195732).
+	+ fix a redefinition of $RANLIB in the configure script when libtool
+	  is used, which broke configure on Mac OS X (report by Chris Zubrzycki
+	  <beren@mac.com>).
+	+ simplify ifdef for bool declaration in curses.h.in (suggested by
+	  Albert Chin-A-Young).
+	+ remove configure script check to allow -Wconversion for older
+	  versions of gcc (suggested by Albert Chin-A-Young).
+
+20030531
+	+ regenerated html manpages.
+	+ modify ifdef's in curses.h.in that disabled use of __attribute__()
+	  for g++, since recent versions implement the cases which ncurses uses
+	  (Debian #195230).
+	+ modify _nc_get_token() to handle a case where an entry has no
+	  description, and capabilities begin on the same line as the entry
+	  name.
+	+ fix a typo in ncurses_dll.h reported by gcc 3.3.
+	+ add an entry for key_defined.3x to man_db.renames.
+
+20030524
+	+ modify setcchar() to allow converting control characters to complex
+	  characters (report/test by Mitsuru Chinen <mchinen@yamato.ibm.com>).
+	+ add tkterm entry -TD
+	+ modify parse_entry.c to allow a terminfo entry with a leading
+	  2-character name (report by Don Libes).
+	+ corrected acsc in screen.teraterm, which requires a PC-style mapping.
+	+ fix trace statements in read_entry.c to use lseek() rather than
+	  tell().
+	+ fix signed/unsigned warnings from Sun's compiler (gcc should give
+	  these warnings, but it is unpredictable).
+	+ modify configure script to omit -Winline for gcc 3.3, since that
+	  feature is broken.
+	+ modify manlinks.sed to add a few functions that were overlooked since
+	  they return function pointers:  field_init, field_term, form_init,
+	  form_term, item_init, item_term, menu_init and menu_term.
+
+20030517
+	+ prevent recursion in wgetch() via wgetnstr() if the connection cannot
+	  be switched between cooked/raw modes because it is not a TTY (report
+	  by Wolfgang Gutjahr <gutw@knapp.com>).
+	+ change parameter of define_key() and key_defined() to const (prompted
+	  by Debian #192860).
+	+ add a check in test/configure for ncurses extensions, since there
+	  are some older versions, etc., which would not compile with the
+	  current test programs.
+	+ corrected demo in test/ncurses.c of wgetn_wstr(), which did not
+	  convert wchar_t string to multibyte form before printing it.
+	+ corrections to lib_get_wstr.c:
+	  + null-terminate buffer passed to setcchar(), which occasionally
+	    failed.
+	  + map special characters such as erase- and kill-characters into
+	    key-codes so those will work as expected even if they are not
+	    mentioned in the terminfo.
+	+ modify PUTC() and Charable() macros to make wide-character line
+	  drawing work for POSIX locale on Linux console (cf: 20021221).
+
+20030510
+	+ make typography for program options in manpages consistent (report
+	  by Miloslav Trmac <mitr@volny.cz>).
+	+ correct dependencies in Ada95/src/Makefile.in, so the builds with
+	  "--srcdir" work (report by Warren L Dodge).
+	+ correct missing definition of $(CC) in Ada95/gen/Makefile.in
+	  (reported by Warren L Dodge <warrend@mdhost.cse.tek.com>).
+	+ fix typos and whitespace in manpages (patch by Jason McIntyre
+	  <jmc@prioris.mini.pw.edu.pl>).
+
+20030503
+	+ fix form_driver() cases for REQ_CLR_EOF, REQ_CLR_EOL, REQ_DEL_CHAR,
+	  REQ_DEL_PREV and REQ_NEW_LINE, which did not ensure the cursor was at
+	  the editing position before making modifications.
+	+ add test/demo_forms and associated test/edit_field.c demos.
+	+ modify test/configure.in to use test/modules for the list of objects
+	  to compile rather than using the list of programs.
+
+20030419
+	+ modify logic of acsc to use the original character if no mapping is
+	  defined, noting that Solaris does this.
+	+ modify ncurses 'b' test to avoid using the acs_map[] array since
+	  20021231 changes it to no longer contain information from the acsc
+	  string.
+	+ modify makefile rules in c++, progs, tack and test to ensure that
+	  the compiler flags (e.g., $CFLAGS or $CCFLAGS) are used in the link
+	  command (report by Jose Luis Rico Botella <informatica@serpis.com>).
+	+ modify soft-key initialization to use A_REVERSE if A_STANDOUT would
+	  not be shown when colors are used, i.e., if ncv#1 is set in the
+	  terminfo as is done in "screen".
+
+20030412
+	+ add a test for slk_color(), in ncurses.c
+	+ fix some issues reported by valgrind in the slk_set() and slk_wset()
+	  code, from recent rewrite.
+	+ modify ncurses 'E' test to use show previous label via slk_label(),
+	  as in 'e' test.
+	+ modify wide-character versions of NewChar(), NewChar2() macros to
+	  ensure that the whole struct is initialized.
+
+20030405
+	+ modify setupterm() to check if the terminfo and terminal-modes have
+	  already been read.  This ensures that it does not reinvoke
+	  def_prog_mode() when an application calls more than one function,
+	  such as tgetent() and initscr() (report by Olaf Buddenhagen).
+
+20030329
+	+ add 'E' test to ncurses.c, to exercise slk_wset().
+	+ correct handling of carriage-return in wgetn_wstr(), used in demo of
+	  slk_wset().
+	+ first draft of slk_wset() function.
+
+20030322
+	+ improved warnings in tic when suppressing items to fit in termcap's
+	  1023-byte limit.
+	+ built a list in test/README showing which externals are being used
+	  by either programs in the test-directory or via internal library
+	  calls.
+	+ adjust include-options in CF_ETIP_DEFINES to avoid missing
+	  ncurses_dll.h, fixing special definitions that may be needed for
+	  etip.h (reported by Greg Schafer <gschafer@zip.com.au>).
+
+20030315
+	+ minor fixes for cardfile.c, to make it write the updated fields to
+	  a file when ^W is given.
+	+ add/use _nc_trace_bufcat() to eliminate some fixed buffer limits in
+	  trace code.
+
+20030308
+	+ correct a case in _nc_remove_string(), used by define_key(), to avoid
+	  infinite loop if the given string happens to be a substring of other
+	  strings which are assigned to keys (report by John McCutchan).
+	+ add key_defined() function, to tell which keycode a string is bound
+	  to (discussion with John McCutchan <ttb@tentacle.dhs.org>).
+	+ correct keybound(), which reported definitions in the wrong table,
+	  i.e., the list of definitions which are disabled by keyok().
+	+ modify demo_keydef.c to show the details it changes, and to check
+	  for errors.
+
+20030301
+	+ restructured test/configure script, make it work for libncursesw.
+	+ add description of link_fieldtype() to manpage (report by
+	  L Dee Holtsclaw <dee@sunbeltsoft.com>).
+
+20030222
+	+ corrected ifdef's relating to configure check for wchar_t, etc.
+	+ if the output is a socket or other non-tty device, use 1 millisecond
+	  for the cost in mvcur; previously it was 9 milliseconds because the
+	  baudrate was not known.
+	+ in _nc_get_tty_mode(), initialize the TTY buffer on error, since
+	  glibc copies uninitialized data in that case, as noted by valgrind.
+	+ modify tput to use the same parameter analysis as tparm() does, to
+	  provide for user-defined strings, e.g., for xterm title, a
+	  corresponding capability might be
+		title=\E]2;%p1%s^G,
+	+ modify MKlib_gen.sh to avoid passing "#" tokens through the C
+	  preprocessor.  This works around Mac OS X's preprocessor, which
+	  insists on adding a blank on each side of the token (report/analysis
+	  by Kevin Murphy <murphy@genome.chop.edu>).
+
+20030215
+	+ add configure check for wchar_t and wint_t types, rather than rely
+	  on preprocessor definitions.  Also work around for gcc fixinclude
+	  bug which creates a shadow copy of curses.h if it sees these symbols
+	  apparently typedef'd.
+	+ if database is disabled, do not generate run_tic.sh
+	+ minor fixes for memory-leak checking when termcap is read.
+
+20030208
+	+ add checking in tic for incomplete line-drawing character mapping.
+	+ updated configure script to reflect fix for AC_PROG_GCC_TRADITIONAL,
+	  which is broken in autoconf 2.5x for Mac OS X 10.2.3 (report by
+	  Gerben Wierda <Sherlock@rna.nl>).
+	+ make return value from _nc_printf_string() consistent.  Before,
+	  depending on whether --enable-safe-sprintf was used, it might not be
+	  cached for reallocating.
+
+20030201
+	+ minor fixes for memory-leak checking in lib_tparm.c, hardscroll.c
+	+ correct a potentially-uninitialized value if _read_termtype() does
+	  not read as much data as expected (report by Wolfgang Rohdewald
+	  <wr6@uni.de>).
+	+ correct several places where the aclocal.m4 macros relied on cache
+	  variable names which were incompatible (as usual) between autoconf
+	  2.13 and 2.5x, causing the test for broken-linker to give incorrect
+	  results (reports by Gerben Wierda <Sherlock@rna.nl> and Thomas Esser
+	  <te@dbs.uni-hannover.de>).
+	+ do not try to open gpm mouse driver if standard output is not a tty;
+	  the gpm library does not make this check (bug report for dialog
+	  by David Oliveira <davidoliveira@develop.prozone.ws>).
+
+20030125
+	+ modified emx.src to correspond more closely to terminfo.src, added
+	  emx-base to the latter -TD
+	+ add configure option for FreeBSD sysmouse, --with-sysmouse, and
+	  implement support for that in lib_mouse.c, lib_getch.c
+
+20030118
+	+ revert 20030105 change to can_clear_with(), does not work for the
+	  case where the update is made on cells which are blanks with
+	  attributes, e.g., reverse.
+	+ improve ifdef's to guard against redefinition of wchar_t and wint_t
+	  in curses.h (report by Urs Jansen).
+
+20030111
+	+ improve mvcur() by checking if it is safe to move when video
+	  attributes are set (msgr), and if not, reset/restore attributes
+	  within that function rather than doing it separately in the GoTo()
+	  function in tty_update.c (suggested by Philippe Blain).
+	+ add a message in run_tic.in to explain more clearly what does not
+	  work when attempting to create a symbolic link for /usr/lib/terminfo
+	  on OS/2 and other platforms with no symbolic links (report by John
+	  Polterak).
+	+ change several sed scripts to avoid using "\+" since it is not a BRE
+	  (basic regular expression).  One instance caused terminfo.5 to be
+	  misformatted on FreeBSD (report by Kazuo Horikawa
+	  <horikawa@FreeBSD.org> (see FreeBSD docs/46709)).
+	+ correct misspelled 'wint_t' in curs_get_wch.3x (Michael Elkins).
+
+20030105
+	+ improve description of terminfo operators, especially static/dynamic
+	  variables (comments by Mark I Manning IV <mark4th@earthlink.net>).
+	+ demonstrate use of FIELDTYPE by modifying test/ncurses 'r' test to
+	  use the predefined TYPE_ALPHA field-type, and by defining a
+	  specialized type for the middle initial/name.
+	+ fix MKterminfo.sh, another workaround for POSIXLY_CORRECT misfeature
+	  of sed 4.0
+	> patch by Philippe Blain:
+	+ optimize can_clear_with() a little by testing first if the parameter
+	  is indeed a "blank".
+	+ simplify ClrBottom() a little by allowing it to use clr_eos to clear
+	  sections as small as one line.
+	+ improve ClrToEOL() by checking if clr_eos is available before trying
+	  to use it.
+	+ use tputs() rather than putp() in a few cases in tty_update.c since
+	  the corresponding delays are proportional to the number of lines
+	  affected: repeat_char, clr_eos, change_scroll_region.
+
+20021231
+	+ rewrite of lib_acs.c conflicts with copying of SCREEN acs_map to/from
+	  global acs_map[] array; removed the lines that did the copying.
+
+20021228
+	+ change some overlooked tputs() calls in scrolling code to use putp()
+	  (report by Philippe Blain).
+	+ modify lib_getch.c to avoid recursion via wgetnstr() when the input
+	  is not a tty and consequently mode-changes do not work (report by
+	  <R.Chamberlin@querix.com>).
+	+ rewrote lib_acs.c to allow PutAttrChar() to decide how to render
+	  alternate-characters, i.e., to work with Linux console and UTF-8
+	  locale.
+	+ correct line/column reference in adjust_window(), needed to make
+	  special windows such as curscr track properly when resizing (report
+	  by Lucas Gonze <lgonze@panix.com>).
+	> patch by Philippe Blain:
+	+ correct the value used for blank in ClrBottom() (broken in 20000708).
+	+ correct an off-by-one in GoTo() parameter in _nc_scrolln().
+
+20021221
+	+ change several tputs() calls in scrolling code to use putp(), to
+	  enable padding which may be needed for some terminals (patch by
+	  Philippe Blain).
+	+ use '%' as sed substitute delimiter in run_tic script to avoid
+	  problems with pathname delimiters such as ':' and '@' (report by John
+	  Polterak).
+	+ implement a workaround so that line-drawing works with screen's
+	  crippled UTF-8 support (tested with 3.9.13).  This only works with
+	  the wide-character support (--enable-widec); the normal library will
+	  simply suppress line-drawing when running in a UTF-8 locale in screen.
+
+20021214
+	+ allow BUILD_CC and related configure script variables to be
+	  overridden from the environment.
+	+ make build-tools variables in ncurses/Makefile.in consistent with
+	  the configure script variables (report by Maciej W Rozycki).
+	+ modify ncurses/modules to allow
+		configure --disable-leaks --disable-ext-funcs
+	  to build (report by Gary Samuelson).
+	+ fix a few places in configure.in which lacked quotes (report by
+	  Gary Samuelson <gary.samuelson@verizon.com>).
+	+ correct handling of multibyte characters in waddch_literal() which
+	  force wrapping because they are started too late on the line (report
+	  by Sam Varshavchik).
+	+ small fix for CF_GNAT_VERSION to ignore the help-message which
+	  gnatmake adds to its version-message.
+	> Maciej W Rozycki <macro@ds2.pg.gda.pl>:
+	+ use AC_CHECK_TOOL to get proper values for AR and LD for cross
+	  compiling.
+	+ use $cross_compiling variable in configure script rather than
+	  comparing $host_alias and $target alias, since "host" is
+	  traditionally misused in autoconf to refer to the target platform.
+	+ change configure --help message to use "build" rather than "host"
+	  when referring to the --with-build-XXX options.
+
+20021206
+	+ modify CF_GNAT_VERSION to print gnatmake's version, and to allow for
+	  possible gnat versions such as 3.2 (report by Chris Lingard
+	  <chris@stockwith.co.uk>).
+	+ modify #define's for CKILL and other default control characters in
+	  tset to use the system's default values if they are defined.
+	+ correct interchanged defaults for kill and interrupt characters
+	  in tset, which caused it to report unnecessarily (Debian #171583).
+	+ repair check for missing C++ compiler, which is broken in autoconf
+	  2.5x by hardcoding it to g++ (report by Martin Mokrejs).
+	+ update config.guess, config.sub (2002-11-30)
+	+ modify configure script to skip --with-shared, etc., when the
+	  --with-libtool option is given, since they would be ignored anyway.
+	+ fix to allow "configure --with-libtool --with-termlib" to build.
+	+ modify configure script to show version number of libtool, to help
+	  with bug reports.  libtool still gets confused if the installed
+	  ncurses libraries are old, since it ignores the -L options at some
+	  point (tested with libtool 1.3.3 and 1.4.3).
+	+ reorder configure script's updating of $CPPFLAGS and $CFLAGS to
+	  prevent -I options in the user's environment from introducing
+	  conflicts with the build -I options (may be related to reports by
+	  Patrick Ash and George Goffe).
+	+ rename test/define_key.c to test/demo_defkey.c, test/keyok.c to
+	  test/demo_keyok.c to allow building these with libtool.
+
+20021123
+	+ add example program test/define_key.c for define_key().
+	+ add example program test/keyok.c for keyok().
+	+ add example program test/ins_wide.c for wins_wch() and wins_wstr().
+	+ modify wins_wch() and wins_wstr() to interpret tabs by using the
+	  winsch() internal function.
+	+ modify setcchar() to allow for wchar_t input strings that have
+	  more than one spacing character.
+
+20021116
+	+ fix a boundary check in lib_insch.c (patch by Philippe Blain).
+	+ change type for *printw functions from NCURSES_CONST to const
+	  (prompted by comment by Pedro Palhoto Matos <plpm@mega.ist.utl.pt>,
+	  but really from a note on X/Open's website stating that either is
+	  acceptable, and the latter will be used in a future revision).
+	+ add xterm-1002, xterm-1003 terminfo entries to demonstrate changes in
+	  lib_mouse.c (20021026) -TD
+	+ add screen-bce, screen-s entries from screen 3.9.13 (report by
+	  Adam Lazur <zal@debian.org>) -TD
+	+ add mterm terminfo entries -TD
+
+20021109
+	+ split-out useful fragments in terminfo for vt100 and vt220 numeric
+	  keypad, i.e., vt100+keypad, vt100+pfkeys, vt100+fnkeys and
+	  vt220+keypad.  The last as embedded in various entries had ka3 and
+	  kb2 interchanged (report/discussion with Leonard den Ottolander
+	  <leonardjo@hetnet.nl>).
+	+ add check in tic for keypads consistent with vt100 layout.
+	+ improve checks in tic for color capabilities
+
+20021102
+	+ check for missing/empty/illegal terminfo name in _nc_read_entry()
+	  (report by Martin Mokrejs, where $TERM was set to an empty string).
+	+ rewrote lib_insch.c, combining it with lib_insstr.c so both handle
+	  tab and other control characters consistently (report by Philippe
+	  Blain).
+	+ remove an #undef for KEY_EVENT from curses.tail used in the
+	  experimental NCURSES_WGETCH_EVENTS feature.  The #undef confuses
+	  dpkg's build script (Debian #165897).
+	+ fix MKlib_gen.sh, working around the ironically named POSIXLY_CORRECT
+	  feature of GNU sed 4.0 (reported by Ervin Nemeth <airwin@inf.bme.hu>).
+
+20021026
+	+ implement logic in lib_mouse.c to handle position reports which are
+	  generated when XFree86 xterm is initialized with private modes 1002
+	  or 1003.  These are returned to the application as the
+	  REPORT_MOUSE_POSITION mask, which was not implemented.  Tested both
+	  with ncurses 'a' menu (prompted by discussion with Larry Riedel
+	  <Larry@Riedel.org>).
+	+ modify lib_mouse.c to look for "XM" terminfo string, which allows
+	  one to override the escape sequence used to enable/disable mouse
+	  mode.  In particular this works for XFree86 xterm private modes
+	  1002 and 1003.  If "XM" is missing (note that this is an extended
+	  name), lib_mouse uses the conventional private mode 1000.
+	+ correct NOT_LOCAL() macro in lib_mvcur.c to refer to screen_columns
+	  where it used screen_lines (report by Philippe Blain).
+	+ correct makefile rules for the case when both --with-libtool and
+	  --with-gpm are given (report by Mr E_T <troll@logi.net.au>).
+	+ add note to terminfo manpage regarding the differences between
+	  setaf/setab and setf/setb capabilities (report by Pavel Roskin).
+
+20021019
+	+ remove redundant initialization of TABSIZE in newterm(), since it is
+	  already done in setupterm() (report by Philippe Blain).
+	+ add test/inserts.c, to test winnstr() and winsch().
+	+ replace 'sort' in dist.mk with script that sets locale to POSIX.
+	+ update URLs in announce.html.in (patch by Frederic L W Meunier).
+	+ remove glibc add-on files, which are no longer needed (report by
+	  Frederic L W Meunier).
+
+20021012 5.3 release for upload to ftp.gnu.org
+	+ modify ifdef's in etip.h.in to allow the etip.h header to compile
+	  with gcc 3.2 (patch by Dimitar Zhekov <jimmy@is-vn.bg>).
+	+ add logic to setupterm() to make it like initscr() and newterm(),
+	  by checking for $NCURSES_TRACE environment variable and enabling
+	  the debug trace in that case.
+	+ modify setupterm() to ensure that it initializes the baudrate, for
+	  applications such as tput (report by Frank Henigman).
+	+ modify definition of bits used for command-line and library debug
+	  traces to avoid overlap, using new definition TRACE_SHIFT to relate
+	  the two.
+	+ document tput's interpretation of parameterized strings according to
+	  whether parameters are given, etc. (discussion with Robert De Bath).
+
+20021005 pre-release
+	+ correct winnwstr() to account for non-character cells generated when
+	  a double-width character is added (report by Michael Bienia
+	  <michael@vorlon.ping.de>).
+	+ modify _nc_viswbuf2n() to provide better results using wctomb().
+	+ correct logic in _nc_varargs() which broke tracing of parameters for
+	  formats such as "%.*s".
+	+ correct scale factor in linux-c and linux-c-nc terminfo entries
+	  (report Floyd Davidson).
+	+ change tic -A option to -t, add the same option to infocmp for
+	  consistency.
+	+ correct "%c" implementation in lib_tparm.c, which did not map a null
+	  character to a 128 (cf: 980620) (patch by Frank Henigman
+	  <fjhenigman@mud.cgl.uwaterloo.ca>).
+
+20020928 pre-release
+	+ modify MKkey_defs.sh to check for POSIX sort -k option, use that if
+	  it is found, to accommodate newer utility which dropped the
+	  compatibility support for +number options (reported by Andrey A
+	  Chernov).
+	+ modify linux terminfo entry to use color palette feature from
+	  linux-c-nc entry (comments by Tomasz Wasiak and Floyd Davidson).
+	+ restore original color definitions in endwin() if init_color() was
+	  used, and resume those colors on the next doupdate() or refresh()
+	  (report by Tomasz Wasiak <tjwasiak@komputom.com.pl>).
+	+ improve debug-traces by modifying MKlib_gen.sh to generate calls
+	  to returnBool() and returnAttr().
+	+ add/use _nc_visbufn() and _nc_viswbufn() to limit the debug trace
+	  of waddnstr() and similar functions to match the parameters as used.
+	+ add/use _nc_retrace_bool() and _nc_retrace_unsigned().
+	+ correct type used by _nc_retrace_chtype().
+	+ add debug traces to some functions in lib_mouse.c
+	+ modify lib_addch.c to handle non-spacing characters.
+	+ correct parameter of RemAttr() in lib_bkgd.c, which caused the c++
+	  demo's boxes to lose the A_ALTCHARSET flag (broken in 20020629).
+	+ correct width computed in _tracedump(), which did not account for
+	  the attributes (broken in 20010602).
+	+ modify test/tracemunch to replace addresses for windows other than
+	  curscr, newscr and stdscr with window0, window1, etc.
+
+20020921 pre-release
+	+ redid fix for edit_man.sed path.
+	+ workaround for Cygwin bug which makes subprocess writes to stdout
+	  result in core dump.
+	+ documented getbegx(), etc.
+	+ minor fixes to configure script to use '%' consistently as a sed
+	  delimiter rather than '@'.
+	> patch by Philippe Blain:
+	+ add check in lib_overlay.c to ensure that the windows to be merged
+	  actually overlap, and in copywin(), limit the area to be touched
+	  to the lines given for the destination window.
+
+20020914 pre-release
+	+ modified curses.h so that if the wide-character version is installed
+	  overwriting /usr/include/curses.h, and if it relied on libutf8.h,
+	  then applications that use that header for wide-character support
+	  must define HAVE_LIBUTF8_H.
+	+ modify putwin(), getwin() and dupwin() to allow them to operate on
+	  pads (request by Philippe Blain).
+	+ correct attribute-merging in wborder(), broken in 20020216 (report
+	  by Tomasz Wasiak <tjwasiak@grubasek.komputom.com.pl>).
+	> patch by Philippe Blain:
+	+ corrected pop-counts in tparam_internal() to '!' and '~' cases.
+	+ use sizeof(NCURSES_CH_T) in one place that used sizeof(chtype).
+	+ remove some unused variables from mvcur test-driver.
+
+20020907 pre-release
+	+ change configure script to allow install of widec-character
+	  (ncursesw) headers to overwrite normal (ncurses) headers, since the
+	  latter is a compatible subset of the former.
+	+ fix path of edit_man.sed in configure script, needed to regenerate
+	  html manpages on Debian.
+	+ fix mismatched enums in vsscanf.c, which caused warning on Solaris.
+	+ update README.emx to reflect current patch used for autoconf.
+	+ change web- and ftp-site to invisible-island.net
+	> patch by Philippe Blain:
+	+ change case for 'P' in tparam_internal() to indicate that it pops
+	  a variable from the stack.
+	+ correct sense of precision and width in parse_format(), to avoid
+	  confusion.
+	+ modify lib_tparm.c, absorb really_get_space() into get_space().
+	+ modify getwin() and dupwin() to copy the _notimeout, _idlok and
+	  _idcok window fields.
+	+ better fix for _nc_set_type(), using typeMalloc().
+
+20020901 pre-release
+	+ change minor version to 3, i.e., ncurses 5.3
+	+ update config.guess, config.sub
+	+ retest build with each configure option; minor ifdef fixes.
+	+ make keyname() return a null pointer rather than "UNKNOWN STRING" to
+	  match XSI.
+	+ modify handling of wide line-drawing character functions to use the
+	  normal line-drawing characters when not in UTF-8 locale.
+	+ add check/fix to comp_parse.c to suppress warning about missing acsc
+	  string.  This happens in configurations where raw termcap information
+	  is processed; tic already does this and other checks.
+	+ modify tic's check for ich/ich1 versus rmir/smir to only warn about
+	  ich1, to match xterm patch #70 notes.
+	+ moved information for ripped-off lines into SCREEN struct to allow
+	  use in resizeterm().
+	+ add experimental wgetch_events(), ifdef'd with NCURSES_WGETCH_EVENTS
+	  (adapted from patch by Ilya Zakharevich - see ncurses/README.IZ).
+	+ amend check in kgetch() from 20020824 to look only for function-keys,
+	  otherwise escape sequences are not resolved properly.
+	> patch by Philippe Blain:
+	+ removed redundant assignment to SP->_checkfd from newterm().
+	+ check return-value of setupterm() in restartterm().
+	+ use sizeof(NCURSES_CH_T) in a few places that used sizeof(chtype).
+	+ prevent dupwin() from duplicating a pad.
+	+ prevent putwin() from writing a pad.
+	+ use typeRealloc() or typeMalloc() in preference to direct calls on
+	  _nc_doalloc().
+
+20020824
+	+ add a check in kgetch() for cooked characters in the fifo to avoid
+	  calling fifo_push() when a KEY_RESIZE is available (report/analysis
+	  by Sam Varshavchik <mrsam@courier-mta.com>).
+	+ fix an overlooked case for Redhat #68199 (Philippe Blain).
+	+ ensure clearerr() is called before using ferror() e.g., in
+	  lib_screen.c (report by Philippe Blain).
+
+20020817
+	+ modify lib_screen.c and lib_newwin.c to maintain the SCREEN-specific
+	  pointers for curscr/stdscr/newscr when scr_save() and scr_restore()
+	  modify the global curscr/stdscr/newscr variables.  Fixes Redhat
+	  #68199.
+	+ add checks for null pointer in calls to tparm() and tgoto() based on
+	  FreeBSD bug report.  If ncurses were built with termcap support, and
+	  the first call to tgoto() were a zero-length string, the result would
+	  be a null pointer, which was not handled properly.
+	+ correct a typo in terminfo.head, which gave the octal code for colon
+	  rather than comma.
+	+ remove the "tic -u" option from 20020810, since it did not account
+	  for nested "tc=" clauses, and when that was addressed, was still
+	  unsatisfactory.
+
+20020810
+	+ add tic -A option to suppress capabilities which are commented out
+	  when translating to termcap.
+	+ add tic -u option to provide older behavior of "tc=" clauses.
+	+ modified tic to expand all but the final "tc=" clause in a termcap
+	  entry, to accommodate termcap libraries which do not handle multiple
+	  tc clauses.
+	+ correct typo in curs_inopts.3x regarding CS8/CS7 usage (report by
+	  Philippe Blain).
+	+ remove a couple of redundant uses of A_ATTRIBUTES in expressions
+	  using AttrOf(), which already incorporates that mask (report by
+	  Philippe Blain).
+	+ document TABSIZE variable.
+	+ add NCURSES_ASSUMED_COLORS environment variable, to allow users to
+	  override compiled-in default black-on-white assumption used in
+	  assume_default_colors().
+	+ correct an off-by-one comparison against max_colors in COLORFGBG
+	  logic.
+	+ correct a use of uninitialized memory found by valgrind (reported by
+	  Olaf Buddenhagen <olafBuddenhagen@web.de>).
+	+ modified wresize() to ensure that a failed realloc will not corrupt
+	  the window structure, and to make subwindows fit within the resized
+	  window (completes Debian #87678, Debian #101699)
+
+20020803
+	+ fix an off-by-one in lib_pad.c check for limits of pad (patch by
+	  Philippe Blain).
+	+ revise logic for BeOS in lib_twait.c altered in 20011013 to restore
+	  logic used by lib_getch.c's support for GPM or EMX mouse (report by
+	  Philippe Blain)
+	+ remove NCURSES_CONST from several prototypes in curses.wide, to make
+	  the --enable-const --enable-widec configure options to work together
+	  (report by George Goffe <grgoffe@yahoo.com>).
+
+20020727
+	+ finish no-leak checking in cardfile.c, using this for testing changes
+	  to resizeterm().
+	+ simplify _nc_freeall() using delscreen().
+
+20020720
+	+ check error-return from _nc_set_tty_mode() in _nc_initscr() and
+	  reset_prog_mode() (report/patch by Philippe Blain).
+	+ regenerate configure using patch for autoconf 2.52, to address
+	  problem with identifying C++ bool type.
+	+ correct/improve logic to produce an exit status for errors in tput,
+	  which did not exit with an error when told to put a string not in the
+	  current terminfo entry (report by David Gomez <david@pleyades.net>).
+	+ modify configure script AC_OUTPUT() call to work around defect in
+	  autoconf 2.52 which adds an ifdef'd include to the generated
+	  configure definitions.
+	+ remove fstat() check from scr_init(), which also fixes a missing
+	  include for <sys/stat.h> from 20020713 (reported by David Ellement,
+	  fix suggested by Philippe Blain).
+	+ update curs_scanw.3x manpage to note that XSI curses differs from
+	  SVr4 curses: return-values are incompatible.
+	+ correct several prototypes in manpages which used const
+	  inconsistently with the curses.h file, and removed spurious const's
+	  in a few places from curses.h, e.g., for wbkgd() (report by Glenn
+	  Maynard <glenn@zewt.org>).
+	+ change internal type used by tparm() to long, to work with LP64 model.
+	+ modify nc_alloc.h to allow building with g++, for testing.
+
+20020713
+	+ add resize-handling to cardfile.c test program.
+	+ altered resizeterm() to avoid having it fail when a child window
+	  cannot be resized because it would be larger than its parent.  (More
+	  work must be done on this, but it works well enough to integrate).
+	+ improve a limit-check in lib_refresh.c
+	+ remove check in lib_screen.c relating dumptime to file's modification
+	  times, since that would not necessarily work for remotely mounted
+	  filesystems.
+	+ modify lrtest to simplify debugging changes to resizeterm, e.g.,
+	  t/T commands to enable/disable tracing.
+	+ updated status of multibyte support in TO-DO.
+	+ update contact info in source-files (patch by Juergen Pfeifer).
+
+20020706
+	+ add Caps.hpux11, as an example.
+	+ modify version_filter(), used to implement -R option for tic and
+	  infocmp, to use computed array offsets based on the Caps.* file which
+	  is actually configured, rather than constants which correspond to
+	  the Caps file.
+	+ reorganized lib_raw.c to avoid updating SP and cur_term state if the
+	  functions fail (reported by Philippe Blain).
+	+ add -Wundef to gcc warnings, adjust a few ifdef's to accommodate gcc.
+
+20020629
+	+ correct parameters to setcchar() in ncurses.c (cf: 20020406).
+	+ set locale in most test programs (view.c and ncurses.c were the
+	  only ones).
+	+ add configure option --with-build-cppflags (report by Maksim A
+	  Nikulin <M.A.Nikulin@inp.nsk.su>).
+	+ correct a typo in wide-character logic for lib_bkgnd.c (Philippe
+	  Blain).
+	+ modify lib_wacs.c to not cancel the acsc, smacs, rmacs strings when
+	  in UTF-8 locale.  Wide-character functions use Unicode values, while
+	  narrow-character functions use the terminfo data.
+	+ fix a couple of places in Ada95/samples which did not compile with
+	  gnat 3.14
+	+ modify mkinstalldirs so the DOS-pathname case is locale-independent.
+	+ fix locale problem in MKlib_gen.sh by forcing related variables to
+	  POSIX (C), using same approach as autoconf (set variables only if
+	  they were set before).  Update MKterminfo.sh and MKtermsort.sh to
+	  match.
+
+20020622
+	+ add charset to generated html.
+	+ add mvterm entry, adapted from a FreeBSD bug-report by Daniel Rudy
+	  <dcrudy@pacbell.net> -TD
+	+ add rxvt-16color, ibm+16color entries -TD
+	+ modify check in --disable-overwrite option so that it is used by
+	  default unless the --prefix/$prefix value is not /usr, in attempt to
+	  work around packagers, e.g., for Sun's freeware, who do not read the
+	  INSTALL notes.
+
+20020615
+	+ modify wgetch() to allow returning ungetch'd KEY_RESIZE as a function
+	  key code in get_wch().
+	+ extended resize-handling in test/ncurses 'a' menu to the entire
+	  stack of windows created with 'w' commands.
+	+ improve $COLORFGBG feature by interpreting an out-of-range color
+	  value as an SGR 39 or 49, for foreground/background respectively.
+	+ correct a typo in configure --enable-colorfgbg option, and move it
+	  to the experimental section (cf: 20011208).
+
+20020601
+	+ add logic to dump_entry.c to remove function-key definitions that do
+	  not fit into the 1023-byte limit for generated termcaps.  This makes
+	  hds200 fit.
+	+ more improvements to tic's warnings, including logic to ignore
+	  differences between delay values in sgr strings.
+	+ move definition of KEY_RESIZE into MKkeydefs.sh script, to
+	  accommodate Caps.osf1r5 which introduced a conflicting definition.
+
+20020525
+	+ add simple resize-handling in test/ncurses.c 'a' menu.
+	+ fixes in keyname() and _tracechar() to handle negative values.
+	+ make tic's warnings about mismatches in sgr strings easier to follow.
+	+ correct tic checks for number of parameters in smgbp and smglp.
+	+ improve scoansi terminfo entry, and add scoansi-new entry -TD
+	+ add pcvt25-color terminfo entry -TD
+	+ add kf13-kf48 strings to cons25w terminfo entry (reported by Stephen
+	  Hurd <deuce@lordlegacy.org> in newsgroup lucky.freebsd.bugs) -TD
+	+ add entrypoint _nc_trace_ttymode(), use this to distinguish the
+	  Ottyb and Nttyb members of terminal (aka cur_term), for tracing.
+
+20020523
+	+ correct and simplify logic for lib_pad.c change in 20020518 (reported
+	  by Mike Castle).
+
+20020518
+	+ fix lib_pad.c for case of drawing a double-width character which
+	  falls off the left margin of the pad (patch by Kriang Lerdsuwanakij
+	  <lerdsuwa@users.sourceforge.net>)
+	+ modify configure script to work around broken gcc 3.1 "--version"
+	  option, which adds unnecessary trash to the requested information.
+	+ adjust ifdef's in case SIGWINCH is not defined, e.g., with DJGPP
+	  (reported by Ben Decker <deckerben@freenet.de>).
+
+20020511
+	+ implement vid_puts(), vid_attr(), term_attrs() based on the narrow-
+	  character versions as well.
+	+ implement erasewchar(), killwchar() based on erasechar() and
+	  killchar().
+	+ modify erasechar() and killchar() to return ERR if the value was
+	  VDISABLE.
+	+ correct a bug in wresize() in handling subwindows (based on patch by
+	  Roger Gammans <rgammans@computer-surgery.co.uk>, report by Scott Beck
+	  <scott@gossamer-threads.com>).
+	+ improve test/tclock.c by making the second-hand update more often
+	  if gettimeofday() is available.
+
+20020429
+	+ workaround for Solaris sed with MKlib_gen.sh (reported by Andy
+	  Tsouladze <andyt@mypoints.com>).
+
+20020427
+	+ correct return-value from getcchar(), making it consistent with
+	  Solaris and Tru64.
+	+ reorder loops that generate makefile rules for different models vs
+	  subsets so configure --with-termlib works again.  This was broken by
+	  logic added to avoid duplicate rules in changes to accommodate cygwin
+	  dll's (reported by George.R.Goffe@seagate.com).
+	+ update config.guess, config.sub
+
+20020421
+	+ modify ifdef's in write_entry.c to allow use of symbolic links on
+	  platforms with no hard links, e.g., BeOS.
+	+ modify a few includes to allow compile with BeOS, which has stdbool.h
+	  with a conflicting definition for 'bool' versus its OS.h definition.
+	+ amend MKlib_gen.sh to work with gawk, which defines 'func' as an
+	  alias for 'function'.
+
+20020420
+	+ correct form of prototype for ripoffline().
+	+ modify MKlib_gen.sh to test that all functions marked as implemented
+	  can be linked.
+
+20020413
+	+ add manpages: curs_get_wstr.3x, curs_in_wchstr.3x
+	+ implement wgetn_wstr().
+	+ implement win_wchnstr().
+	+ remove redefinition of unget_wch() in lib_gen.c (reported by
+	  Jungshik Shin <jshin@jtan.com>).
+
+20020406
+	+ modified several of the test programs to allow them to compile with
+	  vendor curses implementations, e.g., Solaris, AIX -TD
+
+20020323
+	+ modified test/configure to allow configuring against ncursesw.
+	+ change WACS_xxx definition to use address, to work like Tru64 curses.
+
+20020317
+	+ add 'e' and 'm' toggles to 'a', 'A' tests in ncurses.c to demonstrate
+	  effect of echo/noecho and meta modes.
+	+ add 'A' test to ncurses.c to demonstrate wget_wch() and related
+	  functions.
+	+ add manpage: curs_get_wch.3x
+	+ implement unget_wch().
+	+ implement wget_wch().
+
+20020310
+	+ regenerated html manpages.
+	+ add manpages: curs_in_wch.3x, curs_ins_wch.3x, curs_ins_wstr.3x
+	+ implement wins_wch().
+	+ implement win_wch().
+	+ implement wins_nwstr(), wins_wstr().
+
+20020309
+	+ add manpages: curs_addwstr.3x, curs_winwstr.3x
+	+ implement winnwstr(), winwstr().
+
+20020223
+	+ add manpages: curs_add_wchstr.3x, curs_bkgrnd.3x
+	+ document wunctrl, key_name.
+	+ implement key_name().
+	+ remove const's in lib_box.c incorrectly leftover after splitting off
+	  lib_box_set.c
+	+ update llib-lncurses, llib-ncursesw, fix configure script related to
+	  these.
+
+20020218
+	+ remove quotes on "SYNOPSIS" in man/curs_box_set.3x, which resulted
+	  in spurious symlinks on install.
+
+20020216
+	+ implement whline_set(), wvline_set(), add manpage curs_border_set.
+	+ add subtest 'b' to 'F' and 'f' in ncurses.c to demonstrate use of
+	  box() and box_set() functions.
+	+ add subtest 'u' to 'F' in ncurses.c, to demonstrate use of addstr()
+	  given UTF-8 string equivalents of WACS_xxx symbols.
+	+ minor fixes to several manpages based on groff -ww output.
+	+ add descriptions of external variables of termcap interface to
+	  the manpage (report by Bruce Evans <bde@zeta.org.au>).
+	> patches by Bernhard Rosenkraenzer:
+	+ correct configure option --with-bool, which was executed as
+	  --with-ospeed.
+	+ add quotes for parameters of --with-bool and --with-ospeed configure
+	  options.
+	> patch by Sven Verdoolaege (report by Gerhard Haering
+	  <haering_linux@gmx.de>):
+	+ correct typos in definitions of several wide-character macros:
+	  waddwstr, wgetbkgrnd, mvaddwstr, mvwadd_wchnstr, mvwadd_wchnstr,
+	  mvwaddwstr.
+	+ pass $(CPPFLAGS) to MKlib_gen.sh, thereby fixing a missing definition
+	  of _XOPEN_SOURCE_EXTENDED, e.g., on Solaris
+
+20020209
+	+ implement wide-acs characters for UTF-8 locales.  When in UTF-8
+	  locale, ignore narrow version of acs.  Add 'F' test to test/ncurses.c
+	  to demonstrate.
+	+ correct prototype in keybound manpage (noted from a Debian mailing
+	  list item).
+
+20020202
+	+ add several cases to the wscanw() example in testcurs.c, showing the
+	  format.
+	+ implement a simple vsscanf() fallback function which uses the %n
+	  conversion to help parse the input data (prompted by discussion with
+	  Albert Chin-A-Young).
+	+ modify mk-1st.awk and test/Makefile.in to add $(LDFLAGS) when making
+	  shared libraries, and to use $(CFLAGS) when linking test programs
+	  (patch by Albert Chin-A-Young).
+	+ add a call to _nc_keypad() in keypad() to accommodate applications
+	  such as nvi, which use curses for output but not for input (fixes
+	  Debian #131263, cf: 20011215).
+	+ add entrypoints to resizeterm.c which provide better control over the
+	  process:  is_term_resized() and resize_term().  The latter restores
+	  the original design of resizeterm() before KEY_RESIZE was added in
+	  970906.  Do this to accommodate 20010922 changes to view.c, but allow
+	  for programs with their own sigwinch handler, such as lynx (reported
+	  by Russell Ruby <russ@math.orst.edu>).
+
+20020127
+	+ fix a typo in change to mk-1st.awk, which broke the shared-library
+	  makefile rules (reported by Martin Mokrejs).
+
+20020126
+	+ update config.guess, config.sub
+	+ finish changes needed to build dll's on cygwin.
+	+ fix a typo in mvwchat() macro (reported by Cy <yam@homerow.net).
+
+20020119
+	+ add case in lib_baudrate.c for B921600 (patch by Andrey A Chernov).
+	+ correct missing sed-editing stage in manpage installs which is used
+	  to rename manpages, broken in 20010324 fix for Debian #89939 (Debian
+	  #78866).
+	+ remove -L$(libdir) from linker flags, probably not needed any more
+	  since HPUX is handled properly (reported by Niibe Yutaka
+	  <gniibe@m17n.org>).
+	+ add configure check for mbstate_t, needed for wide-character
+	  configuration.  On some platforms we must include <wchar.h> to
+	  define this (reported by Daniel Jacobowitz).
+	+ incorporate some of the changes needed to build dll's on cygwin.
+
+20020112a
+	+ workaround for awk did not work with mawk, adjusted shell script.
+
+20020112
+	+ add Caps.osf1r5, as an example.
+	+ modify behavior of can_clear_with() so that if an application is
+	  running in a non-bce terminals with default colors enabled, it
+	  returns true, allowing the user to select/paste text without picking
+	  up extraneous trailing blanks (adapted from patch by Daniel
+	  Jacobowitz <dmj+@andrew.cmu.edu>).
+	+ modify generated curses.h to ifdef-out prototypes for extensions if
+	  they are disabled, and to define curses_version() as a string in that
+	  case.  This is needed to make the programs such as tic build in that
+	  configuration.
+	+ modified generated headers.sh to remove a gzip'd version of the
+	  target file if it exists, in case non-gzip'd manpages are installed
+	  into a directory where gzip'd ones exist.  In that case, the latter
+	  would be found.
+	+ corrected a redundant initialization of signal handlers from 20010922
+	  changes.
+	+ clarified bug-reporting address in terminfo.src (report by John H
+	  DuBois III <spcecdt@armory.com>).
+	> several fixes from Robert Joop:
+	+ do not use "-v" option of awk in MKkey_defs.sh because it does not
+	  work with SunOS nawk.
+	+ modify definitions for libutf8 in curses.h to avoid redefinition
+	  warnings for mblen
+	+ quoted references to compiler in shell command in misc/Makefile, in
+	  case it uses multiple tokens.
+
+20011229
+	+ restore special case from 20010922 changes to omit SA_RESTART when
+	  setting up SIGWINCH handler, which is needed to allow wgetch() to be
+	  interrupted by that signal.
+	+ updated configure macro CF_WITH_PATHLIST, to omit some double quotes
+	  not needed with autoconf 2.52
+	+ revert configure script to autoconf 2.13 patched with
+		autoconf-2.13-19990117.patch.gz (or later)
+	  from
+		ftp://invisible-island.net/autoconf/
+	  because autoconf 2.52 macro AC_PROG_AWK does not work on HPUX 11.0
+	  (report by David Ellement <ellement@sdd.hp.com>).  This also fixes a
+	  different problem configuring with Mac OS X (reported by Marc Smith
+	  <marc.a.smith@home.com>).
+
+20011222
+	+ modify include/edit_cfg.h to eliminate BROKEN_LINKER symbol from
+	  term.h
+	+ move prototype for _nc_vsscanf() into curses.h.in to omit
+	  HAVE_VSSCANF symbol from curses.h, which was dependent upon the
+	  ncurses_cfg.h file which is not installed.
+	+ use ACS_LEN rather than SIZEOF(acs_map) in trace code of lib_acs.c,
+	  to work with broken linker configuration, e.g., cygwin (report by
+	  Robert Joop <rj@rainbow.in-berlin.de>).
+	+ make napms() call _nc_timed_wait() rather than poll() or select(),
+	  to work around broken implementations of these on cygwin.
+
+20011218
+	+ drop configure macro CF_WIDEC_SHIFT, since that was rendered obsolete
+	  by Sven Verdoolaege's rewrite of wide-character support.  This makes
+	  libncursesw incompatible again, but makes the header files almost the
+	  same as in the narrow-character configuration.
+	+ simplify definitions that combine wide/narrow versions of bkgd, etc.,
+	  to eliminate differences between the wide/narrow versions of curses.h
+	+ correct typo in configure macro CF_FUNC_VSSCANF
+	+ correct location of call to _nc_keypad() from 20011215 changes which
+	  prevented keypad() from being disabled (reported by Lars Hecking).
+
+20011215
+	+ rewrote ncurses 'a' test to exercise wgetch() and keypad() functions
+	  better, e.g., by adding a 'w' command to create new windows which
+	  may have different keypad() settings.
+	+ corrected logic of keypad() by adding internal screen state to track
+	  whether the terminal's keypad-mode has been set.  Use this in
+	  wgetch() to update the keypad-mode according to whether the
+	  associated window's keypad-mode has been set with keypad().  This
+	  corrects a related problem restoring terminal state after handling
+	  SIGTSTP (reported by Mike Castle).
+	+ regenerate configure using patch for autoconf 2.52
+		autoconf-2.52-patch.gz
+	  at
+		ftp://invisible-island.net/autoconf/
+	+ update config.guess, config.sub from
+		http://subversions.gnu.org/cgi-bin/viewcvs/config/config/
+	+ minor changes to quoting in configure script to allow it to work
+	  with autoconf 2.52
+
+20011208
+	+ modify final checks in lib_setup.c for line and col values, making
+	  them independent.
+	+ modify acs_map[] if configure --broken-linker is specified, to make
+	  it use a function rather than an array (prompted by an incorrect
+	  implementation in cygwin package).
+	+ correct spelling of configure option --enable-colorfgbg, which
+	  happened to work if --with-develop was set (noted in cygwin package
+	  for ncurses).
+	+ modify ifdef for genericerror() to compile with SUNWspro Sun WorkShop
+	  6 update 1 C++ 5.2 (patch by Sullivan N Beck <sbeck@cise.ufl.edu>).
+	+ add configure checks to see if ncurses' fallback vsscanf() will
+	  compile either of the special cases for FILE structs, and if not,
+	  force it to the case which simply returns an error (report by
+	  Sullivan N Beck <sbeck@cise.ufl.edu> indicates that Solaris 8 with
+	  64-bits does not allow access to FILE's fields).
+	+ modify ifdef's for c++/cursesw.cc to use the fallback vsscanf() in
+	  the ncurses library if no better substitute for this can be found
+	  in the C++ runtime.
+	+ modify the build to name dynamic libraries according to the
+	  convention used on OS X and Darwin.  Rather than something like
+	  libncurses.dylib.5.2, Darwin would name it libncurses.  5.dylib.
+	  There are a few additional minor fixes, such as setting the library
+	  version and compatibility version numbers (patch by Jason Evans
+	  <jevans@apple.com>).
+	+ use 'sh' to run mkinstalldirs, to work around problems with buggy
+	  versions of 'make' on OS/2 (report by John Polterak <jp@eyup.org>).
+	+ correct typo in manpage description of curs_set() (Debian #121548).
+	+ replace the configure script existence-check for mkstemp() by one
+	  that checks if the function works, needed for older glibc and
+	  AmigaOS.
+
+20011201
+	+ modify script that generates fallbacks.c to compile a temporary
+	  copy of the terminfo source in case the host does not contain all of
+	  the entries requested for fallbacks (request by Greg Roelofs).
+	+ modify configure script to accommodate systems such as Mac OS X whose
+	  <stdbool.h> header defines a 'bool' type inconsistent with ncurses,
+	  which normally makes 'bool' consistent with C++.  Include <stdbool.h>
+	  from curses.h to force consistent usage, define a new type
+	  NCURSES_BOOL and related that to the exported 'bool' as either a
+	  typedef or definition, according to whether <stdbool.h> is present
+	  (based on a bug report for tin 1.5.9 by Aaron Adams <adamsa@mac.com>).
+
+20011124
+	+ added/updated terminfo entries for M$ telnet and KDE konsole -TD
+
+20011117
+	+ updated/expanded Apple_Terminal and Darwin PowerPC terminfo entries
+	  (Benjamin C W Sittler).
+	+ add putty terminfo entry -TD
+	+ if configuring for wide-curses, define _XOPEN_SOURCE_EXTENDED, since
+	  this may not otherwise be defined to make test/view.c compile.
+
+20011110
+	+ review/correct several missing/generated items in curses.wide, sorted
+	  the lists to make subsequent diff's easier to track.
+
+20011103
+	+ add manual pages for add_wch(), echo_wchar(), getcchar(),
+	  mvadd_wch(), mvwadd_wch(), setcchar(), wadd_wch() and wecho_wchar().
+	+ implement wecho_wchar()
+	+ modify _tracedump() to handle wide-characters by mapping them to '?'
+	  and control-characters to '.', to make the trace file readable.  Also
+	  dynamically allocate the buffer used by _tracedump() for formatting
+	  the results.
+	+ modify T_CALLED/T_RETURN macros to ease balancing call/return lines
+	  in a trace by using curly braces.
+	+ implement _nc_viscbuf(), for tracing cchar_t arrays.
+	+ correct trace-calls in setcchar() and getcchar() functions, which
+	  traced the return values but not the entry to each function.
+	+ correct usage message in test/view.c, which still mentioned -u flag.
+
+20011027
+	+ modify configure script to allow building with termcap only, or with
+	  fallbacks only.  In this case, we do not build tic and toe.
+	+ add configure --with-termpath option, to override default TERMPATH
+	  value of /etc/termcap:/usr/share/misc/termcap.
+	+ cosmetic change to tack: make menu descriptions agree with menu
+	  titles.
+
+20011020
+	+ rewrote limit-checks in wscrl() and associated _nc_scroll_window(),
+	  to ensure that if the parameter of wscrl() is larger than the size of
+	  the scrolling region, then the scrolling region will be cleared
+	  (report by Ben Kohlen <bckohlen@yahoo.com>).
+	+ add trace/varargs.c, using this to trace parameters in lib_printw.c
+	+ implement _tracecchar_t2() and _tracecchar_t().
+	+ split-out trace/visbuf.c
+	+ correct typo in lib_printw.c changes from 20010922 (report by Mike
+	  Castle).
+
+20011013
+	+ modify run_tic.sh to check if the build is a cross-compile.  In that
+	  case, do not use the build's tic to install the terminfo database
+	  (report by Rafael Rodriguez Velilla <rrv@tid.es>).
+	+ modify mouse click resolution so that mouseinterval(-1) will disable
+	  it, e.g., to handle touchscreens via a slow connection (request by
+	  Byron Stanoszek <gandalf@winds.org>).
+	+ correct mouseinterval() default value shown in curs_mouse.3x
+	+ remove conflicting definition of mouse_trafo() (reported by Lars
+	  Hecking, using gcc 2.95.3).
+
+20011001
+	+ simpler fix for signal_name(), to replace the one overlooked in
+	  20010929 (reported by Larry Virden).
+
+20010929
+	+ add -i option to view.c, to test ncurses' check for non-default
+	  signal handler for SIGINT, etc.
+	+ add cases for shared-libraries on Darwin/OS X (patch by Rob Braun
+	  <bbraun@synack.net>).
+	+ modify tset to restore original I/O modes if an error is encountered.
+	  Also modify to use buffered stderr consistently rather than mixing
+	  with write().
+	+ change signal_name() function to use if-then-else rather than case
+	  statement, since signal-values aren't really integers (reported by
+	  Larry Virden).
+	+ add limit checks in wredrawln(), fixing a problem where lynx was
+	  repainting a pad which was much larger than the screen.
+
+20010922
+	+ fix:  PutRange() was counting the second part of a wide character as
+	  part of a run, resulting in a cursor position that was one too far
+	  (patch by Sven Verdoolaege).
+	+ modify resizeterm() to not queue a KEY_RESIZE if there was no
+	  SIGWINCH, thereby separating the two styles of SIGWINCH handling
+	  in test/view.c
+	+ simplified lib_tstp.c, modify it to use SA_RESTART flag for SIGWINCH.
+	+ eliminate several static buffers in the terminfo compiler, using
+	  allocated buffers.
+	+ modify MKkeyname.awk so that keyname() does not store its result into
+	  a static buffer that is overwritten by the next call.
+	+ reorganize the output of infocmp -E and -e options to compile cleanly
+	  with gcc -Wwrite-strings warnings.
+	+ remove redefinition of chgat/wchgat/mvwchgat from curses.wide
+
+20010915
+	+ add label to test/view.c, showing the name of the last key or signal
+	  that made the screen repaint, to make it clearer when a sigwinch
+	  does this.
+	+ use ExitProgram() consistently in the test-programs to make it
+	  simpler to test leaks with dmalloc, etc.
+	+ move hashtab static data out of hashmap.c into SCREEN struct.
+	+ make NO_LEAK code compile with revised WINDOWLIST structs.
+
+20010908
+	+ modify tgetent() to check if exit_attribute_mode resets the alternate
+	  character set, and if so, attempt to adjust the copy of the termcap
+	  "me" string which it will return to eliminate that part.  In
+	  particular, 'screen' would lose track of line-drawing characters
+	  (report by Frederic L W Meunier <0@pervalidus.net>, analysis by
+	  Michael Schroeder).
+
+20010901
+	+ specify DOCTYPE in html manpages.
+	+ add missing macros for several "generated" functions:  attr_get(),
+	  attr_off(), attr_on(), attr_set(), chgat(), mvchgat(), mvwchgat() and
+	  mouse_trafo().
+	+ modify view.c to agree with non-experimental status of ncurses'
+	  sigwinch handler:
+	  + change the sense of the -r option, making it default to ncurses'
+	    sigwinch handler.
+	  + add a note explaining what functions are unsafe in a signal
+	    handler.
+	  + add a -c option, to set color display, for testing.
+	+ unset $data variable in MKterminfo.sh script, to address potential
+	  infinite loop if shell malfunction (report by Samuel Mikes
+	  <smikes@cubane.com>, for bash 2.05.0 on a Linux 2.0.36 system).
+	+ change kbs in mach terminfo entries to ^?  (Marcus Brinkmann
+	  <Marcus.Brinkmann@ruhr-uni-bochum.de>).
+	+ correct logic for COLORFGBG environment variable: if rxvt is compiled
+	  with xpm support, the variable has three fields, making it slightly
+	  incompatible with itself.  In either case, the background color is
+	  the last field.
+
+20010825
+	+ move calls to def_shell_mode() and def_prog_mode() before loop with
+	  callbacks in lib_set_term.c, since the c++ demo otherwise initialized
+	  the tty modes before saving them (patch by John David Anglin
+	  <dave@hiauly1.hia.nrc.ca>).
+	+ duplicate logic used to initialize trace in newterm(), in initscr()
+	  to avoid confusing trace of initscr().
+	+ simplify allocation of WINDOW and WINDOWLIST structs by making the
+	  first a part of the second rather than storing a pointer.  This saves
+	  a call to malloc for each window (discussion with Philippe Blain).
+	+ remove unused variable 'used_ncv' from lib_vidattr.c (Philippe
+	  Blain).
+	+ modify c++/Makefile.in to accommodate archive programs that are
+	  different for C++ than for C, and add cases for vendor's C++
+	  compilers on Solaris and IRIX (report by Albert Chin-A-Young).
+	+ correct manpage description of criteria for deciding if the terminal
+	  supports xterm mouse controls.
+	+ add several configure script options to aid with cross-compiling:
+	  --with-build-cc, --with-build-cflags, --with-build-ldflags, and
+	  --with-build-libs (request by Greg Roelofs).
+	+ change criteria for deciding if configure is cross-compiling from
+	  host/build mismatch to host/target mismatch (request by Greg Roelofs
+	  <greg.roelofs@philips.com>).
+	+ correct logic for infocmp -e and -E options which writes the data for
+	  the ext_Names[] array.  This is needed if one constructs a fallback
+	  table for a terminfo entry which uses extended termcap names, e.g.,
+	  AX in a color xterm.
+	+ fix undefined NCURSES_PATHSEP when configure --disable-database
+	  option is given.
+
+20010811
+	+ fix for VALID_BOOLEAN() macro when char is not signed.
+	+ modify 'clean' rule for C++ binding to work with Sun compiler, which
+	  caches additional information in a subdirectory of the objects.
+	+ added llib-ncursesw.
+
+20010804
+	+ add Caps.keys example for experimental extended function keys
+	  (adapted from a patch by Ilya Zakharevich).
+	+ correct parameter types of vidputs() and vidattr() to agree with
+	  header files (report by William P Setzer).
+	+ fix typos in several man-pages (patch by William P Setzer).
+	+ remove unneeded ifdef for __GNUG__ in CF_CPP_VSCAN_FUNC configure
+	  macro, which made ncurses C++ binding fail to build with other
+	  C++ compilers such as HPUX 11.x (report by Albert Chin-A-Young).
+	+ workaround for bug in HPUX 11.x C compiler: add a blank after
+	  NCURSES_EXPORT macro in form.h (report by Albert Chin-A-Young)
+	+ ignore blank lines in Caps* files in MKkey_defs.sh script (report by
+	  Albert Chin-A-Young).
+	+ correct definition of key_end in Caps.aix4, which left KEY_END
+	  undefined (report by Albert Chin-A-Young).
+	+ remove a QNX-specific fallback prototype for vsscanf(), which is
+	  obsolete with QNX RTP.
+	+ review/fix some of the T() and TR() macro calls, having noticed that
+	  there was no data for delwin() in a trace of dialog because there was
+	  no returnVoid call for wtimeout().  Also, traces in lib_twait.c are
+	  now selected under TRACE_IEVENT rather than TRACE_CALLS.
+
+20010728
+	+ add a _nc_access() check before opening files listed via $TERMPATH.
+	+ using modified man2html, regenerate some of the html manpages to fix
+	  broken HREF's where the link was hyphenated.
+
+20010721
+	+ add some limit/pointer checks to -S option of tputs.
+	+ updated/expanded Apple_Terminal and Darwin PowerPC terminfo entries
+	  (Benjamin C W Sittler).
+	+ add a note in curs_termcap.3x regarding a defect in the XSI
+	  description of tgetent (based on a discussion with Urs Jansen
+	  regarding the HPUX 11.x implementation, whose termcap interface is
+	  not compatible with existing termcap programs).
+	+ modify manhtml rule in dist.mk to preserve copyright notice on the
+	  generated files, as well as to address HTML style issues reported by
+	  tidy and weblint.  Regenerated/updated corresponding html files.
+	+ comment out use of Protected_Character and related rarely used
+	  attributes in ncurses Ada95 test/demo to compile with wide-character
+	  configuration.
+
+20010714
+	+ implement a simple example in C++ demo to test scanw().
+	+ corrected stdio function used to implement scanw() in cursesw.cc
+	+ correct definition of RemAttr() macro from 20010602 changes, which
+	  caused C++ SillyDemo to not show line-drawing characters.
+	+ modify C++ binding, adding getKey() which can be overridden by user
+	  to substitute functions other than getch() for keyboard processing
+	  of forms and menus (patch by Juergen Pfeifer).
+
+20010707
+	+ fix some of the trace calls which needed modification to work with
+	  new wide-character structures.
+	+ modify magic-cookie code in tty_update.c to compile with new
+	  wide-character structures (report by <George.R.Goffe@seagate.com>).
+	+ ensure that _XOPEN_SOURCE_EXTENDED is defined in curses.priv.h if
+	  compiling for wide-character configuration.
+	+ make addwnstr() handle non-spacing characters (patch by Sven
+	  Verdoolaege).
+
+20010630
+	+ add configure check to define _GNU_SOURCE, needed to prop up glibc
+	  header files.
+	+ split-out include/curses.wide to solve spurious redefinitions caused
+	  by defining _GNU_SOURCE, and move includes for <signal.h> before
+	  <curses.h> to work around misdefinition of ERR in glibc 2.1.3 header
+	  file.
+	+ extended ospeed change to NetBSD and OpenBSD -TD
+	+ modify logic in lib_baudrate.c for ospeed, for FreeBSD to make it
+	  work properly for termcap applications (patch by Andrey A Chernov).
+
+20010623
+	+ correct an overlooked CharOf/UChar instance (reports by Eugene Lee
+	  <eugene@anime.net>, Sven Verdoolaege).
+	+ correct unneeded ifdef for wunctrl() (reported by Sven Verdoolaege)
+
+20010618
+	+ change overlooked several CharOf/UChar instances.
+	> several patches from Sven Verdoolaege:
+	+ correct a typo in wunctrl(), which made it appear that botwc() was
+	  needed (no such function: use btowc()).
+	+ reimplement wide-character demo in test/view.c, using new functions.
+	+ implement getcchar(), setcchar(), wadd_wchnstr() and related macros.
+	+ fix a syntax problem with do/if/while in PUTC macro (curses.priv.h).
+
+20010616
+	+ add parentheses in macros for malloc in test.priv.h, fixes an
+	  expression in view.c (report by Wolfgang Gutjahr <gutw@knapp.co.at>).
+	+ add Caps.uwin, as an example.
+	+ change the way curses.h is generated, making the list of function
+	  key definitions extracted from the Caps file.
+	+ add #undef's before possible redefinition of ERR and OK in curses.h
+	+ modify logic in tic, toe, tput and tset which checks for basename of
+	  argv[0] to work properly on systems such as OS/2 which have
+	  case-independent filenames and/or program suffixes, e.g., ".ext".
+
+20010609
+	+ add a configure check, if --enable-widec is specified, for putwc(),
+	  which may be in libutf8.
+	+ remove some unnecessary text from curs_extend.3x and
+	  default_colors.3x which caused man-db to make incorrect symbolic
+	  links (Debian #99550).
+	+ add configure check if cast for _IO_va_list is needed to compile
+	  C++ vscan code (Debian #97945).
+	> several patches from Sven Verdoolaege:
+	+ correct code that used non-standard auto-initialization of a struct,
+	  which gcc allows (report by Larry Virden).
+	+ use putwc() in PUTC() macro.
+	+ make addstr() work for the special case where the codeset is
+	  non-stateful (eg. UTF-8), as well as stateful codesets.
+
+20010603
+	+ correct loop expression in NEXT_CHAR macro for lib_addstr.c changes
+	  from 20010602 (report by Mike Castle).
+
+20010602
+	+ modify mvcur() to avoid emitting newline characters when nonl() mode
+	  is set.  Normally this is not a problem since the actual terminal
+	  mode is set to suppress nl/crlf translations, however it is useful to
+	  allow the caller to manipulate the terminal mode to avoid staircasing
+	  effects after spawning a process which writes messages (for lynx
+	  2.8.4) -TD
+	> several patches from Sven Verdoolaege <skimo@kotnet.org>:
+	+ remove redundant type-conversion in fifo_push()
+	+ correct definition of addwstr() macro in curses.h.in
+	+ remove _nc_utf8_outch()
+	+ rename most existing uses of CharOf() to UChar(), e.g., where it is
+	  used to prevent sign-extension in ctype macros.
+	+ change some chtype's to attr_t's where the corresponding variables
+	  are used to manipulate attributes.
+	+ UpdateAttr() was applied to both attributes (attr_t) and characters
+	  (chtype).  Modify macro and calls to it to make these distinct.
+	+ add CharEq() macro, use in places where wide-character configuration
+	  implementation uses a struct for cchar_t.
+	+ moved struct ldat into curses.priv.h, to hide implementation details.
+	+ change CharOf() macro to use it for masking A_CHARTEXT data from
+	  chtype's.
+	+ add L() macro to curses.priv.h, for long-character literals.
+	+ replace several assignments from struct ldat entries to chtype or
+	  char values with combinations of CharOf() and AttrOf() macros.
+	+ add/use intermediate ChAttrOf() and ChCharOf() macros where we know
+	  we are using chtype data.
+	+ add/use lowlevel attribute manipulation macros AddAttr(), RemAttr()
+	  and SetAttr().
+	+ add/use SetChar() macro, to change a cchar_t based on a character and
+	  attributes.
+	+ convert most internal use of chtype to NCURSES_CH_T, to simplify use
+	  of cchar_t for wide-character configuration.  Similarly, use ARG_CH_T
+	  where a pointer would be more useful.
+	+ add stubs for tracing cchar_t values.
+	+ add/use macro ISBLANK()
+	+ add/use constructors for cchar_t's: NewChar(), NewChar2().
+	+ add/use macros CHREF(), CHDEREF(), AttrOfD(), CharOfD() to facilitate
+	  passing cchar_t's by address.
+	+ add/use PUTC_DATA, PUTC() macros.
+	+ for wide-character configuration, move the window background data to
+	  the end of the WINDOW struct so that whether _XOPEN_SOURCE_EXTENDED
+	  is defined or not, the offsets in the struct will not change.
+	+ modify addch() to work with wide-characters.
+	+ mark several wide-character functions as generated in curses.h.in
+	+ implement wunctrl(), wadd_wch(), wbkgrndset(), wbkgrnd(),
+	  wborder_set() and waddnwstr().
+
+20010526
+	+ add experimental --with-caps=XXX option to customize to similar
+	  terminfo database formats such as AIX 4.x
+	+ add Caps.aix4 as an example.
+	+ modify Caps to add columns for the the KEY_xxx symbols.
+	+ modify configure --with-widec to suppress overwrite of libcurses.so
+	  and curses.h
+	+ add checks to toe.c to avoid being confused by files and directories
+	  where we would expect the reverse, e.g., source-files in the
+	  top-level terminfo levels as is the case for AIX.
+
+20010519
+	+ add top-level 'depend' rule for the C sources, assuming that the
+	  makedepend program is available.  As a side-effect, this makes
+	  the generated sources, as in "make sources" (prompted by a report
+	  by Mike Castle that "make -j" fails because the resulting parallel
+	  processes race to generate ncurses/names.c).
+	+ modify configure script so that --disable-overwrite option's action
+	  to add a symbolic link for libcurses applies to the static library as
+	  well as the shared library when both are configured (report by Felix
+	  Natter <f.natter@ndh.net>).
+	+ add ELKS terminfo entries (Federico Bianchi
+	  <bianchi@www.arte.unipi.it>)
+	+ add u6 (CSR) to Eterm (Michael Jennings).
+
+20010512
+	+ modify test/ncurses.c to work with xterm-256color, which has fewer
+	  color pairs than colors*colors (report by David Ellement
+	  <ellement@sdd.hp.com>).
+
+20010505
+	+ corrected screen.xterm-xfree86 entry.
+	+ update comment in Caps regarding IBM (AIX) function-key definitions.
+
+20010421
+	+ modify c++/Makefile.in to link with libncurses++w.a when configured
+	  for wide-characters (patch by Sven Verdoolaege).
+	+ add check in _nc_trace_buf() to refrain from freeing a null pointer.
+	+ improve CF_PROG_INSTALL macro using CF_DIRNAME.
+	+ update config.guess, config.sub from autoconf 2.49e (alpha).
+
+20010414
+	+ add secondary check in tic.c, similar_sgr() to see if the reason
+	  for mismatch was that the individual capabilities used a time-delay
+	  while sgr did not.  Used this to cleanup mismatches, e.g., in vt100,
+	  and remove time-delay from Apple_Terminal entries.
+	+ add Apple_Terminal terminfo entries (Benjamin C W Sittler
+	  <bsittler@iname.com>).
+	+ correct definitions of shifted editing keys for xterm-xfree86 -TD
+	+ fix a bug in test/bs.c from 20010407 (patch by Erik Sigra).
+	+ prevent relative_move() from doing an overwrite if it detects 8-bit
+	  characters when configured for UTF-8 (reported by Sven Verdoolaege
+	  <skimo@kotnet.org>).
+
+20010407
+	+ add configure checks for strstream.h vscan function, and similar
+	  stdio-based function which may be used in C++ binding for gcc 3.0
+	  (reports by George Goffe, Lars Hecking, Mike Castle).
+	+ rewrite parts of configure.in which used changequote().  That feature
+	  is broken in the latest autoconf alphas (e.g., 2.49d).
+	+ add a missing pathname for ncurses_dll.h, needed when building in
+	  a directory outside the source tree (patch by Sven Verdoolaege
+	  <skimo@kotnet.org>).
+	> fix 2 bugs in test/bs.c Erik Sigra <sigra@home.se>:
+	+ no ships were ever placed in the last row or in the last column.
+	  This made the game very easy to win, because you never had to waste
+	  any shots there, but the computer did.
+	+ the squares around a sunken ship that belonged to the player were not
+	  displayed as already hit by the computer, like it does for the
+	  player.
+
+20010331
+	+ add some examples of customizing screen's terminfo:
+	  screen.xterm-xfree86, screen.xterm-r6, screen.teraterm -TD
+	+ modify screen's terminfo entry to match the khome/kend in screen
+	  3.09.08 (Debian #92215).
+	+ correct a memory leak in forms library (report by Stefan Vogtner
+	  <stefan@vogtner.de>) (patch by Juergen Pfeifer).
+
+20010324
+	+ change symbols used to guard against repeated includes to begin
+	  consistently with "NCURSES_" rather than a leading underscore.  There
+	  are other symbols defined in the header files which begin with a
+	  leading underscore, but they are part of the legacy interface.
+	+ reorder includes in c++ binding so that rcs identifiers can be
+	  compiled-in.
+	+ add .cc.ii rule to c++ makefile, to get preprocessor output for
+	  debugging.
+	+ correct configure script handling of @keyword@ substitutions when the
+	  --with-manpage-renames option is given (cf: 20000715, fixes Debian
+	  #89939).
+	+ report stack underflow/overflow in tparm() when tic -cv option is
+	  given.
+	+ remove spurious "%|" operator from xterm-xfree86 terminfo entry,
+	  (reported by Adam Costello <amc@cs.berkeley.edu>, Debian #89222).
+
+20010310
+	+ cleanup of newdemo.c, fixing some ambiguous expressions noted by gcc
+	  2.95.2, and correcting some conflicting color pair initializations.
+	+ add missing copyright notice for cursesw.h
+	+ review, make minor fixes for use of '::' for referring to C-language
+	  interface from C++ binding.
+	+ modify configure check for g++ library slightly to accommodate
+	  nonstandard version number, e.g., <vendor>-2.7 (report by Ronald Ho
+	  <rho@mipos2.intel.com>).
+	+ add configure check for c++ <sstream> header, replace hardcoded
+	  ifdef.
+	+ workaround for pre-release of gcc 3.0 libstdc++, which has dropped
+	  vscan from strstreambuf to follow standard, use wrapper for C vscanf
+	  instead (report by George Goffe <grgoffe@excite.com> and Matt Taggart
+	  <taggart@carmen.fc.hp.com>, fixes Debian .
+
+20010303
+	+ modify interface of _nc_get_token() to pass 'silent' parameter to it,
+	  to make quieter loading of /etc/termcap (patch by Todd C Miller).
+	+ correct a few typos in curs_slk.3x and curs_outopts.3x manpages
+	  (patch by Todd C Miller).
+
+20010224
+	+ compiler-warning fixes (reported by Nelson Beebe).
+
+20010210
+	+ modify screen terminfo entry to use new 3.9.8 feature allowing xterm
+	  mouse controls -TD
+
+20010203
+	+ broaden patterns used to match OS/2 EMX in configure script to cover
+	  variant used in newer config.guess/config.sub
+	+ remove changequote() calls from configure script, since this feature
+	  is broken in the autoconf 2.49c alpha, maintainers decline to fix.
+	+ remove macro callPutChar() from tty_update.c, since this is no longer
+	  needed (reported by Philippe Blain).
+	+ add a null-pointer check in tic.c to handle the case when the input
+	  file is really empty.  Modify the next_char() function in comp_scan.c
+	  to allow arbitrarily long lines, and incidentally supply a newline to
+	  files that do not end in a newline.  These changes improve tic's
+	  recovery from attempts to read binary files, e.g., its output from
+	  the terminfo database (reported by Bernhard Rosenkraenzer).
+
+20010127
+	+ revert change to c++/demo.cc from 20001209, which changed definition
+	  of main() apparently to accommodate cygwin linker, but broke the demo
+	  program.
+	+ workaround for broken egcs 2.91.66 which calls member functions
+	  (i.e., lines() and colors() of NCursesWindow before calling its
+	  constructor.  Add calls to initialize() in a few constructors which
+	  did not do this already.
+	+ use the GNAT preprocessor to make the necessary switch between TRACE
+	  and NO_TRACE configurations (patch by Juergen Pfeifer).
+	> patches by Bernhard Rosenkraenzer:
+	+ modify kterm terminfo entry to use SCS sequence to support alternate
+	  character set (it does not work with SI/SO).
+	+ --with-ospeed=something didn't work.  configure.in checked for a
+	  $enableval where it should check for $withval.  Also,
+	  ncurses/llib-lncurses still had a hardcoded short.
+
+20010114
+	+ correction to my merge of Tom Riddle's patch that broke tic in some
+	  conditions (reported by Enoch Wexler <enoch@wexler.co.il>) -TD
+
+20010113
+	+ modify view.c to test halfdelay().  Like other tests, this recognizes
+	  the 's' and space commands for stopping/starting polled input, shows
+	  a freerunning clock in the header.  If given a parameter to 's', that
+	  makes view.c use halfdelay() with that parameter rather than
+	  nodelay().
+	+ fix to allow compile with the experimental configure option
+	  --disable-hashmap.
+	+ modify postprocess_termcap() to avoid overwriting key_backspace,
+	  key_left, key_down when processing a non-base entry (report/patch by
+	  Tom Riddle).
+	+ modify _nc_wrap_entry(), adding option to reallocate the string
+	  table, needed in _nc_merge_entry() when merging termcap entries.
+	  (adapted from report/patch by Tom Riddle <ftr@oracom.com>).
+	+ modify a few configure script macros to keep $CFLAGS used only for
+	  compiler options, preprocessor options in $CPPFLAGS.
+
+20001230
+	+ correct marker positions in lrtest.c after receiving a sigwinch.
+	+ fix ifdef's in ncurses.c to build against pre-5.2 for testing.
+	+ fixes to tclock for resizing behavior, redundant computation (report
+	  and patch by A M Kuchling <akuchlin@mems-exchange.org>).
+
+20001216
+	+ improved scoansi terminfo entry -TD
+	+ modify configure script and makefile in Ada95/src to compile a stub
+	  for the trace functions when ncurses does not provide those.
+
+20001209
+	+ add ncurses_dll.h and related definitions to support generating DLL's
+	  with cygwin (adapted from a patch by Charles Wilson
+	  <cwilson@ece.gatech.edu>, changed NCURSES_EXPORT macro to make it
+	  work with 'indent') -TD
+
+20001202
+	+ correct prototypes for some functions in curs_termcap.3x, matching
+	  termcap.h, which matches X/Open.
+	> patch by Juergen Pfeifer:
+	+ a revised version of the Ada enhancements sent in by "H.
+	  Nanosecond", aka Eugene V Melaragno <aldomel@ix.netcom.com>.  This
+	  patch includes
+	  - small fixes to the existing ncurses binding
+	  - addition of some more low-level functions to the binding, including
+	    termcap and terminfo functions
+	  - An Ada implementation of the "ncurses" test application originally
+	    written in C.
+
+20001125
+	+ modify logic in lib_setup.c to allow either lines or columns value
+	  from terminfo to be used if the screen size cannot be determined
+	  dynamically rather than requiring both (patch by Ehud Karni
+	  <ehud@unix.simonwiesel.co.il>).
+	+ add check in lib_tgoto.c's is_termcap() function to reject null or
+	  empty strings (reported by Valentin Nechayev <netch@netch.kiev.ua> to
+	  freebsd-bugs).
+	+ add definition from configure script that denotes the path-separator,
+	  which is normally a colon.  The path-separator is a semicolon on
+	  OS/2 EMX and similar systems which may use a colon within pathnames.
+	+ alter logic to set default for --disable-overwrite option to set it
+	  to 'yes' if the --prefix/$prefix value is not /usr/local, thereby
+	  accommodating the most common cause of problems: gcc's nonstandard
+	  search rules.  Other locations such as /usr/local/ncurses will
+	  default to overwriting (report by Lars Hecking <lhecking@nmrc.ie>).
+
+20001118
+	+ modify default for --disable-overwrite configure option to disable
+	  if the --prefix or $prefix value is not /usr.
+	+ add cygwin to systems for which ncurses is installed by default into
+	  /usr rather than /usr/local.
+
+20001111
+	+ minor optimization in comp_error.c and lib_termname.c, using
+	  strncat() to replace strncpy() (patch by Solar Designer).
+	+ add a use_terminfo_vars() check for $HOME/.termcap, and check for
+	  geteuid() to use_terminfo_vars() (patch by Solar Designer
+	  <solar@false.com>).
+	+ improved cygwin terminfo entry, based on patch by
+	  <ernie_boyd@yahoo.com>.
+	+ modify _nc_write_entry() to allow for the possibility that linking
+	  aliases on a filesystem that ignores case would not succeed because
+	  the source and destination differ only by case, e.g., NCR260VT300WPP0
+	  on cygwin (report by Neil Zanella).
+	+ fix a typo in the curs_deleteln.3x man page (patch by Bernhard
+	  Rosenkraenzer <bero@redhat.de>).
+
+20001104
+	+ add configure option --with-ospeed to assist packagers in transition
+	  to 5.3 change to ospeed type.
+	+ add/use CharOf() macro to suppress sign-extension of char type on
+	  platforms where this is a problem in ctype macros, e.g., Solaris.
+	+ change trace output to binary format.
+	+ correct a missing quote adjustment in CF_PATH_SYNTAX autoconf
+	  macro, for OS/2 EMX configuration.
+	+ rearrange a few configure macros, moving preprocessor options to
+	  $CPPFLAGS (a now-obsolete version of autoconf did not consistently
+	  use $CPPFLAGS in both the compile and preprocessor checks).
+	+ add a check in relative_move() to guard against buffer overflow in
+	  the overwrite logic.
+
+20001028
+	+ add message to configure script showing g++ version.
+	+ resync config.guess, config.sub
+	+ modify lib_delwin.c, making it return ERR if the window did not exist
+	  (suggested by Neil Zanella).
+	+ add cases for FreeBSD 3.1 to tdlint and makellib scripts, used this
+	  to test/review ncurses library.  (Would use lclint, but it doesn't
+	  work).
+	+ reorganized knight.c to avoid forward references.  Correct screen
+	  updates when backtracking, especially to the first cell.  Add F/B/a
+	  commands.
+
+20001021 5.2 release for upload to ftp.gnu.org
+	+ update generated html files from manpages.
+	+ modify dist.mk to use edit_man.sh to substitute autoconf'd variables
+	  in html manpages.
+	+ fix an uninitialized pointer in read_termcap.c (report by Todd C
+	  Miller, from report/patch by Philip Guenther <guenther@gac.edu>).
+	+ correct help-message and array limit in knight.c (patch by Brian
+	  Raiter <breadbox@muppetlabs.com>).
+	> patch by Juergen Pfeifer:
+	+ fix to avoid warning by GNAT-3.13p about use of inconsistent casing
+	  for some identifiers defined in the standard package.
+	+ cosmetic change to forms/fty_enum.c
+
+20001014
+	+ correct an off-by-one position in test/railroad.c which could cause
+	  wrapping at the right margin.
+	+ test/repair some issues with libtool configuration.  Make
+	  --disable-echo force libtool --silent.  (Libtool does not work for
+	  OS/2 EMX, works partly for SCO - libtool is still very specific to
+	  gcc).
+	+ change default of --with-manpage-tbl to "no", since for most of the
+	  platforms which do have tbl installed, the system "man" program
+	  understands how to run tbl automatically.
+	+ minor improvement to force_bar() in comp_parse.c (Bernhard
+	  Rosenkraenzer <bero@redhat.de>).
+	+ modify lib_tparm.c to use get_space() before writing terminating
+	  null character, both for consistency as well as to ensure that if
+	  save_char() was called immediately before, that the allocated memory
+	  is enough (patch by Sergei Ivanov).
+	+ add note about termcap ML capability which is duplicated between two
+	  different capabilities:  smgl and smglr (reported by Sergei Ivanov
+	  <svivanov@pdmi.ras.ru>).
+	+ correct parameter counts in include/Caps for dclk as well as some
+	  printer-specific capabilities: csnm, defc, scs, scsd, smgtp, smglp.
+	> patch by Johnny C Lam <lamj@stat.cmu.edu>:
+	+ add support for building with libtool (apparently version 1.3.5,
+	  since old versions do not handle -L../lib), using new configure
+	  option --with-libtool.
+	+ add configure option --with-manpage-tbl, which causes the manpages to
+	  be preprocessed by tbl(1) prior to installation,
+	+ add configure option --without-curses-h, which causes the
+	  installation process to install curses.h as ncurses.h and make
+	  appropriate changes to headers and manpages.
+
+20001009
+	+ correct order of options/parameters in run_tic.in invocation of tic,
+	  which did not work with standard getopt() (reported by Ethan
+	  Butterfield <primus@veris.org>).
+	+ correct logic for 'reverse' variable in lib_vidattr.c, which was
+	  setting it true without checking if newmode had A_REVERSE set, e.g.,
+	  using $TERM=ansi on OS/2 EMX (see 20000917).
+	> patch by Todd C Miller:
+	+ add a few missing use_terminfo_vars() and fixes up _nc_tgetent().
+	  Previously, _nc_cgetset() would still get called on cp so the
+	  simplest thing is to set cp to NULL if !use_terminfo_vars().
+	+ added checks for an empty $HOME environment variable.
+	> patches for OS/2 EMX (Ilya Zakharevich):
+	+ modify convert_configure.pl to support INSTALL.  Change compiler
+	  options in that script to use multithreading, needed for the mouse.
+	+ modify OS/2 mouse support, retrying as a 2-button mouse if code fails
+	  to set up a 3-button mouse.
+	+ improve code for OS/2 mouse support, using _nc_timed_wait() to
+	  replace select() call.
+
+20001007
+	+ change type of ospeed variable back to short to match its use in
+	  legacy applications (reported by Andrey A Chernov).
+	+ add case to configure script for --enable-rpath on IRIX (patch by
+	  Albert Chin-A-Young).
+	+ minor fix to position_check() function, to ensure it gets the whole
+	  cursor report before decoding.
+	+ add configure option --disable-assumed-color, to allow pre-5.1
+	  convention of default colors used for color-pair 0 to be configured
+	  (see assume_default_colors()).
+	+ rename configure option --enable-hashmap --disable-hashmap, and
+	  reorder the configure options, splitting the experimental and
+	  development
+	+ add configure option --disable-root-environ, which tells ncurses to
+	  disregard $TERMINFO and similar environment variables if the current
+	  user is root, or running setuid/setgid (based on discussion with
+	  several people).
+	+ modified misc/run_tic.in to use tic -o, to eliminate dependency on
+	  $TERMINFO variable for installs.
+	+ add table entry for plab_norm to tput, so it passes in strings
+	  for that capability.
+	+ modify parse_format() in lib_tparm.c to ignore precision if it is
+	  longer than 10000 (report by Jouko Pynnonen).
+	+ rewrote limit checks in lib_mvcur.c using new functions
+	  _nc_safe_strcat(), etc.  Made other related changes to check lengths
+	  used for strcat/strcpy (report by Jouko Pynnonen
+	  <jouko@solutions.fi>).
+
+20000930
+	+ modify several descriptions, including those for setaf, setab, in
+	  include/Caps to indicate that the entries are parameterized.  This
+	  information is used to tell which strings are translated when
+	  converting to termcap.  Fixes a problem where the generated termcap
+	  would contain a spurious "%p1" for the terminfo "%p1%d".
+	+ modify ld -rpath options (e.g., Linux, and Solaris) to use an
+	  absolute pathname for the build tree's lib directory (prompted by
+	  discussion with Albert Chin-A-Young).
+	+ modify "make install.man" and "make uninstall.man" to include tack's
+	  man-page.
+	+ various fixes for install scripts used to support configure --srcdir
+	  and --with-install-prefix (reported by Matthew Clarke
+	  <Matthew_Clarke@mindlink.bc.ca>).
+	+ make configure script checks on variables $GCC and $GXX consistently
+	  compare against 'yes' rather than test if they are nonnull, since
+	  either may be set to the corresponding name of the C or C++ compiler
+	  (report/patch by Albert Chin-A-Young).
+
+20000923
+	+ modify rs2 capability in xterm-r6 and similar where cursor
+	  save/restore bracketed the sequence for resetting video attributes.
+	  The cursor restore would undo that (report by John Hawkinson
+	  <jhawk@MIT.EDU> (see NetBSD misc/11052)).
+	+ using parameter check added to tic, corrected 27 typos in
+	  terminfo.src -TD
+	+ modify tic to verify that its inputs are really files, in case
+	  someone tries to read a directory (or /dev/zero).
+	+ add a check for empty buffers returned by fgets() in comp_scan.c
+	  next_char() function, in case tic is run on a non-text file (fixes
+	  a core dump reported by Aaron Campbell <aaron@cs.dal.ca>).
+	+ add to railroad.c some code exercising tgoto(), providing an
+	  alternate form of display if the terminal supports cursor addressing.
+	+ split-out tgoto() again, this time into new file lib_tgoto.c, and
+	  implement a conventional BSD-style tgoto() which is used if the
+	  capability string does not contain terminfo-style padding or
+	  parameters (requested by Andrey A Chernov).
+	+ add check to tic which reports capabilities that do not reference
+	  the expected number of parameters.
+	+ add error checking to infocmp's -v and -m options to ensure that
+	  the option value is indeed a number.
+	+ some cleanup of logic in _nc_signal_handler() to verify if SIGWINCH
+	  handler is setup.  Separated the old/new sigaction data for SIGTSTP
+	  from the other signals.
+
+20000917
+	+ add S0, E0 extensions to screen's terminfo entry, which is another
+	  way to solve the misconfiguration issue -TD
+	+ completed special case for tgoto from 20000916
+
+20000916
+	+ update xterm terminfo entries to match XFree86 xterm patch #146 -TD
+	+ add Matrix Orbital terminfo entries (from Eric Z Ayers
+	  <eric@ale.org>).
+	+ add special case to lib_tparm.c to allow 'screen' program to use a
+	  termcap-style parameter "%." to tgoto() for switching character sets.
+	+ use LN_S substitution in run_tic.in, to work on OS/2 EMX which has
+	  no symbolic links.
+	+ updated notes in README.emx regarding autoconf patches.
+	+ replace a lookup table in lib_vidattr.c used to decode no_color_video
+	  with a logic expression (suggested by Philippe Blain).
+	+ add a/A toggle to ncurses.c 'b' test, which clears/sets alternate
+	  character set attribute from the displayed text.
+	+ correct inequality in parameter analysis of rewritten lib_tparm.c
+	  which had the effect of ignoring p9 in set_attributes (sgr), breaking
+	  alternate character set (reported by Piotr Majka <charvel@link.pl>).
+	+ correct ifdef'ing for GCC_PRINTF, GCC_SCANF which would not compile
+	  with Sun WorkShop compilers since these tokens were empty (cf:
+	  20000902, reported by Albert Chin-A-Young).
+
+20000909
+	+ correct an uninitialized parameter to open_tempfile() in tic.c which
+	  made "tic -I" give an ambiguous error message about tmpnam.
+	+ add special case in lib_vidattr.c to reset underline and standout for
+	  devices that have no sgr0 defined (patch by Don Lewis
+	  <Don.Lewis@tsc.tdk.com>).  Note that this will not work for bold
+	  mode, since there is no exit-bold-mode capability.
+	+ improved patch for Make_Enum_Type (patch by Juergen Pfeifer).
+	+ modify tparm to disallow arithmetic on strings, analyze the varargs
+	  list to read strings as strings and numbers as numbers.
+	+ modify tparm's internal function spop() to treat a null pointer as
+	  an empty string.
+	+ modify tput program so it can be renamed or invoked via a link as
+	  'reset' or 'init', producing the same effect as 'tput reset' or 'tput
+	  init'.
+	+ add private entrypoint _nc_basename(), use to consolidate related
+	  code in progs, as well as accommodating OS/2 EMX pathnames.
+	+ remove NCURSES_CONST line from edit_cfg.sh to compensate for its
+	  removal (except via AC_SUBST) from configure.in, making
+	  --enable-const work again (reported by Juergen Pfeifer).
+	+ regen'd configure to pick up "hpux*" change from 20000902.
+
+20000902
+	+ modify tset.c to check for transformed "reset" program name, if any.
+	+ add a check for null pointer in Make_Enum_Type() (reported by Steven
+	  W Orr <steveo@world.std.com>).
+	+ change functions _nc_parse_entry() and postprocess_termcap() to avoid
+	  using strtok(), because it is non-reentrant (reported by Andrey A
+	  Chernov <ache@nagual.pp.ru>).
+	+ remove "hpux10.*" case from CF_SHARED_OPTS configure script macro.
+	  This differed from the "hpux*" case by using reversed symbolic
+	  links, which made the 5.1 version not match the configuration of
+	  5.0 shared libraries (reported by Albert Chin-A-Young).
+	+ correct a dependency in Ada95/src/Makefile.in which prevented
+	  building with configure --srcdir (patch by H Nanosecond
+	  <aldomel@ix.netcom.com>).
+	+ modify ifdef's in curses.h.in to avoid warning if GCC_PRINTF or
+	  GCC_SCANF was not previously defined (reported by Pavel Roskin
+	  <proski@gnu.org>).
+	+ add MKncurses_def.sh to generate fallback definitions for
+	  ncurses_cfg.h, to quiet gcc -Wundef warnings, modified ifdef's in
+	  code to consistently use "#if" rather than "#ifdef".
+
+20000826
+	+ add QNX qansi entries to terminfo -TD
+	+ add os2 entry to misc/emx.src (<jmcoopr@webmail.bmi.net>).
+	+ add configure option --with-database to allow specifying a different
+	  terminfo source-file to install.  On OS/2 EMX, this defaults to
+	  misc/emx.src
+	+ change misc/run_tic.sh to derive it from misc/run_tic.in, to simplify
+	  setting .exe extension on OS/2 EMX.
+	+ add .exe extension in Ada95/gen/Makefile.in,
+	  Ada95/samples/Makefile.in, for OS/2 EMX (reported by
+	  <jmcoopr@webmail.bmi.net>).
+	+ add configure check for filesystems (such as OS/2 EMX) which do not
+	  distinguish between upper/lowercase filenames, use this to fix tags
+	  rules in makefiles.
+	+ initialize fds[] array to 0's in _nc_timed_wait(); apparently poll()
+	  only sets the revents members of that array when there is activity
+	  corresponding to the related file (report by Glenn Cooper
+	  <gcooper@qantas.com.au>, using Purify on Solaris 5.6).
+	+ change configure script to use AC_CANONICAL_SYSTEM rather than
+	  AC_CANONICAL_HOST, which means that configure --target will set
+	  a default program-prefix.
+	+ add note on cross-compiling to INSTALL (which does not rely on the
+	  AC_CANONICAL_* macros).
+
+20000819
+	+ add cases for EMX OS/2 to config.guess, config.sub
+	+ new version of config.guess, config.sub from lynx 2.8.4dev.7
+	+ add definitions via transform.h to allow tic and tput to check for
+	  the transformed aliases rather than the original infotocap, etc.
+	+ simplify transform-expressions in progs/Makefile.in, make the
+	  uninstall rule work for transformed program names.
+	+ change symbol used by --install-prefix configure option from
+	  INSTALL_PREFIX to DESTDIR (the latter has become common usage
+	  although the name is misleading).
+	+ modify programs to use curses_version() string to report the version
+	  of ncurses with which they are compiled rather than the
+	  NCURSES_VERSION string.  The function returns the patch level in
+	  addition to the major and minor version numbers.
+
+20000812
+	+ modify CF_MAN_PAGES configure macro to make transformed program names
+	  a parameter to that macro rather than embedding them in the macro.
+	+ newer config.guess, config.sub (reference version used in lynx
+	  2.8.4dev.7).
+	+ add configure option --with-default-terminfo-dir=DIR to allow
+	  specifying the default terminfo database directory (request by Albert
+	  Chin-A-Young).
+	+ minor updates for terminfo.src from FreeBSD termcap change-history.
+	+ correct notes in README and INSTALL regarding documentation files
+	  that were moved from misc directory to doc (report by Rich Kulawiec
+	  <rsk@gsp.org>).
+	+ change most remaining unquoted parameters of 'test' in configure
+	  script to use quotes, for instance fixing a problem in the
+	  --disable-database option (reported by Christian Mondrup
+	  <scancm@biobase.dk>).
+	+ minor adjustments to work around some of the incompatibilities/bugs
+	  in autoconf 2.29a alpha.
+	+ add -I/usr/local/include when --with-ncurses option is used in
+	  test/configure script.
+	+ correct logic in adjust_cancels(), which did not check both
+	  alternatives when reclassifying an extended name between boolean,
+	  number and string, causing an infinite loop in tic.
+
+20000730
+	+ correct a missing backslash in curses.priv.h
+
+20000729
+	+ change handling of non_dest_scroll_region in tty_update.c to clear
+	  text after it is shifted in rather than before shifting out.  Also
+	  correct row computation (reported by Ruediger Kuhlmann
+	  <uck4@rz.uni-karlsruhe.de>).
+	+ add/use new trace function to display chtype values from winch() and
+	  getbkgd().
+	+ add trace mask TRACE_ATTRS, alter several existing _tracef calls that
+	  trace attribute changes under TRACE_CALLS to use this.
+	+ modify MKlib_gen.sh so that functions returning chtype will call
+	  returnChar().
+	+ add returnChar() trace, for functions returning chtype.
+	+ change indent.pro to line up parenthesis.
+
+20000722
+	+ fix a heap problem with the c++ binding (report by
+	  <alexander_liberson@ninewest.com>, patch by Juergen Pfeifer).
+	+ minor adjustment to ClrToEOL() to handle an out-of-bounds parameter.
+	+ modify the check for big-core to force a couple of memory accesses,
+	  which may work as needed for older/less-capable machines (if not,
+	  there's still the explicit configure option).
+	> fixes based on diff's for Amiga and BeOS found at
+	  http://www.mathematik.uni-karlsruhe.de/~kuhlmann/cross/ncurses/
+	+ alter definition of NCURSES_CONST to make it non-empty.
+	+ add amiga-vnc terminfo entry.
+	+ redefine 'TEXT' in menu.h for AMIGA, since it is reported to have
+	  an (unspecified) symbol conflict.
+	+ replaced case-statement in _nc_tracebits() for CSIZE with a table to
+	  simplify working around implementations that define random
+	  combinations of the related macros to zero.
+	+ modify configure test for tcgetattr() to allow for old
+	  implementations, e.g., on BeOS, which only defined it as a macro.
+	> patches by Bruno Haible:
+	+ when checking LC_ALL/LC_CTYPE/LANG environment variables for UTF-8
+	  locale, ignore those which are set to an empty value, as per SUSV2.
+	+ encode 0xFFFD in UTF-8 with 3 bytes, not 2.
+	+ modify _nc_utf8_outch() to avoid sign-extension when checking for
+	  out-of-range value.
+
+20000715
+	+ correct manlinks.sed script to avoid using ERE "\+", which is not
+	  understood by older versions of sed (patch by Albert Chin-A-Young).
+	+ implement configure script options that transform installed program
+	  names, e.g., --program-prefix, including the manpage names and cross
+	  references (patch by Albert Chin-A-Young <china@thewrittenword.com>).
+	+ correct several mismatches between manpage filename and ".TH"
+	  directives, renaming dft_fgbg.3x to default_colors.3x and
+	  menu_attribs.3x to menu_attributes.3x (report by Todd C Miller).
+	+ correct missing includes for <string.h> in several places, including
+	  the C++ binding.  This is not noted by gcc unless we use the
+	  -fno-builtin option (reported by Igor Schein <igor@txc.com>).
+	+ modified progs/tset.c and tack/sysdep.c to build with sgttyb
+	  interface if neither termio or termios is available.  Tested this
+	  with FreeBSD 2.1.5 (which does have termios - but the sgttyb does
+	  work).
+
+20000708 5.1 release for upload to ftp.gnu.org
+	+ document configure options in INSTALL.
+	+ add man-page for ncurses trace functions.
+	+ correct return value shown in curs_touch.3x for is_linetouched() and
+	  is_wintouched(), in curs_initscr.3x for isendwin(), and in
+	  curs_termattr.3x for has_ic() and has_il().
+	+ add prototypes for touchline() and touchwin(), adding them to the
+	  list of generated functions.
+	+ modify fifo_push() to put ERR into the fifo just like other values to
+	  return from wgetch().  It was returning without doing that, making
+	  end-of-file condition incorrectly return a 0 (reported by Todd C
+	  Miller).
+	+ uncomment CC_SHARED_OPTS for progs and tack (see 971115), since they
+	  are needed for SCO OpenServer.
+	+ move _nc_disable_period from free_ttype.c to comp_scan.c to appease
+	  dynamic loaders on SCO and IRIX64.
+	+ add "-a" option to test/ncurses.c to invoke assume_default_colors()
+	  for testing.
+	+ correct assignment in assume_default_colors() which tells ncurses
+	  whether to use default colors, or the assumed ones (reported by Gary
+	  Funck <gary@Intrepid.Com>).
+	+ review/correct logic in mk-1st.awk for making symbolic links for
+	  shared libraries, in particular for FreeBSD, etc.
+	+ regenerate misc/*.def files for OS/2 EMX dll's.
+	+ correct quoting of values for CC_SHARED_OPTS in aclocal.m4 for
+	  cases openbsd2*, openbsd*, freebsd* and netbsd* (patch by Peter
+	  Wemm) (err in 20000610).
+	+ minor updates to release notes, as well as adding/updating URLs for
+	  examples cited in announce.html
+	> several fixes from Philippe Blain <philippe.blain2@freesbee.fr>:
+	+ correct placement of ifdef for NCURSES_XNAMES in function
+	  _nc_free_termtype(), fixes a memory leak.
+	+ add a call to _nc_synchook() to the end of function whline() like
+	  that in wvline() (difference was in 1.9.4).
+	+ make ClearScreen() a little faster by moving two instances of
+	  UpdateAttr() out of for-loops.
+	+ simplify ClrBottom() by eliminating the tstLine data, using for-loops
+	  (cf: 960428).
+
+20000701 pre-release
+	+ change minor version to 1, i.e., ncurses 5.1
+	+ add experimental configure option --enable-colorfgbg to check for
+	  $COLORFGBG variable as set by rxvt/aterm/Eterm.
+	+ add Eterm terminfo entry (Michael Jennings <mej@valinux.com>).
+	+ modify manlinks.sed to pick aliases from the SYNOPSIS section, and
+	  several manpages so manlinks.sed can find aliases for creating
+	  symbolic links.
+	+ add explanation to run_tic.sh regarding extended terminal
+	  capabilities.
+	+ change message format for edit_cfg.sh, since some people interpret
+	  it as a warning.
+	+ correct unescaped '$' in sysv5uw7*|unix_sv* rule for CF_SHARED_OPTS
+	  configure macro (report by Thanh Ma <Thanh.Ma@casi-rusco.com>).
+	+ correct logic in lib_twait.c as used by lib_mouse.c for GPM mouse
+	  support when poll() is used rather than select() (prompted by
+	  discussion with David Allen <DAllen24@aol.com>).
+
+20000624 pre-release
+	+ modify TransformLine() to check for cells with different color pairs
+	  that happen to render the same display colors.
+	+ apply $NCURSES_NO_PADDING to cost-computation in mvcur().
+	+ improve cost computation in PutRange() by accounting for the use
+	  of parm_right_cursor in mvcur().
+	+ correct cost computation in EmitRange(), which was not using the
+	  normalized value for cursor_address.
+	+ newer config.guess, config.sub (reference version used in TIN 1.5.6).
+
+20000617
+	+ update config.guess, config.sub (reference version used in PCRE 3.2).
+	+ resync changes to gnathtml against version 1.22, regenerated html
+	  files under doc/html/ada using this (1.22.1.1).
+	+ regenerated html files under doc/html/man after correcting top and
+	  bottom margin options for man2html in dist.mk
+	+ minor fixes to test programs ncurses 'i' and testcurs program to make
+	  the subwindow's background color cover the subwindow.
+	+ modify configure script so AC_MSG_ERROR is temporarily defined to a
+	  warning in AC_PROG_CXX to make it recover from a missing C++ compiler
+	  without requiring user to add --without-cxx option (adapted from
+	  comment by Akim Demaille <akim@epita.fr> to autoconf mailing list).
+	+ modify headers.sh to avoid creating temporary files in the build
+	  directory when installing headers (reported by Sergei Pokrovsky
+	  <pok@nbsp.nsk.su>)
+
+20000610
+	+ regenerated the html files under doc/html/ada/files and
+	  doc/html/ada/funcs with a slightly-improved gnathtml.
+	+ add kmous capability to linux terminfo entry to allow it to use
+	  xterm-style events provided by gpm patch by Joerg Schoen.
+	+ make the configure macro CF_SHARED_OPTS a little smarter by testing
+	  if -fPIC is supported by gcc rather than -fpic.  The former option
+	  allows larger symbol tables.
+	+ update config.guess and config.sub (patches by
+	  Kevin Buettner <kev@primenet.com> (for elf64_ia64),
+	  Bernd Kuemmerlen <bkuemmer@mevis.de> (for MacOS X)).
+	+ add warning for 'tic -cv' about use of '^?' in terminfo source, which
+	  is an extension.
+
+20000527
+	+ modify echo() behavior of getch() to match Solaris curses for
+	  carriage return and backspace (reported by Neil Zanella).
+	+ change _nc_flush() to a function.
+	+ modify delscreen() to check if the output stream has been closed, and
+	  if so, free the buffer allocated for setbuf (this provides an
+	  ncurses-specific way to avoid a memory leak when repeatedly calling
+	  newterm reported by Chipp C <at_1@zdnetonebox.com>).
+	+ correct typo in curs_getch.3x manpage regarding noecho (reported by
+	  David Malone <dwmalone@maths.tcd.ie>).
+	+ add a "make libs" rule.
+	+ make the Ada95 interface build with configure --enable-widec.
+	+ if the configure --enable-widec option is given, append 'w' to names
+	  of the generated libraries (e.g., libncursesw.so) to avoid conflict
+	  with existing ncurses libraries.
+
+20000520
+	+ modify view.c to make a rudimentary viewer of UTF-8 text if ncurses
+	  is configured with the experimental wide-character support.
+	+ add a simple UTF-8 output driver to the experimental wide-character
+	  support.  If any of the environment variables LC_ALL, LC_CTYPE or
+	  LANG contain the string "UTF-8", this driver will be used to
+	  translate the output to UTF-8.  This works with XFree86 xterm.
+	+ modify configure script to allow building shared libraries on BeOS
+	  (from a patch by Valeriy E Ushakov).
+	+ modify lib_addch.c to allow repeated update to the lower-right
+	  corner, rather than displaying only the first character written until
+	  the cursor is moved.  Recent versions of SVr4 curses can update the
+	  lower-right corner, and behave this way (reported by Neil Zanella).
+	+ add a limit-check in _nc_do_color(), to avoid using invalid color
+	  pair value (report by Brendan O'Dea <bod@compusol.com.au>).
+
+20000513
+	+ the tack program knows how to use smcup and rmcup but the "show caps
+	  that can be tested" feature did not reflect this knowledge.  Correct
+	  the display in the menu tack/test/edit/c (patch by Daniel Weaver).
+	+ xterm-16color does allow bold+colors, removed ncv#32 from that
+	  terminfo entry.
+
+20000506
+	+ correct assignment to SP->_has_sgr_39_49 in lib_dft_fgbg.c, which
+	  broke check for screen's AX capability (reported by Valeriy E Ushakov
+	  <uwe@ptc.spbu.ru>).
+	+ change man2html rule in dist.mk to workaround bug in some
+	  man-programs that ignores locale when rendering hyphenation.
+	+ change web- and ftp-site to dickey.his.com
+
+20000429
+	+ move _nc_curr_token from parse_entry.c to comp_scan.c, to work around
+	  problem linking tack on MacOS X DP3.
+	+ include <sys/time.h> in lib_napms.c to compile on MacOS X DP3
+	  (reported by Gerben Wierda <wierda@holmes.nl>).
+	+ modify lib_vidattr.c to check for ncv fixes when pair-0 is not
+	  default colors.
+	+ add -d option to ncurses.c, to turn on default-colors for testing.
+	+ add a check to _nc_makenew() to ensure that newwin() and newpad()
+	  calls do not silently fail by passing too-large limits.
+	+ add symbol NCURSES_SIZE_T to use rather than explicit 'short' for
+	  internal window and pad sizes.  Note that since this is visible in
+	  the WINDOW struct, it would be an ABI change to make this an 'int'
+	  (prompted by a question by Bastian Trompetter
+	  <btrompetter@firemail.de>, who attempted to create a 96000-line pad).
+
+20000422
+	+ add mgterm terminfo entry from NetBSD, minor adjustments to sun-ss5,
+	  aixterm entries -TD
+	+ modify tack/ansi.c to make it more tolerant of bad ANSI replies.  An
+	  example of an illegal ANSI resonse can be found using Microsoft's
+	  Telnet client.  A correct display can be found using a VT-4xx
+	  terminal or XFree86 xterm with:
+		XTerm*VT100*decTerminalID:  450
+	  (patch by Daniel Weaver).
+	+ modify gdc.c to recognize 'q' for quit, 's' for single-step and ' '
+	  for resume.  Add '-n' option to force gdc's standard input to
+	  /dev/null, to both illustrate the use of newterm() for specifying
+	  alternate inputs as well as for testing signal handling.
+	+ minor fix for configure option --with-manpage-symlinks, for target
+	  directories that contain a period ('.') (reported by Larry Virden).
+
+20000415
+	+ minor additions to beterm entry (feedback from Rico Tudor) -TD
+	+ corrections/updates for some IBM terminfo entries -TD
+	+ modify _nc_screen_wrap() so that when exiting curses mode with
+	  non-default colors, the last line on the screen will be cleared to
+	  the screen's default colors (request by Alexander V Lukyanov).
+	+ modify ncurses.c 'r' example to set nonl(), allowing control/M to be
+	  read for demonstrating the REQ_NEW_LINE operation (prompted by a
+	  question by Tony L Keith <tlkeith@keithconsulting.com>).
+	+ modify ncurses.c 'r' example of field_info() to work on Solaris 2.7,
+	  documented extension of ncurses which allows a zero pointer.
+	+ modify fmt_complex() to avoid buffer overflow in case of excess
+	  recursion, and to recognize "%e%?" as a synonym for else-if, which
+	  means that it will not recur for that special case.
+	+ add logic to support $TERMCAP variable in case the USE_GETCAP symbol
+	  is defined (patch by Todd C Miller).
+	+ modify one of the m4 files used to generate the Ada95 sources,
+	  to avoid using the token "symbols" (patch by Juergen Pfeifer).
+
+20000408
+	+ add terminfo entries bsdos-pc-m, bsdos-pc-mono (Jeffrey C Honig)
+	+ correct spelling error in terminfo entry name:  bq300-rv was given as
+	  bg300-rv in esr's version.
+	+ modify redrawwin() macro so its parameter is fully parenthesized
+	  (fixes Debian #61088).
+	+ correct formatting error in dump_entry() which set incorrect column
+	  value when no newline trimming was needed at the end of an entry,
+	  before appending "use=" clauses (cf: 960406).
+
+20000401
+	+ add configure option --with-manpage-symlinks
+	+ change unctrl() to render C1 characters (128-159) as ~@, ~A, etc.
+	+ change makefiles so trace() function is provided only if TRACE is
+	  defined, e.g., in the debug library.  Modify related calls to
+	  _tracechar() to use unctrl() instead.
+
+20000325
+	+ add screen's AX capability (for ECMA SGR 39 and 49) to applicable
+	  terminfo entries, use presence of this as a check for a small
+	  improvement in setting default colors.
+	+ improve logic in _nc_do_color() implementing assume_default_colors()
+	  by passing in previous color pair info to eliminate redundant call to
+	  set_original_colors().  (Part of this is from a patch by Alexander
+	  V Lukyanov).
+	+ modify warning in _nc_trans_string() about a possibly too-long string
+	  to do this once only rather than for each character past the
+	  threshold (600).  Change interface of _nc_trans_string() to allow
+	  check for buffer overflow.
+	+ correct use of memset in _nc_read_entry_source() to initialize ENTRY
+	  struct each time before reading new data into it, rather than once
+	  per loop (cf:  990301).  This affects multi-entry in-core operations
+	  such as "infocmp -Fa".
+
+20000319
+	+ remove a spurious pointer increment in _nc_infotocap() changes from
+	  20000311.  Add check for '.' in format of number, since that also
+	  is not permitted in termcap.
+	+ correct typo in rxvt-basic terminfo from temporary change made while
+	  integrating 20000318.
+
+20000318
+	+ revert part of the vt220 change (request by Todd C Miller).
+	+ add ansi-* terminfo entries from ESR's version.
+	+ add -a option to tic and infocmp, which retains commented-out
+	  capabilities during source translation/comparison, e.g., captoinfo
+	  and infotocap.
+	+ modify cardfile.c to display an empty card if no input data file is
+	  found, fixes a core dump in that case (reported by Bruno Haible).
+	+ correct bracketing in CF_MATH_LIB configure macro, which gave wrong
+	  result for OS/2 EMX.
+	+ supply required parameter for _nc_resolve_uses() call in
+	  read_termcap.c, overlooked in 20000311 (reported by Todd C Miller).
+	> patches by Bruno Haible <haible@ilog.fr>:
+	+ fix a compiler warning in fty_enum.c
+	+ correct LIB_PREFIX expression for DEPS_CURSES in progs, tack
+	  makefiles, which resulted in redundant linking (cf: 20000122).
+
+20000311
+	+ make ifdef's for BROKEN_LINKER consistent (patch by Todd C Miller).
+	+ improved tack/README (patch by Daniel Weaver).
+	+ modify tput.c to ensure that unspecified parameters are passed to
+	  tparm() as 0's.
+	+ add a few checks in infocmp to guard against buffer overflow when
+	  displaying string capabilities.
+	+ add check for zero-uses in infocmp's file_comparison() function
+	  before calling _nc_align_termtype().  Otherwise one parameter is
+	  indexed past the end of the uses-array.
+	+ add an option -q to infocmp to specify the less verbose output,
+	  keeping the existing format as the default, though not retaining the
+	  previous behavior that made the -F option compare each entry to
+	  itself.
+	+ adapted patch by ESR to make infocmp -F less verbose -TD
+	  (the submitted patch was unusable because it did not compile
+	  properly)
+	  + modify write_entry.c to ensure that absent or cancelled booleans
+	    are written as FALSE, for consistency with infocmp which now
+	    assumes this.  Note that for the small-core configuration, tic
+	    may not produce the same result as before.
+	  + change some private library interfaces used by infocmp, e.g.,
+	    _nc_resolve_uses().
+	  + add a check in _nc_infotocap() to ensure that cm-style capabilities
+	    accept only %d codes when converting the format from terminfo to
+	    termcap.
+	  + modify ENTRY struct to separate the data in 'parent' into the name
+	    and link values (the original idea to merge both into 'parent' was
+	    not good).
+	  + discard repair_acsc(tterm);
+	> patch by Juergen Pfeifer:
+	+ drop support for gnat 3.10
+	+ move generated documentation and html files under ./doc directory,
+	  adding makefile rules for this to dist.mk
+
+20000304
+	+ correct conflicting use of tparm() in 20000226 change to tic, which
+	  made it check only one entry at a time.
+	+ fix errors in ncurses-intro.html and hackguide.html shown by Dave
+	  Raggett's tidy.
+	+ make the example in ncurses-intro.html do something plausible, and
+	  corrected misleading comment (reported by Neil Zanella).
+	+ modify pnoutrefresh() to set newscr->_leaveok as wnoutrefresh() does,
+	  to fix a case where the cursor position was not updated as in
+	  Solaris  (patch by David Mosberger <davidm@hpl.hp.com>).
+	+ add a limit-check for wresize() to ensure that a subwindow does not
+	  address out of bounds.
+	+ correct offsets used for subwindows in wresize() (patch by Michael
+	  Andres <ma@suse.de>).
+	+ regenerate html'ized manual pages with man2html 3.0.1 (patch by
+	  Juergen Pfeifer).  This generated a file with a space in its name,
+	  which I removed.
+	+ fix a few spelling errors in tack.
+	+ modify tack/Makefile.in to match linker options of progs/Makefile.in;
+	  otherwise it does not build properly for older HPUX shared library
+	  configurations.
+	+ add several terminfo entries from esr's "11.0".
+
+20000226
+	+ make 'tput flash' work properly for xterm by flushing output in
+	  delay_output() when using napms(), and modifying xterm's terminfo to
+	  specify no padding character.  Otherwise, xterm's reported baud rate
+	  can mislead ncurses into producing too few padding characters
+	  (Debian #58530).
+	+ add a check to tic for consistency between sgr and the separate
+	  capabilities such as smso, use this to check/correct several
+	  terminfo entries (Debian #58530).
+	+ add a check to tic if cvvis is the same as cnorm, adjusted several
+	  terminfo entries to remove the conflict (Debian #58530).
+	+ correct prototype shown in attr_set()/wattr_set() manpages (fixes
+	  Debian #53962).
+	+ minor clarification for curs_set() and leaveok() manpages.
+	+ use mkstemp() for creating temporary file for tic's processing of
+	  $TERMCAP contents (fixes Debian #56465).
+	+ correct two errors from integrating Alexander's changes:  did not
+	  handle the non-bce case properly in can_erase_with() (noted by
+	  Alexander), and left fg/bg uninitialized in the pair-zero case of
+	  _nc_do_color() (reported by Dr Werner Fink <werner@suse.de> and
+	  Ismael Cordeiro <ismael@cordeiro.com>).
+
+20000219
+	+ store default-color code consistently as C_MASK, even if given as
+	  -1 for convenience (adapted from patches by Alexander V Lukyanov).
+	> patches by Alexander V Lukyanov:
+	+ change can_clear_with() macro to accommodate logic for
+	  assume_default_colors(), making most of the FILL_BCE logic
+	  unnecessary.  Made can_clear_with() an inline function to make it
+	  simpler to read.
+
+20000212
+	+ corrected form of recent copyright dates.
+	+ minor corrections to xterm-xf86-v333 terminfo entry -TD
+	> patches by Alexander V Lukyanov:
+	+ reworded dft_fgbg.3x to avoid assuming that the terminal's default
+	  colors are white on black.
+	+ fix initialization of tstLine so that it is filled with current blank
+	  character in any case.  Previously it was possible to have it filled
+	  with old blank.  The wrong over-optimization was introduced in 991002
+	  patch.  (it is not very critical as the only bad effect is not using
+	  clr_eos for clearing if blank has changed).
+
+20000205
+	+ minor corrections/updates to several terminfo entries: rxvt-basic,
+	  vt520, vt525, ibm5151, xterm-xf86-v40 -TD
+	+ modify ifdef's for poll() to allow it to use <sys/poll.h>, thereby
+	  allowing poll() to be used on Linux.
+	+ add CF_FUNC_POLL macro to check if poll() is able to select from
+	  standard input.  If not we will not use it, preferring select()
+	  (adapted from patch by Michael Pakovic <mpakovic@fdn.com>).
+	+ update CF_SHARED_OPTS macro for SCO Unixware 7.1 to allow building
+	  shared libraries (reported/tested by Thanh <thanhma@mediaone.net>).
+	+ override $LANGUAGE in build to avoid incorrect ordering of keynames.
+	+ correct CF_MATH_LIB parameter, must be sin(x), not sqrt(x).
+
+20000122
+	+ resync CF_CHECK_ERRNO and CF_LIB_PREFIX macros from tin and xterm -TD
+	+ modify CF_MATH_LIB configure macro to parameterize the test function
+	  used, for reuse in dialog and similar packages.
+	+ correct tests for file-descriptors in OS/2 EMX mouse support.  A
+	  negative value could be used by FD_SET, causing the select() call
+	  to wait indefinitely.
+
+20000115
+	+ additional fixes for non-bce terminals (handling of delete_character)
+	  to work when assume_default_colors() is not specified.
+	+ modify warning message from _nc_parse_entry() regarding extended
+	  capability names to print only if tic/infocmp/toe have the -v flag
+	  set, and not at all in ordinary user applications.  Otherwise, this
+	  warning would be shown for screen's extended capabilities in programs
+	  that use the termcap interface (reported by Todd C Miller).
+	+ modify use of _nc_tracing from programs such as tic so their debug
+	  level is not in the same range as values set by trace() function.
+	+ small panel header cleanup (patch by Juergen Pfeifer).
+	+ add 'railroad' demo for termcap interface.
+	+ modify 'tic' to write its usage message to stderr (patch by Todd C
+	  Miller).
+
+20000108
+	+ add prototype for erase() to curses.h.in, needed to make test
+	  programs build with c++/g++.
+	+ add .c.i and .c.h suffix rules to generated makefiles, for debugging.
+	+ correct install rule for tack.1; it assumed that file was in the
+	  current directory (reported by Mike Castle <dalgoda@ix.netcom.com>).
+	+ modify terminfo/termcap translation to suppress acsc before trying
+	  sgr if the entry would be too large (patch by Todd C Miller).
+	+ document a special case of incompatibility between ncurses 4.2 and
+	  5.0, add a section for this in INSTALL.
+	+ add TRACE_DATABASE flag for trace().
+
+20000101
+	+ update mach, add mach-color terminfo entries based on Debian diffs
+	  for ncurses 5.0 -TD
+	+ add entries for xterm-hp, xterm-vt220, xterm-vt52 and xterm-noapp
+	  terminfo entries -TD
+	+ change OTrs capabilities to rs2 in terminfo.src -TD
+	+ add obsolete and extended capabilities to 'screen' terminfo -TD
+	+ corrected conversion from terminfo rs2 to termcap rs (cf: 980704)
+	+ make conversion to termcap ug (underline glitch) more consistently
+	  applied.
+	+ fix out-of-scope use of 'personal[]' buffer in 'toe' (this error
+	  was in the original pre-1.9.7 version, when $HOME/.terminfo was
+	  introduced).
+	+ modify 'toe' to ignore terminfo directories to which it has no
+	  permissions.
+	+ modify read_termtype(), fixing 'toe', which could dump core when it
+	  found an incomplete entry such as "dumb" because it did not
+	  initialize its buffer for _nc_read_file_entry().
+	+ use -fPIC rather than -fpic for shared libraries on Linux, not
+	  needed for i386 but some ports (from Debian diffs for 5.0) -TD
+	+ use explicit VALID_NUMERIC() checks in a few places that had been
+	  overlooked, and add a check to ensure that init_tabs is nonzero,
+	  to avoid divide-by-zero (reported by Todd C Miller).
+	+ minor fix for CF_ANSI_CC_CHECK configure macro, for HPUX 10.x (from
+	  tin) -TD
+
+19991218
+	+ reorder tests during mouse initialization to allow for gpm to run in
+	  xterm, or for xterm to be used under OS/2 EMX.  Also drop test for
+	  $DISPLAY in favor of kmous=\E[M or $TERM containing "xterm" (report
+	  by Christian Weisgerber <naddy@mips.rhein-neckar.de>).
+	+ modify raw() and noraw() to clear/restore IEXTEN flag which affects
+	  stty lnext on systems such as FreeBSD (report by Bruce Evans
+	  <bde@zeta.org.au>, via Jason Evans <jasone@canonware.com>).
+	+ fix a potential (but unlikely) buffer overflow in failed() function
+	  of tset.c (reported by Todd C Miller).
+	+ add manual-page for ncurses extensions, documented curses_version(),
+	  use_extended_names().
+
+19991211
+	+ treat as untranslatable to termcap those terminfo strings which
+	  contain non-decimal formatting, e.g., hexadecimal or octal.
+	+ correct commented-out capabilities that cannot be translated to
+	  termcap, which did not check if a colon must be escaped.
+	+ correct termcap translation for "%>" and "%+", which did not check
+	  if a colon must be escaped, for instance.
+	+ use save_string/save_char for _nc_captoinfo() to eliminate fixed
+	  buffer (originally for _nc_infotocap() in 960301 -TD).
+	+ correct expression used for terminfo equivalent of termcap %B,
+	  adjust regent100 entry which uses this.
+	+ some cleanup and commenting of ad hoc cases in _nc_infotocap().
+	+ eliminate a fixed-buffer in tic, used for translating comments.
+	+ add manpage for infotocap
+
+19991204
+	+ add kvt and gnome terminfo entries -TD
+	+ correct translation of "%%" by infotocap, which was emitted as "%".
+	+ add "obsolete" termcap strings to terminfo.src
+	+ modify infocmp to default to showing obsolete capabilities rather
+	  than terminfo only.
+	+ modify write_entry.c so that if extended names (i.e., configure
+	  --enable-tcap-names) are active, then tic will also write "obsolete"
+	  capabilities that are present in the terminfo source.
+	+ modify tic so that when running as captoinfo or infotocap, it
+	  initializes the output format as in -C and -I options, respectively.
+	+ improve infocmp and tic -f option by splitting long strings that do
+	  not have if-then-else construct, but do have parameters, e.g., the
+	  initc for xterm-88color.
+	+ refine MKtermsort.sh slightly by using bool for the *_from_termcap
+	  arrays.
+
+19991127
+	+ additional fixes for non-bce terminals (handling of clear_screen,
+	  clr_eol, clr_eos, scrolling) to work when assume_default_colors() is
+	  not specified.
+	+ several small changes to xterm terminfo entries -TD.
+	+ move logic for _nc_windows in lib_freeall.c inside check for nonnull
+	  SP, since it is part of that struct.
+	+ remove obsolete shlib-versions, which was unintentionally re-added
+	  in 970927.
+	+ modify infocmp -e, -E options to ensure that generated fallback.c
+	  type for Booleans agrees with term.h (reported by Eric Norum
+	  <eric@cls.usask.ca>).
+	+ correct configure script's use of $LIB_PREFIX, which did not work
+	  for installing the c++ directory if $libdir did not end with "/lib"
+	  (reported by Huy Le <huyle@ugcs.caltech.edu>).
+	+ modify infocmp so -L and -f options work together.
+	+ modify the initialization of SP->_color_table[] in start_color() so
+	  that color_content() will return usable values for COLORS greater
+	  than 8.
+	+ modify ncurses 'd' test in case COLORS is greater than 16, e.g., for
+	  xterm-88color, to limit the displayed/computed colors to 16.
+	> patch by Juergen Pfeifer:
+	+ simplify coding of the panel library according to suggestions by
+	  Philippe Blain.
+	+ improve macro coding for a few macros in curses.priv.h
+
+19991113
+	+ modify treatment of color pair 0 so that if ncurses is configured
+	  to support default colors, and they are not active, then ncurses
+	  will set that explicitly, not relying on orig_colors or orig_pair.
+	+ add new extension, assume_default_colors() to provide better control
+	  over the use of default colors.
+	+ modify test programs to use more-specific ifdef's for existence of
+	  wresize(), resizeterm() and use_default_colors().
+	+ modify configure script to add specific ifdef's for some functions
+	  that are included when --enable-ext-funcs is in effect, so their
+	  existence can be ifdef'd in the test programs.
+	+ reorder some configure options, moving those extensions that have
+	  evolved from experimental status into a new section.
+	+ change configure --enable-tcap-names to enable this by default.
+
+19991106
+	+ install tack's manpage (reported by Robert Weiner
+	  <robert@progplus.com>)
+	+ correct worm.c's handling of KEY_RESIZE (patch by Frank Heckenbach).
+	+ modify curses.h.in, undef'ing some symbols to avoid conflict with C++
+	  STL (reported by Matt Gerassimoff <mgeras@ticon.net>)
+
+19991030
+	+ modify linux terminfo entry to indicate that dim does not mix with
+	  color (reported by Klaus Weide <kweide@enteract.com>).
+	+ correct several typos in terminfo entries related to missing '['
+	  in CSI's -TD
+	+ fix several compiler warnings in c++ binding (reported by Tim
+	  Mooney for alphaev56-dec-osf4.0f
+	+ rename parameter of _nc_free_entries() to accommodate lint.
+	+ correct lint rule for tack, used incorrect list of source files.
+	+ add case to config.guess, config.sub for Rhapsody.
+	+ improve configure tests for libg++ and libstdc++ by omitting the
+	  math library (which is missing on Rhapsody), and improved test for
+	  the math library itself (adapted from path by Nelson H. F. Beebe).
+	+ explicitly initialize to zero several data items which were
+	  implicitly initialized, e.g., cur_term.  If not explicitly
+	  initialized, their storage type is C (common), and causes problems
+	  linking on Rhapsody 5.5 using gcc 2.7.2.1 (reported by Nelson H. F.
+	  Beebe).
+	+ modify Ada95 binding to not include the linker option for Ada
+	  bindings in the Ada headers, but in the Makefiles instead (patch by
+	  Juergen Pfeifer).
+
+19991023 5.0 release for upload to ftp.gnu.org
+	+ effective with release of 5.0, change NCURSES_VERSION_PATCH to
+	  4-digit year.
+	+ add function curses_version(), to return ncurses library version
+	  (request by Bob van der Poel).
+	+ remove rmam, smam from cygwin terminfo entry.
+	+ modify FreeBSD cons25 terminfo entry to add cnorm and cvvis, as well
+	  as update ncv to indicate that 'dim' conflicts with colors.
+	+ modify configure script to use symbolic links for FreeBSD shared
+	  libraries by default.
+	+ correct ranf() function in rain and worm programs to ensure it does
+	  not return 1.0
+	+ hide the cursor in hanoi.c if it is running automatically.
+	+ amend lrtest.c to account for optimizations that exploit margin
+	  wrapping.
+	+ add a simple terminfo demo, dots.c
+	+ modify SIGINT/SIGQUIT handler to set a flag used in _nc_outch() to
+	  tell it to use write() rather than putc(), since the latter is not
+	  safe in a signal handler according to POSIX.
+	+ add/use internal macros _nc_flush() and NC_OUTPUT to hide details
+	  of output-file pointer in ncurses library.
+	+ uncomment CC_SHARED_OPTS (see 971115), since they are needed for SCO
+	  OpenServer.
+	+ correct CC_SHARED_OPTS for building shared libraries for SCO
+	  OpenServer.
+	+ remove usleep() from alternatives in napms(), since it may interact
+	  with alarm(), causing a process to be interrupted by SIGALRM (with
+	  advice from Bela Lubkin).
+	+ modify terminal_interface-curses-forms.ads.m4 to build/work with
+	  GNAT 3.10 (patch by Juergen Pfeifer).
+	+ remove part of CF_GPP_LIBRARY configure-script macro, which did not
+	  work with gcc 2.7.2.3
+	+ minor fix to test/tclock.c to avoid beeping more than once per second
+	+ add 's' and ' ' decoding to test/rain.c
+
+991016	pre-release
+	+ corrected BeOS code for lib_twait.c, making nodelay() function work.
+
+991009	pre-release
+	+ correct ncurses' value for cursor-column in PutCharLR(), which was
+	  off-by-one in one case (patch by Ilya Zakharevich).
+	+ fix some minor errors in position_check() debugging code, found while
+	  using this to validate the PutCharLR() patch.
+	+ modify firework, lrtest, worm examples to be resizable, and to
+	  recognize 'q' for quit, 's' for single-step and ' ' for resume.
+	+ restore reverted change to  terminal_interface-curses-forms.ads.m4,
+	  add a note on building with gnat 3.10p to Ada95/TODO.
+	+ add a copy of the standalone configure script for the test-directory
+	  to simplify testing on SCO and Solaris.
+
+991002	pre-release
+	+ minor fixes for _nc_msec_cost(), color_content(), pair_content(),
+	  _nc_freewin(), ClrBottom() and onscreen_mvcur() (analysis by Philippe
+	  Blain, comments by Alexander V Lukyanov).
+	+ simplify definition of PANEL and eliminate internal functions
+	  _nc_calculate_obscure(), _nc_free_obscure() and _nc_override(),
+	  (patch by Juergen Pfeifer, analysis by Philippe Blain
+	  <bledp@voila.fr>)).
+	+ change renaming of dft_fgbg.3x to use_default_colors.3ncurses in
+	  man_db.renames, since Debian is not concerned with 14-character
+	  filename limitation (Debian bug report by Josip Rodin
+	  <joy@cibalia.gkvk.hr>).
+	+ corrected scoansi terminfo entry by testing with scoterm and console.
+	+ revert change from 990614 to terminal_interface-curses-forms.ads.m4,
+	  since this does not work for gnat 3.10p
+	+ modify tclock example to be resizable (if ncurses' sigwinch handler
+	  is used), and in color.
+	+ use $(CC) rather than 'gcc' in MK_SHARED_LIB symbols, used for Linux
+	  shared library rules.
+
+990925	pre-release
+	+ add newer NetBSD console terminfo entries
+	+ add amiga-8bit terminfo entry (from Henning 'Faroul' Peters
+	  <Faroul@beyond.kn-bremen.de>)
+	+ remove -lcurses -ltermcap from configure script's check for the gpm
+	  library, since they are not really necessary (a properly configured
+	  gpm library has no dependency on any curses library), and if the
+	  curses library is not installed, this would cause the test to fail.
+	+ modify tic's -C option so that terminfo "use=" clauses are translated
+	  to "tc=" clauses even when running it as captoinfo.
+	+ modify CF_STDCPP_LIBRARY configure macro to perform its check only
+	  for GNU C++, since that library conflicts with SGI's libC on IRIX-6.2
+	+ modify CF_SHARED_OPTS configure macro to support build on NetBSD with
+	  ELF libraries (patch by Bernd Ernesti <bernd@arresum.inka.de>).
+	+ correct a problem in libpanel, where the _nc_top_panel variable was
+	  not set properly when bottom_panel() is called to hide a panel which
+	  is the only one on the stack (report/analysis by Michael Andres
+	  <ma@suse.de>, patch by Juergen Pfeifer).
+
+990918	pre-release
+	+ add acsc string to HP 70092 terminfo entry (patch by Joerg Wunsch
+	  <j@interface-business.de>).
+	+ add top-level uninstall.data and uninstall.man makefile rules.
+	+ correct logic of CF_LINK_FUNCS configure script, from BeOS changes so
+	  that hard-links work on Unix again.
+	+ change default value of cf_cv_builtin_bool to 1 (suggested by
+	  Jeremy Buhler), making it less likely that a conflicting declaration
+	  of bool will be seen when compiling with C++.
+
+990911	pre-release
+	+ improved configure checks for builtin.h
+	+ minor changes to C++ binding (remove static initializations, and make
+	  configure-test for parameter initializations) for features not
+	  allowed by vendor's C++ compilers (reported by Martin Mokrejs, this
+	  applies to SGI, though I found SCO has the same characteristics).
+	+ corrected quoting of ETIP_xxx definitions which support old versions
+	  of g++, e.g., those using -lg++
+	+ remove 'L' code from safe_sprintf.c, since 'long double' is not
+	  widely portable.  safe_sprintf.c is experimental, however, and
+	  exists mainly as a fallback for systems without snprintf (reported
+	  by Martin Mokrejs <mmokrejs@natur.cuni.cz>, for IRIX 6.2)
+	+ modify definition of _nc_tinfo_fkeys in broken-linker configuration
+	  so that it is not unnecessarily made extern (Jeffrey C Honig).
+
+990904	pre-release
+	+ move definition for builtin.h in configure tests to specific check
+	  for libg++, since qt uses the same filename incompatibly.
+	+ correct logic of lib_termcap.c tgetstr function, which did not copy
+	  the result to the buffer parameter.  Testing shows Solaris does
+	  update this, though of course tgetent's buffer is untouched (reported
+	  in Peter Edwards <peter.edwards@ireland.com> in
+	  mpc.lists.freebsd.current newsgroup.
+	+ corrected beterm terminfo entry, which lists some capabilities which
+	  are not actually provided by the BeOS Terminal.
+	+ add special logic to replace select() calls on BeOS, whose select()
+	  function works only for sockets.
+	+ correct missing escape in mkterm.h.awk.in, which caused part
+	  of the copyright noticed to be omitted (reported by Peter
+	  Wemm <peter@netplex.com.au>).
+	> several small changes to make the c++ binding and demo work on OS/2
+	  EMX (related to a clean reinstall of EMX):
+	+ correct library-prefix for c++ binding; none is needed.
+	+ add $x suffix to make_hash and make_keys so 'make distclean' works.
+	+ correct missing $x suffix for tack, c++ demo executables.
+	+ split CF_CXX_LIBRARY into CF_GPP_LIBRARY (for -lg++) and
+	  CF_STDCPP_LIBRARY (for -lstdc++)
+
+990828	pre-release
+	+ add cygwin terminfo entry -TD
+	+ modify CF_PROG_EXT configure macro to set .exe extension for cygwin.
+	+ add configure option --without-cxx-binding, modifying the existing
+	  --without-cxx option to check only for the C++ compiler
+	  characteristics.  Whether or not the C++ binding is needed, the
+	  configure script checks for the size/type of bool, to make ncurses
+	  match.  Otherwise C++ applications cannot use ncurses.
+
+990821	pre-release
+	+ updated configure macros CF_MAKEFLAGS, CF_CHECK_ERRNO
+	+ minor corrections to beterm terminfo entry.
+	+ modify lib_setup.c to reject values of $TERM which have a '/' in
+	  them.
+	+ add ifdef's to guard against CS5, CS6, CS7, CS8 being zero, as more
+	  than one is on BeOS.  That would break a switch statement.
+	+ add configure macro CF_LINK_FUNCS to detect and work around BeOS's
+	  nonfunctional link().
+	+ improved configure macros CF_BOOL_DECL and CF_BOOL_SIZE to detect
+	  BeOS's bool, which is declared as an unsigned char.
+
+990814	pre-release
+	+ add ms-vt100 terminfo entry -TD
+	+ minor fixes for misc/emx.src, based on testing with tack.
+	+ minor fix for test/ncurses.c, test 'a', in case ncv is not set.
+
+990731	pre-release
+	+ minor correction for 'screen' terminfo entry.
+	+ clarify description of errret values for setupterm in manpage.
+	+ modify tput to allow it to emit capabilities for hardcopy terminals
+	  (patch by Goran Uddeborg <goeran@uddeborg.pp.se>).
+	+ modify the 'o' (panel) test in ncurses.c to show the panels in color
+	  or at least in bold, to test Juergen's change to wrefresh().
+	> patches by Juergen Pfeifer:
+	+ Fixes a problem using wbkgdset() with panels.  It has actually
+	  nothing to with panels but is a problem in the implementation of
+	  wrefresh().  Whenever a window changes its background attribute to
+	  something different than newscr's background attribute, the whole
+	  window is touched to force a copy to newscr.  This is an unwanted
+	  side-effect of wrefresh() and it is actually not necessary.  A
+	  changed background attribute affects only further outputs of
+	  background it doesn't mean anything to the current content of the
+	  window.  So there is no need to force a copy.  (reported by Frank
+	  Heckenbach <frank@g-n-u.de>).
+	+ an upward compatible enhancement of the NCursesPad class in the C++
+	  binding.  It allows one to add a "viewport" window to a pad and then
+	  to use panning to view the pad through the viewport window.
+
+990724	pre-release
+	+ suppress a call to def_prog_mode() in the SIGTSTP handler if the
+	  signal was received while not in curses mode, e.g., endwin() was
+	  called in preparation for spawning a shell command (reported by Frank
+	  Heckenbach <frank@g-n-u.de>)
+	+ corrected/enhanced xterm-r5, xterm+sl, xterm+sl-twm terminfo entries.
+	+ change test for xterm mouse capability:  it now checks only if the
+	  user's $DISPLAY variable is set in conjunction with the kmous
+	  capability being present in the terminfo.  Before, it checked if any
+	  of "xterm", "rxvt" or "kterm" were substrings of the terminal name.
+	  However, some emulators which are incompatible with xterm in other
+	  ways do support the xterm mouse capability.
+	+ reviewed and made minor changes in ncurses to quiet g++ warnings
+	  about shadowed or uninitialized variables.  g++ incorrectly warns
+	  about uninitialized variables because it does not take into account
+	  short-circuit expression evaluation.
+	+ change ncurses 'b' test to start in color pair 0 and to show in the
+	  right margin those attributes which are suppressed by no_color_video,
+	  i.e., "(NCV)".
+	+ modify ifdef's in curses.h so that __attribute__ is not redefined
+	  when compiling with g++, but instead disabled the macros derived for
+	  __attribute__ since g++ does not consistently recognize the same
+	  keywords as gcc (reported by Stephan K Zitz <zitz@erf.net>).
+	+ update dependencies for term.h in ncurses/modules (reported by
+	  Ilya Zakharevich).
+
+990710	pre-release
+	+ modify the form demo in ncurses.c to illustrate how to manipulate the
+	  field appearance, e.g, for highlighting or translating the field
+	  contents.
+	+ correct logic in write_entry from split-out of home_terminfo in
+	  980919, which prevented update of $HOME/.terminfo (reported by Philip
+	  Spencer <pspencer@fields.utoronto.ca>).
+
+990703	pre-release
+	+ modify linux terminfo description to make use of kernel 2.2.x mods
+	  that support cursor style, e.g., to implement cvvis (patch by Frank
+	  Heckenbach <frank@g-n-u.de>)
+	+ add special-case in setupterm to retain previously-saved terminal
+	  settings in cur_term, which happens when curses and termcap calls are
+	  mixed (from report by Bjorn Helgaas <helgaas@dhc.net>).
+	+ suppress initialization of key-tries in _nc_keypad() if we are only
+	  disabling keypad mode, e.g., in endwin() called when keypad() was
+	  not.
+	+ modify the Ada95 makefile to ensure that always the Ada files from
+	  the development tree are used for building and not the eventually
+	  installed ones (patch by Juergen Pfeifer).
+
+990626	pre-release
+	+ use TTY definition in tack/sysdep.c rather than struct termios
+	  (reported by Philippe De Muyter).
+	+ add a fallback for strstr, used in lib_mvcur.c and tack/edit.c,
+	  not present on sysV68 (reported by Philippe De Muyter).
+	+ correct definition in comp_hash.c to build with configure
+	  --with-rcs-ids option.
+
+990619	pre-release
+	+ modified ifdef's for sigaction and sigvec to ensure we do not try to
+	  handle SIGTSTP if neither is available (from report by Philippe De
+	  Muyter).
+	> patch by Philippe De Muyter:
+	+ in tic.c, use `unlink' if `remove' is not available.
+	+ use only `unsigned' as fallback value for `speed_t'.  Some files used
+	  `short' instead.
+
+990616	pre-release
+	+ fix some compiler warnings in tack.
+	+ add a check for predefined bool type in CC, based on report that
+	  BeOS predefines a bool type.
+	+ correct logic for infocmp -e option, i.e., the configure
+	  --with-fallbacks option, which I'd not updated when implementing
+	  extended names (cf:  990301).  The new implementation adds a "-E"
+	  option to infocmp -TD
+	> patch by Juergen Pfeifer:
+	+ introduce the private type Curses_Bool in the Ada95 binding
+	  implementation.  This is to clearly represent the use of "bool" also
+	  in the binding.  It should have no effect on the generated code.
+	+ improve the man page for field_buffer() to tell the people, that the
+	  whole buffer including leading/trailing spaces is returned.  This is
+	  a common source of confusion, so it's better to document it clearly.
+
+990614	pre-release
+	> patch by Juergen Pfeifer:
+	+ use pragma PreElaborate in several places.
+	+ change a few System.Address uses to more specific types.
+	+ change interface version-number to 1.0
+	+ regenerate Ada95 HTML files.
+
+990612	pre-release
+	+ modify lib_endwin.c to avoid calling reset_shell_mode(), return ERR
+	  if it appears that curses was never initialized, e.g., by initscr().
+	  For instance, this guards against setting the terminal modes to
+	  strange values if endwin() is called after setupterm().  In the same
+	  context, Solaris curses will dump core.
+	+ modify logic that avoids a conflict in lib_vidattr.c between sgr0 and
+	  equivalent values in rmso or rmul by ensuring we do not modify the
+	  data which would be returned by the terminfo or termcap interfaces
+	  (reported by Brad Pepers <brad@linuxcanada.com>, cf:  960706).
+	+ add a null-pointer check for SP in lib_vidattr.c to logic that checks
+	  for magic cookies.
+	+ improve fallback declaration of 'bool' when the --without-cxx option
+	  is given, by using a 'char' on i386 and related hosts (prompted by
+	  discussion with Alexander V Lukyanov).
+
+990605	pre-release
+	+ include time.h in lib_napms.c if nanosleep is used (patch by
+	  R Lindsay Todd <toddr@rpi.edu>).
+	+ add an "#undef bool" to curses.h, in case someone tries to define it,
+	  e.g., perl.
+	+ add check to tparm to guard against divide by zero (reported by Aaron
+	  Campbell <aaron@ug.cs.dal.ca>).
+
+990516	pre-release
+	+ minor fix to build tack on CLIX (mismatched const).
+	> patch by Juergen Pfeifer:
+	+ change Juergen's old email address with new one in the files where it
+	  is referenced.  The Ada95 HTML pages are regenerated.
+	+ update MANIFEST to list the tack files.
+
+990509	pre-release
+	+ minor fixes to make 'tack' build/link on NeXT (reported by Francisco
+	  A. Tomei Torres).
+
+990417	pre-release
+	+ add 'tack' program (which is GPL'd), updating it to work with the
+	  modified TERMTYPE struct and making a fix to support setaf/setab
+	  capabilities.  Note that the tack program is not part of the
+	  ncurses libraries, but an application which can be distributed with
+	  ncurses.  The configure script will ignore the directory if it is
+	  omitted, however.
+	+ modify gpm mouse support so that buttons 2 and 3 are used for
+	  select/paste only when shift key is pressed, making them available
+	  for use by an application (patch by Klaus Weide).
+	+ add complete list of function keys to scoansi terminfo entry - TD
+
+990410	pre-release
+	+ add a simple test program cardfile.c to illustrate how to read form
+	  fields, and showing forms within panels.
+	+ change shared-library versioning for the Hurd to be like Linux rather
+	  than *BSD (patch by Mark Kettenis <kettenis@wins.uva.nl>).
+	+ add linux-lat terminfo entry.
+	+ back-out _nc_access check in read_termcap.c (both incorrect and
+	  unnecessary, except to guard against a small window where the file's
+	  ownership may change).
+
+990403	pre-release
+	+ remove conflicting _nc_free_termtype() function from test module
+	  lib_freeall.c
+	+ use _nc_access check in read_termcap.c for termpaths[] array (noted
+	  by Jeremy Buhler, indicating that Alan Cox made a similar patch).
+	> patch by Juergen Pfeifer:
+	+ modify menu creation to not inherit status flag from the default menu
+	  which says that the associated marker string has been allocated and
+	  should be freed (bug reported by Marek Paliwoda"
+	  <paliwoda@kki.net.pl>)
+
+990327	pre-release (alpha.gnu.org:/gnu/ncurses-5.0-beta1.tar.gz)
+	+ minor fixes to xterm-xfree86 terminfo entry - TD.
+	+ split up an expression in configure script check for ldconfig to
+	  workaround limitation of BSD/OS sh (reported by Jeff Haas
+	  <jmh@mail.msen.com>).
+	+ correct a typo in man/form_hook.3x (Todd C Miller).
+
+990318	pre-release
+	+ parenthesize and undef 'index' symbol in c++ binding and demo, to
+	  accommodate its definition on NeXT (reported by Francisco A. Tomei
+	  Torres).
+	+ add sigismember() to base/sigaction.c compatibility to link on NeXT
+	  (reported by Francisco A. Tomei Torres).
+	+ further refinements to inequality in hashmap.c to cover a case with
+	  ^U in nvi (patch by Alexander V Lukyanov).
+
+990316	pre-release
+	+ add fallback definition for getcwd, to link on NeXT.
+	+ add a copy of cur_term to tic.c to make it link properly on NeXT
+	  (reported by Francisco A. Tomei Torres).
+	+ change inequality in hashmap.c which checks the distance traveled by
+	  a chunk so that ^D command in nvi (scrolls 1/2 screen) will use
+	  scrolling logic (patch by Alexander V Lukyanov, reported by Jeffrey
+	  C Honig).
+
+990314	pre-release
+	+ modify lib_color.c to handle a special case where the curscr
+	  attributes have been made obsolete (patch by Alexander V Lukyanov).
+	+ update BSD/OS console terminfo entries to use klone+sgr and
+	  klone+color (patch by Jeffrey C Honig).
+	+ update glibc addon configure script for extended capabilities.
+	+ correct a couple of warnings in the --enable-const configuration.
+	+ make comp_hash build properly with _nc_strdup(), on NeXT (reported by
+	  Francisco A. Tomei Torres <francisco.tomei@cwix.com>).
+
+990313	pre-release
+	+ correct typos in linux-c initc string - TD
+	+ add 'crt' terminfo entry, update xterm-xfree86 entry - TD
+	+ remove a spurious argument to tparm() in lib_sklrefr.c (patch by
+	  Alexander V Lukyanov).
+
+990307	pre-release
+	+ back-out change to wgetch because it causes a problem with ^Z
+	  handling in lynx (reported by Kim DeVaughn).
+
+990306	pre-release
+	+ add -G option to tic and infocmp, to reverse the "-g" option.
+	+ recode functions in name_match.c to avoid use of strncpy, which
+	  caused a 4-fold slowdown in tic (cf: 980530).
+	+ correct a few warnings about sign-extension in recent changes.
+	> patch by Juergen Pfeifer:
+	+ fixes suggested by Jeff Bradbury <jibradbury@lucent.com>:
+	  + improved parameter checking in new_fieldtype().
+	  + fixed a typo in wgetch() timeout handling.
+	  + allow slk_init() to be called per newterm call.  The internal SLK
+	    state is stored in the SCREEN struct after every newterm() and then
+	    reset for the next newterm.
+	  + fix the problem that a slk_refresh() refreshes stdscr if the
+	    terminal has true SLKs.
+	+ update HTML documentation for Ada binding.
+
+990301	pre-release
+	+ remove 'bool' casts from definitions of TRUE/FALSE so that statements
+	  such as "#if TRUE" work.  This was originally done to allow for a C++
+	  compiler which would warn of implicit conversions between enum and
+	  int, but is not needed for g++ (reported by Kim DeVaughn).
+	+ add use_extended_names() function to allow applications to suppress
+	  read of the extended capabilities.
+	+ add configure option --enable-tcap-names to support logic which
+	  allows ncurses' tic to define new (i.e., extended) terminal
+	  capabilities.  This is activated by the tic -x switch.  The infocmp
+	  program automatically shows or compares extended capabilities.
+	  Note:  This changes the Strings and similar arrays in the TERMTYPE
+	  struct so that applications which manipulate it must be recompiled.
+	+ use macros typeMalloc, typeCalloc and typeRealloc consistently
+	  throughout ncurses library.
+	+ add _nc_strdup() to doalloc.c.
+	+ modify define_key() to allow multiple strings to be bound to the
+	  same keycode.
+	+ correct logic error in _nc_remove_string, from 990220.
+	> patch for Ada95 binding (Juergen Pfeifer):
+	+ regenerate some of the html documentation
+	+ minor cleanup in terminal_interface-curses.adb
+
+990220	pre-release
+	+ resolve ambiguity of kend/kll/kslt and khome/kfnd/kich1 strings in
+	  xterm and ncsa terminfo entries by removing the unneeded ones.  Note
+	  that some entries will return kend & khome versus kslt and kfnd, for
+	  PC-style keyboards versus strict vt220 compatibility - TD
+	+ add function keybound(), which returns the definition associated with
+	  a given keycode.
+	+ modify define_key() to undefine the given string when no keycode is
+	  given.
+	+ modify keyok() so it works properly if there is more than one string
+	  defined for a keycode.
+	+ add check to tic to warn about terminfo descriptions that contain
+	  more than one key assigned to the same string.  This is shown only if
+	  the verbose (-v) option is given.  Moved related logic (tic -v) from
+	  comp_parse.c into the tic program.
+	+ add/use _nc_trace_tries() to show the function keys that will be
+	  recognized.
+	+ rename init_acs to _nc_init_acs (request by Alexander V Lukyanov).
+	> patch for Ada95 binding (Juergen Pfeifer):
+	+ remove all the *_adabind.c from ncurses, menu and form projects.
+	  Those little helper routines have all been implemented in Ada and are
+	  no longer required.
+	+ The option handling routines in menu and form have been made more
+	  save.  They now make sure that the unused bits in options are always
+	  zero.
+	+ modify configuration scripts to
+	  + use gnatmake as default compiler name.  This is a safer choice than
+	    gcc, because some GNAT implementations use other names for the
+	    compilerdriver to avoid conflicts.
+	  + use new default installation locations for the Ada files according
+	    to the proposed GNU Ada filesystem standard (for Linux).
+	+ simplify the Makefiles for the Ada binding
+	+ rename ada_include directory to src.
+
+990213
+	+ enable sigwinch handler by default.
+	+ disable logic that allows setbuf to be turned off/on, because some
+	  implementations will overrun the buffer after it has been disabled
+	  once.
+
+990206
+	+ suppress sc/rc capabilities from terminal description if they appear
+	  in smcup/rmcup.  This affects only scrolling optimization, to fix a
+	  problem reported by several people with xterm's alternate screen,
+	  though the problem is more general.
+	> patch for Ada95 binding (Juergen Pfeifer):
+	+ removed all pragma Preelaborate() stuff, because the just released
+	  gnat-3.11p complains on some constructs.
+	+ fixed some upper/lower case notations because gnat-3.11p found
+	  inconsistent use.
+	+ used a new method to generate the HTML documentation of the Ada95
+	  binding.  This invalidates nearly the whole ./Ada95/html subtree.
+	  Nearly all current files in this subtree are removed
+
+990130
+	+ cache last result from _nc_baudrate, for performance (suggested by
+	  Alexander V Lukyanov).
+	+ modify ClrUpdate() function to workaround a problem in nvi, which
+	  uses redrawwin in SIGTSTP handling.  Jeffrey C Honig reported that
+	  ncurses repainted the screen with nulls before resuming normal
+	  operation (patch by Alexander V Lukyanov).
+	+ generalize is_xterm() function a little by letting xterm/rxvt/kterm
+	  be any substring rather than the prefix.
+	+ modify lib_data.c to initialize SP.  Some linkers, e.g., IBM's, will
+	  not link a module if the only symbols exported from the module are
+	  uninitialized ones (patch by Ilya Zakharevich).  Ilya says that he
+	  has seen messages claiming this behavior conforms to the standard.)
+	+ move call on _nc_signal_handler past _nc_initscr, to avoid a small
+	  window where Nttyb hasn't yet been filled (reported by Klaus Weide).
+	+ modify lib_tstp.c to block SIGTTOU when handling SIGTSTP, fixes a
+	  problem where ncurses applications which were run via a shell script
+	  would hang when given a ^Z.  Also, check if the terminal's process
+	  group is consistent, i.e., a shell has not taken ownership of it,
+	  before deciding to save the current terminal settings in the SIGTSTP
+	  handler (patch by Klaus Weide).
+	+ correct spelling of ACS_ names in curs_border.3x (reported by Bob van
+	  der Poel <bvdpoel@kootenay.com>).
+	+ correct a couple of typos in the macros supporting the configure
+	  --with-shlib-version option.
+
+990123
+	+ modify fty_regex.c to compile on HAVE_REGEXPR_H_FUNCS machine (patch
+	  by Kimio Ishii <ishii@csl.sony.co.jp>).
+	+ rename BSDI console terminfo entries:  bsdos to bsdos-pc-nobold, and
+	  bsdos-bold to bsdos-pc (patch by Jeffrey C Honig).
+	+ modify tput to accept termcap names as an alternative to terminfo
+	  names (patch by Jeffrey C Honig).
+	+ correct a typo in term.7 (Todd C Miller).
+	+ add configure --with-shlib-version option to allow installing shared
+	  libraries named according to release or ABI versions.  This
+	  parameterizes some existing logic in the configure script, and is
+	  intended for compatibility upgrades on Digital Unix, which used
+	  versioned libraries in ncurses 4.2, but no longer does (cf:  980425).
+	+ resync configure script against autoconf 2.13 + patches
+	+ minor improvements for teraterm terminfo entry based on the program's
+	  source distribution.
+
+990116
+	+ change default for configure --enable-big-core to assume machines do
+	  have enough memory to resolve terminfo.src in-memory.
+	+ correct name of ncurses library in TEST_ARGS when configuring with
+	  debug library.
+	+ minor fixes to compile ncurses library with broken-linker with g++.
+	+ add --enable-broken-linker configure option, default to environment
+	  variable $BROKEN_LINKER (request by Jeffrey C Honig).
+	+ change key_names[] array to static since it is not part of the curses
+	  interface (reported by Jeffrey C Honig <jch@bsdi.com>).
+
+990110
+	+ add Tera Term terminfo entry - TD
+
+990109
+	+ reviewed/corrected macros in curses.h as per XSI document.
+	+ provide support for termcap PC variable by copying it from terminfo
+	  data and using it as the padding character in tputs (reported by
+	  Alexander V Lukyanov).
+	+ corrected iris-ansi and iris-ansi-ap terminfo entries for kent and
+	  kf9-kf12 capabilities, as well as adding kcbt.
+	+ document the mouse handling mechanism in menu_driver and make a small
+	  change in menu_driver's return codes to provide more consistency
+	  (patch by Juergen Pfeifer).
+	+ add fallback definition for NCURSES_CONST to termcap.h.in (reported
+	  by Uchiyama Yasushi <uch@nop.or.jp>).
+	+ move lib_restart.c to ncurses/base, since it uses curses functions
+	  directly, and therefore cannot be used in libtinfo.so
+	+ rename micro_char_size to micro_col_size, adding #define to retain
+	  old name.
+	+ add set_a_attributes and set_pglen_inch to terminfo structure, as per
+	  XSI and Solaris 2.5.
+	+ minor makefile files to build ncurses test_progs
+	+ update html files in misc directory to reflect changes since 4.2
+
+990102
+	+ disable scroll hints when hashmap is enabled (patch by Alexander
+	  V Lukyanov).
+	+ move logic for tic's verify of -e option versus -I and -C so that the
+	  terminfo data is not processed if we cannot handle -e (reported by
+	  Steven Schwartz <steves@unitrends.com>.
+	+ add test-driver traces to terminfo and termcap functions.
+	+ provide support for termcap ospeed variable by copying it from the
+	  internal cur_term member, and using ospeed as the baudrate reference
+	  for the delay_output and tputs functions.  If an application does not
+	  set ospeed, the library behaves as before, except that _nc_timed_wait
+	  is no longer used, or needed, since ospeed always has a value.  But
+	  the application can modify ospeed to adjust the output of padding
+	  characters (prompted by a bug report for screen 3.7.6 and email from
+	  Michael Schroeder <Michael.Schroeder@informatik.uni-erlangen.de>).
+	+ removed some unused ifdef's as part of Alexander's restructuring.
+	+ reviewed/updated curses.h, term.h against X/Open Curses Issue 4
+	  Version 2.  This includes making some parameters NCURSES_CONST
+	  rather than const, e.g., in termcap.h.
+	+ change linux terminfo entry to use ncv#2, since underline does not
+	  work with color
+
+981226
+	+ miscellaneous corrections for curses.h to match XSI.
+	+ change --enable-no-padding configure option to be normally enabled.
+	+ add section to ncurses manpage for environment variables.
+	+ investigated Debian bug report that pertains to screen 3.7.4/3.7.6
+	  changes, found no sign of problems on Linux (or on SunOS, Solaris)
+	  running screen built with ncurses.
+	+ check if tmp_fp is opened in tic.c before closing it (patch by Pavel
+	  Roskin <pavel_roskin@geocities.com>).
+	+ correct several font specification typos in man-pages.
+
+981220
+	+ correct default value for BUILD_CC (reported by Larry Virden).
+
+981219
+	+ modify _nc_set_writedir() to set a flag in _nc_tic_dir() to prevent
+	  it from changing the terminfo directory after chdir'ing to it.
+	  Otherwise, a relative path in $TERMINFO would confuse tic (prompted
+	  by a Debian bug report).
+	+ correct/update ncsa terminfo entry (report by Larry Virden).
+	+ update xterm-xfree86 terminfo to current (patch 90), smcur/rmcur
+	  changes
+	+ add Mathew Vernon's mach console entries to terminfo.src
+	+ more changes, moving functions, as part of Alexander's restructuring.
+	+ modify configure script for GNU/Hurd share-library support, introduce
+	  BUILD_CC variable for cross compiling (patch by Uchiyama Yasushi
+	  <uch@nop.or.jp>)
+
+981212
+	+ add environment variable NCURSES_NO_SETBUF to allow disabling the
+	  setbuf feature, for testing purposes.
+	+ correct ifdef's for termcap.h versus term.h that suppress redundant
+	  declarations of prototypes (reported by H.J.Lu).
+	+ modify Makefile.os2 to add linker flags which allow multiple copies
+	  of an application to coexist (reported by Ilya Zakharevich).
+	+ update Makefile.glibc and associated configure script so that ncurses
+	  builds as a glibc add-on with the new directory configuration
+	  (reported by H.J.Lu).
+
+981205
+	+ modify gen_reps() function in gen.c to work properly on SunOS
+	  (sparc), which is a left-to-right architecture.
+	+ modify relative_move and tputs to avoid an interaction with the
+	  BSD-style padding.  The relative_move function could produce a string
+	  to replace on the screen which began with a numeric character, which
+	  was then interpreted by tputs as padding.  Now relative_move will not
+	  generate a string with a leading digit in that case (overwrite).
+	  Also, tputs will only interpret padding if the string begins with a
+	  digit; as coded it permitted a string to begin with a decimal point
+	  or asterisk (reported by Larry Virden).
+	> patches by Juergen Pfeifer:
+	+ fix a typo in m_driver.c mouse handling and improves the error
+	  handling.
+	+ fix broken mouse handling in the Ada95 binding
+	+ make the Ada95 sample application menus work with the new menu mouse
+	  support
+	+ improve the mouse handling introduced by Ilya; it now handles menus
+	  with spacing.
+	+ repair a minor bug in the menu_driver code discovered during this
+	  rework.
+	+ add new function wmouse_trafo() to hide implementation details of
+	  _yoffset member of WINDOW struct needed for mouse coordinate
+	  transformation.
+
+981128
+	+ modify Ada95/gen/gen.c to avoid using return-value of sprintf, since
+	  some older implementations (e.g., SunOS 4.x) return the buffer
+	  address rather than its length.
+	> patch by Rick Ohnemus:
+	+ modify demo.cc to get it to compile with newer versions of egcs.
+	+ trim a space that appears at the end of the table preprocessor lines
+	  ('\" t).  This space prevents some versions of man from displaying
+	  the pages - changed to remove all trailing whitespace (TD)
+	+ finally, 'make clean' does not remove panel objects.
+	> patches by Ilya Zakharevich:
+	+ allow remapping of OS/2 mouse buttons using environment variable
+	  MOUSE_BUTTONS_123 with the default value 132.
+	+ add mouse support to ncurses menus.
+
+981121
+	+ modify misc/makedef.cmd to report old-style .def file symbols, and to
+	  generate the .def files sorted by increasing names rather than the
+	  reverse.
+	+ add misc/*.ref which are J.J.G.Ripoll's dll definition files (renamed
+	  from misc/*.old), and updated based on the entrypoint coding he used
+	  for an older version of ncurses.
+	+ add README.emx, to document how to build on OS/2 EMX.
+	+ updates for config.guess, config.sub from Lynx
+	> patches by Ilya Zakharevich:
+	+ minor fixes for mouse handling mode:
+	  a) Do not initialize mouse if the request is to have no mouse;
+	  b) Allow switching of OS/2 VIO mouse on and off.
+	+ modify Makefile.os2 to support alternative means of generating
+	  configure script, by translating Unix script with Perl.
+	> patches by Juergen Pfeifer:
+	+ Updates MANIFEST to reflect changes in source structure
+	+ Eliminates a problem introduced with my last patch for the C++
+	  binding in the panels code.  It removes the update() call done in the
+	  panel destructor.
+	+ Changes in the Ada95 binding to better support systems where
+	  sizeof(chtype)!=sizeof(int) (e.g.  DEC Alpha).
+
+981114
+	+ modify install-script for manpages to skip over .orig and .rej files
+	  (request by Larry Virden).
+	> patches/discussion by Alexander V Lukyanov:
+	+ move base-library sources into ncurses/base and tty (serial terminal)
+	  sources into ncurses/tty, as part of Alexander V Lukyanov's proposed
+	  changes to ncurses library.
+	+ copy _tracemouse() into ncurses.c so that lib_tracemse.c need not
+	  be linked into the normal ncurses library.
+	+ move macro winch to a function, to hide details of struct ldat
+	> patches by Juergen Pfeifer:
+	+ fix a potential compile problem in cursesw.cc
+	+ some Ada95 cosmetics
+	+ fix a gen.c problem when compiling on 64-Bit machines
+	+ fix Ada95/gen/Makefile.in "-L" linker switch
+	+ modify Ada95 makefiles to use the INSTALL_PREFIX setting.
+
+981107
+	+ ifdef'd out lib_freeall.c when not configured.
+	+ rename _tracebits() to _nc_tracebits().
+	+ move terminfo-library sources into ncurses/tinfo, and trace-support
+	  functions into ncurses/trace as part of Alexander V Lukyanov's
+	  proposed changes to ncurses library.
+	+ modify generated term.h to always specify its own definitions for
+	  HAVE_TERMIOS_H, etc., to guard against inclusion by programs with
+	  broken configure scripts.
+
+981031
+	+ modify terminfo parsing to accept octal and hexadecimal constants,
+	  like Solaris.
+	+ remove an autoconf 2.10 artifact from the configure script's check
+	  for "-g" compiler options.  (Though harmless, this confused someone
+	  at Debian, who recently issued a patch that results in the opposite
+	  effect).
+	+ add configure option --with-ada-compiler to accommodate installations
+	  that do not use gcc as the driver for GNAT (patch by Juergen
+	  Pfeifer).
+
+981017
+	+ ensure ./man exists in configure script, needed when configuring
+	  with --srcdir option.
+	+ modify infocmp "-r" option to remove limit on formatted termcap
+	  output, which makes it more like Solaris' version.
+	+ modify captoinfo to treat no-argument case more like Solaris'
+	  version, which uses the contents of $TERMCAP as the entry to format.
+	+ modify mk-2nd.awk to handle subdirectories, e.g., ncurses/tty
+	  (patch by Alexander V Lukyanov).
+
+981010
+	+ modify --with-terminfo-dirs option so that the default value is the
+	  ${datadir} value, unless $TERMINFO_DIRS is already set.  This gets
+	  rid of a hardcoded list of candidate directories in the configure
+	  script.
+	+ add some error-checking to _nc_read_file_entry() to ensure that
+	  strings are properly terminated (Todd C Miller).
+	+ rename manpage file curs_scr_dmp.3x to curs_scr_dump.3x, to
+	  correspond with contents (reported by Neil Zanella
+	  <nzanella@cs.mun.ca>).
+	+ remove redundant configure check for C++ which did not work when $CXX
+	  was specified with a full pathname (reported by Andreas Jaeger).
+	+ corrected bcopy/memmove check; the macro was not standalone.
+
+981003
+	+ remove unnecessary portion of OS/2 EMX mouse change from
+	  check_pending() (reported by Alexander V Lukyanov).
+
+980926
+	+ implement mouse support for OS/2 EMX (adapted from patch against
+	  4.2(?) by Ilya Zakharevich).
+	+ add configure-check for bcopy/memmove, for 980919 changes to hashmap.
+	+ merge Data General terminfo from Hasufin <hasufin@vidnet.net> - TD
+	+ merge AIX 3.2.5 terminfo descriptions for IBM terminals, replaces
+	  some older entries - TD
+	+ modify tic to compile into %'char' form in preference to %{number},
+	  since that is a little more efficient.
+	+ minor correction to infocmp to avoid displaying "difference" between
+	  two capabilities that are rendered in equivalent forms.
+	+ add "-g" option to tic/infocmp to force character constants to be
+	  displayed in quoted form.  Otherwise their decimal values are shown.
+	+ modify setupterm so that cancelled strings are treated the same as
+	  absent strings, cancelled and absent booleans false (does not affect
+	  tic, infocmp).
+	+ modify tic, infocmp to discard redundant i3, r3 strings when output
+	  to termcap format.
+	> patch by Alexander V Lukyanov:
+	+ improve performance of tparm, now it takes 19% instead of 25% when
+	  profiling worm.
+	+ rename maxlen/minlen to prec/width for better readability.
+	+ use format string for printing strings.
+	+ use len argument correctly in save_text, and pass it to save_number.
+
+980919
+	+ make test_progs compile (but hashmap does not function).
+	+ correct NC_BUFFERED macro, used in lib_mvcur test-driver, modify
+	  associated logic to avoid freeing the SP->_setbuf data.
+	+ add modules home_terminfo and getenv_num to libtinfo.
+	+ move write_entry to libtinfo, to work with termcap caching.
+	+ minor fixes to blue.c to build with atac.
+	+ remove softscroll.c module; no longer needed for testing.
+	> patches by Todd C Miller:
+	+ use strtol(3) instead of atoi(3) when parsing env variables so we can
+	  detect a bogus (non-numeric) value.
+	+ check for terminal names > MAX_NAME_SIZE in a few more places when
+	  dealing with env variables again.
+	+ fix a MAX_NAME_SIZE that should be MAX_NAME_SIZE+1
+	+ use sizeof instead of strlen(3) on PRIVATE_INFO since it is a fixed
+	  string #define (compile time vs runtime).
+	+ when setting errno to ENOMEM, set it right before the return, not
+	  before code that could, possibly, set errno to a different value.
+	> patches by Alexander V Lukyanov:
+	+ use default background in update_cost_from_blank()
+	+ disable scroll-hints when hashmap is configured.
+	+ improve integration of hashmap scrolling code, by adding oldhash and
+	  newhash data to SP struct.
+	+ invoke del_curterm from delscreen.
+	+ modify del_curterm to set cur_term to null if it matches the
+	  function's parameter which is deleted.
+	+ modify lib_doupdate to prefer parm_ich to the enter_insert_mode and
+	  exit_insert_mode combination, adjusting InsCharCost to check
+	  enter_insert_mode, exit_insert_mode and insert_padding.  Add
+	  insert_padding in insert mode after each char.  This adds new costs
+	  to the SP struct.
+
+980912
+	+ modify test-driver in lib_mvcur.s to use _nc_setbuffer, for
+	  consistent treatment.
+	+ modify ncurses to restore output to unbuffered on endwin, and resume
+	  buffering in refresh (see lib_set_term.c and NC_BUFFERED macro).
+	+ corrected HTML version numbers (according to the W3C validator, they
+	  never were HTML 2.0-compliant, but are acceptable 3.0).
+
+980905
+	+ modify MKterminfo.sh to generate terminfo.5 with tables sorted by
+	  capability name, as in SVr4.
+	+ modified term.h, termcap.h headers to avoid redundant declarations.
+	+ change 'u_int' type in tset.c to unsigned, making this compile on
+	  Sequent PRX 4.1 (reported by Michael Sterrett <msterret@coat.com>).
+
+980829
+	+ corrections to mailing addresses, and moving the magic line that
+	  causes the man program to invoke tbl to the first line of each
+	  manpage (patch by Rick Ohnemus <rick@ecompcon.com>).
+	+ add Makefile.os2 and supporting scripts to generate dll's on OS/2 EMX
+	  (from J.J.G.Ripoll, with further integration by TD).
+	+ correct a typo in icl6404 terminfo entry.
+	+ add xtermm and xtermc terminfo entries.
+	> from esr's terminfo version:
+	+ Added Francesco Potorti's tuned Wyse 99 entries.
+	+ dtterm enacs (from Alexander V Lukyanov).
+	+ Add ncsa-ns, ncsa-m-ns and ncsa-m entries from esr version.
+
+980822
+	+ document AT&T acs characters in terminfo.5 manpage.
+	+ use EMX _scrsize() function if terminfo and environment do not
+	  declare the screen size (reported by Ilya Zakharevich
+	  <ilya@math.ohio-state.edu>).
+	+ remove spurious '\' characters from eterm and osborne terminfo
+	  entries (prompted by an old Debian bug report).
+	+ correct reversed malloc/realloc calls in _nc_doalloc (reported by
+	  Hans-Joachim Widmaier <hjwidmai@foxboro.com>).
+	+ correct misplaced parenthesis which caused file-descriptor from
+	  opening termcap to be lost, from 980725 changes (reported by Andreas
+	  Jaeger).
+
+980815
+	+ modify lib_setup.c to eliminate unneeded include of <sys/ioctl.h>
+	  when termios is not used (patch by Todd C Miller).
+	+ add function _nc_doalloc, to ensure that failed realloc calls do not
+	  leak memory (reported by Todd C Miller).
+	+ improved ncsa-telnet terminfo entry.
+
+980809
+	+ correct missing braces around a trace statement in read_entry.c,
+	  from 980808 (reported by Kim DeVaughn <kimdv@best.com> and Liviu
+	  Daia).
+
+980808
+	+ fix missing include <errno.h> in ditto.c (reported by Bernhard
+	  Rosenkraenzer <bero@k5.sucks.eu.org>)
+	+ add NCSA telnet terminfo entries from Francesco Potorti
+	  <F.Potorti@cnuce.cnr.it>, from Debian bug reports.
+	+ make handling of $LINES and $COLUMNS variables more compatible with
+	  Solaris by allowing them to individually override the window size
+	  as obtained via ioctl.
+
+980801
+	+ modify lib_vidattr.c to allow for terminal types (e.g., xterm-color)
+	  which may reset all attributes in the 'op' capability, so that colors
+	  are set before turning on bold and other attributes, but still after
+	  turning attributes off.
+	+ add 'ditto.c' to test directory to illustrate use of newterm for
+	  initializing multiple screens.
+	+ modify _nc_write_entry() to recover from failed attempt to link alias
+	  for a terminfo on a filesystem which does not preserve character case
+	  (reported by Peter L Jordan <PJordan@chla.usc.edu>).
+
+980725
+	+ updated versions of config.guess and config.sub based on automake 1.3
+	+ change name-comparisons in lib_termcap to compare no more than 2
+	  characters (gleaned from Debian distribution of 1.9.9g-8.8, verified
+	  with Solaris curses).
+	+ fix typo in curs_insstr.3x (patch by Todd C Miller)
+	+ use 'access()' to check if ncurses library should be permitted to
+	  open or modify files with fopen/open/link/unlink/remove calls, in
+	  case the calling application is running in setuid mode (request by
+	  Cristian Gafton <gafton@redhat.com>, responding to Duncan Simpson
+	  <dps@io.stargate.co.uk>).
+	+ arm100 terminfo entries from Dave Millen <dmill@globalnet.co.uk>).
+	+ qnxt2 and minitel terminfo entries from esr's version.
+
+980718
+	+ use -R option with ldconfig on FreeBSD because otherwise it resets
+	  the search path to /usr/lib (reported by Dan Nelson).
+	+ add -soname option when building shared libraries on OpenBSD 2.x
+	  (request by QingLong).
+	+ add configure options --with-manpage-format and
+	  --with-manpage-renames (request by QingLong).
+	+ correct conversion of CANCELLED_NUMERIC in write_object(), which was
+	  omitting the high-order byte, producing a 254 in the compiled
+	  terminfo.
+	+ modify return-values of tgetflag, tgetnum, tgetstr, tigetflag,
+	  tigetnum and tigetstr to be compatible with Solaris (gleaned from
+	  Debian distribution of 1.9.9g-8.8).
+	+ modify _nc_syserr_abort to abort only when compiled for debugging,
+	  otherwise simply exit with an error.
+
+980711
+	+ modify Ada95 'gen' program to use appropriate library suffix (e.g.,
+	  "_g" for a debug build).
+	+ update Ada95 'make clean' rule to include generics .ali files
+	+ add a configure test to ensure that if GNAT is found, that it can
+	  compile/link working Ada95 program.
+	+ flush output in beep and flash functions, fixing a problem with
+	  getstr (patch by Alexander V Lukyanov)
+	+ fix egcs 1.0.2 warning for etip.h (patch by Chris Johns).
+	+ correct ifdef/brace nesting in lib_sprintf.c (patch by Bernhard
+	  Rosenkraenzer <bero@Pool.Informatik.RWTH-Aachen.DE>).
+	+ correct typo in wattr_get macro from 980509 fixes (patch by Dan
+	  Nelson).
+
+980704
+	+ merge changes from current XFree86 xterm terminfo descriptions.
+	+ add configure option '--without-ada'.
+	+ add a smart-default for termcap 'ac' to terminfo 'acs_chars' which
+	  corresponds to vt100.
+	+ change translation for termcap 'rs' to terminfo 'rs2', which is
+	  the documented equivalent, rather than 'rs1'.
+
+980627
+	+ slow 'worm' down a little, for very fast machines.
+	+ corrected firstchar/lastchar computation in lib_hline.c
+	+ simplify some expressions with CHANGED_CELL, CHANGED_RANGE and
+	  CHANGED_TO_EOL macros.
+	+ modify init_pair so that if a color-pair is reinitialized, we will
+	  repaint the areas of the screen whose color changes, like SVr4 curses
+	  (reported by Christian Maurer <maurer@inf.fu-berlin.de>).
+	+ modify getsyx/setsyx macros to comply with SVr4 man-page which
+	  says that leaveok() affects their behavior (report by Darryl Miles,
+	  patch by Alexander V Lukyanov).
+
+980620
+	+ review terminfo.5 against Solaris 2.6 curses version, corrected
+	  several minor errors/omissions.
+	+ implement tparm %l format.
+	+ implement tparm printf-style width and precision for %s, %d, %x, %o
+	  as per XSI.
+	+ implement tparm dynamic variables (reported by Xiaodan Tang).
+
+980613
+	+ update man-page for for wattr_set, wattr_get (cf:  980509)
+	+ correct limits in hashtest, which would cause nonprinting characters
+	  to be written to large screens.
+	+ correct configure script, when --without-cxx was specified:  the
+	  wrong variable was used for cf_cv_type_of_bool.  Compilers up to gcc
+	  2.8 tolerated the missing 'int'.
+	+ remove the hardcoded name "gcc" for the GNU Ada compiler.  The
+	  compiler's name might be something like "egcs" (patch by Juergen
+	  Pfeifer).
+	+ correct curs_addch.3x, which implied that echochar could directly
+	  display control characters (patch by Alexander V Lukyanov).
+	+ fix typos in ncurses-intro.html (patch by Sidik Isani
+	  <isani@cfht.hawaii.edu>)
+
+980606
+	+ add configure test for conflicting use of exception in math.h and
+	  other headers.
+	+ minor optimization to 'hash()' function in hashmap.c, reduces its
+	  time by 10%.
+	+ correct form of LD_SHARED_OPTS for HP-UX 10.x (patch by Tim Mooney).
+	+ fix missing quotes for 'print' in MKunctrl.awk script (reported by
+	  Mihai Budiu <mihaib@gs41.sp.cs.cmu.edu>).
+	> patch by Alexander V Lukyanov:
+	+ correct problem on Solaris (with poll() function) where getch could
+	  hang indefinitely even if timeout(x) was called.  This turned out to
+	  be because milliseconds was not updated before 'goto retry' in
+	  _nc_timed_wait.
+	+ simplified the function _nc_timed_wait and fixed another bug, which
+	  was the assumption of !GOOD_SELECT && HAVE_GETTIMEOFDAY in *timeleft
+	  assignment.
+	+ removed the cycle on EINTR, as it seems to be useless.
+
+980530
+	+ add makefile-rule for test/keynames
+	+ modify run_tic.sh and shlib to ensure that user's .profile does not
+	  override the $PATH used to run tic (patch by Tim Mooney).
+	+ restore LD_SHARED_OPTS to $(LD_SHARED_FLAGS) when linking programs,
+	  needed for HP-UX shared-library path (recommended by Tim Mooney).
+	+ remove special case of HP-UX -L options, use +b options to embed
+	  $(libdir) in the shared libraries (recommended by Tim Mooney).
+	+ add checks for some possible buffer overflows and unchecked
+	  malloc/realloc/calloc/strdup return values (patch by Todd C Miller
+	  <Todd.Miller@courtesan.com>)
+
+980523
+	+ correct maxx/maxy expression for num_columns/num_lines in derwin
+	  (patch by Alexander V Lukyanov).
+	+ add /usr/share/lib/terminfo and /usr/lib/terminfo as compatibility
+	  fallbacks to _nc_read_entry(), along with --with-terminfo-dirs
+	  configure option (suggested by Mike Hopkirk).
+	+ modify config.guess to recognize Unixware 2.1 and 7 (patch by Mike
+	  Hopkirk <hops@sco.com>).
+	+ suppress definition of CC_SHARED_OPTS in LDFLAGS_SHARED in c++
+	  Makefile.in, since this conflicts when g++ is used with HP-UX
+	  compiler (reported by Tim Mooney).
+	+ parenthesize 'strcpy' calls in c++ binding to workaround redefinition
+	  in some C++ implementations (reported by several people running
+	  egcs with glibc 2.0.93, analysis by Andreas Jaeger.
+
+980516
+	+ modify write_entry.c so that it will not attempt to link aliases
+	  with embedded '/', but give only a warning.
+	+ put -L$(libdir) first when linking programs, except for HP-UX.
+	+ modify comp_scan.c to handle SVr4 terminfo description for att477,
+	  which contains a colon in the description field.
+	+ modify configure script to support SCO osr5.0.5 shared libraries,
+	  from comp.unix.sco.programmer newsgroup item (Mike Hopkirk).
+	+ eliminate extra GoTo call in lib_doupdate.c (patch by Alexander V.
+	  Lukyanov).
+	+ minor adjustments of const/NCURSES_CONST from IRIX compile.
+	+ add updates based on esr's 980509 version of terminfo.src.
+
+980509
+	+ correct macros for wattr_set, wattr_get, separate wattrset macro from
+	  these to preserve behavior that allows attributes to be combined with
+	  color pair numbers.
+	+ add configure option --enable-no-padding, to allow environment
+	  variable $NCURSES_NO_PADDING to eliminate non-mandatory padding,
+	  thereby making terminal emulators (e.g., for vt100) a little more
+	  efficient (request by Daniel Eisenbud <eisenbud@cs.swarthmore.edu>).
+	+ modify configure script to embed ABI in shared libraries for HP-UX
+	  10.x (detailed request by Tim Mooney).
+	+ add test/example of the 'filter()' function.
+	+ add nxterm and xterm-color terminfo description (request by Cristian
+	  Gafton <gafton@redhat.com>).
+	+ modify rxvt terminfo description to clear alternate screen before
+	  switching back to normal screen, for compatibility with applications
+	  which use xterm (reported by Manoj Kasichainula <manojk@io.com>).
+	+ modify linux terminfo description to reset color palette (reported
+	  by Telford Tendys <telford@eng.uts.edu.au>).
+	+ correction to doupdate, for case where terminal does not support
+	  insert/delete character.  The logic did not check that there was a
+	  difference in alignment of changes to old/new screens before
+	  repainting the whole non-blank portion of the line.  Modified to fall
+	  through into logic that reduces by the portion which does not differ
+	  (reported by Daniel Eisenbud <eisenbud@cs.swarthmore.edu>).
+	+ minor performance improvement to wnoutrefresh by moving some
+	  comparisons out of inner loop.
+
+980425
+	+ modify configure script to substitute NCURSES_CONST in curses.h
+	+ updated terminfo entries for xterm-xf86-v40, xterm-16color,
+	  xterm-8bit to correspond to XFree86 3.9Ag.
+	+ remove restriction that forces ncurses to use setaf/setab if the
+	  number of colors is greater than 8.  (see 970524 for xterm-16color).
+	+ change order of -L options (so that $(libdir) is searched first) when
+	  linking tic and other programs, to workaround HP's linker.
+	  Otherwise, the -L../lib is embedded when linking against shared
+	  libraries and the installed program does not run (reported by Ralf
+	  Hildebrandt).
+	+ modify configuration of shared libraries on Digital Unix so that
+	  versioning is embedded in the library, rather than implied by
+	  links (patch by Tim Mooney).
+
+980418
+	+ modify etip.h to avoid conflict with math.h on HP-UX 9.03 with gcc
+	  2.8.1 which redefines 'exception' (reported by Ralf Hildebrandt
+	  <R.Hildebrandt@tu-bs.de>).
+	+ correct configure tests in CF_SHARED_OPTS which used $CC value to
+	  check for gcc, rather than autoconf's $GCC value.  This did not
+	  work properly if the full pathname of the compiler were given
+	  (reported by Michael Yount <yount@csf.Colorado.edu>).
+	+ revise check for compiler options to force ANSI mode since repeating
+	  an option such as -Aa causes HP's compiler to fail on its own headers
+	  (reported by Clint Olsen <olsenc@ichips.intel.com>).
+
+980411
+	+ ifdef'd has_key() and mcprint() as extended functions.
+	+ modified several prototypes to correspond with 1997 version of
+	  X/Open Curses (affects ABI since developers have used attr_get).
+	+ remove spurious trailing blanks in glibc addon-scripts (patch by
+	  H.J.Lu).
+	+ insert a few braces at locations where gcc-2.8.x asks to use them to
+	  avoid ambiguous else's, use -fpic rather than -fPIC for Linux (patch
+	  by Juergen Pfeifer).
+
+980404
+	+ split SHLIB_LIST into SHLIB_DIRS/SHLIB_LIST to keep -L options
+	  before -l to accommodate Solaris' linker (reported by Larry Virden).
+
+980328
+	+ modify lib_color.c to eliminate dependency on orig_colors and
+	  orig_pair, since SVr4 curses does not require these either, but
+	  uses them when they are available.
+	+ add detailed usage-message to infocmp.
+	+ correct a typo in att6386 entry (a "%?" which was "?").
+	+ add -f option to infocmp and tic, which formats the terminfo
+	  if/then/else/endif so that they are readable (with newlines and
+	  tabs).
+	+ fixes for glibc addon scripts (patch by H.J.Lu).
+
+980321
+	+ revise configure macro CF_SPEED_TYPE so that termcap.h has speed_t
+	  declared (from Adam J Richter <adam@yggdrasil.com>)
+	+ remove spurious curs_set() call from leaveok() (J T Conklin).
+	+ corrected handling leaveok() in doupdate() (patch by Alexander V.
+	  Lukyanov).
+	+ improved version of wredrawln (patch by Alexander V. Lukyanov).
+	+ correct c++/Makefile.in so install target do not have embedded ../lib
+	  to confuse it (patch by Thomas Graf <graf@essi.fr>).
+	+ add warning to preinstall rule which checks if the installer would
+	  overwrite a curses.h or termcap.h that is not derived from ncurses.
+	  (The recommended configuration for developers who need both is to
+	  use --disable-overwrite).
+	+ modify preinstall rule in top-level Makefile to avoid implicit
+	  use of 'sh', to accommodate Ultrix 4.4 (reported by Joao Palhoto
+	  Matos <jmatos@math.ist.utl.pt>, patch by Thomas Esser
+	  <te@informatik.uni-hannover.de>)
+	+ refine ifdef's for TRACE so that libncurses has fewer dependencies
+	  on libtinfo when TRACE is disabled.
+	+ modify configure script so that if the --with-termlib option is used
+	  to generate a separate terminfo library, we chain it to the ncurses
+	  library with a "-l" option (reported by Darryl Miles and Ian T.
+	  Zimmerman).
+
+980314
+	+ correct limits and window in wredrawln function (reported/analysis by
+	  Alexander V. Lukyanov).
+	+ correct sed expression in configure script for --with-fallback
+	  option (patch by Jesse Thilo).
+	+ correct some places in configure script where $enableval was used
+	  rather than $withval (patch by Darryl Miles <dlm@g7led.demon.co.uk>).
+	+ modify some man-pages so no '.' or '..' falls between TH and SH
+	  macros, to accommodate man_db program (reported by Ian T. Zimmerman
+	  <itz@rahul.net>).
+	+ terminfo.src 10.2.1 downloaded from ESR's webpage (ESR).
+	> several changes by Juergen Pfeifer:
+	+ add copyright notices (and rcs id's) on remaining man-pages.
+	+ corrected prototypes for slk_* functions, using chtype rather than
+	  attr_t.
+	+ implemented the wcolor_set() and slk_color() functions
+	+ the slk_attr_{set,off,on} functions need an additional void*
+	  parameter according to XSI.
+	+ fix the C++ and Ada95 binding as well as the man pages to
+	  reflect above enhancements.
+
+980307
+	+ use 'stat()' rather than 'access()' in toe.c to check for the
+	  existence of $HOME/.terminfo, since it may be a file.
+	+ suppress configure CF_CXX_LIBRARY check if we are not using g++
+	  2.7.x, since this is not needed with g++ 2.8 or egcs (patch by
+	  Juergen Pfeifer).
+	+ turn on hashmap scrolling code by default, intend to remedy defects
+	  by 4.3 release.
+	+ minor corrections to terminfo.src changelog.
+
+980302	4.2 release for upload to prep.ai.mit.edu
+	+ correct Florian's email address in ncurses-intro.html
+	+ terminfo.src 10.2.0 (ESR).
+
+980228	pre-release
+	+ add linux-koi8r replace linux-koi8, which is not KOI8 (patch by
+	  QingLong <qinglong@Bolizm.ihep.su>).
+	+ minor documentation fixes (patch by Juergen Pfeifer).
+	+ add setlocale() call to ncurses.c (reported by Claes G. Lindblad
+	  <claesg@algonet.se>).
+	+ correct sign-extension in lib_insstr.c (reported by Sotiris
+	  Vassilopoulos <svas@leon.nrcps.ariadne-t.gr>)
+
+980221	pre-release
+	+ regenerated some documentation overlooked in 980214 patch
+	  (ncurses-intro.doc, curs_outopts.3x.html)
+	+ minor ifdef change to C++ binding to work with gcc 2.8.0 (patch by
+	  Juergen Pfeifer).
+	+ change maintainer's mailing address to florian@gnu.org, change
+	  tentative mailing list address to bug-ncurses-request@gnu.org (patch
+	  by Florian La Roche).
+	+ add definition of $(REL_VERSION) to c++/Makefile.in (reported by Gran
+	  Hasse <gh@raditex.se>).
+	+ restore version numbers to Ada95 binding, accidentally deleted by
+	  copyright patch (patch by Juergen Pfeifer).
+
+980214	pre-release
+	+ remove ncurses.lsm from MANIFEST so that it won't be used in FSF
+	  distributions, though it is retained in development.
+	+ correct scaling of milliseconds to nanoseconds in lib_napms.c (patch
+	  by Jeremy Buhler).
+	+ update mailing-list information (bug-ncurses@gnu.org).
+	+ update announcement for upcoming 4.2 release.
+	+ modify -lm test to check for 'sin()' rather than 'floor()'
+	+ remove spurious commas from terminfo.src descriptions.
+	+ change copyright notices to Free Software Foundation
+
+980207
+	+ minor fixes for autoconf macros CF_ERRNO, CF_HELP_MESSAGE and
+	  CF_SIZECHANGE
+	+ modify Makefile.glibc so that $(objpfx) is defined (H.J.Lu).
+	+ ifdef-out true-return from _nc_mouse_inline() which depends on
+	  merge of QNX patch (pending 4.2 release).
+	> patch to split off seldom-used modules in ncurses (J T Conklin):
+	  This reduces size by up to 2.6kb.
+	+ move functionality of _nc_usleep into napms, add configuration case
+	  for nanosleep().
+	+ moved wchgat() from lib_addch.c to lib_chgat.c
+	+ moved clearok(), immedok(), leaveok(), and scrollok() from
+	  lib_options.c to lib_clearok.c, lib_immedok.c, lib_leaveok.c and
+	  lib_scrollok.c.
+	+ moved napms() from lib_kernel.c to lib_napms.c
+	+ moved echo() and noecho() from lib_raw.c to lib_echo.c
+	+ moved nl() and nonl() from lib_raw.c to lib_nl.c
+
+980131
+	+ corrected conversion in tclock.c (cf: 971018).
+	+ updates to Makefile.glibc and associated Linux configure script
+	  (patch by H.J.Lu).
+	+ workaround a quoting problem on SunOS with tar-copy.sh
+	+ correct init_pair() calls in worm.c to work when use_default_colors()
+	  is not available.
+	+ include <sys/types.h> in CF_SYS_TIME_SELECT to work with FreeBSD
+	  2.1.5
+	+ add ncv capability to FreeBSD console (cons25w), making reverse
+	  work with color.
+	+ correct sense of configure-test for sys/time.h inclusion with
+	  sys/select.h
+	+ fixes for Ada95/ada_include/Makefile.in to work with --srcdir option.
+	+ remove unused/obsolete test-program rules from progs/Makefile.in
+	  (the rules in ncurses/Makefile.in work).
+	+ remove shared-library loader flags from test/Makefile.in, etc.
+	+ simplify test/configure.in using new version of autoconf to create
+	  test/ncurses_cfg.h
+	+ suppress suffix rules in test/Makefile.in, provide explicit
+	  dependency to work with --srcdir option and less capable 'make'
+	  programs.
+	> adapted from patch for QNX by Xiaodan Tang:
+	+ initialize %P and %g variables set/used in tparm, and also ensure
+	  that empty strings don't return a null result from tparam_internal
+	+ add QNX-specific prototype for vsscanf()
+	+ move initialization of SP->_keytry from init_keytry() to newterm() to
+	  avoid resetting it via a keyok() call by mouse_activate().
+	+ reorganized some functions in lib_mouse() to use case-statements.
+	+ remove sgr string from qnx terminfo entry since it is reported to
+	  turn off attributes inconsistently.
+
+980124
+	+ add f/F/b/B commands to ncurses 'b' test to toggle colors, providing
+	  test for no_color_video.
+	+ adjusted emx.src to use no_color_video, now works with ncurses 'b'
+	  and 'k' tests.
+	+ implement no_color_video attribute, and as a special case, reverse
+	  colors when the reverse attribute cannot be combined with color.
+	+ check for empty string in $TERM variable (reported by Brett Michaels
+	  <brett@xylan.com>).
+	> from reports by Fred Fish:
+	+ add configure-test for isascii
+	+ add configure-test for -lm library.
+	+ modify CF_BOOL_SIZE to check if C++ bool types are unsigned.
+	> patches by J.J.G.Ripoll
+	+ add configure/makefile variables to support .exe extension on
+	  OS/2 EMX (requires additional autoconf patches).
+	+ explicitly initialize variables in lib_data.c to appease OS/2 linker
+	> patches by Fred Fish <fnf@ninemoons.com>
+	+ misc/Makefile.in (install.data):  Avoid trying to install the CVS
+	  directory.
+	+ aclocal.m4 (install.includes):  Remove files in the include directory
+	  where we are going to install new ones, not the original source
+	  files.
+	+ misc/terminfo.src:  Add entry for "beterm", derived from termcap
+	  distributed with BeOS PR2 using captoinfo.
+	+ aclocal.m4: Wrap $cf_cv_type_of_bool with quotes (contains space)
+	+ aclocal.m4: Assume bool types are unsigned.
+	+ progs/infocmp.c: workaround mwcc 32k function data limit
+
+980117
+	+ correct initialization of color-pair (cf: 970524) in xmas.c, which
+	  was using only one color-pair for all colors (reported by
+	  J.J.G.Ripoll).
+	+ add multithread options for objects build on EMX, for compatibility
+	  with XFree86.
+	+ split up an expression in MKlib_gen.sh to work around a problem on
+	  OS/2 EMX, with 'ash' (patch by J.J.G.Ripoll).
+	+ change terminfo entries xterm (xterm-xf86-v40), xterm-8bit rs1 to use
+	  hard reset.
+	+ rename terminfo entry xterm-xf86-v39t to xterm-xf86-v40
+	+ remove bold/underline from sun console entries since they're not
+	  implemented.
+	+ correct _tracef calls in _tracedump(), which did not separate format
+	  from parameters.
+	+ correct getopt string for tic "-o" option, and add it to man-page
+	  synopsis (reported by Darren Hiebert <darren@hmi.com>).
+	+ correct typo in panel/Makefile.in, reversed if-statement in scrolling
+	  optimization (Alexander V.  Lukyanov).
+	+ test for 'remove()', use 'unlink() if not found (patch by Philippe De
+	  Muyter <phdm@macqel.be>).
+	> patches by Juergen Pfeifer:
+	+ Improve a feature of the forms driver.  For invisible fields
+	  (O_VISIBLE off) only the contents but not the attributes are cleared.
+	  We now clear both.  (Reported by Javier Kohan
+	  <jkohan@adan.fceia.unr.edu.ar>)
+	+ The man page form_field_opts.3x makes now clear, that invisible
+	  fields are also always inactive.
+	+ adjust ifdef's to compile the C++ binding with the just released
+	  gcc-2.8.0 c++ and the corresponding new C++ libraries.
+
+980110
+	+ correct "?" command in ncurses.c; it was performing non-screen writes
+	  while the program was in screen mode.  (It "worked" in 1.9.9e because
+	  that version sets OPOST and OCRNL incorrectly).
+	+ return error from functions in lib_kernel, lib_raw and lib_ti if
+	  cur_term is null, or if underlying I/O fails.
+	+ amend change to tputs() so that it does not return an error if
+	  cur_term is null, since some applications depend on being able to use
+	  tputs without initializing the terminal (reported by Christian J.
+	  Robinson <infynity@cyberhighway.net>).
+
+980103
+	+ add a copy of emx.src from J.J.G.Ripoll's OS/2 EMX version of ncurses
+	  1.9.9e, together with fixes/additions for the "ansi" terminal type.
+	+ add tic check for save/restore cursor if change_scroll_region is
+	  defined (reference: O'Reilly book).
+	+ modify read_termcap.c to handle EMX-style pathnames (reported by
+	  J.J.G.Ripoll).
+	+ modify lib_raw.c to use EMX's setmode (patch from J.J.G.Ripoll).
+	  Ripoll says EMX's curses does this.
+	+ modify _nc_tic_expand() to generate \0 rather than \200.
+	+ move/revise 'expand()' from dump_entry.c to ncurses library as
+	  _nc_tic_expand(), for use by tack.
+	+ decode \a as \007 for terminfo, as per XSI.
+	+ correct translation of terminfo "^@", to \200, like \0.
+	+ modify next_char() to treat <cr><lf> the same as <newline>, for
+	  cross-platform compatibility.
+	+ use new version of autoconf (971230) to work around limited
+	  environment on CLIX, due to the way autoconf builds --help message.
+	> patch by Juergen Pfeifer:
+	+ check that the Ada95 binding runs against the correct version of
+	  ncurses.
+	+ insert constants about the library version into the main spec-file of
+	  the Ada95 binding.
+
+971227
+	+ modify open/fopen calls to use binary mode, needed for EMX.
+	+ modify configure script to work with autoconf 2.10 mods for OS/2
+	  EMX (from J.J.G.Ripoll).
+	+ generated ncurses_cfg.h with patch (971222) to autoconf 2.12 which
+	  bypasses limited sed buffer length.
+	> several changes from Juan Jose Garcia Ripoll <worm@arrakis.es>
+	  (J.J.G.Ripoll) to support OS/2 EMX:
+	+ add a _scrolling flag to SP, to set when we encounter a terminal
+	  that simply cannot scroll.
+	+ corrected logic in _nc_add_to_try(), by ensuring that strings with
+	  embedded \200 characters are matched.
+	+ don't assume the host has 'link()' function, for linking terminfo
+	  entries.
+
+971220
+	+ if there's no ioctl's to support sigwinch handler, disable it.
+	+ add configure option --disable-ext-funcs to remove the extended
+	  functions from the build.
+	+ add configure option --with-termlib to generate the terminfo
+	  functions as a separate library.
+	+ add 'sources' rule to facilitate cross-compiling.
+	+ review/fix order of mostlyclean/clean/distclean rules.
+	+ modify install-rule for headers to first remove old header, in
+	  case there was a symbolic link that confuses the install script.
+	+ corrected substitution for NCURSES_CONST in term.h (cf: 971108)
+	+ add null pointer checks in wnoutrefresh(), overlap() (patch by
+	  Xiaodan Tang <xtang@qnx.com>)
+	+ correct tputs(), which could dereference a null cur_term if invoked
+	  before terminal is initialized (patch by Christopher Seawood
+	  <cls@seawood.org>)
+	> patch by Juergen Pfeifer:
+	+ makes better use of "pragma Inline" in the Ada95 binding
+	+ resynchronizes the generated html manpages
+
+971213
+	+ additional fixes for man-pages section-references
+	+ add (for debugging) a check for ich/ich1 conflict with smir/rmir
+	  to tic, etc.
+	+ remove hpa/vpa from rxvt terminal description because they are not
+	  implemented correctly, added sgr0.
+	+ change ncurses 's' to use raw mode, so ^Q works (reported by Rudolf
+	  Leitgeb <leitgeb@leland.stanford.edu>)
+
+971206
+	+ modify protection when installing libraries to (normally) not
+	  executable.  HP-UX shared libraries are an exception.
+	+ add configure check for 'tack'.
+	+ implement script for renaming section-references in man-page install,
+	  for Debian configuration.
+	+ add validity-check for SP in trace code in baudrate() (reported by
+	  Daniel Weaver).
+	> patch by Alexander V. Lukyanov (fixes to match sol25 curses)
+	+ modify 'overlay()' so that copy applies target window background to
+	  characters.
+	+ correct 'mvwin()' so that it does not clear the previous locations.
+	+ correct lib_acs.c so that 8-bit character is not sign expanded in
+	  case of wide characters in chtype.
+	+ correct control-char test in lib_addch.c for use with wide chars
+	+ use attribute in the chtype when adding a control character in
+	  lib_addch.c control char was added with current attribute
+
+971129
+	+ save/restore errno in _tracef() function
+	+ change treatment of initialize_color to use a range of 0..1000
+	  (recommended by Daniel Weaver).
+	+ set umask in mkinstalldirs, fixing problems reported by users who
+	  have set root's umask to 077.
+	+ correct bug in tic that caused capabilities to be reprinted at the
+	  end of output when they had embedded comments.
+	+ rewrote wredrawln to correspond to XSI, and split-out since it is
+	  not often used (from report by Alexander V. Lukyanov, 970825)
+	+ rewrote Dan Nelson's change to make it portable, as well as to
+	  correct logic for handling backslashes.
+	+ add code to _nc_tgetent() to make it work more like a real tgetent().
+	  It removes all empty fields, and removes all but the first in a group
+	  of duplicate caps.  The code was pulled from the BSD libtermcap code
+	  in termcap.c (patch by Dan Nelson <dnelson@emsphone.com>
+	+ don't include --enable-widec in the --with-develop configure option,
+	  since it is not binary-compatible with 4.1 (noted by Alexander V.
+	  Lukyanov)
+	> patch by Juergen Pfeifer:
+	+ further improvements of the usage of elaboration pragmas in the Ada95
+	  binding
+	+ enhanced Ada95 sample to use the user_data mechanism for panels.
+	+ a fix for the configuration script to make gnat-3.10 the required
+	  version.
+	+ resync of the html version of the manpages
+
+971122
+	> fixes/updates for terminfo.src:
+	+ add vt220-js, pilot, rbcomm, datapoint entries from esr's 27-jun-97
+	  version.
+	+ add hds200 description (Walter Skorski)
+	+ add EMX 0.9b descriptions
+	+ correct rmso/smso capabilities in wy30-mc and wy50-mc (Daniel Weaver)
+	+ rename xhpterm back to hpterm.
+	> patch by Juergen Pfeifer:
+	+ Improves the usage of elaboration pragmas for the Ada95 binding.
+	+ Adds a translation of the test/rain.c into Ada95 to the samples.
+	  This has been contributed to the project by Laurent Pautet
+	  (pautet@gnat.com)
+
+971115
+	+ increase MAX_NAME_SIZE to 512 to handle extremely long alias list
+	  in HP-UX terminfo.
+	+ correction & simplification of delay computation in tputs, based on
+	  comments from Daniel Weaver.
+	+ replace test for SCO with more precise header tests.
+	+ add configure test for unsigned literals, use in NCURSES_BITS macro.
+	+ comment-out the -PIC, etc., flags from c++, progs and test makefiles
+	  since they probably are not needed, and are less efficient (noted by
+	  Juergen Fluk)
+	+ add -L$(libdir) to loader options, after -L../lib so that loaders
+	  that record this information will tend to do the right thing if
+	  the programs are moved around after installing them (suggested by
+	  Juergen Fluk).
+	+ add -R option to loader options for programs for Solaris if the
+	  --enable-rpath option is specified for the libraries.
+
+971112
+	+ correct installed filename for shared libraries on *BSD (reported by
+	  Juergen Fluk).
+
+971108
+	+ cleanup logic for deciding when tputs() should call delay_output(),
+	  based on comments from Daniel Weaver.
+	+ modified tputs() to avoid use of float.
+	+ correct use of trailpad in tputs(), which used the wrong variable
+	  in call to delay_output().
+	+ correct inverted expression for null-count in delay_output()
+	  (analysis by Daniel Weaver).
+	+ apply --enable-rpath option to Solaris (requested by Larry Virden).
+	+ correct substitution of EXTRA_CFLAGS for gcc 2.6.3
+	+ correct check for error-return by _nc_tgetent(), which returns 0
+	  for success.
+	+ add configure test for BSD 4.4 cgetent() function, modify
+	  read_termcap.c to use the host's version of that if found, using the
+	  terminal database on FreeBSD (reported by Peter Wemm).
+	+ add u8, u9 strings to sun-il description for Daniel Weaver.
+	+ use NCURSES_CONST in panel's user-pointer.
+	+ modify edit_cfg.sh and MKterm.h.awk.in to substitute NCURSES_CONST
+	  so that will work on NeXT.
+	+ use _nc_set_screen() rather than assignments to SP to fix port to
+	  NeXT (reported by Francisco A. Tomei Torres).
+
+971101
+	+ force mandatory padding in bell and flash_screen, as specified in
+	  XSI.
+	+ don't allow padding_baud_rate to override mandatory delays (reported
+	  by Daniel Weaver).
+	+ modify delay_output() to use _nc_timed_wait() if no baudrate has been
+	  defined, or if the cur_term pointer is not initialized.  XSI treats
+	  this as unspecified.  (requested by Daniel Weaver).
+	+ change getcap-cache ifdef's to eliminate unnecessary chdir/mkdir
+	  when that feature is not configured.
+	+ remove _nc_err_abort() calls when write_entry.c finds a directory but
+	  cannot write to it, e.g., when translating part/all of /etc/termcap
+	  (reported by Andreas Jaeger <aj@arthur.rhein-neckar.de>).
+	  (this dates back to 951102 in 1.9.7a).
+	+ minor ifdef fixes to compile with atac and glibc 2.0.5c
+	+ add check for -lgen when configuring regexpr.h
+	+ modify Solaris shared-library option "-d y" to "-dy" to workaround
+	  incompatibility of gcc 2.7.2 vs vendor's tools.
+
+971026
+	+ correct ifdef's for struct winsize vs struct ttysize in lib_setup.c
+	  to compile on SCO.
+	+ remove dangling backslash in panel/Makefile.in
+	+ modify MKkeyname.awk to work with SCO's nawk, which dumps core in the
+	  length() function.
+	+ correct length of allocation in _nc_add_to_try(), to allow for
+	  trailing null.
+	+ correct logic in _nc_remove_key(), which was discarding too many
+	  nodes (patch by Alexander V. Lukyanov)
+
+971025
+	+ add definition for $(REL_VERSION) to test/Makefile.in, so *BSD
+	  shared libraries link properly (see 970524).
+	+ modify Linux shared-library generation to include library
+	  dependencies (e.g., -lncurses and -lgpm) in the forms, menu and
+	  panel libraries (suggested by Juergen Pfeifer).
+	+ modify configure script to use config.guess and config.sub rather
+	  than uname, which is unreliable on some systems.
+	+ updated Makefile.glibc, test-built with glibc 2.0.5c
+	+ modify keyname() to return values consistent with SVr4 curses (patch
+	  by Juergen Fluk).
+	> changes requested by Daniel Weaver:
+	+ modify delay_output() so that it uses the same output function as
+	  tputs() if called from that function.
+	+ move _baudrate from SCREEN to TERMINAL so that low-level use of
+	  tputs works when SP is not set.
+	> patch by Juergen Pfeifer:
+	+ factor lib_menu and lib_form into smaller modules
+	+ clean up the interface between panel and SCREEN
+	+ minor changes to the Ada95 mouse support implementation
+	+ minor bugfix in C++ binding to ripoff windows
+	+ fix a few Ada95 html documentation pages
+
+971018
+	+ split-out lib_ungetch.c, make runtime link to resizeterm() to
+	  decouple those modules from lib_restart.c
+	+ add xterm-xf86-v39t description to terminfo.src
+	+ reset SP->_endwin in lib_tstp.c cleanup() function after calling
+	  endwin() to avoid unnecessary repainting if the application has
+	  established an atexit function, etc.  Encountered this problem in
+	  the c++ demo, whose destructors repaint the screen.
+	+ combine _nc_get_screensize() and resizeterm() calls as new function
+	  _nc_update_screensize().
+	+ minor fixes to allow compile with g++ (suggested by Nelson H. F.
+	  Beebe).
+	+ implement install-rules for Ada95 makefiles.
+	+ use screen_lines or MAXLINES as needed where LINES was coded,
+	  as well as screen_columns for COLS, in the ncurses library.
+	> patch by Alexander V. Lukyanov:
+	+ modify logic for ripped-off lines to handle several SCREENs.
+	> patch by Juergen Pfeifer:
+	+ factors lib_slk.c into some smaller modules
+	+ factors panel.c into some smaller modules
+	+ puts the static information about the current panel stack into the
+	  SCREEN structure to allow different panel stacks on different
+	  screens.
+	+ preliminary fix for an error adjusting LINES to account for
+	  ripped-off lines.
+
+971011
+	+ move _nc_max_click_interval and other mouse interface items to SCREEN
+	  struct so that they are associated with a single terminal, and also
+	  save memory when the application does not need a mouse (roughly 3k vs
+	  0.5k on Linux).
+	+ modify mouseinterval() so that a negative parameter queries the
+	  click-interval without modifying it.
+	+ modify ncurses 'i' test to work with ncurses' apparent extension from
+	  SVr4, i.e., allows nocbreak+noecho (analysis by Alexander V.
+	  Lukyanov).
+	+ add configure options --with-ada-includes and --with-ada-objects,
+	  to drive Ada95 binding install (not yet implemented).
+	+ install C++ binding as -lncurses++ and associated headers with the
+	  other ncurses headers.
+	+ fix header uninstall if configure --srcdir is used.
+	> minor interface changes to support 'tack' program -TD
+	  (request by Daniel Weaver <danw@znyx.com>).
+	+ export functions _nc_trans_string() and _nc_msec_cost().
+	+ add variable _nc_nulls_sent, to record the number of padding
+	  characters output in delay_output().
+	+ move tests for generic_type and hard_copy terminals in setupterm()
+	  to the end of that function so that the library will still be
+	  initialized, though not generally useful for curses programs.
+	> patches by Alexander V. Lukyanov:
+	+ modify ClrBottom() to avoid using clr_eos if there is only one line
+	  to erase.
+	+ typo in configure --help.
+	> patch by J T Conklin (with minor resync against Juergen's changes)
+	+ split-out lib_flash.c from lib_beep.c
+	+ split-out lib_hline.c and lib_vline.c from lib_box.c
+	+ split-out lib_wattron.c, lib_wattroff.c from lib_addch.c
+
+971005
+	> patch by Juergen Pfeifer:
+	+ correct source/target of c++/edit_cfg.sh
+
+971004
+	+ add color, mouse support to kterm terminfo entry.
+	+ modify lib_mouse.c to recognize rxvt, kterm, color_xterm also as
+	  providing "xterm"-style mouse.
+	+ updated rxvt's terminfo description to correspond to 2.21b, with
+	  fixes for the acsc (the box1 capability is incorrect, ech1 does not
+	  work).
+	+ fix logic in parse_entry.c that discarded acsc when 'synthesizing'
+	  an entry from equivalents in XENIX or AIX.  This lets ncurses handle
+	  the distribution copy of rxvt's terminfo.
+	+ modify acsc capability for linux and linux-koi8 terminfo descriptions
+	  (from Pavel Roskin <pavel@absolute.spb.su>).
+	+ corrected definition in curses.h for ACS_LANTERN, which was 'I'
+	  rather than 'i' (see 970802).
+	+ updated terminfo.src with reformatted acsc entries, and repaired the
+	  trashed entries with spurious '\' characters that this exposed.
+	+ add logic to dump_entry.c to reformat acsc entries into canonical
+	  form (sorted, unique mapping).
+	+ add configure script to generate c++/etip.h
+	+ add configure --with-develop option, to enable by default most of the
+	  experimental options (requested by Alexander V. Lukyanov).
+	+ rename 'deinstall' to 'uninstall', following GNU convention
+	  (suggested by Alexander V. Lukyanov).
+	> patches by Alexander V. Lukyanov:
+	+ modify tactics 2 and 5 in onscreen_mvcur(), to allow them on the last
+	  line of the screen, since carriage return will not cause a newline.
+	+ remove clause from PutCharLR() that would try to use
+	  eat_newline_glitch since that apparently does not work on some
+	  terminals (e.g., M$ telnet).
+	+ correct a limit check in scroll_csr_backward()
+	> patches by Juergen Pfeifer:
+	+ adds dummy implementations of methods above() and below() to the
+	  NCursesPanel class.
+	+ fixes missing returncode in NCursesWindow::ripoffline()
+	+ fixes missing returncode in TestApplication::run() in demo.cc
+	+ We should at least give a comment in etip.h why it is currently a
+	  problem to install the C++ binding somewhere
+	+ makes the WINDOW* argument of wenclose() a const.
+	+ modifies several of the routines in lib_adabind.c to use a const
+	  WINDOW* argument.
+
+970927
+	+ add 'deinstall' rules.
+	+ use explicit assignments in configure --without-progs option to
+	  work around autoconf bug which doesn't always set $withval.
+	+ check for ldconfig, don't try to run it if not found.
+	+ implement simple/unoptimized case in lib_doupdate.c to handle
+	  display with magic cookie glitch, tested with ncurses.c program.
+	+ correct missing _tracef in getmouse(), to balance the returnCode
+	  macro.
+	+ simplify show_attr() in ncurses.c using termattrs().
+	> patches by Juergen Pfeifer:
+	+ provides missing inlines for mvw[hv]line in cursesw.h of the C++
+	  binding
+	+ fixes a typo in a comment of frm_driver.c
+	+ Enhances Ada95 Makefiles to fulfill the requirement of GNAT-3.10 that
+	  generics should be compiled.  Proper fixes to the configuration
+	  scripts are also provided.
+
+970920
+	+ several modifications to the configure script (requested by Ward
+	  Horner):
+	  + add configure options --without-progs, to suppress the build of the
+	    utility programs, e.g., for cross-compiling.
+	  + add $(HOSTCCFLAGS) and $(HOSTLDFLAGS) symbols to ncurses
+	    Makefile.in, to simplify setup for cross compiling.
+	  + add logic in configure script to recognize "--target=vxworks", and
+	    generate load/install actions for VxWorks objects.
+	+ move typedef for sigaction_t into SigAction.h to work around problem
+	  generating lint library.
+	+ modify fty_regex.c to reflect renaming of ifdef's for regular
+	  expressions.
+	+ simplify ifdef in lib_setup.c for TIOCGWINSZ since that symbol may
+	  reside in <sys/ioctl.h>.
+	+ merge testcurs.c with version from PDCurses 2.3, clarifying some of
+	  the more obscure tests, which rely upon color.
+	+ use macros getbegyx() and getmaxyx() in newdemo.c and testcurs.c
+	+ modify ncurses.c to use getbegyx() and getmaxyx() macros to cover up
+	  implementation difference wrt SVr4 curses, allow 's' test to work.
+	+ add missing endwin() to testscanw.c program (reported by Fausto
+	  Saporito <fausap@itb.it>).
+	+ fixes/updates for Makefile.glibc and related files under sysdeps
+	  (patch by H.J.Lu).
+	> patches by Juergen Pfeifer:
+	+ add checks for null pointers, especially WINDOW's throughout the
+	  ncurses library.
+	+ solve a problem with wrong calculation of panel overlapping (reported
+	  by Ward Horner):
+	  + make sure that a panel's window isn't a pad.
+	  + do more error checking in module lib_touch.c
+	+ missing files for Ada95 binding from the last patch
+	+ synch. of generated html pages (RCS-Id's were wrong in html files)
+	+ support for Key_Resize in Ada binding
+	+ changed documentation style in ./c++/cursesm.h
+	> patches by Alexander V. Lukyanov:
+	+ undo attempt to do recursive inlining for PutChar(), noting that it
+	  did not improve timing measurably, but inflated the size of
+	  lib_doupdate.o
+
+970913
+	+ modify rain.c to use color.
+	+ correct scroll_csr_backward() to match scroll_csr_forward().
+	+ minor adjustment to llib-lncurses, to work with Solaris 2.5.1
+	+ minor fixes to sysdeps/unix/sysv/linux/configure to reflect renaming
+	  of configure cache variables in 970906.
+	+ correct logic involving changes to O_VISIBLE option in
+	  Synchronize_Options function in frm_driver.c (Tony Hoffmann
+	  <Tony.Hoffmann@hia.nrc.ca>)
+	+ add $(HOSTCC) symbol to ncurses Makefile.in, to simplify setup for
+	  cross compiling (suggested by Chris Johns).
+	+ modify ifdef in lib_setup.c to only include <sys/ioctl.h> if we can
+	  use it to support screen-size calculation (reported by Chris Johns).
+	+ #undef unctrl to avoid symbol conflict in port to RTEMS (reported by
+	  Chris Johns <cjohns@plessey.com.au>)
+	> patches by Juergen Pfeifer:
+	+ simplified, made minor corrections to Ada95 binding to form
+	  fieldtype.
+	+ The C++ binding has been enhanced:
+	  + Improve NCursesWindow class:  added additional methods to cover
+	    more ncurses functionality.  Make refresh() and noutrefresh()
+	    virtual members to allow different implementation in the
+	    NCursesPanel class.
+	  + CAUTION:  changed order of parameters in vline() and hline() of
+	    NCursesWindow class.
+	  + Make refresh() in NCursesPanel non-static, it is now a
+	    reimplementation of refresh() in the base class.  Added
+	    noutrefresh() to NCursesPanel.
+	  + Added NCursesForm and related classes to support libform
+	    functionality.
+	  + Moved most of configuration related stuff from cursesw.h to etip.h
+	  + Added NCursesApplication class to support easy configuration of
+	    menu and forms related attributes as well as ripped of title lines
+	    and Soft-Label-Keys for an application.
+	  + Support of Auto-Cleanup for a menu's fieldlist.
+	  + Change of return type for current_item() and operator[] for menus.
+	  + Enhanced demo.
+	+ Fixed a bug in form/fld_def.c:  take into account that copyarg and
+	  freearg for a fieldtype may be NULL, makearg must not be NULL
+	+ Fixed a bug in form/fld_type.c:  in set_fieldtype_arg() makearg must
+	  not be NULL, copyarg and freearg may be NULL.
+	+ Fixed a bug in form/frm_def.c:  Allow Disconnect_Fields() if it is
+	  already disconnected.
+	+ Enhance form/frm_driver.c:  Allow growth of dynamic fields also on
+	  navigation requests.
+	+ Fixed a bug in form/fty_enum.c:  wrong position of postincrement in
+	  case-insensitiva comparison routine.
+	+ Enhanced form/lib_adabind.c with function _nc_get_field() to get a
+	  forms field by index.
+	+ Enhanced menu/m_adabind.c with function _nc_get_item() to get a menus
+	  item by index.
+	+ Fixed in curses.h.in:  make chtype argument for pechochar() constant.
+	  Mark wbkgdset() as implemented, remove wbkgdset macro, because it was
+	  broken (didn't handle colors correctly).
+	+ Enhanced lib_mouse.c: added _nc_has_mouse() function
+	+ Added _nc_has_mouse() prototype to curses.priv.h
+	+ Modified lib_bkgd.c:  hopefully correct implementation of wbkgdset();
+	  streamlined implementation of wbkgd()
+	+ Modified lib_mvwin.c:  Disable move of a pad.  Implement (costly)
+	  move of subwindows.  Fixed update behavior of movements of regular
+	  windows.
+	+ Fixed lib_pad.c:  make chtype argument of pechochar() const.
+	+ Fixed lib_window.c:  dupwin() is not(!) in every bit a really clone
+	  of the original.  Subwindows become regular windows by doing a
+	  dupwin().
+	+ Improved manpage form_fieldtype.3x
+	> patches by Alexander V. Lukyanov:
+	+ simplify the PutChar() handling of exit_am_mode, because we already
+	  know that auto_right_margin is true.
+	+ add a check in PutChar() for ability to insert to the case of
+	  shifting character to LR corner.
+	+ in terminal initialization by _nc_screen_resume(), make sure that
+	  terminal right margin mode is known.
+	+ move logic that invokes touchline(), or does the equivalent, into
+	  _nc_scroll_window().
+	+ modify scrolling logic use of insert/delete line capability, assuming
+	  that they affect the screen contents only within the current
+	  scrolling region.
+	+ modify rain.c to demonstrate SIGWINCH handler.
+	+ remove logic from getch() that would return an ERR if the application
+	  called getch() when the cursor was at the lower-right corner of the
+	  physical screen, and the terminal does not have insert-character
+	  ability.
+	+ change view.c so that it breaks out of getch() loop if a KEY_RESIZE
+	  is read, and modify logic in getch() so this fix will yield the
+	  desired behavior, i.e., the screen is repainted automatically when
+	  the terminal window is resized.
+
+970906
+	+ add configure option --enable-sigwinch
+	+ modify view.c to test KEY_RESIZE logic, with "-r" option.
+	+ modify testcurs.c to eliminate misleading display wrt cursor type
+	  by testing if the terminal supports cnorm, civis, cvvis.
+	+ several fixes for m68k/NeXT 4.0, to bring cur_term, _nc_curr_line and
+	  _nc_curr_col variables into linked programs:  move these variables,
+	  making new modules lib_cur_term and trace_buf (reported by Francisco
+	  Alberto Tomei Torres <fatomei@sandburg.unm.edu>).
+	> patches by Alexander V. Lukyanov:
+	+ add pseudo-functionkey KEY_RESIZE which is returned by getch() when
+	  the SIGWINCH handler has been called since the last call to
+	  doupdate().
+	+ modify lib_twait.c to hide EINTR only if HIDE_EINTR is defined.
+	+ add SIGWINCH handler to ncurses library which is used if there is no
+	  application SIGWINCH handler in effect when the screen is
+	  initialized.
+	+ make linked list of all SCREEN structures.
+	+ move curses.h include before definition of SCREEN to use types in
+	  that structure.
+	+ correction to ensure that wgetstr uses only a newline to force a
+	  scroll (970831).
+
+970831
+	+ add experimental configure option --enable-safe-sprintf; the normal
+	  mode now allocates a buffer as large as the screen for the
+	  lib_printw.c functions.
+	+ modify wgetch to refresh screen when reading ungetch'd characters,
+	  since the application may require this - SVr4 does this.
+	+ refine treatment of newline in wgetstr to echo only when this would
+	  force the screen to scroll.
+
+970830
+	+ remove override in wgetstr() that forces keypad(), since SVr4 does
+	  not do this.
+	+ correct y-reference for erasure in wgetstr() when a wrap forces a
+	  scroll.
+	+ correct x-position in waddch() after a wrap forces a scroll.
+	+ echo newline in wgetstr(), making testscanw.c scroll properly when
+	  scanw is done.
+	+ modify vwscanw() to avoid potential buffer overflow.
+	+ rewrote lib_printw.c to eliminate fixed-buffer limits.
+	> patches by Alexander V. Lukyanov:
+	+ correct an error in handling cooked mode in wgetch(); processing
+	  was in the wrong order.
+	+ simplified logic in wgetch() that handles backspace, etc., by using
+	  wechochar().
+	+ correct wechochar() so that it interprets the output character as
+	  in waddch().
+	+ modify pechochar() to use prefresh() rather than doupdate(), since
+	  the latter does not guarantee immediate refresh of the pad.
+	+ modify pechochar() so that if called with a non-pad WINDOW, will
+	  invoke wechochar() instead.
+	+ modify fifo indices to allow fifo to be longer than 127 bytes.
+
+970823
+	+ add xterm-8bit to terminfo.src
+	+ moved logic for SP->_fifohold inside check_pending() to make it
+	  work properly when we add calls to that function.
+	+ ensure that bool functions return only TRUE or FALSE, and TRUE/FALSE
+	  are assigned to bool values (patch by H.J.Lu).
+	> patches by Alexander V. Lukyanov:
+	+ several fixes to getch:
+	  1.  Separate cooked and raw keys in fifo
+	  2.  Fix the case of ungetch'ed KEY_MOUSE
+	  3.  wrap the code for hiding EINTR with ifdef HIDE_EINTR
+	  4.  correctly handle input errors (i.e., EINTR) without loss of raw
+	      keys
+	  5.  recognize ESC KEY_LEFT and similar
+	  6.  correctly handle the case of reception of KEY_MOUSE from gpm
+	+ correct off-by-one indexing error in _nc_mouse_parse(), that caused
+	  single mouse events (press/release) to be ignored in favor of
+	  composed events (click).  Improves on a fix from integrating gpm
+	  support in 961229.
+	+ add another call to check_pending, before scrolling, for
+	  line-breakout optimization
+	+ improve hashmap.c by
+	  1.  fixed loop condition in grow_hunks()
+	  2.  not marking lines with offset 0
+	  3.  fixed condition of 'too far' criteria, thus one-line hunks are
+	  ignored and two lines interchanged won't pass.
+	+ rewrote/simplified _nc_scroll_optimize() by separating into two
+	  passes, forward/backward, looking for chunks moving only in the given
+	  direction.
+	+ move logic that emits sgr0 when initializing the screen to
+	  _nc_screen_init(), now invoked from newterm.
+	+ move cursor-movement cleanup from endwin() into _nc_mvcur_wrap()
+	  function and screen cleanup (i.e., color) into _nc_screen_wrap()
+	  function.
+	+ add new functions _nc_screen_init(), _nc_screen_resume() and
+	  _nc_screen_wrap().
+	+ rename _nc_mvcur_scrolln() to _nc_scrolln().
+	+ add a copy of acs_map[] to the SCREEN structure, where it can be
+	  stored/retrieved via set_term().
+	+ move variables _nc_idcok, _nc_idlok, _nc_windows into the SCREEN
+	  structure.
+
+970816
+	+ implement experimental _nc_perform_scroll().
+	+ modify newterm (actually _nc_setupscreen()) to emit an sgr0 when
+	  initializing the screen, as does SVr4 (reported by Alexander V.
+	  Lukyanov).
+	+ added test_progs rule to ncurses/Makefile.
+	+ modify test/configure.in to check if initscr is already in $LIBS
+	  before looking for (n)curses library.
+	+ correct version-number in configure script for OSF1 shared-library
+	  options (patch by Tim Mooney).
+	+ add -DNDEBUG to CPPFLAGS for --enable-assertions (as Juergen
+	  originally patched) since the c++ demo files do not necessarily
+	  include ncurses_cfg.h
+	+ supply default value for --enable-assertions option in configure
+	  script (reported by Kriang Lerdsuwanakij <lerdsuwa@scf-fs.usc.edu>).
+	> patches by Alexander V. Lukyanov:
+	+ correct/simplify logic of werase(), wclrtoeol() and wclrbot().  See
+	  example firstlast.c
+	+ optimize waddch_literal() and waddch_nosync() by factoring out
+	  common subexpressions.
+	+ correct sense of NDEBUG ifdef for CHECK_POSITION macro.
+	+ corrections to render_char(), to make handling of colored blanks
+	  match SVr4 curses, as well as to correct a bug that xor'd space
+	  against the background character.
+	+ replaced hash function with a faster one (timed it)
+	+ rewrote the hashmap algorithm to be one-pass, this avoids multiple
+	  cost_effective() calls on the same lines.
+	+ modified cost_effective() so it is now slightly more precise.
+	> patches for glibc integration (H.J.Lu):
+	+ add modules define_key, keyok, name_match, tries
+	+ add makefile rules for some of the unit tests in ncurses (mvcur,
+	  captoinfo, hardscroll, hashmap).
+	+ update Linux configure-script for wide-character definitions.
+
+970809
+	+ modify _tracebits() to show the character size (e.g., CS8).
+	+ modify tparm() to emit '\200' where the generated string would have a
+	  null (reported by From:  Ian Dall <Ian.Dall@dsto.defence.gov.au> for
+	  terminal type ncr7900).
+	+ modify install process so that ldconfig is not invoked if the
+	  package is built with an install-prefix.
+	+ correct test program for chtype size (reported by Tim Mooney).
+	+ add configure option --disable-scroll-hints, using this to ifdef the
+	  logic that computes indices for _nc_scroll_optimize().
+	+ add module ncurses/softscroll.c, to perform single-stage computation
+	  of scroll indices used in _nc_scroll_optimize().  This is faster than
+	  the existing scrolling algorithm, but tends to make too-small hunks.
+	+ eliminate fixed buffer size in _nc_linedump().
+	+ minor fixes to lib_doupdate.c to add tradeoff between clr_eol (el)
+	  and clr_bol (el1), refine logic in ClrUpdate() and ClrBottom() (patch
+	  by Alexander V. Lukyanov).
+	+ add test/testaddch.c, from a pending patch by Alexander V. Lukyanov.
+	+ correct processing of "configure --enable-assertions" option (patch
+	  by Juergen Pfeifer).
+
+970802
+	+ add '-s' (single-step) option too test/hashtest.c, correct an error
+	  in loop limit for '-f' (footer option), toggle scrollok() when
+	  writing footer to avoid wrap at lower-right corner.
+	+ correct behavior of clrtoeol() immediately after wrapping cursor,
+	  which was not clearing the line at the cursor position (reported by
+	  Liviu Daia <daia@stoilow.imar.ro>).
+	+ corrected mapping for ACS_LANTERN, which was 'I' rather than 'i'
+	  (reported by Klaus Weide <kweide@tezcat.com>).
+	+ many corrections to make progs/capconvert work, as well as make it
+	  reasonably portable and integrated with ncurses 4.1 (reported by Dave
+	  Furstenau <df@ravine.binary.net>).
+
+970726
+	+ add flag SP->_fifohold, corresponding logic to modify the behavior of
+	  the line breakout logic so that if the application does not read
+	  input, refreshes will not be stopped, but only slowed.
+	+ generate slk_attr_off(), slk_attr_on(), slk_attr_set(), vid_attr(),
+	  ifdef'd for wide-character support, since ncurses' WA_xxx attribute
+	  masks are identical with the A_xxx masks.
+	+ modify MKlib_gen.sh to generate ifdef'd functions to support optional
+	  configuration of wide-characters.
+	+ modify tset to behave more like SVr4's tset, which does not modify
+	  the settings of intr, quit or erase unless they are given as command
+	  options (reported by Nelson H. F. Beebe <beebe@math.utah.edu>).
+	+ modify tset to look in /etc/ttys or /etc/ttytype if the configuration
+	  does not have getttynam().
+	+ extend baudrate table in tset.c to match baudrate() function.
+	+ add table entries for B230400 and B460800 to baudrate() function.
+	+ improve breakout logic by allowing it before the first line updated,
+	  which is what SVr4 curses does (patch by Alexander V. Lukyanov).
+	+ correct initialization of vcost in relative_move(), for cursor-down
+	  case (patch by Alexander V. Lukyanov).
+	> nits gleaned from Debian distribution of 1.9.9g-3:
+	+ install symbolic link for intotocap.
+	+ reference libc directly when making shared libraries.
+	+ correct renaming of curs_scr_dmp.3x in man_db.renames.
+	+ guard tgetflag() and other termcap functions against null cur_term
+	  pointer.
+
+970719
+	+ corrected initial state of software echo (error in 970405, reported
+	  by Alexander V. Lukyanov).
+	+ reviewed/added messages to configure script, so that all non-test
+	  options should be accompanied by a message.
+	+ add configure check for long filenames, using this to determine if
+	  it is safe to allow long aliases for terminal descriptions as does
+	  SVr4.
+	+ add configure options for widec (wide character), hashmap (both
+	  experimental).
+	> patch by Alexander V. Lukyanov:
+	+ hashmap.c - improved by heuristic, so that scroll test works much
+	  better when csr is not available.
+	+ hardscroll.c - patched so that it continues to scroll other chunks
+	  after failure to scroll one.
+	+ lib_doupdate.c - _nc_mvcur_scrolln extended to handle more cases; csr
+	  is avoided as it is relative costly.  Fixed wrong coordinates in one
+	  case and wrong string in TRACE.
+	> patch by Juergen Pfeifer:
+	+ modify C++ binding to compile on AIX 4.x with the IBM C-SET++
+	  compiler.
+
+970712
+	+ remove alternate character set from kterm terminfo entry; it uses the
+	  shift-out control for a purpose incompatible with curses, i.e., font
+	  switching.
+	+ disentangle 'xterm' terminfo entry from some derived entries that
+	  should be based on xterm-r6 instead.
+	+ add cbt to xterm-xf86-xv32 terminfo entry; I added the emulation for
+	  XFree86 3.1.2F, but overlooked its use in terminfo then - T.Dickey.
+	+ correct logic in lib_mvcur.c that uses back_tab.
+
+970706
+	+ correct change from 970628 to ClrUpdate() in lib_doupdate.c so that
+	  contents of curscr are saved in newscr before clearing the screen.
+	  This is needed to make repainting work with the present logic of
+	  TransformLine().
+	+ use napms() rather than sleep() in tset.c to avoid interrupting I/O.
+
+970705
+	+ add limit checks to _nc_read_file_entry() to guard against overflow
+	  of buffer when reading incompatible terminfo format, e.g, from OSF/1.
+	+ correct some loop-variable errors in xmc support in lib_doupdate.c
+	+ modify ncurses 'b' test to add gaps, specified by user, to allow
+	  investigation of interaction with xmc (magic cookie) code.
+	+ correct typo in 970524 mods to xmas.c, had omitted empty parameter
+	  list from has_colors(), which gcc ignores, but SVr4 does not
+	  (reported by Larry Virden).
+	+ correct rmso capability in wy50-mc description.
+	+ add configure option "--enable-hard-tabs", renamed TABS_OK ifdef to
+	  USE_HARD_TABS.
+	> patch by Juergen Pfeifer:
+	+ Add bindings for keyok() and define_key() to the Ada95 packages.
+	+ Improve man pages menu_post.3x and menu_format.3x
+	+ Fix the HTML pages in the Ada95/html directory to reflect the above
+	  changes.
+
+970628
+	+ modify change from 970101 to ClrUpdate() in lib_doupdate.c so that
+	  pending changes to both curscr and newscr are flushed properly.
+	  This fixes a case where the first scrolling operation in nvi would
+	  cause the screen to be cleared unnecessarily and repainted before
+	  doing the indexing, i.e., by repeatedly pressing 'j' (reported by
+	  Juergen Pfeifer).
+	+ correct error in trans_string() which added embedded newlines in a
+	  terminfo description to the stored strings.
+	+ remove spurious newlines from sgr in wyse50 (and several other)
+	  terminfo descriptions.
+	+ add configure option for experimental xmc (magic cookie) code,
+	  "--enable-xmc-glitch".  When disabled (the default), attributes that
+	  would store a magic cookie are suppressed in vidputs().  The magic
+	  cookie code is far from workable at this stage; the configuration
+	  option is a stopgap.
+	+ move _nc_initscr() from lib_initscr.c to lib_newterm.c
+	+ correct path for invoking make_keys (a missing "./").
+
+970621
+	+ correct sign-extension problem with "infocmp -e", which corrupted
+	  acsc values computed for linux fallback data.
+	+ correct dependency on ncurses/names.c (a missing "./").
+	+ modify configure script to use '&&' even for cd'ing to existing
+	  directories to work around broken shell interpreters.
+	+ correct a loop-limit in _nc_hash_map() (patch by Alexander V.
+	  Lukyanov).
+
+970615
+	+ restore logic in _nc_scroll_optimize() which marks as touched the
+	  lines in curscr that are shifted.
+	+ add new utility 'make_keys' to compute keys.tries as a table rather
+	  than a series of function calls.
+	+ correct include-dependency for tic.h used by name_match
+	+ removed buffer-allocation for name and description from m_item_new.c,
+	  since this might result in incompatibilities with SVr4.  Also fixed
+	  the corresponding Ada95 binding module (patch by Juergen Pfeifer,
+	  report by Avery Pennarun <apenwarr@foxnet.net>)
+	+ removed the mechanism to timestamp the generated Ada95 sources.  This
+	  resulted always in generating patches for the HTML doc, even when
+	  nothing really changed (patch by Juergen Pfeifer).
+	+ improve man page mitem_new.3x (patch by Juergen Pfeifer).
+
+970614
+	+ remove ech capability from rxvt description because it does not work.
+	+ add missing case logic for infocmp -I option (reported by Lorenzo M.
+	  Catucci <lorenzo@argon.roma2.infn.it>)
+	+ correct old bug in pnoutrefresh() unmasked by fix in 970531; this
+	  caused glitches in the ncurses 'p' test since the area outside the
+	  pad was not compared when setting up indices for _nc_scroll_optimize.
+	+ rewrote tracebits() to workaround misdefinition of TOSTOP on Ultrix
+	  4.4, as well as to eliminate fixed-size buffer (reported by Chris
+	  Tanner <tannerc@aecl.ca>)
+	+ correct prototype for termattrs() as per XPG4 version 2.
+	+ add placeholder prototypes for color_set(), erasewchar(),
+	  term_attrs(), wcolor_set() as per XPG4 version 2.
+	+ correct attribution for progs/progs.priv.h and lib_twait.c
+	+ improve line-breakout logic by checking based on changed lines rather
+	  than total lines (patch by Alexander V. Lukyanov).
+	+ correct loop limits for table-lookup of enumerated value in form
+	  (patch by Juergen Pfeifer).
+	+ improve threshold computation for determining when to call ClrToEOL
+	  (patch by Alexander V. Lukyanov).
+
+970531
+	+ add configure option --disable-database to force the library to
+	  use only the fallback data.
+	+ add configure option --with-fallbacks, to specify list of fallback
+	  terminal descriptions.
+	+ add a symbolic link for ncurses.h during install; too many programs
+	  still assume there's an ncurses.h
+	+ add new terminfo.src entry for xterm-xf86-v33.
+	+ restore terminfo.src entry for emu to using setf/setb, since it is
+	  not, after all, generating ANSI sequences.  Corrected missing comma
+	  that caused setf/setb entries to merge.
+	+ modify mousemask() to use keyok() to enable/disable KEY_MOUSE, so
+	  that applications can disable ncurses' mouse and supply their own
+	  handler.
+	+ add extensions keyok() and define_key().  These are designed to allow
+	  the user's application better control over the use of function keys,
+	  e.g., disabling the ncurses KEY_MOUSE.  (The define_key idea was from
+	  a mailing-list thread started by Kenneth Albanowski
+	  <kjahds@kjahds.com> Nov'1995).
+	+ restore original behavior in ncurses 'g' test, i.e., explicitly
+	  set the keypad mode rather than use the default, since it confuses
+	  people.
+	+ rewrote the newdemo banner so it's readable (reported by Hugh
+	  Daniel).
+	+ tidy up exit from hashtest (reported by Hugh Daniel).
+	+ restore check for ^Q in ncurses 'g' test broken in 970510 (reported
+	  by Hugh Daniel)
+	+ correct tput program, checking return-value of setupterm (patch by
+	  Florian La Roche).
+	+ correct logic in pnoutrefresh() and pechochar() functions (reported
+	  by Kriang Lerdsuwanakij <lerdsuwa@scf.usc.edu>).  The computation
+	  of 'wide' date to eric's #283 (1.9.9), and the pechochar bug to the
+	  original implementation (1.9.6).
+	+ correct typo in vt102-w terminfo.src entry (patch by Robert Wuest
+	  <rwuest@sire.vt.com>)
+	+ move calls of _nc_background() out of various loops, as its return
+	  value will be the same for the whole window being operated on (patch
+	  by J T Conklin).
+	+ add macros getcur[xy] getbeg[xy] getpar[xy], which are defined in
+	  SVr4 headers (patch by J T Conklin <jtc@NetBSD.ORG>)
+	+ modify glibc addon-configure scripts (patch by H.J.Lu).
+	+ correct a bug in hashmap.c: the size used for clearing the hashmap
+	  table was incorrect, causing stack corruption for large values of
+	  LINES, e.g., >MAXLINES/2 (patch by Alexander V. Lukyanov).
+	+ eric's terminfo 9.13.23 & 9.13.24 changes: replaced minitel-2 entry,
+	  added MGR, ansi-nt (note: the changes described for 9.13.24 have not
+	  been applied).
+	> several changes by Juergen Pfeifer:
+	+ correct a missing error-return in form_driver.c when wrapping of a
+	  field is not possible.
+	+ correct logic in form_driver.c for configurations that do not have
+	  memccpy() (reported by Sidik Isani <isani@cfht.hawaii.edu>)
+	+ change several c++ binding functions to inline.
+	+ modify c++ menu binding to inherit from panels, for proper
+	  initialization.
+	+ correct freeing of menu items in c++ binding.
+	+ modify c++ binding to reflect removal of const from user data pointer
+	  in forms/menus libraries.
+
+970524
+	+ add description of xterm-16color.
+	+ modify name of shared-library on *BSD to end with $(REL_VERSION)
+	  rather than $(ABI_VERSION) to match actual convention on FreeBSD
+	  (cf: 960713).
+	+ add OpenBSD to shared-library case, same as NetBSD and FreeBSD
+	  (reported by Hugh Daniel <hugh@rat.toad.com>).
+	+ corrected include-dependency in menu/Makefile so that "make install"
+	  works properly w/o first doing "make".
+	+ add fallback definition for isascii, used in infocmp.
+	+ modify xmas to use color, and to exit right away when a key is
+	  pressed.
+	+ modify gdc so that the scrolled digits function as described (there
+	  was no time delay between the stages, and the digits overwrote the
+	  bounding box without tidying up).
+	+ modify lib_color.c to use setaf/setab only for the ANSI color codes
+	  0 through 7.  Using 16 colors requires setf/setb.
+	+ modify ncurses 'c' test to work with 16 colors, as well as the normal
+	  8 colors.
+	+ remove const qualifier from user data pointer in forms and menus
+	  libraries (patch by Juergen Pfeifer).
+	+ rewrote 'waddchnstr()' to avoid using the _nc_waddch_nosync()
+	  function, thereby not interpreting tabs, etc., as per spec (patch by
+	  Alexander V. Lukyanov).
+
+970517
+	+ suppress check for pre-existing ncurses header if the --prefix
+	  option is specified.
+	+ add configure options "--with-system-type" and
+	  "--with-system-release" to assist in checking the generated
+	  makefiles.
+	+ add configure option "--enable-rpath" to allow installers to specify
+	  that programs linked against shared libraries will have their library
+	  path embedded, allowing installs into nonstandard locations.
+	+ add flags to OSF1 shared-library options to specify version and
+	  symbol file (patch by Tim Mooney <mooney@dogbert.cc.ndsu.NoDak.edu>)
+	+ add missing definition for ABI_VERSION to c++/Makefile.in (reported
+	  by Satoshi Adachi <adachi@wisdom.aa.ap.titech.ac.jp>).
+	+ modify link flags to accommodate HP-UX linker which embeds absolute
+	  pathnames in executables linked against shared libraries (reported by
+	  Jason Evans <jasone@mrc.uidaho.edu>, solved by Alan Shutko
+	  <ats@hubert.wustl.edu>).
+	+ drop unnecessary check for attribute-change in onscreen_mvcur() since
+	  mvcur() is the only caller within the library, and that check in turn
+	  is exercised only from lib_doupdate.c (patch by Alexander V.
+	  Lukyanov).
+	+ add 'blank' parameter to _nc_scroll_window() so _nc_mvcur_scrolln()
+	  can use the background of stdscr as a parameter to that function
+	  (patch by Alexander V. Lukyanov).
+	+ moved _nc_mvcur_scrolln() from lib_mvcur.c to lib_doupdate.c, to use
+	  the latter's internal functions, as well as to eliminate unnecessary
+	  cursor save/restore operations (patch by Alexander V. Lukyanov).
+	+ omit parameter of ClrUpdate(), since it is called only for newscr,
+	  further optimized/reduced by using ClearScreen() and TransformLine()
+	  to get rid of duplicate code (patch by Alexander V. Lukyanov).
+	+ modify scrolling algorithm in _nc_scroll_optimize() to reject hunks
+	  that are smaller than the distance to be moved (patch by Alexander V.
+	  Lukyanov).
+	+ correct a place where the panel library was not ifdef'd in ncurses.c
+	  (Juergen Pfeifer)
+	+ documentation fixes (Juergen Pfeifer)
+
+970515	4.1 release for upload to prep.ai.mit.edu
+	+ re-tag changes since 970505 as 4.1 release.
+
+970510
+	+ modify ncurses 'g' test to allow mouse input
+	+ modify default xterm description to include mouse.
+	+ modify configure script to add -Wwrite-strings if gcc warnings are
+	  enabled while configuring --enable-const (and fixed related
+	  warnings).
+	+ add toggle, status display for keypad mode to ncurses 'g' test to
+	  verify that keypad and scrollok are not inherited from parent window
+	  during a call to newwin.
+	+ correction to MKexpanded.sh to make it work when configure --srcdir
+	  is used (reported by H.J.Lu).
+	+ revise test for bool-type, ensuring that it checks if builtin.h is
+	  available before including it, adding test for sizeof(bool) equal
+	  to sizeof(short), and warning user if the size cannot be determined
+	  (reported by Alexander V. Lukyanov).
+	+ add files to support configuration of ncurses as an add-on library
+	  for GNU libc (patch by H.J.Lu <hjl@lucon.org>)
+
+970506
+	+ correct buffer overrun in lib_traceatr.c
+	+ modify change to lib_vidattr.c to avoid redundant orig_pair.
+	+ turn on 'echo()' in hanoi.c, since it is initially off.
+	+ rename local 'errno' variable in etip.h to avoid conflict with global
+	  (H.J.Lu).
+	+ modify configure script to cache LD, AR, AR_OPTS (patch by H.J.Lu
+	  <hjl@lucon.org>)
+
+970505	4.1 pre-release
+	+ regenerate the misc directory html dumps without the link list, which
+	  is not useful.
+	+ correct dependency in form directory makefile which caused
+	  unnecessary recompiles.
+	+ correct substitution for ABI_VERSION in test-makefile
+	+ modify install rules for shared-library targets to remove the target
+	  before installing, since some install programs do not properly handle
+	  overwrite of symbolic links.
+	+ change order of top-level targets so that 'include' immediate
+	  precedes the 'ncurses' directory, reducing the time between new
+	  headers and new libraries (requested by Larry Virden).
+	+ modify lib_vidattr.c so that colors are turned off only before
+	  modifying other attributes, turned on after others.  This makes the
+	  hanoi.c program display correctly on FreeBSD console.
+	+ modify debug code in panel library to print user-data addresses
+	  rather than the strings which they (may) point to.
+	+ add check to ensure that C++ binding and demo are not built with g++
+	  versions below 2.7, since the binding uses templates.
+	+ modify c++ binding and demo to build and run with SGI's c++ compiler.
+	  (It also compiles with the Sun SparcWorks compiler, but the demo does
+	  not link, due to a vtbl problem).
+	+ corrections to demo.cc, to fix out-of-scope variables (Juergen
+	  Pfeifer).
+
+970503
+	+ correct memory leak in _nc_trace_buf().
+	+ add configure test for regexpr.h, for Unixware 1.x.
+	+ correct missing "./" prefixing names of generated files in ncurses
+	  directory.
+	+ use single-quotes in configure scripts assignments for MK_SHARED_LIB
+	  to workaround shell bug on FreeBSD 2.1.5
+	+ remove tabs from intermediate #define's for GCC_PRINTF, GCC_SCANF
+	  that caused incorrect result in ncurses_cfg.h
+	+ correct initialization in lib_trace.c, which omitted version info.
+	+ remove ech, el1 attributes from cons25w description; they appear to
+	  malfunction in FreeBSD 2.1.5
+	+ correct color attributes in terminfo.src and lib_color.c to match
+	  SVr4 behavior by interchanging codes 1,4, 3,6 in the setf/setb
+	  capabilities.
+	+ use curs_set() rather than checks via tigetstr() for test programs
+	  that hide the cursor: firework, rain, worm.
+	+ ensure that if the terminal lacks change_scroll_region, parm_index
+	  and parm_rindex are used only to scroll the whole screen (patch by
+	  Peter Wemm).
+	+ correct curs_set() logic, which did not return ERR if the requested
+	  attributes did not exist, nor did it assume an unknown initial state
+	  for the cursor (patch by Alexander V. Lukyanov).
+	+ combine IDcTransformLine and NoIDcTransformLine to new TransformLine
+	  function in lib_doupdate.c (patch by Alexander V. Lukyanov).
+	+ correct hashmap.c, which did not update index information (patch by
+	  Alexander V. Lukyanov).
+	+ fixes for C++ binding and demo (see c++/NEWS) (Juergen Pfeifer).
+	+ correct index in lib_instr.c (Juergen Pfeifer).
+	+ correct typo in 970426 patch from Tom's cleanup of lib_overlay.c
+	  (patch by Juergen Pfeifer).
+
+970426
+	+ corrected cost computation in PutRange(), which was using
+	  milliseconds compared to characters by adding two new members to the
+	  SCREEN struct, _hpa_ch_cost and _cup_ch_cost.
+	+ drop ncurses/lib_unctrl.c, add ncurses/MKunctrl.awk to generate a
+	  const array of strings (suggested by Alexander V. Lukyanov).  The
+	  original suggestion in 970118 used a perl script.
+	+ rewrote ncurses 'b' test to better exercise magic-cookie (xmc), as
+	  well as noting the attributes that are not supported by a terminal.
+	+ trace the computation of cost values in lib_mvcur.c
+	+ modify _nc_visbuf() to use octal rather than hex, corrected sign
+	  extension bug in that function that caused buffer overflow.
+	+ modify trace in lib_acs.c to use _nc_visbuf().
+	+ suppress trace within _traceattr2().
+	+ correct logic of _tracechtype2(), which did not account for repeats
+	  or redefinition within an acsc string.
+	+ modify debug-library version baudrate() to use environment variable
+	  $BAUDRATE to override speed computation.  This is needed for
+	  regression testing.
+	+ correct problems shown by "weblint -pedantic".
+	+ update mailing-list information (now ncurses@bsdi.com).
+
+970419
+	+ Improve form_field_validation.3x manpage to better describe the
+	  precision parameter for TYPE_NUMERIC and TYPE_INTEGER.  Provide more
+	  precise information how the range checking can be avoided.  (patch by
+	  Juergen Pfeifer, reported by Bryan Henderson)
+	+ change type of min/max value of form types TYPE_INTEGER to long to
+	  match SVr4 documentation.
+	+ set the form window to stdscr in set_form_win() so that form_win()
+	  won't return null (patch by Juergen Pfeifer, reported by Bryan
+	  Henderson <bryanh@giraffe.netgate.net>).
+
+970412
+	+ corrected ifdef'ing of inline (cf: 970321) for TRACE vs C++.
+	+ corrected toggle_attr_off() macro (patch by Andries Brouwer).
+	+ modify treatment of empty token in $MANPATH to /usr/man (reported by
+	  <Andries.Brouwer@cwi.nl>)
+	+ modify traces that record functions-called so that chtype and attr_t
+	  values are expressed symbolically, to simplify reuse of generated
+	  test-scripts on SVr4 regression testing.
+	+ add new trace functions _traceattr2() and _tracechtype2()
+
+970405
+	+ add configure option --enable-const, to support the use of 'const'
+	  where XSI should have, but did not, specify.  This defines
+	  NCURSES_CONST, which is an empty token otherwise, for strict
+	  compatibility.
+	+ make processing of configure options more verbose by echoing the
+	  --enable/--with values.
+	+ add configure option --enable-big-core
+	+ set initial state of software echo off as per XSI.
+	+ check for C++ builtin.h header
+	+ correct computation of absolute-path for $INSTALL that dropped "-c"
+	  parameter from the expression.
+	+ rename config.h to ncurses_cfg.h to avoid naming-conflict when
+	  ncurses is integrated into larger systems (adapted from diffs by
+	  H.J.Lu for libc).
+	+ correct inequality in lib_doupdate.c that caused a single-char to not
+	  be updated when the char on the right-margin was not blank, idcok()
+	  was true (patch by Alexander V Lukyanov (in 970124), reported
+	  by Kriang Lerdsuwanakij <lerdsuwa@scf-fs.usc.edu> in 970329).
+	+ modify 'clean' rule in include/Makefile so that files created by
+	  configure script are removed in 'distclean' rule instead.
+
+970328
+	+ correct array limit in tparam_internal(), add case to interpret "%x"
+	  (patch by Andreas Schwab)
+	+ rewrote number-parsing in ncurses.c 'd' test; it did not reset the
+	  value properly when non-numeric characters were given (reported by
+	  Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>)
+
+970321
+	+ move definition of __INTERNAL_CAPS_VISIBLE before include for
+	  progs.priv.h (patch by David MacKenzie).
+	+ add configuration summary, reordered check for default include
+	  directory to better accommodate a case where installer is configuring
+	  a second copy of ncurses (reported by Klaus Weide
+	  <kweide@tezcat.com>)
+	+ moved the #define for 'inline' as an empty token from the
+	  $(CFLAGS_DEBUG) symbol into config.h, to avoid redefinition warning
+	  (reported by Ward Horner).
+	+ modify test for bool builtin type to use 'unsigned' rather than
+	  'unknown' when cross-compiling (reported by Ward Horner).
+
+970315
+	+ add header dependencies so that "make install.libs" will succeed
+	  even if "make all" is not done first.
+	+ moved some macros from lib_doupdate.c to curses.priv.h to use in
+	  expanded functions with ATAC.
+	+ correct implementation of lib_instr.c; both XSI and SVr4 agree that
+	  the winnstr functions can return more characters than will fit on one
+	  line.
+
+970308
+	+ modify script that generates lib_gen.c to support traces of called &
+	  return.
+	+ add new configure option "--disable-macros", for testing calls within
+	  lib_gen.c
+	+ corrected logic that screens level-checking of called/return traces.
+
+970301
+	+ use new configure macro NC_SUBST to replace AC_PATH_PROG, better
+	  addressing request by Ward Horner.
+	+ check for cross-compiling before trying to invoke the autoconf
+	  AC_FUNC_SETVBUF_REVERSED macro (reported by Ward Horner)
+	+ correct/simplify loop in _nc_visbuf(), 970201 changes omitted
+	  a pointer-increment.
+	+ eliminate obsolete symbol SHARED_ABI from dist.mk (noted by
+	  Florian La Roche).
+
+970215
+	+ add configure option --enable-expanded, together with code that
+	  implements an expanded form of certain complex macros, for testing
+	  with ATAC.
+	+ disable CHECK_POSITION unless --with-assertions is configured
+	  (Alexander V Lukyanov pointed out that this is redundant).
+	+ use keyname() to show traced chtype values where applicable rather
+	  than _tracechar(), which truncates the value to 8-bits.
+	+ minor fixes to TRACE_ICALLS, added T_CREATE, TRACE_CCALLS macros.
+	+ modify makefiles in progs and test directories to avoid using C
+	  preprocessor options on link commands (reported by Ward Horner)
+	+ correct ifdef/include-order for nc_alloc.h vs lib_freeall.c (reported
+	  by Ward Horner)
+	+ modify ifdef's to use configure-defined symbols consistently
+	  (reported by Ward Horner)
+	+ add/use new makefile symbols AR, AR_OPTS and LD to assist in non-UNIX
+	  ports (reported by Ward Horner <whorner@tsi-telsys.com>)
+	+ rename struct try to struct tries, to avoid name conflict with C++
+	  (reported by Gary Johnson).
+	+ modify worm.c to hide cursor while running.
+	+ add -Wcast-qual to gcc warnings, fix accordingly.
+	+ use PutChar rather than PutAttrChar in ClrToEOL to properly handle
+	  wrapping (Alexander V Lukyanov).
+	+ correct spurious echoing of input in hanoi.c from eric's #291 & #292
+	  patches (reported by Vernon C. Hoxie <vern@zebra.alphacdc.com>).
+	+ extend IRIX configuration to IRIX64
+	+ supply missing install.libs rule needed after restructuring
+	  test/Makefile.in
+
+970208
+	+ modify "make mostlyclean" to leave automatically-generated source
+	  in the ncurses directory, for use in cross-compiles.
+	+ autogenerated object-dependencies for test directory
+	+ add configure option --with-rcs-ids
+	+ modify configuration scripts to generate major/minor/patch versions
+	  (suggested by Alexander V Lukyanov).
+	+ supply missing va_end's in lib_scanw.c
+	+ use stream I/O for trace-output, to eliminate fixed-size buffer
+	+ add TRACE_ICALLS definition/support to lib_trace.c
+	+ modify Ada95 binding to work with GNAT 3.09 (Juergen Pfeifer).
+
+970201
+	+ add/modify traces for called/return values to simplify extraction
+	  for test scripts.
+	+ changed _nc_visbuf to quote its result, and to dynamically allocate
+	  the returned buffer.
+	+ invoke ldconfig after installing shared library
+	+ modify install so that overwrite applies to shared library -lcurses
+	  in preference to static library (reported by Zeyd M Ben-Halim 960928).
+	+ correct missing ';' in 961221 mod to overwrite optional use of $(LN_S)
+	  symbol.
+	+ fixes to allow "make install" to work without first doing a "make
+	  all" (suggested by Larry Virden).
+
+970125
+	+ correct order of #ifdef for TABS_OK.
+	+ instrumented toe.c to test memory-leaks.
+	+ correct memory-deallocation in toe.c (patch by Jesse Thilo).
+	+ include <sys/types.h> in configuration test for regex.h (patch by
+	  Andreas Schwab)
+	+ make infocmp recognize -I option, for SVr4 compatibility (reported by
+	  Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>)
+
+970118
+	+ add extension 'use_default_colors()', modified test applications that
+	  use default background (firework, gdc, hanoi, knight, worm) to
+	  demonstrate.
+	+ correct some limit checks in lib_doupdate.c exposed while running
+	  worm.
+	+ use typeCalloc macro for readability.
+	+ add/use definition for CONST to accommodate testing with Solaris
+	  (SVr4) curses, which doesn't use 'const' in its prototypes.
+	+ modify ifdef's in test/hashtest.c and test/view.c to compile with
+	  Solaris curses.
+	+ modify _tracedump() to pad colors & attrs lines to match change
+	  in 970101 showing first/last changes.
+	+ corrected location of terminating null on dynamically allocated forms
+	  fields (patch by Per Foreby).
+
+970111
+	+ added headers to make view.c compile on SCO with the resizeterm()
+	  code (i.e., struct winsize) - though this compiles, I don't have a
+	  suitable test configuration since SIGWINCH doesn't pass my network to
+	  that machine - T.Dickey.
+	+ update test/configure.in to supply some default substitutions.
+	+ modify configure script to add -lncurses after -lgpm to fix problem
+	  linking against static libraries.
+	+ add a missing noraw() to test/ncurses.c (places noted by Jeremy
+	  Buhler)
+	+ add a missing wclear() to test/testcurs.c (patch by Jeremy Buhler
+	  <jbuhler@cs.washington.edu>)
+	+ modify headers to accommodate compilers that don't allow duplicate
+	  "#define" lines for NCURSES_VERSION (reported by Larry W. Virden
+	  <lvirden@cas.org>)
+	+ fix formatting glitch in curs_getch.3x (patch by Jesse Thilo).
+	+ modify lib_doupdate to make el, el1 and ed optimization use the
+	  can_clear_with macro, and change EmitRange to allow leaving cursor at
+	  the middle of interval, rather than always at the end (patch by
+	  Alexander V Lukyanov).  This was originally 960929, resync 970106.
+
+970104
+	+ workaround defect in autoconf 2.12 (which terminates configuration
+	  if no C++ compiler is found) by adding an option --without-cxx.
+	+ modify several man-pages to use tbl, where .nf/.fi was used (reported
+	  by Jesse Thilo).
+	+ correct font-codes in some man-pages (patch by Jesse Thilo
+	  <Jesse.Thilo@pobox.com>)
+	+ use configure script's knowledge of existence of g++ library for the
+	  c++ Makefile (reported by Paul Jackson).
+	+ correct misleading description of --datadir configuration option
+	  (reported by Paul Jackson <pj@sam.engr.sgi.com>)
+
+970101
+	+ several corrections to _nc_mvcur_scrolln(), prompted by a bug report
+	  from Peter Wemm:
+	> the logic for non_dest_scroll_region was interchanged between the
+	  forward & reverse scrolling cases.
+	> multiple returns from the function allowed certain conditions to do
+	  part of an operation before discovering that it couldn't be
+	  completed, returning an error without restoring the cursor.
+	> some returns were ERR, where the function had completed the
+	  operation, because the insert/delete line logic was improperly
+	  tested (this was probably the case Peter saw).
+	> contrary to comments, some scrolling cases were tested after the
+	  insert/delete line method.
+	+ modify _tracedump() to show first/last changes.
+	+ modify param of ClrUpdate() in lib_doupdate.c to 'newscr', fixes
+	  refresh problem (reported by Peter Wemm) that caused nvi to not show
+	  result of ":r !ls" until a ^L was typed.
+
+961229	(internal alpha)
+	+ correct some of the writable-strings warnings (reported by Gary
+	  Johnson <gjohnson@season.com>).  Note that most of the remaining ones
+	  are part of the XSI specification, and can't be "fixed".
+	+ improve include-dependencies in form, menu, panel directories.
+	+ correct logic of delay_output(), which would return early if
+	  there is data on stdin.
+	+ modify interface & logic of _nc_timed_wait() to support 2 file
+	  descriptors, needed for GPM.
+	+ integrate patch by Andrew Kuchling <amk@magnet.com> for GPM (mouse)
+	  support, correcting logic in wgetch() and _nc_mouse_parse() which
+	  prevented patch from working properly -TD
+	+ improve performance of panel algorithm (Juergen Pfeifer 961203).
+	+ strip RCS id's from generated .html files in Ada95 subtree.
+	+ resync with generated .html files (Juergen Pfeifer 961223).
+	+ terminfo.src 10.1.0 (ESR).
+
+961224	4.0 release
+	+ release as 4.0 to accommodate Linux ld.so.1.8.5
+	+ correct syntax/spelling, regenerated .doc files from .html using
+	  lynx 2.5
+	+ refined forms/menus makefiles (Juergen Pfeifer 961223).
+
+961221	- snapshot
+	+ remove logic in read_entry.c that attempts to refine errno by using
+	  'access()' for the directory (from patch by Florian La Roche).
+	+ correct configure test/substitution that inhibits generating
+	  include-path to /usr/include if gcc is used (reported by Florian La
+	  Roche).
+	+ modify setupterm() to allocate new TERMINAL for each call, just as
+	  solaris' curses does (Alexander V Lukyanov 960829).
+	+ corrected memory leaks in read_entry.c
+	+ add configure options --with-dbmalloc, --with-dmalloc, and
+	  --disable-leaks, tested by instrumenting infocmp, ncurses programs.
+	+ move #include's for stdlib.h and string.h to *.priv.h to accommodate
+	  use of dbmalloc.
+	+ modify use of $(LN_S) to follow recommendation in autoconf 2.12,
+	  i.e., set current directory before linking.
+	+ split-out panel.priv.h, improve dependencies for forms, menus
+	  (Juergen Pfeifer 961204).
+	+ modify _nc_freewin() to reset globals curscr/newscr/stdscr when
+	  freeing the corresponding WINDOW (found using Purify).
+	+ modify delwin() to return ERR if the window to be deleted has
+	  subwindows, needed as a side-effect of resizeterm() (found using
+	  Purify).  Tested and found that SVr4 curses behaves this way.
+	+ implement logic for _nc_freeall(), bringing stub up to date.
+
+961215
+	+ modify wbkgd() so that it doesn't set nulls in the rendered text,
+	  even if its argument doesn't specify a character (fixes test case by
+	  Juergen Pfeifer for bug-report).
+	+ set window-attributes in wbkgd(), to simplify comparison against
+	  Solaris curses, which does this.
+
+961214	- snapshot
+	+ replace most constants in ncurses 'o' test by expressions, making it
+	  work with wider range of screen sizes.
+	+ add options to ncurses.c to specify 'e' test softkey format, and the
+	  number of header/footer lines to rip-off.
+	+ add ^R (repaint after resize), ^L (refresh) commands to ncurses 'p'
+	  test.
+	+ add shell-out (!) command to ncurses 'p' test to allow test of
+	  resize between endwin/refresh.
+	+ correct line-wrap case in mvcur() by emitting carriage return,
+	  overlooked in 960928, but needed due to SVr4 compatibility changes to
+	  terminal modes in 960907.
+	+ correct logic in wresize that causes new lines to be allocated,
+	  broken for the special case of increasing rows only in 960907's fix
+	  for subwindows.
+	+ modify configure script to generate $(LDFLAGS) with -L and -l options
+	  in preference to explicit library filenames.  (NOTE: this may
+	  require further amending, since I vaguely recall a dynamic loader
+	  that did not work properly without the full names, but it should be
+	  handled as an exception to the rule, since some linkers do bulk
+	  inclusion of libraries when given the full name - T.Dickey).
+	+ modify configure script to allow user-supplied $CFLAGS to set the
+	  debug-option in all libraries (requested by lots of people) -TD
+	+ use return consistently from main(), rather than exit (reported by
+	  Florian La Roche).
+	+ add --enable-getcap-cache option to configure, normally disabled
+	  (requested by Florian La Roche).
+	+ make configure test for gettimeofday() and possibly -lbsd more
+	  efficient (requested by Florian La Roche <florian@knorke.saar.de>)
+	+ minor adjustments to Ada95 binding (patches by Juergen Pfeifer)
+	+ correct attributes after emitting orig_pair in lib_vidattr.c (patch
+	  by Alexander V Lukyanov).
+
+961208
+	+ corrected README wrt Ada95 (Juergen Pfeifer)
+
+961207	- snapshot
+	+ integrate resizeterm() into doupdate(), so that if screen size
+	  changes between endwin/refresh, ncurses will resize windows to fit
+	  (this needs additional testing with pads and softkeys).
+	+ add, for memory-leak testing, _nc_freeall() entrypoint to free all
+	  data used in ncurses library.
+	+ initialize _nc_idcok, _nc_idlok statically to resolve discrepancy
+	  between initscr() and newwin() initialization (reported by
+	  Alexander V Lukyanov).
+	+ test built VERSION=4.0, SHARED_ABI=4 with Linux ld.so.1.8.5
+	  (set beta versions to those values -- NOTE that subsequent pre-4.0
+	  beta may not be interchangeable).
+	+ modify configure script to work with autoconf 2.12
+
+961130	1.9.9g release
+	+ add copyright notices to configuration scripts (written by Thomas
+	  Dickey).
+
+961127
+	> patch, mostly for panel (Juergen Pfeifer):
+	+ cosmetic improvement for a few routines in the ncurses core library
+	  to avoid warning messages.
+	+ the panel overlap detection was broken
+	+ the panel_window() function was not fool-proof.
+	+ Some inlining...
+	+ Cosmetic changes (also to avoid warning messages when compiling with
+	  -DTRACE).
+
+961126
+	> patch by Juergen Pfeifer:
+	+ eliminates warning messages for the compile of libform.
+	+ inserts Per Foreby's new field type TYPE_IPV4 into libform.
+	+ Updates man page and the Ada95 binding to reflect this.
+	+ Improves inlining in libmenu and libform.
+
+961120
+	+ improve the use of the "const" qualifier in the
+	  panel library (Juergen Pfeifer)
+	+ change set_panel_userptr() and panel_userptr() to use void*
+	  (Juergen Pfeifer)
+
+961119
+	+ change ABI to 3.4
+	+ package with 961119 version of Ada95 binding (fixes for gnat-3.07).
+	  (Juergen Pfeifer)
+	+ correct initialization of the stdscr pseudo panel in panel library
+	  (Juergen Pfeifer)
+	+ use MODULE_ID (rcs keywords) in forms and menus libraries (Juergen
+	  Pfeifer).
+	> patch #324 (ESR):
+	+ typo in curs_termcap man page (reported by Hendrik Reichel
+	  <106065.2344@compuserve.com>)
+	+ change default xterm entry to xterm-r6.
+	+ add entry for color_xterm
+
+961116	- snapshot
+	+ lint found several functions that had only #define implementations
+	  (e.g., attr_off), modified curses.h.in to generate them as per XSI
+	  Curses requirement that every macro be available as a function.
+	+ add check in infocmp.c to guard against string compare of
+	  CANCELLED_STRING values.
+	+ modify firework.c, rain.c to hide cursor while running.
+	+ correct missing va_end in lib_tparm.c
+	+ modify hanoi.c to work on non-color terminals, and to use timing
+	  delays when in autoplay mode.
+	+ correct 'echochar()' to refresh immediately (reported by Adrian
+	  Garside <94ajg2@eng.cam.ac.uk>)
+	> patch #322 (ESR):
+	+ reorganize terminfo.src entries for xterm.
+
+961109	- snapshot
+	+ corrected error in line-breakout logic (lib_doupdate.c)
+	+ modified newdemo to use wgetch(win) rather than getch() to eliminate
+	  a spurious clear-screen.
+	+ corrected ifdef's for 'poll()' configuration.
+	+ added modules to ncurses, form, menu for Ada95 binding (Juergen
+	  Pfeifer).
+	+ modify set_field_buffer() to allow assignment of string longer than
+	  the initial buffer length, and to return the complete string rather
+	  than only the initial size (Juergen Pfeifer and Per Foreby
+	  <perf@efd.lth.se>).
+
+961102	- snapshot
+	+ configure for 'poll()' in preference to 'select()', since older
+	  systems are more likely to have a broken 'select()'.
+	+ modified render_char() to avoid OR'ing colors.
+	+ minor fixes to testcurs.c, newdemo.c test programs: ifdef'd out the
+	  resize test, use wbkgd and corrected box() parameters.
+	+ make flushinp() test work in ncurses.c by using napms() instead of
+	  sleep().
+	+ undo ESR's changes to xterm-x11r6 (it no longer matched the X11R6.1
+	  distribution, as stated)
+	+ terminfo 9.13.18 resync (ESR)
+	+ check for getenv("HOME") returning null (ESR).
+	+ change buffer used to decode xterm-mouse commands to unsigned to
+	  handle displays wider than 128 chars (Juergen Pfeifer).
+	+ correct typo curs_outopts.3x (Juergen Pfeifer).
+	+ correct limit-checking in wenclose() (Juergen Pfeifer).
+	+ correction to Peter Wemm's newwin change (Thomas Fehr
+	  <fehr@suse.de>).
+	+ corrections to logic that combines colors and attributes; they must
+	  not be OR'd (Juergen Pfeifer, extending from report/patch by Rick
+	  Marshall).
+
+961026	- snapshot
+	+ reset flags in 'getwin()' that might cause refresh to attempt to
+	  manipulate the non-existent parent of a window that is read from a
+	  file (lib_screen.c).
+	+ restructure _nc_timed_wait() to log more information, and to try to
+	  recover from badly-behaved 'select()' calls (still testing this).
+	+ move define for GOOD_SELECT into configure script.
+	+ corrected extra '\' character inserted before ',' in comp_scan.c
+	+ corrected expansion of %-format characters in dump_entry.c; some were
+	  rendered as octal constants.
+	+ modify dump_entry.c to make terminfo output more readable and like
+	  SVr4, by using "\s" for spaces (leading/trailing only), "\," for
+	  comma, "\^" and "\:" as well.
+	+ corrected some memory leaks in ncurses.c, and a minor logic error
+	  in the top-level command-parser.
+	+ correction for label format 4 (PC style with info line), a
+	  slk_clear(), slk_restore() sequence didn't redraw the info line
+	  (Juergen Pfeifer).
+	+ modified the slk window (if simulated) to inherit the background and
+	  default character attributes from stdscr (Juergen Pfeifer).
+	+ corrected limit-check in set_top_row (Juergen Pfeifer).
+
+961019	- snapshot
+	+ correct loop-limit in wnoutrefresh(), bug exposed during pipe-testing
+	  had '.lastchar' entry one beyond '._maxx'.
+	+ modify ncurses test-program to work with data piped to it.
+	+ corrected pathname computation in run_tic.sh, removing extra "../"
+	  (reported by Tim Mooney).
+	+ modified configure script to use previous install's location for
+	  curses.h
+	+ added NetBSD and FreeBSD to platforms that use --prefix=/usr as
+	  a default.
+
+961013
+	+ revised xterm terminfo descriptions to reflect the several versions
+	  that are available.
+	+ corrected a pointer reference in dump_entry.c that didn't test if
+	  the pointer was -1.
+
+961005	- snapshot
+	+ correct _nc_mvcur_scrolln for terminals w/o scrolling region.
+	+ add -x option to hashtest to control whether it allows writes to the
+	  lower-right corner.
+	+ ifdef'd (NCURSES_TEST) the logic for _nc_optimize_enable to make it
+	  simpler to construct tests (for double-check of _nc_hash_map tests).
+	+ correct ifdef's for c++ in curses.h
+	+ change default xterm type to xterm-x11r6.
+	+ correct quoting in configure that made man-pages installed with
+	  $datadir instead of actual terminfo path.
+	+ correct whitespace in include/Caps, which caused kf11, clr_eol and
+	  clr_end to be omitted from terminfo.5
+	+ fix memory leaks in delscreen() (adapted from Alexander V Lukyanov).
+	+ improve appearance of marker in multi-selection menu (Juergen
+	  Pfeifer)
+	+ fix behavior for forms with all fields inactive (Juergen Pfeifer)
+	+ document 'field_index()' (Juergen Pfeifer)
+	> patch #321 (ESR):
+	+ add some more XENIX keycap translations to include/Caps.
+	+ modify newwin to set initial state of each line to 'touched'
+	  (from patch by Peter Wemm <peter@spinner.dialix.com>)
+	+ in SET_TTY, replace TCSANOW with TCSADRAIN (Alexander V Lukyanov).
+
+960928	- snapshot
+	+ ifdef'd out _nc_hash_map (still slower)
+	+ add graphic characters to vt52 description.
+	+ use PutAttrChar in ClrToEOL to ensure proper background, position.
+	+ simplify/correct logic in 'mvcur()' that does wrapping; it was
+	  updating the position w/o actually moving the cursor, which broke
+	  relative moves.
+	+ ensure that 'doupdate()' sets the .oldindex values back to a sane
+	  state; this was causing a spurious refresh in ncurses 'r'.
+	+ add logic to configure (from vile) to guard against builders who
+	  don't remove config.cache & config.status when doing new builds -TD
+	+ corrected logic for 'repeat_char' in EmitRange (cf: eric #317), which
+	  did not follow the 2-parameter scheme specified in XSI.
+	+ corrected logic of wrefresh, wnoutrefresh broken in #319, making
+	  clearok work properly (report by Michael Elkins).
+	+ corrected problem with endwin introduced by #314 (removing the
+	  scrolling-region reset) that broke ncurses.c tests.
+	+ corrected order of args in AC_CHECK_LIB (from report by Ami Fischman
+	  <fischman@math.ucla.edu>).
+	+ corrected formatting of terminfo.5 tables (Juergen Ehling)
+	> patch 320 (ESR):
+	+ change ABI to 3.3
+	+ emit a carriage-return in 'endwin()' to workaround a kernel bug in
+	  BSDI.  (requested by Mike Karels <karels@redrock.bsdi.com>)
+	+ reverse the default o configure --enable-termcap (consensus).
+	> patch 319 (ESR):
+	+ modified logic for clearok and related functions (from report by
+	  Michael Elkins) - untested
+	> patch 318 (ESR):
+	+ correction to #317.
+	> patch 317 (ESR):
+	+ re-add _nc_hash_map
+	+ modify EmitRange to maintain position as per original design
+	  (patch by A. Lukyanov).
+	+ modify test/ncurses.c and tputs, etc., to allow trace counting
+	  output characters.
+	+ add hashtest.c program to time the hashmap optimization.
+	> patch 316 (ESR):
+	+ add logic to deal with magic-cookie (how was this tested?)
+	  (lib_doupdate.c).
+	+ add ncurses.c driver for magic-cookie, some fixes to ncurses.c
+	> patch 315 (ESR):
+	+ merge changes to lib_doupdate.c to use ech and rep - untested
+	  (patch by Alexander V Lukyanov).
+	+ modified handling of interrupted system calls - untested
+	  (lib_getch.c, lib_twait.c).
+	+ new function _nc_mvcur_resume()
+	+ fix return value for 'overlay()', 'overwrite()'
+
+960914	- snapshot
+	+ implement subwindow-logic in wresize, minor fixes to ncurses 'g'
+	  test.
+	+ corrected bracketing of fallback.c (reported/suggested fix by Juergen
+	  Ehling <eh@eclipse.aball.de>).
+	+ update xterm-color to reflect XFree86 3.1.3G release.
+	+ correct broken dtterm description from #314 patch (e.g., spurious
+	  newline.  The 'pairs' change might work, but no one's tested it
+	  either ;-)
+	+ clarify the documentation for the builtin form fieldtypes (Juergen
+	  Pfeifer)
+	> patch 314 (ESR):
+	+ reset scroll region on startup rather than at wrapup time
+	  (enhancement suggested by Alexander V Lukyanov).
+	+ make storage of palette tables and their size counts per-screen for
+	  multi-terminal applications (suggested by Alexander V Lukyanov).
+	+ Improved error reporting for infotocap translation errors.
+	+ Update terminfo.src to 9.13.14.
+
+960907	- snapshot
+	+ rewrote wgetstr to make it erase control chars and also fix bogus use
+	  of _nc_outstr which caused the display to not wrap properly (display
+	  problem reported by John M. Flinchbaugh <glynis@netrax.net>)
+	+ modify ncurses 'f' test to accommodate terminal responses to C1 codes
+	  (and split up this screen to accommodate non-ANSI terminals).
+	+ test enter_insert_mode and exit_insert_mode in has_ic().
+	+ removed bogus logic in mvcur that assumes nl/nonl set output modes
+	  (XSI says they are input modes; SVr4 implements this).
+	+ added macros SET_TTY, GET_TTY to term.h
+	+ correct getstr() logic that altered terminal modes w/o restoring.
+	+ disable ICRNL, etc., during initialization to match SVr4, removing
+	  the corresponding logic from raw, cbreak, etc.
+	+ disable ONLCR during initialization, to match SVr4 (this is needed
+	  for cursor optimization when the cursor-down is a newline).
+	+ replaced ESR's imitation of wresize with my original (his didn't
+	  work).
+
+960831	- snapshot
+	+ memory leaks (Alexander V. Lukyanov).
+	+ modified pnoutrefresh() to be more tolerant of too-large screen
+	  size (reported by Michael Elkins).
+	+ correct handling of terminfo files with no strings (Philippe De
+	  Muyter)
+	+ correct "tic -s" to take into account -I, -C options.
+	+ modify ncurses 'f' test to not print codes 80 through 9F, since they
+	  are considered control codes by ANSI terminals.
+
+960824	- snapshot
+	+ correct speed variable-type in 'tgetent()' (reported by Peter Wemm)
+	+ make "--enable-getcap" configuration-option work (reported by
+	  Peter Wemm <peter@spinner.DIALix.COM>)
+
+960820
+	+ correct err in 960817 that changed return-value of tigetflag()
+	  (reported by Alexander V. Lukyanov).
+	+ modify infocmp to use library default search-path for terminfo
+	  directory (Alexander V. Lukyanov).
+
+960817	- snapshot
+	+ corrected an err in mvcur that broke resizing-behavior.
+	+ correct fall-thru behavior of _nc_read_entry(), which was not finding
+	  descriptions that existed in directories past the first one searched
+	  (reported by Alexander V. Lukyanov)
+	+ corrected typo in dtterm description.
+	> patch 313 (ESR):
+	+ add dtterm description
+	+ clarify ncurses 'i' test (drop mvwscanw subtest)
+
+960810	- snapshot
+	+ correct nl()/nonl() to work as per SVr4 & XSI.
+	+ minor fixes to ncurses.c (use 'noraw()', mvscanw return-code)
+	+ refine configure-test for "-g" option (Tim Mooney).
+	+ correct interaction between O_BLANK and NEW_LINE request in form
+	  library (Juergen Pfeifer)
+
+960804
+	+ revised fix to tparm; previous fix reversed parameter order.
+	> patch 312 (ESR):
+	  correct terminfo.src corrupted by #310
+	> patch 311 (ESR):
+	+ fix idlok() and idcok() and the default of the idlok switch (report
+	  by Ville Sulko).
+
+960803	- snapshot
+	+ corrected tparm to handle capability strings without explicit pop
+	  (reported by William P Setzer)
+	+ add fallback def for GCC_NORETURN, GCC_UNUSED for termcap users
+	  (reported by Tim Mooney).
+	> patch 310 (ESR):
+	+ documentation and prototyping errors for has_color, immedok and idcok
+	  (reported by William P Setzer <wsetzer@pams.ncsu.edu>)
+	+ updated qnx terminfo entry (patch by Michael Hunter)
+
+960730
+	+ eliminate quoted includes in ncurses subdirectory, ensure config.h
+	  is included first.
+	+ newterm initializes terminal settings the same as initscr (reported
+	  by Tim Mooney).
+
+960727	- snapshot
+	+ call cbreak() in initscr(), as per XSI & SVr4.
+	+ turn off hardware echo in initscr() as per XSI & SVr4
+	> patch 309 (ESR):
+	+ terminfo changes (9.3.9), from BRL
+	+ add more checks to terminfo parser.
+	+ add more symbols to infocmp.
+
+960720	- snapshot
+	+ save previous-attribute in lib_vidattr.c if SP is null (reported by
+	  Juergen Fluk <louis@dachau.marco.de>)
+	+ corrected calls on _nc_render so that background character is set
+	  as per XSI.
+	+ corrected wbkgdset macro (XSI allows background character to be
+	  null), and tests that use it.
+	+ more corrections to terminfo (xterm & rxvt)
+	+ undid change to mcprint prototype (cannot use size_t in curses.h
+	  because not all systems declare it in the headers that we can safely
+	  include therein).
+	+ move the ifdefs for errno into curses.priv.h
+	> patch 308 (ESR):
+	+ terminfo changes (9.3.8)
+	+ modified logic of error-reporting in terminfo parser
+	+ fix option-processing bug in toe.
+
+960713	- snapshot
+	+ always check for <sys/bsdtypes.h> since ISC needs it to declare
+	  fd_set (Juergen Pfeifer)
+	+ install shared-libraries on NetBSD/FreeBSD with ABI-version (reported
+	  by Juergen Pfeifer, Mike Long)
+	+ add LOCAL_LDFLAGS2 symbol (Juergen Pfeifer)
+	+ corrected prototype for delay_output() -- bump ABI to 3.2
+	+ patch 307 (ESR):
+	+ enable more translations of nonstandard caps, and document them.
+	+ misc/terminfo.src update to 9.13.8
+	+ patch 306 (ESR):
+	+ moved logic that filters out rmul and rmso from setupterm to newterm
+	  where it is less likely to interfere with termcap applications.
+	+ cosmetic fixes to test/ncurses.c
+	+ modify open() call in ncurses/read_entry.c to use O_RDONLY symbol
+	  rather than constant (report by mib).
+	+ misc/terminfo.src sgr0 and acsc changes (report by Philippe De
+	  Muyter).
+	+ modify ncurses/comp_parse.c so that entries containing a "+" can
+	  have missing rmcup vs smcup.
+
+960707
+	+ rollback ESR's #305 change to terminfo.src (it breaks existing
+	  applications, e.g., 'less 290').
+	+ correct path of edit_man.sh, and fix typo that made all man-pages
+	  preformatted.
+	+ restore man/menu_requestname.3x omitted in Zeyd's resync (oops).
+	+ auto-configure the GCC_PRINTFLIKE/GCC_SCANFLIKE macros (reported by
+	  Philippe De Muyter).
+
+960706	- snapshot
+	+ make lib_vidattr.c more readable using macros.
+	+ filter out rmul, rmso that conflict with sgr0 when reading terminal
+	  descriptions.
+	+ work around autoconf bug, force $INSTALL to absolute path
+	  (reported by Zeyd).
+	+ modify man-page install for BSDI to install preformatted .0 files
+	  (reported by David MacKenzie).
+	+ add/use gcc __attribute__ for printf and scanf in curses.h
+	+ added SGR attributes test-case to ncurses
+	+ revised ncurses 't' logic to show trace-disable effect in the menu.
+	+ use getopt in ncurses program to process -s and -t options.
+	+ make ncurses 'p' legend toggle with '?'
+	+ disable scrollok during the ncurses 'p' test; if it is enabled the
+	  stdscr will scroll when putting the box-corners in the lower-right
+	  of the screen.
+	> patch 305 (ESR):
+	+ added sanity-checking of various paired string attributes.
+	+ misc/terminfo.src update to 9.13.7 (report by A. Lukyanov).
+	+ modify man/Makefile.in to make terminfo.5 during normal build.
+	> patch 304 (ESR):
+	+ corrected allocation-length for $HOME/.terminfo path.
+
+960629	- snapshot
+	+ check return code of _nc_mvcur_scrolln() in _nc_scroll_optimize() for
+	  terminals with no scrolling-support (reported by Nikolay Shadrin
+	  <queen@qh.mirea.ac.ru>)
+	+ added ^S scrollok-toggle to ncurses 'g' test.
+	+ added ^T trace-toggle to ncurses tests.
+	+ modified ncurses test program to use ^Q or ESC consistently for
+	  terminating tests (rather than ^D), and to use control keys rather
+	  than function keys in 'g' test.
+	+ corrected misplaced wclrtoeol calls in addch to accommodate wrapping
+	  (reported by Philippe De Muyter).
+	+ modify lib_doupdate.c to use effective costs to tradeoff between
+	  delete-character/insert-character vs normal updating (reported by
+	  David MacKenzie).
+	+ compute effective costs for screen update operations (e.g., clr_eos,
+	  delete_character).
+	+ corrected error in knight.c exposed by wrap fixes in 960622; the
+	  msgwin needed scrollok set.
+	+ corrected last change to IDcTransformLine logic to avoid conflict
+	  between PutRange and InsStr
+	+ modified run_tic.sh to not use /usr/tmp (reported by David
+	  MacKenzie), and further revised it and aclocal.m4 to use $TMPDIR if
+	  set.
+	+ corrected off-by-one in RoomFor call in read_entry.c
+
+960622	- snapshot
+	+ modified logic that wraps cursor in addch to follow the XSI spec,
+	  (implemented in SVr4) which states that the cursor position is
+	  updated when wrapping.  Renamed _NEED_WRAP to _WRAPPED to reflect the
+	  actual semantics.
+	+ added -s option to tic, to provide better diagnostics in run_tic.sh
+	+ improved error-recovery for tabset install.
+	+ change ABI to 3.1 (dropped tparam, corrected getbkgd(), added
+	  _yoffset to WINDOW).
+	+ modified initialization of SP->_ofp so that init_acs() is called with
+	  the "right" file pointer (reported by Rick Marshall <rjm@nlc.net.au>
+	+ documentation fixes (Juergen Pfeifer).
+	+ corrected, using new SCREEN and WINDOW members, the behavior of
+	  ncurses if one uses ripoffline() to remove a line from the top of the
+	  screen (Juergen Pfeifer).
+	+ modified autoconf scripts to prepare for Ada95 (GNAT) binding to
+	  ncurses (Juergen Pfeifer).
+	+ incorrect buffer-size in _nc_read_entry, reported by ESR.
+
+960617
+	+ corrected two logic errors in read_entry.c, write_entry.c (called by
+	  tic, the write/read of terminfo entries used inconsistent rules for
+	  locating the entries; the $TERMINFO_DIRS code would find only the
+	  first entry in a list).
+	+ refined pathname computation in run_tic.sh and shlib.
+	+ corrected initialization of $IP in misc/run_tic.sh
+
+960615	- snapshot
+	+ ifdef'd out _nc_hash_map() call because it does not improve speed.
+	+ display version of gcc if configure script identifies it.
+	+ modify configure script to use /usr as Linux's default prefix.
+	+ modify run_tic.sh to use shlib script, fixes some problems installing
+	  with a shared-library configuration.
+	+ adjusted configure script so that it doesn't run tests with the
+	  warnings turned on, which makes config.log hard to read.
+	+ added 'lint' rule to top-level Makefile.
+	+ added configure option '--with-install-prefix' for use by system
+	  builders to install into staging locations (requested by
+	  Charles Levert <charles@comm.polymtl.ca>).
+	+ corrected autoconfigure for Debian man program; it's not installed
+	  as "man_db".
+	+ set noecho in 'worm'; it was ifdef'd for debug only
+	+ updated test/configure.in for timing-display in ncurses 'p' test
+	+ corrected misspelled 'getbkgd()'.
+	+ corrected wbkgdset to work like observed syvr4 (sets A_CHARTEXT part
+	  to blank if no character given, copies attributes to window's
+	  attributes).
+	+ modified lib_doupdate.c to use lower-level SP's current_attr state
+	  instead of curscr's state, since it is redundant.
+	+ correction to IDcTransformLine logic which controls where InsStr is
+	  invoked (refined by Alexander V Lukyanov).
+	> patch 303 (ESR):
+	+ conditionally include Chris Torek's hash function _nc_hash_map().
+	+ better fix for nvi refresh-bug (Rick Marshall)
+	+ fix for bug in handling of interrupted keystroke waits,
+	  (Werner Fleck).
+	+ misc/ncurses-intro.html syntax fix (Kajiyama Tamito).
+
+960601	- snapshot
+	+ auto-configure man-page compression-format and renames for Debian.
+	+ corrected several typos in curses.h.in (i.e., the mvXXXX macros).
+	+ re-order curses.priv.h for lint.
+	+ added rules for lintlib, lint
+	+ corrected ifdef for BROKEN_LINKER in MKnames.awk.in
+	+ corrected missing INSTALL_DATA in misc/Makefile.in
+	+ flush output when changing cursor-visibility (Rick Marshall)
+	+ fix a minor bug in the _nc_ripoff() routine and improve error
+	  checking when creating the label window (Juergen Pfeifer).
+	+ enhancement to the control over the new PC-style soft key format.
+	  allow caller now to select whether or not one wants to have
+	  the index-line; see curs_slk.3x for documentation (Juergen Pfeifer).
+	+ typos, don't use inline with "-g" (Philippe De Muyter)
+	+ fixes for menus & wattr-, slk-functions (Juergen Pfeifer)
+
+960526	- snapshot
+	+ removed --with-ticdir option altogether, maintain compatibility with
+	  existing applications via symbolic link in run_tic.sh
+	+ patch for termio.h, signal (Philippe De Muyter)
+	+ auto-configure gcc warning options rather than infer from version.
+	+ auto-configure __attribute__ for different gcc versions.
+	+ corrected special use of clearok() in hardscroll.c by resetting flag
+	  in wrefresh().
+	+ include stdlib.h before defs for EXIT_SUCCESS, for OSF/1.
+	+ include sys/types.h in case stdlib.h does not declare size_t.
+	+ fixes for makefile (Tim Mooney)
+	+ fixes for menus & forms (Juergen Pfeifer)
+	> patch 302 (ESR):
+	+ improve hash function (suggested by Alexander V Lukyanov).
+	+ 9.13.4 update for terminfo.src
+
+960518	- snapshot
+	+ revised ncurses.c panner test, let pad abut all 4 sides of screen.
+	+ refined case in lib_doupdate.c for ClrToEOL().
+	+ corrected prior change for PutRange (Alexander V Lukyanov
+	  <lav@yars.free.net>).
+	+ autoconf mods (Tim Mooney <mooney@dogbert.cc.ndsu.NoDak.edu>).
+	+ locale fix for forms (Philippe De Muyter <phdemuyt@ulb.ac.be>)
+	+ renamed "--with-datadir" option to "--with-ticdir" to avoid
+	  confusion, and made this check for the /usr/lib/terminfo pre-existing
+	  directory.
+	> patches 299-301 (ESR):
+	+ html fixes (Phillippe de Muyter).
+	+ fix typo in ncurses-intro.html (report by Fabrizio Polacco).
+	+ added hashmap.c
+	+ mods to tracing, especially for ACS chars.
+	+ corrected off-by-one in IDCtransform.
+	+ corrected intermittent mouse bug by using return-value from read().
+	+ mods to parse_entry.c, for smarter defaults.
+
+960512
+	+ use getopt in 'tic'; added -L option and modified -e option to allow
+	  list from a file.
+
+960511
+	+ don't use fixed buffer-size in tparm().
+	+ modified tic to create terminfo directory if it doesn't exist.
+	+ added -T options to tic and infocmp (for testing/analysis)
+	+ refined the length criteria for termcap and terminfo
+	+ optimize lib_doupdate with memcpy, PutRange
+	> patches 297, 298 (ESR):
+	+ implement TERMINFO_DIRS, and -o option of tic
+	+ added TRACE_IEVENT
+	+ fix REQ_TOGGLE_ITEM in menu/menu_driver.c; it could select but not
+	  deselect.
+	+ added lib_print.c (request by Rick Marshall).
+	+ added has_key() (request by Juergen Pfeifer).
+	+ do not issue clrtoeol or clrtobot if the relevant portion of the line
+	  is already blank (analysis by Keith Bostic).
+	+ add parentheses for parameters of COLOR_PAIR and PAIR_NUMBER macros
+	  (analysis by Jurgen Eidt).
+	+ update screen's notion of cursor position in endwin() (analysis by
+	  Alexander Lukyanov).
+	+ added 't' to ncurses.c test.
+	+ moved delay_output() to lib_tputs.c
+	+ removed tparam() (was added in 1.9.9, but conflicts with emacs and
+	  is not part of X/Open Curses).
+	+ removed boolean version of 'getm'.
+	+ misc cursor & optimization fixes.
+
+960504	- snapshot
+	+ modified ncurses 'p' test to allow full-screen range for panner size.
+	+ fixes for locale (Philippe De Muyter <phdm@labauto1.ulb.ac.be>)
+	+ don't use fixed buffer-size in fmt_entry().
+	+ added usage-message to 'infocmp'.
+	+ modified install.includes rules to prepend subdirectory-name to
+	  "#include" if needed.
+
+960430
+	+ protect wrefresh, wnoutrefresh from invocation with pad argument.
+	+ corrected default CCFLAGS in test/Makefile.
+
+960428	- snapshot
+	+ implemented logic to support terminals with background color erase
+	  (e.g., rxvt and the newer color xterm).
+	+ improved screen update logic (off-by-one logic error; use clr_eos if
+	  possible)
+
+960426	- snapshot
+	+ change ncurses 'a' test to run in raw mode.
+	+ make TIOCGWINSZ configure test less stringent, in case user
+	  configures via terminal that cannot get screen size.
+	> patches 295, 296 (ESR):
+	+ split lib_kernel.c, lib_setup.c and names.c in order to reduce
+	  overhead for programs that use only termcap features.
+	+ new "-e" and "-h" options of tic (request by Tony Nugent).
+	+ fix bug in mandatory-delay logic in lib_tputs.c (report by Sven
+	  Verdoolaege).
+	+ fix for "infocmp -e" to emit correct initializers (reported by Manual
+	  J Novoa III).
+	+ restore working-directory in read_termcap.c (report by Kayvan
+	  Sylvan).
+	+ use "-h" option on Solaris when generating shared libraries on
+	  Solaris 2.5 to record the library name in the file, for assisting
+	  the loader (patch by Scott Kramer).
+	+ undo patch #294 changes to form and menu libraries (request by
+	  Juergen Pfeifer).
+
+960418	- snapshot
+	+ use autoconf 2.9
+	+ fix for AIX 3.2.5 (must define _POSIX_SOURCE to get termios struct
+	  definitions via <termios.h>, modified macros in lib_raw.c to avoid
+	  K&R-style substitution)
+	> patches 293, 294 (ESR):
+	+ rewrite wsyncup(), wsyncdown(), as well as small fixes to form and
+	  menu libraries to fix echo-breakage introduced by 1.8.9, 1.9.9e
+	  changes (patches by Juergen Pfeifer).
+	+ fix compile under QNX 4.2 by defining ONLCR in lib_raw.c when
+	  __QNX__ is defined (patch by Michael Hunter).
+	+ modify setupterm() to match documentation for its return value, fix
+	  newterm to work with this change (report by Emmet Lazich).
+	+ add checks in getch() for error, return ERR as appropriate (report by
+	  Emmet Lazich).
+	+ mods to wgetch() in cooked mode (report by Pete Seebach).
+	+ corrected askuser() logic in tset (patch by Remco Treffkorn).
+	+ correct interaction of endwin() with mouse processing (report by
+	  Michael Elkins).
+	+ added trace support for TTY flags
+	+ update terminfo.src to 9.13.1
+	+ FreeBSD console entries (patch by Andrew Chernov).
+
+960406
+	+ fixes for NeXT, ISC and HPUX auto-configure
+	+ autogenerate development header-dependencies (config.h, *.priv.h)
+	+ corrected single-column formatting of "use=" (e.g., in tic)
+	+ modify tic to read full terminfo-names
+	+ corrected divide-by-zero that caused hang (or worse) when redirecting
+	  output
+	+ modify tic to generate directories only as-needed (and corrected
+	  instance of use of data from function that had already returned).
+
+### ncurses-1.9.8a -> 1.9.9e
+
+* fixed broken wsyncup()/wysncdown(), as a result wnoutrefresh() now has
+  copy-changed-lines behavior.
+* added and documented wresize() function.
+* more fixes to LOWER-RIGHT corner handling.
+* changed the line-breakout optimization code to allow some lines to be
+  emitted before the first check.
+* added option for tic to use symbolic instead of hard links (for AFS)
+* fix to restore auto-wrap mode.
+* trace level can be controlled by environment variable.
+* better handling of NULs in terminal descriptions.
+* improved compatibility with observed SVR4 behavior.
+* the refresh behavior of over-lapping windows is now more efficient and
+  behaves like SVR4.
+* use autoconf 2.7, which results in a working setup for SCO 5.0.
+* support for ESCDELAY.
+* small fixes for menu/form code.
+* the test directory has its own configure.
+* fixes to pads when optimizing scrolling.
+* fixed several off-by-one bugs.
+* fixes for termcap->terminfo translation; less restrictions more correct
+  behavior.
+
+### ncurses-1.9.7 -> 1.9.8a
+
+* teach infocmp -i to recognize ECMA highlight sequences
+* infocmp now dumps all SVr4 termcaps (not just the SVr4 ones) on -C
+* support infocmp -RBSD.
+* satisfy XSI Curses requirement that every macro be available as a function.
+* This represents the last big change to the public interface of ncurses. The
+  ABI_VERSION has now been set at 3.0 and should stay there barring any great
+  catastrophies or acts of God.
+* The C++ has been cleaned up in reaction to the changes to satisfy XSI's
+  requirements.
+* libncurses now gets linked to libcurses to help seamless emulation
+  (replacement) of a vendor's curses. --disable-overwrite turns this behavior
+  off.
+
+### ncurses-1.9.6 -> 1.9.7
+
+* corrected return values of setupterm()
+* Fixed some bugs in tput (it does padding now)
+* fixed a bug in tic that made it do the wrong thing on entries with more than
+  one `use' capability.
+* corrected the screen-size calculation at startup time to alter the
+  numeric capabilities as per SVr4, not just LINES and COLS.
+* toe(1) introduced; does what infocmp -T used to.
+* tic(1) can now translate AIX box1 and font[0123] capabilities.
+* tic uses much less core, the dotic.sh kluge can go away now.
+* fix read_entry() and write_entry() to pass through cancelled capabilities OK.
+* Add $HOME/.terminfo as source/target directory for terminfo entries.
+* termcap compilation now automatically dumps an entry to $HOME/.terminfo.
+* added -h option to toe(1).
+* added -R option to tic(1) and infocmp(1).
+* added fallback-entry-list feature.
+* added -i option to infocmp(1).
+* do a better job at detecting if we're on SCO.
+
+### ncurses-1.9.5 -> 1.9.6
+
+* handling of TERMCAP environment variables now works correctly.
+* various changes to shorten termcap translations to less that 1024 chars.
+* tset(1) added
+* mouse support for xterm.
+* most data tables are now const and accordingly live in shareable text space.
+* Obey the XPG4/SVr4 practice that echo() is initially off.
+* tic is much better at translating XENIX and AIX termcap entries now.
+* tic can interpret ko capabilities now.
+* integrated Juergen Pfeifer's forms library.
+* taught write_entry() how not to write more than it needs to; this change
+  reduces the size of the terminfo tree by a full 26%!
+* infocmp -T option added.
+* better warnings about historical tic quirks from tic.
+
+### ncurses 1.9.4 -> 1.9.5
+
+* menus library is now included with documentation.
+* lib_mvcur has been carefully profiled and tuned.
+* Fixed a ^Z-handling bug that was tanking lynx(1).
+* HJ Lu's patches for ELF shared libraries under Linux
+* terminfo.src 9.8.2
+* tweaks for compiling in separate directories.
+* Thomas Dickey's patches to support NeXT's brain-dead linker
+* Eric Raymond's patches to fix problems with long termcap entries.
+* more support for shared libraries under SunOS and IRIX.
+
+### ncurses 1.9.3 -> 1.9.4
+
+* fixed an undefined-order-of-evaluation bug in lib_acs.c
+* systematically gave non-API public functions and data an _nc_ prefix.
+* integrated Juergen Pfeifer's menu code into the distribution.
+* totally rewrote the knight test game's interface
+
+### ncurses 1.9.2c -> 1.9.3
+
+* fixed the TERMCAP_FILE Support.
+* fixed off-by-one errors in scrolling code
+* added tracemunch to the test tools
+* took steps to cut the running time of make install.data
+
+### ncurses 1.9.2c -> 1.9.2d
+
+* revised 'configure' script to produce libraries for normal, debug,
+  profile and shared object models.
+
+### ncurses 1.9.1 -> 1.9.2
+
+* use 'autoconf' to implement 'configure' script.
+* panels support added
+* tic now checks for excessively long termcap entries when doing translation
+* first cut at eliminating namespace pollution.
+
+### ncurses 1.8.9 -> 1.9
+
+* cleanup gcc warnings for the following: use size_t where 'int' is not
+  appropriate, fixed some shadowed variables, change attr_t to compatible with
+  chtype, use attr_t in some places where it was confused with 'int'.
+* use chtype/attr_t casts as appropriate to ensure portability of masking
+  operations.
+* added-back waddchnstr() to lib_addstr.c (it had been deleted).
+* supplied missing prototypes in curses.h
+* include <termcap.h> in lib_termcap.c to ensure that the prototypes
+  are consistent (they weren't).
+* corrected prototype of tputs in <termcap.h>
+* rewrote varargs parsing in lib_tparm.c (to avoid referencing memory
+  that may be out of bounds on the stack) -- Purify found this.
+* ensure that TRACE is defined in lib_trace.c (to solve prototype
+  warnings from gcc).
+* corrected scrolling-region size in 'mvcur_wrap()'
+* more spelling fixes
+* use 'calloc()' to allocate WINDOW struct in lib_newwin.c (Purify).
+* set default value for SP->_ofp in lib_set_term.c (otherwise SunOS dumps
+  core in init_acs()).
+* include <errno.h> in write_entry.c (most "braindead" includes declare errno
+  in that file).
+
+### ncurses 1.8.8 -> 1.8.9
+
+* compile (mostly) clean with gcc 2.5.8 -Wall -Wstrict-prototypes
+  -Wmissing-prototypes -Wconversion and using __attribute__ to flush out
+  non-portable use of "%x" for pointers, or for chtype data (which is declared
+  as a long).
+* modified doupdate to ensure that typahead was turned on before attempting
+  select-call (otherwise, some implementations hang).
+* added trace mask TRACE_FIFO, use this in lib_getch.c to allow finer
+  resolution of traces.
+* improved bounds checking on several critical functions.
+* the data directory has been replaced by the new master terminfo file.
+* -F file-comparison option added to infocmp.
+* compatibility with XSI Curses is now documented in the man bages.
+* wsyncup/wsyncdown functions are reliable now; subwindow code in general
+  is much less flaky.
+* capabilities ~msgr, tilde_glitch, insert_padding, generic_type, no_pad_char,
+  memory_above, memory_below, and hard_copy are now used properly.
+* cursor-movement optimization has been completely rewritten.
+* vertical-movement optimization now uses hardware scrolling, il, dl.
+
+### ncurses 1.8.7 -> 1.8.8
+* untic no longer exists, infocmp replaces it.
+* tic can understand termcap now, especially if it is called captoinfo.
+* The Linux Standard Console terminfo entry is called linux insead of console.
+  It also uses the kernel's new method of changing charsets.
+* initscr() will EXIT upon error (as the docs say) This will mostly happen if
+  you try to run on an undefined terminal.
+* I can get things running on AIX but tic can't compile terminfo. I have to
+  compile entries on another machine. Volunteers to hunt this bug are welcome.
+* wbkgd() and wbkgdset() can be used to set a windows background to color.
+  wclear()/werase() DO NOT use the current attribute to clear the screen.
+  This is the way SVR4 curses works. PDCurses 2.1 is broken in this respect,
+  though PDCurses 2.2 has been fixed.
+* cleaned up the test/ directory.
+* test/worm will segfault after quite a while.
+* many spelling corrections courtesy of Thomas E. Dickey
+
+### ncurses 1.8.6 -> 1.8.7
+* cleaned up programs in test/ directory.
+* fixed wbkgdset() macro.
+* modified getstr() to stop it from advancing cursor in noecho mode.
+* modified linux terminfo entry to work with the latest kernel to get
+  the correct alternate character set.
+* also added a linux-mono entry for those running on monochrome screens.
+* changed initscr() so that it behaves like the man page says it does.
+  this fixes the problem with programs in test/ crashing with SIGSEV if
+  a terminal is undefined.
+* modified addch() to avoid using any term.h #define's
+* removed duplicate tgoto() in lib_tparm.c
+* modified dump_entry.c so that infocmp deals correctly with ',' in acsc
+* modified delwin() to correctly handle deleting subwindows.
+* fixed Makefile.dist to stop installing an empty curses.h
+* fixed a couple of out-of-date notes in man pages.
+
+### ncurses 1.8.5 -> 1.8.6
+* Implemented wbkgd(), bkgd(), bkgdset(), and wbkgdset().
+* The handling of attributes has been improved and now does not turn off color
+  if other attributes are turned off.
+* scrolling code is improved. Scrolling in subwindows is still broken.
+* Fixes to several bugs that manifest them on platforms other than Linux.
+* The default to meta now depends on the status of the terminal when ncurses
+  is started.
+* The interface to the tracing facility has changed.  Instead of the pair of
+  functions traceon() and traceoff(), there is just one function trace() which
+  takes a trace mask argument.  The trace masks, defined in curses.h, are
+  as follows:
+
+	#define TRACE_DISABLE   0x00    /* turn off tracing */
+	#define TRACE_ORDINARY  0x01    /* ordinary trace mode */
+	#define TRACE_CHARPUT   0x02    /* also trace all character outputs */
+	#define TRACE_MAXIMUM   0x0f    /* maximum trace level */
+
+  More trace masks may be added, or these may be changed, in future releases.
+* The pad code has been improved and the pad test code in test/ncurses.c has
+  been improved.
+* The prototype ansi entry has been changed to work with a wider variety
+  of emulators.
+* Fix to the prototype ansi entry that enables it to work with PC emulators
+  that treat trailing ";m" in a highlight sequence as ";0m"; this doesn't
+  break operation with any emulators.
+* There are now working infocmp, captoinfo, tput, and tclear utilities.
+* tic can now compile entries in termcap syntax.
+* Core-dump bug in pnoutrefresh fixed.
+* We now recognize and compile all the nonstandard capabilities in Ross
+  Ridge's mytinfo package (rendering it obsolete).
+* General cleanup and documentation improvements.
+* Fixes and additions to the installation-documentation files.
+* Take cursor to normal mode on endwin.
+
+### ncurses 1.8.4 -> 1.8.5
+* serious bugs in updating screen which caused erratic non-display,
+  fixed.
+* fixed initialization for getch() related variable which cause
+  unpredictable results.
+* fixed another doupdate bug which only appeared if you have
+  parm_char.
+* implemented redrawln() and redrawwin().
+* implemented winsnstr() and related functions.
+* cleaned up insertln() and deleteln() and implemented (w)insdeln().
+* changed Makefile.dist so that installation of man pages will
+  take note of the terminfo directory.
+* fixed Configure (removed the mysterious 'X').
+* Eric S. Raymond fixed the script.* files so that they work with
+  stock awk.
+
+#### ncurses 1.8.3 -> 1.8.4 #### ####
+* fixed bug in refreshing the screen after return from shell_mode.
+  There are still problems but they don't manifest themselves on
+  my machine (Linux 0.99.14f).
+* added wgetnstr() and modified things accordingly.
+* fixed the script.src script.test to work with awk not just gawk.
+* Configure can now take an argument of the target system.
+* added test/ncurses.c which replaces several other programs and
+  performs more testing.
+[Thanks to Eric S Raymond for the last 4]
+* more fixes to lib_overlay.c and added test/over.c to illustrate
+  how it works.
+* fixed ungetch() to take int instead of ch.
+* fixes to cure wgetch() if flushinp() is called.
+
+One note I forgot to mention in 1.8.3 is that tracing is off by
+default starting in the version. If you want tracing output, put
+traceon(); in your code and link with -ldcurses.
+
+#### ncurses 1.8.2 -> ncurses 1.8.3 #### ####
+MAJOR CHANGES:
+1) The order of capabilities has been changed in order to achieve
+binary compatibility with SVR4 terminfo database. This has the
+unfortunate effect of breaking application currently linked with
+ncurses. To ensure correct behavior, recompile all such programs.
+Most programs using color or newer capabilities will break, others
+will probably continue to work ok.
+
+2) Pavel Curtis has renounced his copyright to the public domain.
+This means that his original sources (posted to comp.sources.unix,
+volume 1) are now in the public domain.  The current sources are
+NOT in the public domain, they are copyrighted by me.  I'm
+entertaining ideas on what the new terms ncurses is released under.
+
+3) Eric S. Raymond has supplied a complete set of man pages for
+ncurses in ?roff format. They will eventually replace most of the
+current docs. Both sets are included in this release.
+
+Other changes and notes from 1.8.2 include:
+* SIGSEGV during scrolling no longer occurs.
+* Other problems with scrolling and use of idl have been corrected.
+* lib_getch.c has been re-written and should perform flawlessly.
+  please use test/getch.c and any other programs to test this.
+* ripoffline() is implemented (Thanks to Eric) and slk_ functions
+  changed accordingly.
+* I've added support for terminals that scroll if you write in the
+  bottom-right corner.
+* fixed more bugs in pads code. If anybody has a program that uses
+  pads I'd love a copy.
+* correct handling for terminal with back_color_erase capability
+  (such as Linux console, and most PC terminals)
+* ^Z handling apparently didn't work (I should never trust code
+  sent me to me without extensive testing). It now seems to be
+  fixed. Let me know if you have problems.
+* I've added support for Apollo and NeXT, but it may still be
+  incomplete, especially when dealing with the lack of POSIX
+  features.
+* scrolling should be more efficient on terminals with idl
+  capabilities. Please see src/lib_scroll.c for more notes.
+* The line drawing routines were offset by 1 at both ends. This
+  is now fixed.
+* added a few missing prototypes and macros (e.g. setterm())
+* fixed code in src/lib_overlay.c which used to crash.
+* added a few more programs in test/ The ones from the PDCurses
+  package are useful, especially if you have SVR4 proper. I'm
+  interested in the results you get on such a systems (Eric? ;-).
+  They already exposed certain bugs in ncurses.
+* See src/README for porting notes.
+* The C++ code should really replace ncurses.h instead of working
+  around it. It should avoid name-space clashes with nterm.h (use
+  rows instead of lines, etc.)
+* The C++ should compile ok. I've added explicit rules to the
+  Makefile because no C++ defaults are documented on the suns.
+* The docs say that echo() and nocbreak() are mutually exclusive.
+  At the moment ncurses will switch to cbreak() if the case above
+  occurs. Should it continue to do so? How about echo() and noraw()?
+* PDCurses seem to assume that wclear() will use current attribute
+  when clearing the screen. According to Eric this is not the case
+  with SVR4.
+* I have discovered, to my chagrin, SunOS 4.x (and probably other systems)
+  * doesn't have vsscanf and God knows what else!  I've will do a vsscanf().
+* I've also found out that the src/script.* rely on gawk and will not
+  work with stock awk or even with nawk. Any changes are welcome.
+* Linux is more tolerant of NULL dereferences than most systems. This
+  fact was exposed by hanoi.
+* ncurses still seems inefficient in drawing the screen on a serial
+  link between Linux and suns. The padding may be the culprit.
+* There seems to be one lingering problem with doupdate() after shelling
+  out. Despite the fact the it is sending out the correct information
+  to the terminal, nothing takes effect until you press ^L or another
+  refresh takes place. And yes, output does get flushed.
+
+#### ncurses 1.8.1 -> ncurses 1.8.2 #### Nov 28, 1993 ####
+
+* added support for SVR4 and BSDI's BSD/386.
+* major update and fix to scrolling routine.
+* MORE fixes to stuff in lib_getch.c.
+* cleaned-up configuration options and can now generate
+	Config.* files through an awk script.
+* changed setupterm() so it can be called more than once,
+	add added set_curterm(), del_curterm().
+* a few minor cleanups.
+* added more prototypes in curses.h
+
+#### ncurses 1.8 -> ncurses 1.8.1 #### Nov 4, 1993 ####
+
+* added support for NeXTStep 3.0
+* added termcap emulation (not well tested).
+* more complete C++ interface to ncurses.
+* fixed overlay(), overwrite(), and added copywin().
+* a couple of bug fixes.
+* a few code cleanups.
+
+#### ncurses 0.7.2/0.7.3 -> ncurses 1.8 #### Aug 31, 1993 ####
+
+* The annoying message "can't open file." was due to missing
+  terminfo entry for the used terminal. It has now been
+  replaced by a hopefully more helpful message.
+* Problems with running on serial lines are now fixed.
+* Added configuration files for SunOS, Linux, HP/UX, Ultrix,
+  386bsd/BSDI (if you have others send'em to me)
+* Cleaner Makefile.
+* The documentation in manual.doc is now more uptodate.
+* update optimization and support for hp terminals, and 386bsd
+  console driver(s).
+* mvcur optimization for terminals without cursor addressing
+  (doesn't work on Linux)
+* if cursor moved since last update, getch() will refresh the
+  screen before working.
+* getch() & alarm() can now live together. in 0.7.3 a signal
+  interrupted getch() (bug or feature?) now the getch is
+  restarted.
+* scanw() et all were sick, now fixed.
+* support for 8-bit input (use meta()).
+* added default screen size to all terminfos.
+* added c++ Ncursesw class.
+* several minor bug fixes.
+
+#### ncurses 0.7.2 -> ncurses 0.7.3 #### May 27, 1993 ####
+
+* Config file to cope with different platforms (386BSD, BSDI, Ultrix, SunOS)
+* more fixes to lib_getch.c
+* changes related to Config
+
+#### ncurses 0.7 -> ncurses 0.7.2 #### May 22, 1993 ####
+
+* docs updated slightly (color usage is now documented).
+* yet another fix for getch(), this one fixes problems with ESC being swallowed
+  if another character is typed before the 1 second timeout.
+* Hopefully, addstr() and addch() are 8-bit clean.
+* fixed lib_tparm.c to use stdarg.h (should run on suns now)
+* order of capabilities changed to reflect that specified in SYSV
+  this will allow for binary-compatibility with existing terminfo dbs.
+* added halfdelay()
+* fixed problems with asc_init()
+* added A_PROTECT and A_INVIS
+* cleaned up vidputs()
+* general cleanup of the code
+* more attention to portability to other systems
+* added terminfos for hp70092 (won't work until changes to lib_update.c are
+  made) and 386BSD pcvt drivers.
+
+Thanks to Hellmuth Michaelis for his help.
+optimization code is slated for the next major release, stay tuned!
+
+#### ncurses 0.6/0.61 -> ncurses 0.7 #### April 1, 1993
+Please note that the next release will be called 1.8. If you want to know about
+the rationale drop me a line.
+
+Included are several test programs in test/.
+I've split up the panels library, reversi, tetris, sokoban. They are now
+available separately from netcom.com:pub/zmbenhal/
+
+* color and ACS support is now fully compatible with SYSV at the terminfo
+  level.
+* Capabilities now includes as many SYSV caps I could find.
+* tigetflag,tigetnum,tigetstr functions added.
+* boolnames, boolfnames, boolcodes numnames, numfnames, numcodes,
+  strnames, strfnames, strcodes arrays are now added.
+* keyname() is added.
+* All function keys can be defined in terminfo entries.
+* fixed lin_tparm.c to behave properly.
+* terminfo entries for vt* and xterm are included (improvements are welcome)
+* more automation in handling caps and keys.
+* included fixes from 0.6.1
+* added a few more missing functions.
+* fixed a couple of minor bugs.
+* updated docs JUST a little (still miles behind in documenting the newer
+	features).
+
+#### ncurses 0.6 -> ncurses 0.61 ####
+
+1) Included the missing data/console.
+
+2) allow attributes when drawing boxes.
+
+3) corrected usage of win->_delay value.
+
+4) fixed a bug in lib_getch.c. if it didn't recognize a sequence it would
+	simply return the last character in the sequence. The correct
+	behavior is to return the entire sequence one character at a time.
+
+#### ncurses0.5 -> ncurses0.6 #### March 1, 1993 ####
+* removed _numchngd from struct _win_st and made appropriate changes.
+* rewritten kgetch() to remove problems with interaction between alarm and
+  read(). It caused SIGSEGV every now and then.
+* fixed a bug that miscounted the numbers of columns when updating.
+  (in lib_doupdate.c(ClrUpdate() -- iterate to columns not columns-1)
+* fixed a bug that cause the lower-right corner to be incorrect.
+  (in lib_doupdate.c(putChar() -- check against columns not columns-1)
+* made resize() and cleanup() static to lib_newterm.c
+* added notimeout().
+* added timeout() define in curses.h
+* added more function prototypes and fixed napms.
+* added use_env().
+* moved screen size detection to lib_setup.c.
+* fixed newterm() to confirm to prototype.
+* removed SIGWINCH support as SYSV does not define its semantics.
+* cleaned-up lib_touch.c
+* added waddnstr() and relatives.
+* added slk_* support.
+* fixed a bug in wdeleteln().
+* added PANEL library.
+* modified Makefile for smoother installation.
+* terminfo.h is really term.h
+
+#### ncurses 0.4 -> ncurses 0.5 #### Feb 14, 1993 ####
+* changed _win_st structure to allow support for missing functionality.
+* Addition of terminfo support for all KEY_*.
+* Support for nodelay(), timeout(), notimeout().
+* fixed a bug with the keypad char reading that did not return ESC until
+  another key is pressed.
+* nl mapping no longer occur on output (as should be)
+  fixed bug '\n' no causing a LF.
+* fixed bug that reset terminal colors regardless of whether we use color
+  or not.
+* Better support for ACS (not quite complete).
+* fixed bug in wvline().
+* added curs_set().
+* changed from signal() to sigaction().
+* re-included the contents of important.patch into source.
+
+#### ncurses 0.3 -> ncurses 0.4 #### Feb 3, 1993 ####
+* Addition of more KEY_* definitions.
+* Addition of function prototypes.
+* Addition of several missing functions.
+* No more crashes if screen size is undefined (use SIGWINCH handler).
+* added a handler to cleanup after SIGSEGV (hopefully never needed).
+* changed SRCDIR from /etc/term to /usr/lib/terminfo.
+* renamed compile/dump to tic/untic.
+* New scrolling code.
+* fixed bug that reversed the sense of nl() and nonl().
+
+#### ncurses 0.2 -> ncurses 0.3 #### Jan 20, 1993 ####
+* more support for color and graphics see test/ for examples.
+* fixed various files to allow correct update after shelling out.
+* more fixes for updates.
+* no more core dumps if you don't have a terminfo entry.
+* support for LINES and COLUMNS environment variables.
+* support for SIGWINCH signal.
+* added a handler for SIGINT for clean exits.
+
+#### ncurses 0.1 -> ncurses 0.2 #### Aug 14, 1992 ####
+* support for color.
+* support for PC graphic characters.
+* lib_trace.c updated to use stdarg.h and vprintf routines.
+* added gdc.c (Great Digital Clock) as an example of using color.
+
+#### ncurses -> ncurses 0.1 #### Jul 31, 1992 ####
+* replacing sgtty stuff by termios stuff.
+* ANSIfication of some functions.
+* Disabling cost analysis 'cause it's incorrect.
+* A quick hack for a terminfo entry.
+
+-- vile:txtmode:
diff --git a/README b/README
new file mode 100644
index 0000000..84998f2
--- /dev/null
+++ b/README
@@ -0,0 +1,218 @@
+-------------------------------------------------------------------------------
+-- Copyright 2020,2021 Thomas E. Dickey                                      --
+-- Copyright 1998-2012,2018 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: README,v 1.29 2021/06/17 21:20:30 tom Exp $
+-------------------------------------------------------------------------------
+		README file for the ncurses package
+
+See the file ANNOUNCE for a summary of ncurses features and ports.
+See the file INSTALL for instructions on how to build and install ncurses.
+See the file NEWS for a release history and bug-fix notes.
+See the file TO-DO for things that still need doing, including known bugs.
+
+Browse the file misc/ncurses-intro.html for narrative descriptions of how
+to use ncurses and the panel, menu, and form libraries.
+
+Browse the file doc/html/hackguide.html for a tour of the package internals.
+
+ROADMAP AND PACKAGE OVERVIEW:
+
+You should be reading this file in a directory called:  ncurses-d.d, where d.d
+is the current version number (see the dist.mk file in this directory for
+that).  There should be a number of subdirectories, including `c++', `form',
+`man', `menu', `misc', `ncurses', `panel', `progs', `test', 'tack' and `Ada95'.
+(The 'tack' program may be distributed separately).
+
+A full build/install of this package typically installs several libraries, a
+handful of utilities, and a database hierarchy.  Here is an inventory of the
+pieces:
+
+The libraries are:
+
+	libncurses.a       (normal)
+	libncurses.so      (shared)
+	libncurses_g.a     (debug and trace code enabled)
+	libncurses_p.a     (profiling enabled)
+
+	libpanel.a         (normal)
+	libpanel.so        (shared)
+	libpanel_g.a       (debug and trace code enabled)
+
+	libmenu.a          (normal)
+	libmenu.so         (shared)
+	libmenu_g.a        (debug enabled)
+
+	libform.a          (normal)
+	libform.so         (shared)
+	libform_g.a        (debug enabled)
+
+If you configure using the --enable-widec option, a "w" is appended to the
+library names (e.g., libncursesw.a), and the resulting libraries support
+wide-characters, e.g., via a UTF-8 locale.  The corresponding header files
+are compatible with the non-wide-character configuration; wide-character
+features are provided by ifdef's in the header files.  The wide-character
+library interfaces are not binary-compatible with the non-wide-character
+version.
+
+If you configure using the --enable-reentrant option, a "t" is appended to the
+library names (e.g., libncursest.a) and the resulting libraries have a
+different binary interface which makes the ncurses interface more "opaque".
+
+The ncurses libraries implement the curses API.  The panel, menu and forms
+libraries implement clones of the SVr4 panel, menu and forms APIs.  The source
+code for these lives in the `ncurses', `panel', `menu', and `form' directories
+respectively.
+
+In the `c++' directory, you'll find code that defines an interface to the
+curses, forms, menus and panels library packaged as C++ classes, and a demo program in C++
+to test it.  These class definition modules are not installed by the 'make
+install.libs' rule as libncurses++.
+
+In the `Ada95' directory, you'll find code and documentation for an
+Ada95 binding of the curses API, to be used with the GNAT compiler.
+This binding is built by a normal top-level `make' if configure detects
+an usable version of GNAT (3.11 or above). It is not installed automatically.
+See the Ada95 directory for more build and installation instructions and
+for documentation of the binding.
+
+To do its job, the ncurses code needs your terminal type to be set in the
+environment variable TERM (normally set by your OS; under UNIX, getty(1)
+typically does this, but you can override it in your .profile); and, it needs a
+database of terminal descriptions in which to look up your terminal type's
+capabilities.
+
+In older (V7/BSD) versions of curses, the database was a flat text file,
+/etc/termcap; in newer (USG/USL) versions, the database is a hierarchy of
+fast-loading binary description blocks under /usr/lib/terminfo.  These binary
+blocks are compiled from an improved editable text representation called
+`terminfo' format (documented in man/terminfo.5).  The ncurses library can use
+either /etc/termcap or the compiled binary terminfo blocks, but prefers the
+second form.
+
+In the `misc' directory, there is a text file terminfo.src, in editable
+terminfo format, which can be used to generate the terminfo binaries (that's
+what make install.data does).  If the package was built with the
+--enable-termcap option enabled, and the ncurses library cannot find a terminfo
+description for your terminal, it will fall back to the termcap file supplied
+with your system (which the ncurses package installation leaves strictly
+alone).
+
+The utilities are as follows:
+
+	tic             -- terminfo source to binary compiler
+	infocmp         -- terminfo binary to source decompiler/comparator
+	clear           -- emits clear-screen for current terminal
+	tabs            -- set tabs on a terminal
+	tput            -- shell-script access to terminal capabilities.
+	toe             -- table of entries utility
+	tset            -- terminal-initialization utility
+
+The first two (tic and infocmp) are used for manipulating terminfo
+descriptions; the next two (clear and tput) are for use in shell scripts.  The
+last (tset) is provided for 4.4BSD compatibility.  The source code for all of
+these lives in the `progs' directory.
+
+Detailed documentation for all libraries and utilities can be found in the
+`man' and `doc' directories.  An HTML introduction to ncurses, panels, and
+menus programming lives in the `doc/html' directory.  Manpages in HTML format
+are under `doc/html/man'.
+
+The `test' directory contains programs that can be used to verify or
+demonstrate the functions of the ncurses libraries.  See test/README for
+descriptions of these programs.  Notably, the `ncurses' utility is designed to
+help you systematically exercise the library functions.
+
+AUTHORS:
+
+Pavel Curtis:
+	wrote the original ncurses
+
+Zeyd M. Ben-Halim:
+	port of original to Linux and many enhancements.
+
+Thomas Dickey (maintainer for 1.9.9g through 4.1, resuming with FSF's 5.0):
+	configuration scripts, porting, mods to adhere to XSI Curses in the
+	areas of background color, terminal modes.  Also memory leak testing,
+	the wresize, default colors and key definition extensions and numerous
+	bug fixes -- more than half of those enumerated in NEWS beginning with
+	the internal release 1.8.9, see
+
+		https://invisible-island.net/personal/changelogs.html
+
+Florian La Roche (official maintainer for FSF's ncurses 4.2)
+	Beginning with release 4.2, ncurses is distributed under an MIT-style
+	license.
+
+Eric S. Raymond:
+	the man pages, infocmp(1), tput(1), clear(1), captoinfo(1), tset(1),
+	toe(1), most of tic(1), trace levels, the HTML intro, wgetnstr() and
+	many other entry points, the cursor-movement optimization, the
+	scroll-pack optimizer for vertical motions, the mouse interface and
+	xterm mouse support, and the ncurses test program.
+
+Juergen Pfeifer
+	The menu and form libraries, C++ bindings for ncurses, menus, forms and
+	panels, as well as the Ada95 binding.  Ongoing support for panel.
+
+CONTRIBUTORS:
+
+Alexander V. Lukyanov
+	for numerous fixes and improvements to the optimization logic.
+
+David MacKenzie
+	for first-class bug-chasing and methodical testing.
+
+Ross Ridge
+	for the code that hacks termcap parameterized strings into terminfo.
+
+Warren Tucker and Gerhard Fuernkranz,
+	for writing and sending the panel library.
+
+Hellmuth Michaelis,
+	for many patches and testing the optimization code.
+
+Eric Newton, Ulrich Drepper, and Anatoly Ivasyuk:
+	the C++ code.
+
+Jonathan Ross,
+	for lessons in using sed.
+
+Keith Bostic (maintainer of 4.4BSD curses)
+	for help, criticism, comments, bug-finding, and being willing to
+	deep-six BSD curses for this one when it grew up.
+
+Richard Stallman,
+	for his commitment to making ncurses free software.
+
+Countless other people have contributed by reporting bugs, sending fixes,
+suggesting improvements, and generally whining about ncurses :-)
+
+BUGS:
+	See the INSTALL file for bug and developer-list addresses.
+	The Hacker's Guide in the doc directory includes some guidelines
+	on how to report bugs in ways that will get them fixed most quickly.
diff --git a/README.MinGW b/README.MinGW
new file mode 100644
index 0000000..3add2e7
--- /dev/null
+++ b/README.MinGW
@@ -0,0 +1,148 @@
+-------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                           --
+-- Copyright 2008-2011,2012 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: README.MinGW,v 1.14 2020/09/06 22:22:44 tom Exp $
+-- Author: Juergen Pfeifer
+-------------------------------------------------------------------------------
+
+This is work in progress, but it is in an state where one can see it
+works at least on the Windows Console.
+
+You should install the MSYS2 package, so that you have a shell environment that
+allows you to run scripts, especially configure, etc.  You can get that
+from
+	https://www.msys2.org/
+
+or the individual packages from
+
+	https://sourceforge.net/projects/msys2/files/
+
+You may also use a hosted MinGW cross-compile toolchain, e.g., on Ubuntu or
+ArchLinux to build the libraries and tools.
+
+To build ncurses for native Windows with support for the new Windows 10 Virtual
+Terminal and PseudoConsole support, you should install at least version 8.0 of
+the mingw-w64-x86_64-headers package as it appears to have support for the
+required Windows SDK level.  Please note that some of the Linux distributions
+are a bit behind with respect to the required MinGW header versions and you may
+not be able to properly build the libraries for current Windows 10 using these
+toolchains.  Although it is a bit slow, MSYS2 on Windows 10 64-Bit is the
+authoritative build environment for the MinGW version of ncurses.
+
+Using MinGW is a pragmatic decision, it is the easiest way to port this
+heavily UNIX based sourcebase to native Windows. The goal is of course
+to provide the includes, libraries and DLLs to be used with the more
+common traditional development environments on Windows, mainly with
+Microsoft Visual Studio.
+
+The TERM environment variable must be set especially to activate the Windows
+console-driver.  The driver checks if TERM is set to "#win32con" (explicit
+use) or if TERM is unset or empty (implicit).
+
+Beginning with build 17763 (Fall 2018 update), Windows 10 supports ANSI escape
+sequences (Virtual Terminal support). If ncurses detects this or a later
+Windows 10 version, the interpretation of the implicit TERM setting (which
+means: TERM is not set or empty) changes. In this case, TERM is to be assumed
+to be "ms-terminal" and ncurses acts using the regular terminfo based driver,
+thus acting like a regular Terminal we all know from UNIX like environments.
+
+This code requires WindowsNT 6.0 or better, which means on the client
+Windows Vista or better, on the server Windows Server 2008 or better.
+
+If running on Windows 10 Build 17763 or later is detected, any program
+spawning a subprocess running a ncurses program should use the new
+PseudoConsole support, which provides what we know as pty from the UNIX
+world also for Windows. Using the CreatePseudoConsole API
+(see https://docs.microsoft.com/en-us/windows/console/createpseudoconsole)
+in the calling process, it is guaranteed that the called ncurses program has
+a console that is required by its implementation, even if the calling program
+is NOT a console program, e.g., MSYS2's own mintty Terminal emulator.
+
+In the current MSYS2/minGW setup, building MinGW shared libraries with
+libtool for ncurses seems to be broken, so I recommend NOT to use libtool.
+
+To build a modern but still small footprint ncurses that provides
+hooks for interop, I recommend using these options:
+
+	--without-libtool
+	--disable-home-terminfo
+	--enable-database
+	--disable-termcap
+	--enable-sp-funcs
+	--enable-term-driver
+	--enable-interop
+
+This is the configuration command line which I am using at the moment
+(assuming environment variable MINGW_ROOT holds the root directory name of
+your MinGW build):
+
+./configure \
+	--prefix=/mingw64 \
+	--without-cxx \
+	--without-ada \
+	--enable-warnings \
+	--enable-assertions \
+	--enable-exp-win32 \
+	--enable-ext-funcs \
+	--disable-home-terminfo \
+	--disable-echo \
+	--disable-getcap \
+	--disable-hard-tabs \
+	--disable-leaks \
+	--disable-macros \
+	--disable-overwrite \
+	--enable-opaque-curses \
+	--enable-opaque-panel \
+	--enable-opaque-menu \
+	--enable-opaque-form \
+	--enable-database \
+	--enable-sp-funcs \
+	--enable-term-driver \
+	--enable-interop \
+	--disable-termcap \
+	--enable-database \
+	--with-progs \
+	--without-libtool \
+	--enable-pc-files \
+	--with-shared \
+	--with-normal \
+	--without-debug \
+	--with-fallbacks=ms-terminal \
+	--without-manpages
+
+Please note that it is also necessary to set this environment variable:
+
+export PATH_SEPARATOR=";"
+
+in order to parse the terminfo paths correctly. Terminfo paths should
+always be separated by a semicolon, even when running under MSYS2.
+
+All the options above are - like the whole Windows support -
+experimental.
+
+-- vile:txtmode
diff --git a/README.emx b/README.emx
new file mode 100644
index 0000000..666eaec
--- /dev/null
+++ b/README.emx
@@ -0,0 +1,73 @@
+-------------------------------------------------------------------------------
+-- Copyright 2020,2021 Thomas E. Dickey                                      --
+-- Copyright 1998-2006,2018 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: README.emx,v 1.12 2021/06/17 21:20:30 tom Exp $
+-- Author: Thomas Dickey
+-------------------------------------------------------------------------------
+
+You can build ncurses on OS/2 in the EMX environment.  But you must build and
+acquire tools.  Not all of the tools distributed with EMX work properly, and
+some additional ones are required.
+
+First, the configure script distributed with ncurses will not run as-is in EMX.
+You can generate a new one if you have autoconf built for EMX.  You will need
+the EMX development tools, of course.  Get these programs to start:
+
+	GNU m4 program (version 1.4)
+	GNU autoconf (version 2.13).
+	GNU patch (version 2.5)
+
+Apply the autoconf patches from
+
+	https://invisible-island.net/autoconf
+	ftp://ftp.invisible-island.net/autoconf
+
+These are ordered by date:
+
+	autoconf-2.13-20030927.patch.gz
+	autoconf-2.13-20030927-emx.patch.gz
+
+I built my development environment for ncurses using EMX 0.9c at the end of
+1997.  Much of the EMX patch for autoconf was done originally by J.J.G.Ripoll,
+using a similar environment (he prefers using the 'ash' shell).  Newer versions
+may fix these problems:
+
+	+ The pdksh program distributed at Hobbes and Leo (with a 1996 date) is
+	  defective.  It does not process "here documents" correctly (which
+	  renders it useless for running the autoconf script).  I built my own
+	  copy of pdksh 5.2.13, which does have the bug corrected (documented
+	  in the change log for pdksh).
+
+	+ I also built from sources (because the distributed binaries did not
+	  work) the cmp, diff programs.
+
+	  Other required utilities such as ar, cat, chmod, cp, gawk, grep, mv,
+	  ls, rm, mkdir, sed, sort and tr worked.
+
+Once you have autoconf patched and installed, run 'autoconf' from the top-level
+directory of ncurses to generate the EMX-specific configure script.
diff --git a/TO-DO b/TO-DO
new file mode 100644
index 0000000..f021a1b
--- /dev/null
+++ b/TO-DO
@@ -0,0 +1,214 @@
+-------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                           --
+-- Copyright 1998-2010,2011 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: TO-DO,v 1.58 2020/02/02 23:34:34 tom Exp $
+-------------------------------------------------------------------------------
+
+SHORT-TERM TO-DO ITEMS:
+
+Known Problems:
+
++ libtool does not work with GNAT.
+
++ The screen optimization has been tested only in an ad hoc manner.  We should
+  develop a good set of regression tests to cover lib_doupdate.c and
+  lib_mvcur.c.
+
++ Magic cookie support (for nonzero xmc values) does not work, since the logic
+  does not take into account refresh.  Also, the initial optimize does not
+  adjust the current location when a cookie is emitted.
+
++ Scrolling optimization has holes:  for example, it forces repaints of the
+  screen between calls to refresh().
+
++ SVr4 uses slightly different rules for determining when softkeys are shown.
+  For example, they are initially displayed (before the ncurses 'e' test
+  activates them), and a touchwin can apparently also force them to be
+  displayed.
+
++ The code departs from perfect 8-bit cleanness in one respect; you cannot
+  specify a character \200 as part of a capability string, because the
+  terminfo library interprets \200 as a request to embed NUL (\000) at that
+  point.  This is a legacy terminfo property we can't mess with.
+
++ The window classes defined in the c++ subdirectory need documentation.  Some
+  C++ programmer could earn a lot of good karma by doing this...
+
++ vid_attr() should support the set_a_attributes (sgr1) string, but does not.
+  There appear to be no terminals that require that functionality.
+
++ the configure --disable-ext-funcs option does not work for Ada95 tree.
+
++ the --with-pthread configuration builds for Cygwin, but does not work
+  properly (test/worm.c shows all of the worms in the same location).
+
++ the --enable-rpath configure option builds for the corresponding platforms;
+  however combining it with --with-ticlib and --with-termlib does not always
+  produce libraries that can be run without setting environment variables.
+  Building those with libtool does not work either.  (This is a problem with
+  the BSD platforms).
+
++ more work is needed to make the MinGW port support ordinary terminals.
+
+Portability (or lack thereof):
+
++ Users of older System V UNIXes (but not Solaris, and probably not SVr4) may
+  trip over a known problem with the signal-handling code which causes abrupt
+  termination of ncurses applications following resume from a ^Z suspend (this
+  problem was first seen running lynx).  You will not see this problem if you
+  are using one of the 4.4BSD derivatives like such as, NetBSD, or BSDI, or
+  systems using that convention.  For details, see the analysis in the header
+  comment of ncurses/tty/lib_tstp.c .
+
++ In theory, vwprintw and vwscanf are supposed to use the older varargs.h
+  interface for handling variadic argument lists (and are deprecated by X/Open
+  for that reason).  Many newer systems do no have varargs.h, instead they have
+  only the newer X/Open-standard stdargs.h equivalent.  So these functions use
+  stdargs instead.  This is unlikely to be a problem unless you're building
+  ncurses on a System V old enough to only have varargs.h.  (Solaris 2.5.1 used
+  the stdarg.h binding as well).
+
++ If you're using a system old enough not to have a native vsscanf(3) in its
+  library, vwscanw() will not work.  If you want to fix this, add an
+  implementation to ncurses/vsscanf.c.
+
++ The C++ binding fails to build with a few C++ compilers.
+
++ terminfo.5 does not format with the SunOS (and most other platform's) tbl
+  utility because it relies on a diversion for each table entry.  Get the
+  groff package.
+
+Untested features:
+
++ The code for the HP color model using set_color_pair is untested.
+
++ The code for handling soft labels on a terminal type with built-in support
+  for them (num_labels > 0, label_height, label_width, label_format, label_off,
+  label_on, plab_norm, lab_f*) has not been tested.  The label_format and
+  lab_f* capabilities aren't presently used.
+
+LONGER-TERM TO-DO ITEMS:
+
+1. Extended COSE conformance
+
+There is an XPG4 standard released in 1996 which describes a superset
+of the SVr4 API.  The library is BASE conformant with this standard.
+We would like to make ncurses fully conformant at the EXTENDED level
+supporting internationalization.
+
+2. DOS port
+
+Only a few of the files in the library depend on the terminfo format.
+It should be possible to further kernelize the package, then rewrite
+a small number of core files to produce a functionally-compatible
+port that would do updates to a memory-mapped screen area.  The first
+result of this would be a DOS port.
+
+3. X port
+
+It would be nice if ncurses could recognize when it was running under X and
+maintain its own window.  With this feature, all ncurses programs would
+automatically become X programs.  The challenge is to handle resize events
+properly.
+
+4. Unused capabilities
+
+The currently unused capabilities fall naturally into several groups:
+
+A. Status-line capabilities:
+
+	Booleans: has_status_line, status_line_esc_ok.
+	Numerics: width_status_line.
+	Strings: dis_status_line, from_status_line, to_status_line.
+
+System V Release 1 curses made no use of these at all.  SVr4's use, if
+any, is unknown.  From the AT&T termcap file it looks like curses, in general,
+shouldn't use them; terminal variants with status lines have their line count
+decremented by 1, suggesting that curses is supposed to leave the status line
+alone.
+
+B. Printer capabilities:
+
+	Boolean: col_addr_glitch, cr_cancels_micro_mode, has_print_wheel,
+		row_addr_glitch, semi_auto_right_margin, cpi_changes_res,
+		lpi_changes_res.
+	Numeric: buffer_capacity, dot_horz_spacing, dot_vert_spacing,
+		max_micro_address, max_micro_jump, micro_col_size,
+		micro_line_size, number_of_pins, output_res_char,
+		output_res_line, output_res_horz_inch, print_rate,
+		wide_char_size, bit_image_entwining, bit_image_type.
+	String: down_half_line, form_feed, up_half_line, set_left_margin,
+		set_right_margin, clear_margins, change_char_pitch
+		... set_page_length (all the SVr4 printer caps),
+
+Curses doesn't use these.
+
+C. Printer-control capabilities:
+
+	Boolean: prtr_silent.
+	Strings: print_screen, prtr_on, prtr_off, prtr_non.
+
+Curses doesn't use these.
+
+D. Dialer strings:
+
+	Strings: hangup, dial_phone, quick_dial, tone, pulse, flash_hook,
+		fixed_pause, wait_tone.
+
+Curses doesn't use these.
+
+E. Window and virtual-terminal capabilities:
+
+	Numerics: maximum_windows, virtual_terminal.
+	Strings: req_for_input, create_window, goto_window, set_window.
+
+These seem to be fossils from some AT&T experiments on character-based
+window systems that never escaped the lab.  The virtual_terminal cap had
+something to do with building terminal emulations into tty line disciplines.
+
+F. Unused VDT capabilities:
+
+	Booleans: erase_overstrike, has_meta_key, insert_null_glitch,
+		move_insert, dest_tabs_magic_smso, transparent_underline,
+		needs_xon_xoff, hard_cursor.
+	Numerics: lines_of_memory, buttons.
+	Strings: pkey_key, pkey_local, pkey_xmit, underline_char,
+		enter_xon_mode,	exit_xon_mode, xon_character, xoff_character,
+		display_clock, remove_clock, user[0-5], display_pc_char,
+		enter_scancode_mode, exit_scancode_mode, pc_term_options,
+		scancode_escape, alt_scancode_esc.
+
+These are the potentially important ones for ncurses.  Notes:
+
+	i) ncurses doesn't need move_insert; it never uses cup/hpa/vpa while
+		insert_mode is on.
+
+	ii) We probably don't care about dest_tabs_magic_smso; only
+		Telerays used it and they're all long obsolete.
+
+-- vile:txtmode
diff --git a/VERSION b/VERSION
new file mode 100644
index 0000000..e2dff67
--- /dev/null
+++ b/VERSION
@@ -0,0 +1 @@
+5:0:10	6.4	20221231
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644
index 0000000..937e983
--- /dev/null
+++ b/aclocal.m4
@@ -0,0 +1,10069 @@
+dnl***************************************************************************
+dnl Copyright 2018-2021,2022 Thomas E. Dickey                                *
+dnl Copyright 1998-2017,2018 Free Software Foundation, Inc.                  *
+dnl                                                                          *
+dnl Permission is hereby granted, free of charge, to any person obtaining a  *
+dnl copy of this software and associated documentation files (the            *
+dnl "Software"), to deal in the Software without restriction, including      *
+dnl without limitation the rights to use, copy, modify, merge, publish,      *
+dnl distribute, distribute with modifications, sublicense, and/or sell       *
+dnl copies of the Software, and to permit persons to whom the Software is    *
+dnl furnished to do so, subject to the following conditions:                 *
+dnl                                                                          *
+dnl The above copyright notice and this permission notice shall be included  *
+dnl in all copies or substantial portions of the Software.                   *
+dnl                                                                          *
+dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
+dnl OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
+dnl MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
+dnl IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
+dnl DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
+dnl OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
+dnl THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
+dnl                                                                          *
+dnl Except as contained in this notice, the name(s) of the above copyright   *
+dnl holders shall not be used in advertising or otherwise to promote the     *
+dnl sale, use or other dealings in this Software without prior written       *
+dnl authorization.                                                           *
+dnl***************************************************************************
+dnl
+dnl Author: Thomas E. Dickey 1995-on
+dnl
+dnl $Id: aclocal.m4,v 1.1023 2022/11/05 20:13:19 tom Exp $
+dnl Macros used in NCURSES auto-configuration script.
+dnl
+dnl These macros are maintained separately from NCURSES.  The copyright on
+dnl this file applies to the aggregation of macros and does not affect use of
+dnl these macros in other applications.
+dnl
+dnl See these pages for additional information:
+dnl		https://invisible-island.net/autoconf/
+dnl		https://invisible-island.net/autoconf/my-autoconf.html
+dnl
+dnl ---------------------------------------------------------------------------
+dnl ---------------------------------------------------------------------------
+dnl AM_LANGINFO_CODESET version: 6 updated: 2021/01/01 16:53:59
+dnl -------------------
+dnl Inserted as requested by gettext 0.10.40
+dnl File from /usr/share/aclocal
+dnl codeset.m4
+dnl ====================
+dnl serial AM1
+dnl
+dnl From Bruno Haible.
+AC_DEFUN([AM_LANGINFO_CODESET],
+[
+AC_CACHE_CHECK([for nl_langinfo and CODESET], am_cv_langinfo_codeset,
+	[AC_TRY_LINK([#include <langinfo.h>],
+	[char* cs = nl_langinfo(CODESET); (void)cs],
+	am_cv_langinfo_codeset=yes,
+	am_cv_langinfo_codeset=no)
+	])
+	if test "$am_cv_langinfo_codeset" = yes; then
+		AC_DEFINE(HAVE_LANGINFO_CODESET, 1,
+		[Define if you have <langinfo.h> and nl_langinfo(CODESET).])
+	fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ABI_DEFAULTS version: 3 updated: 2022/01/22 19:13:38
+dnl ---------------
+dnl Provide configure-script defaults for different ncurses ABIs.
+AC_DEFUN([CF_ABI_DEFAULTS],[
+AC_REQUIRE([CF_NCURSES_WITH_ABI_VERSION])
+
+# ABI 5 defaults:
+cf_dft_ccharw_max=5
+cf_dft_chtype=auto
+cf_dft_ext_colors=no
+cf_dft_ext_const=no
+cf_dft_ext_mouse=no
+cf_dft_ext_putwin=no
+cf_dft_ext_spfuncs=no
+cf_dft_filter_syms=no
+cf_dft_interop=no
+cf_dft_mmask_t=auto
+cf_dft_opaque_curses=no
+cf_dft_ordinate_type=short
+cf_dft_signed_char=no
+cf_dft_tparm_arg=long
+cf_dft_with_lp64=no
+
+# ABI 6 defaults:
+case x$cf_cv_abi_version in
+(x[[6789]])
+	cf_dft_chtype=uint32_t
+	cf_dft_ext_colors=yes
+	cf_dft_ext_const=yes
+	cf_dft_ext_mouse=yes
+	cf_dft_ext_putwin=yes
+	cf_dft_ext_spfuncs=yes
+	cf_dft_filter_syms=yes
+	cf_dft_interop=yes
+	cf_dft_mmask_t=uint32_t
+	cf_dft_tparm_arg=intptr_t
+	cf_dft_with_lp64=yes
+	;;
+esac
+
+# ABI 7 defaults:
+case x$cf_cv_abi_version in
+(x[[789]])
+	cf_dft_ccharw_max=6
+	cf_dft_mmask_t=uint64_t
+	cf_dft_opaque_curses=yes
+	cf_dft_ordinate_type=int
+	cf_dft_signed_char=yes
+	# also: remove the wgetch-events feature in ABI 7
+	;;
+esac
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ACVERSION_CHECK version: 5 updated: 2014/06/04 19:11:49
+dnl ------------------
+dnl Conditionally generate script according to whether we're using a given autoconf.
+dnl
+dnl $1 = version to compare against
+dnl $2 = code to use if AC_ACVERSION is at least as high as $1.
+dnl $3 = code to use if AC_ACVERSION is older than $1.
+define([CF_ACVERSION_CHECK],
+[
+ifdef([AC_ACVERSION], ,[ifdef([AC_AUTOCONF_VERSION],[m4_copy([AC_AUTOCONF_VERSION],[AC_ACVERSION])],[m4_copy([m4_PACKAGE_VERSION],[AC_ACVERSION])])])dnl
+ifdef([m4_version_compare],
+[m4_if(m4_version_compare(m4_defn([AC_ACVERSION]), [$1]), -1, [$3], [$2])],
+[CF_ACVERSION_COMPARE(
+AC_PREREQ_CANON(AC_PREREQ_SPLIT([$1])),
+AC_PREREQ_CANON(AC_PREREQ_SPLIT(AC_ACVERSION)), AC_ACVERSION, [$2], [$3])])])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ACVERSION_COMPARE version: 3 updated: 2012/10/03 18:39:53
+dnl --------------------
+dnl CF_ACVERSION_COMPARE(MAJOR1, MINOR1, TERNARY1,
+dnl                      MAJOR2, MINOR2, TERNARY2,
+dnl                      PRINTABLE2, not FOUND, FOUND)
+define([CF_ACVERSION_COMPARE],
+[ifelse(builtin([eval], [$2 < $5]), 1,
+[ifelse([$8], , ,[$8])],
+[ifelse([$9], , ,[$9])])])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ADA_INCLUDE_DIRS version: 8 updated: 2013/10/14 04:24:07
+dnl -------------------
+dnl Construct the list of include-options for the C programs in the Ada95
+dnl binding.
+AC_DEFUN([CF_ADA_INCLUDE_DIRS],
+[
+ACPPFLAGS="-I. -I../include -I../../include $ACPPFLAGS"
+if test "$srcdir" != "."; then
+	ACPPFLAGS="-I\${srcdir}/../../include $ACPPFLAGS"
+fi
+if test "$GCC" != yes; then
+	ACPPFLAGS="$ACPPFLAGS -I\${includedir}"
+elif test "$includedir" != "/usr/include"; then
+	if test "$includedir" = '${prefix}/include' ; then
+		if test x$prefix != x/usr ; then
+			ACPPFLAGS="$ACPPFLAGS -I\${includedir}"
+		fi
+	else
+		ACPPFLAGS="$ACPPFLAGS -I\${includedir}"
+	fi
+fi
+AC_SUBST(ACPPFLAGS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ADD_ADAFLAGS version: 1 updated: 2010/06/19 15:22:18
+dnl ---------------
+dnl Add to $ADAFLAGS, which is substituted into makefile and scripts.
+AC_DEFUN([CF_ADD_ADAFLAGS],[
+ 	ADAFLAGS="$ADAFLAGS $1"
+	AC_SUBST(ADAFLAGS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ADD_CFLAGS version: 15 updated: 2020/12/31 10:54:15
+dnl -------------
+dnl Copy non-preprocessor flags to $CFLAGS, preprocessor flags to $CPPFLAGS
+dnl $1 = flags to add
+dnl $2 = if given makes this macro verbose.
+dnl
+dnl Put any preprocessor definitions that use quoted strings in $EXTRA_CPPFLAGS,
+dnl to simplify use of $CPPFLAGS in compiler checks, etc., that are easily
+dnl confused by the quotes (which require backslashes to keep them usable).
+AC_DEFUN([CF_ADD_CFLAGS],
+[
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $1
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[[^=]]*='\''\"[[^"]]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+				CF_APPEND_TEXT(cf_new_extra_cppflags,$cf_add_cflags)
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+				CF_APPEND_TEXT(cf_new_extra_cppflags,$cf_add_cflags)
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+				CF_REMOVE_DEFINE(CPPFLAGS,$CPPFLAGS,$cf_tst_cppflags)
+				;;
+			esac
+			CF_APPEND_TEXT(cf_new_cppflags,$cf_add_cflags)
+			;;
+		esac
+		;;
+	(*)
+		CF_APPEND_TEXT(cf_new_cflags,$cf_add_cflags)
+		;;
+	esac
+	;;
+(yes)
+	CF_APPEND_TEXT(cf_new_extra_cppflags,$cf_add_cflags)
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[[^"]]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+	ifelse([$2],,,[CF_VERBOSE(add to \$CFLAGS $cf_new_cflags)])
+	CF_APPEND_TEXT(CFLAGS,$cf_new_cflags)
+fi
+
+if test -n "$cf_new_cppflags" ; then
+	ifelse([$2],,,[CF_VERBOSE(add to \$CPPFLAGS $cf_new_cppflags)])
+	CF_APPEND_TEXT(CPPFLAGS,$cf_new_cppflags)
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+	ifelse([$2],,,[CF_VERBOSE(add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags)])
+	CF_APPEND_TEXT(EXTRA_CPPFLAGS,$cf_new_extra_cppflags)
+fi
+
+AC_SUBST(EXTRA_CPPFLAGS)
+
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ADD_CXXFLAGS version: 1 updated: 2020/04/04 16:16:13
+dnl ---------------
+dnl Copy non-preprocessor flags to $CXXFLAGS, preprocessor flags to $CPPFLAGS
+dnl The second parameter if given makes this macro verbose.
+dnl
+dnl Put any preprocessor definitions that use quoted strings in $EXTRA_CPPFLAGS,
+dnl to simplify use of $CPPFLAGS in compiler checks, etc., that are easily
+dnl confused by the quotes (which require backslashes to keep them usable).
+AC_DEFUN([CF_ADD_CXXFLAGS],
+[
+cf_save_CXXFLAGS="$CFLAGS"
+CFLAGS="$CXXFLAGS"
+CF_ADD_CFLAGS($1 ifelse($2,,,[,$2]))
+CXXFLAGS="$CFLAGS"
+CFLAGS="$cf_save_CXXFLAGS"
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ADD_INCDIR version: 17 updated: 2021/09/04 06:35:04
+dnl -------------
+dnl Add an include-directory to $CPPFLAGS.  Don't add /usr/include, since it is
+dnl redundant.  We don't normally need to add -I/usr/local/include for gcc,
+dnl but old versions (and some misinstalled ones) need that.  To make things
+dnl worse, gcc 3.x may give error messages if -I/usr/local/include is added to
+dnl the include-path).
+AC_DEFUN([CF_ADD_INCDIR],
+[
+if test -n "$1" ; then
+  for cf_add_incdir in $1
+  do
+	while test "$cf_add_incdir" != /usr/include
+	do
+	  if test -d "$cf_add_incdir"
+	  then
+		cf_have_incdir=no
+		if test -n "$CFLAGS$CPPFLAGS" ; then
+		  # a loop is needed to ensure we can add subdirs of existing dirs
+		  for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+			if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+			  cf_have_incdir=yes; break
+			fi
+		  done
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  if test "$cf_add_incdir" = /usr/local/include ; then
+			if test "$GCC" = yes
+			then
+			  cf_save_CPPFLAGS=$CPPFLAGS
+			  CF_APPEND_TEXT(CPPFLAGS,-I$cf_add_incdir)
+			  AC_TRY_COMPILE([#include <stdio.h>],
+				  [printf("Hello")],
+				  [],
+				  [cf_have_incdir=yes])
+			  CPPFLAGS=$cf_save_CPPFLAGS
+			fi
+		  fi
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  CF_VERBOSE(adding $cf_add_incdir to include-path)
+		  ifelse([$2],,CPPFLAGS,[$2])="$ifelse([$2],,CPPFLAGS,[$2]) -I$cf_add_incdir"
+
+		  cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+		  test "$cf_top_incdir" = "$cf_add_incdir" && break
+		  cf_add_incdir="$cf_top_incdir"
+		else
+		  break
+		fi
+	  else
+		break
+	  fi
+	done
+  done
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ADD_LIB version: 2 updated: 2010/06/02 05:03:05
+dnl ----------
+dnl Add a library, used to enforce consistency.
+dnl
+dnl $1 = library to add, without the "-l"
+dnl $2 = variable to update (default $LIBS)
+AC_DEFUN([CF_ADD_LIB],[CF_ADD_LIBS(-l$1,ifelse($2,,LIBS,[$2]))])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ADD_LIBDIR version: 11 updated: 2020/12/31 20:19:42
+dnl -------------
+dnl	Adds to the library-path
+dnl
+dnl	Some machines have trouble with multiple -L options.
+dnl
+dnl $1 is the (list of) directory(s) to add
+dnl $2 is the optional name of the variable to update (default LDFLAGS)
+dnl
+AC_DEFUN([CF_ADD_LIBDIR],
+[
+if test -n "$1" ; then
+	for cf_add_libdir in $1
+	do
+		if test "$cf_add_libdir" = /usr/lib ; then
+			:
+		elif test -d "$cf_add_libdir"
+		then
+			cf_have_libdir=no
+			if test -n "$LDFLAGS$LIBS" ; then
+				# a loop is needed to ensure we can add subdirs of existing dirs
+				for cf_test_libdir in $LDFLAGS $LIBS ; do
+					if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+						cf_have_libdir=yes; break
+					fi
+				done
+			fi
+			if test "$cf_have_libdir" = no ; then
+				CF_VERBOSE(adding $cf_add_libdir to library-path)
+				ifelse([$2],,LDFLAGS,[$2])="-L$cf_add_libdir $ifelse([$2],,LDFLAGS,[$2])"
+			fi
+		fi
+	done
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ADD_LIBS version: 3 updated: 2019/11/02 16:47:33
+dnl -----------
+dnl Add one or more libraries, used to enforce consistency.  Libraries are
+dnl prepended to an existing list, since their dependencies are assumed to
+dnl already exist in the list.
+dnl
+dnl $1 = libraries to add, with the "-l", etc.
+dnl $2 = variable to update (default $LIBS)
+AC_DEFUN([CF_ADD_LIBS],[
+cf_add_libs="[$]ifelse($2,,LIBS,[$2])"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $1; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+ifelse($2,,LIBS,[$2])="$cf_add_libs"
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ADD_SUBDIR_PATH version: 5 updated: 2020/12/31 20:19:42
+dnl ------------------
+dnl Append to a search-list for a nonstandard header/lib-file
+dnl	$1 = the variable to return as result
+dnl	$2 = the package name
+dnl	$3 = the subdirectory, e.g., bin, include or lib
+dnl $4 = the directory under which we will test for subdirectories
+dnl $5 = a directory that we do not want $4 to match
+AC_DEFUN([CF_ADD_SUBDIR_PATH],
+[
+test "x$4" != "x$5" && \
+test -d "$4" && \
+ifelse([$5],NONE,,[{ test -z "$5" || test "x$5" = xNONE || test "x$4" != "x$5"; } &&]) {
+	test -n "$verbose" && echo "	... testing for $3-directories under $4"
+	test -d "$4/$3" &&          $1="[$]$1 $4/$3"
+	test -d "$4/$3/$2" &&       $1="[$]$1 $4/$3/$2"
+	test -d "$4/$3/$2/$3" &&    $1="[$]$1 $4/$3/$2/$3"
+	test -d "$4/$2/$3" &&       $1="[$]$1 $4/$2/$3"
+	test -d "$4/$2/$3/$2" &&    $1="[$]$1 $4/$2/$3/$2"
+}
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_APPEND_CFLAGS version: 3 updated: 2021/09/05 17:25:40
+dnl ----------------
+dnl Use CF_ADD_CFLAGS after first checking for potential redefinitions.
+dnl $1 = flags to add
+dnl $2 = if given makes this macro verbose.
+define([CF_APPEND_CFLAGS],
+[
+for cf_add_cflags in $1
+do
+	case "x$cf_add_cflags" in
+	(x-[[DU]]*)
+		CF_REMOVE_CFLAGS($cf_add_cflags,CFLAGS,[$2])
+		CF_REMOVE_CFLAGS($cf_add_cflags,CPPFLAGS,[$2])
+		;;
+	esac
+	CF_ADD_CFLAGS([$cf_add_cflags],[$2])
+done
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_APPEND_TEXT version: 1 updated: 2017/02/25 18:58:55
+dnl --------------
+dnl use this macro for appending text without introducing an extra blank at
+dnl the beginning
+define([CF_APPEND_TEXT],
+[
+	test -n "[$]$1" && $1="[$]$1 "
+	$1="[$]{$1}$2"
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ARG_DISABLE version: 3 updated: 1999/03/30 17:24:31
+dnl --------------
+dnl Allow user to disable a normally-on option.
+AC_DEFUN([CF_ARG_DISABLE],
+[CF_ARG_OPTION($1,[$2],[$3],[$4],yes)])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ARG_ENABLE version: 3 updated: 1999/03/30 17:24:31
+dnl -------------
+dnl Allow user to enable a normally-off option.
+AC_DEFUN([CF_ARG_ENABLE],
+[CF_ARG_OPTION($1,[$2],[$3],[$4],no)])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ARG_OPTION version: 5 updated: 2015/05/10 19:52:14
+dnl -------------
+dnl Restricted form of AC_ARG_ENABLE that ensures user doesn't give bogus
+dnl values.
+dnl
+dnl Parameters:
+dnl $1 = option name
+dnl $2 = help-string
+dnl $3 = action to perform if option is not default
+dnl $4 = action if perform if option is default
+dnl $5 = default option value (either 'yes' or 'no')
+AC_DEFUN([CF_ARG_OPTION],
+[AC_ARG_ENABLE([$1],[$2],[test "$enableval" != ifelse([$5],no,yes,no) && enableval=ifelse([$5],no,no,yes)
+	if test "$enableval" != "$5" ; then
+ifelse([$3],,[    :]dnl
+,[    $3]) ifelse([$4],,,[
+	else
+		$4])
+	fi],[enableval=$5 ifelse([$4],,,[
+	$4
+])dnl
+])])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_AR_FLAGS version: 9 updated: 2021/01/01 13:31:04
+dnl -----------
+dnl Check for suitable "ar" (archiver) options for updating an archive.
+dnl
+dnl In particular, handle some obsolete cases where the "-" might be omitted,
+dnl as well as a workaround for breakage of make's archive rules by the GNU
+dnl binutils "ar" program.
+AC_DEFUN([CF_AR_FLAGS],[
+AC_REQUIRE([CF_PROG_AR])
+
+AC_CACHE_CHECK(for options to update archives, cf_cv_ar_flags,[
+	case "$cf_cv_system_name" in
+	(*-msvc*)
+		cf_cv_ar_flags=''
+		cat >mk_static_lib.sh <<-EOF
+		#!$SHELL
+		MSVC_BIN="[$]AR"
+		out="\[$]1"
+		shift
+		exec \[$]MSVC_BIN -out:"\[$]out" \[$]@
+		EOF
+		chmod +x mk_static_lib.sh
+		AR=`pwd`/mk_static_lib.sh
+		;;
+	(*)
+		cf_cv_ar_flags=unknown
+		for cf_ar_flags in -curvU -curv curv -crv crv -cqv cqv -rv rv
+		do
+
+			# check if $ARFLAGS already contains this choice
+			if test "x$ARFLAGS" != "x" ; then
+				cf_check_ar_flags=`echo "x$ARFLAGS" | sed -e "s/$cf_ar_flags\$//" -e "s/$cf_ar_flags / /"`
+				if test "x$ARFLAGS" != "$cf_check_ar_flags" ; then
+					cf_cv_ar_flags=
+					break
+				fi
+			fi
+
+			rm -f "conftest.$ac_cv_objext"
+			rm -f conftest.a
+
+			cat >"conftest.$ac_ext" <<EOF
+#line __oline__ "configure"
+int	testdata[[3]] = { 123, 456, 789 };
+EOF
+			if AC_TRY_EVAL(ac_compile) ; then
+				echo "$AR $ARFLAGS $cf_ar_flags conftest.a conftest.$ac_cv_objext" >&AC_FD_CC
+				$AR $ARFLAGS "$cf_ar_flags" conftest.a "conftest.$ac_cv_objext" 2>&AC_FD_CC 1>/dev/null
+				if test -f conftest.a ; then
+					cf_cv_ar_flags="$cf_ar_flags"
+					break
+				fi
+			else
+				CF_VERBOSE(cannot compile test-program)
+				break
+			fi
+		done
+		rm -f conftest.a "conftest.$ac_ext" "conftest.$ac_cv_objext"
+		;;
+	esac
+])
+
+if test -n "$ARFLAGS" ; then
+	if test -n "$cf_cv_ar_flags" ; then
+		ARFLAGS="$ARFLAGS $cf_cv_ar_flags"
+	fi
+else
+	ARFLAGS=$cf_cv_ar_flags
+fi
+
+AC_SUBST(ARFLAGS)
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_AWK_BIG_PRINTF version: 5 updated: 2015/04/17 21:13:04
+dnl -----------------
+dnl Check if awk can handle big strings using printf.  Some older versions of
+dnl awk choke on large strings passed via "%s".
+dnl
+dnl $1 = desired string size
+dnl $2 = variable to set with result
+AC_DEFUN([CF_AWK_BIG_PRINTF],
+[
+	case x$AWK in
+	(x)
+		eval $2=no
+		;;
+	(*)
+		if ( ${AWK} 'BEGIN { xx = "x"; while (length(xx) < $1) { xx = xx "x"; }; printf("%s\n", xx); }' 2>/dev/null \
+			| $AWK '{ printf "%d\n", length([$]0); }' 2>/dev/null | $AWK 'BEGIN { eqls=0; recs=0; } { recs++; if ([$]0 == 12000) eqls++; } END { if (recs != 1 || eqls != 1) exit 1; }' 2>/dev/null >/dev/null ) ; then
+			eval $2=yes
+		else
+			eval $2=no
+		fi
+		;;
+	esac
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_BOOL_DECL version: 8 updated: 2004/01/30 15:51:18
+dnl ------------
+dnl Test if 'bool' is a builtin type in the configured C++ compiler.  Some
+dnl older compilers (e.g., gcc 2.5.8) don't support 'bool' directly; gcc
+dnl 2.6.3 does, in anticipation of the ANSI C++ standard.
+dnl
+dnl Treat the configuration-variable specially here, since we're directly
+dnl substituting its value (i.e., 1/0).
+dnl
+dnl $1 is the shell variable to store the result in, if not $cv_cv_builtin_bool
+AC_DEFUN([CF_BOOL_DECL],
+[
+AC_MSG_CHECKING(if we should include stdbool.h)
+
+AC_CACHE_VAL(cf_cv_header_stdbool_h,[
+	AC_TRY_COMPILE([],[bool foo = false],
+		[cf_cv_header_stdbool_h=0],
+		[AC_TRY_COMPILE([
+#ifndef __BEOS__
+#include <stdbool.h>
+#endif
+],[bool foo = false],
+			[cf_cv_header_stdbool_h=1],
+			[cf_cv_header_stdbool_h=0])])])
+
+if test "$cf_cv_header_stdbool_h" = 1
+then	AC_MSG_RESULT(yes)
+else	AC_MSG_RESULT(no)
+fi
+
+AC_MSG_CHECKING([for builtin bool type])
+
+AC_CACHE_VAL(ifelse($1,,cf_cv_builtin_bool,[$1]),[
+	AC_TRY_COMPILE([
+#include <stdio.h>
+#include <sys/types.h>
+],[bool x = false],
+		[ifelse($1,,cf_cv_builtin_bool,[$1])=1],
+		[ifelse($1,,cf_cv_builtin_bool,[$1])=0])
+	])
+
+if test "$ifelse($1,,cf_cv_builtin_bool,[$1])" = 1
+then	AC_MSG_RESULT(yes)
+else	AC_MSG_RESULT(no)
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_BOOL_SIZE version: 18 updated: 2021/09/04 06:35:04
+dnl ------------
+dnl Test for the size of 'bool' in the configured C++ compiler (e.g., a type).
+dnl Don't bother looking for bool.h, since it has been deprecated.
+dnl
+dnl If the current compiler is C rather than C++, we get the bool definition
+dnl from <stdbool.h>.
+AC_DEFUN([CF_BOOL_SIZE],
+[
+AC_CHECK_SIZEOF(bool,,[
+#include <stdlib.h>
+#include <stdio.h>
+
+#if defined(__cplusplus)
+
+#ifdef HAVE_GXX_BUILTIN_H
+#include <g++/builtin.h>
+#elif HAVE_GPP_BUILTIN_H
+#include <gpp/builtin.h>
+#elif HAVE_BUILTIN_H
+#include <builtin.h>
+#endif
+
+#else
+
+#if $cf_cv_header_stdbool_h
+#include <stdbool.h>
+#endif
+
+#endif
+])
+
+AC_CACHE_CHECK(for type of bool, cf_cv_type_of_bool,[
+	rm -f cf_test.out
+	AC_TRY_RUN([
+#include <stdlib.h>
+#include <stdio.h>
+
+#if defined(__cplusplus)
+
+#ifdef HAVE_GXX_BUILTIN_H
+#include <g++/builtin.h>
+#elif HAVE_GPP_BUILTIN_H
+#include <gpp/builtin.h>
+#elif HAVE_BUILTIN_H
+#include <builtin.h>
+#endif
+
+#else
+
+#if $cf_cv_header_stdbool_h
+#include <stdbool.h>
+#endif
+
+#endif
+
+int main(void)
+{
+	FILE *fp = fopen("cf_test.out", "w");
+	if (fp != 0) {
+		bool x = true;
+		if ((bool)(-x) >= 0)
+			fputs("unsigned ", fp);
+		if (sizeof(x) == sizeof(int))       fputs("int",  fp);
+		else if (sizeof(x) == sizeof(char)) fputs("char", fp);
+		else if (sizeof(x) == sizeof(short))fputs("short",fp);
+		else if (sizeof(x) == sizeof(long)) fputs("long", fp);
+		fclose(fp);
+	}
+	${cf_cv_main_return:-return}(0);
+}
+		],
+		[cf_cv_type_of_bool=`cat cf_test.out`
+		 if test -z "$cf_cv_type_of_bool"; then
+		   cf_cv_type_of_bool=unknown
+		 fi],
+		[cf_cv_type_of_bool=unknown],
+		[
+		case x$ac_cv_sizeof_bool in
+		(x1) cf_cv_type_of_bool="unsigned char";;
+		(x2) cf_cv_type_of_bool="unsigned short";;
+		(x4) cf_cv_type_of_bool="unsigned int";;
+		(x8) cf_cv_type_of_bool="unsigned long";;
+		(*)  cf_cv_type_of_bool=unknown;;
+		esac
+		])
+	rm -f cf_test.out
+])
+
+if test "$cf_cv_type_of_bool" = unknown ; then
+	case .$NCURSES_BOOL in
+	(.auto|.) NCURSES_BOOL=unsigned;;
+	esac
+	AC_MSG_WARN(Assuming $NCURSES_BOOL for type of bool)
+	cf_cv_type_of_bool=$NCURSES_BOOL
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_BUILD_CC version: 10 updated: 2022/09/24 16:36:41
+dnl -----------
+dnl If we're cross-compiling, allow the user to override the tools and their
+dnl options.  The configure script is oriented toward identifying the host
+dnl compiler, etc., but we need a build compiler to generate parts of the
+dnl source.
+dnl
+dnl $1 = default for $CPPFLAGS
+dnl $2 = default for $LIBS
+AC_DEFUN([CF_BUILD_CC],[
+CF_ACVERSION_CHECK(2.52,,
+	[AC_REQUIRE([CF_PROG_EXT])])
+if test "$cross_compiling" = yes ; then
+
+	# defaults that we might want to override
+	: ${BUILD_CFLAGS:=''}
+	: ${BUILD_CPPFLAGS:='ifelse([$1],,,[$1])'}
+	: ${BUILD_LDFLAGS:=''}
+	: ${BUILD_LIBS:='ifelse([$2],,,[$2])'}
+	: ${BUILD_EXEEXT:='$x'}
+	: ${BUILD_OBJEXT:='o'}
+
+	AC_ARG_WITH(build-cc,
+		[  --with-build-cc=XXX     the build C compiler ($BUILD_CC)],
+		[BUILD_CC="$withval"],
+		[AC_CHECK_PROGS(BUILD_CC, [gcc clang c99 c89 cc cl],none)])
+	AC_MSG_CHECKING(for native build C compiler)
+	AC_MSG_RESULT($BUILD_CC)
+
+	AC_MSG_CHECKING(for native build C preprocessor)
+	AC_ARG_WITH(build-cpp,
+		[  --with-build-cpp=XXX    the build C preprocessor ($BUILD_CPP)],
+		[BUILD_CPP="$withval"],
+		[BUILD_CPP='${BUILD_CC} -E'])
+	AC_MSG_RESULT($BUILD_CPP)
+
+	AC_MSG_CHECKING(for native build C flags)
+	AC_ARG_WITH(build-cflags,
+		[  --with-build-cflags=XXX the build C compiler-flags ($BUILD_CFLAGS)],
+		[BUILD_CFLAGS="$withval"])
+	AC_MSG_RESULT($BUILD_CFLAGS)
+
+	AC_MSG_CHECKING(for native build C preprocessor-flags)
+	AC_ARG_WITH(build-cppflags,
+		[  --with-build-cppflags=XXX the build C preprocessor-flags ($BUILD_CPPFLAGS)],
+		[BUILD_CPPFLAGS="$withval"])
+	AC_MSG_RESULT($BUILD_CPPFLAGS)
+
+	AC_MSG_CHECKING(for native build linker-flags)
+	AC_ARG_WITH(build-ldflags,
+		[  --with-build-ldflags=XXX the build linker-flags ($BUILD_LDFLAGS)],
+		[BUILD_LDFLAGS="$withval"])
+	AC_MSG_RESULT($BUILD_LDFLAGS)
+
+	AC_MSG_CHECKING(for native build linker-libraries)
+	AC_ARG_WITH(build-libs,
+		[  --with-build-libs=XXX   the build libraries (${BUILD_LIBS})],
+		[BUILD_LIBS="$withval"])
+	AC_MSG_RESULT($BUILD_LIBS)
+
+	# this assumes we're on Unix.
+	BUILD_EXEEXT=
+	BUILD_OBJEXT=o
+
+	: ${BUILD_CC:='${CC}'}
+
+	AC_MSG_CHECKING(if the build-compiler "$BUILD_CC" works)
+
+	cf_save_crossed=$cross_compiling
+	cf_save_ac_link=$ac_link
+	cross_compiling=no
+	ac_link='$BUILD_CC -o "conftest$ac_exeext" $BUILD_CFLAGS $BUILD_CPPFLAGS $BUILD_LDFLAGS "conftest.$ac_ext" $BUILD_LIBS >&AS_MESSAGE_LOG_FD'
+
+	AC_TRY_RUN([#include <stdio.h>
+		int main(int argc, char *argv[])
+		{
+			${cf_cv_main_return:-return}(argc < 0 || argv == 0 || argv[0] == 0);
+		}
+	],
+		cf_ok_build_cc=yes,
+		cf_ok_build_cc=no,
+		cf_ok_build_cc=unknown)
+
+	cross_compiling=$cf_save_crossed
+	ac_link=$cf_save_ac_link
+
+	AC_MSG_RESULT($cf_ok_build_cc)
+
+	if test "$cf_ok_build_cc" != yes
+	then
+		AC_MSG_ERROR([Cross-build requires two compilers.
+Use --with-build-cc to specify the native compiler.])
+	fi
+
+else
+	: ${BUILD_CC:='${CC}'}
+	: ${BUILD_CPP:='${CPP}'}
+	: ${BUILD_CFLAGS:='${CFLAGS}'}
+	: ${BUILD_CPPFLAGS:='${CPPFLAGS}'}
+	: ${BUILD_LDFLAGS:='${LDFLAGS}'}
+	: ${BUILD_LIBS:='${LIBS}'}
+	: ${BUILD_EXEEXT:='$x'}
+	: ${BUILD_OBJEXT:='o'}
+fi
+
+AC_SUBST(BUILD_CC)
+AC_SUBST(BUILD_CPP)
+AC_SUBST(BUILD_CFLAGS)
+AC_SUBST(BUILD_CPPFLAGS)
+AC_SUBST(BUILD_LDFLAGS)
+AC_SUBST(BUILD_LIBS)
+AC_SUBST(BUILD_EXEEXT)
+AC_SUBST(BUILD_OBJEXT)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_C11_NORETURN version: 3 updated: 2021/03/28 11:36:23
+dnl ---------------
+AC_DEFUN([CF_C11_NORETURN],
+[
+AC_MSG_CHECKING(if you want to use C11 _Noreturn feature)
+CF_ARG_ENABLE(stdnoreturn,
+	[  --enable-stdnoreturn    enable C11 _Noreturn feature for diagnostics],
+	[enable_stdnoreturn=yes],
+	[enable_stdnoreturn=no])
+AC_MSG_RESULT($enable_stdnoreturn)
+
+if test $enable_stdnoreturn = yes; then
+AC_CACHE_CHECK([for C11 _Noreturn feature], cf_cv_c11_noreturn,
+	[AC_TRY_COMPILE([
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdnoreturn.h>
+static _Noreturn void giveup(void) { exit(0); }
+	],
+	[if (feof(stdin)) giveup()],
+	cf_cv_c11_noreturn=yes,
+	cf_cv_c11_noreturn=no)
+	])
+else
+	cf_cv_c11_noreturn=no,
+fi
+
+if test "$cf_cv_c11_noreturn" = yes; then
+	AC_DEFINE(HAVE_STDNORETURN_H, 1,[Define if <stdnoreturn.h> header is available and working])
+	AC_DEFINE_UNQUOTED(STDC_NORETURN,_Noreturn,[Define if C11 _Noreturn keyword is supported])
+	HAVE_STDNORETURN_H=1
+else
+	HAVE_STDNORETURN_H=0
+fi
+
+AC_SUBST(HAVE_STDNORETURN_H)
+AC_SUBST(STDC_NORETURN)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CC_ENV_FLAGS version: 10 updated: 2020/12/31 18:40:20
+dnl ---------------
+dnl Check for user's environment-breakage by stuffing CFLAGS/CPPFLAGS content
+dnl into CC.  This will not help with broken scripts that wrap the compiler
+dnl with options, but eliminates a more common category of user confusion.
+dnl
+dnl In particular, it addresses the problem of being able to run the C
+dnl preprocessor in a consistent manner.
+dnl
+dnl Caveat: this also disallows blanks in the pathname for the compiler, but
+dnl the nuisance of having inconsistent settings for compiler and preprocessor
+dnl outweighs that limitation.
+AC_DEFUN([CF_CC_ENV_FLAGS],
+[
+# This should have been defined by AC_PROG_CC
+: "${CC:=cc}"
+
+AC_MSG_CHECKING(\$CFLAGS variable)
+case "x$CFLAGS" in
+(*-[[IUD]]*)
+	AC_MSG_RESULT(broken)
+	AC_MSG_WARN(your environment uses the CFLAGS variable to hold CPPFLAGS options)
+	cf_flags="$CFLAGS"
+	CFLAGS=
+	for cf_arg in $cf_flags
+	do
+		CF_ADD_CFLAGS($cf_arg)
+	done
+	;;
+(*)
+	AC_MSG_RESULT(ok)
+	;;
+esac
+
+AC_MSG_CHECKING(\$CC variable)
+case "$CC" in
+(*[[\ \	]]-*)
+	AC_MSG_RESULT(broken)
+	AC_MSG_WARN(your environment uses the CC variable to hold CFLAGS/CPPFLAGS options)
+	# humor him...
+	cf_prog=`echo "$CC" | sed -e 's/	/ /g' -e 's/[[ ]]* / /g' -e 's/[[ ]]*[[ ]]-[[^ ]].*//'`
+	cf_flags=`echo "$CC" | ${AWK:-awk} -v prog="$cf_prog" '{ printf("%s", [substr]([$]0,1+length(prog))); }'`
+	CC="$cf_prog"
+	for cf_arg in $cf_flags
+	do
+		case "x$cf_arg" in
+		(x-[[IUDfgOW]]*)
+			CF_ADD_CFLAGS($cf_arg)
+			;;
+		(*)
+			CC="$CC $cf_arg"
+			;;
+		esac
+	done
+	CF_VERBOSE(resulting CC: '$CC')
+	CF_VERBOSE(resulting CFLAGS: '$CFLAGS')
+	CF_VERBOSE(resulting CPPFLAGS: '$CPPFLAGS')
+	;;
+(*)
+	AC_MSG_RESULT(ok)
+	;;
+esac
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CFG_DEFAULTS version: 16 updated: 2021/01/04 19:33:05
+dnl ---------------
+dnl Determine the default configuration into which we'll install ncurses.  This
+dnl can be overridden by the user's command-line options.  There's two items to
+dnl look for:
+dnl	1. the prefix (e.g., /usr)
+dnl	2. the header files (e.g., /usr/include/ncurses)
+dnl We'll look for a previous installation of ncurses and use the same defaults.
+dnl
+dnl We don't use AC_PREFIX_DEFAULT, because it gets evaluated too soon, and
+dnl we don't use AC_PREFIX_PROGRAM, because we cannot distinguish ncurses's
+dnl programs from a vendor's.
+AC_DEFUN([CF_CFG_DEFAULTS],
+[AC_REQUIRE([AC_PROG_FGREP])dnl
+
+AC_MSG_CHECKING(for prefix)
+if test "x$prefix" = "xNONE" ; then
+	case "$cf_cv_system_name" in
+		# non-vendor systems don't have a conflict
+	(openbsd*|freebsd*|mirbsd*|linux*|cygwin*|msys*|k*bsd*-gnu|mingw*)
+		prefix=/usr
+		;;
+	(*)	prefix=$ac_default_prefix
+		;;
+	esac
+fi
+AC_MSG_RESULT($prefix)
+
+if test "x$prefix" = "xNONE" ; then
+AC_MSG_CHECKING(for default include-directory)
+test -n "$verbose" && echo 1>&AC_FD_MSG
+for cf_symbol in \
+	"$includedir" \
+	"$includedir/ncurses" \
+	"$prefix/include" \
+	"$prefix/include/ncurses" \
+	/usr/local/include \
+	/usr/local/include/ncurses \
+	/usr/include \
+	/usr/include/ncurses
+do
+	cf_dir=`eval echo "$cf_symbol"`
+	if test -f "$cf_dir/curses.h" ; then
+	if ( ${FGREP-fgrep} NCURSES_VERSION "$cf_dir/curses.h" >/dev/null 2>&1 ) ; then
+		includedir="$cf_symbol"
+		test -n "$verbose"  && echo $ECHO_N "	found " 1>&AC_FD_MSG
+		break
+	fi
+	fi
+	test -n "$verbose"  && echo "	tested $cf_dir" 1>&AC_FD_MSG
+done
+AC_MSG_RESULT($includedir)
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CGETENT version: 6 updated: 2017/01/21 11:06:25
+dnl ----------
+dnl Check if the terminal-capability database functions are available.  If not,
+dnl ncurses has a much-reduced version.
+AC_DEFUN([CF_CGETENT],[
+AC_CACHE_CHECK(for terminal-capability database functions,cf_cv_cgetent,[
+AC_TRY_LINK([
+#include <stdlib.h>],[
+	char temp[128];
+	char *buf = temp;
+	char *db_array = temp;
+	cgetent(&buf, &db_array, "vt100");
+	cgetcap(buf, "tc", '=');
+	cgetmatch(buf, "tc");
+	],
+	[cf_cv_cgetent=yes],
+	[cf_cv_cgetent=no])
+])
+
+if test "$cf_cv_cgetent" = yes
+then
+	AC_DEFINE(HAVE_BSD_CGETENT,1,[Define to 1 if we have BSD cgetent])
+AC_CACHE_CHECK(if cgetent uses const parameter,cf_cv_cgetent_const,[
+AC_TRY_LINK([
+#pragma GCC diagnostic error "-Wincompatible-pointer-types-discards-qualifiers"
+#include <stdlib.h>],[
+	char temp[128];
+	char *buf = temp;
+#ifndef _NETBSD_SOURCE			/* given, since April 2004 in stdlib.h */
+	const char *db_array = temp;
+	cgetent(&buf, &db_array, "vt100");
+#endif
+	cgetcap(buf, "tc", '=');
+	cgetmatch(buf, "tc");
+	],
+	[cf_cv_cgetent_const=yes],
+	[cf_cv_cgetent_const=no])
+])
+	if test "$cf_cv_cgetent_const" = yes
+	then
+		AC_DEFINE_UNQUOTED(CGETENT_CONST,const,[Define to const if needed for some BSD cgetent variations])
+	fi
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CHECK_CACHE version: 13 updated: 2020/12/31 10:54:15
+dnl --------------
+dnl Check if we're accidentally using a cache from a different machine.
+dnl Derive the system name, as a check for reusing the autoconf cache.
+dnl
+dnl If we've packaged config.guess and config.sub, run that (since it does a
+dnl better job than uname).  Normally we'll use AC_CANONICAL_HOST, but allow
+dnl an extra parameter that we may override, e.g., for AC_CANONICAL_SYSTEM
+dnl which is useful in cross-compiles.
+dnl
+dnl Note: we would use $ac_config_sub, but that is one of the places where
+dnl autoconf 2.5x broke compatibility with autoconf 2.13
+AC_DEFUN([CF_CHECK_CACHE],
+[
+if test -f "$srcdir/config.guess" || test -f "$ac_aux_dir/config.guess" ; then
+	ifelse([$1],,[AC_CANONICAL_HOST],[$1])
+	system_name="$host_os"
+else
+	system_name="`(uname -s -r) 2>/dev/null`"
+	if test -z "$system_name" ; then
+		system_name="`(hostname) 2>/dev/null`"
+	fi
+fi
+test -n "$system_name" && AC_DEFINE_UNQUOTED(SYSTEM_NAME,"$system_name",[Define to the system name.])
+AC_CACHE_VAL(cf_cv_system_name,[cf_cv_system_name="$system_name"])
+
+test -z "$system_name" && system_name="$cf_cv_system_name"
+test -n "$cf_cv_system_name" && AC_MSG_RESULT(Configuring for $cf_cv_system_name)
+
+if test ".$system_name" != ".$cf_cv_system_name" ; then
+	AC_MSG_RESULT(Cached system name ($system_name) does not agree with actual ($cf_cv_system_name))
+	AC_MSG_ERROR("Please remove config.cache and try again.")
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CHECK_ENVIRON version: 3 updated: 2010/05/26 16:44:57
+dnl ----------------
+dnl Check for data that is usually declared in <unistd.h>, e.g., the 'environ'
+dnl variable.  Define a DECL_xxx symbol if we must declare it ourselves.
+dnl
+dnl $1 = the name to check
+dnl $2 = the assumed type
+AC_DEFUN([CF_CHECK_ENVIRON],
+[
+AC_CACHE_CHECK(if external $1 is declared, cf_cv_dcl_$1,[
+    AC_TRY_COMPILE([
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#include <unistd.h> ],
+    ifelse([$2],,int,[$2]) x = (ifelse([$2],,int,[$2])) $1,
+    [cf_cv_dcl_$1=yes],
+    [cf_cv_dcl_$1=no])
+])
+
+if test "$cf_cv_dcl_$1" = no ; then
+    CF_UPPER(cf_result,decl_$1)
+    AC_DEFINE_UNQUOTED($cf_result)
+fi
+
+# It's possible (for near-UNIX clones) that the data doesn't exist
+CF_CHECK_EXTERN_DATA($1,ifelse([$2],,int,[$2]))
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CHECK_ERRNO version: 13 updated: 2020/03/10 18:53:47
+dnl --------------
+dnl Check for data that is usually declared in <stdio.h> or <errno.h>, e.g.,
+dnl the 'errno' variable.  Define a DECL_xxx symbol if we must declare it
+dnl ourselves.
+dnl
+dnl $1 = the name to check
+dnl $2 = the assumed type
+AC_DEFUN([CF_CHECK_ERRNO],
+[
+AC_CACHE_CHECK(if external $1 is declared, cf_cv_dcl_$1,[
+	AC_TRY_COMPILE([
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#include <stdio.h>
+#include <sys/types.h>
+#include <errno.h> ],
+	ifelse([$2],,int,[$2]) x = (ifelse([$2],,int,[$2])) $1; (void)x,
+	[cf_cv_dcl_$1=yes],
+	[cf_cv_dcl_$1=no])
+])
+
+if test "$cf_cv_dcl_$1" = no ; then
+	CF_UPPER(cf_result,decl_$1)
+	AC_DEFINE_UNQUOTED($cf_result)
+fi
+
+# It's possible (for near-UNIX clones) that the data doesn't exist
+CF_CHECK_EXTERN_DATA($1,ifelse([$2],,int,[$2]))
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CHECK_EXTERN_DATA version: 5 updated: 2021/09/04 06:35:04
+dnl --------------------
+dnl Check for existence of external data in the current set of libraries.  If
+dnl we can modify it, it is real enough.
+dnl $1 = the name to check
+dnl $2 = its type
+AC_DEFUN([CF_CHECK_EXTERN_DATA],
+[
+AC_CACHE_CHECK(if external $1 exists, cf_cv_have_$1,[
+	AC_TRY_LINK([
+#undef $1
+extern $2 $1;
+],
+	[$1 = 2],
+	[cf_cv_have_$1=yes],
+	[cf_cv_have_$1=no])
+])
+
+if test "$cf_cv_have_$1" = yes ; then
+	CF_UPPER(cf_result,have_$1)
+	AC_DEFINE_UNQUOTED($cf_result)
+fi
+
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CHECK_FVISIBILITY version: 2 updated: 2020/04/04 16:16:13
+dnl --------------------
+dnl Check whether the compiler understands -fvisibility=hidden
+dnl
+dnl $1 = compiler
+dnl $2 = compiler-flags variable name
+dnl $3 = cache variable to set
+AC_DEFUN([CF_CHECK_FVISIBILITY],[
+AC_CACHE_CHECK(if $1 -fvisibility=hidden option works,$3,[
+    cf_save_cflags="[$]$2"
+    $2="[$]$2 -fvisibility=hidden"
+    AC_TRY_LINK([
+__attribute__ ((visibility("default"))) int somefunc() {return 42;}
+	],[
+	if (somefunc()) return 1;
+],
+    [$3=yes],
+    [$3=no])
+    $2=$cf_save_cflags
+])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CHECK_GETENV version: 2 updated: 2021/01/02 17:09:14
+dnl ---------------
+dnl Check if repeated getenv calls return the same pointer, e.g., it does not
+dnl discard the previous pointer when returning a new one.
+AC_DEFUN([CF_CHECK_GETENV],
+[
+AC_REQUIRE([CF_CHECK_ENVIRON])
+AC_CHECK_FUNC( getenv, ,, AC_MSG_ERROR(getenv not found) )
+AC_CHECK_FUNCS( putenv setenv strdup )
+AC_CACHE_CHECK(if getenv returns consistent values,cf_cv_consistent_getenv,[
+AC_TRY_RUN([
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+
+#if defined(HAVE_ENVIRON) && defined(DECL_ENVIRON) && !defined(environ)
+extern char **environ;	/* POSIX, but some systems are not... */
+#endif
+
+#if defined(HAVE_STRDUP)
+#define str_alloc(s) strdup(s)
+#else
+#define str_alloc(s) strcpy(malloc(strlen(s) + 1, s))
+#endif
+
+static void set_value(const char *name, const char *value)
+{
+#if defined(HAVE_SETENV)
+	setenv(name, value, 1);
+#elif defined(HAVE_PUTENV)
+	char buffer[1024];
+	sprintf(buffer, "%s=%s", name, value);
+	putenv(str_alloc(buffer));
+#else
+#error neither putenv/setenv found
+#endif
+}
+int main(void)
+{
+	int pass;
+	size_t numenv, limit, j;
+	char **mynames;
+	char **myvalues;
+	char **mypointer;
+	char *equals;
+	for (numenv = 0; environ[numenv]; ++numenv) ;
+	limit = numenv + 10;
+	mynames = (char **) calloc(limit + 1, sizeof(char *));
+	myvalues = (char **) calloc(limit + 1, sizeof(char *));
+	mypointer = (char **) calloc(limit + 1, sizeof(char *));
+#if defined(HAVE_ENVIRON)
+	for (j = 0; environ[j]; ++j) {
+		mynames[j] = str_alloc(environ[j]);
+		equals = strchr(mynames[j], '=');
+		if (equals != 0) {
+			*equals++ = '\\0';
+			myvalues[j] = str_alloc(equals);
+		} else {
+			myvalues[j] = str_alloc("");
+		}
+	}
+#endif
+	for (j = numenv; j < limit; ++j) {
+		char name[80];
+		char value[80];
+		size_t found;
+		size_t k = 0;
+		do {
+			size_t jk;
+			found = 0;
+			sprintf(name, "TERM%lu", (unsigned long) k);
+			for (jk = 0; jk < j; ++jk) {
+				if (!strcmp(name, mynames[jk])) {
+					found = 1;
+					++k;
+					break;
+				}
+			}
+		} while (found);
+		sprintf(value, "%lu:%p", (unsigned long) k, &mynames[j]);
+		set_value(name, value);
+		mynames[j] = str_alloc(name);
+		myvalues[j] = str_alloc(value);
+	}
+	for (pass = 0; pass < 3; ++pass) {
+		for (j = 0; j < limit; ++j) {
+			char *value = getenv(mynames[j]);
+			if (pass) {
+				if (value == 0) {
+					fprintf(stderr, "getenv returned null for %s\\n", mynames[j]);
+					${cf_cv_main_return:-return}(1);
+				} else if (value != mypointer[j]) {
+					fprintf(stderr, "getenv returned different pointer for %s\\n", mynames[j]);
+					${cf_cv_main_return:-return}(1);
+				} else if (strcmp(value, myvalues[j])) {
+					fprintf(stderr, "getenv returned different value for %s\\n", mynames[j]);
+					${cf_cv_main_return:-return}(1);
+				}
+			} else {
+				size_t k;
+				mypointer[j] = value;
+				for (k = 0; k < j; ++k) {
+					if (mypointer[j] == mypointer[k]) {
+						fprintf(stderr, "getenv returned same pointer for %s and %s\\n", mynames[j], mynames[k]);
+						${cf_cv_main_return:-return}(1);
+					}
+				}
+			}
+		}
+	}
+	${cf_cv_main_return:-return}(0);
+}
+],
+[cf_cv_consistent_getenv=yes],
+[cf_cv_consistent_getenv=no],
+[cf_cv_consistent_getenv=unknown])
+])
+
+if test "x$cf_cv_consistent_getenv" = xno
+then
+	AC_DEFINE(HAVE_CONSISTENT_GETENV,1,[Define to 1 if getenv repeatably returns the same value for a given name])
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CHECK_GNAT_VERSION version: 4 updated: 2021/01/01 13:31:04
+dnl ---------------------
+AC_DEFUN([CF_CHECK_GNAT_VERSION],
+[
+AC_REQUIRE([CF_GNAT_VERSION])
+case "$cf_cv_gnat_version" in
+(3.1[[1-9]]*|3.[[2-9]]*|[[4-9]].*|[[1-9]][[0-9]].[[0-9]]*|20[[0-9]][[0-9]])
+	cf_cv_prog_gnat_correct=yes
+	;;
+(*)
+	AC_MSG_WARN(Unsupported GNAT version $cf_cv_gnat_version. We require 3.11 or better. Disabling Ada95 binding.)
+	cf_cv_prog_gnat_correct=no
+	;;
+esac
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_CHECK_GPM_WGETCH version: 6 updated: 2021/01/04 18:48:01
+dnl -------------------
+dnl Check if GPM is already linked with curses.  If so - and if the linkage
+dnl is not "weak" - warn about this because it can create problems linking
+dnl applications with ncurses.
+AC_DEFUN([CF_CHECK_GPM_WGETCH],[
+AC_REQUIRE([AC_PROG_EGREP])dnl
+
+AC_CHECK_LIB(gpm,Gpm_Wgetch,[
+
+AC_CACHE_CHECK(if GPM is weakly bound to curses library, cf_cv_check_gpm_wgetch,[
+cf_cv_check_gpm_wgetch=unknown
+if test "$cross_compiling" != yes ; then
+
+cat >conftest.$ac_ext <<CF_EOF
+#include <gpm.h>
+int main(void)
+{
+	Gpm_Wgetch();
+	${cf_cv_main_return:-return}(0);
+}
+CF_EOF
+
+	cf_save_LIBS="$LIBS"
+	# This only works if we can look at the symbol table.  If a shared
+	# library is stripped for install, we cannot use that.  So we're forced
+	# to rely on the static library, noting that some packagers may not
+	# include it.
+	LIBS="-static -lgpm -dynamic $LIBS"
+	if AC_TRY_EVAL(ac_compile) ; then
+		if AC_TRY_EVAL(ac_link) ; then
+			cf_cv_check_gpm_wgetch="`nm \"conftest$ac_exeext\" | ${EGREP-egrep} '\<wgetch\>' | ${EGREP-egrep} '\<[[vVwW]]\>'`"
+			test -n "$cf_cv_check_gpm_wgetch" && cf_cv_check_gpm_wgetch=yes
+			test -z "$cf_cv_check_gpm_wgetch" && cf_cv_check_gpm_wgetch=no
+		fi
+	fi
+	rm -rf ./conftest*
+	LIBS="$cf_save_LIBS"
+fi
+])
+
+if test "$cf_cv_check_gpm_wgetch" != yes ; then
+	AC_MSG_WARN(GPM library is already linked with curses - read the FAQ)
+fi
+])])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CHECK_LIBSSP version: 1 updated: 2021/10/30 10:40:19
+dnl ---------------
+dnl Check if libssp is needed, e.g., to work around misconfigured libraries
+dnl used in cross-compiling to MinGW.
+AC_DEFUN([CF_CHECK_LIBSSP],[
+AC_CACHE_CHECK(if ssp library is needed,cf_cv_need_libssp,[
+AC_TRY_LINK([
+#include <sys/types.h>
+#include <dirent.h>
+],[
+       DIR *dp = opendir(".");
+],cf_cv_need_libssp=no,[
+	cf_save_LIBS="$LIBS"
+	LIBS="$LIBS -lssp"
+	AC_TRY_LINK([
+#include <sys/types.h>
+#include <dirent.h>
+	],[
+		   DIR *dp = opendir(".");
+	],cf_cv_need_libssp=yes,
+	  cf_cv_need_libssp=maybe)
+	LIBS="$cf_save_LIBS"
+])dnl
+])
+
+if test "x$cf_cv_need_libssp" = xyes
+then
+	CF_ADD_LIB(ssp)
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CHECK_LIBTOOL_VERSION version: 2 updated: 2021/05/01 16:24:34
+dnl ------------------------
+dnl Show the version of libtool
+dnl
+dnl Save the version in a cache variable - this is not entirely a good thing,
+dnl but the version string from libtool is very ugly, and for bug reports it
+dnl might be useful to have the original string.
+dnl
+dnl There is an imitation in OpenBSD, which has no apparent use other than to
+dnl deny that it is GNU libtool.  Just ignore it.
+AC_DEFUN([CF_CHECK_LIBTOOL_VERSION],[
+if test -n "$LIBTOOL" && test "$LIBTOOL" != none
+then
+	AC_MSG_CHECKING(version of $LIBTOOL)
+	CF_LIBTOOL_VERSION
+	AC_MSG_RESULT($cf_cv_libtool_version)
+	if test -n "$cf_cv_libtool_version"
+	then
+		cf_check_libtool_version=`$LIBTOOL --version 2>&1 | sed -e '/^$/d' -e 's,[[()]],...,g' -e 's,[[ ]],-,g' -e '2,$d'`
+		case "x$cf_check_libtool_version" in
+		(*...GNU-libtool...*)
+			;;
+		(*)
+			AC_MSG_ERROR(This is not GNU libtool)
+			;;
+		esac
+	else
+		AC_MSG_ERROR(No version found for $LIBTOOL)
+	fi
+else
+	AC_MSG_ERROR(GNU libtool has not been found)
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CHECK_WCHAR_H version: 3 updated: 2021/01/01 13:31:04
+dnl ----------------
+dnl Check if wchar.h can be used, i.e., without defining _XOPEN_SOURCE_EXTENDED
+AC_DEFUN([CF_CHECK_WCHAR_H],[
+AC_CHECK_HEADERS( \
+wchar.h \
+wctype.h \
+)
+AC_CACHE_CHECK(if wchar.h can be used as is,cf_cv_wchar_h_okay,[
+AC_TRY_COMPILE(
+[
+#include <stdlib.h>
+#ifdef HAVE_WCHAR_H
+#include <wchar.h>
+#endif
+#ifdef HAVE_WCTYPE_H
+#include <wctype.h>
+#endif
+],[
+	wint_t foo = 0;
+	int bar = iswpunct(foo)],
+	[cf_cv_wchar_h_okay=yes],
+	[cf_cv_wchar_h_okay=no])])
+
+if test "$cf_cv_wchar_h_okay" = no
+then
+	CF_PREDEFINE(_XOPEN_SOURCE_EXTENDED)
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CHECK_WCWIDTH_GRAPHICS version: 2 updated: 2021/01/02 17:09:14
+dnl -------------------------
+dnl Most "modern" terminal emulators are based to some degree on VT100, and
+dnl should support line-drawing.  Even with Unicode.  There is a problem.
+dnl
+dnl While most of the VT100 graphics characters were incorporated into Unicode,
+dnl all of those were combined into a page of useful graphics characters.
+dnl
+dnl So far, so good.
+dnl
+dnl However, while they are useful, there are other considerations.  CJK
+dnl is (because of poor device resolution) often rendered as double-width
+dnl characters.  So... for these generally-useful characters, what should
+dnl be the width (to make them consistent with adjacent characters)?
+dnl
+dnl The obvious choice would have been to make this locale-dependent, and use
+dnl wcwidth() to tell applications what the actual width is.  That was too
+dnl obvious.  Instead, we have a slew of "ambiguous-width" characters.
+dnl See for example
+dnl		http://www.unicode.org/reports/tr11/tr11-29.html
+dnl		http://www.cl.cam.ac.uk/~mgk25/ucs/scw-proposal.html
+dnl
+dnl The EastAsianWidth-6.2.0.txt file from the Unicode organization lists
+dnl more than 22,000 characters, with 1281 of those as ambiguous-width.  For
+dnl instance, it lists half (44/96) of the Latin-1 characters as
+dnl ambiguous-width.  Also, all of the box-characters at 0x2500 are ambiguous.
+dnl
+dnl What this means for the implementor is that on some systems wcwidth() can
+dnl give bad advice.  On Solaris, some of the ambiguous widths are returned as
+dnl 1 (the Latin-1 characters), while others are returned as 2 (line-drawing
+dnl characters).  These do not necessarily match the behavior of the terminal
+dnl emulator.  xterm, for instance, does an optional startup check to find if
+dnl this problem (or similar) exists with the system's locale tables, rejecting
+dnl them if they are too unreliable.
+AC_DEFUN([CF_CHECK_WCWIDTH_GRAPHICS],[
+AC_CACHE_CHECK(if wcwidth agrees graphics are single-width, cf_cv_wcwidth_graphics,[
+cat >conftest.in <<CF_EOF
+-	VT100 symbols
+0x250c	upper left corner
+0x2514	lower left corner
+0x2510	upper right corner
+0x2518	lower right corner
+0x251c	tee pointing left
+0x2524	tee pointing right
+0x2534	tee pointing up
+0x252c	tee pointing down
+0x2500	horizontal line
+0x2502	vertical line
+0x253c	large plus or crossover
+0x23ba	scan line 1
+0x23bd	scan line 9
+0x25c6	diamond
+0x2592	checker board (stipple)
+0x00b0	degree symbol
+0x00b1	plus/minus
+0x00b7	bullet
+-	Teletype 5410v1 symbols
+0x2190	arrow pointing left
+0x2192	arrow pointing right
+0x2193	arrow pointing down
+0x2191	arrow pointing up
+0x2592	board of squares
+0x2603	lantern symbol
+0x25ae	solid square block
+-	these defaults were invented for ncurses
+0x23bb	scan line 3
+0x23bc	scan line 7
+0x2264	less-than-or-equal-to
+0x2265	greater-than-or-equal-to
+0x03c0	greek pi
+0x2260	not-equal
+0x00a3	pound-sterling symbol
+-	thick-line-drawing
+0x250f	upper left corner
+0x2517	lower left corner
+0x2513	upper right corner
+0x251b	lower right corner
+0x2523	tee pointing left
+0x252b	tee pointing right
+0x253b	tee pointing up
+0x2533	tee pointing down
+0x2501	horizontal line
+0x2503	vertical line
+0x254b	large plus or crossover
+-	double-line-drawing
+0x2554	upper left corner
+0x255a	lower left corner
+0x2557	upper right corner
+0x255d	lower right corner
+0x2563	tee pointing left
+0x2560	tee pointing right
+0x2569	tee pointing up
+0x2566	tee pointing down
+0x2550	horizontal line
+0x2551	vertical line
+0x256c	large plus or crossover
+CF_EOF
+AC_TRY_RUN([
+#include <locale.h>
+#include <stdio.h>
+#include <wchar.h>
+
+#define MY_LEN 80
+
+int
+main(void)
+{
+	FILE *fp;
+	int value;
+	char buffer[MY_LEN + 1];
+	char notes[MY_LEN + 1];
+	int totals = 0;
+	int passed = 0;
+
+	if (setlocale(LC_ALL, "en_US.UTF8") ||
+		setlocale(LC_ALL, "en_US.UTF-8") ||
+		setlocale(LC_ALL, "en_US.utf8") ||
+		setlocale(LC_ALL, "en_US.utf-8")) {
+		if ((fp = fopen("conftest.in", "r")) != 0) {
+			while (fgets(buffer, MY_LEN, fp) != 0) {
+				if (*buffer == '-') {
+					fprintf(stderr, "\\t%s", buffer);
+				} else if (sscanf(buffer, "%x %s", &value, notes) == 2) {
+					++totals;
+					if (wcwidth(value) == 1)
+						++passed;
+					fprintf(stderr, "%d\\t%s", wcwidth(value), buffer);
+				} else {
+					fprintf(stderr, "?\\t%s", buffer);
+				}
+			}
+		}
+	}
+	fprintf(stderr, "%d/%d passed wcwidth/graphics check\\n", passed, totals);
+	return (totals == passed) ? 0 : 1;
+}
+],
+[cf_cv_wcwidth_graphics=yes],
+[cf_cv_wcwidth_graphics=no],
+[cf_cv_wcwidth_graphics=unknown])
+])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CLANG_COMPILER version: 8 updated: 2021/01/01 13:31:04
+dnl -----------------
+dnl Check if the given compiler is really clang.  clang's C driver defines
+dnl __GNUC__ (fooling the configure script into setting $GCC to yes) but does
+dnl not ignore some gcc options.
+dnl
+dnl This macro should be run "soon" after AC_PROG_CC or AC_PROG_CPLUSPLUS, to
+dnl ensure that it is not mistaken for gcc/g++.  It is normally invoked from
+dnl the wrappers for gcc and g++ warnings.
+dnl
+dnl $1 = GCC (default) or GXX
+dnl $2 = CLANG_COMPILER (default)
+dnl $3 = CFLAGS (default) or CXXFLAGS
+AC_DEFUN([CF_CLANG_COMPILER],[
+ifelse([$2],,CLANG_COMPILER,[$2])=no
+
+if test "$ifelse([$1],,[$1],GCC)" = yes ; then
+	AC_MSG_CHECKING(if this is really Clang ifelse([$1],GXX,C++,C) compiler)
+	cf_save_CFLAGS="$ifelse([$3],,CFLAGS,[$3])"
+	AC_TRY_COMPILE([],[
+#ifdef __clang__
+#else
+make an error
+#endif
+],[ifelse([$2],,CLANG_COMPILER,[$2])=yes
+],[])
+	ifelse([$3],,CFLAGS,[$3])="$cf_save_CFLAGS"
+	AC_MSG_RESULT($ifelse([$2],,CLANG_COMPILER,[$2]))
+fi
+
+CLANG_VERSION=none
+
+if test "x$ifelse([$2],,CLANG_COMPILER,[$2])" = "xyes" ; then
+	case "$CC" in
+	(c[[1-9]][[0-9]]|*/c[[1-9]][[0-9]])
+		AC_MSG_WARN(replacing broken compiler alias $CC)
+		CFLAGS="$CFLAGS -std=`echo "$CC" | sed -e 's%.*/%%'`"
+		CC=clang
+		;;
+	esac
+
+	AC_MSG_CHECKING(version of $CC)
+	CLANG_VERSION="`$CC --version 2>/dev/null | sed -e '2,$d' -e 's/^.*(CLANG[[^)]]*) //' -e 's/^.*(Debian[[^)]]*) //' -e 's/^[[^0-9.]]*//' -e 's/[[^0-9.]].*//'`"
+	test -z "$CLANG_VERSION" && CLANG_VERSION=unknown
+	AC_MSG_RESULT($CLANG_VERSION)
+
+	for cf_clang_opt in \
+		-Qunused-arguments \
+		-Wno-error=implicit-function-declaration
+	do
+		AC_MSG_CHECKING(if option $cf_clang_opt works)
+		cf_save_CFLAGS="$CFLAGS"
+		CFLAGS="$CFLAGS $cf_clang_opt"
+		AC_TRY_LINK([
+			#include <stdio.h>],[
+			printf("hello!\\n");],[
+			cf_clang_optok=yes],[
+			cf_clang_optok=no])
+		AC_MSG_RESULT($cf_clang_optok)
+		CFLAGS="$cf_save_CFLAGS"
+		if test "$cf_clang_optok" = yes; then
+			CF_VERBOSE(adding option $cf_clang_opt)
+			CF_APPEND_TEXT(CFLAGS,$cf_clang_opt)
+		fi
+	done
+fi
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_CONST_X_STRING version: 7 updated: 2021/06/07 17:39:17
+dnl -----------------
+dnl The X11R4-X11R6 Xt specification uses an ambiguous String type for most
+dnl character-strings.
+dnl
+dnl It is ambiguous because the specification accommodated the pre-ANSI
+dnl compilers bundled by more than one vendor in lieu of providing a standard C
+dnl compiler other than by costly add-ons.  Because of this, the specification
+dnl did not take into account the use of const for telling the compiler that
+dnl string literals would be in readonly memory.
+dnl
+dnl As a workaround, one could (starting with X11R5) define XTSTRINGDEFINES, to
+dnl let the compiler decide how to represent Xt's strings which were #define'd.
+dnl That does not solve the problem of using the block of Xt's strings which
+dnl are compiled into the library (and is less efficient than one might want).
+dnl
+dnl Xt specification 7 introduces the _CONST_X_STRING symbol which is used both
+dnl when compiling the library and compiling using the library, to tell the
+dnl compiler that String is const.
+AC_DEFUN([CF_CONST_X_STRING],
+[
+AC_REQUIRE([AC_PATH_XTRA])
+
+CF_SAVE_XTRA_FLAGS([CF_CONST_X_STRING])
+
+AC_TRY_COMPILE(
+[
+#include <stdlib.h>
+#include <X11/Intrinsic.h>
+],
+[String foo = malloc(1); free((void*)foo)],[
+
+AC_CACHE_CHECK(for X11/Xt const-feature,cf_cv_const_x_string,[
+	AC_TRY_COMPILE(
+		[
+#define _CONST_X_STRING	/* X11R7.8 (perhaps) */
+#undef  XTSTRINGDEFINES	/* X11R5 and later */
+#include <stdlib.h>
+#include <X11/Intrinsic.h>
+		],[String foo = malloc(1); *foo = 0],[
+			cf_cv_const_x_string=no
+		],[
+			cf_cv_const_x_string=yes
+		])
+])
+
+CF_RESTORE_XTRA_FLAGS([CF_CONST_X_STRING])
+
+case "$cf_cv_const_x_string" in
+(no)
+	CF_APPEND_TEXT(CPPFLAGS,-DXTSTRINGDEFINES)
+	;;
+(*)
+	CF_APPEND_TEXT(CPPFLAGS,-D_CONST_X_STRING)
+	;;
+esac
+
+])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CPP_OVERRIDE version: 1 updated: 2022/08/20 16:07:10
+dnl ---------------
+dnl Check if the C++ compiler accepts the override keyword.  This is a C++-11
+dnl feature.
+AC_DEFUN([CF_CPP_OVERRIDE],
+[
+if test -n "$CXX"; then
+AC_CACHE_CHECK(if $CXX accepts override keyword,cf_cv_cpp_override,[
+	AC_LANG_SAVE
+	AC_LANG_CPLUSPLUS
+	AC_TRY_RUN([
+
+class base
+{
+public:
+	virtual int foo(float x) = 0; 
+};
+
+
+class derived: public base
+{
+public:
+	int foo(float x) override { return x != 0.0 ? 1 : 0; }
+};
+
+int main(void) { }
+],
+	[cf_cv_cpp_override=yes],
+	[cf_cv_cpp_override=no],
+	[cf_cv_cpp_override=unknown])
+	AC_LANG_RESTORE
+])
+fi
+test "$cf_cv_cpp_override" = yes && AC_DEFINE(CPP_HAS_OVERRIDE,1,[Define to 1 if C++ has override keyword])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CPP_PARAM_INIT version: 7 updated: 2017/01/21 11:06:25
+dnl -----------------
+dnl Check if the C++ compiler accepts duplicate parameter initialization.  This
+dnl is a late feature for the standard and is not in some recent compilers
+dnl (1999/9/11).
+AC_DEFUN([CF_CPP_PARAM_INIT],
+[
+if test -n "$CXX"; then
+AC_CACHE_CHECK(if $CXX accepts parameter initialization,cf_cv_cpp_param_init,[
+	AC_LANG_SAVE
+	AC_LANG_CPLUSPLUS
+	AC_TRY_RUN([
+class TEST {
+private:
+	int value;
+public:
+	TEST(int x = 1);
+	~TEST();
+};
+
+TEST::TEST(int x = 1)	// some compilers do not like second initializer
+{
+	value = x;
+}
+int main(void) { }
+],
+	[cf_cv_cpp_param_init=yes],
+	[cf_cv_cpp_param_init=no],
+	[cf_cv_cpp_param_init=unknown])
+	AC_LANG_RESTORE
+])
+fi
+test "$cf_cv_cpp_param_init" = yes && AC_DEFINE(CPP_HAS_PARAM_INIT,1,[Define to 1 if C++ has parameter initialization])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CPP_STATIC_CAST version: 3 updated: 2013/04/13 18:03:21
+dnl ------------------
+dnl Check if the C++ compiler accepts static_cast in generics.  This appears to
+dnl not be supported in g++ before 3.0
+AC_DEFUN([CF_CPP_STATIC_CAST],
+[
+if test -n "$CXX"; then
+
+AC_CACHE_CHECK(if $CXX accepts static_cast,cf_cv_cpp_static_cast,[
+	AC_LANG_SAVE
+	AC_LANG_CPLUSPLUS
+
+	AC_TRY_COMPILE([
+class NCursesPanel
+{
+public:
+  NCursesPanel(int nlines,
+	       int ncols,
+	       int begin_y = 0,
+	       int begin_x = 0)
+  {
+  }
+  NCursesPanel();
+  ~NCursesPanel();
+};
+
+template<class T> class NCursesUserPanel : public NCursesPanel
+{
+public:
+  NCursesUserPanel (int nlines,
+		    int ncols,
+		    int begin_y = 0,
+		    int begin_x = 0,
+		    const T* p_UserData = static_cast<T*>(0))
+    : NCursesPanel (nlines, ncols, begin_y, begin_x)
+  {
+  };
+  NCursesUserPanel(const T* p_UserData = static_cast<T*>(0)) : NCursesPanel()
+  {
+  };
+
+  virtual ~NCursesUserPanel() {};
+};
+],[
+	const char* p_UserData = static_cast<char*>(0)],
+	[cf_cv_cpp_static_cast=yes],
+	[cf_cv_cpp_static_cast=no])
+
+	AC_LANG_RESTORE
+])
+
+fi
+
+test "$cf_cv_cpp_static_cast" = yes && AC_DEFINE(CPP_HAS_STATIC_CAST,1,[Define to 1 if C++ has static_cast])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CXX_AR_FLAGS version: 3 updated: 2021/01/01 13:31:04
+dnl ---------------
+dnl Setup special archiver flags for given compilers.
+AC_DEFUN([CF_CXX_AR_FLAGS],[
+	CXX_AR='$(AR)'
+	CXX_ARFLAGS='$(ARFLAGS)'
+	case "$cf_cv_system_name" in
+	(irix*)
+	    if test "$GXX" != yes ; then
+		CXX_AR='$(CXX)'
+		CXX_ARFLAGS='-ar -o'
+	    fi
+	    ;;
+	(sco3.2v5*)
+	    CXXLDFLAGS="-u main"
+	    ;;
+	(solaris2*)
+	    if test "$GXX" != yes ; then
+		CXX_AR='$(CXX)'
+		CXX_ARFLAGS='-xar -o'
+	    fi
+	    ;;
+	esac
+	AC_SUBST(CXXLDFLAGS)
+	AC_SUBST(CXX_AR)
+	AC_SUBST(CXX_ARFLAGS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CXX_IOSTREAM_NAMESPACE version: 2 updated: 2012/10/06 17:56:13
+dnl -------------------------
+dnl For c++, check if iostream uses "std::" namespace.
+AC_DEFUN([CF_CXX_IOSTREAM_NAMESPACE],[
+AC_CHECK_HEADERS(iostream)
+if test x"$ac_cv_header_iostream" = xyes ; then
+	AC_MSG_CHECKING(if iostream uses std-namespace)
+	AC_TRY_COMPILE([
+#include <iostream>
+using std::endl;
+using std::cerr;],[
+cerr << "testing" << endl;
+],[cf_iostream_namespace=yes],[cf_iostream_namespace=no])
+	AC_MSG_RESULT($cf_iostream_namespace)
+	if test "$cf_iostream_namespace" = yes ; then
+		AC_DEFINE(IOSTREAM_NAMESPACE,1,[Define to 1 if C++ has namespace iostream])
+	fi
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_C_INLINE version: 6 updated: 2019/09/07 13:38:36
+dnl -----------
+dnl Check if the C compiler supports "inline".
+dnl $1 is the name of a shell variable to set if inline is supported
+dnl $2 is the threshold for gcc 4.x's option controlling maximum inline size
+AC_DEFUN([CF_C_INLINE],[
+AC_REQUIRE([CF_GCC_VERSION])
+AC_C_INLINE
+$1=
+if test "$ac_cv_c_inline" != no ; then
+	$1=inline
+	if test "$INTEL_COMPILER" = yes
+	then
+		:
+	elif test "$CLANG_COMPILER" = yes
+	then
+		:
+	elif test "$GCC" = yes
+	then
+		AC_CACHE_CHECK(if $CC supports options to tune inlining,cf_cv_gcc_inline,[
+		cf_save_CFLAGS=$CFLAGS
+		CFLAGS="$CFLAGS --param max-inline-insns-single=$2"
+		AC_TRY_COMPILE([inline int foo(void) { return 1; }],
+		[${cf_cv_main_return:-return} foo()],
+		[cf_cv_gcc_inline=yes],
+		[cf_cv_gcc_inline=no])
+		CFLAGS=$cf_save_CFLAGS
+		])
+		if test "$cf_cv_gcc_inline" = yes ; then
+			CF_ADD_CFLAGS([--param max-inline-insns-single=$2])
+		fi
+	fi
+fi
+AC_SUBST($1)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_DIRNAME version: 5 updated: 2020/12/31 20:19:42
+dnl ----------
+dnl "dirname" is not portable, so we fake it with a shell script.
+AC_DEFUN([CF_DIRNAME],[$1=`echo "$2" | sed -e 's%/[[^/]]*$%%'`])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_DIRS_TO_MAKE version: 4 updated: 2021/01/01 13:31:04
+dnl ---------------
+AC_DEFUN([CF_DIRS_TO_MAKE],
+[
+DIRS_TO_MAKE="lib"
+for cf_item in $cf_list_models
+do
+	CF_OBJ_SUBDIR($cf_item,cf_subdir)
+	for cf_item2 in $DIRS_TO_MAKE
+	do
+		test "$cf_item2" = "$cf_subdir" && break
+	done
+	test ".$cf_item2" != ".$cf_subdir" && DIRS_TO_MAKE="$DIRS_TO_MAKE $cf_subdir"
+done
+for cf_dir in $DIRS_TO_MAKE
+do
+	test ! -d "$cf_dir" && mkdir "$cf_dir"
+done
+AC_SUBST(DIRS_TO_MAKE)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_DISABLE_ECHO version: 14 updated: 2021/09/04 06:35:04
+dnl ---------------
+dnl You can always use "make -n" to see the actual options, but it is hard to
+dnl pick out/analyze warning messages when the compile-line is long.
+dnl
+dnl Sets:
+dnl	ECHO_LT - symbol to control if libtool is verbose
+dnl	ECHO_LD - symbol to prefix "cc -o" lines
+dnl	RULE_CC - symbol to put before implicit "cc -c" lines (e.g., .c.o)
+dnl	SHOW_CC - symbol to put before explicit "cc -c" lines
+dnl	ECHO_CC - symbol to put before any "cc" line
+dnl
+AC_DEFUN([CF_DISABLE_ECHO],[
+AC_MSG_CHECKING(if you want to see long compiling messages)
+CF_ARG_DISABLE(echo,
+	[  --disable-echo          do not display "compiling" commands],
+	[
+	ECHO_LT='--silent'
+	ECHO_LD='@echo linking [$]@;'
+	RULE_CC='@echo compiling [$]<'
+	SHOW_CC='@echo compiling [$]@'
+	ECHO_CC='@'
+],[
+	ECHO_LT=''
+	ECHO_LD=''
+	RULE_CC=''
+	SHOW_CC=''
+	ECHO_CC=''
+])
+AC_MSG_RESULT($enableval)
+AC_SUBST(ECHO_LT)
+AC_SUBST(ECHO_LD)
+AC_SUBST(RULE_CC)
+AC_SUBST(SHOW_CC)
+AC_SUBST(ECHO_CC)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_DISABLE_GNAT_PROJECTS version: 1 updated: 2014/06/01 11:34:00
+dnl ------------------------
+AC_DEFUN([CF_DISABLE_GNAT_PROJECTS],[
+AC_MSG_CHECKING(if we want to use GNAT projects)
+CF_ARG_DISABLE(gnat-projects,
+	[  --disable-gnat-projects test: disable GNAT projects even if usable],
+	[enable_gnat_projects=no],
+	[enable_gnat_projects=yes])
+AC_MSG_RESULT($enable_gnat_projects)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_DISABLE_LEAKS version: 9 updated: 2021/04/03 16:41:50
+dnl ----------------
+dnl Combine no-leak checks with the libraries or tools that are used for the
+dnl checks.
+AC_DEFUN([CF_DISABLE_LEAKS],[
+
+AC_REQUIRE([CF_WITH_DMALLOC])
+AC_REQUIRE([CF_WITH_DBMALLOC])
+AC_REQUIRE([CF_WITH_VALGRIND])
+
+AC_MSG_CHECKING(if you want to perform memory-leak testing)
+AC_ARG_ENABLE(leaks,
+	[  --disable-leaks         test: free permanent memory, analyze leaks],
+	[enable_leaks=$enableval],
+	[enable_leaks=yes])
+dnl with_no_leaks is more readable...
+if test "x$enable_leaks" = xno; then with_no_leaks=yes; else with_no_leaks=no; fi
+AC_MSG_RESULT($with_no_leaks)
+
+if test "$enable_leaks" = no ; then
+	AC_DEFINE(NO_LEAKS,1,[Define to 1 if you want to perform memory-leak testing.])
+	AC_DEFINE(YY_NO_LEAKS,1,[Define to 1 if you want to perform memory-leak testing.])
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_DISABLE_LIBTOOL_VERSION version: 3 updated: 2015/04/17 21:13:04
+dnl --------------------------
+dnl Check if we should use the libtool 1.5 feature "-version-number" instead of
+dnl the older "-version-info" feature.  The newer feature allows us to use
+dnl version numbering on shared libraries which make them compatible with
+dnl various systems.
+AC_DEFUN([CF_DISABLE_LIBTOOL_VERSION],
+[
+AC_MSG_CHECKING(if libtool -version-number should be used)
+CF_ARG_DISABLE(libtool-version,
+	[  --disable-libtool-version  enable to use libtool's incompatible naming scheme],
+	[cf_libtool_version=no],
+	[cf_libtool_version=yes])
+AC_MSG_RESULT($cf_libtool_version)
+
+if test "$cf_libtool_version" = yes ; then
+	LIBTOOL_VERSION="-version-number"
+else
+	LIBTOOL_VERSION="-version-info"
+	case "x$VERSION" in
+	(x)
+		AC_MSG_WARN(VERSION was not set)
+		;;
+	(x*.*.*)
+		ABI_VERSION="$VERSION"
+		CF_VERBOSE(ABI_VERSION: $ABI_VERSION)
+		;;
+	(x*:*:*)
+		ABI_VERSION=`echo "$VERSION" | sed -e 's/:/./g'`
+		CF_VERBOSE(ABI_VERSION: $ABI_VERSION)
+		;;
+	(*)
+		AC_MSG_WARN(unexpected VERSION value: $VERSION)
+		;;
+	esac
+fi
+
+AC_SUBST(ABI_VERSION)
+AC_SUBST(LIBTOOL_VERSION)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_DISABLE_RPATH_HACK version: 3 updated: 2021/01/05 20:14:44
+dnl ---------------------
+dnl The rpath-hack makes it simpler to build programs, particularly with the
+dnl *BSD ports which may have essential libraries in unusual places.  But it
+dnl can interfere with building an executable for the base system.  Use this
+dnl option in that case.
+AC_DEFUN([CF_DISABLE_RPATH_HACK],
+[
+AC_MSG_CHECKING(if rpath-hack should be disabled)
+CF_ARG_DISABLE(rpath-hack,
+	[  --disable-rpath-hack    don't add rpath options for additional libraries],
+	[enable_rpath_hack=no],
+	[enable_rpath_hack=yes])
+dnl TODO - drop cf_disable_rpath_hack
+if test "x$enable_rpath_hack" = xno; then cf_disable_rpath_hack=yes; else cf_disable_rpath_hack=no; fi
+AC_MSG_RESULT($cf_disable_rpath_hack)
+
+if test "$enable_rpath_hack" = yes ; then
+	CF_RPATH_HACK
+fi
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_ENABLE_BROKEN_LINKER version: 2 updated: 2021/01/02 17:09:14
+dnl -----------------------
+dnl Some linkers cannot reference a data-only object.  Cygwin used to be one.
+dnl This usually follows CF_LINK_DATAONLY, but is not required in case we need
+dnl an unconditional feature.
+AC_DEFUN([CF_ENABLE_BROKEN_LINKER],[
+
+AC_MSG_CHECKING(if you want broken-linker support code)
+AC_ARG_ENABLE(broken_linker,
+	[  --enable-broken_linker  compile with broken-linker support code],
+	[with_broken_linker=$enableval],
+	[with_broken_linker=no])
+AC_MSG_RESULT($with_broken_linker)
+
+: "${BROKEN_LINKER:=0}"
+if test "x$with_broken_linker" = xyes ; then
+	AC_DEFINE(BROKEN_LINKER,1,[Define to 1 to work around linkers which cannot link data-only modules])
+	BROKEN_LINKER=1
+fi
+AC_SUBST(BROKEN_LINKER)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ENABLE_PC_FILES version: 16 updated: 2021/11/20 12:48:37
+dnl ------------------
+dnl This is the "--enable-pc-files" option, which is available if there is a
+dnl pkg-config configuration on the local machine.
+AC_DEFUN([CF_ENABLE_PC_FILES],[
+AC_REQUIRE([CF_PKG_CONFIG])
+AC_REQUIRE([CF_WITH_PKG_CONFIG_LIBDIR])
+
+if test "x$PKG_CONFIG" != xnone
+then
+	AC_MSG_CHECKING(if we should install .pc files for $PKG_CONFIG)
+else
+	AC_MSG_CHECKING(if we should install .pc files)
+fi
+
+AC_ARG_ENABLE(pc-files,
+	[  --enable-pc-files       generate and install .pc files for pkg-config],
+	[enable_pc_files=$enableval],
+	[enable_pc_files=no])
+AC_MSG_RESULT($enable_pc_files)
+
+if test "x$enable_pc_files" != xno
+then
+	MAKE_PC_FILES=
+	case "x$PKG_CONFIG_LIBDIR" in
+	(xno|xnone|xyes|x)
+		AC_MSG_WARN(no PKG_CONFIG_LIBDIR was found)
+		;;
+	(*)
+		cf_pkg_config_libdir="$PKG_CONFIG_LIBDIR"
+		CF_PATH_SYNTAX(cf_pkg_config_libdir)
+		;;
+	esac
+else
+	MAKE_PC_FILES="#"
+fi
+AC_SUBST(MAKE_PC_FILES)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ENABLE_RPATH version: 2 updated: 2010/03/27 18:39:42
+dnl ---------------
+dnl Check if the rpath option should be used, setting cache variable
+dnl cf_cv_enable_rpath if so.
+AC_DEFUN([CF_ENABLE_RPATH],
+[
+AC_MSG_CHECKING(if rpath option should be used)
+AC_ARG_ENABLE(rpath,
+[  --enable-rpath          use rpath option when generating shared libraries],
+[cf_cv_enable_rpath=$enableval],
+[cf_cv_enable_rpath=no])
+AC_MSG_RESULT($cf_cv_enable_rpath)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ENABLE_STRING_HACKS version: 6 updated: 2021/01/05 19:23:48
+dnl ----------------------
+dnl On a few platforms, the compiler and/or loader nags with untruthful
+dnl comments stating that "most" uses of strcat/strcpy/sprintf are incorrect,
+dnl and implying that most uses of the recommended alternatives are correct.
+dnl
+dnl Factually speaking, no one has actually counted the number of uses of these
+dnl functions versus the total of incorrect uses.  Samples of a few thousand
+dnl instances are meaningless compared to the hundreds of millions of lines of
+dnl existing C code.
+dnl
+dnl strlcat/strlcpy are (as of 2012) non-standard, and are available on some
+dnl platforms, in implementations of varying quality.  Likewise, snprintf is
+dnl standard - but evolved through phases, and older implementations are likely
+dnl to yield surprising results, as documented in manpages on various systems.
+AC_DEFUN([CF_ENABLE_STRING_HACKS],
+[
+AC_MSG_CHECKING(if you want to work around bogus compiler/loader warnings)
+AC_ARG_ENABLE(string-hacks,
+	[  --enable-string-hacks   work around bogus compiler/loader warnings],
+	[enable_string_hacks=$enableval],
+	[enable_string_hacks=no])
+AC_MSG_RESULT($enable_string_hacks)
+
+if test "x$enable_string_hacks" = "xyes"; then
+ 	AC_DEFINE(USE_STRING_HACKS,1,[Define to 1 to work around bogus compiler/loader warnings])
+	AC_MSG_WARN(enabling string-hacks to work around bogus compiler/loader warnings)
+	AC_CHECK_FUNC(strlcat,[
+		AC_DEFINE(HAVE_STRLCAT,1,[Define to 1 if we have strlcat function])
+		],[
+		AC_CHECK_LIB(bsd,strlcat,[
+			CF_ADD_LIB(bsd)
+			AC_CHECK_HEADERS(bsd/string.h)
+			AC_DEFINE(HAVE_STRLCAT,1,[Define to 1 if we have strlcat function])
+			])
+		])
+	AC_CHECK_FUNCS( strlcpy snprintf )
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ENABLE_WARNINGS version: 9 updated: 2021/01/05 19:40:50
+dnl ------------------
+dnl Configure-option to enable gcc warnings
+dnl
+dnl $1 = extra options to add, if supported
+dnl $2 = option for checking attributes.  By default, this is done when
+dnl      warnings are enabled.  For other values:
+dnl      yes: always do this, e.g., to use in generated library-headers
+dnl      no: never do this
+AC_DEFUN([CF_ENABLE_WARNINGS],[
+if test "$GCC" = yes || test "$GXX" = yes
+then
+CF_FIX_WARNINGS(CFLAGS)
+CF_FIX_WARNINGS(CPPFLAGS)
+CF_FIX_WARNINGS(LDFLAGS)
+AC_MSG_CHECKING(if you want to turn on gcc warnings)
+CF_ARG_ENABLE(warnings,
+	[  --enable-warnings       test: turn on gcc compiler warnings],
+	[enable_warnings=yes],
+	[enable_warnings=no])
+AC_MSG_RESULT($enable_warnings)
+if test "$enable_warnings" = "yes"
+then
+	ifelse($2,,[CF_GCC_ATTRIBUTES])
+	CF_GCC_WARNINGS($1)
+fi
+ifelse($2,yes,[CF_GCC_ATTRIBUTES])
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ERRNO version: 5 updated: 1997/11/30 12:44:39
+dnl --------
+dnl Check if 'errno' is declared in <errno.h>
+AC_DEFUN([CF_ERRNO],
+[
+CF_CHECK_ERRNO(errno)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ETIP_DEFINES version: 6 updated: 2021/01/02 17:09:14
+dnl ---------------
+dnl Test for conflicting definitions of exception in gcc 2.8.0, etc., between
+dnl math.h and builtin.h, only for ncurses
+AC_DEFUN([CF_ETIP_DEFINES],
+[
+AC_MSG_CHECKING(for special defines needed for etip.h)
+cf_save_CXXFLAGS="$CXXFLAGS"
+cf_result="none"
+
+# etip.h includes ncurses.h which includes ncurses_dll.h
+# But ncurses_dll.h is generated - fix here.
+test -d include || mkdir include
+test -f include/ncurses_dll.h || sed -e 's/@NCURSES_WRAP_PREFIX@/'$NCURSES_WRAP_PREFIX'/g' "${srcdir}/include/ncurses_dll.h.in" >include/ncurses_dll.h
+
+for cf_math in "" MATH_H
+do
+for cf_excp in "" MATH_EXCEPTION
+do
+	CXXFLAGS="$cf_save_CXXFLAGS -I${srcdir}/c++ -I${srcdir}/menu -Iinclude -I${srcdir}/include"
+	test -n "$cf_math" && CXXFLAGS="$CXXFLAGS -DETIP_NEEDS_${cf_math}"
+	test -n "$cf_excp" && CXXFLAGS="$CXXFLAGS -DETIP_NEEDS_${cf_excp}"
+AC_TRY_COMPILE([
+#include <etip.h.in>
+],[],[
+	test -n "$cf_math" && AC_DEFINE_UNQUOTED(ETIP_NEEDS_${cf_math})
+	test -n "$cf_excp" && AC_DEFINE_UNQUOTED(ETIP_NEEDS_${cf_excp})
+	cf_result="$cf_math $cf_excp"
+	break 2
+],[])
+done
+done
+AC_MSG_RESULT($cf_result)
+CXXFLAGS="$cf_save_CXXFLAGS"
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_FIND_LINKAGE version: 22 updated: 2020/12/31 20:19:42
+dnl ---------------
+dnl Find a library (specifically the linkage used in the code fragment),
+dnl searching for it if it is not already in the library path.
+dnl See also CF_ADD_SEARCHPATH.
+dnl
+dnl Parameters (4-on are optional):
+dnl     $1 = headers for library entrypoint
+dnl     $2 = code fragment for library entrypoint
+dnl     $3 = the library name without the "-l" option or ".so" suffix.
+dnl     $4 = action to perform if successful (default: update CPPFLAGS, etc)
+dnl     $5 = action to perform if not successful
+dnl     $6 = module name, if not the same as the library name
+dnl     $7 = extra libraries
+dnl
+dnl Sets these variables:
+dnl     $cf_cv_find_linkage_$3 - yes/no according to whether linkage is found
+dnl     $cf_cv_header_path_$3 - include-directory if needed
+dnl     $cf_cv_library_path_$3 - library-directory if needed
+dnl     $cf_cv_library_file_$3 - library-file if needed, e.g., -l$3
+AC_DEFUN([CF_FIND_LINKAGE],[
+
+# If the linkage is not already in the $CPPFLAGS/$LDFLAGS configuration, these
+# will be set on completion of the AC_TRY_LINK below.
+cf_cv_header_path_$3=
+cf_cv_library_path_$3=
+
+CF_MSG_LOG([Starting [FIND_LINKAGE]($3,$6)])
+
+cf_save_LIBS="$LIBS"
+
+AC_TRY_LINK([$1],[$2],[
+	cf_cv_find_linkage_$3=yes
+	cf_cv_header_path_$3=/usr/include
+	cf_cv_library_path_$3=/usr/lib
+],[
+
+LIBS="-l$3 $7 $cf_save_LIBS"
+
+AC_TRY_LINK([$1],[$2],[
+	cf_cv_find_linkage_$3=yes
+	cf_cv_header_path_$3=/usr/include
+	cf_cv_library_path_$3=/usr/lib
+	cf_cv_library_file_$3="-l$3"
+],[
+	cf_cv_find_linkage_$3=no
+	LIBS="$cf_save_LIBS"
+
+	CF_VERBOSE(find linkage for $3 library)
+	CF_MSG_LOG([Searching for headers in [FIND_LINKAGE]($3,$6)])
+
+	cf_save_CPPFLAGS="$CPPFLAGS"
+	cf_test_CPPFLAGS="$CPPFLAGS"
+
+	CF_HEADER_PATH(cf_search,ifelse([$6],,[$3],[$6]))
+	for cf_cv_header_path_$3 in $cf_search
+	do
+		if test -d "$cf_cv_header_path_$3" ; then
+			CF_VERBOSE(... testing $cf_cv_header_path_$3)
+			CPPFLAGS="$cf_save_CPPFLAGS"
+			CF_APPEND_TEXT(CPPFLAGS,-I$cf_cv_header_path_$3)
+			AC_TRY_COMPILE([$1],[$2],[
+				CF_VERBOSE(... found $3 headers in $cf_cv_header_path_$3)
+				cf_cv_find_linkage_$3=maybe
+				cf_test_CPPFLAGS="$CPPFLAGS"
+				break],[
+				CPPFLAGS="$cf_save_CPPFLAGS"
+				])
+		fi
+	done
+
+	if test "$cf_cv_find_linkage_$3" = maybe ; then
+
+		CF_MSG_LOG([Searching for $3 library in [FIND_LINKAGE]($3,$6)])
+
+		cf_save_LIBS="$LIBS"
+		cf_save_LDFLAGS="$LDFLAGS"
+
+		ifelse([$6],,,[
+		CPPFLAGS="$cf_test_CPPFLAGS"
+		LIBS="-l$3 $7 $cf_save_LIBS"
+		AC_TRY_LINK([$1],[$2],[
+			CF_VERBOSE(... found $3 library in system)
+			cf_cv_find_linkage_$3=yes])
+			CPPFLAGS="$cf_save_CPPFLAGS"
+			LIBS="$cf_save_LIBS"
+			])
+
+		if test "$cf_cv_find_linkage_$3" != yes ; then
+			CF_LIBRARY_PATH(cf_search,$3)
+			for cf_cv_library_path_$3 in $cf_search
+			do
+				if test -d "$cf_cv_library_path_$3" ; then
+					CF_VERBOSE(... testing $cf_cv_library_path_$3)
+					CPPFLAGS="$cf_test_CPPFLAGS"
+					LIBS="-l$3 $7 $cf_save_LIBS"
+					LDFLAGS="$cf_save_LDFLAGS -L$cf_cv_library_path_$3"
+					AC_TRY_LINK([$1],[$2],[
+					CF_VERBOSE(... found $3 library in $cf_cv_library_path_$3)
+					cf_cv_find_linkage_$3=yes
+					cf_cv_library_file_$3="-l$3"
+					break],[
+					CPPFLAGS="$cf_save_CPPFLAGS"
+					LIBS="$cf_save_LIBS"
+					LDFLAGS="$cf_save_LDFLAGS"
+					])
+				fi
+			done
+			CPPFLAGS="$cf_save_CPPFLAGS"
+			LDFLAGS="$cf_save_LDFLAGS"
+		fi
+
+	else
+		cf_cv_find_linkage_$3=no
+	fi
+	],$7)
+])
+
+LIBS="$cf_save_LIBS"
+
+if test "$cf_cv_find_linkage_$3" = yes ; then
+ifelse([$4],,[
+	CF_ADD_INCDIR($cf_cv_header_path_$3)
+	CF_ADD_LIBDIR($cf_cv_library_path_$3)
+	CF_ADD_LIB($3)
+],[$4])
+else
+ifelse([$5],,AC_MSG_WARN(Cannot find $3 library),[$5])
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_FIND_SUB_INCDIR version: 3 updated: 2021/01/01 13:31:04
+dnl ------------------
+dnl Find an include-directory with the given leaf-name.  This is useful for
+dnl example with FreeBSD ports, which use this convention to distinguish
+dnl different versions of the same port.
+AC_DEFUN([CF_FIND_SUB_INCDIR],[
+	CF_SUBDIR_PATH(cf_search,$1,include)
+	for cf_item in $cf_search
+	do
+		case "$cf_item" in
+		(*/$1)
+			CF_ADD_INCDIR($cf_item)
+			;;
+		esac
+	done
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_FIND_SUB_LIBDIR version: 3 updated: 2021/01/01 13:31:04
+dnl ------------------
+dnl Find a library-directory with the given leaf-name.  This is useful for
+dnl example with FreeBSD ports, which use this convention to distinguish
+dnl different versions of the same port.
+AC_DEFUN([CF_FIND_SUB_LIBDIR],[
+	CF_SUBDIR_PATH(cf_search,$1,lib)
+	for cf_item in $cf_search
+	do
+		case "$cf_item" in
+		(*/$1)
+			CF_ADD_LIBDIR($cf_item)
+			;;
+		esac
+	done
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_FIXUP_ADAFLAGS version: 2 updated: 2015/04/17 21:13:04
+dnl -----------------
+dnl make ADAFLAGS consistent with CFLAGS
+AC_DEFUN([CF_FIXUP_ADAFLAGS],[
+	AC_MSG_CHECKING(optimization options for ADAFLAGS)
+	case "$CFLAGS" in
+	(*-g*)
+		CF_ADD_ADAFLAGS(-g)
+		;;
+	esac
+	case "$CFLAGS" in
+	(*-O*)
+		cf_O_flag=`echo "$CFLAGS" |sed -e 's/^.*-O/-O/' -e 's/[[ 	]].*//'`
+		CF_ADD_ADAFLAGS($cf_O_flag)
+		;;
+	esac
+	AC_MSG_RESULT($ADAFLAGS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_FIX_WARNINGS version: 4 updated: 2021/12/16 18:22:31
+dnl ---------------
+dnl Warning flags do not belong in CFLAGS, CPPFLAGS, etc.  Any of gcc's
+dnl "-Werror" flags can interfere with configure-checks.  Those go into
+dnl EXTRA_CFLAGS.
+dnl
+dnl $1 = variable name to repair
+define([CF_FIX_WARNINGS],[
+if test "$GCC" = yes || test "$GXX" = yes
+then
+	case [$]$1 in
+	(*-Werror=*)
+		cf_temp_flags=
+		for cf_temp_scan in [$]$1
+		do
+			case "x$cf_temp_scan" in
+			(x-Werror=format*)
+				CF_APPEND_TEXT(cf_temp_flags,$cf_temp_scan)
+				;;
+			(x-Werror=*)
+				CF_APPEND_TEXT(EXTRA_CFLAGS,$cf_temp_scan)
+				;;
+			(*)
+				CF_APPEND_TEXT(cf_temp_flags,$cf_temp_scan)
+				;;
+			esac
+		done
+		if test "x[$]$1" != "x$cf_temp_flags"
+		then
+			CF_VERBOSE(repairing $1: [$]$1)
+			$1="$cf_temp_flags"
+			CF_VERBOSE(... fixed [$]$1)
+			CF_VERBOSE(... extra $EXTRA_CFLAGS)
+		fi
+		;;
+	esac
+fi
+AC_SUBST(EXTRA_CFLAGS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_FOPEN_BIN_R version: 2 updated: 2019/12/31 08:53:54
+dnl --------------
+dnl Check if fopen works when the "b" (binary) flag is added to the mode
+dnl parameter.  POSIX ignores the "b", which c89 specified.  Some very old
+dnl systems do not accept it.
+AC_DEFUN([CF_FOPEN_BIN_R],[
+AC_CACHE_CHECK(if fopen accepts explicit binary mode,cf_cv_fopen_bin_r,[
+	AC_TRY_RUN([
+#include <stdio.h>
+int main(void) {
+	FILE *fp = fopen("conftest.tmp", "wb");
+	int rc = 0;
+	if (fp != 0) {
+		int p, q;
+		for (p = 0; p < 256; ++p) {
+			fputc(p, fp);
+		}
+		fclose(fp);
+		fp = fopen("conftest.tmp", "rb");
+		if (fp != 0) {
+			for (p = 0; p < 256; ++p) {
+				q = fgetc(fp);
+				if (q != p) {
+					rc = 1;
+					break;
+				}
+			}
+		} else {
+			rc = 1;
+		}
+	} else {
+		rc = 1;
+	}
+	${cf_cv_main_return:-return} (rc);
+}
+],
+		[cf_cv_fopen_bin_r=yes],
+		[cf_cv_fopen_bin_r=no],
+		[cf_cv_fopen_bin_r=unknown])
+])
+test "x$cf_cv_fopen_bin_r" != xno && AC_DEFINE(USE_FOPEN_BIN_R,1,[Define to 1 if fopen accepts explicit binary mode])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_FORGET_TOOL version: 1 updated: 2013/04/06 18:03:09
+dnl --------------
+dnl Forget that we saw the given tool.
+AC_DEFUN([CF_FORGET_TOOL],[
+unset ac_cv_prog_ac_ct_$1
+unset ac_ct_$1
+unset $1
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_FUNC_DLSYM version: 4 updated: 2015/09/12 14:46:44
+dnl -------------
+dnl Test for dlsym() and related functions, as well as libdl.
+dnl
+dnl Sets
+dnl	$cf_have_dlsym
+dnl	$cf_have_libdl
+AC_DEFUN([CF_FUNC_DLSYM],[
+cf_have_dlsym=no
+AC_CHECK_FUNC(dlsym,cf_have_dlsym=yes,[
+
+cf_have_libdl=no
+AC_CHECK_LIB(dl,dlsym,[
+	cf_have_dlsym=yes
+	cf_have_libdl=yes])])
+
+if test "$cf_have_dlsym" = yes ; then
+	test "$cf_have_libdl" = yes && { CF_ADD_LIB(dl) }
+
+	AC_MSG_CHECKING(whether able to link to dl*() functions)
+	AC_TRY_LINK([#include <dlfcn.h>],[
+		void *obj;
+		if ((obj = dlopen("filename", 0)) != 0) {
+			if (dlsym(obj, "symbolname") == 0) {
+			dlclose(obj);
+			}
+		}],[
+		AC_DEFINE(HAVE_LIBDL,1,[Define to 1 if we have dl library])],[
+		AC_MSG_ERROR(Cannot link test program for libdl)])
+	AC_MSG_RESULT(ok)
+else
+	AC_MSG_ERROR(Cannot find dlsym function)
+fi
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_FUNC_GETTTYNAM version: 1 updated: 2021/12/04 18:29:47
+dnl -----------------
+dnl Check if the 4.3BSD function getttyname exists, as well as if <ttyent.h>
+dnl defines the _PATH_TTYS symbol.  If the corresponding file exists, but the
+dnl other checks fail, just define HAVE_PATH_TTYS.
+AC_DEFUN([CF_FUNC_GETTTYNAM],[
+AC_CACHE_CHECK(if _PATH_TTYS is defined in ttyent.h,cf_cv_PATH_TTYS,[
+AC_TRY_COMPILE([
+#include <stdio.h>
+#include <ttyent.h>],[
+FILE *fp = fopen(_PATH_TTYS, "r"); (void)fp],
+	[cf_cv_PATH_TTYS=yes],
+	[cf_cv_PATH_TTYS=no])])
+
+if test $cf_cv_PATH_TTYS = no
+then
+	for cf_ttys in /etc/ttytype /etc/ttys
+	do
+		if test -f $cf_ttys
+		then
+			cf_cv_PATH_TTYS=maybe
+			AC_DEFINE(_PATH_TTYS,$cf_ttys,[define to pathname of file containing mapping from tty name to terminal type])
+			break
+		fi
+	done
+fi
+
+if test $cf_cv_PATH_TTYS != no
+then
+	AC_CACHE_CHECK(if _PATH_TTYS file exists,cf_cv_have_PATH_TTYS,[
+		AC_TRY_RUN([
+#include <stdio.h>
+#include <ttyent.h>
+int main(void) {
+	FILE *fp = fopen(_PATH_TTYS, "r");
+	${cf_cv_main_return:-return} (fp == 0);
+}],
+			[cf_cv_have_PATH_TTYS=yes],
+			[cf_cv_have_PATH_TTYS=no],
+			[cf_cv_have_PATH_TTYS=unknown])])
+	test "$cf_cv_have_PATH_TTYS" = no && cf_cv_PATH_TTYS=no
+fi
+
+if test $cf_cv_PATH_TTYS != no
+then
+	AC_DEFINE(HAVE_PATH_TTYS,1,[define to 1 if system can map tty name to terminal type])
+	AC_CACHE_CHECK(for getttynam,cf_cv_func_getttynam,[
+		AC_TRY_LINK([#include <ttyent.h>],
+		[struct ttyent *fp = getttynam("/dev/tty"); (void)fp],
+		[cf_cv_func_getttynam=yes],
+		[cf_cv_func_getttynam=no])])
+	test "$cf_cv_func_getttynam" = yes && AC_DEFINE(HAVE_GETTTYNAM)
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_FUNC_MEMMOVE version: 9 updated: 2017/01/21 11:06:25
+dnl ---------------
+dnl Check for memmove, or a bcopy that can handle overlapping copy.  If neither
+dnl is found, add our own version of memmove to the list of objects.
+AC_DEFUN([CF_FUNC_MEMMOVE],
+[
+AC_CHECK_FUNC(memmove,,[
+AC_CHECK_FUNC(bcopy,[
+	AC_CACHE_CHECK(if bcopy does overlapping moves,cf_cv_good_bcopy,[
+		AC_TRY_RUN([
+int main(void) {
+	static char data[] = "abcdefghijklmnopqrstuwwxyz";
+	char temp[40];
+	bcopy(data, temp, sizeof(data));
+	bcopy(temp+10, temp, 15);
+	bcopy(temp+5, temp+15, 10);
+	${cf_cv_main_return:-return} (strcmp(temp, "klmnopqrstuwwxypqrstuwwxyz"));
+}
+		],
+		[cf_cv_good_bcopy=yes],
+		[cf_cv_good_bcopy=no],
+		[cf_cv_good_bcopy=unknown])
+		])
+	],[cf_cv_good_bcopy=no])
+	if test "$cf_cv_good_bcopy" = yes ; then
+		AC_DEFINE(USE_OK_BCOPY,1,[Define to 1 to use bcopy when memmove is unavailable])
+	else
+		AC_DEFINE(USE_MY_MEMMOVE,1,[Define to 1 to use replacement function when memmove is unavailable])
+	fi
+])])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_FUNC_NANOSLEEP version: 5 updated: 2017/01/21 11:06:25
+dnl -----------------
+dnl Check for existence of workable nanosleep() function.  Some systems, e.g.,
+dnl AIX 4.x, provide a non-working version.
+AC_DEFUN([CF_FUNC_NANOSLEEP],[
+AC_CACHE_CHECK(if nanosleep really works,cf_cv_func_nanosleep,[
+AC_TRY_RUN([
+#include <stdio.h>
+#include <errno.h>
+#include <time.h>
+
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+
+int main(void) {
+	struct timespec ts1, ts2;
+	int code;
+	ts1.tv_sec  = 0;
+	ts1.tv_nsec = 750000000;
+	ts2.tv_sec  = 0;
+	ts2.tv_nsec = 0;
+	errno = 0;
+	code = nanosleep(&ts1, &ts2); /* on failure errno is ENOSYS. */
+	${cf_cv_main_return:-return}(code != 0);
+}
+],
+	[cf_cv_func_nanosleep=yes],
+	[cf_cv_func_nanosleep=no],
+	[cf_cv_func_nanosleep=unknown])])
+
+test "$cf_cv_func_nanosleep" = "yes" && AC_DEFINE(HAVE_NANOSLEEP,1,[Define to 1 if we have nanosleep()])
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_FUNC_OPENPTY version: 6 updated: 2021/01/01 13:31:04
+dnl ---------------
+dnl Check for openpty() function, along with <pty.h> header.  It may need the
+dnl "util" library as well.
+AC_DEFUN([CF_FUNC_OPENPTY],
+[
+AC_CHECK_LIB(util,openpty,cf_cv_lib_util=yes,cf_cv_lib_util=no)
+AC_CACHE_CHECK(for openpty header,cf_cv_func_openpty,[
+	cf_save_LIBS="$LIBS"
+	test "$cf_cv_lib_util" = yes && { CF_ADD_LIB(util) }
+	for cf_header in pty.h libutil.h util.h
+	do
+	AC_TRY_LINK([
+#include <$cf_header>
+],[
+	int x = openpty((int *)0, (int *)0, (char *)0,
+				   (struct termios *)0, (struct winsize *)0);
+],[
+		cf_cv_func_openpty=$cf_header
+		break
+],[
+		cf_cv_func_openpty=no
+])
+	done
+	LIBS="$cf_save_LIBS"
+])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_FUNC_POLL version: 10 updated: 2021/01/04 19:13:57
+dnl ------------
+dnl See if the poll function really works.  Some platforms have poll(), but
+dnl it does not work for terminals or files.
+AC_DEFUN([CF_FUNC_POLL],[
+tty >/dev/null 2>&1 || { AC_CHECK_FUNCS(posix_openpt) }
+AC_CACHE_CHECK(if poll really works,cf_cv_working_poll,[
+AC_TRY_RUN([
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <fcntl.h>
+#ifdef HAVE_POLL_H
+#include <poll.h>
+#else
+#include <sys/poll.h>
+#endif
+int main(void) {
+	struct pollfd myfds;
+	int ret;
+
+	/* check for Darwin bug with respect to "devices" */
+	myfds.fd = open("/dev/null", 1);	/* O_WRONLY */
+	if (myfds.fd < 0)
+		myfds.fd = 0;
+	myfds.events = POLLIN;
+	myfds.revents = 0;
+
+	ret = poll(&myfds, 1, 100);
+
+	if (ret < 0 || (myfds.revents & POLLNVAL)) {
+		ret = -1;
+	} else {
+		int fd = 0;
+		if (!isatty(fd)) {
+			fd = open("/dev/tty", 2);	/* O_RDWR */
+		}
+#ifdef HAVE_POSIX_OPENPT
+		if (fd < 0) {
+			fd = posix_openpt(O_RDWR);
+		}
+#endif
+
+		if (fd >= 0) {
+			/* also check with standard input */
+			myfds.fd = fd;
+			myfds.events = POLLIN;
+			myfds.revents = 0;
+			ret = poll(&myfds, 1, 100);
+		} else {
+			ret = -1;
+		}
+	}
+	${cf_cv_main_return:-return}(ret < 0);
+}],
+	[cf_cv_working_poll=yes],
+	[cf_cv_working_poll=no],
+	[cf_cv_working_poll=unknown])])
+test "$cf_cv_working_poll" = "yes" && AC_DEFINE(HAVE_WORKING_POLL,1,[Define to 1 if the poll function seems to work])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_FUNC_TERMIOS version: 3 updated: 2012/10/06 17:56:13
+dnl ---------------
+dnl Some old/broken variations define tcgetattr() only as a macro in
+dnl termio(s).h
+AC_DEFUN([CF_FUNC_TERMIOS],[
+AC_REQUIRE([CF_STRUCT_TERMIOS])
+AC_CACHE_CHECK(for tcgetattr, cf_cv_have_tcgetattr,[
+AC_TRY_LINK([
+#include <sys/types.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_TERMIOS_H
+#include <termios.h>
+#define TTY struct termios
+#else
+#ifdef HAVE_TERMIO_H
+#include <termio.h>
+#define TTY struct termio
+#endif
+#endif
+],[
+TTY foo;
+tcgetattr(1, &foo);],
+[cf_cv_have_tcgetattr=yes],
+[cf_cv_have_tcgetattr=no])])
+test "$cf_cv_have_tcgetattr" = yes && AC_DEFINE(HAVE_TCGETATTR,1,[Define to 1 if we have tcgetattr])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_FUNC_VSSCANF version: 7 updated: 2021/01/01 13:31:04
+dnl ---------------
+dnl Check for vsscanf() function, which is in c9x but generally not in earlier
+dnl versions of C.  It is in the GNU C library, and can often be simulated by
+dnl other functions.
+AC_DEFUN([CF_FUNC_VSSCANF],
+[
+AC_CACHE_CHECK(for vsscanf function or workaround,cf_cv_func_vsscanf,[
+AC_TRY_LINK([
+#include <stdarg.h>
+#include <stdio.h>],[
+	va_list ap;
+	vsscanf("from", "%d", ap)],[cf_cv_func_vsscanf=vsscanf],[
+AC_TRY_LINK([
+#include <stdarg.h>
+#include <stdio.h>],[
+	FILE strbuf;
+	char *str = "from";
+
+	strbuf._flag = _IOREAD;
+	strbuf._ptr = strbuf._base = (unsigned char *) str;
+	strbuf._cnt = strlen(str);
+	strbuf._file = _NFILE;
+	return (vfscanf(&strbuf, "%d", ap))],[cf_cv_func_vsscanf=vfscanf],[
+AC_TRY_LINK([
+#include <stdarg.h>
+#include <stdio.h>],[
+	FILE strbuf;
+	char *str = "from";
+
+	strbuf._flag = _IOREAD;
+	strbuf._ptr = strbuf._base = (unsigned char *) str;
+	strbuf._cnt = strlen(str);
+	strbuf._file = _NFILE;
+	return (_doscan(&strbuf, "%d", ap))],[cf_cv_func_vsscanf=_doscan],[
+cf_cv_func_vsscanf=no])])])])
+
+case "$cf_cv_func_vsscanf" in
+(vsscanf) AC_DEFINE(HAVE_VSSCANF,1,[Define to 1 if we have vsscanf]);;
+(vfscanf) AC_DEFINE(HAVE_VFSCANF,1,[Define to 1 if we have vfscanf]);;
+(_doscan) AC_DEFINE(HAVE__DOSCAN,1,[Define to 1 if we have _doscan]);;
+esac
+
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_GCC_ATTRIBUTES version: 24 updated: 2021/03/20 12:00:25
+dnl -----------------
+dnl Test for availability of useful gcc __attribute__ directives to quiet
+dnl compiler warnings.  Though useful, not all are supported -- and contrary
+dnl to documentation, unrecognized directives cause older compilers to barf.
+AC_DEFUN([CF_GCC_ATTRIBUTES],
+[AC_REQUIRE([AC_PROG_FGREP])dnl
+AC_REQUIRE([CF_C11_NORETURN])dnl
+
+if test "$GCC" = yes || test "$GXX" = yes
+then
+cat > conftest.i <<EOF
+#ifndef GCC_PRINTF
+#define GCC_PRINTF 0
+#endif
+#ifndef GCC_SCANF
+#define GCC_SCANF 0
+#endif
+#ifndef GCC_NORETURN
+#define GCC_NORETURN /* nothing */
+#endif
+#ifndef GCC_UNUSED
+#define GCC_UNUSED /* nothing */
+#endif
+EOF
+if test "$GCC" = yes
+then
+	AC_CHECKING([for $CC __attribute__ directives])
+cat > "conftest.$ac_ext" <<EOF
+#line __oline__ "${as_me:-configure}"
+#include "confdefs.h"
+#include "conftest.h"
+#include "conftest.i"
+#if	GCC_PRINTF
+#define GCC_PRINTFLIKE(fmt,var) __attribute__((format(printf,fmt,var)))
+#else
+#define GCC_PRINTFLIKE(fmt,var) /*nothing*/
+#endif
+#if	GCC_SCANF
+#define GCC_SCANFLIKE(fmt,var)  __attribute__((format(scanf,fmt,var)))
+#else
+#define GCC_SCANFLIKE(fmt,var)  /*nothing*/
+#endif
+extern void wow(char *,...) GCC_SCANFLIKE(1,2);
+extern GCC_NORETURN void oops(char *,...) GCC_PRINTFLIKE(1,2);
+extern GCC_NORETURN void foo(void);
+int main(int argc GCC_UNUSED, char *argv[[]] GCC_UNUSED) { (void)argc; (void)argv; return 0; }
+EOF
+	cf_printf_attribute=no
+	cf_scanf_attribute=no
+	for cf_attribute in scanf printf unused noreturn
+	do
+		CF_UPPER(cf_ATTRIBUTE,$cf_attribute)
+		cf_directive="__attribute__(($cf_attribute))"
+		echo "checking for $CC $cf_directive" 1>&AC_FD_CC
+
+		case "$cf_attribute" in
+		(printf)
+			cf_printf_attribute=yes
+			cat >conftest.h <<EOF
+#define GCC_$cf_ATTRIBUTE 1
+EOF
+			;;
+		(scanf)
+			cf_scanf_attribute=yes
+			cat >conftest.h <<EOF
+#define GCC_$cf_ATTRIBUTE 1
+EOF
+			;;
+		(*)
+			cat >conftest.h <<EOF
+#define GCC_$cf_ATTRIBUTE $cf_directive
+EOF
+			;;
+		esac
+
+		if AC_TRY_EVAL(ac_compile); then
+			test -n "$verbose" && AC_MSG_RESULT(... $cf_attribute)
+			cat conftest.h >>confdefs.h
+			case "$cf_attribute" in
+			(noreturn)
+				AC_DEFINE_UNQUOTED(GCC_NORETURN,$cf_directive,[Define to noreturn-attribute for gcc])
+				;;
+			(printf)
+				cf_value='/* nothing */'
+				if test "$cf_printf_attribute" != no ; then
+					cf_value='__attribute__((format(printf,fmt,var)))'
+					AC_DEFINE(GCC_PRINTF,1,[Define to 1 if the compiler supports gcc-like printf attribute.])
+				fi
+				AC_DEFINE_UNQUOTED(GCC_PRINTFLIKE(fmt,var),$cf_value,[Define to printf-attribute for gcc])
+				;;
+			(scanf)
+				cf_value='/* nothing */'
+				if test "$cf_scanf_attribute" != no ; then
+					cf_value='__attribute__((format(scanf,fmt,var)))'
+					AC_DEFINE(GCC_SCANF,1,[Define to 1 if the compiler supports gcc-like scanf attribute.])
+				fi
+				AC_DEFINE_UNQUOTED(GCC_SCANFLIKE(fmt,var),$cf_value,[Define to sscanf-attribute for gcc])
+				;;
+			(unused)
+				AC_DEFINE_UNQUOTED(GCC_UNUSED,$cf_directive,[Define to unused-attribute for gcc])
+				;;
+			esac
+		fi
+	done
+else
+	${FGREP-fgrep} define conftest.i >>confdefs.h
+fi
+rm -rf ./conftest*
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_GCC_VERSION version: 8 updated: 2019/09/07 13:38:36
+dnl --------------
+dnl Find version of gcc, and (because icc/clang pretend to be gcc without being
+dnl compatible), attempt to determine if icc/clang is actually used.
+AC_DEFUN([CF_GCC_VERSION],[
+AC_REQUIRE([AC_PROG_CC])
+GCC_VERSION=none
+if test "$GCC" = yes ; then
+	AC_MSG_CHECKING(version of $CC)
+	GCC_VERSION="`${CC} --version 2>/dev/null | sed -e '2,$d' -e 's/^.*(GCC[[^)]]*) //' -e 's/^.*(Debian[[^)]]*) //' -e 's/^[[^0-9.]]*//' -e 's/[[^0-9.]].*//'`"
+	test -z "$GCC_VERSION" && GCC_VERSION=unknown
+	AC_MSG_RESULT($GCC_VERSION)
+fi
+CF_INTEL_COMPILER(GCC,INTEL_COMPILER,CFLAGS)
+CF_CLANG_COMPILER(GCC,CLANG_COMPILER,CFLAGS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_GCC_WARNINGS version: 41 updated: 2021/01/01 16:53:59
+dnl ---------------
+dnl Check if the compiler supports useful warning options.  There's a few that
+dnl we don't use, simply because they're too noisy:
+dnl
+dnl	-Wconversion (useful in older versions of gcc, but not in gcc 2.7.x)
+dnl	-Winline (usually not worthwhile)
+dnl	-Wredundant-decls (system headers make this too noisy)
+dnl	-Wtraditional (combines too many unrelated messages, only a few useful)
+dnl	-Wwrite-strings (too noisy, but should review occasionally).  This
+dnl		is enabled for ncurses using "--enable-const".
+dnl	-pedantic
+dnl
+dnl Parameter:
+dnl	$1 is an optional list of gcc warning flags that a particular
+dnl		application might want to use, e.g., "no-unused" for
+dnl		-Wno-unused
+dnl Special:
+dnl	If $with_ext_const is "yes", add a check for -Wwrite-strings
+dnl
+AC_DEFUN([CF_GCC_WARNINGS],
+[
+AC_REQUIRE([CF_GCC_VERSION])
+if test "x$have_x" = xyes; then CF_CONST_X_STRING fi
+cat > "conftest.$ac_ext" <<EOF
+#line __oline__ "${as_me:-configure}"
+int main(int argc, char *argv[[]]) { return (argv[[argc-1]] == 0) ; }
+EOF
+if test "$INTEL_COMPILER" = yes
+then
+# The "-wdXXX" options suppress warnings:
+# remark #1419: external declaration in primary source file
+# remark #1683: explicit conversion of a 64-bit integral type to a smaller integral type (potential portability problem)
+# remark #1684: conversion from pointer to same-sized integral type (potential portability problem)
+# remark #193: zero used for undefined preprocessing identifier
+# remark #593: variable "curs_sb_left_arrow" was set but never used
+# remark #810: conversion from "int" to "Dimension={unsigned short}" may lose significant bits
+# remark #869: parameter "tw" was never referenced
+# remark #981: operands are evaluated in unspecified order
+# warning #279: controlling expression is constant
+
+	AC_CHECKING([for $CC warning options])
+	cf_save_CFLAGS="$CFLAGS"
+	EXTRA_CFLAGS="$EXTRA_CFLAGS -Wall"
+	for cf_opt in \
+		wd1419 \
+		wd1683 \
+		wd1684 \
+		wd193 \
+		wd593 \
+		wd279 \
+		wd810 \
+		wd869 \
+		wd981
+	do
+		CFLAGS="$cf_save_CFLAGS $EXTRA_CFLAGS -$cf_opt"
+		if AC_TRY_EVAL(ac_compile); then
+			test -n "$verbose" && AC_MSG_RESULT(... -$cf_opt)
+			EXTRA_CFLAGS="$EXTRA_CFLAGS -$cf_opt"
+		fi
+	done
+	CFLAGS="$cf_save_CFLAGS"
+elif test "$GCC" = yes && test "$GCC_VERSION" != "unknown"
+then
+	AC_CHECKING([for $CC warning options])
+	cf_save_CFLAGS="$CFLAGS"
+	cf_warn_CONST=""
+	test "$with_ext_const" = yes && cf_warn_CONST="Wwrite-strings"
+	cf_gcc_warnings="Wignored-qualifiers Wlogical-op Wvarargs"
+	test "x$CLANG_COMPILER" = xyes && cf_gcc_warnings=
+	for cf_opt in W Wall \
+		Wbad-function-cast \
+		Wcast-align \
+		Wcast-qual \
+		Wdeclaration-after-statement \
+		Wextra \
+		Winline \
+		Wmissing-declarations \
+		Wmissing-prototypes \
+		Wnested-externs \
+		Wpointer-arith \
+		Wshadow \
+		Wstrict-prototypes \
+		Wundef Wno-inline $cf_gcc_warnings $cf_warn_CONST $1
+	do
+		CFLAGS="$cf_save_CFLAGS $EXTRA_CFLAGS -$cf_opt"
+		if AC_TRY_EVAL(ac_compile); then
+			test -n "$verbose" && AC_MSG_RESULT(... -$cf_opt)
+			case "$cf_opt" in
+			(Winline)
+				case "$GCC_VERSION" in
+				([[34]].*)
+					CF_VERBOSE(feature is broken in gcc $GCC_VERSION)
+					continue;;
+				esac
+				;;
+			(Wpointer-arith)
+				case "$GCC_VERSION" in
+				([[12]].*)
+					CF_VERBOSE(feature is broken in gcc $GCC_VERSION)
+					continue;;
+				esac
+				;;
+			esac
+			EXTRA_CFLAGS="$EXTRA_CFLAGS -$cf_opt"
+		fi
+	done
+	CFLAGS="$cf_save_CFLAGS"
+fi
+rm -rf ./conftest*
+
+AC_SUBST(EXTRA_CFLAGS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_GETOPT_HEADER version: 8 updated: 2021/06/19 19:16:16
+dnl ----------------
+dnl Check for getopt's variables which are commonly defined in stdlib.h,
+dnl unistd.h or (nonstandard) in getopt.h
+AC_DEFUN([CF_GETOPT_HEADER],
+[
+AC_HAVE_HEADERS(unistd.h getopt.h)
+AC_CACHE_CHECK(for header declaring getopt variables,cf_cv_getopt_header,[
+cf_cv_getopt_header=none
+for cf_header in stdio.h stdlib.h unistd.h getopt.h
+do
+AC_TRY_COMPILE([
+#include <$cf_header>],
+[int x = optind; char *y = optarg; (void)x; (void)y],
+[cf_cv_getopt_header=$cf_header
+ break])
+done
+])
+if test "$cf_cv_getopt_header" != none ; then
+	AC_DEFINE(HAVE_GETOPT_HEADER,1,[Define to 1 if getopt variables are declared in header])
+fi
+if test "$cf_cv_getopt_header" = getopt.h ; then
+	AC_DEFINE(NEED_GETOPT_H,1,[Define to 1 if we must include getopt.h])
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_GNATPREP_OPT_T version: 1 updated: 2014/08/02 18:37:25
+dnl -----------------
+AC_DEFUN([CF_GNATPREP_OPT_T],[
+AC_CACHE_CHECK(if GNATPREP supports -T option,cf_cv_gnatprep_opt_t,[
+cf_cv_gnatprep_opt_t=no
+gnatprep -T 2>/dev/null >/dev/null && cf_cv_gnatprep_opt_t=yes
+])
+test "$cf_cv_gnatprep_opt_t" = yes && GNATPREP_OPTS="-T $GNATPREP_OPTS"
+AC_SUBST(GNATPREP_OPTS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_GNAT_GENERICS version: 7 updated: 2021/01/01 13:31:04
+dnl ----------------
+AC_DEFUN([CF_GNAT_GENERICS],
+[
+AC_REQUIRE([CF_GNAT_VERSION])
+
+AC_MSG_CHECKING(if GNAT supports generics)
+case "$cf_cv_gnat_version" in
+(3.1[[1-9]]*|3.[[2-9]]*|[[4-9]].*|[[1-9]][[0-9]].[[0-9]]*|20[[0-9]][[0-9]])
+	cf_gnat_generics=yes
+	;;
+(*)
+	cf_gnat_generics=no
+	;;
+esac
+AC_MSG_RESULT($cf_gnat_generics)
+
+if test "$cf_gnat_generics" = yes
+then
+	cf_compile_generics=generics
+	cf_generic_objects="\${GENOBJS}"
+else
+	cf_compile_generics=
+	cf_generic_objects=
+fi
+
+AC_SUBST(cf_compile_generics)
+AC_SUBST(cf_generic_objects)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_GNAT_PROJECTS version: 13 updated: 2021/01/02 17:09:14
+dnl ----------------
+dnl GNAT projects are configured with ".gpr" project files.
+dnl GNAT libraries are a further development, using the project feature.
+AC_DEFUN([CF_GNAT_PROJECTS],
+[
+AC_REQUIRE([CF_GNAT_VERSION])
+AC_REQUIRE([CF_DISABLE_GNAT_PROJECTS])
+
+cf_gnat_libraries=no
+cf_gnat_projects=no
+
+if test "$enable_gnat_projects" != no ; then
+AC_MSG_CHECKING(if GNAT supports project files)
+case "$cf_cv_gnat_version" in
+(3.[[0-9]]*)
+	;;
+(*)
+	case "$cf_cv_system_name" in
+	(cygwin*|msys*)
+		;;
+	(*)
+		rm -rf ./conftest* ./*~conftest*
+		if mkdir conftest.src conftest.bin conftest.lib
+		then
+			cd conftest.src
+			rm -rf ./conftest* ./*~conftest*
+			cat >>library.gpr <<CF_EOF
+project Library is
+  Kind := External ("LIB_KIND");
+  for Library_Name use "ConfTest";
+  for Object_Dir use ".";
+  for Library_ALI_Dir use External("LIBRARY_DIR");
+  for Library_Version use External ("SONAME");
+  for Library_Kind use Kind;
+  for Library_Dir use External("BUILD_DIR");
+  Source_Dir := External ("SOURCE_DIR");
+  for Source_Dirs use (Source_Dir);
+end Library;
+CF_EOF
+			cat >>confpackage.ads <<CF_EOF
+package ConfPackage is
+   procedure conftest;
+end ConfPackage;
+CF_EOF
+			cat >>confpackage.adb <<CF_EOF
+with Text_IO;
+package body ConfPackage is
+   procedure conftest is
+   begin
+      Text_IO.Put ("Hello World");
+      Text_IO.New_Line;
+   end conftest;
+end ConfPackage;
+CF_EOF
+			if ( "$cf_ada_make" $ADAFLAGS \
+					-Plibrary.gpr \
+					-XBUILD_DIR="`cd ../conftest.bin;pwd`" \
+					-XLIBRARY_DIR="`cd ../conftest.lib;pwd`" \
+					-XSOURCE_DIR="`pwd`" \
+					-XSONAME=libConfTest.so.1 \
+					-XLIB_KIND=static 1>&AC_FD_CC 2>&1 ) ; then
+				cf_gnat_projects=yes
+			fi
+			cd ..
+		fi
+		if test -f conftest.lib/confpackage.ali
+		then
+			cf_gnat_libraries=yes
+		fi
+		rm -rf ./conftest* ./*~conftest*
+		;;
+	esac
+	;;
+esac
+AC_MSG_RESULT($cf_gnat_projects)
+fi # enable_gnat_projects
+
+if test "$cf_gnat_projects" = yes
+then
+	AC_MSG_CHECKING(if GNAT supports libraries)
+	AC_MSG_RESULT($cf_gnat_libraries)
+fi
+
+USE_OLD_MAKERULES=""
+USE_GNAT_PROJECTS="#"
+USE_GNAT_MAKE_GPR="#"
+USE_GNAT_GPRBUILD="#"
+
+if test "$cf_gnat_projects" = yes
+then
+	USE_OLD_MAKERULES="#"
+	USE_GNAT_PROJECTS=""
+	if test "$cf_cv_VERSION_GPRBUILD" != no
+	then
+		USE_GNAT_GPRBUILD=""
+	elif test "$cf_cv_VERSION_GNATMAKE" != no
+	then
+		USE_GNAT_MAKE_GPR=""
+	else
+		AC_MSG_WARN(use old makefile rules since tools are missing)
+	fi
+fi
+
+if test "$cf_gnat_libraries" = yes
+then
+	USE_GNAT_LIBRARIES=""
+else
+	USE_GNAT_LIBRARIES="#"
+fi
+
+AC_SUBST(USE_OLD_MAKERULES)
+AC_SUBST(USE_GNAT_PROJECTS)
+AC_SUBST(USE_GNAT_LIBRARIES)
+AC_SUBST(USE_GNAT_MAKE_GPR)
+AC_SUBST(USE_GNAT_GPRBUILD)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_GNAT_SIGINT version: 2 updated: 2021/01/01 13:31:04
+dnl --------------
+dnl Check if gnat supports SIGINT, and presumably tasking.  For the latter, it
+dnl is noted that gnat may compile a tasking unit even for configurations which
+dnl fail at runtime.
+AC_DEFUN([CF_GNAT_SIGINT],[
+AC_CACHE_CHECK(if GNAT supports SIGINT,cf_cv_gnat_sigint,[
+CF_GNAT_TRY_LINK([with Ada.Interrupts.Names;
+
+package ConfTest is
+
+   pragma Warnings (Off);  --  the next pragma exists since 3.11p
+   pragma Unreserve_All_Interrupts;
+   pragma Warnings (On);
+
+   protected Process is
+      procedure Stop;
+      function Continue return Boolean;
+      pragma Attach_Handler (Stop, Ada.Interrupts.Names.SIGINT);
+   private
+      Done : Boolean := False;
+   end Process;
+
+end ConfTest;],
+[package body ConfTest is
+   protected body Process is
+      procedure Stop is
+      begin
+         Done := True;
+      end Stop;
+      function Continue return Boolean is
+      begin
+         return not Done;
+      end Continue;
+   end Process;
+end ConfTest;],
+	[cf_cv_gnat_sigint=yes],
+	[cf_cv_gnat_sigint=no])])
+
+if test "$cf_cv_gnat_sigint" = yes ; then
+	USE_GNAT_SIGINT=""
+else
+	USE_GNAT_SIGINT="#"
+fi
+AC_SUBST(USE_GNAT_SIGINT)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_GNAT_TRY_LINK version: 4 updated: 2021/01/01 13:31:04
+dnl ----------------
+dnl Verify that a test program compiles/links with GNAT.
+dnl $cf_ada_make is set to the program that compiles/links
+dnl $ADAFLAGS may be set to the GNAT flags.
+dnl
+dnl $1 is the text of the spec
+dnl $2 is the text of the body
+dnl $3 is the shell command to execute if successful
+dnl $4 is the shell command to execute if not successful
+AC_DEFUN([CF_GNAT_TRY_LINK],
+[
+rm -rf ./conftest* ./*~conftest*
+cat >>conftest.ads <<CF_EOF
+$1
+CF_EOF
+cat >>conftest.adb <<CF_EOF
+$2
+CF_EOF
+if ( "$cf_ada_make" $ADAFLAGS conftest 1>&AC_FD_CC 2>&1 ) ; then
+ifelse($3,,      :,[      $3])
+ifelse($4,,,[else
+   $4])
+fi
+rm -rf ./conftest* ./*~conftest*
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_GNAT_TRY_RUN version: 6 updated: 2021/01/01 13:31:04
+dnl ---------------
+dnl Verify that a test program compiles and runs with GNAT
+dnl $cf_ada_make is set to the program that compiles/links
+dnl $ADAFLAGS may be set to the GNAT flags.
+dnl
+dnl $1 is the text of the spec
+dnl $2 is the text of the body
+dnl $3 is the shell command to execute if successful
+dnl $4 is the shell command to execute if not successful
+AC_DEFUN([CF_GNAT_TRY_RUN],
+[
+rm -rf ./conftest* ./*~conftest*
+cat >>conftest.ads <<CF_EOF
+$1
+CF_EOF
+cat >>conftest.adb <<CF_EOF
+$2
+CF_EOF
+if ( "$cf_ada_make" $ADAFLAGS conftest 1>&AC_FD_CC 2>&1 ) ; then
+   if ( ./conftest 1>&AC_FD_CC 2>&1 ) ; then
+ifelse($3,,      :,[      $3])
+ifelse($4,,,[   else
+      $4])
+   fi
+ifelse($4,,,[else
+   $4])
+fi
+rm -rf ./conftest* ./*~conftest*
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_GNAT_VERSION version: 22 updated: 2019/12/31 08:53:54
+dnl ---------------
+dnl $1 = cache variable to update
+dnl $2 = program name
+dnl Verify version of GNAT or related tool
+AC_DEFUN([CF_GNAT_VERSION],
+[
+AC_CACHE_CHECK(for ifelse($2,,gnat,$2) version, cf_cv_gnat_version,[
+cf_cv_gnat_version=`ifelse($2,,${cf_ada_make:-gnatmake},$2) --version 2>&1 | \
+	grep '[[0-9]].[[0-9]][[0-9]]*' |\
+	sed -e '2,$d' -e 's/[[^0-9 \.]]//g' -e 's/^[[ ]]*//' -e 's/ .*//'`
+])
+test -z "$cf_cv_gnat_version" && cf_cv_gnat_version=no
+ifelse($1,,,[eval $1=$cf_cv_gnat_version; unset cf_cv_gnat_version])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_GNU_SOURCE version: 10 updated: 2018/12/10 20:09:41
+dnl -------------
+dnl Check if we must define _GNU_SOURCE to get a reasonable value for
+dnl _XOPEN_SOURCE, upon which many POSIX definitions depend.  This is a defect
+dnl (or misfeature) of glibc2, which breaks portability of many applications,
+dnl since it is interwoven with GNU extensions.
+dnl
+dnl Well, yes we could work around it...
+dnl
+dnl Parameters:
+dnl	$1 is the nominal value for _XOPEN_SOURCE
+AC_DEFUN([CF_GNU_SOURCE],
+[
+cf_gnu_xopen_source=ifelse($1,,500,$1)
+
+AC_CACHE_CHECK(if this is the GNU C library,cf_cv_gnu_library,[
+AC_TRY_COMPILE([#include <sys/types.h>],[
+	#if __GLIBC__ > 0 && __GLIBC_MINOR__ >= 0
+		return 0;
+	#elif __NEWLIB__ > 0 && __NEWLIB_MINOR__ >= 0
+		return 0;
+	#else
+	#	error not GNU C library
+	#endif],
+	[cf_cv_gnu_library=yes],
+	[cf_cv_gnu_library=no])
+])
+
+if test x$cf_cv_gnu_library = xyes; then
+
+	# With glibc 2.19 (13 years after this check was begun), _DEFAULT_SOURCE
+	# was changed to help a little.  newlib incorporated the change about 4
+	# years later.
+	AC_CACHE_CHECK(if _DEFAULT_SOURCE can be used as a basis,cf_cv_gnu_library_219,[
+		cf_save="$CPPFLAGS"
+		CF_APPEND_TEXT(CPPFLAGS,-D_DEFAULT_SOURCE)
+		AC_TRY_COMPILE([#include <sys/types.h>],[
+			#if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 19) || (__GLIBC__ > 2)
+				return 0;
+			#elif (__NEWLIB__ == 2 && __NEWLIB_MINOR__ >= 4) || (__GLIBC__ > 3)
+				return 0;
+			#else
+			#	error GNU C library __GLIBC__.__GLIBC_MINOR__ is too old
+			#endif],
+			[cf_cv_gnu_library_219=yes],
+			[cf_cv_gnu_library_219=no])
+		CPPFLAGS="$cf_save"
+	])
+
+	if test "x$cf_cv_gnu_library_219" = xyes; then
+		cf_save="$CPPFLAGS"
+		AC_CACHE_CHECK(if _XOPEN_SOURCE=$cf_gnu_xopen_source works with _DEFAULT_SOURCE,cf_cv_gnu_dftsrc_219,[
+			CF_ADD_CFLAGS(-D_DEFAULT_SOURCE -D_XOPEN_SOURCE=$cf_gnu_xopen_source)
+			AC_TRY_COMPILE([
+				#include <limits.h>
+				#include <sys/types.h>
+				],[
+				#if (_XOPEN_SOURCE >= $cf_gnu_xopen_source) && (MB_LEN_MAX > 1)
+					return 0;
+				#else
+				#	error GNU C library is too old
+				#endif],
+				[cf_cv_gnu_dftsrc_219=yes],
+				[cf_cv_gnu_dftsrc_219=no])
+			])
+		test "x$cf_cv_gnu_dftsrc_219" = "xyes" || CPPFLAGS="$cf_save"
+	else
+		cf_cv_gnu_dftsrc_219=maybe
+	fi
+
+	if test "x$cf_cv_gnu_dftsrc_219" != xyes; then
+
+		AC_CACHE_CHECK(if we must define _GNU_SOURCE,cf_cv_gnu_source,[
+		AC_TRY_COMPILE([#include <sys/types.h>],[
+			#ifndef _XOPEN_SOURCE
+			#error	expected _XOPEN_SOURCE to be defined
+			#endif],
+			[cf_cv_gnu_source=no],
+			[cf_save="$CPPFLAGS"
+			 CF_ADD_CFLAGS(-D_GNU_SOURCE)
+			 AC_TRY_COMPILE([#include <sys/types.h>],[
+				#ifdef _XOPEN_SOURCE
+				#error	expected _XOPEN_SOURCE to be undefined
+				#endif],
+				[cf_cv_gnu_source=no],
+				[cf_cv_gnu_source=yes])
+			CPPFLAGS="$cf_save"
+			])
+		])
+
+		if test "$cf_cv_gnu_source" = yes
+		then
+		AC_CACHE_CHECK(if we should also define _DEFAULT_SOURCE,cf_cv_default_source,[
+			CF_APPEND_TEXT(CPPFLAGS,-D_GNU_SOURCE)
+			AC_TRY_COMPILE([#include <sys/types.h>],[
+				#ifdef _DEFAULT_SOURCE
+				#error	expected _DEFAULT_SOURCE to be undefined
+				#endif],
+				[cf_cv_default_source=no],
+				[cf_cv_default_source=yes])
+			])
+			if test "$cf_cv_default_source" = yes
+			then
+				CF_APPEND_TEXT(CPPFLAGS,-D_DEFAULT_SOURCE)
+			fi
+		fi
+	fi
+
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_GPP_LIBRARY version: 13 updated: 2021/01/01 13:31:04
+dnl --------------
+dnl If we're trying to use g++, test if libg++ is installed (a rather common
+dnl problem :-).  If we have the compiler but no library, we'll be able to
+dnl configure, but won't be able to build the c++ demo program.
+AC_DEFUN([CF_GPP_LIBRARY],
+[
+cf_cxx_library=unknown
+case "$cf_cv_system_name" in
+(os2*)
+	cf_gpp_libname=gpp
+	;;
+(*)
+	cf_gpp_libname=g++
+	;;
+esac
+if test "$GXX" = yes; then
+	AC_MSG_CHECKING([for lib$cf_gpp_libname])
+	cf_save="$LIBS"
+	CF_ADD_LIB($cf_gpp_libname)
+	AC_TRY_LINK([
+#include <$cf_gpp_libname/builtin.h>
+	],
+	[two_arg_error_handler_t foo2 = lib_error_handler],
+	[cf_cxx_library=yes
+	 CF_ADD_LIB($cf_gpp_libname,CXXLIBS)
+	 if test "$cf_gpp_libname" = cpp ; then
+	    AC_DEFINE(HAVE_GPP_BUILTIN_H,1,[Define to 1 if we have gpp builtin.h])
+	 else
+	    AC_DEFINE(HAVE_GXX_BUILTIN_H,1,[Define to 1 if we have g++ builtin.h])
+	 fi],
+	[AC_TRY_LINK([
+#include <builtin.h>
+	],
+	[two_arg_error_handler_t foo2 = lib_error_handler],
+	[cf_cxx_library=yes
+	 CF_ADD_LIB($cf_gpp_libname,CXXLIBS)
+	 AC_DEFINE(HAVE_BUILTIN_H,1,[Define to 1 if we have builtin.h])],
+	[cf_cxx_library=no])])
+	LIBS="$cf_save"
+	AC_MSG_RESULT($cf_cxx_library)
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_GXX_VERSION version: 8 updated: 2017/02/11 14:48:57
+dnl --------------
+dnl Check for version of g++
+AC_DEFUN([CF_GXX_VERSION],[
+AC_REQUIRE([AC_PROG_CPP])
+GXX_VERSION=none
+if test "$GXX" = yes; then
+	AC_MSG_CHECKING(version of ${CXX:-g++})
+	GXX_VERSION="`${CXX:-g++} --version| sed -e '2,$d' -e 's/^.*(GCC) //' -e 's/^[[^0-9.]]*//' -e 's/[[^0-9.]].*//'`"
+	if test -z "$GXX_VERSION"
+	then
+		GXX_VERSION=unknown
+		GXX=no
+	fi
+	AC_MSG_RESULT($GXX_VERSION)
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_GXX_WARNINGS version: 11 updated: 2021/01/08 16:50:55
+dnl ---------------
+dnl Check if the compiler supports useful warning options.
+dnl
+dnl Most of gcc's options apply to g++, except:
+dnl	-Wbad-function-cast
+dnl	-Wmissing-declarations
+dnl	-Wnested-externs
+dnl
+dnl Omit a few (for now):
+dnl	-Winline
+dnl
+dnl Parameter:
+dnl	$1 is an optional list of g++ warning flags that a particular
+dnl		application might want to use, e.g., "no-unused" for
+dnl		-Wno-unused
+dnl Special:
+dnl	If $with_ext_const is "yes", add a check for -Wwrite-strings
+dnl
+AC_DEFUN([CF_GXX_WARNINGS],
+[
+
+CF_INTEL_COMPILER(GXX,INTEL_CPLUSPLUS,CXXFLAGS)
+CF_CLANG_COMPILER(GXX,CLANG_CPLUSPLUS,CXXFLAGS)
+
+AC_REQUIRE([CF_GXX_VERSION])
+
+AC_LANG_SAVE
+AC_LANG_CPLUSPLUS
+
+cat > conftest.$ac_ext <<EOF
+#line __oline__ "configure"
+int main(int argc, char *argv[[]]) { return (argv[[argc-1]] == 0) ; }
+EOF
+
+if test "$INTEL_CPLUSPLUS" = yes
+then
+# The "-wdXXX" options suppress warnings:
+# remark #1419: external declaration in primary source file
+# remark #1682: implicit conversion of a 64-bit integral type to a smaller integral type (potential portability problem)
+# remark #1683: explicit conversion of a 64-bit integral type to a smaller integral type (potential portability problem)
+# remark #1684: conversion from pointer to same-sized integral type (potential portability problem)
+# remark #193: zero used for undefined preprocessing identifier
+# remark #593: variable "curs_sb_left_arrow" was set but never used
+# remark #810: conversion from "int" to "Dimension={unsigned short}" may lose significant bits
+# remark #869: parameter "tw" was never referenced
+# remark #981: operands are evaluated in unspecified order
+# warning #269: invalid format string conversion
+
+	AC_CHECKING([for $CC warning options])
+	cf_save_CXXFLAGS="$CXXFLAGS"
+	EXTRA_CXXFLAGS="-Wall"
+	for cf_opt in \
+		wd1419 \
+		wd1682 \
+		wd1683 \
+		wd1684 \
+		wd193 \
+		wd279 \
+		wd593 \
+		wd810 \
+		wd869 \
+		wd981
+	do
+		CXXFLAGS="$cf_save_CXXFLAGS $EXTRA_CXXFLAGS -$cf_opt"
+		if AC_TRY_EVAL(ac_compile); then
+			test -n "$verbose" && AC_MSG_RESULT(... -$cf_opt)
+			EXTRA_CXXFLAGS="$EXTRA_CXXFLAGS -$cf_opt"
+		fi
+	done
+	CXXFLAGS="$cf_save_CXXFLAGS"
+
+elif test "$GXX" = yes
+then
+	AC_CHECKING([for $CXX warning options])
+	cf_save_CXXFLAGS="$CXXFLAGS"
+	EXTRA_CXXFLAGS="-W -Wall"
+	cf_gxx_extra_warnings=""
+	test "$with_ext_const" = yes && cf_gxx_extra_warnings="Wwrite-strings"
+	case "$GXX_VERSION" in
+	([[1-2]].*)
+		;;
+	(*)
+		cf_gxx_extra_warnings="$cf_gxx_extra_warnings Weffc++"
+		;;
+	esac
+	for cf_opt in \
+		Wabi \
+		fabi-version=0 \
+		Wextra \
+		Wignored-qualifiers \
+		Wlogical-op \
+		Woverloaded-virtual \
+		Wsign-promo \
+		Wsynth \
+		Wold-style-cast \
+		Wcast-align \
+		Wcast-qual \
+		Wpointer-arith \
+		Wshadow \
+		Wundef $cf_gxx_extra_warnings $1
+	do
+		CXXFLAGS="$cf_save_CXXFLAGS $EXTRA_CXXFLAGS -Werror -$cf_opt"
+		if AC_TRY_EVAL(ac_compile); then
+			test -n "$verbose" && AC_MSG_RESULT(... -$cf_opt)
+			EXTRA_CXXFLAGS="$EXTRA_CXXFLAGS -$cf_opt"
+		else
+			test -n "$verbose" && AC_MSG_RESULT(... no -$cf_opt)
+		fi
+	done
+	CXXFLAGS="$cf_save_CXXFLAGS"
+fi
+
+rm -rf ./conftest*
+AC_LANG_RESTORE
+AC_SUBST(EXTRA_CXXFLAGS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_HASHED_DB version: 7 updated: 2015/04/18 08:56:57
+dnl ------------
+dnl Look for an instance of the Berkeley hashed database.
+dnl
+dnl $1 = optional parameter, to specify install-prefix for the database.
+AC_DEFUN([CF_HASHED_DB],
+[
+ifelse([$1],,,[
+case $1 in
+(yes|*able*)
+	;;
+(*)
+	if test -d "$1" ; then
+		CF_ADD_INCDIR($1/include)
+		CF_ADD_LIBDIR($1/lib)
+	else
+		case "$1" in
+		(./*|../*|/*)
+			AC_MSG_WARN(no such directory $1)
+			;;
+		(*)
+			CF_FIND_SUB_INCDIR($1)
+			CF_FIND_SUB_LIBDIR($1)
+			;;
+		esac
+	fi
+esac
+])
+AC_CHECK_HEADER(db.h,[
+CF_HASHED_DB_VERSION
+if test "$cf_cv_hashed_db_version" = unknown ; then
+	AC_MSG_ERROR(Cannot determine version of db)
+else
+	CF_HASHED_DB_LIBS
+	if test "$cf_cv_hashed_db_libs" = unknown ; then
+		AC_MSG_ERROR(Cannot determine library for db)
+	elif test "$cf_cv_hashed_db_libs" != default ; then
+		CF_ADD_LIB($cf_cv_hashed_db_libs)
+	fi
+fi
+],[
+	AC_MSG_ERROR(Cannot find db.h)
+])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_HASHED_DB_LIBS version: 10 updated: 2021/01/02 17:09:14
+dnl -----------------
+dnl Given that we have the header and version for hashed database, find the
+dnl library information.
+AC_DEFUN([CF_HASHED_DB_LIBS],
+[
+AC_CACHE_CHECK(for db libraries, cf_cv_hashed_db_libs,[
+cf_cv_hashed_db_libs=unknown
+for cf_db_libs in "" db$cf_cv_hashed_db_version db-$cf_cv_hashed_db_version db ''
+do
+	cf_save_libs="$LIBS"
+	if test -n "$cf_db_libs"; then
+		CF_ADD_LIB($cf_db_libs)
+	fi
+	CF_MSG_LOG(checking for library $cf_db_libs)
+	AC_TRY_LINK([
+$ac_includes_default
+#include <db.h>
+],[
+	char *path = "/tmp/foo";
+#ifdef DB_VERSION_MAJOR
+#if DB_VERSION_MAJOR >= 4
+	DB *result = 0;
+	db_create(&result, NULL, 0);
+	result->open(result,
+		NULL,
+		path,
+		path,
+		DB_HASH,
+		DB_CREATE,
+		0644);
+#elif DB_VERSION_MAJOR >= 3
+	DB *result = 0;
+	db_create(&result, NULL, 0);
+	result->open(result,
+		path,
+		path,
+		DB_HASH,
+		DB_CREATE,
+		0644);
+#elif DB_VERSION_MAJOR >= 2
+	DB *result = 0;
+	db_open(path,
+		DB_HASH,
+		DB_CREATE,
+		0644,
+		(DB_ENV *) 0,
+		(DB_INFO *) 0,
+		&result);
+#endif /* DB_VERSION_MAJOR */
+#else
+	DB *result = dbopen(path,
+		     2,
+		     0644,
+		     DB_HASH,
+		     0);
+#endif
+	${cf_cv_main_return:-return}(result != 0)
+],[
+	if test -n "$cf_db_libs" ; then
+		cf_cv_hashed_db_libs=$cf_db_libs
+	else
+		cf_cv_hashed_db_libs=default
+	fi
+	LIBS="$cf_save_libs"
+	break
+])
+	LIBS="$cf_save_libs"
+done
+])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_HASHED_DB_VERSION version: 4 updated: 2014/04/12 16:47:01
+dnl --------------------
+dnl Given that we have the header file for hashed database, find the version
+dnl information.
+AC_DEFUN([CF_HASHED_DB_VERSION],
+[
+AC_CACHE_CHECK(for version of db, cf_cv_hashed_db_version,[
+cf_cv_hashed_db_version=unknown
+
+for cf_db_version in 1 2 3 4 5 6
+do
+	CF_MSG_LOG(checking for db version $cf_db_version)
+	AC_TRY_COMPILE([
+$ac_includes_default
+#include <db.h>
+
+#ifdef DB_VERSION_MAJOR
+	/* db2 (DB_VERSION_MAJOR=2) has also DB_VERSION_MINOR, tested with 7 */
+#if $cf_db_version == DB_VERSION_MAJOR
+	/* ok */
+#else
+	make an error
+#endif
+#else
+#if $cf_db_version == 1
+	/* ok: assuming this is DB 1.8.5 */
+#else
+	make an error
+#endif
+#endif
+],[DBT *foo = 0],[
+	cf_cv_hashed_db_version=$cf_db_version
+	break
+	])
+done
+])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_HEADER_PATH version: 15 updated: 2021/01/01 13:31:04
+dnl --------------
+dnl Construct a search-list of directories for a nonstandard header-file
+dnl
+dnl Parameters
+dnl	$1 = the variable to return as result
+dnl	$2 = the package name
+AC_DEFUN([CF_HEADER_PATH],
+[
+$1=
+
+# collect the current set of include-directories from compiler flags
+cf_header_path_list=""
+if test -n "${CFLAGS}${CPPFLAGS}" ; then
+	for cf_header_path in $CPPFLAGS $CFLAGS
+	do
+		case "$cf_header_path" in
+		(-I*)
+			cf_header_path=`echo ".$cf_header_path" |sed -e 's/^...//' -e 's,/include$,,'`
+			CF_ADD_SUBDIR_PATH($1,$2,include,$cf_header_path,NONE)
+			cf_header_path_list="$cf_header_path_list [$]$1"
+			;;
+		esac
+	done
+fi
+
+# add the variations for the package we are looking for
+CF_SUBDIR_PATH($1,$2,include)
+
+test "$includedir" != NONE && \
+test "$includedir" != "/usr/include" && \
+test -d "$includedir" && {
+	test -d "$includedir" &&    $1="[$]$1 $includedir"
+	test -d "$includedir/$2" && $1="[$]$1 $includedir/$2"
+}
+
+test "$oldincludedir" != NONE && \
+test "$oldincludedir" != "/usr/include" && \
+test -d "$oldincludedir" && {
+	test -d "$oldincludedir"    && $1="[$]$1 $oldincludedir"
+	test -d "$oldincludedir/$2" && $1="[$]$1 $oldincludedir/$2"
+}
+
+$1="[$]$1 $cf_header_path_list"
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_HELP_MESSAGE version: 4 updated: 2019/12/31 08:53:54
+dnl ---------------
+dnl Insert text into the help-message, for readability, from AC_ARG_WITH.
+AC_DEFUN([CF_HELP_MESSAGE],
+[CF_ACVERSION_CHECK(2.53,[],[
+AC_DIVERT_HELP($1)])dnl
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_INCLUDE_DIRS version: 10 updated: 2014/09/19 20:58:42
+dnl ---------------
+dnl Construct the list of include-options according to whether we're building
+dnl in the source directory or using '--srcdir=DIR' option.
+AC_DEFUN([CF_INCLUDE_DIRS],
+[
+if test "$srcdir" != "."; then
+	CPPFLAGS="-I\${srcdir}/../include $CPPFLAGS"
+fi
+CPPFLAGS="-I../include $CPPFLAGS"
+if test "$srcdir" != "."; then
+	CPPFLAGS="-I\${srcdir} $CPPFLAGS"
+fi
+CPPFLAGS="-I. $CPPFLAGS"
+AC_SUBST(CPPFLAGS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_INSTALL_OPTS version: 2 updated: 2018/08/18 12:19:21
+dnl ---------------
+dnl prompt for/fill-in useful install-program options
+AC_DEFUN([CF_INSTALL_OPTS],
+[
+CF_INSTALL_OPT_S
+CF_INSTALL_OPT_P
+CF_INSTALL_OPT_O
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_INSTALL_OPT_O version: 3 updated: 2020/12/31 20:19:42
+dnl ----------------
+dnl Almost all "install" programs default to the current user's ownership.
+dnl Almost - MINIX is an exception.
+AC_DEFUN([CF_INSTALL_OPT_O],
+[
+AC_MSG_CHECKING(if install needs to be told about ownership)
+case `$ac_config_guess` in
+(*minix)
+	with_install_o=yes
+	;;
+(*)
+	with_install_o=no
+	;;
+esac
+
+AC_MSG_RESULT($with_install_o)
+if test "x$with_install_o" = xyes
+then
+	INSTALL_OPT_O="`id root|sed -e 's/uid=[[0-9]]*(/ -o /' -e 's/gid=[[0-9]]*(/ -g /' -e 's/ [[^=[:space:]]][[^=[:space:]]]*=.*/ /' -e 's/)//g'`"
+else
+	INSTALL_OPT_O=
+fi
+
+AC_SUBST(INSTALL_OPT_O)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_INSTALL_OPT_P version: 3 updated: 2021/01/01 13:31:04
+dnl ----------------
+dnl Some install-programs accept a "-p" option to preserve file modification
+dnl timestamps.  That can be useful as an install option, as well as a way to
+dnl avoid the need for ranlib after copying a static archive.
+AC_DEFUN([CF_INSTALL_OPT_P],
+[
+: "${INSTALL:=install}"
+AC_CACHE_CHECK(if install accepts -p option, cf_cv_install_p,[
+	rm -rf ./conftest*
+	date >conftest.in
+	mkdir conftest.out
+	sleep 3
+	if $INSTALL -p conftest.in conftest.out 2>/dev/null
+	then
+		if test -f conftest.out/conftest.in
+		then
+			test conftest.in -nt conftest.out/conftest.in 2>conftest.err && \
+			test conftest.out/conftest.in -nt conftest.in 2>conftest.err
+			if test -s conftest.err
+			then
+				cf_cv_install_p=no
+			else
+				cf_cv_install_p=yes
+			fi
+		else
+			cf_cv_install_p=no
+		fi
+	else
+		cf_cv_install_p=no
+	fi
+	rm -rf ./conftest*
+])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_INSTALL_OPT_S version: 3 updated: 2021/01/05 19:23:48
+dnl ----------------
+dnl By default, we should strip executables which are installed, but leave the
+dnl ability to suppress that for unit-testing.
+AC_DEFUN([CF_INSTALL_OPT_S],
+[
+AC_MSG_CHECKING(if you want to install stripped executables)
+CF_ARG_DISABLE(stripping,
+	[  --disable-stripping     do not strip (debug info) installed executables],
+	[enable_stripping=no],
+	[enable_stripping=yes])
+AC_MSG_RESULT($enable_stripping)
+
+if test "$enable_stripping" = yes
+then
+	INSTALL_OPT_S="-s"
+else
+	INSTALL_OPT_S=
+fi
+AC_SUBST(INSTALL_OPT_S)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_INTEL_COMPILER version: 8 updated: 2021/01/01 16:53:59
+dnl -----------------
+dnl Check if the given compiler is really the Intel compiler for Linux.  It
+dnl tries to imitate gcc, but does not return an error when it finds a mismatch
+dnl between prototypes, e.g., as exercised by CF_MISSING_CHECK.
+dnl
+dnl This macro should be run "soon" after AC_PROG_CC or AC_PROG_CPLUSPLUS, to
+dnl ensure that it is not mistaken for gcc/g++.  It is normally invoked from
+dnl the wrappers for gcc and g++ warnings.
+dnl
+dnl $1 = GCC (default) or GXX
+dnl $2 = INTEL_COMPILER (default) or INTEL_CPLUSPLUS
+dnl $3 = CFLAGS (default) or CXXFLAGS
+AC_DEFUN([CF_INTEL_COMPILER],[
+AC_REQUIRE([AC_CANONICAL_HOST])
+ifelse([$2],,INTEL_COMPILER,[$2])=no
+
+if test "$ifelse([$1],,[$1],GCC)" = yes ; then
+	case "$host_os" in
+	(linux*|gnu*)
+		AC_MSG_CHECKING(if this is really Intel ifelse([$1],GXX,C++,C) compiler)
+		cf_save_CFLAGS="$ifelse([$3],,CFLAGS,[$3])"
+		ifelse([$3],,CFLAGS,[$3])="$ifelse([$3],,CFLAGS,[$3]) -no-gcc"
+		AC_TRY_COMPILE([],[
+#ifdef __INTEL_COMPILER
+#else
+make an error
+#endif
+],[ifelse([$2],,INTEL_COMPILER,[$2])=yes
+cf_save_CFLAGS="$cf_save_CFLAGS -we147"
+],[])
+		ifelse([$3],,CFLAGS,[$3])="$cf_save_CFLAGS"
+		AC_MSG_RESULT($ifelse([$2],,INTEL_COMPILER,[$2]))
+		;;
+	esac
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ISASCII version: 4 updated: 2012/10/06 17:56:13
+dnl ----------
+dnl Check if we have either a function or macro for 'isascii()'.
+AC_DEFUN([CF_ISASCII],
+[
+AC_MSG_CHECKING(for isascii)
+AC_CACHE_VAL(cf_cv_have_isascii,[
+	AC_TRY_LINK([#include <ctype.h>],[int x = isascii(' ')],
+	[cf_cv_have_isascii=yes],
+	[cf_cv_have_isascii=no])
+])dnl
+AC_MSG_RESULT($cf_cv_have_isascii)
+test "$cf_cv_have_isascii" = yes && AC_DEFINE(HAVE_ISASCII,1,[Define to 1 if we have isascii()])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_LARGEFILE version: 12 updated: 2020/03/19 20:23:48
+dnl ------------
+dnl Add checks for large file support.
+AC_DEFUN([CF_LARGEFILE],[
+ifdef([AC_FUNC_FSEEKO],[
+	AC_SYS_LARGEFILE
+	if test "$enable_largefile" != no ; then
+	AC_FUNC_FSEEKO
+
+	# Normally we would collect these definitions in the config.h,
+	# but (like _XOPEN_SOURCE), some environments rely on having these
+	# defined before any of the system headers are included.  Another
+	# case comes up with C++, e.g., on AIX the compiler compiles the
+	# header files by themselves before looking at the body files it is
+	# told to compile.  For ncurses, those header files do not include
+	# the config.h
+	if test "$ac_cv_sys_large_files" != no
+	then
+		CF_APPEND_TEXT(CPPFLAGS,-D_LARGE_FILES)
+	fi
+	if test "$ac_cv_sys_largefile_source" != no
+	then
+		CF_APPEND_TEXT(CPPFLAGS,-D_LARGEFILE_SOURCE)
+	fi
+	if test "$ac_cv_sys_file_offset_bits" != no
+	then
+		CF_APPEND_TEXT(CPPFLAGS,-D_FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits)
+	fi
+
+	AC_CACHE_CHECK(whether to use struct dirent64, cf_cv_struct_dirent64,[
+		AC_TRY_COMPILE([
+#pragma GCC diagnostic error "-Wincompatible-pointer-types"
+#include <sys/types.h>
+#include <dirent.h>
+		],[
+		/* if transitional largefile support is setup, this is true */
+		extern struct dirent64 * readdir(DIR *);
+		struct dirent64 *x = readdir((DIR *)0);
+		struct dirent *y = readdir((DIR *)0);
+		int z = x - y;
+		(void)z;
+		],
+		[cf_cv_struct_dirent64=yes],
+		[cf_cv_struct_dirent64=no])
+	])
+	test "$cf_cv_struct_dirent64" = yes && AC_DEFINE(HAVE_STRUCT_DIRENT64,1,[Define to 1 if we have struct dirent64])
+	fi
+])
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_LDFLAGS_STATIC version: 14 updated: 2021/01/02 17:09:14
+dnl -----------------
+dnl Check for compiler/linker flags used to temporarily force usage of static
+dnl libraries.  This depends on the compiler and platform.  Use this to help
+dnl ensure that the linker picks up a given library based on its position in
+dnl the list of linker options and libraries.
+AC_DEFUN([CF_LDFLAGS_STATIC],[
+
+if test "$GCC" = yes ; then
+	case "$cf_cv_system_name" in
+	(OS/2*|os2*|aix[[4]]*|solaris2.1[[0-9]]|darwin*)
+		LDFLAGS_STATIC=
+		LDFLAGS_SHARED=
+		;;
+	(*) 	# normally, except when broken
+		LDFLAGS_STATIC=-static
+		LDFLAGS_SHARED=-dynamic
+		;;
+	esac
+else
+	case "$cf_cv_system_name" in
+	(aix[[4-7]]*) 	# from ld manpage
+		LDFLAGS_STATIC=-bstatic
+		LDFLAGS_SHARED=-bdynamic
+		;;
+	(hpux*)		# from ld manpage for hpux10.20, hpux11.11
+		# We could also use just "archive" and "shared".
+		LDFLAGS_STATIC=-Wl,-a,archive_shared
+		LDFLAGS_SHARED=-Wl,-a,shared_archive
+		;;
+	(irix*)		# from ld manpage IRIX64
+		LDFLAGS_STATIC=-Bstatic
+		LDFLAGS_SHARED=-Bdynamic
+		;;
+	(osf[[45]]*)	# from ld manpage osf4.0d, osf5.1
+		# alternative "-oldstyle_liblookup" (not in cc manpage)
+		LDFLAGS_STATIC=-noso
+		LDFLAGS_SHARED=-so_archive
+		;;
+	(solaris2*)
+		LDFLAGS_STATIC=-Bstatic
+		LDFLAGS_SHARED=-Bdynamic
+		;;
+	esac
+fi
+
+if test -n "$LDFLAGS_STATIC" && test -n "$LDFLAGS_SHARED"
+then
+	AC_MSG_CHECKING(if linker supports switching between static/dynamic)
+
+	rm -f libconftest.a
+	cat >conftest.$ac_ext <<EOF
+#line __oline__ "configure"
+#include <stdio.h>
+int cf_ldflags_static(FILE *fp) { return fflush(fp); }
+EOF
+	if AC_TRY_EVAL(ac_compile) ; then
+		( $AR $ARFLAGS libconftest.a conftest.o ) 2>&AC_FD_CC 1>/dev/null
+		( eval $RANLIB libconftest.a ) 2>&AC_FD_CC >/dev/null
+	fi
+	rm -f conftest.*
+
+	cf_save_LIBS="$LIBS"
+
+	LIBS="$LDFLAGS_STATIC -L`pwd` -lconftest $LDFLAGS_DYNAMIC $LIBS"
+	AC_TRY_LINK([
+#line __oline__ "configure"
+#include <stdio.h>
+int cf_ldflags_static(FILE *fp);
+],[
+	return cf_ldflags_static(stdin);
+],[
+	# some linkers simply ignore the -dynamic
+	case x`file "conftest$ac_exeext" 2>/dev/null` in
+	(*static*)
+		cf_ldflags_static=no
+		;;
+	(*)
+		cf_ldflags_static=yes
+		;;
+	esac
+],[cf_ldflags_static=no])
+
+	rm -f libconftest.*
+	LIBS="$cf_save_LIBS"
+
+	AC_MSG_RESULT($cf_ldflags_static)
+
+	if test "$cf_ldflags_static" != yes
+	then
+		LDFLAGS_STATIC=
+		LDFLAGS_SHARED=
+	fi
+else
+	LDFLAGS_STATIC=
+	LDFLAGS_SHARED=
+fi
+
+AC_SUBST(LDFLAGS_STATIC)
+AC_SUBST(LDFLAGS_SHARED)
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_LD_RPATH_OPT version: 9 updated: 2021/01/01 13:31:04
+dnl ---------------
+dnl For the given system and compiler, find the compiler flags to pass to the
+dnl loader to use the "rpath" feature.
+AC_DEFUN([CF_LD_RPATH_OPT],
+[
+AC_REQUIRE([CF_CHECK_CACHE])
+
+LD_RPATH_OPT=
+if test "x$cf_cv_enable_rpath" != xno
+then
+	AC_MSG_CHECKING(for an rpath option)
+	case "$cf_cv_system_name" in
+	(irix*)
+		if test "$GCC" = yes; then
+			LD_RPATH_OPT="-Wl,-rpath,"
+		else
+			LD_RPATH_OPT="-rpath "
+		fi
+		;;
+	(linux*|gnu*|k*bsd*-gnu|freebsd*)
+		LD_RPATH_OPT="-Wl,-rpath,"
+		;;
+	(openbsd[[2-9]].*|mirbsd*)
+		LD_RPATH_OPT="-Wl,-rpath,"
+		;;
+	(dragonfly*)
+		LD_RPATH_OPT="-rpath "
+		;;
+	(netbsd*)
+		LD_RPATH_OPT="-Wl,-rpath,"
+		;;
+	(osf*|mls+*)
+		LD_RPATH_OPT="-rpath "
+		;;
+	(solaris2*)
+		LD_RPATH_OPT="-R"
+		;;
+	(*)
+		;;
+	esac
+	AC_MSG_RESULT($LD_RPATH_OPT)
+
+	case "x$LD_RPATH_OPT" in
+	(x-R*)
+		AC_MSG_CHECKING(if we need a space after rpath option)
+		cf_save_LIBS="$LIBS"
+		CF_ADD_LIBS(${LD_RPATH_OPT}$libdir)
+		AC_TRY_LINK(, , cf_rpath_space=no, cf_rpath_space=yes)
+		LIBS="$cf_save_LIBS"
+		AC_MSG_RESULT($cf_rpath_space)
+		test "$cf_rpath_space" = yes && LD_RPATH_OPT="$LD_RPATH_OPT "
+		;;
+	esac
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_LD_SEARCHPATH version: 4 updated: 2022/08/27 15:43:08
+dnl ----------------
+dnl Try to obtain the linker's search-path, for use in scripts.
+dnl
+dnl Ignore LD_LIBRARY_PATH, etc.
+AC_DEFUN([CF_LD_SEARCHPATH],[
+AC_CACHE_CHECK(for linker search path,cf_cv_ld_searchpath,[
+
+if test "$cross_compiling" != yes ; then
+
+# GNU binutils' ld does not involve permissions which may stop ldconfig.
+cf_pathlist=`${LD:-ld} --verbose 2>/dev/null | grep SEARCH_DIR | sed -e 's,SEARCH_DIR[[("=]][[("=]]*,,g' -e 's/"[[)]];//gp' | sort -u`
+
+# The -NX options tell newer versions of Linux ldconfig to not attempt to
+# update the cache, which makes it run faster.
+test -z "$cf_pathlist" && \
+	cf_pathlist=`(ldconfig -NX -v) 2>/dev/null | sed -e '/^[[ 	]]/d' -e 's/:$//' | sort -u`
+
+test -z "$cf_pathlist" &&
+	cf_pathlist=`(ldconfig -v) 2>/dev/null | sed -n -e '/^[[ 	]]/d' -e 's/:$//p' | sort -u`
+
+# This works with OpenBSD 6.5, which lists only filenames
+test -z "$cf_pathlist" &&
+	cf_pathlist=`(ldconfig -v) 2>/dev/null | sed -n -e 's,^Adding \(.*\)/.*[$],\1,p' | sort -u`
+
+if test -z "$cf_pathlist"
+then
+	# dyld default path with MacOS
+	if test -f /usr/bin/otool && test "x`uname -s`" = xDarwin
+	then
+		# do this to bypass check
+		cf_cv_ld_searchpath='$HOME/lib'
+		cf_pathlist="/usr/local/lib /lib /usr/lib"
+	fi
+fi
+
+if test -z "$cf_pathlist"
+then
+	# Solaris is "SunOS"
+	if test -f /usr/bin/isainfo && test "x`uname -s`" = xSunOS
+	then
+		case x`(isainfo -b)` in
+		(x64)
+			cf_pathlist="$cf_pathlist /lib/64 /usr/lib/64"
+			;;
+		(x32)
+			test -d /usr/ccs/lib && cf_pathlist="$cf_pathlist /usr/ccs/lib"
+			cf_pathlist="$cf_pathlist /lib /usr/lib"
+			;;
+		(*)
+			AC_MSG_WARN(problem with Solaris architecture)
+			;;
+		esac
+	fi
+fi
+
+if test -z "$cf_pathlist"
+then
+	# HP-UX
+	if test x"`uname -s`" = xHP-UX
+	then
+		case x`getconf LONG_BIT` in
+		(x64)
+			cf_pathlist="/usr/lib/hpux64"
+			;;
+		(x*)
+			cf_pathlist="/usr/lib/hpux32"
+			;;
+		esac
+	fi
+fi
+
+fi
+
+# If nothing else, assume it is conventional
+test -z "$cf_pathlist" && cf_pathlist="/usr/lib /lib"
+
+# Finally, check that this is only directories
+for cf_path in [$]0 $cf_pathlist
+do
+	if test -d "$cf_path"; then
+		test -n "$cf_cv_ld_searchpath" && cf_cv_ld_searchpath="${cf_cv_ld_searchpath} "
+		cf_cv_ld_searchpath="${cf_cv_ld_searchpath}${cf_path}"
+	fi
+done
+
+# Ensure that it is nonempty
+test -z "$cf_cv_ld_searchpath" && cf_cv_ld_searchpath=/usr/lib
+])
+
+LD_SEARCHPATH=`echo "$cf_cv_ld_searchpath"|sed -e 's/ /|/g'`
+AC_SUBST(LD_SEARCHPATH)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_LIBRARY_PATH version: 11 updated: 2021/01/01 13:31:04
+dnl ---------------
+dnl Construct a search-list of directories for a nonstandard library-file
+dnl
+dnl Parameters
+dnl	$1 = the variable to return as result
+dnl	$2 = the package name
+AC_DEFUN([CF_LIBRARY_PATH],
+[
+$1=
+cf_library_path_list=""
+if test -n "${LDFLAGS}${LIBS}" ; then
+	for cf_library_path in $LDFLAGS $LIBS
+	do
+		case "$cf_library_path" in
+		(-L*)
+			cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'`
+			CF_ADD_SUBDIR_PATH($1,$2,lib,$cf_library_path,NONE)
+			cf_library_path_list="$cf_library_path_list [$]$1"
+			;;
+		esac
+	done
+fi
+
+CF_SUBDIR_PATH($1,$2,lib)
+
+$1="$cf_library_path_list [$]$1"
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_LIBTOOL_VERSION version: 1 updated: 2013/04/06 18:03:09
+dnl ------------------
+AC_DEFUN([CF_LIBTOOL_VERSION],[
+if test -n "$LIBTOOL" && test "$LIBTOOL" != none
+then
+	cf_cv_libtool_version=`$LIBTOOL --version 2>&1 | sed -e '/^$/d' |sed -e '2,$d' -e 's/([[^)]]*)//g' -e 's/^[[^1-9]]*//' -e 's/[[^0-9.]].*//'`
+else
+	cf_cv_libtool_version=
+fi
+test -z "$cf_cv_libtool_version" && unset cf_cv_libtool_version
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_LIB_PREFIX version: 14 updated: 2021/01/01 13:31:04
+dnl -------------
+dnl Compute the library-prefix for the given host system
+dnl $1 = variable to set
+define([CF_LIB_PREFIX],
+[
+	case "$cf_cv_system_name" in
+	(OS/2*|os2*)
+		if test "$DFT_LWR_MODEL" = libtool; then
+			LIB_PREFIX='lib'
+		else
+			LIB_PREFIX=''
+		fi
+		;;
+	(*-msvc*)
+		LIB_PREFIX=''
+		;;
+	(*)	LIB_PREFIX='lib'
+		;;
+	esac
+ifelse($1,,,[$1=$LIB_PREFIX])
+	AC_SUBST(LIB_PREFIX)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_LIB_RULES version: 97 updated: 2021/07/17 13:10:54
+dnl ------------
+dnl Append definitions and rules for the given models to the subdirectory
+dnl Makefiles, and the recursion rule for the top-level Makefile.  If the
+dnl subdirectory is a library-source directory, modify the Libs_To_Make list in
+dnl the corresponding makefile to list the models that we'll generate.
+dnl
+dnl For shared libraries, make a list of symbolic links to construct when
+dnl generating each library.  The convention used for Linux is the simplest
+dnl one:
+dnl	lib<name>.so	->
+dnl	lib<name>.so.<major>	->
+dnl	lib<name>.so.<maj>.<minor>
+dnl
+dnl Note: Libs_To_Make is mixed case, since it is not a pure autoconf variable.
+AC_DEFUN([CF_LIB_RULES],
+[AC_REQUIRE([AC_PROG_FGREP])dnl
+AC_REQUIRE([CF_MAKE_PHONY])dnl
+
+cf_prefix=$LIB_PREFIX
+AC_REQUIRE([CF_SUBST_NCURSES_VERSION])
+
+case "$cf_cv_shlib_version" in
+(cygdll|msysdll|mingw|msvcdll)
+	TINFO_NAME=$TINFO_ARG_SUFFIX
+	TINFO_SUFFIX=.dll
+	;;
+esac
+
+if test -n "$TINFO_SUFFIX" ; then
+	case "$TINFO_SUFFIX" in
+	(tw*)
+		TINFO_NAME="${TINFO_NAME}tw${EXTRA_SUFFIX}"
+		TINFO_SUFFIX=`echo "$TINFO_SUFFIX" | sed 's/^tw'$EXTRA_SUFFIX'//'`
+		;;
+	(t*)
+		TINFO_NAME="${TINFO_NAME}t${EXTRA_SUFFIX}"
+		TINFO_SUFFIX=`echo "$TINFO_SUFFIX" | sed 's/^t'$EXTRA_SUFFIX'//'`
+		;;
+	(w*)
+		TINFO_NAME="${TINFO_NAME}w${EXTRA_SUFFIX}"
+		TINFO_SUFFIX=`echo "$TINFO_SUFFIX" | sed 's/^w'$EXTRA_SUFFIX'//'`
+		;;
+	esac
+fi
+
+for cf_dir in $SRC_SUBDIRS
+do
+	if test ! -d "$srcdir/$cf_dir" ; then
+		continue
+	elif test -f "$srcdir/$cf_dir/modules" ; then
+
+		SHARED_LIB=
+		Libs_To_Make=
+		cf_awk_program=
+		if test -n "${cf_cv_abi_version}" && test "x${cf_cv_abi_version}" != "x5"
+		then
+			cf_awk_program="$cf_awk_program\
+/deprecated in ABI${cf_cv_abi_version}/ { next; }\
+{ sub(\"NCURSES([[WT]]+)?\", \"&${cf_cv_abi_version}\"); }\
+"
+		fi
+
+		if test "x$WILDCARD_SYMS" = xno
+		then
+			cf_awk_program="$cf_awk_program\
+/[[ 	]]_\\*;/ { skip=1; next; }\
+"
+		fi
+
+		if test "x$cf_awk_program" != "x"
+		then
+			cat >>$cf_dir/Makefile <<CF_EOF
+
+# Generated by CF_LIB_RULES
+resulting.map: $UNALTERED_SYMS
+	$AWK 'BEGIN { skip = 1; last=""; } \
+$cf_awk_program \
+{ if ( last != "" && ( skip == 0 || \[$]\[$]0 !~ /}/ ) ) { print last; }\
+ skip = 0; last = \[$]\[$]0; } \
+END { print last; }' < "$UNALTERED_SYMS" >\[$]@
+
+distclean::
+	rm -f resulting.map
+CF_EOF
+		fi
+
+		for cf_item in $cf_LIST_MODELS
+		do
+			CF_LIB_SUFFIX($cf_item,cf_suffix,cf_depsuf)
+			if test "$cf_dir" = "c++"
+			then
+				CF_MAP_LIB_BASENAME(cf_libname,cxx)
+			else
+				CF_MAP_LIB_BASENAME(cf_libname,$cf_dir)
+			fi
+			test -z "$cf_libname" && cf_libname="$cf_dir"
+			if test "$cf_item" = shared ; then
+				if test -n "${LIB_SUFFIX}"
+				then
+					cf_shared_suffix=`echo "$cf_suffix" | sed 's/^'"${USE_LIB_SUFFIX}"'//'`
+				else
+					cf_shared_suffix="$cf_suffix"
+				fi
+				if test "$cf_cv_do_symlinks" = yes ; then
+					cf_version_name=
+
+					case "$cf_cv_shlib_version" in
+					(rel)
+						cf_version_name=REL_VERSION
+						;;
+					(abi)
+						cf_version_name=ABI_VERSION
+						;;
+					esac
+
+					if test -n "$cf_version_name"
+					then
+						case "$cf_cv_system_name" in
+						(darwin*)
+							# "w", etc?
+							cf_suffix="${USE_LIB_SUFFIX}"'.${'$cf_version_name'}'"$cf_shared_suffix"
+							;;
+						(*)
+							cf_suffix="$cf_suffix"'.${'$cf_version_name'}'
+							;;
+						esac
+					fi
+					if test -n "${USE_LIB_SUFFIX}"
+					then
+						cf_shared_suffix=`echo "$cf_suffix" | sed 's/^'"${USE_LIB_SUFFIX}"'//'`
+					else
+						cf_shared_suffix="$cf_suffix"
+					fi
+				fi
+				# cygwin needs import library, and has unique naming convention
+				# use autodetected ${cf_prefix} for import lib and static lib, but
+				# use 'cyg' prefix for shared lib.
+				case "$cf_cv_shlib_version" in
+				(cygdll)
+					cf_cygsuf=`echo "$cf_suffix" | sed -e 's/\.dll/\${ABI_VERSION}.dll/'`
+					cf_add_lib="../lib/cyg${cf_libname}${cf_cygsuf}"
+					;;
+				(msysdll)
+					cf_cygsuf=`echo "$cf_suffix" | sed -e 's/\.dll/\${ABI_VERSION}.dll/'`
+					cf_add_lib="../lib/msys-${cf_libname}${cf_cygsuf}"
+					;;
+				(mingw)
+					cf_cygsuf=`echo "$cf_suffix" | sed -e 's/\.dll/\${ABI_VERSION}.dll/'`
+					cf_add_lib="../lib/lib${cf_libname}${cf_cygsuf}"
+					;;
+				(msvcdll)
+					cf_cygsuf=`echo "$cf_suffix" | sed -e 's/\.dll/\${ABI_VERSION}.dll/'`
+					cf_add_lib="../lib/${cf_libname}${cf_cygsuf}"
+					;;
+				(*)
+					cf_add_lib=
+					;;
+				esac
+				if test -n "$cf_add_lib"
+				then
+					Libs_To_Make="$Libs_To_Make $cf_add_lib"
+					continue
+				fi
+			fi
+			cf_add_lib="../lib/${cf_prefix}${cf_libname}${cf_suffix}"
+			Libs_To_Make="$Libs_To_Make $cf_add_lib"
+		done
+
+		if test "$cf_dir" = ncurses ; then
+			cf_subsets="$LIB_SUBSETS"
+			cf_r_parts="$cf_subsets"
+			cf_liblist="$Libs_To_Make"
+
+			while test -n "$cf_r_parts"
+			do
+				cf_l_parts=`echo "$cf_r_parts" |sed -e 's/ .*$//'`
+				cf_r_parts=`echo "$cf_r_parts" |sed -e 's/^[[^ ]]* //'`
+				if test "$cf_l_parts" != "$cf_r_parts" ; then
+					cf_add_lib=
+					case "$cf_l_parts" in
+					(*termlib*)
+						cf_add_lib=`echo "$cf_liblist" |sed -e s%${LIB_NAME}${USE_LIB_SUFFIX}%${TINFO_LIB_SUFFIX}%g`
+						;;
+					(*ticlib*)
+						cf_add_lib=`echo "$cf_liblist" |sed -e s%${LIB_NAME}${USE_LIB_SUFFIX}%${TICS_LIB_SUFFIX}%g`
+						;;
+					(*)
+						break
+						;;
+					esac
+					if test -n "$cf_add_lib"; then
+						Libs_To_Make="$cf_add_lib $Libs_To_Make"
+					fi
+				else
+					break
+				fi
+			done
+		else
+			cf_subsets=`echo "$LIB_SUBSETS" | sed -e 's/^termlib.* //'`
+		fi
+
+		if test "$cf_dir" = c++; then
+			if test "x$with_shared_cxx" != xyes && test -n "$cf_shared_suffix"; then
+				cf_list=
+				for cf_item in $Libs_To_Make
+				do
+					case "$cf_item" in
+					(*.a)
+						;;
+					(*)
+						cf_item=`echo "$cf_item" | sed -e "s,"$cf_shared_suffix",.a,"`
+						;;
+					esac
+					for cf_test in $cf_list
+					do
+						if test "$cf_test" = "$cf_item"
+						then
+							cf_LIST_MODELS=`echo "$cf_LIST_MODELS" | sed -e 's/normal//'`
+							cf_item=
+							break
+						fi
+					done
+					test -n "$cf_item" && cf_list="$cf_list $cf_item"
+				done
+				Libs_To_Make="$cf_list"
+			fi
+		fi
+
+		sed -e "s%@Libs_To_Make@%$Libs_To_Make%" \
+		    -e "s%@SHARED_LIB@%$SHARED_LIB%" \
+			"$cf_dir/Makefile" >$cf_dir/Makefile.out
+		mv "$cf_dir/Makefile.out" "$cf_dir/Makefile"
+
+		$AWK -f "$srcdir/mk-0th.awk" \
+			libname="${cf_dir}${LIB_SUFFIX}" subsets="$LIB_SUBSETS" ticlib="$TICS_LIB_SUFFIX" termlib="$TINFO_LIB_SUFFIX" \
+			"$srcdir/$cf_dir/modules" >>$cf_dir/Makefile
+
+		for cf_subset in $cf_subsets
+		do
+			cf_subdirs=
+			for cf_item in $cf_LIST_MODELS
+			do
+
+			echo "Appending rules for ${cf_item} model (${cf_dir}: ${cf_subset})"
+			CF_UPPER(cf_ITEM,$cf_item)
+
+			CXX_MODEL=$cf_ITEM
+			if test "$CXX_MODEL" = SHARED; then
+				case "$cf_cv_shlib_version" in
+				(cygdll|msysdll|mingw|msvcdll)
+					test "x$with_shared_cxx" = xno && CF_VERBOSE(overriding CXX_MODEL to SHARED)
+					with_shared_cxx=yes
+					;;
+				(*)
+					test "x$with_shared_cxx" = xno && CXX_MODEL=NORMAL
+					;;
+				esac
+			fi
+
+			CF_LIB_SUFFIX($cf_item,cf_suffix,cf_depsuf)
+			CF_OBJ_SUBDIR($cf_item,cf_subdir)
+
+			# Test for case where we build libtinfo with a different name.
+			cf_libname=$cf_dir
+			if test "$cf_dir" = ncurses ; then
+				case "$cf_subset" in
+				(*base*)
+					cf_libname=${cf_libname}$USE_LIB_SUFFIX
+					;;
+				(*termlib*)
+					cf_libname=$TINFO_LIB_SUFFIX
+					;;
+				(ticlib*)
+					cf_libname=$TICS_LIB_SUFFIX
+					;;
+				esac
+			elif test "$cf_dir" = c++ ; then
+				CF_MAP_LIB_BASENAME(cf_libname,cxx)
+				cf_libname=${cf_libname}$USE_LIB_SUFFIX
+			else
+				CF_MAP_LIB_BASENAME(cf_libname,$cf_dir)
+				cf_libname=${cf_libname}$USE_LIB_SUFFIX
+			fi
+			if test -n "${USE_ARG_SUFFIX}" ; then
+				# undo $USE_LIB_SUFFIX add-on in CF_LIB_SUFFIX
+				cf_suffix=`echo "$cf_suffix" |sed -e "s%^${USE_LIB_SUFFIX}%%"`
+			fi
+
+			# These dependencies really are for development, not
+			# builds, but they are useful in porting, too.
+			cf_depend="../include/ncurses_cfg.h"
+			if test "$srcdir" = "."; then
+				cf_reldir="."
+			else
+				cf_reldir="\${srcdir}"
+			fi
+
+			if test -f "$srcdir/$cf_dir/$cf_dir.priv.h" ; then
+				cf_depend="$cf_depend $cf_reldir/$cf_dir.priv.h"
+			elif test -f "$srcdir/$cf_dir/curses.priv.h" ; then
+				cf_depend="$cf_depend $cf_reldir/curses.priv.h"
+			fi
+
+ 			cf_dir_suffix=
+ 			old_cf_suffix="$cf_suffix"
+ 			if test "$cf_cv_shlib_version_infix" = yes ; then
+			if test -n "$USE_LIB_SUFFIX" ; then
+				case "$USE_LIB_SUFFIX" in
+				(tw*)
+					cf_libname=`echo "$cf_libname" | sed 's/tw'$EXTRA_SUFFIX'$//'`
+					cf_suffix=`echo "$cf_suffix" | sed 's/^tw'$EXTRA_SUFFIX'//'`
+					cf_dir_suffix=tw$EXTRA_SUFFIX
+					;;
+				(t*)
+					cf_libname=`echo "$cf_libname" | sed 's/t'$EXTRA_SUFFIX'$//'`
+					cf_suffix=`echo "$cf_suffix" | sed 's/^t'$EXTRA_SUFFIX'//'`
+					cf_dir_suffix=t$EXTRA_SUFFIX
+					;;
+				(w*)
+					cf_libname=`echo "$cf_libname" | sed 's/w'$EXTRA_SUFFIX'$//'`
+					cf_suffix=`echo "$cf_suffix" | sed 's/^w'$EXTRA_SUFFIX'//'`
+					cf_dir_suffix=w$EXTRA_SUFFIX
+					;;
+				(*)
+					cf_libname=`echo "$cf_libname" | sed 's/'$EXTRA_SUFFIX'$//'`
+					cf_suffix=`echo "$cf_suffix" | sed 's/^'$EXTRA_SUFFIX'//'`
+					cf_dir_suffix=$EXTRA_SUFFIX
+					;;
+				esac
+			fi
+ 			fi
+
+			$AWK -f "$srcdir/mk-1st.awk" \
+				name=${cf_libname}${cf_dir_suffix} \
+				traces=$LIB_TRACING \
+				MODEL=$cf_ITEM \
+				CXX_MODEL=$CXX_MODEL \
+				LIB_SUFFIX=$LIB_SUFFIX \
+				USE_LIB_SUFFIX=$USE_LIB_SUFFIX \
+				make_phony="${cf_cv_make_PHONY:-no}" \
+				model=$cf_subdir \
+				prefix=$cf_prefix \
+				suffix=$cf_suffix \
+				subset=$cf_subset \
+				driver=$cf_cv_term_driver \
+				SymLink="$LN_S" \
+				TermlibRoot=$TINFO_NAME \
+				TermlibSuffix=$TINFO_SUFFIX \
+				ShlibVer=$cf_cv_shlib_version \
+				ShlibVerInfix=$cf_cv_shlib_version_infix \
+				ReLink=${cf_cv_do_relink:-no} \
+				ReRanlib=${cf_cv_do_reranlib:-yes} \
+				DoLinks=$cf_cv_do_symlinks \
+				rmSoLocs=$cf_cv_rm_so_locs \
+				ldconfig="$LDCONFIG" \
+				overwrite=$WITH_OVERWRITE \
+				depend="$cf_depend" \
+				host="$host" \
+				libtool_version="$LIBTOOL_VERSION" \
+				"$srcdir/$cf_dir/modules" >>$cf_dir/Makefile
+
+			cf_suffix="$old_cf_suffix"
+
+			for cf_subdir2 in $cf_subdirs lib
+			do
+				test "$cf_subdir" = "$cf_subdir2" && break
+			done
+			test "${cf_subset}.${cf_subdir2}" != "${cf_subset}.${cf_subdir}" && \
+			$AWK -f "$srcdir/mk-2nd.awk" \
+				name=$cf_dir \
+				traces=$LIB_TRACING \
+				MODEL=$cf_ITEM \
+				model=$cf_subdir \
+				subset=$cf_subset \
+				srcdir=$srcdir \
+				echo=$WITH_ECHO \
+				crenames=$cf_cv_prog_CC_c_o \
+				cxxrenames=$cf_cv_prog_CXX_c_o \
+				"$srcdir/$cf_dir/modules" >>$cf_dir/Makefile
+			cf_subdirs="$cf_subdirs $cf_subdir"
+			done
+		done
+	fi
+
+	echo '	( cd '$cf_dir' && ${MAKE} ${TOP_MFLAGS} [$]@ )' >>Makefile
+done
+
+echo >> Makefile
+echo '# generated by CF_LIB_RULES' >> Makefile
+
+if test "x$cf_cv_make_PHONY" = xyes ; then
+	cat >> Makefile <<-CF_EOF
+
+	.PHONY :	libs
+	.PHONY :	lintlib
+	.PHONY :	install.includes
+	.PHONY :	uninstall.includes
+	.PHONY :	install.libs
+	.PHONY :	uninstall.libs
+CF_EOF
+fi
+
+for cf_dir in $SRC_SUBDIRS
+do
+	if test ! -d "$srcdir/$cf_dir" ; then
+		continue
+	fi
+
+	if test -f "$cf_dir/Makefile" ; then
+		case "$cf_dir" in
+		(Ada95)
+			echo 'libs \' >> Makefile
+			echo 'install.libs \' >> Makefile
+			echo 'uninstall.libs ::' >> Makefile
+			echo '	( cd '$cf_dir' && ${MAKE} ${TOP_MFLAGS} [$]@ )' >> Makefile
+			;;
+		esac
+	fi
+
+	if test -f "$srcdir/$cf_dir/modules" ; then
+
+		if test "x$cf_cv_make_PHONY" = xyes ; then
+			cat >> Makefile <<-CF_EOF
+
+			.PHONY :	install.$cf_dir
+			.PHONY :	uninstall.$cf_dir
+CF_EOF
+		fi
+
+		echo >> Makefile
+		if test -f "$srcdir/$cf_dir/headers" ; then
+cat >> Makefile <<CF_EOF
+install.includes \\
+uninstall.includes \\
+CF_EOF
+		fi
+
+cat >> Makefile <<CF_EOF
+lint \\
+libs \\
+lintlib \\
+install.libs \\
+uninstall.libs \\
+install.$cf_dir \\
+uninstall.$cf_dir ::
+	( cd "$cf_dir" && \${MAKE} \${TOP_MFLAGS} \[$]@ )
+CF_EOF
+	elif test -f "$srcdir/$cf_dir/headers" ; then
+cat >> Makefile <<CF_EOF
+
+libs \\
+install.libs \\
+uninstall.libs \\
+install.includes \\
+uninstall.includes ::
+	( cd "$cf_dir" && \${MAKE} \${TOP_MFLAGS} \[$]@ )
+CF_EOF
+fi
+done
+
+if test "x$cf_cv_make_PHONY" = xyes ; then
+	cat >> Makefile <<-CF_EOF
+
+	.PHONY :	install.data
+	.PHONY :	uninstall.data
+CF_EOF
+fi
+
+if test "x$cf_with_db_install" = xyes; then
+cat >> Makefile <<CF_EOF
+
+install.libs uninstall.libs \\
+install.data uninstall.data ::
+$MAKE_TERMINFO	( cd misc && \${MAKE} \${TOP_MFLAGS} \[$]@ )
+CF_EOF
+else
+cat >> Makefile <<CF_EOF
+
+install.libs uninstall.libs ::
+	( cd misc && \${MAKE} \${TOP_MFLAGS} \[$]@ )
+CF_EOF
+fi
+
+if test "x$cf_with_manpages" = xyes; then
+
+if test "x$cf_cv_make_PHONY" = xyes ; then
+	cat >> Makefile <<-CF_EOF
+
+	.PHONY :	install.man
+	.PHONY :	uninstall.man
+CF_EOF
+fi
+
+cat >> Makefile <<CF_EOF
+
+install.man \\
+uninstall.man ::
+	( cd man && \${MAKE} \${TOP_MFLAGS} \[$]@ )
+CF_EOF
+fi
+
+cat >> Makefile <<CF_EOF
+
+distclean ::
+	rm -f config.cache config.log config.status Makefile include/ncurses_cfg.h
+	rm -f headers.sh headers.sed mk_shared_lib.sh
+	rm -f edit_man.* man_alias.*
+	rm -rf \${DIRS_TO_MAKE}
+CF_EOF
+
+# Special case: tack's manpage lives in its own directory.
+if test "x$cf_with_manpages" = xyes; then
+if test "x$cf_with_tack" = "xyes"; then
+cat >> Makefile <<CF_EOF
+
+install.man \\
+uninstall.man ::
+	( cd tack && \${MAKE} \${TOP_MFLAGS} \[$]@ )
+CF_EOF
+fi
+fi
+
+dnl If we're installing into a subdirectory of /usr/include, etc., we should
+dnl prepend the subdirectory's name to the "#include" paths.  It won't hurt
+dnl anything, and will make it more standardized.  It's awkward to decide this
+dnl at configuration because of quoting, so we'll simply make all headers
+dnl installed via a script that can do the right thing.
+
+rm -f headers.sed headers.sh
+
+dnl ( generating this script makes the makefiles a little tidier :-)
+echo creating headers.sh
+cat >headers.sh <<CF_EOF
+#! $SHELL
+# This shell script is generated by the 'configure' script.  It is invoked in a
+# subdirectory of the build tree.  It generates a sed-script in the parent
+# directory that is used to adjust includes for header files that reside in a
+# subdirectory of /usr/include, etc.
+PRG=""
+while test \[$]# != 3
+do
+PRG="\$PRG \[$]1"; shift
+done
+DST=\[$]1
+REF=\[$]2
+SRC=\[$]3
+TMPSRC=\${TMPDIR:-/tmp}/\`basename \$SRC\`\$\$
+TMPSED=\${TMPDIR:-/tmp}/headers.sed\$\$
+echo installing \$SRC in \$DST
+CF_EOF
+
+if test "$WITH_CURSES_H" = yes; then
+	cat >>headers.sh <<CF_EOF
+case \$DST in
+(/*/include/*)
+	END=\`basename \$DST\`
+	for i in \`cat \$REF/../*/headers |${FGREP-fgrep} -v "#"\`
+	do
+		NAME=\`basename \$i\`
+		echo "s/<\$NAME>/<\$END\/\$NAME>/" >> \$TMPSED
+	done
+	;;
+(*)
+	echo "" >> \$TMPSED
+	;;
+esac
+CF_EOF
+
+else
+	cat >>headers.sh <<CF_EOF
+case \$DST in
+(/*/include/*)
+	END=\`basename \$DST\`
+	for i in \`cat \$REF/../*/headers |${FGREP-fgrep} -v "#"\`
+	do
+		NAME=\`basename \$i\`
+		if test "\$NAME" = "curses.h"
+		then
+			echo "s/<curses.h>/<ncurses.h>/" >> \$TMPSED
+			NAME=ncurses.h
+		fi
+		echo "s/<\$NAME>/<\$END\/\$NAME>/" >> \$TMPSED
+	done
+	;;
+(*)
+	echo "s/<curses.h>/<ncurses.h>/" >> \$TMPSED
+	;;
+esac
+CF_EOF
+fi
+cat >>headers.sh <<CF_EOF
+rm -f \$TMPSRC
+sed -f \$TMPSED \$SRC > \$TMPSRC
+NAME=\`basename \$SRC\`
+CF_EOF
+if test "$WITH_CURSES_H" != yes; then
+	cat >>headers.sh <<CF_EOF
+test "\$NAME" = "curses.h" && NAME=ncurses.h
+CF_EOF
+fi
+cat >>headers.sh <<CF_EOF
+# Just in case someone gzip'd manpages, remove the conflicting copy.
+test -f \$DST/\$NAME.gz && rm -f \$DST/\$NAME.gz
+
+eval \$PRG \$TMPSRC \$DST/\$NAME
+rm -f \$TMPSRC \$TMPSED
+CF_EOF
+
+chmod 0755 headers.sh
+
+for cf_dir in $SRC_SUBDIRS
+do
+	if test ! -d "$srcdir/$cf_dir" ; then
+		continue
+	fi
+
+	if test -f "$srcdir/$cf_dir/headers" ; then
+		$AWK -f "$srcdir/mk-hdr.awk" \
+			subset="$LIB_SUBSETS" \
+			compat="$WITH_CURSES_H" \
+			"$srcdir/$cf_dir/headers" >>$cf_dir/Makefile
+	fi
+
+	if test -f "$srcdir/$cf_dir/modules" ; then
+		if test "$cf_dir" != "c++" ; then
+			if test "x$cf_cv_make_PHONY" = xyes ; then
+				cat >> $cf_dir/Makefile <<-CF_EOF
+
+				.PHONY :	depend
+CF_EOF
+			fi
+
+			cat >>$cf_dir/Makefile <<"CF_EOF"
+depend : ${AUTO_SRC}
+	makedepend -- ${CPPFLAGS} -- ${C_SRC}
+
+# DO NOT DELETE THIS LINE -- make depend depends on it.
+CF_EOF
+		fi
+	fi
+done
+AC_SUBST(Libs_To_Make)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_LIB_SONAME version: 9 updated: 2021/01/04 18:48:01
+dnl -------------
+dnl Find the and soname for the given shared library.  Set the cache variable
+dnl cf_cv_$3_soname to this, unless it is not found.  Then set the cache
+dnl variable to "unknown".
+dnl
+dnl $1 = headers
+dnl $2 = code
+dnl $3 = library name
+AC_DEFUN([CF_LIB_SONAME],
+[AC_REQUIRE([AC_PROG_FGREP])dnl
+
+AC_CACHE_CHECK(for soname of $3 library,cf_cv_$3_soname,[
+
+cf_cv_$3_soname=unknown
+if test "$cross_compiling" != yes ; then
+cat >conftest.$ac_ext <<CF_EOF
+$1
+int main(void)
+{
+$2
+	${cf_cv_main_return:-return}(0);
+}
+CF_EOF
+cf_save_LIBS="$LIBS"
+	CF_ADD_LIB($3)
+	if AC_TRY_EVAL(ac_compile) ; then
+		if AC_TRY_EVAL(ac_link) ; then
+			cf_cv_$3_soname="`ldd \"conftest$ac_exeext\" 2>/dev/null | sed -e 's,^.*/,,' -e 's, .*$,,' | ${FGREP-fgrep} lib$3.`"
+			test -z "$cf_cv_$3_soname" && cf_cv_$3_soname=unknown
+		fi
+	fi
+rm -rf ./conftest*
+LIBS="$cf_save_LIBS"
+fi
+])
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_LIB_SUFFIX version: 28 updated: 2021/01/01 16:53:59
+dnl -------------
+dnl Compute the library file-suffix from the given model name
+dnl $1 = model name
+dnl $2 = variable to set (the nominal library suffix)
+dnl $3 = dependency variable to set (actual filename)
+dnl The variable $LIB_SUFFIX, if set, prepends the variable to set.
+AC_DEFUN([CF_LIB_SUFFIX],
+[
+	case X$1 in
+	(Xlibtool)
+		$2='.la'
+		$3=[$]$2
+		;;
+	(Xdebug)
+		case "$cf_cv_system_name" in
+		(*-msvc*)
+			$2='_g.lib'
+			;;
+		(*)
+			$2='_g.a'
+			;;
+		esac
+		$3=[$]$2
+		;;
+	(Xprofile)
+		case "$cf_cv_system_name" in
+		(*-msvc*)
+			$2='_p.lib'
+			;;
+		(*)
+			$2='_p.a'
+			;;
+		esac
+		$3=[$]$2
+		;;
+	(Xshared)
+		case "$cf_cv_system_name" in
+		(aix[[5-7]]*)
+			$2='.so'
+			$3=[$]$2
+			;;
+		(*-msvc*)
+			$2='.dll'
+			$3='.dll.lib'
+			;;
+		(cygwin*|msys*|mingw*)
+			$2='.dll'
+			$3='.dll.a'
+			;;
+		(darwin*)
+			$2='.dylib'
+			$3=[$]$2
+			;;
+		(hpux*)
+			case "$target" in
+			(ia64*)
+				$2='.so'
+				$3=[$]$2
+				;;
+			(*)
+				$2='.sl'
+				$3=[$]$2
+				;;
+			esac
+			;;
+		(*)
+			$2='.so'
+			$3=[$]$2
+			;;
+		esac
+		;;
+	(*)
+		case "$target" in
+		(*-msvc*)
+			$2='.lib'
+			;;
+		(*)
+			$2='.a'
+			;;
+		esac
+		$3=[$]$2
+		;;
+	esac
+	if test -n "${LIB_SUFFIX}${EXTRA_SUFFIX}"
+	then
+		$2="${LIB_SUFFIX}${EXTRA_SUFFIX}[$]{$2}"
+		$3="${LIB_SUFFIX}${EXTRA_SUFFIX}[$]{$3}"
+	fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_LIB_TYPE version: 5 updated: 2015/04/17 21:13:04
+dnl -----------
+dnl Compute the string to append to -library from the given model name
+dnl $1 = model name
+dnl $2 = variable to set
+dnl The variable $LIB_SUFFIX, if set, prepends the variable to set.
+AC_DEFUN([CF_LIB_TYPE],
+[
+	case $1 in
+	(libtool) $2=''   ;;
+	(normal)  $2=''   ;;
+	(debug)   $2='_g' ;;
+	(profile) $2='_p' ;;
+	(shared)  $2=''   ;;
+	esac
+	test -n "$LIB_SUFFIX" && $2="${LIB_SUFFIX}[$]{$2}"
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_LINK_DATAONLY version: 13 updated: 2020/02/08 15:59:30
+dnl ----------------
+dnl Some systems have a non-ANSI linker that doesn't pull in modules that have
+dnl only data (i.e., no functions), for example NeXT.  On those systems we'll
+dnl have to provide wrappers for global tables to ensure they're linked
+dnl properly.
+AC_DEFUN([CF_LINK_DATAONLY],
+[
+AC_MSG_CHECKING([if data-only library module links])
+AC_CACHE_VAL(cf_cv_link_dataonly,[
+	rm -f conftest.a
+	cat >conftest.$ac_ext <<EOF
+#line __oline__ "configure"
+int	testdata[[3]] = { 123, 456, 789 };
+EOF
+	if AC_TRY_EVAL(ac_compile) ; then
+		mv conftest.o data.o && \
+		( $AR $ARFLAGS conftest.a data.o ) 2>&AC_FD_CC 1>/dev/null
+	fi
+	rm -f conftest.$ac_ext data.o
+	cat >conftest.$ac_ext <<EOF
+#line __oline__ "configure"
+int	testfunc(void)
+{
+#if defined(NeXT)
+	${cf_cv_main_return:-return}(1);	/* I'm told this linker is broken */
+#else
+	extern int testdata[[3]];
+	return testdata[[0]] == 123
+	   &&  testdata[[1]] == 456
+	   &&  testdata[[2]] == 789;
+#endif
+}
+EOF
+	if AC_TRY_EVAL(ac_compile); then
+		mv conftest.o func.o && \
+		( $AR $ARFLAGS conftest.a func.o ) 2>&AC_FD_CC 1>/dev/null
+	fi
+	rm -f conftest.$ac_ext func.o
+	( eval $RANLIB conftest.a ) 2>&AC_FD_CC >/dev/null
+	cf_saveLIBS="$LIBS"
+	LIBS="conftest.a $LIBS"
+	AC_TRY_RUN([
+	int main(void)
+	{
+		extern int testfunc();
+		${cf_cv_main_return:-return} (!testfunc());
+	}
+	],
+	[cf_cv_link_dataonly=yes],
+	[cf_cv_link_dataonly=no],
+	[cf_cv_link_dataonly=unknown])
+	LIBS="$cf_saveLIBS"
+	])
+AC_MSG_RESULT($cf_cv_link_dataonly)
+
+if test "$cf_cv_link_dataonly" = no ; then
+	AC_DEFINE(BROKEN_LINKER,1,[if data-only library module does not link])
+	BROKEN_LINKER=1
+fi
+AC_SUBST(BROKEN_LINKER)
+
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_LINK_FUNCS version: 11 updated: 2021/04/18 14:08:47
+dnl -------------
+dnl Most Unix systems have both link and symlink, a few don't have symlink.
+dnl A few non-Unix systems implement symlink, but not link.
+dnl A few non-systems implement neither (or have nonfunctional versions).
+dnl
+dnl This allows for a 2-second difference in modification times to allow for
+dnl some marginal NFS implementations.
+AC_DEFUN([CF_LINK_FUNCS],
+[
+AC_CHECK_HEADERS( \
+unistd.h \
+)
+AC_CHECK_FUNCS( \
+	remove \
+	unlink )
+
+if test "$cross_compiling" = yes ; then
+	AC_CHECK_FUNCS( \
+		link \
+		symlink )
+else
+	AC_CACHE_CHECK(if link/symlink functions work,cf_cv_link_funcs,[
+		cf_cv_link_funcs=
+		for cf_func in link symlink ; do
+			AC_TRY_RUN([
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+int main(void)
+{
+	int fail = 0;
+	char *src = "conftest.tmp";
+	char *dst = "conftest.chk";
+	struct stat src_sb, dst_sb;
+	FILE *fp = fopen(src, "w");
+	if (fp == 0) { fail = 3; } else {
+		fclose(fp); stat(src, &src_sb);
+		if ($cf_func(src, dst) < 0) {
+			fail = 1;
+		} else if (stat(dst, &dst_sb) < 0) {
+			fail = 2;
+		} else {
+			long diff = (dst_sb.st_mtime - src_sb.st_mtime);
+			if (diff < 0) diff = -diff;
+			if (diff > 2) fail = 3;
+		}
+	}
+#ifdef HAVE_UNLINK
+	unlink(dst); unlink(src);
+#else
+	remove(dst); remove(src);
+#endif
+	${cf_cv_main_return:-return} (fail);
+}
+			],[
+			cf_cv_link_funcs="$cf_cv_link_funcs $cf_func"
+			eval 'ac_cv_func_'$cf_func'=yes'],[
+			eval 'ac_cv_func_'$cf_func'=no'],[
+			eval 'ac_cv_func_'$cf_func'=error'])
+		done
+		test -z "$cf_cv_link_funcs" && cf_cv_link_funcs=no
+	])
+	test "$ac_cv_func_link"    = yes && AC_DEFINE(HAVE_LINK,1,[Define to 1 if we have link() function])
+	test "$ac_cv_func_symlink" = yes && AC_DEFINE(HAVE_SYMLINK,1,[Define to 1 if we have symlink() function])
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_MAKEFLAGS version: 21 updated: 2021/09/04 06:47:34
+dnl ------------
+dnl Some 'make' programs support ${MAKEFLAGS}, some ${MFLAGS}, to pass 'make'
+dnl options to lower-levels.  It is very useful for "make -n" -- if we have it.
+dnl (GNU 'make' does both, something POSIX 'make', which happens to make the
+dnl ${MAKEFLAGS} variable incompatible because it adds the assignments :-)
+AC_DEFUN([CF_MAKEFLAGS],
+[AC_REQUIRE([AC_PROG_FGREP])dnl
+
+AC_CACHE_CHECK(for makeflags variable, cf_cv_makeflags,[
+	cf_cv_makeflags=''
+	for cf_option in '-${MAKEFLAGS}' '${MFLAGS}'
+	do
+		cat >cf_makeflags.tmp <<CF_EOF
+SHELL = $SHELL
+all :
+	@ echo '.$cf_option'
+CF_EOF
+		cf_result=`${MAKE:-make} -k -f cf_makeflags.tmp 2>/dev/null | ${FGREP-fgrep} -v "ing directory" | sed -e 's,[[ 	]]*$,,'`
+		case "$cf_result" in
+		(.*k|.*kw)
+			cf_result="`${MAKE:-make} -k -f cf_makeflags.tmp CC=cc 2>/dev/null`"
+			case "$cf_result" in
+			(.*CC=*)	cf_cv_makeflags=
+				;;
+			(*)	cf_cv_makeflags=$cf_option
+				;;
+			esac
+			break
+			;;
+		(.-)
+			;;
+		(*)
+			CF_MSG_LOG(given option \"$cf_option\", no match \"$cf_result\")
+			;;
+		esac
+	done
+	rm -f cf_makeflags.tmp
+])
+
+AC_SUBST(cf_cv_makeflags)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_MAKE_PHONY version: 3 updated: 2021/01/08 16:08:21
+dnl -------------
+dnl Check if the make-program handles a ".PHONY" target, e.g,. a target which
+dnl acts as a placeholder.
+dnl
+dnl The ".PHONY" feature was proposed in 2011 here
+dnl     https://www.austingroupbugs.net/view.php?id=523
+dnl and is scheduled for release in P1003.1 Issue 8 (late 2022).
+dnl
+dnl This is not supported by SVr4 make (or SunOS 4, 4.3SD, etc), but works with
+dnl a few others (i.e., GNU make and the non-POSIX "BSD" make):
+dnl
+dnl + This is a GNU make feature (since April 1988, but in turn from binutils,
+dnl   date unspecified).
+dnl
+dnl + It was adopted in NetBSD make in June 1995.
+dnl
+dnl + The other BSD make programs are derived from the NetBSD make (and for
+dnl   that reason are not actually different "implementations").
+dnl
+dnl + Some features of NetBSD make were actually adapted from pmake, which
+dnl   began as a modified GNU make starting in 1993.
+dnl
+dnl + Version 3.8 of the dmake program in January 1992 also implemented this
+dnl   GNU make extension, but is less well known than the BSD make.
+AC_DEFUN([CF_MAKE_PHONY],[
+AC_CACHE_CHECK(for \".PHONY\" make-support, cf_cv_make_PHONY,[
+	rm -rf conftest*
+	(
+		mkdir conftest || exit 1
+		cd conftest
+		cat >makefile <<'CF_EOF'
+.PHONY: always
+DATA=0
+always:	always.out
+	@echo "** making [$]@ [$](DATA)"
+once: once.out
+	@echo "** making [$]@ [$](DATA)"
+always.out:
+	@echo "** making [$]@ [$](DATA)"
+	echo [$](DATA) > [$]@
+once.out:
+	@echo "** making [$]@ [$](DATA)"
+	echo [$](DATA) > [$]@
+CF_EOF
+		for cf_data in 1 2 3
+		do
+			${MAKE:-make} always DATA=$cf_data
+			${MAKE:-make} once   DATA=$cf_data
+			${MAKE:-make} -t always once
+			if test -f always ; then
+				echo "no (case 1)" > ../conftest.tmp
+			elif test ! -f always.out ; then
+				echo "no (case 2)" > ../conftest.tmp
+			elif test ! -f once.out ; then
+				echo "no (case 3)" > ../conftest.tmp
+			elif ! cmp -s always.out once.out ; then
+				echo "no (case 4)" > ../conftest.tmp
+				diff always.out once.out
+			else
+				cf_check="`cat always.out`"
+				if test "x$cf_check" != "x$cf_data" ; then
+					echo "no (case 5)" > ../conftest.tmp
+				else
+					echo yes > ../conftest.tmp
+					rm -f ./*.out
+					continue
+				fi
+			fi
+			break
+		done
+	) >&AC_FD_CC 2>&1
+	cf_cv_make_PHONY="`cat conftest.tmp`"
+	rm -rf conftest*
+])
+MAKE_NO_PHONY="#"
+MAKE_PHONY="#"
+test "x$cf_cv_make_PHONY" = xyes && MAKE_PHONY=
+test "x$cf_cv_make_PHONY" != xyes && MAKE_NO_PHONY=
+AC_SUBST(MAKE_NO_PHONY)
+AC_SUBST(MAKE_PHONY)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_MAKE_TAGS version: 6 updated: 2010/10/23 15:52:32
+dnl ------------
+dnl Generate tags/TAGS targets for makefiles.  Do not generate TAGS if we have
+dnl a monocase filesystem.
+AC_DEFUN([CF_MAKE_TAGS],[
+AC_REQUIRE([CF_MIXEDCASE_FILENAMES])
+
+AC_CHECK_PROGS(CTAGS, exctags ctags)
+AC_CHECK_PROGS(ETAGS, exetags etags)
+
+AC_CHECK_PROG(MAKE_LOWER_TAGS, ${CTAGS:-ctags}, yes, no)
+
+if test "$cf_cv_mixedcase" = yes ; then
+	AC_CHECK_PROG(MAKE_UPPER_TAGS, ${ETAGS:-etags}, yes, no)
+else
+	MAKE_UPPER_TAGS=no
+fi
+
+if test "$MAKE_UPPER_TAGS" = yes ; then
+	MAKE_UPPER_TAGS=
+else
+	MAKE_UPPER_TAGS="#"
+fi
+
+if test "$MAKE_LOWER_TAGS" = yes ; then
+	MAKE_LOWER_TAGS=
+else
+	MAKE_LOWER_TAGS="#"
+fi
+
+AC_SUBST(CTAGS)
+AC_SUBST(ETAGS)
+
+AC_SUBST(MAKE_UPPER_TAGS)
+AC_SUBST(MAKE_LOWER_TAGS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_MANPAGE_FORMAT version: 16 updated: 2022/11/05 16:12:11
+dnl -----------------
+dnl Option to allow user to override automatic configuration of manpage format.
+dnl There are several special cases:
+dnl
+dnl	compress - man checks for, can display compressed files
+dnl	bzip2 - man checks for, can display bzip2'd files
+dnl	gzip - man checks for, can display gzip'd files
+dnl	xz - man checks for, can display xz'd files
+dnl
+dnl	BSDI - files in the cat-directories are suffixed ".0"
+dnl	formatted - installer should format (put files in cat-directory)
+dnl	catonly - installer should only format, e.g., for a turnkey system.
+dnl
+dnl There are other configurations which this macro does not test, e.g., HPUX's
+dnl compressed manpages (but uncompressed manpages are fine, and HPUX's naming
+dnl convention would not match our use).
+AC_DEFUN([CF_MANPAGE_FORMAT],
+[
+AC_REQUIRE([CF_PATHSEP])
+AC_MSG_CHECKING(format of man-pages)
+
+AC_ARG_WITH(manpage-format,
+	[  --with-manpage-format   specify manpage-format: gzip/compress/bzip2/xz,
+                          BSDI/normal and optionally formatted/catonly,
+                          e.g., gzip,formatted],
+	[MANPAGE_FORMAT=$withval],
+	[MANPAGE_FORMAT=unknown])
+
+test -z "$MANPAGE_FORMAT" && MANPAGE_FORMAT=unknown
+MANPAGE_FORMAT=`echo "$MANPAGE_FORMAT" | sed -e 's/,/ /g'`
+
+cf_unknown=
+
+case "$MANPAGE_FORMAT" in
+(unknown)
+	if test -z "$MANPATH" ; then
+		MANPATH="/usr/man:/usr/share/man"
+	fi
+
+	# look for the 'date' man-page (it is most likely to be installed!)
+	MANPAGE_FORMAT=
+	cf_preform="no"
+	cf_catonly="yes"
+	cf_example="date"
+
+	IFS="${IFS:- 	}"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}"
+	for cf_dir in $MANPATH; do
+		test -z "$cf_dir" && cf_dir=/usr/man
+		for cf_name in $cf_dir/man*/$cf_example.[[01]]* $cf_dir/cat*/$cf_example.[[01]]* $cf_dir/man*/$cf_example $cf_dir/cat*/$cf_example
+		do
+			cf_test=`echo "$cf_name" | sed -e 's/*//'`
+			if test "x$cf_test" = "x$cf_name" ; then
+
+				case "$cf_name" in
+				(*.bz2) MANPAGE_FORMAT="$MANPAGE_FORMAT bzip2";;
+				(*.xz)  MANPAGE_FORMAT="$MANPAGE_FORMAT xz";;
+				(*.gz)  MANPAGE_FORMAT="$MANPAGE_FORMAT gzip";;
+				(*.Z)   MANPAGE_FORMAT="$MANPAGE_FORMAT compress";;
+				(*.0)   MANPAGE_FORMAT="$MANPAGE_FORMAT BSDI";;
+				(*)     MANPAGE_FORMAT="$MANPAGE_FORMAT normal";;
+				esac
+
+				case "$cf_name" in
+				($cf_dir/man*)
+					cf_catonly=no
+					;;
+				($cf_dir/cat*)
+					cf_preform=yes
+					;;
+				esac
+				break
+			fi
+
+			# if we found a match in either man* or cat*, stop looking
+			if test -n "$MANPAGE_FORMAT" ; then
+				cf_found=no
+				test "$cf_preform" = yes && MANPAGE_FORMAT="$MANPAGE_FORMAT formatted"
+				test "$cf_catonly" = yes && MANPAGE_FORMAT="$MANPAGE_FORMAT catonly"
+				case "$cf_name" in
+				($cf_dir/cat*)
+					cf_found=yes
+					;;
+				esac
+				test "$cf_found" = yes && break
+			fi
+		done
+		# only check the first directory in $MANPATH where we find manpages
+		if test -n "$MANPAGE_FORMAT" ; then
+			break
+		fi
+	done
+	# if we did not find the example, just assume it is normal
+	test -z "$MANPAGE_FORMAT" && MANPAGE_FORMAT=normal
+	IFS="$ac_save_ifs"
+	;;
+(*)
+	for cf_option in $MANPAGE_FORMAT; do
+	case "$cf_option" in
+	(xz|bzip2|gzip|compress|BSDI|normal|formatted|catonly)
+		;;
+	(*)
+		cf_unknown="$cf_unknown $cf_option"
+		;;
+	esac
+	done
+	;;
+esac
+
+AC_MSG_RESULT($MANPAGE_FORMAT)
+if test -n "$cf_unknown" ; then
+	AC_MSG_WARN(Unexpected manpage-format $cf_unknown)
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_MANPAGE_RENAMES version: 17 updated: 2022/10/23 07:46:29
+dnl ------------------
+dnl The Debian people have their own naming convention for manpages.  This
+dnl option lets us override the name of the file containing renaming, or
+dnl disable it altogether.
+AC_DEFUN([CF_MANPAGE_RENAMES],
+[
+AC_MSG_CHECKING(for manpage renaming)
+
+AC_ARG_WITH(manpage-renames,
+	[  --with-manpage-renames  specify manpage-renaming],
+	[MANPAGE_RENAMES=$withval],
+	[MANPAGE_RENAMES=yes])
+
+case ".$MANPAGE_RENAMES" in
+(.no)
+	;;
+(.|.yes)
+	# Debian 'man' program?
+	if test -f /etc/debian_version ; then
+		MANPAGE_RENAMES=man/man_db.renames
+	else
+		MANPAGE_RENAMES=no
+	fi
+	;;
+esac
+
+if test "$MANPAGE_RENAMES" = man/man_db.renames ; then
+	MANPAGE_RENAMES=`pwd`/$MANPAGE_RENAMES
+elif test "$MANPAGE_RENAMES" = no ; then
+	:
+elif test ! -f "$MANPAGE_RENAMES" ; then
+	AC_MSG_ERROR(not a filename: $MANPAGE_RENAMES)
+fi
+
+AC_MSG_RESULT($MANPAGE_RENAMES)
+AC_SUBST(MANPAGE_RENAMES)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_MANPAGE_SYMLINKS version: 6 updated: 2015/04/17 21:13:04
+dnl -------------------
+dnl Some people expect each tool to make all aliases for manpages in the
+dnl man-directory.  This accommodates the older, less-capable implementations
+dnl of 'man', and is optional.
+AC_DEFUN([CF_MANPAGE_SYMLINKS],
+[
+AC_MSG_CHECKING(if manpage aliases will be installed)
+
+AC_ARG_WITH(manpage-aliases,
+	[  --with-manpage-aliases  specify manpage-aliases using .so],
+	[MANPAGE_ALIASES=$withval],
+	[MANPAGE_ALIASES=yes])
+
+AC_MSG_RESULT($MANPAGE_ALIASES)
+
+case "x$LN_S" in
+(xln*)
+	cf_use_symlinks=yes
+	;;
+(*)
+	cf_use_symlinks=no
+	;;
+esac
+
+MANPAGE_SYMLINKS=no
+if test "$MANPAGE_ALIASES" = yes ; then
+AC_MSG_CHECKING(if manpage symlinks should be used)
+
+AC_ARG_WITH(manpage-symlinks,
+	[  --with-manpage-symlinks specify manpage-aliases using symlinks],
+	[MANPAGE_SYMLINKS=$withval],
+	[MANPAGE_SYMLINKS=$cf_use_symlinks])
+
+if test "$$cf_use_symlinks" = no; then
+if test "$MANPAGE_SYMLINKS" = yes ; then
+	AC_MSG_WARN(cannot make symlinks, will use .so files)
+	MANPAGE_SYMLINKS=no
+fi
+fi
+
+AC_MSG_RESULT($MANPAGE_SYMLINKS)
+fi
+
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_MANPAGE_TBL version: 3 updated: 2002/01/19 22:51:32
+dnl --------------
+dnl This option causes manpages to be run through tbl(1) to generate tables
+dnl correctly.
+AC_DEFUN([CF_MANPAGE_TBL],
+[
+AC_MSG_CHECKING(for manpage tbl)
+
+AC_ARG_WITH(manpage-tbl,
+	[  --with-manpage-tbl      specify manpage processing with tbl],
+	[MANPAGE_TBL=$withval],
+	[MANPAGE_TBL=no])
+
+AC_MSG_RESULT($MANPAGE_TBL)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_MAN_PAGES version: 54 updated: 2022/11/05 16:12:11
+dnl ------------
+dnl Try to determine if the man-pages on the system are compressed, and if
+dnl so, what format is used.  Use this information to construct a script that
+dnl will install man-pages.
+AC_DEFUN([CF_MAN_PAGES],
+[
+CF_HELP_MESSAGE(Options to Specify How Manpages are Installed:)
+CF_MANPAGE_FORMAT
+CF_MANPAGE_RENAMES
+CF_MANPAGE_SYMLINKS
+CF_MANPAGE_TBL
+
+if test "$prefix" = "NONE" ; then
+	cf_prefix="$ac_default_prefix"
+else
+	cf_prefix="$prefix"
+fi
+
+case "$MANPAGE_FORMAT" in
+(*catonly*)
+	cf_format=yes
+	cf_inboth=no
+	;;
+(*formatted*)
+	cf_format=yes
+	cf_inboth=yes
+	;;
+(*)
+	cf_format=no
+	cf_inboth=no
+	;;
+esac
+
+test ! -d man && mkdir man
+
+cf_so_strip=
+cf_compress=
+for cf_manpage_format in $MANPAGE_FORMAT
+do
+case "$cf_manpage_format" in
+(compress)
+	cf_so_strip="Z"
+	cf_compress=compress
+	;;
+(gzip)
+	cf_so_strip="gz"
+	cf_compress=gzip
+	;;
+(bzip2)
+	cf_so_strip="bz2"
+	cf_compress=bzip2
+	;;
+(xz)
+	cf_so_strip="xz"
+	cf_compress=xz
+	;;
+esac
+done
+
+cf_edit_man=./edit_man.sh
+cf_man_alias=`pwd`/man_alias.sed
+
+cat >$cf_edit_man <<CF_EOF
+#! $SHELL
+# this script is generated by the configure-script CF_MAN_PAGES macro.
+
+prefix="$cf_prefix"
+datarootdir="$datarootdir"
+datadir="$datadir"
+
+NCURSES_MAJOR="$NCURSES_MAJOR"
+NCURSES_MINOR="$NCURSES_MINOR"
+NCURSES_PATCH="$NCURSES_PATCH"
+
+NCURSES_OSPEED="$NCURSES_OSPEED"
+TERMINFO="$TERMINFO"
+
+INSTALL="$INSTALL"
+INSTALL_DATA="$INSTALL_DATA"
+
+transform="$program_transform_name"
+
+TMP=\${TMPDIR:=/tmp}/man\$\$
+trap "rm -f \$TMP; exit 1" 1 2 3 15
+trap "rm -f \$TMP" 0
+
+form=\[$]1
+shift || exit 1
+
+verb=\[$]1
+shift || exit 1
+
+mandir=\[$]1
+shift || exit 1
+
+srcdir=\[$]1
+top_srcdir=\[$]srcdir/..
+shift || exit 1
+
+if test "\$form" = normal ; then
+	if test "$cf_format" = yes ; then
+	if test "$cf_inboth" = no ; then
+		$SHELL "\[$]0" format "\$verb" "\$mandir" "\$srcdir" "\[$]@"
+		exit $?
+	fi
+	fi
+	cf_subdir=\$mandir/man
+	cf_tables=$MANPAGE_TBL
+else
+	cf_subdir=\$mandir/cat
+	cf_tables=yes
+fi
+
+# process the list of source-files
+for i in "\[$]@" ; do
+case \$i in
+(*.orig|*.rej) ;;
+(*.[[0-9]]*)
+	section=\`expr "\$i" : '.*\\.\\([[0-9]]\\)[[xm]]*'\`;
+	if test "\$verb" = installing ; then
+	if test ! -d "\$cf_subdir\${section}" ; then
+		mkdir -p "\$cf_subdir\$section"
+	fi
+	fi
+
+	# replace variables in man page
+	if test ! -f "$cf_man_alias" ; then
+cat >>$cf_man_alias <<-CF_EOF2
+		s,@DATADIR@,\$datadir,g
+		s,@TERMINFO@,\${TERMINFO:="no default value"},g
+		s,@TERMINFO_DIRS@,\${TERMINFO_DIRS:="no default value"},g
+		s,@NCURSES_MAJOR@,\${NCURSES_MAJOR:="no default value"},g
+		s,@NCURSES_MINOR@,\${NCURSES_MINOR:="no default value"},g
+		s,@NCURSES_PATCH@,\${NCURSES_PATCH:="no default value"},g
+		s,@NCURSES_OSPEED@,\${NCURSES_OSPEED:="no default value"},g
+CF_EOF
+	ifelse($1,,,[
+	for cf_name in $1
+	do
+		cf_NAME=`echo "$cf_name" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+		cf_name=`echo "$cf_name" | sed "$program_transform_name"`
+cat >>$cf_edit_man <<-CF_EOF
+		s,@$cf_NAME@,$cf_name,g
+CF_EOF
+	done
+	])
+cat >>$cf_edit_man <<CF_EOF
+CF_EOF2
+		echo "...made $cf_man_alias"
+	fi
+
+	aliases=
+	cf_source=\`basename "\$i"\`
+	inalias=\$cf_source
+	test ! -f "\$inalias" && inalias="\$srcdir/\$inalias"
+	if test ! -f "\$inalias" ; then
+		echo ".. skipped \$cf_source"
+		continue
+	fi
+CF_EOF
+
+if test "$MANPAGE_ALIASES" != no ; then
+cat >>$cf_edit_man <<CF_EOF
+	nCurses=ignore.3x
+	test "$with_curses_h" = yes && nCurses=ncurses.3x
+	aliases=\`sed -f "\$top_srcdir/man/manlinks.sed" "\$inalias" |sed -f "$cf_man_alias" | sort -u; test "\$inalias" = "\$nCurses" && echo curses\`
+CF_EOF
+fi
+
+if test "$MANPAGE_RENAMES" = no ; then
+cat >>$cf_edit_man <<CF_EOF
+	# perform program transformations for section 1 man pages
+	if test \$section = 1 ; then
+		cf_target=\$cf_subdir\${section}/\`echo \$cf_source|sed "\${transform}"\`
+	else
+		cf_target=\$cf_subdir\${section}/\$cf_source
+	fi
+CF_EOF
+else
+cat >>$cf_edit_man <<CF_EOF
+	cf_target=\`grep "^\$cf_source" $MANPAGE_RENAMES | $AWK '{print \[$]2}'\`
+	if test -z "\$cf_target" ; then
+		echo "? missing rename for \$cf_source"
+		cf_target="\$cf_source"
+	fi
+	cf_target="\$cf_subdir\${section}/\${cf_target}"
+
+CF_EOF
+fi
+
+cat >>$cf_edit_man <<CF_EOF
+	sed	-f "$cf_man_alias" \\
+CF_EOF
+
+if test "$MANPAGE_RENAMES" != no ; then
+cat >>$cf_edit_man <<CF_EOF
+		< "\$i" | sed -f `pwd`/edit_man.sed >\$TMP
+CF_EOF
+else
+cat >>$cf_edit_man <<CF_EOF
+		< "\$i" >\$TMP
+CF_EOF
+fi
+
+cat >>$cf_edit_man <<CF_EOF
+if test \$cf_tables = yes ; then
+	tbl \$TMP >\$TMP.out
+	mv \$TMP.out \$TMP
+fi
+CF_EOF
+
+if test "$with_overwrite" != yes ; then
+cat >>$cf_edit_man <<CF_EOF
+	sed -e "/\\#[    ]*include/s,<curses.h,<ncurses$LIB_SUFFIX/curses.h," < \$TMP >\$TMP.out
+	mv \$TMP.out \$TMP
+CF_EOF
+fi
+
+if test "$with_curses_h" != yes ; then
+cat >>$cf_edit_man <<CF_EOF
+	sed -e "/\\#[    ]*include/s,curses.h,ncurses.h," < \$TMP >\$TMP.out
+	mv \$TMP.out \$TMP
+CF_EOF
+fi
+
+cat >>$cf_edit_man <<CF_EOF
+	if test "\$form" = format ; then
+		nroff -man \$TMP >\$TMP.out
+		mv \$TMP.out \$TMP
+	fi
+CF_EOF
+
+if test -n "$cf_compress" ; then
+cat >>$cf_edit_man <<CF_EOF
+	if test "\$verb" = installing ; then
+	if ( "$cf_compress" -f \$TMP )
+	then
+		mv \$TMP.$cf_so_strip \$TMP
+	fi
+	fi
+	cf_target="\$cf_target.$cf_so_strip"
+CF_EOF
+fi
+
+case "$MANPAGE_FORMAT" in
+(*BSDI*)
+cat >>$cf_edit_man <<CF_EOF
+	if test "\$form" = format ; then
+		# BSDI installs only .0 suffixes in the cat directories
+		cf_target="\`echo \$cf_target|sed -e 's/\\.[[1-9]]\\+[[a-z]]*/.0/'\`"
+	fi
+CF_EOF
+  ;;
+esac
+
+cat >>$cf_edit_man <<CF_EOF
+	suffix=\`basename "\$cf_target" | sed -e 's%^[[^.]]*%%'\`
+	if test "\$verb" = installing ; then
+		echo "\$verb \$cf_target"
+		\$INSTALL_DATA \$TMP "\$cf_target"
+		test -d "\$cf_subdir\${section}" &&
+		test -n "\$aliases" && (
+			cd "\$cf_subdir\${section}" && (
+				cf_source=\`echo "\$cf_target" |sed -e 's%^.*/\\([[^/]][[^/]]*/[[^/]][[^/]]*$\\)%\\1%'\`
+				test -n "$cf_so_strip" && cf_source=\`echo "\$cf_source" |sed -e 's%\\.$cf_so_strip\$%%'\`
+				cf_target=\`basename "\$cf_target"\`
+				for cf_alias in \$aliases
+				do
+					if test "\$section" = 1 ; then
+						cf_alias=\`echo "\$cf_alias" |sed "\${transform}"\`
+					fi
+
+					if test "$MANPAGE_SYMLINKS" = yes ; then
+						if test -f "\$cf_alias\${suffix}" ; then
+							if ( cmp -s "\$cf_target" "\$cf_alias\${suffix}" )
+							then
+								continue
+							fi
+						fi
+						echo ".. \$verb alias \$cf_alias\${suffix}"
+CF_EOF
+case "x$LN_S" in
+(*-f)
+cat >>$cf_edit_man <<CF_EOF
+						$LN_S "\$cf_target" "\$cf_alias\${suffix}"
+CF_EOF
+	;;
+(*)
+cat >>$cf_edit_man <<CF_EOF
+						rm -f "\$cf_alias\${suffix}"
+						$LN_S "\$cf_target" "\$cf_alias\${suffix}"
+CF_EOF
+	;;
+esac
+cat >>$cf_edit_man <<CF_EOF
+					elif test "\$cf_target" != "\$cf_alias\${suffix}" ; then
+						echo ".so \$cf_source" >\$TMP
+CF_EOF
+if test -n "$cf_compress" ; then
+cat >>$cf_edit_man <<CF_EOF
+						if test -n "$cf_so_strip" ; then
+							"$cf_compress" -f \$TMP
+							mv \$TMP.$cf_so_strip \$TMP
+						fi
+CF_EOF
+fi
+cat >>$cf_edit_man <<CF_EOF
+						echo ".. \$verb alias \$cf_alias\${suffix}"
+						rm -f "\$cf_alias\${suffix}"
+						\$INSTALL_DATA \$TMP "\$cf_alias\${suffix}"
+					fi
+				done
+			)
+		)
+	elif test "\$verb" = removing ; then
+		test -f "\$cf_target" && (
+			echo "\$verb \$cf_target"
+			rm -f "\$cf_target"
+		)
+		test -d "\$cf_subdir\${section}" &&
+		test -n "\$aliases" && (
+			cd "\$cf_subdir\${section}" && (
+				for cf_alias in \$aliases
+				do
+					if test "\$section" = 1 ; then
+						cf_alias=\`echo "\$cf_alias" |sed "\${transform}"\`
+					fi
+
+					echo ".. \$verb alias \$cf_alias\${suffix}"
+					rm -f "\$cf_alias\${suffix}"
+				done
+			)
+		)
+	else
+#		echo ".hy 0"
+		cat \$TMP
+	fi
+	;;
+esac
+done
+
+if test "$cf_inboth" = yes ; then
+if test "\$form" != format ; then
+	$SHELL "\[$]0" format "\$verb" "\$mandir" "\$srcdir" "\[$]@"
+fi
+fi
+
+exit 0
+CF_EOF
+chmod 755 "$cf_edit_man"
+
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_MAP_LIB_BASENAME version: 2 updated: 2021/01/02 17:09:14
+dnl -------------------
+dnl Convert a default-libname to the actual one used via CF_WITH_LIB_BASENAME.
+dnl
+dnl $1 = variable to set
+dnl $2 = default-libname
+AC_DEFUN([CF_MAP_LIB_BASENAME],[
+CF_UPPER(cf_map_lib_basename,$2)
+eval $1="\$${cf_map_lib_basename}_NAME"
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_MATH_LIB version: 11 updated: 2022/07/27 19:01:48
+dnl -----------
+dnl Checks for libraries.  At least one UNIX system, Apple Macintosh
+dnl Rhapsody 5.5, does not have -lm.  We cannot use the simpler
+dnl AC_CHECK_LIB(m,sin), because that fails for C++.
+AC_DEFUN([CF_MATH_LIB],
+[
+AC_CACHE_CHECK(if -lm needed for math functions,
+	cf_cv_need_libm,[
+	AC_TRY_LINK([
+		#include <stdio.h>
+		#include <stdlib.h>
+		#include <math.h>
+	],
+	[double x = rand(); printf("result = %g\\n", ]ifelse([$2],,sin(x),$2)[)],
+	[cf_cv_need_libm=no],
+	[cf_cv_need_libm=yes])])
+
+if test "$cf_cv_need_libm" = yes
+then
+
+	cf_save_LIBS="$LIBS"
+	LIBS="$LIBS -lm"
+	AC_CACHE_CHECK(if -lm is available for math functions,
+	cf_cv_have_libm,[
+	AC_TRY_LINK([
+		#include <stdio.h>
+		#include <stdlib.h>
+		#include <math.h>
+	],
+	[double x = rand(); printf("result = %g\\n", ]ifelse([$2],,sin(x),$2)[)],
+	[cf_cv_have_libm=yes],
+	[cf_cv_have_libm=no])])
+	LIBS="$cf_save_LIBS"
+
+	if test "$cf_cv_have_libm" = yes
+	then
+		ifelse($1,,[CF_ADD_LIB(m)],[$1=-lm])
+	fi
+else
+	cf_cv_have_libm=yes
+fi
+
+if test "$cf_cv_have_libm" = yes
+then
+	AC_DEFINE(HAVE_MATH_FUNCS,1,[Define to 1 if math functions are available])
+fi
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_MIXEDCASE_FILENAMES version: 9 updated: 2021/01/01 16:53:59
+dnl ----------------------
+dnl Check if the file-system supports mixed-case filenames.  If we're able to
+dnl create a lowercase name and see it as uppercase, it doesn't support that.
+AC_DEFUN([CF_MIXEDCASE_FILENAMES],
+[
+AC_CACHE_CHECK(if filesystem supports mixed-case filenames,cf_cv_mixedcase,[
+if test "$cross_compiling" = yes ; then
+	case "$target_alias" in
+	(*-os2-emx*|*-msdosdjgpp*|*-cygwin*|*-msys*|*-mingw*|*-uwin*|darwin*)
+		cf_cv_mixedcase=no
+		;;
+	(*)
+		cf_cv_mixedcase=yes
+		;;
+	esac
+else
+	rm -f conftest CONFTEST
+	echo test >conftest
+	if test -f CONFTEST ; then
+		cf_cv_mixedcase=no
+	else
+		cf_cv_mixedcase=yes
+	fi
+	rm -f conftest CONFTEST
+fi
+])
+test "$cf_cv_mixedcase" = yes && AC_DEFINE(MIXEDCASE_FILENAMES,1,[Define to 1 if filesystem supports mixed-case filenames.])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_MKSTEMP version: 11 updated: 2021/01/01 13:31:04
+dnl ----------
+dnl Check for a working mkstemp.  This creates two files, checks that they are
+dnl successfully created and distinct (AmigaOS apparently fails on the last).
+AC_DEFUN([CF_MKSTEMP],[
+AC_CHECK_HEADERS( \
+unistd.h \
+)
+AC_CACHE_CHECK(for working mkstemp, cf_cv_func_mkstemp,[
+rm -rf ./conftest*
+AC_TRY_RUN([
+#include <sys/types.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/stat.h>
+int main(void)
+{
+	char *tmpl = "conftestXXXXXX";
+	char name[2][80];
+	int n;
+	int result = 0;
+	int fd;
+	struct stat sb;
+
+	umask(077);
+	for (n = 0; n < 2; ++n) {
+		strcpy(name[n], tmpl);
+		if ((fd = mkstemp(name[n])) >= 0) {
+			if (!strcmp(name[n], tmpl)
+			 || stat(name[n], &sb) != 0
+			 || (sb.st_mode & S_IFMT) != S_IFREG
+			 || (sb.st_mode & 077) != 0) {
+				result = 1;
+			}
+			close(fd);
+		}
+	}
+	if (result == 0
+	 && !strcmp(name[0], name[1]))
+		result = 1;
+	${cf_cv_main_return:-return}(result);
+}
+],[cf_cv_func_mkstemp=yes
+],[cf_cv_func_mkstemp=no
+],[cf_cv_func_mkstemp=maybe])
+])
+if test "x$cf_cv_func_mkstemp" = xmaybe ; then
+	AC_CHECK_FUNC(mkstemp)
+fi
+if test "x$cf_cv_func_mkstemp" = xyes || test "x$ac_cv_func_mkstemp" = xyes ; then
+	AC_DEFINE(HAVE_MKSTEMP,1,[Define to 1 if mkstemp() is available and working.])
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_MSG_LOG version: 5 updated: 2010/10/23 15:52:32
+dnl ----------
+dnl Write a debug message to config.log, along with the line number in the
+dnl configure script.
+AC_DEFUN([CF_MSG_LOG],[
+echo "${as_me:-configure}:__oline__: testing $* ..." 1>&AC_FD_CC
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_NCURSES_ABI_6 version: 4 updated: 2021/01/01 13:31:04
+dnl ----------------
+dnl Set ncurses' ABI to 6 unless overridden by explicit configure option, and
+dnl warn about this.
+AC_DEFUN([CF_NCURSES_ABI_6],[
+if test "${with_abi_version+set}" != set; then
+	case "$cf_cv_rel_version" in
+	(5.*)
+		cf_cv_rel_version=6.0
+		cf_cv_abi_version=6
+		AC_MSG_WARN(overriding ABI version to $cf_cv_abi_version)
+		;;
+	esac
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_NCURSES_WITH_ABI_VERSION version: 3 updated: 2021/01/01 13:31:04
+dnl ---------------------------
+dnl Allow ncurses's ABI to be overridden.  Generally this happens when a
+dnl packager has incremented the ABI past that used in the original package,
+dnl and wishes to keep doing this.
+dnl
+dnl $1 is the package name, if any, to derive a corresponding {package}_ABI
+dnl symbol.
+AC_DEFUN([CF_NCURSES_WITH_ABI_VERSION],[
+CF_WITH_ABI_VERSION($1)
+if test "x$cf_cv_abi_version" != "x$with_abi_version"
+then
+	case "$cf_cv_rel_version" in
+	(5.*)
+		cf_cv_rel_version=$with_abi_version.0
+		;;
+	esac
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_NO_LEAKS_OPTION version: 9 updated: 2021/06/13 19:45:41
+dnl ------------------
+dnl see CF_WITH_NO_LEAKS
+dnl
+dnl $1 = option/name
+dnl $2 = help-text
+dnl $3 = symbol to define if the option is set
+dnl $4 = additional actions to take if the option is set
+AC_DEFUN([CF_NO_LEAKS_OPTION],[
+AC_MSG_CHECKING(if you want to use $1 for testing)
+AC_ARG_WITH($1,
+	[$2],
+	[case "x$withval" in
+	(x|xno) ;;
+	(*)
+		: "${with_cflags:=-g}"
+		: "${enable_leaks:=no}"
+		with_$1=yes
+		AC_DEFINE_UNQUOTED($3,1,"Define to 1 if you want to use $1 for testing.")ifelse([$4],,[
+	 $4
+])
+		;;
+	esac],
+	[with_$1=])
+AC_MSG_RESULT(${with_$1:-no})
+
+case ".$with_cflags" in
+(.*-g*)
+	case .$CFLAGS in
+	(.*-g*)
+		;;
+	(*)
+		CF_ADD_CFLAGS([-g])
+		;;
+	esac
+	;;
+esac
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_NUMBER_SYNTAX version: 2 updated: 2015/04/17 21:13:04
+dnl ----------------
+dnl Check if the given variable is a number.  If not, report an error.
+dnl $1 is the variable
+dnl $2 is the message
+AC_DEFUN([CF_NUMBER_SYNTAX],[
+if test -n "$1" ; then
+  case $1 in
+  ([[0-9]]*)
+ 	;;
+  (*)
+	AC_MSG_ERROR($2 is not a number: $1)
+ 	;;
+  esac
+else
+  AC_MSG_ERROR($2 value is empty)
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_OBJ_SUBDIR version: 8 updated: 2021/01/01 13:31:04
+dnl -------------
+dnl Compute the object-directory name from the given model name
+AC_DEFUN([CF_OBJ_SUBDIR],
+[
+	case $1 in
+	(libtool) $2='obj_lo'  ;;
+	(normal)  $2='objects' ;;
+	(debug)   $2='obj_g' ;;
+	(profile) $2='obj_p' ;;
+	(shared)
+		case "$cf_cv_system_name" in
+		(cygwin|msys)
+			$2='objects' ;;
+		(*)
+			$2='obj_s' ;;
+		esac
+	esac
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_OUTPUT_MANPAGE_RENAMES version: 2 updated: 2022/10/22 19:12:31
+dnl -------------------------
+dnl This runs in the output step to config.status, after man_db.renames has
+dnl been generated.
+AC_DEFUN([CF_OUTPUT_MANPAGE_RENAMES],
+[
+AC_REQUIRE([CF_MANPAGE_RENAMES])
+if test "$MANPAGE_RENAMES" != no ; then
+	# Construct a sed-script to perform renaming within man-pages
+	test -n "$verbose" && echo "creating edit_man.sed"
+	test ! -d man && mkdir man
+	FGREP="${FGREP-grep -F}" $SHELL "$srcdir/man/make_sed.sh" "$MANPAGE_RENAMES" >./edit_man.sed
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PATHSEP version: 8 updated: 2021/01/01 13:31:04
+dnl ----------
+dnl Provide a value for the $PATH and similar separator (or amend the value
+dnl as provided in autoconf 2.5x).
+AC_DEFUN([CF_PATHSEP],
+[
+	AC_MSG_CHECKING(for PATH separator)
+	case "$cf_cv_system_name" in
+	(os2*)	PATH_SEPARATOR=';'  ;;
+	(*)	${PATH_SEPARATOR:=':'}  ;;
+	esac
+ifelse([$1],,,[$1=$PATH_SEPARATOR])
+	AC_SUBST(PATH_SEPARATOR)
+	AC_MSG_RESULT($PATH_SEPARATOR)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PATH_PROG version: 12 updated: 2021/01/02 09:31:20
+dnl ------------
+dnl Check for a given program, defining corresponding symbol.
+dnl	$1 = environment variable, which is suffixed by "_PATH" in the #define.
+dnl	$2 = program name to find.
+dnl	$3 = optional list of additional program names to test.
+dnl $4 = $PATH
+dnl
+dnl If there is more than one token in the result, #define the remaining tokens
+dnl to $1_ARGS.  We need this for 'install' in particular.
+dnl
+dnl FIXME: we should allow this to be overridden by environment variables
+dnl
+AC_DEFUN([CF_PATH_PROG],[
+AC_REQUIRE([CF_PATHSEP])
+test -z "[$]$1" && $1="$2"
+AC_PATH_PROGS($1,[$]$1 $2 ifelse($3,,,$3),[$]$1, ifelse($4,,,$4))
+
+cf_path_prog=""
+cf_path_args=""
+IFS="${IFS:- 	}"; cf_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR"
+for cf_temp in $ac_cv_path_$1
+do
+	if test -z "$cf_path_prog" ; then
+		if test "$with_full_paths" = yes ; then
+			CF_PATH_SYNTAX(cf_temp,break)
+			cf_path_prog="$cf_temp"
+		else
+			cf_path_prog="`basename "$cf_temp"`"
+		fi
+	elif test -z "$cf_path_args" ; then
+		cf_path_args="$cf_temp"
+	else
+		cf_path_args="$cf_path_args $cf_temp"
+	fi
+done
+IFS="$cf_save_ifs"
+
+if test -n "$cf_path_prog" ; then
+	CF_MSG_LOG(defining path for ${cf_path_prog})
+	AC_DEFINE_UNQUOTED($1_PATH,"$cf_path_prog",Define to pathname $1)
+	test -n "$cf_path_args" && AC_DEFINE_UNQUOTED($1_ARGS,"$cf_path_args",Define to provide args for $1)
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PATH_SYNTAX version: 18 updated: 2020/12/31 18:40:20
+dnl --------------
+dnl Check the argument to see that it looks like a pathname.  Rewrite it if it
+dnl begins with one of the prefix/exec_prefix variables, and then again if the
+dnl result begins with 'NONE'.  This is necessary to work around autoconf's
+dnl delayed evaluation of those symbols.
+AC_DEFUN([CF_PATH_SYNTAX],[
+if test "x$prefix" != xNONE; then
+	cf_path_syntax="$prefix"
+else
+	cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".[$]$1" in
+(.\[$]\(*\)*|.\'*\'*)
+	;;
+(..|./*|.\\*)
+	;;
+(.[[a-zA-Z]]:[[\\/]]*) # OS/2 EMX
+	;;
+(.\[$]\{*prefix\}*|.\[$]\{*dir\}*)
+	eval $1="[$]$1"
+	case ".[$]$1" in
+	(.NONE/*)
+		$1=`echo "[$]$1" | sed -e s%NONE%$cf_path_syntax%`
+		;;
+	esac
+	;;
+(.no|.NONE/*)
+	$1=`echo "[$]$1" | sed -e s%NONE%$cf_path_syntax%`
+	;;
+(*)
+	ifelse([$2],,[AC_MSG_ERROR([expected a pathname, not \"[$]$1\"])],$2)
+	;;
+esac
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PKG_CONFIG version: 12 updated: 2021/10/10 20:18:09
+dnl -------------
+dnl Check for the package-config program, unless disabled by command-line.
+dnl
+dnl Sets $PKG_CONFIG to the pathname of the pkg-config program.
+AC_DEFUN([CF_PKG_CONFIG],
+[
+AC_MSG_CHECKING(if you want to use pkg-config)
+AC_ARG_WITH(pkg-config,
+	[  --with-pkg-config{=path} enable/disable use of pkg-config],
+	[cf_pkg_config=$withval],
+	[cf_pkg_config=yes])
+AC_MSG_RESULT($cf_pkg_config)
+
+case "$cf_pkg_config" in
+(no)
+	PKG_CONFIG=none
+	;;
+(yes)
+	CF_ACVERSION_CHECK(2.52,
+		[AC_PATH_TOOL(PKG_CONFIG, pkg-config, none)],
+		[AC_PATH_PROG(PKG_CONFIG, pkg-config, none)])
+	;;
+(*)
+	PKG_CONFIG=$withval
+	;;
+esac
+
+test -z "$PKG_CONFIG" && PKG_CONFIG=none
+if test "$PKG_CONFIG" != none ; then
+	CF_PATH_SYNTAX(PKG_CONFIG)
+elif test "x$cf_pkg_config" != xno ; then
+	AC_MSG_WARN(pkg-config is not installed)
+fi
+
+AC_SUBST(PKG_CONFIG)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_POSIX_C_SOURCE version: 11 updated: 2018/12/31 20:46:17
+dnl -----------------
+dnl Define _POSIX_C_SOURCE to the given level, and _POSIX_SOURCE if needed.
+dnl
+dnl	POSIX.1-1990				_POSIX_SOURCE
+dnl	POSIX.1-1990 and			_POSIX_SOURCE and
+dnl		POSIX.2-1992 C-Language			_POSIX_C_SOURCE=2
+dnl		Bindings Option
+dnl	POSIX.1b-1993				_POSIX_C_SOURCE=199309L
+dnl	POSIX.1c-1996				_POSIX_C_SOURCE=199506L
+dnl	X/Open 2000				_POSIX_C_SOURCE=200112L
+dnl
+dnl Parameters:
+dnl	$1 is the nominal value for _POSIX_C_SOURCE
+AC_DEFUN([CF_POSIX_C_SOURCE],
+[AC_REQUIRE([CF_POSIX_VISIBLE])dnl
+
+if test "$cf_cv_posix_visible" = no; then
+
+cf_POSIX_C_SOURCE=ifelse([$1],,199506L,[$1])
+
+cf_save_CFLAGS="$CFLAGS"
+cf_save_CPPFLAGS="$CPPFLAGS"
+
+CF_REMOVE_DEFINE(cf_trim_CFLAGS,$cf_save_CFLAGS,_POSIX_C_SOURCE)
+CF_REMOVE_DEFINE(cf_trim_CPPFLAGS,$cf_save_CPPFLAGS,_POSIX_C_SOURCE)
+
+AC_CACHE_CHECK(if we should define _POSIX_C_SOURCE,cf_cv_posix_c_source,[
+	CF_MSG_LOG(if the symbol is already defined go no further)
+	AC_TRY_COMPILE([#include <sys/types.h>],[
+#ifndef _POSIX_C_SOURCE
+make an error
+#endif],
+	[cf_cv_posix_c_source=no],
+	[cf_want_posix_source=no
+	 case .$cf_POSIX_C_SOURCE in
+	 (.[[12]]??*)
+		cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE"
+		;;
+	 (.2)
+		cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE"
+		cf_want_posix_source=yes
+		;;
+	 (.*)
+		cf_want_posix_source=yes
+		;;
+	 esac
+	 if test "$cf_want_posix_source" = yes ; then
+		AC_TRY_COMPILE([#include <sys/types.h>],[
+#ifdef _POSIX_SOURCE
+make an error
+#endif],[],
+		cf_cv_posix_c_source="$cf_cv_posix_c_source -D_POSIX_SOURCE")
+	 fi
+	 CF_MSG_LOG(ifdef from value $cf_POSIX_C_SOURCE)
+	 CFLAGS="$cf_trim_CFLAGS"
+	 CPPFLAGS="$cf_trim_CPPFLAGS"
+	 CF_APPEND_TEXT(CPPFLAGS,$cf_cv_posix_c_source)
+	 CF_MSG_LOG(if the second compile does not leave our definition intact error)
+	 AC_TRY_COMPILE([#include <sys/types.h>],[
+#ifndef _POSIX_C_SOURCE
+make an error
+#endif],,
+	 [cf_cv_posix_c_source=no])
+	 CFLAGS="$cf_save_CFLAGS"
+	 CPPFLAGS="$cf_save_CPPFLAGS"
+	])
+])
+
+if test "$cf_cv_posix_c_source" != no ; then
+	CFLAGS="$cf_trim_CFLAGS"
+	CPPFLAGS="$cf_trim_CPPFLAGS"
+	CF_ADD_CFLAGS($cf_cv_posix_c_source)
+fi
+
+fi # cf_cv_posix_visible
+
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_POSIX_VISIBLE version: 1 updated: 2018/12/31 20:46:17
+dnl ----------------
+dnl POSIX documents test-macros which an application may set before any system
+dnl headers are included to make features available.
+dnl
+dnl Some BSD platforms (originally FreeBSD, but copied by a few others)
+dnl diverged from POSIX in 2002 by setting symbols which make all of the most
+dnl recent features visible in the system header files unless the application
+dnl overrides the corresponding test-macros.  Doing that introduces portability
+dnl problems.
+dnl
+dnl This macro makes a special check for the symbols used for this, to avoid a
+dnl conflicting definition.
+AC_DEFUN([CF_POSIX_VISIBLE],
+[
+AC_CACHE_CHECK(if the POSIX test-macros are already defined,cf_cv_posix_visible,[
+AC_TRY_COMPILE([#include <stdio.h>],[
+#if defined(__POSIX_VISIBLE) && ((__POSIX_VISIBLE - 0L) > 0) \
+	&& defined(__XSI_VISIBLE) && ((__XSI_VISIBLE - 0L) > 0) \
+	&& defined(__BSD_VISIBLE) && ((__BSD_VISIBLE - 0L) > 0) \
+	&& defined(__ISO_C_VISIBLE) && ((__ISO_C_VISIBLE - 0L) > 0)
+#error conflicting symbols found
+#endif
+],[cf_cv_posix_visible=no],[cf_cv_posix_visible=yes])
+])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PREDEFINE version: 2 updated: 2010/05/26 16:44:57
+dnl ------------
+dnl Add definitions to CPPFLAGS to ensure they're predefined for all compiles.
+dnl
+dnl $1 = symbol to test
+dnl $2 = value (if any) to use for a predefinition
+AC_DEFUN([CF_PREDEFINE],
+[
+AC_MSG_CHECKING(if we must define $1)
+AC_TRY_COMPILE([#include <sys/types.h>
+],[
+#ifndef $1
+make an error
+#endif],[cf_result=no],[cf_result=yes])
+AC_MSG_RESULT($cf_result)
+
+if test "$cf_result" = yes ; then
+	CPPFLAGS="$CPPFLAGS ifelse([$2],,-D$1,[-D$1=$2])"
+elif test "x$2" != "x" ; then
+	AC_MSG_CHECKING(checking for compatible value versus $2)
+	AC_TRY_COMPILE([#include <sys/types.h>
+],[
+#if $1-$2 < 0
+make an error
+#endif],[cf_result=yes],[cf_result=no])
+	AC_MSG_RESULT($cf_result)
+	if test "$cf_result" = no ; then
+		# perhaps we can override it - try...
+		CPPFLAGS="$CPPFLAGS -D$1=$2"
+	fi
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PRG_RULES version: 2 updated: 2021/01/01 13:31:04
+dnl ------------
+dnl Append definitions and rules for the given programs to the subdirectory
+dnl Makefiles, and the recursion rule for the top-level Makefile.
+dnl
+dnl parameters
+dnl	$1 = script to run
+dnl	$2 = list of subdirectories
+dnl
+dnl variables
+dnl	$AWK
+AC_DEFUN([CF_PRG_RULES],
+[
+for cf_dir in $2
+do
+	if test ! -d "$srcdir/$cf_dir" ; then
+		continue
+	elif test -f "$srcdir/$cf_dir/programs" ; then
+		$AWK -f $1 "$srcdir/$cf_dir/programs" >>$cf_dir/Makefile
+	fi
+done
+
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PROG_AR version: 1 updated: 2009/01/01 20:15:22
+dnl ----------
+dnl Check for archiver "ar".
+AC_DEFUN([CF_PROG_AR],[
+AC_CHECK_TOOL(AR, ar, ar)
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_PROG_AWK version: 1 updated: 2006/09/16 11:40:59
+dnl -----------
+dnl Check for awk, ensure that the check found something.
+AC_DEFUN([CF_PROG_AWK],
+[
+AC_PROG_AWK
+test -z "$AWK" && AC_MSG_ERROR(No awk program found)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PROG_CC version: 5 updated: 2019/12/31 08:53:54
+dnl ----------
+dnl standard check for CC, plus followup sanity checks
+dnl $1 = optional parameter to pass to AC_PROG_CC to specify compiler name
+AC_DEFUN([CF_PROG_CC],[
+CF_ACVERSION_CHECK(2.53,
+	[AC_MSG_WARN(this will incorrectly handle gnatgcc choice)
+	 AC_REQUIRE([AC_PROG_CC])],
+	[])
+ifelse($1,,[AC_PROG_CC],[AC_PROG_CC($1)])
+CF_GCC_VERSION
+CF_ACVERSION_CHECK(2.52,
+	[AC_PROG_CC_STDC],
+	[CF_ANSI_CC_REQD])
+CF_CC_ENV_FLAGS
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PROG_CC_C_O version: 6 updated: 2021/01/01 13:31:04
+dnl --------------
+dnl Analogous to AC_PROG_CC_C_O, but more useful: tests only $CC, ensures that
+dnl the output file can be renamed, and allows for a shell variable that can
+dnl be used later.  The parameter is either CC or CXX.  The result is the
+dnl cache variable:
+dnl	$cf_cv_prog_CC_c_o
+dnl	$cf_cv_prog_CXX_c_o
+dnl
+dnl $1 = compiler
+dnl $2 = compiler options, if any
+AC_DEFUN([CF_PROG_CC_C_O],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_MSG_CHECKING([whether [$]$1 understands -c and -o together])
+AC_CACHE_VAL(cf_cv_prog_$1_c_o,
+[
+cat > conftest.$ac_ext <<CF_EOF
+int main(void)
+{
+	${cf_cv_main_return:-return}(0);
+}
+CF_EOF
+# We do the test twice because some compilers refuse to overwrite an
+# existing .o file with -o, though they will create one.
+ac_try='[$]$1 $2 -c conftest.$ac_ext -o conftest2.$ac_objext >&AC_FD_CC'
+if AC_TRY_EVAL(ac_try) &&
+  test -f conftest2.$ac_objext && AC_TRY_EVAL(ac_try);
+then
+  eval cf_cv_prog_$1_c_o=yes
+else
+  eval cf_cv_prog_$1_c_o=no
+fi
+rm -rf ./conftest*
+])dnl
+if test "$cf_cv_prog_$1_c_o" = yes; then
+  AC_MSG_RESULT([yes])
+else
+  AC_MSG_RESULT([no])
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PROG_GNAT version: 12 updated: 2021/01/02 17:09:14
+dnl ------------
+dnl Check for gnat/gnatmake/etc, ensure that the toolset is complete.
+AC_DEFUN([CF_PROG_GNAT],[
+for cf_prog_gnat in gnat gnatmake gprconfig gprbuild
+do
+	CF_UPPER(cf_upper_prog_gnat,${cf_prog_gnat})
+
+	unset ac_cv_path_cf_TEMP_gnat
+	unset cf_TEMP_gnat
+	AC_PATH_PROG(cf_TEMP_gnat,$cf_prog_gnat,no)
+	eval "cf_cv_PATH_$cf_upper_prog_gnat=[$]ac_cv_path_cf_TEMP_gnat"
+
+	if test "x$cf_TEMP_gnat" != xno; then
+		unset cf_cv_gnat_version
+		unset cf_TEMP_gnat
+		CF_GNAT_VERSION(cf_TEMP_gnat,$cf_prog_gnat)
+	fi
+	eval "cf_cv_VERSION_$cf_upper_prog_gnat=[$]cf_TEMP_gnat"
+
+	unset cf_TEMP_gnat
+	unset cf_cv_gnat_version
+	unset ac_cv_path_cf_TEMP_gnat
+done
+
+if test "x$cf_cv_VERSION_GNATMAKE" = "xno"; then
+	cf_ada_make=
+	cf_cv_prog_gnat_correct=no
+else
+	cf_ada_make=gnatmake
+	if test "x$cf_cv_VERSION_GPRCONFIG" = "xno"; then
+		# gprconfig is newer than gnatmake; we can continue...
+		cf_ada_config="##"
+	else
+		rm -rf ./conftest* ./*~conftest*
+		if mkdir conftest.src
+		then
+			cf_ada_config=""
+			cd conftest.src
+			for cf_gprconfig in Ada C
+			do
+				AC_MSG_CHECKING(for gprconfig name for $cf_gprconfig)
+				if test "$cf_gprconfig" = C
+				then
+					for cf_gprconfig_param in \
+						"$cf_gprconfig,,,,GNATGCC" \
+						"$cf_gprconfig,,,,GCC" \
+						"$cf_gprconfig"
+					do
+						cf_gprconfig_value=`echo s| gprconfig --config=$cf_gprconfig_param 2>&AC_FD_CC | ${AWK:-awk} '/^\*/{print [$]3;}' | head -n 1`
+						test -n "$cf_gprconfig_value" && break
+					done
+				else
+					cf_gprconfig_param=$cf_gprconfig
+					cf_gprconfig_value=`echo s| gprconfig --config=$cf_gprconfig_param 2>&AC_FD_CC | ${AWK:-awk} '/^\*/{print [$]3;}' | head -n 1`
+				fi
+				if test -n "$cf_gprconfig_value"
+				then
+					eval "cf_ada_config_[$]cf_gprconfig=[$]cf_gprconfig_value"
+					AC_MSG_RESULT($cf_gprconfig_value)
+				else
+					AC_MSG_RESULT(missing)
+					cf_ada_config="#"
+					break
+				fi
+			done
+			cd ..
+			rm -rf ./conftest* ./*~conftest*
+		fi
+	fi
+	if test "x$cf_ada_config" != "x#"
+	then
+		CF_GNAT_VERSION
+		CF_CHECK_GNAT_VERSION
+		AC_CHECK_PROG(M4_exists, m4, yes, no)
+		if test "$ac_cv_prog_M4_exists" = no; then
+			cf_cv_prog_gnat_correct=no
+			AC_MSG_WARN(Ada95 binding required program m4 not found. Ada95 binding disabled)
+		fi
+		if test "$cf_cv_prog_gnat_correct" = yes; then
+			AC_MSG_CHECKING(if GNAT works)
+			CF_GNAT_TRY_RUN([procedure conftest;],
+[with Text_IO;
+with GNAT.OS_Lib;
+procedure conftest is
+begin
+   Text_IO.Put ("Hello World");
+   Text_IO.New_Line;
+   GNAT.OS_Lib.OS_Exit (0);
+end conftest;],
+[cf_cv_prog_gnat_correct=yes],
+[cf_cv_prog_gnat_correct=no])
+			AC_MSG_RESULT($cf_cv_prog_gnat_correct)
+		fi
+	else
+		cf_cv_prog_gnat_correct=no
+	fi
+fi
+
+AC_SUBST(cf_ada_make)
+AC_SUBST(cf_ada_config)
+AC_SUBST(cf_ada_config_Ada)
+AC_SUBST(cf_ada_config_C)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PROG_INSTALL version: 10 updated: 2021/01/04 19:33:05
+dnl ---------------
+dnl Force $INSTALL to be an absolute-path.  Otherwise, edit_man.sh and the
+dnl misc/tabset install won't work properly.  Usually this happens only when
+dnl using the fallback mkinstalldirs script
+AC_DEFUN([CF_PROG_INSTALL],
+[AC_PROG_INSTALL
+case $INSTALL in
+(/*)
+	;;
+(*)
+	CF_DIRNAME(cf_dir,$INSTALL)
+	test -z "$cf_dir" && cf_dir=.
+	INSTALL="`cd \"$cf_dir\" && pwd`"/"`echo "$INSTALL" | sed -e 's%^.*/%%'`"
+	;;
+esac
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PROG_LDCONFIG version: 5 updated: 2015/04/18 08:56:57
+dnl ----------------
+dnl Check for ldconfig, needed to fixup shared libraries that would be built
+dnl and then used in the install.
+AC_DEFUN([CF_PROG_LDCONFIG],[
+if test "$cross_compiling" = yes ; then
+	LDCONFIG=:
+else
+	case "$cf_cv_system_name" in
+	(dragonfly*|mirbsd*|freebsd*)
+		test -z "$LDCONFIG" && LDCONFIG="/sbin/ldconfig -R"
+		;;
+	(*) LDPATH=$PATH:/sbin:/usr/sbin
+		AC_PATH_PROG(LDCONFIG,ldconfig,,$LDPATH)
+		;;
+	esac
+fi
+AC_SUBST(LDCONFIG)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PROG_LINT version: 5 updated: 2022/08/20 15:44:13
+dnl ------------
+AC_DEFUN([CF_PROG_LINT],
+[
+AC_CHECK_PROGS(LINT, lint cppcheck splint)
+case "x$LINT" in
+(xcppcheck|x*/cppcheck)
+	test -z "$LINT_OPTS" && LINT_OPTS="--enable=all"
+	;;
+esac
+AC_SUBST(LINT_OPTS)
+AC_SUBST(LINT_LIBS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PROG_LN_S version: 2 updated: 2010/08/14 18:25:37
+dnl ------------
+dnl Combine checks for "ln -s" and "ln -sf", updating $LN_S to include "-f"
+dnl option if it is supported.
+AC_DEFUN([CF_PROG_LN_S],[
+AC_PROG_LN_S
+AC_MSG_CHECKING(if $LN_S -f options work)
+
+rm -f conf$$.src conf$$dst
+echo >conf$$.dst
+echo first >conf$$.src
+if $LN_S -f conf$$.src conf$$.dst 2>/dev/null; then
+	cf_prog_ln_sf=yes
+else
+	cf_prog_ln_sf=no
+fi
+rm -f conf$$.dst conf$$src
+AC_MSG_RESULT($cf_prog_ln_sf)
+
+test "$cf_prog_ln_sf" = yes && LN_S="$LN_S -f"
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_REGEX version: 18 updated: 2021/01/01 16:53:59
+dnl --------
+dnl Attempt to determine if we've got one of the flavors of regular-expression
+dnl code that we can support.
+AC_DEFUN([CF_REGEX],
+[
+
+cf_regex_func=no
+cf_regex_libs=
+case "$host_os" in
+(mingw*)
+	# -lsystre -ltre -lintl -liconv
+	AC_CHECK_LIB(systre,regcomp,[
+		AC_CHECK_LIB(iconv,libiconv_open,[CF_ADD_LIB(iconv)])
+		AC_CHECK_LIB(intl,libintl_gettext,[CF_ADD_LIB(intl)])
+		AC_CHECK_LIB(tre,tre_regcomp,[CF_ADD_LIB(tre)])
+		CF_ADD_LIB(systre)
+		cf_regex_func=regcomp
+	],[
+		AC_CHECK_LIB(gnurx,regcomp,[
+			CF_ADD_LIB(gnurx)
+			cf_regex_func=regcomp])
+	])
+	;;
+(*)
+	cf_regex_libs="regex re"
+	AC_CHECK_FUNC(regcomp,[cf_regex_func=regcomp],[
+		for cf_regex_lib in $cf_regex_libs
+		do
+			AC_CHECK_LIB($cf_regex_lib,regcomp,[
+					CF_ADD_LIB($cf_regex_lib)
+					cf_regex_func=regcomp
+					break])
+		done
+	])
+	;;
+esac
+
+if test "$cf_regex_func" = no ; then
+	AC_CHECK_FUNC(compile,[cf_regex_func=compile],[
+		AC_CHECK_LIB(gen,compile,[
+				CF_ADD_LIB(gen)
+				cf_regex_func=compile])])
+fi
+
+if test "$cf_regex_func" = no ; then
+	AC_MSG_WARN(cannot find regular expression library)
+fi
+
+AC_CACHE_CHECK(for regular-expression headers,cf_cv_regex_hdrs,[
+
+cf_cv_regex_hdrs=no
+case "$cf_regex_func" in
+(compile)
+	for cf_regex_hdr in regexp.h regexpr.h
+	do
+		AC_TRY_LINK([#include <$cf_regex_hdr>],[
+			char *p = compile("", "", "", 0);
+			int x = step("", "");
+			(void)p;
+			(void)x;
+		],[
+			cf_cv_regex_hdrs=$cf_regex_hdr
+			break
+		])
+	done
+	;;
+(*)
+	for cf_regex_hdr in regex.h
+	do
+		AC_TRY_LINK([#include <sys/types.h>
+#include <$cf_regex_hdr>],[
+			regex_t *p = 0;
+			int x = regcomp(p, "", 0);
+			int y = regexec(p, "", 0, 0, 0);
+			(void)x;
+			(void)y;
+			regfree(p);
+		],[
+			cf_cv_regex_hdrs=$cf_regex_hdr
+			break
+		])
+	done
+	;;
+esac
+
+])
+
+case "$cf_cv_regex_hdrs" in
+	(no)		AC_MSG_WARN(no regular expression header found) ;;
+	(regex.h)	AC_DEFINE(HAVE_REGEX_H_FUNCS,1,[Define to 1 to include regex.h for regular expressions]) ;;
+	(regexp.h)	AC_DEFINE(HAVE_REGEXP_H_FUNCS,1,[Define to 1 to include regexp.h for regular expressions]) ;;
+	(regexpr.h) AC_DEFINE(HAVE_REGEXPR_H_FUNCS,1,[Define to 1 to include regexpr.h for regular expressions]) ;;
+esac
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_REMOVE_CFLAGS version: 3 updated: 2021/09/05 17:25:40
+dnl ----------------
+dnl Remove a given option from CFLAGS/CPPFLAGS
+dnl $1 = option to remove
+dnl $2 = variable to update
+dnl $3 = nonempty to allow verbose message
+define([CF_REMOVE_CFLAGS],
+[
+cf_tmp_cflag=`echo "x$1" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x[$]$2" | sed -e 's/^.//' -e 's/[[ 	]][[ 	]]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[[^ 	]][[^ 	]]*\\)\?%%" -e 's/^[[ 	]]*//' -e 's%[[ ]][[ ]]*-D% -D%g' -e 's%[[ ]][[ ]]*-I% -I%g'`
+	test "[$]$2" != "$cf_old_cflag" || break
+	ifelse([$3],,,[CF_VERBOSE(removing old option $1 from $2)])
+	$2="$cf_old_cflag"
+done
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_REMOVE_DEFINE version: 3 updated: 2010/01/09 11:05:50
+dnl ----------------
+dnl Remove all -U and -D options that refer to the given symbol from a list
+dnl of C compiler options.  This works around the problem that not all
+dnl compilers process -U and -D options from left-to-right, so a -U option
+dnl cannot be used to cancel the effect of a preceding -D option.
+dnl
+dnl $1 = target (which could be the same as the source variable)
+dnl $2 = source (including '$')
+dnl $3 = symbol to remove
+define([CF_REMOVE_DEFINE],
+[
+$1=`echo "$2" | \
+	sed	-e 's/-[[UD]]'"$3"'\(=[[^ 	]]*\)\?[[ 	]]/ /g' \
+		-e 's/-[[UD]]'"$3"'\(=[[^ 	]]*\)\?[$]//g'`
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_REMOVE_LIB version: 1 updated: 2007/02/17 14:11:52
+dnl -------------
+dnl Remove the given library from the symbol
+dnl
+dnl $1 = target (which could be the same as the source variable)
+dnl $2 = source (including '$')
+dnl $3 = library to remove
+define([CF_REMOVE_LIB],
+[
+# remove $3 library from $2
+$1=`echo "$2" | sed -e 's/-l$3[[ 	]]//g' -e 's/-l$3[$]//'`
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_RESTORE_XTRA_FLAGS version: 1 updated: 2020/01/11 16:47:45
+dnl ---------------------
+dnl Restore flags saved in CF_SAVE_XTRA_FLAGS
+dnl $1 = name of current macro
+define([CF_RESTORE_XTRA_FLAGS],
+[
+LIBS="$cf_save_LIBS_$1"
+CFLAGS="$cf_save_CFLAGS_$1"
+CPPFLAGS="$cf_save_CPPFLAGS_$1"
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_RPATH_HACK version: 13 updated: 2021/01/03 18:30:50
+dnl -------------
+AC_DEFUN([CF_RPATH_HACK],
+[AC_REQUIRE([AC_PROG_FGREP])dnl
+AC_REQUIRE([CF_LD_RPATH_OPT])dnl
+
+AC_MSG_CHECKING(for updated LDFLAGS)
+if test -n "$LD_RPATH_OPT" ; then
+	AC_MSG_RESULT(maybe)
+
+	AC_CHECK_PROGS(cf_ldd_prog,ldd,no)
+	cf_rpath_list="/usr/lib /lib"
+	if test "$cf_ldd_prog" != no
+	then
+		cf_rpath_oops=
+
+AC_TRY_LINK([#include <stdio.h>],
+		[printf("Hello");],
+		[cf_rpath_oops=`"$cf_ldd_prog" "conftest$ac_exeext" | ${FGREP-fgrep} ' not found' | sed -e 's% =>.*$%%' |sort | uniq`
+		 cf_rpath_list=`"$cf_ldd_prog" "conftest$ac_exeext" | ${FGREP-fgrep} / | sed -e 's%^.*[[ 	]]/%/%' -e 's%/[[^/]][[^/]]*$%%' |sort | uniq`])
+
+		# If we passed the link-test, but get a "not found" on a given library,
+		# this could be due to inept reconfiguration of gcc to make it only
+		# partly honor /usr/local/lib (or whatever).  Sometimes this behavior
+		# is intentional, e.g., installing gcc in /usr/bin and suppressing the
+		# /usr/local libraries.
+		if test -n "$cf_rpath_oops"
+		then
+			for cf_rpath_src in $cf_rpath_oops
+			do
+				for cf_rpath_dir in \
+					/usr/local \
+					/usr/pkg \
+					/opt/sfw
+				do
+					if test -f "$cf_rpath_dir/lib/$cf_rpath_src"
+					then
+						CF_VERBOSE(...adding -L$cf_rpath_dir/lib to LDFLAGS for $cf_rpath_src)
+						LDFLAGS="$LDFLAGS -L$cf_rpath_dir/lib"
+						break
+					fi
+				done
+			done
+		fi
+	fi
+
+	CF_VERBOSE(...checking EXTRA_LDFLAGS $EXTRA_LDFLAGS)
+
+	CF_RPATH_HACK_2(LDFLAGS)
+	CF_RPATH_HACK_2(LIBS)
+
+	CF_VERBOSE(...checked EXTRA_LDFLAGS $EXTRA_LDFLAGS)
+else
+	AC_MSG_RESULT(no)
+fi
+AC_SUBST(EXTRA_LDFLAGS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_RPATH_HACK_2 version: 8 updated: 2021/01/01 13:31:04
+dnl ---------------
+dnl Do one set of substitutions for CF_RPATH_HACK, adding an rpath option to
+dnl EXTRA_LDFLAGS for each -L option found.
+dnl
+dnl $cf_rpath_list contains a list of directories to ignore.
+dnl
+dnl $1 = variable name to update.  The LDFLAGS variable should be the only one,
+dnl      but LIBS often has misplaced -L options.
+AC_DEFUN([CF_RPATH_HACK_2],
+[
+CF_VERBOSE(...checking $1 [$]$1)
+
+cf_rpath_dst=
+for cf_rpath_src in [$]$1
+do
+	case "$cf_rpath_src" in
+	(-L*)
+
+		# check if this refers to a directory which we will ignore
+		cf_rpath_skip=no
+		if test -n "$cf_rpath_list"
+		then
+			for cf_rpath_item in $cf_rpath_list
+			do
+				if test "x$cf_rpath_src" = "x-L$cf_rpath_item"
+				then
+					cf_rpath_skip=yes
+					break
+				fi
+			done
+		fi
+
+		if test "$cf_rpath_skip" = no
+		then
+			# transform the option
+			if test "$LD_RPATH_OPT" = "-R " ; then
+				cf_rpath_tmp=`echo "$cf_rpath_src" |sed -e "s%-L%-R %"`
+			else
+				cf_rpath_tmp=`echo "$cf_rpath_src" |sed -e "s%-L%$LD_RPATH_OPT%"`
+			fi
+
+			# if we have not already added this, add it now
+			cf_rpath_tst=`echo "$EXTRA_LDFLAGS" | sed -e "s%$cf_rpath_tmp %%"`
+			if test "x$cf_rpath_tst" = "x$EXTRA_LDFLAGS"
+			then
+				CF_VERBOSE(...Filter $cf_rpath_src ->$cf_rpath_tmp)
+				EXTRA_LDFLAGS="$cf_rpath_tmp $EXTRA_LDFLAGS"
+			fi
+		fi
+		;;
+	esac
+	cf_rpath_dst="$cf_rpath_dst $cf_rpath_src"
+done
+$1=$cf_rpath_dst
+
+CF_VERBOSE(...checked $1 [$]$1)
+AC_SUBST(EXTRA_LDFLAGS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_SAVE_XTRA_FLAGS version: 1 updated: 2020/01/11 16:46:44
+dnl ------------------
+dnl Use this macro to save CFLAGS/CPPFLAGS/LIBS before checks against X headers
+dnl and libraries which do not update those variables.
+dnl
+dnl $1 = name of current macro
+define([CF_SAVE_XTRA_FLAGS],
+[
+cf_save_LIBS_$1="$LIBS"
+cf_save_CFLAGS_$1="$CFLAGS"
+cf_save_CPPFLAGS_$1="$CPPFLAGS"
+LIBS="$LIBS ${X_PRE_LIBS} ${X_LIBS} ${X_EXTRA_LIBS}"
+for cf_X_CFLAGS in $X_CFLAGS
+do
+	case "x$cf_X_CFLAGS" in
+	x-[[IUD]]*)
+		CPPFLAGS="$CPPFLAGS $cf_X_CFLAGS"
+		;;
+	*)
+		CFLAGS="$CFLAGS $cf_X_CFLAGS"
+		;;
+	esac
+done
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_SHARED_OPTS version: 107 updated: 2021/09/04 06:47:34
+dnl --------------
+dnl --------------
+dnl Attempt to determine the appropriate CC/LD options for creating a shared
+dnl library.
+dnl
+dnl Notes:
+dnl a) ${LOCAL_LDFLAGS} is used to link executables that will run within
+dnl the build-tree, i.e., by making use of the libraries that are compiled in
+dnl $rel_builddir/lib We avoid compiling-in a $rel_builddir/lib path for the
+dnl shared library since that can lead to unexpected results at runtime.
+dnl b) ${LOCAL_LDFLAGS2} has the same intention but assumes that the shared
+dnl libraries are compiled in ../../lib
+dnl
+dnl The variable 'cf_cv_do_symlinks' is used to control whether we configure
+dnl to install symbolic links to the rel/abi versions of shared libraries.
+dnl
+dnl The variable 'cf_cv_shlib_version' controls whether we use the rel or abi
+dnl version when making symbolic links.
+dnl
+dnl The variable 'cf_cv_shlib_version_infix' controls whether shared library
+dnl version numbers are infix (ex: libncurses.<ver>.dylib) or postfix
+dnl (ex: libncurses.so.<ver>).
+dnl
+dnl Some loaders leave 'so_locations' lying around.  It is nice to clean up.
+AC_DEFUN([CF_SHARED_OPTS],
+[
+	AC_REQUIRE([CF_LD_RPATH_OPT])
+
+	RM_SHARED_OPTS=
+	LOCAL_LDFLAGS=
+	LOCAL_LDFLAGS2=
+	LD_SHARED_OPTS=
+	INSTALL_LIB="-m 644"
+	: ${rel_builddir:=.}
+
+	shlibdir=$libdir
+	AC_SUBST(shlibdir)
+
+	MAKE_DLLS="#"
+	AC_SUBST(MAKE_DLLS)
+
+	cf_cv_do_symlinks=no
+	cf_ld_rpath_opt=
+	test "$cf_cv_enable_rpath" = yes && cf_ld_rpath_opt="$LD_RPATH_OPT"
+
+	AC_MSG_CHECKING(if release/abi version should be used for shared libs)
+	AC_ARG_WITH(shlib-version,
+	[  --with-shlib-version=X  Specify rel or abi version for shared libs],
+	[test -z "$withval" && withval=auto
+	case "$withval" in
+	(yes)
+		cf_cv_shlib_version=auto
+		;;
+	(rel|abi|auto)
+		cf_cv_shlib_version=$withval
+		;;
+	(*)
+		AC_MSG_RESULT($withval)
+		AC_MSG_ERROR([option value must be one of: rel, abi, or auto])
+		;;
+	esac
+	],[cf_cv_shlib_version=auto])
+	AC_MSG_RESULT($cf_cv_shlib_version)
+
+	cf_cv_rm_so_locs=no
+	cf_try_cflags=
+
+	# Some less-capable ports of gcc support only -fpic
+	CC_SHARED_OPTS=
+
+	cf_try_fPIC=no
+	if test "$GCC" = yes
+	then
+		cf_try_fPIC=yes
+	else
+		case "$cf_cv_system_name" in
+		(*linux*)	# e.g., PGI compiler
+			cf_try_fPIC=yes
+			;;
+		esac
+	fi
+
+	if test "$cf_try_fPIC" = yes
+	then
+		AC_MSG_CHECKING(which $CC option to use)
+		cf_save_CFLAGS="$CFLAGS"
+		for CC_SHARED_OPTS in -fPIC -fpic ''
+		do
+			CFLAGS="$cf_save_CFLAGS $CC_SHARED_OPTS"
+			AC_TRY_COMPILE([#include <stdio.h>],[int x = 1],[break],[])
+		done
+		AC_MSG_RESULT($CC_SHARED_OPTS)
+		CFLAGS="$cf_save_CFLAGS"
+	fi
+
+	cf_cv_shlib_version_infix=no
+
+	case "$cf_cv_system_name" in
+	(aix4.[3-9]*|aix[[5-7]]*)
+		if test "$GCC" = yes; then
+			CC_SHARED_OPTS='-Wl,-brtl'
+			MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-brtl -Wl,-blibpath:${RPATH_LIST}:/usr/lib -o [$]@'
+		else
+			CC_SHARED_OPTS='-brtl'
+			# as well as '-qpic=large -G' or perhaps "-bM:SRE -bnoentry -bexpall"
+			MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -G -Wl,-brtl -Wl,-blibpath:${RPATH_LIST}:/usr/lib -o [$]@'
+		fi
+		;;
+	(beos*)
+		MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -o $[@] -Xlinker -soname=`basename $[@]` -nostart -e 0'
+		;;
+	(cygwin*)
+		CC_SHARED_OPTS=
+		MK_SHARED_LIB=$SHELL' '$rel_builddir'/mk_shared_lib.sh [$]@ [$]{CC} [$]{CFLAGS}'
+		RM_SHARED_OPTS="$RM_SHARED_OPTS $rel_builddir/mk_shared_lib.sh *.dll.a"
+		cf_cv_shlib_version=cygdll
+		cf_cv_shlib_version_infix=cygdll
+		shlibdir=$bindir
+		MAKE_DLLS=
+		cat >mk_shared_lib.sh <<-CF_EOF
+		#!$SHELL
+		SHARED_LIB=\[$]1
+		IMPORT_LIB=\`echo "\[$]1" | sed -e 's/cyg/lib/' -e 's/[[0-9]]*\.dll[$]/.dll.a/'\`
+		shift
+		cat <<-EOF
+		Linking shared library
+		** SHARED_LIB \[$]SHARED_LIB
+		** IMPORT_LIB \[$]IMPORT_LIB
+EOF
+		exec \[$]* ${LDFLAGS} -shared -Wl,--out-implib=\[$]{IMPORT_LIB} -Wl,--export-all-symbols -o \[$]{SHARED_LIB}
+CF_EOF
+		chmod +x mk_shared_lib.sh
+		;;
+	(msys*)
+		CC_SHARED_OPTS=
+		MK_SHARED_LIB=$SHELL' '$rel_builddir'/mk_shared_lib.sh [$]@ [$]{CC} [$]{CFLAGS}'
+		RM_SHARED_OPTS="$RM_SHARED_OPTS $rel_builddir/mk_shared_lib.sh *.dll.a"
+		cf_cv_shlib_version=msysdll
+		cf_cv_shlib_version_infix=msysdll
+		shlibdir=$bindir
+		MAKE_DLLS=
+		cat >mk_shared_lib.sh <<-CF_EOF
+		#!$SHELL
+		SHARED_LIB=\[$]1
+		IMPORT_LIB=\`echo "\[$]1" | sed -e 's/msys-/lib/' -e 's/[[0-9]]*\.dll[$]/.dll.a/'\`
+		shift
+		cat <<-EOF
+		Linking shared library
+		** SHARED_LIB \[$]SHARED_LIB
+		** IMPORT_LIB \[$]IMPORT_LIB
+EOF
+		exec \[$]* ${LDFLAGS} -shared -Wl,--out-implib=\[$]{IMPORT_LIB} -Wl,--export-all-symbols -o \[$]{SHARED_LIB}
+CF_EOF
+		chmod +x mk_shared_lib.sh
+		;;
+	(darwin*)
+		cf_try_cflags="no-cpp-precomp"
+		CC_SHARED_OPTS="-dynamic"
+		MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -dynamiclib -install_name ${libdir}/`basename $[@]` -compatibility_version ${ABI_VERSION} -current_version ${ABI_VERSION} -o $[@]'
+		test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=abi
+		cf_cv_shlib_version_infix=yes
+		AC_CACHE_CHECK([if ld -search_paths_first works], cf_cv_ldflags_search_paths_first, [
+			cf_save_LDFLAGS=$LDFLAGS
+			LDFLAGS="$LDFLAGS -Wl,-search_paths_first"
+			AC_TRY_LINK(, [int i;], cf_cv_ldflags_search_paths_first=yes, cf_cv_ldflags_search_paths_first=no)
+				LDFLAGS=$cf_save_LDFLAGS])
+		if test "$cf_cv_ldflags_search_paths_first" = yes; then
+			LDFLAGS="$LDFLAGS -Wl,-search_paths_first"
+		fi
+		;;
+	(haiku*)
+		CF_SHARED_SONAME
+		MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,'$cf_cv_shared_soname',-stats,-lc -o $[@]'
+		;;
+	(hpux[[7-8]]*)
+		# HP-UX 8.07 ld lacks "+b" option used for libdir search-list
+		if test "$GCC" != yes; then
+			CC_SHARED_OPTS='+Z'
+		fi
+		MK_SHARED_LIB='${LD} ${LDFLAGS} -b -o $[@]'
+		INSTALL_LIB="-m 555"
+		;;
+	(hpux*)
+		# (tested with gcc 2.7.2 -- I don't have c89)
+		if test "$GCC" = yes; then
+			LD_SHARED_OPTS='-Xlinker +b -Xlinker ${libdir}'
+		else
+			CC_SHARED_OPTS='+Z'
+			LD_SHARED_OPTS='-Wl,+b,${libdir}'
+		fi
+		MK_SHARED_LIB='${LD} ${LDFLAGS} +b ${libdir} -b -o $[@]'
+		# HP-UX shared libraries must be executable, and should be
+		# readonly to exploit a quirk in the memory manager.
+		INSTALL_LIB="-m 555"
+		;;
+	(interix*)
+		test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel
+		if test "$cf_cv_shlib_version" = rel; then
+			cf_shared_soname='`basename $[@] .${REL_VERSION}`.${ABI_VERSION}'
+		else
+			cf_shared_soname='`basename $[@]`'
+		fi
+		CC_SHARED_OPTS=
+		MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-rpath,${RPATH_LIST} -Wl,-h,'$cf_shared_soname' -o $[@]'
+		;;
+	(irix*)
+		if test "$cf_cv_enable_rpath" = yes ; then
+			EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS"
+		fi
+		# tested with IRIX 5.2 and 'cc'.
+		if test "$GCC" != yes; then
+			CC_SHARED_OPTS='-KPIC'
+			MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -rdata_shared -soname `basename $[@]` -o $[@]'
+		else
+			MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,`basename $[@]` -o $[@]'
+		fi
+		cf_cv_rm_so_locs=yes
+		;;
+	(linux*|gnu*|k*bsd*-gnu)
+		if test "$DFT_LWR_MODEL" = "shared" && test -n "$LD_RPATH_OPT" ; then
+			LOCAL_LDFLAGS="${LD_RPATH_OPT}\$(LOCAL_LIBDIR)"
+			LOCAL_LDFLAGS2="$LOCAL_LDFLAGS"
+		fi
+		if test "$cf_cv_enable_rpath" = yes ; then
+			EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS"
+		fi
+		CF_SHARED_SONAME
+		MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,'$cf_cv_shared_soname',-stats,-lc -o $[@]'
+		;;
+	(mingw*msvc*)
+		cf_cv_shlib_version=msvcdll
+		cf_cv_shlib_version_infix=msvcdll
+		shlibdir=$bindir
+		MAKE_DLLS=
+		if test "$DFT_LWR_MODEL" = "shared" ; then
+			LOCAL_LDFLAGS="-link -dll"
+			LOCAL_LDFLAGS2="$LOCAL_LDFLAGS"
+			EXTRA_LDFLAGS="-link -dll $EXTRA_LDFLAGS"
+		fi
+		CC_SHARED_OPTS=
+		MK_SHARED_LIB=$SHELL' '$rel_builddir'/mk_shared_lib.sh [$]@ ${LD} [$]{CFLAGS}'
+		RM_SHARED_OPTS="$RM_SHARED_OPTS $rel_builddir/mk_shared_lib.sh *.dll.lib"
+		cat >mk_shared_lib.sh <<-CF_EOF
+		#!$SHELL
+		SHARED_LIB=\[$]1
+		IMPORT_LIB=\`echo "\[$]1" | sed -e 's/[[0-9]]*\.dll[$]/.dll.lib/'\`
+		shift
+		my_ld=\[$]1
+		shift
+		cat <<-EOF
+		Linking shared library
+		** SHARED LIB \$SHARED_LIB
+		** IMPORT_LIB \$IMPORT_LIB
+EOF
+		args=\$(echo \[$]* | sed -E "s#-l(\w*)#\1.dll.lib#g" | sed -E "s#-L(\w*)#-LIBPATH:\1#g")
+		exec \$my_ld -DLL -IMPLIB:"\${IMPORT_LIB}" -OUT:"\${SHARED_LIB}" ${LDFLAGS} \$args
+		mv "\${IMPORT_LIB}" "\${IMPORT_LIB}"
+CF_EOF
+		chmod +x mk_shared_lib.sh
+		cat >mk_prog.sh <<-CF_EOF
+		#!$SHELL
+		shift
+		# Ignore first argument (compiler) and use LD (link.exe) unconditionally
+		LD="[$]LD"
+		clopts=()
+		ldopts=("/subsystem:console")
+		libs=()
+		isdll=0
+		while test \[$]# -gt 0; do
+			case "\[$]1" in
+				-link)
+					# ignore -link argument
+					;;
+				-M[[TD]] | -M[[TD]]d)
+					# ignore runtime-library option
+					;;
+				-dll)
+					isdll=1
+					;;
+				-W* | -w*)
+					# ignore warnings
+					;;
+				-D*)
+					clopts+=("\[$]1")
+					;;
+				-I*)
+					clopts+=("\[$]1")
+					;;
+				-l*)
+					libs+=("\`echo \"\[$]1\" | sed \"s/^-l//\"\`")
+					;;
+				-L*)
+					ldopts+=("\`echo \"\[$]1\" | sed \"s/^-L/-LIBPATH:/\"\`")
+					;;
+				*.obj | *.o)
+					ldopts+=("\[$]1")
+					;;
+				-Wl,*)
+					for linkarg in \`echo '\[$]1' | sed -e 's/-Wl,//' -e 's/,/ /'\`; do
+						ldopts+=("\[$]{linkarg}")
+					done
+					;;
+				*.lib)
+					ldopts+=("\[$]1")
+					;;
+				-o)
+					shift
+					ldopts+=("-out:\[$]1")
+					;;
+				*)
+					clopts+=("\[$]1")
+					ldopts+=("\[$]1")
+					;;
+			esac
+			shift
+		done
+		if [[ "\$isdll" -ne 0 ]]; then
+			for lib in \[$]{libs[[*]]}; do
+				ldopts+=("\[$]lib.dll.lib")
+			done
+		else
+			for lib in \[$]{libs[[*]]}; do
+				ldopts+=("\[$]lib.lib")
+			done
+		fi
+		cat <<-EOF
+		Creating program
+		** ld options:   "\[$]{ldopts[[@]]}"
+EOF
+		exec \[$]LD \[$]{ldopts[[@]]}
+CF_EOF
+		chmod +x mk_prog.sh
+		LINK_PROGS="$SHELL ${rel_builddir}/mk_prog.sh"
+		LINK_TESTS="$SHELL ${rel_builddir}/mk_prog.sh"
+		;;
+	(mingw*)
+		cf_cv_shlib_version=mingw
+		cf_cv_shlib_version_infix=mingw
+		shlibdir=$bindir
+		MAKE_DLLS=
+		if test "$DFT_LWR_MODEL" = "shared" ; then
+			LOCAL_LDFLAGS="-Wl,--enable-auto-import"
+			LOCAL_LDFLAGS2="$LOCAL_LDFLAGS"
+			EXTRA_LDFLAGS="-Wl,--enable-auto-import $EXTRA_LDFLAGS"
+		fi
+		CC_SHARED_OPTS=
+		MK_SHARED_LIB=$SHELL' '$rel_builddir'/mk_shared_lib.sh [$]@ [$]{CC} [$]{CFLAGS}'
+		RM_SHARED_OPTS="$RM_SHARED_OPTS $rel_builddir/mk_shared_lib.sh *.dll.a"
+		cat >mk_shared_lib.sh <<-CF_EOF
+		#!$SHELL
+		SHARED_LIB=\[$]1
+		IMPORT_LIB=\`echo "\[$]1" | sed -e 's/[[0-9]]*\.dll[$]/.dll.a/'\`
+		shift
+		cat <<-EOF
+		Linking shared library
+		** SHARED_LIB \[$]SHARED_LIB
+		** IMPORT_LIB \[$]IMPORT_LIB
+EOF
+		exec \[$]* ${LDFLAGS} -shared -Wl,--enable-auto-import,--out-implib=\[$]{IMPORT_LIB} -Wl,--export-all-symbols -o \[$]{SHARED_LIB}
+CF_EOF
+		chmod +x mk_shared_lib.sh
+		;;
+	(openbsd[[2-9]].*|mirbsd*)
+		if test "$DFT_LWR_MODEL" = "shared" && test -n "$LD_RPATH_OPT" ; then
+			LOCAL_LDFLAGS="${LD_RPATH_OPT}\$(LOCAL_LIBDIR)"
+			LOCAL_LDFLAGS2="$LOCAL_LDFLAGS"
+		fi
+		if test "$cf_cv_enable_rpath" = yes ; then
+			EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS"
+		fi
+		CC_SHARED_OPTS="$CC_SHARED_OPTS -DPIC"
+		CF_SHARED_SONAME
+		MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-Bshareable,-soname,'$cf_cv_shared_soname',-stats,-lc -o $[@]'
+		;;
+	(nskJ*)
+		CC_SHARED_OPTS=
+		MK_SHARED_LIB='${LD} -Wshared -Weld=-export_all -o $[@]'
+		;;
+	(nskL*)
+		CC_SHARED_OPTS=
+		MK_SHARED_LIB='${LD} -Wshared -Wxld=-export_all -o $[@]'
+		;;
+	(nto-qnx*|openbsd*|freebsd[[12]].*)
+		CC_SHARED_OPTS="$CC_SHARED_OPTS -DPIC"
+		MK_SHARED_LIB='${LD} ${LDFLAGS} -Bshareable -o $[@]'
+		test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel
+		;;
+	(dragonfly*|freebsd*)
+		CC_SHARED_OPTS="$CC_SHARED_OPTS -DPIC"
+		if test "$DFT_LWR_MODEL" = "shared" && test "$cf_cv_enable_rpath" = yes ; then
+			LOCAL_LDFLAGS="${cf_ld_rpath_opt}\$(LOCAL_LIBDIR)"
+			LOCAL_LDFLAGS2="${cf_ld_rpath_opt}\${RPATH_LIST} $LOCAL_LDFLAGS"
+			EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS"
+		fi
+		CF_SHARED_SONAME
+		MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,'$cf_cv_shared_soname',-stats,-lc -o $[@]'
+		;;
+	(netbsd*)
+		CC_SHARED_OPTS="$CC_SHARED_OPTS -DPIC"
+		if test "$DFT_LWR_MODEL" = "shared" && test "$cf_cv_enable_rpath" = yes ; then
+			LOCAL_LDFLAGS="${cf_ld_rpath_opt}\$(LOCAL_LIBDIR)"
+			LOCAL_LDFLAGS2="$LOCAL_LDFLAGS"
+			EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS"
+			if test "$cf_cv_shlib_version" = auto; then
+			if test -f /usr/libexec/ld.elf_so; then
+				cf_cv_shlib_version=abi
+			else
+				cf_cv_shlib_version=rel
+			fi
+			fi
+			CF_SHARED_SONAME
+			MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,'$cf_cv_shared_soname' -o $[@]'
+		else
+			MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -o $[@]'
+		fi
+		;;
+	(osf*|mls+*)
+		# tested with OSF/1 V3.2 and 'cc'
+		# tested with OSF/1 V3.2 and gcc 2.6.3 (but the c++ demo didn't
+		# link with shared libs).
+		MK_SHARED_LIB='${LD} ${LDFLAGS} -set_version ${REL_VERSION}:${ABI_VERSION} -expect_unresolved "*" -shared -soname `basename $[@]`'
+		case "$host_os" in
+		(osf4*)
+			MK_SHARED_LIB="${MK_SHARED_LIB} -msym"
+			;;
+		esac
+		MK_SHARED_LIB="${MK_SHARED_LIB}"' -o $[@]'
+		if test "$DFT_LWR_MODEL" = "shared" && test -n "$LD_RPATH_OPT" ; then
+			LOCAL_LDFLAGS="${LD_RPATH_OPT}\$(LOCAL_LIBDIR)"
+			LOCAL_LDFLAGS2="$LOCAL_LDFLAGS"
+		fi
+		cf_cv_rm_so_locs=yes
+		;;
+	(sco3.2v5*)  # also uw2* and UW7: hops 13-Apr-98
+		# tested with osr5.0.5
+		if test "$GCC" != yes; then
+			CC_SHARED_OPTS='-belf -KPIC'
+		fi
+		MK_SHARED_LIB='${LD} ${LDFLAGS} -dy -G -h `basename $[@] .${REL_VERSION}`.${ABI_VERSION} -o [$]@'
+		if test "$cf_cv_enable_rpath" = yes ; then
+			# only way is to set LD_RUN_PATH but no switch for it
+			RUN_PATH=$libdir
+		fi
+		test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel
+		LINK_PROGS='LD_RUN_PATH=${libdir}'
+		LINK_TESTS='Pwd=`pwd`;LD_RUN_PATH=`dirname $${Pwd}`/lib'
+		;;
+	(sunos4*)
+		# tested with SunOS 4.1.1 and gcc 2.7.0
+		if test "$GCC" != yes; then
+			CC_SHARED_OPTS='-KPIC'
+		fi
+		MK_SHARED_LIB='${LD} ${LDFLAGS} -assert pure-text -o $[@]'
+		test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel
+		;;
+	(solaris2*)
+		# tested with SunOS 5.5.1 (solaris 2.5.1) and gcc 2.7.2
+		# tested with SunOS 5.10 (solaris 10) and gcc 3.4.3
+		if test "$DFT_LWR_MODEL" = "shared" ; then
+			LOCAL_LDFLAGS="-R \$(LOCAL_LIBDIR):\${libdir}"
+			LOCAL_LDFLAGS2="$LOCAL_LDFLAGS"
+		fi
+		if test "$cf_cv_enable_rpath" = yes ; then
+			EXTRA_LDFLAGS="-R \${libdir} $EXTRA_LDFLAGS"
+		fi
+		CF_SHARED_SONAME
+		if test "$GCC" != yes; then
+			cf_save_CFLAGS="$CFLAGS"
+			for cf_shared_opts in -xcode=pic32 -xcode=pic13 -KPIC -Kpic -O
+			do
+				CFLAGS="$cf_shared_opts $cf_save_CFLAGS"
+				AC_TRY_COMPILE([#include <stdio.h>],[printf("Hello\\n");],[break])
+			done
+			CFLAGS="$cf_save_CFLAGS"
+			CC_SHARED_OPTS=$cf_shared_opts
+			MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -dy -G -h '$cf_cv_shared_soname' -o $[@]'
+		else
+			MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -dy -G -h '$cf_cv_shared_soname' -o $[@]'
+		fi
+		;;
+	(sysv5uw7*|unix_sv*)
+		# tested with UnixWare 7.1.0 (gcc 2.95.2 and cc)
+		if test "$GCC" != yes; then
+			CC_SHARED_OPTS='-KPIC'
+		fi
+		MK_SHARED_LIB='${LD} ${LDFLAGS} -d y -G -o [$]@'
+		;;
+	(*)
+		CC_SHARED_OPTS='unknown'
+		MK_SHARED_LIB='echo unknown'
+		;;
+	esac
+
+	# This works if the last tokens in $MK_SHARED_LIB are the -o target.
+	case "$cf_cv_shlib_version" in
+	(rel|abi)
+		case "$MK_SHARED_LIB" in
+		(*'-o $[@]')
+			test "$cf_cv_do_symlinks" = no && cf_cv_do_symlinks=yes
+			;;
+		(*)
+			AC_MSG_WARN(ignored --with-shlib-version)
+			;;
+		esac
+		;;
+	esac
+
+	if test -n "$cf_try_cflags"
+	then
+cat > conftest.$ac_ext <<EOF
+#line __oline__ "${as_me:-configure}"
+#include <stdio.h>
+int main(int argc, char *argv[[]])
+{
+	printf("hello\\n");
+	return (argv[[argc-1]] == 0) ;
+}
+EOF
+		cf_save_CFLAGS="$CFLAGS"
+		for cf_opt in $cf_try_cflags
+		do
+			CFLAGS="$cf_save_CFLAGS -$cf_opt"
+			AC_MSG_CHECKING(if CFLAGS option -$cf_opt works)
+			if AC_TRY_EVAL(ac_compile); then
+				AC_MSG_RESULT(yes)
+				cf_save_CFLAGS="$CFLAGS"
+			else
+				AC_MSG_RESULT(no)
+			fi
+		done
+		CFLAGS="$cf_save_CFLAGS"
+	fi
+
+
+	# RPATH_LIST is a colon-separated list of directories
+	test -n "$cf_ld_rpath_opt" && MK_SHARED_LIB="$MK_SHARED_LIB $cf_ld_rpath_opt\${RPATH_LIST}"
+	test -z "$RPATH_LIST" && RPATH_LIST="\${libdir}"
+
+	test "$cf_cv_rm_so_locs" = yes && RM_SHARED_OPTS="$RM_SHARED_OPTS so_locations"
+
+	CF_VERBOSE(CC_SHARED_OPTS: $CC_SHARED_OPTS)
+	CF_VERBOSE(MK_SHARED_LIB:  $MK_SHARED_LIB)
+
+	AC_SUBST(CC_SHARED_OPTS)
+	AC_SUBST(LD_RPATH_OPT)
+	AC_SUBST(LD_SHARED_OPTS)
+	AC_SUBST(MK_SHARED_LIB)
+	AC_SUBST(RM_SHARED_OPTS)
+
+	AC_SUBST(LINK_PROGS)
+	AC_SUBST(LINK_TESTS)
+
+	AC_SUBST(EXTRA_LDFLAGS)
+	AC_SUBST(LOCAL_LDFLAGS)
+	AC_SUBST(LOCAL_LDFLAGS2)
+
+	AC_SUBST(INSTALL_LIB)
+	AC_SUBST(RPATH_LIST)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_SHARED_SONAME version: 3 updated: 2008/09/08 18:34:43
+dnl ----------------
+dnl utility macro for CF_SHARED_OPTS, constructs "$cf_cv_shared_soname" for
+dnl substitution into MK_SHARED_LIB string for the "-soname" (or similar)
+dnl option.
+dnl
+dnl $1 is the default that should be used for "$cf_cv_shlib_version".
+dnl If missing, use "rel".
+define([CF_SHARED_SONAME],
+[
+	test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=ifelse($1,,rel,$1)
+	if test "$cf_cv_shlib_version" = rel; then
+		cf_cv_shared_soname='`basename $[@] .${REL_VERSION}`.${ABI_VERSION}'
+	else
+		cf_cv_shared_soname='`basename $[@]`'
+	fi
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_SIGWINCH version: 6 updated: 2021/01/01 13:31:04
+dnl -----------
+dnl Use this macro after CF_XOPEN_SOURCE, but do not require it (not all
+dnl programs need this test).
+dnl
+dnl This is really a Mac OS X 10.4.3 workaround.  Defining _POSIX_C_SOURCE
+dnl forces SIGWINCH to be undefined (breaks xterm, ncurses).  Oddly, the struct
+dnl winsize declaration is left alone - we may revisit this if Apple choose to
+dnl break that part of the interface as well.
+AC_DEFUN([CF_SIGWINCH],
+[
+AC_CACHE_CHECK(if SIGWINCH is defined,cf_cv_define_sigwinch,[
+	AC_TRY_COMPILE([
+#include <sys/types.h>
+#include <sys/signal.h>
+],[int x = SIGWINCH; (void)x],
+	[cf_cv_define_sigwinch=yes],
+	[AC_TRY_COMPILE([
+#undef _XOPEN_SOURCE
+#undef _POSIX_SOURCE
+#undef _POSIX_C_SOURCE
+#include <sys/types.h>
+#include <sys/signal.h>
+],[int x = SIGWINCH; (void)x],
+	[cf_cv_define_sigwinch=maybe],
+	[cf_cv_define_sigwinch=no])
+])
+])
+
+if test "$cf_cv_define_sigwinch" = maybe ; then
+AC_CACHE_CHECK(for actual SIGWINCH definition,cf_cv_fixup_sigwinch,[
+cf_cv_fixup_sigwinch=unknown
+cf_sigwinch=32
+while test "$cf_sigwinch" != 1
+do
+	AC_TRY_COMPILE([
+#undef _XOPEN_SOURCE
+#undef _POSIX_SOURCE
+#undef _POSIX_C_SOURCE
+#include <sys/types.h>
+#include <sys/signal.h>
+],[
+#if SIGWINCH != $cf_sigwinch
+make an error
+#endif
+int x = SIGWINCH; (void)x],
+	[cf_cv_fixup_sigwinch=$cf_sigwinch
+	 break])
+
+cf_sigwinch="`expr "$cf_sigwinch" - 1`"
+done
+])
+
+	if test "$cf_cv_fixup_sigwinch" != unknown ; then
+		CPPFLAGS="$CPPFLAGS -DSIGWINCH=$cf_cv_fixup_sigwinch"
+	fi
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_SIG_ATOMIC_T version: 5 updated: 2020/03/10 18:53:47
+dnl ---------------
+dnl signal handler, but there are some gcc dependencies in that recommendation.
+dnl Try anyway.
+AC_DEFUN([CF_SIG_ATOMIC_T],
+[
+AC_MSG_CHECKING(for signal global datatype)
+AC_CACHE_VAL(cf_cv_sig_atomic_t,[
+	for cf_type in \
+		"volatile sig_atomic_t" \
+		"sig_atomic_t" \
+		"int"
+	do
+	AC_TRY_COMPILE([
+#include <sys/types.h>
+#include <signal.h>
+#include <stdio.h>
+
+extern $cf_type x;
+$cf_type x;
+static void handler(int sig)
+{
+	(void)sig;
+	x = 5;
+}],
+		[signal(SIGINT, handler);
+		 x = 1],
+		[cf_cv_sig_atomic_t=$cf_type],
+		[cf_cv_sig_atomic_t=no])
+		test "$cf_cv_sig_atomic_t" != no && break
+	done
+	])
+AC_MSG_RESULT($cf_cv_sig_atomic_t)
+test "$cf_cv_sig_atomic_t" != no && AC_DEFINE_UNQUOTED(SIG_ATOMIC_T, $cf_cv_sig_atomic_t,[Define to signal global datatype])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_SIZECHANGE version: 18 updated: 2021/09/04 06:35:04
+dnl -------------
+dnl Check for definitions & structures needed for window size-changing
+dnl
+dnl https://stackoverflow.com/questions/18878141/difference-between-structures-ttysize-and-winsize/50769952#50769952
+AC_DEFUN([CF_SIZECHANGE],
+[
+AC_REQUIRE([CF_STRUCT_TERMIOS])
+AC_CACHE_CHECK(declaration of size-change, cf_cv_sizechange,[
+	cf_cv_sizechange=unknown
+	cf_save_CPPFLAGS="$CPPFLAGS"
+
+for cf_opts in "" "NEED_PTEM_H"
+do
+
+	CPPFLAGS="$cf_save_CPPFLAGS"
+	if test -n "$cf_opts"
+	then
+		CF_APPEND_TEXT(CPPFLAGS,-D$cf_opts)
+	fi
+	AC_TRY_COMPILE([#include <sys/types.h>
+#ifdef HAVE_TERMIOS_H
+#include <termios.h>
+#else
+#ifdef HAVE_TERMIO_H
+#include <termio.h>
+#endif
+#endif
+
+#ifdef NEED_PTEM_H
+/* This is a workaround for SCO:  they neglected to define struct winsize in
+ * termios.h -- it is only in termio.h and ptem.h
+ */
+#include <sys/stream.h>
+#include <sys/ptem.h>
+#endif
+
+#ifdef HAVE_SYS_IOCTL_H
+#include <sys/ioctl.h>
+#endif
+],[
+#ifdef TIOCGSIZE
+	struct ttysize win;	/* SunOS 3.0... */
+	int y = win.ts_lines = 2;
+	int x = win.ts_cols = 1;
+	(void)y;
+	(void)x;
+#else
+#ifdef TIOCGWINSZ
+	struct winsize win;	/* everything else */
+	int y = win.ws_row = 2;
+	int x = win.ws_col = 1;
+	(void)y;
+	(void)x;
+#else
+	no TIOCGSIZE or TIOCGWINSZ
+#endif /* TIOCGWINSZ */
+#endif /* TIOCGSIZE */
+	],
+	[cf_cv_sizechange=yes],
+	[cf_cv_sizechange=no])
+
+	CPPFLAGS="$cf_save_CPPFLAGS"
+	if test "$cf_cv_sizechange" = yes ; then
+		echo "size-change succeeded ($cf_opts)" >&AC_FD_CC
+		test -n "$cf_opts" && cf_cv_sizechange="$cf_opts"
+		break
+	fi
+done
+])
+if test "$cf_cv_sizechange" != no ; then
+	AC_DEFINE(HAVE_SIZECHANGE,1,[Define to 1 if sizechange declarations are provided])
+	case "$cf_cv_sizechange" in
+	(NEED*)
+		AC_DEFINE_UNQUOTED($cf_cv_sizechange )
+		;;
+	esac
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_SRC_MODULES version: 33 updated: 2021/01/01 13:31:04
+dnl --------------
+dnl For each parameter, test if the source-directory exists, and if it contains
+dnl a 'modules' file.  If so, add to the list $cf_cv_src_modules which we'll
+dnl use in CF_LIB_RULES.
+dnl
+dnl This uses the configured value to make the lists SRC_SUBDIRS and
+dnl SUB_MAKEFILES which are used in the makefile-generation scheme.
+AC_DEFUN([CF_SRC_MODULES],
+[
+AC_REQUIRE([CF_CHECK_GNAT_VERSION])
+AC_MSG_CHECKING(for src modules)
+
+# dependencies and linker-arguments for test-programs
+TEST_DEPS="${LIB_DIR}/${LIB_PREFIX}${LIB_NAME}${DFT_DEP_SUFFIX} $TEST_DEPS"
+TEST_DEP2="${LIB_2ND}/${LIB_PREFIX}${LIB_NAME}${DFT_DEP_SUFFIX} $TEST_DEP2"
+if test "$DFT_LWR_MODEL" = "libtool"; then
+	TEST_ARGS="${TEST_DEPS}"
+	TEST_ARG2="${TEST_DEP2}"
+else
+	TEST_ARGS="-l${LIB_NAME}${USE_ARG_SUFFIX} $TEST_ARGS"
+	TEST_ARG2="-l${LIB_NAME}${USE_ARG_SUFFIX} $TEST_ARG2"
+fi
+
+PC_MODULES_TO_MAKE="ncurses${USE_ARG_SUFFIX}"
+cf_cv_src_modules=
+for cf_dir in $1
+do
+	if test -f "$srcdir/$cf_dir/modules" ; then
+
+		# We may/may not have tack in the distribution, though the
+		# makefile is.
+		if test "$cf_dir" = tack ; then
+			if test "x$cf_with_tack" != "xyes"; then
+				continue
+			fi
+		fi
+
+		if test -z "$cf_cv_src_modules"; then
+			cf_cv_src_modules=$cf_dir
+		else
+			cf_cv_src_modules="$cf_cv_src_modules $cf_dir"
+		fi
+
+		# Make the ncurses_cfg.h file record the library interface files as
+		# well.  These are header files that are the same name as their
+		# directory.  Ncurses is the only library that does not follow
+		# that pattern.
+		if test "$cf_dir" = tack ; then
+			continue
+		elif test -f "$srcdir/${cf_dir}/${cf_dir}.h" ; then
+			CF_UPPER(cf_have_include,$cf_dir)
+			AC_DEFINE_UNQUOTED(HAVE_${cf_have_include}_H)
+			AC_DEFINE_UNQUOTED(HAVE_LIB${cf_have_include})
+			CF_MAP_LIB_BASENAME(TEST_ROOT,$cf_dir)
+			TEST_DEPS="${LIB_DIR}/${LIB_PREFIX}${TEST_ROOT}${DFT_DEP_SUFFIX} $TEST_DEPS"
+			TEST_DEP2="${LIB_2ND}/${LIB_PREFIX}${TEST_ROOT}${DFT_DEP_SUFFIX} $TEST_DEP2"
+			if test "$DFT_LWR_MODEL" = "libtool"; then
+				TEST_ARGS="${TEST_DEPS}"
+				TEST_ARG2="${TEST_DEP2}"
+			else
+				TEST_ARGS="-l${TEST_ROOT}${USE_ARG_SUFFIX} $TEST_ARGS"
+				TEST_ARG2="-l${TEST_ROOT}${USE_ARG_SUFFIX} $TEST_ARG2"
+			fi
+			PC_MODULES_TO_MAKE="${PC_MODULES_TO_MAKE} ${cf_dir}${USE_ARG_SUFFIX}"
+		fi
+	fi
+done
+AC_MSG_RESULT($cf_cv_src_modules)
+
+TEST_ARGS="-L${LIB_DIR} $TEST_ARGS"
+TEST_ARG2="-L${LIB_2ND} $TEST_ARG2"
+
+AC_SUBST(TEST_ARGS)
+AC_SUBST(TEST_DEPS)
+
+AC_SUBST(TEST_ARG2)
+AC_SUBST(TEST_DEP2)
+
+SRC_SUBDIRS=
+if test "x$cf_with_manpages" != xno ; then
+	SRC_SUBDIRS="$SRC_SUBDIRS man"
+fi
+SRC_SUBDIRS="$SRC_SUBDIRS include"
+for cf_dir in $cf_cv_src_modules
+do
+	SRC_SUBDIRS="$SRC_SUBDIRS $cf_dir"
+done
+if test "x$cf_with_tests" != "xno" ; then
+	SRC_SUBDIRS="$SRC_SUBDIRS test"
+fi
+# always make this, to install the ncurses-config script
+SRC_SUBDIRS="$SRC_SUBDIRS misc"
+if test "$cf_with_cxx_binding" != no; then
+	PC_MODULES_TO_MAKE="${PC_MODULES_TO_MAKE} ncurses++${USE_ARG_SUFFIX}"
+	SRC_SUBDIRS="$SRC_SUBDIRS c++"
+fi
+
+test "x$with_termlib" != xno && PC_MODULES_TO_MAKE="$PC_MODULES_TO_MAKE $TINFO_ARG_SUFFIX"
+test "x$with_ticlib" != xno && PC_MODULES_TO_MAKE="$PC_MODULES_TO_MAKE $TICS_ARG_SUFFIX"
+
+AC_SUBST(PC_MODULES_TO_MAKE)
+
+ADA_SUBDIRS=
+if test "x$cf_with_ada" = "xyes" && test "x$cf_cv_prog_gnat_correct" = xyes && test -f "$srcdir/Ada95/Makefile.in" ; then
+	SRC_SUBDIRS="$SRC_SUBDIRS Ada95"
+	ADA_SUBDIRS="gen src"
+	if test "x$cf_with_tests" != "xno" ; then
+		ADA_SUBDIRS="$ADA_SUBDIRS samples"
+	fi
+fi
+
+SUB_MAKEFILES=
+for cf_dir in $SRC_SUBDIRS
+do
+	SUB_MAKEFILES="$SUB_MAKEFILES $cf_dir/Makefile"
+done
+
+if test -n "$ADA_SUBDIRS"; then
+	for cf_dir in $ADA_SUBDIRS
+	do
+		SUB_MAKEFILES="$SUB_MAKEFILES Ada95/$cf_dir/Makefile"
+	done
+	AC_SUBST(ADA_SUBDIRS)
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_STDCPP_LIBRARY version: 12 updated: 2021/01/01 13:31:04
+dnl -----------------
+dnl Check for -lstdc++, which is GNU's standard C++ library.
+dnl If $CXXLIBS is set, add that to the libraries used for test-linking.
+dnl If -lstdc++ was not already added to $LIBS or $CXXLIBS, and is needed,
+dnl add it to $CXXLIBS.
+AC_DEFUN([CF_STDCPP_LIBRARY],
+[
+if test -n "$GXX" ; then
+
+	cf_save="$LIBS"
+	LIBS="$LIBS $CXXLIBS"
+	AC_MSG_CHECKING(if we already have C++ library)
+	AC_TRY_LINK([
+			#include <iostream>],[
+			std::cout << "Hello World!" << std::endl;],
+		[cf_have_libstdcpp=yes],
+		[cf_have_libstdcpp=no])
+	AC_MSG_RESULT($cf_have_libstdcpp)
+	LIBS="$cf_save"
+
+	if test "$cf_have_libstdcpp" != yes
+	then
+		case "$cf_cv_system_name" in
+		(os2*)
+			if test -z "`g++ -dM -E - < /dev/null | grep __KLIBC__`"; then
+				cf_stdcpp_libname=stdcpp
+			else
+				cf_stdcpp_libname=stdc++
+			fi
+			;;
+		(*)
+			cf_stdcpp_libname=stdc++
+			;;
+		esac
+
+		AC_CACHE_CHECK(for library $cf_stdcpp_libname,cf_cv_libstdcpp,[
+			cf_save="$LIBS"
+			LIBS="$LIBS $CXXLIBS"
+			CF_ADD_LIB($cf_stdcpp_libname)
+		AC_TRY_LINK([
+				#include <iostream>],[
+				std::cout << "Hello World!" << std::endl;],
+			[cf_cv_libstdcpp=yes],
+			[cf_cv_libstdcpp=no])
+			LIBS="$cf_save"
+		])
+		test "$cf_cv_libstdcpp" = yes && { CF_ADD_LIB($cf_stdcpp_libname,CXXLIBS) }
+	fi
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_STRIP_G_OPT version: 4 updated: 2021/01/02 09:31:20
+dnl --------------
+dnl	Remove "-g" option from the compiler options
+AC_DEFUN([CF_STRIP_G_OPT],
+[$1=`echo "${$1}" | CF__SED_TRIMBLANKS(-e 's%-g %%' -e 's%-g$%%')`])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_STRUCT_SIGACTION version: 5 updated: 2012/10/06 17:56:13
+dnl -------------------
+dnl Check if we need _POSIX_SOURCE defined to use struct sigaction.  We'll only
+dnl do this if we've found the sigaction function.
+AC_DEFUN([CF_STRUCT_SIGACTION],[
+AC_REQUIRE([CF_XOPEN_SOURCE])
+
+if test "$ac_cv_func_sigaction" = yes; then
+AC_MSG_CHECKING(whether sigaction needs _POSIX_SOURCE)
+AC_TRY_COMPILE([
+#include <sys/types.h>
+#include <signal.h>],
+	[struct sigaction act],
+	[sigact_bad=no],
+	[
+AC_TRY_COMPILE([
+#define _POSIX_SOURCE
+#include <sys/types.h>
+#include <signal.h>],
+	[struct sigaction act],
+	[sigact_bad=yes
+	 AC_DEFINE(_POSIX_SOURCE,1,[Define to 1 if we must define _POSIX_SOURCE])],
+	 [sigact_bad=unknown])])
+AC_MSG_RESULT($sigact_bad)
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_STRUCT_TERMIOS version: 11 updated: 2020/03/19 20:46:13
+dnl -----------------
+dnl Some machines require _POSIX_SOURCE to completely define struct termios.
+AC_DEFUN([CF_STRUCT_TERMIOS],[
+AC_REQUIRE([CF_XOPEN_SOURCE])
+
+AC_CHECK_HEADERS( \
+termio.h \
+termios.h \
+unistd.h \
+sys/ioctl.h \
+sys/termio.h \
+)
+
+if test "$ac_cv_header_termios_h" = yes ; then
+	case "$CFLAGS $CPPFLAGS" in
+	(*-D_POSIX_SOURCE*)
+		termios_bad=dunno ;;
+	(*)	termios_bad=maybe ;;
+	esac
+	if test "$termios_bad" = maybe ; then
+	AC_MSG_CHECKING(whether termios.h needs _POSIX_SOURCE)
+	AC_TRY_COMPILE([#include <termios.h>],
+		[struct termios foo; int x = foo.c_iflag = 1; (void)x],
+		termios_bad=no, [
+		AC_TRY_COMPILE([
+#define _POSIX_SOURCE
+#include <termios.h>],
+			[struct termios foo; int x = foo.c_iflag = 2; (void)x],
+			termios_bad=unknown,
+			termios_bad=yes AC_DEFINE(_POSIX_SOURCE,1,[Define to 1 if we must define _POSIX_SOURCE]))
+			])
+	AC_MSG_RESULT($termios_bad)
+	fi
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_SUBDIR_PATH version: 7 updated: 2014/12/04 04:33:06
+dnl --------------
+dnl Construct a search-list for a nonstandard header/lib-file
+dnl	$1 = the variable to return as result
+dnl	$2 = the package name
+dnl	$3 = the subdirectory, e.g., bin, include or lib
+AC_DEFUN([CF_SUBDIR_PATH],
+[
+$1=
+
+CF_ADD_SUBDIR_PATH($1,$2,$3,$prefix,NONE)
+
+for cf_subdir_prefix in \
+	/usr \
+	/usr/local \
+	/usr/pkg \
+	/opt \
+	/opt/local \
+	[$]HOME
+do
+	CF_ADD_SUBDIR_PATH($1,$2,$3,$cf_subdir_prefix,$prefix)
+done
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_SUBST_IF version: 2 updated: 2006/06/17 12:33:03
+dnl -----------
+dnl	Shorthand macro for substituting things that the user may override
+dnl	with an environment variable.
+dnl
+dnl	$1 = condition to pass to "test"
+dnl	$2 = environment variable
+dnl	$3 = value if the test succeeds
+dnl	$4 = value if the test fails
+AC_DEFUN([CF_SUBST_IF],
+[
+if test $1 ; then
+	$2=$3
+ifelse($4,,,[else
+	$2=$4])
+fi
+AC_SUBST($2)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_SUBST_NCURSES_VERSION version: 10 updated: 2021/01/04 18:48:01
+dnl ------------------------
+dnl Get the version-number for use in shared-library naming, etc.
+AC_DEFUN([CF_SUBST_NCURSES_VERSION],
+[AC_REQUIRE([AC_PROG_EGREP])dnl
+
+NCURSES_MAJOR="`${EGREP-egrep} '^NCURSES_MAJOR[[ 	]]*=' "$srcdir/dist.mk" | sed -e 's/^[[^0-9]]*//'`"
+NCURSES_MINOR="`${EGREP-egrep} '^NCURSES_MINOR[[ 	]]*=' "$srcdir/dist.mk" | sed -e 's/^[[^0-9]]*//'`"
+NCURSES_PATCH="`${EGREP-egrep} '^NCURSES_PATCH[[ 	]]*=' "$srcdir/dist.mk" | sed -e 's/^[[^0-9]]*//'`"
+cf_cv_abi_version=${NCURSES_MAJOR}
+cf_cv_rel_version=${NCURSES_MAJOR}.${NCURSES_MINOR}
+dnl Show the computed version, for logging
+cf_cv_timestamp=`date`
+AC_MSG_RESULT(Configuring NCURSES $cf_cv_rel_version ABI $cf_cv_abi_version ($cf_cv_timestamp))
+dnl We need these values in the generated headers
+AC_SUBST(NCURSES_MAJOR)
+AC_SUBST(NCURSES_MINOR)
+AC_SUBST(NCURSES_PATCH)
+dnl We need these values in the generated makefiles
+AC_SUBST(cf_cv_rel_version)
+AC_SUBST(cf_cv_abi_version)
+AC_SUBST(cf_cv_builtin_bool)
+AC_SUBST(cf_cv_header_stdbool_h)
+AC_SUBST(cf_cv_type_of_bool)dnl
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_SYS_TIME_SELECT version: 6 updated: 2015/04/18 08:56:57
+dnl ------------------
+dnl Check if we can include <sys/time.h> with <sys/select.h>; this breaks on
+dnl older SCO configurations.
+AC_DEFUN([CF_SYS_TIME_SELECT],
+[
+AC_MSG_CHECKING(if sys/time.h works with sys/select.h)
+AC_CACHE_VAL(cf_cv_sys_time_select,[
+AC_TRY_COMPILE([
+#include <sys/types.h>
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#ifdef HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
+],[],[cf_cv_sys_time_select=yes],
+	 [cf_cv_sys_time_select=no])
+	 ])
+AC_MSG_RESULT($cf_cv_sys_time_select)
+test "$cf_cv_sys_time_select" = yes && AC_DEFINE(HAVE_SYS_TIME_SELECT,1,[Define to 1 if we can include <sys/time.h> with <sys/select.h>])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_TOP_BUILDDIR version: 2 updated: 2013/07/27 17:38:32
+dnl ---------------
+dnl Define a top_builddir symbol, for applications that need an absolute path.
+AC_DEFUN([CF_TOP_BUILDDIR],
+[
+top_builddir=ifelse($1,,`pwd`,$1)
+AC_SUBST(top_builddir)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_TRY_PKG_CONFIG version: 6 updated: 2020/12/31 10:54:15
+dnl -----------------
+dnl This is a simple wrapper to use for pkg-config, for libraries which may be
+dnl available in that form.
+dnl
+dnl $1 = package name, which may be a shell variable
+dnl $2 = extra logic to use, if any, after updating CFLAGS and LIBS
+dnl $3 = logic to use if pkg-config does not have the package
+AC_DEFUN([CF_TRY_PKG_CONFIG],[
+AC_REQUIRE([CF_PKG_CONFIG])
+
+if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists "$1"; then
+	CF_VERBOSE(found package $1)
+	cf_pkgconfig_incs="`$PKG_CONFIG --cflags "$1" 2>/dev/null`"
+	cf_pkgconfig_libs="`$PKG_CONFIG --libs   "$1" 2>/dev/null`"
+	CF_VERBOSE(package $1 CFLAGS: $cf_pkgconfig_incs)
+	CF_VERBOSE(package $1 LIBS: $cf_pkgconfig_libs)
+	CF_ADD_CFLAGS($cf_pkgconfig_incs)
+	CF_ADD_LIBS($cf_pkgconfig_libs)
+	ifelse([$2],,:,[$2])
+else
+	cf_pkgconfig_incs=
+	cf_pkgconfig_libs=
+	ifelse([$3],,:,[$3])
+fi
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_TRY_XOPEN_SOURCE version: 4 updated: 2022/09/10 15:16:16
+dnl -------------------
+dnl If _XOPEN_SOURCE is not defined in the compile environment, check if we
+dnl can define it successfully.
+AC_DEFUN([CF_TRY_XOPEN_SOURCE],[
+AC_CACHE_CHECK(if we should define _XOPEN_SOURCE,cf_cv_xopen_source,[
+	AC_TRY_COMPILE(CF__XOPEN_SOURCE_HEAD,CF__XOPEN_SOURCE_BODY,
+	[cf_cv_xopen_source=no],
+	[cf_save="$CPPFLAGS"
+	 CF_APPEND_TEXT(CPPFLAGS,-D_XOPEN_SOURCE=$cf_XOPEN_SOURCE)
+	 AC_TRY_COMPILE(CF__XOPEN_SOURCE_HEAD,CF__XOPEN_SOURCE_BODY,
+		[cf_cv_xopen_source=no],
+		[cf_cv_xopen_source=$cf_XOPEN_SOURCE])
+		CPPFLAGS="$cf_save"
+	])
+])
+
+if test "$cf_cv_xopen_source" != no ; then
+	CF_REMOVE_DEFINE(CFLAGS,$CFLAGS,_XOPEN_SOURCE)
+	CF_REMOVE_DEFINE(CPPFLAGS,$CPPFLAGS,_XOPEN_SOURCE)
+	cf_temp_xopen_source="-D_XOPEN_SOURCE=$cf_cv_xopen_source"
+	CF_APPEND_CFLAGS($cf_temp_xopen_source)
+fi
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_TYPEOF_CHTYPE version: 10 updated: 2017/01/21 11:06:25
+dnl ----------------
+dnl Determine the type we should use for chtype (and attr_t, which is treated
+dnl as the same thing).  We want around 32 bits, so on most machines want a
+dnl long, but on newer 64-bit machines, probably want an int.  If we're using
+dnl wide characters, we have to have a type compatible with that, as well.
+AC_DEFUN([CF_TYPEOF_CHTYPE],
+[
+AC_MSG_CHECKING([for type of chtype])
+AC_CACHE_VAL(cf_cv_typeof_chtype,[
+		AC_TRY_RUN([
+#define WANT_BITS 31
+#include <stdio.h>
+int main(void)
+{
+	FILE *fp = fopen("cf_test.out", "w");
+	if (fp != 0) {
+		char *result = "long";
+		if (sizeof(unsigned long) > sizeof(unsigned int)) {
+			int n;
+			unsigned int x, y;
+			for (n = 0; n < WANT_BITS; n++) {
+				x = (1 << n);
+				y = (x >> n);
+				if (y != 1 || x == 0) {
+					x = 0;
+					break;
+				}
+			}
+			/*
+			 * If x is nonzero, an int is big enough for the bits
+			 * that we want.
+			 */
+			result = (x != 0) ? "int" : "long";
+		}
+		fputs(result, fp);
+		fclose(fp);
+	}
+	${cf_cv_main_return:-return}(0);
+}
+		],
+		[cf_cv_typeof_chtype=`cat cf_test.out`],
+		[cf_cv_typeof_chtype=long],
+		[cf_cv_typeof_chtype=long])
+		rm -f cf_test.out
+	])
+AC_MSG_RESULT($cf_cv_typeof_chtype)
+
+AC_SUBST(cf_cv_typeof_chtype)
+AC_DEFINE_UNQUOTED(TYPEOF_CHTYPE,$cf_cv_typeof_chtype,[Define to actual type if needed for chtype])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_TYPE_SIGACTION version: 4 updated: 2012/10/06 17:56:13
+dnl -----------------
+dnl
+AC_DEFUN([CF_TYPE_SIGACTION],
+[
+AC_MSG_CHECKING([for type sigaction_t])
+AC_CACHE_VAL(cf_cv_type_sigaction,[
+	AC_TRY_COMPILE([
+#include <signal.h>],
+		[sigaction_t x],
+		[cf_cv_type_sigaction=yes],
+		[cf_cv_type_sigaction=no])])
+AC_MSG_RESULT($cf_cv_type_sigaction)
+test "$cf_cv_type_sigaction" = yes && AC_DEFINE(HAVE_TYPE_SIGACTION,1,[Define to 1 if we have the sigaction_t type])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_UNSIGNED_LITERALS version: 2 updated: 1998/02/07 22:10:16
+dnl --------------------
+dnl Test if the compiler supports 'U' and 'L' suffixes.  Only old compilers
+dnl won't, but they're still there.
+AC_DEFUN([CF_UNSIGNED_LITERALS],
+[
+AC_MSG_CHECKING([if unsigned literals are legal])
+AC_CACHE_VAL(cf_cv_unsigned_literals,[
+	AC_TRY_COMPILE([],[long x = 1L + 1UL + 1U + 1],
+		[cf_cv_unsigned_literals=yes],
+		[cf_cv_unsigned_literals=no])
+	])
+AC_MSG_RESULT($cf_cv_unsigned_literals)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_UPPER version: 5 updated: 2001/01/29 23:40:59
+dnl --------
+dnl Make an uppercase version of a variable
+dnl $1=uppercase($2)
+AC_DEFUN([CF_UPPER],
+[
+$1=`echo "$2" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_UTF8_LIB version: 9 updated: 2021/05/19 19:35:25
+dnl -----------
+dnl Check for multibyte support, and if not found, utf8 compatibility library
+AC_DEFUN([CF_UTF8_LIB],
+[
+AC_HAVE_HEADERS(wchar.h)
+AC_CACHE_CHECK(for multibyte character support,cf_cv_utf8_lib,[
+	cf_save_LIBS="$LIBS"
+	AC_TRY_LINK([
+#include <stdlib.h>
+#include <stdio.h>
+#ifdef HAVE_WCHAR_H
+#include <wchar.h>
+#endif
+],[putwc(0,0);],
+	[cf_cv_utf8_lib=yes],
+	[CF_FIND_LINKAGE([
+#include <libutf8.h>],[putwc(0,0);],utf8,
+		[cf_cv_utf8_lib=add-on],
+		[cf_cv_utf8_lib=no])
+])])
+
+# HAVE_LIBUTF8_H is used by ncurses if curses.h is shared between
+# ncurses/ncursesw:
+if test "$cf_cv_utf8_lib" = "add-on" ; then
+	AC_DEFINE(HAVE_LIBUTF8_H,1,[Define to 1 if we should include libutf8.h])
+	CF_ADD_INCDIR($cf_cv_header_path_utf8)
+	CF_ADD_LIBDIR($cf_cv_library_path_utf8)
+	CF_ADD_LIBS($cf_cv_library_file_utf8)
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_VA_COPY version: 6 updated: 2018/12/04 18:14:25
+dnl ----------
+dnl check for va_copy, part of stdarg.h starting with ISO C 1999.
+dnl Also, workaround for glibc's __va_copy, by checking for both.
+dnl Finally, try to accommodate pre-ISO C 1999 headers.
+AC_DEFUN([CF_VA_COPY],[
+AC_CACHE_CHECK(for va_copy, cf_cv_have_va_copy,[
+AC_TRY_LINK([
+#include <stdarg.h>
+],[
+	static va_list dst;
+	static va_list src;
+	va_copy(dst, src)],
+	cf_cv_have_va_copy=yes,
+	cf_cv_have_va_copy=no)])
+
+if test "$cf_cv_have_va_copy" = yes;
+then
+	AC_DEFINE(HAVE_VA_COPY,1,[Define to 1 if we have va_copy])
+else # !cf_cv_have_va_copy
+
+AC_CACHE_CHECK(for __va_copy, cf_cv_have___va_copy,[
+AC_TRY_LINK([
+#include <stdarg.h>
+],[
+	static va_list dst;
+	static va_list src;
+	__va_copy(dst, src)],
+	cf_cv_have___va_copy=yes,
+	cf_cv_have___va_copy=no)])
+
+if test "$cf_cv_have___va_copy" = yes
+then
+	AC_DEFINE(HAVE___VA_COPY,1,[Define to 1 if we have __va_copy])
+else # !cf_cv_have___va_copy
+
+AC_CACHE_CHECK(for __builtin_va_copy, cf_cv_have___builtin_va_copy,[
+AC_TRY_LINK([
+#include <stdarg.h>
+],[
+	static va_list dst;
+	static va_list src;
+	__builtin_va_copy(dst, src)],
+	cf_cv_have___builtin_va_copy=yes,
+	cf_cv_have___builtin_va_copy=no)])
+
+test "$cf_cv_have___builtin_va_copy" = yes &&
+	AC_DEFINE(HAVE___BUILTIN_VA_COPY,1,[Define to 1 if we have __builtin_va_copy])
+
+fi # cf_cv_have___va_copy
+
+fi # cf_cv_have_va_copy
+
+case "${cf_cv_have_va_copy}${cf_cv_have___va_copy}${cf_cv_have___builtin_va_copy}" in
+(*yes*)
+	;;
+
+(*)
+	AC_CACHE_CHECK(if we can simply copy va_list, cf_cv_pointer_va_list,[
+AC_TRY_LINK([
+#include <stdarg.h>
+],[
+	va_list dst;
+	va_list src;
+	dst = src],
+	cf_cv_pointer_va_list=yes,
+	cf_cv_pointer_va_list=no)])
+
+	if test "$cf_cv_pointer_va_list" = no
+	then
+		AC_CACHE_CHECK(if we can copy va_list indirectly, cf_cv_array_va_list,[
+AC_TRY_LINK([
+#include <stdarg.h>
+],[
+	va_list dst;
+	va_list src;
+	*dst = *src],
+			cf_cv_array_va_list=yes,
+			cf_cv_array_va_list=no)])
+		test "$cf_cv_array_va_list" = yes && AC_DEFINE(ARRAY_VA_LIST,1,[Define to 1 if we can copy va_list indirectly])
+	fi
+	;;
+esac
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_VERBOSE version: 3 updated: 2007/07/29 09:55:12
+dnl ----------
+dnl Use AC_VERBOSE w/o the warnings
+AC_DEFUN([CF_VERBOSE],
+[test -n "$verbose" && echo "	$1" 1>&AC_FD_MSG
+CF_MSG_LOG([$1])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_VERSION_INFO version: 8 updated: 2021/01/01 13:31:04
+dnl ---------------
+dnl Define several useful symbols derived from the VERSION file.  A separate
+dnl file is preferred to embedding the version numbers in various scripts.
+dnl (automake is a textbook-example of why the latter is a bad idea, but there
+dnl are others).
+dnl
+dnl The file contents are:
+dnl	libtool-version	release-version	patch-version
+dnl or
+dnl	release-version
+dnl where
+dnl	libtool-version (see ?) consists of 3 integers separated by '.'
+dnl	release-version consists of a major version and minor version
+dnl		separated by '.', optionally followed by a patch-version
+dnl		separated by '-'.  The minor version need not be an
+dnl		integer (but it is preferred).
+dnl	patch-version is an integer in the form yyyymmdd, so ifdef's and
+dnl		scripts can easily compare versions.
+dnl
+dnl If libtool is used, the first form is required, since CF_WITH_LIBTOOL
+dnl simply extracts the first field using 'cut -f1'.
+dnl
+dnl Optional parameters:
+dnl $1 = internal name for package
+dnl $2 = external name for package
+AC_DEFUN([CF_VERSION_INFO],
+[
+if test -f "$srcdir/VERSION" ; then
+	AC_MSG_CHECKING(for package version)
+
+	# if there are not enough fields, cut returns the last one...
+	cf_field1=`sed -e '2,$d' "$srcdir/VERSION" |cut -f1`
+	cf_field2=`sed -e '2,$d' "$srcdir/VERSION" |cut -f2`
+	cf_field3=`sed -e '2,$d' "$srcdir/VERSION" |cut -f3`
+
+	# this is how CF_BUNDLED_INTL uses $VERSION:
+	VERSION="$cf_field1"
+
+	VERSION_MAJOR=`echo "$cf_field2" | sed -e 's/\..*//'`
+	test -z "$VERSION_MAJOR" && AC_MSG_ERROR(missing major-version)
+
+	VERSION_MINOR=`echo "$cf_field2" | sed -e 's/^[[^.]]*\.//' -e 's/-.*//'`
+	test -z "$VERSION_MINOR" && AC_MSG_ERROR(missing minor-version)
+
+	AC_MSG_RESULT(${VERSION_MAJOR}.${VERSION_MINOR})
+
+	AC_MSG_CHECKING(for package patch date)
+	VERSION_PATCH=`echo "$cf_field3" | sed -e 's/^[[^-]]*-//'`
+	case .$VERSION_PATCH in
+	(.)
+		AC_MSG_ERROR(missing patch-date $VERSION_PATCH)
+		;;
+	(.[[0-9]][[0-9]][[0-9]][[0-9]][[0-9]][[0-9]][[0-9]][[0-9]])
+		;;
+	(*)
+		AC_MSG_ERROR(illegal patch-date $VERSION_PATCH)
+		;;
+	esac
+	AC_MSG_RESULT($VERSION_PATCH)
+else
+	AC_MSG_ERROR(did not find $srcdir/VERSION)
+fi
+
+# show the actual data that we have for versions:
+CF_VERBOSE(ABI VERSION $VERSION)
+CF_VERBOSE(VERSION_MAJOR $VERSION_MAJOR)
+CF_VERBOSE(VERSION_MINOR $VERSION_MINOR)
+CF_VERBOSE(VERSION_PATCH $VERSION_PATCH)
+
+AC_SUBST(VERSION)
+AC_SUBST(VERSION_MAJOR)
+AC_SUBST(VERSION_MINOR)
+AC_SUBST(VERSION_PATCH)
+
+dnl if a package name is given, define its corresponding version info.  We
+dnl need the package name to ensure that the defined symbols are unique.
+ifelse($1,,,[
+	cf_PACKAGE=$1
+	PACKAGE=ifelse($2,,$1,$2)
+	AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE",[Define to the package-name])
+	AC_SUBST(PACKAGE)
+	CF_UPPER(cf_PACKAGE,$cf_PACKAGE)
+	AC_DEFINE_UNQUOTED(${cf_PACKAGE}_VERSION,"${VERSION_MAJOR}.${VERSION_MINOR}")
+	AC_DEFINE_UNQUOTED(${cf_PACKAGE}_PATCHDATE,${VERSION_PATCH})
+])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WCHAR_TYPE version: 4 updated: 2012/10/06 16:39:58
+dnl -------------
+dnl Check if type wide-character type $1 is declared, and if so, which header
+dnl file is needed.  The second parameter is used to set a shell variable when
+dnl the type is not found.  The first parameter sets a shell variable for the
+dnl opposite sense.
+AC_DEFUN([CF_WCHAR_TYPE],
+[
+# This is needed on Tru64 5.0 to declare $1
+AC_CACHE_CHECK(if we must include wchar.h to declare $1,cf_cv_$1,[
+AC_TRY_COMPILE([
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stdio.h>
+#ifdef HAVE_LIBUTF8_H
+#include <libutf8.h>
+#endif],
+	[$1 state],
+	[cf_cv_$1=no],
+	[AC_TRY_COMPILE([
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <wchar.h>
+#ifdef HAVE_LIBUTF8_H
+#include <libutf8.h>
+#endif],
+	[$1 value],
+	[cf_cv_$1=yes],
+	[cf_cv_$1=unknown])])])
+
+if test "$cf_cv_$1" = yes ; then
+	AC_DEFINE(NEED_WCHAR_H,1,[Define to 1 if we must include wchar.h])
+	NEED_WCHAR_H=1
+fi
+
+ifelse([$2],,,[
+# if we do not find $1 in either place, use substitution to provide a fallback.
+if test "$cf_cv_$1" = unknown ; then
+	$2=1
+fi
+])
+ifelse($3,,,[
+# if we find $1 in either place, use substitution to provide a fallback.
+if test "$cf_cv_$1" != unknown ; then
+	$3=1
+fi
+])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WEAK_SYMBOLS version: 1 updated: 2008/08/16 19:18:06
+dnl ---------------
+dnl Check for compiler-support for weak symbols.
+dnl This works with "recent" gcc.
+AC_DEFUN([CF_WEAK_SYMBOLS],[
+AC_CACHE_CHECK(if $CC supports weak symbols,cf_cv_weak_symbols,[
+
+AC_TRY_COMPILE([
+#include <stdio.h>],
+[
+#if defined(__GNUC__)
+#  if defined __USE_ISOC99
+#    define _cat_pragma(exp)	_Pragma(#exp)
+#    define _weak_pragma(exp)	_cat_pragma(weak name)
+#  else
+#    define _weak_pragma(exp)
+#  endif
+#  define _declare(name)	__extension__ extern __typeof__(name) name
+#  define weak_symbol(name)	_weak_pragma(name) _declare(name) __attribute__((weak))
+#endif
+
+weak_symbol(fopen);
+],[cf_cv_weak_symbols=yes],[cf_cv_weak_symbols=no])
+])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_ABI_VERSION version: 4 updated: 2021/01/01 13:31:04
+dnl -------------------
+dnl Allow library's ABI to be overridden.  Generally this happens when a
+dnl packager has incremented the ABI past that used in the original package,
+dnl and wishes to keep doing this.
+dnl
+dnl $1 is the package name, if any, to derive a corresponding {package}_ABI
+dnl symbol.
+AC_DEFUN([CF_WITH_ABI_VERSION],[
+test -z "$cf_cv_abi_version" && cf_cv_abi_version=0
+AC_ARG_WITH(abi-version,
+[  --with-abi-version=XXX  override derived ABI version],[
+	if test "x$cf_cv_abi_version" != "x$withval"
+	then
+		AC_MSG_WARN(overriding ABI version $cf_cv_abi_version to $withval)
+		case "$cf_cv_rel_version" in
+		(5.*)
+			cf_cv_rel_version=$withval.0
+			;;
+		(6.*)
+			cf_cv_rel_version=$withval.9	# FIXME: should be 10 as of 6.0 release
+			;;
+		esac
+	fi
+	cf_cv_abi_version=$withval])
+	CF_NUMBER_SYNTAX($cf_cv_abi_version,ABI version)
+ifelse($1,,,[
+$1_ABI=$cf_cv_abi_version
+])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_ADA_COMPILER version: 2 updated: 2010/06/26 17:35:58
+dnl --------------------
+dnl Command-line option to specify the Ada95 compiler.
+AC_DEFUN([CF_WITH_ADA_COMPILER],[
+AC_MSG_CHECKING(for ada-compiler)
+AC_ARG_WITH(ada-compiler,
+	[  --with-ada-compiler=CMD specify Ada95 compiler command (default gnatmake)],
+	[cf_ada_compiler=$withval],
+	[cf_ada_compiler=gnatmake])
+AC_SUBST(cf_ada_compiler)
+AC_MSG_RESULT($cf_ada_compiler)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_ADA_INCLUDE version: 2 updated: 2010/06/26 17:35:58
+dnl -------------------
+dnl Command-line option to specify where Ada includes will install.
+AC_DEFUN([CF_WITH_ADA_INCLUDE],[
+AC_MSG_CHECKING(for ada-include)
+CF_WITH_PATH(ada-include,
+   [  --with-ada-include=DIR  Ada includes are in DIR],
+   ADA_INCLUDE,
+   PREFIX/share/ada/adainclude,
+   [$]prefix/share/ada/adainclude)
+AC_SUBST(ADA_INCLUDE)
+AC_MSG_RESULT($ADA_INCLUDE)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_ADA_LIBNAME version: 1 updated: 2019/09/07 18:59:41
+dnl -------------------
+dnl CF_WITH_ADA_LIBNAME
+dnl -------------------
+dnl Command-line option to specify how to name the resulting Ada library.
+dnl $1 = default value
+AC_DEFUN([CF_WITH_ADA_LIBNAME],[
+AC_MSG_CHECKING(for ada-libname)
+AC_ARG_WITH(ada-libname,
+   [  --with-ada-libname=XXX  override default Ada library-name],
+   ADA_LIBNAME=[$]withval,
+   ADA_LIBNAME=$1)
+case "x$ADA_LIBNAME" in
+(x|xyes|xno)
+	ADA_LIBNAME=$1
+	;;
+esac
+AC_SUBST(ADA_LIBNAME)
+AC_MSG_RESULT($ADA_LIBNAME)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_ADA_OBJECTS version: 2 updated: 2010/06/26 17:35:58
+dnl -------------------
+dnl Command-line option to specify where Ada objects will install.
+AC_DEFUN([CF_WITH_ADA_OBJECTS],[
+AC_MSG_CHECKING(for ada-objects)
+CF_WITH_PATH(ada-objects,
+   [  --with-ada-objects=DIR  Ada objects are in DIR],
+   ADA_OBJECTS,
+   PREFIX/lib/ada/adalib,
+   [$]prefix/lib/ada/adalib)
+AC_SUBST(ADA_OBJECTS)
+AC_MSG_RESULT($ADA_OBJECTS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_ADA_SHAREDLIB version: 5 updated: 2018/07/21 19:10:35
+dnl ---------------------
+dnl Command-line option to specify if an Ada95 shared-library should be built,
+dnl and optionally what its soname should be.
+AC_DEFUN([CF_WITH_ADA_SHAREDLIB],[
+AC_REQUIRE([CF_GNAT_PROJECTS])
+AC_MSG_CHECKING(if an Ada95 shared-library should be built)
+AC_ARG_WITH(ada-sharedlib,
+	[  --with-ada-sharedlib=soname build shared-library (requires GNAT projects)],
+	[with_ada_sharedlib=$withval],
+	[with_ada_sharedlib=no])
+AC_MSG_RESULT($with_ada_sharedlib)
+
+if test "x$with_ada_sharedlib" != xno
+then
+	if test "x$cf_gnat_projects" != xyes
+	then
+		AC_MSG_WARN(disabling shared-library since GNAT projects are not supported)
+		with_ada_sharedlib=no
+	fi
+fi
+
+ADA_SHAREDLIB='lib$(LIB_NAME).so.1'
+MAKE_ADA_SHAREDLIB="#"
+
+if test "x$with_ada_sharedlib" != xno
+then
+	MAKE_ADA_SHAREDLIB=
+	if test "x$with_ada_sharedlib" != xyes
+	then
+		ADA_SHAREDLIB="$with_ada_sharedlib"
+	fi
+fi
+
+AC_SUBST(ADA_SHAREDLIB)
+AC_SUBST(MAKE_ADA_SHAREDLIB)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_DBMALLOC version: 7 updated: 2010/06/21 17:26:47
+dnl ----------------
+dnl Configure-option for dbmalloc.  The optional parameter is used to override
+dnl the updating of $LIBS, e.g., to avoid conflict with subsequent tests.
+AC_DEFUN([CF_WITH_DBMALLOC],[
+CF_NO_LEAKS_OPTION(dbmalloc,
+	[  --with-dbmalloc         test: use Conor Cahill's dbmalloc library],
+	[USE_DBMALLOC])
+
+if test "$with_dbmalloc" = yes ; then
+	AC_CHECK_HEADER(dbmalloc.h,
+		[AC_CHECK_LIB(dbmalloc,[debug_malloc]ifelse([$1],,[],[,$1]))])
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_DMALLOC version: 7 updated: 2010/06/21 17:26:47
+dnl ---------------
+dnl Configure-option for dmalloc.  The optional parameter is used to override
+dnl the updating of $LIBS, e.g., to avoid conflict with subsequent tests.
+AC_DEFUN([CF_WITH_DMALLOC],[
+CF_NO_LEAKS_OPTION(dmalloc,
+	[  --with-dmalloc          test: use Gray Watson's dmalloc library],
+	[USE_DMALLOC])
+
+if test "$with_dmalloc" = yes ; then
+	AC_CHECK_HEADER(dmalloc.h,
+		[AC_CHECK_LIB(dmalloc,[dmalloc_debug]ifelse([$1],,[],[,$1]))])
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_EXPORT_SYMS version: 3 updated: 2014/12/20 19:16:08
+dnl -------------------
+dnl Use this with libtool to specify the list of symbols that may be exported.
+dnl The input file contains one symbol per line; comments work with "#".
+dnl
+dnl $1 = basename of the ".sym" file (default $PACKAGE)
+AC_DEFUN([CF_WITH_EXPORT_SYMS],
+[
+AC_MSG_CHECKING(if exported-symbols file should be used)
+AC_ARG_WITH(export-syms,
+	[  --with-export-syms=XXX  limit exported symbols using libtool],
+	[with_export_syms=$withval],
+	[with_export_syms=no])
+if test "x$with_export_syms" = xyes
+then
+	with_export_syms='${top_srcdir}/package/ifelse($1,,${PACKAGE},[$1]).sym'
+	AC_SUBST(PACKAGE)
+fi
+AC_MSG_RESULT($with_export_syms)
+if test "x$with_export_syms" != xno
+then
+	EXPORT_SYMS="-export-symbols $with_export_syms"
+	AC_SUBST(EXPORT_SYMS)
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_GPM version: 10 updated: 2017/04/29 18:32:18
+dnl -----------
+dnl
+dnl The option parameter (if neither yes/no) is assumed to be the name of
+dnl the gpm library, e.g., for dynamic loading.
+AC_DEFUN([CF_WITH_GPM],
+[
+AC_MSG_CHECKING(if you want to link with the GPM mouse library)
+AC_ARG_WITH(gpm,
+	[  --with-gpm              use Alessandro Rubini's GPM library],
+	[with_gpm=$withval],
+	[with_gpm=maybe])
+AC_MSG_RESULT($with_gpm)
+
+if test "$with_gpm" != no ; then
+	AC_CHECK_HEADER(gpm.h,[
+		AC_DEFINE(HAVE_GPM_H,1,[Define to 1 if we have gpm.h header])
+		if test "$with_gpm" != yes && test "$with_gpm" != maybe ; then
+			CF_VERBOSE(assuming we really have GPM library)
+			AC_DEFINE(HAVE_LIBGPM,1,[Define to 1 if we have the gpm library])
+			with_gpm=yes
+		else
+			AC_CHECK_LIB(gpm,Gpm_Open,[with_gpm=yes],[
+				if test "$with_gpm" = maybe; then
+					AC_MSG_WARN(Cannot link with GPM library)
+					with_gpm=no
+				else
+					AC_MSG_ERROR(Cannot link with GPM library)
+				fi
+			])
+		fi
+	],[
+		test "$with_gpm" != maybe && AC_MSG_WARN(Cannot find GPM header)
+		with_gpm=no
+	])
+fi
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_LIBTOOL version: 36 updated: 2021/01/01 13:31:04
+dnl ---------------
+dnl Provide a configure option to incorporate libtool.  Define several useful
+dnl symbols for the makefile rules.
+dnl
+dnl The reference to AC_PROG_LIBTOOL does not normally work, since it uses
+dnl macros from libtool.m4 which is in the aclocal directory of automake.
+dnl Following is a simple script which turns on the AC_PROG_LIBTOOL macro.
+dnl But that still does not work properly since the macro is expanded outside
+dnl the CF_WITH_LIBTOOL macro:
+dnl
+dnl	#!/bin/sh
+dnl	ACLOCAL=`aclocal --print-ac-dir`
+dnl	if test -z "$ACLOCAL" ; then
+dnl		echo cannot find aclocal directory
+dnl		exit 1
+dnl	elif test ! -f $ACLOCAL/libtool.m4 ; then
+dnl		echo cannot find libtool.m4 file
+dnl		exit 1
+dnl	fi
+dnl
+dnl	LOCAL=aclocal.m4
+dnl	ORIG=aclocal.m4.orig
+dnl
+dnl	trap "mv $ORIG $LOCAL" 0 1 2 3 15
+dnl	rm -f $ORIG
+dnl	mv $LOCAL $ORIG
+dnl
+dnl	# sed the LIBTOOL= assignment to omit the current directory?
+dnl	sed -e 's/^LIBTOOL=.*/LIBTOOL=${LIBTOOL:-libtool}/' $ACLOCAL/libtool.m4 >>$LOCAL
+dnl	cat $ORIG >>$LOCAL
+dnl
+dnl	autoconf-257 $*
+dnl
+AC_DEFUN([CF_WITH_LIBTOOL],
+[
+AC_REQUIRE([CF_DISABLE_LIBTOOL_VERSION])
+ifdef([AC_PROG_LIBTOOL],,[
+LIBTOOL=
+])
+# common library maintenance symbols that are convenient for libtool scripts:
+LIB_CREATE='${AR} -cr'
+LIB_OBJECT='${OBJECTS}'
+LIB_SUFFIX=.a
+LIB_PREP="$RANLIB"
+
+# symbols used to prop libtool up to enable it to determine what it should be
+# doing:
+LIB_CLEAN=
+LIB_COMPILE=
+LIB_LINK='${CC}'
+LIB_INSTALL=
+LIB_UNINSTALL=
+
+AC_MSG_CHECKING(if you want to build libraries with libtool)
+AC_ARG_WITH(libtool,
+	[  --with-libtool          generate libraries with libtool],
+	[with_libtool=$withval],
+	[with_libtool=no])
+AC_MSG_RESULT($with_libtool)
+if test "$with_libtool" != "no"; then
+ifdef([AC_PROG_LIBTOOL],[
+	# missing_content_AC_PROG_LIBTOOL{{
+	AC_PROG_LIBTOOL
+	# missing_content_AC_PROG_LIBTOOL}}
+],[
+	if test "$with_libtool" != "yes" ; then
+		CF_PATH_SYNTAX(with_libtool)
+		LIBTOOL=$with_libtool
+	else
+		AC_CHECK_TOOLS(LIBTOOL,[libtool glibtool],none)
+		CF_LIBTOOL_VERSION
+		if test -z "$cf_cv_libtool_version" && test "$LIBTOOL" = libtool
+		then
+			CF_FORGET_TOOL(LIBTOOL)
+			AC_CHECK_TOOLS(LIBTOOL,[glibtool],none)
+			CF_LIBTOOL_VERSION
+		fi
+	fi
+	if test -z "$LIBTOOL" ; then
+		AC_MSG_ERROR(Cannot find libtool)
+	fi
+])dnl
+	LIB_CREATE='${LIBTOOL} --mode=link ${CC} -rpath ${libdir} ${LIBTOOL_VERSION} `cut -f1 ${top_srcdir}/VERSION` ${LIBTOOL_OPTS} ${LT_UNDEF} $(LIBS) -o'
+	LIB_OBJECT='${OBJECTS:.o=.lo}'
+	LIB_SUFFIX=.la
+	LIB_CLEAN='${LIBTOOL} --mode=clean'
+	LIB_COMPILE='${LIBTOOL} --mode=compile'
+	LIB_LINK='${LIBTOOL} --mode=link ${CC} ${LIBTOOL_OPTS}'
+	LIB_INSTALL='${LIBTOOL} --mode=install'
+	LIB_UNINSTALL='${LIBTOOL} --mode=uninstall'
+	LIB_PREP=:
+
+	CF_CHECK_LIBTOOL_VERSION
+
+	# special hack to add -no-undefined (which libtool should do for itself)
+	LT_UNDEF=
+	case "$cf_cv_system_name" in
+	(cygwin*|msys*|mingw32*|os2*|uwin*|aix[[4-7]])
+		LT_UNDEF=-no-undefined
+		;;
+	esac
+	AC_SUBST([LT_UNDEF])
+
+	# special hack to add --tag option for C++ compiler
+	case "$cf_cv_libtool_version" in
+	(1.[[5-9]]*|[[2-9]].[[0-9.a-z]]*)
+		LIBTOOL_CXX="$LIBTOOL --tag=CXX"
+		LIBTOOL="$LIBTOOL --tag=CC"
+		;;
+	(*)
+		LIBTOOL_CXX="$LIBTOOL"
+		;;
+	esac
+else
+	LIBTOOL=""
+	LIBTOOL_CXX=""
+fi
+
+test -z "$LIBTOOL" && ECHO_LT=
+
+AC_SUBST(LIBTOOL)
+AC_SUBST(LIBTOOL_CXX)
+AC_SUBST(LIBTOOL_OPTS)
+
+AC_SUBST(LIB_CREATE)
+AC_SUBST(LIB_OBJECT)
+AC_SUBST(LIB_SUFFIX)
+AC_SUBST(LIB_PREP)
+
+AC_SUBST(LIB_CLEAN)
+AC_SUBST(LIB_COMPILE)
+AC_SUBST(LIB_LINK)
+AC_SUBST(LIB_INSTALL)
+AC_SUBST(LIB_UNINSTALL)
+
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_LIBTOOL_OPTS version: 4 updated: 2015/04/17 21:13:04
+dnl --------------------
+dnl Allow user to pass additional libtool options into the library creation
+dnl and link steps.  The main use for this is to do something like
+dnl	./configure --with-libtool-opts=-static
+dnl to get the same behavior as automake-flavored
+dnl	./configure --enable-static
+AC_DEFUN([CF_WITH_LIBTOOL_OPTS],[
+AC_MSG_CHECKING(for additional libtool options)
+AC_ARG_WITH(libtool-opts,
+	[  --with-libtool-opts=XXX specify additional libtool options],
+	[with_libtool_opts=$withval],
+	[with_libtool_opts=no])
+AC_MSG_RESULT($with_libtool_opts)
+
+case .$with_libtool_opts in
+(.yes|.no|.)
+	;;
+(*)
+	LIBTOOL_OPTS="$LIBTOOL_OPTS $with_libtool_opts"
+	;;
+esac
+
+AC_SUBST(LIBTOOL_OPTS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_LIB_BASENAME version: 1 updated: 2020/03/07 20:05:14
+dnl --------------------
+dnl Allow for overriding the basename of a library, i.e., the part to which
+dnl prefixes/suffixes are attached.
+dnl
+dnl $1 = variable to set
+dnl $2 = option name
+dnl $3 = default basename for library, if omitted use $2
+AC_DEFUN([CF_WITH_LIB_BASENAME],
+[
+AC_MSG_CHECKING(for desired basename for $2 library)
+AC_ARG_WITH($2-libname,
+	[  --with-$2-libname=XXX override ifelse($3,,$2,$3) basename of library],
+	[with_lib_basename=$withval],
+	[with_lib_basename=ifelse($3,,$2,$3)])
+$1="$with_lib_basename"
+
+case "x[$]$1" in
+(x|xno|xnone|xyes)
+	$1=ifelse($3,,$2,$3)
+	;;
+(*)
+	;;
+esac
+
+AC_MSG_RESULT([$]$1)
+AC_SUBST($1)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_LIB_PREFIX version: 2 updated: 2021/01/01 16:53:59
+dnl ------------------
+dnl Allow the library-prefix to be overridden.  OS/2 EMX originally had no
+dnl "lib" prefix, e.g., because it used the dll naming convention.
+dnl
+dnl $1 = variable to set
+AC_DEFUN([CF_WITH_LIB_PREFIX],
+[
+AC_MSG_CHECKING(if you want to have a library-prefix)
+AC_ARG_WITH(lib-prefix,
+	[  --with-lib-prefix       override library-prefix],
+	[with_lib_prefix=$withval],
+	[with_lib_prefix=auto])
+AC_MSG_RESULT($with_lib_prefix)
+
+if test "$with_lib_prefix" = auto
+then
+	CF_LIB_PREFIX($1)
+elif test "$with_lib_prefix" = no
+then
+	LIB_PREFIX=
+else
+	LIB_PREFIX=$with_lib_prefix
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_PATH version: 12 updated: 2021/09/04 06:35:04
+dnl ------------
+dnl Wrapper for AC_ARG_WITH to ensure that user supplies a pathname, not just
+dnl defaulting to yes/no.
+dnl
+dnl $1 = option name
+dnl $2 = help-text
+dnl $3 = environment variable to set
+dnl $4 = default value, shown in the help-message, must be a constant
+dnl $5 = default value, if it is an expression & cannot be in the help-message
+dnl
+AC_DEFUN([CF_WITH_PATH],
+[AC_ARG_WITH($1,[$2 ](default: ifelse([$4],,empty,[$4])),,
+ifelse([$4],,[withval="${$3}"],[withval="${$3:-ifelse([$5],,[$4],[$5])}"]))dnl
+if ifelse([$5],,true,[test -n "$5"]) ; then
+CF_PATH_SYNTAX(withval)
+fi
+eval $3="$withval"
+AC_SUBST($3)dnl
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_PATHLIST version: 13 updated: 2021/09/04 06:35:04
+dnl ----------------
+dnl Process an option specifying a list of colon-separated paths.
+dnl
+dnl $1 = option name
+dnl $2 = help-text
+dnl $3 = environment variable to set
+dnl $4 = default value, shown in the help-message, must be a constant
+dnl $5 = default value, if it is an expression & cannot be in the help-message
+dnl $6 = flag to tell if we want to define or substitute
+dnl
+AC_DEFUN([CF_WITH_PATHLIST],[
+AC_REQUIRE([CF_PATHSEP])
+AC_ARG_WITH($1,[$2 ](default: ifelse($4,,empty,$4)),,
+ifelse($4,,[withval=${$3}],[withval=${$3:-ifelse($5,,$4,$5)}]))dnl
+
+IFS="${IFS:- 	}"; ac_save_ifs="$IFS"; IFS="${PATH_SEPARATOR}"
+cf_dst_path=
+for cf_src_path in $withval
+do
+  CF_PATH_SYNTAX(cf_src_path)
+  test -n "$cf_dst_path" && cf_dst_path="${cf_dst_path}$PATH_SEPARATOR"
+  cf_dst_path="${cf_dst_path}${cf_src_path}"
+done
+IFS="$ac_save_ifs"
+
+ifelse($6,define,[
+# Strip single quotes from the value, e.g., when it was supplied as a literal
+# for $4 or $5.
+case "$cf_dst_path" in
+(\'*)
+  cf_dst_path="`echo "$cf_dst_path" |sed -e s/\'// -e s/\'\$//`"
+  ;;
+esac
+cf_dst_path=`echo "$cf_dst_path" | sed -e 's/\\\\/\\\\\\\\/g'`
+])
+
+# This may use the prefix/exec_prefix symbols which will only yield "NONE"
+# so we have to check/work around.  We do prefer the result of "eval"...
+eval cf_dst_eval="$cf_dst_path"
+case "x$cf_dst_eval" in
+(xNONE*)
+	$3=$cf_dst_path
+	;;
+(*)
+	$3="$cf_dst_eval"
+	;;
+esac
+AC_SUBST($3)dnl
+
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_PATH_PROG version: 1 updated: 2019/06/30 19:44:43
+dnl -----------------
+dnl Check for a given program, like CF_PATH_PROG, but allow override using a
+dnl "--with-xxx" option.
+dnl
+dnl Parameters:
+dnl		$1 = environment variable to set/update
+dnl		$2 = program name
+dnl		$3 = help-text
+dnl		$4 = $PATH
+AC_DEFUN([CF_WITH_PATH_PROG],[
+AC_ARG_WITH($2-path,
+	[  --with-$2-path=XXX     specify path of $2 ifelse($3,,,$3)],
+	[AC_MSG_CHECKING(for $2 program ifelse($3,,,$3))
+		$1=$withval
+		AC_MSG_RESULT([$]$1)
+		CF_PATH_SYNTAX($1)
+	],
+	[CF_PATH_PROG($1,$2,,ifelse($4,,,$4))
+		if test -z "[$]$1"
+		then
+			AC_MSG_WARN(no $2 program found ifelse($3,,,$3))
+		fi
+	])
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_PCRE2 version: 6 updated: 2021/08/11 20:35:34
+dnl -------------
+dnl Add PCRE2 (Perl-compatible regular expressions v2) to the build if it is
+dnl available and the user requests it.  Assume the application will otherwise
+dnl use the POSIX interface.
+dnl
+dnl TODO allow $withval to specify package location
+AC_DEFUN([CF_WITH_PCRE2],
+[
+AC_REQUIRE([CF_PKG_CONFIG])
+
+AC_MSG_CHECKING(if you want to use PCRE2 for regular-expressions)
+AC_ARG_WITH(pcre2,
+	[  --with-pcre2            use PCRE2 for regular-expressions])
+test -z "$with_pcre2" && with_pcre2=no
+AC_MSG_RESULT($with_pcre2)
+
+if test "x$with_pcre2" != xno ; then
+	cf_with_pcre2_ok=no
+	for cf_with_pcre2 in libpcre2 libpcre2-posix libpcre
+	do
+		CF_TRY_PKG_CONFIG($cf_with_pcre2,[cf_with_pcre2_ok=yes; break])
+	done
+	cf_with_pcre2_ok=yes || AC_MSG_ERROR(Cannot find PCRE2 library)
+
+	AC_DEFINE(HAVE_LIB_PCRE2,1,[Define to 1 if we can/should compile with the PCRE2 library])
+
+	# if pkgconfig gave no results, look for the libraries directly
+	case "$LIBS" in
+	(*pcre2-posix*|*pcreposix*)
+		;;
+	(*)
+		AC_CHECK_LIB(pcre2-posix,regcomp,[
+			CF_ADD_LIB(pcre2-posix)],
+			[AC_CHECK_LIB(pcreposix,regcomp,[
+			 CF_ADD_LIB(pcreposix)
+			],[AC_MSG_ERROR(Cannot find PCRE2 POSIX library)])])
+		;;
+	esac
+
+	# either way, check for the library header files
+	AC_CHECK_HEADERS(pcre2posix.h pcreposix.h)
+	AC_CHECK_FUNCS(PCRE2regcomp)
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_PKG_CONFIG_LIBDIR version: 20 updated: 2022/01/29 17:03:42
+dnl -------------------------
+dnl Allow the choice of the pkg-config library directory to be overridden.
+dnl
+dnl pkg-config uses a search-list built from these colon-separated lists of
+dnl directories:
+dnl a) $PKG_CONFIG_PATH (tested first, added if set)
+dnl b) $PKG_CONFIG_LIBDIR (tested second, added if set)
+dnl c) builtin-list (added if $PKG_CONFIG_LIBDIR is not set)
+dnl
+dnl pkgconf (used with some systems such as FreeBSD in place of pkg-config)
+dnl optionally ignores $PKG_CONFIG_LIBDIR.
+AC_DEFUN([CF_WITH_PKG_CONFIG_LIBDIR],[
+
+case "$PKG_CONFIG" in
+(no|none|yes)
+	AC_MSG_CHECKING(for pkg-config library directory)
+	;;
+(*)
+	AC_MSG_CHECKING(for $PKG_CONFIG library directory)
+	;;
+esac
+
+# if $PKG_CONFIG_LIBDIR is set, try to use that
+cf_search_path=`echo "$PKG_CONFIG_LIBDIR" | sed -e 's/:/ /g' -e 's,^[[ 	]]*,,'`
+
+# if the option is used, let that override.  otherwise default to "libdir"
+AC_ARG_WITH(pkg-config-libdir,
+	[  --with-pkg-config-libdir=XXX use given directory for installing pc-files],
+	[cf_search_path=$withval],
+	[test "x$PKG_CONFIG" != xnone && test -z "$cf_search_path" && cf_search_path=libdir])
+
+case "x$cf_search_path" in
+(xlibdir)
+	PKG_CONFIG_LIBDIR='${libdir}/pkgconfig'
+	AC_MSG_RESULT($PKG_CONFIG_LIBDIR)
+	cf_search_path=
+	;;
+(x)
+	;;
+(x/*\ *)
+	PKG_CONFIG_LIBDIR=
+	;;
+(x/*)
+	PKG_CONFIG_LIBDIR="$cf_search_path"
+	AC_MSG_RESULT($PKG_CONFIG_LIBDIR)
+	cf_search_path=
+	;;
+(xyes|xauto)
+	AC_MSG_RESULT(auto)
+	cf_search_path=
+	# Look for the library directory using the same prefix as the executable
+	AC_MSG_CHECKING(for search-list)
+	if test "x$PKG_CONFIG" != xnone
+	then
+		# works for pkg-config since version 0.24 (2009)
+		# works for pkgconf since version 0.8.3 (2012)
+		for cf_pkg_program in \
+			`echo "$PKG_CONFIG" | sed -e 's,^.*/,,'` \
+			pkg-config \
+			pkgconf
+		do
+			cf_search_path=`"$PKG_CONFIG" --variable=pc_path "$cf_pkg_program" 2>/dev/null | tr : ' '`
+			test -n "$cf_search_path" && break
+		done
+
+		# works for pkg-config since import in 2005 of original 2001 HP code.
+		test -z "$cf_search_path" && \
+		cf_search_path=`
+		"$PKG_CONFIG" --debug --exists no-such-package 2>&1 | $AWK "\
+/^Scanning directory (#[1-9][0-9]* )?'.*'$/{ \
+	sub(\"^[[^']]*'\",\"\"); \
+	sub(\"'.*\",\"\"); \
+	printf \" %s\", \\[$]0; } \
+{ next; } \
+"`
+	fi
+
+	AC_MSG_RESULT($cf_search_path)
+	;;
+(*)
+	AC_MSG_ERROR(Unexpected option value: $cf_search_path)
+	;;
+esac
+
+if test -n "$cf_search_path"
+then
+	AC_MSG_CHECKING(for first directory)
+	cf_pkg_config_path=none
+	for cf_config in $cf_search_path
+	do
+		if test -d "$cf_config"
+		then
+			cf_pkg_config_path=$cf_config
+			break
+		fi
+	done
+	AC_MSG_RESULT($cf_pkg_config_path)
+
+	if test "x$cf_pkg_config_path" != xnone ; then
+		# limit this to the first directory found
+		PKG_CONFIG_LIBDIR="$cf_pkg_config_path"
+	fi
+
+	if test -z "$PKG_CONFIG_LIBDIR" && test -n "$cf_search_path"
+	then
+		AC_MSG_CHECKING(for workaround)
+		if test "$prefix" = "NONE" ; then
+			cf_prefix="$ac_default_prefix"
+		else
+			cf_prefix="$prefix"
+		fi
+		eval cf_libdir=$libdir
+		cf_libdir=`echo "$cf_libdir" | sed -e "s,^NONE,$cf_prefix,"`
+		cf_backup=
+		for cf_config in $cf_search_path
+		do
+			case $cf_config in
+			$cf_libdir/pkgconfig)
+				PKG_CONFIG_LIBDIR=$cf_libdir/pkgconfig
+				break
+				;;
+			*)
+				test -z "$cf_backup" && cf_backup=$cf_config
+				;;
+			esac
+		done
+		test -z "$PKG_CONFIG_LIBDIR" && PKG_CONFIG_LIBDIR=$cf_backup
+		AC_MSG_RESULT($PKG_CONFIG_LIBDIR)
+	fi
+fi
+
+AC_SUBST(PKG_CONFIG_LIBDIR)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_PTHREAD version: 7 updated: 2015/04/18 08:56:57
+dnl ---------------
+dnl Check for POSIX thread library.
+AC_DEFUN([CF_WITH_PTHREAD],
+[
+AC_MSG_CHECKING(if you want to link with the pthread library)
+AC_ARG_WITH(pthread,
+	[  --with-pthread          use POSIX thread library],
+	[with_pthread=$withval],
+	[with_pthread=no])
+AC_MSG_RESULT($with_pthread)
+
+if test "$with_pthread" != no ; then
+	AC_CHECK_HEADER(pthread.h,[
+	AC_DEFINE(HAVE_PTHREADS_H,1,[Define to 1 if we have pthreads.h header])
+
+	for cf_lib_pthread in pthread c_r
+	do
+	    AC_MSG_CHECKING(if we can link with the $cf_lib_pthread library)
+	    cf_save_LIBS="$LIBS"
+	    CF_ADD_LIB($cf_lib_pthread)
+	    AC_TRY_LINK([
+#include <pthread.h>
+],[
+		int rc = pthread_create(0,0,0,0);
+		int r2 = pthread_mutexattr_settype(0, 0);
+],[with_pthread=yes],[with_pthread=no])
+	    LIBS="$cf_save_LIBS"
+	    AC_MSG_RESULT($with_pthread)
+	    test "$with_pthread" = yes && break
+	done
+
+	if test "$with_pthread" = yes ; then
+	    CF_ADD_LIB($cf_lib_pthread)
+	    AC_DEFINE(HAVE_LIBPTHREADS,1,[Define to 1 if we have pthreads library])
+	else
+	    AC_MSG_ERROR(Cannot link with pthread library)
+	fi
+	])
+fi
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_REL_VERSION version: 1 updated: 2003/09/20 18:12:49
+dnl -------------------
+dnl Allow library's release-version to be overridden.  Generally this happens when a
+dnl packager has incremented the release-version past that used in the original package,
+dnl and wishes to keep doing this.
+dnl
+dnl $1 is the package name, if any, to derive corresponding {package}_MAJOR
+dnl and {package}_MINOR symbols
+dnl symbol.
+AC_DEFUN([CF_WITH_REL_VERSION],[
+test -z "$cf_cv_rel_version" && cf_cv_rel_version=0.0
+AC_ARG_WITH(rel-version,
+[  --with-rel-version=XXX  override derived release version],
+[AC_MSG_WARN(overriding release version $cf_cv_rel_version to $withval)
+ cf_cv_rel_version=$withval])
+ifelse($1,,[
+ CF_NUMBER_SYNTAX($cf_cv_rel_version,Release version)
+],[
+ $1_MAJOR=`echo "$cf_cv_rel_version" | sed -e 's/\..*//'`
+ $1_MINOR=`echo "$cf_cv_rel_version" | sed -e 's/^[[^.]]*//' -e 's/^\.//' -e 's/\..*//'`
+ CF_NUMBER_SYNTAX([$]$1_MAJOR,Release major-version)
+ CF_NUMBER_SYNTAX([$]$1_MINOR,Release minor-version)
+])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_SYSMOUSE version: 3 updated: 2012/10/06 17:56:13
+dnl ----------------
+dnl If we can compile with sysmouse, make it available unless it is not wanted.
+AC_DEFUN([CF_WITH_SYSMOUSE],[
+# not everyone has "test -c"
+if test -c /dev/sysmouse 2>/dev/null ; then
+AC_MSG_CHECKING(if you want to use sysmouse)
+AC_ARG_WITH(sysmouse,
+	[  --with-sysmouse         use sysmouse (FreeBSD console)],
+	[cf_with_sysmouse=$withval],
+	[cf_with_sysmouse=maybe])
+	if test "$cf_with_sysmouse" != no ; then
+	AC_TRY_COMPILE([
+#include <osreldate.h>
+#if (__FreeBSD_version >= 400017)
+#include <sys/consio.h>
+#include <sys/fbio.h>
+#else
+#include <machine/console.h>
+#endif
+],[
+	struct mouse_info the_mouse;
+	ioctl(0, CONS_MOUSECTL, &the_mouse);
+],[cf_with_sysmouse=yes],[cf_with_sysmouse=no])
+	fi
+AC_MSG_RESULT($cf_with_sysmouse)
+test "$cf_with_sysmouse" = yes && AC_DEFINE(USE_SYSMOUSE,1,[Define to 1 if we can/should use the sysmouse interface])
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_SYSTYPE version: 1 updated: 2013/01/26 16:26:12
+dnl ---------------
+dnl For testing, override the derived host system-type which is used to decide
+dnl things such as the linker commands used to build shared libraries.  This is
+dnl normally chosen automatically based on the type of system which you are
+dnl building on.  We use it for testing the configure script.
+dnl
+dnl This is different from the --host option: it is used only for testing parts
+dnl of the configure script which would not be reachable with --host since that
+dnl relies on the build environment being real, rather than mocked up.
+AC_DEFUN([CF_WITH_SYSTYPE],[
+CF_CHECK_CACHE([AC_CANONICAL_SYSTEM])
+AC_ARG_WITH(system-type,
+	[  --with-system-type=XXX  test: override derived host system-type],
+[AC_MSG_WARN(overriding system type to $withval)
+	cf_cv_system_name=$withval
+	host_os=$withval
+])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_VALGRIND version: 1 updated: 2006/12/14 18:00:21
+dnl ----------------
+AC_DEFUN([CF_WITH_VALGRIND],[
+CF_NO_LEAKS_OPTION(valgrind,
+	[  --with-valgrind         test: use valgrind],
+	[USE_VALGRIND])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_VERSIONED_SYMS version: 10 updated: 2021/01/04 18:48:01
+dnl ----------------------
+dnl Use this when building shared library with ELF, to markup symbols with the
+dnl version identifier from the given input file.  Generally that identifier is
+dnl the same as the SONAME at which the symbol was first introduced.
+dnl
+dnl $1 = basename of the ".map" file (default $PACKAGE)
+AC_DEFUN([CF_WITH_VERSIONED_SYMS],
+[AC_REQUIRE([AC_PROG_FGREP])dnl
+AC_REQUIRE([AC_PROG_EGREP])dnl
+
+AC_MSG_CHECKING(if versioned-symbols file should be used)
+AC_ARG_WITH(versioned-syms,
+	[  --with-versioned-syms=X markup versioned symbols using ld],
+	[with_versioned_syms=$withval],
+	[with_versioned_syms=no])
+case "x$with_versioned_syms" in
+(xyes)
+	with_versioned_syms='${top_srcdir}/package/ifelse($1,,${PACKAGE},[$1]).map'
+	AC_SUBST(PACKAGE)
+	;;
+(xno)
+	;;
+(x/*)
+	test -f "$with_versioned_syms" || AC_MSG_ERROR(expected a filename: $with_versioned_syms)
+	;;
+(*)
+	test -f "$with_versioned_syms" || AC_MSG_ERROR(expected a filename: $with_versioned_syms)
+	with_versioned_syms=`pwd`/"$with_versioned_syms"
+	;;
+esac
+AC_MSG_RESULT($with_versioned_syms)
+
+RESULTING_SYMS=
+VERSIONED_SYMS=
+WILDCARD_SYMS=
+
+if test "x$with_versioned_syms" != xno
+then
+	RESULTING_SYMS=$with_versioned_syms
+	case "x$MK_SHARED_LIB" in
+	(*-Wl,*)
+		VERSIONED_SYMS="-Wl,--version-script,\${RESULTING_SYMS}"
+		MK_SHARED_LIB=`echo "$MK_SHARED_LIB" | sed -e "s%-Wl,%\\[$]{VERSIONED_SYMS} -Wl,%"`
+		CF_VERBOSE(MK_SHARED_LIB:  $MK_SHARED_LIB)
+		;;
+	(*-dy\ *)
+		VERSIONED_SYMS="-Wl,-M,\${RESULTING_SYMS}"
+		MK_SHARED_LIB=`echo "$MK_SHARED_LIB" | sed -e "s%-dy%\\[$]{VERSIONED_SYMS} -dy%"`
+		CF_VERBOSE(MK_SHARED_LIB:  $MK_SHARED_LIB)
+		;;
+	(*)
+		AC_MSG_WARN(this system does not support versioned-symbols)
+		;;
+	esac
+
+	# Linux ld can selectively override scope, e.g., of symbols beginning with
+	# "_" by first declaring some as global, and then using a wildcard to
+	# declare the others as local.  Some other loaders cannot do this.  Check
+	# by constructing a (very) simple shared library and inspecting its
+	# symbols.
+	if test "x$VERSIONED_SYMS" != "x"
+	then
+		AC_MSG_CHECKING(if wildcards can be used to selectively omit symbols)
+		WILDCARD_SYMS=no
+
+		# make sources
+		rm -f conftest.*
+
+		cat >conftest.ver <<EOF
+module_1.0 {
+global:
+	globalf1;
+local:
+	localf1;
+};
+module_2.0 {
+global:
+	globalf2;
+local:
+	localf2;
+	_*;
+} module_1.0;
+submodule_1.0 {
+global:
+	subglobalf1;
+	_ismissing;
+local:
+	sublocalf1;
+};
+submodule_2.0 {
+global:
+	subglobalf2;
+local:
+	sublocalf2;
+	_*;
+} submodule_1.0;
+EOF
+		cat >conftest.$ac_ext <<EOF
+#line __oline__ "configure"
+int	_ismissing(void) { return 1; }
+int	_localf1(void) { return 1; }
+int	_localf2(void) { return 2; }
+int	globalf1(void) { return 1; }
+int	globalf2(void) { return 2; }
+int	_sublocalf1(void) { return 1; }
+int	_sublocalf2(void) { return 2; }
+int	subglobalf1(void) { return 1; }
+int	subglobalf2(void) { return 2; }
+EOF
+		cat >conftest.mk <<EOF
+CC=${CC}
+CFLAGS=${CFLAGS}
+CPPFLAGS=${CPPFLAGS}
+LDFLAGS=${LDFLAGS}
+LIBS=${LIBS}
+VERSIONED_SYMS=${VERSIONED_SYMS}
+RESULTING_SYMS=conftest.ver
+MK_SHARED_LIB=${MK_SHARED_LIB}
+conftest.so: conftest.$ac_cv_objext
+		\$(MK_SHARED_LIB) conftest.$ac_cv_objext
+EOF
+
+		# compile source, make library
+		if make -f conftest.mk 2>&AC_FD_CC >/dev/null
+		then
+			# test for missing symbol in either Data or Text section
+			cf_missing="`nm -P conftest.so 2>&AC_FD_CC |${FGREP-fgrep} _ismissing | ${EGREP-egrep} '[[ 	]][[DT]][[ 	]]'`"
+			test -n "$cf_missing" && WILDCARD_SYMS=yes
+		fi
+		AC_MSG_RESULT($WILDCARD_SYMS)
+		rm -f conftest.*
+	fi
+fi
+AC_SUBST(RESULTING_SYMS)
+AC_SUBST(VERSIONED_SYMS)
+AC_SUBST(WILDCARD_SYMS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_X11_RGB version: 2 updated: 2019/12/31 08:53:54
+dnl ---------------
+dnl Handle configure option "--with-x11-rgb", setting these shell
+dnl variables:
+dnl
+dnl $RGB_PATH is the option value, used for finding the X11 rgb file.
+dnl $no_x11_rgb is a "#" (comment) if "--without-x11-rgb" is given.
+dnl
+dnl Most Linux's use this:
+dnl 	/usr/share/X11/rgb.txt
+dnl Debian uses this:
+dnl 	/etc/X11/rgb.txt
+dnl DragonFlyBSD ports uses this:
+dnl 	/usr/pkg/lib/X11/rgb.txt
+dnl FreeBSD ports use these:
+dnl 	/usr/local/lib/X11/rgb.txt
+dnl 	/usr/local/share/X11/rgb.txt
+dnl Mandriva has these:
+dnl 	/usr/lib/X11/rgb.txt
+dnl 	/usr/lib64/X11/rgb.txt
+dnl NetBSD has these
+dnl 	/usr/X11R7/lib/X11/rgb.txt
+dnl OpenSolaris uses
+dnl 	32-bit:
+dnl 	/usr/X11/etc/X11/rgb.txt
+dnl 	/usr/X11/share/X11/rgb.txt
+dnl 	/usr/X11/lib/X11/rgb.txt
+dnl OSX uses
+dnl		/opt/local/share/X11/rgb.txt (MacPorts)
+dnl		/opt/X11/share/X11/rgb.txt (non-ports)
+dnl	64-bit:
+dnl 	/usr/X11/etc/X11/rgb.txt
+dnl 	/usr/X11/share/X11/rgb.txt (perhaps)
+dnl 	/usr/X11/lib/amd64/X11/rgb.txt
+dnl Solaris10 uses (in this order):
+dnl 	/usr/openwin/lib/X11/rgb.txt
+dnl 	/usr/X11/lib/X11/rgb.txt
+AC_DEFUN([CF_WITH_X11_RGB],[
+AC_MSG_CHECKING(for X11 rgb file)
+AC_ARG_WITH(x11-rgb,
+	[  --with-x11-rgb=FILE   file containing X11 rgb information (EPREFIX/lib/X11/rgb.txt)],
+	[RGB_PATH=$withval],
+	[RGB_PATH=auto])
+
+if test "x[$]RGB_PATH" = xauto
+then
+	RGB_PATH='${exec_prefix}/lib/X11/rgb.txt'
+	for cf_path in \
+		/opt/local/share/X11/rgb.txt \
+		/opt/X11/share/X11/rgb.txt \
+		/usr/share/X11/rgb.txt \
+		/usr/X11/share/X11/rgb.txt \
+		/usr/X11/lib/X11/rgb.txt \
+		/usr/lib/X11/rgb.txt \
+		/etc/X11/rgb.txt \
+		/usr/pkg/lib/X11/rgb.txt \
+		/usr/X11R7/lib/X11/rgb.txt \
+		/usr/X11R6/lib/X11/rgb.txt \
+		/usr/X11R5/lib/X11/rgb.txt \
+		/usr/X11R4/lib/X11/rgb.txt \
+		/usr/local/lib/X11/rgb.txt \
+		/usr/local/share/X11/rgb.txt \
+		/usr/lib64/X11/rgb.txt
+	do
+		if test -f "$cf_path" ; then
+			RGB_PATH="$cf_path"
+			break
+		fi
+	done
+else
+	cf_path=$RGB_PATH
+	CF_PATH_SYNTAX(cf_path)
+fi
+
+AC_MSG_RESULT($RGB_PATH)
+AC_SUBST(RGB_PATH)
+AC_DEFINE_UNQUOTED(RGB_PATH,"$cf_path",[Define to the full pathname of rgb.txt])
+
+no_x11_rgb=
+if test "$RGB_PATH" = no
+then
+	no_x11_rgb="#"
+fi
+AC_SUBST(no_x11_rgb)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_XOPEN_SOURCE version: 62 updated: 2022/10/02 19:55:56
+dnl ---------------
+dnl Try to get _XOPEN_SOURCE defined properly that we can use POSIX functions,
+dnl or adapt to the vendor's definitions to get equivalent functionality,
+dnl without losing the common non-POSIX features.
+dnl
+dnl Parameters:
+dnl	$1 is the nominal value for _XOPEN_SOURCE
+dnl	$2 is the nominal value for _POSIX_C_SOURCE
+AC_DEFUN([CF_XOPEN_SOURCE],[
+AC_REQUIRE([AC_CANONICAL_HOST])
+AC_REQUIRE([CF_POSIX_VISIBLE])
+
+if test "$cf_cv_posix_visible" = no; then
+
+cf_XOPEN_SOURCE=ifelse([$1],,500,[$1])
+cf_POSIX_C_SOURCE=ifelse([$2],,199506L,[$2])
+cf_xopen_source=
+
+case "$host_os" in
+(aix[[4-7]]*)
+	cf_xopen_source="-D_ALL_SOURCE"
+	;;
+(msys)
+	cf_XOPEN_SOURCE=600
+	;;
+(darwin[[0-8]].*)
+	cf_xopen_source="-D_APPLE_C_SOURCE"
+	;;
+(darwin*)
+	cf_xopen_source="-D_DARWIN_C_SOURCE"
+	cf_XOPEN_SOURCE=
+	;;
+(freebsd*|dragonfly*|midnightbsd*)
+	# 5.x headers associate
+	#	_XOPEN_SOURCE=600 with _POSIX_C_SOURCE=200112L
+	#	_XOPEN_SOURCE=500 with _POSIX_C_SOURCE=199506L
+	cf_POSIX_C_SOURCE=200112L
+	cf_XOPEN_SOURCE=600
+	cf_xopen_source="-D_BSD_TYPES -D__BSD_VISIBLE -D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE -D_XOPEN_SOURCE=$cf_XOPEN_SOURCE"
+	;;
+(hpux11*)
+	cf_xopen_source="-D_HPUX_SOURCE -D_XOPEN_SOURCE=500"
+	;;
+(hpux*)
+	cf_xopen_source="-D_HPUX_SOURCE"
+	;;
+(irix[[56]].*)
+	cf_xopen_source="-D_SGI_SOURCE"
+	cf_XOPEN_SOURCE=
+	;;
+(linux*gnu|linux*gnuabi64|linux*gnuabin32|linux*gnueabi|linux*gnueabihf|linux*gnux32|uclinux*|gnu*|mint*|k*bsd*-gnu|cygwin)
+	CF_GNU_SOURCE($cf_XOPEN_SOURCE)
+	;;
+(minix*)
+	cf_xopen_source="-D_NETBSD_SOURCE" # POSIX.1-2001 features are ifdef'd with this...
+	;;
+(mirbsd*)
+	# setting _XOPEN_SOURCE or _POSIX_SOURCE breaks <sys/select.h> and other headers which use u_int / u_short types
+	cf_XOPEN_SOURCE=
+	CF_POSIX_C_SOURCE($cf_POSIX_C_SOURCE)
+	;;
+(netbsd*)
+	cf_xopen_source="-D_NETBSD_SOURCE" # setting _XOPEN_SOURCE breaks IPv6 for lynx on NetBSD 1.6, breaks xterm, is not needed for ncursesw
+	;;
+(openbsd[[6-9]]*)
+	# OpenBSD 6.x has broken locale support, both compile-time and runtime.
+	# see https://www.mail-archive.com/bugs@openbsd.org/msg13200.html
+	# Abusing the conformance level is a workaround.
+	AC_MSG_WARN(this system does not provide usable locale support)
+	cf_xopen_source="-D_BSD_SOURCE"
+	cf_XOPEN_SOURCE=700
+	;;
+(openbsd[[4-5]]*)
+	# setting _XOPEN_SOURCE lower than 500 breaks g++ compile with wchar.h, needed for ncursesw
+	cf_xopen_source="-D_BSD_SOURCE"
+	cf_XOPEN_SOURCE=600
+	;;
+(openbsd*)
+	# setting _XOPEN_SOURCE breaks xterm on OpenBSD 2.8, is not needed for ncursesw
+	;;
+(osf[[45]]*)
+	cf_xopen_source="-D_OSF_SOURCE"
+	;;
+(nto-qnx*)
+	cf_xopen_source="-D_QNX_SOURCE"
+	;;
+(sco*)
+	# setting _XOPEN_SOURCE breaks Lynx on SCO Unix / OpenServer
+	;;
+(solaris2.*)
+	cf_xopen_source="-D__EXTENSIONS__"
+	cf_cv_xopen_source=broken
+	;;
+(sysv4.2uw2.*) # Novell/SCO UnixWare 2.x (tested on 2.1.2)
+	cf_XOPEN_SOURCE=
+	cf_POSIX_C_SOURCE=
+	;;
+(*)
+	CF_TRY_XOPEN_SOURCE
+	cf_save_xopen_cppflags="$CPPFLAGS"
+	CF_POSIX_C_SOURCE($cf_POSIX_C_SOURCE)
+	# Some of these niche implementations use copy/paste, double-check...
+	CF_VERBOSE(checking if _POSIX_C_SOURCE inteferes)
+	AC_TRY_COMPILE(CF__XOPEN_SOURCE_HEAD,CF__XOPEN_SOURCE_BODY,,[
+		AC_MSG_WARN(_POSIX_C_SOURCE definition is not usable)
+		CPPFLAGS="$cf_save_xopen_cppflags"])
+	;;
+esac
+
+if test -n "$cf_xopen_source" ; then
+	CF_APPEND_CFLAGS($cf_xopen_source,true)
+fi
+
+dnl In anything but the default case, we may have system-specific setting
+dnl which is still not guaranteed to provide all of the entrypoints that
+dnl _XOPEN_SOURCE would yield.
+if test -n "$cf_XOPEN_SOURCE" && test -z "$cf_cv_xopen_source" ; then
+	AC_MSG_CHECKING(if _XOPEN_SOURCE really is set)
+	AC_TRY_COMPILE([#include <stdlib.h>],[
+#ifndef _XOPEN_SOURCE
+make an error
+#endif],
+	[cf_XOPEN_SOURCE_set=yes],
+	[cf_XOPEN_SOURCE_set=no])
+	AC_MSG_RESULT($cf_XOPEN_SOURCE_set)
+	if test "$cf_XOPEN_SOURCE_set" = yes
+	then
+		AC_TRY_COMPILE([#include <stdlib.h>],[
+#if (_XOPEN_SOURCE - 0) < $cf_XOPEN_SOURCE
+make an error
+#endif],
+		[cf_XOPEN_SOURCE_set_ok=yes],
+		[cf_XOPEN_SOURCE_set_ok=no])
+		if test "$cf_XOPEN_SOURCE_set_ok" = no
+		then
+			AC_MSG_WARN(_XOPEN_SOURCE is lower than requested)
+		fi
+	else
+		CF_TRY_XOPEN_SOURCE
+	fi
+fi
+fi # cf_cv_posix_visible
+])
+dnl ---------------------------------------------------------------------------
+dnl CF__SED_TRIMBLANKS version: 1 updated: 2021/01/02 09:31:20
+dnl ------------------
+dnl Trim something using sed, then trim extra whitespace
+dnl $1 = extra parameters, e.g., in CF_STRIP_G_OPT
+define([CF__SED_TRIMBLANKS],[sed ifelse($1,,,[$1] )-e 's%[[	]]% %g' -e 's% [[ ]]*% %g' -e 's%^ %%' -e 's% [$]%%'])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF__XOPEN_SOURCE_BODY version: 1 updated: 2022/09/10 15:17:35
+dnl ---------------------
+dnl body of test when test-compiling for _XOPEN_SOURCE check
+define([CF__XOPEN_SOURCE_BODY],
+[
+#ifndef _XOPEN_SOURCE
+make an error
+#endif
+])
+dnl ---------------------------------------------------------------------------
+dnl CF__XOPEN_SOURCE_HEAD version: 1 updated: 2022/09/10 15:17:03
+dnl ---------------------
+dnl headers to include when test-compiling for _XOPEN_SOURCE check
+define([CF__XOPEN_SOURCE_HEAD],
+[
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+])
diff --git a/announce.html.in b/announce.html.in
new file mode 100644
index 0000000..ebeee52
--- /dev/null
+++ b/announce.html.in
@@ -0,0 +1,1560 @@
+<!--
+  $Id: announce.html.in,v 1.104 2022/12/31 20:35:34 tom Exp $
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  *                                                                          *
+  * 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.                                                           *
+  ****************************************************************************
+-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+  <meta name="generator" content=
+  "HTML Tidy for HTML5 for Linux version 5.6.0">
+  <title>Announcing ncurses @VERSION@</title>
+  <link rel="author" href="mailto:bug-ncurses@gnu.org">
+  <meta http-equiv="Content-Type" content=
+  "text/html; charset=us-ascii">
+  <style type="text/css">
+  p,li { max-width:700px; }
+  dd { max-width:630px; }
+  *.main-name {
+        font-style: italic;
+        font-variant: small-caps;
+  }
+  *.part-name {
+        font-family: "Andale Mono", "Monotype.com", monospace;
+        font-size: 12pt;
+        font-weight: bold;
+  }
+  *.demo-name {
+        font-family: "Andale Mono", "Monotype.com", monospace;
+        font-size: 10pt;
+  }
+  </style>
+</head>
+<body>
+  <h1 class="no-header">Announcing ncurses @VERSION@</h1>
+
+  <h2><a name="h2-overview" id="h2-overview">Overview</a></h2>
+
+  <p>The <span class="main-name">ncurses</span> (new curses)
+  library is a free software emulation of curses in System V
+  Release 4.0 (SVr4), and more. It uses terminfo format, supports
+  pads and color and multiple highlights and forms characters and
+  function-key mapping, and has all the other SVr4-curses
+  enhancements over BSD curses. SVr4 curses became the basis of
+  X/Open Curses.</p>
+
+  <p>In mid-June 1995, the maintainer of 4.4BSD curses declared
+  that he considered 4.4BSD curses obsolete, and encouraged the
+  keepers of <span class="main-name">unix</span> releases such as
+  BSD/OS, FreeBSD and NetBSD to switch over to <span class=
+  "main-name">ncurses</span>.</p>
+
+  <p>Since 1995, <span class="main-name">ncurses</span> has been
+  ported to many systems:</p>
+
+  <ul>
+    <li>It is used in almost every system based on the Linux kernel
+    (aside from some embedded applications).</li>
+
+    <li>It is used as the system curses library on OpenBSD, FreeBSD
+    and MacOS.</li>
+
+    <li>It is used in environments such as Cygwin and MinGW. The
+    first of these was EMX on OS/2 Warp.</li>
+
+    <li>It is used (though usually not as the <em>system</em>
+    curses) on all of the vendor <span class=
+    "main-name">unix</span> systems, e.g., AIX, HP-UX, IRIX64, SCO,
+    Solaris, Tru64.</li>
+
+    <li>It should work readily on any ANSI/POSIX-conforming
+    <span class="main-name">unix</span>.</li>
+  </ul>
+
+  <p>The distribution includes the library and support utilities,
+  including</p>
+
+  <ul>
+    <li><a href="@HOMEPAGE@/man/captoinfo.1m.html"><span class=
+    "part-name">captoinfo</span></a>, a termcap conversion
+    tool</li>
+
+    <li><a href="@HOMEPAGE@/man/clear.1.html"><span class=
+    "part-name">clear</span></a>, utility for clearing the
+    screen</li>
+
+    <li><a href="@HOMEPAGE@/man/infocmp.1m.html"><span class=
+    "part-name">infocmp</span></a>, the terminfo decompiler</li>
+
+    <li><a href="@HOMEPAGE@/man/tabs.1.html"><span class=
+    "part-name">tabs</span></a>, set tabs on a terminal</li>
+
+    <li><a href="@HOMEPAGE@/man/tic.1m.html"><span class=
+    "part-name">tic</span></a>, the terminfo compiler</li>
+
+    <li><a href="@HOMEPAGE@/man/toe.1m.html"><span class=
+    "part-name">toe</span></a>, list (table of) terminfo
+    entries</li>
+
+    <li><a href="@HOMEPAGE@/man/tput.1.html"><span class=
+    "part-name">tput</span></a>, utility for retrieving terminal
+    capabilities in shell scripts</li>
+
+    <li><a href="@HOMEPAGE@/man/tset.1.html"><span class=
+    "part-name">tset</span></a>, to initialize the terminal</li>
+  </ul>
+
+  <p>Full manual pages are provided for the library and tools.</p>
+
+  <p>The <span class="main-name">ncurses</span> distribution is
+  available at <span class="main-name">ncurses</span>' <a href=
+  "@HOMEPAGE@/">homepage</a>:</p>
+
+  <blockquote>
+    <p><a href=
+    "https://invisible-island.net/archives/ncurses/">https://invisible-island.net/archives/ncurses/</a>
+    or<br>
+    <a href=
+    "https://invisible-mirror.net/archives/ncurses/">https://invisible-mirror.net/archives/ncurses/</a>&nbsp;.</p>
+  </blockquote>
+
+  <p>It is also available at the GNU distribution site</p>
+
+  <blockquote>
+    <p><a href=
+    "https://ftp.gnu.org/gnu/ncurses/">https://ftp.gnu.org/gnu/ncurses/</a>&nbsp;.</p>
+  </blockquote>
+
+  <h2><a name="h2-release-notes" id="h2-release-notes">Release
+  Notes</a></h2>
+
+  <p>These notes are for <span class="main-name">ncurses</span>
+  @VERSION@, released <strong>December 31, 2022</strong>.</p>
+
+  <p>This release is designed to be source-compatible with
+  <span class="main-name">ncurses</span> 5.0 through 6.3; providing
+  extensions to the application binary interface (ABI). Although
+  the source can still be configured to support the <span class=
+  "main-name">ncurses</span> 5 ABI, the reason for the release is
+  to reflect improvements to the <span class=
+  "main-name">ncurses</span> 6 ABI and the supporting utility
+  programs.</p>
+
+  <p>There are, of course, numerous other improvements, listed in
+  this announcement.</p>
+
+  <p>The most <a href="#h3-bug-fixes">important
+  bug-fixes/improvements</a> dealt with robustness issues. The
+  release notes also mention some other bug-fixes, but are focused
+  on new features and improvements to existing features since
+  <span class="main-name">ncurses</span> 6.3 release.</p>
+
+  <h3><a name="h3-library" id="h3-library">Library improvements</a></h3>
+
+  <h4><a name="h4-new-library" id="h4-new-library">New features</a></h4>
+
+  <p>There are no new features in this release.</p>
+
+  <h4><a name="h4-fixes-library" id="h4-fixes-library">Other
+  improvements</a></h4>
+
+  <p>These are improvements to existing features:</p>
+
+  <ul>
+    <li>
+      <p>modify <tt>delscreen</tt> to more effectively delete all
+      windows on the given screen.</p>
+    </li>
+
+    <li>
+      <p>modify <tt>wnoutrefresh</tt> to call <tt>pnoutrefresh</tt>
+      if its parameter is a pad, rather than treating it as an
+      error, and modify new_panel to permit its window-parameter to
+      be a pad</p>
+    </li>
+
+    <li>
+      <p>modify curses_trace() to show the trace-mask as symbols,
+      e.g., <tt>TRACE_ORDINARY</tt>, <tt>DEBUG_LEVEL(3)</tt>.</p>
+    </li>
+
+    <li>
+      <p>improve checks for valid mouse events when an intermediate
+      mouse state is not part of the mousemask specified by the
+      caller</p>
+    </li>
+
+    <li>
+      <p>allow extended-color number in <em>opts</em> parameter of
+      <tt>wattr_on</tt>.</p>
+    </li>
+
+    <li>
+      <p>improve <tt>_tracecchar_t2</tt> formatting of
+      base+combining character.</p>
+    </li>
+
+    <li>
+      <p>trim out some unwanted linker options from ncurses*config
+      and .pc files seen in Fedora 36+.</p>
+    </li>
+
+    <li>
+      <p>improve shell-scripts with <em>shellcheck</em></p>
+    </li>
+
+    <li>
+      <p>improve use of "trap" in shell scripts, using a
+      script.</p>
+    </li>
+
+    <li>
+      <p>modify <tt>make-tar.sh</tt> scripts to make timestamps
+      more predictable.</p>
+    </li>
+  </ul>
+
+  <p>These are corrections to existing features:</p>
+
+  <ul>
+    <li>
+      <p>modify <tt>misc/gen-pkgconfig.in</tt> to allow for the
+      case where the library directory does not yet exist, since
+      this is processed before doing an install</p>
+    </li>
+
+    <li>
+      <p>set trailing null on string passed from <tt>winsnstr</tt>
+      to <tt>wins_nwstr</tt>.</p>
+    </li>
+
+    <li>
+      <p>modify <tt>waddch_literal</tt> to allow for double-width
+      base character when merging a combining character</p>
+    </li>
+  </ul>
+
+  <h3><a name="h3-programs" id="h3-programs">Program
+  improvements</a></h3>
+
+  <p id="h4-utilities">Several improvements were made to the
+  utility programs:</p>
+
+  <dl>
+    <dt><span class="part-name"><a href=
+    "@HOMEPAGE@/man/infocmp.1m.html">infocmp</a></span>
+    </dt>
+
+    <dd>
+      <ul>
+        <li>rewrite <tt>canonical_name</tt> function of
+        <tt>infocmp</tt> to ensure buffer size</li>
+
+        <li>improve readability of long parameterized expressions
+        with the infocmp &ldquo;<tt>-f</tt>&rdquo; option by
+        allowing split before a &ldquo;<tt>%p</tt>&rdquo;
+        marker.</li>
+
+        <li>modify verbose-option of <tt>infocmp</tt>,
+        <tt>tic</tt>, <tt>toe</tt> to enable debug-tracing if that
+        is configured.</li>
+      </ul>
+    </dd>
+
+    <dt><span class="part-name"><a href=
+    "@HOMEPAGE@/man/tabs.1.html">tabs</a></span>
+    </dt>
+
+    <dd>limit tab-stop values to max-columns</dd>
+
+    <dt><span class="part-name"><a href=
+    "@HOMEPAGE@/man/tic.1m.html">tic</a></span>
+    </dt>
+
+    <dd>add consistency check in tic for u6/u7/u8/u9 and NQ
+    capabilities.</dd>
+
+    <dt><span class="part-name"><a href=
+    "@HOMEPAGE@/man/tput.1.html">tput</a></span>
+    </dt>
+
+    <dd>corrected use of original tty-modes in <em>init/reset</em>
+    subcommands</dd>
+  </dl>
+
+  <h4><a name="h4-examples" id="h4-examples">Examples</a></h4>
+
+  <p>Along with the library and utilities, improvements were made
+  to the <a href=
+  "@HOMEPAGE@/ncurses-examples.html">ncurses-examples</a>. Most of
+  this activity aimed at improving the test-packages:</p>
+
+  <ul>
+    <li>
+      <p>add minimal <tt>-h</tt> (usage) and <tt>-V</tt> (version)
+      getopt logic to all ncurses-examples programs.</p>
+    </li>
+
+    <li>
+      <p>fix an error in "@" command in <tt>test/ncurses.c</tt>
+      F-menu</p>
+    </li>
+
+    <li>
+      <p>add curses_trace to ifdef's for <tt>START_TRACE</tt> in
+      <tt>test/test.priv.h</tt></p>
+    </li>
+
+    <li>
+      <p>improve pthread-configuration for test/worm.c</p>
+    </li>
+
+    <li>
+      <p>add <tt>setlocale</tt> call to several test-programs.</p>
+    </li>
+
+    <li>
+      <p>workaround in <tt>test/picsmap.c</tt> for use of floating
+      point for rgb values by ImageMagick 6.9.11, which appears to
+      use the wrong upper limit.</p>
+    </li>
+
+    <li>
+      <p>use static libraries for AdaCurses test-package for
+      Mageia, since no gprbuild package is available.</p>
+    </li>
+
+    <li>
+      <p>install Ada95 sample programs in libexecdir, adding a
+      wrapper script to invoke those.</p>
+    </li>
+
+    <li>
+      <p>install ncurses-examples programs in libexecdir, adding a
+      wrapper script to invoke those.</p>
+    </li>
+  </ul>
+
+  <p>There are other new demo/test programs and reusable
+  examples:</p>
+
+  <dl>
+    <dt><span class="part-name"><em>test/combine</em></span>
+    </dt>
+
+    <dd>demonstrate combining characters</dd>
+
+    <dt><span class="part-name"><em>test/test_delwin</em></span>
+    </dt>
+
+    <dd>demonstrate deleting a window</dd>
+
+    <dt><span class="part-name"><em>test/test_mouse</em></span>
+    </dt>
+
+    <dd>observe mouse events in the raw terminal or parsed ncurses
+    modes</dd>
+
+    <dt><span class="part-name"><em>test/test_unget_wch</em></span>
+    </dt>
+
+    <dd>demonstrate the unget_wch and unget functions</dd>
+  </dl>
+
+  <h3><a name="h3-database" id="h3-database">Terminal database</a></h3>
+
+  <p>There are several new terminal descriptions:</p>
+
+  <ul>
+    <li><tt><a href=
+    "@HOMEPAGE@/terminfo.src.html#tic-mosh">mosh</a></tt>
+    </li>
+
+    <li><tt><a href=
+    "@HOMEPAGE@/terminfo.src.html#tic-mosh-256color">mosh-256color</a></tt>
+    </li>
+
+    <li><tt><a href=
+    "@HOMEPAGE@/terminfo.src.html#tic-teken-16color">teken-16color</a></tt>
+    </li>
+
+    <li><tt><a href=
+    "@HOMEPAGE@/terminfo.src.html#tic-teken-sc">teken-sc</a></tt>
+    </li>
+
+    <li><tt><a href=
+    "@HOMEPAGE@/terminfo.src.html#tic-teken-vt">teken-vt</a></tt>
+    </li>
+
+    <li><tt><a href=
+    "@HOMEPAGE@/terminfo.src.html#tic-xgterm">xgterm</a></tt>
+    </li>
+  </ul>
+
+  <p>There are many changes to existing terminal descriptions. Some
+  were updates to several descriptions:</p>
+
+  <ul>
+    <li>
+      <p>make description-fields distinct</p>
+    </li>
+
+    <li>
+      <p>fix errata in description fields</p>
+    </li>
+
+    <li>
+      <p>add/use several building-blocks:</p>
+
+      <ul>
+        <li><a href=
+        "@HOMEPAGE@/terminfo.src.html#tic-aixterm_sl"><tt>aixterm+sl</tt></a></li>
+
+        <li><a href=
+        "@HOMEPAGE@/terminfo.src.html#tic-ansi_cpr"><tt>ansi+cpr</tt></a></li>
+
+        <li><a href=
+        "@HOMEPAGE@/terminfo.src.html#tic-apollo_vt132"><tt>apollo+vt132</tt></a></li>
+
+        <li><a href=
+        "@HOMEPAGE@/terminfo.src.html#tic-decid_cpr"><tt>decid+cpr</tt></a></li>
+
+        <li><a href=
+        "@HOMEPAGE@/terminfo.src.html#tic-ncr260vp_sl"><tt>ncr260vp+sl</tt></a></li>
+
+        <li><a href=
+        "@HOMEPAGE@/terminfo.src.html#tic-wyse_sl"><tt>wyse+sl</tt></a></li>
+
+        <li><a href=
+        "@HOMEPAGE@/terminfo.src.html#tic-x10term_sl"><tt>x10term+sl</tt></a></li>
+
+        <li><a href=
+        "@HOMEPAGE@/terminfo.src.html#tic-xterm_acs"><tt>xterm+acs</tt></a></li>
+
+        <li><a href=
+        "@HOMEPAGE@/terminfo.src.html#tic-xterm_alt47"><tt>xterm+alt47</tt></a></li>
+      </ul>
+    </li>
+  </ul>
+
+  <p>while others affected specific descriptions. These were
+  retested, to take into account changes by their developers:</p>
+
+  <ul>
+    <li>
+      <p><tt><a href=
+      "@HOMEPAGE@/terminfo.src.html#tic-kitty">kitty</a></tt>
+      </p>
+    </li>
+
+    <li>
+      <p><tt><a href=
+      "@HOMEPAGE@/terminfo.src.html#tic-teken">teken</a></tt>
+      </p>
+    </li>
+  </ul>
+
+  <p>while these are specific fixes based on reviewing
+  documentation, user reports, or warnings from <span class=
+  "part-name">tic</span>:</p>
+
+  <dl>
+    <dt><a href=
+    "@HOMEPAGE@/terminfo.src.html#tic-att610_cvis0">att610+cvis0</a>
+    </dt>
+
+    <dd>amended note as per documentation for att610, att620,
+    att730</dd>
+
+    <dt><a href="@HOMEPAGE@/terminfo.src.html#tic-kon">kon</a>,
+    kon2, jfbterm</dt>
+
+    <dd>revise to undo "linux2.6" change to smacs/rmacs/enacs</dd>
+
+    <dt><a href=
+    "@HOMEPAGE@/terminfo.src.html#tic-st-0_6">st-0.6</a>
+    </dt>
+
+    <dd>add dim, ecma+strikeout</dd>
+
+    <dt><a href=
+    "@HOMEPAGE@/terminfo.src.html#tic-foot_base">foot+base</a>
+    </dt>
+
+    <dd>add xterm+sl-alt</dd>
+
+    <dt><a href=
+    "@HOMEPAGE@/terminfo.src.html#tic-dec_sl">dec+sl</a>
+    </dt>
+
+    <dd>correct dsl in dec+sl</dd>
+
+    <dt><a href=
+    "@HOMEPAGE@/terminfo.src.html#tic-mintty">mintty</a> and
+    tmux</dt>
+
+    <dd>correct setal in mintty/tmux entries, add to vte-2018</dd>
+
+    <dt><a href=
+    "@HOMEPAGE@/terminfo.src.html#tic-nsterm">nsterm</a>
+    </dt>
+
+    <dd>modify nsterm to use xterm+alt1049</dd>
+
+    <dt><a href="@HOMEPAGE@/terminfo.src.html#tic-putty">putty</a>
+    </dt>
+
+    <dd>modify putty to use xterm+alt1049</dd>
+
+    <dt><a href=
+    "@HOMEPAGE@/terminfo.src.html#tic-vte-2018">vte-2018</a>
+    </dt>
+
+    <dd>add blink and setal</dd>
+  </dl>
+
+  <p>A few entries use extensions (user-defined terminal
+  capabilities):</p>
+
+  <ul>
+    <li>
+      <p>use <tt>ansi+enq</tt> and <tt>decid+cpr</tt> in cases
+      where the terminal probably supported the u6-u9 extension</p>
+    </li>
+
+    <li>
+      <p>remove u6-u9 from teken-2018</p>
+    </li>
+
+    <li>
+      <p>use <tt>NQ</tt> to flag entries where the terminal does
+      not support query and response</p>
+    </li>
+
+    <li>
+      <p>add/use <a href=
+      "@HOMEPAGE@/terminfo.src.html#tic-bracketed_paste"><tt>bracketed+paste</tt></a>
+      to help identify terminals supporting this xterm feature</p>
+    </li>
+
+    <li>
+      <p>modify samples for xterm mouse 1002/1003 modes to use 1006
+      mode, and also provide for focus in/out responses</p>
+    </li>
+
+    <li>
+      <p>xterm patch #371 supports DEC-compatible status-line. add
+      <tt>dec+sl</tt> to xterm-new, per xterm #371, add <a href=
+      "@HOMEPAGE@/terminfo.src.html#tic-xterm-p371"><tt>xterm-p371</tt></a>,
+      add <a href=
+      "@HOMEPAGE@/terminfo.src.html#tic-xterm-p370"><tt>xterm-p370</tt></a>,
+      for use in older terminals, and set &ldquo;xterm-new&rdquo;
+      to &ldquo;xterm-p370&rdquo; (to ease adoption).</p>
+    </li>
+  </ul>
+
+  <h3><a name="h3-documentation" id=
+  "h3-documentation">Documentation</a></h3>
+
+  <p>As usual, this release</p>
+
+  <ul>
+    <li>
+      <p>improves documentation by describing new features,</p>
+    </li>
+
+    <li>
+      <p>attempts to improve the description of features which
+      users have found confusing</p>
+    </li>
+
+    <li>
+      <p>fills in overlooked descriptions of features which were
+      described in the <a href="@HOMEPAGE@/NEWS.html">NEWS</a> file
+      but treated sketchily in manual pages.</p>
+    </li>
+  </ul>
+
+  <p>In addition to providing background information to explain
+  these features and show how they evolved, there are corrections,
+  clarifications, etc.:</p>
+
+  <ul>
+    <li>
+      <p>Corrections:</p>
+
+      <ul>
+        <li>
+          <p>remove a stray '/' from description of <tt>%g</tt> in
+          <a href=
+          "@HOMEPAGE@/man/terminfo.5.html#h3-Parameterized-Strings">
+          terminfo(5)</a>.</p>
+        </li>
+
+        <li>
+          <p>correct/improve font-formatting in <a href=
+          "@HOMEPAGE@/man/curs_getch.3x.html">curs_getch.3x</a>, as
+          well as other manual pages.</p>
+        </li>
+      </ul>
+    </li>
+
+    <li>
+      <p>New/improved history and portability sections:</p>
+
+      <ul>
+        <li>
+          <p>add portability notes for <a href=
+          "@HOMEPAGE@/man/curs_initscr.3x.html#h2-PORTABILITY">delscreen</a>
+          and <a href=
+          "@HOMEPAGE@/man/curs_window.3x.html#h2-PORTABILITY">delwin</a>
+          in manual.</p>
+        </li>
+
+        <li>
+          <p>improve <a href=
+          "@HOMEPAGE@/man/curs_slk.3x.html#h2-EXTENSIONS">curs_slk.3x</a>
+          discussion of extensions and portability</p>
+        </li>
+      </ul>
+    </li>
+
+    <li>
+      <p>Other improvements:</p>
+
+      <ul>
+        <li>
+          <p>improve <a href=
+          "@HOMEPAGE@/man/curs_bkgd.3x.html">curs_bkgd.3x</a>,
+          explaining that <tt>bkgdset</tt> can affect results for
+          <tt>bkgd</tt></p>
+        </li>
+
+        <li>
+          <p>add note on portable memory-leak checking in <a href=
+          "@HOMEPAGE@/man/curs_memleaks.3x.html#h2-PORTABILITY">curs_memleaks.3x</a></p>
+        </li>
+
+        <li>
+          <p>expanded description in <a href=
+          "@HOMEPAGE@/man/resizeterm.3x.html">resizeterm.3x</a></p>
+        </li>
+
+        <li>
+          <p>add section on releasing memory to <a href=
+          "@HOMEPAGE@/man/curs_termcap.3x.html#h3-Releasing-Memory">
+          curs_termcap.3x</a> and <a href=
+          "@HOMEPAGE@/man/curs_terminfo.3x.html#h3-Releasing-Memory">
+          curs_terminfo.3x</a> manpages.</p>
+        </li>
+
+        <li>
+          <p>add clarification of the scope of dynamic variables in
+          <a href=
+          "@HOMEPAGE@/man/terminfo.5.html">terminfo(5)</a>.</p>
+        </li>
+
+        <li>
+          <p>improve formatting of <a href=
+          "@HOMEPAGE@/ncurses-intro.html">ncurses-intro.html</a>
+          and <a href=
+          "@HOMEPAGE@/hackguide.html">hackguide.html</a></p>
+        </li>
+
+        <li>
+          <p>improve <a href=
+          "@HOMEPAGE@/man/curs_clear.3x.html">curs_clear.3x</a>
+          links to other pages</p>
+        </li>
+
+        <li>
+          <p>update <a href=
+          "@HOMEPAGE@/howto/NCURSES-Programming-HOWTO.html">ncurses-howto</a>,
+          making documentation fixes along with corrections to
+          example programs.</p>
+        </li>
+
+        <li>
+          <p>use newer version 1.36 of gnathtml for generating Ada
+          html files.</p>
+        </li>
+
+        <li>
+          <p>update external links in <a href=
+          "@HOMEPAGE@/Ada95.html">Ada95.html</a></p>
+        </li>
+      </ul>
+    </li>
+  </ul>
+
+  <p>There are no new manual pages (all of the manual page updates
+  are to existing pages).</p>
+
+  <h3><a name="h3-bug-fixes" id="h3-bug-fixes">Interesting
+  bug-fixes</a></h3>
+
+  <p>While there were many bugs fixed during development of ncurses
+  6.4, only a few (the reason for this release) were both important
+  and interesting. Most of the bug-fixes were for local issues
+  which did not affect compatibility across releases. Since those
+  are detailed in the <a href=
+  "@HOMEPAGE@/NEWS.html#t20221231">NEWS</a> file no elaboration is
+  needed here.</p>
+
+  <p>The interesting bugs were those dealing with memory leaks and
+  buffer overflows. Although the utilities are designed for
+  <em>text</em> files (which they do properly), some choose to test
+  them with <strong>non-</strong><em>text</em> files.</p>
+
+  <ul>
+    <li>
+      <p>Text files contain no embedded nulls. Also, they end with
+      a newline. Feeding <strong>tic</strong> non-text files
+      exposed a few cases where the program did not check for those
+      issues. As a result, further processing of the input found
+      limit-checks whose assumptions were invalid.</p>
+    </li>
+
+    <li>
+      <p>Fixing the limit-checks (first) found a problem with
+      <strong>tic</strong> managing the list of strings in a
+      terminal description. In merging two terminal descriptions
+      (i.e., the &ldquo;use=&rdquo; feature), <strong>tic</strong>
+      was not allocating a complete copy. A quick repair for that
+      introduced a memory leak.</p>
+    </li>
+
+    <li>
+      <p>The checks for non-text files are improved (i.e., embedded
+      nulls in the input file will cause <strong>tic</strong> to
+      reject it rather than attempting to process it).</p>
+    </li>
+
+    <li>
+      <p>The string allocations in <strong>tic</strong> are
+      likewise improved.</p>
+    </li>
+  </ul>
+
+  <h3><a name="h3-config-config" id=
+  "h3-config-config">Configuration changes</a></h3>
+
+  <h4><a name="h4-config-major" id="h4-config-major">Major
+  changes</a></h4>
+
+  <p>There are no major changes. No new options were added. Several
+  improvements were made to configure checks.</p>
+
+  <h4><a name="h4-config-options" id=
+  "h4-config-options">Configuration options</a></h4>
+
+  <p>There are a few new/modified configure options:</p>
+
+  <dl>
+    <dt><tt>--with-abi-version</tt>
+    </dt>
+
+    <dd>
+      <p>add ABI 7 defaults to configure script.</p>
+    </dd>
+
+    <dt><tt>--with-caps</tt>
+    </dt>
+
+    <dd>
+      <p>add warning in configure script if file specified for
+      &ldquo;<tt>--with-caps</tt>&rdquo; does not exist.</p>
+    </dd>
+
+    <dt><tt>--with-manpage-format</tt>
+    </dt>
+
+    <dd>
+      <p>bzip2 and xz compression are now supported</p>
+    </dd>
+
+    <dt><tt>--with-xterm-kbs</tt>
+    </dt>
+
+    <dd>
+      <p>add check/warning in configure script if option
+      &ldquo;<tt>--with-xterm-kbs</tt>&rdquo; is missing or
+      inconsistent</p>
+    </dd>
+  </dl>
+
+  <h3><a name="h3-portability" id="h3-portability">Portability</a></h3>
+
+  <p>Many of the portability changes are implemented via the
+  configure script:</p>
+
+  <ul>
+    <li>
+      <p>amend configure option's auto-search to account for
+      systems where none of the directories known to
+      <em>pkg-config</em> exist</p>
+    </li>
+
+    <li>
+      <p>corrected regex needed for older <em>pkg-config</em> used
+      in Solaris 10</p>
+    </li>
+
+    <li>
+      <p>improve handling of <tt>--with-pkg-config-libdir</tt>
+      option, allowing for the case where either
+      <tt>$PKG_CONFIG_LIBDIR</tt> or the option value has a
+      colon-separated list of directories</p>
+    </li>
+
+    <li>
+      <p>if the <tt>--with-pkg-config-libdir</tt> option is not
+      given, use <tt>${libdir}/pkgconfig</tt> as a default</p>
+    </li>
+
+    <li>
+      <p>improve search-path check for <em>pkg-config</em>, e.g.,
+      for Debian testing which installs <em>pkg-config</em> with
+      architecture-prefixes.</p>
+    </li>
+
+    <li>
+      <p>build-fix for cross-compiling to MingW, conditionally add
+      <tt>-lssp</tt></p>
+    </li>
+
+    <li>
+      <p>improve configure check for <tt>getttynam</tt></p>
+    </li>
+
+    <li>
+      <p>fixes to build with <em>dietlibc</em>:</p>
+
+      <ul>
+        <li>add configure check for <tt>fpathconf</tt></li>
+
+        <li>add configure check for math sine/cosine, needed in
+        test/tclock, and eliminate <tt>pow()</tt> from
+        test/hanoi</li>
+
+        <li>use <tt>wcsnlen</tt> as an alternative to
+        <tt>wmemchr</tt> if it is not found</li>
+      </ul>
+    </li>
+
+    <li>
+      <p>modify configure macro <tt>CF_BUILD_CC</tt> to check if
+      the build-compiler works, rather than that it is different
+      from the cross-compiler, e.g., to accommodate a compiler
+      which can be used for either purpose with different flags</p>
+    </li>
+
+    <li>
+      <p>modify configure/scripts to work around interference by
+      GNU grep 3.8</p>
+    </li>
+  </ul>
+
+  <p>Here are some of the other portability fixes:</p>
+
+  <ul>
+    <li>
+      <p>change <tt>man_db.renames</tt> to template, to handle
+      <em>ncurses*-config</em> script with the
+      <tt>--extra-suffix</tt> configure option.</p>
+    </li>
+
+    <li>
+      <p>update <tt>CF_XOPEN_SOURCE</tt> macro, adding variants
+      &ldquo;gnueabi" and &ldquo;gnueabihf" to get
+      <tt>_DEFAULT_SOURCE</tt> special case, as well as adding GNU
+      libc suffixes for &ldquo;abi64&rdquo;, &ldquo;abin32&rdquo;,
+      &ldquo;x32&rdquo; to distinguish it from other libc
+      flavors.</p>
+    </li>
+
+    <li>
+      <p>work around <em>musl</em>'s nonstandard use of feature
+      test macros by adding a definition for
+      <tt>NCURSES_WIDECHAR</tt> to the generated &ldquo;.pc&rdquo;
+      and <em><tt>*-config</tt></em> files.</p>
+    </li>
+
+    <li>
+      <p>use &ldquo;<tt>command -v</tt>&rdquo; rather than
+      &ldquo;<tt>type</tt>&rdquo; in <tt>Ada95/gen/Makefile.in</tt>
+      to fix a portability issue.</p>
+    </li>
+  </ul>
+
+  <hr>
+
+  <h2><a name="h2-features" id="h2-features">Features of
+  <span class="main-name">ncurses</span></a></h2>
+
+  <p>The <span class="main-name">ncurses</span> package is fully
+  upward-compatible with SVr4 (System V Release 4) curses:</p>
+
+  <ul>
+    <li>
+      <p>All of the SVr4 calls have been implemented (and are
+      documented).</p>
+    </li>
+
+    <li>
+      <p><span class="main-name">ncurses</span> supports all of the
+      for SVr4 curses features including keyboard mapping, color,
+      forms-drawing with ACS characters, and automatic recognition
+      of keypad and function keys.</p>
+    </li>
+
+    <li>
+      <p><span class="main-name">ncurses</span> provides these SVr4
+      add-on libraries (not part of X/Open Curses):</p>
+
+      <ul>
+        <li>
+          <p>the panels library, supporting a stack of windows with
+          backing store.</p>
+        </li>
+
+        <li>
+          <p>the menus library, supporting a uniform but flexible
+          interface for menu programming.</p>
+        </li>
+
+        <li>
+          <p>the form library, supporting data collection through
+          on-screen forms.</p>
+        </li>
+      </ul>
+    </li>
+
+    <li>
+      <p><span class="main-name">ncurses</span>'s terminal database
+      is fully compatible with that used by SVr4 curses.</p>
+
+      <ul>
+        <li>
+          <p><span class="main-name">ncurses</span> supports
+          user-defined capabilities which it can see, but which are
+          hidden from SVr4 curses applications using the
+          <em>same</em> terminal database.</p>
+        </li>
+
+        <li>
+          <p>It can be optionally configured to match the format
+          used in related systems such as AIX and Tru64.</p>
+        </li>
+
+        <li>
+          <p>Alternatively, <span class="main-name">ncurses</span>
+          can be configured to use hashed databases rather than the
+          directory of files used by SVr4 curses.</p>
+        </li>
+      </ul>
+    </li>
+
+    <li>
+      <p>The <span class="main-name">ncurses</span> utilities have
+      options to allow you to filter terminfo entries for use with
+      less capable <em>curses</em>/<em>terminfo</em> versions such
+      as the HP-UX and AIX ports.</p>
+    </li>
+  </ul>
+
+  <p>The <span class="main-name">ncurses</span> package also has
+  many useful extensions over SVr4:</p>
+
+  <ul>
+    <li>
+      <p>The API is 8-bit clean and base-level conformant with the
+      X/OPEN curses specification, XSI curses (that is, it
+      implements all <em>BASE</em> level features, and most
+      <em>EXTENDED</em> features). It includes many function calls
+      not supported under SVr4 curses (but portability of all calls
+      is documented so you can use the SVr4 subset only).</p>
+    </li>
+
+    <li>
+      <p>Unlike SVr3 curses, <span class="main-name">ncurses</span>
+      can write to the rightmost-bottommost corner of the screen if
+      your terminal has an insert-character capability.</p>
+    </li>
+
+    <li>
+      <p>Ada95 and C++ bindings.</p>
+    </li>
+
+    <li>
+      <p>Support for mouse event reporting with X Window xterm and
+      FreeBSD and OS/2 console windows.</p>
+    </li>
+
+    <li>
+      <p>Extended mouse support via Alessandro Rubini's gpm
+      package.</p>
+    </li>
+
+    <li>
+      <p>The function <code>wresize</code> allows you to resize
+      windows, preserving their data.</p>
+    </li>
+
+    <li>
+      <p>The function <code>use_default_colors</code> allows you to
+      use the terminal's default colors for the default color pair,
+      achieving the effect of transparent colors.</p>
+    </li>
+
+    <li>
+      <p>The functions <code>keyok</code> and
+      <code>define_key</code> allow you to better control the use
+      of function keys, e.g., disabling the <span class=
+      "main-name">ncurses</span> KEY_MOUSE, or by defining more
+      than one control sequence to map to a given key code.</p>
+    </li>
+
+    <li>
+      <p>Support for direct-color terminals, such as modern
+      xterm.</p>
+    </li>
+
+    <li>
+      <p>Support for 256-color terminals, such as modern xterm.</p>
+    </li>
+
+    <li>
+      <p>Support for 16-color terminals, such as <em>aixterm</em>
+      and <em>modern xterm</em>.</p>
+    </li>
+
+    <li>
+      <p>Better cursor-movement optimization. The package now
+      features a cursor-local-movement computation more efficient
+      than either BSD's or System V's.</p>
+    </li>
+
+    <li>
+      <p>Super hardware scrolling support. The screen-update code
+      incorporates a novel, simple, and cheap algorithm that
+      enables it to make optimal use of hardware scrolling,
+      line-insertion, and line-deletion for screen-line movements.
+      This algorithm is more powerful than the 4.4BSD curses
+      <code>quickch</code> routine.</p>
+    </li>
+
+    <li>
+      <p>Real support for terminals with the magic-cookie glitch.
+      The screen-update code will refrain from drawing a highlight
+      if the magic- cookie unattributed spaces required just before
+      the beginning and after the end would step on a non-space
+      character. It will automatically shift highlight boundaries
+      when doing so would make it possible to draw the highlight
+      without changing the visual appearance of the screen.</p>
+    </li>
+
+    <li>
+      <p>It is possible to generate the library with a list of
+      pre-loaded fallback entries linked to it so that it can serve
+      those terminal types even when no terminfo tree or termcap
+      file is accessible (this may be useful for support of
+      screen-oriented programs that must run in single-user
+      mode).</p>
+    </li>
+
+    <li>
+      <p>The <a href="@HOMEPAGE@/man/tic.1m.html"><span class=
+      "part-name">tic</span></a>/<a href=
+      "@HOMEPAGE@/man/captoinfo.1m.html">captoinfo</a> utility
+      provided with <span class="main-name">ncurses</span> has the
+      ability to translate many termcaps from the XENIX, IBM and
+      AT&amp;T extension sets.</p>
+    </li>
+
+    <li>
+      <p>A BSD-like <a href=
+      "@HOMEPAGE@/man/tset.1.html"><span class=
+      "part-name">tset</span></a> utility is provided.</p>
+    </li>
+
+    <li>
+      <p>The <span class="main-name">ncurses</span> library and
+      utilities will automatically read terminfo entries from
+      $HOME/.terminfo if it exists, and compile to that directory
+      if it exists and the user has no write access to the system
+      directory. This feature makes it easier for users to have
+      personal terminfo entries without giving up access to the
+      system terminfo directory.</p>
+    </li>
+
+    <li>
+      <p>You may specify a path of directories to search for
+      compiled descriptions with the environment variable
+      TERMINFO_DIRS (this generalizes the feature provided by
+      TERMINFO under stock System V.)</p>
+    </li>
+
+    <li>
+      <p>In terminfo source files, use capabilities may refer not
+      just to other entries in the same source file (as in System
+      V) but also to compiled entries in either the system terminfo
+      directory or the user's $HOME/.terminfo directory.</p>
+    </li>
+
+    <li>
+      <p>The table-of-entries utility <a href=
+      "@HOMEPAGE@/man/toe.1m.html"><span class=
+      "part-name">toe</span></a> makes it easy for users to see
+      exactly what terminal types are available on the system.</p>
+    </li>
+
+    <li>
+      <p>The library meets the XSI requirement that every macro
+      entry point has a corresponding function which may be linked
+      (and will be prototype-checked) if the macro definition is
+      disabled with <code>#undef</code>.</p>
+    </li>
+
+    <li>
+      <p>Extensive documentation is provided (see the <em><a href=
+      "@HOMEPAGE@/ncurses.faq.html#additional_reading">Additional
+      Reading</a></em> section of the <em><a href=
+      "@HOMEPAGE@/ncurses.faq.html"><span class=
+      "main-name">ncurses</span> FAQ</a></em> for online
+      documentation).</p>
+    </li>
+  </ul>
+
+  <h2><a name="h2-who-uses" id="h2-who-uses">Applications using
+  <span class="main-name">ncurses</span></a></h2>
+
+  <p>The <span class="main-name">ncurses</span> distribution
+  includes a selection of test programs (including a few games).
+  These are available separately as <a href=
+  "@HOMEPAGE@/ncurses-examples.html">ncurses-examples</a></p>
+
+  <p>The ncurses library has been tested with a wide variety of
+  applications including:</p>
+
+  <blockquote>
+    <dl>
+      <dt><span class="part-name">aptitude</span>
+      </dt>
+
+      <dd>
+        <p>FrontEnd to Apt, the debian package manager</p>
+
+        <p><a href=
+        "https://wiki.debian.org/Aptitude">https://wiki.debian.org/Aptitude</a></p>
+      </dd>
+
+      <dt><span class="part-name">cdk</span>
+      </dt>
+
+      <dd>
+        <p>Curses Development Kit</p>
+
+        <p><a href="@WEBSITE@/cdk/">@WEBSITE@/cdk/</a><br>
+        </p>
+      </dd>
+
+      <dt><span class="part-name">ded</span>
+      </dt>
+
+      <dd>
+        <p>directory-editor</p>
+
+        <p><a href="@WEBSITE@/ded/">@WEBSITE@/ded/</a></p>
+      </dd>
+
+      <dt><span class="part-name">dialog</span>
+      </dt>
+
+      <dd>
+        <p>the underlying application used in Slackware's setup,
+        and the basis for similar install/configure applications on
+        many systems.</p>
+
+        <p><a href="@WEBSITE@/dialog/">@WEBSITE@/dialog/</a></p>
+      </dd>
+
+      <dt><span class="part-name">lynx</span>
+      </dt>
+
+      <dd>
+        <p>the text WWW browser</p>
+
+        <p><a href=
+        "https://lynx.invisible-island.net/">https://lynx.invisible-island.net/</a></p>
+      </dd>
+
+      <dt><span class="part-name">mutt</span>
+      </dt>
+
+      <dd>
+        <p>mail utility</p>
+
+        <p><a href="http://www.mutt.org/">http://www.mutt.org/</a></p>
+      </dd>
+
+      <dt><span class="part-name">ncftp</span>
+      </dt>
+
+      <dd>
+        <p>file-transfer utility</p>
+
+        <p><a href=
+        "https://www.ncftp.com/">https://www.ncftp.com/</a></p>
+      </dd>
+
+      <dt><span class="part-name">nvi</span>
+      </dt>
+
+      <dd>
+        <p>New vi uses ncurses.</p>
+
+        <p><a href=
+        "https://sites.google.com/a/bostic.com/keithbostic/vi">https://sites.google.com/a/bostic.com/keithbostic/vi</a><br>
+
+        </p>
+      </dd>
+
+      <dt><span class="part-name">ranger</span>
+      </dt>
+
+      <dd>
+        <p>A console file manager with VI key bindings in
+        <em>Python</em>.</p>
+
+        <p><a href=
+        "https://ranger.github.io/">https://ranger.github.io/</a></p>
+      </dd>
+
+      <dt><span class="part-name">tin</span>
+      </dt>
+
+      <dd>
+        <p>newsreader, supporting color, MIME</p>
+
+        <p><a href="http://www.tin.org/">http://www.tin.org/</a></p>
+      </dd>
+
+      <dt><span class="part-name">vifm</span>
+      </dt>
+
+      <dd>
+        <p>File manager with vi like keybindings</p>
+
+        <p><a href="https://vifm.info/">https://vifm.info/</a></p>
+      </dd>
+    </dl>
+  </blockquote>
+
+  <p>as well as some that use <span class=
+  "main-name">ncurses</span> for the terminfo support alone:</p>
+
+  <blockquote>
+    <dl>
+      <dt><span class="part-name">minicom</span>
+      </dt>
+
+      <dd>
+        <p>terminal emulator for serial modem connections</p>
+
+        <p><a href=
+        "https://alioth.debian.org/projects/minicom/">https://alioth.debian.org/projects/minicom/</a></p>
+      </dd>
+
+      <dt><span class="part-name">mosh</span>
+      </dt>
+
+      <dd>
+        <p>a replacement for <code>ssh</code>.</p>
+
+        <p><a href="https://mosh.org/">https://mosh.org/</a></p>
+      </dd>
+
+      <dt><span class="part-name">tack</span>
+      </dt>
+
+      <dd>
+        <p>terminfo action checker</p>
+
+        <p><a href="@HOMEPAGE@/tack.html">@HOMEPAGE@/tack.html</a></p>
+      </dd>
+
+      <dt><span class="part-name">tmux</span>
+      </dt>
+
+      <dd>
+        <p>terminal multiplexor</p>
+
+        <p><a href=
+        "https://github.com/tmux/tmux/wiki">https://github.com/tmux/tmux/wiki</a></p>
+      </dd>
+
+      <dt><span class="part-name">vile</span>
+      </dt>
+
+      <dd>
+        <p><em>vi-like-emacs</em> may be built to use the terminfo,
+        termcap or curses interfaces.</p>
+
+        <p><a href="@WEBSITE@/vile/">@WEBSITE@/vile/</a></p>
+      </dd>
+    </dl>
+  </blockquote>
+
+  <p>and finally, those which use only the termcap interface:</p>
+
+  <blockquote>
+    <dl>
+      <dt><span class="part-name">emacs</span>
+      </dt>
+
+      <dd>
+        <p>text editor</p>
+
+        <p><a href=
+        "https://www.gnu.org/software/emacs/">https://www.gnu.org/software/emacs/</a></p>
+      </dd>
+
+      <dt><span class="part-name">less</span>
+      </dt>
+
+      <dd>
+        <p>The most commonly used <em>pager</em> (a program that
+        displays text files).</p>
+
+        <p><a href=
+        "http://www.greenwoodsoftware.com/less/">http://www.greenwoodsoftware.com/less/</a></p>
+      </dd>
+
+      <dt><span class="part-name">screen</span>
+      </dt>
+
+      <dd>
+        <p>terminal multiplexor</p>
+
+        <p><a href=
+        "https://www.gnu.org/software/screen/">https://www.gnu.org/software/screen/</a></p>
+      </dd>
+
+      <dt><span class="part-name">vim</span>
+      </dt>
+
+      <dd>
+        <p>text editor</p>
+
+        <p><a href="https://www.vim.org/">https://www.vim.org/</a></p>
+      </dd>
+    </dl>
+  </blockquote>
+
+  <h2><a name="h2-development" id="h2-development">Development
+  activities</a></h2>
+
+  <p>Zeyd Ben-Halim started <span class="main-name">ncurses</span>
+  from a previous package pcurses, written by Pavel Curtis. Eric S.
+  Raymond continued development. J&uuml;rgen Pfeifer wrote most of
+  the form and menu libraries.</p>
+
+  <p>Ongoing development work is done by <a href=
+  "mailto:dickey@invisible-island.net">Thomas E. Dickey</a>. Thomas
+  E. Dickey has acted as the maintainer for the Free Software
+  Foundation, which held a <a href=
+  "@HOMEPAGE@/ncurses-license.html">copyright on ncurses</a> for
+  releases 4.2 through 6.1. Following the release of ncurses 6.1,
+  effective as of release 6.2, copyright for ncurses reverted to
+  Thomas E. Dickey (see the <a href=
+  "@HOMEPAGE@/ncurses.faq.html#relicensed">ncurses FAQ</a> for
+  additional information).</p>
+
+  <p>Contact the current maintainers at</p>
+
+  <blockquote>
+    <a href="mailto:bug-ncurses@gnu.org">bug-ncurses@gnu.org</a>
+  </blockquote>
+
+  <p>To join the ncurses mailing list, please write email to</p>
+
+  <blockquote>
+    <a href=
+    "mailto:bug-ncurses-request@gnu.org">bug-ncurses-request@gnu.org</a>
+  </blockquote>
+  containing the line:
+  <blockquote>
+    <p><code>subscribe</code>
+    <em>&lt;name&gt;@&lt;host.domain&gt;</em></p>
+  </blockquote>
+
+  <p>This list is open to anyone interested in helping with the
+  development and testing of this package.</p>
+
+  <p>Beta versions of <span class="main-name">ncurses</span> are
+  made available at</p>
+
+  <blockquote>
+    <p><a href=
+    "https://invisible-island.net/archives/ncurses/current/">https://invisible-island.net/archives/ncurses/current/</a>
+    and<br>
+    <a href=
+    "https://invisible-mirror.net/archives/ncurses/current/">https://invisible-mirror.net/archives/ncurses/current/</a>&nbsp;.</p>
+  </blockquote>
+
+  <p>Patches to the current release are made available at</p>
+
+  <blockquote>
+    <p><a href=
+    "https://invisible-island.net/archives/ncurses/6.3/">https://invisible-island.net/archives/ncurses/6.3/</a>
+    and<br>
+    <a href=
+    "https://invisible-mirror.net/archives/ncurses/6.3/">https://invisible-mirror.net/archives/ncurses/6.3/</a>&nbsp;.</p>
+  </blockquote>
+
+  <p>There is an archive of the mailing list here:</p>
+
+  <blockquote>
+    <p><a href=
+    "http://lists.gnu.org/archive/html/bug-ncurses">http://lists.gnu.org/archive/html/bug-ncurses</a>
+    (also <a href=
+    "https://lists.gnu.org/archive/html/bug-ncurses">https</a>)</p>
+  </blockquote>
+
+  <h2><a name="h2-this-stuff" id="h2-this-stuff">Related
+  resources</a></h2>
+
+  <p>The release notes make scattered references to these pages,
+  which may be interesting by themselves:</p>
+
+  <ul>
+    <li><a href="@HOMEPAGE@/ncurses-license.html"><span class=
+    "main-name">ncurses</span> licensing</a></li>
+
+    <li><a href="@HOMEPAGE@/ncurses-mapsyms.html">Symbol versioning
+    in <span class="main-name">ncurses</span></a></li>
+
+    <li><a href="@HOMEPAGE@/ncurses-slang.html">Comments on
+    <span class="main-name">ncurses</span> versus <span class=
+    "main-name">slang</span> (S-Lang)</a></li>
+
+    <li><a href="@HOMEPAGE@/ncurses-openbsd.html">Comments on
+    <span class="main-name">OpenBSD</span></a></li>
+
+    <li><a href="@HOMEPAGE@/tack.html">tack &ndash; terminfo action
+    checker</a></li>
+
+    <li><a href="@HOMEPAGE@/tctest.html">tctest &ndash; termcap
+    library checker</a></li>
+
+    <li><a href=
+    "@HOMEPAGE@/ncurses.html#download_database">Terminal
+    Database</a></li>
+  </ul>
+
+  <h2><a name="h2-other-stuff" id="h2-other-stuff">Other
+  resources</a></h2>
+
+  <p>The distribution provides a newer version of the
+  terminfo-format terminal description file once maintained by
+  <a href="http://www.catb.org/~esr/terminfo/">Eric
+  Raymond</a>&nbsp;. Unlike the older version, the termcap and
+  terminfo data are provided in the same file, which also provides
+  several user-definable extensions beyond the X/Open
+  specification.</p>
+
+  <p>You can find lots of information on terminal-related topics
+  not covered in the terminfo file at <a href=
+  "http://web.archive.org/web/*/http://www.cs.utk.edu/~shuford/terminal">
+  Richard Shuford's archive</a>&nbsp;. The collection of computer
+  manuals at <a href=
+  "http://www.bitsavers.org/pdf/">bitsavers.org</a> has also been
+  useful.</p>
+
+  <div class="nav">
+    <ul>
+      <li><a href="#h2-overview">Overview</a></li>
+
+      <li>
+        <a href="#h2-release-notes">Release Notes</a>
+        <ul>
+          <li>
+            <a href="#h3-library">Library improvements</a>
+            <ul>
+              <li><a href="#h4-new-library">New features</a></li>
+
+              <li><a href="#h4-fixes-library">Other
+              improvements</a></li>
+            </ul>
+          </li>
+
+          <li>
+            <a href="#h3-programs">Program improvements</a>
+            <ul>
+              <li><a href="#h4-utilities">Utilities</a></li>
+
+              <li><a href="#h4-examples">Examples</a></li>
+            </ul>
+          </li>
+
+          <li><a href="#h3-database">Terminal database</a></li>
+
+          <li><a href="#h3-documentation">Documentation</a></li>
+
+          <li><a href="#h3-bug-fixes">Interesting bug-fixes</a></li>
+
+          <li>
+            <a href="#h3-config-config">Configuration changes</a>
+            <ul>
+              <li><a href="#h4-config-major">Major changes</a></li>
+
+              <li><a href="#h4-config-options">Configuration
+              options</a></li>
+            </ul>
+          </li>
+
+          <li><a href="#h3-portability">Portability</a></li>
+        </ul>
+      </li>
+
+      <li><a href="#h2-features">Features of <span class=
+      "main-name">ncurses</span></a></li>
+
+      <li><a href="#h2-who-uses">Applications using <span class=
+      "main-name">ncurses</span></a></li>
+
+      <li><a href="#h2-development">Development activities</a></li>
+
+      <li><a href="#h2-this-stuff">Related resources</a></li>
+
+      <li><a href="#h2-other-stuff">Other resources</a></li>
+    </ul>
+  </div>
+</body>
+</html>
diff --git a/c++/Makefile.in b/c++/Makefile.in
new file mode 100644
index 0000000..99f21da
--- /dev/null
+++ b/c++/Makefile.in
@@ -0,0 +1,292 @@
+# $Id: Makefile.in,v 1.133 2021/07/03 18:53:57 tom Exp $
+##############################################################################
+# Copyright 2018-2020,2021 Thomas E. Dickey                                  #
+# Copyright 1998-2015,2016 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey
+#
+#  Simple makefile for c++ window class demo
+
+# turn off _all_ suffix rules; we'll generate our own
+.SUFFIXES:
+
+SHELL		= @SHELL@
+VPATH		= @srcdir@
+
+CF_MFLAGS 	= @cf_cv_makeflags@
+@SET_MAKE@
+x		= @EXEEXT@
+o		= .@OBJEXT@
+
+MODEL		= ../@DFT_OBJ_SUBDIR@
+DESTDIR		= @DESTDIR@
+top_srcdir	= @top_srcdir@
+srcdir		= @srcdir@
+prefix		= @prefix@
+exec_prefix	= @exec_prefix@
+bindir		= @bindir@
+libdir		= @libdir@
+includedir	= @includedir@
+includesubdir	= @includesubdir@
+
+INCLUDEDIR	= $(DESTDIR)$(includedir)$(includesubdir)
+
+PACKAGE		= @PACKAGE@
+
+LIBTOOL		= @LIBTOOL_CXX@
+LIBTOOL_OPTS	= @LIBTOOL_OPTS@ @LIBTOOL_OPTS_CXX@
+LIBTOOL_CLEAN	= @LIB_CLEAN@
+LIBTOOL_COMPILE	= @LIB_COMPILE@
+LIBTOOL_LINK	= @LIB_LINK@
+LIBTOOL_INSTALL	= @LIB_INSTALL@
+LIBTOOL_UNINSTALL = @LIB_UNINSTALL@
+LIBTOOL_VERSION = @LIBTOOL_VERSION@
+LT_UNDEF	= @LT_UNDEF@
+
+INSTALL		= @INSTALL@
+INSTALL_LIB	= $(INSTALL) @INSTALL_LIB@
+INSTALL_DATA	= @INSTALL_DATA@
+INSTALL_OPT_P	= @INSTALL_OPT_P@
+
+AR		= @AR@
+ARFLAGS		= @ARFLAGS@
+AWK		= @AWK@
+LD		= @LD@
+LN_S		= @LN_S@
+
+CXX_AR		= @CXX_AR@
+CXX_ARFLAGS	= @CXX_ARFLAGS@
+RANLIB		= @LIB_PREP@
+
+CXX		= @CXX@
+CPP		= @CXXCPP@
+CXXFLAGS	= @CXXFLAGS@ @EXTRA_CXXFLAGS@
+CXXLIBS		= @CXXLIBS@
+
+INCDIR		= ../include
+CPPFLAGS	= -DHAVE_CONFIG_H -DBUILDING_NCURSES_CXX -I../c++ @CPPFLAGS@
+
+CTAGS		= @CTAGS@
+ETAGS		= @ETAGS@
+
+CC		= ${CXX}
+CCFLAGS		= $(CPPFLAGS) $(CXXFLAGS)
+
+CFLAGS_LIBTOOL	= $(CCFLAGS)
+CFLAGS_NORMAL	= $(CCFLAGS) -DNCURSES_STATIC
+CFLAGS_DEBUG	= $(CCFLAGS) -DNCURSES_STATIC @CXX_G_OPT@ -DTRACE
+CFLAGS_PROFILE	= $(CCFLAGS) -DNCURSES_STATIC -pg
+CFLAGS_SHARED	= $(CCFLAGS) @CC_SHARED_OPTS@
+
+CFLAGS_DEFAULT	= $(CFLAGS_@DFT_UPR_MODEL@)
+
+NCURSES_MAJOR	= @NCURSES_MAJOR@
+NCURSES_MINOR	= @NCURSES_MINOR@
+REL_VERSION     = @cf_cv_rel_version@
+ABI_VERSION	= @cf_cv_abi_version@
+
+LOCAL_LIBDIR	= @top_builddir@/lib
+
+LINK		= @LINK_PROGS@ $(LIBTOOL_LINK) @CXXLDFLAGS@
+SHLIB_DIRS	= -L../lib
+SHLIB_LIST	= $(SHLIB_DIRS) \
+		-l@FORM_NAME@@USE_LIB_SUFFIX@ \
+		-l@MENU_NAME@@USE_LIB_SUFFIX@ \
+		-l@PANEL_NAME@@USE_LIB_SUFFIX@ \
+		-lncurses@USE_LIB_SUFFIX@ @SHLIB_LIST@
+
+LIBROOT		= ncurses++
+
+LIBNAME_LIBTOOL	= @LIB_PREFIX@$(LIBROOT)@USE_LIB_SUFFIX@.la
+LIBNAME_NORMAL	= @LIB_PREFIX@$(LIBROOT)@USE_LIB_SUFFIX@.a
+LIBNAME		= @LIB_PREFIX@$(LIBROOT)@CXX_LIB_SUFFIX@
+
+LIBRARIES	= @Libs_To_Make@
+
+LINT		= @LINT@
+LINT_OPTS	= @LINT_OPTS@
+LINT_LIBS	= -lncurses @LIBS@
+
+LINK_FLAGS	= @EXTRA_LDFLAGS@ -L../lib -l$(LIBROOT)@USE_LIB_SUFFIX@
+RPATH_LIST	= @RPATH_LIST@
+MK_SHARED_LIB	= @MK_SHARED_LIB@
+
+LINK_LIBTOOL	= @EXTRA_LDFLAGS@ -L../lib $(LIBRARIES)
+LINK_NORMAL	= $(LINK_FLAGS)
+LINK_DEBUG	= $(LINK_FLAGS)
+LINK_PROFILE	= $(LINK_FLAGS)
+LINK_SHARED	= $(LINK_FLAGS)
+
+# flags for test-programs
+TEST_LIBS	= @TEST_LIBS@
+TEST_ARGS	= @LDFLAGS_STATIC@ @TEST_ARGS@ @LDFLAGS_SHARED@
+TEST_LDFLAGS	= $(TEST_ARGS) @LDFLAGS@ \
+	@LD_MODEL@ $(TEST_LIBS) @LIBS@ @LOCAL_LDFLAGS@ $(CXXLIBS)
+
+LDFLAGS_LIBTOOL	= $(TEST_LDFLAGS) $(CFLAGS_LIBTOOL)
+LDFLAGS_NORMAL	= $(TEST_LDFLAGS) $(CFLAGS_NORMAL)
+LDFLAGS_DEBUG	= $(TEST_LDFLAGS) $(CFLAGS_DEBUG)
+LDFLAGS_PROFILE	= $(TEST_LDFLAGS) $(CFLAGS_PROFILE)
+LDFLAGS_SHARED	= $(TEST_LDFLAGS) $(CFLAGS_SHARED) @LD_SHARED_OPTS@
+
+LDFLAGS_DEFAULT	= $(LINK_@DFT_UPR_MODEL@) $(LDFLAGS_@DFT_UPR_MODEL@)
+
+# flags for library built by this makefile
+LDFLAGS		= $(TEST_ARGS) @LDFLAGS@ \
+	@LD_MODEL@ $(TEST_LIBS) @LIBS@ $(CXXLIBS)
+
+AUTO_SRC	= \
+		etip.h
+
+################################################################################
+
+@MAKE_PHONY@.PHONY :	all
+@MAKE_PHONY@.PHONY :	check
+@MAKE_PHONY@.PHONY :	clean
+@MAKE_PHONY@.PHONY :	depend
+@MAKE_PHONY@.PHONY :	distclean
+@MAKE_PHONY@.PHONY :	install
+@MAKE_PHONY@.PHONY :	install.libs
+@MAKE_PHONY@.PHONY :	libs
+@MAKE_PHONY@.PHONY :	mostlyclean
+@MAKE_PHONY@.PHONY :	realclean
+@MAKE_PHONY@.PHONY :	sources
+@MAKE_PHONY@.PHONY :	uninstall
+@MAKE_PHONY@.PHONY :	uninstall.libs
+
+all \
+libs ::		$(AUTO_SRC) $(LIBRARIES)
+
+@MAKE_TESTS@all ::		demo$x
+
+depend :
+
+sources :	$(AUTO_SRC)
+
+tags:
+	$(CTAGS) *.[h] *.cc
+
+$(DESTDIR)$(libdir) :
+	mkdir -p $@
+
+mostlyclean ::
+	-rm -f core tags TAGS *~ *.bak *.i *.ii *.ln *.atac trace
+
+clean :: mostlyclean
+	-$(SHELL) -c "if test -n '$x' ; then $(MAKE) clean x=''; fi"
+	-rm -rf $(MODEL)/SunWS_cache
+	-$(LIBTOOL_CLEAN) rm -f demo$x $(AUTO_SRC) $(LIBRARIES) $(OBJS_DEMO)
+	-rm -rf .libs *.dSYM
+
+distclean :: clean
+	-rm -f Makefile
+
+realclean :: distclean
+
+###############################################################################
+
+HEADER_DEPS	= @INTERNALS_HDR@ \
+	etip.h \
+	../include/curses.h \
+	../include/eti.h \
+	../include/form.h \
+	../include/menu.h \
+	../include/ncurses_cfg.h \
+	../include/ncurses_def.h \
+	../include/ncurses_dll.h \
+	../include/panel.h \
+	../include/unctrl.h \
+	$(INCDIR)/nc_string.h \
+	$(srcdir)/cursesp.h \
+	$(srcdir)/cursesw.h \
+	$(srcdir)/cursslk.h \
+	$(srcdir)/internal.h
+
+cursesw_h	= $(srcdir)/cursesw.h \
+		  $(HEADER_DEPS)
+
+cursesp_h	= $(srcdir)/cursesp.h \
+		  $(cursesw_h)
+
+cursesf_h	= $(srcdir)/cursesf.h \
+		  $(cursesp_h)
+
+cursesm_h	= $(srcdir)/cursesm.h \
+		  $(cursesp_h)
+
+cursslk_h	= $(srcdir)/cursslk.h \
+		  $(cursesw_h)
+
+cursesapp_h	= $(srcdir)/cursesapp.h \
+		  $(cursslk_h)
+
+$(INCDIR)/form.h :
+	( cd ../form && $(MAKE) $@ )
+
+$(INCDIR)/menu.h :
+	( cd ../menu && $(MAKE) $@ )
+
+$(INCDIR)/panel.h :
+	( cd ../panel && $(MAKE) $@ )
+
+###############################################################################
+
+OBJS_DEMO = $(MODEL)/demo$o
+
+$(MODEL)/demo$o : $(srcdir)/demo.cc \
+		$(HEADER_DEPS) \
+		$(cursesf_h) \
+		$(cursesm_h) \
+		$(cursesapp_h)
+	@echo 'compiling demo (obj_s)'
+	@( cd $(MODEL) && $(LIBTOOL_COMPILE) $(CXX) $(CFLAGS_DEFAULT) -c $(top_srcdir)/c++/demo.cc -o $@ )
+
+demo$x:	$(OBJS_DEMO) \
+	$(LIBRARIES)  \
+	@TEST_DEPS@
+	@ECHO_LD@ $(LINK) -o $@ $(OBJS_DEMO) $(LDFLAGS_DEFAULT)
+
+etip.h:	$(srcdir)/etip.h.in $(srcdir)/edit_cfg.sh
+	cp $(srcdir)/etip.h.in $@
+	$(SHELL) $(srcdir)/edit_cfg.sh ../include/ncurses_cfg.h $@
+
+# Verify that each header-file can be compiled without including another.
+check ::
+	@$(SHELL) -c "for header in *.h;\
+		do \
+			[ \$${header} = etip.h ] && continue; \
+			echo \"** testing \$${header}\" ; \
+			echo \"#include <\$${header}>\" >headers.cc; \
+			echo \"int main(int argc, char **argv) { (void) argc; (void) argv; return 0; }\" >>headers.cc; \
+			$(CXX) -c $(CXXFLAGS) $(CPPFLAGS) headers.cc; \
+		done"
+	-@rm -f headers.*
+
+###############################################################################
+# The remainder of this file is automatically generated during configuration
+###############################################################################
diff --git a/c++/NEWS b/c++/NEWS
new file mode 100644
index 0000000..998e5ff
--- /dev/null
+++ b/c++/NEWS
@@ -0,0 +1,72 @@
+-------------------------------------------------------------------------------
+-- Copyright 2020,2021 Thomas E. Dickey                                      --
+-- Copyright 1998-1999,2006 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: NEWS,v 1.6 2021/06/17 21:20:30 tom Exp $
+-------------------------------------------------------------------------------
+This is a log of changes that the ncurses C++ binding has gone
+through starting with the integration of menu and forms integration
+into the binding.
+
+990731  + Improve support for pads. A viewport window may now be added to
+          a pad. It will then be possible to use a builtin panning mechanism
+          to view the pad.
+
+970908	+ Improve NCursesWindow class: added additional methods to
+	  cover more ncurses functionality. Make refresh() and
+	  noutrefresh() virtual members to allow different implementation
+	  in the NCursesPanel class.
+	+ CAUTION: changed order of parameters in vline() and hline() of
+	  NCursesWindow class.
+	+ Make refresh() in NCursesPanel non-static, it is now a
+	  reimplementation  of refresh() in the base class. Added
+	  noutrefresh() to NCursesPanel.
+	+ Added NCursesForm and related classes to support libform
+	  functionality.
+	+ Moved most of configuration related stuff from cursesw.h to
+	  etip.h
+	+ Added NCursesApplication class to support easy configuration
+	  of menu and forms related attributes as well as ripped of
+	  title lines and Soft-Label-Keys for an application.
+	+ Support of Auto-Cleanup for a menus fieldlist.
+	+ Change of return type for current_item() and operator[] for
+	  menus.
+	+ Enhanced demo.
+970502
+	+ Introduced the THROW and THROWS functions/macros to prepare
+	  a smoother transition to real exception handling.
+	+ Exception classes provided in etip.h
+	+ Added the NCursesMenu class to support libmenu functionality.
+	+ The inheritace relation between NCursesWindow and NCursesColorWindow
+	  was kind of brain damage. Monochrome is a special case of colored, so
+	  the relation should be just the opposite. This would allow all
+	  derived classes like NCursesPanel, NCursesMenu or NCursesForm to
+	  have colors.
+	  To resolve that design flaw I put the color functionality into the
+	  NCursesWindow class and it can be switched on by the static member
+	  useColors(). NCursesColorWindow is still there for compatibility
+	  reasons.
diff --git a/c++/PROBLEMS b/c++/PROBLEMS
new file mode 100644
index 0000000..daa3754
--- /dev/null
+++ b/c++/PROBLEMS
@@ -0,0 +1,35 @@
+-------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                           --
+-- Copyright 1998,2006 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: PROBLEMS,v 1.4 2020/02/02 23:34:34 tom Exp $
+-------------------------------------------------------------------------------
+This is a list of open problems. This mainly lists known missing pieces
+and design flaws.
+
+1. Testing!!!
+2. Better demo program
diff --git a/c++/README-first b/c++/README-first
new file mode 100644
index 0000000..313c1f8
--- /dev/null
+++ b/c++/README-first
@@ -0,0 +1,81 @@
+-------------------------------------------------------------------------------
+-- Copyright 2020,2021 Thomas E. Dickey                                      --
+-- Copyright 1998-2006,2007 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: README-first,v 1.11 2021/06/17 21:20:30 tom Exp $
+-------------------------------------------------------------------------------
+                  C++ interface to ncurses routines
+-----------------------------------------------------------------------
+
+This directory contains the source code for several C++ classes which
+ease the use of writing ncurses-based programs.  The code was originally
+derived from the libg++ CursesWindow class, but rewritten for ncurses.
+
+The classes simplify the use of window specific functions by
+encapsulating them in the window object.  Function overloading is
+used in order to narrow the interface.  For example, you do not have the
+distinction between `printw' and `mvprintw' anymore.
+
+A second benefit is the removal of all #defines which are included in
+the curses.h file.  This is a steady cause of trouble because many
+common identifiers are used.  Instead now all #defines are inline
+functions, which also allows strict type checking of arguments.
+
+The next enhancement is color support. It was originally provided by a
+derived class.  This caused some trouble if you think about Panels or
+Menus and Forms with colors.  We decided to put color support into the
+base class so that any derived class may use color support also.
+The implementation chosen here is directed to unrestricted use
+of mixes of color and monochrome windows.  The original NCursesColorWindow
+class is maintained for compatibility reasons.
+
+The last point to mention is the support of other packages that are
+distributed with the ncurses package:  the panels library, the menu library
+and the form library.  This support is provided by the NCursesPanel class,
+which is also derived from the NCursesWindow class and the NCursesMenu
+and NCursesForm classes which are derived from NCursesPanel.  This allows
+building interfaces with windows.
+
+Please see the example program for a quick introduction.
+
+Note that at this point, there is no documentation for these classes.
+Hopefully some will be written in the not too distant future.  For now,
+to find out how to use the classes, read the code and the example program.
+
+Suggestions for enhancements and contributions of code (and docs) are
+welcome.  Please let us know which functionality you miss.
+
+Original author:
+     Eric Newton         <newton@rocky.oswego.edu> for FSF's libg++
+
+Authors of first ncurses based release (NCursesWindow, NCursesPanel):
+     Ulrich Drepper      <drepper@ira.uka.de>
+ and Anatoly Ivasyuk     <anatoly@nick.csh.rit.edu>
+
+Authors of this release:
+     Juergen Pfeifer
+     Thomas E. Dickey
diff --git a/c++/cursesapp.cc b/c++/cursesapp.cc
new file mode 100644
index 0000000..81f6098
--- /dev/null
+++ b/c++/cursesapp.cc
@@ -0,0 +1,174 @@
+// * this is for making emacs happy: -*-Mode: C++;-*-
+/****************************************************************************
+ * Copyright 2019,2020 Thomas E. Dickey                                     *
+ * Copyright 1998-2007,2008 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author: Juergen Pfeifer, 1997                                          *
+ *      and: Thomas E. Dickey                                               *
+ ****************************************************************************/
+
+#include "internal.h"
+#include "cursesapp.h"
+
+MODULE_ID("$Id: cursesapp.cc,v 1.18 2020/07/18 19:57:11 anonymous.maarten Exp $")
+
+void
+NCursesApplication::init(bool bColors)
+{
+  if (bColors)
+    NCursesWindow::useColors();
+
+  if (Root_Window->colors() > 1) {
+    b_Colors = TRUE;
+    Root_Window->setcolor(1);
+    Root_Window->setpalette(COLOR_YELLOW,COLOR_BLUE);
+    Root_Window->setcolor(2);
+    Root_Window->setpalette(COLOR_CYAN,COLOR_BLUE);
+    Root_Window->setcolor(3);
+    Root_Window->setpalette(COLOR_BLACK,COLOR_BLUE);
+    Root_Window->setcolor(4);
+    Root_Window->setpalette(COLOR_BLACK,COLOR_CYAN);
+    Root_Window->setcolor(5);
+    Root_Window->setpalette(COLOR_BLUE,COLOR_YELLOW);
+    Root_Window->setcolor(6);
+    Root_Window->setpalette(COLOR_BLACK,COLOR_GREEN);
+  }
+  else
+    b_Colors = FALSE;
+
+  Root_Window->bkgd(' '|window_backgrounds());
+}
+
+NCursesApplication* NCursesApplication::theApp = 0;
+NCursesWindow* NCursesApplication::titleWindow = 0;
+NCursesApplication::SLK_Link* NCursesApplication::slk_stack = 0;
+
+
+NCursesWindow *&NCursesApplication::getTitleWindow() {
+  return titleWindow;
+}
+
+NCursesApplication::~NCursesApplication() THROWS(NCursesException)
+{
+  Soft_Label_Key_Set* S;
+
+  delete titleWindow;
+  titleWindow = 0;
+
+  while( (S=top()) ) {
+    pop();
+    delete S;
+  }
+
+  delete Root_Window;
+  Root_Window = 0;
+
+  ::endwin();
+}
+
+NCursesApplication* NCursesApplication::getApplication() {
+  return theApp;
+}
+
+int NCursesApplication::rinit(NCursesWindow& w)
+{
+  titleWindow = &w;
+  return OK;
+}
+
+void NCursesApplication::push(Soft_Label_Key_Set& S)
+{
+  SLK_Link* L = new SLK_Link;
+  assert(L != 0);
+  L->prev = slk_stack;
+  L->SLKs = &S;
+  slk_stack = L;
+  if (Root_Window)
+    S.show();
+}
+
+bool NCursesApplication::pop()
+{
+  if (slk_stack) {
+    SLK_Link* L = slk_stack;
+    slk_stack = slk_stack->prev;
+    delete L;
+    if (Root_Window) {
+      Soft_Label_Key_Set* xx = top();
+      if (xx != 0)
+        xx->show();
+    }
+  }
+  return (slk_stack ? FALSE : TRUE);
+}
+
+Soft_Label_Key_Set* NCursesApplication::top() const
+{
+  if (slk_stack)
+    return slk_stack->SLKs;
+  else
+    return static_cast<Soft_Label_Key_Set*>(0);
+}
+
+int NCursesApplication::operator()(void)
+{
+  bool bColors = b_Colors;
+  Soft_Label_Key_Set* S = 0;
+
+  int ts = titlesize();
+  if (ts>0)
+    NCursesWindow::ripoffline(ts,rinit);
+  Soft_Label_Key_Set::Label_Layout fmt = useSLKs();
+  if (fmt!=Soft_Label_Key_Set::None) {
+    S = new Soft_Label_Key_Set(fmt);
+    assert(S != 0);
+    init_labels(*S);
+  }
+
+  Root_Window = new NCursesWindow(::stdscr);
+  init(bColors);
+
+  if (ts>0)
+    title();
+  if (fmt!=Soft_Label_Key_Set::None) {
+    push(*S);
+  }
+
+  return run();
+}
+
+NCursesApplication::NCursesApplication(bool bColors)
+  : b_Colors(bColors),
+    Root_Window(NULL)
+{
+  if (theApp)
+    THROW(new NCursesException("Application object already created."));
+  else
+    theApp = this;
+}
diff --git a/c++/cursesapp.h b/c++/cursesapp.h
new file mode 100644
index 0000000..1296f37
--- /dev/null
+++ b/c++/cursesapp.h
@@ -0,0 +1,191 @@
+// * This makes emacs happy -*-Mode: C++;-*-
+/****************************************************************************
+ * Copyright 2019-2020,2021 Thomas E. Dickey                                *
+ * Copyright 1998-2005,2011 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author: Juergen Pfeifer, 1997                                          *
+ ****************************************************************************/
+
+// $Id: cursesapp.h,v 1.18 2021/06/17 21:26:02 tom Exp $
+
+#ifndef NCURSES_CURSESAPP_H_incl
+#define NCURSES_CURSESAPP_H_incl
+
+#include <cursslk.h>
+
+#if (defined(_WIN32) || defined(_WIN64))
+# define NCURSES_CXX_MAIN_NAME cursespp_main
+# define NCURSES_CXX_MAIN \
+  int main(int argc, char *argv[]) { \
+  	return NCURSES_CXX_MAIN_NAME(argc, argv); \
+  }
+#else
+# define NCURSES_CXX_MAIN_NAME main
+#endif
+NCURSES_CXX_IMPEXP int NCURSES_CXX_MAIN_NAME(int argc, char *argv[]);
+
+class NCURSES_CXX_IMPEXP NCursesApplication {
+public:
+  typedef struct _slk_link {          // This structure is used to maintain
+    struct _slk_link* prev;           // a stack of SLKs
+    Soft_Label_Key_Set* SLKs;
+  } SLK_Link;
+private:
+  static int rinit(NCursesWindow& w); // Internal Init function for title
+  static NCursesApplication* theApp;  // Global ref. to the application
+
+  static SLK_Link* slk_stack;
+
+protected:
+  static NCursesWindow* titleWindow;  // The Title Window (if any)
+
+  bool b_Colors;                      // Is this a color application?
+  NCursesWindow* Root_Window;         // This is the stdscr equiv.
+
+  // Initialization of attributes;
+  // Rewrite this in your derived class if you prefer other settings
+  virtual void init(bool bColors);
+
+  // The number of lines for the title window. Default is no title window
+  // You may rewrite this in your derived class
+  virtual int titlesize() const {
+    return 0;
+  }
+
+  // This method is called to put something into the title window initially
+  // You may rewrite this in your derived class
+  virtual void title() {
+  }
+
+  // The layout used for the Soft Label Keys. Default is to have no SLKs.
+  // You may rewrite this in your derived class
+  virtual Soft_Label_Key_Set::Label_Layout useSLKs() const {
+    return Soft_Label_Key_Set::None;
+  }
+
+  // This method is called to initialize the SLKs. Default is nothing.
+  // You may rewrite this in your derived class
+  virtual void init_labels(Soft_Label_Key_Set& S) const {
+    (void) S;
+  }
+
+  // Your derived class must implement this method. The return value must
+  // be the exit value of your application.
+  virtual int run() = 0;
+
+  // The constructor is protected, so you may use it in your derived
+  // class constructor. The argument tells whether or not you want colors.
+  NCursesApplication(bool wantColors = FALSE);
+
+  NCursesApplication& operator=(const NCursesApplication& rhs)
+  {
+    if (this != &rhs) {
+      *this = rhs;
+    }
+    return *this;
+  }
+
+  NCursesApplication(const NCursesApplication& rhs)
+    : b_Colors(rhs.b_Colors),
+      Root_Window(rhs.Root_Window)
+  {
+  }
+
+  static NCursesWindow *&getTitleWindow();
+
+public:
+  virtual ~NCursesApplication() THROWS(NCursesException);
+
+  // Get a pointer to the current application object
+  static NCursesApplication* getApplication();
+
+  // This method runs the application and returns its exit value
+  int operator()(void);
+
+  // Process the commandline arguments. The default implementation simply
+  // ignores them. Your derived class may rewrite this.
+  virtual void handleArgs(int argc, char* argv[]) {
+    (void) argc;
+    (void) argv;
+  }
+
+  // Does this application use colors?
+  inline bool useColors() const {
+    return b_Colors;
+  }
+
+  // Push the Key Set S onto the SLK Stack. S then becomes the current set
+  // of Soft Labelled Keys.
+  void push(Soft_Label_Key_Set& S);
+
+  // Throw away the current set of SLKs and make the previous one the
+  // new current set.
+  bool pop();
+
+  // Retrieve the current set of Soft Labelled Keys.
+  Soft_Label_Key_Set* top() const;
+
+  // Attributes to use for menu and forms foregrounds
+  virtual chtype foregrounds() const {
+    return b_Colors ? static_cast<chtype>(COLOR_PAIR(1)) : A_BOLD;
+  }
+
+  // Attributes to use for menu and forms backgrounds
+  virtual chtype backgrounds() const {
+    return b_Colors ? static_cast<chtype>(COLOR_PAIR(2)) : A_NORMAL;
+  }
+
+  // Attributes to use for inactive (menu) elements
+  virtual chtype inactives() const {
+    return b_Colors ? static_cast<chtype>(COLOR_PAIR(3)|A_DIM) : A_DIM;
+  }
+
+  // Attributes to use for (form) labels and SLKs
+  virtual chtype labels() const {
+    return b_Colors ? static_cast<chtype>(COLOR_PAIR(4)) : A_NORMAL;
+  }
+
+  // Attributes to use for form backgrounds
+  virtual chtype dialog_backgrounds() const {
+    return b_Colors ? static_cast<chtype>(COLOR_PAIR(4)) : A_NORMAL;
+  }
+
+  // Attributes to use as default for (form) window backgrounds
+  virtual chtype window_backgrounds() const {
+    return b_Colors ? static_cast<chtype>(COLOR_PAIR(5)) : A_NORMAL;
+  }
+
+  // Attributes to use for the title window
+  virtual chtype screen_titles() const {
+    return b_Colors ? static_cast<chtype>(COLOR_PAIR(6)) : A_BOLD;
+  }
+
+};
+
+#endif /* NCURSES_CURSESAPP_H_incl */
diff --git a/c++/cursesf.cc b/c++/cursesf.cc
new file mode 100644
index 0000000..5d31648
--- /dev/null
+++ b/c++/cursesf.cc
@@ -0,0 +1,474 @@
+// * this is for making emacs happy: -*-Mode: C++;-*-
+/****************************************************************************
+ * Copyright 2019-2020,2021 Thomas E. Dickey                                *
+ * Copyright 1998-2005,2011 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author: Juergen Pfeifer, 1997                                          *
+ ****************************************************************************/
+
+#include "internal.h"
+#include "cursesf.h"
+#include "cursesapp.h"
+
+MODULE_ID("$Id: cursesf.cc,v 1.26 2021/04/17 18:11:08 tom Exp $")
+
+NCursesFormField::~NCursesFormField () THROWS(NCursesException)
+{
+  if (field)
+    OnError(::free_field (field));
+}
+
+/* Construct a FIELD* array from an array of NCursesFormField
+ * objects.
+ */
+FIELD**
+NCursesForm::mapFields(NCursesFormField* nfields[])
+{
+  int fieldCount = 0,lcv;
+  FIELD** old_fields;
+
+  assert(nfields != 0);
+
+  for (lcv=0; nfields[lcv]->field; ++lcv)
+    ++fieldCount;
+
+  FIELD** fields = new FIELD*[fieldCount + 1];
+
+  for (lcv=0;nfields[lcv]->field;++lcv) {
+    fields[lcv] = nfields[lcv]->field;
+  }
+  fields[lcv] = NULL;
+
+  my_fields = nfields;
+
+  if (form && (old_fields = ::form_fields(form))) {
+    ::set_form_fields(form, static_cast<FIELD**>(0));
+    delete[] old_fields;
+  }
+  return fields;
+}
+
+void NCursesForm::setDefaultAttributes()
+{
+  NCursesApplication* S = NCursesApplication::getApplication();
+
+  int n = count();
+  if (n > 0) {
+    for(int i=0; i<n; i++) {
+      NCursesFormField* f = (*this)[i];
+      if ((f->options() & (O_EDIT|O_ACTIVE))==(O_EDIT|O_ACTIVE)) {
+	if (S) {
+	  f->set_foreground(S->foregrounds());
+	  f->set_background(S->backgrounds());
+	}
+	f->set_pad_character('_');
+      }
+      else {
+	if (S)
+	  f->set_background(S->labels());
+      }
+    }
+  }
+
+  if (S) {
+    bkgd(' '|S->dialog_backgrounds());
+    if (sub)
+      sub->bkgd(' '|S->dialog_backgrounds());
+  }
+}
+
+void
+NCursesForm::InitForm(NCursesFormField* nfields[],
+		      bool with_frame,
+		      bool autoDelete_Fields)
+{
+  int mrows, mcols;
+
+  keypad(TRUE);
+  meta(TRUE);
+
+  b_framed = with_frame;
+  b_autoDelete = autoDelete_Fields;
+
+  form = static_cast<FORM*>(0);
+  form = ::new_form(mapFields(nfields));
+  if (!form)
+    OnError (E_SYSTEM_ERROR);
+
+  UserHook* hook = new UserHook;
+  hook->m_user   = NULL;
+  hook->m_back   = this;
+  hook->m_owner  = form;
+  ::set_form_userptr(form, reinterpret_cast<void*>(hook));
+
+  ::set_form_init  (form, _nc_xx_frm_init);
+  ::set_form_term  (form, _nc_xx_frm_term);
+  ::set_field_init (form, _nc_xx_fld_init);
+  ::set_field_term (form, _nc_xx_fld_term);
+
+  scale(mrows, mcols);
+  ::set_form_win(form, w);
+
+  if (with_frame) {
+    if ((mrows > height()-2) || (mcols > width()-2))
+      OnError(E_NO_ROOM);
+    sub = new NCursesWindow(*this,mrows,mcols,1,1,'r');
+    ::set_form_sub(form, sub->w);
+    b_sub_owner = TRUE;
+  }
+  else {
+    sub = static_cast<NCursesWindow*>(0);
+    b_sub_owner = FALSE;
+  }
+  options_on(O_NL_OVERLOAD);
+  setDefaultAttributes();
+}
+
+NCursesForm::~NCursesForm() THROWS(NCursesException)
+{
+  UserHook* hook = reinterpret_cast<UserHook*>(::form_userptr(form));
+  delete hook;
+  if (b_sub_owner) {
+    delete sub;
+    ::set_form_sub(form, static_cast<WINDOW *>(0));
+  }
+  if (form) {
+    FIELD** fields = ::form_fields(form);
+    int cnt = count();
+
+    OnError(::set_form_fields(form, static_cast<FIELD**>(0)));
+
+    if (b_autoDelete) {
+      if (cnt>0) {
+	for (int i=0; i <= cnt; i++)
+	  delete my_fields[i];
+      }
+      delete[] my_fields;
+    }
+
+    ::free_form(form);
+    // It's essential to do this after free_form()
+    delete[] fields;
+  }
+}
+
+void
+NCursesForm::setSubWindow(NCursesWindow& nsub)
+{
+  if (!isDescendant(nsub))
+    OnError(E_SYSTEM_ERROR);
+  else {
+    if (b_sub_owner)
+      delete sub;
+    sub = &nsub;
+    ::set_form_sub(form,sub->w);
+  }
+}
+
+/* Internal hook functions. They will route the hook
+ * calls to virtual methods of the NCursesForm class,
+ * so in C++ providing a hook is done simply by
+ * implementing a virtual method in a derived class
+ */
+void
+_nc_xx_frm_init(FORM *f)
+{
+  NCursesForm::getHook(f)->On_Form_Init();
+}
+
+void
+_nc_xx_frm_term(FORM *f)
+{
+  NCursesForm::getHook(f)->On_Form_Termination();
+}
+
+void
+_nc_xx_fld_init(FORM *f)
+{
+  NCursesForm* F = NCursesForm::getHook(f);
+  F->On_Field_Init (*(F->current_field ()));
+}
+
+void
+_nc_xx_fld_term(FORM *f)
+{
+  NCursesForm* F = NCursesForm::getHook(f);
+  F->On_Field_Termination (*(F->current_field ()));
+}
+
+void
+NCursesForm::On_Form_Init()
+{
+}
+
+void
+NCursesForm::On_Form_Termination()
+{
+}
+
+void
+NCursesForm::On_Field_Init(NCursesFormField& field)
+{
+  (void) field;
+}
+
+void
+NCursesForm::On_Field_Termination(NCursesFormField& field)
+{
+  (void) field;
+}
+
+// call the form driver and do basic error checking.
+int
+NCursesForm::driver (int c)
+{
+  int res = ::form_driver (form, c);
+  switch (res) {
+  case E_OK:
+  case E_REQUEST_DENIED:
+  case E_INVALID_FIELD:
+  case E_UNKNOWN_COMMAND:
+    break;
+  default:
+    OnError (res);
+  }
+  return (res);
+}
+
+void NCursesForm::On_Request_Denied(int c) const
+{
+  (void) c;
+  ::beep();
+}
+
+void NCursesForm::On_Invalid_Field(int c) const
+{
+  (void) c;
+  ::beep();
+}
+
+void NCursesForm::On_Unknown_Command(int c) const
+{
+  (void) c;
+  ::beep();
+}
+
+static const int CMD_QUIT = MAX_COMMAND + 1;
+
+NCursesFormField*
+NCursesForm::operator()(void)
+{
+  int drvCmnd;
+  int c;
+
+  post();
+  show();
+  refresh();
+
+  while (((drvCmnd = virtualize((c = getKey()))) != CMD_QUIT)) {
+    int err;
+    switch((err = driver(drvCmnd))) {
+    case E_REQUEST_DENIED:
+      On_Request_Denied(c);
+      break;
+    case E_INVALID_FIELD:
+      On_Invalid_Field(c);
+      break;
+    case E_UNKNOWN_COMMAND:
+      On_Unknown_Command(c);
+      break;
+    case E_OK:
+      break;
+    default:
+      OnError(err);
+    }
+  }
+
+  unpost();
+  hide();
+  refresh();
+  return my_fields[::field_index (::current_field (form))];
+}
+
+// Provide a default key virtualization. Translate the keyboard
+// code c into a form request code.
+// The default implementation provides a hopefully straightforward
+// mapping for the most common keystrokes and form requests.
+int
+NCursesForm::virtualize(int c)
+{
+  switch(c) {
+
+  case KEY_HOME      : return(REQ_FIRST_FIELD);
+  case KEY_END       : return(REQ_LAST_FIELD);
+
+  case KEY_DOWN      : return(REQ_DOWN_CHAR);
+  case KEY_UP        : return(REQ_UP_CHAR);
+  case KEY_LEFT      : return(REQ_PREV_CHAR);
+  case KEY_RIGHT     : return(REQ_NEXT_CHAR);
+
+  case KEY_NPAGE     : return(REQ_NEXT_PAGE);
+  case KEY_PPAGE     : return(REQ_PREV_PAGE);
+
+  case KEY_BACKSPACE : return(REQ_DEL_PREV);
+  case KEY_ENTER     : return(REQ_NEW_LINE);
+  case KEY_CLEAR     : return(REQ_CLR_FIELD);
+
+  case CTRL('X')     : return(CMD_QUIT);        // eXit
+
+  case CTRL('F')     : return(REQ_NEXT_FIELD);  // Forward
+  case CTRL('B')     : return(REQ_PREV_FIELD);  // Backward
+  case CTRL('L')     : return(REQ_LEFT_FIELD);  // Left
+  case CTRL('R')     : return(REQ_RIGHT_FIELD); // Right
+  case CTRL('U')     : return(REQ_UP_FIELD);    // Up
+  case CTRL('D')     : return(REQ_DOWN_FIELD);  // Down
+
+  case CTRL('W')     : return(REQ_NEXT_WORD);
+  case CTRL('T')     : return(REQ_PREV_WORD);
+
+  case CTRL('A')     : return(REQ_BEG_FIELD);
+  case CTRL('E')     : return(REQ_END_FIELD);
+
+  case CTRL('I')     : return(REQ_INS_CHAR);
+  case CTRL('M')     :
+  case CTRL('J')     : return(REQ_NEW_LINE);
+  case CTRL('O')     : return(REQ_INS_LINE);
+  case CTRL('V')     : return(REQ_DEL_CHAR);
+  case CTRL('H')     : return(REQ_DEL_PREV);
+  case CTRL('Y')     : return(REQ_DEL_LINE);
+  case CTRL('G')     : return(REQ_DEL_WORD);
+  case CTRL('K')     : return(REQ_CLR_EOF);
+
+  case CTRL('N')     : return(REQ_NEXT_CHOICE);
+  case CTRL('P')     : return(REQ_PREV_CHOICE);
+
+  default:
+    return(c);
+  }
+}
+//
+// -------------------------------------------------------------------------
+// User Defined Fieldtypes
+// -------------------------------------------------------------------------
+//
+bool _nc_xx_fld_fcheck(FIELD *f, const void *u)
+{
+  (void) f;
+  NCursesFormField* F = reinterpret_cast<NCursesFormField*>(const_cast<void *>(u));
+  assert(F != 0);
+  UserDefinedFieldType* udf = reinterpret_cast<UserDefinedFieldType*>(F->fieldtype());
+  assert(udf != 0);
+  return udf->field_check(*F);
+}
+
+bool _nc_xx_fld_ccheck(int c, const void *u)
+{
+  NCursesFormField* F = reinterpret_cast<NCursesFormField*>(const_cast<void *>(u));
+  assert(F != 0);
+  UserDefinedFieldType* udf =
+    reinterpret_cast<UserDefinedFieldType*>(F->fieldtype());
+  assert(udf != 0);
+  return udf->char_check(c);
+}
+
+void* _nc_xx_fld_makearg(va_list* va)
+{
+  return va_arg(*va,NCursesFormField*);
+}
+
+FIELDTYPE* UserDefinedFieldType::generic_fieldtype =
+  ::new_fieldtype(_nc_xx_fld_fcheck,
+		  _nc_xx_fld_ccheck);
+
+
+UserDefinedFieldType::UserDefinedFieldType() : NCursesFieldType(generic_fieldtype) {
+}
+
+FIELDTYPE* UserDefinedFieldType_With_Choice::generic_fieldtype_with_choice =
+  ::new_fieldtype(_nc_xx_fld_fcheck,
+		  _nc_xx_fld_ccheck);
+
+
+UserDefinedFieldType_With_Choice::UserDefinedFieldType_With_Choice() {
+  fieldtype = generic_fieldtype_with_choice;
+}
+
+bool _nc_xx_next_choice(FIELD *f, const void *u)
+{
+  (void) f;
+  NCursesFormField* F = reinterpret_cast<NCursesFormField*>(const_cast<void *>(u));
+  assert(F != 0);
+  UserDefinedFieldType_With_Choice* udf =
+    reinterpret_cast<UserDefinedFieldType_With_Choice*>(F->fieldtype());
+  assert(udf != 0);
+  return udf->next(*F);
+}
+
+bool _nc_xx_prev_choice(FIELD *f, const void *u)
+{
+  (void) f;
+  NCursesFormField* F = reinterpret_cast<NCursesFormField*>(const_cast<void *>(u));
+  assert(F != 0);
+  UserDefinedFieldType_With_Choice* udf =
+    reinterpret_cast<UserDefinedFieldType_With_Choice*>(F->fieldtype());
+  assert(udf != 0);
+  return udf->previous(*F);
+}
+
+class UDF_Init
+{
+private:
+  int code;
+  static UDF_Init* I;
+
+public:
+  UDF_Init()
+    : code(0)
+  {
+    code = ::set_fieldtype_arg(UserDefinedFieldType::generic_fieldtype,
+			       _nc_xx_fld_makearg,
+			       NULL,
+			       NULL);
+    if (code==E_OK)
+      code = ::set_fieldtype_arg
+	(UserDefinedFieldType_With_Choice::generic_fieldtype_with_choice,
+	 _nc_xx_fld_makearg,
+	 NULL,
+	 NULL);
+    if (code==E_OK)
+      code = ::set_fieldtype_choice
+	(UserDefinedFieldType_With_Choice::generic_fieldtype_with_choice,
+	 _nc_xx_next_choice,
+	 _nc_xx_prev_choice);
+  }
+};
+
+UDF_Init* UDF_Init::I = new UDF_Init();
+
+
diff --git a/c++/cursesf.h b/c++/cursesf.h
new file mode 100644
index 0000000..e29e7ad
--- /dev/null
+++ b/c++/cursesf.h
@@ -0,0 +1,968 @@
+// * This makes emacs happy -*-Mode: C++;-*-
+// vile:cppmode
+/****************************************************************************
+ * Copyright 2019-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2012,2014 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author: Juergen Pfeifer, 1997                                          *
+ ****************************************************************************/
+
+// $Id: cursesf.h,v 1.39 2022/08/20 20:52:15 tom Exp $
+
+#ifndef NCURSES_CURSESF_H_incl
+#define NCURSES_CURSESF_H_incl 1
+
+#include <cursesp.h>
+
+#ifndef __EXT_QNX
+#include <string.h>
+#endif
+
+extern "C" {
+#  include <form.h>
+}
+//
+// -------------------------------------------------------------------------
+// The abstract base class for builtin and user defined Fieldtypes.
+// -------------------------------------------------------------------------
+//
+class NCURSES_CXX_IMPEXP NCursesFormField; // forward declaration
+
+// Class to represent builtin field types as well as C++ written new
+// fieldtypes (see classes UserDefineFieldType...
+class NCURSES_CXX_IMPEXP NCursesFieldType
+{
+  friend class NCursesFormField;
+
+protected:
+  FIELDTYPE* fieldtype;
+
+  inline void OnError(int err) const THROW2(NCursesException const, NCursesFormException) {
+    if (err!=E_OK)
+      THROW(new NCursesFormException (err));
+  }
+
+  NCursesFieldType(FIELDTYPE *f) : fieldtype(f) {
+  }
+
+  virtual ~NCursesFieldType() {}
+
+  // Set the fields f fieldtype to this one.
+  virtual void set(NCursesFormField& f) = 0;
+
+public:
+  NCursesFieldType()
+    : fieldtype(STATIC_CAST(FIELDTYPE*)(0))
+  {
+  }
+
+  NCursesFieldType& operator=(const NCursesFieldType& rhs)
+  {
+    if (this != &rhs) {
+      *this = rhs;
+    }
+    return *this;
+  }
+
+  NCursesFieldType(const NCursesFieldType& rhs)
+    : fieldtype(rhs.fieldtype)
+  {
+  }
+
+};
+
+//
+// -------------------------------------------------------------------------
+// The class representing a forms field, wrapping the lowlevel FIELD struct
+// -------------------------------------------------------------------------
+//
+class NCURSES_CXX_IMPEXP NCursesFormField
+{
+  friend class NCursesForm;
+
+protected:
+  FIELD *field;		     // lowlevel structure
+  NCursesFieldType* ftype;   // Associated field type
+
+  // Error handler
+  inline void OnError (int err) const THROW2(NCursesException const, NCursesFormException) {
+    if (err != E_OK)
+      THROW(new NCursesFormException (err));
+  }
+
+public:
+  // Create a 'Null' field. Can be used to delimit a field list
+  NCursesFormField()
+    : field(STATIC_CAST(FIELD*)(0)),
+      ftype(STATIC_CAST(NCursesFieldType*)(0))
+  {
+  }
+
+  // Create a new field
+  NCursesFormField (int rows,
+		    int ncols,
+		    int first_row = 0,
+		    int first_col = 0,
+		    int offscreen_rows = 0,
+		    int additional_buffers = 0)
+    : field(0),
+      ftype(STATIC_CAST(NCursesFieldType*)(0))
+  {
+      field = ::new_field(rows, ncols, first_row, first_col,
+			  offscreen_rows, additional_buffers);
+      if (!field)
+	OnError(errno);
+  }
+
+  NCursesFormField& operator=(const NCursesFormField& rhs)
+  {
+    if (this != &rhs) {
+      *this = rhs;
+    }
+    return *this;
+  }
+
+  NCursesFormField(const NCursesFormField& rhs)
+    : field(rhs.field), ftype(rhs.ftype)
+  {
+  }
+
+  virtual ~NCursesFormField () THROWS(NCursesException);
+
+  // Duplicate the field at a new position
+  inline NCursesFormField* dup(int first_row, int first_col)
+  {
+    NCursesFormField* f = new NCursesFormField();
+    if (!f)
+      OnError(E_SYSTEM_ERROR);
+    else {
+      f->ftype = ftype;
+      f->field = ::dup_field(field,first_row,first_col);
+      if (!f->field)
+	OnError(errno);
+    }
+    return f;
+  }
+
+  // Link the field to a new location
+  inline NCursesFormField* link(int first_row, int first_col) {
+    NCursesFormField* f = new NCursesFormField();
+    if (!f)
+      OnError(E_SYSTEM_ERROR);
+    else {
+      f->ftype = ftype;
+      f->field = ::link_field(field,first_row,first_col);
+      if (!f->field)
+	OnError(errno);
+    }
+    return f;
+  }
+
+  // Get the lowlevel field representation
+  inline FIELD* get_field() const {
+    return field;
+  }
+
+  // Retrieve info about the field
+  inline void info(int& rows, int& ncols,
+		   int& first_row, int& first_col,
+		   int& offscreen_rows, int& additional_buffers) const {
+    OnError(::field_info(field, &rows, &ncols,
+			 &first_row, &first_col,
+			 &offscreen_rows, &additional_buffers));
+  }
+
+  // Retrieve info about the fields dynamic properties.
+  inline void dynamic_info(int& dynamic_rows, int& dynamic_cols,
+			   int& max_growth) const {
+    OnError(::dynamic_field_info(field, &dynamic_rows, &dynamic_cols,
+				 &max_growth));
+  }
+
+  // For a dynamic field you may set the maximum growth limit.
+  // A zero means unlimited growth.
+  inline void set_maximum_growth(int growth = 0) {
+    OnError(::set_max_field(field,growth));
+  }
+
+  // Move the field to a new position
+  inline void move(int row, int col) {
+    OnError(::move_field(field,row,col));
+  }
+
+  // Mark the field to start a new page
+  inline void new_page(bool pageFlag = FALSE) {
+    OnError(::set_new_page(field,pageFlag));
+  }
+
+  // Retrieve whether or not the field starts a new page.
+  inline bool is_new_page() const {
+    return ::new_page(field);
+  }
+
+  // Set the justification for the field
+  inline void set_justification(int just) {
+    OnError(::set_field_just(field,just));
+  }
+
+  // Retrieve the fields justification
+  inline int justification() const {
+    return ::field_just(field);
+  }
+  // Set the foreground attribute for the field
+  inline void set_foreground(chtype foreground) {
+    OnError(::set_field_fore(field,foreground));
+  }
+
+  // Retrieve the fields foreground attribute
+  inline chtype fore() const {
+    return ::field_fore(field);
+  }
+
+  // Set the background attribute for the field
+  inline void set_background(chtype background) {
+    OnError(::set_field_back(field,background));
+  }
+
+  // Retrieve the fields background attribute
+  inline chtype back() const {
+    return ::field_back(field);
+  }
+
+  // Set the padding character for the field
+  inline void set_pad_character(int padding) {
+    OnError(::set_field_pad(field, padding));
+  }
+
+  // Retrieve the fields padding character
+  inline int pad() const {
+    return ::field_pad(field);
+  }
+
+  // Switch on the fields options
+  inline void options_on (Field_Options opts) {
+    OnError (::field_opts_on (field, opts));
+  }
+
+  // Switch off the fields options
+  inline void options_off (Field_Options opts) {
+    OnError (::field_opts_off (field, opts));
+  }
+
+  // Retrieve the fields options
+  inline Field_Options options () const {
+    return ::field_opts (field);
+  }
+
+  // Set the fields options
+  inline void set_options (Field_Options opts) {
+    OnError (::set_field_opts (field, opts));
+  }
+
+  // Mark the field as changed
+  inline void set_changed(bool changeFlag = TRUE) {
+    OnError(::set_field_status(field,changeFlag));
+  }
+
+  // Test whether or not the field is marked as changed
+  inline bool changed() const {
+    return ::field_status(field);
+  }
+
+  // Return the index of the field in the field array of a form
+  // or -1 if the field is not associated to a form
+  inline int (index)() const {
+    return ::field_index(field);
+  }
+
+  // Store a value in a fields buffer. The default buffer is nr. 0
+  inline void set_value(const char *val, int buffer = 0) {
+    OnError(::set_field_buffer(field,buffer,val));
+  }
+
+  // Retrieve the value of a fields buffer. The default buffer is nr. 0
+  inline char* value(int buffer = 0) const {
+    return ::field_buffer(field,buffer);
+  }
+
+  // Set the validation type of the field.
+  inline void set_fieldtype(NCursesFieldType& f) {
+    ftype = &f;
+    f.set(*this); // A good friend may do that...
+  }
+
+  // Retrieve the validation type of the field.
+  inline NCursesFieldType* fieldtype() const {
+    return ftype;
+  }
+
+};
+
+  // This are the built-in hook functions in this C++ binding. In C++ we use
+  // virtual member functions (see below On_..._Init and On_..._Termination)
+  // to provide this functionality in an object oriented manner.
+extern "C" {
+  void _nc_xx_frm_init(FORM *);
+  void _nc_xx_frm_term(FORM *);
+  void _nc_xx_fld_init(FORM *);
+  void _nc_xx_fld_term(FORM *);
+}
+
+//
+// -------------------------------------------------------------------------
+// The class representing a form, wrapping the lowlevel FORM struct
+// -------------------------------------------------------------------------
+//
+class NCURSES_CXX_IMPEXP NCursesForm : public NCursesPanel
+{
+protected:
+  FORM* form;  // the lowlevel structure
+
+private:
+  NCursesWindow* sub;   // the subwindow object
+  bool b_sub_owner;     // is this our own subwindow?
+  bool b_framed;	// has the form a border?
+  bool b_autoDelete;    // Delete fields when deleting form?
+
+  NCursesFormField** my_fields; // The array of fields for this form
+
+  // This structure is used for the form's user data field to link the
+  // FORM* to the C++ object and to provide extra space for a user pointer.
+  typedef struct {
+    void*	       m_user;	    // the pointer for the user's data
+    const NCursesForm* m_back;      // backward pointer to C++ object
+    const FORM*	       m_owner;
+  } UserHook;
+
+  // Get the backward pointer to the C++ object from a FORM
+  static inline NCursesForm* getHook(const FORM *f) {
+    UserHook* hook = reinterpret_cast<UserHook*>(::form_userptr(f));
+    assert(hook != 0 && hook->m_owner==f);
+    return const_cast<NCursesForm*>(hook->m_back);
+  }
+
+  friend void _nc_xx_frm_init(FORM *);
+  friend void _nc_xx_frm_term(FORM *);
+  friend void _nc_xx_fld_init(FORM *);
+  friend void _nc_xx_fld_term(FORM *);
+
+  // Calculate FIELD* array for the menu
+  FIELD** mapFields(NCursesFormField* nfields[]);
+
+protected:
+  // internal routines
+  inline void set_user(void *user) {
+    UserHook* uptr = reinterpret_cast<UserHook*>(::form_userptr (form));
+    assert (uptr != 0 && uptr->m_back==this && uptr->m_owner==form);
+    uptr->m_user = user;
+  }
+
+  inline void *get_user() {
+    UserHook* uptr = reinterpret_cast<UserHook*>(::form_userptr (form));
+    assert (uptr != 0 && uptr->m_back==this && uptr->m_owner==form);
+    return uptr->m_user;
+  }
+
+  void InitForm (NCursesFormField* Fields[],
+		 bool with_frame,
+		 bool autoDeleteFields);
+
+  inline void OnError (int err) const THROW2(NCursesException const, NCursesFormException) {
+    if (err != E_OK)
+      THROW(new NCursesFormException (err));
+  }
+
+  // this wraps the form_driver call.
+  virtual int driver (int c) ;
+
+  // 'Internal' constructor, builds an object without association to a
+  // field array.
+  NCursesForm( int  nlines,
+	       int  ncols,
+	       int  begin_y = 0,
+	       int  begin_x = 0)
+    : NCursesPanel(nlines, ncols, begin_y, begin_x),
+      form (STATIC_CAST(FORM*)(0)),
+      sub(0),
+      b_sub_owner(0),
+      b_framed(0),
+      b_autoDelete(0),
+      my_fields(0)
+  {
+  }
+
+public:
+  // Create form for the default panel.
+  NCursesForm (NCursesFormField* Fields[],
+	       bool with_frame=FALSE,	      // reserve space for a frame?
+	       bool autoDelete_Fields=FALSE)  // do automatic cleanup?
+    : NCursesPanel(),
+      form(0),
+      sub(0),
+      b_sub_owner(0),
+      b_framed(0),
+      b_autoDelete(0),
+      my_fields(0)
+  {
+    InitForm(Fields, with_frame, autoDelete_Fields);
+  }
+
+  // Create a form in a panel with the given position and size.
+  NCursesForm (NCursesFormField* Fields[],
+	       int  nlines,
+	       int  ncols,
+	       int  begin_y,
+	       int  begin_x,
+	       bool with_frame=FALSE,	     // reserve space for a frame?
+	       bool autoDelete_Fields=FALSE) // do automatic cleanup?
+    : NCursesPanel(nlines, ncols, begin_y, begin_x),
+      form(0),
+      sub(0),
+      b_sub_owner(0),
+      b_framed(0),
+      b_autoDelete(0),
+      my_fields(0)
+  {
+      InitForm(Fields, with_frame, autoDelete_Fields);
+  }
+
+  NCursesForm& operator=(const NCursesForm& rhs)
+  {
+    if (this != &rhs) {
+      *this = rhs;
+      NCursesPanel::operator=(rhs);
+    }
+    return *this;
+  }
+
+  NCursesForm(const NCursesForm& rhs)
+    : NCursesPanel(rhs),
+      form(rhs.form),
+      sub(rhs.sub),
+      b_sub_owner(rhs.b_sub_owner),
+      b_framed(rhs.b_framed),
+      b_autoDelete(rhs.b_autoDelete),
+      my_fields(rhs.my_fields)
+  {
+  }
+
+  virtual ~NCursesForm() THROWS(NCursesException);
+
+  // Set the default attributes for the form
+  virtual void setDefaultAttributes();
+
+  // Retrieve current field of the form.
+  inline NCursesFormField* current_field() const {
+    return my_fields[::field_index(::current_field(form))];
+  }
+
+  // Set the forms subwindow
+  void setSubWindow(NCursesWindow& sub);
+
+  // Set these fields for the form
+  inline void setFields(NCursesFormField* Fields[]) {
+    OnError(::set_form_fields(form,mapFields(Fields)));
+  }
+
+  // Remove the form from the screen
+  inline void unpost (void) {
+    OnError (::unpost_form (form));
+  }
+
+  // Post the form to the screen if flag is true, unpost it otherwise
+  inline void post(bool flag = TRUE) {
+    OnError (flag ? ::post_form(form) : ::unpost_form (form));
+  }
+
+  // Decorations
+  inline void frame(const char *title=NULL, const char* btitle=NULL) NCURSES_OVERRIDE {
+    if (b_framed)
+      NCursesPanel::frame(title,btitle);
+    else
+      OnError(E_SYSTEM_ERROR);
+  }
+
+  inline void boldframe(const char *title=NULL, const char* btitle=NULL) NCURSES_OVERRIDE {
+    if (b_framed)
+      NCursesPanel::boldframe(title,btitle);
+    else
+      OnError(E_SYSTEM_ERROR);
+  }
+
+  inline void label(const char *topLabel, const char *bottomLabel) NCURSES_OVERRIDE {
+    if (b_framed)
+      NCursesPanel::label(topLabel,bottomLabel);
+    else
+      OnError(E_SYSTEM_ERROR);
+  }
+
+  // -----
+  // Hooks
+  // -----
+
+  // Called after the form gets repositioned in its window.
+  // This is especially true if the form is posted.
+  virtual void On_Form_Init();
+
+  // Called before the form gets repositioned in its window.
+  // This is especially true if the form is unposted.
+  virtual void On_Form_Termination();
+
+  // Called after the field became the current field
+  virtual void On_Field_Init(NCursesFormField& field);
+
+  // Called before this field is left as current field.
+  virtual void On_Field_Termination(NCursesFormField& field);
+
+  // Calculate required window size for the form.
+  void scale(int& rows, int& ncols) const {
+    OnError(::scale_form(form,&rows,&ncols));
+  }
+
+  // Retrieve number of fields in the form.
+  int count() const {
+    return ::field_count(form);
+  }
+
+  // Make the page the current page of the form.
+  void set_page(int pageNum) {
+    OnError(::set_form_page(form, pageNum));
+  }
+
+  // Retrieve current page number
+  int page() const {
+    return ::form_page(form);
+  }
+
+  // Switch on the forms options
+  inline void options_on (Form_Options opts) {
+    OnError (::form_opts_on (form, opts));
+  }
+
+  // Switch off the forms options
+  inline void options_off (Form_Options opts) {
+    OnError (::form_opts_off (form, opts));
+  }
+
+  // Retrieve the forms options
+  inline Form_Options options () const {
+    return ::form_opts (form);
+  }
+
+  // Set the forms options
+  inline void set_options (Form_Options opts) {
+    OnError (::set_form_opts (form, opts));
+  }
+
+  // Are there more data in the current field after the data shown
+  inline bool data_ahead() const {
+    return ::data_ahead(form);
+  }
+
+  // Are there more data in the current field before the data shown
+  inline bool data_behind() const {
+    return ::data_behind(form);
+  }
+
+  // Position the cursor to the current field
+  inline void position_cursor () {
+    OnError (::pos_form_cursor (form));
+  }
+  // Set the current field
+  inline void set_current(NCursesFormField& F) {
+    OnError (::set_current_field(form, F.field));
+  }
+
+  // Provide a default key virtualization. Translate the keyboard
+  // code c into a form request code.
+  // The default implementation provides a hopefully straightforward
+  // mapping for the most common keystrokes and form requests.
+  virtual int virtualize(int c);
+
+  // Operators
+  inline NCursesFormField* operator[](int i) const {
+    if ( (i < 0) || (i >= ::field_count (form)) )
+      OnError (E_BAD_ARGUMENT);
+    return my_fields[i];
+  }
+
+  // Perform the menu's operation
+  // Return the field where you left the form.
+  virtual NCursesFormField* operator()(void);
+
+  // Exception handlers. The default is a Beep.
+  virtual void On_Request_Denied(int c) const;
+  virtual void On_Invalid_Field(int c) const;
+  virtual void On_Unknown_Command(int c) const;
+
+};
+
+//
+// -------------------------------------------------------------------------
+// This is the typical C++ typesafe way to allow to attach
+// user data to a field of a form. Its assumed that the user
+// data belongs to some class T. Use T as template argument
+// to create a UserField.
+// -------------------------------------------------------------------------
+template<class T> class NCURSES_CXX_IMPEXP NCursesUserField : public NCursesFormField
+{
+public:
+  NCursesUserField (int rows,
+		    int ncols,
+		    int first_row = 0,
+		    int first_col = 0,
+		    const T* p_UserData = STATIC_CAST(T*)(0),
+		    int offscreen_rows = 0,
+		    int additional_buffers = 0)
+    : NCursesFormField (rows, ncols,
+			first_row, first_col,
+			offscreen_rows, additional_buffers) {
+      if (field)
+	OnError(::set_field_userptr(field, STATIC_CAST(void *)(p_UserData)));
+  }
+
+  virtual ~NCursesUserField() THROWS(NCursesException) {};
+
+  inline const T* UserData (void) const {
+    return reinterpret_cast<const T*>(::field_userptr (field));
+  }
+
+  inline virtual void setUserData(const T* p_UserData) {
+    if (field)
+      OnError (::set_field_userptr (field, STATIC_CAST(void *)(p_UserData)));
+  }
+};
+//
+// -------------------------------------------------------------------------
+// The same mechanism is used to attach user data to a form
+// -------------------------------------------------------------------------
+//
+template<class T> class NCURSES_CXX_IMPEXP NCursesUserForm : public NCursesForm
+{
+protected:
+  // 'Internal' constructor, builds an object without association to a
+  // field array.
+  NCursesUserForm( int  nlines,
+		   int  ncols,
+		   int  begin_y = 0,
+		   int  begin_x = 0,
+		   const T* p_UserData = STATIC_CAST(T*)(0))
+    : NCursesForm(nlines,ncols,begin_y,begin_x) {
+      if (form)
+	set_user (const_cast<void *>(reinterpret_cast<const void*>
+				     (p_UserData)));
+  }
+
+public:
+  NCursesUserForm (NCursesFormField* Fields[],
+		   const T* p_UserData = STATIC_CAST(T*)(0),
+		   bool with_frame=FALSE,
+		   bool autoDelete_Fields=FALSE)
+    : NCursesForm (Fields, with_frame, autoDelete_Fields) {
+      if (form)
+	set_user (const_cast<void *>(reinterpret_cast<const void*>(p_UserData)));
+  };
+
+  NCursesUserForm (NCursesFormField* Fields[],
+		   int nlines,
+		   int ncols,
+		   int begin_y = 0,
+		   int begin_x = 0,
+		   const T* p_UserData = STATIC_CAST(T*)(0),
+		   bool with_frame=FALSE,
+		   bool autoDelete_Fields=FALSE)
+    : NCursesForm (Fields, nlines, ncols, begin_y, begin_x,
+		   with_frame, autoDelete_Fields) {
+      if (form)
+	set_user (const_cast<void *>(reinterpret_cast<const void*>
+				     (p_UserData)));
+  };
+
+  virtual ~NCursesUserForm() THROWS(NCursesException) {
+  };
+
+  inline T* UserData (void) {
+    return reinterpret_cast<T*>(get_user ());
+  };
+
+  inline virtual void setUserData (const T* p_UserData) {
+    if (form)
+      set_user (const_cast<void *>(reinterpret_cast<const void*>(p_UserData)));
+  }
+
+};
+//
+// -------------------------------------------------------------------------
+// Builtin Fieldtypes
+// -------------------------------------------------------------------------
+//
+class NCURSES_CXX_IMPEXP Alpha_Field : public NCursesFieldType
+{
+private:
+  int min_field_width;
+
+  void set(NCursesFormField& f) NCURSES_OVERRIDE {
+    OnError(::set_field_type(f.get_field(),fieldtype,min_field_width));
+  }
+
+public:
+  explicit Alpha_Field(int width)
+    : NCursesFieldType(TYPE_ALPHA),
+      min_field_width(width) {
+  }
+};
+
+class NCURSES_CXX_IMPEXP Alphanumeric_Field : public NCursesFieldType
+{
+private:
+  int min_field_width;
+
+  void set(NCursesFormField& f) NCURSES_OVERRIDE {
+    OnError(::set_field_type(f.get_field(),fieldtype,min_field_width));
+  }
+
+public:
+  explicit Alphanumeric_Field(int width)
+    : NCursesFieldType(TYPE_ALNUM),
+      min_field_width(width) {
+  }
+};
+
+class NCURSES_CXX_IMPEXP Integer_Field : public NCursesFieldType
+{
+private:
+  int precision;
+  long lower_limit, upper_limit;
+
+  void set(NCursesFormField& f) NCURSES_OVERRIDE {
+    OnError(::set_field_type(f.get_field(),fieldtype,
+			     precision,lower_limit,upper_limit));
+  }
+
+public:
+  Integer_Field(int prec, long low=0L, long high=0L)
+    : NCursesFieldType(TYPE_INTEGER),
+      precision(prec), lower_limit(low), upper_limit(high) {
+  }
+};
+
+class NCURSES_CXX_IMPEXP Numeric_Field : public NCursesFieldType
+{
+private:
+  int precision;
+  double lower_limit, upper_limit;
+
+  void set(NCursesFormField& f) NCURSES_OVERRIDE {
+    OnError(::set_field_type(f.get_field(),fieldtype,
+			     precision,lower_limit,upper_limit));
+  }
+
+public:
+  Numeric_Field(int prec, double low=0.0, double high=0.0)
+    : NCursesFieldType(TYPE_NUMERIC),
+      precision(prec), lower_limit(low), upper_limit(high) {
+  }
+};
+
+class NCURSES_CXX_IMPEXP Regular_Expression_Field : public NCursesFieldType
+{
+private:
+  char* regex;
+
+  void set(NCursesFormField& f) NCURSES_OVERRIDE {
+    OnError(::set_field_type(f.get_field(),fieldtype,regex));
+  }
+
+  void copy_regex(const char *source)
+  {
+    regex = new char[1 + ::strlen(source)];
+    (::strcpy)(regex, source);
+  }
+
+public:
+  explicit Regular_Expression_Field(const char *expr)
+    : NCursesFieldType(TYPE_REGEXP),
+      regex(NULL)
+  {
+    copy_regex(expr);
+  }
+
+  Regular_Expression_Field& operator=(const Regular_Expression_Field& rhs)
+  {
+    if (this != &rhs) {
+      *this = rhs;
+      copy_regex(rhs.regex);
+      NCursesFieldType::operator=(rhs);
+    }
+    return *this;
+  }
+
+  Regular_Expression_Field(const Regular_Expression_Field& rhs)
+    : NCursesFieldType(rhs),
+      regex(NULL)
+  {
+    copy_regex(rhs.regex);
+  }
+
+  ~Regular_Expression_Field() {
+    delete[] regex;
+  }
+};
+
+class NCURSES_CXX_IMPEXP Enumeration_Field : public NCursesFieldType
+{
+private:
+  const char** list;
+  int case_sensitive;
+  int non_unique_matches;
+
+  void set(NCursesFormField& f) NCURSES_OVERRIDE {
+    OnError(::set_field_type(f.get_field(),fieldtype,
+			     list,case_sensitive,non_unique_matches));
+  }
+public:
+  Enumeration_Field(const char* enums[],
+		    bool case_sens=FALSE,
+		    bool non_unique=FALSE)
+    : NCursesFieldType(TYPE_ENUM),
+      list(enums),
+      case_sensitive(case_sens ? -1 : 0),
+      non_unique_matches(non_unique ? -1 : 0) {
+  }
+
+  Enumeration_Field& operator=(const Enumeration_Field& rhs)
+  {
+    if (this != &rhs) {
+      *this = rhs;
+      NCursesFieldType::operator=(rhs);
+    }
+    return *this;
+  }
+
+  Enumeration_Field(const Enumeration_Field& rhs)
+    : NCursesFieldType(rhs),
+      list(rhs.list),
+      case_sensitive(rhs.case_sensitive),
+      non_unique_matches(rhs.non_unique_matches)
+  {
+  }
+};
+
+class NCURSES_CXX_IMPEXP IPV4_Address_Field : public NCursesFieldType
+{
+private:
+  void set(NCursesFormField& f) NCURSES_OVERRIDE {
+    OnError(::set_field_type(f.get_field(),fieldtype));
+  }
+
+public:
+  IPV4_Address_Field() : NCursesFieldType(TYPE_IPV4) {
+  }
+};
+
+extern "C" {
+  bool _nc_xx_fld_fcheck(FIELD *, const void*);
+  bool _nc_xx_fld_ccheck(int c, const void *);
+  void* _nc_xx_fld_makearg(va_list*);
+}
+
+//
+// -------------------------------------------------------------------------
+// Abstract base class for User-Defined Fieldtypes
+// -------------------------------------------------------------------------
+//
+class NCURSES_CXX_IMPEXP UserDefinedFieldType : public NCursesFieldType
+{
+  friend class UDF_Init; // Internal helper to set up statics
+private:
+  // For all C++ defined fieldtypes we need only one generic lowlevel
+  // FIELDTYPE* element.
+  static FIELDTYPE* generic_fieldtype;
+
+protected:
+  // This are the functions required by the low level libforms functions
+  // to construct a fieldtype.
+  friend bool _nc_xx_fld_fcheck(FIELD *, const void*);
+  friend bool _nc_xx_fld_ccheck(int c, const void *);
+  friend void* _nc_xx_fld_makearg(va_list*);
+
+  void set(NCursesFormField& f) NCURSES_OVERRIDE {
+    OnError(::set_field_type(f.get_field(),fieldtype,&f));
+  }
+
+protected:
+  // Redefine this function to do a field validation. The argument
+  // is a reference to the field you should validate.
+  virtual bool field_check(NCursesFormField& f) = 0;
+
+  // Redefine this function to do a character validation. The argument
+  // is the character to be validated.
+  virtual bool char_check (int c) = 0;
+
+public:
+  UserDefinedFieldType();
+};
+
+extern "C" {
+  bool _nc_xx_next_choice(FIELD*, const void *);
+  bool _nc_xx_prev_choice(FIELD*, const void *);
+}
+
+//
+// -------------------------------------------------------------------------
+// Abstract base class for User-Defined Fieldtypes with Choice functions
+// -------------------------------------------------------------------------
+//
+class NCURSES_CXX_IMPEXP UserDefinedFieldType_With_Choice : public UserDefinedFieldType
+{
+  friend class UDF_Init; // Internal helper to set up statics
+private:
+  // For all C++ defined fieldtypes with choice functions we need only one
+  // generic lowlevel FIELDTYPE* element.
+  static FIELDTYPE* generic_fieldtype_with_choice;
+
+  // This are the functions required by the low level libforms functions
+  // to construct a fieldtype with choice functions.
+  friend bool _nc_xx_next_choice(FIELD*, const void *);
+  friend bool _nc_xx_prev_choice(FIELD*, const void *);
+
+protected:
+  // Redefine this function to do the retrieval of the next choice value.
+  // The argument is a reference to the field tobe examined.
+  virtual bool next    (NCursesFormField& f) = 0;
+
+  // Redefine this function to do the retrieval of the previous choice value.
+  // The argument is a reference to the field tobe examined.
+  virtual bool previous(NCursesFormField& f) = 0;
+
+public:
+  UserDefinedFieldType_With_Choice();
+};
+
+#endif /* NCURSES_CURSESF_H_incl */
diff --git a/c++/cursesm.cc b/c++/cursesm.cc
new file mode 100644
index 0000000..64f3635
--- /dev/null
+++ b/c++/cursesm.cc
@@ -0,0 +1,414 @@
+// * this is for making emacs happy: -*-Mode: C++;-*-
+/****************************************************************************
+ * Copyright 2019-2020,2021 Thomas E. Dickey                                *
+ * Copyright 1998-2011,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author: Juergen Pfeifer, 1997                                          *
+ ****************************************************************************/
+
+#include "internal.h"
+#include "cursesm.h"
+#include "cursesapp.h"
+
+MODULE_ID("$Id: cursesm.cc,v 1.27 2021/04/17 18:11:08 tom Exp $")
+
+NCursesMenuItem::~NCursesMenuItem() THROWS(NCursesException)
+{
+  if (item)
+    OnError(::free_item(item));
+}
+
+bool
+NCursesMenuItem::action()
+{
+  return FALSE;
+}
+
+NCursesMenuCallbackItem::~NCursesMenuCallbackItem() THROWS(NCursesException)
+{
+}
+
+bool
+NCursesMenuCallbackItem::action()
+{
+  if (p_fct)
+    return p_fct (*this);
+  else
+    return FALSE;
+}
+
+/* Internal hook functions. They will route the hook
+ * calls to virtual methods of the NCursesMenu class,
+ * so in C++ providing a hook is done simply by
+ * implementing a virtual method in a derived class
+ */
+void
+_nc_xx_mnu_init(MENU *m)
+{
+  NCursesMenu::getHook(m)->On_Menu_Init();
+}
+
+void
+_nc_xx_mnu_term(MENU *m)
+{
+  NCursesMenu::getHook(m)->On_Menu_Termination();
+}
+
+void
+_nc_xx_itm_init(MENU *m)
+{
+  NCursesMenu* M = NCursesMenu::getHook(m);
+  M->On_Item_Init (*(M->current_item ()));
+}
+
+void
+_nc_xx_itm_term(MENU *m)
+{
+  NCursesMenu* M = NCursesMenu::getHook(m);
+  M->On_Item_Termination (*(M->current_item ()));
+}
+
+/* Construct an ITEM* array from an array of NCursesMenuItem
+ * objects.
+ */
+ITEM**
+NCursesMenu::mapItems(NCursesMenuItem* nitems[])
+{
+  int itemCount = 0,lcv;
+
+  for (lcv=0; nitems[lcv]->item; ++lcv)
+    ++itemCount;
+
+  ITEM** itemArray = new ITEM*[itemCount + 1];
+
+  for (lcv=0;nitems[lcv]->item;++lcv) {
+    itemArray[lcv] = nitems[lcv]->item;
+  }
+  itemArray[lcv] = NULL;
+
+  my_items = nitems;
+
+  if (menu)
+    delete[] ::menu_items(menu);
+  return itemArray;
+}
+
+void
+NCursesMenu::InitMenu(NCursesMenuItem* nitems[],
+		      bool with_frame,
+		      bool autoDelete_Items)
+{
+  int mrows, mcols;
+
+  keypad(TRUE);
+  meta(TRUE);
+
+  b_framed = with_frame;
+  b_autoDelete = autoDelete_Items;
+
+  menu = static_cast<MENU*>(0);
+  menu = ::new_menu(mapItems(nitems));
+  if (!menu)
+    OnError (E_SYSTEM_ERROR);
+
+  UserHook* hook = new UserHook;
+  hook->m_user   = NULL;
+  hook->m_back   = this;
+  hook->m_owner  = menu;
+  ::set_menu_userptr(menu, static_cast<void*>(hook));
+
+  ::set_menu_init (menu, _nc_xx_mnu_init);
+  ::set_menu_term (menu, _nc_xx_mnu_term);
+  ::set_item_init (menu, _nc_xx_itm_init);
+  ::set_item_term (menu, _nc_xx_itm_term);
+
+  scale(mrows, mcols);
+  ::set_menu_win(menu, w);
+
+  if (with_frame) {
+    if ((mrows > height()-2) || (mcols > width()-2))
+      OnError(E_NO_ROOM);
+    sub = new NCursesWindow(*this,mrows,mcols,1,1,'r');
+    ::set_menu_sub(menu, sub->w);
+    b_sub_owner = TRUE;
+  }
+  else {
+    sub = static_cast<NCursesWindow*>(0);
+    b_sub_owner = FALSE;
+  }
+  setDefaultAttributes();
+}
+
+void
+NCursesMenu::setDefaultAttributes()
+{
+  NCursesApplication* S = NCursesApplication::getApplication();
+  if (S) {
+    ::set_menu_fore(menu, S->foregrounds());
+    ::set_menu_back(menu, S->backgrounds());
+    ::set_menu_grey(menu, S->inactives());
+  }
+}
+
+NCursesMenu::~NCursesMenu() THROWS(NCursesException)
+{
+  UserHook* hook = reinterpret_cast<UserHook*>(::menu_userptr(menu));
+  delete hook;
+  if (b_sub_owner) {
+    ::set_menu_sub(menu, static_cast<WINDOW *>(0));
+    delete sub;
+  }
+  if (menu) {
+    ITEM** itms = ::menu_items(menu);
+    int cnt = count();
+
+    OnError(::set_menu_items(menu, static_cast<ITEM**>(0)));
+
+    if (b_autoDelete) {
+      if (cnt>0) {
+	for (int i=0; i <= cnt; i++)
+	  delete my_items[i];
+      }
+      delete[] my_items;
+    }
+
+    ::free_menu(menu);
+    // It's essential to do this after free_menu()
+    delete[] itms;
+  }
+}
+
+void
+NCursesMenu::setSubWindow(NCursesWindow& nsub)
+{
+  if (!isDescendant(nsub))
+    OnError(E_SYSTEM_ERROR);
+  else {
+    if (b_sub_owner)
+      delete sub;
+    sub = &nsub;
+    ::set_menu_sub(menu,sub->w);
+  }
+}
+
+bool
+NCursesMenu::set_pattern (const char *pat)
+{
+  int res = ::set_menu_pattern (menu, pat);
+  switch(res) {
+  case E_OK:
+    break;
+  case E_NO_MATCH:
+    return FALSE;
+  default:
+    OnError (res);
+  }
+  return TRUE;
+}
+
+// call the menu driver and do basic error checking.
+int
+NCursesMenu::driver (int c)
+{
+  int res = ::menu_driver (menu, c);
+  switch (res) {
+  case E_OK:
+  case E_REQUEST_DENIED:
+  case E_NOT_SELECTABLE:
+  case E_UNKNOWN_COMMAND:
+  case E_NO_MATCH:
+    break;
+  default:
+    OnError (res);
+  }
+  return (res);
+}
+
+static const int CMD_QUIT   = MAX_COMMAND + 1;
+static const int CMD_ACTION = MAX_COMMAND + 2;
+//
+// -------------------------------------------------------------------------
+// Provide a default key virtualization. Translate the keyboard
+// code c into a menu request code.
+// The default implementation provides a hopefully straightforward
+// mapping for the most common keystrokes and menu requests.
+// -------------------------------------------------------------------------
+int
+NCursesMenu::virtualize(int c)
+{
+  switch(c) {
+  case CTRL('X')     : return(CMD_QUIT);              // eXit
+
+  case KEY_DOWN      : return(REQ_DOWN_ITEM);
+  case CTRL('N')     : return(REQ_NEXT_ITEM);         // Next
+  case KEY_UP        : return(REQ_UP_ITEM);
+  case CTRL('P')     : return(REQ_PREV_ITEM);         // Previous
+
+  case CTRL('U')     : return(REQ_SCR_ULINE);         // Up
+  case CTRL('D')     : return(REQ_SCR_DLINE);         // Down
+  case CTRL('F')     : return(REQ_SCR_DPAGE);         // Forward
+  case CTRL('B')     : return(REQ_SCR_UPAGE);         // Backward
+
+  case CTRL('Y')     : return(REQ_CLEAR_PATTERN);
+  case CTRL('H')     : return(REQ_BACK_PATTERN);
+  case CTRL('A')     : return(REQ_NEXT_MATCH);
+  case CTRL('E')     : return(REQ_PREV_MATCH);
+  case CTRL('T')     : return(REQ_TOGGLE_ITEM);
+
+  case CTRL('J')     :
+  case CTRL('M')     : return(CMD_ACTION);
+
+  case KEY_HOME      : return(REQ_FIRST_ITEM);
+  case KEY_LEFT      : return(REQ_LEFT_ITEM);
+  case KEY_RIGHT     : return(REQ_RIGHT_ITEM);
+  case KEY_END       : return(REQ_LAST_ITEM);
+  case KEY_BACKSPACE : return(REQ_BACK_PATTERN);
+  case KEY_NPAGE     : return(REQ_SCR_DPAGE);
+  case KEY_PPAGE     : return(REQ_SCR_UPAGE);
+
+  default:
+    return(c);
+  }
+}
+
+NCursesMenuItem*
+NCursesMenu::operator()(void)
+{
+  int drvCmnd;
+  int c;
+  bool b_action = FALSE;
+
+  post();
+  show();
+  refresh();
+
+  while (!b_action && ((drvCmnd = virtualize((c = getKey()))) != CMD_QUIT)) {
+    int err;
+
+    switch((err = driver(drvCmnd))) {
+    case E_REQUEST_DENIED:
+      On_Request_Denied(c);
+      break;
+    case E_NOT_SELECTABLE:
+      On_Not_Selectable(c);
+      break;
+    case E_UNKNOWN_COMMAND:
+      if (drvCmnd == CMD_ACTION) {
+	if (options() & O_ONEVALUE) {
+	  NCursesMenuItem* itm = current_item();
+	  assert(itm != 0);
+	  if (itm->options() & O_SELECTABLE)
+	    {
+	      b_action = itm->action();
+	      refresh();
+	    }
+	  else
+	    On_Not_Selectable(c);
+	}
+	else {
+	  int n = count();
+	  for(int i=0; i<n; i++) {
+	    NCursesMenuItem* itm = my_items[i];
+	    if (itm->value()) {
+	      b_action |= itm->action();
+	      refresh();
+	    }
+	  }
+	}
+      } else
+	On_Unknown_Command(c);
+      break;
+    case E_NO_MATCH:
+      On_No_Match(c);
+      break;
+    case E_OK:
+      break;
+    default:
+      OnError(err);
+    }
+  }
+
+  unpost();
+  hide();
+  refresh();
+  if (options() & O_ONEVALUE)
+    return my_items[::item_index (::current_item (menu))];
+  else
+    return NULL;
+}
+
+void
+NCursesMenu::On_Menu_Init()
+{
+}
+
+void
+NCursesMenu::On_Menu_Termination()
+{
+}
+
+void
+NCursesMenu::On_Item_Init(NCursesMenuItem& item)
+{
+  (void) item;
+}
+
+void
+NCursesMenu::On_Item_Termination(NCursesMenuItem& item)
+{
+  (void) item;
+}
+
+void
+NCursesMenu::On_Request_Denied(int c) const
+{
+  (void) c;
+  ::beep();
+}
+
+void
+NCursesMenu::On_Not_Selectable(int c) const
+{
+  (void) c;
+  ::beep();
+}
+
+void
+NCursesMenu::On_No_Match(int c) const
+{
+  (void) c;
+  ::beep();
+}
+
+void
+NCursesMenu::On_Unknown_Command(int c) const
+{
+  (void) c;
+  ::beep();
+}
diff --git a/c++/cursesm.h b/c++/cursesm.h
new file mode 100644
index 0000000..9651195
--- /dev/null
+++ b/c++/cursesm.h
@@ -0,0 +1,674 @@
+// * This makes emacs happy -*-Mode: C++;-*-
+/****************************************************************************
+ * Copyright 2019-2020,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2012,2014 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author: Juergen Pfeifer, 1997                                          *
+ ****************************************************************************/
+
+// $Id: cursesm.h,v 1.35 2022/08/20 20:52:15 tom Exp $
+
+#ifndef NCURSES_CURSESM_H_incl
+#define NCURSES_CURSESM_H_incl 1
+
+#include <cursesp.h>
+
+extern "C" {
+#  include <menu.h>
+}
+//
+// -------------------------------------------------------------------------
+// This wraps the ITEM type of <menu.h>
+// -------------------------------------------------------------------------
+//
+class NCURSES_CXX_IMPEXP NCursesMenuItem
+{
+  friend class NCursesMenu;
+
+protected:
+  ITEM *item;
+
+  inline void OnError (int err) const THROW2(NCursesException const, NCursesMenuException) {
+    if (err != E_OK)
+      THROW(new NCursesMenuException (err));
+  }
+
+public:
+  NCursesMenuItem (const char* p_name     = NULL,
+		   const char* p_descript = NULL)
+    : item(0)
+  {
+    item = p_name ? ::new_item (p_name, p_descript) : STATIC_CAST(ITEM*)(0);
+    if (p_name && !item)
+      OnError (E_SYSTEM_ERROR);
+  }
+  // Create an item. If you pass both parameters as NULL, a delimiting
+  // item is constructed which can be used to terminate a list of
+  // NCursesMenu objects.
+
+  NCursesMenuItem& operator=(const NCursesMenuItem& rhs)
+  {
+    if (this != &rhs) {
+      *this = rhs;
+    }
+    return *this;
+  }
+
+  NCursesMenuItem(const NCursesMenuItem& rhs)
+    : item(0)
+  {
+    (void) rhs;
+  }
+
+  virtual ~NCursesMenuItem () THROWS(NCursesException);
+  // Release the items memory
+
+  inline const char* name () const {
+    return ::item_name (item);
+  }
+  // Name of the item
+
+  inline const char* description () const {
+    return ::item_description (item);
+  }
+  // Description of the item
+
+  inline int (index) (void) const {
+    return ::item_index (item);
+  }
+  // Index of the item in an item array (or -1)
+
+  inline void options_on (Item_Options opts) {
+    OnError (::item_opts_on (item, opts));
+  }
+  // Switch on the items options
+
+  inline void options_off (Item_Options opts) {
+    OnError (::item_opts_off (item, opts));
+  }
+  // Switch off the item's option
+
+  inline Item_Options options () const {
+    return ::item_opts (item);
+  }
+  // Retrieve the items options
+
+  inline void set_options (Item_Options opts) {
+    OnError (::set_item_opts (item, opts));
+  }
+  // Set the items options
+
+  inline void set_value (bool f) {
+    OnError (::set_item_value (item,f));
+  }
+  // Set/Reset the items selection state
+
+  inline bool value () const {
+    return ::item_value (item);
+  }
+  // Retrieve the items selection state
+
+  inline bool visible () const {
+    return ::item_visible (item);
+  }
+  // Retrieve visibility of the item
+
+  virtual bool action();
+  // Perform an action associated with this item; you may use this in an
+  // user supplied driver for a menu; you may derive from this class and
+  // overload action() to supply items with different actions.
+  // If an action returns true, the menu will be exited. The default action
+  // is to do nothing.
+};
+
+// Prototype for an items callback function.
+typedef bool ITEMCALLBACK(NCursesMenuItem&);
+
+// If you don't like to create a child class for individual items to
+// overload action(), you may use this class and provide a callback
+// function pointer for items.
+class NCURSES_CXX_IMPEXP NCursesMenuCallbackItem : public NCursesMenuItem
+{
+private:
+  ITEMCALLBACK* p_fct;
+
+public:
+  NCursesMenuCallbackItem(ITEMCALLBACK* fct       = NULL,
+			  const char* p_name      = NULL,
+			  const char* p_descript  = NULL )
+    : NCursesMenuItem (p_name, p_descript),
+      p_fct (fct) {
+  }
+
+  NCursesMenuCallbackItem& operator=(const NCursesMenuCallbackItem& rhs)
+  {
+    if (this != &rhs) {
+      *this = rhs;
+    }
+    return *this;
+  }
+
+  NCursesMenuCallbackItem(const NCursesMenuCallbackItem& rhs)
+    : NCursesMenuItem(rhs),
+      p_fct(0)
+  {
+  }
+
+  virtual ~NCursesMenuCallbackItem() THROWS(NCursesException);
+
+  bool action() NCURSES_OVERRIDE;
+};
+
+  // This are the built-in hook functions in this C++ binding. In C++ we use
+  // virtual member functions (see below On_..._Init and On_..._Termination)
+  // to provide this functionality in an object oriented manner.
+extern "C" {
+  void _nc_xx_mnu_init(MENU *);
+  void _nc_xx_mnu_term(MENU *);
+  void _nc_xx_itm_init(MENU *);
+  void _nc_xx_itm_term(MENU *);
+}
+
+//
+// -------------------------------------------------------------------------
+// This wraps the MENU type of <menu.h>
+// -------------------------------------------------------------------------
+//
+class NCURSES_CXX_IMPEXP NCursesMenu : public NCursesPanel
+{
+protected:
+  MENU *menu;
+
+private:
+  NCursesWindow* sub;   // the subwindow object
+  bool b_sub_owner;     // is this our own subwindow?
+  bool b_framed;        // has the menu a border?
+  bool b_autoDelete;    // Delete items when deleting menu?
+
+  NCursesMenuItem** my_items; // The array of items for this menu
+
+  // This structure is used for the menu's user data field to link the
+  // MENU* to the C++ object and to provide extra space for a user pointer.
+  typedef struct {
+    void*              m_user;      // the pointer for the user's data
+    const NCursesMenu* m_back;      // backward pointer to C++ object
+    const MENU*        m_owner;
+  } UserHook;
+
+  // Get the backward pointer to the C++ object from a MENU
+  static inline NCursesMenu* getHook(const MENU *m) {
+    UserHook* hook = STATIC_CAST(UserHook*)(::menu_userptr(m));
+    assert(hook != 0 && hook->m_owner==m);
+    return const_cast<NCursesMenu*>(hook->m_back);
+  }
+
+  friend void _nc_xx_mnu_init(MENU *);
+  friend void _nc_xx_mnu_term(MENU *);
+  friend void _nc_xx_itm_init(MENU *);
+  friend void _nc_xx_itm_term(MENU *);
+
+  // Calculate ITEM* array for the menu
+  ITEM** mapItems(NCursesMenuItem* nitems[]);
+
+protected:
+  // internal routines
+  inline void set_user(void *user) {
+    UserHook* uptr = STATIC_CAST(UserHook*)(::menu_userptr (menu));
+    assert (uptr != 0 && uptr->m_back==this && uptr->m_owner==menu);
+    uptr->m_user = user;
+  }
+
+  inline void *get_user() {
+    UserHook* uptr = STATIC_CAST(UserHook*)(::menu_userptr (menu));
+    assert (uptr != 0 && uptr->m_back==this && uptr->m_owner==menu);
+    return uptr->m_user;
+  }
+
+  void InitMenu (NCursesMenuItem* menu[],
+		 bool with_frame,
+		 bool autoDeleteItems);
+
+  inline void OnError (int err) const THROW2(NCursesException const, NCursesMenuException) {
+    if (err != E_OK)
+      THROW(new NCursesMenuException (this, err));
+  }
+
+  // this wraps the menu_driver call.
+  virtual int driver (int c) ;
+
+  // 'Internal' constructor to create a menu without association to
+  // an array of items.
+  NCursesMenu( int  nlines,
+	       int  ncols,
+	       int  begin_y = 0,
+	       int  begin_x = 0)
+    : NCursesPanel(nlines,ncols,begin_y,begin_x),
+      menu (STATIC_CAST(MENU*)(0)),
+      sub(0),
+      b_sub_owner(0),
+      b_framed(0),
+      b_autoDelete(0),
+      my_items(0)
+  {
+  }
+
+public:
+  // Make a full window size menu
+  NCursesMenu (NCursesMenuItem* Items[],
+	       bool with_frame=FALSE,        // Reserve space for a frame?
+	       bool autoDelete_Items=FALSE)  // Autocleanup of Items?
+    : NCursesPanel(),
+      menu(0),
+      sub(0),
+      b_sub_owner(0),
+      b_framed(0),
+      b_autoDelete(0),
+      my_items(0)
+  {
+      InitMenu(Items, with_frame, autoDelete_Items);
+  }
+
+  // Make a menu with a window of this size.
+  NCursesMenu (NCursesMenuItem* Items[],
+	       int  nlines,
+	       int  ncols,
+	       int  begin_y = 0,
+	       int  begin_x = 0,
+	       bool with_frame=FALSE,        // Reserve space for a frame?
+	       bool autoDelete_Items=FALSE)  // Autocleanup of Items?
+    : NCursesPanel(nlines, ncols, begin_y, begin_x),
+      menu(0),
+      sub(0),
+      b_sub_owner(0),
+      b_framed(0),
+      b_autoDelete(0),
+      my_items(0)
+  {
+      InitMenu(Items, with_frame, autoDelete_Items);
+  }
+
+  NCursesMenu& operator=(const NCursesMenu& rhs)
+  {
+    if (this != &rhs) {
+      *this = rhs;
+      NCursesPanel::operator=(rhs);
+    }
+    return *this;
+  }
+
+  NCursesMenu(const NCursesMenu& rhs)
+    : NCursesPanel(rhs),
+      menu(rhs.menu),
+      sub(rhs.sub),
+      b_sub_owner(rhs.b_sub_owner),
+      b_framed(rhs.b_framed),
+      b_autoDelete(rhs.b_autoDelete),
+      my_items(rhs.my_items)
+  {
+  }
+
+  virtual ~NCursesMenu () THROWS(NCursesException);
+
+  // Retrieve the menus subwindow
+  inline NCursesWindow& subWindow() const {
+    assert(sub!=NULL);
+    return *sub;
+  }
+
+  // Set the menus subwindow
+  void setSubWindow(NCursesWindow& sub);
+
+  // Set these items for the menu
+  inline void setItems(NCursesMenuItem* Items[]) {
+    OnError(::set_menu_items(menu,mapItems(Items)));
+  }
+
+  // Remove the menu from the screen
+  inline void unpost (void) {
+    OnError (::unpost_menu (menu));
+  }
+
+  // Post the menu to the screen if flag is true, unpost it otherwise
+  inline void post(bool flag = TRUE) {
+    flag ? OnError (::post_menu(menu)) : OnError (::unpost_menu (menu));
+  }
+
+  // Get the number of rows and columns for this menu
+  inline void scale (int& mrows, int& mcols) const  {
+    OnError (::scale_menu (menu, &mrows, &mcols));
+  }
+
+  // Set the format of this menu
+  inline void set_format(int mrows, int mcols) {
+    OnError (::set_menu_format(menu, mrows, mcols));
+  }
+
+  // Get the format of this menu
+  inline void menu_format(int& rows,int& ncols) {
+    ::menu_format(menu,&rows,&ncols);
+  }
+
+  // Items of the menu
+  inline NCursesMenuItem* items() const {
+    return *my_items;
+  }
+
+  // Get the number of items in this menu
+  inline int count() const {
+    return ::item_count(menu);
+  }
+
+  // Get the current item (i.e. the one the cursor is located)
+  inline NCursesMenuItem* current_item() const {
+    return my_items[::item_index(::current_item(menu))];
+  }
+
+  // Get the marker string
+  inline const char* mark() const {
+    return ::menu_mark(menu);
+  }
+
+  // Set the marker string
+  inline void set_mark(const char *marker) {
+    OnError (::set_menu_mark (menu, marker));
+  }
+
+  // Get the name of the request code c
+  inline static const char* request_name(int c) {
+    return ::menu_request_name(c);
+  }
+
+  // Get the current pattern
+  inline char* pattern() const {
+    return ::menu_pattern(menu);
+  }
+
+  // true if there is a pattern match, false otherwise.
+  bool set_pattern (const char *pat);
+
+  // set the default attributes for the menu
+  // i.e. set fore, back and grey attribute
+  virtual void setDefaultAttributes();
+
+  // Get the menus background attributes
+  inline chtype back() const {
+    return ::menu_back(menu);
+  }
+
+  // Get the menus foreground attributes
+  inline chtype fore() const {
+    return ::menu_fore(menu);
+  }
+
+  // Get the menus grey attributes (used for unselectable items)
+  inline chtype grey() const {
+    return ::menu_grey(menu);
+  }
+
+  // Set the menus background attributes
+  inline chtype set_background(chtype a) {
+    return ::set_menu_back(menu,a);
+  }
+
+  // Set the menus foreground attributes
+  inline chtype set_foreground(chtype a) {
+    return ::set_menu_fore(menu,a);
+  }
+
+  // Set the menus grey attributes (used for unselectable items)
+  inline chtype set_grey(chtype a) {
+    return ::set_menu_grey(menu,a);
+  }
+
+  inline void options_on (Menu_Options opts) {
+    OnError (::menu_opts_on (menu,opts));
+  }
+
+  inline void options_off(Menu_Options opts) {
+    OnError (::menu_opts_off(menu,opts));
+  }
+
+  inline Menu_Options options() const {
+    return ::menu_opts(menu);
+  }
+
+  inline void set_options (Menu_Options opts) {
+    OnError (::set_menu_opts (menu,opts));
+  }
+
+  inline int pad() const {
+    return ::menu_pad(menu);
+  }
+
+  inline void set_pad (int padch) {
+    OnError (::set_menu_pad (menu, padch));
+  }
+
+  // Position the cursor to the current item
+  inline void position_cursor () const {
+    OnError (::pos_menu_cursor (menu));
+  }
+
+  // Set the current item
+  inline void set_current(NCursesMenuItem& I) {
+    OnError (::set_current_item(menu, I.item));
+  }
+
+  // Get the current top row of the menu
+  inline int top_row (void) const {
+    return ::top_row (menu);
+  }
+
+  // Set the current top row of the menu
+  inline void set_top_row (int row) {
+    OnError (::set_top_row (menu, row));
+  }
+
+  // spacing control
+  // Set the spacing for the menu
+  inline void setSpacing(int spc_description,
+			 int spc_rows,
+			 int spc_columns) {
+    OnError(::set_menu_spacing(menu,
+			       spc_description,
+			       spc_rows,
+			       spc_columns));
+  }
+
+  // Get the spacing info for the menu
+  inline void Spacing(int& spc_description,
+		      int& spc_rows,
+		      int& spc_columns) const {
+    OnError(::menu_spacing(menu,
+			   &spc_description,
+			   &spc_rows,
+			   &spc_columns));
+  }
+
+  // Decorations
+  inline void frame(const char *title=NULL, const char* btitle=NULL) NCURSES_OVERRIDE {
+    if (b_framed)
+      NCursesPanel::frame(title,btitle);
+    else
+      OnError(E_SYSTEM_ERROR);
+  }
+
+  inline void boldframe(const char *title=NULL, const char* btitle=NULL) NCURSES_OVERRIDE {
+    if (b_framed)
+      NCursesPanel::boldframe(title,btitle);
+    else
+      OnError(E_SYSTEM_ERROR);
+  }
+
+  inline void label(const char *topLabel, const char *bottomLabel) NCURSES_OVERRIDE {
+    if (b_framed)
+      NCursesPanel::label(topLabel,bottomLabel);
+    else
+      OnError(E_SYSTEM_ERROR);
+  }
+
+  // -----
+  // Hooks
+  // -----
+
+  // Called after the menu gets repositioned in its window.
+  // This is especially true if the menu is posted.
+  virtual void On_Menu_Init();
+
+  // Called before the menu gets repositioned in its window.
+  // This is especially true if the menu is unposted.
+  virtual void On_Menu_Termination();
+
+  // Called after the item became the current item
+  virtual void On_Item_Init(NCursesMenuItem& item);
+
+  // Called before this item is left as current item.
+  virtual void On_Item_Termination(NCursesMenuItem& item);
+
+  // Provide a default key virtualization. Translate the keyboard
+  // code c into a menu request code.
+  // The default implementation provides a hopefully straightforward
+  // mapping for the most common keystrokes and menu requests.
+  virtual int virtualize(int c);
+
+
+  // Operators
+  inline NCursesMenuItem* operator[](int i) const {
+    if ( (i < 0) || (i >= ::item_count (menu)) )
+      OnError (E_BAD_ARGUMENT);
+    return (my_items[i]);
+  }
+
+  // Perform the menu's operation
+  // Return the item where you left the selection mark for a single
+  // selection menu, or NULL for a multivalued menu.
+  virtual NCursesMenuItem* operator()(void);
+
+  // --------------------
+  // Exception handlers
+  // Called by operator()
+  // --------------------
+
+  // Called if the request is denied
+  virtual void On_Request_Denied(int c) const;
+
+  // Called if the item is not selectable
+  virtual void On_Not_Selectable(int c) const;
+
+  // Called if pattern doesn't match
+  virtual void On_No_Match(int c) const;
+
+  // Called if the command is unknown
+  virtual void On_Unknown_Command(int c) const;
+
+};
+//
+// -------------------------------------------------------------------------
+// This is the typical C++ typesafe way to allow to attach
+// user data to an item of a menu. Its assumed that the user
+// data belongs to some class T. Use T as template argument
+// to create a UserItem.
+// -------------------------------------------------------------------------
+//
+template<class T> class NCURSES_CXX_IMPEXP NCursesUserItem : public NCursesMenuItem
+{
+public:
+  NCursesUserItem (const char* p_name,
+		   const char* p_descript = NULL,
+		   const T* p_UserData    = STATIC_CAST(T*)(0))
+    : NCursesMenuItem (p_name, p_descript) {
+      if (item)
+	OnError (::set_item_userptr (item, const_cast<void *>(reinterpret_cast<const void*>(p_UserData))));
+  }
+
+  virtual ~NCursesUserItem() THROWS(NCursesException) {}
+
+  inline const T* UserData (void) const {
+    return reinterpret_cast<const T*>(::item_userptr (item));
+  };
+
+  inline virtual void setUserData(const T* p_UserData) {
+    if (item)
+      OnError (::set_item_userptr (item, const_cast<void *>(reinterpret_cast<const void *>(p_UserData))));
+  }
+};
+//
+// -------------------------------------------------------------------------
+// The same mechanism is used to attach user data to a menu
+// -------------------------------------------------------------------------
+//
+template<class T> class NCURSES_CXX_IMPEXP NCursesUserMenu : public NCursesMenu
+{
+protected:
+  NCursesUserMenu( int  nlines,
+		   int  ncols,
+		   int  begin_y = 0,
+		   int  begin_x = 0,
+		   const T* p_UserData = STATIC_CAST(T*)(0))
+    : NCursesMenu(nlines,ncols,begin_y,begin_x) {
+      if (menu)
+	set_user (const_cast<void *>(reinterpret_cast<const void*>(p_UserData)));
+  }
+
+public:
+  NCursesUserMenu (NCursesMenuItem* Items[],
+		   const T* p_UserData = STATIC_CAST(T*)(0),
+		   bool with_frame=FALSE,
+		   bool autoDelete_Items=FALSE)
+    : NCursesMenu (Items, with_frame, autoDelete_Items) {
+      if (menu)
+	set_user (const_cast<void *>(reinterpret_cast<const void*>(p_UserData)));
+  };
+
+  NCursesUserMenu (NCursesMenuItem* Items[],
+		   int nlines,
+		   int ncols,
+		   int begin_y = 0,
+		   int begin_x = 0,
+		   const T* p_UserData = STATIC_CAST(T*)(0),
+		   bool with_frame=FALSE)
+    : NCursesMenu (Items, nlines, ncols, begin_y, begin_x, with_frame) {
+      if (menu)
+	set_user (const_cast<void *>(reinterpret_cast<const void*>(p_UserData)));
+  };
+
+  virtual ~NCursesUserMenu() THROWS(NCursesException) {
+  };
+
+  inline T* UserData (void) {
+    return reinterpret_cast<T*>(get_user ());
+  };
+
+  inline virtual void setUserData (const T* p_UserData) {
+    if (menu)
+      set_user (const_cast<void *>(reinterpret_cast<const void*>(p_UserData)));
+  }
+};
+
+#endif /* NCURSES_CURSESM_H_incl */
diff --git a/c++/cursesmain.cc b/c++/cursesmain.cc
new file mode 100644
index 0000000..cc41b50
--- /dev/null
+++ b/c++/cursesmain.cc
@@ -0,0 +1,96 @@
+// * this is for making emacs happy: -*-Mode: C++;-*-
+/****************************************************************************
+ * Copyright 2019,2020 Thomas E. Dickey                                     *
+ * Copyright 1998-2007,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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author: Juergen Pfeifer, 1997                                          *
+ ****************************************************************************/
+
+#include "internal.h"
+#include "cursesapp.h"
+
+#if CPP_HAS_TRY_CATCH && HAVE_IOSTREAM
+#pragma GCC diagnostic ignored "-Weffc++"
+#include <iostream>
+#pragma GCC diagnostic warning "-Weffc++"
+#else
+#undef CPP_HAS_TRY_CATCH
+#define CPP_HAS_TRY_CATCH 0
+#endif
+
+MODULE_ID("$Id: cursesmain.cc,v 1.20 2020/07/18 19:57:11 anonymous.maarten Exp $")
+
+#if HAVE_LOCALE_H
+#include <locale.h>
+#else
+#define setlocale(name,string) /* nothing */
+#endif
+
+#if NO_LEAKS
+#include <nc_alloc.h>
+#endif
+
+/* This is the default implementation of main() for a NCursesApplication.
+ * You only have to instantiate a static NCursesApplication object in your
+ * main application source file and link this module with your application.
+ */
+int NCURSES_CXX_MAIN_NAME(int argc, char* argv[])
+{
+  setlocale(LC_ALL, "");
+
+  NCursesApplication* A = NCursesApplication::getApplication();
+  if (!A)
+    return(1);
+  else {
+    int res;
+
+    A->handleArgs(argc,argv);
+    ::endwin();
+#if CPP_HAS_TRY_CATCH
+    try {
+      res = (*A)();
+      ::endwin();
+    }
+    catch(const NCursesException &e) {
+      ::endwin();
+      std::cerr << e.message << std::endl;
+      res = e.errorno;
+    }
+#else
+    res = (*A)();
+    ::endwin();
+#endif
+#if NO_LEAKS
+    delete A;
+    exit_curses(res);
+#else
+    return(res);
+#endif
+  }
+}
diff --git a/c++/cursesp.cc b/c++/cursesp.cc
new file mode 100644
index 0000000..58b2a8f
--- /dev/null
+++ b/c++/cursesp.cc
@@ -0,0 +1,139 @@
+// * this is for making emacs happy: -*-Mode: C++;-*-
+/****************************************************************************
+ * Copyright 2019,2020 Thomas E. Dickey                                     *
+ * Copyright 1998-2003,2005 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author: Juergen Pfeifer, 1993, 1997                                    *
+ ****************************************************************************/
+
+#include "internal.h"
+#include "cursesp.h"
+
+MODULE_ID("$Id: cursesp.cc,v 1.27 2020/02/02 23:34:34 tom Exp $")
+
+NCursesPanel* NCursesPanel::dummy = static_cast<NCursesPanel*>(0);
+
+void NCursesPanel::init()
+{
+  p = ::new_panel(w);
+  if (!p)
+    OnError(ERR);
+
+  UserHook* hook = new UserHook;
+  hook->m_user  = NULL;
+  hook->m_back  = this;
+  hook->m_owner = p;
+  ::set_panel_userptr(p, reinterpret_cast<void *>(hook));
+}
+
+NCursesPanel::~NCursesPanel() THROWS(NCursesException)
+{
+  UserHook* hook = UserPointer();
+  assert(hook != 0 && hook->m_back==this && hook->m_owner==p);
+  delete hook;
+  ::del_panel(p);
+  ::update_panels();
+}
+
+void
+NCursesPanel::redraw()
+{
+  PANEL *pan;
+
+  pan = ::panel_above(NULL);
+  while (pan) {
+    ::touchwin(panel_window(pan));
+    pan = ::panel_above(pan);
+  }
+  ::update_panels();
+  ::doupdate();
+}
+
+int
+NCursesPanel::refresh()
+{
+  ::update_panels();
+  return ::doupdate();
+}
+
+int
+NCursesPanel::noutrefresh()
+{
+  ::update_panels();
+  return OK;
+}
+
+void
+NCursesPanel::boldframe(const char *title, const char* btitle)
+{
+  standout();
+  frame(title, btitle);
+  standend();
+}
+
+void
+NCursesPanel::frame(const char *title,const char *btitle)
+{
+  int err = OK;
+  if (!title && !btitle) {
+    err = box();
+  }
+  else {
+    err = box();
+    if (err==OK)
+      label(title,btitle);
+  }
+  OnError(err);
+}
+
+void
+NCursesPanel::label(const char *tLabel, const char *bLabel)
+{
+  if (tLabel)
+    centertext(0,tLabel);
+  if (bLabel)
+    centertext(maxy(),bLabel);
+}
+
+void
+NCursesPanel::centertext(int row,const char *labelText)
+{
+  if (labelText) {
+    int x = (maxx() - ::strlen(labelText)) / 2;
+    if (x<0)
+      x=0;
+    OnError(addstr(row, x, labelText, width()));
+  }
+}
+
+int
+NCursesPanel::getKey(void)
+{
+  return getch();
+}
diff --git a/c++/cursesp.h b/c++/cursesp.h
new file mode 100644
index 0000000..f0bd5c9
--- /dev/null
+++ b/c++/cursesp.h
@@ -0,0 +1,271 @@
+// * This makes emacs happy -*-Mode: C++;-*-
+// vile:cppmode
+/****************************************************************************
+ * Copyright 2019-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2012,2014 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author: Juergen Pfeifer, 1997                                          *
+ ****************************************************************************/
+
+#ifndef NCURSES_CURSESP_H_incl
+#define NCURSES_CURSESP_H_incl 1
+
+// $Id: cursesp.h,v 1.36 2022/08/20 20:52:15 tom Exp $
+
+#include <cursesw.h>
+
+extern "C" {
+#  include <panel.h>
+}
+
+class NCURSES_CXX_IMPEXP NCursesPanel
+  : public NCursesWindow
+{
+protected:
+  PANEL *p;
+  static NCursesPanel *dummy;
+
+private:
+  // This structure is used for the panel's user data field to link the
+  // PANEL* to the C++ object and to provide extra space for a user pointer.
+  typedef struct {
+    void*               m_user;      // the pointer for the user's data
+    const NCursesPanel* m_back;      // backward pointer to C++ object
+    const PANEL*        m_owner;     // the panel itself
+  } UserHook;
+
+  inline UserHook *UserPointer()
+  {
+    UserHook* uptr = reinterpret_cast<UserHook*>(
+                           const_cast<void *>(::panel_userptr (p)));
+    return uptr;
+  }
+
+  void init();                       // Initialize the panel object
+
+protected:
+  void set_user(void *user)
+  {
+    UserHook* uptr = UserPointer();
+    if (uptr != 0 && uptr->m_back==this && uptr->m_owner==p) {
+      uptr->m_user = user;
+    }
+  }
+  // Set the user pointer of the panel.
+
+  void *get_user()
+  {
+    UserHook* uptr = UserPointer();
+    void *result = 0;
+    if (uptr != 0 && uptr->m_back==this && uptr->m_owner==p)
+      result = uptr->m_user;
+    return result;
+  }
+
+  void OnError (int err) const THROW2(NCursesException const, NCursesPanelException)
+  {
+    if (err==ERR)
+      THROW(new NCursesPanelException (this, err));
+  }
+  // If err is equal to the curses error indicator ERR, an error handler
+  // is called.
+
+  // Get a keystroke. Default implementation calls getch()
+  virtual int getKey(void);
+
+public:
+  NCursesPanel(int nlines,
+	       int ncols,
+	       int begin_y = 0,
+	       int begin_x = 0)
+    : NCursesWindow(nlines,ncols,begin_y,begin_x), p(0)
+  {
+    init();
+  }
+  // Create a panel with this size starting at the requested position.
+
+  NCursesPanel()
+    : NCursesWindow(::stdscr), p(0)
+  {
+    init();
+  }
+  // This constructor creates the default Panel associated with the
+  // ::stdscr window
+
+  NCursesPanel& operator=(const NCursesPanel& rhs)
+  {
+    if (this != &rhs) {
+      *this = rhs;
+      NCursesWindow::operator=(rhs);
+    }
+    return *this;
+  }
+
+  NCursesPanel(const NCursesPanel& rhs)
+    : NCursesWindow(rhs),
+      p(rhs.p)
+  {
+  }
+
+  virtual ~NCursesPanel() THROWS(NCursesException);
+
+  // basic manipulation
+  inline void hide()
+  {
+    OnError (::hide_panel(p));
+  }
+  // Hide the panel. It stays in the stack but becomes invisible.
+
+  inline void show()
+  {
+    OnError (::show_panel(p));
+  }
+  // Show the panel, i.e. make it visible.
+
+  inline void top()
+  {
+    OnError (::top_panel(p));
+  }
+  // Make this panel the top panel in the stack.
+
+  inline void bottom()
+  {
+    OnError (::bottom_panel(p));
+  }
+  // Make this panel the bottom panel in the stack.
+  // N.B.: The panel associated with ::stdscr is always on the bottom. So
+  // actually bottom() makes the panel the first above ::stdscr.
+
+  virtual int mvwin(int y, int x) NCURSES_OVERRIDE
+  {
+    OnError(::move_panel(p, y, x));
+    return OK;
+  }
+
+  inline bool hidden() const
+  {
+    return (::panel_hidden (p) ? TRUE : FALSE);
+  }
+  // Return TRUE if the panel is hidden, FALSE otherwise.
+
+/* The functions panel_above() and panel_below() are not reflected in
+   the NCursesPanel class. The reason for this is, that we cannot
+   assume that a panel retrieved by those operations is one wrapped
+   by a C++ class. Although this situation might be handled, we also
+   need a reverse mapping from PANEL to NCursesPanel which needs some
+   redesign of the low level stuff. At the moment, we define them in the
+   interface but they will always produce an error. */
+  inline NCursesPanel& above() const
+  {
+    OnError(ERR);
+    return *dummy;
+  }
+
+  inline NCursesPanel& below() const
+  {
+    OnError(ERR);
+    return *dummy;
+  }
+
+  // Those two are rewrites of the corresponding virtual members of
+  // NCursesWindow
+  virtual int refresh() NCURSES_OVERRIDE;
+  // Propagate all panel changes to the virtual screen and update the
+  // physical screen.
+
+  virtual int noutrefresh() NCURSES_OVERRIDE;
+  // Propagate all panel changes to the virtual screen.
+
+  static void redraw();
+  // Redraw all panels.
+
+  // decorations
+  virtual void frame(const char* title=NULL,
+		     const char* btitle=NULL);
+  // Put a frame around the panel and put the title centered in the top line
+  // and btitle in the bottom line.
+
+  virtual void boldframe(const char* title=NULL,
+			 const char* btitle=NULL);
+  // Same as frame(), but use highlighted attributes.
+
+  virtual void label(const char* topLabel,
+		     const char* bottomLabel);
+  // Put the title centered in the top line and btitle in the bottom line.
+
+  virtual void centertext(int row,const char* label);
+  // Put the label text centered in the specified row.
+};
+
+/* We use templates to provide a typesafe mechanism to associate
+ * user data with a panel. A NCursesUserPanel<T> is a panel
+ * associated with some user data of type T.
+ */
+template<class T> class NCursesUserPanel : public NCursesPanel
+{
+public:
+  NCursesUserPanel (int nlines,
+		    int ncols,
+		    int begin_y = 0,
+		    int begin_x = 0,
+		    const T* p_UserData = STATIC_CAST(T*)(0))
+    : NCursesPanel (nlines, ncols, begin_y, begin_x)
+  {
+      if (p)
+	set_user (const_cast<void *>(reinterpret_cast<const void*>
+				     (p_UserData)));
+  };
+  // This creates an user panel of the requested size with associated
+  // user data pointed to by p_UserData.
+
+  explicit NCursesUserPanel(const T* p_UserData = STATIC_CAST(T*)(0)) : NCursesPanel()
+  {
+    if (p)
+      set_user(const_cast<void *>(reinterpret_cast<const void*>(p_UserData)));
+  };
+  // This creates an user panel associated with the ::stdscr and user data
+  // pointed to by p_UserData.
+
+  virtual ~NCursesUserPanel() THROWS(NCursesException) {};
+
+  T* UserData (void)
+  {
+    return reinterpret_cast<T*>(get_user ());
+  };
+  // Retrieve the user data associated with the panel.
+
+  virtual void setUserData (const T* p_UserData)
+  {
+    if (p)
+      set_user (const_cast<void *>(reinterpret_cast<const void*>(p_UserData)));
+  }
+  // Associate the user panel with the user data pointed to by p_UserData.
+};
+
+#endif /* NCURSES_CURSESP_H_incl */
diff --git a/c++/cursespad.cc b/c++/cursespad.cc
new file mode 100644
index 0000000..6065923
--- /dev/null
+++ b/c++/cursespad.cc
@@ -0,0 +1,300 @@
+// * this is for making emacs happy: -*-Mode: C++;-*-
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1999-2012,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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author: Juergen Pfeifer, 1999                                          *
+ ****************************************************************************/
+
+#include "internal.h"
+
+#include <cursesw.h>
+
+MODULE_ID("$Id: cursespad.cc,v 1.18 2020/02/02 23:34:34 tom Exp $")
+
+NCursesPad::NCursesPad(int nlines, int ncols)
+  : NCursesWindow(),
+    viewWin(static_cast<NCursesWindow*>(0)),
+    viewSub(static_cast<NCursesWindow*>(0)),
+    h_gridsize(0), v_gridsize(0),
+    min_row(0), min_col(0)
+{
+  w = ::newpad(nlines, ncols);
+  if (static_cast<WINDOW*>(0) == w) {
+    count--;
+    err_handler("Cannot construct window");
+  }
+  alloced = TRUE;
+}
+
+
+int NCursesPad::driver (int key)
+{
+  // Default implementation
+  switch(key) {
+  case KEY_UP:
+    // =======
+    return REQ_PAD_UP;
+  case KEY_DOWN:
+    // =========
+    return REQ_PAD_DOWN;
+  case KEY_LEFT:
+    // =========
+    return REQ_PAD_LEFT;
+  case KEY_RIGHT:
+    // ==========
+    return REQ_PAD_RIGHT;
+  case KEY_EXIT:
+    // =========
+  case CTRL('X'):
+    // ==========
+    return REQ_PAD_EXIT;
+
+  default: return(key);
+  }
+}
+
+
+void NCursesPad::operator()(void)
+{
+  NCursesWindow* W = Win();
+
+  if (static_cast<NCursesWindow*>(0) != W) {
+    int Width  = W->width();
+    int Height = W->height();
+
+    int req = REQ_PAD_REFRESH;
+
+    W->keypad(TRUE);
+    W->meta(TRUE);
+    refresh();
+
+    do {
+      bool changed = FALSE;
+
+      switch (req) {
+      case REQ_PAD_REFRESH:
+	// ================
+	changed = TRUE;
+	break;
+      case REQ_PAD_LEFT:
+	// =============
+	if (min_col > 0) {
+	  changed = TRUE;
+	  if (min_col < h_gridsize)
+	    min_col = 0;
+	  else
+	    min_col -= h_gridsize;
+	}
+	else
+	  OnNavigationError(req);
+	break;
+      case REQ_PAD_RIGHT:
+	// ==============
+	if (min_col < (width() - Width - 1)) {
+	  changed = TRUE;
+	  if (min_col > (width() - Width - h_gridsize - 1))
+	    min_col = width() - Width - 1;
+	  else
+	    min_col += h_gridsize;
+	}
+	else
+	  OnNavigationError(req);
+	break;
+      case REQ_PAD_UP:
+	// ===========
+	if (min_row > 0) {
+	  changed = TRUE;
+	  if (min_row < v_gridsize)
+	    min_row = 0;
+	  else
+	    min_row -= v_gridsize;
+	}
+	else
+	  OnNavigationError(req);
+	break;
+      case REQ_PAD_DOWN:
+	// =============
+	if (min_row < (height() - Height - 1)) {
+	  changed = TRUE;
+	  if (min_row > (height() - Height - v_gridsize - 1))
+	    min_row = height() - Height - 1;
+	  else
+	    min_row += v_gridsize;
+	}
+	else
+	  OnNavigationError(req);
+	break;
+
+      default:
+	OnUnknownOperation(req);
+      }
+
+      if (changed) {
+	noutrefresh();
+	W->syncup();
+	OnOperation(req);
+	viewWin->refresh();
+      }
+    } while( (req=driver(W->getch())) != REQ_PAD_EXIT );
+  }
+}
+
+
+int NCursesPad::refresh()
+{
+  int res = noutrefresh();
+  if (res==OK && (static_cast<NCursesWindow*>(0) != viewWin)) {
+    res = (viewWin->refresh());
+  }
+  return(res);
+}
+
+int NCursesPad::noutrefresh()
+{
+  int res = OK;
+  NCursesWindow* W = Win();
+  if (static_cast<NCursesWindow*>(0) != W) {
+    int high = W->maxy();
+    int wide = W->maxx();
+    res = copywin(*W, min_row, min_col,
+		  0, 0, high, wide,
+		  FALSE);
+    if (res==OK) {
+      W->syncup();
+      res = viewWin->noutrefresh();
+    }
+  }
+  return (res);
+}
+
+void NCursesPad::setWindow(NCursesWindow& view,
+			   int v_grid NCURSES_PARAM_INIT(1),
+			   int h_grid NCURSES_PARAM_INIT(1))
+{
+  viewWin = &view;
+  min_row = min_col = 0;
+  if (h_grid <=0 || v_grid <= 0)
+    err_handler("Illegal Gridsize");
+  else {
+    h_gridsize = h_grid;
+    v_gridsize = v_grid;
+  }
+}
+
+void NCursesPad::setSubWindow(NCursesWindow& sub)
+{
+  if (static_cast<NCursesWindow*>(0) == viewWin)
+    err_handler("Pad has no viewport");
+  assert(viewWin != 0);
+  if (!viewWin->isDescendant(sub))
+    THROW(new NCursesException("NCursesFramePad", E_SYSTEM_ERROR));
+  viewSub = &sub;
+}
+
+void NCursesFramedPad::OnOperation(int pad_req)
+{
+  (void) pad_req;
+  NCursesWindow* W = Win();
+  NCursesWindow* W2 = getWindow();
+
+  if ((static_cast<NCursesWindow*>(0) != W) && (static_cast<NCursesWindow*>(0) != W2)) {
+    int Width  = W->width();
+    int Height = W->height();
+    int i, row, col, h_len, v_len;
+
+    int my_width = width();
+
+    if (my_width != 0) {
+      h_len = (Width*Width + my_width - 1) / my_width;
+      if (h_len==0)
+	h_len = 1;
+      if (h_len > Width)
+	h_len = Width;
+    } else {
+      h_len = 1;
+    }
+
+    int my_height = height();
+
+    if (my_height != 0) {
+      v_len = (Height*Height + my_height - 1) / my_height;
+      if (v_len==0)
+	v_len = 1;
+      if (v_len > Height)
+	v_len = Height;
+    } else {
+      v_len = 1;
+    }
+
+    if (my_width != 0) {
+      col  = (min_col * Width + my_width - 1) / my_width;
+      if (col + h_len > Width)
+        col = Width - h_len;
+    } else {
+      col = 0;
+    }
+
+    if (my_height != 0) {
+      row  = (min_row * Height + my_height - 1) / my_height;
+      if (row + v_len > Height)
+        row = Height - v_len;
+    } else {
+      row = 0;
+    }
+
+    W2->vline(1,Width+1,Height);
+    W2->attron(A_REVERSE);
+    if (v_len>=2) {
+      W2->addch(row+1,Width+1,ACS_UARROW);
+      for(i=2;i<v_len;i++)
+	W2->addch(row+i,Width+1,' ');
+      W2->addch(row+v_len,Width+1,ACS_DARROW);
+    }
+    else {
+      for(i=1;i<=v_len;i++)
+	W2->addch(row+i,Width+1,' ');
+    }
+    W2->attroff(A_REVERSE);
+
+    W2->hline(Height+1,1,Width);
+    W2->attron(A_REVERSE);
+    if (h_len >= 2) {
+      W2->addch(Height+1,col+1,ACS_LARROW);
+      for(i=2;i<h_len;i++)
+	W2->addch(Height+1,col+i,' ');
+      W2->addch(Height+1,col+h_len,ACS_RARROW);
+    }
+    else {
+      for(i=1;i<=h_len;i++)
+	W2->addch(Height+1,col+i,' ');
+    }
+    W2->attroff(A_REVERSE);
+  }
+}
diff --git a/c++/cursesw.cc b/c++/cursesw.cc
new file mode 100644
index 0000000..8ea265c
--- /dev/null
+++ b/c++/cursesw.cc
@@ -0,0 +1,470 @@
+// * this is for making emacs happy: -*-Mode: C++;-*-
+/****************************************************************************
+ * Copyright 2019,2020 Thomas E. Dickey                                     *
+ * Copyright 1998-2012,2014 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.                                                           *
+ ****************************************************************************/
+
+/*
+ * Authors:
+ *	Thomas E. Dickey
+ *	Juergen Pfeifer
+ *
+ * The NCursesWindow class was originally based on a file written by
+ * Eric Newton, later modified by Ulrich Drepper and Anatoly Ivasyuk.
+ * However, aside from the compatible interface definition, no trace
+ * of the original code remains in this version: it consists only of
+ * changes introduced since 1995.
+ */
+
+#include "internal.h"
+#include "cursesw.h"
+
+MODULE_ID("$Id: cursesw.cc,v 1.56 2020/02/02 23:34:34 tom Exp $")
+
+#define COLORS_NEED_INITIALIZATION  -1
+#define COLORS_NOT_INITIALIZED       0
+#define COLORS_MONOCHROME            1
+#define COLORS_ARE_REALLY_THERE      2
+
+#define HaveColors() (colorInitialized == COLORS_ARE_REALLY_THERE)
+
+// declare static variables for the class
+long NCursesWindow::count = 0L;
+bool NCursesWindow::b_initialized = FALSE;
+
+int
+NCursesWindow::scanw(const char* fmt, ...)
+{
+    int result = ERR;
+
+    va_list args;
+    va_start(args, fmt);
+    result = ::vw_scanw (w, const_cast<NCURSES_CONST char *>(fmt), args);
+    va_end(args);
+
+    return result;
+}
+
+
+int
+NCursesWindow::scanw(int y, int x, const char* fmt, ...)
+{
+    int result = ERR;
+
+    if (::wmove(w, y, x) != ERR) {
+	va_list args;
+	va_start(args, fmt);
+	result = ::vw_scanw (w, const_cast<NCURSES_CONST char *>(fmt), args);
+	va_end(args);
+    }
+    return result;
+}
+
+
+int
+NCursesWindow::scanw(const char* fmt, va_list args)
+{
+    int result = ERR;
+
+    result = ::vw_scanw (w, const_cast<NCURSES_CONST char *>(fmt), args);
+
+    return result;
+}
+
+
+int
+NCursesWindow::scanw(int y, int x, const char* fmt, va_list args)
+{
+    int result = ERR;
+
+    if (::wmove(w, y, x) != ERR) {
+	result = ::vw_scanw (w, const_cast<NCURSES_CONST char *>(fmt), args);
+    }
+    return result;
+}
+
+
+int
+NCursesWindow::printw(const char * fmt, ...)
+{
+    va_list args;
+    va_start(args, fmt);
+    int result = ::vw_printw(w, fmt, args);
+    va_end(args);
+    return result;
+}
+
+
+int
+NCursesWindow::printw(int y, int x, const char * fmt, ...)
+{
+    va_list args;
+    va_start(args, fmt);
+    int result = ::wmove(w, y, x);
+    if (result == OK) {
+	result = ::vw_printw(w, fmt, args);
+    }
+    va_end(args);
+    return result;
+}
+
+
+int
+NCursesWindow::printw(const char * fmt, va_list args)
+{
+    int result = ::vw_printw(w, fmt, args);
+    return result;
+}
+
+
+int
+NCursesWindow::printw(int y, int x, const char * fmt, va_list args)
+{
+    int result = ::wmove(w, y, x);
+    if (result == OK) {
+	result = ::vw_printw(w, fmt, args);
+    }
+    return result;
+}
+
+
+void
+NCursesWindow::set_keyboard(void)
+{
+    keypad(TRUE);
+    meta(TRUE);
+}
+
+void
+NCursesWindow::err_handler(const char *msg) const THROWS(NCursesException)
+{
+  THROW(new NCursesException(msg));
+}
+
+void
+NCursesWindow::initialize()
+{
+    if (!b_initialized) {
+	::initscr();
+	b_initialized = TRUE;
+	if (colorInitialized == COLORS_NEED_INITIALIZATION) {
+	    colorInitialized = COLORS_NOT_INITIALIZED;
+	    useColors();
+	}
+	::noecho();
+	::cbreak();
+    }
+}
+
+void
+NCursesWindow::constructing()
+{
+    initialize();
+    ++count;
+}
+
+NCursesWindow::NCursesWindow()
+  : w(0), alloced(FALSE), par(0), subwins(0), sib(0)
+{
+    constructing();
+
+    w = static_cast<WINDOW *>(0);
+}
+
+NCursesWindow::NCursesWindow(int nlines, int ncols, int begin_y, int begin_x)
+  : w(0), alloced(TRUE), par(0), subwins(0), sib(0)
+{
+    constructing();
+
+    w = ::newwin(nlines, ncols, begin_y, begin_x);
+    if (w == 0) {
+	err_handler("Cannot construct window");
+    }
+    set_keyboard();
+}
+
+NCursesWindow::NCursesWindow(WINDOW* window)
+  : w(0), alloced(FALSE), par(0), subwins(0), sib(0)
+{
+    constructing();
+
+    // We used to use a reference on the "window" parameter, but we cannot do
+    // that with an opaque pointer (see NCURSES_OPAQUE).  If the parameter was
+    // "::stdscr", that is first set via the "constructing() call, and is null
+    // up to that point.  So we allow a null pointer here as meaning the "same"
+    // as "::stdscr".
+    w = window ? window : ::stdscr;
+    set_keyboard();
+}
+
+NCursesWindow::NCursesWindow(NCursesWindow& win, int ny, int nx,
+			     int begin_y, int begin_x, char absrel)
+  : w(0), alloced(TRUE), par(0), subwins(0), sib(0)
+{
+    constructing();
+    if (absrel == 'a') {	// absolute origin
+	begin_y -= win.begy();
+	begin_x -= win.begx();
+    }
+
+    // Link this window into its parent's list of subwindows.
+    // We use derwin(), since this also works for pads.
+    w = ::derwin(win.w, ny, nx, begin_y, begin_x);
+    if (w == 0) {
+	err_handler("Cannot construct subwindow");
+    }
+
+    par = &win;
+    sib = win.subwins;
+    win.subwins = this;
+}
+
+NCursesWindow::NCursesWindow(NCursesWindow& win,
+				bool do_box NCURSES_PARAM_INIT(TRUE))
+  : w(0), alloced(TRUE), par(0), subwins(0), sib(0)
+{
+    constructing();
+    int myHeight = win.height();
+    int myWidth  = win.width();
+    w = :: derwin(win.w, myHeight - 2, myWidth - 2, 1, 1);
+    if (w == 0) {
+	err_handler("Cannot construct subwindow");
+    }
+
+    par = &win;
+    sib = win.subwins;
+    win.subwins = this;
+    subwins = 0;
+
+    if (do_box) {
+	win.box();
+	win.touchwin();
+    }
+}
+
+NCursesWindow NCursesWindow::Clone()
+{
+    WINDOW *d = ::dupwin(w);
+    NCursesWindow W(d);
+    W.subwins = subwins;
+    W.sib = sib;
+    W.par = par;
+    W.alloced = alloced;
+    return W;
+}
+
+typedef int (*RIPOFFINIT)(NCursesWindow&);
+static RIPOFFINIT R_INIT[5];       // There can't be more
+static int r_init_idx   = 0;
+static RIPOFFINIT* prip = R_INIT;
+
+NCursesWindow::NCursesWindow(WINDOW *win, int ncols)
+  : w(0), alloced(FALSE), par(0), subwins(0), sib(0)
+{
+    (void) ncols;
+    initialize();
+    w = win;
+}
+
+int _nc_xx_ripoff_init(WINDOW *w, int ncols)
+{
+    (void) ncols;
+    int res = ERR;
+
+    RIPOFFINIT init = *prip++;
+    if (init) {
+	res = init(*(new NCursesWindow(w,ncols)));
+    }
+    return res;
+}
+
+int NCursesWindow::ripoffline(int ripoff_lines,
+			      int (*init)(NCursesWindow& win))
+{
+    int code = ::_nc_ripoffline(ripoff_lines,_nc_xx_ripoff_init);
+    if (code == OK && init && ripoff_lines) {
+	R_INIT[r_init_idx++] = init;
+    }
+    return code;
+}
+
+bool
+NCursesWindow::isDescendant(NCursesWindow& win)
+{
+    bool result = FALSE;
+
+    for (NCursesWindow* p = subwins; p != NULL; p = p->sib) {
+	if (p == &win || p->isDescendant(win)) {
+	    result = TRUE;
+	    break;
+	}
+    }
+    return result;
+}
+
+void
+NCursesWindow::kill_subwindows()
+{
+    NCursesWindow* p = subwins;
+
+    subwins = 0;
+    while (p != 0) {
+	NCursesWindow* q = p->sib;
+	p->kill_subwindows();
+	if (p->alloced) {
+	    if (p->w != 0)
+		::delwin(p->w);
+	}
+	delete p;
+	p = q;
+    }
+}
+
+
+NCursesWindow::~NCursesWindow() THROWS(NCursesException)
+{
+    kill_subwindows();
+
+    if (par != 0) {
+	// Remove this window from the parent's list of subwindows.
+	NCursesWindow * next = par->subwins;
+	NCursesWindow * prev = 0;
+	while (next != 0) {
+	    if (next == this) {
+		if (prev != 0) {
+		    prev->sib = next->sib;
+		} else {
+		    par->subwins = next->sib;
+		}
+		break;
+	    }
+	    prev = next;
+	    next = next->sib;
+	}
+    }
+
+    if (alloced && w != 0)
+	::delwin(w);
+
+    if (alloced) {
+	--count;
+	if (count == 0) {
+	    ::endwin();
+	} else if (count < 0) { // cannot happen!
+	    err_handler("Too many windows destroyed");
+	}
+    }
+}
+
+// ---------------------------------------------------------------------
+// Color stuff
+//
+int NCursesWindow::colorInitialized = COLORS_NOT_INITIALIZED;
+
+void
+NCursesWindow::useColors(void)
+{
+    if (colorInitialized == COLORS_NOT_INITIALIZED) {
+	if (b_initialized) {
+	    if (::has_colors()) {
+		::start_color();
+		colorInitialized = COLORS_ARE_REALLY_THERE;
+	    } else {
+		colorInitialized = COLORS_MONOCHROME;
+	    }
+	} else {
+	    colorInitialized = COLORS_NEED_INITIALIZATION;
+	}
+    }
+}
+
+NCURSES_PAIRS_T
+NCursesWindow::getPair() const
+{
+    return static_cast<NCURSES_PAIRS_T>(PAIR_NUMBER(getattrs(w)));
+}
+
+NCURSES_COLOR_T
+NCursesWindow::getcolor(int getback) const
+{
+    NCURSES_COLOR_T fore, back;
+
+    if (HaveColors()) {
+	if (::pair_content(getPair(), &fore, &back) == ERR)
+	    err_handler("Can't get color pair");
+    } else {
+	// Monochrome means white on black
+	back = COLOR_BLACK;
+	fore = COLOR_WHITE;
+    }
+    return getback ? back : fore;
+}
+
+int NCursesWindow::NumberOfColors()
+{
+    return (HaveColors()) ? COLORS : 1;
+}
+
+NCURSES_PAIRS_T
+NCursesWindow::getcolor() const
+{
+    return (HaveColors()) ? getPair() : 0;
+}
+
+int
+NCursesWindow::setpalette(NCURSES_COLOR_T fore, NCURSES_COLOR_T back, NCURSES_PAIRS_T pair)
+{
+    return (HaveColors()) ? ::init_pair(pair, fore, back) : OK;
+}
+
+int
+NCursesWindow::setpalette(NCURSES_COLOR_T fore, NCURSES_COLOR_T back)
+{
+    return setpalette(fore, back, getPair());
+}
+
+
+int
+NCursesWindow::setcolor(NCURSES_PAIRS_T pair)
+{
+    if (HaveColors()) {
+	if ((pair < 1) || (pair > COLOR_PAIRS))
+	    err_handler("Can't set color pair");
+
+	attroff(A_COLOR);
+	attrset(COLOR_PAIR(pair));
+    }
+    return OK;
+}
+
+#if HAVE_HAS_KEY
+bool NCursesWindow::has_mouse() const
+{
+    return ((::has_key(KEY_MOUSE) || ::has_mouse())
+	     ? TRUE : FALSE);
+}
+#endif
diff --git a/c++/cursesw.h b/c++/cursesw.h
new file mode 100644
index 0000000..eef5a63
--- /dev/null
+++ b/c++/cursesw.h
@@ -0,0 +1,1581 @@
+// * This makes emacs happy -*-Mode: C++;-*-
+// vile:cppmode
+/****************************************************************************
+ * Copyright 2019-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2014,2017 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.                                                           *
+ ****************************************************************************/
+
+#ifndef NCURSES_CURSESW_H_incl
+#define NCURSES_CURSESW_H_incl 1
+
+// $Id: cursesw.h,v 1.59 2022/08/20 20:52:15 tom Exp $
+
+extern "C" {
+#  include   <curses.h>
+}
+
+#if defined(BUILDING_NCURSES_CXX)
+# define NCURSES_CXX_IMPEXP NCURSES_EXPORT_GENERAL_EXPORT
+#else
+# define NCURSES_CXX_IMPEXP NCURSES_EXPORT_GENERAL_IMPORT
+#endif
+
+#define NCURSES_CXX_WRAPPED_VAR(type,name) extern NCURSES_CXX_IMPEXP type NCURSES_PUBLIC_VAR(name)(void)
+
+#define NCURSES_CXX_EXPORT(type) NCURSES_CXX_IMPEXP type NCURSES_API
+#define NCURSES_CXX_EXPORT_VAR(type) NCURSES_CXX_IMPEXP type
+
+#include <etip.h>
+
+/* SCO 3.2v4 curses.h includes term.h, which defines lines as a macro.
+   Undefine it here, because NCursesWindow uses lines as a method.  */
+#undef lines
+
+/* "Convert" macros to inlines. We'll define it as another symbol to avoid
+ * conflict with library symbols.
+ */
+#undef UNDEF
+#define UNDEF(name) CUR_ ##name
+
+#ifdef addch
+inline int UNDEF(addch)(chtype ch)  { return addch(ch); }
+#undef addch
+#define addch UNDEF(addch)
+#endif
+
+#ifdef addchstr
+inline int UNDEF(addchstr)(chtype *at) { return addchstr(at); }
+#undef addchstr
+#define addchstr UNDEF(addchstr)
+#endif
+
+#ifdef addnstr
+inline int UNDEF(addnstr)(const char *str, int n)
+{ return addnstr(str, n); }
+#undef addnstr
+#define addnstr UNDEF(addnstr)
+#endif
+
+#ifdef addstr
+inline int UNDEF(addstr)(const char * str)  { return addstr(str); }
+#undef addstr
+#define addstr UNDEF(addstr)
+#endif
+
+#ifdef attroff
+inline int UNDEF(attroff)(chtype at) { return attroff(at); }
+#undef attroff
+#define attroff UNDEF(attroff)
+#endif
+
+#ifdef attron
+inline int UNDEF(attron)(chtype at) { return attron(at); }
+#undef attron
+#define attron UNDEF(attron)
+#endif
+
+#ifdef attrset
+inline chtype UNDEF(attrset)(chtype at) { return attrset(at); }
+#undef attrset
+#define attrset UNDEF(attrset)
+#endif
+
+#ifdef bkgd
+inline int UNDEF(bkgd)(chtype ch) { return bkgd(ch); }
+#undef bkgd
+#define bkgd UNDEF(bkgd)
+#endif
+
+#ifdef bkgdset
+inline void UNDEF(bkgdset)(chtype ch) { bkgdset(ch); }
+#undef bkgdset
+#define bkgdset UNDEF(bkgdset)
+#endif
+
+#ifdef border
+inline int UNDEF(border)(chtype ls, chtype rs, chtype ts, chtype bs, chtype tl, chtype tr, chtype bl, chtype br)
+{ return border(ls, rs, ts, bs, tl, tr, bl, br); }
+#undef border
+#define border UNDEF(border)
+#endif
+
+#ifdef box
+inline int UNDEF(box)(WINDOW *win, int v, int h) { return box(win, v, h); }
+#undef box
+#define box UNDEF(box)
+#endif
+
+#ifdef chgat
+inline int UNDEF(chgat)(int n, attr_t attr, NCURSES_PAIRS_T color, const void *opts) {
+  return chgat(n, attr, color, opts); }
+#undef chgat
+#define chgat UNDEF(chgat)
+#endif
+
+#ifdef clear
+inline int UNDEF(clear)()  { return clear(); }
+#undef clear
+#define clear UNDEF(clear)
+#endif
+
+#ifdef clearok
+inline int UNDEF(clearok)(WINDOW* win, bool bf)  { return clearok(win, bf); }
+#undef clearok
+#define clearok UNDEF(clearok)
+#else
+extern "C" NCURSES_IMPEXP int NCURSES_API clearok(WINDOW*, bool);
+#endif
+
+#ifdef clrtobot
+inline int UNDEF(clrtobot)()  { return clrtobot(); }
+#undef clrtobot
+#define clrtobot UNDEF(clrtobot)
+#endif
+
+#ifdef clrtoeol
+inline int UNDEF(clrtoeol)()  { return clrtoeol(); }
+#undef clrtoeol
+#define clrtoeol UNDEF(clrtoeol)
+#endif
+
+#ifdef color_set
+inline chtype UNDEF(color_set)(NCURSES_PAIRS_T p, void* opts) { return color_set(p, opts); }
+#undef color_set
+#define color_set UNDEF(color_set)
+#endif
+
+#ifdef crmode
+inline int UNDEF(crmode)(void) { return crmode(); }
+#undef crmode
+#define crmode UNDEF(crmode)
+#endif
+
+#ifdef delch
+inline int UNDEF(delch)()  { return delch(); }
+#undef delch
+#define delch UNDEF(delch)
+#endif
+
+#ifdef deleteln
+inline int UNDEF(deleteln)()  { return deleteln(); }
+#undef deleteln
+#define deleteln UNDEF(deleteln)
+#endif
+
+#ifdef echochar
+inline int UNDEF(echochar)(chtype ch)  { return echochar(ch); }
+#undef echochar
+#define echochar UNDEF(echochar)
+#endif
+
+#ifdef erase
+inline int UNDEF(erase)()  { return erase(); }
+#undef erase
+#define erase UNDEF(erase)
+#endif
+
+#ifdef fixterm
+inline int UNDEF(fixterm)(void) { return fixterm(); }
+#undef fixterm
+#define fixterm UNDEF(fixterm)
+#endif
+
+#ifdef flushok
+inline int UNDEF(flushok)(WINDOW* _win, bool _bf)  {
+  return flushok(_win, _bf); }
+#undef flushok
+#define flushok UNDEF(flushok)
+#else
+#define _no_flushok
+#endif
+
+#ifdef getattrs
+inline int UNDEF(getattrs)(WINDOW *win) { return getattrs(win); }
+#undef getattrs
+#define getattrs UNDEF(getattrs)
+#endif
+
+#ifdef getbegyx
+inline void UNDEF(getbegyx)(WINDOW* win, int& y, int& x) { getbegyx(win, y, x); }
+#undef getbegyx
+#define getbegyx UNDEF(getbegyx)
+#endif
+
+#ifdef getbkgd
+inline chtype UNDEF(getbkgd)(const WINDOW *win) { return getbkgd(win); }
+#undef getbkgd
+#define getbkgd UNDEF(getbkgd)
+#endif
+
+#ifdef getch
+inline int UNDEF(getch)()  { return getch(); }
+#undef getch
+#define getch UNDEF(getch)
+#endif
+
+#ifdef getmaxyx
+inline void UNDEF(getmaxyx)(WINDOW* win, int& y, int& x) { getmaxyx(win, y, x); }
+#undef getmaxyx
+#define getmaxyx UNDEF(getmaxyx)
+#endif
+
+#ifdef getnstr
+inline int UNDEF(getnstr)(char *_str, int n)  { return getnstr(_str, n); }
+#undef getnstr
+#define getnstr UNDEF(getnstr)
+#endif
+
+#ifdef getparyx
+inline void UNDEF(getparyx)(WINDOW* win, int& y, int& x) { getparyx(win, y, x); }
+#undef getparyx
+#define getparyx UNDEF(getparyx)
+#endif
+
+#ifdef getstr
+inline int UNDEF(getstr)(char *_str)  { return getstr(_str); }
+#undef getstr
+#define getstr UNDEF(getstr)
+#endif
+
+#ifdef getyx
+inline void UNDEF(getyx)(const WINDOW* win, int& y, int& x) {
+  getyx(win, y, x); }
+#undef getyx
+#define getyx UNDEF(getyx)
+#endif
+
+#ifdef hline
+inline int UNDEF(hline)(chtype ch, int n) { return hline(ch, n); }
+#undef hline
+#define hline UNDEF(hline)
+#endif
+
+#ifdef inch
+inline chtype UNDEF(inch)()  { return inch(); }
+#undef inch
+#define inch UNDEF(inch)
+#endif
+
+#ifdef inchstr
+inline int UNDEF(inchstr)(chtype *str)  { return inchstr(str); }
+#undef inchstr
+#define inchstr UNDEF(inchstr)
+#endif
+
+#ifdef innstr
+inline int UNDEF(innstr)(char *_str, int n)  { return innstr(_str, n); }
+#undef innstr
+#define innstr UNDEF(innstr)
+#endif
+
+#ifdef insch
+inline int UNDEF(insch)(chtype c)  { return insch(c); }
+#undef insch
+#define insch UNDEF(insch)
+#endif
+
+#ifdef insdelln
+inline int UNDEF(insdelln)(int n)  { return insdelln(n); }
+#undef insdelln
+#define insdelln UNDEF(insdelln)
+#endif
+
+#ifdef insertln
+inline int UNDEF(insertln)()  { return insertln(); }
+#undef insertln
+#define insertln UNDEF(insertln)
+#endif
+
+#ifdef insnstr
+inline int UNDEF(insnstr)(const char *_str, int n)  {
+  return insnstr(_str, n); }
+#undef insnstr
+#define insnstr UNDEF(insnstr)
+#endif
+
+#ifdef insstr
+inline int UNDEF(insstr)(const char *_str)  {
+  return insstr(_str); }
+#undef insstr
+#define insstr UNDEF(insstr)
+#endif
+
+#ifdef instr
+inline int UNDEF(instr)(char *_str)  { return instr(_str); }
+#undef instr
+#define instr UNDEF(instr)
+#endif
+
+#ifdef intrflush
+inline void UNDEF(intrflush)(WINDOW *win, bool bf) { intrflush(); }
+#undef intrflush
+#define intrflush UNDEF(intrflush)
+#endif
+
+#ifdef is_linetouched
+inline int UNDEF(is_linetouched)(WINDOW *w, int l)  { return is_linetouched(w,l); }
+#undef is_linetouched
+#define is_linetouched UNDEF(is_linetouched)
+#endif
+
+#ifdef leaveok
+inline int UNDEF(leaveok)(WINDOW* win, bool bf)  { return leaveok(win, bf); }
+#undef leaveok
+#define leaveok UNDEF(leaveok)
+#else
+extern "C" NCURSES_IMPEXP int NCURSES_API leaveok(WINDOW* win, bool bf);
+#endif
+
+#ifdef move
+inline int UNDEF(move)(int x, int y)  { return move(x, y); }
+#undef move
+#define move UNDEF(move)
+#endif
+
+#ifdef mvaddch
+inline int UNDEF(mvaddch)(int y, int x, chtype ch)
+{ return mvaddch(y, x, ch); }
+#undef mvaddch
+#define mvaddch UNDEF(mvaddch)
+#endif
+
+#ifdef mvaddnstr
+inline int UNDEF(mvaddnstr)(int y, int x, const char *str, int n)
+{ return mvaddnstr(y, x, str, n); }
+#undef mvaddnstr
+#define mvaddnstr UNDEF(mvaddnstr)
+#endif
+
+#ifdef mvaddstr
+inline int UNDEF(mvaddstr)(int y, int x, const char * str)
+{ return mvaddstr(y, x, str); }
+#undef mvaddstr
+#define mvaddstr UNDEF(mvaddstr)
+#endif
+
+#ifdef mvchgat
+inline int UNDEF(mvchgat)(int y, int x, int n,
+			  attr_t attr, NCURSES_PAIRS_T color, const void *opts) {
+  return mvchgat(y, x, n, attr, color, opts); }
+#undef mvchgat
+#define mvchgat UNDEF(mvchgat)
+#endif
+
+#ifdef mvdelch
+inline int UNDEF(mvdelch)(int y, int x) { return mvdelch(y, x);}
+#undef mvdelch
+#define mvdelch UNDEF(mvdelch)
+#endif
+
+#ifdef mvgetch
+inline int UNDEF(mvgetch)(int y, int x) { return mvgetch(y, x);}
+#undef mvgetch
+#define mvgetch UNDEF(mvgetch)
+#endif
+
+#ifdef mvgetnstr
+inline int UNDEF(mvgetnstr)(int y, int x, char *str, int n) {
+  return mvgetnstr(y, x, str, n);}
+#undef mvgetnstr
+#define mvgetnstr UNDEF(mvgetnstr)
+#endif
+
+#ifdef mvgetstr
+inline int UNDEF(mvgetstr)(int y, int x, char *str) {return mvgetstr(y, x, str);}
+#undef mvgetstr
+#define mvgetstr UNDEF(mvgetstr)
+#endif
+
+#ifdef mvinch
+inline chtype UNDEF(mvinch)(int y, int x) { return mvinch(y, x);}
+#undef mvinch
+#define mvinch UNDEF(mvinch)
+#endif
+
+#ifdef mvinnstr
+inline int UNDEF(mvinnstr)(int y, int x, char *_str, int n) {
+  return mvinnstr(y, x, _str, n); }
+#undef mvinnstr
+#define mvinnstr UNDEF(mvinnstr)
+#endif
+
+#ifdef mvinsch
+inline int UNDEF(mvinsch)(int y, int x, chtype c)
+{ return mvinsch(y, x, c); }
+#undef mvinsch
+#define mvinsch UNDEF(mvinsch)
+#endif
+
+#ifdef mvinsnstr
+inline int UNDEF(mvinsnstr)(int y, int x, const char *_str, int n) {
+  return mvinsnstr(y, x, _str, n); }
+#undef mvinsnstr
+#define mvinsnstr UNDEF(mvinsnstr)
+#endif
+
+#ifdef mvinsstr
+inline int UNDEF(mvinsstr)(int y, int x, const char *_str)  {
+  return mvinsstr(y, x, _str); }
+#undef mvinsstr
+#define mvinsstr UNDEF(mvinsstr)
+#endif
+
+#ifdef mvwaddch
+inline int UNDEF(mvwaddch)(WINDOW *win, int y, int x, const chtype ch)
+{ return mvwaddch(win, y, x, ch); }
+#undef mvwaddch
+#define mvwaddch UNDEF(mvwaddch)
+#endif
+
+#ifdef mvwaddchnstr
+inline int UNDEF(mvwaddchnstr)(WINDOW *win, int y, int x, const chtype *str, int n)
+{ return mvwaddchnstr(win, y, x, str, n); }
+#undef mvwaddchnstr
+#define mvwaddchnstr UNDEF(mvwaddchnstr)
+#endif
+
+#ifdef mvwaddchstr
+inline int UNDEF(mvwaddchstr)(WINDOW *win, int y, int x, const chtype *str)
+{ return mvwaddchstr(win, y, x, str); }
+#undef mvwaddchstr
+#define mvwaddchstr UNDEF(mvwaddchstr)
+#endif
+
+#ifdef mvwaddnstr
+inline int UNDEF(mvwaddnstr)(WINDOW *win, int y, int x, const char *str, int n)
+{ return mvwaddnstr(win, y, x, str, n); }
+#undef mvwaddnstr
+#define mvwaddnstr UNDEF(mvwaddnstr)
+#endif
+
+#ifdef mvwaddstr
+inline int UNDEF(mvwaddstr)(WINDOW *win, int y, int x, const char * str)
+{ return mvwaddstr(win, y, x, str); }
+#undef mvwaddstr
+#define mvwaddstr UNDEF(mvwaddstr)
+#endif
+
+#ifdef mvwchgat
+inline int UNDEF(mvwchgat)(WINDOW *win, int y, int x, int n,
+			   attr_t attr, NCURSES_PAIRS_T color, const void *opts) {
+  return mvwchgat(win, y, x, n, attr, color, opts); }
+#undef mvwchgat
+#define mvwchgat UNDEF(mvwchgat)
+#endif
+
+#ifdef mvwdelch
+inline int UNDEF(mvwdelch)(WINDOW *win, int y, int x)
+{ return mvwdelch(win, y, x); }
+#undef mvwdelch
+#define mvwdelch UNDEF(mvwdelch)
+#endif
+
+#ifdef mvwgetch
+inline int UNDEF(mvwgetch)(WINDOW *win, int y, int x) { return mvwgetch(win, y, x);}
+#undef mvwgetch
+#define mvwgetch UNDEF(mvwgetch)
+#endif
+
+#ifdef mvwgetnstr
+inline int UNDEF(mvwgetnstr)(WINDOW *win, int y, int x, char *str, int n)
+{return mvwgetnstr(win, y, x, str, n);}
+#undef mvwgetnstr
+#define mvwgetnstr UNDEF(mvwgetnstr)
+#endif
+
+#ifdef mvwgetstr
+inline int UNDEF(mvwgetstr)(WINDOW *win, int y, int x, char *str)
+{return mvwgetstr(win, y, x, str);}
+#undef mvwgetstr
+#define mvwgetstr UNDEF(mvwgetstr)
+#endif
+
+#ifdef mvwhline
+inline int UNDEF(mvwhline)(WINDOW *win, int y, int x, chtype c, int n) {
+  return mvwhline(win, y, x, c, n); }
+#undef mvwhline
+#define mvwhline UNDEF(mvwhline)
+#endif
+
+#ifdef mvwinch
+inline chtype UNDEF(mvwinch)(WINDOW *win, int y, int x) {
+  return mvwinch(win, y, x);}
+#undef mvwinch
+#define mvwinch UNDEF(mvwinch)
+#endif
+
+#ifdef mvwinchnstr
+inline int UNDEF(mvwinchnstr)(WINDOW *win, int y, int x, chtype *str, int n)  { return mvwinchnstr(win, y, x, str, n); }
+#undef mvwinchnstr
+#define mvwinchnstr UNDEF(mvwinchnstr)
+#endif
+
+#ifdef mvwinchstr
+inline int UNDEF(mvwinchstr)(WINDOW *win, int y, int x, chtype *str)  { return mvwinchstr(win, y, x, str); }
+#undef mvwinchstr
+#define mvwinchstr UNDEF(mvwinchstr)
+#endif
+
+#ifdef mvwinnstr
+inline int UNDEF(mvwinnstr)(WINDOW *win, int y, int x, char *_str, int n) {
+  return mvwinnstr(win, y, x, _str, n); }
+#undef mvwinnstr
+#define mvwinnstr UNDEF(mvwinnstr)
+#endif
+
+#ifdef mvwinsch
+inline int UNDEF(mvwinsch)(WINDOW *win, int y, int x, chtype c)
+{ return mvwinsch(win, y, x, c); }
+#undef mvwinsch
+#define mvwinsch UNDEF(mvwinsch)
+#endif
+
+#ifdef mvwinsnstr
+inline int UNDEF(mvwinsnstr)(WINDOW *w, int y, int x, const char *_str, int n) {
+  return mvwinsnstr(w, y, x, _str, n); }
+#undef mvwinsnstr
+#define mvwinsnstr UNDEF(mvwinsnstr)
+#endif
+
+#ifdef mvwinsstr
+inline int UNDEF(mvwinsstr)(WINDOW *w, int y, int x,  const char *_str)  {
+  return mvwinsstr(w, y, x, _str); }
+#undef mvwinsstr
+#define mvwinsstr UNDEF(mvwinsstr)
+#endif
+
+#ifdef mvwvline
+inline int UNDEF(mvwvline)(WINDOW *win, int y, int x, chtype c, int n) {
+  return mvwvline(win, y, x, c, n); }
+#undef mvwvline
+#define mvwvline UNDEF(mvwvline)
+#endif
+
+#ifdef napms
+inline void UNDEF(napms)(unsigned long x) { napms(x); }
+#undef napms
+#define napms UNDEF(napms)
+#endif
+
+#ifdef nocrmode
+inline int UNDEF(nocrmode)(void) { return nocrmode(); }
+#undef nocrmode
+#define nocrmode UNDEF(nocrmode)
+#endif
+
+#ifdef nodelay
+inline void UNDEF(nodelay)() { nodelay(); }
+#undef nodelay
+#define nodelay UNDEF(nodelay)
+#endif
+
+#ifdef redrawwin
+inline int UNDEF(redrawwin)(WINDOW *win)  { return redrawwin(win); }
+#undef redrawwin
+#define redrawwin UNDEF(redrawwin)
+#endif
+
+#ifdef refresh
+inline int UNDEF(refresh)()  { return refresh(); }
+#undef refresh
+#define refresh UNDEF(refresh)
+#endif
+
+#ifdef resetterm
+inline int UNDEF(resetterm)(void) { return resetterm(); }
+#undef resetterm
+#define resetterm UNDEF(resetterm)
+#endif
+
+#ifdef saveterm
+inline int UNDEF(saveterm)(void) { return saveterm(); }
+#undef saveterm
+#define saveterm UNDEF(saveterm)
+#endif
+
+#ifdef scrl
+inline int UNDEF(scrl)(int l) { return scrl(l); }
+#undef scrl
+#define scrl UNDEF(scrl)
+#endif
+
+#ifdef scroll
+inline int UNDEF(scroll)(WINDOW *win) { return scroll(win); }
+#undef scroll
+#define scroll UNDEF(scroll)
+#endif
+
+#ifdef scrollok
+inline int UNDEF(scrollok)(WINDOW* win, bool bf)  { return scrollok(win, bf); }
+#undef scrollok
+#define scrollok UNDEF(scrollok)
+#else
+#if	defined(__NCURSES_H)
+extern "C" NCURSES_IMPEXP int NCURSES_API scrollok(WINDOW*, bool);
+#else
+extern "C" NCURSES_IMPEXP int NCURSES_API scrollok(WINDOW*, char);
+#endif
+#endif
+
+#ifdef setscrreg
+inline int UNDEF(setscrreg)(int t, int b) { return setscrreg(t, b); }
+#undef setscrreg
+#define setscrreg UNDEF(setscrreg)
+#endif
+
+#ifdef standend
+inline int UNDEF(standend)()  { return standend(); }
+#undef standend
+#define standend UNDEF(standend)
+#endif
+
+#ifdef standout
+inline int UNDEF(standout)()  { return standout(); }
+#undef standout
+#define standout UNDEF(standout)
+#endif
+
+#ifdef subpad
+inline WINDOW *UNDEF(subpad)(WINDOW *p, int l, int c, int y, int x)
+{ return derwin(p, l, c, y, x); }
+#undef subpad
+#define subpad UNDEF(subpad)
+#endif
+
+#ifdef timeout
+inline void UNDEF(timeout)(int delay) { timeout(delay); }
+#undef timeout
+#define timeout UNDEF(timeout)
+#endif
+
+#ifdef touchline
+inline int UNDEF(touchline)(WINDOW *win, int s, int c)
+{ return touchline(win, s, c); }
+#undef touchline
+#define touchline UNDEF(touchline)
+#endif
+
+#ifdef touchwin
+inline int UNDEF(touchwin)(WINDOW *win) { return touchwin(win); }
+#undef touchwin
+#define touchwin UNDEF(touchwin)
+#endif
+
+#ifdef untouchwin
+inline int UNDEF(untouchwin)(WINDOW *win) { return untouchwin(win); }
+#undef untouchwin
+#define untouchwin UNDEF(untouchwin)
+#endif
+
+#ifdef vline
+inline int UNDEF(vline)(chtype ch, int n) { return vline(ch, n); }
+#undef vline
+#define vline UNDEF(vline)
+#endif
+
+#ifdef waddchstr
+inline int UNDEF(waddchstr)(WINDOW *win, chtype *at) { return waddchstr(win, at); }
+#undef waddchstr
+#define waddchstr UNDEF(waddchstr)
+#endif
+
+#ifdef waddstr
+inline int UNDEF(waddstr)(WINDOW *win, char *str) { return waddstr(win, str); }
+#undef waddstr
+#define waddstr UNDEF(waddstr)
+#endif
+
+#ifdef wattroff
+inline int UNDEF(wattroff)(WINDOW *win, int att) { return wattroff(win, att); }
+#undef wattroff
+#define wattroff UNDEF(wattroff)
+#endif
+
+#ifdef wattrset
+inline int UNDEF(wattrset)(WINDOW *win, int att) { return wattrset(win, att); }
+#undef wattrset
+#define wattrset UNDEF(wattrset)
+#endif
+
+#ifdef winch
+inline chtype UNDEF(winch)(const WINDOW* win) { return winch(win); }
+#undef winch
+#define winch UNDEF(winch)
+#endif
+
+#ifdef winchnstr
+inline int UNDEF(winchnstr)(WINDOW *win, chtype *str, int n)  { return winchnstr(win, str, n); }
+#undef winchnstr
+#define winchnstr UNDEF(winchnstr)
+#endif
+
+#ifdef winchstr
+inline int UNDEF(winchstr)(WINDOW *win, chtype *str)  { return winchstr(win, str); }
+#undef winchstr
+#define winchstr UNDEF(winchstr)
+#endif
+
+#ifdef winsstr
+inline int UNDEF(winsstr)(WINDOW *w, const char *_str)  {
+  return winsstr(w, _str); }
+#undef winsstr
+#define winsstr UNDEF(winsstr)
+#endif
+
+#ifdef wstandend
+inline int UNDEF(wstandend)(WINDOW *win)  { return wstandend(win); }
+#undef wstandend
+#define wstandend UNDEF(wstandend)
+#endif
+
+#ifdef wstandout
+inline int UNDEF(wstandout)(WINDOW *win)  { return wstandout(win); }
+#undef wstandout
+#define wstandout UNDEF(wstandout)
+#endif
+
+/*
+ *
+ * C++ class for windows.
+ *
+ */
+
+extern "C" int     _nc_ripoffline(int, int (*init)(WINDOW*, int));
+extern "C" int     _nc_xx_ripoff_init(WINDOW *, int);
+extern "C" int     _nc_has_mouse(void);
+
+class NCURSES_CXX_IMPEXP NCursesWindow
+{
+  friend class NCursesMenu;
+  friend class NCursesForm;
+
+private:
+  static bool    b_initialized;
+  static void    initialize();
+  void           constructing();
+  friend int     _nc_xx_ripoff_init(WINDOW *, int);
+
+  void           set_keyboard();
+
+  NCURSES_COLOR_T getcolor(int getback) const;
+  NCURSES_PAIRS_T getPair() const;
+
+  static int     setpalette(NCURSES_COLOR_T fore, NCURSES_COLOR_T back, NCURSES_PAIRS_T pair);
+  static int     colorInitialized;
+
+  // This private constructor is only used during the initialization
+  // of windows generated by ripoffline() calls.
+  NCursesWindow(WINDOW* win, int ncols);
+
+protected:
+  virtual void   err_handler(const char *) const THROWS(NCursesException);
+  // Signal an error with the given message text.
+
+  static long count;        // count of all active windows:
+  //   We rely on the c++ promise that
+  //   all otherwise uninitialized
+  //   static class vars are set to 0
+
+  WINDOW*        w;                // the curses WINDOW
+
+  bool           alloced;          // TRUE if we own the WINDOW
+
+  NCursesWindow* par;              // parent, if subwindow
+  NCursesWindow* subwins;          // head of subwindows list
+  NCursesWindow* sib;              // next subwindow of parent
+
+  void           kill_subwindows(); // disable all subwindows
+  // Destroy all subwindows.
+
+  /* Only for use by derived classes. They are then in charge to
+     fill the member variables correctly. */
+  NCursesWindow();
+
+public:
+  explicit NCursesWindow(WINDOW* window);   // useful only for stdscr
+
+  NCursesWindow(int nlines,        // number of lines
+		int ncols,         // number of columns
+		int begin_y,       // line origin
+		int begin_x);      // col origin
+
+  NCursesWindow(NCursesWindow& par,// parent window
+		int nlines,        // number of lines
+		int ncols,         // number of columns
+		int begin_y,       // absolute or relative
+		int begin_x,       //   origins:
+		char absrel = 'a');// if `a', begin_y & begin_x are
+  // absolute screen pos, else if `r', they are relative to par origin
+
+  NCursesWindow(NCursesWindow& par,// parent window
+		bool do_box = TRUE);
+  // this is the very common case that we want to create the subwindow that
+  // is two lines and two columns smaller and begins at (1,1).
+  // We may automatically request the box around it.
+
+  NCursesWindow& operator=(const NCursesWindow& rhs)
+  {
+    if (this != &rhs)
+      *this = rhs;
+    return *this;
+  }
+
+  NCursesWindow(const NCursesWindow& rhs)
+    : w(rhs.w), alloced(rhs.alloced), par(rhs.par), subwins(rhs.subwins), sib(rhs.sib)
+  {
+  }
+
+  virtual ~NCursesWindow() THROWS(NCursesException);
+
+  NCursesWindow Clone();
+  // Make an exact copy of the window.
+
+  // Initialization.
+  static void    useColors(void);
+  // Call this routine very early if you want to have colors.
+
+  static int ripoffline(int ripoff_lines,
+			int (*init)(NCursesWindow& win));
+  // This function is used to generate a window of ripped-of lines.
+  // If the argument is positive, lines are removed from the top, if it
+  // is negative lines are removed from the bottom. This enhances the
+  // lowlevel ripoffline() function because it uses the internal
+  // implementation that allows to remove more than just a single line.
+  // This function must be called before any other ncurses function. The
+  // creation of the window is deferred until ncurses gets initialized.
+  // The initialization function is then called.
+
+  // -------------------------------------------------------------------------
+  // terminal status
+  // -------------------------------------------------------------------------
+  int            lines() const { initialize(); return LINES; }
+  // Number of lines on terminal, *not* window
+
+  int            cols() const { initialize(); return COLS; }
+  // Number of cols  on terminal, *not* window
+
+  int            tabsize() const { initialize(); return TABSIZE; }
+  // Size of a tab on terminal, *not* window
+
+  static int     NumberOfColors();
+  // Number of available colors
+
+  int            colors() const { return NumberOfColors(); }
+  // Number of available colors
+
+  // -------------------------------------------------------------------------
+  // window status
+  // -------------------------------------------------------------------------
+  int            height() const { return maxy() + 1; }
+  // Number of lines in this window
+
+  int            width() const { return maxx() + 1; }
+  // Number of columns in this window
+
+  int            begx() const { return getbegx(w); }
+  // Column of top left corner relative to stdscr
+
+  int            begy() const { return getbegy(w); }
+  // Line of top left corner relative to stdscr
+
+  int            curx() const { return getcurx(w); }
+  // Column of top left corner relative to stdscr
+
+  int            cury() const { return getcury(w); }
+  // Line of top left corner relative to stdscr
+
+  int            maxx() const { return getmaxx(w) == ERR ? ERR : getmaxx(w)-1; }
+  // Largest x coord in window
+
+  int            maxy() const { return getmaxy(w) == ERR ? ERR : getmaxy(w)-1; }
+  // Largest y coord in window
+
+  NCURSES_PAIRS_T getcolor() const;
+  // Actual color pair
+
+  NCURSES_COLOR_T foreground() const { return getcolor(0); }
+  // Actual foreground color
+
+  NCURSES_COLOR_T background() const { return getcolor(1); }
+  // Actual background color
+
+  int            setpalette(NCURSES_COLOR_T fore, NCURSES_COLOR_T back);
+  // Set color palette entry
+
+  int            setcolor(NCURSES_PAIRS_T pair);
+  // Set actually used palette entry
+
+  // -------------------------------------------------------------------------
+  // window positioning
+  // -------------------------------------------------------------------------
+  virtual int    mvwin(int begin_y, int begin_x) {
+    return ::mvwin(w, begin_y, begin_x); }
+  // Move window to new position with the new position as top left corner.
+  // This is virtual because it is redefined in NCursesPanel.
+
+  // -------------------------------------------------------------------------
+  // coordinate positioning
+  // -------------------------------------------------------------------------
+  int            move(int y, int x) { return ::wmove(w, y, x); }
+  // Move cursor the this position
+
+  void           getyx(int& y, int& x) const { ::getyx(w, y, x); }
+  // Get current position of the cursor
+
+  void           getbegyx(int& y, int& x) const { ::getbegyx(w, y, x); }
+  // Get beginning of the window
+
+  void           getmaxyx(int& y, int& x) const { ::getmaxyx(w, y, x); }
+  // Get size of the window
+
+  void           getparyx(int& y, int& x) const { ::getparyx(w, y, x); }
+  // Get parent's beginning of the window
+
+  int            mvcur(int oldrow, int oldcol, int newrow, int newcol) const {
+    return ::mvcur(oldrow, oldcol, newrow, newcol); }
+  // Perform lowlevel cursor motion that takes effect immediately.
+
+  // -------------------------------------------------------------------------
+  // input
+  // -------------------------------------------------------------------------
+  int            getch() { return ::wgetch(w); }
+  // Get a keystroke from the window.
+
+  int            getch(int y, int x) { return ::mvwgetch(w, y, x); }
+  // Move cursor to position and get a keystroke from the window
+
+  int            getstr(char* str, int n=-1) {
+    return ::wgetnstr(w, str, n); }
+  // Read a series of characters into str until a newline or carriage return
+  // is received. Read at most n characters. If n is negative, the limit is
+  // ignored.
+
+  int            getstr(int y, int x, char* str, int n=-1) {
+    return ::mvwgetnstr(w, y, x, str, n); }
+  // Move the cursor to the requested position and then perform the getstr()
+  // as described above.
+
+  int            instr(char *s, int n=-1) { return ::winnstr(w, s, n); }
+  // Get a string of characters from the window into the buffer s. Retrieve
+  // at most n characters, if n is negative retrieve all characters up to the
+  // end of the current line. Attributes are stripped from the characters.
+
+  int            instr(int y, int x, char *s, int n=-1) {
+    return ::mvwinnstr(w, y, x, s, n); }
+  // Move the cursor to the requested position and then perform the instr()
+  // as described above.
+
+  int            scanw(const char* fmt, ...)
+    // Perform a scanw function from the window.
+#if __GNUG__ >= 2
+    __attribute__ ((format (scanf, 2, 3)));
+#else
+  ;
+#endif
+
+  int            scanw(const char*, va_list);
+    // Perform a scanw function from the window.
+
+  int            scanw(int y, int x, const char* fmt, ...)
+    // Move the cursor to the requested position and then perform a scanw
+    // from the window.
+#if __GNUG__ >= 2
+    __attribute__ ((format (scanf, 4, 5)));
+#else
+  ;
+#endif
+
+  int            scanw(int y, int x, const char* fmt, va_list);
+    // Move the cursor to the requested position and then perform a scanw
+    // from the window.
+
+  // -------------------------------------------------------------------------
+  // output
+  // -------------------------------------------------------------------------
+  int            addch(const chtype ch) { return ::waddch(w, ch); }
+  // Put attributed character to the window.
+
+  int            addch(int y, int x, const chtype ch) {
+    return ::mvwaddch(w, y, x, ch); }
+  // Move cursor to the requested position and then put attributed character
+  // to the window.
+
+  int            echochar(const chtype ch) { return ::wechochar(w, ch); }
+  // Put attributed character to the window and refresh it immediately.
+
+  int            addstr(const char* str, int n=-1) {
+    return ::waddnstr(w, str, n); }
+  // Write the string str to the window, stop writing if the terminating
+  // NUL or the limit n is reached. If n is negative, it is ignored.
+
+  int            addstr(int y, int x, const char * str, int n=-1) {
+    return ::mvwaddnstr(w, y, x, str, n); }
+  // Move the cursor to the requested position and then perform the addchstr
+  // as described above.
+
+  int            addchstr(const chtype* str, int n=-1) {
+    return ::waddchnstr(w, str, n); }
+  // Write the string str to the window, stop writing if the terminating
+  // NUL or the limit n is reached. If n is negative, it is ignored.
+
+  int            addchstr(int y, int x, const chtype * str, int n=-1) {
+    return ::mvwaddchnstr(w, y, x, str, n); }
+  // Move the cursor to the requested position and then perform the addchstr
+  // as described above.
+
+  int            printw(const char* fmt, ...)
+    // Do a formatted print to the window.
+#if (__GNUG__ >= 2) && !defined(printf)
+    __attribute__ ((format (printf, 2, 3)));
+#else
+  ;
+#endif
+
+  int            printw(int y, int x, const char * fmt, ...)
+    // Move the cursor and then do a formatted print to the window.
+#if (__GNUG__ >= 2) && !defined(printf)
+    __attribute__ ((format (printf, 4, 5)));
+#else
+  ;
+#endif
+
+  int            printw(const char* fmt, va_list args);
+    // Do a formatted print to the window.
+
+  int            printw(int y, int x, const char * fmt, va_list args);
+    // Move the cursor and then do a formatted print to the window.
+
+  chtype         inch() const { return ::winch(w); }
+  // Retrieve attributed character under the current cursor position.
+
+  chtype         inch(int y, int x) { return ::mvwinch(w, y, x); }
+  // Move cursor to requested position and then retrieve attributed character
+  // at this position.
+
+  int            inchstr(chtype* str, int n=-1) {
+    return ::winchnstr(w, str, n); }
+  // Read the string str from the window, stop reading if the terminating
+  // NUL or the limit n is reached. If n is negative, it is ignored.
+
+  int            inchstr(int y, int x, chtype * str, int n=-1) {
+    return ::mvwinchnstr(w, y, x, str, n); }
+  // Move the cursor to the requested position and then perform the inchstr
+  // as described above.
+
+  int            insch(chtype ch) { return ::winsch(w, ch); }
+  // Insert attributed character into the window before current cursor
+  // position.
+
+  int            insch(int y, int x, chtype ch) {
+    return ::mvwinsch(w, y, x, ch); }
+  // Move cursor to requested position and then insert the attributed
+  // character before that position.
+
+  int            insertln() { return ::winsdelln(w, 1); }
+  // Insert an empty line above the current line.
+
+  int            insdelln(int n=1) { return ::winsdelln(w, n); }
+  // If n>0 insert that many lines above the current line. If n<0 delete
+  // that many lines beginning with the current line.
+
+  int            insstr(const char *s, int n=-1) {
+    return ::winsnstr(w, s, n); }
+  // Insert the string into the window before the current cursor position.
+  // Insert stops at end of string or when the limit n is reached. If n is
+  // negative, it is ignored.
+
+  int            insstr(int y, int x, const char *s, int n=-1) {
+    return ::mvwinsnstr(w, y, x, s, n); }
+  // Move the cursor to the requested position and then perform the insstr()
+  // as described above.
+
+  int            attron (chtype at) { return ::wattron (w, at); }
+  // Switch on the window attributes;
+
+  int            attroff(chtype at) { return ::wattroff(w, static_cast<int>(at)); }
+  // Switch off the window attributes;
+
+  int            attrset(chtype at) { return ::wattrset(w, static_cast<int>(at)); }
+  // Set the window attributes;
+
+  chtype         attrget() { return ::getattrs(w); }
+  // Get the window attributes;
+
+  int            color_set(NCURSES_PAIRS_T color_pair_number, void* opts=NULL) {
+    return ::wcolor_set(w, color_pair_number, opts); }
+  // Set the window color attribute;
+
+  int            chgat(int n, attr_t attr, NCURSES_PAIRS_T color, const void *opts=NULL) {
+    return ::wchgat(w, n, attr, color, opts); }
+  // Change the attributes of the next n characters in the current line. If
+  // n is negative or greater than the number of remaining characters in the
+  // line, the attributes will be changed up to the end of the line.
+
+  int            chgat(int y, int x,
+		       int n, attr_t attr, NCURSES_PAIRS_T color, const void *opts=NULL) {
+    return ::mvwchgat(w, y, x, n, attr, color, opts); }
+  // Move the cursor to the requested position and then perform chgat() as
+  // described above.
+
+  // -------------------------------------------------------------------------
+  // background
+  // -------------------------------------------------------------------------
+  chtype         getbkgd() const { return ::getbkgd(w); }
+  // Get current background setting.
+
+  int            bkgd(const chtype ch) { return ::wbkgd(w, ch); }
+  // Set the background property and apply it to the window.
+
+  void           bkgdset(chtype ch) { ::wbkgdset(w, ch); }
+  // Set the background property.
+
+  // -------------------------------------------------------------------------
+  // borders
+  // -------------------------------------------------------------------------
+  int            box(chtype vert=0, chtype  hor=0) {
+    return ::wborder(w, vert, vert, hor, hor, 0, 0, 0, 0); }
+  // Draw a box around the window with the given vertical and horizontal
+  // drawing characters. If you specify a zero as character, curses will try
+  // to find a "nice" character.
+
+  int            border(chtype left=0, chtype right=0,
+			chtype top =0, chtype bottom=0,
+			chtype top_left =0, chtype top_right=0,
+			chtype bottom_left =0, chtype bottom_right=0) {
+    return ::wborder(w, left, right, top, bottom, top_left, top_right,
+		     bottom_left, bottom_right); }
+  // Draw a border around the window with the given characters for the
+  // various parts of the border. If you pass zero for a character, curses
+  // will try to find "nice" characters.
+
+  // -------------------------------------------------------------------------
+  // lines and boxes
+  // -------------------------------------------------------------------------
+  int            hline(int len, chtype ch=0) { return ::whline(w, ch, len); }
+  // Draw a horizontal line of len characters with the given character. If
+  // you pass zero for the character, curses will try to find a "nice" one.
+
+  int            hline(int y, int x, int len, chtype ch=0) {
+    return ::mvwhline(w, y, x, ch, len); }
+  // Move the cursor to the requested position and then draw a horizontal line.
+
+  int            vline(int len, chtype ch=0) { return ::wvline(w, ch, len); }
+  // Draw a vertical line of len characters with the given character. If
+  // you pass zero for the character, curses will try to find a "nice" one.
+
+  int            vline(int y, int x, int len, chtype ch=0) {
+    return ::mvwvline(w, y, x, ch, len); }
+  // Move the cursor to the requested position and then draw a vertical line.
+
+  // -------------------------------------------------------------------------
+  // erasure
+  // -------------------------------------------------------------------------
+  int            erase() { return ::werase(w); }
+  // Erase the window.
+
+  int            clear() { return ::wclear(w); }
+  // Clear the window.
+
+  int            clearok(bool bf) { return ::clearok(w, bf); }
+  // Set/Reset the clear flag. If set, the next refresh() will clear the
+  // screen.
+
+  int            clrtobot() { return ::wclrtobot(w); }
+  // Clear to the end of the window.
+
+  int            clrtoeol() { return ::wclrtoeol(w); }
+  // Clear to the end of the line.
+
+  int            delch() { return ::wdelch(w); }
+  // Delete character under the cursor.
+
+  int            delch(int y, int x) { return ::mvwdelch(w, y, x); }
+  // Move cursor to requested position and delete the character under the
+  // cursor.
+
+  int            deleteln() { return ::winsdelln(w, -1); }
+  // Delete the current line.
+
+  // -------------------------------------------------------------------------
+  // screen control
+  // -------------------------------------------------------------------------
+  int            scroll(int amount=1) { return ::wscrl(w, amount); }
+  // Scroll amount lines. If amount is positive, scroll up, otherwise
+  // scroll down.
+
+  int            scrollok(bool bf) { return ::scrollok(w, bf); }
+  // If bf is TRUE, window scrolls if cursor is moved off the bottom
+  // edge of the window or a scrolling region, otherwise the cursor is left
+  // at the bottom line.
+
+  int            setscrreg(int from, int to) {
+    return ::wsetscrreg(w, from, to); }
+  // Define a soft scrolling region.
+
+  int            idlok(bool bf) { return ::idlok(w, bf); }
+  // If bf is TRUE, use insert/delete line hardware support if possible.
+  // Otherwise do it in software.
+
+  void           idcok(bool bf) { ::idcok(w, bf); }
+  // If bf is TRUE, use insert/delete character hardware support if possible.
+  // Otherwise do it in software.
+
+  int            touchline(int s, int c) { return ::touchline(w, s, c); }
+  // Mark the given lines as modified.
+
+  int            touchwin()   { return ::wtouchln(w, 0, height(), 1); }
+  // Mark the whole window as modified.
+
+  int            untouchwin() { return ::wtouchln(w, 0, height(), 0); }
+  // Mark the whole window as unmodified.
+
+  int            touchln(int s, int cnt, bool changed=TRUE) {
+    return ::wtouchln(w, s, cnt, static_cast<int>(changed ? 1 : 0)); }
+  // Mark cnt lines beginning from line s as changed or unchanged, depending
+  // on the value of the changed flag.
+
+  bool           is_linetouched(int line) const {
+    return (::is_linetouched(w, line) == TRUE ? TRUE:FALSE); }
+  // Return TRUE if line is marked as changed, FALSE otherwise
+
+  bool           is_wintouched() const {
+    return (::is_wintouched(w) ? TRUE:FALSE); }
+  // Return TRUE if window is marked as changed, FALSE otherwise
+
+  int            leaveok(bool bf) { return ::leaveok(w, bf); }
+  // If bf is TRUE, curses will leave the cursor after an update wherever
+  // it is after the update.
+
+  int            redrawln(int from, int n) { return ::wredrawln(w, from, n); }
+  // Redraw n lines starting from the requested line
+
+  int            redrawwin() { return ::wredrawln(w, 0, height()); }
+  // Redraw the whole window
+
+  int            doupdate()  { return ::doupdate(); }
+  // Do all outputs to make the physical screen looking like the virtual one
+
+  void           syncdown()  { ::wsyncdown(w); }
+  // Propagate the changes down to all descendant windows
+
+  void           syncup()    { ::wsyncup(w); }
+  // Propagate the changes up in the hierarchy
+
+  void           cursyncup() { ::wcursyncup(w); }
+  // Position the cursor in all ancestor windows corresponding to our setting
+
+  int            syncok(bool bf) { return ::syncok(w, bf); }
+  // If called with bf=TRUE, syncup() is called whenever the window is changed
+
+#ifndef _no_flushok
+  int            flushok(bool bf) { return ::flushok(w, bf); }
+#endif
+
+  void           immedok(bool bf) { ::immedok(w, bf); }
+  // If called with bf=TRUE, any change in the window will cause an
+  // automatic immediate refresh()
+
+  int            intrflush(bool bf) { return ::intrflush(w, bf); }
+
+  int            keypad(bool bf) { return ::keypad(w, bf); }
+  // If called with bf=TRUE, the application will interpret function keys.
+
+  int            nodelay(bool bf) { return ::nodelay(w, bf); }
+
+  int            meta(bool bf) { return ::meta(w, bf); }
+  // If called with bf=TRUE, keys may generate 8-Bit characters. Otherwise
+  // 7-Bit characters are generated.
+
+  int            standout() { return ::wstandout(w); }
+  // Enable "standout" attributes
+
+  int            standend() { return ::wstandend(w); }
+  // Disable "standout" attributes
+
+  // -------------------------------------------------------------------------
+  // The next two are virtual, because we redefine them in the
+  // NCursesPanel class.
+  // -------------------------------------------------------------------------
+  virtual int    refresh() { return ::wrefresh(w); }
+  // Propagate the changes in this window to the virtual screen and call
+  // doupdate(). This is redefined in NCursesPanel.
+
+  virtual int    noutrefresh() { return ::wnoutrefresh(w); }
+  // Propagate the changes in this window to the virtual screen. This is
+  // redefined in NCursesPanel.
+
+  // -------------------------------------------------------------------------
+  // multiple window control
+  // -------------------------------------------------------------------------
+  int            overlay(NCursesWindow& win) {
+    return ::overlay(w, win.w); }
+  // Overlay this window over win.
+
+  int            overwrite(NCursesWindow& win) {
+    return ::overwrite(w, win.w); }
+  // Overwrite win with this window.
+
+  int            copywin(NCursesWindow& win,
+			 int sminrow, int smincol,
+			 int dminrow, int dmincol,
+			 int dmaxrow, int dmaxcol, bool overlaywin=TRUE) {
+    return ::copywin(w, win.w, sminrow, smincol, dminrow, dmincol,
+		     dmaxrow, dmaxcol, static_cast<int>(overlaywin ? 1 : 0)); }
+  // Overlay or overwrite the rectangle in win given by dminrow,dmincol,
+  // dmaxrow,dmaxcol with the rectangle in this window beginning at
+  // sminrow,smincol.
+
+  // -------------------------------------------------------------------------
+  // Extended functions
+  // -------------------------------------------------------------------------
+#if defined(NCURSES_EXT_FUNCS) && (NCURSES_EXT_FUNCS != 0)
+  int            wresize(int newLines, int newColumns) {
+    return ::wresize(w, newLines, newColumns); }
+#endif
+
+  // -------------------------------------------------------------------------
+  // Mouse related
+  // -------------------------------------------------------------------------
+  bool has_mouse() const;
+  // Return TRUE if terminal supports a mouse, FALSE otherwise
+
+  // -------------------------------------------------------------------------
+  // traversal support
+  // -------------------------------------------------------------------------
+  NCursesWindow*  child() { return subwins; }
+  // Get the first child window.
+
+  NCursesWindow*  sibling() { return sib; }
+  // Get the next child of my parent.
+
+  NCursesWindow*  parent() { return par; }
+  // Get my parent.
+
+  bool isDescendant(NCursesWindow& win);
+  // Return TRUE if win is a descendant of this.
+};
+
+// -------------------------------------------------------------------------
+// We leave this here for compatibility reasons.
+// -------------------------------------------------------------------------
+class NCURSES_CXX_IMPEXP NCursesColorWindow : public NCursesWindow
+{
+public:
+  explicit NCursesColorWindow(WINDOW* &window)   // useful only for stdscr
+    : NCursesWindow(window) {
+      useColors(); }
+
+  NCursesColorWindow(int nlines,        // number of lines
+		     int ncols,         // number of columns
+		     int begin_y,       // line origin
+		     int begin_x)       // col origin
+    : NCursesWindow(nlines, ncols, begin_y, begin_x) {
+      useColors(); }
+
+  NCursesColorWindow(NCursesWindow& parentWin,// parent window
+		     int nlines,        // number of lines
+		     int ncols,         // number of columns
+		     int begin_y,       // absolute or relative
+		     int begin_x,       //   origins:
+		     char absrel = 'a') // if `a', by & bx are
+    : NCursesWindow(parentWin,
+		    nlines, ncols,	// absolute screen pos,
+		    begin_y, begin_x,   // else if `r', they are
+		    absrel ) {          // relative to par origin
+      useColors(); }
+};
+
+// These enum definitions really belong inside the NCursesPad class, but only
+// recent compilers support that feature.
+
+  typedef enum {
+    REQ_PAD_REFRESH = KEY_MAX + 1,
+    REQ_PAD_UP,
+    REQ_PAD_DOWN,
+    REQ_PAD_LEFT,
+    REQ_PAD_RIGHT,
+    REQ_PAD_EXIT
+  } Pad_Request;
+
+  const Pad_Request PAD_LOW  = REQ_PAD_REFRESH;   // lowest  op-code
+  const Pad_Request PAD_HIGH = REQ_PAD_EXIT;      // highest op-code
+
+// -------------------------------------------------------------------------
+// Pad Support. We allow an association of a pad with a "real" window
+// through which the pad may be viewed.
+// -------------------------------------------------------------------------
+class NCURSES_CXX_IMPEXP NCursesPad : public NCursesWindow
+{
+private:
+  NCursesWindow* viewWin;       // the "viewport" window
+  NCursesWindow* viewSub;       // the "viewport" subwindow
+
+  int h_gridsize, v_gridsize;
+
+protected:
+  int min_row, min_col;         // top left row/col of the pads display area
+
+  NCursesWindow* Win(void) const {
+    // Get the window into which the pad should be copied (if any)
+    return (viewSub?viewSub:(viewWin?viewWin:0));
+  }
+
+  NCursesWindow* getWindow(void) const {
+    return viewWin;
+  }
+
+  NCursesWindow* getSubWindow(void) const {
+    return viewSub;
+  }
+
+  virtual int driver (int key);      // Virtualize keystroke key
+  // The driver translates the keystroke c into an Pad_Request
+
+  virtual void OnUnknownOperation(int pad_req) {
+    (void) pad_req;
+    ::beep();
+  }
+  // This is called if the driver returns an unknown op-code
+
+  virtual void OnNavigationError(int pad_req) {
+    (void) pad_req;
+    ::beep();
+  }
+  // This is called if a navigation request couldn't be satisfied
+
+  virtual void OnOperation(int pad_req) {
+    (void) pad_req;
+  };
+  // OnOperation is called if a Pad_Operation was executed and just before
+  // the refresh() operation is done.
+
+public:
+  NCursesPad(int nlines, int ncols);
+  // create a pad with the given size
+
+  NCursesPad& operator=(const NCursesPad& rhs)
+  {
+    if (this != &rhs) {
+      *this = rhs;
+      NCursesWindow::operator=(rhs);
+    }
+    return *this;
+  }
+
+  NCursesPad(const NCursesPad& rhs)
+    : NCursesWindow(rhs),
+      viewWin(rhs.viewWin),
+      viewSub(rhs.viewSub),
+      h_gridsize(rhs.h_gridsize),
+      v_gridsize(rhs.v_gridsize),
+      min_row(rhs.min_row),
+      min_col(rhs.min_col)
+  {
+  }
+
+  virtual ~NCursesPad() THROWS(NCursesException) {}
+
+  int echochar(const chtype ch) { return ::pechochar(w, ch); }
+  // Put the attributed character onto the pad and immediately do a
+  // prefresh().
+
+  int refresh() NCURSES_OVERRIDE;
+  // If a viewport is defined the pad is displayed in this window, otherwise
+  // this is a noop.
+
+  int refresh(int pminrow, int pmincol,
+	      int sminrow, int smincol,
+	      int smaxrow, int smaxcol) {
+    return ::prefresh(w, pminrow, pmincol,
+		      sminrow, smincol, smaxrow, smaxcol);
+  }
+  // The coordinates sminrow,smincol,smaxrow,smaxcol describe a rectangle
+  // on the screen. <b>refresh</b> copies a rectangle of this size beginning
+  // with top left corner pminrow,pmincol onto the screen and calls doupdate().
+
+  int noutrefresh() NCURSES_OVERRIDE;
+  // If a viewport is defined the pad is displayed in this window, otherwise
+  // this is a noop.
+
+  int noutrefresh(int pminrow, int pmincol,
+		  int sminrow, int smincol,
+		  int smaxrow, int smaxcol) {
+    return ::pnoutrefresh(w, pminrow, pmincol,
+			  sminrow, smincol, smaxrow, smaxcol);
+  }
+  // Does the same as refresh() but without calling doupdate().
+
+  virtual void setWindow(NCursesWindow& view, int v_grid = 1, int h_grid = 1);
+  // Add the window "view" as viewing window to the pad.
+
+  virtual void setSubWindow(NCursesWindow& sub);
+  // Use the subwindow "sub" of the viewport window for the actual viewing.
+  // The full viewport window is usually used to provide some decorations
+  // like frames, titles etc.
+
+  virtual void operator() (void);
+  // Perform Pad's operation
+};
+
+// A FramedPad is constructed always with a viewport window. This viewport
+// will be framed (by a box() command) and the interior of the box is the
+// viewport subwindow. On the frame we display scrollbar sliders.
+class NCURSES_CXX_IMPEXP NCursesFramedPad : public NCursesPad
+{
+protected:
+  virtual void OnOperation(int pad_req) NCURSES_OVERRIDE;
+
+public:
+  NCursesFramedPad(NCursesWindow& win, int nlines, int ncols,
+		   int v_grid = 1, int h_grid = 1)
+    : NCursesPad(nlines, ncols) {
+    NCursesPad::setWindow(win, v_grid, h_grid);
+    NCursesPad::setSubWindow(*(new NCursesWindow(win)));
+  }
+  // Construct the FramedPad with the given Window win as viewport.
+
+  virtual ~NCursesFramedPad() THROWS(NCursesException) {
+    delete getSubWindow();
+  }
+
+  void setWindow(NCursesWindow& view, int v_grid = 1, int h_grid = 1) NCURSES_OVERRIDE {
+    (void) view;
+    (void) v_grid;
+    (void) h_grid;
+    err_handler("Operation not allowed");
+  }
+  // Disable this call; the viewport is already defined
+
+  void setSubWindow(NCursesWindow& sub) NCURSES_OVERRIDE {
+    (void) sub;
+    err_handler("Operation not allowed");
+  }
+  // Disable this call; the viewport subwindow is already defined
+
+};
+
+#endif /* NCURSES_CURSESW_H_incl */
diff --git a/c++/cursslk.cc b/c++/cursslk.cc
new file mode 100644
index 0000000..b0dd4ab
--- /dev/null
+++ b/c++/cursslk.cc
@@ -0,0 +1,140 @@
+// * this is for making emacs happy: -*-Mode: C++;-*-
+/****************************************************************************
+ * Copyright 2019-2020,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2005,2012 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author: Juergen Pfeifer, 1997                                          *
+ ****************************************************************************/
+
+#include "internal.h"
+#include "cursslk.h"
+#include "cursesapp.h"
+
+MODULE_ID("$Id: cursslk.cc,v 1.20 2022/02/26 17:57:23 tom Exp $")
+
+Soft_Label_Key_Set::Soft_Label_Key&
+  Soft_Label_Key_Set::Soft_Label_Key::operator=(char *text)
+{
+  delete[] label;
+  size_t need = 1 + ::strlen(text);
+  label = new char[need];
+  ::_nc_STRCPY(label,text,need);
+  return *this;
+}
+
+long Soft_Label_Key_Set::count      = 0L;
+int  Soft_Label_Key_Set::num_labels = 0;
+
+Soft_Label_Key_Set::Label_Layout
+  Soft_Label_Key_Set::format = None;
+
+void Soft_Label_Key_Set::init()
+{
+  if (num_labels > 12)
+      num_labels = 12;
+  slk_array = new Soft_Label_Key[num_labels];
+  for(int i=0; i < num_labels; i++) {
+    slk_array[i].num = i+1;
+  }
+  b_attrInit = FALSE;
+}
+
+Soft_Label_Key_Set::Soft_Label_Key_Set()
+  : b_attrInit(FALSE),
+    slk_array(NULL)
+{
+  if (format==None)
+    Error("No default SLK layout");
+  init();
+}
+
+Soft_Label_Key_Set::Soft_Label_Key_Set(Soft_Label_Key_Set::Label_Layout fmt)
+  : b_attrInit(FALSE),
+    slk_array(NULL)
+{
+  if (fmt==None)
+    Error("Invalid SLK Layout");
+  if (count++==0) {
+    format = fmt;
+    if (ERR == ::slk_init(static_cast<int>(fmt)))
+      Error("slk_init");
+    num_labels = (fmt>=PC_Style?12:8);
+  }
+  else if (fmt!=format)
+    Error("All SLKs must have same layout");
+  init();
+}
+
+Soft_Label_Key_Set::~Soft_Label_Key_Set() THROWS(NCursesException) {
+  if (!::isendwin())
+    clear();
+  delete[] slk_array;
+  count--;
+}
+
+Soft_Label_Key_Set::Soft_Label_Key& Soft_Label_Key_Set::operator[](int i) {
+  if (i<1 || i>num_labels)
+    Error("Invalid Label index");
+  return slk_array[i-1];
+}
+
+int Soft_Label_Key_Set::labels() const {
+  return num_labels;
+}
+
+void Soft_Label_Key_Set::activate_label(int i, bool bf) {
+  if (!b_attrInit) {
+    NCursesApplication* A = NCursesApplication::getApplication();
+    if (A) attrset(A->labels());
+    b_attrInit = TRUE;
+  }
+  Soft_Label_Key& K = (*this)[i];
+  if (ERR==::slk_set(K.num,bf?K.label:"",K.format))
+    Error("slk_set");
+  noutrefresh();
+}
+
+void Soft_Label_Key_Set::activate_labels(bool bf)
+{
+  if (!b_attrInit) {
+    NCursesApplication* A = NCursesApplication::getApplication();
+    if (A) attrset(A->labels());
+    b_attrInit = TRUE;
+  }
+  for(int i=1; i <= num_labels; i++) {
+    Soft_Label_Key& K = (*this)[i];
+    if (ERR==::slk_set(K.num,bf?K.label:"",K.format))
+      Error("slk_set");
+  }
+  if (bf)
+    restore();
+  else
+    clear();
+  noutrefresh();
+}
diff --git a/c++/cursslk.h b/c++/cursslk.h
new file mode 100644
index 0000000..66564fe
--- /dev/null
+++ b/c++/cursslk.h
@@ -0,0 +1,240 @@
+// * this is for making emacs happy: -*-Mode: C++;-*-
+// vile:cppmode
+/****************************************************************************
+ * Copyright 2019-2020,2021 Thomas E. Dickey                                *
+ * Copyright 1998-2003,2005 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author: Juergen Pfeifer, 1997                                          *
+ ****************************************************************************/
+
+// $Id: cursslk.h,v 1.19 2021/04/17 18:11:08 tom Exp $
+
+#ifndef NCURSES_CURSSLK_H_incl
+#define NCURSES_CURSSLK_H_incl
+
+#include <cursesw.h>
+
+class NCURSES_CXX_IMPEXP Soft_Label_Key_Set {
+public:
+  // This inner class represents the attributes of a Soft Label Key (SLK)
+  class NCURSES_CXX_IMPEXP Soft_Label_Key {
+    friend class Soft_Label_Key_Set;
+  public:
+    typedef enum { Left=0, Center=1, Right=2 } Justification;
+
+  private:
+    char *label;           // The Text of the Label
+    Justification format;  // The Justification
+    int num;               // The number of the Label
+
+    Soft_Label_Key() : label(NULL), format(Left), num(-1) {
+    }
+
+    virtual ~Soft_Label_Key() {
+      delete[] label;
+    };
+
+  public:
+    // Set the text of the Label
+    Soft_Label_Key& operator=(char *text);
+
+    // Set the Justification of the Label
+    Soft_Label_Key& operator=(Justification just) {
+      format = just;
+      return *this;
+    }
+
+    // Retrieve the text of the label
+    inline char* operator()(void) const {
+      return label;
+    }
+
+    Soft_Label_Key& operator=(const Soft_Label_Key& rhs)
+    {
+      if (this != &rhs) {
+        *this = rhs;
+      }
+      return *this;
+    }
+
+    Soft_Label_Key(const Soft_Label_Key& rhs)
+      : label(NULL),
+        format(rhs.format),
+        num(rhs.num)
+    {
+      *this = rhs.label;
+    }
+  };
+
+public:
+  typedef enum {
+    None                = -1,
+    Three_Two_Three     = 0,
+    Four_Four           = 1,
+    PC_Style            = 2,
+    PC_Style_With_Index = 3
+  } Label_Layout;
+
+private:
+  static long count;               // Number of Key Sets
+  static Label_Layout  format;     // Layout of the Key Sets
+  static int  num_labels;          // Number Of Labels in Key Sets
+  bool b_attrInit;                 // Are attributes initialized
+
+  Soft_Label_Key *slk_array;       // The array of SLK's
+
+  // Init the Key Set
+  void init();
+
+  // Activate or Deactivate Label# i, Label counting starts with 1!
+  void activate_label(int i, bool bf=TRUE);
+
+  // Activate of Deactivate all Labels
+  void activate_labels(bool bf);
+
+protected:
+  inline void Error (const char* msg) const THROWS(NCursesException) {
+    THROW(new NCursesException (msg));
+  }
+
+  // Remove SLK's from screen
+  void clear() {
+    if (ERR==::slk_clear())
+      Error("slk_clear");
+  }
+
+  // Restore them
+  void restore() {
+    if (ERR==::slk_restore())
+      Error("slk_restore");
+  }
+
+public:
+
+  // Construct a Key Set, use the most comfortable layout as default.
+  // You must create a Soft_Label_Key_Set before you create any object of
+  // the NCursesWindow, NCursesPanel or derived classes. (Actually before
+  // ::initscr() is called).
+  explicit Soft_Label_Key_Set(Label_Layout fmt);
+
+  // This constructor assumes, that you already constructed a Key Set
+  // with a layout by the constructor above. This layout will be reused.
+  Soft_Label_Key_Set();
+
+  Soft_Label_Key_Set& operator=(const Soft_Label_Key_Set& rhs)
+  {
+    if (this != &rhs) {
+      *this = rhs;
+      init();		// allocate a new slk_array[]
+    }
+    return *this;
+  }
+
+  Soft_Label_Key_Set(const Soft_Label_Key_Set& rhs)
+    : b_attrInit(rhs.b_attrInit),
+      slk_array(NULL)
+  {
+    init();		// allocate a new slk_array[]
+  }
+
+  virtual ~Soft_Label_Key_Set() THROWS(NCursesException);
+
+  // Get Label# i. Label counting starts with 1!
+  Soft_Label_Key& operator[](int i);
+
+  // Retrieve number of Labels
+  int labels() const;
+
+  // Refresh the SLK portion of the screen
+  inline void refresh() {
+    if (ERR==::slk_refresh())
+      Error("slk_refresh");
+  }
+
+  // Mark the SLK portion of the screen for refresh, defer actual refresh
+  // until next update call.
+  inline void noutrefresh() {
+    if (ERR==::slk_noutrefresh())
+      Error("slk_noutrefresh");
+  }
+
+  // Mark the whole SLK portion of the screen as modified
+  inline void touch() {
+    if (ERR==::slk_touch())
+      Error("slk_touch");
+  }
+
+  // Activate Label# i
+  inline void show(int i) {
+    activate_label(i,FALSE);
+    activate_label(i,TRUE);
+  }
+
+  // Hide Label# i
+  inline void hide(int i) {
+    activate_label(i,FALSE);
+  }
+
+  // Show all Labels
+  inline void show() {
+    activate_labels(FALSE);
+    activate_labels(TRUE);
+  }
+
+  // Hide all Labels
+  inline void hide() {
+    activate_labels(FALSE);
+  }
+
+  inline void attron(attr_t attrs) {
+    if (ERR==::slk_attron(attrs))
+      Error("slk_attron");
+  }
+
+  inline void attroff(attr_t attrs) {
+    if (ERR==::slk_attroff(attrs))
+      Error("slk_attroff");
+  }
+
+  inline void attrset(attr_t attrs) {
+    if (ERR==::slk_attrset(attrs))
+      Error("slk_attrset");
+  }
+
+  inline void color(short color_pair_number) {
+    if (ERR==::slk_color(color_pair_number))
+      Error("slk_color");
+  }
+
+  inline attr_t attr() const {
+    return ::slk_attr();
+  }
+};
+
+#endif /* NCURSES_CURSSLK_H_incl */
diff --git a/c++/demo.cc b/c++/demo.cc
new file mode 100644
index 0000000..195e98a
--- /dev/null
+++ b/c++/demo.cc
@@ -0,0 +1,575 @@
+// * This makes emacs happy -*-Mode: C++;-*-
+/****************************************************************************
+ * Copyright 2018-2020,2021 Thomas E. Dickey                                *
+ * Copyright 1998-2012,2017 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.                                                           *
+ ****************************************************************************/
+
+/*
+ *   Silly demo program for the NCursesPanel class.
+ *
+ *   written by Anatoly Ivasyuk (anatoly@nick.csh.rit.edu)
+ *
+ *   Demo code for NCursesMenu and NCursesForm written by
+ *   Juergen Pfeifer
+ *
+ * $Id: demo.cc,v 1.50 2021/09/04 10:52:55 tom Exp $
+ */
+
+#include "internal.h"
+#include "cursesapp.h"
+#include "cursesm.h"
+#include "cursesf.h"
+
+#if (defined(_WIN32) || defined(_WIN64))
+#undef KEY_EVENT
+#define sleep(n) Sleep(n)
+#else
+extern "C" unsigned int sleep(unsigned int);
+#endif
+
+#undef index // needed for NeXT
+
+//
+// -------------------------------------------------------------------------
+//
+class SillyDemo
+{
+  public:
+  void run(int sleeptime) {
+
+    NCursesPanel *mystd = new NCursesPanel();
+
+    //  Make a few small demo panels
+
+    NCursesPanel *u = new NCursesPanel(8, 20, 12, 4);
+    NCursesPanel *v = new NCursesPanel(8, 20, 10, 6);
+    NCursesPanel *w = new NCursesPanel(8, 20, 8, 8);
+    NCursesPanel *x = new NCursesPanel(8, 20, 6, 10);
+    NCursesPanel *y = new NCursesPanel(8, 20, 4, 12);
+    NCursesPanel *z = new NCursesPanel(8, 30, 2, 14);
+
+    //  Draw something on the main screen, so we can see what happens
+    //  when panels get moved or deleted.
+
+    mystd->box();
+    mystd->move(mystd->height()/2, 1);
+    mystd->hline(mystd->width()-2);
+    mystd->move(1, mystd->width()/2);
+    mystd->vline(mystd->height()-2);
+    mystd->addch(0, mystd->width()/2, ACS_TTEE);
+    mystd->addch(mystd->height()-1, mystd->width()/2, ACS_BTEE);
+    mystd->addch(mystd->height()/2, 0, ACS_LTEE);
+    mystd->addch(mystd->height()/2, mystd->width()-1, ACS_RTEE);
+    mystd->addch(mystd->height()/2, mystd->width()/2, ACS_PLUS);
+
+    //  Draw frames with titles around panels so that we can see where
+    //  the panels are located.
+    u->boldframe("Win U");
+    v->frame("Win V");
+    w->boldframe("Win W");
+    x->frame("Win X");
+    y->boldframe("Win Y");
+    z->frame("Win Z");
+    if (NCursesApplication::getApplication()->useColors()) {
+      u->bkgd(' '|COLOR_PAIR(1));
+      w->bkgd(' '|COLOR_PAIR(1));
+      y->bkgd(' '|COLOR_PAIR(1));
+      v->bkgd(' '|COLOR_PAIR(2));
+      x->bkgd(' '|COLOR_PAIR(2));
+      z->bkgd(' '|COLOR_PAIR(2));
+    }
+
+    //  A refresh to any valid panel updates all panels and refreshes
+    //  the screen.  Using mystd is just convenient - We know it is always
+    //  valid until the end of the program.
+
+    mystd->refresh();
+    sleep(sleeptime);
+
+    //  Show what happens when panels are deleted and moved.
+
+    sleep(sleeptime);
+    delete u;
+    mystd->refresh();
+
+    sleep(sleeptime);
+    delete z;
+    mystd->refresh();
+
+    sleep(sleeptime);
+    delete v;
+    mystd->refresh();
+
+    // show how it looks when a panel moves
+    sleep(sleeptime);
+    y->mvwin(5, 30);
+    mystd->refresh();
+
+    sleep(sleeptime);
+    delete y;
+    mystd->refresh();
+
+    // show how it looks when you raise a panel
+    sleep(sleeptime);
+    w->top();
+    mystd->refresh();
+
+    sleep(sleeptime);
+    delete w;
+    mystd->refresh();
+
+    sleep(sleeptime);
+    delete x;
+
+    mystd->clear();
+    mystd->refresh();
+
+    //  Don't forget to clean up the main screen.  Since this is the
+    //  last thing using NCursesWindow, this has the effect of
+    //  shutting down ncurses and restoring the terminal state.
+
+    sleep(sleeptime);
+    delete mystd;
+  }
+};
+
+class UserData
+{
+private:
+  int u;
+public:
+  UserData(int x) : u(x) {}
+  int sleeptime() const { return u; }
+};
+//
+// -------------------------------------------------------------------------
+//
+template<class T> class MyAction : public NCursesUserItem<T>
+{
+public:
+  MyAction (const char* p_name,
+            const T* p_UserData)
+    : NCursesUserItem<T>(p_name, static_cast<const char*>(0), p_UserData)
+  {}
+
+  virtual ~MyAction() THROWS(NCursesException) {}
+
+  bool action() {
+    SillyDemo a;
+    a.run(NCursesUserItem<T>::UserData()->sleeptime());
+    return FALSE;
+  }
+};
+
+template class MyAction<UserData>;
+template class NCURSES_CXX_IMPEXP NCursesUserItem<UserData>;
+
+class QuitItem : public NCursesMenuItem
+{
+public:
+  QuitItem() : NCursesMenuItem("Quit") {
+  }
+
+  bool action() {
+    return TRUE;
+  }
+};
+//
+// -------------------------------------------------------------------------
+//
+class Label : public NCursesFormField
+{
+public:
+  Label(const char* title,
+        int row, int col)
+    : NCursesFormField(1, static_cast<int>(::strlen(title)), row, col) {
+      set_value(title);
+      options_off(O_EDIT|O_ACTIVE);
+  }
+};
+//
+// -------------------------------------------------------------------------
+//
+class MyFieldType : public UserDefinedFieldType
+{
+private:
+  int chk;
+protected:
+  bool field_check(NCursesFormField& f) {
+    (void) f;
+    return TRUE;
+  }
+  bool char_check(int c) {
+    return (c==chk?TRUE:FALSE);
+  }
+public:
+  MyFieldType(int x) : chk(x) {
+  }
+};
+//
+// -------------------------------------------------------------------------
+//
+class TestForm : public NCursesForm
+{
+private:
+  NCursesFormField** F;
+  MyFieldType* mft;
+  Integer_Field *ift;
+  Enumeration_Field *eft;
+
+  static const char *weekdays[];
+
+public:
+  TestForm()
+    : NCursesForm(13, 51, (lines() - 15)/2, (cols() - 53)/2),
+      F(0),
+      mft(0),
+      ift(0),
+      eft(0)
+  {
+
+    F     = new NCursesFormField*[10];
+    mft   = new MyFieldType('X');
+    ift   = new Integer_Field(0, 1, 10);
+    eft   = new Enumeration_Field(weekdays);
+
+    F[0]  = new Label("Demo Entry Form", 0, 16);
+    F[1]  = new Label("Weekday Enum", 2, 1);
+    F[2]  = new Label("Number(1-10)", 2, 21);
+    F[3]  = new Label("Only 'X'", 2, 35);
+    F[4]  = new Label("Multiline Field (Dynamic and Scrollable)", 5, 1);
+    F[5]  = new NCursesFormField(1, 18, 3, 1);
+    F[6]  = new NCursesFormField(1, 12, 3, 21);
+    F[7]  = new NCursesFormField(1, 12, 3, 35);
+    F[8]  = new NCursesFormField(4, 46, 6, 1, 2);
+    F[9]  = new NCursesFormField();
+
+    InitForm(F, TRUE, TRUE);
+    boldframe();
+
+    F[5]->set_fieldtype(*eft);
+    F[6]->set_fieldtype(*ift);
+
+    F[7]->set_fieldtype(*mft);
+    F[7]->set_maximum_growth(20); // max. 20 characters
+    F[7]->options_off(O_STATIC);  // make field dynamic
+
+    F[8]->set_maximum_growth(10); // max. 10 lines
+    F[8]->options_off(O_STATIC);  // make field dynamic
+  }
+
+  TestForm& operator=(const TestForm& rhs)
+  {
+    if (this != &rhs) {
+      *this = rhs;
+    }
+    return *this;
+  }
+
+  TestForm(const TestForm& rhs)
+    : NCursesForm(rhs), F(0), mft(0), ift(0), eft(0)
+  {
+  }
+
+  ~TestForm() THROWS(NCursesException) {
+    delete mft;
+    delete ift;
+    delete eft;
+  }
+};
+
+const char* TestForm::weekdays[] = {
+    "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday",
+    "Friday", "Saturday", NULL };
+//
+// -------------------------------------------------------------------------
+//
+class FormAction : public NCursesMenuItem
+{
+public:
+  FormAction(const char *s) : NCursesMenuItem(s) {
+  }
+
+  bool action() {
+    TestForm F;
+    Soft_Label_Key_Set* S = new Soft_Label_Key_Set;
+    for(int i=1; i <= S->labels(); i++) {
+      char buf[8];
+      assert(i < 100);
+      ::_nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf)) "Frm%02d", i % 100);
+      (*S)[i] = buf;                                      // Text
+      (*S)[i] = Soft_Label_Key_Set::Soft_Label_Key::Left; // Justification
+    }
+    NCursesApplication::getApplication()->push(*S);
+    F();
+    NCursesApplication::getApplication()->pop();
+    delete S;
+    return FALSE;
+  }
+};
+//
+// -------------------------------------------------------------------------
+//
+class PadAction : public NCursesMenuItem
+{
+public:
+  PadAction(const char* s) : NCursesMenuItem(s) {
+  }
+
+  bool action() {
+    const int GRIDSIZE = 3;
+    const int PADSIZE  = 200;
+    unsigned gridcount = 0;
+
+    NCursesPanel mystd;
+    NCursesPanel P(mystd.lines()-2, mystd.cols()-2, 1, 1);
+    NCursesFramedPad FP(P, PADSIZE, PADSIZE);
+
+    for (int i=0; i < PADSIZE; i++) {
+      for (int j=0; j < PADSIZE; j++) {
+        if (i % GRIDSIZE == 0 && j % GRIDSIZE == 0) {
+          if (i==0 || j==0)
+            FP.addch('+');
+          else
+            FP.addch(static_cast<chtype>('A' + (gridcount++ % 26)));
+        }
+        else if (i % GRIDSIZE == 0)
+          FP.addch('-');
+        else if (j % GRIDSIZE == 0)
+          FP.addch('|');
+        else
+          FP.addch(' ');
+      }
+    }
+
+    P.label("Pad Demo", NULL);
+    FP();
+    P.clear();
+    return FALSE;
+  }
+};
+
+//
+// -------------------------------------------------------------------------
+//
+class PassiveItem : public NCursesMenuItem
+{
+public:
+  PassiveItem(const char* text) : NCursesMenuItem(text) {
+    options_off(O_SELECTABLE);
+  }
+};
+
+//
+// -------------------------------------------------------------------------
+//
+class ScanAction : public NCursesMenuItem
+{
+public:
+  ScanAction(const char* s) : NCursesMenuItem(s) {
+  }
+
+  bool action() {
+    NCursesPanel *mystd = new NCursesPanel();
+
+    NCursesPanel *w = new NCursesPanel(mystd->lines() - 2, mystd->cols() - 2, 1, 1);
+    w->box();
+    w->refresh();
+
+    NCursesPanel *s = new NCursesPanel(w->lines() - 6, w->cols() - 6, 3, 3);
+    s->scrollok(TRUE);
+    ::echo();
+
+    s->printw("Enter decimal integers.  The running total will be shown\n");
+    int nvalue = -1;
+    int result = 0;
+    while (nvalue != 0) {
+      nvalue = 0;
+      s->scanw("%d", &nvalue);
+      if (nvalue != 0) {
+        s->printw("%d: ", result += nvalue);
+      }
+      s->refresh();
+    }
+    s->printw("\nPress any key to continue...");
+    s->getch();
+
+    delete s;
+    delete w;
+    delete mystd;
+    ::noecho();
+    return FALSE;
+  }
+};
+
+//
+// -------------------------------------------------------------------------
+//
+class MyMenu : public NCursesMenu
+{
+private:
+  NCursesPanel* P;
+  NCursesMenuItem** I;
+  UserData *u;
+  #define n_items 7
+
+public:
+  MyMenu ()
+    : NCursesMenu (n_items+2, 8, (lines()-10)/2, (cols()-10)/2),
+      P(0), I(0), u(0)
+  {
+    u = new UserData(1);
+    I = new NCursesMenuItem*[1+n_items];
+    I[0] = new PassiveItem("One");
+    I[1] = new PassiveItem("Two");
+    I[2] = new MyAction<UserData> ("Silly", u);
+    I[3] = new FormAction("Form");
+    I[4] = new PadAction("Pad");
+    I[5] = new ScanAction("Scan");
+    I[6] = new QuitItem();
+    I[7] = new NCursesMenuItem(); // Terminating empty item
+
+    InitMenu(I, TRUE, TRUE);
+
+    P = new NCursesPanel(1, n_items, LINES-1, 1);
+    boldframe("Demo", "Silly");
+    P->show();
+  }
+
+  MyMenu& operator=(const MyMenu& rhs)
+  {
+    if (this != &rhs) {
+      *this = rhs;
+    }
+    return *this;
+  }
+
+  MyMenu(const MyMenu& rhs)
+    : NCursesMenu(rhs), P(0), I(0), u(0)
+  {
+  }
+
+  ~MyMenu() THROWS(NCursesException)
+  {
+    P->hide();
+    delete P;
+    delete u;
+  }
+
+  virtual void On_Menu_Init()
+  {
+    NCursesWindow W(::stdscr);
+    P->move(0, 0);
+    P->clrtoeol();
+    for(int i=1; i<=count(); i++)
+      P->addch('0' + i);
+    P->bkgd(W.getbkgd());
+    refresh();
+  }
+
+  virtual void On_Menu_Termination()
+  {
+    P->move(0, 0);
+    P->clrtoeol();
+    refresh();
+  }
+
+  virtual void On_Item_Init(NCursesMenuItem& item)
+  {
+    P->move(0, item.index());
+    P->attron(A_REVERSE);
+    P->printw("%1d", 1+item.index());
+    P->attroff(A_REVERSE);
+    refresh();
+  }
+
+  virtual void On_Item_Termination(NCursesMenuItem& item)
+  {
+    P->move(0, item.index());
+    P->attroff(A_REVERSE);
+    P->printw("%1d", 1+item.index());
+    refresh();
+  }
+};
+//
+// -------------------------------------------------------------------------
+//
+class TestApplication : public NCursesApplication
+{
+protected:
+  int titlesize() const { return 1; }
+  void title();
+  Soft_Label_Key_Set::Label_Layout useSLKs() const {
+    return Soft_Label_Key_Set::PC_Style_With_Index;
+  }
+  void init_labels(Soft_Label_Key_Set& S) const;
+
+public:
+  TestApplication() : NCursesApplication(TRUE) {
+  }
+
+  int run();
+};
+
+void TestApplication::init_labels(Soft_Label_Key_Set& S) const
+{
+  for(int i=1; i <= S.labels(); i++) {
+    char buf[8];
+    assert(i < 100);
+    ::_nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf)) "Key%02d", i % 100);
+    S[i] = buf;                                      // Text
+    S[i] = Soft_Label_Key_Set::Soft_Label_Key::Left; // Justification
+  }
+}
+
+void TestApplication::title()
+{
+  const char * const titleText = "Simple C++ Binding Demo";
+  const int len = ::strlen(titleText);
+
+  getTitleWindow()->bkgd(screen_titles());
+  getTitleWindow()->addstr(0, (getTitleWindow()->cols() - len)/2, titleText);
+  getTitleWindow()->noutrefresh();
+}
+
+
+int TestApplication::run()
+{
+  MyMenu M;
+  M();
+  return 0;
+}
+
+//
+// -------------------------------------------------------------------------
+//
+static TestApplication *Demo = new TestApplication();
+
+#if (defined(_WIN32) || defined(_WIN64))
+// This is actually only needed when ncurses is a dll
+NCURSES_CXX_MAIN
+#endif
diff --git a/c++/edit_cfg.sh b/c++/edit_cfg.sh
new file mode 100755
index 0000000..928f7fd
--- /dev/null
+++ b/c++/edit_cfg.sh
@@ -0,0 +1,72 @@
+#!/bin/sh
+# $Id: edit_cfg.sh,v 1.19 2022/07/16 18:00:59 tom Exp $
+##############################################################################
+# Copyright 2020,2022 Thomas E. Dickey                                       #
+# Copyright 1998-2007,2008 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey 1997-on
+#
+# Edit the default value of the etip.h file based on the autoconf-generated
+# values:
+#
+#	$1 = ncurses_cfg.h
+#	$2 = etip.h
+#
+echo "substituting autoconf'd values from $1 into $2"
+for name in \
+	CPP_HAS_PARAM_INIT \
+	CPP_HAS_STATIC_CAST \
+	ETIP_NEEDS_MATH_EXCEPTION \
+	ETIP_NEEDS_MATH_H \
+	HAVE_BUILTIN_H \
+	HAVE_GPP_BUILTIN_H \
+	HAVE_GXX_BUILTIN_H \
+	HAVE_IOSTREAM \
+	HAVE_TYPEINFO \
+	HAVE_VALUES_H \
+	IOSTREAM_NAMESPACE
+do
+	rm -f "$2".bak
+	mv "$2" "$2".bak
+	if ( grep "[ 	]${name}[ 	]1" "$1" >/dev/null 2>&1)
+	then
+		value=1
+		sed -e 's/define '"$name"'.*$/define '"$name"' 1/' "$2".bak >"$2"
+	else
+		value=0
+		sed -e 's/define '"$name"'.*$/define '"$name"' 0/' "$2".bak >"$2"
+	fi
+	if (cmp -s "$2" "$2".bak)
+	then
+		echo '... '$name $value
+		mv "$2".bak "$2"
+	else
+		echo '... '$name $value
+		rm -f "$2".bak
+	fi
+done
diff --git a/c++/etip.h.in b/c++/etip.h.in
new file mode 100644
index 0000000..70842ef
--- /dev/null
+++ b/c++/etip.h.in
@@ -0,0 +1,406 @@
+// * This makes emacs happy -*-Mode: C++;-*-
+/****************************************************************************
+ * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2012,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author: Juergen Pfeifer, 1997                                          *
+ ****************************************************************************/
+
+// $Id: etip.h.in,v 1.50 2022/08/20 20:50:00 tom Exp $
+
+#ifndef NCURSES_ETIP_H_incl
+#define NCURSES_ETIP_H_incl 1
+
+// These are substituted at configure/build time
+#ifndef HAVE_BUILTIN_H
+#define HAVE_BUILTIN_H 0
+#endif
+
+#ifndef HAVE_GXX_BUILTIN_H
+#define HAVE_GXX_BUILTIN_H 0
+#endif
+
+#ifndef HAVE_GPP_BUILTIN_H
+#define HAVE_GPP_BUILTIN_H 0
+#endif
+
+#ifndef HAVE_IOSTREAM
+#define HAVE_IOSTREAM 0
+#endif
+
+#ifndef HAVE_TYPEINFO
+#define HAVE_TYPEINFO 0
+#endif
+
+#ifndef HAVE_VALUES_H
+#define HAVE_VALUES_H 0
+#endif
+
+#ifndef ETIP_NEEDS_MATH_H
+#define ETIP_NEEDS_MATH_H 0
+#endif
+
+#ifndef ETIP_NEEDS_MATH_EXCEPTION
+#define ETIP_NEEDS_MATH_EXCEPTION 0
+#endif
+
+#ifndef CPP_HAS_OVERRIDE
+#define CPP_HAS_OVERRIDE 0
+#endif
+
+#ifndef CPP_HAS_PARAM_INIT
+#define CPP_HAS_PARAM_INIT 0
+#endif
+
+#ifndef CPP_HAS_STATIC_CAST
+#define CPP_HAS_STATIC_CAST 0	// workaround for g++ 2.95.3
+#endif
+
+#ifndef IOSTREAM_NAMESPACE
+#define IOSTREAM_NAMESPACE 0
+#endif
+
+#ifdef __GNUG__
+#  if ((__GNUG__ <= 2) && (__GNUC_MINOR__ < 8))
+#    if HAVE_TYPEINFO
+#      include <typeinfo>
+#    endif
+#  endif
+#endif
+
+#if defined(__GNUG__)
+#  if HAVE_BUILTIN_H || HAVE_GXX_BUILTIN_H || HAVE_GPP_BUILTIN_H
+#    if ETIP_NEEDS_MATH_H
+#      if ETIP_NEEDS_MATH_EXCEPTION
+#        undef exception
+#        define exception math_exception
+#      endif
+#      include <math.h>
+#    endif
+#    undef exception
+#    define exception builtin_exception
+#    if HAVE_GPP_BUILTIN_H
+#     include <gpp/builtin.h>
+#    elif HAVE_GXX_BUILTIN_H
+#     include <g++/builtin.h>
+#    else
+#     include <builtin.h>
+#    endif
+#    undef exception
+#  endif
+#elif defined (__SUNPRO_CC)
+#  include <generic.h>
+#endif
+
+#include <curses.h>
+
+extern "C" {
+#if HAVE_VALUES_H
+#  include <values.h>
+#endif
+
+#include <assert.h>
+#include <eti.h>
+#include <errno.h>
+}
+
+// Language features
+#if CPP_HAS_OVERRIDE
+#define NCURSES_OVERRIDE override
+#else
+#define NCURSES_OVERRIDE /*nothing*/
+#endif
+
+#if CPP_HAS_PARAM_INIT
+#define NCURSES_PARAM_INIT(value) = value
+#else
+#define NCURSES_PARAM_INIT(value) /*nothing*/
+#endif
+
+#if CPP_HAS_STATIC_CAST
+#define STATIC_CAST(s) static_cast<s>
+#else
+#define STATIC_CAST(s) (s)
+#endif
+
+#ifndef NCURSES_CXX_IMPEXP
+#define NCURSES_CXX_IMPEXP  /* nothing */
+#endif
+
+// Forward Declarations
+class NCURSES_CXX_IMPEXP NCursesPanel;
+class NCURSES_CXX_IMPEXP NCursesMenu;
+class NCURSES_CXX_IMPEXP NCursesForm;
+
+class NCURSES_CXX_IMPEXP NCursesException
+{
+public:
+  const char *message;
+  int errorno;
+
+  NCursesException (const char* msg, int err)
+    : message(msg), errorno (err)
+    {};
+
+  explicit NCursesException (const char* msg)
+    : message(msg), errorno (E_SYSTEM_ERROR)
+    {};
+
+  NCursesException& operator=(const NCursesException& rhs)
+  {
+    message = rhs.message;
+    errorno = rhs.errorno;
+    return *this;
+  }
+
+  NCursesException(const NCursesException& rhs)
+    : message(rhs.message), errorno(rhs.errorno)
+  {
+  }
+
+  virtual const char *classname() const {
+    return "NCursesWindow";
+  }
+
+  virtual ~NCursesException()
+  {
+  }
+};
+
+class NCURSES_CXX_IMPEXP NCursesPanelException : public NCursesException
+{
+public:
+  const NCursesPanel* p;
+
+  NCursesPanelException (const char *msg, int err) :
+    NCursesException (msg, err),
+    p (0)
+    {};
+
+  NCursesPanelException (const NCursesPanel* panel,
+			 const char *msg,
+			 int err) :
+    NCursesException (msg, err),
+    p (panel)
+    {};
+
+  explicit NCursesPanelException (int err) :
+    NCursesException ("panel library error", err),
+    p (0)
+    {};
+
+  NCursesPanelException (const NCursesPanel* panel,
+			 int err) :
+    NCursesException ("panel library error", err),
+    p (panel)
+    {};
+
+  NCursesPanelException& operator=(const NCursesPanelException& rhs)
+  {
+    if (this != &rhs) {
+      NCursesException::operator=(rhs);
+      p = rhs.p;
+    }
+    return *this;
+  }
+
+  NCursesPanelException(const NCursesPanelException& rhs)
+    : NCursesException(rhs), p(rhs.p)
+  {
+  }
+
+  virtual const char *classname() const NCURSES_OVERRIDE {
+    return "NCursesPanel";
+  }
+
+  virtual ~NCursesPanelException()
+  {
+  }
+};
+
+class NCURSES_CXX_IMPEXP NCursesMenuException : public NCursesException
+{
+public:
+  const NCursesMenu* m;
+
+  NCursesMenuException (const char *msg, int err) :
+    NCursesException (msg, err),
+    m (0)
+    {};
+
+  NCursesMenuException (const NCursesMenu* menu,
+			const char *msg,
+			int err) :
+    NCursesException (msg, err),
+    m (menu)
+    {};
+
+  explicit NCursesMenuException (int err) :
+    NCursesException ("menu library error", err),
+    m (0)
+    {};
+
+  NCursesMenuException (const NCursesMenu* menu,
+			int err) :
+    NCursesException ("menu library error", err),
+    m (menu)
+    {};
+
+  NCursesMenuException& operator=(const NCursesMenuException& rhs)
+  {
+    if (this != &rhs) {
+      NCursesException::operator=(rhs);
+      m = rhs.m;
+    }
+    return *this;
+  }
+
+  NCursesMenuException(const NCursesMenuException& rhs)
+    : NCursesException(rhs), m(rhs.m)
+  {
+  }
+
+  virtual const char *classname() const NCURSES_OVERRIDE {
+    return "NCursesMenu";
+  }
+
+  virtual ~NCursesMenuException()
+  {
+  }
+};
+
+class NCURSES_CXX_IMPEXP NCursesFormException : public NCursesException
+{
+public:
+  const NCursesForm* f;
+
+  NCursesFormException (const char *msg, int err) :
+    NCursesException (msg, err),
+    f (0)
+    {};
+
+  NCursesFormException (const NCursesForm* form,
+			const char *msg,
+			int err) :
+    NCursesException (msg, err),
+    f (form)
+    {};
+
+  explicit NCursesFormException (int err) :
+    NCursesException ("form library error", err),
+    f (0)
+    {};
+
+  NCursesFormException (const NCursesForm* form,
+			int err) :
+    NCursesException ("form library error", err),
+    f (form)
+    {};
+
+  NCursesFormException& operator=(const NCursesFormException& rhs)
+  {
+    if (this != &rhs) {
+      NCursesException::operator=(rhs);
+      f = rhs.f;
+    }
+    return *this;
+  }
+
+  NCursesFormException(const NCursesFormException& rhs)
+    : NCursesException(rhs), f(rhs.f)
+  {
+  }
+
+  virtual const char *classname() const NCURSES_OVERRIDE {
+    return "NCursesForm";
+  }
+
+  virtual ~NCursesFormException()
+  {
+  }
+};
+
+#if !((defined(__GNUG__) && defined(__EXCEPTIONS) && (__GNUG__ < 7)) || defined(__SUNPRO_CC))
+#  if HAVE_IOSTREAM
+#     include <iostream>
+#     if IOSTREAM_NAMESPACE
+using std::cerr;
+using std::endl;
+#     endif
+#  else
+#     include <iostream.h>
+#  endif
+#endif
+
+inline void THROW(const NCursesException *e) {
+#if defined(__GNUG__) && defined(__EXCEPTIONS)
+#  if ((__GNUG__ <= 2) && (__GNUC_MINOR__ < 8))
+      (*lib_error_handler)(e ? e->classname() : "", e ? e->message : "");
+#  elif (__GNUG__ >= 7)
+     // g++ 7.0 warns about deprecation, but lacks the predefined symbols
+      ::endwin();
+      std::cerr << "Found a problem - goodbye" << std::endl;
+      exit(EXIT_FAILURE);
+#  else
+#    define CPP_HAS_TRY_CATCH 1
+#  endif
+#elif defined(__SUNPRO_CC)
+#  if !defined(__SUNPRO_CC_COMPAT) || (__SUNPRO_CC_COMPAT < 5)
+  genericerror(1, ((e != 0) ? (char *)(e->message) : ""));
+#  else
+#    define CPP_HAS_TRY_CATCH 1
+#  endif
+#else
+  if (e)
+    cerr << e->message << endl;
+  exit(0);
+#endif
+
+#ifndef CPP_HAS_TRY_CATCH
+#define CPP_HAS_TRY_CATCH 0
+#define NCURSES_CPP_TRY		/* nothing */
+#define NCURSES_CPP_CATCH(e)	if (false)
+#define THROWS(s)		/* nothing */
+#define THROW2(s,t)		/* nothing */
+#elif CPP_HAS_TRY_CATCH
+  throw *e;
+#define NCURSES_CPP_TRY		try
+#define NCURSES_CPP_CATCH(e)	catch(e)
+#if defined(__cpp_noexcept_function_type) && (__cpp_noexcept_function_type >= 201510)
+// C++17 deprecates the usage of throw().
+#define THROWS(s)		/* nothing */
+#define THROW2(s,t)		/* nothing */
+#else
+#define THROWS(s)		throw(s)
+#define THROW2(s,t)		throw(s,t)
+#endif
+#endif
+}
+
+#endif /* NCURSES_ETIP_H_incl */
diff --git a/c++/headers b/c++/headers
new file mode 100644
index 0000000..9a6a7f5
--- /dev/null
+++ b/c++/headers
@@ -0,0 +1,41 @@
+# C++ headers
+# $Id: headers,v 1.4 2020/02/02 23:34:34 tom Exp $
+##############################################################################
+# Copyright 2020 Thomas E. Dickey                                            #
+# Copyright 1998,2006 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey <dickey@clark.net> 1997
+#
+$(srcdir)/cursesapp.h
+$(srcdir)/cursesf.h
+$(srcdir)/cursesm.h
+$(srcdir)/cursesp.h
+$(srcdir)/cursesw.h
+$(srcdir)/cursslk.h
+etip.h
+# vile:makemode
diff --git a/c++/internal.h b/c++/internal.h
new file mode 100644
index 0000000..f67aaec
--- /dev/null
+++ b/c++/internal.h
@@ -0,0 +1,72 @@
+// * This makes emacs happy -*-Mode: C++;-*-
+/****************************************************************************
+ * Copyright 2018,2020 Thomas E. Dickey                                     *
+ * Copyright 1998-2008,2012 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author: Juergen Pfeifer, 1997                                          *
+ ****************************************************************************/
+
+// $Id: internal.h,v 1.22 2020/08/29 23:06:41 tom Exp $
+
+#ifndef NCURSES_CPLUS_INTERNAL_H
+#define NCURSES_CPLUS_INTERNAL_H 1
+
+#include <ncurses_cfg.h>
+
+#if USE_RCS_IDS
+#define MODULE_ID(id) static const char Ident[] = id;
+#else
+#define MODULE_ID(id)		/*nothing */
+#endif
+
+#if (defined(_WIN32) || defined(_WIN64))
+#if defined(EXP_WIN32_DRIVER)
+#include <nc_win32.h>
+#else
+#include <nc_mingw.h>
+#endif
+#undef KEY_EVENT
+#endif
+
+#ifndef _QNX_SOURCE
+#include <stdlib.h>
+#include <string.h>
+#endif
+
+#ifndef CTRL
+#define CTRL(x) ((x) & 0x1f)
+#endif
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+#include <nc_string.h>
+
+#endif /* NCURSES_CPLUS_INTERNAL_H */
diff --git a/c++/modules b/c++/modules
new file mode 100644
index 0000000..f82b487
--- /dev/null
+++ b/c++/modules
@@ -0,0 +1,45 @@
+# Program modules
+# $Id: modules,v 1.12 2020/02/02 23:34:34 tom Exp $
+##############################################################################
+# Copyright 2020 Thomas E. Dickey                                            #
+# Copyright 1998-2006,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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey	1995-on
+#
+
+@ base
+cursesf		c++		$(srcdir)	$(internal_h) $(cursesf_h) $(cursesapp_h)
+cursesm		c++		$(srcdir)	$(internal_h) $(cursesm_h) $(cursesapp_h)
+cursesw		c++		$(srcdir)	$(internal_h) $(cursesw_h)
+cursespad	c++		$(srcdir)	$(internal_h) $(cursesw_h)
+cursesp		c++		$(srcdir)	$(internal_h) $(cursesp_h)
+cursslk		c++		$(srcdir)	$(internal_h) $(cursesapp_h)
+cursesapp	c++		$(srcdir)	$(internal_h) $(cursesapp_h)
+cursesmain	c++		$(srcdir)	$(internal_h) $(cursesapp_h) $(INCDIR)/nc_alloc.h
+
+# vile:makemode
diff --git a/config.guess b/config.guess
new file mode 100755
index 0000000..a419d86
--- /dev/null
+++ b/config.guess
@@ -0,0 +1,1768 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright 1992-2022 Free Software Foundation, Inc.
+
+# shellcheck disable=SC2006,SC2268 # see below for rationale
+
+timestamp='2022-08-01'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <https://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that
+# program.  This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+#
+# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
+#
+# You can get the latest version of this script from:
+# https://git.savannah.gnu.org/cgit/config.git/plain/config.guess
+#
+# Please send patches to <config-patches@gnu.org>.
+
+
+# The "shellcheck disable" line above the timestamp inhibits complaints
+# about features and limitations of the classic Bourne shell that were
+# superseded or lifted in POSIX.  However, this script identifies a wide
+# variety of pre-POSIX systems that do not have POSIX shells at all, and
+# even some reasonably current systems (Solaris 10 as case-in-point) still
+# have a pre-POSIX /bin/sh.
+
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Options:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright 1992-2022 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+# Just in case it came from the environment.
+GUESS=
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+tmp=
+# shellcheck disable=SC2172
+trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15
+
+set_cc_for_build() {
+    # prevent multiple calls if $tmp is already set
+    test "$tmp" && return 0
+    : "${TMPDIR=/tmp}"
+    # shellcheck disable=SC2039,SC3028
+    { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+	{ test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } ||
+	{ tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+	{ echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; }
+    dummy=$tmp/dummy
+    case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in
+	,,)    echo "int x;" > "$dummy.c"
+	       for driver in cc gcc c89 c99 ; do
+		   if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then
+		       CC_FOR_BUILD=$driver
+		       break
+		   fi
+	       done
+	       if test x"$CC_FOR_BUILD" = x ; then
+		   CC_FOR_BUILD=no_compiler_found
+	       fi
+	       ;;
+	,,*)   CC_FOR_BUILD=$CC ;;
+	,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+    esac
+}
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if test -f /.attbin/uname ; then
+	PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+case $UNAME_SYSTEM in
+Linux|GNU|GNU/*)
+	LIBC=unknown
+
+	set_cc_for_build
+	cat <<-EOF > "$dummy.c"
+	#include <features.h>
+	#if defined(__UCLIBC__)
+	LIBC=uclibc
+	#elif defined(__dietlibc__)
+	LIBC=dietlibc
+	#elif defined(__GLIBC__)
+	LIBC=gnu
+	#else
+	#include <stdarg.h>
+	/* First heuristic to detect musl libc.  */
+	#ifdef __DEFINED_va_list
+	LIBC=musl
+	#endif
+	#endif
+	EOF
+	cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`
+	eval "$cc_set_libc"
+
+	# Second heuristic to detect musl libc.
+	if [ "$LIBC" = unknown ] &&
+	   command -v ldd >/dev/null &&
+	   ldd --version 2>&1 | grep -q ^musl; then
+		LIBC=musl
+	fi
+
+	# If the system lacks a compiler, then just pick glibc.
+	# We could probably try harder.
+	if [ "$LIBC" = unknown ]; then
+		LIBC=gnu
+	fi
+	;;
+esac
+
+# Note: order is significant - the case branches are not exclusive.
+
+case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in
+    *:NetBSD:*:*)
+	# NetBSD (nbsd) targets should (where applicable) match one or
+	# more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
+	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+	# switched to ELF, *-*-netbsd* would select the old
+	# object file format.  This provides both forward
+	# compatibility and a consistent mechanism for selecting the
+	# object file format.
+	#
+	# Note: NetBSD doesn't particularly care about the vendor
+	# portion of the name.  We always set it to "unknown".
+	UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \
+	    /sbin/sysctl -n hw.machine_arch 2>/dev/null || \
+	    /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \
+	    echo unknown)`
+	case $UNAME_MACHINE_ARCH in
+	    aarch64eb) machine=aarch64_be-unknown ;;
+	    armeb) machine=armeb-unknown ;;
+	    arm*) machine=arm-unknown ;;
+	    sh3el) machine=shl-unknown ;;
+	    sh3eb) machine=sh-unknown ;;
+	    sh5el) machine=sh5le-unknown ;;
+	    earmv*)
+		arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'`
+		endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'`
+		machine=${arch}${endian}-unknown
+		;;
+	    *) machine=$UNAME_MACHINE_ARCH-unknown ;;
+	esac
+	# The Operating System including object format, if it has switched
+	# to ELF recently (or will in the future) and ABI.
+	case $UNAME_MACHINE_ARCH in
+	    earm*)
+		os=netbsdelf
+		;;
+	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+		set_cc_for_build
+		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+			| grep -q __ELF__
+		then
+		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+		    # Return netbsd for either.  FIX?
+		    os=netbsd
+		else
+		    os=netbsdelf
+		fi
+		;;
+	    *)
+		os=netbsd
+		;;
+	esac
+	# Determine ABI tags.
+	case $UNAME_MACHINE_ARCH in
+	    earm*)
+		expr='s/^earmv[0-9]/-eabi/;s/eb$//'
+		abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"`
+		;;
+	esac
+	# The OS release
+	# Debian GNU/NetBSD machines have a different userland, and
+	# thus, need a distinct triplet. However, they do not need
+	# kernel version information, so it can be replaced with a
+	# suitable tag, in the style of linux-gnu.
+	case $UNAME_VERSION in
+	    Debian*)
+		release='-gnu'
+		;;
+	    *)
+		release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2`
+		;;
+	esac
+	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+	# contains redundant information, the shorter form:
+	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+	GUESS=$machine-${os}${release}${abi-}
+	;;
+    *:Bitrig:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
+	GUESS=$UNAME_MACHINE_ARCH-unknown-bitrig$UNAME_RELEASE
+	;;
+    *:OpenBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+	GUESS=$UNAME_MACHINE_ARCH-unknown-openbsd$UNAME_RELEASE
+	;;
+    *:SecBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/SecBSD.//'`
+	GUESS=$UNAME_MACHINE_ARCH-unknown-secbsd$UNAME_RELEASE
+	;;
+    *:LibertyBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'`
+	GUESS=$UNAME_MACHINE_ARCH-unknown-libertybsd$UNAME_RELEASE
+	;;
+    *:MidnightBSD:*:*)
+	GUESS=$UNAME_MACHINE-unknown-midnightbsd$UNAME_RELEASE
+	;;
+    *:ekkoBSD:*:*)
+	GUESS=$UNAME_MACHINE-unknown-ekkobsd$UNAME_RELEASE
+	;;
+    *:SolidBSD:*:*)
+	GUESS=$UNAME_MACHINE-unknown-solidbsd$UNAME_RELEASE
+	;;
+    *:OS108:*:*)
+	GUESS=$UNAME_MACHINE-unknown-os108_$UNAME_RELEASE
+	;;
+    macppc:MirBSD:*:*)
+	GUESS=powerpc-unknown-mirbsd$UNAME_RELEASE
+	;;
+    *:MirBSD:*:*)
+	GUESS=$UNAME_MACHINE-unknown-mirbsd$UNAME_RELEASE
+	;;
+    *:Sortix:*:*)
+	GUESS=$UNAME_MACHINE-unknown-sortix
+	;;
+    *:Twizzler:*:*)
+	GUESS=$UNAME_MACHINE-unknown-twizzler
+	;;
+    *:Redox:*:*)
+	GUESS=$UNAME_MACHINE-unknown-redox
+	;;
+    mips:OSF1:*.*)
+	GUESS=mips-dec-osf1
+	;;
+    alpha:OSF1:*:*)
+	# Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+	trap '' 0
+	case $UNAME_RELEASE in
+	*4.0)
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+		;;
+	*5.*)
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+		;;
+	esac
+	# According to Compaq, /usr/sbin/psrinfo has been available on
+	# OSF/1 and Tru64 systems produced since 1995.  I hope that
+	# covers most systems running today.  This code pipes the CPU
+	# types through head -n 1, so we only detect the type of CPU 0.
+	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+	case $ALPHA_CPU_TYPE in
+	    "EV4 (21064)")
+		UNAME_MACHINE=alpha ;;
+	    "EV4.5 (21064)")
+		UNAME_MACHINE=alpha ;;
+	    "LCA4 (21066/21068)")
+		UNAME_MACHINE=alpha ;;
+	    "EV5 (21164)")
+		UNAME_MACHINE=alphaev5 ;;
+	    "EV5.6 (21164A)")
+		UNAME_MACHINE=alphaev56 ;;
+	    "EV5.6 (21164PC)")
+		UNAME_MACHINE=alphapca56 ;;
+	    "EV5.7 (21164PC)")
+		UNAME_MACHINE=alphapca57 ;;
+	    "EV6 (21264)")
+		UNAME_MACHINE=alphaev6 ;;
+	    "EV6.7 (21264A)")
+		UNAME_MACHINE=alphaev67 ;;
+	    "EV6.8CB (21264C)")
+		UNAME_MACHINE=alphaev68 ;;
+	    "EV6.8AL (21264B)")
+		UNAME_MACHINE=alphaev68 ;;
+	    "EV6.8CX (21264D)")
+		UNAME_MACHINE=alphaev68 ;;
+	    "EV6.9A (21264/EV69A)")
+		UNAME_MACHINE=alphaev69 ;;
+	    "EV7 (21364)")
+		UNAME_MACHINE=alphaev7 ;;
+	    "EV7.9 (21364A)")
+		UNAME_MACHINE=alphaev79 ;;
+	esac
+	# A Pn.n version is a patched version.
+	# A Vn.n version is a released version.
+	# A Tn.n version is a released field test version.
+	# A Xn.n version is an unreleased experimental baselevel.
+	# 1.2 uses "1.2" for uname -r.
+	OSF_REL=`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
+	GUESS=$UNAME_MACHINE-dec-osf$OSF_REL
+	;;
+    Amiga*:UNIX_System_V:4.0:*)
+	GUESS=m68k-unknown-sysv4
+	;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+	GUESS=$UNAME_MACHINE-unknown-amigaos
+	;;
+    *:[Mm]orph[Oo][Ss]:*:*)
+	GUESS=$UNAME_MACHINE-unknown-morphos
+	;;
+    *:OS/390:*:*)
+	GUESS=i370-ibm-openedition
+	;;
+    *:z/VM:*:*)
+	GUESS=s390-ibm-zvmoe
+	;;
+    *:OS400:*:*)
+	GUESS=powerpc-ibm-os400
+	;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+	GUESS=arm-acorn-riscix$UNAME_RELEASE
+	;;
+    arm*:riscos:*:*|arm*:RISCOS:*:*)
+	GUESS=arm-unknown-riscos
+	;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+	GUESS=hppa1.1-hitachi-hiuxmpp
+	;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+	case `(/bin/universe) 2>/dev/null` in
+	    att) GUESS=pyramid-pyramid-sysv3 ;;
+	    *)   GUESS=pyramid-pyramid-bsd   ;;
+	esac
+	;;
+    NILE*:*:*:dcosx)
+	GUESS=pyramid-pyramid-svr4
+	;;
+    DRS?6000:unix:4.0:6*)
+	GUESS=sparc-icl-nx6
+	;;
+    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+	case `/usr/bin/uname -p` in
+	    sparc) GUESS=sparc-icl-nx7 ;;
+	esac
+	;;
+    s390x:SunOS:*:*)
+	SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+	GUESS=$UNAME_MACHINE-ibm-solaris2$SUN_REL
+	;;
+    sun4H:SunOS:5.*:*)
+	SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+	GUESS=sparc-hal-solaris2$SUN_REL
+	;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+	SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+	GUESS=sparc-sun-solaris2$SUN_REL
+	;;
+    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
+	GUESS=i386-pc-auroraux$UNAME_RELEASE
+	;;
+    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+	set_cc_for_build
+	SUN_ARCH=i386
+	# If there is a compiler, see if it is configured for 64-bit objects.
+	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+	# This test works for both compilers.
+	if test "$CC_FOR_BUILD" != no_compiler_found; then
+	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+		(CCOPTS="" $CC_FOR_BUILD -m64 -E - 2>/dev/null) | \
+		grep IS_64BIT_ARCH >/dev/null
+	    then
+		SUN_ARCH=x86_64
+	    fi
+	fi
+	SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+	GUESS=$SUN_ARCH-pc-solaris2$SUN_REL
+	;;
+    sun4*:SunOS:6*:*)
+	# According to config.sub, this is the proper way to canonicalize
+	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+	# it's likely to be more like Solaris than SunOS4.
+	SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+	GUESS=sparc-sun-solaris3$SUN_REL
+	;;
+    sun4*:SunOS:*:*)
+	case `/usr/bin/arch -k` in
+	    Series*|S4*)
+		UNAME_RELEASE=`uname -v`
+		;;
+	esac
+	# Japanese Language versions have a version number like `4.1.3-JL'.
+	SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'`
+	GUESS=sparc-sun-sunos$SUN_REL
+	;;
+    sun3*:SunOS:*:*)
+	GUESS=m68k-sun-sunos$UNAME_RELEASE
+	;;
+    sun*:*:4.2BSD:*)
+	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+	test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3
+	case `/bin/arch` in
+	    sun3)
+		GUESS=m68k-sun-sunos$UNAME_RELEASE
+		;;
+	    sun4)
+		GUESS=sparc-sun-sunos$UNAME_RELEASE
+		;;
+	esac
+	;;
+    aushp:SunOS:*:*)
+	GUESS=sparc-auspex-sunos$UNAME_RELEASE
+	;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+	GUESS=m68k-atari-mint$UNAME_RELEASE
+	;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+	GUESS=m68k-atari-mint$UNAME_RELEASE
+	;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+	GUESS=m68k-atari-mint$UNAME_RELEASE
+	;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+	GUESS=m68k-milan-mint$UNAME_RELEASE
+	;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+	GUESS=m68k-hades-mint$UNAME_RELEASE
+	;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+	GUESS=m68k-unknown-mint$UNAME_RELEASE
+	;;
+    m68k:machten:*:*)
+	GUESS=m68k-apple-machten$UNAME_RELEASE
+	;;
+    powerpc:machten:*:*)
+	GUESS=powerpc-apple-machten$UNAME_RELEASE
+	;;
+    RISC*:Mach:*:*)
+	GUESS=mips-dec-mach_bsd4.3
+	;;
+    RISC*:ULTRIX:*:*)
+	GUESS=mips-dec-ultrix$UNAME_RELEASE
+	;;
+    VAX*:ULTRIX*:*:*)
+	GUESS=vax-dec-ultrix$UNAME_RELEASE
+	;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+	GUESS=clipper-intergraph-clix$UNAME_RELEASE
+	;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+	set_cc_for_build
+	sed 's/^	//' << EOF > "$dummy.c"
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+	#if defined (host_mips) && defined (MIPSEB)
+	#if defined (SYSTYPE_SYSV)
+	  printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_SVR4)
+	  printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+	  printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0);
+	#endif
+	#endif
+	  exit (-1);
+	}
+EOF
+	$CC_FOR_BUILD -o "$dummy" "$dummy.c" &&
+	  dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+	  SYSTEM_NAME=`"$dummy" "$dummyarg"` &&
+	    { echo "$SYSTEM_NAME"; exit; }
+	GUESS=mips-mips-riscos$UNAME_RELEASE
+	;;
+    Motorola:PowerMAX_OS:*:*)
+	GUESS=powerpc-motorola-powermax
+	;;
+    Motorola:*:4.3:PL8-*)
+	GUESS=powerpc-harris-powermax
+	;;
+    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+	GUESS=powerpc-harris-powermax
+	;;
+    Night_Hawk:Power_UNIX:*:*)
+	GUESS=powerpc-harris-powerunix
+	;;
+    m88k:CX/UX:7*:*)
+	GUESS=m88k-harris-cxux7
+	;;
+    m88k:*:4*:R4*)
+	GUESS=m88k-motorola-sysv4
+	;;
+    m88k:*:3*:R3*)
+	GUESS=m88k-motorola-sysv3
+	;;
+    AViiON:dgux:*:*)
+	# DG/UX returns AViiON for all architectures
+	UNAME_PROCESSOR=`/usr/bin/uname -p`
+	if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110
+	then
+	    if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \
+	       test "$TARGET_BINARY_INTERFACE"x = x
+	    then
+		GUESS=m88k-dg-dgux$UNAME_RELEASE
+	    else
+		GUESS=m88k-dg-dguxbcs$UNAME_RELEASE
+	    fi
+	else
+	    GUESS=i586-dg-dgux$UNAME_RELEASE
+	fi
+	;;
+    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
+	GUESS=m88k-dolphin-sysv3
+	;;
+    M88*:*:R3*:*)
+	# Delta 88k system running SVR3
+	GUESS=m88k-motorola-sysv3
+	;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+	GUESS=m88k-tektronix-sysv3
+	;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+	GUESS=m68k-tektronix-bsd
+	;;
+    *:IRIX*:*:*)
+	IRIX_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/g'`
+	GUESS=mips-sgi-irix$IRIX_REL
+	;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+	GUESS=romp-ibm-aix    # uname -m gives an 8 hex-code CPU id
+	;;                    # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+	GUESS=i386-ibm-aix
+	;;
+    ia64:AIX:*:*)
+	if test -x /usr/bin/oslevel ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=$UNAME_VERSION.$UNAME_RELEASE
+	fi
+	GUESS=$UNAME_MACHINE-ibm-aix$IBM_REV
+	;;
+    *:AIX:2:3)
+	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+		set_cc_for_build
+		sed 's/^		//' << EOF > "$dummy.c"
+		#include <sys/systemcfg.h>
+
+		main()
+			{
+			if (!__power_pc())
+				exit(1);
+			puts("powerpc-ibm-aix3.2.5");
+			exit(0);
+			}
+EOF
+		if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"`
+		then
+			GUESS=$SYSTEM_NAME
+		else
+			GUESS=rs6000-ibm-aix3.2.5
+		fi
+	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+		GUESS=rs6000-ibm-aix3.2.4
+	else
+		GUESS=rs6000-ibm-aix3.2
+	fi
+	;;
+    *:AIX:*:[4567])
+	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+	if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then
+		IBM_ARCH=rs6000
+	else
+		IBM_ARCH=powerpc
+	fi
+	if test -x /usr/bin/lslpp ; then
+		IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | \
+			   awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`
+	else
+		IBM_REV=$UNAME_VERSION.$UNAME_RELEASE
+	fi
+	GUESS=$IBM_ARCH-ibm-aix$IBM_REV
+	;;
+    *:AIX:*:*)
+	GUESS=rs6000-ibm-aix
+	;;
+    ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*)
+	GUESS=romp-ibm-bsd4.4
+	;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+	GUESS=romp-ibm-bsd$UNAME_RELEASE    # 4.3 with uname added to
+	;;                                  # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+	GUESS=rs6000-bull-bosx
+	;;
+    DPX/2?00:B.O.S.:*:*)
+	GUESS=m68k-bull-sysv3
+	;;
+    9000/[34]??:4.3bsd:1.*:*)
+	GUESS=m68k-hp-bsd
+	;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+	GUESS=m68k-hp-bsd4.4
+	;;
+    9000/[34678]??:HP-UX:*:*)
+	HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'`
+	case $UNAME_MACHINE in
+	    9000/31?)            HP_ARCH=m68000 ;;
+	    9000/[34]??)         HP_ARCH=m68k ;;
+	    9000/[678][0-9][0-9])
+		if test -x /usr/bin/getconf; then
+		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+		    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+		    case $sc_cpu_version in
+		      523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0
+		      528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1
+		      532)                      # CPU_PA_RISC2_0
+			case $sc_kernel_bits in
+			  32) HP_ARCH=hppa2.0n ;;
+			  64) HP_ARCH=hppa2.0w ;;
+			  '') HP_ARCH=hppa2.0 ;;   # HP-UX 10.20
+			esac ;;
+		    esac
+		fi
+		if test "$HP_ARCH" = ""; then
+		    set_cc_for_build
+		    sed 's/^		//' << EOF > "$dummy.c"
+
+		#define _HPUX_SOURCE
+		#include <stdlib.h>
+		#include <unistd.h>
+
+		int main ()
+		{
+		#if defined(_SC_KERNEL_BITS)
+		    long bits = sysconf(_SC_KERNEL_BITS);
+		#endif
+		    long cpu  = sysconf (_SC_CPU_VERSION);
+
+		    switch (cpu)
+			{
+			case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+			case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+			case CPU_PA_RISC2_0:
+		#if defined(_SC_KERNEL_BITS)
+			    switch (bits)
+				{
+				case 64: puts ("hppa2.0w"); break;
+				case 32: puts ("hppa2.0n"); break;
+				default: puts ("hppa2.0"); break;
+				} break;
+		#else  /* !defined(_SC_KERNEL_BITS) */
+			    puts ("hppa2.0"); break;
+		#endif
+			default: puts ("hppa1.0"); break;
+			}
+		    exit (0);
+		}
+EOF
+		    (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"`
+		    test -z "$HP_ARCH" && HP_ARCH=hppa
+		fi ;;
+	esac
+	if test "$HP_ARCH" = hppa2.0w
+	then
+	    set_cc_for_build
+
+	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
+	    # generating 64-bit code.  GNU and HP use different nomenclature:
+	    #
+	    # $ CC_FOR_BUILD=cc ./config.guess
+	    # => hppa2.0w-hp-hpux11.23
+	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+	    # => hppa64-hp-hpux11.23
+
+	    if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) |
+		grep -q __LP64__
+	    then
+		HP_ARCH=hppa2.0w
+	    else
+		HP_ARCH=hppa64
+	    fi
+	fi
+	GUESS=$HP_ARCH-hp-hpux$HPUX_REV
+	;;
+    ia64:HP-UX:*:*)
+	HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'`
+	GUESS=ia64-hp-hpux$HPUX_REV
+	;;
+    3050*:HI-UX:*:*)
+	set_cc_for_build
+	sed 's/^	//' << EOF > "$dummy.c"
+	#include <unistd.h>
+	int
+	main ()
+	{
+	  long cpu = sysconf (_SC_CPU_VERSION);
+	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+	     results, however.  */
+	  if (CPU_IS_PA_RISC (cpu))
+	    {
+	      switch (cpu)
+		{
+		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+		  default: puts ("hppa-hitachi-hiuxwe2"); break;
+		}
+	    }
+	  else if (CPU_IS_HP_MC68K (cpu))
+	    puts ("m68k-hitachi-hiuxwe2");
+	  else puts ("unknown-hitachi-hiuxwe2");
+	  exit (0);
+	}
+EOF
+	$CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` &&
+		{ echo "$SYSTEM_NAME"; exit; }
+	GUESS=unknown-hitachi-hiuxwe2
+	;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*)
+	GUESS=hppa1.1-hp-bsd
+	;;
+    9000/8??:4.3bsd:*:*)
+	GUESS=hppa1.0-hp-bsd
+	;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+	GUESS=hppa1.0-hp-mpeix
+	;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*)
+	GUESS=hppa1.1-hp-osf
+	;;
+    hp8??:OSF1:*:*)
+	GUESS=hppa1.0-hp-osf
+	;;
+    i*86:OSF1:*:*)
+	if test -x /usr/sbin/sysversion ; then
+	    GUESS=$UNAME_MACHINE-unknown-osf1mk
+	else
+	    GUESS=$UNAME_MACHINE-unknown-osf1
+	fi
+	;;
+    parisc*:Lites*:*:*)
+	GUESS=hppa1.1-hp-lites
+	;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+	GUESS=c1-convex-bsd
+	;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+	GUESS=c34-convex-bsd
+	;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+	GUESS=c38-convex-bsd
+	;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+	GUESS=c4-convex-bsd
+	;;
+    CRAY*Y-MP:*:*:*)
+	CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+	GUESS=ymp-cray-unicos$CRAY_REL
+	;;
+    CRAY*[A-Z]90:*:*:*)
+	echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \
+	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+	      -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*TS:*:*:*)
+	CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+	GUESS=t90-cray-unicos$CRAY_REL
+	;;
+    CRAY*T3E:*:*:*)
+	CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+	GUESS=alphaev5-cray-unicosmk$CRAY_REL
+	;;
+    CRAY*SV1:*:*:*)
+	CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+	GUESS=sv1-cray-unicos$CRAY_REL
+	;;
+    *:UNICOS/mp:*:*)
+	CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+	GUESS=craynv-cray-unicosmp$CRAY_REL
+	;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+	FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
+	FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
+	FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'`
+	GUESS=${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}
+	;;
+    5000:UNIX_System_V:4.*:*)
+	FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
+	FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'`
+	GUESS=sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}
+	;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+	GUESS=$UNAME_MACHINE-pc-bsdi$UNAME_RELEASE
+	;;
+    sparc*:BSD/OS:*:*)
+	GUESS=sparc-unknown-bsdi$UNAME_RELEASE
+	;;
+    *:BSD/OS:*:*)
+	GUESS=$UNAME_MACHINE-unknown-bsdi$UNAME_RELEASE
+	;;
+    arm:FreeBSD:*:*)
+	UNAME_PROCESSOR=`uname -p`
+	set_cc_for_build
+	if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+	    | grep -q __ARM_PCS_VFP
+	then
+	    FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+	    GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabi
+	else
+	    FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+	    GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabihf
+	fi
+	;;
+    *:FreeBSD:*:*)
+	UNAME_PROCESSOR=`/usr/bin/uname -p`
+	case $UNAME_PROCESSOR in
+	    amd64)
+		UNAME_PROCESSOR=x86_64 ;;
+	    i386)
+		UNAME_PROCESSOR=i586 ;;
+	esac
+	FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+	GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL
+	;;
+    i*:CYGWIN*:*)
+	GUESS=$UNAME_MACHINE-pc-cygwin
+	;;
+    *:MINGW64*:*)
+	GUESS=$UNAME_MACHINE-pc-mingw64
+	;;
+    *:MINGW*:*)
+	GUESS=$UNAME_MACHINE-pc-mingw32
+	;;
+    *:MSYS*:*)
+	GUESS=$UNAME_MACHINE-pc-msys
+	;;
+    i*:PW*:*)
+	GUESS=$UNAME_MACHINE-pc-pw32
+	;;
+    *:SerenityOS:*:*)
+        GUESS=$UNAME_MACHINE-pc-serenity
+        ;;
+    *:Interix*:*)
+	case $UNAME_MACHINE in
+	    x86)
+		GUESS=i586-pc-interix$UNAME_RELEASE
+		;;
+	    authenticamd | genuineintel | EM64T)
+		GUESS=x86_64-unknown-interix$UNAME_RELEASE
+		;;
+	    IA64)
+		GUESS=ia64-unknown-interix$UNAME_RELEASE
+		;;
+	esac ;;
+    i*:UWIN*:*)
+	GUESS=$UNAME_MACHINE-pc-uwin
+	;;
+    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+	GUESS=x86_64-pc-cygwin
+	;;
+    prep*:SunOS:5.*:*)
+	SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+	GUESS=powerpcle-unknown-solaris2$SUN_REL
+	;;
+    *:GNU:*:*)
+	# the GNU system
+	GNU_ARCH=`echo "$UNAME_MACHINE" | sed -e 's,[-/].*$,,'`
+	GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's,/.*$,,'`
+	GUESS=$GNU_ARCH-unknown-$LIBC$GNU_REL
+	;;
+    *:GNU/*:*:*)
+	# other systems with GNU libc and userland
+	GNU_SYS=`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"`
+	GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+	GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC
+	;;
+    *:Minix:*:*)
+	GUESS=$UNAME_MACHINE-unknown-minix
+	;;
+    aarch64:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    aarch64_be:Linux:*:*)
+	UNAME_MACHINE=aarch64_be
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    alpha:Linux:*:*)
+	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in
+	  EV5)   UNAME_MACHINE=alphaev5 ;;
+	  EV56)  UNAME_MACHINE=alphaev56 ;;
+	  PCA56) UNAME_MACHINE=alphapca56 ;;
+	  PCA57) UNAME_MACHINE=alphapca56 ;;
+	  EV6)   UNAME_MACHINE=alphaev6 ;;
+	  EV67)  UNAME_MACHINE=alphaev67 ;;
+	  EV68*) UNAME_MACHINE=alphaev68 ;;
+	esac
+	objdump --private-headers /bin/sh | grep -q ld.so.1
+	if test "$?" = 0 ; then LIBC=gnulibc1 ; fi
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    arc:Linux:*:* | arceb:Linux:*:* | arc32:Linux:*:* | arc64:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    arm*:Linux:*:*)
+	set_cc_for_build
+	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+	    | grep -q __ARM_EABI__
+	then
+	    GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	else
+	    if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+		| grep -q __ARM_PCS_VFP
+	    then
+		GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabi
+	    else
+		GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabihf
+	    fi
+	fi
+	;;
+    avr32*:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    cris:Linux:*:*)
+	GUESS=$UNAME_MACHINE-axis-linux-$LIBC
+	;;
+    crisv32:Linux:*:*)
+	GUESS=$UNAME_MACHINE-axis-linux-$LIBC
+	;;
+    e2k:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    frv:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    hexagon:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    i*86:Linux:*:*)
+	GUESS=$UNAME_MACHINE-pc-linux-$LIBC
+	;;
+    ia64:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    k1om:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    loongarch32:Linux:*:* | loongarch64:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    m32r*:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    m68*:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    mips:Linux:*:* | mips64:Linux:*:*)
+	set_cc_for_build
+	IS_GLIBC=0
+	test x"${LIBC}" = xgnu && IS_GLIBC=1
+	sed 's/^	//' << EOF > "$dummy.c"
+	#undef CPU
+	#undef mips
+	#undef mipsel
+	#undef mips64
+	#undef mips64el
+	#if ${IS_GLIBC} && defined(_ABI64)
+	LIBCABI=gnuabi64
+	#else
+	#if ${IS_GLIBC} && defined(_ABIN32)
+	LIBCABI=gnuabin32
+	#else
+	LIBCABI=${LIBC}
+	#endif
+	#endif
+
+	#if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6
+	CPU=mipsisa64r6
+	#else
+	#if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6
+	CPU=mipsisa32r6
+	#else
+	#if defined(__mips64)
+	CPU=mips64
+	#else
+	CPU=mips
+	#endif
+	#endif
+	#endif
+
+	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+	MIPS_ENDIAN=el
+	#else
+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+	MIPS_ENDIAN=
+	#else
+	MIPS_ENDIAN=
+	#endif
+	#endif
+EOF
+	cc_set_vars=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'`
+	eval "$cc_set_vars"
+	test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; }
+	;;
+    mips64el:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    openrisc*:Linux:*:*)
+	GUESS=or1k-unknown-linux-$LIBC
+	;;
+    or32:Linux:*:* | or1k*:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    padre:Linux:*:*)
+	GUESS=sparc-unknown-linux-$LIBC
+	;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+	GUESS=hppa64-unknown-linux-$LIBC
+	;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+	# Look for CPU level
+	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+	  PA7*) GUESS=hppa1.1-unknown-linux-$LIBC ;;
+	  PA8*) GUESS=hppa2.0-unknown-linux-$LIBC ;;
+	  *)    GUESS=hppa-unknown-linux-$LIBC ;;
+	esac
+	;;
+    ppc64:Linux:*:*)
+	GUESS=powerpc64-unknown-linux-$LIBC
+	;;
+    ppc:Linux:*:*)
+	GUESS=powerpc-unknown-linux-$LIBC
+	;;
+    ppc64le:Linux:*:*)
+	GUESS=powerpc64le-unknown-linux-$LIBC
+	;;
+    ppcle:Linux:*:*)
+	GUESS=powerpcle-unknown-linux-$LIBC
+	;;
+    riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+	GUESS=$UNAME_MACHINE-ibm-linux-$LIBC
+	;;
+    sh64*:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    sh*:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    tile*:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    vax:Linux:*:*)
+	GUESS=$UNAME_MACHINE-dec-linux-$LIBC
+	;;
+    x86_64:Linux:*:*)
+	set_cc_for_build
+	CPU=$UNAME_MACHINE
+	LIBCABI=$LIBC
+	if test "$CC_FOR_BUILD" != no_compiler_found; then
+	    ABI=64
+	    sed 's/^	    //' << EOF > "$dummy.c"
+	    #ifdef __i386__
+	    ABI=x86
+	    #else
+	    #ifdef __ILP32__
+	    ABI=x32
+	    #endif
+	    #endif
+EOF
+	    cc_set_abi=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^ABI' | sed 's, ,,g'`
+	    eval "$cc_set_abi"
+	    case $ABI in
+		x86) CPU=i686 ;;
+		x32) LIBCABI=${LIBC}x32 ;;
+	    esac
+	fi
+	GUESS=$CPU-pc-linux-$LIBCABI
+	;;
+    xtensa*:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    i*86:DYNIX/ptx:4*:*)
+	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+	# earlier versions are messed up and put the nodename in both
+	# sysname and nodename.
+	GUESS=i386-sequent-sysv4
+	;;
+    i*86:UNIX_SV:4.2MP:2.*)
+	# Unixware is an offshoot of SVR4, but it has its own version
+	# number series starting with 2...
+	# I am not positive that other SVR4 systems won't match this,
+	# I just have to hope.  -- rms.
+	# Use sysv4.2uw... so that sysv4* matches it.
+	GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION
+	;;
+    i*86:OS/2:*:*)
+	# If we were able to find `uname', then EMX Unix compatibility
+	# is probably installed.
+	GUESS=$UNAME_MACHINE-pc-os2-emx
+	;;
+    i*86:XTS-300:*:STOP)
+	GUESS=$UNAME_MACHINE-unknown-stop
+	;;
+    i*86:atheos:*:*)
+	GUESS=$UNAME_MACHINE-unknown-atheos
+	;;
+    i*86:syllable:*:*)
+	GUESS=$UNAME_MACHINE-pc-syllable
+	;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
+	GUESS=i386-unknown-lynxos$UNAME_RELEASE
+	;;
+    i*86:*DOS:*:*)
+	GUESS=$UNAME_MACHINE-pc-msdosdjgpp
+	;;
+    i*86:*:4.*:*)
+	UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'`
+	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+		GUESS=$UNAME_MACHINE-univel-sysv$UNAME_REL
+	else
+		GUESS=$UNAME_MACHINE-pc-sysv$UNAME_REL
+	fi
+	;;
+    i*86:*:5:[678]*)
+	# UnixWare 7.x, OpenUNIX and OpenServer 6.
+	case `/bin/uname -X | grep "^Machine"` in
+	    *486*)	     UNAME_MACHINE=i486 ;;
+	    *Pentium)	     UNAME_MACHINE=i586 ;;
+	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+	esac
+	GUESS=$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+	;;
+    i*86:*:3.2:*)
+	if test -f /usr/options/cb.name; then
+		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+		GUESS=$UNAME_MACHINE-pc-isc$UNAME_REL
+	elif /bin/uname -X 2>/dev/null >/dev/null ; then
+		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+			&& UNAME_MACHINE=i586
+		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		GUESS=$UNAME_MACHINE-pc-sco$UNAME_REL
+	else
+		GUESS=$UNAME_MACHINE-pc-sysv32
+	fi
+	;;
+    pc:*:*:*)
+	# Left here for compatibility:
+	# uname -m prints for DJGPP always 'pc', but it prints nothing about
+	# the processor, so we play safe by assuming i586.
+	# Note: whatever this is, it MUST be the same as what config.sub
+	# prints for the "djgpp" host, or else GDB configure will decide that
+	# this is a cross-build.
+	GUESS=i586-pc-msdosdjgpp
+	;;
+    Intel:Mach:3*:*)
+	GUESS=i386-pc-mach3
+	;;
+    paragon:*:*:*)
+	GUESS=i860-intel-osf1
+	;;
+    i860:*:4.*:*) # i860-SVR4
+	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+	  GUESS=i860-stardent-sysv$UNAME_RELEASE    # Stardent Vistra i860-SVR4
+	else # Add other i860-SVR4 vendors below as they are discovered.
+	  GUESS=i860-unknown-sysv$UNAME_RELEASE     # Unknown i860-SVR4
+	fi
+	;;
+    mini*:CTIX:SYS*5:*)
+	# "miniframe"
+	GUESS=m68010-convergent-sysv
+	;;
+    mc68k:UNIX:SYSTEM5:3.51m)
+	GUESS=m68k-convergent-sysv
+	;;
+    M680?0:D-NIX:5.3:*)
+	GUESS=m68k-diab-dnix
+	;;
+    M68*:*:R3V[5678]*:*)
+	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+	OS_REL=''
+	test -r /etc/.relid \
+	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4.3"$OS_REL"; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	  && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4; exit; } ;;
+    NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+	OS_REL='.3'
+	test -r /etc/.relid \
+	    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	    && { echo i486-ncr-sysv4.3"$OS_REL"; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	    && { echo i586-ncr-sysv4.3"$OS_REL"; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+	    && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+	GUESS=m68k-unknown-lynxos$UNAME_RELEASE
+	;;
+    mc68030:UNIX_System_V:4.*:*)
+	GUESS=m68k-atari-sysv4
+	;;
+    TSUNAMI:LynxOS:2.*:*)
+	GUESS=sparc-unknown-lynxos$UNAME_RELEASE
+	;;
+    rs6000:LynxOS:2.*:*)
+	GUESS=rs6000-unknown-lynxos$UNAME_RELEASE
+	;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
+	GUESS=powerpc-unknown-lynxos$UNAME_RELEASE
+	;;
+    SM[BE]S:UNIX_SV:*:*)
+	GUESS=mips-dde-sysv$UNAME_RELEASE
+	;;
+    RM*:ReliantUNIX-*:*:*)
+	GUESS=mips-sni-sysv4
+	;;
+    RM*:SINIX-*:*:*)
+	GUESS=mips-sni-sysv4
+	;;
+    *:SINIX-*:*:*)
+	if uname -p 2>/dev/null >/dev/null ; then
+		UNAME_MACHINE=`(uname -p) 2>/dev/null`
+		GUESS=$UNAME_MACHINE-sni-sysv4
+	else
+		GUESS=ns32k-sni-sysv
+	fi
+	;;
+    PENTIUM:*:4.0*:*)	# Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+			# says <Richard.M.Bartel@ccMail.Census.GOV>
+	GUESS=i586-unisys-sysv4
+	;;
+    *:UNIX_System_V:4*:FTX*)
+	# From Gerald Hewes <hewes@openmarket.com>.
+	# How about differentiating between stratus architectures? -djm
+	GUESS=hppa1.1-stratus-sysv4
+	;;
+    *:*:*:FTX*)
+	# From seanf@swdc.stratus.com.
+	GUESS=i860-stratus-sysv4
+	;;
+    i*86:VOS:*:*)
+	# From Paul.Green@stratus.com.
+	GUESS=$UNAME_MACHINE-stratus-vos
+	;;
+    *:VOS:*:*)
+	# From Paul.Green@stratus.com.
+	GUESS=hppa1.1-stratus-vos
+	;;
+    mc68*:A/UX:*:*)
+	GUESS=m68k-apple-aux$UNAME_RELEASE
+	;;
+    news*:NEWS-OS:6*:*)
+	GUESS=mips-sony-newsos6
+	;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+	if test -d /usr/nec; then
+		GUESS=mips-nec-sysv$UNAME_RELEASE
+	else
+		GUESS=mips-unknown-sysv$UNAME_RELEASE
+	fi
+	;;
+    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
+	GUESS=powerpc-be-beos
+	;;
+    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
+	GUESS=powerpc-apple-beos
+	;;
+    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
+	GUESS=i586-pc-beos
+	;;
+    BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
+	GUESS=i586-pc-haiku
+	;;
+    ppc:Haiku:*:*)	# Haiku running on Apple PowerPC
+	GUESS=powerpc-apple-haiku
+	;;
+    *:Haiku:*:*)	# Haiku modern gcc (not bound by BeOS compat)
+	GUESS=$UNAME_MACHINE-unknown-haiku
+	;;
+    SX-4:SUPER-UX:*:*)
+	GUESS=sx4-nec-superux$UNAME_RELEASE
+	;;
+    SX-5:SUPER-UX:*:*)
+	GUESS=sx5-nec-superux$UNAME_RELEASE
+	;;
+    SX-6:SUPER-UX:*:*)
+	GUESS=sx6-nec-superux$UNAME_RELEASE
+	;;
+    SX-7:SUPER-UX:*:*)
+	GUESS=sx7-nec-superux$UNAME_RELEASE
+	;;
+    SX-8:SUPER-UX:*:*)
+	GUESS=sx8-nec-superux$UNAME_RELEASE
+	;;
+    SX-8R:SUPER-UX:*:*)
+	GUESS=sx8r-nec-superux$UNAME_RELEASE
+	;;
+    SX-ACE:SUPER-UX:*:*)
+	GUESS=sxace-nec-superux$UNAME_RELEASE
+	;;
+    Power*:Rhapsody:*:*)
+	GUESS=powerpc-apple-rhapsody$UNAME_RELEASE
+	;;
+    *:Rhapsody:*:*)
+	GUESS=$UNAME_MACHINE-apple-rhapsody$UNAME_RELEASE
+	;;
+    arm64:Darwin:*:*)
+	GUESS=aarch64-apple-darwin$UNAME_RELEASE
+	;;
+    *:Darwin:*:*)
+	UNAME_PROCESSOR=`uname -p`
+	case $UNAME_PROCESSOR in
+	    unknown) UNAME_PROCESSOR=powerpc ;;
+	esac
+	if command -v xcode-select > /dev/null 2> /dev/null && \
+		! xcode-select --print-path > /dev/null 2> /dev/null ; then
+	    # Avoid executing cc if there is no toolchain installed as
+	    # cc will be a stub that puts up a graphical alert
+	    # prompting the user to install developer tools.
+	    CC_FOR_BUILD=no_compiler_found
+	else
+	    set_cc_for_build
+	fi
+	if test "$CC_FOR_BUILD" != no_compiler_found; then
+	    if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+		   (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+		   grep IS_64BIT_ARCH >/dev/null
+	    then
+		case $UNAME_PROCESSOR in
+		    i386) UNAME_PROCESSOR=x86_64 ;;
+		    powerpc) UNAME_PROCESSOR=powerpc64 ;;
+		esac
+	    fi
+	    # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc
+	    if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \
+		   (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+		   grep IS_PPC >/dev/null
+	    then
+		UNAME_PROCESSOR=powerpc
+	    fi
+	elif test "$UNAME_PROCESSOR" = i386 ; then
+	    # uname -m returns i386 or x86_64
+	    UNAME_PROCESSOR=$UNAME_MACHINE
+	fi
+	GUESS=$UNAME_PROCESSOR-apple-darwin$UNAME_RELEASE
+	;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+	UNAME_PROCESSOR=`uname -p`
+	if test "$UNAME_PROCESSOR" = x86; then
+		UNAME_PROCESSOR=i386
+		UNAME_MACHINE=pc
+	fi
+	GUESS=$UNAME_PROCESSOR-$UNAME_MACHINE-nto-qnx$UNAME_RELEASE
+	;;
+    *:QNX:*:4*)
+	GUESS=i386-pc-qnx
+	;;
+    NEO-*:NONSTOP_KERNEL:*:*)
+	GUESS=neo-tandem-nsk$UNAME_RELEASE
+	;;
+    NSE-*:NONSTOP_KERNEL:*:*)
+	GUESS=nse-tandem-nsk$UNAME_RELEASE
+	;;
+    NSR-*:NONSTOP_KERNEL:*:*)
+	GUESS=nsr-tandem-nsk$UNAME_RELEASE
+	;;
+    NSV-*:NONSTOP_KERNEL:*:*)
+	GUESS=nsv-tandem-nsk$UNAME_RELEASE
+	;;
+    NSX-*:NONSTOP_KERNEL:*:*)
+	GUESS=nsx-tandem-nsk$UNAME_RELEASE
+	;;
+    *:NonStop-UX:*:*)
+	GUESS=mips-compaq-nonstopux
+	;;
+    BS2000:POSIX*:*:*)
+	GUESS=bs2000-siemens-sysv
+	;;
+    DS/*:UNIX_System_V:*:*)
+	GUESS=$UNAME_MACHINE-$UNAME_SYSTEM-$UNAME_RELEASE
+	;;
+    *:Plan9:*:*)
+	# "uname -m" is not consistent, so use $cputype instead. 386
+	# is converted to i386 for consistency with other x86
+	# operating systems.
+	if test "${cputype-}" = 386; then
+	    UNAME_MACHINE=i386
+	elif test "x${cputype-}" != x; then
+	    UNAME_MACHINE=$cputype
+	fi
+	GUESS=$UNAME_MACHINE-unknown-plan9
+	;;
+    *:TOPS-10:*:*)
+	GUESS=pdp10-unknown-tops10
+	;;
+    *:TENEX:*:*)
+	GUESS=pdp10-unknown-tenex
+	;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+	GUESS=pdp10-dec-tops20
+	;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+	GUESS=pdp10-xkl-tops20
+	;;
+    *:TOPS-20:*:*)
+	GUESS=pdp10-unknown-tops20
+	;;
+    *:ITS:*:*)
+	GUESS=pdp10-unknown-its
+	;;
+    SEI:*:*:SEIUX)
+	GUESS=mips-sei-seiux$UNAME_RELEASE
+	;;
+    *:DragonFly:*:*)
+	DRAGONFLY_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+	GUESS=$UNAME_MACHINE-unknown-dragonfly$DRAGONFLY_REL
+	;;
+    *:*VMS:*:*)
+	UNAME_MACHINE=`(uname -p) 2>/dev/null`
+	case $UNAME_MACHINE in
+	    A*) GUESS=alpha-dec-vms ;;
+	    I*) GUESS=ia64-dec-vms ;;
+	    V*) GUESS=vax-dec-vms ;;
+	esac ;;
+    *:XENIX:*:SysV)
+	GUESS=i386-pc-xenix
+	;;
+    i*86:skyos:*:*)
+	SKYOS_REL=`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`
+	GUESS=$UNAME_MACHINE-pc-skyos$SKYOS_REL
+	;;
+    i*86:rdos:*:*)
+	GUESS=$UNAME_MACHINE-pc-rdos
+	;;
+    i*86:Fiwix:*:*)
+	GUESS=$UNAME_MACHINE-pc-fiwix
+	;;
+    *:AROS:*:*)
+	GUESS=$UNAME_MACHINE-unknown-aros
+	;;
+    x86_64:VMkernel:*:*)
+	GUESS=$UNAME_MACHINE-unknown-esx
+	;;
+    amd64:Isilon\ OneFS:*:*)
+	GUESS=x86_64-unknown-onefs
+	;;
+    *:Unleashed:*:*)
+	GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE
+	;;
+esac
+
+# Do we have a guess based on uname results?
+if test "x$GUESS" != x; then
+    echo "$GUESS"
+    exit
+fi
+
+# No uname command or uname output not recognized.
+set_cc_for_build
+cat > "$dummy.c" <<EOF
+#ifdef _SEQUENT_
+#include <sys/types.h>
+#include <sys/utsname.h>
+#endif
+#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)
+#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)
+#include <signal.h>
+#if defined(_SIZE_T_) || defined(SIGLOST)
+#include <sys/utsname.h>
+#endif
+#endif
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+  "4"
+#else
+  ""
+#endif
+  ); exit (0);
+#endif
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+  struct utsname un;
+
+  uname(&un);
+  if (strncmp(un.version, "V2", 2) == 0) {
+    printf ("i386-sequent-ptx2\n"); exit (0);
+  }
+  if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+    printf ("i386-sequent-ptx1\n"); exit (0);
+  }
+  printf ("i386-sequent-ptx\n"); exit (0);
+#endif
+
+#if defined (vax)
+#if !defined (ultrix)
+#include <sys/param.h>
+#if defined (BSD)
+#if BSD == 43
+  printf ("vax-dec-bsd4.3\n"); exit (0);
+#else
+#if BSD == 199006
+  printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#else
+  printf ("vax-dec-bsd\n"); exit (0);
+#endif
+#endif
+#else
+  printf ("vax-dec-bsd\n"); exit (0);
+#endif
+#else
+#if defined(_SIZE_T_) || defined(SIGLOST)
+  struct utsname un;
+  uname (&un);
+  printf ("vax-dec-ultrix%s\n", un.release); exit (0);
+#else
+  printf ("vax-dec-ultrix\n"); exit (0);
+#endif
+#endif
+#endif
+#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)
+#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)
+#if defined(_SIZE_T_) || defined(SIGLOST)
+  struct utsname *un;
+  uname (&un);
+  printf ("mips-dec-ultrix%s\n", un.release); exit (0);
+#else
+  printf ("mips-dec-ultrix\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`"$dummy"` &&
+	{ echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; }
+
+echo "$0: unable to guess system type" >&2
+
+case $UNAME_MACHINE:$UNAME_SYSTEM in
+    mips:Linux | mips64:Linux)
+	# If we got here on MIPS GNU/Linux, output extra information.
+	cat >&2 <<EOF
+
+NOTE: MIPS GNU/Linux systems require a C compiler to fully recognize
+the system type. Please install a C compiler and try again.
+EOF
+	;;
+esac
+
+cat >&2 <<EOF
+
+This script (version $timestamp), has failed to recognize the
+operating system you are using. If your script is old, overwrite *all*
+copies of config.guess and config.sub with the latest versions from:
+
+  https://git.savannah.gnu.org/cgit/config.git/plain/config.guess
+and
+  https://git.savannah.gnu.org/cgit/config.git/plain/config.sub
+EOF
+
+our_year=`echo $timestamp | sed 's,-.*,,'`
+thisyear=`date +%Y`
+# shellcheck disable=SC2003
+script_age=`expr "$thisyear" - "$our_year"`
+if test "$script_age" -lt 3 ; then
+   cat >&2 <<EOF
+
+If $0 has already been updated, send the following data and any
+information you think might be pertinent to config-patches@gnu.org to
+provide the necessary information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = "$UNAME_MACHINE"
+UNAME_RELEASE = "$UNAME_RELEASE"
+UNAME_SYSTEM  = "$UNAME_SYSTEM"
+UNAME_VERSION = "$UNAME_VERSION"
+EOF
+fi
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/config.sub b/config.sub
new file mode 100755
index 0000000..fbaa37f
--- /dev/null
+++ b/config.sub
@@ -0,0 +1,1890 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright 1992-2022 Free Software Foundation, Inc.
+
+# shellcheck disable=SC2006,SC2268 # see below for rationale
+
+timestamp='2022-08-01'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <https://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that
+# program.  This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+
+
+# Please send patches to <config-patches@gnu.org>.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# You can get the latest version of this script from:
+# https://git.savannah.gnu.org/cgit/config.git/plain/config.sub
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+# The "shellcheck disable" line above the timestamp inhibits complaints
+# about features and limitations of the classic Bourne shell that were
+# superseded or lifted in POSIX.  However, this script identifies a wide
+# variety of pre-POSIX systems that do not have POSIX shells at all, and
+# even some reasonably current systems (Solaris 10 as case-in-point) still
+# have a pre-POSIX /bin/sh.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS
+
+Canonicalize a configuration name.
+
+Options:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright 1992-2022 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo "$1"
+       exit ;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Split fields of configuration type
+# shellcheck disable=SC2162
+saved_IFS=$IFS
+IFS="-" read field1 field2 field3 field4 <<EOF
+$1
+EOF
+IFS=$saved_IFS
+
+# Separate into logical components for further validation
+case $1 in
+	*-*-*-*-*)
+		echo Invalid configuration \`"$1"\': more than four components >&2
+		exit 1
+		;;
+	*-*-*-*)
+		basic_machine=$field1-$field2
+		basic_os=$field3-$field4
+		;;
+	*-*-*)
+		# Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two
+		# parts
+		maybe_os=$field2-$field3
+		case $maybe_os in
+			nto-qnx* | linux-* | uclinux-uclibc* \
+			| uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \
+			| netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \
+			| storm-chaos* | os2-emx* | rtmk-nova*)
+				basic_machine=$field1
+				basic_os=$maybe_os
+				;;
+			android-linux)
+				basic_machine=$field1-unknown
+				basic_os=linux-android
+				;;
+			*)
+				basic_machine=$field1-$field2
+				basic_os=$field3
+				;;
+		esac
+		;;
+	*-*)
+		# A lone config we happen to match not fitting any pattern
+		case $field1-$field2 in
+			decstation-3100)
+				basic_machine=mips-dec
+				basic_os=
+				;;
+			*-*)
+				# Second component is usually, but not always the OS
+				case $field2 in
+					# Prevent following clause from handling this valid os
+					sun*os*)
+						basic_machine=$field1
+						basic_os=$field2
+						;;
+					zephyr*)
+						basic_machine=$field1-unknown
+						basic_os=$field2
+						;;
+					# Manufacturers
+					dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \
+					| att* | 7300* | 3300* | delta* | motorola* | sun[234]* \
+					| unicom* | ibm* | next | hp | isi* | apollo | altos* \
+					| convergent* | ncr* | news | 32* | 3600* | 3100* \
+					| hitachi* | c[123]* | convex* | sun | crds | omron* | dg \
+					| ultra | tti* | harris | dolphin | highlevel | gould \
+					| cbm | ns | masscomp | apple | axis | knuth | cray \
+					| microblaze* | sim | cisco \
+					| oki | wec | wrs | winbond)
+						basic_machine=$field1-$field2
+						basic_os=
+						;;
+					*)
+						basic_machine=$field1
+						basic_os=$field2
+						;;
+				esac
+			;;
+		esac
+		;;
+	*)
+		# Convert single-component short-hands not valid as part of
+		# multi-component configurations.
+		case $field1 in
+			386bsd)
+				basic_machine=i386-pc
+				basic_os=bsd
+				;;
+			a29khif)
+				basic_machine=a29k-amd
+				basic_os=udi
+				;;
+			adobe68k)
+				basic_machine=m68010-adobe
+				basic_os=scout
+				;;
+			alliant)
+				basic_machine=fx80-alliant
+				basic_os=
+				;;
+			altos | altos3068)
+				basic_machine=m68k-altos
+				basic_os=
+				;;
+			am29k)
+				basic_machine=a29k-none
+				basic_os=bsd
+				;;
+			amdahl)
+				basic_machine=580-amdahl
+				basic_os=sysv
+				;;
+			amiga)
+				basic_machine=m68k-unknown
+				basic_os=
+				;;
+			amigaos | amigados)
+				basic_machine=m68k-unknown
+				basic_os=amigaos
+				;;
+			amigaunix | amix)
+				basic_machine=m68k-unknown
+				basic_os=sysv4
+				;;
+			apollo68)
+				basic_machine=m68k-apollo
+				basic_os=sysv
+				;;
+			apollo68bsd)
+				basic_machine=m68k-apollo
+				basic_os=bsd
+				;;
+			aros)
+				basic_machine=i386-pc
+				basic_os=aros
+				;;
+			aux)
+				basic_machine=m68k-apple
+				basic_os=aux
+				;;
+			balance)
+				basic_machine=ns32k-sequent
+				basic_os=dynix
+				;;
+			blackfin)
+				basic_machine=bfin-unknown
+				basic_os=linux
+				;;
+			cegcc)
+				basic_machine=arm-unknown
+				basic_os=cegcc
+				;;
+			convex-c1)
+				basic_machine=c1-convex
+				basic_os=bsd
+				;;
+			convex-c2)
+				basic_machine=c2-convex
+				basic_os=bsd
+				;;
+			convex-c32)
+				basic_machine=c32-convex
+				basic_os=bsd
+				;;
+			convex-c34)
+				basic_machine=c34-convex
+				basic_os=bsd
+				;;
+			convex-c38)
+				basic_machine=c38-convex
+				basic_os=bsd
+				;;
+			cray)
+				basic_machine=j90-cray
+				basic_os=unicos
+				;;
+			crds | unos)
+				basic_machine=m68k-crds
+				basic_os=
+				;;
+			da30)
+				basic_machine=m68k-da30
+				basic_os=
+				;;
+			decstation | pmax | pmin | dec3100 | decstatn)
+				basic_machine=mips-dec
+				basic_os=
+				;;
+			delta88)
+				basic_machine=m88k-motorola
+				basic_os=sysv3
+				;;
+			dicos)
+				basic_machine=i686-pc
+				basic_os=dicos
+				;;
+			djgpp)
+				basic_machine=i586-pc
+				basic_os=msdosdjgpp
+				;;
+			ebmon29k)
+				basic_machine=a29k-amd
+				basic_os=ebmon
+				;;
+			es1800 | OSE68k | ose68k | ose | OSE)
+				basic_machine=m68k-ericsson
+				basic_os=ose
+				;;
+			gmicro)
+				basic_machine=tron-gmicro
+				basic_os=sysv
+				;;
+			go32)
+				basic_machine=i386-pc
+				basic_os=go32
+				;;
+			h8300hms)
+				basic_machine=h8300-hitachi
+				basic_os=hms
+				;;
+			h8300xray)
+				basic_machine=h8300-hitachi
+				basic_os=xray
+				;;
+			h8500hms)
+				basic_machine=h8500-hitachi
+				basic_os=hms
+				;;
+			harris)
+				basic_machine=m88k-harris
+				basic_os=sysv3
+				;;
+			hp300 | hp300hpux)
+				basic_machine=m68k-hp
+				basic_os=hpux
+				;;
+			hp300bsd)
+				basic_machine=m68k-hp
+				basic_os=bsd
+				;;
+			hppaosf)
+				basic_machine=hppa1.1-hp
+				basic_os=osf
+				;;
+			hppro)
+				basic_machine=hppa1.1-hp
+				basic_os=proelf
+				;;
+			i386mach)
+				basic_machine=i386-mach
+				basic_os=mach
+				;;
+			isi68 | isi)
+				basic_machine=m68k-isi
+				basic_os=sysv
+				;;
+			m68knommu)
+				basic_machine=m68k-unknown
+				basic_os=linux
+				;;
+			magnum | m3230)
+				basic_machine=mips-mips
+				basic_os=sysv
+				;;
+			merlin)
+				basic_machine=ns32k-utek
+				basic_os=sysv
+				;;
+			mingw64)
+				basic_machine=x86_64-pc
+				basic_os=mingw64
+				;;
+			mingw32)
+				basic_machine=i686-pc
+				basic_os=mingw32
+				;;
+			mingw32ce)
+				basic_machine=arm-unknown
+				basic_os=mingw32ce
+				;;
+			monitor)
+				basic_machine=m68k-rom68k
+				basic_os=coff
+				;;
+			morphos)
+				basic_machine=powerpc-unknown
+				basic_os=morphos
+				;;
+			moxiebox)
+				basic_machine=moxie-unknown
+				basic_os=moxiebox
+				;;
+			msdos)
+				basic_machine=i386-pc
+				basic_os=msdos
+				;;
+			msys)
+				basic_machine=i686-pc
+				basic_os=msys
+				;;
+			mvs)
+				basic_machine=i370-ibm
+				basic_os=mvs
+				;;
+			nacl)
+				basic_machine=le32-unknown
+				basic_os=nacl
+				;;
+			ncr3000)
+				basic_machine=i486-ncr
+				basic_os=sysv4
+				;;
+			netbsd386)
+				basic_machine=i386-pc
+				basic_os=netbsd
+				;;
+			netwinder)
+				basic_machine=armv4l-rebel
+				basic_os=linux
+				;;
+			news | news700 | news800 | news900)
+				basic_machine=m68k-sony
+				basic_os=newsos
+				;;
+			news1000)
+				basic_machine=m68030-sony
+				basic_os=newsos
+				;;
+			necv70)
+				basic_machine=v70-nec
+				basic_os=sysv
+				;;
+			nh3000)
+				basic_machine=m68k-harris
+				basic_os=cxux
+				;;
+			nh[45]000)
+				basic_machine=m88k-harris
+				basic_os=cxux
+				;;
+			nindy960)
+				basic_machine=i960-intel
+				basic_os=nindy
+				;;
+			mon960)
+				basic_machine=i960-intel
+				basic_os=mon960
+				;;
+			nonstopux)
+				basic_machine=mips-compaq
+				basic_os=nonstopux
+				;;
+			os400)
+				basic_machine=powerpc-ibm
+				basic_os=os400
+				;;
+			OSE68000 | ose68000)
+				basic_machine=m68000-ericsson
+				basic_os=ose
+				;;
+			os68k)
+				basic_machine=m68k-none
+				basic_os=os68k
+				;;
+			paragon)
+				basic_machine=i860-intel
+				basic_os=osf
+				;;
+			parisc)
+				basic_machine=hppa-unknown
+				basic_os=linux
+				;;
+			psp)
+				basic_machine=mipsallegrexel-sony
+				basic_os=psp
+				;;
+			pw32)
+				basic_machine=i586-unknown
+				basic_os=pw32
+				;;
+			rdos | rdos64)
+				basic_machine=x86_64-pc
+				basic_os=rdos
+				;;
+			rdos32)
+				basic_machine=i386-pc
+				basic_os=rdos
+				;;
+			rom68k)
+				basic_machine=m68k-rom68k
+				basic_os=coff
+				;;
+			sa29200)
+				basic_machine=a29k-amd
+				basic_os=udi
+				;;
+			sei)
+				basic_machine=mips-sei
+				basic_os=seiux
+				;;
+			sequent)
+				basic_machine=i386-sequent
+				basic_os=
+				;;
+			sps7)
+				basic_machine=m68k-bull
+				basic_os=sysv2
+				;;
+			st2000)
+				basic_machine=m68k-tandem
+				basic_os=
+				;;
+			stratus)
+				basic_machine=i860-stratus
+				basic_os=sysv4
+				;;
+			sun2)
+				basic_machine=m68000-sun
+				basic_os=
+				;;
+			sun2os3)
+				basic_machine=m68000-sun
+				basic_os=sunos3
+				;;
+			sun2os4)
+				basic_machine=m68000-sun
+				basic_os=sunos4
+				;;
+			sun3)
+				basic_machine=m68k-sun
+				basic_os=
+				;;
+			sun3os3)
+				basic_machine=m68k-sun
+				basic_os=sunos3
+				;;
+			sun3os4)
+				basic_machine=m68k-sun
+				basic_os=sunos4
+				;;
+			sun4)
+				basic_machine=sparc-sun
+				basic_os=
+				;;
+			sun4os3)
+				basic_machine=sparc-sun
+				basic_os=sunos3
+				;;
+			sun4os4)
+				basic_machine=sparc-sun
+				basic_os=sunos4
+				;;
+			sun4sol2)
+				basic_machine=sparc-sun
+				basic_os=solaris2
+				;;
+			sun386 | sun386i | roadrunner)
+				basic_machine=i386-sun
+				basic_os=
+				;;
+			sv1)
+				basic_machine=sv1-cray
+				basic_os=unicos
+				;;
+			symmetry)
+				basic_machine=i386-sequent
+				basic_os=dynix
+				;;
+			t3e)
+				basic_machine=alphaev5-cray
+				basic_os=unicos
+				;;
+			t90)
+				basic_machine=t90-cray
+				basic_os=unicos
+				;;
+			toad1)
+				basic_machine=pdp10-xkl
+				basic_os=tops20
+				;;
+			tpf)
+				basic_machine=s390x-ibm
+				basic_os=tpf
+				;;
+			udi29k)
+				basic_machine=a29k-amd
+				basic_os=udi
+				;;
+			ultra3)
+				basic_machine=a29k-nyu
+				basic_os=sym1
+				;;
+			v810 | necv810)
+				basic_machine=v810-nec
+				basic_os=none
+				;;
+			vaxv)
+				basic_machine=vax-dec
+				basic_os=sysv
+				;;
+			vms)
+				basic_machine=vax-dec
+				basic_os=vms
+				;;
+			vsta)
+				basic_machine=i386-pc
+				basic_os=vsta
+				;;
+			vxworks960)
+				basic_machine=i960-wrs
+				basic_os=vxworks
+				;;
+			vxworks68)
+				basic_machine=m68k-wrs
+				basic_os=vxworks
+				;;
+			vxworks29k)
+				basic_machine=a29k-wrs
+				basic_os=vxworks
+				;;
+			xbox)
+				basic_machine=i686-pc
+				basic_os=mingw32
+				;;
+			ymp)
+				basic_machine=ymp-cray
+				basic_os=unicos
+				;;
+			*)
+				basic_machine=$1
+				basic_os=
+				;;
+		esac
+		;;
+esac
+
+# Decode 1-component or ad-hoc basic machines
+case $basic_machine in
+	# Here we handle the default manufacturer of certain CPU types.  It is in
+	# some cases the only manufacturer, in others, it is the most popular.
+	w89k)
+		cpu=hppa1.1
+		vendor=winbond
+		;;
+	op50n)
+		cpu=hppa1.1
+		vendor=oki
+		;;
+	op60c)
+		cpu=hppa1.1
+		vendor=oki
+		;;
+	ibm*)
+		cpu=i370
+		vendor=ibm
+		;;
+	orion105)
+		cpu=clipper
+		vendor=highlevel
+		;;
+	mac | mpw | mac-mpw)
+		cpu=m68k
+		vendor=apple
+		;;
+	pmac | pmac-mpw)
+		cpu=powerpc
+		vendor=apple
+		;;
+
+	# Recognize the various machine names and aliases which stand
+	# for a CPU type and a company and sometimes even an OS.
+	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+		cpu=m68000
+		vendor=att
+		;;
+	3b*)
+		cpu=we32k
+		vendor=att
+		;;
+	bluegene*)
+		cpu=powerpc
+		vendor=ibm
+		basic_os=cnk
+		;;
+	decsystem10* | dec10*)
+		cpu=pdp10
+		vendor=dec
+		basic_os=tops10
+		;;
+	decsystem20* | dec20*)
+		cpu=pdp10
+		vendor=dec
+		basic_os=tops20
+		;;
+	delta | 3300 | motorola-3300 | motorola-delta \
+	      | 3300-motorola | delta-motorola)
+		cpu=m68k
+		vendor=motorola
+		;;
+	dpx2*)
+		cpu=m68k
+		vendor=bull
+		basic_os=sysv3
+		;;
+	encore | umax | mmax)
+		cpu=ns32k
+		vendor=encore
+		;;
+	elxsi)
+		cpu=elxsi
+		vendor=elxsi
+		basic_os=${basic_os:-bsd}
+		;;
+	fx2800)
+		cpu=i860
+		vendor=alliant
+		;;
+	genix)
+		cpu=ns32k
+		vendor=ns
+		;;
+	h3050r* | hiux*)
+		cpu=hppa1.1
+		vendor=hitachi
+		basic_os=hiuxwe2
+		;;
+	hp3k9[0-9][0-9] | hp9[0-9][0-9])
+		cpu=hppa1.0
+		vendor=hp
+		;;
+	hp9k2[0-9][0-9] | hp9k31[0-9])
+		cpu=m68000
+		vendor=hp
+		;;
+	hp9k3[2-9][0-9])
+		cpu=m68k
+		vendor=hp
+		;;
+	hp9k6[0-9][0-9] | hp6[0-9][0-9])
+		cpu=hppa1.0
+		vendor=hp
+		;;
+	hp9k7[0-79][0-9] | hp7[0-79][0-9])
+		cpu=hppa1.1
+		vendor=hp
+		;;
+	hp9k78[0-9] | hp78[0-9])
+		# FIXME: really hppa2.0-hp
+		cpu=hppa1.1
+		vendor=hp
+		;;
+	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+		# FIXME: really hppa2.0-hp
+		cpu=hppa1.1
+		vendor=hp
+		;;
+	hp9k8[0-9][13679] | hp8[0-9][13679])
+		cpu=hppa1.1
+		vendor=hp
+		;;
+	hp9k8[0-9][0-9] | hp8[0-9][0-9])
+		cpu=hppa1.0
+		vendor=hp
+		;;
+	i*86v32)
+		cpu=`echo "$1" | sed -e 's/86.*/86/'`
+		vendor=pc
+		basic_os=sysv32
+		;;
+	i*86v4*)
+		cpu=`echo "$1" | sed -e 's/86.*/86/'`
+		vendor=pc
+		basic_os=sysv4
+		;;
+	i*86v)
+		cpu=`echo "$1" | sed -e 's/86.*/86/'`
+		vendor=pc
+		basic_os=sysv
+		;;
+	i*86sol2)
+		cpu=`echo "$1" | sed -e 's/86.*/86/'`
+		vendor=pc
+		basic_os=solaris2
+		;;
+	j90 | j90-cray)
+		cpu=j90
+		vendor=cray
+		basic_os=${basic_os:-unicos}
+		;;
+	iris | iris4d)
+		cpu=mips
+		vendor=sgi
+		case $basic_os in
+		    irix*)
+			;;
+		    *)
+			basic_os=irix4
+			;;
+		esac
+		;;
+	miniframe)
+		cpu=m68000
+		vendor=convergent
+		;;
+	*mint | mint[0-9]* | *MiNT | *MiNT[0-9]*)
+		cpu=m68k
+		vendor=atari
+		basic_os=mint
+		;;
+	news-3600 | risc-news)
+		cpu=mips
+		vendor=sony
+		basic_os=newsos
+		;;
+	next | m*-next)
+		cpu=m68k
+		vendor=next
+		case $basic_os in
+		    openstep*)
+		        ;;
+		    nextstep*)
+			;;
+		    ns2*)
+		      basic_os=nextstep2
+			;;
+		    *)
+		      basic_os=nextstep3
+			;;
+		esac
+		;;
+	np1)
+		cpu=np1
+		vendor=gould
+		;;
+	op50n-* | op60c-*)
+		cpu=hppa1.1
+		vendor=oki
+		basic_os=proelf
+		;;
+	pa-hitachi)
+		cpu=hppa1.1
+		vendor=hitachi
+		basic_os=hiuxwe2
+		;;
+	pbd)
+		cpu=sparc
+		vendor=tti
+		;;
+	pbb)
+		cpu=m68k
+		vendor=tti
+		;;
+	pc532)
+		cpu=ns32k
+		vendor=pc532
+		;;
+	pn)
+		cpu=pn
+		vendor=gould
+		;;
+	power)
+		cpu=power
+		vendor=ibm
+		;;
+	ps2)
+		cpu=i386
+		vendor=ibm
+		;;
+	rm[46]00)
+		cpu=mips
+		vendor=siemens
+		;;
+	rtpc | rtpc-*)
+		cpu=romp
+		vendor=ibm
+		;;
+	sde)
+		cpu=mipsisa32
+		vendor=sde
+		basic_os=${basic_os:-elf}
+		;;
+	simso-wrs)
+		cpu=sparclite
+		vendor=wrs
+		basic_os=vxworks
+		;;
+	tower | tower-32)
+		cpu=m68k
+		vendor=ncr
+		;;
+	vpp*|vx|vx-*)
+		cpu=f301
+		vendor=fujitsu
+		;;
+	w65)
+		cpu=w65
+		vendor=wdc
+		;;
+	w89k-*)
+		cpu=hppa1.1
+		vendor=winbond
+		basic_os=proelf
+		;;
+	none)
+		cpu=none
+		vendor=none
+		;;
+	leon|leon[3-9])
+		cpu=sparc
+		vendor=$basic_machine
+		;;
+	leon-*|leon[3-9]-*)
+		cpu=sparc
+		vendor=`echo "$basic_machine" | sed 's/-.*//'`
+		;;
+
+	*-*)
+		# shellcheck disable=SC2162
+		saved_IFS=$IFS
+		IFS="-" read cpu vendor <<EOF
+$basic_machine
+EOF
+		IFS=$saved_IFS
+		;;
+	# We use `pc' rather than `unknown'
+	# because (1) that's what they normally are, and
+	# (2) the word "unknown" tends to confuse beginning users.
+	i*86 | x86_64)
+		cpu=$basic_machine
+		vendor=pc
+		;;
+	# These rules are duplicated from below for sake of the special case above;
+	# i.e. things that normalized to x86 arches should also default to "pc"
+	pc98)
+		cpu=i386
+		vendor=pc
+		;;
+	x64 | amd64)
+		cpu=x86_64
+		vendor=pc
+		;;
+	# Recognize the basic CPU types without company name.
+	*)
+		cpu=$basic_machine
+		vendor=unknown
+		;;
+esac
+
+unset -v basic_machine
+
+# Decode basic machines in the full and proper CPU-Company form.
+case $cpu-$vendor in
+	# Here we handle the default manufacturer of certain CPU types in canonical form. It is in
+	# some cases the only manufacturer, in others, it is the most popular.
+	craynv-unknown)
+		vendor=cray
+		basic_os=${basic_os:-unicosmp}
+		;;
+	c90-unknown | c90-cray)
+		vendor=cray
+		basic_os=${Basic_os:-unicos}
+		;;
+	fx80-unknown)
+		vendor=alliant
+		;;
+	romp-unknown)
+		vendor=ibm
+		;;
+	mmix-unknown)
+		vendor=knuth
+		;;
+	microblaze-unknown | microblazeel-unknown)
+		vendor=xilinx
+		;;
+	rs6000-unknown)
+		vendor=ibm
+		;;
+	vax-unknown)
+		vendor=dec
+		;;
+	pdp11-unknown)
+		vendor=dec
+		;;
+	we32k-unknown)
+		vendor=att
+		;;
+	cydra-unknown)
+		vendor=cydrome
+		;;
+	i370-ibm*)
+		vendor=ibm
+		;;
+	orion-unknown)
+		vendor=highlevel
+		;;
+	xps-unknown | xps100-unknown)
+		cpu=xps100
+		vendor=honeywell
+		;;
+
+	# Here we normalize CPU types with a missing or matching vendor
+	armh-unknown | armh-alt)
+		cpu=armv7l
+		vendor=alt
+		basic_os=${basic_os:-linux-gnueabihf}
+		;;
+	dpx20-unknown | dpx20-bull)
+		cpu=rs6000
+		vendor=bull
+		basic_os=${basic_os:-bosx}
+		;;
+
+	# Here we normalize CPU types irrespective of the vendor
+	amd64-*)
+		cpu=x86_64
+		;;
+	blackfin-*)
+		cpu=bfin
+		basic_os=linux
+		;;
+	c54x-*)
+		cpu=tic54x
+		;;
+	c55x-*)
+		cpu=tic55x
+		;;
+	c6x-*)
+		cpu=tic6x
+		;;
+	e500v[12]-*)
+		cpu=powerpc
+		basic_os=${basic_os}"spe"
+		;;
+	mips3*-*)
+		cpu=mips64
+		;;
+	ms1-*)
+		cpu=mt
+		;;
+	m68knommu-*)
+		cpu=m68k
+		basic_os=linux
+		;;
+	m9s12z-* | m68hcs12z-* | hcs12z-* | s12z-*)
+		cpu=s12z
+		;;
+	openrisc-*)
+		cpu=or32
+		;;
+	parisc-*)
+		cpu=hppa
+		basic_os=linux
+		;;
+	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+		cpu=i586
+		;;
+	pentiumpro-* | p6-* | 6x86-* | athlon-* | athalon_*-*)
+		cpu=i686
+		;;
+	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+		cpu=i686
+		;;
+	pentium4-*)
+		cpu=i786
+		;;
+	pc98-*)
+		cpu=i386
+		;;
+	ppc-* | ppcbe-*)
+		cpu=powerpc
+		;;
+	ppcle-* | powerpclittle-*)
+		cpu=powerpcle
+		;;
+	ppc64-*)
+		cpu=powerpc64
+		;;
+	ppc64le-* | powerpc64little-*)
+		cpu=powerpc64le
+		;;
+	sb1-*)
+		cpu=mipsisa64sb1
+		;;
+	sb1el-*)
+		cpu=mipsisa64sb1el
+		;;
+	sh5e[lb]-*)
+		cpu=`echo "$cpu" | sed 's/^\(sh.\)e\(.\)$/\1\2e/'`
+		;;
+	spur-*)
+		cpu=spur
+		;;
+	strongarm-* | thumb-*)
+		cpu=arm
+		;;
+	tx39-*)
+		cpu=mipstx39
+		;;
+	tx39el-*)
+		cpu=mipstx39el
+		;;
+	x64-*)
+		cpu=x86_64
+		;;
+	xscale-* | xscalee[bl]-*)
+		cpu=`echo "$cpu" | sed 's/^xscale/arm/'`
+		;;
+	arm64-* | aarch64le-*)
+		cpu=aarch64
+		;;
+
+	# Recognize the canonical CPU Types that limit and/or modify the
+	# company names they are paired with.
+	cr16-*)
+		basic_os=${basic_os:-elf}
+		;;
+	crisv32-* | etraxfs*-*)
+		cpu=crisv32
+		vendor=axis
+		;;
+	cris-* | etrax*-*)
+		cpu=cris
+		vendor=axis
+		;;
+	crx-*)
+		basic_os=${basic_os:-elf}
+		;;
+	neo-tandem)
+		cpu=neo
+		vendor=tandem
+		;;
+	nse-tandem)
+		cpu=nse
+		vendor=tandem
+		;;
+	nsr-tandem)
+		cpu=nsr
+		vendor=tandem
+		;;
+	nsv-tandem)
+		cpu=nsv
+		vendor=tandem
+		;;
+	nsx-tandem)
+		cpu=nsx
+		vendor=tandem
+		;;
+	mipsallegrexel-sony)
+		cpu=mipsallegrexel
+		vendor=sony
+		;;
+	tile*-*)
+		basic_os=${basic_os:-linux-gnu}
+		;;
+
+	*)
+		# Recognize the canonical CPU types that are allowed with any
+		# company name.
+		case $cpu in
+			1750a | 580 \
+			| a29k \
+			| aarch64 | aarch64_be \
+			| abacus \
+			| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \
+			| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \
+			| alphapca5[67] | alpha64pca5[67] \
+			| am33_2.0 \
+			| amdgcn \
+			| arc | arceb | arc32 | arc64 \
+			| arm | arm[lb]e | arme[lb] | armv* \
+			| avr | avr32 \
+			| asmjs \
+			| ba \
+			| be32 | be64 \
+			| bfin | bpf | bs2000 \
+			| c[123]* | c30 | [cjt]90 | c4x \
+			| c8051 | clipper | craynv | csky | cydra \
+			| d10v | d30v | dlx | dsp16xx \
+			| e2k | elxsi | epiphany \
+			| f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \
+			| h8300 | h8500 \
+			| hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+			| hexagon \
+			| i370 | i*86 | i860 | i960 | ia16 | ia64 \
+			| ip2k | iq2000 \
+			| k1om \
+			| le32 | le64 \
+			| lm32 \
+			| loongarch32 | loongarch64 \
+			| m32c | m32r | m32rle \
+			| m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \
+			| m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \
+			| m88110 | m88k | maxq | mb | mcore | mep | metag \
+			| microblaze | microblazeel \
+			| mips | mipsbe | mipseb | mipsel | mipsle \
+			| mips16 \
+			| mips64 | mips64eb | mips64el \
+			| mips64octeon | mips64octeonel \
+			| mips64orion | mips64orionel \
+			| mips64r5900 | mips64r5900el \
+			| mips64vr | mips64vrel \
+			| mips64vr4100 | mips64vr4100el \
+			| mips64vr4300 | mips64vr4300el \
+			| mips64vr5000 | mips64vr5000el \
+			| mips64vr5900 | mips64vr5900el \
+			| mipsisa32 | mipsisa32el \
+			| mipsisa32r2 | mipsisa32r2el \
+			| mipsisa32r3 | mipsisa32r3el \
+			| mipsisa32r5 | mipsisa32r5el \
+			| mipsisa32r6 | mipsisa32r6el \
+			| mipsisa64 | mipsisa64el \
+			| mipsisa64r2 | mipsisa64r2el \
+			| mipsisa64r3 | mipsisa64r3el \
+			| mipsisa64r5 | mipsisa64r5el \
+			| mipsisa64r6 | mipsisa64r6el \
+			| mipsisa64sb1 | mipsisa64sb1el \
+			| mipsisa64sr71k | mipsisa64sr71kel \
+			| mipsr5900 | mipsr5900el \
+			| mipstx39 | mipstx39el \
+			| mmix \
+			| mn10200 | mn10300 \
+			| moxie \
+			| mt \
+			| msp430 \
+			| nds32 | nds32le | nds32be \
+			| nfp \
+			| nios | nios2 | nios2eb | nios2el \
+			| none | np1 | ns16k | ns32k | nvptx \
+			| open8 \
+			| or1k* \
+			| or32 \
+			| orion \
+			| picochip \
+			| pdp10 | pdp11 | pj | pjl | pn | power \
+			| powerpc | powerpc64 | powerpc64le | powerpcle | powerpcspe \
+			| pru \
+			| pyramid \
+			| riscv | riscv32 | riscv32be | riscv64 | riscv64be \
+			| rl78 | romp | rs6000 | rx \
+			| s390 | s390x \
+			| score \
+			| sh | shl \
+			| sh[1234] | sh[24]a | sh[24]ae[lb] | sh[23]e | she[lb] | sh[lb]e \
+			| sh[1234]e[lb] |  sh[12345][lb]e | sh[23]ele | sh64 | sh64le \
+			| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet \
+			| sparclite \
+			| sparcv8 | sparcv9 | sparcv9b | sparcv9v | sv1 | sx* \
+			| spu \
+			| tahoe \
+			| thumbv7* \
+			| tic30 | tic4x | tic54x | tic55x | tic6x | tic80 \
+			| tron \
+			| ubicom32 \
+			| v70 | v850 | v850e | v850e1 | v850es | v850e2 | v850e2v3 \
+			| vax \
+			| visium \
+			| w65 \
+			| wasm32 | wasm64 \
+			| we32k \
+			| x86 | x86_64 | xc16x | xgate | xps100 \
+			| xstormy16 | xtensa* \
+			| ymp \
+			| z8k | z80)
+				;;
+
+			*)
+				echo Invalid configuration \`"$1"\': machine \`"$cpu-$vendor"\' not recognized 1>&2
+				exit 1
+				;;
+		esac
+		;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $vendor in
+	digital*)
+		vendor=dec
+		;;
+	commodore*)
+		vendor=cbm
+		;;
+	*)
+		;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if test x$basic_os != x
+then
+
+# First recognize some ad-hoc cases, or perhaps split kernel-os, or else just
+# set os.
+case $basic_os in
+	gnu/linux*)
+		kernel=linux
+		os=`echo "$basic_os" | sed -e 's|gnu/linux|gnu|'`
+		;;
+	os2-emx)
+		kernel=os2
+		os=`echo "$basic_os" | sed -e 's|os2-emx|emx|'`
+		;;
+	nto-qnx*)
+		kernel=nto
+		os=`echo "$basic_os" | sed -e 's|nto-qnx|qnx|'`
+		;;
+	*-*)
+		# shellcheck disable=SC2162
+		saved_IFS=$IFS
+		IFS="-" read kernel os <<EOF
+$basic_os
+EOF
+		IFS=$saved_IFS
+		;;
+	# Default OS when just kernel was specified
+	nto*)
+		kernel=nto
+		os=`echo "$basic_os" | sed -e 's|nto|qnx|'`
+		;;
+	linux*)
+		kernel=linux
+		os=`echo "$basic_os" | sed -e 's|linux|gnu|'`
+		;;
+	*)
+		kernel=
+		os=$basic_os
+		;;
+esac
+
+# Now, normalize the OS (knowing we just have one component, it's not a kernel,
+# etc.)
+case $os in
+	# First match some system type aliases that might get confused
+	# with valid system types.
+	# solaris* is a basic system type, with this one exception.
+	auroraux)
+		os=auroraux
+		;;
+	bluegene*)
+		os=cnk
+		;;
+	solaris1 | solaris1.*)
+		os=`echo "$os" | sed -e 's|solaris1|sunos4|'`
+		;;
+	solaris)
+		os=solaris2
+		;;
+	unixware*)
+		os=sysv4.2uw
+		;;
+	# es1800 is here to avoid being matched by es* (a different OS)
+	es1800*)
+		os=ose
+		;;
+	# Some version numbers need modification
+	chorusos*)
+		os=chorusos
+		;;
+	isc)
+		os=isc2.2
+		;;
+	sco6)
+		os=sco5v6
+		;;
+	sco5)
+		os=sco3.2v5
+		;;
+	sco4)
+		os=sco3.2v4
+		;;
+	sco3.2.[4-9]*)
+		os=`echo "$os" | sed -e 's/sco3.2./sco3.2v/'`
+		;;
+	sco*v* | scout)
+		# Don't match below
+		;;
+	sco*)
+		os=sco3.2v2
+		;;
+	psos*)
+		os=psos
+		;;
+	qnx*)
+		os=qnx
+		;;
+	hiux*)
+		os=hiuxwe2
+		;;
+	lynx*178)
+		os=lynxos178
+		;;
+	lynx*5)
+		os=lynxos5
+		;;
+	lynxos*)
+		# don't get caught up in next wildcard
+		;;
+	lynx*)
+		os=lynxos
+		;;
+	mac[0-9]*)
+		os=`echo "$os" | sed -e 's|mac|macos|'`
+		;;
+	opened*)
+		os=openedition
+		;;
+	os400*)
+		os=os400
+		;;
+	sunos5*)
+		os=`echo "$os" | sed -e 's|sunos5|solaris2|'`
+		;;
+	sunos6*)
+		os=`echo "$os" | sed -e 's|sunos6|solaris3|'`
+		;;
+	wince*)
+		os=wince
+		;;
+	utek*)
+		os=bsd
+		;;
+	dynix*)
+		os=bsd
+		;;
+	acis*)
+		os=aos
+		;;
+	atheos*)
+		os=atheos
+		;;
+	syllable*)
+		os=syllable
+		;;
+	386bsd)
+		os=bsd
+		;;
+	ctix* | uts*)
+		os=sysv
+		;;
+	nova*)
+		os=rtmk-nova
+		;;
+	ns2)
+		os=nextstep2
+		;;
+	# Preserve the version number of sinix5.
+	sinix5.*)
+		os=`echo "$os" | sed -e 's|sinix|sysv|'`
+		;;
+	sinix*)
+		os=sysv4
+		;;
+	tpf*)
+		os=tpf
+		;;
+	triton*)
+		os=sysv3
+		;;
+	oss*)
+		os=sysv3
+		;;
+	svr4*)
+		os=sysv4
+		;;
+	svr3)
+		os=sysv3
+		;;
+	sysvr4)
+		os=sysv4
+		;;
+	ose*)
+		os=ose
+		;;
+	*mint | mint[0-9]* | *MiNT | MiNT[0-9]*)
+		os=mint
+		;;
+	dicos*)
+		os=dicos
+		;;
+	pikeos*)
+		# Until real need of OS specific support for
+		# particular features comes up, bare metal
+		# configurations are quite functional.
+		case $cpu in
+		    arm*)
+			os=eabi
+			;;
+		    *)
+			os=elf
+			;;
+		esac
+		;;
+	*)
+		# No normalization, but not necessarily accepted, that comes below.
+		;;
+esac
+
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+kernel=
+case $cpu-$vendor in
+	score-*)
+		os=elf
+		;;
+	spu-*)
+		os=elf
+		;;
+	*-acorn)
+		os=riscix1.2
+		;;
+	arm*-rebel)
+		kernel=linux
+		os=gnu
+		;;
+	arm*-semi)
+		os=aout
+		;;
+	c4x-* | tic4x-*)
+		os=coff
+		;;
+	c8051-*)
+		os=elf
+		;;
+	clipper-intergraph)
+		os=clix
+		;;
+	hexagon-*)
+		os=elf
+		;;
+	tic54x-*)
+		os=coff
+		;;
+	tic55x-*)
+		os=coff
+		;;
+	tic6x-*)
+		os=coff
+		;;
+	# This must come before the *-dec entry.
+	pdp10-*)
+		os=tops20
+		;;
+	pdp11-*)
+		os=none
+		;;
+	*-dec | vax-*)
+		os=ultrix4.2
+		;;
+	m68*-apollo)
+		os=domain
+		;;
+	i386-sun)
+		os=sunos4.0.2
+		;;
+	m68000-sun)
+		os=sunos3
+		;;
+	m68*-cisco)
+		os=aout
+		;;
+	mep-*)
+		os=elf
+		;;
+	mips*-cisco)
+		os=elf
+		;;
+	mips*-*)
+		os=elf
+		;;
+	or32-*)
+		os=coff
+		;;
+	*-tti)	# must be before sparc entry or we get the wrong os.
+		os=sysv3
+		;;
+	sparc-* | *-sun)
+		os=sunos4.1.1
+		;;
+	pru-*)
+		os=elf
+		;;
+	*-be)
+		os=beos
+		;;
+	*-ibm)
+		os=aix
+		;;
+	*-knuth)
+		os=mmixware
+		;;
+	*-wec)
+		os=proelf
+		;;
+	*-winbond)
+		os=proelf
+		;;
+	*-oki)
+		os=proelf
+		;;
+	*-hp)
+		os=hpux
+		;;
+	*-hitachi)
+		os=hiux
+		;;
+	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+		os=sysv
+		;;
+	*-cbm)
+		os=amigaos
+		;;
+	*-dg)
+		os=dgux
+		;;
+	*-dolphin)
+		os=sysv3
+		;;
+	m68k-ccur)
+		os=rtu
+		;;
+	m88k-omron*)
+		os=luna
+		;;
+	*-next)
+		os=nextstep
+		;;
+	*-sequent)
+		os=ptx
+		;;
+	*-crds)
+		os=unos
+		;;
+	*-ns)
+		os=genix
+		;;
+	i370-*)
+		os=mvs
+		;;
+	*-gould)
+		os=sysv
+		;;
+	*-highlevel)
+		os=bsd
+		;;
+	*-encore)
+		os=bsd
+		;;
+	*-sgi)
+		os=irix
+		;;
+	*-siemens)
+		os=sysv4
+		;;
+	*-masscomp)
+		os=rtu
+		;;
+	f30[01]-fujitsu | f700-fujitsu)
+		os=uxpv
+		;;
+	*-rom68k)
+		os=coff
+		;;
+	*-*bug)
+		os=coff
+		;;
+	*-apple)
+		os=macos
+		;;
+	*-atari*)
+		os=mint
+		;;
+	*-wrs)
+		os=vxworks
+		;;
+	*)
+		os=none
+		;;
+esac
+
+fi
+
+# Now, validate our (potentially fixed-up) OS.
+case $os in
+	# Sometimes we do "kernel-libc", so those need to count as OSes.
+	musl* | newlib* | relibc* | uclibc*)
+		;;
+	# Likewise for "kernel-abi"
+	eabi* | gnueabi*)
+		;;
+	# VxWorks passes extra cpu info in the 4th filed.
+	simlinux | simwindows | spe)
+		;;
+	# Now accept the basic system types.
+	# The portable systems comes first.
+	# Each alternative MUST end in a * to match a version number.
+	gnu* | android* | bsd* | mach* | minix* | genix* | ultrix* | irix* \
+	     | *vms* | esix* | aix* | cnk* | sunos | sunos[34]* \
+	     | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \
+	     | sym* |  plan9* | psp* | sim* | xray* | os68k* | v88r* \
+	     | hiux* | abug | nacl* | netware* | windows* \
+	     | os9* | macos* | osx* | ios* \
+	     | mpw* | magic* | mmixware* | mon960* | lnews* \
+	     | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \
+	     | aos* | aros* | cloudabi* | sortix* | twizzler* \
+	     | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \
+	     | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \
+	     | mirbsd* | netbsd* | dicos* | openedition* | ose* \
+	     | bitrig* | openbsd* | secbsd* | solidbsd* | libertybsd* | os108* \
+	     | ekkobsd* | freebsd* | riscix* | lynxos* | os400* \
+	     | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \
+	     | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \
+	     | udi* | lites* | ieee* | go32* | aux* | hcos* \
+	     | chorusrdb* | cegcc* | glidix* | serenity* \
+	     | cygwin* | msys* | pe* | moss* | proelf* | rtems* \
+	     | midipix* | mingw32* | mingw64* | mint* \
+	     | uxpv* | beos* | mpeix* | udk* | moxiebox* \
+	     | interix* | uwin* | mks* | rhapsody* | darwin* \
+	     | openstep* | oskit* | conix* | pw32* | nonstopux* \
+	     | storm-chaos* | tops10* | tenex* | tops20* | its* \
+	     | os2* | vos* | palmos* | uclinux* | nucleus* | morphos* \
+	     | scout* | superux* | sysv* | rtmk* | tpf* | windiss* \
+	     | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \
+	     | skyos* | haiku* | rdos* | toppers* | drops* | es* \
+	     | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \
+	     | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \
+	     | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr* \
+	     | fiwix* )
+		;;
+	# This one is extra strict with allowed versions
+	sco3.2v2 | sco3.2v[4-9]* | sco5v6*)
+		# Don't forget version if it is 3.2v4 or newer.
+		;;
+	none)
+		;;
+	*)
+		echo Invalid configuration \`"$1"\': OS \`"$os"\' not recognized 1>&2
+		exit 1
+		;;
+esac
+
+# As a final step for OS-related things, validate the OS-kernel combination
+# (given a valid OS), if there is a kernel.
+case $kernel-$os in
+	linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* \
+		   | linux-musl* | linux-relibc* | linux-uclibc* )
+		;;
+	uclinux-uclibc* )
+		;;
+	-dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* )
+		# These are just libc implementations, not actual OSes, and thus
+		# require a kernel.
+		echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2
+		exit 1
+		;;
+	kfreebsd*-gnu* | kopensolaris*-gnu*)
+		;;
+	vxworks-simlinux | vxworks-simwindows | vxworks-spe)
+		;;
+	nto-qnx*)
+		;;
+	os2-emx)
+		;;
+	*-eabi* | *-gnueabi*)
+		;;
+	-*)
+		# Blank kernel with real OS is always fine.
+		;;
+	*-*)
+		echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2
+		exit 1
+		;;
+esac
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+case $vendor in
+	unknown)
+		case $cpu-$os in
+			*-riscix*)
+				vendor=acorn
+				;;
+			*-sunos*)
+				vendor=sun
+				;;
+			*-cnk* | *-aix*)
+				vendor=ibm
+				;;
+			*-beos*)
+				vendor=be
+				;;
+			*-hpux*)
+				vendor=hp
+				;;
+			*-mpeix*)
+				vendor=hp
+				;;
+			*-hiux*)
+				vendor=hitachi
+				;;
+			*-unos*)
+				vendor=crds
+				;;
+			*-dgux*)
+				vendor=dg
+				;;
+			*-luna*)
+				vendor=omron
+				;;
+			*-genix*)
+				vendor=ns
+				;;
+			*-clix*)
+				vendor=intergraph
+				;;
+			*-mvs* | *-opened*)
+				vendor=ibm
+				;;
+			*-os400*)
+				vendor=ibm
+				;;
+			s390-* | s390x-*)
+				vendor=ibm
+				;;
+			*-ptx*)
+				vendor=sequent
+				;;
+			*-tpf*)
+				vendor=ibm
+				;;
+			*-vxsim* | *-vxworks* | *-windiss*)
+				vendor=wrs
+				;;
+			*-aux*)
+				vendor=apple
+				;;
+			*-hms*)
+				vendor=hitachi
+				;;
+			*-mpw* | *-macos*)
+				vendor=apple
+				;;
+			*-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*)
+				vendor=atari
+				;;
+			*-vos*)
+				vendor=stratus
+				;;
+		esac
+		;;
+esac
+
+echo "$cpu-$vendor-${kernel:+$kernel-}$os"
+exit
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/configure b/configure
new file mode 100755
index 0000000..4c39d24
--- /dev/null
+++ b/configure
@@ -0,0 +1,31375 @@
+#! /bin/sh
+# From configure.in Revision: 1.753 .
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by Autoconf 2.52.20221009.
+#
+# Copyright 2003-2021,2022	Thomas E. Dickey
+# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
+# Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g"
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+
+# Name of the executable.
+as_me=`echo "$0" |sed 's,.*[\\/],,'`
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr="expr"
+else
+  as_expr="false"
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s='ln'
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+as_executable_p="test -f"
+
+# Support unset when possible.
+if (FOO=FOO; unset FOO) >/dev/null 2>&1; then
+  as_unset="unset"
+else
+  as_unset="false"
+fi
+
+# NLS nuisances.
+$as_unset LANG || test "${LANG+set}" != set || { LANG=C; export LANG; }
+$as_unset LC_ALL || test "${LC_ALL+set}" != set || { LC_ALL=C; export LC_ALL; }
+$as_unset LC_TIME || test "${LC_TIME+set}" != set || { LC_TIME=C; export LC_TIME; }
+$as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set || { LC_CTYPE=C; export LC_CTYPE; }
+$as_unset LANGUAGE || test "${LANGUAGE+set}" != set || { LANGUAGE=C; export LANGUAGE; }
+$as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set || { LC_COLLATE=C; export LC_COLLATE; }
+$as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set || { LC_NUMERIC=C; export LC_NUMERIC; }
+$as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set || { LC_MESSAGES=C; export LC_MESSAGES; }
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" 	$as_nl"
+
+# CDPATH.
+$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=:; export CDPATH; }
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+exec 6>&1
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Maximum number of lines to put in a shell here document.
+# This variable seems obsolete.  It should probably be removed, and
+# only ac_max_sed_lines should be used.
+: "${ac_max_here_lines=38}"
+
+ac_unique_file="ncurses/base/lib_initscr.c"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#if HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#if STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# if HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif
+#if HAVE_STRING_H
+# if !STDC_HEADERS && HAVE_MEMORY_H
+#  include <memory.h>
+# endif
+# include <string.h>
+#endif
+#if HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#else
+# if HAVE_STDINT_H
+#  include <stdint.h>
+# endif
+#endif
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+runstatedir='${localstatedir}/run'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${datarootdir}/info'
+mandir='${datarootdir}/man'
+
+# Identity of this package.
+PACKAGE_NAME=
+PACKAGE_TARNAME=
+PACKAGE_VERSION=
+PACKAGE_STRING=
+PACKAGE_BUGREPORT=
+
+ac_prev=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval "$ac_prev=\$ac_option"
+    ac_prev=
+    continue
+  fi
+
+  ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case "$ac_option" in
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+  | --da=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo "$ac_feature" | sed 's/-/_/g'`
+    eval "enable_$ac_feature=no" ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo "$ac_feature" | sed 's/-/_/g'`
+    case "$ac_option" in
+      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "enable_$ac_feature='$ac_optarg'" ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst \
+  | --locals | --local | --loca | --loc | --lo)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+    localstatedir=$ac_optarg ;;
+
+  -runstatedir | --runstatedir | --runstatedi | --runstated \
+  | --runstate | --runstat | --runsta | --runst \
+  | --runs | --run | --ru)
+    ac_prev=runstatedir ;;
+  -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
+  | --runstate=* | --runstat=* | --runsta=* | --runst=* \
+  | --runs=* | --run=* | --ru=*)
+    runstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo "$ac_package" | sed 's/-/_/g'`
+    case "$ac_option" in
+      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "with_$ac_package='$ac_optarg'" ;;
+
+  -without-* | --without-*)
+    ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo "$ac_package" | sed 's/-/_/g'`
+    eval "with_$ac_package=no" ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; }
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+   { (exit 1); exit 1; }; }
+    ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
+    eval "$ac_envvar='$ac_optarg'"
+    export "$ac_envvar" ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : "${build_alias=$ac_option}" "${host_alias=$ac_option}" "${target_alias=$ac_option}"
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo "$ac_prev" | sed 's/_/-/g'`
+  { echo "$as_me: error: missing argument to $ac_option" >&2
+   { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute paths.
+for ac_var in exec_prefix prefix
+do
+  eval ac_val=$`echo "$ac_var"`
+  case "$ac_val" in
+    [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
+    *)  { echo "$as_me: error: expected an absolute path for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# Be sure to have absolute paths.
+for ac_var in bindir sbindir libexecdir datarootdir datadir sysconfdir sharedstatedir \
+              localstatedir libdir includedir oldincludedir infodir mandir
+do
+  eval ac_val=$`echo "$ac_var"`
+  case "$ac_val" in
+    [\\/$]* | ?:[\\/]* ) ;;
+    *)  { echo "$as_me: error: expected an absolute path for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: should be removed in autoconf 3.0.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used." >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then its parent.
+  ac_prog=$0
+  ac_confdir=`echo "$ac_prog" | sed 's%[\\/][^\\/][^\\/]*$%%'`
+  test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  if test "$ac_srcdir_defaulted" = yes; then
+    { echo "$as_me: error: cannot find sources in $ac_confdir or .." >&2
+   { (exit 1); exit 1; }; }
+  else
+    { echo "$as_me: error: cannot find sources in $srcdir" >&2
+   { (exit 1); exit 1; }; }
+  fi
+fi
+srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
+ac_env_build_alias_set=${build_alias+set}
+ac_env_build_alias_value=$build_alias
+ac_cv_env_build_alias_set=${build_alias+set}
+ac_cv_env_build_alias_value=$build_alias
+ac_env_host_alias_set=${host_alias+set}
+ac_env_host_alias_value=$host_alias
+ac_cv_env_host_alias_set=${host_alias+set}
+ac_cv_env_host_alias_value=$host_alias
+ac_env_target_alias_set=${target_alias+set}
+ac_env_target_alias_value=$target_alias
+ac_cv_env_target_alias_set=${target_alias+set}
+ac_cv_env_target_alias_value=$target_alias
+ac_env_CC_set=${CC+set}
+ac_env_CC_value=$CC
+ac_cv_env_CC_set=${CC+set}
+ac_cv_env_CC_value=$CC
+ac_env_CFLAGS_set=${CFLAGS+set}
+ac_env_CFLAGS_value=$CFLAGS
+ac_cv_env_CFLAGS_set=${CFLAGS+set}
+ac_cv_env_CFLAGS_value=$CFLAGS
+ac_env_LDFLAGS_set=${LDFLAGS+set}
+ac_env_LDFLAGS_value=$LDFLAGS
+ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
+ac_cv_env_LDFLAGS_value=$LDFLAGS
+ac_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_env_CPPFLAGS_value=$CPPFLAGS
+ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_cv_env_CPPFLAGS_value=$CPPFLAGS
+ac_env_CPP_set=${CPP+set}
+ac_env_CPP_value=$CPP
+ac_cv_env_CPP_set=${CPP+set}
+ac_cv_env_CPP_value=$CPP
+ac_env_CXX_set=${CXX+set}
+ac_env_CXX_value=$CXX
+ac_cv_env_CXX_set=${CXX+set}
+ac_cv_env_CXX_value=$CXX
+ac_env_CXXFLAGS_set=${CXXFLAGS+set}
+ac_env_CXXFLAGS_value=$CXXFLAGS
+ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set}
+ac_cv_env_CXXFLAGS_value=$CXXFLAGS
+ac_env_CXXCPP_set=${CXXCPP+set}
+ac_env_CXXCPP_value=$CXXCPP
+ac_cv_env_CXXCPP_set=${CXXCPP+set}
+ac_cv_env_CXXCPP_value=$CXXCPP
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<EOF
+\`configure' configures this package to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+EOF
+
+  cat <<EOF
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR            user executables [EPREFIX/bin]
+  --sbindir=DIR           system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR        program executables [EPREFIX/libexec]
+  --datarootdir=DIR       read-only architecture-independent data [PREFIX/share]
+  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
+  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --runstatedir=DIR       extra definition of runtime data [LOCALSTATEDIR/run]
+  --libdir=DIR            object code libraries [EPREFIX/lib]
+  --includedir=DIR        C header files [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
+  --infodir=DIR           info documentation [DATAROOTDIR/info]
+  --mandir=DIR            man documentation [DATAROOTDIR/man]
+EOF
+
+  cat <<\EOF
+
+Program names:
+  --program-prefix=PREFIX            prepend PREFIX to installed program names
+  --program-suffix=SUFFIX            append SUFFIX to installed program names
+  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
+
+System types:
+  --build=BUILD           configure for building on BUILD [guessed]
+  --host=HOST       build programs to run on HOST [BUILD]
+  --target=TARGET   configure for building compilers for TARGET [HOST]
+EOF
+fi
+
+if test -n "$ac_init_help"; then
+
+  cat <<\EOF
+
+Optional Packages:
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+
+Optional Features:
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+
+  --with-rel-version=XXX  override derived release version
+  --with-abi-version=XXX  override derived ABI version
+  --with-system-type=XXX  test: override derived host system-type
+  --without-ada           suppress check for Ada compiler, don't build demo
+  --without-cxx           do not adjust ncurses bool to match C++
+  --without-cxx-binding   do not build C++ binding and demo
+  --disable-db-install    suppress install of terminal database
+  --without-manpages      suppress install of manpages
+  --without-progs         suppress build/install with programs (e.g., tic)
+  --without-tack          suppress build/install with tack program
+  --without-tests         suppress build/install with test-programs
+  --without-curses-h      install curses.h as ncurses.h only
+  --with-config-suffix=X  suffixes ncursesXX-config file
+  --with-pkg-config{=path} enable/disable use of pkg-config
+  --with-pkg-config-libdir=XXX use given directory for installing pc-files
+  --enable-pc-files       generate and install .pc files for pkg-config
+  --with-pc-suffix        suffixes pc-files
+  --enable-mixed-case     tic should assume mixed-case filenames
+  --with-install-prefix   prefixes actual install-location ($DESTDIR)
+Build-Tools Needed to Compile Temporary Applications for Cross-compiling:
+  --with-build-cc=XXX     the build C compiler ($BUILD_CC)
+  --with-build-cpp=XXX    the build C preprocessor ($BUILD_CPP)
+  --with-build-cflags=XXX the build C compiler-flags ($BUILD_CFLAGS)
+  --with-build-cppflags=XXX the build C preprocessor-flags ($BUILD_CPPFLAGS)
+  --with-build-ldflags=XXX the build linker-flags ($BUILD_LDFLAGS)
+  --with-build-libs=XXX   the build libraries (${BUILD_LIBS})
+Options to Specify the Libraries Built/Used:
+  --disable-libtool-version  enable to use libtool's incompatible naming scheme
+  --with-libtool          generate libraries with libtool
+  --with-shared           generate shared-libraries
+  --with-normal           generate normal-libraries (default)
+  --with-debug            generate debug-libraries (default)
+  --with-profile          generate profile-libraries
+  --with-cxx-shared       generate C++ shared-libraries
+  --with-lib-prefix       override library-prefix
+  --with-termlib          generate separate terminfo library
+  --with-ticlib           generate separate tic library
+  --enable-rpath          use rpath option when generating shared libraries
+  --disable-relink        relink shared libraries during install
+  --with-shlib-version=X  Specify rel or abi version for shared libs
+  --with-libtool-opts=XXX specify additional libtool options
+  --with-export-syms=XXX  limit exported symbols using libtool
+  --with-versioned-syms=X markup versioned symbols using ld
+  --with-gpm              use Alessandro Rubini's GPM library
+  --without-dlsym         do not use dlsym() to load GPM dynamically
+  --with-pcre2            use PCRE2 for regular-expressions
+  --with-sysmouse         use sysmouse (FreeBSD console)
+  --disable-lib-suffixes  disable library suffixes
+  --disable-rpath-hack    don't add rpath options for additional libraries
+  --disable-pkg-ldflags   disable extra LDFLAGS for package-scripts
+Fine-Tuning Your Configuration:
+  --with-extra-suffix=X   append extra suffix to header/library paths
+  --disable-overwrite     put headers in subdir, omit link to -lcurses
+  --disable-database      do not use terminfo, only fallbacks/termcap
+  --with-database=XXX     specify terminfo source to install
+  --with-hashed-db        specify hashed-database library
+  --with-fallbacks=XXX    specify list of fallback terminal descriptions
+  --with-tic-path=XXX     specify path of tic for fallbacks
+  --with-infocmp-path=XXX     specify path of infocmp for fallbacks
+  --without-xterm-new     specify if xterm terminfo should be old version
+  --with-xterm-kbs=XXX    specify if xterm backspace sends BS or DEL
+  --with-terminfo-dirs=XXX specify list of terminfo directories (default: DATADIR/terminfo)
+  --with-default-terminfo-dir=DIR default terminfo directory (default: DATADIR/terminfo)
+  --disable-big-core      assume machine has little memory
+  --disable-big-strings   assume compiler has only standard-size strings
+  --enable-termcap        compile in termcap fallback support
+  --with-termpath=XXX     specify list of termcap files (default: /etc/termcap:/usr/share/misc/termcap)
+  --enable-getcap         fast termcap load, no xrefs to terminfo
+  --enable-getcap-cache   cache translated termcaps in ~/.terminfo
+  --disable-home-terminfo drop ~/.terminfo from terminfo search-path
+  --disable-root-environ  restrict root use of ncurses environment variables
+  --disable-root-access   restrict file-access when running setuid
+  --enable-symlinks       make tic use symbolic links not hard links
+  --enable-broken_linker  compile with broken-linker support code
+  --enable-bsdpad         recognize BSD-style prefix padding
+  --enable-widec          compile with wide-char/UTF-8 code
+  --disable-lp64          allow chtype to be long (ignore _LP64)
+  --disable-largefile     omit support for large files
+  --disable-tparm-varargs compile tparm() without varargs interface
+  --disable-tic-depends   link tic library without explicit dependency on ncurses library
+  --enable-wattr-macros   enable wattr* macros
+  --with-x11-rgb=FILE   file containing X11 rgb information (EPREFIX/lib/X11/rgb.txt)
+  --with-bool=TYPE        override fallback type of bool variable
+  --with-caps=alt         compile with alternate Caps file
+  --with-chtype=TYPE      override type of chtype
+  --with-ospeed=TYPE      override type of ospeed variable
+  --with-mmask-t=TYPE     override type of mmask_t
+  --with-ccharw-max=XXX   override size CCHARW_MAX
+  --enable-signed-char    compile using signed Boolean's in term.h
+  --with-tparm-arg=TYPE   override parameter type of tparm
+  --with-rcs-ids          compile-in RCS identifiers
+Options to Specify How Manpages are Installed:
+  --with-manpage-format   specify manpage-format: gzip/compress/bzip2/xz,
+                          BSDI/normal and optionally formatted/catonly,
+                          e.g., gzip,formatted
+  --with-manpage-renames  specify manpage-renaming
+  --with-manpage-aliases  specify manpage-aliases using .so
+  --with-manpage-symlinks specify manpage-aliases using symlinks
+  --with-manpage-tbl      specify manpage processing with tbl
+Extensions:
+  --disable-ext-funcs     disable function-extensions
+  --enable-sp-funcs       enable SCREEN-extensions
+  --enable-term-driver    enable terminal-driver
+  --enable-const          compile with extra/non-standard const
+  --enable-ext-colors     compile for 256-color support
+  --enable-ext-mouse      compile for extended mouse-encoding
+  --enable-ext-putwin     compile with extended putwin/screendump
+  --enable-no-padding     compile with $NCURSES_NO_PADDING code
+  --enable-sigwinch       compile with SIGWINCH handler
+  --enable-tcap-names     compile with user-definable terminal capabilities
+Reentrant Code:
+  --with-pthread          use POSIX thread library
+  --enable-pthreads-eintr enable EINTR in wgetch with pthreads
+  --enable-weak-symbols   enable weak-symbols for pthreads
+  --enable-reentrant      compile with reentrant code
+  --enable-opaque-curses  make curses WINDOW, etc., "opaque"
+  --enable-opaque-form    make form-library structures "opaque"
+  --enable-opaque-menu    make menu-library structures "opaque"
+  --enable-opaque-panel   make panel-library structures "opaque"
+  --with-wrap-prefix=XXX  override prefix used for public variables
+Development Code:
+  --without-develop       disable development options
+  --enable-hard-tabs      compile with hard-tabs code
+  --enable-xmc-glitch     compile with support for xmc (magic-cookie)
+Experimental Code:
+  --disable-assumed-color do not assume anything about default-colors
+  --disable-hashmap       compile without hashmap scrolling-optimization
+  --enable-colorfgbg      compile-in experimental $COLORFGBG code
+  --enable-fvisibility    compile with -fvisibility=hidden
+  --enable-interop        compile-in interop bindings
+  --enable-safe-sprintf   compile with experimental safe-sprintf code
+  --disable-scroll-hints  compile without scroll-hints code
+  --enable-wgetch-events  compile with wgetch-events code
+  --enable-exp-win32      compile with experimental-Windows driver
+Testing/development Options:
+  --disable-echo          do not display "compiling" commands
+  --disable-stripping     do not strip (debug info) installed executables
+  --enable-warnings       test: turn on gcc compiler warnings
+  --enable-stdnoreturn    enable C11 _Noreturn feature for diagnostics
+  --enable-string-hacks   work around bogus compiler/loader warnings
+  --enable-assertions     test: turn on generation of assertion code
+  --with-dmalloc          test: use Gray Watson's dmalloc library
+  --with-dbmalloc         test: use Conor Cahill's dbmalloc library
+  --with-valgrind         test: use valgrind
+  --disable-leaks         test: free permanent memory, analyze leaks
+  --enable-expanded       test: generate functions for certain macros
+  --disable-macros        test: use functions rather than macros
+  --with-trace            test: add trace() function to all models of ncurses
+  --disable-gnat-projects test: disable GNAT projects even if usable
+Ada Binding Options:
+  --with-ada-compiler=CMD specify Ada95 compiler command (default gnatmake)
+  --with-ada-include=DIR  Ada includes are in DIR (default: PREFIX/share/ada/adainclude)
+  --with-ada-objects=DIR  Ada objects are in DIR (default: PREFIX/lib/ada/adalib)
+  --with-ada-sharedlib=soname build shared-library (requires GNAT projects)
+  --with-ada-libname=XXX  override default Ada library-name
+  --with-form-libname=XXX override form basename of library
+  --with-menu-libname=XXX override menu basename of library
+  --with-panel-libname=XXX override panel basename of library
+  --with-cxx-libname=XXX override ncurses++ basename of library
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  CPPFLAGS    C/C++ preprocessor flags, e.g. -I<include dir> if you have
+              headers in a nonstandard directory <include dir>
+  CPP         C preprocessor
+  CXX         C++ compiler command
+  CXXFLAGS    C++ compiler flags
+  CXXCPP      C++ preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+EOF
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  ac_popdir=`pwd`
+  for ac_subdir in : $ac_subdirs_all; do test "x$ac_subdir" = x: && continue
+    cd "$ac_subdir"
+    # A "../" for each directory in /$ac_subdir.
+    ac_dots=`echo "$ac_subdir" |
+             sed 's,^\./,,;s,[^/]$,&/,;s,[^/]*/,../,g'`
+
+    case "$srcdir" in
+    .) # No --srcdir option.  We are building in place.
+      ac_sub_srcdir="$srcdir" ;;
+    [\\/]* | ?:[\\/]* ) # Absolute path.
+      ac_sub_srcdir="$srcdir/$ac_subdir" ;;
+    *) # Relative path.
+      ac_sub_srcdir="$ac_dots$srcdir/$ac_subdir" ;;
+    esac
+
+    # Check for guested configure; otherwise get Cygnus style configure.
+    if test -f "$ac_sub_srcdir/configure.gnu"; then
+      echo
+      $SHELL "$ac_sub_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_sub_srcdir/configure"; then
+      echo
+      $SHELL "$ac_sub_srcdir/configure" --help=recursive
+    elif test -f "$ac_sub_srcdir/configure.ac" ||
+           test -f "$ac_sub_srcdir/configure.in"; then
+      echo
+      "$ac_configure" --help
+    else
+      echo "$as_me: WARNING: no configuration information is in $ac_subdir" >&2
+    fi
+    cd "$ac_popdir"
+  done
+fi
+
+test -n "$ac_init_help" && exit 0
+if "$ac_init_version"; then
+  cat <<\EOF
+
+Copyright 2003-2021,2022	Thomas E. Dickey
+Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+EOF
+  exit 0
+fi
+exec 5>config.log
+cat >&5 <<EOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by $as_me, which was
+generated by GNU Autoconf 2.52.20221009.  Invocation command line was
+
+  $ $0 $@
+
+EOF
+{
+cat <<_ASUNAME
+## ---------- ##
+## Platform.  ##
+## ---------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+hostinfo               = `(hostinfo) 2>/dev/null               || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+PATH = $PATH
+
+_ASUNAME
+} >&5
+
+cat >&5 <<EOF
+## ------------ ##
+## Core tests.  ##
+## ------------ ##
+
+EOF
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell meta-characters.
+ac_configure_args=
+ac_sep=
+for ac_arg
+do
+  case "$ac_arg" in
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c) ;;
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+  *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+    ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"`
+    ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
+    ac_sep=" " ;;
+  *) ac_configure_args="$ac_configure_args$ac_sep$ac_arg"
+     ac_sep=" " ;;
+  esac
+  # Get rid of the leading space.
+done
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  echo >&5
+  echo "## ----------------- ##" >&5
+  echo "## Cache variables.  ##" >&5
+  echo "## ----------------- ##" >&5
+  echo >&5
+  # The following way of writing the cache mishandles newlines in values,
+{
+  (set) 2>&1 |
+    case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
+    *ac_space=\ *)
+      sed -n \
+        "s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
+    	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
+      ;;
+    *)
+      sed -n \
+        "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      ;;
+    esac;
+} >&5
+  sed "/^$/d" confdefs.h >conftest.log
+  if test -s conftest.log; then
+    echo >&5
+    echo "## ------------ ##" >&5
+    echo "## confdefs.h.  ##" >&5
+    echo "## ------------ ##" >&5
+    echo >&5
+    cat conftest.log >&5
+  fi
+  (echo; echo) >&5
+  test "$ac_signal" != 0 &&
+    echo "$as_me: caught signal $ac_signal" >&5
+  echo "$as_me: exit $exit_status" >&5
+  rm -rf conftest* confdefs* core core.* *.core conf$$* $ac_clean_files &&
+    exit $exit_status
+     ' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' "$ac_signal"
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo >confdefs.h
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+  if test "x$prefix" != xNONE; then
+    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+  else
+    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+  fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+  if test -r "$ac_site_file"; then
+    { echo "$as_me:1072: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+    cat "$ac_site_file" >&5
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special
+  # files actually), so we avoid doing that.
+  if test -f "$cache_file"; then
+    { echo "$as_me:1083: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . $cache_file;;
+      *)                      . ./$cache_file;;
+    esac
+  fi
+else
+  { echo "$as_me:1091: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in `(set) 2>&1 |
+               sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val="\$ac_cv_env_${ac_var}_value"
+  eval ac_new_val="\$ac_env_${ac_var}_value"
+  case "$ac_old_set,$ac_new_set" in
+    set,)
+      { echo "$as_me:1107: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { echo "$as_me:1111: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+        { echo "$as_me:1117: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+        { echo "$as_me:1119:   former value:  $ac_old_val" >&5
+echo "$as_me:   former value:  $ac_old_val" >&2;}
+        { echo "$as_me:1121:   current value: $ac_new_val" >&5
+echo "$as_me:   current value: $ac_new_val" >&2;}
+        ac_cache_corrupted=:
+      fi;;
+  esac
+  # Pass precious variables to config.status.  It doesn't matter if
+  # we pass some twice (in addition to the command line arguments).
+  if test "$ac_new_set" = set; then
+    case "$ac_new_val" in
+    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+      ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"`
+      ac_configure_args="$ac_configure_args '$ac_arg'"
+      ;;
+    *) ac_configure_args="$ac_configure_args $ac_var=$ac_new_val"
+       ;;
+    esac
+  fi
+done
+if "$ac_cache_corrupted"; then
+  { echo "$as_me:1140: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  { { echo "$as_me:1142: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
+ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_main_return="return"
+
+case `echo "testing\c" 2>/dev/null; echo 1,2,3`,`echo -n testing 2>/dev/null; echo 1,2,3` in
+  *c*,-n*) ECHO_N=
+           ECHO_C=      # newlines do not sed ;-) only broken shells would use this case anyway
+           ECHO_T='	'
+           ;;
+  *c*,*  ) ECHO_N=-n
+           ECHO_C=
+           ECHO_T=
+           ;;
+  *)       ECHO_N=
+           ECHO_C='\c'
+           ECHO_T=
+           ;;
+esac
+echo "#! $SHELL" >conftest.sh
+echo  "exit 0"   >>conftest.sh
+chmod +x conftest.sh
+if { (echo "$as_me:1171: PATH=\".;.\"; conftest.sh") >&5
+  (PATH=".;."; conftest.sh) 2>&5
+  ac_status=$?
+  echo "$as_me:1174: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; then
+  ac_path_separator=';'
+else
+  ac_path_separator=:
+fi
+PATH_SEPARATOR="$ac_path_separator"
+rm -f conftest.sh
+
+ac_config_headers="$ac_config_headers include/ncurses_cfg.h:include/ncurses_cfg.hin"
+
+top_builddir=`pwd`
+
+for ac_prog in ggrep grep
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:1191: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_GREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$GREP"; then
+  ac_cv_prog_GREP="$GREP" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_GREP="$ac_prog"
+echo "$as_me:1206: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+GREP=$ac_cv_prog_GREP
+if test -n "$GREP"; then
+  echo "$as_me:1214: result: $GREP" >&5
+echo "${ECHO_T}$GREP" >&6
+else
+  echo "$as_me:1217: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$GREP" && break
+done
+test -n "$GREP" || GREP=": "
+
+echo "$as_me:1225: checking for egrep" >&5
+echo $ECHO_N "checking for egrep... $ECHO_C" >&6
+if test "${ac_cv_path_EGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     for ac_prog in gegrep egrep
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:1237: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_EGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $EGREP in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_EGREP="$EGREP" # Let the user override the test with a path.
+  ;;
+  *)
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  if $as_executable_p "$ac_dir/$ac_word"; then
+   ac_cv_path_EGREP="$ac_dir/$ac_word"
+   echo "$as_me:1254: found $ac_dir/$ac_word" >&5
+   break
+fi
+done
+
+  ;;
+esac
+fi
+EGREP=$ac_cv_path_EGREP
+
+if test -n "$EGREP"; then
+  echo "$as_me:1265: result: $EGREP" >&5
+echo "${ECHO_T}$EGREP" >&6
+else
+  echo "$as_me:1268: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$EGREP" && break
+done
+test -n "$EGREP" || EGREP=": "
+
+     test "x$ac_cv_path_EGREP" = "x:" && { { echo "$as_me:1276: error: cannot find workable egrep" >&5
+echo "$as_me: error: cannot find workable egrep" >&2;}
+   { (exit 1); exit 1; }; }
+   fi
+fi
+echo "$as_me:1281: result: $ac_cv_path_EGREP" >&5
+echo "${ECHO_T}$ac_cv_path_EGREP" >&6
+ EGREP="$ac_cv_path_EGREP"
+
+NCURSES_MAJOR="`${EGREP-egrep} '^NCURSES_MAJOR[ 	]*=' "$srcdir/dist.mk" | sed -e 's/^[^0-9]*//'`"
+NCURSES_MINOR="`${EGREP-egrep} '^NCURSES_MINOR[ 	]*=' "$srcdir/dist.mk" | sed -e 's/^[^0-9]*//'`"
+NCURSES_PATCH="`${EGREP-egrep} '^NCURSES_PATCH[ 	]*=' "$srcdir/dist.mk" | sed -e 's/^[^0-9]*//'`"
+cf_cv_abi_version=${NCURSES_MAJOR}
+cf_cv_rel_version=${NCURSES_MAJOR}.${NCURSES_MINOR}
+cf_cv_timestamp=`date`
+echo "$as_me:1291: result: Configuring NCURSES $cf_cv_rel_version ABI $cf_cv_abi_version ($cf_cv_timestamp)" >&5
+echo "${ECHO_T}Configuring NCURSES $cf_cv_rel_version ABI $cf_cv_abi_version ($cf_cv_timestamp)" >&6
+
+if test -f "$srcdir/VERSION" ; then
+	echo "$as_me:1295: checking for package version" >&5
+echo $ECHO_N "checking for package version... $ECHO_C" >&6
+
+	# if there are not enough fields, cut returns the last one...
+	cf_field1=`sed -e '2,$d' "$srcdir/VERSION" |cut -f1`
+	cf_field2=`sed -e '2,$d' "$srcdir/VERSION" |cut -f2`
+	cf_field3=`sed -e '2,$d' "$srcdir/VERSION" |cut -f3`
+
+	# this is how CF_BUNDLED_INTL uses $VERSION:
+	VERSION="$cf_field1"
+
+	VERSION_MAJOR=`echo "$cf_field2" | sed -e 's/\..*//'`
+	test -z "$VERSION_MAJOR" && { { echo "$as_me:1307: error: missing major-version" >&5
+echo "$as_me: error: missing major-version" >&2;}
+   { (exit 1); exit 1; }; }
+
+	VERSION_MINOR=`echo "$cf_field2" | sed -e 's/^[^.]*\.//' -e 's/-.*//'`
+	test -z "$VERSION_MINOR" && { { echo "$as_me:1312: error: missing minor-version" >&5
+echo "$as_me: error: missing minor-version" >&2;}
+   { (exit 1); exit 1; }; }
+
+	echo "$as_me:1316: result: ${VERSION_MAJOR}.${VERSION_MINOR}" >&5
+echo "${ECHO_T}${VERSION_MAJOR}.${VERSION_MINOR}" >&6
+
+	echo "$as_me:1319: checking for package patch date" >&5
+echo $ECHO_N "checking for package patch date... $ECHO_C" >&6
+	VERSION_PATCH=`echo "$cf_field3" | sed -e 's/^[^-]*-//'`
+	case .$VERSION_PATCH in
+	(.)
+		{ { echo "$as_me:1324: error: missing patch-date $VERSION_PATCH" >&5
+echo "$as_me: error: missing patch-date $VERSION_PATCH" >&2;}
+   { (exit 1); exit 1; }; }
+		;;
+	(.[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9])
+		;;
+	(*)
+		{ { echo "$as_me:1331: error: illegal patch-date $VERSION_PATCH" >&5
+echo "$as_me: error: illegal patch-date $VERSION_PATCH" >&2;}
+   { (exit 1); exit 1; }; }
+		;;
+	esac
+	echo "$as_me:1336: result: $VERSION_PATCH" >&5
+echo "${ECHO_T}$VERSION_PATCH" >&6
+else
+	{ { echo "$as_me:1339: error: did not find $srcdir/VERSION" >&5
+echo "$as_me: error: did not find $srcdir/VERSION" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+# show the actual data that we have for versions:
+test -n "$verbose" && echo "	ABI VERSION $VERSION" 1>&6
+
+echo "${as_me:-configure}:1347: testing ABI VERSION $VERSION ..." 1>&5
+
+test -n "$verbose" && echo "	VERSION_MAJOR $VERSION_MAJOR" 1>&6
+
+echo "${as_me:-configure}:1351: testing VERSION_MAJOR $VERSION_MAJOR ..." 1>&5
+
+test -n "$verbose" && echo "	VERSION_MINOR $VERSION_MINOR" 1>&6
+
+echo "${as_me:-configure}:1355: testing VERSION_MINOR $VERSION_MINOR ..." 1>&5
+
+test -n "$verbose" && echo "	VERSION_PATCH $VERSION_PATCH" 1>&6
+
+echo "${as_me:-configure}:1359: testing VERSION_PATCH $VERSION_PATCH ..." 1>&5
+
+	cf_PACKAGE=NCURSES
+	PACKAGE=ncurses
+
+cat >>confdefs.h <<EOF
+#define PACKAGE "$PACKAGE"
+EOF
+
+cf_PACKAGE=`echo "$cf_PACKAGE" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+	cat >>confdefs.h <<EOF
+#define ${cf_PACKAGE}_VERSION "${VERSION_MAJOR}.${VERSION_MINOR}"
+EOF
+
+	cat >>confdefs.h <<EOF
+#define ${cf_PACKAGE}_PATCHDATE ${VERSION_PATCH}
+EOF
+
+test -z "$cf_cv_rel_version" && cf_cv_rel_version=0.0
+
+# Check whether --with-rel-version or --without-rel-version was given.
+if test "${with_rel_version+set}" = set; then
+  withval="$with_rel_version"
+  { echo "$as_me:1383: WARNING: overriding release version $cf_cv_rel_version to $withval" >&5
+echo "$as_me: WARNING: overriding release version $cf_cv_rel_version to $withval" >&2;}
+ cf_cv_rel_version=$withval
+fi;
+
+ NCURSES_MAJOR=`echo "$cf_cv_rel_version" | sed -e 's/\..*//'`
+ NCURSES_MINOR=`echo "$cf_cv_rel_version" | sed -e 's/^[^.]*//' -e 's/^\.//' -e 's/\..*//'`
+
+if test -n "$NCURSES_MAJOR" ; then
+  case $NCURSES_MAJOR in
+  ([0-9]*)
+ 	;;
+  (*)
+	{ { echo "$as_me:1396: error: Release major-version is not a number: $NCURSES_MAJOR" >&5
+echo "$as_me: error: Release major-version is not a number: $NCURSES_MAJOR" >&2;}
+   { (exit 1); exit 1; }; }
+ 	;;
+  esac
+else
+  { { echo "$as_me:1402: error: Release major-version value is empty" >&5
+echo "$as_me: error: Release major-version value is empty" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+if test -n "$NCURSES_MINOR" ; then
+  case $NCURSES_MINOR in
+  ([0-9]*)
+ 	;;
+  (*)
+	{ { echo "$as_me:1412: error: Release minor-version is not a number: $NCURSES_MINOR" >&5
+echo "$as_me: error: Release minor-version is not a number: $NCURSES_MINOR" >&2;}
+   { (exit 1); exit 1; }; }
+ 	;;
+  esac
+else
+  { { echo "$as_me:1418: error: Release minor-version value is empty" >&5
+echo "$as_me: error: Release minor-version value is empty" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+test -z "$cf_cv_abi_version" && cf_cv_abi_version=0
+
+# Check whether --with-abi-version or --without-abi-version was given.
+if test "${with_abi_version+set}" = set; then
+  withval="$with_abi_version"
+
+	if test "x$cf_cv_abi_version" != "x$withval"
+	then
+		{ echo "$as_me:1431: WARNING: overriding ABI version $cf_cv_abi_version to $withval" >&5
+echo "$as_me: WARNING: overriding ABI version $cf_cv_abi_version to $withval" >&2;}
+		case "$cf_cv_rel_version" in
+		(5.*)
+			cf_cv_rel_version=$withval.0
+			;;
+		(6.*)
+			cf_cv_rel_version=$withval.9	# FIXME: should be 10 as of 6.0 release
+			;;
+		esac
+	fi
+	cf_cv_abi_version=$withval
+fi;
+
+if test -n "$cf_cv_abi_version" ; then
+  case $cf_cv_abi_version in
+  ([0-9]*)
+ 	;;
+  (*)
+	{ { echo "$as_me:1450: error: ABI version is not a number: $cf_cv_abi_version" >&5
+echo "$as_me: error: ABI version is not a number: $cf_cv_abi_version" >&2;}
+   { (exit 1); exit 1; }; }
+ 	;;
+  esac
+else
+  { { echo "$as_me:1456: error: ABI version value is empty" >&5
+echo "$as_me: error: ABI version value is empty" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+if test "x$cf_cv_abi_version" != "x$with_abi_version"
+then
+	case "$cf_cv_rel_version" in
+	(5.*)
+		cf_cv_rel_version=$with_abi_version.0
+		;;
+	esac
+fi
+
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+  if test -f "$ac_dir/install-sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f "$ac_dir/install.sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f "$ac_dir/shtool"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  { { echo "$as_me:1487: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5
+echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"
+ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
+
+# Make sure we can run config.sub.
+$ac_config_sub sun4 >/dev/null 2>&1 ||
+  { { echo "$as_me:1497: error: cannot run $ac_config_sub" >&5
+echo "$as_me: error: cannot run $ac_config_sub" >&2;}
+   { (exit 1); exit 1; }; }
+
+echo "$as_me:1501: checking build system type" >&5
+echo $ECHO_N "checking build system type... $ECHO_C" >&6
+if test "${ac_cv_build+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_build_alias=$build_alias
+test -z "$ac_cv_build_alias" &&
+  ac_cv_build_alias=`$ac_config_guess`
+test -z "$ac_cv_build_alias" &&
+  { { echo "$as_me:1510: error: cannot guess build type; you must specify one" >&5
+echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
+   { (exit 1); exit 1; }; }
+ac_cv_build=`$ac_config_sub "$ac_cv_build_alias"` ||
+  { { echo "$as_me:1514: error: $ac_config_sub $ac_cv_build_alias failed." >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed." >&2;}
+   { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:1519: result: $ac_cv_build" >&5
+echo "${ECHO_T}$ac_cv_build" >&6
+build=$ac_cv_build
+build_cpu=`echo "$ac_cv_build" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo "$ac_cv_build" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo "$ac_cv_build" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+echo "$as_me:1526: checking host system type" >&5
+echo $ECHO_N "checking host system type... $ECHO_C" >&6
+if test "${ac_cv_host+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_host_alias=$host_alias
+test -z "$ac_cv_host_alias" &&
+  ac_cv_host_alias=$ac_cv_build_alias
+ac_cv_host=`$ac_config_sub "$ac_cv_host_alias"` ||
+  { { echo "$as_me:1535: error: $ac_config_sub $ac_cv_host_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;}
+   { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:1540: result: $ac_cv_host" >&5
+echo "${ECHO_T}$ac_cv_host" >&6
+host=$ac_cv_host
+host_cpu=`echo "$ac_cv_host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo "$ac_cv_host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo "$ac_cv_host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+if test -f "$srcdir/config.guess" || test -f "$ac_aux_dir/config.guess" ; then
+	echo "$as_me:1548: checking target system type" >&5
+echo $ECHO_N "checking target system type... $ECHO_C" >&6
+if test "${ac_cv_target+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_target_alias=$target_alias
+test "x$ac_cv_target_alias" = "x" &&
+  ac_cv_target_alias=$ac_cv_host_alias
+ac_cv_target=`$ac_config_sub "$ac_cv_target_alias"` ||
+  { { echo "$as_me:1557: error: $ac_config_sub $ac_cv_target_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_target_alias failed" >&2;}
+   { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:1562: result: $ac_cv_target" >&5
+echo "${ECHO_T}$ac_cv_target" >&6
+target=$ac_cv_target
+target_cpu=`echo "$ac_cv_target" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+target_vendor=`echo "$ac_cv_target" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+target_os=`echo "$ac_cv_target" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+test -n "$target_alias" &&
+  test "$program_prefix$program_suffix$program_transform_name" = \
+    NONENONEs,x,x, &&
+  program_prefix=${target_alias}-
+	system_name="$host_os"
+else
+	system_name="`(uname -s -r) 2>/dev/null`"
+	if test -z "$system_name" ; then
+		system_name="`(hostname) 2>/dev/null`"
+	fi
+fi
+test -n "$system_name" &&
+cat >>confdefs.h <<EOF
+#define SYSTEM_NAME "$system_name"
+EOF
+
+if test "${cf_cv_system_name+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cf_cv_system_name="$system_name"
+fi
+
+test -z "$system_name" && system_name="$cf_cv_system_name"
+test -n "$cf_cv_system_name" && echo "$as_me:1594: result: Configuring for $cf_cv_system_name" >&5
+echo "${ECHO_T}Configuring for $cf_cv_system_name" >&6
+
+if test ".$system_name" != ".$cf_cv_system_name" ; then
+	echo "$as_me:1598: result: Cached system name ($system_name) does not agree with actual ($cf_cv_system_name)" >&5
+echo "${ECHO_T}Cached system name ($system_name) does not agree with actual ($cf_cv_system_name)" >&6
+	{ { echo "$as_me:1600: error: \"Please remove config.cache and try again.\"" >&5
+echo "$as_me: error: \"Please remove config.cache and try again.\"" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+# Check whether --with-system-type or --without-system-type was given.
+if test "${with_system_type+set}" = set; then
+  withval="$with_system_type"
+  { echo "$as_me:1608: WARNING: overriding system type to $withval" >&5
+echo "$as_me: WARNING: overriding system type to $withval" >&2;}
+	cf_cv_system_name=$withval
+	host_os=$withval
+
+fi;
+
+###	Save the given $CFLAGS to allow user-override.
+cf_user_CFLAGS="$CFLAGS"
+
+###	Default install-location
+echo "$as_me:1619: checking for fgrep" >&5
+echo $ECHO_N "checking for fgrep... $ECHO_C" >&6
+if test "${ac_cv_path_FGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
+   then ac_cv_path_FGREP="$GREP -F"
+   else
+     for ac_prog in gfgrep fgrep
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:1631: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_FGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $FGREP in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_FGREP="$FGREP" # Let the user override the test with a path.
+  ;;
+  *)
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  if $as_executable_p "$ac_dir/$ac_word"; then
+   ac_cv_path_FGREP="$ac_dir/$ac_word"
+   echo "$as_me:1648: found $ac_dir/$ac_word" >&5
+   break
+fi
+done
+
+  ;;
+esac
+fi
+FGREP=$ac_cv_path_FGREP
+
+if test -n "$FGREP"; then
+  echo "$as_me:1659: result: $FGREP" >&5
+echo "${ECHO_T}$FGREP" >&6
+else
+  echo "$as_me:1662: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$FGREP" && break
+done
+test -n "$FGREP" || FGREP=": "
+
+     test "x$ac_cv_path_FGREP" = "x:" && { { echo "$as_me:1670: error: cannot find workable fgrep" >&5
+echo "$as_me: error: cannot find workable fgrep" >&2;}
+   { (exit 1); exit 1; }; }
+   fi
+fi
+echo "$as_me:1675: result: $ac_cv_path_FGREP" >&5
+echo "${ECHO_T}$ac_cv_path_FGREP" >&6
+ FGREP="$ac_cv_path_FGREP"
+
+echo "$as_me:1679: checking for prefix" >&5
+echo $ECHO_N "checking for prefix... $ECHO_C" >&6
+if test "x$prefix" = "xNONE" ; then
+	case "$cf_cv_system_name" in
+		# non-vendor systems don't have a conflict
+	(openbsd*|freebsd*|mirbsd*|linux*|cygwin*|msys*|k*bsd*-gnu|mingw*)
+		prefix=/usr
+		;;
+	(*)	prefix=$ac_default_prefix
+		;;
+	esac
+fi
+echo "$as_me:1691: result: $prefix" >&5
+echo "${ECHO_T}$prefix" >&6
+
+if test "x$prefix" = "xNONE" ; then
+echo "$as_me:1695: checking for default include-directory" >&5
+echo $ECHO_N "checking for default include-directory... $ECHO_C" >&6
+test -n "$verbose" && echo 1>&6
+for cf_symbol in \
+	"$includedir" \
+	"$includedir/ncurses" \
+	"$prefix/include" \
+	"$prefix/include/ncurses" \
+	/usr/local/include \
+	/usr/local/include/ncurses \
+	/usr/include \
+	/usr/include/ncurses
+do
+	cf_dir=`eval echo "$cf_symbol"`
+	if test -f "$cf_dir/curses.h" ; then
+	if ( ${FGREP-fgrep} NCURSES_VERSION "$cf_dir/curses.h" >/dev/null 2>&1 ) ; then
+		includedir="$cf_symbol"
+		test -n "$verbose"  && echo $ECHO_N "	found " 1>&6
+		break
+	fi
+	fi
+	test -n "$verbose"  && echo "	tested $cf_dir" 1>&6
+done
+echo "$as_me:1718: result: $includedir" >&5
+echo "${ECHO_T}$includedir" >&6
+fi
+
+### Defaults for ncurses ABI
+
+# ABI 5 defaults:
+cf_dft_ccharw_max=5
+cf_dft_chtype=auto
+cf_dft_ext_colors=no
+cf_dft_ext_const=no
+cf_dft_ext_mouse=no
+cf_dft_ext_putwin=no
+cf_dft_ext_spfuncs=no
+cf_dft_filter_syms=no
+cf_dft_interop=no
+cf_dft_mmask_t=auto
+cf_dft_opaque_curses=no
+cf_dft_ordinate_type=short
+cf_dft_signed_char=no
+cf_dft_tparm_arg=long
+cf_dft_with_lp64=no
+
+# ABI 6 defaults:
+case x$cf_cv_abi_version in
+(x[6789])
+	cf_dft_chtype=uint32_t
+	cf_dft_ext_colors=yes
+	cf_dft_ext_const=yes
+	cf_dft_ext_mouse=yes
+	cf_dft_ext_putwin=yes
+	cf_dft_ext_spfuncs=yes
+	cf_dft_filter_syms=yes
+	cf_dft_interop=yes
+	cf_dft_mmask_t=uint32_t
+	cf_dft_tparm_arg=intptr_t
+	cf_dft_with_lp64=yes
+	;;
+esac
+
+# ABI 7 defaults:
+case x$cf_cv_abi_version in
+(x[789])
+	cf_dft_ccharw_max=6
+	cf_dft_mmask_t=uint64_t
+	cf_dft_opaque_curses=yes
+	cf_dft_ordinate_type=int
+	cf_dft_signed_char=yes
+	# also: remove the wgetch-events feature in ABI 7
+	;;
+esac
+
+###	Checks for programs.
+
+# Check whether --with-ada or --without-ada was given.
+if test "${with_ada+set}" = set; then
+  withval="$with_ada"
+  cf_with_ada=$withval
+else
+  cf_with_ada=yes
+fi;
+
+if test "x$cf_with_ada" = xyes
+then
+	cf_prog_cc="gnatgcc gcc cc"
+else
+	cf_prog_cc="gcc cc"
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
+ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_main_return="return"
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in $cf_prog_cc
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:1798: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+echo "$as_me:1813: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:1821: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:1824: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in $cf_prog_cc
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:1837: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ac_ct_CC="$ac_prog"
+echo "$as_me:1852: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:1860: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:1863: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$ac_ct_CC" && break
+done
+
+  CC=$ac_ct_CC
+fi
+
+test -z "$CC" && { { echo "$as_me:1873: error: no acceptable cc found in \$PATH" >&5
+echo "$as_me: error: no acceptable cc found in \$PATH" >&2;}
+   { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:1878:" \
+     "checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo "$2"`
+{ (eval echo "$as_me:1881: \"$ac_compiler --version </dev/null >&5\"") >&5
+  (eval $ac_compiler --version </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:1884: \$? = $ac_status" >&5
+  (exit "$ac_status"); }
+{ (eval echo "$as_me:1886: \"$ac_compiler -v </dev/null >&5\"") >&5
+  (eval $ac_compiler -v </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:1889: \$? = $ac_status" >&5
+  (exit "$ac_status"); }
+{ (eval echo "$as_me:1891: \"$ac_compiler -V </dev/null >&5\"") >&5
+  (eval $ac_compiler -V </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:1894: \$? = $ac_status" >&5
+  (exit "$ac_status"); }
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 1898 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+echo "$as_me:1914: checking for C compiler default output" >&5
+echo $ECHO_N "checking for C compiler default output... $ECHO_C" >&6
+ac_link_default=`echo "$ac_link" | sed 's/ -o *"conftest[^"]*"//'`
+if { (eval echo "$as_me:1917: \"$ac_link_default\"") >&5
+  (eval $ac_link_default) 2>&5
+  ac_status=$?
+  echo "$as_me:1920: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; then
+  # Find the output, starting from the most likely.  This scheme is
+# not robust to junk in `.', hence go to wildcards (a.*) only as a last
+# resort.
+for ac_file in `ls a.exe conftest.exe 2>/dev/null;
+                ls a.out conftest 2>/dev/null;
+                ls a.* conftest.* 2>/dev/null`; do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.dbg | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+    a.out ) # We found the default executable, but exeext='' is most
+            # certainly right.
+            break;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+          # FIXME: I believe we export ac_cv_exeext for Libtool --akim.
+          export ac_cv_exeext
+          break;;
+    * ) break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+{ { echo "$as_me:1943: error: C compiler cannot create executables" >&5
+echo "$as_me: error: C compiler cannot create executables" >&2;}
+   { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+echo "$as_me:1949: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6
+
+# Check the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:1954: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+  if { ac_try='./$ac_file'
+  { (eval echo "$as_me:1960: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:1963: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+	cross_compiling=yes
+    else
+	{ { echo "$as_me:1970: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'." >&5
+echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'." >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+  fi
+fi
+echo "$as_me:1978: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+rm -f a.out a.exe "conftest$ac_cv_exeext"
+ac_clean_files=$ac_clean_files_save
+# Check the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:1985: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
+echo "$as_me:1987: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6
+
+echo "$as_me:1990: checking for executable suffix" >&5
+echo $ECHO_N "checking for executable suffix... $ECHO_C" >&6
+if { (eval echo "$as_me:1992: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:1995: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; then
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in `(ls conftest.exe; ls conftest; ls conftest.*) 2>/dev/null`; do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.dbg | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+          export ac_cv_exeext
+          break;;
+    * ) break;;
+  esac
+done
+else
+  { { echo "$as_me:2011: error: cannot compute EXEEXT: cannot compile and link" >&5
+echo "$as_me: error: cannot compute EXEEXT: cannot compile and link" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f "conftest$ac_cv_exeext"
+echo "$as_me:2017: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6
+
+rm -f "conftest.$ac_ext"
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+echo "$as_me:2023: checking for object suffix" >&5
+echo $ECHO_N "checking for object suffix... $ECHO_C" >&6
+if test "${ac_cv_objext+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 2029 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (eval echo "$as_me:2041: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:2044: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; then
+  for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.dbg | *.pdb | *.xSYM | *.map | *.inf ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+{ { echo "$as_me:2056: error: cannot compute OBJEXT: cannot compile" >&5
+echo "$as_me: error: cannot compute OBJEXT: cannot compile" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f "conftest.$ac_cv_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:2063: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+echo "$as_me:2067: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 2073 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:2088: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:2091: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:2094: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:2097: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_compiler_gnu=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:2109: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+CFLAGS="-g"
+echo "$as_me:2115: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 2121 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:2133: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:2136: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:2139: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:2142: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_prog_cc_g=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:2152: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+# Some people use a C++ compiler to compile C.  Since we use `exit',
+# in C++ we need to declare it.  In case someone uses the same compiler
+# for both compiling C and C++ we need to have the C++ compiler decide
+# the declaration of exit, since it's the most demanding environment.
+cat >"conftest.$ac_ext" <<_ACEOF
+#ifndef __cplusplus
+  choke me
+#endif
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:2179: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:2182: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:2185: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:2188: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  for ac_declaration in \
+   ''\
+   '#include <stdlib.h>' \
+   'extern "C" void std::exit (int) throw (); using std::exit;' \
+   'extern "C" void std::exit (int); using std::exit;' \
+   'extern "C" void exit (int) throw ();' \
+   'extern "C" void exit (int);' \
+   'void exit (int);'
+do
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 2200 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+$ac_declaration
+int
+main (void)
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:2213: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:2216: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:2219: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:2222: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+continue
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 2232 "configure"
+#include "confdefs.h"
+$ac_declaration
+int
+main (void)
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:2244: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:2247: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:2250: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:2253: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+done
+rm -rf conftest*
+if test -n "$ac_declaration"; then
+  echo '#ifdef __cplusplus' >>confdefs.h
+  echo "$ac_declaration"    >>confdefs.h
+  echo '#endif'             >>confdefs.h
+fi
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
+ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_main_return="return"
+
+GCC_VERSION=none
+if test "$GCC" = yes ; then
+	echo "$as_me:2283: checking version of $CC" >&5
+echo $ECHO_N "checking version of $CC... $ECHO_C" >&6
+	GCC_VERSION="`${CC} --version 2>/dev/null | sed -e '2,$d' -e 's/^.*(GCC[^)]*) //' -e 's/^.*(Debian[^)]*) //' -e 's/^[^0-9.]*//' -e 's/[^0-9.].*//'`"
+	test -z "$GCC_VERSION" && GCC_VERSION=unknown
+	echo "$as_me:2287: result: $GCC_VERSION" >&5
+echo "${ECHO_T}$GCC_VERSION" >&6
+fi
+
+INTEL_COMPILER=no
+
+if test "$GCC" = yes ; then
+	case "$host_os" in
+	(linux*|gnu*)
+		echo "$as_me:2296: checking if this is really Intel C compiler" >&5
+echo $ECHO_N "checking if this is really Intel C compiler... $ECHO_C" >&6
+		cf_save_CFLAGS="$CFLAGS"
+		CFLAGS="$CFLAGS -no-gcc"
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 2301 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+
+#ifdef __INTEL_COMPILER
+#else
+make an error
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:2318: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:2321: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:2324: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:2327: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  INTEL_COMPILER=yes
+cf_save_CFLAGS="$cf_save_CFLAGS -we147"
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+		CFLAGS="$cf_save_CFLAGS"
+		echo "$as_me:2338: result: $INTEL_COMPILER" >&5
+echo "${ECHO_T}$INTEL_COMPILER" >&6
+		;;
+	esac
+fi
+
+CLANG_COMPILER=no
+
+if test "$GCC" = yes ; then
+	echo "$as_me:2347: checking if this is really Clang C compiler" >&5
+echo $ECHO_N "checking if this is really Clang C compiler... $ECHO_C" >&6
+	cf_save_CFLAGS="$CFLAGS"
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 2351 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+
+#ifdef __clang__
+#else
+make an error
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:2368: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:2371: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:2374: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:2377: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  CLANG_COMPILER=yes
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+	CFLAGS="$cf_save_CFLAGS"
+	echo "$as_me:2387: result: $CLANG_COMPILER" >&5
+echo "${ECHO_T}$CLANG_COMPILER" >&6
+fi
+
+CLANG_VERSION=none
+
+if test "x$CLANG_COMPILER" = "xyes" ; then
+	case "$CC" in
+	(c[1-9][0-9]|*/c[1-9][0-9])
+		{ echo "$as_me:2396: WARNING: replacing broken compiler alias $CC" >&5
+echo "$as_me: WARNING: replacing broken compiler alias $CC" >&2;}
+		CFLAGS="$CFLAGS -std=`echo "$CC" | sed -e 's%.*/%%'`"
+		CC=clang
+		;;
+	esac
+
+	echo "$as_me:2403: checking version of $CC" >&5
+echo $ECHO_N "checking version of $CC... $ECHO_C" >&6
+	CLANG_VERSION="`$CC --version 2>/dev/null | sed -e '2,$d' -e 's/^.*(CLANG[^)]*) //' -e 's/^.*(Debian[^)]*) //' -e 's/^[^0-9.]*//' -e 's/[^0-9.].*//'`"
+	test -z "$CLANG_VERSION" && CLANG_VERSION=unknown
+	echo "$as_me:2407: result: $CLANG_VERSION" >&5
+echo "${ECHO_T}$CLANG_VERSION" >&6
+
+	for cf_clang_opt in \
+		-Qunused-arguments \
+		-Wno-error=implicit-function-declaration
+	do
+		echo "$as_me:2414: checking if option $cf_clang_opt works" >&5
+echo $ECHO_N "checking if option $cf_clang_opt works... $ECHO_C" >&6
+		cf_save_CFLAGS="$CFLAGS"
+		CFLAGS="$CFLAGS $cf_clang_opt"
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 2419 "configure"
+#include "confdefs.h"
+
+			#include <stdio.h>
+int
+main (void)
+{
+
+			printf("hello!\\n");
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:2433: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:2436: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:2439: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:2442: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+			cf_clang_optok=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+			cf_clang_optok=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+		echo "$as_me:2453: result: $cf_clang_optok" >&5
+echo "${ECHO_T}$cf_clang_optok" >&6
+		CFLAGS="$cf_save_CFLAGS"
+		if test "$cf_clang_optok" = yes; then
+			test -n "$verbose" && echo "	adding option $cf_clang_opt" 1>&6
+
+echo "${as_me:-configure}:2459: testing adding option $cf_clang_opt ..." 1>&5
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_clang_opt"
+
+		fi
+	done
+fi
+
+echo "$as_me:2468: checking for $CC option to accept ANSI C" >&5
+echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_stdc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_prog_cc_stdc=no
+ac_save_CC=$CC
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 2476 "configure"
+#include "confdefs.h"
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main (void)
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX			-qlanglvl=ansi
+# Ultrix and OSF/1	-std1
+# HP-UX 10.20 and later	-Ae
+# HP-UX older versions	-Aa -D_HPUX_SOURCE
+# SVR4			-Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:2525: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:2528: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:2531: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:2534: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_prog_cc_stdc=$ac_arg
+break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext"
+done
+rm -f "conftest.$ac_ext" "conftest.$ac_objext"
+CC=$ac_save_CC
+
+fi
+
+case "x$ac_cv_prog_cc_stdc" in
+  x|xno)
+    echo "$as_me:2551: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6 ;;
+  *)
+    echo "$as_me:2554: result: $ac_cv_prog_cc_stdc" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
+    CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+
+# This should have been defined by AC_PROG_CC
+: "${CC:=cc}"
+
+echo "$as_me:2562: checking \$CFLAGS variable" >&5
+echo $ECHO_N "checking \$CFLAGS variable... $ECHO_C" >&6
+case "x$CFLAGS" in
+(*-[IUD]*)
+	echo "$as_me:2566: result: broken" >&5
+echo "${ECHO_T}broken" >&6
+	{ echo "$as_me:2568: WARNING: your environment uses the CFLAGS variable to hold CPPFLAGS options" >&5
+echo "$as_me: WARNING: your environment uses the CFLAGS variable to hold CPPFLAGS options" >&2;}
+	cf_flags="$CFLAGS"
+	CFLAGS=
+	for cf_arg in $cf_flags
+	do
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_arg
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+	done
+	;;
+(*)
+	echo "$as_me:2676: result: ok" >&5
+echo "${ECHO_T}ok" >&6
+	;;
+esac
+
+echo "$as_me:2681: checking \$CC variable" >&5
+echo $ECHO_N "checking \$CC variable... $ECHO_C" >&6
+case "$CC" in
+(*[\ \	]-*)
+	echo "$as_me:2685: result: broken" >&5
+echo "${ECHO_T}broken" >&6
+	{ echo "$as_me:2687: WARNING: your environment uses the CC variable to hold CFLAGS/CPPFLAGS options" >&5
+echo "$as_me: WARNING: your environment uses the CC variable to hold CFLAGS/CPPFLAGS options" >&2;}
+	# humor him...
+	cf_prog=`echo "$CC" | sed -e 's/	/ /g' -e 's/[ ]* / /g' -e 's/[ ]*[ ]-[^ ].*//'`
+	cf_flags=`echo "$CC" | ${AWK:-awk} -v prog="$cf_prog" '{ printf("%s", substr($0,1+length(prog))); }'`
+	CC="$cf_prog"
+	for cf_arg in $cf_flags
+	do
+		case "x$cf_arg" in
+		(x-[IUDfgOW]*)
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_arg
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+			;;
+		(*)
+			CC="$CC $cf_arg"
+			;;
+		esac
+	done
+	test -n "$verbose" && echo "	resulting CC: '$CC'" 1>&6
+
+echo "${as_me:-configure}:2804: testing resulting CC: '$CC' ..." 1>&5
+
+	test -n "$verbose" && echo "	resulting CFLAGS: '$CFLAGS'" 1>&6
+
+echo "${as_me:-configure}:2808: testing resulting CFLAGS: '$CFLAGS' ..." 1>&5
+
+	test -n "$verbose" && echo "	resulting CPPFLAGS: '$CPPFLAGS'" 1>&6
+
+echo "${as_me:-configure}:2812: testing resulting CPPFLAGS: '$CPPFLAGS' ..." 1>&5
+
+	;;
+(*)
+	echo "$as_me:2816: result: ok" >&5
+echo "${ECHO_T}ok" >&6
+	;;
+esac
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
+ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_main_return="return"
+echo "$as_me:2827: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if test "${ac_cv_prog_CPP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 2848 "configure"
+#include "confdefs.h"
+#include <assert.h>
+                     Syntax error
+_ACEOF
+if { (eval echo "$as_me:2853: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:2859: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err "conftest.$ac_ext"
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 2882 "configure"
+#include "confdefs.h"
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:2886: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:2892: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err "conftest.$ac_ext"
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err "conftest.$ac_ext"
+if $ac_preproc_ok; then
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+echo "$as_me:2929: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 2939 "configure"
+#include "confdefs.h"
+#include <assert.h>
+                     Syntax error
+_ACEOF
+if { (eval echo "$as_me:2944: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:2950: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err "conftest.$ac_ext"
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 2973 "configure"
+#include "confdefs.h"
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:2977: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:2983: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err "conftest.$ac_ext"
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err "conftest.$ac_ext"
+if $ac_preproc_ok; then
+  :
+else
+  { { echo "$as_me:3011: error: C preprocessor \"$CPP\" fails sanity check" >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
+ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_main_return="return"
+
+if test $ac_cv_c_compiler_gnu = yes; then
+    echo "$as_me:3024: checking whether $CC needs -traditional" >&5
+echo $ECHO_N "checking whether $CC needs -traditional... $ECHO_C" >&6
+if test "${ac_cv_prog_gcc_traditional+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+    ac_pattern="Autoconf.*'x'"
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 3031 "configure"
+#include "confdefs.h"
+#include <sgtty.h>
+int Autoconf = TIOCGETP;
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "$ac_pattern" >/dev/null 2>&1; then
+  ac_cv_prog_gcc_traditional=yes
+else
+  ac_cv_prog_gcc_traditional=no
+fi
+rm -rf conftest*
+
+  if test $ac_cv_prog_gcc_traditional = no; then
+    cat >"conftest.$ac_ext" <<_ACEOF
+#line 3046 "configure"
+#include "confdefs.h"
+#include <termio.h>
+int Autoconf = TCGETA;
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "$ac_pattern" >/dev/null 2>&1; then
+  ac_cv_prog_gcc_traditional=yes
+fi
+rm -rf conftest*
+
+  fi
+fi
+echo "$as_me:3059: result: $ac_cv_prog_gcc_traditional" >&5
+echo "${ECHO_T}$ac_cv_prog_gcc_traditional" >&6
+  if test $ac_cv_prog_gcc_traditional = yes; then
+    CC="$CC -traditional"
+  fi
+fi
+
+echo "$as_me:3066: checking whether $CC understands -c and -o together" >&5
+echo $ECHO_N "checking whether $CC understands -c and -o together... $ECHO_C" >&6
+if test "${cf_cv_prog_CC_c_o+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat > conftest.$ac_ext <<CF_EOF
+int main(void)
+{
+	${cf_cv_main_return:-return}(0);
+}
+CF_EOF
+# We do the test twice because some compilers refuse to overwrite an
+# existing .o file with -o, though they will create one.
+ac_try='$CC $CFLAGS $CPPFLAGS -c conftest.$ac_ext -o conftest2.$ac_objext >&5'
+if { (eval echo "$as_me:3081: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:3084: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+  test -f conftest2.$ac_objext && { (eval echo "$as_me:3086: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:3089: \$? = $ac_status" >&5
+  (exit "$ac_status"); };
+then
+  eval cf_cv_prog_CC_c_o=yes
+else
+  eval cf_cv_prog_CC_c_o=no
+fi
+rm -rf ./conftest*
+
+fi
+if test "$cf_cv_prog_CC_c_o" = yes; then
+  echo "$as_me:3100: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+  echo "$as_me:3103: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+if test "$cross_compiling" = yes ; then
+	LDCONFIG=:
+else
+	case "$cf_cv_system_name" in
+	(dragonfly*|mirbsd*|freebsd*)
+		test -z "$LDCONFIG" && LDCONFIG="/sbin/ldconfig -R"
+		;;
+	(*) LDPATH=$PATH:/sbin:/usr/sbin
+		# Extract the first word of "ldconfig", so it can be a program name with args.
+set dummy ldconfig; ac_word=$2
+echo "$as_me:3117: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_LDCONFIG+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $LDCONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_LDCONFIG="$LDCONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$LDPATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  if $as_executable_p "$ac_dir/$ac_word"; then
+   ac_cv_path_LDCONFIG="$ac_dir/$ac_word"
+   echo "$as_me:3134: found $ac_dir/$ac_word" >&5
+   break
+fi
+done
+
+  ;;
+esac
+fi
+LDCONFIG=$ac_cv_path_LDCONFIG
+
+if test -n "$LDCONFIG"; then
+  echo "$as_me:3145: result: $LDCONFIG" >&5
+echo "${ECHO_T}$LDCONFIG" >&6
+else
+  echo "$as_me:3148: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+		;;
+	esac
+fi
+
+echo "$as_me:3156: checking if you want to ensure bool is consistent with C++" >&5
+echo $ECHO_N "checking if you want to ensure bool is consistent with C++... $ECHO_C" >&6
+
+# Check whether --with-cxx or --without-cxx was given.
+if test "${with_cxx+set}" = set; then
+  withval="$with_cxx"
+  cf_with_cxx=$withval
+else
+  cf_with_cxx=yes
+fi;
+echo "$as_me:3166: result: $cf_with_cxx" >&5
+echo "${ECHO_T}$cf_with_cxx" >&6
+if test "X$cf_with_cxx" = Xno ; then
+	CXX=""
+	GXX=""
+else
+	# with autoconf 2.13, we can change the error to a warning:
+		ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
+ac_link='$CXX -o "conftest$ac_exeext" $CXXFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+ac_main_return="return"
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:3184: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CXX"; then
+  ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+echo "$as_me:3199: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+  echo "$as_me:3207: result: $CXX" >&5
+echo "${ECHO_T}$CXX" >&6
+else
+  echo "$as_me:3210: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    test -n "$CXX" && break
+  done
+fi
+if test -z "$CXX"; then
+  ac_ct_CXX=$CXX
+  for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:3223: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CXX"; then
+  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ac_ct_CXX="$ac_prog"
+echo "$as_me:3238: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+  echo "$as_me:3246: result: $ac_ct_CXX" >&5
+echo "${ECHO_T}$ac_ct_CXX" >&6
+else
+  echo "$as_me:3249: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$ac_ct_CXX" && break
+done
+test -n "$ac_ct_CXX" || ac_ct_CXX="g++"
+
+  CXX=$ac_ct_CXX
+fi
+
+# Provide some information about the compiler.
+echo "$as_me:3261:" \
+     "checking for C++ compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:3264: \"$ac_compiler --version </dev/null >&5\"") >&5
+  (eval $ac_compiler --version </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:3267: \$? = $ac_status" >&5
+  (exit "$ac_status"); }
+{ (eval echo "$as_me:3269: \"$ac_compiler -v </dev/null >&5\"") >&5
+  (eval $ac_compiler -v </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:3272: \$? = $ac_status" >&5
+  (exit "$ac_status"); }
+{ (eval echo "$as_me:3274: \"$ac_compiler -V </dev/null >&5\"") >&5
+  (eval $ac_compiler -V </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:3277: \$? = $ac_status" >&5
+  (exit "$ac_status"); }
+
+echo "$as_me:3280: checking whether we are using the GNU C++ compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6
+if test "${ac_cv_cxx_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 3286 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:3301: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:3304: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:3307: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:3310: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_compiler_gnu=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:3322: result: $ac_cv_cxx_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6
+GXX=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+CXXFLAGS="-g"
+echo "$as_me:3328: checking whether $CXX accepts -g" >&5
+echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cxx_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 3334 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:3346: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:3349: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:3352: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:3355: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_prog_cxx_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_prog_cxx_g=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:3365: result: $ac_cv_prog_cxx_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6
+if test "$ac_test_CXXFLAGS" = set; then
+  CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+  if test "$GXX" = yes; then
+    CXXFLAGS="-g -O2"
+  else
+    CXXFLAGS="-g"
+  fi
+else
+  if test "$GXX" = yes; then
+    CXXFLAGS="-O2"
+  else
+    CXXFLAGS=
+  fi
+fi
+for ac_declaration in \
+   ''\
+   '#include <stdlib.h>' \
+   'extern "C" void std::exit (int) throw (); using std::exit;' \
+   'extern "C" void std::exit (int); using std::exit;' \
+   'extern "C" void exit (int) throw ();' \
+   'extern "C" void exit (int);' \
+   'void exit (int);'
+do
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 3392 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+$ac_declaration
+int
+main (void)
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:3405: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:3408: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:3411: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:3414: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+continue
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 3424 "configure"
+#include "confdefs.h"
+$ac_declaration
+int
+main (void)
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:3436: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:3439: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:3442: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:3445: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+done
+rm -rf conftest*
+if test -n "$ac_declaration"; then
+  echo '#ifdef __cplusplus' >>confdefs.h
+  echo "$ac_declaration"    >>confdefs.h
+  echo '#endif'             >>confdefs.h
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
+ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_main_return="return"
+
+	ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
+ac_link='$CXX -o "conftest$ac_exeext" $CXXFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+ac_main_return="return"
+
+	if test "x$cf_with_cxx" != xno
+	then
+		# Several of the C++ configurations do not work, particularly when
+		# cross-compiling (20140913 -TD)
+		echo "$as_me:3479: checking if $CXX works" >&5
+echo $ECHO_N "checking if $CXX works... $ECHO_C" >&6
+
+		save_CPPFLAGS="$CPPFLAGS"
+		eval cf_includedir=${includedir}
+		CPPFLAGS="$CPPFLAGS -I${cf_includedir}"
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 3487 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+
+int
+main (void)
+{
+
+		printf("Hello world!\n")
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:3504: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:3507: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:3510: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:3513: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cxx_works=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cxx_works=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+		CPPFLAGS="$save_CPPFLAGS"
+
+		echo "$as_me:3524: result: $cf_cxx_works" >&5
+echo "${ECHO_T}$cf_cxx_works" >&6
+		if test "x$cf_cxx_works" = xno
+		then
+			{ echo "$as_me:3528: WARNING: Ignore $CXX, since it cannot compile hello-world." >&5
+echo "$as_me: WARNING: Ignore $CXX, since it cannot compile hello-world." >&2;}
+			cf_with_cxx=no; CXX=""; GXX="";
+		fi
+	fi
+	ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
+ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_main_return="return"
+
+	# autoconf 2.5x removed the error (hardcoding it to g++, or just blank)
+	if test "$CXX" = "g++" ; then
+		# Extract the first word of "g++", so it can be a program name with args.
+set dummy g++; ac_word=$2
+echo "$as_me:3544: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $CXX in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_CXX="$CXX" # Let the user override the test with a path.
+  ;;
+  *)
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  if $as_executable_p "$ac_dir/$ac_word"; then
+   ac_cv_path_CXX="$ac_dir/$ac_word"
+   echo "$as_me:3561: found $ac_dir/$ac_word" >&5
+   break
+fi
+done
+
+  ;;
+esac
+fi
+CXX=$ac_cv_path_CXX
+
+if test -n "$CXX"; then
+  echo "$as_me:3572: result: $CXX" >&5
+echo "${ECHO_T}$CXX" >&6
+else
+  echo "$as_me:3575: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+	fi
+	case "x$CXX" in
+	(x|xg++)
+		{ echo "$as_me:3582: WARNING: You don't have any C++ compiler, too bad" >&5
+echo "$as_me: WARNING: You don't have any C++ compiler, too bad" >&2;}
+		cf_with_cxx=no; CXX=""; GXX="";
+		;;
+	esac
+fi
+
+GXX_VERSION=none
+if test "$GXX" = yes; then
+	echo "$as_me:3591: checking version of ${CXX:-g++}" >&5
+echo $ECHO_N "checking version of ${CXX:-g++}... $ECHO_C" >&6
+	GXX_VERSION="`${CXX:-g++} --version| sed -e '2,$d' -e 's/^.*(GCC) //' -e 's/^[^0-9.]*//' -e 's/[^0-9.].*//'`"
+	if test -z "$GXX_VERSION"
+	then
+		GXX_VERSION=unknown
+		GXX=no
+	fi
+	echo "$as_me:3599: result: $GXX_VERSION" >&5
+echo "${ECHO_T}$GXX_VERSION" >&6
+fi
+
+case "$GXX_VERSION" in
+([1-9][0-9].*)
+	;;
+(1.*|2.[0-6]*)
+	{ echo "$as_me:3607: WARNING: templates do not work" >&5
+echo "$as_me: WARNING: templates do not work" >&2;}
+	;;
+esac
+
+echo "$as_me:3612: checking if you want to build C++ binding and demo" >&5
+echo $ECHO_N "checking if you want to build C++ binding and demo... $ECHO_C" >&6
+
+# Check whether --with-cxx-binding or --without-cxx-binding was given.
+if test "${with_cxx_binding+set}" = set; then
+  withval="$with_cxx_binding"
+  cf_with_cxx_binding=$withval
+else
+  cf_with_cxx_binding=$cf_with_cxx
+fi;
+echo "$as_me:3622: result: $cf_with_cxx_binding" >&5
+echo "${ECHO_T}$cf_with_cxx_binding" >&6
+
+echo "$as_me:3625: checking if you want to build with Ada" >&5
+echo $ECHO_N "checking if you want to build with Ada... $ECHO_C" >&6
+echo "$as_me:3627: result: $cf_with_ada" >&5
+echo "${ECHO_T}$cf_with_ada" >&6
+
+echo "$as_me:3630: checking if you want to install terminal database" >&5
+echo $ECHO_N "checking if you want to install terminal database... $ECHO_C" >&6
+
+# Check whether --enable-db-install or --disable-db-install was given.
+if test "${enable_db_install+set}" = set; then
+  enableval="$enable_db_install"
+  cf_with_db_install=$enableval
+else
+  cf_with_db_install=yes
+fi;
+echo "$as_me:3640: result: $cf_with_db_install" >&5
+echo "${ECHO_T}$cf_with_db_install" >&6
+
+echo "$as_me:3643: checking if you want to install manpages" >&5
+echo $ECHO_N "checking if you want to install manpages... $ECHO_C" >&6
+
+# Check whether --with-manpages or --without-manpages was given.
+if test "${with_manpages+set}" = set; then
+  withval="$with_manpages"
+  cf_with_manpages=$withval
+else
+  cf_with_manpages=yes
+fi;
+echo "$as_me:3653: result: $cf_with_manpages" >&5
+echo "${ECHO_T}$cf_with_manpages" >&6
+
+echo "$as_me:3656: checking if you want to build programs such as tic" >&5
+echo $ECHO_N "checking if you want to build programs such as tic... $ECHO_C" >&6
+
+# Check whether --with-progs or --without-progs was given.
+if test "${with_progs+set}" = set; then
+  withval="$with_progs"
+  cf_with_progs=$withval
+else
+  cf_with_progs=yes
+fi;
+echo "$as_me:3666: result: $cf_with_progs" >&5
+echo "${ECHO_T}$cf_with_progs" >&6
+
+if test -f "$srcdir/tack/tack.h" ; then
+	if test "x$cross_compiling" = xyes ; then
+		test -n "$verbose" && echo "	ignoring tack because we are cross-compiling" 1>&6
+
+echo "${as_me:-configure}:3673: testing ignoring tack because we are cross-compiling ..." 1>&5
+
+		cf_with_tack=no
+	else
+		echo "$as_me:3677: checking if you want to build the tack program" >&5
+echo $ECHO_N "checking if you want to build the tack program... $ECHO_C" >&6
+
+# Check whether --with-tack or --without-tack was given.
+if test "${with_tack+set}" = set; then
+  withval="$with_tack"
+  cf_with_tack=$withval
+else
+  cf_with_tack=$cf_with_progs
+fi;
+		echo "$as_me:3687: result: $cf_with_tack" >&5
+echo "${ECHO_T}$cf_with_tack" >&6
+	fi
+else
+	cf_with_tack=no
+fi
+
+echo "$as_me:3694: checking if you want to build test-programs" >&5
+echo $ECHO_N "checking if you want to build test-programs... $ECHO_C" >&6
+
+# Check whether --with-tests or --without-tests was given.
+if test "${with_tests+set}" = set; then
+  withval="$with_tests"
+  cf_with_tests=$withval
+else
+  cf_with_tests=yes
+fi;
+echo "$as_me:3704: result: $cf_with_tests" >&5
+echo "${ECHO_T}$cf_with_tests" >&6
+
+echo "$as_me:3707: checking if you wish to install curses.h" >&5
+echo $ECHO_N "checking if you wish to install curses.h... $ECHO_C" >&6
+
+# Check whether --with-curses-h or --without-curses-h was given.
+if test "${with_curses_h+set}" = set; then
+  withval="$with_curses_h"
+  with_curses_h=$withval
+else
+  with_curses_h=yes
+fi;
+echo "$as_me:3717: result: $with_curses_h" >&5
+echo "${ECHO_T}$with_curses_h" >&6
+
+modules_to_build="ncurses"
+test "X$cf_with_progs" != Xno && modules_to_build="$modules_to_build progs"
+test "X$cf_with_tack"  != Xno && modules_to_build="$modules_to_build tack"
+modules_to_build="$modules_to_build panel menu form"
+
+test "$program_prefix" != NONE &&
+  program_transform_name="s,^,$program_prefix,;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s,\$,$program_suffix,;$program_transform_name"
+# Double any \ or $.  echo might interpret backslashes.
+# By default was `s,x,x', remove it if useless.
+cat <<\_ACEOF >conftest.sed
+s/[\\$]/&&/g;s/;s,x,x,$//
+_ACEOF
+program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
+rm conftest.sed
+
+for ac_prog in mawk gawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:3742: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_AWK+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_AWK="$ac_prog"
+echo "$as_me:3757: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  echo "$as_me:3765: result: $AWK" >&5
+echo "${ECHO_T}$AWK" >&6
+else
+  echo "$as_me:3768: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$AWK" && break
+done
+
+test -z "$AWK" && { { echo "$as_me:3775: error: No awk program found" >&5
+echo "$as_me: error: No awk program found" >&2;}
+   { (exit 1); exit 1; }; }
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo "$as_me:3791: checking for a BSD compatible install" >&5
+echo $ECHO_N "checking for a BSD compatible install... $ECHO_C" >&6
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+    ac_save_IFS=$IFS; IFS=$ac_path_separator
+  for ac_dir in $PATH; do
+    IFS=$ac_save_IFS
+    # Account for people who put trailing slashes in PATH elements.
+    case $ac_dir/ in
+    / | ./ | .// | /cC/* \
+    | /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* \
+    | /usr/ucb/* ) ;;
+    *)
+      # OSF1 and SCO ODT 3.0 have their own names for install.
+      # Don't use installbsd from OSF since it installs stuff as root
+      # by default.
+      for ac_prog in ginstall scoinst install; do
+        if $as_executable_p "$ac_dir/$ac_prog"; then
+	  if test $ac_prog = install &&
+            grep dspmsg "$ac_dir/$ac_prog" >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    :
+	  elif test $ac_prog = install &&
+	    grep pwplus "$ac_dir/$ac_prog" >/dev/null 2>&1; then
+	    # program-specific install script used by HP pwplus--don't use.
+	    :
+	  else
+	    ac_cv_path_install="$ac_dir/$ac_prog -c"
+	    break 2
+	  fi
+	fi
+      done
+      ;;
+    esac
+  done
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  We don't cache a
+    # path for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the path is relative.
+    INSTALL=$ac_install_sh
+  fi
+fi
+echo "$as_me:3840: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+case $INSTALL in
+(/*)
+	;;
+(*)
+	cf_dir=`echo "$INSTALL" | sed -e 's%/[^/]*$%%'`
+	test -z "$cf_dir" && cf_dir=.
+	INSTALL="`cd \"$cf_dir\" && pwd`"/"`echo "$INSTALL" | sed -e 's%^.*/%%'`"
+	;;
+esac
+
+for ac_prog in lint cppcheck splint
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:3865: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_LINT+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$LINT"; then
+  ac_cv_prog_LINT="$LINT" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_LINT="$ac_prog"
+echo "$as_me:3880: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+LINT=$ac_cv_prog_LINT
+if test -n "$LINT"; then
+  echo "$as_me:3888: result: $LINT" >&5
+echo "${ECHO_T}$LINT" >&6
+else
+  echo "$as_me:3891: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$LINT" && break
+done
+
+case "x$LINT" in
+(xcppcheck|x*/cppcheck)
+	test -z "$LINT_OPTS" && LINT_OPTS="--enable=all"
+	;;
+esac
+
+echo "$as_me:3904: checking whether ln -s works" >&5
+echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+  echo "$as_me:3908: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+  echo "$as_me:3911: result: no, using $LN_S" >&5
+echo "${ECHO_T}no, using $LN_S" >&6
+fi
+
+echo "$as_me:3915: checking if $LN_S -f options work" >&5
+echo $ECHO_N "checking if $LN_S -f options work... $ECHO_C" >&6
+
+rm -f conf$$.src conf$$dst
+echo >conf$$.dst
+echo first >conf$$.src
+if $LN_S -f conf$$.src conf$$.dst 2>/dev/null; then
+	cf_prog_ln_sf=yes
+else
+	cf_prog_ln_sf=no
+fi
+rm -f conf$$.dst conf$$src
+echo "$as_me:3927: result: $cf_prog_ln_sf" >&5
+echo "${ECHO_T}$cf_prog_ln_sf" >&6
+
+test "$cf_prog_ln_sf" = yes && LN_S="$LN_S -f"
+
+echo "$as_me:3932: checking for long file names" >&5
+echo $ECHO_N "checking for long file names... $ECHO_C" >&6
+if test "${ac_cv_sys_long_file_names+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_sys_long_file_names=yes
+# Test for long file names in all the places we know might matter:
+#      .		the current directory, where building will happen
+#      $prefix/lib	where we will be installing things
+#      $exec_prefix/lib	likewise
+# eval it to expand exec_prefix.
+#      $TMPDIR		if set, where it might want to write temporary files
+# if $TMPDIR is not set:
+#      /tmp		where it might want to write temporary files
+#      /var/tmp		likewise
+#      /usr/tmp		likewise
+if test -n "$TMPDIR" && test -d "$TMPDIR" && test -w "$TMPDIR"; then
+  ac_tmpdirs=$TMPDIR
+else
+  ac_tmpdirs='/tmp /var/tmp /usr/tmp'
+fi
+for ac_dir in  . $ac_tmpdirs `eval echo "$prefix/lib" "$exec_prefix/lib"` ; do
+  test -d "$ac_dir" || continue
+  test -w "$ac_dir" || continue # It is less confusing to not echo anything here.
+  ac_xdir=$ac_dir/cf$$
+  (umask 077 && mkdir "$ac_xdir" 2>/dev/null) || continue
+  ac_tf1=$ac_xdir/conftest9012345
+  ac_tf2=$ac_xdir/conftest9012346
+  (echo 1 >"$ac_tf1") 2>/dev/null
+  (echo 2 >"$ac_tf2") 2>/dev/null
+  ac_val=`cat "$ac_tf1" 2>/dev/null`
+  if test ! -f "$ac_tf1" || test "$ac_val" != 1; then
+    ac_cv_sys_long_file_names=no
+    rm -rf "$ac_xdir" 2>/dev/null
+    break
+  fi
+  rm -rf "$ac_xdir" 2>/dev/null
+done
+fi
+echo "$as_me:3971: result: $ac_cv_sys_long_file_names" >&5
+echo "${ECHO_T}$ac_cv_sys_long_file_names" >&6
+if test "$ac_cv_sys_long_file_names" = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_LONG_FILE_NAMES 1
+EOF
+
+fi
+
+# Provide for renaming "ncurses5-config" to "ncurses5X-config", etc., in case
+# of package conflict.
+cf_config_suffix=
+
+# Check whether --with-config-suffix or --without-config-suffix was given.
+if test "${with_config_suffix+set}" = set; then
+  withval="$with_config_suffix"
+  case "x$withval" in
+	(xyes|xno)
+		{ echo "$as_me:3990: WARNING: expected a value for config-suffix option" >&5
+echo "$as_me: WARNING: expected a value for config-suffix option" >&2;}
+		;;
+	(*)	cf_config_suffix="$withval"
+		;;
+	esac
+fi;
+
+# If we find pkg-config, check if we should install the ".pc" files.
+
+echo "$as_me:4000: checking if you want to use pkg-config" >&5
+echo $ECHO_N "checking if you want to use pkg-config... $ECHO_C" >&6
+
+# Check whether --with-pkg-config or --without-pkg-config was given.
+if test "${with_pkg_config+set}" = set; then
+  withval="$with_pkg_config"
+  cf_pkg_config=$withval
+else
+  cf_pkg_config=yes
+fi;
+echo "$as_me:4010: result: $cf_pkg_config" >&5
+echo "${ECHO_T}$cf_pkg_config" >&6
+
+case "$cf_pkg_config" in
+(no)
+	PKG_CONFIG=none
+	;;
+(yes)
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+echo "$as_me:4022: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_PKG_CONFIG+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  if $as_executable_p "$ac_dir/$ac_word"; then
+   ac_cv_path_PKG_CONFIG="$ac_dir/$ac_word"
+   echo "$as_me:4039: found $ac_dir/$ac_word" >&5
+   break
+fi
+done
+
+  ;;
+esac
+fi
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+
+if test -n "$PKG_CONFIG"; then
+  echo "$as_me:4050: result: $PKG_CONFIG" >&5
+echo "${ECHO_T}$PKG_CONFIG" >&6
+else
+  echo "$as_me:4053: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_path_PKG_CONFIG"; then
+  ac_pt_PKG_CONFIG=$PKG_CONFIG
+  # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+echo "$as_me:4062: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $ac_pt_PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  if $as_executable_p "$ac_dir/$ac_word"; then
+   ac_cv_path_ac_pt_PKG_CONFIG="$ac_dir/$ac_word"
+   echo "$as_me:4079: found $ac_dir/$ac_word" >&5
+   break
+fi
+done
+
+  test -z "$ac_cv_path_ac_pt_PKG_CONFIG" && ac_cv_path_ac_pt_PKG_CONFIG="none"
+  ;;
+esac
+fi
+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
+
+if test -n "$ac_pt_PKG_CONFIG"; then
+  echo "$as_me:4091: result: $ac_pt_PKG_CONFIG" >&5
+echo "${ECHO_T}$ac_pt_PKG_CONFIG" >&6
+else
+  echo "$as_me:4094: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  PKG_CONFIG=$ac_pt_PKG_CONFIG
+else
+  PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
+fi
+
+	;;
+(*)
+	PKG_CONFIG=$withval
+	;;
+esac
+
+test -z "$PKG_CONFIG" && PKG_CONFIG=none
+if test "$PKG_CONFIG" != none ; then
+
+if test "x$prefix" != xNONE; then
+	cf_path_syntax="$prefix"
+else
+	cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$PKG_CONFIG" in
+(.\$\(*\)*|.\'*\'*)
+	;;
+(..|./*|.\\*)
+	;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+	;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+	eval PKG_CONFIG="$PKG_CONFIG"
+	case ".$PKG_CONFIG" in
+	(.NONE/*)
+		PKG_CONFIG=`echo "$PKG_CONFIG" | sed -e s%NONE%$cf_path_syntax%`
+		;;
+	esac
+	;;
+(.no|.NONE/*)
+	PKG_CONFIG=`echo "$PKG_CONFIG" | sed -e s%NONE%$cf_path_syntax%`
+	;;
+(*)
+	{ { echo "$as_me:4137: error: expected a pathname, not \"$PKG_CONFIG\"" >&5
+echo "$as_me: error: expected a pathname, not \"$PKG_CONFIG\"" >&2;}
+   { (exit 1); exit 1; }; }
+	;;
+esac
+
+elif test "x$cf_pkg_config" != xno ; then
+	{ echo "$as_me:4144: WARNING: pkg-config is not installed" >&5
+echo "$as_me: WARNING: pkg-config is not installed" >&2;}
+fi
+
+case "$PKG_CONFIG" in
+(no|none|yes)
+	echo "$as_me:4150: checking for pkg-config library directory" >&5
+echo $ECHO_N "checking for pkg-config library directory... $ECHO_C" >&6
+	;;
+(*)
+	echo "$as_me:4154: checking for $PKG_CONFIG library directory" >&5
+echo $ECHO_N "checking for $PKG_CONFIG library directory... $ECHO_C" >&6
+	;;
+esac
+
+# if $PKG_CONFIG_LIBDIR is set, try to use that
+cf_search_path=`echo "$PKG_CONFIG_LIBDIR" | sed -e 's/:/ /g' -e 's,^[ 	]*,,'`
+
+# if the option is used, let that override.  otherwise default to "libdir"
+
+# Check whether --with-pkg-config-libdir or --without-pkg-config-libdir was given.
+if test "${with_pkg_config_libdir+set}" = set; then
+  withval="$with_pkg_config_libdir"
+  cf_search_path=$withval
+else
+  test "x$PKG_CONFIG" != xnone && test -z "$cf_search_path" && cf_search_path=libdir
+fi;
+
+case "x$cf_search_path" in
+(xlibdir)
+	PKG_CONFIG_LIBDIR='${libdir}/pkgconfig'
+	echo "$as_me:4175: result: $PKG_CONFIG_LIBDIR" >&5
+echo "${ECHO_T}$PKG_CONFIG_LIBDIR" >&6
+	cf_search_path=
+	;;
+(x)
+	;;
+(x/*\ *)
+	PKG_CONFIG_LIBDIR=
+	;;
+(x/*)
+	PKG_CONFIG_LIBDIR="$cf_search_path"
+	echo "$as_me:4186: result: $PKG_CONFIG_LIBDIR" >&5
+echo "${ECHO_T}$PKG_CONFIG_LIBDIR" >&6
+	cf_search_path=
+	;;
+(xyes|xauto)
+	echo "$as_me:4191: result: auto" >&5
+echo "${ECHO_T}auto" >&6
+	cf_search_path=
+	# Look for the library directory using the same prefix as the executable
+	echo "$as_me:4195: checking for search-list" >&5
+echo $ECHO_N "checking for search-list... $ECHO_C" >&6
+	if test "x$PKG_CONFIG" != xnone
+	then
+		# works for pkg-config since version 0.24 (2009)
+		# works for pkgconf since version 0.8.3 (2012)
+		for cf_pkg_program in \
+			`echo "$PKG_CONFIG" | sed -e 's,^.*/,,'` \
+			pkg-config \
+			pkgconf
+		do
+			cf_search_path=`"$PKG_CONFIG" --variable=pc_path "$cf_pkg_program" 2>/dev/null | tr : ' '`
+			test -n "$cf_search_path" && break
+		done
+
+		# works for pkg-config since import in 2005 of original 2001 HP code.
+		test -z "$cf_search_path" && \
+		cf_search_path=`
+		"$PKG_CONFIG" --debug --exists no-such-package 2>&1 | $AWK "\
+/^Scanning directory (#[1-9][0-9]* )?'.*'$/{ \
+	sub(\"^[^']*'\",\"\"); \
+	sub(\"'.*\",\"\"); \
+	printf \" %s\", \\$0; } \
+{ next; } \
+"`
+	fi
+
+	echo "$as_me:4222: result: $cf_search_path" >&5
+echo "${ECHO_T}$cf_search_path" >&6
+	;;
+(*)
+	{ { echo "$as_me:4226: error: Unexpected option value: $cf_search_path" >&5
+echo "$as_me: error: Unexpected option value: $cf_search_path" >&2;}
+   { (exit 1); exit 1; }; }
+	;;
+esac
+
+if test -n "$cf_search_path"
+then
+	echo "$as_me:4234: checking for first directory" >&5
+echo $ECHO_N "checking for first directory... $ECHO_C" >&6
+	cf_pkg_config_path=none
+	for cf_config in $cf_search_path
+	do
+		if test -d "$cf_config"
+		then
+			cf_pkg_config_path=$cf_config
+			break
+		fi
+	done
+	echo "$as_me:4245: result: $cf_pkg_config_path" >&5
+echo "${ECHO_T}$cf_pkg_config_path" >&6
+
+	if test "x$cf_pkg_config_path" != xnone ; then
+		# limit this to the first directory found
+		PKG_CONFIG_LIBDIR="$cf_pkg_config_path"
+	fi
+
+	if test -z "$PKG_CONFIG_LIBDIR" && test -n "$cf_search_path"
+	then
+		echo "$as_me:4255: checking for workaround" >&5
+echo $ECHO_N "checking for workaround... $ECHO_C" >&6
+		if test "$prefix" = "NONE" ; then
+			cf_prefix="$ac_default_prefix"
+		else
+			cf_prefix="$prefix"
+		fi
+		eval cf_libdir=$libdir
+		cf_libdir=`echo "$cf_libdir" | sed -e "s,^NONE,$cf_prefix,"`
+		cf_backup=
+		for cf_config in $cf_search_path
+		do
+			case $cf_config in
+			$cf_libdir/pkgconfig)
+				PKG_CONFIG_LIBDIR=$cf_libdir/pkgconfig
+				break
+				;;
+			*)
+				test -z "$cf_backup" && cf_backup=$cf_config
+				;;
+			esac
+		done
+		test -z "$PKG_CONFIG_LIBDIR" && PKG_CONFIG_LIBDIR=$cf_backup
+		echo "$as_me:4278: result: $PKG_CONFIG_LIBDIR" >&5
+echo "${ECHO_T}$PKG_CONFIG_LIBDIR" >&6
+	fi
+fi
+
+if test "x$PKG_CONFIG" != xnone
+then
+	echo "$as_me:4285: checking if we should install .pc files for $PKG_CONFIG" >&5
+echo $ECHO_N "checking if we should install .pc files for $PKG_CONFIG... $ECHO_C" >&6
+else
+	echo "$as_me:4288: checking if we should install .pc files" >&5
+echo $ECHO_N "checking if we should install .pc files... $ECHO_C" >&6
+fi
+
+# Check whether --enable-pc-files or --disable-pc-files was given.
+if test "${enable_pc_files+set}" = set; then
+  enableval="$enable_pc_files"
+  enable_pc_files=$enableval
+else
+  enable_pc_files=no
+fi;
+echo "$as_me:4299: result: $enable_pc_files" >&5
+echo "${ECHO_T}$enable_pc_files" >&6
+
+if test "x$enable_pc_files" != xno
+then
+	MAKE_PC_FILES=
+	case "x$PKG_CONFIG_LIBDIR" in
+	(xno|xnone|xyes|x)
+		{ echo "$as_me:4307: WARNING: no PKG_CONFIG_LIBDIR was found" >&5
+echo "$as_me: WARNING: no PKG_CONFIG_LIBDIR was found" >&2;}
+		;;
+	(*)
+		cf_pkg_config_libdir="$PKG_CONFIG_LIBDIR"
+
+if test "x$prefix" != xNONE; then
+	cf_path_syntax="$prefix"
+else
+	cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$cf_pkg_config_libdir" in
+(.\$\(*\)*|.\'*\'*)
+	;;
+(..|./*|.\\*)
+	;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+	;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+	eval cf_pkg_config_libdir="$cf_pkg_config_libdir"
+	case ".$cf_pkg_config_libdir" in
+	(.NONE/*)
+		cf_pkg_config_libdir=`echo "$cf_pkg_config_libdir" | sed -e s%NONE%$cf_path_syntax%`
+		;;
+	esac
+	;;
+(.no|.NONE/*)
+	cf_pkg_config_libdir=`echo "$cf_pkg_config_libdir" | sed -e s%NONE%$cf_path_syntax%`
+	;;
+(*)
+	{ { echo "$as_me:4338: error: expected a pathname, not \"$cf_pkg_config_libdir\"" >&5
+echo "$as_me: error: expected a pathname, not \"$cf_pkg_config_libdir\"" >&2;}
+   { (exit 1); exit 1; }; }
+	;;
+esac
+
+		;;
+	esac
+else
+	MAKE_PC_FILES="#"
+fi
+
+if test -z "$MAKE_PC_FILES"
+then
+	echo "$as_me:4352: checking for suffix to add to pc-files" >&5
+echo $ECHO_N "checking for suffix to add to pc-files... $ECHO_C" >&6
+
+# Check whether --with-pc-suffix or --without-pc-suffix was given.
+if test "${with_pc_suffix+set}" = set; then
+  withval="$with_pc_suffix"
+  case "x$withval" in
+	(xyes|xno)
+		PC_MODULE_SUFFIX=
+		;;
+	(*)	PC_MODULE_SUFFIX="$withval"
+		;;
+	esac
+fi;
+	test -z "$PC_MODULE_SUFFIX" && PC_MODULE_SUFFIX=none
+	echo "$as_me:4367: result: $PC_MODULE_SUFFIX" >&5
+echo "${ECHO_T}$PC_MODULE_SUFFIX" >&6
+	test "$PC_MODULE_SUFFIX" = none && PC_MODULE_SUFFIX=
+
+fi
+
+echo "$as_me:4373: checking if we should assume mixed-case filenames" >&5
+echo $ECHO_N "checking if we should assume mixed-case filenames... $ECHO_C" >&6
+
+# Check whether --enable-mixed-case or --disable-mixed-case was given.
+if test "${enable_mixed_case+set}" = set; then
+  enableval="$enable_mixed_case"
+  enable_mixedcase=$enableval
+else
+  enable_mixedcase=auto
+fi;
+echo "$as_me:4383: result: $enable_mixedcase" >&5
+echo "${ECHO_T}$enable_mixedcase" >&6
+if test "$enable_mixedcase" = "auto" ; then
+
+echo "$as_me:4387: checking if filesystem supports mixed-case filenames" >&5
+echo $ECHO_N "checking if filesystem supports mixed-case filenames... $ECHO_C" >&6
+if test "${cf_cv_mixedcase+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+if test "$cross_compiling" = yes ; then
+	case "$target_alias" in
+	(*-os2-emx*|*-msdosdjgpp*|*-cygwin*|*-msys*|*-mingw*|*-uwin*|darwin*)
+		cf_cv_mixedcase=no
+		;;
+	(*)
+		cf_cv_mixedcase=yes
+		;;
+	esac
+else
+	rm -f conftest CONFTEST
+	echo test >conftest
+	if test -f CONFTEST ; then
+		cf_cv_mixedcase=no
+	else
+		cf_cv_mixedcase=yes
+	fi
+	rm -f conftest CONFTEST
+fi
+
+fi
+echo "$as_me:4414: result: $cf_cv_mixedcase" >&5
+echo "${ECHO_T}$cf_cv_mixedcase" >&6
+test "$cf_cv_mixedcase" = yes &&
+cat >>confdefs.h <<\EOF
+#define MIXEDCASE_FILENAMES 1
+EOF
+
+else
+	cf_cv_mixedcase=$enable_mixedcase
+	if test "x$enable_mixedcase" = "xyes" ; then
+
+cat >>confdefs.h <<\EOF
+#define MIXEDCASE_FILENAMES 1
+EOF
+
+	fi
+fi
+
+# do this after mixed-case option (tags/TAGS is not as important as tic).
+echo "$as_me:4433: checking whether ${MAKE-make} sets \${MAKE}" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \${MAKE}... $ECHO_C" >&6
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,./+-,__p_,'`
+if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.make <<\EOF
+all:
+	@echo 'ac_maketemp="${MAKE}"'
+EOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+  eval ac_cv_prog_make_${ac_make}_set=yes
+else
+  eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftest.make
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+  echo "$as_me:4453: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+  SET_MAKE=
+else
+  echo "$as_me:4457: result: no" >&5
+echo "${ECHO_T}no" >&6
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+echo "$as_me:4462: checking for \".PHONY\" make-support" >&5
+echo $ECHO_N "checking for \".PHONY\" make-support... $ECHO_C" >&6
+if test "${cf_cv_make_PHONY+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	rm -rf conftest*
+	(
+		mkdir conftest || exit 1
+		cd conftest
+		cat >makefile <<'CF_EOF'
+.PHONY: always
+DATA=0
+always:	always.out
+	@echo "** making $@ $(DATA)"
+once: once.out
+	@echo "** making $@ $(DATA)"
+always.out:
+	@echo "** making $@ $(DATA)"
+	echo $(DATA) > $@
+once.out:
+	@echo "** making $@ $(DATA)"
+	echo $(DATA) > $@
+CF_EOF
+		for cf_data in 1 2 3
+		do
+			${MAKE:-make} always DATA=$cf_data
+			${MAKE:-make} once   DATA=$cf_data
+			${MAKE:-make} -t always once
+			if test -f always ; then
+				echo "no (case 1)" > ../conftest.tmp
+			elif test ! -f always.out ; then
+				echo "no (case 2)" > ../conftest.tmp
+			elif test ! -f once.out ; then
+				echo "no (case 3)" > ../conftest.tmp
+			elif ! cmp -s always.out once.out ; then
+				echo "no (case 4)" > ../conftest.tmp
+				diff always.out once.out
+			else
+				cf_check="`cat always.out`"
+				if test "x$cf_check" != "x$cf_data" ; then
+					echo "no (case 5)" > ../conftest.tmp
+				else
+					echo yes > ../conftest.tmp
+					rm -f ./*.out
+					continue
+				fi
+			fi
+			break
+		done
+	) >&5 2>&1
+	cf_cv_make_PHONY="`cat conftest.tmp`"
+	rm -rf conftest*
+
+fi
+echo "$as_me:4517: result: $cf_cv_make_PHONY" >&5
+echo "${ECHO_T}$cf_cv_make_PHONY" >&6
+MAKE_NO_PHONY="#"
+MAKE_PHONY="#"
+test "x$cf_cv_make_PHONY" = xyes && MAKE_PHONY=
+test "x$cf_cv_make_PHONY" != xyes && MAKE_NO_PHONY=
+
+for ac_prog in exctags ctags
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:4528: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CTAGS+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CTAGS"; then
+  ac_cv_prog_CTAGS="$CTAGS" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_CTAGS="$ac_prog"
+echo "$as_me:4543: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+CTAGS=$ac_cv_prog_CTAGS
+if test -n "$CTAGS"; then
+  echo "$as_me:4551: result: $CTAGS" >&5
+echo "${ECHO_T}$CTAGS" >&6
+else
+  echo "$as_me:4554: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$CTAGS" && break
+done
+
+for ac_prog in exetags etags
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:4565: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ETAGS+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ETAGS"; then
+  ac_cv_prog_ETAGS="$ETAGS" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ETAGS="$ac_prog"
+echo "$as_me:4580: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+ETAGS=$ac_cv_prog_ETAGS
+if test -n "$ETAGS"; then
+  echo "$as_me:4588: result: $ETAGS" >&5
+echo "${ECHO_T}$ETAGS" >&6
+else
+  echo "$as_me:4591: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$ETAGS" && break
+done
+
+# Extract the first word of "${CTAGS:-ctags}", so it can be a program name with args.
+set dummy ${CTAGS:-ctags}; ac_word=$2
+echo "$as_me:4600: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_MAKE_LOWER_TAGS+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$MAKE_LOWER_TAGS"; then
+  ac_cv_prog_MAKE_LOWER_TAGS="$MAKE_LOWER_TAGS" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_MAKE_LOWER_TAGS="yes"
+echo "$as_me:4615: found $ac_dir/$ac_word" >&5
+break
+done
+
+  test -z "$ac_cv_prog_MAKE_LOWER_TAGS" && ac_cv_prog_MAKE_LOWER_TAGS="no"
+fi
+fi
+MAKE_LOWER_TAGS=$ac_cv_prog_MAKE_LOWER_TAGS
+if test -n "$MAKE_LOWER_TAGS"; then
+  echo "$as_me:4624: result: $MAKE_LOWER_TAGS" >&5
+echo "${ECHO_T}$MAKE_LOWER_TAGS" >&6
+else
+  echo "$as_me:4627: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+if test "$cf_cv_mixedcase" = yes ; then
+	# Extract the first word of "${ETAGS:-etags}", so it can be a program name with args.
+set dummy ${ETAGS:-etags}; ac_word=$2
+echo "$as_me:4634: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_MAKE_UPPER_TAGS+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$MAKE_UPPER_TAGS"; then
+  ac_cv_prog_MAKE_UPPER_TAGS="$MAKE_UPPER_TAGS" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_MAKE_UPPER_TAGS="yes"
+echo "$as_me:4649: found $ac_dir/$ac_word" >&5
+break
+done
+
+  test -z "$ac_cv_prog_MAKE_UPPER_TAGS" && ac_cv_prog_MAKE_UPPER_TAGS="no"
+fi
+fi
+MAKE_UPPER_TAGS=$ac_cv_prog_MAKE_UPPER_TAGS
+if test -n "$MAKE_UPPER_TAGS"; then
+  echo "$as_me:4658: result: $MAKE_UPPER_TAGS" >&5
+echo "${ECHO_T}$MAKE_UPPER_TAGS" >&6
+else
+  echo "$as_me:4661: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+else
+	MAKE_UPPER_TAGS=no
+fi
+
+if test "$MAKE_UPPER_TAGS" = yes ; then
+	MAKE_UPPER_TAGS=
+else
+	MAKE_UPPER_TAGS="#"
+fi
+
+if test "$MAKE_LOWER_TAGS" = yes ; then
+	MAKE_LOWER_TAGS=
+else
+	MAKE_LOWER_TAGS="#"
+fi
+
+echo "$as_me:4681: checking for makeflags variable" >&5
+echo $ECHO_N "checking for makeflags variable... $ECHO_C" >&6
+if test "${cf_cv_makeflags+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cf_cv_makeflags=''
+	for cf_option in '-${MAKEFLAGS}' '${MFLAGS}'
+	do
+		cat >cf_makeflags.tmp <<CF_EOF
+SHELL = $SHELL
+all :
+	@ echo '.$cf_option'
+CF_EOF
+		cf_result=`${MAKE:-make} -k -f cf_makeflags.tmp 2>/dev/null | ${FGREP-fgrep} -v "ing directory" | sed -e 's,[ 	]*$,,'`
+		case "$cf_result" in
+		(.*k|.*kw)
+			cf_result="`${MAKE:-make} -k -f cf_makeflags.tmp CC=cc 2>/dev/null`"
+			case "$cf_result" in
+			(.*CC=*)	cf_cv_makeflags=
+				;;
+			(*)	cf_cv_makeflags=$cf_option
+				;;
+			esac
+			break
+			;;
+		(.-)
+			;;
+		(*)
+
+echo "${as_me:-configure}:4711: testing given option \"$cf_option\",no match \"$cf_result\" ..." 1>&5
+
+			;;
+		esac
+	done
+	rm -f cf_makeflags.tmp
+
+fi
+echo "$as_me:4719: result: $cf_cv_makeflags" >&5
+echo "${ECHO_T}$cf_cv_makeflags" >&6
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+echo "$as_me:4725: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_RANLIB+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+echo "$as_me:4740: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+  echo "$as_me:4748: result: $RANLIB" >&5
+echo "${ECHO_T}$RANLIB" >&6
+else
+  echo "$as_me:4751: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+  ac_ct_RANLIB=$RANLIB
+  # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo "$as_me:4760: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_RANLIB"; then
+  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ac_ct_RANLIB="ranlib"
+echo "$as_me:4775: found $ac_dir/$ac_word" >&5
+break
+done
+
+  test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB="':'"
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+  echo "$as_me:4784: result: $ac_ct_RANLIB" >&5
+echo "${ECHO_T}$ac_ct_RANLIB" >&6
+else
+  echo "$as_me:4787: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  RANLIB=$ac_ct_RANLIB
+else
+  RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ld", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ld; ac_word=$2
+echo "$as_me:4799: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_LD+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$LD"; then
+  ac_cv_prog_LD="$LD" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_LD="${ac_tool_prefix}ld"
+echo "$as_me:4814: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+LD=$ac_cv_prog_LD
+if test -n "$LD"; then
+  echo "$as_me:4822: result: $LD" >&5
+echo "${ECHO_T}$LD" >&6
+else
+  echo "$as_me:4825: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_LD"; then
+  ac_ct_LD=$LD
+  # Extract the first word of "ld", so it can be a program name with args.
+set dummy ld; ac_word=$2
+echo "$as_me:4834: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_LD+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_LD"; then
+  ac_cv_prog_ac_ct_LD="$ac_ct_LD" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ac_ct_LD="ld"
+echo "$as_me:4849: found $ac_dir/$ac_word" >&5
+break
+done
+
+  test -z "$ac_cv_prog_ac_ct_LD" && ac_cv_prog_ac_ct_LD="ld"
+fi
+fi
+ac_ct_LD=$ac_cv_prog_ac_ct_LD
+if test -n "$ac_ct_LD"; then
+  echo "$as_me:4858: result: $ac_ct_LD" >&5
+echo "${ECHO_T}$ac_ct_LD" >&6
+else
+  echo "$as_me:4861: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  LD=$ac_ct_LD
+else
+  LD="$ac_cv_prog_LD"
+fi
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ar; ac_word=$2
+echo "$as_me:4873: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_AR+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_AR="${ac_tool_prefix}ar"
+echo "$as_me:4888: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+  echo "$as_me:4896: result: $AR" >&5
+echo "${ECHO_T}$AR" >&6
+else
+  echo "$as_me:4899: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_AR"; then
+  ac_ct_AR=$AR
+  # Extract the first word of "ar", so it can be a program name with args.
+set dummy ar; ac_word=$2
+echo "$as_me:4908: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_AR+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_AR"; then
+  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ac_ct_AR="ar"
+echo "$as_me:4923: found $ac_dir/$ac_word" >&5
+break
+done
+
+  test -z "$ac_cv_prog_ac_ct_AR" && ac_cv_prog_ac_ct_AR="ar"
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+  echo "$as_me:4932: result: $ac_ct_AR" >&5
+echo "${ECHO_T}$ac_ct_AR" >&6
+else
+  echo "$as_me:4935: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  AR=$ac_ct_AR
+else
+  AR="$ac_cv_prog_AR"
+fi
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}nm", so it can be a program name with args.
+set dummy ${ac_tool_prefix}nm; ac_word=$2
+echo "$as_me:4947: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_NM+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$NM"; then
+  ac_cv_prog_NM="$NM" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_NM="${ac_tool_prefix}nm"
+echo "$as_me:4962: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+NM=$ac_cv_prog_NM
+if test -n "$NM"; then
+  echo "$as_me:4970: result: $NM" >&5
+echo "${ECHO_T}$NM" >&6
+else
+  echo "$as_me:4973: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_NM"; then
+  ac_ct_NM=$NM
+  # Extract the first word of "nm", so it can be a program name with args.
+set dummy nm; ac_word=$2
+echo "$as_me:4982: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_NM+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_NM"; then
+  ac_cv_prog_ac_ct_NM="$ac_ct_NM" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ac_ct_NM="nm"
+echo "$as_me:4997: found $ac_dir/$ac_word" >&5
+break
+done
+
+  test -z "$ac_cv_prog_ac_ct_NM" && ac_cv_prog_ac_ct_NM="nm"
+fi
+fi
+ac_ct_NM=$ac_cv_prog_ac_ct_NM
+if test -n "$ac_ct_NM"; then
+  echo "$as_me:5006: result: $ac_ct_NM" >&5
+echo "${ECHO_T}$ac_ct_NM" >&6
+else
+  echo "$as_me:5009: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  NM=$ac_ct_NM
+else
+  NM="$ac_cv_prog_NM"
+fi
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ar; ac_word=$2
+echo "$as_me:5021: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_AR+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_AR="${ac_tool_prefix}ar"
+echo "$as_me:5036: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+  echo "$as_me:5044: result: $AR" >&5
+echo "${ECHO_T}$AR" >&6
+else
+  echo "$as_me:5047: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_AR"; then
+  ac_ct_AR=$AR
+  # Extract the first word of "ar", so it can be a program name with args.
+set dummy ar; ac_word=$2
+echo "$as_me:5056: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_AR+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_AR"; then
+  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ac_ct_AR="ar"
+echo "$as_me:5071: found $ac_dir/$ac_word" >&5
+break
+done
+
+  test -z "$ac_cv_prog_ac_ct_AR" && ac_cv_prog_ac_ct_AR="ar"
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+  echo "$as_me:5080: result: $ac_ct_AR" >&5
+echo "${ECHO_T}$ac_ct_AR" >&6
+else
+  echo "$as_me:5083: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  AR=$ac_ct_AR
+else
+  AR="$ac_cv_prog_AR"
+fi
+
+echo "$as_me:5092: checking for options to update archives" >&5
+echo $ECHO_N "checking for options to update archives... $ECHO_C" >&6
+if test "${cf_cv_ar_flags+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	case "$cf_cv_system_name" in
+	(*-msvc*)
+		cf_cv_ar_flags=''
+		cat >mk_static_lib.sh <<-EOF
+		#!$SHELL
+		MSVC_BIN="$AR"
+		out="\$1"
+		shift
+		exec \$MSVC_BIN -out:"\$out" \$@
+		EOF
+		chmod +x mk_static_lib.sh
+		AR=`pwd`/mk_static_lib.sh
+		;;
+	(*)
+		cf_cv_ar_flags=unknown
+		for cf_ar_flags in -curvU -curv curv -crv crv -cqv cqv -rv rv
+		do
+
+			# check if $ARFLAGS already contains this choice
+			if test "x$ARFLAGS" != "x" ; then
+				cf_check_ar_flags=`echo "x$ARFLAGS" | sed -e "s/$cf_ar_flags\$//" -e "s/$cf_ar_flags / /"`
+				if test "x$ARFLAGS" != "$cf_check_ar_flags" ; then
+					cf_cv_ar_flags=
+					break
+				fi
+			fi
+
+			rm -f "conftest.$ac_cv_objext"
+			rm -f conftest.a
+
+			cat >"conftest.$ac_ext" <<EOF
+#line 5129 "configure"
+int	testdata[3] = { 123, 456, 789 };
+EOF
+			if { (eval echo "$as_me:5132: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:5135: \$? = $ac_status" >&5
+  (exit "$ac_status"); } ; then
+				echo "$AR $ARFLAGS $cf_ar_flags conftest.a conftest.$ac_cv_objext" >&5
+				$AR $ARFLAGS "$cf_ar_flags" conftest.a "conftest.$ac_cv_objext" 2>&5 1>/dev/null
+				if test -f conftest.a ; then
+					cf_cv_ar_flags="$cf_ar_flags"
+					break
+				fi
+			else
+				test -n "$verbose" && echo "	cannot compile test-program" 1>&6
+
+echo "${as_me:-configure}:5146: testing cannot compile test-program ..." 1>&5
+
+				break
+			fi
+		done
+		rm -f conftest.a "conftest.$ac_ext" "conftest.$ac_cv_objext"
+		;;
+	esac
+
+fi
+echo "$as_me:5156: result: $cf_cv_ar_flags" >&5
+echo "${ECHO_T}$cf_cv_ar_flags" >&6
+
+if test -n "$ARFLAGS" ; then
+	if test -n "$cf_cv_ar_flags" ; then
+		ARFLAGS="$ARFLAGS $cf_cv_ar_flags"
+	fi
+else
+	ARFLAGS=$cf_cv_ar_flags
+fi
+
+echo "$as_me:5167: checking if you have specified an install-prefix" >&5
+echo $ECHO_N "checking if you have specified an install-prefix... $ECHO_C" >&6
+
+# Check whether --with-install-prefix or --without-install-prefix was given.
+if test "${with_install_prefix+set}" = set; then
+  withval="$with_install_prefix"
+  case "x$withval" in
+	(xyes|xno)
+		;;
+	(*)	DESTDIR="$withval"
+		;;
+	esac
+fi;
+echo "$as_me:5180: result: $DESTDIR" >&5
+echo "${ECHO_T}$DESTDIR" >&6
+
+###############################################################################
+
+# If we're cross-compiling, allow the user to override the tools and their
+# options.  The configure script is oriented toward identifying the host
+# compiler, etc., but we need a build compiler to generate parts of the source.
+
+case "$cf_cv_system_name" in
+(*-msvc*)
+	LDFLAGS="$LDFLAGS user32.lib"
+	export LDFLAGS
+	;;
+esac
+
+if test "$cross_compiling" = yes ; then
+
+	# defaults that we might want to override
+	: ${BUILD_CFLAGS:=''}
+	: ${BUILD_CPPFLAGS:=''}
+	: ${BUILD_LDFLAGS:=''}
+	: ${BUILD_LIBS:=''}
+	: ${BUILD_EXEEXT:='$x'}
+	: ${BUILD_OBJEXT:='o'}
+
+# Check whether --with-build-cc or --without-build-cc was given.
+if test "${with_build_cc+set}" = set; then
+  withval="$with_build_cc"
+  BUILD_CC="$withval"
+else
+  for ac_prog in gcc clang c99 c89 cc cl
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:5215: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_BUILD_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$BUILD_CC"; then
+  ac_cv_prog_BUILD_CC="$BUILD_CC" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_BUILD_CC="$ac_prog"
+echo "$as_me:5230: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+BUILD_CC=$ac_cv_prog_BUILD_CC
+if test -n "$BUILD_CC"; then
+  echo "$as_me:5238: result: $BUILD_CC" >&5
+echo "${ECHO_T}$BUILD_CC" >&6
+else
+  echo "$as_me:5241: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$BUILD_CC" && break
+done
+test -n "$BUILD_CC" || BUILD_CC="none"
+
+fi;
+	echo "$as_me:5250: checking for native build C compiler" >&5
+echo $ECHO_N "checking for native build C compiler... $ECHO_C" >&6
+	echo "$as_me:5252: result: $BUILD_CC" >&5
+echo "${ECHO_T}$BUILD_CC" >&6
+
+	echo "$as_me:5255: checking for native build C preprocessor" >&5
+echo $ECHO_N "checking for native build C preprocessor... $ECHO_C" >&6
+
+# Check whether --with-build-cpp or --without-build-cpp was given.
+if test "${with_build_cpp+set}" = set; then
+  withval="$with_build_cpp"
+  BUILD_CPP="$withval"
+else
+  BUILD_CPP='${BUILD_CC} -E'
+fi;
+	echo "$as_me:5265: result: $BUILD_CPP" >&5
+echo "${ECHO_T}$BUILD_CPP" >&6
+
+	echo "$as_me:5268: checking for native build C flags" >&5
+echo $ECHO_N "checking for native build C flags... $ECHO_C" >&6
+
+# Check whether --with-build-cflags or --without-build-cflags was given.
+if test "${with_build_cflags+set}" = set; then
+  withval="$with_build_cflags"
+  BUILD_CFLAGS="$withval"
+fi;
+	echo "$as_me:5276: result: $BUILD_CFLAGS" >&5
+echo "${ECHO_T}$BUILD_CFLAGS" >&6
+
+	echo "$as_me:5279: checking for native build C preprocessor-flags" >&5
+echo $ECHO_N "checking for native build C preprocessor-flags... $ECHO_C" >&6
+
+# Check whether --with-build-cppflags or --without-build-cppflags was given.
+if test "${with_build_cppflags+set}" = set; then
+  withval="$with_build_cppflags"
+  BUILD_CPPFLAGS="$withval"
+fi;
+	echo "$as_me:5287: result: $BUILD_CPPFLAGS" >&5
+echo "${ECHO_T}$BUILD_CPPFLAGS" >&6
+
+	echo "$as_me:5290: checking for native build linker-flags" >&5
+echo $ECHO_N "checking for native build linker-flags... $ECHO_C" >&6
+
+# Check whether --with-build-ldflags or --without-build-ldflags was given.
+if test "${with_build_ldflags+set}" = set; then
+  withval="$with_build_ldflags"
+  BUILD_LDFLAGS="$withval"
+fi;
+	echo "$as_me:5298: result: $BUILD_LDFLAGS" >&5
+echo "${ECHO_T}$BUILD_LDFLAGS" >&6
+
+	echo "$as_me:5301: checking for native build linker-libraries" >&5
+echo $ECHO_N "checking for native build linker-libraries... $ECHO_C" >&6
+
+# Check whether --with-build-libs or --without-build-libs was given.
+if test "${with_build_libs+set}" = set; then
+  withval="$with_build_libs"
+  BUILD_LIBS="$withval"
+fi;
+	echo "$as_me:5309: result: $BUILD_LIBS" >&5
+echo "${ECHO_T}$BUILD_LIBS" >&6
+
+	# this assumes we're on Unix.
+	BUILD_EXEEXT=
+	BUILD_OBJEXT=o
+
+	: ${BUILD_CC:='${CC}'}
+
+	echo "$as_me:5318: checking if the build-compiler \"$BUILD_CC\" works" >&5
+echo $ECHO_N "checking if the build-compiler \"$BUILD_CC\" works... $ECHO_C" >&6
+
+	cf_save_crossed=$cross_compiling
+	cf_save_ac_link=$ac_link
+	cross_compiling=no
+	ac_link='$BUILD_CC -o "conftest$ac_exeext" $BUILD_CFLAGS $BUILD_CPPFLAGS $BUILD_LDFLAGS "conftest.$ac_ext" $BUILD_LIBS >&5'
+
+	if test "$cross_compiling" = yes; then
+  cf_ok_build_cc=unknown
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 5330 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+		int main(int argc, char *argv[])
+		{
+			${cf_cv_main_return:-return}(argc < 0 || argv == 0 || argv[0] == 0);
+		}
+
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:5340: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:5343: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:5345: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:5348: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_ok_build_cc=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_ok_build_cc=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+
+	cross_compiling=$cf_save_crossed
+	ac_link=$cf_save_ac_link
+
+	echo "$as_me:5363: result: $cf_ok_build_cc" >&5
+echo "${ECHO_T}$cf_ok_build_cc" >&6
+
+	if test "$cf_ok_build_cc" != yes
+	then
+		{ { echo "$as_me:5368: error: Cross-build requires two compilers.
+Use --with-build-cc to specify the native compiler." >&5
+echo "$as_me: error: Cross-build requires two compilers.
+Use --with-build-cc to specify the native compiler." >&2;}
+   { (exit 1); exit 1; }; }
+	fi
+
+else
+	: ${BUILD_CC:='${CC}'}
+	: ${BUILD_CPP:='${CPP}'}
+	: ${BUILD_CFLAGS:='${CFLAGS}'}
+	: ${BUILD_CPPFLAGS:='${CPPFLAGS}'}
+	: ${BUILD_LDFLAGS:='${LDFLAGS}'}
+	: ${BUILD_LIBS:='${LIBS}'}
+	: ${BUILD_EXEEXT:='$x'}
+	: ${BUILD_OBJEXT:='o'}
+fi
+
+###############################################################################
+
+### Options to allow the user to specify the set of libraries which are used.
+### Use "--without-normal --with-shared" to allow the default model to be
+### shared, for example.
+cf_list_models=""
+
+echo "$as_me:5393: checking if libtool -version-number should be used" >&5
+echo $ECHO_N "checking if libtool -version-number should be used... $ECHO_C" >&6
+
+# Check whether --enable-libtool-version or --disable-libtool-version was given.
+if test "${enable_libtool_version+set}" = set; then
+  enableval="$enable_libtool_version"
+  test "$enableval" != no && enableval=yes
+	if test "$enableval" != "yes" ; then
+    cf_libtool_version=no
+	else
+		cf_libtool_version=yes
+	fi
+else
+  enableval=yes
+	cf_libtool_version=yes
+
+fi;
+echo "$as_me:5410: result: $cf_libtool_version" >&5
+echo "${ECHO_T}$cf_libtool_version" >&6
+
+if test "$cf_libtool_version" = yes ; then
+	LIBTOOL_VERSION="-version-number"
+else
+	LIBTOOL_VERSION="-version-info"
+	case "x$VERSION" in
+	(x)
+		{ echo "$as_me:5419: WARNING: VERSION was not set" >&5
+echo "$as_me: WARNING: VERSION was not set" >&2;}
+		;;
+	(x*.*.*)
+		ABI_VERSION="$VERSION"
+		test -n "$verbose" && echo "	ABI_VERSION: $ABI_VERSION" 1>&6
+
+echo "${as_me:-configure}:5426: testing ABI_VERSION: $ABI_VERSION ..." 1>&5
+
+		;;
+	(x*:*:*)
+		ABI_VERSION=`echo "$VERSION" | sed -e 's/:/./g'`
+		test -n "$verbose" && echo "	ABI_VERSION: $ABI_VERSION" 1>&6
+
+echo "${as_me:-configure}:5433: testing ABI_VERSION: $ABI_VERSION ..." 1>&5
+
+		;;
+	(*)
+		{ echo "$as_me:5437: WARNING: unexpected VERSION value: $VERSION" >&5
+echo "$as_me: WARNING: unexpected VERSION value: $VERSION" >&2;}
+		;;
+	esac
+fi
+
+LIBTOOL=
+
+# common library maintenance symbols that are convenient for libtool scripts:
+LIB_CREATE='${AR} -cr'
+LIB_OBJECT='${OBJECTS}'
+LIB_SUFFIX=.a
+LIB_PREP="$RANLIB"
+
+# symbols used to prop libtool up to enable it to determine what it should be
+# doing:
+LIB_CLEAN=
+LIB_COMPILE=
+LIB_LINK='${CC}'
+LIB_INSTALL=
+LIB_UNINSTALL=
+
+echo "$as_me:5459: checking if you want to build libraries with libtool" >&5
+echo $ECHO_N "checking if you want to build libraries with libtool... $ECHO_C" >&6
+
+# Check whether --with-libtool or --without-libtool was given.
+if test "${with_libtool+set}" = set; then
+  withval="$with_libtool"
+  with_libtool=$withval
+else
+  with_libtool=no
+fi;
+echo "$as_me:5469: result: $with_libtool" >&5
+echo "${ECHO_T}$with_libtool" >&6
+if test "$with_libtool" != "no"; then
+
+	if test "$with_libtool" != "yes" ; then
+
+if test "x$prefix" != xNONE; then
+	cf_path_syntax="$prefix"
+else
+	cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$with_libtool" in
+(.\$\(*\)*|.\'*\'*)
+	;;
+(..|./*|.\\*)
+	;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+	;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+	eval with_libtool="$with_libtool"
+	case ".$with_libtool" in
+	(.NONE/*)
+		with_libtool=`echo "$with_libtool" | sed -e s%NONE%$cf_path_syntax%`
+		;;
+	esac
+	;;
+(.no|.NONE/*)
+	with_libtool=`echo "$with_libtool" | sed -e s%NONE%$cf_path_syntax%`
+	;;
+(*)
+	{ { echo "$as_me:5500: error: expected a pathname, not \"$with_libtool\"" >&5
+echo "$as_me: error: expected a pathname, not \"$with_libtool\"" >&2;}
+   { (exit 1); exit 1; }; }
+	;;
+esac
+
+		LIBTOOL=$with_libtool
+	else
+		if test -n "$ac_tool_prefix"; then
+  for ac_prog in libtool glibtool
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:5513: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_LIBTOOL+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$LIBTOOL"; then
+  ac_cv_prog_LIBTOOL="$LIBTOOL" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_LIBTOOL="$ac_tool_prefix$ac_prog"
+echo "$as_me:5528: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+LIBTOOL=$ac_cv_prog_LIBTOOL
+if test -n "$LIBTOOL"; then
+  echo "$as_me:5536: result: $LIBTOOL" >&5
+echo "${ECHO_T}$LIBTOOL" >&6
+else
+  echo "$as_me:5539: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    test -n "$LIBTOOL" && break
+  done
+fi
+if test -z "$LIBTOOL"; then
+  ac_ct_LIBTOOL=$LIBTOOL
+  for ac_prog in libtool glibtool
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:5552: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_LIBTOOL+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_LIBTOOL"; then
+  ac_cv_prog_ac_ct_LIBTOOL="$ac_ct_LIBTOOL" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ac_ct_LIBTOOL="$ac_prog"
+echo "$as_me:5567: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+ac_ct_LIBTOOL=$ac_cv_prog_ac_ct_LIBTOOL
+if test -n "$ac_ct_LIBTOOL"; then
+  echo "$as_me:5575: result: $ac_ct_LIBTOOL" >&5
+echo "${ECHO_T}$ac_ct_LIBTOOL" >&6
+else
+  echo "$as_me:5578: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$ac_ct_LIBTOOL" && break
+done
+test -n "$ac_ct_LIBTOOL" || ac_ct_LIBTOOL="none"
+
+  LIBTOOL=$ac_ct_LIBTOOL
+fi
+
+if test -n "$LIBTOOL" && test "$LIBTOOL" != none
+then
+	cf_cv_libtool_version=`$LIBTOOL --version 2>&1 | sed -e '/^$/d' |sed -e '2,$d' -e 's/([^)]*)//g' -e 's/^[^1-9]*//' -e 's/[^0-9.].*//'`
+else
+	cf_cv_libtool_version=
+fi
+test -z "$cf_cv_libtool_version" && unset cf_cv_libtool_version
+
+		if test -z "$cf_cv_libtool_version" && test "$LIBTOOL" = libtool
+		then
+
+unset ac_cv_prog_ac_ct_LIBTOOL
+unset ac_ct_LIBTOOL
+unset LIBTOOL
+
+			if test -n "$ac_tool_prefix"; then
+  for ac_prog in glibtool
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:5609: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_LIBTOOL+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$LIBTOOL"; then
+  ac_cv_prog_LIBTOOL="$LIBTOOL" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_LIBTOOL="$ac_tool_prefix$ac_prog"
+echo "$as_me:5624: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+LIBTOOL=$ac_cv_prog_LIBTOOL
+if test -n "$LIBTOOL"; then
+  echo "$as_me:5632: result: $LIBTOOL" >&5
+echo "${ECHO_T}$LIBTOOL" >&6
+else
+  echo "$as_me:5635: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    test -n "$LIBTOOL" && break
+  done
+fi
+if test -z "$LIBTOOL"; then
+  ac_ct_LIBTOOL=$LIBTOOL
+  for ac_prog in glibtool
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:5648: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_LIBTOOL+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_LIBTOOL"; then
+  ac_cv_prog_ac_ct_LIBTOOL="$ac_ct_LIBTOOL" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ac_ct_LIBTOOL="$ac_prog"
+echo "$as_me:5663: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+ac_ct_LIBTOOL=$ac_cv_prog_ac_ct_LIBTOOL
+if test -n "$ac_ct_LIBTOOL"; then
+  echo "$as_me:5671: result: $ac_ct_LIBTOOL" >&5
+echo "${ECHO_T}$ac_ct_LIBTOOL" >&6
+else
+  echo "$as_me:5674: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$ac_ct_LIBTOOL" && break
+done
+test -n "$ac_ct_LIBTOOL" || ac_ct_LIBTOOL="none"
+
+  LIBTOOL=$ac_ct_LIBTOOL
+fi
+
+if test -n "$LIBTOOL" && test "$LIBTOOL" != none
+then
+	cf_cv_libtool_version=`$LIBTOOL --version 2>&1 | sed -e '/^$/d' |sed -e '2,$d' -e 's/([^)]*)//g' -e 's/^[^1-9]*//' -e 's/[^0-9.].*//'`
+else
+	cf_cv_libtool_version=
+fi
+test -z "$cf_cv_libtool_version" && unset cf_cv_libtool_version
+
+		fi
+	fi
+	if test -z "$LIBTOOL" ; then
+		{ { echo "$as_me:5696: error: Cannot find libtool" >&5
+echo "$as_me: error: Cannot find libtool" >&2;}
+   { (exit 1); exit 1; }; }
+	fi
+	LIB_CREATE='${LIBTOOL} --mode=link ${CC} -rpath ${libdir} ${LIBTOOL_VERSION} `cut -f1 ${top_srcdir}/VERSION` ${LIBTOOL_OPTS} ${LT_UNDEF} $(LIBS) -o'
+	LIB_OBJECT='${OBJECTS:.o=.lo}'
+	LIB_SUFFIX=.la
+	LIB_CLEAN='${LIBTOOL} --mode=clean'
+	LIB_COMPILE='${LIBTOOL} --mode=compile'
+	LIB_LINK='${LIBTOOL} --mode=link ${CC} ${LIBTOOL_OPTS}'
+	LIB_INSTALL='${LIBTOOL} --mode=install'
+	LIB_UNINSTALL='${LIBTOOL} --mode=uninstall'
+	LIB_PREP=:
+
+if test -n "$LIBTOOL" && test "$LIBTOOL" != none
+then
+	echo "$as_me:5712: checking version of $LIBTOOL" >&5
+echo $ECHO_N "checking version of $LIBTOOL... $ECHO_C" >&6
+
+if test -n "$LIBTOOL" && test "$LIBTOOL" != none
+then
+	cf_cv_libtool_version=`$LIBTOOL --version 2>&1 | sed -e '/^$/d' |sed -e '2,$d' -e 's/([^)]*)//g' -e 's/^[^1-9]*//' -e 's/[^0-9.].*//'`
+else
+	cf_cv_libtool_version=
+fi
+test -z "$cf_cv_libtool_version" && unset cf_cv_libtool_version
+
+	echo "$as_me:5723: result: $cf_cv_libtool_version" >&5
+echo "${ECHO_T}$cf_cv_libtool_version" >&6
+	if test -n "$cf_cv_libtool_version"
+	then
+		cf_check_libtool_version=`$LIBTOOL --version 2>&1 | sed -e '/^$/d' -e 's,[()],...,g' -e 's,[ ],-,g' -e '2,$d'`
+		case "x$cf_check_libtool_version" in
+		(*...GNU-libtool...*)
+			;;
+		(*)
+			{ { echo "$as_me:5732: error: This is not GNU libtool" >&5
+echo "$as_me: error: This is not GNU libtool" >&2;}
+   { (exit 1); exit 1; }; }
+			;;
+		esac
+	else
+		{ { echo "$as_me:5738: error: No version found for $LIBTOOL" >&5
+echo "$as_me: error: No version found for $LIBTOOL" >&2;}
+   { (exit 1); exit 1; }; }
+	fi
+else
+	{ { echo "$as_me:5743: error: GNU libtool has not been found" >&5
+echo "$as_me: error: GNU libtool has not been found" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+	# special hack to add -no-undefined (which libtool should do for itself)
+	LT_UNDEF=
+	case "$cf_cv_system_name" in
+	(cygwin*|msys*|mingw32*|os2*|uwin*|aix[4-7])
+		LT_UNDEF=-no-undefined
+		;;
+	esac
+
+	# special hack to add --tag option for C++ compiler
+	case "$cf_cv_libtool_version" in
+	(1.[5-9]*|[2-9].[0-9.a-z]*)
+		LIBTOOL_CXX="$LIBTOOL --tag=CXX"
+		LIBTOOL="$LIBTOOL --tag=CC"
+		;;
+	(*)
+		LIBTOOL_CXX="$LIBTOOL"
+		;;
+	esac
+else
+	LIBTOOL=""
+	LIBTOOL_CXX=""
+fi
+
+test -z "$LIBTOOL" && ECHO_LT=
+
+if test "$with_libtool" != "no" ; then
+
+cf_list_models="$cf_list_models libtool"
+
+else
+
+echo "$as_me:5779: checking if you want to build shared libraries" >&5
+echo $ECHO_N "checking if you want to build shared libraries... $ECHO_C" >&6
+
+# Check whether --with-shared or --without-shared was given.
+if test "${with_shared+set}" = set; then
+  withval="$with_shared"
+  with_shared=$withval
+else
+  with_shared=no
+fi;
+echo "$as_me:5789: result: $with_shared" >&5
+echo "${ECHO_T}$with_shared" >&6
+test "x$with_shared" = "xyes" && cf_list_models="$cf_list_models shared"
+
+echo "$as_me:5793: checking if you want to build static libraries" >&5
+echo $ECHO_N "checking if you want to build static libraries... $ECHO_C" >&6
+
+# Check whether --with-normal or --without-normal was given.
+if test "${with_normal+set}" = set; then
+  withval="$with_normal"
+  with_normal=$withval
+else
+  with_normal=yes
+fi;
+echo "$as_me:5803: result: $with_normal" >&5
+echo "${ECHO_T}$with_normal" >&6
+test "x$with_normal" = "xyes" && cf_list_models="$cf_list_models normal"
+
+echo "$as_me:5807: checking if you want to build debug libraries" >&5
+echo $ECHO_N "checking if you want to build debug libraries... $ECHO_C" >&6
+
+# Check whether --with-debug or --without-debug was given.
+if test "${with_debug+set}" = set; then
+  withval="$with_debug"
+  with_debug=$withval
+else
+  with_debug=yes
+fi;
+echo "$as_me:5817: result: $with_debug" >&5
+echo "${ECHO_T}$with_debug" >&6
+test "x$with_debug" = "xyes" && cf_list_models="$cf_list_models debug"
+
+echo "$as_me:5821: checking if you want to build profiling libraries" >&5
+echo $ECHO_N "checking if you want to build profiling libraries... $ECHO_C" >&6
+
+# Check whether --with-profile or --without-profile was given.
+if test "${with_profile+set}" = set; then
+  withval="$with_profile"
+  with_profile=$withval
+else
+  with_profile=no
+fi;
+echo "$as_me:5831: result: $with_profile" >&5
+echo "${ECHO_T}$with_profile" >&6
+test "x$with_profile" = "xyes" && cf_list_models="$cf_list_models profile"
+
+fi
+
+if test "X$cf_with_cxx_binding" != Xno; then
+if test "x$with_shared" = "xyes"; then
+echo "$as_me:5839: checking if you want to build C++ shared libraries" >&5
+echo $ECHO_N "checking if you want to build C++ shared libraries... $ECHO_C" >&6
+
+# Check whether --with-cxx-shared or --without-cxx-shared was given.
+if test "${with_cxx_shared+set}" = set; then
+  withval="$with_cxx_shared"
+  with_shared_cxx=$withval
+else
+  with_shared_cxx=no
+fi;
+echo "$as_me:5849: result: $with_shared_cxx" >&5
+echo "${ECHO_T}$with_shared_cxx" >&6
+fi
+fi
+
+###############################################################################
+
+echo "$as_me:5856: checking for specified models" >&5
+echo $ECHO_N "checking for specified models... $ECHO_C" >&6
+test -z "$cf_list_models" && cf_list_models=normal
+test "$with_libtool" != "no" && cf_list_models=libtool
+echo "$as_me:5860: result: $cf_list_models" >&5
+echo "${ECHO_T}$cf_list_models" >&6
+
+### Use the first model as the default, and save its suffix for use in building
+### up test-applications.
+echo "$as_me:5865: checking for default model" >&5
+echo $ECHO_N "checking for default model... $ECHO_C" >&6
+DFT_LWR_MODEL=`echo "$cf_list_models" | $AWK '{print $1}'`
+echo "$as_me:5868: result: $DFT_LWR_MODEL" >&5
+echo "${ECHO_T}$DFT_LWR_MODEL" >&6
+
+DFT_UPR_MODEL=`echo "$DFT_LWR_MODEL" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+TICS_NAME=tic
+
+TINFO_NAME=tinfo
+
+LIB_NAME=ncurses
+
+LIB_DIR=../lib
+LIB_2ND=../../lib
+
+echo "$as_me:5882: checking if you want to have a library-prefix" >&5
+echo $ECHO_N "checking if you want to have a library-prefix... $ECHO_C" >&6
+
+# Check whether --with-lib-prefix or --without-lib-prefix was given.
+if test "${with_lib_prefix+set}" = set; then
+  withval="$with_lib_prefix"
+  with_lib_prefix=$withval
+else
+  with_lib_prefix=auto
+fi;
+echo "$as_me:5892: result: $with_lib_prefix" >&5
+echo "${ECHO_T}$with_lib_prefix" >&6
+
+if test "$with_lib_prefix" = auto
+then
+
+	case "$cf_cv_system_name" in
+	(OS/2*|os2*)
+		if test "$DFT_LWR_MODEL" = libtool; then
+			LIB_PREFIX='lib'
+		else
+			LIB_PREFIX=''
+		fi
+		;;
+	(*-msvc*)
+		LIB_PREFIX=''
+		;;
+	(*)	LIB_PREFIX='lib'
+		;;
+	esac
+cf_prefix=$LIB_PREFIX
+
+elif test "$with_lib_prefix" = no
+then
+	LIB_PREFIX=
+else
+	LIB_PREFIX=$with_lib_prefix
+fi
+
+LIB_SUFFIX=
+
+	echo "$as_me:5923: checking for PATH separator" >&5
+echo $ECHO_N "checking for PATH separator... $ECHO_C" >&6
+	case "$cf_cv_system_name" in
+	(os2*)	PATH_SEPARATOR=';'  ;;
+	(*)	${PATH_SEPARATOR:=':'}  ;;
+	esac
+
+	echo "$as_me:5930: result: $PATH_SEPARATOR" >&5
+echo "${ECHO_T}$PATH_SEPARATOR" >&6
+
+###############################################################################
+
+echo "$as_me:5935: checking if you want to build a separate terminfo library" >&5
+echo $ECHO_N "checking if you want to build a separate terminfo library... $ECHO_C" >&6
+
+# Check whether --with-termlib or --without-termlib was given.
+if test "${with_termlib+set}" = set; then
+  withval="$with_termlib"
+  with_termlib=$withval
+else
+  with_termlib=no
+fi;
+echo "$as_me:5945: result: $with_termlib" >&5
+echo "${ECHO_T}$with_termlib" >&6
+
+echo "$as_me:5948: checking if you want to build a separate tic library" >&5
+echo $ECHO_N "checking if you want to build a separate tic library... $ECHO_C" >&6
+
+# Check whether --with-ticlib or --without-ticlib was given.
+if test "${with_ticlib+set}" = set; then
+  withval="$with_ticlib"
+  with_ticlib=$withval
+else
+  with_ticlib=no
+fi;
+echo "$as_me:5958: result: $with_ticlib" >&5
+echo "${ECHO_T}$with_ticlib" >&6
+
+if test X"$CC_G_OPT" = X"" ; then
+	CC_G_OPT='-g'
+	test -n "$GCC" && test "x${ac_cv_prog_cc_g}" != xyes && CC_G_OPT=''
+fi
+
+if test X"$CXX_G_OPT" = X"" ; then
+	CXX_G_OPT='-g'
+	test -n "$GXX" && test "x${ac_cv_prog_cxx_g}" != xyes && CXX_G_OPT=''
+fi
+
+echo "$as_me:5971: checking for default loader flags" >&5
+echo $ECHO_N "checking for default loader flags... $ECHO_C" >&6
+case "$DFT_LWR_MODEL" in
+(libtool) LD_MODEL=''   ;;
+(normal)  LD_MODEL=''   ;;
+(debug)   LD_MODEL=$CC_G_OPT ;;
+(profile) LD_MODEL='-pg';;
+(shared)  LD_MODEL=''   ;;
+esac
+echo "$as_me:5980: result: $LD_MODEL" >&5
+echo "${ECHO_T}$LD_MODEL" >&6
+
+case "$DFT_LWR_MODEL" in
+(shared)
+
+echo "$as_me:5986: checking if rpath option should be used" >&5
+echo $ECHO_N "checking if rpath option should be used... $ECHO_C" >&6
+
+# Check whether --enable-rpath or --disable-rpath was given.
+if test "${enable_rpath+set}" = set; then
+  enableval="$enable_rpath"
+  cf_cv_enable_rpath=$enableval
+else
+  cf_cv_enable_rpath=no
+fi;
+echo "$as_me:5996: result: $cf_cv_enable_rpath" >&5
+echo "${ECHO_T}$cf_cv_enable_rpath" >&6
+
+echo "$as_me:5999: checking if shared libraries should be relinked during install" >&5
+echo $ECHO_N "checking if shared libraries should be relinked during install... $ECHO_C" >&6
+
+# Check whether --enable-relink or --disable-relink was given.
+if test "${enable_relink+set}" = set; then
+  enableval="$enable_relink"
+  cf_cv_do_relink=$enableval
+else
+  cf_cv_do_relink=yes
+fi;
+echo "$as_me:6009: result: $cf_cv_do_relink" >&5
+echo "${ECHO_T}$cf_cv_do_relink" >&6
+	;;
+esac
+
+# we will build libraries one-level down.
+rel_builddir=..
+
+LD_RPATH_OPT=
+if test "x$cf_cv_enable_rpath" != xno
+then
+	echo "$as_me:6020: checking for an rpath option" >&5
+echo $ECHO_N "checking for an rpath option... $ECHO_C" >&6
+	case "$cf_cv_system_name" in
+	(irix*)
+		if test "$GCC" = yes; then
+			LD_RPATH_OPT="-Wl,-rpath,"
+		else
+			LD_RPATH_OPT="-rpath "
+		fi
+		;;
+	(linux*|gnu*|k*bsd*-gnu|freebsd*)
+		LD_RPATH_OPT="-Wl,-rpath,"
+		;;
+	(openbsd[2-9].*|mirbsd*)
+		LD_RPATH_OPT="-Wl,-rpath,"
+		;;
+	(dragonfly*)
+		LD_RPATH_OPT="-rpath "
+		;;
+	(netbsd*)
+		LD_RPATH_OPT="-Wl,-rpath,"
+		;;
+	(osf*|mls+*)
+		LD_RPATH_OPT="-rpath "
+		;;
+	(solaris2*)
+		LD_RPATH_OPT="-R"
+		;;
+	(*)
+		;;
+	esac
+	echo "$as_me:6051: result: $LD_RPATH_OPT" >&5
+echo "${ECHO_T}$LD_RPATH_OPT" >&6
+
+	case "x$LD_RPATH_OPT" in
+	(x-R*)
+		echo "$as_me:6056: checking if we need a space after rpath option" >&5
+echo $ECHO_N "checking if we need a space after rpath option... $ECHO_C" >&6
+		cf_save_LIBS="$LIBS"
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in ${LD_RPATH_OPT}$libdir; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 6077 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:6089: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:6092: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:6095: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:6098: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_rpath_space=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_rpath_space=yes
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+		LIBS="$cf_save_LIBS"
+		echo "$as_me:6108: result: $cf_rpath_space" >&5
+echo "${ECHO_T}$cf_rpath_space" >&6
+		test "$cf_rpath_space" = yes && LD_RPATH_OPT="$LD_RPATH_OPT "
+		;;
+	esac
+fi
+
+	RM_SHARED_OPTS=
+	LOCAL_LDFLAGS=
+	LOCAL_LDFLAGS2=
+	LD_SHARED_OPTS=
+	INSTALL_LIB="-m 644"
+	: ${rel_builddir:=.}
+
+	shlibdir=$libdir
+
+	MAKE_DLLS="#"
+
+	cf_cv_do_symlinks=no
+	cf_ld_rpath_opt=
+	test "$cf_cv_enable_rpath" = yes && cf_ld_rpath_opt="$LD_RPATH_OPT"
+
+	echo "$as_me:6130: checking if release/abi version should be used for shared libs" >&5
+echo $ECHO_N "checking if release/abi version should be used for shared libs... $ECHO_C" >&6
+
+# Check whether --with-shlib-version or --without-shlib-version was given.
+if test "${with_shlib_version+set}" = set; then
+  withval="$with_shlib_version"
+  test -z "$withval" && withval=auto
+	case "$withval" in
+	(yes)
+		cf_cv_shlib_version=auto
+		;;
+	(rel|abi|auto)
+		cf_cv_shlib_version=$withval
+		;;
+	(*)
+		echo "$as_me:6145: result: $withval" >&5
+echo "${ECHO_T}$withval" >&6
+		{ { echo "$as_me:6147: error: option value must be one of: rel, abi, or auto" >&5
+echo "$as_me: error: option value must be one of: rel, abi, or auto" >&2;}
+   { (exit 1); exit 1; }; }
+		;;
+	esac
+
+else
+  cf_cv_shlib_version=auto
+fi;
+	echo "$as_me:6156: result: $cf_cv_shlib_version" >&5
+echo "${ECHO_T}$cf_cv_shlib_version" >&6
+
+	cf_cv_rm_so_locs=no
+	cf_try_cflags=
+
+	# Some less-capable ports of gcc support only -fpic
+	CC_SHARED_OPTS=
+
+	cf_try_fPIC=no
+	if test "$GCC" = yes
+	then
+		cf_try_fPIC=yes
+	else
+		case "$cf_cv_system_name" in
+		(*linux*)	# e.g., PGI compiler
+			cf_try_fPIC=yes
+			;;
+		esac
+	fi
+
+	if test "$cf_try_fPIC" = yes
+	then
+		echo "$as_me:6179: checking which $CC option to use" >&5
+echo $ECHO_N "checking which $CC option to use... $ECHO_C" >&6
+		cf_save_CFLAGS="$CFLAGS"
+		for CC_SHARED_OPTS in -fPIC -fpic ''
+		do
+			CFLAGS="$cf_save_CFLAGS $CC_SHARED_OPTS"
+			cat >"conftest.$ac_ext" <<_ACEOF
+#line 6186 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+int x = 1
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:6198: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:6201: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:6204: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:6207: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+		done
+		echo "$as_me:6216: result: $CC_SHARED_OPTS" >&5
+echo "${ECHO_T}$CC_SHARED_OPTS" >&6
+		CFLAGS="$cf_save_CFLAGS"
+	fi
+
+	cf_cv_shlib_version_infix=no
+
+	case "$cf_cv_system_name" in
+	(aix4.3-9*|aix[5-7]*)
+		if test "$GCC" = yes; then
+			CC_SHARED_OPTS='-Wl,-brtl'
+			MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-brtl -Wl,-blibpath:${RPATH_LIST}:/usr/lib -o $@'
+		else
+			CC_SHARED_OPTS='-brtl'
+			# as well as '-qpic=large -G' or perhaps "-bM:SRE -bnoentry -bexpall"
+			MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -G -Wl,-brtl -Wl,-blibpath:${RPATH_LIST}:/usr/lib -o $@'
+		fi
+		;;
+	(beos*)
+		MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -o $@ -Xlinker -soname=`basename $@` -nostart -e 0'
+		;;
+	(cygwin*)
+		CC_SHARED_OPTS=
+		MK_SHARED_LIB=$SHELL' '$rel_builddir'/mk_shared_lib.sh $@ ${CC} ${CFLAGS}'
+		RM_SHARED_OPTS="$RM_SHARED_OPTS $rel_builddir/mk_shared_lib.sh *.dll.a"
+		cf_cv_shlib_version=cygdll
+		cf_cv_shlib_version_infix=cygdll
+		shlibdir=$bindir
+		MAKE_DLLS=
+		cat >mk_shared_lib.sh <<-CF_EOF
+		#!$SHELL
+		SHARED_LIB=\$1
+		IMPORT_LIB=\`echo "\$1" | sed -e 's/cyg/lib/' -e 's/[0-9]*\.dll$/.dll.a/'\`
+		shift
+		cat <<-EOF
+		Linking shared library
+		** SHARED_LIB \$SHARED_LIB
+		** IMPORT_LIB \$IMPORT_LIB
+EOF
+		exec \$* ${LDFLAGS} -shared -Wl,--out-implib=\${IMPORT_LIB} -Wl,--export-all-symbols -o \${SHARED_LIB}
+CF_EOF
+		chmod +x mk_shared_lib.sh
+		;;
+	(msys*)
+		CC_SHARED_OPTS=
+		MK_SHARED_LIB=$SHELL' '$rel_builddir'/mk_shared_lib.sh $@ ${CC} ${CFLAGS}'
+		RM_SHARED_OPTS="$RM_SHARED_OPTS $rel_builddir/mk_shared_lib.sh *.dll.a"
+		cf_cv_shlib_version=msysdll
+		cf_cv_shlib_version_infix=msysdll
+		shlibdir=$bindir
+		MAKE_DLLS=
+		cat >mk_shared_lib.sh <<-CF_EOF
+		#!$SHELL
+		SHARED_LIB=\$1
+		IMPORT_LIB=\`echo "\$1" | sed -e 's/msys-/lib/' -e 's/[0-9]*\.dll$/.dll.a/'\`
+		shift
+		cat <<-EOF
+		Linking shared library
+		** SHARED_LIB \$SHARED_LIB
+		** IMPORT_LIB \$IMPORT_LIB
+EOF
+		exec \$* ${LDFLAGS} -shared -Wl,--out-implib=\${IMPORT_LIB} -Wl,--export-all-symbols -o \${SHARED_LIB}
+CF_EOF
+		chmod +x mk_shared_lib.sh
+		;;
+	(darwin*)
+		cf_try_cflags="no-cpp-precomp"
+		CC_SHARED_OPTS="-dynamic"
+		MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -dynamiclib -install_name ${libdir}/`basename $@` -compatibility_version ${ABI_VERSION} -current_version ${ABI_VERSION} -o $@'
+		test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=abi
+		cf_cv_shlib_version_infix=yes
+		echo "$as_me:6287: checking if ld -search_paths_first works" >&5
+echo $ECHO_N "checking if ld -search_paths_first works... $ECHO_C" >&6
+if test "${cf_cv_ldflags_search_paths_first+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+			cf_save_LDFLAGS=$LDFLAGS
+			LDFLAGS="$LDFLAGS -Wl,-search_paths_first"
+			cat >"conftest.$ac_ext" <<_ACEOF
+#line 6296 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+int i;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:6308: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:6311: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:6314: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:6317: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_ldflags_search_paths_first=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_ldflags_search_paths_first=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+				LDFLAGS=$cf_save_LDFLAGS
+fi
+echo "$as_me:6328: result: $cf_cv_ldflags_search_paths_first" >&5
+echo "${ECHO_T}$cf_cv_ldflags_search_paths_first" >&6
+		if test "$cf_cv_ldflags_search_paths_first" = yes; then
+			LDFLAGS="$LDFLAGS -Wl,-search_paths_first"
+		fi
+		;;
+	(haiku*)
+
+	test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel
+	if test "$cf_cv_shlib_version" = rel; then
+		cf_cv_shared_soname='`basename $@ .${REL_VERSION}`.${ABI_VERSION}'
+	else
+		cf_cv_shared_soname='`basename $@`'
+	fi
+
+		MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,'$cf_cv_shared_soname',-stats,-lc -o $@'
+		;;
+	(hpux[7-8]*)
+		# HP-UX 8.07 ld lacks "+b" option used for libdir search-list
+		if test "$GCC" != yes; then
+			CC_SHARED_OPTS='+Z'
+		fi
+		MK_SHARED_LIB='${LD} ${LDFLAGS} -b -o $@'
+		INSTALL_LIB="-m 555"
+		;;
+	(hpux*)
+		# (tested with gcc 2.7.2 -- I don't have c89)
+		if test "$GCC" = yes; then
+			LD_SHARED_OPTS='-Xlinker +b -Xlinker ${libdir}'
+		else
+			CC_SHARED_OPTS='+Z'
+			LD_SHARED_OPTS='-Wl,+b,${libdir}'
+		fi
+		MK_SHARED_LIB='${LD} ${LDFLAGS} +b ${libdir} -b -o $@'
+		# HP-UX shared libraries must be executable, and should be
+		# readonly to exploit a quirk in the memory manager.
+		INSTALL_LIB="-m 555"
+		;;
+	(interix*)
+		test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel
+		if test "$cf_cv_shlib_version" = rel; then
+			cf_shared_soname='`basename $@ .${REL_VERSION}`.${ABI_VERSION}'
+		else
+			cf_shared_soname='`basename $@`'
+		fi
+		CC_SHARED_OPTS=
+		MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-rpath,${RPATH_LIST} -Wl,-h,'$cf_shared_soname' -o $@'
+		;;
+	(irix*)
+		if test "$cf_cv_enable_rpath" = yes ; then
+			EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS"
+		fi
+		# tested with IRIX 5.2 and 'cc'.
+		if test "$GCC" != yes; then
+			CC_SHARED_OPTS='-KPIC'
+			MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -rdata_shared -soname `basename $@` -o $@'
+		else
+			MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,`basename $@` -o $@'
+		fi
+		cf_cv_rm_so_locs=yes
+		;;
+	(linux*|gnu*|k*bsd*-gnu)
+		if test "$DFT_LWR_MODEL" = "shared" && test -n "$LD_RPATH_OPT" ; then
+			LOCAL_LDFLAGS="${LD_RPATH_OPT}\$(LOCAL_LIBDIR)"
+			LOCAL_LDFLAGS2="$LOCAL_LDFLAGS"
+		fi
+		if test "$cf_cv_enable_rpath" = yes ; then
+			EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS"
+		fi
+
+	test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel
+	if test "$cf_cv_shlib_version" = rel; then
+		cf_cv_shared_soname='`basename $@ .${REL_VERSION}`.${ABI_VERSION}'
+	else
+		cf_cv_shared_soname='`basename $@`'
+	fi
+
+		MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,'$cf_cv_shared_soname',-stats,-lc -o $@'
+		;;
+	(mingw*msvc*)
+		cf_cv_shlib_version=msvcdll
+		cf_cv_shlib_version_infix=msvcdll
+		shlibdir=$bindir
+		MAKE_DLLS=
+		if test "$DFT_LWR_MODEL" = "shared" ; then
+			LOCAL_LDFLAGS="-link -dll"
+			LOCAL_LDFLAGS2="$LOCAL_LDFLAGS"
+			EXTRA_LDFLAGS="-link -dll $EXTRA_LDFLAGS"
+		fi
+		CC_SHARED_OPTS=
+		MK_SHARED_LIB=$SHELL' '$rel_builddir'/mk_shared_lib.sh $@ ${LD} ${CFLAGS}'
+		RM_SHARED_OPTS="$RM_SHARED_OPTS $rel_builddir/mk_shared_lib.sh *.dll.lib"
+		cat >mk_shared_lib.sh <<-CF_EOF
+		#!$SHELL
+		SHARED_LIB=\$1
+		IMPORT_LIB=\`echo "\$1" | sed -e 's/[0-9]*\.dll$/.dll.lib/'\`
+		shift
+		my_ld=\$1
+		shift
+		cat <<-EOF
+		Linking shared library
+		** SHARED LIB \$SHARED_LIB
+		** IMPORT_LIB \$IMPORT_LIB
+EOF
+		args=\$(echo \$* | sed -E "s#-l(\w*)#\1.dll.lib#g" | sed -E "s#-L(\w*)#-LIBPATH:\1#g")
+		exec \$my_ld -DLL -IMPLIB:"\${IMPORT_LIB}" -OUT:"\${SHARED_LIB}" ${LDFLAGS} \$args
+		mv "\${IMPORT_LIB}" "\${IMPORT_LIB}"
+CF_EOF
+		chmod +x mk_shared_lib.sh
+		cat >mk_prog.sh <<-CF_EOF
+		#!$SHELL
+		shift
+		# Ignore first argument (compiler) and use LD (link.exe) unconditionally
+		LD="$LD"
+		clopts=()
+		ldopts=("/subsystem:console")
+		libs=()
+		isdll=0
+		while test \$# -gt 0; do
+			case "\$1" in
+				-link)
+					# ignore -link argument
+					;;
+				-M[TD] | -M[TD]d)
+					# ignore runtime-library option
+					;;
+				-dll)
+					isdll=1
+					;;
+				-W* | -w*)
+					# ignore warnings
+					;;
+				-D*)
+					clopts+=("\$1")
+					;;
+				-I*)
+					clopts+=("\$1")
+					;;
+				-l*)
+					libs+=("\`echo \"\$1\" | sed \"s/^-l//\"\`")
+					;;
+				-L*)
+					ldopts+=("\`echo \"\$1\" | sed \"s/^-L/-LIBPATH:/\"\`")
+					;;
+				*.obj | *.o)
+					ldopts+=("\$1")
+					;;
+				-Wl,*)
+					for linkarg in \`echo '\$1' | sed -e 's/-Wl,//' -e 's/,/ /'\`; do
+						ldopts+=("\${linkarg}")
+					done
+					;;
+				*.lib)
+					ldopts+=("\$1")
+					;;
+				-o)
+					shift
+					ldopts+=("-out:\$1")
+					;;
+				*)
+					clopts+=("\$1")
+					ldopts+=("\$1")
+					;;
+			esac
+			shift
+		done
+		if [ "\$isdll" -ne 0 ]; then
+			for lib in \${libs[*]}; do
+				ldopts+=("\$lib.dll.lib")
+			done
+		else
+			for lib in \${libs[*]}; do
+				ldopts+=("\$lib.lib")
+			done
+		fi
+		cat <<-EOF
+		Creating program
+		** ld options:   "\${ldopts[@]}"
+EOF
+		exec \$LD \${ldopts[@]}
+CF_EOF
+		chmod +x mk_prog.sh
+		LINK_PROGS="$SHELL ${rel_builddir}/mk_prog.sh"
+		LINK_TESTS="$SHELL ${rel_builddir}/mk_prog.sh"
+		;;
+	(mingw*)
+		cf_cv_shlib_version=mingw
+		cf_cv_shlib_version_infix=mingw
+		shlibdir=$bindir
+		MAKE_DLLS=
+		if test "$DFT_LWR_MODEL" = "shared" ; then
+			LOCAL_LDFLAGS="-Wl,--enable-auto-import"
+			LOCAL_LDFLAGS2="$LOCAL_LDFLAGS"
+			EXTRA_LDFLAGS="-Wl,--enable-auto-import $EXTRA_LDFLAGS"
+		fi
+		CC_SHARED_OPTS=
+		MK_SHARED_LIB=$SHELL' '$rel_builddir'/mk_shared_lib.sh $@ ${CC} ${CFLAGS}'
+		RM_SHARED_OPTS="$RM_SHARED_OPTS $rel_builddir/mk_shared_lib.sh *.dll.a"
+		cat >mk_shared_lib.sh <<-CF_EOF
+		#!$SHELL
+		SHARED_LIB=\$1
+		IMPORT_LIB=\`echo "\$1" | sed -e 's/[0-9]*\.dll$/.dll.a/'\`
+		shift
+		cat <<-EOF
+		Linking shared library
+		** SHARED_LIB \$SHARED_LIB
+		** IMPORT_LIB \$IMPORT_LIB
+EOF
+		exec \$* ${LDFLAGS} -shared -Wl,--enable-auto-import,--out-implib=\${IMPORT_LIB} -Wl,--export-all-symbols -o \${SHARED_LIB}
+CF_EOF
+		chmod +x mk_shared_lib.sh
+		;;
+	(openbsd[2-9].*|mirbsd*)
+		if test "$DFT_LWR_MODEL" = "shared" && test -n "$LD_RPATH_OPT" ; then
+			LOCAL_LDFLAGS="${LD_RPATH_OPT}\$(LOCAL_LIBDIR)"
+			LOCAL_LDFLAGS2="$LOCAL_LDFLAGS"
+		fi
+		if test "$cf_cv_enable_rpath" = yes ; then
+			EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS"
+		fi
+		CC_SHARED_OPTS="$CC_SHARED_OPTS -DPIC"
+
+	test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel
+	if test "$cf_cv_shlib_version" = rel; then
+		cf_cv_shared_soname='`basename $@ .${REL_VERSION}`.${ABI_VERSION}'
+	else
+		cf_cv_shared_soname='`basename $@`'
+	fi
+
+		MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-Bshareable,-soname,'$cf_cv_shared_soname',-stats,-lc -o $@'
+		;;
+	(nskJ*)
+		CC_SHARED_OPTS=
+		MK_SHARED_LIB='${LD} -Wshared -Weld=-export_all -o $@'
+		;;
+	(nskL*)
+		CC_SHARED_OPTS=
+		MK_SHARED_LIB='${LD} -Wshared -Wxld=-export_all -o $@'
+		;;
+	(nto-qnx*|openbsd*|freebsd[12].*)
+		CC_SHARED_OPTS="$CC_SHARED_OPTS -DPIC"
+		MK_SHARED_LIB='${LD} ${LDFLAGS} -Bshareable -o $@'
+		test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel
+		;;
+	(dragonfly*|freebsd*)
+		CC_SHARED_OPTS="$CC_SHARED_OPTS -DPIC"
+		if test "$DFT_LWR_MODEL" = "shared" && test "$cf_cv_enable_rpath" = yes ; then
+			LOCAL_LDFLAGS="${cf_ld_rpath_opt}\$(LOCAL_LIBDIR)"
+			LOCAL_LDFLAGS2="${cf_ld_rpath_opt}\${RPATH_LIST} $LOCAL_LDFLAGS"
+			EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS"
+		fi
+
+	test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel
+	if test "$cf_cv_shlib_version" = rel; then
+		cf_cv_shared_soname='`basename $@ .${REL_VERSION}`.${ABI_VERSION}'
+	else
+		cf_cv_shared_soname='`basename $@`'
+	fi
+
+		MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,'$cf_cv_shared_soname',-stats,-lc -o $@'
+		;;
+	(netbsd*)
+		CC_SHARED_OPTS="$CC_SHARED_OPTS -DPIC"
+		if test "$DFT_LWR_MODEL" = "shared" && test "$cf_cv_enable_rpath" = yes ; then
+			LOCAL_LDFLAGS="${cf_ld_rpath_opt}\$(LOCAL_LIBDIR)"
+			LOCAL_LDFLAGS2="$LOCAL_LDFLAGS"
+			EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS"
+			if test "$cf_cv_shlib_version" = auto; then
+			if test -f /usr/libexec/ld.elf_so; then
+				cf_cv_shlib_version=abi
+			else
+				cf_cv_shlib_version=rel
+			fi
+			fi
+
+	test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel
+	if test "$cf_cv_shlib_version" = rel; then
+		cf_cv_shared_soname='`basename $@ .${REL_VERSION}`.${ABI_VERSION}'
+	else
+		cf_cv_shared_soname='`basename $@`'
+	fi
+
+			MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,'$cf_cv_shared_soname' -o $@'
+		else
+			MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -o $@'
+		fi
+		;;
+	(osf*|mls+*)
+		# tested with OSF/1 V3.2 and 'cc'
+		# tested with OSF/1 V3.2 and gcc 2.6.3 (but the c++ demo didn't
+		# link with shared libs).
+		MK_SHARED_LIB='${LD} ${LDFLAGS} -set_version ${REL_VERSION}:${ABI_VERSION} -expect_unresolved "*" -shared -soname `basename $@`'
+		case "$host_os" in
+		(osf4*)
+			MK_SHARED_LIB="${MK_SHARED_LIB} -msym"
+			;;
+		esac
+		MK_SHARED_LIB="${MK_SHARED_LIB}"' -o $@'
+		if test "$DFT_LWR_MODEL" = "shared" && test -n "$LD_RPATH_OPT" ; then
+			LOCAL_LDFLAGS="${LD_RPATH_OPT}\$(LOCAL_LIBDIR)"
+			LOCAL_LDFLAGS2="$LOCAL_LDFLAGS"
+		fi
+		cf_cv_rm_so_locs=yes
+		;;
+	(sco3.2v5*)  # also uw2* and UW7: hops 13-Apr-98
+		# tested with osr5.0.5
+		if test "$GCC" != yes; then
+			CC_SHARED_OPTS='-belf -KPIC'
+		fi
+		MK_SHARED_LIB='${LD} ${LDFLAGS} -dy -G -h `basename $@ .${REL_VERSION}`.${ABI_VERSION} -o $@'
+		if test "$cf_cv_enable_rpath" = yes ; then
+			# only way is to set LD_RUN_PATH but no switch for it
+			RUN_PATH=$libdir
+		fi
+		test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel
+		LINK_PROGS='LD_RUN_PATH=${libdir}'
+		LINK_TESTS='Pwd=`pwd`;LD_RUN_PATH=`dirname $${Pwd}`/lib'
+		;;
+	(sunos4*)
+		# tested with SunOS 4.1.1 and gcc 2.7.0
+		if test "$GCC" != yes; then
+			CC_SHARED_OPTS='-KPIC'
+		fi
+		MK_SHARED_LIB='${LD} ${LDFLAGS} -assert pure-text -o $@'
+		test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel
+		;;
+	(solaris2*)
+		# tested with SunOS 5.5.1 (solaris 2.5.1) and gcc 2.7.2
+		# tested with SunOS 5.10 (solaris 10) and gcc 3.4.3
+		if test "$DFT_LWR_MODEL" = "shared" ; then
+			LOCAL_LDFLAGS="-R \$(LOCAL_LIBDIR):\${libdir}"
+			LOCAL_LDFLAGS2="$LOCAL_LDFLAGS"
+		fi
+		if test "$cf_cv_enable_rpath" = yes ; then
+			EXTRA_LDFLAGS="-R \${libdir} $EXTRA_LDFLAGS"
+		fi
+
+	test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel
+	if test "$cf_cv_shlib_version" = rel; then
+		cf_cv_shared_soname='`basename $@ .${REL_VERSION}`.${ABI_VERSION}'
+	else
+		cf_cv_shared_soname='`basename $@`'
+	fi
+
+		if test "$GCC" != yes; then
+			cf_save_CFLAGS="$CFLAGS"
+			for cf_shared_opts in -xcode=pic32 -xcode=pic13 -KPIC -Kpic -O
+			do
+				CFLAGS="$cf_shared_opts $cf_save_CFLAGS"
+				cat >"conftest.$ac_ext" <<_ACEOF
+#line 6678 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello\\n");
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:6690: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:6693: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:6696: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:6699: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+			done
+			CFLAGS="$cf_save_CFLAGS"
+			CC_SHARED_OPTS=$cf_shared_opts
+			MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -dy -G -h '$cf_cv_shared_soname' -o $@'
+		else
+			MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -dy -G -h '$cf_cv_shared_soname' -o $@'
+		fi
+		;;
+	(sysv5uw7*|unix_sv*)
+		# tested with UnixWare 7.1.0 (gcc 2.95.2 and cc)
+		if test "$GCC" != yes; then
+			CC_SHARED_OPTS='-KPIC'
+		fi
+		MK_SHARED_LIB='${LD} ${LDFLAGS} -d y -G -o $@'
+		;;
+	(*)
+		CC_SHARED_OPTS='unknown'
+		MK_SHARED_LIB='echo unknown'
+		;;
+	esac
+
+	# This works if the last tokens in $MK_SHARED_LIB are the -o target.
+	case "$cf_cv_shlib_version" in
+	(rel|abi)
+		case "$MK_SHARED_LIB" in
+		(*'-o $@')
+			test "$cf_cv_do_symlinks" = no && cf_cv_do_symlinks=yes
+			;;
+		(*)
+			{ echo "$as_me:6736: WARNING: ignored --with-shlib-version" >&5
+echo "$as_me: WARNING: ignored --with-shlib-version" >&2;}
+			;;
+		esac
+		;;
+	esac
+
+	if test -n "$cf_try_cflags"
+	then
+cat > conftest.$ac_ext <<EOF
+#line 6746 "${as_me:-configure}"
+#include <stdio.h>
+int main(int argc, char *argv[])
+{
+	printf("hello\\n");
+	return (argv[argc-1] == 0) ;
+}
+EOF
+		cf_save_CFLAGS="$CFLAGS"
+		for cf_opt in $cf_try_cflags
+		do
+			CFLAGS="$cf_save_CFLAGS -$cf_opt"
+			echo "$as_me:6758: checking if CFLAGS option -$cf_opt works" >&5
+echo $ECHO_N "checking if CFLAGS option -$cf_opt works... $ECHO_C" >&6
+			if { (eval echo "$as_me:6760: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:6763: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; then
+				echo "$as_me:6765: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+				cf_save_CFLAGS="$CFLAGS"
+			else
+				echo "$as_me:6769: result: no" >&5
+echo "${ECHO_T}no" >&6
+			fi
+		done
+		CFLAGS="$cf_save_CFLAGS"
+	fi
+
+	# RPATH_LIST is a colon-separated list of directories
+	test -n "$cf_ld_rpath_opt" && MK_SHARED_LIB="$MK_SHARED_LIB $cf_ld_rpath_opt\${RPATH_LIST}"
+	test -z "$RPATH_LIST" && RPATH_LIST="\${libdir}"
+
+	test "$cf_cv_rm_so_locs" = yes && RM_SHARED_OPTS="$RM_SHARED_OPTS so_locations"
+
+	test -n "$verbose" && echo "	CC_SHARED_OPTS: $CC_SHARED_OPTS" 1>&6
+
+echo "${as_me:-configure}:6784: testing CC_SHARED_OPTS: $CC_SHARED_OPTS ..." 1>&5
+
+	test -n "$verbose" && echo "	MK_SHARED_LIB:  $MK_SHARED_LIB" 1>&6
+
+echo "${as_me:-configure}:6788: testing MK_SHARED_LIB:  $MK_SHARED_LIB ..." 1>&5
+
+for model in $cf_list_models ; do
+	case "$model" in
+	(libtool)
+
+echo "$as_me:6794: checking for additional libtool options" >&5
+echo $ECHO_N "checking for additional libtool options... $ECHO_C" >&6
+
+# Check whether --with-libtool-opts or --without-libtool-opts was given.
+if test "${with_libtool_opts+set}" = set; then
+  withval="$with_libtool_opts"
+  with_libtool_opts=$withval
+else
+  with_libtool_opts=no
+fi;
+echo "$as_me:6804: result: $with_libtool_opts" >&5
+echo "${ECHO_T}$with_libtool_opts" >&6
+
+case .$with_libtool_opts in
+(.yes|.no|.)
+	;;
+(*)
+	LIBTOOL_OPTS="$LIBTOOL_OPTS $with_libtool_opts"
+	;;
+esac
+
+echo "$as_me:6815: checking if exported-symbols file should be used" >&5
+echo $ECHO_N "checking if exported-symbols file should be used... $ECHO_C" >&6
+
+# Check whether --with-export-syms or --without-export-syms was given.
+if test "${with_export_syms+set}" = set; then
+  withval="$with_export_syms"
+  with_export_syms=$withval
+else
+  with_export_syms=no
+fi;
+if test "x$with_export_syms" = xyes
+then
+	with_export_syms='${top_srcdir}/package/${PACKAGE}.sym'
+
+fi
+echo "$as_me:6830: result: $with_export_syms" >&5
+echo "${ECHO_T}$with_export_syms" >&6
+if test "x$with_export_syms" != xno
+then
+	EXPORT_SYMS="-export-symbols $with_export_syms"
+
+fi
+
+		;;
+	(shared)
+		if test "$CC_SHARED_OPTS" = "unknown"; then
+			{ { echo "$as_me:6841: error: Shared libraries are not supported in this version" >&5
+echo "$as_me: error: Shared libraries are not supported in this version" >&2;}
+   { (exit 1); exit 1; }; }
+		fi
+		# workaround for inept transition to PIE vs PIC...
+		echo "$as_me:6846: checking if current CFLAGS link properly" >&5
+echo $ECHO_N "checking if current CFLAGS link properly... $ECHO_C" >&6
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 6849 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello work\\n");
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:6861: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:6864: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:6867: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:6870: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cflags_work=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cflags_work=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+		echo "$as_me:6879: result: $cf_cflags_work" >&5
+echo "${ECHO_T}$cf_cflags_work" >&6
+		if test "$cf_cflags_work" = no
+		then
+			test -n "$verbose" && echo "	try to work around by appending shared-options" 1>&6
+
+echo "${as_me:-configure}:6885: testing try to work around by appending shared-options ..." 1>&5
+
+			CFLAGS="$CFLAGS $CC_SHARED_OPTS"
+		fi
+
+echo "$as_me:6890: checking if versioned-symbols file should be used" >&5
+echo $ECHO_N "checking if versioned-symbols file should be used... $ECHO_C" >&6
+
+# Check whether --with-versioned-syms or --without-versioned-syms was given.
+if test "${with_versioned_syms+set}" = set; then
+  withval="$with_versioned_syms"
+  with_versioned_syms=$withval
+else
+  with_versioned_syms=no
+fi;
+case "x$with_versioned_syms" in
+(xyes)
+	with_versioned_syms='${top_srcdir}/package/${PACKAGE}.map'
+
+	;;
+(xno)
+	;;
+(x/*)
+	test -f "$with_versioned_syms" || { { echo "$as_me:6908: error: expected a filename: $with_versioned_syms" >&5
+echo "$as_me: error: expected a filename: $with_versioned_syms" >&2;}
+   { (exit 1); exit 1; }; }
+	;;
+(*)
+	test -f "$with_versioned_syms" || { { echo "$as_me:6913: error: expected a filename: $with_versioned_syms" >&5
+echo "$as_me: error: expected a filename: $with_versioned_syms" >&2;}
+   { (exit 1); exit 1; }; }
+	with_versioned_syms=`pwd`/"$with_versioned_syms"
+	;;
+esac
+echo "$as_me:6919: result: $with_versioned_syms" >&5
+echo "${ECHO_T}$with_versioned_syms" >&6
+
+RESULTING_SYMS=
+VERSIONED_SYMS=
+WILDCARD_SYMS=
+
+if test "x$with_versioned_syms" != xno
+then
+	RESULTING_SYMS=$with_versioned_syms
+	case "x$MK_SHARED_LIB" in
+	(*-Wl,*)
+		VERSIONED_SYMS="-Wl,--version-script,\${RESULTING_SYMS}"
+		MK_SHARED_LIB=`echo "$MK_SHARED_LIB" | sed -e "s%-Wl,%\\${VERSIONED_SYMS} -Wl,%"`
+		test -n "$verbose" && echo "	MK_SHARED_LIB:  $MK_SHARED_LIB" 1>&6
+
+echo "${as_me:-configure}:6935: testing MK_SHARED_LIB:  $MK_SHARED_LIB ..." 1>&5
+
+		;;
+	(*-dy\ *)
+		VERSIONED_SYMS="-Wl,-M,\${RESULTING_SYMS}"
+		MK_SHARED_LIB=`echo "$MK_SHARED_LIB" | sed -e "s%-dy%\\${VERSIONED_SYMS} -dy%"`
+		test -n "$verbose" && echo "	MK_SHARED_LIB:  $MK_SHARED_LIB" 1>&6
+
+echo "${as_me:-configure}:6943: testing MK_SHARED_LIB:  $MK_SHARED_LIB ..." 1>&5
+
+		;;
+	(*)
+		{ echo "$as_me:6947: WARNING: this system does not support versioned-symbols" >&5
+echo "$as_me: WARNING: this system does not support versioned-symbols" >&2;}
+		;;
+	esac
+
+	# Linux ld can selectively override scope, e.g., of symbols beginning with
+	# "_" by first declaring some as global, and then using a wildcard to
+	# declare the others as local.  Some other loaders cannot do this.  Check
+	# by constructing a (very) simple shared library and inspecting its
+	# symbols.
+	if test "x$VERSIONED_SYMS" != "x"
+	then
+		echo "$as_me:6959: checking if wildcards can be used to selectively omit symbols" >&5
+echo $ECHO_N "checking if wildcards can be used to selectively omit symbols... $ECHO_C" >&6
+		WILDCARD_SYMS=no
+
+		# make sources
+		rm -f conftest.*
+
+		cat >conftest.ver <<EOF
+module_1.0 {
+global:
+	globalf1;
+local:
+	localf1;
+};
+module_2.0 {
+global:
+	globalf2;
+local:
+	localf2;
+	_*;
+} module_1.0;
+submodule_1.0 {
+global:
+	subglobalf1;
+	_ismissing;
+local:
+	sublocalf1;
+};
+submodule_2.0 {
+global:
+	subglobalf2;
+local:
+	sublocalf2;
+	_*;
+} submodule_1.0;
+EOF
+		cat >conftest.$ac_ext <<EOF
+#line 6996 "configure"
+int	_ismissing(void) { return 1; }
+int	_localf1(void) { return 1; }
+int	_localf2(void) { return 2; }
+int	globalf1(void) { return 1; }
+int	globalf2(void) { return 2; }
+int	_sublocalf1(void) { return 1; }
+int	_sublocalf2(void) { return 2; }
+int	subglobalf1(void) { return 1; }
+int	subglobalf2(void) { return 2; }
+EOF
+		cat >conftest.mk <<EOF
+CC=${CC}
+CFLAGS=${CFLAGS}
+CPPFLAGS=${CPPFLAGS}
+LDFLAGS=${LDFLAGS}
+LIBS=${LIBS}
+VERSIONED_SYMS=${VERSIONED_SYMS}
+RESULTING_SYMS=conftest.ver
+MK_SHARED_LIB=${MK_SHARED_LIB}
+conftest.so: conftest.$ac_cv_objext
+		\$(MK_SHARED_LIB) conftest.$ac_cv_objext
+EOF
+
+		# compile source, make library
+		if make -f conftest.mk 2>&5 >/dev/null
+		then
+			# test for missing symbol in either Data or Text section
+			cf_missing="`nm -P conftest.so 2>&5 |${FGREP-fgrep} _ismissing | ${EGREP-egrep} '[ 	][DT][ 	]'`"
+			test -n "$cf_missing" && WILDCARD_SYMS=yes
+		fi
+		echo "$as_me:7027: result: $WILDCARD_SYMS" >&5
+echo "${ECHO_T}$WILDCARD_SYMS" >&6
+		rm -f conftest.*
+	fi
+fi
+
+		;;
+	esac
+done
+
+### Checks for special libraries, must be done up-front.
+SHLIB_LIST=""
+
+echo "$as_me:7040: checking if you want to link with the GPM mouse library" >&5
+echo $ECHO_N "checking if you want to link with the GPM mouse library... $ECHO_C" >&6
+
+# Check whether --with-gpm or --without-gpm was given.
+if test "${with_gpm+set}" = set; then
+  withval="$with_gpm"
+  with_gpm=$withval
+else
+  with_gpm=maybe
+fi;
+echo "$as_me:7050: result: $with_gpm" >&5
+echo "${ECHO_T}$with_gpm" >&6
+
+if test "$with_gpm" != no ; then
+	echo "$as_me:7054: checking for gpm.h" >&5
+echo $ECHO_N "checking for gpm.h... $ECHO_C" >&6
+if test "${ac_cv_header_gpm_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 7060 "configure"
+#include "confdefs.h"
+#include <gpm.h>
+_ACEOF
+if { (eval echo "$as_me:7064: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:7070: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_cv_header_gpm_h=yes
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  ac_cv_header_gpm_h=no
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:7089: result: $ac_cv_header_gpm_h" >&5
+echo "${ECHO_T}$ac_cv_header_gpm_h" >&6
+if test "$ac_cv_header_gpm_h" = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_GPM_H 1
+EOF
+
+		if test "$with_gpm" != yes && test "$with_gpm" != maybe ; then
+			test -n "$verbose" && echo "	assuming we really have GPM library" 1>&6
+
+echo "${as_me:-configure}:7100: testing assuming we really have GPM library ..." 1>&5
+
+cat >>confdefs.h <<\EOF
+#define HAVE_LIBGPM 1
+EOF
+
+			with_gpm=yes
+		else
+			echo "$as_me:7108: checking for Gpm_Open in -lgpm" >&5
+echo $ECHO_N "checking for Gpm_Open in -lgpm... $ECHO_C" >&6
+if test "${ac_cv_lib_gpm_Gpm_Open+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lgpm  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 7116 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char Gpm_Open ();
+int
+main (void)
+{
+Gpm_Open ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:7135: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:7138: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:7141: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:7144: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_gpm_Gpm_Open=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_gpm_Gpm_Open=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:7155: result: $ac_cv_lib_gpm_Gpm_Open" >&5
+echo "${ECHO_T}$ac_cv_lib_gpm_Gpm_Open" >&6
+if test "$ac_cv_lib_gpm_Gpm_Open" = yes; then
+  with_gpm=yes
+else
+
+				if test "$with_gpm" = maybe; then
+					{ echo "$as_me:7162: WARNING: Cannot link with GPM library" >&5
+echo "$as_me: WARNING: Cannot link with GPM library" >&2;}
+					with_gpm=no
+				else
+					{ { echo "$as_me:7166: error: Cannot link with GPM library" >&5
+echo "$as_me: error: Cannot link with GPM library" >&2;}
+   { (exit 1); exit 1; }; }
+				fi
+
+fi
+
+		fi
+
+else
+
+		test "$with_gpm" != maybe && { echo "$as_me:7177: WARNING: Cannot find GPM header" >&5
+echo "$as_me: WARNING: Cannot find GPM header" >&2;}
+		with_gpm=no
+
+fi
+
+fi
+
+if test "$with_gpm" != no ; then
+	echo "$as_me:7186: checking if you want to load GPM dynamically" >&5
+echo $ECHO_N "checking if you want to load GPM dynamically... $ECHO_C" >&6
+
+# Check whether --with-dlsym or --without-dlsym was given.
+if test "${with_dlsym+set}" = set; then
+  withval="$with_dlsym"
+  with_dlsym=$withval
+else
+  with_dlsym=yes
+fi;
+	echo "$as_me:7196: result: $with_dlsym" >&5
+echo "${ECHO_T}$with_dlsym" >&6
+	if test "x$with_dlsym" = xyes ; then
+
+cf_have_dlsym=no
+echo "$as_me:7201: checking for dlsym" >&5
+echo $ECHO_N "checking for dlsym... $ECHO_C" >&6
+if test "${ac_cv_func_dlsym+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 7207 "configure"
+#include "confdefs.h"
+#define dlsym autoconf_temporary
+#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
+#undef dlsym
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char dlsym (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_dlsym) || defined (__stub___dlsym)
+#error found stub for dlsym
+#endif
+
+	return dlsym ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:7238: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:7241: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:7244: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:7247: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_func_dlsym=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_dlsym=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:7257: result: $ac_cv_func_dlsym" >&5
+echo "${ECHO_T}$ac_cv_func_dlsym" >&6
+if test "$ac_cv_func_dlsym" = yes; then
+  cf_have_dlsym=yes
+else
+
+cf_have_libdl=no
+echo "$as_me:7264: checking for dlsym in -ldl" >&5
+echo $ECHO_N "checking for dlsym in -ldl... $ECHO_C" >&6
+if test "${ac_cv_lib_dl_dlsym+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 7272 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char dlsym ();
+int
+main (void)
+{
+dlsym ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:7291: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:7294: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:7297: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:7300: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_dl_dlsym=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_dl_dlsym=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:7311: result: $ac_cv_lib_dl_dlsym" >&5
+echo "${ECHO_T}$ac_cv_lib_dl_dlsym" >&6
+if test "$ac_cv_lib_dl_dlsym" = yes; then
+
+	cf_have_dlsym=yes
+	cf_have_libdl=yes
+fi
+
+fi
+
+if test "$cf_have_dlsym" = yes ; then
+	test "$cf_have_libdl" = yes && {
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -ldl; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+ }
+
+	echo "$as_me:7340: checking whether able to link to dl*() functions" >&5
+echo $ECHO_N "checking whether able to link to dl*() functions... $ECHO_C" >&6
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 7343 "configure"
+#include "confdefs.h"
+#include <dlfcn.h>
+int
+main (void)
+{
+
+		void *obj;
+		if ((obj = dlopen("filename", 0)) != 0) {
+			if (dlsym(obj, "symbolname") == 0) {
+			dlclose(obj);
+			}
+		}
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:7361: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:7364: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:7367: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:7370: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_LIBDL 1
+EOF
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+		{ { echo "$as_me:7381: error: Cannot link test program for libdl" >&5
+echo "$as_me: error: Cannot link test program for libdl" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+	echo "$as_me:7386: result: ok" >&5
+echo "${ECHO_T}ok" >&6
+else
+	{ { echo "$as_me:7389: error: Cannot find dlsym function" >&5
+echo "$as_me: error: Cannot find dlsym function" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+		if test "x$with_gpm" != xyes ; then
+			test -n "$verbose" && echo "	assuming soname for gpm is $with_gpm" 1>&6
+
+echo "${as_me:-configure}:7397: testing assuming soname for gpm is $with_gpm ..." 1>&5
+
+			cf_cv_gpm_soname="$with_gpm"
+		else
+
+echo "$as_me:7402: checking for soname of gpm library" >&5
+echo $ECHO_N "checking for soname of gpm library... $ECHO_C" >&6
+if test "${cf_cv_gpm_soname+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cf_cv_gpm_soname=unknown
+if test "$cross_compiling" != yes ; then
+cat >conftest.$ac_ext <<CF_EOF
+#include <gpm.h>
+int main(void)
+{
+if (Gpm_Open(0,0)) Gpm_Close();
+	${cf_cv_main_return:-return}(0);
+}
+CF_EOF
+cf_save_LIBS="$LIBS"
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lgpm; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+	if { (eval echo "$as_me:7436: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:7439: \$? = $ac_status" >&5
+  (exit "$ac_status"); } ; then
+		if { (eval echo "$as_me:7441: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:7444: \$? = $ac_status" >&5
+  (exit "$ac_status"); } ; then
+			cf_cv_gpm_soname="`ldd \"conftest$ac_exeext\" 2>/dev/null | sed -e 's,^.*/,,' -e 's, .*$,,' | ${FGREP-fgrep} libgpm.`"
+			test -z "$cf_cv_gpm_soname" && cf_cv_gpm_soname=unknown
+		fi
+	fi
+rm -rf ./conftest*
+LIBS="$cf_save_LIBS"
+fi
+
+fi
+echo "$as_me:7455: result: $cf_cv_gpm_soname" >&5
+echo "${ECHO_T}$cf_cv_gpm_soname" >&6
+
+		fi
+		test "$cf_cv_gpm_soname" != "unknown" &&
+cat >>confdefs.h <<EOF
+#define LIBGPM_SONAME "$cf_cv_gpm_soname"
+EOF
+
+		SHLIB_LIST="-ldl $SHLIB_LIST"
+
+cf_add_libs="$PRIVATE_LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -ldl; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+PRIVATE_LIBS="$cf_add_libs"
+
+	else
+		SHLIB_LIST="-lgpm $SHLIB_LIST"
+
+cf_add_libs="$TEST_LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lgpm; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+TEST_LIBS="$cf_add_libs"
+
+cf_add_libs="$PRIVATE_LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lgpm; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+PRIVATE_LIBS="$cf_add_libs"
+
+	fi
+
+cat >>confdefs.h <<\EOF
+#define HAVE_LIBGPM 1
+EOF
+
+echo "$as_me:7523: checking for Gpm_Wgetch in -lgpm" >&5
+echo $ECHO_N "checking for Gpm_Wgetch in -lgpm... $ECHO_C" >&6
+if test "${ac_cv_lib_gpm_Gpm_Wgetch+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lgpm  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 7531 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char Gpm_Wgetch ();
+int
+main (void)
+{
+Gpm_Wgetch ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:7550: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:7553: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:7556: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:7559: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_gpm_Gpm_Wgetch=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_gpm_Gpm_Wgetch=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:7570: result: $ac_cv_lib_gpm_Gpm_Wgetch" >&5
+echo "${ECHO_T}$ac_cv_lib_gpm_Gpm_Wgetch" >&6
+if test "$ac_cv_lib_gpm_Gpm_Wgetch" = yes; then
+
+echo "$as_me:7574: checking if GPM is weakly bound to curses library" >&5
+echo $ECHO_N "checking if GPM is weakly bound to curses library... $ECHO_C" >&6
+if test "${cf_cv_check_gpm_wgetch+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cf_cv_check_gpm_wgetch=unknown
+if test "$cross_compiling" != yes ; then
+
+cat >conftest.$ac_ext <<CF_EOF
+#include <gpm.h>
+int main(void)
+{
+	Gpm_Wgetch();
+	${cf_cv_main_return:-return}(0);
+}
+CF_EOF
+
+	cf_save_LIBS="$LIBS"
+	# This only works if we can look at the symbol table.  If a shared
+	# library is stripped for install, we cannot use that.  So we're forced
+	# to rely on the static library, noting that some packagers may not
+	# include it.
+	LIBS="-static -lgpm -dynamic $LIBS"
+	if { (eval echo "$as_me:7598: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:7601: \$? = $ac_status" >&5
+  (exit "$ac_status"); } ; then
+		if { (eval echo "$as_me:7603: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:7606: \$? = $ac_status" >&5
+  (exit "$ac_status"); } ; then
+			cf_cv_check_gpm_wgetch="`nm \"conftest$ac_exeext\" | ${EGREP-egrep} '\<wgetch\>' | ${EGREP-egrep} '\<[vVwW]\>'`"
+			test -n "$cf_cv_check_gpm_wgetch" && cf_cv_check_gpm_wgetch=yes
+			test -z "$cf_cv_check_gpm_wgetch" && cf_cv_check_gpm_wgetch=no
+		fi
+	fi
+	rm -rf ./conftest*
+	LIBS="$cf_save_LIBS"
+fi
+
+fi
+echo "$as_me:7618: result: $cf_cv_check_gpm_wgetch" >&5
+echo "${ECHO_T}$cf_cv_check_gpm_wgetch" >&6
+
+if test "$cf_cv_check_gpm_wgetch" != yes ; then
+	{ echo "$as_me:7622: WARNING: GPM library is already linked with curses - read the FAQ" >&5
+echo "$as_me: WARNING: GPM library is already linked with curses - read the FAQ" >&2;}
+fi
+
+fi
+
+fi
+
+echo "$as_me:7630: checking if you want to use PCRE2 for regular-expressions" >&5
+echo $ECHO_N "checking if you want to use PCRE2 for regular-expressions... $ECHO_C" >&6
+
+# Check whether --with-pcre2 or --without-pcre2 was given.
+if test "${with_pcre2+set}" = set; then
+  withval="$with_pcre2"
+
+fi;
+test -z "$with_pcre2" && with_pcre2=no
+echo "$as_me:7639: result: $with_pcre2" >&5
+echo "${ECHO_T}$with_pcre2" >&6
+
+if test "x$with_pcre2" != xno ; then
+	cf_with_pcre2_ok=no
+	for cf_with_pcre2 in libpcre2 libpcre2-posix libpcre
+	do
+
+if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists "$cf_with_pcre2"; then
+	test -n "$verbose" && echo "	found package $cf_with_pcre2" 1>&6
+
+echo "${as_me:-configure}:7650: testing found package $cf_with_pcre2 ..." 1>&5
+
+	cf_pkgconfig_incs="`$PKG_CONFIG --cflags "$cf_with_pcre2" 2>/dev/null`"
+	cf_pkgconfig_libs="`$PKG_CONFIG --libs   "$cf_with_pcre2" 2>/dev/null`"
+	test -n "$verbose" && echo "	package $cf_with_pcre2 CFLAGS: $cf_pkgconfig_incs" 1>&6
+
+echo "${as_me:-configure}:7656: testing package $cf_with_pcre2 CFLAGS: $cf_pkgconfig_incs ..." 1>&5
+
+	test -n "$verbose" && echo "	package $cf_with_pcre2 LIBS: $cf_pkgconfig_libs" 1>&6
+
+echo "${as_me:-configure}:7660: testing package $cf_with_pcre2 LIBS: $cf_pkgconfig_libs ..." 1>&5
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_pkgconfig_incs
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+	cf_with_pcre2_ok=yes; break
+else
+	cf_pkgconfig_incs=
+	cf_pkgconfig_libs=
+	:
+fi
+
+	done
+	cf_with_pcre2_ok=yes || { { echo "$as_me:7784: error: Cannot find PCRE2 library" >&5
+echo "$as_me: error: Cannot find PCRE2 library" >&2;}
+   { (exit 1); exit 1; }; }
+
+cat >>confdefs.h <<\EOF
+#define HAVE_LIB_PCRE2 1
+EOF
+
+	# if pkgconfig gave no results, look for the libraries directly
+	case "$LIBS" in
+	(*pcre2-posix*|*pcreposix*)
+		;;
+	(*)
+		echo "$as_me:7797: checking for regcomp in -lpcre2-posix" >&5
+echo $ECHO_N "checking for regcomp in -lpcre2-posix... $ECHO_C" >&6
+if test "${ac_cv_lib_pcre2_posix_regcomp+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpcre2-posix  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 7805 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char regcomp ();
+int
+main (void)
+{
+regcomp ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:7824: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:7827: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:7830: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:7833: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_pcre2_posix_regcomp=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_pcre2_posix_regcomp=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:7844: result: $ac_cv_lib_pcre2_posix_regcomp" >&5
+echo "${ECHO_T}$ac_cv_lib_pcre2_posix_regcomp" >&6
+if test "$ac_cv_lib_pcre2_posix_regcomp" = yes; then
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lpcre2-posix; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+else
+  echo "$as_me:7865: checking for regcomp in -lpcreposix" >&5
+echo $ECHO_N "checking for regcomp in -lpcreposix... $ECHO_C" >&6
+if test "${ac_cv_lib_pcreposix_regcomp+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpcreposix  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 7873 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char regcomp ();
+int
+main (void)
+{
+regcomp ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:7892: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:7895: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:7898: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:7901: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_pcreposix_regcomp=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_pcreposix_regcomp=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:7912: result: $ac_cv_lib_pcreposix_regcomp" >&5
+echo "${ECHO_T}$ac_cv_lib_pcreposix_regcomp" >&6
+if test "$ac_cv_lib_pcreposix_regcomp" = yes; then
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lpcreposix; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+else
+  { { echo "$as_me:7933: error: Cannot find PCRE2 POSIX library" >&5
+echo "$as_me: error: Cannot find PCRE2 POSIX library" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+fi
+
+		;;
+	esac
+
+	# either way, check for the library header files
+
+for ac_header in pcre2posix.h pcreposix.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:7948: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 7954 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:7958: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:7964: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:7983: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+for ac_func in PCRE2regcomp
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:7996: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 8002 "configure"
+#include "confdefs.h"
+#define $ac_func autoconf_temporary
+#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
+#undef $ac_func
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char $ac_func (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+#error found stub for $ac_func
+#endif
+
+	return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:8033: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:8036: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:8039: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:8042: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_var=no"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:8052: result: `eval echo '${'"$as_ac_var"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6
+if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+fi
+
+# not everyone has "test -c"
+if test -c /dev/sysmouse 2>/dev/null ; then
+echo "$as_me:8066: checking if you want to use sysmouse" >&5
+echo $ECHO_N "checking if you want to use sysmouse... $ECHO_C" >&6
+
+# Check whether --with-sysmouse or --without-sysmouse was given.
+if test "${with_sysmouse+set}" = set; then
+  withval="$with_sysmouse"
+  cf_with_sysmouse=$withval
+else
+  cf_with_sysmouse=maybe
+fi;
+	if test "$cf_with_sysmouse" != no ; then
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 8078 "configure"
+#include "confdefs.h"
+
+#include <osreldate.h>
+#if (__FreeBSD_version >= 400017)
+#include <sys/consio.h>
+#include <sys/fbio.h>
+#else
+#include <machine/console.h>
+#endif
+
+int
+main (void)
+{
+
+	struct mouse_info the_mouse;
+	ioctl(0, CONS_MOUSECTL, &the_mouse);
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:8101: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:8104: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:8107: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:8110: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_with_sysmouse=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_with_sysmouse=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+	fi
+echo "$as_me:8120: result: $cf_with_sysmouse" >&5
+echo "${ECHO_T}$cf_with_sysmouse" >&6
+test "$cf_with_sysmouse" = yes &&
+cat >>confdefs.h <<\EOF
+#define USE_SYSMOUSE 1
+EOF
+
+fi
+
+# pretend that ncurses==ncursesw==ncursest
+echo "$as_me:8130: checking if you want to disable library suffixes" >&5
+echo $ECHO_N "checking if you want to disable library suffixes... $ECHO_C" >&6
+
+# Check whether --enable-lib-suffixes or --disable-lib-suffixes was given.
+if test "${enable_lib_suffixes+set}" = set; then
+  enableval="$enable_lib_suffixes"
+  test "$enableval" != no && enableval=yes
+	if test "$enableval" != "yes" ; then
+    disable_lib_suffixes=yes
+	else
+		disable_lib_suffixes=no
+	fi
+else
+  enableval=yes
+	disable_lib_suffixes=no
+
+fi;
+echo "$as_me:8147: result: $disable_lib_suffixes" >&5
+echo "${ECHO_T}$disable_lib_suffixes" >&6
+
+### If we're building with rpath, try to link non-standard libs that way too.
+if test "$DFT_LWR_MODEL" = "shared" && test "x$cf_cv_enable_rpath" != xno; then
+
+echo "$as_me:8153: checking if rpath-hack should be disabled" >&5
+echo $ECHO_N "checking if rpath-hack should be disabled... $ECHO_C" >&6
+
+# Check whether --enable-rpath-hack or --disable-rpath-hack was given.
+if test "${enable_rpath_hack+set}" = set; then
+  enableval="$enable_rpath_hack"
+  test "$enableval" != no && enableval=yes
+	if test "$enableval" != "yes" ; then
+    enable_rpath_hack=no
+	else
+		enable_rpath_hack=yes
+	fi
+else
+  enableval=yes
+	enable_rpath_hack=yes
+
+fi;
+if test "x$enable_rpath_hack" = xno; then cf_disable_rpath_hack=yes; else cf_disable_rpath_hack=no; fi
+echo "$as_me:8171: result: $cf_disable_rpath_hack" >&5
+echo "${ECHO_T}$cf_disable_rpath_hack" >&6
+
+if test "$enable_rpath_hack" = yes ; then
+
+echo "$as_me:8176: checking for updated LDFLAGS" >&5
+echo $ECHO_N "checking for updated LDFLAGS... $ECHO_C" >&6
+if test -n "$LD_RPATH_OPT" ; then
+	echo "$as_me:8179: result: maybe" >&5
+echo "${ECHO_T}maybe" >&6
+
+	for ac_prog in ldd
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:8186: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_cf_ldd_prog+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$cf_ldd_prog"; then
+  ac_cv_prog_cf_ldd_prog="$cf_ldd_prog" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_cf_ldd_prog="$ac_prog"
+echo "$as_me:8201: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+cf_ldd_prog=$ac_cv_prog_cf_ldd_prog
+if test -n "$cf_ldd_prog"; then
+  echo "$as_me:8209: result: $cf_ldd_prog" >&5
+echo "${ECHO_T}$cf_ldd_prog" >&6
+else
+  echo "$as_me:8212: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$cf_ldd_prog" && break
+done
+test -n "$cf_ldd_prog" || cf_ldd_prog="no"
+
+	cf_rpath_list="/usr/lib /lib"
+	if test "$cf_ldd_prog" != no
+	then
+		cf_rpath_oops=
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 8226 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello");
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:8238: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:8241: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:8244: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:8247: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_rpath_oops=`"$cf_ldd_prog" "conftest$ac_exeext" | ${FGREP-fgrep} ' not found' | sed -e 's% =>.*$%%' |sort | uniq`
+		 cf_rpath_list=`"$cf_ldd_prog" "conftest$ac_exeext" | ${FGREP-fgrep} / | sed -e 's%^.*[ 	]/%/%' -e 's%/[^/][^/]*$%%' |sort | uniq`
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+		# If we passed the link-test, but get a "not found" on a given library,
+		# this could be due to inept reconfiguration of gcc to make it only
+		# partly honor /usr/local/lib (or whatever).  Sometimes this behavior
+		# is intentional, e.g., installing gcc in /usr/bin and suppressing the
+		# /usr/local libraries.
+		if test -n "$cf_rpath_oops"
+		then
+			for cf_rpath_src in $cf_rpath_oops
+			do
+				for cf_rpath_dir in \
+					/usr/local \
+					/usr/pkg \
+					/opt/sfw
+				do
+					if test -f "$cf_rpath_dir/lib/$cf_rpath_src"
+					then
+						test -n "$verbose" && echo "	...adding -L$cf_rpath_dir/lib to LDFLAGS for $cf_rpath_src" 1>&6
+
+echo "${as_me:-configure}:8275: testing ...adding -L$cf_rpath_dir/lib to LDFLAGS for $cf_rpath_src ..." 1>&5
+
+						LDFLAGS="$LDFLAGS -L$cf_rpath_dir/lib"
+						break
+					fi
+				done
+			done
+		fi
+	fi
+
+	test -n "$verbose" && echo "	...checking EXTRA_LDFLAGS $EXTRA_LDFLAGS" 1>&6
+
+echo "${as_me:-configure}:8287: testing ...checking EXTRA_LDFLAGS $EXTRA_LDFLAGS ..." 1>&5
+
+test -n "$verbose" && echo "	...checking LDFLAGS $LDFLAGS" 1>&6
+
+echo "${as_me:-configure}:8291: testing ...checking LDFLAGS $LDFLAGS ..." 1>&5
+
+cf_rpath_dst=
+for cf_rpath_src in $LDFLAGS
+do
+	case "$cf_rpath_src" in
+	(-L*)
+
+		# check if this refers to a directory which we will ignore
+		cf_rpath_skip=no
+		if test -n "$cf_rpath_list"
+		then
+			for cf_rpath_item in $cf_rpath_list
+			do
+				if test "x$cf_rpath_src" = "x-L$cf_rpath_item"
+				then
+					cf_rpath_skip=yes
+					break
+				fi
+			done
+		fi
+
+		if test "$cf_rpath_skip" = no
+		then
+			# transform the option
+			if test "$LD_RPATH_OPT" = "-R " ; then
+				cf_rpath_tmp=`echo "$cf_rpath_src" |sed -e "s%-L%-R %"`
+			else
+				cf_rpath_tmp=`echo "$cf_rpath_src" |sed -e "s%-L%$LD_RPATH_OPT%"`
+			fi
+
+			# if we have not already added this, add it now
+			cf_rpath_tst=`echo "$EXTRA_LDFLAGS" | sed -e "s%$cf_rpath_tmp %%"`
+			if test "x$cf_rpath_tst" = "x$EXTRA_LDFLAGS"
+			then
+				test -n "$verbose" && echo "	...Filter $cf_rpath_src ->$cf_rpath_tmp" 1>&6
+
+echo "${as_me:-configure}:8328: testing ...Filter $cf_rpath_src ->$cf_rpath_tmp ..." 1>&5
+
+				EXTRA_LDFLAGS="$cf_rpath_tmp $EXTRA_LDFLAGS"
+			fi
+		fi
+		;;
+	esac
+	cf_rpath_dst="$cf_rpath_dst $cf_rpath_src"
+done
+LDFLAGS=$cf_rpath_dst
+
+test -n "$verbose" && echo "	...checked LDFLAGS $LDFLAGS" 1>&6
+
+echo "${as_me:-configure}:8341: testing ...checked LDFLAGS $LDFLAGS ..." 1>&5
+
+test -n "$verbose" && echo "	...checking LIBS $LIBS" 1>&6
+
+echo "${as_me:-configure}:8345: testing ...checking LIBS $LIBS ..." 1>&5
+
+cf_rpath_dst=
+for cf_rpath_src in $LIBS
+do
+	case "$cf_rpath_src" in
+	(-L*)
+
+		# check if this refers to a directory which we will ignore
+		cf_rpath_skip=no
+		if test -n "$cf_rpath_list"
+		then
+			for cf_rpath_item in $cf_rpath_list
+			do
+				if test "x$cf_rpath_src" = "x-L$cf_rpath_item"
+				then
+					cf_rpath_skip=yes
+					break
+				fi
+			done
+		fi
+
+		if test "$cf_rpath_skip" = no
+		then
+			# transform the option
+			if test "$LD_RPATH_OPT" = "-R " ; then
+				cf_rpath_tmp=`echo "$cf_rpath_src" |sed -e "s%-L%-R %"`
+			else
+				cf_rpath_tmp=`echo "$cf_rpath_src" |sed -e "s%-L%$LD_RPATH_OPT%"`
+			fi
+
+			# if we have not already added this, add it now
+			cf_rpath_tst=`echo "$EXTRA_LDFLAGS" | sed -e "s%$cf_rpath_tmp %%"`
+			if test "x$cf_rpath_tst" = "x$EXTRA_LDFLAGS"
+			then
+				test -n "$verbose" && echo "	...Filter $cf_rpath_src ->$cf_rpath_tmp" 1>&6
+
+echo "${as_me:-configure}:8382: testing ...Filter $cf_rpath_src ->$cf_rpath_tmp ..." 1>&5
+
+				EXTRA_LDFLAGS="$cf_rpath_tmp $EXTRA_LDFLAGS"
+			fi
+		fi
+		;;
+	esac
+	cf_rpath_dst="$cf_rpath_dst $cf_rpath_src"
+done
+LIBS=$cf_rpath_dst
+
+test -n "$verbose" && echo "	...checked LIBS $LIBS" 1>&6
+
+echo "${as_me:-configure}:8395: testing ...checked LIBS $LIBS ..." 1>&5
+
+	test -n "$verbose" && echo "	...checked EXTRA_LDFLAGS $EXTRA_LDFLAGS" 1>&6
+
+echo "${as_me:-configure}:8399: testing ...checked EXTRA_LDFLAGS $EXTRA_LDFLAGS ..." 1>&5
+
+else
+	echo "$as_me:8402: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+
+fi
+
+### Depending on the system, someone may use rpath to build ncurses but not
+# want users of the package to rely upon that feature.  Give those people an
+# option to suppress that detail from EXTRA_LDFLAGS.
+EXTRA_PKG_LDFLAGS="$LDFLAGS $EXTRA_LDFLAGS"
+if test -n "$EXTRA_PKG_LDFLAGS"
+then
+	echo "$as_me:8416: checking if you want to disable extra LDFLAGS for package-scripts" >&5
+echo $ECHO_N "checking if you want to disable extra LDFLAGS for package-scripts... $ECHO_C" >&6
+
+# Check whether --enable-pkg-ldflags or --disable-pkg-ldflags was given.
+if test "${enable_pkg_ldflags+set}" = set; then
+  enableval="$enable_pkg_ldflags"
+  test "$enableval" != no && enableval=yes
+	if test "$enableval" != "yes" ; then
+    disable_pkg_ldflags=yes
+	else
+		disable_pkg_ldflags=no
+	fi
+else
+  enableval=yes
+	disable_pkg_ldflags=no
+
+fi;
+	echo "$as_me:8433: result: $disable_pkg_ldflags" >&5
+echo "${ECHO_T}$disable_pkg_ldflags" >&6
+	test "$disable_pkg_ldflags" = yes && EXTRA_PKG_LDFLAGS=
+fi
+
+###############################################################################
+
+###	use option --with-extra-suffix to append suffix to headers and libraries
+echo "$as_me:8441: checking if you wish to append extra suffix to header/library paths" >&5
+echo $ECHO_N "checking if you wish to append extra suffix to header/library paths... $ECHO_C" >&6
+EXTRA_SUFFIX=
+
+# Check whether --with-extra-suffix or --without-extra-suffix was given.
+if test "${with_extra_suffix+set}" = set; then
+  withval="$with_extra_suffix"
+  case x$withval in
+	(xno)
+		;;
+	(xyes|x)
+		EXTRA_SUFFIX=$cf_cv_abi_version
+		;;
+	(*)
+		EXTRA_SUFFIX=$withval
+		;;
+	esac
+
+fi;
+echo "$as_me:8460: result: $EXTRA_SUFFIX" >&5
+echo "${ECHO_T}$EXTRA_SUFFIX" >&6
+
+###	use option --disable-overwrite to leave out the link to -lcurses
+echo "$as_me:8464: checking if you wish to install ncurses overwriting curses" >&5
+echo $ECHO_N "checking if you wish to install ncurses overwriting curses... $ECHO_C" >&6
+
+# Check whether --enable-overwrite or --disable-overwrite was given.
+if test "${enable_overwrite+set}" = set; then
+  enableval="$enable_overwrite"
+  with_overwrite=$enableval
+else
+  if test "$prefix" = "/usr" ; then with_overwrite=yes; else with_overwrite=no; fi
+fi;
+echo "$as_me:8474: result: $with_overwrite" >&5
+echo "${ECHO_T}$with_overwrite" >&6
+
+echo "$as_me:8477: checking if external terminfo-database is used" >&5
+echo $ECHO_N "checking if external terminfo-database is used... $ECHO_C" >&6
+
+# Check whether --enable-database or --disable-database was given.
+if test "${enable_database+set}" = set; then
+  enableval="$enable_database"
+  use_database=$enableval
+else
+  use_database=yes
+fi;
+echo "$as_me:8487: result: $use_database" >&5
+echo "${ECHO_T}$use_database" >&6
+
+case "$host_os" in
+(os2*)
+	TERMINFO_SRC='${top_srcdir}/misc/emx.src'
+	;;
+(*)
+	TERMINFO_SRC='${top_srcdir}/misc/terminfo.src'
+	;;
+esac
+
+NCURSES_USE_DATABASE=0
+if test "$use_database" != no ; then
+	NCURSES_USE_DATABASE=1
+
+	echo "$as_me:8503: checking which terminfo source-file will be installed" >&5
+echo $ECHO_N "checking which terminfo source-file will be installed... $ECHO_C" >&6
+
+# Check whether --with-database or --without-database was given.
+if test "${with_database+set}" = set; then
+  withval="$with_database"
+  TERMINFO_SRC=$withval
+fi;
+	echo "$as_me:8511: result: $TERMINFO_SRC" >&5
+echo "${ECHO_T}$TERMINFO_SRC" >&6
+
+	echo "$as_me:8514: checking whether to use hashed database instead of directory/tree" >&5
+echo $ECHO_N "checking whether to use hashed database instead of directory/tree... $ECHO_C" >&6
+
+# Check whether --with-hashed-db or --without-hashed-db was given.
+if test "${with_hashed_db+set}" = set; then
+  withval="$with_hashed_db"
+
+else
+  with_hashed_db=no
+fi;
+	echo "$as_me:8524: result: $with_hashed_db" >&5
+echo "${ECHO_T}$with_hashed_db" >&6
+else
+	with_hashed_db=no
+fi
+
+echo "$as_me:8530: checking for list of fallback descriptions" >&5
+echo $ECHO_N "checking for list of fallback descriptions... $ECHO_C" >&6
+
+# Check whether --with-fallbacks or --without-fallbacks was given.
+if test "${with_fallbacks+set}" = set; then
+  withval="$with_fallbacks"
+  with_fallback=$withval
+else
+  with_fallback=
+fi;
+echo "$as_me:8540: result: $with_fallback" >&5
+echo "${ECHO_T}$with_fallback" >&6
+
+case ".$with_fallback" in
+(.|.no)
+	FALLBACK_LIST=
+	;;
+(.yes)
+	{ echo "$as_me:8548: WARNING: expected a list of terminal descriptions" >&5
+echo "$as_me: WARNING: expected a list of terminal descriptions" >&2;}
+	;;
+(*)
+	FALLBACK_LIST=`echo "$with_fallback" | sed -e 's/,/ /g'`
+	;;
+esac
+
+# The fallback feature in ncurses relies upon tic/infocmp outside the build
+# tree for generating the terminal descriptions that will be compiled into the
+# library.  If your toolchain is old, it may not handle current terminal
+# databases.  Use configure-options to point to the tools which will be used,
+# rather than the first ones found on the $PATH.
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}tic", so it can be a program name with args.
+set dummy ${ac_tool_prefix}tic; ac_word=$2
+echo "$as_me:8564: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_TIC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$TIC"; then
+  ac_cv_prog_TIC="$TIC" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_TIC="${ac_tool_prefix}tic"
+echo "$as_me:8579: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+TIC=$ac_cv_prog_TIC
+if test -n "$TIC"; then
+  echo "$as_me:8587: result: $TIC" >&5
+echo "${ECHO_T}$TIC" >&6
+else
+  echo "$as_me:8590: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_TIC"; then
+  ac_ct_TIC=$TIC
+  # Extract the first word of "tic", so it can be a program name with args.
+set dummy tic; ac_word=$2
+echo "$as_me:8599: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_TIC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_TIC"; then
+  ac_cv_prog_ac_ct_TIC="$ac_ct_TIC" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ac_ct_TIC="tic"
+echo "$as_me:8614: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+ac_ct_TIC=$ac_cv_prog_ac_ct_TIC
+if test -n "$ac_ct_TIC"; then
+  echo "$as_me:8622: result: $ac_ct_TIC" >&5
+echo "${ECHO_T}$ac_ct_TIC" >&6
+else
+  echo "$as_me:8625: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  TIC=$ac_ct_TIC
+else
+  TIC="$ac_cv_prog_TIC"
+fi
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}infocmp", so it can be a program name with args.
+set dummy ${ac_tool_prefix}infocmp; ac_word=$2
+echo "$as_me:8637: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_INFOCMP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$INFOCMP"; then
+  ac_cv_prog_INFOCMP="$INFOCMP" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_INFOCMP="${ac_tool_prefix}infocmp"
+echo "$as_me:8652: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+INFOCMP=$ac_cv_prog_INFOCMP
+if test -n "$INFOCMP"; then
+  echo "$as_me:8660: result: $INFOCMP" >&5
+echo "${ECHO_T}$INFOCMP" >&6
+else
+  echo "$as_me:8663: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_INFOCMP"; then
+  ac_ct_INFOCMP=$INFOCMP
+  # Extract the first word of "infocmp", so it can be a program name with args.
+set dummy infocmp; ac_word=$2
+echo "$as_me:8672: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_INFOCMP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_INFOCMP"; then
+  ac_cv_prog_ac_ct_INFOCMP="$ac_ct_INFOCMP" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ac_ct_INFOCMP="infocmp"
+echo "$as_me:8687: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+ac_ct_INFOCMP=$ac_cv_prog_ac_ct_INFOCMP
+if test -n "$ac_ct_INFOCMP"; then
+  echo "$as_me:8695: result: $ac_ct_INFOCMP" >&5
+echo "${ECHO_T}$ac_ct_INFOCMP" >&6
+else
+  echo "$as_me:8698: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  INFOCMP=$ac_ct_INFOCMP
+else
+  INFOCMP="$ac_cv_prog_INFOCMP"
+fi
+
+if test -n "$FALLBACK_LIST"
+then
+
+# Check whether --with-tic-path or --without-tic-path was given.
+if test "${with_tic_path+set}" = set; then
+  withval="$with_tic_path"
+  echo "$as_me:8713: checking for tic program for fallbacks" >&5
+echo $ECHO_N "checking for tic program for fallbacks... $ECHO_C" >&6
+		TIC=$withval
+		echo "$as_me:8716: result: $TIC" >&5
+echo "${ECHO_T}$TIC" >&6
+
+if test "x$prefix" != xNONE; then
+	cf_path_syntax="$prefix"
+else
+	cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$TIC" in
+(.\$\(*\)*|.\'*\'*)
+	;;
+(..|./*|.\\*)
+	;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+	;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+	eval TIC="$TIC"
+	case ".$TIC" in
+	(.NONE/*)
+		TIC=`echo "$TIC" | sed -e s%NONE%$cf_path_syntax%`
+		;;
+	esac
+	;;
+(.no|.NONE/*)
+	TIC=`echo "$TIC" | sed -e s%NONE%$cf_path_syntax%`
+	;;
+(*)
+	{ { echo "$as_me:8744: error: expected a pathname, not \"$TIC\"" >&5
+echo "$as_me: error: expected a pathname, not \"$TIC\"" >&2;}
+   { (exit 1); exit 1; }; }
+	;;
+esac
+
+else
+
+test -z "$TIC" && TIC="tic"
+for ac_prog in $TIC tic
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:8757: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_TIC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $TIC in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_TIC="$TIC" # Let the user override the test with a path.
+  ;;
+  *)
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH:/usr/local/ncurses/bin"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  if $as_executable_p "$ac_dir/$ac_word"; then
+   ac_cv_path_TIC="$ac_dir/$ac_word"
+   echo "$as_me:8774: found $ac_dir/$ac_word" >&5
+   break
+fi
+done
+
+  ;;
+esac
+fi
+TIC=$ac_cv_path_TIC
+
+if test -n "$TIC"; then
+  echo "$as_me:8785: result: $TIC" >&5
+echo "${ECHO_T}$TIC" >&6
+else
+  echo "$as_me:8788: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$TIC" && break
+done
+test -n "$TIC" || TIC="$TIC"
+
+cf_path_prog=""
+cf_path_args=""
+IFS="${IFS:- 	}"; cf_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR"
+for cf_temp in $ac_cv_path_TIC
+do
+	if test -z "$cf_path_prog" ; then
+		if test "$with_full_paths" = yes ; then
+
+if test "x$prefix" != xNONE; then
+	cf_path_syntax="$prefix"
+else
+	cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$cf_temp" in
+(.\$\(*\)*|.\'*\'*)
+	;;
+(..|./*|.\\*)
+	;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+	;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+	eval cf_temp="$cf_temp"
+	case ".$cf_temp" in
+	(.NONE/*)
+		cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%`
+		;;
+	esac
+	;;
+(.no|.NONE/*)
+	cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%`
+	;;
+(*)
+	break
+	;;
+esac
+
+			cf_path_prog="$cf_temp"
+		else
+			cf_path_prog="`basename "$cf_temp"`"
+		fi
+	elif test -z "$cf_path_args" ; then
+		cf_path_args="$cf_temp"
+	else
+		cf_path_args="$cf_path_args $cf_temp"
+	fi
+done
+IFS="$cf_save_ifs"
+
+if test -n "$cf_path_prog" ; then
+
+echo "${as_me:-configure}:8847: testing defining path for ${cf_path_prog} ..." 1>&5
+
+cat >>confdefs.h <<EOF
+#define TIC_PATH "$cf_path_prog"
+EOF
+
+	test -n "$cf_path_args" &&
+cat >>confdefs.h <<EOF
+#define TIC_ARGS "$cf_path_args"
+EOF
+
+fi
+
+		if test -z "$TIC"
+		then
+			{ echo "$as_me:8862: WARNING: no tic program found for fallbacks" >&5
+echo "$as_me: WARNING: no tic program found for fallbacks" >&2;}
+		fi
+
+fi;
+
+# Check whether --with-infocmp-path or --without-infocmp-path was given.
+if test "${with_infocmp_path+set}" = set; then
+  withval="$with_infocmp_path"
+  echo "$as_me:8871: checking for infocmp program for fallbacks" >&5
+echo $ECHO_N "checking for infocmp program for fallbacks... $ECHO_C" >&6
+		INFOCMP=$withval
+		echo "$as_me:8874: result: $INFOCMP" >&5
+echo "${ECHO_T}$INFOCMP" >&6
+
+if test "x$prefix" != xNONE; then
+	cf_path_syntax="$prefix"
+else
+	cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$INFOCMP" in
+(.\$\(*\)*|.\'*\'*)
+	;;
+(..|./*|.\\*)
+	;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+	;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+	eval INFOCMP="$INFOCMP"
+	case ".$INFOCMP" in
+	(.NONE/*)
+		INFOCMP=`echo "$INFOCMP" | sed -e s%NONE%$cf_path_syntax%`
+		;;
+	esac
+	;;
+(.no|.NONE/*)
+	INFOCMP=`echo "$INFOCMP" | sed -e s%NONE%$cf_path_syntax%`
+	;;
+(*)
+	{ { echo "$as_me:8902: error: expected a pathname, not \"$INFOCMP\"" >&5
+echo "$as_me: error: expected a pathname, not \"$INFOCMP\"" >&2;}
+   { (exit 1); exit 1; }; }
+	;;
+esac
+
+else
+
+test -z "$INFOCMP" && INFOCMP="infocmp"
+for ac_prog in $INFOCMP infocmp
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:8915: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_INFOCMP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $INFOCMP in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_INFOCMP="$INFOCMP" # Let the user override the test with a path.
+  ;;
+  *)
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH:/usr/local/ncurses/bin"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  if $as_executable_p "$ac_dir/$ac_word"; then
+   ac_cv_path_INFOCMP="$ac_dir/$ac_word"
+   echo "$as_me:8932: found $ac_dir/$ac_word" >&5
+   break
+fi
+done
+
+  ;;
+esac
+fi
+INFOCMP=$ac_cv_path_INFOCMP
+
+if test -n "$INFOCMP"; then
+  echo "$as_me:8943: result: $INFOCMP" >&5
+echo "${ECHO_T}$INFOCMP" >&6
+else
+  echo "$as_me:8946: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$INFOCMP" && break
+done
+test -n "$INFOCMP" || INFOCMP="$INFOCMP"
+
+cf_path_prog=""
+cf_path_args=""
+IFS="${IFS:- 	}"; cf_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR"
+for cf_temp in $ac_cv_path_INFOCMP
+do
+	if test -z "$cf_path_prog" ; then
+		if test "$with_full_paths" = yes ; then
+
+if test "x$prefix" != xNONE; then
+	cf_path_syntax="$prefix"
+else
+	cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$cf_temp" in
+(.\$\(*\)*|.\'*\'*)
+	;;
+(..|./*|.\\*)
+	;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+	;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+	eval cf_temp="$cf_temp"
+	case ".$cf_temp" in
+	(.NONE/*)
+		cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%`
+		;;
+	esac
+	;;
+(.no|.NONE/*)
+	cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%`
+	;;
+(*)
+	break
+	;;
+esac
+
+			cf_path_prog="$cf_temp"
+		else
+			cf_path_prog="`basename "$cf_temp"`"
+		fi
+	elif test -z "$cf_path_args" ; then
+		cf_path_args="$cf_temp"
+	else
+		cf_path_args="$cf_path_args $cf_temp"
+	fi
+done
+IFS="$cf_save_ifs"
+
+if test -n "$cf_path_prog" ; then
+
+echo "${as_me:-configure}:9005: testing defining path for ${cf_path_prog} ..." 1>&5
+
+cat >>confdefs.h <<EOF
+#define INFOCMP_PATH "$cf_path_prog"
+EOF
+
+	test -n "$cf_path_args" &&
+cat >>confdefs.h <<EOF
+#define INFOCMP_ARGS "$cf_path_args"
+EOF
+
+fi
+
+		if test -z "$INFOCMP"
+		then
+			{ echo "$as_me:9020: WARNING: no infocmp program found for fallbacks" >&5
+echo "$as_me: WARNING: no infocmp program found for fallbacks" >&2;}
+		fi
+
+fi;
+
+	test -z "$TIC" && FALLBACK_LIST=
+	test -z "$INFOCMP" && FALLBACK_LIST=
+	if test -z "$FALLBACK_LIST"
+	then
+		{ echo "$as_me:9030: WARNING: ignoring fallback option because tic/infocmp are not available" >&5
+echo "$as_me: WARNING: ignoring fallback option because tic/infocmp are not available" >&2;}
+	fi
+fi
+
+USE_FALLBACKS=
+test -z "$FALLBACK_LIST" && USE_FALLBACKS="#"
+
+echo "$as_me:9038: checking if you want modern xterm or antique" >&5
+echo $ECHO_N "checking if you want modern xterm or antique... $ECHO_C" >&6
+
+# Check whether --with-xterm-new or --without-xterm-new was given.
+if test "${with_xterm_new+set}" = set; then
+  withval="$with_xterm_new"
+  with_xterm_new=$withval
+else
+  with_xterm_new=yes
+fi;
+case "$with_xterm_new" in
+(no) with_xterm_new=xterm-old;;
+(*)	 with_xterm_new=xterm-new;;
+esac
+echo "$as_me:9052: result: $with_xterm_new" >&5
+echo "${ECHO_T}$with_xterm_new" >&6
+WHICH_XTERM=$with_xterm_new
+
+case $host_os in
+(*linux-gnu|*cygwin|*mingw32|*msys)
+	want_xterm_kbs=DEL
+	;;
+(*)
+	want_xterm_kbs=BS
+	;;
+esac
+
+echo "$as_me:9065: checking if xterm backspace sends BS or DEL" >&5
+echo $ECHO_N "checking if xterm backspace sends BS or DEL... $ECHO_C" >&6
+
+# Check whether --with-xterm-kbs or --without-xterm-kbs was given.
+if test "${with_xterm_kbs+set}" = set; then
+  withval="$with_xterm_kbs"
+  with_xterm_kbs=$withval
+else
+  with_xterm_kbs=BS
+fi;
+case x$with_xterm_kbs in
+(xyes|xno|xBS|xbs|x8)
+	with_xterm_kbs=BS
+	;;
+(xDEL|xdel|x127)
+	with_xterm_kbs=DEL
+	;;
+(*)
+	with_xterm_kbs=$withval
+	;;
+esac
+echo "$as_me:9086: result: $with_xterm_kbs" >&5
+echo "${ECHO_T}$with_xterm_kbs" >&6
+XTERM_KBS=$with_xterm_kbs
+
+if test "x$with_xterm_kbs" != "x$want_xterm_kbs"
+then
+	{ echo "$as_me:9092: WARNING: expected --with-xterm-kbs=$want_xterm_kbs for $host_os" >&5
+echo "$as_me: WARNING: expected --with-xterm-kbs=$want_xterm_kbs for $host_os" >&2;}
+fi
+
+MAKE_TERMINFO=
+if test "$use_database" = no ; then
+	TERMINFO="${datadir}/terminfo"
+	MAKE_TERMINFO="#"
+else
+
+echo "$as_me:9102: checking for list of terminfo directories" >&5
+echo $ECHO_N "checking for list of terminfo directories... $ECHO_C" >&6
+
+# Check whether --with-terminfo-dirs or --without-terminfo-dirs was given.
+if test "${with_terminfo_dirs+set}" = set; then
+  withval="$with_terminfo_dirs"
+
+else
+  withval=${TERMINFO_DIRS:-${datadir}/terminfo}
+fi;
+IFS="${IFS:- 	}"; ac_save_ifs="$IFS"; IFS="${PATH_SEPARATOR}"
+cf_dst_path=
+for cf_src_path in $withval
+do
+
+if test "x$prefix" != xNONE; then
+	cf_path_syntax="$prefix"
+else
+	cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$cf_src_path" in
+(.\$\(*\)*|.\'*\'*)
+	;;
+(..|./*|.\\*)
+	;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+	;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+	eval cf_src_path="$cf_src_path"
+	case ".$cf_src_path" in
+	(.NONE/*)
+		cf_src_path=`echo "$cf_src_path" | sed -e s%NONE%$cf_path_syntax%`
+		;;
+	esac
+	;;
+(.no|.NONE/*)
+	cf_src_path=`echo "$cf_src_path" | sed -e s%NONE%$cf_path_syntax%`
+	;;
+(*)
+	{ { echo "$as_me:9142: error: expected a pathname, not \"$cf_src_path\"" >&5
+echo "$as_me: error: expected a pathname, not \"$cf_src_path\"" >&2;}
+   { (exit 1); exit 1; }; }
+	;;
+esac
+
+  test -n "$cf_dst_path" && cf_dst_path="${cf_dst_path}$PATH_SEPARATOR"
+  cf_dst_path="${cf_dst_path}${cf_src_path}"
+done
+IFS="$ac_save_ifs"
+
+# This may use the prefix/exec_prefix symbols which will only yield "NONE"
+# so we have to check/work around.  We do prefer the result of "eval"...
+eval cf_dst_eval="$cf_dst_path"
+case "x$cf_dst_eval" in
+(xNONE*)
+	TERMINFO_DIRS=$cf_dst_path
+	;;
+(*)
+	TERMINFO_DIRS="$cf_dst_eval"
+	;;
+esac
+
+echo "$as_me:9165: result: $TERMINFO_DIRS" >&5
+echo "${ECHO_T}$TERMINFO_DIRS" >&6
+test -n "$TERMINFO_DIRS" &&
+cat >>confdefs.h <<EOF
+#define TERMINFO_DIRS "$TERMINFO_DIRS"
+EOF
+
+case "x$TERMINFO" in
+x???:*)
+	{ echo "$as_me:9174: WARNING: ignoring non-directory/file TERMINFO value" >&5
+echo "$as_me: WARNING: ignoring non-directory/file TERMINFO value" >&2;}
+	unset TERMINFO
+	;;
+esac
+
+echo "$as_me:9180: checking for default terminfo directory" >&5
+echo $ECHO_N "checking for default terminfo directory... $ECHO_C" >&6
+
+# Check whether --with-default-terminfo-dir or --without-default-terminfo-dir was given.
+if test "${with_default_terminfo_dir+set}" = set; then
+  withval="$with_default_terminfo_dir"
+
+else
+  withval="${TERMINFO:-${datadir}/terminfo}"
+fi; if test -n "${datadir}/terminfo" ; then
+
+if test "x$prefix" != xNONE; then
+	cf_path_syntax="$prefix"
+else
+	cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$withval" in
+(.\$\(*\)*|.\'*\'*)
+	;;
+(..|./*|.\\*)
+	;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+	;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+	eval withval="$withval"
+	case ".$withval" in
+	(.NONE/*)
+		withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%`
+		;;
+	esac
+	;;
+(.no|.NONE/*)
+	withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%`
+	;;
+(*)
+	{ { echo "$as_me:9216: error: expected a pathname, not \"$withval\"" >&5
+echo "$as_me: error: expected a pathname, not \"$withval\"" >&2;}
+   { (exit 1); exit 1; }; }
+	;;
+esac
+
+fi
+eval TERMINFO="$withval"
+
+echo "$as_me:9225: result: $TERMINFO" >&5
+echo "${ECHO_T}$TERMINFO" >&6
+
+cat >>confdefs.h <<EOF
+#define TERMINFO "$TERMINFO"
+EOF
+
+fi
+
+###	use option --disable-big-core to make tic run on small machines
+###	We need 4Mb, check if we can allocate 50% more than that.
+echo "$as_me:9236: checking if big-core option selected" >&5
+echo $ECHO_N "checking if big-core option selected... $ECHO_C" >&6
+
+# Check whether --enable-big-core or --disable-big-core was given.
+if test "${enable_big_core+set}" = set; then
+  enableval="$enable_big_core"
+  with_big_core=$enableval
+else
+  if test "$cross_compiling" = yes; then
+  with_big_core=no
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 9248 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <string.h>
+int main() {
+	unsigned long n = 6000000L;
+	char *s = malloc(n);
+	if (s != 0)
+		s[0] = s[n-1] = 0;
+	${cf_cv_main_return:-return}(s == 0);
+}
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:9262: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:9265: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:9267: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:9270: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  with_big_core=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+with_big_core=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+fi;
+echo "$as_me:9282: result: $with_big_core" >&5
+echo "${ECHO_T}$with_big_core" >&6
+test "x$with_big_core" = "xyes" &&
+cat >>confdefs.h <<\EOF
+#define HAVE_BIG_CORE 1
+EOF
+
+### ISO C only guarantees 512-char strings, we have tables which load faster
+### when constructed using "big" strings.  More than the C compiler, the awk
+### program is a limit on most vendor UNIX systems.  Check that we can build.
+echo "$as_me:9292: checking if big-strings option selected" >&5
+echo $ECHO_N "checking if big-strings option selected... $ECHO_C" >&6
+
+# Check whether --enable-big-strings or --disable-big-strings was given.
+if test "${enable_big_strings+set}" = set; then
+  enableval="$enable_big_strings"
+  with_big_strings=$enableval
+else
+
+	case x$AWK in
+	(x)
+		eval with_big_strings=no
+		;;
+	(*)
+		if ( ${AWK} 'BEGIN { xx = "x"; while (length(xx) < 12000) { xx = xx "x"; }; printf("%s\n", xx); }' 2>/dev/null \
+			| $AWK '{ printf "%d\n", length($0); }' 2>/dev/null | $AWK 'BEGIN { eqls=0; recs=0; } { recs++; if ($0 == 12000) eqls++; } END { if (recs != 1 || eqls != 1) exit 1; }' 2>/dev/null >/dev/null ) ; then
+			eval with_big_strings=yes
+		else
+			eval with_big_strings=no
+		fi
+		;;
+	esac
+
+fi;
+echo "$as_me:9316: result: $with_big_strings" >&5
+echo "${ECHO_T}$with_big_strings" >&6
+
+USE_BIG_STRINGS=0
+test "x$with_big_strings" = "xyes" && USE_BIG_STRINGS=1
+
+###	use option --enable-termcap to compile in the termcap fallback support
+echo "$as_me:9323: checking if you want termcap-fallback support" >&5
+echo $ECHO_N "checking if you want termcap-fallback support... $ECHO_C" >&6
+
+# Check whether --enable-termcap or --disable-termcap was given.
+if test "${enable_termcap+set}" = set; then
+  enableval="$enable_termcap"
+  with_termcap=$enableval
+else
+  with_termcap=no
+fi;
+echo "$as_me:9333: result: $with_termcap" >&5
+echo "${ECHO_T}$with_termcap" >&6
+
+NCURSES_USE_TERMCAP=0
+if test "x$with_termcap" != "xyes" ; then
+	if test "$use_database" = no ; then
+		if test -z "$with_fallback" ; then
+			{ { echo "$as_me:9340: error: You have disabled the database w/o specifying fallbacks" >&5
+echo "$as_me: error: You have disabled the database w/o specifying fallbacks" >&2;}
+   { (exit 1); exit 1; }; }
+		fi
+	fi
+
+cat >>confdefs.h <<\EOF
+#define PURE_TERMINFO 1
+EOF
+
+else
+
+	if test "$with_ticlib" != no ; then
+		{ { echo "$as_me:9353: error: Options --with-ticlib and --enable-termcap cannot be combined" >&5
+echo "$as_me: error: Options --with-ticlib and --enable-termcap cannot be combined" >&2;}
+   { (exit 1); exit 1; }; }
+	fi
+
+	NCURSES_USE_TERMCAP=1
+	echo "$as_me:9359: checking for list of termcap files" >&5
+echo $ECHO_N "checking for list of termcap files... $ECHO_C" >&6
+
+# Check whether --with-termpath or --without-termpath was given.
+if test "${with_termpath+set}" = set; then
+  withval="$with_termpath"
+
+else
+  withval=${TERMPATH:-/etc/termcap:/usr/share/misc/termcap}
+fi;
+IFS="${IFS:- 	}"; ac_save_ifs="$IFS"; IFS="${PATH_SEPARATOR}"
+cf_dst_path=
+for cf_src_path in $withval
+do
+
+if test "x$prefix" != xNONE; then
+	cf_path_syntax="$prefix"
+else
+	cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$cf_src_path" in
+(.\$\(*\)*|.\'*\'*)
+	;;
+(..|./*|.\\*)
+	;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+	;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+	eval cf_src_path="$cf_src_path"
+	case ".$cf_src_path" in
+	(.NONE/*)
+		cf_src_path=`echo "$cf_src_path" | sed -e s%NONE%$cf_path_syntax%`
+		;;
+	esac
+	;;
+(.no|.NONE/*)
+	cf_src_path=`echo "$cf_src_path" | sed -e s%NONE%$cf_path_syntax%`
+	;;
+(*)
+	{ { echo "$as_me:9399: error: expected a pathname, not \"$cf_src_path\"" >&5
+echo "$as_me: error: expected a pathname, not \"$cf_src_path\"" >&2;}
+   { (exit 1); exit 1; }; }
+	;;
+esac
+
+  test -n "$cf_dst_path" && cf_dst_path="${cf_dst_path}$PATH_SEPARATOR"
+  cf_dst_path="${cf_dst_path}${cf_src_path}"
+done
+IFS="$ac_save_ifs"
+
+# This may use the prefix/exec_prefix symbols which will only yield "NONE"
+# so we have to check/work around.  We do prefer the result of "eval"...
+eval cf_dst_eval="$cf_dst_path"
+case "x$cf_dst_eval" in
+(xNONE*)
+	TERMPATH=$cf_dst_path
+	;;
+(*)
+	TERMPATH="$cf_dst_eval"
+	;;
+esac
+
+	echo "$as_me:9422: result: $TERMPATH" >&5
+echo "${ECHO_T}$TERMPATH" >&6
+	test -n "$TERMPATH" &&
+cat >>confdefs.h <<EOF
+#define TERMPATH "$TERMPATH"
+EOF
+
+	###	use option --enable-getcap to use a hacked getcap for reading termcaps
+	echo "$as_me:9430: checking if fast termcap-loader is needed" >&5
+echo $ECHO_N "checking if fast termcap-loader is needed... $ECHO_C" >&6
+
+# Check whether --enable-getcap or --disable-getcap was given.
+if test "${enable_getcap+set}" = set; then
+  enableval="$enable_getcap"
+  with_getcap=$enableval
+else
+  with_getcap=no
+fi;
+	echo "$as_me:9440: result: $with_getcap" >&5
+echo "${ECHO_T}$with_getcap" >&6
+	test "x$with_getcap" = "xyes" &&
+cat >>confdefs.h <<\EOF
+#define USE_GETCAP 1
+EOF
+
+	echo "$as_me:9447: checking if translated termcaps will be cached in ~/.terminfo" >&5
+echo $ECHO_N "checking if translated termcaps will be cached in ~/.terminfo... $ECHO_C" >&6
+
+# Check whether --enable-getcap-cache or --disable-getcap-cache was given.
+if test "${enable_getcap_cache+set}" = set; then
+  enableval="$enable_getcap_cache"
+  with_getcap_cache=$enableval
+else
+  with_getcap_cache=no
+fi;
+	echo "$as_me:9457: result: $with_getcap_cache" >&5
+echo "${ECHO_T}$with_getcap_cache" >&6
+	test "x$with_getcap_cache" = "xyes" &&
+cat >>confdefs.h <<\EOF
+#define USE_GETCAP_CACHE 1
+EOF
+
+fi
+
+###   Use option --disable-home-terminfo to completely remove ~/.terminfo
+echo "$as_me:9467: checking if ~/.terminfo is wanted" >&5
+echo $ECHO_N "checking if ~/.terminfo is wanted... $ECHO_C" >&6
+
+# Check whether --enable-home-terminfo or --disable-home-terminfo was given.
+if test "${enable_home_terminfo+set}" = set; then
+  enableval="$enable_home_terminfo"
+  with_home_terminfo=$enableval
+else
+  with_home_terminfo=yes
+fi;
+echo "$as_me:9477: result: $with_home_terminfo" >&5
+echo "${ECHO_T}$with_home_terminfo" >&6
+test "x$with_home_terminfo" = "xyes" &&
+cat >>confdefs.h <<\EOF
+#define USE_HOME_TERMINFO 1
+EOF
+
+echo "$as_me:9484: checking if you want to permit root to use ncurses environment variables" >&5
+echo $ECHO_N "checking if you want to permit root to use ncurses environment variables... $ECHO_C" >&6
+
+# Check whether --enable-root-environ or --disable-root-environ was given.
+if test "${enable_root_environ+set}" = set; then
+  enableval="$enable_root_environ"
+  with_root_environ=$enableval
+else
+  with_root_environ=yes
+fi;
+echo "$as_me:9494: result: $with_root_environ" >&5
+echo "${ECHO_T}$with_root_environ" >&6
+test "x$with_root_environ" = xyes &&
+cat >>confdefs.h <<\EOF
+#define USE_ROOT_ENVIRON 1
+EOF
+
+echo "$as_me:9501: checking if you want to permit setuid programs to access all files" >&5
+echo $ECHO_N "checking if you want to permit setuid programs to access all files... $ECHO_C" >&6
+
+# Check whether --enable-root-environ or --disable-root-environ was given.
+if test "${enable_root_environ+set}" = set; then
+  enableval="$enable_root_environ"
+  with_root_access=$enableval
+else
+  with_root_access=yes
+fi;
+echo "$as_me:9511: result: $with_root_access" >&5
+echo "${ECHO_T}$with_root_access" >&6
+test "x$with_root_access" = xyes &&
+cat >>confdefs.h <<\EOF
+#define USE_ROOT_ACCESS 1
+EOF
+
+###   Use option --enable-symlinks to make tic use symlinks, not hard links
+###   to reduce storage requirements for the terminfo database.
+
+for ac_header in \
+unistd.h \
+
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:9526: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 9532 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:9536: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:9542: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:9561: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+for ac_func in \
+	remove \
+	unlink
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:9576: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 9582 "configure"
+#include "confdefs.h"
+#define $ac_func autoconf_temporary
+#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
+#undef $ac_func
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char $ac_func (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+#error found stub for $ac_func
+#endif
+
+	return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:9613: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:9616: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:9619: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:9622: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_var=no"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:9632: result: `eval echo '${'"$as_ac_var"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6
+if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+if test "$cross_compiling" = yes ; then
+
+for ac_func in \
+		link \
+		symlink
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:9649: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 9655 "configure"
+#include "confdefs.h"
+#define $ac_func autoconf_temporary
+#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
+#undef $ac_func
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char $ac_func (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+#error found stub for $ac_func
+#endif
+
+	return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:9686: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:9689: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:9692: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:9695: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_var=no"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:9705: result: `eval echo '${'"$as_ac_var"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6
+if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+else
+	echo "$as_me:9716: checking if link/symlink functions work" >&5
+echo $ECHO_N "checking if link/symlink functions work... $ECHO_C" >&6
+if test "${cf_cv_link_funcs+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+		cf_cv_link_funcs=
+		for cf_func in link symlink ; do
+			if test "$cross_compiling" = yes; then
+
+			eval 'ac_cv_func_'$cf_func'=error'
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 9729 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+int main(void)
+{
+	int fail = 0;
+	char *src = "conftest.tmp";
+	char *dst = "conftest.chk";
+	struct stat src_sb, dst_sb;
+	FILE *fp = fopen(src, "w");
+	if (fp == 0) { fail = 3; } else {
+		fclose(fp); stat(src, &src_sb);
+		if ($cf_func(src, dst) < 0) {
+			fail = 1;
+		} else if (stat(dst, &dst_sb) < 0) {
+			fail = 2;
+		} else {
+			long diff = (dst_sb.st_mtime - src_sb.st_mtime);
+			if (diff < 0) diff = -diff;
+			if (diff > 2) fail = 3;
+		}
+	}
+#ifdef HAVE_UNLINK
+	unlink(dst); unlink(src);
+#else
+	remove(dst); remove(src);
+#endif
+	${cf_cv_main_return:-return} (fail);
+}
+
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:9767: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:9770: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:9772: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:9775: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+			cf_cv_link_funcs="$cf_cv_link_funcs $cf_func"
+			eval 'ac_cv_func_'$cf_func'=yes'
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+			eval 'ac_cv_func_'$cf_func'=no'
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+		done
+		test -z "$cf_cv_link_funcs" && cf_cv_link_funcs=no
+
+fi
+echo "$as_me:9793: result: $cf_cv_link_funcs" >&5
+echo "${ECHO_T}$cf_cv_link_funcs" >&6
+	test "$ac_cv_func_link"    = yes &&
+cat >>confdefs.h <<\EOF
+#define HAVE_LINK 1
+EOF
+
+	test "$ac_cv_func_symlink" = yes &&
+cat >>confdefs.h <<\EOF
+#define HAVE_SYMLINK 1
+EOF
+
+fi
+
+with_links=no
+with_symlinks=no
+
+# soft links (symbolic links) are useful for some systems where hard links do
+# not work, or to make it simpler to copy terminfo trees around.
+if test "x$ac_cv_func_symlink" = xyes ; then
+	echo "$as_me:9813: checking if tic should use symbolic links" >&5
+echo $ECHO_N "checking if tic should use symbolic links... $ECHO_C" >&6
+
+# Check whether --enable-symlinks or --disable-symlinks was given.
+if test "${enable_symlinks+set}" = set; then
+  enableval="$enable_symlinks"
+  with_symlinks=$enableval
+else
+  with_symlinks=no
+fi;
+	echo "$as_me:9823: result: $with_symlinks" >&5
+echo "${ECHO_T}$with_symlinks" >&6
+fi
+
+# If we have hard links and did not choose to use soft links instead, there is
+# no reason to make this choice optional - use the hard links.
+if test "$with_symlinks" = no ; then
+	echo "$as_me:9830: checking if tic should use hard links" >&5
+echo $ECHO_N "checking if tic should use hard links... $ECHO_C" >&6
+	if test "x$ac_cv_func_link" = xyes ; then
+		with_links=yes
+	else
+		with_links=no
+	fi
+	echo "$as_me:9837: result: $with_links" >&5
+echo "${ECHO_T}$with_links" >&6
+fi
+
+test "x$with_links" = xyes &&
+cat >>confdefs.h <<\EOF
+#define USE_LINKS 1
+EOF
+
+test "x$with_symlinks" = xyes &&
+cat >>confdefs.h <<\EOF
+#define USE_SYMLINKS 1
+EOF
+
+###   use option --enable-broken-linker to force on use of broken-linker support
+
+echo "$as_me:9853: checking if you want broken-linker support code" >&5
+echo $ECHO_N "checking if you want broken-linker support code... $ECHO_C" >&6
+
+# Check whether --enable-broken_linker or --disable-broken_linker was given.
+if test "${enable_broken_linker+set}" = set; then
+  enableval="$enable_broken_linker"
+  with_broken_linker=$enableval
+else
+  with_broken_linker=no
+fi;
+echo "$as_me:9863: result: $with_broken_linker" >&5
+echo "${ECHO_T}$with_broken_linker" >&6
+
+: "${BROKEN_LINKER:=0}"
+if test "x$with_broken_linker" = xyes ; then
+
+cat >>confdefs.h <<\EOF
+#define BROKEN_LINKER 1
+EOF
+
+	BROKEN_LINKER=1
+fi
+
+###   use option --enable-bsdpad to have tputs process BSD-style prefix padding
+echo "$as_me:9877: checking if tputs should process BSD-style prefix padding" >&5
+echo $ECHO_N "checking if tputs should process BSD-style prefix padding... $ECHO_C" >&6
+
+# Check whether --enable-bsdpad or --disable-bsdpad was given.
+if test "${enable_bsdpad+set}" = set; then
+  enableval="$enable_bsdpad"
+  with_bsdpad=$enableval
+else
+  with_bsdpad=no
+fi;
+echo "$as_me:9887: result: $with_bsdpad" >&5
+echo "${ECHO_T}$with_bsdpad" >&6
+test "x$with_bsdpad" = xyes &&
+cat >>confdefs.h <<\EOF
+#define BSD_TPUTS 1
+EOF
+
+###   use option --enable-widec to turn on use of wide-character support
+NCURSES_CH_T=chtype
+NCURSES_LIBUTF8=0
+
+NEED_WCHAR_H=0
+NCURSES_MBSTATE_T=0
+NCURSES_WCHAR_T=0
+NCURSES_WINT_T=0
+
+# Check to define _XOPEN_SOURCE "automatically"
+CPPFLAGS_before_XOPEN="$CPPFLAGS"
+
+echo "$as_me:9906: checking if the POSIX test-macros are already defined" >&5
+echo $ECHO_N "checking if the POSIX test-macros are already defined... $ECHO_C" >&6
+if test "${cf_cv_posix_visible+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 9913 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+
+#if defined(__POSIX_VISIBLE) && ((__POSIX_VISIBLE - 0L) > 0) \
+	&& defined(__XSI_VISIBLE) && ((__XSI_VISIBLE - 0L) > 0) \
+	&& defined(__BSD_VISIBLE) && ((__BSD_VISIBLE - 0L) > 0) \
+	&& defined(__ISO_C_VISIBLE) && ((__ISO_C_VISIBLE - 0L) > 0)
+#error conflicting symbols found
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:9932: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:9935: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:9938: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:9941: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_posix_visible=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_posix_visible=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:9952: result: $cf_cv_posix_visible" >&5
+echo "${ECHO_T}$cf_cv_posix_visible" >&6
+
+if test "$cf_cv_posix_visible" = no; then
+
+cf_XOPEN_SOURCE=600
+cf_POSIX_C_SOURCE=199506L
+cf_xopen_source=
+
+case "$host_os" in
+(aix[4-7]*)
+	cf_xopen_source="-D_ALL_SOURCE"
+	;;
+(msys)
+	cf_XOPEN_SOURCE=600
+	;;
+(darwin[0-8].*)
+	cf_xopen_source="-D_APPLE_C_SOURCE"
+	;;
+(darwin*)
+	cf_xopen_source="-D_DARWIN_C_SOURCE"
+	cf_XOPEN_SOURCE=
+	;;
+(freebsd*|dragonfly*|midnightbsd*)
+	# 5.x headers associate
+	#	_XOPEN_SOURCE=600 with _POSIX_C_SOURCE=200112L
+	#	_XOPEN_SOURCE=500 with _POSIX_C_SOURCE=199506L
+	cf_POSIX_C_SOURCE=200112L
+	cf_XOPEN_SOURCE=600
+	cf_xopen_source="-D_BSD_TYPES -D__BSD_VISIBLE -D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE -D_XOPEN_SOURCE=$cf_XOPEN_SOURCE"
+	;;
+(hpux11*)
+	cf_xopen_source="-D_HPUX_SOURCE -D_XOPEN_SOURCE=500"
+	;;
+(hpux*)
+	cf_xopen_source="-D_HPUX_SOURCE"
+	;;
+(irix[56].*)
+	cf_xopen_source="-D_SGI_SOURCE"
+	cf_XOPEN_SOURCE=
+	;;
+(linux*gnu|linux*gnuabi64|linux*gnuabin32|linux*gnueabi|linux*gnueabihf|linux*gnux32|uclinux*|gnu*|mint*|k*bsd*-gnu|cygwin)
+
+cf_gnu_xopen_source=$cf_XOPEN_SOURCE
+
+echo "$as_me:9997: checking if this is the GNU C library" >&5
+echo $ECHO_N "checking if this is the GNU C library... $ECHO_C" >&6
+if test "${cf_cv_gnu_library+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 10004 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+	#if __GLIBC__ > 0 && __GLIBC_MINOR__ >= 0
+		return 0;
+	#elif __NEWLIB__ > 0 && __NEWLIB_MINOR__ >= 0
+		return 0;
+	#else
+	#	error not GNU C library
+	#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:10023: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:10026: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:10029: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:10032: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_gnu_library=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_gnu_library=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:10043: result: $cf_cv_gnu_library" >&5
+echo "${ECHO_T}$cf_cv_gnu_library" >&6
+
+if test x$cf_cv_gnu_library = xyes; then
+
+	# With glibc 2.19 (13 years after this check was begun), _DEFAULT_SOURCE
+	# was changed to help a little.  newlib incorporated the change about 4
+	# years later.
+	echo "$as_me:10051: checking if _DEFAULT_SOURCE can be used as a basis" >&5
+echo $ECHO_N "checking if _DEFAULT_SOURCE can be used as a basis... $ECHO_C" >&6
+if test "${cf_cv_gnu_library_219+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+		cf_save="$CPPFLAGS"
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-D_DEFAULT_SOURCE"
+
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 10063 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+			#if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 19) || (__GLIBC__ > 2)
+				return 0;
+			#elif (__NEWLIB__ == 2 && __NEWLIB_MINOR__ >= 4) || (__GLIBC__ > 3)
+				return 0;
+			#else
+			#	error GNU C library __GLIBC__.__GLIBC_MINOR__ is too old
+			#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:10082: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:10085: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:10088: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:10091: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_gnu_library_219=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_gnu_library_219=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+		CPPFLAGS="$cf_save"
+
+fi
+echo "$as_me:10103: result: $cf_cv_gnu_library_219" >&5
+echo "${ECHO_T}$cf_cv_gnu_library_219" >&6
+
+	if test "x$cf_cv_gnu_library_219" = xyes; then
+		cf_save="$CPPFLAGS"
+		echo "$as_me:10108: checking if _XOPEN_SOURCE=$cf_gnu_xopen_source works with _DEFAULT_SOURCE" >&5
+echo $ECHO_N "checking if _XOPEN_SOURCE=$cf_gnu_xopen_source works with _DEFAULT_SOURCE... $ECHO_C" >&6
+if test "${cf_cv_gnu_dftsrc_219+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=$cf_gnu_xopen_source
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+			cat >"conftest.$ac_ext" <<_ACEOF
+#line 10213 "configure"
+#include "confdefs.h"
+
+				#include <limits.h>
+				#include <sys/types.h>
+
+int
+main (void)
+{
+
+				#if (_XOPEN_SOURCE >= $cf_gnu_xopen_source) && (MB_LEN_MAX > 1)
+					return 0;
+				#else
+				#	error GNU C library is too old
+				#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:10233: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:10236: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:10239: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:10242: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_gnu_dftsrc_219=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_gnu_dftsrc_219=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:10253: result: $cf_cv_gnu_dftsrc_219" >&5
+echo "${ECHO_T}$cf_cv_gnu_dftsrc_219" >&6
+		test "x$cf_cv_gnu_dftsrc_219" = "xyes" || CPPFLAGS="$cf_save"
+	else
+		cf_cv_gnu_dftsrc_219=maybe
+	fi
+
+	if test "x$cf_cv_gnu_dftsrc_219" != xyes; then
+
+		echo "$as_me:10262: checking if we must define _GNU_SOURCE" >&5
+echo $ECHO_N "checking if we must define _GNU_SOURCE... $ECHO_C" >&6
+if test "${cf_cv_gnu_source+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 10269 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+			#ifndef _XOPEN_SOURCE
+			#error	expected _XOPEN_SOURCE to be defined
+			#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:10284: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:10287: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:10290: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:10293: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_gnu_source=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_save="$CPPFLAGS"
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in -D_GNU_SOURCE
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+			 cat >"conftest.$ac_ext" <<_ACEOF
+#line 10400 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+				#ifdef _XOPEN_SOURCE
+				#error	expected _XOPEN_SOURCE to be undefined
+				#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:10415: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:10418: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:10421: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:10424: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_gnu_source=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_gnu_source=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+			CPPFLAGS="$cf_save"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:10439: result: $cf_cv_gnu_source" >&5
+echo "${ECHO_T}$cf_cv_gnu_source" >&6
+
+		if test "$cf_cv_gnu_source" = yes
+		then
+		echo "$as_me:10444: checking if we should also define _DEFAULT_SOURCE" >&5
+echo $ECHO_N "checking if we should also define _DEFAULT_SOURCE... $ECHO_C" >&6
+if test "${cf_cv_default_source+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-D_GNU_SOURCE"
+
+			cat >"conftest.$ac_ext" <<_ACEOF
+#line 10454 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+				#ifdef _DEFAULT_SOURCE
+				#error	expected _DEFAULT_SOURCE to be undefined
+				#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:10469: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:10472: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:10475: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:10478: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_default_source=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_default_source=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:10489: result: $cf_cv_default_source" >&5
+echo "${ECHO_T}$cf_cv_default_source" >&6
+			if test "$cf_cv_default_source" = yes
+			then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-D_DEFAULT_SOURCE"
+
+			fi
+		fi
+	fi
+
+fi
+
+	;;
+(minix*)
+	cf_xopen_source="-D_NETBSD_SOURCE" # POSIX.1-2001 features are ifdef'd with this...
+	;;
+(mirbsd*)
+	# setting _XOPEN_SOURCE or _POSIX_SOURCE breaks <sys/select.h> and other headers which use u_int / u_short types
+	cf_XOPEN_SOURCE=
+
+if test "$cf_cv_posix_visible" = no; then
+
+cf_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE
+
+cf_save_CFLAGS="$CFLAGS"
+cf_save_CPPFLAGS="$CPPFLAGS"
+
+cf_trim_CFLAGS=`echo "$cf_save_CFLAGS" | \
+	sed	-e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ 	]*\)\?$//g'`
+
+cf_trim_CPPFLAGS=`echo "$cf_save_CPPFLAGS" | \
+	sed	-e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ 	]*\)\?$//g'`
+
+echo "$as_me:10526: checking if we should define _POSIX_C_SOURCE" >&5
+echo $ECHO_N "checking if we should define _POSIX_C_SOURCE... $ECHO_C" >&6
+if test "${cf_cv_posix_c_source+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+echo "${as_me:-configure}:10532: testing if the symbol is already defined go no further ..." 1>&5
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 10535 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+#ifndef _POSIX_C_SOURCE
+make an error
+#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:10550: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:10553: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:10556: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:10559: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_posix_c_source=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_want_posix_source=no
+	 case .$cf_POSIX_C_SOURCE in
+	 (.[12]??*)
+		cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE"
+		;;
+	 (.2)
+		cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE"
+		cf_want_posix_source=yes
+		;;
+	 (.*)
+		cf_want_posix_source=yes
+		;;
+	 esac
+	 if test "$cf_want_posix_source" = yes ; then
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 10580 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+#ifdef _POSIX_SOURCE
+make an error
+#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:10595: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:10598: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:10601: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:10604: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_posix_c_source="$cf_cv_posix_c_source -D_POSIX_SOURCE"
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+	 fi
+
+echo "${as_me:-configure}:10615: testing ifdef from value $cf_POSIX_C_SOURCE ..." 1>&5
+
+	 CFLAGS="$cf_trim_CFLAGS"
+	 CPPFLAGS="$cf_trim_CPPFLAGS"
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_cv_posix_c_source"
+
+echo "${as_me:-configure}:10623: testing if the second compile does not leave our definition intact error ..." 1>&5
+
+	 cat >"conftest.$ac_ext" <<_ACEOF
+#line 10626 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+#ifndef _POSIX_C_SOURCE
+make an error
+#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:10641: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:10644: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:10647: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:10650: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_posix_c_source=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+	 CFLAGS="$cf_save_CFLAGS"
+	 CPPFLAGS="$cf_save_CPPFLAGS"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:10666: result: $cf_cv_posix_c_source" >&5
+echo "${ECHO_T}$cf_cv_posix_c_source" >&6
+
+if test "$cf_cv_posix_c_source" != no ; then
+	CFLAGS="$cf_trim_CFLAGS"
+	CPPFLAGS="$cf_trim_CPPFLAGS"
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_cv_posix_c_source
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+fi
+
+fi # cf_cv_posix_visible
+
+	;;
+(netbsd*)
+	cf_xopen_source="-D_NETBSD_SOURCE" # setting _XOPEN_SOURCE breaks IPv6 for lynx on NetBSD 1.6, breaks xterm, is not needed for ncursesw
+	;;
+(openbsd[6-9]*)
+	# OpenBSD 6.x has broken locale support, both compile-time and runtime.
+	# see https://www.mail-archive.com/bugs@openbsd.org/msg13200.html
+	# Abusing the conformance level is a workaround.
+	{ echo "$as_me:10783: WARNING: this system does not provide usable locale support" >&5
+echo "$as_me: WARNING: this system does not provide usable locale support" >&2;}
+	cf_xopen_source="-D_BSD_SOURCE"
+	cf_XOPEN_SOURCE=700
+	;;
+(openbsd[4-5]*)
+	# setting _XOPEN_SOURCE lower than 500 breaks g++ compile with wchar.h, needed for ncursesw
+	cf_xopen_source="-D_BSD_SOURCE"
+	cf_XOPEN_SOURCE=600
+	;;
+(openbsd*)
+	# setting _XOPEN_SOURCE breaks xterm on OpenBSD 2.8, is not needed for ncursesw
+	;;
+(osf[45]*)
+	cf_xopen_source="-D_OSF_SOURCE"
+	;;
+(nto-qnx*)
+	cf_xopen_source="-D_QNX_SOURCE"
+	;;
+(sco*)
+	# setting _XOPEN_SOURCE breaks Lynx on SCO Unix / OpenServer
+	;;
+(solaris2.*)
+	cf_xopen_source="-D__EXTENSIONS__"
+	cf_cv_xopen_source=broken
+	;;
+(sysv4.2uw2.*) # Novell/SCO UnixWare 2.x (tested on 2.1.2)
+	cf_XOPEN_SOURCE=
+	cf_POSIX_C_SOURCE=
+	;;
+(*)
+
+echo "$as_me:10815: checking if we should define _XOPEN_SOURCE" >&5
+echo $ECHO_N "checking if we should define _XOPEN_SOURCE... $ECHO_C" >&6
+if test "${cf_cv_xopen_source+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 10822 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+int
+main (void)
+{
+
+#ifndef _XOPEN_SOURCE
+make an error
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:10842: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:10845: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:10848: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:10851: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_xopen_source=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_save="$CPPFLAGS"
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-D_XOPEN_SOURCE=$cf_XOPEN_SOURCE"
+
+	 cat >"conftest.$ac_ext" <<_ACEOF
+#line 10863 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+int
+main (void)
+{
+
+#ifndef _XOPEN_SOURCE
+make an error
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:10883: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:10886: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:10889: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:10892: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_xopen_source=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_xopen_source=$cf_XOPEN_SOURCE
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+		CPPFLAGS="$cf_save"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:10907: result: $cf_cv_xopen_source" >&5
+echo "${ECHO_T}$cf_cv_xopen_source" >&6
+
+if test "$cf_cv_xopen_source" != no ; then
+
+CFLAGS=`echo "$CFLAGS" | \
+	sed	-e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ 	]*\)\?$//g'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ 	]*\)\?$//g'`
+
+	cf_temp_xopen_source="-D_XOPEN_SOURCE=$cf_cv_xopen_source"
+
+for cf_add_cflags in $cf_temp_xopen_source
+do
+	case "x$cf_add_cflags" in
+	(x-[DU]*)
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CFLAGS" != "$cf_old_cflag" || break
+
+	CFLAGS="$cf_old_cflag"
+done
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CPPFLAGS" != "$cf_old_cflag" || break
+
+	CPPFLAGS="$cf_old_cflag"
+done
+
+		;;
+	esac
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_add_cflags
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+done
+
+fi
+
+	cf_save_xopen_cppflags="$CPPFLAGS"
+
+if test "$cf_cv_posix_visible" = no; then
+
+cf_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE
+
+cf_save_CFLAGS="$CFLAGS"
+cf_save_CPPFLAGS="$CPPFLAGS"
+
+cf_trim_CFLAGS=`echo "$cf_save_CFLAGS" | \
+	sed	-e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ 	]*\)\?$//g'`
+
+cf_trim_CPPFLAGS=`echo "$cf_save_CPPFLAGS" | \
+	sed	-e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ 	]*\)\?$//g'`
+
+echo "$as_me:11067: checking if we should define _POSIX_C_SOURCE" >&5
+echo $ECHO_N "checking if we should define _POSIX_C_SOURCE... $ECHO_C" >&6
+if test "${cf_cv_posix_c_source+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+echo "${as_me:-configure}:11073: testing if the symbol is already defined go no further ..." 1>&5
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 11076 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+#ifndef _POSIX_C_SOURCE
+make an error
+#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:11091: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:11094: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:11097: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:11100: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_posix_c_source=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_want_posix_source=no
+	 case .$cf_POSIX_C_SOURCE in
+	 (.[12]??*)
+		cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE"
+		;;
+	 (.2)
+		cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE"
+		cf_want_posix_source=yes
+		;;
+	 (.*)
+		cf_want_posix_source=yes
+		;;
+	 esac
+	 if test "$cf_want_posix_source" = yes ; then
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 11121 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+#ifdef _POSIX_SOURCE
+make an error
+#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:11136: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:11139: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:11142: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:11145: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_posix_c_source="$cf_cv_posix_c_source -D_POSIX_SOURCE"
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+	 fi
+
+echo "${as_me:-configure}:11156: testing ifdef from value $cf_POSIX_C_SOURCE ..." 1>&5
+
+	 CFLAGS="$cf_trim_CFLAGS"
+	 CPPFLAGS="$cf_trim_CPPFLAGS"
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_cv_posix_c_source"
+
+echo "${as_me:-configure}:11164: testing if the second compile does not leave our definition intact error ..." 1>&5
+
+	 cat >"conftest.$ac_ext" <<_ACEOF
+#line 11167 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+#ifndef _POSIX_C_SOURCE
+make an error
+#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:11182: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:11185: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:11188: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:11191: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_posix_c_source=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+	 CFLAGS="$cf_save_CFLAGS"
+	 CPPFLAGS="$cf_save_CPPFLAGS"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:11207: result: $cf_cv_posix_c_source" >&5
+echo "${ECHO_T}$cf_cv_posix_c_source" >&6
+
+if test "$cf_cv_posix_c_source" != no ; then
+	CFLAGS="$cf_trim_CFLAGS"
+	CPPFLAGS="$cf_trim_CPPFLAGS"
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_cv_posix_c_source
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+fi
+
+fi # cf_cv_posix_visible
+
+	# Some of these niche implementations use copy/paste, double-check...
+	test -n "$verbose" && echo "	checking if _POSIX_C_SOURCE inteferes" 1>&6
+
+echo "${as_me:-configure}:11319: testing checking if _POSIX_C_SOURCE inteferes ..." 1>&5
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 11322 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+int
+main (void)
+{
+
+#ifndef _XOPEN_SOURCE
+make an error
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:11342: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:11345: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:11348: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:11351: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+		{ echo "$as_me:11358: WARNING: _POSIX_C_SOURCE definition is not usable" >&5
+echo "$as_me: WARNING: _POSIX_C_SOURCE definition is not usable" >&2;}
+		CPPFLAGS="$cf_save_xopen_cppflags"
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+	;;
+esac
+
+if test -n "$cf_xopen_source" ; then
+
+for cf_add_cflags in $cf_xopen_source
+do
+	case "x$cf_add_cflags" in
+	(x-[DU]*)
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CFLAGS" != "$cf_old_cflag" || break
+	test -n "$verbose" && echo "	removing old option $cf_add_cflags from CFLAGS" 1>&6
+
+echo "${as_me:-configure}:11380: testing removing old option $cf_add_cflags from CFLAGS ..." 1>&5
+
+	CFLAGS="$cf_old_cflag"
+done
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CPPFLAGS" != "$cf_old_cflag" || break
+	test -n "$verbose" && echo "	removing old option $cf_add_cflags from CPPFLAGS" 1>&6
+
+echo "${as_me:-configure}:11392: testing removing old option $cf_add_cflags from CPPFLAGS ..." 1>&5
+
+	CPPFLAGS="$cf_old_cflag"
+done
+
+		;;
+	esac
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_add_cflags
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+	test -n "$verbose" && echo "	add to \$CFLAGS $cf_new_cflags" 1>&6
+
+echo "${as_me:-configure}:11480: testing add to \$CFLAGS $cf_new_cflags ..." 1>&5
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+	test -n "$verbose" && echo "	add to \$CPPFLAGS $cf_new_cppflags" 1>&6
+
+echo "${as_me:-configure}:11490: testing add to \$CPPFLAGS $cf_new_cppflags ..." 1>&5
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+	test -n "$verbose" && echo "	add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags" 1>&6
+
+echo "${as_me:-configure}:11500: testing add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags ..." 1>&5
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+done
+
+fi
+
+if test -n "$cf_XOPEN_SOURCE" && test -z "$cf_cv_xopen_source" ; then
+	echo "$as_me:11512: checking if _XOPEN_SOURCE really is set" >&5
+echo $ECHO_N "checking if _XOPEN_SOURCE really is set... $ECHO_C" >&6
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 11515 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+int
+main (void)
+{
+
+#ifndef _XOPEN_SOURCE
+make an error
+#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:11530: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:11533: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:11536: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:11539: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_XOPEN_SOURCE_set=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_XOPEN_SOURCE_set=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+	echo "$as_me:11548: result: $cf_XOPEN_SOURCE_set" >&5
+echo "${ECHO_T}$cf_XOPEN_SOURCE_set" >&6
+	if test "$cf_XOPEN_SOURCE_set" = yes
+	then
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 11553 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+int
+main (void)
+{
+
+#if (_XOPEN_SOURCE - 0) < $cf_XOPEN_SOURCE
+make an error
+#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:11568: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:11571: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:11574: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:11577: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_XOPEN_SOURCE_set_ok=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_XOPEN_SOURCE_set_ok=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+		if test "$cf_XOPEN_SOURCE_set_ok" = no
+		then
+			{ echo "$as_me:11588: WARNING: _XOPEN_SOURCE is lower than requested" >&5
+echo "$as_me: WARNING: _XOPEN_SOURCE is lower than requested" >&2;}
+		fi
+	else
+
+echo "$as_me:11593: checking if we should define _XOPEN_SOURCE" >&5
+echo $ECHO_N "checking if we should define _XOPEN_SOURCE... $ECHO_C" >&6
+if test "${cf_cv_xopen_source+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 11600 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+int
+main (void)
+{
+
+#ifndef _XOPEN_SOURCE
+make an error
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:11620: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:11623: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:11626: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:11629: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_xopen_source=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_save="$CPPFLAGS"
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-D_XOPEN_SOURCE=$cf_XOPEN_SOURCE"
+
+	 cat >"conftest.$ac_ext" <<_ACEOF
+#line 11641 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+int
+main (void)
+{
+
+#ifndef _XOPEN_SOURCE
+make an error
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:11661: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:11664: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:11667: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:11670: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_xopen_source=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_xopen_source=$cf_XOPEN_SOURCE
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+		CPPFLAGS="$cf_save"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:11685: result: $cf_cv_xopen_source" >&5
+echo "${ECHO_T}$cf_cv_xopen_source" >&6
+
+if test "$cf_cv_xopen_source" != no ; then
+
+CFLAGS=`echo "$CFLAGS" | \
+	sed	-e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ 	]*\)\?$//g'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ 	]*\)\?$//g'`
+
+	cf_temp_xopen_source="-D_XOPEN_SOURCE=$cf_cv_xopen_source"
+
+for cf_add_cflags in $cf_temp_xopen_source
+do
+	case "x$cf_add_cflags" in
+	(x-[DU]*)
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CFLAGS" != "$cf_old_cflag" || break
+
+	CFLAGS="$cf_old_cflag"
+done
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CPPFLAGS" != "$cf_old_cflag" || break
+
+	CPPFLAGS="$cf_old_cflag"
+done
+
+		;;
+	esac
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_add_cflags
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+done
+
+fi
+
+	fi
+fi
+fi # cf_cv_posix_visible
+
+CPPFLAGS_after_XOPEN="$CPPFLAGS"
+
+# Work around breakage on OS X
+
+echo "$as_me:11836: checking if SIGWINCH is defined" >&5
+echo $ECHO_N "checking if SIGWINCH is defined... $ECHO_C" >&6
+if test "${cf_cv_define_sigwinch+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 11843 "configure"
+#include "confdefs.h"
+
+#include <sys/types.h>
+#include <sys/signal.h>
+
+int
+main (void)
+{
+int x = SIGWINCH; (void)x
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:11858: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:11861: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:11864: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:11867: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_define_sigwinch=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 11874 "configure"
+#include "confdefs.h"
+
+#undef _XOPEN_SOURCE
+#undef _POSIX_SOURCE
+#undef _POSIX_C_SOURCE
+#include <sys/types.h>
+#include <sys/signal.h>
+
+int
+main (void)
+{
+int x = SIGWINCH; (void)x
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:11892: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:11895: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:11898: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:11901: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_define_sigwinch=maybe
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_define_sigwinch=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:11915: result: $cf_cv_define_sigwinch" >&5
+echo "${ECHO_T}$cf_cv_define_sigwinch" >&6
+
+if test "$cf_cv_define_sigwinch" = maybe ; then
+echo "$as_me:11919: checking for actual SIGWINCH definition" >&5
+echo $ECHO_N "checking for actual SIGWINCH definition... $ECHO_C" >&6
+if test "${cf_cv_fixup_sigwinch+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cf_cv_fixup_sigwinch=unknown
+cf_sigwinch=32
+while test "$cf_sigwinch" != 1
+do
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 11930 "configure"
+#include "confdefs.h"
+
+#undef _XOPEN_SOURCE
+#undef _POSIX_SOURCE
+#undef _POSIX_C_SOURCE
+#include <sys/types.h>
+#include <sys/signal.h>
+
+int
+main (void)
+{
+
+#if SIGWINCH != $cf_sigwinch
+make an error
+#endif
+int x = SIGWINCH; (void)x
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:11952: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:11955: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:11958: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:11961: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_fixup_sigwinch=$cf_sigwinch
+	 break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+cf_sigwinch="`expr "$cf_sigwinch" - 1`"
+done
+
+fi
+echo "$as_me:11975: result: $cf_cv_fixup_sigwinch" >&5
+echo "${ECHO_T}$cf_cv_fixup_sigwinch" >&6
+
+	if test "$cf_cv_fixup_sigwinch" != unknown ; then
+		CPPFLAGS="$CPPFLAGS -DSIGWINCH=$cf_cv_fixup_sigwinch"
+	fi
+fi
+
+# Checks for CODESET support.
+
+echo "$as_me:11985: checking for nl_langinfo and CODESET" >&5
+echo $ECHO_N "checking for nl_langinfo and CODESET... $ECHO_C" >&6
+if test "${am_cv_langinfo_codeset+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 11991 "configure"
+#include "confdefs.h"
+#include <langinfo.h>
+int
+main (void)
+{
+char* cs = nl_langinfo(CODESET); (void)cs
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:12003: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:12006: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:12009: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:12012: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  am_cv_langinfo_codeset=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+am_cv_langinfo_codeset=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:12023: result: $am_cv_langinfo_codeset" >&5
+echo "${ECHO_T}$am_cv_langinfo_codeset" >&6
+	if test "$am_cv_langinfo_codeset" = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_LANGINFO_CODESET 1
+EOF
+
+	fi
+
+# use these variables to work around a defect in gcc's fixincludes.
+NCURSES_OK_WCHAR_T=
+NCURSES_OK_WINT_T=
+
+echo "$as_me:12037: checking if you want wide-character code" >&5
+echo $ECHO_N "checking if you want wide-character code... $ECHO_C" >&6
+
+# Check whether --enable-widec or --disable-widec was given.
+if test "${enable_widec+set}" = set; then
+  enableval="$enable_widec"
+  with_widec=$enableval
+else
+  with_widec=no
+fi;
+echo "$as_me:12047: result: $with_widec" >&5
+echo "${ECHO_T}$with_widec" >&6
+
+NCURSES_WCWIDTH_GRAPHICS=1
+
+if test "x$with_widec" = xyes ; then
+	if test "x$disable_lib_suffixes" = xno ; then
+		LIB_SUFFIX="w${LIB_SUFFIX}"
+	fi
+
+cat >>confdefs.h <<\EOF
+#define USE_WIDEC_SUPPORT 1
+EOF
+
+cat >>confdefs.h <<\EOF
+#define NCURSES_WIDECHAR 1
+EOF
+
+	case "$CPPFLAGS" in
+	(*_XOPEN_SOURCE=*)
+		;;
+	(*)
+		{ echo "$as_me:12069: WARNING: _XOPEN_SOURCE feature test macro appears to be predefined" >&5
+echo "$as_me: WARNING: _XOPEN_SOURCE feature test macro appears to be predefined" >&2;}
+		# CPPFLAGS="$CPPFLAGS -DNCURSES_WIDECHAR"
+		CPPFLAGS_after_XOPEN="$CPPFLAGS_after_XOPEN -DNCURSES_WIDECHAR"
+		;;
+	esac
+
+for ac_header in \
+wchar.h \
+wctype.h \
+
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:12082: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 12088 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:12092: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:12098: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:12117: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+echo "$as_me:12127: checking if wchar.h can be used as is" >&5
+echo $ECHO_N "checking if wchar.h can be used as is... $ECHO_C" >&6
+if test "${cf_cv_wchar_h_okay+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 12134 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#ifdef HAVE_WCHAR_H
+#include <wchar.h>
+#endif
+#ifdef HAVE_WCTYPE_H
+#include <wctype.h>
+#endif
+
+int
+main (void)
+{
+
+	wint_t foo = 0;
+	int bar = iswpunct(foo)
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:12156: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:12159: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:12162: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:12165: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_wchar_h_okay=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_wchar_h_okay=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:12175: result: $cf_cv_wchar_h_okay" >&5
+echo "${ECHO_T}$cf_cv_wchar_h_okay" >&6
+
+if test "$cf_cv_wchar_h_okay" = no
+then
+
+echo "$as_me:12181: checking if we must define _XOPEN_SOURCE_EXTENDED" >&5
+echo $ECHO_N "checking if we must define _XOPEN_SOURCE_EXTENDED... $ECHO_C" >&6
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 12184 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+
+int
+main (void)
+{
+
+#ifndef _XOPEN_SOURCE_EXTENDED
+make an error
+#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:12200: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:12203: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:12206: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:12209: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_result=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_result=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+echo "$as_me:12218: result: $cf_result" >&5
+echo "${ECHO_T}$cf_result" >&6
+
+if test "$cf_result" = yes ; then
+	CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED"
+elif test "x" != "x" ; then
+	echo "$as_me:12224: checking checking for compatible value versus " >&5
+echo $ECHO_N "checking checking for compatible value versus ... $ECHO_C" >&6
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 12227 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+
+int
+main (void)
+{
+
+#if _XOPEN_SOURCE_EXTENDED- < 0
+make an error
+#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:12243: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:12246: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:12249: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:12252: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_result=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_result=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+	echo "$as_me:12261: result: $cf_result" >&5
+echo "${ECHO_T}$cf_result" >&6
+	if test "$cf_result" = no ; then
+		# perhaps we can override it - try...
+		CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED="
+	fi
+fi
+
+fi
+
+echo "$as_me:12271: checking if wcwidth agrees graphics are single-width" >&5
+echo $ECHO_N "checking if wcwidth agrees graphics are single-width... $ECHO_C" >&6
+if test "${cf_cv_wcwidth_graphics+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >conftest.in <<CF_EOF
+-	VT100 symbols
+0x250c	upper left corner
+0x2514	lower left corner
+0x2510	upper right corner
+0x2518	lower right corner
+0x251c	tee pointing left
+0x2524	tee pointing right
+0x2534	tee pointing up
+0x252c	tee pointing down
+0x2500	horizontal line
+0x2502	vertical line
+0x253c	large plus or crossover
+0x23ba	scan line 1
+0x23bd	scan line 9
+0x25c6	diamond
+0x2592	checker board (stipple)
+0x00b0	degree symbol
+0x00b1	plus/minus
+0x00b7	bullet
+-	Teletype 5410v1 symbols
+0x2190	arrow pointing left
+0x2192	arrow pointing right
+0x2193	arrow pointing down
+0x2191	arrow pointing up
+0x2592	board of squares
+0x2603	lantern symbol
+0x25ae	solid square block
+-	these defaults were invented for ncurses
+0x23bb	scan line 3
+0x23bc	scan line 7
+0x2264	less-than-or-equal-to
+0x2265	greater-than-or-equal-to
+0x03c0	greek pi
+0x2260	not-equal
+0x00a3	pound-sterling symbol
+-	thick-line-drawing
+0x250f	upper left corner
+0x2517	lower left corner
+0x2513	upper right corner
+0x251b	lower right corner
+0x2523	tee pointing left
+0x252b	tee pointing right
+0x253b	tee pointing up
+0x2533	tee pointing down
+0x2501	horizontal line
+0x2503	vertical line
+0x254b	large plus or crossover
+-	double-line-drawing
+0x2554	upper left corner
+0x255a	lower left corner
+0x2557	upper right corner
+0x255d	lower right corner
+0x2563	tee pointing left
+0x2560	tee pointing right
+0x2569	tee pointing up
+0x2566	tee pointing down
+0x2550	horizontal line
+0x2551	vertical line
+0x256c	large plus or crossover
+CF_EOF
+if test "$cross_compiling" = yes; then
+  cf_cv_wcwidth_graphics=unknown
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 12342 "configure"
+#include "confdefs.h"
+
+#include <locale.h>
+#include <stdio.h>
+#include <wchar.h>
+
+#define MY_LEN 80
+
+int
+main(void)
+{
+	FILE *fp;
+	int value;
+	char buffer[MY_LEN + 1];
+	char notes[MY_LEN + 1];
+	int totals = 0;
+	int passed = 0;
+
+	if (setlocale(LC_ALL, "en_US.UTF8") ||
+		setlocale(LC_ALL, "en_US.UTF-8") ||
+		setlocale(LC_ALL, "en_US.utf8") ||
+		setlocale(LC_ALL, "en_US.utf-8")) {
+		if ((fp = fopen("conftest.in", "r")) != 0) {
+			while (fgets(buffer, MY_LEN, fp) != 0) {
+				if (*buffer == '-') {
+					fprintf(stderr, "\\t%s", buffer);
+				} else if (sscanf(buffer, "%x %s", &value, notes) == 2) {
+					++totals;
+					if (wcwidth(value) == 1)
+						++passed;
+					fprintf(stderr, "%d\\t%s", wcwidth(value), buffer);
+				} else {
+					fprintf(stderr, "?\\t%s", buffer);
+				}
+			}
+		}
+	}
+	fprintf(stderr, "%d/%d passed wcwidth/graphics check\\n", passed, totals);
+	return (totals == passed) ? 0 : 1;
+}
+
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:12386: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:12389: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:12391: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:12394: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_wcwidth_graphics=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_wcwidth_graphics=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+
+fi
+echo "$as_me:12407: result: $cf_cv_wcwidth_graphics" >&5
+echo "${ECHO_T}$cf_cv_wcwidth_graphics" >&6
+
+	test "$cf_cv_wcwidth_graphics" = no && NCURSES_WCWIDTH_GRAPHICS=0
+
+	# with_overwrite=no
+	NCURSES_CH_T=cchar_t
+
+for ac_func in putwc btowc wctob wmemchr mbtowc wctomb mblen mbrlen mbrtowc wcsrtombs mbsrtowcs wcstombs mbstowcs
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:12418: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 12424 "configure"
+#include "confdefs.h"
+#define $ac_func autoconf_temporary
+#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
+#undef $ac_func
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char $ac_func (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+#error found stub for $ac_func
+#endif
+
+	return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:12455: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:12458: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:12461: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:12464: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_var=no"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:12474: result: `eval echo '${'"$as_ac_var"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6
+if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+	if test "x$ac_cv_func_putwc" != xyes ; then
+
+for ac_header in wchar.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:12489: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 12495 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:12499: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:12505: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:12524: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+echo "$as_me:12534: checking for multibyte character support" >&5
+echo $ECHO_N "checking for multibyte character support... $ECHO_C" >&6
+if test "${cf_cv_utf8_lib+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cf_save_LIBS="$LIBS"
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 12542 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#ifdef HAVE_WCHAR_H
+#include <wchar.h>
+#endif
+
+int
+main (void)
+{
+putwc(0,0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:12560: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:12563: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:12566: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:12569: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_utf8_lib=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+# If the linkage is not already in the $CPPFLAGS/$LDFLAGS configuration, these
+# will be set on completion of the AC_TRY_LINK below.
+cf_cv_header_path_utf8=
+cf_cv_library_path_utf8=
+
+echo "${as_me:-configure}:12581: testing Starting FIND_LINKAGE(utf8,) ..." 1>&5
+
+cf_save_LIBS="$LIBS"
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 12586 "configure"
+#include "confdefs.h"
+
+#include <libutf8.h>
+int
+main (void)
+{
+putwc(0,0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:12599: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:12602: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:12605: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:12608: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+	cf_cv_find_linkage_utf8=yes
+	cf_cv_header_path_utf8=/usr/include
+	cf_cv_library_path_utf8=/usr/lib
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+LIBS="-lutf8  $cf_save_LIBS"
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 12622 "configure"
+#include "confdefs.h"
+
+#include <libutf8.h>
+int
+main (void)
+{
+putwc(0,0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:12635: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:12638: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:12641: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:12644: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+	cf_cv_find_linkage_utf8=yes
+	cf_cv_header_path_utf8=/usr/include
+	cf_cv_library_path_utf8=/usr/lib
+	cf_cv_library_file_utf8="-lutf8"
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+	cf_cv_find_linkage_utf8=no
+	LIBS="$cf_save_LIBS"
+
+	test -n "$verbose" && echo "	find linkage for utf8 library" 1>&6
+
+echo "${as_me:-configure}:12661: testing find linkage for utf8 library ..." 1>&5
+
+echo "${as_me:-configure}:12663: testing Searching for headers in FIND_LINKAGE(utf8,) ..." 1>&5
+
+	cf_save_CPPFLAGS="$CPPFLAGS"
+	cf_test_CPPFLAGS="$CPPFLAGS"
+
+cf_search=
+
+# collect the current set of include-directories from compiler flags
+cf_header_path_list=""
+if test -n "${CFLAGS}${CPPFLAGS}" ; then
+	for cf_header_path in $CPPFLAGS $CFLAGS
+	do
+		case "$cf_header_path" in
+		(-I*)
+			cf_header_path=`echo ".$cf_header_path" |sed -e 's/^...//' -e 's,/include$,,'`
+
+test "x$cf_header_path" != "xNONE" && \
+test -d "$cf_header_path" && \
+ {
+	test -n "$verbose" && echo "	... testing for include-directories under $cf_header_path"
+	test -d "$cf_header_path/include" &&          cf_search="$cf_search $cf_header_path/include"
+	test -d "$cf_header_path/include/utf8" &&       cf_search="$cf_search $cf_header_path/include/utf8"
+	test -d "$cf_header_path/include/utf8/include" &&    cf_search="$cf_search $cf_header_path/include/utf8/include"
+	test -d "$cf_header_path/utf8/include" &&       cf_search="$cf_search $cf_header_path/utf8/include"
+	test -d "$cf_header_path/utf8/include/utf8" &&    cf_search="$cf_search $cf_header_path/utf8/include/utf8"
+}
+
+			cf_header_path_list="$cf_header_path_list $cf_search"
+			;;
+		esac
+	done
+fi
+
+# add the variations for the package we are looking for
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+	test -n "$verbose" && echo "	... testing for include-directories under $prefix"
+	test -d "$prefix/include" &&          cf_search="$cf_search $prefix/include"
+	test -d "$prefix/include/utf8" &&       cf_search="$cf_search $prefix/include/utf8"
+	test -d "$prefix/include/utf8/include" &&    cf_search="$cf_search $prefix/include/utf8/include"
+	test -d "$prefix/utf8/include" &&       cf_search="$cf_search $prefix/utf8/include"
+	test -d "$prefix/utf8/include/utf8" &&    cf_search="$cf_search $prefix/utf8/include/utf8"
+}
+
+for cf_subdir_prefix in \
+	/usr \
+	/usr/local \
+	/usr/pkg \
+	/opt \
+	/opt/local \
+	$HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+	test -n "$verbose" && echo "	... testing for include-directories under $cf_subdir_prefix"
+	test -d "$cf_subdir_prefix/include" &&          cf_search="$cf_search $cf_subdir_prefix/include"
+	test -d "$cf_subdir_prefix/include/utf8" &&       cf_search="$cf_search $cf_subdir_prefix/include/utf8"
+	test -d "$cf_subdir_prefix/include/utf8/include" &&    cf_search="$cf_search $cf_subdir_prefix/include/utf8/include"
+	test -d "$cf_subdir_prefix/utf8/include" &&       cf_search="$cf_search $cf_subdir_prefix/utf8/include"
+	test -d "$cf_subdir_prefix/utf8/include/utf8" &&    cf_search="$cf_search $cf_subdir_prefix/utf8/include/utf8"
+}
+
+done
+
+test "$includedir" != NONE && \
+test "$includedir" != "/usr/include" && \
+test -d "$includedir" && {
+	test -d "$includedir" &&    cf_search="$cf_search $includedir"
+	test -d "$includedir/utf8" && cf_search="$cf_search $includedir/utf8"
+}
+
+test "$oldincludedir" != NONE && \
+test "$oldincludedir" != "/usr/include" && \
+test -d "$oldincludedir" && {
+	test -d "$oldincludedir"    && cf_search="$cf_search $oldincludedir"
+	test -d "$oldincludedir/utf8" && cf_search="$cf_search $oldincludedir/utf8"
+}
+
+cf_search="$cf_search $cf_header_path_list"
+
+	for cf_cv_header_path_utf8 in $cf_search
+	do
+		if test -d "$cf_cv_header_path_utf8" ; then
+			test -n "$verbose" && echo "	... testing $cf_cv_header_path_utf8" 1>&6
+
+echo "${as_me:-configure}:12754: testing ... testing $cf_cv_header_path_utf8 ..." 1>&5
+
+			CPPFLAGS="$cf_save_CPPFLAGS"
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-I$cf_cv_header_path_utf8"
+
+			cat >"conftest.$ac_ext" <<_ACEOF
+#line 12762 "configure"
+#include "confdefs.h"
+
+#include <libutf8.h>
+int
+main (void)
+{
+putwc(0,0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:12775: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:12778: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:12781: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:12784: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+				test -n "$verbose" && echo "	... found utf8 headers in $cf_cv_header_path_utf8" 1>&6
+
+echo "${as_me:-configure}:12789: testing ... found utf8 headers in $cf_cv_header_path_utf8 ..." 1>&5
+
+				cf_cv_find_linkage_utf8=maybe
+				cf_test_CPPFLAGS="$CPPFLAGS"
+				break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+				CPPFLAGS="$cf_save_CPPFLAGS"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+		fi
+	done
+
+	if test "$cf_cv_find_linkage_utf8" = maybe ; then
+
+echo "${as_me:-configure}:12807: testing Searching for utf8 library in FIND_LINKAGE(utf8,) ..." 1>&5
+
+		cf_save_LIBS="$LIBS"
+		cf_save_LDFLAGS="$LDFLAGS"
+
+		if test "$cf_cv_find_linkage_utf8" != yes ; then
+
+cf_search=
+cf_library_path_list=""
+if test -n "${LDFLAGS}${LIBS}" ; then
+	for cf_library_path in $LDFLAGS $LIBS
+	do
+		case "$cf_library_path" in
+		(-L*)
+			cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'`
+
+test "x$cf_library_path" != "xNONE" && \
+test -d "$cf_library_path" && \
+ {
+	test -n "$verbose" && echo "	... testing for lib-directories under $cf_library_path"
+	test -d "$cf_library_path/lib" &&          cf_search="$cf_search $cf_library_path/lib"
+	test -d "$cf_library_path/lib/utf8" &&       cf_search="$cf_search $cf_library_path/lib/utf8"
+	test -d "$cf_library_path/lib/utf8/lib" &&    cf_search="$cf_search $cf_library_path/lib/utf8/lib"
+	test -d "$cf_library_path/utf8/lib" &&       cf_search="$cf_search $cf_library_path/utf8/lib"
+	test -d "$cf_library_path/utf8/lib/utf8" &&    cf_search="$cf_search $cf_library_path/utf8/lib/utf8"
+}
+
+			cf_library_path_list="$cf_library_path_list $cf_search"
+			;;
+		esac
+	done
+fi
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+	test -n "$verbose" && echo "	... testing for lib-directories under $prefix"
+	test -d "$prefix/lib" &&          cf_search="$cf_search $prefix/lib"
+	test -d "$prefix/lib/utf8" &&       cf_search="$cf_search $prefix/lib/utf8"
+	test -d "$prefix/lib/utf8/lib" &&    cf_search="$cf_search $prefix/lib/utf8/lib"
+	test -d "$prefix/utf8/lib" &&       cf_search="$cf_search $prefix/utf8/lib"
+	test -d "$prefix/utf8/lib/utf8" &&    cf_search="$cf_search $prefix/utf8/lib/utf8"
+}
+
+for cf_subdir_prefix in \
+	/usr \
+	/usr/local \
+	/usr/pkg \
+	/opt \
+	/opt/local \
+	$HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+	test -n "$verbose" && echo "	... testing for lib-directories under $cf_subdir_prefix"
+	test -d "$cf_subdir_prefix/lib" &&          cf_search="$cf_search $cf_subdir_prefix/lib"
+	test -d "$cf_subdir_prefix/lib/utf8" &&       cf_search="$cf_search $cf_subdir_prefix/lib/utf8"
+	test -d "$cf_subdir_prefix/lib/utf8/lib" &&    cf_search="$cf_search $cf_subdir_prefix/lib/utf8/lib"
+	test -d "$cf_subdir_prefix/utf8/lib" &&       cf_search="$cf_search $cf_subdir_prefix/utf8/lib"
+	test -d "$cf_subdir_prefix/utf8/lib/utf8" &&    cf_search="$cf_search $cf_subdir_prefix/utf8/lib/utf8"
+}
+
+done
+
+cf_search="$cf_library_path_list $cf_search"
+
+			for cf_cv_library_path_utf8 in $cf_search
+			do
+				if test -d "$cf_cv_library_path_utf8" ; then
+					test -n "$verbose" && echo "	... testing $cf_cv_library_path_utf8" 1>&6
+
+echo "${as_me:-configure}:12882: testing ... testing $cf_cv_library_path_utf8 ..." 1>&5
+
+					CPPFLAGS="$cf_test_CPPFLAGS"
+					LIBS="-lutf8  $cf_save_LIBS"
+					LDFLAGS="$cf_save_LDFLAGS -L$cf_cv_library_path_utf8"
+					cat >"conftest.$ac_ext" <<_ACEOF
+#line 12888 "configure"
+#include "confdefs.h"
+
+#include <libutf8.h>
+int
+main (void)
+{
+putwc(0,0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:12901: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:12904: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:12907: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:12910: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+					test -n "$verbose" && echo "	... found utf8 library in $cf_cv_library_path_utf8" 1>&6
+
+echo "${as_me:-configure}:12915: testing ... found utf8 library in $cf_cv_library_path_utf8 ..." 1>&5
+
+					cf_cv_find_linkage_utf8=yes
+					cf_cv_library_file_utf8="-lutf8"
+					break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+					CPPFLAGS="$cf_save_CPPFLAGS"
+					LIBS="$cf_save_LIBS"
+					LDFLAGS="$cf_save_LDFLAGS"
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+				fi
+			done
+			CPPFLAGS="$cf_save_CPPFLAGS"
+			LDFLAGS="$cf_save_LDFLAGS"
+		fi
+
+	else
+		cf_cv_find_linkage_utf8=no
+	fi
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+LIBS="$cf_save_LIBS"
+
+if test "$cf_cv_find_linkage_utf8" = yes ; then
+cf_cv_utf8_lib=add-on
+else
+cf_cv_utf8_lib=no
+fi
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:12957: result: $cf_cv_utf8_lib" >&5
+echo "${ECHO_T}$cf_cv_utf8_lib" >&6
+
+# HAVE_LIBUTF8_H is used by ncurses if curses.h is shared between
+# ncurses/ncursesw:
+if test "$cf_cv_utf8_lib" = "add-on" ; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_LIBUTF8_H 1
+EOF
+
+if test -n "$cf_cv_header_path_utf8" ; then
+  for cf_add_incdir in $cf_cv_header_path_utf8
+  do
+	while test "$cf_add_incdir" != /usr/include
+	do
+	  if test -d "$cf_add_incdir"
+	  then
+		cf_have_incdir=no
+		if test -n "$CFLAGS$CPPFLAGS" ; then
+		  # a loop is needed to ensure we can add subdirs of existing dirs
+		  for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+			if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+			  cf_have_incdir=yes; break
+			fi
+		  done
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  if test "$cf_add_incdir" = /usr/local/include ; then
+			if test "$GCC" = yes
+			then
+			  cf_save_CPPFLAGS=$CPPFLAGS
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+			  cat >"conftest.$ac_ext" <<_ACEOF
+#line 12995 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:13007: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:13010: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:13013: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:13016: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+			  CPPFLAGS=$cf_save_CPPFLAGS
+			fi
+		  fi
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  test -n "$verbose" && echo "	adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:13033: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+		  CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+		  cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+		  test "$cf_top_incdir" = "$cf_add_incdir" && break
+		  cf_add_incdir="$cf_top_incdir"
+		else
+		  break
+		fi
+	  else
+		break
+	  fi
+	done
+  done
+fi
+
+if test -n "$cf_cv_library_path_utf8" ; then
+	for cf_add_libdir in $cf_cv_library_path_utf8
+	do
+		if test "$cf_add_libdir" = /usr/lib ; then
+			:
+		elif test -d "$cf_add_libdir"
+		then
+			cf_have_libdir=no
+			if test -n "$LDFLAGS$LIBS" ; then
+				# a loop is needed to ensure we can add subdirs of existing dirs
+				for cf_test_libdir in $LDFLAGS $LIBS ; do
+					if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+						cf_have_libdir=yes; break
+					fi
+				done
+			fi
+			if test "$cf_have_libdir" = no ; then
+				test -n "$verbose" && echo "	adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:13069: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+				LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+			fi
+		fi
+	done
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_cv_library_file_utf8; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+fi
+
+		if test "$cf_cv_utf8_lib" != no ; then
+			NCURSES_LIBUTF8=1
+		fi
+	fi
+
+# This is needed on Tru64 5.0 to declare mbstate_t
+echo "$as_me:13101: checking if we must include wchar.h to declare mbstate_t" >&5
+echo $ECHO_N "checking if we must include wchar.h to declare mbstate_t... $ECHO_C" >&6
+if test "${cf_cv_mbstate_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 13108 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stdio.h>
+#ifdef HAVE_LIBUTF8_H
+#include <libutf8.h>
+#endif
+int
+main (void)
+{
+mbstate_t state
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:13126: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:13129: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:13132: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:13135: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_mbstate_t=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 13142 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <wchar.h>
+#ifdef HAVE_LIBUTF8_H
+#include <libutf8.h>
+#endif
+int
+main (void)
+{
+mbstate_t value
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:13161: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:13164: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:13167: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:13170: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_mbstate_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_mbstate_t=unknown
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:13182: result: $cf_cv_mbstate_t" >&5
+echo "${ECHO_T}$cf_cv_mbstate_t" >&6
+
+if test "$cf_cv_mbstate_t" = yes ; then
+
+cat >>confdefs.h <<\EOF
+#define NEED_WCHAR_H 1
+EOF
+
+	NEED_WCHAR_H=1
+fi
+
+# if we do not find mbstate_t in either place, use substitution to provide a fallback.
+if test "$cf_cv_mbstate_t" = unknown ; then
+	NCURSES_MBSTATE_T=1
+fi
+
+# This is needed on Tru64 5.0 to declare wchar_t
+echo "$as_me:13200: checking if we must include wchar.h to declare wchar_t" >&5
+echo $ECHO_N "checking if we must include wchar.h to declare wchar_t... $ECHO_C" >&6
+if test "${cf_cv_wchar_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 13207 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stdio.h>
+#ifdef HAVE_LIBUTF8_H
+#include <libutf8.h>
+#endif
+int
+main (void)
+{
+wchar_t state
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:13225: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:13228: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:13231: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:13234: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_wchar_t=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 13241 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <wchar.h>
+#ifdef HAVE_LIBUTF8_H
+#include <libutf8.h>
+#endif
+int
+main (void)
+{
+wchar_t value
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:13260: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:13263: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:13266: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:13269: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_wchar_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_wchar_t=unknown
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:13281: result: $cf_cv_wchar_t" >&5
+echo "${ECHO_T}$cf_cv_wchar_t" >&6
+
+if test "$cf_cv_wchar_t" = yes ; then
+
+cat >>confdefs.h <<\EOF
+#define NEED_WCHAR_H 1
+EOF
+
+	NEED_WCHAR_H=1
+fi
+
+# if we do not find wchar_t in either place, use substitution to provide a fallback.
+if test "$cf_cv_wchar_t" = unknown ; then
+	NCURSES_WCHAR_T=1
+fi
+
+# if we find wchar_t in either place, use substitution to provide a fallback.
+if test "$cf_cv_wchar_t" != unknown ; then
+	NCURSES_OK_WCHAR_T=1
+fi
+
+# This is needed on Tru64 5.0 to declare wint_t
+echo "$as_me:13304: checking if we must include wchar.h to declare wint_t" >&5
+echo $ECHO_N "checking if we must include wchar.h to declare wint_t... $ECHO_C" >&6
+if test "${cf_cv_wint_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 13311 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stdio.h>
+#ifdef HAVE_LIBUTF8_H
+#include <libutf8.h>
+#endif
+int
+main (void)
+{
+wint_t state
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:13329: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:13332: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:13335: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:13338: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_wint_t=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 13345 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <wchar.h>
+#ifdef HAVE_LIBUTF8_H
+#include <libutf8.h>
+#endif
+int
+main (void)
+{
+wint_t value
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:13364: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:13367: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:13370: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:13373: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_wint_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_wint_t=unknown
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:13385: result: $cf_cv_wint_t" >&5
+echo "${ECHO_T}$cf_cv_wint_t" >&6
+
+if test "$cf_cv_wint_t" = yes ; then
+
+cat >>confdefs.h <<\EOF
+#define NEED_WCHAR_H 1
+EOF
+
+	NEED_WCHAR_H=1
+fi
+
+# if we do not find wint_t in either place, use substitution to provide a fallback.
+if test "$cf_cv_wint_t" = unknown ; then
+	NCURSES_WINT_T=1
+fi
+
+# if we find wint_t in either place, use substitution to provide a fallback.
+if test "$cf_cv_wint_t" != unknown ; then
+	NCURSES_OK_WINT_T=1
+fi
+
+	if test "$NCURSES_MBSTATE_T" != 0; then
+
+cat >>confdefs.h <<\EOF
+#define NEED_MBSTATE_T_DEF 1
+EOF
+
+	fi
+fi
+
+###   use option --disable-lp64 to allow long chtype
+echo "$as_me:13417: checking whether to enable _LP64 definition in curses.h" >&5
+echo $ECHO_N "checking whether to enable _LP64 definition in curses.h... $ECHO_C" >&6
+
+# Check whether --enable-lp64 or --disable-lp64 was given.
+if test "${enable_lp64+set}" = set; then
+  enableval="$enable_lp64"
+  with_lp64=$enableval
+else
+  with_lp64=$cf_dft_with_lp64
+fi;
+echo "$as_me:13427: result: $with_lp64" >&5
+echo "${ECHO_T}$with_lp64" >&6
+
+if test "x$with_lp64" = xyes ; then
+	cf_cv_enable_lp64=1
+else
+	cf_cv_enable_lp64=0
+fi
+
+# Check whether --enable-largefile or --disable-largefile was given.
+if test "${enable_largefile+set}" = set; then
+  enableval="$enable_largefile"
+
+fi;
+if test "$enable_largefile" != no; then
+
+  echo "$as_me:13443: checking for special C compiler options needed for large files" >&5
+echo $ECHO_N "checking for special C compiler options needed for large files... $ECHO_C" >&6
+if test "${ac_cv_sys_largefile_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_sys_largefile_CC=no
+     if test "$GCC" != yes; then
+       ac_save_CC=$CC
+       while :; do
+     	 # IRIX 6.2 and later do not support large files by default,
+     	 # so use the C compiler's -n32 option if that helps.
+         cat >"conftest.$ac_ext" <<_ACEOF
+#line 13455 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+     	 rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:13475: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:13478: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:13481: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:13484: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext"
+     	 CC="$CC -n32"
+     	 rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:13494: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:13497: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:13500: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:13503: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_sys_largefile_CC=' -n32'; break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext"
+         break
+       done
+       CC=$ac_save_CC
+       rm -f "conftest.$ac_ext"
+    fi
+fi
+echo "$as_me:13517: result: $ac_cv_sys_largefile_CC" >&5
+echo "${ECHO_T}$ac_cv_sys_largefile_CC" >&6
+  if test "$ac_cv_sys_largefile_CC" != no; then
+    CC=$CC$ac_cv_sys_largefile_CC
+  fi
+
+  echo "$as_me:13523: checking for _FILE_OFFSET_BITS value needed for large files" >&5
+echo $ECHO_N "checking for _FILE_OFFSET_BITS value needed for large files... $ECHO_C" >&6
+if test "${ac_cv_sys_file_offset_bits+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  while :; do
+  ac_cv_sys_file_offset_bits=no
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 13531 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:13551: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:13554: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:13557: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:13560: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 13569 "configure"
+#include "confdefs.h"
+#define _FILE_OFFSET_BITS 64
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:13590: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:13593: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:13596: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:13599: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_sys_file_offset_bits=64; break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+  break
+done
+fi
+echo "$as_me:13610: result: $ac_cv_sys_file_offset_bits" >&5
+echo "${ECHO_T}$ac_cv_sys_file_offset_bits" >&6
+if test "$ac_cv_sys_file_offset_bits" != no; then
+
+cat >>confdefs.h <<EOF
+#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits
+EOF
+
+fi
+rm -rf conftest*
+  echo "$as_me:13620: checking for _LARGE_FILES value needed for large files" >&5
+echo $ECHO_N "checking for _LARGE_FILES value needed for large files... $ECHO_C" >&6
+if test "${ac_cv_sys_large_files+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  while :; do
+  ac_cv_sys_large_files=no
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 13628 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:13648: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:13651: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:13654: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:13657: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 13666 "configure"
+#include "confdefs.h"
+#define _LARGE_FILES 1
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:13687: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:13690: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:13693: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:13696: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_sys_large_files=1; break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+  break
+done
+fi
+echo "$as_me:13707: result: $ac_cv_sys_large_files" >&5
+echo "${ECHO_T}$ac_cv_sys_large_files" >&6
+if test "$ac_cv_sys_large_files" != no; then
+
+cat >>confdefs.h <<EOF
+#define _LARGE_FILES $ac_cv_sys_large_files
+EOF
+
+fi
+rm -rf conftest*
+fi
+
+	if test "$enable_largefile" != no ; then
+	echo "$as_me:13720: checking for _LARGEFILE_SOURCE value needed for large files" >&5
+echo $ECHO_N "checking for _LARGEFILE_SOURCE value needed for large files... $ECHO_C" >&6
+if test "${ac_cv_sys_largefile_source+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  while :; do
+  ac_cv_sys_largefile_source=no
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 13728 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+return !fseeko;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:13740: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:13743: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:13746: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:13749: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 13758 "configure"
+#include "confdefs.h"
+#define _LARGEFILE_SOURCE 1
+#include <stdio.h>
+int
+main (void)
+{
+return !fseeko;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:13771: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:13774: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:13777: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:13780: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_sys_largefile_source=1; break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+  break
+done
+fi
+echo "$as_me:13791: result: $ac_cv_sys_largefile_source" >&5
+echo "${ECHO_T}$ac_cv_sys_largefile_source" >&6
+if test "$ac_cv_sys_largefile_source" != no; then
+
+cat >>confdefs.h <<EOF
+#define _LARGEFILE_SOURCE $ac_cv_sys_largefile_source
+EOF
+
+fi
+rm -rf conftest*
+
+# We used to try defining _XOPEN_SOURCE=500 too, to work around a bug
+# in glibc 2.1.3, but that breaks too many other things.
+# If you want fseeko and ftello with glibc, upgrade to a fixed glibc.
+echo "$as_me:13805: checking for fseeko" >&5
+echo $ECHO_N "checking for fseeko... $ECHO_C" >&6
+if test "${ac_cv_func_fseeko+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 13811 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+return fseeko && fseeko (stdin, 0, 0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:13823: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:13826: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:13829: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:13832: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_func_fseeko=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_fseeko=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:13842: result: $ac_cv_func_fseeko" >&5
+echo "${ECHO_T}$ac_cv_func_fseeko" >&6
+if test $ac_cv_func_fseeko = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_FSEEKO 1
+EOF
+
+fi
+
+	# Normally we would collect these definitions in the config.h,
+	# but (like _XOPEN_SOURCE), some environments rely on having these
+	# defined before any of the system headers are included.  Another
+	# case comes up with C++, e.g., on AIX the compiler compiles the
+	# header files by themselves before looking at the body files it is
+	# told to compile.  For ncurses, those header files do not include
+	# the config.h
+	if test "$ac_cv_sys_large_files" != no
+	then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-D_LARGE_FILES"
+
+	fi
+	if test "$ac_cv_sys_largefile_source" != no
+	then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-D_LARGEFILE_SOURCE"
+
+	fi
+	if test "$ac_cv_sys_file_offset_bits" != no
+	then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-D_FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits"
+
+	fi
+
+	echo "$as_me:13881: checking whether to use struct dirent64" >&5
+echo $ECHO_N "checking whether to use struct dirent64... $ECHO_C" >&6
+if test "${cf_cv_struct_dirent64+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 13888 "configure"
+#include "confdefs.h"
+
+#pragma GCC diagnostic error "-Wincompatible-pointer-types"
+#include <sys/types.h>
+#include <dirent.h>
+
+int
+main (void)
+{
+
+		/* if transitional largefile support is setup, this is true */
+		extern struct dirent64 * readdir(DIR *);
+		struct dirent64 *x = readdir((DIR *)0);
+		struct dirent *y = readdir((DIR *)0);
+		int z = x - y;
+		(void)z;
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:13911: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:13914: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:13917: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:13920: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_struct_dirent64=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_struct_dirent64=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:13931: result: $cf_cv_struct_dirent64" >&5
+echo "${ECHO_T}$cf_cv_struct_dirent64" >&6
+	test "$cf_cv_struct_dirent64" = yes &&
+cat >>confdefs.h <<\EOF
+#define HAVE_STRUCT_DIRENT64 1
+EOF
+
+	fi
+
+###   use option --disable-tparm-varargs to make tparm() conform to X/Open
+echo "$as_me:13941: checking if you want tparm not to use X/Open fixed-parameter list" >&5
+echo $ECHO_N "checking if you want tparm not to use X/Open fixed-parameter list... $ECHO_C" >&6
+
+# Check whether --enable-tparm-varargs or --disable-tparm-varargs was given.
+if test "${enable_tparm_varargs+set}" = set; then
+  enableval="$enable_tparm_varargs"
+  with_tparm_varargs=$enableval
+else
+  with_tparm_varargs=yes
+fi;
+echo "$as_me:13951: result: $with_tparm_varargs" >&5
+echo "${ECHO_T}$with_tparm_varargs" >&6
+NCURSES_TPARM_VARARGS=0
+test "x$with_tparm_varargs" = xyes && NCURSES_TPARM_VARARGS=1
+
+###   use option --disable-tic-depends to make libtic not explicitly depend on ncurses/ncursesw
+if test "$with_ticlib" != no ; then
+echo "$as_me:13958: checking if you want tic library to use explicit dependency on ncurses$LIB_SUFFIX library" >&5
+echo $ECHO_N "checking if you want tic library to use explicit dependency on ncurses$LIB_SUFFIX library... $ECHO_C" >&6
+
+# Check whether --enable-tic-depends or --disable-tic-depends was given.
+if test "${enable_tic_depends+set}" = set; then
+  enableval="$enable_tic_depends"
+  with_tic_depends=$enableval
+else
+  with_tic_depends=yes
+fi;
+echo "$as_me:13968: result: $with_tic_depends" >&5
+echo "${ECHO_T}$with_tic_depends" >&6
+else
+	with_tic_depends=no
+fi
+
+###   use option --enable-wattr-macros to enable wattr* macros in curses.h
+echo "$as_me:13975: checking if you want to enable wattr* macros" >&5
+echo $ECHO_N "checking if you want to enable wattr* macros... $ECHO_C" >&6
+
+# Check whether --enable-wattr-macros or --disable-wattr-macros was given.
+if test "${enable_wattr_macros+set}" = set; then
+  enableval="$enable_wattr_macros"
+  with_wattr_macros=$enableval
+else
+  with_wattr_macros=no
+fi;
+if [ "x$with_wattr_macros" != xyes ]; then
+	NCURSES_WATTR_MACROS=0
+	echo "$as_me:13987: result: no" >&5
+echo "${ECHO_T}no" >&6
+else
+	NCURSES_WATTR_MACROS=1
+	echo "$as_me:13991: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+fi
+
+echo "$as_me:13995: checking for X11 rgb file" >&5
+echo $ECHO_N "checking for X11 rgb file... $ECHO_C" >&6
+
+# Check whether --with-x11-rgb or --without-x11-rgb was given.
+if test "${with_x11_rgb+set}" = set; then
+  withval="$with_x11_rgb"
+  RGB_PATH=$withval
+else
+  RGB_PATH=auto
+fi;
+
+if test "x$RGB_PATH" = xauto
+then
+	RGB_PATH='${exec_prefix}/lib/X11/rgb.txt'
+	for cf_path in \
+		/opt/local/share/X11/rgb.txt \
+		/opt/X11/share/X11/rgb.txt \
+		/usr/share/X11/rgb.txt \
+		/usr/X11/share/X11/rgb.txt \
+		/usr/X11/lib/X11/rgb.txt \
+		/usr/lib/X11/rgb.txt \
+		/etc/X11/rgb.txt \
+		/usr/pkg/lib/X11/rgb.txt \
+		/usr/X11R7/lib/X11/rgb.txt \
+		/usr/X11R6/lib/X11/rgb.txt \
+		/usr/X11R5/lib/X11/rgb.txt \
+		/usr/X11R4/lib/X11/rgb.txt \
+		/usr/local/lib/X11/rgb.txt \
+		/usr/local/share/X11/rgb.txt \
+		/usr/lib64/X11/rgb.txt
+	do
+		if test -f "$cf_path" ; then
+			RGB_PATH="$cf_path"
+			break
+		fi
+	done
+else
+	cf_path=$RGB_PATH
+
+if test "x$prefix" != xNONE; then
+	cf_path_syntax="$prefix"
+else
+	cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$cf_path" in
+(.\$\(*\)*|.\'*\'*)
+	;;
+(..|./*|.\\*)
+	;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+	;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+	eval cf_path="$cf_path"
+	case ".$cf_path" in
+	(.NONE/*)
+		cf_path=`echo "$cf_path" | sed -e s%NONE%$cf_path_syntax%`
+		;;
+	esac
+	;;
+(.no|.NONE/*)
+	cf_path=`echo "$cf_path" | sed -e s%NONE%$cf_path_syntax%`
+	;;
+(*)
+	{ { echo "$as_me:14059: error: expected a pathname, not \"$cf_path\"" >&5
+echo "$as_me: error: expected a pathname, not \"$cf_path\"" >&2;}
+   { (exit 1); exit 1; }; }
+	;;
+esac
+
+fi
+
+echo "$as_me:14067: result: $RGB_PATH" >&5
+echo "${ECHO_T}$RGB_PATH" >&6
+
+cat >>confdefs.h <<EOF
+#define RGB_PATH "$cf_path"
+EOF
+
+no_x11_rgb=
+if test "$RGB_PATH" = no
+then
+	no_x11_rgb="#"
+fi
+
+###   use option --with-bool to override bool's type
+echo "$as_me:14081: checking for type of bool" >&5
+echo $ECHO_N "checking for type of bool... $ECHO_C" >&6
+
+# Check whether --with-bool or --without-bool was given.
+if test "${with_bool+set}" = set; then
+  withval="$with_bool"
+  NCURSES_BOOL="$withval"
+else
+  NCURSES_BOOL=auto
+fi;
+echo "$as_me:14091: result: $NCURSES_BOOL" >&5
+echo "${ECHO_T}$NCURSES_BOOL" >&6
+
+echo "$as_me:14094: checking for alternate terminal capabilities file" >&5
+echo $ECHO_N "checking for alternate terminal capabilities file... $ECHO_C" >&6
+
+# Check whether --with-caps or --without-caps was given.
+if test "${with_caps+set}" = set; then
+  withval="$with_caps"
+  TERMINFO_CAPS=Caps.$withval
+else
+  TERMINFO_CAPS=Caps
+fi;
+if test ! -f "${srcdir}/include/${TERMINFO_CAPS}"
+then
+	{ echo "$as_me:14106: WARNING: file not found: \"${srcdir}/include/${TERMINFO_CAPS}\"" >&5
+echo "$as_me: WARNING: file not found: \"${srcdir}/include/${TERMINFO_CAPS}\"" >&2;}
+	TERMINFO_CAPS=Caps
+fi
+echo "$as_me:14110: result: $TERMINFO_CAPS" >&5
+echo "${ECHO_T}$TERMINFO_CAPS" >&6
+
+###   use option --with-chtype to override chtype's type
+echo "$as_me:14114: checking for type of chtype" >&5
+echo $ECHO_N "checking for type of chtype... $ECHO_C" >&6
+
+# Check whether --with-chtype or --without-chtype was given.
+if test "${with_chtype+set}" = set; then
+  withval="$with_chtype"
+  NCURSES_CHTYPE="$withval"
+else
+  NCURSES_CHTYPE=$cf_dft_chtype
+fi;
+echo "$as_me:14124: result: $NCURSES_CHTYPE" >&5
+echo "${ECHO_T}$NCURSES_CHTYPE" >&6
+
+###   use option --with-ospeed to override ospeed's type
+echo "$as_me:14128: checking for type of ospeed" >&5
+echo $ECHO_N "checking for type of ospeed... $ECHO_C" >&6
+
+# Check whether --with-ospeed or --without-ospeed was given.
+if test "${with_ospeed+set}" = set; then
+  withval="$with_ospeed"
+  NCURSES_OSPEED="$withval"
+else
+  NCURSES_OSPEED=short
+fi;
+echo "$as_me:14138: result: $NCURSES_OSPEED" >&5
+echo "${ECHO_T}$NCURSES_OSPEED" >&6
+
+###   use option --with-mmask-t to override mmask_t's type
+echo "$as_me:14142: checking for type of mmask_t" >&5
+echo $ECHO_N "checking for type of mmask_t... $ECHO_C" >&6
+
+# Check whether --with-mmask-t or --without-mmask-t was given.
+if test "${with_mmask_t+set}" = set; then
+  withval="$with_mmask_t"
+  NCURSES_MMASK_T="$withval"
+else
+  NCURSES_MMASK_T=$cf_dft_mmask_t
+fi;
+echo "$as_me:14152: result: $NCURSES_MMASK_T" >&5
+echo "${ECHO_T}$NCURSES_MMASK_T" >&6
+
+###   use option --with-ccharw-max to override CCHARW_MAX size
+echo "$as_me:14156: checking for size CCHARW_MAX" >&5
+echo $ECHO_N "checking for size CCHARW_MAX... $ECHO_C" >&6
+
+# Check whether --with-ccharw-max or --without-ccharw-max was given.
+if test "${with_ccharw_max+set}" = set; then
+  withval="$with_ccharw_max"
+  NCURSES_CCHARW_MAX="$withval"
+else
+  NCURSES_CCHARW_MAX=$cf_dft_ccharw_max
+fi;
+echo "$as_me:14166: result: $NCURSES_CCHARW_MAX" >&5
+echo "${ECHO_T}$NCURSES_CCHARW_MAX" >&6
+
+echo "$as_me:14169: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
+if test "${ac_cv_header_stdc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 14175 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+_ACEOF
+if { (eval echo "$as_me:14183: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:14189: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_cv_header_stdc=yes
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  ac_cv_header_stdc=no
+fi
+rm -f conftest.err "conftest.$ac_ext"
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 14211 "configure"
+#include "confdefs.h"
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -rf conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 14229 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -rf conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then
+  :
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 14250 "configure"
+#include "confdefs.h"
+#include <ctype.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) (('a' <= (c) && (c) <= 'i') \
+                     || ('j' <= (c) && (c) <= 'r') \
+                     || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main (void)
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+        || toupper (i) != TOUPPER (i))
+      $ac_main_return(2);
+  $ac_main_return (0);
+}
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:14276: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:14279: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:14281: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:14284: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_header_stdc=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+fi
+fi
+echo "$as_me:14297: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6
+if test $ac_cv_header_stdc = yes; then
+
+cat >>confdefs.h <<\EOF
+#define STDC_HEADERS 1
+EOF
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+                  inttypes.h stdint.h unistd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:14313: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 14319 "configure"
+#include "confdefs.h"
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:14325: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:14328: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:14331: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:14334: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_Header=no"
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:14344: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+echo "$as_me:14354: checking for signed char" >&5
+echo $ECHO_N "checking for signed char... $ECHO_C" >&6
+if test "${ac_cv_type_signed_char+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 14360 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+if ((signed char *) 0)
+  return 0;
+if (sizeof (signed char))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:14375: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:14378: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:14381: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:14384: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_type_signed_char=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_type_signed_char=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:14394: result: $ac_cv_type_signed_char" >&5
+echo "${ECHO_T}$ac_cv_type_signed_char" >&6
+
+echo "$as_me:14397: checking size of signed char" >&5
+echo $ECHO_N "checking size of signed char... $ECHO_C" >&6
+if test "${ac_cv_sizeof_signed_char+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$ac_cv_type_signed_char" = yes; then
+  if test "$cross_compiling" = yes; then
+  # Depending upon the size, compute the lo and hi bounds.
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 14406 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+int _array_ [1 - 2 * !((sizeof (signed char)) >= 0)]
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:14418: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:14421: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:14424: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:14427: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat >"conftest.$ac_ext" <<_ACEOF
+#line 14432 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+int _array_ [1 - 2 * !((sizeof (signed char)) <= $ac_mid)]
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:14444: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:14447: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:14450: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:14453: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_hi=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_lo=`expr "$ac_mid" + 1`; ac_mid=`expr 2 '*' "$ac_mid" + 1`
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+  done
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_hi=-1 ac_mid=-1
+  while :; do
+    cat >"conftest.$ac_ext" <<_ACEOF
+#line 14469 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+int _array_ [1 - 2 * !((sizeof (signed char)) >= $ac_mid)]
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:14481: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:14484: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:14487: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:14490: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_lo=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_hi=`expr "$ac_mid" - 1`; ac_mid=`expr 2 '*' "$ac_mid"`
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+  done
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  ac_mid=`expr '(' "$ac_hi" - "$ac_lo" ')' / 2 + "$ac_lo"`
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 14506 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+int _array_ [1 - 2 * !((sizeof (signed char)) <= $ac_mid)]
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:14518: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:14521: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:14524: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:14527: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_hi=$ac_mid
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_lo=`expr "$ac_mid" + 1`
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+done
+ac_cv_sizeof_signed_char=$ac_lo
+else
+  if test "$cross_compiling" = yes; then
+  { { echo "$as_me:14540: error: cannot run test program while cross compiling" >&5
+echo "$as_me: error: cannot run test program while cross compiling" >&2;}
+   { (exit 1); exit 1; }; }
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 14545 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+FILE *f = fopen ("conftest.val", "w");
+if (!f)
+  $ac_main_return (1);
+fprintf (f, "%ld", (long)(sizeof (signed char)));
+fclose (f);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:14561: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:14564: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:14566: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:14569: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_sizeof_signed_char=`cat conftest.val`
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+fi
+rm -f conftest.val
+else
+  ac_cv_sizeof_signed_char=0
+fi
+fi
+echo "$as_me:14585: result: $ac_cv_sizeof_signed_char" >&5
+echo "${ECHO_T}$ac_cv_sizeof_signed_char" >&6
+cat >>confdefs.h <<EOF
+#define SIZEOF_SIGNED_CHAR $ac_cv_sizeof_signed_char
+EOF
+
+if test "$ac_cv_sizeof_signed_char" = 1 ; then
+	NCURSES_SBOOL="signed char"
+else
+	NCURSES_SBOOL="char"
+fi
+echo "$as_me:14596: checking if you want to use signed Boolean array in term.h" >&5
+echo $ECHO_N "checking if you want to use signed Boolean array in term.h... $ECHO_C" >&6
+
+# Check whether --enable-signed-char or --disable-signed-char was given.
+if test "${enable_signed_char+set}" = set; then
+  enableval="$enable_signed_char"
+  with_signed_char=$enableval
+else
+  with_signed_char=$cf_dft_signed_char
+fi;
+echo "$as_me:14606: result: $with_signed_char" >&5
+echo "${ECHO_T}$with_signed_char" >&6
+test "x$with_signed_char" != xyes && NCURSES_SBOOL="char"
+
+###   use option --with-tparm-arg to override tparm's argument type
+echo "$as_me:14611: checking for type of tparm args" >&5
+echo $ECHO_N "checking for type of tparm args... $ECHO_C" >&6
+
+# Check whether --with-tparm-arg or --without-tparm-arg was given.
+if test "${with_tparm_arg+set}" = set; then
+  withval="$with_tparm_arg"
+  NCURSES_TPARM_ARG="$withval"
+else
+  NCURSES_TPARM_ARG=$cf_dft_tparm_arg
+fi;
+echo "$as_me:14621: result: $NCURSES_TPARM_ARG" >&5
+echo "${ECHO_T}$NCURSES_TPARM_ARG" >&6
+
+### Enable compiling-in rcs id's
+echo "$as_me:14625: checking if RCS identifiers should be compiled-in" >&5
+echo $ECHO_N "checking if RCS identifiers should be compiled-in... $ECHO_C" >&6
+
+# Check whether --with-rcs-ids or --without-rcs-ids was given.
+if test "${with_rcs_ids+set}" = set; then
+  withval="$with_rcs_ids"
+  with_rcs_ids=$withval
+else
+  with_rcs_ids=no
+fi;
+echo "$as_me:14635: result: $with_rcs_ids" >&5
+echo "${ECHO_T}$with_rcs_ids" >&6
+test "x$with_rcs_ids" = xyes &&
+cat >>confdefs.h <<\EOF
+#define USE_RCS_IDS 1
+EOF
+
+###############################################################################
+
+echo "$as_me:14644: checking format of man-pages" >&5
+echo $ECHO_N "checking format of man-pages... $ECHO_C" >&6
+
+# Check whether --with-manpage-format or --without-manpage-format was given.
+if test "${with_manpage_format+set}" = set; then
+  withval="$with_manpage_format"
+  MANPAGE_FORMAT=$withval
+else
+  MANPAGE_FORMAT=unknown
+fi;
+
+test -z "$MANPAGE_FORMAT" && MANPAGE_FORMAT=unknown
+MANPAGE_FORMAT=`echo "$MANPAGE_FORMAT" | sed -e 's/,/ /g'`
+
+cf_unknown=
+
+case "$MANPAGE_FORMAT" in
+(unknown)
+	if test -z "$MANPATH" ; then
+		MANPATH="/usr/man:/usr/share/man"
+	fi
+
+	# look for the 'date' man-page (it is most likely to be installed!)
+	MANPAGE_FORMAT=
+	cf_preform="no"
+	cf_catonly="yes"
+	cf_example="date"
+
+	IFS="${IFS:- 	}"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}"
+	for cf_dir in $MANPATH; do
+		test -z "$cf_dir" && cf_dir=/usr/man
+		for cf_name in $cf_dir/man*/$cf_example.[01]* $cf_dir/cat*/$cf_example.[01]* $cf_dir/man*/$cf_example $cf_dir/cat*/$cf_example
+		do
+			cf_test=`echo "$cf_name" | sed -e 's/*//'`
+			if test "x$cf_test" = "x$cf_name" ; then
+
+				case "$cf_name" in
+				(*.bz2) MANPAGE_FORMAT="$MANPAGE_FORMAT bzip2";;
+				(*.xz)  MANPAGE_FORMAT="$MANPAGE_FORMAT xz";;
+				(*.gz)  MANPAGE_FORMAT="$MANPAGE_FORMAT gzip";;
+				(*.Z)   MANPAGE_FORMAT="$MANPAGE_FORMAT compress";;
+				(*.0)   MANPAGE_FORMAT="$MANPAGE_FORMAT BSDI";;
+				(*)     MANPAGE_FORMAT="$MANPAGE_FORMAT normal";;
+				esac
+
+				case "$cf_name" in
+				($cf_dir/man*)
+					cf_catonly=no
+					;;
+				($cf_dir/cat*)
+					cf_preform=yes
+					;;
+				esac
+				break
+			fi
+
+			# if we found a match in either man* or cat*, stop looking
+			if test -n "$MANPAGE_FORMAT" ; then
+				cf_found=no
+				test "$cf_preform" = yes && MANPAGE_FORMAT="$MANPAGE_FORMAT formatted"
+				test "$cf_catonly" = yes && MANPAGE_FORMAT="$MANPAGE_FORMAT catonly"
+				case "$cf_name" in
+				($cf_dir/cat*)
+					cf_found=yes
+					;;
+				esac
+				test "$cf_found" = yes && break
+			fi
+		done
+		# only check the first directory in $MANPATH where we find manpages
+		if test -n "$MANPAGE_FORMAT" ; then
+			break
+		fi
+	done
+	# if we did not find the example, just assume it is normal
+	test -z "$MANPAGE_FORMAT" && MANPAGE_FORMAT=normal
+	IFS="$ac_save_ifs"
+	;;
+(*)
+	for cf_option in $MANPAGE_FORMAT; do
+	case "$cf_option" in
+	(xz|bzip2|gzip|compress|BSDI|normal|formatted|catonly)
+		;;
+	(*)
+		cf_unknown="$cf_unknown $cf_option"
+		;;
+	esac
+	done
+	;;
+esac
+
+echo "$as_me:14735: result: $MANPAGE_FORMAT" >&5
+echo "${ECHO_T}$MANPAGE_FORMAT" >&6
+if test -n "$cf_unknown" ; then
+	{ echo "$as_me:14738: WARNING: Unexpected manpage-format $cf_unknown" >&5
+echo "$as_me: WARNING: Unexpected manpage-format $cf_unknown" >&2;}
+fi
+
+echo "$as_me:14742: checking for manpage renaming" >&5
+echo $ECHO_N "checking for manpage renaming... $ECHO_C" >&6
+
+# Check whether --with-manpage-renames or --without-manpage-renames was given.
+if test "${with_manpage_renames+set}" = set; then
+  withval="$with_manpage_renames"
+  MANPAGE_RENAMES=$withval
+else
+  MANPAGE_RENAMES=yes
+fi;
+
+case ".$MANPAGE_RENAMES" in
+(.no)
+	;;
+(.|.yes)
+	# Debian 'man' program?
+	if test -f /etc/debian_version ; then
+		MANPAGE_RENAMES=man/man_db.renames
+	else
+		MANPAGE_RENAMES=no
+	fi
+	;;
+esac
+
+if test "$MANPAGE_RENAMES" = man/man_db.renames ; then
+	MANPAGE_RENAMES=`pwd`/$MANPAGE_RENAMES
+elif test "$MANPAGE_RENAMES" = no ; then
+	:
+elif test ! -f "$MANPAGE_RENAMES" ; then
+	{ { echo "$as_me:14771: error: not a filename: $MANPAGE_RENAMES" >&5
+echo "$as_me: error: not a filename: $MANPAGE_RENAMES" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+echo "$as_me:14776: result: $MANPAGE_RENAMES" >&5
+echo "${ECHO_T}$MANPAGE_RENAMES" >&6
+
+echo "$as_me:14779: checking if manpage aliases will be installed" >&5
+echo $ECHO_N "checking if manpage aliases will be installed... $ECHO_C" >&6
+
+# Check whether --with-manpage-aliases or --without-manpage-aliases was given.
+if test "${with_manpage_aliases+set}" = set; then
+  withval="$with_manpage_aliases"
+  MANPAGE_ALIASES=$withval
+else
+  MANPAGE_ALIASES=yes
+fi;
+
+echo "$as_me:14790: result: $MANPAGE_ALIASES" >&5
+echo "${ECHO_T}$MANPAGE_ALIASES" >&6
+
+case "x$LN_S" in
+(xln*)
+	cf_use_symlinks=yes
+	;;
+(*)
+	cf_use_symlinks=no
+	;;
+esac
+
+MANPAGE_SYMLINKS=no
+if test "$MANPAGE_ALIASES" = yes ; then
+echo "$as_me:14804: checking if manpage symlinks should be used" >&5
+echo $ECHO_N "checking if manpage symlinks should be used... $ECHO_C" >&6
+
+# Check whether --with-manpage-symlinks or --without-manpage-symlinks was given.
+if test "${with_manpage_symlinks+set}" = set; then
+  withval="$with_manpage_symlinks"
+  MANPAGE_SYMLINKS=$withval
+else
+  MANPAGE_SYMLINKS=$cf_use_symlinks
+fi;
+
+if test "$$cf_use_symlinks" = no; then
+if test "$MANPAGE_SYMLINKS" = yes ; then
+	{ echo "$as_me:14817: WARNING: cannot make symlinks" >&5
+echo "$as_me: WARNING: cannot make symlinks" >&2;}
+	MANPAGE_SYMLINKS=no
+fi
+fi
+
+echo "$as_me:14823: result: $MANPAGE_SYMLINKS" >&5
+echo "${ECHO_T}$MANPAGE_SYMLINKS" >&6
+fi
+
+echo "$as_me:14827: checking for manpage tbl" >&5
+echo $ECHO_N "checking for manpage tbl... $ECHO_C" >&6
+
+# Check whether --with-manpage-tbl or --without-manpage-tbl was given.
+if test "${with_manpage_tbl+set}" = set; then
+  withval="$with_manpage_tbl"
+  MANPAGE_TBL=$withval
+else
+  MANPAGE_TBL=no
+fi;
+
+echo "$as_me:14838: result: $MANPAGE_TBL" >&5
+echo "${ECHO_T}$MANPAGE_TBL" >&6
+
+if test "$prefix" = "NONE" ; then
+	cf_prefix="$ac_default_prefix"
+else
+	cf_prefix="$prefix"
+fi
+
+case "$MANPAGE_FORMAT" in
+(*catonly*)
+	cf_format=yes
+	cf_inboth=no
+	;;
+(*formatted*)
+	cf_format=yes
+	cf_inboth=yes
+	;;
+(*)
+	cf_format=no
+	cf_inboth=no
+	;;
+esac
+
+test ! -d man && mkdir man
+
+cf_so_strip=
+cf_compress=
+for cf_manpage_format in $MANPAGE_FORMAT
+do
+case "$cf_manpage_format" in
+(compress)
+	cf_so_strip="Z"
+	cf_compress=compress
+	;;
+(gzip)
+	cf_so_strip="gz"
+	cf_compress=gzip
+	;;
+(bzip2)
+	cf_so_strip="bz2"
+	cf_compress=bzip2
+	;;
+(xz)
+	cf_so_strip="xz"
+	cf_compress=xz
+	;;
+esac
+done
+
+cf_edit_man=./edit_man.sh
+cf_man_alias=`pwd`/man_alias.sed
+
+cat >$cf_edit_man <<CF_EOF
+#! $SHELL
+# this script is generated by the configure-script CF_MAN_PAGES macro.
+
+prefix="$cf_prefix"
+datarootdir="$datarootdir"
+datadir="$datadir"
+
+NCURSES_MAJOR="$NCURSES_MAJOR"
+NCURSES_MINOR="$NCURSES_MINOR"
+NCURSES_PATCH="$NCURSES_PATCH"
+
+NCURSES_OSPEED="$NCURSES_OSPEED"
+TERMINFO="$TERMINFO"
+
+INSTALL="$INSTALL"
+INSTALL_DATA="$INSTALL_DATA"
+
+transform="$program_transform_name"
+
+TMP=\${TMPDIR:=/tmp}/man\$\$
+trap "rm -f \$TMP; exit 1" 1 2 3 15
+trap "rm -f \$TMP" 0
+
+form=\$1
+shift || exit 1
+
+verb=\$1
+shift || exit 1
+
+mandir=\$1
+shift || exit 1
+
+srcdir=\$1
+top_srcdir=\$srcdir/..
+shift || exit 1
+
+if test "\$form" = normal ; then
+	if test "$cf_format" = yes ; then
+	if test "$cf_inboth" = no ; then
+		$SHELL "\$0" format "\$verb" "\$mandir" "\$srcdir" "\$@"
+		exit $?
+	fi
+	fi
+	cf_subdir=\$mandir/man
+	cf_tables=$MANPAGE_TBL
+else
+	cf_subdir=\$mandir/cat
+	cf_tables=yes
+fi
+
+# process the list of source-files
+for i in "\$@" ; do
+case \$i in
+(*.orig|*.rej) ;;
+(*.[0-9]*)
+	section=\`expr "\$i" : '.*\\.\\([0-9]\\)[xm]*'\`;
+	if test "\$verb" = installing ; then
+	if test ! -d "\$cf_subdir\${section}" ; then
+		mkdir -p "\$cf_subdir\$section"
+	fi
+	fi
+
+	# replace variables in man page
+	if test ! -f "$cf_man_alias" ; then
+cat >>$cf_man_alias <<-CF_EOF2
+		s,@DATADIR@,\$datadir,g
+		s,@TERMINFO@,\${TERMINFO:="no default value"},g
+		s,@TERMINFO_DIRS@,\${TERMINFO_DIRS:="no default value"},g
+		s,@NCURSES_MAJOR@,\${NCURSES_MAJOR:="no default value"},g
+		s,@NCURSES_MINOR@,\${NCURSES_MINOR:="no default value"},g
+		s,@NCURSES_PATCH@,\${NCURSES_PATCH:="no default value"},g
+		s,@NCURSES_OSPEED@,\${NCURSES_OSPEED:="no default value"},g
+CF_EOF
+
+	for cf_name in  captoinfo clear infocmp infotocap reset tabs tic toe tput tset
+	do
+		cf_NAME=`echo "$cf_name" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+		cf_name=`echo "$cf_name" | sed "$program_transform_name"`
+cat >>$cf_edit_man <<-CF_EOF
+		s,@$cf_NAME@,$cf_name,g
+CF_EOF
+	done
+
+cat >>$cf_edit_man <<CF_EOF
+CF_EOF2
+		echo "...made $cf_man_alias"
+	fi
+
+	aliases=
+	cf_source=\`basename "\$i"\`
+	inalias=\$cf_source
+	test ! -f "\$inalias" && inalias="\$srcdir/\$inalias"
+	if test ! -f "\$inalias" ; then
+		echo ".. skipped \$cf_source"
+		continue
+	fi
+CF_EOF
+
+if test "$MANPAGE_ALIASES" != no ; then
+cat >>$cf_edit_man <<CF_EOF
+	nCurses=ignore.3x
+	test "$with_curses_h" = yes && nCurses=ncurses.3x
+	aliases=\`sed -f "\$top_srcdir/man/manlinks.sed" "\$inalias" |sed -f "$cf_man_alias" | sort -u; test "\$inalias" = "\$nCurses" && echo curses\`
+CF_EOF
+fi
+
+if test "$MANPAGE_RENAMES" = no ; then
+cat >>$cf_edit_man <<CF_EOF
+	# perform program transformations for section 1 man pages
+	if test \$section = 1 ; then
+		cf_target=\$cf_subdir\${section}/\`echo \$cf_source|sed "\${transform}"\`
+	else
+		cf_target=\$cf_subdir\${section}/\$cf_source
+	fi
+CF_EOF
+else
+cat >>$cf_edit_man <<CF_EOF
+	cf_target=\`grep "^\$cf_source" $MANPAGE_RENAMES | $AWK '{print \$2}'\`
+	if test -z "\$cf_target" ; then
+		echo "? missing rename for \$cf_source"
+		cf_target="\$cf_source"
+	fi
+	cf_target="\$cf_subdir\${section}/\${cf_target}"
+
+CF_EOF
+fi
+
+cat >>$cf_edit_man <<CF_EOF
+	sed	-f "$cf_man_alias" \\
+CF_EOF
+
+if test "$MANPAGE_RENAMES" != no ; then
+cat >>$cf_edit_man <<CF_EOF
+		< "\$i" | sed -f `pwd`/edit_man.sed >\$TMP
+CF_EOF
+else
+cat >>$cf_edit_man <<CF_EOF
+		< "\$i" >\$TMP
+CF_EOF
+fi
+
+cat >>$cf_edit_man <<CF_EOF
+if test \$cf_tables = yes ; then
+	tbl \$TMP >\$TMP.out
+	mv \$TMP.out \$TMP
+fi
+CF_EOF
+
+if test "$with_overwrite" != yes ; then
+cat >>$cf_edit_man <<CF_EOF
+	sed -e "/\\#[    ]*include/s,<curses.h,<ncurses$LIB_SUFFIX/curses.h," < \$TMP >\$TMP.out
+	mv \$TMP.out \$TMP
+CF_EOF
+fi
+
+if test "$with_curses_h" != yes ; then
+cat >>$cf_edit_man <<CF_EOF
+	sed -e "/\\#[    ]*include/s,curses.h,ncurses.h," < \$TMP >\$TMP.out
+	mv \$TMP.out \$TMP
+CF_EOF
+fi
+
+cat >>$cf_edit_man <<CF_EOF
+	if test "\$form" = format ; then
+		nroff -man \$TMP >\$TMP.out
+		mv \$TMP.out \$TMP
+	fi
+CF_EOF
+
+if test -n "$cf_compress" ; then
+cat >>$cf_edit_man <<CF_EOF
+	if test "\$verb" = installing ; then
+	if ( "$cf_compress" -f \$TMP )
+	then
+		mv \$TMP.$cf_so_strip \$TMP
+	fi
+	fi
+	cf_target="\$cf_target.$cf_so_strip"
+CF_EOF
+fi
+
+case "$MANPAGE_FORMAT" in
+(*BSDI*)
+cat >>$cf_edit_man <<CF_EOF
+	if test "\$form" = format ; then
+		# BSDI installs only .0 suffixes in the cat directories
+		cf_target="\`echo \$cf_target|sed -e 's/\\.[1-9]\\+[a-z]*/.0/'\`"
+	fi
+CF_EOF
+  ;;
+esac
+
+cat >>$cf_edit_man <<CF_EOF
+	suffix=\`basename "\$cf_target" | sed -e 's%^[^.]*%%'\`
+	if test "\$verb" = installing ; then
+		echo "\$verb \$cf_target"
+		\$INSTALL_DATA \$TMP "\$cf_target"
+		test -d "\$cf_subdir\${section}" &&
+		test -n "\$aliases" && (
+			cd "\$cf_subdir\${section}" && (
+				cf_source=\`echo "\$cf_target" |sed -e 's%^.*/\\([^/][^/]*/[^/][^/]*$\\)%\\1%'\`
+				test -n "$cf_so_strip" && cf_source=\`echo "\$cf_source" |sed -e 's%\\.$cf_so_strip\$%%'\`
+				cf_target=\`basename "\$cf_target"\`
+				for cf_alias in \$aliases
+				do
+					if test "\$section" = 1 ; then
+						cf_alias=\`echo "\$cf_alias" |sed "\${transform}"\`
+					fi
+
+					if test "$MANPAGE_SYMLINKS" = yes ; then
+						if test -f "\$cf_alias\${suffix}" ; then
+							if ( cmp -s "\$cf_target" "\$cf_alias\${suffix}" )
+							then
+								continue
+							fi
+						fi
+						echo ".. \$verb alias \$cf_alias\${suffix}"
+CF_EOF
+case "x$LN_S" in
+(*-f)
+cat >>$cf_edit_man <<CF_EOF
+						$LN_S "\$cf_target" "\$cf_alias\${suffix}"
+CF_EOF
+	;;
+(*)
+cat >>$cf_edit_man <<CF_EOF
+						rm -f "\$cf_alias\${suffix}"
+						$LN_S "\$cf_target" "\$cf_alias\${suffix}"
+CF_EOF
+	;;
+esac
+cat >>$cf_edit_man <<CF_EOF
+					elif test "\$cf_target" != "\$cf_alias\${suffix}" ; then
+						echo ".so \$cf_source" >\$TMP
+CF_EOF
+if test -n "$cf_compress" ; then
+cat >>$cf_edit_man <<CF_EOF
+						if test -n "$cf_so_strip" ; then
+							"$cf_compress" -f \$TMP
+							mv \$TMP.$cf_so_strip \$TMP
+						fi
+CF_EOF
+fi
+cat >>$cf_edit_man <<CF_EOF
+						echo ".. \$verb alias \$cf_alias\${suffix}"
+						rm -f "\$cf_alias\${suffix}"
+						\$INSTALL_DATA \$TMP "\$cf_alias\${suffix}"
+					fi
+				done
+			)
+		)
+	elif test "\$verb" = removing ; then
+		test -f "\$cf_target" && (
+			echo "\$verb \$cf_target"
+			rm -f "\$cf_target"
+		)
+		test -d "\$cf_subdir\${section}" &&
+		test -n "\$aliases" && (
+			cd "\$cf_subdir\${section}" && (
+				for cf_alias in \$aliases
+				do
+					if test "\$section" = 1 ; then
+						cf_alias=\`echo "\$cf_alias" |sed "\${transform}"\`
+					fi
+
+					echo ".. \$verb alias \$cf_alias\${suffix}"
+					rm -f "\$cf_alias\${suffix}"
+				done
+			)
+		)
+	else
+#		echo ".hy 0"
+		cat \$TMP
+	fi
+	;;
+esac
+done
+
+if test "$cf_inboth" = yes ; then
+if test "\$form" != format ; then
+	$SHELL "\$0" format "\$verb" "\$mandir" "\$srcdir" "\$@"
+fi
+fi
+
+exit 0
+CF_EOF
+chmod 755 "$cf_edit_man"
+
+###############################################################################
+
+### Note that some functions (such as const) are normally disabled anyway.
+echo "$as_me:15183: checking if you want to build with function extensions" >&5
+echo $ECHO_N "checking if you want to build with function extensions... $ECHO_C" >&6
+
+# Check whether --enable-ext-funcs or --disable-ext-funcs was given.
+if test "${enable_ext_funcs+set}" = set; then
+  enableval="$enable_ext_funcs"
+  with_ext_funcs=$enableval
+else
+  with_ext_funcs=yes
+fi;
+echo "$as_me:15193: result: $with_ext_funcs" >&5
+echo "${ECHO_T}$with_ext_funcs" >&6
+if test "x$with_ext_funcs" = xyes ; then
+	NCURSES_EXT_FUNCS=1
+
+cat >>confdefs.h <<\EOF
+#define NCURSES_EXT_FUNCS 1
+EOF
+
+cat >>confdefs.h <<\EOF
+#define HAVE_ASSUME_DEFAULT_COLORS 1
+EOF
+
+cat >>confdefs.h <<\EOF
+#define HAVE_CURSES_VERSION 1
+EOF
+
+cat >>confdefs.h <<\EOF
+#define HAVE_HAS_KEY 1
+EOF
+
+cat >>confdefs.h <<\EOF
+#define HAVE_RESIZETERM 1
+EOF
+
+cat >>confdefs.h <<\EOF
+#define HAVE_RESIZE_TERM 1
+EOF
+
+cat >>confdefs.h <<\EOF
+#define HAVE_TERM_ENTRY_H 1
+EOF
+
+cat >>confdefs.h <<\EOF
+#define HAVE_USE_DEFAULT_COLORS 1
+EOF
+
+cat >>confdefs.h <<\EOF
+#define HAVE_USE_EXTENDED_NAMES 1
+EOF
+
+cat >>confdefs.h <<\EOF
+#define HAVE_USE_SCREEN 1
+EOF
+
+cat >>confdefs.h <<\EOF
+#define HAVE_USE_WINDOW 1
+EOF
+
+cat >>confdefs.h <<\EOF
+#define HAVE_WRESIZE 1
+EOF
+
+	GENERATED_EXT_FUNCS=generated
+	test "x$with_ext_funcs" = xyes || cf_dft_ext_spfuncs=no
+else
+	NCURSES_EXT_FUNCS=0
+	GENERATED_EXT_FUNCS=
+fi
+
+echo "$as_me:15253: checking if you want to build with SCREEN extensions" >&5
+echo $ECHO_N "checking if you want to build with SCREEN extensions... $ECHO_C" >&6
+
+# Check whether --enable-sp-funcs or --disable-sp-funcs was given.
+if test "${enable_sp_funcs+set}" = set; then
+  enableval="$enable_sp_funcs"
+  with_sp_funcs=$enableval
+else
+  with_sp_funcs=$cf_dft_ext_spfuncs
+fi;
+echo "$as_me:15263: result: $with_sp_funcs" >&5
+echo "${ECHO_T}$with_sp_funcs" >&6
+if test "x$with_sp_funcs" = xyes ; then
+	NCURSES_SP_FUNCS=1
+
+cat >>confdefs.h <<\EOF
+#define NCURSES_SP_FUNCS 1
+EOF
+
+cat >>confdefs.h <<\EOF
+#define HAVE_TPUTS_SP 1
+EOF
+
+	GENERATED_SP_FUNCS=generated
+else
+	NCURSES_SP_FUNCS=0
+	GENERATED_SP_FUNCS=
+fi
+
+echo "$as_me:15282: checking if you want to build with terminal-driver" >&5
+echo $ECHO_N "checking if you want to build with terminal-driver... $ECHO_C" >&6
+
+# Check whether --enable-term-driver or --disable-term-driver was given.
+if test "${enable_term_driver+set}" = set; then
+  enableval="$enable_term_driver"
+  with_term_driver=$enableval
+else
+  with_term_driver=no
+fi;
+echo "$as_me:15292: result: $with_term_driver" >&5
+echo "${ECHO_T}$with_term_driver" >&6
+if test "x$with_term_driver" = xyes ; then
+
+cat >>confdefs.h <<\EOF
+#define USE_TERM_DRIVER 1
+EOF
+
+	if test "x$with_termlib" != xno ; then
+		{ { echo "$as_me:15301: error: The term-driver option conflicts with the termlib option" >&5
+echo "$as_me: error: The term-driver option conflicts with the termlib option" >&2;}
+   { (exit 1); exit 1; }; }
+	fi
+	if test "x$with_sp_funcs" != xyes ; then
+		{ { echo "$as_me:15306: error: The term-driver option relies upon sp-funcs" >&5
+echo "$as_me: error: The term-driver option relies upon sp-funcs" >&2;}
+   { (exit 1); exit 1; }; }
+	fi
+fi
+
+###   use option --enable-const to turn on use of const beyond that in XSI.
+echo "$as_me:15313: checking for extended use of const keyword" >&5
+echo $ECHO_N "checking for extended use of const keyword... $ECHO_C" >&6
+
+# Check whether --enable-const or --disable-const was given.
+if test "${enable_const+set}" = set; then
+  enableval="$enable_const"
+  with_ext_const=$enableval
+else
+  with_ext_const=$cf_dft_ext_const
+fi;
+echo "$as_me:15323: result: $with_ext_const" >&5
+echo "${ECHO_T}$with_ext_const" >&6
+NCURSES_CONST='/*nothing*/'
+if test "x$with_ext_const" = xyes ; then
+	NCURSES_CONST=const
+fi
+
+###   use option --enable-ext-colors to turn on use of colors beyond 16.
+echo "$as_me:15331: checking if you want to use extended colors" >&5
+echo $ECHO_N "checking if you want to use extended colors... $ECHO_C" >&6
+
+# Check whether --enable-ext-colors or --disable-ext-colors was given.
+if test "${enable_ext_colors+set}" = set; then
+  enableval="$enable_ext_colors"
+  with_ext_colors=$enableval
+else
+  with_ext_colors=$cf_dft_ext_colors
+fi;
+echo "$as_me:15341: result: $with_ext_colors" >&5
+echo "${ECHO_T}$with_ext_colors" >&6
+NCURSES_EXT_COLORS=0
+if test "x$with_ext_colors" = xyes ; then
+	if test "x$with_widec" != xyes ; then
+		{ echo "$as_me:15346: WARNING: This option applies only to wide-character library" >&5
+echo "$as_me: WARNING: This option applies only to wide-character library" >&2;}
+	else
+		# cannot be ABI 5 since it changes sizeof(cchar_t)
+
+if test "${with_abi_version+set}" != set; then
+	case "$cf_cv_rel_version" in
+	(5.*)
+		cf_cv_rel_version=6.0
+		cf_cv_abi_version=6
+		{ echo "$as_me:15356: WARNING: overriding ABI version to $cf_cv_abi_version" >&5
+echo "$as_me: WARNING: overriding ABI version to $cf_cv_abi_version" >&2;}
+		;;
+	esac
+fi
+
+		NCURSES_EXT_COLORS=1
+
+cat >>confdefs.h <<\EOF
+#define NCURSES_EXT_COLORS 1
+EOF
+
+cat >>confdefs.h <<\EOF
+#define HAVE_ALLOC_PAIR 1
+EOF
+
+cat >>confdefs.h <<\EOF
+#define HAVE_INIT_EXTENDED_COLOR 1
+EOF
+
+cat >>confdefs.h <<\EOF
+#define HAVE_RESET_COLOR_PAIRS 1
+EOF
+
+	fi
+fi
+
+###   use option --enable-ext-mouse to modify coding to support 5-button mice
+echo "$as_me:15384: checking if you want to use extended mouse encoding" >&5
+echo $ECHO_N "checking if you want to use extended mouse encoding... $ECHO_C" >&6
+
+# Check whether --enable-ext-mouse or --disable-ext-mouse was given.
+if test "${enable_ext_mouse+set}" = set; then
+  enableval="$enable_ext_mouse"
+  with_ext_mouse=$enableval
+else
+  with_ext_mouse=$cf_dft_ext_mouse
+fi;
+echo "$as_me:15394: result: $with_ext_mouse" >&5
+echo "${ECHO_T}$with_ext_mouse" >&6
+if test "x$with_ext_mouse" = xyes ; then
+
+if test "${with_abi_version+set}" != set; then
+	case "$cf_cv_rel_version" in
+	(5.*)
+		cf_cv_rel_version=6.0
+		cf_cv_abi_version=6
+		{ echo "$as_me:15403: WARNING: overriding ABI version to $cf_cv_abi_version" >&5
+echo "$as_me: WARNING: overriding ABI version to $cf_cv_abi_version" >&2;}
+		;;
+	esac
+fi
+
+fi
+
+case $cf_cv_abi_version in
+(5)
+	NCURSES_MOUSE_VERSION=1
+	;;
+(6)
+	NCURSES_MOUSE_VERSION=2
+	;;
+([789])
+	NCURSES_MOUSE_VERSION=3
+	;;
+esac
+
+###   use option --enable-ext-putwin to turn on extended screendumps
+echo "$as_me:15424: checking if you want to use extended putwin/screendump" >&5
+echo $ECHO_N "checking if you want to use extended putwin/screendump... $ECHO_C" >&6
+
+# Check whether --enable-ext-putwin or --disable-ext-putwin was given.
+if test "${enable_ext_putwin+set}" = set; then
+  enableval="$enable_ext_putwin"
+  with_ext_putwin=$enableval
+else
+  with_ext_putwin=$cf_dft_ext_putwin
+fi;
+echo "$as_me:15434: result: $with_ext_putwin" >&5
+echo "${ECHO_T}$with_ext_putwin" >&6
+if test "x$with_ext_putwin" = xyes ; then
+
+cat >>confdefs.h <<\EOF
+#define NCURSES_EXT_PUTWIN 1
+EOF
+
+fi
+
+echo "$as_me:15444: checking if you want \$NCURSES_NO_PADDING code" >&5
+echo $ECHO_N "checking if you want \$NCURSES_NO_PADDING code... $ECHO_C" >&6
+
+# Check whether --enable-no-padding or --disable-no-padding was given.
+if test "${enable_no_padding+set}" = set; then
+  enableval="$enable_no_padding"
+  with_no_padding=$enableval
+else
+  with_no_padding=$with_ext_funcs
+fi;
+echo "$as_me:15454: result: $with_no_padding" >&5
+echo "${ECHO_T}$with_no_padding" >&6
+test "x$with_no_padding" = xyes &&
+cat >>confdefs.h <<\EOF
+#define NCURSES_NO_PADDING 1
+EOF
+
+###   use option --enable-sigwinch to turn on use of SIGWINCH logic
+echo "$as_me:15462: checking if you want SIGWINCH handler" >&5
+echo $ECHO_N "checking if you want SIGWINCH handler... $ECHO_C" >&6
+
+# Check whether --enable-sigwinch or --disable-sigwinch was given.
+if test "${enable_sigwinch+set}" = set; then
+  enableval="$enable_sigwinch"
+  with_sigwinch=$enableval
+else
+  with_sigwinch=$with_ext_funcs
+fi;
+echo "$as_me:15472: result: $with_sigwinch" >&5
+echo "${ECHO_T}$with_sigwinch" >&6
+test "x$with_sigwinch" = xyes &&
+cat >>confdefs.h <<\EOF
+#define USE_SIGWINCH 1
+EOF
+
+###   use option --enable-tcap-names to allow user to define new capabilities
+echo "$as_me:15480: checking if you want user-definable terminal capabilities like termcap" >&5
+echo $ECHO_N "checking if you want user-definable terminal capabilities like termcap... $ECHO_C" >&6
+
+# Check whether --enable-tcap-names or --disable-tcap-names was given.
+if test "${enable_tcap_names+set}" = set; then
+  enableval="$enable_tcap_names"
+  with_tcap_names=$enableval
+else
+  with_tcap_names=$with_ext_funcs
+fi;
+echo "$as_me:15490: result: $with_tcap_names" >&5
+echo "${ECHO_T}$with_tcap_names" >&6
+NCURSES_XNAMES=0
+test "x$with_tcap_names" = xyes && NCURSES_XNAMES=1
+
+##############################################################################
+
+echo "$as_me:15497: checking if you want to link with the pthread library" >&5
+echo $ECHO_N "checking if you want to link with the pthread library... $ECHO_C" >&6
+
+# Check whether --with-pthread or --without-pthread was given.
+if test "${with_pthread+set}" = set; then
+  withval="$with_pthread"
+  with_pthread=$withval
+else
+  with_pthread=no
+fi;
+echo "$as_me:15507: result: $with_pthread" >&5
+echo "${ECHO_T}$with_pthread" >&6
+
+if test "$with_pthread" != no ; then
+	echo "$as_me:15511: checking for pthread.h" >&5
+echo $ECHO_N "checking for pthread.h... $ECHO_C" >&6
+if test "${ac_cv_header_pthread_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 15517 "configure"
+#include "confdefs.h"
+#include <pthread.h>
+_ACEOF
+if { (eval echo "$as_me:15521: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:15527: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_cv_header_pthread_h=yes
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  ac_cv_header_pthread_h=no
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:15546: result: $ac_cv_header_pthread_h" >&5
+echo "${ECHO_T}$ac_cv_header_pthread_h" >&6
+if test "$ac_cv_header_pthread_h" = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_PTHREADS_H 1
+EOF
+
+	for cf_lib_pthread in pthread c_r
+	do
+	    echo "$as_me:15556: checking if we can link with the $cf_lib_pthread library" >&5
+echo $ECHO_N "checking if we can link with the $cf_lib_pthread library... $ECHO_C" >&6
+	    cf_save_LIBS="$LIBS"
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -l$cf_lib_pthread; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+	    cat >"conftest.$ac_ext" <<_ACEOF
+#line 15577 "configure"
+#include "confdefs.h"
+
+#include <pthread.h>
+
+int
+main (void)
+{
+
+		int rc = pthread_create(0,0,0,0);
+		int r2 = pthread_mutexattr_settype(0, 0);
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:15594: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:15597: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:15600: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:15603: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  with_pthread=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+with_pthread=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+	    LIBS="$cf_save_LIBS"
+	    echo "$as_me:15613: result: $with_pthread" >&5
+echo "${ECHO_T}$with_pthread" >&6
+	    test "$with_pthread" = yes && break
+	done
+
+	if test "$with_pthread" = yes ; then
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -l$cf_lib_pthread; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+cat >>confdefs.h <<\EOF
+#define HAVE_LIBPTHREADS 1
+EOF
+
+	else
+	    { { echo "$as_me:15641: error: Cannot link with pthread library" >&5
+echo "$as_me: error: Cannot link with pthread library" >&2;}
+   { (exit 1); exit 1; }; }
+	fi
+
+fi
+
+fi
+
+if test "x$with_pthread" != xno; then
+	echo "$as_me:15651: checking for pthread_kill" >&5
+echo $ECHO_N "checking for pthread_kill... $ECHO_C" >&6
+if test "${ac_cv_func_pthread_kill+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 15657 "configure"
+#include "confdefs.h"
+#define pthread_kill autoconf_temporary
+#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
+#undef pthread_kill
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char pthread_kill (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_pthread_kill) || defined (__stub___pthread_kill)
+#error found stub for pthread_kill
+#endif
+
+	return pthread_kill ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:15688: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:15691: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:15694: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:15697: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_func_pthread_kill=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_pthread_kill=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:15707: result: $ac_cv_func_pthread_kill" >&5
+echo "${ECHO_T}$ac_cv_func_pthread_kill" >&6
+if test "$ac_cv_func_pthread_kill" = yes; then
+
+		echo "$as_me:15711: checking if you want to allow EINTR in wgetch with pthreads" >&5
+echo $ECHO_N "checking if you want to allow EINTR in wgetch with pthreads... $ECHO_C" >&6
+
+# Check whether --enable-pthreads-eintr or --disable-pthreads-eintr was given.
+if test "${enable_pthreads_eintr+set}" = set; then
+  enableval="$enable_pthreads_eintr"
+  use_pthreads_eintr=$enableval
+else
+  use_pthreads_eintr=no
+fi;
+		echo "$as_me:15721: result: $use_pthreads_eintr" >&5
+echo "${ECHO_T}$use_pthreads_eintr" >&6
+		if test "x$use_pthreads_eintr" = xyes ; then
+
+cat >>confdefs.h <<\EOF
+#define USE_PTHREADS_EINTR 1
+EOF
+
+		fi
+fi
+
+	echo "$as_me:15732: checking if you want to use weak-symbols for pthreads" >&5
+echo $ECHO_N "checking if you want to use weak-symbols for pthreads... $ECHO_C" >&6
+
+# Check whether --enable-weak-symbols or --disable-weak-symbols was given.
+if test "${enable_weak_symbols+set}" = set; then
+  enableval="$enable_weak_symbols"
+  use_weak_symbols=$enableval
+else
+  use_weak_symbols=no
+fi;
+	echo "$as_me:15742: result: $use_weak_symbols" >&5
+echo "${ECHO_T}$use_weak_symbols" >&6
+	if test "x$use_weak_symbols" = xyes ; then
+
+echo "$as_me:15746: checking if $CC supports weak symbols" >&5
+echo $ECHO_N "checking if $CC supports weak symbols... $ECHO_C" >&6
+if test "${cf_cv_weak_symbols+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 15753 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+int
+main (void)
+{
+
+#if defined(__GNUC__)
+#  if defined __USE_ISOC99
+#    define _cat_pragma(exp)	_Pragma(#exp)
+#    define _weak_pragma(exp)	_cat_pragma(weak name)
+#  else
+#    define _weak_pragma(exp)
+#  endif
+#  define _declare(name)	__extension__ extern __typeof__(name) name
+#  define weak_symbol(name)	_weak_pragma(name) _declare(name) __attribute__((weak))
+#endif
+
+weak_symbol(fopen);
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:15779: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:15782: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:15785: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:15788: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_weak_symbols=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_weak_symbols=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:15799: result: $cf_cv_weak_symbols" >&5
+echo "${ECHO_T}$cf_cv_weak_symbols" >&6
+
+	else
+		cf_cv_weak_symbols=no
+	fi
+
+	if test "x$cf_cv_weak_symbols" = xyes ; then
+
+cat >>confdefs.h <<\EOF
+#define USE_WEAK_SYMBOLS 1
+EOF
+
+	fi
+fi
+
+PTHREAD=
+if test "x$with_pthread" = "xyes" ; then
+
+cat >>confdefs.h <<\EOF
+#define USE_PTHREADS 1
+EOF
+
+	enable_reentrant=yes
+	if test "x$cf_cv_weak_symbols" = xyes ; then
+		PTHREAD=-lpthread
+
+cf_add_libs="$PRIVATE_LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lpthread; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+PRIVATE_LIBS="$cf_add_libs"
+
+	fi
+fi
+
+# Reentrant code has to be opaque; there's little advantage to making ncurses
+# opaque outside of that, so there is no --enable-opaque option.  We can use
+# this option without --with-pthreads, but this will be always set for
+# pthreads.
+echo "$as_me:15849: checking if you want reentrant code" >&5
+echo $ECHO_N "checking if you want reentrant code... $ECHO_C" >&6
+
+# Check whether --enable-reentrant or --disable-reentrant was given.
+if test "${enable_reentrant+set}" = set; then
+  enableval="$enable_reentrant"
+  with_reentrant=$enableval
+else
+  with_reentrant=no
+fi;
+echo "$as_me:15859: result: $with_reentrant" >&5
+echo "${ECHO_T}$with_reentrant" >&6
+if test "x$with_reentrant" = xyes ; then
+	cf_cv_enable_reentrant=1
+	cf_cv_enable_opaque="NCURSES_INTERNALS"
+	NCURSES_SIZE_T=int
+	if test "x$cf_cv_weak_symbols" = xyes ; then
+
+# remove pthread library from $LIBS
+LIBS=`echo "$LIBS" | sed -e 's/-lpthread[ 	]//g' -e 's/-lpthread$//'`
+
+cf_add_libs="$TEST_LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lpthread; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+TEST_LIBS="$cf_add_libs"
+
+cf_add_libs="$TEST_LIBS2"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lpthread; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+TEST_LIBS2="$cf_add_libs"
+
+cf_add_libs="$PRIVATE_LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lpthread; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+PRIVATE_LIBS="$cf_add_libs"
+
+	else
+		# when not using weak symbols but with_reentrant,
+		# add 't' to the library suffix on all platforms
+		# except cygwin, where we only do that if ALSO
+		# compiling with full thread support.
+		case "$host" in
+		(*cygwin* | *msys*)
+			if test "$with_pthread" = "yes" ; then
+				if test "x$disable_lib_suffixes" = "xno" ; then
+					LIB_SUFFIX="t${LIB_SUFFIX}"
+				fi
+			fi ;;
+		(*)
+			if test "x$disable_lib_suffixes" = "xno" ; then
+				LIB_SUFFIX="t${LIB_SUFFIX}"
+			fi
+			;;
+		esac
+	fi
+
+cat >>confdefs.h <<\EOF
+#define USE_REENTRANT 1
+EOF
+
+if test "${with_abi_version+set}" != set; then
+	case "$cf_cv_rel_version" in
+	(5.*)
+		cf_cv_rel_version=6.0
+		cf_cv_abi_version=6
+		{ echo "$as_me:15947: WARNING: overriding ABI version to $cf_cv_abi_version" >&5
+echo "$as_me: WARNING: overriding ABI version to $cf_cv_abi_version" >&2;}
+		;;
+	esac
+fi
+
+else
+	cf_cv_enable_reentrant=0
+	cf_cv_enable_opaque="NCURSES_OPAQUE"
+	NCURSES_SIZE_T=$cf_dft_ordinate_type
+fi
+
+echo "$as_me:15959: checking if you want opaque curses-library structures" >&5
+echo $ECHO_N "checking if you want opaque curses-library structures... $ECHO_C" >&6
+
+# Check whether --enable-opaque-curses or --disable-opaque-curses was given.
+if test "${enable_opaque_curses+set}" = set; then
+  enableval="$enable_opaque_curses"
+  test "$enableval" != yes && enableval=no
+	if test "$enableval" != "no" ; then
+    enable_opaque_curses=yes
+	else
+
+	 test "$cf_cv_enable_reentrant" = 1 && enable_opaque_curses=yes
+	 test "$cf_cv_enable_reentrant" = 1 || enable_opaque_curses=$cf_dft_opaque_curses
+
+	fi
+else
+  enableval=no
+
+	 test "$cf_cv_enable_reentrant" = 1 && enable_opaque_curses=yes
+	 test "$cf_cv_enable_reentrant" = 1 || enable_opaque_curses=$cf_dft_opaque_curses
+
+fi;
+echo "$as_me:15981: result: $enable_opaque_curses" >&5
+echo "${ECHO_T}$enable_opaque_curses" >&6
+
+test "$cf_cv_enable_reentrant" = 1 && \
+test "$enable_opaque_curses" = no && \
+{ { echo "$as_me:15986: error: reentrant configuration requires opaque library" >&5
+echo "$as_me: error: reentrant configuration requires opaque library" >&2;}
+   { (exit 1); exit 1; }; }
+
+echo "$as_me:15990: checking if you want opaque form-library structures" >&5
+echo $ECHO_N "checking if you want opaque form-library structures... $ECHO_C" >&6
+
+# Check whether --enable-opaque-form or --disable-opaque-form was given.
+if test "${enable_opaque_form+set}" = set; then
+  enableval="$enable_opaque_form"
+  enable_opaque_form=yes
+else
+  enable_opaque_form=no
+fi;
+echo "$as_me:16000: result: $enable_opaque_form" >&5
+echo "${ECHO_T}$enable_opaque_form" >&6
+
+echo "$as_me:16003: checking if you want opaque menu-library structures" >&5
+echo $ECHO_N "checking if you want opaque menu-library structures... $ECHO_C" >&6
+
+# Check whether --enable-opaque-menu or --disable-opaque-menu was given.
+if test "${enable_opaque_menu+set}" = set; then
+  enableval="$enable_opaque_menu"
+  enable_opaque_menu=yes
+else
+  enable_opaque_menu=no
+fi;
+echo "$as_me:16013: result: $enable_opaque_menu" >&5
+echo "${ECHO_T}$enable_opaque_menu" >&6
+
+echo "$as_me:16016: checking if you want opaque panel-library structures" >&5
+echo $ECHO_N "checking if you want opaque panel-library structures... $ECHO_C" >&6
+
+# Check whether --enable-opaque-panel or --disable-opaque-panel was given.
+if test "${enable_opaque_panel+set}" = set; then
+  enableval="$enable_opaque_panel"
+  enable_opaque_panel=yes
+else
+  enable_opaque_panel=no
+fi;
+echo "$as_me:16026: result: $enable_opaque_panel" >&5
+echo "${ECHO_T}$enable_opaque_panel" >&6
+
+NCURSES_OPAQUE=0;		test "$enable_opaque_curses" = yes && NCURSES_OPAQUE=1
+NCURSES_OPAQUE_FORM=0;	test "$enable_opaque_form"   = yes && NCURSES_OPAQUE_FORM=1
+NCURSES_OPAQUE_MENU=0;	test "$enable_opaque_menu"   = yes && NCURSES_OPAQUE_MENU=1
+NCURSES_OPAQUE_PANEL=0;	test "$enable_opaque_panel"  = yes && NCURSES_OPAQUE_PANEL=1
+
+### Allow using a different wrap-prefix
+if test "$cf_cv_enable_reentrant" != 0 || test "$BROKEN_LINKER" = 1 ; then
+	echo "$as_me:16036: checking for prefix used to wrap public variables" >&5
+echo $ECHO_N "checking for prefix used to wrap public variables... $ECHO_C" >&6
+
+# Check whether --with-wrap-prefix or --without-wrap-prefix was given.
+if test "${with_wrap_prefix+set}" = set; then
+  withval="$with_wrap_prefix"
+  NCURSES_WRAP_PREFIX=$withval
+else
+  NCURSES_WRAP_PREFIX=_nc_
+fi;
+	echo "$as_me:16046: result: $NCURSES_WRAP_PREFIX" >&5
+echo "${ECHO_T}$NCURSES_WRAP_PREFIX" >&6
+else
+	NCURSES_WRAP_PREFIX=_nc_
+fi
+
+cat >>confdefs.h <<EOF
+#define NCURSES_WRAP_PREFIX "$NCURSES_WRAP_PREFIX"
+EOF
+
+###############################################################################
+# These options are relatively safe to experiment with.
+
+echo "$as_me:16059: checking if you want all development code" >&5
+echo $ECHO_N "checking if you want all development code... $ECHO_C" >&6
+
+# Check whether --with-develop or --without-develop was given.
+if test "${with_develop+set}" = set; then
+  withval="$with_develop"
+  with_develop=$withval
+else
+  with_develop=no
+fi;
+echo "$as_me:16069: result: $with_develop" >&5
+echo "${ECHO_T}$with_develop" >&6
+
+###   use option --enable-hard-tabs to turn on use of hard-tabs optimize
+echo "$as_me:16073: checking if you want hard-tabs code" >&5
+echo $ECHO_N "checking if you want hard-tabs code... $ECHO_C" >&6
+
+# Check whether --enable-hard-tabs or --disable-hard-tabs was given.
+if test "${enable_hard_tabs+set}" = set; then
+  enableval="$enable_hard_tabs"
+
+else
+  enable_hard_tabs=$with_develop
+fi;
+echo "$as_me:16083: result: $enable_hard_tabs" >&5
+echo "${ECHO_T}$enable_hard_tabs" >&6
+test "x$enable_hard_tabs" = xyes &&
+cat >>confdefs.h <<\EOF
+#define USE_HARD_TABS 1
+EOF
+
+###   use option --enable-xmc-glitch to turn on use of magic-cookie optimize
+echo "$as_me:16091: checking if you want limited support for xmc" >&5
+echo $ECHO_N "checking if you want limited support for xmc... $ECHO_C" >&6
+
+# Check whether --enable-xmc-glitch or --disable-xmc-glitch was given.
+if test "${enable_xmc_glitch+set}" = set; then
+  enableval="$enable_xmc_glitch"
+
+else
+  enable_xmc_glitch=$with_develop
+fi;
+echo "$as_me:16101: result: $enable_xmc_glitch" >&5
+echo "${ECHO_T}$enable_xmc_glitch" >&6
+test "x$enable_xmc_glitch" = xyes &&
+cat >>confdefs.h <<\EOF
+#define USE_XMC_SUPPORT 1
+EOF
+
+###############################################################################
+# These are just experimental, probably should not be in a package:
+
+echo "$as_me:16111: checking if you do not want to assume colors are white-on-black" >&5
+echo $ECHO_N "checking if you do not want to assume colors are white-on-black... $ECHO_C" >&6
+
+# Check whether --enable-assumed-color or --disable-assumed-color was given.
+if test "${enable_assumed_color+set}" = set; then
+  enableval="$enable_assumed_color"
+  with_assumed_color=$enableval
+else
+  with_assumed_color=yes
+fi;
+echo "$as_me:16121: result: $with_assumed_color" >&5
+echo "${ECHO_T}$with_assumed_color" >&6
+test "x$with_assumed_color" = xyes &&
+cat >>confdefs.h <<\EOF
+#define USE_ASSUMED_COLOR 1
+EOF
+
+###   use option --enable-hashmap to turn on use of hashmap scrolling logic
+echo "$as_me:16129: checking if you want hashmap scrolling-optimization code" >&5
+echo $ECHO_N "checking if you want hashmap scrolling-optimization code... $ECHO_C" >&6
+
+# Check whether --enable-hashmap or --disable-hashmap was given.
+if test "${enable_hashmap+set}" = set; then
+  enableval="$enable_hashmap"
+  with_hashmap=$enableval
+else
+  with_hashmap=yes
+fi;
+echo "$as_me:16139: result: $with_hashmap" >&5
+echo "${ECHO_T}$with_hashmap" >&6
+test "x$with_hashmap" = xyes &&
+cat >>confdefs.h <<\EOF
+#define USE_HASHMAP 1
+EOF
+
+###   use option --enable-colorfgbg to turn on use of $COLORFGBG environment
+echo "$as_me:16147: checking if you want colorfgbg code" >&5
+echo $ECHO_N "checking if you want colorfgbg code... $ECHO_C" >&6
+
+# Check whether --enable-colorfgbg or --disable-colorfgbg was given.
+if test "${enable_colorfgbg+set}" = set; then
+  enableval="$enable_colorfgbg"
+  with_colorfgbg=$enableval
+else
+  with_colorfgbg=no
+fi;
+echo "$as_me:16157: result: $with_colorfgbg" >&5
+echo "${ECHO_T}$with_colorfgbg" >&6
+test "x$with_colorfgbg" = xyes &&
+cat >>confdefs.h <<\EOF
+#define USE_COLORFGBG 1
+EOF
+
+###   use option --enable-fvisibility to turn on use of gcc-specific feature
+echo "$as_me:16165: checking if you want to use gcc -fvisibility option" >&5
+echo $ECHO_N "checking if you want to use gcc -fvisibility option... $ECHO_C" >&6
+
+# Check whether --enable-fvisibility or --disable-fvisibility was given.
+if test "${enable_fvisibility+set}" = set; then
+  enableval="$enable_fvisibility"
+  cf_with_fvisibility=$enableval
+else
+  cf_with_fvisibility=no
+fi;
+echo "$as_me:16175: result: $cf_with_fvisibility" >&5
+echo "${ECHO_T}$cf_with_fvisibility" >&6
+
+NCURSES_IMPEXP=
+NCURSES_CXX_IMPEXP=
+if test "x$cf_with_fvisibility" = xyes; then
+
+echo "$as_me:16182: checking if $CC -fvisibility=hidden option works" >&5
+echo $ECHO_N "checking if $CC -fvisibility=hidden option works... $ECHO_C" >&6
+if test "${cf_cv_fvisibility_hidden+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+    cf_save_cflags="$CFLAGS"
+    CFLAGS="$CFLAGS -fvisibility=hidden"
+    cat >"conftest.$ac_ext" <<_ACEOF
+#line 16191 "configure"
+#include "confdefs.h"
+
+__attribute__ ((visibility("default"))) int somefunc() {return 42;}
+
+int
+main (void)
+{
+
+	if (somefunc()) return 1;
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:16207: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:16210: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:16213: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:16216: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_fvisibility_hidden=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_fvisibility_hidden=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+    CFLAGS=$cf_save_cflags
+
+fi
+echo "$as_me:16228: result: $cf_cv_fvisibility_hidden" >&5
+echo "${ECHO_T}$cf_cv_fvisibility_hidden" >&6
+
+	if test "x$cf_cv_fvisibility_hidden" = xyes
+	then
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in -fvisibility=hidden
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+		NCURSES_IMPEXP="__attribute__ ((visibility(\"default\")))"
+	fi
+	if test -n "$CXX"
+	then
+		ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
+ac_link='$CXX -o "conftest$ac_exeext" $CXXFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+ac_main_return="return"
+
+echo "$as_me:16343: checking if $CXX -fvisibility=hidden option works" >&5
+echo $ECHO_N "checking if $CXX -fvisibility=hidden option works... $ECHO_C" >&6
+if test "${cf_cv_fvisibility_hidden2+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+    cf_save_cflags="$CXXFLAGS"
+    CXXFLAGS="$CXXFLAGS -fvisibility=hidden"
+    cat >"conftest.$ac_ext" <<_ACEOF
+#line 16352 "configure"
+#include "confdefs.h"
+
+__attribute__ ((visibility("default"))) int somefunc() {return 42;}
+
+int
+main (void)
+{
+
+	if (somefunc()) return 1;
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:16368: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:16371: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:16374: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:16377: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_fvisibility_hidden2=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_fvisibility_hidden2=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+    CXXFLAGS=$cf_save_cflags
+
+fi
+echo "$as_me:16389: result: $cf_cv_fvisibility_hidden2" >&5
+echo "${ECHO_T}$cf_cv_fvisibility_hidden2" >&6
+
+		if test "x$cf_cv_fvisibility_hidden2" = xyes
+		then
+
+cf_save_CXXFLAGS="$CFLAGS"
+CFLAGS="$CXXFLAGS"
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in -fvisibility=hidden
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+CXXFLAGS="$CFLAGS"
+CFLAGS="$cf_save_CXXFLAGS"
+
+			NCURSES_CXX_IMPEXP="__attribute__ ((visibility(\"default\")))"
+		fi
+		ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
+ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_main_return="return"
+
+	fi
+fi
+
+###   use option --enable-interop to turn on use of bindings used for interop
+echo "$as_me:16512: checking if you want interop bindings" >&5
+echo $ECHO_N "checking if you want interop bindings... $ECHO_C" >&6
+
+# Check whether --enable-interop or --disable-interop was given.
+if test "${enable_interop+set}" = set; then
+  enableval="$enable_interop"
+  with_exp_interop=$enableval
+else
+  with_exp_interop=$cf_dft_interop
+fi;
+echo "$as_me:16522: result: $with_exp_interop" >&5
+echo "${ECHO_T}$with_exp_interop" >&6
+
+NCURSES_INTEROP_FUNCS=0
+test "x$with_exp_interop" = xyes && NCURSES_INTEROP_FUNCS=1
+
+echo "$as_me:16528: checking if you want experimental safe-sprintf code" >&5
+echo $ECHO_N "checking if you want experimental safe-sprintf code... $ECHO_C" >&6
+
+# Check whether --enable-safe-sprintf or --disable-safe-sprintf was given.
+if test "${enable_safe_sprintf+set}" = set; then
+  enableval="$enable_safe_sprintf"
+  with_safe_sprintf=$enableval
+else
+  with_safe_sprintf=no
+fi;
+echo "$as_me:16538: result: $with_safe_sprintf" >&5
+echo "${ECHO_T}$with_safe_sprintf" >&6
+
+###   use option --disable-scroll-hints to turn off use of scroll-hints scrolling logic
+# when hashmap is used scroll hints are useless
+if test "$with_hashmap" = no ; then
+echo "$as_me:16544: checking if you want to experiment without scrolling-hints code" >&5
+echo $ECHO_N "checking if you want to experiment without scrolling-hints code... $ECHO_C" >&6
+
+# Check whether --enable-scroll-hints or --disable-scroll-hints was given.
+if test "${enable_scroll_hints+set}" = set; then
+  enableval="$enable_scroll_hints"
+  with_scroll_hints=$enableval
+else
+  with_scroll_hints=yes
+fi;
+echo "$as_me:16554: result: $with_scroll_hints" >&5
+echo "${ECHO_T}$with_scroll_hints" >&6
+test "x$with_scroll_hints" = xyes &&
+cat >>confdefs.h <<\EOF
+#define USE_SCROLL_HINTS 1
+EOF
+
+fi
+
+echo "$as_me:16563: checking if you want wgetch-events code" >&5
+echo $ECHO_N "checking if you want wgetch-events code... $ECHO_C" >&6
+
+# Check whether --enable-wgetch-events or --disable-wgetch-events was given.
+if test "${enable_wgetch_events+set}" = set; then
+  enableval="$enable_wgetch_events"
+  with_wgetch_events=$enableval
+else
+  with_wgetch_events=no
+fi;
+echo "$as_me:16573: result: $with_wgetch_events" >&5
+echo "${ECHO_T}$with_wgetch_events" >&6
+if test "x$with_wgetch_events" = xyes ; then
+
+cat >>confdefs.h <<\EOF
+#define NCURSES_WGETCH_EVENTS 1
+EOF
+
+	NCURSES_WGETCH_EVENTS=1
+else
+	NCURSES_WGETCH_EVENTS=0
+fi
+
+case "$cf_cv_system_name" in
+(*mingw32*|*mingw64*|*-msvc*)
+	echo "$as_me:16588: checking if you want experimental-Windows driver" >&5
+echo $ECHO_N "checking if you want experimental-Windows driver... $ECHO_C" >&6
+
+# Check whether --enable-exp-win32 or --disable-exp-win32 was given.
+if test "${enable_exp_win32+set}" = set; then
+  enableval="$enable_exp_win32"
+  with_exp_win32=$enableval
+else
+  with_exp_win32=no
+fi;
+	echo "$as_me:16598: result: $with_exp_win32" >&5
+echo "${ECHO_T}$with_exp_win32" >&6
+	if test "x$with_exp_win32" = xyes
+	then
+
+cat >>confdefs.h <<\EOF
+#define EXP_WIN32_DRIVER 1
+EOF
+
+		EXP_WIN32_DRIVER=1
+		INTERNALS_HDR='$(INCDIR)/nc_win32.h'
+	else
+		INTERNALS_HDR='$(INCDIR)/nc_mingw.h'
+		EXP_WIN32_DRIVER=0
+	fi
+	;;
+(*)
+	EXP_WIN32_DRIVER=0
+	INTERNALS_HDR=
+	;;
+esac
+
+###############################################################################
+
+###	use option --disable-echo to suppress full display compiling commands
+
+echo "$as_me:16624: checking if you want to see long compiling messages" >&5
+echo $ECHO_N "checking if you want to see long compiling messages... $ECHO_C" >&6
+
+# Check whether --enable-echo or --disable-echo was given.
+if test "${enable_echo+set}" = set; then
+  enableval="$enable_echo"
+  test "$enableval" != no && enableval=yes
+	if test "$enableval" != "yes" ; then
+
+	ECHO_LT='--silent'
+	ECHO_LD='@echo linking $@;'
+	RULE_CC='@echo compiling $<'
+	SHOW_CC='@echo compiling $@'
+	ECHO_CC='@'
+
+	else
+
+	ECHO_LT=''
+	ECHO_LD=''
+	RULE_CC=''
+	SHOW_CC=''
+	ECHO_CC=''
+
+	fi
+else
+  enableval=yes
+
+	ECHO_LT=''
+	ECHO_LD=''
+	RULE_CC=''
+	SHOW_CC=''
+	ECHO_CC=''
+
+fi;
+echo "$as_me:16658: result: $enableval" >&5
+echo "${ECHO_T}$enableval" >&6
+
+if test "x$enable_echo" = xyes; then
+	ECHO_LINK=
+else
+	ECHO_LINK='@ echo linking $@ ... ;'
+	test -n "$LIBTOOL" && LIBTOOL="$LIBTOOL --silent"
+	test -n "$LIBTOOL_CXX" && LIBTOOL_CXX="$LIBTOOL_CXX --silent"
+fi
+
+# --disable-stripping is used for debugging
+
+echo "$as_me:16671: checking if you want to install stripped executables" >&5
+echo $ECHO_N "checking if you want to install stripped executables... $ECHO_C" >&6
+
+# Check whether --enable-stripping or --disable-stripping was given.
+if test "${enable_stripping+set}" = set; then
+  enableval="$enable_stripping"
+  test "$enableval" != no && enableval=yes
+	if test "$enableval" != "yes" ; then
+    enable_stripping=no
+	else
+		enable_stripping=yes
+	fi
+else
+  enableval=yes
+	enable_stripping=yes
+
+fi;
+echo "$as_me:16688: result: $enable_stripping" >&5
+echo "${ECHO_T}$enable_stripping" >&6
+
+if test "$enable_stripping" = yes
+then
+	INSTALL_OPT_S="-s"
+else
+	INSTALL_OPT_S=
+fi
+
+: "${INSTALL:=install}"
+echo "$as_me:16699: checking if install accepts -p option" >&5
+echo $ECHO_N "checking if install accepts -p option... $ECHO_C" >&6
+if test "${cf_cv_install_p+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	rm -rf ./conftest*
+	date >conftest.in
+	mkdir conftest.out
+	sleep 3
+	if $INSTALL -p conftest.in conftest.out 2>/dev/null
+	then
+		if test -f conftest.out/conftest.in
+		then
+			test conftest.in -nt conftest.out/conftest.in 2>conftest.err && \
+			test conftest.out/conftest.in -nt conftest.in 2>conftest.err
+			if test -s conftest.err
+			then
+				cf_cv_install_p=no
+			else
+				cf_cv_install_p=yes
+			fi
+		else
+			cf_cv_install_p=no
+		fi
+	else
+		cf_cv_install_p=no
+	fi
+	rm -rf ./conftest*
+
+fi
+echo "$as_me:16730: result: $cf_cv_install_p" >&5
+echo "${ECHO_T}$cf_cv_install_p" >&6
+
+echo "$as_me:16733: checking if install needs to be told about ownership" >&5
+echo $ECHO_N "checking if install needs to be told about ownership... $ECHO_C" >&6
+case `$ac_config_guess` in
+(*minix)
+	with_install_o=yes
+	;;
+(*)
+	with_install_o=no
+	;;
+esac
+
+echo "$as_me:16744: result: $with_install_o" >&5
+echo "${ECHO_T}$with_install_o" >&6
+if test "x$with_install_o" = xyes
+then
+	INSTALL_OPT_O="`id root|sed -e 's/uid=[0-9]*(/ -o /' -e 's/gid=[0-9]*(/ -g /' -e 's/ [^=[:space:]][^=[:space:]]*=.*/ /' -e 's/)//g'`"
+else
+	INSTALL_OPT_O=
+fi
+
+# If we're avoiding relinking of shared libraries during install, that is to
+# avoid modifying the build-tree.  For the same reason, avoid doing ranlib if
+# the install program has "-p" (for preserving timestamps).
+cf_cv_do_reranlib=yes
+if test "x$cf_cv_install_p" = xyes
+then
+	if test "x$cf_cv_do_relink" != xyes
+	then
+		cf_cv_do_reranlib=no
+		INSTALL_OPT_P="-p"
+		INSTALL_LIB="$INSTALL_LIB $INSTALL_OPT_P"
+	fi
+fi
+
+###	use option --enable-warnings to turn on all gcc warnings
+
+echo "$as_me:16769: checking if you want to use C11 _Noreturn feature" >&5
+echo $ECHO_N "checking if you want to use C11 _Noreturn feature... $ECHO_C" >&6
+
+# Check whether --enable-stdnoreturn or --disable-stdnoreturn was given.
+if test "${enable_stdnoreturn+set}" = set; then
+  enableval="$enable_stdnoreturn"
+  test "$enableval" != yes && enableval=no
+	if test "$enableval" != "no" ; then
+    enable_stdnoreturn=yes
+	else
+		enable_stdnoreturn=no
+	fi
+else
+  enableval=no
+	enable_stdnoreturn=no
+
+fi;
+echo "$as_me:16786: result: $enable_stdnoreturn" >&5
+echo "${ECHO_T}$enable_stdnoreturn" >&6
+
+if test $enable_stdnoreturn = yes; then
+echo "$as_me:16790: checking for C11 _Noreturn feature" >&5
+echo $ECHO_N "checking for C11 _Noreturn feature... $ECHO_C" >&6
+if test "${cf_cv_c11_noreturn+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 16796 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdnoreturn.h>
+static _Noreturn void giveup(void) { exit(0); }
+
+int
+main (void)
+{
+if (feof(stdin)) giveup()
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:16813: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:16816: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:16819: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:16822: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_c11_noreturn=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_c11_noreturn=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:16833: result: $cf_cv_c11_noreturn" >&5
+echo "${ECHO_T}$cf_cv_c11_noreturn" >&6
+else
+	cf_cv_c11_noreturn=no,
+fi
+
+if test "$cf_cv_c11_noreturn" = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_STDNORETURN_H 1
+EOF
+
+cat >>confdefs.h <<EOF
+#define STDC_NORETURN _Noreturn
+EOF
+
+	HAVE_STDNORETURN_H=1
+else
+	HAVE_STDNORETURN_H=0
+fi
+
+if test "$GCC" = yes || test "$GXX" = yes
+then
+
+if test "$GCC" = yes || test "$GXX" = yes
+then
+	case $CFLAGS in
+	(*-Werror=*)
+		cf_temp_flags=
+		for cf_temp_scan in $CFLAGS
+		do
+			case "x$cf_temp_scan" in
+			(x-Werror=format*)
+
+	test -n "$cf_temp_flags" && cf_temp_flags="$cf_temp_flags "
+	cf_temp_flags="${cf_temp_flags}$cf_temp_scan"
+
+				;;
+			(x-Werror=*)
+
+	test -n "$EXTRA_CFLAGS" && EXTRA_CFLAGS="$EXTRA_CFLAGS "
+	EXTRA_CFLAGS="${EXTRA_CFLAGS}$cf_temp_scan"
+
+				;;
+			(*)
+
+	test -n "$cf_temp_flags" && cf_temp_flags="$cf_temp_flags "
+	cf_temp_flags="${cf_temp_flags}$cf_temp_scan"
+
+				;;
+			esac
+		done
+		if test "x$CFLAGS" != "x$cf_temp_flags"
+		then
+			test -n "$verbose" && echo "	repairing CFLAGS: $CFLAGS" 1>&6
+
+echo "${as_me:-configure}:16889: testing repairing CFLAGS: $CFLAGS ..." 1>&5
+
+			CFLAGS="$cf_temp_flags"
+			test -n "$verbose" && echo "	... fixed $CFLAGS" 1>&6
+
+echo "${as_me:-configure}:16894: testing ... fixed $CFLAGS ..." 1>&5
+
+			test -n "$verbose" && echo "	... extra $EXTRA_CFLAGS" 1>&6
+
+echo "${as_me:-configure}:16898: testing ... extra $EXTRA_CFLAGS ..." 1>&5
+
+		fi
+		;;
+	esac
+fi
+
+if test "$GCC" = yes || test "$GXX" = yes
+then
+	case $CPPFLAGS in
+	(*-Werror=*)
+		cf_temp_flags=
+		for cf_temp_scan in $CPPFLAGS
+		do
+			case "x$cf_temp_scan" in
+			(x-Werror=format*)
+
+	test -n "$cf_temp_flags" && cf_temp_flags="$cf_temp_flags "
+	cf_temp_flags="${cf_temp_flags}$cf_temp_scan"
+
+				;;
+			(x-Werror=*)
+
+	test -n "$EXTRA_CFLAGS" && EXTRA_CFLAGS="$EXTRA_CFLAGS "
+	EXTRA_CFLAGS="${EXTRA_CFLAGS}$cf_temp_scan"
+
+				;;
+			(*)
+
+	test -n "$cf_temp_flags" && cf_temp_flags="$cf_temp_flags "
+	cf_temp_flags="${cf_temp_flags}$cf_temp_scan"
+
+				;;
+			esac
+		done
+		if test "x$CPPFLAGS" != "x$cf_temp_flags"
+		then
+			test -n "$verbose" && echo "	repairing CPPFLAGS: $CPPFLAGS" 1>&6
+
+echo "${as_me:-configure}:16937: testing repairing CPPFLAGS: $CPPFLAGS ..." 1>&5
+
+			CPPFLAGS="$cf_temp_flags"
+			test -n "$verbose" && echo "	... fixed $CPPFLAGS" 1>&6
+
+echo "${as_me:-configure}:16942: testing ... fixed $CPPFLAGS ..." 1>&5
+
+			test -n "$verbose" && echo "	... extra $EXTRA_CFLAGS" 1>&6
+
+echo "${as_me:-configure}:16946: testing ... extra $EXTRA_CFLAGS ..." 1>&5
+
+		fi
+		;;
+	esac
+fi
+
+if test "$GCC" = yes || test "$GXX" = yes
+then
+	case $LDFLAGS in
+	(*-Werror=*)
+		cf_temp_flags=
+		for cf_temp_scan in $LDFLAGS
+		do
+			case "x$cf_temp_scan" in
+			(x-Werror=format*)
+
+	test -n "$cf_temp_flags" && cf_temp_flags="$cf_temp_flags "
+	cf_temp_flags="${cf_temp_flags}$cf_temp_scan"
+
+				;;
+			(x-Werror=*)
+
+	test -n "$EXTRA_CFLAGS" && EXTRA_CFLAGS="$EXTRA_CFLAGS "
+	EXTRA_CFLAGS="${EXTRA_CFLAGS}$cf_temp_scan"
+
+				;;
+			(*)
+
+	test -n "$cf_temp_flags" && cf_temp_flags="$cf_temp_flags "
+	cf_temp_flags="${cf_temp_flags}$cf_temp_scan"
+
+				;;
+			esac
+		done
+		if test "x$LDFLAGS" != "x$cf_temp_flags"
+		then
+			test -n "$verbose" && echo "	repairing LDFLAGS: $LDFLAGS" 1>&6
+
+echo "${as_me:-configure}:16985: testing repairing LDFLAGS: $LDFLAGS ..." 1>&5
+
+			LDFLAGS="$cf_temp_flags"
+			test -n "$verbose" && echo "	... fixed $LDFLAGS" 1>&6
+
+echo "${as_me:-configure}:16990: testing ... fixed $LDFLAGS ..." 1>&5
+
+			test -n "$verbose" && echo "	... extra $EXTRA_CFLAGS" 1>&6
+
+echo "${as_me:-configure}:16994: testing ... extra $EXTRA_CFLAGS ..." 1>&5
+
+		fi
+		;;
+	esac
+fi
+
+echo "$as_me:17001: checking if you want to turn on gcc warnings" >&5
+echo $ECHO_N "checking if you want to turn on gcc warnings... $ECHO_C" >&6
+
+# Check whether --enable-warnings or --disable-warnings was given.
+if test "${enable_warnings+set}" = set; then
+  enableval="$enable_warnings"
+  test "$enableval" != yes && enableval=no
+	if test "$enableval" != "no" ; then
+    enable_warnings=yes
+	else
+		enable_warnings=no
+	fi
+else
+  enableval=no
+	enable_warnings=no
+
+fi;
+echo "$as_me:17018: result: $enable_warnings" >&5
+echo "${ECHO_T}$enable_warnings" >&6
+if test "$enable_warnings" = "yes"
+then
+
+if test "x$have_x" = xyes; then
+
+cf_save_LIBS_CF_CONST_X_STRING="$LIBS"
+cf_save_CFLAGS_CF_CONST_X_STRING="$CFLAGS"
+cf_save_CPPFLAGS_CF_CONST_X_STRING="$CPPFLAGS"
+LIBS="$LIBS ${X_PRE_LIBS} ${X_LIBS} ${X_EXTRA_LIBS}"
+for cf_X_CFLAGS in $X_CFLAGS
+do
+	case "x$cf_X_CFLAGS" in
+	x-[IUD]*)
+		CPPFLAGS="$CPPFLAGS $cf_X_CFLAGS"
+		;;
+	*)
+		CFLAGS="$CFLAGS $cf_X_CFLAGS"
+		;;
+	esac
+done
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 17042 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <X11/Intrinsic.h>
+
+int
+main (void)
+{
+String foo = malloc(1); free((void*)foo)
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:17057: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:17060: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:17063: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:17066: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+echo "$as_me:17069: checking for X11/Xt const-feature" >&5
+echo $ECHO_N "checking for X11/Xt const-feature... $ECHO_C" >&6
+if test "${cf_cv_const_x_string+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 17076 "configure"
+#include "confdefs.h"
+
+#define _CONST_X_STRING	/* X11R7.8 (perhaps) */
+#undef  XTSTRINGDEFINES	/* X11R5 and later */
+#include <stdlib.h>
+#include <X11/Intrinsic.h>
+
+int
+main (void)
+{
+String foo = malloc(1); *foo = 0
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:17093: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:17096: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:17099: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:17102: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+			cf_cv_const_x_string=no
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+			cf_cv_const_x_string=yes
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:17117: result: $cf_cv_const_x_string" >&5
+echo "${ECHO_T}$cf_cv_const_x_string" >&6
+
+LIBS="$cf_save_LIBS_CF_CONST_X_STRING"
+CFLAGS="$cf_save_CFLAGS_CF_CONST_X_STRING"
+CPPFLAGS="$cf_save_CPPFLAGS_CF_CONST_X_STRING"
+
+case "$cf_cv_const_x_string" in
+(no)
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-DXTSTRINGDEFINES"
+
+	;;
+(*)
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-D_CONST_X_STRING"
+
+	;;
+esac
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ fi
+cat > "conftest.$ac_ext" <<EOF
+#line 17146 "${as_me:-configure}"
+int main(int argc, char *argv[]) { return (argv[argc-1] == 0) ; }
+EOF
+if test "$INTEL_COMPILER" = yes
+then
+# The "-wdXXX" options suppress warnings:
+# remark #1419: external declaration in primary source file
+# remark #1683: explicit conversion of a 64-bit integral type to a smaller integral type (potential portability problem)
+# remark #1684: conversion from pointer to same-sized integral type (potential portability problem)
+# remark #193: zero used for undefined preprocessing identifier
+# remark #593: variable "curs_sb_left_arrow" was set but never used
+# remark #810: conversion from "int" to "Dimension={unsigned short}" may lose significant bits
+# remark #869: parameter "tw" was never referenced
+# remark #981: operands are evaluated in unspecified order
+# warning #279: controlling expression is constant
+
+	{ echo "$as_me:17162: checking for $CC warning options..." >&5
+echo "$as_me: checking for $CC warning options..." >&6;}
+	cf_save_CFLAGS="$CFLAGS"
+	EXTRA_CFLAGS="$EXTRA_CFLAGS -Wall"
+	for cf_opt in \
+		wd1419 \
+		wd1683 \
+		wd1684 \
+		wd193 \
+		wd593 \
+		wd279 \
+		wd810 \
+		wd869 \
+		wd981
+	do
+		CFLAGS="$cf_save_CFLAGS $EXTRA_CFLAGS -$cf_opt"
+		if { (eval echo "$as_me:17178: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:17181: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; then
+			test -n "$verbose" && echo "$as_me:17183: result: ... -$cf_opt" >&5
+echo "${ECHO_T}... -$cf_opt" >&6
+			EXTRA_CFLAGS="$EXTRA_CFLAGS -$cf_opt"
+		fi
+	done
+	CFLAGS="$cf_save_CFLAGS"
+elif test "$GCC" = yes && test "$GCC_VERSION" != "unknown"
+then
+	{ echo "$as_me:17191: checking for $CC warning options..." >&5
+echo "$as_me: checking for $CC warning options..." >&6;}
+	cf_save_CFLAGS="$CFLAGS"
+	cf_warn_CONST=""
+	test "$with_ext_const" = yes && cf_warn_CONST="Wwrite-strings"
+	cf_gcc_warnings="Wignored-qualifiers Wlogical-op Wvarargs"
+	test "x$CLANG_COMPILER" = xyes && cf_gcc_warnings=
+	for cf_opt in W Wall \
+		Wbad-function-cast \
+		Wcast-align \
+		Wcast-qual \
+		Wdeclaration-after-statement \
+		Wextra \
+		Winline \
+		Wmissing-declarations \
+		Wmissing-prototypes \
+		Wnested-externs \
+		Wpointer-arith \
+		Wshadow \
+		Wstrict-prototypes \
+		Wundef Wno-inline $cf_gcc_warnings $cf_warn_CONST Wno-unknown-pragmas Wswitch-enum
+	do
+		CFLAGS="$cf_save_CFLAGS $EXTRA_CFLAGS -$cf_opt"
+		if { (eval echo "$as_me:17214: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:17217: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; then
+			test -n "$verbose" && echo "$as_me:17219: result: ... -$cf_opt" >&5
+echo "${ECHO_T}... -$cf_opt" >&6
+			case "$cf_opt" in
+			(Winline)
+				case "$GCC_VERSION" in
+				([34].*)
+					test -n "$verbose" && echo "	feature is broken in gcc $GCC_VERSION" 1>&6
+
+echo "${as_me:-configure}:17227: testing feature is broken in gcc $GCC_VERSION ..." 1>&5
+
+					continue;;
+				esac
+				;;
+			(Wpointer-arith)
+				case "$GCC_VERSION" in
+				([12].*)
+					test -n "$verbose" && echo "	feature is broken in gcc $GCC_VERSION" 1>&6
+
+echo "${as_me:-configure}:17237: testing feature is broken in gcc $GCC_VERSION ..." 1>&5
+
+					continue;;
+				esac
+				;;
+			esac
+			EXTRA_CFLAGS="$EXTRA_CFLAGS -$cf_opt"
+		fi
+	done
+	CFLAGS="$cf_save_CFLAGS"
+fi
+rm -rf ./conftest*
+
+fi
+
+if test "$GCC" = yes || test "$GXX" = yes
+then
+cat > conftest.i <<EOF
+#ifndef GCC_PRINTF
+#define GCC_PRINTF 0
+#endif
+#ifndef GCC_SCANF
+#define GCC_SCANF 0
+#endif
+#ifndef GCC_NORETURN
+#define GCC_NORETURN /* nothing */
+#endif
+#ifndef GCC_UNUSED
+#define GCC_UNUSED /* nothing */
+#endif
+EOF
+if test "$GCC" = yes
+then
+	{ echo "$as_me:17270: checking for $CC __attribute__ directives..." >&5
+echo "$as_me: checking for $CC __attribute__ directives..." >&6;}
+cat > "conftest.$ac_ext" <<EOF
+#line 17273 "${as_me:-configure}"
+#include "confdefs.h"
+#include "conftest.h"
+#include "conftest.i"
+#if	GCC_PRINTF
+#define GCC_PRINTFLIKE(fmt,var) __attribute__((format(printf,fmt,var)))
+#else
+#define GCC_PRINTFLIKE(fmt,var) /*nothing*/
+#endif
+#if	GCC_SCANF
+#define GCC_SCANFLIKE(fmt,var)  __attribute__((format(scanf,fmt,var)))
+#else
+#define GCC_SCANFLIKE(fmt,var)  /*nothing*/
+#endif
+extern void wow(char *,...) GCC_SCANFLIKE(1,2);
+extern GCC_NORETURN void oops(char *,...) GCC_PRINTFLIKE(1,2);
+extern GCC_NORETURN void foo(void);
+int main(int argc GCC_UNUSED, char *argv[] GCC_UNUSED) { (void)argc; (void)argv; return 0; }
+EOF
+	cf_printf_attribute=no
+	cf_scanf_attribute=no
+	for cf_attribute in scanf printf unused noreturn
+	do
+
+cf_ATTRIBUTE=`echo "$cf_attribute" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+		cf_directive="__attribute__(($cf_attribute))"
+		echo "checking for $CC $cf_directive" 1>&5
+
+		case "$cf_attribute" in
+		(printf)
+			cf_printf_attribute=yes
+			cat >conftest.h <<EOF
+#define GCC_$cf_ATTRIBUTE 1
+EOF
+			;;
+		(scanf)
+			cf_scanf_attribute=yes
+			cat >conftest.h <<EOF
+#define GCC_$cf_ATTRIBUTE 1
+EOF
+			;;
+		(*)
+			cat >conftest.h <<EOF
+#define GCC_$cf_ATTRIBUTE $cf_directive
+EOF
+			;;
+		esac
+
+		if { (eval echo "$as_me:17322: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:17325: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; then
+			test -n "$verbose" && echo "$as_me:17327: result: ... $cf_attribute" >&5
+echo "${ECHO_T}... $cf_attribute" >&6
+			cat conftest.h >>confdefs.h
+			case "$cf_attribute" in
+			(noreturn)
+
+cat >>confdefs.h <<EOF
+#define GCC_NORETURN $cf_directive
+EOF
+
+				;;
+			(printf)
+				cf_value='/* nothing */'
+				if test "$cf_printf_attribute" != no ; then
+					cf_value='__attribute__((format(printf,fmt,var)))'
+
+cat >>confdefs.h <<\EOF
+#define GCC_PRINTF 1
+EOF
+
+				fi
+
+cat >>confdefs.h <<EOF
+#define GCC_PRINTFLIKE(fmt,var) $cf_value
+EOF
+
+				;;
+			(scanf)
+				cf_value='/* nothing */'
+				if test "$cf_scanf_attribute" != no ; then
+					cf_value='__attribute__((format(scanf,fmt,var)))'
+
+cat >>confdefs.h <<\EOF
+#define GCC_SCANF 1
+EOF
+
+				fi
+
+cat >>confdefs.h <<EOF
+#define GCC_SCANFLIKE(fmt,var) $cf_value
+EOF
+
+				;;
+			(unused)
+
+cat >>confdefs.h <<EOF
+#define GCC_UNUSED $cf_directive
+EOF
+
+				;;
+			esac
+		fi
+	done
+else
+	${FGREP-fgrep} define conftest.i >>confdefs.h
+fi
+rm -rf ./conftest*
+fi
+
+fi
+
+if test "x$enable_warnings" = "xyes"; then
+
+ 	ADAFLAGS="$ADAFLAGS -gnatwa -gnatyg"
+
+	if test "x$cf_with_cxx" = xyes ; then
+
+INTEL_CPLUSPLUS=no
+
+if test "$GCC" = yes ; then
+	case "$host_os" in
+	(linux*|gnu*)
+		echo "$as_me:17399: checking if this is really Intel C++ compiler" >&5
+echo $ECHO_N "checking if this is really Intel C++ compiler... $ECHO_C" >&6
+		cf_save_CFLAGS="$CXXFLAGS"
+		CXXFLAGS="$CXXFLAGS -no-gcc"
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 17404 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+
+#ifdef __INTEL_COMPILER
+#else
+make an error
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:17421: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:17424: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:17427: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:17430: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  INTEL_CPLUSPLUS=yes
+cf_save_CFLAGS="$cf_save_CFLAGS -we147"
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+		CXXFLAGS="$cf_save_CFLAGS"
+		echo "$as_me:17441: result: $INTEL_CPLUSPLUS" >&5
+echo "${ECHO_T}$INTEL_CPLUSPLUS" >&6
+		;;
+	esac
+fi
+
+CLANG_CPLUSPLUS=no
+
+if test "$GCC" = yes ; then
+	echo "$as_me:17450: checking if this is really Clang C++ compiler" >&5
+echo $ECHO_N "checking if this is really Clang C++ compiler... $ECHO_C" >&6
+	cf_save_CFLAGS="$CXXFLAGS"
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 17454 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+
+#ifdef __clang__
+#else
+make an error
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:17471: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:17474: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:17477: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:17480: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  CLANG_CPLUSPLUS=yes
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+	CXXFLAGS="$cf_save_CFLAGS"
+	echo "$as_me:17490: result: $CLANG_CPLUSPLUS" >&5
+echo "${ECHO_T}$CLANG_CPLUSPLUS" >&6
+fi
+
+CLANG_VERSION=none
+
+if test "x$CLANG_CPLUSPLUS" = "xyes" ; then
+	case "$CC" in
+	(c[1-9][0-9]|*/c[1-9][0-9])
+		{ echo "$as_me:17499: WARNING: replacing broken compiler alias $CC" >&5
+echo "$as_me: WARNING: replacing broken compiler alias $CC" >&2;}
+		CFLAGS="$CFLAGS -std=`echo "$CC" | sed -e 's%.*/%%'`"
+		CC=clang
+		;;
+	esac
+
+	echo "$as_me:17506: checking version of $CC" >&5
+echo $ECHO_N "checking version of $CC... $ECHO_C" >&6
+	CLANG_VERSION="`$CC --version 2>/dev/null | sed -e '2,$d' -e 's/^.*(CLANG[^)]*) //' -e 's/^.*(Debian[^)]*) //' -e 's/^[^0-9.]*//' -e 's/[^0-9.].*//'`"
+	test -z "$CLANG_VERSION" && CLANG_VERSION=unknown
+	echo "$as_me:17510: result: $CLANG_VERSION" >&5
+echo "${ECHO_T}$CLANG_VERSION" >&6
+
+	for cf_clang_opt in \
+		-Qunused-arguments \
+		-Wno-error=implicit-function-declaration
+	do
+		echo "$as_me:17517: checking if option $cf_clang_opt works" >&5
+echo $ECHO_N "checking if option $cf_clang_opt works... $ECHO_C" >&6
+		cf_save_CFLAGS="$CFLAGS"
+		CFLAGS="$CFLAGS $cf_clang_opt"
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 17522 "configure"
+#include "confdefs.h"
+
+			#include <stdio.h>
+int
+main (void)
+{
+
+			printf("hello!\\n");
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:17536: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:17539: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:17542: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:17545: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+			cf_clang_optok=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+			cf_clang_optok=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+		echo "$as_me:17556: result: $cf_clang_optok" >&5
+echo "${ECHO_T}$cf_clang_optok" >&6
+		CFLAGS="$cf_save_CFLAGS"
+		if test "$cf_clang_optok" = yes; then
+			test -n "$verbose" && echo "	adding option $cf_clang_opt" 1>&6
+
+echo "${as_me:-configure}:17562: testing adding option $cf_clang_opt ..." 1>&5
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_clang_opt"
+
+		fi
+	done
+fi
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
+ac_link='$CXX -o "conftest$ac_exeext" $CXXFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+ac_main_return="return"
+
+cat > conftest.$ac_ext <<EOF
+#line 17579 "configure"
+int main(int argc, char *argv[]) { return (argv[argc-1] == 0) ; }
+EOF
+
+if test "$INTEL_CPLUSPLUS" = yes
+then
+# The "-wdXXX" options suppress warnings:
+# remark #1419: external declaration in primary source file
+# remark #1682: implicit conversion of a 64-bit integral type to a smaller integral type (potential portability problem)
+# remark #1683: explicit conversion of a 64-bit integral type to a smaller integral type (potential portability problem)
+# remark #1684: conversion from pointer to same-sized integral type (potential portability problem)
+# remark #193: zero used for undefined preprocessing identifier
+# remark #593: variable "curs_sb_left_arrow" was set but never used
+# remark #810: conversion from "int" to "Dimension={unsigned short}" may lose significant bits
+# remark #869: parameter "tw" was never referenced
+# remark #981: operands are evaluated in unspecified order
+# warning #269: invalid format string conversion
+
+	{ echo "$as_me:17597: checking for $CC warning options..." >&5
+echo "$as_me: checking for $CC warning options..." >&6;}
+	cf_save_CXXFLAGS="$CXXFLAGS"
+	EXTRA_CXXFLAGS="-Wall"
+	for cf_opt in \
+		wd1419 \
+		wd1682 \
+		wd1683 \
+		wd1684 \
+		wd193 \
+		wd279 \
+		wd593 \
+		wd810 \
+		wd869 \
+		wd981
+	do
+		CXXFLAGS="$cf_save_CXXFLAGS $EXTRA_CXXFLAGS -$cf_opt"
+		if { (eval echo "$as_me:17614: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:17617: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; then
+			test -n "$verbose" && echo "$as_me:17619: result: ... -$cf_opt" >&5
+echo "${ECHO_T}... -$cf_opt" >&6
+			EXTRA_CXXFLAGS="$EXTRA_CXXFLAGS -$cf_opt"
+		fi
+	done
+	CXXFLAGS="$cf_save_CXXFLAGS"
+
+elif test "$GXX" = yes
+then
+	{ echo "$as_me:17628: checking for $CXX warning options..." >&5
+echo "$as_me: checking for $CXX warning options..." >&6;}
+	cf_save_CXXFLAGS="$CXXFLAGS"
+	EXTRA_CXXFLAGS="-W -Wall"
+	cf_gxx_extra_warnings=""
+	test "$with_ext_const" = yes && cf_gxx_extra_warnings="Wwrite-strings"
+	case "$GXX_VERSION" in
+	([1-2].*)
+		;;
+	(*)
+		cf_gxx_extra_warnings="$cf_gxx_extra_warnings Weffc++"
+		;;
+	esac
+	for cf_opt in \
+		Wabi \
+		fabi-version=0 \
+		Wextra \
+		Wignored-qualifiers \
+		Wlogical-op \
+		Woverloaded-virtual \
+		Wsign-promo \
+		Wsynth \
+		Wold-style-cast \
+		Wcast-align \
+		Wcast-qual \
+		Wpointer-arith \
+		Wshadow \
+		Wundef $cf_gxx_extra_warnings Wno-unused
+	do
+		CXXFLAGS="$cf_save_CXXFLAGS $EXTRA_CXXFLAGS -Werror -$cf_opt"
+		if { (eval echo "$as_me:17658: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:17661: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; then
+			test -n "$verbose" && echo "$as_me:17663: result: ... -$cf_opt" >&5
+echo "${ECHO_T}... -$cf_opt" >&6
+			EXTRA_CXXFLAGS="$EXTRA_CXXFLAGS -$cf_opt"
+		else
+			test -n "$verbose" && echo "$as_me:17667: result: ... no -$cf_opt" >&5
+echo "${ECHO_T}... no -$cf_opt" >&6
+		fi
+	done
+	CXXFLAGS="$cf_save_CXXFLAGS"
+fi
+
+rm -rf ./conftest*
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
+ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_main_return="return"
+
+	fi
+fi
+
+echo "$as_me:17685: checking if you want to work around bogus compiler/loader warnings" >&5
+echo $ECHO_N "checking if you want to work around bogus compiler/loader warnings... $ECHO_C" >&6
+
+# Check whether --enable-string-hacks or --disable-string-hacks was given.
+if test "${enable_string_hacks+set}" = set; then
+  enableval="$enable_string_hacks"
+  enable_string_hacks=$enableval
+else
+  enable_string_hacks=no
+fi;
+echo "$as_me:17695: result: $enable_string_hacks" >&5
+echo "${ECHO_T}$enable_string_hacks" >&6
+
+if test "x$enable_string_hacks" = "xyes"; then
+
+cat >>confdefs.h <<\EOF
+#define USE_STRING_HACKS 1
+EOF
+
+	{ echo "$as_me:17704: WARNING: enabling string-hacks to work around bogus compiler/loader warnings" >&5
+echo "$as_me: WARNING: enabling string-hacks to work around bogus compiler/loader warnings" >&2;}
+	echo "$as_me:17706: checking for strlcat" >&5
+echo $ECHO_N "checking for strlcat... $ECHO_C" >&6
+if test "${ac_cv_func_strlcat+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 17712 "configure"
+#include "confdefs.h"
+#define strlcat autoconf_temporary
+#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
+#undef strlcat
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char strlcat (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_strlcat) || defined (__stub___strlcat)
+#error found stub for strlcat
+#endif
+
+	return strlcat ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:17743: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:17746: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:17749: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:17752: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_func_strlcat=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_strlcat=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:17762: result: $ac_cv_func_strlcat" >&5
+echo "${ECHO_T}$ac_cv_func_strlcat" >&6
+if test "$ac_cv_func_strlcat" = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_STRLCAT 1
+EOF
+
+else
+
+		echo "$as_me:17772: checking for strlcat in -lbsd" >&5
+echo $ECHO_N "checking for strlcat in -lbsd... $ECHO_C" >&6
+if test "${ac_cv_lib_bsd_strlcat+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lbsd  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 17780 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char strlcat ();
+int
+main (void)
+{
+strlcat ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:17799: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:17802: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:17805: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:17808: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_bsd_strlcat=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_bsd_strlcat=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:17819: result: $ac_cv_lib_bsd_strlcat" >&5
+echo "${ECHO_T}$ac_cv_lib_bsd_strlcat" >&6
+if test "$ac_cv_lib_bsd_strlcat" = yes; then
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lbsd; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+for ac_header in bsd/string.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:17842: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 17848 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:17852: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:17858: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:17877: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+cat >>confdefs.h <<\EOF
+#define HAVE_STRLCAT 1
+EOF
+
+fi
+
+fi
+
+for ac_func in strlcpy snprintf
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:17898: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 17904 "configure"
+#include "confdefs.h"
+#define $ac_func autoconf_temporary
+#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
+#undef $ac_func
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char $ac_func (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+#error found stub for $ac_func
+#endif
+
+	return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:17935: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:17938: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:17941: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:17944: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_var=no"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:17954: result: `eval echo '${'"$as_ac_var"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6
+if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+fi
+
+###	use option --enable-assertions to turn on generation of assertion code
+echo "$as_me:17967: checking if you want to enable runtime assertions" >&5
+echo $ECHO_N "checking if you want to enable runtime assertions... $ECHO_C" >&6
+
+# Check whether --enable-assertions or --disable-assertions was given.
+if test "${enable_assertions+set}" = set; then
+  enableval="$enable_assertions"
+  with_assertions=$enableval
+else
+  with_assertions=no
+fi;
+echo "$as_me:17977: result: $with_assertions" >&5
+echo "${ECHO_T}$with_assertions" >&6
+if test -n "$GCC"
+then
+	if test "$with_assertions" = no
+	then
+		CPPFLAGS="$CPPFLAGS -DNDEBUG"
+	else
+
+ 	ADAFLAGS="$ADAFLAGS -gnata"
+
+	fi
+fi
+
+###	use option --disable-leaks to suppress "permanent" leaks, for testing
+
+echo "$as_me:17993: checking if you want to use dmalloc for testing" >&5
+echo $ECHO_N "checking if you want to use dmalloc for testing... $ECHO_C" >&6
+
+# Check whether --with-dmalloc or --without-dmalloc was given.
+if test "${with_dmalloc+set}" = set; then
+  withval="$with_dmalloc"
+  case "x$withval" in
+	(x|xno) ;;
+	(*)
+		: "${with_cflags:=-g}"
+		: "${enable_leaks:=no}"
+		with_dmalloc=yes
+
+cat >>confdefs.h <<EOF
+#define USE_DMALLOC 1
+EOF
+
+		;;
+	esac
+else
+  with_dmalloc=
+fi;
+echo "$as_me:18015: result: ${with_dmalloc:-no}" >&5
+echo "${ECHO_T}${with_dmalloc:-no}" >&6
+
+case ".$with_cflags" in
+(.*-g*)
+	case .$CFLAGS in
+	(.*-g*)
+		;;
+	(*)
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in -g
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+		;;
+	esac
+	;;
+esac
+
+if test "$with_dmalloc" = yes ; then
+	echo "$as_me:18129: checking for dmalloc.h" >&5
+echo $ECHO_N "checking for dmalloc.h... $ECHO_C" >&6
+if test "${ac_cv_header_dmalloc_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 18135 "configure"
+#include "confdefs.h"
+#include <dmalloc.h>
+_ACEOF
+if { (eval echo "$as_me:18139: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:18145: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_cv_header_dmalloc_h=yes
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  ac_cv_header_dmalloc_h=no
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:18164: result: $ac_cv_header_dmalloc_h" >&5
+echo "${ECHO_T}$ac_cv_header_dmalloc_h" >&6
+if test "$ac_cv_header_dmalloc_h" = yes; then
+
+echo "$as_me:18168: checking for dmalloc_debug in -ldmalloc" >&5
+echo $ECHO_N "checking for dmalloc_debug in -ldmalloc... $ECHO_C" >&6
+if test "${ac_cv_lib_dmalloc_dmalloc_debug+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldmalloc  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 18176 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char dmalloc_debug ();
+int
+main (void)
+{
+dmalloc_debug ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:18195: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:18198: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:18201: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:18204: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_dmalloc_dmalloc_debug=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_dmalloc_dmalloc_debug=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:18215: result: $ac_cv_lib_dmalloc_dmalloc_debug" >&5
+echo "${ECHO_T}$ac_cv_lib_dmalloc_dmalloc_debug" >&6
+if test "$ac_cv_lib_dmalloc_dmalloc_debug" = yes; then
+  cat >>confdefs.h <<EOF
+#define HAVE_LIBDMALLOC 1
+EOF
+
+  LIBS="-ldmalloc $LIBS"
+
+fi
+
+fi
+
+fi
+
+echo "$as_me:18230: checking if you want to use dbmalloc for testing" >&5
+echo $ECHO_N "checking if you want to use dbmalloc for testing... $ECHO_C" >&6
+
+# Check whether --with-dbmalloc or --without-dbmalloc was given.
+if test "${with_dbmalloc+set}" = set; then
+  withval="$with_dbmalloc"
+  case "x$withval" in
+	(x|xno) ;;
+	(*)
+		: "${with_cflags:=-g}"
+		: "${enable_leaks:=no}"
+		with_dbmalloc=yes
+
+cat >>confdefs.h <<EOF
+#define USE_DBMALLOC 1
+EOF
+
+		;;
+	esac
+else
+  with_dbmalloc=
+fi;
+echo "$as_me:18252: result: ${with_dbmalloc:-no}" >&5
+echo "${ECHO_T}${with_dbmalloc:-no}" >&6
+
+case ".$with_cflags" in
+(.*-g*)
+	case .$CFLAGS in
+	(.*-g*)
+		;;
+	(*)
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in -g
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+		;;
+	esac
+	;;
+esac
+
+if test "$with_dbmalloc" = yes ; then
+	echo "$as_me:18366: checking for dbmalloc.h" >&5
+echo $ECHO_N "checking for dbmalloc.h... $ECHO_C" >&6
+if test "${ac_cv_header_dbmalloc_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 18372 "configure"
+#include "confdefs.h"
+#include <dbmalloc.h>
+_ACEOF
+if { (eval echo "$as_me:18376: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:18382: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_cv_header_dbmalloc_h=yes
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  ac_cv_header_dbmalloc_h=no
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:18401: result: $ac_cv_header_dbmalloc_h" >&5
+echo "${ECHO_T}$ac_cv_header_dbmalloc_h" >&6
+if test "$ac_cv_header_dbmalloc_h" = yes; then
+
+echo "$as_me:18405: checking for debug_malloc in -ldbmalloc" >&5
+echo $ECHO_N "checking for debug_malloc in -ldbmalloc... $ECHO_C" >&6
+if test "${ac_cv_lib_dbmalloc_debug_malloc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldbmalloc  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 18413 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char debug_malloc ();
+int
+main (void)
+{
+debug_malloc ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:18432: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:18435: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:18438: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:18441: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_dbmalloc_debug_malloc=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_dbmalloc_debug_malloc=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:18452: result: $ac_cv_lib_dbmalloc_debug_malloc" >&5
+echo "${ECHO_T}$ac_cv_lib_dbmalloc_debug_malloc" >&6
+if test "$ac_cv_lib_dbmalloc_debug_malloc" = yes; then
+  cat >>confdefs.h <<EOF
+#define HAVE_LIBDBMALLOC 1
+EOF
+
+  LIBS="-ldbmalloc $LIBS"
+
+fi
+
+fi
+
+fi
+
+echo "$as_me:18467: checking if you want to use valgrind for testing" >&5
+echo $ECHO_N "checking if you want to use valgrind for testing... $ECHO_C" >&6
+
+# Check whether --with-valgrind or --without-valgrind was given.
+if test "${with_valgrind+set}" = set; then
+  withval="$with_valgrind"
+  case "x$withval" in
+	(x|xno) ;;
+	(*)
+		: "${with_cflags:=-g}"
+		: "${enable_leaks:=no}"
+		with_valgrind=yes
+
+cat >>confdefs.h <<EOF
+#define USE_VALGRIND 1
+EOF
+
+		;;
+	esac
+else
+  with_valgrind=
+fi;
+echo "$as_me:18489: result: ${with_valgrind:-no}" >&5
+echo "${ECHO_T}${with_valgrind:-no}" >&6
+
+case ".$with_cflags" in
+(.*-g*)
+	case .$CFLAGS in
+	(.*-g*)
+		;;
+	(*)
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in -g
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+		;;
+	esac
+	;;
+esac
+
+echo "$as_me:18602: checking if you want to perform memory-leak testing" >&5
+echo $ECHO_N "checking if you want to perform memory-leak testing... $ECHO_C" >&6
+
+# Check whether --enable-leaks or --disable-leaks was given.
+if test "${enable_leaks+set}" = set; then
+  enableval="$enable_leaks"
+  enable_leaks=$enableval
+else
+  enable_leaks=yes
+fi;
+if test "x$enable_leaks" = xno; then with_no_leaks=yes; else with_no_leaks=no; fi
+echo "$as_me:18613: result: $with_no_leaks" >&5
+echo "${ECHO_T}$with_no_leaks" >&6
+
+if test "$enable_leaks" = no ; then
+
+cat >>confdefs.h <<\EOF
+#define NO_LEAKS 1
+EOF
+
+cat >>confdefs.h <<\EOF
+#define YY_NO_LEAKS 1
+EOF
+
+fi
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NC_ALLOC_H 1
+EOF
+
+###	use option --enable-expanded to generate certain macros as functions
+
+# Check whether --enable-expanded or --disable-expanded was given.
+if test "${enable_expanded+set}" = set; then
+  enableval="$enable_expanded"
+  test "x$enableval" = xyes &&
+cat >>confdefs.h <<\EOF
+#define NCURSES_EXPANDED 1
+EOF
+
+fi;
+
+###	use option --disable-macros to suppress macros in favor of functions
+
+# Check whether --enable-macros or --disable-macros was given.
+if test "${enable_macros+set}" = set; then
+  enableval="$enable_macros"
+  test "$enableval" = no &&
+cat >>confdefs.h <<\EOF
+#define NCURSES_NOMACROS 1
+EOF
+
+fi;
+
+# Normally we only add trace() to the debug-library.  Allow this to be
+# extended to all models of the ncurses library:
+cf_all_traces=no
+case "$CFLAGS $CPPFLAGS" in
+(*-DTRACE*)
+	cf_all_traces=yes
+	;;
+esac
+
+echo "$as_me:18665: checking whether to add trace feature to all models" >&5
+echo $ECHO_N "checking whether to add trace feature to all models... $ECHO_C" >&6
+
+# Check whether --with-trace or --without-trace was given.
+if test "${with_trace+set}" = set; then
+  withval="$with_trace"
+  cf_with_trace=$withval
+else
+  cf_with_trace=$cf_all_traces
+fi;
+echo "$as_me:18675: result: $cf_with_trace" >&5
+echo "${ECHO_T}$cf_with_trace" >&6
+
+if test "x$cf_with_trace" = xyes ; then
+	LIB_TRACING=all
+	ADA_TRACE=TRUE
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in -DTRACE
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+cat >>confdefs.h <<\EOF
+#define HAVE__TRACEF 1
+EOF
+
+else
+	LIB_TRACING=DEBUG
+	ADA_TRACE=FALSE
+fi
+
+echo "$as_me:18789: checking if we want to use GNAT projects" >&5
+echo $ECHO_N "checking if we want to use GNAT projects... $ECHO_C" >&6
+
+# Check whether --enable-gnat-projects or --disable-gnat-projects was given.
+if test "${enable_gnat_projects+set}" = set; then
+  enableval="$enable_gnat_projects"
+  test "$enableval" != no && enableval=yes
+	if test "$enableval" != "yes" ; then
+    enable_gnat_projects=no
+	else
+		enable_gnat_projects=yes
+	fi
+else
+  enableval=yes
+	enable_gnat_projects=yes
+
+fi;
+echo "$as_me:18806: result: $enable_gnat_projects" >&5
+echo "${ECHO_T}$enable_gnat_projects" >&6
+
+###	Checks for libraries.
+case "$cf_cv_system_name" in
+(*mingw32*|*mingw64*)
+	# Note: WINVER may be a problem with Windows 10
+	if test "x$with_exp_win32" = xyes ; then
+		CPPFLAGS="$CPPFLAGS -DWINVER=0x0600 -DWIN32_LEAN_AND_MEAN"
+	else
+		CPPFLAGS="$CPPFLAGS -DWINVER=0x0501 -DWIN32_LEAN_AND_MEAN"
+	fi
+
+echo "$as_me:18819: checking if ssp library is needed" >&5
+echo $ECHO_N "checking if ssp library is needed... $ECHO_C" >&6
+if test "${cf_cv_need_libssp+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 18826 "configure"
+#include "confdefs.h"
+
+#include <sys/types.h>
+#include <dirent.h>
+
+int
+main (void)
+{
+
+       DIR *dp = opendir(".");
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:18843: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:18846: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:18849: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:18852: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_need_libssp=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+	cf_save_LIBS="$LIBS"
+	LIBS="$LIBS -lssp"
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 18862 "configure"
+#include "confdefs.h"
+
+#include <sys/types.h>
+#include <dirent.h>
+
+int
+main (void)
+{
+
+		   DIR *dp = opendir(".");
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:18879: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:18882: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:18885: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:18888: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_need_libssp=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_need_libssp=maybe
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+	LIBS="$cf_save_LIBS"
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:18902: result: $cf_cv_need_libssp" >&5
+echo "${ECHO_T}$cf_cv_need_libssp" >&6
+
+if test "x$cf_cv_need_libssp" = xyes
+then
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lssp; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+fi
+
+	;;
+(*)
+echo "$as_me:18928: checking for gettimeofday" >&5
+echo $ECHO_N "checking for gettimeofday... $ECHO_C" >&6
+if test "${ac_cv_func_gettimeofday+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 18934 "configure"
+#include "confdefs.h"
+#define gettimeofday autoconf_temporary
+#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
+#undef gettimeofday
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char gettimeofday (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_gettimeofday) || defined (__stub___gettimeofday)
+#error found stub for gettimeofday
+#endif
+
+	return gettimeofday ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:18965: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:18968: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:18971: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:18974: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_func_gettimeofday=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_gettimeofday=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:18984: result: $ac_cv_func_gettimeofday" >&5
+echo "${ECHO_T}$ac_cv_func_gettimeofday" >&6
+if test "$ac_cv_func_gettimeofday" = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_GETTIMEOFDAY 1
+EOF
+
+else
+
+echo "$as_me:18994: checking for gettimeofday in -lbsd" >&5
+echo $ECHO_N "checking for gettimeofday in -lbsd... $ECHO_C" >&6
+if test "${ac_cv_lib_bsd_gettimeofday+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lbsd  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 19002 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char gettimeofday ();
+int
+main (void)
+{
+gettimeofday ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:19021: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:19024: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:19027: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:19030: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_bsd_gettimeofday=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_bsd_gettimeofday=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:19041: result: $ac_cv_lib_bsd_gettimeofday" >&5
+echo "${ECHO_T}$ac_cv_lib_bsd_gettimeofday" >&6
+if test "$ac_cv_lib_bsd_gettimeofday" = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_GETTIMEOFDAY 1
+EOF
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lbsd; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+fi
+
+fi
+	;;
+esac
+
+echo "$as_me:19071: checking if -lm needed for math functions" >&5
+echo $ECHO_N "checking if -lm needed for math functions... $ECHO_C" >&6
+if test "${cf_cv_need_libm+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 19078 "configure"
+#include "confdefs.h"
+
+		#include <stdio.h>
+		#include <stdlib.h>
+		#include <math.h>
+
+int
+main (void)
+{
+double x = rand(); printf("result = %g\\n", pow(sin(x),x))
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:19094: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:19097: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:19100: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:19103: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_need_libm=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_need_libm=yes
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:19113: result: $cf_cv_need_libm" >&5
+echo "${ECHO_T}$cf_cv_need_libm" >&6
+
+if test "$cf_cv_need_libm" = yes
+then
+
+	cf_save_LIBS="$LIBS"
+	LIBS="$LIBS -lm"
+	echo "$as_me:19121: checking if -lm is available for math functions" >&5
+echo $ECHO_N "checking if -lm is available for math functions... $ECHO_C" >&6
+if test "${cf_cv_have_libm+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 19128 "configure"
+#include "confdefs.h"
+
+		#include <stdio.h>
+		#include <stdlib.h>
+		#include <math.h>
+
+int
+main (void)
+{
+double x = rand(); printf("result = %g\\n", pow(sin(x),x))
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:19144: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:19147: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:19150: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:19153: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_have_libm=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_have_libm=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:19163: result: $cf_cv_have_libm" >&5
+echo "${ECHO_T}$cf_cv_have_libm" >&6
+	LIBS="$cf_save_LIBS"
+
+	if test "$cf_cv_have_libm" = yes
+	then
+		MATH_LIB=-lm
+	fi
+else
+	cf_cv_have_libm=yes
+fi
+
+if test "$cf_cv_have_libm" = yes
+then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_MATH_FUNCS 1
+EOF
+
+fi
+
+###	Checks for header files.
+echo "$as_me:19185: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
+if test "${ac_cv_header_stdc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 19191 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+_ACEOF
+if { (eval echo "$as_me:19199: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:19205: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_cv_header_stdc=yes
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  ac_cv_header_stdc=no
+fi
+rm -f conftest.err "conftest.$ac_ext"
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 19227 "configure"
+#include "confdefs.h"
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -rf conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 19245 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -rf conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then
+  :
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 19266 "configure"
+#include "confdefs.h"
+#include <ctype.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) (('a' <= (c) && (c) <= 'i') \
+                     || ('j' <= (c) && (c) <= 'r') \
+                     || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main (void)
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+        || toupper (i) != TOUPPER (i))
+      $ac_main_return(2);
+  $ac_main_return (0);
+}
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:19292: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:19295: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:19297: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:19300: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_header_stdc=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+fi
+fi
+echo "$as_me:19313: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6
+if test $ac_cv_header_stdc = yes; then
+
+cat >>confdefs.h <<\EOF
+#define STDC_HEADERS 1
+EOF
+
+fi
+
+ac_header_dirent=no
+for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do
+  as_ac_Header=`echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh`
+echo "$as_me:19326: checking for $ac_hdr that defines DIR" >&5
+echo $ECHO_N "checking for $ac_hdr that defines DIR... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 19332 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <$ac_hdr>
+
+int
+main (void)
+{
+if ((DIR *) 0)
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:19347: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:19350: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:19353: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:19356: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_Header=no"
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:19366: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_hdr" | $as_tr_cpp` 1
+EOF
+
+ac_header_dirent=$ac_hdr; break
+fi
+
+done
+# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
+if test $ac_header_dirent = dirent.h; then
+  echo "$as_me:19379: checking for opendir in -ldir" >&5
+echo $ECHO_N "checking for opendir in -ldir... $ECHO_C" >&6
+if test "${ac_cv_lib_dir_opendir+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldir  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 19387 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char opendir ();
+int
+main (void)
+{
+opendir ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:19406: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:19409: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:19412: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:19415: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_dir_opendir=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_dir_opendir=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:19426: result: $ac_cv_lib_dir_opendir" >&5
+echo "${ECHO_T}$ac_cv_lib_dir_opendir" >&6
+if test "$ac_cv_lib_dir_opendir" = yes; then
+  LIBS="$LIBS -ldir"
+fi
+
+else
+  echo "$as_me:19433: checking for opendir in -lx" >&5
+echo $ECHO_N "checking for opendir in -lx... $ECHO_C" >&6
+if test "${ac_cv_lib_x_opendir+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lx  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 19441 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char opendir ();
+int
+main (void)
+{
+opendir ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:19460: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:19463: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:19466: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:19469: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_x_opendir=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_x_opendir=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:19480: result: $ac_cv_lib_x_opendir" >&5
+echo "${ECHO_T}$ac_cv_lib_x_opendir" >&6
+if test "$ac_cv_lib_x_opendir" = yes; then
+  LIBS="$LIBS -lx"
+fi
+
+fi
+
+echo "$as_me:19488: checking whether time.h and sys/time.h may both be included" >&5
+echo $ECHO_N "checking whether time.h and sys/time.h may both be included... $ECHO_C" >&6
+if test "${ac_cv_header_time+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 19494 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <sys/time.h>
+#include <time.h>
+
+int
+main (void)
+{
+if ((struct tm *) 0)
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:19510: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:19513: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:19516: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:19519: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_header_time=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_header_time=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:19529: result: $ac_cv_header_time" >&5
+echo "${ECHO_T}$ac_cv_header_time" >&6
+if test $ac_cv_header_time = yes; then
+
+cat >>confdefs.h <<\EOF
+#define TIME_WITH_SYS_TIME 1
+EOF
+
+fi
+
+cf_regex_func=no
+cf_regex_libs=
+case "$host_os" in
+(mingw*)
+	# -lsystre -ltre -lintl -liconv
+	echo "$as_me:19544: checking for regcomp in -lsystre" >&5
+echo $ECHO_N "checking for regcomp in -lsystre... $ECHO_C" >&6
+if test "${ac_cv_lib_systre_regcomp+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsystre  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 19552 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char regcomp ();
+int
+main (void)
+{
+regcomp ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:19571: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:19574: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:19577: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:19580: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_systre_regcomp=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_systre_regcomp=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:19591: result: $ac_cv_lib_systre_regcomp" >&5
+echo "${ECHO_T}$ac_cv_lib_systre_regcomp" >&6
+if test "$ac_cv_lib_systre_regcomp" = yes; then
+
+		echo "$as_me:19595: checking for libiconv_open in -liconv" >&5
+echo $ECHO_N "checking for libiconv_open in -liconv... $ECHO_C" >&6
+if test "${ac_cv_lib_iconv_libiconv_open+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-liconv  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 19603 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char libiconv_open ();
+int
+main (void)
+{
+libiconv_open ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:19622: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:19625: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:19628: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:19631: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_iconv_libiconv_open=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_iconv_libiconv_open=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:19642: result: $ac_cv_lib_iconv_libiconv_open" >&5
+echo "${ECHO_T}$ac_cv_lib_iconv_libiconv_open" >&6
+if test "$ac_cv_lib_iconv_libiconv_open" = yes; then
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -liconv; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+fi
+
+		echo "$as_me:19664: checking for libintl_gettext in -lintl" >&5
+echo $ECHO_N "checking for libintl_gettext in -lintl... $ECHO_C" >&6
+if test "${ac_cv_lib_intl_libintl_gettext+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lintl  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 19672 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char libintl_gettext ();
+int
+main (void)
+{
+libintl_gettext ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:19691: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:19694: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:19697: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:19700: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_intl_libintl_gettext=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_intl_libintl_gettext=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:19711: result: $ac_cv_lib_intl_libintl_gettext" >&5
+echo "${ECHO_T}$ac_cv_lib_intl_libintl_gettext" >&6
+if test "$ac_cv_lib_intl_libintl_gettext" = yes; then
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lintl; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+fi
+
+		echo "$as_me:19733: checking for tre_regcomp in -ltre" >&5
+echo $ECHO_N "checking for tre_regcomp in -ltre... $ECHO_C" >&6
+if test "${ac_cv_lib_tre_tre_regcomp+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ltre  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 19741 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char tre_regcomp ();
+int
+main (void)
+{
+tre_regcomp ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:19760: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:19763: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:19766: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:19769: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_tre_tre_regcomp=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_tre_tre_regcomp=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:19780: result: $ac_cv_lib_tre_tre_regcomp" >&5
+echo "${ECHO_T}$ac_cv_lib_tre_tre_regcomp" >&6
+if test "$ac_cv_lib_tre_tre_regcomp" = yes; then
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -ltre; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lsystre; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+		cf_regex_func=regcomp
+
+else
+
+		echo "$as_me:19822: checking for regcomp in -lgnurx" >&5
+echo $ECHO_N "checking for regcomp in -lgnurx... $ECHO_C" >&6
+if test "${ac_cv_lib_gnurx_regcomp+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lgnurx  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 19830 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char regcomp ();
+int
+main (void)
+{
+regcomp ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:19849: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:19852: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:19855: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:19858: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_gnurx_regcomp=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_gnurx_regcomp=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:19869: result: $ac_cv_lib_gnurx_regcomp" >&5
+echo "${ECHO_T}$ac_cv_lib_gnurx_regcomp" >&6
+if test "$ac_cv_lib_gnurx_regcomp" = yes; then
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lgnurx; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+			cf_regex_func=regcomp
+fi
+
+fi
+
+	;;
+(*)
+	cf_regex_libs="regex re"
+	echo "$as_me:19897: checking for regcomp" >&5
+echo $ECHO_N "checking for regcomp... $ECHO_C" >&6
+if test "${ac_cv_func_regcomp+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 19903 "configure"
+#include "confdefs.h"
+#define regcomp autoconf_temporary
+#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
+#undef regcomp
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char regcomp (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_regcomp) || defined (__stub___regcomp)
+#error found stub for regcomp
+#endif
+
+	return regcomp ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:19934: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:19937: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:19940: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:19943: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_func_regcomp=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_regcomp=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:19953: result: $ac_cv_func_regcomp" >&5
+echo "${ECHO_T}$ac_cv_func_regcomp" >&6
+if test "$ac_cv_func_regcomp" = yes; then
+  cf_regex_func=regcomp
+else
+
+		for cf_regex_lib in $cf_regex_libs
+		do
+			as_ac_Lib=`echo "ac_cv_lib_$cf_regex_lib''_regcomp" | $as_tr_sh`
+echo "$as_me:19962: checking for regcomp in -l$cf_regex_lib" >&5
+echo $ECHO_N "checking for regcomp in -l$cf_regex_lib... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Lib+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$cf_regex_lib  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 19970 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char regcomp ();
+int
+main (void)
+{
+regcomp ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:19989: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:19992: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:19995: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:19998: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  eval "$as_ac_Lib=yes"
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_Lib=no"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:20009: result: `eval echo '${'"$as_ac_Lib"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Lib"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Lib"'}'`" = yes; then
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -l$cf_regex_lib; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+					cf_regex_func=regcomp
+					break
+fi
+
+		done
+
+fi
+
+	;;
+esac
+
+if test "$cf_regex_func" = no ; then
+	echo "$as_me:20041: checking for compile" >&5
+echo $ECHO_N "checking for compile... $ECHO_C" >&6
+if test "${ac_cv_func_compile+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 20047 "configure"
+#include "confdefs.h"
+#define compile autoconf_temporary
+#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
+#undef compile
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char compile (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_compile) || defined (__stub___compile)
+#error found stub for compile
+#endif
+
+	return compile ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:20078: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:20081: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:20084: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:20087: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_func_compile=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_compile=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:20097: result: $ac_cv_func_compile" >&5
+echo "${ECHO_T}$ac_cv_func_compile" >&6
+if test "$ac_cv_func_compile" = yes; then
+  cf_regex_func=compile
+else
+
+		echo "$as_me:20103: checking for compile in -lgen" >&5
+echo $ECHO_N "checking for compile in -lgen... $ECHO_C" >&6
+if test "${ac_cv_lib_gen_compile+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lgen  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 20111 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char compile ();
+int
+main (void)
+{
+compile ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:20130: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:20133: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:20136: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:20139: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_gen_compile=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_gen_compile=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:20150: result: $ac_cv_lib_gen_compile" >&5
+echo "${ECHO_T}$ac_cv_lib_gen_compile" >&6
+if test "$ac_cv_lib_gen_compile" = yes; then
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lgen; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+				cf_regex_func=compile
+fi
+
+fi
+
+fi
+
+if test "$cf_regex_func" = no ; then
+	{ echo "$as_me:20178: WARNING: cannot find regular expression library" >&5
+echo "$as_me: WARNING: cannot find regular expression library" >&2;}
+fi
+
+echo "$as_me:20182: checking for regular-expression headers" >&5
+echo $ECHO_N "checking for regular-expression headers... $ECHO_C" >&6
+if test "${cf_cv_regex_hdrs+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cf_cv_regex_hdrs=no
+case "$cf_regex_func" in
+(compile)
+	for cf_regex_hdr in regexp.h regexpr.h
+	do
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 20194 "configure"
+#include "confdefs.h"
+#include <$cf_regex_hdr>
+int
+main (void)
+{
+
+			char *p = compile("", "", "", 0);
+			int x = step("", "");
+			(void)p;
+			(void)x;
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:20211: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:20214: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:20217: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:20220: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+			cf_cv_regex_hdrs=$cf_regex_hdr
+			break
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+	done
+	;;
+(*)
+	for cf_regex_hdr in regex.h
+	do
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 20237 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <$cf_regex_hdr>
+int
+main (void)
+{
+
+			regex_t *p = 0;
+			int x = regcomp(p, "", 0);
+			int y = regexec(p, "", 0, 0, 0);
+			(void)x;
+			(void)y;
+			regfree(p);
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:20257: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:20260: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:20263: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:20266: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+			cf_cv_regex_hdrs=$cf_regex_hdr
+			break
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+	done
+	;;
+esac
+
+fi
+echo "$as_me:20282: result: $cf_cv_regex_hdrs" >&5
+echo "${ECHO_T}$cf_cv_regex_hdrs" >&6
+
+case "$cf_cv_regex_hdrs" in
+	(no)		{ echo "$as_me:20286: WARNING: no regular expression header found" >&5
+echo "$as_me: WARNING: no regular expression header found" >&2;} ;;
+	(regex.h)
+cat >>confdefs.h <<\EOF
+#define HAVE_REGEX_H_FUNCS 1
+EOF
+ ;;
+	(regexp.h)
+cat >>confdefs.h <<\EOF
+#define HAVE_REGEXP_H_FUNCS 1
+EOF
+ ;;
+	(regexpr.h)
+cat >>confdefs.h <<\EOF
+#define HAVE_REGEXPR_H_FUNCS 1
+EOF
+ ;;
+esac
+
+for ac_header in \
+fcntl.h \
+getopt.h \
+limits.h \
+locale.h \
+math.h \
+poll.h \
+sys/ioctl.h \
+sys/param.h \
+sys/poll.h \
+sys/select.h \
+sys/time.h \
+sys/times.h \
+unistd.h \
+wctype.h \
+
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:20323: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 20329 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:20333: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:20339: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:20358: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+for ac_header in unistd.h getopt.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:20371: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 20377 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:20381: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:20387: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:20406: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+echo "$as_me:20416: checking for header declaring getopt variables" >&5
+echo $ECHO_N "checking for header declaring getopt variables... $ECHO_C" >&6
+if test "${cf_cv_getopt_header+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cf_cv_getopt_header=none
+for cf_header in stdio.h stdlib.h unistd.h getopt.h
+do
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 20426 "configure"
+#include "confdefs.h"
+
+#include <$cf_header>
+int
+main (void)
+{
+int x = optind; char *y = optarg; (void)x; (void)y
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:20439: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:20442: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:20445: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:20448: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_getopt_header=$cf_header
+ break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+done
+
+fi
+echo "$as_me:20460: result: $cf_cv_getopt_header" >&5
+echo "${ECHO_T}$cf_cv_getopt_header" >&6
+if test "$cf_cv_getopt_header" != none ; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_GETOPT_HEADER 1
+EOF
+
+fi
+if test "$cf_cv_getopt_header" = getopt.h ; then
+
+cat >>confdefs.h <<\EOF
+#define NEED_GETOPT_H 1
+EOF
+
+fi
+
+echo "$as_me:20477: checking if external environ is declared" >&5
+echo $ECHO_N "checking if external environ is declared... $ECHO_C" >&6
+if test "${cf_cv_dcl_environ+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+    cat >"conftest.$ac_ext" <<_ACEOF
+#line 20484 "configure"
+#include "confdefs.h"
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#include <unistd.h>
+int
+main (void)
+{
+int x = (int) environ
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:20500: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:20503: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:20506: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:20509: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_dcl_environ=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_dcl_environ=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:20520: result: $cf_cv_dcl_environ" >&5
+echo "${ECHO_T}$cf_cv_dcl_environ" >&6
+
+if test "$cf_cv_dcl_environ" = no ; then
+
+cf_result=`echo "decl_environ" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+    cat >>confdefs.h <<EOF
+#define $cf_result 1
+EOF
+
+fi
+
+# It's possible (for near-UNIX clones) that the data doesn't exist
+
+echo "$as_me:20535: checking if external environ exists" >&5
+echo $ECHO_N "checking if external environ exists... $ECHO_C" >&6
+if test "${cf_cv_have_environ+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 20542 "configure"
+#include "confdefs.h"
+
+#undef environ
+extern int environ;
+
+int
+main (void)
+{
+environ = 2
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:20557: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:20560: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:20563: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:20566: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_have_environ=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_have_environ=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:20577: result: $cf_cv_have_environ" >&5
+echo "${ECHO_T}$cf_cv_have_environ" >&6
+
+if test "$cf_cv_have_environ" = yes ; then
+
+cf_result=`echo "have_environ" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+	cat >>confdefs.h <<EOF
+#define $cf_result 1
+EOF
+
+fi
+
+echo "$as_me:20590: checking for getenv" >&5
+echo $ECHO_N "checking for getenv... $ECHO_C" >&6
+if test "${ac_cv_func_getenv+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 20596 "configure"
+#include "confdefs.h"
+#define getenv autoconf_temporary
+#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
+#undef getenv
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char getenv (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_getenv) || defined (__stub___getenv)
+#error found stub for getenv
+#endif
+
+	return getenv ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:20627: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:20630: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:20633: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:20636: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_func_getenv=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_getenv=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:20646: result: $ac_cv_func_getenv" >&5
+echo "${ECHO_T}$ac_cv_func_getenv" >&6
+
+for ac_func in putenv setenv strdup
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:20652: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 20658 "configure"
+#include "confdefs.h"
+#define $ac_func autoconf_temporary
+#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
+#undef $ac_func
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char $ac_func (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+#error found stub for $ac_func
+#endif
+
+	return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:20689: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:20692: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:20695: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:20698: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_var=no"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:20708: result: `eval echo '${'"$as_ac_var"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6
+if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+echo "$as_me:20718: checking if getenv returns consistent values" >&5
+echo $ECHO_N "checking if getenv returns consistent values... $ECHO_C" >&6
+if test "${cf_cv_consistent_getenv+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+if test "$cross_compiling" = yes; then
+  cf_cv_consistent_getenv=unknown
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 20728 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+
+#if defined(HAVE_ENVIRON) && defined(DECL_ENVIRON) && !defined(environ)
+extern char **environ;	/* POSIX, but some systems are not... */
+#endif
+
+#if defined(HAVE_STRDUP)
+#define str_alloc(s) strdup(s)
+#else
+#define str_alloc(s) strcpy(malloc(strlen(s) + 1, s))
+#endif
+
+static void set_value(const char *name, const char *value)
+{
+#if defined(HAVE_SETENV)
+	setenv(name, value, 1);
+#elif defined(HAVE_PUTENV)
+	char buffer[1024];
+	sprintf(buffer, "%s=%s", name, value);
+	putenv(str_alloc(buffer));
+#else
+#error neither putenv/setenv found
+#endif
+}
+int main(void)
+{
+	int pass;
+	size_t numenv, limit, j;
+	char **mynames;
+	char **myvalues;
+	char **mypointer;
+	char *equals;
+	for (numenv = 0; environ[numenv]; ++numenv) ;
+	limit = numenv + 10;
+	mynames = (char **) calloc(limit + 1, sizeof(char *));
+	myvalues = (char **) calloc(limit + 1, sizeof(char *));
+	mypointer = (char **) calloc(limit + 1, sizeof(char *));
+#if defined(HAVE_ENVIRON)
+	for (j = 0; environ[j]; ++j) {
+		mynames[j] = str_alloc(environ[j]);
+		equals = strchr(mynames[j], '=');
+		if (equals != 0) {
+			*equals++ = '\\0';
+			myvalues[j] = str_alloc(equals);
+		} else {
+			myvalues[j] = str_alloc("");
+		}
+	}
+#endif
+	for (j = numenv; j < limit; ++j) {
+		char name[80];
+		char value[80];
+		size_t found;
+		size_t k = 0;
+		do {
+			size_t jk;
+			found = 0;
+			sprintf(name, "TERM%lu", (unsigned long) k);
+			for (jk = 0; jk < j; ++jk) {
+				if (!strcmp(name, mynames[jk])) {
+					found = 1;
+					++k;
+					break;
+				}
+			}
+		} while (found);
+		sprintf(value, "%lu:%p", (unsigned long) k, &mynames[j]);
+		set_value(name, value);
+		mynames[j] = str_alloc(name);
+		myvalues[j] = str_alloc(value);
+	}
+	for (pass = 0; pass < 3; ++pass) {
+		for (j = 0; j < limit; ++j) {
+			char *value = getenv(mynames[j]);
+			if (pass) {
+				if (value == 0) {
+					fprintf(stderr, "getenv returned null for %s\\n", mynames[j]);
+					${cf_cv_main_return:-return}(1);
+				} else if (value != mypointer[j]) {
+					fprintf(stderr, "getenv returned different pointer for %s\\n", mynames[j]);
+					${cf_cv_main_return:-return}(1);
+				} else if (strcmp(value, myvalues[j])) {
+					fprintf(stderr, "getenv returned different value for %s\\n", mynames[j]);
+					${cf_cv_main_return:-return}(1);
+				}
+			} else {
+				size_t k;
+				mypointer[j] = value;
+				for (k = 0; k < j; ++k) {
+					if (mypointer[j] == mypointer[k]) {
+						fprintf(stderr, "getenv returned same pointer for %s and %s\\n", mynames[j], mynames[k]);
+						${cf_cv_main_return:-return}(1);
+					}
+				}
+			}
+		}
+	}
+	${cf_cv_main_return:-return}(0);
+}
+
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:20837: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:20840: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:20842: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:20845: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_consistent_getenv=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_consistent_getenv=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+
+fi
+echo "$as_me:20858: result: $cf_cv_consistent_getenv" >&5
+echo "${ECHO_T}$cf_cv_consistent_getenv" >&6
+
+if test "x$cf_cv_consistent_getenv" = xno
+then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_CONSISTENT_GETENV 1
+EOF
+
+fi
+
+if test "x$cf_cv_consistent_getenv" = xno && \
+	test "x$cf_with_trace" = xyes
+then
+	{ echo "$as_me:20873: WARNING: The NCURSES_TRACE environment variable is not supported with this configuration" >&5
+echo "$as_me: WARNING: The NCURSES_TRACE environment variable is not supported with this configuration" >&2;}
+fi
+
+echo "$as_me:20877: checking if sys/time.h works with sys/select.h" >&5
+echo $ECHO_N "checking if sys/time.h works with sys/select.h... $ECHO_C" >&6
+if test "${cf_cv_sys_time_select+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 20884 "configure"
+#include "confdefs.h"
+
+#include <sys/types.h>
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#ifdef HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:20904: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:20907: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:20910: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:20913: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_sys_time_select=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_sys_time_select=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+
+echo "$as_me:20925: result: $cf_cv_sys_time_select" >&5
+echo "${ECHO_T}$cf_cv_sys_time_select" >&6
+test "$cf_cv_sys_time_select" = yes &&
+cat >>confdefs.h <<\EOF
+#define HAVE_SYS_TIME_SELECT 1
+EOF
+
+###	checks for compiler characteristics
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
+ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_main_return="return"
+
+echo "$as_me:20940: checking for an ANSI C-conforming const" >&5
+echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6
+if test "${ac_cv_c_const+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 20946 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+/* FIXME: Include the comments suggested by Paul. */
+#ifndef __cplusplus
+  /* Ultrix mips cc rejects this.  */
+  typedef int charset[2];
+  const charset x;
+  /* SunOS 4.1.1 cc rejects this.  */
+  char const *const *ccp;
+  char **p;
+  /* NEC SVR4.0.2 mips cc rejects this.  */
+  struct point {int x, y;};
+  static struct point const zero = {0,0};
+  /* AIX XL C 1.02.0.0 rejects this.
+     It does not let you subtract one const X* pointer from another in
+     an arm of an if-expression whose if-part is not a constant
+     expression */
+  const char *g = "string";
+  ccp = &g + (g ? g-g : 0);
+  /* HPUX 7.0 cc rejects these. */
+  ++ccp;
+  p = (char**) ccp;
+  ccp = (char const *const *) p;
+  { /* SCO 3.2v4 cc rejects this.  */
+    char *t;
+    char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+    *t++ = 0;
+  }
+  { /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
+    int x[] = {25, 17};
+    const int *foo = &x[0];
+    ++foo;
+  }
+  { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+    typedef const int *iptr;
+    iptr p = 0;
+    ++p;
+  }
+  { /* AIX XL C 1.02.0.0 rejects this saying
+       "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+    struct s { int j; const int *ap[3]; };
+    struct s *b; b->j = 5;
+  }
+  { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+    const int foo = 10;
+  }
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:21004: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:21007: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:21010: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:21013: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_c_const=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_c_const=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:21023: result: $ac_cv_c_const" >&5
+echo "${ECHO_T}$ac_cv_c_const" >&6
+if test $ac_cv_c_const = no; then
+
+cat >>confdefs.h <<\EOF
+#define const
+EOF
+
+fi
+
+echo "$as_me:21033: checking for inline" >&5
+echo $ECHO_N "checking for inline... $ECHO_C" >&6
+if test "${ac_cv_c_inline+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 21041 "configure"
+#include "confdefs.h"
+#ifndef __cplusplus
+static $ac_kw int static_foo () {return 0; }
+$ac_kw int foo () {return 0; }
+#endif
+
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:21050: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:21053: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:21056: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:21059: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_c_inline=$ac_kw; break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+done
+
+fi
+echo "$as_me:21070: result: $ac_cv_c_inline" >&5
+echo "${ECHO_T}$ac_cv_c_inline" >&6
+case $ac_cv_c_inline in
+  inline | yes) ;;
+  no)
+cat >>confdefs.h <<\EOF
+#define inline
+EOF
+ ;;
+  *)  cat >>confdefs.h <<EOF
+#define inline $ac_cv_c_inline
+EOF
+ ;;
+esac
+
+NCURSES_INLINE=
+if test "$ac_cv_c_inline" != no ; then
+	NCURSES_INLINE=inline
+	if test "$INTEL_COMPILER" = yes
+	then
+		:
+	elif test "$CLANG_COMPILER" = yes
+	then
+		:
+	elif test "$GCC" = yes
+	then
+		echo "$as_me:21096: checking if $CC supports options to tune inlining" >&5
+echo $ECHO_N "checking if $CC supports options to tune inlining... $ECHO_C" >&6
+if test "${cf_cv_gcc_inline+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+		cf_save_CFLAGS=$CFLAGS
+		CFLAGS="$CFLAGS --param max-inline-insns-single=1200"
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 21105 "configure"
+#include "confdefs.h"
+inline int foo(void) { return 1; }
+int
+main (void)
+{
+${cf_cv_main_return:-return} foo()
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:21117: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:21120: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:21123: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:21126: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_gcc_inline=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_gcc_inline=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+		CFLAGS=$cf_save_CFLAGS
+
+fi
+echo "$as_me:21138: result: $cf_cv_gcc_inline" >&5
+echo "${ECHO_T}$cf_cv_gcc_inline" >&6
+		if test "$cf_cv_gcc_inline" = yes ; then
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in --param max-inline-insns-single=1200
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+		fi
+	fi
+fi
+
+echo "$as_me:21244: checking for signal global datatype" >&5
+echo $ECHO_N "checking for signal global datatype... $ECHO_C" >&6
+if test "${cf_cv_sig_atomic_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	for cf_type in \
+		"volatile sig_atomic_t" \
+		"sig_atomic_t" \
+		"int"
+	do
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 21256 "configure"
+#include "confdefs.h"
+
+#include <sys/types.h>
+#include <signal.h>
+#include <stdio.h>
+
+extern $cf_type x;
+$cf_type x;
+static void handler(int sig)
+{
+	(void)sig;
+	x = 5;
+}
+int
+main (void)
+{
+signal(SIGINT, handler);
+		 x = 1
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:21280: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:21283: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:21286: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:21289: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_sig_atomic_t=$cf_type
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_sig_atomic_t=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+		test "$cf_cv_sig_atomic_t" != no && break
+	done
+
+fi
+
+echo "$as_me:21303: result: $cf_cv_sig_atomic_t" >&5
+echo "${ECHO_T}$cf_cv_sig_atomic_t" >&6
+test "$cf_cv_sig_atomic_t" != no &&
+cat >>confdefs.h <<EOF
+#define SIG_ATOMIC_T $cf_cv_sig_atomic_t
+EOF
+
+if test "$NCURSES_CHTYPE" = auto ; then
+
+echo "$as_me:21312: checking for type of chtype" >&5
+echo $ECHO_N "checking for type of chtype... $ECHO_C" >&6
+if test "${cf_cv_typeof_chtype+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+		if test "$cross_compiling" = yes; then
+  cf_cv_typeof_chtype=long
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 21322 "configure"
+#include "confdefs.h"
+
+#define WANT_BITS 31
+#include <stdio.h>
+int main(void)
+{
+	FILE *fp = fopen("cf_test.out", "w");
+	if (fp != 0) {
+		char *result = "long";
+		if (sizeof(unsigned long) > sizeof(unsigned int)) {
+			int n;
+			unsigned int x, y;
+			for (n = 0; n < WANT_BITS; n++) {
+				x = (1 << n);
+				y = (x >> n);
+				if (y != 1 || x == 0) {
+					x = 0;
+					break;
+				}
+			}
+			/*
+			 * If x is nonzero, an int is big enough for the bits
+			 * that we want.
+			 */
+			result = (x != 0) ? "int" : "long";
+		}
+		fputs(result, fp);
+		fclose(fp);
+	}
+	${cf_cv_main_return:-return}(0);
+}
+
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:21357: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:21360: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:21362: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:21365: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_typeof_chtype=`cat cf_test.out`
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_typeof_chtype=long
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+		rm -f cf_test.out
+
+fi
+
+echo "$as_me:21380: result: $cf_cv_typeof_chtype" >&5
+echo "${ECHO_T}$cf_cv_typeof_chtype" >&6
+
+cat >>confdefs.h <<EOF
+#define TYPEOF_CHTYPE $cf_cv_typeof_chtype
+EOF
+
+else
+	cf_cv_typeof_chtype=$NCURSES_CHTYPE
+fi
+test "$cf_cv_typeof_chtype" = unsigned && cf_cv_typeof_chtype=""
+
+echo "$as_me:21392: checking if unsigned literals are legal" >&5
+echo $ECHO_N "checking if unsigned literals are legal... $ECHO_C" >&6
+if test "${cf_cv_unsigned_literals+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 21399 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+long x = 1L + 1UL + 1U + 1
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:21411: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:21414: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:21417: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:21420: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_unsigned_literals=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_unsigned_literals=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+
+echo "$as_me:21432: result: $cf_cv_unsigned_literals" >&5
+echo "${ECHO_T}$cf_cv_unsigned_literals" >&6
+
+cf_cv_1UL="1"
+test ".$cf_cv_unsigned_literals" = .yes && cf_cv_1UL="${cf_cv_1UL}U"
+test ".$cf_cv_typeof_chtype"    = .long && cf_cv_1UL="${cf_cv_1UL}L"
+
+if test "$NCURSES_MMASK_T" = auto ; then
+	cf_cv_typeof_mmask_t=long
+else
+	cf_cv_typeof_mmask_t=$NCURSES_MMASK_T
+fi
+test "$cf_cv_typeof_mmask_t" = unsigned && cf_cv_typeof_mmask_t=""
+
+###	Checks for external-data
+
+echo "$as_me:21448: checking if external errno is declared" >&5
+echo $ECHO_N "checking if external errno is declared... $ECHO_C" >&6
+if test "${cf_cv_dcl_errno+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 21455 "configure"
+#include "confdefs.h"
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#include <stdio.h>
+#include <sys/types.h>
+#include <errno.h>
+int
+main (void)
+{
+int x = (int) errno; (void)x
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:21473: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:21476: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:21479: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:21482: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_dcl_errno=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_dcl_errno=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:21493: result: $cf_cv_dcl_errno" >&5
+echo "${ECHO_T}$cf_cv_dcl_errno" >&6
+
+if test "$cf_cv_dcl_errno" = no ; then
+
+cf_result=`echo "decl_errno" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+	cat >>confdefs.h <<EOF
+#define $cf_result 1
+EOF
+
+fi
+
+# It's possible (for near-UNIX clones) that the data doesn't exist
+
+echo "$as_me:21508: checking if external errno exists" >&5
+echo $ECHO_N "checking if external errno exists... $ECHO_C" >&6
+if test "${cf_cv_have_errno+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 21515 "configure"
+#include "confdefs.h"
+
+#undef errno
+extern int errno;
+
+int
+main (void)
+{
+errno = 2
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:21530: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:21533: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:21536: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:21539: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_have_errno=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_have_errno=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:21550: result: $cf_cv_have_errno" >&5
+echo "${ECHO_T}$cf_cv_have_errno" >&6
+
+if test "$cf_cv_have_errno" = yes ; then
+
+cf_result=`echo "have_errno" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+	cat >>confdefs.h <<EOF
+#define $cf_result 1
+EOF
+
+fi
+
+echo "$as_me:21563: checking if data-only library module links" >&5
+echo $ECHO_N "checking if data-only library module links... $ECHO_C" >&6
+if test "${cf_cv_link_dataonly+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	rm -f conftest.a
+	cat >conftest.$ac_ext <<EOF
+#line 21571 "configure"
+int	testdata[3] = { 123, 456, 789 };
+EOF
+	if { (eval echo "$as_me:21574: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:21577: \$? = $ac_status" >&5
+  (exit "$ac_status"); } ; then
+		mv conftest.o data.o && \
+		( $AR $ARFLAGS conftest.a data.o ) 2>&5 1>/dev/null
+	fi
+	rm -f conftest.$ac_ext data.o
+	cat >conftest.$ac_ext <<EOF
+#line 21584 "configure"
+int	testfunc(void)
+{
+#if defined(NeXT)
+	${cf_cv_main_return:-return}(1);	/* I'm told this linker is broken */
+#else
+	extern int testdata[3];
+	return testdata[0] == 123
+	   &&  testdata[1] == 456
+	   &&  testdata[2] == 789;
+#endif
+}
+EOF
+	if { (eval echo "$as_me:21597: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:21600: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; then
+		mv conftest.o func.o && \
+		( $AR $ARFLAGS conftest.a func.o ) 2>&5 1>/dev/null
+	fi
+	rm -f conftest.$ac_ext func.o
+	( eval $RANLIB conftest.a ) 2>&5 >/dev/null
+	cf_saveLIBS="$LIBS"
+	LIBS="conftest.a $LIBS"
+	if test "$cross_compiling" = yes; then
+  cf_cv_link_dataonly=unknown
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 21613 "configure"
+#include "confdefs.h"
+
+	int main(void)
+	{
+		extern int testfunc();
+		${cf_cv_main_return:-return} (!testfunc());
+	}
+
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:21624: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:21627: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:21629: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:21632: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_link_dataonly=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_link_dataonly=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+	LIBS="$cf_saveLIBS"
+
+fi
+
+echo "$as_me:21647: result: $cf_cv_link_dataonly" >&5
+echo "${ECHO_T}$cf_cv_link_dataonly" >&6
+
+if test "$cf_cv_link_dataonly" = no ; then
+
+cat >>confdefs.h <<\EOF
+#define BROKEN_LINKER 1
+EOF
+
+	BROKEN_LINKER=1
+fi
+
+###	Checks for library functions.
+
+for ac_func in \
+fpathconf \
+getcwd \
+getegid \
+geteuid \
+getopt \
+issetugid \
+localeconv \
+poll \
+putenv \
+remove \
+select \
+setbuf \
+setbuffer \
+setenv \
+setfsuid \
+setvbuf \
+sigaction \
+sigvec \
+snprintf \
+strdup \
+strstr \
+sysconf \
+tcgetpgrp \
+times \
+tsearch \
+vsnprintf \
+
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:21691: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 21697 "configure"
+#include "confdefs.h"
+#define $ac_func autoconf_temporary
+#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
+#undef $ac_func
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char $ac_func (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+#error found stub for $ac_func
+#endif
+
+	return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:21728: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:21731: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:21734: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:21737: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_var=no"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:21747: result: `eval echo '${'"$as_ac_var"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6
+if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+echo "$as_me:21757: checking if _PATH_TTYS is defined in ttyent.h" >&5
+echo $ECHO_N "checking if _PATH_TTYS is defined in ttyent.h... $ECHO_C" >&6
+if test "${cf_cv_PATH_TTYS+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 21764 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#include <ttyent.h>
+int
+main (void)
+{
+
+FILE *fp = fopen(_PATH_TTYS, "r"); (void)fp
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:21779: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:21782: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:21785: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:21788: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_PATH_TTYS=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_PATH_TTYS=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:21798: result: $cf_cv_PATH_TTYS" >&5
+echo "${ECHO_T}$cf_cv_PATH_TTYS" >&6
+
+if test $cf_cv_PATH_TTYS = no
+then
+	for cf_ttys in /etc/ttytype /etc/ttys
+	do
+		if test -f $cf_ttys
+		then
+			cf_cv_PATH_TTYS=maybe
+
+cat >>confdefs.h <<\EOF
+#define _PATH_TTYS $cf_ttys
+EOF
+
+			break
+		fi
+	done
+fi
+
+if test $cf_cv_PATH_TTYS != no
+then
+	echo "$as_me:21820: checking if _PATH_TTYS file exists" >&5
+echo $ECHO_N "checking if _PATH_TTYS file exists... $ECHO_C" >&6
+if test "${cf_cv_have_PATH_TTYS+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+		if test "$cross_compiling" = yes; then
+  cf_cv_have_PATH_TTYS=unknown
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 21830 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#include <ttyent.h>
+int main(void) {
+	FILE *fp = fopen(_PATH_TTYS, "r");
+	${cf_cv_main_return:-return} (fp == 0);
+}
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:21841: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:21844: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:21846: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:21849: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_have_PATH_TTYS=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_have_PATH_TTYS=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+fi
+echo "$as_me:21861: result: $cf_cv_have_PATH_TTYS" >&5
+echo "${ECHO_T}$cf_cv_have_PATH_TTYS" >&6
+	test "$cf_cv_have_PATH_TTYS" = no && cf_cv_PATH_TTYS=no
+fi
+
+if test $cf_cv_PATH_TTYS != no
+then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_PATH_TTYS 1
+EOF
+
+	echo "$as_me:21873: checking for getttynam" >&5
+echo $ECHO_N "checking for getttynam... $ECHO_C" >&6
+if test "${cf_cv_func_getttynam+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 21880 "configure"
+#include "confdefs.h"
+#include <ttyent.h>
+int
+main (void)
+{
+struct ttyent *fp = getttynam("/dev/tty"); (void)fp
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:21892: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:21895: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:21898: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:21901: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_func_getttynam=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_func_getttynam=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:21911: result: $cf_cv_func_getttynam" >&5
+echo "${ECHO_T}$cf_cv_func_getttynam" >&6
+	test "$cf_cv_func_getttynam" = yes && cat >>confdefs.h <<\EOF
+#define HAVE_GETTTYNAM 1
+EOF
+
+fi
+
+if test "x$ac_cv_func_getopt" = xno && \
+   test "x$cf_with_progs$cf_with_tests" != xnono; then
+	{ { echo "$as_me:21921: error: getopt is required for building programs" >&5
+echo "$as_me: error: getopt is required for building programs" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+if test "x$with_safe_sprintf" = xyes
+then
+	if test "x$ac_cv_func_vsnprintf" = xyes
+	then
+		{ echo "$as_me:21930: WARNING: will use vsnprintf instead of safe-sprintf option" >&5
+echo "$as_me: WARNING: will use vsnprintf instead of safe-sprintf option" >&2;}
+	else
+
+cat >>confdefs.h <<\EOF
+#define USE_SAFE_SPRINTF 1
+EOF
+
+	fi
+fi
+
+if test "x$with_getcap" = "xyes" ; then
+
+echo "$as_me:21943: checking for terminal-capability database functions" >&5
+echo $ECHO_N "checking for terminal-capability database functions... $ECHO_C" >&6
+if test "${cf_cv_cgetent+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 21950 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+int
+main (void)
+{
+
+	char temp[128];
+	char *buf = temp;
+	char *db_array = temp;
+	cgetent(&buf, &db_array, "vt100");
+	cgetcap(buf, "tc", '=');
+	cgetmatch(buf, "tc");
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:21970: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:21973: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:21976: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:21979: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_cgetent=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_cgetent=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:21990: result: $cf_cv_cgetent" >&5
+echo "${ECHO_T}$cf_cv_cgetent" >&6
+
+if test "$cf_cv_cgetent" = yes
+then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_BSD_CGETENT 1
+EOF
+
+echo "$as_me:22000: checking if cgetent uses const parameter" >&5
+echo $ECHO_N "checking if cgetent uses const parameter... $ECHO_C" >&6
+if test "${cf_cv_cgetent_const+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 22007 "configure"
+#include "confdefs.h"
+
+#pragma GCC diagnostic error "-Wincompatible-pointer-types-discards-qualifiers"
+#include <stdlib.h>
+int
+main (void)
+{
+
+	char temp[128];
+	char *buf = temp;
+#ifndef _NETBSD_SOURCE			/* given, since April 2004 in stdlib.h */
+	const char *db_array = temp;
+	cgetent(&buf, &db_array, "vt100");
+#endif
+	cgetcap(buf, "tc", '=');
+	cgetmatch(buf, "tc");
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:22030: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:22033: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:22036: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:22039: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_cgetent_const=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_cgetent_const=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:22050: result: $cf_cv_cgetent_const" >&5
+echo "${ECHO_T}$cf_cv_cgetent_const" >&6
+	if test "$cf_cv_cgetent_const" = yes
+	then
+
+cat >>confdefs.h <<EOF
+#define CGETENT_CONST const
+EOF
+
+	fi
+fi
+
+fi
+
+echo "$as_me:22064: checking for isascii" >&5
+echo $ECHO_N "checking for isascii... $ECHO_C" >&6
+if test "${cf_cv_have_isascii+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 22071 "configure"
+#include "confdefs.h"
+#include <ctype.h>
+int
+main (void)
+{
+int x = isascii(' ')
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:22083: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:22086: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:22089: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:22092: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_have_isascii=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_have_isascii=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:22103: result: $cf_cv_have_isascii" >&5
+echo "${ECHO_T}$cf_cv_have_isascii" >&6
+test "$cf_cv_have_isascii" = yes &&
+cat >>confdefs.h <<\EOF
+#define HAVE_ISASCII 1
+EOF
+
+if test "$ac_cv_func_sigaction" = yes; then
+echo "$as_me:22111: checking whether sigaction needs _POSIX_SOURCE" >&5
+echo $ECHO_N "checking whether sigaction needs _POSIX_SOURCE... $ECHO_C" >&6
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 22114 "configure"
+#include "confdefs.h"
+
+#include <sys/types.h>
+#include <signal.h>
+int
+main (void)
+{
+struct sigaction act
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:22128: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:22131: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:22134: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:22137: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  sigact_bad=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 22145 "configure"
+#include "confdefs.h"
+
+#define _POSIX_SOURCE
+#include <sys/types.h>
+#include <signal.h>
+int
+main (void)
+{
+struct sigaction act
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:22160: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:22163: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:22166: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:22169: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  sigact_bad=yes
+
+cat >>confdefs.h <<\EOF
+#define _POSIX_SOURCE 1
+EOF
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+sigact_bad=unknown
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+echo "$as_me:22185: result: $sigact_bad" >&5
+echo "${ECHO_T}$sigact_bad" >&6
+fi
+
+echo "$as_me:22189: checking if nanosleep really works" >&5
+echo $ECHO_N "checking if nanosleep really works... $ECHO_C" >&6
+if test "${cf_cv_func_nanosleep+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+if test "$cross_compiling" = yes; then
+  cf_cv_func_nanosleep=unknown
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 22199 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#include <errno.h>
+#include <time.h>
+
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+
+int main(void) {
+	struct timespec ts1, ts2;
+	int code;
+	ts1.tv_sec  = 0;
+	ts1.tv_nsec = 750000000;
+	ts2.tv_sec  = 0;
+	ts2.tv_nsec = 0;
+	errno = 0;
+	code = nanosleep(&ts1, &ts2); /* on failure errno is ENOSYS. */
+	${cf_cv_main_return:-return}(code != 0);
+}
+
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:22224: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:22227: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:22229: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:22232: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_func_nanosleep=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_func_nanosleep=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+fi
+echo "$as_me:22244: result: $cf_cv_func_nanosleep" >&5
+echo "${ECHO_T}$cf_cv_func_nanosleep" >&6
+
+test "$cf_cv_func_nanosleep" = "yes" &&
+cat >>confdefs.h <<\EOF
+#define HAVE_NANOSLEEP 1
+EOF
+
+for ac_header in \
+termio.h \
+termios.h \
+unistd.h \
+sys/ioctl.h \
+sys/termio.h \
+
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:22261: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 22267 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:22271: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:22277: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:22296: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+if test "$ac_cv_header_termios_h" = yes ; then
+	case "$CFLAGS $CPPFLAGS" in
+	(*-D_POSIX_SOURCE*)
+		termios_bad=dunno ;;
+	(*)	termios_bad=maybe ;;
+	esac
+	if test "$termios_bad" = maybe ; then
+	echo "$as_me:22313: checking whether termios.h needs _POSIX_SOURCE" >&5
+echo $ECHO_N "checking whether termios.h needs _POSIX_SOURCE... $ECHO_C" >&6
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 22316 "configure"
+#include "confdefs.h"
+#include <termios.h>
+int
+main (void)
+{
+struct termios foo; int x = foo.c_iflag = 1; (void)x
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:22328: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:22331: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:22334: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:22337: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  termios_bad=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 22345 "configure"
+#include "confdefs.h"
+
+#define _POSIX_SOURCE
+#include <termios.h>
+int
+main (void)
+{
+struct termios foo; int x = foo.c_iflag = 2; (void)x
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:22359: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:22362: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:22365: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:22368: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  termios_bad=unknown
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+termios_bad=yes
+cat >>confdefs.h <<\EOF
+#define _POSIX_SOURCE 1
+EOF
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+	echo "$as_me:22384: result: $termios_bad" >&5
+echo "${ECHO_T}$termios_bad" >&6
+	fi
+fi
+
+echo "$as_me:22389: checking for tcgetattr" >&5
+echo $ECHO_N "checking for tcgetattr... $ECHO_C" >&6
+if test "${cf_cv_have_tcgetattr+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 22396 "configure"
+#include "confdefs.h"
+
+#include <sys/types.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_TERMIOS_H
+#include <termios.h>
+#define TTY struct termios
+#else
+#ifdef HAVE_TERMIO_H
+#include <termio.h>
+#define TTY struct termio
+#endif
+#endif
+
+int
+main (void)
+{
+
+TTY foo;
+tcgetattr(1, &foo);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:22424: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:22427: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:22430: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:22433: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_have_tcgetattr=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_have_tcgetattr=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:22443: result: $cf_cv_have_tcgetattr" >&5
+echo "${ECHO_T}$cf_cv_have_tcgetattr" >&6
+test "$cf_cv_have_tcgetattr" = yes &&
+cat >>confdefs.h <<\EOF
+#define HAVE_TCGETATTR 1
+EOF
+
+echo "$as_me:22450: checking for vsscanf function or workaround" >&5
+echo $ECHO_N "checking for vsscanf function or workaround... $ECHO_C" >&6
+if test "${cf_cv_func_vsscanf+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 22457 "configure"
+#include "confdefs.h"
+
+#include <stdarg.h>
+#include <stdio.h>
+int
+main (void)
+{
+
+	va_list ap;
+	vsscanf("from", "%d", ap)
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:22473: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:22476: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:22479: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:22482: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_func_vsscanf=vsscanf
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 22490 "configure"
+#include "confdefs.h"
+
+#include <stdarg.h>
+#include <stdio.h>
+int
+main (void)
+{
+
+	FILE strbuf;
+	char *str = "from";
+
+	strbuf._flag = _IOREAD;
+	strbuf._ptr = strbuf._base = (unsigned char *) str;
+	strbuf._cnt = strlen(str);
+	strbuf._file = _NFILE;
+	return (vfscanf(&strbuf, "%d", ap))
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:22512: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:22515: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:22518: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:22521: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_func_vsscanf=vfscanf
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 22529 "configure"
+#include "confdefs.h"
+
+#include <stdarg.h>
+#include <stdio.h>
+int
+main (void)
+{
+
+	FILE strbuf;
+	char *str = "from";
+
+	strbuf._flag = _IOREAD;
+	strbuf._ptr = strbuf._base = (unsigned char *) str;
+	strbuf._cnt = strlen(str);
+	strbuf._file = _NFILE;
+	return (_doscan(&strbuf, "%d", ap))
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:22551: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:22554: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:22557: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:22560: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_func_vsscanf=_doscan
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+cf_cv_func_vsscanf=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:22575: result: $cf_cv_func_vsscanf" >&5
+echo "${ECHO_T}$cf_cv_func_vsscanf" >&6
+
+case "$cf_cv_func_vsscanf" in
+(vsscanf)
+cat >>confdefs.h <<\EOF
+#define HAVE_VSSCANF 1
+EOF
+;;
+(vfscanf)
+cat >>confdefs.h <<\EOF
+#define HAVE_VFSCANF 1
+EOF
+;;
+(_doscan)
+cat >>confdefs.h <<\EOF
+#define HAVE__DOSCAN 1
+EOF
+;;
+esac
+
+for ac_header in \
+unistd.h \
+
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:22601: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 22607 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:22611: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:22617: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:22636: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+echo "$as_me:22646: checking for working mkstemp" >&5
+echo $ECHO_N "checking for working mkstemp... $ECHO_C" >&6
+if test "${cf_cv_func_mkstemp+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+rm -rf ./conftest*
+if test "$cross_compiling" = yes; then
+  cf_cv_func_mkstemp=maybe
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 22657 "configure"
+#include "confdefs.h"
+
+#include <sys/types.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/stat.h>
+int main(void)
+{
+	char *tmpl = "conftestXXXXXX";
+	char name[2][80];
+	int n;
+	int result = 0;
+	int fd;
+	struct stat sb;
+
+	umask(077);
+	for (n = 0; n < 2; ++n) {
+		strcpy(name[n], tmpl);
+		if ((fd = mkstemp(name[n])) >= 0) {
+			if (!strcmp(name[n], tmpl)
+			 || stat(name[n], &sb) != 0
+			 || (sb.st_mode & S_IFMT) != S_IFREG
+			 || (sb.st_mode & 077) != 0) {
+				result = 1;
+			}
+			close(fd);
+		}
+	}
+	if (result == 0
+	 && !strcmp(name[0], name[1]))
+		result = 1;
+	${cf_cv_main_return:-return}(result);
+}
+
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:22698: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:22701: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:22703: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:22706: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_func_mkstemp=yes
+
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_func_mkstemp=no
+
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+
+fi
+echo "$as_me:22721: result: $cf_cv_func_mkstemp" >&5
+echo "${ECHO_T}$cf_cv_func_mkstemp" >&6
+if test "x$cf_cv_func_mkstemp" = xmaybe ; then
+	echo "$as_me:22724: checking for mkstemp" >&5
+echo $ECHO_N "checking for mkstemp... $ECHO_C" >&6
+if test "${ac_cv_func_mkstemp+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 22730 "configure"
+#include "confdefs.h"
+#define mkstemp autoconf_temporary
+#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
+#undef mkstemp
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char mkstemp (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_mkstemp) || defined (__stub___mkstemp)
+#error found stub for mkstemp
+#endif
+
+	return mkstemp ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:22761: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:22764: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:22767: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:22770: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_func_mkstemp=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_mkstemp=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:22780: result: $ac_cv_func_mkstemp" >&5
+echo "${ECHO_T}$ac_cv_func_mkstemp" >&6
+
+fi
+if test "x$cf_cv_func_mkstemp" = xyes || test "x$ac_cv_func_mkstemp" = xyes ; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_MKSTEMP 1
+EOF
+
+fi
+
+# setup for prototype of fallback for vsscanf()
+
+if test "$cf_cv_func_vsscanf" = vsscanf ; then
+	HAVE_VSSCANF=1
+else
+	HAVE_VSSCANF=0
+fi
+
+if test "x$cross_compiling" = xyes ; then
+	{ echo "$as_me:22801: WARNING: cross compiling: assume setvbuf params not reversed" >&5
+echo "$as_me: WARNING: cross compiling: assume setvbuf params not reversed" >&2;}
+else
+	echo "$as_me:22804: checking whether setvbuf arguments are reversed" >&5
+echo $ECHO_N "checking whether setvbuf arguments are reversed... $ECHO_C" >&6
+if test "${ac_cv_func_setvbuf_reversed+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$cross_compiling" = yes; then
+  { { echo "$as_me:22810: error: cannot run test program while cross compiling" >&5
+echo "$as_me: error: cannot run test program while cross compiling" >&2;}
+   { (exit 1); exit 1; }; }
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 22815 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+/* If setvbuf has the reversed format, exit 0. */
+int
+main (void)
+{
+  /* This call has the arguments reversed.
+     A reversed system may check and see that the address of main
+     is not _IOLBF, _IONBF, or _IOFBF, and return nonzero.  */
+  if (setvbuf(stdout, _IOLBF, (char *) main, BUFSIZ) != 0)
+    $ac_main_return(1);
+  putc('\r', stdout);
+  $ac_main_return(0);			/* Non-reversed systems segv here.  */
+}
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:22832: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:22835: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:22837: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:22840: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_func_setvbuf_reversed=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_setvbuf_reversed=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+rm -f core ./core.* ./*.core
+fi
+echo "$as_me:22853: result: $ac_cv_func_setvbuf_reversed" >&5
+echo "${ECHO_T}$ac_cv_func_setvbuf_reversed" >&6
+if test $ac_cv_func_setvbuf_reversed = yes; then
+
+cat >>confdefs.h <<\EOF
+#define SETVBUF_REVERSED 1
+EOF
+
+fi
+
+fi
+echo "$as_me:22864: checking for intptr_t" >&5
+echo $ECHO_N "checking for intptr_t... $ECHO_C" >&6
+if test "${ac_cv_type_intptr_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 22870 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+if ((intptr_t *) 0)
+  return 0;
+if (sizeof (intptr_t))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:22885: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:22888: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:22891: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:22894: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_type_intptr_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_type_intptr_t=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:22904: result: $ac_cv_type_intptr_t" >&5
+echo "${ECHO_T}$ac_cv_type_intptr_t" >&6
+if test "$ac_cv_type_intptr_t" = yes; then
+  :
+else
+
+cat >>confdefs.h <<EOF
+#define intptr_t long
+EOF
+
+fi
+
+echo "$as_me:22916: checking for ssize_t" >&5
+echo $ECHO_N "checking for ssize_t... $ECHO_C" >&6
+if test "${ac_cv_type_ssize_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 22922 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+if ((ssize_t *) 0)
+  return 0;
+if (sizeof (ssize_t))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:22937: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:22940: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:22943: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:22946: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_type_ssize_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_type_ssize_t=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:22956: result: $ac_cv_type_ssize_t" >&5
+echo "${ECHO_T}$ac_cv_type_ssize_t" >&6
+if test "$ac_cv_type_ssize_t" = yes; then
+  :
+else
+
+cat >>confdefs.h <<EOF
+#define ssize_t int
+EOF
+
+fi
+
+echo "$as_me:22968: checking for type sigaction_t" >&5
+echo $ECHO_N "checking for type sigaction_t... $ECHO_C" >&6
+if test "${cf_cv_type_sigaction+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 22975 "configure"
+#include "confdefs.h"
+
+#include <signal.h>
+int
+main (void)
+{
+sigaction_t x
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:22988: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:22991: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:22994: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:22997: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_type_sigaction=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_type_sigaction=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+
+echo "$as_me:23008: result: $cf_cv_type_sigaction" >&5
+echo "${ECHO_T}$cf_cv_type_sigaction" >&6
+test "$cf_cv_type_sigaction" = yes &&
+cat >>confdefs.h <<\EOF
+#define HAVE_TYPE_SIGACTION 1
+EOF
+
+echo "$as_me:23015: checking declaration of size-change" >&5
+echo $ECHO_N "checking declaration of size-change... $ECHO_C" >&6
+if test "${cf_cv_sizechange+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cf_cv_sizechange=unknown
+	cf_save_CPPFLAGS="$CPPFLAGS"
+
+for cf_opts in "" "NEED_PTEM_H"
+do
+
+	CPPFLAGS="$cf_save_CPPFLAGS"
+	if test -n "$cf_opts"
+	then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-D$cf_opts"
+
+	fi
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 23036 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#ifdef HAVE_TERMIOS_H
+#include <termios.h>
+#else
+#ifdef HAVE_TERMIO_H
+#include <termio.h>
+#endif
+#endif
+
+#ifdef NEED_PTEM_H
+/* This is a workaround for SCO:  they neglected to define struct winsize in
+ * termios.h -- it is only in termio.h and ptem.h
+ */
+#include <sys/stream.h>
+#include <sys/ptem.h>
+#endif
+
+#ifdef HAVE_SYS_IOCTL_H
+#include <sys/ioctl.h>
+#endif
+
+int
+main (void)
+{
+
+#ifdef TIOCGSIZE
+	struct ttysize win;	/* SunOS 3.0... */
+	int y = win.ts_lines = 2;
+	int x = win.ts_cols = 1;
+	(void)y;
+	(void)x;
+#else
+#ifdef TIOCGWINSZ
+	struct winsize win;	/* everything else */
+	int y = win.ws_row = 2;
+	int x = win.ws_col = 1;
+	(void)y;
+	(void)x;
+#else
+	no TIOCGSIZE or TIOCGWINSZ
+#endif /* TIOCGWINSZ */
+#endif /* TIOCGSIZE */
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:23086: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:23089: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:23092: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:23095: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_sizechange=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_sizechange=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+	CPPFLAGS="$cf_save_CPPFLAGS"
+	if test "$cf_cv_sizechange" = yes ; then
+		echo "size-change succeeded ($cf_opts)" >&5
+		test -n "$cf_opts" && cf_cv_sizechange="$cf_opts"
+		break
+	fi
+done
+
+fi
+echo "$as_me:23114: result: $cf_cv_sizechange" >&5
+echo "${ECHO_T}$cf_cv_sizechange" >&6
+if test "$cf_cv_sizechange" != no ; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_SIZECHANGE 1
+EOF
+
+	case "$cf_cv_sizechange" in
+	(NEED*)
+		cat >>confdefs.h <<EOF
+#define $cf_cv_sizechange  1
+EOF
+
+		;;
+	esac
+fi
+
+echo "$as_me:23132: checking for memmove" >&5
+echo $ECHO_N "checking for memmove... $ECHO_C" >&6
+if test "${ac_cv_func_memmove+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 23138 "configure"
+#include "confdefs.h"
+#define memmove autoconf_temporary
+#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
+#undef memmove
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char memmove (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_memmove) || defined (__stub___memmove)
+#error found stub for memmove
+#endif
+
+	return memmove ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:23169: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:23172: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:23175: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:23178: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_func_memmove=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_memmove=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:23188: result: $ac_cv_func_memmove" >&5
+echo "${ECHO_T}$ac_cv_func_memmove" >&6
+if test "$ac_cv_func_memmove" = yes; then
+  :
+else
+
+echo "$as_me:23194: checking for bcopy" >&5
+echo $ECHO_N "checking for bcopy... $ECHO_C" >&6
+if test "${ac_cv_func_bcopy+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 23200 "configure"
+#include "confdefs.h"
+#define bcopy autoconf_temporary
+#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
+#undef bcopy
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char bcopy (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_bcopy) || defined (__stub___bcopy)
+#error found stub for bcopy
+#endif
+
+	return bcopy ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:23231: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:23234: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:23237: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:23240: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_func_bcopy=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_bcopy=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:23250: result: $ac_cv_func_bcopy" >&5
+echo "${ECHO_T}$ac_cv_func_bcopy" >&6
+if test "$ac_cv_func_bcopy" = yes; then
+
+	echo "$as_me:23254: checking if bcopy does overlapping moves" >&5
+echo $ECHO_N "checking if bcopy does overlapping moves... $ECHO_C" >&6
+if test "${cf_cv_good_bcopy+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+		if test "$cross_compiling" = yes; then
+  cf_cv_good_bcopy=unknown
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 23264 "configure"
+#include "confdefs.h"
+
+int main(void) {
+	static char data[] = "abcdefghijklmnopqrstuwwxyz";
+	char temp[40];
+	bcopy(data, temp, sizeof(data));
+	bcopy(temp+10, temp, 15);
+	bcopy(temp+5, temp+15, 10);
+	${cf_cv_main_return:-return} (strcmp(temp, "klmnopqrstuwwxypqrstuwwxyz"));
+}
+
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:23278: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:23281: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:23283: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:23286: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_good_bcopy=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_good_bcopy=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+
+fi
+echo "$as_me:23299: result: $cf_cv_good_bcopy" >&5
+echo "${ECHO_T}$cf_cv_good_bcopy" >&6
+
+else
+  cf_cv_good_bcopy=no
+fi
+
+	if test "$cf_cv_good_bcopy" = yes ; then
+
+cat >>confdefs.h <<\EOF
+#define USE_OK_BCOPY 1
+EOF
+
+	else
+
+cat >>confdefs.h <<\EOF
+#define USE_MY_MEMMOVE 1
+EOF
+
+	fi
+
+fi
+
+tty >/dev/null 2>&1 || {
+for ac_func in posix_openpt
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:23326: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 23332 "configure"
+#include "confdefs.h"
+#define $ac_func autoconf_temporary
+#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
+#undef $ac_func
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char $ac_func (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+#error found stub for $ac_func
+#endif
+
+	return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:23363: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:23366: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:23369: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:23372: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_var=no"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:23382: result: `eval echo '${'"$as_ac_var"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6
+if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+ }
+echo "$as_me:23392: checking if poll really works" >&5
+echo $ECHO_N "checking if poll really works... $ECHO_C" >&6
+if test "${cf_cv_working_poll+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+if test "$cross_compiling" = yes; then
+  cf_cv_working_poll=unknown
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 23402 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <fcntl.h>
+#ifdef HAVE_POLL_H
+#include <poll.h>
+#else
+#include <sys/poll.h>
+#endif
+int main(void) {
+	struct pollfd myfds;
+	int ret;
+
+	/* check for Darwin bug with respect to "devices" */
+	myfds.fd = open("/dev/null", 1);	/* O_WRONLY */
+	if (myfds.fd < 0)
+		myfds.fd = 0;
+	myfds.events = POLLIN;
+	myfds.revents = 0;
+
+	ret = poll(&myfds, 1, 100);
+
+	if (ret < 0 || (myfds.revents & POLLNVAL)) {
+		ret = -1;
+	} else {
+		int fd = 0;
+		if (!isatty(fd)) {
+			fd = open("/dev/tty", 2);	/* O_RDWR */
+		}
+#ifdef HAVE_POSIX_OPENPT
+		if (fd < 0) {
+			fd = posix_openpt(O_RDWR);
+		}
+#endif
+
+		if (fd >= 0) {
+			/* also check with standard input */
+			myfds.fd = fd;
+			myfds.events = POLLIN;
+			myfds.revents = 0;
+			ret = poll(&myfds, 1, 100);
+		} else {
+			ret = -1;
+		}
+	}
+	${cf_cv_main_return:-return}(ret < 0);
+}
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:23454: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:23457: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:23459: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:23462: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_working_poll=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_working_poll=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+fi
+echo "$as_me:23474: result: $cf_cv_working_poll" >&5
+echo "${ECHO_T}$cf_cv_working_poll" >&6
+test "$cf_cv_working_poll" = "yes" &&
+cat >>confdefs.h <<\EOF
+#define HAVE_WORKING_POLL 1
+EOF
+
+echo "$as_me:23481: checking for va_copy" >&5
+echo $ECHO_N "checking for va_copy... $ECHO_C" >&6
+if test "${cf_cv_have_va_copy+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 23488 "configure"
+#include "confdefs.h"
+
+#include <stdarg.h>
+
+int
+main (void)
+{
+
+	static va_list dst;
+	static va_list src;
+	va_copy(dst, src)
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:23505: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:23508: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:23511: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:23514: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_have_va_copy=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_have_va_copy=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:23524: result: $cf_cv_have_va_copy" >&5
+echo "${ECHO_T}$cf_cv_have_va_copy" >&6
+
+if test "$cf_cv_have_va_copy" = yes;
+then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_VA_COPY 1
+EOF
+
+else # !cf_cv_have_va_copy
+
+echo "$as_me:23536: checking for __va_copy" >&5
+echo $ECHO_N "checking for __va_copy... $ECHO_C" >&6
+if test "${cf_cv_have___va_copy+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 23543 "configure"
+#include "confdefs.h"
+
+#include <stdarg.h>
+
+int
+main (void)
+{
+
+	static va_list dst;
+	static va_list src;
+	__va_copy(dst, src)
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:23560: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:23563: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:23566: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:23569: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_have___va_copy=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_have___va_copy=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:23579: result: $cf_cv_have___va_copy" >&5
+echo "${ECHO_T}$cf_cv_have___va_copy" >&6
+
+if test "$cf_cv_have___va_copy" = yes
+then
+
+cat >>confdefs.h <<\EOF
+#define HAVE___VA_COPY 1
+EOF
+
+else # !cf_cv_have___va_copy
+
+echo "$as_me:23591: checking for __builtin_va_copy" >&5
+echo $ECHO_N "checking for __builtin_va_copy... $ECHO_C" >&6
+if test "${cf_cv_have___builtin_va_copy+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 23598 "configure"
+#include "confdefs.h"
+
+#include <stdarg.h>
+
+int
+main (void)
+{
+
+	static va_list dst;
+	static va_list src;
+	__builtin_va_copy(dst, src)
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:23615: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:23618: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:23621: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:23624: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_have___builtin_va_copy=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_have___builtin_va_copy=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:23634: result: $cf_cv_have___builtin_va_copy" >&5
+echo "${ECHO_T}$cf_cv_have___builtin_va_copy" >&6
+
+test "$cf_cv_have___builtin_va_copy" = yes &&
+
+cat >>confdefs.h <<\EOF
+#define HAVE___BUILTIN_VA_COPY 1
+EOF
+
+fi # cf_cv_have___va_copy
+
+fi # cf_cv_have_va_copy
+
+case "${cf_cv_have_va_copy}${cf_cv_have___va_copy}${cf_cv_have___builtin_va_copy}" in
+(*yes*)
+	;;
+
+(*)
+	echo "$as_me:23652: checking if we can simply copy va_list" >&5
+echo $ECHO_N "checking if we can simply copy va_list... $ECHO_C" >&6
+if test "${cf_cv_pointer_va_list+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 23659 "configure"
+#include "confdefs.h"
+
+#include <stdarg.h>
+
+int
+main (void)
+{
+
+	va_list dst;
+	va_list src;
+	dst = src
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:23676: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:23679: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:23682: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:23685: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_pointer_va_list=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_pointer_va_list=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:23695: result: $cf_cv_pointer_va_list" >&5
+echo "${ECHO_T}$cf_cv_pointer_va_list" >&6
+
+	if test "$cf_cv_pointer_va_list" = no
+	then
+		echo "$as_me:23700: checking if we can copy va_list indirectly" >&5
+echo $ECHO_N "checking if we can copy va_list indirectly... $ECHO_C" >&6
+if test "${cf_cv_array_va_list+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 23707 "configure"
+#include "confdefs.h"
+
+#include <stdarg.h>
+
+int
+main (void)
+{
+
+	va_list dst;
+	va_list src;
+	*dst = *src
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:23724: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:23727: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:23730: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:23733: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_array_va_list=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_array_va_list=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:23743: result: $cf_cv_array_va_list" >&5
+echo "${ECHO_T}$cf_cv_array_va_list" >&6
+		test "$cf_cv_array_va_list" = yes &&
+cat >>confdefs.h <<\EOF
+#define ARRAY_VA_LIST 1
+EOF
+
+	fi
+	;;
+esac
+
+echo "$as_me:23754: checking for pid_t" >&5
+echo $ECHO_N "checking for pid_t... $ECHO_C" >&6
+if test "${ac_cv_type_pid_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 23760 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+if ((pid_t *) 0)
+  return 0;
+if (sizeof (pid_t))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:23775: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:23778: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:23781: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:23784: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_type_pid_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_type_pid_t=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:23794: result: $ac_cv_type_pid_t" >&5
+echo "${ECHO_T}$ac_cv_type_pid_t" >&6
+if test "$ac_cv_type_pid_t" = yes; then
+  :
+else
+
+cat >>confdefs.h <<EOF
+#define pid_t int
+EOF
+
+fi
+
+for ac_header in unistd.h vfork.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:23809: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 23815 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:23819: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:23825: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:23844: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+for ac_func in fork vfork
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:23857: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 23863 "configure"
+#include "confdefs.h"
+#define $ac_func autoconf_temporary
+#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
+#undef $ac_func
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char $ac_func (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+#error found stub for $ac_func
+#endif
+
+	return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:23894: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:23897: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:23900: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:23903: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_var=no"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:23913: result: `eval echo '${'"$as_ac_var"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6
+if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+ac_cv_func_fork_works=$ac_cv_func_fork
+if test "x$ac_cv_func_fork" = xyes; then
+  echo "$as_me:23925: checking for working fork" >&5
+echo $ECHO_N "checking for working fork... $ECHO_C" >&6
+if test "${ac_cv_func_fork_works+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$cross_compiling" = yes; then
+  ac_cv_func_fork_works=cross
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+/* By Rüdiger Kuhlmann. */
+      #include <sys/types.h>
+      #if HAVE_UNISTD_H
+      # include <unistd.h>
+      #endif
+      /* Some systems only have a dummy stub for fork() */
+      int main (void)
+      {
+        if (fork() < 0)
+          $ac_main_return (1);
+        $ac_main_return (0);
+      }
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:23948: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:23951: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:23953: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:23956: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_func_fork_works=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_fork_works=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+fi
+echo "$as_me:23968: result: $ac_cv_func_fork_works" >&5
+echo "${ECHO_T}$ac_cv_func_fork_works" >&6
+
+fi
+if test "x$ac_cv_func_fork_works" = xcross; then
+  case $host in
+    *-*-amigaos* | *-*-msdosdjgpp*)
+      # Override, as these systems have only a dummy fork() stub
+      ac_cv_func_fork_works=no
+      ;;
+    *)
+      ac_cv_func_fork_works=yes
+      ;;
+  esac
+  { echo "$as_me:23982: WARNING: CROSS: Result $ac_cv_func_fork_works guessed due to cross-compiling." >&5
+echo "$as_me: WARNING: CROSS: Result $ac_cv_func_fork_works guessed due to cross-compiling." >&2;}
+fi
+ac_cv_func_vfork_works=$ac_cv_func_vfork
+if test "x$ac_cv_func_vfork" = xyes; then
+  echo "$as_me:23987: checking for working vfork" >&5
+echo $ECHO_N "checking for working vfork... $ECHO_C" >&6
+if test "${ac_cv_func_vfork_works+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$cross_compiling" = yes; then
+  ac_cv_func_vfork_works=cross
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 23996 "configure"
+#include "confdefs.h"
+/* Thanks to Paul Eggert for this test.  */
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#if HAVE_VFORK_H
+# include <vfork.h>
+#endif
+/* On some sparc systems, changes by the child to local and incoming
+   argument registers are propagated back to the parent.  The compiler
+   is told about this with #include <vfork.h>, but some compilers
+   (e.g. gcc -O) don't grok <vfork.h>.  Test for this by using a
+   static variable whose address is put into a register that is
+   clobbered by the vfork.  */
+static
+#ifdef __cplusplus
+sparc_address_test (int arg)
+# else
+sparc_address_test (arg) int arg;
+#endif
+{
+  static pid_t child;
+  if (!child) {
+    child = vfork ();
+    if (child < 0) {
+      perror ("vfork");
+      _exit(2);
+    }
+    if (!child) {
+      arg = getpid();
+      write(-1, "", 0);
+      _exit (arg);
+    }
+  }
+}
+
+int
+main (void)
+{
+  pid_t parent = getpid ();
+  pid_t child;
+
+  sparc_address_test ();
+
+  child = vfork ();
+
+  if (child == 0) {
+    /* Here is another test for sparc vfork register problems.  This
+       test uses lots of local variables, at least as many local
+       variables as main has allocated so far including compiler
+       temporaries.  4 locals are enough for gcc 1.40.3 on a Solaris
+       4.1.3 sparc, but we use 8 to be safe.  A buggy compiler should
+       reuse the register of parent for one of the local variables,
+       since it will think that parent can't possibly be used any more
+       in this routine.  Assigning to the local variable will thus
+       munge parent in the parent process.  */
+    pid_t
+      p = getpid(), p1 = getpid(), p2 = getpid(), p3 = getpid(),
+      p4 = getpid(), p5 = getpid(), p6 = getpid(), p7 = getpid();
+    /* Convince the compiler that p..p7 are live; otherwise, it might
+       use the same hardware register for all 8 local variables.  */
+    if (p != p1 || p != p2 || p != p3 || p != p4
+	|| p != p5 || p != p6 || p != p7)
+      _exit(1);
+
+    /* On some systems (e.g. IRIX 3.3), vfork doesn't separate parent
+       from child file descriptors.  If the child closes a descriptor
+       before it execs or exits, this munges the parent's descriptor
+       as well.  Test for this by closing stdout in the child.  */
+    _exit(close(fileno(stdout)) != 0);
+  } else {
+    int status;
+    struct stat st;
+
+    while (wait(&status) != child)
+      ;
+    $ac_main_return(
+	 /* Was there some problem with vforking?  */
+	 child < 0
+
+	 /* Did the child fail?  (This shouldn't happen.)  */
+	 || status
+
+	 /* Did the vfork/compiler bug occur?  */
+	 || parent != getpid()
+
+	 /* Did the file descriptor bug occur?  */
+	 || fstat(fileno(stdout), &st) != 0
+	 );
+  }
+}
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:24093: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:24096: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:24098: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:24101: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_func_vfork_works=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_vfork_works=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+fi
+echo "$as_me:24113: result: $ac_cv_func_vfork_works" >&5
+echo "${ECHO_T}$ac_cv_func_vfork_works" >&6
+
+fi;
+if test "x$ac_cv_func_fork_works" = xcross; then
+  ac_cv_func_vfork_works=ac_cv_func_vfork
+  { echo "$as_me:24119: WARNING: CROSS: Result $ac_cv_func_vfork_works guessed due to cross-compiling." >&5
+echo "$as_me: WARNING: CROSS: Result $ac_cv_func_vfork_works guessed due to cross-compiling." >&2;}
+fi
+
+if test "x$ac_cv_func_vfork_works" = xyes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_WORKING_VFORK 1
+EOF
+
+else
+
+cat >>confdefs.h <<\EOF
+#define vfork fork
+EOF
+
+fi
+if test "x$ac_cv_func_fork_works" = xyes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_WORKING_FORK 1
+EOF
+
+fi
+
+echo "$as_me:24144: checking if fopen accepts explicit binary mode" >&5
+echo $ECHO_N "checking if fopen accepts explicit binary mode... $ECHO_C" >&6
+if test "${cf_cv_fopen_bin_r+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	if test "$cross_compiling" = yes; then
+  cf_cv_fopen_bin_r=unknown
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 24154 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+int main(void) {
+	FILE *fp = fopen("conftest.tmp", "wb");
+	int rc = 0;
+	if (fp != 0) {
+		int p, q;
+		for (p = 0; p < 256; ++p) {
+			fputc(p, fp);
+		}
+		fclose(fp);
+		fp = fopen("conftest.tmp", "rb");
+		if (fp != 0) {
+			for (p = 0; p < 256; ++p) {
+				q = fgetc(fp);
+				if (q != p) {
+					rc = 1;
+					break;
+				}
+			}
+		} else {
+			rc = 1;
+		}
+	} else {
+		rc = 1;
+	}
+	${cf_cv_main_return:-return} (rc);
+}
+
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:24187: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:24190: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:24192: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:24195: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_fopen_bin_r=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_fopen_bin_r=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+
+fi
+echo "$as_me:24208: result: $cf_cv_fopen_bin_r" >&5
+echo "${ECHO_T}$cf_cv_fopen_bin_r" >&6
+test "x$cf_cv_fopen_bin_r" != xno &&
+cat >>confdefs.h <<\EOF
+#define USE_FOPEN_BIN_R 1
+EOF
+
+# special check for test/ditto.c
+
+echo "$as_me:24217: checking for openpty in -lutil" >&5
+echo $ECHO_N "checking for openpty in -lutil... $ECHO_C" >&6
+if test "${ac_cv_lib_util_openpty+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lutil  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 24225 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char openpty ();
+int
+main (void)
+{
+openpty ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:24244: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:24247: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:24250: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:24253: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_util_openpty=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_util_openpty=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:24264: result: $ac_cv_lib_util_openpty" >&5
+echo "${ECHO_T}$ac_cv_lib_util_openpty" >&6
+if test "$ac_cv_lib_util_openpty" = yes; then
+  cf_cv_lib_util=yes
+else
+  cf_cv_lib_util=no
+fi
+
+echo "$as_me:24272: checking for openpty header" >&5
+echo $ECHO_N "checking for openpty header... $ECHO_C" >&6
+if test "${cf_cv_func_openpty+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cf_save_LIBS="$LIBS"
+	test "$cf_cv_lib_util" = yes && {
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lutil; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+ }
+	for cf_header in pty.h libutil.h util.h
+	do
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 24299 "configure"
+#include "confdefs.h"
+
+#include <$cf_header>
+
+int
+main (void)
+{
+
+	int x = openpty((int *)0, (int *)0, (char *)0,
+				   (struct termios *)0, (struct winsize *)0);
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:24316: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:24319: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:24322: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:24325: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+		cf_cv_func_openpty=$cf_header
+		break
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+		cf_cv_func_openpty=no
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+	done
+	LIBS="$cf_save_LIBS"
+
+fi
+echo "$as_me:24343: result: $cf_cv_func_openpty" >&5
+echo "${ECHO_T}$cf_cv_func_openpty" >&6
+
+if test "$cf_cv_func_openpty" != no ; then
+
+cat >>confdefs.h <<EOF
+#define USE_OPENPTY_HEADER <$cf_cv_func_openpty>
+EOF
+
+cat >>confdefs.h <<\EOF
+#define USE_XTERM_PTY 1
+EOF
+
+	if test "x$cf_cv_lib_util" = xyes ; then
+
+cf_add_libs="$TEST_LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lutil; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+TEST_LIBS="$cf_add_libs"
+
+	fi
+fi
+
+if test "$with_hashed_db" != no ; then
+
+cat >>confdefs.h <<\EOF
+#define USE_HASHED_DB 1
+EOF
+
+case $with_hashed_db in
+(yes|*able*)
+	;;
+(*)
+	if test -d "$with_hashed_db" ; then
+
+if test -n "$with_hashed_db/include" ; then
+  for cf_add_incdir in $with_hashed_db/include
+  do
+	while test "$cf_add_incdir" != /usr/include
+	do
+	  if test -d "$cf_add_incdir"
+	  then
+		cf_have_incdir=no
+		if test -n "$CFLAGS$CPPFLAGS" ; then
+		  # a loop is needed to ensure we can add subdirs of existing dirs
+		  for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+			if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+			  cf_have_incdir=yes; break
+			fi
+		  done
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  if test "$cf_add_incdir" = /usr/local/include ; then
+			if test "$GCC" = yes
+			then
+			  cf_save_CPPFLAGS=$CPPFLAGS
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+			  cat >"conftest.$ac_ext" <<_ACEOF
+#line 24416 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:24428: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:24431: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:24434: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:24437: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+			  CPPFLAGS=$cf_save_CPPFLAGS
+			fi
+		  fi
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  test -n "$verbose" && echo "	adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:24454: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+		  CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+		  cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+		  test "$cf_top_incdir" = "$cf_add_incdir" && break
+		  cf_add_incdir="$cf_top_incdir"
+		else
+		  break
+		fi
+	  else
+		break
+	  fi
+	done
+  done
+fi
+
+if test -n "$with_hashed_db/lib" ; then
+	for cf_add_libdir in $with_hashed_db/lib
+	do
+		if test "$cf_add_libdir" = /usr/lib ; then
+			:
+		elif test -d "$cf_add_libdir"
+		then
+			cf_have_libdir=no
+			if test -n "$LDFLAGS$LIBS" ; then
+				# a loop is needed to ensure we can add subdirs of existing dirs
+				for cf_test_libdir in $LDFLAGS $LIBS ; do
+					if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+						cf_have_libdir=yes; break
+					fi
+				done
+			fi
+			if test "$cf_have_libdir" = no ; then
+				test -n "$verbose" && echo "	adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:24490: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+				LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+			fi
+		fi
+	done
+fi
+
+	else
+		case "$with_hashed_db" in
+		(./*|../*|/*)
+			{ echo "$as_me:24501: WARNING: no such directory $with_hashed_db" >&5
+echo "$as_me: WARNING: no such directory $with_hashed_db" >&2;}
+			;;
+		(*)
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+	test -n "$verbose" && echo "	... testing for include-directories under $prefix"
+	test -d "$prefix/include" &&          cf_search="$cf_search $prefix/include"
+	test -d "$prefix/include/$with_hashed_db" &&       cf_search="$cf_search $prefix/include/$with_hashed_db"
+	test -d "$prefix/include/$with_hashed_db/include" &&    cf_search="$cf_search $prefix/include/$with_hashed_db/include"
+	test -d "$prefix/$with_hashed_db/include" &&       cf_search="$cf_search $prefix/$with_hashed_db/include"
+	test -d "$prefix/$with_hashed_db/include/$with_hashed_db" &&    cf_search="$cf_search $prefix/$with_hashed_db/include/$with_hashed_db"
+}
+
+for cf_subdir_prefix in \
+	/usr \
+	/usr/local \
+	/usr/pkg \
+	/opt \
+	/opt/local \
+	$HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+	test -n "$verbose" && echo "	... testing for include-directories under $cf_subdir_prefix"
+	test -d "$cf_subdir_prefix/include" &&          cf_search="$cf_search $cf_subdir_prefix/include"
+	test -d "$cf_subdir_prefix/include/$with_hashed_db" &&       cf_search="$cf_search $cf_subdir_prefix/include/$with_hashed_db"
+	test -d "$cf_subdir_prefix/include/$with_hashed_db/include" &&    cf_search="$cf_search $cf_subdir_prefix/include/$with_hashed_db/include"
+	test -d "$cf_subdir_prefix/$with_hashed_db/include" &&       cf_search="$cf_search $cf_subdir_prefix/$with_hashed_db/include"
+	test -d "$cf_subdir_prefix/$with_hashed_db/include/$with_hashed_db" &&    cf_search="$cf_search $cf_subdir_prefix/$with_hashed_db/include/$with_hashed_db"
+}
+
+done
+
+	for cf_item in $cf_search
+	do
+		case "$cf_item" in
+		(*/$with_hashed_db)
+
+if test -n "$cf_item" ; then
+  for cf_add_incdir in $cf_item
+  do
+	while test "$cf_add_incdir" != /usr/include
+	do
+	  if test -d "$cf_add_incdir"
+	  then
+		cf_have_incdir=no
+		if test -n "$CFLAGS$CPPFLAGS" ; then
+		  # a loop is needed to ensure we can add subdirs of existing dirs
+		  for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+			if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+			  cf_have_incdir=yes; break
+			fi
+		  done
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  if test "$cf_add_incdir" = /usr/local/include ; then
+			if test "$GCC" = yes
+			then
+			  cf_save_CPPFLAGS=$CPPFLAGS
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+			  cat >"conftest.$ac_ext" <<_ACEOF
+#line 24573 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:24585: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:24588: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:24591: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:24594: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+			  CPPFLAGS=$cf_save_CPPFLAGS
+			fi
+		  fi
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  test -n "$verbose" && echo "	adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:24611: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+		  CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+		  cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+		  test "$cf_top_incdir" = "$cf_add_incdir" && break
+		  cf_add_incdir="$cf_top_incdir"
+		else
+		  break
+		fi
+	  else
+		break
+	  fi
+	done
+  done
+fi
+
+			;;
+		esac
+	done
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+	test -n "$verbose" && echo "	... testing for lib-directories under $prefix"
+	test -d "$prefix/lib" &&          cf_search="$cf_search $prefix/lib"
+	test -d "$prefix/lib/$with_hashed_db" &&       cf_search="$cf_search $prefix/lib/$with_hashed_db"
+	test -d "$prefix/lib/$with_hashed_db/lib" &&    cf_search="$cf_search $prefix/lib/$with_hashed_db/lib"
+	test -d "$prefix/$with_hashed_db/lib" &&       cf_search="$cf_search $prefix/$with_hashed_db/lib"
+	test -d "$prefix/$with_hashed_db/lib/$with_hashed_db" &&    cf_search="$cf_search $prefix/$with_hashed_db/lib/$with_hashed_db"
+}
+
+for cf_subdir_prefix in \
+	/usr \
+	/usr/local \
+	/usr/pkg \
+	/opt \
+	/opt/local \
+	$HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+	test -n "$verbose" && echo "	... testing for lib-directories under $cf_subdir_prefix"
+	test -d "$cf_subdir_prefix/lib" &&          cf_search="$cf_search $cf_subdir_prefix/lib"
+	test -d "$cf_subdir_prefix/lib/$with_hashed_db" &&       cf_search="$cf_search $cf_subdir_prefix/lib/$with_hashed_db"
+	test -d "$cf_subdir_prefix/lib/$with_hashed_db/lib" &&    cf_search="$cf_search $cf_subdir_prefix/lib/$with_hashed_db/lib"
+	test -d "$cf_subdir_prefix/$with_hashed_db/lib" &&       cf_search="$cf_search $cf_subdir_prefix/$with_hashed_db/lib"
+	test -d "$cf_subdir_prefix/$with_hashed_db/lib/$with_hashed_db" &&    cf_search="$cf_search $cf_subdir_prefix/$with_hashed_db/lib/$with_hashed_db"
+}
+
+done
+
+	for cf_item in $cf_search
+	do
+		case "$cf_item" in
+		(*/$with_hashed_db)
+
+if test -n "$cf_item" ; then
+	for cf_add_libdir in $cf_item
+	do
+		if test "$cf_add_libdir" = /usr/lib ; then
+			:
+		elif test -d "$cf_add_libdir"
+		then
+			cf_have_libdir=no
+			if test -n "$LDFLAGS$LIBS" ; then
+				# a loop is needed to ensure we can add subdirs of existing dirs
+				for cf_test_libdir in $LDFLAGS $LIBS ; do
+					if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+						cf_have_libdir=yes; break
+					fi
+				done
+			fi
+			if test "$cf_have_libdir" = no ; then
+				test -n "$verbose" && echo "	adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:24691: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+				LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+			fi
+		fi
+	done
+fi
+
+			;;
+		esac
+	done
+
+			;;
+		esac
+	fi
+esac
+
+echo "$as_me:24708: checking for db.h" >&5
+echo $ECHO_N "checking for db.h... $ECHO_C" >&6
+if test "${ac_cv_header_db_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 24714 "configure"
+#include "confdefs.h"
+#include <db.h>
+_ACEOF
+if { (eval echo "$as_me:24718: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:24724: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_cv_header_db_h=yes
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  ac_cv_header_db_h=no
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:24743: result: $ac_cv_header_db_h" >&5
+echo "${ECHO_T}$ac_cv_header_db_h" >&6
+if test "$ac_cv_header_db_h" = yes; then
+
+echo "$as_me:24747: checking for version of db" >&5
+echo $ECHO_N "checking for version of db... $ECHO_C" >&6
+if test "${cf_cv_hashed_db_version+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cf_cv_hashed_db_version=unknown
+
+for cf_db_version in 1 2 3 4 5 6
+do
+
+echo "${as_me:-configure}:24758: testing checking for db version $cf_db_version ..." 1>&5
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 24761 "configure"
+#include "confdefs.h"
+
+$ac_includes_default
+#include <db.h>
+
+#ifdef DB_VERSION_MAJOR
+	/* db2 (DB_VERSION_MAJOR=2) has also DB_VERSION_MINOR, tested with 7 */
+#if $cf_db_version == DB_VERSION_MAJOR
+	/* ok */
+#else
+	make an error
+#endif
+#else
+#if $cf_db_version == 1
+	/* ok: assuming this is DB 1.8.5 */
+#else
+	make an error
+#endif
+#endif
+
+int
+main (void)
+{
+DBT *foo = 0
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:24791: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:24794: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:24797: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:24800: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+	cf_cv_hashed_db_version=$cf_db_version
+	break
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+done
+
+fi
+echo "$as_me:24814: result: $cf_cv_hashed_db_version" >&5
+echo "${ECHO_T}$cf_cv_hashed_db_version" >&6
+
+if test "$cf_cv_hashed_db_version" = unknown ; then
+	{ { echo "$as_me:24818: error: Cannot determine version of db" >&5
+echo "$as_me: error: Cannot determine version of db" >&2;}
+   { (exit 1); exit 1; }; }
+else
+
+echo "$as_me:24823: checking for db libraries" >&5
+echo $ECHO_N "checking for db libraries... $ECHO_C" >&6
+if test "${cf_cv_hashed_db_libs+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cf_cv_hashed_db_libs=unknown
+for cf_db_libs in "" db$cf_cv_hashed_db_version db-$cf_cv_hashed_db_version db ''
+do
+	cf_save_libs="$LIBS"
+	if test -n "$cf_db_libs"; then
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -l$cf_db_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+	fi
+
+echo "${as_me:-configure}:24853: testing checking for library $cf_db_libs ..." 1>&5
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 24856 "configure"
+#include "confdefs.h"
+
+$ac_includes_default
+#include <db.h>
+
+int
+main (void)
+{
+
+	char *path = "/tmp/foo";
+#ifdef DB_VERSION_MAJOR
+#if DB_VERSION_MAJOR >= 4
+	DB *result = 0;
+	db_create(&result, NULL, 0);
+	result->open(result,
+		NULL,
+		path,
+		path,
+		DB_HASH,
+		DB_CREATE,
+		0644);
+#elif DB_VERSION_MAJOR >= 3
+	DB *result = 0;
+	db_create(&result, NULL, 0);
+	result->open(result,
+		path,
+		path,
+		DB_HASH,
+		DB_CREATE,
+		0644);
+#elif DB_VERSION_MAJOR >= 2
+	DB *result = 0;
+	db_open(path,
+		DB_HASH,
+		DB_CREATE,
+		0644,
+		(DB_ENV *) 0,
+		(DB_INFO *) 0,
+		&result);
+#endif /* DB_VERSION_MAJOR */
+#else
+	DB *result = dbopen(path,
+		     2,
+		     0644,
+		     DB_HASH,
+		     0);
+#endif
+	${cf_cv_main_return:-return}(result != 0)
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:24911: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:24914: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:24917: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:24920: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+	if test -n "$cf_db_libs" ; then
+		cf_cv_hashed_db_libs=$cf_db_libs
+	else
+		cf_cv_hashed_db_libs=default
+	fi
+	LIBS="$cf_save_libs"
+	break
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+	LIBS="$cf_save_libs"
+done
+
+fi
+echo "$as_me:24940: result: $cf_cv_hashed_db_libs" >&5
+echo "${ECHO_T}$cf_cv_hashed_db_libs" >&6
+
+	if test "$cf_cv_hashed_db_libs" = unknown ; then
+		{ { echo "$as_me:24944: error: Cannot determine library for db" >&5
+echo "$as_me: error: Cannot determine library for db" >&2;}
+   { (exit 1); exit 1; }; }
+	elif test "$cf_cv_hashed_db_libs" != default ; then
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -l$cf_cv_hashed_db_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+	fi
+fi
+
+else
+
+	{ { echo "$as_me:24970: error: Cannot find db.h" >&5
+echo "$as_me: error: Cannot find db.h" >&2;}
+   { (exit 1); exit 1; }; }
+
+fi
+
+fi
+
+if test -z "$cf_user_CFLAGS" && test "$enable_leaks" = yes ; then
+	CFLAGS=`echo "${CFLAGS}" | sed -e 's%-g %%' -e 's%-g$%%' -e 's%[	]% %g' -e 's% [ ]*% %g' -e 's%^ %%' -e 's% $%%'`
+	CXXFLAGS=`echo "${CXXFLAGS}" | sed -e 's%-g %%' -e 's%-g$%%' -e 's%[	]% %g' -e 's% [ ]*% %g' -e 's%^ %%' -e 's% $%%'`
+fi
+
+# Just in case, check if the C compiler has a bool type.
+
+echo "$as_me:24985: checking if we should include stdbool.h" >&5
+echo $ECHO_N "checking if we should include stdbool.h... $ECHO_C" >&6
+
+if test "${cf_cv_header_stdbool_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 24993 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+bool foo = false
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:25005: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:25008: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:25011: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:25014: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_header_stdbool_h=0
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 25021 "configure"
+#include "confdefs.h"
+
+#ifndef __BEOS__
+#include <stdbool.h>
+#endif
+
+int
+main (void)
+{
+bool foo = false
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:25037: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:25040: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:25043: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:25046: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_header_stdbool_h=1
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_header_stdbool_h=0
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+
+if test "$cf_cv_header_stdbool_h" = 1
+then	echo "$as_me:25060: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else	echo "$as_me:25062: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+echo "$as_me:25066: checking for builtin bool type" >&5
+echo $ECHO_N "checking for builtin bool type... $ECHO_C" >&6
+
+if test "${cf_cv_cc_bool_type+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 25074 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#include <sys/types.h>
+
+int
+main (void)
+{
+bool x = false
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:25089: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:25092: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:25095: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:25098: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_cc_bool_type=1
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_cc_bool_type=0
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+
+if test "$cf_cv_cc_bool_type" = 1
+then	echo "$as_me:25111: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else	echo "$as_me:25113: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+# Check for C++ compiler characteristics (and ensure that it's there!)
+if test -n "$CXX" ; then
+	ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
+ac_link='$CXX -o "conftest$ac_exeext" $CXXFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+ac_main_return="return"
+
+if test -n "$GXX" ; then
+
+	cf_save="$LIBS"
+	LIBS="$LIBS $CXXLIBS"
+	echo "$as_me:25130: checking if we already have C++ library" >&5
+echo $ECHO_N "checking if we already have C++ library... $ECHO_C" >&6
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 25133 "configure"
+#include "confdefs.h"
+
+			#include <iostream>
+int
+main (void)
+{
+
+			std::cout << "Hello World!" << std::endl;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:25147: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:25150: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:25153: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:25156: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_have_libstdcpp=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_libstdcpp=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+	echo "$as_me:25165: result: $cf_have_libstdcpp" >&5
+echo "${ECHO_T}$cf_have_libstdcpp" >&6
+	LIBS="$cf_save"
+
+	if test "$cf_have_libstdcpp" != yes
+	then
+		case "$cf_cv_system_name" in
+		(os2*)
+			if test -z "`g++ -dM -E - < /dev/null | grep __KLIBC__`"; then
+				cf_stdcpp_libname=stdcpp
+			else
+				cf_stdcpp_libname=stdc++
+			fi
+			;;
+		(*)
+			cf_stdcpp_libname=stdc++
+			;;
+		esac
+
+		echo "$as_me:25184: checking for library $cf_stdcpp_libname" >&5
+echo $ECHO_N "checking for library $cf_stdcpp_libname... $ECHO_C" >&6
+if test "${cf_cv_libstdcpp+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+			cf_save="$LIBS"
+			LIBS="$LIBS $CXXLIBS"
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -l$cf_stdcpp_libname; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 25210 "configure"
+#include "confdefs.h"
+
+				#include <iostream>
+int
+main (void)
+{
+
+				std::cout << "Hello World!" << std::endl;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:25224: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:25227: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:25230: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:25233: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_libstdcpp=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_libstdcpp=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+			LIBS="$cf_save"
+
+fi
+echo "$as_me:25245: result: $cf_cv_libstdcpp" >&5
+echo "${ECHO_T}$cf_cv_libstdcpp" >&6
+		test "$cf_cv_libstdcpp" = yes && {
+cf_add_libs="$CXXLIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -l$cf_stdcpp_libname; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+CXXLIBS="$cf_add_libs"
+ }
+	fi
+fi
+
+	echo "$as_me:25267: checking whether $CXX understands -c and -o together" >&5
+echo $ECHO_N "checking whether $CXX understands -c and -o together... $ECHO_C" >&6
+if test "${cf_cv_prog_CXX_c_o+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat > conftest.$ac_ext <<CF_EOF
+int main(void)
+{
+	${cf_cv_main_return:-return}(0);
+}
+CF_EOF
+# We do the test twice because some compilers refuse to overwrite an
+# existing .o file with -o, though they will create one.
+ac_try='$CXX $CXXFLAGS $CPPFLAGS -c conftest.$ac_ext -o conftest2.$ac_objext >&5'
+if { (eval echo "$as_me:25282: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:25285: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+  test -f conftest2.$ac_objext && { (eval echo "$as_me:25287: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:25290: \$? = $ac_status" >&5
+  (exit "$ac_status"); };
+then
+  eval cf_cv_prog_CXX_c_o=yes
+else
+  eval cf_cv_prog_CXX_c_o=no
+fi
+rm -rf ./conftest*
+
+fi
+if test "$cf_cv_prog_CXX_c_o" = yes; then
+  echo "$as_me:25301: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+  echo "$as_me:25304: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+	case "$GXX_VERSION" in
+	(1.*|2.[0-6]*|[1-9][0-9].*)
+		cf_cxx_library=yes
+		;;
+	(*-2.7*|2.7*)
+
+cf_cxx_library=unknown
+case "$cf_cv_system_name" in
+(os2*)
+	cf_gpp_libname=gpp
+	;;
+(*)
+	cf_gpp_libname=g++
+	;;
+esac
+if test "$GXX" = yes; then
+	echo "$as_me:25324: checking for lib$cf_gpp_libname" >&5
+echo $ECHO_N "checking for lib$cf_gpp_libname... $ECHO_C" >&6
+	cf_save="$LIBS"
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -l$cf_gpp_libname; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 25345 "configure"
+#include "confdefs.h"
+
+#include <$cf_gpp_libname/builtin.h>
+
+int
+main (void)
+{
+two_arg_error_handler_t foo2 = lib_error_handler
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:25359: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:25362: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:25365: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:25368: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cxx_library=yes
+
+cf_add_libs="$CXXLIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -l$cf_gpp_libname; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+CXXLIBS="$cf_add_libs"
+
+	 if test "$cf_gpp_libname" = cpp ; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_GPP_BUILTIN_H 1
+EOF
+
+	 else
+
+cat >>confdefs.h <<\EOF
+#define HAVE_GXX_BUILTIN_H 1
+EOF
+
+	 fi
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 25405 "configure"
+#include "confdefs.h"
+
+#include <builtin.h>
+
+int
+main (void)
+{
+two_arg_error_handler_t foo2 = lib_error_handler
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:25419: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:25422: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:25425: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:25428: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cxx_library=yes
+
+cf_add_libs="$CXXLIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -l$cf_gpp_libname; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+CXXLIBS="$cf_add_libs"
+
+cat >>confdefs.h <<\EOF
+#define HAVE_BUILTIN_H 1
+EOF
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cxx_library=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+	LIBS="$cf_save"
+	echo "$as_me:25461: result: $cf_cxx_library" >&5
+echo "${ECHO_T}$cf_cxx_library" >&6
+fi
+
+		;;
+	(*)
+		cf_cxx_library=no
+		;;
+	esac
+
+	ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
+ac_link='$CXX -o "conftest$ac_exeext" $CXXFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+ac_main_return="return"
+echo "$as_me:25477: checking how to run the C++ preprocessor" >&5
+echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6
+if test -z "$CXXCPP"; then
+  if test "${ac_cv_prog_CXXCPP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+      # Double quotes because CXXCPP needs to be expanded
+    for CXXCPP in "$CXX -E" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 25494 "configure"
+#include "confdefs.h"
+#include <assert.h>
+                     Syntax error
+_ACEOF
+if { (eval echo "$as_me:25499: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:25505: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_cxx_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err "conftest.$ac_ext"
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 25528 "configure"
+#include "confdefs.h"
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:25532: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:25538: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_cxx_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err "conftest.$ac_ext"
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err "conftest.$ac_ext"
+if $ac_preproc_ok; then
+  break
+fi
+
+    done
+    ac_cv_prog_CXXCPP=$CXXCPP
+
+fi
+  CXXCPP=$ac_cv_prog_CXXCPP
+else
+  ac_cv_prog_CXXCPP=$CXXCPP
+fi
+echo "$as_me:25575: result: $CXXCPP" >&5
+echo "${ECHO_T}$CXXCPP" >&6
+ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 25585 "configure"
+#include "confdefs.h"
+#include <assert.h>
+                     Syntax error
+_ACEOF
+if { (eval echo "$as_me:25590: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:25596: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_cxx_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err "conftest.$ac_ext"
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 25619 "configure"
+#include "confdefs.h"
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:25623: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:25629: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_cxx_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err "conftest.$ac_ext"
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err "conftest.$ac_ext"
+if $ac_preproc_ok; then
+  :
+else
+  { { echo "$as_me:25657: error: C++ preprocessor \"$CXXCPP\" fails sanity check" >&5
+echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
+ac_link='$CXX -o "conftest$ac_exeext" $CXXFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+ac_main_return="return"
+
+for ac_header in typeinfo
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:25672: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 25678 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:25682: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:25688: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_cxx_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:25707: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+for ac_header in iostream
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:25720: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 25726 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:25730: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:25736: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_cxx_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:25755: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+if test x"$ac_cv_header_iostream" = xyes ; then
+	echo "$as_me:25766: checking if iostream uses std-namespace" >&5
+echo $ECHO_N "checking if iostream uses std-namespace... $ECHO_C" >&6
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 25769 "configure"
+#include "confdefs.h"
+
+#include <iostream>
+using std::endl;
+using std::cerr;
+int
+main (void)
+{
+
+cerr << "testing" << endl;
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:25786: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:25789: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:25792: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:25795: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_iostream_namespace=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_iostream_namespace=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+	echo "$as_me:25804: result: $cf_iostream_namespace" >&5
+echo "${ECHO_T}$cf_iostream_namespace" >&6
+	if test "$cf_iostream_namespace" = yes ; then
+
+cat >>confdefs.h <<\EOF
+#define IOSTREAM_NAMESPACE 1
+EOF
+
+	fi
+fi
+
+echo "$as_me:25815: checking if we should include stdbool.h" >&5
+echo $ECHO_N "checking if we should include stdbool.h... $ECHO_C" >&6
+
+if test "${cf_cv_header_stdbool_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 25823 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+bool foo = false
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:25835: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:25838: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:25841: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:25844: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_header_stdbool_h=0
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 25851 "configure"
+#include "confdefs.h"
+
+#ifndef __BEOS__
+#include <stdbool.h>
+#endif
+
+int
+main (void)
+{
+bool foo = false
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:25867: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:25870: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:25873: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:25876: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_header_stdbool_h=1
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_header_stdbool_h=0
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+
+if test "$cf_cv_header_stdbool_h" = 1
+then	echo "$as_me:25890: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else	echo "$as_me:25892: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+echo "$as_me:25896: checking for builtin bool type" >&5
+echo $ECHO_N "checking for builtin bool type... $ECHO_C" >&6
+
+if test "${cf_cv_builtin_bool+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 25904 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#include <sys/types.h>
+
+int
+main (void)
+{
+bool x = false
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:25919: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:25922: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:25925: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:25928: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_builtin_bool=1
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_builtin_bool=0
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+
+if test "$cf_cv_builtin_bool" = 1
+then	echo "$as_me:25941: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else	echo "$as_me:25943: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+echo "$as_me:25947: checking for bool" >&5
+echo $ECHO_N "checking for bool... $ECHO_C" >&6
+if test "${ac_cv_type_bool+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 25953 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#if defined(__cplusplus)
+
+#ifdef HAVE_GXX_BUILTIN_H
+#include <g++/builtin.h>
+#elif HAVE_GPP_BUILTIN_H
+#include <gpp/builtin.h>
+#elif HAVE_BUILTIN_H
+#include <builtin.h>
+#endif
+
+#else
+
+#if $cf_cv_header_stdbool_h
+#include <stdbool.h>
+#endif
+
+#endif
+
+int
+main (void)
+{
+if ((bool *) 0)
+  return 0;
+if (sizeof (bool))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:25989: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:25992: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:25995: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:25998: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_type_bool=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_type_bool=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:26008: result: $ac_cv_type_bool" >&5
+echo "${ECHO_T}$ac_cv_type_bool" >&6
+
+echo "$as_me:26011: checking size of bool" >&5
+echo $ECHO_N "checking size of bool... $ECHO_C" >&6
+if test "${ac_cv_sizeof_bool+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$ac_cv_type_bool" = yes; then
+  if test "$cross_compiling" = yes; then
+  # Depending upon the size, compute the lo and hi bounds.
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 26020 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#if defined(__cplusplus)
+
+#ifdef HAVE_GXX_BUILTIN_H
+#include <g++/builtin.h>
+#elif HAVE_GPP_BUILTIN_H
+#include <gpp/builtin.h>
+#elif HAVE_BUILTIN_H
+#include <builtin.h>
+#endif
+
+#else
+
+#if $cf_cv_header_stdbool_h
+#include <stdbool.h>
+#endif
+
+#endif
+
+int
+main (void)
+{
+int _array_ [1 - 2 * !((sizeof (bool)) >= 0)]
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:26053: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:26056: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:26059: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:26062: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat >"conftest.$ac_ext" <<_ACEOF
+#line 26067 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#if defined(__cplusplus)
+
+#ifdef HAVE_GXX_BUILTIN_H
+#include <g++/builtin.h>
+#elif HAVE_GPP_BUILTIN_H
+#include <gpp/builtin.h>
+#elif HAVE_BUILTIN_H
+#include <builtin.h>
+#endif
+
+#else
+
+#if $cf_cv_header_stdbool_h
+#include <stdbool.h>
+#endif
+
+#endif
+
+int
+main (void)
+{
+int _array_ [1 - 2 * !((sizeof (bool)) <= $ac_mid)]
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:26100: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:26103: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:26106: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:26109: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_hi=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_lo=`expr "$ac_mid" + 1`; ac_mid=`expr 2 '*' "$ac_mid" + 1`
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+  done
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_hi=-1 ac_mid=-1
+  while :; do
+    cat >"conftest.$ac_ext" <<_ACEOF
+#line 26125 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#if defined(__cplusplus)
+
+#ifdef HAVE_GXX_BUILTIN_H
+#include <g++/builtin.h>
+#elif HAVE_GPP_BUILTIN_H
+#include <gpp/builtin.h>
+#elif HAVE_BUILTIN_H
+#include <builtin.h>
+#endif
+
+#else
+
+#if $cf_cv_header_stdbool_h
+#include <stdbool.h>
+#endif
+
+#endif
+
+int
+main (void)
+{
+int _array_ [1 - 2 * !((sizeof (bool)) >= $ac_mid)]
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:26158: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:26161: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:26164: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:26167: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_lo=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_hi=`expr "$ac_mid" - 1`; ac_mid=`expr 2 '*' "$ac_mid"`
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+  done
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  ac_mid=`expr '(' "$ac_hi" - "$ac_lo" ')' / 2 + "$ac_lo"`
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 26183 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#if defined(__cplusplus)
+
+#ifdef HAVE_GXX_BUILTIN_H
+#include <g++/builtin.h>
+#elif HAVE_GPP_BUILTIN_H
+#include <gpp/builtin.h>
+#elif HAVE_BUILTIN_H
+#include <builtin.h>
+#endif
+
+#else
+
+#if $cf_cv_header_stdbool_h
+#include <stdbool.h>
+#endif
+
+#endif
+
+int
+main (void)
+{
+int _array_ [1 - 2 * !((sizeof (bool)) <= $ac_mid)]
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:26216: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:26219: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:26222: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:26225: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_hi=$ac_mid
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_lo=`expr "$ac_mid" + 1`
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+done
+ac_cv_sizeof_bool=$ac_lo
+else
+  if test "$cross_compiling" = yes; then
+  { { echo "$as_me:26238: error: cannot run test program while cross compiling" >&5
+echo "$as_me: error: cannot run test program while cross compiling" >&2;}
+   { (exit 1); exit 1; }; }
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 26243 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#if defined(__cplusplus)
+
+#ifdef HAVE_GXX_BUILTIN_H
+#include <g++/builtin.h>
+#elif HAVE_GPP_BUILTIN_H
+#include <gpp/builtin.h>
+#elif HAVE_BUILTIN_H
+#include <builtin.h>
+#endif
+
+#else
+
+#if $cf_cv_header_stdbool_h
+#include <stdbool.h>
+#endif
+
+#endif
+
+int
+main (void)
+{
+FILE *f = fopen ("conftest.val", "w");
+if (!f)
+  $ac_main_return (1);
+fprintf (f, "%ld", (long)(sizeof (bool)));
+fclose (f);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:26280: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:26283: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:26285: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:26288: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_sizeof_bool=`cat conftest.val`
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+fi
+rm -f conftest.val
+else
+  ac_cv_sizeof_bool=0
+fi
+fi
+echo "$as_me:26304: result: $ac_cv_sizeof_bool" >&5
+echo "${ECHO_T}$ac_cv_sizeof_bool" >&6
+cat >>confdefs.h <<EOF
+#define SIZEOF_BOOL $ac_cv_sizeof_bool
+EOF
+
+echo "$as_me:26310: checking for type of bool" >&5
+echo $ECHO_N "checking for type of bool... $ECHO_C" >&6
+if test "${cf_cv_type_of_bool+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	rm -f cf_test.out
+	if test "$cross_compiling" = yes; then
+
+		case x$ac_cv_sizeof_bool in
+		(x1) cf_cv_type_of_bool="unsigned char";;
+		(x2) cf_cv_type_of_bool="unsigned short";;
+		(x4) cf_cv_type_of_bool="unsigned int";;
+		(x8) cf_cv_type_of_bool="unsigned long";;
+		(*)  cf_cv_type_of_bool=unknown;;
+		esac
+
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 26329 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#if defined(__cplusplus)
+
+#ifdef HAVE_GXX_BUILTIN_H
+#include <g++/builtin.h>
+#elif HAVE_GPP_BUILTIN_H
+#include <gpp/builtin.h>
+#elif HAVE_BUILTIN_H
+#include <builtin.h>
+#endif
+
+#else
+
+#if $cf_cv_header_stdbool_h
+#include <stdbool.h>
+#endif
+
+#endif
+
+int main(void)
+{
+	FILE *fp = fopen("cf_test.out", "w");
+	if (fp != 0) {
+		bool x = true;
+		if ((bool)(-x) >= 0)
+			fputs("unsigned ", fp);
+		if (sizeof(x) == sizeof(int))       fputs("int",  fp);
+		else if (sizeof(x) == sizeof(char)) fputs("char", fp);
+		else if (sizeof(x) == sizeof(short))fputs("short",fp);
+		else if (sizeof(x) == sizeof(long)) fputs("long", fp);
+		fclose(fp);
+	}
+	${cf_cv_main_return:-return}(0);
+}
+
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:26371: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:26374: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:26376: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:26379: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_type_of_bool=`cat cf_test.out`
+		 if test -z "$cf_cv_type_of_bool"; then
+		   cf_cv_type_of_bool=unknown
+		 fi
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_type_of_bool=unknown
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+	rm -f cf_test.out
+
+fi
+echo "$as_me:26396: result: $cf_cv_type_of_bool" >&5
+echo "${ECHO_T}$cf_cv_type_of_bool" >&6
+
+if test "$cf_cv_type_of_bool" = unknown ; then
+	case .$NCURSES_BOOL in
+	(.auto|.) NCURSES_BOOL=unsigned;;
+	esac
+	{ echo "$as_me:26403: WARNING: Assuming $NCURSES_BOOL for type of bool" >&5
+echo "$as_me: WARNING: Assuming $NCURSES_BOOL for type of bool" >&2;}
+	cf_cv_type_of_bool=$NCURSES_BOOL
+fi
+
+echo "$as_me:26408: checking for special defines needed for etip.h" >&5
+echo $ECHO_N "checking for special defines needed for etip.h... $ECHO_C" >&6
+cf_save_CXXFLAGS="$CXXFLAGS"
+cf_result="none"
+
+# etip.h includes ncurses.h which includes ncurses_dll.h
+# But ncurses_dll.h is generated - fix here.
+test -d include || mkdir include
+test -f include/ncurses_dll.h || sed -e 's/@NCURSES_WRAP_PREFIX@/'$NCURSES_WRAP_PREFIX'/g' "${srcdir}/include/ncurses_dll.h.in" >include/ncurses_dll.h
+
+for cf_math in "" MATH_H
+do
+for cf_excp in "" MATH_EXCEPTION
+do
+	CXXFLAGS="$cf_save_CXXFLAGS -I${srcdir}/c++ -I${srcdir}/menu -Iinclude -I${srcdir}/include"
+	test -n "$cf_math" && CXXFLAGS="$CXXFLAGS -DETIP_NEEDS_${cf_math}"
+	test -n "$cf_excp" && CXXFLAGS="$CXXFLAGS -DETIP_NEEDS_${cf_excp}"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 26426 "configure"
+#include "confdefs.h"
+
+#include <etip.h.in>
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:26440: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:26443: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:26446: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:26449: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+	test -n "$cf_math" && cat >>confdefs.h <<EOF
+#define ETIP_NEEDS_${cf_math} 1
+EOF
+
+	test -n "$cf_excp" && cat >>confdefs.h <<EOF
+#define ETIP_NEEDS_${cf_excp} 1
+EOF
+
+	cf_result="$cf_math $cf_excp"
+	break 2
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+done
+done
+echo "$as_me:26470: result: $cf_result" >&5
+echo "${ECHO_T}$cf_result" >&6
+CXXFLAGS="$cf_save_CXXFLAGS"
+
+if test -n "$CXX"; then
+echo "$as_me:26475: checking if $CXX accepts override keyword" >&5
+echo $ECHO_N "checking if $CXX accepts override keyword... $ECHO_C" >&6
+if test "${cf_cv_cpp_override+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
+ac_link='$CXX -o "conftest$ac_exeext" $CXXFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+ac_main_return="return"
+
+	if test "$cross_compiling" = yes; then
+  cf_cv_cpp_override=unknown
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 26492 "configure"
+#include "confdefs.h"
+
+class base
+{
+public:
+	virtual int foo(float x) = 0;
+};
+
+class derived: public base
+{
+public:
+	int foo(float x) override { return x != 0.0 ? 1 : 0; }
+};
+
+int main(void) { }
+
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:26511: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:26514: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:26516: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:26519: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_cpp_override=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_cpp_override=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+	ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
+ac_link='$CXX -o "conftest$ac_exeext" $CXXFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+ac_main_return="return"
+
+fi
+echo "$as_me:26538: result: $cf_cv_cpp_override" >&5
+echo "${ECHO_T}$cf_cv_cpp_override" >&6
+fi
+test "$cf_cv_cpp_override" = yes &&
+cat >>confdefs.h <<\EOF
+#define CPP_HAS_OVERRIDE 1
+EOF
+
+if test -n "$CXX"; then
+echo "$as_me:26547: checking if $CXX accepts parameter initialization" >&5
+echo $ECHO_N "checking if $CXX accepts parameter initialization... $ECHO_C" >&6
+if test "${cf_cv_cpp_param_init+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
+ac_link='$CXX -o "conftest$ac_exeext" $CXXFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+ac_main_return="return"
+
+	if test "$cross_compiling" = yes; then
+  cf_cv_cpp_param_init=unknown
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 26564 "configure"
+#include "confdefs.h"
+
+class TEST {
+private:
+	int value;
+public:
+	TEST(int x = 1);
+	~TEST();
+};
+
+TEST::TEST(int x = 1)	// some compilers do not like second initializer
+{
+	value = x;
+}
+int main(void) { }
+
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:26583: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:26586: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:26588: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:26591: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_cpp_param_init=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_cpp_param_init=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+	ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
+ac_link='$CXX -o "conftest$ac_exeext" $CXXFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+ac_main_return="return"
+
+fi
+echo "$as_me:26610: result: $cf_cv_cpp_param_init" >&5
+echo "${ECHO_T}$cf_cv_cpp_param_init" >&6
+fi
+test "$cf_cv_cpp_param_init" = yes &&
+cat >>confdefs.h <<\EOF
+#define CPP_HAS_PARAM_INIT 1
+EOF
+
+if test -n "$CXX"; then
+
+echo "$as_me:26620: checking if $CXX accepts static_cast" >&5
+echo $ECHO_N "checking if $CXX accepts static_cast... $ECHO_C" >&6
+if test "${cf_cv_cpp_static_cast+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
+ac_link='$CXX -o "conftest$ac_exeext" $CXXFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+ac_main_return="return"
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 26634 "configure"
+#include "confdefs.h"
+
+class NCursesPanel
+{
+public:
+  NCursesPanel(int nlines,
+	       int ncols,
+	       int begin_y = 0,
+	       int begin_x = 0)
+  {
+  }
+  NCursesPanel();
+  ~NCursesPanel();
+};
+
+template<class T> class NCursesUserPanel : public NCursesPanel
+{
+public:
+  NCursesUserPanel (int nlines,
+		    int ncols,
+		    int begin_y = 0,
+		    int begin_x = 0,
+		    const T* p_UserData = static_cast<T*>(0))
+    : NCursesPanel (nlines, ncols, begin_y, begin_x)
+  {
+  };
+  NCursesUserPanel(const T* p_UserData = static_cast<T*>(0)) : NCursesPanel()
+  {
+  };
+
+  virtual ~NCursesUserPanel() {};
+};
+
+int
+main (void)
+{
+
+	const char* p_UserData = static_cast<char*>(0)
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:26678: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:26681: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:26684: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:26687: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_cpp_static_cast=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_cpp_static_cast=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+	ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
+ac_link='$CXX -o "conftest$ac_exeext" $CXXFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+ac_main_return="return"
+
+fi
+echo "$as_me:26705: result: $cf_cv_cpp_static_cast" >&5
+echo "${ECHO_T}$cf_cv_cpp_static_cast" >&6
+
+fi
+
+test "$cf_cv_cpp_static_cast" = yes &&
+cat >>confdefs.h <<\EOF
+#define CPP_HAS_STATIC_CAST 1
+EOF
+
+	CXX_AR='$(AR)'
+	CXX_ARFLAGS='$(ARFLAGS)'
+	case "$cf_cv_system_name" in
+	(irix*)
+	    if test "$GXX" != yes ; then
+		CXX_AR='$(CXX)'
+		CXX_ARFLAGS='-ar -o'
+	    fi
+	    ;;
+	(sco3.2v5*)
+	    CXXLDFLAGS="-u main"
+	    ;;
+	(solaris2*)
+	    if test "$GXX" != yes ; then
+		CXX_AR='$(CXX)'
+		CXX_ARFLAGS='-xar -o'
+	    fi
+	    ;;
+	esac
+
+else
+	cf_cxx_library=no
+	cf_cv_builtin_bool=1
+
+	# Just because we are not configuring against C++ right now does not
+	# mean that a user will not want to use C++.  Some distributors disable
+	# the C++ portion of this configuration as a shortcut (or just to avoid
+	# compiling the demo in the c++ directory).  So we need a reasonable
+	# default for the 'bool' type.
+	#
+	# Caveat: since the storage of the bool type is not standardized, it
+	# may change.
+
+	if test "$NCURSES_BOOL" != auto ; then
+		cf_cv_type_of_bool=$NCURSES_BOOL
+		cf_cv_header_stdbool_h=0
+	else
+		if test "$cf_cv_header_stdbool_h" = 1 ; then
+
+echo "$as_me:26754: checking for bool" >&5
+echo $ECHO_N "checking for bool... $ECHO_C" >&6
+if test "${ac_cv_type_bool+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 26760 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#if defined(__cplusplus)
+
+#ifdef HAVE_GXX_BUILTIN_H
+#include <g++/builtin.h>
+#elif HAVE_GPP_BUILTIN_H
+#include <gpp/builtin.h>
+#elif HAVE_BUILTIN_H
+#include <builtin.h>
+#endif
+
+#else
+
+#if $cf_cv_header_stdbool_h
+#include <stdbool.h>
+#endif
+
+#endif
+
+int
+main (void)
+{
+if ((bool *) 0)
+  return 0;
+if (sizeof (bool))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:26796: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:26799: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:26802: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:26805: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_type_bool=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_type_bool=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:26815: result: $ac_cv_type_bool" >&5
+echo "${ECHO_T}$ac_cv_type_bool" >&6
+
+echo "$as_me:26818: checking size of bool" >&5
+echo $ECHO_N "checking size of bool... $ECHO_C" >&6
+if test "${ac_cv_sizeof_bool+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$ac_cv_type_bool" = yes; then
+  if test "$cross_compiling" = yes; then
+  # Depending upon the size, compute the lo and hi bounds.
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 26827 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#if defined(__cplusplus)
+
+#ifdef HAVE_GXX_BUILTIN_H
+#include <g++/builtin.h>
+#elif HAVE_GPP_BUILTIN_H
+#include <gpp/builtin.h>
+#elif HAVE_BUILTIN_H
+#include <builtin.h>
+#endif
+
+#else
+
+#if $cf_cv_header_stdbool_h
+#include <stdbool.h>
+#endif
+
+#endif
+
+int
+main (void)
+{
+int _array_ [1 - 2 * !((sizeof (bool)) >= 0)]
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:26860: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:26863: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:26866: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:26869: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat >"conftest.$ac_ext" <<_ACEOF
+#line 26874 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#if defined(__cplusplus)
+
+#ifdef HAVE_GXX_BUILTIN_H
+#include <g++/builtin.h>
+#elif HAVE_GPP_BUILTIN_H
+#include <gpp/builtin.h>
+#elif HAVE_BUILTIN_H
+#include <builtin.h>
+#endif
+
+#else
+
+#if $cf_cv_header_stdbool_h
+#include <stdbool.h>
+#endif
+
+#endif
+
+int
+main (void)
+{
+int _array_ [1 - 2 * !((sizeof (bool)) <= $ac_mid)]
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:26907: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:26910: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:26913: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:26916: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_hi=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_lo=`expr "$ac_mid" + 1`; ac_mid=`expr 2 '*' "$ac_mid" + 1`
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+  done
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_hi=-1 ac_mid=-1
+  while :; do
+    cat >"conftest.$ac_ext" <<_ACEOF
+#line 26932 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#if defined(__cplusplus)
+
+#ifdef HAVE_GXX_BUILTIN_H
+#include <g++/builtin.h>
+#elif HAVE_GPP_BUILTIN_H
+#include <gpp/builtin.h>
+#elif HAVE_BUILTIN_H
+#include <builtin.h>
+#endif
+
+#else
+
+#if $cf_cv_header_stdbool_h
+#include <stdbool.h>
+#endif
+
+#endif
+
+int
+main (void)
+{
+int _array_ [1 - 2 * !((sizeof (bool)) >= $ac_mid)]
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:26965: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:26968: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:26971: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:26974: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_lo=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_hi=`expr "$ac_mid" - 1`; ac_mid=`expr 2 '*' "$ac_mid"`
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+  done
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  ac_mid=`expr '(' "$ac_hi" - "$ac_lo" ')' / 2 + "$ac_lo"`
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 26990 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#if defined(__cplusplus)
+
+#ifdef HAVE_GXX_BUILTIN_H
+#include <g++/builtin.h>
+#elif HAVE_GPP_BUILTIN_H
+#include <gpp/builtin.h>
+#elif HAVE_BUILTIN_H
+#include <builtin.h>
+#endif
+
+#else
+
+#if $cf_cv_header_stdbool_h
+#include <stdbool.h>
+#endif
+
+#endif
+
+int
+main (void)
+{
+int _array_ [1 - 2 * !((sizeof (bool)) <= $ac_mid)]
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:27023: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:27026: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:27029: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:27032: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_hi=$ac_mid
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_lo=`expr "$ac_mid" + 1`
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+done
+ac_cv_sizeof_bool=$ac_lo
+else
+  if test "$cross_compiling" = yes; then
+  { { echo "$as_me:27045: error: cannot run test program while cross compiling" >&5
+echo "$as_me: error: cannot run test program while cross compiling" >&2;}
+   { (exit 1); exit 1; }; }
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 27050 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#if defined(__cplusplus)
+
+#ifdef HAVE_GXX_BUILTIN_H
+#include <g++/builtin.h>
+#elif HAVE_GPP_BUILTIN_H
+#include <gpp/builtin.h>
+#elif HAVE_BUILTIN_H
+#include <builtin.h>
+#endif
+
+#else
+
+#if $cf_cv_header_stdbool_h
+#include <stdbool.h>
+#endif
+
+#endif
+
+int
+main (void)
+{
+FILE *f = fopen ("conftest.val", "w");
+if (!f)
+  $ac_main_return (1);
+fprintf (f, "%ld", (long)(sizeof (bool)));
+fclose (f);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:27087: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:27090: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:27092: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:27095: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_sizeof_bool=`cat conftest.val`
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+fi
+rm -f conftest.val
+else
+  ac_cv_sizeof_bool=0
+fi
+fi
+echo "$as_me:27111: result: $ac_cv_sizeof_bool" >&5
+echo "${ECHO_T}$ac_cv_sizeof_bool" >&6
+cat >>confdefs.h <<EOF
+#define SIZEOF_BOOL $ac_cv_sizeof_bool
+EOF
+
+echo "$as_me:27117: checking for type of bool" >&5
+echo $ECHO_N "checking for type of bool... $ECHO_C" >&6
+if test "${cf_cv_type_of_bool+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	rm -f cf_test.out
+	if test "$cross_compiling" = yes; then
+
+		case x$ac_cv_sizeof_bool in
+		(x1) cf_cv_type_of_bool="unsigned char";;
+		(x2) cf_cv_type_of_bool="unsigned short";;
+		(x4) cf_cv_type_of_bool="unsigned int";;
+		(x8) cf_cv_type_of_bool="unsigned long";;
+		(*)  cf_cv_type_of_bool=unknown;;
+		esac
+
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 27136 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#if defined(__cplusplus)
+
+#ifdef HAVE_GXX_BUILTIN_H
+#include <g++/builtin.h>
+#elif HAVE_GPP_BUILTIN_H
+#include <gpp/builtin.h>
+#elif HAVE_BUILTIN_H
+#include <builtin.h>
+#endif
+
+#else
+
+#if $cf_cv_header_stdbool_h
+#include <stdbool.h>
+#endif
+
+#endif
+
+int main(void)
+{
+	FILE *fp = fopen("cf_test.out", "w");
+	if (fp != 0) {
+		bool x = true;
+		if ((bool)(-x) >= 0)
+			fputs("unsigned ", fp);
+		if (sizeof(x) == sizeof(int))       fputs("int",  fp);
+		else if (sizeof(x) == sizeof(char)) fputs("char", fp);
+		else if (sizeof(x) == sizeof(short))fputs("short",fp);
+		else if (sizeof(x) == sizeof(long)) fputs("long", fp);
+		fclose(fp);
+	}
+	${cf_cv_main_return:-return}(0);
+}
+
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:27178: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:27181: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:27183: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:27186: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_type_of_bool=`cat cf_test.out`
+		 if test -z "$cf_cv_type_of_bool"; then
+		   cf_cv_type_of_bool=unknown
+		 fi
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_type_of_bool=unknown
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+	rm -f cf_test.out
+
+fi
+echo "$as_me:27203: result: $cf_cv_type_of_bool" >&5
+echo "${ECHO_T}$cf_cv_type_of_bool" >&6
+
+if test "$cf_cv_type_of_bool" = unknown ; then
+	case .$NCURSES_BOOL in
+	(.auto|.) NCURSES_BOOL=unsigned;;
+	esac
+	{ echo "$as_me:27210: WARNING: Assuming $NCURSES_BOOL for type of bool" >&5
+echo "$as_me: WARNING: Assuming $NCURSES_BOOL for type of bool" >&2;}
+	cf_cv_type_of_bool=$NCURSES_BOOL
+fi
+
+		else
+			echo "$as_me:27216: checking for fallback type of bool" >&5
+echo $ECHO_N "checking for fallback type of bool... $ECHO_C" >&6
+			case "$host_cpu" in
+			(i?86)	cf_cv_type_of_bool=char	;;
+			(*)	cf_cv_type_of_bool=int	;;
+			esac
+			echo "$as_me:27222: result: $cf_cv_type_of_bool" >&5
+echo "${ECHO_T}$cf_cv_type_of_bool" >&6
+		fi
+	fi
+fi
+
+# If the C compiler did not declare bool, and we did not determine that the C++
+# compiler does not declare bool, turn on an ifdef in curses.h that makes the
+# ncurses library use the same type as C++ bool.  Note that this allows one to
+# specify the type of bool in a configure-script option and postpone
+# integration with the C++ compiler provided that the types are compatible.
+USE_CXX_BOOL=1
+if test "$cf_cv_cc_bool_type" = 1
+then
+	# oops: C has a bool.  Unlikely, but C++ could differ.
+	USE_CXX_BOOL=0
+elif test "$cf_cv_builtin_bool" = 0
+then
+	# C++ has no bool
+	USE_CXX_BOOL=0
+else
+	# this is the normal case
+	USE_CXX_BOOL='defined(__cplusplus)'
+fi
+
+if test -f "${srcdir}/Ada95/Makefile.in" ; then
+
+	if test "$cf_with_ada" != "no" ; then
+		if test "$with_libtool" != "no"; then
+			{ echo "$as_me:27251: WARNING: libtool does not support Ada - disabling feature" >&5
+echo "$as_me: WARNING: libtool does not support Ada - disabling feature" >&2;}
+			cf_with_ada=no
+		fi
+	fi
+
+	if test "$cf_with_ada" != "no" ; then
+
+for cf_prog_gnat in gnat gnatmake gprconfig gprbuild
+do
+
+cf_upper_prog_gnat=`echo "${cf_prog_gnat}" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+	unset ac_cv_path_cf_TEMP_gnat
+	unset cf_TEMP_gnat
+	# Extract the first word of "$cf_prog_gnat", so it can be a program name with args.
+set dummy $cf_prog_gnat; ac_word=$2
+echo "$as_me:27268: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_cf_TEMP_gnat+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $cf_TEMP_gnat in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_cf_TEMP_gnat="$cf_TEMP_gnat" # Let the user override the test with a path.
+  ;;
+  *)
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  if $as_executable_p "$ac_dir/$ac_word"; then
+   ac_cv_path_cf_TEMP_gnat="$ac_dir/$ac_word"
+   echo "$as_me:27285: found $ac_dir/$ac_word" >&5
+   break
+fi
+done
+
+  test -z "$ac_cv_path_cf_TEMP_gnat" && ac_cv_path_cf_TEMP_gnat="no"
+  ;;
+esac
+fi
+cf_TEMP_gnat=$ac_cv_path_cf_TEMP_gnat
+
+if test -n "$cf_TEMP_gnat"; then
+  echo "$as_me:27297: result: $cf_TEMP_gnat" >&5
+echo "${ECHO_T}$cf_TEMP_gnat" >&6
+else
+  echo "$as_me:27300: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+	eval "cf_cv_PATH_$cf_upper_prog_gnat=$ac_cv_path_cf_TEMP_gnat"
+
+	if test "x$cf_TEMP_gnat" != xno; then
+		unset cf_cv_gnat_version
+		unset cf_TEMP_gnat
+
+echo "$as_me:27310: checking for $cf_prog_gnat version" >&5
+echo $ECHO_N "checking for $cf_prog_gnat version... $ECHO_C" >&6
+if test "${cf_cv_gnat_version+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cf_cv_gnat_version=`$cf_prog_gnat --version 2>&1 | \
+	grep '[0-9].[0-9][0-9]*' |\
+	sed -e '2,$d' -e 's/[^0-9 \.]//g' -e 's/^[ ]*//' -e 's/ .*//'`
+
+fi
+echo "$as_me:27321: result: $cf_cv_gnat_version" >&5
+echo "${ECHO_T}$cf_cv_gnat_version" >&6
+test -z "$cf_cv_gnat_version" && cf_cv_gnat_version=no
+eval cf_TEMP_gnat=$cf_cv_gnat_version; unset cf_cv_gnat_version
+
+	fi
+	eval "cf_cv_VERSION_$cf_upper_prog_gnat=$cf_TEMP_gnat"
+
+	unset cf_TEMP_gnat
+	unset cf_cv_gnat_version
+	unset ac_cv_path_cf_TEMP_gnat
+done
+
+if test "x$cf_cv_VERSION_GNATMAKE" = "xno"; then
+	cf_ada_make=
+	cf_cv_prog_gnat_correct=no
+else
+	cf_ada_make=gnatmake
+	if test "x$cf_cv_VERSION_GPRCONFIG" = "xno"; then
+		# gprconfig is newer than gnatmake; we can continue...
+		cf_ada_config="##"
+	else
+		rm -rf ./conftest* ./*~conftest*
+		if mkdir conftest.src
+		then
+			cf_ada_config=""
+			cd conftest.src
+			for cf_gprconfig in Ada C
+			do
+				echo "$as_me:27350: checking for gprconfig name for $cf_gprconfig" >&5
+echo $ECHO_N "checking for gprconfig name for $cf_gprconfig... $ECHO_C" >&6
+				if test "$cf_gprconfig" = C
+				then
+					for cf_gprconfig_param in \
+						"$cf_gprconfig,,,,GNATGCC" \
+						"$cf_gprconfig,,,,GCC" \
+						"$cf_gprconfig"
+					do
+						cf_gprconfig_value=`echo s| gprconfig --config=$cf_gprconfig_param 2>&5 | ${AWK:-awk} '/^\*/{print $3;}' | head -n 1`
+						test -n "$cf_gprconfig_value" && break
+					done
+				else
+					cf_gprconfig_param=$cf_gprconfig
+					cf_gprconfig_value=`echo s| gprconfig --config=$cf_gprconfig_param 2>&5 | ${AWK:-awk} '/^\*/{print $3;}' | head -n 1`
+				fi
+				if test -n "$cf_gprconfig_value"
+				then
+					eval "cf_ada_config_$cf_gprconfig=$cf_gprconfig_value"
+					echo "$as_me:27369: result: $cf_gprconfig_value" >&5
+echo "${ECHO_T}$cf_gprconfig_value" >&6
+				else
+					echo "$as_me:27372: result: missing" >&5
+echo "${ECHO_T}missing" >&6
+					cf_ada_config="#"
+					break
+				fi
+			done
+			cd ..
+			rm -rf ./conftest* ./*~conftest*
+		fi
+	fi
+	if test "x$cf_ada_config" != "x#"
+	then
+
+echo "$as_me:27385: checking for gnat version" >&5
+echo $ECHO_N "checking for gnat version... $ECHO_C" >&6
+if test "${cf_cv_gnat_version+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cf_cv_gnat_version=`${cf_ada_make:-gnatmake} --version 2>&1 | \
+	grep '[0-9].[0-9][0-9]*' |\
+	sed -e '2,$d' -e 's/[^0-9 \.]//g' -e 's/^[ ]*//' -e 's/ .*//'`
+
+fi
+echo "$as_me:27396: result: $cf_cv_gnat_version" >&5
+echo "${ECHO_T}$cf_cv_gnat_version" >&6
+test -z "$cf_cv_gnat_version" && cf_cv_gnat_version=no
+
+case "$cf_cv_gnat_version" in
+(3.1[1-9]*|3.[2-9]*|[4-9].*|[1-9][0-9].[0-9]*|20[0-9][0-9])
+	cf_cv_prog_gnat_correct=yes
+	;;
+(*)
+	{ echo "$as_me:27405: WARNING: Unsupported GNAT version $cf_cv_gnat_version. We require 3.11 or better. Disabling Ada95 binding." >&5
+echo "$as_me: WARNING: Unsupported GNAT version $cf_cv_gnat_version. We require 3.11 or better. Disabling Ada95 binding." >&2;}
+	cf_cv_prog_gnat_correct=no
+	;;
+esac
+
+		# Extract the first word of "m4", so it can be a program name with args.
+set dummy m4; ac_word=$2
+echo "$as_me:27413: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_M4_exists+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$M4_exists"; then
+  ac_cv_prog_M4_exists="$M4_exists" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_M4_exists="yes"
+echo "$as_me:27428: found $ac_dir/$ac_word" >&5
+break
+done
+
+  test -z "$ac_cv_prog_M4_exists" && ac_cv_prog_M4_exists="no"
+fi
+fi
+M4_exists=$ac_cv_prog_M4_exists
+if test -n "$M4_exists"; then
+  echo "$as_me:27437: result: $M4_exists" >&5
+echo "${ECHO_T}$M4_exists" >&6
+else
+  echo "$as_me:27440: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+		if test "$ac_cv_prog_M4_exists" = no; then
+			cf_cv_prog_gnat_correct=no
+			{ echo "$as_me:27446: WARNING: Ada95 binding required program m4 not found. Ada95 binding disabled" >&5
+echo "$as_me: WARNING: Ada95 binding required program m4 not found. Ada95 binding disabled" >&2;}
+		fi
+		if test "$cf_cv_prog_gnat_correct" = yes; then
+			echo "$as_me:27450: checking if GNAT works" >&5
+echo $ECHO_N "checking if GNAT works... $ECHO_C" >&6
+
+rm -rf ./conftest* ./*~conftest*
+cat >>conftest.ads <<CF_EOF
+procedure conftest;
+CF_EOF
+cat >>conftest.adb <<CF_EOF
+with Text_IO;
+with GNAT.OS_Lib;
+procedure conftest is
+begin
+   Text_IO.Put ("Hello World");
+   Text_IO.New_Line;
+   GNAT.OS_Lib.OS_Exit (0);
+end conftest;
+CF_EOF
+if ( "$cf_ada_make" $ADAFLAGS conftest 1>&5 2>&1 ) ; then
+   if ( ./conftest 1>&5 2>&1 ) ; then
+      cf_cv_prog_gnat_correct=yes
+   else
+      cf_cv_prog_gnat_correct=no
+   fi
+else
+   cf_cv_prog_gnat_correct=no
+fi
+rm -rf ./conftest* ./*~conftest*
+
+			echo "$as_me:27478: result: $cf_cv_prog_gnat_correct" >&5
+echo "${ECHO_T}$cf_cv_prog_gnat_correct" >&6
+		fi
+	else
+		cf_cv_prog_gnat_correct=no
+	fi
+fi
+
+		if test	"x$cf_cv_prog_gnat_correct" = xyes; then
+
+ 	ADAFLAGS="$ADAFLAGS -gnatpn"
+
+	echo "$as_me:27490: checking optimization options for ADAFLAGS" >&5
+echo $ECHO_N "checking optimization options for ADAFLAGS... $ECHO_C" >&6
+	case "$CFLAGS" in
+	(*-g*)
+
+ 	ADAFLAGS="$ADAFLAGS -g"
+
+		;;
+	esac
+	case "$CFLAGS" in
+	(*-O*)
+		cf_O_flag=`echo "$CFLAGS" |sed -e 's/^.*-O/-O/' -e 's/[ 	].*//'`
+
+ 	ADAFLAGS="$ADAFLAGS $cf_O_flag"
+
+		;;
+	esac
+	echo "$as_me:27507: result: $ADAFLAGS" >&5
+echo "${ECHO_T}$ADAFLAGS" >&6
+
+echo "$as_me:27510: checking if GNATPREP supports -T option" >&5
+echo $ECHO_N "checking if GNATPREP supports -T option... $ECHO_C" >&6
+if test "${cf_cv_gnatprep_opt_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cf_cv_gnatprep_opt_t=no
+gnatprep -T 2>/dev/null >/dev/null && cf_cv_gnatprep_opt_t=yes
+
+fi
+echo "$as_me:27520: result: $cf_cv_gnatprep_opt_t" >&5
+echo "${ECHO_T}$cf_cv_gnatprep_opt_t" >&6
+test "$cf_cv_gnatprep_opt_t" = yes && GNATPREP_OPTS="-T $GNATPREP_OPTS"
+
+echo "$as_me:27524: checking if GNAT supports generics" >&5
+echo $ECHO_N "checking if GNAT supports generics... $ECHO_C" >&6
+case "$cf_cv_gnat_version" in
+(3.1[1-9]*|3.[2-9]*|[4-9].*|[1-9][0-9].[0-9]*|20[0-9][0-9])
+	cf_gnat_generics=yes
+	;;
+(*)
+	cf_gnat_generics=no
+	;;
+esac
+echo "$as_me:27534: result: $cf_gnat_generics" >&5
+echo "${ECHO_T}$cf_gnat_generics" >&6
+
+if test "$cf_gnat_generics" = yes
+then
+	cf_compile_generics=generics
+	cf_generic_objects="\${GENOBJS}"
+else
+	cf_compile_generics=
+	cf_generic_objects=
+fi
+
+echo "$as_me:27546: checking if GNAT supports SIGINT" >&5
+echo $ECHO_N "checking if GNAT supports SIGINT... $ECHO_C" >&6
+if test "${cf_cv_gnat_sigint+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+rm -rf ./conftest* ./*~conftest*
+cat >>conftest.ads <<CF_EOF
+with Ada.Interrupts.Names;
+
+package ConfTest is
+
+   pragma Warnings (Off);  --  the next pragma exists since 3.11p
+   pragma Unreserve_All_Interrupts;
+   pragma Warnings (On);
+
+   protected Process is
+      procedure Stop;
+      function Continue return Boolean;
+      pragma Attach_Handler (Stop, Ada.Interrupts.Names.SIGINT);
+   private
+      Done : Boolean := False;
+   end Process;
+
+end ConfTest;
+CF_EOF
+cat >>conftest.adb <<CF_EOF
+package body ConfTest is
+   protected body Process is
+      procedure Stop is
+      begin
+         Done := True;
+      end Stop;
+      function Continue return Boolean is
+      begin
+         return not Done;
+      end Continue;
+   end Process;
+end ConfTest;
+CF_EOF
+if ( "$cf_ada_make" $ADAFLAGS conftest 1>&5 2>&1 ) ; then
+      cf_cv_gnat_sigint=yes
+else
+   cf_cv_gnat_sigint=no
+fi
+rm -rf ./conftest* ./*~conftest*
+
+fi
+echo "$as_me:27594: result: $cf_cv_gnat_sigint" >&5
+echo "${ECHO_T}$cf_cv_gnat_sigint" >&6
+
+if test "$cf_cv_gnat_sigint" = yes ; then
+	USE_GNAT_SIGINT=""
+else
+	USE_GNAT_SIGINT="#"
+fi
+
+cf_gnat_libraries=no
+cf_gnat_projects=no
+
+if test "$enable_gnat_projects" != no ; then
+echo "$as_me:27607: checking if GNAT supports project files" >&5
+echo $ECHO_N "checking if GNAT supports project files... $ECHO_C" >&6
+case "$cf_cv_gnat_version" in
+(3.[0-9]*)
+	;;
+(*)
+	case "$cf_cv_system_name" in
+	(cygwin*|msys*)
+		;;
+	(*)
+		rm -rf ./conftest* ./*~conftest*
+		if mkdir conftest.src conftest.bin conftest.lib
+		then
+			cd conftest.src
+			rm -rf ./conftest* ./*~conftest*
+			cat >>library.gpr <<CF_EOF
+project Library is
+  Kind := External ("LIB_KIND");
+  for Library_Name use "ConfTest";
+  for Object_Dir use ".";
+  for Library_ALI_Dir use External("LIBRARY_DIR");
+  for Library_Version use External ("SONAME");
+  for Library_Kind use Kind;
+  for Library_Dir use External("BUILD_DIR");
+  Source_Dir := External ("SOURCE_DIR");
+  for Source_Dirs use (Source_Dir);
+end Library;
+CF_EOF
+			cat >>confpackage.ads <<CF_EOF
+package ConfPackage is
+   procedure conftest;
+end ConfPackage;
+CF_EOF
+			cat >>confpackage.adb <<CF_EOF
+with Text_IO;
+package body ConfPackage is
+   procedure conftest is
+   begin
+      Text_IO.Put ("Hello World");
+      Text_IO.New_Line;
+   end conftest;
+end ConfPackage;
+CF_EOF
+			if ( "$cf_ada_make" $ADAFLAGS \
+					-Plibrary.gpr \
+					-XBUILD_DIR="`cd ../conftest.bin;pwd`" \
+					-XLIBRARY_DIR="`cd ../conftest.lib;pwd`" \
+					-XSOURCE_DIR="`pwd`" \
+					-XSONAME=libConfTest.so.1 \
+					-XLIB_KIND=static 1>&5 2>&1 ) ; then
+				cf_gnat_projects=yes
+			fi
+			cd ..
+		fi
+		if test -f conftest.lib/confpackage.ali
+		then
+			cf_gnat_libraries=yes
+		fi
+		rm -rf ./conftest* ./*~conftest*
+		;;
+	esac
+	;;
+esac
+echo "$as_me:27670: result: $cf_gnat_projects" >&5
+echo "${ECHO_T}$cf_gnat_projects" >&6
+fi # enable_gnat_projects
+
+if test "$cf_gnat_projects" = yes
+then
+	echo "$as_me:27676: checking if GNAT supports libraries" >&5
+echo $ECHO_N "checking if GNAT supports libraries... $ECHO_C" >&6
+	echo "$as_me:27678: result: $cf_gnat_libraries" >&5
+echo "${ECHO_T}$cf_gnat_libraries" >&6
+fi
+
+USE_OLD_MAKERULES=""
+USE_GNAT_PROJECTS="#"
+USE_GNAT_MAKE_GPR="#"
+USE_GNAT_GPRBUILD="#"
+
+if test "$cf_gnat_projects" = yes
+then
+	USE_OLD_MAKERULES="#"
+	USE_GNAT_PROJECTS=""
+	if test "$cf_cv_VERSION_GPRBUILD" != no
+	then
+		USE_GNAT_GPRBUILD=""
+	elif test "$cf_cv_VERSION_GNATMAKE" != no
+	then
+		USE_GNAT_MAKE_GPR=""
+	else
+		{ echo "$as_me:27698: WARNING: use old makefile rules since tools are missing" >&5
+echo "$as_me: WARNING: use old makefile rules since tools are missing" >&2;}
+	fi
+fi
+
+if test "$cf_gnat_libraries" = yes
+then
+	USE_GNAT_LIBRARIES=""
+else
+	USE_GNAT_LIBRARIES="#"
+fi
+
+echo "$as_me:27710: checking for ada-compiler" >&5
+echo $ECHO_N "checking for ada-compiler... $ECHO_C" >&6
+
+# Check whether --with-ada-compiler or --without-ada-compiler was given.
+if test "${with_ada_compiler+set}" = set; then
+  withval="$with_ada_compiler"
+  cf_ada_compiler=$withval
+else
+  cf_ada_compiler=gnatmake
+fi;
+
+echo "$as_me:27721: result: $cf_ada_compiler" >&5
+echo "${ECHO_T}$cf_ada_compiler" >&6
+
+			cf_ada_package=terminal_interface
+
+echo "$as_me:27726: checking for ada-include" >&5
+echo $ECHO_N "checking for ada-include... $ECHO_C" >&6
+
+# Check whether --with-ada-include or --without-ada-include was given.
+if test "${with_ada_include+set}" = set; then
+  withval="$with_ada_include"
+
+else
+  withval="${ADA_INCLUDE:-$prefix/share/ada/adainclude}"
+fi; if test -n "$prefix/share/ada/adainclude" ; then
+
+if test "x$prefix" != xNONE; then
+	cf_path_syntax="$prefix"
+else
+	cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$withval" in
+(.\$\(*\)*|.\'*\'*)
+	;;
+(..|./*|.\\*)
+	;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+	;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+	eval withval="$withval"
+	case ".$withval" in
+	(.NONE/*)
+		withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%`
+		;;
+	esac
+	;;
+(.no|.NONE/*)
+	withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%`
+	;;
+(*)
+	{ { echo "$as_me:27762: error: expected a pathname, not \"$withval\"" >&5
+echo "$as_me: error: expected a pathname, not \"$withval\"" >&2;}
+   { (exit 1); exit 1; }; }
+	;;
+esac
+
+fi
+eval ADA_INCLUDE="$withval"
+
+echo "$as_me:27771: result: $ADA_INCLUDE" >&5
+echo "${ECHO_T}$ADA_INCLUDE" >&6
+
+echo "$as_me:27774: checking for ada-objects" >&5
+echo $ECHO_N "checking for ada-objects... $ECHO_C" >&6
+
+# Check whether --with-ada-objects or --without-ada-objects was given.
+if test "${with_ada_objects+set}" = set; then
+  withval="$with_ada_objects"
+
+else
+  withval="${ADA_OBJECTS:-$prefix/lib/ada/adalib}"
+fi; if test -n "$prefix/lib/ada/adalib" ; then
+
+if test "x$prefix" != xNONE; then
+	cf_path_syntax="$prefix"
+else
+	cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$withval" in
+(.\$\(*\)*|.\'*\'*)
+	;;
+(..|./*|.\\*)
+	;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+	;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+	eval withval="$withval"
+	case ".$withval" in
+	(.NONE/*)
+		withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%`
+		;;
+	esac
+	;;
+(.no|.NONE/*)
+	withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%`
+	;;
+(*)
+	{ { echo "$as_me:27810: error: expected a pathname, not \"$withval\"" >&5
+echo "$as_me: error: expected a pathname, not \"$withval\"" >&2;}
+   { (exit 1); exit 1; }; }
+	;;
+esac
+
+fi
+eval ADA_OBJECTS="$withval"
+
+echo "$as_me:27819: result: $ADA_OBJECTS" >&5
+echo "${ECHO_T}$ADA_OBJECTS" >&6
+
+echo "$as_me:27822: checking if an Ada95 shared-library should be built" >&5
+echo $ECHO_N "checking if an Ada95 shared-library should be built... $ECHO_C" >&6
+
+# Check whether --with-ada-sharedlib or --without-ada-sharedlib was given.
+if test "${with_ada_sharedlib+set}" = set; then
+  withval="$with_ada_sharedlib"
+  with_ada_sharedlib=$withval
+else
+  with_ada_sharedlib=no
+fi;
+echo "$as_me:27832: result: $with_ada_sharedlib" >&5
+echo "${ECHO_T}$with_ada_sharedlib" >&6
+
+if test "x$with_ada_sharedlib" != xno
+then
+	if test "x$cf_gnat_projects" != xyes
+	then
+		{ echo "$as_me:27839: WARNING: disabling shared-library since GNAT projects are not supported" >&5
+echo "$as_me: WARNING: disabling shared-library since GNAT projects are not supported" >&2;}
+		with_ada_sharedlib=no
+	fi
+fi
+
+ADA_SHAREDLIB='lib$(LIB_NAME).so.1'
+MAKE_ADA_SHAREDLIB="#"
+
+if test "x$with_ada_sharedlib" != xno
+then
+	MAKE_ADA_SHAREDLIB=
+	if test "x$with_ada_sharedlib" != xyes
+	then
+		ADA_SHAREDLIB="$with_ada_sharedlib"
+	fi
+fi
+
+			# allow the Ada binding to be renamed
+
+echo "$as_me:27859: checking for ada-libname" >&5
+echo $ECHO_N "checking for ada-libname... $ECHO_C" >&6
+
+# Check whether --with-ada-libname or --without-ada-libname was given.
+if test "${with_ada_libname+set}" = set; then
+  withval="$with_ada_libname"
+  ADA_LIBNAME=$withval
+else
+  ADA_LIBNAME=AdaCurses
+fi;
+case "x$ADA_LIBNAME" in
+(x|xyes|xno)
+	ADA_LIBNAME=AdaCurses
+	;;
+esac
+
+echo "$as_me:27875: result: $ADA_LIBNAME" >&5
+echo "${ECHO_T}$ADA_LIBNAME" >&6
+
+		fi
+	fi
+else
+	cf_with_ada=no
+fi
+
+# do this "late" to avoid conflict with header-checks
+if test "x$with_widec" = xyes ; then
+	echo "$as_me:27886: checking for wchar_t" >&5
+echo $ECHO_N "checking for wchar_t... $ECHO_C" >&6
+if test "${ac_cv_type_wchar_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 27892 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+if ((wchar_t *) 0)
+  return 0;
+if (sizeof (wchar_t))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:27907: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:27910: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:27913: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:27916: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_type_wchar_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_type_wchar_t=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:27926: result: $ac_cv_type_wchar_t" >&5
+echo "${ECHO_T}$ac_cv_type_wchar_t" >&6
+
+echo "$as_me:27929: checking size of wchar_t" >&5
+echo $ECHO_N "checking size of wchar_t... $ECHO_C" >&6
+if test "${ac_cv_sizeof_wchar_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$ac_cv_type_wchar_t" = yes; then
+  if test "$cross_compiling" = yes; then
+  # Depending upon the size, compute the lo and hi bounds.
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 27938 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+int _array_ [1 - 2 * !((sizeof (wchar_t)) >= 0)]
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:27950: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:27953: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:27956: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:27959: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat >"conftest.$ac_ext" <<_ACEOF
+#line 27964 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+int _array_ [1 - 2 * !((sizeof (wchar_t)) <= $ac_mid)]
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:27976: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:27979: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:27982: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:27985: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_hi=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_lo=`expr "$ac_mid" + 1`; ac_mid=`expr 2 '*' "$ac_mid" + 1`
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+  done
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_hi=-1 ac_mid=-1
+  while :; do
+    cat >"conftest.$ac_ext" <<_ACEOF
+#line 28001 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+int _array_ [1 - 2 * !((sizeof (wchar_t)) >= $ac_mid)]
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:28013: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:28016: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:28019: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:28022: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_lo=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_hi=`expr "$ac_mid" - 1`; ac_mid=`expr 2 '*' "$ac_mid"`
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+  done
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  ac_mid=`expr '(' "$ac_hi" - "$ac_lo" ')' / 2 + "$ac_lo"`
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 28038 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+int _array_ [1 - 2 * !((sizeof (wchar_t)) <= $ac_mid)]
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:28050: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:28053: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:28056: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:28059: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_hi=$ac_mid
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_lo=`expr "$ac_mid" + 1`
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+done
+ac_cv_sizeof_wchar_t=$ac_lo
+else
+  if test "$cross_compiling" = yes; then
+  { { echo "$as_me:28072: error: cannot run test program while cross compiling" >&5
+echo "$as_me: error: cannot run test program while cross compiling" >&2;}
+   { (exit 1); exit 1; }; }
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 28077 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main (void)
+{
+FILE *f = fopen ("conftest.val", "w");
+if (!f)
+  $ac_main_return (1);
+fprintf (f, "%ld", (long)(sizeof (wchar_t)));
+fclose (f);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:28093: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:28096: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:28098: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:28101: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_sizeof_wchar_t=`cat conftest.val`
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+fi
+rm -f conftest.val
+else
+  ac_cv_sizeof_wchar_t=0
+fi
+fi
+echo "$as_me:28117: result: $ac_cv_sizeof_wchar_t" >&5
+echo "${ECHO_T}$ac_cv_sizeof_wchar_t" >&6
+cat >>confdefs.h <<EOF
+#define SIZEOF_WCHAR_T $ac_cv_sizeof_wchar_t
+EOF
+
+	# cross-compiling to mingw can run into the problem that attempting to
+	# link with the regex library fails, causing the test to not set this to
+	# a number.  "recent" autoconf does not address this problem either -TD
+	if test -z "$ac_cv_sizeof_wchar_t"
+	then
+		test -n "$verbose" && echo "	test failed (assume 2)" 1>&6
+
+echo "${as_me:-configure}:28130: testing test failed (assume 2) ..." 1>&5
+
+		sed /SIZEOF_WCHAR_T/d confdefs.h >confdefs.tmp
+		mv confdefs.tmp confdefs.h
+		echo "#define SIZEOF_WCHAR_T 2" >>confdefs.h
+	fi
+fi
+
+### Construct the ncurses library-subsets, if any, from this set of keywords:
+###	none, base, ext_funcs, ext_tinfo, ticlib, termlib, widechar
+###
+### ticlib modules may be a separate library, otherwise contained in termlib.
+### termlib modules may be a separate library, otherwise contained in ncurses.
+###
+### The of "+" or " " between the tokens controls the way the script
+### chooses to split module lists into libraries.
+###
+### (see CF_LIB_RULES).
+echo "$as_me:28148: checking for library subsets" >&5
+echo $ECHO_N "checking for library subsets... $ECHO_C" >&6
+LIB_SUBSETS=
+
+if test "x$cf_with_progs" = xyes || test "$with_ticlib" != no || test "$with_termcap" != no; then
+	LIB_SUBSETS="${LIB_SUBSETS}ticlib"
+	if test "$with_ticlib" != no ; then
+		LIB_SUBSETS="${LIB_SUBSETS} "
+	else
+		LIB_SUBSETS="${LIB_SUBSETS}+"
+	fi
+fi
+
+LIB_SUBSETS="${LIB_SUBSETS}termlib"
+test "x$with_ext_funcs" = xyes && LIB_SUBSETS="${LIB_SUBSETS}+ext_tinfo"
+
+if test "$with_termlib" != no ; then
+	LIB_SUBSETS="${LIB_SUBSETS} "
+else
+	LIB_SUBSETS="${LIB_SUBSETS}+"
+fi
+
+LIB_SUBSETS="${LIB_SUBSETS}base"
+
+# Most term-driver calls are to tinfo, but some like init_pair are to the
+# base library (so it resides in base).
+if test "$with_term_driver" != no ; then
+	LIB_SUBSETS="${LIB_SUBSETS}+port_drivers"
+	case "$cf_cv_system_name" in
+	(*mingw32*|*mingw64*)
+		if test "x$with_exp_win32" = xyes ; then
+			LIB_SUBSETS="${LIB_SUBSETS}+port_tinfo+port_win32"
+		else
+			LIB_SUBSETS="${LIB_SUBSETS}+port_tinfo+port_win32con"
+		fi
+		CPPFLAGS="$CPPFLAGS -DUSE_WIN32CON_DRIVER"
+		;;
+	(*)
+		LIB_SUBSETS="${LIB_SUBSETS}+port_tinfo"
+		;;
+	esac
+elif test "x$with_exp_win32" = xyes ; then
+	case "$cf_cv_system_name" in
+	(*mingw32*|*mingw64*)
+		LIB_SUBSETS="${LIB_SUBSETS}+port_win32"
+		;;
+	(*)
+		;;
+	esac
+fi
+
+test "x$with_widec"     = xyes && LIB_SUBSETS="${LIB_SUBSETS}+widechar"
+test "x$with_ext_funcs" = xyes && LIB_SUBSETS="${LIB_SUBSETS}+ext_funcs"
+
+echo "$as_me:28202: result: $LIB_SUBSETS" >&5
+echo "${ECHO_T}$LIB_SUBSETS" >&6
+
+### Construct the list of include-directories to be generated
+
+if test "$srcdir" != "."; then
+	CPPFLAGS="-I\${srcdir}/../include $CPPFLAGS"
+fi
+CPPFLAGS="-I../include $CPPFLAGS"
+if test "$srcdir" != "."; then
+	CPPFLAGS="-I\${srcdir} $CPPFLAGS"
+fi
+CPPFLAGS="-I. $CPPFLAGS"
+
+ACPPFLAGS="-I. -I../include -I../../include $ACPPFLAGS"
+if test "$srcdir" != "."; then
+	ACPPFLAGS="-I\${srcdir}/../../include $ACPPFLAGS"
+fi
+if test "$GCC" != yes; then
+	ACPPFLAGS="$ACPPFLAGS -I\${includedir}"
+elif test "$includedir" != "/usr/include"; then
+	if test "$includedir" = '${prefix}/include' ; then
+		if test x$prefix != x/usr ; then
+			ACPPFLAGS="$ACPPFLAGS -I\${includedir}"
+		fi
+	else
+		ACPPFLAGS="$ACPPFLAGS -I\${includedir}"
+	fi
+fi
+
+### Build up pieces for makefile rules
+echo "$as_me:28233: checking default library suffix" >&5
+echo $ECHO_N "checking default library suffix... $ECHO_C" >&6
+
+	case $DFT_LWR_MODEL in
+	(libtool) DFT_ARG_SUFFIX=''   ;;
+	(normal)  DFT_ARG_SUFFIX=''   ;;
+	(debug)   DFT_ARG_SUFFIX='_g' ;;
+	(profile) DFT_ARG_SUFFIX='_p' ;;
+	(shared)  DFT_ARG_SUFFIX=''   ;;
+	esac
+	test -n "$LIB_SUFFIX" && DFT_ARG_SUFFIX="${LIB_SUFFIX}${DFT_ARG_SUFFIX}"
+echo "$as_me:28244: result: $DFT_ARG_SUFFIX" >&5
+echo "${ECHO_T}$DFT_ARG_SUFFIX" >&6
+
+echo "$as_me:28247: checking default library-dependency suffix" >&5
+echo $ECHO_N "checking default library-dependency suffix... $ECHO_C" >&6
+
+	case X$DFT_LWR_MODEL in
+	(Xlibtool)
+		DFT_LIB_SUFFIX='.la'
+		DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX
+		;;
+	(Xdebug)
+		case "$cf_cv_system_name" in
+		(*-msvc*)
+			DFT_LIB_SUFFIX='_g.lib'
+			;;
+		(*)
+			DFT_LIB_SUFFIX='_g.a'
+			;;
+		esac
+		DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX
+		;;
+	(Xprofile)
+		case "$cf_cv_system_name" in
+		(*-msvc*)
+			DFT_LIB_SUFFIX='_p.lib'
+			;;
+		(*)
+			DFT_LIB_SUFFIX='_p.a'
+			;;
+		esac
+		DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX
+		;;
+	(Xshared)
+		case "$cf_cv_system_name" in
+		(aix[5-7]*)
+			DFT_LIB_SUFFIX='.so'
+			DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX
+			;;
+		(*-msvc*)
+			DFT_LIB_SUFFIX='.dll'
+			DFT_DEP_SUFFIX='.dll.lib'
+			;;
+		(cygwin*|msys*|mingw*)
+			DFT_LIB_SUFFIX='.dll'
+			DFT_DEP_SUFFIX='.dll.a'
+			;;
+		(darwin*)
+			DFT_LIB_SUFFIX='.dylib'
+			DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX
+			;;
+		(hpux*)
+			case "$target" in
+			(ia64*)
+				DFT_LIB_SUFFIX='.so'
+				DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX
+				;;
+			(*)
+				DFT_LIB_SUFFIX='.sl'
+				DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX
+				;;
+			esac
+			;;
+		(*)
+			DFT_LIB_SUFFIX='.so'
+			DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX
+			;;
+		esac
+		;;
+	(*)
+		case "$target" in
+		(*-msvc*)
+			DFT_LIB_SUFFIX='.lib'
+			;;
+		(*)
+			DFT_LIB_SUFFIX='.a'
+			;;
+		esac
+		DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX
+		;;
+	esac
+	if test -n "${LIB_SUFFIX}${EXTRA_SUFFIX}"
+	then
+		DFT_LIB_SUFFIX="${LIB_SUFFIX}${EXTRA_SUFFIX}${DFT_LIB_SUFFIX}"
+		DFT_DEP_SUFFIX="${LIB_SUFFIX}${EXTRA_SUFFIX}${DFT_DEP_SUFFIX}"
+	fi
+echo "$as_me:28330: result: $DFT_DEP_SUFFIX" >&5
+echo "${ECHO_T}$DFT_DEP_SUFFIX" >&6
+
+echo "$as_me:28333: checking default object directory" >&5
+echo $ECHO_N "checking default object directory... $ECHO_C" >&6
+
+	case $DFT_LWR_MODEL in
+	(libtool) DFT_OBJ_SUBDIR='obj_lo'  ;;
+	(normal)  DFT_OBJ_SUBDIR='objects' ;;
+	(debug)   DFT_OBJ_SUBDIR='obj_g' ;;
+	(profile) DFT_OBJ_SUBDIR='obj_p' ;;
+	(shared)
+		case "$cf_cv_system_name" in
+		(cygwin|msys)
+			DFT_OBJ_SUBDIR='objects' ;;
+		(*)
+			DFT_OBJ_SUBDIR='obj_s' ;;
+		esac
+	esac
+echo "$as_me:28349: result: $DFT_OBJ_SUBDIR" >&5
+echo "${ECHO_T}$DFT_OBJ_SUBDIR" >&6
+
+if test "x$cf_with_cxx" = xyes ; then
+echo "$as_me:28353: checking c++ library-dependency suffix" >&5
+echo $ECHO_N "checking c++ library-dependency suffix... $ECHO_C" >&6
+if test "$with_libtool" != "no"; then
+	# libtool thinks it can make c++ shared libraries (perhaps only g++)
+	CXX_LIB_SUFFIX=$DFT_DEP_SUFFIX
+elif test "$with_shared_cxx" != "no"; then
+	# also for g++ users...
+	CXX_LIB_SUFFIX=$DFT_DEP_SUFFIX
+else
+	# we normally make a static library because C/C++ library rules differ
+
+	case Xnormal in
+	(Xlibtool)
+		CXX_LIB_SUFFIX='.la'
+		CXX_DEP_SUFFIX=$CXX_LIB_SUFFIX
+		;;
+	(Xdebug)
+		case "$cf_cv_system_name" in
+		(*-msvc*)
+			CXX_LIB_SUFFIX='_g.lib'
+			;;
+		(*)
+			CXX_LIB_SUFFIX='_g.a'
+			;;
+		esac
+		CXX_DEP_SUFFIX=$CXX_LIB_SUFFIX
+		;;
+	(Xprofile)
+		case "$cf_cv_system_name" in
+		(*-msvc*)
+			CXX_LIB_SUFFIX='_p.lib'
+			;;
+		(*)
+			CXX_LIB_SUFFIX='_p.a'
+			;;
+		esac
+		CXX_DEP_SUFFIX=$CXX_LIB_SUFFIX
+		;;
+	(Xshared)
+		case "$cf_cv_system_name" in
+		(aix[5-7]*)
+			CXX_LIB_SUFFIX='.so'
+			CXX_DEP_SUFFIX=$CXX_LIB_SUFFIX
+			;;
+		(*-msvc*)
+			CXX_LIB_SUFFIX='.dll'
+			CXX_DEP_SUFFIX='.dll.lib'
+			;;
+		(cygwin*|msys*|mingw*)
+			CXX_LIB_SUFFIX='.dll'
+			CXX_DEP_SUFFIX='.dll.a'
+			;;
+		(darwin*)
+			CXX_LIB_SUFFIX='.dylib'
+			CXX_DEP_SUFFIX=$CXX_LIB_SUFFIX
+			;;
+		(hpux*)
+			case "$target" in
+			(ia64*)
+				CXX_LIB_SUFFIX='.so'
+				CXX_DEP_SUFFIX=$CXX_LIB_SUFFIX
+				;;
+			(*)
+				CXX_LIB_SUFFIX='.sl'
+				CXX_DEP_SUFFIX=$CXX_LIB_SUFFIX
+				;;
+			esac
+			;;
+		(*)
+			CXX_LIB_SUFFIX='.so'
+			CXX_DEP_SUFFIX=$CXX_LIB_SUFFIX
+			;;
+		esac
+		;;
+	(*)
+		case "$target" in
+		(*-msvc*)
+			CXX_LIB_SUFFIX='.lib'
+			;;
+		(*)
+			CXX_LIB_SUFFIX='.a'
+			;;
+		esac
+		CXX_DEP_SUFFIX=$CXX_LIB_SUFFIX
+		;;
+	esac
+	if test -n "${LIB_SUFFIX}${EXTRA_SUFFIX}"
+	then
+		CXX_LIB_SUFFIX="${LIB_SUFFIX}${EXTRA_SUFFIX}${CXX_LIB_SUFFIX}"
+		CXX_DEP_SUFFIX="${LIB_SUFFIX}${EXTRA_SUFFIX}${CXX_DEP_SUFFIX}"
+	fi
+
+fi
+echo "$as_me:28446: result: $CXX_LIB_SUFFIX" >&5
+echo "${ECHO_T}$CXX_LIB_SUFFIX" >&6
+
+fi
+
+# do not want -ldl in build except as needed for -lncurses dependency
+if test "x$with_dlsym" = xyes ; then
+if test "$DFT_LWR_MODEL" = shared || \
+   test "$DFT_LWR_MODEL" = libtool ; then
+
+# remove dl library from $LIBS
+LIBS=`echo "$LIBS" | sed -e 's/-ldl[ 	]//g' -e 's/-ldl$//'`
+
+fi
+fi
+### Set up low-level terminfo dependencies for makefiles.
+
+# TICS_LIST and TINFO_LIST are needed to build libtic.so and libterm.so, but
+# do not need libdl
+TICS_LIST=
+if test "x$with_dlsym" = xyes ; then
+
+# remove dl library from $SHLIB_LIST
+TINFO_LIST=`echo "$SHLIB_LIST" | sed -e 's/-ldl[ 	]//g' -e 's/-ldl$//'`
+
+fi
+
+USE_ARG_SUFFIX="${DFT_ARG_SUFFIX}${EXTRA_SUFFIX}"
+USE_LIB_SUFFIX="${LIB_SUFFIX}${EXTRA_SUFFIX}"
+USE_CFG_SUFFIX=${DFT_ARG_SUFFIX}${cf_cv_abi_version}
+if test -n "$EXTRA_SUFFIX" && test "x$EXTRA_SUFFIX" != "x${cf_cv_abi_version}"
+then
+	USE_CFG_SUFFIX="${USE_CFG_SUFFIX}${EXTRA_SUFFIX}"
+fi
+
+if test "$with_ticlib" != no ; then
+
+	if test "x$with_ticlib" != xyes ; then
+		TICS_NAME=$with_ticlib
+		TICS_SUFFIX="`echo "${DFT_LIB_SUFFIX}" |sed -e "s/^${USE_LIB_SUFFIX}//"`"
+		TICS_ARG_SUFFIX="${with_ticlib}`echo "${USE_ARG_SUFFIX}" |sed -e "s/^${LIB_SUFFIX}//"`"
+		TICS_DEP_SUFFIX="${with_ticlib}`echo "${DFT_DEP_SUFFIX}" |sed -e "s/^${LIB_SUFFIX}//"`"
+		TICS_LIB_SUFFIX="${with_ticlib}"
+	else
+		TICS_SUFFIX=${DFT_LIB_SUFFIX}
+		TICS_ARG_SUFFIX="${TICS_NAME}${USE_ARG_SUFFIX}"
+		TICS_DEP_SUFFIX="${TICS_NAME}${DFT_DEP_SUFFIX}"
+		TICS_LIB_SUFFIX="${TICS_NAME}${USE_LIB_SUFFIX}"
+	fi
+	TICS_LDFLAGS="-L${LIB_DIR}"
+	TICS_LIBS="-l${TICS_ARG_SUFFIX}"
+else
+	TICS_SUFFIX=${DFT_LIB_SUFFIX}
+	TICS_LDFLAGS="-L${LIB_DIR}"
+	TICS_LIBS="-l${LIB_NAME}${USE_ARG_SUFFIX}"
+fi
+
+if test "$with_termlib" != no ; then
+
+	if test "x$with_termlib" != xyes ; then
+		TINFO_NAME=$with_termlib
+		TINFO_SUFFIX="`echo "${DFT_LIB_SUFFIX}" |sed -e "s/^${USE_LIB_SUFFIX}//"`"
+		TINFO_ARG_SUFFIX="${with_termlib}`echo "${USE_ARG_SUFFIX}" |sed -e "s/^${LIB_SUFFIX}//"`"
+		TINFO_DEP_SUFFIX="${with_termlib}`echo "${DFT_DEP_SUFFIX}" |sed -e "s/^${LIB_SUFFIX}//"`"
+		TINFO_LIB_SUFFIX="${with_termlib}"
+	else
+		TINFO_SUFFIX=${DFT_LIB_SUFFIX}
+		TINFO_ARG_SUFFIX="${TINFO_NAME}${USE_ARG_SUFFIX}"
+		TINFO_DEP_SUFFIX="${TINFO_NAME}${DFT_DEP_SUFFIX}"
+		TINFO_LIB_SUFFIX="${TINFO_NAME}${USE_LIB_SUFFIX}"
+	fi
+
+	TEST_DEPS="${LIB_DIR}/${LIB_PREFIX}${TINFO_DEP_SUFFIX}"
+	TEST_DEP2="${LIB_2ND}/${LIB_PREFIX}${TINFO_DEP_SUFFIX}"
+	if test "$DFT_LWR_MODEL" = "libtool"; then
+		TEST_ARGS="${TEST_DEPS}"
+		TEST_ARG2="${TEST_DEP2}"
+		TINFO_LDFLAGS="-L${LIB_DIR}"
+		TINFO_LIBS="$TEST_ARGS"
+		TICS_LIST="$SHLIB_LIST $TEST_ARGS"
+		SHLIB_LIST="${SHLIB_LIST} $TEST_ARGS"
+	else
+		TEST_ARGS="-l${TINFO_ARG_SUFFIX}"
+		TEST_ARG2="-l${TINFO_ARG_SUFFIX}"
+		if test "x$with_term_driver" != xno ; then
+			TICS_LIST="$SHLIB_LIST -l${LIB_NAME}${USE_ARG_SUFFIX}"
+			TICS_LIBS="$TICS_LIBS -l${LIB_NAME}${USE_ARG_SUFFIX}"
+			TINFO_LIBS="-l${LIB_NAME}${USE_ARG_SUFFIX} $TEST_ARGS"
+		else
+			TICS_LIST="$SHLIB_LIST -l${TINFO_LIB_SUFFIX}"
+			TINFO_LIBS="$TEST_ARGS"
+		fi
+		TINFO_LDFLAGS="-L${LIB_DIR}"
+		SHLIB_LIST="$SHLIB_LIST -l${TINFO_LIB_SUFFIX}"
+	fi
+else
+	# the next lines are needed for linking libtic over libncurses
+	TINFO_NAME=${LIB_NAME}
+	TINFO_SUFFIX=${DFT_LIB_SUFFIX}
+	TINFO_ARG_SUFFIX=${LIB_NAME}${USE_ARG_SUFFIX}
+	if test "x$with_tic_depends" = xyes ; then
+		TICS_LIST="$SHLIB_LIST -l${LIB_NAME}${USE_ARG_SUFFIX}"
+	else
+		TICS_LIST="$SHLIB_LIST"
+	fi
+
+	TINFO_LDFLAGS="-L${LIB_DIR}"
+	TINFO_LIBS="-l${LIB_NAME}${USE_ARG_SUFFIX}"
+fi
+
+if test "$DFT_LWR_MODEL" = shared ; then
+	case "$cf_cv_system_name" in
+	(cygwin*|msys*)
+		# "lib" files have ".dll.a" suffix, "cyg"or "msys-" files have ".dll"
+		TINFO_SUFFIX=.dll
+		;;
+	esac
+fi
+
+if test "x$with_dlsym" = xyes ; then
+
+# remove dl library from $TICS_LIST
+TICS_LIST=`echo "$TICS_LIST" | sed -e 's/-ldl[ 	]//g' -e 's/-ldl$//'`
+
+fi
+
+if test "$DFT_LWR_MODEL" = "libtool"; then
+	OBJEXT=lo
+fi
+
+# needed for Ada95
+TINFO_LDFLAGS2=`echo "$TINFO_LDFLAGS" | sed -e 's,-L\.\./,-L../../,'`
+
+case "$DFT_LWR_MODEL" in
+(normal|debug|profile)
+
+if test "$GCC" = yes ; then
+	case "$cf_cv_system_name" in
+	(OS/2*|os2*|aix[4]*|solaris2.1[0-9]|darwin*)
+		LDFLAGS_STATIC=
+		LDFLAGS_SHARED=
+		;;
+	(*) 	# normally, except when broken
+		LDFLAGS_STATIC=-static
+		LDFLAGS_SHARED=-dynamic
+		;;
+	esac
+else
+	case "$cf_cv_system_name" in
+	(aix[4-7]*) 	# from ld manpage
+		LDFLAGS_STATIC=-bstatic
+		LDFLAGS_SHARED=-bdynamic
+		;;
+	(hpux*)		# from ld manpage for hpux10.20, hpux11.11
+		# We could also use just "archive" and "shared".
+		LDFLAGS_STATIC=-Wl,-a,archive_shared
+		LDFLAGS_SHARED=-Wl,-a,shared_archive
+		;;
+	(irix*)		# from ld manpage IRIX64
+		LDFLAGS_STATIC=-Bstatic
+		LDFLAGS_SHARED=-Bdynamic
+		;;
+	(osf[45]*)	# from ld manpage osf4.0d, osf5.1
+		# alternative "-oldstyle_liblookup" (not in cc manpage)
+		LDFLAGS_STATIC=-noso
+		LDFLAGS_SHARED=-so_archive
+		;;
+	(solaris2*)
+		LDFLAGS_STATIC=-Bstatic
+		LDFLAGS_SHARED=-Bdynamic
+		;;
+	esac
+fi
+
+if test -n "$LDFLAGS_STATIC" && test -n "$LDFLAGS_SHARED"
+then
+	echo "$as_me:28622: checking if linker supports switching between static/dynamic" >&5
+echo $ECHO_N "checking if linker supports switching between static/dynamic... $ECHO_C" >&6
+
+	rm -f libconftest.a
+	cat >conftest.$ac_ext <<EOF
+#line 28627 "configure"
+#include <stdio.h>
+int cf_ldflags_static(FILE *fp) { return fflush(fp); }
+EOF
+	if { (eval echo "$as_me:28631: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:28634: \$? = $ac_status" >&5
+  (exit "$ac_status"); } ; then
+		( $AR $ARFLAGS libconftest.a conftest.o ) 2>&5 1>/dev/null
+		( eval $RANLIB libconftest.a ) 2>&5 >/dev/null
+	fi
+	rm -f conftest.*
+
+	cf_save_LIBS="$LIBS"
+
+	LIBS="$LDFLAGS_STATIC -L`pwd` -lconftest $LDFLAGS_DYNAMIC $LIBS"
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 28645 "configure"
+#include "confdefs.h"
+
+#line 28648 "configure"
+#include <stdio.h>
+int cf_ldflags_static(FILE *fp);
+
+int
+main (void)
+{
+
+	return cf_ldflags_static(stdin);
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:28663: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:28666: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:28669: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:28672: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+	# some linkers simply ignore the -dynamic
+	case x`file "conftest$ac_exeext" 2>/dev/null` in
+	(*static*)
+		cf_ldflags_static=no
+		;;
+	(*)
+		cf_ldflags_static=yes
+		;;
+	esac
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_ldflags_static=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+	rm -f libconftest.*
+	LIBS="$cf_save_LIBS"
+
+	echo "$as_me:28695: result: $cf_ldflags_static" >&5
+echo "${ECHO_T}$cf_ldflags_static" >&6
+
+	if test "$cf_ldflags_static" != yes
+	then
+		LDFLAGS_STATIC=
+		LDFLAGS_SHARED=
+	fi
+else
+	LDFLAGS_STATIC=
+	LDFLAGS_SHARED=
+fi
+
+	;;
+esac
+
+echo "$as_me:28711: checking where we will install curses.h" >&5
+echo $ECHO_N "checking where we will install curses.h... $ECHO_C" >&6
+
+includesubdir=
+if test "$with_overwrite" = no && \
+ { test "x$includedir" = 'x${prefix}/include' || \
+   test "x$includedir" = "x${prefix}/include"; }
+then
+	includesubdir="/ncurses${USE_LIB_SUFFIX}"
+fi
+echo "$as_me:28721: result: ${includedir}${includesubdir}" >&5
+echo "${ECHO_T}${includedir}${includesubdir}" >&6
+
+### Resolve a conflict between normal and wide-curses by forcing applications
+### that will need libutf8 to add it to their configure script.
+if test "$with_overwrite" != no ; then
+if test "$NCURSES_LIBUTF8" = 1 ; then
+	NCURSES_LIBUTF8='defined(HAVE_LIBUTF8_H)'
+	{ echo "$as_me:28729: WARNING: Wide-character applications must define HAVE_LIBUTF8_H to include curses.h" >&5
+echo "$as_me: WARNING: Wide-character applications must define HAVE_LIBUTF8_H to include curses.h" >&2;}
+fi
+fi
+WITH_OVERWRITE=$with_overwrite
+
+### At least on MinGW a shared library build without libtool
+### requires adding the additional libs to the link list.
+case "$cf_cv_system_name" in
+(*mingw32*|*mingw64*)
+	if test "$DFT_LWR_MODEL" != "libtool"; then
+   	   SHLIB_LIST="$SHLIB_LIST ${LIBS}"
+	fi
+	;;
+*)	;;
+esac
+
+# used to separate tack out of the tree
+NCURSES_TREE=
+
+### predefined stuff for the test programs
+
+cat >>confdefs.h <<\EOF
+#define HAVE_SLK_COLOR 1
+EOF
+
+# pkgsrc uses these
+
+echo "$as_me:28757: checking for desired basename for form library" >&5
+echo $ECHO_N "checking for desired basename for form library... $ECHO_C" >&6
+
+# Check whether --with-form-libname or --without-form-libname was given.
+if test "${with_form_libname+set}" = set; then
+  withval="$with_form_libname"
+  with_lib_basename=$withval
+else
+  with_lib_basename=form
+fi;
+FORM_NAME="$with_lib_basename"
+
+case "x$FORM_NAME" in
+(x|xno|xnone|xyes)
+	FORM_NAME=form
+	;;
+(*)
+	;;
+esac
+
+echo "$as_me:28777: result: $FORM_NAME" >&5
+echo "${ECHO_T}$FORM_NAME" >&6
+
+echo "$as_me:28780: checking for desired basename for menu library" >&5
+echo $ECHO_N "checking for desired basename for menu library... $ECHO_C" >&6
+
+# Check whether --with-menu-libname or --without-menu-libname was given.
+if test "${with_menu_libname+set}" = set; then
+  withval="$with_menu_libname"
+  with_lib_basename=$withval
+else
+  with_lib_basename=menu
+fi;
+MENU_NAME="$with_lib_basename"
+
+case "x$MENU_NAME" in
+(x|xno|xnone|xyes)
+	MENU_NAME=menu
+	;;
+(*)
+	;;
+esac
+
+echo "$as_me:28800: result: $MENU_NAME" >&5
+echo "${ECHO_T}$MENU_NAME" >&6
+
+echo "$as_me:28803: checking for desired basename for panel library" >&5
+echo $ECHO_N "checking for desired basename for panel library... $ECHO_C" >&6
+
+# Check whether --with-panel-libname or --without-panel-libname was given.
+if test "${with_panel_libname+set}" = set; then
+  withval="$with_panel_libname"
+  with_lib_basename=$withval
+else
+  with_lib_basename=panel
+fi;
+PANEL_NAME="$with_lib_basename"
+
+case "x$PANEL_NAME" in
+(x|xno|xnone|xyes)
+	PANEL_NAME=panel
+	;;
+(*)
+	;;
+esac
+
+echo "$as_me:28823: result: $PANEL_NAME" >&5
+echo "${ECHO_T}$PANEL_NAME" >&6
+
+echo "$as_me:28826: checking for desired basename for cxx library" >&5
+echo $ECHO_N "checking for desired basename for cxx library... $ECHO_C" >&6
+
+# Check whether --with-cxx-libname or --without-cxx-libname was given.
+if test "${with_cxx_libname+set}" = set; then
+  withval="$with_cxx_libname"
+  with_lib_basename=$withval
+else
+  with_lib_basename=ncurses++
+fi;
+CXX_NAME="$with_lib_basename"
+
+case "x$CXX_NAME" in
+(x|xno|xnone|xyes)
+	CXX_NAME=ncurses++
+	;;
+(*)
+	;;
+esac
+
+echo "$as_me:28846: result: $CXX_NAME" >&5
+echo "${ECHO_T}$CXX_NAME" >&6
+
+### Construct the list of subdirectories for which we'll customize makefiles
+### with the appropriate compile-rules.
+
+echo "$as_me:28852: checking for src modules" >&5
+echo $ECHO_N "checking for src modules... $ECHO_C" >&6
+
+# dependencies and linker-arguments for test-programs
+TEST_DEPS="${LIB_DIR}/${LIB_PREFIX}${LIB_NAME}${DFT_DEP_SUFFIX} $TEST_DEPS"
+TEST_DEP2="${LIB_2ND}/${LIB_PREFIX}${LIB_NAME}${DFT_DEP_SUFFIX} $TEST_DEP2"
+if test "$DFT_LWR_MODEL" = "libtool"; then
+	TEST_ARGS="${TEST_DEPS}"
+	TEST_ARG2="${TEST_DEP2}"
+else
+	TEST_ARGS="-l${LIB_NAME}${USE_ARG_SUFFIX} $TEST_ARGS"
+	TEST_ARG2="-l${LIB_NAME}${USE_ARG_SUFFIX} $TEST_ARG2"
+fi
+
+PC_MODULES_TO_MAKE="ncurses${USE_ARG_SUFFIX}"
+cf_cv_src_modules=
+for cf_dir in $modules_to_build
+do
+	if test -f "$srcdir/$cf_dir/modules" ; then
+
+		# We may/may not have tack in the distribution, though the
+		# makefile is.
+		if test "$cf_dir" = tack ; then
+			if test "x$cf_with_tack" != "xyes"; then
+				continue
+			fi
+		fi
+
+		if test -z "$cf_cv_src_modules"; then
+			cf_cv_src_modules=$cf_dir
+		else
+			cf_cv_src_modules="$cf_cv_src_modules $cf_dir"
+		fi
+
+		# Make the ncurses_cfg.h file record the library interface files as
+		# well.  These are header files that are the same name as their
+		# directory.  Ncurses is the only library that does not follow
+		# that pattern.
+		if test "$cf_dir" = tack ; then
+			continue
+		elif test -f "$srcdir/${cf_dir}/${cf_dir}.h" ; then
+
+cf_have_include=`echo "$cf_dir" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+			cat >>confdefs.h <<EOF
+#define HAVE_${cf_have_include}_H 1
+EOF
+
+			cat >>confdefs.h <<EOF
+#define HAVE_LIB${cf_have_include} 1
+EOF
+
+cf_map_lib_basename=`echo "$cf_dir" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+eval TEST_ROOT="\$${cf_map_lib_basename}_NAME"
+
+			TEST_DEPS="${LIB_DIR}/${LIB_PREFIX}${TEST_ROOT}${DFT_DEP_SUFFIX} $TEST_DEPS"
+			TEST_DEP2="${LIB_2ND}/${LIB_PREFIX}${TEST_ROOT}${DFT_DEP_SUFFIX} $TEST_DEP2"
+			if test "$DFT_LWR_MODEL" = "libtool"; then
+				TEST_ARGS="${TEST_DEPS}"
+				TEST_ARG2="${TEST_DEP2}"
+			else
+				TEST_ARGS="-l${TEST_ROOT}${USE_ARG_SUFFIX} $TEST_ARGS"
+				TEST_ARG2="-l${TEST_ROOT}${USE_ARG_SUFFIX} $TEST_ARG2"
+			fi
+			PC_MODULES_TO_MAKE="${PC_MODULES_TO_MAKE} ${cf_dir}${USE_ARG_SUFFIX}"
+		fi
+	fi
+done
+echo "$as_me:28921: result: $cf_cv_src_modules" >&5
+echo "${ECHO_T}$cf_cv_src_modules" >&6
+
+TEST_ARGS="-L${LIB_DIR} $TEST_ARGS"
+TEST_ARG2="-L${LIB_2ND} $TEST_ARG2"
+
+SRC_SUBDIRS=
+if test "x$cf_with_manpages" != xno ; then
+	SRC_SUBDIRS="$SRC_SUBDIRS man"
+fi
+SRC_SUBDIRS="$SRC_SUBDIRS include"
+for cf_dir in $cf_cv_src_modules
+do
+	SRC_SUBDIRS="$SRC_SUBDIRS $cf_dir"
+done
+if test "x$cf_with_tests" != "xno" ; then
+	SRC_SUBDIRS="$SRC_SUBDIRS test"
+fi
+# always make this, to install the ncurses-config script
+SRC_SUBDIRS="$SRC_SUBDIRS misc"
+if test "$cf_with_cxx_binding" != no; then
+	PC_MODULES_TO_MAKE="${PC_MODULES_TO_MAKE} ncurses++${USE_ARG_SUFFIX}"
+	SRC_SUBDIRS="$SRC_SUBDIRS c++"
+fi
+
+test "x$with_termlib" != xno && PC_MODULES_TO_MAKE="$PC_MODULES_TO_MAKE $TINFO_ARG_SUFFIX"
+test "x$with_ticlib" != xno && PC_MODULES_TO_MAKE="$PC_MODULES_TO_MAKE $TICS_ARG_SUFFIX"
+
+ADA_SUBDIRS=
+if test "x$cf_with_ada" = "xyes" && test "x$cf_cv_prog_gnat_correct" = xyes && test -f "$srcdir/Ada95/Makefile.in" ; then
+	SRC_SUBDIRS="$SRC_SUBDIRS Ada95"
+	ADA_SUBDIRS="gen src"
+	if test "x$cf_with_tests" != "xno" ; then
+		ADA_SUBDIRS="$ADA_SUBDIRS samples"
+	fi
+fi
+
+SUB_MAKEFILES=
+for cf_dir in $SRC_SUBDIRS
+do
+	SUB_MAKEFILES="$SUB_MAKEFILES $cf_dir/Makefile"
+done
+
+if test -n "$ADA_SUBDIRS"; then
+	for cf_dir in $ADA_SUBDIRS
+	do
+		SUB_MAKEFILES="$SUB_MAKEFILES Ada95/$cf_dir/Makefile"
+	done
+
+fi
+
+if test "x$cf_with_ada" = "xyes" && test "x$cf_cv_prog_gnat_correct" = "xyes"; then
+   SUB_MAKEFILES="$SUB_MAKEFILES Ada95/src/library.gpr:Ada95/src/library.gpr.in"
+   SUB_MAKEFILES="$SUB_MAKEFILES Ada95/gen/adacurses${USE_CFG_SUFFIX}-config:Ada95/gen/adacurses-config.in"
+   SUB_MAKEFILES="$SUB_MAKEFILES man/adacurses${USE_CFG_SUFFIX}-config.1:man/MKada_config.in"
+fi
+
+DIRS_TO_MAKE="lib"
+for cf_item in $cf_list_models
+do
+
+	case $cf_item in
+	(libtool) cf_subdir='obj_lo'  ;;
+	(normal)  cf_subdir='objects' ;;
+	(debug)   cf_subdir='obj_g' ;;
+	(profile) cf_subdir='obj_p' ;;
+	(shared)
+		case "$cf_cv_system_name" in
+		(cygwin|msys)
+			cf_subdir='objects' ;;
+		(*)
+			cf_subdir='obj_s' ;;
+		esac
+	esac
+
+	for cf_item2 in $DIRS_TO_MAKE
+	do
+		test "$cf_item2" = "$cf_subdir" && break
+	done
+	test ".$cf_item2" != ".$cf_subdir" && DIRS_TO_MAKE="$DIRS_TO_MAKE $cf_subdir"
+done
+for cf_dir in $DIRS_TO_MAKE
+do
+	test ! -d "$cf_dir" && mkdir "$cf_dir"
+done
+
+# symbols that differ when compiling Ada95 by itself.
+NCURSES_SHLIB2=$SHELL' $(top_srcdir)/misc/shlib'
+
+# values to use as strings
+
+cat >>confdefs.h <<EOF
+#define NCURSES_PATHSEP '$PATH_SEPARATOR'
+EOF
+
+cat >>confdefs.h <<EOF
+#define NCURSES_VERSION_STRING "${NCURSES_MAJOR}.${NCURSES_MINOR}.${NCURSES_PATCH}"
+EOF
+
+### Define substitutions for header files to avoid name-pollution
+
+if test "x$cf_cv_have_tcgetattr" = xyes ; then
+	HAVE_TCGETATTR=1
+else
+	HAVE_TCGETATTR=0
+fi
+
+if test "x$ac_cv_header_stdint_h" = xyes ; then
+	HAVE_STDINT_H=1
+else
+	HAVE_STDINT_H=0
+fi
+
+if test "x$ac_cv_header_termio_h" = xyes ; then
+	HAVE_TERMIO_H=1
+else
+	HAVE_TERMIO_H=0
+fi
+
+if test "x$ac_cv_header_termios_h" = xyes ; then
+	HAVE_TERMIOS_H=1
+else
+	HAVE_TERMIOS_H=0
+fi
+
+################################################################################
+test "x$use_database" = xyes && \
+SUB_MAKEFILES="$SUB_MAKEFILES misc/run_tic.sh:misc/run_tic.in"
+
+SUB_MAKEFILES="$SUB_MAKEFILES misc/ncurses-config:misc/ncurses-config.in"
+SUB_MAKEFILES="$SUB_MAKEFILES man/ncurses${USE_CFG_SUFFIX}-config.1:man/MKncu_config.in"
+
+if test "x$enable_pc_files" = xyes && test -z "$MAKE_PC_FILES" ; then
+SUB_MAKEFILES="$SUB_MAKEFILES misc/gen-pkgconfig:misc/gen-pkgconfig.in"
+fi
+
+if test "x$cf_with_tests" != xno ; then
+	MAKE_TESTS=
+else
+	MAKE_TESTS="#"
+fi
+
+ADAHTML_DIR=../../doc/html/ada
+
+# workaround for OS/2 (20151017)
+case "$cf_cv_system_name" in
+(os2*)
+	LIBTOOL_OPTS_CXX="-os2dllname ncurs++"
+	;;
+(*)
+	LIBTOOL_OPTS_CXX=
+	;;
+esac
+
+# workaround for g++ versus Solaris (20131116)
+case "$cf_cv_system_name" in
+(solaris2*)
+	case "x$CPPFLAGS" in
+	(*-D_XOPEN_SOURCE_EXTENDED*)
+		test -n "$verbose" && echo "	moving _XOPEN_SOURCE_EXTENDED to work around g++ problem" 1>&6
+
+echo "${as_me:-configure}:29082: testing moving _XOPEN_SOURCE_EXTENDED to work around g++ problem ..." 1>&5
+
+		CFLAGS="$CFLAGS -D_XOPEN_SOURCE_EXTENDED"
+		CPPFLAGS=`echo "x$CPPFLAGS" | sed -e  's/^.//' -e 's/-D_XOPEN_SOURCE_EXTENDED//'`
+		;;
+	esac
+	;;
+esac
+
+# Help to automatically enable the extended curses features when using either
+# the *-config or the ".pc" files by adding defines.
+echo "$as_me:29093: checking for defines to add to ncurses${USE_CFG_SUFFIX}-config script" >&5
+echo $ECHO_N "checking for defines to add to ncurses${USE_CFG_SUFFIX}-config script... $ECHO_C" >&6
+PKG_CFLAGS=
+for cf_loop1 in $CPPFLAGS_after_XOPEN
+do
+	cf_found=no
+	for cf_loop2 in $CPPFLAGS_before_XOPEN
+	do
+		if test "x$cf_loop1" = "x$cf_loop2"
+		then
+			cf_found=yes
+			break
+		fi
+	done
+	test "$cf_found" = no && PKG_CFLAGS="$PKG_CFLAGS $cf_loop1"
+done
+echo "$as_me:29109: result: $PKG_CFLAGS" >&5
+echo "${ECHO_T}$PKG_CFLAGS" >&6
+
+# AC_CHECK_SIZEOF demands a literal parameter, no variables.  So we do this.
+case "x$NCURSES_OSPEED" in
+(*short*)
+	cf_compatible=1
+	;;
+(*)
+	cf_compatible=0
+	;;
+esac
+
+cat >>confdefs.h <<EOF
+#define NCURSES_OSPEED_COMPAT $cf_compatible
+EOF
+
+case "x$cf_cv_typeof_chtype" in
+(xshort|xint|xlong)
+	cf_cv_typeof_chtype="unsigned $cf_cv_typeof_chtype"
+	;;
+esac
+
+case "x$cf_cv_typeof_mmask_t" in
+(xshort|xint|xlong)
+	cf_cv_typeof_mmask_t="unsigned $cf_cv_typeof_mmask_t"
+	;;
+esac
+
+# substitute into misc/Makefile to suppress
+# (un)install.data from the
+# (un)install rules.
+if test "x$cf_with_db_install" = "xno"; then
+	MISC_INSTALL_DATA=
+	MISC_UNINSTALL_DATA=
+else
+	MISC_INSTALL_DATA=install.data
+	MISC_UNINSTALL_DATA=uninstall.data
+fi
+
+if test "x$cf_with_db_install" = "xno" || test "x$TERMINFO_SRC" = "xno"; then
+	MAKE_DATABASE="#"
+else
+	MAKE_DATABASE="$MAKE_TERMINFO"
+fi
+
+if test -n "$PACKAGE"
+then
+	PACKAGE="${PACKAGE}${DFT_ARG_SUFFIX}"
+	export PACKAGE
+	echo "package: $PACKAGE"
+fi
+
+UNALTERED_SYMS=
+cf_filter_syms=no
+
+if test -n "$RESULTING_SYMS"
+then
+	cf_filter_syms=$cf_dft_filter_syms
+	test -n "$verbose" && echo "	will map symbols to ABI=$cf_cv_abi_version" 1>&6
+
+echo "${as_me:-configure}:29170: testing will map symbols to ABI=$cf_cv_abi_version ..." 1>&5
+
+fi
+
+if test "x$WILDCARD_SYMS" = xno
+then
+	cf_filter_syms=yes
+fi
+
+test "x$cf_with_trace" = xyes && NCURSES_INLINE=
+
+UNALTERED_SYMS=`echo "$RESULTING_SYMS" | sed -e 's/\\$/\\\\$/g'`
+if test "$cf_filter_syms" = yes
+then
+	RESULTING_SYMS=resulting.map
+fi
+
+if test "x$cross_compiling" = xyes ; then
+	ADAGEN_LDFLAGS='$(CROSS_LDFLAGS)'
+	CHECK_BUILD="#"
+else
+	ADAGEN_LDFLAGS='$(NATIVE_LDFLAGS)'
+	CHECK_BUILD=
+fi
+
+# This is used for the *-config script and *.pc data files.
+
+echo "$as_me:29197: checking for linker search path" >&5
+echo $ECHO_N "checking for linker search path... $ECHO_C" >&6
+if test "${cf_cv_ld_searchpath+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+if test "$cross_compiling" != yes ; then
+
+# GNU binutils' ld does not involve permissions which may stop ldconfig.
+cf_pathlist=`${LD:-ld} --verbose 2>/dev/null | grep SEARCH_DIR | sed -e 's,SEARCH_DIR[("=][("=]*,,g' -e 's/"[)];//gp' | sort -u`
+
+# The -NX options tell newer versions of Linux ldconfig to not attempt to
+# update the cache, which makes it run faster.
+test -z "$cf_pathlist" && \
+	cf_pathlist=`(ldconfig -NX -v) 2>/dev/null | sed -e '/^[ 	]/d' -e 's/:$//' | sort -u`
+
+test -z "$cf_pathlist" &&
+	cf_pathlist=`(ldconfig -v) 2>/dev/null | sed -n -e '/^[ 	]/d' -e 's/:$//p' | sort -u`
+
+# This works with OpenBSD 6.5, which lists only filenames
+test -z "$cf_pathlist" &&
+	cf_pathlist=`(ldconfig -v) 2>/dev/null | sed -n -e 's,^Adding \(.*\)/.*$,\1,p' | sort -u`
+
+if test -z "$cf_pathlist"
+then
+	# dyld default path with MacOS
+	if test -f /usr/bin/otool && test "x`uname -s`" = xDarwin
+	then
+		# do this to bypass check
+		cf_cv_ld_searchpath='$HOME/lib'
+		cf_pathlist="/usr/local/lib /lib /usr/lib"
+	fi
+fi
+
+if test -z "$cf_pathlist"
+then
+	# Solaris is "SunOS"
+	if test -f /usr/bin/isainfo && test "x`uname -s`" = xSunOS
+	then
+		case x`(isainfo -b)` in
+		(x64)
+			cf_pathlist="$cf_pathlist /lib/64 /usr/lib/64"
+			;;
+		(x32)
+			test -d /usr/ccs/lib && cf_pathlist="$cf_pathlist /usr/ccs/lib"
+			cf_pathlist="$cf_pathlist /lib /usr/lib"
+			;;
+		(*)
+			{ echo "$as_me:29245: WARNING: problem with Solaris architecture" >&5
+echo "$as_me: WARNING: problem with Solaris architecture" >&2;}
+			;;
+		esac
+	fi
+fi
+
+if test -z "$cf_pathlist"
+then
+	# HP-UX
+	if test x"`uname -s`" = xHP-UX
+	then
+		case x`getconf LONG_BIT` in
+		(x64)
+			cf_pathlist="/usr/lib/hpux64"
+			;;
+		(x*)
+			cf_pathlist="/usr/lib/hpux32"
+			;;
+		esac
+	fi
+fi
+
+fi
+
+# If nothing else, assume it is conventional
+test -z "$cf_pathlist" && cf_pathlist="/usr/lib /lib"
+
+# Finally, check that this is only directories
+for cf_path in $0 $cf_pathlist
+do
+	if test -d "$cf_path"; then
+		test -n "$cf_cv_ld_searchpath" && cf_cv_ld_searchpath="${cf_cv_ld_searchpath} "
+		cf_cv_ld_searchpath="${cf_cv_ld_searchpath}${cf_path}"
+	fi
+done
+
+# Ensure that it is nonempty
+test -z "$cf_cv_ld_searchpath" && cf_cv_ld_searchpath=/usr/lib
+
+fi
+echo "$as_me:29286: result: $cf_cv_ld_searchpath" >&5
+echo "${ECHO_T}$cf_cv_ld_searchpath" >&6
+
+LD_SEARCHPATH=`echo "$cf_cv_ld_searchpath"|sed -e 's/ /|/g'`
+
+cat >>confdefs.h <<\EOF
+#define HAVE_CURSES_DATA_BOOLNAMES 1
+EOF
+
+ac_config_files="$ac_config_files include/MKterm.h.awk include/curses.head:include/curses.h.in include/ncurses_dll.h include/termcap.h include/unctrl.h man/man_db.renames $SUB_MAKEFILES Makefile"
+ac_config_commands="$ac_config_commands default"
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overriden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+{
+  (set) 2>&1 |
+    case `(ac_space=' '; set | grep ac_space) 2>&1` in
+    *ac_space=\ *)
+      # `set' does not quote correctly, so add quotes (double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \).
+      sed -n \
+        "s/'/'\\\\''/g;
+    	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;;
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n \
+        "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      ;;
+    esac;
+} |
+  sed '
+     t clear
+     : clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     : end' >>confcache
+if cmp -s $cache_file confcache; then :; else
+  if test -w $cache_file; then
+    test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
+    cat confcache >$cache_file
+  else
+    echo "not updating unwritable cache $cache_file"
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[ 	]*VPATH[ 	]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[ 	]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[ 	]*$//;
+}'
+fi
+
+DEFS=-DHAVE_CONFIG_H
+
+: "${CONFIG_STATUS=./config.status}"
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:29376: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >"$CONFIG_STATUS" <<_ACEOF
+#! $SHELL
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+me=\`echo "\$0" | sed -e 's,.*\\/,,'\`
+
+debug=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+ac_cs_invocation="\$0 \$@"
+
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+_ACEOF
+
+cat >>"$CONFIG_STATUS" <<\_ACEOF
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+
+# Name of the executable.
+as_me=`echo "$0" |sed 's,.*[\\/],,'`
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr="expr"
+else
+  as_expr="false"
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s='ln'
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+as_executable_p="test -f"
+
+# Support unset when possible.
+if (FOO=FOO; unset FOO) >/dev/null 2>&1; then
+  as_unset="unset"
+else
+  as_unset="false"
+fi
+
+# NLS nuisances.
+$as_unset LANG || test "${LANG+set}" != set || { LANG=C; export LANG; }
+$as_unset LC_ALL || test "${LC_ALL+set}" != set || { LC_ALL=C; export LC_ALL; }
+$as_unset LC_TIME || test "${LC_TIME+set}" != set || { LC_TIME=C; export LC_TIME; }
+$as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set || { LC_CTYPE=C; export LC_CTYPE; }
+$as_unset LANGUAGE || test "${LANGUAGE+set}" != set || { LANGUAGE=C; export LANGUAGE; }
+$as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set || { LC_COLLATE=C; export LC_COLLATE; }
+$as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set || { LC_NUMERIC=C; export LC_NUMERIC; }
+$as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set || { LC_MESSAGES=C; export LC_MESSAGES; }
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" 	$as_nl"
+
+# CDPATH.
+$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=:; export CDPATH; }
+
+exec 6>&1
+
+_ACEOF
+
+# Files that config.status was made for.
+if test -n "$ac_config_files"; then
+  echo "config_files=\"$ac_config_files\"" >>"$CONFIG_STATUS"
+fi
+
+if test -n "$ac_config_headers"; then
+  echo "config_headers=\"$ac_config_headers\"" >>"$CONFIG_STATUS"
+fi
+
+if test -n "$ac_config_links"; then
+  echo "config_links=\"$ac_config_links\"" >>"$CONFIG_STATUS"
+fi
+
+if test -n "$ac_config_commands"; then
+  echo "config_commands=\"$ac_config_commands\"" >>"$CONFIG_STATUS"
+fi
+
+cat >>"$CONFIG_STATUS" <<\EOF
+
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number, then exit
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+  --file=FILE[:TEMPLATE]
+                   instantiate the configuration file FILE
+  --header=FILE[:TEMPLATE]
+                   instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <dickey@invisible-island.net>."
+EOF
+
+cat >>"$CONFIG_STATUS" <<EOF
+ac_cs_version="\\
+config.status
+configured by $0, generated by GNU Autoconf 2.52.20221009,
+  with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright 2003-2021,2022	Thomas E. Dickey
+Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir="$srcdir"
+INSTALL="$INSTALL"
+EOF
+
+cat >>"$CONFIG_STATUS" <<\EOF
+# If no file are specified by the user, then we need to provide default
+# value.  By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=*)
+    ac_option=`expr "x$1" : 'x\([^=]*\)='`
+    ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+    shift
+    set dummy "$ac_option" "$ac_optarg" ${1+"$@"}
+    shift
+    ;;
+  -*);;
+  *) # This is not an option, so the user has probably given explicit
+     # arguments.
+     ac_need_defaults=false;;
+  esac
+
+  case $1 in
+  # Handling of the options.
+EOF
+cat >>"$CONFIG_STATUS" <<EOF
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    echo "running $SHELL $0 " $ac_configure_args " --no-create --no-recursion"
+    exec $SHELL $0 $ac_configure_args --no-create --no-recursion ;;
+EOF
+cat >>"$CONFIG_STATUS" <<\EOF
+  --version | --vers* | -V )
+    echo "$ac_cs_version"; exit 0 ;;
+  --he | --h)
+    # Conflict between --help and --header
+    { { echo "$as_me:29557: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; };;
+  --help | --hel | -h )
+    echo "$ac_cs_usage"; exit 0 ;;
+  --debug | --d* | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    shift
+    CONFIG_FILES="$CONFIG_FILES $1"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    shift
+    CONFIG_HEADERS="$CONFIG_HEADERS $1"
+    ac_need_defaults=false;;
+
+  # This is an error.
+  -*) { { echo "$as_me:29576: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; } ;;
+
+  *) ac_config_targets="$ac_config_targets $1" ;;
+
+  esac
+  shift
+done
+
+exec 5>>config.log
+cat >&5 << _ACEOF
+
+## ----------------------- ##
+## Running config.status.  ##
+## ----------------------- ##
+
+This file was extended by $as_me 2.52.20221009, executed with
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  > "$ac_cs_invocation"
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+
+_ACEOF
+EOF
+
+cat >>"$CONFIG_STATUS" <<EOF
+#
+# INIT-COMMANDS section.
+#
+
+### Special initialization commands, used to pass information from the
+### configuration-run into config.status
+
+ALTERNATE_SYMS="$ALTERNATE_SYMS"
+AWK="$AWK"
+CXX_NAME="$CXX_NAME"
+DFT_ARG_SUFFIX="$DFT_ARG_SUFFIX"
+DFT_LWR_MODEL="$DFT_LWR_MODEL"
+ECHO_LD="$ECHO_LD"
+EXTRA_SUFFIX="$EXTRA_SUFFIX"
+FORM_NAME="$FORM_NAME"
+LDCONFIG="$LDCONFIG"
+LIBTOOL_VERSION="$LIBTOOL_VERSION"
+LIB_NAME="$LIB_NAME"
+LIB_PREFIX="$LIB_PREFIX"
+LIB_SUBSETS="$LIB_SUBSETS"
+LIB_SUFFIX="$LIB_SUFFIX"
+LIB_TRACING="$LIB_TRACING"
+LN_S="$LN_S"
+MAKE_TERMINFO="$MAKE_TERMINFO"
+MANPAGE_RENAMES="$MANPAGE_RENAMES"
+MENU_NAME="$MENU_NAME"
+NCURSES_MAJOR="$NCURSES_MAJOR"
+NCURSES_MINOR="$NCURSES_MINOR"
+NCURSES_OSPEED="$NCURSES_OSPEED"
+NCURSES_PATCH="$NCURSES_PATCH"
+PANEL_NAME="$PANEL_NAME"
+SRC_SUBDIRS="$SRC_SUBDIRS"
+TERMINFO="$TERMINFO"
+TICS_ARG_SUFFIX="$TICS_ARG_SUFFIX"
+TICS_LIB_SUFFIX="$TICS_LIB_SUFFIX"
+TICS_NAME="$TICS_NAME"
+TICS_SUFFIX="$TICS_SUFFIX"
+TIC_PATH="$TIC_PATH"
+TINFO_ARG_SUFFIX="$TINFO_ARG_SUFFIX"
+TINFO_LIB_SUFFIX="$TINFO_LIB_SUFFIX"
+TINFO_NAME="$TINFO_NAME"
+TINFO_SUFFIX="$TINFO_SUFFIX"
+UNALTERED_SYMS="$UNALTERED_SYMS"
+USE_ARG_SUFFIX="$USE_ARG_SUFFIX"
+USE_CFG_SUFFIX="$USE_CFG_SUFFIX"
+USE_LIB_SUFFIX="$USE_LIB_SUFFIX"
+USE_OLD_MAKERULES="$USE_OLD_MAKERULES"
+WILDCARD_SYMS="$WILDCARD_SYMS"
+WITH_CURSES_H="$with_curses_h"
+WITH_ECHO="${enable_echo:=yes}"
+WITH_OVERWRITE="$with_overwrite"
+cf_LIST_MODELS="$cf_list_models"
+cf_cv_VERSION_GNATMAKE=$cf_cv_VERSION_GNATMAKE
+cf_cv_VERSION_GPRBUILD=$cf_cv_VERSION_GPRBUILD
+cf_cv_abi_version="$cf_cv_abi_version"
+cf_cv_do_relink="$cf_cv_do_relink"
+cf_cv_do_reranlib="$cf_cv_do_reranlib"
+cf_cv_do_symlinks="$cf_cv_do_symlinks"
+cf_cv_enable_lp64="$cf_cv_enable_lp64"
+cf_cv_enable_opaque="$cf_cv_enable_opaque"
+cf_cv_make_PHONY="$cf_cv_make_PHONY"
+cf_cv_prog_CC_c_o=$cf_cv_prog_CC_c_o
+cf_cv_prog_CXX_c_o=$cf_cv_prog_CXX_c_o
+cf_cv_prog_gnat_correct=$cf_cv_prog_gnat_correct
+cf_cv_rel_version="$cf_cv_rel_version"
+cf_cv_rm_so_locs="$cf_cv_rm_so_locs"
+cf_cv_shared_soname='$cf_cv_shared_soname'
+cf_cv_shlib_version="$cf_cv_shlib_version"
+cf_cv_shlib_version_infix="$cf_cv_shlib_version_infix"
+cf_cv_system_name="$cf_cv_system_name"
+cf_cv_term_driver="$with_term_driver"
+cf_with_ada="$cf_with_ada"
+cf_with_cxx_binding="$cf_with_cxx_binding"
+cf_with_db_install="$cf_with_db_install"
+cf_with_manpages="$cf_with_manpages"
+cf_with_tests="$cf_with_tests"
+host="$host"
+target="$target"
+verbose="$verbose"
+with_shared_cxx="$with_shared_cxx"
+
+EOF
+
+cat >>"$CONFIG_STATUS" <<\EOF
+for ac_config_target in $ac_config_targets
+do
+  case "$ac_config_target" in
+  # Handling of arguments.
+  "include/MKterm.h.awk" ) CONFIG_FILES="$CONFIG_FILES include/MKterm.h.awk" ;;
+  "include/curses.head" ) CONFIG_FILES="$CONFIG_FILES include/curses.head:include/curses.h.in" ;;
+  "include/ncurses_dll.h" ) CONFIG_FILES="$CONFIG_FILES include/ncurses_dll.h" ;;
+  "include/termcap.h" ) CONFIG_FILES="$CONFIG_FILES include/termcap.h" ;;
+  "include/unctrl.h" ) CONFIG_FILES="$CONFIG_FILES include/unctrl.h" ;;
+  "man/man_db.renames" ) CONFIG_FILES="$CONFIG_FILES man/man_db.renames" ;;
+  "$SUB_MAKEFILES" ) CONFIG_FILES="$CONFIG_FILES $SUB_MAKEFILES" ;;
+  "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+  "default" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;;
+  "include/ncurses_cfg.h" ) CONFIG_HEADERS="$CONFIG_HEADERS include/ncurses_cfg.h:include/ncurses_cfg.hin" ;;
+  *) { { echo "$as_me:29705: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if "$ac_need_defaults"; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+  trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+  trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+: "${TMPDIR=/tmp}"
+{
+  tmp=`(umask 077 && mktemp -d -q "$TMPDIR/csXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=$TMPDIR/cs$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} ||
+{
+   echo "$me: cannot create a temporary directory in $TMPDIR" >&2
+   { (exit 1); exit 1; }
+}
+
+EOF
+
+cat >>"$CONFIG_STATUS" <<EOF
+
+#
+# CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "\$CONFIG_FILES"; then
+  # Protect against being on the right side of a sed subst in config.status.
+  sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
+   s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >"\$tmp"/subs.sed <<\\CEOF
+s,@SHELL@,$SHELL,;t t
+s,@exec_prefix@,$exec_prefix,;t t
+s,@prefix@,$prefix,;t t
+s,@program_transform_name@,$program_transform_name,;t t
+s,@bindir@,$bindir,;t t
+s,@sbindir@,$sbindir,;t t
+s,@libexecdir@,$libexecdir,;t t
+s,@datarootdir@,$datarootdir,;t t
+s,@datadir@,$datadir,;t t
+s,@sysconfdir@,$sysconfdir,;t t
+s,@sharedstatedir@,$sharedstatedir,;t t
+s,@localstatedir@,$localstatedir,;t t
+s,@runstatedir@,$runstatedir,;t t
+s,@libdir@,$libdir,;t t
+s,@includedir@,$includedir,;t t
+s,@oldincludedir@,$oldincludedir,;t t
+s,@infodir@,$infodir,;t t
+s,@mandir@,$mandir,;t t
+s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t
+s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
+s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
+s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t
+s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
+s,@build_alias@,$build_alias,;t t
+s,@host_alias@,$host_alias,;t t
+s,@target_alias@,$target_alias,;t t
+s,@ECHO_C@,$ECHO_C,;t t
+s,@ECHO_N@,$ECHO_N,;t t
+s,@ECHO_T@,$ECHO_T,;t t
+s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
+s,@DEFS@,$DEFS,;t t
+s,@LIBS@,$LIBS,;t t
+s,@top_builddir@,$top_builddir,;t t
+s,@GREP@,$GREP,;t t
+s,@EGREP@,$EGREP,;t t
+s,@NCURSES_MAJOR@,$NCURSES_MAJOR,;t t
+s,@NCURSES_MINOR@,$NCURSES_MINOR,;t t
+s,@NCURSES_PATCH@,$NCURSES_PATCH,;t t
+s,@cf_cv_rel_version@,$cf_cv_rel_version,;t t
+s,@cf_cv_abi_version@,$cf_cv_abi_version,;t t
+s,@cf_cv_builtin_bool@,$cf_cv_builtin_bool,;t t
+s,@cf_cv_header_stdbool_h@,$cf_cv_header_stdbool_h,;t t
+s,@cf_cv_type_of_bool@,$cf_cv_type_of_bool,;t t
+s,@VERSION@,$VERSION,;t t
+s,@VERSION_MAJOR@,$VERSION_MAJOR,;t t
+s,@VERSION_MINOR@,$VERSION_MINOR,;t t
+s,@VERSION_PATCH@,$VERSION_PATCH,;t t
+s,@PACKAGE@,$PACKAGE,;t t
+s,@build@,$build,;t t
+s,@build_cpu@,$build_cpu,;t t
+s,@build_vendor@,$build_vendor,;t t
+s,@build_os@,$build_os,;t t
+s,@host@,$host,;t t
+s,@host_cpu@,$host_cpu,;t t
+s,@host_vendor@,$host_vendor,;t t
+s,@host_os@,$host_os,;t t
+s,@target@,$target,;t t
+s,@target_cpu@,$target_cpu,;t t
+s,@target_vendor@,$target_vendor,;t t
+s,@target_os@,$target_os,;t t
+s,@FGREP@,$FGREP,;t t
+s,@CC@,$CC,;t t
+s,@CFLAGS@,$CFLAGS,;t t
+s,@LDFLAGS@,$LDFLAGS,;t t
+s,@CPPFLAGS@,$CPPFLAGS,;t t
+s,@ac_ct_CC@,$ac_ct_CC,;t t
+s,@EXEEXT@,$EXEEXT,;t t
+s,@OBJEXT@,$OBJEXT,;t t
+s,@EXTRA_CPPFLAGS@,$EXTRA_CPPFLAGS,;t t
+s,@CPP@,$CPP,;t t
+s,@LDCONFIG@,$LDCONFIG,;t t
+s,@CXX@,$CXX,;t t
+s,@CXXFLAGS@,$CXXFLAGS,;t t
+s,@ac_ct_CXX@,$ac_ct_CXX,;t t
+s,@AWK@,$AWK,;t t
+s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
+s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
+s,@INSTALL_DATA@,$INSTALL_DATA,;t t
+s,@LINT@,$LINT,;t t
+s,@LINT_OPTS@,$LINT_OPTS,;t t
+s,@LINT_LIBS@,$LINT_LIBS,;t t
+s,@LN_S@,$LN_S,;t t
+s,@cf_config_suffix@,$cf_config_suffix,;t t
+s,@PKG_CONFIG@,$PKG_CONFIG,;t t
+s,@ac_pt_PKG_CONFIG@,$ac_pt_PKG_CONFIG,;t t
+s,@PKG_CONFIG_LIBDIR@,$PKG_CONFIG_LIBDIR,;t t
+s,@MAKE_PC_FILES@,$MAKE_PC_FILES,;t t
+s,@PC_MODULE_SUFFIX@,$PC_MODULE_SUFFIX,;t t
+s,@SET_MAKE@,$SET_MAKE,;t t
+s,@MAKE_NO_PHONY@,$MAKE_NO_PHONY,;t t
+s,@MAKE_PHONY@,$MAKE_PHONY,;t t
+s,@CTAGS@,$CTAGS,;t t
+s,@ETAGS@,$ETAGS,;t t
+s,@MAKE_LOWER_TAGS@,$MAKE_LOWER_TAGS,;t t
+s,@MAKE_UPPER_TAGS@,$MAKE_UPPER_TAGS,;t t
+s,@cf_cv_makeflags@,$cf_cv_makeflags,;t t
+s,@RANLIB@,$RANLIB,;t t
+s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t
+s,@LD@,$LD,;t t
+s,@ac_ct_LD@,$ac_ct_LD,;t t
+s,@AR@,$AR,;t t
+s,@ac_ct_AR@,$ac_ct_AR,;t t
+s,@NM@,$NM,;t t
+s,@ac_ct_NM@,$ac_ct_NM,;t t
+s,@ARFLAGS@,$ARFLAGS,;t t
+s,@DESTDIR@,$DESTDIR,;t t
+s,@BUILD_CC@,$BUILD_CC,;t t
+s,@BUILD_CPP@,$BUILD_CPP,;t t
+s,@BUILD_CFLAGS@,$BUILD_CFLAGS,;t t
+s,@BUILD_CPPFLAGS@,$BUILD_CPPFLAGS,;t t
+s,@BUILD_LDFLAGS@,$BUILD_LDFLAGS,;t t
+s,@BUILD_LIBS@,$BUILD_LIBS,;t t
+s,@BUILD_EXEEXT@,$BUILD_EXEEXT,;t t
+s,@BUILD_OBJEXT@,$BUILD_OBJEXT,;t t
+s,@cf_list_models@,$cf_list_models,;t t
+s,@ABI_VERSION@,$ABI_VERSION,;t t
+s,@LIBTOOL_VERSION@,$LIBTOOL_VERSION,;t t
+s,@LIBTOOL@,$LIBTOOL,;t t
+s,@ac_ct_LIBTOOL@,$ac_ct_LIBTOOL,;t t
+s,@LT_UNDEF@,$LT_UNDEF,;t t
+s,@LIBTOOL_CXX@,$LIBTOOL_CXX,;t t
+s,@LIBTOOL_OPTS@,$LIBTOOL_OPTS,;t t
+s,@LIB_CREATE@,$LIB_CREATE,;t t
+s,@LIB_OBJECT@,$LIB_OBJECT,;t t
+s,@LIB_SUFFIX@,$LIB_SUFFIX,;t t
+s,@LIB_PREP@,$LIB_PREP,;t t
+s,@LIB_CLEAN@,$LIB_CLEAN,;t t
+s,@LIB_COMPILE@,$LIB_COMPILE,;t t
+s,@LIB_LINK@,$LIB_LINK,;t t
+s,@LIB_INSTALL@,$LIB_INSTALL,;t t
+s,@LIB_UNINSTALL@,$LIB_UNINSTALL,;t t
+s,@DFT_LWR_MODEL@,$DFT_LWR_MODEL,;t t
+s,@DFT_UPR_MODEL@,$DFT_UPR_MODEL,;t t
+s,@TICS_NAME@,$TICS_NAME,;t t
+s,@TINFO_NAME@,$TINFO_NAME,;t t
+s,@LIB_NAME@,$LIB_NAME,;t t
+s,@LIB_PREFIX@,$LIB_PREFIX,;t t
+s,@CC_G_OPT@,$CC_G_OPT,;t t
+s,@CXX_G_OPT@,$CXX_G_OPT,;t t
+s,@LD_MODEL@,$LD_MODEL,;t t
+s,@shlibdir@,$shlibdir,;t t
+s,@MAKE_DLLS@,$MAKE_DLLS,;t t
+s,@CC_SHARED_OPTS@,$CC_SHARED_OPTS,;t t
+s,@LD_RPATH_OPT@,$LD_RPATH_OPT,;t t
+s,@LD_SHARED_OPTS@,$LD_SHARED_OPTS,;t t
+s,@MK_SHARED_LIB@,$MK_SHARED_LIB,;t t
+s,@RM_SHARED_OPTS@,$RM_SHARED_OPTS,;t t
+s,@LINK_PROGS@,$LINK_PROGS,;t t
+s,@LINK_TESTS@,$LINK_TESTS,;t t
+s,@EXTRA_LDFLAGS@,$EXTRA_LDFLAGS,;t t
+s,@LOCAL_LDFLAGS@,$LOCAL_LDFLAGS,;t t
+s,@LOCAL_LDFLAGS2@,$LOCAL_LDFLAGS2,;t t
+s,@INSTALL_LIB@,$INSTALL_LIB,;t t
+s,@RPATH_LIST@,$RPATH_LIST,;t t
+s,@EXPORT_SYMS@,$EXPORT_SYMS,;t t
+s,@RESULTING_SYMS@,$RESULTING_SYMS,;t t
+s,@VERSIONED_SYMS@,$VERSIONED_SYMS,;t t
+s,@WILDCARD_SYMS@,$WILDCARD_SYMS,;t t
+s,@cf_ldd_prog@,$cf_ldd_prog,;t t
+s,@EXTRA_PKG_LDFLAGS@,$EXTRA_PKG_LDFLAGS,;t t
+s,@EXTRA_SUFFIX@,$EXTRA_SUFFIX,;t t
+s,@TERMINFO_SRC@,$TERMINFO_SRC,;t t
+s,@NCURSES_USE_DATABASE@,$NCURSES_USE_DATABASE,;t t
+s,@TIC@,$TIC,;t t
+s,@ac_ct_TIC@,$ac_ct_TIC,;t t
+s,@INFOCMP@,$INFOCMP,;t t
+s,@ac_ct_INFOCMP@,$ac_ct_INFOCMP,;t t
+s,@FALLBACK_LIST@,$FALLBACK_LIST,;t t
+s,@USE_FALLBACKS@,$USE_FALLBACKS,;t t
+s,@WHICH_XTERM@,$WHICH_XTERM,;t t
+s,@XTERM_KBS@,$XTERM_KBS,;t t
+s,@TERMINFO_DIRS@,$TERMINFO_DIRS,;t t
+s,@TERMINFO@,$TERMINFO,;t t
+s,@MAKE_TERMINFO@,$MAKE_TERMINFO,;t t
+s,@USE_BIG_STRINGS@,$USE_BIG_STRINGS,;t t
+s,@TERMPATH@,$TERMPATH,;t t
+s,@NCURSES_USE_TERMCAP@,$NCURSES_USE_TERMCAP,;t t
+s,@BROKEN_LINKER@,$BROKEN_LINKER,;t t
+s,@NCURSES_WCWIDTH_GRAPHICS@,$NCURSES_WCWIDTH_GRAPHICS,;t t
+s,@NCURSES_CH_T@,$NCURSES_CH_T,;t t
+s,@NCURSES_LIBUTF8@,$NCURSES_LIBUTF8,;t t
+s,@NEED_WCHAR_H@,$NEED_WCHAR_H,;t t
+s,@NCURSES_MBSTATE_T@,$NCURSES_MBSTATE_T,;t t
+s,@NCURSES_WCHAR_T@,$NCURSES_WCHAR_T,;t t
+s,@NCURSES_WINT_T@,$NCURSES_WINT_T,;t t
+s,@NCURSES_OK_WCHAR_T@,$NCURSES_OK_WCHAR_T,;t t
+s,@NCURSES_OK_WINT_T@,$NCURSES_OK_WINT_T,;t t
+s,@cf_cv_enable_lp64@,$cf_cv_enable_lp64,;t t
+s,@NCURSES_TPARM_VARARGS@,$NCURSES_TPARM_VARARGS,;t t
+s,@NCURSES_WATTR_MACROS@,$NCURSES_WATTR_MACROS,;t t
+s,@RGB_PATH@,$RGB_PATH,;t t
+s,@no_x11_rgb@,$no_x11_rgb,;t t
+s,@NCURSES_BOOL@,$NCURSES_BOOL,;t t
+s,@TERMINFO_CAPS@,$TERMINFO_CAPS,;t t
+s,@NCURSES_OSPEED@,$NCURSES_OSPEED,;t t
+s,@NCURSES_CCHARW_MAX@,$NCURSES_CCHARW_MAX,;t t
+s,@NCURSES_SBOOL@,$NCURSES_SBOOL,;t t
+s,@NCURSES_TPARM_ARG@,$NCURSES_TPARM_ARG,;t t
+s,@MANPAGE_RENAMES@,$MANPAGE_RENAMES,;t t
+s,@NCURSES_EXT_FUNCS@,$NCURSES_EXT_FUNCS,;t t
+s,@GENERATED_EXT_FUNCS@,$GENERATED_EXT_FUNCS,;t t
+s,@NCURSES_SP_FUNCS@,$NCURSES_SP_FUNCS,;t t
+s,@GENERATED_SP_FUNCS@,$GENERATED_SP_FUNCS,;t t
+s,@NCURSES_CONST@,$NCURSES_CONST,;t t
+s,@NCURSES_EXT_COLORS@,$NCURSES_EXT_COLORS,;t t
+s,@NCURSES_MOUSE_VERSION@,$NCURSES_MOUSE_VERSION,;t t
+s,@NCURSES_XNAMES@,$NCURSES_XNAMES,;t t
+s,@PTHREAD@,$PTHREAD,;t t
+s,@cf_cv_enable_reentrant@,$cf_cv_enable_reentrant,;t t
+s,@cf_cv_enable_opaque@,$cf_cv_enable_opaque,;t t
+s,@NCURSES_SIZE_T@,$NCURSES_SIZE_T,;t t
+s,@NCURSES_OPAQUE@,$NCURSES_OPAQUE,;t t
+s,@NCURSES_OPAQUE_FORM@,$NCURSES_OPAQUE_FORM,;t t
+s,@NCURSES_OPAQUE_MENU@,$NCURSES_OPAQUE_MENU,;t t
+s,@NCURSES_OPAQUE_PANEL@,$NCURSES_OPAQUE_PANEL,;t t
+s,@NCURSES_WRAP_PREFIX@,$NCURSES_WRAP_PREFIX,;t t
+s,@NCURSES_IMPEXP@,$NCURSES_IMPEXP,;t t
+s,@NCURSES_CXX_IMPEXP@,$NCURSES_CXX_IMPEXP,;t t
+s,@NCURSES_INTEROP_FUNCS@,$NCURSES_INTEROP_FUNCS,;t t
+s,@NCURSES_WGETCH_EVENTS@,$NCURSES_WGETCH_EVENTS,;t t
+s,@EXP_WIN32_DRIVER@,$EXP_WIN32_DRIVER,;t t
+s,@INTERNALS_HDR@,$INTERNALS_HDR,;t t
+s,@ECHO_LT@,$ECHO_LT,;t t
+s,@ECHO_LD@,$ECHO_LD,;t t
+s,@RULE_CC@,$RULE_CC,;t t
+s,@SHOW_CC@,$SHOW_CC,;t t
+s,@ECHO_CC@,$ECHO_CC,;t t
+s,@ECHO_LINK@,$ECHO_LINK,;t t
+s,@INSTALL_OPT_S@,$INSTALL_OPT_S,;t t
+s,@INSTALL_OPT_O@,$INSTALL_OPT_O,;t t
+s,@INSTALL_OPT_P@,$INSTALL_OPT_P,;t t
+s,@EXTRA_CFLAGS@,$EXTRA_CFLAGS,;t t
+s,@HAVE_STDNORETURN_H@,$HAVE_STDNORETURN_H,;t t
+s,@STDC_NORETURN@,$STDC_NORETURN,;t t
+s,@ADAFLAGS@,$ADAFLAGS,;t t
+s,@EXTRA_CXXFLAGS@,$EXTRA_CXXFLAGS,;t t
+s,@ADA_TRACE@,$ADA_TRACE,;t t
+s,@MATH_LIB@,$MATH_LIB,;t t
+s,@NCURSES_INLINE@,$NCURSES_INLINE,;t t
+s,@cf_cv_typeof_chtype@,$cf_cv_typeof_chtype,;t t
+s,@cf_cv_1UL@,$cf_cv_1UL,;t t
+s,@cf_cv_typeof_mmask_t@,$cf_cv_typeof_mmask_t,;t t
+s,@HAVE_VSSCANF@,$HAVE_VSSCANF,;t t
+s,@TEST_LIBS@,$TEST_LIBS,;t t
+s,@TEST_LIBS2@,$TEST_LIBS2,;t t
+s,@CXXCPP@,$CXXCPP,;t t
+s,@CXXLDFLAGS@,$CXXLDFLAGS,;t t
+s,@CXX_AR@,$CXX_AR,;t t
+s,@CXX_ARFLAGS@,$CXX_ARFLAGS,;t t
+s,@CXXLIBS@,$CXXLIBS,;t t
+s,@USE_CXX_BOOL@,$USE_CXX_BOOL,;t t
+s,@cf_TEMP_gnat@,$cf_TEMP_gnat,;t t
+s,@M4_exists@,$M4_exists,;t t
+s,@cf_ada_make@,$cf_ada_make,;t t
+s,@cf_ada_config@,$cf_ada_config,;t t
+s,@cf_ada_config_Ada@,$cf_ada_config_Ada,;t t
+s,@cf_ada_config_C@,$cf_ada_config_C,;t t
+s,@GNATPREP_OPTS@,$GNATPREP_OPTS,;t t
+s,@cf_compile_generics@,$cf_compile_generics,;t t
+s,@cf_generic_objects@,$cf_generic_objects,;t t
+s,@USE_GNAT_SIGINT@,$USE_GNAT_SIGINT,;t t
+s,@USE_OLD_MAKERULES@,$USE_OLD_MAKERULES,;t t
+s,@USE_GNAT_PROJECTS@,$USE_GNAT_PROJECTS,;t t
+s,@USE_GNAT_LIBRARIES@,$USE_GNAT_LIBRARIES,;t t
+s,@USE_GNAT_MAKE_GPR@,$USE_GNAT_MAKE_GPR,;t t
+s,@USE_GNAT_GPRBUILD@,$USE_GNAT_GPRBUILD,;t t
+s,@cf_ada_compiler@,$cf_ada_compiler,;t t
+s,@cf_ada_package@,$cf_ada_package,;t t
+s,@ADA_INCLUDE@,$ADA_INCLUDE,;t t
+s,@ADA_OBJECTS@,$ADA_OBJECTS,;t t
+s,@ADA_SHAREDLIB@,$ADA_SHAREDLIB,;t t
+s,@MAKE_ADA_SHAREDLIB@,$MAKE_ADA_SHAREDLIB,;t t
+s,@ADA_LIBNAME@,$ADA_LIBNAME,;t t
+s,@ACPPFLAGS@,$ACPPFLAGS,;t t
+s,@DFT_ARG_SUFFIX@,$DFT_ARG_SUFFIX,;t t
+s,@DFT_DEP_SUFFIX@,$DFT_DEP_SUFFIX,;t t
+s,@DFT_OBJ_SUBDIR@,$DFT_OBJ_SUBDIR,;t t
+s,@CXX_LIB_SUFFIX@,$CXX_LIB_SUFFIX,;t t
+s,@USE_ARG_SUFFIX@,$USE_ARG_SUFFIX,;t t
+s,@USE_CFG_SUFFIX@,$USE_CFG_SUFFIX,;t t
+s,@USE_LIB_SUFFIX@,$USE_LIB_SUFFIX,;t t
+s,@TICS_ARG_SUFFIX@,$TICS_ARG_SUFFIX,;t t
+s,@TICS_DEP_SUFFIX@,$TICS_DEP_SUFFIX,;t t
+s,@TICS_LIB_SUFFIX@,$TICS_LIB_SUFFIX,;t t
+s,@TICS_LDFLAGS@,$TICS_LDFLAGS,;t t
+s,@TICS_LIBS@,$TICS_LIBS,;t t
+s,@TINFO_ARG_SUFFIX@,$TINFO_ARG_SUFFIX,;t t
+s,@TINFO_DEP_SUFFIX@,$TINFO_DEP_SUFFIX,;t t
+s,@TINFO_LIB_SUFFIX@,$TINFO_LIB_SUFFIX,;t t
+s,@TINFO_LDFLAGS@,$TINFO_LDFLAGS,;t t
+s,@TINFO_LIBS@,$TINFO_LIBS,;t t
+s,@TINFO_LDFLAGS2@,$TINFO_LDFLAGS2,;t t
+s,@LDFLAGS_STATIC@,$LDFLAGS_STATIC,;t t
+s,@LDFLAGS_SHARED@,$LDFLAGS_SHARED,;t t
+s,@includesubdir@,$includesubdir,;t t
+s,@WITH_OVERWRITE@,$WITH_OVERWRITE,;t t
+s,@TICS_LIST@,$TICS_LIST,;t t
+s,@TINFO_LIST@,$TINFO_LIST,;t t
+s,@SHLIB_LIST@,$SHLIB_LIST,;t t
+s,@NCURSES_TREE@,$NCURSES_TREE,;t t
+s,@FORM_NAME@,$FORM_NAME,;t t
+s,@MENU_NAME@,$MENU_NAME,;t t
+s,@PANEL_NAME@,$PANEL_NAME,;t t
+s,@CXX_NAME@,$CXX_NAME,;t t
+s,@TEST_ARGS@,$TEST_ARGS,;t t
+s,@TEST_DEPS@,$TEST_DEPS,;t t
+s,@TEST_ARG2@,$TEST_ARG2,;t t
+s,@TEST_DEP2@,$TEST_DEP2,;t t
+s,@PC_MODULES_TO_MAKE@,$PC_MODULES_TO_MAKE,;t t
+s,@ADA_SUBDIRS@,$ADA_SUBDIRS,;t t
+s,@DIRS_TO_MAKE@,$DIRS_TO_MAKE,;t t
+s,@NCURSES_SHLIB2@,$NCURSES_SHLIB2,;t t
+s,@HAVE_TCGETATTR@,$HAVE_TCGETATTR,;t t
+s,@HAVE_STDINT_H@,$HAVE_STDINT_H,;t t
+s,@HAVE_TERMIO_H@,$HAVE_TERMIO_H,;t t
+s,@HAVE_TERMIOS_H@,$HAVE_TERMIOS_H,;t t
+s,@cross_compiling@,$cross_compiling,;t t
+s,@MAKE_TESTS@,$MAKE_TESTS,;t t
+s,@ADAHTML_DIR@,$ADAHTML_DIR,;t t
+s,@LIBTOOL_OPTS_CXX@,$LIBTOOL_OPTS_CXX,;t t
+s,@PKG_CFLAGS@,$PKG_CFLAGS,;t t
+s,@MISC_INSTALL_DATA@,$MISC_INSTALL_DATA,;t t
+s,@MISC_UNINSTALL_DATA@,$MISC_UNINSTALL_DATA,;t t
+s,@MAKE_DATABASE@,$MAKE_DATABASE,;t t
+s,@UNALTERED_SYMS@,$UNALTERED_SYMS,;t t
+s,@ADAGEN_LDFLAGS@,$ADAGEN_LDFLAGS,;t t
+s,@CHECK_BUILD@,$CHECK_BUILD,;t t
+s,@PRIVATE_LIBS@,$PRIVATE_LIBS,;t t
+s,@LD_SEARCHPATH@,$LD_SEARCHPATH,;t t
+CEOF
+
+EOF
+
+  cat >>"$CONFIG_STATUS" <<\EOF
+  # Split the substitutions into bite-sized pieces for seds with
+  # small command number limits, like on Digital OSF/1 and HP-UX.
+  ac_max_sed_lines=48
+  ac_sed_frag=1 # Number of current file.
+  ac_beg=1 # First line for current file.
+  ac_end=$ac_max_sed_lines # Line after last line for current file.
+  ac_more_lines=:
+  ac_sed_cmds=
+  while "$ac_more_lines"; do
+    if test "$ac_beg" -gt 1; then
+      sed "1,${ac_beg}d; ${ac_end}q" "$tmp"/subs.sed >"$tmp"/subs.frag
+    else
+      sed "${ac_end}q" "$tmp"/subs.sed >"$tmp"/subs.frag
+    fi
+    if test ! -s "$tmp"/subs.frag; then
+      ac_more_lines=false
+    else
+      # The purpose of the label and of the branching condition is to
+      # speed up the sed processing (if there are no `@' at all, there
+      # is no need to browse any of the substitutions).
+      # These are the two extra sed commands mentioned above.
+      (echo ':t
+  /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat "$tmp"/subs.frag) >"$tmp"/subs-$ac_sed_frag.sed
+      # It is possible to make a multiline substitution using escaped newlines.
+      # Ensure that we do not split the substitution between script fragments.
+      ac_BEG=$ac_end
+      ac_END=`expr "$ac_end" + "$ac_max_sed_lines"`
+      sed "1,${ac_BEG}d; ${ac_END}p; q" "$tmp"/subs.sed >"$tmp"/subs.next
+      if test -s "$tmp"/subs.next; then
+        grep '^s,@[^@,][^@,]*@,.*\\$' "$tmp"/subs.next >"$tmp"/subs.edit
+        if test ! -s "$tmp"/subs.edit; then
+          grep "^s,@[^@,][^@,]*@,.*,;t t$" "$tmp"/subs.next >"$tmp"/subs.edit
+          if test ! -s "$tmp"/subs.edit; then
+            if test "$ac_beg" -gt 1; then
+              ac_end=`expr "$ac_end" - 1`
+              continue
+            fi
+          fi
+        fi
+      fi
+
+      if test -z "$ac_sed_cmds"; then
+        ac_sed_cmds="sed -f \"$tmp\"/subs-$ac_sed_frag.sed"
+      else
+        ac_sed_cmds="$ac_sed_cmds | sed -f \"$tmp\"/subs-$ac_sed_frag.sed"
+      fi
+      ac_sed_frag=`expr "$ac_sed_frag" + 1`
+      ac_beg=$ac_end
+      ac_end=`expr "$ac_end" + "$ac_max_sed_lines"`
+    fi
+  done
+  if test -z "$ac_sed_cmds"; then
+    ac_sed_cmds="cat"
+  fi
+fi # test -n "$CONFIG_FILES"
+
+EOF
+cat >>"$CONFIG_STATUS" <<\EOF
+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case "$ac_file" in
+  - | *:- | *:-:* ) # input from stdin
+        cat >"$tmp"/stdin
+        ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+        ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+        ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  * )   ac_file_in=$ac_file.in ;;
+  esac
+
+  # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
+  ac_dir=`$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+         X"$ac_file" : 'X\(//\)[^/]' \| \
+         X"$ac_file" : 'X\(//\)$' \| \
+         X"$ac_file" : 'X\(/\)' \| \
+         .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+    { case "$ac_dir" in
+  [\\/]* | ?:[\\/]* ) as_incr_dir=;;
+  *)                      as_incr_dir=.;;
+esac
+as_dummy="$ac_dir"
+for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do
+  case $as_mkdir_dir in
+    # Skip DOS drivespec
+    ?:) as_incr_dir=$as_mkdir_dir ;;
+    *)
+      as_incr_dir=$as_incr_dir/$as_mkdir_dir
+      test -d "$as_incr_dir" || mkdir "$as_incr_dir"
+    ;;
+  esac
+done; }
+
+    ac_dir_suffix="/`echo "$ac_dir"|sed 's,^\./,,'`"
+    # A "../" for each directory in $ac_dir_suffix.
+    ac_dots=`echo "$ac_dir_suffix" | sed 's,/[^/]*,../,g'`
+  else
+    ac_dir_suffix= ac_dots=
+  fi
+
+  case "$srcdir" in
+  .)  ac_srcdir=.
+      if test -z "$ac_dots"; then
+         ac_top_srcdir=.
+      else
+         ac_top_srcdir=`echo "$ac_dots" | sed 's,/$,,'`
+      fi ;;
+  [\\/]* | ?:[\\/]* )
+      ac_srcdir="$srcdir$ac_dir_suffix";
+      ac_top_srcdir="$srcdir" ;;
+  *) # Relative path.
+    ac_srcdir="$ac_dots$srcdir$ac_dir_suffix"
+    ac_top_srcdir="$ac_dots$srcdir" ;;
+  esac
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_dots$INSTALL ;;
+  esac
+
+  if test x"$ac_file" != x-; then
+    { echo "$as_me:30218: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+    rm -f "$ac_file"
+  fi
+  # Let's still pretend it is `configure' which instantiates (i.e., don't
+  # use $as_me), people would be surprised to read:
+  #    /* config.h.  Generated automatically by config.status.  */
+  configure_input="Generated automatically from `echo $ac_file_in |
+                                                 sed 's,.*/,,'` by configure."
+
+  # First look for the input files in the build tree, otherwise in the
+  # src tree.
+  ac_file_inputs=`IFS=:
+    for f in $ac_file_in; do
+      case $f in
+      -) echo "$tmp"/stdin ;;
+      [\\/$]*)
+         # Absolute (can't be DOS-style, as IFS=:)
+         test -f "$f" || { { echo "$as_me:30236: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+         echo "$f";;
+      *) # Relative
+         if test -f "$f"; then
+           # Build tree
+           echo "$f"
+         elif test -f "$srcdir/$f"; then
+           # Source tree
+           echo "$srcdir/$f"
+         else
+           # /dev/null tree
+           { { echo "$as_me:30249: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+         fi;;
+      esac
+    done` || { (exit 1); exit 1; }
+EOF
+cat >>"$CONFIG_STATUS" <<\EOF
+  ac_warn_datarootdir=no
+  if test x"$ac_file" != x-; then
+    for ac_item in $ac_file_inputs
+    do
+      ac_seen=`grep '@\(datadir\|mandir\|infodir\)@' "$ac_item"`
+      if test -n "$ac_seen"; then
+        ac_used=`grep '@datarootdir@' "$ac_item"`
+        if test -z "$ac_used"; then
+          { echo "$as_me:30265: WARNING: datarootdir was used implicitly but not set:
+$ac_seen" >&5
+echo "$as_me: WARNING: datarootdir was used implicitly but not set:
+$ac_seen" >&2;}
+          ac_warn_datarootdir=yes
+        fi
+      fi
+      ac_seen=`grep '${datarootdir}' "$ac_item"`
+      if test -n "$ac_seen"; then
+        { echo "$as_me:30274: WARNING: datarootdir was used explicitly but not set:
+$ac_seen" >&5
+echo "$as_me: WARNING: datarootdir was used explicitly but not set:
+$ac_seen" >&2;}
+        ac_warn_datarootdir=yes
+      fi
+    done
+  fi
+
+if test "x$ac_warn_datarootdir" = xyes; then
+  ac_sed_cmds="$ac_sed_cmds | sed -e 's,@datarootdir@,\${prefix}/share,g' -e 's,\${datarootdir},\${prefix}/share,g'"
+fi
+
+EOF
+cat >>"$CONFIG_STATUS" <<EOF
+  sed "$ac_vpsub
+$extrasub
+EOF
+cat >>"$CONFIG_STATUS" <<\EOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s,@configure_input@,$configure_input,;t t
+s,@srcdir@,$ac_srcdir,;t t
+s,@top_srcdir@,$ac_top_srcdir,;t t
+s,@INSTALL@,$ac_INSTALL,;t t
+" $ac_file_inputs | (eval "$ac_sed_cmds") >"$tmp"/out
+  rm -f "$tmp"/stdin
+EOF
+: "${FGREP:=grep -F}"
+: "${EGREP:=grep -E}"
+cat >>"$CONFIG_STATUS" <<EOF
+  : "\${FGREP:=$FGREP}"
+  : "\${EGREP:=$EGREP}"
+EOF
+cat >>"$CONFIG_STATUS" <<\EOF
+  if test x"$ac_file" != x-; then
+    cp "$tmp/out" "$ac_file"
+
+    for ac_name in prefix exec_prefix datarootdir
+    do
+        ac_seen=`$FGREP -n '${'$ac_name'[:=].*}' "$ac_file"`
+        if test -n "$ac_seen"; then
+            ac_init=`$EGREP '[ 	]*'$ac_name'[ 	]*=' "$ac_file"`
+            if test -z "$ac_init"; then
+              ac_seen=`echo "$ac_seen" |sed -e 's,^,'"$ac_file"':,'`
+              { echo "$as_me:30319: WARNING: Variable $ac_name is used but was not set:
+$ac_seen" >&5
+echo "$as_me: WARNING: Variable $ac_name is used but was not set:
+$ac_seen" >&2;}
+            fi
+        fi
+    done
+    $EGREP -n '@[a-z_][a-z_0-9]+@' "$ac_file" >"$tmp"/out
+    $EGREP -n '@[A-Z_][A-Z_0-9]+@' "$ac_file" >>"$tmp"/out
+    if test -s "$tmp"/out; then
+      ac_seen=`sed -e 's,^,'"$ac_file"':,' < "$tmp"/out`
+      { echo "$as_me:30330: WARNING: Some variables may not be substituted:
+$ac_seen" >&5
+echo "$as_me: WARNING: Some variables may not be substituted:
+$ac_seen" >&2;}
+    fi
+  else
+    cat "$tmp"/out
+  fi
+  rm -f "$tmp"/out
+
+done
+EOF
+cat >>"$CONFIG_STATUS" <<\EOF
+
+#
+# CONFIG_HEADER section.
+#
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s,^\([ 	]*\)#\([ 	]*define[ 	][ 	]*\)'
+ac_dB='[ 	].*$,\1#\2'
+ac_dC=' '
+ac_dD=',;t'
+# ac_i turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
+ac_iA='s,^\([ 	]*\)#\([ 	]*\)undef\([ 	][ 	]*\)'
+ac_iB='\([ 	]\),\1#\2define\3'
+ac_iC=' '
+ac_iD='\4,;t'
+# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_uA='s,^\([ 	]*\)#\([ 	]*\)undef\([ 	][ 	]*\)'
+ac_uB='$,\1#\2define\3'
+ac_uC=' '
+ac_uD=',;t'
+
+for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case "$ac_file" in
+  - | *:- | *:-:* ) # input from stdin
+        cat >"$tmp"/stdin
+        ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+        ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+        ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  * )   ac_file_in=$ac_file.in ;;
+  esac
+
+  test x"$ac_file" != x- && { echo "$as_me:30379: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+
+  # First look for the input files in the build tree, otherwise in the
+  # src tree.
+  ac_file_inputs=`IFS=:
+    for f in $ac_file_in; do
+      case $f in
+      -) echo "$tmp"/stdin ;;
+      [\\/$]*)
+         # Absolute (can't be DOS-style, as IFS=:)
+         test -f "$f" || { { echo "$as_me:30390: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+         echo $f;;
+      *) # Relative
+         if test -f "$f"; then
+           # Build tree
+           echo $f
+         elif test -f "$srcdir/$f"; then
+           # Source tree
+           echo "$srcdir/$f"
+         else
+           # /dev/null tree
+           { { echo "$as_me:30403: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+         fi;;
+      esac
+    done` || { (exit 1); exit 1; }
+  # Remove the trailing spaces.
+  sed 's/[ 	]*$//' $ac_file_inputs >"$tmp"/in
+
+EOF
+
+# Transform confdefs.h into a list of #define's.  We won't use it as a sed
+# script, but as data to insert where we see @DEFS@.  We expect AC_SAVE_DEFS to
+# be either 'cat' or 'sort'.
+cat confdefs.h | uniq >conftest.vals
+
+# Break up conftest.vals because some shells have a limit on
+# the size of here documents, and old seds have small limits too.
+
+rm -f conftest.tail
+echo '  rm -f conftest.frag' >> "$CONFIG_STATUS"
+while grep . conftest.vals >/dev/null
+do
+  # Write chunks of a limited-size here document to conftest.frag.
+  echo '  cat >> conftest.frag <<CEOF' >> "$CONFIG_STATUS"
+  sed "${ac_max_here_lines}q" conftest.vals | sed -e 's/#ifdef.*/#if 0/' >> "$CONFIG_STATUS"
+  echo 'CEOF' >> "$CONFIG_STATUS"
+  sed "1,${ac_max_here_lines}d" conftest.vals > conftest.tail
+  rm -f conftest.vals
+  mv conftest.tail conftest.vals
+done
+rm -f conftest.vals
+
+# Run sed to substitute the contents of conftest.frag into $tmp/in at the
+# marker @DEFS@.
+echo '  cat >> conftest.edit <<CEOF
+/@DEFS@/r conftest.frag
+/@DEFS@/d
+CEOF
+sed -f conftest.edit "$tmp"/in > "$tmp"/out
+rm -f "$tmp"/in
+mv "$tmp"/out "$tmp"/in
+rm -f conftest.edit conftest.frag
+' >> "$CONFIG_STATUS"
+
+cat >>"$CONFIG_STATUS" <<\EOF
+  # Let's still pretend it is `configure' which instantiates (i.e., don't
+  # use $as_me), people would be surprised to read:
+  #    /* config.h.  Generated automatically by config.status.  */
+  if test x"$ac_file" = x-; then
+    echo "/* Generated automatically by configure.  */" >"$tmp"/config.h
+  else
+    echo "/* $ac_file.  Generated automatically by configure.  */" >"$tmp"/config.h
+  fi
+  cat "$tmp"/in >>"$tmp"/config.h
+  rm -f "$tmp"/in
+  if test x"$ac_file" != x-; then
+    if cmp -s "$ac_file" "$tmp/config.h" 2>/dev/null; then
+      { echo "$as_me:30461: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      ac_dir=`$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+         X"$ac_file" : 'X\(//\)[^/]' \| \
+         X"$ac_file" : 'X\(//\)$' \| \
+         X"$ac_file" : 'X\(/\)' \| \
+         .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+      if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+        { case "$ac_dir" in
+  [\\/]* | ?:[\\/]* ) as_incr_dir=;;
+  *)                      as_incr_dir=.;;
+esac
+as_dummy="$ac_dir"
+for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do
+  case $as_mkdir_dir in
+    # Skip DOS drivespec
+    ?:) as_incr_dir=$as_mkdir_dir ;;
+    *)
+      as_incr_dir=$as_incr_dir/$as_mkdir_dir
+      test -d "$as_incr_dir" || mkdir "$as_incr_dir"
+    ;;
+  esac
+done; }
+
+      fi
+      rm -f "$ac_file"
+      mv "$tmp/config.h" "$ac_file"
+    fi
+  else
+    cat "$tmp"/config.h
+    rm -f "$tmp"/config.h
+  fi
+done
+EOF
+cat >>"$CONFIG_STATUS" <<\EOF
+#
+# CONFIG_COMMANDS section.
+#
+for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
+  ac_dest=`echo "$ac_file" | sed 's,:.*,,'`
+  ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
+
+  case "$ac_dest" in
+    default )
+if test "x$cf_with_tests" != xno ; then
+
+for cf_dir in test
+do
+	if test ! -d "$srcdir/$cf_dir" ; then
+		continue
+	elif test -f "$srcdir/$cf_dir/programs" ; then
+		$AWK -f "$srcdir/test/mk-test.awk" INSTALL=no ECHO_LINK="$ECHO_LD" "$srcdir/$cf_dir/programs" >>$cf_dir/Makefile
+	fi
+done
+
+fi
+
+cf_prefix=$LIB_PREFIX
+
+case "$cf_cv_shlib_version" in
+(cygdll|msysdll|mingw|msvcdll)
+	TINFO_NAME=$TINFO_ARG_SUFFIX
+	TINFO_SUFFIX=.dll
+	;;
+esac
+
+if test -n "$TINFO_SUFFIX" ; then
+	case "$TINFO_SUFFIX" in
+	(tw*)
+		TINFO_NAME="${TINFO_NAME}tw${EXTRA_SUFFIX}"
+		TINFO_SUFFIX=`echo "$TINFO_SUFFIX" | sed 's/^tw'$EXTRA_SUFFIX'//'`
+		;;
+	(t*)
+		TINFO_NAME="${TINFO_NAME}t${EXTRA_SUFFIX}"
+		TINFO_SUFFIX=`echo "$TINFO_SUFFIX" | sed 's/^t'$EXTRA_SUFFIX'//'`
+		;;
+	(w*)
+		TINFO_NAME="${TINFO_NAME}w${EXTRA_SUFFIX}"
+		TINFO_SUFFIX=`echo "$TINFO_SUFFIX" | sed 's/^w'$EXTRA_SUFFIX'//'`
+		;;
+	esac
+fi
+
+for cf_dir in $SRC_SUBDIRS
+do
+	if test ! -d "$srcdir/$cf_dir" ; then
+		continue
+	elif test -f "$srcdir/$cf_dir/modules" ; then
+
+		SHARED_LIB=
+		Libs_To_Make=
+		cf_awk_program=
+		if test -n "${cf_cv_abi_version}" && test "x${cf_cv_abi_version}" != "x5"
+		then
+			cf_awk_program="$cf_awk_program\
+/deprecated in ABI${cf_cv_abi_version}/ { next; }\
+{ sub(\"NCURSES([WT]+)?\", \"&${cf_cv_abi_version}\"); }\
+"
+		fi
+
+		if test "x$WILDCARD_SYMS" = xno
+		then
+			cf_awk_program="$cf_awk_program\
+/[ 	]_\\*;/ { skip=1; next; }\
+"
+		fi
+
+		if test "x$cf_awk_program" != "x"
+		then
+			cat >>$cf_dir/Makefile <<CF_EOF
+
+# Generated by CF_LIB_RULES
+resulting.map: $UNALTERED_SYMS
+	$AWK 'BEGIN { skip = 1; last=""; } \
+$cf_awk_program \
+{ if ( last != "" && ( skip == 0 || \$\$0 !~ /}/ ) ) { print last; }\
+ skip = 0; last = \$\$0; } \
+END { print last; }' < "$UNALTERED_SYMS" >\$@
+
+distclean::
+	rm -f resulting.map
+CF_EOF
+		fi
+
+		for cf_item in $cf_LIST_MODELS
+		do
+
+	case X$cf_item in
+	(Xlibtool)
+		cf_suffix='.la'
+		cf_depsuf=$cf_suffix
+		;;
+	(Xdebug)
+		case "$cf_cv_system_name" in
+		(*-msvc*)
+			cf_suffix='_g.lib'
+			;;
+		(*)
+			cf_suffix='_g.a'
+			;;
+		esac
+		cf_depsuf=$cf_suffix
+		;;
+	(Xprofile)
+		case "$cf_cv_system_name" in
+		(*-msvc*)
+			cf_suffix='_p.lib'
+			;;
+		(*)
+			cf_suffix='_p.a'
+			;;
+		esac
+		cf_depsuf=$cf_suffix
+		;;
+	(Xshared)
+		case "$cf_cv_system_name" in
+		(aix[5-7]*)
+			cf_suffix='.so'
+			cf_depsuf=$cf_suffix
+			;;
+		(*-msvc*)
+			cf_suffix='.dll'
+			cf_depsuf='.dll.lib'
+			;;
+		(cygwin*|msys*|mingw*)
+			cf_suffix='.dll'
+			cf_depsuf='.dll.a'
+			;;
+		(darwin*)
+			cf_suffix='.dylib'
+			cf_depsuf=$cf_suffix
+			;;
+		(hpux*)
+			case "$target" in
+			(ia64*)
+				cf_suffix='.so'
+				cf_depsuf=$cf_suffix
+				;;
+			(*)
+				cf_suffix='.sl'
+				cf_depsuf=$cf_suffix
+				;;
+			esac
+			;;
+		(*)
+			cf_suffix='.so'
+			cf_depsuf=$cf_suffix
+			;;
+		esac
+		;;
+	(*)
+		case "$target" in
+		(*-msvc*)
+			cf_suffix='.lib'
+			;;
+		(*)
+			cf_suffix='.a'
+			;;
+		esac
+		cf_depsuf=$cf_suffix
+		;;
+	esac
+	if test -n "${LIB_SUFFIX}${EXTRA_SUFFIX}"
+	then
+		cf_suffix="${LIB_SUFFIX}${EXTRA_SUFFIX}${cf_suffix}"
+		cf_depsuf="${LIB_SUFFIX}${EXTRA_SUFFIX}${cf_depsuf}"
+	fi
+
+			if test "$cf_dir" = "c++"
+			then
+
+cf_map_lib_basename=`echo "cxx" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+eval cf_libname="\$${cf_map_lib_basename}_NAME"
+
+			else
+
+cf_map_lib_basename=`echo "$cf_dir" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+eval cf_libname="\$${cf_map_lib_basename}_NAME"
+
+			fi
+			test -z "$cf_libname" && cf_libname="$cf_dir"
+			if test "$cf_item" = shared ; then
+				if test -n "${LIB_SUFFIX}"
+				then
+					cf_shared_suffix=`echo "$cf_suffix" | sed 's/^'"${USE_LIB_SUFFIX}"'//'`
+				else
+					cf_shared_suffix="$cf_suffix"
+				fi
+				if test "$cf_cv_do_symlinks" = yes ; then
+					cf_version_name=
+
+					case "$cf_cv_shlib_version" in
+					(rel)
+						cf_version_name=REL_VERSION
+						;;
+					(abi)
+						cf_version_name=ABI_VERSION
+						;;
+					esac
+
+					if test -n "$cf_version_name"
+					then
+						case "$cf_cv_system_name" in
+						(darwin*)
+							# "w", etc?
+							cf_suffix="${USE_LIB_SUFFIX}"'.${'$cf_version_name'}'"$cf_shared_suffix"
+							;;
+						(*)
+							cf_suffix="$cf_suffix"'.${'$cf_version_name'}'
+							;;
+						esac
+					fi
+					if test -n "${USE_LIB_SUFFIX}"
+					then
+						cf_shared_suffix=`echo "$cf_suffix" | sed 's/^'"${USE_LIB_SUFFIX}"'//'`
+					else
+						cf_shared_suffix="$cf_suffix"
+					fi
+				fi
+				# cygwin needs import library, and has unique naming convention
+				# use autodetected ${cf_prefix} for import lib and static lib, but
+				# use 'cyg' prefix for shared lib.
+				case "$cf_cv_shlib_version" in
+				(cygdll)
+					cf_cygsuf=`echo "$cf_suffix" | sed -e 's/\.dll/\${ABI_VERSION}.dll/'`
+					cf_add_lib="../lib/cyg${cf_libname}${cf_cygsuf}"
+					;;
+				(msysdll)
+					cf_cygsuf=`echo "$cf_suffix" | sed -e 's/\.dll/\${ABI_VERSION}.dll/'`
+					cf_add_lib="../lib/msys-${cf_libname}${cf_cygsuf}"
+					;;
+				(mingw)
+					cf_cygsuf=`echo "$cf_suffix" | sed -e 's/\.dll/\${ABI_VERSION}.dll/'`
+					cf_add_lib="../lib/lib${cf_libname}${cf_cygsuf}"
+					;;
+				(msvcdll)
+					cf_cygsuf=`echo "$cf_suffix" | sed -e 's/\.dll/\${ABI_VERSION}.dll/'`
+					cf_add_lib="../lib/${cf_libname}${cf_cygsuf}"
+					;;
+				(*)
+					cf_add_lib=
+					;;
+				esac
+				if test -n "$cf_add_lib"
+				then
+					Libs_To_Make="$Libs_To_Make $cf_add_lib"
+					continue
+				fi
+			fi
+			cf_add_lib="../lib/${cf_prefix}${cf_libname}${cf_suffix}"
+			Libs_To_Make="$Libs_To_Make $cf_add_lib"
+		done
+
+		if test "$cf_dir" = ncurses ; then
+			cf_subsets="$LIB_SUBSETS"
+			cf_r_parts="$cf_subsets"
+			cf_liblist="$Libs_To_Make"
+
+			while test -n "$cf_r_parts"
+			do
+				cf_l_parts=`echo "$cf_r_parts" |sed -e 's/ .*$//'`
+				cf_r_parts=`echo "$cf_r_parts" |sed -e 's/^[^ ]* //'`
+				if test "$cf_l_parts" != "$cf_r_parts" ; then
+					cf_add_lib=
+					case "$cf_l_parts" in
+					(*termlib*)
+						cf_add_lib=`echo "$cf_liblist" |sed -e s%${LIB_NAME}${USE_LIB_SUFFIX}%${TINFO_LIB_SUFFIX}%g`
+						;;
+					(*ticlib*)
+						cf_add_lib=`echo "$cf_liblist" |sed -e s%${LIB_NAME}${USE_LIB_SUFFIX}%${TICS_LIB_SUFFIX}%g`
+						;;
+					(*)
+						break
+						;;
+					esac
+					if test -n "$cf_add_lib"; then
+						Libs_To_Make="$cf_add_lib $Libs_To_Make"
+					fi
+				else
+					break
+				fi
+			done
+		else
+			cf_subsets=`echo "$LIB_SUBSETS" | sed -e 's/^termlib.* //'`
+		fi
+
+		if test "$cf_dir" = c++; then
+			if test "x$with_shared_cxx" != xyes && test -n "$cf_shared_suffix"; then
+				cf_list=
+				for cf_item in $Libs_To_Make
+				do
+					case "$cf_item" in
+					(*.a)
+						;;
+					(*)
+						cf_item=`echo "$cf_item" | sed -e "s,"$cf_shared_suffix",.a,"`
+						;;
+					esac
+					for cf_test in $cf_list
+					do
+						if test "$cf_test" = "$cf_item"
+						then
+							cf_LIST_MODELS=`echo "$cf_LIST_MODELS" | sed -e 's/normal//'`
+							cf_item=
+							break
+						fi
+					done
+					test -n "$cf_item" && cf_list="$cf_list $cf_item"
+				done
+				Libs_To_Make="$cf_list"
+			fi
+		fi
+
+		sed -e "s%@Libs_To_Make@%$Libs_To_Make%" \
+		    -e "s%@SHARED_LIB@%$SHARED_LIB%" \
+			"$cf_dir/Makefile" >$cf_dir/Makefile.out
+		mv "$cf_dir/Makefile.out" "$cf_dir/Makefile"
+
+		$AWK -f "$srcdir/mk-0th.awk" \
+			libname="${cf_dir}${LIB_SUFFIX}" subsets="$LIB_SUBSETS" ticlib="$TICS_LIB_SUFFIX" termlib="$TINFO_LIB_SUFFIX" \
+			"$srcdir/$cf_dir/modules" >>$cf_dir/Makefile
+
+		for cf_subset in $cf_subsets
+		do
+			cf_subdirs=
+			for cf_item in $cf_LIST_MODELS
+			do
+
+			echo "Appending rules for ${cf_item} model (${cf_dir}: ${cf_subset})"
+
+cf_ITEM=`echo "$cf_item" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+			CXX_MODEL=$cf_ITEM
+			if test "$CXX_MODEL" = SHARED; then
+				case "$cf_cv_shlib_version" in
+				(cygdll|msysdll|mingw|msvcdll)
+					test "x$with_shared_cxx" = xno && test -n "$verbose" && echo "	overriding CXX_MODEL to SHARED" 1>&6
+
+echo "${as_me:-configure}:30848: testing overriding CXX_MODEL to SHARED ..." 1>&5
+
+					with_shared_cxx=yes
+					;;
+				(*)
+					test "x$with_shared_cxx" = xno && CXX_MODEL=NORMAL
+					;;
+				esac
+			fi
+
+	case X$cf_item in
+	(Xlibtool)
+		cf_suffix='.la'
+		cf_depsuf=$cf_suffix
+		;;
+	(Xdebug)
+		case "$cf_cv_system_name" in
+		(*-msvc*)
+			cf_suffix='_g.lib'
+			;;
+		(*)
+			cf_suffix='_g.a'
+			;;
+		esac
+		cf_depsuf=$cf_suffix
+		;;
+	(Xprofile)
+		case "$cf_cv_system_name" in
+		(*-msvc*)
+			cf_suffix='_p.lib'
+			;;
+		(*)
+			cf_suffix='_p.a'
+			;;
+		esac
+		cf_depsuf=$cf_suffix
+		;;
+	(Xshared)
+		case "$cf_cv_system_name" in
+		(aix[5-7]*)
+			cf_suffix='.so'
+			cf_depsuf=$cf_suffix
+			;;
+		(*-msvc*)
+			cf_suffix='.dll'
+			cf_depsuf='.dll.lib'
+			;;
+		(cygwin*|msys*|mingw*)
+			cf_suffix='.dll'
+			cf_depsuf='.dll.a'
+			;;
+		(darwin*)
+			cf_suffix='.dylib'
+			cf_depsuf=$cf_suffix
+			;;
+		(hpux*)
+			case "$target" in
+			(ia64*)
+				cf_suffix='.so'
+				cf_depsuf=$cf_suffix
+				;;
+			(*)
+				cf_suffix='.sl'
+				cf_depsuf=$cf_suffix
+				;;
+			esac
+			;;
+		(*)
+			cf_suffix='.so'
+			cf_depsuf=$cf_suffix
+			;;
+		esac
+		;;
+	(*)
+		case "$target" in
+		(*-msvc*)
+			cf_suffix='.lib'
+			;;
+		(*)
+			cf_suffix='.a'
+			;;
+		esac
+		cf_depsuf=$cf_suffix
+		;;
+	esac
+	if test -n "${LIB_SUFFIX}${EXTRA_SUFFIX}"
+	then
+		cf_suffix="${LIB_SUFFIX}${EXTRA_SUFFIX}${cf_suffix}"
+		cf_depsuf="${LIB_SUFFIX}${EXTRA_SUFFIX}${cf_depsuf}"
+	fi
+
+	case $cf_item in
+	(libtool) cf_subdir='obj_lo'  ;;
+	(normal)  cf_subdir='objects' ;;
+	(debug)   cf_subdir='obj_g' ;;
+	(profile) cf_subdir='obj_p' ;;
+	(shared)
+		case "$cf_cv_system_name" in
+		(cygwin|msys)
+			cf_subdir='objects' ;;
+		(*)
+			cf_subdir='obj_s' ;;
+		esac
+	esac
+
+			# Test for case where we build libtinfo with a different name.
+			cf_libname=$cf_dir
+			if test "$cf_dir" = ncurses ; then
+				case "$cf_subset" in
+				(*base*)
+					cf_libname=${cf_libname}$USE_LIB_SUFFIX
+					;;
+				(*termlib*)
+					cf_libname=$TINFO_LIB_SUFFIX
+					;;
+				(ticlib*)
+					cf_libname=$TICS_LIB_SUFFIX
+					;;
+				esac
+			elif test "$cf_dir" = c++ ; then
+
+cf_map_lib_basename=`echo "cxx" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+eval cf_libname="\$${cf_map_lib_basename}_NAME"
+
+				cf_libname=${cf_libname}$USE_LIB_SUFFIX
+			else
+
+cf_map_lib_basename=`echo "$cf_dir" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+eval cf_libname="\$${cf_map_lib_basename}_NAME"
+
+				cf_libname=${cf_libname}$USE_LIB_SUFFIX
+			fi
+			if test -n "${USE_ARG_SUFFIX}" ; then
+				# undo $USE_LIB_SUFFIX add-on in CF_LIB_SUFFIX
+				cf_suffix=`echo "$cf_suffix" |sed -e "s%^${USE_LIB_SUFFIX}%%"`
+			fi
+
+			# These dependencies really are for development, not
+			# builds, but they are useful in porting, too.
+			cf_depend="../include/ncurses_cfg.h"
+			if test "$srcdir" = "."; then
+				cf_reldir="."
+			else
+				cf_reldir="\${srcdir}"
+			fi
+
+			if test -f "$srcdir/$cf_dir/$cf_dir.priv.h" ; then
+				cf_depend="$cf_depend $cf_reldir/$cf_dir.priv.h"
+			elif test -f "$srcdir/$cf_dir/curses.priv.h" ; then
+				cf_depend="$cf_depend $cf_reldir/curses.priv.h"
+			fi
+
+ 			cf_dir_suffix=
+ 			old_cf_suffix="$cf_suffix"
+ 			if test "$cf_cv_shlib_version_infix" = yes ; then
+			if test -n "$USE_LIB_SUFFIX" ; then
+				case "$USE_LIB_SUFFIX" in
+				(tw*)
+					cf_libname=`echo "$cf_libname" | sed 's/tw'$EXTRA_SUFFIX'$//'`
+					cf_suffix=`echo "$cf_suffix" | sed 's/^tw'$EXTRA_SUFFIX'//'`
+					cf_dir_suffix=tw$EXTRA_SUFFIX
+					;;
+				(t*)
+					cf_libname=`echo "$cf_libname" | sed 's/t'$EXTRA_SUFFIX'$//'`
+					cf_suffix=`echo "$cf_suffix" | sed 's/^t'$EXTRA_SUFFIX'//'`
+					cf_dir_suffix=t$EXTRA_SUFFIX
+					;;
+				(w*)
+					cf_libname=`echo "$cf_libname" | sed 's/w'$EXTRA_SUFFIX'$//'`
+					cf_suffix=`echo "$cf_suffix" | sed 's/^w'$EXTRA_SUFFIX'//'`
+					cf_dir_suffix=w$EXTRA_SUFFIX
+					;;
+				(*)
+					cf_libname=`echo "$cf_libname" | sed 's/'$EXTRA_SUFFIX'$//'`
+					cf_suffix=`echo "$cf_suffix" | sed 's/^'$EXTRA_SUFFIX'//'`
+					cf_dir_suffix=$EXTRA_SUFFIX
+					;;
+				esac
+			fi
+ 			fi
+
+			$AWK -f "$srcdir/mk-1st.awk" \
+				name=${cf_libname}${cf_dir_suffix} \
+				traces=$LIB_TRACING \
+				MODEL=$cf_ITEM \
+				CXX_MODEL=$CXX_MODEL \
+				LIB_SUFFIX=$LIB_SUFFIX \
+				USE_LIB_SUFFIX=$USE_LIB_SUFFIX \
+				make_phony="${cf_cv_make_PHONY:-no}" \
+				model=$cf_subdir \
+				prefix=$cf_prefix \
+				suffix=$cf_suffix \
+				subset=$cf_subset \
+				driver=$cf_cv_term_driver \
+				SymLink="$LN_S" \
+				TermlibRoot=$TINFO_NAME \
+				TermlibSuffix=$TINFO_SUFFIX \
+				ShlibVer=$cf_cv_shlib_version \
+				ShlibVerInfix=$cf_cv_shlib_version_infix \
+				ReLink=${cf_cv_do_relink:-no} \
+				ReRanlib=${cf_cv_do_reranlib:-yes} \
+				DoLinks=$cf_cv_do_symlinks \
+				rmSoLocs=$cf_cv_rm_so_locs \
+				ldconfig="$LDCONFIG" \
+				overwrite=$WITH_OVERWRITE \
+				depend="$cf_depend" \
+				host="$host" \
+				libtool_version="$LIBTOOL_VERSION" \
+				"$srcdir/$cf_dir/modules" >>$cf_dir/Makefile
+
+			cf_suffix="$old_cf_suffix"
+
+			for cf_subdir2 in $cf_subdirs lib
+			do
+				test "$cf_subdir" = "$cf_subdir2" && break
+			done
+			test "${cf_subset}.${cf_subdir2}" != "${cf_subset}.${cf_subdir}" && \
+			$AWK -f "$srcdir/mk-2nd.awk" \
+				name=$cf_dir \
+				traces=$LIB_TRACING \
+				MODEL=$cf_ITEM \
+				model=$cf_subdir \
+				subset=$cf_subset \
+				srcdir=$srcdir \
+				echo=$WITH_ECHO \
+				crenames=$cf_cv_prog_CC_c_o \
+				cxxrenames=$cf_cv_prog_CXX_c_o \
+				"$srcdir/$cf_dir/modules" >>$cf_dir/Makefile
+			cf_subdirs="$cf_subdirs $cf_subdir"
+			done
+		done
+	fi
+
+	echo '	( cd '$cf_dir' && ${MAKE} ${TOP_MFLAGS} $@ )' >>Makefile
+done
+
+echo >> Makefile
+echo '# generated by CF_LIB_RULES' >> Makefile
+
+if test "x$cf_cv_make_PHONY" = xyes ; then
+	cat >> Makefile <<-CF_EOF
+
+	.PHONY :	libs
+	.PHONY :	lintlib
+	.PHONY :	install.includes
+	.PHONY :	uninstall.includes
+	.PHONY :	install.libs
+	.PHONY :	uninstall.libs
+CF_EOF
+fi
+
+for cf_dir in $SRC_SUBDIRS
+do
+	if test ! -d "$srcdir/$cf_dir" ; then
+		continue
+	fi
+
+	if test -f "$cf_dir/Makefile" ; then
+		case "$cf_dir" in
+		(Ada95)
+			echo 'libs \' >> Makefile
+			echo 'install.libs \' >> Makefile
+			echo 'uninstall.libs ::' >> Makefile
+			echo '	( cd '$cf_dir' && ${MAKE} ${TOP_MFLAGS} $@ )' >> Makefile
+			;;
+		esac
+	fi
+
+	if test -f "$srcdir/$cf_dir/modules" ; then
+
+		if test "x$cf_cv_make_PHONY" = xyes ; then
+			cat >> Makefile <<-CF_EOF
+
+			.PHONY :	install.$cf_dir
+			.PHONY :	uninstall.$cf_dir
+CF_EOF
+		fi
+
+		echo >> Makefile
+		if test -f "$srcdir/$cf_dir/headers" ; then
+cat >> Makefile <<CF_EOF
+install.includes \\
+uninstall.includes \\
+CF_EOF
+		fi
+
+cat >> Makefile <<CF_EOF
+lint \\
+libs \\
+lintlib \\
+install.libs \\
+uninstall.libs \\
+install.$cf_dir \\
+uninstall.$cf_dir ::
+	( cd "$cf_dir" && \${MAKE} \${TOP_MFLAGS} \$@ )
+CF_EOF
+	elif test -f "$srcdir/$cf_dir/headers" ; then
+cat >> Makefile <<CF_EOF
+
+libs \\
+install.libs \\
+uninstall.libs \\
+install.includes \\
+uninstall.includes ::
+	( cd "$cf_dir" && \${MAKE} \${TOP_MFLAGS} \$@ )
+CF_EOF
+fi
+done
+
+if test "x$cf_cv_make_PHONY" = xyes ; then
+	cat >> Makefile <<-CF_EOF
+
+	.PHONY :	install.data
+	.PHONY :	uninstall.data
+CF_EOF
+fi
+
+if test "x$cf_with_db_install" = xyes; then
+cat >> Makefile <<CF_EOF
+
+install.libs uninstall.libs \\
+install.data uninstall.data ::
+$MAKE_TERMINFO	( cd misc && \${MAKE} \${TOP_MFLAGS} \$@ )
+CF_EOF
+else
+cat >> Makefile <<CF_EOF
+
+install.libs uninstall.libs ::
+	( cd misc && \${MAKE} \${TOP_MFLAGS} \$@ )
+CF_EOF
+fi
+
+if test "x$cf_with_manpages" = xyes; then
+
+if test "x$cf_cv_make_PHONY" = xyes ; then
+	cat >> Makefile <<-CF_EOF
+
+	.PHONY :	install.man
+	.PHONY :	uninstall.man
+CF_EOF
+fi
+
+cat >> Makefile <<CF_EOF
+
+install.man \\
+uninstall.man ::
+	( cd man && \${MAKE} \${TOP_MFLAGS} \$@ )
+CF_EOF
+fi
+
+cat >> Makefile <<CF_EOF
+
+distclean ::
+	rm -f config.cache config.log config.status Makefile include/ncurses_cfg.h
+	rm -f headers.sh headers.sed mk_shared_lib.sh
+	rm -f edit_man.* man_alias.*
+	rm -rf \${DIRS_TO_MAKE}
+CF_EOF
+
+# Special case: tack's manpage lives in its own directory.
+if test "x$cf_with_manpages" = xyes; then
+if test "x$cf_with_tack" = "xyes"; then
+cat >> Makefile <<CF_EOF
+
+install.man \\
+uninstall.man ::
+	( cd tack && \${MAKE} \${TOP_MFLAGS} \$@ )
+CF_EOF
+fi
+fi
+
+rm -f headers.sed headers.sh
+
+echo creating headers.sh
+cat >headers.sh <<CF_EOF
+#! $SHELL
+# This shell script is generated by the 'configure' script.  It is invoked in a
+# subdirectory of the build tree.  It generates a sed-script in the parent
+# directory that is used to adjust includes for header files that reside in a
+# subdirectory of /usr/include, etc.
+PRG=""
+while test \$# != 3
+do
+PRG="\$PRG \$1"; shift
+done
+DST=\$1
+REF=\$2
+SRC=\$3
+TMPSRC=\${TMPDIR:-/tmp}/\`basename \$SRC\`\$\$
+TMPSED=\${TMPDIR:-/tmp}/headers.sed\$\$
+echo installing \$SRC in \$DST
+CF_EOF
+
+if test "$WITH_CURSES_H" = yes; then
+	cat >>headers.sh <<CF_EOF
+case \$DST in
+(/*/include/*)
+	END=\`basename \$DST\`
+	for i in \`cat \$REF/../*/headers |${FGREP-fgrep} -v "#"\`
+	do
+		NAME=\`basename \$i\`
+		echo "s/<\$NAME>/<\$END\/\$NAME>/" >> \$TMPSED
+	done
+	;;
+(*)
+	echo "" >> \$TMPSED
+	;;
+esac
+CF_EOF
+
+else
+	cat >>headers.sh <<CF_EOF
+case \$DST in
+(/*/include/*)
+	END=\`basename \$DST\`
+	for i in \`cat \$REF/../*/headers |${FGREP-fgrep} -v "#"\`
+	do
+		NAME=\`basename \$i\`
+		if test "\$NAME" = "curses.h"
+		then
+			echo "s/<curses.h>/<ncurses.h>/" >> \$TMPSED
+			NAME=ncurses.h
+		fi
+		echo "s/<\$NAME>/<\$END\/\$NAME>/" >> \$TMPSED
+	done
+	;;
+(*)
+	echo "s/<curses.h>/<ncurses.h>/" >> \$TMPSED
+	;;
+esac
+CF_EOF
+fi
+cat >>headers.sh <<CF_EOF
+rm -f \$TMPSRC
+sed -f \$TMPSED \$SRC > \$TMPSRC
+NAME=\`basename \$SRC\`
+CF_EOF
+if test "$WITH_CURSES_H" != yes; then
+	cat >>headers.sh <<CF_EOF
+test "\$NAME" = "curses.h" && NAME=ncurses.h
+CF_EOF
+fi
+cat >>headers.sh <<CF_EOF
+# Just in case someone gzip'd manpages, remove the conflicting copy.
+test -f \$DST/\$NAME.gz && rm -f \$DST/\$NAME.gz
+
+eval \$PRG \$TMPSRC \$DST/\$NAME
+rm -f \$TMPSRC \$TMPSED
+CF_EOF
+
+chmod 0755 headers.sh
+
+for cf_dir in $SRC_SUBDIRS
+do
+	if test ! -d "$srcdir/$cf_dir" ; then
+		continue
+	fi
+
+	if test -f "$srcdir/$cf_dir/headers" ; then
+		$AWK -f "$srcdir/mk-hdr.awk" \
+			subset="$LIB_SUBSETS" \
+			compat="$WITH_CURSES_H" \
+			"$srcdir/$cf_dir/headers" >>$cf_dir/Makefile
+	fi
+
+	if test -f "$srcdir/$cf_dir/modules" ; then
+		if test "$cf_dir" != "c++" ; then
+			if test "x$cf_cv_make_PHONY" = xyes ; then
+				cat >> $cf_dir/Makefile <<-CF_EOF
+
+				.PHONY :	depend
+CF_EOF
+			fi
+
+			cat >>$cf_dir/Makefile <<"CF_EOF"
+depend : ${AUTO_SRC}
+	makedepend -- ${CPPFLAGS} -- ${C_SRC}
+
+# DO NOT DELETE THIS LINE -- make depend depends on it.
+CF_EOF
+		fi
+	fi
+done
+
+if test "$MANPAGE_RENAMES" != no ; then
+	# Construct a sed-script to perform renaming within man-pages
+	test -n "$verbose" && echo "creating edit_man.sed"
+	test ! -d man && mkdir man
+	FGREP="${FGREP-grep -F}" $SHELL "$srcdir/man/make_sed.sh" "$MANPAGE_RENAMES" >./edit_man.sed
+fi
+
+if test "x$cf_with_ada" = "xyes" && test "x$cf_cv_prog_gnat_correct" = "xyes"; then
+if test -z "$USE_OLD_MAKERULES" ; then
+	$AWK -f "$srcdir/Ada95/mk-1st.awk" <"$srcdir/Ada95/src/modules" >>Ada95/src/Makefile
+fi
+fi
+ ;;
+  esac
+done
+EOF
+
+cat >>"$CONFIG_STATUS" <<\EOF
+
+{ (exit 0); exit 0; }
+EOF
+chmod +x "$CONFIG_STATUS"
+ac_clean_files=$ac_clean_files_save
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  exec 5>/dev/null
+  $SHELL "$CONFIG_STATUS" || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  "$ac_cs_success" || { (exit 1); exit 1; }
+fi
+${MAKE:-make} preinstall
diff --git a/configure.in b/configure.in
new file mode 100644
index 0000000..093dd47
--- /dev/null
+++ b/configure.in
@@ -0,0 +1,2643 @@
+dnl***************************************************************************
+dnl Copyright 2018-2021,2022 Thomas E. Dickey                                *
+dnl Copyright 1998-2017,2018 Free Software Foundation, Inc.                  *
+dnl                                                                          *
+dnl Permission is hereby granted, free of charge, to any person obtaining a  *
+dnl copy of this software and associated documentation files (the            *
+dnl "Software"), to deal in the Software without restriction, including      *
+dnl without limitation the rights to use, copy, modify, merge, publish,      *
+dnl distribute, distribute with modifications, sublicense, and/or sell       *
+dnl copies of the Software, and to permit persons to whom the Software is    *
+dnl furnished to do so, subject to the following conditions:                 *
+dnl                                                                          *
+dnl The above copyright notice and this permission notice shall be included  *
+dnl in all copies or substantial portions of the Software.                   *
+dnl                                                                          *
+dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
+dnl OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
+dnl MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
+dnl IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
+dnl DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
+dnl OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
+dnl THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
+dnl                                                                          *
+dnl Except as contained in this notice, the name(s) of the above copyright   *
+dnl holders shall not be used in advertising or otherwise to promote the     *
+dnl sale, use or other dealings in this Software without prior written       *
+dnl authorization.                                                           *
+dnl***************************************************************************
+dnl
+dnl Author: Thomas E. Dickey 1995-on
+dnl
+dnl $Id: configure.in,v 1.753 2022/11/05 20:14:56 tom Exp $
+dnl Process this file with autoconf to produce a configure script.
+dnl
+dnl For additional information, see
+dnl     https://invisible-island.net/autoconf/
+dnl     https://invisible-island.net/autoconf/my-autoconf.html
+dnl
+dnl ---------------------------------------------------------------------------
+AC_PREREQ(2.52.20210101)
+AC_REVISION($Revision: 1.753 $)
+AC_INIT(ncurses/base/lib_initscr.c)
+AC_CONFIG_HEADER(include/ncurses_cfg.h:include/ncurses_cfg.hin)
+
+AC_DEFUN([AC_PATH_XTRA],[])dnl ignore dependencies on this
+
+CF_TOP_BUILDDIR
+CF_SUBST_NCURSES_VERSION
+CF_VERSION_INFO(NCURSES,ncurses)
+
+CF_WITH_REL_VERSION(NCURSES)
+CF_NCURSES_WITH_ABI_VERSION
+
+CF_WITH_SYSTYPE
+
+###	Save the given $CFLAGS to allow user-override.
+cf_user_CFLAGS="$CFLAGS"
+
+###	Default install-location
+CF_CFG_DEFAULTS
+### Defaults for ncurses ABI
+CF_ABI_DEFAULTS
+
+###	Checks for programs.
+AC_ARG_WITH(ada,
+	[  --without-ada           suppress check for Ada compiler, don't build demo],
+	[cf_with_ada=$withval],
+	[cf_with_ada=yes])
+
+if test "x$cf_with_ada" = xyes
+then
+	cf_prog_cc="gnatgcc gcc cc"
+else
+	cf_prog_cc="gcc cc"
+fi
+CF_PROG_CC($cf_prog_cc)
+
+AC_PROG_CPP
+AC_PROG_GCC_TRADITIONAL
+CF_PROG_CC_C_O(CC,[$CFLAGS $CPPFLAGS])
+CF_PROG_LDCONFIG
+
+dnl DEFECT in autoconf 2.12:	an attempt to set policy, this breaks the
+dnl				configure script by not letting us test if C++
+dnl				is present, making this option necessary.
+AC_MSG_CHECKING(if you want to ensure bool is consistent with C++)
+AC_ARG_WITH(cxx,
+	[  --without-cxx           do not adjust ncurses bool to match C++],
+	[cf_with_cxx=$withval],
+	[cf_with_cxx=yes])
+AC_MSG_RESULT($cf_with_cxx)
+if test "X$cf_with_cxx" = Xno ; then
+	CXX=""
+	GXX=""
+else
+	# with autoconf 2.13, we can change the error to a warning:
+	pushdef([AC_MSG_ERROR],
+		[AC_MSG_RESULT(no)
+		 AC_MSG_WARN([You don't have any C++ compiler, too bad])
+		cf_with_cxx=no; CXX=""; GXX="";])dnl
+	AC_PROG_CXX
+	popdef([AC_MSG_ERROR])dnl
+
+	AC_LANG_PUSH(C++)
+	if test "x$cf_with_cxx" != xno
+	then
+		# Several of the C++ configurations do not work, particularly when
+		# cross-compiling (20140913 -TD)
+		AC_MSG_CHECKING(if $CXX works)
+
+		save_CPPFLAGS="$CPPFLAGS"
+		eval cf_includedir=${includedir}
+		CPPFLAGS="$CPPFLAGS -I${cf_includedir}"
+		AC_TRY_COMPILE([
+#include <stdlib.h>
+#include <stdio.h>
+],
+		[
+		printf("Hello world!\n")
+		],
+		[cf_cxx_works=yes],
+		[cf_cxx_works=no])
+		CPPFLAGS="$save_CPPFLAGS"
+
+		AC_MSG_RESULT($cf_cxx_works)
+		if test "x$cf_cxx_works" = xno
+		then
+			AC_MSG_WARN([Ignore $CXX, since it cannot compile hello-world.])
+			cf_with_cxx=no; CXX=""; GXX="";
+		fi
+	fi
+	AC_LANG_POP
+
+	# autoconf 2.5x removed the error (hardcoding it to g++, or just blank)
+	if test "$CXX" = "g++" ; then
+		AC_PATH_PROG(CXX,g++)
+	fi
+	case "x$CXX" in
+	(x|xg++)
+		AC_MSG_WARN([You don't have any C++ compiler, too bad])
+		cf_with_cxx=no; CXX=""; GXX="";
+		;;
+	esac
+fi
+
+CF_GXX_VERSION
+case "$GXX_VERSION" in
+([[1-9]][[0-9]].*)
+	;;
+(1.*|2.[[0-6]]*)
+	AC_MSG_WARN(templates do not work)
+	;;
+esac
+
+AC_MSG_CHECKING(if you want to build C++ binding and demo)
+AC_ARG_WITH(cxx-binding,
+	[  --without-cxx-binding   do not build C++ binding and demo],
+	[cf_with_cxx_binding=$withval],
+	[cf_with_cxx_binding=$cf_with_cxx])
+AC_MSG_RESULT($cf_with_cxx_binding)
+
+AC_MSG_CHECKING(if you want to build with Ada)
+AC_MSG_RESULT($cf_with_ada)
+
+AC_MSG_CHECKING(if you want to install terminal database)
+AC_ARG_ENABLE(db-install,
+	[  --disable-db-install    suppress install of terminal database],
+	[cf_with_db_install=$enableval],
+	[cf_with_db_install=yes])
+AC_MSG_RESULT($cf_with_db_install)
+
+AC_MSG_CHECKING(if you want to install manpages)
+AC_ARG_WITH(manpages,
+	[  --without-manpages      suppress install of manpages],
+	[cf_with_manpages=$withval],
+	[cf_with_manpages=yes])
+AC_MSG_RESULT($cf_with_manpages)
+
+AC_MSG_CHECKING(if you want to build programs such as tic)
+AC_ARG_WITH(progs,
+	[  --without-progs         suppress build/install with programs (e.g., tic)],
+	[cf_with_progs=$withval],
+	[cf_with_progs=yes])
+AC_MSG_RESULT($cf_with_progs)
+
+if test -f "$srcdir/tack/tack.h" ; then
+	if test "x$cross_compiling" = xyes ; then
+		CF_VERBOSE(ignoring tack because we are cross-compiling)
+		cf_with_tack=no
+	else
+		AC_MSG_CHECKING(if you want to build the tack program)
+		AC_ARG_WITH(tack,
+			[  --without-tack          suppress build/install with tack program],
+			[cf_with_tack=$withval],
+			[cf_with_tack=$cf_with_progs])
+		AC_MSG_RESULT($cf_with_tack)
+	fi
+else
+	cf_with_tack=no
+fi
+
+AC_MSG_CHECKING(if you want to build test-programs)
+AC_ARG_WITH(tests,
+	[  --without-tests         suppress build/install with test-programs],
+	[cf_with_tests=$withval],
+	[cf_with_tests=yes])
+AC_MSG_RESULT($cf_with_tests)
+
+AC_MSG_CHECKING(if you wish to install curses.h)
+AC_ARG_WITH(curses-h,
+	[  --without-curses-h      install curses.h as ncurses.h only],
+	[with_curses_h=$withval],
+	[with_curses_h=yes])
+AC_MSG_RESULT($with_curses_h)
+
+modules_to_build="ncurses"
+test "X$cf_with_progs" != Xno && modules_to_build="$modules_to_build progs"
+test "X$cf_with_tack"  != Xno && modules_to_build="$modules_to_build tack"
+modules_to_build="$modules_to_build panel menu form"
+
+AC_ARG_PROGRAM
+
+CF_PROG_AWK
+CF_PROG_INSTALL
+CF_PROG_LINT
+CF_PROG_LN_S
+
+AC_SYS_LONG_FILE_NAMES
+
+# Provide for renaming "ncurses5-config" to "ncurses5X-config", etc., in case
+# of package conflict.
+cf_config_suffix=
+AC_ARG_WITH(config-suffix,
+	[  --with-config-suffix=X  suffixes ncursesXX-config file],
+	[case "x$withval" in
+	(xyes|xno)
+		AC_MSG_WARN(expected a value for config-suffix option)
+		;;
+	(*)	cf_config_suffix="$withval"
+		;;
+	esac])
+AC_SUBST(cf_config_suffix)
+
+# If we find pkg-config, check if we should install the ".pc" files.
+CF_PKG_CONFIG
+CF_WITH_PKG_CONFIG_LIBDIR
+CF_ENABLE_PC_FILES
+if test -z "$MAKE_PC_FILES"
+then
+	AC_MSG_CHECKING(for suffix to add to pc-files)
+AC_ARG_WITH(pc-suffix,
+	[  --with-pc-suffix        suffixes pc-files],
+	[case "x$withval" in
+	(xyes|xno)
+		PC_MODULE_SUFFIX=
+		;;
+	(*)	PC_MODULE_SUFFIX="$withval"
+		;;
+	esac])
+	test -z "$PC_MODULE_SUFFIX" && PC_MODULE_SUFFIX=none
+	AC_MSG_RESULT($PC_MODULE_SUFFIX)
+	test "$PC_MODULE_SUFFIX" = none && PC_MODULE_SUFFIX=
+	AC_SUBST(PC_MODULE_SUFFIX)
+fi
+
+AC_MSG_CHECKING(if we should assume mixed-case filenames)
+AC_ARG_ENABLE(mixed-case,
+	[  --enable-mixed-case     tic should assume mixed-case filenames],
+	[enable_mixedcase=$enableval],
+	[enable_mixedcase=auto])
+AC_MSG_RESULT($enable_mixedcase)
+if test "$enable_mixedcase" = "auto" ; then
+	CF_MIXEDCASE_FILENAMES
+else
+	cf_cv_mixedcase=$enable_mixedcase
+	if test "x$enable_mixedcase" = "xyes" ; then
+		AC_DEFINE(MIXEDCASE_FILENAMES,1,[Define to 1 if tic should assume mixed-case filenames])
+	fi
+fi
+
+# do this after mixed-case option (tags/TAGS is not as important as tic).
+AC_PROG_MAKE_SET
+CF_MAKE_PHONY
+CF_MAKE_TAGS
+CF_MAKEFLAGS
+
+dnl These are standard among *NIX systems, but not when cross-compiling
+AC_CHECK_TOOL(RANLIB, ranlib, ':')
+AC_CHECK_TOOL(LD, ld, ld)
+AC_CHECK_TOOL(AR, ar, ar)
+AC_CHECK_TOOL(NM, nm, nm)
+CF_AR_FLAGS
+
+dnl Special option for use by system-builders: the install-prefix is used to
+dnl adjust the location into which the actual install is done, so that an
+dnl archive can be built without modifying the host system's configuration.
+AC_MSG_CHECKING(if you have specified an install-prefix)
+AC_ARG_WITH(install-prefix,
+	[  --with-install-prefix   prefixes actual install-location ($DESTDIR)],
+	[case "x$withval" in
+	(xyes|xno)
+		;;
+	(*)	DESTDIR="$withval"
+		;;
+	esac])
+AC_MSG_RESULT($DESTDIR)
+AC_SUBST(DESTDIR)
+
+###############################################################################
+CF_HELP_MESSAGE(Build-Tools Needed to Compile Temporary Applications for Cross-compiling:)
+# If we're cross-compiling, allow the user to override the tools and their
+# options.  The configure script is oriented toward identifying the host
+# compiler, etc., but we need a build compiler to generate parts of the source.
+
+case "$cf_cv_system_name" in
+(*-msvc*)
+	LDFLAGS="$LDFLAGS user32.lib"
+	export LDFLAGS
+	;;
+esac
+
+CF_BUILD_CC
+
+###############################################################################
+CF_HELP_MESSAGE(Options to Specify the Libraries Built/Used:)
+
+### Options to allow the user to specify the set of libraries which are used.
+### Use "--without-normal --with-shared" to allow the default model to be
+### shared, for example.
+cf_list_models=""
+AC_SUBST(cf_list_models)dnl	the complete list of models ("normal debug")
+
+CF_WITH_LIBTOOL
+if test "$with_libtool" != "no" ; then
+
+cf_list_models="$cf_list_models libtool"
+
+else
+
+AC_MSG_CHECKING(if you want to build shared libraries)
+AC_ARG_WITH(shared,
+	[  --with-shared           generate shared-libraries],
+	[with_shared=$withval],
+	[with_shared=no])
+AC_MSG_RESULT($with_shared)
+test "x$with_shared" = "xyes" && cf_list_models="$cf_list_models shared"
+
+AC_MSG_CHECKING(if you want to build static libraries)
+AC_ARG_WITH(normal,
+	[  --with-normal           generate normal-libraries (default)],
+	[with_normal=$withval],
+	[with_normal=yes])
+AC_MSG_RESULT($with_normal)
+test "x$with_normal" = "xyes" && cf_list_models="$cf_list_models normal"
+
+AC_MSG_CHECKING(if you want to build debug libraries)
+AC_ARG_WITH(debug,
+	[  --with-debug            generate debug-libraries (default)],
+	[with_debug=$withval],
+	[with_debug=yes])
+AC_MSG_RESULT($with_debug)
+test "x$with_debug" = "xyes" && cf_list_models="$cf_list_models debug"
+
+AC_MSG_CHECKING(if you want to build profiling libraries)
+AC_ARG_WITH(profile,
+	[  --with-profile          generate profile-libraries],
+	[with_profile=$withval],
+	[with_profile=no])
+AC_MSG_RESULT($with_profile)
+test "x$with_profile" = "xyes" && cf_list_models="$cf_list_models profile"
+
+fi
+
+if test "X$cf_with_cxx_binding" != Xno; then
+if test "x$with_shared" = "xyes"; then
+AC_MSG_CHECKING(if you want to build C++ shared libraries)
+AC_ARG_WITH(cxx-shared,
+	[  --with-cxx-shared       generate C++ shared-libraries],
+	[with_shared_cxx=$withval],
+	[with_shared_cxx=no])
+AC_MSG_RESULT($with_shared_cxx)
+fi
+fi
+
+###############################################################################
+
+AC_MSG_CHECKING(for specified models)
+test -z "$cf_list_models" && cf_list_models=normal
+dnl If we use libtool to generate libraries, then it must be the only
+dnl specified model.
+test "$with_libtool" != "no" && cf_list_models=libtool
+AC_MSG_RESULT($cf_list_models)
+
+### Use the first model as the default, and save its suffix for use in building
+### up test-applications.
+AC_MSG_CHECKING(for default model)
+DFT_LWR_MODEL=`echo "$cf_list_models" | $AWK '{print $1}'`
+AC_MSG_RESULT($DFT_LWR_MODEL)
+
+CF_UPPER(DFT_UPR_MODEL,$DFT_LWR_MODEL)dnl
+
+AC_SUBST(DFT_LWR_MODEL)dnl	the default model ("normal")
+AC_SUBST(DFT_UPR_MODEL)dnl	the default model ("NORMAL")
+
+TICS_NAME=tic
+AC_SUBST(TICS_NAME)
+
+TINFO_NAME=tinfo
+AC_SUBST(TINFO_NAME)
+
+LIB_NAME=ncurses
+AC_SUBST(LIB_NAME)
+
+LIB_DIR=../lib
+LIB_2ND=../../lib
+
+CF_WITH_LIB_PREFIX(cf_prefix)
+
+LIB_SUFFIX=
+AC_SUBST(LIB_SUFFIX)
+CF_PATHSEP
+
+###############################################################################
+
+AC_MSG_CHECKING(if you want to build a separate terminfo library)
+AC_ARG_WITH(termlib,
+	[  --with-termlib          generate separate terminfo library],
+	[with_termlib=$withval],
+	[with_termlib=no])
+AC_MSG_RESULT($with_termlib)
+
+AC_MSG_CHECKING(if you want to build a separate tic library)
+AC_ARG_WITH(ticlib,
+	[  --with-ticlib           generate separate tic library],
+	[with_ticlib=$withval],
+	[with_ticlib=no])
+AC_MSG_RESULT($with_ticlib)
+
+dnl Not all ports of gcc support the -g option
+
+if test X"$CC_G_OPT" = X"" ; then
+	CC_G_OPT='-g'
+	test -n "$GCC" && test "x${ac_cv_prog_cc_g}" != xyes && CC_G_OPT=''
+fi
+AC_SUBST(CC_G_OPT)
+
+if test X"$CXX_G_OPT" = X"" ; then
+	CXX_G_OPT='-g'
+	test -n "$GXX" && test "x${ac_cv_prog_cxx_g}" != xyes && CXX_G_OPT=''
+fi
+AC_SUBST(CXX_G_OPT)
+
+AC_MSG_CHECKING(for default loader flags)
+case "$DFT_LWR_MODEL" in
+(libtool) LD_MODEL=''   ;;
+(normal)  LD_MODEL=''   ;;
+(debug)   LD_MODEL=$CC_G_OPT ;;
+(profile) LD_MODEL='-pg';;
+(shared)  LD_MODEL=''   ;;
+esac
+AC_SUBST(LD_MODEL)dnl		the type of link (e.g., -g or -pg)
+AC_MSG_RESULT($LD_MODEL)
+
+case "$DFT_LWR_MODEL" in
+(shared)
+CF_ENABLE_RPATH
+AC_MSG_CHECKING(if shared libraries should be relinked during install)
+AC_ARG_ENABLE(relink,
+[  --disable-relink        relink shared libraries during install],
+[cf_cv_do_relink=$enableval],
+[cf_cv_do_relink=yes])
+AC_MSG_RESULT($cf_cv_do_relink)
+	;;
+esac
+
+# we will build libraries one-level down.
+rel_builddir=..
+CF_SHARED_OPTS
+for model in $cf_list_models ; do
+	case "$model" in
+	(libtool)
+		CF_WITH_LIBTOOL_OPTS
+		CF_WITH_EXPORT_SYMS
+		;;
+	(shared)
+		if test "$CC_SHARED_OPTS" = "unknown"; then
+			AC_ERROR(Shared libraries are not supported in this version)
+		fi
+		# workaround for inept transition to PIE vs PIC...
+		AC_MSG_CHECKING(if current CFLAGS link properly)
+		AC_TRY_LINK(
+			[#include <stdio.h>],
+			[printf("Hello work\\n");],
+			[cf_cflags_work=yes],
+			[cf_cflags_work=no])
+		AC_MSG_RESULT($cf_cflags_work)
+		if test "$cf_cflags_work" = no
+		then
+			CF_VERBOSE(try to work around by appending shared-options)
+			CFLAGS="$CFLAGS $CC_SHARED_OPTS"
+		fi
+		CF_WITH_VERSIONED_SYMS
+		;;
+	esac
+done
+
+### Checks for special libraries, must be done up-front.
+SHLIB_LIST=""
+CF_WITH_GPM
+if test "$with_gpm" != no ; then
+	AC_MSG_CHECKING(if you want to load GPM dynamically)
+	AC_ARG_WITH(dlsym,
+		[  --without-dlsym         do not use dlsym() to load GPM dynamically],
+		[with_dlsym=$withval],
+		[with_dlsym=yes])
+	AC_MSG_RESULT($with_dlsym)
+	if test "x$with_dlsym" = xyes ; then
+		CF_FUNC_DLSYM
+		if test "x$with_gpm" != xyes ; then
+			CF_VERBOSE(assuming soname for gpm is $with_gpm)
+			cf_cv_gpm_soname="$with_gpm"
+		else
+			CF_LIB_SONAME([#include <gpm.h>],[if (Gpm_Open(0,0)) Gpm_Close();],gpm)
+		fi
+		test "$cf_cv_gpm_soname" != "unknown" && AC_DEFINE_UNQUOTED(LIBGPM_SONAME,"$cf_cv_gpm_soname",[Define as needed to set the gpm share library soname])
+		SHLIB_LIST="-ldl $SHLIB_LIST"
+		CF_ADD_LIB(dl,PRIVATE_LIBS)
+	else
+		SHLIB_LIST="-lgpm $SHLIB_LIST"
+		CF_ADD_LIB(gpm,TEST_LIBS)
+		CF_ADD_LIB(gpm,PRIVATE_LIBS)
+	fi
+	AC_DEFINE(HAVE_LIBGPM,1,[Define to 1 if we have the gpm library])
+	CF_CHECK_GPM_WGETCH
+fi
+
+CF_WITH_PCRE2
+CF_WITH_SYSMOUSE
+
+# pretend that ncurses==ncursesw==ncursest
+AC_MSG_CHECKING(if you want to disable library suffixes)
+CF_ARG_DISABLE(lib-suffixes,
+	[  --disable-lib-suffixes  disable library suffixes],
+	[disable_lib_suffixes=yes],
+	[disable_lib_suffixes=no],
+	no)
+AC_MSG_RESULT($disable_lib_suffixes)
+
+### If we're building with rpath, try to link non-standard libs that way too.
+if test "$DFT_LWR_MODEL" = "shared" && test "x$cf_cv_enable_rpath" != xno; then
+	CF_DISABLE_RPATH_HACK
+fi
+
+### Depending on the system, someone may use rpath to build ncurses but not
+# want users of the package to rely upon that feature.  Give those people an
+# option to suppress that detail from EXTRA_LDFLAGS.
+EXTRA_PKG_LDFLAGS="$LDFLAGS $EXTRA_LDFLAGS"
+if test -n "$EXTRA_PKG_LDFLAGS"
+then
+	AC_MSG_CHECKING(if you want to disable extra LDFLAGS for package-scripts)
+	CF_ARG_DISABLE(pkg-ldflags,
+		[  --disable-pkg-ldflags   disable extra LDFLAGS for package-scripts],
+		[disable_pkg_ldflags=yes],
+		[disable_pkg_ldflags=no],
+		no)
+	AC_MSG_RESULT($disable_pkg_ldflags)
+	test "$disable_pkg_ldflags" = yes && EXTRA_PKG_LDFLAGS=
+fi
+AC_SUBST(EXTRA_PKG_LDFLAGS)
+
+###############################################################################
+CF_HELP_MESSAGE(Fine-Tuning Your Configuration:)
+
+###	use option --with-extra-suffix to append suffix to headers and libraries
+AC_MSG_CHECKING(if you wish to append extra suffix to header/library paths)
+EXTRA_SUFFIX=
+AC_ARG_WITH(extra-suffix,
+	[  --with-extra-suffix=X   append extra suffix to header/library paths],
+	[case x$withval in
+	(xno)
+		;;
+	(xyes|x)
+		EXTRA_SUFFIX=$cf_cv_abi_version
+		;;
+	(*)
+		EXTRA_SUFFIX=$withval
+		;;
+	esac
+	])
+AC_MSG_RESULT($EXTRA_SUFFIX)
+AC_SUBST(EXTRA_SUFFIX)
+
+###	use option --disable-overwrite to leave out the link to -lcurses
+AC_MSG_CHECKING(if you wish to install ncurses overwriting curses)
+AC_ARG_ENABLE(overwrite,
+	[  --disable-overwrite     put headers in subdir, omit link to -lcurses],
+	[with_overwrite=$enableval],
+	[if test "$prefix" = "/usr" ; then with_overwrite=yes; else with_overwrite=no; fi])
+AC_MSG_RESULT($with_overwrite)
+
+AC_MSG_CHECKING(if external terminfo-database is used)
+AC_ARG_ENABLE(database,
+	[  --disable-database      do not use terminfo, only fallbacks/termcap],
+	[use_database=$enableval],
+	[use_database=yes])
+AC_MSG_RESULT($use_database)
+
+case "$host_os" in
+(os2*)
+	TERMINFO_SRC='${top_srcdir}/misc/emx.src'
+	;;
+(*)
+	TERMINFO_SRC='${top_srcdir}/misc/terminfo.src'
+	;;
+esac
+AC_SUBST(TERMINFO_SRC)
+
+NCURSES_USE_DATABASE=0
+if test "$use_database" != no ; then
+	NCURSES_USE_DATABASE=1
+
+	AC_MSG_CHECKING(which terminfo source-file will be installed)
+	AC_ARG_WITH(database,
+		[  --with-database=XXX     specify terminfo source to install],
+		[TERMINFO_SRC=$withval])
+	AC_MSG_RESULT($TERMINFO_SRC)
+
+	AC_MSG_CHECKING(whether to use hashed database instead of directory/tree)
+	AC_ARG_WITH(hashed-db,
+		[  --with-hashed-db        specify hashed-database library],,
+		[with_hashed_db=no])
+	AC_MSG_RESULT($with_hashed_db)
+else
+	with_hashed_db=no
+fi
+AC_SUBST(NCURSES_USE_DATABASE)
+
+AC_MSG_CHECKING(for list of fallback descriptions)
+AC_ARG_WITH(fallbacks,
+	[  --with-fallbacks=XXX    specify list of fallback terminal descriptions],
+	[with_fallback=$withval],
+	[with_fallback=])
+AC_MSG_RESULT($with_fallback)
+
+case ".$with_fallback" in
+(.|.no)
+	FALLBACK_LIST=
+	;;
+(.yes)
+	AC_MSG_WARN(expected a list of terminal descriptions)
+	;;
+(*)
+	FALLBACK_LIST=`echo "$with_fallback" | sed -e 's/,/ /g'`
+	;;
+esac
+
+# The fallback feature in ncurses relies upon tic/infocmp outside the build
+# tree for generating the terminal descriptions that will be compiled into the
+# library.  If your toolchain is old, it may not handle current terminal
+# databases.  Use configure-options to point to the tools which will be used,
+# rather than the first ones found on the $PATH.
+AC_CHECK_TOOL(TIC, tic)
+AC_CHECK_TOOL(INFOCMP, infocmp)
+if test -n "$FALLBACK_LIST"
+then
+	CF_WITH_PATH_PROG(TIC,     tic,     [for fallbacks], $PATH:/usr/local/ncurses/bin)
+	CF_WITH_PATH_PROG(INFOCMP, infocmp, [for fallbacks], $PATH:/usr/local/ncurses/bin)
+	test -z "$TIC" && FALLBACK_LIST=
+	test -z "$INFOCMP" && FALLBACK_LIST=
+	if test -z "$FALLBACK_LIST"
+	then
+		AC_MSG_WARN(ignoring fallback option because tic/infocmp are not available)
+	fi
+fi
+AC_SUBST(TIC)
+AC_SUBST(INFOCMP)
+
+USE_FALLBACKS=
+test -z "$FALLBACK_LIST" && USE_FALLBACKS="#"
+AC_SUBST(FALLBACK_LIST)
+AC_SUBST(USE_FALLBACKS)
+
+AC_MSG_CHECKING(if you want modern xterm or antique)
+AC_ARG_WITH(xterm-new,
+	[  --without-xterm-new     specify if xterm terminfo should be old version],
+	[with_xterm_new=$withval],
+	[with_xterm_new=yes])
+case "$with_xterm_new" in
+(no) with_xterm_new=xterm-old;;
+(*)	 with_xterm_new=xterm-new;;
+esac
+AC_MSG_RESULT($with_xterm_new)
+WHICH_XTERM=$with_xterm_new
+AC_SUBST(WHICH_XTERM)
+
+case $host_os in
+(*linux-gnu|*cygwin|*mingw32|*msys)
+	want_xterm_kbs=DEL
+	;;
+(*)
+	want_xterm_kbs=BS
+	;;
+esac
+
+AC_MSG_CHECKING(if xterm backspace sends BS or DEL)
+AC_ARG_WITH(xterm-kbs,
+	[  --with-xterm-kbs=XXX    specify if xterm backspace sends BS or DEL],
+	[with_xterm_kbs=$withval],
+	[with_xterm_kbs=BS])
+case x$with_xterm_kbs in
+(xyes|xno|xBS|xbs|x8)
+	with_xterm_kbs=BS
+	;;
+(xDEL|xdel|x127)
+	with_xterm_kbs=DEL
+	;;
+(*)
+	with_xterm_kbs=$withval
+	;;
+esac
+AC_MSG_RESULT($with_xterm_kbs)
+XTERM_KBS=$with_xterm_kbs
+AC_SUBST(XTERM_KBS)
+
+if test "x$with_xterm_kbs" != "x$want_xterm_kbs"
+then
+	AC_MSG_WARN(expected --with-xterm-kbs=$want_xterm_kbs for $host_os)
+fi
+
+MAKE_TERMINFO=
+if test "$use_database" = no ; then
+	TERMINFO="${datadir}/terminfo"
+	MAKE_TERMINFO="#"
+else
+
+AC_MSG_CHECKING(for list of terminfo directories)
+CF_WITH_PATHLIST(terminfo-dirs,
+	[  --with-terminfo-dirs=XXX specify list of terminfo directories],
+	TERMINFO_DIRS,
+	DATADIR/terminfo,
+	${datadir}/terminfo)
+AC_MSG_RESULT($TERMINFO_DIRS)
+test -n "$TERMINFO_DIRS" && AC_DEFINE_UNQUOTED(TERMINFO_DIRS,"$TERMINFO_DIRS",[Define as needed to predefine the TERMINFO_DIR searchlist])
+
+case "x$TERMINFO" in
+x???:*)
+	AC_MSG_WARN(ignoring non-directory/file TERMINFO value)
+	unset TERMINFO
+	;;
+esac
+
+AC_MSG_CHECKING(for default terminfo directory)
+CF_WITH_PATH(default-terminfo-dir,
+	[  --with-default-terminfo-dir=DIR default terminfo directory],
+	TERMINFO,
+	DATADIR/terminfo,
+	${datadir}/terminfo)
+AC_MSG_RESULT($TERMINFO)
+AC_DEFINE_UNQUOTED(TERMINFO,"$TERMINFO",[Define to set the default terminal database path])
+
+fi
+
+AC_SUBST(TERMINFO)
+AC_SUBST(MAKE_TERMINFO)
+
+###	use option --disable-big-core to make tic run on small machines
+###	We need 4Mb, check if we can allocate 50% more than that.
+AC_MSG_CHECKING(if big-core option selected)
+AC_ARG_ENABLE(big-core,
+	[  --disable-big-core      assume machine has little memory],
+	[with_big_core=$enableval],
+	[AC_TRY_RUN([
+#include <stdlib.h>
+#include <string.h>
+int main() {
+	unsigned long n = 6000000L;
+	char *s = malloc(n);
+	if (s != 0)
+		s[0] = s[n-1] = 0;
+	${cf_cv_main_return:-return}(s == 0);
+}],
+	[with_big_core=yes],
+	[with_big_core=no],
+	[with_big_core=no])])
+AC_MSG_RESULT($with_big_core)
+test "x$with_big_core" = "xyes" && AC_DEFINE(HAVE_BIG_CORE,1,[Define to 1 if machine has ample memory for tic])
+
+### ISO C only guarantees 512-char strings, we have tables which load faster
+### when constructed using "big" strings.  More than the C compiler, the awk
+### program is a limit on most vendor UNIX systems.  Check that we can build.
+AC_MSG_CHECKING(if big-strings option selected)
+AC_ARG_ENABLE(big-strings,
+	[  --disable-big-strings   assume compiler has only standard-size strings],
+	[with_big_strings=$enableval],
+	[CF_AWK_BIG_PRINTF(12000,with_big_strings)])
+AC_MSG_RESULT($with_big_strings)
+
+USE_BIG_STRINGS=0
+test "x$with_big_strings" = "xyes" && USE_BIG_STRINGS=1
+AC_SUBST(USE_BIG_STRINGS)
+
+###	use option --enable-termcap to compile in the termcap fallback support
+AC_MSG_CHECKING(if you want termcap-fallback support)
+AC_ARG_ENABLE(termcap,
+	[  --enable-termcap        compile in termcap fallback support],
+	[with_termcap=$enableval],
+	[with_termcap=no])
+AC_MSG_RESULT($with_termcap)
+
+NCURSES_USE_TERMCAP=0
+if test "x$with_termcap" != "xyes" ; then
+	if test "$use_database" = no ; then
+		if test -z "$with_fallback" ; then
+			AC_ERROR(You have disabled the database w/o specifying fallbacks)
+		fi
+	fi
+	AC_DEFINE(PURE_TERMINFO,1,[Define to 1 if we should support only terminfo])
+else
+
+	if test "$with_ticlib" != no ; then
+		AC_ERROR(Options --with-ticlib and --enable-termcap cannot be combined)
+	fi
+
+	NCURSES_USE_TERMCAP=1
+	AC_MSG_CHECKING(for list of termcap files)
+	CF_WITH_PATHLIST(termpath,
+		[  --with-termpath=XXX     specify list of termcap files],
+		TERMPATH,
+		/etc/termcap:/usr/share/misc/termcap)
+	AC_MSG_RESULT($TERMPATH)
+	test -n "$TERMPATH" && AC_DEFINE_UNQUOTED(TERMPATH,"$TERMPATH",[Define to set the termcap searchlist])
+
+	###	use option --enable-getcap to use a hacked getcap for reading termcaps
+	AC_MSG_CHECKING(if fast termcap-loader is needed)
+	AC_ARG_ENABLE(getcap,
+		[  --enable-getcap         fast termcap load, no xrefs to terminfo],
+		[with_getcap=$enableval],
+		[with_getcap=no])
+	AC_MSG_RESULT($with_getcap)
+	test "x$with_getcap" = "xyes" && AC_DEFINE(USE_GETCAP,1,[Define to 1 to use fast termcap-loader])
+
+	AC_MSG_CHECKING(if translated termcaps will be cached in ~/.terminfo)
+	AC_ARG_ENABLE(getcap-cache,
+		[  --enable-getcap-cache   cache translated termcaps in ~/.terminfo],
+		[with_getcap_cache=$enableval],
+		[with_getcap_cache=no])
+	AC_MSG_RESULT($with_getcap_cache)
+	test "x$with_getcap_cache" = "xyes" && AC_DEFINE(USE_GETCAP_CACHE,1,[Define to 1 if translated termcap should be stored in $HOME/.terminfo])
+
+fi
+AC_SUBST(NCURSES_USE_TERMCAP)
+
+###   Use option --disable-home-terminfo to completely remove ~/.terminfo
+AC_MSG_CHECKING(if ~/.terminfo is wanted)
+AC_ARG_ENABLE(home-terminfo,
+	[  --disable-home-terminfo drop ~/.terminfo from terminfo search-path],
+	[with_home_terminfo=$enableval],
+	[with_home_terminfo=yes])
+AC_MSG_RESULT($with_home_terminfo)
+test "x$with_home_terminfo" = "xyes" && AC_DEFINE(USE_HOME_TERMINFO,1,[Define to 1 if $HOME/.terminfo feature is wanted])
+
+AC_MSG_CHECKING(if you want to permit root to use ncurses environment variables)
+AC_ARG_ENABLE(root-environ,
+	[  --disable-root-environ  restrict root use of ncurses environment variables],
+	[with_root_environ=$enableval],
+	[with_root_environ=yes])
+AC_MSG_RESULT($with_root_environ)
+test "x$with_root_environ" = xyes && AC_DEFINE(USE_ROOT_ENVIRON,1,[Define to 1 if root is allowed to use ncurses environment])
+
+AC_MSG_CHECKING(if you want to permit setuid programs to access all files)
+AC_ARG_ENABLE(root-environ,
+	[  --disable-root-access   restrict file-access when running setuid],
+	[with_root_access=$enableval],
+	[with_root_access=yes])
+AC_MSG_RESULT($with_root_access)
+test "x$with_root_access" = xyes && AC_DEFINE(USE_ROOT_ACCESS,1,[Define to 1 if setuid is allowed all file-access])
+
+###   Use option --enable-symlinks to make tic use symlinks, not hard links
+###   to reduce storage requirements for the terminfo database.
+CF_LINK_FUNCS
+
+with_links=no
+with_symlinks=no
+
+# soft links (symbolic links) are useful for some systems where hard links do
+# not work, or to make it simpler to copy terminfo trees around.
+if test "x$ac_cv_func_symlink" = xyes ; then
+	AC_MSG_CHECKING(if tic should use symbolic links)
+	AC_ARG_ENABLE(symlinks,
+	[  --enable-symlinks       make tic use symbolic links not hard links],
+	[with_symlinks=$enableval],
+	[with_symlinks=no])
+	AC_MSG_RESULT($with_symlinks)
+fi
+
+# If we have hard links and did not choose to use soft links instead, there is
+# no reason to make this choice optional - use the hard links.
+if test "$with_symlinks" = no ; then
+	AC_MSG_CHECKING(if tic should use hard links)
+	if test "x$ac_cv_func_link" = xyes ; then
+		with_links=yes
+	else
+		with_links=no
+	fi
+	AC_MSG_RESULT($with_links)
+fi
+
+test "x$with_links" = xyes && AC_DEFINE(USE_LINKS,1,[Define to 1 if hardlinks should be used in terminfo database])
+test "x$with_symlinks" = xyes && AC_DEFINE(USE_SYMLINKS,1,[Define to 1 if symbolic links should be used in terminfo database])
+
+###   use option --enable-broken-linker to force on use of broken-linker support
+CF_ENABLE_BROKEN_LINKER
+
+###   use option --enable-bsdpad to have tputs process BSD-style prefix padding
+AC_MSG_CHECKING(if tputs should process BSD-style prefix padding)
+AC_ARG_ENABLE(bsdpad,
+	[  --enable-bsdpad         recognize BSD-style prefix padding],
+	[with_bsdpad=$enableval],
+	[with_bsdpad=no])
+AC_MSG_RESULT($with_bsdpad)
+test "x$with_bsdpad" = xyes && AC_DEFINE(BSD_TPUTS,1,[Define to 1 to recognize BSD-style prefix padding])
+
+###   use option --enable-widec to turn on use of wide-character support
+NCURSES_CH_T=chtype
+NCURSES_LIBUTF8=0
+
+NEED_WCHAR_H=0
+NCURSES_MBSTATE_T=0
+NCURSES_WCHAR_T=0
+NCURSES_WINT_T=0
+
+# Check to define _XOPEN_SOURCE "automatically"
+CPPFLAGS_before_XOPEN="$CPPFLAGS"
+CF_XOPEN_SOURCE(600)
+CPPFLAGS_after_XOPEN="$CPPFLAGS"
+
+# Work around breakage on OS X
+CF_SIGWINCH
+
+# Checks for CODESET support.
+AM_LANGINFO_CODESET
+
+# use these variables to work around a defect in gcc's fixincludes.
+NCURSES_OK_WCHAR_T=
+NCURSES_OK_WINT_T=
+
+AC_MSG_CHECKING(if you want wide-character code)
+AC_ARG_ENABLE(widec,
+	[  --enable-widec          compile with wide-char/UTF-8 code],
+	[with_widec=$enableval],
+	[with_widec=no])
+AC_MSG_RESULT($with_widec)
+
+NCURSES_WCWIDTH_GRAPHICS=1
+AC_SUBST(NCURSES_WCWIDTH_GRAPHICS)
+
+if test "x$with_widec" = xyes ; then
+	if test "x$disable_lib_suffixes" = xno ; then
+		LIB_SUFFIX="w${LIB_SUFFIX}"
+	fi
+	AC_DEFINE(USE_WIDEC_SUPPORT,1,[Define to 1 to compile with wide-char/UTF-8 code])
+	AC_DEFINE(NCURSES_WIDECHAR,1,[Define to 1 to compile with wide-char/UTF-8 code])
+	case "$CPPFLAGS" in
+	(*_XOPEN_SOURCE=*)
+		;;
+	(*)
+		AC_MSG_WARN(_XOPEN_SOURCE feature test macro appears to be predefined)
+		# CPPFLAGS="$CPPFLAGS -DNCURSES_WIDECHAR"
+		CPPFLAGS_after_XOPEN="$CPPFLAGS_after_XOPEN -DNCURSES_WIDECHAR"
+		;;
+	esac
+
+	CF_CHECK_WCHAR_H
+	CF_CHECK_WCWIDTH_GRAPHICS
+	test "$cf_cv_wcwidth_graphics" = no && NCURSES_WCWIDTH_GRAPHICS=0
+
+	# with_overwrite=no
+	NCURSES_CH_T=cchar_t
+	AC_CHECK_FUNCS(putwc btowc wctob wmemchr mbtowc wctomb mblen mbrlen mbrtowc wcsrtombs mbsrtowcs wcstombs mbstowcs)
+	if test "x$ac_cv_func_putwc" != xyes ; then
+		CF_UTF8_LIB
+		if test "$cf_cv_utf8_lib" != no ; then
+			NCURSES_LIBUTF8=1
+		fi
+	fi
+	CF_WCHAR_TYPE(mbstate_t, NCURSES_MBSTATE_T)
+	CF_WCHAR_TYPE(wchar_t,   NCURSES_WCHAR_T,   NCURSES_OK_WCHAR_T)
+	CF_WCHAR_TYPE(wint_t,    NCURSES_WINT_T,    NCURSES_OK_WINT_T)
+
+	if test "$NCURSES_MBSTATE_T" != 0; then
+		AC_DEFINE(NEED_MBSTATE_T_DEF,1,[Define to 1 if we must declare mbstate_t])
+	fi
+fi
+AC_SUBST(NCURSES_CH_T)
+AC_SUBST(NCURSES_LIBUTF8)
+
+AC_SUBST(NEED_WCHAR_H)
+AC_SUBST(NCURSES_MBSTATE_T)
+AC_SUBST(NCURSES_WCHAR_T)
+AC_SUBST(NCURSES_WINT_T)
+
+AC_SUBST(NCURSES_OK_WCHAR_T)
+AC_SUBST(NCURSES_OK_WINT_T)
+
+###   use option --disable-lp64 to allow long chtype
+AC_MSG_CHECKING(whether to enable _LP64 definition in curses.h)
+AC_ARG_ENABLE(lp64,
+	[  --disable-lp64          allow chtype to be long (ignore _LP64)],
+	[with_lp64=$enableval],
+	[with_lp64=$cf_dft_with_lp64])
+AC_MSG_RESULT($with_lp64)
+
+if test "x$with_lp64" = xyes ; then
+	cf_cv_enable_lp64=1
+else
+	cf_cv_enable_lp64=0
+fi
+AC_SUBST(cf_cv_enable_lp64)
+
+CF_LARGEFILE
+
+###   use option --disable-tparm-varargs to make tparm() conform to X/Open
+AC_MSG_CHECKING(if you want tparm not to use X/Open fixed-parameter list)
+AC_ARG_ENABLE(tparm-varargs,
+	[  --disable-tparm-varargs compile tparm() without varargs interface],
+	[with_tparm_varargs=$enableval],
+	[with_tparm_varargs=yes])
+AC_MSG_RESULT($with_tparm_varargs)
+NCURSES_TPARM_VARARGS=0
+test "x$with_tparm_varargs" = xyes && NCURSES_TPARM_VARARGS=1
+AC_SUBST(NCURSES_TPARM_VARARGS)
+
+###   use option --disable-tic-depends to make libtic not explicitly depend on ncurses/ncursesw
+if test "$with_ticlib" != no ; then
+AC_MSG_CHECKING(if you want tic library to use explicit dependency on ncurses$LIB_SUFFIX library)
+AC_ARG_ENABLE(tic-depends,
+	[  --disable-tic-depends   link tic library without explicit dependency on ncurses library],
+	[with_tic_depends=$enableval],
+	[with_tic_depends=yes])
+AC_MSG_RESULT($with_tic_depends)
+else
+	with_tic_depends=no
+fi
+
+###   use option --enable-wattr-macros to enable wattr* macros in curses.h
+AC_MSG_CHECKING(if you want to enable wattr* macros)
+AC_ARG_ENABLE(wattr-macros,
+	[  --enable-wattr-macros   enable wattr* macros],
+	[with_wattr_macros=$enableval],
+	[with_wattr_macros=no])
+if [[ "x$with_wattr_macros" != xyes ]]; then
+	NCURSES_WATTR_MACROS=0
+	AC_MSG_RESULT(no)
+else
+	NCURSES_WATTR_MACROS=1
+	AC_MSG_RESULT(yes)
+fi
+AC_SUBST(NCURSES_WATTR_MACROS)
+
+CF_WITH_X11_RGB
+
+###   use option --with-bool to override bool's type
+AC_MSG_CHECKING(for type of bool)
+AC_ARG_WITH(bool,
+	[  --with-bool=TYPE        override fallback type of bool variable],
+	[NCURSES_BOOL="$withval"],
+	[NCURSES_BOOL=auto])
+AC_MSG_RESULT($NCURSES_BOOL)
+AC_SUBST(NCURSES_BOOL)
+
+AC_MSG_CHECKING(for alternate terminal capabilities file)
+AC_ARG_WITH(caps,
+	[  --with-caps=alt         compile with alternate Caps file],
+	[TERMINFO_CAPS=Caps.$withval],
+	[TERMINFO_CAPS=Caps])
+if test ! -f "${srcdir}/include/${TERMINFO_CAPS}"
+then
+	AC_MSG_WARN(file not found: "${srcdir}/include/${TERMINFO_CAPS}")
+	TERMINFO_CAPS=Caps
+fi
+AC_MSG_RESULT($TERMINFO_CAPS)
+AC_SUBST(TERMINFO_CAPS)
+
+###   use option --with-chtype to override chtype's type
+AC_MSG_CHECKING(for type of chtype)
+AC_ARG_WITH(chtype,
+	[  --with-chtype=TYPE      override type of chtype],
+	[NCURSES_CHTYPE="$withval"],
+	[NCURSES_CHTYPE=$cf_dft_chtype])
+AC_MSG_RESULT($NCURSES_CHTYPE)
+
+###   use option --with-ospeed to override ospeed's type
+AC_MSG_CHECKING(for type of ospeed)
+AC_ARG_WITH(ospeed,
+	[  --with-ospeed=TYPE      override type of ospeed variable],
+	[NCURSES_OSPEED="$withval"],
+	[NCURSES_OSPEED=short])
+AC_MSG_RESULT($NCURSES_OSPEED)
+AC_SUBST(NCURSES_OSPEED)
+
+###   use option --with-mmask-t to override mmask_t's type
+AC_MSG_CHECKING(for type of mmask_t)
+AC_ARG_WITH(mmask-t,
+	[  --with-mmask-t=TYPE     override type of mmask_t],
+	[NCURSES_MMASK_T="$withval"],
+	[NCURSES_MMASK_T=$cf_dft_mmask_t])
+AC_MSG_RESULT($NCURSES_MMASK_T)
+
+###   use option --with-ccharw-max to override CCHARW_MAX size
+AC_MSG_CHECKING(for size CCHARW_MAX)
+AC_ARG_WITH(ccharw-max,
+	[  --with-ccharw-max=XXX   override size CCHARW_MAX],
+	[NCURSES_CCHARW_MAX="$withval"],
+	[NCURSES_CCHARW_MAX=$cf_dft_ccharw_max])
+AC_MSG_RESULT($NCURSES_CCHARW_MAX)
+AC_SUBST(NCURSES_CCHARW_MAX)
+
+AC_CHECK_SIZEOF([signed char])
+if test "$ac_cv_sizeof_signed_char" = 1 ; then
+	NCURSES_SBOOL="signed char"
+else
+	NCURSES_SBOOL="char"
+fi
+AC_MSG_CHECKING(if you want to use signed Boolean array in term.h)
+AC_ARG_ENABLE(signed-char,
+	[  --enable-signed-char    compile using signed Boolean's in term.h],
+	[with_signed_char=$enableval],
+	[with_signed_char=$cf_dft_signed_char])
+AC_MSG_RESULT($with_signed_char)
+test "x$with_signed_char" != xyes && NCURSES_SBOOL="char"
+AC_SUBST(NCURSES_SBOOL)
+
+###   use option --with-tparm-arg to override tparm's argument type
+AC_MSG_CHECKING(for type of tparm args)
+AC_ARG_WITH(tparm-arg,
+	[  --with-tparm-arg=TYPE   override parameter type of tparm],
+	[NCURSES_TPARM_ARG="$withval"],
+	[NCURSES_TPARM_ARG=$cf_dft_tparm_arg])
+AC_MSG_RESULT($NCURSES_TPARM_ARG)
+AC_SUBST(NCURSES_TPARM_ARG)
+
+### Enable compiling-in rcs id's
+AC_MSG_CHECKING(if RCS identifiers should be compiled-in)
+AC_ARG_WITH(rcs-ids,
+	[  --with-rcs-ids          compile-in RCS identifiers],
+	[with_rcs_ids=$withval],
+	[with_rcs_ids=no])
+AC_MSG_RESULT($with_rcs_ids)
+test "x$with_rcs_ids" = xyes && AC_DEFINE(USE_RCS_IDS,1,[Define to 1 to compile-in RCS identifiers])
+
+###############################################################################
+CF_MAN_PAGES([ captoinfo clear infocmp infotocap reset tabs tic toe tput tset ])
+
+###############################################################################
+CF_HELP_MESSAGE(Extensions:)
+
+### Note that some functions (such as const) are normally disabled anyway.
+AC_MSG_CHECKING(if you want to build with function extensions)
+AC_ARG_ENABLE(ext-funcs,
+	[  --disable-ext-funcs     disable function-extensions],
+	[with_ext_funcs=$enableval],
+	[with_ext_funcs=yes])
+AC_MSG_RESULT($with_ext_funcs)
+if test "x$with_ext_funcs" = xyes ; then
+	NCURSES_EXT_FUNCS=1
+	AC_DEFINE(NCURSES_EXT_FUNCS,1,[Define to 1 to enable ncurses extended functions])
+	AC_DEFINE(HAVE_ASSUME_DEFAULT_COLORS,1,[Define to 1 to enable assume_default_colors() function in test-programs])
+	AC_DEFINE(HAVE_CURSES_VERSION,1,[Define to 1 to enable curses_version() function in test-programs])
+	AC_DEFINE(HAVE_HAS_KEY,1,[Define to 1 to enable has_key() function in test-programs])
+	AC_DEFINE(HAVE_RESIZETERM,1,[Define to 1 to enable resizeterm() function in test-programs])
+	AC_DEFINE(HAVE_RESIZE_TERM,1,[Define to 1 to enable resize_term() function in test-programs])
+	AC_DEFINE(HAVE_TERM_ENTRY_H,1,[Define to 1 to enable term_entry() function in test-programs])
+	AC_DEFINE(HAVE_USE_DEFAULT_COLORS,1,[Define to 1 to enable use_default_colors() function in test-programs])
+	AC_DEFINE(HAVE_USE_EXTENDED_NAMES,1,[Define to 1 to enable use_extended_names() function in test-programs])
+	AC_DEFINE(HAVE_USE_SCREEN,1,[Define to 1 to enable use_screen() function in test-programs])
+	AC_DEFINE(HAVE_USE_WINDOW,1,[Define to 1 to enable use_window() function in test-programs])
+	AC_DEFINE(HAVE_WRESIZE,1,[Define to 1 to enable wresize() function in test-programs])
+	GENERATED_EXT_FUNCS=generated
+	test "x$with_ext_funcs" = xyes || cf_dft_ext_spfuncs=no
+else
+	NCURSES_EXT_FUNCS=0
+	GENERATED_EXT_FUNCS=
+fi
+AC_SUBST(NCURSES_EXT_FUNCS)
+AC_SUBST(GENERATED_EXT_FUNCS)
+
+AC_MSG_CHECKING(if you want to build with SCREEN extensions)
+AC_ARG_ENABLE(sp-funcs,
+	[  --enable-sp-funcs       enable SCREEN-extensions],
+	[with_sp_funcs=$enableval],
+	[with_sp_funcs=$cf_dft_ext_spfuncs])
+AC_MSG_RESULT($with_sp_funcs)
+if test "x$with_sp_funcs" = xyes ; then
+	NCURSES_SP_FUNCS=1
+	AC_DEFINE(NCURSES_SP_FUNCS,1,[Define to 1 to enable SCREEN-extensions])
+	AC_DEFINE(HAVE_TPUTS_SP,1,[Define to 1 to enable tputs_sp() function in test-programs])
+	GENERATED_SP_FUNCS=generated
+else
+	NCURSES_SP_FUNCS=0
+	GENERATED_SP_FUNCS=
+fi
+AC_SUBST(NCURSES_SP_FUNCS)
+AC_SUBST(GENERATED_SP_FUNCS)
+
+AC_MSG_CHECKING(if you want to build with terminal-driver)
+AC_ARG_ENABLE(term-driver,
+	[  --enable-term-driver    enable terminal-driver],
+	[with_term_driver=$enableval],
+	[with_term_driver=no])
+AC_MSG_RESULT($with_term_driver)
+if test "x$with_term_driver" = xyes ; then
+	AC_DEFINE(USE_TERM_DRIVER,1,[Define to 1 to enable terminal-driver])
+	if test "x$with_termlib" != xno ; then
+		AC_MSG_ERROR(The term-driver option conflicts with the termlib option)
+	fi
+	if test "x$with_sp_funcs" != xyes ; then
+		AC_MSG_ERROR(The term-driver option relies upon sp-funcs)
+	fi
+fi
+
+###   use option --enable-const to turn on use of const beyond that in XSI.
+AC_MSG_CHECKING(for extended use of const keyword)
+AC_ARG_ENABLE(const,
+	[  --enable-const          compile with extra/non-standard const],
+	[with_ext_const=$enableval],
+	[with_ext_const=$cf_dft_ext_const])
+AC_MSG_RESULT($with_ext_const)
+NCURSES_CONST='/*nothing*/'
+if test "x$with_ext_const" = xyes ; then
+	NCURSES_CONST=const
+fi
+AC_SUBST(NCURSES_CONST)
+
+###   use option --enable-ext-colors to turn on use of colors beyond 16.
+AC_MSG_CHECKING(if you want to use extended colors)
+AC_ARG_ENABLE(ext-colors,
+	[  --enable-ext-colors     compile for 256-color support],
+	[with_ext_colors=$enableval],
+	[with_ext_colors=$cf_dft_ext_colors])
+AC_MSG_RESULT($with_ext_colors)
+NCURSES_EXT_COLORS=0
+if test "x$with_ext_colors" = xyes ; then
+	if test "x$with_widec" != xyes ; then
+		AC_MSG_WARN(This option applies only to wide-character library)
+	else
+		# cannot be ABI 5 since it changes sizeof(cchar_t)
+		CF_NCURSES_ABI_6
+		NCURSES_EXT_COLORS=1
+		AC_DEFINE(NCURSES_EXT_COLORS,1,[Define to 1 to compile for 256-color support])
+		AC_DEFINE(HAVE_ALLOC_PAIR,1,[Define to 1 to enable alloc_pair() function])
+		AC_DEFINE(HAVE_INIT_EXTENDED_COLOR,1,[Define to 1 to enable init_extended_color() function in test-programs])
+		AC_DEFINE(HAVE_RESET_COLOR_PAIRS,1,[Define to 1 to enable reset_color_pairs() function in test-programs])
+	fi
+fi
+AC_SUBST(NCURSES_EXT_COLORS)
+
+###   use option --enable-ext-mouse to modify coding to support 5-button mice
+AC_MSG_CHECKING(if you want to use extended mouse encoding)
+AC_ARG_ENABLE(ext-mouse,
+	[  --enable-ext-mouse      compile for extended mouse-encoding],
+	[with_ext_mouse=$enableval],
+	[with_ext_mouse=$cf_dft_ext_mouse])
+AC_MSG_RESULT($with_ext_mouse)
+if test "x$with_ext_mouse" = xyes ; then
+	CF_NCURSES_ABI_6
+fi
+
+case $cf_cv_abi_version in
+(5)
+	NCURSES_MOUSE_VERSION=1
+	;;
+(6)
+	NCURSES_MOUSE_VERSION=2
+	;;
+([[789]])
+	NCURSES_MOUSE_VERSION=3
+	;;
+esac
+
+AC_SUBST(NCURSES_MOUSE_VERSION)
+
+###   use option --enable-ext-putwin to turn on extended screendumps
+AC_MSG_CHECKING(if you want to use extended putwin/screendump)
+AC_ARG_ENABLE(ext-putwin,
+	[  --enable-ext-putwin     compile with extended putwin/screendump],
+	[with_ext_putwin=$enableval],
+	[with_ext_putwin=$cf_dft_ext_putwin])
+AC_MSG_RESULT($with_ext_putwin)
+if test "x$with_ext_putwin" = xyes ; then
+	AC_DEFINE(NCURSES_EXT_PUTWIN,1,[Define to 1 to compile with extended putwin/screendump])
+fi
+
+AC_MSG_CHECKING(if you want \$NCURSES_NO_PADDING code)
+AC_ARG_ENABLE(no-padding,
+	[  --enable-no-padding     compile with $NCURSES_NO_PADDING code],
+	[with_no_padding=$enableval],
+	[with_no_padding=$with_ext_funcs])
+AC_MSG_RESULT($with_no_padding)
+test "x$with_no_padding" = xyes && AC_DEFINE(NCURSES_NO_PADDING,1,[Define to 1 to compile with $NCURSES_NO_PADDING code])
+
+###   use option --enable-sigwinch to turn on use of SIGWINCH logic
+AC_MSG_CHECKING(if you want SIGWINCH handler)
+AC_ARG_ENABLE(sigwinch,
+	[  --enable-sigwinch       compile with SIGWINCH handler],
+	[with_sigwinch=$enableval],
+	[with_sigwinch=$with_ext_funcs])
+AC_MSG_RESULT($with_sigwinch)
+test "x$with_sigwinch" = xyes && AC_DEFINE(USE_SIGWINCH,1,[Define to 1 to compile with SIGWINCH handler])
+
+###   use option --enable-tcap-names to allow user to define new capabilities
+AC_MSG_CHECKING(if you want user-definable terminal capabilities like termcap)
+AC_ARG_ENABLE(tcap-names,
+	[  --enable-tcap-names     compile with user-definable terminal capabilities],
+	[with_tcap_names=$enableval],
+	[with_tcap_names=$with_ext_funcs])
+AC_MSG_RESULT($with_tcap_names)
+NCURSES_XNAMES=0
+test "x$with_tcap_names" = xyes && NCURSES_XNAMES=1
+AC_SUBST(NCURSES_XNAMES)
+
+##############################################################################
+CF_HELP_MESSAGE(Reentrant Code:)
+CF_WITH_PTHREAD
+
+if test "x$with_pthread" != xno; then
+	AC_CHECK_FUNC(pthread_kill,[
+		AC_MSG_CHECKING(if you want to allow EINTR in wgetch with pthreads)
+		AC_ARG_ENABLE(pthreads-eintr,
+			[  --enable-pthreads-eintr enable EINTR in wgetch with pthreads],
+			[use_pthreads_eintr=$enableval],
+			[use_pthreads_eintr=no])
+		AC_MSG_RESULT($use_pthreads_eintr)
+		if test "x$use_pthreads_eintr" = xyes ; then
+			AC_DEFINE(USE_PTHREADS_EINTR,1,[Define to 1 to enable EINTR in wgetch with pthreads])
+		fi])
+
+	AC_MSG_CHECKING(if you want to use weak-symbols for pthreads)
+	AC_ARG_ENABLE(weak-symbols,
+		[  --enable-weak-symbols   enable weak-symbols for pthreads],
+		[use_weak_symbols=$enableval],
+		[use_weak_symbols=no])
+	AC_MSG_RESULT($use_weak_symbols)
+	if test "x$use_weak_symbols" = xyes ; then
+		CF_WEAK_SYMBOLS
+	else
+		cf_cv_weak_symbols=no
+	fi
+
+	if test "x$cf_cv_weak_symbols" = xyes ; then
+		AC_DEFINE(USE_WEAK_SYMBOLS,1,[Define to 1 to enable weak-symbols for pthreads])
+	fi
+fi
+
+PTHREAD=
+if test "x$with_pthread" = "xyes" ; then
+	AC_DEFINE(USE_PTHREADS,1,[Define to 1 to use pthreads feature])
+	enable_reentrant=yes
+	if test "x$cf_cv_weak_symbols" = xyes ; then
+		PTHREAD=-lpthread
+		CF_ADD_LIB(pthread,PRIVATE_LIBS)
+	fi
+fi
+AC_SUBST(PTHREAD)
+
+# Reentrant code has to be opaque; there's little advantage to making ncurses
+# opaque outside of that, so there is no --enable-opaque option.  We can use
+# this option without --with-pthreads, but this will be always set for
+# pthreads.
+AC_MSG_CHECKING(if you want reentrant code)
+AC_ARG_ENABLE(reentrant,
+	[  --enable-reentrant      compile with reentrant code],
+	[with_reentrant=$enableval],
+	[with_reentrant=no])
+AC_MSG_RESULT($with_reentrant)
+if test "x$with_reentrant" = xyes ; then
+	cf_cv_enable_reentrant=1
+	cf_cv_enable_opaque="NCURSES_INTERNALS"
+	NCURSES_SIZE_T=int
+	if test "x$cf_cv_weak_symbols" = xyes ; then
+		CF_REMOVE_LIB(LIBS,$LIBS,pthread)
+		CF_ADD_LIB(pthread,TEST_LIBS)
+		CF_ADD_LIB(pthread,TEST_LIBS2)
+		CF_ADD_LIB(pthread,PRIVATE_LIBS)
+	else
+		# when not using weak symbols but with_reentrant,
+		# add 't' to the library suffix on all platforms
+		# except cygwin, where we only do that if ALSO
+		# compiling with full thread support.
+		case "$host" in
+		(*cygwin* | *msys*)
+			if test "$with_pthread" = "yes" ; then
+				if test "x$disable_lib_suffixes" = "xno" ; then
+					LIB_SUFFIX="t${LIB_SUFFIX}"
+				fi
+			fi ;;
+		(*)
+			if test "x$disable_lib_suffixes" = "xno" ; then
+				LIB_SUFFIX="t${LIB_SUFFIX}"
+			fi
+			;;
+		esac
+	fi
+	AC_DEFINE(USE_REENTRANT,1,[Define to 1 to use reentrant feature])
+	CF_NCURSES_ABI_6
+else
+	cf_cv_enable_reentrant=0
+	cf_cv_enable_opaque="NCURSES_OPAQUE"
+	NCURSES_SIZE_T=$cf_dft_ordinate_type
+fi
+AC_SUBST(cf_cv_enable_reentrant)
+AC_SUBST(cf_cv_enable_opaque)
+
+AC_SUBST(NCURSES_SIZE_T)
+
+AC_MSG_CHECKING(if you want opaque curses-library structures)
+CF_ARG_ENABLE(opaque-curses,
+	[  --enable-opaque-curses  make curses WINDOW, etc., "opaque"],
+	[enable_opaque_curses=yes],[
+	 test "$cf_cv_enable_reentrant" = 1 && enable_opaque_curses=yes
+	 test "$cf_cv_enable_reentrant" = 1 || enable_opaque_curses=$cf_dft_opaque_curses
+	])
+AC_MSG_RESULT($enable_opaque_curses)
+
+test "$cf_cv_enable_reentrant" = 1 && \
+test "$enable_opaque_curses" = no && \
+AC_MSG_ERROR(reentrant configuration requires opaque library)
+
+AC_MSG_CHECKING(if you want opaque form-library structures)
+AC_ARG_ENABLE(opaque-form,
+	[  --enable-opaque-form    make form-library structures "opaque"],
+	[enable_opaque_form=yes],[enable_opaque_form=no])
+AC_MSG_RESULT($enable_opaque_form)
+
+AC_MSG_CHECKING(if you want opaque menu-library structures)
+AC_ARG_ENABLE(opaque-menu,
+	[  --enable-opaque-menu    make menu-library structures "opaque"],
+	[enable_opaque_menu=yes],[enable_opaque_menu=no])
+AC_MSG_RESULT($enable_opaque_menu)
+
+AC_MSG_CHECKING(if you want opaque panel-library structures)
+AC_ARG_ENABLE(opaque-panel,
+	[  --enable-opaque-panel   make panel-library structures "opaque"],
+	[enable_opaque_panel=yes],[enable_opaque_panel=no])
+AC_MSG_RESULT($enable_opaque_panel)
+
+NCURSES_OPAQUE=0;		test "$enable_opaque_curses" = yes && NCURSES_OPAQUE=1
+NCURSES_OPAQUE_FORM=0;	test "$enable_opaque_form"   = yes && NCURSES_OPAQUE_FORM=1
+NCURSES_OPAQUE_MENU=0;	test "$enable_opaque_menu"   = yes && NCURSES_OPAQUE_MENU=1
+NCURSES_OPAQUE_PANEL=0;	test "$enable_opaque_panel"  = yes && NCURSES_OPAQUE_PANEL=1
+
+AC_SUBST(NCURSES_OPAQUE)
+AC_SUBST(NCURSES_OPAQUE_FORM)
+AC_SUBST(NCURSES_OPAQUE_MENU)
+AC_SUBST(NCURSES_OPAQUE_PANEL)
+
+### Allow using a different wrap-prefix
+if test "$cf_cv_enable_reentrant" != 0 || test "$BROKEN_LINKER" = 1 ; then
+	AC_MSG_CHECKING(for prefix used to wrap public variables)
+	AC_ARG_WITH(wrap-prefix,
+		[  --with-wrap-prefix=XXX  override prefix used for public variables],
+		[NCURSES_WRAP_PREFIX=$withval],
+		[NCURSES_WRAP_PREFIX=_nc_])
+	AC_MSG_RESULT($NCURSES_WRAP_PREFIX)
+else
+	NCURSES_WRAP_PREFIX=_nc_
+fi
+AC_SUBST(NCURSES_WRAP_PREFIX)
+AC_DEFINE_UNQUOTED(NCURSES_WRAP_PREFIX,"$NCURSES_WRAP_PREFIX",[Define to override _nc_ prefix])
+
+###############################################################################
+# These options are relatively safe to experiment with.
+CF_HELP_MESSAGE(Development Code:)
+AC_MSG_CHECKING(if you want all development code)
+AC_ARG_WITH(develop,
+	[  --without-develop       disable development options],
+	[with_develop=$withval],
+	[with_develop=no])
+AC_MSG_RESULT($with_develop)
+
+###   use option --enable-hard-tabs to turn on use of hard-tabs optimize
+AC_MSG_CHECKING(if you want hard-tabs code)
+AC_ARG_ENABLE(hard-tabs,
+	[  --enable-hard-tabs      compile with hard-tabs code],,
+	[enable_hard_tabs=$with_develop])
+AC_MSG_RESULT($enable_hard_tabs)
+test "x$enable_hard_tabs" = xyes && AC_DEFINE(USE_HARD_TABS,1,[Define to 1 to compile with hard-tabs code])
+
+###   use option --enable-xmc-glitch to turn on use of magic-cookie optimize
+AC_MSG_CHECKING(if you want limited support for xmc)
+AC_ARG_ENABLE(xmc-glitch,
+	[  --enable-xmc-glitch     compile with support for xmc (magic-cookie)],,
+	[enable_xmc_glitch=$with_develop])
+AC_MSG_RESULT($enable_xmc_glitch)
+test "x$enable_xmc_glitch" = xyes && AC_DEFINE(USE_XMC_SUPPORT,1,[Define to 1 to compile with support for xmc (magic-cookie)])
+
+###############################################################################
+# These are just experimental, probably should not be in a package:
+CF_HELP_MESSAGE(Experimental Code:)
+
+AC_MSG_CHECKING(if you do not want to assume colors are white-on-black)
+AC_ARG_ENABLE(assumed-color,
+	[  --disable-assumed-color do not assume anything about default-colors],
+	[with_assumed_color=$enableval],
+	[with_assumed_color=yes])
+AC_MSG_RESULT($with_assumed_color)
+test "x$with_assumed_color" = xyes && AC_DEFINE(USE_ASSUMED_COLOR,1,[Define to 1 to assume things about default-colors])
+
+###   use option --enable-hashmap to turn on use of hashmap scrolling logic
+AC_MSG_CHECKING(if you want hashmap scrolling-optimization code)
+AC_ARG_ENABLE(hashmap,
+	[  --disable-hashmap       compile without hashmap scrolling-optimization],
+	[with_hashmap=$enableval],
+	[with_hashmap=yes])
+AC_MSG_RESULT($with_hashmap)
+test "x$with_hashmap" = xyes && AC_DEFINE(USE_HASHMAP,1,[Define to 1 to compile with hashmap scrolling-optimization])
+
+###   use option --enable-colorfgbg to turn on use of $COLORFGBG environment
+AC_MSG_CHECKING(if you want colorfgbg code)
+AC_ARG_ENABLE(colorfgbg,
+	[  --enable-colorfgbg      compile-in experimental $COLORFGBG code],
+	[with_colorfgbg=$enableval],
+	[with_colorfgbg=no])
+AC_MSG_RESULT($with_colorfgbg)
+test "x$with_colorfgbg" = xyes && AC_DEFINE(USE_COLORFGBG,1,[Define to 1 to compile-in experimental $COLORFGBG code])
+
+###   use option --enable-fvisibility to turn on use of gcc-specific feature
+AC_MSG_CHECKING(if you want to use gcc -fvisibility option)
+AC_ARG_ENABLE(fvisibility,
+	[  --enable-fvisibility    compile with -fvisibility=hidden],
+	[cf_with_fvisibility=$enableval],
+	[cf_with_fvisibility=no])
+AC_MSG_RESULT($cf_with_fvisibility)
+
+NCURSES_IMPEXP=
+NCURSES_CXX_IMPEXP=
+if test "x$cf_with_fvisibility" = xyes; then
+	CF_CHECK_FVISIBILITY($CC,CFLAGS,cf_cv_fvisibility_hidden)
+	if test "x$cf_cv_fvisibility_hidden" = xyes
+	then
+		CF_ADD_CFLAGS([-fvisibility=hidden])
+		NCURSES_IMPEXP="__attribute__ ((visibility(\"default\")))"
+	fi
+	if test -n "$CXX"
+	then
+		AC_LANG_PUSH(C++)
+		CF_CHECK_FVISIBILITY($CXX,CXXFLAGS,cf_cv_fvisibility_hidden2)
+		if test "x$cf_cv_fvisibility_hidden2" = xyes
+		then
+			CF_ADD_CXXFLAGS([-fvisibility=hidden])
+			NCURSES_CXX_IMPEXP="__attribute__ ((visibility(\"default\")))"
+		fi
+		AC_LANG_POP
+	fi
+fi
+AC_SUBST(NCURSES_IMPEXP)
+AC_SUBST(NCURSES_CXX_IMPEXP)
+
+###   use option --enable-interop to turn on use of bindings used for interop
+AC_MSG_CHECKING(if you want interop bindings)
+AC_ARG_ENABLE(interop,
+	[  --enable-interop        compile-in interop bindings],
+	[with_exp_interop=$enableval],
+	[with_exp_interop=$cf_dft_interop])
+AC_MSG_RESULT($with_exp_interop)
+
+NCURSES_INTEROP_FUNCS=0
+test "x$with_exp_interop" = xyes && NCURSES_INTEROP_FUNCS=1
+AC_SUBST(NCURSES_INTEROP_FUNCS)
+
+
+AC_MSG_CHECKING(if you want experimental safe-sprintf code)
+AC_ARG_ENABLE(safe-sprintf,
+	[  --enable-safe-sprintf   compile with experimental safe-sprintf code],
+	[with_safe_sprintf=$enableval],
+	[with_safe_sprintf=no])
+AC_MSG_RESULT($with_safe_sprintf)
+
+###   use option --disable-scroll-hints to turn off use of scroll-hints scrolling logic
+# when hashmap is used scroll hints are useless
+if test "$with_hashmap" = no ; then
+AC_MSG_CHECKING(if you want to experiment without scrolling-hints code)
+AC_ARG_ENABLE(scroll-hints,
+	[  --disable-scroll-hints  compile without scroll-hints code],
+	[with_scroll_hints=$enableval],
+	[with_scroll_hints=yes])
+AC_MSG_RESULT($with_scroll_hints)
+test "x$with_scroll_hints" = xyes && AC_DEFINE(USE_SCROLL_HINTS,1,[Define to 1 to compile without scroll-hints code])
+fi
+
+AC_MSG_CHECKING(if you want wgetch-events code)
+AC_ARG_ENABLE(wgetch-events,
+	[  --enable-wgetch-events  compile with wgetch-events code],
+	[with_wgetch_events=$enableval],
+	[with_wgetch_events=no])
+AC_MSG_RESULT($with_wgetch_events)
+if test "x$with_wgetch_events" = xyes ; then
+	AC_DEFINE(NCURSES_WGETCH_EVENTS,1,[Define to 1 to compile with wgetch-events code])
+	NCURSES_WGETCH_EVENTS=1
+else
+	NCURSES_WGETCH_EVENTS=0
+fi
+AC_SUBST(NCURSES_WGETCH_EVENTS)
+
+case "$cf_cv_system_name" in
+(*mingw32*|*mingw64*|*-msvc*)
+	AC_MSG_CHECKING(if you want experimental-Windows driver)
+	AC_ARG_ENABLE(exp-win32,
+		[  --enable-exp-win32      compile with experimental-Windows driver],
+		[with_exp_win32=$enableval],
+		[with_exp_win32=no])
+	AC_MSG_RESULT($with_exp_win32)
+	if test "x$with_exp_win32" = xyes
+	then
+		AC_DEFINE(EXP_WIN32_DRIVER,1,[Define to 1 to compile with experimental win32 driver])
+		EXP_WIN32_DRIVER=1
+		INTERNALS_HDR='[$](INCDIR)/nc_win32.h'
+	else
+		INTERNALS_HDR='[$](INCDIR)/nc_mingw.h'
+		EXP_WIN32_DRIVER=0
+	fi
+	;;
+(*)
+	EXP_WIN32_DRIVER=0
+	INTERNALS_HDR=
+	;;
+esac
+AC_SUBST(EXP_WIN32_DRIVER)
+AC_SUBST(INTERNALS_HDR)
+
+###############################################################################
+CF_HELP_MESSAGE(Testing/development Options:)
+
+###	use option --disable-echo to suppress full display compiling commands
+CF_DISABLE_ECHO
+if test "x$enable_echo" = xyes; then
+	ECHO_LINK=
+else
+	ECHO_LINK='@ echo linking $@ ... ;'
+	test -n "$LIBTOOL" && LIBTOOL="$LIBTOOL --silent"
+	test -n "$LIBTOOL_CXX" && LIBTOOL_CXX="$LIBTOOL_CXX --silent"
+fi
+AC_SUBST(ECHO_LINK)
+
+# --disable-stripping is used for debugging
+CF_INSTALL_OPTS
+
+# If we're avoiding relinking of shared libraries during install, that is to
+# avoid modifying the build-tree.  For the same reason, avoid doing ranlib if
+# the install program has "-p" (for preserving timestamps).
+cf_cv_do_reranlib=yes
+if test "x$cf_cv_install_p" = xyes
+then
+	if test "x$cf_cv_do_relink" != xyes
+	then
+		cf_cv_do_reranlib=no
+		INSTALL_OPT_P="-p"
+		INSTALL_LIB="$INSTALL_LIB $INSTALL_OPT_P"
+	fi
+fi
+AC_SUBST(INSTALL_OPT_P)
+
+###	use option --enable-warnings to turn on all gcc warnings
+CF_ENABLE_WARNINGS(Wno-unknown-pragmas Wswitch-enum,yes)
+
+if test "x$enable_warnings" = "xyes"; then
+ 	CF_ADD_ADAFLAGS(-gnatwa -gnatyg)
+	if test "x$cf_with_cxx" = xyes ; then
+		CF_GXX_WARNINGS(Wno-unused)
+	fi
+fi
+CF_ENABLE_STRING_HACKS
+
+###	use option --enable-assertions to turn on generation of assertion code
+AC_MSG_CHECKING(if you want to enable runtime assertions)
+AC_ARG_ENABLE(assertions,
+	[  --enable-assertions     test: turn on generation of assertion code],
+	[with_assertions=$enableval],
+	[with_assertions=no])
+AC_MSG_RESULT($with_assertions)
+if test -n "$GCC"
+then
+	if test "$with_assertions" = no
+	then
+		CPPFLAGS="$CPPFLAGS -DNDEBUG"
+	else
+		CF_ADD_ADAFLAGS(-gnata)
+	fi
+fi
+
+###	use option --disable-leaks to suppress "permanent" leaks, for testing
+CF_DISABLE_LEAKS
+AC_DEFINE(HAVE_NC_ALLOC_H,1,[Define to 1 if we have nc_alloc.h header])
+
+###	use option --enable-expanded to generate certain macros as functions
+AC_ARG_ENABLE(expanded,
+	[  --enable-expanded       test: generate functions for certain macros],
+	[test "x$enableval" = xyes && AC_DEFINE(NCURSES_EXPANDED,1,[Define to 1 to generate functions for certain macros])])
+
+###	use option --disable-macros to suppress macros in favor of functions
+AC_ARG_ENABLE(macros,
+	[  --disable-macros        test: use functions rather than macros],
+	[test "$enableval" = no && AC_DEFINE(NCURSES_NOMACROS,1,[Define to 1 to use functions rather than macros])])
+
+# Normally we only add trace() to the debug-library.  Allow this to be
+# extended to all models of the ncurses library:
+cf_all_traces=no
+case "$CFLAGS $CPPFLAGS" in
+(*-DTRACE*)
+	cf_all_traces=yes
+	;;
+esac
+
+AC_MSG_CHECKING(whether to add trace feature to all models)
+AC_ARG_WITH(trace,
+[  --with-trace            test: add trace() function to all models of ncurses],
+[cf_with_trace=$withval],
+[cf_with_trace=$cf_all_traces])
+AC_MSG_RESULT($cf_with_trace)
+
+if test "x$cf_with_trace" = xyes ; then
+	LIB_TRACING=all
+	ADA_TRACE=TRUE
+	CF_ADD_CFLAGS(-DTRACE)
+	AC_DEFINE(HAVE__TRACEF,1,[Define to 1 if we have _tracef function])
+else
+	LIB_TRACING=DEBUG
+	ADA_TRACE=FALSE
+fi
+
+AC_SUBST(ADA_TRACE)
+
+CF_DISABLE_GNAT_PROJECTS
+
+###	Checks for libraries.
+case "$cf_cv_system_name" in
+(*mingw32*|*mingw64*)
+	# Note: WINVER may be a problem with Windows 10
+	if test "x$with_exp_win32" = xyes ; then
+		CPPFLAGS="$CPPFLAGS -DWINVER=0x0600 -DWIN32_LEAN_AND_MEAN"
+	else
+		CPPFLAGS="$CPPFLAGS -DWINVER=0x0501 -DWIN32_LEAN_AND_MEAN"
+	fi
+	CF_CHECK_LIBSSP
+	;;
+(*)
+AC_CHECK_FUNC(gettimeofday,
+	AC_DEFINE(HAVE_GETTIMEOFDAY,1,[Define to 1 if we have gettimeofday function]),[
+
+AC_CHECK_LIB(bsd, gettimeofday,
+	AC_DEFINE(HAVE_GETTIMEOFDAY,1,[Define to 1 if we have gettimeofday function])
+	CF_ADD_LIB(bsd))])dnl CLIX: bzero, select, gettimeofday
+	;;
+esac
+
+CF_MATH_LIB(MATH_LIB,pow(sin(x),x))
+AC_SUBST(MATH_LIB)
+
+###	Checks for header files.
+AC_STDC_HEADERS
+AC_HEADER_DIRENT
+AC_HEADER_TIME
+CF_REGEX
+
+dnl These are some other potentially nonportable headers.
+AC_CHECK_HEADERS( \
+fcntl.h \
+getopt.h \
+limits.h \
+locale.h \
+math.h \
+poll.h \
+sys/ioctl.h \
+sys/param.h \
+sys/poll.h \
+sys/select.h \
+sys/time.h \
+sys/times.h \
+unistd.h \
+wctype.h \
+)
+
+CF_GETOPT_HEADER
+
+CF_CHECK_ENVIRON(environ)
+CF_CHECK_GETENV
+if test "x$cf_cv_consistent_getenv" = xno && \
+	test "x$cf_with_trace" = xyes
+then
+	AC_MSG_WARN(The NCURSES_TRACE environment variable is not supported with this configuration)
+fi
+
+CF_SYS_TIME_SELECT
+
+###	checks for compiler characteristics
+AC_LANG_C
+AC_C_CONST
+CF_C_INLINE(NCURSES_INLINE,1200)
+CF_SIG_ATOMIC_T
+
+if test "$NCURSES_CHTYPE" = auto ; then
+	CF_TYPEOF_CHTYPE
+else
+	cf_cv_typeof_chtype=$NCURSES_CHTYPE
+fi
+test "$cf_cv_typeof_chtype" = unsigned && cf_cv_typeof_chtype=""
+AC_SUBST(cf_cv_typeof_chtype)
+
+CF_UNSIGNED_LITERALS
+cf_cv_1UL="1"
+test ".$cf_cv_unsigned_literals" = .yes && cf_cv_1UL="${cf_cv_1UL}U"
+test ".$cf_cv_typeof_chtype"    = .long && cf_cv_1UL="${cf_cv_1UL}L"
+AC_SUBST(cf_cv_1UL)
+
+if test "$NCURSES_MMASK_T" = auto ; then
+	cf_cv_typeof_mmask_t=long
+else
+	cf_cv_typeof_mmask_t=$NCURSES_MMASK_T
+fi
+test "$cf_cv_typeof_mmask_t" = unsigned && cf_cv_typeof_mmask_t=""
+AC_SUBST(cf_cv_typeof_mmask_t)
+
+###	Checks for external-data
+CF_ERRNO
+CF_LINK_DATAONLY
+
+###	Checks for library functions.
+AC_CHECK_FUNCS( \
+fpathconf \
+getcwd \
+getegid \
+geteuid \
+getopt \
+issetugid \
+localeconv \
+poll \
+putenv \
+remove \
+select \
+setbuf \
+setbuffer \
+setenv \
+setfsuid \
+setvbuf \
+sigaction \
+sigvec \
+snprintf \
+strdup \
+strstr \
+sysconf \
+tcgetpgrp \
+times \
+tsearch \
+vsnprintf \
+)
+
+CF_FUNC_GETTTYNAM
+
+if test "x$ac_cv_func_getopt" = xno && \
+   test "x$cf_with_progs$cf_with_tests" != xnono; then
+	AC_MSG_ERROR(getopt is required for building programs)
+fi
+
+if test "x$with_safe_sprintf" = xyes
+then
+	if test "x$ac_cv_func_vsnprintf" = xyes
+	then
+		AC_MSG_WARN(will use vsnprintf instead of safe-sprintf option)
+	else
+		AC_DEFINE(USE_SAFE_SPRINTF,1,[Define to 1 to compile with experimental safe-sprintf code])
+	fi
+fi
+
+if test "x$with_getcap" = "xyes" ; then
+	CF_CGETENT
+fi
+
+CF_ISASCII
+CF_STRUCT_SIGACTION
+CF_FUNC_NANOSLEEP
+CF_FUNC_TERMIOS
+CF_FUNC_VSSCANF
+CF_MKSTEMP
+
+# setup for prototype of fallback for vsscanf()
+CF_SUBST_IF(["$cf_cv_func_vsscanf" = vsscanf], HAVE_VSSCANF, 1, 0)
+
+dnl FIXME (may need this) AC_SYS_RESTARTABLE_SYSCALLS
+if test "x$cross_compiling" = xyes ; then
+	AC_MSG_WARN(cross compiling: assume setvbuf params not reversed)
+else
+	AC_FUNC_SETVBUF_REVERSED
+fi
+AC_CHECK_TYPE(intptr_t, long)
+AC_CHECK_TYPE(ssize_t, int)
+CF_TYPE_SIGACTION
+CF_SIZECHANGE
+CF_FUNC_MEMMOVE
+CF_FUNC_POLL
+CF_VA_COPY
+AC_FUNC_VFORK
+CF_FOPEN_BIN_R
+
+# special check for test/ditto.c
+CF_FUNC_OPENPTY
+if test "$cf_cv_func_openpty" != no ; then
+	AC_DEFINE_UNQUOTED(USE_OPENPTY_HEADER,<$cf_cv_func_openpty>,[Define to actual header for openpty function])
+	AC_DEFINE(USE_XTERM_PTY,1,[Define to 1 if we should assume xterm pseudoterminal interface])
+	if test "x$cf_cv_lib_util" = xyes ; then
+		CF_ADD_LIB(util,TEST_LIBS)
+	fi
+fi
+AC_SUBST(TEST_LIBS)
+AC_SUBST(TEST_LIBS2)
+
+if test "$with_hashed_db" != no ; then
+	AC_DEFINE(USE_HASHED_DB,1,[Define to 1 if we should build terminfo in hashed database])
+	CF_HASHED_DB($with_hashed_db)
+fi
+
+dnl We'll do our own -g libraries, unless the user's overridden via $CFLAGS
+if test -z "$cf_user_CFLAGS" && test "$enable_leaks" = yes ; then
+	CF_STRIP_G_OPT(CFLAGS)
+	CF_STRIP_G_OPT(CXXFLAGS)
+fi
+
+# Just in case, check if the C compiler has a bool type.
+CF_BOOL_DECL(cf_cv_cc_bool_type)
+
+# Check for C++ compiler characteristics (and ensure that it's there!)
+if test -n "$CXX" ; then
+	AC_LANG_CPLUSPLUS
+	CF_STDCPP_LIBRARY
+	CF_PROG_CC_C_O(CXX,[$CXXFLAGS $CPPFLAGS])
+
+	case "$GXX_VERSION" in
+	(1.*|2.[[0-6]]*|[[1-9]][[0-9]].*)
+		cf_cxx_library=yes
+		;;
+	(*-2.7*|2.7*)
+		CF_GPP_LIBRARY
+		;;
+	(*)
+		cf_cxx_library=no
+		;;
+	esac
+
+	AC_CHECK_HEADERS(typeinfo)
+	CF_CXX_IOSTREAM_NAMESPACE
+	CF_BOOL_DECL
+	CF_BOOL_SIZE
+	CF_ETIP_DEFINES
+	CF_CPP_OVERRIDE
+	CF_CPP_PARAM_INIT
+	CF_CPP_STATIC_CAST
+	CF_CXX_AR_FLAGS
+else
+	cf_cxx_library=no
+	cf_cv_builtin_bool=1
+
+	# Just because we are not configuring against C++ right now does not
+	# mean that a user will not want to use C++.  Some distributors disable
+	# the C++ portion of this configuration as a shortcut (or just to avoid
+	# compiling the demo in the c++ directory).  So we need a reasonable
+	# default for the 'bool' type.
+	#
+	# Caveat: since the storage of the bool type is not standardized, it
+	# may change.
+
+	if test "$NCURSES_BOOL" != auto ; then
+		cf_cv_type_of_bool=$NCURSES_BOOL
+		cf_cv_header_stdbool_h=0
+	else
+		if test "$cf_cv_header_stdbool_h" = 1 ; then
+			CF_BOOL_SIZE
+		else
+			AC_MSG_CHECKING(for fallback type of bool)
+			case "$host_cpu" in
+			(i?86)	cf_cv_type_of_bool=char	;;
+			(*)	cf_cv_type_of_bool=int	;;
+			esac
+			AC_MSG_RESULT($cf_cv_type_of_bool)
+		fi
+	fi
+fi
+AC_SUBST(CXXLIBS)
+
+# If the C compiler did not declare bool, and we did not determine that the C++
+# compiler does not declare bool, turn on an ifdef in curses.h that makes the
+# ncurses library use the same type as C++ bool.  Note that this allows one to
+# specify the type of bool in a configure-script option and postpone
+# integration with the C++ compiler provided that the types are compatible.
+USE_CXX_BOOL=1
+if test "$cf_cv_cc_bool_type" = 1
+then
+	# oops: C has a bool.  Unlikely, but C++ could differ.
+	USE_CXX_BOOL=0
+elif test "$cf_cv_builtin_bool" = 0
+then
+	# C++ has no bool
+	USE_CXX_BOOL=0
+else
+	# this is the normal case
+	USE_CXX_BOOL='defined(__cplusplus)'
+fi
+AC_SUBST(USE_CXX_BOOL)
+
+CF_HELP_MESSAGE(Ada Binding Options:)
+
+dnl If the Ada95 source-tree is present, add that to the build unless it will
+dnl not work, or was not requested.
+if test -f "${srcdir}/Ada95/Makefile.in" ; then
+
+dnl libtool does not know anything about GNAT, though a change made in 1998
+dnl provided for it "someday".  Disable the ada subtree if we are using
+dnl libtool -TD 20070714
+	if test "$cf_with_ada" != "no" ; then
+		if test "$with_libtool" != "no"; then
+			AC_MSG_WARN(libtool does not support Ada - disabling feature)
+			cf_with_ada=no
+		fi
+	fi
+
+dnl Check for availability of GNU Ada Translator (GNAT).
+dnl At the moment we support no other Ada compiler.
+	if test "$cf_with_ada" != "no" ; then
+		CF_PROG_GNAT
+		if test	"x$cf_cv_prog_gnat_correct" = xyes; then
+			CF_ADD_ADAFLAGS(-gnatpn)
+			CF_FIXUP_ADAFLAGS
+
+			CF_GNATPREP_OPT_T
+
+			CF_GNAT_GENERICS
+			CF_GNAT_SIGINT
+			CF_GNAT_PROJECTS
+
+			CF_WITH_ADA_COMPILER
+
+			cf_ada_package=terminal_interface
+			AC_SUBST(cf_ada_package)
+
+			CF_WITH_ADA_INCLUDE
+			CF_WITH_ADA_OBJECTS
+			CF_WITH_ADA_SHAREDLIB
+
+			# allow the Ada binding to be renamed
+			CF_WITH_ADA_LIBNAME(AdaCurses)
+		fi
+	fi
+else
+	cf_with_ada=no
+fi
+
+# do this "late" to avoid conflict with header-checks
+if test "x$with_widec" = xyes ; then
+	AC_CHECK_SIZEOF(wchar_t)
+	# cross-compiling to mingw can run into the problem that attempting to
+	# link with the regex library fails, causing the test to not set this to
+	# a number.  "recent" autoconf does not address this problem either -TD
+	if test -z "$ac_cv_sizeof_wchar_t"
+	then
+		CF_VERBOSE(test failed (assume 2))
+		sed /SIZEOF_WCHAR_T/d confdefs.h >confdefs.tmp
+		mv confdefs.tmp confdefs.h
+		echo "#define SIZEOF_WCHAR_T 2" >>confdefs.h
+	fi
+fi
+
+### Construct the ncurses library-subsets, if any, from this set of keywords:
+###	none, base, ext_funcs, ext_tinfo, ticlib, termlib, widechar
+###
+### ticlib modules may be a separate library, otherwise contained in termlib.
+### termlib modules may be a separate library, otherwise contained in ncurses.
+###
+### The of "+" or " " between the tokens controls the way the script
+### chooses to split module lists into libraries.
+###
+### (see CF_LIB_RULES).
+AC_MSG_CHECKING(for library subsets)
+LIB_SUBSETS=
+
+if test "x$cf_with_progs" = xyes || test "$with_ticlib" != no || test "$with_termcap" != no; then
+	LIB_SUBSETS="${LIB_SUBSETS}ticlib"
+	if test "$with_ticlib" != no ; then
+		LIB_SUBSETS="${LIB_SUBSETS} "
+	else
+		LIB_SUBSETS="${LIB_SUBSETS}+"
+	fi
+fi
+
+LIB_SUBSETS="${LIB_SUBSETS}termlib"
+test "x$with_ext_funcs" = xyes && LIB_SUBSETS="${LIB_SUBSETS}+ext_tinfo"
+
+if test "$with_termlib" != no ; then
+	LIB_SUBSETS="${LIB_SUBSETS} "
+else
+	LIB_SUBSETS="${LIB_SUBSETS}+"
+fi
+
+LIB_SUBSETS="${LIB_SUBSETS}base"
+
+# Most term-driver calls are to tinfo, but some like init_pair are to the
+# base library (so it resides in base).
+if test "$with_term_driver" != no ; then
+	LIB_SUBSETS="${LIB_SUBSETS}+port_drivers"
+	case "$cf_cv_system_name" in
+	(*mingw32*|*mingw64*)
+		if test "x$with_exp_win32" = xyes ; then
+			LIB_SUBSETS="${LIB_SUBSETS}+port_tinfo+port_win32"
+		else
+			LIB_SUBSETS="${LIB_SUBSETS}+port_tinfo+port_win32con"
+		fi
+		CPPFLAGS="$CPPFLAGS -DUSE_WIN32CON_DRIVER"
+		;;
+	(*)
+		LIB_SUBSETS="${LIB_SUBSETS}+port_tinfo"
+		;;
+	esac
+elif test "x$with_exp_win32" = xyes ; then
+	case "$cf_cv_system_name" in
+	(*mingw32*|*mingw64*)
+		LIB_SUBSETS="${LIB_SUBSETS}+port_win32"
+		;;
+	(*)
+		;;
+	esac
+fi
+
+test "x$with_widec"     = xyes && LIB_SUBSETS="${LIB_SUBSETS}+widechar"
+test "x$with_ext_funcs" = xyes && LIB_SUBSETS="${LIB_SUBSETS}+ext_funcs"
+
+AC_MSG_RESULT($LIB_SUBSETS)
+
+### Construct the list of include-directories to be generated
+CF_INCLUDE_DIRS
+CF_ADA_INCLUDE_DIRS
+
+### Build up pieces for makefile rules
+AC_MSG_CHECKING(default library suffix)
+CF_LIB_TYPE($DFT_LWR_MODEL,DFT_ARG_SUFFIX)dnl
+AC_SUBST(DFT_ARG_SUFFIX)dnl the string to append to "-lncurses" ("")
+AC_MSG_RESULT($DFT_ARG_SUFFIX)
+
+AC_MSG_CHECKING(default library-dependency suffix)
+CF_LIB_SUFFIX($DFT_LWR_MODEL,DFT_LIB_SUFFIX,DFT_DEP_SUFFIX)dnl
+AC_SUBST(DFT_DEP_SUFFIX)dnl the corresponding library-suffix (".a")
+AC_MSG_RESULT($DFT_DEP_SUFFIX)
+
+AC_MSG_CHECKING(default object directory)
+CF_OBJ_SUBDIR($DFT_LWR_MODEL,DFT_OBJ_SUBDIR)dnl
+AC_SUBST(DFT_OBJ_SUBDIR)dnl the default object-directory ("obj")
+AC_MSG_RESULT($DFT_OBJ_SUBDIR)
+
+if test "x$cf_with_cxx" = xyes ; then
+AC_MSG_CHECKING(c++ library-dependency suffix)
+if test "$with_libtool" != "no"; then
+	# libtool thinks it can make c++ shared libraries (perhaps only g++)
+	CXX_LIB_SUFFIX=$DFT_DEP_SUFFIX
+elif test "$with_shared_cxx" != "no"; then
+	# also for g++ users...
+	CXX_LIB_SUFFIX=$DFT_DEP_SUFFIX
+else
+	# we normally make a static library because C/C++ library rules differ
+	CF_LIB_SUFFIX(normal,CXX_LIB_SUFFIX,CXX_DEP_SUFFIX)
+fi
+AC_MSG_RESULT($CXX_LIB_SUFFIX)
+AC_SUBST(CXX_LIB_SUFFIX)
+fi
+
+# do not want -ldl in build except as needed for -lncurses dependency
+if test "x$with_dlsym" = xyes ; then
+if test "$DFT_LWR_MODEL" = shared || \
+   test "$DFT_LWR_MODEL" = libtool ; then
+	CF_REMOVE_LIB(LIBS,$LIBS,dl)
+fi
+fi
+### Set up low-level terminfo dependencies for makefiles.
+
+# TICS_LIST and TINFO_LIST are needed to build libtic.so and libterm.so, but
+# do not need libdl
+TICS_LIST=
+if test "x$with_dlsym" = xyes ; then
+	CF_REMOVE_LIB(TINFO_LIST,$SHLIB_LIST,dl)
+fi
+
+USE_ARG_SUFFIX="${DFT_ARG_SUFFIX}${EXTRA_SUFFIX}"
+USE_LIB_SUFFIX="${LIB_SUFFIX}${EXTRA_SUFFIX}"
+USE_CFG_SUFFIX=${DFT_ARG_SUFFIX}${cf_cv_abi_version}
+if test -n "$EXTRA_SUFFIX" && test "x$EXTRA_SUFFIX" != "x${cf_cv_abi_version}"
+then
+	USE_CFG_SUFFIX="${USE_CFG_SUFFIX}${EXTRA_SUFFIX}"
+fi
+AC_SUBST(USE_ARG_SUFFIX)
+AC_SUBST(USE_CFG_SUFFIX)
+AC_SUBST(USE_LIB_SUFFIX)
+
+if test "$with_ticlib" != no ; then
+
+	if test "x$with_ticlib" != xyes ; then
+		TICS_NAME=$with_ticlib
+		TICS_SUFFIX="`echo "${DFT_LIB_SUFFIX}" |sed -e "s/^${USE_LIB_SUFFIX}//"`"
+		TICS_ARG_SUFFIX="${with_ticlib}`echo "${USE_ARG_SUFFIX}" |sed -e "s/^${LIB_SUFFIX}//"`"
+		TICS_DEP_SUFFIX="${with_ticlib}`echo "${DFT_DEP_SUFFIX}" |sed -e "s/^${LIB_SUFFIX}//"`"
+		TICS_LIB_SUFFIX="${with_ticlib}"
+	else
+		TICS_SUFFIX=${DFT_LIB_SUFFIX}
+		TICS_ARG_SUFFIX="${TICS_NAME}${USE_ARG_SUFFIX}"
+		TICS_DEP_SUFFIX="${TICS_NAME}${DFT_DEP_SUFFIX}"
+		TICS_LIB_SUFFIX="${TICS_NAME}${USE_LIB_SUFFIX}"
+	fi
+	TICS_LDFLAGS="-L${LIB_DIR}"
+	TICS_LIBS="-l${TICS_ARG_SUFFIX}"
+else
+	TICS_SUFFIX=${DFT_LIB_SUFFIX}
+	TICS_LDFLAGS="-L${LIB_DIR}"
+	TICS_LIBS="-l${LIB_NAME}${USE_ARG_SUFFIX}"
+fi
+AC_SUBST(TICS_ARG_SUFFIX)
+AC_SUBST(TICS_DEP_SUFFIX)
+AC_SUBST(TICS_LIB_SUFFIX)
+AC_SUBST(TICS_LDFLAGS)
+AC_SUBST(TICS_LIBS)
+
+if test "$with_termlib" != no ; then
+
+	if test "x$with_termlib" != xyes ; then
+		TINFO_NAME=$with_termlib
+		TINFO_SUFFIX="`echo "${DFT_LIB_SUFFIX}" |sed -e "s/^${USE_LIB_SUFFIX}//"`"
+		TINFO_ARG_SUFFIX="${with_termlib}`echo "${USE_ARG_SUFFIX}" |sed -e "s/^${LIB_SUFFIX}//"`"
+		TINFO_DEP_SUFFIX="${with_termlib}`echo "${DFT_DEP_SUFFIX}" |sed -e "s/^${LIB_SUFFIX}//"`"
+		TINFO_LIB_SUFFIX="${with_termlib}"
+	else
+		TINFO_SUFFIX=${DFT_LIB_SUFFIX}
+		TINFO_ARG_SUFFIX="${TINFO_NAME}${USE_ARG_SUFFIX}"
+		TINFO_DEP_SUFFIX="${TINFO_NAME}${DFT_DEP_SUFFIX}"
+		TINFO_LIB_SUFFIX="${TINFO_NAME}${USE_LIB_SUFFIX}"
+	fi
+
+	TEST_DEPS="${LIB_DIR}/${LIB_PREFIX}${TINFO_DEP_SUFFIX}"
+	TEST_DEP2="${LIB_2ND}/${LIB_PREFIX}${TINFO_DEP_SUFFIX}"
+	if test "$DFT_LWR_MODEL" = "libtool"; then
+		TEST_ARGS="${TEST_DEPS}"
+		TEST_ARG2="${TEST_DEP2}"
+		TINFO_LDFLAGS="-L${LIB_DIR}"
+		TINFO_LIBS="$TEST_ARGS"
+		TICS_LIST="$SHLIB_LIST $TEST_ARGS"
+		SHLIB_LIST="${SHLIB_LIST} $TEST_ARGS"
+	else
+		TEST_ARGS="-l${TINFO_ARG_SUFFIX}"
+		TEST_ARG2="-l${TINFO_ARG_SUFFIX}"
+		if test "x$with_term_driver" != xno ; then
+			TICS_LIST="$SHLIB_LIST -l${LIB_NAME}${USE_ARG_SUFFIX}"
+			TICS_LIBS="$TICS_LIBS -l${LIB_NAME}${USE_ARG_SUFFIX}"
+			TINFO_LIBS="-l${LIB_NAME}${USE_ARG_SUFFIX} $TEST_ARGS"
+		else
+			TICS_LIST="$SHLIB_LIST -l${TINFO_LIB_SUFFIX}"
+			TINFO_LIBS="$TEST_ARGS"
+		fi
+		TINFO_LDFLAGS="-L${LIB_DIR}"
+		SHLIB_LIST="$SHLIB_LIST -l${TINFO_LIB_SUFFIX}"
+	fi
+else
+	# the next lines are needed for linking libtic over libncurses
+	TINFO_NAME=${LIB_NAME}
+	TINFO_SUFFIX=${DFT_LIB_SUFFIX}
+	TINFO_ARG_SUFFIX=${LIB_NAME}${USE_ARG_SUFFIX}
+	if test "x$with_tic_depends" = xyes ; then
+		TICS_LIST="$SHLIB_LIST -l${LIB_NAME}${USE_ARG_SUFFIX}"
+	else
+		TICS_LIST="$SHLIB_LIST"
+	fi
+
+	TINFO_LDFLAGS="-L${LIB_DIR}"
+	TINFO_LIBS="-l${LIB_NAME}${USE_ARG_SUFFIX}"
+fi
+
+if test "$DFT_LWR_MODEL" = shared ; then
+	case "$cf_cv_system_name" in
+	(cygwin*|msys*)
+		# "lib" files have ".dll.a" suffix, "cyg"or "msys-" files have ".dll"
+		TINFO_SUFFIX=.dll
+		;;
+	esac
+fi
+
+AC_SUBST(TINFO_ARG_SUFFIX)
+AC_SUBST(TINFO_DEP_SUFFIX)
+AC_SUBST(TINFO_LIB_SUFFIX)
+AC_SUBST(TINFO_LDFLAGS)
+AC_SUBST(TINFO_LIBS)
+
+if test "x$with_dlsym" = xyes ; then
+	CF_REMOVE_LIB(TICS_LIST,$TICS_LIST,dl)
+fi
+
+if test "$DFT_LWR_MODEL" = "libtool"; then
+	OBJEXT=lo
+fi
+
+# needed for Ada95
+TINFO_LDFLAGS2=`echo "$TINFO_LDFLAGS" | sed -e 's,-L\.\./,-L../../,'`
+AC_SUBST(TINFO_LDFLAGS2)
+
+case "$DFT_LWR_MODEL" in
+(normal|debug|profile)
+	CF_LDFLAGS_STATIC
+	;;
+esac
+
+AC_MSG_CHECKING(where we will install curses.h)
+AC_SUBST(includesubdir)
+includesubdir=
+if test "$with_overwrite" = no && \
+ { test "x$includedir" = 'x${prefix}/include' || \
+   test "x$includedir" = "x${prefix}/include"; }
+then
+	includesubdir="/ncurses${USE_LIB_SUFFIX}"
+fi
+AC_MSG_RESULT(${includedir}${includesubdir})
+
+### Resolve a conflict between normal and wide-curses by forcing applications
+### that will need libutf8 to add it to their configure script.
+if test "$with_overwrite" != no ; then
+if test "$NCURSES_LIBUTF8" = 1 ; then
+	NCURSES_LIBUTF8='defined(HAVE_LIBUTF8_H)'
+	AC_MSG_WARN(Wide-character applications must define HAVE_LIBUTF8_H to include curses.h)
+fi
+fi
+WITH_OVERWRITE=$with_overwrite
+
+### At least on MinGW a shared library build without libtool
+### requires adding the additional libs to the link list.
+case "$cf_cv_system_name" in
+(*mingw32*|*mingw64*)
+	if test "$DFT_LWR_MODEL" != "libtool"; then
+   	   SHLIB_LIST="$SHLIB_LIST ${LIBS}"
+	fi
+	;;
+*)	;;
+esac
+
+AC_SUBST(WITH_OVERWRITE)
+AC_SUBST(TICS_LIST)
+AC_SUBST(TINFO_LIST)
+AC_SUBST(SHLIB_LIST)
+
+# used to separate tack out of the tree
+NCURSES_TREE=
+AC_SUBST(NCURSES_TREE)
+
+### predefined stuff for the test programs
+AC_DEFINE(HAVE_SLK_COLOR,1,[Define to 1 if we have slk_color for test-programs])
+
+# pkgsrc uses these
+CF_WITH_LIB_BASENAME(FORM_NAME,form)
+CF_WITH_LIB_BASENAME(MENU_NAME,menu)
+CF_WITH_LIB_BASENAME(PANEL_NAME,panel)
+CF_WITH_LIB_BASENAME(CXX_NAME,cxx,ncurses++)
+
+### Construct the list of subdirectories for which we'll customize makefiles
+### with the appropriate compile-rules.
+
+CF_SRC_MODULES($modules_to_build)
+
+if test "x$cf_with_ada" = "xyes" && test "x$cf_cv_prog_gnat_correct" = "xyes"; then
+   SUB_MAKEFILES="$SUB_MAKEFILES Ada95/src/library.gpr:Ada95/src/library.gpr.in"
+   SUB_MAKEFILES="$SUB_MAKEFILES Ada95/gen/adacurses${USE_CFG_SUFFIX}-config:Ada95/gen/adacurses-config.in"
+   SUB_MAKEFILES="$SUB_MAKEFILES man/adacurses${USE_CFG_SUFFIX}-config.1:man/MKada_config.in"
+fi
+
+CF_DIRS_TO_MAKE
+
+# symbols that differ when compiling Ada95 by itself.
+NCURSES_SHLIB2=$SHELL' $(top_srcdir)/misc/shlib'
+AC_SUBST(NCURSES_SHLIB2)
+
+# values to use as strings
+AC_DEFINE_UNQUOTED(NCURSES_PATHSEP,'$PATH_SEPARATOR',[Define to override ':' as library path-separator])
+
+AC_DEFINE_UNQUOTED(NCURSES_VERSION_STRING, "${NCURSES_MAJOR}.${NCURSES_MINOR}.${NCURSES_PATCH}",[Define to 1 if machine has ample memory for tic])
+
+### Define substitutions for header files to avoid name-pollution
+CF_SUBST_IF(["x$cf_cv_have_tcgetattr" = xyes], HAVE_TCGETATTR, 1, 0)
+CF_SUBST_IF(["x$ac_cv_header_stdint_h" = xyes], HAVE_STDINT_H, 1, 0)
+CF_SUBST_IF(["x$ac_cv_header_termio_h" = xyes], HAVE_TERMIO_H, 1, 0)
+CF_SUBST_IF(["x$ac_cv_header_termios_h" = xyes], HAVE_TERMIOS_H, 1, 0)
+
+################################################################################
+test "x$use_database" = xyes && \
+SUB_MAKEFILES="$SUB_MAKEFILES misc/run_tic.sh:misc/run_tic.in"
+
+SUB_MAKEFILES="$SUB_MAKEFILES misc/ncurses-config:misc/ncurses-config.in"
+SUB_MAKEFILES="$SUB_MAKEFILES man/ncurses${USE_CFG_SUFFIX}-config.1:man/MKncu_config.in"
+
+if test "x$enable_pc_files" = xyes && test -z "$MAKE_PC_FILES" ; then
+SUB_MAKEFILES="$SUB_MAKEFILES misc/gen-pkgconfig:misc/gen-pkgconfig.in"
+fi
+AC_SUBST(cross_compiling)
+
+if test "x$cf_with_tests" != xno ; then
+	MAKE_TESTS=
+else
+	MAKE_TESTS="#"
+fi
+AC_SUBST(MAKE_TESTS)
+
+ADAHTML_DIR=../../doc/html/ada
+AC_SUBST(ADAHTML_DIR)
+
+# workaround for OS/2 (20151017)
+case "$cf_cv_system_name" in
+(os2*)
+	LIBTOOL_OPTS_CXX="-os2dllname ncurs++"
+	;;
+(*)
+	LIBTOOL_OPTS_CXX=
+	;;
+esac
+AC_SUBST(LIBTOOL_OPTS_CXX)
+
+# workaround for g++ versus Solaris (20131116)
+case "$cf_cv_system_name" in
+(solaris2*)
+	case "x$CPPFLAGS" in
+	(*-D_XOPEN_SOURCE_EXTENDED*)
+		CF_VERBOSE(moving _XOPEN_SOURCE_EXTENDED to work around g++ problem)
+		CFLAGS="$CFLAGS -D_XOPEN_SOURCE_EXTENDED"
+		CPPFLAGS=`echo "x$CPPFLAGS" | sed -e  's/^.//' -e 's/-D_XOPEN_SOURCE_EXTENDED//'`
+		;;
+	esac
+	;;
+esac
+
+# Help to automatically enable the extended curses features when using either
+# the *-config or the ".pc" files by adding defines.
+AC_MSG_CHECKING(for defines to add to ncurses${USE_CFG_SUFFIX}-config script)
+PKG_CFLAGS=
+for cf_loop1 in $CPPFLAGS_after_XOPEN
+do
+	cf_found=no
+	for cf_loop2 in $CPPFLAGS_before_XOPEN
+	do
+		if test "x$cf_loop1" = "x$cf_loop2"
+		then
+			cf_found=yes
+			break
+		fi
+	done
+	test "$cf_found" = no && PKG_CFLAGS="$PKG_CFLAGS $cf_loop1"
+done
+AC_MSG_RESULT($PKG_CFLAGS)
+AC_SUBST(PKG_CFLAGS)
+
+# AC_CHECK_SIZEOF demands a literal parameter, no variables.  So we do this.
+case "x$NCURSES_OSPEED" in
+(*short*)
+	cf_compatible=1
+	;;
+(*)
+	cf_compatible=0
+	;;
+esac
+AC_DEFINE_UNQUOTED(NCURSES_OSPEED_COMPAT,$cf_compatible,[Define to 1 if termcap variable ospeed is short])
+
+case "x$cf_cv_typeof_chtype" in
+(xshort|xint|xlong)
+	cf_cv_typeof_chtype="unsigned $cf_cv_typeof_chtype"
+	;;
+esac
+
+case "x$cf_cv_typeof_mmask_t" in
+(xshort|xint|xlong)
+	cf_cv_typeof_mmask_t="unsigned $cf_cv_typeof_mmask_t"
+	;;
+esac
+
+# substitute into misc/Makefile to suppress
+# (un)install.data from the
+# (un)install rules.
+if test "x$cf_with_db_install" = "xno"; then
+	MISC_INSTALL_DATA=
+	MISC_UNINSTALL_DATA=
+else
+	MISC_INSTALL_DATA=install.data
+	MISC_UNINSTALL_DATA=uninstall.data
+fi
+AC_SUBST(MISC_INSTALL_DATA)
+AC_SUBST(MISC_UNINSTALL_DATA)
+
+if test "x$cf_with_db_install" = "xno" || test "x$TERMINFO_SRC" = "xno"; then
+	MAKE_DATABASE="#"
+else
+	MAKE_DATABASE="$MAKE_TERMINFO"
+fi
+AC_SUBST(MAKE_DATABASE)
+
+dnl Override the package used for exported symbols
+if test -n "$PACKAGE"
+then
+	PACKAGE="${PACKAGE}${DFT_ARG_SUFFIX}"
+	export PACKAGE
+	echo "package: $PACKAGE"
+fi
+
+UNALTERED_SYMS=
+cf_filter_syms=no
+
+if test -n "$RESULTING_SYMS"
+then
+	cf_filter_syms=$cf_dft_filter_syms
+	CF_VERBOSE(will map symbols to ABI=$cf_cv_abi_version)
+fi
+
+if test "x$WILDCARD_SYMS" = xno
+then
+	cf_filter_syms=yes
+fi
+
+test "x$cf_with_trace" = xyes && NCURSES_INLINE=
+
+UNALTERED_SYMS=`echo "$RESULTING_SYMS" | sed -e 's/\\$/\\\\$/g'`
+if test "$cf_filter_syms" = yes
+then
+	RESULTING_SYMS=resulting.map
+fi
+AC_SUBST(UNALTERED_SYMS)
+
+if test "x$cross_compiling" = xyes ; then
+	ADAGEN_LDFLAGS='$(CROSS_LDFLAGS)'
+	CHECK_BUILD="#"
+else
+	ADAGEN_LDFLAGS='$(NATIVE_LDFLAGS)'
+	CHECK_BUILD=
+fi
+AC_SUBST(ADAGEN_LDFLAGS)
+AC_SUBST(CHECK_BUILD)
+AC_SUBST(PRIVATE_LIBS)
+
+# This is used for the *-config script and *.pc data files.
+CF_LD_SEARCHPATH
+
+AC_DEFINE(HAVE_CURSES_DATA_BOOLNAMES,1,[definition needed for in-tree build of tack])
+
+AC_OUTPUT( \
+	include/MKterm.h.awk \
+	include/curses.head:include/curses.h.in \
+	include/ncurses_dll.h \
+	include/termcap.h \
+	include/unctrl.h \
+	man/man_db.renames \
+	$SUB_MAKEFILES \
+	Makefile,[
+if test "x$cf_with_tests" != xno ; then
+	CF_PRG_RULES(["$srcdir/test/mk-test.awk" INSTALL=no ECHO_LINK="$ECHO_LD"], test)
+fi
+CF_LIB_RULES($SRC_SUBDIRS)
+CF_OUTPUT_MANPAGE_RENAMES
+
+if test "x$cf_with_ada" = "xyes" && test "x$cf_cv_prog_gnat_correct" = "xyes"; then
+if test -z "$USE_OLD_MAKERULES" ; then
+	$AWK -f "$srcdir/Ada95/mk-1st.awk" <"$srcdir/Ada95/src/modules" >>Ada95/src/Makefile
+fi
+fi
+],[
+### Special initialization commands, used to pass information from the
+### configuration-run into config.status
+
+ALTERNATE_SYMS="$ALTERNATE_SYMS"
+AWK="$AWK"
+CXX_NAME="$CXX_NAME"
+DFT_ARG_SUFFIX="$DFT_ARG_SUFFIX"
+DFT_LWR_MODEL="$DFT_LWR_MODEL"
+ECHO_LD="$ECHO_LD"
+EXTRA_SUFFIX="$EXTRA_SUFFIX"
+FORM_NAME="$FORM_NAME"
+LDCONFIG="$LDCONFIG"
+LIBTOOL_VERSION="$LIBTOOL_VERSION"
+LIB_NAME="$LIB_NAME"
+LIB_PREFIX="$LIB_PREFIX"
+LIB_SUBSETS="$LIB_SUBSETS"
+LIB_SUFFIX="$LIB_SUFFIX"
+LIB_TRACING="$LIB_TRACING"
+LN_S="$LN_S"
+MAKE_TERMINFO="$MAKE_TERMINFO"
+MANPAGE_RENAMES="$MANPAGE_RENAMES"
+MENU_NAME="$MENU_NAME"
+NCURSES_MAJOR="$NCURSES_MAJOR"
+NCURSES_MINOR="$NCURSES_MINOR"
+NCURSES_OSPEED="$NCURSES_OSPEED"
+NCURSES_PATCH="$NCURSES_PATCH"
+PANEL_NAME="$PANEL_NAME"
+SRC_SUBDIRS="$SRC_SUBDIRS"
+TERMINFO="$TERMINFO"
+TICS_ARG_SUFFIX="$TICS_ARG_SUFFIX"
+TICS_LIB_SUFFIX="$TICS_LIB_SUFFIX"
+TICS_NAME="$TICS_NAME"
+TICS_SUFFIX="$TICS_SUFFIX"
+TIC_PATH="$TIC_PATH"
+TINFO_ARG_SUFFIX="$TINFO_ARG_SUFFIX"
+TINFO_LIB_SUFFIX="$TINFO_LIB_SUFFIX"
+TINFO_NAME="$TINFO_NAME"
+TINFO_SUFFIX="$TINFO_SUFFIX"
+UNALTERED_SYMS="$UNALTERED_SYMS"
+USE_ARG_SUFFIX="$USE_ARG_SUFFIX"
+USE_CFG_SUFFIX="$USE_CFG_SUFFIX"
+USE_LIB_SUFFIX="$USE_LIB_SUFFIX"
+USE_OLD_MAKERULES="$USE_OLD_MAKERULES"
+WILDCARD_SYMS="$WILDCARD_SYMS"
+WITH_CURSES_H="$with_curses_h"
+WITH_ECHO="${enable_echo:=yes}"
+WITH_OVERWRITE="$with_overwrite"
+cf_LIST_MODELS="$cf_list_models"
+cf_cv_VERSION_GNATMAKE=$cf_cv_VERSION_GNATMAKE
+cf_cv_VERSION_GPRBUILD=$cf_cv_VERSION_GPRBUILD
+cf_cv_abi_version="$cf_cv_abi_version"
+cf_cv_do_relink="$cf_cv_do_relink"
+cf_cv_do_reranlib="$cf_cv_do_reranlib"
+cf_cv_do_symlinks="$cf_cv_do_symlinks"
+cf_cv_enable_lp64="$cf_cv_enable_lp64"
+cf_cv_enable_opaque="$cf_cv_enable_opaque"
+cf_cv_make_PHONY="$cf_cv_make_PHONY"
+cf_cv_prog_CC_c_o=$cf_cv_prog_CC_c_o
+cf_cv_prog_CXX_c_o=$cf_cv_prog_CXX_c_o
+cf_cv_prog_gnat_correct=$cf_cv_prog_gnat_correct
+cf_cv_rel_version="$cf_cv_rel_version"
+cf_cv_rm_so_locs="$cf_cv_rm_so_locs"
+cf_cv_shared_soname='$cf_cv_shared_soname'
+cf_cv_shlib_version="$cf_cv_shlib_version"
+cf_cv_shlib_version_infix="$cf_cv_shlib_version_infix"
+cf_cv_system_name="$cf_cv_system_name"
+cf_cv_term_driver="$with_term_driver"
+cf_with_ada="$cf_with_ada"
+cf_with_cxx_binding="$cf_with_cxx_binding"
+cf_with_db_install="$cf_with_db_install"
+cf_with_manpages="$cf_with_manpages"
+cf_with_tests="$cf_with_tests"
+host="$host"
+target="$target"
+verbose="$verbose"
+with_shared_cxx="$with_shared_cxx"
+
+],cat)dnl
+${MAKE:-make} preinstall
diff --git a/dist.mk b/dist.mk
new file mode 100644
index 0000000..ee07796
--- /dev/null
+++ b/dist.mk
@@ -0,0 +1,176 @@
+##############################################################################
+# Copyright 2018-2021,2022 Thomas E. Dickey                                  #
+# Copyright 1998-2017,2018 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: dist.mk,v 1.1519 2022/12/31 20:43:21 tom Exp $
+# Makefile for creating ncurses distributions.
+#
+# This only needs to be used directly as a makefile by developers, but
+# configure mines the current version number out of here.  To move
+# to a new version number, just edit this file and run configure.
+#
+SHELL = /bin/sh
+
+# These define the major/minor/patch versions of ncurses.
+NCURSES_MAJOR = 6
+NCURSES_MINOR = 4
+NCURSES_PATCH = 20221231
+
+# We don't append the patch to the version, since this only applies to releases
+VERSION = $(NCURSES_MAJOR).$(NCURSES_MINOR)
+
+WEBSITE = https://invisible-island.net
+HOMEPAGE = $(WEBSITE)/ncurses
+
+# The most recent html files were generated with lynx 2.8.6 (or later), using
+# ncurses configured with
+#	--without-manpage-renames
+# on Debian/testing.  The -scrollbar and -width options are used to make lynx
+# use 79 columns as it did in 2.8.5 and before.
+DUMP	= lynx -dump -scrollbar=0 -width=79 -display_charset=US-ASCII
+DUMP2	= $(DUMP) -nolist
+
+# gcc's file is "gnathtml.pl"
+GNATHTML= gnathtml
+
+# man2html is a Perl script which assumes that pages are fixed size.
+# Not all man programs agree with this assumption; some use half-spacing, which
+# has the effect of lengthening the text portion of the page -- so man2html
+# would remove some text.  The man program on Redhat 6.1 appears to work with
+# man2html if we set the top/bottom margins to 6 (the default is 7).  Newer
+# versions of 'man' leave no margin (and make it harder to sync with pages).
+MAN2HTML= man2html -botm=0 -topm=0 -cgiurl '$$title.$$section$$subsection.html' -index
+
+ALL	= ANNOUNCE doc/html/announce.html doc/ncurses-intro.doc doc/hackguide.doc manhtml adahtml
+
+all :	$(ALL)
+
+dist:	$(ALL)
+	(cd ..;  tar cvf ncurses-$(VERSION).tar `sed <ncurses-$(VERSION)/MANIFEST 's/^./ncurses-$(VERSION)/'`;  gzip ncurses-$(VERSION).tar)
+
+distclean:
+	rm -f $(ALL) subst.tmp subst.sed
+
+# Don't mess with announce.html.in unless you have lynx available!
+doc/html/announce.html: announce.html.in
+	sed \
+		-e 's,@VERSION@,$(VERSION),g' \
+		-e 's,@WEBSITE@,$(WEBSITE),g' \
+		-e 's,@HOMEPAGE@,$(HOMEPAGE),g' <announce.html.in > $@
+
+ANNOUNCE : doc/html/announce.html
+	$(DUMP2) doc/html/announce.html > $@
+
+doc/ncurses-intro.doc: doc/html/ncurses-intro.html
+	$(DUMP2) doc/html/ncurses-intro.html > $@
+doc/hackguide.doc: doc/html/hackguide.html
+	$(DUMP2) doc/html/hackguide.html > $@
+
+# The distributed html files are formatted using
+#	configure --without-manpage-renames
+#
+# The edit_man.sed script is built as a side-effect of installing the manpages.
+# If that conflicts with the --without-manpage-renames, you can install those
+# in a different location using the --with-install-prefix option of the
+# configure script.
+MANPROG	= tbl | nroff -mandoc -rHY=0 -rLL=78n -rLT=78n -Tascii
+
+manhtml:
+	@for f in doc/html/man/*.html; do \
+	   test -f $$f || continue; \
+	   case $$f in \
+	   */index.html) ;; \
+	   *) rm -f $$f ;; \
+	   esac; \
+	done
+	@mkdir -p doc/html/man
+	@rm -f subst.tmp ;
+	@for f in man/*.[0-9]*; do \
+	   m=`basename $$f` ;\
+	   x=`echo $$m | awk -F. '{print $$2;}'` ;\
+	   xu=`echo $$x | dd conv=ucase 2>/dev/null` ;\
+	   if [ "$${x}" != "$${xu}" ]; then \
+	     echo "s/$${xu}/$${x}/g" >> subst.tmp ;\
+	   fi ;\
+	done
+	# change some things to make weblint happy:
+	@cat man_alias.sed           >> subst.tmp
+	@echo 's/<B>/<STRONG>/g'     >> subst.tmp
+	@echo 's/<\/B>/<\/STRONG>/g' >> subst.tmp
+	@echo 's/<I>/<EM>/g'         >> subst.tmp
+	@echo 's/<\/I>/<\/EM>/g'     >> subst.tmp
+	@misc/csort < subst.tmp | uniq > subst.sed
+	@echo '/<\/TITLE>/a\' >> subst.sed
+	@echo '<link rel="author" href="mailto:bug-ncurses@gnu.org">\' >> subst.sed
+	@rm -f subst.tmp
+	@for f in man/*.[0-9]* ; do \
+	   m=`basename $$f` ;\
+	   T=`$${EGREP-grep -E} '^.TH' $$f|sed -e 's/^.TH //' -e s'/"//g' -e 's/[ 	]\+$$//'` ; \
+	   g=$${m}.html ;\
+	   if [ -f doc/html/$$g ]; then chmod +w doc/html/$$g; fi;\
+	   echo "Converting $$m to HTML" ;\
+	   echo '<!--' > doc/html/man/$$g ;\
+	   $${EGREP-grep -E} '^.\\"[^#]' $$f | \
+	   	sed	-e 's/\$$/@/g' \
+			-e 's/^.../  */' \
+			-e 's/</\&lt;/g' \
+			-e 's/>/\&gt;/g' \
+	   >> doc/html/man/$$g ;\
+	   echo '-->' >> doc/html/man/$$g ;\
+	   ./edit_man.sh normal editing /usr/man man $$f | \
+		   $(MANPROG) | \
+		   tr '\255' '-' | \
+		   $(MAN2HTML) \
+		   	-title "$$T" \
+			-aliases man/manhtml.aliases \
+			-externs man/manhtml.externs | \
+		   sed -f subst.sed |\
+		   sed -e 's/"curses.3x.html"/"ncurses.3x.html"/g' \
+	   >> doc/html/man/$$g ;\
+	done
+	@rm -f subst.sed
+
+#
+# Please note that this target can only be properly built if the build of the
+# Ada95 subdir has been done.  The reason is, that the gnathtml tool uses the
+# .ali files generated by the Ada95 compiler during the build process.  These
+# .ali files contain cross referencing information required by gnathtml.
+adahtml:
+	if [ ! -z "$(GNATHTML)" ]; then \
+	  (cd ./Ada95/gen ; make html GNATHTML=$(GNATHTML) ) ;\
+	fi
+
+# This only works on a clean source tree, of course.
+MANIFEST:
+	-rm -f $@
+	touch $@
+	find . -type f -print |misc/csort | fgrep -v .lsm |fgrep -v .spec >$@
+
+TAGS:
+	etags */*.[ch]
+
+# Makefile ends here
diff --git a/doc/hackguide.doc b/doc/hackguide.doc
new file mode 100644
index 0000000..a464d03
--- /dev/null
+++ b/doc/hackguide.doc
@@ -0,0 +1,685 @@
+                          A Hacker's Guide to NCURSES
+
+A Hacker's Guide to NCURSES
+
+Contents
+
+     * Abstract
+     * Objective of the Package
+          + Why System V Curses?
+          + How to Design Extensions
+     * Portability and Configuration
+     * Documentation Conventions
+     * How to Report Bugs
+     * A Tour of the Ncurses Library
+          + Library Overview
+          + The Engine Room
+          + Keyboard Input
+          + Mouse Events
+          + Output and Screen Updating
+     * The Forms and Menu Libraries
+     * A Tour of the Terminfo Compiler
+          + Translation of Non-use Capabilities
+          + Use Capability Resolution
+          + Source-Form Translation
+     * Other Utilities
+     * Style Tips for Developers
+     * Porting Hints
+
+Abstract
+
+   This document is a hacker's tour of the ncurses library and utilities.
+   It  discusses  design  philosophy,  implementation  methods,  and  the
+   conventions  used  for  coding  and  documentation.  It is recommended
+   reading  for  anyone  who  is  interested  in  porting,  extending  or
+   improving the package.
+
+Objective of the Package
+
+   The objective of the ncurses package is to provide a free software API
+   for character-cell terminals and terminal emulators with the following
+   characteristics:
+     * Source-compatible    with    historical   curses   implementations
+       (including the original BSD curses and System V curses.
+     * Conformant  with the XSI Curses standard issued as part of XPG4 by
+       X/Open.
+     * High-quality  --  stable and reliable code, wide portability, good
+       packaging, superior documentation.
+     * Featureful  --  should  eliminate  as  much  of  the drudgery of C
+       interface programming as possible, freeing programmers to think at
+       a higher level of design.
+
+   These  objectives  are  in  priority  order.  So,  for example, source
+   compatibility  with  older  version  must  trump  featurefulness -- we
+   cannot  add  features  if  it  means  breaking  the portion of the API
+   corresponding to historical curses versions.
+
+  Why System V Curses?
+
+   We  used System V curses as a model, reverse-engineering their API, in
+   order to fulfill the first two objectives.
+
+   System  V  curses implementations can support BSD curses programs with
+   just a recompilation, so by capturing the System V API we also capture
+   BSD's.
+
+   More  importantly  for  the  future, the XSI Curses standard issued by
+   X/Open  is  explicitly and closely modeled on System V. So conformance
+   with System V took us most of the way to base-level XSI conformance.
+
+  How to Design Extensions
+
+   The  third  objective (standards conformance) requires that it be easy
+   to  condition  source  code  using  ncurses  so  that  the  absence of
+   nonstandard extensions does not break the code.
+
+   Accordingly,  we  have  a  policy of associating with each nonstandard
+   extension  a  feature  macro, so that ncurses client code can use this
+   macro  to  condition  in  or  out  the  code that requires the ncurses
+   extension.
+
+   For  example,  there is a macro NCURSES_MOUSE_VERSION which XSI Curses
+   does  not  define, but which is defined in the ncurses library header.
+   You can use this to condition the calls to the mouse API calls.
+
+Portability and Configuration
+
+   Code  written  for  ncurses may assume an ANSI-standard C compiler and
+   POSIX-compatible  OS  interface.  It may also assume the presence of a
+   System-V-compatible select(2) call.
+
+   We encourage (but do not require) developers to make the code friendly
+   to less-capable UNIX environments wherever possible.
+
+   We  encourage  developers  to  support  OS-specific  optimizations and
+   methods not available under POSIX/ANSI, provided only that:
+     * All  such  code  is properly conditioned so the build process does
+       not attempt to compile it under a plain ANSI/POSIX environment.
+     * Adding    such   implementation   methods   does   not   introduce
+       incompatibilities in the ncurses API between platforms.
+
+   We  use GNU autoconf(1) as a tool to deal with portability issues. The
+   right way to leverage an OS-specific feature is to modify the autoconf
+   specification  files  (configure.in  and  aclocal.m4)  to set up a new
+   feature macro, which you then use to condition your code.
+
+Documentation Conventions
+
+   There  are  three kinds of documentation associated with this package.
+   Each has a different preferred format:
+     * Package-internal files (README, INSTALL, TO-DO etc.)
+     * Manual pages.
+     * Everything else (i.e., narrative documentation).
+
+   Our conventions are simple:
+    1. Maintain package-internal files in plain text. The expected viewer
+       for  them  is  more(1)  or  an editor window; there is no point in
+       elaborate mark-up.
+    2. Mark  up manual pages in the man macros. These have to be viewable
+       through traditional man(1) programs.
+    3. Write everything else in HTML.
+
+   When  in  doubt,  HTMLize  a  master and use lynx(1) to generate plain
+   ASCII (as we do for the announcement document).
+
+   The  reason  for  choosing  HTML  is  that  it is (a) well-adapted for
+   on-line  browsing through viewers that are everywhere; (b) more easily
+   readable  as plain text than most other mark-ups, if you do not have a
+   viewer;  and  (c)  carries  enough information that you can generate a
+   nice-looking  printed  version  from  it.  Also,  of  course,  it make
+   exporting things like the announcement document to WWW pretty trivial.
+
+How to Report Bugs
+
+   The  reporting  address  for  bugs  is  bug-ncurses@gnu.org. This is a
+   majordomo  list;  to join, write to bug-ncurses-request@gnu.org with a
+   message containing the line:
+             subscribe <name>@<host.domain>
+
+   The  ncurses  code is maintained by a small group of volunteers. While
+   we  try  our best to fix bugs promptly, we simply do not have a lot of
+   hours  to  spend  on  elementary  hand-holding. We rely on intelligent
+   cooperation  from  our  users.  If  you  think you have found a bug in
+   ncurses,  there  are some steps you can take before contacting us that
+   will help get the bug fixed quickly.
+
+   In  order  to  use  our bug-fixing time efficiently, we put people who
+   show  us  they  have  taken these steps at the head of our queue. This
+   means that if you do not, you will probably end up at the tail end and
+   have to wait a while.
+    1. Develop a recipe to reproduce the bug.
+       Bugs  we  can reproduce are likely to be fixed very quickly, often
+       within  days.  The most effective single thing you can do to get a
+       quick  fix  is  develop a way we can duplicate the bad behavior --
+       ideally,  by  giving  us source for a small, portable test program
+       that  breaks the library. (Even better is a keystroke recipe using
+       one of the test programs provided with the distribution.)
+    2. Try to reproduce the bug on a different terminal type.
+       In  our experience, most of the behaviors people report as library
+       bugs are actually due to subtle problems in terminal descriptions.
+       This  is  especially  likely  to  be  true  if  you  are  using  a
+       traditional  asynchronous  terminal or PC-based terminal emulator,
+       rather than xterm or a UNIX console entry.
+       It  is  therefore  extremely helpful if you can tell us whether or
+       not  your  problem reproduces on other terminal types. Usually you
+       will  have both a console type and xterm available; please tell us
+       whether or not your bug reproduces on both.
+       If  you  have  xterm  available,  it is also good to collect xterm
+       reports for different window sizes. This is especially true if you
+       normally  use  an unusual xterm window size -- a surprising number
+       of the bugs we have seen are either triggered or masked by these.
+    3. Generate and examine a trace file for the broken behavior.
+       Recompile   your  program  with  the  debugging  versions  of  the
+       libraries.  Insert  a  trace()  call  with  the  argument  set  to
+       TRACE_UPDATE.  (See "Writing Programs with NCURSES" for details on
+       trace  levels.) Reproduce your bug, then look at the trace file to
+       see what the library was actually doing.
+       Another  frequent  cause  of  apparent  bugs is application coding
+       errors  that  cause  the  wrong  things  to  be put on the virtual
+       screen. Looking at the virtual-screen dumps in the trace file will
+       tell  you  immediately if this is happening, and save you from the
+       possible  embarrassment of being told that the bug is in your code
+       and is your problem rather than ours.
+       If  the virtual-screen dumps look correct but the bug persists, it
+       is  possible  to  crank  up  the trace level to give more and more
+       information  about  the  library's  update actions and the control
+       sequences  it  issues  to  perform them. The test directory of the
+       distribution contains a tool for digesting these logs to make them
+       less tedious to wade through.
+       Often  you  will  find terminfo problems at this stage by noticing
+       that  the  escape  sequences  put out for various capabilities are
+       wrong.  If  not,  you  are  likely  to  learn enough to be able to
+       characterize any bug in the screen-update logic quite exactly.
+    4. Report details and symptoms, not just interpretations.
+       If you do the preceding two steps, it is very likely that you will
+       discover the nature of the problem yourself and be able to send us
+       a  fix.  This  will  create happy feelings all around and earn you
+       good karma for the first time you run into a bug you really cannot
+       characterize and fix yourself.
+       If  you  are  still stuck, at least you will know what to tell us.
+       Remember,  we  need  details.  If  you guess about what is safe to
+       leave out, you are too likely to be wrong.
+       If  your  bug  produces a bad update, include a trace file. Try to
+       make  the  trace  at the least voluminous level that pins down the
+       bug.  Logs  that  have been through tracemunch are OK, it does not
+       throw   away  any  information  (actually  they  are  better  than
+       un-munched ones because they are easier to read).
+       If  your bug produces a core-dump, please include a symbolic stack
+       trace generated by gdb(1) or your local equivalent.
+       Tell  us about every terminal on which you have reproduced the bug
+       --  and  every  terminal  on  which  you  cannot. Ideally, send us
+       terminfo sources for all of these (yours might differ from ours).
+       Include  your ncurses version and your OS/machine type, of course!
+       You can find your ncurses version in the curses.h file.
+
+   If  your  problem  smells  like a logic error or in cursor movement or
+   scrolling  or a bad capability, there are a couple of tiny test frames
+   for  the  library  algorithms in the progs directory that may help you
+   isolate  it. These are not part of the normal build, but do have their
+   own make productions.
+
+   The   most  important  of  these  is  mvcur,  a  test  frame  for  the
+   cursor-movement  optimization  code.  With  this  program, you can see
+   directly  what  control sequences will be emitted for any given cursor
+   movement or scroll/insert/delete operations. If you think you have got
+   a  bad  capability  identified, you can disable it and test again. The
+   program is command-driven and has on-line help.
+
+   If  you think the vertical-scroll optimization is broken, or just want
+   to  understand  how it works better, build hashmap and read the header
+   comments  of hardscroll.c and hashmap.c; then try it out. You can also
+   test the hardware-scrolling optimization separately with hardscroll.
+
+A Tour of the Ncurses Library
+
+  Library Overview
+
+   Most  of  the  library is superstructure -- fairly trivial convenience
+   interfaces  to a small set of basic functions and data structures used
+   to  manipulate  the  virtual  screen (in particular, none of this code
+   does  any  I/O  except  through  calls  to  more  fundamental  modules
+   described below). The files
+
+     lib_addch.c    lib_bkgd.c    lib_box.c    lib_chgat.c   lib_clear.c
+     lib_clearok.c  lib_clrbot.c  lib_clreol.c lib_colorset.c lib_data.c
+     lib_delch.c    lib_delwin.c    lib_echo.c   lib_erase.c   lib_gen.c
+     lib_getstr.c  lib_hline.c  lib_immedok.c  lib_inchstr.c lib_insch.c
+     lib_insdel.c  lib_insstr.c lib_instr.c lib_isendwin.c lib_keyname.c
+     lib_leaveok.c   lib_move.c   lib_mvwin.c   lib_overlay.c  lib_pad.c
+     lib_printw.c  lib_redrawln.c  lib_scanw.c lib_screen.c lib_scroll.c
+     lib_scrollok.c      lib_scrreg.c      lib_set_term.c      lib_slk.c
+     lib_slkatr_set.c   lib_slkatrof.c   lib_slkatron.c  lib_slkatrset.c
+     lib_slkattr.c     lib_slkclear.c    lib_slkcolor.c    lib_slkinit.c
+     lib_slklab.c  lib_slkrefr.c lib_slkset.c lib_slktouch.c lib_touch.c
+     lib_unctrl.c lib_vline.c lib_wattroff.c lib_wattron.c lib_window.c
+
+   are  all  in  this  category.  They  are very unlikely to need change,
+   barring bugs or some fundamental reorganization in the underlying data
+   structures.
+
+   These files are used only for debugging support:
+
+     lib_trace.c     lib_traceatr.c    lib_tracebits.c    lib_tracechr.c
+     lib_tracedmp.c lib_tracemse.c trace_buf.c
+
+   It  is  rather unlikely you will ever need to change these, unless you
+   want to introduce a new debug trace level for some reason.
+
+   There  is  another  group  of  files  that  do direct I/O via tputs(),
+   computations  on  the  terminal  capabilities,  or  queries  to the OS
+   environment,  but  nevertheless have only fairly low complexity. These
+   include:
+
+     lib_acs.c   lib_beep.c   lib_color.c   lib_endwin.c   lib_initscr.c
+     lib_longname.c  lib_newterm.c  lib_options.c lib_termcap.c lib_ti.c
+     lib_tparm.c lib_tputs.c lib_vidattr.c read_entry.c.
+
+   They are likely to need revision only if ncurses is being ported to an
+   environment without an underlying terminfo capability representation.
+
+   These  files  have  serious  hooks  into  the  tty  driver  and signal
+   facilities:
+
+     lib_kernel.c lib_baudrate.c lib_raw.c lib_tstp.c lib_twait.c
+
+   If you run into porting snafus moving the package to another UNIX, the
+   problem  is  likely  to be in one of these files. The file lib_print.c
+   uses sleep(2) and also falls in this category.
+
+   Almost all of the real work is done in the files
+
+     hardscroll.c   hashmap.c   lib_addch.c  lib_doupdate.c  lib_getch.c
+     lib_mouse.c lib_mvcur.c lib_refresh.c lib_setup.c lib_vidattr.c
+
+   Most  of  the  algorithmic  complexity  in  the library lives in these
+   files.  If there is a real bug in ncurses itself, it is probably here.
+   We  will  tour  some  of  these  files in detail below (see The Engine
+   Room).
+
+   Finally,  there  is  a  group  of  files  that is actually most of the
+   terminfo  compiler.  The reason this code lives in the ncurses library
+   is to support fallback to /etc/termcap. These files include
+
+     alloc_entry.c  captoinfo.c  comp_captab.c  comp_error.c comp_hash.c
+     comp_parse.c comp_scan.c parse_entry.c read_termcap.c write_entry.c
+
+   We will discuss these in the compiler tour.
+
+  The Engine Room
+
+    Keyboard Input
+
+   All  ncurses  input  funnels through the function wgetch(), defined in
+   lib_getch.c.  This function is tricky; it has to poll for keyboard and
+   mouse  events and do a running match of incoming input against the set
+   of defined special keys.
+
+   The  central  data  structure  in this module is a FIFO queue, used to
+   match   multiple-character   input   sequences   against   special-key
+   capabilities; also to implement pushback via ungetch().
+
+   The wgetch() code distinguishes between function key sequences and the
+   same  sequences  typed manually by doing a timed wait after each input
+   character  that  could  lead  a  function  key sequence. If the entire
+   sequence  takes  less  than  1  second,  it  is  assumed  to have been
+   generated by a function key press.
+
+   Hackers  bruised  by  previous encounters with variant select(2) calls
+   may  find  the  code  in  lib_twait.c  interesting.  It deals with the
+   problem  that  some  BSD  selects  do  not return a reliable time-left
+   value.  The  function  timed_wait()  effectively  simulates a System V
+   select.
+
+    Mouse Events
+
+   If the mouse interface is active, wgetch() polls for mouse events each
+   call,  before  it  goes  to  the  keyboard  for  input.  It  is  up to
+   lib_mouse.c how the polling is accomplished; it may vary for different
+   devices.
+
+   Under  xterm,  however,  mouse  event  notifications  come  in via the
+   keyboard  input  stream.  They  are  recognized  by  having  the kmous
+   capability  as a prefix. This is kind of klugey, but trying to wire in
+   recognition   of   a  mouse  key  prefix  without  going  through  the
+   function-key  machinery  would be just too painful, and this turns out
+   to  imply having the prefix somewhere in the function-key capabilities
+   at terminal-type initialization.
+
+   This  kluge  only  works  because  kmous  is  not actually used by any
+   historic terminal type or curses implementation we know of. Best guess
+   is  it  is  a relic of some forgotten experiment in-house at Bell Labs
+   that  did  not  leave  any traces in the publicly-distributed System V
+   terminfo  files.  If System V or XPG4 ever gets serious about using it
+   again, this kluge may have to change.
+
+   Here are some more details about mouse event handling:
+
+   The  lib_mouse()  code  is  logically  split  into  a lower level that
+   accepts  event reports in a device-dependent format and an upper level
+   that  parses  mouse  gestures  and  filters events. The mediating data
+   structure is a circular queue of event structures.
+
+   Functionally, the lower level's job is to pick up primitive events and
+   put  them  on  the circular queue. This can happen in one of two ways:
+   either  (a)  _nc_mouse_event()  detects  a  series  of  incoming mouse
+   reports  and queues them, or (b) code in lib_getch.c detects the kmous
+   prefix  in  the  keyboard  input  stream and calls _nc_mouse_inline to
+   queue up a series of adjacent mouse reports.
+
+   In either case, _nc_mouse_parse() should be called after the series is
+   accepted to parse the digested mouse reports (low-level events) into a
+   gesture (a high-level or composite event).
+
+    Output and Screen Updating
+
+   With the single exception of character echoes during a wgetnstr() call
+   (which  simulates  cooked-mode line editing in an ncurses window), the
+   library normally does all its output at refresh time.
+
+   The  main  job  is  to  go  from  the  current state of the screen (as
+   represented  in  the curscr window structure) to the desired new state
+   (as represented in the newscr window structure), while doing as little
+   I/O as possible.
+
+   The  brains  of this operation are the modules hashmap.c, hardscroll.c
+   and  lib_doupdate.c; the latter two use lib_mvcur.c. Essentially, what
+   happens looks like this:
+     * The  hashmap.c  module  tries  to  detect  vertical motion changes
+       between   the  real  and  virtual  screens.  This  information  is
+       represented by the oldindex members in the newscr structure. These
+       are modified by vertical-motion and clear operations, and both are
+       re-initialized  after  each  update.  To  this  change-journalling
+       information,  the  hashmap  code  adds  deductions  made  using  a
+       modified  Heckel  algorithm on hash values generated from the line
+       contents.
+     * The  hardscroll.c  module  computes  an  optimum  set  of  scroll,
+       insertion,  and  deletion operations to make the indices match. It
+       calls _nc_mvcur_scrolln() in lib_mvcur.c to do those motions.
+     * Then  lib_doupdate.c  goes  to work. Its job is to do line-by-line
+       transformations  of curscr lines to newscr lines. Its main tool is
+       the   routine   mvcur()   in   lib_mvcur.c.   This   routine  does
+       cursor-movement  optimization, attempting to get from given screen
+       location  A  to  given  location B in the fewest output characters
+       possible.
+
+   If  you  want to work on screen optimizations, you should use the fact
+   that  (in  the  trace-enabled  version  of  the  library) enabling the
+   TRACE_TIMES  trace  level  causes  a  report  to be emitted after each
+   screen  update  giving  the  elapsed  time  and  a count of characters
+   emitted  during  the  update.  You can use this to tell when an update
+   optimization improves efficiency.
+
+   In  the  trace-enabled  version of the library, it is also possible to
+   disable and re-enable various optimizations at runtime by tweaking the
+   variable  _nc_optimize_enable.  See  the  file include/curses.h.in for
+   mask values, near the end.
+
+The Forms and Menu Libraries
+
+   The  forms  and menu libraries should work reliably in any environment
+   you  can  port ncurses to. The only portability issue anywhere in them
+   is  what  flavor  of  regular expressions the built-in form field type
+   TYPE_REGEXP will recognize.
+
+   The  configuration  code  prefers the POSIX regex facility, modeled on
+   System  V's,  but  will  settle  for  BSD regexps if the former is not
+   available.
+
+   Historical  note:  the  panels code was written primarily to assist in
+   porting  u386mon  2.0 (comp.sources.misc v14i001-4) to systems lacking
+   panels  support; u386mon 2.10 and beyond use it. This version has been
+   slightly cleaned up for ncurses.
+
+A Tour of the Terminfo Compiler
+
+   The ncurses implementation of tic is rather complex internally; it has
+   to  do  a  trying  combination  of missions. This starts with the fact
+   that,  in  addition  to  its normal duty of compiling terminfo sources
+   into  loadable  terminfo binaries, it has to be able to handle termcap
+   syntax and compile that too into terminfo entries.
+
+   The  implementation  therefore  starts  with a table-driven, dual-mode
+   lexical analyzer (in comp_scan.c). The lexer chooses its mode (termcap
+   or terminfo) based on the first "," or ":" it finds in each entry. The
+   lexer  does  all  the work of recognizing capability names and values;
+   the  grammar above it is trivial, just "parse entries till you run out
+   of file".
+
+  Translation of Non-use Capabilities
+
+   Translation   of  most  things  besides  use  capabilities  is  pretty
+   straightforward.   The   lexical   analyzer's   tokenizer  hands  each
+   capability  name  to a hash function, which drives a table lookup. The
+   table entry yields an index which is used to look up the token type in
+   another table, and controls interpretation of the value.
+
+   One  possibly  interesting aspect of the implementation is the way the
+   compiler  tables  are  initialized.  All  the  tables are generated by
+   various  awk/sed/sh  scripts  from  a master table include/Caps; these
+   scripts  actually  write  C  initializers  which  are  linked  to  the
+   compiler. Furthermore, the hash table is generated in the same way, so
+   it  doesn't  have  to  be  generated at compiler startup time (another
+   benefit  of  this  organization  is  that  the  hash  table  can be in
+   shareable text space).
+
+   Thus, adding a new capability is usually pretty trivial, just a matter
+   of  adding one line to the include/Caps file. We will have more to say
+   about this in the section on Source-Form Translation.
+
+  Use Capability Resolution
+
+   The  background  problem  that  makes tic tricky is not the capability
+   translation  itself,  it  is the resolution of use capabilities. Older
+   versions would not handle forward use references for this reason (that
+   is, a using terminal always had to follow its use target in the source
+   file).  By  doing  this,  they  got  away with a simple implementation
+   tactic;  compile  everything  as  it  blows by, then resolve uses from
+   compiled entries.
+
+   This  will  not  do  for  ncurses.  The problem is that that the whole
+   compilation  process  has  to  be embeddable in the ncurses library so
+   that it can be called by the startup code to translate termcap entries
+   on  the  fly.  The  embedded  version  cannot go promiscuously writing
+   everything  it  translates  out  to  disk  --  for  one thing, it will
+   typically be running with non-root permissions.
+
+   So  our  tic  is  designed  to  parse  an  entire terminfo file into a
+   doubly-linked  circular  list of entry structures in-core, and then do
+   use  resolution  in-memory  before writing everything out. This design
+   has other advantages: it makes forward and back use-references equally
+   easy  (so  we get the latter for free), and it makes checking for name
+   collisions before they are written out easy to do.
+
+   And   this  is  exactly  how  the  embedded  version  works.  But  the
+   stand-alone  user-accessible  version  of  tic  partly  reverts to the
+   historical strategy; it writes to disk (not keeping in core) any entry
+   with no use references.
+
+   This  is  strictly  a  core-economy  kluge,  implemented  because  the
+   terminfo  master file is large enough that some core-poor systems swap
+   like crazy when you compile it all in memory...there have been reports
+   of  this process taking three hours, rather than the twenty seconds or
+   less typical on the author's development box.
+
+   So. The executable tic passes the entry-parser a hook that immediately
+   writes  out  the  referenced  entry if it has no use capabilities. The
+   compiler  main loop refrains from adding the entry to the in-core list
+   when  this hook fires. If some other entry later needs to reference an
+   entry  that  got  written immediately, that is OK; the resolution code
+   will fetch it off disk when it cannot find it in core.
+
+   Name  collisions  will  still  be  detected,  just not as cleanly. The
+   write_entry()   code   complains  before  overwriting  an  entry  that
+   postdates  the time of tic's first call to write_entry(), Thus it will
+   complain  about overwriting entries newly made during the tic run, but
+   not about overwriting ones that predate it.
+
+  Source-Form Translation
+
+   Another use of tic is to do source translation between various termcap
+   and terminfo formats. There are more variants out there than you might
+   think; the ones we know about are described in the captoinfo(1) manual
+   page.
+
+   The  translation output code (dump_entry() in ncurses/dump_entry.c) is
+   shared  with  the  infocmp(1)  utility.  It  takes  the  same internal
+   representation  used  to  generate  the  binary  form  and dumps it to
+   standard output in a specified format.
+
+   The  include/Caps  file  has  a header comment describing ways you can
+   specify  source  translations  for  nonstandard  capabilities  just by
+   altering  the  master  table.  It  is  possible  to  set up capability
+   aliasing  or  tell  the  compiler  to  plain ignore a given capability
+   without writing any C code at all.
+
+   For  circumstances where you need to do algorithmic translation, there
+   are  functions  in  parse_entry.c called after the parse of each entry
+   that are specifically intended to encapsulate such translations. This,
+   for  example,  is  where  the AIX box1 capability get translated to an
+   acsc string.
+
+Other Utilities
+
+   The  infocmp  utility  is just a wrapper around the same entry-dumping
+   code  used  by tic for source translation. Perhaps the one interesting
+   aspect  of  the  code  is the use of a predicate function passed in to
+   dump_entry()  to  control  which  capabilities  are  dumped.  This  is
+   necessary in order to handle both the ordinary De-compilation case and
+   entry difference reporting.
+
+   The  tput  and  clear  utilities  just  do an entry load followed by a
+   tputs() of a selected capability.
+
+Style Tips for Developers
+
+   See   the  TO-DO  file  in  the  top-level  directory  of  the  source
+   distribution for additions that would be particularly useful.
+
+   The  prefix  _nc_  should be used on library public functions that are
+   not  part  of  the  curses  API  in  order to prevent pollution of the
+   application  namespace.  If  you have to add to or modify the function
+   prototypes  in curses.h.in, read ncurses/MKlib_gen.sh first so you can
+   avoid  breaking XSI conformance. Please join the ncurses mailing list.
+   See  the INSTALL file in the top level of the distribution for details
+   on the list.
+
+   Look  for  the  string  FIXME  in  source  files to tag minor bugs and
+   potential problems that could use fixing.
+
+   Do  not try to auto-detect OS features in the main body of the C code.
+   That is the job of the configuration system.
+
+   To hold down complexity, do make your code data-driven. Especially, if
+   you  can drive logic from a table filtered out of include/Caps, do it.
+   If  you  find  you  need  to augment the data in that file in order to
+   generate  the proper table, that is still preferable to ad-hoc code --
+   that is why the fifth field (flags) is there.
+
+   Have fun!
+
+Porting Hints
+
+   The  following  notes  are intended to be a first step towards DOS and
+   Macintosh ports of the ncurses libraries.
+
+   The  following library modules are "pure curses"; they operate only on
+   the  curses  internal  structures,  do all output through other curses
+   calls  (not  including  tputs()  and putp()) and do not call any other
+   UNIX  routines  such  as  signal(2)  or  the stdio library. Thus, they
+   should not need to be modified for single-terminal ports.
+
+     lib_addch.c    lib_addstr.c    lib_bkgd.c   lib_box.c   lib_clear.c
+     lib_clrbot.c   lib_clreol.c  lib_delch.c  lib_delwin.c  lib_erase.c
+     lib_inchstr.c  lib_insch.c  lib_insdel.c lib_insstr.c lib_keyname.c
+     lib_move.c   lib_mvwin.c   lib_newwin.c   lib_overlay.c   lib_pad.c
+     lib_printw.c  lib_refresh.c  lib_scanw.c  lib_scroll.c lib_scrreg.c
+     lib_set_term.c  lib_touch.c  lib_tparm.c  lib_tputs.c  lib_unctrl.c
+     lib_window.c panel.c
+
+   This module is pure curses, but calls outstr():
+
+     lib_getstr.c
+
+   These  modules  are  pure  curses,  except  that  they use tputs() and
+   putp():
+
+     lib_beep.c   lib_color.c   lib_endwin.c   lib_options.c   lib_slk.c
+     lib_vidattr.c
+
+   This modules assist in POSIX emulation on non-POSIX systems:
+
+   sigaction.c
+          signal calls
+
+   The    following   source   files   will   not   be   needed   for   a
+   single-terminal-type port.
+
+     alloc_entry.c   captoinfo.c   clear.c   comp_captab.c  comp_error.c
+     comp_hash.c   comp_main.c   comp_parse.c  comp_scan.c  dump_entry.c
+     infocmp.c parse_entry.c read_entry.c tput.c write_entry.c
+
+   The  following  modules will use open()/read()/write()/close()/lseek()
+   on files, but no other OS calls.
+
+   lib_screen.c
+          used to read/write screen dumps
+
+   lib_trace.c
+          used to write trace data to the logfile
+
+   Modules that would have to be modified for a port start here:
+
+   The  following  modules  are  "pure  curses"  but  contain assumptions
+   inappropriate for a memory-mapped port.
+
+   lib_longname.c
+          assumes there may be multiple terminals
+
+   lib_acs.c
+          assumes acs_map as a double indirection
+
+   lib_mvcur.c
+          assumes cursor moves have variable cost
+
+   lib_termcap.c
+          assumes there may be multiple terminals
+
+   lib_ti.c
+          assumes there may be multiple terminals
+
+   The following modules use UNIX-specific calls:
+
+   lib_doupdate.c
+          input checking
+
+   lib_getch.c
+          read()
+
+   lib_initscr.c
+          getenv()
+
+   lib_newterm.c
+   lib_baudrate.c
+   lib_kernel.c
+          various tty-manipulation and system calls
+
+   lib_raw.c
+          various tty-manipulation calls
+
+   lib_setup.c
+          various tty-manipulation calls
+
+   lib_restart.c
+          various tty-manipulation calls
+
+   lib_tstp.c
+          signal-manipulation calls
+
+   lib_twait.c
+          gettimeofday(), select().
+     _________________________________________________________________
+
+
+    Eric S. Raymond <esr@snark.thyrsus.com>
+
+   (Note: This is not the bug address!)
diff --git a/doc/html/Ada95.html b/doc/html/Ada95.html
new file mode 100644
index 0000000..1affa3f
--- /dev/null
+++ b/doc/html/Ada95.html
@@ -0,0 +1,344 @@
+<!--
+  $Id: Ada95.html,v 1.18 2022/03/05 16:09:29 tom Exp $
+  ****************************************************************************
+  * Copyright 2019-2021,2022 Thomas E. Dickey                                *
+  * Copyright 2000-2010,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.                                                           *
+  ****************************************************************************
+-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+
+<html>
+<head>
+  <meta name="generator" content=
+  "HTML Tidy for Linux (vers 25 March 2009), see www.w3.org">
+
+  <title>Ada95 Binding for ncurses</title>
+  <link rel="author" href="mailto:bug-ncurses@gnu.org">
+  <meta http-equiv="Content-Type" content=
+  "text/html; charset=us-ascii">
+</head>
+
+<body>
+  <h1>Ada95 Binding for ncurses</h1>
+
+  <p>by J&uuml;rgen Pfeifer.</p>
+  <hr>
+
+  <h2>General Remarks</h2>
+
+  <ul>
+    <li>This document describes Version 01.00 of the binding.</li>
+
+    <li>The functionality is modeled to be compatible with the
+    ncurses package, a clone of the SVr4 curses model.<br>
+    I did the development on an Intel box running the latest stable
+    release of <a href="http://www.linux.org">Linux</a>, ncurses
+    and the most recent released <a href="https://ftp.gnu.org/gnu/gcc/">GNU 
+    Ada Translator</a> gnat versions. For any older versions of
+    ncurses and gnat it is not guaranteed to work.</li>
+
+    <li>You must have the m4 macroprocessor to build this package.
+    If you don't have this program, you can get the FSF version
+    <a href="https://ftp.gnu.org/pub/gnu/">here</a>.</li>
+
+    <li>Ada programs are supposed to be readable. One of my
+    favorite methods to make code readable is to use expressive
+    names for the identifiers. You can find a list of a mapping of
+    the cryptic curses names to the Ada names in this <a href=
+    "ada/table.html">table</a>.</li>
+
+    <li>This is not a typical one-to-one interface mapping. It is
+    close to one-to-one on the functional level. Each (n)curses
+    function has its counterpart with a more or less similar
+    formal parameter list in the binding. It is not one-to-one with
+    respect to the datatypes. I tried to make records out of the
+    flat chtype and similar structures, so you don't have to do bit
+    operations to mark an attributed character as bold. Just make
+    the boolean member <strong>bold</strong> of the record true.
+    The binding also hides the structures like WINDOW, PANEL, MENU,
+    FORM etc. ! It is a pure functional API.</li>
+
+    <li>I try to do as much error checking as possible and feasible
+    in the binding. I will raise an Ada exception when something
+    went wrong in the low-level curses. This has the effect that -
+    at least first time in my life - (n)curses programs have now a
+    very rigid error checking, but - thanks to Ada - you don't have
+    to code the orgiastic error checking style of C.</li>
+
+    <li>Support for wide characters is currently not in the
+    binding, as it is not really in ncurses at this point in
+    time.</li>
+  </ul>
+
+  <h2>Limitations</h2>
+
+  <ul>
+    <li>I provide no SCREEN datatype and functions to set a new
+    screen. If you need this (mostly for debugging I guess), write
+    a small C routine doing all this and import it into your Ada
+    program.</li>
+
+    <li>I provide no functions to switch on/off curses tracing
+    options. Same suggestion as above.</li>
+
+    <li>Although Ada95 is an OO Language, this binding doesn't
+    provide an OO abstraction of the (n)curses functionality. As
+    mentioned above it is a thin binding for the (n)curses
+    functions. But without any doubt it would be nice to build on
+    top of this an OO abstraction of (n)curses functionality.<br>
+    The only exception is the method how fieldtypes are represented
+    in this Binding. We provide an abstract tagged type Field_Type
+    from which the various fieldtypes are derived.</li>
+
+    <li>I currently do not support the link_fieldtype functionality
+    of the forms subsystem.</li>
+
+    <li>The *_IO packages are currently output only.</li>
+  </ul>
+
+  <h2>Hierarchy of packages</h2>
+
+  <ul>
+    <li>
+      <a href=
+      "ada/terminal_interface__ads.htm">Terminal_Interface</a>
+
+      <ul>
+        <li>
+          <a href=
+          "ada/terminal_interface-curses__ads.htm">Curses</a>
+
+          <ul>
+            <li><a href=
+            "ada/terminal_interface-curses-mouse__ads.htm">Mouse</a></li>
+
+            <li>
+              <a href=
+              "ada/terminal_interface-curses-panels__ads.htm">Panels</a>
+
+              <ul>
+                <li><a href=
+                "ada/terminal_interface-curses-panels-user_data__ads.htm">
+                User_Data</a></li>
+              </ul>
+            </li>
+
+            <li>
+              <a href=
+              "ada/terminal_interface-curses-menus__ads.htm">Menus</a>
+
+              <ul>
+                <li><a href=
+                "ada/terminal_interface-curses-menus-menu_user_data__ads.htm">
+                Menu_User_Data</a></li>
+
+                <li><a href=
+                "ada/terminal_interface-curses-menus-item_user_data__ads.htm">
+                Item_User_Data</a></li>
+              </ul>
+            </li>
+
+            <li>
+              <a href=
+              "ada/terminal_interface-curses-forms__ads.htm">Forms</a>
+
+              <ul>
+                <li><a href=
+                "ada/terminal_interface-curses-forms-form_user_data__ads.htm">
+                Form_User_Data</a></li>
+
+                <li><a href=
+                "ada/terminal_interface-curses-forms-field_user_data__ads.htm">
+                Field_User_Data</a></li>
+
+                <li>
+                  <a href=
+                  "ada/terminal_interface-curses-forms-field_types__ads.htm">
+                  Field_Types</a>
+
+                  <ul>
+                    <li><a href=
+                    "ada/terminal_interface-curses-forms-field_types-alpha__ads.htm">
+                    Alpha</a></li>
+
+                    <li><a href=
+                    "ada/terminal_interface-curses-forms-field_types-alphanumeric__ads.htm">
+                    AlphaNumeric</a></li>
+
+                    <li><a href=
+                    "ada/terminal_interface-curses-forms-field_types-intfield__ads.htm">
+                    IntField</a></li>
+
+                    <li><a href=
+                    "ada/terminal_interface-curses-forms-field_types-numeric__ads.htm">
+                    Numeric</a></li>
+
+                    <li><a href=
+                    "ada/terminal_interface-curses-forms-field_types-regexp__ads.htm">
+                    RegExp</a></li>
+
+                    <li><a href=
+                    "ada/terminal_interface-curses-forms-field_types-ipv4_address__ads.htm">
+                    IPV4_Address</a></li>
+
+                    <li>
+                      <a href=
+                      "ada/terminal_interface-curses-forms-field_types-enumeration__ads.htm">
+                      Enumeration</a>
+
+                      <ul>
+                        <li><a href=
+                        "ada/terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm">
+                        Ada</a></li>
+                      </ul>
+                    </li>
+
+                    <li>
+                      <a href=
+                      "ada/terminal_interface-curses-forms-field_types-user__ads.htm">
+                      User</a>
+
+                      <ul>
+                        <li><a href=
+                        "ada/terminal_interface-curses-forms-field_types-user-choice__ads.htm">
+                        Choice</a></li>
+                      </ul>
+                    </li>
+                  </ul>
+                </li>
+              </ul>
+            </li>
+
+            <li>
+              <a href=
+              "ada/terminal_interface-curses-text_io__ads.htm">Text_IO</a>
+
+              <ul>
+                <li><a href=
+                "ada/terminal_interface-curses-text_io-integer_io__ads.htm">
+                Integer_IO</a></li>
+
+                <li><a href=
+                "ada/terminal_interface-curses-text_io-float_io__ads.htm">
+                Float_IO</a></li>
+
+                <li><a href=
+                "ada/terminal_interface-curses-text_io-fixed_io__ads.htm">
+                Fixed_IO</a></li>
+
+                <li><a href=
+                "ada/terminal_interface-curses-text_io-decimal_io__ads.htm">
+                Decimal_IO</a></li>
+
+                <li><a href=
+                "ada/terminal_interface-curses-text_io-modular_io__ads.htm">
+                Modular_IO</a></li>
+
+                <li><a href=
+                "ada/terminal_interface-curses-text_io-enumeration_io__ads.htm">
+                Enumeration_IO</a></li>
+
+                <li><a href=
+                "ada/terminal_interface-curses-text_io-complex_io__ads.htm">
+                Complex_IO</a></li>
+              </ul>
+            </li>
+          </ul>
+        </li>
+      </ul>
+    </li>
+  </ul>
+
+  <p>If you want to navigate through the html pages of the package
+  specs, click <a href="ada/index.htm">here</a>.</p>
+
+  <h2>Implementation Details</h2>
+
+  <h4>Behind the abstraction</h4>
+
+  <p>All the new types like <strong>Window</strong>,
+  <strong>Panel</strong>, <strong>Menu</strong>,
+  <strong>Form</strong> etc. are just opaque representations of the
+  pointers to the corresponding low level (n)curses structures like
+  <strong>WINDOW *</strong>, <strong>PANEL *</strong>, <strong>MENU
+  *</strong> or <strong>FORM *</strong>. So you can safely pass
+  them to C routines that expect a pointer to one of those
+  structures.</p>
+
+  <h4>Extended ripoffline() usage</h4>
+
+  <p>The official documentation of (n)curses says, that the line
+  parameter determines only whether or not exactly
+  <strong>one</strong> line is stolen from the top or bottom of the
+  screen. So essentially only the sign of the parameter is
+  evaluated. ncurses has internally implemented it in a way, that
+  uses the line parameter also to control the amount of lines to
+  steal. This mechanism is used in the
+  <strong>Rip_Off_Lines</strong> routine of the binding.</p>
+
+  <h4><a name="userpointer" id="userpointer">How user defined field
+  types work</a></h4>
+
+  <p>TBD</p>
+
+  <h4>Enumeration fields handling</h4>
+
+  <p>The (n)curses documentation says, that the String arrays to be
+  passed to an TYPE_ENUM fieldtype must not be automatic variables.
+  This is not true in this binding, because it is internally
+  arranged to safely copy these values.</p>
+
+  <h4><a name="compiler" id="compiler">Using other Ada
+  compilers</a></h4>
+
+  <p>This should basically not be a problem.</p>
+
+  <h4>Port to other curses implementations</h4>
+
+  <p>Basically it should not be too hard to make all this run on a
+  regular SVr4 implementation of curses. The problems are probably
+  these:<br></p>
+
+  <ul>
+    <li>ncurses has some additional features which are presented in
+    this binding. You have two choices to deal with this:
+
+      <ul>
+        <li>Emulate the feature in this binding</li>
+
+        <li>Raise an exception for non implemented features</li>
+      </ul>
+
+      <p>Most likely you will follow a mixed approach. Some
+      features are easy to simulate, others will be hard if not
+      impossible.</p>
+    </li>
+  </ul>
+
+  <p>I'm quite sure I forgot something.</p>
+</body>
+</html>
diff --git a/doc/html/NCURSES-Programming-HOWTO.html b/doc/html/NCURSES-Programming-HOWTO.html
new file mode 100644
index 0000000..2296cda
--- /dev/null
+++ b/doc/html/NCURSES-Programming-HOWTO.html
@@ -0,0 +1,7355 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
+"http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+  <meta name="generator" content=
+  "HTML Tidy for HTML5 for Linux version 5.6.0">
+  <title>NCURSES Programming HOWTO</title>
+  <meta name="GENERATOR" content=
+  "Modular DocBook HTML Stylesheet Version 1.79">
+</head>
+<body class="ARTICLE" bgcolor="#FFFFFF" text="#000000" link=
+"#0000FF" vlink="#840084" alink="#0000FF">
+  <div class="ARTICLE">
+    <div class="TITLEPAGE">
+      <h1 class="TITLE"><a name="AEN2" id="AEN2">NCURSES
+      Programming HOWTO</a></h1>
+
+      <h3 class="AUTHOR"><a name="AEN4" id="AEN4">Pradeep
+      Padala</a></h3>
+
+      <div class="AFFILIATION">
+        <div class="ADDRESS">
+          <p class="ADDRESS"><code class="EMAIL">&lt;<a href=
+          "mailto:ppadala@gmail.com">ppadala@gmail.com</a>&gt;</code>
+          </p>
+        </div>
+      </div>
+
+      <p class="PUBDATE">v1.9, 2005-06-20<br></p>
+
+      <div class="REVHISTORY">
+        <table width="100%" border="0" summary="revisions">
+          <tr>
+            <th align="left" valign="top" colspan="3"><b>Revision
+            History</b>
+            </th>
+          </tr>
+
+          <tr>
+            <td align="left">Revision 2.0</td>
+            <td align="left">2022-12-03</td>
+            <td align="left">Revised by: dickey</td>
+          </tr>
+
+          <tr>
+            <td align="left" colspan="3">Fixes for the sample
+            programs, Correct documentation errata.</td>
+          </tr>
+
+          <tr>
+            <td align="left">Revision 1.9</td>
+            <td align="left">2005-06-20</td>
+            <td align="left">Revised by: ppadala</td>
+          </tr>
+
+          <tr>
+            <td align="left" colspan="3">The license has been
+            changed to the MIT-style license used by NCURSES. Note
+            that the programs are also re-licensed under this.</td>
+          </tr>
+
+          <tr>
+            <td align="left">Revision 1.8</td>
+            <td align="left">2005-06-17</td>
+            <td align="left">Revised by: ppadala</td>
+          </tr>
+
+          <tr>
+            <td align="left" colspan="3">Lots of updates. Added
+            references and perl examples. Changes to examples. Many
+            grammatical and stylistic changes to the content.
+            Changes to NCURSES history.</td>
+          </tr>
+
+          <tr>
+            <td align="left">Revision 1.7.1</td>
+            <td align="left">2002-06-25</td>
+            <td align="left">Revised by: ppadala</td>
+          </tr>
+
+          <tr>
+            <td align="left" colspan="3">Added a README file for
+            building and instructions for building from
+            source.</td>
+          </tr>
+
+          <tr>
+            <td align="left">Revision 1.7</td>
+            <td align="left">2002-06-25</td>
+            <td align="left">Revised by: ppadala</td>
+          </tr>
+
+          <tr>
+            <td align="left" colspan="3">Added "Other formats"
+            section and made a lot of fancy changes to the
+            programs. Inlining of programs is gone.</td>
+          </tr>
+
+          <tr>
+            <td align="left">Revision 1.6.1</td>
+            <td align="left">2002-02-24</td>
+            <td align="left">Revised by: ppadala</td>
+          </tr>
+
+          <tr>
+            <td align="left" colspan="3">Removed the old Changelog
+            section, cleaned the makefiles</td>
+          </tr>
+
+          <tr>
+            <td align="left">Revision 1.6</td>
+            <td align="left">2002-02-16</td>
+            <td align="left">Revised by: ppadala</td>
+          </tr>
+
+          <tr>
+            <td align="left" colspan="3">Corrected a lot of
+            spelling mistakes, added ACS variables section</td>
+          </tr>
+
+          <tr>
+            <td align="left">Revision 1.5</td>
+            <td align="left">2002-01-05</td>
+            <td align="left">Revised by: ppadala</td>
+          </tr>
+
+          <tr>
+            <td align="left" colspan="3">Changed structure to
+            present proper TOC</td>
+          </tr>
+
+          <tr>
+            <td align="left">Revision 1.3.1</td>
+            <td align="left">2001-07-26</td>
+            <td align="left">Revised by: ppadala</td>
+          </tr>
+
+          <tr>
+            <td align="left" colspan="3">Corrected maintainers
+            paragraph, Corrected stable release number</td>
+          </tr>
+
+          <tr>
+            <td align="left">Revision 1.3</td>
+            <td align="left">2001-07-24</td>
+            <td align="left">Revised by: ppadala</td>
+          </tr>
+
+          <tr>
+            <td align="left" colspan="3">Added copyright notices to
+            main document (LDP license) and programs (GPL),
+            Corrected printw_example.</td>
+          </tr>
+
+          <tr>
+            <td align="left">Revision 1.2</td>
+            <td align="left">2001-06-05</td>
+            <td align="left">Revised by: ppadala</td>
+          </tr>
+
+          <tr>
+            <td align="left" colspan="3">Incorporated ravi's
+            changes. Mainly to introduction, menu, form, justforfun
+            sections</td>
+          </tr>
+
+          <tr>
+            <td align="left">Revision 1.1</td>
+            <td align="left">2001-05-22</td>
+            <td align="left">Revised by: ppadala</td>
+          </tr>
+
+          <tr>
+            <td align="left" colspan="3">Added "a word about
+            window" section, Added scanw_example.</td>
+          </tr>
+        </table>
+      </div>
+
+      <div>
+        <div class="ABSTRACT">
+          <a name="AEN72" id="AEN72"></a>
+          <p><span class="emphasis"><i class="EMPHASIS">This
+          document is intended to be an "All in One" guide for
+          programming with ncurses and its sister libraries. We
+          graduate from a simple "Hello World" program to more
+          complex form manipulation. No prior experience in ncurses
+          is assumed. Send comments to <a href=
+          "mailto:ppadala@gmail.com" target="_top">this
+          address</a></i></span>
+          </p>
+        </div>
+      </div>
+
+      <hr>
+    </div>
+
+    <div class="TOC">
+      <dl>
+        <dt><b>Table of Contents</b>
+        </dt>
+
+        <dt>1. <a href="#INTRO">Introduction</a></dt>
+
+        <dd>
+          <dl>
+            <dt>1.1. <a href="#WHATIS">What is NCURSES?</a></dt>
+
+            <dt>1.2. <a href="#WHATCANWEDO">What we can do with
+            NCURSES</a></dt>
+
+            <dt>1.3. <a href="#WHERETOGETIT">Where to get
+            it</a></dt>
+
+            <dt>1.4. <a href="#PURPOSE">Purpose/Scope of the
+            document</a></dt>
+
+            <dt>1.5. <a href="#ABOUTPROGRAMS">About the
+            Programs</a></dt>
+
+            <dt>1.6. <a href="#OTHERFORMATS">Other Formats of the
+            document</a></dt>
+
+            <dd>
+              <dl>
+                <dt>1.6.1. <a href="#LISTFORMATS">Readily available
+                formats from tldp.org</a></dt>
+
+                <dt>1.6.2. <a href="#BUILDSOURCE">Building from
+                source</a></dt>
+              </dl>
+            </dd>
+
+            <dt>1.7. <a href="#CREDITS">Credits</a></dt>
+
+            <dt>1.8. <a href="#WISHLIST">Wish List</a></dt>
+
+            <dt>1.9. <a href="#COPYRIGHT">Copyright</a></dt>
+          </dl>
+        </dd>
+
+        <dt>2. <a href="#HELLOWORLD">Hello World !!!</a></dt>
+
+        <dd>
+          <dl>
+            <dt>2.1. <a href="#COMPILECURSES">Compiling With the
+            NCURSES Library</a></dt>
+
+            <dt>2.2. <a href="#DISSECTION">Dissection</a></dt>
+
+            <dd>
+              <dl>
+                <dt>2.2.1. <a href="#ABOUT-INITSCR">About
+                initscr()</a></dt>
+
+                <dt>2.2.2. <a href="#MYST-REFRESH">The mysterious
+                refresh()</a></dt>
+
+                <dt>2.2.3. <a href="#ABOUT-ENDWIN">About
+                endwin()</a></dt>
+              </dl>
+            </dd>
+          </dl>
+        </dd>
+
+        <dt>3. <a href="#GORY">The Gory Details</a></dt>
+
+        <dt>4. <a href="#INIT">Initialization</a></dt>
+
+        <dd>
+          <dl>
+            <dt>4.1. <a href="#ABOUTINIT">Initialization
+            functions</a></dt>
+
+            <dt>4.2. <a href="#RAWCBREAK">raw() and
+            cbreak()</a></dt>
+
+            <dt>4.3. <a href="#ECHONOECHO">echo() and
+            noecho()</a></dt>
+
+            <dt>4.4. <a href="#KEYPAD">keypad()</a></dt>
+
+            <dt>4.5. <a href="#HALFDELAY">halfdelay()</a></dt>
+
+            <dt>4.6. <a href="#MISCINIT">Miscellaneous
+            Initialization functions</a></dt>
+
+            <dt>4.7. <a href="#INITEX">An Example</a></dt>
+          </dl>
+        </dd>
+
+        <dt>5. <a href="#AWORDWINDOWS">A Word about
+        Windows</a></dt>
+
+        <dt>6. <a href="#PRINTW">Output functions</a></dt>
+
+        <dd>
+          <dl>
+            <dt>6.1. <a href="#ADDCHCLASS">addch() class of
+            functions</a></dt>
+
+            <dt>6.2. <a href="#AEN303">mvaddch(), waddch() and
+            mvwaddch()</a></dt>
+
+            <dt>6.3. <a href="#PRINTWCLASS">printw() class of
+            functions</a></dt>
+
+            <dd>
+              <dl>
+                <dt>6.3.1. <a href="#PRINTWMVPRINTW">printw() and
+                mvprintw</a></dt>
+
+                <dt>6.3.2. <a href="#WPRINTWMVWPRINTW">wprintw()
+                and mvwprintw</a></dt>
+
+                <dt>6.3.3. <a href="#VWPRINTW">vw_printw()</a></dt>
+
+                <dt>6.3.4. <a href="#SIMPLEPRINTWEX">A Simple
+                printw example</a></dt>
+              </dl>
+            </dd>
+
+            <dt>6.4. <a href="#ADDSTRCLASS">addstr() class of
+            functions</a></dt>
+
+            <dt>6.5. <a href="#ACAUTION">A word of caution</a></dt>
+          </dl>
+        </dd>
+
+        <dt>7. <a href="#SCANW">Input functions</a></dt>
+
+        <dd>
+          <dl>
+            <dt>7.1. <a href="#GETCHCLASS">getch() class of
+            functions</a></dt>
+
+            <dt>7.2. <a href="#SCANWCLASS">scanw() class of
+            functions</a></dt>
+
+            <dd>
+              <dl>
+                <dt>7.2.1. <a href="#SCANWMVSCANW">scanw() and
+                mvscanw</a></dt>
+
+                <dt>7.2.2. <a href="#WSCANWMVWSCANW">wscanw() and
+                mvwscanw()</a></dt>
+
+                <dt>7.2.3. <a href="#VWSCANW">vw_scanw()</a></dt>
+              </dl>
+            </dd>
+
+            <dt>7.3. <a href="#GETSTRCLASS">getstr() class of
+            functions</a></dt>
+
+            <dt>7.4. <a href="#GETSTREX">Some examples</a></dt>
+          </dl>
+        </dd>
+
+        <dt>8. <a href="#ATTRIB">Attributes</a></dt>
+
+        <dd>
+          <dl>
+            <dt>8.1. <a href="#ATTRIBDETAILS">The details</a></dt>
+
+            <dt>8.2. <a href="#ATTRONVSATTRSET">attron() vs
+            attrset()</a></dt>
+
+            <dt>8.3. <a href="#ATTRGET">attr_get()</a></dt>
+
+            <dt>8.4. <a href="#ATTRFUNCS">attr_ functions</a></dt>
+
+            <dt>8.5. <a href="#WATTRFUNCS">wattr functions</a></dt>
+
+            <dt>8.6. <a href="#CHGAT">chgat() functions</a></dt>
+          </dl>
+        </dd>
+
+        <dt>9. <a href="#WINDOWS">Windows</a></dt>
+
+        <dd>
+          <dl>
+            <dt>9.1. <a href="#WINDOWBASICS">The basics</a></dt>
+
+            <dt>9.2. <a href="#LETBEWINDOW">Let there be a Window
+            !!!</a></dt>
+
+            <dt>9.3. <a href="#BORDEREXEXPL">Explanation</a></dt>
+
+            <dt>9.4. <a href="#OTHERSTUFF">The other stuff in the
+            example</a></dt>
+
+            <dt>9.5. <a href="#OTHERBORDERFUNCS">Other Border
+            functions</a></dt>
+          </dl>
+        </dd>
+
+        <dt>10. <a href="#COLOR">Colors</a></dt>
+
+        <dd>
+          <dl>
+            <dt>10.1. <a href="#COLORBASICS">The basics</a></dt>
+
+            <dt>10.2. <a href="#CHANGECOLORDEFS">Changing Color
+            Definitions</a></dt>
+
+            <dt>10.3. <a href="#COLORCONTENT">Color
+            Content</a></dt>
+          </dl>
+        </dd>
+
+        <dt>11. <a href="#KEYS">Interfacing with the key
+        board</a></dt>
+
+        <dd>
+          <dl>
+            <dt>11.1. <a href="#KEYSBASICS">The Basics</a></dt>
+
+            <dt>11.2. <a href="#SIMPLEKEYEX">A Simple Key Usage
+            example</a></dt>
+          </dl>
+        </dd>
+
+        <dt>12. <a href="#MOUSE">Interfacing with the
+        mouse</a></dt>
+
+        <dd>
+          <dl>
+            <dt>12.1. <a href="#MOUSEBASICS">The Basics</a></dt>
+
+            <dt>12.2. <a href="#GETTINGEVENTS">Getting the
+            events</a></dt>
+
+            <dt>12.3. <a href="#MOUSETOGETHER">Putting it all
+            Together</a></dt>
+
+            <dt>12.4. <a href="#MISCMOUSEFUNCS">Miscellaneous
+            Functions</a></dt>
+          </dl>
+        </dd>
+
+        <dt>13. <a href="#SCREEN">Screen Manipulation</a></dt>
+
+        <dd>
+          <dl>
+            <dt>13.1. <a href="#GETYX">getyx() functions</a></dt>
+
+            <dt>13.2. <a href="#SCREENDUMP">Screen Dumping</a></dt>
+
+            <dt>13.3. <a href="#WINDOWDUMP">Window Dumping</a></dt>
+          </dl>
+        </dd>
+
+        <dt>14. <a href="#MISC">Miscellaneous features</a></dt>
+
+        <dd>
+          <dl>
+            <dt>14.1. <a href="#CURSSET">curs_set()</a></dt>
+
+            <dt>14.2. <a href="#TEMPLEAVE">Temporarily Leaving
+            Curses mode</a></dt>
+
+            <dt>14.3. <a href="#ACSVARS">ACS_ variables</a></dt>
+          </dl>
+        </dd>
+
+        <dt>15. <a href="#OTHERLIB">Other libraries</a></dt>
+
+        <dt>16. <a href="#PANELS">Panel Library</a></dt>
+
+        <dd>
+          <dl>
+            <dt>16.1. <a href="#PANELBASICS">The Basics</a></dt>
+
+            <dt>16.2. <a href="#COMPILEPANELS">Compiling With the
+            Panels Library</a></dt>
+
+            <dt>16.3. <a href="#PANELBROWSING">Panel Window
+            Browsing</a></dt>
+
+            <dt>16.4. <a href="#USERPTRUSING">Using User
+            Pointers</a></dt>
+
+            <dt>16.5. <a href="#PANELMOVERESIZE">Moving and
+            Resizing Panels</a></dt>
+
+            <dt>16.6. <a href="#PANELSHOWHIDE">Hiding and Showing
+            Panels</a></dt>
+
+            <dt>16.7. <a href="#PANELABOVE">panel_above() and
+            panel_below() Functions</a></dt>
+          </dl>
+        </dd>
+
+        <dt>17. <a href="#MENUS">Menus Library</a></dt>
+
+        <dd>
+          <dl>
+            <dt>17.1. <a href="#MENUBASICS">The Basics</a></dt>
+
+            <dt>17.2. <a href="#COMPILEMENUS">Compiling With the
+            Menu Library</a></dt>
+
+            <dt>17.3. <a href="#MENUDRIVER">Menu Driver: The work
+            horse of the menu system</a></dt>
+
+            <dt>17.4. <a href="#MENUWINDOWS">Menu Windows</a></dt>
+
+            <dt>17.5. <a href="#SCROLLMENUS">Scrolling
+            Menus</a></dt>
+
+            <dt>17.6. <a href="#MULTICOLUMN">Multi Columnar
+            Menus</a></dt>
+
+            <dt>17.7. <a href="#MULTIVALUEMENUS">Multi Valued
+            Menus</a></dt>
+
+            <dt>17.8. <a href="#MENUOPT">Menu Options</a></dt>
+
+            <dt>17.9. <a href="#MENUUSERPTR">The useful User
+            Pointer</a></dt>
+          </dl>
+        </dd>
+
+        <dt>18. <a href="#FORMS">Forms Library</a></dt>
+
+        <dd>
+          <dl>
+            <dt>18.1. <a href="#FORMBASICS">The Basics</a></dt>
+
+            <dt>18.2. <a href="#COMPILEFORMS">Compiling With the
+            Forms Library</a></dt>
+
+            <dt>18.3. <a href="#PLAYFIELDS">Playing with
+            Fields</a></dt>
+
+            <dd>
+              <dl>
+                <dt>18.3.1. <a href="#FETCHINFO">Fetching Size and
+                Location of Field</a></dt>
+
+                <dt>18.3.2. <a href="#MOVEFIELD">Moving the
+                field</a></dt>
+
+                <dt>18.3.3. <a href="#JUSTIFYFIELD">Field
+                Justification</a></dt>
+
+                <dt>18.3.4. <a href="#FIELDDISPATTRIB">Field
+                Display Attributes</a></dt>
+
+                <dt>18.3.5. <a href="#FIELDOPTIONBITS">Field Option
+                Bits</a></dt>
+
+                <dt>18.3.6. <a href="#FIELDSTATUS">Field
+                Status</a></dt>
+
+                <dt>18.3.7. <a href="#FIELDUSERPTR">Field User
+                Pointer</a></dt>
+
+                <dt>18.3.8. <a href=
+                "#VARIABLESIZEFIELDS">Variable-Sized
+                Fields</a></dt>
+              </dl>
+            </dd>
+
+            <dt>18.4. <a href="#FORMWINDOWS">Form Windows</a></dt>
+
+            <dt>18.5. <a href="#FILEDVALIDATE">Field
+            Validation</a></dt>
+
+            <dt>18.6. <a href="#FORMDRIVER">Form Driver: The work
+            horse of the forms system</a></dt>
+
+            <dd>
+              <dl>
+                <dt>18.6.1. <a href="#PAGENAVREQ">Page Navigation
+                Requests</a></dt>
+
+                <dt>18.6.2. <a href="#INTERFIELDNAVREQ">Inter-Field
+                Navigation Requests</a></dt>
+
+                <dt>18.6.3. <a href="#INTRAFIELDNAVREQ">Intra-Field
+                Navigation Requests</a></dt>
+
+                <dt>18.6.4. <a href="#SCROLLREQ">Scrolling
+                Requests</a></dt>
+
+                <dt>18.6.5. <a href="#EDITREQ">Editing
+                Requests</a></dt>
+
+                <dt>18.6.6. <a href="#ORDERREQ">Order
+                Requests</a></dt>
+
+                <dt>18.6.7. <a href="#APPLICCOMMANDS">Application
+                Commands</a></dt>
+              </dl>
+            </dd>
+          </dl>
+        </dd>
+
+        <dt>19. <a href="#TOOLS">Tools and Widget
+        Libraries</a></dt>
+
+        <dd>
+          <dl>
+            <dt>19.1. <a href="#CDK">CDK (Curses Development
+            Kit)</a></dt>
+
+            <dd>
+              <dl>
+                <dt>19.1.1. <a href="#WIDGETLIST">Widget
+                List</a></dt>
+
+                <dt>19.1.2. <a href="#CDKATTRACT">Some Attractive
+                Features</a></dt>
+
+                <dt>19.1.3. <a href=
+                "#CDKCONCLUSION">Conclusion</a></dt>
+              </dl>
+            </dd>
+
+            <dt>19.2. <a href="#DIALOG">The dialog</a></dt>
+
+            <dt>19.3. <a href="#PERLCURSES">Perl Curses Modules
+            CURSES::FORM and CURSES::WIDGETS</a></dt>
+          </dl>
+        </dd>
+
+        <dt>20. <a href="#JUSTFORFUN">Just For Fun !!!</a></dt>
+
+        <dd>
+          <dl>
+            <dt>20.1. <a href="#GAMEOFLIFE">The Game of
+            Life</a></dt>
+
+            <dt>20.2. <a href="#MAGIC">Magic Square</a></dt>
+
+            <dt>20.3. <a href="#HANOI">Towers of Hanoi</a></dt>
+
+            <dt>20.4. <a href="#QUEENS">Queens Puzzle</a></dt>
+
+            <dt>20.5. <a href="#SHUFFLE">Shuffle</a></dt>
+
+            <dt>20.6. <a href="#TT">Typing Tutor</a></dt>
+          </dl>
+        </dd>
+
+        <dt>21. <a href="#REF">References</a></dt>
+      </dl>
+    </div>
+
+    <div class="SECT1">
+      <h2 class="SECT1"><a name="INTRO" id="INTRO">1.
+      Introduction</a></h2>
+
+      <p>In the olden days of teletype terminals, terminals were
+      away from computers and were connected to them through serial
+      cables. The terminals could be configured by sending a series
+      of bytes. All the capabilities (such as moving the cursor to
+      a new location, erasing part of the screen, scrolling the
+      screen, changing modes, etc.) of terminals could be accessed
+      through these series of bytes. These control seeuqnces are
+      usually called escape sequences, because they start with an
+      escape(0x1B) character. Even today, with proper emulation, we
+      can send escape sequences to the emulator and achieve the
+      same effect on a terminal window.</p>
+
+      <p>Suppose you wanted to print a line in color. Try typing
+      this on your console.</p>
+
+      <pre class="PROGRAMLISTING">echo "^[[0;31;40mIn Color"</pre>
+      <p>The first character is an escape character, which looks
+      like two characters ^ and [. To be able to print it, you have
+      to press CTRL+V and then the ESC key. All the others are
+      normal printable characters. You should be able to see the
+      string "In Color" in red. It stays that way and to revert
+      back to the original mode type this.</p>
+
+      <pre class="PROGRAMLISTING">echo "^[[0;37;40m"</pre>
+      <p>Now, what do these magic characters mean? Difficult to
+      comprehend? They might even be different for different
+      terminals. So the designers of UNIX invented a mechanism
+      named <tt class="LITERAL">termcap</tt>. It is a file that
+      lists all the capabilities of a particular terminal, along
+      with the escape sequences needed to achieve a particular
+      effect. In the later years, this was replaced by <tt class=
+      "LITERAL">terminfo</tt>. Without delving too much into
+      details, this mechanism allows application programs to query
+      the terminfo database and obtain the control characters to be
+      sent to a terminal or terminal emulator.</p>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="WHATIS" id="WHATIS">1.1. What is
+        NCURSES?</a></h3>
+
+        <p>You might be wondering, what the import of all this
+        technical gibberish is. In the above scenario, every
+        application program is supposed to query the terminfo and
+        perform the necessary stuff (sending control characters,
+        etc.). It soon became difficult to manage this complexity
+        and this gave birth to 'CURSES'. Curses is a pun on the
+        name "cursor optimization". The Curses library forms a
+        wrapper over working with raw terminal codes, and provides
+        highly flexible and efficient API (Application Programming
+        Interface). It provides functions to move the cursor,
+        create windows, produce colors, play with mouse, etc. The
+        application programs need not worry about the underlying
+        terminal capabilities.</p>
+
+        <p>So what is NCURSES? NCURSES is a clone of the original
+        System V Release 4.0 (SVr4) curses. It is a freely
+        distributable library, fully compatible with older version
+        of curses. In short, it is a library of functions that
+        manages an application's display on character-cell
+        terminals. In the remainder of the document, the terms
+        curses and ncurses are used interchangeably.</p>
+
+        <p>A detailed history of NCURSES can be found in the NEWS
+        file from the source distribution. The current package is
+        maintained by <a href="mailto:dickey@invisible-island.net"
+        target="_top">Thomas Dickey</a>. You can contact the
+        maintainers at <a href="mailto:bug-ncurses@gnu.org" target=
+        "_top">bug-ncurses@gnu.org</a>.</p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="WHATCANWEDO" id=
+        "WHATCANWEDO">1.2. What we can do with NCURSES</a></h3>
+
+        <p>NCURSES not only creates a wrapper over terminal
+        capabilities, but also gives a robust framework to create
+        nice looking UI (User Interface)s in text mode. It provides
+        functions to create windows, etc. Its sister libraries
+        panel, menu and form provide an extension to the basic
+        curses library. These libraries usually come along with
+        curses. One can create applications that contain multiple
+        windows, menus, panels and forms. Windows can be managed
+        independently, can provide 'scrollability' and even can be
+        hidden.</p>
+
+        <p>Menus provide the user with an easy command selection
+        option. Forms allow the creation of easy-to-use data entry
+        and display windows. Panels extend the capabilities of
+        ncurses to deal with overlapping and stacked windows.</p>
+
+        <p>These are just some of the basic things we can do with
+        ncurses. As we move along, We will see all the capabilities
+        of these libraries.</p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="WHERETOGETIT" id=
+        "WHERETOGETIT">1.3. Where to get it</a></h3>
+
+        <p>All right, now that you know what you can do with
+        ncurses, you must be rearing to get started. NCURSES is
+        usually shipped with your installation. In case you don't
+        have the library or want to compile it on your own, read
+        on.</p>
+
+        <p><span class="emphasis"><i class="EMPHASIS">Compiling the
+        package</i></span>
+        </p>
+
+        <p>NCURSES can be obtained from <a href=
+        "ftp://ftp.gnu.org/pub/gnu/ncurses/ncurses.tar.gz" target=
+        "_top">ftp://ftp.gnu.org/pub/gnu/ncurses/ncurses.tar.gz</a>
+        or any of the ftp sites mentioned in <a href=
+        "https://www.gnu.org/order/ftp.html" target=
+        "_top">https://www.gnu.org/order/ftp.html</a>.</p>
+
+        <p>Read the README and INSTALL files for details on to how
+        to install it. It usually involves the following
+        operations.</p>
+
+        <pre class=
+        "PROGRAMLISTING">    tar zxvf ncurses&lt;version&gt;.tar.gz  # unzip and untar the archive
+    cd ncurses&lt;version&gt;               # cd to the directory
+    ./configure                             # configure the build according to your 
+                                            # environment
+    make                                    # make it
+    su root                                 # become root
+    make install                            # install it</pre>
+        <p><span class="emphasis"><i class="EMPHASIS">Using the
+        RPM</i></span>
+        </p>
+
+        <p>NCURSES RPM can be found and downloaded from <a href=
+        "https://rpmfind.net" target="_top">https://rpmfind.net</a>
+        . The RPM can be installed with the following command after
+        becoming root.</p>
+
+        <pre class=
+        "PROGRAMLISTING">    rpm -i &lt;downloaded rpm&gt;</pre>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="PURPOSE" id="PURPOSE">1.4.
+        Purpose/Scope of the document</a></h3>
+
+        <p>This document is intended to be a "All in One" guide for
+        programming with ncurses and its sister libraries. We
+        graduate from a simple "Hello World" program to more
+        complex form manipulation. No prior experience in ncurses
+        is assumed. The writing is informal, but a lot of detail is
+        provided for each of the examples.</p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="ABOUTPROGRAMS" id=
+        "ABOUTPROGRAMS">1.5. About the Programs</a></h3>
+
+        <p>All the programs in the document are available in zipped
+        form <a href=
+        "https://www.tldp.org/HOWTO/NCURSES-Programming-HOWTO/ncurses_programs.tar.gz"
+        target="_top">here</a>. Unzip and untar it. The directory
+        structure looks like this.</p>
+
+        <pre class="PROGRAMLISTING">ncurses
+   |
+   |----&gt; JustForFun     -- just for fun programs
+   |----&gt; basics         -- basic programs
+   |----&gt; demo           -- output files go into this directory after make
+   |          |
+   |          |----&gt; exe -- exe files of all example programs
+   |----&gt; forms          -- programs related to form library
+   |----&gt; menus          -- programs related to menus library
+   |----&gt; panels         -- programs related to panels library
+   |----&gt; perl           -- perl equivalents of the examples (contributed
+   |                            by Anuradha Ratnaweera)
+   |----&gt; Makefile       -- the top level Makefile
+   |----&gt; README         -- the top level README file. contains instructions
+   |----&gt; COPYING        -- copyright notice</pre>
+        <p>The individual directories contain the following
+        files.</p>
+
+        <pre class=
+        "PROGRAMLISTING">Description of files in each directory
+--------------------------------------
+JustForFun
+    |
+    |----&gt; hanoi.c   -- The Towers of Hanoi Solver
+    |----&gt; life.c    -- The Game of Life demo
+    |----&gt; magic.c   -- An Odd Order Magic Square builder 
+    |----&gt; queens.c  -- The famous N-Queens Solver
+    |----&gt; shuffle.c -- A fun game, if you have time to kill
+    |----&gt; tt.c      -- A very trivial typing tutor
+
+  basics
+    |
+    |----&gt; acs_vars.c            -- ACS_ variables example
+    |----&gt; hello_world.c         -- Simple "Hello World" Program
+    |----&gt; init_func_example.c   -- Initialization functions example
+    |----&gt; key_code.c            -- Shows the scan code of the key pressed
+    |----&gt; mouse_menu.c          -- A menu accessible by mouse
+    |----&gt; other_border.c        -- Shows usage of other border functions apa
+    |                               -- rt from box()
+    |----&gt; printw_example.c      -- A very simple printw() example
+    |----&gt; scanw_example.c       -- A very simple getstr() example
+    |----&gt; simple_attr.c         -- A program that can print a c file with 
+    |                               -- comments in attribute
+    |----&gt; simple_color.c        -- A simple example demonstrating colors
+    |----&gt; simple_key.c          -- A menu accessible with keyboard UP, DOWN 
+    |                               -- arrows
+    |----&gt; temp_leave.c          -- Demonstrates temporarily leaving curses mode
+    |----&gt; win_border.c          -- Shows Creation of windows and borders
+    |----&gt; with_chgat.c          -- chgat() usage example
+
+  forms 
+    |
+    |----&gt; form_attrib.c     -- Usage of field attributes
+    |----&gt; form_options.c    -- Usage of field options
+    |----&gt; form_simple.c     -- A simple form example
+    |----&gt; form_win.c        -- Demo of windows associated with forms
+
+  menus 
+    |
+    |----&gt; menu_attrib.c     -- Usage of menu attributes
+    |----&gt; menu_item_data.c  -- Usage of item_name(), etc. functions
+    |----&gt; menu_multi_column.c    -- Creates multi columnar menus
+    |----&gt; menu_scroll.c     -- Demonstrates scrolling capability of menus
+    |----&gt; menu_simple.c     -- A simple menu accessed by arrow keys
+    |----&gt; menu_toggle.c     -- Creates multi valued menus and explains
+    |                           -- REQ_TOGGLE_ITEM
+    |----&gt; menu_userptr.c    -- Usage of user pointer
+    |----&gt; menu_win.c        -- Demo of windows associated with menus
+
+  panels 
+    |
+    |----&gt; panel_browse.c    -- Panel browsing through tab. Usage of user 
+    |                           -- pointer
+    |----&gt; panel_hide.c      -- Hiding and Un hiding of panels
+    |----&gt; panel_resize.c    -- Moving and resizing of panels
+    |----&gt; panel_simple.c    -- A simple panel example
+
+  perl
+    |----&gt; 01-10.pl          -- Perl equivalents of first ten example programs</pre>
+        <p>There is a top level Makefile included in the main
+        directory. It builds all the files and puts the
+        ready-to-use exes in demo/exe directory. You can also do
+        selective make by going into the corresponding directory.
+        Each directory contains a README file explaining the
+        purpose of each c file in the directory.</p>
+
+        <p>For every example, I have included path name for the
+        file relative to the examples directory.</p>
+
+        <p>If you prefer browsing individual programs, point your
+        browser to <a href=
+        "https://tldp.org/HOWTO/NCURSES-Programming-HOWTO/ncurses_programs/"
+        target=
+        "_top">https://tldp.org/HOWTO/NCURSES-Programming-HOWTO/ncurses_programs/</a></p>
+
+        <p>All the programs are released under the same license
+        that is used by ncurses (MIT-style). This gives you the
+        ability to do pretty much anything other than claiming them
+        as yours. Feel free to use them in your programs as
+        appropriate.</p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="OTHERFORMATS" id=
+        "OTHERFORMATS">1.6. Other Formats of the document</a></h3>
+
+        <p>This howto is also available in various other formats on
+        the tldp.org site. Here are the links to other formats of
+        this document.</p>
+
+        <div class="SECT3">
+          <hr>
+
+          <h4 class="SECT3"><a name="LISTFORMATS" id=
+          "LISTFORMATS">1.6.1. Readily available formats from
+          tldp.org</a></h4>
+
+          <ul>
+            <li>
+              <p><a href=
+              "https://www.ibiblio.org/pub/Linux/docs/HOWTO/other-formats/pdf/NCURSES-Programming-HOWTO.pdf"
+              target="_top">Acrobat PDF Format</a></p>
+            </li>
+
+            <li>
+              <p><a href=
+              "https://www.ibiblio.org/pub/Linux/docs/HOWTO/other-formats/ps/NCURSES-Programming-HOWTO.ps.gz"
+              target="_top">PostScript Format</a></p>
+            </li>
+
+            <li>
+              <p><a href=
+              "https://www.ibiblio.org/pub/Linux/docs/HOWTO/other-formats/html/NCURSES-Programming-HOWTO-html.tar.gz"
+              target="_top">In Multiple HTML pages</a></p>
+            </li>
+
+            <li>
+              <p><a href=
+              "https://www.ibiblio.org/pub/Linux/docs/HOWTO/other-formats/html_single/NCURSES-Programming-HOWTO.html"
+              target="_top">In One big HTML format</a></p>
+            </li>
+          </ul>
+        </div>
+
+        <div class="SECT3">
+          <hr>
+
+          <h4 class="SECT3"><a name="BUILDSOURCE" id=
+          "BUILDSOURCE">1.6.2. Building from source</a></h4>
+
+          <p>If above links are broken or if you want to experiment
+          with sgml read on.</p>
+
+          <pre class=
+          "PROGRAMLISTING">&#13;    Get both the source and the tar,gzipped programs, available at
+        http://cvsview.tldp.org/index.cgi/LDP/howto/docbook/
+        NCURSES-HOWTO/NCURSES-Programming-HOWTO.sgml
+        http://cvsview.tldp.org/index.cgi/LDP/howto/docbook/
+        NCURSES-HOWTO/ncurses_programs.tar.gz
+
+    Unzip ncurses_programs.tar.gz with
+    tar zxvf ncurses_programs.tar.gz
+
+    Use jade to create various formats. For example if you just want to create
+    the multiple html files, you would use
+        jade -t sgml -i html -d &lt;path to docbook html stylesheet&gt;
+        NCURSES-Programming-HOWTO.sgml
+    to get pdf, first create a single html file of the HOWTO with 
+        jade -t sgml -i html -d &lt;path to docbook html stylesheet&gt; -V nochunks
+        NCURSES-Programming-HOWTO.sgml &gt; NCURSES-ONE-BIG-FILE.html
+    then use htmldoc to get pdf file with
+        htmldoc --size universal -t pdf --firstpage p1 -f &lt;output file name.pdf&gt;
+        NCURSES-ONE-BIG-FILE.html
+    for ps, you would use
+        htmldoc --size universal -t ps --firstpage p1 -f &lt;output file name.ps&gt;
+        NCURSES-ONE-BIG-FILE.html</pre>
+          <p>See <a href=
+          "https://www.tldp.org/LDP/LDP-Author-Guide/" target=
+          "_top">LDP Author guide</a> for more details. If all else
+          fails, mail me at <a href="ppadala@gmail.com" target=
+          "_top">ppadala@gmail.com</a></p>
+        </div>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="CREDITS" id="CREDITS">1.7.
+        Credits</a></h3>
+
+        <p>I thank <a href="mailto:sharath_1@usa.net" target=
+        "_top">Sharath</a> and Emre Akbas for helping me with few
+        sections. The introduction was initially written by
+        sharath. I rewrote it with few excerpts taken from his
+        initial work. Emre helped in writing printw and scanw
+        sections.</p>
+
+        <p>Perl equivalents of the example programs are contributed
+        by <a href="mailto:Aratnaweera@virtusa.com" target=
+        "_top">Anuradha Ratnaweera</a>.</p>
+
+        <p>Then comes <a href="mailto:parimi@ece.arizona.edu"
+        target="_top">Ravi Parimi</a>, my dearest friend, who has
+        been on this project before even one line was written. He
+        constantly bombarded me with suggestions and patiently
+        reviewed the whole text. He also checked each program on
+        Linux and Solaris.</p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="WISHLIST" id="WISHLIST">1.8.
+        Wish List</a></h3>
+
+        <p>This is the wish list, in the order of priority. If you
+        have a wish or you want to work on completing the wish,
+        mail <a href="mailto:ppadala@gmail.com" target=
+        "_top">me</a>.</p>
+
+        <ul>
+          <li>
+            <p>Add examples to last parts of forms section.</p>
+          </li>
+
+          <li>
+            <p>Prepare a Demo showing all the programs and allow
+            the user to browse through description of each program.
+            Let the user compile and see the program in action. A
+            dialog based interface is preferred.</p>
+          </li>
+
+          <li>
+            <p>Add debug info. _tracef, _tracemouse stuff.</p>
+          </li>
+
+          <li>
+            <p>Accessing termcap, terminfo using functions provided
+            by ncurses package.</p>
+          </li>
+
+          <li>
+            <p>Working on two terminals simultaneously.</p>
+          </li>
+
+          <li>
+            <p>Add more stuff to miscellaneous section.</p>
+          </li>
+        </ul>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="COPYRIGHT" id="COPYRIGHT">1.9.
+        Copyright</a></h3>
+
+        <p>Copyright &copy; 2001 by Pradeep Padala.</p>
+
+        <p>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:</p>
+
+        <p>The above copyright notice and this permission notice
+        shall be included in all copies or substantial portions of
+        the Software.</p>
+
+        <p>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.</p>
+
+        <p>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.</p>
+      </div>
+    </div>
+
+    <div class="SECT1">
+      <hr>
+
+      <h2 class="SECT1"><a name="HELLOWORLD" id="HELLOWORLD">2.
+      Hello World !!!</a></h2>
+
+      <p>Welcome to the world of curses. Before we plunge into the
+      library and look into its various features, let's write a
+      simple program and say hello to the world.</p>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="COMPILECURSES" id=
+        "COMPILECURSES">2.1. Compiling With the NCURSES Library</a></h3>
+
+        <p>To use ncurses library functions, you have to include
+        ncurses.h in your programs. To link the program with
+        ncurses the flag -lncurses should be added.</p>
+
+        <pre class="PROGRAMLISTING">    #include &lt;ncurses.h&gt;
+    .
+    .
+    .
+
+    compile and link: gcc &lt;program file&gt; -lncurses</pre>
+        <div class="EXAMPLE">
+          <a name="BHW" id="BHW"></a>
+          <p><b>Example 1. The Hello World !!! Program</b>
+          </p>
+
+          <pre class="PROGRAMLISTING"><span class=
+          "INLINEMEDIAOBJECT">#include &lt;curses.h&gt;
+
+int main()
+{       
+        initscr();                      /* Start curses mode              */
+        printw("Hello World !!!");      /* Print Hello World              */
+        refresh();                      /* Print it on to the real screen */
+        getch();                        /* Wait for user input */
+        endwin();                       /* End curses mode                */
+
+        return 0;
+}</span></pre>
+        </div>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="DISSECTION" id="DISSECTION">2.2.
+        Dissection</a></h3>
+
+        <p>The above program prints "Hello World !!!" to the screen
+        and exits. This program shows how to initialize curses and
+        do screen manipulation and end curses mode. Let's dissect
+        it line by line.</p>
+
+        <div class="SECT3">
+          <hr>
+
+          <h4 class="SECT3"><a name="ABOUT-INITSCR" id=
+          "ABOUT-INITSCR">2.2.1. About initscr()</a></h4>
+
+          <p>The function initscr() initializes the terminal in
+          curses mode. In some implementations, it clears the
+          screen and presents a blank screen. To do any screen
+          manipulation using curses package this has to be called
+          first. This function initializes the curses system and
+          allocates memory for our present window (called
+          <tt class="LITERAL">stdscr</tt>) and some other
+          data-structures. Under extreme cases this function might
+          fail due to insufficient memory to allocate memory for
+          curses library's data structures.</p>
+
+          <p>After this is done, we can do a variety of
+          initializations to customize our curses settings. These
+          details will be explained <a href="#INIT">later</a> .</p>
+        </div>
+
+        <div class="SECT3">
+          <hr>
+
+          <h4 class="SECT3"><a name="MYST-REFRESH" id=
+          "MYST-REFRESH">2.2.2. The mysterious refresh()</a></h4>
+
+          <p>The next line printw prints the string "Hello World
+          !!!" on to the screen. This function is analogous to
+          normal printf in all respects except that it prints the
+          data on a window called stdscr at the current (y,x)
+          co-ordinates. Since our present co-ordinates are at 0,0
+          the string is printed at the left hand corner of the
+          window.</p>
+
+          <p>This brings us to that mysterious refresh(). Well,
+          when we called printw the data is actually written to an
+          imaginary window, which is not updated on the screen yet.
+          The job of printw is to update a few flags and data
+          structures and write the data to a buffer corresponding
+          to stdscr. In order to show it on the screen, we need to
+          call refresh() and tell the curses system to dump the
+          contents on the screen.</p>
+
+          <p>The philosophy behind all this is to allow the
+          programmer to do multiple updates on the imaginary screen
+          or windows and do a refresh once all his screen update is
+          done. refresh() checks the window and updates only the
+          portion which has been changed. This improves performance
+          and offers greater flexibility too. But, it is sometimes
+          frustrating to beginners. A common mistake committed by
+          beginners is to forget to call refresh() after they did
+          some update through printw() class of functions. I still
+          forget to add it sometimes :-)</p>
+        </div>
+
+        <div class="SECT3">
+          <hr>
+
+          <h4 class="SECT3"><a name="ABOUT-ENDWIN" id=
+          "ABOUT-ENDWIN">2.2.3. About endwin()</a></h4>
+
+          <p>And finally don't forget to end the curses mode.
+          Otherwise your terminal might behave strangely after the
+          program quits. endwin() frees the memory taken by curses
+          sub-system and its data structures and puts the terminal
+          in normal mode. This function must be called after you
+          are done with the curses mode.</p>
+        </div>
+      </div>
+    </div>
+
+    <div class="SECT1">
+      <hr>
+
+      <h2 class="SECT1"><a name="GORY" id="GORY">3. The Gory
+      Details</a></h2>
+
+      <p>Now that we have seen how to write a simple curses program
+      let's get into the details. There are many functions that
+      help customize what you see on screen and many features which
+      can be put to full use.</p>
+
+      <p>Here we go...</p>
+    </div>
+
+    <div class="SECT1">
+      <hr>
+
+      <h2 class="SECT1"><a name="INIT" id="INIT">4.
+      Initialization</a></h2>
+
+      <p>We now know that to initialize curses system the function
+      initscr() has to be called. There are functions which can be
+      called after this initialization to customize our curses
+      session. We may ask the curses system to set the terminal in
+      raw mode or initialize color or initialize the mouse, etc.
+      Let's discuss some of the functions that are normally called
+      immediately after initscr();</p>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="ABOUTINIT" id="ABOUTINIT">4.1.
+        Initialization functions</a></h3>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="RAWCBREAK" id="RAWCBREAK">4.2.
+        raw() and cbreak()</a></h3>
+
+        <p>Normally the terminal driver buffers the characters a
+        user types until a new line or carriage return is
+        encountered. But most programs require that the characters
+        be available as soon as the user types them. The above two
+        functions are used to disable line buffering. The
+        difference between these two functions is in the way
+        control characters like suspend (CTRL-Z), interrupt and
+        quit (CTRL-C) are passed to the program. In the raw() mode
+        these characters are directly passed to the program without
+        generating a signal. In the <tt class=
+        "LITERAL">cbreak()</tt> mode these control characters are
+        interpreted as any other character by the terminal driver.
+        I personally prefer to use raw() as I can exercise greater
+        control over what the user does.</p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="ECHONOECHO" id="ECHONOECHO">4.3.
+        echo() and noecho()</a></h3>
+
+        <p>These functions control the echoing of characters typed
+        by the user to the terminal. <tt class=
+        "LITERAL">noecho()</tt> switches off echoing. The reason
+        you might want to do this is to gain more control over
+        echoing or to suppress unnecessary echoing while taking
+        input from the user through the getch(), etc. functions.
+        Most of the interactive programs call <tt class=
+        "LITERAL">noecho()</tt> at initialization and do the
+        echoing of characters in a controlled manner. It gives the
+        programmer the flexibility of echoing characters at any
+        place in the window without updating current (y,x)
+        co-ordinates.</p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="KEYPAD" id="KEYPAD">4.4.
+        keypad()</a></h3>
+
+        <p>This is my favorite initialization function. It enables
+        the reading of function keys like F1, F2, arrow keys, etc.
+        Almost every interactive program enables this, as arrow
+        keys are a major part of any User Interface. Do <tt class=
+        "LITERAL">keypad(stdscr, TRUE)</tt> to enable this feature
+        for the regular screen (stdscr). You will learn more about
+        key management in later sections of this document.</p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="HALFDELAY" id="HALFDELAY">4.5.
+        halfdelay()</a></h3>
+
+        <p>This function, though not used very often, is a useful
+        one at times. halfdelay()is called to enable the half-delay
+        mode, which is similar to the cbreak() mode in that
+        characters typed are immediately available to program.
+        However, it waits for 'X' tenths of a second for input and
+        then returns ERR, if no input is available. 'X' is the
+        timeout value passed to the function halfdelay(). This
+        function is useful when you want to ask the user for input,
+        and if he doesn't respond with in certain time, we can do
+        some thing else. One possible example is a timeout at the
+        password prompt.</p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="MISCINIT" id="MISCINIT">4.6.
+        Miscellaneous Initialization functions</a></h3>
+
+        <p>There are few more functions which are called at
+        initialization to customize curses behavior. They are not
+        used as extensively as those mentioned above. Some of them
+        are explained where appropriate.</p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="INITEX" id="INITEX">4.7. An
+        Example</a></h3>
+
+        <p>Let's write a program which will clarify the usage of
+        these functions.</p>
+
+        <div class="EXAMPLE">
+          <a name="BINFU" id="BINFU"></a>
+          <p><b>Example 2. Initialization Function Usage
+          example</b>
+          </p>
+
+          <pre class="PROGRAMLISTING"><span class=
+          "INLINEMEDIAOBJECT">#include &lt;curses.h&gt;
+
+int main()
+{       int ch;
+
+        initscr();                      /* Start curses mode            */
+        raw();                          /* Line buffering disabled      */
+        keypad(stdscr, TRUE);           /* We get F1, F2 etc..          */
+        noecho();                       /* Don't echo() while we do getch */
+
+        printw("Type any character to see it in bold\n");
+        ch = getch();                   /* If raw() hadn't been called
+                                         * we have to press enter before it
+                                         * gets to the program          */
+        if(ch == KEY_F(1))              /* Without keypad enabled this will */
+                printw("F1 Key pressed");/*  not get to us either       */
+                                        /* Without noecho() some ugly escape
+                                         * characters might have been printed
+                                         * on screen                    */
+        else
+        {       printw("The pressed key is ");
+                attron(A_BOLD);
+                printw("%c", ch);
+                attroff(A_BOLD);
+        }
+        refresh();                      /* Print it on to the real screen */
+        getch();                        /* Wait for user input */
+        endwin();                       /* End curses mode                */
+
+        return 0;
+}</span></pre>
+        </div>
+
+        <p>This program is self-explanatory. But I used functions
+        which aren't explained yet. The function <tt class=
+        "LITERAL">getch()</tt> is used to get a character from
+        user. It is equivalent to normal <tt class=
+        "LITERAL">getchar()</tt> except that we can disable the
+        line buffering to avoid &lt;enter&gt; after input. Look for
+        more about <tt class="LITERAL">getch()</tt>and reading keys
+        in the <a href="#KEYS">key management section</a> . The
+        functions attron and attroff are used to switch some
+        attributes on and off respectively. In the example I used
+        them to print the character in bold. These functions are
+        explained in detail later.</p>
+      </div>
+    </div>
+
+    <div class="SECT1">
+      <hr>
+
+      <h2 class="SECT1"><a name="AWORDWINDOWS" id="AWORDWINDOWS">5.
+      A Word about Windows</a></h2>
+
+      <p>Before we plunge into the myriad ncurses functions, let me
+      clear few things about windows. Windows are explained in
+      detail in following <a href="#WINDOWS">sections</a></p>
+
+      <p>A Window is an imaginary screen defined by curses system.
+      A window does not mean a bordered window which you usually
+      see on Win9X platforms. When curses is initialized, it
+      creates a default window named <tt class=
+      "LITERAL">stdscr</tt> which represents your 80x25 (or the
+      size of window in which you are running) screen. If you are
+      doing simple tasks like printing few strings, reading input,
+      etc., you can safely use this single window for all of your
+      purposes. You can also create windows and call functions
+      which explicitly work on the specified window.</p>
+
+      <p>For example, if you call</p>
+
+      <pre class="PROGRAMLISTING">    printw("Hi There !!!");
+    refresh();</pre>
+      <p>It prints the string on stdscr at the present cursor
+      position. Similarly the call to refresh(), works on stdscr
+      only.</p>
+
+      <p>Say you have created <a href="#WINDOWS">windows</a> then
+      you have to call a function with a 'w' added to the usual
+      function.</p>
+
+      <pre class="PROGRAMLISTING">    wprintw(win, "Hi There !!!");
+    wrefresh(win);</pre>
+      <p>As you will see in the rest of the document, naming of
+      functions follow the same convention. For each function there
+      usually are three more functions.</p>
+
+      <pre class=
+      "PROGRAMLISTING">    printw(string);        /* Print on stdscr at present cursor position */
+    mvprintw(y, x, string);/* Move to (y, x) then print string     */
+    wprintw(win, string);  /* Print on window win at present cursor position */
+                           /* in the window */
+    mvwprintw(win, y, x, string);   /* Move to (y, x) relative to window */
+                                    /* co-ordinates and then print         */</pre>
+      <p>Usually the w-less functions are macros which expand to
+      corresponding w-function with stdscr as the window
+      parameter.</p>
+    </div>
+
+    <div class="SECT1">
+      <hr>
+
+      <h2 class="SECT1"><a name="PRINTW" id="PRINTW">6. Output
+      functions</a></h2>
+
+      <p>I guess you can't wait any more to see some action. Back
+      to our odyssey of curses functions. Now that curses is
+      initialized, let's interact with world.</p>
+
+      <p>There are three classes of functions which you can use to
+      do output on screen.</p>
+
+      <ol type="1">
+        <li>
+          <p>addch() class: Print single character with
+          attributes</p>
+        </li>
+
+        <li>
+          <p>printw() class: Print formatted output similar to
+          printf()</p>
+        </li>
+
+        <li>
+          <p>addstr() class: Print strings</p>
+        </li>
+      </ol>
+
+      <p>These functions can be used interchangeably and it is a
+      matter of style as to which class is used. Let's see each one
+      in detail.</p>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="ADDCHCLASS" id="ADDCHCLASS">6.1.
+        addch() class of functions</a></h3>
+
+        <p>These functions put a single character into the current
+        cursor location and advance the position of the cursor. You
+        can give the character to be printed but they usually are
+        used to print a character with some attributes. Attributes
+        are explained in detail in later <a href=
+        "#ATTRIB">sections</a> of the document. If a character is
+        associated with an attribute(bold, reverse video etc.),
+        when curses prints the character, it is printed in that
+        attribute.</p>
+
+        <p>In order to combine a character with some attributes,
+        you have two options:</p>
+
+        <ul>
+          <li>
+            <p>By OR'ing a single character with the desired
+            attribute macros. These attribute macros could be found
+            in the header file <tt class="LITERAL">ncurses.h</tt>.
+            For example, you want to print a character ch(of type
+            char) bold and underlined, you would call addch() as
+            below.</p>
+
+            <pre class=
+            "PROGRAMLISTING">    addch(ch | A_BOLD | A_UNDERLINE);</pre>
+          </li>
+
+          <li>
+            <p>By using functions like <tt class=
+            "LITERAL">attrset(),attron(),attroff()</tt>. These
+            functions are explained in the <a href=
+            "#ATTRIB">Attributes</a> section. Briefly, they
+            manipulate the current attributes of the given window.
+            Once set, the character printed in the window are
+            associated with the attributes until it is turned
+            off.</p>
+          </li>
+        </ul>
+
+        <p>Additionally, <tt class="LITERAL">curses</tt> provides
+        some special characters for character-based graphics. You
+        can draw tables, horizontal or vertical lines, etc. You can
+        find all available characters in the header file <tt class=
+        "LITERAL">ncurses.h</tt>. Try looking for macros beginning
+        with <tt class="LITERAL">ACS_</tt> in this file.</p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="AEN303" id="AEN303">6.2.
+        mvaddch(), waddch() and mvwaddch()</a></h3>
+
+        <p><tt class="LITERAL">mvaddch()</tt> is used to move the
+        cursor to a given point, and then print. Thus, the
+        calls:</p>
+
+        <pre class=
+        "PROGRAMLISTING">    move(row,col);    /* moves the cursor to row<span class="emphasis"><i class="EMPHASIS">th</i></span> row and col<span class="emphasis"><i class="EMPHASIS">th</i></span> column */
+    addch(ch);</pre>can be replaced by
+
+        <pre class="PROGRAMLISTING">    mvaddch(row,col,ch);</pre>
+        <p><tt class="LITERAL">waddch()</tt> is similar to
+        <tt class="LITERAL">addch()</tt>, except that it adds a
+        character into the given window. (Note that <tt class=
+        "LITERAL">addch()</tt> adds a character into the window
+        <tt class="LITERAL">stdscr</tt>.)</p>
+
+        <p>In a similar fashion <tt class="LITERAL">mvwaddch()</tt>
+        function is used to add a character into the given window
+        at the given coordinates.</p>
+
+        <p>Now, we are familiar with the basic output function
+        <tt class="LITERAL">addch()</tt>. But, if we want to print
+        a string, it would be very annoying to print it character
+        by character. Fortunately, <tt class="LITERAL">ncurses</tt>
+        provides <tt class="LITERAL">printf</tt><span class=
+        "emphasis"><i class="EMPHASIS">-like</i></span> or
+        <tt class="LITERAL">puts</tt><span class=
+        "emphasis"><i class="EMPHASIS">-like</i></span>
+        functions.</p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="PRINTWCLASS" id=
+        "PRINTWCLASS">6.3. printw() class of functions</a></h3>
+
+        <p>These functions are similar to <tt class=
+        "LITERAL">printf()</tt> with the added capability of
+        printing at any position on the screen.</p>
+
+        <div class="SECT3">
+          <hr>
+
+          <h4 class="SECT3"><a name="PRINTWMVPRINTW" id=
+          "PRINTWMVPRINTW">6.3.1. printw() and mvprintw</a></h4>
+
+          <p>These two functions work much like <tt class=
+          "LITERAL">printf()</tt>. <tt class=
+          "LITERAL">mvprintw()</tt> can be used to move the cursor
+          to a position and then print. If you want to move the
+          cursor first and then print using <tt class=
+          "LITERAL">printw()</tt> function, use <tt class=
+          "LITERAL">move()</tt> first and then use <tt class=
+          "LITERAL">printw()</tt> though I see no point why one
+          should avoid using <tt class="LITERAL">mvprintw()</tt>,
+          you have the flexibility to manipulate.</p>
+        </div>
+
+        <div class="SECT3">
+          <hr>
+
+          <h4 class="SECT3"><a name="WPRINTWMVWPRINTW" id=
+          "WPRINTWMVWPRINTW">6.3.2. wprintw() and mvwprintw</a></h4>
+
+          <p>These two functions are similar to above two except
+          that they print in the corresponding window given as
+          argument.</p>
+        </div>
+
+        <div class="SECT3">
+          <hr>
+
+          <h4 class="SECT3"><a name="VWPRINTW" id="VWPRINTW">6.3.3.
+          vw_printw()</a></h4>
+
+          <p>This function is similar to <tt class=
+          "LITERAL">vprintf()</tt>. This can be used when variable
+          number of arguments are to be printed.</p>
+        </div>
+
+        <div class="SECT3">
+          <hr>
+
+          <h4 class="SECT3"><a name="SIMPLEPRINTWEX" id=
+          "SIMPLEPRINTWEX">6.3.4. A Simple printw example</a></h4>
+
+          <div class="EXAMPLE">
+            <a name="BPREX" id="BPREX"></a>
+            <p><b>Example 3. A Simple printw example</b>
+            </p>
+
+            <pre class="PROGRAMLISTING"><span class=
+            "INLINEMEDIAOBJECT">#include &lt;curses.h&gt;
+#include &lt;string.h&gt; 
+ 
+int main()
+{
+ char mesg[]="Just a string";           /* message to be appeared on the screen */
+ int row,col;                           /* to store the number of rows and *
+                                         * the number of columns of the screen */
+ initscr();                             /* start the curses mode */
+ getmaxyx(stdscr,row,col);              /* get the number of rows and columns */
+ mvprintw(row/2,(col-strlen(mesg))/2,"%s",mesg);
+                                        /* print the message at the center of the screen */
+ mvprintw(row-2,0,"This screen has %d rows and %d columns\n",row,col);
+ printw("Try resizing your window(if possible) and then run this program again");
+ refresh();
+ getch();
+ endwin();
+
+ return 0;
+}</span></pre>
+          </div>
+
+          <p>Above program demonstrates how easy it is to use
+          <tt class="LITERAL">printw</tt>. You just feed the
+          coordinates and the message to be appeared on the screen,
+          then it does what you want.</p>
+
+          <p>The above program introduces us to a new function
+          <tt class="LITERAL">getmaxyx()</tt>, a macro defined in
+          <tt class="LITERAL">ncurses.h</tt>. It gives the number
+          of columns and the number of rows in a given window.
+          <tt class="LITERAL">getmaxyx()</tt> does this by updating
+          the variables given to it. Since <tt class=
+          "LITERAL">getmaxyx()</tt> is not a function we don't pass
+          pointers to it, we just give two integer variables.</p>
+        </div>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="ADDSTRCLASS" id=
+        "ADDSTRCLASS">6.4. addstr() class of functions</a></h3>
+
+        <p><tt class="LITERAL">addstr()</tt> is used to put a
+        character string into a given window. This function is
+        similar to calling <tt class="LITERAL">addch()</tt> once
+        for each character in a given string. This is true for all
+        output functions. There are other functions from this
+        family such as <tt class=
+        "LITERAL">mvaddstr(),mvwaddstr()</tt> and <tt class=
+        "LITERAL">waddstr()</tt>, which obey the naming convention
+        of curses.(e.g. mvaddstr() is similar to the respective
+        calls move() and then addstr().) Another function of this
+        family is addnstr(), which takes an integer parameter(say
+        n) additionally. This function puts at most n characters
+        into the screen. If n is negative, then the entire string
+        will be added.</p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="ACAUTION" id="ACAUTION">6.5. A
+        word of caution</a></h3>
+
+        <p>All these functions take y co-ordinate first and then x
+        in their arguments. A common mistake by beginners is to
+        pass x,y in that order. If you are doing too many
+        manipulations of (y,x) co-ordinates, think of dividing the
+        screen into windows and manipulate each one separately.
+        Windows are explained in the <a href="#WINDOWS">windows</a>
+        section.</p>
+      </div>
+    </div>
+
+    <div class="SECT1">
+      <hr>
+
+      <h2 class="SECT1"><a name="SCANW" id="SCANW">7. Input
+      functions</a></h2>
+
+      <p>Well, printing without taking input, is boring. Let's see
+      functions which allow us to get input from user. These
+      functions also can be divided into three categories.</p>
+
+      <ol type="1">
+        <li>
+          <p>getch() class: Get a character</p>
+        </li>
+
+        <li>
+          <p>scanw() class: Get formatted input</p>
+        </li>
+
+        <li>
+          <p>getstr() class: Get strings</p>
+        </li>
+      </ol>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="GETCHCLASS" id="GETCHCLASS">7.1.
+        getch() class of functions</a></h3>
+
+        <p>These functions read a single character from the
+        terminal. But there are several subtle facts to consider.
+        For example if you don't use the function cbreak(), curses
+        will not read your input characters contiguously but will
+        begin read them only after a new line or an EOF is
+        encountered. In order to avoid this, the cbreak() function
+        must used so that characters are immediately available to
+        your program. Another widely used function is noecho(). As
+        the name suggests, when this function is set (used), the
+        characters that are keyed in by the user will not show up
+        on the screen. The two functions cbreak() and noecho() are
+        typical examples of key management. Functions of this genre
+        are explained in the <a href="#KEYS">key management
+        section</a> .</p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="SCANWCLASS" id="SCANWCLASS">7.2.
+        scanw() class of functions</a></h3>
+
+        <p>These functions are similar to <tt class=
+        "LITERAL">scanf()</tt> with the added capability of getting
+        the input from any location on the screen.</p>
+
+        <div class="SECT3">
+          <hr>
+
+          <h4 class="SECT3"><a name="SCANWMVSCANW" id=
+          "SCANWMVSCANW">7.2.1. scanw() and mvscanw</a></h4>
+
+          <p>The usage of these functions is similar to that of
+          <tt class="LITERAL">sscanf()</tt>, where the line to be
+          scanned is provided by <tt class="LITERAL">wgetstr()</tt>
+          function. That is, these functions call to <tt class=
+          "LITERAL">wgetstr()</tt> function(explained below) and
+          uses the resulting line for a scan.</p>
+        </div>
+
+        <div class="SECT3">
+          <hr>
+
+          <h4 class="SECT3"><a name="WSCANWMVWSCANW" id=
+          "WSCANWMVWSCANW">7.2.2. wscanw() and mvwscanw()</a></h4>
+
+          <p>These are similar to above two functions except that
+          they read from a window, which is supplied as one of the
+          arguments to these functions.</p>
+        </div>
+
+        <div class="SECT3">
+          <hr>
+
+          <h4 class="SECT3"><a name="VWSCANW" id="VWSCANW">7.2.3.
+          vw_scanw()</a></h4>
+
+          <p>This function is similar to <tt class=
+          "LITERAL">vscanf()</tt>. This can be used when a variable
+          number of arguments are to be scanned.</p>
+        </div>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="GETSTRCLASS" id=
+        "GETSTRCLASS">7.3. getstr() class of functions</a></h3>
+
+        <p>These functions are used to get strings from the
+        terminal. In essence, this function performs the same task
+        as would be achieved by a series of calls to <tt class=
+        "LITERAL">getch()</tt> until a newline, carriage return, or
+        end-of-file is received. The resulting string of characters
+        are pointed to by <tt class="LITERAL">str</tt>, which is a
+        character pointer provided by the user.</p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="GETSTREX" id="GETSTREX">7.4.
+        Some examples</a></h3>
+
+        <div class="EXAMPLE">
+          <a name="BSCEX" id="BSCEX"></a>
+          <p><b>Example 4. A Simple scanw example</b>
+          </p>
+
+          <pre class="PROGRAMLISTING"><span class=
+          "INLINEMEDIAOBJECT">#include &lt;curses.h&gt;
+#include &lt;string.h&gt; 
+ 
+int main()
+{
+ char mesg[]="Enter a string: ";                /* message to be appeared on the screen */
+ char str[80];
+ int row,col;                           /* to store the number of rows and *
+                                         * the number of columns of the screen */
+ initscr();                             /* start the curses mode */
+ getmaxyx(stdscr,row,col);              /* get the number of rows and columns */
+ mvprintw(row/2,(col-strlen(mesg))/2,"%s",mesg);
+                                /* print the message at the center of the screen */
+ getstr(str);
+ mvprintw(LINES - 2, 0, "You Entered: %s", str);
+ getch();
+ endwin();
+
+ return 0;
+}</span></pre>
+        </div>
+      </div>
+    </div>
+
+    <div class="SECT1">
+      <hr>
+
+      <h2 class="SECT1"><a name="ATTRIB" id="ATTRIB">8.
+      Attributes</a></h2>
+
+      <p>We have seen an example of how attributes can be used to
+      print characters with some special effects. Attributes, when
+      set prudently, can present information in an easy,
+      understandable manner. The following program takes a C file
+      as input and prints the file with comments in bold. Scan
+      through the code.</p>
+
+      <div class="EXAMPLE">
+        <a name="BSIAT" id="BSIAT"></a>
+        <p><b>Example 5. A Simple Attributes example</b>
+        </p>
+
+        <pre class="PROGRAMLISTING"><span class=
+        "INLINEMEDIAOBJECT">/* pager functionality by Joseph Spainhour" &lt;spainhou@bellsouth.net&gt; */
+#include &lt;curses.h&gt;
+#include &lt;stdlib.h&gt;
+
+int main(int argc, char *argv[])
+{ 
+  int ch, prev, row, col;
+  prev = EOF;
+  FILE *fp;
+  int y, x;
+
+  if(argc != 2)
+  {
+    printf("Usage: %s &lt;a c file name&gt;\n", argv[0]);
+    exit(1);
+  }
+  fp = fopen(argv[1], "r");
+  if(fp == NULL)
+  {
+    perror("Cannot open input file");
+    exit(1);
+  }
+  initscr();                            /* Start curses mode */
+  getmaxyx(stdscr, row, col);           /* find the boundaries of the screeen */
+  while((ch = fgetc(fp)) != EOF)        /* read the file till we reach the end */
+  {
+    getyx(stdscr, y, x);                /* get the current cursor position */
+    if(y == (row - 1))                  /* are we are at the end of the screen */
+    {
+      printw("&lt;-Press Any Key-&gt;");      /* tell the user to press a key */
+      getch();
+      clear();                          /* clear the screen */
+      move(0, 0);                       /* start at the beginning of the screen */
+    }
+    if(prev == '/' &amp;&amp; ch == '*')        /* If it is / and * then only
+                                         * switch bold on */    
+    {
+      attron(A_BOLD);                   /* cut bold on */
+      getyx(stdscr, y, x);              /* get the current cursor position */
+      move(y, x - 1);                   /* back up one space */
+      printw("%c%c", '/', ch);          /* The actual printing is done here */
+    }
+    else
+      printw("%c", ch);
+    refresh();
+    if(prev == '*' &amp;&amp; ch == '/')
+      attroff(A_BOLD);                  /* Switch it off once we got *
+                                         * and then / */
+    prev = ch;
+  }
+  endwin();                             /* End curses mode */
+  fclose(fp);
+  return 0;
+}</span></pre>
+      </div>
+
+      <p>Don't worry about all those initialization and other crap.
+      Concentrate on the while loop. It reads each character in the
+      file and searches for the pattern /*. Once it spots the
+      pattern, it switches the BOLD attribute on with <tt class=
+      "LITERAL">attron()</tt> . When we get the pattern */ it is
+      switched off by <tt class="LITERAL">attroff()</tt> .</p>
+
+      <p>The above program also introduces us to two useful
+      functions <tt class="LITERAL">getyx()</tt> and <tt class=
+      "LITERAL">move()</tt>. The first function gets the
+      co-ordinates of the present cursor into the variables y, x.
+      Since getyx() is a macro we don't have to pass pointers to
+      variables. The function <tt class="LITERAL">move()</tt> moves
+      the cursor to the co-ordinates given to it.</p>
+
+      <p>The above program is really a simple one which doesn't do
+      much. On these lines one could write a more useful program
+      which reads a C file, parses it and prints it in different
+      colors. One could even extend it to other languages as
+      well.</p>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="ATTRIBDETAILS" id=
+        "ATTRIBDETAILS">8.1. The details</a></h3>
+
+        <p>Let's get into more details of attributes. The functions
+        <tt class="LITERAL">attron(), attroff(), attrset()</tt> ,
+        and their sister functions <tt class=
+        "LITERAL">attr_get()</tt>, etc. can be used to switch
+        attributes on/off , get attributes and produce a colorful
+        display.</p>
+
+        <p>The functions attron and attroff take a bit-mask of
+        attributes and switch them on or off, respectively. The
+        following video attributes, which are defined in
+        &lt;curses.h&gt; can be passed to these functions.</p>
+
+        <pre class="PROGRAMLISTING">    
+    A_NORMAL        Normal display (no highlight)
+    A_STANDOUT      Best highlighting mode of the terminal.
+    A_UNDERLINE     Underlining
+    A_REVERSE       Reverse video
+    A_BLINK         Blinking
+    A_DIM           Half bright
+    A_BOLD          Extra bright or bold
+    A_PROTECT       Protected mode
+    A_INVIS         Invisible or blank mode
+    A_ALTCHARSET    Alternate character set
+    A_CHARTEXT      Bit-mask to extract a character
+    COLOR_PAIR(n)   Color-pair number n 
+    </pre>
+        <p>The last one is the most colorful one :-) Colors are
+        explained in the <a href="#color" target="_top">next
+        sections</a>.</p>
+
+        <p>We can OR(|) any number of above attributes to get a
+        combined effect. If you wanted reverse video with blinking
+        characters you can use</p>
+
+        <pre class=
+        "PROGRAMLISTING">    attron(A_REVERSE | A_BLINK);</pre>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="ATTRONVSATTRSET" id=
+        "ATTRONVSATTRSET">8.2. attron() vs attrset()</a></h3>
+
+        <p>Then what is the difference between attron() and
+        attrset()? attrset sets the attributes of window whereas
+        attron just switches on the attribute given to it. So
+        attrset() fully overrides whatever attributes the window
+        previously had and sets it to the new attribute(s).
+        Similarly attroff() just switches off the attribute(s)
+        given to it as an argument. This gives us the flexibility
+        of managing attributes easily.But if you use them
+        carelessly you may loose track of what attributes the
+        window has and garble the display. This is especially true
+        while managing menus with colors and highlighting. So
+        decide on a consistent policy and stick to it. You can
+        always use <tt class="LITERAL">standend()</tt> which is
+        equivalent to <tt class="LITERAL">attrset(A_NORMAL)</tt>
+        which turns off all attributes and brings you to normal
+        mode.</p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="ATTRGET" id="ATTRGET">8.3.
+        attr_get()</a></h3>
+
+        <p>The function attr_get() gets the current attributes and
+        color pair of the window. Though we might not use this as
+        often as the above functions, this is useful in scanning
+        areas of screen. Say we wanted to do some complex update on
+        screen and we are not sure what attribute each character is
+        associated with. Then this function can be used with either
+        attrset or attron to produce the desired effect.</p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="ATTRFUNCS" id="ATTRFUNCS">8.4.
+        attr_ functions</a></h3>
+
+        <p>There are series of functions like attr_set(), attr_on,
+        etc. These are similar to above functions except that they
+        take parameters of type <tt class=
+        "LITERAL">attr_t</tt>.</p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="WATTRFUNCS" id="WATTRFUNCS">8.5.
+        wattr functions</a></h3>
+
+        <p>For each of the above functions we have a corresponding
+        function with 'w' which operates on a particular window.
+        The above functions operate on stdscr.</p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="CHGAT" id="CHGAT">8.6. chgat()
+        functions</a></h3>
+
+        <p>The function chgat() is listed in the end of the man
+        page curs_attr. It actually is a useful one. This function
+        can be used to set attributes for a group of characters
+        without moving. I mean it !!! without moving the cursor :-)
+        It changes the attributes of a given number of characters
+        starting at the current cursor location.</p>
+
+        <p>We can give -1 as the character count to update till end
+        of line. If you want to change attributes of characters
+        from current position to end of line, just use this.</p>
+
+        <pre class=
+        "PROGRAMLISTING">    chgat(-1, A_REVERSE, 0, NULL);</pre>
+        <p>This function is useful when changing attributes for
+        characters that are already on the screen. Move to the
+        character from which you want to change and change the
+        attribute.</p>
+
+        <p>Other functions wchgat(), mvchgat(), wchgat() behave
+        similarly except that the w functions operate on the
+        particular window. The mv functions first move the cursor
+        then perform the work given to them. Actually chgat is a
+        macro which is replaced by a wchgat() with stdscr as the
+        window. Most of the "w-less" functions are macros.</p>
+
+        <div class="EXAMPLE">
+          <a name="BWICH" id="BWICH"></a>
+          <p><b>Example 6. Chgat() Usage example</b>
+          </p>
+
+          <pre class="PROGRAMLISTING"><span class=
+          "INLINEMEDIAOBJECT">#include &lt;curses.h&gt;
+
+int main(int argc, char *argv[])
+{       initscr();                      /* Start curses mode            */
+        start_color();                  /* Start color functionality    */
+        
+        init_pair(1, COLOR_CYAN, COLOR_BLACK);
+        printw("A Big string which i didn't care to type fully ");
+        mvchgat(0, 0, -1, A_BLINK, 1, NULL);    
+        /* 
+         * First two parameters specify the position at which to start 
+         * Third parameter number of characters to update. -1 means till 
+         * end of line
+         * Forth parameter is the normal attribute you wanted to give 
+         * to the character
+         * Fifth is the color index. It is the index given during init_pair()
+         * use 0 if you didn't want color
+         * Sixth one is always NULL 
+         */
+        refresh();
+        getch();
+        endwin();                       /* End curses mode                */
+        return 0;
+}</span></pre>
+        </div>
+
+        <p>This example also introduces us to the color world of
+        curses. Colors will be explained in detail later. Use 0 for
+        no color.</p>
+      </div>
+    </div>
+
+    <div class="SECT1">
+      <hr>
+
+      <h2 class="SECT1"><a name="WINDOWS" id="WINDOWS">9.
+      Windows</a></h2>
+
+      <p>Windows form the most important concept in curses. You
+      have seen the standard window stdscr above where all the
+      functions implicitly operated on this window. Now to make
+      design even a simplest GUI, you need to resort to windows.
+      The main reason you may want to use windows is to manipulate
+      parts of the screen separately, for better efficiency, by
+      updating only the windows that need to be changed and for a
+      better design. I would say the last reason is the most
+      important in going for windows. You should always strive for
+      a better and easy-to-manage design in your programs. If you
+      are writing big, complex GUIs this is of pivotal importance
+      before you start doing anything.</p>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="WINDOWBASICS" id=
+        "WINDOWBASICS">9.1. The basics</a></h3>
+
+        <p>A Window can be created by calling the function
+        <tt class="LITERAL">newwin()</tt>. It doesn't create any
+        thing on the screen actually. It allocates memory for a
+        structure to manipulate the window and updates the
+        structure with data regarding the window such as its size,
+        beginy, beginx, etc. Hence in curses, a window is just an
+        abstraction of an imaginary window, which can be
+        manipulated independent of other parts of screen. The
+        function newwin() returns a pointer to structure WINDOW,
+        which can be passed to window related functions such as
+        wprintw(), etc. Finally the window can be destroyed with
+        delwin(). It will deallocate the memory associated with the
+        window structure.</p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="LETBEWINDOW" id=
+        "LETBEWINDOW">9.2. Let there be a Window !!!</a></h3>
+
+        <p>What fun is it, if a window is created and we can't see
+        it. So the fun part begins by displaying the window. The
+        function <tt class="LITERAL">box()</tt> can be used to draw
+        a border around the window. Let's explore these functions
+        in more detail in this example.</p>
+
+        <div class="EXAMPLE">
+          <a name="BWIBO" id="BWIBO"></a>
+          <p><b>Example 7. Window Border example</b>
+          </p>
+
+          <pre class="PROGRAMLISTING"><span class=
+          "INLINEMEDIAOBJECT">#include &lt;curses.h&gt;
+
+WINDOW *create_newwin(int height, int width, int starty, int startx);
+void destroy_win(WINDOW *local_win);
+
+int main(int argc, char *argv[])
+{       WINDOW *my_win;
+        int startx, starty, width, height;
+        int ch;
+
+        initscr();                      /* Start curses mode            */
+        cbreak();                       /* Line buffering disabled, Pass on
+                                         * everty thing to me           */
+        keypad(stdscr, TRUE);           /* I need that nifty F1         */
+
+        height = 3;
+        width = 10;
+        starty = (LINES - height) / 2;  /* Calculating for a center placement */
+        startx = (COLS - width) / 2;    /* of the window                */
+        printw("Press F1 to exit");
+        refresh();
+        my_win = create_newwin(height, width, starty, startx);
+
+        while((ch = getch()) != KEY_F(1))
+        {       switch(ch)
+                {       case KEY_LEFT:
+                                destroy_win(my_win);
+                                my_win = create_newwin(height, width, starty,--startx);
+                                break;
+                        case KEY_RIGHT:
+                                destroy_win(my_win);
+                                my_win = create_newwin(height, width, starty,++startx);
+                                break;
+                        case KEY_UP:
+                                destroy_win(my_win);
+                                my_win = create_newwin(height, width, --starty,startx);
+                                break;
+                        case KEY_DOWN:
+                                destroy_win(my_win);
+                                my_win = create_newwin(height, width, ++starty,startx);
+                                break;  
+                }
+        }
+                
+        endwin();                       /* End curses mode                */
+        return 0;
+}
+
+WINDOW *create_newwin(int height, int width, int starty, int startx)
+{       WINDOW *local_win;
+
+        local_win = newwin(height, width, starty, startx);
+        box(local_win, 0 , 0);          /* 0, 0 gives default characters 
+                                         * for the vertical and horizontal
+                                         * lines                        */
+        wrefresh(local_win);            /* Show that box                */
+
+        return local_win;
+}
+
+void destroy_win(WINDOW *local_win)
+{       
+        /* box(local_win, ' ', ' '); : This won't produce the desired
+         * result of erasing the window. It will leave its four corners 
+         * and so an ugly remnant of window. 
+         */
+        wborder(local_win, ' ', ' ', ' ',' ',' ',' ',' ',' ');
+        /* The parameters taken are 
+         * 1. win: the window on which to operate
+         * 2. ls: character to be used for the left side of the window 
+         * 3. rs: character to be used for the right side of the window 
+         * 4. ts: character to be used for the top side of the window 
+         * 5. bs: character to be used for the bottom side of the window 
+         * 6. tl: character to be used for the top left corner of the window 
+         * 7. tr: character to be used for the top right corner of the window 
+         * 8. bl: character to be used for the bottom left corner of the window 
+         * 9. br: character to be used for the bottom right corner of the window
+         */
+        wrefresh(local_win);
+        delwin(local_win);
+}</span></pre>
+        </div>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="BORDEREXEXPL" id=
+        "BORDEREXEXPL">9.3. Explanation</a></h3>
+
+        <p>Don't scream. I know it is a big example. But I have to
+        explain some important things here :-). This program
+        creates a rectangular window that can be moved with left,
+        right, up, down arrow keys. It repeatedly creates and
+        destroys windows as user press a key. Don't go beyond the
+        screen limits. Checking for those limits is left as an
+        exercise for the reader. Let's dissect it by line by
+        line.</p>
+
+        <p>The <tt class="LITERAL">create_newwin()</tt> function
+        creates a window with <tt class="LITERAL">newwin()</tt> and
+        displays a border around it with box. The function
+        <tt class="LITERAL">destroy_win()</tt> first erases the
+        window from screen by painting a border with ' ' character
+        and then calling <tt class="LITERAL">delwin()</tt> to
+        deallocate memory related to it. Depending on the key the
+        user presses, starty or startx is changed and a new window
+        is created.</p>
+
+        <p>In the destroy_win, as you can see, I used wborder
+        instead of box. The reason is written in the comments (You
+        missed it. I know. Read the code :-)). wborder draws a
+        border around the window with the characters given to it as
+        the 4 corner points and the 4 lines. To put it clearly, if
+        you have called wborder as below:</p>
+
+        <pre class=
+        "PROGRAMLISTING">    wborder(win, '|', '|', '-', '-', '+', '+', '+', '+');</pre>
+        <p>it produces something like</p>
+
+        <pre class="PROGRAMLISTING">    +------------+
+    |            |
+    |            |
+    |            |
+    |            |
+    |            |
+    |            |
+    +------------+</pre>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="OTHERSTUFF" id="OTHERSTUFF">9.4.
+        The other stuff in the example</a></h3>
+
+        <p>You can also see in the above examples, that I have used
+        the variables COLS, LINES which are initialized to the
+        screen sizes after initscr(). They can be useful in finding
+        screen dimensions and finding the center co-ordinate of the
+        screen as above. The function <tt class=
+        "LITERAL">getch()</tt> as usual gets the key from keyboard
+        and according to the key it does the corresponding work.
+        This type of switch- case is very common in any GUI based
+        programs.</p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="OTHERBORDERFUNCS" id=
+        "OTHERBORDERFUNCS">9.5. Other Border functions</a></h3>
+
+        <p>Above program is grossly inefficient in that with each
+        press of a key, a window is destroyed and another is
+        created. So let's write a more efficient program which uses
+        other border related functions.</p>
+
+        <p>The following program uses <tt class=
+        "LITERAL">mvhline()</tt> and <tt class=
+        "LITERAL">mvvline()</tt> to achieve similar effect. These
+        two functions are simple. They create a horizontal or
+        vertical line of the specified length at the specified
+        position.</p>
+
+        <div class="EXAMPLE">
+          <a name="BOTBO" id="BOTBO"></a>
+          <p><b>Example 8. More border functions</b>
+          </p>
+
+          <pre class="PROGRAMLISTING"><span class=
+          "INLINEMEDIAOBJECT">#include &lt;curses.h&gt;
+
+typedef struct _win_border_struct {
+        chtype  ls, rs, ts, bs, 
+                tl, tr, bl, br;
+}WIN_BORDER;
+
+typedef struct _WIN_struct {
+
+        int startx, starty;
+        int height, width;
+        WIN_BORDER border;
+}WIN;
+
+void init_win_params(WIN *p_win);
+void print_win_params(WIN *p_win);
+void create_box(WIN *win, bool flag);
+
+int main(int argc, char *argv[])
+{       WIN win;
+        int ch;
+
+        initscr();                      /* Start curses mode            */
+        start_color();                  /* Start the color functionality */
+        cbreak();                       /* Line buffering disabled, Pass on
+                                         * everty thing to me           */
+        keypad(stdscr, TRUE);           /* I need that nifty F1         */
+        noecho();
+        init_pair(1, COLOR_CYAN, COLOR_BLACK);
+
+        /* Initialize the window parameters */
+        init_win_params(&amp;win);
+        print_win_params(&amp;win);
+
+        attron(COLOR_PAIR(1));
+        printw("Press F1 to exit");
+        refresh();
+        attroff(COLOR_PAIR(1));
+        
+        create_box(&amp;win, TRUE);
+        while((ch = getch()) != KEY_F(1))
+        {       switch(ch)
+                {       case KEY_LEFT:
+                                create_box(&amp;win, FALSE);
+                                --win.startx;
+                                create_box(&amp;win, TRUE);
+                                break;
+                        case KEY_RIGHT:
+                                create_box(&amp;win, FALSE);
+                                ++win.startx;
+                                create_box(&amp;win, TRUE);
+                                break;
+                        case KEY_UP:
+                                create_box(&amp;win, FALSE);
+                                --win.starty;
+                                create_box(&amp;win, TRUE);
+                                break;
+                        case KEY_DOWN:
+                                create_box(&amp;win, FALSE);
+                                ++win.starty;
+                                create_box(&amp;win, TRUE);
+                                break;  
+                }
+        }
+        endwin();                       /* End curses mode                */
+        return 0;
+}
+void init_win_params(WIN *p_win)
+{
+        p_win-&gt;height = 3;
+        p_win-&gt;width = 10;
+        p_win-&gt;starty = (LINES - p_win-&gt;height)/2;      
+        p_win-&gt;startx = (COLS - p_win-&gt;width)/2;
+
+        p_win-&gt;border.ls = '|';
+        p_win-&gt;border.rs = '|';
+        p_win-&gt;border.ts = '-';
+        p_win-&gt;border.bs = '-';
+        p_win-&gt;border.tl = '+';
+        p_win-&gt;border.tr = '+';
+        p_win-&gt;border.bl = '+';
+        p_win-&gt;border.br = '+';
+
+}
+void print_win_params(WIN *p_win)
+{
+#ifdef _DEBUG
+        mvprintw(25, 0, "%d %d %d %d", p_win-&gt;startx, p_win-&gt;starty, 
+                                p_win-&gt;width, p_win-&gt;height);
+        refresh();
+#endif
+}
+void create_box(WIN *p_win, bool flag)
+{       int i, j;
+        int x, y, w, h;
+
+        x = p_win-&gt;startx;
+        y = p_win-&gt;starty;
+        w = p_win-&gt;width;
+        h = p_win-&gt;height;
+
+        if(flag == TRUE)
+        {       mvaddch(y, x, p_win-&gt;border.tl);
+                mvaddch(y, x + w, p_win-&gt;border.tr);
+                mvaddch(y + h, x, p_win-&gt;border.bl);
+                mvaddch(y + h, x + w, p_win-&gt;border.br);
+                mvhline(y, x + 1, p_win-&gt;border.ts, w - 1);
+                mvhline(y + h, x + 1, p_win-&gt;border.bs, w - 1);
+                mvvline(y + 1, x, p_win-&gt;border.ls, h - 1);
+                mvvline(y + 1, x + w, p_win-&gt;border.rs, h - 1);
+
+        }
+        else
+                for(j = y; j &lt;= y + h; ++j)
+                        for(i = x; i &lt;= x + w; ++i)
+                                mvaddch(j, i, ' ');
+                                
+        refresh();
+
+}</span></pre>
+        </div>
+      </div>
+    </div>
+
+    <div class="SECT1">
+      <hr>
+
+      <h2 class="SECT1"><a name="COLOR" id="COLOR">10. Colors</a></h2>
+
+      <div class="SECT2">
+        <h3 class="SECT2"><a name="COLORBASICS" id=
+        "COLORBASICS">10.1. The basics</a></h3>
+
+        <p>Life seems dull with no colors. Curses has a nice
+        mechanism to handle colors. Let's get into the thick of the
+        things with a small program.</p>
+
+        <div class="EXAMPLE">
+          <a name="BSICO" id="BSICO"></a>
+          <p><b>Example 9. A Simple Color example</b>
+          </p>
+
+          <pre class="PROGRAMLISTING"><span class=
+          "INLINEMEDIAOBJECT">#include &lt;stdlib.h&gt;
+#include &lt;string.h&gt;
+#include &lt;curses.h&gt;
+
+void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string);
+int main(int argc, char *argv[])
+{       initscr();                      /* Start curses mode            */
+        if(has_colors() == FALSE)
+        {       endwin();
+                printf("Your terminal does not support color\n");
+                exit(1);
+        }
+        start_color();                  /* Start color                  */
+        init_pair(1, COLOR_RED, COLOR_BLACK);
+
+        attron(COLOR_PAIR(1));
+        print_in_middle(stdscr, LINES / 2, 0, 0, "Viola !!! In color ...");
+        attroff(COLOR_PAIR(1));
+        getch();
+        endwin();
+}
+void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string)
+{       int length, x, y;
+        float temp;
+
+        if(win == NULL)
+                win = stdscr;
+        getyx(win, y, x);
+        if(startx != 0)
+                x = startx;
+        if(starty != 0)
+                y = starty;
+        if(width == 0)
+                width = 80;
+
+        length = strlen(string);
+        temp = (width - length)/ 2;
+        x = startx + (int)temp;
+        mvwprintw(win, y, x, "%s", string);
+        refresh();
+}
+</span></pre>
+        </div>
+
+        <p>As you can see, to start using color, you should first
+        call the function <tt class="LITERAL">start_color()</tt>.
+        After that, you can use color capabilities of your
+        terminals using various functions. To find out whether a
+        terminal has color capabilities or not, you can use
+        <tt class="LITERAL">has_colors()</tt> function, which
+        returns FALSE if the terminal does not support color.</p>
+
+        <p>Curses initializes all the colors supported by terminal
+        when start_color() is called. These can be accessed by the
+        define constants like <tt class="LITERAL">COLOR_BLACK</tt>
+        , etc. Now to actually start using colors, you have to
+        define pairs. Colors are always used in pairs. That means
+        you have to use the function <tt class=
+        "LITERAL">init_pair()</tt> to define the foreground and
+        background for the pair number you give. After that that
+        pair number can be used as a normal attribute with
+        <tt class="LITERAL">COLOR_PAIR()</tt>function. This may
+        seem to be cumbersome at first. But this elegant solution
+        allows us to manage color pairs very easily. To appreciate
+        it, you have to look into the the source code of "dialog",
+        a utility for displaying dialog boxes from shell scripts.
+        The developers have defined foreground and background
+        combinations for all the colors they might need and
+        initialized at the beginning. This makes it very easy to
+        set attributes just by accessing a pair which we already
+        have defined as a constant.</p>
+
+        <p>The following colors are defined in <tt class=
+        "LITERAL">curses.h</tt>. You can use these as parameters
+        for various color functions.</p>
+
+        <pre class="PROGRAMLISTING">        COLOR_BLACK   0
+        COLOR_RED     1
+        COLOR_GREEN   2
+        COLOR_YELLOW  3
+        COLOR_BLUE    4
+        COLOR_MAGENTA 5
+        COLOR_CYAN    6
+        COLOR_WHITE   7</pre>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="CHANGECOLORDEFS" id=
+        "CHANGECOLORDEFS">10.2. Changing Color Definitions</a></h3>
+
+        <p>The function <tt class="LITERAL">init_color()</tt>can be
+        used to change the rgb values for the colors defined by
+        curses initially. Say you wanted to lighten the intensity
+        of red color by a minuscule. Then you can use this function
+        as</p>
+
+        <pre class=
+        "PROGRAMLISTING">    init_color(COLOR_RED, 700, 0, 0);
+    /* param 1     : color name
+     * param 2, 3, 4 : rgb content min = 0, max = 1000 */</pre>
+        <p>If your terminal cannot change the color definitions,
+        the function returns ERR. The function <tt class=
+        "LITERAL">can_change_color()</tt> can be used to find out
+        whether the terminal has the capability of changing color
+        content or not. The rgb content is scaled from 0 to 1000.
+        Initially RED color is defined with content 1000(r), 0(g),
+        0(b).</p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="COLORCONTENT" id=
+        "COLORCONTENT">10.3. Color Content</a></h3>
+
+        <p>The functions <tt class="LITERAL">color_content()</tt>
+        and <tt class="LITERAL">pair_content()</tt> can be used to
+        find the color content and foreground, background
+        combination for the pair.</p>
+      </div>
+    </div>
+
+    <div class="SECT1">
+      <hr>
+
+      <h2 class="SECT1"><a name="KEYS" id="KEYS">11. Interfacing
+      with the key board</a></h2>
+
+      <div class="SECT2">
+        <h3 class="SECT2"><a name="KEYSBASICS" id=
+        "KEYSBASICS">11.1. The Basics</a></h3>
+
+        <p>No GUI is complete without a strong user interface and
+        to interact with the user, a curses program should be
+        sensitive to key presses or the mouse actions done by the
+        user. Let's deal with the keys first.</p>
+
+        <p>As you have seen in almost all of the above examples, it
+        is very easy to get key input from the user. A simple way
+        of getting key presses is to use <tt class=
+        "LITERAL">getch()</tt> function. The cbreak mode should be
+        enabled to read keys when you are interested in reading
+        individual key hits rather than complete lines of text
+        (which usually end with a carriage return). keypad should
+        be enabled to get the Functions keys, arrow keys, etc. See
+        the initialization section for details.</p>
+
+        <p><tt class="LITERAL">getch()</tt> returns an integer
+        corresponding to the key pressed. If it is a normal
+        character, the integer value will be equivalent to the
+        character. Otherwise it returns a number which can be
+        matched with the constants defined in <tt class=
+        "LITERAL">curses.h</tt>. For example if the user presses
+        F1, the integer returned is 265. This can be checked using
+        the macro KEY_F() defined in curses.h. This makes reading
+        keys portable and easy to manage.</p>
+
+        <p>For example, if you call getch() like this</p>
+
+        <pre class="PROGRAMLISTING">    int ch;
+
+    ch = getch();</pre>
+        <p>getch() will wait for the user to press a key, (unless
+        you specified a timeout) and when user presses a key, the
+        corresponding integer is returned. Then you can check the
+        value returned with the constants defined in curses.h to
+        match against the keys you want.</p>
+
+        <p>The following code piece will do that job.</p>
+
+        <pre class="PROGRAMLISTING">    if(ch == KEY_LEFT)
+        printw("Left arrow is pressed\n");</pre>
+        <p>Let's write a small program which creates a menu which
+        can be navigated by up and down arrows.</p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="SIMPLEKEYEX" id=
+        "SIMPLEKEYEX">11.2. A Simple Key Usage example</a></h3>
+
+        <div class="EXAMPLE">
+          <a name="BSIKE" id="BSIKE"></a>
+          <p><b>Example 10. A Simple Key Usage example</b>
+          </p>
+
+          <pre class="PROGRAMLISTING"><span class=
+          "INLINEMEDIAOBJECT">#include &lt;curses.h&gt;
+
+#define WIDTH 30
+#define HEIGHT 10 
+
+int startx = 0;
+int starty = 0;
+
+char *choices[] = { 
+                        "Choice 1",
+                        "Choice 2",
+                        "Choice 3",
+                        "Choice 4",
+                        "Exit",
+                  };
+int n_choices = sizeof(choices) / sizeof(char *);
+void print_menu(WINDOW *menu_win, int highlight);
+
+int main()
+{       WINDOW *menu_win;
+        int highlight = 1;
+        int choice = 0;
+        int c;
+
+        initscr();
+        clear();
+        noecho();
+        cbreak();       /* Line buffering disabled. pass on everything */
+        startx = (80 - WIDTH) / 2;
+        starty = (24 - HEIGHT) / 2;
+                
+        menu_win = newwin(HEIGHT, WIDTH, starty, startx);
+        keypad(menu_win, TRUE);
+        mvprintw(0, 0, "Use arrow keys to go up and down, Press enter to select a choice");
+        refresh();
+        print_menu(menu_win, highlight);
+        while(1)
+        {       c = wgetch(menu_win);
+                switch(c)
+                {       case KEY_UP:
+                                if(highlight == 1)
+                                        highlight = n_choices;
+                                else
+                                        --highlight;
+                                break;
+                        case KEY_DOWN:
+                                if(highlight == n_choices)
+                                        highlight = 1;
+                                else 
+                                        ++highlight;
+                                break;
+                        case 10:
+                                choice = highlight;
+                                break;
+                        default:
+                                mvprintw(24, 0, "Character pressed is = %3d Hopefully it can be printed as '%c'", c, c);
+                                refresh();
+                                break;
+                }
+                print_menu(menu_win, highlight);
+                if(choice != 0) /* User did a choice come out of the infinite loop */
+                        break;
+        }       
+        mvprintw(23, 0, "You chose choice %d with choice string %s\n", choice, choices[choice - 1]);
+        clrtoeol();
+        refresh();
+        endwin();
+        return 0;
+}
+
+void print_menu(WINDOW *menu_win, int highlight)
+{
+        int x, y, i;    
+
+        x = 2;
+        y = 2;
+        box(menu_win, 0, 0);
+        for(i = 0; i &lt; n_choices; ++i)
+        {       if(highlight == i + 1) /* High light the present choice */
+                {       wattron(menu_win, A_REVERSE); 
+                        mvwprintw(menu_win, y, x, "%s", choices[i]);
+                        wattroff(menu_win, A_REVERSE);
+                }
+                else
+                        mvwprintw(menu_win, y, x, "%s", choices[i]);
+                ++y;
+        }
+        wrefresh(menu_win);
+}
+</span></pre>
+        </div>
+      </div>
+    </div>
+
+    <div class="SECT1">
+      <hr>
+
+      <h2 class="SECT1"><a name="MOUSE" id="MOUSE">12. Interfacing
+      with the mouse</a></h2>
+
+      <p>Now that you have seen how to get keys, lets do the same
+      thing from mouse. Usually each UI allows the user to interact
+      with both keyboard and mouse.</p>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="MOUSEBASICS" id=
+        "MOUSEBASICS">12.1. The Basics</a></h3>
+
+        <p>Before you do any thing else, the events you want to
+        receive have to be enabled with <tt class=
+        "LITERAL">mousemask()</tt>.</p>
+
+        <pre class=
+        "PROGRAMLISTING">    mousemask(  mmask_t newmask,    /* The events you want to listen to */
+                mmask_t *oldmask)    /* The old events mask                */</pre>
+        <p>The first parameter to above function is a bit mask of
+        events you would like to listen. By default, all the events
+        are turned off. The bit mask <tt class=
+        "LITERAL">ALL_MOUSE_EVENTS</tt> can be used to get all the
+        events.</p>
+
+        <p>The following are all the event masks:</p>
+
+        <pre class="PROGRAMLISTING">    Name            Description
+       ---------------------------------------------------------------------
+       BUTTON1_PRESSED          mouse button 1 down
+       BUTTON1_RELEASED         mouse button 1 up
+       BUTTON1_CLICKED          mouse button 1 clicked
+       BUTTON1_DOUBLE_CLICKED   mouse button 1 double clicked
+       BUTTON1_TRIPLE_CLICKED   mouse button 1 triple clicked
+       BUTTON2_PRESSED          mouse button 2 down
+       BUTTON2_RELEASED         mouse button 2 up
+       BUTTON2_CLICKED          mouse button 2 clicked
+       BUTTON2_DOUBLE_CLICKED   mouse button 2 double clicked
+       BUTTON2_TRIPLE_CLICKED   mouse button 2 triple clicked
+       BUTTON3_PRESSED          mouse button 3 down
+       BUTTON3_RELEASED         mouse button 3 up
+       BUTTON3_CLICKED          mouse button 3 clicked
+       BUTTON3_DOUBLE_CLICKED   mouse button 3 double clicked
+       BUTTON3_TRIPLE_CLICKED   mouse button 3 triple clicked
+       BUTTON4_PRESSED          mouse button 4 down
+       BUTTON4_RELEASED         mouse button 4 up
+       BUTTON4_CLICKED          mouse button 4 clicked
+       BUTTON4_DOUBLE_CLICKED   mouse button 4 double clicked
+       BUTTON4_TRIPLE_CLICKED   mouse button 4 triple clicked
+       BUTTON_SHIFT             shift was down during button state change
+       BUTTON_CTRL              control was down during button state change
+       BUTTON_ALT               alt was down during button state change
+       ALL_MOUSE_EVENTS         report all button state changes
+       REPORT_MOUSE_POSITION    report mouse movement</pre>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="GETTINGEVENTS" id=
+        "GETTINGEVENTS">12.2. Getting the events</a></h3>
+
+        <p>Once a class of mouse events have been enabled, getch()
+        class of functions return KEY_MOUSE every time some mouse
+        event happens. Then the mouse event can be retrieved with
+        <tt class="LITERAL">getmouse()</tt>.</p>
+
+        <p>The code approximately looks like this:</p>
+
+        <pre class="PROGRAMLISTING">    MEVENT event;
+
+    ch = getch();
+    if(ch == KEY_MOUSE)
+        if(getmouse(&amp;event) == OK)
+            .    /* Do some thing with the event */
+            .
+            .</pre>
+        <p>getmouse() returns the event into the pointer given to
+        it. It is a structure which contains</p>
+
+        <pre class="PROGRAMLISTING">    typedef struct
+    {
+        short id;         /* ID to distinguish multiple devices */
+        int x, y, z;      /* event coordinates */
+        mmask_t bstate;   /* button state bits */
+    }    </pre>
+        <p>The <tt class="LITERAL">bstate</tt> is the main variable
+        we are interested in. It tells the button state of the
+        mouse.</p>
+
+        <p>Then with a code snippet like the following, we can find
+        out what happened.</p>
+
+        <pre class=
+        "PROGRAMLISTING">    if(event.bstate &amp; BUTTON1_PRESSED)
+        printw("Left Button Pressed");</pre>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="MOUSETOGETHER" id=
+        "MOUSETOGETHER">12.3. Putting it all Together</a></h3>
+
+        <p>That's pretty much interfacing with mouse. Let's create
+        the same menu and enable mouse interaction. To make things
+        simpler, key handling is removed.</p>
+
+        <div class="EXAMPLE">
+          <a name="BMOME" id="BMOME"></a>
+          <p><b>Example 11. Access the menu with mouse !!!</b>
+          </p>
+
+          <pre class="PROGRAMLISTING"><span class=
+          "INLINEMEDIAOBJECT">#include &lt;string.h&gt;
+#include &lt;curses.h&gt;
+
+#define WIDTH 30
+#define HEIGHT 10 
+
+int startx = 0;
+int starty = 0;
+
+char *choices[] = {     "Choice 1",
+                        "Choice 2",
+                        "Choice 3",
+                        "Choice 4",
+                        "Exit",
+                  };
+
+int n_choices = sizeof(choices) / sizeof(char *);
+
+void print_menu(WINDOW *menu_win, int highlight);
+void report_choice(int mouse_x, int mouse_y, int *p_choice);
+
+int main()
+{       int c, choice = 0;
+        WINDOW *menu_win;
+        MEVENT event;
+
+        /* Initialize curses */
+        initscr();
+        clear();
+        noecho();
+        cbreak();       //Line buffering disabled. pass on everything
+
+        /* Try to put the window in the middle of screen */
+        startx = (80 - WIDTH) / 2;
+        starty = (24 - HEIGHT) / 2;
+        
+        attron(A_REVERSE);
+        mvprintw(23, 1, "Click on Exit to quit (Works best in a virtual console)");
+        refresh();
+        attroff(A_REVERSE);
+
+        /* Print the menu for the first time */
+        menu_win = newwin(HEIGHT, WIDTH, starty, startx);
+        print_menu(menu_win, 1);
+        /* Get all the mouse events */
+        mousemask(ALL_MOUSE_EVENTS, NULL);
+        
+        while(1)
+        {       c = wgetch(menu_win);
+                switch(c)
+                {       case KEY_MOUSE:
+                        if(getmouse(&amp;event) == OK)
+                        {       /* When the user clicks left mouse button */
+                                if(event.bstate &amp; BUTTON1_PRESSED)
+                                {       report_choice(event.x + 1, event.y + 1, &amp;choice);
+                                        if(choice == -1) //Exit chosen
+                                                goto end;
+                                        mvprintw(22, 1, "Choice made is : %d String Chosen is \"%10s\"", choice, choices[choice - 1]);
+                                        refresh(); 
+                                }
+                        }
+                        print_menu(menu_win, choice);
+                        break;
+                }
+        }               
+end:
+        endwin();
+        return 0;
+}
+
+void print_menu(WINDOW *menu_win, int highlight)
+{
+        int x, y, i;    
+
+        x = 2;
+        y = 2;
+        box(menu_win, 0, 0);
+        for(i = 0; i &lt; n_choices; ++i)
+        {       if(highlight == i + 1)
+                {       wattron(menu_win, A_REVERSE); 
+                        mvwprintw(menu_win, y, x, "%s", choices[i]);
+                        wattroff(menu_win, A_REVERSE);
+                }
+                else
+                        mvwprintw(menu_win, y, x, "%s", choices[i]);
+                ++y;
+        }
+        wrefresh(menu_win);
+}
+
+/* Report the choice according to mouse position */
+void report_choice(int mouse_x, int mouse_y, int *p_choice)
+{       int i,j, choice;
+
+        i = startx + 2;
+        j = starty + 3;
+        
+        for(choice = 0; choice &lt; n_choices; ++choice)
+                if(mouse_y == j + choice &amp;&amp; mouse_x &gt;= i &amp;&amp; mouse_x &lt;= i + strlen(choices[choice]))
+                {       if(choice == n_choices - 1)
+                                *p_choice = -1;         
+                        else
+                                *p_choice = choice + 1; 
+                        break;
+                }
+}</span></pre>
+        </div>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="MISCMOUSEFUNCS" id=
+        "MISCMOUSEFUNCS">12.4. Miscellaneous Functions</a></h3>
+
+        <p>The functions mouse_trafo() and wmouse_trafo() can be
+        used to convert to mouse co-ordinates to screen relative
+        co-ordinates. See curs_mouse(3X) man page for details.</p>
+
+        <p>The mouseinterval function sets the maximum time (in
+        thousands of a second) that can elapse between press and
+        release events in order for them to be recognized as a
+        click. This function returns the previous interval value.
+        The default is one fifth of a second.</p>
+      </div>
+    </div>
+
+    <div class="SECT1">
+      <hr>
+
+      <h2 class="SECT1"><a name="SCREEN" id="SCREEN">13. Screen
+      Manipulation</a></h2>
+
+      <p>In this section, we will look into some functions, which
+      allow us to manage the screen efficiently and to write some
+      fancy programs. This is especially important in writing
+      games.</p>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="GETYX" id="GETYX">13.1. getyx()
+        functions</a></h3>
+
+        <p>The function <tt class="LITERAL">getyx()</tt> can be
+        used to find out the present cursor co-ordinates. It will
+        fill the values of x and y co-ordinates in the arguments
+        given to it. Since getyx() is a macro you don't have to
+        pass the address of the variables. It can be called as</p>
+
+        <pre class="PROGRAMLISTING">    getyx(win, y, x);
+    /* win: window pointer
+     *   y, x: y, x co-ordinates will be put into this variables 
+     */</pre>
+        <p>The function getparyx() gets the beginning co-ordinates
+        of the sub window relative to the main window. This is some
+        times useful to update a sub window. When designing fancy
+        stuff like writing multiple menus, it becomes difficult to
+        store the menu positions, their first option co-ordinates,
+        etc. A simple solution to this problem, is to create menus
+        in sub windows and later find the starting co-ordinates of
+        the menus by using getparyx().</p>
+
+        <p>The functions getbegyx() and getmaxyx() store current
+        window's beginning and maximum co-ordinates. These
+        functions are useful in the same way as above in managing
+        the windows and sub windows effectively.</p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="SCREENDUMP" id=
+        "SCREENDUMP">13.2. Screen Dumping</a></h3>
+
+        <p>While writing games, some times it becomes necessary to
+        store the state of the screen and restore it back to the
+        same state. The function scr_dump() can be used to dump the
+        screen contents to a file given as an argument. Later it
+        can be restored by scr_restore function. These two simple
+        functions can be used effectively to maintain a fast moving
+        game with changing scenarios.</p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="WINDOWDUMP" id=
+        "WINDOWDUMP">13.3. Window Dumping</a></h3>
+
+        <p>To store and restore windows, the functions <tt class=
+        "LITERAL">putwin()</tt> and <tt class=
+        "LITERAL">getwin()</tt> can be used. <tt class=
+        "LITERAL">putwin()</tt> puts the present window state into
+        a file, which can be later restored by <tt class=
+        "LITERAL">getwin()</tt>.</p>
+
+        <p>The function <tt class="LITERAL">copywin()</tt> can be
+        used to copy a window completely onto another window. It
+        takes the source and destination windows as parameters and
+        according to the rectangle specified, it copies the
+        rectangular region from source to destination window. Its
+        last parameter specifies whether to overwrite or just
+        overlay the contents on to the destination window. If this
+        argument is true, then the copying is non-destructive.</p>
+      </div>
+    </div>
+
+    <div class="SECT1">
+      <hr>
+
+      <h2 class="SECT1"><a name="MISC" id="MISC">14. Miscellaneous
+      features</a></h2>
+
+      <p>Now you know enough features to write a good curses
+      program, with all bells and whistles. There are some
+      miscellaneous functions which are useful in various cases.
+      Let's go headlong into some of those.</p>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="CURSSET" id="CURSSET">14.1.
+        curs_set()</a></h3>
+
+        <p>This function can be used to make the cursor invisible.
+        The parameter to this function should be</p>
+
+        <pre class="PROGRAMLISTING">    0 : invisible      or
+    1 : normal    or
+    2 : very visible.</pre>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="TEMPLEAVE" id="TEMPLEAVE">14.2.
+        Temporarily Leaving Curses mode</a></h3>
+
+        <p>Some times you may want to get back to cooked mode
+        (normal line buffering mode) temporarily. In such a case
+        you will first need to save the tty modes with a call to
+        <tt class="LITERAL">def_prog_mode()</tt> and then call
+        <tt class="LITERAL">endwin()</tt> to end the curses mode.
+        This will leave you in the original tty mode. To get back
+        to curses once you are done, call <tt class=
+        "LITERAL">reset_prog_mode()</tt> . This function returns
+        the tty to the state stored by <tt class=
+        "LITERAL">def_prog_mode()</tt>. Then do refresh(), and you
+        are back to the curses mode. Here is an example showing the
+        sequence of things to be done.</p>
+
+        <div class="EXAMPLE">
+          <a name="BTELE" id="BTELE"></a>
+          <p><b>Example 12. Temporarily Leaving Curses Mode</b>
+          </p>
+
+          <pre class="PROGRAMLISTING"><span class=
+          "INLINEMEDIAOBJECT">#include &lt;stdlib.h&gt;
+#include &lt;curses.h&gt;
+
+int main()
+{       
+        initscr();                      /* Start curses mode              */
+        printw("Hello World !!!\n");    /* Print Hello World              */
+        refresh();                      /* Print it on to the real screen */
+        def_prog_mode();                /* Save the tty modes             */
+        endwin();                       /* End curses mode temporarily    */
+        system("/bin/sh");              /* Do whatever you like in cooked mode */
+        reset_prog_mode();              /* Return to the previous tty mode*/
+                                        /* stored by def_prog_mode()      */
+        refresh();                      /* Do refresh() to restore the    */
+                                        /* Screen contents                */
+        printw("Another String\n");     /* Back to curses use the full    */
+        refresh();                      /* capabilities of curses         */
+        endwin();                       /* End curses mode                */
+
+        return 0;
+}</span></pre>
+        </div>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="ACSVARS" id="ACSVARS">14.3. ACS_
+        variables</a></h3>
+
+        <p>If you have ever programmed in DOS, you know about those
+        nifty characters in extended character set. They are
+        printable only on some terminals. NCURSES functions like
+        <tt class="LITERAL">box()</tt> use these characters. All
+        these variables start with ACS meaning alternative
+        character set. You might have noticed me using these
+        characters in some of the programs above. Here is an
+        example showing all the characters.</p>
+
+        <div class="EXAMPLE">
+          <a name="BACSVARS" id="BACSVARS"></a>
+          <p><b>Example 13. ACS Variables Example</b>
+          </p>
+
+          <pre class="PROGRAMLISTING"><span class=
+          "INLINEMEDIAOBJECT">#include &lt;curses.h&gt;
+
+int main()
+{
+        initscr();
+
+        printw("Upper left corner           "); addch(ACS_ULCORNER); printw("\n"); 
+        printw("Lower left corner           "); addch(ACS_LLCORNER); printw("\n");
+        printw("Lower right corner          "); addch(ACS_LRCORNER); printw("\n");
+        printw("Tee pointing right          "); addch(ACS_LTEE); printw("\n");
+        printw("Tee pointing left           "); addch(ACS_RTEE); printw("\n");
+        printw("Tee pointing up             "); addch(ACS_BTEE); printw("\n");
+        printw("Tee pointing down           "); addch(ACS_TTEE); printw("\n");
+        printw("Horizontal line             "); addch(ACS_HLINE); printw("\n");
+        printw("Vertical line               "); addch(ACS_VLINE); printw("\n");
+        printw("Large Plus or cross over    "); addch(ACS_PLUS); printw("\n");
+        printw("Scan Line 1                 "); addch(ACS_S1); printw("\n");
+        printw("Scan Line 3                 "); addch(ACS_S3); printw("\n");
+        printw("Scan Line 7                 "); addch(ACS_S7); printw("\n");
+        printw("Scan Line 9                 "); addch(ACS_S9); printw("\n");
+        printw("Diamond                     "); addch(ACS_DIAMOND); printw("\n");
+        printw("Checker board (stipple)     "); addch(ACS_CKBOARD); printw("\n");
+        printw("Degree Symbol               "); addch(ACS_DEGREE); printw("\n");
+        printw("Plus/Minus Symbol           "); addch(ACS_PLMINUS); printw("\n");
+        printw("Bullet                      "); addch(ACS_BULLET); printw("\n");
+        printw("Arrow Pointing Left         "); addch(ACS_LARROW); printw("\n");
+        printw("Arrow Pointing Right        "); addch(ACS_RARROW); printw("\n");
+        printw("Arrow Pointing Down         "); addch(ACS_DARROW); printw("\n");
+        printw("Arrow Pointing Up           "); addch(ACS_UARROW); printw("\n");
+        printw("Board of squares            "); addch(ACS_BOARD); printw("\n");
+        printw("Lantern Symbol              "); addch(ACS_LANTERN); printw("\n");
+        printw("Solid Square Block          "); addch(ACS_BLOCK); printw("\n");
+        printw("Less/Equal sign             "); addch(ACS_LEQUAL); printw("\n");
+        printw("Greater/Equal sign          "); addch(ACS_GEQUAL); printw("\n");
+        printw("Pi                          "); addch(ACS_PI); printw("\n");
+        printw("Not equal                   "); addch(ACS_NEQUAL); printw("\n");
+        printw("UK pound sign               "); addch(ACS_STERLING); printw("\n");
+
+        refresh();
+        getch();
+        endwin();
+
+        return 0;
+}</span></pre>
+        </div>
+      </div>
+    </div>
+
+    <div class="SECT1">
+      <hr>
+
+      <h2 class="SECT1"><a name="OTHERLIB" id="OTHERLIB">15. Other
+      libraries</a></h2>
+
+      <p>Apart from the curses library, there are few text mode
+      libraries, which provide more functionality and a lot of
+      features. The following sections explain three standard
+      libraries which are usually distributed along with
+      curses.</p>
+    </div>
+
+    <div class="SECT1">
+      <hr>
+
+      <h2 class="SECT1"><a name="PANELS" id="PANELS">16. Panel
+      Library</a></h2>
+
+      <p>Now that you are proficient in curses, you wanted to do
+      some thing big. You created a lot of overlapping windows to
+      give a professional windows-type look. Unfortunately, it soon
+      becomes difficult to manage these. The multiple refreshes,
+      updates plunge you into a nightmare. The overlapping windows
+      create blotches, whenever you forget to refresh the windows
+      in the proper order.</p>
+
+      <p>Don't despair. There is an elegant solution provided in
+      panels library. In the words of developers of ncurses</p>
+
+      <p><span class="emphasis"><i class="EMPHASIS">When your
+      interface design is such that windows may dive deeper into
+      the visibility stack or pop to the top at runtime, the
+      resulting book-keeping can be tedious and difficult to get
+      right. Hence the panels library.</i></span>
+      </p>
+
+      <p>If you have lot of overlapping windows, then panels
+      library is the way to go. It obviates the need of doing
+      series of wnoutrefresh(), doupdate() and relieves the burden
+      of doing it correctly(bottom up). The library maintains
+      information about the order of windows, their overlapping and
+      update the screen properly. So why wait? Let's take a close
+      peek into panels.</p>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="PANELBASICS" id=
+        "PANELBASICS">16.1. The Basics</a></h3>
+
+        <p>Panel object is a window that is implicitly treated as
+        part of a deck including all other panel objects. The deck
+        is treated as a stack with the top panel being completely
+        visible and the other panels may or may not be obscured
+        according to their positions. So the basic idea is to
+        create a stack of overlapping panels and use panels library
+        to display them correctly. There is a function similar to
+        refresh() which, when called , displays panels in the
+        correct order. Functions are provided to hide or show
+        panels, move panels, change its size, etc. The overlapping
+        problem is managed by the panels library during all the
+        calls to these functions.</p>
+
+        <p>The general flow of a panel program goes like this:</p>
+
+        <ol type="1">
+          <li>
+            <p>Create the windows (with newwin()) to be attached to
+            the panels.</p>
+          </li>
+
+          <li>
+            <p>Create panels with the chosen visibility order.
+            Stack them up according to the desired visibility. The
+            function new_panel() is used to created panels.</p>
+          </li>
+
+          <li>
+            <p>Call update_panels() to write the panels to the
+            virtual screen in correct visibility order. Do a
+            doupdate() to show it on the screen.</p>
+          </li>
+
+          <li>
+            <p>Mainpulate the panels with show_panel(),
+            hide_panel(), move_panel(), etc. Make use of helper
+            functions like panel_hidden() and panel_window(). Make
+            use of user pointer to store custom data for a panel.
+            Use the functions set_panel_userptr() and
+            panel_userptr() to set and get the user pointer for a
+            panel.</p>
+          </li>
+
+          <li>
+            <p>When you are done with the panel use del_panel() to
+            delete the panel.</p>
+          </li>
+        </ol>
+
+        <p>Let's make the concepts clear, with some programs. The
+        following is a simple program which creates 3 overlapping
+        panels and shows them on the screen.</p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="COMPILEPANELS" id=
+        "COMPILEPANELS">16.2. Compiling With the Panels Library</a></h3>
+
+        <p>To use panels library functions, you have to include
+        panel.h and to link the program with panels library the
+        flag -lpanel should be added along with -lncurses in that
+        order.</p>
+
+        <pre class="PROGRAMLISTING">    #include &lt;panel.h&gt;
+    .
+    .
+    .
+
+    compile and link: gcc &lt;program file&gt; -lpanel -lncurses</pre>
+        <div class="EXAMPLE">
+          <a name="PPASI" id="PPASI"></a>
+          <p><b>Example 14. Panel basics</b>
+          </p>
+
+          <pre class="PROGRAMLISTING"><span class=
+          "INLINEMEDIAOBJECT">#include &lt;panel.h&gt;
+
+int main()
+{       WINDOW *my_wins[3];
+        PANEL  *my_panels[3];
+        int lines = 10, cols = 40, y = 2, x = 4, i;
+
+        initscr();
+        cbreak();
+        noecho();
+
+        /* Create windows for the panels */
+        my_wins[0] = newwin(lines, cols, y, x);
+        my_wins[1] = newwin(lines, cols, y + 1, x + 5);
+        my_wins[2] = newwin(lines, cols, y + 2, x + 10);
+
+        /* 
+         * Create borders around the windows so that you can see the effect
+         * of panels
+         */
+        for(i = 0; i &lt; 3; ++i)
+                box(my_wins[i], 0, 0);
+
+        /* Attach a panel to each window */     /* Order is bottom up */
+        my_panels[0] = new_panel(my_wins[0]);   /* Push 0, order: stdscr-0 */
+        my_panels[1] = new_panel(my_wins[1]);   /* Push 1, order: stdscr-0-1 */
+        my_panels[2] = new_panel(my_wins[2]);   /* Push 2, order: stdscr-0-1-2 */
+
+        /* Update the stacking order. 2nd panel will be on top */
+        update_panels();
+
+        /* Show it on the screen */
+        doupdate();
+        
+        getch();
+        endwin();
+}
+</span></pre>
+        </div>
+
+        <p>As you can see, above program follows a simple flow as
+        explained. The windows are created with newwin() and then
+        they are attached to panels with new_panel(). As we attach
+        one panel after another, the stack of panels gets updated.
+        To put them on screen update_panels() and doupdate() are
+        called.</p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="PANELBROWSING" id=
+        "PANELBROWSING">16.3. Panel Window Browsing</a></h3>
+
+        <p>A slightly complicated example is given below. This
+        program creates 3 windows which can be cycled through using
+        tab. Have a look at the code.</p>
+
+        <div class="EXAMPLE">
+          <a name="PPABR" id="PPABR"></a>
+          <p><b>Example 15. Panel Window Browsing Example</b>
+          </p>
+
+          <pre class="PROGRAMLISTING"><span class=
+          "INLINEMEDIAOBJECT">#include &lt;string.h&gt;
+#include &lt;panel.h&gt;
+
+#define NLINES 10
+#define NCOLS 40
+
+void init_wins(WINDOW **wins, int n);
+void win_show(WINDOW *win, char *label, int label_color);
+void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string, chtype color);
+
+int main()
+{       WINDOW *my_wins[3];
+        PANEL  *my_panels[3];
+        PANEL  *top;
+        int ch;
+
+        /* Initialize curses */
+        initscr();
+        start_color();
+        cbreak();
+        noecho();
+        keypad(stdscr, TRUE);
+
+        /* Initialize all the colors */
+        init_pair(1, COLOR_RED, COLOR_BLACK);
+        init_pair(2, COLOR_GREEN, COLOR_BLACK);
+        init_pair(3, COLOR_BLUE, COLOR_BLACK);
+        init_pair(4, COLOR_CYAN, COLOR_BLACK);
+
+        init_wins(my_wins, 3);
+        
+        /* Attach a panel to each window */     /* Order is bottom up */
+        my_panels[0] = new_panel(my_wins[0]);   /* Push 0, order: stdscr-0 */
+        my_panels[1] = new_panel(my_wins[1]);   /* Push 1, order: stdscr-0-1 */
+        my_panels[2] = new_panel(my_wins[2]);   /* Push 2, order: stdscr-0-1-2 */
+
+        /* Set up the user pointers to the next panel */
+        set_panel_userptr(my_panels[0], my_panels[1]);
+        set_panel_userptr(my_panels[1], my_panels[2]);
+        set_panel_userptr(my_panels[2], my_panels[0]);
+
+        /* Update the stacking order. 2nd panel will be on top */
+        update_panels();
+
+        /* Show it on the screen */
+        attron(COLOR_PAIR(4));
+        mvprintw(LINES - 2, 0, "Use tab to browse through the windows (F1 to Exit)");
+        attroff(COLOR_PAIR(4));
+        doupdate();
+
+        top = my_panels[2];
+        while((ch = getch()) != KEY_F(1))
+        {       switch(ch)
+                {       case 9:
+                                top = (PANEL *)panel_userptr(top);
+                                top_panel(top);
+                                break;
+                }
+                update_panels();
+                doupdate();
+        }
+        endwin();
+        return 0;
+}
+
+/* Put all the windows */
+void init_wins(WINDOW **wins, int n)
+{       int x, y, i;
+        char label[80];
+
+        y = 2;
+        x = 10;
+        for(i = 0; i &lt; n; ++i)
+        {       wins[i] = newwin(NLINES, NCOLS, y, x);
+                sprintf(label, "Window Number %d", i + 1);
+                win_show(wins[i], label, i + 1);
+                y += 3;
+                x += 7;
+        }
+}
+
+/* Show the window with a border and a label */
+void win_show(WINDOW *win, char *label, int label_color)
+{       int startx, starty, height, width;
+
+        getbegyx(win, starty, startx);
+        getmaxyx(win, height, width);
+
+        box(win, 0, 0);
+        mvwaddch(win, 2, 0, ACS_LTEE); 
+        mvwhline(win, 2, 1, ACS_HLINE, width - 2); 
+        mvwaddch(win, 2, width - 1, ACS_RTEE); 
+        
+        print_in_middle(win, 1, 0, width, label, COLOR_PAIR(label_color));
+}
+
+void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string, chtype color)
+{       int length, x, y;
+        float temp;
+
+        if(win == NULL)
+                win = stdscr;
+        getyx(win, y, x);
+        if(startx != 0)
+                x = startx;
+        if(starty != 0)
+                y = starty;
+        if(width == 0)
+                width = 80;
+
+        length = strlen(string);
+        temp = (width - length)/ 2;
+        x = startx + (int)temp;
+        wattron(win, color);
+        mvwprintw(win, y, x, "%s", string);
+        wattroff(win, color);
+        refresh();
+}</span></pre>
+        </div>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="USERPTRUSING" id=
+        "USERPTRUSING">16.4. Using User Pointers</a></h3>
+
+        <p>In the above example I used user pointers to find out
+        the next window in the cycle. We can attach custom
+        information to the panel by specifying a user pointer,
+        which can point to any information you want to store. In
+        this case I stored the pointer to the next panel in the
+        cycle. User pointer for a panel can be set with the
+        function <tt class="LITERAL">set_panel_userptr()</tt>. It
+        can be accessed using the function <tt class=
+        "LITERAL">panel_userptr()</tt> which will return the user
+        pointer for the panel given as argument. After finding the
+        next panel in the cycle, it is brought to the top by the
+        function top_panel(). This function brings the panel given
+        as argument to the top of the panel stack.</p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="PANELMOVERESIZE" id=
+        "PANELMOVERESIZE">16.5. Moving and Resizing Panels</a></h3>
+
+        <p>The function <tt class="LITERAL">move_panel()</tt> can
+        be used to move a panel to the desired location. It does
+        not change the position of the panel in the stack. Make
+        sure that you use move_panel() instead mvwin() on the
+        window associated with the panel.</p>
+
+        <p>Resizing a panel is slightly complex. There is no
+        straight forward function just to resize the window
+        associated with a panel. A solution to resize a panel is to
+        create a new window with the desired sizes, change the
+        window associated with the panel using replace_panel().
+        Don't forget to delete the old window. The window
+        associated with a panel can be found by using the function
+        panel_window().</p>
+
+        <p>The following program shows these concepts, in
+        supposedly simple program. You can cycle through the window
+        with &lt;TAB&gt; as usual. To resize or move the active
+        panel press 'r' for resize 'm' for moving. Then use arrow
+        keys to resize or move it to the desired way and press
+        enter to end your resizing or moving. This example makes
+        use of user data to get the required data to do the
+        operations.</p>
+
+        <div class="EXAMPLE">
+          <a name="PPARE" id="PPARE"></a>
+          <p><b>Example 16. Panel Moving and Resizing example</b>
+          </p>
+
+          <pre class="PROGRAMLISTING"><span class=
+          "INLINEMEDIAOBJECT">#include &lt;stdlib.h&gt;
+#include &lt;string.h&gt;
+#include &lt;panel.h&gt;
+
+typedef struct _PANEL_DATA {
+        int x, y, w, h;
+        char label[80]; 
+        int label_color;
+        PANEL *next;
+}PANEL_DATA;
+
+#define NLINES 10
+#define NCOLS 40
+
+void init_wins(WINDOW **wins, int n);
+void win_show(WINDOW *win, char *label, int label_color);
+void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string, chtype color);
+void set_user_ptrs(PANEL **panels, int n);
+
+int main()
+{       WINDOW *my_wins[3];
+        PANEL  *my_panels[3];
+        PANEL_DATA  *top;
+        PANEL *stack_top;
+        WINDOW *temp_win, *old_win;
+        int ch;
+        int newx, newy, neww, newh;
+        int size = FALSE, move = FALSE;
+
+        /* Initialize curses */
+        initscr();
+        start_color();
+        cbreak();
+        noecho();
+        keypad(stdscr, TRUE);
+
+        /* Initialize all the colors */
+        init_pair(1, COLOR_RED, COLOR_BLACK);
+        init_pair(2, COLOR_GREEN, COLOR_BLACK);
+        init_pair(3, COLOR_BLUE, COLOR_BLACK);
+        init_pair(4, COLOR_CYAN, COLOR_BLACK);
+
+        init_wins(my_wins, 3);
+        
+        /* Attach a panel to each window */     /* Order is bottom up */
+        my_panels[0] = new_panel(my_wins[0]);   /* Push 0, order: stdscr-0 */
+        my_panels[1] = new_panel(my_wins[1]);   /* Push 1, order: stdscr-0-1 */
+        my_panels[2] = new_panel(my_wins[2]);   /* Push 2, order: stdscr-0-1-2 */
+
+        set_user_ptrs(my_panels, 3);
+        /* Update the stacking order. 2nd panel will be on top */
+        update_panels();
+
+        /* Show it on the screen */
+        attron(COLOR_PAIR(4));
+        mvprintw(LINES - 3, 0, "Use 'm' for moving, 'r' for resizing");
+        mvprintw(LINES - 2, 0, "Use tab to browse through the windows (F1 to Exit)");
+        attroff(COLOR_PAIR(4));
+        doupdate();
+
+        stack_top = my_panels[2];
+        top = (PANEL_DATA *)panel_userptr(stack_top);
+        newx = top-&gt;x;
+        newy = top-&gt;y;
+        neww = top-&gt;w;
+        newh = top-&gt;h;
+        while((ch = getch()) != KEY_F(1))
+        {       switch(ch)
+                {       case 9:         /* Tab */
+                                top = (PANEL_DATA *)panel_userptr(stack_top);
+                                top_panel(top-&gt;next);
+                                stack_top = top-&gt;next;
+                                top = (PANEL_DATA *)panel_userptr(stack_top);
+                                newx = top-&gt;x;
+                                newy = top-&gt;y;
+                                neww = top-&gt;w;
+                                newh = top-&gt;h;
+                                break;
+                        case 'r':       /* Re-Size*/
+                                size = TRUE;
+                                attron(COLOR_PAIR(4));
+                                mvprintw(LINES - 4, 0, "Entered Resizing :Use Arrow Keys to resize and press &lt;ENTER&gt; to end resizing");
+                                refresh();
+                                attroff(COLOR_PAIR(4));
+                                break;
+                        case 'm':       /* Move */
+                                attron(COLOR_PAIR(4));
+                                mvprintw(LINES - 4, 0, "Entered Moving: Use Arrow Keys to Move and press &lt;ENTER&gt; to end moving");
+                                refresh();
+                                attroff(COLOR_PAIR(4));
+                                move = TRUE;
+                                break;
+                        case KEY_LEFT:
+                                if(size == TRUE)
+                                {       --newx;
+                                        ++neww;
+                                }
+                                if(move == TRUE)
+                                        --newx;
+                                break;
+                        case KEY_RIGHT:
+                                if(size == TRUE)
+                                {       ++newx;
+                                        --neww;
+                                }
+                                if(move == TRUE)
+                                        ++newx;
+                                break;
+                        case KEY_UP:
+                                if(size == TRUE)
+                                {       --newy;
+                                        ++newh;
+                                }
+                                if(move == TRUE)
+                                        --newy;
+                                break;
+                        case KEY_DOWN:
+                                if(size == TRUE)
+                                {       ++newy;
+                                        --newh;
+                                }
+                                if(move == TRUE)
+                                        ++newy;
+                                break;
+                        case 10:        /* Enter */
+                                move(LINES - 4, 0);
+                                clrtoeol();
+                                refresh();
+                                if(size == TRUE)
+                                {       old_win = panel_window(stack_top);
+                                        temp_win = newwin(newh, neww, newy, newx);
+                                        replace_panel(stack_top, temp_win);
+                                        win_show(temp_win, top-&gt;label, top-&gt;label_color); 
+                                        delwin(old_win);
+                                        size = FALSE;
+                                }
+                                if(move == TRUE)
+                                {       move_panel(stack_top, newy, newx);
+                                        move = FALSE;
+                                }
+                                break;
+                        
+                }
+                attron(COLOR_PAIR(4));
+                mvprintw(LINES - 3, 0, "Use 'm' for moving, 'r' for resizing");
+                mvprintw(LINES - 2, 0, "Use tab to browse through the windows (F1 to Exit)");
+                attroff(COLOR_PAIR(4));
+                refresh();      
+                update_panels();
+                doupdate();
+        }
+        endwin();
+        return 0;
+}
+
+/* Put all the windows */
+void init_wins(WINDOW **wins, int n)
+{       int x, y, i;
+        char label[80];
+
+        y = 2;
+        x = 10;
+        for(i = 0; i &lt; n; ++i)
+        {       wins[i] = newwin(NLINES, NCOLS, y, x);
+                sprintf(label, "Window Number %d", i + 1);
+                win_show(wins[i], label, i + 1);
+                y += 3;
+                x += 7;
+        }
+}
+
+/* Set the PANEL_DATA structures for individual panels */
+void set_user_ptrs(PANEL **panels, int n)
+{       PANEL_DATA *ptrs;
+        WINDOW *win;
+        int x, y, w, h, i;
+        char temp[80];
+        
+        ptrs = (PANEL_DATA *)calloc(n, sizeof(PANEL_DATA));
+
+        for(i = 0;i &lt; n; ++i)
+        {       win = panel_window(panels[i]);
+                getbegyx(win, y, x);
+                getmaxyx(win, h, w);
+                ptrs[i].x = x;
+                ptrs[i].y = y;
+                ptrs[i].w = w;
+                ptrs[i].h = h;
+                sprintf(temp, "Window Number %d", i + 1);
+                strcpy(ptrs[i].label, temp);
+                ptrs[i].label_color = i + 1;
+                if(i + 1 == n)
+                        ptrs[i].next = panels[0];
+                else
+                        ptrs[i].next = panels[i + 1];
+                set_panel_userptr(panels[i], &amp;ptrs[i]);
+        }
+}
+
+/* Show the window with a border and a label */
+void win_show(WINDOW *win, char *label, int label_color)
+{       int startx, starty, height, width;
+
+        getbegyx(win, starty, startx);
+        getmaxyx(win, height, width);
+
+        box(win, 0, 0);
+        mvwaddch(win, 2, 0, ACS_LTEE); 
+        mvwhline(win, 2, 1, ACS_HLINE, width - 2); 
+        mvwaddch(win, 2, width - 1, ACS_RTEE); 
+        
+        print_in_middle(win, 1, 0, width, label, COLOR_PAIR(label_color));
+}
+
+void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string, chtype color)
+{       int length, x, y;
+        float temp;
+
+        if(win == NULL)
+                win = stdscr;
+        getyx(win, y, x);
+        if(startx != 0)
+                x = startx;
+        if(starty != 0)
+                y = starty;
+        if(width == 0)
+                width = 80;
+
+        length = strlen(string);
+        temp = (width - length)/ 2;
+        x = startx + (int)temp;
+        wattron(win, color);
+        mvwprintw(win, y, x, "%s", string);
+        wattroff(win, color);
+        refresh();
+}</span></pre>
+        </div>
+
+        <p>Concentrate on the main while loop. Once it finds out
+        the type of key pressed, it takes appropriate action. If
+        'r' is pressed resizing mode is started. After this the new
+        sizes are updated as the user presses the arrow keys. When
+        the user presses &lt;ENTER&gt; present selection ends and
+        panel is resized by using the concept explained. While in
+        resizing mode the program doesn't show how the window is
+        getting resized. It is left as an exercise to the reader to
+        print a dotted border while it gets resized to a new
+        position.</p>
+
+        <p>When the user presses 'm' the move mode starts. This is
+        a bit simpler than resizing. As the arrow keys are pressed
+        the new position is updated and pressing of &lt;ENTER&gt;
+        causes the panel to be moved by calling the function
+        move_panel().</p>
+
+        <p>In this program the user data which is represented as
+        PANEL_DATA, plays very important role in finding the
+        associated information with a panel. As written in the
+        comments, the PANEL_DATA stores the panel sizes, label,
+        label color and a pointer to the next panel in the
+        cycle.</p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="PANELSHOWHIDE" id=
+        "PANELSHOWHIDE">16.6. Hiding and Showing Panels</a></h3>
+
+        <p>A Panel can be hidden by using the function
+        hide_panel(). This function merely removes it form the
+        stack of panels, thus hiding it on the screen once you do
+        update_panels() and doupdate(). It doesn't destroy the
+        PANEL structure associated with the hidden panel. It can be
+        shown again by using the show_panel() function.</p>
+
+        <p>The following program shows the hiding of panels. Press
+        'a' or 'b' or 'c' to show or hide first, second and third
+        windows respectively. It uses a user data with a small
+        variable hide, which keeps track of whether the window is
+        hidden or not. For some reason the function <tt class=
+        "LITERAL">panel_hidden()</tt> which tells whether a panel
+        is hidden or not is not working. A bug report was also
+        presented by Michael Andres <a href=
+        "http://www.geocrawler.com/archives/3/344/1999/9/0/2643549/"
+        target="_top">here</a></p>
+
+        <div class="EXAMPLE">
+          <a name="PPAHI" id="PPAHI"></a>
+          <p><b>Example 17. Panel Hiding and Showing example</b>
+          </p>
+
+          <pre class="PROGRAMLISTING"><span class=
+          "INLINEMEDIAOBJECT">#include &lt;string.h&gt;
+#include &lt;panel.h&gt;
+
+typedef struct _PANEL_DATA {
+        int hide;       /* TRUE if panel is hidden */
+}PANEL_DATA;
+
+#define NLINES 10
+#define NCOLS 40
+
+void init_wins(WINDOW **wins, int n);
+void win_show(WINDOW *win, char *label, int label_color);
+void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string, chtype color);
+
+int main()
+{       WINDOW *my_wins[3];
+        PANEL  *my_panels[3];
+        PANEL_DATA panel_datas[3];
+        PANEL_DATA *temp;
+        int ch;
+
+        /* Initialize curses */
+        initscr();
+        start_color();
+        cbreak();
+        noecho();
+        keypad(stdscr, TRUE);
+
+        /* Initialize all the colors */
+        init_pair(1, COLOR_RED, COLOR_BLACK);
+        init_pair(2, COLOR_GREEN, COLOR_BLACK);
+        init_pair(3, COLOR_BLUE, COLOR_BLACK);
+        init_pair(4, COLOR_CYAN, COLOR_BLACK);
+
+        init_wins(my_wins, 3);
+        
+        /* Attach a panel to each window */     /* Order is bottom up */
+        my_panels[0] = new_panel(my_wins[0]);   /* Push 0, order: stdscr-0 */
+        my_panels[1] = new_panel(my_wins[1]);   /* Push 1, order: stdscr-0-1 */
+        my_panels[2] = new_panel(my_wins[2]);   /* Push 2, order: stdscr-0-1-2 */
+
+        /* Initialize panel data saying that nothing is hidden */
+        panel_datas[0].hide = FALSE;
+        panel_datas[1].hide = FALSE;
+        panel_datas[2].hide = FALSE;
+
+        set_panel_userptr(my_panels[0], &amp;panel_datas[0]);
+        set_panel_userptr(my_panels[1], &amp;panel_datas[1]);
+        set_panel_userptr(my_panels[2], &amp;panel_datas[2]);
+
+        /* Update the stacking order. 2nd panel will be on top */
+        update_panels();
+
+        /* Show it on the screen */
+        attron(COLOR_PAIR(4));
+        mvprintw(LINES - 3, 0, "Show or Hide a window with 'a'(first window)  'b'(Second Window)  'c'(Third Window)");
+        mvprintw(LINES - 2, 0, "F1 to Exit");
+
+        attroff(COLOR_PAIR(4));
+        doupdate();
+        
+        while((ch = getch()) != KEY_F(1))
+        {       switch(ch)
+                {       case 'a':                       
+                                temp = (PANEL_DATA *)panel_userptr(my_panels[0]);
+                                if(temp-&gt;hide == FALSE)
+                                {       hide_panel(my_panels[0]);
+                                        temp-&gt;hide = TRUE;
+                                }
+                                else
+                                {       show_panel(my_panels[0]);
+                                        temp-&gt;hide = FALSE;
+                                }
+                                break;
+                        case 'b':
+                                temp = (PANEL_DATA *)panel_userptr(my_panels[1]);
+                                if(temp-&gt;hide == FALSE)
+                                {       hide_panel(my_panels[1]);
+                                        temp-&gt;hide = TRUE;
+                                }
+                                else
+                                {       show_panel(my_panels[1]);
+                                        temp-&gt;hide = FALSE;
+                                }
+                                break;
+                        case 'c':
+                                temp = (PANEL_DATA *)panel_userptr(my_panels[2]);
+                                if(temp-&gt;hide == FALSE)
+                                {       hide_panel(my_panels[2]);
+                                        temp-&gt;hide = TRUE;
+                                }
+                                else
+                                {       show_panel(my_panels[2]);
+                                        temp-&gt;hide = FALSE;
+                                }
+                                break;
+                }
+                update_panels();
+                doupdate();
+        }
+        endwin();
+        return 0;
+}
+
+/* Put all the windows */
+void init_wins(WINDOW **wins, int n)
+{       int x, y, i;
+        char label[80];
+
+        y = 2;
+        x = 10;
+        for(i = 0; i &lt; n; ++i)
+        {       wins[i] = newwin(NLINES, NCOLS, y, x);
+                sprintf(label, "Window Number %d", i + 1);
+                win_show(wins[i], label, i + 1);
+                y += 3;
+                x += 7;
+        }
+}
+
+/* Show the window with a border and a label */
+void win_show(WINDOW *win, char *label, int label_color)
+{       int startx, starty, height, width;
+
+        getbegyx(win, starty, startx);
+        getmaxyx(win, height, width);
+
+        box(win, 0, 0);
+        mvwaddch(win, 2, 0, ACS_LTEE); 
+        mvwhline(win, 2, 1, ACS_HLINE, width - 2); 
+        mvwaddch(win, 2, width - 1, ACS_RTEE); 
+        
+        print_in_middle(win, 1, 0, width, label, COLOR_PAIR(label_color));
+}
+
+void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string, chtype color)
+{       int length, x, y;
+        float temp;
+
+        if(win == NULL)
+                win = stdscr;
+        getyx(win, y, x);
+        if(startx != 0)
+                x = startx;
+        if(starty != 0)
+                y = starty;
+        if(width == 0)
+                width = 80;
+
+        length = strlen(string);
+        temp = (width - length)/ 2;
+        x = startx + (int)temp;
+        wattron(win, color);
+        mvwprintw(win, y, x, "%s", string);
+        wattroff(win, color);
+        refresh();
+}</span></pre>
+        </div>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="PANELABOVE" id=
+        "PANELABOVE">16.7. panel_above() and panel_below()
+        Functions</a></h3>
+
+        <p>The functions <tt class="LITERAL">panel_above()</tt> and
+        <tt class="LITERAL">panel_below()</tt> can be used to find
+        out the panel above and below a panel. If the argument to
+        these functions is NULL, then they return a pointer to
+        bottom panel and top panel respectively.</p>
+      </div>
+    </div>
+
+    <div class="SECT1">
+      <hr>
+
+      <h2 class="SECT1"><a name="MENUS" id="MENUS">17. Menus
+      Library</a></h2>
+
+      <p>The menus library provides a nice extension to basic
+      curses, through which you can create menus. It provides a set
+      of functions to create menus. But they have to be customized
+      to give a nicer look, with colors, etc. Let's get into the
+      details.</p>
+
+      <p>A menu is a screen display that assists the user to choose
+      some subset of a given set of items. To put it simple, a menu
+      is a collection of items from which one or more items can be
+      chosen. Some readers might not be aware of multiple item
+      selection capability. Menu library provides functionality to
+      write menus from which the user can chose more than one item
+      as the preferred choice. This is dealt with in a later
+      section. Now it is time for some rudiments.</p>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="MENUBASICS" id=
+        "MENUBASICS">17.1. The Basics</a></h3>
+
+        <p>To create menus, you first create items, and then post
+        the menu to the display. After that, all the processing of
+        user responses is done in an elegant function menu_driver()
+        which is the work horse of any menu program.</p>
+
+        <p>The general flow of control of a menu program looks like
+        this.</p>
+
+        <ol type="1">
+          <li>
+            <p>Initialize curses</p>
+          </li>
+
+          <li>
+            <p>Create items using new_item(). You can specify a
+            name and description for the items.</p>
+          </li>
+
+          <li>
+            <p>Create the menu with new_menu() by specifying the
+            items to be attached with.</p>
+          </li>
+
+          <li>
+            <p>Post the menu with menu_post() and refresh the
+            screen.</p>
+          </li>
+
+          <li>
+            <p>Process the user requests with a loop and do
+            necessary updates to menu with menu_driver.</p>
+          </li>
+
+          <li>
+            <p>Unpost the menu with menu_unpost()</p>
+          </li>
+
+          <li>
+            <p>Free the memory allocated to menu by free_menu()</p>
+          </li>
+
+          <li>
+            <p>Free the memory allocated to the items with
+            free_item()</p>
+          </li>
+
+          <li>
+            <p>End curses</p>
+          </li>
+        </ol>
+
+        <p>Let's see a program which prints a simple menu and
+        updates the current selection with up, down arrows.</p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="COMPILEMENUS" id=
+        "COMPILEMENUS">17.2. Compiling With the Menu Library</a></h3>
+
+        <p>To use menu library functions, you have to include
+        menu.h and to link the program with menu library the flag
+        -lmenu should be added along with -lncurses in that
+        order.</p>
+
+        <pre class="PROGRAMLISTING">    #include &lt;menu.h&gt;
+    .
+    .
+    .
+
+    compile and link: gcc &lt;program file&gt; -lmenu -lncurses</pre>
+        <div class="EXAMPLE">
+          <a name="MMESI" id="MMESI"></a>
+          <p><b>Example 18. Menu Basics</b>
+          </p>
+
+          <pre class="PROGRAMLISTING"><span class=
+          "INLINEMEDIAOBJECT">#include &lt;stdlib.h&gt;
+#include &lt;curses.h&gt;
+#include &lt;menu.h&gt;
+
+#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
+#define CTRLD   4
+
+char *choices[] = {
+                        "Choice 1",
+                        "Choice 2",
+                        "Choice 3",
+                        "Choice 4",
+                        "Exit",
+                  };
+
+int main()
+{       ITEM **my_items;
+        int c;                          
+        MENU *my_menu;
+        int n_choices, i;
+        ITEM *cur_item;
+        
+        
+        initscr();
+        cbreak();
+        noecho();
+        keypad(stdscr, TRUE);
+        
+        n_choices = ARRAY_SIZE(choices);
+        my_items = (ITEM **)calloc(n_choices + 1, sizeof(ITEM *));
+
+        for(i = 0; i &lt; n_choices; ++i)
+                my_items[i] = new_item(choices[i], choices[i]);
+        my_items[n_choices] = (ITEM *)NULL;
+
+        my_menu = new_menu((ITEM **)my_items);
+        mvprintw(LINES - 2, 0, "F1 to Exit");
+        post_menu(my_menu);
+        refresh();
+
+        while((c = getch()) != KEY_F(1))
+        {   switch(c)
+            {   case KEY_DOWN:
+                        menu_driver(my_menu, REQ_DOWN_ITEM);
+                                break;
+                        case KEY_UP:
+                                menu_driver(my_menu, REQ_UP_ITEM);
+                                break;
+                }
+        }       
+
+        free_item(my_items[0]);
+        free_item(my_items[1]);
+        free_menu(my_menu);
+        endwin();
+}
+        </span></pre>
+        </div>
+
+        <p>This program demonstrates the basic concepts involved in
+        creating a menu using menus library. First we create the
+        items using new_item() and then attach them to the menu
+        with new_menu() function. After posting the menu and
+        refreshing the screen, the main processing loop starts. It
+        reads user input and takes corresponding action. The
+        function menu_driver() is the main work horse of the menu
+        system. The second parameter to this function tells what's
+        to be done with the menu. According to the parameter,
+        menu_driver() does the corresponding task. The value can be
+        either a menu navigational request, an ascii character, or
+        a KEY_MOUSE special key associated with a mouse event.</p>
+
+        <p>The menu_driver accepts following navigational
+        requests.</p>
+
+        <pre class=
+        "PROGRAMLISTING">&#13;     REQ_LEFT_ITEM         Move left to an item.
+     REQ_RIGHT_ITEM      Move right to an item.
+     REQ_UP_ITEM         Move up to an item.
+     REQ_DOWN_ITEM       Move down to an item.
+     REQ_SCR_ULINE       Scroll up a line.
+     REQ_SCR_DLINE          Scroll down a line.
+     REQ_SCR_DPAGE          Scroll down a page.
+     REQ_SCR_UPAGE         Scroll up a page.
+     REQ_FIRST_ITEM     Move to the first item.
+     REQ_LAST_ITEM         Move to the last item.
+     REQ_NEXT_ITEM         Move to the next item.
+     REQ_PREV_ITEM         Move to the previous item. 
+     REQ_TOGGLE_ITEM     Select/deselect an item.
+     REQ_CLEAR_PATTERN     Clear the menu pattern buffer.
+     REQ_BACK_PATTERN      Delete the previous character from the pattern buffer.
+     REQ_NEXT_MATCH     Move to the next item matching the pattern match.
+     REQ_PREV_MATCH     Move to the previous item matching the pattern match.&#13;</pre>
+        <p>Don't get overwhelmed by the number of options. We will
+        see them slowly one after another. The options of interest
+        in this example are REQ_UP_ITEM and REQ_DOWN_ITEM. These
+        two options when passed to menu_driver, menu driver updates
+        the current item to one item up or down respectively.</p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="MENUDRIVER" id=
+        "MENUDRIVER">17.3. Menu Driver: The work horse of the menu
+        system</a></h3>
+
+        <p>As you have seen in the above example, menu_driver plays
+        an important role in updating the menu. It is very
+        important to understand various options it takes and what
+        they do. As explained above, the second parameter to
+        menu_driver() can be either a navigational request, a
+        printable character or a KEY_MOUSE key. Let's dissect the
+        different navigational requests.</p>
+
+        <ul>
+          <li>
+            <p><span class="emphasis"><i class=
+            "EMPHASIS">REQ_LEFT_ITEM and REQ_RIGHT_ITEM</i></span>
+            </p>
+
+            <p>A Menu can be displayed with multiple columns for
+            more than one item. This can be done by using the
+            <tt class="LITERAL">menu_format()</tt>function. When a
+            multi columnar menu is displayed these requests cause
+            the menu driver to move the current selection to left
+            or right.</p>
+          </li>
+
+          <li>
+            <p><span class="emphasis"><i class=
+            "EMPHASIS">REQ_UP_ITEM and REQ_DOWN_ITEM</i></span>
+            </p>
+
+            <p>These two options you have seen in the above
+            example. These options when given, makes the
+            menu_driver to move the current selection to an item up
+            or down.</p>
+          </li>
+
+          <li>
+            <p><span class="emphasis"><i class="EMPHASIS">REQ_SCR_*
+            options</i></span>
+            </p>
+
+            <p>The four options REQ_SCR_ULINE, REQ_SCR_DLINE,
+            REQ_SCR_DPAGE, REQ_SCR_UPAGE are related to scrolling.
+            If all the items in the menu cannot be displayed in the
+            menu sub window, then the menu is scrollable. These
+            requests can be given to the menu_driver to do the
+            scrolling either one line up, down or one page down or
+            up respectively.</p>
+          </li>
+
+          <li>
+            <p><span class="emphasis"><i class=
+            "EMPHASIS">REQ_FIRST_ITEM, REQ_LAST_ITEM, REQ_NEXT_ITEM
+            and REQ_PREV_ITEM</i></span>
+            </p>
+
+            <p>These requests are self explanatory.</p>
+          </li>
+
+          <li>
+            <p><span class="emphasis"><i class=
+            "EMPHASIS">REQ_TOGGLE_ITEM</i></span>
+            </p>
+
+            <p>This request when given, toggles the present
+            selection. This option is to be used only in a multi
+            valued menu. So to use this request the option
+            O_ONEVALUE must be off. This option can be made off or
+            on with set_menu_opts().</p>
+          </li>
+
+          <li>
+            <p><span class="emphasis"><i class="EMPHASIS">Pattern
+            Requests</i></span>
+            </p>
+
+            <p>Every menu has an associated pattern buffer, which
+            is used to find the nearest match to the ascii
+            characters entered by the user. Whenever ascii
+            characters are given to menu_driver, it puts in to the
+            pattern buffer. It also tries to find the nearest match
+            to the pattern in the items list and moves current
+            selection to that item. The request REQ_CLEAR_PATTERN
+            clears the pattern buffer. The request REQ_BACK_PATTERN
+            deletes the previous character in the pattern buffer.
+            In case the pattern matches more than one item then the
+            matched items can be cycled through REQ_NEXT_MATCH and
+            REQ_PREV_MATCH which move the current selection to the
+            next and previous matches respectively.</p>
+          </li>
+
+          <li>
+            <p><span class="emphasis"><i class="EMPHASIS">Mouse
+            Requests</i></span>
+            </p>
+
+            <p>In case of KEY_MOUSE requests, according to the
+            mouse position an action is taken accordingly. The
+            action to be taken is explained in the man page as,</p>
+
+            <pre class="PROGRAMLISTING"><span class=
+            "emphasis"><i class=
+            "EMPHASIS">       If  the  second argument is the KEY_MOUSE special key, the
+       associated mouse event is translated into one of the above
+       pre-defined  requests.   Currently only clicks in the user
+       window (e.g. inside the menu display area or  the  decora&shy;
+       tion  window)  are handled. If you click above the display
+       region of the menu, a REQ_SCR_ULINE is generated,  if  you
+       doubleclick  a  REQ_SCR_UPAGE  is  generated  and  if  you
+       tripleclick a REQ_FIRST_ITEM is generated.  If  you  click
+       below  the  display region of the menu, a REQ_SCR_DLINE is
+       generated, if you doubleclick a REQ_SCR_DPAGE is generated
+       and  if  you  tripleclick a REQ_LAST_ITEM is generated. If
+       you click at an item inside the display area of the  menu,
+       the menu cursor is positioned to that item.</i></span></pre>
+          </li>
+        </ul>
+
+        <p>Each of the above requests will be explained in the
+        following lines with several examples whenever
+        appropriate.</p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="MENUWINDOWS" id=
+        "MENUWINDOWS">17.4. Menu Windows</a></h3>
+
+        <p>Every menu created is associated with a window and a sub
+        window. The menu window displays any title or border
+        associated with the menu. The menu sub window displays the
+        menu items currently available for selection. But we didn't
+        specify any window or sub window in the simple example.
+        When a window is not specified, stdscr is taken as the main
+        window, and then menu system calculates the sub window size
+        required for the display of items. Then items are displayed
+        in the calculated sub window. So let's play with these
+        windows and display a menu with a border and a title.</p>
+
+        <div class="EXAMPLE">
+          <a name="MMEWI" id="MMEWI"></a>
+          <p><b>Example 19. Menu Windows Usage example</b>
+          </p>
+
+          <pre class="PROGRAMLISTING"><span class=
+          "INLINEMEDIAOBJECT">#include &lt;stdlib.h&gt;
+#include &lt;string.h&gt;
+#include &lt;menu.h&gt;
+
+#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
+#define CTRLD   4
+
+char *choices[] = {
+                        "Choice 1",
+                        "Choice 2",
+                        "Choice 3",
+                        "Choice 4",
+                        "Exit",
+                        (char *)NULL,
+                  };
+void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string, chtype color);
+
+int main()
+{       ITEM **my_items;
+        int c;                          
+        MENU *my_menu;
+        WINDOW *my_menu_win;
+        int n_choices, i;
+        
+        /* Initialize curses */
+        initscr();
+        start_color();
+        cbreak();
+        noecho();
+        keypad(stdscr, TRUE);
+        init_pair(1, COLOR_RED, COLOR_BLACK);
+
+        /* Create items */
+        n_choices = ARRAY_SIZE(choices);
+        my_items = (ITEM **)calloc(n_choices, sizeof(ITEM *));
+        for(i = 0; i &lt; n_choices; ++i)
+                my_items[i] = new_item(choices[i], choices[i]);
+
+        /* Crate menu */
+        my_menu = new_menu((ITEM **)my_items);
+
+        /* Create the window to be associated with the menu */
+        my_menu_win = newwin(10, 40, 4, 4);
+        keypad(my_menu_win, TRUE);
+     
+        /* Set main window and sub window */
+        set_menu_win(my_menu, my_menu_win);
+        set_menu_sub(my_menu, derwin(my_menu_win, 6, 38, 3, 1));
+
+        /* Set menu mark to the string " * " */
+        set_menu_mark(my_menu, " * ");
+
+        /* Print a border around the main window and print a title */
+        box(my_menu_win, 0, 0);
+        print_in_middle(my_menu_win, 1, 0, 40, "My Menu", COLOR_PAIR(1));
+        mvwaddch(my_menu_win, 2, 0, ACS_LTEE);
+        mvwhline(my_menu_win, 2, 1, ACS_HLINE, 38);
+        mvwaddch(my_menu_win, 2, 39, ACS_RTEE);
+        mvprintw(LINES - 2, 0, "F1 to exit");
+        refresh();
+        
+        /* Post the menu */
+        post_menu(my_menu);
+        wrefresh(my_menu_win);
+
+        while((c = wgetch(my_menu_win)) != KEY_F(1))
+        {       switch(c)
+                {       case KEY_DOWN:
+                                menu_driver(my_menu, REQ_DOWN_ITEM);
+                                break;
+                        case KEY_UP:
+                                menu_driver(my_menu, REQ_UP_ITEM);
+                                break;
+                }
+                wrefresh(my_menu_win);
+        }       
+
+        /* Unpost and free all the memory taken up */
+        unpost_menu(my_menu);
+        free_menu(my_menu);
+        for(i = 0; i &lt; n_choices; ++i)
+                free_item(my_items[i]);
+        endwin();
+}
+
+void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string, chtype color)
+{       int length, x, y;
+        float temp;
+
+        if(win == NULL)
+                win = stdscr;
+        getyx(win, y, x);
+        if(startx != 0)
+                x = startx;
+        if(starty != 0)
+                y = starty;
+        if(width == 0)
+                width = 80;
+
+        length = strlen(string);
+        temp = (width - length)/ 2;
+        x = startx + (int)temp;
+        wattron(win, color);
+        mvwprintw(win, y, x, "%s", string);
+        wattroff(win, color);
+        refresh();
+}</span></pre>
+        </div>
+
+        <p>This example creates a menu with a title, border, a
+        fancy line separating title and the items. As you can see,
+        in order to attach a window to a menu the function
+        set_menu_win() has to be used. Then we attach the sub
+        window also. This displays the items in the sub window. You
+        can also set the mark string which gets displayed to the
+        left of the selected item with set_menu_mark().</p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="SCROLLMENUS" id=
+        "SCROLLMENUS">17.5. Scrolling Menus</a></h3>
+
+        <p>If the sub window given for a window is not big enough
+        to show all the items, then the menu will be scrollable.
+        When you are on the last item in the present list, if you
+        send REQ_DOWN_ITEM, it gets translated into REQ_SCR_DLINE
+        and the menu scrolls by one item. You can manually give
+        REQ_SCR_ operations to do scrolling. Let's see how it can
+        be done.</p>
+
+        <div class="EXAMPLE">
+          <a name="MMESC" id="MMESC"></a>
+          <p><b>Example 20. Scrolling Menus example</b>
+          </p>
+
+          <pre class="PROGRAMLISTING"><span class=
+          "INLINEMEDIAOBJECT">#include &lt;stdlib.h&gt;
+#include &lt;string.h&gt;
+#include &lt;curses.h&gt;
+#include &lt;menu.h&gt;
+
+#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
+#define CTRLD   4
+
+char *choices[] = {
+                        "Choice 1",
+                        "Choice 2",
+                        "Choice 3",
+                        "Choice 4",
+                        "Choice 5",
+                        "Choice 6",
+                        "Choice 7",
+                        "Choice 8",
+                        "Choice 9",
+                        "Choice 10",
+                        "Exit",
+                        (char *)NULL,
+                  };
+void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string, chtype color);
+
+int main()
+{       ITEM **my_items;
+        int c;                          
+        MENU *my_menu;
+        WINDOW *my_menu_win;
+        int n_choices, i;
+        
+        /* Initialize curses */
+        initscr();
+        start_color();
+        cbreak();
+        noecho();
+        keypad(stdscr, TRUE);
+        init_pair(1, COLOR_RED, COLOR_BLACK);
+        init_pair(2, COLOR_CYAN, COLOR_BLACK);
+
+        /* Create items */
+        n_choices = ARRAY_SIZE(choices);
+        my_items = (ITEM **)calloc(n_choices, sizeof(ITEM *));
+        for(i = 0; i &lt; n_choices; ++i)
+                my_items[i] = new_item(choices[i], choices[i]);
+
+        /* Crate menu */
+        my_menu = new_menu((ITEM **)my_items);
+
+        /* Create the window to be associated with the menu */
+        my_menu_win = newwin(10, 40, 4, 4);
+        keypad(my_menu_win, TRUE);
+     
+        /* Set main window and sub window */
+        set_menu_win(my_menu, my_menu_win);
+        set_menu_sub(my_menu, derwin(my_menu_win, 6, 38, 3, 1));
+        set_menu_format(my_menu, 5, 1);
+                        
+        /* Set menu mark to the string " * " */
+        set_menu_mark(my_menu, " * ");
+
+        /* Print a border around the main window and print a title */
+        box(my_menu_win, 0, 0);
+        print_in_middle(my_menu_win, 1, 0, 40, "My Menu", COLOR_PAIR(1));
+        mvwaddch(my_menu_win, 2, 0, ACS_LTEE);
+        mvwhline(my_menu_win, 2, 1, ACS_HLINE, 38);
+        mvwaddch(my_menu_win, 2, 39, ACS_RTEE);
+        
+        /* Post the menu */
+        post_menu(my_menu);
+        wrefresh(my_menu_win);
+        
+        attron(COLOR_PAIR(2));
+        mvprintw(LINES - 2, 0, "Use PageUp and PageDown to scroll down or up a page of items");
+        mvprintw(LINES - 1, 0, "Arrow Keys to navigate (F1 to Exit)");
+        attroff(COLOR_PAIR(2));
+        refresh();
+
+        while((c = wgetch(my_menu_win)) != KEY_F(1))
+        {       switch(c)
+                {       case KEY_DOWN:
+                                menu_driver(my_menu, REQ_DOWN_ITEM);
+                                break;
+                        case KEY_UP:
+                                menu_driver(my_menu, REQ_UP_ITEM);
+                                break;
+                        case KEY_NPAGE:
+                                menu_driver(my_menu, REQ_SCR_DPAGE);
+                                break;
+                        case KEY_PPAGE:
+                                menu_driver(my_menu, REQ_SCR_UPAGE);
+                                break;
+                }
+                wrefresh(my_menu_win);
+        }       
+
+        /* Unpost and free all the memory taken up */
+        unpost_menu(my_menu);
+        free_menu(my_menu);
+        for(i = 0; i &lt; n_choices; ++i)
+                free_item(my_items[i]);
+        endwin();
+}
+
+void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string, chtype color)
+{       int length, x, y;
+        float temp;
+
+        if(win == NULL)
+                win = stdscr;
+        getyx(win, y, x);
+        if(startx != 0)
+                x = startx;
+        if(starty != 0)
+                y = starty;
+        if(width == 0)
+                width = 80;
+
+        length = strlen(string);
+        temp = (width - length)/ 2;
+        x = startx + (int)temp;
+        wattron(win, color);
+        mvwprintw(win, y, x, "%s", string);
+        wattroff(win, color);
+        refresh();
+}</span></pre>
+        </div>
+
+        <p>This program is self-explanatory. In this example the
+        number of choices has been increased to ten, which is
+        larger than our sub window size which can hold 6 items.
+        This message has to be explicitly conveyed to the menu
+        system with the function set_menu_format(). In here we
+        specify the number of rows and columns we want to be
+        displayed for a single page. We can specify any number of
+        items to be shown, in the rows variables, if it is less
+        than the height of the sub window. If the key pressed by
+        the user is a PAGE UP or PAGE DOWN, the menu is scrolled a
+        page due to the requests (REQ_SCR_DPAGE and REQ_SCR_UPAGE)
+        given to menu_driver().</p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="MULTICOLUMN" id=
+        "MULTICOLUMN">17.6. Multi Columnar Menus</a></h3>
+
+        <p>In the above example you have seen how to use the
+        function set_menu_format(). I didn't mention what the cols
+        variable (third parameter) does. Well, If your sub window
+        is wide enough, you can opt to display more than one item
+        per row. This can be specified in the cols variable. To
+        make things simpler, the following example doesn't show
+        descriptions for the items.</p>
+
+        <div class="EXAMPLE">
+          <a name="MMEMUCO" id="MMEMUCO"></a>
+          <p><b>Example 21. Milt Columnar Menus Example</b>
+          </p>
+
+          <pre class="PROGRAMLISTING"><span class=
+          "INLINEMEDIAOBJECT">#include &lt;stdlib.h&gt;
+#include &lt;curses.h&gt;
+#include &lt;menu.h&gt;
+
+#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
+#define CTRLD   4
+
+char *choices[] = {
+                        "Choice 1", "Choice 2", "Choice 3", "Choice 4", "Choice 5",
+                        "Choice 6", "Choice 7", "Choice 8", "Choice 9", "Choice 10",
+                        "Choice 11", "Choice 12", "Choice 13", "Choice 14", "Choice 15",
+                        "Choice 16", "Choice 17", "Choice 18", "Choice 19", "Choice 20",
+                        "Exit",
+                        (char *)NULL,
+                  };
+
+int main()
+{       ITEM **my_items;
+        int c;                          
+        MENU *my_menu;
+        WINDOW *my_menu_win;
+        int n_choices, i;
+        
+        /* Initialize curses */
+        initscr();
+        start_color();
+        cbreak();
+        noecho();
+        keypad(stdscr, TRUE);
+        init_pair(1, COLOR_RED, COLOR_BLACK);
+        init_pair(2, COLOR_CYAN, COLOR_BLACK);
+
+        /* Create items */
+        n_choices = ARRAY_SIZE(choices);
+        my_items = (ITEM **)calloc(n_choices, sizeof(ITEM *));
+        for(i = 0; i &lt; n_choices; ++i)
+                my_items[i] = new_item(choices[i], choices[i]);
+
+        /* Crate menu */
+        my_menu = new_menu((ITEM **)my_items);
+
+        /* Set menu option not to show the description */
+        menu_opts_off(my_menu, O_SHOWDESC);
+
+        /* Create the window to be associated with the menu */
+        my_menu_win = newwin(10, 70, 4, 4);
+        keypad(my_menu_win, TRUE);
+     
+        /* Set main window and sub window */
+        set_menu_win(my_menu, my_menu_win);
+        set_menu_sub(my_menu, derwin(my_menu_win, 6, 68, 3, 1));
+        set_menu_format(my_menu, 5, 3);
+        set_menu_mark(my_menu, " * ");
+
+        /* Print a border around the main window and print a title */
+        box(my_menu_win, 0, 0);
+        
+        attron(COLOR_PAIR(2));
+        mvprintw(LINES - 3, 0, "Use PageUp and PageDown to scroll");
+        mvprintw(LINES - 2, 0, "Use Arrow Keys to navigate (F1 to Exit)");
+        attroff(COLOR_PAIR(2));
+        refresh();
+
+        /* Post the menu */
+        post_menu(my_menu);
+        wrefresh(my_menu_win);
+        
+        while((c = wgetch(my_menu_win)) != KEY_F(1))
+        {       switch(c)
+                {       case KEY_DOWN:
+                                menu_driver(my_menu, REQ_DOWN_ITEM);
+                                break;
+                        case KEY_UP:
+                                menu_driver(my_menu, REQ_UP_ITEM);
+                                break;
+                        case KEY_LEFT:
+                                menu_driver(my_menu, REQ_LEFT_ITEM);
+                                break;
+                        case KEY_RIGHT:
+                                menu_driver(my_menu, REQ_RIGHT_ITEM);
+                                break;
+                        case KEY_NPAGE:
+                                menu_driver(my_menu, REQ_SCR_DPAGE);
+                                break;
+                        case KEY_PPAGE:
+                                menu_driver(my_menu, REQ_SCR_UPAGE);
+                                break;
+                }
+                wrefresh(my_menu_win);
+        }       
+
+        /* Unpost and free all the memory taken up */
+        unpost_menu(my_menu);
+        free_menu(my_menu);
+        for(i = 0; i &lt; n_choices; ++i)
+                free_item(my_items[i]);
+        endwin();
+}</span></pre>
+        </div>
+
+        <p>Watch the function call to set_menu_format(). It
+        specifies the number of columns to be 3, thus displaying 3
+        items per row. We have also switched off the showing
+        descriptions with the function menu_opts_off(). There are
+        couple of functions set_menu_opts(), menu_opts_on() and
+        menu_opts() which can be used to manipulate menu options.
+        The following menu options can be specified.</p>
+
+        <pre class="PROGRAMLISTING">       O_ONEVALUE
+            Only one item can be selected for this menu.
+
+       O_SHOWDESC
+            Display  the  item  descriptions  when  the  menu  is
+            posted.
+
+       O_ROWMAJOR
+            Display the menu in row-major order.
+
+       O_IGNORECASE
+            Ignore the case when pattern-matching.
+
+       O_SHOWMATCH
+            Move the cursor to within the item  name  while  pat&shy;
+            tern-matching.
+
+       O_NONCYCLIC
+            Don't   wrap   around  next-item  and  previous-item,
+            requests to the other end of the menu.</pre>
+        <p>All options are on by default. You can switch specific
+        attributes on or off with menu_opts_on() and
+        menu_opts_off() functions. You can also use set_menu_opts()
+        to directly specify the options. The argument to this
+        function should be a OR ed value of some of those above
+        constants. The function menu_opts() can be used to find out
+        a menu's present options.</p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="MULTIVALUEMENUS" id=
+        "MULTIVALUEMENUS">17.7. Multi Valued Menus</a></h3>
+
+        <p>You might be wondering what if you switch off the option
+        O_ONEVALUE. Then the menu becomes multi-valued. That means
+        you can select more than one item. This brings us to the
+        request REQ_TOGGLE_ITEM. Let's see it in action.</p>
+
+        <div class="EXAMPLE">
+          <a name="MMETO" id="MMETO"></a>
+          <p><b>Example 22. Multi Valued Menus example</b>
+          </p>
+
+          <pre class="PROGRAMLISTING"><span class=
+          "INLINEMEDIAOBJECT">#include &lt;stdlib.h&gt;
+#include &lt;string.h&gt;
+#include &lt;curses.h&gt;
+#include &lt;menu.h&gt;
+
+#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
+#define CTRLD   4
+
+char *choices[] = {
+                        "Choice 1",
+                        "Choice 2",
+                        "Choice 3",
+                        "Choice 4",
+                        "Choice 5",
+                        "Choice 6",
+                        "Choice 7",
+                        "Exit",
+                  };
+
+int main()
+{       ITEM **my_items;
+        int c;                          
+        MENU *my_menu;
+        int n_choices, i;
+        ITEM *cur_item;
+        
+        /* Initialize curses */ 
+        initscr();
+        cbreak();
+        noecho();
+        keypad(stdscr, TRUE);
+
+        /* Initialize items */
+        n_choices = ARRAY_SIZE(choices);
+        my_items = (ITEM **)calloc(n_choices + 1, sizeof(ITEM *));
+        for(i = 0; i &lt; n_choices; ++i)
+                my_items[i] = new_item(choices[i], choices[i]);
+        my_items[n_choices] = (ITEM *)NULL;
+
+        my_menu = new_menu((ITEM **)my_items);
+
+        /* Make the menu multi valued */
+        menu_opts_off(my_menu, O_ONEVALUE);
+
+        mvprintw(LINES - 3, 0, "Use &lt;SPACE&gt; to select or unselect an item.");
+        mvprintw(LINES - 2, 0, "&lt;ENTER&gt; to see presently selected items(F1 to Exit)");
+        post_menu(my_menu);
+        refresh();
+
+        while((c = getch()) != KEY_F(1))
+        {       switch(c)
+                {       case KEY_DOWN:
+                                menu_driver(my_menu, REQ_DOWN_ITEM);
+                                break;
+                        case KEY_UP:
+                                menu_driver(my_menu, REQ_UP_ITEM);
+                                break;
+                        case ' ':
+                                menu_driver(my_menu, REQ_TOGGLE_ITEM);
+                                break;
+                        case 10:        /* Enter */
+                        {       char temp[200];
+                                ITEM **items;
+
+                                items = menu_items(my_menu);
+                                temp[0] = '\0';
+                                for(i = 0; i &lt; item_count(my_menu); ++i)
+                                        if(item_value(items[i]) == TRUE)
+                                        {       strcat(temp, item_name(items[i]));
+                                                strcat(temp, " ");
+                                        }
+                                move(20, 0);
+                                clrtoeol();
+                                mvprintw(20, 0, temp);
+                                refresh();
+                        }
+                        break;
+                }
+        }       
+
+        free_item(my_items[0]);
+        free_item(my_items[1]);
+        free_menu(my_menu);
+        endwin();
+}
+        </span></pre>
+        </div>
+
+        <p>Whew, A lot of new functions. Let's take them one after
+        another. Firstly, the REQ_TOGGLE_ITEM. In a multi-valued
+        menu, the user should be allowed to select or un select
+        more than one item. The request REQ_TOGGLE_ITEM toggles the
+        present selection. In this case when space is pressed
+        REQ_TOGGLE_ITEM request is sent to menu_driver to achieve
+        the result.</p>
+
+        <p>Now when the user presses &lt;ENTER&gt; we show the
+        items he presently selected. First we find out the items
+        associated with the menu using the function menu_items().
+        Then we loop through the items to find out if the item is
+        selected or not. The function item_value() returns TRUE if
+        an item is selected. The function item_count() returns the
+        number of items in the menu. The item name can be found
+        with item_name(). You can also find the description
+        associated with an item using item_description().</p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="MENUOPT" id="MENUOPT">17.8. Menu
+        Options</a></h3>
+
+        <p>Well, by this time you must be itching for some
+        difference in your menu, with lots of functionality. I
+        know. You want Colors !!!. You want to create nice menus
+        similar to those text mode <a href=
+        "http://www.jersey.net/~debinjoe/games/" target="_top">dos
+        games</a>. The functions set_menu_fore() and
+        set_menu_back() can be used to change the attribute of the
+        selected item and unselected item. The names are
+        misleading. They don't change menu's foreground or
+        background which would have been useless.</p>
+
+        <p>The function set_menu_grey() can be used to set the
+        display attribute for the non-selectable items in the menu.
+        This brings us to the interesting option for an item the
+        one and only O_SELECTABLE. We can turn it off by the
+        function item_opts_off() and after that that item is not
+        selectable. It is like a grayed item in those fancy windows
+        menus. Let's put these concepts in practice with this
+        example</p>
+
+        <div class="EXAMPLE">
+          <a name="MMEAT" id="MMEAT"></a>
+          <p><b>Example 23. Menu Options example</b>
+          </p>
+
+          <pre class="PROGRAMLISTING"><span class=
+          "INLINEMEDIAOBJECT">#include &lt;stdlib.h&gt;
+#include &lt;menu.h&gt;
+
+#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
+#define CTRLD   4
+
+char *choices[] = {
+                        "Choice 1",
+                        "Choice 2",
+                        "Choice 3",
+                        "Choice 4",
+                        "Choice 5",
+                        "Choice 6",
+                        "Choice 7",
+                        "Exit",
+                  };
+
+int main()
+{       ITEM **my_items;
+        int c;                          
+        MENU *my_menu;
+        int n_choices, i;
+        ITEM *cur_item;
+        
+        /* Initialize curses */ 
+        initscr();
+        start_color();
+        cbreak();
+        noecho();
+        keypad(stdscr, TRUE);
+        init_pair(1, COLOR_RED, COLOR_BLACK);
+        init_pair(2, COLOR_GREEN, COLOR_BLACK);
+        init_pair(3, COLOR_MAGENTA, COLOR_BLACK);
+
+        /* Initialize items */
+        n_choices = ARRAY_SIZE(choices);
+        my_items = (ITEM **)calloc(n_choices + 1, sizeof(ITEM *));
+        for(i = 0; i &lt; n_choices; ++i)
+                my_items[i] = new_item(choices[i], choices[i]);
+        my_items[n_choices] = (ITEM *)NULL;
+        item_opts_off(my_items[3], O_SELECTABLE);
+        item_opts_off(my_items[6], O_SELECTABLE);
+
+        /* Create menu */
+        my_menu = new_menu((ITEM **)my_items);
+
+        /* Set fore ground and back ground of the menu */
+        set_menu_fore(my_menu, COLOR_PAIR(1) | A_REVERSE);
+        set_menu_back(my_menu, COLOR_PAIR(2));
+        set_menu_grey(my_menu, COLOR_PAIR(3));
+
+        /* Post the menu */
+        mvprintw(LINES - 3, 0, "Press &lt;ENTER&gt; to see the option selected");
+        mvprintw(LINES - 2, 0, "Up and Down arrow keys to naviage (F1 to Exit)");
+        post_menu(my_menu);
+        refresh();
+
+        while((c = getch()) != KEY_F(1))
+        {       switch(c)
+                {       case KEY_DOWN:
+                                menu_driver(my_menu, REQ_DOWN_ITEM);
+                                break;
+                        case KEY_UP:
+                                menu_driver(my_menu, REQ_UP_ITEM);
+                                break;
+                        case 10: /* Enter */
+                                move(20, 0);
+                                clrtoeol();
+                                mvprintw(20, 0, "Item selected is : %s", 
+                                                item_name(current_item(my_menu)));
+                                pos_menu_cursor(my_menu);
+                                break;
+                }
+        }       
+        unpost_menu(my_menu);
+        for(i = 0; i &lt; n_choices; ++i)
+                free_item(my_items[i]);
+        free_menu(my_menu);
+        endwin();
+}
+        </span></pre>
+        </div>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="MENUUSERPTR" id=
+        "MENUUSERPTR">17.9. The useful User Pointer</a></h3>
+
+        <p>We can associate a user pointer with each item in the
+        menu. It works the same way as user pointer in panels. It
+        is not touched by menu system. You can store any thing you
+        like in that. I usually use it to store the function to be
+        executed when the menu option is chosen (It is selected and
+        may be the user pressed &lt;ENTER&gt;);</p>
+
+        <div class="EXAMPLE">
+          <a name="MMEUS" id="MMEUS"></a>
+          <p><b>Example 24. Menu User Pointer Usage</b>
+          </p>
+
+          <pre class="PROGRAMLISTING"><span class=
+          "INLINEMEDIAOBJECT">#include &lt;stdlib.h&gt;
+#include &lt;curses.h&gt;
+#include &lt;menu.h&gt;
+
+#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
+#define CTRLD   4
+
+char *choices[] = {
+                        "Choice 1",
+                        "Choice 2",
+                        "Choice 3",
+                        "Choice 4",
+                        "Choice 5",
+                        "Choice 6",
+                        "Choice 7",
+                        "Exit",
+                  };
+void func(char *name);
+
+int main()
+{       ITEM **my_items;
+        int c;                          
+        MENU *my_menu;
+        int n_choices, i;
+        ITEM *cur_item;
+        
+        /* Initialize curses */ 
+        initscr();
+        start_color();
+        cbreak();
+        noecho();
+        keypad(stdscr, TRUE);
+        init_pair(1, COLOR_RED, COLOR_BLACK);
+        init_pair(2, COLOR_GREEN, COLOR_BLACK);
+        init_pair(3, COLOR_MAGENTA, COLOR_BLACK);
+
+        /* Initialize items */
+        n_choices = ARRAY_SIZE(choices);
+        my_items = (ITEM **)calloc(n_choices + 1, sizeof(ITEM *));
+        for(i = 0; i &lt; n_choices; ++i)
+        {       my_items[i] = new_item(choices[i], choices[i]);
+                /* Set the user pointer */
+                set_item_userptr(my_items[i], func);
+        }
+        my_items[n_choices] = (ITEM *)NULL;
+
+        /* Create menu */
+        my_menu = new_menu((ITEM **)my_items);
+
+        /* Post the menu */
+        mvprintw(LINES - 3, 0, "Press &lt;ENTER&gt; to see the option selected");
+        mvprintw(LINES - 2, 0, "Up and Down arrow keys to naviage (F1 to Exit)");
+        post_menu(my_menu);
+        refresh();
+
+        while((c = getch()) != KEY_F(1))
+        {       switch(c)
+                {       case KEY_DOWN:
+                                menu_driver(my_menu, REQ_DOWN_ITEM);
+                                break;
+                        case KEY_UP:
+                                menu_driver(my_menu, REQ_UP_ITEM);
+                                break;
+                        case 10: /* Enter */
+                        {       ITEM *cur;
+                                void (*p)(char *);
+
+                                cur = current_item(my_menu);
+                                p = item_userptr(cur);
+                                p((char *)item_name(cur));
+                                pos_menu_cursor(my_menu);
+                                break;
+                        }
+                        break;
+                }
+        }       
+        unpost_menu(my_menu);
+        for(i = 0; i &lt; n_choices; ++i)
+                free_item(my_items[i]);
+        free_menu(my_menu);
+        endwin();
+}
+
+void func(char *name)
+{       move(20, 0);
+        clrtoeol();
+        mvprintw(20, 0, "Item selected is : %s", name);
+}       </span></pre>
+        </div>
+      </div>
+    </div>
+
+    <div class="SECT1">
+      <hr>
+
+      <h2 class="SECT1"><a name="FORMS" id="FORMS">18. Forms
+      Library</a></h2>
+
+      <p>Well. If you have seen those forms on web pages which take
+      input from users and do various kinds of things, you might be
+      wondering how would any one create such forms in text mode
+      display. It is quite difficult to write those nifty forms in
+      plain ncurses. Forms library tries to provide a basic frame
+      work to build and maintain forms with ease. It has lot of
+      features(functions) which manage validation, dynamic
+      expansion of fields, etc. Let's see it in full flow.</p>
+
+      <p>A form is a collection of fields; each field can be either
+      a label(static text) or a data-entry location. The forms also
+      library provides functions to divide forms into multiple
+      pages.</p>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="FORMBASICS" id=
+        "FORMBASICS">18.1. The Basics</a></h3>
+
+        <p>Forms are created in much the same way as menus. First
+        the fields related to the form are created with
+        new_field(). You can set options for the fields, so that
+        they can be displayed with some fancy attributes, validated
+        before the field looses focus, etc. Then the fields are
+        attached to form. After this, the form can be posted to
+        display and is ready to receive inputs. On the similar
+        lines to menu_driver(), the form is manipulated with
+        form_driver(). We can send requests to form_driver to move
+        focus to a certain field, move cursor to end of the field
+        etc. After the user enters values in the fields and
+        validation done, form can be unposted and memory allocated
+        can be freed.</p>
+
+        <p>The general flow of control of a forms program looks
+        like this.</p>
+
+        <ol type="1">
+          <li>
+            <p>Initialize curses</p>
+          </li>
+
+          <li>
+            <p>Create fields using new_field(). You can specify the
+            height and width of the field, and its position on the
+            form.</p>
+          </li>
+
+          <li>
+            <p>Create the forms with new_form() by specifying the
+            fields to be attached with.</p>
+          </li>
+
+          <li>
+            <p>Post the form with form_post() and refresh the
+            screen.</p>
+          </li>
+
+          <li>
+            <p>Process the user requests with a loop and do
+            necessary updates to form with form_driver.</p>
+          </li>
+
+          <li>
+            <p>Unpost the menu with form_unpost()</p>
+          </li>
+
+          <li>
+            <p>Free the memory allocated to menu by free_form()</p>
+          </li>
+
+          <li>
+            <p>Free the memory allocated to the items with
+            free_field()</p>
+          </li>
+
+          <li>
+            <p>End curses</p>
+          </li>
+        </ol>
+
+        <p>As you can see, working with forms library is much
+        similar to handling menu library. The following examples
+        will explore various aspects of form processing. Let's
+        start the journey with a simple example. first.</p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="COMPILEFORMS" id=
+        "COMPILEFORMS">18.2. Compiling With the Forms Library</a></h3>
+
+        <p>To use forms library functions, you have to include
+        form.h and to link the program with forms library the flag
+        -lform should be added along with -lncurses in that
+        order.</p>
+
+        <pre class="PROGRAMLISTING">    #include &lt;form.h&gt;
+    .
+    .
+    .
+
+    compile and link: gcc &lt;program file&gt; -lform -lncurses</pre>
+        <div class="EXAMPLE">
+          <a name="FFOSI" id="FFOSI"></a>
+          <p><b>Example 25. Forms Basics</b>
+          </p>
+
+          <pre class="PROGRAMLISTING"><span class=
+          "INLINEMEDIAOBJECT">#include &lt;form.h&gt;
+
+int main()
+{       FIELD *field[3];
+        FORM  *my_form;
+        int ch;
+        
+        /* Initialize curses */
+        initscr();
+        cbreak();
+        noecho();
+        keypad(stdscr, TRUE);
+
+        /* Initialize the fields */
+        field[0] = new_field(1, 10, 4, 18, 0, 0);
+        field[1] = new_field(1, 10, 6, 18, 0, 0);
+        field[2] = NULL;
+
+        /* Set field options */
+        set_field_back(field[0], A_UNDERLINE);  /* Print a line for the option  */
+        field_opts_off(field[0], O_AUTOSKIP);   /* Don't go to next field when this */
+                                                /* Field is filled up           */
+        set_field_back(field[1], A_UNDERLINE); 
+        field_opts_off(field[1], O_AUTOSKIP);
+
+        /* Create the form and post it */
+        my_form = new_form(field);
+        post_form(my_form);
+        refresh();
+        
+        mvprintw(4, 10, "Value 1:");
+        mvprintw(6, 10, "Value 2:");
+        refresh();
+
+        /* Loop through to get user requests */
+        while((ch = getch()) != KEY_F(1))
+        {       switch(ch)
+                {       case KEY_DOWN:
+                                /* Go to next field */
+                                form_driver(my_form, REQ_NEXT_FIELD);
+                                /* Go to the end of the present buffer */
+                                /* Leaves nicely at the last character */
+                                form_driver(my_form, REQ_END_LINE);
+                                break;
+                        case KEY_UP:
+                                /* Go to previous field */
+                                form_driver(my_form, REQ_PREV_FIELD);
+                                form_driver(my_form, REQ_END_LINE);
+                                break;
+                        default:
+                                /* If this is a normal character, it gets */
+                                /* Printed                                */    
+                                form_driver(my_form, ch);
+                                break;
+                }
+        }
+
+        /* Un post form and free the memory */
+        unpost_form(my_form);
+        free_form(my_form);
+        free_field(field[0]);
+        free_field(field[1]); 
+
+        endwin();
+        return 0;
+}</span></pre>
+        </div>
+
+        <p>Above example is pretty straight forward. It creates two
+        fields with <tt class="LITERAL">new_field()</tt>.
+        new_field() takes height, width, starty, startx, number of
+        offscreen rows and number of additional working buffers.
+        The fifth argument number of offscreen rows specifies how
+        much of the field to be shown. If it is zero, the entire
+        field is always displayed otherwise the form will be
+        scrollable when the user accesses not displayed parts of
+        the field. The forms library allocates one buffer per field
+        to store the data user enters. Using the last parameter to
+        new_field() we can specify it to allocate some additional
+        buffers. These can be used for any purpose you like.</p>
+
+        <p>After creating the fields, back ground attribute of both
+        of them is set to an underscore with set_field_back(). The
+        AUTOSKIP option is turned off using field_opts_off(). If
+        this option is turned on, focus will move to the next field
+        in the form once the active field is filled up
+        completely.</p>
+
+        <p>After attaching the fields to the form, it is posted.
+        Here on, user inputs are processed in the while loop, by
+        making corresponding requests to form_driver. The details
+        of all the requests to the form_driver() are explained
+        later.</p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="PLAYFIELDS" id=
+        "PLAYFIELDS">18.3. Playing with Fields</a></h3>
+
+        <p>Each form field is associated with a lot of attributes.
+        They can be manipulated to get the required effect and to
+        have fun !!!. So why wait?</p>
+
+        <div class="SECT3">
+          <hr>
+
+          <h4 class="SECT3"><a name="FETCHINFO" id=
+          "FETCHINFO">18.3.1. Fetching Size and Location of
+          Field</a></h4>
+
+          <p>The parameters we have given at the time of creation
+          of a field can be retrieved with field_info(). It returns
+          height, width, starty, startx, number of offscreen rows,
+          and number of additional buffers into the parameters
+          given to it. It is a sort of inverse of new_field().</p>
+
+          <pre class=
+          "PROGRAMLISTING">int field_info(     FIELD *field,              /* field from which to fetch */
+                    int *height, *int width,   /* field size */ 
+                    int *top, int *left,       /* upper left corner */
+                    int *offscreen,            /* number of offscreen rows */
+                    int *nbuf);                /* number of working buffers */</pre>
+        </div>
+
+        <div class="SECT3">
+          <hr>
+
+          <h4 class="SECT3"><a name="MOVEFIELD" id=
+          "MOVEFIELD">18.3.2. Moving the field</a></h4>
+
+          <p>The location of the field can be moved to a different
+          position with move_field().</p>
+
+          <pre class=
+          "PROGRAMLISTING">int move_field(    FIELD *field,              /* field to alter */
+                   int top, int left);        /* new upper-left corner */</pre>
+          <p>As usual, the changed position can be queried with
+          field_infor().</p>
+        </div>
+
+        <div class="SECT3">
+          <hr>
+
+          <h4 class="SECT3"><a name="JUSTIFYFIELD" id=
+          "JUSTIFYFIELD">18.3.3. Field Justification</a></h4>
+
+          <p>The justification to be done for the field can be
+          fixed using the function set_field_just().</p>
+
+          <pre class=
+          "PROGRAMLISTING">    int set_field_just(FIELD *field,          /* field to alter */
+               int justmode);         /* mode to set */
+    int field_just(FIELD *field);          /* fetch justify mode of field */</pre>
+          <p>The justification mode valued accepted and returned by
+          these functions are NO_JUSTIFICATION, JUSTIFY_RIGHT,
+          JUSTIFY_LEFT, or JUSTIFY_CENTER.</p>
+        </div>
+
+        <div class="SECT3">
+          <hr>
+
+          <h4 class="SECT3"><a name="FIELDDISPATTRIB" id=
+          "FIELDDISPATTRIB">18.3.4. Field Display Attributes</a></h4>
+
+          <p>As you have seen, in the above example, display
+          attribute for the fields can be set with set_field_fore()
+          and setfield_back(). These functions set foreground and
+          background attribute of the fields. You can also specify
+          a pad character which will be filled in the unfilled
+          portion of the field. The pad character is set with a
+          call to set_field_pad(). Default pad value is a space.
+          The functions field_fore(), field_back, field_pad() can
+          be used to query the present foreground, background
+          attributes and pad character for the field. The following
+          list gives the usage of functions.</p>
+
+          <pre class=
+          "PROGRAMLISTING">&#13;int set_field_fore(FIELD *field,        /* field to alter */
+                   chtype attr);        /* attribute to set */ 
+
+chtype field_fore(FIELD *field);        /* field to query */
+                                        /* returns foreground attribute */
+
+int set_field_back(FIELD *field,        /* field to alter */
+                   chtype attr);        /* attribute to set */ 
+
+chtype field_back(FIELD *field);        /* field to query */
+                                        /* returns background attribute */
+
+int set_field_pad(FIELD *field,         /* field to alter */
+                  int pad);             /* pad character to set */ 
+
+chtype field_pad(FIELD *field);         /* field to query */  
+                                        /* returns present pad character */&#13;</pre>
+          <p>Though above functions seem quite simple, using colors
+          with set_field_fore() may be frustrating in the
+          beginning. Let me first explain about foreground and
+          background attributes of a field. The foreground
+          attribute is associated with the character. That means a
+          character in the field is printed with the attribute you
+          have set with set_field_fore(). Background attribute is
+          the attribute used to fill background of field, whether
+          any character is there or not. So what about colors?
+          Since colors are always defined in pairs, what is the
+          right way to display colored fields? Here's an example
+          clarifying color attributes.</p>
+
+          <div class="EXAMPLE">
+            <a name="FFOAT" id="FFOAT"></a>
+            <p><b>Example 26. Form Attributes example</b>
+            </p>
+
+            <pre class="PROGRAMLISTING"><span class=
+            "INLINEMEDIAOBJECT">#include &lt;form.h&gt;
+
+int main()
+{       FIELD *field[3];
+        FORM  *my_form;
+        int ch;
+        
+        /* Initialize curses */
+        initscr();
+        start_color();
+        cbreak();
+        noecho();
+        keypad(stdscr, TRUE);
+
+        /* Initialize few color pairs */
+        init_pair(1, COLOR_WHITE, COLOR_BLUE);
+        init_pair(2, COLOR_WHITE, COLOR_BLUE);
+
+        /* Initialize the fields */
+        field[0] = new_field(1, 10, 4, 18, 0, 0);
+        field[1] = new_field(1, 10, 6, 18, 0, 0);
+        field[2] = NULL;
+
+        /* Set field options */
+        set_field_fore(field[0], COLOR_PAIR(1));/* Put the field with blue background */
+        set_field_back(field[0], COLOR_PAIR(2));/* and white foreground (characters */
+                                                /* are printed in white         */
+        field_opts_off(field[0], O_AUTOSKIP);   /* Don't go to next field when this */
+                                                /* Field is filled up           */
+        set_field_back(field[1], A_UNDERLINE); 
+        field_opts_off(field[1], O_AUTOSKIP);
+
+        /* Create the form and post it */
+        my_form = new_form(field);
+        post_form(my_form);
+        refresh();
+        
+        set_current_field(my_form, field[0]); /* Set focus to the colored field */
+        mvprintw(4, 10, "Value 1:");
+        mvprintw(6, 10, "Value 2:");
+        mvprintw(LINES - 2, 0, "Use UP, DOWN arrow keys to switch between fields");
+        refresh();
+
+        /* Loop through to get user requests */
+        while((ch = getch()) != KEY_F(1))
+        {       switch(ch)
+                {       case KEY_DOWN:
+                                /* Go to next field */
+                                form_driver(my_form, REQ_NEXT_FIELD);
+                                /* Go to the end of the present buffer */
+                                /* Leaves nicely at the last character */
+                                form_driver(my_form, REQ_END_LINE);
+                                break;
+                        case KEY_UP:
+                                /* Go to previous field */
+                                form_driver(my_form, REQ_PREV_FIELD);
+                                form_driver(my_form, REQ_END_LINE);
+                                break;
+                        default:
+                                /* If this is a normal character, it gets */
+                                /* Printed                                */    
+                                form_driver(my_form, ch);
+                                break;
+                }
+        }
+
+        /* Un post form and free the memory */
+        unpost_form(my_form);
+        free_form(my_form);
+        free_field(field[0]);
+        free_field(field[1]); 
+
+        endwin();
+        return 0;
+}</span></pre>
+          </div>
+
+          <p>Play with the color pairs and try to understand the
+          foreground and background attributes. In my programs
+          using color attributes, I usually set only the background
+          with set_field_back(). Curses simply doesn't allow
+          defining individual color attributes.</p>
+        </div>
+
+        <div class="SECT3">
+          <hr>
+
+          <h4 class="SECT3"><a name="FIELDOPTIONBITS" id=
+          "FIELDOPTIONBITS">18.3.5. Field Option Bits</a></h4>
+
+          <p>There is also a large collection of field option bits
+          you can set to control various aspects of forms
+          processing. You can manipulate them with these
+          functions:</p>
+
+          <pre class=
+          "PROGRAMLISTING">int set_field_opts(FIELD *field,          /* field to alter */
+                   int attr);             /* attribute to set */ 
+
+int field_opts_on(FIELD *field,           /* field to alter */
+                  int attr);              /* attributes to turn on */ 
+
+int field_opts_off(FIELD *field,          /* field to alter */
+                  int attr);              /* attributes to turn off */ 
+
+int field_opts(FIELD *field);             /* field to query */ </pre>
+          <p>The function set_field_opts() can be used to directly
+          set attributes of a field or you can choose to switch a
+          few attributes on and off with field_opts_on() and
+          field_opts_off() selectively. Anytime you can query the
+          attributes of a field with field_opts(). The following is
+          the list of available options. By default, all options
+          are on.</p>
+
+          <div class="VARIABLELIST">
+            <dl>
+              <dt>O_VISIBLE</dt>
+
+              <dd>
+                <p>Controls whether the field is visible on the
+                screen. Can be used during form processing to hide
+                or pop up fields depending on the value of parent
+                fields.</p>
+              </dd>
+
+              <dt>O_ACTIVE</dt>
+
+              <dd>
+                <p>Controls whether the field is active during
+                forms processing (i.e. visited by form navigation
+                keys). Can be used to make labels or derived fields
+                with buffer values alterable by the forms
+                application, not the user.</p>
+              </dd>
+
+              <dt>O_PUBLIC</dt>
+
+              <dd>
+                <p>Controls whether data is displayed during field
+                entry. If this option is turned off on a field, the
+                library will accept and edit data in that field,
+                but it will not be displayed and the visible field
+                cursor will not move. You can turn off the O_PUBLIC
+                bit to define password fields.</p>
+              </dd>
+
+              <dt>O_EDIT</dt>
+
+              <dd>
+                <p>Controls whether the field's data can be
+                modified. When this option is off, all editing
+                requests except <tt class=
+                "LITERAL">REQ_PREV_CHOICE</tt> and <tt class=
+                "LITERAL">REQ_NEXT_CHOICE</tt>will fail. Such
+                read-only fields may be useful for help
+                messages.</p>
+              </dd>
+
+              <dt>O_WRAP</dt>
+
+              <dd>
+                <p>Controls word-wrapping in multi-line fields.
+                Normally, when any character of a (blank-separated)
+                word reaches the end of the current line, the
+                entire word is wrapped to the next line (assuming
+                there is one). When this option is off, the word
+                will be split across the line break.</p>
+              </dd>
+
+              <dt>O_BLANK</dt>
+
+              <dd>
+                <p>Controls field blanking. When this option is on,
+                entering a character at the first field position
+                erases the entire field (except for the
+                just-entered character).</p>
+              </dd>
+
+              <dt>O_AUTOSKIP</dt>
+
+              <dd>
+                <p>Controls automatic skip to next field when this
+                one fills. Normally, when the forms user tries to
+                type more data into a field than will fit, the
+                editing location jumps to next field. When this
+                option is off, the user's cursor will hang at the
+                end of the field. This option is ignored in dynamic
+                fields that have not reached their size limit.</p>
+              </dd>
+
+              <dt>O_NULLOK</dt>
+
+              <dd>
+                <p>Controls whether validation is applied to blank
+                fields. Normally, it is not; the user can leave a
+                field blank without invoking the usual validation
+                check on exit. If this option is off on a field,
+                exit from it will invoke a validation check.</p>
+              </dd>
+
+              <dt>O_PASSOK</dt>
+
+              <dd>
+                <p>Controls whether validation occurs on every
+                exit, or only after the field is modified. Normally
+                the latter is true. Setting O_PASSOK may be useful
+                if your field's validation function may change
+                during forms processing.</p>
+              </dd>
+
+              <dt>O_STATIC</dt>
+
+              <dd>
+                <p>Controls whether the field is fixed to its
+                initial dimensions. If you turn this off, the field
+                becomes dynamic and will stretch to fit entered
+                data.</p>
+              </dd>
+            </dl>
+          </div>
+
+          <p>A field's options cannot be changed while the field is
+          currently selected. However, options may be changed on
+          posted fields that are not current.</p>
+
+          <p>The option values are bit-masks and can be composed
+          with logical-or in the obvious way. You have seen the
+          usage of switching off O_AUTOSKIP option. The following
+          example clarifies usage of some more options. Other
+          options are explained where appropriate.</p>
+
+          <div class="EXAMPLE">
+            <a name="FFOOP" id="FFOOP"></a>
+            <p><b>Example 27. Field Options Usage example</b>
+            </p>
+
+            <pre class="PROGRAMLISTING"><span class=
+            "INLINEMEDIAOBJECT">#include &lt;form.h&gt;
+
+#define STARTX 15
+#define STARTY 4
+#define WIDTH 25
+
+#define N_FIELDS 3
+
+int main()
+{       FIELD *field[N_FIELDS];
+        FORM  *my_form;
+        int ch, i;
+        
+        /* Initialize curses */
+        initscr();
+        cbreak();
+        noecho();
+        keypad(stdscr, TRUE);
+
+        /* Initialize the fields */
+        for(i = 0; i &lt; N_FIELDS - 1; ++i)
+                field[i] = new_field(1, WIDTH, STARTY + i * 2, STARTX, 0, 0);
+        field[N_FIELDS - 1] = NULL;
+
+        /* Set field options */
+        set_field_back(field[1], A_UNDERLINE);  /* Print a line for the option  */
+        
+        field_opts_off(field[0], O_ACTIVE); /* This field is a static label */
+        field_opts_off(field[1], O_PUBLIC); /* This filed is like a password field*/
+        field_opts_off(field[1], O_AUTOSKIP); /* To avoid entering the same field */
+                                              /* after last character is entered */
+        
+        /* Create the form and post it */
+        my_form = new_form(field);
+        post_form(my_form);
+        refresh();
+        
+        set_field_just(field[0], JUSTIFY_CENTER); /* Center Justification */
+        set_field_buffer(field[0], 0, "This is a static Field"); 
+                                                  /* Initialize the field  */
+        mvprintw(STARTY, STARTX - 10, "Field 1:");
+        mvprintw(STARTY + 2, STARTX - 10, "Field 2:");
+        refresh();
+
+        /* Loop through to get user requests */
+        while((ch = getch()) != KEY_F(1))
+        {       switch(ch)
+                {       case KEY_DOWN:
+                                /* Go to next field */
+                                form_driver(my_form, REQ_NEXT_FIELD);
+                                /* Go to the end of the present buffer */
+                                /* Leaves nicely at the last character */
+                                form_driver(my_form, REQ_END_LINE);
+                                break;
+                        case KEY_UP:
+                                /* Go to previous field */
+                                form_driver(my_form, REQ_PREV_FIELD);
+                                form_driver(my_form, REQ_END_LINE);
+                                break;
+                        default:
+                                /* If this is a normal character, it gets */
+                                /* Printed                                */    
+                                form_driver(my_form, ch);
+                                break;
+                }
+        }
+
+        /* Un post form and free the memory */
+        unpost_form(my_form);
+        free_form(my_form);
+        free_field(field[0]);
+        free_field(field[1]); 
+
+        endwin();
+        return 0;
+}</span></pre>
+          </div>
+
+          <p>This example, though useless, shows the usage of
+          options. If used properly, they can present information
+          very effectively in a form. The second field being not
+          O_PUBLIC, does not show the characters you are
+          typing.</p>
+        </div>
+
+        <div class="SECT3">
+          <hr>
+
+          <h4 class="SECT3"><a name="FIELDSTATUS" id=
+          "FIELDSTATUS">18.3.6. Field Status</a></h4>
+
+          <p>The field status specifies whether the field has got
+          edited or not. It is initially set to FALSE and when user
+          enters something and the data buffer gets modified it
+          becomes TRUE. So a field's status can be queried to find
+          out whether it has been modified or not. The following
+          functions can assist in those operations.</p>
+
+          <pre class=
+          "PROGRAMLISTING">int set_field_status(FIELD *field,      /* field to alter */
+                   int status);         /* status to set */
+
+int field_status(FIELD *field);         /* fetch status of field */</pre>
+          <p>It is better to check the field's status only after
+          after leaving the field, as data buffer might not have
+          been updated yet as the validation is still due. To
+          guarantee that right status is returned, call
+          field_status() either (1) in the field's exit validation
+          check routine, (2) from the field's or form's
+          initialization or termination hooks, or (3) just after a
+          REQ_VALIDATION request has been processed by the forms
+          driver</p>
+        </div>
+
+        <div class="SECT3">
+          <hr>
+
+          <h4 class="SECT3"><a name="FIELDUSERPTR" id=
+          "FIELDUSERPTR">18.3.7. Field User Pointer</a></h4>
+
+          <p>Every field structure contains one pointer that can be
+          used by the user for various purposes. It is not touched
+          by forms library and can be used for any purpose by the
+          user. The following functions set and fetch user
+          pointer.</p>
+
+          <pre class=
+          "PROGRAMLISTING">int set_field_userptr(FIELD *field,   
+           char *userptr);      /* the user pointer you wish to associate */
+                                /* with the field    */
+
+char *field_userptr(FIELD *field);      /* fetch user pointer of the field */</pre>
+        </div>
+
+        <div class="SECT3">
+          <hr>
+
+          <h4 class="SECT3"><a name="VARIABLESIZEFIELDS" id=
+          "VARIABLESIZEFIELDS">18.3.8. Variable-Sized Fields</a></h4>
+
+          <p>If you want a dynamically changing field with variable
+          width, this is the feature you want to put to full use.
+          This will allow the user to enter more data than the
+          original size of the field and let the field grow.
+          According to the field orientation it will scroll
+          horizontally or vertically to incorporate the new
+          data.</p>
+
+          <p>To make a field dynamically growable, the option
+          O_STATIC should be turned off. This can be done with
+          a</p>
+
+          <pre class=
+          "PROGRAMLISTING">    field_opts_off(field_pointer, O_STATIC);</pre>
+          <p>But it is usually not advisable to allow a field to
+          grow infinitely. You can set a maximum limit to the
+          growth of the field with</p>
+
+          <pre class=
+          "PROGRAMLISTING">int set_max_field(FIELD *field,    /* Field on which to operate */
+                  int max_growth); /* maximum growth allowed for the field */</pre>
+          <p>The field info for a dynamically growable field can be
+          retrieved by</p>
+
+          <pre class=
+          "PROGRAMLISTING">int dynamic_field_info( FIELD *field,     /* Field on which to operate */
+            int   *prows,     /* number of rows will be filled in this */
+            int   *pcols,     /* number of columns will be filled in this*/
+            int   *pmax)      /* maximum allowable growth will be filled */
+                              /* in this */</pre>Though field_info
+work as usual, it is advisable to use this function to get the
+proper attributes of a dynamically growable field.
+          <p>Recall the library routine new_field; a new field
+          created with height set to one will be defined to be a
+          one line field. A new field created with height greater
+          than one will be defined to be a multi line field.</p>
+
+          <p>A one line field with O_STATIC turned off (dynamically
+          growable field) will contain a single fixed row, but the
+          number of columns can increase if the user enters more
+          data than the initial field will hold. The number of
+          columns displayed will remain fixed and the additional
+          data will scroll horizontally.</p>
+
+          <p>A multi line field with O_STATIC turned off
+          (dynamically growable field) will contain a fixed number
+          of columns, but the number of rows can increase if the
+          user enters more data than the initial field will hold.
+          The number of rows displayed will remain fixed and the
+          additional data will scroll vertically.</p>
+
+          <p>The above two paragraphs pretty much describe a
+          dynamically growable field's behavior. The way other
+          parts of forms library behaves is described below:</p>
+
+          <ol type="1">
+            <li>
+              <p>The field option O_AUTOSKIP will be ignored if the
+              option O_STATIC is off and there is no maximum growth
+              specified for the field. Currently, O_AUTOSKIP
+              generates an automatic REQ_NEXT_FIELD form driver
+              request when the user types in the last character
+              position of a field. On a growable field with no
+              maximum growth specified, there is no last character
+              position. If a maximum growth is specified, the
+              O_AUTOSKIP option will work as normal if the field
+              has grown to its maximum size.</p>
+            </li>
+
+            <li>
+              <p>The field justification will be ignored if the
+              option O_STATIC is off. Currently, set_field_just can
+              be used to JUSTIFY_LEFT, JUSTIFY_RIGHT,
+              JUSTIFY_CENTER the contents of a one line field. A
+              growable one line field will, by definition, grow and
+              scroll horizontally and may contain more data than
+              can be justified. The return from field_just will be
+              unchanged.</p>
+            </li>
+
+            <li>
+              <p>The overloaded form driver request REQ_NEW_LINE
+              will operate the same way regardless of the
+              O_NL_OVERLOAD form option if the field option
+              O_STATIC is off and there is no maximum growth
+              specified for the field. Currently, if the form
+              option O_NL_OVERLOAD is on, REQ_NEW_LINE implicitly
+              generates a REQ_NEXT_FIELD if called from the last
+              line of a field. If a field can grow without bound,
+              there is no last line, so REQ_NEW_LINE will never
+              implicitly generate a REQ_NEXT_FIELD. If a maximum
+              growth limit is specified and the O_NL_OVERLOAD form
+              option is on, REQ_NEW_LINE will only implicitly
+              generate REQ_NEXT_FIELD if the field has grown to its
+              maximum size and the user is on the last line.</p>
+            </li>
+
+            <li>
+              <p>The library call dup_field will work as usual; it
+              will duplicate the field, including the current
+              buffer size and contents of the field being
+              duplicated. Any specified maximum growth will also be
+              duplicated.</p>
+            </li>
+
+            <li>
+              <p>The library call link_field will work as usual; it
+              will duplicate all field attributes and share buffers
+              with the field being linked. If the O_STATIC field
+              option is subsequently changed by a field sharing
+              buffers, how the system reacts to an attempt to enter
+              more data into the field than the buffer will
+              currently hold will depend on the setting of the
+              option in the current field.</p>
+            </li>
+
+            <li>
+              <p>The library call field_info will work as usual;
+              the variable nrow will contain the value of the
+              original call to new_field. The user should use
+              dynamic_field_info, described above, to query the
+              current size of the buffer.</p>
+            </li>
+          </ol>
+
+          <p>Some of the above points make sense only after
+          explaining form driver. We will be looking into that in
+          next few sections.</p>
+        </div>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="FORMWINDOWS" id=
+        "FORMWINDOWS">18.4. Form Windows</a></h3>
+
+        <p>The form windows concept is pretty much similar to menu
+        windows. Every form is associated with a main window and a
+        sub window. The form main window displays any title or
+        border associated or whatever the user wishes. Then the sub
+        window contains all the fields and displays them according
+        to their position. This gives the flexibility of
+        manipulating fancy form displaying very easily.</p>
+
+        <p>Since this is pretty much similar to menu windows, I am
+        providing an example with out much explanation. The
+        functions are similar and they work the same way.</p>
+
+        <div class="EXAMPLE">
+          <a name="FFOWI" id="FFOWI"></a>
+          <p><b>Example 28. Form Windows Example</b>
+          </p>
+
+          <pre class="PROGRAMLISTING"><span class=
+          "INLINEMEDIAOBJECT">#include &lt;string.h&gt;
+#include &lt;form.h&gt;
+
+void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string, chtype color);
+
+int main()
+{
+        FIELD *field[3];
+        FORM  *my_form;
+        WINDOW *my_form_win;
+        int ch, rows, cols;
+        
+        /* Initialize curses */
+        initscr();
+        start_color();
+        cbreak();
+        noecho();
+        keypad(stdscr, TRUE);
+
+        /* Initialize few color pairs */
+        init_pair(1, COLOR_RED, COLOR_BLACK);
+
+        /* Initialize the fields */
+        field[0] = new_field(1, 10, 6, 1, 0, 0);
+        field[1] = new_field(1, 10, 8, 1, 0, 0);
+        field[2] = NULL;
+
+        /* Set field options */
+        set_field_back(field[0], A_UNDERLINE);
+        field_opts_off(field[0], O_AUTOSKIP); /* Don't go to next field when this */
+                                              /* Field is filled up             */
+        set_field_back(field[1], A_UNDERLINE); 
+        field_opts_off(field[1], O_AUTOSKIP);
+        
+        /* Create the form and post it */
+        my_form = new_form(field);
+        
+        /* Calculate the area required for the form */
+        scale_form(my_form, &amp;rows, &amp;cols);
+
+        /* Create the window to be associated with the form */
+        my_form_win = newwin(rows + 4, cols + 4, 4, 4);
+        keypad(my_form_win, TRUE);
+
+        /* Set main window and sub window */
+        set_form_win(my_form, my_form_win);
+        set_form_sub(my_form, derwin(my_form_win, rows, cols, 2, 2));
+
+        /* Print a border around the main window and print a title */
+        box(my_form_win, 0, 0);
+        print_in_middle(my_form_win, 1, 0, cols + 4, "My Form", COLOR_PAIR(1));
+        
+        post_form(my_form);
+        wrefresh(my_form_win);
+
+        mvprintw(LINES - 2, 0, "Use UP, DOWN arrow keys to switch between fields");
+        refresh();
+
+        /* Loop through to get user requests */
+        while((ch = wgetch(my_form_win)) != KEY_F(1))
+        {       switch(ch)
+                {       case KEY_DOWN:
+                                /* Go to next field */
+                                form_driver(my_form, REQ_NEXT_FIELD);
+                                /* Go to the end of the present buffer */
+                                /* Leaves nicely at the last character */
+                                form_driver(my_form, REQ_END_LINE);
+                                break;
+                        case KEY_UP:
+                                /* Go to previous field */
+                                form_driver(my_form, REQ_PREV_FIELD);
+                                form_driver(my_form, REQ_END_LINE);
+                                break;
+                        default:
+                                /* If this is a normal character, it gets */
+                                /* Printed                                */    
+                                form_driver(my_form, ch);
+                                break;
+                }
+        }
+
+        /* Un post form and free the memory */
+        unpost_form(my_form);
+        free_form(my_form);
+        free_field(field[0]);
+        free_field(field[1]); 
+
+        endwin();
+        return 0;
+}
+
+void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string, chtype color)
+{       int length, x, y;
+        float temp;
+
+        if(win == NULL)
+                win = stdscr;
+        getyx(win, y, x);
+        if(startx != 0)
+                x = startx;
+        if(starty != 0)
+                y = starty;
+        if(width == 0)
+                width = 80;
+
+        length = strlen(string);
+        temp = (width - length)/ 2;
+        x = startx + (int)temp;
+        wattron(win, color);
+        mvwprintw(win, y, x, "%s", string);
+        wattroff(win, color);
+        refresh();
+}</span></pre>
+        </div>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="FILEDVALIDATE" id=
+        "FILEDVALIDATE">18.5. Field Validation</a></h3>
+
+        <p>By default, a field will accept any data input by the
+        user. It is possible to attach validation to the field.
+        Then any attempt by the user to leave the field, while it
+        contains data that doesn't match the validation type will
+        fail. Some validation types also have a character-validity
+        check for each time a character is entered in the
+        field.</p>
+
+        <p>Validation can be attached to a field with the following
+        function.</p>
+
+        <pre class=
+        "PROGRAMLISTING">int set_field_type(FIELD *field,          /* field to alter */
+                   FIELDTYPE *ftype,      /* type to associate */
+                   ...);                  /* additional arguments*/</pre>Once
+set, the validation type for a field can be queried with
+
+        <pre class=
+        "PROGRAMLISTING">FIELDTYPE *field_type(FIELD *field);      /* field to query */</pre>
+        <p>The form driver validates the data in a field only when
+        data is entered by the end-user. Validation does not occur
+        when</p>
+
+        <ul>
+          <li>
+            <p>the application program changes the field value by
+            calling set_field_buffer.</p>
+          </li>
+
+          <li>
+            <p>linked field values are changed indirectly -- by
+            changing the field to which they are linked</p>
+          </li>
+        </ul>
+
+        <p>The following are the pre-defined validation types. You
+        can also specify custom validation, though it is a bit
+        tricky and cumbersome.</p>
+
+        <h1 class="BRIDGEHEAD"><a name="AEN1074" id=
+        "AEN1074"></a>TYPE_ALPHA</h1>
+
+        <p>This field type accepts alphabetic data; no blanks, no
+        digits, no special characters (this is checked at
+        character-entry time). It is set up with:</p>
+
+        <pre class=
+        "PROGRAMLISTING">int set_field_type(FIELD *field,          /* field to alter */
+                   TYPE_ALPHA,            /* type to associate */
+                   int width);            /* minimum width of field */</pre>
+        <p>The width argument sets a minimum width of data. The
+        user has to enter at-least width number of characters
+        before he can leave the field. Typically you'll want to set
+        this to the field width; if it is greater than the field
+        width, the validation check will always fail. A minimum
+        width of zero makes field completion optional.</p>
+
+        <h1 class="BRIDGEHEAD"><a name="AEN1078" id=
+        "AEN1078"></a>TYPE_ALNUM</h1>
+
+        <p>This field type accepts alphabetic data and digits; no
+        blanks, no special characters (this is checked at
+        character-entry time). It is set up with:</p>
+
+        <pre class=
+        "PROGRAMLISTING">int set_field_type(FIELD *field,          /* field to alter */
+                   TYPE_ALNUM,            /* type to associate */
+                   int width);            /* minimum width of field */</pre>
+        <p>The width argument sets a minimum width of data. As with
+        TYPE_ALPHA, typically you'll want to set this to the field
+        width; if it is greater than the field width, the
+        validation check will always fail. A minimum width of zero
+        makes field completion optional.</p>
+
+        <h1 class="BRIDGEHEAD"><a name="AEN1082" id=
+        "AEN1082"></a>TYPE_ENUM</h1>
+
+        <p>This type allows you to restrict a field's values to be
+        among a specified set of string values (for example, the
+        two-letter postal codes for U.S. states). It is set up
+        with:</p>
+
+        <pre class=
+        "PROGRAMLISTING">int set_field_type(FIELD *field,          /* field to alter */
+                   TYPE_ENUM,             /* type to associate */
+                   char **valuelist;      /* list of possible values */
+                   int checkcase;         /* case-sensitive? */
+                   int checkunique);      /* must specify uniquely? */</pre>
+        <p>The valuelist parameter must point at a NULL-terminated
+        list of valid strings. The checkcase argument, if true,
+        makes comparison with the string case-sensitive.</p>
+
+        <p>When the user exits a TYPE_ENUM field, the validation
+        procedure tries to complete the data in the buffer to a
+        valid entry. If a complete choice string has been entered,
+        it is of course valid. But it is also possible to enter a
+        prefix of a valid string and have it completed for you.</p>
+
+        <p>By default, if you enter such a prefix and it matches
+        more than one value in the string list, the prefix will be
+        completed to the first matching value. But the checkunique
+        argument, if true, requires prefix matches to be unique in
+        order to be valid.</p>
+
+        <p>The REQ_NEXT_CHOICE and REQ_PREV_CHOICE input requests
+        can be particularly useful with these fields.</p>
+
+        <h1 class="BRIDGEHEAD"><a name="AEN1089" id=
+        "AEN1089"></a>TYPE_INTEGER</h1>
+
+        <p>This field type accepts an integer. It is set up as
+        follows:</p>
+
+        <pre class=
+        "PROGRAMLISTING">int set_field_type(FIELD *field,          /* field to alter */
+                   TYPE_INTEGER,          /* type to associate */
+                   int padding,           /* # places to zero-pad to */
+                   int vmin, int vmax);   /* valid range */</pre>
+        <p>Valid characters consist of an optional leading minus
+        and digits. The range check is performed on exit. If the
+        range maximum is less than or equal to the minimum, the
+        range is ignored.</p>
+
+        <p>If the value passes its range check, it is padded with
+        as many leading zero digits as necessary to meet the
+        padding argument.</p>
+
+        <p>A TYPE_INTEGER value buffer can conveniently be
+        interpreted with the C library function atoi(3).</p>
+
+        <h1 class="BRIDGEHEAD"><a name="AEN1095" id=
+        "AEN1095"></a>TYPE_NUMERIC</h1>
+
+        <p>This field type accepts a decimal number. It is set up
+        as follows:</p>
+
+        <pre class=
+        "PROGRAMLISTING">int set_field_type(FIELD *field,          /* field to alter */
+                   TYPE_NUMERIC,          /* type to associate */
+                   int padding,           /* # places of precision */
+                   int vmin, int vmax);   /* valid range */</pre>
+        <p>Valid characters consist of an optional leading minus
+        and digits. possibly including a decimal point. The range
+        check is performed on exit. If the range maximum is less
+        than or equal to the minimum, the range is ignored.</p>
+
+        <p>If the value passes its range check, it is padded with
+        as many trailing zero digits as necessary to meet the
+        padding argument.</p>
+
+        <p>A TYPE_NUMERIC value buffer can conveniently be
+        interpreted with the C library function atof(3).</p>
+
+        <h1 class="BRIDGEHEAD"><a name="AEN1101" id=
+        "AEN1101"></a>TYPE_REGEXP</h1>
+
+        <p>This field type accepts data matching a regular
+        expression. It is set up as follows:</p>
+
+        <pre class=
+        "PROGRAMLISTING">int set_field_type(FIELD *field,          /* field to alter */
+                   TYPE_REGEXP,           /* type to associate */
+                   char *regexp);         /* expression to match */</pre>
+        <p>The syntax for regular expressions is that of
+        regcomp(3). The check for regular-expression match is
+        performed on exit.</p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="FORMDRIVER" id=
+        "FORMDRIVER">18.6. Form Driver: The work horse of the forms
+        system</a></h3>
+
+        <p>As in the menu system, form_driver() plays a very
+        important role in forms system. All types of requests to
+        forms system should be funneled through form_driver().</p>
+
+        <pre class=
+        "PROGRAMLISTING">int form_driver(FORM *form,     /* form on which to operate     */
+                int request)    /* form request code         */</pre>
+        <p>As you have seen some of the examples above, you have to
+        be in a loop looking for user input and then decide whether
+        it is a field data or a form request. The form requests are
+        then passed to form_driver() to do the work.</p>
+
+        <p>The requests roughly can be divided into following
+        categories. Different requests and their usage is explained
+        below:</p>
+
+        <div class="SECT3">
+          <hr>
+
+          <h4 class="SECT3"><a name="PAGENAVREQ" id=
+          "PAGENAVREQ">18.6.1. Page Navigation Requests</a></h4>
+
+          <p>These requests cause page-level moves through the
+          form, triggering display of a new form screen. A form can
+          be made of multiple pages. If you have a big form with
+          lot of fields and logical sections, then you can divide
+          the form into pages. The function set_new_page() to set a
+          new page at the field specified.</p>
+
+          <pre class=
+          "PROGRAMLISTING">int set_new_page(FIELD *field,/* Field at which page break to be set or unset */
+         bool new_page_flag); /* should be TRUE to put a break */</pre>
+          <p>The following requests allow you to move to different
+          pages</p>
+
+          <ul>
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_NEXT_PAGE</i></span> Move to the next
+              form page.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_PREV_PAGE</i></span> Move to the
+              previous form page.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_FIRST_PAGE</i></span> Move to the
+              first form page.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_LAST_PAGE</i></span> Move to the last
+              form page.</p>
+            </li>
+          </ul>
+
+          <p>These requests treat the list as cyclic; that is,
+          REQ_NEXT_PAGE from the last page goes to the first, and
+          REQ_PREV_PAGE from the first page goes to the last.</p>
+        </div>
+
+        <div class="SECT3">
+          <hr>
+
+          <h4 class="SECT3"><a name="INTERFIELDNAVREQ" id=
+          "INTERFIELDNAVREQ">18.6.2. Inter-Field Navigation
+          Requests</a></h4>
+
+          <p>These requests handle navigation between fields on the
+          same page.</p>
+
+          <ul>
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_NEXT_FIELD</i></span> Move to next
+              field.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_PREV_FIELD</i></span> Move to previous
+              field.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_FIRST_FIELD</i></span> Move to the
+              first field.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_LAST_FIELD</i></span> Move to the last
+              field.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_SNEXT_FIELD</i></span> Move to sorted
+              next field.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_SPREV_FIELD</i></span> Move to sorted
+              previous field.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_SFIRST_FIELD</i></span> Move to the
+              sorted first field.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_SLAST_FIELD</i></span> Move to the
+              sorted last field.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_LEFT_FIELD</i></span> Move left to
+              field.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_RIGHT_FIELD</i></span> Move right to
+              field.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_UP_FIELD</i></span> Move up to
+              field.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_DOWN_FIELD</i></span> Move down to
+              field.</p>
+            </li>
+          </ul>
+
+          <p>These requests treat the list of fields on a page as
+          cyclic; that is, REQ_NEXT_FIELD from the last field goes
+          to the first, and REQ_PREV_FIELD from the first field
+          goes to the last. The order of the fields for these (and
+          the REQ_FIRST_FIELD and REQ_LAST_FIELD requests) is
+          simply the order of the field pointers in the form array
+          (as set up by new_form() or set_form_fields()</p>
+
+          <p>It is also possible to traverse the fields as if they
+          had been sorted in screen-position order, so the sequence
+          goes left-to-right and top-to-bottom. To do this, use the
+          second group of four sorted-movement requests.</p>
+
+          <p>Finally, it is possible to move between fields using
+          visual directions up, down, right, and left. To
+          accomplish this, use the third group of four requests.
+          Note, however, that the position of a form for purposes
+          of these requests is its upper-left corner.</p>
+
+          <p>For example, suppose you have a multi-line field B,
+          and two single-line fields A and C on the same line with
+          B, with A to the left of B and C to the right of B. A
+          REQ_MOVE_RIGHT from A will go to B only if A, B, and C
+          all share the same first line; otherwise it will skip
+          over B to C.</p>
+        </div>
+
+        <div class="SECT3">
+          <hr>
+
+          <h4 class="SECT3"><a name="INTRAFIELDNAVREQ" id=
+          "INTRAFIELDNAVREQ">18.6.3. Intra-Field Navigation
+          Requests</a></h4>
+
+          <p>These requests drive movement of the edit cursor
+          within the currently selected field.</p>
+
+          <ul>
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_NEXT_CHAR</i></span> Move to next
+              character.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_PREV_CHAR</i></span> Move to previous
+              character.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_NEXT_LINE</i></span> Move to next
+              line.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_PREV_LINE</i></span> Move to previous
+              line.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_NEXT_WORD</i></span> Move to next
+              word.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_PREV_WORD</i></span> Move to previous
+              word.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_BEG_FIELD</i></span> Move to beginning
+              of field.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_END_FIELD</i></span> Move to end of
+              field.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_BEG_LINE</i></span> Move to beginning
+              of line.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_END_LINE</i></span> Move to end of
+              line.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_LEFT_CHAR</i></span> Move left in
+              field.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_RIGHT_CHAR</i></span> Move right in
+              field.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_UP_CHAR</i></span> Move up in
+              field.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_DOWN_CHAR</i></span> Move down in
+              field.</p>
+            </li>
+          </ul>
+
+          <p>Each word is separated from the previous and next
+          characters by whitespace. The commands to move to
+          beginning and end of line or field look for the first or
+          last non-pad character in their ranges.</p>
+        </div>
+
+        <div class="SECT3">
+          <hr>
+
+          <h4 class="SECT3"><a name="SCROLLREQ" id=
+          "SCROLLREQ">18.6.4. Scrolling Requests</a></h4>
+
+          <p>Fields that are dynamic and have grown and fields
+          explicitly created with offscreen rows are scrollable.
+          One-line fields scroll horizontally; multi-line fields
+          scroll vertically. Most scrolling is triggered by editing
+          and intra-field movement (the library scrolls the field
+          to keep the cursor visible). It is possible to explicitly
+          request scrolling with the following requests:</p>
+
+          <ul>
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_SCR_FLINE</i></span> Scroll vertically
+              forward a line.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_SCR_BLINE</i></span> Scroll vertically
+              backward a line.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_SCR_FPAGE</i></span> Scroll vertically
+              forward a page.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_SCR_BPAGE</i></span> Scroll vertically
+              backward a page.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_SCR_FHPAGE</i></span> Scroll
+              vertically forward half a page.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_SCR_BHPAGE</i></span> Scroll
+              vertically backward half a page.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_SCR_FCHAR</i></span> Scroll
+              horizontally forward a character.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_SCR_BCHAR</i></span> Scroll
+              horizontally backward a character.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_SCR_HFLINE</i></span> Scroll
+              horizontally one field width forward.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_SCR_HBLINE</i></span> Scroll
+              horizontally one field width backward.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_SCR_HFHALF</i></span> Scroll
+              horizontally one half field width forward.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_SCR_HBHALF</i></span> Scroll
+              horizontally one half field width backward.</p>
+            </li>
+          </ul>
+
+          <p>For scrolling purposes, a page of a field is the
+          height of its visible part.</p>
+        </div>
+
+        <div class="SECT3">
+          <hr>
+
+          <h4 class="SECT3"><a name="EDITREQ" id="EDITREQ">18.6.5.
+          Editing Requests</a></h4>
+
+          <p>When you pass the forms driver an ASCII character, it
+          is treated as a request to add the character to the
+          field's data buffer. Whether this is an insertion or a
+          replacement depends on the field's edit mode (insertion
+          is the default.</p>
+
+          <p>The following requests support editing the field and
+          changing the edit mode:</p>
+
+          <ul>
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_INS_MODE</i></span> Set insertion
+              mode.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_OVL_MODE</i></span> Set overlay
+              mode.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_NEW_LINE</i></span> New line request
+              (see below for explanation).</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_INS_CHAR</i></span> Insert space at
+              character location.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_INS_LINE</i></span> Insert blank line
+              at character location.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_DEL_CHAR</i></span> Delete character
+              at cursor.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_DEL_PREV</i></span> Delete previous
+              word at cursor.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_DEL_LINE</i></span> Delete line at
+              cursor.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_DEL_WORD</i></span> Delete word at
+              cursor.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_CLR_EOL</i></span> Clear to end of
+              line.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_CLR_EOF</i></span> Clear to end of
+              field.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_CLR_FIELD</i></span> Clear entire
+              field.</p>
+            </li>
+          </ul>
+
+          <p>The behavior of the REQ_NEW_LINE and REQ_DEL_PREV
+          requests is complicated and partly controlled by a pair
+          of forms options. The special cases are triggered when
+          the cursor is at the beginning of a field, or on the last
+          line of the field.</p>
+
+          <p>First, we consider REQ_NEW_LINE:</p>
+
+          <p>The normal behavior of REQ_NEW_LINE in insert mode is
+          to break the current line at the position of the edit
+          cursor, inserting the portion of the current line after
+          the cursor as a new line following the current and moving
+          the cursor to the beginning of that new line (you may
+          think of this as inserting a newline in the field
+          buffer).</p>
+
+          <p>The normal behavior of REQ_NEW_LINE in overlay mode is
+          to clear the current line from the position of the edit
+          cursor to end of line. The cursor is then moved to the
+          beginning of the next line.</p>
+
+          <p>However, REQ_NEW_LINE at the beginning of a field, or
+          on the last line of a field, instead does a
+          REQ_NEXT_FIELD. O_NL_OVERLOAD option is off, this special
+          action is disabled.</p>
+
+          <p>Now, let us consider REQ_DEL_PREV:</p>
+
+          <p>The normal behavior of REQ_DEL_PREV is to delete the
+          previous character. If insert mode is on, and the cursor
+          is at the start of a line, and the text on that line will
+          fit on the previous one, it instead appends the contents
+          of the current line to the previous one and deletes the
+          current line (you may think of this as deleting a newline
+          from the field buffer).</p>
+
+          <p>However, REQ_DEL_PREV at the beginning of a field is
+          instead treated as a REQ_PREV_FIELD.</p>
+
+          <p>If the O_BS_OVERLOAD option is off, this special
+          action is disabled and the forms driver just returns
+          E_REQUEST_DENIED.</p>
+        </div>
+
+        <div class="SECT3">
+          <hr>
+
+          <h4 class="SECT3"><a name="ORDERREQ" id=
+          "ORDERREQ">18.6.6. Order Requests</a></h4>
+
+          <p>If the type of your field is ordered, and has
+          associated functions for getting the next and previous
+          values of the type from a given value, there are requests
+          that can fetch that value into the field buffer:</p>
+
+          <ul>
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_NEXT_CHOICE</i></span> Place the
+              successor value of the current value in the
+              buffer.</p>
+            </li>
+
+            <li>
+              <p><span class="emphasis"><i class=
+              "EMPHASIS">REQ_PREV_CHOICE</i></span> Place the
+              predecessor value of the current value in the
+              buffer.</p>
+            </li>
+          </ul>
+
+          <p>Of the built-in field types, only TYPE_ENUM has
+          built-in successor and predecessor functions. When you
+          define a field type of your own (see Custom Validation
+          Types), you can associate our own ordering functions.</p>
+        </div>
+
+        <div class="SECT3">
+          <hr>
+
+          <h4 class="SECT3"><a name="APPLICCOMMANDS" id=
+          "APPLICCOMMANDS">18.6.7. Application Commands</a></h4>
+
+          <p>Form requests are represented as integers above the
+          curses value greater than KEY_MAX and less than or equal
+          to the constant MAX_COMMAND. A value within this range
+          gets ignored by form_driver(). So this can be used for
+          any purpose by the application. It can be treated as an
+          application specific action and take corresponding
+          action.</p>
+        </div>
+      </div>
+    </div>
+
+    <div class="SECT1">
+      <hr>
+
+      <h2 class="SECT1"><a name="TOOLS" id="TOOLS">19. Tools and
+      Widget Libraries</a></h2>
+
+      <p>Now that you have seen the capabilities of ncurses and its
+      sister libraries, you are rolling your sleeves up and gearing
+      for a project that heavily manipulates screen. But wait.. It
+      can be pretty difficult to write and maintain complex GUI
+      widgets in plain ncurses or even with the additional
+      libraries. There are some ready-to-use tools and widget
+      libraries that can be used instead of writing your own
+      widgets. You can use some of them, get ideas from the code,
+      or even extend them.</p>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="CDK" id="CDK">19.1. CDK (Curses
+        Development Kit)</a></h3>
+
+        <p>In the author's words</p>
+
+        <p><span class="emphasis"><i class="EMPHASIS">CDK stands
+        for 'Curses Development Kit' and it currently contains 21
+        ready to use widgets which facilitate the speedy
+        development of full screen curses programs.</i></span>
+        </p>
+
+        <p>The kit provides some useful widgets, which can be used
+        in your programs directly. It is pretty well written and
+        the documentation is very good. The examples in the
+        examples directory can be a good place to start for
+        beginners. The CDK can be downloaded from <a href=
+        "https://invisible-island.net/cdk/" target=
+        "_top">https://invisible-island.net/cdk/</a> . Follow the
+        instructions in README file to install it.</p>
+
+        <div class="SECT3">
+          <hr>
+
+          <h4 class="SECT3"><a name="WIDGETLIST" id=
+          "WIDGETLIST">19.1.1. Widget List</a></h4>
+
+          <p>The following is the list of widgets provided with cdk
+          and their description.</p>
+
+          <pre class=
+          "PROGRAMLISTING">Widget Type           Quick Description
+===========================================================================
+Alphalist             Allows a user to select from a list of words, with
+                      the ability to narrow the search list by typing in a
+                      few characters of the desired word.
+Buttonbox             This creates a multiple button widget. 
+Calendar              Creates a little simple calendar widget.
+Dialog                Prompts the user with a message, and the user
+                      can pick an answer from the buttons provided.
+Entry                 Allows the user to enter various types of information.
+File Selector         A file selector built from Cdk base widgets. This
+                      example shows how to create more complicated widgets
+                      using the Cdk widget library.
+Graph                 Draws a graph.
+Histogram             Draws a histogram.
+Item List             Creates a pop up field which allows the user to select
+                      one of several choices in a small field. Very useful
+                      for things like days of the week or month names.
+Label                 Displays messages in a pop up box, or the label can be
+                      considered part of the screen.
+Marquee               Displays a message in a scrolling marquee.
+Matrix                Creates a complex matrix with lots of options.
+Menu                  Creates a pull-down menu interface.
+Multiple Line Entry   A multiple line entry field. Very useful
+                      for long fields. (like a description
+                      field)
+Radio List            Creates a radio button list.
+Scale                 Creates a numeric scale. Used for allowing a user to
+                      pick a numeric value and restrict them to a range of 
+                      values.
+Scrolling List        Creates a scrolling list/menu list.
+Scrolling Window      Creates a scrolling log file viewer. Can add 
+                      information into the window while its running. 
+                      A good widget for displaying the progress of
+                      something. (akin to a console window)
+Selection List        Creates a multiple option selection list.
+Slider                Akin to the scale widget, this widget provides a
+                      visual slide bar to represent the numeric value.
+Template              Creates a entry field with character sensitive 
+                      positions. Used for pre-formatted fields like
+                      dates and phone numbers.
+Viewer                This is a file/information viewer. Very useful
+                      when you need to display loads of information.
+===========================================================================</pre>
+          <p>A few of the widgets are modified by Thomas Dickey in
+          recent versions.</p>
+        </div>
+
+        <div class="SECT3">
+          <hr>
+
+          <h4 class="SECT3"><a name="CDKATTRACT" id=
+          "CDKATTRACT">19.1.2. Some Attractive Features</a></h4>
+
+          <p>Apart from making our life easier with readily usable
+          widgets, cdk solves one frustrating problem with printing
+          multi colored strings, justified strings elegantly.
+          Special formatting tags can be embedded in the strings
+          which are passed to CDK functions. For Example</p>
+
+          <p>If the string</p>
+
+          <pre class=
+          "PROGRAMLISTING">"&lt;/B/1&gt;This line should have a yellow foreground and a blue
+background.&lt;!1&gt;"</pre>
+          <p>given as a parameter to newCDKLabel(), it prints the
+          line with yellow foreground and blue background. There
+          are other tags available for justifying string, embedding
+          special drawing characters, etc. Please refer to the man
+          page cdk_display(3X) for details. The man page explains
+          the usage with nice examples.</p>
+        </div>
+
+        <div class="SECT3">
+          <hr>
+
+          <h4 class="SECT3"><a name="CDKCONCLUSION" id=
+          "CDKCONCLUSION">19.1.3. Conclusion</a></h4>
+
+          <p>All in all, CDK is a well-written package of widgets,
+          which if used properly can form a strong frame work for
+          developing complex GUI.</p>
+        </div>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="DIALOG" id="DIALOG">19.2. The
+        dialog</a></h3>
+
+        <p>Long long ago, in September 1994, when few people knew
+        linux, Jeff Tranter wrote an <a href=
+        "http://www2.linuxjournal.com/lj-issues/issue5/2807.html"
+        target="_top">article</a> on dialog in Linux Journal. He
+        starts the article with these words..</p>
+
+        <p><span class="emphasis"><i class="EMPHASIS">Linux is
+        based on the Unix operating system, but also features a
+        number of unique and useful kernel features and application
+        programs that often go beyond what is available under Unix.
+        One little-known gem is "dialog", a utility for creating
+        professional-looking dialog boxes from within shell
+        scripts. This article presents a tutorial introduction to
+        the dialog utility, and shows examples of how and where it
+        can be used</i></span>
+        </p>
+
+        <p>As he explains, dialog is a real gem in making
+        professional-looking dialog boxes with ease. It creates a
+        variety of dialog boxes, menus, check lists, etc. It is
+        usually installed by default. If not, you can download it
+        from <a href="https://invisible-island.net/dialog/" target=
+        "_top">Thomas Dickey</a>'s site.</p>
+
+        <p>The above-mentioned article gives a very good overview
+        of its uses and capabilities. The man page has more
+        details. It can be used in variety of situations. One good
+        example is building of linux kernel in text mode. Linux
+        kernel uses a modified version of dialog tailored for its
+        needs.</p>
+
+        <p>dialog was initially designed to be used with shell
+        scripts. If you want to use its functionality in a c
+        program, then you can use libdialog. The documentation
+        regarding this is sparse. Definitive reference is the
+        dialog.h header file which comes with the library. You may
+        need to hack here and there to get the required output. The
+        source is easily customizable. I have used it on a number
+        of occasions by modifying the code.</p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="PERLCURSES" id=
+        "PERLCURSES">19.3. Perl Curses Modules CURSES::FORM and
+        CURSES::WIDGETS</a></h3>
+
+        <p>The perl module Curses, Curses::Form and Curses::Widgets
+        give access to curses from perl. If you have curses and
+        basic perl is installed, you can get these modules from
+        <a href="http://www.cpan.org/modules/01modules.index.html"
+        target="_top">CPAN All Modules page</a>. Get the three
+        zipped modules in the Curses category. Once installed you
+        can use these modules from perl scripts like any other
+        module. For more information on perl modules see perlmod
+        man page. The above modules come with good documentation
+        and they have some demo scripts to test the functionality.
+        Though the widgets provided are very rudimentary, these
+        modules provide good access to curses library from
+        perl.</p>
+
+        <p>Some of my code examples are converted to perl by
+        Anuradha Ratnaweera and they are available in the
+        <tt class="LITERAL">perl</tt> directory.</p>
+
+        <p>For more information see man pages Curses(3) ,
+        Curses::Form(3) and Curses::Widgets(3). These pages are
+        installed only when the above modules are acquired and
+        installed.</p>
+      </div>
+    </div>
+
+    <div class="SECT1">
+      <hr>
+
+      <h2 class="SECT1"><a name="JUSTFORFUN" id="JUSTFORFUN">20.
+      Just For Fun !!!</a></h2>
+
+      <p>This section contains few programs written by me just for
+      fun. They don't signify a better programming practice or the
+      best way of using ncurses. They are provided here so as to
+      allow beginners to get ideas and add more programs to this
+      section. If you have written a couple of nice, simple
+      programs in curses and want them to included here, contact
+      <a href="mailto:ppadala@gmail.com" target="_top">me</a>.</p>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="GAMEOFLIFE" id=
+        "GAMEOFLIFE">20.1. The Game of Life</a></h3>
+
+        <p>Game of life is a wonder of math. In <a href=
+        "http://www.math.com/students/wonders/life/life.html"
+        target="_top">Paul Callahan</a>'s words</p>
+
+        <pre class="PROGRAMLISTING"><span class="emphasis"><i class=
+        "EMPHASIS">The Game of Life (or simply Life) is not a game in the conventional sense. There
+are no players, and no winning or losing. Once the "pieces" are placed in the
+starting position, the rules determine everything that happens later.
+Nevertheless, Life is full of surprises! In most cases, it is impossible to look
+at a starting position (or pattern) and see what will happen in the future. The
+only way to find out is to follow the rules of the game.</i></span></pre>
+        <p>This program starts with a simple inverted U pattern and
+        shows how wonderful life works. There is a lot of room for
+        improvement in the program. You can let the user enter
+        pattern of his choice or even take input from a file. You
+        can also change rules and play with a lot of variations.
+        Search on <a href="https://www.google.com" target=
+        "_top">google</a> for interesting information on game of
+        life.</p>
+
+        <p><span class="emphasis"><i class="EMPHASIS">File Path:
+        JustForFun/life.c</i></span>
+        </p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="MAGIC" id="MAGIC">20.2. Magic
+        Square</a></h3>
+
+        <p>Magic Square, another wonder of math, is very simple to
+        understand but very difficult to make. In a magic square
+        sum of the numbers in each row, each column is equal. Even
+        diagonal sum can be equal. There are many variations which
+        have special properties.</p>
+
+        <p>This program creates a simple magic square of odd
+        order.</p>
+
+        <p><span class="emphasis"><i class="EMPHASIS">File Path:
+        JustForFun/magic.c</i></span>
+        </p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="HANOI" id="HANOI">20.3. Towers
+        of Hanoi</a></h3>
+
+        <p>The famous towers of hanoi solver. The aim of the game
+        is to move the disks on the first peg to last peg, using
+        middle peg as a temporary stay. The catch is not to place a
+        larger disk over a small disk at any time.</p>
+
+        <p><span class="emphasis"><i class="EMPHASIS">File Path:
+        JustForFun/hanoi.c</i></span>
+        </p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="QUEENS" id="QUEENS">20.4. Queens
+        Puzzle</a></h3>
+
+        <p>The objective of the famous N-Queen puzzle is to put N
+        queens on a N X N chess board without attacking each
+        other.</p>
+
+        <p>This program solves it with a simple backtracking
+        technique.</p>
+
+        <p><span class="emphasis"><i class="EMPHASIS">File Path:
+        JustForFun/queens.c</i></span>
+        </p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="SHUFFLE" id="SHUFFLE">20.5.
+        Shuffle</a></h3>
+
+        <p>A fun game, if you have time to kill.</p>
+
+        <p><span class="emphasis"><i class="EMPHASIS">File Path:
+        JustForFun/shuffle.c</i></span>
+        </p>
+      </div>
+
+      <div class="SECT2">
+        <hr>
+
+        <h3 class="SECT2"><a name="TT" id="TT">20.6. Typing
+        Tutor</a></h3>
+
+        <p>A simple typing tutor, I created more out of need than
+        for ease of use. If you know how to put your fingers
+        correctly on the keyboard, but lack practice, this can be
+        helpful.</p>
+
+        <p><span class="emphasis"><i class="EMPHASIS">File Path:
+        JustForFun/tt.c</i></span>
+        </p>
+      </div>
+    </div>
+
+    <div class="SECT1">
+      <hr>
+
+      <h2 class="SECT1"><a name="REF" id="REF">21. References</a></h2>
+
+      <ul>
+        <li>
+          <p>NCURSES man pages</p>
+        </li>
+
+        <li>
+          <p>NCURSES FAQ at <a href=
+          "https://invisible-island.net/ncurses/ncurses.faq.html"
+          target=
+          "_top">https://invisible-island.net/ncurses/ncurses.faq.html</a></p>
+        </li>
+
+        <li>
+          <p>Writing programs with NCURSES by Eric Raymond and Zeyd
+          M. Ben-Halim at <a href=
+          "https://invisible-island.net/ncurses/ncurses-intro.html"
+          target=
+          "_top">https://invisible-island.net/ncurses/ncurses-intro.html</a>
+          - somewhat obsolete. I was inspired by this document and
+          the structure of this HOWTO follows from the original
+          document</p>
+        </li>
+      </ul>
+    </div>
+  </div>
+</body>
+</html>
diff --git a/doc/html/ada/files.htm b/doc/html/ada/files.htm
new file mode 100644
index 0000000..d48af03
--- /dev/null
+++ b/doc/html/ada/files.htm
@@ -0,0 +1,18 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title></title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<h2 align="center">Files</h2>
+<a href="files/T.htm">[T]</a>
+</body></html>
diff --git a/doc/html/ada/files/T.htm b/doc/html/ada/files/T.htm
new file mode 100644
index 0000000..9730506
--- /dev/null
+++ b/doc/html/ada/files/T.htm
@@ -0,0 +1,83 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>T</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+<body>
+<h2>Files - T</h2>
+<a href="../files.htm" target="_self">[index]</a>
+<ul compact type="disc">
+<li><a href="../terminal_interface-curses-aux__adb.htm" target="main">terminal_interface-curses-aux.adb</a>
+<li><a href="../terminal_interface-curses-aux__ads.htm" target="main">terminal_interface-curses-aux.ads</a>
+<li><a href="../terminal_interface-curses-forms-field_types-alpha__adb.htm" target="main">terminal_interface-curses-forms-field_types-alpha.adb</a>
+<li><a href="../terminal_interface-curses-forms-field_types-alpha__ads.htm" target="main">terminal_interface-curses-forms-field_types-alpha.ads</a>
+<li><a href="../terminal_interface-curses-forms-field_types-alphanumeric__adb.htm" target="main">terminal_interface-curses-forms-field_types-alphanumeric.adb</a>
+<li><a href="../terminal_interface-curses-forms-field_types-alphanumeric__ads.htm" target="main">terminal_interface-curses-forms-field_types-alphanumeric.ads</a>
+<li><a href="../terminal_interface-curses-forms-field_types-enumeration-ada__adb.htm" target="main">terminal_interface-curses-forms-field_types-enumeration-ada.adb</a>
+<li><a href="../terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm" target="main">terminal_interface-curses-forms-field_types-enumeration-ada.ads</a>
+<li><a href="../terminal_interface-curses-forms-field_types-enumeration__adb.htm" target="main">terminal_interface-curses-forms-field_types-enumeration.adb</a>
+<li><a href="../terminal_interface-curses-forms-field_types-enumeration__ads.htm" target="main">terminal_interface-curses-forms-field_types-enumeration.ads</a>
+<li><a href="../terminal_interface-curses-forms-field_types-intfield__adb.htm" target="main">terminal_interface-curses-forms-field_types-intfield.adb</a>
+<li><a href="../terminal_interface-curses-forms-field_types-intfield__ads.htm" target="main">terminal_interface-curses-forms-field_types-intfield.ads</a>
+<li><a href="../terminal_interface-curses-forms-field_types-ipv4_address__adb.htm" target="main">terminal_interface-curses-forms-field_types-ipv4_address.adb</a>
+<li><a href="../terminal_interface-curses-forms-field_types-ipv4_address__ads.htm" target="main">terminal_interface-curses-forms-field_types-ipv4_address.ads</a>
+<li><a href="../terminal_interface-curses-forms-field_types-numeric__adb.htm" target="main">terminal_interface-curses-forms-field_types-numeric.adb</a>
+<li><a href="../terminal_interface-curses-forms-field_types-numeric__ads.htm" target="main">terminal_interface-curses-forms-field_types-numeric.ads</a>
+<li><a href="../terminal_interface-curses-forms-field_types-regexp__adb.htm" target="main">terminal_interface-curses-forms-field_types-regexp.adb</a>
+<li><a href="../terminal_interface-curses-forms-field_types-regexp__ads.htm" target="main">terminal_interface-curses-forms-field_types-regexp.ads</a>
+<li><a href="../terminal_interface-curses-forms-field_types-user-choice__adb.htm" target="main">terminal_interface-curses-forms-field_types-user-choice.adb</a>
+<li><a href="../terminal_interface-curses-forms-field_types-user-choice__ads.htm" target="main">terminal_interface-curses-forms-field_types-user-choice.ads</a>
+<li><a href="../terminal_interface-curses-forms-field_types-user__adb.htm" target="main">terminal_interface-curses-forms-field_types-user.adb</a>
+<li><a href="../terminal_interface-curses-forms-field_types-user__ads.htm" target="main">terminal_interface-curses-forms-field_types-user.ads</a>
+<li><a href="../terminal_interface-curses-forms-field_types__adb.htm" target="main">terminal_interface-curses-forms-field_types.adb</a>
+<li><a href="../terminal_interface-curses-forms-field_types__ads.htm" target="main">terminal_interface-curses-forms-field_types.ads</a>
+<li><a href="../terminal_interface-curses-forms-field_user_data__adb.htm" target="main">terminal_interface-curses-forms-field_user_data.adb</a>
+<li><a href="../terminal_interface-curses-forms-field_user_data__ads.htm" target="main">terminal_interface-curses-forms-field_user_data.ads</a>
+<li><a href="../terminal_interface-curses-forms-form_user_data__adb.htm" target="main">terminal_interface-curses-forms-form_user_data.adb</a>
+<li><a href="../terminal_interface-curses-forms-form_user_data__ads.htm" target="main">terminal_interface-curses-forms-form_user_data.ads</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm" target="main">terminal_interface-curses-forms.adb</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm" target="main">terminal_interface-curses-forms.ads</a>
+<li><a href="../terminal_interface-curses-menus-item_user_data__adb.htm" target="main">terminal_interface-curses-menus-item_user_data.adb</a>
+<li><a href="../terminal_interface-curses-menus-item_user_data__ads.htm" target="main">terminal_interface-curses-menus-item_user_data.ads</a>
+<li><a href="../terminal_interface-curses-menus-menu_user_data__adb.htm" target="main">terminal_interface-curses-menus-menu_user_data.adb</a>
+<li><a href="../terminal_interface-curses-menus-menu_user_data__ads.htm" target="main">terminal_interface-curses-menus-menu_user_data.ads</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm" target="main">terminal_interface-curses-menus.adb</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm" target="main">terminal_interface-curses-menus.ads</a>
+<li><a href="../terminal_interface-curses-mouse__adb.htm" target="main">terminal_interface-curses-mouse.adb</a>
+<li><a href="../terminal_interface-curses-mouse__ads.htm" target="main">terminal_interface-curses-mouse.ads</a>
+<li><a href="../terminal_interface-curses-panels-user_data__adb.htm" target="main">terminal_interface-curses-panels-user_data.adb</a>
+<li><a href="../terminal_interface-curses-panels-user_data__ads.htm" target="main">terminal_interface-curses-panels-user_data.ads</a>
+<li><a href="../terminal_interface-curses-panels__adb.htm" target="main">terminal_interface-curses-panels.adb</a>
+<li><a href="../terminal_interface-curses-panels__ads.htm" target="main">terminal_interface-curses-panels.ads</a>
+<li><a href="../terminal_interface-curses-putwin__adb.htm" target="main">terminal_interface-curses-putwin.adb</a>
+<li><a href="../terminal_interface-curses-putwin__ads.htm" target="main">terminal_interface-curses-putwin.ads</a>
+<li><a href="../terminal_interface-curses-termcap__adb.htm" target="main">terminal_interface-curses-termcap.adb</a>
+<li><a href="../terminal_interface-curses-termcap__ads.htm" target="main">terminal_interface-curses-termcap.ads</a>
+<li><a href="../terminal_interface-curses-terminfo__adb.htm" target="main">terminal_interface-curses-terminfo.adb</a>
+<li><a href="../terminal_interface-curses-terminfo__ads.htm" target="main">terminal_interface-curses-terminfo.ads</a>
+<li><a href="../terminal_interface-curses-text_io-aux__adb.htm" target="main">terminal_interface-curses-text_io-aux.adb</a>
+<li><a href="../terminal_interface-curses-text_io-aux__ads.htm" target="main">terminal_interface-curses-text_io-aux.ads</a>
+<li><a href="../terminal_interface-curses-text_io-complex_io__adb.htm" target="main">terminal_interface-curses-text_io-complex_io.adb</a>
+<li><a href="../terminal_interface-curses-text_io-complex_io__ads.htm" target="main">terminal_interface-curses-text_io-complex_io.ads</a>
+<li><a href="../terminal_interface-curses-text_io-decimal_io__adb.htm" target="main">terminal_interface-curses-text_io-decimal_io.adb</a>
+<li><a href="../terminal_interface-curses-text_io-decimal_io__ads.htm" target="main">terminal_interface-curses-text_io-decimal_io.ads</a>
+<li><a href="../terminal_interface-curses-text_io-enumeration_io__adb.htm" target="main">terminal_interface-curses-text_io-enumeration_io.adb</a>
+<li><a href="../terminal_interface-curses-text_io-enumeration_io__ads.htm" target="main">terminal_interface-curses-text_io-enumeration_io.ads</a>
+<li><a href="../terminal_interface-curses-text_io-fixed_io__adb.htm" target="main">terminal_interface-curses-text_io-fixed_io.adb</a>
+<li><a href="../terminal_interface-curses-text_io-fixed_io__ads.htm" target="main">terminal_interface-curses-text_io-fixed_io.ads</a>
+<li><a href="../terminal_interface-curses-text_io-float_io__adb.htm" target="main">terminal_interface-curses-text_io-float_io.adb</a>
+<li><a href="../terminal_interface-curses-text_io-float_io__ads.htm" target="main">terminal_interface-curses-text_io-float_io.ads</a>
+<li><a href="../terminal_interface-curses-text_io-integer_io__adb.htm" target="main">terminal_interface-curses-text_io-integer_io.adb</a>
+<li><a href="../terminal_interface-curses-text_io-integer_io__ads.htm" target="main">terminal_interface-curses-text_io-integer_io.ads</a>
+<li><a href="../terminal_interface-curses-text_io-modular_io__adb.htm" target="main">terminal_interface-curses-text_io-modular_io.adb</a>
+<li><a href="../terminal_interface-curses-text_io-modular_io__ads.htm" target="main">terminal_interface-curses-text_io-modular_io.ads</a>
+<li><a href="../terminal_interface-curses-text_io__adb.htm" target="main">terminal_interface-curses-text_io.adb</a>
+<li><a href="../terminal_interface-curses-text_io__ads.htm" target="main">terminal_interface-curses-text_io.ads</a>
+<li><a href="../terminal_interface-curses-trace__adb.htm" target="main">terminal_interface-curses-trace.adb</a>
+<li><a href="../terminal_interface-curses-trace__ads.htm" target="main">terminal_interface-curses-trace.ads</a>
+<li><a href="../terminal_interface-curses__adb.htm" target="main">terminal_interface-curses.adb</a>
+<li><a href="../terminal_interface-curses__ads.htm" target="main">terminal_interface-curses.ads</a>
+<li><a href="../terminal_interface-curses_constants__ads.htm" target="main">terminal_interface-curses_constants.ads</a>
+<li><a href="../terminal_interface__ads.htm" target="main">terminal_interface.ads</a>
+</ul></body></html>
diff --git a/doc/html/ada/funcs.htm b/doc/html/ada/funcs.htm
new file mode 100644
index 0000000..1ffcef1
--- /dev/null
+++ b/doc/html/ada/funcs.htm
@@ -0,0 +1,39 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title></title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<h2 align="center">Functions/Procedures</h2>
+<a href="funcs/A.htm">[A]</a>
+<a href="funcs/B.htm">[B]</a>
+<a href="funcs/C.htm">[C]</a>
+<a href="funcs/D.htm">[D]</a>
+<a href="funcs/E.htm">[E]</a>
+<a href="funcs/F.htm">[F]</a>
+<a href="funcs/G.htm">[G]</a>
+<a href="funcs/H.htm">[H]</a>
+<a href="funcs/I.htm">[I]</a>
+<a href="funcs/K.htm">[K]</a>
+<a href="funcs/L.htm">[L]</a>
+<a href="funcs/M.htm">[M]</a>
+<a href="funcs/N.htm">[N]</a>
+<a href="funcs/O.htm">[O]</a>
+<a href="funcs/P.htm">[P]</a>
+<a href="funcs/Q.htm">[Q]</a>
+<a href="funcs/R.htm">[R]</a>
+<a href="funcs/S.htm">[S]</a>
+<a href="funcs/T.htm">[T]</a>
+<a href="funcs/U.htm">[U]</a>
+<a href="funcs/V.htm">[V]</a>
+<a href="funcs/W.htm">[W]</a>
+</body></html>
diff --git a/doc/html/ada/funcs/A.htm b/doc/html/ada/funcs/A.htm
new file mode 100644
index 0000000..c552075
--- /dev/null
+++ b/doc/html/ada/funcs/A.htm
@@ -0,0 +1,29 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>A</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+<body>
+<h2>Functions - A</h2>
+<a href="../funcs.htm" target="_self">[index]</a>
+<ul compact type="disc">
+<li><a href="../terminal_interface-curses-panels__ads.htm#ref_129_13" target="main">Above</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_568_13" target="main">ACS_Map</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_694_14" target="main">Add -  terminal_interface-curses.ads:694</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_699_14" target="main">Add -  terminal_interface-curses.ads:699</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_705_14" target="main">Add -  terminal_interface-curses.ads:705</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_713_14" target="main">Add -  terminal_interface-curses.ads:713</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_824_14" target="main">Add -  terminal_interface-curses.ads:824</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_833_14" target="main">Add -  terminal_interface-curses.ads:833</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_848_14" target="main">Add -  terminal_interface-curses.ads:848</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_857_14" target="main">Add -  terminal_interface-curses.ads:857</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1478_14" target="main">Add_Character_To_Pad_And_Echo_It -  terminal_interface-curses.ads:1478</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1483_14" target="main">Add_Character_To_Pad_And_Echo_It -  terminal_interface-curses.ads:1483</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_722_14" target="main">Add_With_Immediate_Echo -  terminal_interface-curses.ads:722</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_728_14" target="main">Add_With_Immediate_Echo -  terminal_interface-curses.ads:728</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_842_16" target="main">Ahead</a>
+<li><a href="../terminal_interface-curses-forms-field_types-user__adb.htm#ref_51_16" target="main">Allocate_Arg</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1187_14" target="main">Allow_Scrolling</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_2009_14" target="main">Assume_Default_Colors</a>
+</ul></body></html>
diff --git a/doc/html/ada/funcs/B.htm b/doc/html/ada/funcs/B.htm
new file mode 100644
index 0000000..f8ca69b
--- /dev/null
+++ b/doc/html/ada/funcs/B.htm
@@ -0,0 +1,25 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>B</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+<body>
+<h2>Functions - B</h2>
+<a href="../funcs.htm" target="_self">[index]</a>
+<ul compact type="disc">
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_456_14" target="main">Background -  terminal_interface-curses-forms.ads:456</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_461_14" target="main">Background -  terminal_interface-curses-forms.ads:461</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_450_14" target="main">Background -  terminal_interface-curses-menus.ads:450</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_455_14" target="main">Background -  terminal_interface-curses-menus.ads:455</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_2065_16" target="main">Baud</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1818_13" target="main">Baudrate</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1041_14" target="main">Beep</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_752_16" target="main">Beeper</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_858_16" target="main">Behind</a>
+<li><a href="../terminal_interface-curses-panels__ads.htm#ref_134_13" target="main">Below</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_875_14" target="main">Border</a>
+<li><a href="../terminal_interface-curses-panels__ads.htm#ref_77_14" target="main">Bottom</a>
+<li><a href="../terminal_interface-curses-panels__adb.htm#ref_66_16" target="main">Bottompanel</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_891_14" target="main">Box</a>
+</ul></body></html>
diff --git a/doc/html/ada/funcs/C.htm b/doc/html/ada/funcs/C.htm
new file mode 100644
index 0000000..8bfb09c
--- /dev/null
+++ b/doc/html/ada/funcs/C.htm
@@ -0,0 +1,63 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>C</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+<body>
+<h2>Functions - C</h2>
+<a href="../funcs.htm" target="_self">[index]</a>
+<ul compact type="disc">
+<li><a href="../terminal_interface-curses__adb.htm#ref_2229_16" target="main">Canchangecolor</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1910_13" target="main">Can_Change_Color</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_772_16" target="main">Cbreak</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_384_13" target="main">Changed</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1016_14" target="main">Change_Attributes -  terminal_interface-curses.ads:1016</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1025_14" target="main">Change_Attributes -  terminal_interface-curses.ads:1025</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1287_14" target="main">Change_Background</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1323_14" target="main">Change_Lines_Status</a>
+<li><a href="../terminal_interface-curses-forms-field_types__ads.htm#ref_186_13" target="main">Char_Check_Router</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1251_14" target="main">Clear</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_970_16" target="main">Clear_Ok</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1152_14" target="main">Clear_On_Next_Update</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1704_14" target="main">Clear_Soft_Label_Keys</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1265_14" target="main">Clear_To_End_Of_Line</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1258_14" target="main">Clear_To_End_Of_Screen</a>
+<li><a href="../terminal_interface-curses-text_io__ads.htm#ref_99_13" target="main">Col -  terminal_interface-curses-text_io.ads:99</a>
+<li><a href="../terminal_interface-curses-text_io__ads.htm#ref_100_13" target="main">Col -  terminal_interface-curses-text_io.ads:100</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_2246_16" target="main">Colorcontent</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_2382_16" target="main">COLORS_As_Function</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1915_14" target="main">Color_Content</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_2390_16" target="main">COLOR_PAIRS_As_Function</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_2365_16" target="main">COLS_As_Function</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_554_13" target="main">Columns</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1345_14" target="main">Copy</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1275_16" target="main">Copywin</a>
+<li><a href="../terminal_interface-curses-forms-field_types__ads.htm#ref_168_13" target="main">Copy_Arg</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_681_16" target="main">Count -  terminal_interface-curses-forms.adb:681</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_797_16" target="main">Count -  terminal_interface-curses-menus.adb:797</a>
+<li><a href="../terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm#ref_49_13" target="main">Create -  terminal_interface-curses-forms-field_types-enumeration-ada.ads:49</a>
+<li><a href="../terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_65_13" target="main">Create -  terminal_interface-curses-forms-field_types-enumeration.ads:65</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_295_13" target="main">Create -  terminal_interface-curses-forms.ads:295</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_625_13" target="main">Create -  terminal_interface-curses-forms.ads:625</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_190_13" target="main">Create -  terminal_interface-curses-menus.ads:190</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_637_13" target="main">Create -  terminal_interface-curses-menus.ads:637</a>
+<li><a href="../terminal_interface-curses-panels__ads.htm#ref_67_13" target="main">Create -  terminal_interface-curses-panels.ads:67</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_740_13" target="main">Create -  terminal_interface-curses.ads:740</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_731_13" target="main">Current -  terminal_interface-curses-forms.ads:731</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_293_13" target="main">Current -  terminal_interface-curses-menus.ads:293</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_917_16" target="main">Current_Fld</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_651_13" target="main">Current_Window</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_261_16" target="main">Curr_Item</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_2460_17" target="main">curses_freeall</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_2032_14" target="main">Curses_Free_All</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_2019_13" target="main">Curses_Version</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_2452_16" target="main">curses_versionC</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_2334_16" target="main">Curs_Set</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_2438_16" target="main">C_Assume_Default_Colors</a>
+<li><a href="../terminal_interface-curses-forms-field_types__ads.htm#ref_149_13" target="main">C_Builtin_Router</a>
+<li><a href="../terminal_interface-curses-forms-field_types__ads.htm#ref_150_13" target="main">C_Choice_Router</a>
+<li><a href="../terminal_interface-curses-forms-field_types-user-choice__ads.htm#ref_79_13" target="main">C_Generic_Choice</a>
+<li><a href="../terminal_interface-curses-forms-field_types-user__ads.htm#ref_80_13" target="main">C_Generic_Type</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_2426_16" target="main">C_Use_Default_Colors</a>
+</ul></body></html>
diff --git a/doc/html/ada/funcs/D.htm b/doc/html/ada/funcs/D.htm
new file mode 100644
index 0000000..2c16baa
--- /dev/null
+++ b/doc/html/ada/funcs/D.htm
@@ -0,0 +1,51 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>D</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+<body>
+<h2>Functions - D</h2>
+<a href="../funcs.htm" target="_self">[index]</a>
+<ul compact type="disc">
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_694_13" target="main">Data_Ahead</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_699_13" target="main">Data_Behind</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_105_13" target="main">Default_Field_Options</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_127_13" target="main">Default_Form_Options</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_167_13" target="main">Default_Item_Options</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_146_13" target="main">Default_Menu_Options</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1767_14" target="main">Define_Key</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_2013_16" target="main">Defkey</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_2266_16" target="main">Def_Prog_Mode</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_2268_16" target="main">Def_Shell_Mode</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_2045_16" target="main">Delayoutput</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1804_14" target="main">Delay_Output</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_317_14" target="main">Delete -  terminal_interface-curses-forms.ads:317</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_636_14" target="main">Delete -  terminal_interface-curses-forms.ads:636</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_202_14" target="main">Delete -  terminal_interface-curses-menus.ads:202</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_644_14" target="main">Delete -  terminal_interface-curses-menus.ads:644</a>
+<li><a href="../terminal_interface-curses-panels__ads.htm#ref_139_14" target="main">Delete -  terminal_interface-curses-panels.ads:139</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_759_14" target="main">Delete -  terminal_interface-curses.ads:759</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1505_14" target="main">Delete_Character -  terminal_interface-curses.ads:1505</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1510_14" target="main">Delete_Character -  terminal_interface-curses.ads:1510</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1383_14" target="main">Delete_Line</a>
+<li><a href="../terminal_interface-curses-panels__adb.htm#ref_157_16" target="main">Del_Panel</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_775_13" target="main">Derived_Window</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_299_16" target="main">Derwin</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_108_16" target="main">Descname -  terminal_interface-curses-menus.adb:108</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_234_16" target="main">Descname -  terminal_interface-curses-menus.adb:234</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_242_16" target="main">Descname -  terminal_interface-curses-menus.adb:242</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_273_14" target="main">Description -  terminal_interface-curses-menus.ads:273</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_277_14" target="main">Description -  terminal_interface-curses-menus.ads:277</a>
+<li><a href="../terminal_interface-curses-mouse__adb.htm#ref_130_14" target="main">Dispatch_Event</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1062_16" target="main">Do_Update</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_713_13" target="main">Driver -  terminal_interface-curses-forms.ads:713</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_659_13" target="main">Driver -  terminal_interface-curses-menus.ads:659</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_855_16" target="main">Driver -  terminal_interface-curses-menus.adb:855</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_323_13" target="main">Duplicate -  terminal_interface-curses-forms.ads:323</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_785_13" target="main">Duplicate -  terminal_interface-curses.ads:785</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_322_16" target="main">Dupwin</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_131_16" target="main">Dup_Field</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_495_14" target="main">Dynamic_Info</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_495_16" target="main">Dyn_Info</a>
+</ul></body></html>
diff --git a/doc/html/ada/funcs/E.htm b/doc/html/ada/funcs/E.htm
new file mode 100644
index 0000000..b161c06
--- /dev/null
+++ b/doc/html/ada/funcs/E.htm
@@ -0,0 +1,22 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>E</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+<body>
+<h2>Functions - E</h2>
+<a href="../funcs.htm" target="_self">[index]</a>
+<ul compact type="disc">
+<li><a href="../terminal_interface-curses__adb.htm#ref_810_16" target="main">Echo</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1757_14" target="main">Enable_Key</a>
+<li><a href="../terminal_interface-curses-mouse__ads.htm#ref_147_13" target="main">Enclosed_In_Window</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_113_16" target="main">Endwin</a>
+<li><a href="../terminal_interface-curses-mouse__ads.htm#ref_121_14" target="main">End_Mouse</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_668_14" target="main">End_Screen</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_666_14" target="main">End_Windows</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1245_14" target="main">Erase</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_2073_16" target="main">Erasechar</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1823_13" target="main">Erase_Character</a>
+<li><a href="../terminal_interface-curses-aux__ads.htm#ref_87_14" target="main">Eti_Exception</a>
+</ul></body></html>
diff --git a/doc/html/ada/funcs/F.htm b/doc/html/ada/funcs/F.htm
new file mode 100644
index 0000000..9e6bac8
--- /dev/null
+++ b/doc/html/ada/funcs/F.htm
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>F</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+<body>
+<h2>Functions - F</h2>
+<a href="../funcs.htm" target="_self">[index]</a>
+<ul compact type="disc">
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_603_13" target="main">Fields</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_411_16" target="main">Field_Back -  terminal_interface-curses-forms.adb:411</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_421_16" target="main">Field_Back -  terminal_interface-curses-forms.adb:421</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_223_16" target="main">Field_Buffer -  terminal_interface-curses-forms.adb:223</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_234_16" target="main">Field_Buffer -  terminal_interface-curses-forms.adb:234</a>
+<li><a href="../terminal_interface-curses-forms-field_types__ads.htm#ref_178_13" target="main">Field_Check_Router</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_609_13" target="main">Field_Count</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_372_16" target="main">Field_Fore -  terminal_interface-curses-forms.adb:372</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_382_16" target="main">Field_Fore -  terminal_interface-curses-forms.adb:382</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_189_16" target="main">Field_Just</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_328_16" target="main">Field_Opts</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_311_16" target="main">Field_Opts_Off</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_308_16" target="main">Field_Opts_On</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_447_16" target="main">Field_Pad</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_260_16" target="main">Field_Status</a>
+<li><a href="../terminal_interface-curses-forms-field_user_data__adb.htm#ref_68_16" target="main">Field_Userptr</a>
+<li><a href="../terminal_interface-curses-aux__ads.htm#ref_91_14" target="main">Fill_String -  terminal_interface-curses-aux.ads:91</a>
+<li><a href="../terminal_interface-curses-aux__ads.htm#ref_96_13" target="main">Fill_String -  terminal_interface-curses-aux.ads:96</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_762_16" target="main">Flash</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1046_14" target="main">Flash_Screen</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_468_16" target="main">Fld_Info</a>
+<li><a href="../terminal_interface-curses-text_io__ads.htm#ref_66_14" target="main">Flush -  terminal_interface-curses-text_io.ads:66</a>
+<li><a href="../terminal_interface-curses-text_io__ads.htm#ref_67_14" target="main">Flush -  terminal_interface-curses-text_io.ads:67</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_2055_16" target="main">Flushinp</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1809_14" target="main">Flush_Input</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_436_14" target="main">Foreground -  terminal_interface-curses-forms.ads:436</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_441_14" target="main">Foreground -  terminal_interface-curses-forms.ads:441</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_430_14" target="main">Foreground -  terminal_interface-curses-menus.ads:430</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_435_14" target="main">Foreground -  terminal_interface-curses-menus.ads:435</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_550_14" target="main">Format</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_780_16" target="main">Form_Opts</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_763_16" target="main">Form_Opts_Off</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_760_16" target="main">Form_Opts_On</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_68_16" target="main">Form_Request_Name -  terminal_interface-curses-forms.adb:68</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_76_16" target="main">Form_Request_Name -  terminal_interface-curses-forms.adb:76</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_554_16" target="main">Form_Sub</a>
+<li><a href="../terminal_interface-curses-forms-form_user_data__adb.htm#ref_69_16" target="main">Form_Userptr</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_529_16" target="main">Form_Win</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_138_14" target="main">Free -  terminal_interface-curses-forms.ads:138</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_179_14" target="main">Free -  terminal_interface-curses-menus.ads:179</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_729_16" target="main">Free -  terminal_interface-curses-forms.adb:729</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_843_16" target="main">Free -  terminal_interface-curses-menus.adb:843</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_113_16" target="main">Freeitem</a>
+<li><a href="../terminal_interface-curses-forms-field_types__ads.htm#ref_173_14" target="main">Free_Arg</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_117_16" target="main">Free_Field</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_879_16" target="main">Frm_Driver</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_952_13" target="main">Function_Key</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_957_13" target="main">Function_Key_Code</a>
+</ul></body></html>
diff --git a/doc/html/ada/funcs/G.htm b/doc/html/ada/funcs/G.htm
new file mode 100644
index 0000000..166fbc1
--- /dev/null
+++ b/doc/html/ada/funcs/G.htm
@@ -0,0 +1,100 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>G</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+<body>
+<h2>Functions - G</h2>
+<a href="../funcs.htm" target="_self">[index]</a>
+<ul compact type="disc">
+<li><a href="../terminal_interface-curses-forms-field_types-user__ads.htm#ref_89_13" target="main">Generic_Char_Check</a>
+<li><a href="../terminal_interface-curses-forms-field_types-user__ads.htm#ref_82_13" target="main">Generic_Field_Check</a>
+<li><a href="../terminal_interface-curses-forms-field_types-user-choice__ads.htm#ref_81_13" target="main">Generic_Next</a>
+<li><a href="../terminal_interface-curses-forms-field_types-user-choice__ads.htm#ref_88_13" target="main">Generic_Prev</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1634_14" target="main">Get -  terminal_interface-curses.ads:1634</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1645_14" target="main">Get -  terminal_interface-curses.ads:1645</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1377_16" target="main">GetBegX</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1374_16" target="main">GetBegY</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1395_16" target="main">GetCurX</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1392_16" target="main">GetCurY</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1359_16" target="main">GetMaxX</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1356_16" target="main">GetMaxY</a>
+<li><a href="../terminal_interface-curses-mouse__adb.htm#ref_65_16" target="main">Getmouse</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1414_16" target="main">GetParX</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1411_16" target="main">GetParY</a>
+<li><a href="../terminal_interface-curses-putwin__adb.htm#ref_66_16" target="main">getwin</a>
+<li><a href="../terminal_interface-curses-forms-field_types__adb.htm#ref_62_13" target="main">Get_Arg</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1296_13" target="main">Get_Background</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_364_14" target="main">Get_Buffer -  terminal_interface-curses-forms.ads:364</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_370_13" target="main">Get_Buffer -  terminal_interface-curses-forms.ads:370</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_997_13" target="main">Get_Character_Attribute -  terminal_interface-curses.ads:997</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1003_13" target="main">Get_Character_Attribute -  terminal_interface-curses.ads:1003</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1415_14" target="main">Get_Cursor_Position</a>
+<li><a href="../terminal_interface-curses-termcap__ads.htm#ref_60_13" target="main">Get_Entry</a>
+<li><a href="../terminal_interface-curses-mouse__ads.htm#ref_130_14" target="main">Get_Event</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_958_16" target="main">Get_Fieldindex</a>
+<li><a href="../terminal_interface-curses-forms-field_types__adb.htm#ref_59_13" target="main">Get_Fieldtype</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_567_13" target="main">Get_Field_Init_Hook</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_572_13" target="main">Get_Field_Term_Hook</a>
+<li><a href="../terminal_interface-curses-termcap__ads.htm#ref_64_13" target="main">Get_Flag -  terminal_interface-curses-termcap.ads:64</a>
+<li><a href="../terminal_interface-curses-terminfo__ads.htm#ref_65_13" target="main">Get_Flag -  terminal_interface-curses-terminfo.ads:65</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_577_13" target="main">Get_Form_Init_Hook</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_582_13" target="main">Get_Form_Term_Hook</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_747_13" target="main">Get_Index -  terminal_interface-curses-forms.ads:747</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_309_13" target="main">Get_Index -  terminal_interface-curses-menus.ads:309</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_298_16" target="main">Get_Itemindex</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_588_13" target="main">Get_Item_Init_Hook</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_593_13" target="main">Get_Item_Term_Hook</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_347_13" target="main">Get_Justification</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1086_13" target="main">Get_KeyPad_Mode</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_922_13" target="main">Get_Keystroke</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_598_13" target="main">Get_Menu_Init_Hook</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_459_16" target="main">Get_Menu_Mark -  terminal_interface-curses-menus.adb:459</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_467_16" target="main">Get_Menu_Mark -  terminal_interface-curses-menus.adb:467</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_603_13" target="main">Get_Menu_Term_Hook</a>
+<li><a href="../terminal_interface-curses-mouse__ads.htm#ref_126_13" target="main">Get_Mouse</a>
+<li><a href="../terminal_interface-curses-termcap__ads.htm#ref_68_14" target="main">Get_Number -  terminal_interface-curses-termcap.ads:68</a>
+<li><a href="../terminal_interface-curses-terminfo__ads.htm#ref_69_13" target="main">Get_Number -  terminal_interface-curses-terminfo.ads:69</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_413_14" target="main">Get_Options -  terminal_interface-curses-forms.ads:413</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_418_13" target="main">Get_Options -  terminal_interface-curses-forms.ads:418</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_660_14" target="main">Get_Options -  terminal_interface-curses-forms.ads:660</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_665_13" target="main">Get_Options -  terminal_interface-curses-forms.ads:665</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_250_14" target="main">Get_Options -  terminal_interface-curses-menus.ads:250</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_255_13" target="main">Get_Options -  terminal_interface-curses-menus.ads:255</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_346_14" target="main">Get_Options -  terminal_interface-curses-menus.ads:346</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_351_13" target="main">Get_Options -  terminal_interface-curses-menus.ads:351</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1423_14" target="main">Get_Origin_Relative_To_Parent</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_944_16" target="main">Get_Page</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_665_16" target="main">Get_Pattern</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1399_14" target="main">Get_Size</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1693_14" target="main">Get_Soft_Label_Key -  terminal_interface-curses.ads:1693</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1698_13" target="main">Get_Soft_Label_Key -  terminal_interface-curses.ads:1698</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1734_13" target="main">Get_Soft_Label_Key_Attributes -  terminal_interface-curses.ads:1734</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1738_13" target="main">Get_Soft_Label_Key_Attributes -  terminal_interface-curses.ads:1738</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_624_16" target="main">Get_Spacing</a>
+<li><a href="../terminal_interface-curses-termcap__ads.htm#ref_74_14" target="main">Get_String -  terminal_interface-curses-termcap.ads:74</a>
+<li><a href="../terminal_interface-curses-termcap__ads.htm#ref_77_13" target="main">Get_String -  terminal_interface-curses-termcap.ads:77</a>
+<li><a href="../terminal_interface-curses-terminfo__ads.htm#ref_58_14" target="main">Get_String -  terminal_interface-curses-terminfo.ads:58</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_524_13" target="main">Get_Sub_Window -  terminal_interface-curses-forms.ads:524</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_377_13" target="main">Get_Sub_Window -  terminal_interface-curses-menus.ads:377</a>
+<li><a href="../terminal_interface-curses-forms-field_types__ads.htm#ref_80_13" target="main">Get_Type</a>
+<li><a href="../terminal_interface-curses-forms-field_user_data__ads.htm#ref_60_14" target="main">Get_User_Data -  terminal_interface-curses-forms-field_user_data.ads:60</a>
+<li><a href="../terminal_interface-curses-forms-field_user_data__ads.htm#ref_65_13" target="main">Get_User_Data -  terminal_interface-curses-forms-field_user_data.ads:65</a>
+<li><a href="../terminal_interface-curses-forms-form_user_data__ads.htm#ref_60_14" target="main">Get_User_Data -  terminal_interface-curses-forms-form_user_data.ads:60</a>
+<li><a href="../terminal_interface-curses-forms-form_user_data__ads.htm#ref_65_13" target="main">Get_User_Data -  terminal_interface-curses-forms-form_user_data.ads:65</a>
+<li><a href="../terminal_interface-curses-menus-item_user_data__ads.htm#ref_65_14" target="main">Get_User_Data -  terminal_interface-curses-menus-item_user_data.ads:65</a>
+<li><a href="../terminal_interface-curses-menus-item_user_data__ads.htm#ref_70_13" target="main">Get_User_Data -  terminal_interface-curses-menus-item_user_data.ads:70</a>
+<li><a href="../terminal_interface-curses-menus-menu_user_data__ads.htm#ref_60_14" target="main">Get_User_Data -  terminal_interface-curses-menus-menu_user_data.ads:60</a>
+<li><a href="../terminal_interface-curses-menus-menu_user_data__ads.htm#ref_65_13" target="main">Get_User_Data -  terminal_interface-curses-menus-menu_user_data.ads:65</a>
+<li><a href="../terminal_interface-curses-panels-user_data__ads.htm#ref_60_14" target="main">Get_User_Data -  terminal_interface-curses-panels-user_data.ads:60</a>
+<li><a href="../terminal_interface-curses-panels-user_data__ads.htm#ref_65_13" target="main">Get_User_Data -  terminal_interface-curses-panels-user_data.ads:65</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_513_13" target="main">Get_Window -  terminal_interface-curses-forms.ads:513</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_366_13" target="main">Get_Window -  terminal_interface-curses-menus.ads:366</a>
+<li><a href="../terminal_interface-curses-panels__ads.htm#ref_102_13" target="main">Get_Window -  terminal_interface-curses-panels.ads:102</a>
+<li><a href="../terminal_interface-curses-putwin__ads.htm#ref_49_13" target="main">Get_Window -  terminal_interface-curses-putwin.ads:49</a>
+<li><a href="../terminal_interface-curses-text_io__ads.htm#ref_63_13" target="main">Get_Window -  terminal_interface-curses-text_io.ads:63</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1407_14" target="main">Get_Window_Position</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_470_14" target="main">Grey -  terminal_interface-curses-menus.ads:470</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_475_14" target="main">Grey -  terminal_interface-curses-menus.ads:475</a>
+</ul></body></html>
diff --git a/doc/html/ada/funcs/H.htm b/doc/html/ada/funcs/H.htm
new file mode 100644
index 0000000..c877937
--- /dev/null
+++ b/doc/html/ada/funcs/H.htm
@@ -0,0 +1,26 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>H</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+<body>
+<h2>Functions - H</h2>
+<a href="../funcs.htm" target="_self">[index]</a>
+<ul compact type="disc">
+<li><a href="../terminal_interface-curses__adb.htm#ref_860_16" target="main">Halfdelay</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1094_14" target="main">Half_Delay</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_2199_16" target="main">Hascolors</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_550_16" target="main">Haskey</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1897_13" target="main">Has_Colors</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_2089_16" target="main">Has_Ic</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_2101_16" target="main">Has_Il</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1833_13" target="main">Has_Insert_Character</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1838_13" target="main">Has_Insert_Line</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_938_13" target="main">Has_Key</a>
+<li><a href="../terminal_interface-curses-mouse__ads.htm#ref_91_13" target="main">Has_Mouse</a>
+<li><a href="../terminal_interface-curses-terminfo__ads.htm#ref_61_13" target="main">Has_String</a>
+<li><a href="../terminal_interface-curses-panels__ads.htm#ref_97_14" target="main">Hide</a>
+<li><a href="../terminal_interface-curses-panels__adb.htm#ref_96_16" target="main">Hidepanel</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_899_14" target="main">Horizontal_Line</a>
+</ul></body></html>
diff --git a/doc/html/ada/funcs/I.htm b/doc/html/ada/funcs/I.htm
new file mode 100644
index 0000000..97c5e52
--- /dev/null
+++ b/doc/html/ada/funcs/I.htm
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>I</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+<body>
+<h2>Functions - I</h2>
+<a href="../funcs.htm" target="_self">[index]</a>
+<ul compact type="disc">
+<li><a href="../terminal_interface-curses__adb.htm#ref_994_17" target="main">IDC_Ok</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_982_16" target="main">IDL_Ok</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1180_14" target="main">Immediate_Update_Mode</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1016_17" target="main">Immedok</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_484_14" target="main">Info</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_2214_16" target="main">Initcolor</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_2157_16" target="main">Initpair</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_100_16" target="main">Initscr</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1902_14" target="main">Init_Color</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1883_14" target="main">Init_Pair</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_657_14" target="main">Init_Screen</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1670_14" target="main">Init_Soft_Label_Keys</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_660_14" target="main">Init_Windows</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1542_14" target="main">Insert -  terminal_interface-curses.ads:1542</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1548_14" target="main">Insert -  terminal_interface-curses.ads:1548</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1560_14" target="main">Insert -  terminal_interface-curses.ads:1560</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1569_14" target="main">Insert -  terminal_interface-curses.ads:1569</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1375_14" target="main">Insert_Delete_Lines</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1389_14" target="main">Insert_Line</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_872_16" target="main">Intrflush</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_123_16" target="main">Isendwin</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_673_13" target="main">Is_End_Window</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_945_13" target="main">Is_Function_Key</a>
+<li><a href="../terminal_interface-curses-panels__ads.htm#ref_124_13" target="main">Is_Hidden</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_852_16" target="main">Is_Keypad</a>
+<li><a href="../terminal_interface-curses-terminfo__adb.htm#ref_51_13" target="main">Is_MinusOne_Pointer</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_990_16" target="main">Is_New</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_765_13" target="main">Is_New_Page</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1037_16" target="main">Is_Scroll_Ok</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1331_13" target="main">Is_Touched -  terminal_interface-curses.ads:1331</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1336_13" target="main">Is_Touched -  terminal_interface-curses.ads:1336</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_110_16" target="main">Itemname -  terminal_interface-curses-menus.adb:110</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_217_16" target="main">Itemname -  terminal_interface-curses-menus.adb:217</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_225_16" target="main">Itemname -  terminal_interface-curses-menus.adb:225</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_622_13" target="main">Items</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_628_13" target="main">Item_Count</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_749_16" target="main">Item_Init</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_199_16" target="main">Item_Opts</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_184_16" target="main">Item_Opts_Off</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_181_16" target="main">Item_Opts_On</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_757_16" target="main">Item_Term</a>
+<li><a href="../terminal_interface-curses-menus-item_user_data__adb.htm#ref_59_16" target="main">Item_Userptr</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_143_16" target="main">Item_Val</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_156_16" target="main">Item_Vis</a>
+</ul></body></html>
diff --git a/doc/html/ada/funcs/K.htm b/doc/html/ada/funcs/K.htm
new file mode 100644
index 0000000..47e6835
--- /dev/null
+++ b/doc/html/ada/funcs/K.htm
@@ -0,0 +1,18 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>K</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+<body>
+<h2>Functions - K</h2>
+<a href="../funcs.htm" target="_self">[index]</a>
+<ul compact type="disc">
+<li><a href="../terminal_interface-curses__adb.htm#ref_64_16" target="main">Keyname</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1999_16" target="main">Keyok</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_841_16" target="main">Keypad</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1781_14" target="main">Key_Name -  terminal_interface-curses.ads:1781</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1787_13" target="main">Key_Name -  terminal_interface-curses.ads:1787</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_2081_16" target="main">Killchar</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1828_13" target="main">Kill_Character</a>
+</ul></body></html>
diff --git a/doc/html/ada/funcs/L.htm b/doc/html/ada/funcs/L.htm
new file mode 100644
index 0000000..b5929e6
--- /dev/null
+++ b/doc/html/ada/funcs/L.htm
@@ -0,0 +1,25 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>L</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+<body>
+<h2>Functions - L</h2>
+<a href="../funcs.htm" target="_self">[index]</a>
+<ul compact type="disc">
+<li><a href="../terminal_interface-curses__ads.htm#ref_1173_14" target="main">Leave_Cursor_After_Update</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1004_16" target="main">Leave_Ok</a>
+<li><a href="../terminal_interface-curses-text_io__ads.htm#ref_102_13" target="main">Line -  terminal_interface-curses-text_io.ads:102</a>
+<li><a href="../terminal_interface-curses-text_io__ads.htm#ref_103_13" target="main">Line -  terminal_interface-curses-text_io.ads:103</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_551_13" target="main">Lines</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_2357_16" target="main">LINES_As_Function</a>
+<li><a href="../terminal_interface-curses-text_io__ads.htm#ref_78_13" target="main">Line_Length -  terminal_interface-curses-text_io.ads:78</a>
+<li><a href="../terminal_interface-curses-text_io__ads.htm#ref_79_13" target="main">Line_Length -  terminal_interface-curses-text_io.ads:79</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_330_13" target="main">Link</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_152_16" target="main">Lnk_Field</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_2123_16" target="main">Longname -  terminal_interface-curses.adb:2123</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_2131_16" target="main">Longname -  terminal_interface-curses.adb:2131</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1848_14" target="main">Long_Name -  terminal_interface-curses.ads:1848</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1852_13" target="main">Long_Name -  terminal_interface-curses.ads:1852</a>
+</ul></body></html>
diff --git a/doc/html/ada/funcs/M.htm b/doc/html/ada/funcs/M.htm
new file mode 100644
index 0000000..00d1011
--- /dev/null
+++ b/doc/html/ada/funcs/M.htm
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>M</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+<body>
+<h2>Functions - M</h2>
+<a href="../funcs.htm" target="_self">[index]</a>
+<ul compact type="disc">
+<li><a href="../terminal_interface-curses-forms-field_types__ads.htm#ref_163_13" target="main">Make_Arg</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_408_14" target="main">Mark -  terminal_interface-curses-menus.ads:408</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_412_14" target="main">Mark -  terminal_interface-curses-menus.ads:412</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_529_16" target="main">Menu_Back -  terminal_interface-curses-menus.adb:529</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_539_16" target="main">Menu_Back -  terminal_interface-curses-menus.adb:539</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_692_16" target="main">Menu_Fmt</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_493_16" target="main">Menu_Fore -  terminal_interface-curses-menus.adb:493</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_503_16" target="main">Menu_Fore -  terminal_interface-curses-menus.adb:503</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_565_16" target="main">Menu_Grey -  terminal_interface-curses-menus.adb:565</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_575_16" target="main">Menu_Grey -  terminal_interface-curses-menus.adb:575</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_765_16" target="main">Menu_Init</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_358_16" target="main">Menu_Opts</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_343_16" target="main">Menu_Opts_Off</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_340_16" target="main">Menu_Opts_On</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_596_16" target="main">Menu_Pad</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_407_16" target="main">Menu_Sub</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_773_16" target="main">Menu_Term</a>
+<li><a href="../terminal_interface-curses-menus-menu_user_data__adb.htm#ref_60_16" target="main">Menu_Userptr</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_386_16" target="main">Menu_Win</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_830_16" target="main">Meta</a>
+<li><a href="../terminal_interface-curses-mouse__adb.htm#ref_109_16" target="main">MMask</a>
+<li><a href="../terminal_interface-curses-mouse__adb.htm#ref_212_16" target="main">Mouseinterval</a>
+<li><a href="../terminal_interface-curses-mouse__adb.htm#ref_51_16" target="main">Mouse_Avail</a>
+<li><a href="../terminal_interface-curses-mouse__ads.htm#ref_154_13" target="main">Mouse_Interval</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_614_14" target="main">Move -  terminal_interface-curses-forms.ads:614</a>
+<li><a href="../terminal_interface-curses-panels__ads.htm#ref_117_14" target="main">Move -  terminal_interface-curses-panels.ads:117</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_693_16" target="main">Move -  terminal_interface-curses-forms.adb:693</a>
+<li><a href="../terminal_interface-curses-panels__adb.htm#ref_133_16" target="main">Move -  terminal_interface-curses-panels.adb:133</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_682_14" target="main">Move_Cursor</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_797_14" target="main">Move_Derived_Window</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_790_14" target="main">Move_Window</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_351_16" target="main">Mvderwin</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_176_16" target="main">mvwaddch</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1589_16" target="main">Mvwdelch</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_337_16" target="main">Mvwin</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1613_16" target="main">Mvwinch</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1638_16" target="main">Mvwinsch</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1678_16" target="main">Mvwinsnstr</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_806_16" target="main">M_Post -  terminal_interface-curses-forms.adb:806</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_312_16" target="main">M_Post -  terminal_interface-curses-menus.adb:312</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_569_16" target="main">M_Scale -  terminal_interface-curses-forms.adb:569</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_420_16" target="main">M_Scale -  terminal_interface-curses-menus.adb:420</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_808_16" target="main">M_Unpost -  terminal_interface-curses-forms.adb:808</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_314_16" target="main">M_Unpost -  terminal_interface-curses-menus.adb:314</a>
+</ul></body></html>
diff --git a/doc/html/ada/funcs/N.htm b/doc/html/ada/funcs/N.htm
new file mode 100644
index 0000000..cf13006
--- /dev/null
+++ b/doc/html/ada/funcs/N.htm
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>N</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+<body>
+<h2>Functions - N</h2>
+<a href="../funcs.htm" target="_self">[index]</a>
+<ul compact type="disc">
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_264_14" target="main">Name -  terminal_interface-curses-menus.ads:264</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_267_14" target="main">Name -  terminal_interface-curses-menus.ads:267</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_2347_16" target="main">Napms</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1977_14" target="main">Nap_Milli_Seconds</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_100_16" target="main">Newfield</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_708_16" target="main">NewForm</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_80_16" target="main">Newitem</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_824_16" target="main">Newmenu</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1434_16" target="main">Newpad</a>
+<li><a href="../terminal_interface-curses-panels__adb.htm#ref_52_16" target="main">Newpanel</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_235_16" target="main">Newwin</a>
+<li><a href="../terminal_interface-curses-forms-field_types__ads.htm#ref_223_13" target="main">New_Fieldtype</a>
+<li><a href="../terminal_interface-curses-text_io__ads.htm#ref_87_14" target="main">New_Line -  terminal_interface-curses-text_io.ads:87</a>
+<li><a href="../terminal_interface-curses-text_io__ads.htm#ref_88_14" target="main">New_Line -  terminal_interface-curses-text_io.ads:88</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1438_13" target="main">New_Pad</a>
+<li><a href="../terminal_interface-curses-text_io__ads.htm#ref_90_14" target="main">New_Page -  terminal_interface-curses-text_io.ads:90</a>
+<li><a href="../terminal_interface-curses-text_io__ads.htm#ref_91_14" target="main">New_Page -  terminal_interface-curses-text_io.ads:91</a>
+<li><a href="../terminal_interface-curses-forms-field_types__ads.htm#ref_194_13" target="main">Next_Router</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_949_16" target="main">NL</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_774_16" target="main">NoCbreak</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_903_16" target="main">Nodelay</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_812_16" target="main">NoEcho</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_951_16" target="main">NoNL</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_793_16" target="main">NoRaw</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_936_16" target="main">Notimeout</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_886_17" target="main">No_Qiflush</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_560_13" target="main">Number_Of_Colors</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_563_13" target="main">Number_Of_Color_Pairs</a>
+</ul></body></html>
diff --git a/doc/html/ada/funcs/O.htm b/doc/html/ada/funcs/O.htm
new file mode 100644
index 0000000..6ade14a
--- /dev/null
+++ b/doc/html/ada/funcs/O.htm
@@ -0,0 +1,16 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>O</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+<body>
+<h2>Functions - O</h2>
+<a href="../funcs.htm" target="_self">[index]</a>
+<ul compact type="disc">
+<li><a href="../terminal_interface-curses-text_io-aux__adb.htm#ref_60_17" target="main">Output</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1365_14" target="main">Overlay -  terminal_interface-curses.ads:1365</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1317_16" target="main">Overlay -  terminal_interface-curses.adb:1317</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1359_14" target="main">Overwrite -  terminal_interface-curses.ads:1359</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1305_16" target="main">Overwrite -  terminal_interface-curses.adb:1305</a>
+</ul></body></html>
diff --git a/doc/html/ada/funcs/P.htm b/doc/html/ada/funcs/P.htm
new file mode 100644
index 0000000..d52c66d
--- /dev/null
+++ b/doc/html/ada/funcs/P.htm
@@ -0,0 +1,63 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>P</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+<body>
+<h2>Functions - P</h2>
+<a href="../funcs.htm" target="_self">[index]</a>
+<ul compact type="disc">
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_474_14" target="main">Pad_Character -  terminal_interface-curses-forms.ads:474</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_489_14" target="main">Pad_Character -  terminal_interface-curses-menus.ads:489</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_742_13" target="main">Page</a>
+<li><a href="../terminal_interface-curses-text_io__ads.htm#ref_81_13" target="main">Page_Length -  terminal_interface-curses-text_io.ads:81</a>
+<li><a href="../terminal_interface-curses-text_io__ads.htm#ref_82_13" target="main">Page_Length -  terminal_interface-curses-text_io.ads:82</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_2182_16" target="main">Paircontent</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1890_14" target="main">Pair_Content</a>
+<li><a href="../terminal_interface-curses-panels__adb.htm#ref_145_16" target="main">Panel_Hidden</a>
+<li><a href="../terminal_interface-curses-panels-user_data__adb.htm#ref_66_16" target="main">Panel_Userptr</a>
+<li><a href="../terminal_interface-curses-panels__adb.htm#ref_106_16" target="main">Panel_Win</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_526_14" target="main">Pattern</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1540_16" target="main">Pechochar</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1523_13" target="main">Peek -  terminal_interface-curses.ads:1523</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1529_13" target="main">Peek -  terminal_interface-curses.ads:1529</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1585_14" target="main">Peek -  terminal_interface-curses.ads:1585</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1594_14" target="main">Peek -  terminal_interface-curses.ads:1594</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1609_14" target="main">Peek -  terminal_interface-curses.ads:1609</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1618_14" target="main">Peek -  terminal_interface-curses.ads:1618</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1514_16" target="main">Pnoutrefresh</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_685_14" target="main">Position_Cursor -  terminal_interface-curses-forms.ads:685</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_393_14" target="main">Position_Cursor -  terminal_interface-curses-menus.ads:393</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_674_14" target="main">Post -  terminal_interface-curses-forms.ads:674</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_321_14" target="main">Post -  terminal_interface-curses-menus.ads:321</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_827_16" target="main">Pos_Form_Cursor</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_433_16" target="main">Pos_Menu_Cursor</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1483_16" target="main">Prefresh</a>
+<li><a href="../terminal_interface-curses-forms-field_types__ads.htm#ref_202_13" target="main">Prev_Router</a>
+<li><a href="../terminal_interface-curses-text_io-complex_io__ads.htm#ref_55_14" target="main">Put -  terminal_interface-curses-text_io-complex_io.ads:55</a>
+<li><a href="../terminal_interface-curses-text_io-complex_io__ads.htm#ref_62_14" target="main">Put -  terminal_interface-curses-text_io-complex_io.ads:62</a>
+<li><a href="../terminal_interface-curses-text_io-decimal_io__ads.htm#ref_51_14" target="main">Put -  terminal_interface-curses-text_io-decimal_io.ads:51</a>
+<li><a href="../terminal_interface-curses-text_io-decimal_io__ads.htm#ref_58_14" target="main">Put -  terminal_interface-curses-text_io-decimal_io.ads:58</a>
+<li><a href="../terminal_interface-curses-text_io-enumeration_io__ads.htm#ref_50_14" target="main">Put -  terminal_interface-curses-text_io-enumeration_io.ads:50</a>
+<li><a href="../terminal_interface-curses-text_io-enumeration_io__ads.htm#ref_56_14" target="main">Put -  terminal_interface-curses-text_io-enumeration_io.ads:56</a>
+<li><a href="../terminal_interface-curses-text_io-fixed_io__ads.htm#ref_51_14" target="main">Put -  terminal_interface-curses-text_io-fixed_io.ads:51</a>
+<li><a href="../terminal_interface-curses-text_io-fixed_io__ads.htm#ref_58_14" target="main">Put -  terminal_interface-curses-text_io-fixed_io.ads:58</a>
+<li><a href="../terminal_interface-curses-text_io-float_io__ads.htm#ref_51_14" target="main">Put -  terminal_interface-curses-text_io-float_io.ads:51</a>
+<li><a href="../terminal_interface-curses-text_io-float_io__ads.htm#ref_58_14" target="main">Put -  terminal_interface-curses-text_io-float_io.ads:58</a>
+<li><a href="../terminal_interface-curses-text_io-integer_io__ads.htm#ref_50_14" target="main">Put -  terminal_interface-curses-text_io-integer_io.ads:50</a>
+<li><a href="../terminal_interface-curses-text_io-integer_io__ads.htm#ref_56_14" target="main">Put -  terminal_interface-curses-text_io-integer_io.ads:56</a>
+<li><a href="../terminal_interface-curses-text_io-modular_io__ads.htm#ref_50_14" target="main">Put -  terminal_interface-curses-text_io-modular_io.ads:50</a>
+<li><a href="../terminal_interface-curses-text_io-modular_io__ads.htm#ref_56_14" target="main">Put -  terminal_interface-curses-text_io-modular_io.ads:56</a>
+<li><a href="../terminal_interface-curses-text_io__ads.htm#ref_109_14" target="main">Put -  terminal_interface-curses-text_io.ads:109</a>
+<li><a href="../terminal_interface-curses-text_io__ads.htm#ref_110_14" target="main">Put -  terminal_interface-curses-text_io.ads:110</a>
+<li><a href="../terminal_interface-curses-text_io__ads.htm#ref_116_14" target="main">Put -  terminal_interface-curses-text_io.ads:116</a>
+<li><a href="../terminal_interface-curses-text_io__ads.htm#ref_117_14" target="main">Put -  terminal_interface-curses-text_io.ads:117</a>
+<li><a href="../terminal_interface-curses-terminfo__adb.htm#ref_144_16" target="main">putp</a>
+<li><a href="../terminal_interface-curses-putwin__adb.htm#ref_54_16" target="main">putwin</a>
+<li><a href="../terminal_interface-curses-text_io-aux__ads.htm#ref_49_14" target="main">Put_Buf</a>
+<li><a href="../terminal_interface-curses-text_io__ads.htm#ref_119_14" target="main">Put_Line -  terminal_interface-curses-text_io.ads:119</a>
+<li><a href="../terminal_interface-curses-text_io__ads.htm#ref_123_14" target="main">Put_Line -  terminal_interface-curses-text_io.ads:123</a>
+<li><a href="../terminal_interface-curses-terminfo__ads.htm#ref_77_14" target="main">Put_String</a>
+<li><a href="../terminal_interface-curses-putwin__ads.htm#ref_46_14" target="main">Put_Window</a>
+</ul></body></html>
diff --git a/doc/html/ada/funcs/Q.htm b/doc/html/ada/funcs/Q.htm
new file mode 100644
index 0000000..bcfee70
--- /dev/null
+++ b/doc/html/ada/funcs/Q.htm
@@ -0,0 +1,12 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>Q</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+<body>
+<h2>Functions - Q</h2>
+<a href="../funcs.htm" target="_self">[index]</a>
+<ul compact type="disc">
+<li><a href="../terminal_interface-curses__adb.htm#ref_884_17" target="main">Qiflush</a>
+</ul></body></html>
diff --git a/doc/html/ada/funcs/R.htm b/doc/html/ada/funcs/R.htm
new file mode 100644
index 0000000..b4af87e
--- /dev/null
+++ b/doc/html/ada/funcs/R.htm
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>R</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+<body>
+<h2>Functions - R</h2>
+<a href="../funcs.htm" target="_self">[index]</a>
+<ul compact type="disc">
+<li><a href="../terminal_interface-curses__adb.htm#ref_791_16" target="main">Raw</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_591_14" target="main">Redefine -  terminal_interface-curses-forms.ads:591</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_612_14" target="main">Redefine -  terminal_interface-curses-menus.ads:612</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1230_14" target="main">Redraw -  terminal_interface-curses.ads:1230</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1234_14" target="main">Redraw -  terminal_interface-curses.ads:1234</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1093_16" target="main">Redrawwin</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1216_14" target="main">Refresh -  terminal_interface-curses.ads:1216</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1454_14" target="main">Refresh -  terminal_interface-curses.ads:1454</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1683_14" target="main">Refresh_Soft_Label_Keys</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1688_14" target="main">Refresh_Soft_Label_Keys_Without_Update</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1223_14" target="main">Refresh_Without_Update -  terminal_interface-curses.ads:1223</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1466_14" target="main">Refresh_Without_Update -  terminal_interface-curses.ads:1466</a>
+<li><a href="../terminal_interface-curses-mouse__ads.htm#ref_94_14" target="main">Register_Reportable_Event</a>
+<li><a href="../terminal_interface-curses-mouse__ads.htm#ref_103_14" target="main">Register_Reportable_Events</a>
+<li><a href="../terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_78_14" target="main">Release</a>
+<li><a href="../terminal_interface-curses-panels__ads.htm#ref_111_14" target="main">Replace</a>
+<li><a href="../terminal_interface-curses-panels__adb.htm#ref_120_16" target="main">Replace_Pan</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_278_14" target="main">Request_Name -  terminal_interface-curses-forms.ads:278</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_281_14" target="main">Request_Name -  terminal_interface-curses-forms.ads:281</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_102_14" target="main">Request_Name -  terminal_interface-curses-menus.ads:102</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_105_14" target="main">Request_Name -  terminal_interface-curses-menus.ads:105</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_62_16" target="main">Request_Name -  terminal_interface-curses-menus.adb:62</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_70_16" target="main">Request_Name -  terminal_interface-curses-menus.adb:70</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_2312_16" target="main">Resetty</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1936_14" target="main">Reset_Curses_Mode</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_2284_16" target="main">Reset_Prog_Mode</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_2286_16" target="main">Reset_Shell_Mode</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1947_14" target="main">Reset_Terminal_State</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_2084_14" target="main">Resize</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1709_14" target="main">Restore_Soft_Label_Keys</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_2323_16" target="main">Ripoffline</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1960_14" target="main">Rip_Off_Lines</a>
+</ul></body></html>
diff --git a/doc/html/ada/funcs/S.htm b/doc/html/ada/funcs/S.htm
new file mode 100644
index 0000000..86dad7f
--- /dev/null
+++ b/doc/html/ada/funcs/S.htm
@@ -0,0 +1,195 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>S</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+<body>
+<h2>Functions - S</h2>
+<a href="../funcs.htm" target="_self">[index]</a>
+<ul compact type="disc">
+<li><a href="../terminal_interface-curses__adb.htm#ref_2302_16" target="main">Savetty</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1930_14" target="main">Save_Curses_Mode</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1942_14" target="main">Save_Terminal_State</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_529_14" target="main">Scale -  terminal_interface-curses-forms.ads:529</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_382_14" target="main">Scale -  terminal_interface-curses-menus.ads:382</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_2040_14" target="main">Screen_Dump_To_File</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_2048_14" target="main">Screen_Init_From_File</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_2044_14" target="main">Screen_Restore_From_File</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_2052_14" target="main">Screen_Set_File</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1493_14" target="main">Scroll</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1193_13" target="main">Scrolling_Allowed</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1026_16" target="main">Scrollok</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_2490_16" target="main">scr_dump</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_2516_16" target="main">scr_init</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_2503_16" target="main">scr_restore</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_2529_16" target="main">scr_set</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_448_14" target="main">Set_Background -  terminal_interface-curses-forms.ads:448</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_442_14" target="main">Set_Background -  terminal_interface-curses-menus.ads:442</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1279_14" target="main">Set_Background -  terminal_interface-curses.ads:1279</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_356_14" target="main">Set_Buffer</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1057_14" target="main">Set_Cbreak_Mode</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_988_14" target="main">Set_Character_Attributes</a>
+<li><a href="../terminal_interface-curses-text_io__ads.htm#ref_93_14" target="main">Set_Col -  terminal_interface-curses-text_io.ads:93</a>
+<li><a href="../terminal_interface-curses-text_io__ads.htm#ref_94_14" target="main">Set_Col -  terminal_interface-curses-text_io.ads:94</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1009_14" target="main">Set_Color</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_725_14" target="main">Set_Current -  terminal_interface-curses-forms.ads:725</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_287_14" target="main">Set_Current -  terminal_interface-curses-menus.ads:287</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_906_16" target="main">Set_Current_Fld</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_251_16" target="main">Set_Curr_Item</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1972_14" target="main">Set_Cursor_Visibility</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1069_14" target="main">Set_Echo_Mode</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1135_14" target="main">Set_Escape_Timer_Mode</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_597_14" target="main">Set_Fields</a>
+<li><a href="../terminal_interface-curses-forms-field_types__ads.htm#ref_228_13" target="main">Set_Fieldtype_Arg</a>
+<li><a href="../terminal_interface-curses-forms-field_types__ads.htm#ref_235_13" target="main">Set_Fieldtype_Choice</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_396_16" target="main">Set_Field_Back</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_357_16" target="main">Set_Field_Fore</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_588_16" target="main">Set_Field_Init</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_543_14" target="main">Set_Field_Init_Hook</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_176_16" target="main">Set_Field_Just</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_277_16" target="main">Set_Field_Max</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_294_16" target="main">Set_Field_Opts</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_433_16" target="main">Set_Field_Pad</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_601_16" target="main">Set_Field_Term</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_549_14" target="main">Set_Field_Term_Hook</a>
+<li><a href="../terminal_interface-curses-forms-field_types-alpha__ads.htm#ref_50_14" target="main">Set_Field_Type -  terminal_interface-curses-forms-field_types-alpha.ads:50</a>
+<li><a href="../terminal_interface-curses-forms-field_types-alphanumeric__ads.htm#ref_51_14" target="main">Set_Field_Type -  terminal_interface-curses-forms-field_types-alphanumeric.ads:51</a>
+<li><a href="../terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_85_14" target="main">Set_Field_Type -  terminal_interface-curses-forms-field_types-enumeration.ads:85</a>
+<li><a href="../terminal_interface-curses-forms-field_types-intfield__ads.htm#ref_52_14" target="main">Set_Field_Type -  terminal_interface-curses-forms-field_types-intfield.ads:52</a>
+<li><a href="../terminal_interface-curses-forms-field_types-ipv4_address__ads.htm#ref_48_14" target="main">Set_Field_Type -  terminal_interface-curses-forms-field_types-ipv4_address.ads:48</a>
+<li><a href="../terminal_interface-curses-forms-field_types-numeric__ads.htm#ref_52_14" target="main">Set_Field_Type -  terminal_interface-curses-forms-field_types-numeric.ads:52</a>
+<li><a href="../terminal_interface-curses-forms-field_types-regexp__ads.htm#ref_52_14" target="main">Set_Field_Type -  terminal_interface-curses-forms-field_types-regexp.ads:52</a>
+<li><a href="../terminal_interface-curses-forms-field_types-user__ads.htm#ref_71_14" target="main">Set_Field_Type -  terminal_interface-curses-forms-field_types-user.ads:71</a>
+<li><a href="../terminal_interface-curses-forms-field_user_data__adb.htm#ref_56_16" target="main">Set_Field_Userptr</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_206_16" target="main">Set_Fld_Buffer</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_246_16" target="main">Set_Fld_Status</a>
+<li><a href="../terminal_interface-curses-forms-field_types-alpha__adb.htm#ref_50_16" target="main">Set_Fld_Type -  terminal_interface-curses-forms-field_types-alpha.adb:50</a>
+<li><a href="../terminal_interface-curses-forms-field_types-alphanumeric__adb.htm#ref_50_16" target="main">Set_Fld_Type -  terminal_interface-curses-forms-field_types-alphanumeric.adb:50</a>
+<li><a href="../terminal_interface-curses-forms-field_types-enumeration__adb.htm#ref_95_16" target="main">Set_Fld_Type -  terminal_interface-curses-forms-field_types-enumeration.adb:95</a>
+<li><a href="../terminal_interface-curses-forms-field_types-intfield__adb.htm#ref_50_16" target="main">Set_Fld_Type -  terminal_interface-curses-forms-field_types-intfield.adb:50</a>
+<li><a href="../terminal_interface-curses-forms-field_types-ipv4_address__adb.htm#ref_50_16" target="main">Set_Fld_Type -  terminal_interface-curses-forms-field_types-ipv4_address.adb:50</a>
+<li><a href="../terminal_interface-curses-forms-field_types-numeric__adb.htm#ref_53_16" target="main">Set_Fld_Type -  terminal_interface-curses-forms-field_types-numeric.adb:53</a>
+<li><a href="../terminal_interface-curses-forms-field_types-user__adb.htm#ref_54_16" target="main">Set_Fld_Type -  terminal_interface-curses-forms-field_types-user.adb:54</a>
+<li><a href="../terminal_interface-curses-forms-field_types__adb.htm#ref_135_16" target="main">Set_Fld_Type -  terminal_interface-curses-forms-field_types.adb:135</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1099_14" target="main">Set_Flush_On_Interrupt_Mode</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_428_14" target="main">Set_Foreground -  terminal_interface-curses-forms.ads:428</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_422_14" target="main">Set_Foreground -  terminal_interface-curses-menus.ads:422</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_536_14" target="main">Set_Format</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_614_16" target="main">Set_Form_Init</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_555_14" target="main">Set_Form_Init_Hook</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_746_16" target="main">Set_Form_Opts</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_542_16" target="main">Set_Form_Sub</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_627_16" target="main">Set_Form_Term</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_561_14" target="main">Set_Form_Term_Hook</a>
+<li><a href="../terminal_interface-curses-forms-form_user_data__adb.htm#ref_57_16" target="main">Set_Form_Userptr</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_517_16" target="main">Set_Form_Win</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_644_16" target="main">Set_Frm_Fields</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_933_16" target="main">Set_Frm_Page</a>
+<li><a href="../terminal_interface-curses-forms-field_types-regexp__adb.htm#ref_50_16" target="main">Set_Ftyp</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_462_14" target="main">Set_Grey</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_617_14" target="main">Set_Items -  terminal_interface-curses-menus.ads:617</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_782_16" target="main">Set_Items -  terminal_interface-curses-menus.adb:782</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_706_16" target="main">Set_Item_Init</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_564_14" target="main">Set_Item_Init_Hook</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_169_16" target="main">Set_Item_Opts</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_717_16" target="main">Set_Item_Term</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_570_14" target="main">Set_Item_Term_Hook</a>
+<li><a href="../terminal_interface-curses-menus-item_user_data__adb.htm#ref_49_16" target="main">Set_Item_Userptr</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_133_16" target="main">Set_Item_Val</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_341_14" target="main">Set_Justification</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1081_14" target="main">Set_KeyPad_Mode</a>
+<li><a href="../terminal_interface-curses-text_io__ads.htm#ref_96_14" target="main">Set_Line -  terminal_interface-curses-text_io.ads:96</a>
+<li><a href="../terminal_interface-curses-text_io__ads.htm#ref_97_14" target="main">Set_Line -  terminal_interface-curses-text_io.ads:97</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_402_14" target="main">Set_Mark -  terminal_interface-curses-menus.ads:402</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_445_16" target="main">Set_Mark -  terminal_interface-curses-menus.adb:445</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_389_14" target="main">Set_Maximum_Size</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_515_16" target="main">Set_Menu_Back</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_675_16" target="main">Set_Menu_Fmt</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_479_16" target="main">Set_Menu_Fore</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_550_16" target="main">Set_Menu_Grey</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_728_16" target="main">Set_Menu_Init</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_576_14" target="main">Set_Menu_Init_Hook</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_328_16" target="main">Set_Menu_Opts</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_585_16" target="main">Set_Menu_Pad</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_397_16" target="main">Set_Menu_Sub</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_739_16" target="main">Set_Menu_Term</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_582_14" target="main">Set_Menu_Term_Hook</a>
+<li><a href="../terminal_interface-curses-menus-menu_user_data__adb.htm#ref_49_16" target="main">Set_Menu_Userptr</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_376_16" target="main">Set_Menu_Win</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1075_14" target="main">Set_Meta_Mode</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_759_14" target="main">Set_New_Page</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1146_14" target="main">Set_NL_Mode</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1114_14" target="main">Set_NoDelay_Mode</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_399_14" target="main">Set_Options -  terminal_interface-curses-forms.ads:399</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_646_14" target="main">Set_Options -  terminal_interface-curses-forms.ads:646</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_235_14" target="main">Set_Options -  terminal_interface-curses-menus.ads:235</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_332_14" target="main">Set_Options -  terminal_interface-curses-menus.ads:332</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_468_14" target="main">Set_Pad_Character -  terminal_interface-curses-forms.ads:468</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_483_14" target="main">Set_Pad_Character -  terminal_interface-curses-menus.ads:483</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_736_14" target="main">Set_Page -  terminal_interface-curses-forms.ads:736</a>
+<li><a href="../terminal_interface-curses-forms__adb.htm#ref_979_16" target="main">Set_Page -  terminal_interface-curses-forms.adb:979</a>
+<li><a href="../terminal_interface-curses-panels-user_data__adb.htm#ref_55_16" target="main">Set_Panel_Userptr</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_519_13" target="main">Set_Pattern -  terminal_interface-curses-menus.ads:519</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_643_16" target="main">Set_Pattern -  terminal_interface-curses-menus.adb:643</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1106_14" target="main">Set_Queue_Interrupt_Mode</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1063_14" target="main">Set_Raw_Mode</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1198_14" target="main">Set_Scroll_Region</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1676_14" target="main">Set_Soft_Label_Key</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1727_14" target="main">Set_Soft_Label_Key_Attributes</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1743_14" target="main">Set_Soft_Label_Key_Color</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_499_14" target="main">Set_Spacing -  terminal_interface-curses-menus.ads:499</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_607_16" target="main">Set_Spacing -  terminal_interface-curses-menus.adb:607</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_378_14" target="main">Set_Status</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_518_14" target="main">Set_Sub_Window -  terminal_interface-curses-forms.ads:518</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_371_14" target="main">Set_Sub_Window -  terminal_interface-curses-menus.ads:371</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_814_14" target="main">Set_Synch_Mode</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1123_14" target="main">Set_Timeout_Mode</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_275_16" target="main">Set_Toprow</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_298_14" target="main">Set_Top_Row</a>
+<li><a href="../terminal_interface-curses-forms-field_user_data__ads.htm#ref_54_14" target="main">Set_User_Data -  terminal_interface-curses-forms-field_user_data.ads:54</a>
+<li><a href="../terminal_interface-curses-forms-form_user_data__ads.htm#ref_54_14" target="main">Set_User_Data -  terminal_interface-curses-forms-form_user_data.ads:54</a>
+<li><a href="../terminal_interface-curses-menus-item_user_data__ads.htm#ref_59_14" target="main">Set_User_Data -  terminal_interface-curses-menus-item_user_data.ads:59</a>
+<li><a href="../terminal_interface-curses-menus-menu_user_data__ads.htm#ref_54_14" target="main">Set_User_Data -  terminal_interface-curses-menus-menu_user_data.ads:54</a>
+<li><a href="../terminal_interface-curses-panels-user_data__ads.htm#ref_54_14" target="main">Set_User_Data -  terminal_interface-curses-panels-user_data.ads:54</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_211_14" target="main">Set_Value</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_507_14" target="main">Set_Window -  terminal_interface-curses-forms.ads:507</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_360_14" target="main">Set_Window -  terminal_interface-curses-menus.ads:360</a>
+<li><a href="../terminal_interface-curses-text_io__ads.htm#ref_60_14" target="main">Set_Window -  terminal_interface-curses-text_io.ads:60</a>
+<li><a href="../terminal_interface-curses-panels__ads.htm#ref_87_14" target="main">Show</a>
+<li><a href="../terminal_interface-curses-panels__adb.htm#ref_86_16" target="main">Showpanel</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1967_16" target="main">Slk_Attr -  terminal_interface-curses.adb:1967</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1977_16" target="main">Slk_Attr -  terminal_interface-curses.adb:1977</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1931_16" target="main">Slk_Attroff</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1929_16" target="main">Slk_Attron</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1953_16" target="main">Slk_Attrset</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1897_16" target="main">Slk_Clear</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1987_16" target="main">Slk_Color</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1830_16" target="main">Slk_Init</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1881_16" target="main">Slk_Label -  terminal_interface-curses.adb:1881</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1889_16" target="main">Slk_Label -  terminal_interface-curses.adb:1889</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1870_16" target="main">Slk_Noutrefresh</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1860_16" target="main">Slk_Refresh</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1907_16" target="main">Slk_Restore</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1842_16" target="main">Slk_Set</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1917_16" target="main">Slk_Touch</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_507_14" target="main">Spacing</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_645_13" target="main">Standard_Window</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_971_14" target="main">Standout</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1878_14" target="main">Start_Color</a>
+<li><a href="../terminal_interface-curses-mouse__ads.htm#ref_116_13" target="main">Start_Mouse</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1453_16" target="main">Subpad</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_271_16" target="main">Subwin</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1444_13" target="main">Sub_Pad</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_765_13" target="main">Sub_Window</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1843_13" target="main">Supported_Attributes</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_977_14" target="main">Switch_Character_Attribute</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_405_14" target="main">Switch_Options -  terminal_interface-curses-forms.ads:405</a>
+<li><a href="../terminal_interface-curses-forms__ads.htm#ref_652_14" target="main">Switch_Options -  terminal_interface-curses-forms.ads:652</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_241_14" target="main">Switch_Options -  terminal_interface-curses-menus.ads:241</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_338_14" target="main">Switch_Options -  terminal_interface-curses-menus.ads:338</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1719_14" target="main">Switch_Soft_Label_Key_Attributes</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_809_14" target="main">Synchronize_Downwards</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_804_14" target="main">Synchronize_Upwards</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_364_16" target="main">Syncok</a>
+</ul></body></html>
diff --git a/doc/html/ada/funcs/T.htm b/doc/html/ada/funcs/T.htm
new file mode 100644
index 0000000..acedebe
--- /dev/null
+++ b/doc/html/ada/funcs/T.htm
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>T</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+<body>
+<h2>Functions - T</h2>
+<a href="../funcs.htm" target="_self">[index]</a>
+<ul compact type="disc">
+<li><a href="../terminal_interface-curses__adb.htm#ref_2373_16" target="main">TABSIZE_As_Function</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_557_13" target="main">Tab_Size</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_2113_16" target="main">Termattrs</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1858_14" target="main">Terminal_Name -  terminal_interface-curses.ads:1858</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1862_13" target="main">Terminal_Name -  terminal_interface-curses.ads:1862</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_2139_16" target="main">Termname -  terminal_interface-curses.adb:2139</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_2147_16" target="main">Termname -  terminal_interface-curses.adb:2147</a>
+<li><a href="../terminal_interface-curses-termcap__adb.htm#ref_52_16" target="main">tgetent</a>
+<li><a href="../terminal_interface-curses-termcap__adb.htm#ref_72_16" target="main">tgetflag</a>
+<li><a href="../terminal_interface-curses-termcap__adb.htm#ref_90_16" target="main">tgetnum</a>
+<li><a href="../terminal_interface-curses-termcap__adb.htm#ref_109_16" target="main">tgetstr -  terminal_interface-curses-termcap.adb:109</a>
+<li><a href="../terminal_interface-curses-termcap__adb.htm#ref_130_16" target="main">tgetstr -  terminal_interface-curses-termcap.adb:130</a>
+<li><a href="../terminal_interface-curses-termcap__adb.htm#ref_152_16" target="main">tgoto</a>
+<li><a href="../terminal_interface-curses-termcap__ads.htm#ref_54_13" target="main">TGoto</a>
+<li><a href="../terminal_interface-curses-terminfo__adb.htm#ref_70_16" target="main">tigetflag</a>
+<li><a href="../terminal_interface-curses-terminfo__adb.htm#ref_88_16" target="main">tigetstr -  terminal_interface-curses-terminfo.adb:88</a>
+<li><a href="../terminal_interface-curses-terminfo__adb.htm#ref_109_16" target="main">tigetstr -  terminal_interface-curses-terminfo.adb:109</a>
+<li><a href="../terminal_interface-curses-terminfo__adb.htm#ref_128_16" target="main">tigetstr -  terminal_interface-curses-terminfo.adb:128</a>
+<li><a href="../terminal_interface-curses-panels__ads.htm#ref_82_14" target="main">Top</a>
+<li><a href="../terminal_interface-curses-panels__adb.htm#ref_76_16" target="main">Toppanel</a>
+<li><a href="../terminal_interface-curses-menus__adb.htm#ref_285_16" target="main">Toprow</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_304_13" target="main">Top_Row</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1312_14" target="main">Touch -  terminal_interface-curses.ads:1312</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1316_14" target="main">Touch -  terminal_interface-curses.ads:1316</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1714_14" target="main">Touch_Soft_Label_Keys</a>
+<li><a href="../terminal_interface-curses-terminfo__adb.htm#ref_141_16" target="main">tputs</a>
+<li><a href="../terminal_interface-curses-trace__adb.htm#ref_47_17" target="main">traceC</a>
+<li><a href="../terminal_interface-curses-trace__adb.htm#ref_54_17" target="main">tracef</a>
+<li><a href="../terminal_interface-curses-trace__ads.htm#ref_115_14" target="main">Trace_On</a>
+<li><a href="../terminal_interface-curses-trace__ads.htm#ref_119_14" target="main">Trace_Put</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_2403_16" target="main">Transform</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1985_14" target="main">Transform_Coordinates</a>
+</ul></body></html>
diff --git a/doc/html/ada/funcs/U.htm b/doc/html/ada/funcs/U.htm
new file mode 100644
index 0000000..8a6d40d
--- /dev/null
+++ b/doc/html/ada/funcs/U.htm
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>U</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+<body>
+<h2>Functions - U</h2>
+<a href="../funcs.htm" target="_self">[index]</a>
+<ul compact type="disc">
+<li><a href="../terminal_interface-curses__adb.htm#ref_2029_16" target="main">Unctrl -  terminal_interface-curses.adb:2029</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_2037_16" target="main">Unctrl -  terminal_interface-curses.adb:2037</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_933_14" target="main">Undo_Keystroke</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_540_16" target="main">Ungetch</a>
+<li><a href="../terminal_interface-curses-mouse__adb.htm#ref_186_16" target="main">Ungetmouse</a>
+<li><a href="../terminal_interface-curses-mouse__ads.htm#ref_142_14" target="main">Unget_Mouse</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1307_14" target="main">Untouch</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1793_14" target="main">Un_Control -  terminal_interface-curses.ads:1793</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1798_13" target="main">Un_Control -  terminal_interface-curses.ads:1798</a>
+<li><a href="../terminal_interface-curses-panels__ads.htm#ref_92_14" target="main">Update_Panels</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1211_14" target="main">Update_Screen</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_2004_14" target="main">Use_Default_Colors</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_2024_13" target="main">Use_Extended_Names</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_2475_16" target="main">use_extended_namesC</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1166_14" target="main">Use_Insert_Delete_Character</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_1159_14" target="main">Use_Insert_Delete_Line</a>
+</ul></body></html>
diff --git a/doc/html/ada/funcs/V.htm b/doc/html/ada/funcs/V.htm
new file mode 100644
index 0000000..2609973
--- /dev/null
+++ b/doc/html/ada/funcs/V.htm
@@ -0,0 +1,15 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>V</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+<body>
+<h2>Functions - V</h2>
+<a href="../funcs.htm" target="_self">[index]</a>
+<ul compact type="disc">
+<li><a href="../terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm#ref_54_13" target="main">Value -  terminal_interface-curses-forms-field_types-enumeration-ada.ads:54</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_217_13" target="main">Value -  terminal_interface-curses-menus.ads:217</a>
+<li><a href="../terminal_interface-curses__ads.htm#ref_908_14" target="main">Vertical_Line</a>
+<li><a href="../terminal_interface-curses-menus__ads.htm#ref_226_13" target="main">Visible</a>
+</ul></body></html>
diff --git a/doc/html/ada/funcs/W.htm b/doc/html/ada/funcs/W.htm
new file mode 100644
index 0000000..8bf0c83
--- /dev/null
+++ b/doc/html/ada/funcs/W.htm
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>W</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+<body>
+<h2>Functions - W</h2>
+<a href="../funcs.htm" target="_self">[index]</a>
+<ul compact type="disc">
+<li><a href="../terminal_interface-curses__adb.htm#ref_151_16" target="main">Waddch</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_408_16" target="main">Waddchnstr</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_377_16" target="main">Waddnstr</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_657_16" target="main">Wattrget -  terminal_interface-curses.adb:657</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_678_16" target="main">Wattrget -  terminal_interface-curses.adb:678</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_617_16" target="main">Wattroff</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_614_16" target="main">Wattron</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_642_16" target="main">Wattrset</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1163_17" target="main">WBackground</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_450_16" target="main">Wborder</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1173_16" target="main">WChangeBkgd</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_718_16" target="main">Wchgat</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1131_16" target="main">Wclear</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1141_16" target="main">Wclearbot</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1151_16" target="main">Wcleareol</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1576_16" target="main">Wdelch</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_255_16" target="main">Wdelwin</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_209_16" target="main">Wechochar</a>
+<li><a href="../terminal_interface-curses-mouse__adb.htm#ref_197_16" target="main">Wenclose</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1121_16" target="main">Werase</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1185_16" target="main">Wgetbkgd</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_526_16" target="main">Wgetch</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1790_16" target="main">Wgetnstr</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_491_16" target="main">Whline</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1602_16" target="main">Winch</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1742_16" target="main">Winchnstr</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1700_16" target="main">Winnstr</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1624_16" target="main">Winsch</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1330_16" target="main">Winsdelln</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1657_16" target="main">Winsnstr</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1241_16" target="main">WLineTouched</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_137_16" target="main">Wmove</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1083_16" target="main">Wnoutrefresh</a>
+<li><a href="../terminal_interface-curses-forms-field_types__ads.htm#ref_152_14" target="main">Wrap_Builtin</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1106_16" target="main">Wredrawln</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1072_16" target="main">Wrefresh</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_2543_16" target="main">wresize</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1564_16" target="main">Wscrl</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1048_16" target="main">Wsetscrreg</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_699_16" target="main">Wset_Color</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_594_16" target="main">wstandend</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_592_16" target="main">wstandout</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_915_17" target="main">Wtimeout</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1196_16" target="main">Wtouchln</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_509_16" target="main">Wvline</a>
+<li><a href="../terminal_interface-curses__adb.htm#ref_1254_16" target="main">WWinTouched</a>
+</ul></body></html>
diff --git a/doc/html/ada/index.htm b/doc/html/ada/index.htm
new file mode 100644
index 0000000..2f7801e
--- /dev/null
+++ b/doc/html/ada/index.htm
@@ -0,0 +1,42 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
+<html>
+<head>
+<title>Source Browser</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+<frameset cols="250,*">
+<noframes>
+<h2 align="center">Files</h2>
+<a href="files/T.htm">[T]</a>
+<hr>
+<h2 align="center">Functions/Procedures</h2>
+<a href="funcs/A.htm">[A]</a>
+<a href="funcs/B.htm">[B]</a>
+<a href="funcs/C.htm">[C]</a>
+<a href="funcs/D.htm">[D]</a>
+<a href="funcs/E.htm">[E]</a>
+<a href="funcs/F.htm">[F]</a>
+<a href="funcs/G.htm">[G]</a>
+<a href="funcs/H.htm">[H]</a>
+<a href="funcs/I.htm">[I]</a>
+<a href="funcs/K.htm">[K]</a>
+<a href="funcs/L.htm">[L]</a>
+<a href="funcs/M.htm">[M]</a>
+<a href="funcs/N.htm">[N]</a>
+<a href="funcs/O.htm">[O]</a>
+<a href="funcs/P.htm">[P]</a>
+<a href="funcs/Q.htm">[Q]</a>
+<a href="funcs/R.htm">[R]</a>
+<a href="funcs/S.htm">[S]</a>
+<a href="funcs/T.htm">[T]</a>
+<a href="funcs/U.htm">[U]</a>
+<a href="funcs/V.htm">[V]</a>
+<a href="funcs/W.htm">[W]</a>
+</noframes>
+<frameset rows="50%,50%">
+<frame name="files" src="files.htm">
+<frame name="funcs" src="funcs.htm">
+</frameset>
+<frame name="main" src="main.htm">
+</frameset>
+</html>
diff --git a/doc/html/ada/main.htm b/doc/html/ada/main.htm
new file mode 100644
index 0000000..4308712
--- /dev/null
+++ b/doc/html/ada/main.htm
@@ -0,0 +1,82 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title></title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<p align="right"><a href="main.htm" target="_top">[No frame version is here]</a><p><h2 align="center">Files</h2>
+<a href="files/T.htm">[T]</a>
+<hr><h2 align="center">Functions/Procedures</h2>
+<a href="funcs/A.htm">[A]</a>
+<a href="funcs/B.htm">[B]</a>
+<a href="funcs/C.htm">[C]</a>
+<a href="funcs/D.htm">[D]</a>
+<a href="funcs/E.htm">[E]</a>
+<a href="funcs/F.htm">[F]</a>
+<a href="funcs/G.htm">[G]</a>
+<a href="funcs/H.htm">[H]</a>
+<a href="funcs/I.htm">[I]</a>
+<a href="funcs/K.htm">[K]</a>
+<a href="funcs/L.htm">[L]</a>
+<a href="funcs/M.htm">[M]</a>
+<a href="funcs/N.htm">[N]</a>
+<a href="funcs/O.htm">[O]</a>
+<a href="funcs/P.htm">[P]</a>
+<a href="funcs/Q.htm">[Q]</a>
+<a href="funcs/R.htm">[R]</a>
+<a href="funcs/S.htm">[S]</a>
+<a href="funcs/T.htm">[T]</a>
+<a href="funcs/U.htm">[U]</a>
+<a href="funcs/V.htm">[V]</a>
+<a href="funcs/W.htm">[W]</a>
+<hr>
+You should start your browsing with one of these files:
+<ul>
+<li><a href="terminal_interface-curses-aux__ads.htm">terminal_interface-curses-aux.ads</a>
+<li><a href="terminal_interface-curses-forms-field_types-alpha__ads.htm">terminal_interface-curses-forms-field_types-alpha.ads</a>
+<li><a href="terminal_interface-curses-forms-field_types-alphanumeric__ads.htm">terminal_interface-curses-forms-field_types-alphanumeric.ads</a>
+<li><a href="terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm">terminal_interface-curses-forms-field_types-enumeration-ada.ads</a>
+<li><a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm">terminal_interface-curses-forms-field_types-enumeration.ads</a>
+<li><a href="terminal_interface-curses-forms-field_types-intfield__ads.htm">terminal_interface-curses-forms-field_types-intfield.ads</a>
+<li><a href="terminal_interface-curses-forms-field_types-ipv4_address__ads.htm">terminal_interface-curses-forms-field_types-ipv4_address.ads</a>
+<li><a href="terminal_interface-curses-forms-field_types-numeric__ads.htm">terminal_interface-curses-forms-field_types-numeric.ads</a>
+<li><a href="terminal_interface-curses-forms-field_types-regexp__ads.htm">terminal_interface-curses-forms-field_types-regexp.ads</a>
+<li><a href="terminal_interface-curses-forms-field_types-user-choice__ads.htm">terminal_interface-curses-forms-field_types-user-choice.ads</a>
+<li><a href="terminal_interface-curses-forms-field_types-user__ads.htm">terminal_interface-curses-forms-field_types-user.ads</a>
+<li><a href="terminal_interface-curses-forms-field_types__ads.htm">terminal_interface-curses-forms-field_types.ads</a>
+<li><a href="terminal_interface-curses-forms-field_user_data__ads.htm">terminal_interface-curses-forms-field_user_data.ads</a>
+<li><a href="terminal_interface-curses-forms-form_user_data__ads.htm">terminal_interface-curses-forms-form_user_data.ads</a>
+<li><a href="terminal_interface-curses-forms__ads.htm">terminal_interface-curses-forms.ads</a>
+<li><a href="terminal_interface-curses-menus-item_user_data__ads.htm">terminal_interface-curses-menus-item_user_data.ads</a>
+<li><a href="terminal_interface-curses-menus-menu_user_data__ads.htm">terminal_interface-curses-menus-menu_user_data.ads</a>
+<li><a href="terminal_interface-curses-menus__ads.htm">terminal_interface-curses-menus.ads</a>
+<li><a href="terminal_interface-curses-mouse__ads.htm">terminal_interface-curses-mouse.ads</a>
+<li><a href="terminal_interface-curses-panels-user_data__ads.htm">terminal_interface-curses-panels-user_data.ads</a>
+<li><a href="terminal_interface-curses-panels__ads.htm">terminal_interface-curses-panels.ads</a>
+<li><a href="terminal_interface-curses-putwin__ads.htm">terminal_interface-curses-putwin.ads</a>
+<li><a href="terminal_interface-curses-termcap__ads.htm">terminal_interface-curses-termcap.ads</a>
+<li><a href="terminal_interface-curses-terminfo__ads.htm">terminal_interface-curses-terminfo.ads</a>
+<li><a href="terminal_interface-curses-text_io-aux__ads.htm">terminal_interface-curses-text_io-aux.ads</a>
+<li><a href="terminal_interface-curses-text_io-complex_io__ads.htm">terminal_interface-curses-text_io-complex_io.ads</a>
+<li><a href="terminal_interface-curses-text_io-decimal_io__ads.htm">terminal_interface-curses-text_io-decimal_io.ads</a>
+<li><a href="terminal_interface-curses-text_io-enumeration_io__ads.htm">terminal_interface-curses-text_io-enumeration_io.ads</a>
+<li><a href="terminal_interface-curses-text_io-fixed_io__ads.htm">terminal_interface-curses-text_io-fixed_io.ads</a>
+<li><a href="terminal_interface-curses-text_io-float_io__ads.htm">terminal_interface-curses-text_io-float_io.ads</a>
+<li><a href="terminal_interface-curses-text_io-integer_io__ads.htm">terminal_interface-curses-text_io-integer_io.ads</a>
+<li><a href="terminal_interface-curses-text_io-modular_io__ads.htm">terminal_interface-curses-text_io-modular_io.ads</a>
+<li><a href="terminal_interface-curses-text_io__ads.htm">terminal_interface-curses-text_io.ads</a>
+<li><a href="terminal_interface-curses-trace__ads.htm">terminal_interface-curses-trace.ads</a>
+<li><a href="terminal_interface-curses__ads.htm">terminal_interface-curses.ads</a>
+<li><a href="terminal_interface-curses_constants__ads.htm">terminal_interface-curses_constants.ads</a>
+<li><a href="terminal_interface__ads.htm">terminal_interface.ads</a>
+</ul>
+</body></html>
diff --git a/doc/html/ada/table.html b/doc/html/ada/table.html
new file mode 100644
index 0000000..7635427
--- /dev/null
+++ b/doc/html/ada/table.html
@@ -0,0 +1,340 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>Correspondence between ncurses C and Ada functions</title>
+</head>
+<body>
+<h1>Correspondence between ncurses C and Ada functions</h1>
+<h2>Sorted by C function name</h2>
+<table align="center" border summary="Correspondence between ncurses C and Ada functions">
+<tr align="left">
+<th>C name</th><th>Ada name</th><th>man page</th></tr>
+<TR><TD>assume_default_colors()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_156">Assume_Default_Colors</A></TD><TD><A HREF="../man/default_colors.3x.html">default_colors.3x</A></TD></TR>
+<TR><TD>baudrate()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_131">Baudrate</A></TD><TD><A HREF="../man/curs_termattrs.3x.html">curs_termattrs.3x</A></TD></TR>
+<TR><TD>beep()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_40">Beep</A></TD><TD><A HREF="../man/curs_beep.3x.html">curs_beep.3x</A></TD></TR>
+<TR><TD>bottom_panel()</TD><TD><A HREF="terminal_interface-curses-panels__ads.htm#AFU_3">Bottom</A></TD><TD><A HREF="../man/panel.3x.html">panel.3x</A></TD></TR>
+<TR><TD>box()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_26">Box</A></TD><TD><A HREF="../man/curs_border.3x.html">curs_border.3x</A></TD></TR>
+<TR><TD>can_change_color()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_146">Can_Change_Color</A></TD><TD><A HREF="../man/curs_color.3x.html">curs_color.3x</A></TD></TR>
+<TR><TD>cbreak()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_42">Set_Cbreak_Mode</A></TD><TD><A HREF="../man/curs_inopts.3x.html">curs_inopts.3x</A></TD></TR>
+<TR><TD>clearok()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_54">Clear_On_Next_Update</A></TD><TD><A HREF="../man/curs_outopts.3x.html">curs_outopts.3x</A></TD></TR>
+<TR><TD>color_content()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_147">Color_Content</A></TD><TD><A HREF="../man/curs_color.3x.html">curs_color.3x</A></TD></TR>
+<TR><TD>copywin()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_79">Copy</A></TD><TD><A HREF="../man/curs_overlay.3x.html">curs_overlay.3x</A></TD></TR>
+<TR><TD>current_field()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_58">Current</A></TD><TD><A HREF="../man/form_page.3x.html">form_page.3x</A></TD></TR>
+<TR><TD>current_item()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_14">Current</A></TD><TD><A HREF="../man/mitem_current.3x.html">mitem_current.3x</A></TD></TR>
+<TR><TD>curscr</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_2">Current_Window</A></TD><TD><A HREF="../man/curs_initscr.3x.html">curs_initscr.3x</A></TD></TR>
+<TR><TD>curses_version()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_157">Curses_Version</A></TD><TD><A HREF="../man/curs_extend.3x.html">curs_extend.3x</A></TD></TR>
+<TR><TD>curs_set()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_153">Set_Cursor_Visibility</A></TD><TD><A HREF="../man/curs_kernel.3x.html">curs_kernel.3x</A></TD></TR>
+<TR><TD>data_ahead()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_54">Data_Ahead</A></TD><TD><A HREF="../man/form_data.3x.html">form_data.3x</A></TD></TR>
+<TR><TD>data_behind()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_55">Data_Behind</A></TD><TD><A HREF="../man/form_data.3x.html">form_data.3x</A></TD></TR>
+<TR><TD>define_key()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_124">Define_Key</A></TD><TD><A HREF="../man/define_key.3x.html">define_key.3x</A></TD></TR>
+<TR><TD>def_prog_mode()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_148">Save_Curses_Mode</A></TD><TD><A HREF="../man/curs_kernel.3x.html">curs_kernel.3x</A></TD></TR>
+<TR><TD>delay_output()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_129">Delay_Output</A></TD><TD><A HREF="../man/curs_util.3x.html">curs_util.3x</A></TD></TR>
+<TR><TD>del_panel()</TD><TD><A HREF="terminal_interface-curses-panels__ads.htm#AFU_15">Delete</A></TD><TD><A HREF="../man/panel.3x.html">panel.3x</A></TD></TR>
+<TR><TD>delwin()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_12">Delete</A></TD><TD><A HREF="../man/curs_window.3x.html">curs_window.3x</A></TD></TR>
+<TR><TD>derwin()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_14">Derived_Window</A></TD><TD><A HREF="../man/curs_window.3x.html">curs_window.3x</A></TD></TR>
+<TR><TD>doupdate()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_61">Update_Screen</A></TD><TD><A HREF="../man/curs_refresh.3x.html">curs_refresh.3x</A></TD></TR>
+<TR><TD>dup_field()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_4">Duplicate</A></TD><TD><A HREF="../man/form_field_new.3x.html">form_field_new.3x</A></TD></TR>
+<TR><TD>dupwin()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_15">Duplicate</A></TD><TD><A HREF="../man/curs_window.3x.html">curs_window.3x</A></TD></TR>
+<TR><TD>dynamic_field_info()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_26">Dynamic_Info</A></TD><TD><A HREF="../man/form_field_info.3x.html">form_field_info.3x</A></TD></TR>
+<TR><TD>echo()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_44">Set_Echo_Mode</A></TD><TD><A HREF="../man/curs_inopts.3x.html">curs_inopts.3x</A></TD></TR>
+<TR><TD>endwin()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_5">End_Windows</A></TD><TD><A HREF="../man/curs_initscr.3x.html">curs_initscr.3x</A></TD></TR>
+<TR><TD>erasechar()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_132">Erase_Character</A></TD><TD><A HREF="../man/curs_termattrs.3x.html">curs_termattrs.3x</A></TD></TR>
+<TR><TD>field_back()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_21">Background</A></TD><TD><A HREF="../man/form_field_attributes.3x.html">form_field_attributes.3x</A></TD></TR>
+<TR><TD>field_back()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_22">Background</A></TD><TD><A HREF="../man/form_field_attributes.3x.html">form_field_attributes.3x</A></TD></TR>
+<TR><TD>field_buffer()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_9">Get_Buffer</A></TD><TD><A HREF="../man/form_field_buffer.3x.html">form_field_buffer.3x</A></TD></TR>
+<TR><TD>field_count()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_43">Field_Count</A></TD><TD><A HREF="../man/form_field.3x.html">form_field.3x</A></TD></TR>
+<TR><TD>field_fore()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_18">Foreground</A></TD><TD><A HREF="../man/form_field_attributes.3x.html">form_field_attributes.3x</A></TD></TR>
+<TR><TD>field_fore()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_19">Foreground</A></TD><TD><A HREF="../man/form_field_attributes.3x.html">form_field_attributes.3x</A></TD></TR>
+<TR><TD>field_index()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_61">Get_Index</A></TD><TD><A HREF="../man/form_page.3x.html">form_page.3x</A></TD></TR>
+<TR><TD>field_info()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_25">Info</A></TD><TD><A HREF="../man/form_field_info.3x.html">form_field_info.3x</A></TD></TR>
+<TR><TD>field_init()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_36">Get_Field_Init_Hook</A></TD><TD><A HREF="../man/form_hook.3x.html">form_hook.3x</A></TD></TR>
+<TR><TD>field_just()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_7">Get_Justification</A></TD><TD><A HREF="../man/form_field_just.3x.html">form_field_just.3x</A></TD></TR>
+<TR><TD>field_opts_on()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_14">Switch_Options</A></TD><TD><A HREF="../man/form_field_opts.3x.html">form_field_opts.3x</A></TD></TR>
+<TR><TD>field_opts()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_15">Get_Options</A></TD><TD><A HREF="../man/form_field_opts.3x.html">form_field_opts.3x</A></TD></TR>
+<TR><TD>field_opts()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_16">Get_Options</A></TD><TD><A HREF="../man/form_field_opts.3x.html">form_field_opts.3x</A></TD></TR>
+<TR><TD>field_pad()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_24">Pad_Character</A></TD><TD><A HREF="../man/form_field_attributes.3x.html">form_field_attributes.3x</A></TD></TR>
+<TR><TD>field_status()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_11">Changed</A></TD><TD><A HREF="../man/form_field_buffer.3x.html">form_field_buffer.3x</A></TD></TR>
+<TR><TD>field_term()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_37">Get_Field_Term_Hook</A></TD><TD><A HREF="../man/form_hook.3x.html">form_hook.3x</A></TD></TR>
+<TR><TD>field_type()</TD><TD><A HREF="terminal_interface-curses-forms-field_user_data__ads.htm#AFU_2">Get_Type</A></TD><TD><A HREF="../man/form_field_validation.3x.html">form_field_validation.3x</A></TD></TR>
+<TR><TD>field_userptr</TD><TD><A HREF="terminal_interface-curses-forms-field_user_data__ads.htm#AFU_2">Get_User_Data</A></TD><TD><A HREF="../man/form_field_userptr.3x.html">form_field_userptr.3x</A></TD></TR>
+<TR><TD>field_userptr</TD><TD><A HREF="terminal_interface-curses-forms-field_user_data__ads.htm#AFU_3">Get_User_Data</A></TD><TD><A HREF="../man/form_field_userptr.3x.html">form_field_userptr.3x</A></TD></TR>
+<TR><TD>flash()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_41">Flash_Screen</A></TD><TD><A HREF="../man/curs_beep.3x.html">curs_beep.3x</A></TD></TR>
+<TR><TD>flushinp()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_130">Flush_Input</A></TD><TD><A HREF="../man/curs_util.3x.html">curs_util.3x</A></TD></TR>
+<TR><TD>form_driver()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_56">Driver</A></TD><TD><A HREF="../man/form_driver.3x.html">form_driver.3x</A></TD></TR>
+<TR><TD>form_fields()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_42">Fields</A></TD><TD><A HREF="../man/form_field.3x.html">form_field.3x</A></TD></TR>
+<TR><TD>form_init()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_38">Get_Form_Init_Hook</A></TD><TD><A HREF="../man/form_hook.3x.html">form_hook.3x</A></TD></TR>
+<TR><TD>form_opts_on()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_49">Switch_Options</A></TD><TD><A HREF="../man/form_opts.3x.html">form_opts.3x</A></TD></TR>
+<TR><TD>form_opts()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_50">Get_Options</A></TD><TD><A HREF="../man/form_opts.3x.html">form_opts.3x</A></TD></TR>
+<TR><TD>form_opts()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_51">Get_Options</A></TD><TD><A HREF="../man/form_opts.3x.html">form_opts.3x</A></TD></TR>
+<TR><TD>form_page()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_60">Page</A></TD><TD><A HREF="../man/form_page.3x.html">form_page.3x</A></TD></TR>
+<TR><TD>form_sub()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_30">Get_Sub_Window</A></TD><TD><A HREF="../man/form_win.3x.html">form_win.3x</A></TD></TR>
+<TR><TD>form_term()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_39">Get_Form_Term_Hook</A></TD><TD><A HREF="../man/form_hook.3x.html">form_hook.3x</A></TD></TR>
+<TR><TD>form_userptr</TD><TD><A HREF="terminal_interface-curses-forms-form_user_data__ads.htm#AFU_2">Get_User_Data</A></TD><TD><A HREF="../man/form_userptr.3x.html">form_userptr.3x</A></TD></TR>
+<TR><TD>form_userptr</TD><TD><A HREF="terminal_interface-curses-forms-form_user_data__ads.htm#AFU_3">Get_User_Data</A></TD><TD><A HREF="../man/form_userptr.3x.html">form_userptr.3x</A></TD></TR>
+<TR><TD>form_win()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_28">Get_Window</A></TD><TD><A HREF="../man/form_win.3x.html">form_win.3x</A></TD></TR>
+<TR><TD>free_field()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_3">Delete</A></TD><TD><A HREF="../man/form_field_new.3x.html">form_field_new.3x</A></TD></TR>
+<TR><TD>free_form()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_47">Delete</A></TD><TD><A HREF="../man/form_new.3x.html">form_new.3x</A></TD></TR>
+<TR><TD>free_item()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_3">Delete</A></TD><TD><A HREF="../man/mitem_new.3x.html">mitem_new.3x</A></TD></TR>
+<TR><TD>free_menu()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_60">Delete</A></TD><TD><A HREF="../man/menu_new.3x.html">menu_new.3x</A></TD></TR>
+<TR><TD>getbegyx()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_86">Get_Window_Position</A></TD><TD><A HREF="../man/curs_getyx.3x.html">curs_getyx.3x</A></TD></TR>
+<TR><TD>getmaxyx()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_85">Get_Size</A></TD><TD><A HREF="../man/curs_getyx.3x.html">curs_getyx.3x</A></TD></TR>
+<TR><TD>getmouse()</TD><TD><A HREF="terminal_interface-curses-mouse__ads.htm#AFU_2">Get_Mouse</A></TD><TD><A HREF="../man/curs_mouse.3x.html">curs_mouse.3x</A></TD></TR>
+<TR><TD>getparyx()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_88">Get_Origin_Relative_To_Parent</A></TD><TD><A HREF="../man/curs_getyx.3x.html">curs_getyx.3x</A></TD></TR>
+<TR><TD>getyx()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_87">Get_Cursor_Position</A></TD><TD><A HREF="../man/curs_getyx.3x.html">curs_getyx.3x</A></TD></TR>
+<TR><TD>halfdelay()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_47">Half_Delay</A></TD><TD><A HREF="../man/curs_inopts.3x.html">curs_inopts.3x</A></TD></TR>
+<TR><TD>has_colors()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_144">Has_Colors</A></TD><TD><A HREF="../man/curs_color.3x.html">curs_color.3x</A></TD></TR>
+<TR><TD>has_ic()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_134">Has_Insert_Character</A></TD><TD><A HREF="../man/curs_termattrs.3x.html">curs_termattrs.3x</A></TD></TR>
+<TR><TD>has_il()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_135">Has_Insert_Line</A></TD><TD><A HREF="../man/curs_termattrs.3x.html">curs_termattrs.3x</A></TD></TR>
+<TR><TD>has_key()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_31">Has_Key</A></TD><TD><A HREF="../man/curs_getch.3x.html">curs_getch.3x</A></TD></TR>
+<TR><TD>hide_panel()</TD><TD><A HREF="terminal_interface-curses-panels__ads.htm#AFU_7">Hide</A></TD><TD><A HREF="../man/panel.3x.html">panel.3x</A></TD></TR>
+<TR><TD>idcok()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_56">Use_Insert_Delete_Character</A></TD><TD><A HREF="../man/curs_outopts.3x.html">curs_outopts.3x</A></TD></TR>
+<TR><TD>idlok()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_55">Use_Insert_Delete_Line</A></TD><TD><A HREF="../man/curs_outopts.3x.html">curs_outopts.3x</A></TD></TR>
+<TR><TD>immedok()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_58">Immediate_Update_Mode</A></TD><TD><A HREF="../man/curs_outopts.3x.html">curs_outopts.3x</A></TD></TR>
+<TR><TD>init_color()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_145">Init_Color</A></TD><TD><A HREF="../man/curs_color.3x.html">curs_color.3x</A></TD></TR>
+<TR><TD>init_pair()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_142">Init_Pair</A></TD><TD><A HREF="../man/curs_color.3x.html">curs_color.3x</A></TD></TR>
+<TR><TD>initscr()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_3">Init_Screen</A></TD><TD><A HREF="../man/curs_initscr.3x.html">curs_initscr.3x</A></TD></TR>
+<TR><TD>initscr()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_4">Init_Windows</A></TD><TD><A HREF="../man/curs_initscr.3x.html">curs_initscr.3x</A></TD></TR>
+<TR><TD>intrflush()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_48">Set_Flush_On_Interrupt_Mode</A></TD><TD><A HREF="../man/curs_inopts.3x.html">curs_inopts.3x</A></TD></TR>
+<TR><TD>isendwin()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_6">Is_End_Window</A></TD><TD><A HREF="../man/curs_initscr.3x.html">curs_initscr.3x</A></TD></TR>
+<TR><TD>is_linetouched()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_77">Is_Touched</A></TD><TD><A HREF="../man/curs_touch.3x.html">curs_touch.3x</A></TD></TR>
+<TR><TD>is_wintouched()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_78">Is_Touched</A></TD><TD><A HREF="../man/curs_touch.3x.html">curs_touch.3x</A></TD></TR>
+<TR><TD>item_count()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_58">Item_Count</A></TD><TD><A HREF="../man/menu_items.3x.html">menu_items.3x</A></TD></TR>
+<TR><TD>item_description();</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_12">Description</A></TD><TD><A HREF="../man/mitem_name.3x.html">mitem_name.3x</A></TD></TR>
+<TR><TD>item_index()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_17">Get_Index</A></TD><TD><A HREF="../man/mitem_current.3x.html">mitem_current.3x</A></TD></TR>
+<TR><TD>item_init()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_52">Get_Item_Init_Hook</A></TD><TD><A HREF="../man/menu_hook.3x.html">menu_hook.3x</A></TD></TR>
+<TR><TD>item_name()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_11">Name</A></TD><TD><A HREF="../man/mitem_name.3x.html">mitem_name.3x</A></TD></TR>
+<TR><TD>item_opts_on()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_8">Switch_Options</A></TD><TD><A HREF="../man/mitem_opts.3x.html">mitem_opts.3x</A></TD></TR>
+<TR><TD>item_opts()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_10">Get_Options</A></TD><TD><A HREF="../man/mitem_opts.3x.html">mitem_opts.3x</A></TD></TR>
+<TR><TD>item_opts()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_9">Get_Options</A></TD><TD><A HREF="../man/mitem_opts.3x.html">mitem_opts.3x</A></TD></TR>
+<TR><TD>item_term()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_53">Get_Item_Term_Hook</A></TD><TD><A HREF="../man/menu_hook.3x.html">menu_hook.3x</A></TD></TR>
+<TR><TD>item_userptr</TD><TD><A HREF="terminal_interface-curses-menus-item_user_data__ads.htm#AFU_2">Get_User_Data</A></TD><TD><A HREF="../man/mitem_userptr.3x.html">mitem_userptr.3x</A></TD></TR>
+<TR><TD>item_userptr</TD><TD><A HREF="terminal_interface-curses-menus-item_user_data__ads.htm#AFU_3">Get_User_Data</A></TD><TD><A HREF="../man/mitem_userptr.3x.html">mitem_userptr.3x</A></TD></TR>
+<TR><TD>item_value()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_5">Value</A></TD><TD><A HREF="../man/mitem_value.3x.html">mitem_value.3x</A></TD></TR>
+<TR><TD>item_visible()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_6">Visible</A></TD><TD><A HREF="../man/mitem_visible.3x.html">mitem_visible.3x</A></TD></TR>
+<TR><TD>keyname()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_125">Key_Name</A></TD><TD><A HREF="../man/curs_util.3x.html">curs_util.3x</A></TD></TR>
+<TR><TD>keyname()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_126">Key_Name</A></TD><TD><A HREF="../man/curs_util.3x.html">curs_util.3x</A></TD></TR>
+<TR><TD>keyok()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_123">Enable_Key</A></TD><TD><A HREF="../man/keyok.3x.html">keyok.3x</A></TD></TR>
+<TR><TD>keypad()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_46">Set_KeyPad_Mode</A></TD><TD><A HREF="../man/curs_inopts.3x.html">curs_inopts.3x</A></TD></TR>
+<TR><TD>killchar()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_133">Kill_Character</A></TD><TD><A HREF="../man/curs_termattrs.3x.html">curs_termattrs.3x</A></TD></TR>
+<TR><TD>leaveok()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_57">Leave_Cursor_After_Update</A></TD><TD><A HREF="../man/curs_outopts.3x.html">curs_outopts.3x</A></TD></TR>
+<TR><TD>link_field()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_5">Link</A></TD><TD><A HREF="../man/form_field_new.3x.html">form_field_new.3x</A></TD></TR>
+<TR><TD>longname()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_137">Long_Name</A></TD><TD><A HREF="../man/curs_termattrs.3x.html">curs_termattrs.3x</A></TD></TR>
+<TR><TD>longname()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_138">Long_Name</A></TD><TD><A HREF="../man/curs_termattrs.3x.html">curs_termattrs.3x</A></TD></TR>
+<TR><TD>menu_back()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_35">Background</A></TD><TD><A HREF="../man/menu_attributes.3x.html">menu_attributes.3x</A></TD></TR>
+<TR><TD>menu_back()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_36">Background</A></TD><TD><A HREF="../man/menu_attributes.3x.html">menu_attributes.3x</A></TD></TR>
+<TR><TD>menu_driver()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_61">Driver</A></TD><TD><A HREF="../man/menu_driver.3x.html">menu_driver.3x</A></TD></TR>
+<TR><TD>menu_fore()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_32">Foreground</A></TD><TD><A HREF="../man/menu_attributes.3x.html">menu_attributes.3x</A></TD></TR>
+<TR><TD>menu_fore()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_33">Foreground</A></TD><TD><A HREF="../man/menu_attributes.3x.html">menu_attributes.3x</A></TD></TR>
+<TR><TD>menu_format()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_47">Format</A></TD><TD><A HREF="../man/menu_format.3x.html">menu_format.3x</A></TD></TR>
+<TR><TD>menu_grey()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_38">Grey</A></TD><TD><A HREF="../man/menu_attributes.3x.html">menu_attributes.3x</A></TD></TR>
+<TR><TD>menu_grey()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_39">Grey</A></TD><TD><A HREF="../man/menu_attributes.3x.html">menu_attributes.3x</A></TD></TR>
+<TR><TD>menu_init()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_54">Get_Menu_Init_Hook</A></TD><TD><A HREF="../man/menu_hook.3x.html">menu_hook.3x</A></TD></TR>
+<TR><TD>menu_items()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_57">Items</A></TD><TD><A HREF="../man/menu_items.3x.html">menu_items.3x</A></TD></TR>
+<TR><TD>menu_mark()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_30">Mark</A></TD><TD><A HREF="../man/menu_mark.3x.html">menu_mark.3x</A></TD></TR>
+<TR><TD>menu_opts_on()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_20">Switch_Options</A></TD><TD><A HREF="../man/menu_opts.3x.html">menu_opts.3x</A></TD></TR>
+<TR><TD>menu_opts()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_21">Get_Options</A></TD><TD><A HREF="../man/menu_opts.3x.html">menu_opts.3x</A></TD></TR>
+<TR><TD>menu_opts()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_22">Get_Options</A></TD><TD><A HREF="../man/menu_opts.3x.html">menu_opts.3x</A></TD></TR>
+<TR><TD>menu_pad()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_41">Pad_Character</A></TD><TD><A HREF="../man/menu_attributes.3x.html">menu_attributes.3x</A></TD></TR>
+<TR><TD>menu_pattern()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_45">Pattern</A></TD><TD><A HREF="../man/menu_pattern.3x.html">menu_pattern.3x</A></TD></TR>
+<TR><TD>menu_requestname.3x</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_62"></A></TD><TD><A HREF="../man/menu_driver.3x.html">menu_driver.3x</A></TD></TR>
+<TR><TD>menu_spacing()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_43">Spacing</A></TD><TD><A HREF="../man/menu_spacing.3x.html">menu_spacing.3x</A></TD></TR>
+<TR><TD>menu_sub()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_26">Get_Sub_Window</A></TD><TD><A HREF="../man/menu_win.3x.html">menu_win.3x</A></TD></TR>
+<TR><TD>menu_term()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_55">Get_Menu_Term_Hook</A></TD><TD><A HREF="../man/menu_hook.3x.html">menu_hook.3x</A></TD></TR>
+<TR><TD>menu_userptr</TD><TD><A HREF="terminal_interface-curses-menus-menu_user_data__ads.htm#AFU_2">Get_User_Data</A></TD><TD><A HREF="../man/menu_userptr.3x.html">menu_userptr.3x</A></TD></TR>
+<TR><TD>menu_userptr</TD><TD><A HREF="terminal_interface-curses-menus-menu_user_data__ads.htm#AFU_3">Get_User_Data</A></TD><TD><A HREF="../man/menu_userptr.3x.html">menu_userptr.3x</A></TD></TR>
+<TR><TD>menu_win()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_24">Get_Window</A></TD><TD><A HREF="../man/menu_win.3x.html">menu_win.3x</A></TD></TR>
+<TR><TD>meta()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_45">Set_Meta_Mode</A></TD><TD><A HREF="../man/curs_inopts.3x.html">curs_inopts.3x</A></TD></TR>
+<TR><TD>mouseinterval()</TD><TD><A HREF="terminal_interface-curses-mouse__ads.htm#AFU_5">Mouse_Interval</A></TD><TD><A HREF="../man/curs_mouse.3x.html">curs_mouse.3x</A></TD></TR>
+<TR><TD>mousemask()</TD><TD><A HREF="terminal_interface-curses-mouse__ads.htm#AFU_1">Start_Mouse</A></TD><TD><A HREF="../man/curs_mouse.3x.html">curs_mouse.3x</A></TD></TR>
+<TR><TD>move_field()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_44">Move</A></TD><TD><A HREF="../man/form_field.3x.html">form_field.3x</A></TD></TR>
+<TR><TD>move_panel()</TD><TD><A HREF="terminal_interface-curses-panels__ads.htm#AFU_11">Move</A></TD><TD><A HREF="../man/panel.3x.html">panel.3x</A></TD></TR>
+<TR><TD>mvderwin()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_17">Move_Derived_Window</A></TD><TD><A HREF="../man/curs_window.3x.html">curs_window.3x</A></TD></TR>
+<TR><TD>mvwaddchnstr()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_24">Add</A></TD><TD><A HREF="../man/curs_addchstr.3x.html">curs_addchstr.3x</A></TD></TR>
+<TR><TD>mvwaddch()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_9">Add</A></TD><TD><A HREF="../man/curs_addch.3x.html">curs_addch.3x</A></TD></TR>
+<TR><TD>mvwaddnstr()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_22">Add</A></TD><TD><A HREF="../man/curs_addstr.3x.html">curs_addstr.3x</A></TD></TR>
+<TR><TD>mvwchgat()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_39">Change_Attributes</A></TD><TD><A HREF="../man/curs_attr.3x.html">curs_attr.3x</A></TD></TR>
+<TR><TD>mvwdelch()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_96">Delete_Character</A></TD><TD><A HREF="../man/curs_delch.3x.html">curs_delch.3x</A></TD></TR>
+<TR><TD>mvwgetnstr()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_108">Get</A></TD><TD><A HREF="../man/curs_getstr.3x.html">curs_getstr.3x</A></TD></TR>
+<TR><TD>mvwinchnstr()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_106">Peek</A></TD><TD><A HREF="../man/curs_inchstr.3x.html">curs_inchstr.3x</A></TD></TR>
+<TR><TD>mvwinch()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_98">Peek</A></TD><TD><A HREF="../man/curs_inch.3x.html">curs_inch.3x</A></TD></TR>
+<TR><TD>mvwinnstr()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_104">Peek</A></TD><TD><A HREF="../man/curs_instr.3x.html">curs_instr.3x</A></TD></TR>
+<TR><TD>mvwinsch()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_100">Insert</A></TD><TD><A HREF="../man/curs_insch.3x.html">curs_insch.3x</A></TD></TR>
+<TR><TD>mvwinsnstr()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_102">Insert</A></TD><TD><A HREF="../man/curs_insstr.3x.html">curs_insstr.3x</A></TD></TR>
+<TR><TD>mvwin()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_16">Move_Window</A></TD><TD><A HREF="../man/curs_window.3x.html">curs_window.3x</A></TD></TR>
+<TR><TD>napms()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_154">Nap_Milli_Seconds</A></TD><TD><A HREF="../man/curs_kernel.3x.html">curs_kernel.3x</A></TD></TR>
+<TR><TD>_nc_freeall()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_159">Curses_Free_All</A></TD><TD><A HREF="../man/curs_trace.3x.html">curs_trace.3x</A></TD></TR>
+<TR><TD>new_field()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_1">Create</A></TD><TD><A HREF="../man/form_field_new.3x.html">form_field_new.3x</A></TD></TR>
+<TR><TD>new_field()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_2">New_Field</A></TD><TD><A HREF="../man/form_field_new.3x.html">form_field_new.3x</A></TD></TR>
+<TR><TD>new_form()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_45">Create</A></TD><TD><A HREF="../man/form_new.3x.html">form_new.3x</A></TD></TR>
+<TR><TD>new_form()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_46">New_Form</A></TD><TD><A HREF="../man/form_new.3x.html">form_new.3x</A></TD></TR>
+<TR><TD>new_item()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_1">Create</A></TD><TD><A HREF="../man/mitem_new.3x.html">mitem_new.3x</A></TD></TR>
+<TR><TD>new_item()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_2">New_Item</A></TD><TD><A HREF="../man/mitem_new.3x.html">mitem_new.3x</A></TD></TR>
+<TR><TD>new_menu()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_59">Create</A></TD><TD><A HREF="../man/menu_new.3x.html">menu_new.3x</A></TD></TR>
+<TR><TD>newpad()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_89">New_Pad</A></TD><TD><A HREF="../man/curs_pad.3x.html">curs_pad.3x</A></TD></TR>
+<TR><TD>new_page()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_63">Is_New_Page</A></TD><TD><A HREF="../man/form_new_page.3x.html">form_new_page.3x</A></TD></TR>
+<TR><TD>new_panel()</TD><TD><A HREF="terminal_interface-curses-panels__ads.htm#AFU_1">Create</A></TD><TD><A HREF="../man/panel.3x.html">panel.3x</A></TD></TR>
+<TR><TD>new_panel()</TD><TD><A HREF="terminal_interface-curses-panels__ads.htm#AFU_2">New_Panel</A></TD><TD><A HREF="../man/panel.3x.html">panel.3x</A></TD></TR>
+<TR><TD>newwin()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_11">Create</A></TD><TD><A HREF="../man/curs_window.3x.html">curs_window.3x</A></TD></TR>
+<TR><TD>nl()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_53">Set_NL_Mode</A></TD><TD><A HREF="../man/curs_outopts.3x.html">curs_outopts.3x</A></TD></TR>
+<TR><TD>nodelay()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_50">Set_NoDelay_Mode</A></TD><TD><A HREF="../man/curs_inopts.3x.html">curs_inopts.3x</A></TD></TR>
+<TR><TD>notimeout()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_52">Set_Escape_Time_Mode</A></TD><TD><A HREF="../man/curs_inopts.3x.html">curs_inopts.3x</A></TD></TR>
+<TR><TD>overlay()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_81">Overlay</A></TD><TD><A HREF="../man/curs_overlay.3x.html">curs_overlay.3x</A></TD></TR>
+<TR><TD>overwrite()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_80">Overwrite</A></TD><TD><A HREF="../man/curs_overlay.3x.html">curs_overlay.3x</A></TD></TR>
+<TR><TD>pair_content()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_143">Pair_Content</A></TD><TD><A HREF="../man/curs_color.3x.html">curs_color.3x</A></TD></TR>
+<TR><TD>panel_above()</TD><TD><A HREF="terminal_interface-curses-panels__ads.htm#AFU_13">Above</A></TD><TD><A HREF="../man/panel.3x.html">panel.3x</A></TD></TR>
+<TR><TD>panel_below()</TD><TD><A HREF="terminal_interface-curses-panels__ads.htm#AFU_14">Below</A></TD><TD><A HREF="../man/panel.3x.html">panel.3x</A></TD></TR>
+<TR><TD>panel_hidden()</TD><TD><A HREF="terminal_interface-curses-panels__ads.htm#AFU_12">Is_Hidden</A></TD><TD><A HREF="../man/panel.3x.html">panel.3x</A></TD></TR>
+<TR><TD>panel_userptr</TD><TD><A HREF="terminal_interface-curses-panels-user_data__ads.htm#AFU_2">Get_User_Data</A></TD><TD><A HREF="../man/panel.3x.html">panel.3x</A></TD></TR>
+<TR><TD>panel_userptr</TD><TD><A HREF="terminal_interface-curses-panels-user_data__ads.htm#AFU_3">Get_User_Data</A></TD><TD><A HREF="../man/panel.3x.html">panel.3x</A></TD></TR>
+<TR><TD>panel_window()</TD><TD><A HREF="terminal_interface-curses-panels__ads.htm#AFU_8">Get_Window</A></TD><TD><A HREF="../man/panel.3x.html">panel.3x</A></TD></TR>
+<TR><TD>panel_window()</TD><TD><A HREF="terminal_interface-curses-panels__ads.htm#AFU_9">Panel_Window</A></TD><TD><A HREF="../man/panel.3x.html">panel.3x</A></TD></TR>
+<TR><TD>pechochar()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_93">Add_Character_To_Pad_And_Echo_It</A></TD><TD><A HREF="../man/curs_pad.3x.html">curs_pad.3x</A></TD></TR>
+<TR><TD>pnoutrefresh()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_92">Refresh_Without_Update</A></TD><TD><A HREF="../man/curs_pad.3x.html">curs_pad.3x</A></TD></TR>
+<TR><TD>pos_form_cursor()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_53">Position_Cursor</A></TD><TD><A HREF="../man/form_cursor.3x.html">form_cursor.3x</A></TD></TR>
+<TR><TD>pos_menu_cursor()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_28">Position_Cursor</A></TD><TD><A HREF="../man/menu_cursor.3x.html">menu_cursor.3x</A></TD></TR>
+<TR><TD>post_form()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_52">Post</A></TD><TD><A HREF="../man/form_post.3x.html">form_post.3x</A></TD></TR>
+<TR><TD>post_menu()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_18">Post</A></TD><TD><A HREF="../man/menu_post.3x.html">menu_post.3x</A></TD></TR>
+<TR><TD>prefresh()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_91">Refresh</A></TD><TD><A HREF="../man/curs_pad.3x.html">curs_pad.3x</A></TD></TR>
+<TR><TD>qiflush()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_49">Set_Queue_Interrupt_Mode</A></TD><TD><A HREF="../man/curs_inopts.3x.html">curs_inopts.3x</A></TD></TR>
+<TR><TD>raw()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_43">Set_Raw_Mode</A></TD><TD><A HREF="../man/curs_inopts.3x.html">curs_inopts.3x</A></TD></TR>
+<TR><TD>redrawwin()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_64">Redraw</A></TD><TD><A HREF="../man/curs_refresh.3x.html">curs_refresh.3x</A></TD></TR>
+<TR><TD>replace_panel()</TD><TD><A HREF="terminal_interface-curses-panels__ads.htm#AFU_10">Replace</A></TD><TD><A HREF="../man/panel.3x.html">panel.3x</A></TD></TR>
+<TR><TD>reset_prog_mode()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_149">Reset_Curses_Mode</A></TD><TD><A HREF="../man/curs_kernel.3x.html">curs_kernel.3x</A></TD></TR>
+<TR><TD>resetty();</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_151">Reset_Terminal_State</A></TD><TD><A HREF="../man/curs_kernel.3x.html">curs_kernel.3x</A></TD></TR>
+<TR><TD>ripoffline()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_152">Rip_Off_Lines</A></TD><TD><A HREF="../man/curs_kernel.3x.html">curs_kernel.3x</A></TD></TR>
+<TR><TD>savetty()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_150">Save_Terminal_State</A></TD><TD><A HREF="../man/curs_kernel.3x.html">curs_kernel.3x</A></TD></TR>
+<TR><TD>scale_form()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_31">Scale</A></TD><TD><A HREF="../man/form_win.3x.html">form_win.3x</A></TD></TR>
+<TR><TD>scale_menu()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_27">Scale</A></TD><TD><A HREF="../man/menu_win.3x.html">menu_win.3x</A></TD></TR>
+<TR><TD>scr_dump()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_160">Screen_Dump_To_File</A></TD><TD><A HREF="../man/curs_scr_dump.3x.html">curs_scr_dump.3x</A></TD></TR>
+<TR><TD>scr_init()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_162">Screen_Init_From_File</A></TD><TD><A HREF="../man/curs_scr_dump.3x.html">curs_scr_dump.3x</A></TD></TR>
+<TR><TD>scrollok()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_59">Allow_Scrolling</A></TD><TD><A HREF="../man/curs_outopts.3x.html">curs_outopts.3x</A></TD></TR>
+<TR><TD>scr_restore()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_161">Screen_Restore_From_File</A></TD><TD><A HREF="../man/curs_scr_dump.3x.html">curs_scr_dump.3x</A></TD></TR>
+<TR><TD>scr_set()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_163">Screen_Set_File</A></TD><TD><A HREF="../man/curs_scr_dump.3x.html">curs_scr_dump.3x</A></TD></TR>
+<TR><TD>set_current_field()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_57">Set_Current</A></TD><TD><A HREF="../man/form_page.3x.html">form_page.3x</A></TD></TR>
+<TR><TD>set_current_item()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_13">Set_Current</A></TD><TD><A HREF="../man/mitem_current.3x.html">mitem_current.3x</A></TD></TR>
+<TR><TD>set_field_back()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_20">Set_Background</A></TD><TD><A HREF="../man/form_field_attributes.3x.html">form_field_attributes.3x</A></TD></TR>
+<TR><TD>set_field_buffer()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_8">Set_Buffer</A></TD><TD><A HREF="../man/form_field_buffer.3x.html">form_field_buffer.3x</A></TD></TR>
+<TR><TD>set_field_fore()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_17">Set_Foreground</A></TD><TD><A HREF="../man/form_field_attributes.3x.html">form_field_attributes.3x</A></TD></TR>
+<TR><TD>set_field_init()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_32">Set_Field_Init_Hook</A></TD><TD><A HREF="../man/form_hook.3x.html">form_hook.3x</A></TD></TR>
+<TR><TD>set_field_just()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_6">Set_Justification</A></TD><TD><A HREF="../man/form_field_just.3x.html">form_field_just.3x</A></TD></TR>
+<TR><TD>set_field_max()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_12">Set_Maximum_Size</A></TD><TD><A HREF="../man/form_field_buffer.3x.html">form_field_buffer.3x</A></TD></TR>
+<TR><TD>set_field_opts()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_13">Set_Options</A></TD><TD><A HREF="../man/form_field_opts.3x.html">form_field_opts.3x</A></TD></TR>
+<TR><TD>set_field_pad()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_23">Set_Pad_Character</A></TD><TD><A HREF="../man/form_field_attributes.3x.html">form_field_attributes.3x</A></TD></TR>
+<TR><TD>set_field_status()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_10">Set_Status</A></TD><TD><A HREF="../man/form_field_buffer.3x.html">form_field_buffer.3x</A></TD></TR>
+<TR><TD>set_field_term()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_33">Set_Field_Term_Hook</A></TD><TD><A HREF="../man/form_hook.3x.html">form_hook.3x</A></TD></TR>
+<TR><TD>set_field_type()</TD><TD><A HREF="terminal_interface-curses-forms-field_user_data__ads.htm#AFU_1">Set_Type</A></TD><TD><A HREF="../man/form_fieldtype.3x.html">form_fieldtype.3x</A></TD></TR>
+<TR><TD>set_field_userptr</TD><TD><A HREF="terminal_interface-curses-forms-field_user_data__ads.htm#AFU_1">Set_User_Data</A></TD><TD><A HREF="../man/form_field_userptr.3x.html">form_field_userptr.3x</A></TD></TR>
+<TR><TD>set_form_fields()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_40">Redefine</A></TD><TD><A HREF="../man/form_field.3x.html">form_field.3x</A></TD></TR>
+<TR><TD>set_form_fields()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_41">Set_Fields</A></TD><TD><A HREF="../man/form_field.3x.html">form_field.3x</A></TD></TR>
+<TR><TD>set_form_init()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_34">Set_Form_Init_Hook</A></TD><TD><A HREF="../man/form_hook.3x.html">form_hook.3x</A></TD></TR>
+<TR><TD>set_form_opts()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_48">Set_Options</A></TD><TD><A HREF="../man/form_opts.3x.html">form_opts.3x</A></TD></TR>
+<TR><TD>set_form_page()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_59">Set_Page</A></TD><TD><A HREF="../man/form_page.3x.html">form_page.3x</A></TD></TR>
+<TR><TD>set_form_sub()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_29">Set_Sub_Window</A></TD><TD><A HREF="../man/form_win.3x.html">form_win.3x</A></TD></TR>
+<TR><TD>set_form_term()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_35">Set_Form_Term_Hook</A></TD><TD><A HREF="../man/form_hook.3x.html">form_hook.3x</A></TD></TR>
+<TR><TD>set_form_userptr</TD><TD><A HREF="terminal_interface-curses-forms-form_user_data__ads.htm#AFU_1">Set_User_Data</A></TD><TD><A HREF="../man/form_userptr.3x.html">form_userptr.3x</A></TD></TR>
+<TR><TD>set_form_win()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_27">Set_Window</A></TD><TD><A HREF="../man/form_win.3x.html">form_win.3x</A></TD></TR>
+<TR><TD>set_item_init()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_48">Set_Item_Init_Hook</A></TD><TD><A HREF="../man/menu_hook.3x.html">menu_hook.3x</A></TD></TR>
+<TR><TD>set_item_opts()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_7">Set_Options</A></TD><TD><A HREF="../man/mitem_opts.3x.html">mitem_opts.3x</A></TD></TR>
+<TR><TD>set_item_term()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_49">Set_Item_Term_Hook</A></TD><TD><A HREF="../man/menu_hook.3x.html">menu_hook.3x</A></TD></TR>
+<TR><TD>set_item_userptr</TD><TD><A HREF="terminal_interface-curses-menus-item_user_data__ads.htm#AFU_1">Set_User_Data</A></TD><TD><A HREF="../man/mitem_userptr.3x.html">mitem_userptr.3x</A></TD></TR>
+<TR><TD>set_item_value()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_4">Set_Value</A></TD><TD><A HREF="../man/mitem_value.3x.html">mitem_value.3x</A></TD></TR>
+<TR><TD>set_menu_back()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_34">Set_Background</A></TD><TD><A HREF="../man/menu_attributes.3x.html">menu_attributes.3x</A></TD></TR>
+<TR><TD>set_menu_fore()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_31">Set_Foreground</A></TD><TD><A HREF="../man/menu_attributes.3x.html">menu_attributes.3x</A></TD></TR>
+<TR><TD>set_menu_format()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_46">Set_Format</A></TD><TD><A HREF="../man/menu_format.3x.html">menu_format.3x</A></TD></TR>
+<TR><TD>set_menu_grey()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_37">Set_Grey</A></TD><TD><A HREF="../man/menu_attributes.3x.html">menu_attributes.3x</A></TD></TR>
+<TR><TD>set_menu_init()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_50">Set_Menu_Init_Hook</A></TD><TD><A HREF="../man/menu_hook.3x.html">menu_hook.3x</A></TD></TR>
+<TR><TD>set_menu_items()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_56">Redefine</A></TD><TD><A HREF="../man/menu_items.3x.html">menu_items.3x</A></TD></TR>
+<TR><TD>set_menu_mark()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_29">Set_Mark</A></TD><TD><A HREF="../man/menu_mark.3x.html">menu_mark.3x</A></TD></TR>
+<TR><TD>set_menu_opts()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_19">Set_Options</A></TD><TD><A HREF="../man/menu_opts.3x.html">menu_opts.3x</A></TD></TR>
+<TR><TD>set_menu_pad()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_40">Set_Pad_Character</A></TD><TD><A HREF="../man/menu_attributes.3x.html">menu_attributes.3x</A></TD></TR>
+<TR><TD>set_menu_pattern()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_44">Set_Pattern</A></TD><TD><A HREF="../man/menu_pattern.3x.html">menu_pattern.3x</A></TD></TR>
+<TR><TD>set_menu_spacing()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_42">Set_Spacing</A></TD><TD><A HREF="../man/menu_spacing.3x.html">menu_spacing.3x</A></TD></TR>
+<TR><TD>set_menu_sub()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_25">Set_Sub_Window</A></TD><TD><A HREF="../man/menu_win.3x.html">menu_win.3x</A></TD></TR>
+<TR><TD>set_menu_term()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_51">Set_Menu_Term_Hook</A></TD><TD><A HREF="../man/menu_hook.3x.html">menu_hook.3x</A></TD></TR>
+<TR><TD>set_menu_userptr</TD><TD><A HREF="terminal_interface-curses-menus-menu_user_data__ads.htm#AFU_1">Set_User_Data</A></TD><TD><A HREF="../man/menu_userptr.3x.html">menu_userptr.3x</A></TD></TR>
+<TR><TD>set_menu_win()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_23">Set_Window</A></TD><TD><A HREF="../man/menu_win.3x.html">menu_win.3x</A></TD></TR>
+<TR><TD>set_new_page()</TD><TD><A HREF="terminal_interface-curses-forms__ads.htm#AFU_62">Set_New_Page</A></TD><TD><A HREF="../man/form_new_page.3x.html">form_new_page.3x</A></TD></TR>
+<TR><TD>set_panel_userptr</TD><TD><A HREF="terminal_interface-curses-panels-user_data__ads.htm#AFU_1">Set_User_Data</A></TD><TD><A HREF="../man/panel.3x.html">panel.3x</A></TD></TR>
+<TR><TD>set_top_row()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_15">Set_Top_Row</A></TD><TD><A HREF="../man/mitem_current.3x.html">mitem_current.3x</A></TD></TR>
+<TR><TD>show_panel()</TD><TD><A HREF="terminal_interface-curses-panels__ads.htm#AFU_5">Show</A></TD><TD><A HREF="../man/panel.3x.html">panel.3x</A></TD></TR>
+<TR><TD>slk_attron()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_118">Switch_Soft_Label_Key_Attributes</A></TD><TD><A HREF="../man/curs_slk.3x.html">curs_slk.3x</A></TD></TR>
+<TR><TD>slk_attrset()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_119">Set_Soft_Label_Key_Attributes</A></TD><TD><A HREF="../man/curs_slk.3x.html">curs_slk.3x</A></TD></TR>
+<TR><TD>slk_attr()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_120">Get_Soft_Label_Key_Attributes</A></TD><TD><A HREF="../man/curs_slk.3x.html">curs_slk.3x</A></TD></TR>
+<TR><TD>slk_attr()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_121">Get_Soft_Label_Key_Attributes</A></TD><TD><A HREF="../man/curs_slk.3x.html">curs_slk.3x</A></TD></TR>
+<TR><TD>slk_clear()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_115">Clear_Soft_Label_Keys</A></TD><TD><A HREF="../man/curs_slk.3x.html">curs_slk.3x</A></TD></TR>
+<TR><TD>slk_color()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_122">Set_Soft_Label_Key_Color</A></TD><TD><A HREF="../man/curs_slk.3x.html">curs_slk.3x</A></TD></TR>
+<TR><TD>slk_init()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_109">Init_Soft_Label_Keys</A></TD><TD><A HREF="../man/curs_slk.3x.html">curs_slk.3x</A></TD></TR>
+<TR><TD>slk_label()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_113">Get_Soft_Label_Key</A></TD><TD><A HREF="../man/curs_slk.3x.html">curs_slk.3x</A></TD></TR>
+<TR><TD>slk_label()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_114">Get_Soft_Label_Key</A></TD><TD><A HREF="../man/curs_slk.3x.html">curs_slk.3x</A></TD></TR>
+<TR><TD>slk_noutrefresh()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_112">Refresh_Soft_Label_Keys_Without_Update</A></TD><TD><A HREF="../man/curs_slk.3x.html">curs_slk.3x</A></TD></TR>
+<TR><TD>slk_refresh()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_111">Refresh_Soft_Label_Key</A></TD><TD><A HREF="../man/curs_slk.3x.html">curs_slk.3x</A></TD></TR>
+<TR><TD>slk_restore()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_116">Restore_Soft_Label_Keys</A></TD><TD><A HREF="../man/curs_slk.3x.html">curs_slk.3x</A></TD></TR>
+<TR><TD>slk_set()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_110">Set_Soft_Label_Key</A></TD><TD><A HREF="../man/curs_slk.3x.html">curs_slk.3x</A></TD></TR>
+<TR><TD>slk_touch()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_117">Touch_Soft_Label_Keys</A></TD><TD><A HREF="../man/curs_slk.3x.html">curs_slk.3x</A></TD></TR>
+<TR><TD>standout()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_32">Standout</A></TD><TD><A HREF="../man/curs_attr.3x.html">curs_attr.3x</A></TD></TR>
+<TR><TD>start_color()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_141">Start_Color</A></TD><TD><A HREF="../man/curs_color.3x.html">curs_color.3x</A></TD></TR>
+<TR><TD>stdscr</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_1">Standard_Window</A></TD><TD><A HREF="../man/curs_initscr.3x.html">curs_initscr.3x</A></TD></TR>
+<TR><TD>subpad()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_90">Sub_Pad</A></TD><TD><A HREF="../man/curs_pad.3x.html">curs_pad.3x</A></TD></TR>
+<TR><TD>subwin()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_13">Sub_Window</A></TD><TD><A HREF="../man/curs_window.3x.html">curs_window.3x</A></TD></TR>
+<TR><TD>syncok()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_20">Set_Synch_Mode</A></TD><TD><A HREF="../man/curs_window.3x.html">curs_window.3x</A></TD></TR>
+<TR><TD>termattrs()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_136">Supported_Attributes</A></TD><TD><A HREF="../man/curs_termattrs.3x.html">curs_termattrs.3x</A></TD></TR>
+<TR><TD>termname()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_139">Terminal_Name</A></TD><TD><A HREF="../man/curs_termattrs.3x.html">curs_termattrs.3x</A></TD></TR>
+<TR><TD>termname()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_140">Terminal_Name</A></TD><TD><A HREF="../man/curs_termattrs.3x.html">curs_termattrs.3x</A></TD></TR>
+<TR><TD>top_panel()</TD><TD><A HREF="terminal_interface-curses-panels__ads.htm#AFU_4">Top</A></TD><TD><A HREF="../man/panel.3x.html">panel.3x</A></TD></TR>
+<TR><TD>top_row()</TD><TD><A HREF="terminal_interface-curses-menus__ads.htm#AFU_16">Top_Row</A></TD><TD><A HREF="../man/mitem_current.3x.html">mitem_current.3x</A></TD></TR>
+<TR><TD>touchline()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_75">Touch</A></TD><TD><A HREF="../man/curs_touch.3x.html">curs_touch.3x</A></TD></TR>
+<TR><TD>touchwin()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_74">Touch</A></TD><TD><A HREF="../man/curs_touch.3x.html">curs_touch.3x</A></TD></TR>
+<TR><TD>_tracef()</TD><TD><A HREF="terminal_interface-curses-trace__ads.htm#AFU_2">Trace_Put</A></TD><TD><A HREF="../man/curs_trace.3x.html">curs_trace.3x</A></TD></TR>
+<TR><TD>trace()</TD><TD><A HREF="terminal_interface-curses-trace__ads.htm#AFU_1">Trace_on</A></TD><TD><A HREF="../man/curs_trace.3x.html">curs_trace.3x</A></TD></TR>
+<TR><TD>unctrl()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_127">Un_Control</A></TD><TD><A HREF="../man/curs_util.3x.html">curs_util.3x</A></TD></TR>
+<TR><TD>unctrl()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_128">Un_Control</A></TD><TD><A HREF="../man/curs_util.3x.html">curs_util.3x</A></TD></TR>
+<TR><TD>ungetch()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_30">Undo_Keystroke</A></TD><TD><A HREF="../man/curs_getch.3x.html">curs_getch.3x</A></TD></TR>
+<TR><TD>ungetmouse()</TD><TD><A HREF="terminal_interface-curses-mouse__ads.htm#AFU_3">Unget_Mouse</A></TD><TD><A HREF="../man/curs_mouse.3x.html">curs_mouse.3x</A></TD></TR>
+<TR><TD>untouchwin()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_73">Untouch</A></TD><TD><A HREF="../man/curs_touch.3x.html">curs_touch.3x</A></TD></TR>
+<TR><TD>update_panels()</TD><TD><A HREF="terminal_interface-curses-panels__ads.htm#AFU_6">Update_Panels</A></TD><TD><A HREF="../man/panel.3x.html">panel.3x</A></TD></TR>
+<TR><TD>use_default_colors()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_155">Use_Default_Colors</A></TD><TD><A HREF="../man/default_colors.3x.html">default_colors.3x</A></TD></TR>
+<TR><TD>use_extended_names()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_158">Use_Extended_Names</A></TD><TD><A HREF="../man/curs_extend.3x.html">curs_extend.3x</A></TD></TR>
+<TR><TD>waddchnstr()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_23">Add</A></TD><TD><A HREF="../man/curs_addchstr.3x.html">curs_addchstr.3x</A></TD></TR>
+<TR><TD>waddch()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_8">Add</A></TD><TD><A HREF="../man/curs_addch.3x.html">curs_addch.3x</A></TD></TR>
+<TR><TD>waddnstr()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_21">Add</A></TD><TD><A HREF="../man/curs_addstr.3x.html">curs_addstr.3x</A></TD></TR>
+<TR><TD>wattr_get()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_35">Get_Character_Attributes</A></TD><TD><A HREF="../man/curs_attr.3x.html">curs_attr.3x</A></TD></TR>
+<TR><TD>wattr_get()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_36">Get_Character_Attribute</A></TD><TD><A HREF="../man/curs_attr.3x.html">curs_attr.3x</A></TD></TR>
+<TR><TD>wattron()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_33">Switch_Character_Attribute</A></TD><TD><A HREF="../man/curs_attr.3x.html">curs_attr.3x</A></TD></TR>
+<TR><TD>wattrset()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_34">Set_Character_Attributes</A></TD><TD><A HREF="../man/curs_attr.3x.html">curs_attr.3x</A></TD></TR>
+<TR><TD>wbkgdget()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_72">Get_Background</A></TD><TD><A HREF="../man/curs_bkgd.3x.html">curs_bkgd.3x</A></TD></TR>
+<TR><TD>wbkgdset()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_70">Set_Background</A></TD><TD><A HREF="../man/curs_bkgd.3x.html">curs_bkgd.3x</A></TD></TR>
+<TR><TD>wbkgd()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_71">Change_Background</A></TD><TD><A HREF="../man/curs_bkgd.3x.html">curs_bkgd.3x</A></TD></TR>
+<TR><TD>wborder()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_25">Border</A></TD><TD><A HREF="../man/curs_border.3x.html">curs_border.3x</A></TD></TR>
+<TR><TD>wchgat()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_38">Change_Attributes</A></TD><TD><A HREF="../man/curs_attr.3x.html">curs_attr.3x</A></TD></TR>
+<TR><TD>wclear()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_67">Clear</A></TD><TD><A HREF="../man/curs_clear.3x.html">curs_clear.3x</A></TD></TR>
+<TR><TD>wclrtobot()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_68">Clear_To_End_Of_Screen</A></TD><TD><A HREF="../man/curs_clear.3x.html">curs_clear.3x</A></TD></TR>
+<TR><TD>wclrtoeol()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_69">Clear_To_End_Of_Line</A></TD><TD><A HREF="../man/curs_clear.3x.html">curs_clear.3x</A></TD></TR>
+<TR><TD>wcolor_set()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_37">Set_Color</A></TD><TD><A HREF="../man/curs_attr.3x.html">curs_attr.3x</A></TD></TR>
+<TR><TD>wdelch()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_95">Delete_Character</A></TD><TD><A HREF="../man/curs_delch.3x.html">curs_delch.3x</A></TD></TR>
+<TR><TD>wdeleteln()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_83">Delete_Line</A></TD><TD><A HREF="../man/curs_deleteln.3x.html">curs_deleteln.3x</A></TD></TR>
+<TR><TD>wechochar()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_10">Add_With_Immediate_Echo</A></TD><TD><A HREF="../man/curs_addch.3x.html">curs_addch.3x</A></TD></TR>
+<TR><TD>wenclose()</TD><TD><A HREF="terminal_interface-curses-mouse__ads.htm#AFU_4">Enclosed_In_Window</A></TD><TD><A HREF="../man/curs_mouse.3x.html">curs_mouse.3x</A></TD></TR>
+<TR><TD>werase()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_66">Erase</A></TD><TD><A HREF="../man/curs_clear.3x.html">curs_clear.3x</A></TD></TR>
+<TR><TD>wgetch()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_29">Get_Keystroke</A></TD><TD><A HREF="../man/curs_getch.3x.html">curs_getch.3x</A></TD></TR>
+<TR><TD>wgetnstr()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_107">Get</A></TD><TD><A HREF="../man/curs_getstr.3x.html">curs_getstr.3x</A></TD></TR>
+<TR><TD>whline()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_27">Horizontal_Line</A></TD><TD><A HREF="../man/curs_border.3x.html">curs_border.3x</A></TD></TR>
+<TR><TD>winchnstr()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_105">Peek</A></TD><TD><A HREF="../man/curs_inchstr.3x.html">curs_inchstr.3x</A></TD></TR>
+<TR><TD>winch()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_97">Peek</A></TD><TD><A HREF="../man/curs_inch.3x.html">curs_inch.3x</A></TD></TR>
+<TR><TD>winnstr()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_103">Peek</A></TD><TD><A HREF="../man/curs_instr.3x.html">curs_instr.3x</A></TD></TR>
+<TR><TD>winsch()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_99">Insert</A></TD><TD><A HREF="../man/curs_insch.3x.html">curs_insch.3x</A></TD></TR>
+<TR><TD>winsdelln()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_82">Insert_Delete_Lines</A></TD><TD><A HREF="../man/curs_deleteln.3x.html">curs_deleteln.3x</A></TD></TR>
+<TR><TD>winsertln()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_84">Insert_Line</A></TD><TD><A HREF="../man/curs_deleteln.3x.html">curs_deleteln.3x</A></TD></TR>
+<TR><TD>winsnstr()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_101">Insert</A></TD><TD><A HREF="../man/curs_insstr.3x.html">curs_insstr.3x</A></TD></TR>
+<TR><TD>wmove()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_7">Move_Cursor</A></TD><TD><A HREF="../man/curs_move.3x.html">curs_move.3x</A></TD></TR>
+<TR><TD>wnoutrefresh()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_63">Refresh_Without_Update</A></TD><TD><A HREF="../man/curs_refresh.3x.html">curs_refresh.3x</A></TD></TR>
+<TR><TD>wredrawln()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_65">Redraw</A></TD><TD><A HREF="../man/curs_refresh.3x.html">curs_refresh.3x</A></TD></TR>
+<TR><TD>wrefresh()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_62">Refresh</A></TD><TD><A HREF="../man/curs_refresh.3x.html">curs_refresh.3x</A></TD></TR>
+<TR><TD>wresize()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_164">Resize</A></TD><TD><A HREF="../man/wresize.3x.html">wresize.3x</A></TD></TR>
+<TR><TD>wscrl()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_94">Scroll</A></TD><TD><A HREF="../man/curs_scroll.3x.html">curs_scroll.3x</A></TD></TR>
+<TR><TD>wsetscrreg()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_60">Set_Scroll_Region</A></TD><TD><A HREF="../man/curs_outopts.3x.html">curs_outopts.3x</A></TD></TR>
+<TR><TD>wsyncdown()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_19">Synchronize_Downwards</A></TD><TD><A HREF="../man/curs_window.3x.html">curs_window.3x</A></TD></TR>
+<TR><TD>wsyncup()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_18">Synchronize_Upwards</A></TD><TD><A HREF="../man/curs_window.3x.html">curs_window.3x</A></TD></TR>
+<TR><TD>wtimeout()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_51">Set_Timeout_Mode</A></TD><TD><A HREF="../man/curs_inopts.3x.html">curs_inopts.3x</A></TD></TR>
+<TR><TD>wtouchln()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_76">Change_Line_Status</A></TD><TD><A HREF="../man/curs_touch.3x.html">curs_touch.3x</A></TD></TR>
+<TR><TD>wvline()</TD><TD><A HREF="terminal_interface-curses__ads.htm#AFU_28">Vertical_Line</A></TD><TD><A HREF="../man/curs_border.3x.html">curs_border.3x</A></TD></TR>
+</table></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-aux__adb.htm b/doc/html/ada/terminal_interface-curses-aux__adb.htm
new file mode 100644
index 0000000..61ea3de
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-aux__adb.htm
@@ -0,0 +1,135 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-aux.adb</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-aux.adb </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                      Terminal_Interface.Curses.Aux                       --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 B O D Y                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.12 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>package</b> <b>body</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<span class="symbol"><a name="ref_42_40" href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a></span> <b>is</b>
+   <span class="comment"><em>--</em></span>
+   <span class="comment"><em>--  Some helpers</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_45_14" href="terminal_interface-curses-aux__ads.htm#ref_91_14">Fill_String</a></span> (<span class="symbol"><a name="ref_45_27" href="terminal_interface-curses-aux__ads.htm#ref_91_27">Cp</a></span>  : chars_ptr;
+                          <span class="symbol"><a name="ref_46_27" href="terminal_interface-curses-aux__ads.htm#ref_92_27">Str</a></span> : <b>out</b> String)
+   <b>is</b>
+      <span class="comment"><em>--  Fill the string with the characters referenced by the</em></span>
+      <span class="comment"><em>--  chars_ptr.</em></span>
+      <span class="comment"><em>--</em></span>
+      <span class="symbol"><a name="ref_51_7">Len</a></span> : Natural;
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-aux__ads.htm#ref_91_27">Cp</a> /= Null_Ptr <b>then</b>
+         <a href="terminal_interface-curses-aux__adb.htm#ref_51_7">Len</a> := Natural (Strlen (<a href="terminal_interface-curses-aux__ads.htm#ref_91_27">Cp</a>));
+         <b>if</b> <a href="terminal_interface-curses-aux__ads.htm#ref_92_27">Str</a>'Length &lt; <a href="terminal_interface-curses-aux__adb.htm#ref_51_7">Len</a> <b>then</b>
+            <b>raise</b> Constraint_Error;
+         <b>end</b> <b>if</b>;
+         <b>declare</b>
+            <span class="symbol"><a name="ref_59_13">S</a></span> : String (1 .. <a href="terminal_interface-curses-aux__adb.htm#ref_51_7">Len</a>);
+         <b>begin</b>
+            <a href="terminal_interface-curses-aux__adb.htm#ref_59_13">S</a> := Value (<a href="terminal_interface-curses-aux__ads.htm#ref_91_27">Cp</a>);
+            <a href="terminal_interface-curses-aux__ads.htm#ref_92_27">Str</a> (<a href="terminal_interface-curses-aux__ads.htm#ref_92_27">Str</a>'First .. (<a href="terminal_interface-curses-aux__ads.htm#ref_92_27">Str</a>'First + <a href="terminal_interface-curses-aux__adb.htm#ref_51_7">Len</a> - 1)) := <a href="terminal_interface-curses-aux__adb.htm#ref_59_13">S</a> (<a href="terminal_interface-curses-aux__adb.htm#ref_59_13">S</a>'<b>Range</b>);
+         <b>end</b>;
+      <b>else</b>
+         <a href="terminal_interface-curses-aux__adb.htm#ref_51_7">Len</a> := 0;
+      <b>end</b> <b>if</b>;
+
+      <b>if</b> <a href="terminal_interface-curses-aux__adb.htm#ref_51_7">Len</a> &lt; <a href="terminal_interface-curses-aux__ads.htm#ref_92_27">Str</a>'Length <b>then</b>
+         <a href="terminal_interface-curses-aux__ads.htm#ref_92_27">Str</a> ((<a href="terminal_interface-curses-aux__ads.htm#ref_92_27">Str</a>'First + <a href="terminal_interface-curses-aux__adb.htm#ref_51_7">Len</a>) .. <a href="terminal_interface-curses-aux__ads.htm#ref_92_27">Str</a>'Last) := (<b>others</b> =&gt; ' ');
+      <b>end</b> <b>if</b>;
+
+   <b>end</b> <a href="terminal_interface-curses-aux__ads.htm#ref_91_14">Fill_String</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_74_13" href="terminal_interface-curses-aux__ads.htm#ref_96_13">Fill_String</a></span> (<span class="symbol"><a name="ref_74_26" href="terminal_interface-curses-aux__ads.htm#ref_96_26">Cp</a></span> : chars_ptr) <b>return</b> String
+   <b>is</b>
+      <span class="symbol"><a name="ref_76_7">Len</a></span> : Natural;
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-aux__ads.htm#ref_96_26">Cp</a> /= Null_Ptr <b>then</b>
+         <a href="terminal_interface-curses-aux__adb.htm#ref_76_7">Len</a> := Natural (Strlen (<a href="terminal_interface-curses-aux__ads.htm#ref_96_26">Cp</a>));
+         <b>if</b> <a href="terminal_interface-curses-aux__adb.htm#ref_76_7">Len</a> = 0 <b>then</b>
+            <b>return</b> "";
+         <b>else</b>
+            <b>declare</b>
+               <span class="symbol"><a name="ref_84_16">S</a></span> : String (1 .. <a href="terminal_interface-curses-aux__adb.htm#ref_76_7">Len</a>);
+            <b>begin</b>
+               <a href="terminal_interface-curses-aux__ads.htm#ref_91_14">Fill_String</a> (<a href="terminal_interface-curses-aux__ads.htm#ref_96_26">Cp</a>, <a href="terminal_interface-curses-aux__adb.htm#ref_84_16">S</a>);
+               <b>return</b> <a href="terminal_interface-curses-aux__adb.htm#ref_84_16">S</a>;
+            <b>end</b>;
+         <b>end</b> <b>if</b>;
+      <b>else</b>
+         <b>return</b> "";
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-aux__ads.htm#ref_96_13">Fill_String</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_95_14" href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a></span> (<span class="symbol"><a name="ref_95_29" href="terminal_interface-curses-aux__ads.htm#ref_87_29">Code</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>)
+   <b>is</b>
+   <b>begin</b>
+      <b>case</b> <a href="terminal_interface-curses-aux__ads.htm#ref_87_29">Code</a> <b>is</b>
+         <b>when</b> <a href="terminal_interface-curses-aux__ads.htm#ref_85_7">E_Ok</a>              =&gt; <b>null</b>;
+         <b>when</b> <a href="terminal_interface-curses-aux__ads.htm#ref_84_7">E_System_Error</a>    =&gt; <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_528_4">Eti_System_Error</a>;
+         <b>when</b> <a href="terminal_interface-curses-aux__ads.htm#ref_83_7">E_Bad_Argument</a>    =&gt; <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_529_4">Eti_Bad_Argument</a>;
+         <b>when</b> <a href="terminal_interface-curses-aux__ads.htm#ref_82_7">E_Posted</a>          =&gt; <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_530_4">Eti_Posted</a>;
+         <b>when</b> <a href="terminal_interface-curses-aux__ads.htm#ref_81_7">E_Connected</a>       =&gt; <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_531_4">Eti_Connected</a>;
+         <b>when</b> <a href="terminal_interface-curses-aux__ads.htm#ref_80_7">E_Bad_State</a>       =&gt; <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_532_4">Eti_Bad_State</a>;
+         <b>when</b> <a href="terminal_interface-curses-aux__ads.htm#ref_79_7">E_No_Room</a>         =&gt; <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_533_4">Eti_No_Room</a>;
+         <b>when</b> <a href="terminal_interface-curses-aux__ads.htm#ref_78_7">E_Not_Posted</a>      =&gt; <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_534_4">Eti_Not_Posted</a>;
+         <b>when</b> <a href="terminal_interface-curses-aux__ads.htm#ref_77_7">E_Unknown_Command</a> =&gt; <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_535_4">Eti_Unknown_Command</a>;
+         <b>when</b> <a href="terminal_interface-curses-aux__ads.htm#ref_76_7">E_No_Match</a>        =&gt; <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_536_4">Eti_No_Match</a>;
+         <b>when</b> <a href="terminal_interface-curses-aux__ads.htm#ref_75_7">E_Not_Selectable</a>  =&gt; <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_537_4">Eti_Not_Selectable</a>;
+         <b>when</b> <a href="terminal_interface-curses-aux__ads.htm#ref_74_7">E_Not_Connected</a>   =&gt; <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_538_4">Eti_Not_Connected</a>;
+         <b>when</b> <a href="terminal_interface-curses-aux__ads.htm#ref_73_7">E_Request_Denied</a>  =&gt; <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_539_4">Eti_Request_Denied</a>;
+         <b>when</b> <a href="terminal_interface-curses-aux__ads.htm#ref_72_7">E_Invalid_Field</a>   =&gt; <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_540_4">Eti_Invalid_Field</a>;
+         <b>when</b> <a href="terminal_interface-curses-aux__ads.htm#ref_71_7">E_Current</a>         =&gt; <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_541_4">Eti_Current</a>;
+      <b>end</b> <b>case</b>;
+   <b>end</b> <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a>;
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-aux__ads.htm b/doc/html/ada/terminal_interface-curses-aux__ads.htm
new file mode 100644
index 0000000..b539719
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-aux__ads.htm
@@ -0,0 +1,136 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-aux.ads</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-aux.ads </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                       Terminal_Interface.Curses.Aux                      --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 S P E C                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2018,2020 Thomas E. Dickey                                     --</em></span>
+<span class="comment"><em>-- Copyright 1998-2011,2014 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.25 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>with</b> System;
+<b>with</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C;
+<b>with</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.Strings; <b>use</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.Strings;
+
+<b>package</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<span class="symbol"><a name="ref_46_35" href="terminal_interface-curses-aux__adb.htm#ref_42_40">Aux</a></span> <b>is</b>
+   <b>pragma</b> Preelaborate (<a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>);
+
+   <b>subtype</b> <span class="symbol"><a name="ref_49_12">C_Int</a></span>      <b>is</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.int;
+   <b>subtype</b> <span class="symbol"><a name="ref_50_12">C_Short</a></span>    <b>is</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.short;
+   <b>subtype</b> <span class="symbol"><a name="ref_51_12">C_Long_Int</a></span> <b>is</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.long;
+   <b>subtype</b> <span class="symbol"><a name="ref_52_12">C_Size_T</a></span>   <b>is</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.size_t;
+   <b>subtype</b> <span class="symbol"><a name="ref_53_12">C_UInt</a></span>     <b>is</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.unsigned;
+   <b>subtype</b> <span class="symbol"><a name="ref_54_12">C_ULong</a></span>    <b>is</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.unsigned_long;
+   <b>subtype</b> <span class="symbol"><a name="ref_55_12">C_Char_Ptr</a></span> <b>is</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.Strings.chars_ptr;
+   <b>type</b>    <span class="symbol"><a name="ref_56_12">C_Void_Ptr</a></span> <b>is</b> <b>new</b> System.Address;
+
+   <span class="comment"><em>--  This is how those constants are defined in ncurses. I see them also</em></span>
+   <span class="comment"><em>--  exactly like this in all ETI implementations I ever tested. So it</em></span>
+   <span class="comment"><em>--  could be that this is quite general, but please check with your curses.</em></span>
+   <span class="comment"><em>--  This is critical, because curses sometime mixes Boolean returns with</em></span>
+   <span class="comment"><em>--  returning an error status.</em></span>
+   <span class="symbol"><a name="ref_63_4">Curses_Ok</a></span>    : <b>constant</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_12_4">OK</a>;
+   <span class="symbol"><a name="ref_64_4">Curses_Err</a></span>   : <b>constant</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_13_4">ERR</a>;
+
+   <span class="symbol"><a name="ref_66_4">Curses_True</a></span>  : <b>constant</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_15_4">TRUE</a>;
+   <span class="symbol"><a name="ref_67_4">Curses_False</a></span> : <b>constant</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_16_4">FALSE</a>;
+
+   <span class="comment"><em>--  Eti_Error: type for error codes returned by the menu and form subsystem</em></span>
+   <b>type</b> <span class="symbol"><a name="ref_70_9" href="terminal_interface-curses-aux__ads.htm#ref_46_35">Eti_Error</a></span> <b>is</b>
+     (<span class="symbol"><a name="ref_71_7">E_Current</a></span>,
+      <span class="symbol"><a name="ref_72_7">E_Invalid_Field</a></span>,
+      <span class="symbol"><a name="ref_73_7">E_Request_Denied</a></span>,
+      <span class="symbol"><a name="ref_74_7">E_Not_Connected</a></span>,
+      <span class="symbol"><a name="ref_75_7">E_Not_Selectable</a></span>,
+      <span class="symbol"><a name="ref_76_7">E_No_Match</a></span>,
+      <span class="symbol"><a name="ref_77_7">E_Unknown_Command</a></span>,
+      <span class="symbol"><a name="ref_78_7">E_Not_Posted</a></span>,
+      <span class="symbol"><a name="ref_79_7">E_No_Room</a></span>,
+      <span class="symbol"><a name="ref_80_7">E_Bad_State</a></span>,
+      <span class="symbol"><a name="ref_81_7">E_Connected</a></span>,
+      <span class="symbol"><a name="ref_82_7">E_Posted</a></span>,
+      <span class="symbol"><a name="ref_83_7">E_Bad_Argument</a></span>,
+      <span class="symbol"><a name="ref_84_7">E_System_Error</a></span>,
+      <span class="symbol"><a name="ref_85_7">E_Ok</a></span>);
+
+   <b>procedure</b> <span class="symbol"><a name="ref_87_14" href="terminal_interface-curses-aux__adb.htm#ref_95_14">Eti_Exception</a></span> (<span class="symbol"><a name="ref_87_29" href="terminal_interface-curses-aux__adb.htm#ref_95_29">Code</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>);
+   <span class="comment"><em>--  Do nothing if Code = E_Ok.</em></span>
+   <span class="comment"><em>--  Else dispatch the error code and raise the appropriate exception.</em></span>
+
+   <b>procedure</b> <span class="symbol"><a name="ref_91_14" href="terminal_interface-curses-aux__adb.htm#ref_45_14">Fill_String</a></span> (<span class="symbol"><a name="ref_91_27" href="terminal_interface-curses-aux__adb.htm#ref_45_27">Cp</a></span>  : chars_ptr;
+                          <span class="symbol"><a name="ref_92_27" href="terminal_interface-curses-aux__adb.htm#ref_46_27">Str</a></span> : <b>out</b> String);
+   <span class="comment"><em>--  Fill the Str parameter with the string denoted by the chars_ptr</em></span>
+   <span class="comment"><em>--  C-Style string.</em></span>
+
+   <b>function</b> <span class="symbol"><a name="ref_96_13" href="terminal_interface-curses-aux__adb.htm#ref_74_13">Fill_String</a></span> (<span class="symbol"><a name="ref_96_26" href="terminal_interface-curses-aux__adb.htm#ref_74_26">Cp</a></span> : chars_ptr) <b>return</b> String;
+   <span class="comment"><em>--  Same but as function.</em></span>
+
+<b>private</b>
+   <b>for</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>'Size <b>use</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>'Size;
+   <b>pragma</b> Convention (C, <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>);
+   <b>for</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a> <b>use</b>
+     (<a href="terminal_interface-curses-aux__ads.htm#ref_71_7">E_Current</a>         =&gt; <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_94_4">E_CURRENT</a>,
+      <a href="terminal_interface-curses-aux__ads.htm#ref_72_7">E_Invalid_Field</a>   =&gt; <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_93_4">E_INVALID_FIELD</a>,
+      <a href="terminal_interface-curses-aux__ads.htm#ref_73_7">E_Request_Denied</a>  =&gt; <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_92_4">E_REQUEST_DENIED</a>,
+      <a href="terminal_interface-curses-aux__ads.htm#ref_74_7">E_Not_Connected</a>   =&gt; <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_91_4">E_NOT_CONNECTED</a>,
+      <a href="terminal_interface-curses-aux__ads.htm#ref_75_7">E_Not_Selectable</a>  =&gt; <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_90_4">E_NOT_SELECTABLE</a>,
+      <a href="terminal_interface-curses-aux__ads.htm#ref_76_7">E_No_Match</a>        =&gt; <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_89_4">E_NO_MATCH</a>,
+      <a href="terminal_interface-curses-aux__ads.htm#ref_77_7">E_Unknown_Command</a> =&gt; <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_88_4">E_UNKNOWN_COMMAND</a>,
+      <a href="terminal_interface-curses-aux__ads.htm#ref_78_7">E_Not_Posted</a>      =&gt; <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_87_4">E_NOT_POSTED</a>,
+      <a href="terminal_interface-curses-aux__ads.htm#ref_79_7">E_No_Room</a>         =&gt; <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_86_4">E_NO_ROOM</a>,
+      <a href="terminal_interface-curses-aux__ads.htm#ref_80_7">E_Bad_State</a>       =&gt; <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_85_4">E_BAD_STATE</a>,
+      <a href="terminal_interface-curses-aux__ads.htm#ref_81_7">E_Connected</a>       =&gt; <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_84_4">E_CONNECTED</a>,
+      <a href="terminal_interface-curses-aux__ads.htm#ref_82_7">E_Posted</a>          =&gt; <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_83_4">E_POSTED</a>,
+      <a href="terminal_interface-curses-aux__ads.htm#ref_83_7">E_Bad_Argument</a>    =&gt; <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_82_4">E_BAD_ARGUMENT</a>,
+      <a href="terminal_interface-curses-aux__ads.htm#ref_84_7">E_System_Error</a>    =&gt; <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_81_4">E_SYSTEM_ERROR</a>,
+      <a href="terminal_interface-curses-aux__ads.htm#ref_85_7">E_Ok</a>              =&gt; <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_80_4">E_OK</a>);
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-forms-field_types-alpha__adb.htm b/doc/html/ada/terminal_interface-curses-forms-field_types-alpha__adb.htm
new file mode 100644
index 0000000..6c51ab7
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-forms-field_types-alpha__adb.htm
@@ -0,0 +1,77 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-forms-field_types-alpha.adb</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-forms-field_types-alpha.adb </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--              Terminal_Interface.Curses.Forms.Field_Types.Alpha           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 B O D Y                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1999-2011,2014 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.14 @</em></span>
+<span class="comment"><em>--  @Date: 2020/02/02 23:34:34 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>with</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>; <b>use</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>;
+
+<b>package</b> <b>body</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<span class="symbol"><a name="ref_45_58" href="terminal_interface-curses-forms-field_types-alpha__ads.htm#ref_42_53">Alpha</a></span> <b>is</b>
+
+   <b>procedure</b> <span class="symbol"><a name="ref_47_14" href="terminal_interface-curses-forms-field_types-alpha__ads.htm#ref_50_14">Set_Field_Type</a></span> (<span class="symbol"><a name="ref_47_30" href="terminal_interface-curses-forms-field_types-alpha__ads.htm#ref_50_30">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                             <span class="symbol"><a name="ref_48_30" href="terminal_interface-curses-forms-field_types-alpha__ads.htm#ref_51_30">Typ</a></span> : <a href="terminal_interface-curses-forms-field_types-alpha__ads.htm#ref_45_9">Alpha_Field</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_50_16">Set_Fld_Type</a></span> (<span class="symbol"><a name="ref_50_30">F</a></span>    : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a> := <a href="terminal_interface-curses-forms-field_types-alpha__ads.htm#ref_50_30">Fld</a>;
+                             <span class="symbol"><a name="ref_51_30">Arg1</a></span> : <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_47_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Fld_Type, "set_field_type_alpha");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms-field_types-alpha__adb.htm#ref_50_16">Set_Fld_Type</a> (<a href="terminal_interface-curses-forms-field_types-alpha__adb.htm#ref_51_30">Arg1</a> =&gt; <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_47_12">C_Int</a> (<a href="terminal_interface-curses-forms-field_types-alpha__ads.htm#ref_51_30">Typ</a>.<a href="terminal_interface-curses-forms-field_types-alpha__ads.htm#ref_47_9">Minimum_Field_Width</a>)));
+      <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_152_14">Wrap_Builtin</a> (<a href="terminal_interface-curses-forms-field_types-alpha__ads.htm#ref_50_30">Fld</a>, <a href="terminal_interface-curses-forms-field_types-alpha__ads.htm#ref_51_30">Typ</a>);
+   <b>end</b> <a href="terminal_interface-curses-forms-field_types-alpha__ads.htm#ref_50_14">Set_Field_Type</a>;
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<a href="terminal_interface-curses-forms-field_types-alpha__ads.htm#ref_42_53">Alpha</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-forms-field_types-alpha__ads.htm b/doc/html/ada/terminal_interface-curses-forms-field_types-alpha__ads.htm
new file mode 100644
index 0000000..88ad718
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-forms-field_types-alpha__ads.htm
@@ -0,0 +1,72 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-forms-field_types-alpha.ads</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-forms-field_types-alpha.ads </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--              Terminal_Interface.Curses.Forms.Field_Types.Alpha           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 S P E C                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.13 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>package</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<span class="symbol"><a name="ref_42_53" href="terminal_interface-curses-forms-field_types-alpha__adb.htm#ref_45_58">Alpha</a></span> <b>is</b>
+   <b>pragma</b> Preelaborate (<a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<a href="terminal_interface-curses-forms-field_types-alpha__ads.htm#ref_42_53">Alpha</a>);
+
+   <b>type</b> <span class="symbol"><a name="ref_45_9">Alpha_Field</a></span> <b>is</b> <b>new</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_53_9">Field_Type</a>
+     <b>with</b> <b>record</b>
+        <span class="symbol"><a name="ref_47_9">Minimum_Field_Width</a></span> : Natural := 0;
+     <b>end</b> <b>record</b>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_50_14" href="terminal_interface-curses-forms-field_types-alpha__adb.htm#ref_47_14">Set_Field_Type</a></span> (<span class="symbol"><a name="ref_50_30" href="terminal_interface-curses-forms-field_types-alpha__adb.htm#ref_47_30">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                             <span class="symbol"><a name="ref_51_30" href="terminal_interface-curses-forms-field_types-alpha__adb.htm#ref_48_30">Typ</a></span> : <a href="terminal_interface-curses-forms-field_types-alpha__ads.htm#ref_45_9">Alpha_Field</a>);
+   <b>pragma</b> Inline (Set_Field_Type);
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<a href="terminal_interface-curses-forms-field_types-alpha__ads.htm#ref_42_53">Alpha</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-forms-field_types-alphanumeric__adb.htm b/doc/html/ada/terminal_interface-curses-forms-field_types-alphanumeric__adb.htm
new file mode 100644
index 0000000..7e759e6
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-forms-field_types-alphanumeric__adb.htm
@@ -0,0 +1,77 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-forms-field_types-alphanumeric.adb</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-forms-field_types-alphanumeric.adb </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--          Terminal_Interface.Curses.Forms.Field_Types.AlphaNumeric        --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 B O D Y                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1999-2011,2014 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.14 @</em></span>
+<span class="comment"><em>--  @Date: 2020/02/02 23:34:34 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>with</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>; <b>use</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>;
+
+<b>package</b> <b>body</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<span class="symbol"><a name="ref_45_58" href="terminal_interface-curses-forms-field_types-alphanumeric__ads.htm#ref_42_53">AlphaNumeric</a></span> <b>is</b>
+
+   <b>procedure</b> <span class="symbol"><a name="ref_47_14" href="terminal_interface-curses-forms-field_types-alphanumeric__ads.htm#ref_51_14">Set_Field_Type</a></span> (<span class="symbol"><a name="ref_47_30" href="terminal_interface-curses-forms-field_types-alphanumeric__ads.htm#ref_51_30">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                             <span class="symbol"><a name="ref_48_30" href="terminal_interface-curses-forms-field_types-alphanumeric__ads.htm#ref_52_30">Typ</a></span> : <a href="terminal_interface-curses-forms-field_types-alphanumeric__ads.htm#ref_46_9">AlphaNumeric_Field</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_50_16">Set_Fld_Type</a></span> (<span class="symbol"><a name="ref_50_30">F</a></span>    : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a> := <a href="terminal_interface-curses-forms-field_types-alphanumeric__ads.htm#ref_51_30">Fld</a>;
+                             <span class="symbol"><a name="ref_51_30">Arg1</a></span> : <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_47_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Fld_Type, "set_field_type_alnum");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms-field_types-alphanumeric__adb.htm#ref_50_16">Set_Fld_Type</a> (<a href="terminal_interface-curses-forms-field_types-alphanumeric__adb.htm#ref_51_30">Arg1</a> =&gt; <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_47_12">C_Int</a> (<a href="terminal_interface-curses-forms-field_types-alphanumeric__ads.htm#ref_52_30">Typ</a>.<a href="terminal_interface-curses-forms-field_types-alphanumeric__ads.htm#ref_48_9">Minimum_Field_Width</a>)));
+      <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_152_14">Wrap_Builtin</a> (<a href="terminal_interface-curses-forms-field_types-alphanumeric__ads.htm#ref_51_30">Fld</a>, <a href="terminal_interface-curses-forms-field_types-alphanumeric__ads.htm#ref_52_30">Typ</a>);
+   <b>end</b> <a href="terminal_interface-curses-forms-field_types-alphanumeric__ads.htm#ref_51_14">Set_Field_Type</a>;
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<a href="terminal_interface-curses-forms-field_types-alphanumeric__ads.htm#ref_42_53">AlphaNumeric</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-forms-field_types-alphanumeric__ads.htm b/doc/html/ada/terminal_interface-curses-forms-field_types-alphanumeric__ads.htm
new file mode 100644
index 0000000..73cdb40
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-forms-field_types-alphanumeric__ads.htm
@@ -0,0 +1,73 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-forms-field_types-alphanumeric.ads</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-forms-field_types-alphanumeric.ads </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--          Terminal_Interface.Curses.Forms.Field_Types.AlphaNumeric        --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 S P E C                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.13 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>package</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<span class="symbol"><a name="ref_42_53" href="terminal_interface-curses-forms-field_types-alphanumeric__adb.htm#ref_45_58">AlphaNumeric</a></span> <b>is</b>
+   <b>pragma</b> Preelaborate
+     (<a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<a href="terminal_interface-curses-forms-field_types-alphanumeric__ads.htm#ref_42_53">AlphaNumeric</a>);
+
+   <b>type</b> <span class="symbol"><a name="ref_46_9">AlphaNumeric_Field</a></span> <b>is</b> <b>new</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_53_9">Field_Type</a>
+     <b>with</b> <b>record</b>
+        <span class="symbol"><a name="ref_48_9">Minimum_Field_Width</a></span> : Natural := 0;
+     <b>end</b> <b>record</b>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_51_14" href="terminal_interface-curses-forms-field_types-alphanumeric__adb.htm#ref_47_14">Set_Field_Type</a></span> (<span class="symbol"><a name="ref_51_30" href="terminal_interface-curses-forms-field_types-alphanumeric__adb.htm#ref_47_30">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                             <span class="symbol"><a name="ref_52_30" href="terminal_interface-curses-forms-field_types-alphanumeric__adb.htm#ref_48_30">Typ</a></span> : <a href="terminal_interface-curses-forms-field_types-alphanumeric__ads.htm#ref_46_9">AlphaNumeric_Field</a>);
+   <b>pragma</b> Inline (Set_Field_Type);
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<a href="terminal_interface-curses-forms-field_types-alphanumeric__ads.htm#ref_42_53">AlphaNumeric</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-forms-field_types-enumeration-ada__adb.htm b/doc/html/ada/terminal_interface-curses-forms-field_types-enumeration-ada__adb.htm
new file mode 100644
index 0000000..acd1729
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-forms-field_types-enumeration-ada__adb.htm
@@ -0,0 +1,100 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-forms-field_types-enumeration-ada.adb</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-forms-field_types-enumeration-ada.adb </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--         Terminal_Interface.Curses.Forms.Field_Types.Enumeration.Ada      --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 B O D Y                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1999-2004,2011 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.12 @</em></span>
+<span class="comment"><em>--  @Date: 2020/02/02 23:34:34 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>with</b> Ada.Characters.Handling; <b>use</b> Ada.Characters.Handling;
+
+<b>package</b> <b>body</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_44_53">Enumeration</a>.<span class="symbol"><a name="ref_45_70" href="terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm#ref_45_65">Ada</a></span> <b>is</b>
+
+   <b>function</b> <span class="symbol"><a name="ref_47_13" href="terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm#ref_49_13">Create</a></span> (<span class="symbol"><a name="ref_47_21" href="terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm#ref_49_21">Set</a></span>            : <a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_51_9">Type_Set</a> := <a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_51_46">Mixed_Case</a>;
+                    <span class="symbol"><a name="ref_48_21" href="terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm#ref_50_21">Case_Sensitive</a></span> : Boolean  := False;
+                    <span class="symbol"><a name="ref_49_21" href="terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm#ref_51_21">Must_Be_Unique</a></span> : Boolean  := False)
+                    <b>return</b> <a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_63_9">Enumeration_Field</a>
+   <b>is</b>
+      <span class="symbol"><a name="ref_52_7">I</a></span> : <a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_56_9">Enumeration_Info</a> (<a href="terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm#ref_43_9">T</a>'Pos (<a href="terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm#ref_43_9">T</a>'Last) - <a href="terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm#ref_43_9">T</a>'Pos (<a href="terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm#ref_43_9">T</a>'First) + 1);
+      <span class="symbol"><a name="ref_53_7">J</a></span> : Positive := 1;
+   <b>begin</b>
+      <a href="terminal_interface-curses-forms-field_types-enumeration-ada__adb.htm#ref_52_7">I</a>.<a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_58_10">Case_Sensitive</a> := <a href="terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm#ref_50_21">Case_Sensitive</a>;
+      <a href="terminal_interface-curses-forms-field_types-enumeration-ada__adb.htm#ref_52_7">I</a>.<a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_59_10">Match_Must_Be_Unique</a> := <a href="terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm#ref_51_21">Must_Be_Unique</a>;
+
+      <b>for</b> <span class="symbol"><a name="ref_58_11">E</a></span> <b>in</b> <a href="terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm#ref_43_9">T</a>'<b>Range</b> <b>loop</b>
+         <a href="terminal_interface-curses-forms-field_types-enumeration-ada__adb.htm#ref_52_7">I</a>.<a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_60_10">Names</a> (<a href="terminal_interface-curses-forms-field_types-enumeration-ada__adb.htm#ref_53_7">J</a>) := <b>new</b> String'(<a href="terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm#ref_43_9">T</a>'Image (<a href="terminal_interface-curses-forms-field_types-enumeration-ada__adb.htm#ref_58_11">E</a>));
+         <span class="comment"><em>--  The Image attribute defaults to upper case, so we have to handle</em></span>
+         <span class="comment"><em>--  only the other ones...</em></span>
+         <b>if</b> <a href="terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm#ref_49_21">Set</a> /= <a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_51_34">Upper_Case</a> <b>then</b>
+            <a href="terminal_interface-curses-forms-field_types-enumeration-ada__adb.htm#ref_52_7">I</a>.<a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_60_10">Names</a> (<a href="terminal_interface-curses-forms-field_types-enumeration-ada__adb.htm#ref_53_7">J</a>).<b>all</b> := To_Lower (<a href="terminal_interface-curses-forms-field_types-enumeration-ada__adb.htm#ref_52_7">I</a>.<a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_60_10">Names</a> (<a href="terminal_interface-curses-forms-field_types-enumeration-ada__adb.htm#ref_53_7">J</a>).<b>all</b>);
+            <b>if</b> <a href="terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm#ref_49_21">Set</a> = <a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_51_46">Mixed_Case</a> <b>then</b>
+               <a href="terminal_interface-curses-forms-field_types-enumeration-ada__adb.htm#ref_52_7">I</a>.<a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_60_10">Names</a> (<a href="terminal_interface-curses-forms-field_types-enumeration-ada__adb.htm#ref_53_7">J</a>).<b>all</b> (<a href="terminal_interface-curses-forms-field_types-enumeration-ada__adb.htm#ref_52_7">I</a>.<a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_60_10">Names</a> (<a href="terminal_interface-curses-forms-field_types-enumeration-ada__adb.htm#ref_53_7">J</a>).<b>all</b>'First) :=
+                 To_Upper (<a href="terminal_interface-curses-forms-field_types-enumeration-ada__adb.htm#ref_52_7">I</a>.<a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_60_10">Names</a> (<a href="terminal_interface-curses-forms-field_types-enumeration-ada__adb.htm#ref_53_7">J</a>).<b>all</b> (<a href="terminal_interface-curses-forms-field_types-enumeration-ada__adb.htm#ref_52_7">I</a>.<a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_60_10">Names</a> (<a href="terminal_interface-curses-forms-field_types-enumeration-ada__adb.htm#ref_53_7">J</a>).<b>all</b>'First));
+            <b>end</b> <b>if</b>;
+         <b>end</b> <b>if</b>;
+         <a href="terminal_interface-curses-forms-field_types-enumeration-ada__adb.htm#ref_53_7">J</a> := <a href="terminal_interface-curses-forms-field_types-enumeration-ada__adb.htm#ref_53_7">J</a> + 1;
+      <b>end</b> <b>loop</b>;
+
+      <b>return</b> <a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_65_13">Create</a> (<a href="terminal_interface-curses-forms-field_types-enumeration-ada__adb.htm#ref_52_7">I</a>, True);
+   <b>end</b> <a href="terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm#ref_49_13">Create</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_75_13" href="terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm#ref_54_13">Value</a></span> (<span class="symbol"><a name="ref_75_20" href="terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm#ref_54_20">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                   <span class="symbol"><a name="ref_76_20" href="terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm#ref_55_20">Buf</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_131_9">Buffer_Number</a> := <a href="terminal_interface-curses-forms__ads.htm#ref_131_9">Buffer_Number</a>'First) <b>return</b> <a href="terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm#ref_43_9">T</a>
+   <b>is</b>
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm#ref_43_9">T</a>'Value (<a href="terminal_interface-curses-forms__ads.htm#ref_370_13">Get_Buffer</a> (<a href="terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm#ref_54_20">Fld</a>, <a href="terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm#ref_55_20">Buf</a>));
+   <b>end</b> <a href="terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm#ref_54_13">Value</a>;
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_44_53">Enumeration</a>.<a href="terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm#ref_45_65">Ada</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm b/doc/html/ada/terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm
new file mode 100644
index 0000000..9ec8c26
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm
@@ -0,0 +1,78 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-forms-field_types-enumeration-ada.ads</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-forms-field_types-enumeration-ada.ads </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--         Terminal_Interface.Curses.Forms.Field_Types.Enumeration.Ada      --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 S P E C                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1999-2002,2003 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.12 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>generic</b>
+   <b>type</b> <span class="symbol"><a name="ref_43_9">T</a></span> <b>is</b> (&lt;&gt;);
+
+<b>package</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_44_53">Enumeration</a>.<span class="symbol"><a name="ref_45_65" href="terminal_interface-curses-forms-field_types-enumeration-ada__adb.htm#ref_45_70">Ada</a></span> <b>is</b>
+   <b>pragma</b> Preelaborate
+     (<a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_44_53">Enumeration</a>.<a href="terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm#ref_45_65">Ada</a>);
+
+   <b>function</b> <span class="symbol"><a name="ref_49_13" href="terminal_interface-curses-forms-field_types-enumeration-ada__adb.htm#ref_47_13">Create</a></span> (<span class="symbol"><a name="ref_49_21" href="terminal_interface-curses-forms-field_types-enumeration-ada__adb.htm#ref_47_21">Set</a></span>            : <a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_51_9">Type_Set</a> := <a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_51_46">Mixed_Case</a>;
+                    <span class="symbol"><a name="ref_50_21" href="terminal_interface-curses-forms-field_types-enumeration-ada__adb.htm#ref_48_21">Case_Sensitive</a></span> : Boolean  := False;
+                    <span class="symbol"><a name="ref_51_21" href="terminal_interface-curses-forms-field_types-enumeration-ada__adb.htm#ref_49_21">Must_Be_Unique</a></span> : Boolean  := False)
+                    <b>return</b> <a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_63_9">Enumeration_Field</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_54_13" href="terminal_interface-curses-forms-field_types-enumeration-ada__adb.htm#ref_75_13">Value</a></span> (<span class="symbol"><a name="ref_54_20" href="terminal_interface-curses-forms-field_types-enumeration-ada__adb.htm#ref_75_20">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                   <span class="symbol"><a name="ref_55_20" href="terminal_interface-curses-forms-field_types-enumeration-ada__adb.htm#ref_76_20">Buf</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_131_9">Buffer_Number</a> := <a href="terminal_interface-curses-forms__ads.htm#ref_131_9">Buffer_Number</a>'First) <b>return</b> <a href="terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm#ref_43_9">T</a>;
+   <span class="comment"><em>--  Translate the content of the fields buffer - indicated by the</em></span>
+   <span class="comment"><em>--  buffer number - into an enumeration value. If the buffer is empty</em></span>
+   <span class="comment"><em>--  or the content is invalid, a Constraint_Error is raises.</em></span>
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_44_53">Enumeration</a>.<a href="terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm#ref_45_65">Ada</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-forms-field_types-enumeration__adb.htm b/doc/html/ada/terminal_interface-curses-forms-field_types-enumeration__adb.htm
new file mode 100644
index 0000000..1747221
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-forms-field_types-enumeration__adb.htm
@@ -0,0 +1,131 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-forms-field_types-enumeration.adb</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-forms-field_types-enumeration.adb </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--          Terminal_Interface.Curses.Forms.Field_Types.Enumeration         --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 B O D Y                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1999-2011,2014 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.13 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>with</b> Ada.Unchecked_Deallocation;
+<b>with</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C; <b>use</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C;
+<b>with</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.Strings; <b>use</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.Strings;
+<b>with</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>; <b>use</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>;
+
+<b>package</b> <b>body</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<span class="symbol"><a name="ref_47_58" href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_44_53">Enumeration</a></span> <b>is</b>
+
+   <b>function</b> <span class="symbol"><a name="ref_49_13" href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_65_13">Create</a></span> (<span class="symbol"><a name="ref_49_21" href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_65_21">Info</a></span>               : <a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_56_9">Enumeration_Info</a>;
+                    <span class="symbol"><a name="ref_50_21" href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_66_21">Auto_Release_Names</a></span> : Boolean := False)
+                    <b>return</b> <a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_63_9">Enumeration_Field</a>
+   <b>is</b>
+      <b>procedure</b> Release_String <b>is</b>
+        <b>new</b> Ada.Unchecked_Deallocation (String,
+                                        <a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_48_9">String_Access</a>);
+      <span class="symbol"><a name="ref_56_7">E</a></span> : <a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_63_9">Enumeration_Field</a>;
+      <span class="symbol"><a name="ref_57_7">L</a></span> : <b>constant</b> size_t := 1 + size_t (<a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_65_21">Info</a>.<a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_56_27">C</a>);
+      <span class="symbol"><a name="ref_58_7">S</a></span> : <a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_48_9">String_Access</a>;
+   <b>begin</b>
+      <a href="terminal_interface-curses-forms-field_types-enumeration__adb.htm#ref_56_7">E</a>.<a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_94_10">Case_Sensitive</a>       := <a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_65_21">Info</a>.<a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_58_10">Case_Sensitive</a>;
+      <a href="terminal_interface-curses-forms-field_types-enumeration__adb.htm#ref_56_7">E</a>.<a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_95_10">Match_Must_Be_Unique</a> := <a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_65_21">Info</a>.<a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_59_10">Match_Must_Be_Unique</a>;
+      <a href="terminal_interface-curses-forms-field_types-enumeration__adb.htm#ref_56_7">E</a>.<a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_96_10">Arr</a> := <b>new</b> chars_ptr_array (size_t (1) .. <a href="terminal_interface-curses-forms-field_types-enumeration__adb.htm#ref_57_7">L</a>);
+      <b>for</b> <span class="symbol"><a name="ref_63_11">I</a></span> <b>in</b> 1 .. Positive (<a href="terminal_interface-curses-forms-field_types-enumeration__adb.htm#ref_57_7">L</a> - 1) <b>loop</b>
+         <b>if</b> <a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_65_21">Info</a>.<a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_60_10">Names</a> (<a href="terminal_interface-curses-forms-field_types-enumeration__adb.htm#ref_63_11">I</a>) = <b>null</b> <b>then</b>
+            <b>raise</b> <a href="terminal_interface-curses-forms__ads.htm#ref_288_4">Form_Exception</a>;
+         <b>end</b> <b>if</b>;
+         <a href="terminal_interface-curses-forms-field_types-enumeration__adb.htm#ref_56_7">E</a>.<a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_96_10">Arr</a>.<b>all</b> (size_t (<a href="terminal_interface-curses-forms-field_types-enumeration__adb.htm#ref_63_11">I</a>)) := New_String (<a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_65_21">Info</a>.<a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_60_10">Names</a> (<a href="terminal_interface-curses-forms-field_types-enumeration__adb.htm#ref_63_11">I</a>).<b>all</b>);
+         <b>if</b> <a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_66_21">Auto_Release_Names</a> <b>then</b>
+            <a href="terminal_interface-curses-forms-field_types-enumeration__adb.htm#ref_58_7">S</a> := <a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_65_21">Info</a>.<a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_60_10">Names</a> (<a href="terminal_interface-curses-forms-field_types-enumeration__adb.htm#ref_63_11">I</a>);
+            Release_String (<a href="terminal_interface-curses-forms-field_types-enumeration__adb.htm#ref_58_7">S</a>);
+         <b>end</b> <b>if</b>;
+      <b>end</b> <b>loop</b>;
+      <a href="terminal_interface-curses-forms-field_types-enumeration__adb.htm#ref_56_7">E</a>.<a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_96_10">Arr</a>.<b>all</b> (<a href="terminal_interface-curses-forms-field_types-enumeration__adb.htm#ref_57_7">L</a>) := Null_Ptr;
+      <b>return</b> <a href="terminal_interface-curses-forms-field_types-enumeration__adb.htm#ref_56_7">E</a>;
+   <b>end</b> <a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_65_13">Create</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_77_14" href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_78_14">Release</a></span> (<span class="symbol"><a name="ref_77_23" href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_78_23">Enum</a></span> : <b>in</b> <b>out</b> <a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_63_9">Enumeration_Field</a>)
+   <b>is</b>
+      <span class="symbol"><a name="ref_79_7">I</a></span> : size_t := 0;
+      <span class="symbol"><a name="ref_80_7">P</a></span> : chars_ptr;
+   <b>begin</b>
+      <b>loop</b>
+         <a href="terminal_interface-curses-forms-field_types-enumeration__adb.htm#ref_80_7">P</a> := <a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_78_23">Enum</a>.<a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_96_10">Arr</a>.<b>all</b> (<a href="terminal_interface-curses-forms-field_types-enumeration__adb.htm#ref_79_7">I</a>);
+         <b>exit</b> <b>when</b> <a href="terminal_interface-curses-forms-field_types-enumeration__adb.htm#ref_80_7">P</a> = Null_Ptr;
+         Free (<a href="terminal_interface-curses-forms-field_types-enumeration__adb.htm#ref_80_7">P</a>);
+         <a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_78_23">Enum</a>.<a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_96_10">Arr</a>.<b>all</b> (<a href="terminal_interface-curses-forms-field_types-enumeration__adb.htm#ref_79_7">I</a>) := Null_Ptr;
+         <a href="terminal_interface-curses-forms-field_types-enumeration__adb.htm#ref_79_7">I</a> := <a href="terminal_interface-curses-forms-field_types-enumeration__adb.htm#ref_79_7">I</a> + 1;
+      <b>end</b> <b>loop</b>;
+      <a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_78_23">Enum</a>.<a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_96_10">Arr</a> := <b>null</b>;
+   <b>end</b> <a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_78_14">Release</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_92_14" href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_85_14">Set_Field_Type</a></span> (<span class="symbol"><a name="ref_92_30" href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_85_30">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                             <span class="symbol"><a name="ref_93_30" href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_86_30">Typ</a></span> : <a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_63_9">Enumeration_Field</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_95_16">Set_Fld_Type</a></span> (<span class="symbol"><a name="ref_95_30">F</a></span>    : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a> := <a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_85_30">Fld</a>;
+                             <span class="symbol"><a name="ref_96_30">Arg1</a></span> : chars_ptr_array;
+                             <span class="symbol"><a name="ref_97_30">Arg2</a></span> : <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_47_12">C_Int</a>;
+                             <span class="symbol"><a name="ref_98_30">Arg3</a></span> : <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_47_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Fld_Type, "set_field_type_enum");
+
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_86_30">Typ</a>.<a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_96_10">Arr</a> = <b>null</b> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses-forms__ads.htm#ref_288_4">Form_Exception</a>;
+      <b>end</b> <b>if</b>;
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a>
+        (<a href="terminal_interface-curses-forms-field_types-enumeration__adb.htm#ref_95_16">Set_Fld_Type</a>
+           (<a href="terminal_interface-curses-forms-field_types-enumeration__adb.htm#ref_96_30">Arg1</a> =&gt; <a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_86_30">Typ</a>.<a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_96_10">Arr</a>.<b>all</b>,
+            <a href="terminal_interface-curses-forms-field_types-enumeration__adb.htm#ref_97_30">Arg2</a> =&gt; <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_47_12">C_Int</a> (Boolean'Pos (<a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_86_30">Typ</a>.<a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_94_10">Case_Sensitive</a>)),
+            <a href="terminal_interface-curses-forms-field_types-enumeration__adb.htm#ref_98_30">Arg3</a> =&gt; <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_47_12">C_Int</a> (Boolean'Pos (<a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_86_30">Typ</a>.<a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_95_10">Match_Must_Be_Unique</a>))));
+      <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_152_14">Wrap_Builtin</a> (<a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_85_30">Fld</a>, <a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_86_30">Typ</a>, <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_150_13">C_Choice_Router</a>);
+   <b>end</b> <a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_85_14">Set_Field_Type</a>;
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_44_53">Enumeration</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-forms-field_types-enumeration__ads.htm b/doc/html/ada/terminal_interface-curses-forms-field_types-enumeration__ads.htm
new file mode 100644
index 0000000..21719db
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-forms-field_types-enumeration__ads.htm
@@ -0,0 +1,117 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-forms-field_types-enumeration.ads</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-forms-field_types-enumeration.ads </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--           Terminal_Interface.Curses.Forms.Field_Types.Enumeration        --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 S P E C                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2018,2020 Thomas E. Dickey                                     --</em></span>
+<span class="comment"><em>-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.15 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>with</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.Strings;
+
+<b>package</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<span class="symbol"><a name="ref_44_53" href="terminal_interface-curses-forms-field_types-enumeration__adb.htm#ref_47_58">Enumeration</a></span> <b>is</b>
+   <b>pragma</b> Preelaborate
+     (<a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_44_53">Enumeration</a>);
+
+   <b>type</b> <span class="symbol"><a name="ref_48_9">String_Access</a></span> <b>is</b> <b>access</b> String;
+
+   <span class="comment"><em>--  Type_Set is used by the child package Ada</em></span>
+   <b>type</b> <span class="symbol"><a name="ref_51_9">Type_Set</a></span> <b>is</b> (<span class="symbol"><a name="ref_51_22">Lower_Case</a></span>, <span class="symbol"><a name="ref_51_34">Upper_Case</a></span>, <span class="symbol"><a name="ref_51_46">Mixed_Case</a></span>);
+
+   <b>type</b> Enum_Array <b>is</b> <b>array</b> (Positive <b>range</b> &lt;&gt;)
+     <b>of</b> <a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_48_9">String_Access</a>;
+
+   <b>type</b> <span class="symbol"><a name="ref_56_9">Enumeration_Info</a></span> (<span class="symbol"><a name="ref_56_27">C</a></span> : Positive) <b>is</b>
+      <b>record</b>
+         <span class="symbol"><a name="ref_58_10">Case_Sensitive</a></span>       : Boolean := False;
+         <span class="symbol"><a name="ref_59_10">Match_Must_Be_Unique</a></span> : Boolean := False;
+         <span class="symbol"><a name="ref_60_10">Names</a></span>                : Enum_Array (1 .. <a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_56_27">C</a>);
+      <b>end</b> <b>record</b>;
+
+   <b>type</b> <span class="symbol"><a name="ref_63_9">Enumeration_Field</a></span> <b>is</b> <b>new</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_53_9">Field_Type</a> <b>with</b> <b>private</b>;
+
+   <b>function</b> <span class="symbol"><a name="ref_65_13" href="terminal_interface-curses-forms-field_types-enumeration__adb.htm#ref_49_13">Create</a></span> (<span class="symbol"><a name="ref_65_21" href="terminal_interface-curses-forms-field_types-enumeration__adb.htm#ref_49_21">Info</a></span> : <a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_56_9">Enumeration_Info</a>;
+                    <span class="symbol"><a name="ref_66_21" href="terminal_interface-curses-forms-field_types-enumeration__adb.htm#ref_50_21">Auto_Release_Names</a></span> : Boolean := False)
+                    <b>return</b> <a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_63_9">Enumeration_Field</a>;
+   <span class="comment"><em>--  Make an fieldtype from the info. Enumerations are special, because</em></span>
+   <span class="comment"><em>--  they normally don't copy the enum values into a private store, so</em></span>
+   <span class="comment"><em>--  we have to care for the lifetime of the info we provide.</em></span>
+   <span class="comment"><em>--  The Auto_Release_Names flag may be used to automatically releases</em></span>
+   <span class="comment"><em>--  the strings in the Names array of the Enumeration_Info.</em></span>
+
+   <b>function</b> Make_Enumeration_Type (<span class="symbol"><a name="ref_74_36">Info</a></span> : <a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_56_9">Enumeration_Info</a>;
+                                   <span class="symbol"><a name="ref_75_36">Auto_Release_Names</a></span> : Boolean := False)
+                                   <b>return</b> <a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_63_9">Enumeration_Field</a> <b>renames</b> <a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_65_13">Create</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_78_14" href="terminal_interface-curses-forms-field_types-enumeration__adb.htm#ref_77_14">Release</a></span> (<span class="symbol"><a name="ref_78_23" href="terminal_interface-curses-forms-field_types-enumeration__adb.htm#ref_77_23">Enum</a></span> : <b>in</b> <b>out</b> <a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_63_9">Enumeration_Field</a>);
+   <span class="comment"><em>--  But we may want to release the field to release the memory allocated</em></span>
+   <span class="comment"><em>--  by it internally. After that the Enumeration field is no longer usable.</em></span>
+
+   <span class="comment"><em>--  The next type definitions are all ncurses extensions. They are typically</em></span>
+   <span class="comment"><em>--  not available in other curses implementations.</em></span>
+
+   <b>procedure</b> <span class="symbol"><a name="ref_85_14" href="terminal_interface-curses-forms-field_types-enumeration__adb.htm#ref_92_14">Set_Field_Type</a></span> (<span class="symbol"><a name="ref_85_30" href="terminal_interface-curses-forms-field_types-enumeration__adb.htm#ref_92_30">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                             <span class="symbol"><a name="ref_86_30" href="terminal_interface-curses-forms-field_types-enumeration__adb.htm#ref_93_30">Typ</a></span> : <a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_63_9">Enumeration_Field</a>);
+   <b>pragma</b> Inline (Set_Field_Type);
+
+<b>private</b>
+   <b>type</b> <span class="symbol"><a name="ref_90_9" href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_44_53">CPA_Access</a></span> <b>is</b> <b>access</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.Strings.chars_ptr_array;
+
+   <b>type</b> <a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_63_9">Enumeration_Field</a> <b>is</b> <b>new</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_53_9">Field_Type</a> <b>with</b>
+      <b>record</b>
+         <span class="symbol"><a name="ref_94_10">Case_Sensitive</a></span>       : Boolean := False;
+         <span class="symbol"><a name="ref_95_10">Match_Must_Be_Unique</a></span> : Boolean := False;
+         <span class="symbol"><a name="ref_96_10">Arr</a></span>                  : <a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_90_9">CPA_Access</a> := <b>null</b>;
+      <b>end</b> <b>record</b>;
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<a href="terminal_interface-curses-forms-field_types-enumeration__ads.htm#ref_44_53">Enumeration</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-forms-field_types-intfield__adb.htm b/doc/html/ada/terminal_interface-curses-forms-field_types-intfield__adb.htm
new file mode 100644
index 0000000..6ff20e8
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-forms-field_types-intfield__adb.htm
@@ -0,0 +1,81 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-forms-field_types-intfield.adb</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-forms-field_types-intfield.adb </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--            Terminal_Interface.Curses.Forms.Field_Types.IntField          --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 B O D Y                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1999-2011,2014 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.14 @</em></span>
+<span class="comment"><em>--  @Date: 2020/02/02 23:34:34 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>with</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>; <b>use</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>;
+
+<b>package</b> <b>body</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<span class="symbol"><a name="ref_45_58" href="terminal_interface-curses-forms-field_types-intfield__ads.htm#ref_42_53">IntField</a></span> <b>is</b>
+
+   <b>procedure</b> <span class="symbol"><a name="ref_47_14" href="terminal_interface-curses-forms-field_types-intfield__ads.htm#ref_52_14">Set_Field_Type</a></span> (<span class="symbol"><a name="ref_47_30" href="terminal_interface-curses-forms-field_types-intfield__ads.htm#ref_52_30">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                             <span class="symbol"><a name="ref_48_30" href="terminal_interface-curses-forms-field_types-intfield__ads.htm#ref_53_30">Typ</a></span> : <a href="terminal_interface-curses-forms-field_types-intfield__ads.htm#ref_45_9">Integer_Field</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_50_16">Set_Fld_Type</a></span> (<span class="symbol"><a name="ref_50_30">F</a></span>    : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a> := <a href="terminal_interface-curses-forms-field_types-intfield__ads.htm#ref_52_30">Fld</a>;
+                             <span class="symbol"><a name="ref_51_30">Arg1</a></span> : <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_47_12">C_Int</a>;
+                             <span class="symbol"><a name="ref_52_30">Arg2</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_51_12">C_Long_Int</a>;
+                             <span class="symbol"><a name="ref_53_30">Arg3</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_51_12">C_Long_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Fld_Type, "set_field_type_integer");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms-field_types-intfield__adb.htm#ref_50_16">Set_Fld_Type</a> (<a href="terminal_interface-curses-forms-field_types-intfield__adb.htm#ref_51_30">Arg1</a> =&gt; <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_47_12">C_Int</a> (<a href="terminal_interface-curses-forms-field_types-intfield__ads.htm#ref_53_30">Typ</a>.<a href="terminal_interface-curses-forms-field_types-intfield__ads.htm#ref_47_10">Precision</a>),
+                                   <a href="terminal_interface-curses-forms-field_types-intfield__adb.htm#ref_52_30">Arg2</a> =&gt; <a href="terminal_interface-curses-aux__ads.htm#ref_51_12">C_Long_Int</a> (<a href="terminal_interface-curses-forms-field_types-intfield__ads.htm#ref_53_30">Typ</a>.<a href="terminal_interface-curses-forms-field_types-intfield__ads.htm#ref_48_10">Lower_Limit</a>),
+                                   <a href="terminal_interface-curses-forms-field_types-intfield__adb.htm#ref_53_30">Arg3</a> =&gt; <a href="terminal_interface-curses-aux__ads.htm#ref_51_12">C_Long_Int</a> (<a href="terminal_interface-curses-forms-field_types-intfield__ads.htm#ref_53_30">Typ</a>.<a href="terminal_interface-curses-forms-field_types-intfield__ads.htm#ref_49_10">Upper_Limit</a>)));
+      <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_152_14">Wrap_Builtin</a> (<a href="terminal_interface-curses-forms-field_types-intfield__ads.htm#ref_52_30">Fld</a>, <a href="terminal_interface-curses-forms-field_types-intfield__ads.htm#ref_53_30">Typ</a>);
+   <b>end</b> <a href="terminal_interface-curses-forms-field_types-intfield__ads.htm#ref_52_14">Set_Field_Type</a>;
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<a href="terminal_interface-curses-forms-field_types-intfield__ads.htm#ref_42_53">IntField</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-forms-field_types-intfield__ads.htm b/doc/html/ada/terminal_interface-curses-forms-field_types-intfield__ads.htm
new file mode 100644
index 0000000..9115175
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-forms-field_types-intfield__ads.htm
@@ -0,0 +1,74 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-forms-field_types-intfield.ads</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-forms-field_types-intfield.ads </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--            Terminal_Interface.Curses.Forms.Field_Types.IntField          --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 S P E C                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.13 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>package</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<span class="symbol"><a name="ref_42_53" href="terminal_interface-curses-forms-field_types-intfield__adb.htm#ref_45_58">IntField</a></span> <b>is</b>
+   <b>pragma</b> Preelaborate (<a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<a href="terminal_interface-curses-forms-field_types-intfield__ads.htm#ref_42_53">IntField</a>);
+
+   <b>type</b> <span class="symbol"><a name="ref_45_9">Integer_Field</a></span> <b>is</b> <b>new</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_53_9">Field_Type</a> <b>with</b>
+      <b>record</b>
+         <span class="symbol"><a name="ref_47_10">Precision</a></span>   : Natural;
+         <span class="symbol"><a name="ref_48_10">Lower_Limit</a></span> : Integer;
+         <span class="symbol"><a name="ref_49_10">Upper_Limit</a></span> : Integer;
+      <b>end</b> <b>record</b>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_52_14" href="terminal_interface-curses-forms-field_types-intfield__adb.htm#ref_47_14">Set_Field_Type</a></span> (<span class="symbol"><a name="ref_52_30" href="terminal_interface-curses-forms-field_types-intfield__adb.htm#ref_47_30">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                             <span class="symbol"><a name="ref_53_30" href="terminal_interface-curses-forms-field_types-intfield__adb.htm#ref_48_30">Typ</a></span> : <a href="terminal_interface-curses-forms-field_types-intfield__ads.htm#ref_45_9">Integer_Field</a>);
+   <b>pragma</b> Inline (Set_Field_Type);
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<a href="terminal_interface-curses-forms-field_types-intfield__ads.htm#ref_42_53">IntField</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-forms-field_types-ipv4_address__adb.htm b/doc/html/ada/terminal_interface-curses-forms-field_types-ipv4_address__adb.htm
new file mode 100644
index 0000000..e433d75
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-forms-field_types-ipv4_address__adb.htm
@@ -0,0 +1,77 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-forms-field_types-ipv4_address.adb</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-forms-field_types-ipv4_address.adb </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--          Terminal_Interface.Curses.Forms.Field_Types.IPV4_Address        --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 B O D Y                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1999-2011,2014 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.14 @</em></span>
+<span class="comment"><em>--  @Date: 2020/02/02 23:34:34 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>with</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>; <b>use</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>;
+
+<b>package</b> <b>body</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<span class="symbol"><a name="ref_45_58" href="terminal_interface-curses-forms-field_types-ipv4_address__ads.htm#ref_42_53">IPV4_Address</a></span> <b>is</b>
+
+   <b>procedure</b> <span class="symbol"><a name="ref_47_14" href="terminal_interface-curses-forms-field_types-ipv4_address__ads.htm#ref_48_14">Set_Field_Type</a></span> (<span class="symbol"><a name="ref_47_30" href="terminal_interface-curses-forms-field_types-ipv4_address__ads.htm#ref_48_30">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                             <span class="symbol"><a name="ref_48_30" href="terminal_interface-curses-forms-field_types-ipv4_address__ads.htm#ref_49_30">Typ</a></span> : <a href="terminal_interface-curses-forms-field_types-ipv4_address__ads.htm#ref_46_9">Internet_V4_Address_Field</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_50_16">Set_Fld_Type</a></span> (<span class="symbol"><a name="ref_50_30">F</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a> := <a href="terminal_interface-curses-forms-field_types-ipv4_address__ads.htm#ref_48_30">Fld</a>)
+                             <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Fld_Type, "set_field_type_ipv4");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms-field_types-ipv4_address__adb.htm#ref_50_16">Set_Fld_Type</a>);
+      <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_152_14">Wrap_Builtin</a> (<a href="terminal_interface-curses-forms-field_types-ipv4_address__ads.htm#ref_48_30">Fld</a>, <a href="terminal_interface-curses-forms-field_types-ipv4_address__ads.htm#ref_49_30">Typ</a>);
+   <b>end</b> <a href="terminal_interface-curses-forms-field_types-ipv4_address__ads.htm#ref_48_14">Set_Field_Type</a>;
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<a href="terminal_interface-curses-forms-field_types-ipv4_address__ads.htm#ref_42_53">IPV4_Address</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-forms-field_types-ipv4_address__ads.htm b/doc/html/ada/terminal_interface-curses-forms-field_types-ipv4_address__ads.htm
new file mode 100644
index 0000000..5ace0d5
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-forms-field_types-ipv4_address__ads.htm
@@ -0,0 +1,70 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-forms-field_types-ipv4_address.ads</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-forms-field_types-ipv4_address.ads </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--          Terminal_Interface.Curses.Forms.Field_Types.IPV4_Address        --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 S P E C                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.13 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>package</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<span class="symbol"><a name="ref_42_53" href="terminal_interface-curses-forms-field_types-ipv4_address__adb.htm#ref_45_58">IPV4_Address</a></span> <b>is</b>
+   <b>pragma</b> Preelaborate
+     (<a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<a href="terminal_interface-curses-forms-field_types-ipv4_address__ads.htm#ref_42_53">IPV4_Address</a>);
+
+   <b>type</b> <span class="symbol"><a name="ref_46_9">Internet_V4_Address_Field</a></span> <b>is</b> <b>new</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_53_9">Field_Type</a> <b>with</b> <b>null</b> <b>record</b>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_48_14" href="terminal_interface-curses-forms-field_types-ipv4_address__adb.htm#ref_47_14">Set_Field_Type</a></span> (<span class="symbol"><a name="ref_48_30" href="terminal_interface-curses-forms-field_types-ipv4_address__adb.htm#ref_47_30">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                             <span class="symbol"><a name="ref_49_30" href="terminal_interface-curses-forms-field_types-ipv4_address__adb.htm#ref_48_30">Typ</a></span> : <a href="terminal_interface-curses-forms-field_types-ipv4_address__ads.htm#ref_46_9">Internet_V4_Address_Field</a>);
+   <b>pragma</b> Inline (Set_Field_Type);
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<a href="terminal_interface-curses-forms-field_types-ipv4_address__ads.htm#ref_42_53">IPV4_Address</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-forms-field_types-numeric__adb.htm b/doc/html/ada/terminal_interface-curses-forms-field_types-numeric__adb.htm
new file mode 100644
index 0000000..11b48eb
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-forms-field_types-numeric__adb.htm
@@ -0,0 +1,84 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-forms-field_types-numeric.adb</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-forms-field_types-numeric.adb </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--            Terminal_Interface.Curses.Forms.Field_Types.Numeric           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 B O D Y                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1999-2011,2014 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.15 @</em></span>
+<span class="comment"><em>--  @Date: 2020/02/02 23:34:34 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>with</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C;
+<b>with</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>; <b>use</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>;
+
+<b>package</b> <b>body</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<span class="symbol"><a name="ref_46_58" href="terminal_interface-curses-forms-field_types-numeric__ads.htm#ref_42_53">Numeric</a></span> <b>is</b>
+
+   <b>procedure</b> <span class="symbol"><a name="ref_48_14" href="terminal_interface-curses-forms-field_types-numeric__ads.htm#ref_52_14">Set_Field_Type</a></span> (<span class="symbol"><a name="ref_48_30" href="terminal_interface-curses-forms-field_types-numeric__ads.htm#ref_52_30">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                             <span class="symbol"><a name="ref_49_30" href="terminal_interface-curses-forms-field_types-numeric__ads.htm#ref_53_30">Typ</a></span> : <a href="terminal_interface-curses-forms-field_types-numeric__ads.htm#ref_45_9">Numeric_Field</a>)
+   <b>is</b>
+      <b>type</b> <span class="symbol"><a name="ref_51_12">Double</a></span> <b>is</b> <b>new</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.double;
+
+      <b>function</b> <span class="symbol"><a name="ref_53_16">Set_Fld_Type</a></span> (<span class="symbol"><a name="ref_53_30">F</a></span>    : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a> := <a href="terminal_interface-curses-forms-field_types-numeric__ads.htm#ref_52_30">Fld</a>;
+                             <span class="symbol"><a name="ref_54_30">Arg1</a></span> : <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_47_12">C_Int</a>;
+                             <span class="symbol"><a name="ref_55_30">Arg2</a></span> : <a href="terminal_interface-curses-forms-field_types-numeric__adb.htm#ref_51_12">Double</a>;
+                             <span class="symbol"><a name="ref_56_30">Arg3</a></span> : <a href="terminal_interface-curses-forms-field_types-numeric__adb.htm#ref_51_12">Double</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Fld_Type, "set_field_type_numeric");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms-field_types-numeric__adb.htm#ref_53_16">Set_Fld_Type</a> (<a href="terminal_interface-curses-forms-field_types-numeric__adb.htm#ref_54_30">Arg1</a> =&gt; <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_47_12">C_Int</a> (<a href="terminal_interface-curses-forms-field_types-numeric__ads.htm#ref_53_30">Typ</a>.<a href="terminal_interface-curses-forms-field_types-numeric__ads.htm#ref_47_10">Precision</a>),
+                                   <a href="terminal_interface-curses-forms-field_types-numeric__adb.htm#ref_55_30">Arg2</a> =&gt; <a href="terminal_interface-curses-forms-field_types-numeric__adb.htm#ref_51_12">Double</a> (<a href="terminal_interface-curses-forms-field_types-numeric__ads.htm#ref_53_30">Typ</a>.<a href="terminal_interface-curses-forms-field_types-numeric__ads.htm#ref_48_10">Lower_Limit</a>),
+                                   <a href="terminal_interface-curses-forms-field_types-numeric__adb.htm#ref_56_30">Arg3</a> =&gt; <a href="terminal_interface-curses-forms-field_types-numeric__adb.htm#ref_51_12">Double</a> (<a href="terminal_interface-curses-forms-field_types-numeric__ads.htm#ref_53_30">Typ</a>.<a href="terminal_interface-curses-forms-field_types-numeric__ads.htm#ref_49_10">Upper_Limit</a>)));
+      <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_152_14">Wrap_Builtin</a> (<a href="terminal_interface-curses-forms-field_types-numeric__ads.htm#ref_52_30">Fld</a>, <a href="terminal_interface-curses-forms-field_types-numeric__ads.htm#ref_53_30">Typ</a>);
+   <b>end</b> <a href="terminal_interface-curses-forms-field_types-numeric__ads.htm#ref_52_14">Set_Field_Type</a>;
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<a href="terminal_interface-curses-forms-field_types-numeric__ads.htm#ref_42_53">Numeric</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-forms-field_types-numeric__ads.htm b/doc/html/ada/terminal_interface-curses-forms-field_types-numeric__ads.htm
new file mode 100644
index 0000000..0dddc36
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-forms-field_types-numeric__ads.htm
@@ -0,0 +1,74 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-forms-field_types-numeric.ads</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-forms-field_types-numeric.ads </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--             Terminal_Interface.Curses.Forms.Field_Types.Numeric          --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 S P E C                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.13 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>package</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<span class="symbol"><a name="ref_42_53" href="terminal_interface-curses-forms-field_types-numeric__adb.htm#ref_46_58">Numeric</a></span> <b>is</b>
+   <b>pragma</b> Preelaborate (<a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<a href="terminal_interface-curses-forms-field_types-numeric__ads.htm#ref_42_53">Numeric</a>);
+
+   <b>type</b> <span class="symbol"><a name="ref_45_9">Numeric_Field</a></span> <b>is</b> <b>new</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_53_9">Field_Type</a> <b>with</b>
+      <b>record</b>
+         <span class="symbol"><a name="ref_47_10">Precision</a></span>   : Natural;
+         <span class="symbol"><a name="ref_48_10">Lower_Limit</a></span> : Float;
+         <span class="symbol"><a name="ref_49_10">Upper_Limit</a></span> : Float;
+      <b>end</b> <b>record</b>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_52_14" href="terminal_interface-curses-forms-field_types-numeric__adb.htm#ref_48_14">Set_Field_Type</a></span> (<span class="symbol"><a name="ref_52_30" href="terminal_interface-curses-forms-field_types-numeric__adb.htm#ref_48_30">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                             <span class="symbol"><a name="ref_53_30" href="terminal_interface-curses-forms-field_types-numeric__adb.htm#ref_49_30">Typ</a></span> : <a href="terminal_interface-curses-forms-field_types-numeric__ads.htm#ref_45_9">Numeric_Field</a>);
+   <b>pragma</b> Inline (Set_Field_Type);
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<a href="terminal_interface-curses-forms-field_types-numeric__ads.htm#ref_42_53">Numeric</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-forms-field_types-regexp__adb.htm b/doc/html/ada/terminal_interface-curses-forms-field_types-regexp__adb.htm
new file mode 100644
index 0000000..a8936f5
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-forms-field_types-regexp__adb.htm
@@ -0,0 +1,77 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-forms-field_types-regexp.adb</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-forms-field_types-regexp.adb </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--             Terminal_Interface.Curses.Forms.Field_Types.RegExp           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 B O D Y                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1999-2011,2014 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.13 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>with</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C; <b>use</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C;
+<b>with</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>; <b>use</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>;
+
+<b>package</b> <b>body</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<span class="symbol"><a name="ref_45_58" href="terminal_interface-curses-forms-field_types-regexp__ads.htm#ref_42_53">RegExp</a></span> <b>is</b>
+
+   <b>procedure</b> <span class="symbol"><a name="ref_47_14" href="terminal_interface-curses-forms-field_types-regexp__ads.htm#ref_52_14">Set_Field_Type</a></span> (<span class="symbol"><a name="ref_47_30" href="terminal_interface-curses-forms-field_types-regexp__ads.htm#ref_52_30">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                             <span class="symbol"><a name="ref_48_30" href="terminal_interface-curses-forms-field_types-regexp__ads.htm#ref_53_30">Typ</a></span> : <a href="terminal_interface-curses-forms-field_types-regexp__ads.htm#ref_47_9">Regular_Expression_Field</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_50_16">Set_Ftyp</a></span> (<span class="symbol"><a name="ref_50_26">F</a></span>    : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a> := <a href="terminal_interface-curses-forms-field_types-regexp__ads.htm#ref_52_30">Fld</a>;
+                         <span class="symbol"><a name="ref_51_26">Arg1</a></span> : char_array) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Ftyp, "set_field_type_regexp");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms-field_types-regexp__adb.htm#ref_50_16">Set_Ftyp</a> (<a href="terminal_interface-curses-forms-field_types-regexp__adb.htm#ref_51_26">Arg1</a> =&gt; To_C (<a href="terminal_interface-curses-forms-field_types-regexp__ads.htm#ref_53_30">Typ</a>.<a href="terminal_interface-curses-forms-field_types-regexp__ads.htm#ref_49_10">Regular_Expression</a>.<b>all</b>)));
+      <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_152_14">Wrap_Builtin</a> (<a href="terminal_interface-curses-forms-field_types-regexp__ads.htm#ref_52_30">Fld</a>, <a href="terminal_interface-curses-forms-field_types-regexp__ads.htm#ref_53_30">Typ</a>);
+   <b>end</b> <a href="terminal_interface-curses-forms-field_types-regexp__ads.htm#ref_52_14">Set_Field_Type</a>;
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<a href="terminal_interface-curses-forms-field_types-regexp__ads.htm#ref_42_53">RegExp</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-forms-field_types-regexp__ads.htm b/doc/html/ada/terminal_interface-curses-forms-field_types-regexp__ads.htm
new file mode 100644
index 0000000..19f903d
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-forms-field_types-regexp__ads.htm
@@ -0,0 +1,74 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-forms-field_types-regexp.ads</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-forms-field_types-regexp.ads </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--              Terminal_Interface.Curses.Forms.Field_Types.RegExp          --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 S P E C                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.13 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>package</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<span class="symbol"><a name="ref_42_53" href="terminal_interface-curses-forms-field_types-regexp__adb.htm#ref_45_58">RegExp</a></span> <b>is</b>
+   <b>pragma</b> Preelaborate (<a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<a href="terminal_interface-curses-forms-field_types-regexp__ads.htm#ref_42_53">RegExp</a>);
+
+   <b>type</b> <span class="symbol"><a name="ref_45_9">String_Access</a></span> <b>is</b> <b>access</b> String;
+
+   <b>type</b> <span class="symbol"><a name="ref_47_9">Regular_Expression_Field</a></span> <b>is</b> <b>new</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_53_9">Field_Type</a> <b>with</b>
+      <b>record</b>
+         <span class="symbol"><a name="ref_49_10">Regular_Expression</a></span> : <a href="terminal_interface-curses-forms-field_types-regexp__ads.htm#ref_45_9">String_Access</a>;
+      <b>end</b> <b>record</b>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_52_14" href="terminal_interface-curses-forms-field_types-regexp__adb.htm#ref_47_14">Set_Field_Type</a></span> (<span class="symbol"><a name="ref_52_30" href="terminal_interface-curses-forms-field_types-regexp__adb.htm#ref_47_30">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                             <span class="symbol"><a name="ref_53_30" href="terminal_interface-curses-forms-field_types-regexp__adb.htm#ref_48_30">Typ</a></span> : <a href="terminal_interface-curses-forms-field_types-regexp__ads.htm#ref_47_9">Regular_Expression_Field</a>);
+   <b>pragma</b> Inline (Set_Field_Type);
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<a href="terminal_interface-curses-forms-field_types-regexp__ads.htm#ref_42_53">RegExp</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-forms-field_types-user-choice__adb.htm b/doc/html/ada/terminal_interface-curses-forms-field_types-user-choice__adb.htm
new file mode 100644
index 0000000..b9f797a
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-forms-field_types-user-choice__adb.htm
@@ -0,0 +1,123 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-forms-field_types-user-choice.adb</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-forms-field_types-user-choice.adb </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--          Terminal_Interface.Curses.Forms.Field_Types.User.Choice         --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 B O D Y                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1999-2011,2014 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.21 @</em></span>
+<span class="comment"><em>--  @Date: 2020/02/02 23:34:34 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>with</b> System.Address_To_Access_Conversions;
+<b>with</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>; <b>use</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>;
+
+<b>package</b> <b>body</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<a href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_45_53">User</a>.<span class="symbol"><a name="ref_46_63" href="terminal_interface-curses-forms-field_types-user-choice__ads.htm#ref_45_58">Choice</a></span> <b>is</b>
+
+   <b>package</b> Argument_Conversions <b>is</b>
+      <b>new</b> System.Address_To_Access_Conversions (<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_212_9">Argument</a>);
+
+   <b>function</b> <span class="symbol"><a name="ref_51_13" href="terminal_interface-curses-forms-field_types-user-choice__ads.htm#ref_81_13">Generic_Next</a></span> (<span class="symbol"><a name="ref_51_27" href="terminal_interface-curses-forms-field_types-user-choice__ads.htm#ref_81_27">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                          <span class="symbol"><a name="ref_52_27" href="terminal_interface-curses-forms-field_types-user-choice__ads.htm#ref_82_27">Usr</a></span> : System.Address) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>
+   <b>is</b>
+      <span class="symbol"><a name="ref_54_7">Result</a></span> : Boolean;
+      <span class="symbol"><a name="ref_55_7">Udf</a></span>    : <b>constant</b> <a href="terminal_interface-curses-forms-field_types-user-choice__ads.htm#ref_58_9">User_Defined_Field_Type_With_Choice_Access</a> :=
+        <a href="terminal_interface-curses-forms-field_types-user-choice__ads.htm#ref_58_9">User_Defined_Field_Type_With_Choice_Access</a>
+        (<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_217_9">Argument_Access</a> (Argument_Conversions.To_Pointer (<a href="terminal_interface-curses-forms-field_types-user-choice__ads.htm#ref_82_27">Usr</a>)).<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_213_7">Typ</a>);
+   <b>begin</b>
+      <a href="terminal_interface-curses-forms-field_types-user-choice__adb.htm#ref_54_7">Result</a> := <a href="terminal_interface-curses-forms-field_types-user-choice__ads.htm#ref_61_13">Next</a> (<a href="terminal_interface-curses-forms-field_types-user-choice__ads.htm#ref_81_27">Fld</a>, <a href="terminal_interface-curses-forms-field_types-user-choice__adb.htm#ref_55_7">Udf</a>.<b>all</b>);
+      <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a> (Boolean'Pos (<a href="terminal_interface-curses-forms-field_types-user-choice__adb.htm#ref_54_7">Result</a>));
+   <b>end</b> <a href="terminal_interface-curses-forms-field_types-user-choice__ads.htm#ref_81_13">Generic_Next</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_63_13" href="terminal_interface-curses-forms-field_types-user-choice__ads.htm#ref_88_13">Generic_Prev</a></span> (<span class="symbol"><a name="ref_63_27" href="terminal_interface-curses-forms-field_types-user-choice__ads.htm#ref_88_27">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                          <span class="symbol"><a name="ref_64_27" href="terminal_interface-curses-forms-field_types-user-choice__ads.htm#ref_89_27">Usr</a></span> : System.Address) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>
+   <b>is</b>
+      <span class="symbol"><a name="ref_66_7">Result</a></span> : Boolean;
+      <span class="symbol"><a name="ref_67_7">Udf</a></span>    : <b>constant</b> <a href="terminal_interface-curses-forms-field_types-user-choice__ads.htm#ref_58_9">User_Defined_Field_Type_With_Choice_Access</a> :=
+        <a href="terminal_interface-curses-forms-field_types-user-choice__ads.htm#ref_58_9">User_Defined_Field_Type_With_Choice_Access</a>
+        (<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_217_9">Argument_Access</a> (Argument_Conversions.To_Pointer (<a href="terminal_interface-curses-forms-field_types-user-choice__ads.htm#ref_89_27">Usr</a>)).<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_213_7">Typ</a>);
+   <b>begin</b>
+      <a href="terminal_interface-curses-forms-field_types-user-choice__adb.htm#ref_66_7">Result</a> := <a href="terminal_interface-curses-forms-field_types-user-choice__ads.htm#ref_68_13">Previous</a> (<a href="terminal_interface-curses-forms-field_types-user-choice__ads.htm#ref_88_27">Fld</a>, <a href="terminal_interface-curses-forms-field_types-user-choice__adb.htm#ref_67_7">Udf</a>.<b>all</b>);
+      <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a> (Boolean'Pos (<a href="terminal_interface-curses-forms-field_types-user-choice__adb.htm#ref_66_7">Result</a>));
+   <b>end</b> <a href="terminal_interface-curses-forms-field_types-user-choice__ads.htm#ref_88_13">Generic_Prev</a>;
+
+   <span class="comment"><em>--  -----------------------------------------------------------------------</em></span>
+   <span class="comment"><em>--</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_77_13" href="terminal_interface-curses-forms-field_types-user-choice__ads.htm#ref_79_13">C_Generic_Choice</a></span> <b>return</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_133_9">C_Field_Type</a>
+   <b>is</b>
+      <span class="symbol"><a name="ref_79_7">Res</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <span class="symbol"><a name="ref_80_7">T</a></span>   : <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_133_9">C_Field_Type</a>;
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_143_4">M_Generic_Choice</a> = <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_135_4">Null_Field_Type</a> <b>then</b>
+         <a href="terminal_interface-curses-forms-field_types-user-choice__adb.htm#ref_80_7">T</a> := <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_223_13">New_Fieldtype</a> (<a href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_82_13">Generic_Field_Check</a>'<b>Access</b>,
+                             <a href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_89_13">Generic_Char_Check</a>'<b>Access</b>);
+         <b>if</b> <a href="terminal_interface-curses-forms-field_types-user-choice__adb.htm#ref_80_7">T</a> = <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_135_4">Null_Field_Type</a> <b>then</b>
+            <b>raise</b> <a href="terminal_interface-curses-forms__ads.htm#ref_288_4">Form_Exception</a>;
+         <b>else</b>
+            <a href="terminal_interface-curses-forms-field_types-user-choice__adb.htm#ref_79_7">Res</a> := <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_228_13">Set_Fieldtype_Arg</a> (<a href="terminal_interface-curses-forms-field_types-user-choice__adb.htm#ref_80_7">T</a>,
+                                      <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_163_13">Make_Arg</a>'<b>Access</b>,
+                                      <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_168_13">Copy_Arg</a>'<b>Access</b>,
+                                      <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_173_14">Free_Arg</a>'<b>Access</b>);
+            <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms-field_types-user-choice__adb.htm#ref_79_7">Res</a>);
+
+            <a href="terminal_interface-curses-forms-field_types-user-choice__adb.htm#ref_79_7">Res</a> := <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_235_13">Set_Fieldtype_Choice</a> (<a href="terminal_interface-curses-forms-field_types-user-choice__adb.htm#ref_80_7">T</a>,
+                                         <a href="terminal_interface-curses-forms-field_types-user-choice__ads.htm#ref_81_13">Generic_Next</a>'<b>Access</b>,
+                                         <a href="terminal_interface-curses-forms-field_types-user-choice__ads.htm#ref_88_13">Generic_Prev</a>'<b>Access</b>);
+            <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms-field_types-user-choice__adb.htm#ref_79_7">Res</a>);
+         <b>end</b> <b>if</b>;
+         <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_143_4">M_Generic_Choice</a> := <a href="terminal_interface-curses-forms-field_types-user-choice__adb.htm#ref_80_7">T</a>;
+      <b>end</b> <b>if</b>;
+      <b>pragma</b> Assert (<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_143_4">M_Generic_Choice</a> /= <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_135_4">Null_Field_Type</a>);
+      <b>return</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_143_4">M_Generic_Choice</a>;
+   <b>end</b> <a href="terminal_interface-curses-forms-field_types-user-choice__ads.htm#ref_79_13">C_Generic_Choice</a>;
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<a href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_45_53">User</a>.<a href="terminal_interface-curses-forms-field_types-user-choice__ads.htm#ref_45_58">Choice</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-forms-field_types-user-choice__ads.htm b/doc/html/ada/terminal_interface-curses-forms-field_types-user-choice__ads.htm
new file mode 100644
index 0000000..74a6588
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-forms-field_types-user-choice__ads.htm
@@ -0,0 +1,113 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-forms-field_types-user-choice.ads</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-forms-field_types-user-choice.ads </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--           Terminal_Interface.Curses.Forms.Field_Types.User.Choice        --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 S P E C                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1999-2008,2011 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.15 @</em></span>
+<span class="comment"><em>--  @Date: 2020/02/02 23:34:34 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>with</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C;
+
+<b>package</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<a href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_45_53">User</a>.<span class="symbol"><a name="ref_45_58" href="terminal_interface-curses-forms-field_types-user-choice__adb.htm#ref_46_63">Choice</a></span> <b>is</b>
+   <b>pragma</b> Preelaborate
+     (<a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<a href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_45_53">User</a>.<a href="terminal_interface-curses-forms-field_types-user-choice__ads.htm#ref_45_58">Choice</a>);
+
+   <b>subtype</b> <span class="symbol"><a name="ref_49_12">C_Int</a></span> <b>is</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.int;
+
+   <b>type</b> <span class="symbol"><a name="ref_51_9">User_Defined_Field_Type_With_Choice</a></span> <b>is</b> <b>abstract</b> <b>new</b>
+     <a href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_49_9">User_Defined_Field_Type</a> <b>with</b> <b>null</b> <b>record</b>;
+   <span class="comment"><em>--  This is the root of the mechanism we use to create field types in</em></span>
+   <span class="comment"><em>--  Ada95 that allow the prev/next mechanism. You should your own type</em></span>
+   <span class="comment"><em>--  derive from this one and implement the Field_Check, Character_Check</em></span>
+   <span class="comment"><em>--  Next and Previous functions for your own type.</em></span>
+
+   <b>type</b> <span class="symbol"><a name="ref_58_9">User_Defined_Field_Type_With_Choice_Access</a></span> <b>is</b> <b>access</b> <b>all</b>
+     <a href="terminal_interface-curses-forms-field_types-user-choice__ads.htm#ref_51_9">User_Defined_Field_Type_With_Choice</a>'Class;
+
+   <b>function</b> <span class="symbol"><a name="ref_61_13">Next</a></span>
+     (<span class="symbol"><a name="ref_62_7">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+      <span class="symbol"><a name="ref_63_7">Typ</a></span> : <a href="terminal_interface-curses-forms-field_types-user-choice__ads.htm#ref_51_9">User_Defined_Field_Type_With_Choice</a>) <b>return</b> Boolean
+      <b>is</b> <b>abstract</b>;
+   <span class="comment"><em>--  If True is returned, the function successfully generated a next</em></span>
+   <span class="comment"><em>--  value into the fields buffer.</em></span>
+
+   <b>function</b> <span class="symbol"><a name="ref_68_13">Previous</a></span>
+     (<span class="symbol"><a name="ref_69_7">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+      <span class="symbol"><a name="ref_70_7">Typ</a></span> : <a href="terminal_interface-curses-forms-field_types-user-choice__ads.htm#ref_51_9">User_Defined_Field_Type_With_Choice</a>) <b>return</b> Boolean
+      <b>is</b> <b>abstract</b>;
+   <span class="comment"><em>--  If True is returned, the function successfully generated a previous</em></span>
+   <span class="comment"><em>--  value into the fields buffer.</em></span>
+
+   <span class="comment"><em>--  +----------------------------------------------------------------------</em></span>
+   <span class="comment"><em>--  | Private Part.</em></span>
+   <span class="comment"><em>--  |</em></span>
+<b>private</b>
+   <b>function</b> <span class="symbol"><a name="ref_79_13" href="terminal_interface-curses-forms-field_types-user-choice__adb.htm#ref_77_13">C_Generic_Choice</a></span> <b>return</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_133_9">C_Field_Type</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_81_13" href="terminal_interface-curses-forms-field_types-user-choice__adb.htm#ref_51_13">Generic_Next</a></span> (<span class="symbol"><a name="ref_81_27" href="terminal_interface-curses-forms-field_types-user-choice__adb.htm#ref_51_27">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                          <span class="symbol"><a name="ref_82_27" href="terminal_interface-curses-forms-field_types-user-choice__adb.htm#ref_52_27">Usr</a></span> : System.Address) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>;
+   <b>pragma</b> Convention (C, <a href="terminal_interface-curses-forms-field_types-user-choice__ads.htm#ref_81_13">Generic_Next</a>);
+   <span class="comment"><em>--  This is the generic next Choice_Function for the low-level fieldtype</em></span>
+   <span class="comment"><em>--  representing all the User_Defined_Field_Type derivatives. It routes</em></span>
+   <span class="comment"><em>--  the call to the Next implementation for the type.</em></span>
+
+   <b>function</b> <span class="symbol"><a name="ref_88_13" href="terminal_interface-curses-forms-field_types-user-choice__adb.htm#ref_63_13">Generic_Prev</a></span> (<span class="symbol"><a name="ref_88_27" href="terminal_interface-curses-forms-field_types-user-choice__adb.htm#ref_63_27">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                          <span class="symbol"><a name="ref_89_27" href="terminal_interface-curses-forms-field_types-user-choice__adb.htm#ref_64_27">Usr</a></span> : System.Address) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>;
+   <b>pragma</b> Convention (C, <a href="terminal_interface-curses-forms-field_types-user-choice__ads.htm#ref_88_13">Generic_Prev</a>);
+   <span class="comment"><em>--  This is the generic prev Choice_Function for the low-level fieldtype</em></span>
+   <span class="comment"><em>--  representing all the User_Defined_Field_Type derivatives. It routes</em></span>
+   <span class="comment"><em>--  the call to the Previous implementation for the type.</em></span>
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<a href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_45_53">User</a>.<a href="terminal_interface-curses-forms-field_types-user-choice__ads.htm#ref_45_58">Choice</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-forms-field_types-user__adb.htm b/doc/html/ada/terminal_interface-curses-forms-field_types-user__adb.htm
new file mode 100644
index 0000000..066df29
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-forms-field_types-user__adb.htm
@@ -0,0 +1,145 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-forms-field_types-user.adb</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-forms-field_types-user.adb </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--              Terminal_Interface.Curses.Forms.Field_Types.User            --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 B O D Y                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1999-2011,2014 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.24 @</em></span>
+<span class="comment"><em>--  @Date: 2020/02/02 23:34:34 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>with</b> System.Address_To_Access_Conversions;
+<b>with</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>; <b>use</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>;
+
+<b>package</b> <b>body</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<span class="symbol"><a name="ref_46_58" href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_45_53">User</a></span> <b>is</b>
+
+   <b>procedure</b> <span class="symbol"><a name="ref_48_14" href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_71_14">Set_Field_Type</a></span> (<span class="symbol"><a name="ref_48_30" href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_71_30">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                             <span class="symbol"><a name="ref_49_30" href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_72_30">Typ</a></span> : <a href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_49_9">User_Defined_Field_Type</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_51_16" href="terminal_interface-curses-forms-field_types-user__adb.htm#ref_60_16">Allocate_Arg</a></span> (<span class="symbol"><a name="ref_51_30" href="terminal_interface-curses-forms-field_types-user__adb.htm#ref_60_30">T</a></span> : <a href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_49_9">User_Defined_Field_Type</a>'Class)
+                             <b>return</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_217_9">Argument_Access</a>;
+
+      <b>function</b> <span class="symbol"><a name="ref_54_16">Set_Fld_Type</a></span> (<span class="symbol"><a name="ref_54_30">F</a></span>    : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a> := <a href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_71_30">Fld</a>;
+                             <span class="symbol"><a name="ref_55_30">Cft</a></span>  : <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_133_9">C_Field_Type</a> := <a href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_80_13">C_Generic_Type</a>;
+                             <span class="symbol"><a name="ref_56_30">Arg1</a></span> : <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_217_9">Argument_Access</a>)
+                             <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Fld_Type, "set_field_type_user");
+
+      <b>function</b> <span class="symbol"><a name="ref_60_16" href="terminal_interface-curses-forms-field_types-user__adb.htm#ref_51_16">Allocate_Arg</a></span> (<span class="symbol"><a name="ref_60_30" href="terminal_interface-curses-forms-field_types-user__adb.htm#ref_51_30">T</a></span> : <a href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_49_9">User_Defined_Field_Type</a>'Class)
+                             <b>return</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_217_9">Argument_Access</a>
+      <b>is</b>
+         <span class="symbol"><a name="ref_63_10">Ptr</a></span> : <b>constant</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_64_9">Field_Type_Access</a>
+             := <b>new</b> <a href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_49_9">User_Defined_Field_Type</a>'Class'(<a href="terminal_interface-curses-forms-field_types-user__adb.htm#ref_51_30">T</a>);
+      <b>begin</b>
+         <b>return</b> <b>new</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_212_9">Argument</a>'(<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_214_7">Usr</a> =&gt; System.Null_Address,
+                              <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_213_7">Typ</a> =&gt; <a href="terminal_interface-curses-forms-field_types-user__adb.htm#ref_63_10">Ptr</a>,
+                              <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_215_7">Cft</a> =&gt; <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_135_4">Null_Field_Type</a>);
+      <b>end</b> <a href="terminal_interface-curses-forms-field_types-user__adb.htm#ref_51_16">Allocate_Arg</a>;
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms-field_types-user__adb.htm#ref_54_16">Set_Fld_Type</a> (<a href="terminal_interface-curses-forms-field_types-user__adb.htm#ref_56_30">Arg1</a> =&gt; <a href="terminal_interface-curses-forms-field_types-user__adb.htm#ref_51_16">Allocate_Arg</a> (<a href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_72_30">Typ</a>)));
+   <b>end</b> <a href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_71_14">Set_Field_Type</a>;
+
+   <b>package</b> Argument_Conversions <b>is</b>
+      <b>new</b> System.Address_To_Access_Conversions (<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_212_9">Argument</a>);
+
+   <b>function</b> <span class="symbol"><a name="ref_78_13" href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_82_13">Generic_Field_Check</a></span> (<span class="symbol"><a name="ref_78_34" href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_82_34">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                                 <span class="symbol"><a name="ref_79_34" href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_83_34">Usr</a></span> : System.Address) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>
+   <b>is</b>
+      <span class="symbol"><a name="ref_81_7">Result</a></span> : Boolean;
+      <span class="symbol"><a name="ref_82_7">Udf</a></span>    : <b>constant</b> <a href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_54_9">User_Defined_Field_Type_Access</a> :=
+        <a href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_54_9">User_Defined_Field_Type_Access</a>
+          (<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_217_9">Argument_Access</a> (Argument_Conversions.To_Pointer (<a href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_83_34">Usr</a>)).<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_213_7">Typ</a>);
+   <b>begin</b>
+      <a href="terminal_interface-curses-forms-field_types-user__adb.htm#ref_81_7">Result</a> := <a href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_57_13">Field_Check</a> (<a href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_82_34">Fld</a>, <a href="terminal_interface-curses-forms-field_types-user__adb.htm#ref_82_7">Udf</a>.<b>all</b>);
+      <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a> (Boolean'Pos (<a href="terminal_interface-curses-forms-field_types-user__adb.htm#ref_81_7">Result</a>));
+   <b>end</b> <a href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_82_13">Generic_Field_Check</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_90_13" href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_89_13">Generic_Char_Check</a></span> (<span class="symbol"><a name="ref_90_33" href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_89_33">Ch</a></span>  : <a href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_47_12">C_Int</a>;
+                                <span class="symbol"><a name="ref_91_33" href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_90_33">Usr</a></span> : System.Address) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>
+   <b>is</b>
+      <span class="symbol"><a name="ref_93_7">Result</a></span> : Boolean;
+      <span class="symbol"><a name="ref_94_7">Udf</a></span>    : <b>constant</b> <a href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_54_9">User_Defined_Field_Type_Access</a> :=
+        <a href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_54_9">User_Defined_Field_Type_Access</a>
+          (<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_217_9">Argument_Access</a> (Argument_Conversions.To_Pointer (<a href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_90_33">Usr</a>)).<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_213_7">Typ</a>);
+   <b>begin</b>
+      <a href="terminal_interface-curses-forms-field_types-user__adb.htm#ref_93_7">Result</a> := <a href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_64_13">Character_Check</a> (Character'Val (<a href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_89_33">Ch</a>), <a href="terminal_interface-curses-forms-field_types-user__adb.htm#ref_94_7">Udf</a>.<b>all</b>);
+      <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a> (Boolean'Pos (<a href="terminal_interface-curses-forms-field_types-user__adb.htm#ref_93_7">Result</a>));
+   <b>end</b> <a href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_89_13">Generic_Char_Check</a>;
+
+   <span class="comment"><em>--  -----------------------------------------------------------------------</em></span>
+   <span class="comment"><em>--</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_104_13" href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_80_13">C_Generic_Type</a></span> <b>return</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_133_9">C_Field_Type</a>
+   <b>is</b>
+      <span class="symbol"><a name="ref_106_7">Res</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <span class="symbol"><a name="ref_107_7">T</a></span>   : <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_133_9">C_Field_Type</a>;
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_142_4">M_Generic_Type</a> = <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_135_4">Null_Field_Type</a> <b>then</b>
+         <a href="terminal_interface-curses-forms-field_types-user__adb.htm#ref_107_7">T</a> := <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_223_13">New_Fieldtype</a> (<a href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_82_13">Generic_Field_Check</a>'<b>Access</b>,
+                             <a href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_89_13">Generic_Char_Check</a>'<b>Access</b>);
+         <b>if</b> <a href="terminal_interface-curses-forms-field_types-user__adb.htm#ref_107_7">T</a> = <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_135_4">Null_Field_Type</a> <b>then</b>
+            <b>raise</b> <a href="terminal_interface-curses-forms__ads.htm#ref_288_4">Form_Exception</a>;
+         <b>else</b>
+            <a href="terminal_interface-curses-forms-field_types-user__adb.htm#ref_106_7">Res</a> := <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_228_13">Set_Fieldtype_Arg</a> (<a href="terminal_interface-curses-forms-field_types-user__adb.htm#ref_107_7">T</a>,
+                                      <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_163_13">Make_Arg</a>'<b>Access</b>,
+                                      <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_168_13">Copy_Arg</a>'<b>Access</b>,
+                                      <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_173_14">Free_Arg</a>'<b>Access</b>);
+            <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms-field_types-user__adb.htm#ref_106_7">Res</a>);
+         <b>end</b> <b>if</b>;
+         <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_142_4">M_Generic_Type</a> := <a href="terminal_interface-curses-forms-field_types-user__adb.htm#ref_107_7">T</a>;
+      <b>end</b> <b>if</b>;
+      <b>pragma</b> Assert (<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_142_4">M_Generic_Type</a> /= <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_135_4">Null_Field_Type</a>);
+      <b>return</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_142_4">M_Generic_Type</a>;
+   <b>end</b> <a href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_80_13">C_Generic_Type</a>;
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<a href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_45_53">User</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-forms-field_types-user__ads.htm b/doc/html/ada/terminal_interface-curses-forms-field_types-user__ads.htm
new file mode 100644
index 0000000..7190283
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-forms-field_types-user__ads.htm
@@ -0,0 +1,114 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-forms-field_types-user.ads</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-forms-field_types-user.ads </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--               Terminal_Interface.Curses.Forms.Field_Types.User           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 S P E C                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1999-2009,2011 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.16 @</em></span>
+<span class="comment"><em>--  @Date: 2020/02/02 23:34:34 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>with</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C;
+
+<b>package</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<span class="symbol"><a name="ref_45_53" href="terminal_interface-curses-forms-field_types-user__adb.htm#ref_46_58">User</a></span> <b>is</b>
+   <b>pragma</b> Preelaborate (<a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<a href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_45_53">User</a>);
+   <b>subtype</b> <span class="symbol"><a name="ref_47_12">C_Int</a></span> <b>is</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.int;
+
+   <b>type</b> <span class="symbol"><a name="ref_49_9">User_Defined_Field_Type</a></span> <b>is</b> <b>abstract</b> <b>new</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_53_9">Field_Type</a> <b>with</b> <b>null</b> <b>record</b>;
+   <span class="comment"><em>--  This is the root of the mechanism we use to create field types in</em></span>
+   <span class="comment"><em>--  Ada95. You should your own type derive from this one and implement</em></span>
+   <span class="comment"><em>--  the Field_Check and Character_Check functions for your own type.</em></span>
+
+   <b>type</b> <span class="symbol"><a name="ref_54_9">User_Defined_Field_Type_Access</a></span> <b>is</b> <b>access</b> <b>all</b>
+     <a href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_49_9">User_Defined_Field_Type</a>'Class;
+
+   <b>function</b> <span class="symbol"><a name="ref_57_13">Field_Check</a></span>
+     (<span class="symbol"><a name="ref_58_7">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+      <span class="symbol"><a name="ref_59_7">Typ</a></span> : <a href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_49_9">User_Defined_Field_Type</a>) <b>return</b> Boolean
+      <b>is</b> <b>abstract</b>;
+   <span class="comment"><em>--  If True is returned, the field is considered valid, otherwise it is</em></span>
+   <span class="comment"><em>--  invalid.</em></span>
+
+   <b>function</b> <span class="symbol"><a name="ref_64_13">Character_Check</a></span>
+     (<span class="symbol"><a name="ref_65_7">Ch</a></span>  : Character;
+      <span class="symbol"><a name="ref_66_7">Typ</a></span> : <a href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_49_9">User_Defined_Field_Type</a>) <b>return</b> Boolean
+      <b>is</b> <b>abstract</b>;
+   <span class="comment"><em>--  If True is returned, the character is considered as valid for the</em></span>
+   <span class="comment"><em>--  field, otherwise as invalid.</em></span>
+
+   <b>procedure</b> <span class="symbol"><a name="ref_71_14" href="terminal_interface-curses-forms-field_types-user__adb.htm#ref_48_14">Set_Field_Type</a></span> (<span class="symbol"><a name="ref_71_30" href="terminal_interface-curses-forms-field_types-user__adb.htm#ref_48_30">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                             <span class="symbol"><a name="ref_72_30" href="terminal_interface-curses-forms-field_types-user__adb.htm#ref_49_30">Typ</a></span> : <a href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_49_9">User_Defined_Field_Type</a>);
+   <span class="comment"><em>--  This should work for all types derived from User_Defined_Field_Type.</em></span>
+   <span class="comment"><em>--  No need to reimplement it for your derived type.</em></span>
+
+   <span class="comment"><em>--  +----------------------------------------------------------------------</em></span>
+   <span class="comment"><em>--  | Private Part.</em></span>
+   <span class="comment"><em>--  | Used by the Choice child package.</em></span>
+<b>private</b>
+   <b>function</b> <span class="symbol"><a name="ref_80_13" href="terminal_interface-curses-forms-field_types-user__adb.htm#ref_104_13">C_Generic_Type</a></span>   <b>return</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_133_9">C_Field_Type</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_82_13" href="terminal_interface-curses-forms-field_types-user__adb.htm#ref_78_13">Generic_Field_Check</a></span> (<span class="symbol"><a name="ref_82_34" href="terminal_interface-curses-forms-field_types-user__adb.htm#ref_78_34">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                                 <span class="symbol"><a name="ref_83_34" href="terminal_interface-curses-forms-field_types-user__adb.htm#ref_79_34">Usr</a></span> : System.Address) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>;
+   <b>pragma</b> Convention (C, <a href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_82_13">Generic_Field_Check</a>);
+   <span class="comment"><em>--  This is the generic Field_Check_Function for the low-level fieldtype</em></span>
+   <span class="comment"><em>--  representing all the User_Defined_Field_Type derivatives. It routes</em></span>
+   <span class="comment"><em>--  the call to the Field_Check implementation for the type.</em></span>
+
+   <b>function</b> <span class="symbol"><a name="ref_89_13" href="terminal_interface-curses-forms-field_types-user__adb.htm#ref_90_13">Generic_Char_Check</a></span> (<span class="symbol"><a name="ref_89_33" href="terminal_interface-curses-forms-field_types-user__adb.htm#ref_90_33">Ch</a></span>  : <a href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_47_12">C_Int</a>;
+                                <span class="symbol"><a name="ref_90_33" href="terminal_interface-curses-forms-field_types-user__adb.htm#ref_91_33">Usr</a></span> : System.Address) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>;
+   <b>pragma</b> Convention (C, <a href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_89_13">Generic_Char_Check</a>);
+   <span class="comment"><em>--  This is the generic Char_Check_Function for the low-level fieldtype</em></span>
+   <span class="comment"><em>--  representing all the User_Defined_Field_Type derivatives. It routes</em></span>
+   <span class="comment"><em>--  the call to the Character_Check implementation for the type.</em></span>
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>.<a href="terminal_interface-curses-forms-field_types-user__ads.htm#ref_45_53">User</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-forms-field_types__adb.htm b/doc/html/ada/terminal_interface-curses-forms-field_types__adb.htm
new file mode 100644
index 0000000..c028825
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-forms-field_types__adb.htm
@@ -0,0 +1,288 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-forms-field_types.adb</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-forms-field_types.adb </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                 Terminal_Interface.Curses.Forms.Field_Types              --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 B O D Y                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1999-2011,2014 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.29 @</em></span>
+<span class="comment"><em>--  @Date: 2020/02/02 23:34:34 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>with</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>; <b>use</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>;
+<b>with</b> Ada.Unchecked_Deallocation;
+<b>with</b> System.Address_To_Access_Conversions;
+
+<span class="comment"><em>--  |</em></span>
+<span class="comment"><em>--  |=====================================================================</em></span>
+<span class="comment"><em>--  | man page form_fieldtype.3x</em></span>
+<span class="comment"><em>--  |=====================================================================</em></span>
+<span class="comment"><em>--  |</em></span>
+<b>package</b> <b>body</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<span class="symbol"><a name="ref_52_46" href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a></span> <b>is</b>
+
+   <b>use</b> <b>type</b> System.Address;
+
+   <b>package</b> Argument_Conversions <b>is</b>
+      <b>new</b> System.Address_To_Access_Conversions (<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_212_9">Argument</a>);
+
+   <b>function</b> <span class="symbol"><a name="ref_59_13">Get_Fieldtype</a></span> (<span class="symbol"><a name="ref_59_28">F</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>) <b>return</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_133_9">C_Field_Type</a>;
+   <b>pragma</b> Import (C, Get_Fieldtype, "field_type");
+
+   <b>function</b> <span class="symbol"><a name="ref_62_13">Get_Arg</a></span> (<span class="symbol"><a name="ref_62_22">F</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>) <b>return</b> System.Address;
+   <b>pragma</b> Import (C, Get_Arg, "field_arg");
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | man page form_field_validation.3x</em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_71_13" href="terminal_interface-curses-forms-field_types__ads.htm#ref_80_13">Get_Type</a></span> (<span class="symbol"><a name="ref_71_23" href="terminal_interface-curses-forms-field_types__ads.htm#ref_80_23">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>) <b>return</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_64_9">Field_Type_Access</a>
+   <b>is</b>
+      <span class="symbol"><a name="ref_73_7">Low_Level</a></span> : <b>constant</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_133_9">C_Field_Type</a> := <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_59_13">Get_Fieldtype</a> (<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_80_23">Fld</a>);
+      <span class="symbol"><a name="ref_74_7">Arg</a></span> : <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_217_9">Argument_Access</a>;
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_73_7">Low_Level</a> = <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_135_4">Null_Field_Type</a> <b>then</b>
+         <b>return</b> <b>null</b>;
+      <b>else</b>
+         <b>if</b> <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_73_7">Low_Level</a> = <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_144_4">M_Builtin_Router</a> <b>or</b> <b>else</b>
+            <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_73_7">Low_Level</a> = <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_142_4">M_Generic_Type</a> <b>or</b> <b>else</b>
+            <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_73_7">Low_Level</a> = <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_145_4">M_Choice_Router</a> <b>or</b> <b>else</b>
+            <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_73_7">Low_Level</a> = <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_143_4">M_Generic_Choice</a>
+         <b>then</b>
+            <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_74_7">Arg</a> := <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_217_9">Argument_Access</a>
+         (Argument_Conversions.To_Pointer (<a href="terminal_interface-curses-forms-field_types__adb.htm#ref_62_13">Get_Arg</a> (<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_80_23">Fld</a>)));
+            <b>if</b> <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_74_7">Arg</a> = <b>null</b> <b>then</b>
+               <b>raise</b> <a href="terminal_interface-curses-forms__ads.htm#ref_288_4">Form_Exception</a>;
+            <b>else</b>
+               <b>return</b> <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_74_7">Arg</a>.<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_213_7">Typ</a>;
+            <b>end</b> <b>if</b>;
+         <b>else</b>
+            <b>raise</b> <a href="terminal_interface-curses-forms__ads.htm#ref_288_4">Form_Exception</a>;
+         <b>end</b> <b>if</b>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_80_13">Get_Type</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_97_13" href="terminal_interface-curses-forms-field_types__ads.htm#ref_168_13">Copy_Arg</a></span> (<span class="symbol"><a name="ref_97_23" href="terminal_interface-curses-forms-field_types__ads.htm#ref_168_23">Usr</a></span> : System.Address) <b>return</b> System.Address
+   <b>is</b>
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_168_23">Usr</a>;
+   <b>end</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_168_13">Copy_Arg</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_103_14" href="terminal_interface-curses-forms-field_types__ads.htm#ref_173_14">Free_Arg</a></span> (<span class="symbol"><a name="ref_103_24" href="terminal_interface-curses-forms-field_types__ads.htm#ref_173_24">Usr</a></span> : System.Address)
+   <b>is</b>
+      <b>procedure</b> Free_Type <b>is</b> <b>new</b> Ada.Unchecked_Deallocation
+        (<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_53_9">Field_Type</a>'Class, <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_64_9">Field_Type_Access</a>);
+      <b>procedure</b> Freeargs <b>is</b> <b>new</b> Ada.Unchecked_Deallocation
+        (<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_212_9">Argument</a>, <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_217_9">Argument_Access</a>);
+
+      <span class="symbol"><a name="ref_110_7">To_Be_Free</a></span> : <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_217_9">Argument_Access</a>
+   := <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_217_9">Argument_Access</a> (Argument_Conversions.To_Pointer (<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_173_24">Usr</a>));
+      <span class="symbol"><a name="ref_112_7">Low_Level</a></span>  : <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_133_9">C_Field_Type</a>;
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_110_7">To_Be_Free</a> /= <b>null</b> <b>then</b>
+         <b>if</b> <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_110_7">To_Be_Free</a>.<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_214_7">Usr</a> /= System.Null_Address <b>then</b>
+            <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_112_7">Low_Level</a> := <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_110_7">To_Be_Free</a>.<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_215_7">Cft</a>;
+            <b>if</b> <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_112_7">Low_Level</a>.<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_127_10">Freearg</a> /= <b>null</b> <b>then</b>
+               <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_112_7">Low_Level</a>.<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_127_10">Freearg</a> (<a href="terminal_interface-curses-forms-field_types__adb.htm#ref_110_7">To_Be_Free</a>.<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_214_7">Usr</a>);
+            <b>end</b> <b>if</b>;
+         <b>end</b> <b>if</b>;
+         <b>if</b> <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_110_7">To_Be_Free</a>.<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_213_7">Typ</a> /= <b>null</b> <b>then</b>
+            Free_Type (<a href="terminal_interface-curses-forms-field_types__adb.htm#ref_110_7">To_Be_Free</a>.<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_213_7">Typ</a>);
+         <b>end</b> <b>if</b>;
+         Freeargs (<a href="terminal_interface-curses-forms-field_types__adb.htm#ref_110_7">To_Be_Free</a>);
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_173_14">Free_Arg</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_128_14" href="terminal_interface-curses-forms-field_types__ads.htm#ref_152_14">Wrap_Builtin</a></span> (<span class="symbol"><a name="ref_128_28" href="terminal_interface-curses-forms-field_types__ads.htm#ref_152_28">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                           <span class="symbol"><a name="ref_129_28" href="terminal_interface-curses-forms-field_types__ads.htm#ref_153_28">Typ</a></span> : <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_53_9">Field_Type</a>'Class;
+                           <span class="symbol"><a name="ref_130_28" href="terminal_interface-curses-forms-field_types__ads.htm#ref_154_28">Cft</a></span> : <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_133_9">C_Field_Type</a> := <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_149_13">C_Builtin_Router</a>)
+   <b>is</b>
+      <span class="symbol"><a name="ref_132_7">Usr_Arg</a></span>   : <b>constant</b> System.Address := <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_62_13">Get_Arg</a> (<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_152_28">Fld</a>);
+      <span class="symbol"><a name="ref_133_7">Low_Level</a></span> : <b>constant</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_133_9">C_Field_Type</a> := <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_59_13">Get_Fieldtype</a> (<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_152_28">Fld</a>);
+      <span class="symbol"><a name="ref_134_7">Arg</a></span> : <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_217_9">Argument_Access</a>;
+      <b>function</b> <span class="symbol"><a name="ref_135_16">Set_Fld_Type</a></span> (<span class="symbol"><a name="ref_135_30">F</a></span>    : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a> := <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_152_28">Fld</a>;
+                             <span class="symbol"><a name="ref_136_30">Cf</a></span>   : <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_133_9">C_Field_Type</a> := <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_154_28">Cft</a>;
+                             <span class="symbol"><a name="ref_137_30">Arg1</a></span> : <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_217_9">Argument_Access</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Fld_Type, "set_field_type_user");
+
+   <b>begin</b>
+      <b>pragma</b> Assert (<a href="terminal_interface-curses-forms-field_types__adb.htm#ref_133_7">Low_Level</a> /= <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_135_4">Null_Field_Type</a>);
+      <b>if</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_154_28">Cft</a> /= <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_149_13">C_Builtin_Router</a> <b>and</b> <b>then</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_154_28">Cft</a> /= <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_150_13">C_Choice_Router</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses-forms__ads.htm#ref_288_4">Form_Exception</a>;
+      <b>else</b>
+         <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_134_7">Arg</a> := <b>new</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_212_9">Argument</a>'(<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_214_7">Usr</a> =&gt; System.Null_Address,
+                              <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_213_7">Typ</a> =&gt; <b>new</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_53_9">Field_Type</a>'Class'(<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_153_28">Typ</a>),
+                              <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_215_7">Cft</a> =&gt; <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_59_13">Get_Fieldtype</a> (<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_152_28">Fld</a>));
+         <b>if</b> <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_132_7">Usr_Arg</a> /= System.Null_Address <b>then</b>
+            <b>if</b> <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_133_7">Low_Level</a>.<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_126_10">Copyarg</a> /= <b>null</b> <b>then</b>
+               <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_134_7">Arg</a>.<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_214_7">Usr</a> := <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_133_7">Low_Level</a>.<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_126_10">Copyarg</a> (<a href="terminal_interface-curses-forms-field_types__adb.htm#ref_132_7">Usr_Arg</a>);
+            <b>else</b>
+               <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_134_7">Arg</a>.<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_214_7">Usr</a> := <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_132_7">Usr_Arg</a>;
+            <b>end</b> <b>if</b>;
+         <b>end</b> <b>if</b>;
+
+         <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms-field_types__adb.htm#ref_135_16">Set_Fld_Type</a> (<a href="terminal_interface-curses-forms-field_types__adb.htm#ref_137_30">Arg1</a> =&gt; <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_134_7">Arg</a>));
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_152_14">Wrap_Builtin</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_160_13" href="terminal_interface-curses-forms-field_types__ads.htm#ref_178_13">Field_Check_Router</a></span> (<span class="symbol"><a name="ref_160_33" href="terminal_interface-curses-forms-field_types__ads.htm#ref_178_33">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                                <span class="symbol"><a name="ref_161_33" href="terminal_interface-curses-forms-field_types__ads.htm#ref_179_33">Usr</a></span> : System.Address) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>
+   <b>is</b>
+      <span class="symbol"><a name="ref_163_7">Arg</a></span>  : <b>constant</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_217_9">Argument_Access</a>
+   := <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_217_9">Argument_Access</a> (Argument_Conversions.To_Pointer (<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_179_33">Usr</a>));
+   <b>begin</b>
+      <b>pragma</b> Assert (<a href="terminal_interface-curses-forms-field_types__adb.htm#ref_163_7">Arg</a> /= <b>null</b> <b>and</b> <b>then</b> <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_163_7">Arg</a>.<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_215_7">Cft</a> /= <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_135_4">Null_Field_Type</a>
+                     <b>and</b> <b>then</b> <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_163_7">Arg</a>.<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_213_7">Typ</a> /= <b>null</b>);
+      <b>if</b> <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_163_7">Arg</a>.<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_215_7">Cft</a>.<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_128_10">Fcheck</a> /= <b>null</b> <b>then</b>
+         <b>return</b> <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_163_7">Arg</a>.<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_215_7">Cft</a>.<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_128_10">Fcheck</a> (<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_178_33">Fld</a>, <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_163_7">Arg</a>.<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_214_7">Usr</a>);
+      <b>else</b>
+         <b>return</b> 1;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_178_13">Field_Check_Router</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_175_13" href="terminal_interface-curses-forms-field_types__ads.htm#ref_186_13">Char_Check_Router</a></span> (<span class="symbol"><a name="ref_175_32" href="terminal_interface-curses-forms-field_types__ads.htm#ref_186_32">Ch</a></span>  : <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_47_12">C_Int</a>;
+                               <span class="symbol"><a name="ref_176_32" href="terminal_interface-curses-forms-field_types__ads.htm#ref_187_32">Usr</a></span> : System.Address) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>
+   <b>is</b>
+      <span class="symbol"><a name="ref_178_7">Arg</a></span>  : <b>constant</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_217_9">Argument_Access</a>
+   := <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_217_9">Argument_Access</a> (Argument_Conversions.To_Pointer (<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_187_32">Usr</a>));
+   <b>begin</b>
+      <b>pragma</b> Assert (<a href="terminal_interface-curses-forms-field_types__adb.htm#ref_178_7">Arg</a> /= <b>null</b> <b>and</b> <b>then</b> <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_178_7">Arg</a>.<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_215_7">Cft</a> /= <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_135_4">Null_Field_Type</a>
+                     <b>and</b> <b>then</b> <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_178_7">Arg</a>.<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_213_7">Typ</a> /= <b>null</b>);
+      <b>if</b> <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_178_7">Arg</a>.<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_215_7">Cft</a>.<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_129_10">Ccheck</a> /= <b>null</b> <b>then</b>
+         <b>return</b> <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_178_7">Arg</a>.<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_215_7">Cft</a>.<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_129_10">Ccheck</a> (<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_186_32">Ch</a>, <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_178_7">Arg</a>.<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_214_7">Usr</a>);
+      <b>else</b>
+         <b>return</b> 1;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_186_13">Char_Check_Router</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_190_13" href="terminal_interface-curses-forms-field_types__ads.htm#ref_194_13">Next_Router</a></span> (<span class="symbol"><a name="ref_190_26" href="terminal_interface-curses-forms-field_types__ads.htm#ref_194_26">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                         <span class="symbol"><a name="ref_191_26" href="terminal_interface-curses-forms-field_types__ads.htm#ref_195_26">Usr</a></span> : System.Address) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>
+   <b>is</b>
+      <span class="symbol"><a name="ref_193_7">Arg</a></span>  : <b>constant</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_217_9">Argument_Access</a>
+   := <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_217_9">Argument_Access</a> (Argument_Conversions.To_Pointer (<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_195_26">Usr</a>));
+   <b>begin</b>
+      <b>pragma</b> Assert (<a href="terminal_interface-curses-forms-field_types__adb.htm#ref_193_7">Arg</a> /= <b>null</b> <b>and</b> <b>then</b> <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_193_7">Arg</a>.<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_215_7">Cft</a> /= <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_135_4">Null_Field_Type</a>
+                     <b>and</b> <b>then</b> <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_193_7">Arg</a>.<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_213_7">Typ</a> /= <b>null</b>);
+      <b>if</b> <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_193_7">Arg</a>.<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_215_7">Cft</a>.<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_130_10">Next</a> /= <b>null</b> <b>then</b>
+         <b>return</b> <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_193_7">Arg</a>.<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_215_7">Cft</a>.<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_130_10">Next</a> (<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_194_26">Fld</a>, <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_193_7">Arg</a>.<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_214_7">Usr</a>);
+      <b>else</b>
+         <b>return</b> 1;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_194_13">Next_Router</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_205_13" href="terminal_interface-curses-forms-field_types__ads.htm#ref_202_13">Prev_Router</a></span> (<span class="symbol"><a name="ref_205_26" href="terminal_interface-curses-forms-field_types__ads.htm#ref_202_26">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                         <span class="symbol"><a name="ref_206_26" href="terminal_interface-curses-forms-field_types__ads.htm#ref_203_26">Usr</a></span> : System.Address) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>
+   <b>is</b>
+      <span class="symbol"><a name="ref_208_7">Arg</a></span>  : <b>constant</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_217_9">Argument_Access</a> :=
+               <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_217_9">Argument_Access</a> (Argument_Conversions.To_Pointer (<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_203_26">Usr</a>));
+   <b>begin</b>
+      <b>pragma</b> Assert (<a href="terminal_interface-curses-forms-field_types__adb.htm#ref_208_7">Arg</a> /= <b>null</b> <b>and</b> <b>then</b> <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_208_7">Arg</a>.<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_215_7">Cft</a> /= <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_135_4">Null_Field_Type</a>
+                     <b>and</b> <b>then</b> <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_208_7">Arg</a>.<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_213_7">Typ</a> /= <b>null</b>);
+      <b>if</b> <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_208_7">Arg</a>.<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_215_7">Cft</a>.<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_130_16">Prev</a> /= <b>null</b> <b>then</b>
+         <b>return</b> <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_208_7">Arg</a>.<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_215_7">Cft</a>.<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_130_16">Prev</a> (<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_202_26">Fld</a>, <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_208_7">Arg</a>.<b>all</b>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_214_7">Usr</a>);
+      <b>else</b>
+         <b>return</b> 1;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_202_13">Prev_Router</a>;
+
+   <span class="comment"><em>--  -----------------------------------------------------------------------</em></span>
+   <span class="comment"><em>--</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_222_13" href="terminal_interface-curses-forms-field_types__ads.htm#ref_149_13">C_Builtin_Router</a></span> <b>return</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_133_9">C_Field_Type</a>
+   <b>is</b>
+      <span class="symbol"><a name="ref_224_7">T</a></span>   : <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_133_9">C_Field_Type</a>;
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_144_4">M_Builtin_Router</a> = <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_135_4">Null_Field_Type</a> <b>then</b>
+         <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_224_7">T</a> := <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_223_13">New_Fieldtype</a> (<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_178_13">Field_Check_Router</a>'<b>Access</b>,
+                             <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_186_13">Char_Check_Router</a>'<b>Access</b>);
+         <b>if</b> <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_224_7">T</a> = <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_135_4">Null_Field_Type</a> <b>then</b>
+            <b>raise</b> <a href="terminal_interface-curses-forms__ads.htm#ref_288_4">Form_Exception</a>;
+         <b>else</b>
+            <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_228_13">Set_Fieldtype_Arg</a> (<a href="terminal_interface-curses-forms-field_types__adb.htm#ref_224_7">T</a>,
+                                              <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_163_13">Make_Arg</a>'<b>Access</b>,
+                                              <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_168_13">Copy_Arg</a>'<b>Access</b>,
+                                              <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_173_14">Free_Arg</a>'<b>Access</b>));
+         <b>end</b> <b>if</b>;
+         <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_144_4">M_Builtin_Router</a> := <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_224_7">T</a>;
+      <b>end</b> <b>if</b>;
+      <b>pragma</b> Assert (<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_144_4">M_Builtin_Router</a> /= <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_135_4">Null_Field_Type</a>);
+      <b>return</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_144_4">M_Builtin_Router</a>;
+   <b>end</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_149_13">C_Builtin_Router</a>;
+
+   <span class="comment"><em>--  -----------------------------------------------------------------------</em></span>
+   <span class="comment"><em>--</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_245_13" href="terminal_interface-curses-forms-field_types__ads.htm#ref_150_13">C_Choice_Router</a></span> <b>return</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_133_9">C_Field_Type</a>
+   <b>is</b>
+      <span class="symbol"><a name="ref_247_7">T</a></span>   : <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_133_9">C_Field_Type</a>;
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_145_4">M_Choice_Router</a> = <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_135_4">Null_Field_Type</a> <b>then</b>
+         <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_247_7">T</a> := <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_223_13">New_Fieldtype</a> (<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_178_13">Field_Check_Router</a>'<b>Access</b>,
+                             <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_186_13">Char_Check_Router</a>'<b>Access</b>);
+         <b>if</b> <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_247_7">T</a> = <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_135_4">Null_Field_Type</a> <b>then</b>
+            <b>raise</b> <a href="terminal_interface-curses-forms__ads.htm#ref_288_4">Form_Exception</a>;
+         <b>else</b>
+            <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_228_13">Set_Fieldtype_Arg</a> (<a href="terminal_interface-curses-forms-field_types__adb.htm#ref_247_7">T</a>,
+                                              <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_163_13">Make_Arg</a>'<b>Access</b>,
+                                              <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_168_13">Copy_Arg</a>'<b>Access</b>,
+                                              <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_173_14">Free_Arg</a>'<b>Access</b>));
+
+            <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_235_13">Set_Fieldtype_Choice</a> (<a href="terminal_interface-curses-forms-field_types__adb.htm#ref_247_7">T</a>,
+                                                 <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_194_13">Next_Router</a>'<b>Access</b>,
+                                                 <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_202_13">Prev_Router</a>'<b>Access</b>));
+         <b>end</b> <b>if</b>;
+         <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_145_4">M_Choice_Router</a> := <a href="terminal_interface-curses-forms-field_types__adb.htm#ref_247_7">T</a>;
+      <b>end</b> <b>if</b>;
+      <b>pragma</b> Assert (<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_145_4">M_Choice_Router</a> /= <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_135_4">Null_Field_Type</a>);
+      <b>return</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_145_4">M_Choice_Router</a>;
+   <b>end</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_150_13">C_Choice_Router</a>;
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-forms-field_types__ads.htm b/doc/html/ada/terminal_interface-curses-forms-field_types__ads.htm
new file mode 100644
index 0000000..1970dd4
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-forms-field_types__ads.htm
@@ -0,0 +1,258 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-forms-field_types.ads</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-forms-field_types.ads </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                 Terminal_Interface.Curses.Forms.Field_Types              --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 S P E C                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2018,2020 Thomas E. Dickey                                     --</em></span>
+<span class="comment"><em>-- Copyright 1998-2011,2014 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.21 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>with</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C;
+<b>with</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>;
+
+<b>package</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<span class="symbol"><a name="ref_45_41" href="terminal_interface-curses-forms-field_types__adb.htm#ref_52_46">Field_Types</a></span> <b>is</b>
+   <b>pragma</b> Preelaborate (<a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>);
+   <b>subtype</b> <span class="symbol"><a name="ref_47_12">C_Int</a></span> <b>is</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.int;
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/form_fieldtype.3x.html">form_fieldtype.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <b>type</b> <span class="symbol"><a name="ref_53_9">Field_Type</a></span> <b>is</b> <b>abstract</b> <b>tagged</b> <b>null</b> <b>record</b>;
+   <span class="comment"><em>--  Abstract base type for all field types. A concrete field type</em></span>
+   <span class="comment"><em>--  is an extension that adds some data elements describing formats or</em></span>
+   <span class="comment"><em>--  boundary values for the type and validation routines.</em></span>
+   <span class="comment"><em>--  For the builtin low-level fieldtypes, the validation routines are</em></span>
+   <span class="comment"><em>--  already defined by the low-level C library.</em></span>
+   <span class="comment"><em>--  The builtin types like Alpha or AlphaNumeric etc. are defined in</em></span>
+   <span class="comment"><em>--  child packages of this package. You may use one of them as example</em></span>
+   <span class="comment"><em>--  how to create you own child packages for low-level field types that</em></span>
+   <span class="comment"><em>--  you may have already written in C.</em></span>
+
+   <b>type</b> <span class="symbol"><a name="ref_64_9">Field_Type_Access</a></span> <b>is</b> <b>access</b> <b>all</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_53_9">Field_Type</a>'Class;
+
+   <span class="comment"><em>--  <A NAME="AFU_1">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_67_14">Set_Field_Type</a></span> (<span class="symbol"><a name="ref_67_30">Fld</a></span>      : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                             <span class="symbol"><a name="ref_68_30">Fld_Type</a></span> : <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_53_9">Field_Type</a>) <b>is</b> <b>abstract</b>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_fieldtype.3x.html">set_field_type()</A></em></span>
+   <span class="comment"><em>--  But: we hide the vararg mechanism of the C interface. You always</em></span>
+   <span class="comment"><em>--       have to pass a single Field_Type parameter.</em></span>
+
+   <span class="comment"><em>--  ---------------------------------------------------------------------</em></span>
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/form_field_validation.3x.html">form_field_validation.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_2">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_80_13" href="terminal_interface-curses-forms-field_types__adb.htm#ref_71_13">Get_Type</a></span> (<span class="symbol"><a name="ref_80_23" href="terminal_interface-curses-forms-field_types__adb.htm#ref_71_23">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>) <b>return</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_64_9">Field_Type_Access</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_field_validation.3x.html">field_type()</A></em></span>
+   <span class="comment"><em>--  AKA: field_arg()</em></span>
+   <span class="comment"><em>--  In Ada95 we can combine these. If you try to retrieve the field type</em></span>
+   <span class="comment"><em>--  that is not defined as extension of the abstract tagged type above,</em></span>
+   <span class="comment"><em>--  you will raise a Form_Exception.</em></span>
+   <span class="comment"><em>--  This is not inlined</em></span>
+
+   <span class="comment"><em>--  +----------------------------------------------------------------------</em></span>
+   <span class="comment"><em>--  | Private Part.</em></span>
+   <span class="comment"><em>--  | Most of this is used by the implementations of the child packages.</em></span>
+   <span class="comment"><em>--  |</em></span>
+<b>private</b>
+   <b>type</b> <span class="symbol"><a name="ref_93_9" href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Makearg_Function</a></span> <b>is</b> <b>access</b>
+     <b>function</b> (<span class="symbol"><a name="ref_94_16">Args</a></span> : System.Address) <b>return</b> System.Address;
+   <b>pragma</b> Convention (C, <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_93_9">Makearg_Function</a>);
+
+   <b>type</b> <span class="symbol"><a name="ref_97_9">Copyarg_Function</a></span> <b>is</b> <b>access</b>
+     <b>function</b> (<span class="symbol"><a name="ref_98_16">Usr</a></span> : System.Address) <b>return</b> System.Address;
+   <b>pragma</b> Convention (C, <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_97_9">Copyarg_Function</a>);
+
+   <b>type</b> <span class="symbol"><a name="ref_101_9">Freearg_Function</a></span> <b>is</b> <b>access</b>
+     <b>procedure</b> (<span class="symbol"><a name="ref_102_17">Usr</a></span> : System.Address);
+   <b>pragma</b> Convention (C, <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_101_9">Freearg_Function</a>);
+
+   <b>type</b> <span class="symbol"><a name="ref_105_9">Field_Check_Function</a></span> <b>is</b> <b>access</b>
+     <b>function</b> (<span class="symbol"><a name="ref_106_16">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>; <span class="symbol"><a name="ref_106_29">Usr</a></span> : System.Address) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>;
+   <b>pragma</b> Convention (C, <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_105_9">Field_Check_Function</a>);
+
+   <b>type</b> <span class="symbol"><a name="ref_109_9">Char_Check_Function</a></span> <b>is</b> <b>access</b>
+     <b>function</b> (<span class="symbol"><a name="ref_110_16">Ch</a></span> : <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_47_12">C_Int</a>; <span class="symbol"><a name="ref_110_28">Usr</a></span> : System.Address) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>;
+   <b>pragma</b> Convention (C, <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_109_9">Char_Check_Function</a>);
+
+   <b>type</b> <span class="symbol"><a name="ref_113_9">Choice_Function</a></span> <b>is</b> <b>access</b>
+     <b>function</b> (<span class="symbol"><a name="ref_114_16">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>; <span class="symbol"><a name="ref_114_29">Usr</a></span> : System.Address) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>;
+   <b>pragma</b> Convention (C, <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_113_9">Choice_Function</a>);
+
+   <span class="comment"><em>--  +----------------------------------------------------------------------</em></span>
+   <span class="comment"><em>--  | This must be in sync with the FIELDTYPE structure in form.h</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>type</b> <span class="symbol"><a name="ref_120_9">Low_Level_Field_Type</a></span> <b>is</b>
+      <b>record</b>
+         <span class="symbol"><a name="ref_122_10">Status</a></span> :              <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.unsigned_short;
+         <span class="symbol"><a name="ref_123_10">Ref_Count</a></span> :           <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.long;
+         <span class="symbol"><a name="ref_124_10">Left</a></span>, <span class="symbol"><a name="ref_124_16">Right</a></span> :         System.Address;
+         <span class="symbol"><a name="ref_125_10">Makearg</a></span> :             <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_93_9">Makearg_Function</a>;
+         <span class="symbol"><a name="ref_126_10">Copyarg</a></span> :             <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_97_9">Copyarg_Function</a>;
+         <span class="symbol"><a name="ref_127_10">Freearg</a></span> :             <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_101_9">Freearg_Function</a>;
+         <span class="symbol"><a name="ref_128_10">Fcheck</a></span> :              <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_105_9">Field_Check_Function</a>;
+         <span class="symbol"><a name="ref_129_10">Ccheck</a></span> :              <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_109_9">Char_Check_Function</a>;
+         <span class="symbol"><a name="ref_130_10">Next</a></span>, <span class="symbol"><a name="ref_130_16">Prev</a></span> :          <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_113_9">Choice_Function</a>;
+      <b>end</b> <b>record</b>;
+   <b>pragma</b> Convention (C, <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_120_9">Low_Level_Field_Type</a>);
+   <b>type</b> <span class="symbol"><a name="ref_133_9">C_Field_Type</a></span> <b>is</b> <b>access</b> <b>all</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_120_9">Low_Level_Field_Type</a>;
+
+   <span class="symbol"><a name="ref_135_4">Null_Field_Type</a></span>   : <b>constant</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_133_9">C_Field_Type</a> := <b>null</b>;
+
+   <span class="comment"><em>--  +----------------------------------------------------------------------</em></span>
+   <span class="comment"><em>--  | This four low-level fieldtypes are the ones associated with</em></span>
+   <span class="comment"><em>--  | fieldtypes handled by this binding. Any other low-level fieldtype</em></span>
+   <span class="comment"><em>--  | will result in a Form_Exception is function Get_Type.</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="symbol"><a name="ref_142_4">M_Generic_Type</a></span>   : <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_133_9">C_Field_Type</a> := <b>null</b>;
+   <span class="symbol"><a name="ref_143_4">M_Generic_Choice</a></span> : <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_133_9">C_Field_Type</a> := <b>null</b>;
+   <span class="symbol"><a name="ref_144_4">M_Builtin_Router</a></span> : <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_133_9">C_Field_Type</a> := <b>null</b>;
+   <span class="symbol"><a name="ref_145_4">M_Choice_Router</a></span>  : <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_133_9">C_Field_Type</a> := <b>null</b>;
+
+   <span class="comment"><em>--  Two wrapper functions to access those low-level fieldtypes defined</em></span>
+   <span class="comment"><em>--  in this package.</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_149_13" href="terminal_interface-curses-forms-field_types__adb.htm#ref_222_13">C_Builtin_Router</a></span> <b>return</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_133_9">C_Field_Type</a>;
+   <b>function</b> <span class="symbol"><a name="ref_150_13" href="terminal_interface-curses-forms-field_types__adb.htm#ref_245_13">C_Choice_Router</a></span>  <b>return</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_133_9">C_Field_Type</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_152_14" href="terminal_interface-curses-forms-field_types__adb.htm#ref_128_14">Wrap_Builtin</a></span> (<span class="symbol"><a name="ref_152_28" href="terminal_interface-curses-forms-field_types__adb.htm#ref_128_28">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                           <span class="symbol"><a name="ref_153_28" href="terminal_interface-curses-forms-field_types__adb.htm#ref_129_28">Typ</a></span> : <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_53_9">Field_Type</a>'Class;
+                           <span class="symbol"><a name="ref_154_28" href="terminal_interface-curses-forms-field_types__adb.htm#ref_130_28">Cft</a></span> : <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_133_9">C_Field_Type</a> := <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_149_13">C_Builtin_Router</a>);
+   <span class="comment"><em>--  This procedure has to be called by the Set_Field_Type implementation</em></span>
+   <span class="comment"><em>--  for builtin low-level fieldtypes to replace it by an Ada95</em></span>
+   <span class="comment"><em>--  conformant Field_Type object.</em></span>
+   <span class="comment"><em>--  The parameter Cft must be C_Builtin_Router for regular low-level</em></span>
+   <span class="comment"><em>--  fieldtypes (like TYP_ALPHA or TYP_ALNUM) and C_Choice_Router for</em></span>
+   <span class="comment"><em>--  low-level fieldtypes witch choice functions (like TYP_ENUM).</em></span>
+   <span class="comment"><em>--  Any other value will raise a Form_Exception.</em></span>
+
+   <b>function</b> <span class="symbol"><a name="ref_163_13">Make_Arg</a></span> (<span class="symbol"><a name="ref_163_23">Args</a></span> : System.Address) <b>return</b> System.Address;
+   <b>pragma</b> Import (C, Make_Arg, "void_star_make_arg");
+   <span class="comment"><em>--  This is the Makearg_Function for the internal low-level types</em></span>
+   <span class="comment"><em>--  introduced by this binding.</em></span>
+
+   <b>function</b> <span class="symbol"><a name="ref_168_13" href="terminal_interface-curses-forms-field_types__adb.htm#ref_97_13">Copy_Arg</a></span> (<span class="symbol"><a name="ref_168_23" href="terminal_interface-curses-forms-field_types__adb.htm#ref_97_23">Usr</a></span> : System.Address) <b>return</b> System.Address;
+   <b>pragma</b> Convention (C, <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_168_13">Copy_Arg</a>);
+   <span class="comment"><em>--  This is the Copyarg_Function for the internal low-level types</em></span>
+   <span class="comment"><em>--  introduced by this binding.</em></span>
+
+   <b>procedure</b> <span class="symbol"><a name="ref_173_14" href="terminal_interface-curses-forms-field_types__adb.htm#ref_103_14">Free_Arg</a></span> (<span class="symbol"><a name="ref_173_24" href="terminal_interface-curses-forms-field_types__adb.htm#ref_103_24">Usr</a></span> : System.Address);
+   <b>pragma</b> Convention (C, <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_173_14">Free_Arg</a>);
+   <span class="comment"><em>--  This is the Freearg_Function for the internal low-level types</em></span>
+   <span class="comment"><em>--  introduced by this binding.</em></span>
+
+   <b>function</b> <span class="symbol"><a name="ref_178_13" href="terminal_interface-curses-forms-field_types__adb.htm#ref_160_13">Field_Check_Router</a></span> (<span class="symbol"><a name="ref_178_33" href="terminal_interface-curses-forms-field_types__adb.htm#ref_160_33">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                                <span class="symbol"><a name="ref_179_33" href="terminal_interface-curses-forms-field_types__adb.htm#ref_161_33">Usr</a></span> : System.Address) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>;
+   <b>pragma</b> Convention (C, <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_178_13">Field_Check_Router</a>);
+   <span class="comment"><em>--  This is the Field_Check_Function for the internal low-level types</em></span>
+   <span class="comment"><em>--  introduced to wrap the low-level types by a Field_Type derived</em></span>
+   <span class="comment"><em>--  type. It routes the call to the corresponding low-level validation</em></span>
+   <span class="comment"><em>--  function.</em></span>
+
+   <b>function</b> <span class="symbol"><a name="ref_186_13" href="terminal_interface-curses-forms-field_types__adb.htm#ref_175_13">Char_Check_Router</a></span> (<span class="symbol"><a name="ref_186_32" href="terminal_interface-curses-forms-field_types__adb.htm#ref_175_32">Ch</a></span> : <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_47_12">C_Int</a>;
+                               <span class="symbol"><a name="ref_187_32" href="terminal_interface-curses-forms-field_types__adb.htm#ref_176_32">Usr</a></span> : System.Address) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>;
+   <b>pragma</b> Convention (C, <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_186_13">Char_Check_Router</a>);
+   <span class="comment"><em>--  This is the Char_Check_Function for the internal low-level types</em></span>
+   <span class="comment"><em>--  introduced to wrap the low-level types by a Field_Type derived</em></span>
+   <span class="comment"><em>--  type. It routes the call to the corresponding low-level validation</em></span>
+   <span class="comment"><em>--  function.</em></span>
+
+   <b>function</b> <span class="symbol"><a name="ref_194_13" href="terminal_interface-curses-forms-field_types__adb.htm#ref_190_13">Next_Router</a></span> (<span class="symbol"><a name="ref_194_26" href="terminal_interface-curses-forms-field_types__adb.htm#ref_190_26">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                         <span class="symbol"><a name="ref_195_26" href="terminal_interface-curses-forms-field_types__adb.htm#ref_191_26">Usr</a></span> : System.Address) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>;
+   <b>pragma</b> Convention (C, <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_194_13">Next_Router</a>);
+   <span class="comment"><em>--  This is the Choice_Function for the internal low-level types</em></span>
+   <span class="comment"><em>--  introduced to wrap the low-level types by a Field_Type derived</em></span>
+   <span class="comment"><em>--  type. It routes the call to the corresponding low-level next_choice</em></span>
+   <span class="comment"><em>--  function.</em></span>
+
+   <b>function</b> <span class="symbol"><a name="ref_202_13" href="terminal_interface-curses-forms-field_types__adb.htm#ref_205_13">Prev_Router</a></span> (<span class="symbol"><a name="ref_202_26" href="terminal_interface-curses-forms-field_types__adb.htm#ref_205_26">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                         <span class="symbol"><a name="ref_203_26" href="terminal_interface-curses-forms-field_types__adb.htm#ref_206_26">Usr</a></span> : System.Address) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>;
+   <b>pragma</b> Convention (C, <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_202_13">Prev_Router</a>);
+   <span class="comment"><em>--  This is the Choice_Function for the internal low-level types</em></span>
+   <span class="comment"><em>--  introduced to wrap the low-level types by a Field_Type derived</em></span>
+   <span class="comment"><em>--  type. It routes the call to the corresponding low-level prev_choice</em></span>
+   <span class="comment"><em>--  function.</em></span>
+
+   <span class="comment"><em>--  This is the Argument structure maintained by all low-level field types</em></span>
+   <span class="comment"><em>--  introduced by this binding.</em></span>
+   <b>type</b> <span class="symbol"><a name="ref_212_9">Argument</a></span> <b>is</b> <b>record</b>
+      <span class="symbol"><a name="ref_213_7">Typ</a></span> : <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_64_9">Field_Type_Access</a>;   <span class="comment"><em>--  the Field_Type creating this record</em></span>
+      <span class="symbol"><a name="ref_214_7">Usr</a></span> : System.Address;      <span class="comment"><em>--  original arg for builtin low-level types</em></span>
+      <span class="symbol"><a name="ref_215_7">Cft</a></span> : <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_133_9">C_Field_Type</a>;        <span class="comment"><em>--  the original low-level type</em></span>
+   <b>end</b> <b>record</b>;
+   <b>type</b> <span class="symbol"><a name="ref_217_9">Argument_Access</a></span> <b>is</b> <b>access</b> <b>all</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_212_9">Argument</a>;
+
+   <span class="comment"><em>--  +----------------------------------------------------------------------</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  | Some Imports of libform routines to deal with low-level fieldtypes.</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_223_13">New_Fieldtype</a></span> (<span class="symbol"><a name="ref_223_28">Fcheck</a></span> : <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_105_9">Field_Check_Function</a>;
+                           <span class="symbol"><a name="ref_224_28">Ccheck</a></span> : <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_109_9">Char_Check_Function</a>)
+     <b>return</b> <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_133_9">C_Field_Type</a>;
+   <b>pragma</b> Import (C, New_Fieldtype, "new_fieldtype");
+
+   <b>function</b> <span class="symbol"><a name="ref_228_13">Set_Fieldtype_Arg</a></span> (<span class="symbol"><a name="ref_228_32">Cft</a></span> : <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_133_9">C_Field_Type</a>;
+                               <span class="symbol"><a name="ref_229_32">Mak</a></span> : <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_93_9">Makearg_Function</a> := <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_163_13">Make_Arg</a>'<b>Access</b>;
+                               <span class="symbol"><a name="ref_230_32">Cop</a></span> : <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_97_9">Copyarg_Function</a> := <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_168_13">Copy_Arg</a>'<b>Access</b>;
+                               <span class="symbol"><a name="ref_231_32">Fre</a></span> : <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_101_9">Freearg_Function</a> := <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_173_14">Free_Arg</a>'<b>Access</b>)
+     <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+   <b>pragma</b> Import (C, Set_Fieldtype_Arg, "set_fieldtype_arg");
+
+   <b>function</b> <span class="symbol"><a name="ref_235_13">Set_Fieldtype_Choice</a></span> (<span class="symbol"><a name="ref_235_35">Cft</a></span> : <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_133_9">C_Field_Type</a>;
+                                  <span class="symbol"><a name="ref_236_35">Next</a></span>, <span class="symbol"><a name="ref_236_41">Prev</a></span> : <a href="terminal_interface-curses-forms-field_types__ads.htm#ref_113_9">Choice_Function</a>)
+     <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+   <b>pragma</b> Import (C, Set_Fieldtype_Choice, "set_fieldtype_choice");
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_types__ads.htm#ref_45_41">Field_Types</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-forms-field_user_data__adb.htm b/doc/html/ada/terminal_interface-curses-forms-field_user_data__adb.htm
new file mode 100644
index 0000000..a0c5a41
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-forms-field_user_data__adb.htm
@@ -0,0 +1,99 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-forms-field_user_data.adb</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-forms-field_user_data.adb </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--               Terminal_Interface.Curses.Forms.Field_User_Data            --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 B O D Y                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2018,2020 Thomas E. Dickey                                     --</em></span>
+<span class="comment"><em>-- Copyright 1999-2009,2014 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.17 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>with</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>; <b>use</b>  <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>;
+
+<span class="comment"><em>--  |</em></span>
+<span class="comment"><em>--  |=====================================================================</em></span>
+<span class="comment"><em>--  | man page form_field_userptr.3x</em></span>
+<span class="comment"><em>--  |=====================================================================</em></span>
+<span class="comment"><em>--  |</em></span>
+<b>package</b> <b>body</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<span class="symbol"><a name="ref_49_46" href="terminal_interface-curses-forms-field_user_data__ads.htm#ref_46_41">Field_User_Data</a></span> <b>is</b>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_53_14" href="terminal_interface-curses-forms-field_user_data__ads.htm#ref_54_14">Set_User_Data</a></span> (<span class="symbol"><a name="ref_53_29" href="terminal_interface-curses-forms-field_user_data__ads.htm#ref_54_29">Fld</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                            <span class="symbol"><a name="ref_54_29" href="terminal_interface-curses-forms-field_user_data__ads.htm#ref_55_29">Data</a></span> : <a href="terminal_interface-curses-forms-field_user_data__ads.htm#ref_45_9">User_Access</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_56_16">Set_Field_Userptr</a></span> (<span class="symbol"><a name="ref_56_35">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                                  <span class="symbol"><a name="ref_57_35">Usr</a></span> : <a href="terminal_interface-curses-forms-field_user_data__ads.htm#ref_45_9">User_Access</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Field_Userptr, "set_field_userptr");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms-field_user_data__adb.htm#ref_56_16">Set_Field_Userptr</a> (<a href="terminal_interface-curses-forms-field_user_data__ads.htm#ref_54_29">Fld</a>, <a href="terminal_interface-curses-forms-field_user_data__ads.htm#ref_55_29">Data</a>));
+   <b>end</b> <a href="terminal_interface-curses-forms-field_user_data__ads.htm#ref_54_14">Set_User_Data</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_66_13" href="terminal_interface-curses-forms-field_user_data__ads.htm#ref_65_13">Get_User_Data</a></span> (<span class="symbol"><a name="ref_66_28" href="terminal_interface-curses-forms-field_user_data__ads.htm#ref_65_28">Fld</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>) <b>return</b> <a href="terminal_interface-curses-forms-field_user_data__ads.htm#ref_45_9">User_Access</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_68_16">Field_Userptr</a></span> (<span class="symbol"><a name="ref_68_31">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>) <b>return</b> <a href="terminal_interface-curses-forms-field_user_data__ads.htm#ref_45_9">User_Access</a>;
+      <b>pragma</b> Import (C, Field_Userptr, "field_userptr");
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses-forms-field_user_data__adb.htm#ref_68_16">Field_Userptr</a> (<a href="terminal_interface-curses-forms-field_user_data__ads.htm#ref_65_28">Fld</a>);
+   <b>end</b> <a href="terminal_interface-curses-forms-field_user_data__ads.htm#ref_65_13">Get_User_Data</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_74_14" href="terminal_interface-curses-forms-field_user_data__ads.htm#ref_60_14">Get_User_Data</a></span> (<span class="symbol"><a name="ref_74_29" href="terminal_interface-curses-forms-field_user_data__ads.htm#ref_60_29">Fld</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                            <span class="symbol"><a name="ref_75_29" href="terminal_interface-curses-forms-field_user_data__ads.htm#ref_61_29">Data</a></span> : <b>out</b> <a href="terminal_interface-curses-forms-field_user_data__ads.htm#ref_45_9">User_Access</a>)
+   <b>is</b>
+   <b>begin</b>
+      <a href="terminal_interface-curses-forms-field_user_data__ads.htm#ref_61_29">Data</a> := <a href="terminal_interface-curses-forms-field_user_data__ads.htm#ref_65_13">Get_User_Data</a> (<a href="terminal_interface-curses-forms-field_user_data__ads.htm#ref_60_29">Fld</a>);
+   <b>end</b> <a href="terminal_interface-curses-forms-field_user_data__ads.htm#ref_60_14">Get_User_Data</a>;
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_user_data__ads.htm#ref_46_41">Field_User_Data</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-forms-field_user_data__ads.htm b/doc/html/ada/terminal_interface-curses-forms-field_user_data__ads.htm
new file mode 100644
index 0000000..d1a467c
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-forms-field_user_data__ads.htm
@@ -0,0 +1,88 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-forms-field_user_data.ads</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-forms-field_user_data.ads </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--               Terminal_Interface.Curses.Forms.Field_User_Data            --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 S P E C                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1998-2003,2009 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.17 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+
+<b>generic</b>
+   <b>type</b> <span class="symbol"><a name="ref_44_9">User</a></span> <b>is</b> <b>limited</b> <b>private</b>;
+   <b>type</b> <span class="symbol"><a name="ref_45_9">User_Access</a></span> <b>is</b> <b>access</b> <a href="terminal_interface-curses-forms-field_user_data__ads.htm#ref_44_9">User</a>;
+<b>package</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<span class="symbol"><a name="ref_46_41" href="terminal_interface-curses-forms-field_user_data__adb.htm#ref_49_46">Field_User_Data</a></span> <b>is</b>
+   <b>pragma</b> Preelaborate (<a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_user_data__ads.htm#ref_46_41">Field_User_Data</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/form_field_userptr.3x.html">form_field_userptr.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_1">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_54_14" href="terminal_interface-curses-forms-field_user_data__adb.htm#ref_53_14">Set_User_Data</a></span> (<span class="symbol"><a name="ref_54_29" href="terminal_interface-curses-forms-field_user_data__adb.htm#ref_53_29">Fld</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                            <span class="symbol"><a name="ref_55_29" href="terminal_interface-curses-forms-field_user_data__adb.htm#ref_54_29">Data</a></span> : <a href="terminal_interface-curses-forms-field_user_data__ads.htm#ref_45_9">User_Access</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_field_userptr.3x.html">set_field_userptr</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-forms-field_user_data__ads.htm#ref_54_14">Set_User_Data</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_2">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_60_14" href="terminal_interface-curses-forms-field_user_data__adb.htm#ref_74_14">Get_User_Data</a></span> (<span class="symbol"><a name="ref_60_29" href="terminal_interface-curses-forms-field_user_data__adb.htm#ref_74_29">Fld</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                            <span class="symbol"><a name="ref_61_29" href="terminal_interface-curses-forms-field_user_data__adb.htm#ref_75_29">Data</a></span> : <b>out</b> <a href="terminal_interface-curses-forms-field_user_data__ads.htm#ref_45_9">User_Access</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_field_userptr.3x.html">field_userptr</A></em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_3">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_65_13" href="terminal_interface-curses-forms-field_user_data__adb.htm#ref_66_13">Get_User_Data</a></span> (<span class="symbol"><a name="ref_65_28" href="terminal_interface-curses-forms-field_user_data__adb.htm#ref_66_28">Fld</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>) <b>return</b> <a href="terminal_interface-curses-forms-field_user_data__ads.htm#ref_45_9">User_Access</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_field_userptr.3x.html">field_userptr</A></em></span>
+   <span class="comment"><em>--  Sama as function</em></span>
+   <b>pragma</b> Inline (Get_User_Data);
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-field_user_data__ads.htm#ref_46_41">Field_User_Data</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-forms-form_user_data__adb.htm b/doc/html/ada/terminal_interface-curses-forms-form_user_data__adb.htm
new file mode 100644
index 0000000..fbb0b5c
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-forms-form_user_data__adb.htm
@@ -0,0 +1,100 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-forms-form_user_data.adb</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-forms-form_user_data.adb </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                Terminal_Interface.Curses.Forms.Form_User_Data            --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 B O D Y                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2018,2020 Thomas E. Dickey                                     --</em></span>
+<span class="comment"><em>-- Copyright 1999-2009,2014 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.17 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  |</em></span>
+<span class="comment"><em>--  |=====================================================================</em></span>
+<span class="comment"><em>--  | man page form__userptr.3x</em></span>
+<span class="comment"><em>--  |=====================================================================</em></span>
+<span class="comment"><em>--  |</em></span>
+<b>with</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>; <b>use</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>;
+
+<b>package</b> <b>body</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<span class="symbol"><a name="ref_49_46" href="terminal_interface-curses-forms-form_user_data__ads.htm#ref_46_41">Form_User_Data</a></span> <b>is</b>
+
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_54_14" href="terminal_interface-curses-forms-form_user_data__ads.htm#ref_54_14">Set_User_Data</a></span> (<span class="symbol"><a name="ref_54_29" href="terminal_interface-curses-forms-form_user_data__ads.htm#ref_54_29">Frm</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                            <span class="symbol"><a name="ref_55_29" href="terminal_interface-curses-forms-form_user_data__ads.htm#ref_55_29">Data</a></span> : <a href="terminal_interface-curses-forms-form_user_data__ads.htm#ref_45_9">User_Access</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_57_16">Set_Form_Userptr</a></span> (<span class="symbol"><a name="ref_57_34">Frm</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                                 <span class="symbol"><a name="ref_58_34">Data</a></span> : <a href="terminal_interface-curses-forms-form_user_data__ads.htm#ref_45_9">User_Access</a>)  <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Form_Userptr, "set_form_userptr");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms-form_user_data__adb.htm#ref_57_16">Set_Form_Userptr</a> (<a href="terminal_interface-curses-forms-form_user_data__ads.htm#ref_54_29">Frm</a>, <a href="terminal_interface-curses-forms-form_user_data__ads.htm#ref_55_29">Data</a>));
+   <b>end</b> <a href="terminal_interface-curses-forms-form_user_data__ads.htm#ref_54_14">Set_User_Data</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_67_13" href="terminal_interface-curses-forms-form_user_data__ads.htm#ref_65_13">Get_User_Data</a></span> (<span class="symbol"><a name="ref_67_28" href="terminal_interface-curses-forms-form_user_data__ads.htm#ref_65_28">Frm</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>) <b>return</b> <a href="terminal_interface-curses-forms-form_user_data__ads.htm#ref_45_9">User_Access</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_69_16">Form_Userptr</a></span> (<span class="symbol"><a name="ref_69_30">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>) <b>return</b> <a href="terminal_interface-curses-forms-form_user_data__ads.htm#ref_45_9">User_Access</a>;
+      <b>pragma</b> Import (C, Form_Userptr, "form_userptr");
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses-forms-form_user_data__adb.htm#ref_69_16">Form_Userptr</a> (<a href="terminal_interface-curses-forms-form_user_data__ads.htm#ref_65_28">Frm</a>);
+   <b>end</b> <a href="terminal_interface-curses-forms-form_user_data__ads.htm#ref_65_13">Get_User_Data</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_75_14" href="terminal_interface-curses-forms-form_user_data__ads.htm#ref_60_14">Get_User_Data</a></span> (<span class="symbol"><a name="ref_75_29" href="terminal_interface-curses-forms-form_user_data__ads.htm#ref_60_29">Frm</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                            <span class="symbol"><a name="ref_76_29" href="terminal_interface-curses-forms-form_user_data__ads.htm#ref_61_29">Data</a></span> : <b>out</b> <a href="terminal_interface-curses-forms-form_user_data__ads.htm#ref_45_9">User_Access</a>)
+   <b>is</b>
+   <b>begin</b>
+      <a href="terminal_interface-curses-forms-form_user_data__ads.htm#ref_61_29">Data</a> := <a href="terminal_interface-curses-forms-form_user_data__ads.htm#ref_65_13">Get_User_Data</a> (<a href="terminal_interface-curses-forms-form_user_data__ads.htm#ref_60_29">Frm</a>);
+   <b>end</b> <a href="terminal_interface-curses-forms-form_user_data__ads.htm#ref_60_14">Get_User_Data</a>;
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-form_user_data__ads.htm#ref_46_41">Form_User_Data</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-forms-form_user_data__ads.htm b/doc/html/ada/terminal_interface-curses-forms-form_user_data__ads.htm
new file mode 100644
index 0000000..c6baf65
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-forms-form_user_data__ads.htm
@@ -0,0 +1,88 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-forms-form_user_data.ads</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-forms-form_user_data.ads </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                Terminal_Interface.Curses.Forms.Form_User_Data            --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 S P E C                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1998-2003,2009 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.16 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+
+<b>generic</b>
+   <b>type</b> <span class="symbol"><a name="ref_44_9">User</a></span> <b>is</b> <b>limited</b> <b>private</b>;
+   <b>type</b> <span class="symbol"><a name="ref_45_9">User_Access</a></span> <b>is</b> <b>access</b> <a href="terminal_interface-curses-forms-form_user_data__ads.htm#ref_44_9">User</a>;
+<b>package</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<span class="symbol"><a name="ref_46_41" href="terminal_interface-curses-forms-form_user_data__adb.htm#ref_49_46">Form_User_Data</a></span> <b>is</b>
+   <b>pragma</b> Preelaborate (<a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-form_user_data__ads.htm#ref_46_41">Form_User_Data</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/form_userptr.3x.html">form_userptr.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_1">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_54_14" href="terminal_interface-curses-forms-form_user_data__adb.htm#ref_54_14">Set_User_Data</a></span> (<span class="symbol"><a name="ref_54_29" href="terminal_interface-curses-forms-form_user_data__adb.htm#ref_54_29">Frm</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                            <span class="symbol"><a name="ref_55_29" href="terminal_interface-curses-forms-form_user_data__adb.htm#ref_55_29">Data</a></span> : <a href="terminal_interface-curses-forms-form_user_data__ads.htm#ref_45_9">User_Access</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_userptr.3x.html">set_form_userptr</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-forms-form_user_data__ads.htm#ref_54_14">Set_User_Data</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_2">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_60_14" href="terminal_interface-curses-forms-form_user_data__adb.htm#ref_75_14">Get_User_Data</a></span> (<span class="symbol"><a name="ref_60_29" href="terminal_interface-curses-forms-form_user_data__adb.htm#ref_75_29">Frm</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                            <span class="symbol"><a name="ref_61_29" href="terminal_interface-curses-forms-form_user_data__adb.htm#ref_76_29">Data</a></span> : <b>out</b> <a href="terminal_interface-curses-forms-form_user_data__ads.htm#ref_45_9">User_Access</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_userptr.3x.html">form_userptr</A></em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_3">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_65_13" href="terminal_interface-curses-forms-form_user_data__adb.htm#ref_67_13">Get_User_Data</a></span> (<span class="symbol"><a name="ref_65_28" href="terminal_interface-curses-forms-form_user_data__adb.htm#ref_67_28">Frm</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>) <b>return</b> <a href="terminal_interface-curses-forms-form_user_data__ads.htm#ref_45_9">User_Access</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_userptr.3x.html">form_userptr</A></em></span>
+   <span class="comment"><em>--  Same as function</em></span>
+   <b>pragma</b> Inline (Get_User_Data);
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>.<a href="terminal_interface-curses-forms-form_user_data__ads.htm#ref_46_41">Form_User_Data</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-forms__adb.htm b/doc/html/ada/terminal_interface-curses-forms__adb.htm
new file mode 100644
index 0000000..3f22b40
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-forms__adb.htm
@@ -0,0 +1,1050 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-forms.adb</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-forms.adb </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                      Terminal_Interface.Curses.Forms                     --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 B O D Y                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1999-2011,2014 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.33 @</em></span>
+<span class="comment"><em>--  @Date: 2020/02/02 23:34:34 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>with</b> Ada.Unchecked_Deallocation;
+
+<b>with</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C; <b>use</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C;
+<b>with</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.Strings; <b>use</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.Strings;
+<b>with</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.Pointers;
+
+<b>with</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>;
+
+<b>package</b> <b>body</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<span class="symbol"><a name="ref_51_40" href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a></span> <b>is</b>
+
+   <b>use</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>;
+
+   <b>type</b> C_Field_Array <b>is</b> <b>array</b> (Natural <b>range</b> &lt;&gt;) <b>of</b> <b>aliased</b> <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+   <b>package</b> F_Array <b>is</b> <b>new</b>
+     <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.Pointers (Natural, <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>, C_Field_Array, <a href="terminal_interface-curses-forms__ads.htm#ref_55_4">Null_Field</a>);
+
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  subtype chars_ptr is Interfaces.C.Strings.chars_ptr;</em></span>
+
+   <b>procedure</b> <span class="symbol"><a name="ref_65_14" href="terminal_interface-curses-forms__ads.htm#ref_278_14">Request_Name</a></span> (<span class="symbol"><a name="ref_65_28" href="terminal_interface-curses-forms__ads.htm#ref_278_28">Key</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a>;
+                                <span class="symbol"><a name="ref_66_33" href="terminal_interface-curses-forms__ads.htm#ref_279_28">Name</a></span> : <b>out</b> String)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_68_16">Form_Request_Name</a></span> (<span class="symbol"><a name="ref_68_35">Key</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> chars_ptr;
+      <b>pragma</b> Import (C, Form_Request_Name, "form_request_name");
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_91_14">Fill_String</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_68_16">Form_Request_Name</a> (<a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_278_28">Key</a>)), <a href="terminal_interface-curses-forms__ads.htm#ref_279_28">Name</a>);
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_278_14">Request_Name</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_74_13" href="terminal_interface-curses-forms__ads.htm#ref_281_14">Request_Name</a></span> (<span class="symbol"><a name="ref_74_27" href="terminal_interface-curses-forms__ads.htm#ref_281_28">Key</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a>) <b>return</b> String
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_76_16">Form_Request_Name</a></span> (<span class="symbol"><a name="ref_76_35">Key</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> chars_ptr;
+      <b>pragma</b> Import (C, Form_Request_Name, "form_request_name");
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_96_13">Fill_String</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_76_16">Form_Request_Name</a> (<a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_281_28">Key</a>)));
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_281_14">Request_Name</a>;
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | man page form_field_new.3x</em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_92_13" href="terminal_interface-curses-forms__ads.htm#ref_295_13">Create</a></span> (<span class="symbol"><a name="ref_92_21" href="terminal_interface-curses-forms__ads.htm#ref_295_21">Height</a></span>       : <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a>;
+                    <span class="symbol"><a name="ref_93_21" href="terminal_interface-curses-forms__ads.htm#ref_296_21">Width</a></span>        : <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a>;
+                    <span class="symbol"><a name="ref_94_21" href="terminal_interface-curses-forms__ads.htm#ref_297_21">Top</a></span>          : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+                    <span class="symbol"><a name="ref_95_21" href="terminal_interface-curses-forms__ads.htm#ref_298_21">Left</a></span>         : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+                    <span class="symbol"><a name="ref_96_21" href="terminal_interface-curses-forms__ads.htm#ref_299_21">Off_Screen</a></span>   : Natural := 0;
+                    <span class="symbol"><a name="ref_97_21" href="terminal_interface-curses-forms__ads.htm#ref_300_21">More_Buffers</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_131_9">Buffer_Number</a> := <a href="terminal_interface-curses-forms__ads.htm#ref_131_9">Buffer_Number</a>'First)
+                    <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_100_16">Newfield</a></span> (<span class="symbol"><a name="ref_100_26">H</a></span>, <span class="symbol"><a name="ref_100_29">W</a></span>, <span class="symbol"><a name="ref_100_32">T</a></span>, <span class="symbol"><a name="ref_100_35">L</a></span>, <span class="symbol"><a name="ref_100_38">O</a></span>, <span class="symbol"><a name="ref_100_41">M</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+      <b>pragma</b> Import (C, Newfield, "new_field");
+      <span class="symbol"><a name="ref_102_7">Fld</a></span> : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a> := <a href="terminal_interface-curses-forms__adb.htm#ref_100_16">Newfield</a> (<a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_295_21">Height</a>), <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_296_21">Width</a>),
+                                        <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_297_21">Top</a>), <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_298_21">Left</a>),
+                                        <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_299_21">Off_Screen</a>),
+                                        <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_300_21">More_Buffers</a>));
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-forms__adb.htm#ref_102_7">Fld</a> = <a href="terminal_interface-curses-forms__ads.htm#ref_55_4">Null_Field</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses-forms__ads.htm#ref_288_4">Form_Exception</a>;
+      <b>end</b> <b>if</b>;
+      <b>return</b> <a href="terminal_interface-curses-forms__adb.htm#ref_102_7">Fld</a>;
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_295_13">Create</a>;
+<span class="comment"><em>--  |</em></span>
+<span class="comment"><em>--  |</em></span>
+<span class="comment"><em>--  |</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_115_14" href="terminal_interface-curses-forms__ads.htm#ref_317_14">Delete</a></span> (<span class="symbol"><a name="ref_115_22" href="terminal_interface-curses-forms__ads.htm#ref_317_22">Fld</a></span> : <b>in</b> <b>out</b> <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_117_16">Free_Field</a></span> (<span class="symbol"><a name="ref_117_28">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Free_Field, "free_field");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_117_16">Free_Field</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_317_22">Fld</a>));
+      <a href="terminal_interface-curses-forms__ads.htm#ref_317_22">Fld</a> := <a href="terminal_interface-curses-forms__ads.htm#ref_55_4">Null_Field</a>;
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_317_14">Delete</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_127_13" href="terminal_interface-curses-forms__ads.htm#ref_323_13">Duplicate</a></span> (<span class="symbol"><a name="ref_127_24" href="terminal_interface-curses-forms__ads.htm#ref_323_24">Fld</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                       <span class="symbol"><a name="ref_128_24" href="terminal_interface-curses-forms__ads.htm#ref_324_24">Top</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+                       <span class="symbol"><a name="ref_129_24" href="terminal_interface-curses-forms__ads.htm#ref_325_24">Left</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>) <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_131_16">Dup_Field</a></span> (<span class="symbol"><a name="ref_131_27">Fld</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                          <span class="symbol"><a name="ref_132_27">Top</a></span>  : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+                          <span class="symbol"><a name="ref_133_27">Left</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+      <b>pragma</b> Import (C, Dup_Field, "dup_field");
+
+      <span class="symbol"><a name="ref_136_7">F</a></span> : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a> := <a href="terminal_interface-curses-forms__adb.htm#ref_131_16">Dup_Field</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_323_24">Fld</a>,
+                                       <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_324_24">Top</a>),
+                                       <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_325_24">Left</a>));
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-forms__adb.htm#ref_136_7">F</a> = <a href="terminal_interface-curses-forms__ads.htm#ref_55_4">Null_Field</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses-forms__ads.htm#ref_288_4">Form_Exception</a>;
+      <b>end</b> <b>if</b>;
+      <b>return</b> <a href="terminal_interface-curses-forms__adb.htm#ref_136_7">F</a>;
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_323_13">Duplicate</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_148_13" href="terminal_interface-curses-forms__ads.htm#ref_330_13">Link</a></span> (<span class="symbol"><a name="ref_148_19" href="terminal_interface-curses-forms__ads.htm#ref_330_19">Fld</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                  <span class="symbol"><a name="ref_149_19" href="terminal_interface-curses-forms__ads.htm#ref_331_19">Top</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+                  <span class="symbol"><a name="ref_150_19" href="terminal_interface-curses-forms__ads.htm#ref_332_19">Left</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>) <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_152_16">Lnk_Field</a></span> (<span class="symbol"><a name="ref_152_27">Fld</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                          <span class="symbol"><a name="ref_153_27">Top</a></span>  : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+                          <span class="symbol"><a name="ref_154_27">Left</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+      <b>pragma</b> Import (C, Lnk_Field, "link_field");
+
+      <span class="symbol"><a name="ref_157_7">F</a></span> : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a> := <a href="terminal_interface-curses-forms__adb.htm#ref_152_16">Lnk_Field</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_330_19">Fld</a>,
+                                       <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_331_19">Top</a>),
+                                       <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_332_19">Left</a>));
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-forms__adb.htm#ref_157_7">F</a> = <a href="terminal_interface-curses-forms__ads.htm#ref_55_4">Null_Field</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses-forms__ads.htm#ref_288_4">Form_Exception</a>;
+      <b>end</b> <b>if</b>;
+      <b>return</b> <a href="terminal_interface-curses-forms__adb.htm#ref_157_7">F</a>;
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_330_13">Link</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | man page form_field_just.3x</em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_173_14" href="terminal_interface-curses-forms__ads.htm#ref_341_14">Set_Justification</a></span> (<span class="symbol"><a name="ref_173_33" href="terminal_interface-curses-forms__ads.htm#ref_341_33">Fld</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                                <span class="symbol"><a name="ref_174_33" href="terminal_interface-curses-forms__ads.htm#ref_342_33">Just</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_58_9">Field_Justification</a> := <a href="terminal_interface-curses-forms__ads.htm#ref_58_33">None</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_176_16">Set_Field_Just</a></span> (<span class="symbol"><a name="ref_176_32">Fld</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                               <span class="symbol"><a name="ref_177_32">Just</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Field_Just, "set_field_just");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_176_16">Set_Field_Just</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_341_33">Fld</a>,
+                                     <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_58_9">Field_Justification</a>'Pos (<a href="terminal_interface-curses-forms__ads.htm#ref_342_33">Just</a>))));
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_341_14">Set_Justification</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_187_13" href="terminal_interface-curses-forms__ads.htm#ref_347_13">Get_Justification</a></span> (<span class="symbol"><a name="ref_187_32" href="terminal_interface-curses-forms__ads.htm#ref_347_32">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>) <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_58_9">Field_Justification</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_189_16">Field_Just</a></span> (<span class="symbol"><a name="ref_189_28">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Field_Just, "field_just");
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_58_9">Field_Justification</a>'Val (<a href="terminal_interface-curses-forms__adb.htm#ref_189_16">Field_Just</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_347_32">Fld</a>));
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_347_13">Get_Justification</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | man page form_field_buffer.3x</em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_201_14" href="terminal_interface-curses-forms__ads.htm#ref_356_14">Set_Buffer</a></span>
+     (<span class="symbol"><a name="ref_202_7" href="terminal_interface-curses-forms__ads.htm#ref_357_7">Fld</a></span>    : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+      <span class="symbol"><a name="ref_203_7" href="terminal_interface-curses-forms__ads.htm#ref_358_7">Buffer</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_131_9">Buffer_Number</a> := <a href="terminal_interface-curses-forms__ads.htm#ref_131_9">Buffer_Number</a>'First;
+      <span class="symbol"><a name="ref_204_7" href="terminal_interface-curses-forms__ads.htm#ref_359_7">Str</a></span>    : String)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_206_16">Set_Fld_Buffer</a></span> (<span class="symbol"><a name="ref_206_32">Fld</a></span>    : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                                 <span class="symbol"><a name="ref_207_34">Bufnum</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+                                 <span class="symbol"><a name="ref_208_34">S</a></span>      : char_array)
+        <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Fld_Buffer, "set_field_buffer");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_206_16">Set_Fld_Buffer</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_357_7">Fld</a>, <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_358_7">Buffer</a>), To_C (<a href="terminal_interface-curses-forms__ads.htm#ref_359_7">Str</a>)));
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_356_14">Set_Buffer</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_218_14" href="terminal_interface-curses-forms__ads.htm#ref_364_14">Get_Buffer</a></span>
+     (<span class="symbol"><a name="ref_219_7" href="terminal_interface-curses-forms__ads.htm#ref_365_7">Fld</a></span>    : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+      <span class="symbol"><a name="ref_220_7" href="terminal_interface-curses-forms__ads.htm#ref_366_7">Buffer</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_131_9">Buffer_Number</a> := <a href="terminal_interface-curses-forms__ads.htm#ref_131_9">Buffer_Number</a>'First;
+      <span class="symbol"><a name="ref_221_7" href="terminal_interface-curses-forms__ads.htm#ref_367_7">Str</a></span>    : <b>out</b> String)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_223_16">Field_Buffer</a></span> (<span class="symbol"><a name="ref_223_30">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                             <span class="symbol"><a name="ref_224_30">B</a></span>   : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> chars_ptr;
+      <b>pragma</b> Import (C, Field_Buffer, "field_buffer");
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_91_14">Fill_String</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_223_16">Field_Buffer</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_365_7">Fld</a>, <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_366_7">Buffer</a>)), <a href="terminal_interface-curses-forms__ads.htm#ref_367_7">Str</a>);
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_364_14">Get_Buffer</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_230_13" href="terminal_interface-curses-forms__ads.htm#ref_370_13">Get_Buffer</a></span>
+     (<span class="symbol"><a name="ref_231_7" href="terminal_interface-curses-forms__ads.htm#ref_371_7">Fld</a></span>    : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+      <span class="symbol"><a name="ref_232_7" href="terminal_interface-curses-forms__ads.htm#ref_372_7">Buffer</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_131_9">Buffer_Number</a> := <a href="terminal_interface-curses-forms__ads.htm#ref_131_9">Buffer_Number</a>'First) <b>return</b> String
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_234_16">Field_Buffer</a></span> (<span class="symbol"><a name="ref_234_30">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                             <span class="symbol"><a name="ref_235_30">B</a></span>   : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> chars_ptr;
+      <b>pragma</b> Import (C, Field_Buffer, "field_buffer");
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_96_13">Fill_String</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_234_16">Field_Buffer</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_371_7">Fld</a>, <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_372_7">Buffer</a>)));
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_370_13">Get_Buffer</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_243_14" href="terminal_interface-curses-forms__ads.htm#ref_378_14">Set_Status</a></span> (<span class="symbol"><a name="ref_243_26" href="terminal_interface-curses-forms__ads.htm#ref_378_26">Fld</a></span>    : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                         <span class="symbol"><a name="ref_244_26" href="terminal_interface-curses-forms__ads.htm#ref_379_26">Status</a></span> : Boolean := True)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_246_16">Set_Fld_Status</a></span> (<span class="symbol"><a name="ref_246_32">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                               <span class="symbol"><a name="ref_247_32">St</a></span>  : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Fld_Status, "set_field_status");
+
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-forms__adb.htm#ref_246_16">Set_Fld_Status</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_378_26">Fld</a>, Boolean'Pos (<a href="terminal_interface-curses-forms__ads.htm#ref_379_26">Status</a>)) /= <a href="terminal_interface-curses-aux__ads.htm#ref_85_7">E_Ok</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses-forms__ads.htm#ref_288_4">Form_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_378_14">Set_Status</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_258_13" href="terminal_interface-curses-forms__ads.htm#ref_384_13">Changed</a></span> (<span class="symbol"><a name="ref_258_22" href="terminal_interface-curses-forms__ads.htm#ref_384_22">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>) <b>return</b> Boolean
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_260_16">Field_Status</a></span> (<span class="symbol"><a name="ref_260_30">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Field_Status, "field_status");
+
+      <span class="symbol"><a name="ref_263_7">Res</a></span> : <b>constant</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> := <a href="terminal_interface-curses-forms__adb.htm#ref_260_16">Field_Status</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_384_22">Fld</a>);
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-forms__adb.htm#ref_263_7">Res</a> = <a href="terminal_interface-curses-aux__ads.htm#ref_67_4">Curses_False</a> <b>then</b>
+         <b>return</b> False;
+      <b>else</b>
+         <b>return</b> True;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_384_13">Changed</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_274_14" href="terminal_interface-curses-forms__ads.htm#ref_389_14">Set_Maximum_Size</a></span> (<span class="symbol"><a name="ref_274_32" href="terminal_interface-curses-forms__ads.htm#ref_389_32">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                               <span class="symbol"><a name="ref_275_32" href="terminal_interface-curses-forms__ads.htm#ref_390_32">Max</a></span> : Natural := 0)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_277_16">Set_Field_Max</a></span> (<span class="symbol"><a name="ref_277_31">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                              <span class="symbol"><a name="ref_278_31">M</a></span>   : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Field_Max, "set_max_field");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_277_16">Set_Field_Max</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_389_32">Fld</a>, <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_390_32">Max</a>)));
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_389_14">Set_Maximum_Size</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | man page form_field_opts.3x</em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_291_14" href="terminal_interface-curses-forms__ads.htm#ref_399_14">Set_Options</a></span> (<span class="symbol"><a name="ref_291_27" href="terminal_interface-curses-forms__ads.htm#ref_399_27">Fld</a></span>     : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                          <span class="symbol"><a name="ref_292_27" href="terminal_interface-curses-forms__ads.htm#ref_400_27">Options</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_63_9">Field_Option_Set</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_294_16">Set_Field_Opts</a></span> (<span class="symbol"><a name="ref_294_32">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                               <span class="symbol"><a name="ref_295_32">Opt</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_63_9">Field_Option_Set</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Field_Opts, "set_field_opts");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_294_16">Set_Field_Opts</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_399_27">Fld</a>, <a href="terminal_interface-curses-forms__ads.htm#ref_400_27">Options</a>));
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_399_14">Set_Options</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_304_14" href="terminal_interface-curses-forms__ads.htm#ref_405_14">Switch_Options</a></span> (<span class="symbol"><a name="ref_304_30" href="terminal_interface-curses-forms__ads.htm#ref_405_30">Fld</a></span>     : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                             <span class="symbol"><a name="ref_305_30" href="terminal_interface-curses-forms__ads.htm#ref_406_30">Options</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_63_9">Field_Option_Set</a>;
+                             <span class="symbol"><a name="ref_306_30" href="terminal_interface-curses-forms__ads.htm#ref_407_30">On</a></span>      : Boolean := True)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_308_16">Field_Opts_On</a></span> (<span class="symbol"><a name="ref_308_31">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                              <span class="symbol"><a name="ref_309_31">Opt</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_63_9">Field_Option_Set</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Field_Opts_On, "field_opts_on");
+      <b>function</b> <span class="symbol"><a name="ref_311_16">Field_Opts_Off</a></span> (<span class="symbol"><a name="ref_311_32">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                               <span class="symbol"><a name="ref_312_32">Opt</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_63_9">Field_Option_Set</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Field_Opts_Off, "field_opts_off");
+
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-forms__ads.htm#ref_407_30">On</a> <b>then</b>
+         <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_308_16">Field_Opts_On</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_405_30">Fld</a>, <a href="terminal_interface-curses-forms__ads.htm#ref_406_30">Options</a>));
+      <b>else</b>
+         <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_311_16">Field_Opts_Off</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_405_30">Fld</a>, <a href="terminal_interface-curses-forms__ads.htm#ref_406_30">Options</a>));
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_405_14">Switch_Options</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_325_14" href="terminal_interface-curses-forms__ads.htm#ref_413_14">Get_Options</a></span> (<span class="symbol"><a name="ref_325_27" href="terminal_interface-curses-forms__ads.htm#ref_413_27">Fld</a></span>     : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                          <span class="symbol"><a name="ref_326_27" href="terminal_interface-curses-forms__ads.htm#ref_414_27">Options</a></span> : <b>out</b> <a href="terminal_interface-curses-forms__ads.htm#ref_63_9">Field_Option_Set</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_328_16">Field_Opts</a></span> (<span class="symbol"><a name="ref_328_28">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>) <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_63_9">Field_Option_Set</a>;
+      <b>pragma</b> Import (C, Field_Opts, "field_opts");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-forms__ads.htm#ref_414_27">Options</a> := <a href="terminal_interface-curses-forms__adb.htm#ref_328_16">Field_Opts</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_413_27">Fld</a>);
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_413_14">Get_Options</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_337_13" href="terminal_interface-curses-forms__ads.htm#ref_418_13">Get_Options</a></span> (<span class="symbol"><a name="ref_337_26" href="terminal_interface-curses-forms__ads.htm#ref_418_26">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a> := <a href="terminal_interface-curses-forms__ads.htm#ref_55_4">Null_Field</a>)
+                         <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_63_9">Field_Option_Set</a>
+   <b>is</b>
+      <span class="symbol"><a name="ref_340_7">Fos</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_63_9">Field_Option_Set</a>;
+   <b>begin</b>
+      <a href="terminal_interface-curses-forms__ads.htm#ref_413_14">Get_Options</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_418_26">Fld</a>, <a href="terminal_interface-curses-forms__adb.htm#ref_340_7">Fos</a>);
+      <b>return</b> <a href="terminal_interface-curses-forms__adb.htm#ref_340_7">Fos</a>;
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_418_13">Get_Options</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | man page form_field_attributes.3x</em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_352_14" href="terminal_interface-curses-forms__ads.htm#ref_428_14">Set_Foreground</a></span>
+     (<span class="symbol"><a name="ref_353_7" href="terminal_interface-curses-forms__ads.htm#ref_429_7">Fld</a></span>   : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+      <span class="symbol"><a name="ref_354_7" href="terminal_interface-curses-forms__ads.htm#ref_430_7">Fore</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a> := <a href="terminal_interface-curses__ads.htm#ref_486_4">Normal_Video</a>;
+      <span class="symbol"><a name="ref_355_7" href="terminal_interface-curses-forms__ads.htm#ref_431_7">Color</a></span> : <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a> := <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>'First)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_357_16">Set_Field_Fore</a></span> (<span class="symbol"><a name="ref_357_32">Fld</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                               <span class="symbol"><a name="ref_358_32">Attr</a></span> : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Field_Fore, "set_field_fore");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_357_16">Set_Field_Fore</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_429_7">Fld</a>, (<a href="terminal_interface-curses__ads.htm#ref_492_10">Ch</a>    =&gt; Character'First,
+                                           <a href="terminal_interface-curses__ads.htm#ref_491_10">Color</a> =&gt; <a href="terminal_interface-curses-forms__ads.htm#ref_431_7">Color</a>,
+                                           <a href="terminal_interface-curses__ads.htm#ref_490_10">Attr</a>  =&gt; <a href="terminal_interface-curses-forms__ads.htm#ref_430_7">Fore</a>)));
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_428_14">Set_Foreground</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_369_14" href="terminal_interface-curses-forms__ads.htm#ref_436_14">Foreground</a></span> (<span class="symbol"><a name="ref_369_26" href="terminal_interface-curses-forms__ads.htm#ref_436_26">Fld</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                         <span class="symbol"><a name="ref_370_26" href="terminal_interface-curses-forms__ads.htm#ref_437_26">Fore</a></span> : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_372_16">Field_Fore</a></span> (<span class="symbol"><a name="ref_372_28">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>;
+      <b>pragma</b> Import (C, Field_Fore, "field_fore");
+   <b>begin</b>
+      <a href="terminal_interface-curses-forms__ads.htm#ref_437_26">Fore</a> := <a href="terminal_interface-curses-forms__adb.htm#ref_372_16">Field_Fore</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_436_26">Fld</a>).<a href="terminal_interface-curses__ads.htm#ref_490_10">Attr</a>;
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_436_14">Foreground</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_378_14" href="terminal_interface-curses-forms__ads.htm#ref_441_14">Foreground</a></span> (<span class="symbol"><a name="ref_378_26" href="terminal_interface-curses-forms__ads.htm#ref_441_26">Fld</a></span>   : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                         <span class="symbol"><a name="ref_379_26" href="terminal_interface-curses-forms__ads.htm#ref_442_26">Fore</a></span>  : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a>;
+                         <span class="symbol"><a name="ref_380_26" href="terminal_interface-curses-forms__ads.htm#ref_443_26">Color</a></span> : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_382_16">Field_Fore</a></span> (<span class="symbol"><a name="ref_382_28">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>;
+      <b>pragma</b> Import (C, Field_Fore, "field_fore");
+   <b>begin</b>
+      <a href="terminal_interface-curses-forms__ads.htm#ref_442_26">Fore</a>  := <a href="terminal_interface-curses-forms__adb.htm#ref_382_16">Field_Fore</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_441_26">Fld</a>).<a href="terminal_interface-curses__ads.htm#ref_490_10">Attr</a>;
+      <a href="terminal_interface-curses-forms__ads.htm#ref_443_26">Color</a> := <a href="terminal_interface-curses-forms__adb.htm#ref_382_16">Field_Fore</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_441_26">Fld</a>).<a href="terminal_interface-curses__ads.htm#ref_491_10">Color</a>;
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_441_14">Foreground</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_391_14" href="terminal_interface-curses-forms__ads.htm#ref_448_14">Set_Background</a></span>
+     (<span class="symbol"><a name="ref_392_7" href="terminal_interface-curses-forms__ads.htm#ref_449_7">Fld</a></span>   : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+      <span class="symbol"><a name="ref_393_7" href="terminal_interface-curses-forms__ads.htm#ref_450_7">Back</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a> := <a href="terminal_interface-curses__ads.htm#ref_486_4">Normal_Video</a>;
+      <span class="symbol"><a name="ref_394_7" href="terminal_interface-curses-forms__ads.htm#ref_451_7">Color</a></span> : <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a> := <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>'First)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_396_16">Set_Field_Back</a></span> (<span class="symbol"><a name="ref_396_32">Fld</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                               <span class="symbol"><a name="ref_397_32">Attr</a></span> : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Field_Back, "set_field_back");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_396_16">Set_Field_Back</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_449_7">Fld</a>, (<a href="terminal_interface-curses__ads.htm#ref_492_10">Ch</a>    =&gt; Character'First,
+                                           <a href="terminal_interface-curses__ads.htm#ref_491_10">Color</a> =&gt; <a href="terminal_interface-curses-forms__ads.htm#ref_451_7">Color</a>,
+                                           <a href="terminal_interface-curses__ads.htm#ref_490_10">Attr</a>  =&gt; <a href="terminal_interface-curses-forms__ads.htm#ref_450_7">Back</a>)));
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_448_14">Set_Background</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_408_14" href="terminal_interface-curses-forms__ads.htm#ref_456_14">Background</a></span> (<span class="symbol"><a name="ref_408_26" href="terminal_interface-curses-forms__ads.htm#ref_456_26">Fld</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                         <span class="symbol"><a name="ref_409_26" href="terminal_interface-curses-forms__ads.htm#ref_457_26">Back</a></span> : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_411_16">Field_Back</a></span> (<span class="symbol"><a name="ref_411_28">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>;
+      <b>pragma</b> Import (C, Field_Back, "field_back");
+   <b>begin</b>
+      <a href="terminal_interface-curses-forms__ads.htm#ref_457_26">Back</a> := <a href="terminal_interface-curses-forms__adb.htm#ref_411_16">Field_Back</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_456_26">Fld</a>).<a href="terminal_interface-curses__ads.htm#ref_490_10">Attr</a>;
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_456_14">Background</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_417_14" href="terminal_interface-curses-forms__ads.htm#ref_461_14">Background</a></span> (<span class="symbol"><a name="ref_417_26" href="terminal_interface-curses-forms__ads.htm#ref_461_26">Fld</a></span>   : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                         <span class="symbol"><a name="ref_418_26" href="terminal_interface-curses-forms__ads.htm#ref_462_26">Back</a></span>  : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a>;
+                         <span class="symbol"><a name="ref_419_26" href="terminal_interface-curses-forms__ads.htm#ref_463_26">Color</a></span> : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_421_16">Field_Back</a></span> (<span class="symbol"><a name="ref_421_28">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>;
+      <b>pragma</b> Import (C, Field_Back, "field_back");
+   <b>begin</b>
+      <a href="terminal_interface-curses-forms__ads.htm#ref_462_26">Back</a>  := <a href="terminal_interface-curses-forms__adb.htm#ref_421_16">Field_Back</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_461_26">Fld</a>).<a href="terminal_interface-curses__ads.htm#ref_490_10">Attr</a>;
+      <a href="terminal_interface-curses-forms__ads.htm#ref_463_26">Color</a> := <a href="terminal_interface-curses-forms__adb.htm#ref_421_16">Field_Back</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_461_26">Fld</a>).<a href="terminal_interface-curses__ads.htm#ref_491_10">Color</a>;
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_461_14">Background</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_430_14" href="terminal_interface-curses-forms__ads.htm#ref_468_14">Set_Pad_Character</a></span> (<span class="symbol"><a name="ref_430_33" href="terminal_interface-curses-forms__ads.htm#ref_468_33">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                                <span class="symbol"><a name="ref_431_33" href="terminal_interface-curses-forms__ads.htm#ref_469_33">Pad</a></span> : Character := Space)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_433_16">Set_Field_Pad</a></span> (<span class="symbol"><a name="ref_433_31">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                              <span class="symbol"><a name="ref_434_31">Ch</a></span>  : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Field_Pad, "set_field_pad");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_433_16">Set_Field_Pad</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_468_33">Fld</a>,
+                                    <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (Character'Pos (<a href="terminal_interface-curses-forms__ads.htm#ref_469_33">Pad</a>))));
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_468_14">Set_Pad_Character</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_444_14" href="terminal_interface-curses-forms__ads.htm#ref_474_14">Pad_Character</a></span> (<span class="symbol"><a name="ref_444_29" href="terminal_interface-curses-forms__ads.htm#ref_474_29">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                            <span class="symbol"><a name="ref_445_29" href="terminal_interface-curses-forms__ads.htm#ref_475_29">Pad</a></span> : <b>out</b> Character)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_447_16">Field_Pad</a></span> (<span class="symbol"><a name="ref_447_27">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Field_Pad, "field_pad");
+   <b>begin</b>
+      <a href="terminal_interface-curses-forms__ads.htm#ref_475_29">Pad</a> := Character'Val (<a href="terminal_interface-curses-forms__adb.htm#ref_447_16">Field_Pad</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_474_29">Fld</a>));
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_474_14">Pad_Character</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | man page form_field_info.3x</em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_459_14" href="terminal_interface-curses-forms__ads.htm#ref_484_14">Info</a></span> (<span class="symbol"><a name="ref_459_20" href="terminal_interface-curses-forms__ads.htm#ref_484_20">Fld</a></span>                : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                   <span class="symbol"><a name="ref_460_20" href="terminal_interface-curses-forms__ads.htm#ref_485_20">Lines</a></span>              : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a>;
+                   <span class="symbol"><a name="ref_461_20" href="terminal_interface-curses-forms__ads.htm#ref_486_20">Columns</a></span>            : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a>;
+                   <span class="symbol"><a name="ref_462_20" href="terminal_interface-curses-forms__ads.htm#ref_487_20">First_Row</a></span>          : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+                   <span class="symbol"><a name="ref_463_20" href="terminal_interface-curses-forms__ads.htm#ref_488_20">First_Column</a></span>       : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+                   <span class="symbol"><a name="ref_464_20" href="terminal_interface-curses-forms__ads.htm#ref_489_20">Off_Screen</a></span>         : <b>out</b> Natural;
+                   <span class="symbol"><a name="ref_465_20" href="terminal_interface-curses-forms__ads.htm#ref_490_20">Additional_Buffers</a></span> : <b>out</b> <a href="terminal_interface-curses-forms__ads.htm#ref_131_9">Buffer_Number</a>)
+   <b>is</b>
+      <b>type</b> <span class="symbol"><a name="ref_467_12">C_Int_Access</a></span> <b>is</b> <b>access</b> <b>all</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>function</b> <span class="symbol"><a name="ref_468_16">Fld_Info</a></span> (<span class="symbol"><a name="ref_468_26">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                         <span class="symbol"><a name="ref_469_26">L</a></span>, <span class="symbol"><a name="ref_469_29">C</a></span>, <span class="symbol"><a name="ref_469_32">Fr</a></span>, <span class="symbol"><a name="ref_469_36">Fc</a></span>, <span class="symbol"><a name="ref_469_40">Os</a></span>, <span class="symbol"><a name="ref_469_44">Ab</a></span> : <a href="terminal_interface-curses-forms__adb.htm#ref_467_12">C_Int_Access</a>)
+                         <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Fld_Info, "field_info");
+
+      <span class="symbol"><a name="ref_473_7">L</a></span>, <span class="symbol"><a name="ref_473_10">C</a></span>, <span class="symbol"><a name="ref_473_13">Fr</a></span>, <span class="symbol"><a name="ref_473_17">Fc</a></span>, <span class="symbol"><a name="ref_473_21">Os</a></span>, <span class="symbol"><a name="ref_473_25">Ab</a></span> : <b>aliased</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_468_16">Fld_Info</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_484_20">Fld</a>,
+                               <a href="terminal_interface-curses-forms__adb.htm#ref_473_7">L</a>'<b>Access</b>, <a href="terminal_interface-curses-forms__adb.htm#ref_473_10">C</a>'<b>Access</b>,
+                               <a href="terminal_interface-curses-forms__adb.htm#ref_473_13">Fr</a>'<b>Access</b>, <a href="terminal_interface-curses-forms__adb.htm#ref_473_17">Fc</a>'<b>Access</b>,
+                               <a href="terminal_interface-curses-forms__adb.htm#ref_473_21">Os</a>'<b>Access</b>, <a href="terminal_interface-curses-forms__adb.htm#ref_473_25">Ab</a>'<b>Access</b>));
+      <a href="terminal_interface-curses-forms__ads.htm#ref_485_20">Lines</a>              := <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_473_7">L</a>);
+      <a href="terminal_interface-curses-forms__ads.htm#ref_486_20">Columns</a>            := <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_473_10">C</a>);
+      <a href="terminal_interface-curses-forms__ads.htm#ref_487_20">First_Row</a>          := <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_473_13">Fr</a>);
+      <a href="terminal_interface-curses-forms__ads.htm#ref_488_20">First_Column</a>       := <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_473_17">Fc</a>);
+      <a href="terminal_interface-curses-forms__ads.htm#ref_489_20">Off_Screen</a>         := Natural (<a href="terminal_interface-curses-forms__adb.htm#ref_473_21">Os</a>);
+      <a href="terminal_interface-curses-forms__ads.htm#ref_490_20">Additional_Buffers</a> := <a href="terminal_interface-curses-forms__ads.htm#ref_131_9">Buffer_Number</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_473_25">Ab</a>);
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_484_14">Info</a>;
+<span class="comment"><em>--  |</em></span>
+<span class="comment"><em>--  |</em></span>
+<span class="comment"><em>--  |</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_489_14" href="terminal_interface-curses-forms__ads.htm#ref_495_14">Dynamic_Info</a></span> (<span class="symbol"><a name="ref_489_28" href="terminal_interface-curses-forms__ads.htm#ref_495_28">Fld</a></span>     : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                           <span class="symbol"><a name="ref_490_28" href="terminal_interface-curses-forms__ads.htm#ref_496_28">Lines</a></span>   : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a>;
+                           <span class="symbol"><a name="ref_491_28" href="terminal_interface-curses-forms__ads.htm#ref_497_28">Columns</a></span> : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a>;
+                           <span class="symbol"><a name="ref_492_28" href="terminal_interface-curses-forms__ads.htm#ref_498_28">Max</a></span>     : <b>out</b> Natural)
+   <b>is</b>
+      <b>type</b> <span class="symbol"><a name="ref_494_12">C_Int_Access</a></span> <b>is</b> <b>access</b> <b>all</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>function</b> <span class="symbol"><a name="ref_495_16">Dyn_Info</a></span> (<span class="symbol"><a name="ref_495_26">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>; <span class="symbol"><a name="ref_495_39">L</a></span>, <span class="symbol"><a name="ref_495_42">C</a></span>, <span class="symbol"><a name="ref_495_45">M</a></span> : <a href="terminal_interface-curses-forms__adb.htm#ref_494_12">C_Int_Access</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Dyn_Info, "dynamic_field_info");
+
+      <span class="symbol"><a name="ref_498_7">L</a></span>, <span class="symbol"><a name="ref_498_10">C</a></span>, <span class="symbol"><a name="ref_498_13">M</a></span> : <b>aliased</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_495_16">Dyn_Info</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_495_28">Fld</a>,
+                               <a href="terminal_interface-curses-forms__adb.htm#ref_498_7">L</a>'<b>Access</b>, <a href="terminal_interface-curses-forms__adb.htm#ref_498_10">C</a>'<b>Access</b>,
+                               <a href="terminal_interface-curses-forms__adb.htm#ref_498_13">M</a>'<b>Access</b>));
+      <a href="terminal_interface-curses-forms__ads.htm#ref_496_28">Lines</a>   := <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_498_7">L</a>);
+      <a href="terminal_interface-curses-forms__ads.htm#ref_497_28">Columns</a> := <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_498_10">C</a>);
+      <a href="terminal_interface-curses-forms__ads.htm#ref_498_28">Max</a>     := Natural (<a href="terminal_interface-curses-forms__adb.htm#ref_498_13">M</a>);
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_495_14">Dynamic_Info</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | man page form_win.3x</em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_514_14" href="terminal_interface-curses-forms__ads.htm#ref_507_14">Set_Window</a></span> (<span class="symbol"><a name="ref_514_26" href="terminal_interface-curses-forms__ads.htm#ref_507_26">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                         <span class="symbol"><a name="ref_515_26" href="terminal_interface-curses-forms__ads.htm#ref_508_26">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_517_16">Set_Form_Win</a></span> (<span class="symbol"><a name="ref_517_30">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                             <span class="symbol"><a name="ref_518_30">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Form_Win, "set_form_win");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_517_16">Set_Form_Win</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_507_26">Frm</a>, <a href="terminal_interface-curses-forms__ads.htm#ref_508_26">Win</a>));
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_507_14">Set_Window</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_527_13" href="terminal_interface-curses-forms__ads.htm#ref_513_13">Get_Window</a></span> (<span class="symbol"><a name="ref_527_25" href="terminal_interface-curses-forms__ads.htm#ref_513_25">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_529_16">Form_Win</a></span> (<span class="symbol"><a name="ref_529_26">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <b>pragma</b> Import (C, Form_Win, "form_win");
+
+      <span class="symbol"><a name="ref_532_7">W</a></span> : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses-forms__adb.htm#ref_529_16">Form_Win</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_513_25">Frm</a>);
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses-forms__adb.htm#ref_532_7">W</a>;
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_513_13">Get_Window</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_539_14" href="terminal_interface-curses-forms__ads.htm#ref_518_14">Set_Sub_Window</a></span> (<span class="symbol"><a name="ref_539_30" href="terminal_interface-curses-forms__ads.htm#ref_518_30">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                             <span class="symbol"><a name="ref_540_30" href="terminal_interface-curses-forms__ads.htm#ref_519_30">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_542_16">Set_Form_Sub</a></span> (<span class="symbol"><a name="ref_542_30">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                             <span class="symbol"><a name="ref_543_30">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Form_Sub, "set_form_sub");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_542_16">Set_Form_Sub</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_518_30">Frm</a>, <a href="terminal_interface-curses-forms__ads.htm#ref_519_30">Win</a>));
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_518_14">Set_Sub_Window</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_552_13" href="terminal_interface-curses-forms__ads.htm#ref_524_13">Get_Sub_Window</a></span> (<span class="symbol"><a name="ref_552_29" href="terminal_interface-curses-forms__ads.htm#ref_524_29">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_554_16">Form_Sub</a></span> (<span class="symbol"><a name="ref_554_26">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <b>pragma</b> Import (C, Form_Sub, "form_sub");
+
+      <span class="symbol"><a name="ref_557_7">W</a></span> : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses-forms__adb.htm#ref_554_16">Form_Sub</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_524_29">Frm</a>);
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses-forms__adb.htm#ref_557_7">W</a>;
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_524_13">Get_Sub_Window</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_564_14" href="terminal_interface-curses-forms__ads.htm#ref_529_14">Scale</a></span> (<span class="symbol"><a name="ref_564_21" href="terminal_interface-curses-forms__ads.htm#ref_529_21">Frm</a></span>     : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                    <span class="symbol"><a name="ref_565_21" href="terminal_interface-curses-forms__ads.htm#ref_530_21">Lines</a></span>   : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a>;
+                    <span class="symbol"><a name="ref_566_21" href="terminal_interface-curses-forms__ads.htm#ref_531_21">Columns</a></span> : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a>)
+   <b>is</b>
+      <b>type</b> <span class="symbol"><a name="ref_568_12">C_Int_Access</a></span> <b>is</b> <b>access</b> <b>all</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>function</b> <span class="symbol"><a name="ref_569_16">M_Scale</a></span> (<span class="symbol"><a name="ref_569_25">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>; <span class="symbol"><a name="ref_569_37">Yp</a></span>, <span class="symbol"><a name="ref_569_41">Xp</a></span> : <a href="terminal_interface-curses-forms__adb.htm#ref_568_12">C_Int_Access</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, M_Scale, "scale_form");
+
+      <span class="symbol"><a name="ref_572_7">X</a></span>, <span class="symbol"><a name="ref_572_10">Y</a></span> : <b>aliased</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_569_16">M_Scale</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_529_21">Frm</a>, <a href="terminal_interface-curses-forms__adb.htm#ref_572_10">Y</a>'<b>Access</b>, <a href="terminal_interface-curses-forms__adb.htm#ref_572_7">X</a>'<b>Access</b>));
+      <a href="terminal_interface-curses-forms__ads.htm#ref_530_21">Lines</a>   := <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_572_10">Y</a>);
+      <a href="terminal_interface-curses-forms__ads.htm#ref_531_21">Columns</a> := <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_572_7">X</a>);
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_529_14">Scale</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | man page menu_hook.3x</em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_585_14" href="terminal_interface-curses-forms__ads.htm#ref_543_14">Set_Field_Init_Hook</a></span> (<span class="symbol"><a name="ref_585_35" href="terminal_interface-curses-forms__ads.htm#ref_543_35">Frm</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                                  <span class="symbol"><a name="ref_586_35" href="terminal_interface-curses-forms__ads.htm#ref_544_35">Proc</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_539_9">Form_Hook_Function</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_588_16">Set_Field_Init</a></span> (<span class="symbol"><a name="ref_588_32">Frm</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                               <span class="symbol"><a name="ref_589_32">Proc</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_539_9">Form_Hook_Function</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Field_Init, "set_field_init");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_588_16">Set_Field_Init</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_543_35">Frm</a>, <a href="terminal_interface-curses-forms__ads.htm#ref_544_35">Proc</a>));
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_543_14">Set_Field_Init_Hook</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_598_14" href="terminal_interface-curses-forms__ads.htm#ref_549_14">Set_Field_Term_Hook</a></span> (<span class="symbol"><a name="ref_598_35" href="terminal_interface-curses-forms__ads.htm#ref_549_35">Frm</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                                  <span class="symbol"><a name="ref_599_35" href="terminal_interface-curses-forms__ads.htm#ref_550_35">Proc</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_539_9">Form_Hook_Function</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_601_16">Set_Field_Term</a></span> (<span class="symbol"><a name="ref_601_32">Frm</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                               <span class="symbol"><a name="ref_602_32">Proc</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_539_9">Form_Hook_Function</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Field_Term, "set_field_term");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_601_16">Set_Field_Term</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_549_35">Frm</a>, <a href="terminal_interface-curses-forms__ads.htm#ref_550_35">Proc</a>));
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_549_14">Set_Field_Term_Hook</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_611_14" href="terminal_interface-curses-forms__ads.htm#ref_555_14">Set_Form_Init_Hook</a></span> (<span class="symbol"><a name="ref_611_34" href="terminal_interface-curses-forms__ads.htm#ref_555_34">Frm</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                                 <span class="symbol"><a name="ref_612_34" href="terminal_interface-curses-forms__ads.htm#ref_556_34">Proc</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_539_9">Form_Hook_Function</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_614_16">Set_Form_Init</a></span> (<span class="symbol"><a name="ref_614_31">Frm</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                              <span class="symbol"><a name="ref_615_31">Proc</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_539_9">Form_Hook_Function</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Form_Init, "set_form_init");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_614_16">Set_Form_Init</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_555_34">Frm</a>, <a href="terminal_interface-curses-forms__ads.htm#ref_556_34">Proc</a>));
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_555_14">Set_Form_Init_Hook</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_624_14" href="terminal_interface-curses-forms__ads.htm#ref_561_14">Set_Form_Term_Hook</a></span> (<span class="symbol"><a name="ref_624_34" href="terminal_interface-curses-forms__ads.htm#ref_561_34">Frm</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                                 <span class="symbol"><a name="ref_625_34" href="terminal_interface-curses-forms__ads.htm#ref_562_34">Proc</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_539_9">Form_Hook_Function</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_627_16">Set_Form_Term</a></span> (<span class="symbol"><a name="ref_627_31">Frm</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                              <span class="symbol"><a name="ref_628_31">Proc</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_539_9">Form_Hook_Function</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Form_Term, "set_form_term");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_627_16">Set_Form_Term</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_561_34">Frm</a>, <a href="terminal_interface-curses-forms__ads.htm#ref_562_34">Proc</a>));
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_561_14">Set_Form_Term_Hook</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | man page form_fields.3x</em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_641_14" href="terminal_interface-curses-forms__ads.htm#ref_591_14">Redefine</a></span> (<span class="symbol"><a name="ref_641_24" href="terminal_interface-curses-forms__ads.htm#ref_591_24">Frm</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                       <span class="symbol"><a name="ref_642_24" href="terminal_interface-curses-forms__ads.htm#ref_592_24">Flds</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_136_9">Field_Array_Access</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_644_16">Set_Frm_Fields</a></span> (<span class="symbol"><a name="ref_644_32">Frm</a></span>   : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                               <span class="symbol"><a name="ref_645_32">Items</a></span> : System.Address) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Frm_Fields, "set_form_fields");
+
+   <b>begin</b>
+      <b>pragma</b> Assert (<a href="terminal_interface-curses-forms__ads.htm#ref_592_24">Flds</a>.<b>all</b> (<a href="terminal_interface-curses-forms__ads.htm#ref_592_24">Flds</a>'Last) = <a href="terminal_interface-curses-forms__ads.htm#ref_55_4">Null_Field</a>);
+      <b>if</b> <a href="terminal_interface-curses-forms__ads.htm#ref_592_24">Flds</a>.<b>all</b> (<a href="terminal_interface-curses-forms__ads.htm#ref_592_24">Flds</a>'Last) /= <a href="terminal_interface-curses-forms__ads.htm#ref_55_4">Null_Field</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses-forms__ads.htm#ref_288_4">Form_Exception</a>;
+      <b>else</b>
+         <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_644_16">Set_Frm_Fields</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_591_24">Frm</a>, <a href="terminal_interface-curses-forms__ads.htm#ref_592_24">Flds</a>.<b>all</b> (<a href="terminal_interface-curses-forms__ads.htm#ref_592_24">Flds</a>'First)'Address));
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_591_14">Redefine</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_659_13" href="terminal_interface-curses-forms__ads.htm#ref_603_13">Fields</a></span> (<span class="symbol"><a name="ref_659_21" href="terminal_interface-curses-forms__ads.htm#ref_603_21">Frm</a></span>   : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                    <span class="symbol"><a name="ref_660_21" href="terminal_interface-curses-forms__ads.htm#ref_604_21">Index</a></span> : Positive) <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>
+   <b>is</b>
+      <b>use</b> F_Array;
+
+      <b>function</b> C_Fields (<span class="symbol"><a name="ref_664_26">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>) <b>return</b> Pointer;
+      <b>pragma</b> Import (C, C_Fields, "form_fields");
+
+      P : Pointer := C_Fields (<a href="terminal_interface-curses-forms__ads.htm#ref_603_21">Frm</a>);
+   <b>begin</b>
+      <b>if</b> P = <b>null</b> <b>or</b> <b>else</b> <a href="terminal_interface-curses-forms__ads.htm#ref_604_21">Index</a> &gt; <a href="terminal_interface-curses-forms__ads.htm#ref_609_13">Field_Count</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_603_21">Frm</a>) <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses-forms__ads.htm#ref_288_4">Form_Exception</a>;
+      <b>else</b>
+         P := P + ptrdiff_t (<a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_604_21">Index</a>) - 1);
+         <b>return</b> P.<b>all</b>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_603_13">Fields</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_679_13" href="terminal_interface-curses-forms__ads.htm#ref_609_13">Field_Count</a></span> (<span class="symbol"><a name="ref_679_26" href="terminal_interface-curses-forms__ads.htm#ref_609_26">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>) <b>return</b> Natural
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_681_16">Count</a></span> (<span class="symbol"><a name="ref_681_23">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Count, "field_count");
+   <b>begin</b>
+      <b>return</b> Natural (<a href="terminal_interface-curses-forms__adb.htm#ref_681_16">Count</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_609_26">Frm</a>));
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_609_13">Field_Count</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_689_14" href="terminal_interface-curses-forms__ads.htm#ref_614_14">Move</a></span> (<span class="symbol"><a name="ref_689_20" href="terminal_interface-curses-forms__ads.htm#ref_614_20">Fld</a></span>    : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                   <span class="symbol"><a name="ref_690_20" href="terminal_interface-curses-forms__ads.htm#ref_615_20">Line</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+                   <span class="symbol"><a name="ref_691_20" href="terminal_interface-curses-forms__ads.htm#ref_616_20">Column</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_693_16">Move</a></span> (<span class="symbol"><a name="ref_693_22">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>; <span class="symbol"><a name="ref_693_35">L</a></span>, <span class="symbol"><a name="ref_693_38">C</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Move, "move_field");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_693_16">Move</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_614_20">Fld</a>, <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_615_20">Line</a>), <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_616_20">Column</a>)));
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_614_14">Move</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | man page form_new.3x</em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_706_13" href="terminal_interface-curses-forms__ads.htm#ref_625_13">Create</a></span> (<span class="symbol"><a name="ref_706_21" href="terminal_interface-curses-forms__ads.htm#ref_625_21">Fields</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_136_9">Field_Array_Access</a>) <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_708_16">NewForm</a></span> (<span class="symbol"><a name="ref_708_25">Fields</a></span> : System.Address) <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+      <b>pragma</b> Import (C, NewForm, "new_form");
+
+      <span class="symbol"><a name="ref_711_7">M</a></span>   : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+   <b>begin</b>
+      <b>pragma</b> Assert (<a href="terminal_interface-curses-forms__ads.htm#ref_625_21">Fields</a>.<b>all</b> (<a href="terminal_interface-curses-forms__ads.htm#ref_625_21">Fields</a>'Last) = <a href="terminal_interface-curses-forms__ads.htm#ref_55_4">Null_Field</a>);
+      <b>if</b> <a href="terminal_interface-curses-forms__ads.htm#ref_625_21">Fields</a>.<b>all</b> (<a href="terminal_interface-curses-forms__ads.htm#ref_625_21">Fields</a>'Last) /= <a href="terminal_interface-curses-forms__ads.htm#ref_55_4">Null_Field</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses-forms__ads.htm#ref_288_4">Form_Exception</a>;
+      <b>else</b>
+         <a href="terminal_interface-curses-forms__adb.htm#ref_711_7">M</a> := <a href="terminal_interface-curses-forms__adb.htm#ref_708_16">NewForm</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_625_21">Fields</a>.<b>all</b> (<a href="terminal_interface-curses-forms__ads.htm#ref_625_21">Fields</a>'First)'Address);
+         <b>if</b> <a href="terminal_interface-curses-forms__adb.htm#ref_711_7">M</a> = <a href="terminal_interface-curses-forms__ads.htm#ref_56_4">Null_Form</a> <b>then</b>
+            <b>raise</b> <a href="terminal_interface-curses-forms__ads.htm#ref_288_4">Form_Exception</a>;
+         <b>end</b> <b>if</b>;
+         <b>return</b> <a href="terminal_interface-curses-forms__adb.htm#ref_711_7">M</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_625_13">Create</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_727_14" href="terminal_interface-curses-forms__ads.htm#ref_636_14">Delete</a></span> (<span class="symbol"><a name="ref_727_22" href="terminal_interface-curses-forms__ads.htm#ref_636_22">Frm</a></span> : <b>in</b> <b>out</b> <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_729_16">Free</a></span> (<span class="symbol"><a name="ref_729_22">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Free, "free_form");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_729_16">Free</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_636_22">Frm</a>));
+      <a href="terminal_interface-curses-forms__ads.htm#ref_636_22">Frm</a> := <a href="terminal_interface-curses-forms__ads.htm#ref_56_4">Null_Form</a>;
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_636_14">Delete</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | man page form_opts.3x</em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_743_14" href="terminal_interface-curses-forms__ads.htm#ref_646_14">Set_Options</a></span> (<span class="symbol"><a name="ref_743_27" href="terminal_interface-curses-forms__ads.htm#ref_646_27">Frm</a></span>     : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                          <span class="symbol"><a name="ref_744_27" href="terminal_interface-curses-forms__ads.htm#ref_647_27">Options</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_109_9">Form_Option_Set</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_746_16">Set_Form_Opts</a></span> (<span class="symbol"><a name="ref_746_31">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                              <span class="symbol"><a name="ref_747_31">Opt</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_109_9">Form_Option_Set</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Form_Opts, "set_form_opts");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_746_16">Set_Form_Opts</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_646_27">Frm</a>, <a href="terminal_interface-curses-forms__ads.htm#ref_647_27">Options</a>));
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_646_14">Set_Options</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_756_14" href="terminal_interface-curses-forms__ads.htm#ref_652_14">Switch_Options</a></span> (<span class="symbol"><a name="ref_756_30" href="terminal_interface-curses-forms__ads.htm#ref_652_30">Frm</a></span>     : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                             <span class="symbol"><a name="ref_757_30" href="terminal_interface-curses-forms__ads.htm#ref_653_30">Options</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_109_9">Form_Option_Set</a>;
+                             <span class="symbol"><a name="ref_758_30" href="terminal_interface-curses-forms__ads.htm#ref_654_30">On</a></span>      : Boolean := True)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_760_16">Form_Opts_On</a></span> (<span class="symbol"><a name="ref_760_30">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                             <span class="symbol"><a name="ref_761_30">Opt</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_109_9">Form_Option_Set</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Form_Opts_On, "form_opts_on");
+      <b>function</b> <span class="symbol"><a name="ref_763_16">Form_Opts_Off</a></span> (<span class="symbol"><a name="ref_763_31">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                              <span class="symbol"><a name="ref_764_31">Opt</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_109_9">Form_Option_Set</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Form_Opts_Off, "form_opts_off");
+
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-forms__ads.htm#ref_654_30">On</a> <b>then</b>
+         <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_760_16">Form_Opts_On</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_652_30">Frm</a>, <a href="terminal_interface-curses-forms__ads.htm#ref_653_30">Options</a>));
+      <b>else</b>
+         <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_763_16">Form_Opts_Off</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_652_30">Frm</a>, <a href="terminal_interface-curses-forms__ads.htm#ref_653_30">Options</a>));
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_652_14">Switch_Options</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_777_14" href="terminal_interface-curses-forms__ads.htm#ref_660_14">Get_Options</a></span> (<span class="symbol"><a name="ref_777_27" href="terminal_interface-curses-forms__ads.htm#ref_660_27">Frm</a></span>     : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                          <span class="symbol"><a name="ref_778_27" href="terminal_interface-curses-forms__ads.htm#ref_661_27">Options</a></span> : <b>out</b> <a href="terminal_interface-curses-forms__ads.htm#ref_109_9">Form_Option_Set</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_780_16">Form_Opts</a></span> (<span class="symbol"><a name="ref_780_27">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>) <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_109_9">Form_Option_Set</a>;
+      <b>pragma</b> Import (C, Form_Opts, "form_opts");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-forms__ads.htm#ref_661_27">Options</a> := <a href="terminal_interface-curses-forms__adb.htm#ref_780_16">Form_Opts</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_660_27">Frm</a>);
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_660_14">Get_Options</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_789_13" href="terminal_interface-curses-forms__ads.htm#ref_665_13">Get_Options</a></span> (<span class="symbol"><a name="ref_789_26" href="terminal_interface-curses-forms__ads.htm#ref_665_26">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a> := <a href="terminal_interface-curses-forms__ads.htm#ref_56_4">Null_Form</a>) <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_109_9">Form_Option_Set</a>
+   <b>is</b>
+      <span class="symbol"><a name="ref_791_7">Fos</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_109_9">Form_Option_Set</a>;
+   <b>begin</b>
+      <a href="terminal_interface-curses-forms__ads.htm#ref_660_14">Get_Options</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_665_26">Frm</a>, <a href="terminal_interface-curses-forms__adb.htm#ref_791_7">Fos</a>);
+      <b>return</b> <a href="terminal_interface-curses-forms__adb.htm#ref_791_7">Fos</a>;
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_665_13">Get_Options</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | man page form_post.3x</em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_803_14" href="terminal_interface-curses-forms__ads.htm#ref_674_14">Post</a></span> (<span class="symbol"><a name="ref_803_20" href="terminal_interface-curses-forms__ads.htm#ref_674_20">Frm</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                   <span class="symbol"><a name="ref_804_20" href="terminal_interface-curses-forms__ads.htm#ref_675_20">Post</a></span> : Boolean := True)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_806_16">M_Post</a></span> (<span class="symbol"><a name="ref_806_24">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, M_Post, "post_form");
+      <b>function</b> <span class="symbol"><a name="ref_808_16">M_Unpost</a></span> (<span class="symbol"><a name="ref_808_26">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, M_Unpost, "unpost_form");
+
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-forms__ads.htm#ref_675_20">Post</a> <b>then</b>
+         <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_806_16">M_Post</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_674_20">Frm</a>));
+      <b>else</b>
+         <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_808_16">M_Unpost</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_674_20">Frm</a>));
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_674_14">Post</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | man page form_cursor.3x</em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_825_14" href="terminal_interface-curses-forms__ads.htm#ref_685_14">Position_Cursor</a></span> (<span class="symbol"><a name="ref_825_31" href="terminal_interface-curses-forms__ads.htm#ref_685_31">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_827_16">Pos_Form_Cursor</a></span> (<span class="symbol"><a name="ref_827_33">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Pos_Form_Cursor, "pos_form_cursor");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_827_16">Pos_Form_Cursor</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_685_31">Frm</a>));
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_685_14">Position_Cursor</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | man page form_data.3x</em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_840_13" href="terminal_interface-curses-forms__ads.htm#ref_694_13">Data_Ahead</a></span> (<span class="symbol"><a name="ref_840_25" href="terminal_interface-curses-forms__ads.htm#ref_694_25">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>) <b>return</b> Boolean
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_842_16">Ahead</a></span> (<span class="symbol"><a name="ref_842_23">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Ahead, "data_ahead");
+
+      <span class="symbol"><a name="ref_845_7">Res</a></span> : <b>constant</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> := <a href="terminal_interface-curses-forms__adb.htm#ref_842_16">Ahead</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_694_25">Frm</a>);
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-forms__adb.htm#ref_845_7">Res</a> = <a href="terminal_interface-curses-aux__ads.htm#ref_67_4">Curses_False</a> <b>then</b>
+         <b>return</b> False;
+      <b>else</b>
+         <b>return</b> True;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_694_13">Data_Ahead</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_856_13" href="terminal_interface-curses-forms__ads.htm#ref_699_13">Data_Behind</a></span> (<span class="symbol"><a name="ref_856_26" href="terminal_interface-curses-forms__ads.htm#ref_699_26">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>) <b>return</b> Boolean
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_858_16">Behind</a></span> (<span class="symbol"><a name="ref_858_24">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Behind, "data_behind");
+
+      <span class="symbol"><a name="ref_861_7">Res</a></span> : <b>constant</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> := <a href="terminal_interface-curses-forms__adb.htm#ref_858_16">Behind</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_699_26">Frm</a>);
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-forms__adb.htm#ref_861_7">Res</a> = <a href="terminal_interface-curses-aux__ads.htm#ref_67_4">Curses_False</a> <b>then</b>
+         <b>return</b> False;
+      <b>else</b>
+         <b>return</b> True;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_699_13">Data_Behind</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | man page form_driver.3x</em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_876_13" href="terminal_interface-curses-forms__ads.htm#ref_713_13">Driver</a></span> (<span class="symbol"><a name="ref_876_21" href="terminal_interface-curses-forms__ads.htm#ref_713_21">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                    <span class="symbol"><a name="ref_877_21" href="terminal_interface-curses-forms__ads.htm#ref_714_21">Key</a></span> : <a href="terminal_interface-curses__ads.htm#ref_67_9">Key_Code</a>) <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_707_9">Driver_Result</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_879_16">Frm_Driver</a></span> (<span class="symbol"><a name="ref_879_28">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>; <span class="symbol"><a name="ref_879_40">Key</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Frm_Driver, "form_driver");
+
+      <span class="symbol"><a name="ref_882_7">R</a></span> : <b>constant</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a> := <a href="terminal_interface-curses-forms__adb.htm#ref_879_16">Frm_Driver</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_713_21">Frm</a>, <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_714_21">Key</a>));
+   <b>begin</b>
+      <b>case</b> <a href="terminal_interface-curses-forms__adb.htm#ref_882_7">R</a> <b>is</b>
+         <b>when</b> <a href="terminal_interface-curses-aux__ads.htm#ref_77_7">E_Unknown_Command</a> =&gt;
+            <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_709_27">Unknown_Request</a>;
+         <b>when</b> <a href="terminal_interface-curses-aux__ads.htm#ref_72_7">E_Invalid_Field</a> =&gt;
+            <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_710_27">Invalid_Field</a>;
+         <b>when</b> <a href="terminal_interface-curses-aux__ads.htm#ref_73_7">E_Request_Denied</a> =&gt;
+            <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_708_27">Request_Denied</a>;
+         <b>when</b> <b>others</b> =&gt;
+            <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_882_7">R</a>);
+            <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_707_27">Form_Ok</a>;
+      <b>end</b> <b>case</b>;
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_713_13">Driver</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | man page form_page.3x</em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_903_14" href="terminal_interface-curses-forms__ads.htm#ref_725_14">Set_Current</a></span> (<span class="symbol"><a name="ref_903_27" href="terminal_interface-curses-forms__ads.htm#ref_725_27">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                          <span class="symbol"><a name="ref_904_27" href="terminal_interface-curses-forms__ads.htm#ref_726_27">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_906_16">Set_Current_Fld</a></span> (<span class="symbol"><a name="ref_906_33">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>; <span class="symbol"><a name="ref_906_45">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Current_Fld, "set_current_field");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_906_16">Set_Current_Fld</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_725_27">Frm</a>, <a href="terminal_interface-curses-forms__ads.htm#ref_726_27">Fld</a>));
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_725_14">Set_Current</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_915_13" href="terminal_interface-curses-forms__ads.htm#ref_731_13">Current</a></span> (<span class="symbol"><a name="ref_915_22" href="terminal_interface-curses-forms__ads.htm#ref_731_22">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>) <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_917_16">Current_Fld</a></span> (<span class="symbol"><a name="ref_917_29">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>) <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+      <b>pragma</b> Import (C, Current_Fld, "current_field");
+
+      <span class="symbol"><a name="ref_920_7">Fld</a></span> : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a> := <a href="terminal_interface-curses-forms__adb.htm#ref_917_16">Current_Fld</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_731_22">Frm</a>);
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-forms__adb.htm#ref_920_7">Fld</a> = <a href="terminal_interface-curses-forms__ads.htm#ref_55_4">Null_Field</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses-forms__ads.htm#ref_288_4">Form_Exception</a>;
+      <b>end</b> <b>if</b>;
+      <b>return</b> <a href="terminal_interface-curses-forms__adb.htm#ref_920_7">Fld</a>;
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_731_13">Current</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_930_14" href="terminal_interface-curses-forms__ads.htm#ref_736_14">Set_Page</a></span> (<span class="symbol"><a name="ref_930_24" href="terminal_interface-curses-forms__ads.htm#ref_736_24">Frm</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                       <span class="symbol"><a name="ref_931_24" href="terminal_interface-curses-forms__ads.htm#ref_737_24">Page</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_722_9">Page_Number</a> := <a href="terminal_interface-curses-forms__ads.htm#ref_722_9">Page_Number</a>'First)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_933_16">Set_Frm_Page</a></span> (<span class="symbol"><a name="ref_933_30">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>; <span class="symbol"><a name="ref_933_42">Pg</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Frm_Page, "set_form_page");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_933_16">Set_Frm_Page</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_736_24">Frm</a>, <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_737_24">Page</a>)));
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_736_14">Set_Page</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_942_13" href="terminal_interface-curses-forms__ads.htm#ref_742_13">Page</a></span> (<span class="symbol"><a name="ref_942_19" href="terminal_interface-curses-forms__ads.htm#ref_742_19">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>) <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_722_9">Page_Number</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_944_16">Get_Page</a></span> (<span class="symbol"><a name="ref_944_26">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Get_Page, "form_page");
+
+      <span class="symbol"><a name="ref_947_7">P</a></span> : <b>constant</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> := <a href="terminal_interface-curses-forms__adb.htm#ref_944_16">Get_Page</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_742_19">Frm</a>);
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-forms__adb.htm#ref_947_7">P</a> &lt; 0 <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses-forms__ads.htm#ref_288_4">Form_Exception</a>;
+      <b>else</b>
+         <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_722_9">Page_Number</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_947_7">P</a>);
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_742_13">Page</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_956_13" href="terminal_interface-curses-forms__ads.htm#ref_747_13">Get_Index</a></span> (<span class="symbol"><a name="ref_956_24" href="terminal_interface-curses-forms__ads.htm#ref_747_24">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>) <b>return</b> Positive
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_958_16">Get_Fieldindex</a></span> (<span class="symbol"><a name="ref_958_32">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Get_Fieldindex, "field_index");
+
+      <span class="symbol"><a name="ref_961_7">Res</a></span> : <b>constant</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> := <a href="terminal_interface-curses-forms__adb.htm#ref_958_16">Get_Fieldindex</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_747_24">Fld</a>);
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-forms__adb.htm#ref_961_7">Res</a> = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses-forms__ads.htm#ref_288_4">Form_Exception</a>;
+      <b>end</b> <b>if</b>;
+      <b>return</b> Positive (Natural (<a href="terminal_interface-curses-forms__adb.htm#ref_961_7">Res</a>) + Positive'First);
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_747_13">Get_Index</a>;
+
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | man page form_new_page.3x</em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_976_14" href="terminal_interface-curses-forms__ads.htm#ref_759_14">Set_New_Page</a></span> (<span class="symbol"><a name="ref_976_28" href="terminal_interface-curses-forms__ads.htm#ref_759_28">Fld</a></span>      : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                           <span class="symbol"><a name="ref_977_28" href="terminal_interface-curses-forms__ads.htm#ref_760_28">New_Page</a></span> : Boolean := True)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_979_16">Set_Page</a></span> (<span class="symbol"><a name="ref_979_26">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>; <span class="symbol"><a name="ref_979_39">Flg</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Page, "set_new_page");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-forms__adb.htm#ref_979_16">Set_Page</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_759_28">Fld</a>, Boolean'Pos (<a href="terminal_interface-curses-forms__ads.htm#ref_760_28">New_Page</a>)));
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_759_14">Set_New_Page</a>;
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_988_13" href="terminal_interface-curses-forms__ads.htm#ref_765_13">Is_New_Page</a></span> (<span class="symbol"><a name="ref_988_26" href="terminal_interface-curses-forms__ads.htm#ref_765_26">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>) <b>return</b> Boolean
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_990_16">Is_New</a></span> (<span class="symbol"><a name="ref_990_24">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Is_New, "new_page");
+
+      <span class="symbol"><a name="ref_993_7">Res</a></span> : <b>constant</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> := <a href="terminal_interface-curses-forms__adb.htm#ref_990_16">Is_New</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_765_26">Fld</a>);
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-forms__adb.htm#ref_993_7">Res</a> = <a href="terminal_interface-curses-aux__ads.htm#ref_67_4">Curses_False</a> <b>then</b>
+         <b>return</b> False;
+      <b>else</b>
+         <b>return</b> True;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_765_13">Is_New_Page</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1002_14" href="terminal_interface-curses-forms__ads.htm#ref_138_14">Free</a></span> (<span class="symbol"><a name="ref_1002_20" href="terminal_interface-curses-forms__ads.htm#ref_138_20">FA</a></span>          : <b>in</b> <b>out</b> <a href="terminal_interface-curses-forms__ads.htm#ref_136_9">Field_Array_Access</a>;
+                   <span class="symbol"><a name="ref_1003_20" href="terminal_interface-curses-forms__ads.htm#ref_139_20">Free_Fields</a></span> : Boolean := False)
+   <b>is</b>
+      <b>procedure</b> Release <b>is</b> <b>new</b> Ada.Unchecked_Deallocation
+        (Field_Array, <a href="terminal_interface-curses-forms__ads.htm#ref_136_9">Field_Array_Access</a>);
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-forms__ads.htm#ref_138_20">FA</a> /= <b>null</b> <b>and</b> <b>then</b> <a href="terminal_interface-curses-forms__ads.htm#ref_139_20">Free_Fields</a> <b>then</b>
+         <b>for</b> <span class="symbol"><a name="ref_1009_14">I</a></span> <b>in</b> <a href="terminal_interface-curses-forms__ads.htm#ref_138_20">FA</a>'First .. (<a href="terminal_interface-curses-forms__ads.htm#ref_138_20">FA</a>'Last - 1) <b>loop</b>
+            <b>if</b> <a href="terminal_interface-curses-forms__ads.htm#ref_138_20">FA</a>.<b>all</b> (<a href="terminal_interface-curses-forms__adb.htm#ref_1009_14">I</a>) /= <a href="terminal_interface-curses-forms__ads.htm#ref_55_4">Null_Field</a> <b>then</b>
+               <a href="terminal_interface-curses-forms__ads.htm#ref_317_14">Delete</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_138_20">FA</a>.<b>all</b> (<a href="terminal_interface-curses-forms__adb.htm#ref_1009_14">I</a>));
+            <b>end</b> <b>if</b>;
+         <b>end</b> <b>loop</b>;
+      <b>end</b> <b>if</b>;
+      Release (<a href="terminal_interface-curses-forms__ads.htm#ref_138_20">FA</a>);
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_138_14">Free</a>;
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <b>function</b> <span class="symbol"><a name="ref_1020_13" href="terminal_interface-curses-forms__ads.htm#ref_105_13">Default_Field_Options</a></span> <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_63_9">Field_Option_Set</a>
+   <b>is</b>
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_418_13">Get_Options</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_55_4">Null_Field</a>);
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_105_13">Default_Field_Options</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_1026_13" href="terminal_interface-curses-forms__ads.htm#ref_127_13">Default_Form_Options</a></span> <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_109_9">Form_Option_Set</a>
+   <b>is</b>
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_665_13">Get_Options</a> (<a href="terminal_interface-curses-forms__ads.htm#ref_56_4">Null_Form</a>);
+   <b>end</b> <a href="terminal_interface-curses-forms__ads.htm#ref_127_13">Default_Form_Options</a>;
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-forms__ads.htm b/doc/html/ada/terminal_interface-curses-forms__ads.htm
new file mode 100644
index 0000000..22a91e4
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-forms__ads.htm
@@ -0,0 +1,800 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-forms.ads</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-forms.ads </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                      Terminal_Interface.Curses.Form                      --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 S P E C                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1998-2009,2014 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.34 @</em></span>
+<span class="comment"><em>--  @Date: 2020/02/02 23:34:34 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>with</b> System;
+<b>with</b> Ada.Characters.Latin_1;
+
+<b>package</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<span class="symbol"><a name="ref_46_35" href="terminal_interface-curses-forms__adb.htm#ref_51_40">Forms</a></span> <b>is</b>
+   <b>pragma</b> Preelaborate (<a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>);
+   <b>pragma</b> Linker_Options ("-lform" &amp; <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_9_4">DFT_ARG_SUFFIX</a>);
+
+   Space : Character <b>renames</b> Ada.Characters.Latin_1.Space;
+
+   <b>type</b> <span class="symbol"><a name="ref_52_9">Field</a></span>        <b>is</b> <b>private</b>;
+   <b>type</b> <span class="symbol"><a name="ref_53_9">Form</a></span>         <b>is</b> <b>private</b>;
+
+   <span class="symbol"><a name="ref_55_4">Null_Field</a></span>        : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+   <span class="symbol"><a name="ref_56_4">Null_Form</a></span>         : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+
+   <b>type</b> <span class="symbol"><a name="ref_58_9">Field_Justification</a></span> <b>is</b> (<span class="symbol"><a name="ref_58_33">None</a></span>,
+                                <span class="symbol"><a name="ref_59_33">Left</a></span>,
+                                <span class="symbol"><a name="ref_60_33">Center</a></span>,
+                                <span class="symbol"><a name="ref_61_33">Right</a></span>);
+
+   <b>type</b> <span class="symbol"><a name="ref_63_9">Field_Option_Set</a></span> <b>is</b>
+      <b>record</b>
+         <span class="symbol"><a name="ref_65_10">Visible</a></span>   : Boolean;
+         <span class="symbol"><a name="ref_66_10">Active</a></span>    : Boolean;
+         <span class="symbol"><a name="ref_67_10">Public</a></span>    : Boolean;
+         <span class="symbol"><a name="ref_68_10">Edit</a></span>      : Boolean;
+         <span class="symbol"><a name="ref_69_10">Wrap</a></span>      : Boolean;
+         <span class="symbol"><a name="ref_70_10">Blank</a></span>     : Boolean;
+         <span class="symbol"><a name="ref_71_10">Auto_Skip</a></span> : Boolean;
+         <span class="symbol"><a name="ref_72_10">Null_Ok</a></span>   : Boolean;
+         <span class="symbol"><a name="ref_73_10">Pass_Ok</a></span>   : Boolean;
+         <span class="symbol"><a name="ref_74_10">Static</a></span>    : Boolean;
+      <b>end</b> <b>record</b>;
+   <b>pragma</b> Convention (C_Pass_By_Copy, <a href="terminal_interface-curses-forms__ads.htm#ref_63_9">Field_Option_Set</a>);
+
+   <b>for</b> <a href="terminal_interface-curses-forms__ads.htm#ref_63_9">Field_Option_Set</a> <b>use</b>
+      <b>record</b>
+         <a href="terminal_interface-curses-forms__ads.htm#ref_65_10">Visible</a>   <b>at</b> 0 <b>range</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_279_4">O_VISIBLE_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_280_4">O_VISIBLE_Last</a>;
+         <a href="terminal_interface-curses-forms__ads.htm#ref_66_10">Active</a>    <b>at</b> 0 <b>range</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_281_4">O_ACTIVE_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_282_4">O_ACTIVE_Last</a>;
+         <a href="terminal_interface-curses-forms__ads.htm#ref_67_10">Public</a>    <b>at</b> 0 <b>range</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_283_4">O_PUBLIC_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_284_4">O_PUBLIC_Last</a>;
+         <a href="terminal_interface-curses-forms__ads.htm#ref_68_10">Edit</a>      <b>at</b> 0 <b>range</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_285_4">O_EDIT_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_286_4">O_EDIT_Last</a>;
+         <a href="terminal_interface-curses-forms__ads.htm#ref_69_10">Wrap</a>      <b>at</b> 0 <b>range</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_287_4">O_WRAP_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_288_4">O_WRAP_Last</a>;
+         <a href="terminal_interface-curses-forms__ads.htm#ref_70_10">Blank</a>     <b>at</b> 0 <b>range</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_289_4">O_BLANK_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_290_4">O_BLANK_Last</a>;
+         <a href="terminal_interface-curses-forms__ads.htm#ref_71_10">Auto_Skip</a> <b>at</b> 0 <b>range</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_291_4">O_AUTOSKIP_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_292_4">O_AUTOSKIP_Last</a>;
+         <a href="terminal_interface-curses-forms__ads.htm#ref_72_10">Null_Ok</a>   <b>at</b> 0 <b>range</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_293_4">O_NULLOK_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_294_4">O_NULLOK_Last</a>;
+         <a href="terminal_interface-curses-forms__ads.htm#ref_73_10">Pass_Ok</a>   <b>at</b> 0 <b>range</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_295_4">O_PASSOK_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_296_4">O_PASSOK_Last</a>;
+         <a href="terminal_interface-curses-forms__ads.htm#ref_74_10">Static</a>    <b>at</b> 0 <b>range</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_297_4">O_STATIC_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_298_4">O_STATIC_Last</a>;
+      <b>end</b> <b>record</b>;
+   <b>pragma</b> Warnings (Off);
+   <b>for</b> <a href="terminal_interface-curses-forms__ads.htm#ref_63_9">Field_Option_Set</a>'Size <b>use</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_299_4">Field_Options_Size</a>;
+   <b>pragma</b> Warnings (On);
+
+   <b>function</b> <span class="symbol"><a name="ref_105_13" href="terminal_interface-curses-forms__adb.htm#ref_1020_13">Default_Field_Options</a></span> <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_63_9">Field_Option_Set</a>;
+   <span class="comment"><em>--  The initial defaults for the field options.</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-forms__ads.htm#ref_105_13">Default_Field_Options</a>);
+
+   <b>type</b> <span class="symbol"><a name="ref_109_9">Form_Option_Set</a></span> <b>is</b>
+      <b>record</b>
+         <span class="symbol"><a name="ref_111_10">NL_Overload</a></span> : Boolean;
+         <span class="symbol"><a name="ref_112_10">BS_Overload</a></span> : Boolean;
+      <b>end</b> <b>record</b>;
+   <b>pragma</b> Convention (C_Pass_By_Copy, <a href="terminal_interface-curses-forms__ads.htm#ref_109_9">Form_Option_Set</a>);
+
+   <b>for</b> <a href="terminal_interface-curses-forms__ads.htm#ref_109_9">Form_Option_Set</a> <b>use</b>
+      <b>record</b>
+         <a href="terminal_interface-curses-forms__ads.htm#ref_111_10">NL_Overload</a> <b>at</b> 0 <b>range</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_303_4">O_NL_OVERLOAD_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_304_4">O_NL_OVERLOAD_Last</a>;
+         <a href="terminal_interface-curses-forms__ads.htm#ref_112_10">BS_Overload</a> <b>at</b> 0 <b>range</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_305_4">O_BS_OVERLOAD_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_306_4">O_BS_OVERLOAD_Last</a>;
+      <b>end</b> <b>record</b>;
+   <b>pragma</b> Warnings (Off);
+   <b>for</b> <a href="terminal_interface-curses-forms__ads.htm#ref_109_9">Form_Option_Set</a>'Size <b>use</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_299_4">Field_Options_Size</a>;
+   <b>pragma</b> Warnings (On);
+
+   <b>function</b> <span class="symbol"><a name="ref_127_13" href="terminal_interface-curses-forms__adb.htm#ref_1026_13">Default_Form_Options</a></span> <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_109_9">Form_Option_Set</a>;
+   <span class="comment"><em>--  The initial defaults for the form options.</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-forms__ads.htm#ref_127_13">Default_Form_Options</a>);
+
+   <b>type</b> <span class="symbol"><a name="ref_131_9">Buffer_Number</a></span> <b>is</b> <b>new</b> Natural;
+
+   <b>type</b> Field_Array <b>is</b> <b>array</b> (Positive <b>range</b> &lt;&gt;) <b>of</b> <b>aliased</b> <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+   <b>pragma</b> Convention (C, Field_Array);
+
+   <b>type</b> <span class="symbol"><a name="ref_136_9">Field_Array_Access</a></span> <b>is</b> <b>access</b> Field_Array;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_138_14" href="terminal_interface-curses-forms__adb.htm#ref_1002_14">Free</a></span> (<span class="symbol"><a name="ref_138_20" href="terminal_interface-curses-forms__adb.htm#ref_1002_20">FA</a></span>          : <b>in</b> <b>out</b> <a href="terminal_interface-curses-forms__ads.htm#ref_136_9">Field_Array_Access</a>;
+                   <span class="symbol"><a name="ref_139_20" href="terminal_interface-curses-forms__adb.htm#ref_1003_20">Free_Fields</a></span> : Boolean := False);
+   <span class="comment"><em>--  Release the memory for an allocated field array</em></span>
+   <span class="comment"><em>--  If Free_Fields is True, call Delete() for all the fields in</em></span>
+   <span class="comment"><em>--  the array.</em></span>
+
+   <b>subtype</b> <span class="symbol"><a name="ref_144_12">Form_Request_Code</a></span> <b>is</b> <a href="terminal_interface-curses__ads.htm#ref_67_9">Key_Code</a> <b>range</b> (<a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 1) .. (<a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 57);
+
+   <span class="comment"><em>--  The prefix F_ stands for "Form Request"</em></span>
+   <span class="symbol"><a name="ref_147_4">F_Next_Page</a></span>                : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 1;
+   <span class="symbol"><a name="ref_148_4">F_Previous_Page</a></span>            : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 2;
+   <span class="symbol"><a name="ref_149_4">F_First_Page</a></span>               : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 3;
+   <span class="symbol"><a name="ref_150_4">F_Last_Page</a></span>                : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 4;
+
+   <span class="symbol"><a name="ref_152_4">F_Next_Field</a></span>               : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 5;
+   <span class="symbol"><a name="ref_153_4">F_Previous_Field</a></span>           : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 6;
+   <span class="symbol"><a name="ref_154_4">F_First_Field</a></span>              : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 7;
+   <span class="symbol"><a name="ref_155_4">F_Last_Field</a></span>               : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 8;
+   <span class="symbol"><a name="ref_156_4">F_Sorted_Next_Field</a></span>        : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 9;
+   <span class="symbol"><a name="ref_157_4">F_Sorted_Previous_Field</a></span>    : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 10;
+   <span class="symbol"><a name="ref_158_4">F_Sorted_First_Field</a></span>       : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 11;
+   <span class="symbol"><a name="ref_159_4">F_Sorted_Last_Field</a></span>        : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 12;
+   <span class="symbol"><a name="ref_160_4">F_Left_Field</a></span>               : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 13;
+   <span class="symbol"><a name="ref_161_4">F_Right_Field</a></span>              : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 14;
+   <span class="symbol"><a name="ref_162_4">F_Up_Field</a></span>                 : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 15;
+   <span class="symbol"><a name="ref_163_4">F_Down_Field</a></span>               : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 16;
+
+   <span class="symbol"><a name="ref_165_4">F_Next_Char</a></span>                : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 17;
+   <span class="symbol"><a name="ref_166_4">F_Previous_Char</a></span>            : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 18;
+   <span class="symbol"><a name="ref_167_4">F_Next_Line</a></span>                : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 19;
+   <span class="symbol"><a name="ref_168_4">F_Previous_Line</a></span>            : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 20;
+   <span class="symbol"><a name="ref_169_4">F_Next_Word</a></span>                : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 21;
+   <span class="symbol"><a name="ref_170_4">F_Previous_Word</a></span>            : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 22;
+   <span class="symbol"><a name="ref_171_4">F_Begin_Field</a></span>              : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 23;
+   <span class="symbol"><a name="ref_172_4">F_End_Field</a></span>                : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 24;
+   <span class="symbol"><a name="ref_173_4">F_Begin_Line</a></span>               : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 25;
+   <span class="symbol"><a name="ref_174_4">F_End_Line</a></span>                 : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 26;
+   <span class="symbol"><a name="ref_175_4">F_Left_Char</a></span>                : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 27;
+   <span class="symbol"><a name="ref_176_4">F_Right_Char</a></span>               : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 28;
+   <span class="symbol"><a name="ref_177_4">F_Up_Char</a></span>                  : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 29;
+   <span class="symbol"><a name="ref_178_4">F_Down_Char</a></span>                : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 30;
+
+   <span class="symbol"><a name="ref_180_4">F_New_Line</a></span>                 : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 31;
+   <span class="symbol"><a name="ref_181_4">F_Insert_Char</a></span>              : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 32;
+   <span class="symbol"><a name="ref_182_4">F_Insert_Line</a></span>              : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 33;
+   <span class="symbol"><a name="ref_183_4">F_Delete_Char</a></span>              : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 34;
+   <span class="symbol"><a name="ref_184_4">F_Delete_Previous</a></span>          : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 35;
+   <span class="symbol"><a name="ref_185_4">F_Delete_Line</a></span>              : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 36;
+   <span class="symbol"><a name="ref_186_4">F_Delete_Word</a></span>              : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 37;
+   <span class="symbol"><a name="ref_187_4">F_Clear_EOL</a></span>                : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 38;
+   <span class="symbol"><a name="ref_188_4">F_Clear_EOF</a></span>                : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 39;
+   <span class="symbol"><a name="ref_189_4">F_Clear_Field</a></span>              : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 40;
+   <span class="symbol"><a name="ref_190_4">F_Overlay_Mode</a></span>             : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 41;
+   <span class="symbol"><a name="ref_191_4">F_Insert_Mode</a></span>              : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 42;
+
+   <span class="comment"><em>--  Vertical Scrolling</em></span>
+   <span class="symbol"><a name="ref_194_4">F_ScrollForward_Line</a></span>       : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 43;
+   <span class="symbol"><a name="ref_195_4">F_ScrollBackward_Line</a></span>      : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 44;
+   <span class="symbol"><a name="ref_196_4">F_ScrollForward_Page</a></span>       : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 45;
+   <span class="symbol"><a name="ref_197_4">F_ScrollBackward_Page</a></span>      : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 46;
+   <span class="symbol"><a name="ref_198_4">F_ScrollForward_HalfPage</a></span>   : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 47;
+   <span class="symbol"><a name="ref_199_4">F_ScrollBackward_HalfPage</a></span>  : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 48;
+
+   <span class="comment"><em>--  Horizontal Scrolling</em></span>
+   <span class="symbol"><a name="ref_202_4">F_HScrollForward_Char</a></span>      : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 49;
+   <span class="symbol"><a name="ref_203_4">F_HScrollBackward_Char</a></span>     : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 50;
+   <span class="symbol"><a name="ref_204_4">F_HScrollForward_Line</a></span>      : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 51;
+   <span class="symbol"><a name="ref_205_4">F_HScrollBackward_Line</a></span>     : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 52;
+   <span class="symbol"><a name="ref_206_4">F_HScrollForward_HalfLine</a></span>  : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 53;
+   <span class="symbol"><a name="ref_207_4">F_HScrollBackward_HalfLine</a></span> : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 54;
+
+   <span class="symbol"><a name="ref_209_4">F_Validate_Field</a></span>           : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 55;
+   <span class="symbol"><a name="ref_210_4">F_Next_Choice</a></span>              : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 56;
+   <span class="symbol"><a name="ref_211_4">F_Previous_Choice</a></span>          : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 57;
+
+   <span class="comment"><em>--  For those who like the old 'C' style request names</em></span>
+   REQ_NEXT_PAGE    : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_147_4">F_Next_Page</a>;
+   REQ_PREV_PAGE    : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_148_4">F_Previous_Page</a>;
+   REQ_FIRST_PAGE   : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_149_4">F_First_Page</a>;
+   REQ_LAST_PAGE    : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_150_4">F_Last_Page</a>;
+
+   REQ_NEXT_FIELD   : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_152_4">F_Next_Field</a>;
+   REQ_PREV_FIELD   : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_153_4">F_Previous_Field</a>;
+   REQ_FIRST_FIELD  : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_154_4">F_First_Field</a>;
+   REQ_LAST_FIELD   : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_155_4">F_Last_Field</a>;
+   REQ_SNEXT_FIELD  : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_156_4">F_Sorted_Next_Field</a>;
+   REQ_SPREV_FIELD  : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_157_4">F_Sorted_Previous_Field</a>;
+   REQ_SFIRST_FIELD : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_158_4">F_Sorted_First_Field</a>;
+   REQ_SLAST_FIELD  : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_159_4">F_Sorted_Last_Field</a>;
+   REQ_LEFT_FIELD   : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_160_4">F_Left_Field</a>;
+   REQ_RIGHT_FIELD  : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_161_4">F_Right_Field</a>;
+   REQ_UP_FIELD     : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_162_4">F_Up_Field</a>;
+   REQ_DOWN_FIELD   : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_163_4">F_Down_Field</a>;
+
+   REQ_NEXT_CHAR    : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_165_4">F_Next_Char</a>;
+   REQ_PREV_CHAR    : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_166_4">F_Previous_Char</a>;
+   REQ_NEXT_LINE    : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_167_4">F_Next_Line</a>;
+   REQ_PREV_LINE    : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_168_4">F_Previous_Line</a>;
+   REQ_NEXT_WORD    : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_169_4">F_Next_Word</a>;
+   REQ_PREV_WORD    : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_170_4">F_Previous_Word</a>;
+   REQ_BEG_FIELD    : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_171_4">F_Begin_Field</a>;
+   REQ_END_FIELD    : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_172_4">F_End_Field</a>;
+   REQ_BEG_LINE     : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_173_4">F_Begin_Line</a>;
+   REQ_END_LINE     : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_174_4">F_End_Line</a>;
+   REQ_LEFT_CHAR    : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_175_4">F_Left_Char</a>;
+   REQ_RIGHT_CHAR   : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_176_4">F_Right_Char</a>;
+   REQ_UP_CHAR      : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_177_4">F_Up_Char</a>;
+   REQ_DOWN_CHAR    : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_178_4">F_Down_Char</a>;
+
+   REQ_NEW_LINE     : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_180_4">F_New_Line</a>;
+   REQ_INS_CHAR     : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_181_4">F_Insert_Char</a>;
+   REQ_INS_LINE     : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_182_4">F_Insert_Line</a>;
+   REQ_DEL_CHAR     : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_183_4">F_Delete_Char</a>;
+   REQ_DEL_PREV     : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_184_4">F_Delete_Previous</a>;
+   REQ_DEL_LINE     : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_185_4">F_Delete_Line</a>;
+   REQ_DEL_WORD     : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_186_4">F_Delete_Word</a>;
+   REQ_CLR_EOL      : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_187_4">F_Clear_EOL</a>;
+   REQ_CLR_EOF      : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_188_4">F_Clear_EOF</a>;
+   REQ_CLR_FIELD    : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_189_4">F_Clear_Field</a>;
+   REQ_OVL_MODE     : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_190_4">F_Overlay_Mode</a>;
+   REQ_INS_MODE     : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_191_4">F_Insert_Mode</a>;
+
+   REQ_SCR_FLINE    : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_194_4">F_ScrollForward_Line</a>;
+   REQ_SCR_BLINE    : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_195_4">F_ScrollBackward_Line</a>;
+   REQ_SCR_FPAGE    : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_196_4">F_ScrollForward_Page</a>;
+   REQ_SCR_BPAGE    : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_197_4">F_ScrollBackward_Page</a>;
+   REQ_SCR_FHPAGE   : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_198_4">F_ScrollForward_HalfPage</a>;
+   REQ_SCR_BHPAGE   : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_199_4">F_ScrollBackward_HalfPage</a>;
+
+   REQ_SCR_FCHAR    : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_202_4">F_HScrollForward_Char</a>;
+   REQ_SCR_BCHAR    : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_203_4">F_HScrollBackward_Char</a>;
+   REQ_SCR_HFLINE   : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_204_4">F_HScrollForward_Line</a>;
+   REQ_SCR_HBLINE   : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_205_4">F_HScrollBackward_Line</a>;
+   REQ_SCR_HFHALF   : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_206_4">F_HScrollForward_HalfLine</a>;
+   REQ_SCR_HBHALF   : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_207_4">F_HScrollBackward_HalfLine</a>;
+
+   REQ_VALIDATION   : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_209_4">F_Validate_Field</a>;
+   REQ_NEXT_CHOICE  : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_210_4">F_Next_Choice</a>;
+   REQ_PREV_CHOICE  : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_211_4">F_Previous_Choice</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_278_14" href="terminal_interface-curses-forms__adb.htm#ref_65_14">Request_Name</a></span> (<span class="symbol"><a name="ref_278_28" href="terminal_interface-curses-forms__adb.htm#ref_65_28">Key</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a>;
+                           <span class="symbol"><a name="ref_279_28" href="terminal_interface-curses-forms__adb.htm#ref_66_33">Name</a></span> : <b>out</b> String);
+
+   <b>function</b>  <span class="symbol"><a name="ref_281_14" href="terminal_interface-curses-forms__adb.htm#ref_74_13">Request_Name</a></span> (<span class="symbol"><a name="ref_281_28" href="terminal_interface-curses-forms__adb.htm#ref_74_27">Key</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_144_12">Form_Request_Code</a>) <b>return</b> String;
+   <span class="comment"><em>--  Same as function</em></span>
+   <b>pragma</b> Inline (Request_Name);
+
+   <span class="comment"><em>------------------</em></span>
+   <span class="comment"><em>--  Exceptions  --</em></span>
+   <span class="comment"><em>------------------</em></span>
+   <span class="symbol"><a name="ref_288_4">Form_Exception</a></span> : <b>exception</b>;
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/form_field_new.3x.html">form_field_new.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_1">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_295_13" href="terminal_interface-curses-forms__adb.htm#ref_92_13">Create</a></span> (<span class="symbol"><a name="ref_295_21" href="terminal_interface-curses-forms__adb.htm#ref_92_21">Height</a></span>       : <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a>;
+                    <span class="symbol"><a name="ref_296_21" href="terminal_interface-curses-forms__adb.htm#ref_93_21">Width</a></span>        : <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a>;
+                    <span class="symbol"><a name="ref_297_21" href="terminal_interface-curses-forms__adb.htm#ref_94_21">Top</a></span>          : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+                    <span class="symbol"><a name="ref_298_21" href="terminal_interface-curses-forms__adb.htm#ref_95_21">Left</a></span>         : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+                    <span class="symbol"><a name="ref_299_21" href="terminal_interface-curses-forms__adb.htm#ref_96_21">Off_Screen</a></span>   : Natural := 0;
+                    <span class="symbol"><a name="ref_300_21" href="terminal_interface-curses-forms__adb.htm#ref_97_21">More_Buffers</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_131_9">Buffer_Number</a> := <a href="terminal_interface-curses-forms__ads.htm#ref_131_9">Buffer_Number</a>'First)
+                    <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_field_new.3x.html">new_field()</A></em></span>
+   <span class="comment"><em>--  An overloaded Create is defined later. Pragma Inline appears there.</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_2">|</A></em></span>
+   <b>function</b> New_Field (<span class="symbol"><a name="ref_306_24">Height</a></span>       : <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a>;
+                       <span class="symbol"><a name="ref_307_24">Width</a></span>        : <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a>;
+                       <span class="symbol"><a name="ref_308_24">Top</a></span>          : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+                       <span class="symbol"><a name="ref_309_24">Left</a></span>         : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+                       <span class="symbol"><a name="ref_310_24">Off_Screen</a></span>   : Natural := 0;
+                       <span class="symbol"><a name="ref_311_24">More_Buffers</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_131_9">Buffer_Number</a> := <a href="terminal_interface-curses-forms__ads.htm#ref_131_9">Buffer_Number</a>'First)
+                       <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a> <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_295_13">Create</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_field_new.3x.html">new_field()</A></em></span>
+   <b>pragma</b> Inline (New_Field);
+
+   <span class="comment"><em>--  <A NAME="AFU_3">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_317_14" href="terminal_interface-curses-forms__adb.htm#ref_115_14">Delete</a></span> (<span class="symbol"><a name="ref_317_22" href="terminal_interface-curses-forms__adb.htm#ref_115_22">Fld</a></span> : <b>in</b> <b>out</b> <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_field_new.3x.html">free_field()</A></em></span>
+   <span class="comment"><em>--  Reset Fld to Null_Field</em></span>
+   <span class="comment"><em>--  An overloaded Delete is defined later. Pragma Inline appears there.</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_4">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_323_13" href="terminal_interface-curses-forms__adb.htm#ref_127_13">Duplicate</a></span> (<span class="symbol"><a name="ref_323_24" href="terminal_interface-curses-forms__adb.htm#ref_127_24">Fld</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                       <span class="symbol"><a name="ref_324_24" href="terminal_interface-curses-forms__adb.htm#ref_128_24">Top</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+                       <span class="symbol"><a name="ref_325_24" href="terminal_interface-curses-forms__adb.htm#ref_129_24">Left</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>) <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_field_new.3x.html">dup_field()</A></em></span>
+   <b>pragma</b> Inline (Duplicate);
+
+   <span class="comment"><em>--  <A NAME="AFU_5">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_330_13" href="terminal_interface-curses-forms__adb.htm#ref_148_13">Link</a></span> (<span class="symbol"><a name="ref_330_19" href="terminal_interface-curses-forms__adb.htm#ref_148_19">Fld</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                  <span class="symbol"><a name="ref_331_19" href="terminal_interface-curses-forms__adb.htm#ref_149_19">Top</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+                  <span class="symbol"><a name="ref_332_19" href="terminal_interface-curses-forms__adb.htm#ref_150_19">Left</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>) <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_field_new.3x.html">link_field()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-forms__ads.htm#ref_330_13">Link</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/form_field_just.3x.html">form_field_just.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_6">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_341_14" href="terminal_interface-curses-forms__adb.htm#ref_173_14">Set_Justification</a></span> (<span class="symbol"><a name="ref_341_33" href="terminal_interface-curses-forms__adb.htm#ref_173_33">Fld</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                                <span class="symbol"><a name="ref_342_33" href="terminal_interface-curses-forms__adb.htm#ref_174_33">Just</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_58_9">Field_Justification</a> := <a href="terminal_interface-curses-forms__ads.htm#ref_58_33">None</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_field_just.3x.html">set_field_just()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-forms__ads.htm#ref_341_14">Set_Justification</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_7">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_347_13" href="terminal_interface-curses-forms__adb.htm#ref_187_13">Get_Justification</a></span> (<span class="symbol"><a name="ref_347_32" href="terminal_interface-curses-forms__adb.htm#ref_187_32">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>) <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_58_9">Field_Justification</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_field_just.3x.html">field_just()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-forms__ads.htm#ref_347_13">Get_Justification</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/form_field_buffer.3x.html">form_field_buffer.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_8">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_356_14" href="terminal_interface-curses-forms__adb.htm#ref_201_14">Set_Buffer</a></span>
+     (<span class="symbol"><a name="ref_357_7" href="terminal_interface-curses-forms__adb.htm#ref_202_7">Fld</a></span>    : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+      <span class="symbol"><a name="ref_358_7" href="terminal_interface-curses-forms__adb.htm#ref_203_7">Buffer</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_131_9">Buffer_Number</a> := <a href="terminal_interface-curses-forms__ads.htm#ref_131_9">Buffer_Number</a>'First;
+      <span class="symbol"><a name="ref_359_7" href="terminal_interface-curses-forms__adb.htm#ref_204_7">Str</a></span>    : String);
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_field_buffer.3x.html">set_field_buffer()</A></em></span>
+   <span class="comment"><em>--  Not inlined</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_9">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_364_14" href="terminal_interface-curses-forms__adb.htm#ref_218_14">Get_Buffer</a></span>
+     (<span class="symbol"><a name="ref_365_7" href="terminal_interface-curses-forms__adb.htm#ref_219_7">Fld</a></span>    : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+      <span class="symbol"><a name="ref_366_7" href="terminal_interface-curses-forms__adb.htm#ref_220_7">Buffer</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_131_9">Buffer_Number</a> := <a href="terminal_interface-curses-forms__ads.htm#ref_131_9">Buffer_Number</a>'First;
+      <span class="symbol"><a name="ref_367_7" href="terminal_interface-curses-forms__adb.htm#ref_221_7">Str</a></span>    : <b>out</b> String);
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_field_buffer.3x.html">field_buffer()</A></em></span>
+
+   <b>function</b> <span class="symbol"><a name="ref_370_13" href="terminal_interface-curses-forms__adb.htm#ref_230_13">Get_Buffer</a></span>
+     (<span class="symbol"><a name="ref_371_7" href="terminal_interface-curses-forms__adb.htm#ref_231_7">Fld</a></span>    : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+      <span class="symbol"><a name="ref_372_7" href="terminal_interface-curses-forms__adb.htm#ref_232_7">Buffer</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_131_9">Buffer_Number</a> := <a href="terminal_interface-curses-forms__ads.htm#ref_131_9">Buffer_Number</a>'First) <b>return</b> String;
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_field_buffer.3x.html">field_buffer()</A></em></span>
+   <span class="comment"><em>--  Same but as function</em></span>
+   <b>pragma</b> Inline (Get_Buffer);
+
+   <span class="comment"><em>--  <A NAME="AFU_10">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_378_14" href="terminal_interface-curses-forms__adb.htm#ref_243_14">Set_Status</a></span> (<span class="symbol"><a name="ref_378_26" href="terminal_interface-curses-forms__adb.htm#ref_243_26">Fld</a></span>    : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                         <span class="symbol"><a name="ref_379_26" href="terminal_interface-curses-forms__adb.htm#ref_244_26">Status</a></span> : Boolean := True);
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_field_buffer.3x.html">set_field_status()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-forms__ads.htm#ref_378_14">Set_Status</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_11">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_384_13" href="terminal_interface-curses-forms__adb.htm#ref_258_13">Changed</a></span> (<span class="symbol"><a name="ref_384_22" href="terminal_interface-curses-forms__adb.htm#ref_258_22">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>) <b>return</b> Boolean;
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_field_buffer.3x.html">field_status()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-forms__ads.htm#ref_384_13">Changed</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_12">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_389_14" href="terminal_interface-curses-forms__adb.htm#ref_274_14">Set_Maximum_Size</a></span> (<span class="symbol"><a name="ref_389_32" href="terminal_interface-curses-forms__adb.htm#ref_274_32">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                               <span class="symbol"><a name="ref_390_32" href="terminal_interface-curses-forms__adb.htm#ref_275_32">Max</a></span> : Natural := 0);
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_field_buffer.3x.html">set_field_max()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-forms__ads.htm#ref_389_14">Set_Maximum_Size</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/form_field_opts.3x.html">form_field_opts.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_13">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_399_14" href="terminal_interface-curses-forms__adb.htm#ref_291_14">Set_Options</a></span> (<span class="symbol"><a name="ref_399_27" href="terminal_interface-curses-forms__adb.htm#ref_291_27">Fld</a></span>     : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                          <span class="symbol"><a name="ref_400_27" href="terminal_interface-curses-forms__adb.htm#ref_292_27">Options</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_63_9">Field_Option_Set</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_field_opts.3x.html">set_field_opts()</A></em></span>
+   <span class="comment"><em>--  An overloaded version is defined later. Pragma Inline appears there</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_14">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_405_14" href="terminal_interface-curses-forms__adb.htm#ref_304_14">Switch_Options</a></span> (<span class="symbol"><a name="ref_405_30" href="terminal_interface-curses-forms__adb.htm#ref_304_30">Fld</a></span>     : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                             <span class="symbol"><a name="ref_406_30" href="terminal_interface-curses-forms__adb.htm#ref_305_30">Options</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_63_9">Field_Option_Set</a>;
+                             <span class="symbol"><a name="ref_407_30" href="terminal_interface-curses-forms__adb.htm#ref_306_30">On</a></span>      : Boolean := True);
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_field_opts.3x.html">field_opts_on()</A></em></span>
+   <span class="comment"><em>--  AKA: field_opts_off()</em></span>
+   <span class="comment"><em>--  An overloaded version is defined later. Pragma Inline appears there</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_15">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_413_14" href="terminal_interface-curses-forms__adb.htm#ref_325_14">Get_Options</a></span> (<span class="symbol"><a name="ref_413_27" href="terminal_interface-curses-forms__adb.htm#ref_325_27">Fld</a></span>     : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                          <span class="symbol"><a name="ref_414_27" href="terminal_interface-curses-forms__adb.htm#ref_326_27">Options</a></span> : <b>out</b> <a href="terminal_interface-curses-forms__ads.htm#ref_63_9">Field_Option_Set</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_field_opts.3x.html">field_opts()</A></em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_16">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_418_13" href="terminal_interface-curses-forms__adb.htm#ref_337_13">Get_Options</a></span> (<span class="symbol"><a name="ref_418_26" href="terminal_interface-curses-forms__adb.htm#ref_337_26">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a> := <a href="terminal_interface-curses-forms__ads.htm#ref_55_4">Null_Field</a>)
+                         <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_63_9">Field_Option_Set</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_field_opts.3x.html">field_opts()</A></em></span>
+   <span class="comment"><em>--  An overloaded version is defined later. Pragma Inline appears there</em></span>
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/form_field_attributes.3x.html">form_field_attributes.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_17">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_428_14" href="terminal_interface-curses-forms__adb.htm#ref_352_14">Set_Foreground</a></span>
+     (<span class="symbol"><a name="ref_429_7" href="terminal_interface-curses-forms__adb.htm#ref_353_7">Fld</a></span>   : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+      <span class="symbol"><a name="ref_430_7" href="terminal_interface-curses-forms__adb.htm#ref_354_7">Fore</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a> := <a href="terminal_interface-curses__ads.htm#ref_486_4">Normal_Video</a>;
+      <span class="symbol"><a name="ref_431_7" href="terminal_interface-curses-forms__adb.htm#ref_355_7">Color</a></span> : <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a> := <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>'First);
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_field_attributes.3x.html">set_field_fore()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-forms__ads.htm#ref_428_14">Set_Foreground</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_18">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_436_14" href="terminal_interface-curses-forms__adb.htm#ref_369_14">Foreground</a></span> (<span class="symbol"><a name="ref_436_26" href="terminal_interface-curses-forms__adb.htm#ref_369_26">Fld</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                         <span class="symbol"><a name="ref_437_26" href="terminal_interface-curses-forms__adb.htm#ref_370_26">Fore</a></span> : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_field_attributes.3x.html">field_fore()</A></em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_19">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_441_14" href="terminal_interface-curses-forms__adb.htm#ref_378_14">Foreground</a></span> (<span class="symbol"><a name="ref_441_26" href="terminal_interface-curses-forms__adb.htm#ref_378_26">Fld</a></span>   : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                         <span class="symbol"><a name="ref_442_26" href="terminal_interface-curses-forms__adb.htm#ref_379_26">Fore</a></span>  : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a>;
+                         <span class="symbol"><a name="ref_443_26" href="terminal_interface-curses-forms__adb.htm#ref_380_26">Color</a></span> : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_field_attributes.3x.html">field_fore()</A></em></span>
+   <b>pragma</b> Inline (Foreground);
+
+   <span class="comment"><em>--  <A NAME="AFU_20">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_448_14" href="terminal_interface-curses-forms__adb.htm#ref_391_14">Set_Background</a></span>
+     (<span class="symbol"><a name="ref_449_7" href="terminal_interface-curses-forms__adb.htm#ref_392_7">Fld</a></span>   : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+      <span class="symbol"><a name="ref_450_7" href="terminal_interface-curses-forms__adb.htm#ref_393_7">Back</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a> := <a href="terminal_interface-curses__ads.htm#ref_486_4">Normal_Video</a>;
+      <span class="symbol"><a name="ref_451_7" href="terminal_interface-curses-forms__adb.htm#ref_394_7">Color</a></span> : <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a> := <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>'First);
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_field_attributes.3x.html">set_field_back()</A></em></span>
+   <b>pragma</b> Inline (Set_Background);
+
+   <span class="comment"><em>--  <A NAME="AFU_21">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_456_14" href="terminal_interface-curses-forms__adb.htm#ref_408_14">Background</a></span> (<span class="symbol"><a name="ref_456_26" href="terminal_interface-curses-forms__adb.htm#ref_408_26">Fld</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                         <span class="symbol"><a name="ref_457_26" href="terminal_interface-curses-forms__adb.htm#ref_409_26">Back</a></span> : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_field_attributes.3x.html">field_back()</A></em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_22">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_461_14" href="terminal_interface-curses-forms__adb.htm#ref_417_14">Background</a></span> (<span class="symbol"><a name="ref_461_26" href="terminal_interface-curses-forms__adb.htm#ref_417_26">Fld</a></span>   : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                         <span class="symbol"><a name="ref_462_26" href="terminal_interface-curses-forms__adb.htm#ref_418_26">Back</a></span>  : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a>;
+                         <span class="symbol"><a name="ref_463_26" href="terminal_interface-curses-forms__adb.htm#ref_419_26">Color</a></span> : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_field_attributes.3x.html">field_back()</A></em></span>
+   <b>pragma</b> Inline (Background);
+
+   <span class="comment"><em>--  <A NAME="AFU_23">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_468_14" href="terminal_interface-curses-forms__adb.htm#ref_430_14">Set_Pad_Character</a></span> (<span class="symbol"><a name="ref_468_33" href="terminal_interface-curses-forms__adb.htm#ref_430_33">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                                <span class="symbol"><a name="ref_469_33" href="terminal_interface-curses-forms__adb.htm#ref_431_33">Pad</a></span> : Character := Space);
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_field_attributes.3x.html">set_field_pad()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-forms__ads.htm#ref_468_14">Set_Pad_Character</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_24">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_474_14" href="terminal_interface-curses-forms__adb.htm#ref_444_14">Pad_Character</a></span> (<span class="symbol"><a name="ref_474_29" href="terminal_interface-curses-forms__adb.htm#ref_444_29">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                            <span class="symbol"><a name="ref_475_29" href="terminal_interface-curses-forms__adb.htm#ref_445_29">Pad</a></span> : <b>out</b> Character);
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_field_attributes.3x.html">field_pad()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-forms__ads.htm#ref_474_14">Pad_Character</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/form_field_info.3x.html">form_field_info.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_25">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_484_14" href="terminal_interface-curses-forms__adb.htm#ref_459_14">Info</a></span> (<span class="symbol"><a name="ref_484_20" href="terminal_interface-curses-forms__adb.htm#ref_459_20">Fld</a></span>                : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                   <span class="symbol"><a name="ref_485_20" href="terminal_interface-curses-forms__adb.htm#ref_460_20">Lines</a></span>              : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a>;
+                   <span class="symbol"><a name="ref_486_20" href="terminal_interface-curses-forms__adb.htm#ref_461_20">Columns</a></span>            : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a>;
+                   <span class="symbol"><a name="ref_487_20" href="terminal_interface-curses-forms__adb.htm#ref_462_20">First_Row</a></span>          : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+                   <span class="symbol"><a name="ref_488_20" href="terminal_interface-curses-forms__adb.htm#ref_463_20">First_Column</a></span>       : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+                   <span class="symbol"><a name="ref_489_20" href="terminal_interface-curses-forms__adb.htm#ref_464_20">Off_Screen</a></span>         : <b>out</b> Natural;
+                   <span class="symbol"><a name="ref_490_20" href="terminal_interface-curses-forms__adb.htm#ref_465_20">Additional_Buffers</a></span> : <b>out</b> <a href="terminal_interface-curses-forms__ads.htm#ref_131_9">Buffer_Number</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_field_info.3x.html">field_info()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-forms__ads.htm#ref_484_14">Info</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_26">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_495_14" href="terminal_interface-curses-forms__adb.htm#ref_489_14">Dynamic_Info</a></span> (<span class="symbol"><a name="ref_495_28" href="terminal_interface-curses-forms__adb.htm#ref_489_28">Fld</a></span>     : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                           <span class="symbol"><a name="ref_496_28" href="terminal_interface-curses-forms__adb.htm#ref_490_28">Lines</a></span>   : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a>;
+                           <span class="symbol"><a name="ref_497_28" href="terminal_interface-curses-forms__adb.htm#ref_491_28">Columns</a></span> : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a>;
+                           <span class="symbol"><a name="ref_498_28" href="terminal_interface-curses-forms__adb.htm#ref_492_28">Max</a></span>     : <b>out</b> Natural);
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_field_info.3x.html">dynamic_field_info()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-forms__ads.htm#ref_495_14">Dynamic_Info</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/form_win.3x.html">form_win.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_27">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_507_14" href="terminal_interface-curses-forms__adb.htm#ref_514_14">Set_Window</a></span> (<span class="symbol"><a name="ref_507_26" href="terminal_interface-curses-forms__adb.htm#ref_514_26">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                         <span class="symbol"><a name="ref_508_26" href="terminal_interface-curses-forms__adb.htm#ref_515_26">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_win.3x.html">set_form_win()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-forms__ads.htm#ref_507_14">Set_Window</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_28">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_513_13" href="terminal_interface-curses-forms__adb.htm#ref_527_13">Get_Window</a></span> (<span class="symbol"><a name="ref_513_25" href="terminal_interface-curses-forms__adb.htm#ref_527_25">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_win.3x.html">form_win()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-forms__ads.htm#ref_513_13">Get_Window</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_29">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_518_14" href="terminal_interface-curses-forms__adb.htm#ref_539_14">Set_Sub_Window</a></span> (<span class="symbol"><a name="ref_518_30" href="terminal_interface-curses-forms__adb.htm#ref_539_30">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                             <span class="symbol"><a name="ref_519_30" href="terminal_interface-curses-forms__adb.htm#ref_540_30">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_win.3x.html">set_form_sub()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-forms__ads.htm#ref_518_14">Set_Sub_Window</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_30">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_524_13" href="terminal_interface-curses-forms__adb.htm#ref_552_13">Get_Sub_Window</a></span> (<span class="symbol"><a name="ref_524_29" href="terminal_interface-curses-forms__adb.htm#ref_552_29">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_win.3x.html">form_sub()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-forms__ads.htm#ref_524_13">Get_Sub_Window</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_31">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_529_14" href="terminal_interface-curses-forms__adb.htm#ref_564_14">Scale</a></span> (<span class="symbol"><a name="ref_529_21" href="terminal_interface-curses-forms__adb.htm#ref_564_21">Frm</a></span>     : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                    <span class="symbol"><a name="ref_530_21" href="terminal_interface-curses-forms__adb.htm#ref_565_21">Lines</a></span>   : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a>;
+                    <span class="symbol"><a name="ref_531_21" href="terminal_interface-curses-forms__adb.htm#ref_566_21">Columns</a></span> : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_win.3x.html">scale_form()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-forms__ads.htm#ref_529_14">Scale</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/form_hook.3x.html">form_hook.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <b>type</b> <span class="symbol"><a name="ref_539_9">Form_Hook_Function</a></span> <b>is</b> <b>access</b> <b>procedure</b> (<span class="symbol"><a name="ref_539_49">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>);
+   <b>pragma</b> Convention (C, <a href="terminal_interface-curses-forms__ads.htm#ref_539_9">Form_Hook_Function</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_32">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_543_14" href="terminal_interface-curses-forms__adb.htm#ref_585_14">Set_Field_Init_Hook</a></span> (<span class="symbol"><a name="ref_543_35" href="terminal_interface-curses-forms__adb.htm#ref_585_35">Frm</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                                  <span class="symbol"><a name="ref_544_35" href="terminal_interface-curses-forms__adb.htm#ref_586_35">Proc</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_539_9">Form_Hook_Function</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_hook.3x.html">set_field_init()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-forms__ads.htm#ref_543_14">Set_Field_Init_Hook</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_33">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_549_14" href="terminal_interface-curses-forms__adb.htm#ref_598_14">Set_Field_Term_Hook</a></span> (<span class="symbol"><a name="ref_549_35" href="terminal_interface-curses-forms__adb.htm#ref_598_35">Frm</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                                  <span class="symbol"><a name="ref_550_35" href="terminal_interface-curses-forms__adb.htm#ref_599_35">Proc</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_539_9">Form_Hook_Function</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_hook.3x.html">set_field_term()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-forms__ads.htm#ref_549_14">Set_Field_Term_Hook</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_34">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_555_14" href="terminal_interface-curses-forms__adb.htm#ref_611_14">Set_Form_Init_Hook</a></span> (<span class="symbol"><a name="ref_555_34" href="terminal_interface-curses-forms__adb.htm#ref_611_34">Frm</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                                 <span class="symbol"><a name="ref_556_34" href="terminal_interface-curses-forms__adb.htm#ref_612_34">Proc</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_539_9">Form_Hook_Function</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_hook.3x.html">set_form_init()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-forms__ads.htm#ref_555_14">Set_Form_Init_Hook</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_35">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_561_14" href="terminal_interface-curses-forms__adb.htm#ref_624_14">Set_Form_Term_Hook</a></span> (<span class="symbol"><a name="ref_561_34" href="terminal_interface-curses-forms__adb.htm#ref_624_34">Frm</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                                 <span class="symbol"><a name="ref_562_34" href="terminal_interface-curses-forms__adb.htm#ref_625_34">Proc</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_539_9">Form_Hook_Function</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_hook.3x.html">set_form_term()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-forms__ads.htm#ref_561_14">Set_Form_Term_Hook</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_36">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_567_13">Get_Field_Init_Hook</a></span> (<span class="symbol"><a name="ref_567_34">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>) <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_539_9">Form_Hook_Function</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_hook.3x.html">field_init()</A></em></span>
+   <b>pragma</b> Import (C, Get_Field_Init_Hook, "field_init");
+
+   <span class="comment"><em>--  <A NAME="AFU_37">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_572_13">Get_Field_Term_Hook</a></span> (<span class="symbol"><a name="ref_572_34">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>) <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_539_9">Form_Hook_Function</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_hook.3x.html">field_term()</A></em></span>
+   <b>pragma</b> Import (C, Get_Field_Term_Hook, "field_term");
+
+   <span class="comment"><em>--  <A NAME="AFU_38">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_577_13">Get_Form_Init_Hook</a></span> (<span class="symbol"><a name="ref_577_33">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>) <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_539_9">Form_Hook_Function</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_hook.3x.html">form_init()</A></em></span>
+   <b>pragma</b> Import (C, Get_Form_Init_Hook, "form_init");
+
+   <span class="comment"><em>--  <A NAME="AFU_39">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_582_13">Get_Form_Term_Hook</a></span> (<span class="symbol"><a name="ref_582_33">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>) <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_539_9">Form_Hook_Function</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_hook.3x.html">form_term()</A></em></span>
+   <b>pragma</b> Import (C, Get_Form_Term_Hook, "form_term");
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/form_field.3x.html">form_field.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_40">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_591_14" href="terminal_interface-curses-forms__adb.htm#ref_641_14">Redefine</a></span> (<span class="symbol"><a name="ref_591_24" href="terminal_interface-curses-forms__adb.htm#ref_641_24">Frm</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                       <span class="symbol"><a name="ref_592_24" href="terminal_interface-curses-forms__adb.htm#ref_642_24">Flds</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_136_9">Field_Array_Access</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_field.3x.html">set_form_fields()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-forms__ads.htm#ref_591_14">Redefine</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_41">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_597_14">Set_Fields</a></span> (<span class="symbol"><a name="ref_597_26">Frm</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                         <span class="symbol"><a name="ref_598_26">Flds</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_136_9">Field_Array_Access</a>) <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_591_14">Redefine</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_field.3x.html">set_form_fields()</A></em></span>
+   <span class="comment"><em>--  pragma Inline (Set_Fields);</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_42">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_603_13" href="terminal_interface-curses-forms__adb.htm#ref_659_13">Fields</a></span> (<span class="symbol"><a name="ref_603_21" href="terminal_interface-curses-forms__adb.htm#ref_659_21">Frm</a></span>   : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                    <span class="symbol"><a name="ref_604_21" href="terminal_interface-curses-forms__adb.htm#ref_660_21">Index</a></span> : Positive) <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_field.3x.html">form_fields()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-forms__ads.htm#ref_603_13">Fields</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_43">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_609_13" href="terminal_interface-curses-forms__adb.htm#ref_679_13">Field_Count</a></span> (<span class="symbol"><a name="ref_609_26" href="terminal_interface-curses-forms__adb.htm#ref_679_26">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>) <b>return</b> Natural;
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_field.3x.html">field_count()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-forms__ads.htm#ref_609_13">Field_Count</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_44">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_614_14" href="terminal_interface-curses-forms__adb.htm#ref_689_14">Move</a></span> (<span class="symbol"><a name="ref_614_20" href="terminal_interface-curses-forms__adb.htm#ref_689_20">Fld</a></span>    : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                   <span class="symbol"><a name="ref_615_20" href="terminal_interface-curses-forms__adb.htm#ref_690_20">Line</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+                   <span class="symbol"><a name="ref_616_20" href="terminal_interface-curses-forms__adb.htm#ref_691_20">Column</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_field.3x.html">move_field()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-forms__ads.htm#ref_614_14">Move</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/form_new.3x.html">form_new.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_45">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_625_13" href="terminal_interface-curses-forms__adb.htm#ref_706_13">Create</a></span> (<span class="symbol"><a name="ref_625_21" href="terminal_interface-curses-forms__adb.htm#ref_706_21">Fields</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_136_9">Field_Array_Access</a>) <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_new.3x.html">new_form()</A></em></span>
+   <b>pragma</b> Inline (Create);
+
+   <span class="comment"><em>--  <A NAME="AFU_46">|</A></em></span>
+   <b>function</b> New_Form (<span class="symbol"><a name="ref_630_23">Fields</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_136_9">Field_Array_Access</a>) <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>
+     <b>renames</b> <a href="terminal_interface-curses-forms__ads.htm#ref_625_13">Create</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_new.3x.html">new_form()</A></em></span>
+   <span class="comment"><em>--  pragma Inline (New_Form);</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_47">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_636_14" href="terminal_interface-curses-forms__adb.htm#ref_727_14">Delete</a></span> (<span class="symbol"><a name="ref_636_22" href="terminal_interface-curses-forms__adb.htm#ref_727_22">Frm</a></span> : <b>in</b> <b>out</b> <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_new.3x.html">free_form()</A></em></span>
+   <span class="comment"><em>--  Reset Frm to Null_Form</em></span>
+   <b>pragma</b> Inline (Delete);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/form_opts.3x.html">form_opts.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_48">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_646_14" href="terminal_interface-curses-forms__adb.htm#ref_743_14">Set_Options</a></span> (<span class="symbol"><a name="ref_646_27" href="terminal_interface-curses-forms__adb.htm#ref_743_27">Frm</a></span>     : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                          <span class="symbol"><a name="ref_647_27" href="terminal_interface-curses-forms__adb.htm#ref_744_27">Options</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_109_9">Form_Option_Set</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_opts.3x.html">set_form_opts()</A></em></span>
+   <b>pragma</b> Inline (Set_Options);
+
+   <span class="comment"><em>--  <A NAME="AFU_49">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_652_14" href="terminal_interface-curses-forms__adb.htm#ref_756_14">Switch_Options</a></span> (<span class="symbol"><a name="ref_652_30" href="terminal_interface-curses-forms__adb.htm#ref_756_30">Frm</a></span>     : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                             <span class="symbol"><a name="ref_653_30" href="terminal_interface-curses-forms__adb.htm#ref_757_30">Options</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_109_9">Form_Option_Set</a>;
+                             <span class="symbol"><a name="ref_654_30" href="terminal_interface-curses-forms__adb.htm#ref_758_30">On</a></span>      : Boolean := True);
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_opts.3x.html">form_opts_on()</A></em></span>
+   <span class="comment"><em>--  AKA: form_opts_off()</em></span>
+   <b>pragma</b> Inline (Switch_Options);
+
+   <span class="comment"><em>--  <A NAME="AFU_50">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_660_14" href="terminal_interface-curses-forms__adb.htm#ref_777_14">Get_Options</a></span> (<span class="symbol"><a name="ref_660_27" href="terminal_interface-curses-forms__adb.htm#ref_777_27">Frm</a></span>     : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                          <span class="symbol"><a name="ref_661_27" href="terminal_interface-curses-forms__adb.htm#ref_778_27">Options</a></span> : <b>out</b> <a href="terminal_interface-curses-forms__ads.htm#ref_109_9">Form_Option_Set</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_opts.3x.html">form_opts()</A></em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_51">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_665_13" href="terminal_interface-curses-forms__adb.htm#ref_789_13">Get_Options</a></span> (<span class="symbol"><a name="ref_665_26" href="terminal_interface-curses-forms__adb.htm#ref_789_26">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a> := <a href="terminal_interface-curses-forms__ads.htm#ref_56_4">Null_Form</a>) <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_109_9">Form_Option_Set</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_opts.3x.html">form_opts()</A></em></span>
+   <b>pragma</b> Inline (Get_Options);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/form_post.3x.html">form_post.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_52">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_674_14" href="terminal_interface-curses-forms__adb.htm#ref_803_14">Post</a></span> (<span class="symbol"><a name="ref_674_20" href="terminal_interface-curses-forms__adb.htm#ref_803_20">Frm</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                   <span class="symbol"><a name="ref_675_20" href="terminal_interface-curses-forms__adb.htm#ref_804_20">Post</a></span> : Boolean := True);
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_post.3x.html">post_form()</A></em></span>
+   <span class="comment"><em>--  AKA: unpost_form()</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-forms__ads.htm#ref_674_14">Post</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/form_cursor.3x.html">form_cursor.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_53">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_685_14" href="terminal_interface-curses-forms__adb.htm#ref_825_14">Position_Cursor</a></span> (<span class="symbol"><a name="ref_685_31" href="terminal_interface-curses-forms__adb.htm#ref_825_31">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_cursor.3x.html">pos_form_cursor()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-forms__ads.htm#ref_685_14">Position_Cursor</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/form_data.3x.html">form_data.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_54">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_694_13" href="terminal_interface-curses-forms__adb.htm#ref_840_13">Data_Ahead</a></span> (<span class="symbol"><a name="ref_694_25" href="terminal_interface-curses-forms__adb.htm#ref_840_25">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>) <b>return</b> Boolean;
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_data.3x.html">data_ahead()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-forms__ads.htm#ref_694_13">Data_Ahead</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_55">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_699_13" href="terminal_interface-curses-forms__adb.htm#ref_856_13">Data_Behind</a></span> (<span class="symbol"><a name="ref_699_26" href="terminal_interface-curses-forms__adb.htm#ref_856_26">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>) <b>return</b> Boolean;
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_data.3x.html">data_behind()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-forms__ads.htm#ref_699_13">Data_Behind</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/form_driver.3x.html">form_driver.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <b>type</b> <span class="symbol"><a name="ref_707_9">Driver_Result</a></span> <b>is</b> (<span class="symbol"><a name="ref_707_27">Form_Ok</a></span>,
+                          <span class="symbol"><a name="ref_708_27">Request_Denied</a></span>,
+                          <span class="symbol"><a name="ref_709_27">Unknown_Request</a></span>,
+                          <span class="symbol"><a name="ref_710_27">Invalid_Field</a></span>);
+
+   <span class="comment"><em>--  <A NAME="AFU_56">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_713_13" href="terminal_interface-curses-forms__adb.htm#ref_876_13">Driver</a></span> (<span class="symbol"><a name="ref_713_21" href="terminal_interface-curses-forms__adb.htm#ref_876_21">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                    <span class="symbol"><a name="ref_714_21" href="terminal_interface-curses-forms__adb.htm#ref_877_21">Key</a></span> : <a href="terminal_interface-curses__ads.htm#ref_67_9">Key_Code</a>) <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_707_9">Driver_Result</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_driver.3x.html">form_driver()</A></em></span>
+   <span class="comment"><em>--  Driver not inlined</em></span>
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/form_page.3x.html">form_page.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <b>type</b> <span class="symbol"><a name="ref_722_9">Page_Number</a></span> <b>is</b> <b>new</b> Natural;
+
+   <span class="comment"><em>--  <A NAME="AFU_57">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_725_14" href="terminal_interface-curses-forms__adb.htm#ref_903_14">Set_Current</a></span> (<span class="symbol"><a name="ref_725_27" href="terminal_interface-curses-forms__adb.htm#ref_903_27">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                          <span class="symbol"><a name="ref_726_27" href="terminal_interface-curses-forms__adb.htm#ref_904_27">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_page.3x.html">set_current_field()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-forms__ads.htm#ref_725_14">Set_Current</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_58">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_731_13" href="terminal_interface-curses-forms__adb.htm#ref_915_13">Current</a></span> (<span class="symbol"><a name="ref_731_22" href="terminal_interface-curses-forms__adb.htm#ref_915_22">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>) <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_page.3x.html">current_field()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-forms__ads.htm#ref_731_13">Current</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_59">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_736_14" href="terminal_interface-curses-forms__adb.htm#ref_930_14">Set_Page</a></span> (<span class="symbol"><a name="ref_736_24" href="terminal_interface-curses-forms__adb.htm#ref_930_24">Frm</a></span>  : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>;
+                       <span class="symbol"><a name="ref_737_24" href="terminal_interface-curses-forms__adb.htm#ref_931_24">Page</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_722_9">Page_Number</a> := <a href="terminal_interface-curses-forms__ads.htm#ref_722_9">Page_Number</a>'First);
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_page.3x.html">set_form_page()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-forms__ads.htm#ref_736_14">Set_Page</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_60">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_742_13" href="terminal_interface-curses-forms__adb.htm#ref_942_13">Page</a></span> (<span class="symbol"><a name="ref_742_19" href="terminal_interface-curses-forms__adb.htm#ref_942_19">Frm</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>) <b>return</b> <a href="terminal_interface-curses-forms__ads.htm#ref_722_9">Page_Number</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_page.3x.html">form_page()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-forms__ads.htm#ref_742_13">Page</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_61">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_747_13" href="terminal_interface-curses-forms__adb.htm#ref_956_13">Get_Index</a></span> (<span class="symbol"><a name="ref_747_24" href="terminal_interface-curses-forms__adb.htm#ref_956_24">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>) <b>return</b> Positive;
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_page.3x.html">field_index()</A></em></span>
+   <span class="comment"><em>--  Please note that in this binding we start the numbering of fields</em></span>
+   <span class="comment"><em>--  with 1. So this is number is one more than you get from the low</em></span>
+   <span class="comment"><em>--  level call.</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-forms__ads.htm#ref_747_13">Get_Index</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/form_new_page.3x.html">form_new_page.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_62">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_759_14" href="terminal_interface-curses-forms__adb.htm#ref_976_14">Set_New_Page</a></span> (<span class="symbol"><a name="ref_759_28" href="terminal_interface-curses-forms__adb.htm#ref_976_28">Fld</a></span>      : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>;
+                           <span class="symbol"><a name="ref_760_28" href="terminal_interface-curses-forms__adb.htm#ref_977_28">New_Page</a></span> : Boolean := True);
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_new_page.3x.html">set_new_page()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-forms__ads.htm#ref_759_14">Set_New_Page</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_63">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_765_13" href="terminal_interface-curses-forms__adb.htm#ref_988_13">Is_New_Page</a></span> (<span class="symbol"><a name="ref_765_26" href="terminal_interface-curses-forms__adb.htm#ref_988_26">Fld</a></span> : <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a>) <b>return</b> Boolean;
+   <span class="comment"><em>--  AKA: <A HREF="../man/form_new_page.3x.html">new_page()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-forms__ads.htm#ref_765_13">Is_New_Page</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/form_requestname.3x.html">form_requestname.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  Not Implemented: form_request_name, form_request_by_name</em></span>
+
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>private</b>
+   <b>type</b> <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a> <b>is</b> <b>new</b> System.Storage_Elements.Integer_Address;
+   <b>type</b> <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>  <b>is</b> <b>new</b> System.Storage_Elements.Integer_Address;
+
+   <a href="terminal_interface-curses-forms__ads.htm#ref_55_4">Null_Field</a> : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_52_9">Field</a> := 0;
+   <a href="terminal_interface-curses-forms__ads.htm#ref_56_4">Null_Form</a>  : <b>constant</b> <a href="terminal_interface-curses-forms__ads.htm#ref_53_9">Form</a>  := 0;
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-forms__ads.htm#ref_46_35">Forms</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-menus-item_user_data__adb.htm b/doc/html/ada/terminal_interface-curses-menus-item_user_data__adb.htm
new file mode 100644
index 0000000..558bbf6
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-menus-item_user_data__adb.htm
@@ -0,0 +1,90 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-menus-item_user_data.adb</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-menus-item_user_data.adb </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--               Terminal_Interface.Curses.Menus.Item_User_Data             --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 B O D Y                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2018,2020 Thomas E. Dickey                                     --</em></span>
+<span class="comment"><em>-- Copyright 1999-2009,2014 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.16 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>with</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>; <b>use</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>;
+
+<b>package</b> <b>body</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-menus__ads.htm#ref_46_35">Menus</a>.<span class="symbol"><a name="ref_44_46" href="terminal_interface-curses-menus-item_user_data__ads.htm#ref_47_41">Item_User_Data</a></span> <b>is</b>
+
+   <b>procedure</b> <span class="symbol"><a name="ref_46_14" href="terminal_interface-curses-menus-item_user_data__ads.htm#ref_59_14">Set_User_Data</a></span> (<span class="symbol"><a name="ref_46_29" href="terminal_interface-curses-menus-item_user_data__ads.htm#ref_59_29">Itm</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>;
+                            <span class="symbol"><a name="ref_47_29" href="terminal_interface-curses-menus-item_user_data__ads.htm#ref_60_29">Data</a></span> : <a href="terminal_interface-curses-menus-item_user_data__ads.htm#ref_46_9">User_Access</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_49_16">Set_Item_Userptr</a></span> (<span class="symbol"><a name="ref_49_34">Itm</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>;
+                                 <span class="symbol"><a name="ref_50_34">Addr</a></span> : <a href="terminal_interface-curses-menus-item_user_data__ads.htm#ref_46_9">User_Access</a>)  <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Item_Userptr, "set_item_userptr");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-menus-item_user_data__adb.htm#ref_49_16">Set_Item_Userptr</a> (<a href="terminal_interface-curses-menus-item_user_data__ads.htm#ref_59_29">Itm</a>, <a href="terminal_interface-curses-menus-item_user_data__ads.htm#ref_60_29">Data</a>));
+   <b>end</b> <a href="terminal_interface-curses-menus-item_user_data__ads.htm#ref_59_14">Set_User_Data</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_57_13" href="terminal_interface-curses-menus-item_user_data__ads.htm#ref_70_13">Get_User_Data</a></span> (<span class="symbol"><a name="ref_57_28" href="terminal_interface-curses-menus-item_user_data__ads.htm#ref_70_28">Itm</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>) <b>return</b> <a href="terminal_interface-curses-menus-item_user_data__ads.htm#ref_46_9">User_Access</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_59_16">Item_Userptr</a></span> (<span class="symbol"><a name="ref_59_30">Itm</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>) <b>return</b> <a href="terminal_interface-curses-menus-item_user_data__ads.htm#ref_46_9">User_Access</a>;
+      <b>pragma</b> Import (C, Item_Userptr, "item_userptr");
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses-menus-item_user_data__adb.htm#ref_59_16">Item_Userptr</a> (<a href="terminal_interface-curses-menus-item_user_data__ads.htm#ref_70_28">Itm</a>);
+   <b>end</b> <a href="terminal_interface-curses-menus-item_user_data__ads.htm#ref_70_13">Get_User_Data</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_65_14" href="terminal_interface-curses-menus-item_user_data__ads.htm#ref_65_14">Get_User_Data</a></span> (<span class="symbol"><a name="ref_65_29" href="terminal_interface-curses-menus-item_user_data__ads.htm#ref_65_29">Itm</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>;
+                            <span class="symbol"><a name="ref_66_29" href="terminal_interface-curses-menus-item_user_data__ads.htm#ref_66_29">Data</a></span> : <b>out</b> <a href="terminal_interface-curses-menus-item_user_data__ads.htm#ref_46_9">User_Access</a>)
+   <b>is</b>
+   <b>begin</b>
+      <a href="terminal_interface-curses-menus-item_user_data__ads.htm#ref_66_29">Data</a> := <a href="terminal_interface-curses-menus-item_user_data__ads.htm#ref_70_13">Get_User_Data</a> (<a href="terminal_interface-curses-menus-item_user_data__ads.htm#ref_65_29">Itm</a>);
+   <b>end</b> <a href="terminal_interface-curses-menus-item_user_data__ads.htm#ref_65_14">Get_User_Data</a>;
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-menus__ads.htm#ref_46_35">Menus</a>.<a href="terminal_interface-curses-menus-item_user_data__ads.htm#ref_47_41">Item_User_Data</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-menus-item_user_data__ads.htm b/doc/html/ada/terminal_interface-curses-menus-item_user_data__ads.htm
new file mode 100644
index 0000000..44911be
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-menus-item_user_data__ads.htm
@@ -0,0 +1,93 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-menus-item_user_data.ads</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-menus-item_user_data.ads </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--               Terminal_Interface.Curses.Menus.Item_User_Data             --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 S P E C                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1998-2006,2009 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.18 @</em></span>
+<span class="comment"><em>--  @Date: 2020/02/02 23:34:34 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+
+<b>generic</b>
+   <b>type</b> <span class="symbol"><a name="ref_45_9">User</a></span> <b>is</b> <b>limited</b> <b>private</b>;
+   <b>type</b> <span class="symbol"><a name="ref_46_9">User_Access</a></span> <b>is</b> <b>access</b> <a href="terminal_interface-curses-menus-item_user_data__ads.htm#ref_45_9">User</a>;
+<b>package</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-menus__ads.htm#ref_46_35">Menus</a>.<span class="symbol"><a name="ref_47_41" href="terminal_interface-curses-menus-item_user_data__adb.htm#ref_44_46">Item_User_Data</a></span> <b>is</b>
+   <b>pragma</b> Preelaborate (<a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-menus__ads.htm#ref_46_35">Menus</a>.<a href="terminal_interface-curses-menus-item_user_data__ads.htm#ref_47_41">Item_User_Data</a>);
+
+   <span class="comment"><em>--  The binding uses the same user pointer for menu items</em></span>
+   <span class="comment"><em>--  as the low level C implementation. So you can safely</em></span>
+   <span class="comment"><em>--  read or write the user pointer also with the C routines</em></span>
+   <span class="comment"><em>--</em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/mitem_userptr.3x.html">mitem_userptr.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_1">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_59_14" href="terminal_interface-curses-menus-item_user_data__adb.htm#ref_46_14">Set_User_Data</a></span> (<span class="symbol"><a name="ref_59_29" href="terminal_interface-curses-menus-item_user_data__adb.htm#ref_46_29">Itm</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>;
+                            <span class="symbol"><a name="ref_60_29" href="terminal_interface-curses-menus-item_user_data__adb.htm#ref_47_29">Data</a></span> : <a href="terminal_interface-curses-menus-item_user_data__ads.htm#ref_46_9">User_Access</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/mitem_userptr.3x.html">set_item_userptr</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-menus-item_user_data__ads.htm#ref_59_14">Set_User_Data</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_2">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_65_14" href="terminal_interface-curses-menus-item_user_data__adb.htm#ref_65_14">Get_User_Data</a></span> (<span class="symbol"><a name="ref_65_29" href="terminal_interface-curses-menus-item_user_data__adb.htm#ref_65_29">Itm</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>;
+                            <span class="symbol"><a name="ref_66_29" href="terminal_interface-curses-menus-item_user_data__adb.htm#ref_66_29">Data</a></span> : <b>out</b> <a href="terminal_interface-curses-menus-item_user_data__ads.htm#ref_46_9">User_Access</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/mitem_userptr.3x.html">item_userptr</A></em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_3">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_70_13" href="terminal_interface-curses-menus-item_user_data__adb.htm#ref_57_13">Get_User_Data</a></span> (<span class="symbol"><a name="ref_70_28" href="terminal_interface-curses-menus-item_user_data__adb.htm#ref_57_28">Itm</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>) <b>return</b> <a href="terminal_interface-curses-menus-item_user_data__ads.htm#ref_46_9">User_Access</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/mitem_userptr.3x.html">item_userptr</A></em></span>
+   <span class="comment"><em>--  Same as function</em></span>
+   <b>pragma</b> Inline (Get_User_Data);
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-menus__ads.htm#ref_46_35">Menus</a>.<a href="terminal_interface-curses-menus-item_user_data__ads.htm#ref_47_41">Item_User_Data</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-menus-menu_user_data__adb.htm b/doc/html/ada/terminal_interface-curses-menus-menu_user_data__adb.htm
new file mode 100644
index 0000000..12c9ecc
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-menus-menu_user_data__adb.htm
@@ -0,0 +1,91 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-menus-menu_user_data.adb</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-menus-menu_user_data.adb </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--               Terminal_Interface.Curses.Menus.Menu_User_Data             --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 B O D Y                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2018,2020 Thomas E. Dickey                                     --</em></span>
+<span class="comment"><em>-- Copyright 1999-2009,2014 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.17 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>with</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>; <b>use</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>;
+
+<b>package</b> <b>body</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-menus__ads.htm#ref_46_35">Menus</a>.<span class="symbol"><a name="ref_44_46" href="terminal_interface-curses-menus-menu_user_data__ads.htm#ref_46_41">Menu_User_Data</a></span> <b>is</b>
+
+   <b>procedure</b> <span class="symbol"><a name="ref_46_14" href="terminal_interface-curses-menus-menu_user_data__ads.htm#ref_54_14">Set_User_Data</a></span> (<span class="symbol"><a name="ref_46_29" href="terminal_interface-curses-menus-menu_user_data__ads.htm#ref_54_29">Men</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                            <span class="symbol"><a name="ref_47_29" href="terminal_interface-curses-menus-menu_user_data__ads.htm#ref_55_29">Data</a></span> : <a href="terminal_interface-curses-menus-menu_user_data__ads.htm#ref_45_9">User_Access</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_49_16">Set_Menu_Userptr</a></span> (<span class="symbol"><a name="ref_49_34">Men</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                                 <span class="symbol"><a name="ref_50_34">Data</a></span> : <a href="terminal_interface-curses-menus-menu_user_data__ads.htm#ref_45_9">User_Access</a>)  <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Menu_Userptr, "set_menu_userptr");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-menus-menu_user_data__adb.htm#ref_49_16">Set_Menu_Userptr</a> (<a href="terminal_interface-curses-menus-menu_user_data__ads.htm#ref_54_29">Men</a>, <a href="terminal_interface-curses-menus-menu_user_data__ads.htm#ref_55_29">Data</a>));
+
+   <b>end</b> <a href="terminal_interface-curses-menus-menu_user_data__ads.htm#ref_54_14">Set_User_Data</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_58_13" href="terminal_interface-curses-menus-menu_user_data__ads.htm#ref_65_13">Get_User_Data</a></span> (<span class="symbol"><a name="ref_58_28" href="terminal_interface-curses-menus-menu_user_data__ads.htm#ref_65_28">Men</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> <a href="terminal_interface-curses-menus-menu_user_data__ads.htm#ref_45_9">User_Access</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_60_16">Menu_Userptr</a></span> (<span class="symbol"><a name="ref_60_30">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> <a href="terminal_interface-curses-menus-menu_user_data__ads.htm#ref_45_9">User_Access</a>;
+      <b>pragma</b> Import (C, Menu_Userptr, "menu_userptr");
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses-menus-menu_user_data__adb.htm#ref_60_16">Menu_Userptr</a> (<a href="terminal_interface-curses-menus-menu_user_data__ads.htm#ref_65_28">Men</a>);
+   <b>end</b> <a href="terminal_interface-curses-menus-menu_user_data__ads.htm#ref_65_13">Get_User_Data</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_66_14" href="terminal_interface-curses-menus-menu_user_data__ads.htm#ref_60_14">Get_User_Data</a></span> (<span class="symbol"><a name="ref_66_29" href="terminal_interface-curses-menus-menu_user_data__ads.htm#ref_60_29">Men</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                            <span class="symbol"><a name="ref_67_29" href="terminal_interface-curses-menus-menu_user_data__ads.htm#ref_61_29">Data</a></span> : <b>out</b> <a href="terminal_interface-curses-menus-menu_user_data__ads.htm#ref_45_9">User_Access</a>)
+   <b>is</b>
+   <b>begin</b>
+      <a href="terminal_interface-curses-menus-menu_user_data__ads.htm#ref_61_29">Data</a> := <a href="terminal_interface-curses-menus-menu_user_data__ads.htm#ref_65_13">Get_User_Data</a> (<a href="terminal_interface-curses-menus-menu_user_data__ads.htm#ref_60_29">Men</a>);
+   <b>end</b> <a href="terminal_interface-curses-menus-menu_user_data__ads.htm#ref_60_14">Get_User_Data</a>;
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-menus__ads.htm#ref_46_35">Menus</a>.<a href="terminal_interface-curses-menus-menu_user_data__ads.htm#ref_46_41">Menu_User_Data</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-menus-menu_user_data__ads.htm b/doc/html/ada/terminal_interface-curses-menus-menu_user_data__ads.htm
new file mode 100644
index 0000000..aa398ef
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-menus-menu_user_data__ads.htm
@@ -0,0 +1,88 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-menus-menu_user_data.ads</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-menus-menu_user_data.ads </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--               Terminal_Interface.Curses.Menus.Menu_User_Data             --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 S P E C                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1998-2003,2009 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.16 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+
+<b>generic</b>
+   <b>type</b> <span class="symbol"><a name="ref_44_9">User</a></span> <b>is</b> <b>limited</b> <b>private</b>;
+   <b>type</b> <span class="symbol"><a name="ref_45_9">User_Access</a></span> <b>is</b> <b>access</b> <a href="terminal_interface-curses-menus-menu_user_data__ads.htm#ref_44_9">User</a>;
+<b>package</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-menus__ads.htm#ref_46_35">Menus</a>.<span class="symbol"><a name="ref_46_41" href="terminal_interface-curses-menus-menu_user_data__adb.htm#ref_44_46">Menu_User_Data</a></span> <b>is</b>
+   <b>pragma</b> Preelaborate (<a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-menus__ads.htm#ref_46_35">Menus</a>.<a href="terminal_interface-curses-menus-menu_user_data__ads.htm#ref_46_41">Menu_User_Data</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/menu_userptr.3x.html">menu_userptr.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_1">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_54_14" href="terminal_interface-curses-menus-menu_user_data__adb.htm#ref_46_14">Set_User_Data</a></span> (<span class="symbol"><a name="ref_54_29" href="terminal_interface-curses-menus-menu_user_data__adb.htm#ref_46_29">Men</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                            <span class="symbol"><a name="ref_55_29" href="terminal_interface-curses-menus-menu_user_data__adb.htm#ref_47_29">Data</a></span> : <a href="terminal_interface-curses-menus-menu_user_data__ads.htm#ref_45_9">User_Access</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_userptr.3x.html">set_menu_userptr</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-menus-menu_user_data__ads.htm#ref_54_14">Set_User_Data</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_2">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_60_14" href="terminal_interface-curses-menus-menu_user_data__adb.htm#ref_66_14">Get_User_Data</a></span> (<span class="symbol"><a name="ref_60_29" href="terminal_interface-curses-menus-menu_user_data__adb.htm#ref_66_29">Men</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                            <span class="symbol"><a name="ref_61_29" href="terminal_interface-curses-menus-menu_user_data__adb.htm#ref_67_29">Data</a></span> : <b>out</b> <a href="terminal_interface-curses-menus-menu_user_data__ads.htm#ref_45_9">User_Access</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_userptr.3x.html">menu_userptr</A></em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_3">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_65_13" href="terminal_interface-curses-menus-menu_user_data__adb.htm#ref_58_13">Get_User_Data</a></span> (<span class="symbol"><a name="ref_65_28" href="terminal_interface-curses-menus-menu_user_data__adb.htm#ref_58_28">Men</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> <a href="terminal_interface-curses-menus-menu_user_data__ads.htm#ref_45_9">User_Access</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_userptr.3x.html">menu_userptr</A></em></span>
+   <span class="comment"><em>--  Same as function</em></span>
+   <b>pragma</b> Inline (Get_User_Data);
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-menus__ads.htm#ref_46_35">Menus</a>.<a href="terminal_interface-curses-menus-menu_user_data__ads.htm#ref_46_41">Menu_User_Data</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-menus__adb.htm b/doc/html/ada/terminal_interface-curses-menus__adb.htm
new file mode 100644
index 0000000..5602733
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-menus__adb.htm
@@ -0,0 +1,922 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-menus.adb</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-menus.adb </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                      Terminal_Interface.Curses.Menus                     --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 B O D Y                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2018,2020 Thomas E. Dickey                                     --</em></span>
+<span class="comment"><em>-- Copyright 1999-2011,2014 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.34 @</em></span>
+<span class="comment"><em>--  @Date: 2020/02/02 23:34:34 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>with</b> Ada.Unchecked_Deallocation;
+<b>with</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>; <b>use</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>;
+
+<b>with</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C; <b>use</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C;
+<b>with</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.Strings; <b>use</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.Strings;
+<b>with</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.Pointers;
+
+<b>package</b> <b>body</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<span class="symbol"><a name="ref_50_40" href="terminal_interface-curses-menus__ads.htm#ref_46_35">Menus</a></span> <b>is</b>
+
+   <b>type</b> C_Item_Array <b>is</b> <b>array</b> (Natural <b>range</b> &lt;&gt;) <b>of</b> <b>aliased</b> <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>;
+   <b>package</b> I_Array <b>is</b> <b>new</b>
+     <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.Pointers (Natural, <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>, C_Item_Array, <a href="terminal_interface-curses-menus__ads.htm#ref_58_4">Null_Item</a>);
+
+   <b>subtype</b> <span class="symbol"><a name="ref_56_12">chars_ptr</a></span> <b>is</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.Strings.chars_ptr;
+
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_59_14" href="terminal_interface-curses-menus__ads.htm#ref_102_14">Request_Name</a></span> (<span class="symbol"><a name="ref_59_28" href="terminal_interface-curses-menus__ads.htm#ref_102_28">Key</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_61_12">Menu_Request_Code</a>;
+                           <span class="symbol"><a name="ref_60_28" href="terminal_interface-curses-menus__ads.htm#ref_103_28">Name</a></span> : <b>out</b> String)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_62_16">Request_Name</a></span> (<span class="symbol"><a name="ref_62_30">Key</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-menus__adb.htm#ref_56_12">chars_ptr</a>;
+      <b>pragma</b> Import (C, Request_Name, "menu_request_name");
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_91_14">Fill_String</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_62_16">Request_Name</a> (<a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_102_28">Key</a>)), <a href="terminal_interface-curses-menus__ads.htm#ref_103_28">Name</a>);
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_102_14">Request_Name</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_68_13" href="terminal_interface-curses-menus__ads.htm#ref_105_14">Request_Name</a></span> (<span class="symbol"><a name="ref_68_27" href="terminal_interface-curses-menus__ads.htm#ref_105_28">Key</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_61_12">Menu_Request_Code</a>) <b>return</b> String
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_70_16">Request_Name</a></span> (<span class="symbol"><a name="ref_70_30">Key</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-menus__adb.htm#ref_56_12">chars_ptr</a>;
+      <b>pragma</b> Import (C, Request_Name, "menu_request_name");
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_96_13">Fill_String</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_70_16">Request_Name</a> (<a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_105_28">Key</a>)));
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_105_14">Request_Name</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_76_13" href="terminal_interface-curses-menus__ads.htm#ref_190_13">Create</a></span> (<span class="symbol"><a name="ref_76_21" href="terminal_interface-curses-menus__ads.htm#ref_190_21">Name</a></span>        : String;
+                    <span class="symbol"><a name="ref_77_21" href="terminal_interface-curses-menus__ads.htm#ref_191_21">Description</a></span> : String := "") <b>return</b> <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>
+   <b>is</b>
+      <b>type</b> <span class="symbol"><a name="ref_79_12">Char_Ptr</a></span> <b>is</b> <b>access</b> <b>all</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.char;
+      <b>function</b> <span class="symbol"><a name="ref_80_16">Newitem</a></span> (<span class="symbol"><a name="ref_80_25">Name</a></span>, <span class="symbol"><a name="ref_80_31">Desc</a></span> : <a href="terminal_interface-curses-menus__adb.htm#ref_79_12">Char_Ptr</a>) <b>return</b> <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>;
+      <b>pragma</b> Import (C, Newitem, "new_item");
+
+      <b>type</b> Name_String <b>is</b> <b>new</b> char_array (0 .. <a href="terminal_interface-curses-menus__ads.htm#ref_190_21">Name</a>'Length);
+      <b>type</b> <span class="symbol"><a name="ref_84_12">Name_String_Ptr</a></span> <b>is</b> <b>access</b> Name_String;
+      <b>pragma</b> Controlled (<a href="terminal_interface-curses-menus__adb.htm#ref_84_12">Name_String_Ptr</a>);
+
+      <b>type</b> Desc_String <b>is</b> <b>new</b> char_array (0 .. <a href="terminal_interface-curses-menus__ads.htm#ref_191_21">Description</a>'Length);
+      <b>type</b> <span class="symbol"><a name="ref_88_12">Desc_String_Ptr</a></span> <b>is</b> <b>access</b> Desc_String;
+      <b>pragma</b> Controlled (<a href="terminal_interface-curses-menus__adb.htm#ref_88_12">Desc_String_Ptr</a>);
+
+      <span class="symbol"><a name="ref_91_7">Name_Str</a></span> : <b>constant</b> <a href="terminal_interface-curses-menus__adb.htm#ref_84_12">Name_String_Ptr</a> := <b>new</b> Name_String;
+      <span class="symbol"><a name="ref_92_7">Desc_Str</a></span> : <b>constant</b> <a href="terminal_interface-curses-menus__adb.htm#ref_88_12">Desc_String_Ptr</a> := <b>new</b> Desc_String;
+      <span class="symbol"><a name="ref_93_7">Name_Len</a></span>, <span class="symbol"><a name="ref_93_17">Desc_Len</a></span> : size_t;
+      <span class="symbol"><a name="ref_94_7">Result</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>;
+   <b>begin</b>
+      To_C (<a href="terminal_interface-curses-menus__ads.htm#ref_190_21">Name</a>, <a href="terminal_interface-curses-menus__adb.htm#ref_91_7">Name_Str</a>.<b>all</b>, <a href="terminal_interface-curses-menus__adb.htm#ref_93_7">Name_Len</a>);
+      To_C (<a href="terminal_interface-curses-menus__ads.htm#ref_191_21">Description</a>, <a href="terminal_interface-curses-menus__adb.htm#ref_92_7">Desc_Str</a>.<b>all</b>, <a href="terminal_interface-curses-menus__adb.htm#ref_93_17">Desc_Len</a>);
+      <a href="terminal_interface-curses-menus__adb.htm#ref_94_7">Result</a> := <a href="terminal_interface-curses-menus__adb.htm#ref_80_16">Newitem</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_91_7">Name_Str</a>.<b>all</b> (<a href="terminal_interface-curses-menus__adb.htm#ref_91_7">Name_Str</a>.<b>all</b>'First)'<b>Access</b>,
+                         <a href="terminal_interface-curses-menus__adb.htm#ref_92_7">Desc_Str</a>.<b>all</b> (<a href="terminal_interface-curses-menus__adb.htm#ref_92_7">Desc_Str</a>.<b>all</b>'First)'<b>Access</b>);
+      <b>if</b> <a href="terminal_interface-curses-menus__adb.htm#ref_94_7">Result</a> = <a href="terminal_interface-curses-menus__ads.htm#ref_58_4">Null_Item</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_528_4">Eti_System_Error</a>;
+      <b>end</b> <b>if</b>;
+      <b>return</b> <a href="terminal_interface-curses-menus__adb.htm#ref_94_7">Result</a>;
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_190_13">Create</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_106_14" href="terminal_interface-curses-menus__ads.htm#ref_202_14">Delete</a></span> (<span class="symbol"><a name="ref_106_22" href="terminal_interface-curses-menus__ads.htm#ref_202_22">Itm</a></span> : <b>in</b> <b>out</b> <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_108_16">Descname</a></span> (<span class="symbol"><a name="ref_108_26">Itm</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>) <b>return</b> <a href="terminal_interface-curses-menus__adb.htm#ref_56_12">chars_ptr</a>;
+      <b>pragma</b> Import (C, Descname, "item_description");
+      <b>function</b> <span class="symbol"><a name="ref_110_16">Itemname</a></span> (<span class="symbol"><a name="ref_110_26">Itm</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>) <b>return</b> <a href="terminal_interface-curses-menus__adb.htm#ref_56_12">chars_ptr</a>;
+      <b>pragma</b> Import (C, Itemname, "item_name");
+
+      <b>function</b> <span class="symbol"><a name="ref_113_16">Freeitem</a></span> (<span class="symbol"><a name="ref_113_26">Itm</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Freeitem, "free_item");
+
+      <span class="symbol"><a name="ref_116_7">Ptr</a></span> : <a href="terminal_interface-curses-menus__adb.htm#ref_56_12">chars_ptr</a>;
+   <b>begin</b>
+      <a href="terminal_interface-curses-menus__adb.htm#ref_116_7">Ptr</a> := <a href="terminal_interface-curses-menus__adb.htm#ref_108_16">Descname</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_202_22">Itm</a>);
+      <b>if</b> <a href="terminal_interface-curses-menus__adb.htm#ref_116_7">Ptr</a> /= Null_Ptr <b>then</b>
+         <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.Strings.Free (<a href="terminal_interface-curses-menus__adb.htm#ref_116_7">Ptr</a>);
+      <b>end</b> <b>if</b>;
+      <a href="terminal_interface-curses-menus__adb.htm#ref_116_7">Ptr</a> := <a href="terminal_interface-curses-menus__adb.htm#ref_110_16">Itemname</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_202_22">Itm</a>);
+      <b>if</b> <a href="terminal_interface-curses-menus__adb.htm#ref_116_7">Ptr</a> /= Null_Ptr <b>then</b>
+         <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.Strings.Free (<a href="terminal_interface-curses-menus__adb.htm#ref_116_7">Ptr</a>);
+      <b>end</b> <b>if</b>;
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_113_16">Freeitem</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_202_22">Itm</a>));
+      <a href="terminal_interface-curses-menus__ads.htm#ref_202_22">Itm</a> := <a href="terminal_interface-curses-menus__ads.htm#ref_58_4">Null_Item</a>;
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_202_14">Delete</a>;
+<span class="comment"><em>-------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_130_14" href="terminal_interface-curses-menus__ads.htm#ref_211_14">Set_Value</a></span> (<span class="symbol"><a name="ref_130_25" href="terminal_interface-curses-menus__ads.htm#ref_211_25">Itm</a></span>   : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>;
+                        <span class="symbol"><a name="ref_131_25" href="terminal_interface-curses-menus__ads.htm#ref_212_25">Value</a></span> : Boolean := True)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_133_16">Set_Item_Val</a></span> (<span class="symbol"><a name="ref_133_30">Itm</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>;
+                             <span class="symbol"><a name="ref_134_30">Val</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Item_Val, "set_item_value");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_133_16">Set_Item_Val</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_211_25">Itm</a>, Boolean'Pos (<a href="terminal_interface-curses-menus__ads.htm#ref_212_25">Value</a>)));
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_211_14">Set_Value</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_141_13" href="terminal_interface-curses-menus__ads.htm#ref_217_13">Value</a></span> (<span class="symbol"><a name="ref_141_20" href="terminal_interface-curses-menus__ads.htm#ref_217_20">Itm</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>) <b>return</b> Boolean
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_143_16">Item_Val</a></span> (<span class="symbol"><a name="ref_143_26">Itm</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Item_Val, "item_value");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-menus__adb.htm#ref_143_16">Item_Val</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_217_20">Itm</a>) = <a href="terminal_interface-curses-aux__ads.htm#ref_67_4">Curses_False</a> <b>then</b>
+         <b>return</b> False;
+      <b>else</b>
+         <b>return</b> True;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_217_13">Value</a>;
+
+<span class="comment"><em>-------------------------------------------------------------------------------</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_154_13" href="terminal_interface-curses-menus__ads.htm#ref_226_13">Visible</a></span> (<span class="symbol"><a name="ref_154_22" href="terminal_interface-curses-menus__ads.htm#ref_226_22">Itm</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>) <b>return</b> Boolean
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_156_16">Item_Vis</a></span> (<span class="symbol"><a name="ref_156_26">Itm</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Item_Vis, "item_visible");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-menus__adb.htm#ref_156_16">Item_Vis</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_226_22">Itm</a>) = <a href="terminal_interface-curses-aux__ads.htm#ref_67_4">Curses_False</a> <b>then</b>
+         <b>return</b> False;
+      <b>else</b>
+         <b>return</b> True;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_226_13">Visible</a>;
+<span class="comment"><em>-------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_166_14" href="terminal_interface-curses-menus__ads.htm#ref_235_14">Set_Options</a></span> (<span class="symbol"><a name="ref_166_27" href="terminal_interface-curses-menus__ads.htm#ref_235_27">Itm</a></span>     : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>;
+                          <span class="symbol"><a name="ref_167_27" href="terminal_interface-curses-menus__ads.htm#ref_236_27">Options</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_152_9">Item_Option_Set</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_169_16">Set_Item_Opts</a></span> (<span class="symbol"><a name="ref_169_31">Itm</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>;
+                              <span class="symbol"><a name="ref_170_31">Opt</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_152_9">Item_Option_Set</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Item_Opts, "set_item_opts");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_169_16">Set_Item_Opts</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_235_27">Itm</a>, <a href="terminal_interface-curses-menus__ads.htm#ref_236_27">Options</a>));
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_235_14">Set_Options</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_177_14" href="terminal_interface-curses-menus__ads.htm#ref_241_14">Switch_Options</a></span> (<span class="symbol"><a name="ref_177_30" href="terminal_interface-curses-menus__ads.htm#ref_241_30">Itm</a></span>     : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>;
+                             <span class="symbol"><a name="ref_178_30" href="terminal_interface-curses-menus__ads.htm#ref_242_30">Options</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_152_9">Item_Option_Set</a>;
+                             <span class="symbol"><a name="ref_179_30" href="terminal_interface-curses-menus__ads.htm#ref_243_30">On</a></span>      : Boolean := True)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_181_16">Item_Opts_On</a></span> (<span class="symbol"><a name="ref_181_30">Itm</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>;
+                             <span class="symbol"><a name="ref_182_30">Opt</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_152_9">Item_Option_Set</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Item_Opts_On, "item_opts_on");
+      <b>function</b> <span class="symbol"><a name="ref_184_16">Item_Opts_Off</a></span> (<span class="symbol"><a name="ref_184_31">Itm</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>;
+                              <span class="symbol"><a name="ref_185_31">Opt</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_152_9">Item_Option_Set</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Item_Opts_Off, "item_opts_off");
+
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-menus__ads.htm#ref_243_30">On</a> <b>then</b>
+         <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_181_16">Item_Opts_On</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_241_30">Itm</a>, <a href="terminal_interface-curses-menus__ads.htm#ref_242_30">Options</a>));
+      <b>else</b>
+         <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_184_16">Item_Opts_Off</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_241_30">Itm</a>, <a href="terminal_interface-curses-menus__ads.htm#ref_242_30">Options</a>));
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_241_14">Switch_Options</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_196_14" href="terminal_interface-curses-menus__ads.htm#ref_250_14">Get_Options</a></span> (<span class="symbol"><a name="ref_196_27" href="terminal_interface-curses-menus__ads.htm#ref_250_27">Itm</a></span>     : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>;
+                          <span class="symbol"><a name="ref_197_27" href="terminal_interface-curses-menus__ads.htm#ref_251_27">Options</a></span> : <b>out</b> <a href="terminal_interface-curses-menus__ads.htm#ref_152_9">Item_Option_Set</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_199_16">Item_Opts</a></span> (<span class="symbol"><a name="ref_199_27">Itm</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>) <b>return</b> <a href="terminal_interface-curses-menus__ads.htm#ref_152_9">Item_Option_Set</a>;
+      <b>pragma</b> Import (C, Item_Opts, "item_opts");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-menus__ads.htm#ref_251_27">Options</a> := <a href="terminal_interface-curses-menus__adb.htm#ref_199_16">Item_Opts</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_250_27">Itm</a>);
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_250_14">Get_Options</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_206_13" href="terminal_interface-curses-menus__ads.htm#ref_255_13">Get_Options</a></span> (<span class="symbol"><a name="ref_206_26" href="terminal_interface-curses-menus__ads.htm#ref_255_26">Itm</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a> := <a href="terminal_interface-curses-menus__ads.htm#ref_58_4">Null_Item</a>) <b>return</b> <a href="terminal_interface-curses-menus__ads.htm#ref_152_9">Item_Option_Set</a>
+   <b>is</b>
+      <span class="symbol"><a name="ref_208_7">Ios</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_152_9">Item_Option_Set</a>;
+   <b>begin</b>
+      <a href="terminal_interface-curses-menus__ads.htm#ref_250_14">Get_Options</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_255_26">Itm</a>, <a href="terminal_interface-curses-menus__adb.htm#ref_208_7">Ios</a>);
+      <b>return</b> <a href="terminal_interface-curses-menus__adb.htm#ref_208_7">Ios</a>;
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_255_13">Get_Options</a>;
+<span class="comment"><em>-------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_214_14" href="terminal_interface-curses-menus__ads.htm#ref_264_14">Name</a></span> (<span class="symbol"><a name="ref_214_20" href="terminal_interface-curses-menus__ads.htm#ref_264_20">Itm</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>;
+                   <span class="symbol"><a name="ref_215_20" href="terminal_interface-curses-menus__ads.htm#ref_265_20">Name</a></span> : <b>out</b> String)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_217_16">Itemname</a></span> (<span class="symbol"><a name="ref_217_26">Itm</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>) <b>return</b> <a href="terminal_interface-curses-menus__adb.htm#ref_56_12">chars_ptr</a>;
+      <b>pragma</b> Import (C, Itemname, "item_name");
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_91_14">Fill_String</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_217_16">Itemname</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_264_20">Itm</a>), <a href="terminal_interface-curses-menus__ads.htm#ref_265_20">Name</a>);
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_264_14">Name</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_223_13" href="terminal_interface-curses-menus__ads.htm#ref_267_14">Name</a></span> (<span class="symbol"><a name="ref_223_19" href="terminal_interface-curses-menus__ads.htm#ref_267_20">Itm</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>) <b>return</b> String
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_225_16">Itemname</a></span> (<span class="symbol"><a name="ref_225_26">Itm</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>) <b>return</b> <a href="terminal_interface-curses-menus__adb.htm#ref_56_12">chars_ptr</a>;
+      <b>pragma</b> Import (C, Itemname, "item_name");
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_96_13">Fill_String</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_225_16">Itemname</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_267_20">Itm</a>));
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_267_14">Name</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_231_14" href="terminal_interface-curses-menus__ads.htm#ref_273_14">Description</a></span> (<span class="symbol"><a name="ref_231_27" href="terminal_interface-curses-menus__ads.htm#ref_273_27">Itm</a></span>         : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>;
+                          <span class="symbol"><a name="ref_232_27" href="terminal_interface-curses-menus__ads.htm#ref_274_27">Description</a></span> : <b>out</b> String)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_234_16">Descname</a></span> (<span class="symbol"><a name="ref_234_26">Itm</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>) <b>return</b> <a href="terminal_interface-curses-menus__adb.htm#ref_56_12">chars_ptr</a>;
+      <b>pragma</b> Import (C, Descname, "item_description");
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_91_14">Fill_String</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_234_16">Descname</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_273_27">Itm</a>), <a href="terminal_interface-curses-menus__ads.htm#ref_274_27">Description</a>);
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_273_14">Description</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_240_13" href="terminal_interface-curses-menus__ads.htm#ref_277_14">Description</a></span> (<span class="symbol"><a name="ref_240_26" href="terminal_interface-curses-menus__ads.htm#ref_277_27">Itm</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>) <b>return</b> String
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_242_16">Descname</a></span> (<span class="symbol"><a name="ref_242_26">Itm</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>) <b>return</b> <a href="terminal_interface-curses-menus__adb.htm#ref_56_12">chars_ptr</a>;
+      <b>pragma</b> Import (C, Descname, "item_description");
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_96_13">Fill_String</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_242_16">Descname</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_277_27">Itm</a>));
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_277_14">Description</a>;
+<span class="comment"><em>-------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_248_14" href="terminal_interface-curses-menus__ads.htm#ref_287_14">Set_Current</a></span> (<span class="symbol"><a name="ref_248_27" href="terminal_interface-curses-menus__ads.htm#ref_287_27">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                          <span class="symbol"><a name="ref_249_27" href="terminal_interface-curses-menus__ads.htm#ref_288_27">Itm</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_251_16">Set_Curr_Item</a></span> (<span class="symbol"><a name="ref_251_31">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                              <span class="symbol"><a name="ref_252_31">Itm</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Curr_Item, "set_current_item");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_251_16">Set_Curr_Item</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_287_27">Men</a>, <a href="terminal_interface-curses-menus__ads.htm#ref_288_27">Itm</a>));
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_287_14">Set_Current</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_259_13" href="terminal_interface-curses-menus__ads.htm#ref_293_13">Current</a></span> (<span class="symbol"><a name="ref_259_22" href="terminal_interface-curses-menus__ads.htm#ref_293_22">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_261_16">Curr_Item</a></span> (<span class="symbol"><a name="ref_261_27">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>;
+      <b>pragma</b> Import (C, Curr_Item, "current_item");
+
+      <span class="symbol"><a name="ref_264_7">Res</a></span> : <b>constant</b> <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a> := <a href="terminal_interface-curses-menus__adb.htm#ref_261_16">Curr_Item</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_293_22">Men</a>);
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-menus__adb.htm#ref_264_7">Res</a> = <a href="terminal_interface-curses-menus__ads.htm#ref_58_4">Null_Item</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses-menus__ads.htm#ref_112_4">Menu_Exception</a>;
+      <b>end</b> <b>if</b>;
+      <b>return</b> <a href="terminal_interface-curses-menus__adb.htm#ref_264_7">Res</a>;
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_293_13">Current</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_272_14" href="terminal_interface-curses-menus__ads.htm#ref_298_14">Set_Top_Row</a></span> (<span class="symbol"><a name="ref_272_27" href="terminal_interface-curses-menus__ads.htm#ref_298_27">Men</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                          <span class="symbol"><a name="ref_273_27" href="terminal_interface-curses-menus__ads.htm#ref_299_27">Line</a></span> : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_275_16">Set_Toprow</a></span> (<span class="symbol"><a name="ref_275_28">Men</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                           <span class="symbol"><a name="ref_276_28">Line</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Toprow, "set_top_row");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_275_16">Set_Toprow</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_298_27">Men</a>, <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_299_27">Line</a>)));
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_298_14">Set_Top_Row</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_283_13" href="terminal_interface-curses-menus__ads.htm#ref_304_13">Top_Row</a></span> (<span class="symbol"><a name="ref_283_22" href="terminal_interface-curses-menus__ads.htm#ref_304_22">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_285_16">Toprow</a></span> (<span class="symbol"><a name="ref_285_24">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Toprow, "top_row");
+
+      <span class="symbol"><a name="ref_288_7">Res</a></span> : <b>constant</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> := <a href="terminal_interface-curses-menus__adb.htm#ref_285_16">Toprow</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_304_22">Men</a>);
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-menus__adb.htm#ref_288_7">Res</a> = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses-menus__ads.htm#ref_112_4">Menu_Exception</a>;
+      <b>end</b> <b>if</b>;
+      <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_288_7">Res</a>);
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_304_13">Top_Row</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_296_13" href="terminal_interface-curses-menus__ads.htm#ref_309_13">Get_Index</a></span> (<span class="symbol"><a name="ref_296_24" href="terminal_interface-curses-menus__ads.htm#ref_309_24">Itm</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>) <b>return</b> Positive
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_298_16">Get_Itemindex</a></span> (<span class="symbol"><a name="ref_298_31">Itm</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Get_Itemindex, "item_index");
+
+      <span class="symbol"><a name="ref_301_7">Res</a></span> : <b>constant</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> := <a href="terminal_interface-curses-menus__adb.htm#ref_298_16">Get_Itemindex</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_309_24">Itm</a>);
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-menus__adb.htm#ref_301_7">Res</a> = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses-menus__ads.htm#ref_112_4">Menu_Exception</a>;
+      <b>end</b> <b>if</b>;
+      <b>return</b> Positive (Natural (<a href="terminal_interface-curses-menus__adb.htm#ref_301_7">Res</a>) + Positive'First);
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_309_13">Get_Index</a>;
+<span class="comment"><em>-------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_309_14" href="terminal_interface-curses-menus__ads.htm#ref_321_14">Post</a></span> (<span class="symbol"><a name="ref_309_20" href="terminal_interface-curses-menus__ads.htm#ref_321_20">Men</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                   <span class="symbol"><a name="ref_310_20" href="terminal_interface-curses-menus__ads.htm#ref_322_20">Post</a></span> : Boolean := True)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_312_16">M_Post</a></span> (<span class="symbol"><a name="ref_312_24">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, M_Post, "post_menu");
+      <b>function</b> <span class="symbol"><a name="ref_314_16">M_Unpost</a></span> (<span class="symbol"><a name="ref_314_26">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, M_Unpost, "unpost_menu");
+
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-menus__ads.htm#ref_322_20">Post</a> <b>then</b>
+         <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_312_16">M_Post</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_321_20">Men</a>));
+      <b>else</b>
+         <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_314_16">M_Unpost</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_321_20">Men</a>));
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_321_14">Post</a>;
+<span class="comment"><em>-------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_325_14" href="terminal_interface-curses-menus__ads.htm#ref_332_14">Set_Options</a></span> (<span class="symbol"><a name="ref_325_27" href="terminal_interface-curses-menus__ads.htm#ref_332_27">Men</a></span>     : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                          <span class="symbol"><a name="ref_326_27" href="terminal_interface-curses-menus__ads.htm#ref_333_27">Options</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_116_9">Menu_Option_Set</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_328_16">Set_Menu_Opts</a></span> (<span class="symbol"><a name="ref_328_31">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                              <span class="symbol"><a name="ref_329_31">Opt</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_116_9">Menu_Option_Set</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Menu_Opts, "set_menu_opts");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_328_16">Set_Menu_Opts</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_332_27">Men</a>, <a href="terminal_interface-curses-menus__ads.htm#ref_333_27">Options</a>));
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_332_14">Set_Options</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_336_14" href="terminal_interface-curses-menus__ads.htm#ref_338_14">Switch_Options</a></span> (<span class="symbol"><a name="ref_336_30" href="terminal_interface-curses-menus__ads.htm#ref_338_30">Men</a></span>     : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                             <span class="symbol"><a name="ref_337_30" href="terminal_interface-curses-menus__ads.htm#ref_339_30">Options</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_116_9">Menu_Option_Set</a>;
+                             <span class="symbol"><a name="ref_338_30" href="terminal_interface-curses-menus__ads.htm#ref_340_30">On</a></span>      : Boolean := True)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_340_16">Menu_Opts_On</a></span> (<span class="symbol"><a name="ref_340_30">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                             <span class="symbol"><a name="ref_341_30">Opt</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_116_9">Menu_Option_Set</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Menu_Opts_On, "menu_opts_on");
+      <b>function</b> <span class="symbol"><a name="ref_343_16">Menu_Opts_Off</a></span> (<span class="symbol"><a name="ref_343_31">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                              <span class="symbol"><a name="ref_344_31">Opt</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_116_9">Menu_Option_Set</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Menu_Opts_Off, "menu_opts_off");
+
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-menus__ads.htm#ref_340_30">On</a> <b>then</b>
+         <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_340_16">Menu_Opts_On</a>  (<a href="terminal_interface-curses-menus__ads.htm#ref_338_30">Men</a>, <a href="terminal_interface-curses-menus__ads.htm#ref_339_30">Options</a>));
+      <b>else</b>
+         <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_343_16">Menu_Opts_Off</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_338_30">Men</a>, <a href="terminal_interface-curses-menus__ads.htm#ref_339_30">Options</a>));
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_338_14">Switch_Options</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_355_14" href="terminal_interface-curses-menus__ads.htm#ref_346_14">Get_Options</a></span> (<span class="symbol"><a name="ref_355_27" href="terminal_interface-curses-menus__ads.htm#ref_346_27">Men</a></span>     : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                          <span class="symbol"><a name="ref_356_27" href="terminal_interface-curses-menus__ads.htm#ref_347_27">Options</a></span> : <b>out</b> <a href="terminal_interface-curses-menus__ads.htm#ref_116_9">Menu_Option_Set</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_358_16">Menu_Opts</a></span> (<span class="symbol"><a name="ref_358_27">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> <a href="terminal_interface-curses-menus__ads.htm#ref_116_9">Menu_Option_Set</a>;
+      <b>pragma</b> Import (C, Menu_Opts, "menu_opts");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-menus__ads.htm#ref_347_27">Options</a> := <a href="terminal_interface-curses-menus__adb.htm#ref_358_16">Menu_Opts</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_346_27">Men</a>);
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_346_14">Get_Options</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_365_13" href="terminal_interface-curses-menus__ads.htm#ref_351_13">Get_Options</a></span> (<span class="symbol"><a name="ref_365_26" href="terminal_interface-curses-menus__ads.htm#ref_351_26">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a> := <a href="terminal_interface-curses-menus__ads.htm#ref_59_4">Null_Menu</a>) <b>return</b> <a href="terminal_interface-curses-menus__ads.htm#ref_116_9">Menu_Option_Set</a>
+   <b>is</b>
+      <span class="symbol"><a name="ref_367_7">Mos</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_116_9">Menu_Option_Set</a>;
+   <b>begin</b>
+      <a href="terminal_interface-curses-menus__ads.htm#ref_346_14">Get_Options</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_351_26">Men</a>, <a href="terminal_interface-curses-menus__adb.htm#ref_367_7">Mos</a>);
+      <b>return</b> <a href="terminal_interface-curses-menus__adb.htm#ref_367_7">Mos</a>;
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_351_13">Get_Options</a>;
+<span class="comment"><em>-------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_373_14" href="terminal_interface-curses-menus__ads.htm#ref_360_14">Set_Window</a></span> (<span class="symbol"><a name="ref_373_26" href="terminal_interface-curses-menus__ads.htm#ref_360_26">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                         <span class="symbol"><a name="ref_374_26" href="terminal_interface-curses-menus__ads.htm#ref_361_26">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_376_16">Set_Menu_Win</a></span> (<span class="symbol"><a name="ref_376_30">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                             <span class="symbol"><a name="ref_377_30">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Menu_Win, "set_menu_win");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_376_16">Set_Menu_Win</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_360_26">Men</a>, <a href="terminal_interface-curses-menus__ads.htm#ref_361_26">Win</a>));
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_360_14">Set_Window</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_384_13" href="terminal_interface-curses-menus__ads.htm#ref_366_13">Get_Window</a></span> (<span class="symbol"><a name="ref_384_25" href="terminal_interface-curses-menus__ads.htm#ref_366_25">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_386_16">Menu_Win</a></span> (<span class="symbol"><a name="ref_386_26">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <b>pragma</b> Import (C, Menu_Win, "menu_win");
+
+      <span class="symbol"><a name="ref_389_7">W</a></span> : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses-menus__adb.htm#ref_386_16">Menu_Win</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_366_25">Men</a>);
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses-menus__adb.htm#ref_389_7">W</a>;
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_366_13">Get_Window</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_394_14" href="terminal_interface-curses-menus__ads.htm#ref_371_14">Set_Sub_Window</a></span> (<span class="symbol"><a name="ref_394_30" href="terminal_interface-curses-menus__ads.htm#ref_371_30">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                             <span class="symbol"><a name="ref_395_30" href="terminal_interface-curses-menus__ads.htm#ref_372_30">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_397_16">Set_Menu_Sub</a></span> (<span class="symbol"><a name="ref_397_30">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                             <span class="symbol"><a name="ref_398_30">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Menu_Sub, "set_menu_sub");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_397_16">Set_Menu_Sub</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_371_30">Men</a>, <a href="terminal_interface-curses-menus__ads.htm#ref_372_30">Win</a>));
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_371_14">Set_Sub_Window</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_405_13" href="terminal_interface-curses-menus__ads.htm#ref_377_13">Get_Sub_Window</a></span> (<span class="symbol"><a name="ref_405_29" href="terminal_interface-curses-menus__ads.htm#ref_377_29">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_407_16">Menu_Sub</a></span> (<span class="symbol"><a name="ref_407_26">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <b>pragma</b> Import (C, Menu_Sub, "menu_sub");
+
+      <span class="symbol"><a name="ref_410_7">W</a></span> : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses-menus__adb.htm#ref_407_16">Menu_Sub</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_377_29">Men</a>);
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses-menus__adb.htm#ref_410_7">W</a>;
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_377_13">Get_Sub_Window</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_415_14" href="terminal_interface-curses-menus__ads.htm#ref_382_14">Scale</a></span> (<span class="symbol"><a name="ref_415_21" href="terminal_interface-curses-menus__ads.htm#ref_382_21">Men</a></span>     : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                    <span class="symbol"><a name="ref_416_21" href="terminal_interface-curses-menus__ads.htm#ref_383_21">Lines</a></span>   : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a>;
+                    <span class="symbol"><a name="ref_417_21" href="terminal_interface-curses-menus__ads.htm#ref_384_21">Columns</a></span> : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a>)
+   <b>is</b>
+      <b>type</b> <span class="symbol"><a name="ref_419_12">C_Int_Access</a></span> <b>is</b> <b>access</b> <b>all</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>function</b> <span class="symbol"><a name="ref_420_16">M_Scale</a></span> (<span class="symbol"><a name="ref_420_25">Men</a></span>    : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                        <span class="symbol"><a name="ref_421_25">Yp</a></span>, <span class="symbol"><a name="ref_421_29">Xp</a></span> : <a href="terminal_interface-curses-menus__adb.htm#ref_419_12">C_Int_Access</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, M_Scale, "scale_menu");
+
+      <span class="symbol"><a name="ref_424_7">X</a></span>, <span class="symbol"><a name="ref_424_10">Y</a></span> : <b>aliased</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_420_16">M_Scale</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_382_21">Men</a>, <a href="terminal_interface-curses-menus__adb.htm#ref_424_10">Y</a>'<b>Access</b>, <a href="terminal_interface-curses-menus__adb.htm#ref_424_7">X</a>'<b>Access</b>));
+      <a href="terminal_interface-curses-menus__ads.htm#ref_383_21">Lines</a> := <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_424_10">Y</a>);
+      <a href="terminal_interface-curses-menus__ads.htm#ref_384_21">Columns</a> := <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_424_7">X</a>);
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_382_14">Scale</a>;
+<span class="comment"><em>-------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_431_14" href="terminal_interface-curses-menus__ads.htm#ref_393_14">Position_Cursor</a></span> (<span class="symbol"><a name="ref_431_31" href="terminal_interface-curses-menus__ads.htm#ref_393_31">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_433_16">Pos_Menu_Cursor</a></span> (<span class="symbol"><a name="ref_433_33">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Pos_Menu_Cursor, "pos_menu_cursor");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_433_16">Pos_Menu_Cursor</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_393_31">Men</a>));
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_393_14">Position_Cursor</a>;
+
+<span class="comment"><em>-------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_441_14" href="terminal_interface-curses-menus__ads.htm#ref_402_14">Set_Mark</a></span> (<span class="symbol"><a name="ref_441_24" href="terminal_interface-curses-menus__ads.htm#ref_402_24">Men</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                       <span class="symbol"><a name="ref_442_24" href="terminal_interface-curses-menus__ads.htm#ref_403_24">Mark</a></span> : String)
+   <b>is</b>
+      <b>type</b> <span class="symbol"><a name="ref_444_12">Char_Ptr</a></span> <b>is</b> <b>access</b> <b>all</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.char;
+      <b>function</b> <span class="symbol"><a name="ref_445_16">Set_Mark</a></span> (<span class="symbol"><a name="ref_445_26">Men</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                         <span class="symbol"><a name="ref_446_26">Mark</a></span> : <a href="terminal_interface-curses-menus__adb.htm#ref_444_12">Char_Ptr</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Mark, "set_menu_mark");
+
+      <span class="symbol"><a name="ref_449_7">Txt</a></span> : char_array (0 .. <a href="terminal_interface-curses-menus__ads.htm#ref_403_24">Mark</a>'Length);
+      <span class="symbol"><a name="ref_450_7">Len</a></span> : size_t;
+   <b>begin</b>
+      To_C (<a href="terminal_interface-curses-menus__ads.htm#ref_403_24">Mark</a>, <a href="terminal_interface-curses-menus__adb.htm#ref_449_7">Txt</a>, <a href="terminal_interface-curses-menus__adb.htm#ref_450_7">Len</a>);
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_445_16">Set_Mark</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_402_24">Men</a>, <a href="terminal_interface-curses-menus__adb.htm#ref_449_7">Txt</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_449_7">Txt</a>'First)'<b>Access</b>));
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_402_14">Set_Mark</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_456_14" href="terminal_interface-curses-menus__ads.htm#ref_408_14">Mark</a></span> (<span class="symbol"><a name="ref_456_20" href="terminal_interface-curses-menus__ads.htm#ref_408_20">Men</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                   <span class="symbol"><a name="ref_457_20" href="terminal_interface-curses-menus__ads.htm#ref_409_20">Mark</a></span> : <b>out</b> String)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_459_16">Get_Menu_Mark</a></span> (<span class="symbol"><a name="ref_459_31">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> <a href="terminal_interface-curses-menus__adb.htm#ref_56_12">chars_ptr</a>;
+      <b>pragma</b> Import (C, Get_Menu_Mark, "menu_mark");
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_91_14">Fill_String</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_459_16">Get_Menu_Mark</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_408_20">Men</a>), <a href="terminal_interface-curses-menus__ads.htm#ref_409_20">Mark</a>);
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_408_14">Mark</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_465_13" href="terminal_interface-curses-menus__ads.htm#ref_412_14">Mark</a></span> (<span class="symbol"><a name="ref_465_19" href="terminal_interface-curses-menus__ads.htm#ref_412_20">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> String
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_467_16">Get_Menu_Mark</a></span> (<span class="symbol"><a name="ref_467_31">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> <a href="terminal_interface-curses-menus__adb.htm#ref_56_12">chars_ptr</a>;
+      <b>pragma</b> Import (C, Get_Menu_Mark, "menu_mark");
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_96_13">Fill_String</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_467_16">Get_Menu_Mark</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_412_20">Men</a>));
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_412_14">Mark</a>;
+
+<span class="comment"><em>-------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_474_14" href="terminal_interface-curses-menus__ads.htm#ref_422_14">Set_Foreground</a></span>
+     (<span class="symbol"><a name="ref_475_7" href="terminal_interface-curses-menus__ads.htm#ref_423_7">Men</a></span>   : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+      <span class="symbol"><a name="ref_476_7" href="terminal_interface-curses-menus__ads.htm#ref_424_7">Fore</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a> := <a href="terminal_interface-curses__ads.htm#ref_486_4">Normal_Video</a>;
+      <span class="symbol"><a name="ref_477_7" href="terminal_interface-curses-menus__ads.htm#ref_425_7">Color</a></span> : <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a> := <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>'First)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_479_16">Set_Menu_Fore</a></span> (<span class="symbol"><a name="ref_479_31">Men</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                              <span class="symbol"><a name="ref_480_31">Attr</a></span> : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Menu_Fore, "set_menu_fore");
+
+      <span class="symbol"><a name="ref_483_7">Ch</a></span> : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a> := (<a href="terminal_interface-curses__ads.htm#ref_492_10">Ch</a>    =&gt; Character'First,
+                                             <a href="terminal_interface-curses__ads.htm#ref_491_10">Color</a> =&gt; <a href="terminal_interface-curses-menus__ads.htm#ref_425_7">Color</a>,
+                                             <a href="terminal_interface-curses__ads.htm#ref_490_10">Attr</a>  =&gt; <a href="terminal_interface-curses-menus__ads.htm#ref_424_7">Fore</a>);
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_479_16">Set_Menu_Fore</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_423_7">Men</a>, <a href="terminal_interface-curses-menus__adb.htm#ref_483_7">Ch</a>));
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_422_14">Set_Foreground</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_490_14" href="terminal_interface-curses-menus__ads.htm#ref_430_14">Foreground</a></span> (<span class="symbol"><a name="ref_490_26" href="terminal_interface-curses-menus__ads.htm#ref_430_26">Men</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                         <span class="symbol"><a name="ref_491_26" href="terminal_interface-curses-menus__ads.htm#ref_431_26">Fore</a></span> : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_493_16">Menu_Fore</a></span> (<span class="symbol"><a name="ref_493_27">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>;
+      <b>pragma</b> Import (C, Menu_Fore, "menu_fore");
+   <b>begin</b>
+      <a href="terminal_interface-curses-menus__ads.htm#ref_431_26">Fore</a> := <a href="terminal_interface-curses-menus__adb.htm#ref_493_16">Menu_Fore</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_430_26">Men</a>).<a href="terminal_interface-curses__ads.htm#ref_490_10">Attr</a>;
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_430_14">Foreground</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_499_14" href="terminal_interface-curses-menus__ads.htm#ref_435_14">Foreground</a></span> (<span class="symbol"><a name="ref_499_26" href="terminal_interface-curses-menus__ads.htm#ref_435_26">Men</a></span>   : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                         <span class="symbol"><a name="ref_500_26" href="terminal_interface-curses-menus__ads.htm#ref_436_26">Fore</a></span>  : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a>;
+                         <span class="symbol"><a name="ref_501_26" href="terminal_interface-curses-menus__ads.htm#ref_437_26">Color</a></span> : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_503_16">Menu_Fore</a></span> (<span class="symbol"><a name="ref_503_27">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>;
+      <b>pragma</b> Import (C, Menu_Fore, "menu_fore");
+   <b>begin</b>
+      <a href="terminal_interface-curses-menus__ads.htm#ref_436_26">Fore</a>  := <a href="terminal_interface-curses-menus__adb.htm#ref_503_16">Menu_Fore</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_435_26">Men</a>).<a href="terminal_interface-curses__ads.htm#ref_490_10">Attr</a>;
+      <a href="terminal_interface-curses-menus__ads.htm#ref_437_26">Color</a> := <a href="terminal_interface-curses-menus__adb.htm#ref_503_16">Menu_Fore</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_435_26">Men</a>).<a href="terminal_interface-curses__ads.htm#ref_491_10">Color</a>;
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_435_14">Foreground</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_510_14" href="terminal_interface-curses-menus__ads.htm#ref_442_14">Set_Background</a></span>
+     (<span class="symbol"><a name="ref_511_7" href="terminal_interface-curses-menus__ads.htm#ref_443_7">Men</a></span>   : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+      <span class="symbol"><a name="ref_512_7" href="terminal_interface-curses-menus__ads.htm#ref_444_7">Back</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a> := <a href="terminal_interface-curses__ads.htm#ref_486_4">Normal_Video</a>;
+      <span class="symbol"><a name="ref_513_7" href="terminal_interface-curses-menus__ads.htm#ref_445_7">Color</a></span> : <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a> := <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>'First)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_515_16">Set_Menu_Back</a></span> (<span class="symbol"><a name="ref_515_31">Men</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                              <span class="symbol"><a name="ref_516_31">Attr</a></span> : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Menu_Back, "set_menu_back");
+
+      <span class="symbol"><a name="ref_519_7">Ch</a></span> : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a> := (<a href="terminal_interface-curses__ads.htm#ref_492_10">Ch</a>    =&gt; Character'First,
+                                             <a href="terminal_interface-curses__ads.htm#ref_491_10">Color</a> =&gt; <a href="terminal_interface-curses-menus__ads.htm#ref_445_7">Color</a>,
+                                             <a href="terminal_interface-curses__ads.htm#ref_490_10">Attr</a>  =&gt; <a href="terminal_interface-curses-menus__ads.htm#ref_444_7">Back</a>);
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_515_16">Set_Menu_Back</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_443_7">Men</a>, <a href="terminal_interface-curses-menus__adb.htm#ref_519_7">Ch</a>));
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_442_14">Set_Background</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_526_14" href="terminal_interface-curses-menus__ads.htm#ref_450_14">Background</a></span> (<span class="symbol"><a name="ref_526_26" href="terminal_interface-curses-menus__ads.htm#ref_450_26">Men</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                         <span class="symbol"><a name="ref_527_26" href="terminal_interface-curses-menus__ads.htm#ref_451_26">Back</a></span> : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_529_16">Menu_Back</a></span> (<span class="symbol"><a name="ref_529_27">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>;
+      <b>pragma</b> Import (C, Menu_Back, "menu_back");
+   <b>begin</b>
+      <a href="terminal_interface-curses-menus__ads.htm#ref_451_26">Back</a> := <a href="terminal_interface-curses-menus__adb.htm#ref_529_16">Menu_Back</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_450_26">Men</a>).<a href="terminal_interface-curses__ads.htm#ref_490_10">Attr</a>;
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_450_14">Background</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_535_14" href="terminal_interface-curses-menus__ads.htm#ref_455_14">Background</a></span> (<span class="symbol"><a name="ref_535_26" href="terminal_interface-curses-menus__ads.htm#ref_455_26">Men</a></span>   : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                         <span class="symbol"><a name="ref_536_26" href="terminal_interface-curses-menus__ads.htm#ref_456_26">Back</a></span>  : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a>;
+                         <span class="symbol"><a name="ref_537_26" href="terminal_interface-curses-menus__ads.htm#ref_457_26">Color</a></span> : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_539_16">Menu_Back</a></span> (<span class="symbol"><a name="ref_539_27">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>;
+      <b>pragma</b> Import (C, Menu_Back, "menu_back");
+   <b>begin</b>
+      <a href="terminal_interface-curses-menus__ads.htm#ref_456_26">Back</a>  := <a href="terminal_interface-curses-menus__adb.htm#ref_539_16">Menu_Back</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_455_26">Men</a>).<a href="terminal_interface-curses__ads.htm#ref_490_10">Attr</a>;
+      <a href="terminal_interface-curses-menus__ads.htm#ref_457_26">Color</a> := <a href="terminal_interface-curses-menus__adb.htm#ref_539_16">Menu_Back</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_455_26">Men</a>).<a href="terminal_interface-curses__ads.htm#ref_491_10">Color</a>;
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_455_14">Background</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_546_14" href="terminal_interface-curses-menus__ads.htm#ref_462_14">Set_Grey</a></span> (<span class="symbol"><a name="ref_546_24" href="terminal_interface-curses-menus__ads.htm#ref_463_7">Men</a></span>   : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                       <span class="symbol"><a name="ref_547_24" href="terminal_interface-curses-menus__ads.htm#ref_464_7">Grey</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a> := <a href="terminal_interface-curses__ads.htm#ref_486_4">Normal_Video</a>;
+                       <span class="symbol"><a name="ref_548_24" href="terminal_interface-curses-menus__ads.htm#ref_465_7">Color</a></span> : <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a> := <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>'First)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_550_16">Set_Menu_Grey</a></span> (<span class="symbol"><a name="ref_550_31">Men</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                              <span class="symbol"><a name="ref_551_31">Attr</a></span> : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Menu_Grey, "set_menu_grey");
+
+      <span class="symbol"><a name="ref_554_7">Ch</a></span> : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a> := (<a href="terminal_interface-curses__ads.htm#ref_492_10">Ch</a>    =&gt; Character'First,
+                                             <a href="terminal_interface-curses__ads.htm#ref_491_10">Color</a> =&gt; <a href="terminal_interface-curses-menus__ads.htm#ref_465_7">Color</a>,
+                                             <a href="terminal_interface-curses__ads.htm#ref_490_10">Attr</a>  =&gt; <a href="terminal_interface-curses-menus__ads.htm#ref_464_7">Grey</a>);
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_550_16">Set_Menu_Grey</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_463_7">Men</a>, <a href="terminal_interface-curses-menus__adb.htm#ref_554_7">Ch</a>));
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_462_14">Set_Grey</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_562_14" href="terminal_interface-curses-menus__ads.htm#ref_470_14">Grey</a></span> (<span class="symbol"><a name="ref_562_20" href="terminal_interface-curses-menus__ads.htm#ref_470_20">Men</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                   <span class="symbol"><a name="ref_563_20" href="terminal_interface-curses-menus__ads.htm#ref_471_20">Grey</a></span> : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_565_16">Menu_Grey</a></span> (<span class="symbol"><a name="ref_565_27">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>;
+      <b>pragma</b> Import (C, Menu_Grey, "menu_grey");
+   <b>begin</b>
+      <a href="terminal_interface-curses-menus__ads.htm#ref_471_20">Grey</a> := <a href="terminal_interface-curses-menus__adb.htm#ref_565_16">Menu_Grey</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_470_20">Men</a>).<a href="terminal_interface-curses__ads.htm#ref_490_10">Attr</a>;
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_470_14">Grey</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_571_14" href="terminal_interface-curses-menus__ads.htm#ref_475_14">Grey</a></span> (<span class="symbol"><a name="ref_571_20" href="terminal_interface-curses-menus__ads.htm#ref_476_7">Men</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                   <span class="symbol"><a name="ref_572_20" href="terminal_interface-curses-menus__ads.htm#ref_477_7">Grey</a></span> : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a>;
+                   <span class="symbol"><a name="ref_573_20" href="terminal_interface-curses-menus__ads.htm#ref_478_7">Color</a></span> : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_575_16">Menu_Grey</a></span> (<span class="symbol"><a name="ref_575_27">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>;
+      <b>pragma</b> Import (C, Menu_Grey, "menu_grey");
+   <b>begin</b>
+      <a href="terminal_interface-curses-menus__ads.htm#ref_477_7">Grey</a>  := <a href="terminal_interface-curses-menus__adb.htm#ref_575_16">Menu_Grey</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_476_7">Men</a>).<a href="terminal_interface-curses__ads.htm#ref_490_10">Attr</a>;
+      <a href="terminal_interface-curses-menus__ads.htm#ref_478_7">Color</a> := <a href="terminal_interface-curses-menus__adb.htm#ref_575_16">Menu_Grey</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_476_7">Men</a>).<a href="terminal_interface-curses__ads.htm#ref_491_10">Color</a>;
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_475_14">Grey</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_582_14" href="terminal_interface-curses-menus__ads.htm#ref_483_14">Set_Pad_Character</a></span> (<span class="symbol"><a name="ref_582_33" href="terminal_interface-curses-menus__ads.htm#ref_483_33">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                                <span class="symbol"><a name="ref_583_33" href="terminal_interface-curses-menus__ads.htm#ref_484_33">Pad</a></span> : Character := Space)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_585_16">Set_Menu_Pad</a></span> (<span class="symbol"><a name="ref_585_30">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                             <span class="symbol"><a name="ref_586_30">Ch</a></span>  : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Menu_Pad, "set_menu_pad");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_585_16">Set_Menu_Pad</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_483_33">Men</a>, <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (Character'Pos (<a href="terminal_interface-curses-menus__ads.htm#ref_484_33">Pad</a>))));
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_483_14">Set_Pad_Character</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_593_14" href="terminal_interface-curses-menus__ads.htm#ref_489_14">Pad_Character</a></span> (<span class="symbol"><a name="ref_593_29" href="terminal_interface-curses-menus__ads.htm#ref_489_29">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                            <span class="symbol"><a name="ref_594_29" href="terminal_interface-curses-menus__ads.htm#ref_490_29">Pad</a></span> : <b>out</b> Character)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_596_16">Menu_Pad</a></span> (<span class="symbol"><a name="ref_596_26">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Menu_Pad, "menu_pad");
+   <b>begin</b>
+      <a href="terminal_interface-curses-menus__ads.htm#ref_490_29">Pad</a> := Character'Val (<a href="terminal_interface-curses-menus__adb.htm#ref_596_16">Menu_Pad</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_489_29">Men</a>));
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_489_14">Pad_Character</a>;
+<span class="comment"><em>-------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_602_14" href="terminal_interface-curses-menus__ads.htm#ref_499_14">Set_Spacing</a></span> (<span class="symbol"><a name="ref_602_27" href="terminal_interface-curses-menus__ads.htm#ref_499_27">Men</a></span>   : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                          <span class="symbol"><a name="ref_603_27" href="terminal_interface-curses-menus__ads.htm#ref_500_27">Descr</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a> := 0;
+                          <span class="symbol"><a name="ref_604_27" href="terminal_interface-curses-menus__ads.htm#ref_501_27">Row</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>   := 0;
+                          <span class="symbol"><a name="ref_605_27" href="terminal_interface-curses-menus__ads.htm#ref_502_27">Col</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a> := 0)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_607_16">Set_Spacing</a></span> (<span class="symbol"><a name="ref_607_29">Men</a></span>     : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                            <span class="symbol"><a name="ref_608_29">D</a></span>, <span class="symbol"><a name="ref_608_32">R</a></span>, <span class="symbol"><a name="ref_608_35">C</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Spacing, "set_menu_spacing");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_607_16">Set_Spacing</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_499_27">Men</a>,
+                                  <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_500_27">Descr</a>),
+                                  <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_501_27">Row</a>),
+                                  <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_502_27">Col</a>)));
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_499_14">Set_Spacing</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_618_14" href="terminal_interface-curses-menus__ads.htm#ref_507_14">Spacing</a></span> (<span class="symbol"><a name="ref_618_23" href="terminal_interface-curses-menus__ads.htm#ref_507_23">Men</a></span>   : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                      <span class="symbol"><a name="ref_619_23" href="terminal_interface-curses-menus__ads.htm#ref_508_23">Descr</a></span> : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+                      <span class="symbol"><a name="ref_620_23" href="terminal_interface-curses-menus__ads.htm#ref_509_23">Row</a></span>   : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+                      <span class="symbol"><a name="ref_621_23" href="terminal_interface-curses-menus__ads.htm#ref_510_23">Col</a></span>   : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>)
+   <b>is</b>
+      <b>type</b> <span class="symbol"><a name="ref_623_12">C_Int_Access</a></span> <b>is</b> <b>access</b> <b>all</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>function</b> <span class="symbol"><a name="ref_624_16">Get_Spacing</a></span> (<span class="symbol"><a name="ref_624_29">Men</a></span>     : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                            <span class="symbol"><a name="ref_625_29">D</a></span>, <span class="symbol"><a name="ref_625_32">R</a></span>, <span class="symbol"><a name="ref_625_35">C</a></span> : <a href="terminal_interface-curses-menus__adb.htm#ref_623_12">C_Int_Access</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Get_Spacing, "menu_spacing");
+
+      <span class="symbol"><a name="ref_628_7">D</a></span>, <span class="symbol"><a name="ref_628_10">R</a></span>, <span class="symbol"><a name="ref_628_13">C</a></span> : <b>aliased</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_624_16">Get_Spacing</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_507_23">Men</a>,
+                                  <a href="terminal_interface-curses-menus__adb.htm#ref_628_7">D</a>'<b>Access</b>,
+                                  <a href="terminal_interface-curses-menus__adb.htm#ref_628_10">R</a>'<b>Access</b>,
+                                  <a href="terminal_interface-curses-menus__adb.htm#ref_628_13">C</a>'<b>Access</b>));
+      <a href="terminal_interface-curses-menus__ads.htm#ref_508_23">Descr</a> := <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_628_7">D</a>);
+      <a href="terminal_interface-curses-menus__ads.htm#ref_509_23">Row</a>   := <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_628_10">R</a>);
+      <a href="terminal_interface-curses-menus__ads.htm#ref_510_23">Col</a>   := <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_628_13">C</a>);
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_507_14">Spacing</a>;
+<span class="comment"><em>-------------------------------------------------------------------------------</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_639_13" href="terminal_interface-curses-menus__ads.htm#ref_519_13">Set_Pattern</a></span> (<span class="symbol"><a name="ref_639_26" href="terminal_interface-curses-menus__ads.htm#ref_519_26">Men</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                         <span class="symbol"><a name="ref_640_26" href="terminal_interface-curses-menus__ads.htm#ref_520_26">Text</a></span> : String) <b>return</b> Boolean
+   <b>is</b>
+      <b>type</b> <span class="symbol"><a name="ref_642_12">Char_Ptr</a></span> <b>is</b> <b>access</b> <b>all</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.char;
+      <b>function</b> <span class="symbol"><a name="ref_643_16">Set_Pattern</a></span> (<span class="symbol"><a name="ref_643_29">Men</a></span>     : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                            <span class="symbol"><a name="ref_644_29">Pattern</a></span> : <a href="terminal_interface-curses-menus__adb.htm#ref_642_12">Char_Ptr</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Pattern, "set_menu_pattern");
+
+      <span class="symbol"><a name="ref_647_7">S</a></span>   : char_array (0 .. <a href="terminal_interface-curses-menus__ads.htm#ref_520_26">Text</a>'Length);
+      <span class="symbol"><a name="ref_648_7">L</a></span>   : size_t;
+      <span class="symbol"><a name="ref_649_7">Res</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+   <b>begin</b>
+      To_C (<a href="terminal_interface-curses-menus__ads.htm#ref_520_26">Text</a>, <a href="terminal_interface-curses-menus__adb.htm#ref_647_7">S</a>, <a href="terminal_interface-curses-menus__adb.htm#ref_648_7">L</a>);
+      <a href="terminal_interface-curses-menus__adb.htm#ref_649_7">Res</a> := <a href="terminal_interface-curses-menus__adb.htm#ref_643_16">Set_Pattern</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_519_26">Men</a>, <a href="terminal_interface-curses-menus__adb.htm#ref_647_7">S</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_647_7">S</a>'First)'<b>Access</b>);
+      <b>case</b> <a href="terminal_interface-curses-menus__adb.htm#ref_649_7">Res</a> <b>is</b>
+         <b>when</b> <a href="terminal_interface-curses-aux__ads.htm#ref_76_7">E_No_Match</a> =&gt;
+            <b>return</b> False;
+         <b>when</b> <b>others</b> =&gt;
+            <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_649_7">Res</a>);
+            <b>return</b> True;
+      <b>end</b> <b>case</b>;
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_519_13">Set_Pattern</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_662_14" href="terminal_interface-curses-menus__ads.htm#ref_526_14">Pattern</a></span> (<span class="symbol"><a name="ref_662_23" href="terminal_interface-curses-menus__ads.htm#ref_526_23">Men</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                      <span class="symbol"><a name="ref_663_23" href="terminal_interface-curses-menus__ads.htm#ref_527_23">Text</a></span> : <b>out</b> String)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_665_16">Get_Pattern</a></span> (<span class="symbol"><a name="ref_665_29">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> <a href="terminal_interface-curses-menus__adb.htm#ref_56_12">chars_ptr</a>;
+      <b>pragma</b> Import (C, Get_Pattern, "menu_pattern");
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_91_14">Fill_String</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_665_16">Get_Pattern</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_526_23">Men</a>), <a href="terminal_interface-curses-menus__ads.htm#ref_527_23">Text</a>);
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_526_14">Pattern</a>;
+<span class="comment"><em>-------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_671_14" href="terminal_interface-curses-menus__ads.htm#ref_536_14">Set_Format</a></span> (<span class="symbol"><a name="ref_671_26" href="terminal_interface-curses-menus__ads.htm#ref_536_26">Men</a></span>     : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                         <span class="symbol"><a name="ref_672_26" href="terminal_interface-curses-menus__ads.htm#ref_537_26">Lines</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a>;
+                         <span class="symbol"><a name="ref_673_26" href="terminal_interface-curses-menus__ads.htm#ref_538_26">Columns</a></span> : <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_675_16">Set_Menu_Fmt</a></span> (<span class="symbol"><a name="ref_675_30">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                             <span class="symbol"><a name="ref_676_30">Lin</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+                             <span class="symbol"><a name="ref_677_30">Col</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Menu_Fmt, "set_menu_format");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_675_16">Set_Menu_Fmt</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_536_26">Men</a>,
+                                   <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_537_26">Lines</a>),
+                                   <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_538_26">Columns</a>)));
+
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_536_14">Set_Format</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_687_14" href="terminal_interface-curses-menus__ads.htm#ref_550_14">Format</a></span> (<span class="symbol"><a name="ref_687_22" href="terminal_interface-curses-menus__ads.htm#ref_550_22">Men</a></span>     : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                     <span class="symbol"><a name="ref_688_22" href="terminal_interface-curses-menus__ads.htm#ref_551_22">Lines</a></span>   : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a>;
+                     <span class="symbol"><a name="ref_689_22" href="terminal_interface-curses-menus__ads.htm#ref_552_22">Columns</a></span> : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a>)
+   <b>is</b>
+      <b>type</b> <span class="symbol"><a name="ref_691_12">C_Int_Access</a></span> <b>is</b> <b>access</b> <b>all</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>function</b> <span class="symbol"><a name="ref_692_16">Menu_Fmt</a></span> (<span class="symbol"><a name="ref_692_26">Men</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                         <span class="symbol"><a name="ref_693_26">Y</a></span>, <span class="symbol"><a name="ref_693_29">X</a></span> : <a href="terminal_interface-curses-menus__adb.htm#ref_691_12">C_Int_Access</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Menu_Fmt, "menu_format");
+
+      <span class="symbol"><a name="ref_696_7">L</a></span>, <span class="symbol"><a name="ref_696_10">C</a></span> : <b>aliased</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_692_16">Menu_Fmt</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_550_22">Men</a>, <a href="terminal_interface-curses-menus__adb.htm#ref_696_7">L</a>'<b>Access</b>, <a href="terminal_interface-curses-menus__adb.htm#ref_696_10">C</a>'<b>Access</b>));
+      <a href="terminal_interface-curses-menus__ads.htm#ref_551_22">Lines</a>   := <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_696_7">L</a>);
+      <a href="terminal_interface-curses-menus__ads.htm#ref_552_22">Columns</a> := <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_696_10">C</a>);
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_550_14">Format</a>;
+<span class="comment"><em>-------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_703_14" href="terminal_interface-curses-menus__ads.htm#ref_564_14">Set_Item_Init_Hook</a></span> (<span class="symbol"><a name="ref_703_34" href="terminal_interface-curses-menus__ads.htm#ref_564_34">Men</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                                 <span class="symbol"><a name="ref_704_34" href="terminal_interface-curses-menus__ads.htm#ref_565_34">Proc</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_560_9">Menu_Hook_Function</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_706_16">Set_Item_Init</a></span> (<span class="symbol"><a name="ref_706_31">Men</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                              <span class="symbol"><a name="ref_707_31">Proc</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_560_9">Menu_Hook_Function</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Item_Init, "set_item_init");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_706_16">Set_Item_Init</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_564_34">Men</a>, <a href="terminal_interface-curses-menus__ads.htm#ref_565_34">Proc</a>));
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_564_14">Set_Item_Init_Hook</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_714_14" href="terminal_interface-curses-menus__ads.htm#ref_570_14">Set_Item_Term_Hook</a></span> (<span class="symbol"><a name="ref_714_34" href="terminal_interface-curses-menus__ads.htm#ref_570_34">Men</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                                 <span class="symbol"><a name="ref_715_34" href="terminal_interface-curses-menus__ads.htm#ref_571_34">Proc</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_560_9">Menu_Hook_Function</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_717_16">Set_Item_Term</a></span> (<span class="symbol"><a name="ref_717_31">Men</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                              <span class="symbol"><a name="ref_718_31">Proc</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_560_9">Menu_Hook_Function</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Item_Term, "set_item_term");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_717_16">Set_Item_Term</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_570_34">Men</a>, <a href="terminal_interface-curses-menus__ads.htm#ref_571_34">Proc</a>));
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_570_14">Set_Item_Term_Hook</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_725_14" href="terminal_interface-curses-menus__ads.htm#ref_576_14">Set_Menu_Init_Hook</a></span> (<span class="symbol"><a name="ref_725_34" href="terminal_interface-curses-menus__ads.htm#ref_576_34">Men</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                                 <span class="symbol"><a name="ref_726_34" href="terminal_interface-curses-menus__ads.htm#ref_577_34">Proc</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_560_9">Menu_Hook_Function</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_728_16">Set_Menu_Init</a></span> (<span class="symbol"><a name="ref_728_31">Men</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                              <span class="symbol"><a name="ref_729_31">Proc</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_560_9">Menu_Hook_Function</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Menu_Init, "set_menu_init");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_728_16">Set_Menu_Init</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_576_34">Men</a>, <a href="terminal_interface-curses-menus__ads.htm#ref_577_34">Proc</a>));
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_576_14">Set_Menu_Init_Hook</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_736_14" href="terminal_interface-curses-menus__ads.htm#ref_582_14">Set_Menu_Term_Hook</a></span> (<span class="symbol"><a name="ref_736_34" href="terminal_interface-curses-menus__ads.htm#ref_582_34">Men</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                                 <span class="symbol"><a name="ref_737_34" href="terminal_interface-curses-menus__ads.htm#ref_583_34">Proc</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_560_9">Menu_Hook_Function</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_739_16">Set_Menu_Term</a></span> (<span class="symbol"><a name="ref_739_31">Men</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                              <span class="symbol"><a name="ref_740_31">Proc</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_560_9">Menu_Hook_Function</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Menu_Term, "set_menu_term");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_739_16">Set_Menu_Term</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_582_34">Men</a>, <a href="terminal_interface-curses-menus__ads.htm#ref_583_34">Proc</a>));
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_582_14">Set_Menu_Term_Hook</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_747_13" href="terminal_interface-curses-menus__ads.htm#ref_588_13">Get_Item_Init_Hook</a></span> (<span class="symbol"><a name="ref_747_33" href="terminal_interface-curses-menus__ads.htm#ref_588_33">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> <a href="terminal_interface-curses-menus__ads.htm#ref_560_9">Menu_Hook_Function</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_749_16">Item_Init</a></span> (<span class="symbol"><a name="ref_749_27">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> <a href="terminal_interface-curses-menus__ads.htm#ref_560_9">Menu_Hook_Function</a>;
+      <b>pragma</b> Import (C, Item_Init, "item_init");
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses-menus__adb.htm#ref_749_16">Item_Init</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_588_33">Men</a>);
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_588_13">Get_Item_Init_Hook</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_755_13" href="terminal_interface-curses-menus__ads.htm#ref_593_13">Get_Item_Term_Hook</a></span> (<span class="symbol"><a name="ref_755_33" href="terminal_interface-curses-menus__ads.htm#ref_593_33">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> <a href="terminal_interface-curses-menus__ads.htm#ref_560_9">Menu_Hook_Function</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_757_16">Item_Term</a></span> (<span class="symbol"><a name="ref_757_27">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> <a href="terminal_interface-curses-menus__ads.htm#ref_560_9">Menu_Hook_Function</a>;
+      <b>pragma</b> Import (C, Item_Term, "item_term");
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses-menus__adb.htm#ref_757_16">Item_Term</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_593_33">Men</a>);
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_593_13">Get_Item_Term_Hook</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_763_13" href="terminal_interface-curses-menus__ads.htm#ref_598_13">Get_Menu_Init_Hook</a></span> (<span class="symbol"><a name="ref_763_33" href="terminal_interface-curses-menus__ads.htm#ref_598_33">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> <a href="terminal_interface-curses-menus__ads.htm#ref_560_9">Menu_Hook_Function</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_765_16">Menu_Init</a></span> (<span class="symbol"><a name="ref_765_27">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> <a href="terminal_interface-curses-menus__ads.htm#ref_560_9">Menu_Hook_Function</a>;
+      <b>pragma</b> Import (C, Menu_Init, "menu_init");
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses-menus__adb.htm#ref_765_16">Menu_Init</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_598_33">Men</a>);
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_598_13">Get_Menu_Init_Hook</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_771_13" href="terminal_interface-curses-menus__ads.htm#ref_603_13">Get_Menu_Term_Hook</a></span> (<span class="symbol"><a name="ref_771_33" href="terminal_interface-curses-menus__ads.htm#ref_603_33">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> <a href="terminal_interface-curses-menus__ads.htm#ref_560_9">Menu_Hook_Function</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_773_16">Menu_Term</a></span> (<span class="symbol"><a name="ref_773_27">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> <a href="terminal_interface-curses-menus__ads.htm#ref_560_9">Menu_Hook_Function</a>;
+      <b>pragma</b> Import (C, Menu_Term, "menu_term");
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses-menus__adb.htm#ref_773_16">Menu_Term</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_603_33">Men</a>);
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_603_13">Get_Menu_Term_Hook</a>;
+<span class="comment"><em>-------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_779_14" href="terminal_interface-curses-menus__ads.htm#ref_612_14">Redefine</a></span> (<span class="symbol"><a name="ref_779_24" href="terminal_interface-curses-menus__ads.htm#ref_612_24">Men</a></span>   : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                       <span class="symbol"><a name="ref_780_24" href="terminal_interface-curses-menus__ads.htm#ref_613_24">Items</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_177_9">Item_Array_Access</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_782_16">Set_Items</a></span> (<span class="symbol"><a name="ref_782_27">Men</a></span>   : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                          <span class="symbol"><a name="ref_783_27">Items</a></span> : System.Address) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Set_Items, "set_menu_items");
+
+   <b>begin</b>
+      <b>pragma</b> Assert (<a href="terminal_interface-curses-menus__ads.htm#ref_613_24">Items</a>.<b>all</b> (<a href="terminal_interface-curses-menus__ads.htm#ref_613_24">Items</a>'Last) = <a href="terminal_interface-curses-menus__ads.htm#ref_58_4">Null_Item</a>);
+      <b>if</b> <a href="terminal_interface-curses-menus__ads.htm#ref_613_24">Items</a>.<b>all</b> (<a href="terminal_interface-curses-menus__ads.htm#ref_613_24">Items</a>'Last) /= <a href="terminal_interface-curses-menus__ads.htm#ref_58_4">Null_Item</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses-menus__ads.htm#ref_112_4">Menu_Exception</a>;
+      <b>else</b>
+         <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_782_16">Set_Items</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_612_24">Men</a>, <a href="terminal_interface-curses-menus__ads.htm#ref_613_24">Items</a>.<b>all</b>'Address));
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_612_14">Redefine</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_795_13" href="terminal_interface-curses-menus__ads.htm#ref_628_13">Item_Count</a></span> (<span class="symbol"><a name="ref_795_25" href="terminal_interface-curses-menus__ads.htm#ref_628_25">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> Natural
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_797_16">Count</a></span> (<span class="symbol"><a name="ref_797_23">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Count, "item_count");
+   <b>begin</b>
+      <b>return</b> Natural (<a href="terminal_interface-curses-menus__adb.htm#ref_797_16">Count</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_628_25">Men</a>));
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_628_13">Item_Count</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_803_13" href="terminal_interface-curses-menus__ads.htm#ref_622_13">Items</a></span> (<span class="symbol"><a name="ref_803_20" href="terminal_interface-curses-menus__ads.htm#ref_622_20">Men</a></span>   : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                   <span class="symbol"><a name="ref_804_20" href="terminal_interface-curses-menus__ads.htm#ref_623_20">Index</a></span> : Positive) <b>return</b> <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>
+   <b>is</b>
+      <b>use</b> I_Array;
+
+      <b>function</b> C_Mitems (<span class="symbol"><a name="ref_808_26">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> Pointer;
+      <b>pragma</b> Import (C, C_Mitems, "menu_items");
+
+      P : Pointer := C_Mitems (<a href="terminal_interface-curses-menus__ads.htm#ref_622_20">Men</a>);
+   <b>begin</b>
+      <b>if</b> P = <b>null</b> <b>or</b> <b>else</b> <a href="terminal_interface-curses-menus__ads.htm#ref_623_20">Index</a> &gt; <a href="terminal_interface-curses-menus__ads.htm#ref_628_13">Item_Count</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_622_20">Men</a>) <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses-menus__ads.htm#ref_112_4">Menu_Exception</a>;
+      <b>else</b>
+         P := P + ptrdiff_t (<a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_623_20">Index</a>) - 1);
+         <b>return</b> P.<b>all</b>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_622_13">Items</a>;
+
+<span class="comment"><em>-------------------------------------------------------------------------------</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_822_13" href="terminal_interface-curses-menus__ads.htm#ref_637_13">Create</a></span> (<span class="symbol"><a name="ref_822_21" href="terminal_interface-curses-menus__ads.htm#ref_637_21">Items</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_177_9">Item_Array_Access</a>) <b>return</b> <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_824_16">Newmenu</a></span> (<span class="symbol"><a name="ref_824_25">Items</a></span> : System.Address) <b>return</b> <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+      <b>pragma</b> Import (C, Newmenu, "new_menu");
+
+      <span class="symbol"><a name="ref_827_7">M</a></span>   : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+   <b>begin</b>
+      <b>pragma</b> Assert (<a href="terminal_interface-curses-menus__ads.htm#ref_637_21">Items</a>.<b>all</b> (<a href="terminal_interface-curses-menus__ads.htm#ref_637_21">Items</a>'Last) = <a href="terminal_interface-curses-menus__ads.htm#ref_58_4">Null_Item</a>);
+      <b>if</b> <a href="terminal_interface-curses-menus__ads.htm#ref_637_21">Items</a>.<b>all</b> (<a href="terminal_interface-curses-menus__ads.htm#ref_637_21">Items</a>'Last) /= <a href="terminal_interface-curses-menus__ads.htm#ref_58_4">Null_Item</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses-menus__ads.htm#ref_112_4">Menu_Exception</a>;
+      <b>else</b>
+         <a href="terminal_interface-curses-menus__adb.htm#ref_827_7">M</a> := <a href="terminal_interface-curses-menus__adb.htm#ref_824_16">Newmenu</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_637_21">Items</a>.<b>all</b>'Address);
+         <b>if</b> <a href="terminal_interface-curses-menus__adb.htm#ref_827_7">M</a> = <a href="terminal_interface-curses-menus__ads.htm#ref_59_4">Null_Menu</a> <b>then</b>
+            <b>raise</b> <a href="terminal_interface-curses-menus__ads.htm#ref_112_4">Menu_Exception</a>;
+         <b>end</b> <b>if</b>;
+         <b>return</b> <a href="terminal_interface-curses-menus__adb.htm#ref_827_7">M</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_637_13">Create</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_841_14" href="terminal_interface-curses-menus__ads.htm#ref_644_14">Delete</a></span> (<span class="symbol"><a name="ref_841_22" href="terminal_interface-curses-menus__ads.htm#ref_644_22">Men</a></span> : <b>in</b> <b>out</b> <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_843_16">Free</a></span> (<span class="symbol"><a name="ref_843_22">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Free, "free_menu");
+
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_843_16">Free</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_644_22">Men</a>));
+      <a href="terminal_interface-curses-menus__ads.htm#ref_644_22">Men</a> := <a href="terminal_interface-curses-menus__ads.htm#ref_59_4">Null_Menu</a>;
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_644_14">Delete</a>;
+
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_852_13" href="terminal_interface-curses-menus__ads.htm#ref_659_13">Driver</a></span> (<span class="symbol"><a name="ref_852_21" href="terminal_interface-curses-menus__ads.htm#ref_659_21">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                    <span class="symbol"><a name="ref_853_21" href="terminal_interface-curses-menus__ads.htm#ref_660_21">Key</a></span> : <a href="terminal_interface-curses__ads.htm#ref_67_9">Key_Code</a>) <b>return</b> <a href="terminal_interface-curses-menus__ads.htm#ref_653_9">Driver_Result</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_855_16">Driver</a></span> (<span class="symbol"><a name="ref_855_24">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                       <span class="symbol"><a name="ref_856_24">Key</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a>;
+      <b>pragma</b> Import (C, Driver, "menu_driver");
+
+      <span class="symbol"><a name="ref_859_7">R</a></span> : <b>constant</b> <a href="terminal_interface-curses-aux__ads.htm#ref_70_9">Eti_Error</a> := <a href="terminal_interface-curses-menus__adb.htm#ref_855_16">Driver</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_659_21">Men</a>, <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_660_21">Key</a>));
+   <b>begin</b>
+      <b>case</b> <a href="terminal_interface-curses-menus__adb.htm#ref_859_7">R</a> <b>is</b>
+         <b>when</b> <a href="terminal_interface-curses-aux__ads.htm#ref_77_7">E_Unknown_Command</a> =&gt;
+            <b>return</b> <a href="terminal_interface-curses-menus__ads.htm#ref_655_27">Unknown_Request</a>;
+         <b>when</b> <a href="terminal_interface-curses-aux__ads.htm#ref_76_7">E_No_Match</a> =&gt;
+            <b>return</b> <a href="terminal_interface-curses-menus__ads.htm#ref_656_27">No_Match</a>;
+         <b>when</b> <a href="terminal_interface-curses-aux__ads.htm#ref_73_7">E_Request_Denied</a> | <a href="terminal_interface-curses-aux__ads.htm#ref_75_7">E_Not_Selectable</a> =&gt;
+            <b>return</b> <a href="terminal_interface-curses-menus__ads.htm#ref_654_27">Request_Denied</a>;
+         <b>when</b> <b>others</b> =&gt;
+            <a href="terminal_interface-curses-aux__ads.htm#ref_87_14">Eti_Exception</a> (<a href="terminal_interface-curses-menus__adb.htm#ref_859_7">R</a>);
+            <b>return</b> <a href="terminal_interface-curses-menus__ads.htm#ref_653_27">Menu_Ok</a>;
+      <b>end</b> <b>case</b>;
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_659_13">Driver</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_874_14" href="terminal_interface-curses-menus__ads.htm#ref_179_14">Free</a></span> (<span class="symbol"><a name="ref_874_20" href="terminal_interface-curses-menus__ads.htm#ref_179_20">IA</a></span>         : <b>in</b> <b>out</b> <a href="terminal_interface-curses-menus__ads.htm#ref_177_9">Item_Array_Access</a>;
+                   <span class="symbol"><a name="ref_875_20" href="terminal_interface-curses-menus__ads.htm#ref_180_20">Free_Items</a></span> : Boolean := False)
+   <b>is</b>
+      <b>procedure</b> Release <b>is</b> <b>new</b> Ada.Unchecked_Deallocation
+        (Item_Array, <a href="terminal_interface-curses-menus__ads.htm#ref_177_9">Item_Array_Access</a>);
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-menus__ads.htm#ref_179_20">IA</a> /= <b>null</b> <b>and</b> <b>then</b> <a href="terminal_interface-curses-menus__ads.htm#ref_180_20">Free_Items</a> <b>then</b>
+         <b>for</b> <span class="symbol"><a name="ref_881_14">I</a></span> <b>in</b> <a href="terminal_interface-curses-menus__ads.htm#ref_179_20">IA</a>'First .. (<a href="terminal_interface-curses-menus__ads.htm#ref_179_20">IA</a>'Last - 1) <b>loop</b>
+            <b>if</b> <a href="terminal_interface-curses-menus__ads.htm#ref_179_20">IA</a>.<b>all</b> (<a href="terminal_interface-curses-menus__adb.htm#ref_881_14">I</a>) /= <a href="terminal_interface-curses-menus__ads.htm#ref_58_4">Null_Item</a> <b>then</b>
+               <a href="terminal_interface-curses-menus__ads.htm#ref_202_14">Delete</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_179_20">IA</a>.<b>all</b> (<a href="terminal_interface-curses-menus__adb.htm#ref_881_14">I</a>));
+            <b>end</b> <b>if</b>;
+         <b>end</b> <b>loop</b>;
+      <b>end</b> <b>if</b>;
+      Release (<a href="terminal_interface-curses-menus__ads.htm#ref_179_20">IA</a>);
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_179_14">Free</a>;
+
+<span class="comment"><em>-------------------------------------------------------------------------------</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_891_13" href="terminal_interface-curses-menus__ads.htm#ref_146_13">Default_Menu_Options</a></span> <b>return</b> <a href="terminal_interface-curses-menus__ads.htm#ref_116_9">Menu_Option_Set</a>
+   <b>is</b>
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses-menus__ads.htm#ref_351_13">Get_Options</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_59_4">Null_Menu</a>);
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_146_13">Default_Menu_Options</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_897_13" href="terminal_interface-curses-menus__ads.htm#ref_167_13">Default_Item_Options</a></span> <b>return</b> <a href="terminal_interface-curses-menus__ads.htm#ref_152_9">Item_Option_Set</a>
+   <b>is</b>
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses-menus__ads.htm#ref_255_13">Get_Options</a> (<a href="terminal_interface-curses-menus__ads.htm#ref_58_4">Null_Item</a>);
+   <b>end</b> <a href="terminal_interface-curses-menus__ads.htm#ref_167_13">Default_Item_Options</a>;
+<span class="comment"><em>-------------------------------------------------------------------------------</em></span>
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-menus__ads.htm#ref_46_35">Menus</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-menus__ads.htm b/doc/html/ada/terminal_interface-curses-menus__ads.htm
new file mode 100644
index 0000000..5f61dac
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-menus__ads.htm
@@ -0,0 +1,692 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-menus.ads</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-menus.ads </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                      Terminal_Interface.Curses.Menu                      --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 S P E C                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1998-2009,2014 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.32 @</em></span>
+<span class="comment"><em>--  @Date: 2020/02/02 23:34:34 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>with</b> System;
+<b>with</b> Ada.Characters.Latin_1;
+
+<b>package</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<span class="symbol"><a name="ref_46_35" href="terminal_interface-curses-menus__adb.htm#ref_50_40">Menus</a></span> <b>is</b>
+   <b>pragma</b> Preelaborate (<a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-menus__ads.htm#ref_46_35">Menus</a>);
+   <b>pragma</b> Linker_Options ("-lmenu" &amp; <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_9_4">DFT_ARG_SUFFIX</a>);
+
+   Space : Character <b>renames</b> Ada.Characters.Latin_1.Space;
+
+   <b>type</b> <span class="symbol"><a name="ref_52_9">Item</a></span> <b>is</b> <b>private</b>;
+   <b>type</b> <span class="symbol"><a name="ref_53_9">Menu</a></span> <b>is</b> <b>private</b>;
+
+   <span class="comment"><em>---------------------------</em></span>
+   <span class="comment"><em>--  Interface constants  --</em></span>
+   <span class="comment"><em>---------------------------</em></span>
+   <span class="symbol"><a name="ref_58_4">Null_Item</a></span> : <b>constant</b> <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>;
+   <span class="symbol"><a name="ref_59_4">Null_Menu</a></span> : <b>constant</b> <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+
+   <b>subtype</b> <span class="symbol"><a name="ref_61_12">Menu_Request_Code</a></span> <b>is</b> <a href="terminal_interface-curses__ads.htm#ref_67_9">Key_Code</a>
+     <b>range</b> (<a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 1) .. (<a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 17);
+
+   <span class="comment"><em>--  The prefix M_ stands for "Menu Request"</em></span>
+   <span class="symbol"><a name="ref_65_4">M_Left_Item</a></span>       : <b>constant</b> <a href="terminal_interface-curses-menus__ads.htm#ref_61_12">Menu_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 1;
+   <span class="symbol"><a name="ref_66_4">M_Right_Item</a></span>      : <b>constant</b> <a href="terminal_interface-curses-menus__ads.htm#ref_61_12">Menu_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 2;
+   <span class="symbol"><a name="ref_67_4">M_Up_Item</a></span>         : <b>constant</b> <a href="terminal_interface-curses-menus__ads.htm#ref_61_12">Menu_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 3;
+   <span class="symbol"><a name="ref_68_4">M_Down_Item</a></span>       : <b>constant</b> <a href="terminal_interface-curses-menus__ads.htm#ref_61_12">Menu_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 4;
+   <span class="symbol"><a name="ref_69_4">M_ScrollUp_Line</a></span>   : <b>constant</b> <a href="terminal_interface-curses-menus__ads.htm#ref_61_12">Menu_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 5;
+   <span class="symbol"><a name="ref_70_4">M_ScrollDown_Line</a></span> : <b>constant</b> <a href="terminal_interface-curses-menus__ads.htm#ref_61_12">Menu_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 6;
+   <span class="symbol"><a name="ref_71_4">M_ScrollDown_Page</a></span> : <b>constant</b> <a href="terminal_interface-curses-menus__ads.htm#ref_61_12">Menu_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 7;
+   <span class="symbol"><a name="ref_72_4">M_ScrollUp_Page</a></span>   : <b>constant</b> <a href="terminal_interface-curses-menus__ads.htm#ref_61_12">Menu_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 8;
+   <span class="symbol"><a name="ref_73_4">M_First_Item</a></span>      : <b>constant</b> <a href="terminal_interface-curses-menus__ads.htm#ref_61_12">Menu_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 9;
+   <span class="symbol"><a name="ref_74_4">M_Last_Item</a></span>       : <b>constant</b> <a href="terminal_interface-curses-menus__ads.htm#ref_61_12">Menu_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 10;
+   <span class="symbol"><a name="ref_75_4">M_Next_Item</a></span>       : <b>constant</b> <a href="terminal_interface-curses-menus__ads.htm#ref_61_12">Menu_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 11;
+   <span class="symbol"><a name="ref_76_4">M_Previous_Item</a></span>   : <b>constant</b> <a href="terminal_interface-curses-menus__ads.htm#ref_61_12">Menu_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 12;
+   <span class="symbol"><a name="ref_77_4">M_Toggle_Item</a></span>     : <b>constant</b> <a href="terminal_interface-curses-menus__ads.htm#ref_61_12">Menu_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 13;
+   <span class="symbol"><a name="ref_78_4">M_Clear_Pattern</a></span>   : <b>constant</b> <a href="terminal_interface-curses-menus__ads.htm#ref_61_12">Menu_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 14;
+   <span class="symbol"><a name="ref_79_4">M_Back_Pattern</a></span>    : <b>constant</b> <a href="terminal_interface-curses-menus__ads.htm#ref_61_12">Menu_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 15;
+   <span class="symbol"><a name="ref_80_4">M_Next_Match</a></span>      : <b>constant</b> <a href="terminal_interface-curses-menus__ads.htm#ref_61_12">Menu_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 16;
+   <span class="symbol"><a name="ref_81_4">M_Previous_Match</a></span>  : <b>constant</b> <a href="terminal_interface-curses-menus__ads.htm#ref_61_12">Menu_Request_Code</a> := <a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 17;
+
+   <span class="comment"><em>--  For those who like the old 'C' names for the request codes</em></span>
+   REQ_LEFT_ITEM     : <a href="terminal_interface-curses-menus__ads.htm#ref_61_12">Menu_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-menus__ads.htm#ref_65_4">M_Left_Item</a>;
+   REQ_RIGHT_ITEM    : <a href="terminal_interface-curses-menus__ads.htm#ref_61_12">Menu_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-menus__ads.htm#ref_66_4">M_Right_Item</a>;
+   REQ_UP_ITEM       : <a href="terminal_interface-curses-menus__ads.htm#ref_61_12">Menu_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-menus__ads.htm#ref_67_4">M_Up_Item</a>;
+   REQ_DOWN_ITEM     : <a href="terminal_interface-curses-menus__ads.htm#ref_61_12">Menu_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-menus__ads.htm#ref_68_4">M_Down_Item</a>;
+   REQ_SCR_ULINE     : <a href="terminal_interface-curses-menus__ads.htm#ref_61_12">Menu_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-menus__ads.htm#ref_69_4">M_ScrollUp_Line</a>;
+   REQ_SCR_DLINE     : <a href="terminal_interface-curses-menus__ads.htm#ref_61_12">Menu_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-menus__ads.htm#ref_70_4">M_ScrollDown_Line</a>;
+   REQ_SCR_DPAGE     : <a href="terminal_interface-curses-menus__ads.htm#ref_61_12">Menu_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-menus__ads.htm#ref_71_4">M_ScrollDown_Page</a>;
+   REQ_SCR_UPAGE     : <a href="terminal_interface-curses-menus__ads.htm#ref_61_12">Menu_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-menus__ads.htm#ref_72_4">M_ScrollUp_Page</a>;
+   REQ_FIRST_ITEM    : <a href="terminal_interface-curses-menus__ads.htm#ref_61_12">Menu_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-menus__ads.htm#ref_73_4">M_First_Item</a>;
+   REQ_LAST_ITEM     : <a href="terminal_interface-curses-menus__ads.htm#ref_61_12">Menu_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-menus__ads.htm#ref_74_4">M_Last_Item</a>;
+   REQ_NEXT_ITEM     : <a href="terminal_interface-curses-menus__ads.htm#ref_61_12">Menu_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-menus__ads.htm#ref_75_4">M_Next_Item</a>;
+   REQ_PREV_ITEM     : <a href="terminal_interface-curses-menus__ads.htm#ref_61_12">Menu_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-menus__ads.htm#ref_76_4">M_Previous_Item</a>;
+   REQ_TOGGLE_ITEM   : <a href="terminal_interface-curses-menus__ads.htm#ref_61_12">Menu_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-menus__ads.htm#ref_77_4">M_Toggle_Item</a>;
+   REQ_CLEAR_PATTERN : <a href="terminal_interface-curses-menus__ads.htm#ref_61_12">Menu_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-menus__ads.htm#ref_78_4">M_Clear_Pattern</a>;
+   REQ_BACK_PATTERN  : <a href="terminal_interface-curses-menus__ads.htm#ref_61_12">Menu_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-menus__ads.htm#ref_79_4">M_Back_Pattern</a>;
+   REQ_NEXT_MATCH    : <a href="terminal_interface-curses-menus__ads.htm#ref_61_12">Menu_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-menus__ads.htm#ref_80_4">M_Next_Match</a>;
+   REQ_PREV_MATCH    : <a href="terminal_interface-curses-menus__ads.htm#ref_61_12">Menu_Request_Code</a> <b>renames</b> <a href="terminal_interface-curses-menus__ads.htm#ref_81_4">M_Previous_Match</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_102_14" href="terminal_interface-curses-menus__adb.htm#ref_59_14">Request_Name</a></span> (<span class="symbol"><a name="ref_102_28" href="terminal_interface-curses-menus__adb.htm#ref_59_28">Key</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_61_12">Menu_Request_Code</a>;
+                           <span class="symbol"><a name="ref_103_28" href="terminal_interface-curses-menus__adb.htm#ref_60_28">Name</a></span> : <b>out</b> String);
+
+   <b>function</b>  <span class="symbol"><a name="ref_105_14" href="terminal_interface-curses-menus__adb.htm#ref_68_13">Request_Name</a></span> (<span class="symbol"><a name="ref_105_28" href="terminal_interface-curses-menus__adb.htm#ref_68_27">Key</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_61_12">Menu_Request_Code</a>) <b>return</b> String;
+   <span class="comment"><em>--  Same as function</em></span>
+
+   <span class="comment"><em>------------------</em></span>
+   <span class="comment"><em>--  Exceptions  --</em></span>
+   <span class="comment"><em>------------------</em></span>
+
+   <span class="symbol"><a name="ref_112_4">Menu_Exception</a></span> : <b>exception</b>;
+   <span class="comment"><em>--</em></span>
+   <span class="comment"><em>--  Menu options</em></span>
+   <span class="comment"><em>--</em></span>
+   <b>type</b> <span class="symbol"><a name="ref_116_9">Menu_Option_Set</a></span> <b>is</b>
+      <b>record</b>
+         <span class="symbol"><a name="ref_118_10">One_Valued</a></span>        : Boolean;
+         <span class="symbol"><a name="ref_119_10">Show_Descriptions</a></span> : Boolean;
+         <span class="symbol"><a name="ref_120_10">Row_Major_Order</a></span>   : Boolean;
+         <span class="symbol"><a name="ref_121_10">Ignore_Case</a></span>       : Boolean;
+         <span class="symbol"><a name="ref_122_10">Show_Matches</a></span>      : Boolean;
+         <span class="symbol"><a name="ref_123_10">Non_Cyclic</a></span>        : Boolean;
+      <b>end</b> <b>record</b>;
+   <b>pragma</b> Convention (C_Pass_By_Copy, <a href="terminal_interface-curses-menus__ads.htm#ref_116_9">Menu_Option_Set</a>);
+
+   <b>for</b> <a href="terminal_interface-curses-menus__ads.htm#ref_116_9">Menu_Option_Set</a> <b>use</b>
+      <b>record</b>
+         <a href="terminal_interface-curses-menus__ads.htm#ref_118_10">One_Valued</a>        <b>at</b> 0 <b>range</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_257_4">O_ONEVALUE_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_258_4">O_ONEVALUE_Last</a>;
+         <a href="terminal_interface-curses-menus__ads.htm#ref_119_10">Show_Descriptions</a> <b>at</b> 0 <b>range</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_259_4">O_SHOWDESC_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_260_4">O_SHOWDESC_Last</a>;
+         <a href="terminal_interface-curses-menus__ads.htm#ref_120_10">Row_Major_Order</a>   <b>at</b> 0 <b>range</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_261_4">O_ROWMAJOR_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_262_4">O_ROWMAJOR_Last</a>;
+         <a href="terminal_interface-curses-menus__ads.htm#ref_121_10">Ignore_Case</a>       <b>at</b> 0 <b>range</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_263_4">O_IGNORECASE_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_264_4">O_IGNORECASE_Last</a>;
+         <a href="terminal_interface-curses-menus__ads.htm#ref_122_10">Show_Matches</a>      <b>at</b> 0 <b>range</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_265_4">O_SHOWMATCH_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_266_4">O_SHOWMATCH_Last</a>;
+         <a href="terminal_interface-curses-menus__ads.htm#ref_123_10">Non_Cyclic</a>        <b>at</b> 0 <b>range</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_267_4">O_NONCYCLIC_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_268_4">O_NONCYCLIC_Last</a>;
+      <b>end</b> <b>record</b>;
+   <b>pragma</b> Warnings (Off);
+   <b>for</b> <a href="terminal_interface-curses-menus__ads.htm#ref_116_9">Menu_Option_Set</a>'Size <b>use</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_269_4">Menu_Options_Size</a>;
+   <b>pragma</b> Warnings (On);
+
+   <b>function</b> <span class="symbol"><a name="ref_146_13" href="terminal_interface-curses-menus__adb.htm#ref_891_13">Default_Menu_Options</a></span> <b>return</b> <a href="terminal_interface-curses-menus__ads.htm#ref_116_9">Menu_Option_Set</a>;
+   <span class="comment"><em>--  Initial default options for a menu.</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-menus__ads.htm#ref_146_13">Default_Menu_Options</a>);
+   <span class="comment"><em>--</em></span>
+   <span class="comment"><em>--  Item options</em></span>
+   <span class="comment"><em>--</em></span>
+   <b>type</b> <span class="symbol"><a name="ref_152_9">Item_Option_Set</a></span> <b>is</b>
+      <b>record</b>
+         <span class="symbol"><a name="ref_154_10">Selectable</a></span> : Boolean;
+      <b>end</b> <b>record</b>;
+   <b>pragma</b> Convention (C_Pass_By_Copy, <a href="terminal_interface-curses-menus__ads.htm#ref_152_9">Item_Option_Set</a>);
+
+   <b>for</b> <a href="terminal_interface-curses-menus__ads.htm#ref_152_9">Item_Option_Set</a> <b>use</b>
+      <b>record</b>
+         <a href="terminal_interface-curses-menus__ads.htm#ref_154_10">Selectable</a> <b>at</b> 0 <b>range</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_273_4">O_SELECTABLE_First</a>
+           ..  <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_274_4">O_SELECTABLE_Last</a>;
+      <b>end</b> <b>record</b>;
+   <b>pragma</b> Warnings (Off);
+   <b>for</b> <a href="terminal_interface-curses-menus__ads.htm#ref_152_9">Item_Option_Set</a>'Size <b>use</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_275_4">Item_Options_Size</a>;
+   <b>pragma</b> Warnings (On);
+
+   <b>function</b> <span class="symbol"><a name="ref_167_13" href="terminal_interface-curses-menus__adb.htm#ref_897_13">Default_Item_Options</a></span> <b>return</b> <a href="terminal_interface-curses-menus__ads.htm#ref_152_9">Item_Option_Set</a>;
+   <span class="comment"><em>--  Initial default options for an item.</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-menus__ads.htm#ref_167_13">Default_Item_Options</a>);
+
+   <span class="comment"><em>--</em></span>
+   <span class="comment"><em>--  Item Array</em></span>
+   <span class="comment"><em>--</em></span>
+   <b>type</b> Item_Array <b>is</b> <b>array</b> (Positive <b>range</b> &lt;&gt;) <b>of</b> <b>aliased</b> <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>;
+   <b>pragma</b> Convention (C, Item_Array);
+
+   <b>type</b> <span class="symbol"><a name="ref_177_9">Item_Array_Access</a></span> <b>is</b> <b>access</b> Item_Array;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_179_14" href="terminal_interface-curses-menus__adb.htm#ref_874_14">Free</a></span> (<span class="symbol"><a name="ref_179_20" href="terminal_interface-curses-menus__adb.htm#ref_874_20">IA</a></span>         : <b>in</b> <b>out</b> <a href="terminal_interface-curses-menus__ads.htm#ref_177_9">Item_Array_Access</a>;
+                   <span class="symbol"><a name="ref_180_20" href="terminal_interface-curses-menus__adb.htm#ref_875_20">Free_Items</a></span> : Boolean := False);
+   <span class="comment"><em>--  Release the memory for an allocated item array</em></span>
+   <span class="comment"><em>--  If Free_Items is True, call Delete() for all the items in</em></span>
+   <span class="comment"><em>--  the array.</em></span>
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/mitem_new.3x.html">mitem_new.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_1">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_190_13" href="terminal_interface-curses-menus__adb.htm#ref_76_13">Create</a></span> (<span class="symbol"><a name="ref_190_21" href="terminal_interface-curses-menus__adb.htm#ref_76_21">Name</a></span>        : String;
+                    <span class="symbol"><a name="ref_191_21" href="terminal_interface-curses-menus__adb.htm#ref_77_21">Description</a></span> : String := "") <b>return</b> <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/mitem_new.3x.html">new_item()</A></em></span>
+   <span class="comment"><em>--  Not inlined.</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_2">|</A></em></span>
+   <b>function</b> New_Item (<span class="symbol"><a name="ref_196_23">Name</a></span>        : String;
+                      <span class="symbol"><a name="ref_197_23">Description</a></span> : String := "") <b>return</b> <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>
+     <b>renames</b> <a href="terminal_interface-curses-menus__ads.htm#ref_190_13">Create</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/mitem_new.3x.html">new_item()</A></em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_3">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_202_14" href="terminal_interface-curses-menus__adb.htm#ref_106_14">Delete</a></span> (<span class="symbol"><a name="ref_202_22" href="terminal_interface-curses-menus__adb.htm#ref_106_22">Itm</a></span> : <b>in</b> <b>out</b> <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/mitem_new.3x.html">free_item()</A></em></span>
+   <span class="comment"><em>--  Resets Itm to Null_Item</em></span>
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/mitem_value.3x.html">mitem_value.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_4">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_211_14" href="terminal_interface-curses-menus__adb.htm#ref_130_14">Set_Value</a></span> (<span class="symbol"><a name="ref_211_25" href="terminal_interface-curses-menus__adb.htm#ref_130_25">Itm</a></span>   : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>;
+                        <span class="symbol"><a name="ref_212_25" href="terminal_interface-curses-menus__adb.htm#ref_131_25">Value</a></span> : Boolean := True);
+   <span class="comment"><em>--  AKA: <A HREF="../man/mitem_value.3x.html">set_item_value()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-menus__ads.htm#ref_211_14">Set_Value</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_5">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_217_13" href="terminal_interface-curses-menus__adb.htm#ref_141_13">Value</a></span> (<span class="symbol"><a name="ref_217_20" href="terminal_interface-curses-menus__adb.htm#ref_141_20">Itm</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>) <b>return</b> Boolean;
+   <span class="comment"><em>--  AKA: <A HREF="../man/mitem_value.3x.html">item_value()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-menus__ads.htm#ref_217_13">Value</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/mitem_visible.3x.html">mitem_visible.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_6">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_226_13" href="terminal_interface-curses-menus__adb.htm#ref_154_13">Visible</a></span> (<span class="symbol"><a name="ref_226_22" href="terminal_interface-curses-menus__adb.htm#ref_154_22">Itm</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>) <b>return</b> Boolean;
+   <span class="comment"><em>--  AKA: <A HREF="../man/mitem_visible.3x.html">item_visible()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-menus__ads.htm#ref_226_13">Visible</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/mitem_opts.3x.html">mitem_opts.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_7">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_235_14" href="terminal_interface-curses-menus__adb.htm#ref_166_14">Set_Options</a></span> (<span class="symbol"><a name="ref_235_27" href="terminal_interface-curses-menus__adb.htm#ref_166_27">Itm</a></span>     : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>;
+                          <span class="symbol"><a name="ref_236_27" href="terminal_interface-curses-menus__adb.htm#ref_167_27">Options</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_152_9">Item_Option_Set</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/mitem_opts.3x.html">set_item_opts()</A></em></span>
+   <span class="comment"><em>--  An overloaded Set_Options is defined later. Pragma Inline appears there</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_8">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_241_14" href="terminal_interface-curses-menus__adb.htm#ref_177_14">Switch_Options</a></span> (<span class="symbol"><a name="ref_241_30" href="terminal_interface-curses-menus__adb.htm#ref_177_30">Itm</a></span>     : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>;
+                             <span class="symbol"><a name="ref_242_30" href="terminal_interface-curses-menus__adb.htm#ref_178_30">Options</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_152_9">Item_Option_Set</a>;
+                             <span class="symbol"><a name="ref_243_30" href="terminal_interface-curses-menus__adb.htm#ref_179_30">On</a></span>      : Boolean := True);
+   <span class="comment"><em>--  AKA: <A HREF="../man/mitem_opts.3x.html">item_opts_on()</A></em></span>
+   <span class="comment"><em>--  AKA: item_opts_off()</em></span>
+   <span class="comment"><em>--  An overloaded Switch_Options is defined later.</em></span>
+   <span class="comment"><em>--  Pragma Inline appears there</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_9">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_250_14" href="terminal_interface-curses-menus__adb.htm#ref_196_14">Get_Options</a></span> (<span class="symbol"><a name="ref_250_27" href="terminal_interface-curses-menus__adb.htm#ref_196_27">Itm</a></span>     : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>;
+                          <span class="symbol"><a name="ref_251_27" href="terminal_interface-curses-menus__adb.htm#ref_197_27">Options</a></span> : <b>out</b> <a href="terminal_interface-curses-menus__ads.htm#ref_152_9">Item_Option_Set</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/mitem_opts.3x.html">item_opts()</A></em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_10">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_255_13" href="terminal_interface-curses-menus__adb.htm#ref_206_13">Get_Options</a></span> (<span class="symbol"><a name="ref_255_26" href="terminal_interface-curses-menus__adb.htm#ref_206_26">Itm</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a> := <a href="terminal_interface-curses-menus__ads.htm#ref_58_4">Null_Item</a>) <b>return</b> <a href="terminal_interface-curses-menus__ads.htm#ref_152_9">Item_Option_Set</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/mitem_opts.3x.html">item_opts()</A></em></span>
+   <span class="comment"><em>--  An overloaded Get_Options is defined later. Pragma Inline appears there</em></span>
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/mitem_name.3x.html">mitem_name.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_11">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_264_14" href="terminal_interface-curses-menus__adb.htm#ref_214_14">Name</a></span> (<span class="symbol"><a name="ref_264_20" href="terminal_interface-curses-menus__adb.htm#ref_214_20">Itm</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>;
+                   <span class="symbol"><a name="ref_265_20" href="terminal_interface-curses-menus__adb.htm#ref_215_20">Name</a></span> : <b>out</b> String);
+   <span class="comment"><em>--  AKA: <A HREF="../man/mitem_name.3x.html">item_name()</A></em></span>
+   <b>function</b>  <span class="symbol"><a name="ref_267_14" href="terminal_interface-curses-menus__adb.htm#ref_223_13">Name</a></span> (<span class="symbol"><a name="ref_267_20" href="terminal_interface-curses-menus__adb.htm#ref_223_19">Itm</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>) <b>return</b> String;
+   <span class="comment"><em>--  AKA: <A HREF="../man/mitem_name.3x.html">item_name()</A></em></span>
+   <span class="comment"><em>--  Implemented as function</em></span>
+   <b>pragma</b> Inline (Name);
+
+   <span class="comment"><em>--  <A NAME="AFU_12">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_273_14" href="terminal_interface-curses-menus__adb.htm#ref_231_14">Description</a></span> (<span class="symbol"><a name="ref_273_27" href="terminal_interface-curses-menus__adb.htm#ref_231_27">Itm</a></span>         : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>;
+                          <span class="symbol"><a name="ref_274_27" href="terminal_interface-curses-menus__adb.htm#ref_232_27">Description</a></span> : <b>out</b> String);
+   <span class="comment"><em>--  AKA: <A HREF="../man/mitem_name.3x.html">item_description();</A></em></span>
+
+   <b>function</b>  <span class="symbol"><a name="ref_277_14" href="terminal_interface-curses-menus__adb.htm#ref_240_13">Description</a></span> (<span class="symbol"><a name="ref_277_27" href="terminal_interface-curses-menus__adb.htm#ref_240_26">Itm</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>) <b>return</b> String;
+   <span class="comment"><em>--  AKA: <A HREF="../man/mitem_name.3x.html">item_description();</A></em></span>
+   <span class="comment"><em>--  Implemented as function</em></span>
+   <b>pragma</b> Inline (Description);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/mitem_current.3x.html">mitem_current.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_13">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_287_14" href="terminal_interface-curses-menus__adb.htm#ref_248_14">Set_Current</a></span> (<span class="symbol"><a name="ref_287_27" href="terminal_interface-curses-menus__adb.htm#ref_248_27">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                          <span class="symbol"><a name="ref_288_27" href="terminal_interface-curses-menus__adb.htm#ref_249_27">Itm</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/mitem_current.3x.html">set_current_item()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-menus__ads.htm#ref_287_14">Set_Current</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_14">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_293_13" href="terminal_interface-curses-menus__adb.htm#ref_259_13">Current</a></span> (<span class="symbol"><a name="ref_293_22" href="terminal_interface-curses-menus__adb.htm#ref_259_22">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/mitem_current.3x.html">current_item()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-menus__ads.htm#ref_293_13">Current</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_15">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_298_14" href="terminal_interface-curses-menus__adb.htm#ref_272_14">Set_Top_Row</a></span> (<span class="symbol"><a name="ref_298_27" href="terminal_interface-curses-menus__adb.htm#ref_272_27">Men</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                          <span class="symbol"><a name="ref_299_27" href="terminal_interface-curses-menus__adb.htm#ref_273_27">Line</a></span> : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/mitem_current.3x.html">set_top_row()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-menus__ads.htm#ref_298_14">Set_Top_Row</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_16">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_304_13" href="terminal_interface-curses-menus__adb.htm#ref_283_13">Top_Row</a></span> (<span class="symbol"><a name="ref_304_22" href="terminal_interface-curses-menus__adb.htm#ref_283_22">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/mitem_current.3x.html">top_row()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-menus__ads.htm#ref_304_13">Top_Row</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_17">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_309_13" href="terminal_interface-curses-menus__adb.htm#ref_296_13">Get_Index</a></span> (<span class="symbol"><a name="ref_309_24" href="terminal_interface-curses-menus__adb.htm#ref_296_24">Itm</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>) <b>return</b> Positive;
+   <span class="comment"><em>--  AKA: <A HREF="../man/mitem_current.3x.html">item_index()</A></em></span>
+   <span class="comment"><em>--  Please note that in this binding we start the numbering of items</em></span>
+   <span class="comment"><em>--  with 1. So this is number is one more than you get from the low</em></span>
+   <span class="comment"><em>--  level call.</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-menus__ads.htm#ref_309_13">Get_Index</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/menu_post.3x.html">menu_post.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_18">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_321_14" href="terminal_interface-curses-menus__adb.htm#ref_309_14">Post</a></span> (<span class="symbol"><a name="ref_321_20" href="terminal_interface-curses-menus__adb.htm#ref_309_20">Men</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                   <span class="symbol"><a name="ref_322_20" href="terminal_interface-curses-menus__adb.htm#ref_310_20">Post</a></span> : Boolean := True);
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_post.3x.html">post_menu()</A></em></span>
+   <span class="comment"><em>--  AKA: unpost_menu()</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-menus__ads.htm#ref_321_14">Post</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/menu_opts.3x.html">menu_opts.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_19">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_332_14" href="terminal_interface-curses-menus__adb.htm#ref_325_14">Set_Options</a></span> (<span class="symbol"><a name="ref_332_27" href="terminal_interface-curses-menus__adb.htm#ref_325_27">Men</a></span>     : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                          <span class="symbol"><a name="ref_333_27" href="terminal_interface-curses-menus__adb.htm#ref_326_27">Options</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_116_9">Menu_Option_Set</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_opts.3x.html">set_menu_opts()</A></em></span>
+   <b>pragma</b> Inline (Set_Options);
+
+   <span class="comment"><em>--  <A NAME="AFU_20">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_338_14" href="terminal_interface-curses-menus__adb.htm#ref_336_14">Switch_Options</a></span> (<span class="symbol"><a name="ref_338_30" href="terminal_interface-curses-menus__adb.htm#ref_336_30">Men</a></span>     : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                             <span class="symbol"><a name="ref_339_30" href="terminal_interface-curses-menus__adb.htm#ref_337_30">Options</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_116_9">Menu_Option_Set</a>;
+                             <span class="symbol"><a name="ref_340_30" href="terminal_interface-curses-menus__adb.htm#ref_338_30">On</a></span>      : Boolean := True);
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_opts.3x.html">menu_opts_on()</A></em></span>
+   <span class="comment"><em>--  AKA: menu_opts_off()</em></span>
+   <b>pragma</b> Inline (Switch_Options);
+
+   <span class="comment"><em>--  <A NAME="AFU_21">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_346_14" href="terminal_interface-curses-menus__adb.htm#ref_355_14">Get_Options</a></span> (<span class="symbol"><a name="ref_346_27" href="terminal_interface-curses-menus__adb.htm#ref_355_27">Men</a></span>     : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                          <span class="symbol"><a name="ref_347_27" href="terminal_interface-curses-menus__adb.htm#ref_356_27">Options</a></span> : <b>out</b> <a href="terminal_interface-curses-menus__ads.htm#ref_116_9">Menu_Option_Set</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_opts.3x.html">menu_opts()</A></em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_22">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_351_13" href="terminal_interface-curses-menus__adb.htm#ref_365_13">Get_Options</a></span> (<span class="symbol"><a name="ref_351_26" href="terminal_interface-curses-menus__adb.htm#ref_365_26">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a> := <a href="terminal_interface-curses-menus__ads.htm#ref_59_4">Null_Menu</a>) <b>return</b> <a href="terminal_interface-curses-menus__ads.htm#ref_116_9">Menu_Option_Set</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_opts.3x.html">menu_opts()</A></em></span>
+   <b>pragma</b> Inline (Get_Options);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/menu_win.3x.html">menu_win.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_23">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_360_14" href="terminal_interface-curses-menus__adb.htm#ref_373_14">Set_Window</a></span> (<span class="symbol"><a name="ref_360_26" href="terminal_interface-curses-menus__adb.htm#ref_373_26">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                         <span class="symbol"><a name="ref_361_26" href="terminal_interface-curses-menus__adb.htm#ref_374_26">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_win.3x.html">set_menu_win()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-menus__ads.htm#ref_360_14">Set_Window</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_24">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_366_13" href="terminal_interface-curses-menus__adb.htm#ref_384_13">Get_Window</a></span> (<span class="symbol"><a name="ref_366_25" href="terminal_interface-curses-menus__adb.htm#ref_384_25">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_win.3x.html">menu_win()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-menus__ads.htm#ref_366_13">Get_Window</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_25">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_371_14" href="terminal_interface-curses-menus__adb.htm#ref_394_14">Set_Sub_Window</a></span> (<span class="symbol"><a name="ref_371_30" href="terminal_interface-curses-menus__adb.htm#ref_394_30">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                             <span class="symbol"><a name="ref_372_30" href="terminal_interface-curses-menus__adb.htm#ref_395_30">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_win.3x.html">set_menu_sub()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-menus__ads.htm#ref_371_14">Set_Sub_Window</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_26">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_377_13" href="terminal_interface-curses-menus__adb.htm#ref_405_13">Get_Sub_Window</a></span> (<span class="symbol"><a name="ref_377_29" href="terminal_interface-curses-menus__adb.htm#ref_405_29">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_win.3x.html">menu_sub()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-menus__ads.htm#ref_377_13">Get_Sub_Window</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_27">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_382_14" href="terminal_interface-curses-menus__adb.htm#ref_415_14">Scale</a></span> (<span class="symbol"><a name="ref_382_21" href="terminal_interface-curses-menus__adb.htm#ref_415_21">Men</a></span>     : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                    <span class="symbol"><a name="ref_383_21" href="terminal_interface-curses-menus__adb.htm#ref_416_21">Lines</a></span>   : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a>;
+                    <span class="symbol"><a name="ref_384_21" href="terminal_interface-curses-menus__adb.htm#ref_417_21">Columns</a></span> : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_win.3x.html">scale_menu()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-menus__ads.htm#ref_382_14">Scale</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/menu_cursor.3x.html">menu_cursor.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_28">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_393_14" href="terminal_interface-curses-menus__adb.htm#ref_431_14">Position_Cursor</a></span> (<span class="symbol"><a name="ref_393_31" href="terminal_interface-curses-menus__adb.htm#ref_431_31">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_cursor.3x.html">pos_menu_cursor()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-menus__ads.htm#ref_393_14">Position_Cursor</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/menu_mark.3x.html">menu_mark.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_29">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_402_14" href="terminal_interface-curses-menus__adb.htm#ref_441_14">Set_Mark</a></span> (<span class="symbol"><a name="ref_402_24" href="terminal_interface-curses-menus__adb.htm#ref_441_24">Men</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                       <span class="symbol"><a name="ref_403_24" href="terminal_interface-curses-menus__adb.htm#ref_442_24">Mark</a></span> : String);
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_mark.3x.html">set_menu_mark()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-menus__ads.htm#ref_402_14">Set_Mark</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_30">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_408_14" href="terminal_interface-curses-menus__adb.htm#ref_456_14">Mark</a></span> (<span class="symbol"><a name="ref_408_20" href="terminal_interface-curses-menus__adb.htm#ref_456_20">Men</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                   <span class="symbol"><a name="ref_409_20" href="terminal_interface-curses-menus__adb.htm#ref_457_20">Mark</a></span> : <b>out</b> String);
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_mark.3x.html">menu_mark()</A></em></span>
+
+   <b>function</b>  <span class="symbol"><a name="ref_412_14" href="terminal_interface-curses-menus__adb.htm#ref_465_13">Mark</a></span> (<span class="symbol"><a name="ref_412_20" href="terminal_interface-curses-menus__adb.htm#ref_465_19">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> String;
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_mark.3x.html">menu_mark()</A></em></span>
+   <span class="comment"><em>--  Implemented as function</em></span>
+   <b>pragma</b> Inline (Mark);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/menu_attributes.3x.html">menu_attributes.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_31">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_422_14" href="terminal_interface-curses-menus__adb.htm#ref_474_14">Set_Foreground</a></span>
+     (<span class="symbol"><a name="ref_423_7" href="terminal_interface-curses-menus__adb.htm#ref_475_7">Men</a></span>   : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+      <span class="symbol"><a name="ref_424_7" href="terminal_interface-curses-menus__adb.htm#ref_476_7">Fore</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a> := <a href="terminal_interface-curses__ads.htm#ref_486_4">Normal_Video</a>;
+      <span class="symbol"><a name="ref_425_7" href="terminal_interface-curses-menus__adb.htm#ref_477_7">Color</a></span> : <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a> := <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>'First);
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_attributes.3x.html">set_menu_fore()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-menus__ads.htm#ref_422_14">Set_Foreground</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_32">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_430_14" href="terminal_interface-curses-menus__adb.htm#ref_490_14">Foreground</a></span> (<span class="symbol"><a name="ref_430_26" href="terminal_interface-curses-menus__adb.htm#ref_490_26">Men</a></span>   : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                         <span class="symbol"><a name="ref_431_26" href="terminal_interface-curses-menus__adb.htm#ref_491_26">Fore</a></span>  : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_attributes.3x.html">menu_fore()</A></em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_33">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_435_14" href="terminal_interface-curses-menus__adb.htm#ref_499_14">Foreground</a></span> (<span class="symbol"><a name="ref_435_26" href="terminal_interface-curses-menus__adb.htm#ref_499_26">Men</a></span>   : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                         <span class="symbol"><a name="ref_436_26" href="terminal_interface-curses-menus__adb.htm#ref_500_26">Fore</a></span>  : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a>;
+                         <span class="symbol"><a name="ref_437_26" href="terminal_interface-curses-menus__adb.htm#ref_501_26">Color</a></span> : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_attributes.3x.html">menu_fore()</A></em></span>
+   <b>pragma</b> Inline (Foreground);
+
+   <span class="comment"><em>--  <A NAME="AFU_34">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_442_14" href="terminal_interface-curses-menus__adb.htm#ref_510_14">Set_Background</a></span>
+     (<span class="symbol"><a name="ref_443_7" href="terminal_interface-curses-menus__adb.htm#ref_511_7">Men</a></span>   : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+      <span class="symbol"><a name="ref_444_7" href="terminal_interface-curses-menus__adb.htm#ref_512_7">Back</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a> := <a href="terminal_interface-curses__ads.htm#ref_486_4">Normal_Video</a>;
+      <span class="symbol"><a name="ref_445_7" href="terminal_interface-curses-menus__adb.htm#ref_513_7">Color</a></span> : <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a> := <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>'First);
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_attributes.3x.html">set_menu_back()</A></em></span>
+   <b>pragma</b> Inline (Set_Background);
+
+   <span class="comment"><em>--  <A NAME="AFU_35">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_450_14" href="terminal_interface-curses-menus__adb.htm#ref_526_14">Background</a></span> (<span class="symbol"><a name="ref_450_26" href="terminal_interface-curses-menus__adb.htm#ref_526_26">Men</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                         <span class="symbol"><a name="ref_451_26" href="terminal_interface-curses-menus__adb.htm#ref_527_26">Back</a></span> : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_attributes.3x.html">menu_back()</A></em></span>
+   <span class="comment"><em>--  <A NAME="AFU_36">|</A></em></span>
+
+   <b>procedure</b> <span class="symbol"><a name="ref_455_14" href="terminal_interface-curses-menus__adb.htm#ref_535_14">Background</a></span> (<span class="symbol"><a name="ref_455_26" href="terminal_interface-curses-menus__adb.htm#ref_535_26">Men</a></span>   : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                         <span class="symbol"><a name="ref_456_26" href="terminal_interface-curses-menus__adb.htm#ref_536_26">Back</a></span>  : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a>;
+                         <span class="symbol"><a name="ref_457_26" href="terminal_interface-curses-menus__adb.htm#ref_537_26">Color</a></span> : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_attributes.3x.html">menu_back()</A></em></span>
+   <b>pragma</b> Inline (Background);
+
+   <span class="comment"><em>--  <A NAME="AFU_37">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_462_14" href="terminal_interface-curses-menus__adb.htm#ref_546_14">Set_Grey</a></span>
+     (<span class="symbol"><a name="ref_463_7" href="terminal_interface-curses-menus__adb.htm#ref_546_24">Men</a></span>   : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+      <span class="symbol"><a name="ref_464_7" href="terminal_interface-curses-menus__adb.htm#ref_547_24">Grey</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a> := <a href="terminal_interface-curses__ads.htm#ref_486_4">Normal_Video</a>;
+      <span class="symbol"><a name="ref_465_7" href="terminal_interface-curses-menus__adb.htm#ref_548_24">Color</a></span> : <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a> := <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>'First);
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_attributes.3x.html">set_menu_grey()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-menus__ads.htm#ref_462_14">Set_Grey</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_38">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_470_14" href="terminal_interface-curses-menus__adb.htm#ref_562_14">Grey</a></span> (<span class="symbol"><a name="ref_470_20" href="terminal_interface-curses-menus__adb.htm#ref_562_20">Men</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                   <span class="symbol"><a name="ref_471_20" href="terminal_interface-curses-menus__adb.htm#ref_563_20">Grey</a></span> : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_attributes.3x.html">menu_grey()</A></em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_39">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_475_14" href="terminal_interface-curses-menus__adb.htm#ref_571_14">Grey</a></span>
+     (<span class="symbol"><a name="ref_476_7" href="terminal_interface-curses-menus__adb.htm#ref_571_20">Men</a></span>   : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+      <span class="symbol"><a name="ref_477_7" href="terminal_interface-curses-menus__adb.htm#ref_572_20">Grey</a></span>  : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a>;
+      <span class="symbol"><a name="ref_478_7" href="terminal_interface-curses-menus__adb.htm#ref_573_20">Color</a></span> : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_attributes.3x.html">menu_grey()</A></em></span>
+   <b>pragma</b> Inline (Grey);
+
+   <span class="comment"><em>--  <A NAME="AFU_40">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_483_14" href="terminal_interface-curses-menus__adb.htm#ref_582_14">Set_Pad_Character</a></span> (<span class="symbol"><a name="ref_483_33" href="terminal_interface-curses-menus__adb.htm#ref_582_33">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                                <span class="symbol"><a name="ref_484_33" href="terminal_interface-curses-menus__adb.htm#ref_583_33">Pad</a></span> : Character := Space);
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_attributes.3x.html">set_menu_pad()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-menus__ads.htm#ref_483_14">Set_Pad_Character</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_41">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_489_14" href="terminal_interface-curses-menus__adb.htm#ref_593_14">Pad_Character</a></span> (<span class="symbol"><a name="ref_489_29" href="terminal_interface-curses-menus__adb.htm#ref_593_29">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                            <span class="symbol"><a name="ref_490_29" href="terminal_interface-curses-menus__adb.htm#ref_594_29">Pad</a></span> : <b>out</b> Character);
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_attributes.3x.html">menu_pad()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-menus__ads.htm#ref_489_14">Pad_Character</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/menu_spacing.3x.html">menu_spacing.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_42">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_499_14" href="terminal_interface-curses-menus__adb.htm#ref_602_14">Set_Spacing</a></span> (<span class="symbol"><a name="ref_499_27" href="terminal_interface-curses-menus__adb.htm#ref_602_27">Men</a></span>   : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                          <span class="symbol"><a name="ref_500_27" href="terminal_interface-curses-menus__adb.htm#ref_603_27">Descr</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a> := 0;
+                          <span class="symbol"><a name="ref_501_27" href="terminal_interface-curses-menus__adb.htm#ref_604_27">Row</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>   := 0;
+                          <span class="symbol"><a name="ref_502_27" href="terminal_interface-curses-menus__adb.htm#ref_605_27">Col</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a> := 0);
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_spacing.3x.html">set_menu_spacing()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-menus__ads.htm#ref_499_14">Set_Spacing</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_43">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_507_14" href="terminal_interface-curses-menus__adb.htm#ref_618_14">Spacing</a></span> (<span class="symbol"><a name="ref_507_23" href="terminal_interface-curses-menus__adb.htm#ref_618_23">Men</a></span>   : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                      <span class="symbol"><a name="ref_508_23" href="terminal_interface-curses-menus__adb.htm#ref_619_23">Descr</a></span> : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+                      <span class="symbol"><a name="ref_509_23" href="terminal_interface-curses-menus__adb.htm#ref_620_23">Row</a></span>   : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+                      <span class="symbol"><a name="ref_510_23" href="terminal_interface-curses-menus__adb.htm#ref_621_23">Col</a></span>   : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_spacing.3x.html">menu_spacing()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-menus__ads.htm#ref_507_14">Spacing</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/menu_pattern.3x.html">menu_pattern.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_44">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_519_13" href="terminal_interface-curses-menus__adb.htm#ref_639_13">Set_Pattern</a></span> (<span class="symbol"><a name="ref_519_26" href="terminal_interface-curses-menus__adb.htm#ref_639_26">Men</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                         <span class="symbol"><a name="ref_520_26" href="terminal_interface-curses-menus__adb.htm#ref_640_26">Text</a></span> : String) <b>return</b> Boolean;
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_pattern.3x.html">set_menu_pattern()</A></em></span>
+   <span class="comment"><em>--  Return TRUE if the pattern matches, FALSE otherwise</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-menus__ads.htm#ref_519_13">Set_Pattern</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_45">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_526_14" href="terminal_interface-curses-menus__adb.htm#ref_662_14">Pattern</a></span> (<span class="symbol"><a name="ref_526_23" href="terminal_interface-curses-menus__adb.htm#ref_662_23">Men</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                      <span class="symbol"><a name="ref_527_23" href="terminal_interface-curses-menus__adb.htm#ref_663_23">Text</a></span> : <b>out</b> String);
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_pattern.3x.html">menu_pattern()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-menus__ads.htm#ref_526_14">Pattern</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/menu_format.3x.html">menu_format.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_46">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_536_14" href="terminal_interface-curses-menus__adb.htm#ref_671_14">Set_Format</a></span> (<span class="symbol"><a name="ref_536_26" href="terminal_interface-curses-menus__adb.htm#ref_671_26">Men</a></span>     : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                         <span class="symbol"><a name="ref_537_26" href="terminal_interface-curses-menus__adb.htm#ref_672_26">Lines</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a>;
+                         <span class="symbol"><a name="ref_538_26" href="terminal_interface-curses-menus__adb.htm#ref_673_26">Columns</a></span> : <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a>);
+   <span class="comment"><em>--  Not implemented: 0 argument for Lines or Columns;</em></span>
+   <span class="comment"><em>--  instead use Format to get the current sizes</em></span>
+   <span class="comment"><em>--      The  default  format  is  16  rows,  1  column.    Calling</em></span>
+   <span class="comment"><em>--      set_menu_format  with a null menu pointer will change this</em></span>
+   <span class="comment"><em>--      default.  A zero row or column argument to set_menu_format</em></span>
+   <span class="comment"><em>--      is  interpreted  as  a  request  not to change the current</em></span>
+   <span class="comment"><em>--      value.</em></span>
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_format.3x.html">set_menu_format()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-menus__ads.htm#ref_536_14">Set_Format</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_47">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_550_14" href="terminal_interface-curses-menus__adb.htm#ref_687_14">Format</a></span> (<span class="symbol"><a name="ref_550_22" href="terminal_interface-curses-menus__adb.htm#ref_687_22">Men</a></span>     : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                     <span class="symbol"><a name="ref_551_22" href="terminal_interface-curses-menus__adb.htm#ref_688_22">Lines</a></span>   : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a>;
+                     <span class="symbol"><a name="ref_552_22" href="terminal_interface-curses-menus__adb.htm#ref_689_22">Columns</a></span> : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_format.3x.html">menu_format()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-menus__ads.htm#ref_550_14">Format</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/menu_hook.3x.html">menu_hook.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <b>type</b> <span class="symbol"><a name="ref_560_9">Menu_Hook_Function</a></span> <b>is</b> <b>access</b> <b>procedure</b> (<span class="symbol"><a name="ref_560_49">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>);
+   <b>pragma</b> Convention (C, <a href="terminal_interface-curses-menus__ads.htm#ref_560_9">Menu_Hook_Function</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_48">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_564_14" href="terminal_interface-curses-menus__adb.htm#ref_703_14">Set_Item_Init_Hook</a></span> (<span class="symbol"><a name="ref_564_34" href="terminal_interface-curses-menus__adb.htm#ref_703_34">Men</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                                 <span class="symbol"><a name="ref_565_34" href="terminal_interface-curses-menus__adb.htm#ref_704_34">Proc</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_560_9">Menu_Hook_Function</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_hook.3x.html">set_item_init()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-menus__ads.htm#ref_564_14">Set_Item_Init_Hook</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_49">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_570_14" href="terminal_interface-curses-menus__adb.htm#ref_714_14">Set_Item_Term_Hook</a></span> (<span class="symbol"><a name="ref_570_34" href="terminal_interface-curses-menus__adb.htm#ref_714_34">Men</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                                 <span class="symbol"><a name="ref_571_34" href="terminal_interface-curses-menus__adb.htm#ref_715_34">Proc</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_560_9">Menu_Hook_Function</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_hook.3x.html">set_item_term()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-menus__ads.htm#ref_570_14">Set_Item_Term_Hook</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_50">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_576_14" href="terminal_interface-curses-menus__adb.htm#ref_725_14">Set_Menu_Init_Hook</a></span> (<span class="symbol"><a name="ref_576_34" href="terminal_interface-curses-menus__adb.htm#ref_725_34">Men</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                                 <span class="symbol"><a name="ref_577_34" href="terminal_interface-curses-menus__adb.htm#ref_726_34">Proc</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_560_9">Menu_Hook_Function</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_hook.3x.html">set_menu_init()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-menus__ads.htm#ref_576_14">Set_Menu_Init_Hook</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_51">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_582_14" href="terminal_interface-curses-menus__adb.htm#ref_736_14">Set_Menu_Term_Hook</a></span> (<span class="symbol"><a name="ref_582_34" href="terminal_interface-curses-menus__adb.htm#ref_736_34">Men</a></span>  : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                                 <span class="symbol"><a name="ref_583_34" href="terminal_interface-curses-menus__adb.htm#ref_737_34">Proc</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_560_9">Menu_Hook_Function</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_hook.3x.html">set_menu_term()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-menus__ads.htm#ref_582_14">Set_Menu_Term_Hook</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_52">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_588_13" href="terminal_interface-curses-menus__adb.htm#ref_747_13">Get_Item_Init_Hook</a></span> (<span class="symbol"><a name="ref_588_33" href="terminal_interface-curses-menus__adb.htm#ref_747_33">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> <a href="terminal_interface-curses-menus__ads.htm#ref_560_9">Menu_Hook_Function</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_hook.3x.html">item_init()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-menus__ads.htm#ref_588_13">Get_Item_Init_Hook</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_53">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_593_13" href="terminal_interface-curses-menus__adb.htm#ref_755_13">Get_Item_Term_Hook</a></span> (<span class="symbol"><a name="ref_593_33" href="terminal_interface-curses-menus__adb.htm#ref_755_33">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> <a href="terminal_interface-curses-menus__ads.htm#ref_560_9">Menu_Hook_Function</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_hook.3x.html">item_term()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-menus__ads.htm#ref_593_13">Get_Item_Term_Hook</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_54">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_598_13" href="terminal_interface-curses-menus__adb.htm#ref_763_13">Get_Menu_Init_Hook</a></span> (<span class="symbol"><a name="ref_598_33" href="terminal_interface-curses-menus__adb.htm#ref_763_33">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> <a href="terminal_interface-curses-menus__ads.htm#ref_560_9">Menu_Hook_Function</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_hook.3x.html">menu_init()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-menus__ads.htm#ref_598_13">Get_Menu_Init_Hook</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_55">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_603_13" href="terminal_interface-curses-menus__adb.htm#ref_771_13">Get_Menu_Term_Hook</a></span> (<span class="symbol"><a name="ref_603_33" href="terminal_interface-curses-menus__adb.htm#ref_771_33">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> <a href="terminal_interface-curses-menus__ads.htm#ref_560_9">Menu_Hook_Function</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_hook.3x.html">menu_term()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-menus__ads.htm#ref_603_13">Get_Menu_Term_Hook</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/menu_items.3x.html">menu_items.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_56">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_612_14" href="terminal_interface-curses-menus__adb.htm#ref_779_14">Redefine</a></span> (<span class="symbol"><a name="ref_612_24" href="terminal_interface-curses-menus__adb.htm#ref_779_24">Men</a></span>   : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                       <span class="symbol"><a name="ref_613_24" href="terminal_interface-curses-menus__adb.htm#ref_780_24">Items</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_177_9">Item_Array_Access</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_items.3x.html">set_menu_items()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-menus__ads.htm#ref_612_14">Redefine</a>);
+
+   <b>procedure</b> <span class="symbol"><a name="ref_617_14">Set_Items</a></span> (<span class="symbol"><a name="ref_617_25">Men</a></span>   : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                        <span class="symbol"><a name="ref_618_25">Items</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_177_9">Item_Array_Access</a>) <b>renames</b> <a href="terminal_interface-curses-menus__ads.htm#ref_612_14">Redefine</a>;
+   <span class="comment"><em>--  pragma Inline (Set_Items);</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_57">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_622_13" href="terminal_interface-curses-menus__adb.htm#ref_803_13">Items</a></span> (<span class="symbol"><a name="ref_622_20" href="terminal_interface-curses-menus__adb.htm#ref_803_20">Men</a></span>   : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                   <span class="symbol"><a name="ref_623_20" href="terminal_interface-curses-menus__adb.htm#ref_804_20">Index</a></span> : Positive) <b>return</b> <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_items.3x.html">menu_items()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-menus__ads.htm#ref_622_13">Items</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_58">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_628_13" href="terminal_interface-curses-menus__adb.htm#ref_795_13">Item_Count</a></span> (<span class="symbol"><a name="ref_628_25" href="terminal_interface-curses-menus__adb.htm#ref_795_25">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>) <b>return</b> Natural;
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_items.3x.html">item_count()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-menus__ads.htm#ref_628_13">Item_Count</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/menu_new.3x.html">menu_new.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_59">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_637_13" href="terminal_interface-curses-menus__adb.htm#ref_822_13">Create</a></span> (<span class="symbol"><a name="ref_637_21" href="terminal_interface-curses-menus__adb.htm#ref_822_21">Items</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_177_9">Item_Array_Access</a>) <b>return</b> <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_new.3x.html">new_menu()</A></em></span>
+   <span class="comment"><em>--  Not inlined</em></span>
+
+   <b>function</b> New_Menu (<span class="symbol"><a name="ref_641_23">Items</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_177_9">Item_Array_Access</a>) <b>return</b> <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a> <b>renames</b> <a href="terminal_interface-curses-menus__ads.htm#ref_637_13">Create</a>;
+
+   <span class="comment"><em>--  <A NAME="AFU_60">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_644_14" href="terminal_interface-curses-menus__adb.htm#ref_841_14">Delete</a></span> (<span class="symbol"><a name="ref_644_22" href="terminal_interface-curses-menus__adb.htm#ref_841_22">Men</a></span> : <b>in</b> <b>out</b> <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_new.3x.html">free_menu()</A></em></span>
+   <span class="comment"><em>--  Reset Men to Null_Menu</em></span>
+   <span class="comment"><em>--  Not inlined</em></span>
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/menu_driver.3x.html">menu_driver.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <b>type</b> <span class="symbol"><a name="ref_653_9">Driver_Result</a></span> <b>is</b> (<span class="symbol"><a name="ref_653_27">Menu_Ok</a></span>,
+                          <span class="symbol"><a name="ref_654_27">Request_Denied</a></span>,
+                          <span class="symbol"><a name="ref_655_27">Unknown_Request</a></span>,
+                          <span class="symbol"><a name="ref_656_27">No_Match</a></span>);
+
+   <span class="comment"><em>--  <A NAME="AFU_61">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_659_13" href="terminal_interface-curses-menus__adb.htm#ref_852_13">Driver</a></span> (<span class="symbol"><a name="ref_659_21" href="terminal_interface-curses-menus__adb.htm#ref_852_21">Men</a></span> : <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>;
+                    <span class="symbol"><a name="ref_660_21" href="terminal_interface-curses-menus__adb.htm#ref_853_21">Key</a></span> : <a href="terminal_interface-curses__ads.htm#ref_67_9">Key_Code</a>) <b>return</b> <a href="terminal_interface-curses-menus__ads.htm#ref_653_9">Driver_Result</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/menu_driver.3x.html">menu_driver()</A></em></span>
+   <span class="comment"><em>--  Driver is not inlined</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_62">|</A></em></span>
+   <span class="comment"><em>--  Not Implemented: menu_request_name, menu_request_by_name</em></span>
+<span class="comment"><em>-------------------------------------------------------------------------------</em></span>
+<b>private</b>
+   <b>type</b> <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a>   <b>is</b> <b>new</b> System.Storage_Elements.Integer_Address;
+   <b>type</b> <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a>   <b>is</b> <b>new</b> System.Storage_Elements.Integer_Address;
+
+   <a href="terminal_interface-curses-menus__ads.htm#ref_58_4">Null_Item</a> : <b>constant</b> <a href="terminal_interface-curses-menus__ads.htm#ref_52_9">Item</a> := 0;
+   <a href="terminal_interface-curses-menus__ads.htm#ref_59_4">Null_Menu</a> : <b>constant</b> <a href="terminal_interface-curses-menus__ads.htm#ref_53_9">Menu</a> := 0;
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-menus__ads.htm#ref_46_35">Menus</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-mouse__adb.htm b/doc/html/ada/terminal_interface-curses-mouse__adb.htm
new file mode 100644
index 0000000..1a473a7
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-mouse__adb.htm
@@ -0,0 +1,236 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-mouse.adb</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-mouse.adb </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                     Terminal_Interface.Curses.Mouse                      --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 B O D Y                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2018,2020 Thomas E. Dickey                                     --</em></span>
+<span class="comment"><em>-- Copyright 1999-2009,2014 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.28 @</em></span>
+<span class="comment"><em>--  @Date: 2020/06/27 18:50:44 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>with</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>; <b>use</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>;
+<b>with</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C; <b>use</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C;
+<b>use</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>;
+
+<b>package</b> <b>body</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<span class="symbol"><a name="ref_47_40" href="terminal_interface-curses-mouse__ads.htm#ref_45_35">Mouse</a></span> <b>is</b>
+
+   <b>function</b> <span class="symbol"><a name="ref_49_13" href="terminal_interface-curses-mouse__ads.htm#ref_91_13">Has_Mouse</a></span> <b>return</b> Boolean
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_51_16">Mouse_Avail</a></span> <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Mouse_Avail, "has_mouse");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__ads.htm#ref_938_13">Has_Key</a> (<a href="terminal_interface-curses__ads.htm#ref_376_4">Key_Mouse</a>) <b>or</b> <b>else</b> <a href="terminal_interface-curses-mouse__adb.htm#ref_51_16">Mouse_Avail</a> /= 0 <b>then</b>
+         <b>return</b> True;
+      <b>else</b>
+         <b>return</b> False;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_91_13">Has_Mouse</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_61_13" href="terminal_interface-curses-mouse__ads.htm#ref_126_13">Get_Mouse</a></span> <b>return</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_85_9">Mouse_Event</a>
+   <b>is</b>
+      <b>type</b> <span class="symbol"><a name="ref_63_12">Event_Access</a></span> <b>is</b> <b>access</b> <b>all</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_85_9">Mouse_Event</a>;
+
+      <b>function</b> <span class="symbol"><a name="ref_65_16">Getmouse</a></span> (<span class="symbol"><a name="ref_65_26">Ev</a></span> : <a href="terminal_interface-curses-mouse__adb.htm#ref_63_12">Event_Access</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Getmouse, "getmouse");
+
+      <span class="symbol"><a name="ref_68_7">Event</a></span> : <b>aliased</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_85_9">Mouse_Event</a>;
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-mouse__adb.htm#ref_65_16">Getmouse</a> (<a href="terminal_interface-curses-mouse__adb.htm#ref_68_7">Event</a>'<b>Access</b>) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+      <b>return</b> <a href="terminal_interface-curses-mouse__adb.htm#ref_68_7">Event</a>;
+   <b>end</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_126_13">Get_Mouse</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_76_14" href="terminal_interface-curses-mouse__ads.htm#ref_94_14">Register_Reportable_Event</a></span> (<span class="symbol"><a name="ref_76_41" href="terminal_interface-curses-mouse__ads.htm#ref_95_7">Button</a></span> : <a href="terminal_interface-curses-mouse__ads.htm#ref_61_9">Mouse_Button</a>;
+                                        <span class="symbol"><a name="ref_77_41" href="terminal_interface-curses-mouse__ads.htm#ref_96_7">State</a></span>  : <a href="terminal_interface-curses-mouse__ads.htm#ref_72_9">Button_State</a>;
+                                        <span class="symbol"><a name="ref_78_41" href="terminal_interface-curses-mouse__ads.htm#ref_97_7">Mask</a></span>   : <b>in</b> <b>out</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_57_9">Event_Mask</a>)
+   <b>is</b>
+      <span class="symbol"><a name="ref_80_7">Button_Nr</a></span> : <b>constant</b> Natural := <a href="terminal_interface-curses-mouse__ads.htm#ref_61_9">Mouse_Button</a>'Pos (<a href="terminal_interface-curses-mouse__ads.htm#ref_95_7">Button</a>);
+      <span class="symbol"><a name="ref_81_7">State_Nr</a></span>  : <b>constant</b> Natural := <a href="terminal_interface-curses-mouse__ads.htm#ref_72_9">Button_State</a>'Pos (<a href="terminal_interface-curses-mouse__ads.htm#ref_96_7">State</a>);
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_95_7">Button</a> <b>in</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_70_12">Modifier_Keys</a> <b>and</b> <b>then</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_96_7">State</a> /= <a href="terminal_interface-curses-mouse__ads.htm#ref_73_26">Pressed</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>else</b>
+         <b>if</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_95_7">Button</a> <b>in</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_69_12">Real_Buttons</a> <b>then</b>
+            <a href="terminal_interface-curses-mouse__ads.htm#ref_97_7">Mask</a> := <a href="terminal_interface-curses-mouse__ads.htm#ref_97_7">Mask</a> <b>or</b> ((2 ** (6 * <a href="terminal_interface-curses-mouse__adb.htm#ref_80_7">Button_Nr</a>)) ** <a href="terminal_interface-curses-mouse__adb.htm#ref_81_7">State_Nr</a>);
+         <b>else</b>
+            <a href="terminal_interface-curses-mouse__ads.htm#ref_97_7">Mask</a> := <a href="terminal_interface-curses-mouse__ads.htm#ref_97_7">Mask</a> <b>or</b> (<a href="terminal_interface-curses-mouse__ads.htm#ref_190_4">BUTTON_CTRL</a> ** (<a href="terminal_interface-curses-mouse__adb.htm#ref_80_7">Button_Nr</a> - 4));
+         <b>end</b> <b>if</b>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_94_14">Register_Reportable_Event</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_94_14" href="terminal_interface-curses-mouse__ads.htm#ref_103_14">Register_Reportable_Events</a></span> (<span class="symbol"><a name="ref_94_42" href="terminal_interface-curses-mouse__ads.htm#ref_104_7">Button</a></span> : <a href="terminal_interface-curses-mouse__ads.htm#ref_61_9">Mouse_Button</a>;
+                                         <span class="symbol"><a name="ref_95_42" href="terminal_interface-curses-mouse__ads.htm#ref_105_7">State</a></span>  : Button_States;
+                                         <span class="symbol"><a name="ref_96_42" href="terminal_interface-curses-mouse__ads.htm#ref_106_7">Mask</a></span>   : <b>in</b> <b>out</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_57_9">Event_Mask</a>)
+   <b>is</b>
+   <b>begin</b>
+      <b>for</b> <span class="symbol"><a name="ref_99_11">S</a></span> <b>in</b> Button_States'<b>Range</b> <b>loop</b>
+         <b>if</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_105_7">State</a> (<a href="terminal_interface-curses-mouse__adb.htm#ref_99_11">S</a>) <b>then</b>
+            <a href="terminal_interface-curses-mouse__ads.htm#ref_94_14">Register_Reportable_Event</a> (<a href="terminal_interface-curses-mouse__ads.htm#ref_104_7">Button</a>, <a href="terminal_interface-curses-mouse__adb.htm#ref_99_11">S</a>, <a href="terminal_interface-curses-mouse__ads.htm#ref_106_7">Mask</a>);
+         <b>end</b> <b>if</b>;
+      <b>end</b> <b>loop</b>;
+   <b>end</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_103_14">Register_Reportable_Events</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_106_13" href="terminal_interface-curses-mouse__ads.htm#ref_116_13">Start_Mouse</a></span> (<span class="symbol"><a name="ref_106_26" href="terminal_interface-curses-mouse__ads.htm#ref_116_26">Mask</a></span> : <a href="terminal_interface-curses-mouse__ads.htm#ref_57_9">Event_Mask</a> := <a href="terminal_interface-curses-mouse__ads.htm#ref_59_4">All_Events</a>)
+                         <b>return</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_57_9">Event_Mask</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_109_16">MMask</a></span> (<span class="symbol"><a name="ref_109_23">M</a></span> : <a href="terminal_interface-curses-mouse__ads.htm#ref_57_9">Event_Mask</a>;
+                      <span class="symbol"><a name="ref_110_23">O</a></span> : <b>access</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_57_9">Event_Mask</a>) <b>return</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_57_9">Event_Mask</a>;
+      <b>pragma</b> Import (C, MMask, "mousemask");
+      <span class="symbol"><a name="ref_112_7">R</a></span>   : <a href="terminal_interface-curses-mouse__ads.htm#ref_57_9">Event_Mask</a>;
+      <span class="symbol"><a name="ref_113_7">Old</a></span> : <b>aliased</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_57_9">Event_Mask</a>;
+   <b>begin</b>
+      <a href="terminal_interface-curses-mouse__adb.htm#ref_112_7">R</a> := <a href="terminal_interface-curses-mouse__adb.htm#ref_109_16">MMask</a> (<a href="terminal_interface-curses-mouse__ads.htm#ref_116_26">Mask</a>, <a href="terminal_interface-curses-mouse__adb.htm#ref_113_7">Old</a>'<b>Access</b>);
+      <b>if</b> <a href="terminal_interface-curses-mouse__adb.htm#ref_112_7">R</a> = <a href="terminal_interface-curses-mouse__ads.htm#ref_58_4">No_Events</a> <b>then</b>
+         <a href="terminal_interface-curses__ads.htm#ref_1041_14">Beep</a>;
+      <b>end</b> <b>if</b>;
+      <b>return</b> <a href="terminal_interface-curses-mouse__adb.htm#ref_113_7">Old</a>;
+   <b>end</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_116_13">Start_Mouse</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_122_14" href="terminal_interface-curses-mouse__ads.htm#ref_121_14">End_Mouse</a></span> (<span class="symbol"><a name="ref_122_25" href="terminal_interface-curses-mouse__ads.htm#ref_121_25">Mask</a></span> : <a href="terminal_interface-curses-mouse__ads.htm#ref_57_9">Event_Mask</a> := <a href="terminal_interface-curses-mouse__ads.htm#ref_58_4">No_Events</a>)
+   <b>is</b>
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_121_25">Mask</a> /= <a href="terminal_interface-curses-mouse__ads.htm#ref_58_4">No_Events</a> <b>then</b>
+         <a href="terminal_interface-curses__ads.htm#ref_1041_14">Beep</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_121_14">End_Mouse</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_130_14" href="terminal_interface-curses-mouse__adb.htm#ref_134_14">Dispatch_Event</a></span> (<span class="symbol"><a name="ref_130_30" href="terminal_interface-curses-mouse__adb.htm#ref_134_30">Mask</a></span>   : <a href="terminal_interface-curses-mouse__ads.htm#ref_57_9">Event_Mask</a>;
+                             <span class="symbol"><a name="ref_131_30" href="terminal_interface-curses-mouse__adb.htm#ref_135_30">Button</a></span> : <b>out</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_61_9">Mouse_Button</a>;
+                             <span class="symbol"><a name="ref_132_30" href="terminal_interface-curses-mouse__adb.htm#ref_136_30">State</a></span>  : <b>out</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_72_9">Button_State</a>);
+
+   <b>procedure</b> <span class="symbol"><a name="ref_134_14" href="terminal_interface-curses-mouse__adb.htm#ref_130_14">Dispatch_Event</a></span> (<span class="symbol"><a name="ref_134_30" href="terminal_interface-curses-mouse__adb.htm#ref_130_30">Mask</a></span>   : <a href="terminal_interface-curses-mouse__ads.htm#ref_57_9">Event_Mask</a>;
+                             <span class="symbol"><a name="ref_135_30" href="terminal_interface-curses-mouse__adb.htm#ref_131_30">Button</a></span> : <b>out</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_61_9">Mouse_Button</a>;
+                             <span class="symbol"><a name="ref_136_30" href="terminal_interface-curses-mouse__adb.htm#ref_132_30">State</a></span>  : <b>out</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_72_9">Button_State</a>) <b>is</b>
+      <span class="symbol"><a name="ref_137_7">L</a></span> : <a href="terminal_interface-curses-mouse__ads.htm#ref_57_9">Event_Mask</a>;
+   <b>begin</b>
+      <a href="terminal_interface-curses-mouse__adb.htm#ref_131_30">Button</a> := <a href="terminal_interface-curses-mouse__ads.htm#ref_67_26">Alt</a>;  <span class="comment"><em>--  preset to non real button;</em></span>
+      <b>if</b> (<a href="terminal_interface-curses-mouse__adb.htm#ref_130_30">Mask</a> <b>and</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_193_4">BUTTON1_EVENTS</a>) /= 0 <b>then</b>
+         <a href="terminal_interface-curses-mouse__adb.htm#ref_131_30">Button</a> := <a href="terminal_interface-curses-mouse__ads.htm#ref_61_26">Left</a>;
+      <b>elsif</b> (<a href="terminal_interface-curses-mouse__adb.htm#ref_130_30">Mask</a> <b>and</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_195_4">BUTTON2_EVENTS</a>) /= 0 <b>then</b>
+         <a href="terminal_interface-curses-mouse__adb.htm#ref_131_30">Button</a> := <a href="terminal_interface-curses-mouse__ads.htm#ref_62_26">Middle</a>;
+      <b>elsif</b> (<a href="terminal_interface-curses-mouse__adb.htm#ref_130_30">Mask</a> <b>and</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_197_4">BUTTON3_EVENTS</a>) /= 0 <b>then</b>
+         <a href="terminal_interface-curses-mouse__adb.htm#ref_131_30">Button</a> := <a href="terminal_interface-curses-mouse__ads.htm#ref_63_26">Right</a>;
+      <b>elsif</b> (<a href="terminal_interface-curses-mouse__adb.htm#ref_130_30">Mask</a> <b>and</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_199_4">BUTTON4_EVENTS</a>) /= 0 <b>then</b>
+         <a href="terminal_interface-curses-mouse__adb.htm#ref_131_30">Button</a> := <a href="terminal_interface-curses-mouse__ads.htm#ref_64_26">Button4</a>;
+      <b>end</b> <b>if</b>;
+      <b>if</b> <a href="terminal_interface-curses-mouse__adb.htm#ref_131_30">Button</a> <b>in</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_69_12">Real_Buttons</a> <b>then</b>
+         <a href="terminal_interface-curses-mouse__adb.htm#ref_132_30">State</a> := <a href="terminal_interface-curses-mouse__ads.htm#ref_72_26">Released</a>;  <span class="comment"><em>--  preset to non real button;</em></span>
+         <a href="terminal_interface-curses-mouse__adb.htm#ref_137_7">L</a> := 2 ** (6 * <a href="terminal_interface-curses-mouse__ads.htm#ref_61_9">Mouse_Button</a>'Pos (<a href="terminal_interface-curses-mouse__adb.htm#ref_131_30">Button</a>));
+         <b>for</b> <span class="symbol"><a name="ref_152_14">I</a></span> <b>in</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_72_9">Button_State</a>'<b>Range</b> <b>loop</b>
+            <b>if</b> (<a href="terminal_interface-curses-mouse__adb.htm#ref_130_30">Mask</a> <b>and</b> <a href="terminal_interface-curses-mouse__adb.htm#ref_137_7">L</a>) /= 0 <b>then</b>
+               <a href="terminal_interface-curses-mouse__adb.htm#ref_132_30">State</a> := <a href="terminal_interface-curses-mouse__adb.htm#ref_152_14">I</a>;
+               <b>exit</b>;
+            <b>end</b> <b>if</b>;
+            <a href="terminal_interface-curses-mouse__adb.htm#ref_137_7">L</a> := 2 * <a href="terminal_interface-curses-mouse__adb.htm#ref_137_7">L</a>;
+         <b>end</b> <b>loop</b>;
+      <b>else</b>
+         <a href="terminal_interface-curses-mouse__adb.htm#ref_132_30">State</a> := <a href="terminal_interface-curses-mouse__ads.htm#ref_73_26">Pressed</a>;
+         <b>if</b> (<a href="terminal_interface-curses-mouse__adb.htm#ref_130_30">Mask</a> <b>and</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_190_4">BUTTON_CTRL</a>) /= 0 <b>then</b>
+            <a href="terminal_interface-curses-mouse__adb.htm#ref_131_30">Button</a> := <a href="terminal_interface-curses-mouse__ads.htm#ref_65_26">Control</a>;
+         <b>elsif</b> (<a href="terminal_interface-curses-mouse__adb.htm#ref_130_30">Mask</a> <b>and</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_191_4">BUTTON_SHIFT</a>) /= 0 <b>then</b>
+            <a href="terminal_interface-curses-mouse__adb.htm#ref_131_30">Button</a> := <a href="terminal_interface-curses-mouse__ads.htm#ref_66_26">Shift</a>;
+         <b>elsif</b> (<a href="terminal_interface-curses-mouse__adb.htm#ref_130_30">Mask</a> <b>and</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_192_4">BUTTON_ALT</a>) /= 0 <b>then</b>
+            <a href="terminal_interface-curses-mouse__adb.htm#ref_131_30">Button</a> := <a href="terminal_interface-curses-mouse__ads.htm#ref_67_26">Alt</a>;
+         <b>end</b> <b>if</b>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-mouse__adb.htm#ref_130_14">Dispatch_Event</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_171_14" href="terminal_interface-curses-mouse__ads.htm#ref_130_14">Get_Event</a></span> (<span class="symbol"><a name="ref_171_25" href="terminal_interface-curses-mouse__ads.htm#ref_130_25">Event</a></span>  : <a href="terminal_interface-curses-mouse__ads.htm#ref_85_9">Mouse_Event</a>;
+                        <span class="symbol"><a name="ref_172_25" href="terminal_interface-curses-mouse__ads.htm#ref_131_25">Y</a></span>      : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+                        <span class="symbol"><a name="ref_173_25" href="terminal_interface-curses-mouse__ads.htm#ref_132_25">X</a></span>      : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+                        <span class="symbol"><a name="ref_174_25" href="terminal_interface-curses-mouse__ads.htm#ref_133_25">Button</a></span> : <b>out</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_61_9">Mouse_Button</a>;
+                        <span class="symbol"><a name="ref_175_25" href="terminal_interface-curses-mouse__ads.htm#ref_134_25">State</a></span>  : <b>out</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_72_9">Button_State</a>)
+   <b>is</b>
+      <span class="symbol"><a name="ref_177_7">Mask</a></span>  : <b>constant</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_57_9">Event_Mask</a> := <a href="terminal_interface-curses-mouse__ads.htm#ref_130_25">Event</a>.<a href="terminal_interface-curses-mouse__ads.htm#ref_170_10">Bstate</a>;
+   <b>begin</b>
+      <a href="terminal_interface-curses-mouse__ads.htm#ref_132_25">X</a> := <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a> (<a href="terminal_interface-curses-mouse__ads.htm#ref_130_25">Event</a>.<a href="terminal_interface-curses-mouse__ads.htm#ref_168_10">X</a>);
+      <a href="terminal_interface-curses-mouse__ads.htm#ref_131_25">Y</a> := <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>   (<a href="terminal_interface-curses-mouse__ads.htm#ref_130_25">Event</a>.<a href="terminal_interface-curses-mouse__ads.htm#ref_168_13">Y</a>);
+      <a href="terminal_interface-curses-mouse__adb.htm#ref_130_14">Dispatch_Event</a> (<a href="terminal_interface-curses-mouse__adb.htm#ref_177_7">Mask</a>, <a href="terminal_interface-curses-mouse__ads.htm#ref_133_25">Button</a>, <a href="terminal_interface-curses-mouse__ads.htm#ref_134_25">State</a>);
+   <b>end</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_130_14">Get_Event</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_184_14" href="terminal_interface-curses-mouse__ads.htm#ref_142_14">Unget_Mouse</a></span> (<span class="symbol"><a name="ref_184_27" href="terminal_interface-curses-mouse__ads.htm#ref_142_27">Event</a></span> : <a href="terminal_interface-curses-mouse__ads.htm#ref_85_9">Mouse_Event</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_186_16">Ungetmouse</a></span> (<span class="symbol"><a name="ref_186_28">Ev</a></span> : <a href="terminal_interface-curses-mouse__ads.htm#ref_85_9">Mouse_Event</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Ungetmouse, "ungetmouse");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-mouse__adb.htm#ref_186_16">Ungetmouse</a> (<a href="terminal_interface-curses-mouse__ads.htm#ref_142_27">Event</a>) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_142_14">Unget_Mouse</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_194_13" href="terminal_interface-curses-mouse__ads.htm#ref_147_13">Enclosed_In_Window</a></span> (<span class="symbol"><a name="ref_194_33" href="terminal_interface-curses-mouse__ads.htm#ref_147_33">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                                <span class="symbol"><a name="ref_195_33" href="terminal_interface-curses-mouse__ads.htm#ref_148_33">Event</a></span>  : <a href="terminal_interface-curses-mouse__ads.htm#ref_85_9">Mouse_Event</a>) <b>return</b> Boolean
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_197_16">Wenclose</a></span> (<span class="symbol"><a name="ref_197_26">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>; <span class="symbol"><a name="ref_197_40">Y</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>; <span class="symbol"><a name="ref_197_51">X</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>)
+                         <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>;
+      <b>pragma</b> Import (C, Wenclose, "wenclose");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-mouse__adb.htm#ref_197_16">Wenclose</a> (<a href="terminal_interface-curses-mouse__ads.htm#ref_147_33">Win</a>, <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses-mouse__ads.htm#ref_148_33">Event</a>.<a href="terminal_interface-curses-mouse__ads.htm#ref_168_13">Y</a>), <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses-mouse__ads.htm#ref_148_33">Event</a>.<a href="terminal_interface-curses-mouse__ads.htm#ref_168_10">X</a>))
+        = <a href="terminal_interface-curses__ads.htm#ref_2101_4">Curses_Bool_False</a>
+      <b>then</b>
+         <b>return</b> False;
+      <b>else</b>
+         <b>return</b> True;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_147_13">Enclosed_In_Window</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_210_13" href="terminal_interface-curses-mouse__ads.htm#ref_154_13">Mouse_Interval</a></span> (<span class="symbol"><a name="ref_210_29" href="terminal_interface-curses-mouse__ads.htm#ref_154_29">Msec</a></span> : Natural := 200) <b>return</b> Natural
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_212_16">Mouseinterval</a></span> (<span class="symbol"><a name="ref_212_31">Msec</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Mouseinterval, "mouseinterval");
+   <b>begin</b>
+      <b>return</b> Natural (<a href="terminal_interface-curses-mouse__adb.htm#ref_212_16">Mouseinterval</a> (<a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses-mouse__ads.htm#ref_154_29">Msec</a>)));
+   <b>end</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_154_13">Mouse_Interval</a>;
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-mouse__ads.htm#ref_45_35">Mouse</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-mouse__ads.htm b/doc/html/ada/terminal_interface-curses-mouse__ads.htm
new file mode 100644
index 0000000..5ed20a8
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-mouse__ads.htm
@@ -0,0 +1,223 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-mouse.ads</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-mouse.ads </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                      Terminal_Interface.Curses.Mouse                     --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 S P E C                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1998-2014,2015 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.33 @</em></span>
+<span class="comment"><em>--  @Date: 2020/02/02 23:34:34 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>with</b> System;
+
+<b>package</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<span class="symbol"><a name="ref_45_35" href="terminal_interface-curses-mouse__adb.htm#ref_47_40">Mouse</a></span> <b>is</b>
+   <b>pragma</b> Preelaborate (<a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-mouse__ads.htm#ref_45_35">Mouse</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/curs_mouse.3x.html">curs_mouse.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  mouse_trafo, wmouse_trafo are implemented as Transform_Coordinates</em></span>
+   <span class="comment"><em>--  in the parent package.</em></span>
+   <span class="comment"><em>--</em></span>
+   <span class="comment"><em>--  Not implemented:</em></span>
+   <span class="comment"><em>--  REPORT_MOUSE_POSITION (i.e. as a parameter to Register_Reportable_Event</em></span>
+   <span class="comment"><em>--  or Start_Mouse)</em></span>
+   <b>type</b> <span class="symbol"><a name="ref_57_9">Event_Mask</a></span> <b>is</b> <b>private</b>;
+   <span class="symbol"><a name="ref_58_4">No_Events</a></span>  : <b>constant</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_57_9">Event_Mask</a>;
+   <span class="symbol"><a name="ref_59_4">All_Events</a></span> : <b>constant</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_57_9">Event_Mask</a>;
+
+   <b>type</b> <span class="symbol"><a name="ref_61_9">Mouse_Button</a></span> <b>is</b> (<span class="symbol"><a name="ref_61_26">Left</a></span>,     <span class="comment"><em>-- aka: Button 1</em></span>
+                         <span class="symbol"><a name="ref_62_26">Middle</a></span>,   <span class="comment"><em>-- aka: Button 2</em></span>
+                         <span class="symbol"><a name="ref_63_26">Right</a></span>,    <span class="comment"><em>-- aka: Button 3</em></span>
+                         <span class="symbol"><a name="ref_64_26">Button4</a></span>,  <span class="comment"><em>-- aka: Button 4</em></span>
+                         <span class="symbol"><a name="ref_65_26">Control</a></span>,  <span class="comment"><em>-- Control Key</em></span>
+                         <span class="symbol"><a name="ref_66_26">Shift</a></span>,    <span class="comment"><em>-- Shift Key</em></span>
+                         <span class="symbol"><a name="ref_67_26">Alt</a></span>);     <span class="comment"><em>-- ALT Key</em></span>
+
+   <b>subtype</b> <span class="symbol"><a name="ref_69_12">Real_Buttons</a></span>  <b>is</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_61_9">Mouse_Button</a> <b>range</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_61_26">Left</a> .. <a href="terminal_interface-curses-mouse__ads.htm#ref_64_26">Button4</a>;
+   <b>subtype</b> <span class="symbol"><a name="ref_70_12">Modifier_Keys</a></span> <b>is</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_61_9">Mouse_Button</a> <b>range</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_65_26">Control</a> .. <a href="terminal_interface-curses-mouse__ads.htm#ref_67_26">Alt</a>;
+
+   <b>type</b> <span class="symbol"><a name="ref_72_9">Button_State</a></span> <b>is</b> (<span class="symbol"><a name="ref_72_26">Released</a></span>,
+                         <span class="symbol"><a name="ref_73_26">Pressed</a></span>,
+                         <span class="symbol"><a name="ref_74_26">Clicked</a></span>,
+                         <span class="symbol"><a name="ref_75_26">Double_Clicked</a></span>,
+                         <span class="symbol"><a name="ref_76_26">Triple_Clicked</a></span>);
+
+   <b>type</b> Button_States <b>is</b> <b>array</b> (<a href="terminal_interface-curses-mouse__ads.htm#ref_72_9">Button_State</a>) <b>of</b> Boolean;
+   <b>pragma</b> Pack (Button_States);
+
+   <span class="symbol"><a name="ref_81_4">All_Clicks</a></span> : <b>constant</b> Button_States := (<a href="terminal_interface-curses-mouse__ads.htm#ref_74_26">Clicked</a> .. <a href="terminal_interface-curses-mouse__ads.htm#ref_76_26">Triple_Clicked</a> =&gt; True,
+                                           <b>others</b> =&gt; False);
+   <span class="symbol"><a name="ref_83_4">All_States</a></span> : <b>constant</b> Button_States := (<b>others</b> =&gt; True);
+
+   <b>type</b> <span class="symbol"><a name="ref_85_9">Mouse_Event</a></span> <b>is</b> <b>private</b>;
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/curs_mouse.3x.html">curs_mouse.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <b>function</b> <span class="symbol"><a name="ref_91_13" href="terminal_interface-curses-mouse__adb.htm#ref_49_13">Has_Mouse</a></span> <b>return</b> Boolean;
+   <span class="comment"><em>--  Return true if a mouse device is supported, false otherwise.</em></span>
+
+   <b>procedure</b> <span class="symbol"><a name="ref_94_14" href="terminal_interface-curses-mouse__adb.htm#ref_76_14">Register_Reportable_Event</a></span>
+     (<span class="symbol"><a name="ref_95_7" href="terminal_interface-curses-mouse__adb.htm#ref_76_41">Button</a></span> : <a href="terminal_interface-curses-mouse__ads.htm#ref_61_9">Mouse_Button</a>;
+      <span class="symbol"><a name="ref_96_7" href="terminal_interface-curses-mouse__adb.htm#ref_77_41">State</a></span>  : <a href="terminal_interface-curses-mouse__ads.htm#ref_72_9">Button_State</a>;
+      <span class="symbol"><a name="ref_97_7" href="terminal_interface-curses-mouse__adb.htm#ref_78_41">Mask</a></span>   : <b>in</b> <b>out</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_57_9">Event_Mask</a>);
+   <span class="comment"><em>--  Stores the event described by the button and the state in the mask.</em></span>
+   <span class="comment"><em>--  Before you call this the first time, you should initialize the mask</em></span>
+   <span class="comment"><em>--  with the Empty_Mask constant</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-mouse__ads.htm#ref_94_14">Register_Reportable_Event</a>);
+
+   <b>procedure</b> <span class="symbol"><a name="ref_103_14" href="terminal_interface-curses-mouse__adb.htm#ref_94_14">Register_Reportable_Events</a></span>
+     (<span class="symbol"><a name="ref_104_7" href="terminal_interface-curses-mouse__adb.htm#ref_94_42">Button</a></span> : <a href="terminal_interface-curses-mouse__ads.htm#ref_61_9">Mouse_Button</a>;
+      <span class="symbol"><a name="ref_105_7" href="terminal_interface-curses-mouse__adb.htm#ref_95_42">State</a></span>  : Button_States;
+      <span class="symbol"><a name="ref_106_7" href="terminal_interface-curses-mouse__adb.htm#ref_96_42">Mask</a></span>   : <b>in</b> <b>out</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_57_9">Event_Mask</a>);
+   <span class="comment"><em>--  Register all events described by the Button and the State bitmap.</em></span>
+   <span class="comment"><em>--  Before you call this the first time, you should initialize the mask</em></span>
+   <span class="comment"><em>--  with the Empty_Mask constant</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_1">|</A></em></span>
+   <span class="comment"><em>--  There is one difference to mousmask(): we return the value of the</em></span>
+   <span class="comment"><em>--  old mask, that means the event mask value before this call.</em></span>
+   <span class="comment"><em>--  Not Implemented: The library version</em></span>
+   <span class="comment"><em>--  returns a Mouse_Mask that tells which events are reported.</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_116_13" href="terminal_interface-curses-mouse__adb.htm#ref_106_13">Start_Mouse</a></span> (<span class="symbol"><a name="ref_116_26" href="terminal_interface-curses-mouse__adb.htm#ref_106_26">Mask</a></span> : <a href="terminal_interface-curses-mouse__ads.htm#ref_57_9">Event_Mask</a> := <a href="terminal_interface-curses-mouse__ads.htm#ref_59_4">All_Events</a>)
+                         <b>return</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_57_9">Event_Mask</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_mouse.3x.html">mousemask()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-mouse__ads.htm#ref_116_13">Start_Mouse</a>);
+
+   <b>procedure</b> <span class="symbol"><a name="ref_121_14" href="terminal_interface-curses-mouse__adb.htm#ref_122_14">End_Mouse</a></span> (<span class="symbol"><a name="ref_121_25" href="terminal_interface-curses-mouse__adb.htm#ref_122_25">Mask</a></span> : <a href="terminal_interface-curses-mouse__ads.htm#ref_57_9">Event_Mask</a> := <a href="terminal_interface-curses-mouse__ads.htm#ref_58_4">No_Events</a>);
+   <span class="comment"><em>--  Terminates the mouse, restores the specified event mask</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-mouse__ads.htm#ref_121_14">End_Mouse</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_2">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_126_13" href="terminal_interface-curses-mouse__adb.htm#ref_61_13">Get_Mouse</a></span> <b>return</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_85_9">Mouse_Event</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_mouse.3x.html">getmouse()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-mouse__ads.htm#ref_126_13">Get_Mouse</a>);
+
+   <b>procedure</b> <span class="symbol"><a name="ref_130_14" href="terminal_interface-curses-mouse__adb.htm#ref_171_14">Get_Event</a></span> (<span class="symbol"><a name="ref_130_25" href="terminal_interface-curses-mouse__adb.htm#ref_171_25">Event</a></span>  : <a href="terminal_interface-curses-mouse__ads.htm#ref_85_9">Mouse_Event</a>;
+                        <span class="symbol"><a name="ref_131_25" href="terminal_interface-curses-mouse__adb.htm#ref_172_25">Y</a></span>      : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+                        <span class="symbol"><a name="ref_132_25" href="terminal_interface-curses-mouse__adb.htm#ref_173_25">X</a></span>      : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+                        <span class="symbol"><a name="ref_133_25" href="terminal_interface-curses-mouse__adb.htm#ref_174_25">Button</a></span> : <b>out</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_61_9">Mouse_Button</a>;
+                        <span class="symbol"><a name="ref_134_25" href="terminal_interface-curses-mouse__adb.htm#ref_175_25">State</a></span>  : <b>out</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_72_9">Button_State</a>);
+   <span class="comment"><em>--  !!! Warning: X and Y are screen coordinates. Due to ripped of lines they</em></span>
+   <span class="comment"><em>--  may not be identical to window coordinates.</em></span>
+   <span class="comment"><em>--  Not Implemented: Get_Event only reports one event, the C library</em></span>
+   <span class="comment"><em>--  version supports multiple events, e.g. {click-1, click-3}</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-mouse__ads.htm#ref_130_14">Get_Event</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_3">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_142_14" href="terminal_interface-curses-mouse__adb.htm#ref_184_14">Unget_Mouse</a></span> (<span class="symbol"><a name="ref_142_27" href="terminal_interface-curses-mouse__adb.htm#ref_184_27">Event</a></span> : <a href="terminal_interface-curses-mouse__ads.htm#ref_85_9">Mouse_Event</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_mouse.3x.html">ungetmouse()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-mouse__ads.htm#ref_142_14">Unget_Mouse</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_4">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_147_13" href="terminal_interface-curses-mouse__adb.htm#ref_194_13">Enclosed_In_Window</a></span> (<span class="symbol"><a name="ref_147_33" href="terminal_interface-curses-mouse__adb.htm#ref_194_33">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                                <span class="symbol"><a name="ref_148_33" href="terminal_interface-curses-mouse__adb.htm#ref_195_33">Event</a></span>  : <a href="terminal_interface-curses-mouse__ads.htm#ref_85_9">Mouse_Event</a>) <b>return</b> Boolean;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_mouse.3x.html">wenclose()</A></em></span>
+   <span class="comment"><em>--  But : use event instead of screen coordinates.</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-mouse__ads.htm#ref_147_13">Enclosed_In_Window</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_5">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_154_13" href="terminal_interface-curses-mouse__adb.htm#ref_210_13">Mouse_Interval</a></span> (<span class="symbol"><a name="ref_154_29" href="terminal_interface-curses-mouse__adb.htm#ref_210_29">Msec</a></span> : Natural := 200) <b>return</b> Natural;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_mouse.3x.html">mouseinterval()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-mouse__ads.htm#ref_154_13">Mouse_Interval</a>);
+
+<b>private</b>
+   <span class="comment"><em>--  This can be as little as 32 bits (unsigned), or as long as the system's</em></span>
+   <span class="comment"><em>--  unsigned long.  Declare it as the minimum size to handle all valid</em></span>
+   <span class="comment"><em>--  sizes.</em></span>
+   <b>type</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_57_9">Event_Mask</a> <b>is</b> <b>mod</b> 4294967296;
+
+   <b>type</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_85_9">Mouse_Event</a> <b>is</b>
+      <b>record</b>
+         <span class="symbol"><a name="ref_166_10">Id</a></span>      : Integer <b>range</b> Integer (<a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.short'First) ..
+                                 Integer (<a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.short'Last);
+         <span class="symbol"><a name="ref_168_10">X</a></span>, <span class="symbol"><a name="ref_168_13">Y</a></span>, <span class="symbol"><a name="ref_168_16">Z</a></span> : Integer <b>range</b> Integer (<a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.int'First) ..
+                                 Integer (<a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.int'Last);
+         <span class="symbol"><a name="ref_170_10">Bstate</a></span>  : <a href="terminal_interface-curses-mouse__ads.htm#ref_57_9">Event_Mask</a>;
+      <b>end</b> <b>record</b>;
+   <b>pragma</b> Convention (C, <a href="terminal_interface-curses-mouse__ads.htm#ref_85_9">Mouse_Event</a>);
+
+   <b>for</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_85_9">Mouse_Event</a> <b>use</b>
+      <b>record</b>
+         <a href="terminal_interface-curses-mouse__ads.htm#ref_166_10">Id</a>     <b>at</b> 0 <b>range</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_310_4">MEVENT_id_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_311_4">MEVENT_id_Last</a>;
+         <a href="terminal_interface-curses-mouse__ads.htm#ref_168_10">X</a>      <b>at</b> 0 <b>range</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_312_4">MEVENT_x_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_313_4">MEVENT_x_Last</a>;
+         <a href="terminal_interface-curses-mouse__ads.htm#ref_168_13">Y</a>      <b>at</b> 0 <b>range</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_314_4">MEVENT_y_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_315_4">MEVENT_y_Last</a>;
+         <a href="terminal_interface-curses-mouse__ads.htm#ref_168_16">Z</a>      <b>at</b> 0 <b>range</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_316_4">MEVENT_z_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_317_4">MEVENT_z_Last</a>;
+         <a href="terminal_interface-curses-mouse__ads.htm#ref_170_10">Bstate</a> <b>at</b> 0 <b>range</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_318_4">MEVENT_bstate_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_319_4">MEVENT_bstate_Last</a>;
+      <b>end</b> <b>record</b>;
+   <b>for</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_85_9">Mouse_Event</a>'Size <b>use</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_320_4">MEVENT_Size</a>;
+   Generation_Bit_Order : System.Bit_Order <b>renames</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_10_4">Bit_Order</a>;
+
+   <span class="symbol"><a name="ref_190_4">BUTTON_CTRL</a></span>      : <b>constant</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_57_9">Event_Mask</a> := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_348_4">BUTTON_CTRL</a>;
+   <span class="symbol"><a name="ref_191_4">BUTTON_SHIFT</a></span>     : <b>constant</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_57_9">Event_Mask</a> := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_349_4">BUTTON_SHIFT</a>;
+   <span class="symbol"><a name="ref_192_4">BUTTON_ALT</a></span>       : <b>constant</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_57_9">Event_Mask</a> := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_350_4">BUTTON_ALT</a>;
+   <span class="symbol"><a name="ref_193_4">BUTTON1_EVENTS</a></span>   : <b>constant</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_57_9">Event_Mask</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_329_4">all_events_button_1</a>;
+   <span class="symbol"><a name="ref_195_4">BUTTON2_EVENTS</a></span>   : <b>constant</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_57_9">Event_Mask</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_335_4">all_events_button_2</a>;
+   <span class="symbol"><a name="ref_197_4">BUTTON3_EVENTS</a></span>   : <b>constant</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_57_9">Event_Mask</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_341_4">all_events_button_3</a>;
+   <span class="symbol"><a name="ref_199_4">BUTTON4_EVENTS</a></span>   : <b>constant</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_57_9">Event_Mask</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_347_4">all_events_button_4</a>;
+   <span class="symbol"><a name="ref_201_4">ALL_MOUSE_EVENTS</a></span> : <b>constant</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_57_9">Event_Mask</a> := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_352_4">ALL_MOUSE_EVENTS</a>;
+   <a href="terminal_interface-curses-mouse__ads.htm#ref_58_4">No_Events</a>        : <b>constant</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_57_9">Event_Mask</a> := 0;
+   <a href="terminal_interface-curses-mouse__ads.htm#ref_59_4">All_Events</a>       : <b>constant</b> <a href="terminal_interface-curses-mouse__ads.htm#ref_57_9">Event_Mask</a> := <a href="terminal_interface-curses-mouse__ads.htm#ref_201_4">ALL_MOUSE_EVENTS</a>;
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-mouse__ads.htm#ref_45_35">Mouse</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-panels-user_data__adb.htm b/doc/html/ada/terminal_interface-curses-panels-user_data__adb.htm
new file mode 100644
index 0000000..7270d2c
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-panels-user_data__adb.htm
@@ -0,0 +1,97 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-panels-user_data.adb</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-panels-user_data.adb </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                 Terminal_Interface.Curses.Panels.User_Data               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 B O D Y                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.13 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>with</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C;
+<b>with</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>;
+<b>use</b>  <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>;
+<b>with</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-panels__ads.htm#ref_45_35">Panels</a>;
+<b>use</b>  <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-panels__ads.htm#ref_45_35">Panels</a>;
+
+<b>package</b> <b>body</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-panels__ads.htm#ref_45_35">Panels</a>.<span class="symbol"><a name="ref_48_47" href="terminal_interface-curses-panels-user_data__ads.htm#ref_46_42">User_Data</a></span> <b>is</b>
+
+   <b>use</b> <b>type</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.int;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_52_14" href="terminal_interface-curses-panels-user_data__ads.htm#ref_54_14">Set_User_Data</a></span> (<span class="symbol"><a name="ref_52_29" href="terminal_interface-curses-panels-user_data__ads.htm#ref_54_29">Pan</a></span>  : <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>;
+                            <span class="symbol"><a name="ref_53_29" href="terminal_interface-curses-panels-user_data__ads.htm#ref_55_29">Data</a></span> : <a href="terminal_interface-curses-panels-user_data__ads.htm#ref_45_9">User_Access</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_55_16">Set_Panel_Userptr</a></span> (<span class="symbol"><a name="ref_55_35">Pan</a></span>  : <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>;
+                                  <span class="symbol"><a name="ref_56_35">Addr</a></span> : <a href="terminal_interface-curses-panels-user_data__ads.htm#ref_45_9">User_Access</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Set_Panel_Userptr, "set_panel_userptr");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-panels-user_data__adb.htm#ref_55_16">Set_Panel_Userptr</a> (<a href="terminal_interface-curses-panels-user_data__ads.htm#ref_54_29">Pan</a>, <a href="terminal_interface-curses-panels-user_data__ads.htm#ref_55_29">Data</a>) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses-panels__ads.htm#ref_60_4">Panel_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-panels-user_data__ads.htm#ref_54_14">Set_User_Data</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_64_13" href="terminal_interface-curses-panels-user_data__ads.htm#ref_65_13">Get_User_Data</a></span> (<span class="symbol"><a name="ref_64_28" href="terminal_interface-curses-panels-user_data__ads.htm#ref_65_28">Pan</a></span>  : <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>) <b>return</b> <a href="terminal_interface-curses-panels-user_data__ads.htm#ref_45_9">User_Access</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_66_16">Panel_Userptr</a></span> (<span class="symbol"><a name="ref_66_31">Pan</a></span> : <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>) <b>return</b> <a href="terminal_interface-curses-panels-user_data__ads.htm#ref_45_9">User_Access</a>;
+      <b>pragma</b> Import (C, Panel_Userptr, "panel_userptr");
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses-panels-user_data__adb.htm#ref_66_16">Panel_Userptr</a> (<a href="terminal_interface-curses-panels-user_data__ads.htm#ref_65_28">Pan</a>);
+   <b>end</b> <a href="terminal_interface-curses-panels-user_data__ads.htm#ref_65_13">Get_User_Data</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_72_14" href="terminal_interface-curses-panels-user_data__ads.htm#ref_60_14">Get_User_Data</a></span> (<span class="symbol"><a name="ref_72_29" href="terminal_interface-curses-panels-user_data__ads.htm#ref_60_29">Pan</a></span>  : <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>;
+                            <span class="symbol"><a name="ref_73_29" href="terminal_interface-curses-panels-user_data__ads.htm#ref_61_29">Data</a></span> : <b>out</b> <a href="terminal_interface-curses-panels-user_data__ads.htm#ref_45_9">User_Access</a>)
+   <b>is</b>
+   <b>begin</b>
+      <a href="terminal_interface-curses-panels-user_data__ads.htm#ref_61_29">Data</a> := <a href="terminal_interface-curses-panels-user_data__ads.htm#ref_65_13">Get_User_Data</a> (<a href="terminal_interface-curses-panels-user_data__ads.htm#ref_60_29">Pan</a>);
+   <b>end</b> <a href="terminal_interface-curses-panels-user_data__ads.htm#ref_60_14">Get_User_Data</a>;
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-panels__ads.htm#ref_45_35">Panels</a>.<a href="terminal_interface-curses-panels-user_data__ads.htm#ref_46_42">User_Data</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-panels-user_data__ads.htm b/doc/html/ada/terminal_interface-curses-panels-user_data__ads.htm
new file mode 100644
index 0000000..a39d0e4
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-panels-user_data__ads.htm
@@ -0,0 +1,88 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-panels-user_data.ads</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-panels-user_data.ads </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                 Terminal_Interface.Curses.Panels.User_Data               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 S P E C                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1998-2003,2009 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.16 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+
+<b>generic</b>
+   <b>type</b> <span class="symbol"><a name="ref_44_9">User</a></span> <b>is</b> <b>limited</b> <b>private</b>;
+   <b>type</b> <span class="symbol"><a name="ref_45_9">User_Access</a></span> <b>is</b> <b>access</b> <b>all</b> <a href="terminal_interface-curses-panels-user_data__ads.htm#ref_44_9">User</a>;
+<b>package</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-panels__ads.htm#ref_45_35">Panels</a>.<span class="symbol"><a name="ref_46_42" href="terminal_interface-curses-panels-user_data__adb.htm#ref_48_47">User_Data</a></span> <b>is</b>
+   <b>pragma</b> Preelaborate (<a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-panels__ads.htm#ref_45_35">Panels</a>.<a href="terminal_interface-curses-panels-user_data__ads.htm#ref_46_42">User_Data</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/panel.3x.html">panel.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_1">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_54_14" href="terminal_interface-curses-panels-user_data__adb.htm#ref_52_14">Set_User_Data</a></span> (<span class="symbol"><a name="ref_54_29" href="terminal_interface-curses-panels-user_data__adb.htm#ref_52_29">Pan</a></span>  : <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>;
+                            <span class="symbol"><a name="ref_55_29" href="terminal_interface-curses-panels-user_data__adb.htm#ref_53_29">Data</a></span> : <a href="terminal_interface-curses-panels-user_data__ads.htm#ref_45_9">User_Access</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/panel.3x.html">set_panel_userptr</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-panels-user_data__ads.htm#ref_54_14">Set_User_Data</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_2">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_60_14" href="terminal_interface-curses-panels-user_data__adb.htm#ref_72_14">Get_User_Data</a></span> (<span class="symbol"><a name="ref_60_29" href="terminal_interface-curses-panels-user_data__adb.htm#ref_72_29">Pan</a></span>  : <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>;
+                            <span class="symbol"><a name="ref_61_29" href="terminal_interface-curses-panels-user_data__adb.htm#ref_73_29">Data</a></span> : <b>out</b> <a href="terminal_interface-curses-panels-user_data__ads.htm#ref_45_9">User_Access</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/panel.3x.html">panel_userptr</A></em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_3">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_65_13" href="terminal_interface-curses-panels-user_data__adb.htm#ref_64_13">Get_User_Data</a></span> (<span class="symbol"><a name="ref_65_28" href="terminal_interface-curses-panels-user_data__adb.htm#ref_64_28">Pan</a></span>  : <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>) <b>return</b> <a href="terminal_interface-curses-panels-user_data__ads.htm#ref_45_9">User_Access</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/panel.3x.html">panel_userptr</A></em></span>
+   <span class="comment"><em>--  Same as function</em></span>
+   <b>pragma</b> Inline (Get_User_Data);
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-panels__ads.htm#ref_45_35">Panels</a>.<a href="terminal_interface-curses-panels-user_data__ads.htm#ref_46_42">User_Data</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-panels__adb.htm b/doc/html/ada/terminal_interface-curses-panels__adb.htm
new file mode 100644
index 0000000..096d7fe
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-panels__adb.htm
@@ -0,0 +1,184 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-panels.adb</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-panels.adb </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                      Terminal_Interface.Curses.Panels                    --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 B O D Y                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1999-2004,2009 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.15 @</em></span>
+<span class="comment"><em>--  @Date: 2020/02/02 23:34:34 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>with</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>; <b>use</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>;
+<b>with</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C;
+
+<b>package</b> <b>body</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<span class="symbol"><a name="ref_46_40" href="terminal_interface-curses-panels__ads.htm#ref_45_35">Panels</a></span> <b>is</b>
+
+   <b>use</b> <b>type</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.int;
+
+   <b>function</b> <span class="symbol"><a name="ref_50_13" href="terminal_interface-curses-panels__ads.htm#ref_67_13">Create</a></span> (<span class="symbol"><a name="ref_50_21" href="terminal_interface-curses-panels__ads.htm#ref_67_21">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_52_16">Newpanel</a></span> (<span class="symbol"><a name="ref_52_26">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>;
+      <b>pragma</b> Import (C, Newpanel, "new_panel");
+
+      <span class="symbol"><a name="ref_55_7">Pan</a></span> : <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>;
+   <b>begin</b>
+      <a href="terminal_interface-curses-panels__adb.htm#ref_55_7">Pan</a> := <a href="terminal_interface-curses-panels__adb.htm#ref_52_16">Newpanel</a> (<a href="terminal_interface-curses-panels__ads.htm#ref_67_21">Win</a>);
+      <b>if</b> <a href="terminal_interface-curses-panels__adb.htm#ref_55_7">Pan</a> = <a href="terminal_interface-curses-panels__ads.htm#ref_54_4">Null_Panel</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses-panels__ads.htm#ref_60_4">Panel_Exception</a>;
+      <b>end</b> <b>if</b>;
+      <b>return</b> <a href="terminal_interface-curses-panels__adb.htm#ref_55_7">Pan</a>;
+   <b>end</b> <a href="terminal_interface-curses-panels__ads.htm#ref_67_13">Create</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_64_14" href="terminal_interface-curses-panels__ads.htm#ref_77_14">Bottom</a></span> (<span class="symbol"><a name="ref_64_22" href="terminal_interface-curses-panels__ads.htm#ref_77_22">Pan</a></span> : <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_66_16">Bottompanel</a></span> (<span class="symbol"><a name="ref_66_29">Pan</a></span> : <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Bottompanel, "bottom_panel");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-panels__adb.htm#ref_66_16">Bottompanel</a> (<a href="terminal_interface-curses-panels__ads.htm#ref_77_22">Pan</a>) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses-panels__ads.htm#ref_60_4">Panel_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-panels__ads.htm#ref_77_14">Bottom</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_74_14" href="terminal_interface-curses-panels__ads.htm#ref_82_14">Top</a></span> (<span class="symbol"><a name="ref_74_19" href="terminal_interface-curses-panels__ads.htm#ref_82_19">Pan</a></span> : <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_76_16">Toppanel</a></span> (<span class="symbol"><a name="ref_76_26">Pan</a></span> : <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Toppanel, "top_panel");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-panels__adb.htm#ref_76_16">Toppanel</a> (<a href="terminal_interface-curses-panels__ads.htm#ref_82_19">Pan</a>) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses-panels__ads.htm#ref_60_4">Panel_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-panels__ads.htm#ref_82_14">Top</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_84_14" href="terminal_interface-curses-panels__ads.htm#ref_87_14">Show</a></span> (<span class="symbol"><a name="ref_84_20" href="terminal_interface-curses-panels__ads.htm#ref_87_20">Pan</a></span> : <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_86_16">Showpanel</a></span> (<span class="symbol"><a name="ref_86_27">Pan</a></span> : <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Showpanel, "show_panel");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-panels__adb.htm#ref_86_16">Showpanel</a> (<a href="terminal_interface-curses-panels__ads.htm#ref_87_20">Pan</a>) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses-panels__ads.htm#ref_60_4">Panel_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-panels__ads.htm#ref_87_14">Show</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_94_14" href="terminal_interface-curses-panels__ads.htm#ref_97_14">Hide</a></span> (<span class="symbol"><a name="ref_94_20" href="terminal_interface-curses-panels__ads.htm#ref_97_20">Pan</a></span> : <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_96_16">Hidepanel</a></span> (<span class="symbol"><a name="ref_96_27">Pan</a></span> : <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Hidepanel, "hide_panel");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-panels__adb.htm#ref_96_16">Hidepanel</a> (<a href="terminal_interface-curses-panels__ads.htm#ref_97_20">Pan</a>) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses-panels__ads.htm#ref_60_4">Panel_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-panels__ads.htm#ref_97_14">Hide</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_104_13" href="terminal_interface-curses-panels__ads.htm#ref_102_13">Get_Window</a></span> (<span class="symbol"><a name="ref_104_25" href="terminal_interface-curses-panels__ads.htm#ref_102_25">Pan</a></span> : <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_106_16">Panel_Win</a></span> (<span class="symbol"><a name="ref_106_27">Pan</a></span> : <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <b>pragma</b> Import (C, Panel_Win, "panel_window");
+
+      <span class="symbol"><a name="ref_109_7">Win</a></span> : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses-panels__adb.htm#ref_106_16">Panel_Win</a> (<a href="terminal_interface-curses-panels__ads.htm#ref_102_25">Pan</a>);
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-panels__adb.htm#ref_109_7">Win</a> = <a href="terminal_interface-curses__ads.htm#ref_57_4">Null_Window</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses-panels__ads.htm#ref_60_4">Panel_Exception</a>;
+      <b>end</b> <b>if</b>;
+      <b>return</b> <a href="terminal_interface-curses-panels__adb.htm#ref_109_7">Win</a>;
+   <b>end</b> <a href="terminal_interface-curses-panels__ads.htm#ref_102_13">Get_Window</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_117_14" href="terminal_interface-curses-panels__ads.htm#ref_111_14">Replace</a></span> (<span class="symbol"><a name="ref_117_23" href="terminal_interface-curses-panels__ads.htm#ref_111_23">Pan</a></span> : <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>;
+                      <span class="symbol"><a name="ref_118_23" href="terminal_interface-curses-panels__ads.htm#ref_112_23">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_120_16">Replace_Pan</a></span> (<span class="symbol"><a name="ref_120_29">Pan</a></span> : <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>;
+                            <span class="symbol"><a name="ref_121_29">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Replace_Pan, "replace_panel");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-panels__adb.htm#ref_120_16">Replace_Pan</a> (<a href="terminal_interface-curses-panels__ads.htm#ref_111_23">Pan</a>, <a href="terminal_interface-curses-panels__ads.htm#ref_112_23">Win</a>) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses-panels__ads.htm#ref_60_4">Panel_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-panels__ads.htm#ref_111_14">Replace</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_129_14" href="terminal_interface-curses-panels__ads.htm#ref_117_14">Move</a></span> (<span class="symbol"><a name="ref_129_20" href="terminal_interface-curses-panels__ads.htm#ref_117_20">Pan</a></span>    : <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>;
+                   <span class="symbol"><a name="ref_130_20" href="terminal_interface-curses-panels__ads.htm#ref_118_20">Line</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+                   <span class="symbol"><a name="ref_131_20" href="terminal_interface-curses-panels__ads.htm#ref_119_20">Column</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_133_16">Move</a></span> (<span class="symbol"><a name="ref_133_22">Pan</a></span>    : <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>;
+                     <span class="symbol"><a name="ref_134_22">Line</a></span>   : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+                     <span class="symbol"><a name="ref_135_22">Column</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Move, "move_panel");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-panels__adb.htm#ref_133_16">Move</a> (<a href="terminal_interface-curses-panels__ads.htm#ref_117_20">Pan</a>, <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses-panels__ads.htm#ref_118_20">Line</a>), <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses-panels__ads.htm#ref_119_20">Column</a>)) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses-panels__ads.htm#ref_60_4">Panel_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-panels__ads.htm#ref_117_14">Move</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_143_13" href="terminal_interface-curses-panels__ads.htm#ref_124_13">Is_Hidden</a></span> (<span class="symbol"><a name="ref_143_24" href="terminal_interface-curses-panels__ads.htm#ref_124_24">Pan</a></span> : <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>) <b>return</b> Boolean
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_145_16">Panel_Hidden</a></span> (<span class="symbol"><a name="ref_145_30">Pan</a></span> : <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Panel_Hidden, "panel_hidden");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-panels__adb.htm#ref_145_16">Panel_Hidden</a> (<a href="terminal_interface-curses-panels__ads.htm#ref_124_24">Pan</a>) = <a href="terminal_interface-curses-aux__ads.htm#ref_67_4">Curses_False</a> <b>then</b>
+         <b>return</b> False;
+      <b>else</b>
+         <b>return</b> True;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-panels__ads.htm#ref_124_13">Is_Hidden</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_155_14" href="terminal_interface-curses-panels__ads.htm#ref_139_14">Delete</a></span> (<span class="symbol"><a name="ref_155_22" href="terminal_interface-curses-panels__ads.htm#ref_139_22">Pan</a></span> : <b>in</b> <b>out</b> <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_157_16">Del_Panel</a></span> (<span class="symbol"><a name="ref_157_27">Pan</a></span> : <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Del_Panel, "del_panel");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-panels__adb.htm#ref_157_16">Del_Panel</a> (<a href="terminal_interface-curses-panels__ads.htm#ref_139_22">Pan</a>) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses-panels__ads.htm#ref_60_4">Panel_Exception</a>;
+      <b>end</b> <b>if</b>;
+      <a href="terminal_interface-curses-panels__ads.htm#ref_139_22">Pan</a> := <a href="terminal_interface-curses-panels__ads.htm#ref_54_4">Null_Panel</a>;
+   <b>end</b> <a href="terminal_interface-curses-panels__ads.htm#ref_139_14">Delete</a>;
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-panels__ads.htm#ref_45_35">Panels</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-panels__ads.htm b/doc/html/ada/terminal_interface-curses-panels__ads.htm
new file mode 100644
index 0000000..4cc3178
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-panels__ads.htm
@@ -0,0 +1,165 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-panels.ads</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-panels.ads </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                      Terminal_Interface.Curses.Panels                    --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 S P E C                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1998-2009,2014 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.23 @</em></span>
+<span class="comment"><em>--  @Date: 2020/02/02 23:34:34 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>with</b> System;
+
+<b>package</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<span class="symbol"><a name="ref_45_35" href="terminal_interface-curses-panels__adb.htm#ref_46_40">Panels</a></span> <b>is</b>
+   <b>pragma</b> Preelaborate (<a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-panels__ads.htm#ref_45_35">Panels</a>);
+   <b>pragma</b> Linker_Options ("-lpanel" &amp; <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_9_4">DFT_ARG_SUFFIX</a>);
+
+   <b>type</b> <span class="symbol"><a name="ref_49_9">Panel</a></span> <b>is</b> <b>private</b>;
+
+   <span class="comment"><em>---------------------------</em></span>
+   <span class="comment"><em>--  Interface constants  --</em></span>
+   <span class="comment"><em>---------------------------</em></span>
+   <span class="symbol"><a name="ref_54_4">Null_Panel</a></span> : <b>constant</b> <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>;
+
+   <span class="comment"><em>-------------------</em></span>
+   <span class="comment"><em>--  Exceptions   --</em></span>
+   <span class="comment"><em>-------------------</em></span>
+
+   <span class="symbol"><a name="ref_60_4">Panel_Exception</a></span> : <b>exception</b>;
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/panel.3x.html">panel.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_1">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_67_13" href="terminal_interface-curses-panels__adb.htm#ref_50_13">Create</a></span> (<span class="symbol"><a name="ref_67_21" href="terminal_interface-curses-panels__adb.htm#ref_50_21">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/panel.3x.html">new_panel()</A></em></span>
+   <b>pragma</b> Inline (Create);
+
+   <span class="comment"><em>--  <A NAME="AFU_2">|</A></em></span>
+   <b>function</b> New_Panel (<span class="symbol"><a name="ref_72_24">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a> <b>renames</b> <a href="terminal_interface-curses-panels__ads.htm#ref_67_13">Create</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/panel.3x.html">new_panel()</A></em></span>
+   <span class="comment"><em>--  pragma Inline (New_Panel);</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_3">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_77_14" href="terminal_interface-curses-panels__adb.htm#ref_64_14">Bottom</a></span> (<span class="symbol"><a name="ref_77_22" href="terminal_interface-curses-panels__adb.htm#ref_64_22">Pan</a></span> : <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/panel.3x.html">bottom_panel()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-panels__ads.htm#ref_77_14">Bottom</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_4">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_82_14" href="terminal_interface-curses-panels__adb.htm#ref_74_14">Top</a></span> (<span class="symbol"><a name="ref_82_19" href="terminal_interface-curses-panels__adb.htm#ref_74_19">Pan</a></span> : <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/panel.3x.html">top_panel()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-panels__ads.htm#ref_82_14">Top</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_5">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_87_14" href="terminal_interface-curses-panels__adb.htm#ref_84_14">Show</a></span> (<span class="symbol"><a name="ref_87_20" href="terminal_interface-curses-panels__adb.htm#ref_84_20">Pan</a></span> : <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/panel.3x.html">show_panel()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-panels__ads.htm#ref_87_14">Show</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_6">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_92_14">Update_Panels</a></span>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/panel.3x.html">update_panels()</A></em></span>
+   <b>pragma</b> Import (C, Update_Panels, "update_panels");
+
+   <span class="comment"><em>--  <A NAME="AFU_7">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_97_14" href="terminal_interface-curses-panels__adb.htm#ref_94_14">Hide</a></span> (<span class="symbol"><a name="ref_97_20" href="terminal_interface-curses-panels__adb.htm#ref_94_20">Pan</a></span> : <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/panel.3x.html">hide_panel()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-panels__ads.htm#ref_97_14">Hide</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_8">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_102_13" href="terminal_interface-curses-panels__adb.htm#ref_104_13">Get_Window</a></span> (<span class="symbol"><a name="ref_102_25" href="terminal_interface-curses-panels__adb.htm#ref_104_25">Pan</a></span> : <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/panel.3x.html">panel_window()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-panels__ads.htm#ref_102_13">Get_Window</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_9">|</A></em></span>
+   <b>function</b> Panel_Window (<span class="symbol"><a name="ref_107_27">Pan</a></span> : <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> <b>renames</b> <a href="terminal_interface-curses-panels__ads.htm#ref_102_13">Get_Window</a>;
+   <span class="comment"><em>--  pragma Inline (Panel_Window);</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_10">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_111_14" href="terminal_interface-curses-panels__adb.htm#ref_117_14">Replace</a></span> (<span class="symbol"><a name="ref_111_23" href="terminal_interface-curses-panels__adb.htm#ref_117_23">Pan</a></span> : <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>;
+                      <span class="symbol"><a name="ref_112_23" href="terminal_interface-curses-panels__adb.htm#ref_118_23">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/panel.3x.html">replace_panel()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-panels__ads.htm#ref_111_14">Replace</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_11">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_117_14" href="terminal_interface-curses-panels__adb.htm#ref_129_14">Move</a></span> (<span class="symbol"><a name="ref_117_20" href="terminal_interface-curses-panels__adb.htm#ref_129_20">Pan</a></span>    : <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>;
+                   <span class="symbol"><a name="ref_118_20" href="terminal_interface-curses-panels__adb.htm#ref_130_20">Line</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+                   <span class="symbol"><a name="ref_119_20" href="terminal_interface-curses-panels__adb.htm#ref_131_20">Column</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/panel.3x.html">move_panel()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-panels__ads.htm#ref_117_14">Move</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_12">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_124_13" href="terminal_interface-curses-panels__adb.htm#ref_143_13">Is_Hidden</a></span> (<span class="symbol"><a name="ref_124_24" href="terminal_interface-curses-panels__adb.htm#ref_143_24">Pan</a></span> : <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>) <b>return</b> Boolean;
+   <span class="comment"><em>--  AKA: <A HREF="../man/panel.3x.html">panel_hidden()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-panels__ads.htm#ref_124_13">Is_Hidden</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_13">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_129_13">Above</a></span> (<span class="symbol"><a name="ref_129_20">Pan</a></span> : <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>) <b>return</b> <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/panel.3x.html">panel_above()</A></em></span>
+   <b>pragma</b> Import (C, Above, "panel_above");
+
+   <span class="comment"><em>--  <A NAME="AFU_14">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_134_13">Below</a></span> (<span class="symbol"><a name="ref_134_20">Pan</a></span> : <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>) <b>return</b> <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/panel.3x.html">panel_below()</A></em></span>
+   <b>pragma</b> Import (C, Below, "panel_below");
+
+   <span class="comment"><em>--  <A NAME="AFU_15">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_139_14" href="terminal_interface-curses-panels__adb.htm#ref_155_14">Delete</a></span> (<span class="symbol"><a name="ref_139_22" href="terminal_interface-curses-panels__adb.htm#ref_155_22">Pan</a></span> : <b>in</b> <b>out</b> <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/panel.3x.html">del_panel()</A></em></span>
+   <b>pragma</b> Inline (Delete);
+
+<b>private</b>
+      <b>type</b> <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a> <b>is</b> <b>new</b> System.Storage_Elements.Integer_Address;
+      <a href="terminal_interface-curses-panels__ads.htm#ref_54_4">Null_Panel</a> : <b>constant</b> <a href="terminal_interface-curses-panels__ads.htm#ref_49_9">Panel</a> := 0;
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-panels__ads.htm#ref_45_35">Panels</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-putwin__adb.htm b/doc/html/ada/terminal_interface-curses-putwin__adb.htm
new file mode 100644
index 0000000..4e5073d
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-putwin__adb.htm
@@ -0,0 +1,96 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-putwin.adb</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-putwin.adb </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                    Terminal_Interface.Curses.PutWin                      --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 B O D Y                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 2000-2002,2003 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.5 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+
+<b>with</b> Ada.Streams.Stream_IO.C_Streams;
+<b>with</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C_Streams;
+<b>with</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>; <b>use</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>;
+
+<b>package</b> <b>body</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<span class="symbol"><a name="ref_46_40" href="terminal_interface-curses-putwin__ads.htm#ref_44_35">PutWin</a></span> <b>is</b>
+
+   <b>package</b> <span class="symbol"><a name="ref_48_12">ICS</a></span> <b>renames</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C_Streams;
+   <b>package</b> <span class="symbol"><a name="ref_49_12">ACS</a></span> <b>renames</b> Ada.Streams.Stream_IO.C_Streams;
+   <b>use</b> <b>type</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_52_14" href="terminal_interface-curses-putwin__ads.htm#ref_46_14">Put_Window</a></span> (<span class="symbol"><a name="ref_52_26" href="terminal_interface-curses-putwin__ads.htm#ref_46_26">Win</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+                         <span class="symbol"><a name="ref_53_26" href="terminal_interface-curses-putwin__ads.htm#ref_47_26">File</a></span> : Ada.Streams.Stream_IO.File_Type) <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_54_16">putwin</a></span> (<span class="symbol"><a name="ref_54_24">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>; <span class="symbol"><a name="ref_54_38">f</a></span> : <a href="terminal_interface-curses-putwin__adb.htm#ref_48_12">ICS</a>.FILEs) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, putwin, "putwin");
+
+      <span class="symbol"><a name="ref_57_7">R</a></span> : <b>constant</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> := <a href="terminal_interface-curses-putwin__adb.htm#ref_54_16">putwin</a> (<a href="terminal_interface-curses-putwin__ads.htm#ref_46_26">Win</a>, <a href="terminal_interface-curses-putwin__adb.htm#ref_49_12">ACS</a>.C_Stream (<a href="terminal_interface-curses-putwin__ads.htm#ref_47_26">File</a>));
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-putwin__adb.htm#ref_57_7">R</a> /= <a href="terminal_interface-curses-aux__ads.htm#ref_63_4">Curses_Ok</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-putwin__ads.htm#ref_46_14">Put_Window</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_64_13" href="terminal_interface-curses-putwin__ads.htm#ref_49_13">Get_Window</a></span> (<span class="symbol"><a name="ref_64_25" href="terminal_interface-curses-putwin__ads.htm#ref_49_25">File</a></span> : Ada.Streams.Stream_IO.File_Type)
+                        <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_66_16">getwin</a></span> (<span class="symbol"><a name="ref_66_24">f</a></span> : <a href="terminal_interface-curses-putwin__adb.htm#ref_48_12">ICS</a>.FILEs) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <b>pragma</b> Import (C, getwin, "getwin");
+
+      <span class="symbol"><a name="ref_69_7">W</a></span> : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses-putwin__adb.htm#ref_66_16">getwin</a> (<a href="terminal_interface-curses-putwin__adb.htm#ref_49_12">ACS</a>.C_Stream (<a href="terminal_interface-curses-putwin__ads.htm#ref_49_25">File</a>));
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-putwin__adb.htm#ref_69_7">W</a> = <a href="terminal_interface-curses__ads.htm#ref_57_4">Null_Window</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>else</b>
+         <b>return</b> <a href="terminal_interface-curses-putwin__adb.htm#ref_69_7">W</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-putwin__ads.htm#ref_49_13">Get_Window</a>;
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-putwin__ads.htm#ref_44_35">PutWin</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-putwin__ads.htm b/doc/html/ada/terminal_interface-curses-putwin__ads.htm
new file mode 100644
index 0000000..91f2645
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-putwin__ads.htm
@@ -0,0 +1,69 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-putwin.ads</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-putwin.ads </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                    Terminal_Interface.Curses.PutWin                      --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 S P E C                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 2000-2002,2003 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.5 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+
+<b>with</b> Ada.Streams.Stream_IO;
+
+<b>package</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<span class="symbol"><a name="ref_44_35" href="terminal_interface-curses-putwin__adb.htm#ref_46_40">PutWin</a></span> <b>is</b>
+
+   <b>procedure</b> <span class="symbol"><a name="ref_46_14" href="terminal_interface-curses-putwin__adb.htm#ref_52_14">Put_Window</a></span> (<span class="symbol"><a name="ref_46_26" href="terminal_interface-curses-putwin__adb.htm#ref_52_26">Win</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+                         <span class="symbol"><a name="ref_47_26" href="terminal_interface-curses-putwin__adb.htm#ref_53_26">File</a></span> : Ada.Streams.Stream_IO.File_Type);
+
+   <b>function</b> <span class="symbol"><a name="ref_49_13" href="terminal_interface-curses-putwin__adb.htm#ref_64_13">Get_Window</a></span> (<span class="symbol"><a name="ref_49_25" href="terminal_interface-curses-putwin__adb.htm#ref_64_25">File</a></span>  : Ada.Streams.Stream_IO.File_Type) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-putwin__ads.htm#ref_44_35">PutWin</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-termcap__adb.htm b/doc/html/ada/terminal_interface-curses-termcap__adb.htm
new file mode 100644
index 0000000..cef7daf
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-termcap__adb.htm
@@ -0,0 +1,182 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-termcap.adb</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-termcap.adb </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                    Terminal_Interface.Curses.Termcap                     --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 B O D Y                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 2000-2006,2009 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.13 @</em></span>
+<span class="comment"><em>--  @Date: 2020/02/02 23:34:34 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+
+<b>with</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>; <b>use</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>;
+<b>with</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C; <b>use</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C;
+<b>with</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.Strings; <b>use</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.Strings;
+
+<b>package</b> <b>body</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<span class="symbol"><a name="ref_48_40" href="terminal_interface-curses-termcap__ads.htm#ref_43_35">Termcap</a></span> <b>is</b>
+
+   <b>function</b> <span class="symbol"><a name="ref_50_13" href="terminal_interface-curses-termcap__ads.htm#ref_60_13">Get_Entry</a></span> (<span class="symbol"><a name="ref_50_24" href="terminal_interface-curses-termcap__ads.htm#ref_60_24">Name</a></span> : String) <b>return</b> Boolean
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_52_16">tgetent</a></span> (<span class="symbol"><a name="ref_52_25">name</a></span> : char_array; <span class="symbol"><a name="ref_52_44">val</a></span> : char_array)
+                        <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, tgetent, "tgetent");
+      <span class="symbol"><a name="ref_55_7">NameTxt</a></span> : char_array (0 .. <a href="terminal_interface-curses-termcap__ads.htm#ref_60_24">Name</a>'Length);
+      <span class="symbol"><a name="ref_56_7">Length</a></span>  : size_t;
+      <span class="symbol"><a name="ref_57_7">ignored</a></span> : <b>constant</b> char_array (0 .. 0) := (0 =&gt; nul);
+      <span class="symbol"><a name="ref_58_7">result</a></span>  : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+   <b>begin</b>
+      To_C (<a href="terminal_interface-curses-termcap__ads.htm#ref_60_24">Name</a>, <a href="terminal_interface-curses-termcap__adb.htm#ref_55_7">NameTxt</a>, <a href="terminal_interface-curses-termcap__adb.htm#ref_56_7">Length</a>);
+      <a href="terminal_interface-curses-termcap__adb.htm#ref_58_7">result</a> := <a href="terminal_interface-curses-termcap__adb.htm#ref_52_16">tgetent</a> (char_array (<a href="terminal_interface-curses-termcap__adb.htm#ref_57_7">ignored</a>), <a href="terminal_interface-curses-termcap__adb.htm#ref_55_7">NameTxt</a>);
+      <b>if</b> <a href="terminal_interface-curses-termcap__adb.htm#ref_58_7">result</a> = -1 <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>else</b>
+         <b>return</b> Boolean'Val (<a href="terminal_interface-curses-termcap__adb.htm#ref_58_7">result</a>);
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-termcap__ads.htm#ref_60_13">Get_Entry</a>;
+
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_70_13" href="terminal_interface-curses-termcap__ads.htm#ref_64_13">Get_Flag</a></span> (<span class="symbol"><a name="ref_70_23" href="terminal_interface-curses-termcap__ads.htm#ref_64_23">Name</a></span> : String) <b>return</b> Boolean
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_72_16">tgetflag</a></span> (<span class="symbol"><a name="ref_72_26">id</a></span> : char_array) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, tgetflag, "tgetflag");
+      <span class="symbol"><a name="ref_74_7">Txt</a></span>    : char_array (0 .. <a href="terminal_interface-curses-termcap__ads.htm#ref_64_23">Name</a>'Length);
+      <span class="symbol"><a name="ref_75_7">Length</a></span> : size_t;
+   <b>begin</b>
+      To_C (<a href="terminal_interface-curses-termcap__ads.htm#ref_64_23">Name</a>, <a href="terminal_interface-curses-termcap__adb.htm#ref_74_7">Txt</a>, <a href="terminal_interface-curses-termcap__adb.htm#ref_75_7">Length</a>);
+      <b>if</b> <a href="terminal_interface-curses-termcap__adb.htm#ref_72_16">tgetflag</a> (<a href="terminal_interface-curses-termcap__adb.htm#ref_74_7">Txt</a>) = 0 <b>then</b>
+         <b>return</b> False;
+      <b>else</b>
+         <b>return</b> True;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-termcap__ads.htm#ref_64_13">Get_Flag</a>;
+
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_86_14" href="terminal_interface-curses-termcap__ads.htm#ref_68_14">Get_Number</a></span> (<span class="symbol"><a name="ref_86_26" href="terminal_interface-curses-termcap__ads.htm#ref_68_26">Name</a></span>   : String;
+                         <span class="symbol"><a name="ref_87_26" href="terminal_interface-curses-termcap__ads.htm#ref_69_26">Value</a></span>  : <b>out</b> Integer;
+                         <span class="symbol"><a name="ref_88_26" href="terminal_interface-curses-termcap__ads.htm#ref_70_26">Result</a></span> : <b>out</b> Boolean)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_90_16">tgetnum</a></span> (<span class="symbol"><a name="ref_90_25">id</a></span> : char_array) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, tgetnum, "tgetnum");
+      <span class="symbol"><a name="ref_92_7">Txt</a></span>    : char_array (0 .. <a href="terminal_interface-curses-termcap__ads.htm#ref_68_26">Name</a>'Length);
+      <span class="symbol"><a name="ref_93_7">Length</a></span> : size_t;
+   <b>begin</b>
+      To_C (<a href="terminal_interface-curses-termcap__ads.htm#ref_68_26">Name</a>, <a href="terminal_interface-curses-termcap__adb.htm#ref_92_7">Txt</a>, <a href="terminal_interface-curses-termcap__adb.htm#ref_93_7">Length</a>);
+      <a href="terminal_interface-curses-termcap__ads.htm#ref_69_26">Value</a> := Integer (<a href="terminal_interface-curses-termcap__adb.htm#ref_90_16">tgetnum</a> (<a href="terminal_interface-curses-termcap__adb.htm#ref_92_7">Txt</a>));
+      <b>if</b> <a href="terminal_interface-curses-termcap__ads.htm#ref_69_26">Value</a> = -1 <b>then</b>
+         <a href="terminal_interface-curses-termcap__ads.htm#ref_70_26">Result</a> := False;
+      <b>else</b>
+         <a href="terminal_interface-curses-termcap__ads.htm#ref_70_26">Result</a> :=  True;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-termcap__ads.htm#ref_68_14">Get_Number</a>;
+
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_105_14" href="terminal_interface-curses-termcap__ads.htm#ref_74_14">Get_String</a></span> (<span class="symbol"><a name="ref_105_26" href="terminal_interface-curses-termcap__ads.htm#ref_74_26">Name</a></span>   : String;
+                         <span class="symbol"><a name="ref_106_26" href="terminal_interface-curses-termcap__ads.htm#ref_75_26">Value</a></span>  : <b>out</b> String;
+                         <span class="symbol"><a name="ref_107_26" href="terminal_interface-curses-termcap__ads.htm#ref_76_26">Result</a></span> : <b>out</b> Boolean)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_109_16">tgetstr</a></span> (<span class="symbol"><a name="ref_109_25">id</a></span>  : char_array;
+                        <span class="symbol"><a name="ref_110_25">buf</a></span> : char_array) <b>return</b> chars_ptr;
+      <b>pragma</b> Import (C, tgetstr, "tgetstr");
+      <span class="symbol"><a name="ref_112_7">Txt</a></span>    : char_array (0 .. <a href="terminal_interface-curses-termcap__ads.htm#ref_74_26">Name</a>'Length);
+      <span class="symbol"><a name="ref_113_7">Length</a></span> : size_t;
+      <span class="symbol"><a name="ref_114_7">Txt2</a></span>   : chars_ptr;
+      <b>type</b> t <b>is</b> <b>new</b> char_array (0 .. 1024); <span class="comment"><em>--  does it need to be 1024?</em></span>
+      <span class="symbol"><a name="ref_116_7">Return_Buffer</a></span> : <b>constant</b> t := (<b>others</b> =&gt; nul);
+   <b>begin</b>
+      To_C (<a href="terminal_interface-curses-termcap__ads.htm#ref_74_26">Name</a>, <a href="terminal_interface-curses-termcap__adb.htm#ref_112_7">Txt</a>, <a href="terminal_interface-curses-termcap__adb.htm#ref_113_7">Length</a>);
+      <a href="terminal_interface-curses-termcap__adb.htm#ref_114_7">Txt2</a> := <a href="terminal_interface-curses-termcap__adb.htm#ref_109_16">tgetstr</a> (<a href="terminal_interface-curses-termcap__adb.htm#ref_112_7">Txt</a>, char_array (<a href="terminal_interface-curses-termcap__adb.htm#ref_116_7">Return_Buffer</a>));
+      <b>if</b> <a href="terminal_interface-curses-termcap__adb.htm#ref_114_7">Txt2</a> = Null_Ptr <b>then</b>
+         <a href="terminal_interface-curses-termcap__ads.htm#ref_76_26">Result</a> := False;
+      <b>else</b>
+         <a href="terminal_interface-curses-termcap__ads.htm#ref_75_26">Value</a> := <a href="terminal_interface-curses-aux__ads.htm#ref_96_13">Fill_String</a> (<a href="terminal_interface-curses-termcap__adb.htm#ref_114_7">Txt2</a>);
+         <a href="terminal_interface-curses-termcap__ads.htm#ref_76_26">Result</a> := True;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-termcap__ads.htm#ref_74_14">Get_String</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_128_13" href="terminal_interface-curses-termcap__ads.htm#ref_77_13">Get_String</a></span> (<span class="symbol"><a name="ref_128_25" href="terminal_interface-curses-termcap__ads.htm#ref_77_25">Name</a></span> : String) <b>return</b> Boolean
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_130_16">tgetstr</a></span> (<span class="symbol"><a name="ref_130_25">Id</a></span>  : char_array;
+                        <span class="symbol"><a name="ref_131_25">buf</a></span> : char_array) <b>return</b> chars_ptr;
+      <b>pragma</b> Import (C, tgetstr, "tgetstr");
+      <span class="symbol"><a name="ref_133_7">Txt</a></span>    : char_array (0 .. <a href="terminal_interface-curses-termcap__ads.htm#ref_77_25">Name</a>'Length);
+      <span class="symbol"><a name="ref_134_7">Length</a></span> : size_t;
+      <span class="symbol"><a name="ref_135_7">Txt2</a></span>   : chars_ptr;
+      <b>type</b> t <b>is</b> <b>new</b> char_array (0 .. 1024); <span class="comment"><em>--  does it need to be 1024?</em></span>
+      <span class="symbol"><a name="ref_137_7">Phony_Txt</a></span> : <b>constant</b> t := (<b>others</b> =&gt; nul);
+   <b>begin</b>
+      To_C (<a href="terminal_interface-curses-termcap__ads.htm#ref_77_25">Name</a>, <a href="terminal_interface-curses-termcap__adb.htm#ref_133_7">Txt</a>, <a href="terminal_interface-curses-termcap__adb.htm#ref_134_7">Length</a>);
+      <a href="terminal_interface-curses-termcap__adb.htm#ref_135_7">Txt2</a> := <a href="terminal_interface-curses-termcap__adb.htm#ref_130_16">tgetstr</a> (<a href="terminal_interface-curses-termcap__adb.htm#ref_133_7">Txt</a>, char_array (<a href="terminal_interface-curses-termcap__adb.htm#ref_137_7">Phony_Txt</a>));
+      <b>if</b> <a href="terminal_interface-curses-termcap__adb.htm#ref_135_7">Txt2</a> = Null_Ptr <b>then</b>
+         <b>return</b> False;
+      <b>else</b>
+         <b>return</b> True;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-termcap__ads.htm#ref_77_13">Get_String</a>;
+
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_149_13" href="terminal_interface-curses-termcap__ads.htm#ref_54_13">TGoto</a></span> (<span class="symbol"><a name="ref_149_20" href="terminal_interface-curses-termcap__ads.htm#ref_54_20">Cap</a></span> : String;
+                   <span class="symbol"><a name="ref_150_20" href="terminal_interface-curses-termcap__ads.htm#ref_55_20">Col</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+                   <span class="symbol"><a name="ref_151_20" href="terminal_interface-curses-termcap__ads.htm#ref_56_20">Row</a></span> : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>) <b>return</b> Termcap_String <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_152_16">tgoto</a></span> (<span class="symbol"><a name="ref_152_23">cap</a></span> : char_array;
+                      <span class="symbol"><a name="ref_153_23">col</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+                      <span class="symbol"><a name="ref_154_23">row</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> chars_ptr;
+      <b>pragma</b> Import (C, tgoto);
+      <span class="symbol"><a name="ref_156_7">Txt</a></span>    : char_array (0 .. <a href="terminal_interface-curses-termcap__ads.htm#ref_54_20">Cap</a>'Length);
+      <span class="symbol"><a name="ref_157_7">Length</a></span> : size_t;
+   <b>begin</b>
+      To_C (<a href="terminal_interface-curses-termcap__ads.htm#ref_54_20">Cap</a>, <a href="terminal_interface-curses-termcap__adb.htm#ref_156_7">Txt</a>, <a href="terminal_interface-curses-termcap__adb.htm#ref_157_7">Length</a>);
+      <b>return</b> Termcap_String (<a href="terminal_interface-curses-aux__ads.htm#ref_96_13">Fill_String</a>
+                             (<a href="terminal_interface-curses-termcap__adb.htm#ref_152_16">tgoto</a> (<a href="terminal_interface-curses-termcap__adb.htm#ref_156_7">Txt</a>, <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses-termcap__ads.htm#ref_55_20">Col</a>), <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses-termcap__ads.htm#ref_56_20">Row</a>))));
+   <b>end</b> <a href="terminal_interface-curses-termcap__ads.htm#ref_54_13">TGoto</a>;
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-termcap__ads.htm#ref_43_35">Termcap</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-termcap__ads.htm b/doc/html/ada/terminal_interface-curses-termcap__ads.htm
new file mode 100644
index 0000000..269ee9d
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-termcap__ads.htm
@@ -0,0 +1,99 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-termcap.ads</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-termcap.ads </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                     Terminal_Interface.Curses.Termcap                    --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 S P E C                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 2000-2002,2003 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.5 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+
+<b>package</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<span class="symbol"><a name="ref_43_35" href="terminal_interface-curses-termcap__adb.htm#ref_48_40">Termcap</a></span> <b>is</b>
+   <b>pragma</b> Preelaborate (<a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-termcap__ads.htm#ref_43_35">Termcap</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page curs_termcap.3x</em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  Not implemented:  tputs (see curs_terminfo)</em></span>
+
+   <b>type</b> Termcap_String <b>is</b> <b>new</b> String;
+
+   <span class="comment"><em>--  |</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_54_13" href="terminal_interface-curses-termcap__adb.htm#ref_149_13">TGoto</a></span> (<span class="symbol"><a name="ref_54_20" href="terminal_interface-curses-termcap__adb.htm#ref_149_20">Cap</a></span> : String;
+                   <span class="symbol"><a name="ref_55_20" href="terminal_interface-curses-termcap__adb.htm#ref_150_20">Col</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+                   <span class="symbol"><a name="ref_56_20" href="terminal_interface-curses-termcap__adb.htm#ref_151_20">Row</a></span> : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>) <b>return</b> Termcap_String;
+   <span class="comment"><em>--  AKA: tgoto()</em></span>
+
+   <span class="comment"><em>--  |</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_60_13" href="terminal_interface-curses-termcap__adb.htm#ref_50_13">Get_Entry</a></span> (<span class="symbol"><a name="ref_60_24" href="terminal_interface-curses-termcap__adb.htm#ref_50_24">Name</a></span> : String) <b>return</b> Boolean;
+   <span class="comment"><em>--  AKA: tgetent()</em></span>
+
+   <span class="comment"><em>--  |</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_64_13" href="terminal_interface-curses-termcap__adb.htm#ref_70_13">Get_Flag</a></span> (<span class="symbol"><a name="ref_64_23" href="terminal_interface-curses-termcap__adb.htm#ref_70_23">Name</a></span> : String) <b>return</b> Boolean;
+   <span class="comment"><em>--  AKA: tgetflag()</em></span>
+
+   <span class="comment"><em>--  |</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_68_14" href="terminal_interface-curses-termcap__adb.htm#ref_86_14">Get_Number</a></span> (<span class="symbol"><a name="ref_68_26" href="terminal_interface-curses-termcap__adb.htm#ref_86_26">Name</a></span>   : String;
+                         <span class="symbol"><a name="ref_69_26" href="terminal_interface-curses-termcap__adb.htm#ref_87_26">Value</a></span>  : <b>out</b> Integer;
+                         <span class="symbol"><a name="ref_70_26" href="terminal_interface-curses-termcap__adb.htm#ref_88_26">Result</a></span> : <b>out</b> Boolean);
+   <span class="comment"><em>--  AKA: tgetnum()</em></span>
+
+   <span class="comment"><em>--  |</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_74_14" href="terminal_interface-curses-termcap__adb.htm#ref_105_14">Get_String</a></span> (<span class="symbol"><a name="ref_74_26" href="terminal_interface-curses-termcap__adb.htm#ref_105_26">Name</a></span>   : String;
+                         <span class="symbol"><a name="ref_75_26" href="terminal_interface-curses-termcap__adb.htm#ref_106_26">Value</a></span>  : <b>out</b> String;
+                         <span class="symbol"><a name="ref_76_26" href="terminal_interface-curses-termcap__adb.htm#ref_107_26">Result</a></span> : <b>out</b> Boolean);
+   <b>function</b> <span class="symbol"><a name="ref_77_13" href="terminal_interface-curses-termcap__adb.htm#ref_128_13">Get_String</a></span> (<span class="symbol"><a name="ref_77_25" href="terminal_interface-curses-termcap__adb.htm#ref_128_25">Name</a></span> : String) <b>return</b> Boolean;
+   <span class="comment"><em>--  Returns True if the string is found.</em></span>
+   <span class="comment"><em>--  AKA: tgetstr()</em></span>
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-termcap__ads.htm#ref_43_35">Termcap</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-terminfo__adb.htm b/doc/html/ada/terminal_interface-curses-terminfo__adb.htm
new file mode 100644
index 0000000..c84c203
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-terminfo__adb.htm
@@ -0,0 +1,180 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-terminfo.adb</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-terminfo.adb </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                    Terminal_Interface.Curses.Terminfo                    --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 B O D Y                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 2000-2006,2009 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.7 @</em></span>
+<span class="comment"><em>--  @Date: 2020/02/02 23:34:34 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+
+<b>with</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>; <b>use</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>;
+<b>with</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C; <b>use</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C;
+<b>with</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.Strings; <b>use</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.Strings;
+<b>with</b> Ada.Unchecked_Conversion;
+
+<b>package</b> <b>body</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<span class="symbol"><a name="ref_49_40" href="terminal_interface-curses-terminfo__ads.htm#ref_45_35">Terminfo</a></span> <b>is</b>
+
+   <b>function</b> <span class="symbol"><a name="ref_51_13" href="terminal_interface-curses-terminfo__adb.htm#ref_53_13">Is_MinusOne_Pointer</a></span> (<span class="symbol"><a name="ref_51_34" href="terminal_interface-curses-terminfo__adb.htm#ref_53_34">P</a></span> : chars_ptr) <b>return</b> Boolean;
+
+   <b>function</b> <span class="symbol"><a name="ref_53_13" href="terminal_interface-curses-terminfo__adb.htm#ref_51_13">Is_MinusOne_Pointer</a></span> (<span class="symbol"><a name="ref_53_34" href="terminal_interface-curses-terminfo__adb.htm#ref_51_34">P</a></span> : chars_ptr) <b>return</b> Boolean <b>is</b>
+      <b>type</b> <span class="symbol"><a name="ref_54_12">Weird_Address</a></span> <b>is</b> <b>new</b> System.Storage_Elements.Integer_Address;
+      <span class="symbol"><a name="ref_55_7">Invalid_Pointer</a></span> : <b>constant</b> <a href="terminal_interface-curses-terminfo__adb.htm#ref_54_12">Weird_Address</a> := -1;
+      <b>function</b> To_Weird <b>is</b> <b>new</b> Ada.Unchecked_Conversion
+        (Source =&gt; chars_ptr, Target =&gt; <a href="terminal_interface-curses-terminfo__adb.htm#ref_54_12">Weird_Address</a>);
+   <b>begin</b>
+      <b>if</b> To_Weird (<a href="terminal_interface-curses-terminfo__adb.htm#ref_51_34">P</a>) = <a href="terminal_interface-curses-terminfo__adb.htm#ref_55_7">Invalid_Pointer</a> <b>then</b>
+         <b>return</b> True;
+      <b>else</b>
+         <b>return</b> False;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-terminfo__adb.htm#ref_51_13">Is_MinusOne_Pointer</a>;
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-terminfo__adb.htm#ref_51_13">Is_MinusOne_Pointer</a>);
+
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_68_13" href="terminal_interface-curses-terminfo__ads.htm#ref_65_13">Get_Flag</a></span> (<span class="symbol"><a name="ref_68_23" href="terminal_interface-curses-terminfo__ads.htm#ref_65_23">Name</a></span> : String) <b>return</b> Boolean
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_70_16">tigetflag</a></span> (<span class="symbol"><a name="ref_70_27">id</a></span> : char_array) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>;
+      <b>pragma</b> Import (C, tigetflag);
+      <span class="symbol"><a name="ref_72_7">Txt</a></span>    : char_array (0 .. <a href="terminal_interface-curses-terminfo__ads.htm#ref_65_23">Name</a>'Length);
+      <span class="symbol"><a name="ref_73_7">Length</a></span> : size_t;
+   <b>begin</b>
+      To_C (<a href="terminal_interface-curses-terminfo__ads.htm#ref_65_23">Name</a>, <a href="terminal_interface-curses-terminfo__adb.htm#ref_72_7">Txt</a>, <a href="terminal_interface-curses-terminfo__adb.htm#ref_73_7">Length</a>);
+      <b>if</b> <a href="terminal_interface-curses-terminfo__adb.htm#ref_70_16">tigetflag</a> (<a href="terminal_interface-curses-terminfo__adb.htm#ref_72_7">Txt</a>) = <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a> (<a href="terminal_interface-curses-aux__ads.htm#ref_66_4">Curses_True</a>) <b>then</b>
+         <b>return</b> True;
+      <b>else</b>
+         <b>return</b> False;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-terminfo__ads.htm#ref_65_13">Get_Flag</a>;
+
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_84_14" href="terminal_interface-curses-terminfo__ads.htm#ref_58_14">Get_String</a></span> (<span class="symbol"><a name="ref_84_26" href="terminal_interface-curses-terminfo__ads.htm#ref_58_26">Name</a></span>   : String;
+                         <span class="symbol"><a name="ref_85_26" href="terminal_interface-curses-terminfo__ads.htm#ref_59_26">Value</a></span>  : <b>out</b> Terminfo_String;
+                         <span class="symbol"><a name="ref_86_26" href="terminal_interface-curses-terminfo__ads.htm#ref_60_26">Result</a></span> : <b>out</b> Boolean)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_88_16">tigetstr</a></span> (<span class="symbol"><a name="ref_88_26">id</a></span> : char_array) <b>return</b> chars_ptr;
+      <b>pragma</b> Import (C, tigetstr, "tigetstr");
+      <span class="symbol"><a name="ref_90_7">Txt</a></span>    : char_array (0 .. <a href="terminal_interface-curses-terminfo__ads.htm#ref_58_26">Name</a>'Length);
+      <span class="symbol"><a name="ref_91_7">Length</a></span> : size_t;
+      <span class="symbol"><a name="ref_92_7">Txt2</a></span> : chars_ptr;
+   <b>begin</b>
+      To_C (<a href="terminal_interface-curses-terminfo__ads.htm#ref_58_26">Name</a>, <a href="terminal_interface-curses-terminfo__adb.htm#ref_90_7">Txt</a>, <a href="terminal_interface-curses-terminfo__adb.htm#ref_91_7">Length</a>);
+      <a href="terminal_interface-curses-terminfo__adb.htm#ref_92_7">Txt2</a> := <a href="terminal_interface-curses-terminfo__adb.htm#ref_88_16">tigetstr</a> (<a href="terminal_interface-curses-terminfo__adb.htm#ref_90_7">Txt</a>);
+      <b>if</b> <a href="terminal_interface-curses-terminfo__adb.htm#ref_92_7">Txt2</a> = Null_Ptr <b>then</b>
+         <a href="terminal_interface-curses-terminfo__ads.htm#ref_60_26">Result</a> := False;
+      <b>elsif</b> <a href="terminal_interface-curses-terminfo__adb.htm#ref_51_13">Is_MinusOne_Pointer</a> (<a href="terminal_interface-curses-terminfo__adb.htm#ref_92_7">Txt2</a>) <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>else</b>
+         <a href="terminal_interface-curses-terminfo__ads.htm#ref_59_26">Value</a>  := Terminfo_String (<a href="terminal_interface-curses-aux__ads.htm#ref_96_13">Fill_String</a> (<a href="terminal_interface-curses-terminfo__adb.htm#ref_92_7">Txt2</a>));
+         <a href="terminal_interface-curses-terminfo__ads.htm#ref_60_26">Result</a> := True;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-terminfo__ads.htm#ref_58_14">Get_String</a>;
+
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_107_13" href="terminal_interface-curses-terminfo__ads.htm#ref_61_13">Has_String</a></span> (<span class="symbol"><a name="ref_107_25" href="terminal_interface-curses-terminfo__ads.htm#ref_61_25">Name</a></span> : String) <b>return</b> Boolean
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_109_16">tigetstr</a></span> (<span class="symbol"><a name="ref_109_26">id</a></span> : char_array) <b>return</b> chars_ptr;
+      <b>pragma</b> Import (C, tigetstr, "tigetstr");
+      <span class="symbol"><a name="ref_111_7">Txt</a></span>    : char_array (0 .. <a href="terminal_interface-curses-terminfo__ads.htm#ref_61_25">Name</a>'Length);
+      <span class="symbol"><a name="ref_112_7">Length</a></span> : size_t;
+      <span class="symbol"><a name="ref_113_7">Txt2</a></span> : chars_ptr;
+   <b>begin</b>
+      To_C (<a href="terminal_interface-curses-terminfo__ads.htm#ref_61_25">Name</a>, <a href="terminal_interface-curses-terminfo__adb.htm#ref_111_7">Txt</a>, <a href="terminal_interface-curses-terminfo__adb.htm#ref_112_7">Length</a>);
+      <a href="terminal_interface-curses-terminfo__adb.htm#ref_113_7">Txt2</a> := <a href="terminal_interface-curses-terminfo__adb.htm#ref_109_16">tigetstr</a> (<a href="terminal_interface-curses-terminfo__adb.htm#ref_111_7">Txt</a>);
+      <b>if</b> <a href="terminal_interface-curses-terminfo__adb.htm#ref_113_7">Txt2</a> = Null_Ptr <b>then</b>
+         <b>return</b> False;
+      <b>elsif</b> <a href="terminal_interface-curses-terminfo__adb.htm#ref_51_13">Is_MinusOne_Pointer</a> (<a href="terminal_interface-curses-terminfo__adb.htm#ref_113_7">Txt2</a>) <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>else</b>
+         <b>return</b> True;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-terminfo__ads.htm#ref_61_13">Has_String</a>;
+
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_127_13" href="terminal_interface-curses-terminfo__ads.htm#ref_69_13">Get_Number</a></span> (<span class="symbol"><a name="ref_127_25" href="terminal_interface-curses-terminfo__ads.htm#ref_69_25">Name</a></span> : String) <b>return</b> Integer <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_128_16">tigetstr</a></span> (<span class="symbol"><a name="ref_128_26">s</a></span> : char_array) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, tigetstr);
+      <span class="symbol"><a name="ref_130_7">Txt</a></span>    : char_array (0 .. <a href="terminal_interface-curses-terminfo__ads.htm#ref_69_25">Name</a>'Length);
+      <span class="symbol"><a name="ref_131_7">Length</a></span> : size_t;
+   <b>begin</b>
+      To_C (<a href="terminal_interface-curses-terminfo__ads.htm#ref_69_25">Name</a>, <a href="terminal_interface-curses-terminfo__adb.htm#ref_130_7">Txt</a>, <a href="terminal_interface-curses-terminfo__adb.htm#ref_131_7">Length</a>);
+      <b>return</b> Integer (<a href="terminal_interface-curses-terminfo__adb.htm#ref_128_16">tigetstr</a> (<a href="terminal_interface-curses-terminfo__adb.htm#ref_130_7">Txt</a>));
+   <b>end</b> <a href="terminal_interface-curses-terminfo__ads.htm#ref_69_13">Get_Number</a>;
+
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_138_14" href="terminal_interface-curses-terminfo__ads.htm#ref_77_14">Put_String</a></span> (<span class="symbol"><a name="ref_138_26" href="terminal_interface-curses-terminfo__ads.htm#ref_77_26">Str</a></span>    : <a href="terminal_interface-curses-terminfo__ads.htm#ref_45_35">Terminfo_String</a>;
+                         <span class="symbol"><a name="ref_139_26" href="terminal_interface-curses-terminfo__ads.htm#ref_78_26">affcnt</a></span> : Natural := 1;
+                         <span class="symbol"><a name="ref_140_26" href="terminal_interface-curses-terminfo__ads.htm#ref_79_26">putc</a></span>   : <a href="terminal_interface-curses-terminfo__ads.htm#ref_72_9">putctype</a> := <b>null</b>) <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_141_16">tputs</a></span> (<span class="symbol"><a name="ref_141_23">str</a></span>    : char_array;
+                      <span class="symbol"><a name="ref_142_23">affcnt</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+                      <span class="symbol"><a name="ref_143_23">putc</a></span>   : <a href="terminal_interface-curses-terminfo__ads.htm#ref_72_9">putctype</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>function</b> <span class="symbol"><a name="ref_144_16">putp</a></span> (<span class="symbol"><a name="ref_144_22">str</a></span> : char_array) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, tputs);
+      <b>pragma</b> Import (C, putp);
+      <span class="symbol"><a name="ref_147_7">Txt</a></span>    : char_array (0 .. <a href="terminal_interface-curses-terminfo__ads.htm#ref_77_26">Str</a>'Length);
+      <span class="symbol"><a name="ref_148_7">Length</a></span> : size_t;
+      <span class="symbol"><a name="ref_149_7">Err</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+   <b>begin</b>
+      To_C (String (<a href="terminal_interface-curses-terminfo__ads.htm#ref_77_26">Str</a>), <a href="terminal_interface-curses-terminfo__adb.htm#ref_147_7">Txt</a>, <a href="terminal_interface-curses-terminfo__adb.htm#ref_148_7">Length</a>);
+      <b>if</b> <a href="terminal_interface-curses-terminfo__ads.htm#ref_79_26">putc</a> = <b>null</b> <b>then</b>
+         <a href="terminal_interface-curses-terminfo__adb.htm#ref_149_7">Err</a> := <a href="terminal_interface-curses-terminfo__adb.htm#ref_144_16">putp</a> (<a href="terminal_interface-curses-terminfo__adb.htm#ref_147_7">Txt</a>);
+      <b>else</b>
+         <a href="terminal_interface-curses-terminfo__adb.htm#ref_149_7">Err</a> := <a href="terminal_interface-curses-terminfo__adb.htm#ref_141_16">tputs</a> (<a href="terminal_interface-curses-terminfo__adb.htm#ref_147_7">Txt</a>, <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses-terminfo__ads.htm#ref_78_26">affcnt</a>), <a href="terminal_interface-curses-terminfo__ads.htm#ref_79_26">putc</a>);
+      <b>end</b> <b>if</b>;
+      <b>if</b> <a href="terminal_interface-curses-terminfo__adb.htm#ref_149_7">Err</a> = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-terminfo__ads.htm#ref_77_14">Put_String</a>;
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-terminfo__ads.htm#ref_45_35">Terminfo</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-terminfo__ads.htm b/doc/html/ada/terminal_interface-curses-terminfo__ads.htm
new file mode 100644
index 0000000..5859280
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-terminfo__ads.htm
@@ -0,0 +1,100 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-terminfo.ads</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-terminfo.ads </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                     Terminal_Interface.Curses.Terminfo                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 S P E C                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 2000-2002,2003 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.5 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+
+<b>with</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C;
+
+<b>package</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<span class="symbol"><a name="ref_45_35" href="terminal_interface-curses-terminfo__adb.htm#ref_49_40">Terminfo</a></span> <b>is</b>
+   <b>pragma</b> Preelaborate (<a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-terminfo__ads.htm#ref_45_35">Terminfo</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page curs_terminfo.3x</em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  Not implemented:  setupterm, setterm, set_curterm, del_curterm,</em></span>
+   <span class="comment"><em>--                    restartterm, tparm, putp, vidputs,  vidattr,</em></span>
+   <span class="comment"><em>--                    mvcur</em></span>
+
+   <b>type</b> Terminfo_String <b>is</b> <b>new</b> String;
+
+   <span class="comment"><em>--  |</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_58_14" href="terminal_interface-curses-terminfo__adb.htm#ref_84_14">Get_String</a></span> (<span class="symbol"><a name="ref_58_26" href="terminal_interface-curses-terminfo__adb.htm#ref_84_26">Name</a></span>   : String;
+                         <span class="symbol"><a name="ref_59_26" href="terminal_interface-curses-terminfo__adb.htm#ref_85_26">Value</a></span>  : <b>out</b> Terminfo_String;
+                         <span class="symbol"><a name="ref_60_26" href="terminal_interface-curses-terminfo__adb.htm#ref_86_26">Result</a></span> : <b>out</b> Boolean);
+   <b>function</b> <span class="symbol"><a name="ref_61_13" href="terminal_interface-curses-terminfo__adb.htm#ref_107_13">Has_String</a></span> (<span class="symbol"><a name="ref_61_25" href="terminal_interface-curses-terminfo__adb.htm#ref_107_25">Name</a></span> : String) <b>return</b> Boolean;
+   <span class="comment"><em>--  AKA: tigetstr()</em></span>
+
+   <span class="comment"><em>--  |</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_65_13" href="terminal_interface-curses-terminfo__adb.htm#ref_68_13">Get_Flag</a></span> (<span class="symbol"><a name="ref_65_23" href="terminal_interface-curses-terminfo__adb.htm#ref_68_23">Name</a></span> : String) <b>return</b> Boolean;
+   <span class="comment"><em>--  AKA: tigetflag()</em></span>
+
+   <span class="comment"><em>--  |</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_69_13" href="terminal_interface-curses-terminfo__adb.htm#ref_127_13">Get_Number</a></span> (<span class="symbol"><a name="ref_69_25" href="terminal_interface-curses-terminfo__adb.htm#ref_127_25">Name</a></span> : String) <b>return</b> Integer;
+   <span class="comment"><em>--  AKA: tigetnum()</em></span>
+
+   <b>type</b> <span class="symbol"><a name="ref_72_9">putctype</a></span> <b>is</b> <b>access</b> <b>function</b> (<span class="symbol"><a name="ref_72_38">c</a></span> : <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.int)
+                                    <b>return</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.int;
+   <b>pragma</b> Convention (C, <a href="terminal_interface-curses-terminfo__ads.htm#ref_72_9">putctype</a>);
+
+   <span class="comment"><em>--  |</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_77_14" href="terminal_interface-curses-terminfo__adb.htm#ref_138_14">Put_String</a></span> (<span class="symbol"><a name="ref_77_26" href="terminal_interface-curses-terminfo__adb.htm#ref_138_26">Str</a></span>    : Terminfo_String;
+                         <span class="symbol"><a name="ref_78_26" href="terminal_interface-curses-terminfo__adb.htm#ref_139_26">affcnt</a></span> : Natural := 1;
+                         <span class="symbol"><a name="ref_79_26" href="terminal_interface-curses-terminfo__adb.htm#ref_140_26">putc</a></span>   : <a href="terminal_interface-curses-terminfo__ads.htm#ref_72_9">putctype</a> := <b>null</b>);
+   <span class="comment"><em>--  AKA: tputs()</em></span>
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-terminfo__ads.htm#ref_45_35">Terminfo</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-text_io-aux__adb.htm b/doc/html/ada/terminal_interface-curses-text_io-aux__adb.htm
new file mode 100644
index 0000000..6ce4a43
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-text_io-aux__adb.htm
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-text_io-aux.adb</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-text_io-aux.adb </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                   Terminal_Interface.Curses.Text_IO.Aux                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 B O D Y                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1999-2006,2009 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.14 @</em></span>
+<span class="comment"><em>--  @Date: 2020/02/02 23:34:34 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>package</b> <b>body</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<span class="symbol"><a name="ref_43_48" href="terminal_interface-curses-text_io-aux__ads.htm#ref_43_51">Aux</a></span> <b>is</b>
+
+   <b>procedure</b> <span class="symbol"><a name="ref_45_14" href="terminal_interface-curses-text_io-aux__ads.htm#ref_49_14">Put_Buf</a></span>
+     (<span class="symbol"><a name="ref_46_7" href="terminal_interface-curses-text_io-aux__ads.htm#ref_50_7">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <span class="symbol"><a name="ref_47_7" href="terminal_interface-curses-text_io-aux__ads.htm#ref_51_7">Buf</a></span>    : String;
+      <span class="symbol"><a name="ref_48_7" href="terminal_interface-curses-text_io-aux__ads.htm#ref_52_7">Width</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a>;
+      <span class="symbol"><a name="ref_49_7" href="terminal_interface-curses-text_io-aux__ads.htm#ref_53_7">Signal</a></span> : Boolean := True;
+      <span class="symbol"><a name="ref_50_7" href="terminal_interface-curses-text_io-aux__ads.htm#ref_54_7">Ljust</a></span>  : Boolean := False)
+   <b>is</b>
+      <span class="symbol"><a name="ref_52_7">L</a></span>   : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a>;
+      <span class="symbol"><a name="ref_53_7">Len</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a>;
+      <span class="symbol"><a name="ref_54_7">W</a></span>   : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-aux__ads.htm#ref_52_7">Width</a>;
+      <span class="symbol"><a name="ref_55_7">LC</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a>;
+      <span class="symbol"><a name="ref_56_7">CC</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a>;
+      <span class="symbol"><a name="ref_57_7">Y</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_58_7">X</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+
+      <b>procedure</b> <span class="symbol"><a name="ref_60_17" href="terminal_interface-curses-text_io-aux__adb.htm#ref_62_17">Output</a></span> (<span class="symbol"><a name="ref_60_25" href="terminal_interface-curses-text_io-aux__adb.htm#ref_62_25">From</a></span>, <span class="symbol"><a name="ref_60_31" href="terminal_interface-curses-text_io-aux__adb.htm#ref_62_31">To</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a>);
+
+      <b>procedure</b> <span class="symbol"><a name="ref_62_17" href="terminal_interface-curses-text_io-aux__adb.htm#ref_60_17">Output</a></span> (<span class="symbol"><a name="ref_62_25" href="terminal_interface-curses-text_io-aux__adb.htm#ref_60_25">From</a></span>, <span class="symbol"><a name="ref_62_31" href="terminal_interface-curses-text_io-aux__adb.htm#ref_60_31">To</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a>)
+      <b>is</b>
+      <b>begin</b>
+         <b>if</b> <a href="terminal_interface-curses-text_io-aux__adb.htm#ref_53_7">Len</a> &gt; 0 <b>then</b>
+            <b>if</b> <a href="terminal_interface-curses-text_io-aux__adb.htm#ref_54_7">W</a> = 0 <b>then</b>
+               <a href="terminal_interface-curses-text_io-aux__adb.htm#ref_54_7">W</a> := <a href="terminal_interface-curses-text_io-aux__adb.htm#ref_53_7">Len</a>;
+            <b>end</b> <b>if</b>;
+            <b>if</b> <a href="terminal_interface-curses-text_io-aux__adb.htm#ref_53_7">Len</a> &gt; <a href="terminal_interface-curses-text_io-aux__adb.htm#ref_54_7">W</a> <b>then</b>
+               <span class="comment"><em>--  LRM A10.6 (7) says this</em></span>
+               <a href="terminal_interface-curses-text_io-aux__adb.htm#ref_54_7">W</a> := <a href="terminal_interface-curses-text_io-aux__adb.htm#ref_53_7">Len</a>;
+            <b>end</b> <b>if</b>;
+
+            <b>pragma</b> Assert (<a href="terminal_interface-curses-text_io-aux__adb.htm#ref_53_7">Len</a> &lt;= <a href="terminal_interface-curses-text_io-aux__adb.htm#ref_54_7">W</a>);
+            <a href="terminal_interface-curses__ads.htm#ref_1399_14">Get_Size</a> (<a href="terminal_interface-curses-text_io-aux__ads.htm#ref_50_7">Win</a>, <a href="terminal_interface-curses-text_io-aux__adb.htm#ref_55_7">LC</a>, <a href="terminal_interface-curses-text_io-aux__adb.htm#ref_56_7">CC</a>);
+            <b>if</b> <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a> (<a href="terminal_interface-curses-text_io-aux__adb.htm#ref_53_7">Len</a>) &gt; <a href="terminal_interface-curses-text_io-aux__adb.htm#ref_56_7">CC</a> <b>then</b>
+               <b>if</b> <a href="terminal_interface-curses-text_io-aux__ads.htm#ref_53_7">Signal</a> <b>then</b>
+                  <b>raise</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_135_4">Layout_Error</a>;
+               <b>else</b>
+                  <b>return</b>;
+               <b>end</b> <b>if</b>;
+            <b>else</b>
+               <b>if</b> <a href="terminal_interface-curses-text_io-aux__adb.htm#ref_53_7">Len</a> &lt; <a href="terminal_interface-curses-text_io-aux__adb.htm#ref_54_7">W</a> <b>and</b> <b>then</b> <b>not</b> <a href="terminal_interface-curses-text_io-aux__ads.htm#ref_54_7">Ljust</a> <b>then</b>
+                  <b>declare</b>
+                     <span class="symbol"><a name="ref_85_22">Filler</a></span> : <b>constant</b> String (1 .. (<a href="terminal_interface-curses-text_io-aux__adb.htm#ref_54_7">W</a> - <a href="terminal_interface-curses-text_io-aux__adb.htm#ref_53_7">Len</a>))
+                       := (<b>others</b> =&gt; ' ');
+                  <b>begin</b>
+                     <a href="terminal_interface-curses-text_io__ads.htm#ref_116_14">Put</a> (<a href="terminal_interface-curses-text_io-aux__ads.htm#ref_50_7">Win</a>, <a href="terminal_interface-curses-text_io-aux__adb.htm#ref_85_22">Filler</a>);
+                  <b>end</b>;
+               <b>end</b> <b>if</b>;
+               <a href="terminal_interface-curses__ads.htm#ref_1415_14">Get_Cursor_Position</a> (<a href="terminal_interface-curses-text_io-aux__ads.htm#ref_50_7">Win</a>, <a href="terminal_interface-curses-text_io-aux__adb.htm#ref_57_7">Y</a>, <a href="terminal_interface-curses-text_io-aux__adb.htm#ref_58_7">X</a>);
+               <b>if</b> (<a href="terminal_interface-curses-text_io-aux__adb.htm#ref_58_7">X</a> + <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a> (<a href="terminal_interface-curses-text_io-aux__adb.htm#ref_53_7">Len</a>)) &gt; <a href="terminal_interface-curses-text_io-aux__adb.htm#ref_56_7">CC</a> <b>then</b>
+                  <a href="terminal_interface-curses-text_io__ads.htm#ref_87_14">New_Line</a> (<a href="terminal_interface-curses-text_io-aux__ads.htm#ref_50_7">Win</a>);
+               <b>end</b> <b>if</b>;
+               <a href="terminal_interface-curses-text_io__ads.htm#ref_116_14">Put</a> (<a href="terminal_interface-curses-text_io-aux__ads.htm#ref_50_7">Win</a>, <a href="terminal_interface-curses-text_io-aux__ads.htm#ref_51_7">Buf</a> (<a href="terminal_interface-curses-text_io-aux__adb.htm#ref_60_25">From</a> .. <a href="terminal_interface-curses-text_io-aux__adb.htm#ref_60_31">To</a>));
+               <b>if</b> <a href="terminal_interface-curses-text_io-aux__adb.htm#ref_53_7">Len</a> &lt; <a href="terminal_interface-curses-text_io-aux__adb.htm#ref_54_7">W</a> <b>and</b> <b>then</b> <a href="terminal_interface-curses-text_io-aux__ads.htm#ref_54_7">Ljust</a> <b>then</b>
+                  <b>declare</b>
+                     <span class="symbol"><a name="ref_98_22">Filler</a></span> : <b>constant</b> String (1 .. (<a href="terminal_interface-curses-text_io-aux__adb.htm#ref_54_7">W</a> - <a href="terminal_interface-curses-text_io-aux__adb.htm#ref_53_7">Len</a>))
+                       := (<b>others</b> =&gt; ' ');
+                  <b>begin</b>
+                     <a href="terminal_interface-curses-text_io__ads.htm#ref_116_14">Put</a> (<a href="terminal_interface-curses-text_io-aux__ads.htm#ref_50_7">Win</a>, <a href="terminal_interface-curses-text_io-aux__adb.htm#ref_98_22">Filler</a>);
+                  <b>end</b>;
+               <b>end</b> <b>if</b>;
+            <b>end</b> <b>if</b>;
+         <b>end</b> <b>if</b>;
+      <b>end</b> <a href="terminal_interface-curses-text_io-aux__adb.htm#ref_60_17">Output</a>;
+
+   <b>begin</b>
+      <b>pragma</b> Assert (<a href="terminal_interface-curses-text_io-aux__ads.htm#ref_50_7">Win</a> /= <a href="terminal_interface-curses__ads.htm#ref_57_4">Null_Window</a>);
+      <b>if</b> <a href="terminal_interface-curses-text_io-aux__ads.htm#ref_54_7">Ljust</a> <b>then</b>
+         <a href="terminal_interface-curses-text_io-aux__adb.htm#ref_52_7">L</a> := 1;
+         <b>for</b> <span class="symbol"><a name="ref_112_14">I</a></span> <b>in</b> 1 .. <a href="terminal_interface-curses-text_io-aux__ads.htm#ref_51_7">Buf</a>'Length <b>loop</b>
+            <b>exit</b> <b>when</b> <a href="terminal_interface-curses-text_io-aux__ads.htm#ref_51_7">Buf</a> (<a href="terminal_interface-curses-text_io-aux__adb.htm#ref_52_7">L</a>) = ' ';
+            <a href="terminal_interface-curses-text_io-aux__adb.htm#ref_52_7">L</a> := <a href="terminal_interface-curses-text_io-aux__adb.htm#ref_52_7">L</a> + 1;
+         <b>end</b> <b>loop</b>;
+         <a href="terminal_interface-curses-text_io-aux__adb.htm#ref_53_7">Len</a> := <a href="terminal_interface-curses-text_io-aux__adb.htm#ref_52_7">L</a> - 1;
+         <a href="terminal_interface-curses-text_io-aux__adb.htm#ref_60_17">Output</a> (1, <a href="terminal_interface-curses-text_io-aux__adb.htm#ref_53_7">Len</a>);
+      <b>else</b>  <span class="comment"><em>-- input buffer is not left justified</em></span>
+         <a href="terminal_interface-curses-text_io-aux__adb.htm#ref_52_7">L</a> := <a href="terminal_interface-curses-text_io-aux__ads.htm#ref_51_7">Buf</a>'Length;
+         <b>for</b> <span class="symbol"><a name="ref_120_14">I</a></span> <b>in</b> 1 .. <a href="terminal_interface-curses-text_io-aux__ads.htm#ref_51_7">Buf</a>'Length <b>loop</b>
+            <b>exit</b> <b>when</b> <a href="terminal_interface-curses-text_io-aux__ads.htm#ref_51_7">Buf</a> (<a href="terminal_interface-curses-text_io-aux__adb.htm#ref_52_7">L</a>) = ' ';
+            <a href="terminal_interface-curses-text_io-aux__adb.htm#ref_52_7">L</a> := <a href="terminal_interface-curses-text_io-aux__adb.htm#ref_52_7">L</a> - 1;
+         <b>end</b> <b>loop</b>;
+         <a href="terminal_interface-curses-text_io-aux__adb.htm#ref_53_7">Len</a> := <a href="terminal_interface-curses-text_io-aux__ads.htm#ref_51_7">Buf</a>'Length - <a href="terminal_interface-curses-text_io-aux__adb.htm#ref_52_7">L</a>;
+         <a href="terminal_interface-curses-text_io-aux__adb.htm#ref_60_17">Output</a> (<a href="terminal_interface-curses-text_io-aux__adb.htm#ref_52_7">L</a> + 1, <a href="terminal_interface-curses-text_io-aux__ads.htm#ref_51_7">Buf</a>'Length);
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-text_io-aux__ads.htm#ref_49_14">Put_Buf</a>;
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<a href="terminal_interface-curses-text_io-aux__ads.htm#ref_43_51">Aux</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-text_io-aux__ads.htm b/doc/html/ada/terminal_interface-curses-text_io-aux__ads.htm
new file mode 100644
index 0000000..8258986
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-text_io-aux__ads.htm
@@ -0,0 +1,74 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-text_io-aux.ads</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-text_io-aux.ads </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                   Terminal_Interface.Curses.Text_IO.Aux                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 S P E C                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1999-2006,2009 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.15 @</em></span>
+<span class="comment"><em>--  @Date: 2020/02/02 23:34:34 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>private</b> <b>package</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<span class="symbol"><a name="ref_43_51" href="terminal_interface-curses-text_io-aux__adb.htm#ref_43_48">Aux</a></span> <b>is</b>
+   <span class="comment"><em>--  pragma Preelaborate (Aux);</em></span>
+
+   <span class="comment"><em>--  This routine is called from the Text_IO output routines for numeric</em></span>
+   <span class="comment"><em>--  and enumeration types.</em></span>
+   <span class="comment"><em>--</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_49_14" href="terminal_interface-curses-text_io-aux__adb.htm#ref_45_14">Put_Buf</a></span>
+     (<span class="symbol"><a name="ref_50_7" href="terminal_interface-curses-text_io-aux__adb.htm#ref_46_7">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;               <span class="comment"><em>-- The output window</em></span>
+      <span class="symbol"><a name="ref_51_7" href="terminal_interface-curses-text_io-aux__adb.htm#ref_47_7">Buf</a></span>    : String;               <span class="comment"><em>-- The buffer containing the text</em></span>
+      <span class="symbol"><a name="ref_52_7" href="terminal_interface-curses-text_io-aux__adb.htm#ref_48_7">Width</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a>;                <span class="comment"><em>-- The width of the output field</em></span>
+      <span class="symbol"><a name="ref_53_7" href="terminal_interface-curses-text_io-aux__adb.htm#ref_49_7">Signal</a></span> : Boolean := True;      <span class="comment"><em>-- If true, we raise Layout_Error</em></span>
+      <span class="symbol"><a name="ref_54_7" href="terminal_interface-curses-text_io-aux__adb.htm#ref_50_7">Ljust</a></span>  : Boolean := False);    <span class="comment"><em>-- The Buf is left justified</em></span>
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<a href="terminal_interface-curses-text_io-aux__ads.htm#ref_43_51">Aux</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-text_io-complex_io__adb.htm b/doc/html/ada/terminal_interface-curses-text_io-complex_io__adb.htm
new file mode 100644
index 0000000..cad3300
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-text_io-complex_io__adb.htm
@@ -0,0 +1,92 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-text_io-complex_io.adb</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-text_io-complex_io.adb </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--               Terminal_Interface.Curses.Text_IO.Complex_IO               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 B O D Y                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.12 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>with</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<a href="terminal_interface-curses-text_io-float_io__ads.htm#ref_45_43">Float_IO</a>;
+
+<b>package</b> <b>body</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<span class="symbol"><a name="ref_44_48" href="terminal_interface-curses-text_io-complex_io__ads.htm#ref_47_43">Complex_IO</a></span> <b>is</b>
+
+   <b>package</b> FIO <b>is</b> <b>new</b>
+     <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<a href="terminal_interface-curses-text_io-float_io__ads.htm#ref_45_43">Float_IO</a> (Complex_Types.Real'Base);
+
+   <b>procedure</b> <span class="symbol"><a name="ref_49_14" href="terminal_interface-curses-text_io-complex_io__ads.htm#ref_55_14">Put</a></span>
+     (<span class="symbol"><a name="ref_50_7" href="terminal_interface-curses-text_io-complex_io__ads.htm#ref_56_7">Win</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      Item : Complex;
+      <span class="symbol"><a name="ref_52_7" href="terminal_interface-curses-text_io-complex_io__ads.htm#ref_58_7">Fore</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-complex_io__ads.htm#ref_51_4">Default_Fore</a>;
+      <span class="symbol"><a name="ref_53_7" href="terminal_interface-curses-text_io-complex_io__ads.htm#ref_59_7">Aft</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-complex_io__ads.htm#ref_52_4">Default_Aft</a>;
+      <span class="symbol"><a name="ref_54_7" href="terminal_interface-curses-text_io-complex_io__ads.htm#ref_60_7">Exp</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-complex_io__ads.htm#ref_53_4">Default_Exp</a>)
+   <b>is</b>
+   <b>begin</b>
+      <a href="terminal_interface-curses-text_io__ads.htm#ref_109_14">Put</a> (<a href="terminal_interface-curses-text_io-complex_io__ads.htm#ref_56_7">Win</a>, '(');
+      FIO.<a href="terminal_interface-curses-text_io-float_io__ads.htm#ref_51_14">Put</a> (<a href="terminal_interface-curses-text_io-complex_io__ads.htm#ref_56_7">Win</a>, Item.Re, <a href="terminal_interface-curses-text_io-complex_io__ads.htm#ref_58_7">Fore</a>, <a href="terminal_interface-curses-text_io-complex_io__ads.htm#ref_59_7">Aft</a>, <a href="terminal_interface-curses-text_io-complex_io__ads.htm#ref_60_7">Exp</a>);
+      <a href="terminal_interface-curses-text_io__ads.htm#ref_109_14">Put</a> (<a href="terminal_interface-curses-text_io-complex_io__ads.htm#ref_56_7">Win</a>, ',');
+      FIO.<a href="terminal_interface-curses-text_io-float_io__ads.htm#ref_51_14">Put</a> (<a href="terminal_interface-curses-text_io-complex_io__ads.htm#ref_56_7">Win</a>, Item.Im, <a href="terminal_interface-curses-text_io-complex_io__ads.htm#ref_58_7">Fore</a>, <a href="terminal_interface-curses-text_io-complex_io__ads.htm#ref_59_7">Aft</a>, <a href="terminal_interface-curses-text_io-complex_io__ads.htm#ref_60_7">Exp</a>);
+      <a href="terminal_interface-curses-text_io__ads.htm#ref_109_14">Put</a> (<a href="terminal_interface-curses-text_io-complex_io__ads.htm#ref_56_7">Win</a>, ')');
+   <b>end</b> <a href="terminal_interface-curses-text_io-complex_io__ads.htm#ref_55_14">Put</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_64_14" href="terminal_interface-curses-text_io-complex_io__ads.htm#ref_62_14">Put</a></span>
+     (Item : Complex;
+      <span class="symbol"><a name="ref_66_7" href="terminal_interface-curses-text_io-complex_io__ads.htm#ref_64_7">Fore</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-complex_io__ads.htm#ref_51_4">Default_Fore</a>;
+      <span class="symbol"><a name="ref_67_7" href="terminal_interface-curses-text_io-complex_io__ads.htm#ref_65_7">Aft</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-complex_io__ads.htm#ref_52_4">Default_Aft</a>;
+      <span class="symbol"><a name="ref_68_7" href="terminal_interface-curses-text_io-complex_io__ads.htm#ref_66_7">Exp</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-complex_io__ads.htm#ref_53_4">Default_Exp</a>)
+   <b>is</b>
+   <b>begin</b>
+      <a href="terminal_interface-curses-text_io-complex_io__ads.htm#ref_55_14">Put</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_63_13">Get_Window</a>, Item, <a href="terminal_interface-curses-text_io-complex_io__ads.htm#ref_64_7">Fore</a>, <a href="terminal_interface-curses-text_io-complex_io__ads.htm#ref_65_7">Aft</a>, <a href="terminal_interface-curses-text_io-complex_io__ads.htm#ref_66_7">Exp</a>);
+   <b>end</b> <a href="terminal_interface-curses-text_io-complex_io__ads.htm#ref_62_14">Put</a>;
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<a href="terminal_interface-curses-text_io-complex_io__ads.htm#ref_47_43">Complex_IO</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-text_io-complex_io__ads.htm b/doc/html/ada/terminal_interface-curses-text_io-complex_io__ads.htm
new file mode 100644
index 0000000..ac7607e
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-text_io-complex_io__ads.htm
@@ -0,0 +1,89 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-text_io-complex_io.ads</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-text_io-complex_io.ads </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--               Terminal_Interface.Curses.Text_IO.Complex_IO               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 S P E C                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.12 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>with</b> Ada.Numerics.Generic_Complex_Types;
+
+<b>generic</b>
+   <b>with</b> <b>package</b> Complex_Types <b>is</b> <b>new</b> Ada.Numerics.Generic_Complex_Types (&lt;&gt;);
+
+<b>package</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<span class="symbol"><a name="ref_47_43" href="terminal_interface-curses-text_io-complex_io__adb.htm#ref_44_48">Complex_IO</a></span> <b>is</b>
+
+   <b>use</b> Complex_Types;
+
+   <span class="symbol"><a name="ref_51_4">Default_Fore</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := 2;
+   <span class="symbol"><a name="ref_52_4">Default_Aft</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := Real'<b>Digits</b> - 1;
+   <span class="symbol"><a name="ref_53_4">Default_Exp</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := 3;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_55_14" href="terminal_interface-curses-text_io-complex_io__adb.htm#ref_49_14">Put</a></span>
+     (<span class="symbol"><a name="ref_56_7" href="terminal_interface-curses-text_io-complex_io__adb.htm#ref_50_7">Win</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      Item : Complex;
+      <span class="symbol"><a name="ref_58_7" href="terminal_interface-curses-text_io-complex_io__adb.htm#ref_52_7">Fore</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-complex_io__ads.htm#ref_51_4">Default_Fore</a>;
+      <span class="symbol"><a name="ref_59_7" href="terminal_interface-curses-text_io-complex_io__adb.htm#ref_53_7">Aft</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-complex_io__ads.htm#ref_52_4">Default_Aft</a>;
+      <span class="symbol"><a name="ref_60_7" href="terminal_interface-curses-text_io-complex_io__adb.htm#ref_54_7">Exp</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-complex_io__ads.htm#ref_53_4">Default_Exp</a>);
+
+   <b>procedure</b> <span class="symbol"><a name="ref_62_14" href="terminal_interface-curses-text_io-complex_io__adb.htm#ref_64_14">Put</a></span>
+     (Item : Complex;
+      <span class="symbol"><a name="ref_64_7" href="terminal_interface-curses-text_io-complex_io__adb.htm#ref_66_7">Fore</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-complex_io__ads.htm#ref_51_4">Default_Fore</a>;
+      <span class="symbol"><a name="ref_65_7" href="terminal_interface-curses-text_io-complex_io__adb.htm#ref_67_7">Aft</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-complex_io__ads.htm#ref_52_4">Default_Aft</a>;
+      <span class="symbol"><a name="ref_66_7" href="terminal_interface-curses-text_io-complex_io__adb.htm#ref_68_7">Exp</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-complex_io__ads.htm#ref_53_4">Default_Exp</a>);
+
+<b>private</b>
+   <b>pragma</b> Inline (Put);
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<a href="terminal_interface-curses-text_io-complex_io__ads.htm#ref_47_43">Complex_IO</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-text_io-decimal_io__adb.htm b/doc/html/ada/terminal_interface-curses-text_io-decimal_io__adb.htm
new file mode 100644
index 0000000..7977d76
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-text_io-decimal_io__adb.htm
@@ -0,0 +1,94 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-text_io-decimal_io.adb</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-text_io-decimal_io.adb </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--               Terminal_Interface.Curses.Text_IO.Decimal_IO               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 B O D Y                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.12 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>with</b> Ada.Text_IO;
+<b>with</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<a href="terminal_interface-curses-text_io-aux__ads.htm#ref_43_51">Aux</a>;
+
+<b>package</b> <b>body</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<span class="symbol"><a name="ref_45_48" href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_45_43">Decimal_IO</a></span> <b>is</b>
+
+   <b>package</b> <span class="symbol"><a name="ref_47_12">Aux</a></span> <b>renames</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<a href="terminal_interface-curses-text_io-aux__ads.htm#ref_43_51">Aux</a>;
+   <b>package</b> DIO <b>is</b> <b>new</b> Ada.Text_IO.Decimal_IO (<a href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_43_9">Num</a>);
+
+   <b>procedure</b> <span class="symbol"><a name="ref_50_14" href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_51_14">Put</a></span>
+     (<span class="symbol"><a name="ref_51_7" href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_52_7">Win</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <span class="symbol"><a name="ref_52_7" href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_53_7">Item</a></span> : <a href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_43_9">Num</a>;
+      <span class="symbol"><a name="ref_53_7" href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_54_7">Fore</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_47_4">Default_Fore</a>;
+      <span class="symbol"><a name="ref_54_7" href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_55_7">Aft</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_48_4">Default_Aft</a>;
+      <span class="symbol"><a name="ref_55_7" href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_56_7">Exp</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_49_4">Default_Exp</a>)
+   <b>is</b>
+      <span class="symbol"><a name="ref_57_7">Buf</a></span> : String (1 .. <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a>'Last);
+      <span class="symbol"><a name="ref_58_7">Len</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_54_7">Fore</a> + 1 + <a href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_55_7">Aft</a>;
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_56_7">Exp</a> &gt; 0 <b>then</b>
+         <a href="terminal_interface-curses-text_io-decimal_io__adb.htm#ref_58_7">Len</a> := <a href="terminal_interface-curses-text_io-decimal_io__adb.htm#ref_58_7">Len</a> + 1 + <a href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_56_7">Exp</a>;
+      <b>end</b> <b>if</b>;
+      DIO.Put (<a href="terminal_interface-curses-text_io-decimal_io__adb.htm#ref_57_7">Buf</a>, <a href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_53_7">Item</a>, <a href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_55_7">Aft</a>, <a href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_56_7">Exp</a>);
+      <a href="terminal_interface-curses-text_io-decimal_io__adb.htm#ref_47_12">Aux</a>.<a href="terminal_interface-curses-text_io-aux__ads.htm#ref_49_14">Put_Buf</a> (<a href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_52_7">Win</a>, <a href="terminal_interface-curses-text_io-decimal_io__adb.htm#ref_57_7">Buf</a>, <a href="terminal_interface-curses-text_io-decimal_io__adb.htm#ref_58_7">Len</a>, False);
+   <b>end</b> <a href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_51_14">Put</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_67_14" href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_58_14">Put</a></span>
+     (<span class="symbol"><a name="ref_68_7" href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_59_7">Item</a></span> : <a href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_43_9">Num</a>;
+      <span class="symbol"><a name="ref_69_7" href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_60_7">Fore</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_47_4">Default_Fore</a>;
+      <span class="symbol"><a name="ref_70_7" href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_61_7">Aft</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_48_4">Default_Aft</a>;
+      <span class="symbol"><a name="ref_71_7" href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_62_7">Exp</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_49_4">Default_Exp</a>) <b>is</b>
+   <b>begin</b>
+      <a href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_51_14">Put</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_63_13">Get_Window</a>, <a href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_59_7">Item</a>, <a href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_60_7">Fore</a>, <a href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_61_7">Aft</a>, <a href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_62_7">Exp</a>);
+   <b>end</b> <a href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_58_14">Put</a>;
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<a href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_45_43">Decimal_IO</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-text_io-decimal_io__ads.htm b/doc/html/ada/terminal_interface-curses-text_io-decimal_io__ads.htm
new file mode 100644
index 0000000..727165e
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-text_io-decimal_io__ads.htm
@@ -0,0 +1,85 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-text_io-decimal_io.ads</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-text_io-decimal_io.ads </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--               Terminal_Interface.Curses.Text_IO.Decimal_IO               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 S P E C                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.13 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>generic</b>
+   <b>type</b> <span class="symbol"><a name="ref_43_9">Num</a></span> <b>is</b> <b>delta</b> &lt;&gt; <b>digits</b> &lt;&gt;;
+
+<b>package</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<span class="symbol"><a name="ref_45_43" href="terminal_interface-curses-text_io-decimal_io__adb.htm#ref_45_48">Decimal_IO</a></span> <b>is</b>
+
+   <span class="symbol"><a name="ref_47_4">Default_Fore</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_43_9">Num</a>'Fore;
+   <span class="symbol"><a name="ref_48_4">Default_Aft</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_43_9">Num</a>'Aft;
+   <span class="symbol"><a name="ref_49_4">Default_Exp</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := 0;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_51_14" href="terminal_interface-curses-text_io-decimal_io__adb.htm#ref_50_14">Put</a></span>
+     (<span class="symbol"><a name="ref_52_7" href="terminal_interface-curses-text_io-decimal_io__adb.htm#ref_51_7">Win</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <span class="symbol"><a name="ref_53_7" href="terminal_interface-curses-text_io-decimal_io__adb.htm#ref_52_7">Item</a></span> : <a href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_43_9">Num</a>;
+      <span class="symbol"><a name="ref_54_7" href="terminal_interface-curses-text_io-decimal_io__adb.htm#ref_53_7">Fore</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_47_4">Default_Fore</a>;
+      <span class="symbol"><a name="ref_55_7" href="terminal_interface-curses-text_io-decimal_io__adb.htm#ref_54_7">Aft</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_48_4">Default_Aft</a>;
+      <span class="symbol"><a name="ref_56_7" href="terminal_interface-curses-text_io-decimal_io__adb.htm#ref_55_7">Exp</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_49_4">Default_Exp</a>);
+
+   <b>procedure</b> <span class="symbol"><a name="ref_58_14" href="terminal_interface-curses-text_io-decimal_io__adb.htm#ref_67_14">Put</a></span>
+     (<span class="symbol"><a name="ref_59_7" href="terminal_interface-curses-text_io-decimal_io__adb.htm#ref_68_7">Item</a></span> : <a href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_43_9">Num</a>;
+      <span class="symbol"><a name="ref_60_7" href="terminal_interface-curses-text_io-decimal_io__adb.htm#ref_69_7">Fore</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_47_4">Default_Fore</a>;
+      <span class="symbol"><a name="ref_61_7" href="terminal_interface-curses-text_io-decimal_io__adb.htm#ref_70_7">Aft</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_48_4">Default_Aft</a>;
+      <span class="symbol"><a name="ref_62_7" href="terminal_interface-curses-text_io-decimal_io__adb.htm#ref_71_7">Exp</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_49_4">Default_Exp</a>);
+
+<b>private</b>
+   <b>pragma</b> Inline (Put);
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<a href="terminal_interface-curses-text_io-decimal_io__ads.htm#ref_45_43">Decimal_IO</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-text_io-enumeration_io__adb.htm b/doc/html/ada/terminal_interface-curses-text_io-enumeration_io__adb.htm
new file mode 100644
index 0000000..9d31605
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-text_io-enumeration_io__adb.htm
@@ -0,0 +1,99 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-text_io-enumeration_io.adb</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-text_io-enumeration_io.adb </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--             Terminal_Interface.Curses.Text_IO.Enumeration_IO             --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 B O D Y                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.12 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>with</b> Ada.Text_IO;
+<b>with</b> Ada.Characters.Handling; <b>use</b> Ada.Characters.Handling;
+<b>with</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<a href="terminal_interface-curses-text_io-aux__ads.htm#ref_43_51">Aux</a>;
+
+<b>package</b> <b>body</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<span class="symbol"><a name="ref_46_48" href="terminal_interface-curses-text_io-enumeration_io__ads.htm#ref_45_43">Enumeration_IO</a></span> <b>is</b>
+
+   <b>package</b> <span class="symbol"><a name="ref_48_12">Aux</a></span> <b>renames</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<a href="terminal_interface-curses-text_io-aux__ads.htm#ref_43_51">Aux</a>;
+   <b>package</b> EIO <b>is</b> <b>new</b> Ada.Text_IO.Enumeration_IO (<a href="terminal_interface-curses-text_io-enumeration_io__ads.htm#ref_43_9">Enum</a>);
+
+   <b>procedure</b> <span class="symbol"><a name="ref_51_14" href="terminal_interface-curses-text_io-enumeration_io__ads.htm#ref_50_14">Put</a></span>
+     (<span class="symbol"><a name="ref_52_7" href="terminal_interface-curses-text_io-enumeration_io__ads.htm#ref_51_7">Win</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <span class="symbol"><a name="ref_53_7" href="terminal_interface-curses-text_io-enumeration_io__ads.htm#ref_52_7">Item</a></span>  : <a href="terminal_interface-curses-text_io-enumeration_io__ads.htm#ref_43_9">Enum</a>;
+      <span class="symbol"><a name="ref_54_7" href="terminal_interface-curses-text_io-enumeration_io__ads.htm#ref_53_7">Width</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-enumeration_io__ads.htm#ref_47_4">Default_Width</a>;
+      <span class="symbol"><a name="ref_55_7" href="terminal_interface-curses-text_io-enumeration_io__ads.htm#ref_54_7">Set</a></span>   : <a href="terminal_interface-curses-text_io__ads.htm#ref_54_9">Type_Set</a> := <a href="terminal_interface-curses-text_io-enumeration_io__ads.htm#ref_48_4">Default_Setting</a>)
+   <b>is</b>
+      <span class="symbol"><a name="ref_57_7">Buf</a></span>  : String (1 .. <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a>'Last);
+      <span class="symbol"><a name="ref_58_7">Tset</a></span> : Ada.Text_IO.Type_Set;
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-text_io-enumeration_io__ads.htm#ref_54_7">Set</a> /= <a href="terminal_interface-curses-text_io__ads.htm#ref_54_46">Mixed_Case</a> <b>then</b>
+         <a href="terminal_interface-curses-text_io-enumeration_io__adb.htm#ref_58_7">Tset</a> := Ada.Text_IO.Type_Set'Val (<a href="terminal_interface-curses-text_io__ads.htm#ref_54_9">Type_Set</a>'Pos (<a href="terminal_interface-curses-text_io-enumeration_io__ads.htm#ref_54_7">Set</a>));
+      <b>else</b>
+         <a href="terminal_interface-curses-text_io-enumeration_io__adb.htm#ref_58_7">Tset</a> := Ada.Text_IO.Lower_Case;
+      <b>end</b> <b>if</b>;
+      EIO.Put (<a href="terminal_interface-curses-text_io-enumeration_io__adb.htm#ref_57_7">Buf</a>, <a href="terminal_interface-curses-text_io-enumeration_io__ads.htm#ref_52_7">Item</a>, <a href="terminal_interface-curses-text_io-enumeration_io__adb.htm#ref_58_7">Tset</a>);
+      <b>if</b> <a href="terminal_interface-curses-text_io-enumeration_io__ads.htm#ref_54_7">Set</a> = <a href="terminal_interface-curses-text_io__ads.htm#ref_54_46">Mixed_Case</a> <b>then</b>
+         <a href="terminal_interface-curses-text_io-enumeration_io__adb.htm#ref_57_7">Buf</a> (<a href="terminal_interface-curses-text_io-enumeration_io__adb.htm#ref_57_7">Buf</a>'First) := To_Upper (<a href="terminal_interface-curses-text_io-enumeration_io__adb.htm#ref_57_7">Buf</a> (<a href="terminal_interface-curses-text_io-enumeration_io__adb.htm#ref_57_7">Buf</a>'First));
+      <b>end</b> <b>if</b>;
+      <a href="terminal_interface-curses-text_io-enumeration_io__adb.htm#ref_48_12">Aux</a>.<a href="terminal_interface-curses-text_io-aux__ads.htm#ref_49_14">Put_Buf</a> (<a href="terminal_interface-curses-text_io-enumeration_io__ads.htm#ref_51_7">Win</a>, <a href="terminal_interface-curses-text_io-enumeration_io__adb.htm#ref_57_7">Buf</a>, <a href="terminal_interface-curses-text_io-enumeration_io__ads.htm#ref_53_7">Width</a>, True, True);
+   <b>end</b> <a href="terminal_interface-curses-text_io-enumeration_io__ads.htm#ref_50_14">Put</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_72_14" href="terminal_interface-curses-text_io-enumeration_io__ads.htm#ref_56_14">Put</a></span>
+     (<span class="symbol"><a name="ref_73_7" href="terminal_interface-curses-text_io-enumeration_io__ads.htm#ref_57_7">Item</a></span>  : <a href="terminal_interface-curses-text_io-enumeration_io__ads.htm#ref_43_9">Enum</a>;
+      <span class="symbol"><a name="ref_74_7" href="terminal_interface-curses-text_io-enumeration_io__ads.htm#ref_58_7">Width</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-enumeration_io__ads.htm#ref_47_4">Default_Width</a>;
+      <span class="symbol"><a name="ref_75_7" href="terminal_interface-curses-text_io-enumeration_io__ads.htm#ref_59_7">Set</a></span>   : <a href="terminal_interface-curses-text_io__ads.htm#ref_54_9">Type_Set</a> := <a href="terminal_interface-curses-text_io-enumeration_io__ads.htm#ref_48_4">Default_Setting</a>)
+   <b>is</b>
+   <b>begin</b>
+      <a href="terminal_interface-curses-text_io-enumeration_io__ads.htm#ref_50_14">Put</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_63_13">Get_Window</a>, <a href="terminal_interface-curses-text_io-enumeration_io__ads.htm#ref_57_7">Item</a>, <a href="terminal_interface-curses-text_io-enumeration_io__ads.htm#ref_58_7">Width</a>, <a href="terminal_interface-curses-text_io-enumeration_io__ads.htm#ref_59_7">Set</a>);
+   <b>end</b> <a href="terminal_interface-curses-text_io-enumeration_io__ads.htm#ref_56_14">Put</a>;
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<a href="terminal_interface-curses-text_io-enumeration_io__ads.htm#ref_45_43">Enumeration_IO</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-text_io-enumeration_io__ads.htm b/doc/html/ada/terminal_interface-curses-text_io-enumeration_io__ads.htm
new file mode 100644
index 0000000..4f7bc7f
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-text_io-enumeration_io__ads.htm
@@ -0,0 +1,82 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-text_io-enumeration_io.ads</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-text_io-enumeration_io.ads </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--             Terminal_Interface.Curses.Text_IO.Enumeration_IO             --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 S P E C                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.13 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>generic</b>
+   <b>type</b> <span class="symbol"><a name="ref_43_9">Enum</a></span> <b>is</b> (&lt;&gt;);
+
+<b>package</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<span class="symbol"><a name="ref_45_43" href="terminal_interface-curses-text_io-enumeration_io__adb.htm#ref_46_48">Enumeration_IO</a></span> <b>is</b>
+
+   <span class="symbol"><a name="ref_47_4">Default_Width</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := 0;
+   <span class="symbol"><a name="ref_48_4">Default_Setting</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_54_9">Type_Set</a> := <a href="terminal_interface-curses-text_io__ads.htm#ref_54_46">Mixed_Case</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_50_14" href="terminal_interface-curses-text_io-enumeration_io__adb.htm#ref_51_14">Put</a></span>
+     (<span class="symbol"><a name="ref_51_7" href="terminal_interface-curses-text_io-enumeration_io__adb.htm#ref_52_7">Win</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <span class="symbol"><a name="ref_52_7" href="terminal_interface-curses-text_io-enumeration_io__adb.htm#ref_53_7">Item</a></span>  : <a href="terminal_interface-curses-text_io-enumeration_io__ads.htm#ref_43_9">Enum</a>;
+      <span class="symbol"><a name="ref_53_7" href="terminal_interface-curses-text_io-enumeration_io__adb.htm#ref_54_7">Width</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-enumeration_io__ads.htm#ref_47_4">Default_Width</a>;
+      <span class="symbol"><a name="ref_54_7" href="terminal_interface-curses-text_io-enumeration_io__adb.htm#ref_55_7">Set</a></span>   : <a href="terminal_interface-curses-text_io__ads.htm#ref_54_9">Type_Set</a> := <a href="terminal_interface-curses-text_io-enumeration_io__ads.htm#ref_48_4">Default_Setting</a>);
+
+   <b>procedure</b> <span class="symbol"><a name="ref_56_14" href="terminal_interface-curses-text_io-enumeration_io__adb.htm#ref_72_14">Put</a></span>
+     (<span class="symbol"><a name="ref_57_7" href="terminal_interface-curses-text_io-enumeration_io__adb.htm#ref_73_7">Item</a></span>  : <a href="terminal_interface-curses-text_io-enumeration_io__ads.htm#ref_43_9">Enum</a>;
+      <span class="symbol"><a name="ref_58_7" href="terminal_interface-curses-text_io-enumeration_io__adb.htm#ref_74_7">Width</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-enumeration_io__ads.htm#ref_47_4">Default_Width</a>;
+      <span class="symbol"><a name="ref_59_7" href="terminal_interface-curses-text_io-enumeration_io__adb.htm#ref_75_7">Set</a></span>   : <a href="terminal_interface-curses-text_io__ads.htm#ref_54_9">Type_Set</a> := <a href="terminal_interface-curses-text_io-enumeration_io__ads.htm#ref_48_4">Default_Setting</a>);
+
+<b>private</b>
+   <b>pragma</b> Inline (Put);
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<a href="terminal_interface-curses-text_io-enumeration_io__ads.htm#ref_45_43">Enumeration_IO</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-text_io-fixed_io__adb.htm b/doc/html/ada/terminal_interface-curses-text_io-fixed_io__adb.htm
new file mode 100644
index 0000000..b14e73e
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-text_io-fixed_io__adb.htm
@@ -0,0 +1,94 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-text_io-fixed_io.adb</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-text_io-fixed_io.adb </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                Terminal_Interface.Curses.Text_IO.Fixed_IO                --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 B O D Y                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.12 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>with</b> Ada.Text_IO;
+<b>with</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<a href="terminal_interface-curses-text_io-aux__ads.htm#ref_43_51">Aux</a>;
+
+<b>package</b> <b>body</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<span class="symbol"><a name="ref_45_48" href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_45_43">Fixed_IO</a></span> <b>is</b>
+
+   <b>package</b> <span class="symbol"><a name="ref_47_12">Aux</a></span> <b>renames</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<a href="terminal_interface-curses-text_io-aux__ads.htm#ref_43_51">Aux</a>;
+   <b>package</b> FIXIO <b>is</b> <b>new</b> Ada.Text_IO.Fixed_IO (<a href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_43_9">Num</a>);
+
+   <b>procedure</b> <span class="symbol"><a name="ref_50_14" href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_51_14">Put</a></span>
+     (<span class="symbol"><a name="ref_51_7" href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_52_7">Win</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <span class="symbol"><a name="ref_52_7" href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_53_7">Item</a></span> : <a href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_43_9">Num</a>;
+      <span class="symbol"><a name="ref_53_7" href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_54_7">Fore</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_47_4">Default_Fore</a>;
+      <span class="symbol"><a name="ref_54_7" href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_55_7">Aft</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_48_4">Default_Aft</a>;
+      <span class="symbol"><a name="ref_55_7" href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_56_7">Exp</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_49_4">Default_Exp</a>)
+   <b>is</b>
+      <span class="symbol"><a name="ref_57_7">Buf</a></span> : String (1 .. <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a>'Last);
+      <span class="symbol"><a name="ref_58_7">Len</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_54_7">Fore</a> + 1 + <a href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_55_7">Aft</a>;
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_56_7">Exp</a> &gt; 0 <b>then</b>
+         <a href="terminal_interface-curses-text_io-fixed_io__adb.htm#ref_58_7">Len</a> := <a href="terminal_interface-curses-text_io-fixed_io__adb.htm#ref_58_7">Len</a> + 1 + <a href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_56_7">Exp</a>;
+      <b>end</b> <b>if</b>;
+      FIXIO.Put (<a href="terminal_interface-curses-text_io-fixed_io__adb.htm#ref_57_7">Buf</a>, <a href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_53_7">Item</a>, <a href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_55_7">Aft</a>, <a href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_56_7">Exp</a>);
+      <a href="terminal_interface-curses-text_io-fixed_io__adb.htm#ref_47_12">Aux</a>.<a href="terminal_interface-curses-text_io-aux__ads.htm#ref_49_14">Put_Buf</a> (<a href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_52_7">Win</a>, <a href="terminal_interface-curses-text_io-fixed_io__adb.htm#ref_57_7">Buf</a>, <a href="terminal_interface-curses-text_io-fixed_io__adb.htm#ref_58_7">Len</a>, False);
+   <b>end</b> <a href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_51_14">Put</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_67_14" href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_58_14">Put</a></span>
+     (<span class="symbol"><a name="ref_68_7" href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_59_7">Item</a></span> : <a href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_43_9">Num</a>;
+      <span class="symbol"><a name="ref_69_7" href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_60_7">Fore</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_47_4">Default_Fore</a>;
+      <span class="symbol"><a name="ref_70_7" href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_61_7">Aft</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_48_4">Default_Aft</a>;
+      <span class="symbol"><a name="ref_71_7" href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_62_7">Exp</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_49_4">Default_Exp</a>) <b>is</b>
+   <b>begin</b>
+      <a href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_51_14">Put</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_63_13">Get_Window</a>, <a href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_59_7">Item</a>, <a href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_60_7">Fore</a>, <a href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_61_7">Aft</a>, <a href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_62_7">Exp</a>);
+   <b>end</b> <a href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_58_14">Put</a>;
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<a href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_45_43">Fixed_IO</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-text_io-fixed_io__ads.htm b/doc/html/ada/terminal_interface-curses-text_io-fixed_io__ads.htm
new file mode 100644
index 0000000..abd2b99
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-text_io-fixed_io__ads.htm
@@ -0,0 +1,85 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-text_io-fixed_io.ads</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-text_io-fixed_io.ads </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                Terminal_Interface.Curses.Text_IO.Fixed_IO                --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 S P E C                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.13 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>generic</b>
+   <b>type</b> <span class="symbol"><a name="ref_43_9">Num</a></span> <b>is</b> <b>delta</b> &lt;&gt;;
+
+<b>package</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<span class="symbol"><a name="ref_45_43" href="terminal_interface-curses-text_io-fixed_io__adb.htm#ref_45_48">Fixed_IO</a></span> <b>is</b>
+
+   <span class="symbol"><a name="ref_47_4">Default_Fore</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_43_9">Num</a>'Fore;
+   <span class="symbol"><a name="ref_48_4">Default_Aft</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_43_9">Num</a>'Aft;
+   <span class="symbol"><a name="ref_49_4">Default_Exp</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := 0;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_51_14" href="terminal_interface-curses-text_io-fixed_io__adb.htm#ref_50_14">Put</a></span>
+     (<span class="symbol"><a name="ref_52_7" href="terminal_interface-curses-text_io-fixed_io__adb.htm#ref_51_7">Win</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <span class="symbol"><a name="ref_53_7" href="terminal_interface-curses-text_io-fixed_io__adb.htm#ref_52_7">Item</a></span> : <a href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_43_9">Num</a>;
+      <span class="symbol"><a name="ref_54_7" href="terminal_interface-curses-text_io-fixed_io__adb.htm#ref_53_7">Fore</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_47_4">Default_Fore</a>;
+      <span class="symbol"><a name="ref_55_7" href="terminal_interface-curses-text_io-fixed_io__adb.htm#ref_54_7">Aft</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_48_4">Default_Aft</a>;
+      <span class="symbol"><a name="ref_56_7" href="terminal_interface-curses-text_io-fixed_io__adb.htm#ref_55_7">Exp</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_49_4">Default_Exp</a>);
+
+   <b>procedure</b> <span class="symbol"><a name="ref_58_14" href="terminal_interface-curses-text_io-fixed_io__adb.htm#ref_67_14">Put</a></span>
+     (<span class="symbol"><a name="ref_59_7" href="terminal_interface-curses-text_io-fixed_io__adb.htm#ref_68_7">Item</a></span> : <a href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_43_9">Num</a>;
+      <span class="symbol"><a name="ref_60_7" href="terminal_interface-curses-text_io-fixed_io__adb.htm#ref_69_7">Fore</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_47_4">Default_Fore</a>;
+      <span class="symbol"><a name="ref_61_7" href="terminal_interface-curses-text_io-fixed_io__adb.htm#ref_70_7">Aft</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_48_4">Default_Aft</a>;
+      <span class="symbol"><a name="ref_62_7" href="terminal_interface-curses-text_io-fixed_io__adb.htm#ref_71_7">Exp</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_49_4">Default_Exp</a>);
+
+<b>private</b>
+   <b>pragma</b> Inline (Put);
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<a href="terminal_interface-curses-text_io-fixed_io__ads.htm#ref_45_43">Fixed_IO</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-text_io-float_io__adb.htm b/doc/html/ada/terminal_interface-curses-text_io-float_io__adb.htm
new file mode 100644
index 0000000..a0ba64c
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-text_io-float_io__adb.htm
@@ -0,0 +1,95 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-text_io-float_io.adb</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-text_io-float_io.adb </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                Terminal_Interface.Curses.Text_IO.Float_IO                --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 B O D Y                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.12 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>with</b> Ada.Text_IO;
+<b>with</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<a href="terminal_interface-curses-text_io-aux__ads.htm#ref_43_51">Aux</a>;
+
+<b>package</b> <b>body</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<span class="symbol"><a name="ref_45_48" href="terminal_interface-curses-text_io-float_io__ads.htm#ref_45_43">Float_IO</a></span> <b>is</b>
+
+   <b>package</b> <span class="symbol"><a name="ref_47_12">Aux</a></span> <b>renames</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<a href="terminal_interface-curses-text_io-aux__ads.htm#ref_43_51">Aux</a>;
+   <b>package</b> FIO <b>is</b> <b>new</b> Ada.Text_IO.Float_IO (<a href="terminal_interface-curses-text_io-float_io__ads.htm#ref_43_9">Num</a>);
+
+   <b>procedure</b> <span class="symbol"><a name="ref_50_14" href="terminal_interface-curses-text_io-float_io__ads.htm#ref_51_14">Put</a></span>
+     (<span class="symbol"><a name="ref_51_7" href="terminal_interface-curses-text_io-float_io__ads.htm#ref_52_7">Win</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <span class="symbol"><a name="ref_52_7" href="terminal_interface-curses-text_io-float_io__ads.htm#ref_53_7">Item</a></span> : <a href="terminal_interface-curses-text_io-float_io__ads.htm#ref_43_9">Num</a>;
+      <span class="symbol"><a name="ref_53_7" href="terminal_interface-curses-text_io-float_io__ads.htm#ref_54_7">Fore</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-float_io__ads.htm#ref_47_4">Default_Fore</a>;
+      <span class="symbol"><a name="ref_54_7" href="terminal_interface-curses-text_io-float_io__ads.htm#ref_55_7">Aft</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-float_io__ads.htm#ref_48_4">Default_Aft</a>;
+      <span class="symbol"><a name="ref_55_7" href="terminal_interface-curses-text_io-float_io__ads.htm#ref_56_7">Exp</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-float_io__ads.htm#ref_49_4">Default_Exp</a>)
+   <b>is</b>
+      <span class="symbol"><a name="ref_57_7">Buf</a></span> : String (1 .. <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a>'Last);
+      <span class="symbol"><a name="ref_58_7">Len</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-float_io__ads.htm#ref_54_7">Fore</a> + 1 + <a href="terminal_interface-curses-text_io-float_io__ads.htm#ref_55_7">Aft</a>;
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-text_io-float_io__ads.htm#ref_56_7">Exp</a> &gt; 0 <b>then</b>
+         <a href="terminal_interface-curses-text_io-float_io__adb.htm#ref_58_7">Len</a> := <a href="terminal_interface-curses-text_io-float_io__adb.htm#ref_58_7">Len</a> + 1 + <a href="terminal_interface-curses-text_io-float_io__ads.htm#ref_56_7">Exp</a>;
+      <b>end</b> <b>if</b>;
+      FIO.Put (<a href="terminal_interface-curses-text_io-float_io__adb.htm#ref_57_7">Buf</a>, <a href="terminal_interface-curses-text_io-float_io__ads.htm#ref_53_7">Item</a>, <a href="terminal_interface-curses-text_io-float_io__ads.htm#ref_55_7">Aft</a>, <a href="terminal_interface-curses-text_io-float_io__ads.htm#ref_56_7">Exp</a>);
+      <a href="terminal_interface-curses-text_io-float_io__adb.htm#ref_47_12">Aux</a>.<a href="terminal_interface-curses-text_io-aux__ads.htm#ref_49_14">Put_Buf</a> (<a href="terminal_interface-curses-text_io-float_io__ads.htm#ref_52_7">Win</a>, <a href="terminal_interface-curses-text_io-float_io__adb.htm#ref_57_7">Buf</a>, <a href="terminal_interface-curses-text_io-float_io__adb.htm#ref_58_7">Len</a>, False);
+   <b>end</b> <a href="terminal_interface-curses-text_io-float_io__ads.htm#ref_51_14">Put</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_67_14" href="terminal_interface-curses-text_io-float_io__ads.htm#ref_58_14">Put</a></span>
+     (<span class="symbol"><a name="ref_68_7" href="terminal_interface-curses-text_io-float_io__ads.htm#ref_59_7">Item</a></span> : <a href="terminal_interface-curses-text_io-float_io__ads.htm#ref_43_9">Num</a>;
+      <span class="symbol"><a name="ref_69_7" href="terminal_interface-curses-text_io-float_io__ads.htm#ref_60_7">Fore</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-float_io__ads.htm#ref_47_4">Default_Fore</a>;
+      <span class="symbol"><a name="ref_70_7" href="terminal_interface-curses-text_io-float_io__ads.htm#ref_61_7">Aft</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-float_io__ads.htm#ref_48_4">Default_Aft</a>;
+      <span class="symbol"><a name="ref_71_7" href="terminal_interface-curses-text_io-float_io__ads.htm#ref_62_7">Exp</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-float_io__ads.htm#ref_49_4">Default_Exp</a>)
+   <b>is</b>
+   <b>begin</b>
+      <a href="terminal_interface-curses-text_io-float_io__ads.htm#ref_51_14">Put</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_63_13">Get_Window</a>, <a href="terminal_interface-curses-text_io-float_io__ads.htm#ref_59_7">Item</a>, <a href="terminal_interface-curses-text_io-float_io__ads.htm#ref_60_7">Fore</a>, <a href="terminal_interface-curses-text_io-float_io__ads.htm#ref_61_7">Aft</a>, <a href="terminal_interface-curses-text_io-float_io__ads.htm#ref_62_7">Exp</a>);
+   <b>end</b> <a href="terminal_interface-curses-text_io-float_io__ads.htm#ref_58_14">Put</a>;
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<a href="terminal_interface-curses-text_io-float_io__ads.htm#ref_45_43">Float_IO</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-text_io-float_io__ads.htm b/doc/html/ada/terminal_interface-curses-text_io-float_io__ads.htm
new file mode 100644
index 0000000..a4382f1
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-text_io-float_io__ads.htm
@@ -0,0 +1,85 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-text_io-float_io.ads</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-text_io-float_io.ads </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                Terminal_Interface.Curses.Text_IO.Float_IO                --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 S P E C                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.13 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>generic</b>
+   <b>type</b> <span class="symbol"><a name="ref_43_9">Num</a></span> <b>is</b> <b>digits</b> &lt;&gt;;
+
+<b>package</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<span class="symbol"><a name="ref_45_43" href="terminal_interface-curses-text_io-float_io__adb.htm#ref_45_48">Float_IO</a></span> <b>is</b>
+
+   <span class="symbol"><a name="ref_47_4">Default_Fore</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := 2;
+   <span class="symbol"><a name="ref_48_4">Default_Aft</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-float_io__ads.htm#ref_43_9">Num</a>'<b>Digits</b> - 1;
+   <span class="symbol"><a name="ref_49_4">Default_Exp</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := 3;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_51_14" href="terminal_interface-curses-text_io-float_io__adb.htm#ref_50_14">Put</a></span>
+     (<span class="symbol"><a name="ref_52_7" href="terminal_interface-curses-text_io-float_io__adb.htm#ref_51_7">Win</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <span class="symbol"><a name="ref_53_7" href="terminal_interface-curses-text_io-float_io__adb.htm#ref_52_7">Item</a></span> : <a href="terminal_interface-curses-text_io-float_io__ads.htm#ref_43_9">Num</a>;
+      <span class="symbol"><a name="ref_54_7" href="terminal_interface-curses-text_io-float_io__adb.htm#ref_53_7">Fore</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-float_io__ads.htm#ref_47_4">Default_Fore</a>;
+      <span class="symbol"><a name="ref_55_7" href="terminal_interface-curses-text_io-float_io__adb.htm#ref_54_7">Aft</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-float_io__ads.htm#ref_48_4">Default_Aft</a>;
+      <span class="symbol"><a name="ref_56_7" href="terminal_interface-curses-text_io-float_io__adb.htm#ref_55_7">Exp</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-float_io__ads.htm#ref_49_4">Default_Exp</a>);
+
+   <b>procedure</b> <span class="symbol"><a name="ref_58_14" href="terminal_interface-curses-text_io-float_io__adb.htm#ref_67_14">Put</a></span>
+     (<span class="symbol"><a name="ref_59_7" href="terminal_interface-curses-text_io-float_io__adb.htm#ref_68_7">Item</a></span> : <a href="terminal_interface-curses-text_io-float_io__ads.htm#ref_43_9">Num</a>;
+      <span class="symbol"><a name="ref_60_7" href="terminal_interface-curses-text_io-float_io__adb.htm#ref_69_7">Fore</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-float_io__ads.htm#ref_47_4">Default_Fore</a>;
+      <span class="symbol"><a name="ref_61_7" href="terminal_interface-curses-text_io-float_io__adb.htm#ref_70_7">Aft</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-float_io__ads.htm#ref_48_4">Default_Aft</a>;
+      <span class="symbol"><a name="ref_62_7" href="terminal_interface-curses-text_io-float_io__adb.htm#ref_71_7">Exp</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-float_io__ads.htm#ref_49_4">Default_Exp</a>);
+
+<b>private</b>
+   <b>pragma</b> Inline (Put);
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<a href="terminal_interface-curses-text_io-float_io__ads.htm#ref_45_43">Float_IO</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-text_io-integer_io__adb.htm b/doc/html/ada/terminal_interface-curses-text_io-integer_io__adb.htm
new file mode 100644
index 0000000..f158e33
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-text_io-integer_io__adb.htm
@@ -0,0 +1,89 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-text_io-integer_io.adb</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-text_io-integer_io.adb </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--               Terminal_Interface.Curses.Text_IO.Integer_IO               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 B O D Y                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.12 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>with</b> Ada.Text_IO;
+<b>with</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<a href="terminal_interface-curses-text_io-aux__ads.htm#ref_43_51">Aux</a>;
+
+<b>package</b> <b>body</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<span class="symbol"><a name="ref_45_48" href="terminal_interface-curses-text_io-integer_io__ads.htm#ref_45_43">Integer_IO</a></span> <b>is</b>
+
+   <b>package</b> <span class="symbol"><a name="ref_47_12">Aux</a></span> <b>renames</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<a href="terminal_interface-curses-text_io-aux__ads.htm#ref_43_51">Aux</a>;
+   <b>package</b> IIO <b>is</b> <b>new</b> Ada.Text_IO.Integer_IO (<a href="terminal_interface-curses-text_io-integer_io__ads.htm#ref_43_9">Num</a>);
+
+   <b>procedure</b> <span class="symbol"><a name="ref_50_14" href="terminal_interface-curses-text_io-integer_io__ads.htm#ref_50_14">Put</a></span>
+     (<span class="symbol"><a name="ref_51_7" href="terminal_interface-curses-text_io-integer_io__ads.htm#ref_51_7">Win</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <span class="symbol"><a name="ref_52_7" href="terminal_interface-curses-text_io-integer_io__ads.htm#ref_52_7">Item</a></span>  : <a href="terminal_interface-curses-text_io-integer_io__ads.htm#ref_43_9">Num</a>;
+      <span class="symbol"><a name="ref_53_7" href="terminal_interface-curses-text_io-integer_io__ads.htm#ref_53_7">Width</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-integer_io__ads.htm#ref_47_4">Default_Width</a>;
+      <span class="symbol"><a name="ref_54_7" href="terminal_interface-curses-text_io-integer_io__ads.htm#ref_54_7">Base</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_52_12">Number_Base</a> := <a href="terminal_interface-curses-text_io-integer_io__ads.htm#ref_48_4">Default_Base</a>)
+   <b>is</b>
+      <span class="symbol"><a name="ref_56_7">Buf</a></span> : String (1 .. <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a>'Last);
+   <b>begin</b>
+      IIO.Put (<a href="terminal_interface-curses-text_io-integer_io__adb.htm#ref_56_7">Buf</a>, <a href="terminal_interface-curses-text_io-integer_io__ads.htm#ref_52_7">Item</a>, <a href="terminal_interface-curses-text_io-integer_io__ads.htm#ref_54_7">Base</a>);
+      <a href="terminal_interface-curses-text_io-integer_io__adb.htm#ref_47_12">Aux</a>.<a href="terminal_interface-curses-text_io-aux__ads.htm#ref_49_14">Put_Buf</a> (<a href="terminal_interface-curses-text_io-integer_io__ads.htm#ref_51_7">Win</a>, <a href="terminal_interface-curses-text_io-integer_io__adb.htm#ref_56_7">Buf</a>, <a href="terminal_interface-curses-text_io-integer_io__ads.htm#ref_53_7">Width</a>);
+   <b>end</b> <a href="terminal_interface-curses-text_io-integer_io__ads.htm#ref_50_14">Put</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_62_14" href="terminal_interface-curses-text_io-integer_io__ads.htm#ref_56_14">Put</a></span>
+     (<span class="symbol"><a name="ref_63_7" href="terminal_interface-curses-text_io-integer_io__ads.htm#ref_57_7">Item</a></span>  : <a href="terminal_interface-curses-text_io-integer_io__ads.htm#ref_43_9">Num</a>;
+      <span class="symbol"><a name="ref_64_7" href="terminal_interface-curses-text_io-integer_io__ads.htm#ref_58_7">Width</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-integer_io__ads.htm#ref_47_4">Default_Width</a>;
+      <span class="symbol"><a name="ref_65_7" href="terminal_interface-curses-text_io-integer_io__ads.htm#ref_59_7">Base</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_52_12">Number_Base</a> := <a href="terminal_interface-curses-text_io-integer_io__ads.htm#ref_48_4">Default_Base</a>)
+   <b>is</b>
+   <b>begin</b>
+      <a href="terminal_interface-curses-text_io-integer_io__ads.htm#ref_50_14">Put</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_63_13">Get_Window</a>, <a href="terminal_interface-curses-text_io-integer_io__ads.htm#ref_57_7">Item</a>, <a href="terminal_interface-curses-text_io-integer_io__ads.htm#ref_58_7">Width</a>, <a href="terminal_interface-curses-text_io-integer_io__ads.htm#ref_59_7">Base</a>);
+   <b>end</b> <a href="terminal_interface-curses-text_io-integer_io__ads.htm#ref_56_14">Put</a>;
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<a href="terminal_interface-curses-text_io-integer_io__ads.htm#ref_45_43">Integer_IO</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-text_io-integer_io__ads.htm b/doc/html/ada/terminal_interface-curses-text_io-integer_io__ads.htm
new file mode 100644
index 0000000..23239f6
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-text_io-integer_io__ads.htm
@@ -0,0 +1,82 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-text_io-integer_io.ads</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-text_io-integer_io.ads </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--               Terminal_Interface.Curses.Text_IO.Integer_IO               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 S P E C                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.13 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>generic</b>
+   <b>type</b> <span class="symbol"><a name="ref_43_9">Num</a></span> <b>is</b> <b>range</b> &lt;&gt;;
+
+<b>package</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<span class="symbol"><a name="ref_45_43" href="terminal_interface-curses-text_io-integer_io__adb.htm#ref_45_48">Integer_IO</a></span> <b>is</b>
+
+   <span class="symbol"><a name="ref_47_4">Default_Width</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-integer_io__ads.htm#ref_43_9">Num</a>'Width;
+   <span class="symbol"><a name="ref_48_4">Default_Base</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_52_12">Number_Base</a> := 10;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_50_14" href="terminal_interface-curses-text_io-integer_io__adb.htm#ref_50_14">Put</a></span>
+     (<span class="symbol"><a name="ref_51_7" href="terminal_interface-curses-text_io-integer_io__adb.htm#ref_51_7">Win</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <span class="symbol"><a name="ref_52_7" href="terminal_interface-curses-text_io-integer_io__adb.htm#ref_52_7">Item</a></span>  : <a href="terminal_interface-curses-text_io-integer_io__ads.htm#ref_43_9">Num</a>;
+      <span class="symbol"><a name="ref_53_7" href="terminal_interface-curses-text_io-integer_io__adb.htm#ref_53_7">Width</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-integer_io__ads.htm#ref_47_4">Default_Width</a>;
+      <span class="symbol"><a name="ref_54_7" href="terminal_interface-curses-text_io-integer_io__adb.htm#ref_54_7">Base</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_52_12">Number_Base</a> := <a href="terminal_interface-curses-text_io-integer_io__ads.htm#ref_48_4">Default_Base</a>);
+
+   <b>procedure</b> <span class="symbol"><a name="ref_56_14" href="terminal_interface-curses-text_io-integer_io__adb.htm#ref_62_14">Put</a></span>
+     (<span class="symbol"><a name="ref_57_7" href="terminal_interface-curses-text_io-integer_io__adb.htm#ref_63_7">Item</a></span>  : <a href="terminal_interface-curses-text_io-integer_io__ads.htm#ref_43_9">Num</a>;
+      <span class="symbol"><a name="ref_58_7" href="terminal_interface-curses-text_io-integer_io__adb.htm#ref_64_7">Width</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-integer_io__ads.htm#ref_47_4">Default_Width</a>;
+      <span class="symbol"><a name="ref_59_7" href="terminal_interface-curses-text_io-integer_io__adb.htm#ref_65_7">Base</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_52_12">Number_Base</a> := <a href="terminal_interface-curses-text_io-integer_io__ads.htm#ref_48_4">Default_Base</a>);
+
+<b>private</b>
+   <b>pragma</b> Inline (Put);
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<a href="terminal_interface-curses-text_io-integer_io__ads.htm#ref_45_43">Integer_IO</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-text_io-modular_io__adb.htm b/doc/html/ada/terminal_interface-curses-text_io-modular_io__adb.htm
new file mode 100644
index 0000000..0645bb6
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-text_io-modular_io__adb.htm
@@ -0,0 +1,89 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-text_io-modular_io.adb</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-text_io-modular_io.adb </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--               Terminal_Interface.Curses.Text_IO.Modular_IO               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 B O D Y                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.12 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>with</b> Ada.Text_IO;
+<b>with</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<a href="terminal_interface-curses-text_io-aux__ads.htm#ref_43_51">Aux</a>;
+
+<b>package</b> <b>body</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<span class="symbol"><a name="ref_45_48" href="terminal_interface-curses-text_io-modular_io__ads.htm#ref_45_43">Modular_IO</a></span> <b>is</b>
+
+   <b>package</b> <span class="symbol"><a name="ref_47_12">Aux</a></span> <b>renames</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<a href="terminal_interface-curses-text_io-aux__ads.htm#ref_43_51">Aux</a>;
+   <b>package</b> MIO <b>is</b> <b>new</b> Ada.Text_IO.Modular_IO (<a href="terminal_interface-curses-text_io-modular_io__ads.htm#ref_43_9">Num</a>);
+
+   <b>procedure</b> <span class="symbol"><a name="ref_50_14" href="terminal_interface-curses-text_io-modular_io__ads.htm#ref_50_14">Put</a></span>
+     (<span class="symbol"><a name="ref_51_7" href="terminal_interface-curses-text_io-modular_io__ads.htm#ref_51_7">Win</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <span class="symbol"><a name="ref_52_7" href="terminal_interface-curses-text_io-modular_io__ads.htm#ref_52_7">Item</a></span>  : <a href="terminal_interface-curses-text_io-modular_io__ads.htm#ref_43_9">Num</a>;
+      <span class="symbol"><a name="ref_53_7" href="terminal_interface-curses-text_io-modular_io__ads.htm#ref_53_7">Width</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-modular_io__ads.htm#ref_47_4">Default_Width</a>;
+      <span class="symbol"><a name="ref_54_7" href="terminal_interface-curses-text_io-modular_io__ads.htm#ref_54_7">Base</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_52_12">Number_Base</a> := <a href="terminal_interface-curses-text_io-modular_io__ads.htm#ref_48_4">Default_Base</a>)
+   <b>is</b>
+      <span class="symbol"><a name="ref_56_7">Buf</a></span> : String (1 .. <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a>'Last);
+   <b>begin</b>
+      MIO.Put (<a href="terminal_interface-curses-text_io-modular_io__adb.htm#ref_56_7">Buf</a>, <a href="terminal_interface-curses-text_io-modular_io__ads.htm#ref_52_7">Item</a>, <a href="terminal_interface-curses-text_io-modular_io__ads.htm#ref_54_7">Base</a>);
+      <a href="terminal_interface-curses-text_io-modular_io__adb.htm#ref_47_12">Aux</a>.<a href="terminal_interface-curses-text_io-aux__ads.htm#ref_49_14">Put_Buf</a> (<a href="terminal_interface-curses-text_io-modular_io__ads.htm#ref_51_7">Win</a>, <a href="terminal_interface-curses-text_io-modular_io__adb.htm#ref_56_7">Buf</a>, <a href="terminal_interface-curses-text_io-modular_io__ads.htm#ref_53_7">Width</a>);
+   <b>end</b> <a href="terminal_interface-curses-text_io-modular_io__ads.htm#ref_50_14">Put</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_62_14" href="terminal_interface-curses-text_io-modular_io__ads.htm#ref_56_14">Put</a></span>
+     (<span class="symbol"><a name="ref_63_7" href="terminal_interface-curses-text_io-modular_io__ads.htm#ref_57_7">Item</a></span>  : <a href="terminal_interface-curses-text_io-modular_io__ads.htm#ref_43_9">Num</a>;
+      <span class="symbol"><a name="ref_64_7" href="terminal_interface-curses-text_io-modular_io__ads.htm#ref_58_7">Width</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-modular_io__ads.htm#ref_47_4">Default_Width</a>;
+      <span class="symbol"><a name="ref_65_7" href="terminal_interface-curses-text_io-modular_io__ads.htm#ref_59_7">Base</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_52_12">Number_Base</a> := <a href="terminal_interface-curses-text_io-modular_io__ads.htm#ref_48_4">Default_Base</a>)
+   <b>is</b>
+   <b>begin</b>
+      <a href="terminal_interface-curses-text_io-modular_io__ads.htm#ref_50_14">Put</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_63_13">Get_Window</a>, <a href="terminal_interface-curses-text_io-modular_io__ads.htm#ref_57_7">Item</a>, <a href="terminal_interface-curses-text_io-modular_io__ads.htm#ref_58_7">Width</a>, <a href="terminal_interface-curses-text_io-modular_io__ads.htm#ref_59_7">Base</a>);
+   <b>end</b> <a href="terminal_interface-curses-text_io-modular_io__ads.htm#ref_56_14">Put</a>;
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<a href="terminal_interface-curses-text_io-modular_io__ads.htm#ref_45_43">Modular_IO</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-text_io-modular_io__ads.htm b/doc/html/ada/terminal_interface-curses-text_io-modular_io__ads.htm
new file mode 100644
index 0000000..043ac0a
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-text_io-modular_io__ads.htm
@@ -0,0 +1,82 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-text_io-modular_io.ads</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-text_io-modular_io.ads </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--               Terminal_Interface.Curses.Text_IO.Modular_IO               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 S P E C                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.13 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>generic</b>
+   <b>type</b> <span class="symbol"><a name="ref_43_9">Num</a></span> <b>is</b> <b>mod</b> &lt;&gt;;
+
+<b>package</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<span class="symbol"><a name="ref_45_43" href="terminal_interface-curses-text_io-modular_io__adb.htm#ref_45_48">Modular_IO</a></span> <b>is</b>
+
+   <span class="symbol"><a name="ref_47_4">Default_Width</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-modular_io__ads.htm#ref_43_9">Num</a>'Width;
+   <span class="symbol"><a name="ref_48_4">Default_Base</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_52_12">Number_Base</a> := 10;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_50_14" href="terminal_interface-curses-text_io-modular_io__adb.htm#ref_50_14">Put</a></span>
+     (<span class="symbol"><a name="ref_51_7" href="terminal_interface-curses-text_io-modular_io__adb.htm#ref_51_7">Win</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <span class="symbol"><a name="ref_52_7" href="terminal_interface-curses-text_io-modular_io__adb.htm#ref_52_7">Item</a></span>  : <a href="terminal_interface-curses-text_io-modular_io__ads.htm#ref_43_9">Num</a>;
+      <span class="symbol"><a name="ref_53_7" href="terminal_interface-curses-text_io-modular_io__adb.htm#ref_53_7">Width</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-modular_io__ads.htm#ref_47_4">Default_Width</a>;
+      <span class="symbol"><a name="ref_54_7" href="terminal_interface-curses-text_io-modular_io__adb.htm#ref_54_7">Base</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_52_12">Number_Base</a> := <a href="terminal_interface-curses-text_io-modular_io__ads.htm#ref_48_4">Default_Base</a>);
+
+   <b>procedure</b> <span class="symbol"><a name="ref_56_14" href="terminal_interface-curses-text_io-modular_io__adb.htm#ref_62_14">Put</a></span>
+     (<span class="symbol"><a name="ref_57_7" href="terminal_interface-curses-text_io-modular_io__adb.htm#ref_63_7">Item</a></span>  : <a href="terminal_interface-curses-text_io-modular_io__ads.htm#ref_43_9">Num</a>;
+      <span class="symbol"><a name="ref_58_7" href="terminal_interface-curses-text_io-modular_io__adb.htm#ref_64_7">Width</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_51_12">Field</a> := <a href="terminal_interface-curses-text_io-modular_io__ads.htm#ref_47_4">Default_Width</a>;
+      <span class="symbol"><a name="ref_59_7" href="terminal_interface-curses-text_io-modular_io__adb.htm#ref_65_7">Base</a></span>  : <a href="terminal_interface-curses-text_io__ads.htm#ref_52_12">Number_Base</a> := <a href="terminal_interface-curses-text_io-modular_io__ads.htm#ref_48_4">Default_Base</a>);
+
+<b>private</b>
+   <b>pragma</b> Inline (Put);
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>.<a href="terminal_interface-curses-text_io-modular_io__ads.htm#ref_45_43">Modular_IO</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-text_io__adb.htm b/doc/html/ada/terminal_interface-curses-text_io__adb.htm
new file mode 100644
index 0000000..379760c
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-text_io__adb.htm
@@ -0,0 +1,357 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-text_io.adb</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-text_io.adb </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                     Terminal_Interface.Curses.Text_IO                    --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 B O D Y                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1999-2011,2014 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.23 @</em></span>
+<span class="comment"><em>--  @Date: 2020/02/02 23:34:34 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>package</b> <b>body</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<span class="symbol"><a name="ref_43_40" href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a></span> <b>is</b>
+
+   <span class="symbol"><a name="ref_45_4">Default_Window</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_57_4">Null_Window</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_47_14" href="terminal_interface-curses-text_io__ads.htm#ref_60_14">Set_Window</a></span> (<span class="symbol"><a name="ref_47_26" href="terminal_interface-curses-text_io__ads.htm#ref_60_26">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>)
+   <b>is</b>
+   <b>begin</b>
+      <a href="terminal_interface-curses-text_io__adb.htm#ref_45_4">Default_Window</a> := <a href="terminal_interface-curses-text_io__ads.htm#ref_60_26">Win</a>;
+   <b>end</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_60_14">Set_Window</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_53_13" href="terminal_interface-curses-text_io__ads.htm#ref_63_13">Get_Window</a></span> <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>
+   <b>is</b>
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-text_io__adb.htm#ref_45_4">Default_Window</a> = <a href="terminal_interface-curses__ads.htm#ref_57_4">Null_Window</a> <b>then</b>
+         <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <b>else</b>
+         <b>return</b> <a href="terminal_interface-curses-text_io__adb.htm#ref_45_4">Default_Window</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_63_13">Get_Window</a>;
+   <b>pragma</b> Inline (<a href="terminal_interface-curses-text_io__ads.htm#ref_63_13">Get_Window</a>);
+
+   <b>procedure</b> <span class="symbol"><a name="ref_64_14" href="terminal_interface-curses-text_io__ads.htm#ref_66_14">Flush</a></span> (<span class="symbol"><a name="ref_64_21" href="terminal_interface-curses-text_io__ads.htm#ref_66_21">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>)
+   <b>is</b>
+   <b>begin</b>
+      <a href="terminal_interface-curses__ads.htm#ref_1216_14">Refresh</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_66_21">Win</a>);
+   <b>end</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_66_14">Flush</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_70_14" href="terminal_interface-curses-text_io__ads.htm#ref_67_14">Flush</a></span>
+   <b>is</b>
+   <b>begin</b>
+      <a href="terminal_interface-curses-text_io__ads.htm#ref_66_14">Flush</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_63_13">Get_Window</a>);
+   <b>end</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_67_14">Flush</a>;
+
+   <span class="comment"><em>--------------------------------------------</em></span>
+   <span class="comment"><em>-- Specification of line and page lengths --</em></span>
+   <span class="comment"><em>--------------------------------------------</em></span>
+
+   <span class="comment"><em>--  There are no set routines in this package. I assume, that you allocate</em></span>
+   <span class="comment"><em>--  the window with an appropriate size.</em></span>
+   <span class="comment"><em>--  A scroll-window is interpreted as an page with unbounded page length,</em></span>
+   <span class="comment"><em>--  i.e. it returns the conventional 0 as page length.</em></span>
+
+   <b>function</b> <span class="symbol"><a name="ref_85_13" href="terminal_interface-curses-text_io__ads.htm#ref_78_13">Line_Length</a></span> (<span class="symbol"><a name="ref_85_26" href="terminal_interface-curses-text_io__ads.htm#ref_78_26">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_48_12">Count</a>
+   <b>is</b>
+      <span class="symbol"><a name="ref_87_7">N_Lines</a></span> : <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a>;
+      <span class="symbol"><a name="ref_88_7">N_Cols</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a>;
+   <b>begin</b>
+      <a href="terminal_interface-curses__ads.htm#ref_1399_14">Get_Size</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_78_26">Win</a>, <a href="terminal_interface-curses-text_io__adb.htm#ref_87_7">N_Lines</a>, <a href="terminal_interface-curses-text_io__adb.htm#ref_88_7">N_Cols</a>);
+      <span class="comment"><em>--  if Natural (N_Cols) &gt; Natural (Count'Last) then</em></span>
+      <span class="comment"><em>--     raise Layout_Error;</em></span>
+      <span class="comment"><em>--  end if;</em></span>
+      <b>return</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_48_12">Count</a> (<a href="terminal_interface-curses-text_io__adb.htm#ref_88_7">N_Cols</a>);
+   <b>end</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_78_13">Line_Length</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_97_13" href="terminal_interface-curses-text_io__ads.htm#ref_79_13">Line_Length</a></span> <b>return</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_48_12">Count</a>
+   <b>is</b>
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_78_13">Line_Length</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_63_13">Get_Window</a>);
+   <b>end</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_79_13">Line_Length</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_103_13" href="terminal_interface-curses-text_io__ads.htm#ref_81_13">Page_Length</a></span> (<span class="symbol"><a name="ref_103_26" href="terminal_interface-curses-text_io__ads.htm#ref_81_26">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_48_12">Count</a>
+   <b>is</b>
+      <span class="symbol"><a name="ref_105_7">N_Lines</a></span> : <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a>;
+      <span class="symbol"><a name="ref_106_7">N_Cols</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a>;
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__ads.htm#ref_1193_13">Scrolling_Allowed</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_81_26">Win</a>) <b>then</b>
+         <b>return</b> 0;
+      <b>else</b>
+         <a href="terminal_interface-curses__ads.htm#ref_1399_14">Get_Size</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_81_26">Win</a>, <a href="terminal_interface-curses-text_io__adb.htm#ref_105_7">N_Lines</a>, <a href="terminal_interface-curses-text_io__adb.htm#ref_106_7">N_Cols</a>);
+         <span class="comment"><em>--  if Natural (N_Lines) &gt; Natural (Count'Last) then</em></span>
+         <span class="comment"><em>--     raise Layout_Error;</em></span>
+         <span class="comment"><em>--  end if;</em></span>
+         <b>return</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_48_12">Count</a> (<a href="terminal_interface-curses-text_io__adb.htm#ref_105_7">N_Lines</a>);
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_81_13">Page_Length</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_119_13" href="terminal_interface-curses-text_io__ads.htm#ref_82_13">Page_Length</a></span> <b>return</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_48_12">Count</a>
+   <b>is</b>
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_81_13">Page_Length</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_63_13">Get_Window</a>);
+   <b>end</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_82_13">Page_Length</a>;
+
+   <span class="comment"><em>------------------------------------</em></span>
+   <span class="comment"><em>-- Column, Line, and Page Control --</em></span>
+   <span class="comment"><em>------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_128_14" href="terminal_interface-curses-text_io__ads.htm#ref_87_14">New_Line</a></span> (<span class="symbol"><a name="ref_128_24" href="terminal_interface-curses-text_io__ads.htm#ref_87_24">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>; <span class="symbol"><a name="ref_128_38" href="terminal_interface-curses-text_io__ads.htm#ref_87_38">Spacing</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_49_12">Positive_Count</a> := 1)
+   <b>is</b>
+      <span class="symbol"><a name="ref_130_7">P_Size</a></span> : <b>constant</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_48_12">Count</a> := <a href="terminal_interface-curses-text_io__ads.htm#ref_81_13">Page_Length</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_87_24">Win</a>);
+   <b>begin</b>
+      <b>if</b> <b>not</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_87_38">Spacing</a>'Valid <b>then</b>
+         <b>raise</b> Constraint_Error;
+      <b>end</b> <b>if</b>;
+
+      <b>for</b> <span class="symbol"><a name="ref_136_11">I</a></span> <b>in</b> 1 .. <a href="terminal_interface-curses-text_io__ads.htm#ref_87_38">Spacing</a> <b>loop</b>
+         <b>if</b> <a href="terminal_interface-curses-text_io__adb.htm#ref_130_7">P_Size</a> &gt; 0 <b>and</b> <b>then</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_102_13">Line</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_87_24">Win</a>) &gt;= <a href="terminal_interface-curses-text_io__adb.htm#ref_130_7">P_Size</a> <b>then</b>
+            <a href="terminal_interface-curses-text_io__ads.htm#ref_90_14">New_Page</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_87_24">Win</a>);
+         <b>else</b>
+            <a href="terminal_interface-curses__ads.htm#ref_699_14">Add</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_87_24">Win</a>, ASCII.LF);
+         <b>end</b> <b>if</b>;
+      <b>end</b> <b>loop</b>;
+   <b>end</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_87_14">New_Line</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_145_14" href="terminal_interface-curses-text_io__ads.htm#ref_88_14">New_Line</a></span> (<span class="symbol"><a name="ref_145_24" href="terminal_interface-curses-text_io__ads.htm#ref_88_24">Spacing</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_49_12">Positive_Count</a> := 1)
+   <b>is</b>
+   <b>begin</b>
+      <a href="terminal_interface-curses-text_io__ads.htm#ref_87_14">New_Line</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_63_13">Get_Window</a>, <a href="terminal_interface-curses-text_io__ads.htm#ref_88_24">Spacing</a>);
+   <b>end</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_88_14">New_Line</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_151_14" href="terminal_interface-curses-text_io__ads.htm#ref_90_14">New_Page</a></span> (<span class="symbol"><a name="ref_151_24" href="terminal_interface-curses-text_io__ads.htm#ref_90_24">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>)
+   <b>is</b>
+   <b>begin</b>
+      <a href="terminal_interface-curses__ads.htm#ref_1251_14">Clear</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_90_24">Win</a>);
+   <b>end</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_90_14">New_Page</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_157_14" href="terminal_interface-curses-text_io__ads.htm#ref_91_14">New_Page</a></span>
+   <b>is</b>
+   <b>begin</b>
+      <a href="terminal_interface-curses-text_io__ads.htm#ref_90_14">New_Page</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_63_13">Get_Window</a>);
+   <b>end</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_91_14">New_Page</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_163_14" href="terminal_interface-curses-text_io__ads.htm#ref_93_14">Set_Col</a></span> (<span class="symbol"><a name="ref_163_23" href="terminal_interface-curses-text_io__ads.htm#ref_93_23">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;  <span class="symbol"><a name="ref_163_38" href="terminal_interface-curses-text_io__ads.htm#ref_93_38">To</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_49_12">Positive_Count</a>)
+   <b>is</b>
+      <span class="symbol"><a name="ref_165_7">Y</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_166_7">X1</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+      <span class="symbol"><a name="ref_167_7">X2</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+      <span class="symbol"><a name="ref_168_7">N</a></span>  : Natural;
+   <b>begin</b>
+      <b>if</b> <b>not</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_93_38">To</a>'Valid <b>then</b>
+         <b>raise</b> Constraint_Error;
+      <b>end</b> <b>if</b>;
+
+      <a href="terminal_interface-curses__ads.htm#ref_1415_14">Get_Cursor_Position</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_93_23">Win</a>, <a href="terminal_interface-curses-text_io__adb.htm#ref_165_7">Y</a>, <a href="terminal_interface-curses-text_io__adb.htm#ref_166_7">X1</a>);
+      <a href="terminal_interface-curses-text_io__adb.htm#ref_168_7">N</a>  := Natural (<a href="terminal_interface-curses-text_io__ads.htm#ref_93_38">To</a>); <a href="terminal_interface-curses-text_io__adb.htm#ref_168_7">N</a> := <a href="terminal_interface-curses-text_io__adb.htm#ref_168_7">N</a> - 1;
+      <a href="terminal_interface-curses-text_io__adb.htm#ref_167_7">X2</a> := <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a> (<a href="terminal_interface-curses-text_io__adb.htm#ref_168_7">N</a>);
+      <b>if</b> <a href="terminal_interface-curses-text_io__adb.htm#ref_166_7">X1</a> &gt; <a href="terminal_interface-curses-text_io__adb.htm#ref_167_7">X2</a> <b>then</b>
+         <a href="terminal_interface-curses-text_io__ads.htm#ref_87_14">New_Line</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_93_23">Win</a>, 1);
+         <a href="terminal_interface-curses-text_io__adb.htm#ref_166_7">X1</a> := 0;
+      <b>end</b> <b>if</b>;
+      <b>if</b> <a href="terminal_interface-curses-text_io__adb.htm#ref_166_7">X1</a> &lt; <a href="terminal_interface-curses-text_io__adb.htm#ref_167_7">X2</a> <b>then</b>
+         <b>declare</b>
+            <span class="symbol"><a name="ref_183_13">Filler</a></span> : <b>constant</b> String (Integer (<a href="terminal_interface-curses-text_io__adb.htm#ref_166_7">X1</a>) .. (Integer (<a href="terminal_interface-curses-text_io__adb.htm#ref_167_7">X2</a>) - 1))
+              := (<b>others</b> =&gt; ' ');
+         <b>begin</b>
+            <a href="terminal_interface-curses-text_io__ads.htm#ref_116_14">Put</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_93_23">Win</a>, <a href="terminal_interface-curses-text_io__adb.htm#ref_183_13">Filler</a>);
+         <b>end</b>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_93_14">Set_Col</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_191_14" href="terminal_interface-curses-text_io__ads.htm#ref_94_14">Set_Col</a></span> (<span class="symbol"><a name="ref_191_23" href="terminal_interface-curses-text_io__ads.htm#ref_94_23">To</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_49_12">Positive_Count</a>)
+   <b>is</b>
+   <b>begin</b>
+      <a href="terminal_interface-curses-text_io__ads.htm#ref_93_14">Set_Col</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_63_13">Get_Window</a>, <a href="terminal_interface-curses-text_io__ads.htm#ref_94_23">To</a>);
+   <b>end</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_94_14">Set_Col</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_197_14" href="terminal_interface-curses-text_io__ads.htm#ref_96_14">Set_Line</a></span> (<span class="symbol"><a name="ref_197_24" href="terminal_interface-curses-text_io__ads.htm#ref_96_24">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>; <span class="symbol"><a name="ref_197_38" href="terminal_interface-curses-text_io__ads.htm#ref_96_38">To</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_49_12">Positive_Count</a>)
+   <b>is</b>
+      <span class="symbol"><a name="ref_199_7">Y1</a></span> : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_200_7">Y2</a></span> : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_201_7">X</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+      <span class="symbol"><a name="ref_202_7">N</a></span>  : Natural;
+   <b>begin</b>
+      <b>if</b> <b>not</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_96_38">To</a>'Valid <b>then</b>
+         <b>raise</b> Constraint_Error;
+      <b>end</b> <b>if</b>;
+
+      <a href="terminal_interface-curses__ads.htm#ref_1415_14">Get_Cursor_Position</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_96_24">Win</a>, <a href="terminal_interface-curses-text_io__adb.htm#ref_199_7">Y1</a>, <a href="terminal_interface-curses-text_io__adb.htm#ref_201_7">X</a>);
+      <b>pragma</b> Warnings (Off, <a href="terminal_interface-curses-text_io__adb.htm#ref_201_7">X</a>);         <span class="comment"><em>--  unreferenced</em></span>
+      <a href="terminal_interface-curses-text_io__adb.htm#ref_202_7">N</a>  := Natural (<a href="terminal_interface-curses-text_io__ads.htm#ref_96_38">To</a>); <a href="terminal_interface-curses-text_io__adb.htm#ref_202_7">N</a> := <a href="terminal_interface-curses-text_io__adb.htm#ref_202_7">N</a> - 1;
+      <a href="terminal_interface-curses-text_io__adb.htm#ref_200_7">Y2</a> := <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a> (<a href="terminal_interface-curses-text_io__adb.htm#ref_202_7">N</a>);
+      <b>if</b> <a href="terminal_interface-curses-text_io__adb.htm#ref_200_7">Y2</a> &lt; <a href="terminal_interface-curses-text_io__adb.htm#ref_199_7">Y1</a> <b>then</b>
+         <a href="terminal_interface-curses-text_io__ads.htm#ref_90_14">New_Page</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_96_24">Win</a>);
+         <a href="terminal_interface-curses-text_io__adb.htm#ref_199_7">Y1</a> := 0;
+      <b>end</b> <b>if</b>;
+      <b>if</b> <a href="terminal_interface-curses-text_io__adb.htm#ref_199_7">Y1</a> &lt; <a href="terminal_interface-curses-text_io__adb.htm#ref_200_7">Y2</a> <b>then</b>
+         <a href="terminal_interface-curses-text_io__ads.htm#ref_87_14">New_Line</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_96_24">Win</a>, <a href="terminal_interface-curses-text_io__ads.htm#ref_49_12">Positive_Count</a> (<a href="terminal_interface-curses-text_io__adb.htm#ref_200_7">Y2</a> - <a href="terminal_interface-curses-text_io__adb.htm#ref_199_7">Y1</a>));
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_96_14">Set_Line</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_221_14" href="terminal_interface-curses-text_io__ads.htm#ref_97_14">Set_Line</a></span> (<span class="symbol"><a name="ref_221_24" href="terminal_interface-curses-text_io__ads.htm#ref_97_24">To</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_49_12">Positive_Count</a>)
+   <b>is</b>
+   <b>begin</b>
+      <a href="terminal_interface-curses-text_io__ads.htm#ref_96_14">Set_Line</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_63_13">Get_Window</a>, <a href="terminal_interface-curses-text_io__ads.htm#ref_97_24">To</a>);
+   <b>end</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_97_14">Set_Line</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_227_13" href="terminal_interface-curses-text_io__ads.htm#ref_99_13">Col</a></span> (<span class="symbol"><a name="ref_227_18" href="terminal_interface-curses-text_io__ads.htm#ref_99_18">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_49_12">Positive_Count</a>
+   <b>is</b>
+      <span class="symbol"><a name="ref_229_7">Y</a></span> : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_230_7">X</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+      <span class="symbol"><a name="ref_231_7">N</a></span> : Natural;
+   <b>begin</b>
+      <a href="terminal_interface-curses__ads.htm#ref_1415_14">Get_Cursor_Position</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_99_18">Win</a>, <a href="terminal_interface-curses-text_io__adb.htm#ref_229_7">Y</a>, <a href="terminal_interface-curses-text_io__adb.htm#ref_230_7">X</a>);
+      <a href="terminal_interface-curses-text_io__adb.htm#ref_231_7">N</a> := Natural (<a href="terminal_interface-curses-text_io__adb.htm#ref_230_7">X</a>); <a href="terminal_interface-curses-text_io__adb.htm#ref_231_7">N</a> := <a href="terminal_interface-curses-text_io__adb.htm#ref_231_7">N</a> + 1;
+      <span class="comment"><em>--  if N &gt; Natural (Count'Last) then</em></span>
+      <span class="comment"><em>--     raise Layout_Error;</em></span>
+      <span class="comment"><em>--  end if;</em></span>
+      <b>return</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_49_12">Positive_Count</a> (<a href="terminal_interface-curses-text_io__adb.htm#ref_231_7">N</a>);
+   <b>end</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_99_13">Col</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_241_13" href="terminal_interface-curses-text_io__ads.htm#ref_100_13">Col</a></span> <b>return</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_49_12">Positive_Count</a>
+   <b>is</b>
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_99_13">Col</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_63_13">Get_Window</a>);
+   <b>end</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_100_13">Col</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_247_13" href="terminal_interface-curses-text_io__ads.htm#ref_102_13">Line</a></span> (<span class="symbol"><a name="ref_247_19" href="terminal_interface-curses-text_io__ads.htm#ref_102_19">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_49_12">Positive_Count</a>
+   <b>is</b>
+      <span class="symbol"><a name="ref_249_7">Y</a></span> : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_250_7">X</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+      <span class="symbol"><a name="ref_251_7">N</a></span> : Natural;
+   <b>begin</b>
+      <a href="terminal_interface-curses__ads.htm#ref_1415_14">Get_Cursor_Position</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_102_19">Win</a>, <a href="terminal_interface-curses-text_io__adb.htm#ref_249_7">Y</a>, <a href="terminal_interface-curses-text_io__adb.htm#ref_250_7">X</a>);
+      <a href="terminal_interface-curses-text_io__adb.htm#ref_251_7">N</a> := Natural (<a href="terminal_interface-curses-text_io__adb.htm#ref_249_7">Y</a>); <a href="terminal_interface-curses-text_io__adb.htm#ref_251_7">N</a> := <a href="terminal_interface-curses-text_io__adb.htm#ref_251_7">N</a> + 1;
+      <span class="comment"><em>--  if N &gt; Natural (Count'Last) then</em></span>
+      <span class="comment"><em>--     raise Layout_Error;</em></span>
+      <span class="comment"><em>--  end if;</em></span>
+      <b>return</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_49_12">Positive_Count</a> (<a href="terminal_interface-curses-text_io__adb.htm#ref_251_7">N</a>);
+   <b>end</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_102_13">Line</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_261_13" href="terminal_interface-curses-text_io__ads.htm#ref_103_13">Line</a></span> <b>return</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_49_12">Positive_Count</a>
+   <b>is</b>
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_102_13">Line</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_63_13">Get_Window</a>);
+   <b>end</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_103_13">Line</a>;
+
+   <span class="comment"><em>-----------------------</em></span>
+   <span class="comment"><em>-- Characters Output --</em></span>
+   <span class="comment"><em>-----------------------</em></span>
+
+   <b>procedure</b> <span class="symbol"><a name="ref_271_14" href="terminal_interface-curses-text_io__ads.htm#ref_109_14">Put</a></span> (<span class="symbol"><a name="ref_271_19" href="terminal_interface-curses-text_io__ads.htm#ref_109_19">Win</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>; <span class="symbol"><a name="ref_271_34" href="terminal_interface-curses-text_io__ads.htm#ref_109_34">Item</a></span> : Character)
+   <b>is</b>
+      <span class="symbol"><a name="ref_273_7">P_Size</a></span> : <b>constant</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_48_12">Count</a> := <a href="terminal_interface-curses-text_io__ads.htm#ref_81_13">Page_Length</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_109_19">Win</a>);
+      <span class="symbol"><a name="ref_274_7">Y</a></span> : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_275_7">X</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+      <span class="symbol"><a name="ref_276_7">L</a></span> : <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a>;
+      <span class="symbol"><a name="ref_277_7">C</a></span> : <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a>;
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-text_io__adb.htm#ref_273_7">P_Size</a> &gt; 0 <b>then</b>
+         <a href="terminal_interface-curses__ads.htm#ref_1415_14">Get_Cursor_Position</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_109_19">Win</a>, <a href="terminal_interface-curses-text_io__adb.htm#ref_274_7">Y</a>, <a href="terminal_interface-curses-text_io__adb.htm#ref_275_7">X</a>);
+         <a href="terminal_interface-curses__ads.htm#ref_1399_14">Get_Size</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_109_19">Win</a>, <a href="terminal_interface-curses-text_io__adb.htm#ref_276_7">L</a>, <a href="terminal_interface-curses-text_io__adb.htm#ref_277_7">C</a>);
+         <b>if</b> (<a href="terminal_interface-curses-text_io__adb.htm#ref_274_7">Y</a> + 1) = <a href="terminal_interface-curses-text_io__adb.htm#ref_276_7">L</a> <b>and</b> <b>then</b> (<a href="terminal_interface-curses-text_io__adb.htm#ref_275_7">X</a> + 1) = <a href="terminal_interface-curses-text_io__adb.htm#ref_277_7">C</a> <b>then</b>
+            <a href="terminal_interface-curses-text_io__ads.htm#ref_90_14">New_Page</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_109_19">Win</a>);
+         <b>end</b> <b>if</b>;
+      <b>end</b> <b>if</b>;
+      <a href="terminal_interface-curses__ads.htm#ref_699_14">Add</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_109_19">Win</a>, <a href="terminal_interface-curses-text_io__ads.htm#ref_109_34">Item</a>);
+   <b>end</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_109_14">Put</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_289_14" href="terminal_interface-curses-text_io__ads.htm#ref_110_14">Put</a></span> (<span class="symbol"><a name="ref_289_19" href="terminal_interface-curses-text_io__ads.htm#ref_110_19">Item</a></span> : Character)
+   <b>is</b>
+   <b>begin</b>
+      <a href="terminal_interface-curses-text_io__ads.htm#ref_109_14">Put</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_63_13">Get_Window</a>, <a href="terminal_interface-curses-text_io__ads.htm#ref_110_19">Item</a>);
+   <b>end</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_110_14">Put</a>;
+
+   <span class="comment"><em>--------------------</em></span>
+   <span class="comment"><em>-- Strings-Output --</em></span>
+   <span class="comment"><em>--------------------</em></span>
+
+   <b>procedure</b> <span class="symbol"><a name="ref_299_14" href="terminal_interface-curses-text_io__ads.htm#ref_116_14">Put</a></span> (<span class="symbol"><a name="ref_299_19" href="terminal_interface-curses-text_io__ads.htm#ref_116_19">Win</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>; <span class="symbol"><a name="ref_299_34" href="terminal_interface-curses-text_io__ads.htm#ref_116_34">Item</a></span> : String)
+   <b>is</b>
+      <span class="symbol"><a name="ref_301_7">P_Size</a></span> : <b>constant</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_48_12">Count</a> := <a href="terminal_interface-curses-text_io__ads.htm#ref_81_13">Page_Length</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_116_19">Win</a>);
+      <span class="symbol"><a name="ref_302_7">Y</a></span> : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_303_7">X</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+      <span class="symbol"><a name="ref_304_7">L</a></span> : <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a>;
+      <span class="symbol"><a name="ref_305_7">C</a></span> : <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a>;
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses-text_io__adb.htm#ref_301_7">P_Size</a> &gt; 0 <b>then</b>
+         <a href="terminal_interface-curses__ads.htm#ref_1415_14">Get_Cursor_Position</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_116_19">Win</a>, <a href="terminal_interface-curses-text_io__adb.htm#ref_302_7">Y</a>, <a href="terminal_interface-curses-text_io__adb.htm#ref_303_7">X</a>);
+         <a href="terminal_interface-curses__ads.htm#ref_1399_14">Get_Size</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_116_19">Win</a>, <a href="terminal_interface-curses-text_io__adb.htm#ref_304_7">L</a>, <a href="terminal_interface-curses-text_io__adb.htm#ref_305_7">C</a>);
+         <b>if</b> (<a href="terminal_interface-curses-text_io__adb.htm#ref_302_7">Y</a> + 1) = <a href="terminal_interface-curses-text_io__adb.htm#ref_304_7">L</a> <b>and</b> <b>then</b> (<a href="terminal_interface-curses-text_io__adb.htm#ref_303_7">X</a> + 1 + <a href="terminal_interface-curses-text_io__ads.htm#ref_116_34">Item</a>'Length) &gt;= <a href="terminal_interface-curses-text_io__adb.htm#ref_305_7">C</a> <b>then</b>
+            <a href="terminal_interface-curses-text_io__ads.htm#ref_90_14">New_Page</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_116_19">Win</a>);
+         <b>end</b> <b>if</b>;
+      <b>end</b> <b>if</b>;
+      <a href="terminal_interface-curses__ads.htm#ref_824_14">Add</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_116_19">Win</a>, <a href="terminal_interface-curses-text_io__ads.htm#ref_116_34">Item</a>);
+   <b>end</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_116_14">Put</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_317_14" href="terminal_interface-curses-text_io__ads.htm#ref_117_14">Put</a></span> (<span class="symbol"><a name="ref_317_19" href="terminal_interface-curses-text_io__ads.htm#ref_117_19">Item</a></span> : String)
+   <b>is</b>
+   <b>begin</b>
+      <a href="terminal_interface-curses-text_io__ads.htm#ref_116_14">Put</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_63_13">Get_Window</a>, <a href="terminal_interface-curses-text_io__ads.htm#ref_117_19">Item</a>);
+   <b>end</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_117_14">Put</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_323_14" href="terminal_interface-curses-text_io__ads.htm#ref_119_14">Put_Line</a></span>
+     (<span class="symbol"><a name="ref_324_7" href="terminal_interface-curses-text_io__ads.htm#ref_120_7">Win</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <span class="symbol"><a name="ref_325_7" href="terminal_interface-curses-text_io__ads.htm#ref_121_7">Item</a></span> : String)
+   <b>is</b>
+   <b>begin</b>
+      <a href="terminal_interface-curses-text_io__ads.htm#ref_116_14">Put</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_120_7">Win</a>, <a href="terminal_interface-curses-text_io__ads.htm#ref_121_7">Item</a>);
+      <a href="terminal_interface-curses-text_io__ads.htm#ref_87_14">New_Line</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_120_7">Win</a>, 1);
+   <b>end</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_119_14">Put_Line</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_332_14" href="terminal_interface-curses-text_io__ads.htm#ref_123_14">Put_Line</a></span>
+     (<span class="symbol"><a name="ref_333_7" href="terminal_interface-curses-text_io__ads.htm#ref_124_7">Item</a></span> : String)
+   <b>is</b>
+   <b>begin</b>
+      <a href="terminal_interface-curses-text_io__ads.htm#ref_119_14">Put_Line</a> (<a href="terminal_interface-curses-text_io__ads.htm#ref_63_13">Get_Window</a>, <a href="terminal_interface-curses-text_io__ads.htm#ref_124_7">Item</a>);
+   <b>end</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_123_14">Put_Line</a>;
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-text_io__ads.htm b/doc/html/ada/terminal_interface-curses-text_io__ads.htm
new file mode 100644
index 0000000..580dd82
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-text_io__ads.htm
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-text_io.ads</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-text_io.ads </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                     Terminal_Interface.Curses.Text_IO                    --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 S P E C                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.15 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>with</b> Ada.Text_IO;
+<b>with</b> Ada.IO_Exceptions;
+
+<b>package</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<span class="symbol"><a name="ref_45_35" href="terminal_interface-curses-text_io__adb.htm#ref_43_40">Text_IO</a></span> <b>is</b>
+
+   <b>use</b> <b>type</b> Ada.Text_IO.Count;
+   <b>subtype</b> <span class="symbol"><a name="ref_48_12">Count</a></span> <b>is</b> Ada.Text_IO.Count;
+   <b>subtype</b> <span class="symbol"><a name="ref_49_12">Positive_Count</a></span> <b>is</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_48_12">Count</a> <b>range</b> 1 .. <a href="terminal_interface-curses-text_io__ads.htm#ref_48_12">Count</a>'Last;
+
+   <b>subtype</b> <span class="symbol"><a name="ref_51_12">Field</a></span> <b>is</b> Ada.Text_IO.Field;
+   <b>subtype</b> <span class="symbol"><a name="ref_52_12">Number_Base</a></span> <b>is</b> Integer <b>range</b> 2 .. 16;
+
+   <b>type</b> <span class="symbol"><a name="ref_54_9">Type_Set</a></span> <b>is</b> (<span class="symbol"><a name="ref_54_22">Lower_Case</a></span>, <span class="symbol"><a name="ref_54_34">Upper_Case</a></span>, <span class="symbol"><a name="ref_54_46">Mixed_Case</a></span>);
+
+   <span class="comment"><em>--  For most of the routines you will see a version without a Window</em></span>
+   <span class="comment"><em>--  type parameter. They will operate on a default window, which can</em></span>
+   <span class="comment"><em>--  be set by the user. It is initially equal to Standard_Window.</em></span>
+
+   <b>procedure</b> <span class="symbol"><a name="ref_60_14" href="terminal_interface-curses-text_io__adb.htm#ref_47_14">Set_Window</a></span> (<span class="symbol"><a name="ref_60_26" href="terminal_interface-curses-text_io__adb.htm#ref_47_26">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>);
+   <span class="comment"><em>--  Set Win as the default window</em></span>
+
+   <b>function</b> <span class="symbol"><a name="ref_63_13" href="terminal_interface-curses-text_io__adb.htm#ref_53_13">Get_Window</a></span> <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+   <span class="comment"><em>--  Get the current default window</em></span>
+
+   <b>procedure</b> <span class="symbol"><a name="ref_66_14" href="terminal_interface-curses-text_io__adb.htm#ref_64_14">Flush</a></span> (<span class="symbol"><a name="ref_66_21" href="terminal_interface-curses-text_io__adb.htm#ref_64_21">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>);
+   <b>procedure</b> <span class="symbol"><a name="ref_67_14" href="terminal_interface-curses-text_io__adb.htm#ref_70_14">Flush</a></span>;
+
+   <span class="comment"><em>--------------------------------------------</em></span>
+   <span class="comment"><em>-- Specification of line and page lengths --</em></span>
+   <span class="comment"><em>--------------------------------------------</em></span>
+
+   <span class="comment"><em>--  There are no set routines in this package. I assume, that you allocate</em></span>
+   <span class="comment"><em>--  the window with an appropriate size.</em></span>
+   <span class="comment"><em>--  A scroll-window is interpreted as an page with unbounded page length,</em></span>
+   <span class="comment"><em>--  i.e. it returns the conventional 0 as page length.</em></span>
+
+   <b>function</b> <span class="symbol"><a name="ref_78_13" href="terminal_interface-curses-text_io__adb.htm#ref_85_13">Line_Length</a></span> (<span class="symbol"><a name="ref_78_26" href="terminal_interface-curses-text_io__adb.htm#ref_85_26">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_48_12">Count</a>;
+   <b>function</b> <span class="symbol"><a name="ref_79_13" href="terminal_interface-curses-text_io__adb.htm#ref_97_13">Line_Length</a></span> <b>return</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_48_12">Count</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_81_13" href="terminal_interface-curses-text_io__adb.htm#ref_103_13">Page_Length</a></span> (<span class="symbol"><a name="ref_81_26" href="terminal_interface-curses-text_io__adb.htm#ref_103_26">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_48_12">Count</a>;
+   <b>function</b> <span class="symbol"><a name="ref_82_13" href="terminal_interface-curses-text_io__adb.htm#ref_119_13">Page_Length</a></span> <b>return</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_48_12">Count</a>;
+
+   <span class="comment"><em>------------------------------------</em></span>
+   <span class="comment"><em>-- Column, Line, and Page Control --</em></span>
+   <span class="comment"><em>------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_87_14" href="terminal_interface-curses-text_io__adb.htm#ref_128_14">New_Line</a></span> (<span class="symbol"><a name="ref_87_24" href="terminal_interface-curses-text_io__adb.htm#ref_128_24">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>; <span class="symbol"><a name="ref_87_38" href="terminal_interface-curses-text_io__adb.htm#ref_128_38">Spacing</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_49_12">Positive_Count</a> := 1);
+   <b>procedure</b> <span class="symbol"><a name="ref_88_14" href="terminal_interface-curses-text_io__adb.htm#ref_145_14">New_Line</a></span> (<span class="symbol"><a name="ref_88_24" href="terminal_interface-curses-text_io__adb.htm#ref_145_24">Spacing</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_49_12">Positive_Count</a> := 1);
+
+   <b>procedure</b> <span class="symbol"><a name="ref_90_14" href="terminal_interface-curses-text_io__adb.htm#ref_151_14">New_Page</a></span> (<span class="symbol"><a name="ref_90_24" href="terminal_interface-curses-text_io__adb.htm#ref_151_24">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>);
+   <b>procedure</b> <span class="symbol"><a name="ref_91_14" href="terminal_interface-curses-text_io__adb.htm#ref_157_14">New_Page</a></span>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_93_14" href="terminal_interface-curses-text_io__adb.htm#ref_163_14">Set_Col</a></span> (<span class="symbol"><a name="ref_93_23" href="terminal_interface-curses-text_io__adb.htm#ref_163_23">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;  <span class="symbol"><a name="ref_93_38" href="terminal_interface-curses-text_io__adb.htm#ref_163_38">To</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_49_12">Positive_Count</a>);
+   <b>procedure</b> <span class="symbol"><a name="ref_94_14" href="terminal_interface-curses-text_io__adb.htm#ref_191_14">Set_Col</a></span> (<span class="symbol"><a name="ref_94_23" href="terminal_interface-curses-text_io__adb.htm#ref_191_23">To</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_49_12">Positive_Count</a>);
+
+   <b>procedure</b> <span class="symbol"><a name="ref_96_14" href="terminal_interface-curses-text_io__adb.htm#ref_197_14">Set_Line</a></span> (<span class="symbol"><a name="ref_96_24" href="terminal_interface-curses-text_io__adb.htm#ref_197_24">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>; <span class="symbol"><a name="ref_96_38" href="terminal_interface-curses-text_io__adb.htm#ref_197_38">To</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_49_12">Positive_Count</a>);
+   <b>procedure</b> <span class="symbol"><a name="ref_97_14" href="terminal_interface-curses-text_io__adb.htm#ref_221_14">Set_Line</a></span> (<span class="symbol"><a name="ref_97_24" href="terminal_interface-curses-text_io__adb.htm#ref_221_24">To</a></span> : <a href="terminal_interface-curses-text_io__ads.htm#ref_49_12">Positive_Count</a>);
+
+   <b>function</b> <span class="symbol"><a name="ref_99_13" href="terminal_interface-curses-text_io__adb.htm#ref_227_13">Col</a></span> (<span class="symbol"><a name="ref_99_18" href="terminal_interface-curses-text_io__adb.htm#ref_227_18">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_49_12">Positive_Count</a>;
+   <b>function</b> <span class="symbol"><a name="ref_100_13" href="terminal_interface-curses-text_io__adb.htm#ref_241_13">Col</a></span> <b>return</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_49_12">Positive_Count</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_102_13" href="terminal_interface-curses-text_io__adb.htm#ref_247_13">Line</a></span> (<span class="symbol"><a name="ref_102_19" href="terminal_interface-curses-text_io__adb.htm#ref_247_19">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_49_12">Positive_Count</a>;
+   <b>function</b> <span class="symbol"><a name="ref_103_13" href="terminal_interface-curses-text_io__adb.htm#ref_261_13">Line</a></span> <b>return</b> <a href="terminal_interface-curses-text_io__ads.htm#ref_49_12">Positive_Count</a>;
+
+   <span class="comment"><em>-----------------------</em></span>
+   <span class="comment"><em>-- Characters-Output --</em></span>
+   <span class="comment"><em>-----------------------</em></span>
+
+   <b>procedure</b> <span class="symbol"><a name="ref_109_14" href="terminal_interface-curses-text_io__adb.htm#ref_271_14">Put</a></span> (<span class="symbol"><a name="ref_109_19" href="terminal_interface-curses-text_io__adb.htm#ref_271_19">Win</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>; <span class="symbol"><a name="ref_109_34" href="terminal_interface-curses-text_io__adb.htm#ref_271_34">Item</a></span> : Character);
+   <b>procedure</b> <span class="symbol"><a name="ref_110_14" href="terminal_interface-curses-text_io__adb.htm#ref_289_14">Put</a></span> (<span class="symbol"><a name="ref_110_19" href="terminal_interface-curses-text_io__adb.htm#ref_289_19">Item</a></span> : Character);
+
+   <span class="comment"><em>--------------------</em></span>
+   <span class="comment"><em>-- Strings-Output --</em></span>
+   <span class="comment"><em>--------------------</em></span>
+
+   <b>procedure</b> <span class="symbol"><a name="ref_116_14" href="terminal_interface-curses-text_io__adb.htm#ref_299_14">Put</a></span> (<span class="symbol"><a name="ref_116_19" href="terminal_interface-curses-text_io__adb.htm#ref_299_19">Win</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>; <span class="symbol"><a name="ref_116_34" href="terminal_interface-curses-text_io__adb.htm#ref_299_34">Item</a></span> : String);
+   <b>procedure</b> <span class="symbol"><a name="ref_117_14" href="terminal_interface-curses-text_io__adb.htm#ref_317_14">Put</a></span> (<span class="symbol"><a name="ref_117_19" href="terminal_interface-curses-text_io__adb.htm#ref_317_19">Item</a></span> : String);
+
+   <b>procedure</b> <span class="symbol"><a name="ref_119_14" href="terminal_interface-curses-text_io__adb.htm#ref_323_14">Put_Line</a></span>
+     (<span class="symbol"><a name="ref_120_7" href="terminal_interface-curses-text_io__adb.htm#ref_324_7">Win</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <span class="symbol"><a name="ref_121_7" href="terminal_interface-curses-text_io__adb.htm#ref_325_7">Item</a></span> : String);
+
+   <b>procedure</b> <span class="symbol"><a name="ref_123_14" href="terminal_interface-curses-text_io__adb.htm#ref_332_14">Put_Line</a></span>
+     (<span class="symbol"><a name="ref_124_7" href="terminal_interface-curses-text_io__adb.htm#ref_333_7">Item</a></span> : String);
+
+   <span class="comment"><em>--  Exceptions</em></span>
+
+   <span class="symbol"><a name="ref_128_4">Status_Error</a></span> : <b>exception</b> <b>renames</b> Ada.IO_Exceptions.Status_Error;
+   <span class="symbol"><a name="ref_129_4">Mode_Error</a></span>   : <b>exception</b> <b>renames</b> Ada.IO_Exceptions.Mode_Error;
+   <span class="symbol"><a name="ref_130_4">Name_Error</a></span>   : <b>exception</b> <b>renames</b> Ada.IO_Exceptions.Name_Error;
+   <span class="symbol"><a name="ref_131_4">Use_Error</a></span>    : <b>exception</b> <b>renames</b> Ada.IO_Exceptions.Use_Error;
+   <span class="symbol"><a name="ref_132_4">Device_Error</a></span> : <b>exception</b> <b>renames</b> Ada.IO_Exceptions.Device_Error;
+   <span class="symbol"><a name="ref_133_4">End_Error</a></span>    : <b>exception</b> <b>renames</b> Ada.IO_Exceptions.End_Error;
+   <span class="symbol"><a name="ref_134_4">Data_Error</a></span>   : <b>exception</b> <b>renames</b> Ada.IO_Exceptions.Data_Error;
+   <span class="symbol"><a name="ref_135_4">Layout_Error</a></span> : <b>exception</b> <b>renames</b> Ada.IO_Exceptions.Layout_Error;
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-text_io__ads.htm#ref_45_35">Text_IO</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-trace__adb.htm b/doc/html/ada/terminal_interface-curses-trace__adb.htm
new file mode 100644
index 0000000..05455ee
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-trace__adb.htm
@@ -0,0 +1,79 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-trace.adb</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-trace.adb </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                      Terminal_Interface.Curses.Trace                     --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 B O D Y                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 2001-2011,2014 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.12 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>with</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C; <b>use</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C;
+
+<b>package</b> <b>body</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<span class="symbol"><a name="ref_44_40" href="terminal_interface-curses-trace__ads.htm#ref_43_35">Trace</a></span> <b>is</b>
+
+   <b>procedure</b> <span class="symbol"><a name="ref_46_14" href="terminal_interface-curses-trace__ads.htm#ref_115_14">Trace_On</a></span> (<span class="symbol"><a name="ref_46_24" href="terminal_interface-curses-trace__ads.htm#ref_115_24">x</a></span> : <a href="terminal_interface-curses-trace__ads.htm#ref_46_9">Trace_Attribute_Set</a>) <b>is</b>
+      <b>procedure</b> <span class="symbol"><a name="ref_47_17">traceC</a></span> (<span class="symbol"><a name="ref_47_25">y</a></span> : <a href="terminal_interface-curses-trace__ads.htm#ref_46_9">Trace_Attribute_Set</a>);
+      <b>pragma</b> Import (C, traceC, "trace");
+   <b>begin</b>
+      <a href="terminal_interface-curses-trace__adb.htm#ref_47_17">traceC</a> (<a href="terminal_interface-curses-trace__ads.htm#ref_115_24">x</a>);
+   <b>end</b> <a href="terminal_interface-curses-trace__ads.htm#ref_115_14">Trace_On</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_53_14" href="terminal_interface-curses-trace__ads.htm#ref_119_14">Trace_Put</a></span> (<span class="symbol"><a name="ref_53_25" href="terminal_interface-curses-trace__ads.htm#ref_119_25">str</a></span> : String) <b>is</b>
+      <b>procedure</b> <span class="symbol"><a name="ref_54_17">tracef</a></span> (<span class="symbol"><a name="ref_54_25">format</a></span> : char_array; <span class="symbol"><a name="ref_54_46">s</a></span> : char_array);
+      <b>pragma</b> Import (C, tracef, "_traces");
+      <span class="comment"><em>--  _traces() is defined in c_varargs_to_ada.h</em></span>
+   <b>begin</b>
+      <a href="terminal_interface-curses-trace__adb.htm#ref_54_17">tracef</a> (To_C ("%s"), To_C (<a href="terminal_interface-curses-trace__ads.htm#ref_119_25">str</a>));
+   <b>end</b> <a href="terminal_interface-curses-trace__ads.htm#ref_119_14">Trace_Put</a>;
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-trace__ads.htm#ref_43_35">Trace</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses-trace__ads.htm b/doc/html/ada/terminal_interface-curses-trace__ads.htm
new file mode 100644
index 0000000..4369516
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses-trace__ads.htm
@@ -0,0 +1,143 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses-trace.ads</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses-trace.ads </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                      Terminal_Interface.Curses.Trace                     --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 S P E C                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 2000,2014 Free Software Foundation, Inc.                       --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author: Eugene V. Melaragno &lt;aldomel@ix.netcom.com&gt; 2000</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.5 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+
+<b>package</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<span class="symbol"><a name="ref_43_35" href="terminal_interface-curses-trace__adb.htm#ref_44_40">Trace</a></span> <b>is</b>
+   <b>pragma</b> Preelaborate (<a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-trace__ads.htm#ref_43_35">Trace</a>);
+
+   <b>type</b> <span class="symbol"><a name="ref_46_9">Trace_Attribute_Set</a></span> <b>is</b>
+      <b>record</b>
+         <span class="symbol"><a name="ref_48_10">Times</a></span>            : Boolean;
+         <span class="symbol"><a name="ref_49_10">Tputs</a></span>            : Boolean;
+         <span class="symbol"><a name="ref_50_10">Update</a></span>           : Boolean;
+         <span class="symbol"><a name="ref_51_10">Cursor_Move</a></span>      : Boolean;
+         <span class="symbol"><a name="ref_52_10">Character_Output</a></span> : Boolean;
+         <span class="symbol"><a name="ref_53_10">Calls</a></span>            : Boolean;
+         <span class="symbol"><a name="ref_54_10">Virtual_Puts</a></span>     : Boolean;
+         <span class="symbol"><a name="ref_55_10">Input_Events</a></span>     : Boolean;
+         <span class="symbol"><a name="ref_56_10">TTY_State</a></span>        : Boolean;
+         <span class="symbol"><a name="ref_57_10">Internal_Calls</a></span>   : Boolean;
+         <span class="symbol"><a name="ref_58_10">Character_Calls</a></span>  : Boolean;
+         <span class="symbol"><a name="ref_59_10">Termcap_TermInfo</a></span> : Boolean;
+         <span class="symbol"><a name="ref_60_10">Attribute_Color</a></span>  : Boolean;
+      <b>end</b> <b>record</b>;
+   <b>pragma</b> Convention (C_Pass_By_Copy, <a href="terminal_interface-curses-trace__ads.htm#ref_46_9">Trace_Attribute_Set</a>);
+
+   <b>for</b> <a href="terminal_interface-curses-trace__ads.htm#ref_46_9">Trace_Attribute_Set</a> <b>use</b>
+      <b>record</b>
+         <a href="terminal_interface-curses-trace__ads.htm#ref_48_10">Times</a>            <b>at</b> 0 <b>range</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_356_4">TRACE_TIMES_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_357_4">TRACE_TIMES_Last</a>;
+         <a href="terminal_interface-curses-trace__ads.htm#ref_49_10">Tputs</a>            <b>at</b> 0 <b>range</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_358_4">TRACE_TPUTS_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_359_4">TRACE_TPUTS_Last</a>;
+         <a href="terminal_interface-curses-trace__ads.htm#ref_50_10">Update</a>           <b>at</b> 0 <b>range</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_360_4">TRACE_UPDATE_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_361_4">TRACE_UPDATE_Last</a>;
+         <a href="terminal_interface-curses-trace__ads.htm#ref_51_10">Cursor_Move</a>      <b>at</b> 0 <b>range</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_362_4">TRACE_MOVE_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_363_4">TRACE_MOVE_Last</a>;
+         <a href="terminal_interface-curses-trace__ads.htm#ref_52_10">Character_Output</a> <b>at</b> 0 <b>range</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_364_4">TRACE_CHARPUT_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_365_4">TRACE_CHARPUT_Last</a>;
+         <a href="terminal_interface-curses-trace__ads.htm#ref_53_10">Calls</a>            <b>at</b> 0 <b>range</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_366_4">TRACE_CALLS_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_367_4">TRACE_CALLS_Last</a>;
+         <a href="terminal_interface-curses-trace__ads.htm#ref_54_10">Virtual_Puts</a>     <b>at</b> 0 <b>range</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_368_4">TRACE_VIRTPUT_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_369_4">TRACE_VIRTPUT_Last</a>;
+         <a href="terminal_interface-curses-trace__ads.htm#ref_55_10">Input_Events</a>     <b>at</b> 0 <b>range</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_370_4">TRACE_IEVENT_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_371_4">TRACE_IEVENT_Last</a>;
+         <a href="terminal_interface-curses-trace__ads.htm#ref_56_10">TTY_State</a>        <b>at</b> 0 <b>range</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_372_4">TRACE_BITS_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_373_4">TRACE_BITS_Last</a>;
+         <a href="terminal_interface-curses-trace__ads.htm#ref_57_10">Internal_Calls</a>   <b>at</b> 0 <b>range</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_374_4">TRACE_ICALLS_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_375_4">TRACE_ICALLS_Last</a>;
+         <a href="terminal_interface-curses-trace__ads.htm#ref_58_10">Character_Calls</a>  <b>at</b> 0 <b>range</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_376_4">TRACE_CCALLS_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_377_4">TRACE_CCALLS_Last</a>;
+         <a href="terminal_interface-curses-trace__ads.htm#ref_59_10">Termcap_TermInfo</a> <b>at</b> 0 <b>range</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_378_4">TRACE_DATABASE_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_379_4">TRACE_DATABASE_Last</a>;
+         <a href="terminal_interface-curses-trace__ads.htm#ref_60_10">Attribute_Color</a>  <b>at</b> 0 <b>range</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_380_4">TRACE_ATTRS_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_381_4">TRACE_ATTRS_Last</a>;
+      <b>end</b> <b>record</b>;
+   <b>pragma</b> Warnings (Off);
+   <b>for</b> <a href="terminal_interface-curses-trace__ads.htm#ref_46_9">Trace_Attribute_Set</a>'Size <b>use</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_382_4">Trace_Size</a>;
+   <b>pragma</b> Warnings (On);
+
+   <span class="symbol"><a name="ref_97_4">Trace_Disable</a></span>  : <b>constant</b> <a href="terminal_interface-curses-trace__ads.htm#ref_46_9">Trace_Attribute_Set</a> := (<b>others</b> =&gt; False);
+
+   <span class="symbol"><a name="ref_99_4">Trace_Ordinary</a></span> : <b>constant</b> <a href="terminal_interface-curses-trace__ads.htm#ref_46_9">Trace_Attribute_Set</a> :=
+     (<a href="terminal_interface-curses-trace__ads.htm#ref_48_10">Times</a>            =&gt; True,
+      <a href="terminal_interface-curses-trace__ads.htm#ref_49_10">Tputs</a>            =&gt; True,
+      <a href="terminal_interface-curses-trace__ads.htm#ref_50_10">Update</a>           =&gt; True,
+      <a href="terminal_interface-curses-trace__ads.htm#ref_51_10">Cursor_Move</a>      =&gt; True,
+      <a href="terminal_interface-curses-trace__ads.htm#ref_52_10">Character_Output</a> =&gt; True,
+      <b>others</b>           =&gt; False);
+   <span class="symbol"><a name="ref_106_4">Trace_Maximum</a></span> : <b>constant</b> <a href="terminal_interface-curses-trace__ads.htm#ref_46_9">Trace_Attribute_Set</a> := (<b>others</b> =&gt; True);
+
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/curs_trace.3x.html">curs_trace.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_1">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_115_14" href="terminal_interface-curses-trace__adb.htm#ref_46_14">Trace_On</a></span> (<span class="symbol"><a name="ref_115_24" href="terminal_interface-curses-trace__adb.htm#ref_46_24">x</a></span> : <a href="terminal_interface-curses-trace__ads.htm#ref_46_9">Trace_Attribute_Set</a>);
+   <span class="comment"><em>--  The debugging library has trace.</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_2">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_119_14" href="terminal_interface-curses-trace__adb.htm#ref_53_14">Trace_Put</a></span> (<span class="symbol"><a name="ref_119_25" href="terminal_interface-curses-trace__adb.htm#ref_53_25">str</a></span> : String);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_trace.3x.html">_tracef()</A></em></span>
+
+   <span class="symbol"><a name="ref_122_4">Current_Trace_Setting</a></span> : <a href="terminal_interface-curses-trace__ads.htm#ref_46_9">Trace_Attribute_Set</a>;
+   <b>pragma</b> Import (C, <a href="terminal_interface-curses-trace__ads.htm#ref_122_4">Current_Trace_Setting</a>, "_nc_tracing");
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-trace__ads.htm#ref_43_35">Trace</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses__adb.htm b/doc/html/ada/terminal_interface-curses__adb.htm
new file mode 100644
index 0000000..5363661
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses__adb.htm
@@ -0,0 +1,2575 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses.adb</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses.adb </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                        Terminal_Interface.Curses                         --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 B O D Y                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2018,2020 Thomas E. Dickey                                     --</em></span>
+<span class="comment"><em>-- Copyright 2007-2011,2014 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author: Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.16 @</em></span>
+<span class="comment"><em>--  @Date: 2020/02/02 23:34:34 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>with</b> System;
+
+<b>with</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>.<a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>;
+<b>with</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C;                  <b>use</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C;
+<b>with</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.Strings;          <b>use</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.Strings;
+<b>with</b> Ada.Characters.Handling;       <b>use</b> Ada.Characters.Handling;
+<b>with</b> Ada.Strings.Fixed;
+
+<b>package</b> <b>body</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<span class="symbol"><a name="ref_51_33" href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a></span> <b>is</b>
+
+   <b>use</b> <a href="terminal_interface-curses-aux__ads.htm#ref_46_35">Aux</a>;
+
+   <b>package</b> <span class="symbol"><a name="ref_55_12">ASF</a></span> <b>renames</b> Ada.Strings.Fixed;
+
+   <b>type</b> chtype_array <b>is</b> <b>array</b> (size_t <b>range</b> &lt;&gt;)
+      <b>of</b> <b>aliased</b> <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>;
+   <b>pragma</b> Convention (C, chtype_array);
+
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_62_13" href="terminal_interface-curses__ads.htm#ref_1787_13">Key_Name</a></span> (<span class="symbol"><a name="ref_62_23" href="terminal_interface-curses__ads.htm#ref_1787_23">Key</a></span> : <a href="terminal_interface-curses__ads.htm#ref_72_12">Real_Key_Code</a>) <b>return</b> String
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_64_16">Keyname</a></span> (<span class="symbol"><a name="ref_64_25">K</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> chars_ptr;
+      <b>pragma</b> Import (C, Keyname, "keyname");
+
+      <span class="symbol"><a name="ref_67_7">Ch</a></span> : Character;
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__ads.htm#ref_1787_23">Key</a> &lt;= Character'Pos (Character'Last) <b>then</b>
+         <a href="terminal_interface-curses__adb.htm#ref_67_7">Ch</a> := Character'Val (<a href="terminal_interface-curses__ads.htm#ref_1787_23">Key</a>);
+         <b>if</b> Is_Control (<a href="terminal_interface-curses__adb.htm#ref_67_7">Ch</a>) <b>then</b>
+            <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_1798_13">Un_Control</a> (<a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>'(<a href="terminal_interface-curses__ads.htm#ref_492_10">Ch</a>    =&gt; <a href="terminal_interface-curses__adb.htm#ref_67_7">Ch</a>,
+                                                     <a href="terminal_interface-curses__ads.htm#ref_491_10">Color</a> =&gt; <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>'First,
+                                                     <a href="terminal_interface-curses__ads.htm#ref_490_10">Attr</a>  =&gt; <a href="terminal_interface-curses__ads.htm#ref_486_4">Normal_Video</a>));
+         <b>elsif</b> Is_Graphic (<a href="terminal_interface-curses__adb.htm#ref_67_7">Ch</a>) <b>then</b>
+            <b>declare</b>
+               <span class="symbol"><a name="ref_77_16">S</a></span> : String (1 .. 1);
+            <b>begin</b>
+               <a href="terminal_interface-curses__adb.htm#ref_77_16">S</a> (1) := <a href="terminal_interface-curses__adb.htm#ref_67_7">Ch</a>;
+               <b>return</b> <a href="terminal_interface-curses__adb.htm#ref_77_16">S</a>;
+            <b>end</b>;
+         <b>else</b>
+            <b>return</b> "";
+         <b>end</b> <b>if</b>;
+      <b>else</b>
+         <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_96_13">Fill_String</a> (<a href="terminal_interface-curses__adb.htm#ref_64_16">Keyname</a> (<a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1787_23">Key</a>)));
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1787_13">Key_Name</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_90_14" href="terminal_interface-curses__ads.htm#ref_1781_14">Key_Name</a></span> (<span class="symbol"><a name="ref_90_24" href="terminal_interface-curses__ads.htm#ref_1781_24">Key</a></span>  :  <a href="terminal_interface-curses__ads.htm#ref_72_12">Real_Key_Code</a>;
+                       <span class="symbol"><a name="ref_91_24" href="terminal_interface-curses__ads.htm#ref_1782_24">Name</a></span> : <b>out</b> String)
+   <b>is</b>
+   <b>begin</b>
+      <a href="terminal_interface-curses__adb.htm#ref_55_12">ASF</a>.Move (<a href="terminal_interface-curses__ads.htm#ref_1787_13">Key_Name</a> (<a href="terminal_interface-curses__ads.htm#ref_1781_24">Key</a>), <a href="terminal_interface-curses__ads.htm#ref_1782_24">Name</a>);
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1781_14">Key_Name</a>;
+
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_98_14" href="terminal_interface-curses__ads.htm#ref_657_14">Init_Screen</a></span>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_100_16">Initscr</a></span> <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <b>pragma</b> Import (C, Initscr, "initscr");
+
+      <span class="symbol"><a name="ref_103_7">W</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+   <b>begin</b>
+      <a href="terminal_interface-curses__adb.htm#ref_103_7">W</a> := <a href="terminal_interface-curses__adb.htm#ref_100_16">Initscr</a>;
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_103_7">W</a> = <a href="terminal_interface-curses__ads.htm#ref_57_4">Null_Window</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_657_14">Init_Screen</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_111_14" href="terminal_interface-curses__ads.htm#ref_666_14">End_Windows</a></span>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_113_16">Endwin</a></span> <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Endwin, "endwin");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_113_16">Endwin</a> = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_666_14">End_Windows</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_121_13" href="terminal_interface-curses__ads.htm#ref_673_13">Is_End_Window</a></span> <b>return</b> Boolean
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_123_16">Isendwin</a></span> <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>;
+      <b>pragma</b> Import (C, Isendwin, "isendwin");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_123_16">Isendwin</a> = <a href="terminal_interface-curses__ads.htm#ref_2101_4">Curses_Bool_False</a> <b>then</b>
+         <b>return</b> False;
+      <b>else</b>
+         <b>return</b> True;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_673_13">Is_End_Window</a>;
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_133_14" href="terminal_interface-curses__ads.htm#ref_682_14">Move_Cursor</a></span> (<span class="symbol"><a name="ref_133_27" href="terminal_interface-curses__ads.htm#ref_682_27">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                          <span class="symbol"><a name="ref_134_27" href="terminal_interface-curses__ads.htm#ref_683_27">Line</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+                          <span class="symbol"><a name="ref_135_27" href="terminal_interface-curses__ads.htm#ref_684_27">Column</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_137_16">Wmove</a></span> (<span class="symbol"><a name="ref_137_23">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+                      <span class="symbol"><a name="ref_138_23">Line</a></span>   : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+                      <span class="symbol"><a name="ref_139_23">Column</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>
+                     ) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Wmove, "wmove");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_137_16">Wmove</a> (<a href="terminal_interface-curses__ads.htm#ref_682_27">Win</a>, <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_683_27">Line</a>), <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_684_27">Column</a>)) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_682_14">Move_Cursor</a>;
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_148_14" href="terminal_interface-curses__ads.htm#ref_694_14">Add</a></span> (<span class="symbol"><a name="ref_148_19" href="terminal_interface-curses__ads.htm#ref_694_19">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                  <span class="symbol"><a name="ref_149_19" href="terminal_interface-curses__ads.htm#ref_695_19">Ch</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_151_16">Waddch</a></span> (<span class="symbol"><a name="ref_151_24">W</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+                       <span class="symbol"><a name="ref_152_24">Ch</a></span> : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Waddch, "waddch");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_151_16">Waddch</a> (<a href="terminal_interface-curses__ads.htm#ref_694_19">Win</a>, <a href="terminal_interface-curses__ads.htm#ref_695_19">Ch</a>) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_694_14">Add</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_160_14" href="terminal_interface-curses__ads.htm#ref_699_14">Add</a></span> (<span class="symbol"><a name="ref_160_19" href="terminal_interface-curses__ads.htm#ref_699_19">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                  <span class="symbol"><a name="ref_161_19" href="terminal_interface-curses__ads.htm#ref_700_19">Ch</a></span>  : Character)
+   <b>is</b>
+   <b>begin</b>
+      <a href="terminal_interface-curses__ads.htm#ref_694_14">Add</a> (<a href="terminal_interface-curses__ads.htm#ref_699_19">Win</a>,
+           <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>'(<a href="terminal_interface-curses__ads.htm#ref_492_10">Ch</a>    =&gt; <a href="terminal_interface-curses__ads.htm#ref_700_19">Ch</a>,
+                                 <a href="terminal_interface-curses__ads.htm#ref_491_10">Color</a> =&gt; <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>'First,
+                                 <a href="terminal_interface-curses__ads.htm#ref_490_10">Attr</a>  =&gt; <a href="terminal_interface-curses__ads.htm#ref_486_4">Normal_Video</a>));
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_699_14">Add</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_170_14" href="terminal_interface-curses__ads.htm#ref_705_14">Add</a></span>
+     (<span class="symbol"><a name="ref_171_7" href="terminal_interface-curses__ads.htm#ref_706_7">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_172_7" href="terminal_interface-curses__ads.htm#ref_707_7">Line</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_173_7" href="terminal_interface-curses__ads.htm#ref_708_7">Column</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+      <span class="symbol"><a name="ref_174_7" href="terminal_interface-curses__ads.htm#ref_709_7">Ch</a></span>     : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_176_16">mvwaddch</a></span> (<span class="symbol"><a name="ref_176_26">W</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+                         <span class="symbol"><a name="ref_177_26">Y</a></span>  : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+                         <span class="symbol"><a name="ref_178_26">X</a></span>  : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+                         <span class="symbol"><a name="ref_179_26">Ch</a></span> : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, mvwaddch, "mvwaddch");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_176_16">mvwaddch</a> (<a href="terminal_interface-curses__ads.htm#ref_706_7">Win</a>, <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_707_7">Line</a>),
+                   <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_708_7">Column</a>),
+                   <a href="terminal_interface-curses__ads.htm#ref_709_7">Ch</a>) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a>
+      <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_705_14">Add</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_190_14" href="terminal_interface-curses__ads.htm#ref_713_14">Add</a></span>
+     (<span class="symbol"><a name="ref_191_7" href="terminal_interface-curses__ads.htm#ref_714_7">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_192_7" href="terminal_interface-curses__ads.htm#ref_715_7">Line</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_193_7" href="terminal_interface-curses__ads.htm#ref_716_7">Column</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+      <span class="symbol"><a name="ref_194_7" href="terminal_interface-curses__ads.htm#ref_717_7">Ch</a></span>     : Character)
+   <b>is</b>
+   <b>begin</b>
+      <a href="terminal_interface-curses__ads.htm#ref_705_14">Add</a> (<a href="terminal_interface-curses__ads.htm#ref_714_7">Win</a>,
+           <a href="terminal_interface-curses__ads.htm#ref_715_7">Line</a>,
+           <a href="terminal_interface-curses__ads.htm#ref_716_7">Column</a>,
+           <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>'(<a href="terminal_interface-curses__ads.htm#ref_492_10">Ch</a>    =&gt; <a href="terminal_interface-curses__ads.htm#ref_717_7">Ch</a>,
+                                 <a href="terminal_interface-curses__ads.htm#ref_491_10">Color</a> =&gt; <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>'First,
+                                 <a href="terminal_interface-curses__ads.htm#ref_490_10">Attr</a>  =&gt; <a href="terminal_interface-curses__ads.htm#ref_486_4">Normal_Video</a>));
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_713_14">Add</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_205_14" href="terminal_interface-curses__ads.htm#ref_722_14">Add_With_Immediate_Echo</a></span>
+     (<span class="symbol"><a name="ref_206_7" href="terminal_interface-curses__ads.htm#ref_723_7">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_207_7" href="terminal_interface-curses__ads.htm#ref_724_7">Ch</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_209_16">Wechochar</a></span> (<span class="symbol"><a name="ref_209_27">W</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+                          <span class="symbol"><a name="ref_210_27">Ch</a></span> : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Wechochar, "wechochar");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_209_16">Wechochar</a> (<a href="terminal_interface-curses__ads.htm#ref_723_7">Win</a>, <a href="terminal_interface-curses__ads.htm#ref_724_7">Ch</a>) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_722_14">Add_With_Immediate_Echo</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_218_14" href="terminal_interface-curses__ads.htm#ref_728_14">Add_With_Immediate_Echo</a></span>
+     (<span class="symbol"><a name="ref_219_7" href="terminal_interface-curses__ads.htm#ref_729_7">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_220_7" href="terminal_interface-curses__ads.htm#ref_730_7">Ch</a></span>  : Character)
+   <b>is</b>
+   <b>begin</b>
+      <a href="terminal_interface-curses__ads.htm#ref_722_14">Add_With_Immediate_Echo</a>
+        (<a href="terminal_interface-curses__ads.htm#ref_729_7">Win</a>,
+         <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>'(<a href="terminal_interface-curses__ads.htm#ref_492_10">Ch</a>    =&gt; <a href="terminal_interface-curses__ads.htm#ref_730_7">Ch</a>,
+                               <a href="terminal_interface-curses__ads.htm#ref_491_10">Color</a> =&gt; <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>'First,
+                               <a href="terminal_interface-curses__ads.htm#ref_490_10">Attr</a>  =&gt; <a href="terminal_interface-curses__ads.htm#ref_486_4">Normal_Video</a>));
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_728_14">Add_With_Immediate_Echo</a>;
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_230_13" href="terminal_interface-curses__ads.htm#ref_740_13">Create</a></span> (<span class="symbol"><a name="ref_230_21" href="terminal_interface-curses__ads.htm#ref_741_7">Number_Of_Lines</a></span>       : <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a>;
+                    <span class="symbol"><a name="ref_231_21" href="terminal_interface-curses__ads.htm#ref_742_7">Number_Of_Columns</a></span>     : <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a>;
+                    <span class="symbol"><a name="ref_232_21" href="terminal_interface-curses__ads.htm#ref_743_7">First_Line_Position</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+                    <span class="symbol"><a name="ref_233_21" href="terminal_interface-curses__ads.htm#ref_744_7">First_Column_Position</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_235_16">Newwin</a></span> (<span class="symbol"><a name="ref_235_24">Number_Of_Lines</a></span>       : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+                       <span class="symbol"><a name="ref_236_24">Number_Of_Columns</a></span>     : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+                       <span class="symbol"><a name="ref_237_24">First_Line_Position</a></span>   : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+                       <span class="symbol"><a name="ref_238_24">First_Column_Position</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <b>pragma</b> Import (C, Newwin, "newwin");
+
+      <span class="symbol"><a name="ref_241_7">W</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+   <b>begin</b>
+      <a href="terminal_interface-curses__adb.htm#ref_241_7">W</a> := <a href="terminal_interface-curses__adb.htm#ref_235_16">Newwin</a> (<a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_741_7">Number_Of_Lines</a>),
+                   <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_742_7">Number_Of_Columns</a>),
+                   <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_743_7">First_Line_Position</a>),
+                   <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_744_7">First_Column_Position</a>));
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_241_7">W</a> = <a href="terminal_interface-curses__ads.htm#ref_57_4">Null_Window</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+      <b>return</b> <a href="terminal_interface-curses__adb.htm#ref_241_7">W</a>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_740_13">Create</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_253_14" href="terminal_interface-curses__ads.htm#ref_759_14">Delete</a></span> (<span class="symbol"><a name="ref_253_22" href="terminal_interface-curses__ads.htm#ref_759_22">Win</a></span> : <b>in</b> <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_255_16">Wdelwin</a></span> (<span class="symbol"><a name="ref_255_25">W</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Wdelwin, "delwin");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_255_16">Wdelwin</a> (<a href="terminal_interface-curses__ads.htm#ref_759_22">Win</a>) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+      <a href="terminal_interface-curses__ads.htm#ref_759_22">Win</a> := <a href="terminal_interface-curses__ads.htm#ref_57_4">Null_Window</a>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_759_14">Delete</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_264_13" href="terminal_interface-curses__ads.htm#ref_765_13">Sub_Window</a></span>
+     (<span class="symbol"><a name="ref_265_7" href="terminal_interface-curses__ads.htm#ref_766_7">Win</a></span>                   : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_266_7" href="terminal_interface-curses__ads.htm#ref_767_7">Number_Of_Lines</a></span>       : <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a>;
+      <span class="symbol"><a name="ref_267_7" href="terminal_interface-curses__ads.htm#ref_768_7">Number_Of_Columns</a></span>     : <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a>;
+      <span class="symbol"><a name="ref_268_7" href="terminal_interface-curses__ads.htm#ref_769_7">First_Line_Position</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_269_7" href="terminal_interface-curses__ads.htm#ref_770_7">First_Column_Position</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_271_16">Subwin</a></span>
+        (<span class="symbol"><a name="ref_272_10">Win</a></span>                   : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+         <span class="symbol"><a name="ref_273_10">Number_Of_Lines</a></span>       : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+         <span class="symbol"><a name="ref_274_10">Number_Of_Columns</a></span>     : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+         <span class="symbol"><a name="ref_275_10">First_Line_Position</a></span>   : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+         <span class="symbol"><a name="ref_276_10">First_Column_Position</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <b>pragma</b> Import (C, Subwin, "subwin");
+
+      <span class="symbol"><a name="ref_279_7">W</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+   <b>begin</b>
+      <a href="terminal_interface-curses__adb.htm#ref_279_7">W</a> := <a href="terminal_interface-curses__adb.htm#ref_271_16">Subwin</a> (<a href="terminal_interface-curses__ads.htm#ref_766_7">Win</a>,
+                   <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_767_7">Number_Of_Lines</a>),
+                   <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_768_7">Number_Of_Columns</a>),
+                   <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_769_7">First_Line_Position</a>),
+                   <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_770_7">First_Column_Position</a>));
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_279_7">W</a> = <a href="terminal_interface-curses__ads.htm#ref_57_4">Null_Window</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+      <b>return</b> <a href="terminal_interface-curses__adb.htm#ref_279_7">W</a>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_765_13">Sub_Window</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_292_13" href="terminal_interface-curses__ads.htm#ref_775_13">Derived_Window</a></span>
+     (<span class="symbol"><a name="ref_293_7" href="terminal_interface-curses__ads.htm#ref_776_7">Win</a></span>                   : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_294_7" href="terminal_interface-curses__ads.htm#ref_777_7">Number_Of_Lines</a></span>       : <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a>;
+      <span class="symbol"><a name="ref_295_7" href="terminal_interface-curses__ads.htm#ref_778_7">Number_Of_Columns</a></span>     : <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a>;
+      <span class="symbol"><a name="ref_296_7" href="terminal_interface-curses__ads.htm#ref_779_7">First_Line_Position</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_297_7" href="terminal_interface-curses__ads.htm#ref_780_7">First_Column_Position</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_299_16">Derwin</a></span>
+        (<span class="symbol"><a name="ref_300_10">Win</a></span>                   : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+         <span class="symbol"><a name="ref_301_10">Number_Of_Lines</a></span>       : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+         <span class="symbol"><a name="ref_302_10">Number_Of_Columns</a></span>     : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+         <span class="symbol"><a name="ref_303_10">First_Line_Position</a></span>   : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+         <span class="symbol"><a name="ref_304_10">First_Column_Position</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <b>pragma</b> Import (C, Derwin, "derwin");
+
+      <span class="symbol"><a name="ref_307_7">W</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+   <b>begin</b>
+      <a href="terminal_interface-curses__adb.htm#ref_307_7">W</a> := <a href="terminal_interface-curses__adb.htm#ref_299_16">Derwin</a> (<a href="terminal_interface-curses__ads.htm#ref_776_7">Win</a>,
+                   <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_777_7">Number_Of_Lines</a>),
+                   <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_778_7">Number_Of_Columns</a>),
+                   <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_779_7">First_Line_Position</a>),
+                   <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_780_7">First_Column_Position</a>));
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_307_7">W</a> = <a href="terminal_interface-curses__ads.htm#ref_57_4">Null_Window</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+      <b>return</b> <a href="terminal_interface-curses__adb.htm#ref_307_7">W</a>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_775_13">Derived_Window</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_320_13" href="terminal_interface-curses__ads.htm#ref_785_13">Duplicate</a></span> (<span class="symbol"><a name="ref_320_24" href="terminal_interface-curses__ads.htm#ref_785_24">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_322_16">Dupwin</a></span> (<span class="symbol"><a name="ref_322_24">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <b>pragma</b> Import (C, Dupwin, "dupwin");
+
+      <span class="symbol"><a name="ref_325_7">W</a></span> : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__adb.htm#ref_322_16">Dupwin</a> (<a href="terminal_interface-curses__ads.htm#ref_785_24">Win</a>);
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_325_7">W</a> = <a href="terminal_interface-curses__ads.htm#ref_57_4">Null_Window</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+      <b>return</b> <a href="terminal_interface-curses__adb.htm#ref_325_7">W</a>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_785_13">Duplicate</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_333_14" href="terminal_interface-curses__ads.htm#ref_790_14">Move_Window</a></span> (<span class="symbol"><a name="ref_333_27" href="terminal_interface-curses__ads.htm#ref_790_27">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+                          <span class="symbol"><a name="ref_334_27" href="terminal_interface-curses__ads.htm#ref_791_27">Line</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+                          <span class="symbol"><a name="ref_335_27" href="terminal_interface-curses__ads.htm#ref_792_27">Column</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_337_16">Mvwin</a></span> (<span class="symbol"><a name="ref_337_23">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+                      <span class="symbol"><a name="ref_338_23">Line</a></span>   : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+                      <span class="symbol"><a name="ref_339_23">Column</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Mvwin, "mvwin");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_337_16">Mvwin</a> (<a href="terminal_interface-curses__ads.htm#ref_790_27">Win</a>, <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_791_27">Line</a>), <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_792_27">Column</a>)) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_790_14">Move_Window</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_347_14" href="terminal_interface-curses__ads.htm#ref_797_14">Move_Derived_Window</a></span> (<span class="symbol"><a name="ref_347_35" href="terminal_interface-curses__ads.htm#ref_797_35">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+                                  <span class="symbol"><a name="ref_348_35" href="terminal_interface-curses__ads.htm#ref_798_35">Line</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+                                  <span class="symbol"><a name="ref_349_35" href="terminal_interface-curses__ads.htm#ref_799_35">Column</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_351_16">Mvderwin</a></span> (<span class="symbol"><a name="ref_351_26">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+                         <span class="symbol"><a name="ref_352_26">Line</a></span>   : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+                         <span class="symbol"><a name="ref_353_26">Column</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Mvderwin, "mvderwin");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_351_16">Mvderwin</a> (<a href="terminal_interface-curses__ads.htm#ref_797_35">Win</a>, <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_798_35">Line</a>), <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_799_35">Column</a>)) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_797_14">Move_Derived_Window</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_361_14" href="terminal_interface-curses__ads.htm#ref_814_14">Set_Synch_Mode</a></span> (<span class="symbol"><a name="ref_361_30" href="terminal_interface-curses__ads.htm#ref_814_30">Win</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>  := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                             <span class="symbol"><a name="ref_362_30" href="terminal_interface-curses__ads.htm#ref_815_30">Mode</a></span> : Boolean := False)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_364_16">Syncok</a></span> (<span class="symbol"><a name="ref_364_24">Win</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+                       <span class="symbol"><a name="ref_365_24">Mode</a></span> : <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Syncok, "syncok");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_364_16">Syncok</a> (<a href="terminal_interface-curses__ads.htm#ref_814_30">Win</a>, <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a> (Boolean'Pos (<a href="terminal_interface-curses__ads.htm#ref_815_30">Mode</a>))) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_814_14">Set_Synch_Mode</a>;
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_373_14" href="terminal_interface-curses__ads.htm#ref_824_14">Add</a></span> (<span class="symbol"><a name="ref_373_19" href="terminal_interface-curses__ads.htm#ref_824_19">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                  <span class="symbol"><a name="ref_374_19" href="terminal_interface-curses__ads.htm#ref_825_19">Str</a></span> : String;
+                  <span class="symbol"><a name="ref_375_19" href="terminal_interface-curses__ads.htm#ref_826_19">Len</a></span> : Integer := -1)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_377_16">Waddnstr</a></span> (<span class="symbol"><a name="ref_377_26">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+                         <span class="symbol"><a name="ref_378_26">Str</a></span> : char_array;
+                         <span class="symbol"><a name="ref_379_26">Len</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> := -1) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Waddnstr, "waddnstr");
+
+      <span class="symbol"><a name="ref_382_7">Txt</a></span>    : char_array (0 .. <a href="terminal_interface-curses__ads.htm#ref_825_19">Str</a>'Length);
+      <span class="symbol"><a name="ref_383_7">Length</a></span> : size_t;
+   <b>begin</b>
+      To_C (<a href="terminal_interface-curses__ads.htm#ref_825_19">Str</a>, <a href="terminal_interface-curses__adb.htm#ref_382_7">Txt</a>, <a href="terminal_interface-curses__adb.htm#ref_383_7">Length</a>);
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_377_16">Waddnstr</a> (<a href="terminal_interface-curses__ads.htm#ref_824_19">Win</a>, <a href="terminal_interface-curses__adb.htm#ref_382_7">Txt</a>, <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_826_19">Len</a>)) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_824_14">Add</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_391_14" href="terminal_interface-curses__ads.htm#ref_833_14">Add</a></span>
+     (<span class="symbol"><a name="ref_392_7" href="terminal_interface-curses__ads.htm#ref_833_19">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_393_7" href="terminal_interface-curses__ads.htm#ref_834_19">Line</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_394_7" href="terminal_interface-curses__ads.htm#ref_835_19">Column</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+      <span class="symbol"><a name="ref_395_7" href="terminal_interface-curses__ads.htm#ref_836_19">Str</a></span>    : String;
+      <span class="symbol"><a name="ref_396_7" href="terminal_interface-curses__ads.htm#ref_837_19">Len</a></span>    : Integer := -1)
+   <b>is</b>
+   <b>begin</b>
+      <a href="terminal_interface-curses__ads.htm#ref_682_14">Move_Cursor</a> (<a href="terminal_interface-curses__ads.htm#ref_833_19">Win</a>, <a href="terminal_interface-curses__ads.htm#ref_834_19">Line</a>, <a href="terminal_interface-curses__ads.htm#ref_835_19">Column</a>);
+      <a href="terminal_interface-curses__ads.htm#ref_824_14">Add</a> (<a href="terminal_interface-curses__ads.htm#ref_833_19">Win</a>, <a href="terminal_interface-curses__ads.htm#ref_836_19">Str</a>, <a href="terminal_interface-curses__ads.htm#ref_837_19">Len</a>);
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_833_14">Add</a>;
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_403_14" href="terminal_interface-curses__ads.htm#ref_848_14">Add</a></span>
+     (<span class="symbol"><a name="ref_404_7" href="terminal_interface-curses__ads.htm#ref_848_19">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_405_7" href="terminal_interface-curses__ads.htm#ref_849_19">Str</a></span> : <a href="terminal_interface-curses__ads.htm#ref_510_4">Attributed_String</a>;
+      <span class="symbol"><a name="ref_406_7" href="terminal_interface-curses__ads.htm#ref_850_19">Len</a></span> : Integer := -1)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_408_16">Waddchnstr</a></span> (<span class="symbol"><a name="ref_408_28">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+                           <span class="symbol"><a name="ref_409_28">Str</a></span> : chtype_array;
+                           <span class="symbol"><a name="ref_410_28">Len</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> := -1) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Waddchnstr, "waddchnstr");
+
+      <span class="symbol"><a name="ref_413_7">Txt</a></span> : chtype_array (0 .. <a href="terminal_interface-curses__ads.htm#ref_849_19">Str</a>'Length);
+   <b>begin</b>
+      <b>for</b> <span class="symbol"><a name="ref_415_11">Length</a></span> <b>in</b> 1 .. size_t (<a href="terminal_interface-curses__ads.htm#ref_849_19">Str</a>'Length) <b>loop</b>
+         <a href="terminal_interface-curses__adb.htm#ref_413_7">Txt</a> (<a href="terminal_interface-curses__adb.htm#ref_415_11">Length</a> - 1) := <a href="terminal_interface-curses__ads.htm#ref_849_19">Str</a> (Natural (<a href="terminal_interface-curses__adb.htm#ref_415_11">Length</a>));
+      <b>end</b> <b>loop</b>;
+      <a href="terminal_interface-curses__adb.htm#ref_413_7">Txt</a> (<a href="terminal_interface-curses__ads.htm#ref_849_19">Str</a>'Length) := <a href="terminal_interface-curses__ads.htm#ref_510_4">Default_Character</a>;
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_408_16">Waddchnstr</a> (<a href="terminal_interface-curses__ads.htm#ref_848_19">Win</a>,
+                     <a href="terminal_interface-curses__adb.htm#ref_413_7">Txt</a>,
+                     <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_850_19">Len</a>)) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a>
+      <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_848_14">Add</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_427_14" href="terminal_interface-curses__ads.htm#ref_857_14">Add</a></span>
+     (<span class="symbol"><a name="ref_428_7" href="terminal_interface-curses__ads.htm#ref_857_19">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_429_7" href="terminal_interface-curses__ads.htm#ref_858_19">Line</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_430_7" href="terminal_interface-curses__ads.htm#ref_859_19">Column</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+      <span class="symbol"><a name="ref_431_7" href="terminal_interface-curses__ads.htm#ref_860_19">Str</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_510_4">Attributed_String</a>;
+      <span class="symbol"><a name="ref_432_7" href="terminal_interface-curses__ads.htm#ref_861_19">Len</a></span>    : Integer := -1)
+   <b>is</b>
+   <b>begin</b>
+      <a href="terminal_interface-curses__ads.htm#ref_682_14">Move_Cursor</a> (<a href="terminal_interface-curses__ads.htm#ref_857_19">Win</a>, <a href="terminal_interface-curses__ads.htm#ref_858_19">Line</a>, <a href="terminal_interface-curses__ads.htm#ref_859_19">Column</a>);
+      <a href="terminal_interface-curses__ads.htm#ref_848_14">Add</a> (<a href="terminal_interface-curses__ads.htm#ref_857_19">Win</a>, <a href="terminal_interface-curses__ads.htm#ref_860_19">Str</a>, <a href="terminal_interface-curses__ads.htm#ref_861_19">Len</a>);
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_857_14">Add</a>;
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_439_14" href="terminal_interface-curses__ads.htm#ref_875_14">Border</a></span>
+     (<span class="symbol"><a name="ref_440_7" href="terminal_interface-curses__ads.htm#ref_876_7">Win</a></span>                       : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_441_7" href="terminal_interface-curses__ads.htm#ref_877_7">Left_Side_Symbol</a></span>          : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a> := <a href="terminal_interface-curses__ads.htm#ref_510_4">Default_Character</a>;
+      <span class="symbol"><a name="ref_442_7" href="terminal_interface-curses__ads.htm#ref_878_7">Right_Side_Symbol</a></span>         : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a> := <a href="terminal_interface-curses__ads.htm#ref_510_4">Default_Character</a>;
+      <span class="symbol"><a name="ref_443_7" href="terminal_interface-curses__ads.htm#ref_879_7">Top_Side_Symbol</a></span>           : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a> := <a href="terminal_interface-curses__ads.htm#ref_510_4">Default_Character</a>;
+      <span class="symbol"><a name="ref_444_7" href="terminal_interface-curses__ads.htm#ref_880_7">Bottom_Side_Symbol</a></span>        : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a> := <a href="terminal_interface-curses__ads.htm#ref_510_4">Default_Character</a>;
+      <span class="symbol"><a name="ref_445_7" href="terminal_interface-curses__ads.htm#ref_881_7">Upper_Left_Corner_Symbol</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a> := <a href="terminal_interface-curses__ads.htm#ref_510_4">Default_Character</a>;
+      <span class="symbol"><a name="ref_446_7" href="terminal_interface-curses__ads.htm#ref_882_7">Upper_Right_Corner_Symbol</a></span> : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a> := <a href="terminal_interface-curses__ads.htm#ref_510_4">Default_Character</a>;
+      <span class="symbol"><a name="ref_447_7" href="terminal_interface-curses__ads.htm#ref_883_7">Lower_Left_Corner_Symbol</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a> := <a href="terminal_interface-curses__ads.htm#ref_510_4">Default_Character</a>;
+      <span class="symbol"><a name="ref_448_7" href="terminal_interface-curses__ads.htm#ref_884_7">Lower_Right_Corner_Symbol</a></span> : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a> := <a href="terminal_interface-curses__ads.htm#ref_510_4">Default_Character</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_450_16">Wborder</a></span> (<span class="symbol"><a name="ref_450_25">W</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+                        <span class="symbol"><a name="ref_451_25">LS</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>;
+                        <span class="symbol"><a name="ref_452_25">RS</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>;
+                        <span class="symbol"><a name="ref_453_25">TS</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>;
+                        <span class="symbol"><a name="ref_454_25">BS</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>;
+                        <span class="symbol"><a name="ref_455_25">ULC</a></span> : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>;
+                        <span class="symbol"><a name="ref_456_25">URC</a></span> : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>;
+                        <span class="symbol"><a name="ref_457_25">LLC</a></span> : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>;
+                        <span class="symbol"><a name="ref_458_25">LRC</a></span> : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Wborder, "wborder");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_450_16">Wborder</a> (<a href="terminal_interface-curses__ads.htm#ref_876_7">Win</a>,
+                  <a href="terminal_interface-curses__ads.htm#ref_877_7">Left_Side_Symbol</a>,
+                  <a href="terminal_interface-curses__ads.htm#ref_878_7">Right_Side_Symbol</a>,
+                  <a href="terminal_interface-curses__ads.htm#ref_879_7">Top_Side_Symbol</a>,
+                  <a href="terminal_interface-curses__ads.htm#ref_880_7">Bottom_Side_Symbol</a>,
+                  <a href="terminal_interface-curses__ads.htm#ref_881_7">Upper_Left_Corner_Symbol</a>,
+                  <a href="terminal_interface-curses__ads.htm#ref_882_7">Upper_Right_Corner_Symbol</a>,
+                  <a href="terminal_interface-curses__ads.htm#ref_883_7">Lower_Left_Corner_Symbol</a>,
+                  <a href="terminal_interface-curses__ads.htm#ref_884_7">Lower_Right_Corner_Symbol</a>) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a>
+      <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_875_14">Border</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_475_14" href="terminal_interface-curses__ads.htm#ref_891_14">Box</a></span>
+     (<span class="symbol"><a name="ref_476_7" href="terminal_interface-curses__ads.htm#ref_892_7">Win</a></span>               : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_477_7" href="terminal_interface-curses__ads.htm#ref_893_7">Vertical_Symbol</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a> := <a href="terminal_interface-curses__ads.htm#ref_510_4">Default_Character</a>;
+      <span class="symbol"><a name="ref_478_7" href="terminal_interface-curses__ads.htm#ref_894_7">Horizontal_Symbol</a></span> : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a> := <a href="terminal_interface-curses__ads.htm#ref_510_4">Default_Character</a>)
+   <b>is</b>
+   <b>begin</b>
+      <a href="terminal_interface-curses__ads.htm#ref_875_14">Border</a> (<a href="terminal_interface-curses__ads.htm#ref_892_7">Win</a>,
+              <a href="terminal_interface-curses__ads.htm#ref_893_7">Vertical_Symbol</a>, <a href="terminal_interface-curses__ads.htm#ref_893_7">Vertical_Symbol</a>,
+              <a href="terminal_interface-curses__ads.htm#ref_894_7">Horizontal_Symbol</a>, <a href="terminal_interface-curses__ads.htm#ref_894_7">Horizontal_Symbol</a>);
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_891_14">Box</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_486_14" href="terminal_interface-curses__ads.htm#ref_899_14">Horizontal_Line</a></span>
+     (<span class="symbol"><a name="ref_487_7" href="terminal_interface-curses__ads.htm#ref_900_7">Win</a></span>         : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_488_7" href="terminal_interface-curses__ads.htm#ref_901_7">Line_Size</a></span>   : Natural;
+      <span class="symbol"><a name="ref_489_7" href="terminal_interface-curses__ads.htm#ref_902_7">Line_Symbol</a></span> : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a> := <a href="terminal_interface-curses__ads.htm#ref_510_4">Default_Character</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_491_16">Whline</a></span> (<span class="symbol"><a name="ref_491_24">W</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+                       <span class="symbol"><a name="ref_492_24">Ch</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>;
+                       <span class="symbol"><a name="ref_493_24">Len</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Whline, "whline");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_491_16">Whline</a> (<a href="terminal_interface-curses__ads.htm#ref_900_7">Win</a>,
+                 <a href="terminal_interface-curses__ads.htm#ref_902_7">Line_Symbol</a>,
+                 <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_901_7">Line_Size</a>)) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a>
+      <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_899_14">Horizontal_Line</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_504_14" href="terminal_interface-curses__ads.htm#ref_908_14">Vertical_Line</a></span>
+     (<span class="symbol"><a name="ref_505_7" href="terminal_interface-curses__ads.htm#ref_909_7">Win</a></span>         : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_506_7" href="terminal_interface-curses__ads.htm#ref_910_7">Line_Size</a></span>   : Natural;
+      <span class="symbol"><a name="ref_507_7" href="terminal_interface-curses__ads.htm#ref_911_7">Line_Symbol</a></span> : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a> := <a href="terminal_interface-curses__ads.htm#ref_510_4">Default_Character</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_509_16">Wvline</a></span> (<span class="symbol"><a name="ref_509_24">W</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+                       <span class="symbol"><a name="ref_510_24">Ch</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>;
+                       <span class="symbol"><a name="ref_511_24">Len</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Wvline, "wvline");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_509_16">Wvline</a> (<a href="terminal_interface-curses__ads.htm#ref_909_7">Win</a>,
+                 <a href="terminal_interface-curses__ads.htm#ref_911_7">Line_Symbol</a>,
+                 <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_910_7">Line_Size</a>)) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a>
+      <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_908_14">Vertical_Line</a>;
+
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_523_13" href="terminal_interface-curses__ads.htm#ref_922_13">Get_Keystroke</a></span> (<span class="symbol"><a name="ref_523_28" href="terminal_interface-curses__ads.htm#ref_922_28">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>)
+     <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_72_12">Real_Key_Code</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_526_16">Wgetch</a></span> (<span class="symbol"><a name="ref_526_24">W</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Wgetch, "wgetch");
+
+      <span class="symbol"><a name="ref_529_7">C</a></span> : <b>constant</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> := <a href="terminal_interface-curses__adb.htm#ref_526_16">Wgetch</a> (<a href="terminal_interface-curses__ads.htm#ref_922_28">Win</a>);
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_529_7">C</a> = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_89_4">Key_None</a>;
+      <b>else</b>
+         <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_72_12">Real_Key_Code</a> (<a href="terminal_interface-curses__adb.htm#ref_529_7">C</a>);
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_922_13">Get_Keystroke</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_538_14" href="terminal_interface-curses__ads.htm#ref_933_14">Undo_Keystroke</a></span> (<span class="symbol"><a name="ref_538_30" href="terminal_interface-curses__ads.htm#ref_933_30">Key</a></span> : <a href="terminal_interface-curses__ads.htm#ref_72_12">Real_Key_Code</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_540_16">Ungetch</a></span> (<span class="symbol"><a name="ref_540_25">Ch</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Ungetch, "ungetch");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_540_16">Ungetch</a> (<a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_933_30">Key</a>)) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_933_14">Undo_Keystroke</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_548_13" href="terminal_interface-curses__ads.htm#ref_938_13">Has_Key</a></span> (<span class="symbol"><a name="ref_548_22" href="terminal_interface-curses__ads.htm#ref_938_22">Key</a></span> : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>) <b>return</b> Boolean
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_550_16">Haskey</a></span> (<span class="symbol"><a name="ref_550_24">Key</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Haskey, "has_key");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_550_16">Haskey</a> (<a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_938_22">Key</a>)) = <a href="terminal_interface-curses-aux__ads.htm#ref_67_4">Curses_False</a> <b>then</b>
+         <b>return</b> False;
+      <b>else</b>
+         <b>return</b> True;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_938_13">Has_Key</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_560_13" href="terminal_interface-curses__ads.htm#ref_945_13">Is_Function_Key</a></span> (<span class="symbol"><a name="ref_560_30" href="terminal_interface-curses__ads.htm#ref_945_30">Key</a></span> : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>) <b>return</b> Boolean
+   <b>is</b>
+      <span class="symbol"><a name="ref_562_7">L</a></span> : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>  := <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> (Natural (<a href="terminal_interface-curses__ads.htm#ref_111_4">Key_F0</a>) +
+        Natural (<a href="terminal_interface-curses__ads.htm#ref_949_12">Function_Key_Number</a>'Last));
+   <b>begin</b>
+      <b>if</b> (<a href="terminal_interface-curses__ads.htm#ref_945_30">Key</a> &gt;= <a href="terminal_interface-curses__ads.htm#ref_111_4">Key_F0</a>) <b>and</b> <b>then</b> (<a href="terminal_interface-curses__ads.htm#ref_945_30">Key</a> &lt;= <a href="terminal_interface-curses__adb.htm#ref_562_7">L</a>) <b>then</b>
+         <b>return</b> True;
+      <b>else</b>
+         <b>return</b> False;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_945_13">Is_Function_Key</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_572_13" href="terminal_interface-curses__ads.htm#ref_952_13">Function_Key</a></span> (<span class="symbol"><a name="ref_572_27" href="terminal_interface-curses__ads.htm#ref_952_27">Key</a></span> : <a href="terminal_interface-curses__ads.htm#ref_72_12">Real_Key_Code</a>)
+                          <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_949_12">Function_Key_Number</a>
+   <b>is</b>
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__ads.htm#ref_945_13">Is_Function_Key</a> (<a href="terminal_interface-curses__ads.htm#ref_952_27">Key</a>) <b>then</b>
+         <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_949_12">Function_Key_Number</a> (<a href="terminal_interface-curses__ads.htm#ref_952_27">Key</a> - <a href="terminal_interface-curses__ads.htm#ref_111_4">Key_F0</a>);
+      <b>else</b>
+         <b>raise</b> Constraint_Error;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_952_13">Function_Key</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_583_13" href="terminal_interface-curses__ads.htm#ref_957_13">Function_Key_Code</a></span> (<span class="symbol"><a name="ref_583_32" href="terminal_interface-curses__ads.htm#ref_957_32">Key</a></span> : <a href="terminal_interface-curses__ads.htm#ref_949_12">Function_Key_Number</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_72_12">Real_Key_Code</a>
+   <b>is</b>
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_72_12">Real_Key_Code</a> (Natural (<a href="terminal_interface-curses__ads.htm#ref_111_4">Key_F0</a>) + Natural (<a href="terminal_interface-curses__ads.htm#ref_957_32">Key</a>));
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_957_13">Function_Key_Code</a>;
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_589_14" href="terminal_interface-curses__ads.htm#ref_971_14">Standout</a></span> (<span class="symbol"><a name="ref_589_24" href="terminal_interface-curses__ads.htm#ref_971_24">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>  := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                       <span class="symbol"><a name="ref_590_24" href="terminal_interface-curses__ads.htm#ref_972_24">On</a></span>  : Boolean := True)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_592_16">wstandout</a></span> (<span class="symbol"><a name="ref_592_27">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, wstandout, "wstandout");
+      <b>function</b> <span class="symbol"><a name="ref_594_16">wstandend</a></span> (<span class="symbol"><a name="ref_594_27">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, wstandend, "wstandend");
+
+      <span class="symbol"><a name="ref_597_7">Err</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__ads.htm#ref_972_24">On</a> <b>then</b>
+         <a href="terminal_interface-curses__adb.htm#ref_597_7">Err</a> := <a href="terminal_interface-curses__adb.htm#ref_592_16">wstandout</a> (<a href="terminal_interface-curses__ads.htm#ref_971_24">Win</a>);
+      <b>else</b>
+         <a href="terminal_interface-curses__adb.htm#ref_597_7">Err</a> := <a href="terminal_interface-curses__adb.htm#ref_594_16">wstandend</a> (<a href="terminal_interface-curses__ads.htm#ref_971_24">Win</a>);
+      <b>end</b> <b>if</b>;
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_597_7">Err</a> = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_971_14">Standout</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_609_14" href="terminal_interface-curses__ads.htm#ref_977_14">Switch_Character_Attribute</a></span>
+     (<span class="symbol"><a name="ref_610_7" href="terminal_interface-curses__ads.htm#ref_978_7">Win</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_611_7" href="terminal_interface-curses__ads.htm#ref_979_7">Attr</a></span> : <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a> := <a href="terminal_interface-curses__ads.htm#ref_486_4">Normal_Video</a>;
+      <span class="symbol"><a name="ref_612_7" href="terminal_interface-curses__ads.htm#ref_980_7">On</a></span>   : Boolean := True)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_614_16">Wattron</a></span> (<span class="symbol"><a name="ref_614_25">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+                        <span class="symbol"><a name="ref_615_25">C_Attr</a></span> : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Wattron, "wattr_on");
+      <b>function</b> <span class="symbol"><a name="ref_617_16">Wattroff</a></span> (<span class="symbol"><a name="ref_617_26">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+                         <span class="symbol"><a name="ref_618_26">C_Attr</a></span> : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Wattroff, "wattr_off");
+      <span class="comment"><em>--  In Ada we use the On Boolean to control whether or not we want to</em></span>
+      <span class="comment"><em>--  switch on or off the attributes in the set.</em></span>
+      <span class="symbol"><a name="ref_622_7">Err</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <span class="symbol"><a name="ref_623_7">AC</a></span>  : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a> := (<a href="terminal_interface-curses__ads.htm#ref_492_10">Ch</a>    =&gt; Character'First,
+                                              <a href="terminal_interface-curses__ads.htm#ref_491_10">Color</a> =&gt; <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>'First,
+                                              <a href="terminal_interface-curses__ads.htm#ref_490_10">Attr</a>  =&gt; <a href="terminal_interface-curses__ads.htm#ref_979_7">Attr</a>);
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__ads.htm#ref_980_7">On</a> <b>then</b>
+         <a href="terminal_interface-curses__adb.htm#ref_622_7">Err</a> := <a href="terminal_interface-curses__adb.htm#ref_614_16">Wattron</a>  (<a href="terminal_interface-curses__ads.htm#ref_978_7">Win</a>, <a href="terminal_interface-curses__adb.htm#ref_623_7">AC</a>);
+      <b>else</b>
+         <a href="terminal_interface-curses__adb.htm#ref_622_7">Err</a> := <a href="terminal_interface-curses__adb.htm#ref_617_16">Wattroff</a> (<a href="terminal_interface-curses__ads.htm#ref_978_7">Win</a>, <a href="terminal_interface-curses__adb.htm#ref_623_7">AC</a>);
+      <b>end</b> <b>if</b>;
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_622_7">Err</a> = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_977_14">Switch_Character_Attribute</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_637_14" href="terminal_interface-curses__ads.htm#ref_988_14">Set_Character_Attributes</a></span>
+     (<span class="symbol"><a name="ref_638_7" href="terminal_interface-curses__ads.htm#ref_989_7">Win</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_639_7" href="terminal_interface-curses__ads.htm#ref_990_7">Attr</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a> := <a href="terminal_interface-curses__ads.htm#ref_486_4">Normal_Video</a>;
+      <span class="symbol"><a name="ref_640_7" href="terminal_interface-curses__ads.htm#ref_991_7">Color</a></span> : <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a> := <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>'First)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_642_16">Wattrset</a></span> (<span class="symbol"><a name="ref_642_26">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+                         <span class="symbol"><a name="ref_643_26">C_Attr</a></span> : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Wattrset, "wattrset"); <span class="comment"><em>-- ??? wattr_set</em></span>
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_642_16">Wattrset</a> (<a href="terminal_interface-curses__ads.htm#ref_989_7">Win</a>, (<a href="terminal_interface-curses__ads.htm#ref_492_10">Ch</a> =&gt; Character'First,
+                         <a href="terminal_interface-curses__ads.htm#ref_491_10">Color</a> =&gt; <a href="terminal_interface-curses__ads.htm#ref_991_7">Color</a>,
+                         <a href="terminal_interface-curses__ads.htm#ref_490_10">Attr</a> =&gt; <a href="terminal_interface-curses__ads.htm#ref_990_7">Attr</a>)) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a>
+      <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_988_14">Set_Character_Attributes</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_654_13" href="terminal_interface-curses__ads.htm#ref_997_13">Get_Character_Attribute</a></span> (<span class="symbol"><a name="ref_654_38" href="terminal_interface-curses__ads.htm#ref_998_7">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>)
+                                     <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_657_16">Wattrget</a></span> (<span class="symbol"><a name="ref_657_26">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+                         <span class="symbol"><a name="ref_658_26">Atr</a></span> : <b>access</b> <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>;
+                         <span class="symbol"><a name="ref_659_26">Col</a></span> : <b>access</b> <a href="terminal_interface-curses-aux__ads.htm#ref_50_12">C_Short</a>;
+                         <span class="symbol"><a name="ref_660_26">Opt</a></span> : System.Address) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Wattrget, "wattr_get");
+
+      <span class="symbol"><a name="ref_663_7">Attr</a></span> : <b>aliased</b> <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>;
+      <span class="symbol"><a name="ref_664_7">Col</a></span>  : <b>aliased</b> <a href="terminal_interface-curses-aux__ads.htm#ref_50_12">C_Short</a>;
+      <span class="symbol"><a name="ref_665_7">Res</a></span>  : <b>constant</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> := <a href="terminal_interface-curses__adb.htm#ref_657_16">Wattrget</a> (<a href="terminal_interface-curses__ads.htm#ref_998_7">Win</a>, <a href="terminal_interface-curses__adb.htm#ref_663_7">Attr</a>'<b>Access</b>, <a href="terminal_interface-curses__adb.htm#ref_664_7">Col</a>'<b>Access</b>,
+                                         System.Null_Address);
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_665_7">Res</a> = <a href="terminal_interface-curses-aux__ads.htm#ref_63_4">Curses_Ok</a> <b>then</b>
+         <b>return</b> <a href="terminal_interface-curses__adb.htm#ref_663_7">Attr</a>.<a href="terminal_interface-curses__ads.htm#ref_490_10">Attr</a>;
+      <b>else</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_997_13">Get_Character_Attribute</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_675_13" href="terminal_interface-curses__ads.htm#ref_1003_13">Get_Character_Attribute</a></span> (<span class="symbol"><a name="ref_675_38" href="terminal_interface-curses__ads.htm#ref_1004_7">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>)
+                                     <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_678_16">Wattrget</a></span> (<span class="symbol"><a name="ref_678_26">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+                         <span class="symbol"><a name="ref_679_26">Atr</a></span> : <b>access</b> <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>;
+                         <span class="symbol"><a name="ref_680_26">Col</a></span> : <b>access</b> <a href="terminal_interface-curses-aux__ads.htm#ref_50_12">C_Short</a>;
+                         <span class="symbol"><a name="ref_681_26">Opt</a></span> : System.Address) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Wattrget, "wattr_get");
+
+      <span class="symbol"><a name="ref_684_7">Attr</a></span> : <b>aliased</b> <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>;
+      <span class="symbol"><a name="ref_685_7">Col</a></span>  : <b>aliased</b> <a href="terminal_interface-curses-aux__ads.htm#ref_50_12">C_Short</a>;
+      <span class="symbol"><a name="ref_686_7">Res</a></span>  : <b>constant</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> := <a href="terminal_interface-curses__adb.htm#ref_678_16">Wattrget</a> (<a href="terminal_interface-curses__ads.htm#ref_1004_7">Win</a>, <a href="terminal_interface-curses__adb.htm#ref_684_7">Attr</a>'<b>Access</b>, <a href="terminal_interface-curses__adb.htm#ref_685_7">Col</a>'<b>Access</b>,
+                                         System.Null_Address);
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_686_7">Res</a> = <a href="terminal_interface-curses-aux__ads.htm#ref_63_4">Curses_Ok</a> <b>then</b>
+         <b>return</b> <a href="terminal_interface-curses__adb.htm#ref_684_7">Attr</a>.<a href="terminal_interface-curses__ads.htm#ref_491_10">Color</a>;
+      <b>else</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1003_13">Get_Character_Attribute</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_696_14" href="terminal_interface-curses__ads.htm#ref_1009_14">Set_Color</a></span> (<span class="symbol"><a name="ref_696_25" href="terminal_interface-curses__ads.htm#ref_1009_25">Win</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                        <span class="symbol"><a name="ref_697_25" href="terminal_interface-curses__ads.htm#ref_1010_25">Pair</a></span> : <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_699_16">Wset_Color</a></span> (<span class="symbol"><a name="ref_699_28">Win</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+                           <span class="symbol"><a name="ref_700_28">Color</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_50_12">C_Short</a>;
+                           <span class="symbol"><a name="ref_701_28">Opts</a></span>  : <a href="terminal_interface-curses-aux__ads.htm#ref_56_12">C_Void_Ptr</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Wset_Color, "wcolor_set");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_699_16">Wset_Color</a> (<a href="terminal_interface-curses__ads.htm#ref_1009_25">Win</a>,
+                     <a href="terminal_interface-curses-aux__ads.htm#ref_50_12">C_Short</a> (<a href="terminal_interface-curses__ads.htm#ref_1010_25">Pair</a>),
+                     <a href="terminal_interface-curses-aux__ads.htm#ref_56_12">C_Void_Ptr</a> (System.Null_Address)) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a>
+      <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1009_14">Set_Color</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_712_14" href="terminal_interface-curses__ads.htm#ref_1016_14">Change_Attributes</a></span>
+     (<span class="symbol"><a name="ref_713_7" href="terminal_interface-curses__ads.htm#ref_1017_7">Win</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_714_7" href="terminal_interface-curses__ads.htm#ref_1018_7">Count</a></span> : Integer := -1;
+      <span class="symbol"><a name="ref_715_7" href="terminal_interface-curses__ads.htm#ref_1019_7">Attr</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a> := <a href="terminal_interface-curses__ads.htm#ref_486_4">Normal_Video</a>;
+      <span class="symbol"><a name="ref_716_7" href="terminal_interface-curses__ads.htm#ref_1020_7">Color</a></span> : <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a> := <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>'First)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_718_16">Wchgat</a></span> (<span class="symbol"><a name="ref_718_24">Win</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+                       <span class="symbol"><a name="ref_719_24">Cnt</a></span>   : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+                       <span class="symbol"><a name="ref_720_24">Attr</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>;
+                       <span class="symbol"><a name="ref_721_24">Color</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_50_12">C_Short</a>;
+                       <span class="symbol"><a name="ref_722_24">Opts</a></span>  : System.Address := System.Null_Address)
+                       <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Wchgat, "wchgat");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_718_16">Wchgat</a> (<a href="terminal_interface-curses__ads.htm#ref_1017_7">Win</a>,
+                 <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1018_7">Count</a>),
+                 (<a href="terminal_interface-curses__ads.htm#ref_492_10">Ch</a> =&gt; Character'First,
+                  <a href="terminal_interface-curses__ads.htm#ref_491_10">Color</a> =&gt; <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>'First,
+                  <a href="terminal_interface-curses__ads.htm#ref_490_10">Attr</a> =&gt; <a href="terminal_interface-curses__ads.htm#ref_1019_7">Attr</a>),
+                 <a href="terminal_interface-curses-aux__ads.htm#ref_50_12">C_Short</a> (<a href="terminal_interface-curses__ads.htm#ref_1020_7">Color</a>)) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a>
+      <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1016_14">Change_Attributes</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_737_14" href="terminal_interface-curses__ads.htm#ref_1025_14">Change_Attributes</a></span>
+     (<span class="symbol"><a name="ref_738_7" href="terminal_interface-curses__ads.htm#ref_1026_7">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_739_7" href="terminal_interface-curses__ads.htm#ref_1027_7">Line</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a> := <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>'First;
+      <span class="symbol"><a name="ref_740_7" href="terminal_interface-curses__ads.htm#ref_1028_7">Column</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a> := <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>'First;
+      <span class="symbol"><a name="ref_741_7" href="terminal_interface-curses__ads.htm#ref_1029_7">Count</a></span>  : Integer := -1;
+      <span class="symbol"><a name="ref_742_7" href="terminal_interface-curses__ads.htm#ref_1030_7">Attr</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a> := <a href="terminal_interface-curses__ads.htm#ref_486_4">Normal_Video</a>;
+      <span class="symbol"><a name="ref_743_7" href="terminal_interface-curses__ads.htm#ref_1031_7">Color</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a> := <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>'First)
+   <b>is</b>
+   <b>begin</b>
+      <a href="terminal_interface-curses__ads.htm#ref_682_14">Move_Cursor</a> (<a href="terminal_interface-curses__ads.htm#ref_1026_7">Win</a>, <a href="terminal_interface-curses__ads.htm#ref_1027_7">Line</a>, <a href="terminal_interface-curses__ads.htm#ref_1028_7">Column</a>);
+      <a href="terminal_interface-curses__ads.htm#ref_1016_14">Change_Attributes</a> (<a href="terminal_interface-curses__ads.htm#ref_1026_7">Win</a>, <a href="terminal_interface-curses__ads.htm#ref_1029_7">Count</a>, <a href="terminal_interface-curses__ads.htm#ref_1030_7">Attr</a>, <a href="terminal_interface-curses__ads.htm#ref_1031_7">Color</a>);
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1025_14">Change_Attributes</a>;
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_750_14" href="terminal_interface-curses__ads.htm#ref_1041_14">Beep</a></span>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_752_16">Beeper</a></span> <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Beeper, "beep");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_752_16">Beeper</a> = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1041_14">Beep</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_760_14" href="terminal_interface-curses__ads.htm#ref_1046_14">Flash_Screen</a></span>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_762_16">Flash</a></span> <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Flash, "flash");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_762_16">Flash</a> = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1046_14">Flash_Screen</a>;
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_770_14" href="terminal_interface-curses__ads.htm#ref_1057_14">Set_Cbreak_Mode</a></span> (<span class="symbol"><a name="ref_770_31" href="terminal_interface-curses__ads.htm#ref_1057_31">SwitchOn</a></span> : Boolean := True)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_772_16">Cbreak</a></span> <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Cbreak, "cbreak");
+      <b>function</b> <span class="symbol"><a name="ref_774_16">NoCbreak</a></span> <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, NoCbreak, "nocbreak");
+
+      <span class="symbol"><a name="ref_777_7">Err</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__ads.htm#ref_1057_31">SwitchOn</a> <b>then</b>
+         <a href="terminal_interface-curses__adb.htm#ref_777_7">Err</a> := <a href="terminal_interface-curses__adb.htm#ref_772_16">Cbreak</a>;
+      <b>else</b>
+         <a href="terminal_interface-curses__adb.htm#ref_777_7">Err</a> := <a href="terminal_interface-curses__adb.htm#ref_774_16">NoCbreak</a>;
+      <b>end</b> <b>if</b>;
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_777_7">Err</a> = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1057_14">Set_Cbreak_Mode</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_789_14" href="terminal_interface-curses__ads.htm#ref_1063_14">Set_Raw_Mode</a></span> (<span class="symbol"><a name="ref_789_28" href="terminal_interface-curses__ads.htm#ref_1063_28">SwitchOn</a></span> : Boolean := True)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_791_16">Raw</a></span> <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Raw, "raw");
+      <b>function</b> <span class="symbol"><a name="ref_793_16">NoRaw</a></span> <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, NoRaw, "noraw");
+
+      <span class="symbol"><a name="ref_796_7">Err</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__ads.htm#ref_1063_28">SwitchOn</a> <b>then</b>
+         <a href="terminal_interface-curses__adb.htm#ref_796_7">Err</a> := <a href="terminal_interface-curses__adb.htm#ref_791_16">Raw</a>;
+      <b>else</b>
+         <a href="terminal_interface-curses__adb.htm#ref_796_7">Err</a> := <a href="terminal_interface-curses__adb.htm#ref_793_16">NoRaw</a>;
+      <b>end</b> <b>if</b>;
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_796_7">Err</a> = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1063_14">Set_Raw_Mode</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_808_14" href="terminal_interface-curses__ads.htm#ref_1069_14">Set_Echo_Mode</a></span> (<span class="symbol"><a name="ref_808_29" href="terminal_interface-curses__ads.htm#ref_1069_29">SwitchOn</a></span> : Boolean := True)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_810_16">Echo</a></span> <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Echo, "echo");
+      <b>function</b> <span class="symbol"><a name="ref_812_16">NoEcho</a></span> <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, NoEcho, "noecho");
+
+      <span class="symbol"><a name="ref_815_7">Err</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__ads.htm#ref_1069_29">SwitchOn</a> <b>then</b>
+         <a href="terminal_interface-curses__adb.htm#ref_815_7">Err</a> := <a href="terminal_interface-curses__adb.htm#ref_810_16">Echo</a>;
+      <b>else</b>
+         <a href="terminal_interface-curses__adb.htm#ref_815_7">Err</a> := <a href="terminal_interface-curses__adb.htm#ref_812_16">NoEcho</a>;
+      <b>end</b> <b>if</b>;
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_815_7">Err</a> = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1069_14">Set_Echo_Mode</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_827_14" href="terminal_interface-curses__ads.htm#ref_1075_14">Set_Meta_Mode</a></span> (<span class="symbol"><a name="ref_827_29" href="terminal_interface-curses__ads.htm#ref_1075_29">Win</a></span>      : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                            <span class="symbol"><a name="ref_828_29" href="terminal_interface-curses__ads.htm#ref_1076_29">SwitchOn</a></span> : Boolean := True)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_830_16">Meta</a></span> (<span class="symbol"><a name="ref_830_22">W</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>; <span class="symbol"><a name="ref_830_34">Mode</a></span> : <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Meta, "meta");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_830_16">Meta</a> (<a href="terminal_interface-curses__ads.htm#ref_1075_29">Win</a>, <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a> (Boolean'Pos (<a href="terminal_interface-curses__ads.htm#ref_1076_29">SwitchOn</a>))) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1075_14">Set_Meta_Mode</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_838_14" href="terminal_interface-curses__ads.htm#ref_1081_14">Set_KeyPad_Mode</a></span> (<span class="symbol"><a name="ref_838_31" href="terminal_interface-curses__ads.htm#ref_1081_31">Win</a></span>      : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                              <span class="symbol"><a name="ref_839_31" href="terminal_interface-curses__ads.htm#ref_1082_31">SwitchOn</a></span> : Boolean := True)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_841_16">Keypad</a></span> (<span class="symbol"><a name="ref_841_24">W</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>; <span class="symbol"><a name="ref_841_36">Mode</a></span> : <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Keypad, "keypad");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_841_16">Keypad</a> (<a href="terminal_interface-curses__ads.htm#ref_1081_31">Win</a>, <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a> (Boolean'Pos (<a href="terminal_interface-curses__ads.htm#ref_1082_31">SwitchOn</a>))) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1081_14">Set_KeyPad_Mode</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_849_13" href="terminal_interface-curses__ads.htm#ref_1086_13">Get_KeyPad_Mode</a></span> (<span class="symbol"><a name="ref_849_30" href="terminal_interface-curses__ads.htm#ref_1086_30">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>)
+                             <b>return</b> Boolean
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_852_16">Is_Keypad</a></span> (<span class="symbol"><a name="ref_852_27">W</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>;
+      <b>pragma</b> Import (C, Is_Keypad, "is_keypad");
+   <b>begin</b>
+      <b>return</b> (<a href="terminal_interface-curses__adb.htm#ref_852_16">Is_Keypad</a> (<a href="terminal_interface-curses__ads.htm#ref_1086_30">Win</a>) /= <a href="terminal_interface-curses__ads.htm#ref_2101_4">Curses_Bool_False</a>);
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1086_13">Get_KeyPad_Mode</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_858_14" href="terminal_interface-curses__ads.htm#ref_1094_14">Half_Delay</a></span> (<span class="symbol"><a name="ref_858_26" href="terminal_interface-curses__ads.htm#ref_1094_26">Amount</a></span> : <a href="terminal_interface-curses__ads.htm#ref_1091_9">Half_Delay_Amount</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_860_16">Halfdelay</a></span> (<span class="symbol"><a name="ref_860_27">Amount</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Halfdelay, "halfdelay");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_860_16">Halfdelay</a> (<a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1094_26">Amount</a>)) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1094_14">Half_Delay</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_868_14" href="terminal_interface-curses__ads.htm#ref_1099_14">Set_Flush_On_Interrupt_Mode</a></span>
+     (<span class="symbol"><a name="ref_869_7" href="terminal_interface-curses__ads.htm#ref_1100_7">Win</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_870_7" href="terminal_interface-curses__ads.htm#ref_1101_7">Mode</a></span> : Boolean := True)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_872_16">Intrflush</a></span> (<span class="symbol"><a name="ref_872_27">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>; <span class="symbol"><a name="ref_872_41">Mode</a></span> : <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Intrflush, "intrflush");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_872_16">Intrflush</a> (<a href="terminal_interface-curses__ads.htm#ref_1100_7">Win</a>, <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a> (Boolean'Pos (<a href="terminal_interface-curses__ads.htm#ref_1101_7">Mode</a>))) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1099_14">Set_Flush_On_Interrupt_Mode</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_880_14" href="terminal_interface-curses__ads.htm#ref_1106_14">Set_Queue_Interrupt_Mode</a></span>
+     (<span class="symbol"><a name="ref_881_7" href="terminal_interface-curses__ads.htm#ref_1107_7">Win</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_882_7" href="terminal_interface-curses__ads.htm#ref_1108_7">Flush</a></span> : Boolean := True)
+   <b>is</b>
+      <b>procedure</b> <span class="symbol"><a name="ref_884_17">Qiflush</a></span>;
+      <b>pragma</b> Import (C, Qiflush, "qiflush");
+      <b>procedure</b> <span class="symbol"><a name="ref_886_17">No_Qiflush</a></span>;
+      <b>pragma</b> Import (C, No_Qiflush, "noqiflush");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__ads.htm#ref_1107_7">Win</a> = <a href="terminal_interface-curses__ads.htm#ref_57_4">Null_Window</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+      <b>if</b> <a href="terminal_interface-curses__ads.htm#ref_1108_7">Flush</a> <b>then</b>
+         <a href="terminal_interface-curses__adb.htm#ref_884_17">Qiflush</a>;
+      <b>else</b>
+         <a href="terminal_interface-curses__adb.htm#ref_886_17">No_Qiflush</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1106_14">Set_Queue_Interrupt_Mode</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_899_14" href="terminal_interface-curses__ads.htm#ref_1114_14">Set_NoDelay_Mode</a></span>
+     (<span class="symbol"><a name="ref_900_7" href="terminal_interface-curses__ads.htm#ref_1115_7">Win</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_901_7" href="terminal_interface-curses__ads.htm#ref_1116_7">Mode</a></span> : Boolean := False)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_903_16">Nodelay</a></span> (<span class="symbol"><a name="ref_903_25">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>; <span class="symbol"><a name="ref_903_39">Mode</a></span> : <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Nodelay, "nodelay");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_903_16">Nodelay</a> (<a href="terminal_interface-curses__ads.htm#ref_1115_7">Win</a>, <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a> (Boolean'Pos (<a href="terminal_interface-curses__ads.htm#ref_1116_7">Mode</a>))) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1114_14">Set_NoDelay_Mode</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_911_14" href="terminal_interface-curses__ads.htm#ref_1123_14">Set_Timeout_Mode</a></span> (<span class="symbol"><a name="ref_911_32" href="terminal_interface-curses__ads.htm#ref_1123_32">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                               <span class="symbol"><a name="ref_912_32" href="terminal_interface-curses__ads.htm#ref_1124_32">Mode</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_1120_9">Timeout_Mode</a>;
+                               <span class="symbol"><a name="ref_913_32" href="terminal_interface-curses__ads.htm#ref_1125_32">Amount</a></span> : Natural)
+   <b>is</b>
+      <b>procedure</b> <span class="symbol"><a name="ref_915_17">Wtimeout</a></span> (<span class="symbol"><a name="ref_915_27">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>; <span class="symbol"><a name="ref_915_41">Amount</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>);
+      <b>pragma</b> Import (C, Wtimeout, "wtimeout");
+
+      <span class="symbol"><a name="ref_918_7">Time</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+   <b>begin</b>
+      <b>case</b> <a href="terminal_interface-curses__ads.htm#ref_1124_32">Mode</a> <b>is</b>
+         <b>when</b> <a href="terminal_interface-curses__ads.htm#ref_1120_26">Blocking</a>     =&gt; <a href="terminal_interface-curses__adb.htm#ref_918_7">Time</a> := -1;
+         <b>when</b> <a href="terminal_interface-curses__ads.htm#ref_1120_36">Non_Blocking</a> =&gt; <a href="terminal_interface-curses__adb.htm#ref_918_7">Time</a> := 0;
+         <b>when</b> <a href="terminal_interface-curses__ads.htm#ref_1120_50">Delayed</a>      =&gt;
+            <b>if</b> <a href="terminal_interface-curses__ads.htm#ref_1125_32">Amount</a> = 0 <b>then</b>
+               <b>raise</b> Constraint_Error;
+            <b>end</b> <b>if</b>;
+            <a href="terminal_interface-curses__adb.htm#ref_918_7">Time</a> := <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1125_32">Amount</a>);
+      <b>end</b> <b>case</b>;
+      <a href="terminal_interface-curses__adb.htm#ref_915_17">Wtimeout</a> (<a href="terminal_interface-curses__ads.htm#ref_1123_32">Win</a>, <a href="terminal_interface-curses__adb.htm#ref_918_7">Time</a>);
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1123_14">Set_Timeout_Mode</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_932_14" href="terminal_interface-curses__ads.htm#ref_1135_14">Set_Escape_Timer_Mode</a></span>
+     (<span class="symbol"><a name="ref_933_7" href="terminal_interface-curses__ads.htm#ref_1136_7">Win</a></span>       : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_934_7" href="terminal_interface-curses__ads.htm#ref_1137_7">Timer_Off</a></span> : Boolean := False)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_936_16">Notimeout</a></span> (<span class="symbol"><a name="ref_936_27">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>; <span class="symbol"><a name="ref_936_41">Mode</a></span> : <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Notimeout, "notimeout");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_936_16">Notimeout</a> (<a href="terminal_interface-curses__ads.htm#ref_1136_7">Win</a>, <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a> (Boolean'Pos (<a href="terminal_interface-curses__ads.htm#ref_1137_7">Timer_Off</a>)))
+        = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a>
+      <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1135_14">Set_Escape_Timer_Mode</a>;
+
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_947_14" href="terminal_interface-curses__ads.htm#ref_1146_14">Set_NL_Mode</a></span> (<span class="symbol"><a name="ref_947_27" href="terminal_interface-curses__ads.htm#ref_1146_27">SwitchOn</a></span> : Boolean := True)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_949_16">NL</a></span> <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, NL, "nl");
+      <b>function</b> <span class="symbol"><a name="ref_951_16">NoNL</a></span> <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, NoNL, "nonl");
+
+      <span class="symbol"><a name="ref_954_7">Err</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__ads.htm#ref_1146_27">SwitchOn</a> <b>then</b>
+         <a href="terminal_interface-curses__adb.htm#ref_954_7">Err</a> := <a href="terminal_interface-curses__adb.htm#ref_949_16">NL</a>;
+      <b>else</b>
+         <a href="terminal_interface-curses__adb.htm#ref_954_7">Err</a> := <a href="terminal_interface-curses__adb.htm#ref_951_16">NoNL</a>;
+      <b>end</b> <b>if</b>;
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_954_7">Err</a> = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1146_14">Set_NL_Mode</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_966_14" href="terminal_interface-curses__ads.htm#ref_1152_14">Clear_On_Next_Update</a></span>
+     (<span class="symbol"><a name="ref_967_7" href="terminal_interface-curses__ads.htm#ref_1153_7">Win</a></span>      : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_968_7" href="terminal_interface-curses__ads.htm#ref_1154_7">Do_Clear</a></span> : Boolean := True)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_970_16">Clear_Ok</a></span> (<span class="symbol"><a name="ref_970_26">W</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>; <span class="symbol"><a name="ref_970_38">Flag</a></span> : <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Clear_Ok, "clearok");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_970_16">Clear_Ok</a> (<a href="terminal_interface-curses__ads.htm#ref_1153_7">Win</a>, <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a> (Boolean'Pos (<a href="terminal_interface-curses__ads.htm#ref_1154_7">Do_Clear</a>))) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1152_14">Clear_On_Next_Update</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_978_14" href="terminal_interface-curses__ads.htm#ref_1159_14">Use_Insert_Delete_Line</a></span>
+     (<span class="symbol"><a name="ref_979_7" href="terminal_interface-curses__ads.htm#ref_1160_7">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_980_7" href="terminal_interface-curses__ads.htm#ref_1161_7">Do_Idl</a></span> : Boolean := True)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_982_16">IDL_Ok</a></span> (<span class="symbol"><a name="ref_982_24">W</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>; <span class="symbol"><a name="ref_982_36">Flag</a></span> : <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, IDL_Ok, "idlok");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_982_16">IDL_Ok</a> (<a href="terminal_interface-curses__ads.htm#ref_1160_7">Win</a>, <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a> (Boolean'Pos (<a href="terminal_interface-curses__ads.htm#ref_1161_7">Do_Idl</a>))) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1159_14">Use_Insert_Delete_Line</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_990_14" href="terminal_interface-curses__ads.htm#ref_1166_14">Use_Insert_Delete_Character</a></span>
+     (<span class="symbol"><a name="ref_991_7" href="terminal_interface-curses__ads.htm#ref_1167_7">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_992_7" href="terminal_interface-curses__ads.htm#ref_1168_7">Do_Idc</a></span> : Boolean := True)
+   <b>is</b>
+      <b>procedure</b> <span class="symbol"><a name="ref_994_17">IDC_Ok</a></span> (<span class="symbol"><a name="ref_994_25">W</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>; <span class="symbol"><a name="ref_994_37">Flag</a></span> : <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>);
+      <b>pragma</b> Import (C, IDC_Ok, "idcok");
+   <b>begin</b>
+      <a href="terminal_interface-curses__adb.htm#ref_994_17">IDC_Ok</a> (<a href="terminal_interface-curses__ads.htm#ref_1167_7">Win</a>, <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a> (Boolean'Pos (<a href="terminal_interface-curses__ads.htm#ref_1168_7">Do_Idc</a>)));
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1166_14">Use_Insert_Delete_Character</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1000_14" href="terminal_interface-curses__ads.htm#ref_1173_14">Leave_Cursor_After_Update</a></span>
+     (<span class="symbol"><a name="ref_1001_7" href="terminal_interface-curses__ads.htm#ref_1174_7">Win</a></span>      : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_1002_7" href="terminal_interface-curses__ads.htm#ref_1175_7">Do_Leave</a></span> : Boolean := True)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1004_16">Leave_Ok</a></span> (<span class="symbol"><a name="ref_1004_26">W</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>; <span class="symbol"><a name="ref_1004_38">Flag</a></span> : <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Leave_Ok, "leaveok");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1004_16">Leave_Ok</a> (<a href="terminal_interface-curses__ads.htm#ref_1174_7">Win</a>, <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a> (Boolean'Pos (<a href="terminal_interface-curses__ads.htm#ref_1175_7">Do_Leave</a>))) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1173_14">Leave_Cursor_After_Update</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1012_14" href="terminal_interface-curses__ads.htm#ref_1180_14">Immediate_Update_Mode</a></span>
+     (<span class="symbol"><a name="ref_1013_7" href="terminal_interface-curses__ads.htm#ref_1181_7">Win</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_1014_7" href="terminal_interface-curses__ads.htm#ref_1182_7">Mode</a></span> : Boolean := False)
+   <b>is</b>
+      <b>procedure</b> <span class="symbol"><a name="ref_1016_17">Immedok</a></span> (<span class="symbol"><a name="ref_1016_26">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>; <span class="symbol"><a name="ref_1016_40">Mode</a></span> : <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>);
+      <b>pragma</b> Import (C, Immedok, "immedok");
+   <b>begin</b>
+      <a href="terminal_interface-curses__adb.htm#ref_1016_17">Immedok</a> (<a href="terminal_interface-curses__ads.htm#ref_1181_7">Win</a>, <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a> (Boolean'Pos (<a href="terminal_interface-curses__ads.htm#ref_1182_7">Mode</a>)));
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1180_14">Immediate_Update_Mode</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1022_14" href="terminal_interface-curses__ads.htm#ref_1187_14">Allow_Scrolling</a></span>
+     (<span class="symbol"><a name="ref_1023_7" href="terminal_interface-curses__ads.htm#ref_1188_7">Win</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>  := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_1024_7" href="terminal_interface-curses__ads.htm#ref_1189_7">Mode</a></span> : Boolean := False)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1026_16">Scrollok</a></span> (<span class="symbol"><a name="ref_1026_26">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>; <span class="symbol"><a name="ref_1026_40">Mode</a></span> : <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Scrollok, "scrollok");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1026_16">Scrollok</a> (<a href="terminal_interface-curses__ads.htm#ref_1188_7">Win</a>, <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a> (Boolean'Pos (<a href="terminal_interface-curses__ads.htm#ref_1189_7">Mode</a>))) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1187_14">Allow_Scrolling</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_1034_13" href="terminal_interface-curses__ads.htm#ref_1193_13">Scrolling_Allowed</a></span> (<span class="symbol"><a name="ref_1034_32" href="terminal_interface-curses__ads.htm#ref_1193_32">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>)
+                               <b>return</b> Boolean
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1037_16">Is_Scroll_Ok</a></span> (<span class="symbol"><a name="ref_1037_30">W</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>;
+      <b>pragma</b> Import (C, Is_Scroll_Ok, "is_scrollok");
+   <b>begin</b>
+      <b>return</b> (<a href="terminal_interface-curses__adb.htm#ref_1037_16">Is_Scroll_Ok</a> (<a href="terminal_interface-curses__ads.htm#ref_1193_32">Win</a>) /= <a href="terminal_interface-curses__ads.htm#ref_2101_4">Curses_Bool_False</a>);
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1193_13">Scrolling_Allowed</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1043_14" href="terminal_interface-curses__ads.htm#ref_1198_14">Set_Scroll_Region</a></span>
+     (<span class="symbol"><a name="ref_1044_7" href="terminal_interface-curses__ads.htm#ref_1199_7">Win</a></span>         : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_1045_7" href="terminal_interface-curses__ads.htm#ref_1200_7">Top_Line</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_1046_7" href="terminal_interface-curses__ads.htm#ref_1201_7">Bottom_Line</a></span> : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1048_16">Wsetscrreg</a></span> (<span class="symbol"><a name="ref_1048_28">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+                           <span class="symbol"><a name="ref_1049_28">Lin</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+                           <span class="symbol"><a name="ref_1050_28">Col</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Wsetscrreg, "wsetscrreg");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1048_16">Wsetscrreg</a> (<a href="terminal_interface-curses__ads.htm#ref_1199_7">Win</a>, <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1200_7">Top_Line</a>), <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1201_7">Bottom_Line</a>))
+        = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a>
+      <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1198_14">Set_Scroll_Region</a>;
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1060_14" href="terminal_interface-curses__ads.htm#ref_1211_14">Update_Screen</a></span>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1062_16">Do_Update</a></span> <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Do_Update, "doupdate");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1062_16">Do_Update</a> = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1211_14">Update_Screen</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1070_14" href="terminal_interface-curses__ads.htm#ref_1216_14">Refresh</a></span> (<span class="symbol"><a name="ref_1070_23" href="terminal_interface-curses__ads.htm#ref_1216_23">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1072_16">Wrefresh</a></span> (<span class="symbol"><a name="ref_1072_26">W</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Wrefresh, "wrefresh");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1072_16">Wrefresh</a> (<a href="terminal_interface-curses__ads.htm#ref_1216_23">Win</a>) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1216_14">Refresh</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1080_14" href="terminal_interface-curses__ads.htm#ref_1223_14">Refresh_Without_Update</a></span>
+     (<span class="symbol"><a name="ref_1081_7" href="terminal_interface-curses__ads.htm#ref_1224_7">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1083_16">Wnoutrefresh</a></span> (<span class="symbol"><a name="ref_1083_30">W</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Wnoutrefresh, "wnoutrefresh");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1083_16">Wnoutrefresh</a> (<a href="terminal_interface-curses__ads.htm#ref_1224_7">Win</a>) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1223_14">Refresh_Without_Update</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1091_14" href="terminal_interface-curses__ads.htm#ref_1230_14">Redraw</a></span> (<span class="symbol"><a name="ref_1091_22" href="terminal_interface-curses__ads.htm#ref_1230_22">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1093_16">Redrawwin</a></span> (<span class="symbol"><a name="ref_1093_27">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Redrawwin, "redrawwin");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1093_16">Redrawwin</a> (<a href="terminal_interface-curses__ads.htm#ref_1230_22">Win</a>) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1230_14">Redraw</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1101_14" href="terminal_interface-curses__ads.htm#ref_1234_14">Redraw</a></span>
+     (<span class="symbol"><a name="ref_1102_7" href="terminal_interface-curses__ads.htm#ref_1234_22">Win</a></span>        : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_1103_7" href="terminal_interface-curses__ads.htm#ref_1235_22">Begin_Line</a></span> : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_1104_7" href="terminal_interface-curses__ads.htm#ref_1236_22">Line_Count</a></span> : Positive)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1106_16">Wredrawln</a></span> (<span class="symbol"><a name="ref_1106_27">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>; <span class="symbol"><a name="ref_1106_41">First</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>; <span class="symbol"><a name="ref_1106_56">Cnt</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>)
+                          <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Wredrawln, "wredrawln");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1106_16">Wredrawln</a> (<a href="terminal_interface-curses__ads.htm#ref_1234_22">Win</a>,
+                    <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1235_22">Begin_Line</a>),
+                    <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1236_22">Line_Count</a>)) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a>
+      <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1234_14">Redraw</a>;
+
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1119_14" href="terminal_interface-curses__ads.htm#ref_1245_14">Erase</a></span> (<span class="symbol"><a name="ref_1119_21" href="terminal_interface-curses__ads.htm#ref_1245_21">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1121_16">Werase</a></span> (<span class="symbol"><a name="ref_1121_24">W</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Werase, "werase");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1121_16">Werase</a> (<a href="terminal_interface-curses__ads.htm#ref_1245_21">Win</a>) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1245_14">Erase</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1129_14" href="terminal_interface-curses__ads.htm#ref_1251_14">Clear</a></span> (<span class="symbol"><a name="ref_1129_21" href="terminal_interface-curses__ads.htm#ref_1252_7">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1131_16">Wclear</a></span> (<span class="symbol"><a name="ref_1131_24">W</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Wclear, "wclear");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1131_16">Wclear</a> (<a href="terminal_interface-curses__ads.htm#ref_1252_7">Win</a>) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1251_14">Clear</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1139_14" href="terminal_interface-curses__ads.htm#ref_1258_14">Clear_To_End_Of_Screen</a></span> (<span class="symbol"><a name="ref_1139_38" href="terminal_interface-curses__ads.htm#ref_1259_7">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1141_16">Wclearbot</a></span> (<span class="symbol"><a name="ref_1141_27">W</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Wclearbot, "wclrtobot");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1141_16">Wclearbot</a> (<a href="terminal_interface-curses__ads.htm#ref_1259_7">Win</a>) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1258_14">Clear_To_End_Of_Screen</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1149_14" href="terminal_interface-curses__ads.htm#ref_1265_14">Clear_To_End_Of_Line</a></span> (<span class="symbol"><a name="ref_1149_36" href="terminal_interface-curses__ads.htm#ref_1266_7">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1151_16">Wcleareol</a></span> (<span class="symbol"><a name="ref_1151_27">W</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Wcleareol, "wclrtoeol");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1151_16">Wcleareol</a> (<a href="terminal_interface-curses__ads.htm#ref_1266_7">Win</a>) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1265_14">Clear_To_End_Of_Line</a>;
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1159_14" href="terminal_interface-curses__ads.htm#ref_1279_14">Set_Background</a></span>
+     (<span class="symbol"><a name="ref_1160_7" href="terminal_interface-curses__ads.htm#ref_1280_7">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_1161_7" href="terminal_interface-curses__ads.htm#ref_1281_7">Ch</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>)
+   <b>is</b>
+      <b>procedure</b> <span class="symbol"><a name="ref_1163_17">WBackground</a></span> (<span class="symbol"><a name="ref_1163_30">W</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>; <span class="symbol"><a name="ref_1163_42">Ch</a></span> : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>);
+      <b>pragma</b> Import (C, WBackground, "wbkgdset");
+   <b>begin</b>
+      <a href="terminal_interface-curses__adb.htm#ref_1163_17">WBackground</a> (<a href="terminal_interface-curses__ads.htm#ref_1280_7">Win</a>, <a href="terminal_interface-curses__ads.htm#ref_1281_7">Ch</a>);
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1279_14">Set_Background</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1169_14" href="terminal_interface-curses__ads.htm#ref_1287_14">Change_Background</a></span>
+     (<span class="symbol"><a name="ref_1170_7" href="terminal_interface-curses__ads.htm#ref_1288_7">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_1171_7" href="terminal_interface-curses__ads.htm#ref_1289_7">Ch</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1173_16">WChangeBkgd</a></span> (<span class="symbol"><a name="ref_1173_29">W</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>; <span class="symbol"><a name="ref_1173_41">Ch</a></span> : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>)
+         <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, WChangeBkgd, "wbkgd");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1173_16">WChangeBkgd</a> (<a href="terminal_interface-curses__ads.htm#ref_1288_7">Win</a>, <a href="terminal_interface-curses__ads.htm#ref_1289_7">Ch</a>) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1287_14">Change_Background</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_1182_13" href="terminal_interface-curses__ads.htm#ref_1296_13">Get_Background</a></span> (<span class="symbol"><a name="ref_1182_29" href="terminal_interface-curses__ads.htm#ref_1296_29">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>)
+     <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1185_16">Wgetbkgd</a></span> (<span class="symbol"><a name="ref_1185_26">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>;
+      <b>pragma</b> Import (C, Wgetbkgd, "getbkgd");
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses__adb.htm#ref_1185_16">Wgetbkgd</a> (<a href="terminal_interface-curses__ads.htm#ref_1296_29">Win</a>);
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1296_13">Get_Background</a>;
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1191_14" href="terminal_interface-curses__ads.htm#ref_1323_14">Change_Lines_Status</a></span> (<span class="symbol"><a name="ref_1191_35" href="terminal_interface-curses__ads.htm#ref_1323_35">Win</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                                  <span class="symbol"><a name="ref_1192_35" href="terminal_interface-curses__ads.htm#ref_1324_35">Start</a></span> : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+                                  <span class="symbol"><a name="ref_1193_35" href="terminal_interface-curses__ads.htm#ref_1325_35">Count</a></span> : Positive;
+                                  <span class="symbol"><a name="ref_1194_35" href="terminal_interface-curses__ads.htm#ref_1326_35">State</a></span> : Boolean)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1196_16">Wtouchln</a></span> (<span class="symbol"><a name="ref_1196_26">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+                         <span class="symbol"><a name="ref_1197_26">Sta</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+                         <span class="symbol"><a name="ref_1198_26">Cnt</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+                         <span class="symbol"><a name="ref_1199_26">Chg</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Wtouchln, "wtouchln");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1196_16">Wtouchln</a> (<a href="terminal_interface-curses__ads.htm#ref_1323_35">Win</a>, <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1324_35">Start</a>), <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1325_35">Count</a>),
+                   <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (Boolean'Pos (<a href="terminal_interface-curses__ads.htm#ref_1326_35">State</a>))) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a>
+      <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1323_14">Change_Lines_Status</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1209_14" href="terminal_interface-curses__ads.htm#ref_1312_14">Touch</a></span> (<span class="symbol"><a name="ref_1209_21" href="terminal_interface-curses__ads.htm#ref_1312_21">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>)
+   <b>is</b>
+      <span class="symbol"><a name="ref_1211_7">Y</a></span> : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_1212_7">X</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+   <b>begin</b>
+      <a href="terminal_interface-curses__ads.htm#ref_1399_14">Get_Size</a> (<a href="terminal_interface-curses__ads.htm#ref_1312_21">Win</a>, <a href="terminal_interface-curses__adb.htm#ref_1211_7">Y</a>, <a href="terminal_interface-curses__adb.htm#ref_1212_7">X</a>);
+      <b>pragma</b> Warnings (Off, <a href="terminal_interface-curses__adb.htm#ref_1212_7">X</a>);         <span class="comment"><em>--  unreferenced</em></span>
+      <a href="terminal_interface-curses__ads.htm#ref_1323_14">Change_Lines_Status</a> (<a href="terminal_interface-curses__ads.htm#ref_1312_21">Win</a>, 0, Positive (<a href="terminal_interface-curses__adb.htm#ref_1211_7">Y</a>), True);
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1312_14">Touch</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1219_14" href="terminal_interface-curses__ads.htm#ref_1307_14">Untouch</a></span> (<span class="symbol"><a name="ref_1219_23" href="terminal_interface-curses__ads.htm#ref_1307_23">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>)
+   <b>is</b>
+      <span class="symbol"><a name="ref_1221_7">Y</a></span> : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_1222_7">X</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+   <b>begin</b>
+      <a href="terminal_interface-curses__ads.htm#ref_1399_14">Get_Size</a> (<a href="terminal_interface-curses__ads.htm#ref_1307_23">Win</a>, <a href="terminal_interface-curses__adb.htm#ref_1221_7">Y</a>, <a href="terminal_interface-curses__adb.htm#ref_1222_7">X</a>);
+      <b>pragma</b> Warnings (Off, <a href="terminal_interface-curses__adb.htm#ref_1222_7">X</a>);         <span class="comment"><em>--  unreferenced</em></span>
+      <a href="terminal_interface-curses__ads.htm#ref_1323_14">Change_Lines_Status</a> (<a href="terminal_interface-curses__ads.htm#ref_1307_23">Win</a>, 0, Positive (<a href="terminal_interface-curses__adb.htm#ref_1221_7">Y</a>), False);
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1307_14">Untouch</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1229_14" href="terminal_interface-curses__ads.htm#ref_1316_14">Touch</a></span> (<span class="symbol"><a name="ref_1229_21" href="terminal_interface-curses__ads.htm#ref_1316_21">Win</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                    <span class="symbol"><a name="ref_1230_21" href="terminal_interface-curses__ads.htm#ref_1317_21">Start</a></span> : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+                    <span class="symbol"><a name="ref_1231_21" href="terminal_interface-curses__ads.htm#ref_1318_21">Count</a></span> : Positive)
+   <b>is</b>
+   <b>begin</b>
+      <a href="terminal_interface-curses__ads.htm#ref_1323_14">Change_Lines_Status</a> (<a href="terminal_interface-curses__ads.htm#ref_1316_21">Win</a>, <a href="terminal_interface-curses__ads.htm#ref_1317_21">Start</a>, <a href="terminal_interface-curses__ads.htm#ref_1318_21">Count</a>, True);
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1316_14">Touch</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_1237_13" href="terminal_interface-curses__ads.htm#ref_1331_13">Is_Touched</a></span>
+     (<span class="symbol"><a name="ref_1238_7" href="terminal_interface-curses__ads.htm#ref_1331_25">Win</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_1239_7" href="terminal_interface-curses__ads.htm#ref_1332_25">Line</a></span> : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>) <b>return</b> Boolean
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1241_16">WLineTouched</a></span> (<span class="symbol"><a name="ref_1241_30">W</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>; <span class="symbol"><a name="ref_1241_42">L</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>;
+      <b>pragma</b> Import (C, WLineTouched, "is_linetouched");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1241_16">WLineTouched</a> (<a href="terminal_interface-curses__ads.htm#ref_1331_25">Win</a>, <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1332_25">Line</a>)) = <a href="terminal_interface-curses__ads.htm#ref_2101_4">Curses_Bool_False</a> <b>then</b>
+         <b>return</b> False;
+      <b>else</b>
+         <b>return</b> True;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1331_13">Is_Touched</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_1251_13" href="terminal_interface-curses__ads.htm#ref_1336_13">Is_Touched</a></span>
+     (<span class="symbol"><a name="ref_1252_7" href="terminal_interface-curses__ads.htm#ref_1336_25">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>) <b>return</b> Boolean
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1254_16">WWinTouched</a></span> (<span class="symbol"><a name="ref_1254_29">W</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>;
+      <b>pragma</b> Import (C, WWinTouched, "is_wintouched");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1254_16">WWinTouched</a> (<a href="terminal_interface-curses__ads.htm#ref_1336_25">Win</a>) = <a href="terminal_interface-curses__ads.htm#ref_2101_4">Curses_Bool_False</a> <b>then</b>
+         <b>return</b> False;
+      <b>else</b>
+         <b>return</b> True;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1336_13">Is_Touched</a>;
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1264_14" href="terminal_interface-curses__ads.htm#ref_1345_14">Copy</a></span>
+     (<span class="symbol"><a name="ref_1265_7" href="terminal_interface-curses__ads.htm#ref_1346_7">Source_Window</a></span>            : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <span class="symbol"><a name="ref_1266_7" href="terminal_interface-curses__ads.htm#ref_1347_7">Destination_Window</a></span>       : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <span class="symbol"><a name="ref_1267_7" href="terminal_interface-curses__ads.htm#ref_1348_7">Source_Top_Row</a></span>           : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_1268_7" href="terminal_interface-curses__ads.htm#ref_1349_7">Source_Left_Column</a></span>       : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+      <span class="symbol"><a name="ref_1269_7" href="terminal_interface-curses__ads.htm#ref_1350_7">Destination_Top_Row</a></span>      : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_1270_7" href="terminal_interface-curses__ads.htm#ref_1351_7">Destination_Left_Column</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+      <span class="symbol"><a name="ref_1271_7" href="terminal_interface-curses__ads.htm#ref_1352_7">Destination_Bottom_Row</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_1272_7" href="terminal_interface-curses__ads.htm#ref_1353_7">Destination_Right_Column</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+      <span class="symbol"><a name="ref_1273_7" href="terminal_interface-curses__ads.htm#ref_1354_7">Non_Destructive_Mode</a></span>     : Boolean := True)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1275_16">Copywin</a></span> (<span class="symbol"><a name="ref_1275_25">Src</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+                        <span class="symbol"><a name="ref_1276_25">Dst</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+                        <span class="symbol"><a name="ref_1277_25">Str</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+                        <span class="symbol"><a name="ref_1278_25">Slc</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+                        <span class="symbol"><a name="ref_1279_25">Dtr</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+                        <span class="symbol"><a name="ref_1280_25">Dlc</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+                        <span class="symbol"><a name="ref_1281_25">Dbr</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+                        <span class="symbol"><a name="ref_1282_25">Drc</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+                        <span class="symbol"><a name="ref_1283_25">Ndm</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Copywin, "copywin");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1275_16">Copywin</a> (<a href="terminal_interface-curses__ads.htm#ref_1346_7">Source_Window</a>,
+                  <a href="terminal_interface-curses__ads.htm#ref_1347_7">Destination_Window</a>,
+                  <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1348_7">Source_Top_Row</a>),
+                  <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1349_7">Source_Left_Column</a>),
+                  <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1350_7">Destination_Top_Row</a>),
+                  <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1351_7">Destination_Left_Column</a>),
+                  <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1352_7">Destination_Bottom_Row</a>),
+                  <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1353_7">Destination_Right_Column</a>),
+                  Boolean'Pos (<a href="terminal_interface-curses__ads.htm#ref_1354_7">Non_Destructive_Mode</a>)
+                 ) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a>
+      <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1345_14">Copy</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1301_14" href="terminal_interface-curses__ads.htm#ref_1359_14">Overwrite</a></span>
+     (<span class="symbol"><a name="ref_1302_7" href="terminal_interface-curses__ads.htm#ref_1359_25">Source_Window</a></span>      : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <span class="symbol"><a name="ref_1303_7" href="terminal_interface-curses__ads.htm#ref_1360_25">Destination_Window</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1305_16">Overwrite</a></span> (<span class="symbol"><a name="ref_1305_27">Src</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>; <span class="symbol"><a name="ref_1305_41">Dst</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Overwrite, "overwrite");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1305_16">Overwrite</a> (<a href="terminal_interface-curses__ads.htm#ref_1359_25">Source_Window</a>, <a href="terminal_interface-curses__ads.htm#ref_1360_25">Destination_Window</a>) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1359_14">Overwrite</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1313_14" href="terminal_interface-curses__ads.htm#ref_1365_14">Overlay</a></span>
+     (<span class="symbol"><a name="ref_1314_7" href="terminal_interface-curses__ads.htm#ref_1365_23">Source_Window</a></span>      : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <span class="symbol"><a name="ref_1315_7" href="terminal_interface-curses__ads.htm#ref_1366_23">Destination_Window</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1317_16">Overlay</a></span> (<span class="symbol"><a name="ref_1317_25">Src</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>; <span class="symbol"><a name="ref_1317_39">Dst</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Overlay, "overlay");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1317_16">Overlay</a> (<a href="terminal_interface-curses__ads.htm#ref_1365_23">Source_Window</a>, <a href="terminal_interface-curses__ads.htm#ref_1366_23">Destination_Window</a>) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1365_14">Overlay</a>;
+
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1326_14" href="terminal_interface-curses__ads.htm#ref_1375_14">Insert_Delete_Lines</a></span>
+     (<span class="symbol"><a name="ref_1327_7" href="terminal_interface-curses__ads.htm#ref_1376_7">Win</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_1328_7" href="terminal_interface-curses__ads.htm#ref_1377_7">Lines</a></span> : Integer       := 1) <span class="comment"><em>-- default is to insert one line above</em></span>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1330_16">Winsdelln</a></span> (<span class="symbol"><a name="ref_1330_27">W</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>; <span class="symbol"><a name="ref_1330_39">N</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Winsdelln, "winsdelln");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1330_16">Winsdelln</a> (<a href="terminal_interface-curses__ads.htm#ref_1376_7">Win</a>, <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1377_7">Lines</a>)) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1375_14">Insert_Delete_Lines</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1338_14" href="terminal_interface-curses__ads.htm#ref_1383_14">Delete_Line</a></span> (<span class="symbol"><a name="ref_1338_27" href="terminal_interface-curses__ads.htm#ref_1383_27">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>)
+   <b>is</b>
+   <b>begin</b>
+      <a href="terminal_interface-curses__ads.htm#ref_1375_14">Insert_Delete_Lines</a> (<a href="terminal_interface-curses__ads.htm#ref_1383_27">Win</a>, -1);
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1383_14">Delete_Line</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1344_14" href="terminal_interface-curses__ads.htm#ref_1389_14">Insert_Line</a></span> (<span class="symbol"><a name="ref_1344_27" href="terminal_interface-curses__ads.htm#ref_1389_27">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>)
+   <b>is</b>
+   <b>begin</b>
+      <a href="terminal_interface-curses__ads.htm#ref_1375_14">Insert_Delete_Lines</a> (<a href="terminal_interface-curses__ads.htm#ref_1389_27">Win</a>, 1);
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1389_14">Insert_Line</a>;
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1351_14" href="terminal_interface-curses__ads.htm#ref_1399_14">Get_Size</a></span>
+     (<span class="symbol"><a name="ref_1352_7" href="terminal_interface-curses__ads.htm#ref_1400_7">Win</a></span>               : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_1353_7" href="terminal_interface-curses__ads.htm#ref_1401_7">Number_Of_Lines</a></span>   : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a>;
+      <span class="symbol"><a name="ref_1354_7" href="terminal_interface-curses__ads.htm#ref_1402_7">Number_Of_Columns</a></span> : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1356_16">GetMaxY</a></span> (<span class="symbol"><a name="ref_1356_25">W</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, GetMaxY, "getmaxy");
+
+      <b>function</b> <span class="symbol"><a name="ref_1359_16">GetMaxX</a></span> (<span class="symbol"><a name="ref_1359_25">W</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, GetMaxX, "getmaxx");
+
+      <span class="symbol"><a name="ref_1362_7">Y</a></span> : <b>constant</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> := <a href="terminal_interface-curses__adb.htm#ref_1356_16">GetMaxY</a> (<a href="terminal_interface-curses__ads.htm#ref_1400_7">Win</a>);
+      <span class="symbol"><a name="ref_1363_7">X</a></span> : <b>constant</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> := <a href="terminal_interface-curses__adb.htm#ref_1359_16">GetMaxX</a> (<a href="terminal_interface-curses__ads.htm#ref_1400_7">Win</a>);
+   <b>begin</b>
+      <a href="terminal_interface-curses__ads.htm#ref_1401_7">Number_Of_Lines</a>   := <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a> (<a href="terminal_interface-curses__adb.htm#ref_1362_7">Y</a>);
+      <a href="terminal_interface-curses__ads.htm#ref_1402_7">Number_Of_Columns</a> := <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a> (<a href="terminal_interface-curses__adb.htm#ref_1363_7">X</a>);
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1399_14">Get_Size</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1369_14" href="terminal_interface-curses__ads.htm#ref_1407_14">Get_Window_Position</a></span>
+     (<span class="symbol"><a name="ref_1370_7" href="terminal_interface-curses__ads.htm#ref_1408_7">Win</a></span>             : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_1371_7" href="terminal_interface-curses__ads.htm#ref_1409_7">Top_Left_Line</a></span>   : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_1372_7" href="terminal_interface-curses__ads.htm#ref_1410_7">Top_Left_Column</a></span> : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1374_16">GetBegY</a></span> (<span class="symbol"><a name="ref_1374_25">W</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, GetBegY, "getbegy");
+
+      <b>function</b> <span class="symbol"><a name="ref_1377_16">GetBegX</a></span> (<span class="symbol"><a name="ref_1377_25">W</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, GetBegX, "getbegx");
+
+      <span class="symbol"><a name="ref_1380_7">Y</a></span> : <b>constant</b> <a href="terminal_interface-curses-aux__ads.htm#ref_50_12">C_Short</a> := <a href="terminal_interface-curses-aux__ads.htm#ref_50_12">C_Short</a> (<a href="terminal_interface-curses__adb.htm#ref_1374_16">GetBegY</a> (<a href="terminal_interface-curses__ads.htm#ref_1408_7">Win</a>));
+      <span class="symbol"><a name="ref_1381_7">X</a></span> : <b>constant</b> <a href="terminal_interface-curses-aux__ads.htm#ref_50_12">C_Short</a> := <a href="terminal_interface-curses-aux__ads.htm#ref_50_12">C_Short</a> (<a href="terminal_interface-curses__adb.htm#ref_1377_16">GetBegX</a> (<a href="terminal_interface-curses__ads.htm#ref_1408_7">Win</a>));
+   <b>begin</b>
+      <a href="terminal_interface-curses__ads.htm#ref_1409_7">Top_Left_Line</a>   := <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a> (<a href="terminal_interface-curses__adb.htm#ref_1380_7">Y</a>);
+      <a href="terminal_interface-curses__ads.htm#ref_1410_7">Top_Left_Column</a> := <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a> (<a href="terminal_interface-curses__adb.htm#ref_1381_7">X</a>);
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1407_14">Get_Window_Position</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1387_14" href="terminal_interface-curses__ads.htm#ref_1415_14">Get_Cursor_Position</a></span>
+     (<span class="symbol"><a name="ref_1388_7" href="terminal_interface-curses__ads.htm#ref_1416_7">Win</a></span>    :  <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_1389_7" href="terminal_interface-curses__ads.htm#ref_1417_7">Line</a></span>   : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_1390_7" href="terminal_interface-curses__ads.htm#ref_1418_7">Column</a></span> : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1392_16">GetCurY</a></span> (<span class="symbol"><a name="ref_1392_25">W</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, GetCurY, "getcury");
+
+      <b>function</b> <span class="symbol"><a name="ref_1395_16">GetCurX</a></span> (<span class="symbol"><a name="ref_1395_25">W</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, GetCurX, "getcurx");
+
+      <span class="symbol"><a name="ref_1398_7">Y</a></span> : <b>constant</b> <a href="terminal_interface-curses-aux__ads.htm#ref_50_12">C_Short</a> := <a href="terminal_interface-curses-aux__ads.htm#ref_50_12">C_Short</a> (<a href="terminal_interface-curses__adb.htm#ref_1392_16">GetCurY</a> (<a href="terminal_interface-curses__ads.htm#ref_1416_7">Win</a>));
+      <span class="symbol"><a name="ref_1399_7">X</a></span> : <b>constant</b> <a href="terminal_interface-curses-aux__ads.htm#ref_50_12">C_Short</a> := <a href="terminal_interface-curses-aux__ads.htm#ref_50_12">C_Short</a> (<a href="terminal_interface-curses__adb.htm#ref_1395_16">GetCurX</a> (<a href="terminal_interface-curses__ads.htm#ref_1416_7">Win</a>));
+   <b>begin</b>
+      <a href="terminal_interface-curses__ads.htm#ref_1417_7">Line</a>   := <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a> (<a href="terminal_interface-curses__adb.htm#ref_1398_7">Y</a>);
+      <a href="terminal_interface-curses__ads.htm#ref_1418_7">Column</a> := <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a> (<a href="terminal_interface-curses__adb.htm#ref_1399_7">X</a>);
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1415_14">Get_Cursor_Position</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1405_14" href="terminal_interface-curses__ads.htm#ref_1423_14">Get_Origin_Relative_To_Parent</a></span>
+     (<span class="symbol"><a name="ref_1406_7" href="terminal_interface-curses__ads.htm#ref_1424_7">Win</a></span>                :  <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <span class="symbol"><a name="ref_1407_7" href="terminal_interface-curses__ads.htm#ref_1425_7">Top_Left_Line</a></span>      : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_1408_7" href="terminal_interface-curses__ads.htm#ref_1426_7">Top_Left_Column</a></span>    : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+      <span class="symbol"><a name="ref_1409_7" href="terminal_interface-curses__ads.htm#ref_1427_7">Is_Not_A_Subwindow</a></span> : <b>out</b> Boolean)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1411_16">GetParY</a></span> (<span class="symbol"><a name="ref_1411_25">W</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, GetParY, "getpary");
+
+      <b>function</b> <span class="symbol"><a name="ref_1414_16">GetParX</a></span> (<span class="symbol"><a name="ref_1414_25">W</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, GetParX, "getparx");
+
+      <span class="symbol"><a name="ref_1417_7">Y</a></span> : <b>constant</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> := <a href="terminal_interface-curses__adb.htm#ref_1411_16">GetParY</a> (<a href="terminal_interface-curses__ads.htm#ref_1424_7">Win</a>);
+      <span class="symbol"><a name="ref_1418_7">X</a></span> : <b>constant</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> := <a href="terminal_interface-curses__adb.htm#ref_1414_16">GetParX</a> (<a href="terminal_interface-curses__ads.htm#ref_1424_7">Win</a>);
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1417_7">Y</a> = -1 <b>then</b>
+         <a href="terminal_interface-curses__ads.htm#ref_1425_7">Top_Left_Line</a>   := <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>'Last;
+         <a href="terminal_interface-curses__ads.htm#ref_1426_7">Top_Left_Column</a> := <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>'Last;
+         <a href="terminal_interface-curses__ads.htm#ref_1427_7">Is_Not_A_Subwindow</a> := True;
+      <b>else</b>
+         <a href="terminal_interface-curses__ads.htm#ref_1425_7">Top_Left_Line</a>   := <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a> (<a href="terminal_interface-curses__adb.htm#ref_1417_7">Y</a>);
+         <a href="terminal_interface-curses__ads.htm#ref_1426_7">Top_Left_Column</a> := <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a> (<a href="terminal_interface-curses__adb.htm#ref_1418_7">X</a>);
+         <a href="terminal_interface-curses__ads.htm#ref_1427_7">Is_Not_A_Subwindow</a> := False;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1423_14">Get_Origin_Relative_To_Parent</a>;
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_1431_13" href="terminal_interface-curses__ads.htm#ref_1438_13">New_Pad</a></span> (<span class="symbol"><a name="ref_1431_22" href="terminal_interface-curses__ads.htm#ref_1438_22">Lines</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a>;
+                     <span class="symbol"><a name="ref_1432_22" href="terminal_interface-curses__ads.htm#ref_1439_22">Columns</a></span> : <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1434_16">Newpad</a></span> (<span class="symbol"><a name="ref_1434_24">Lines</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>; <span class="symbol"><a name="ref_1434_39">Columns</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <b>pragma</b> Import (C, Newpad, "newpad");
+
+      <span class="symbol"><a name="ref_1437_7">W</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+   <b>begin</b>
+      <a href="terminal_interface-curses__adb.htm#ref_1437_7">W</a> := <a href="terminal_interface-curses__adb.htm#ref_1434_16">Newpad</a> (<a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1438_22">Lines</a>), <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1439_22">Columns</a>));
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1437_7">W</a> = <a href="terminal_interface-curses__ads.htm#ref_57_4">Null_Window</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+      <b>return</b> <a href="terminal_interface-curses__adb.htm#ref_1437_7">W</a>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1438_13">New_Pad</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_1446_13" href="terminal_interface-curses__ads.htm#ref_1444_13">Sub_Pad</a></span>
+     (<span class="symbol"><a name="ref_1447_7" href="terminal_interface-curses__ads.htm#ref_1445_7">Pad</a></span>                   : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <span class="symbol"><a name="ref_1448_7" href="terminal_interface-curses__ads.htm#ref_1446_7">Number_Of_Lines</a></span>       : <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a>;
+      <span class="symbol"><a name="ref_1449_7" href="terminal_interface-curses__ads.htm#ref_1447_7">Number_Of_Columns</a></span>     : <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a>;
+      <span class="symbol"><a name="ref_1450_7" href="terminal_interface-curses__ads.htm#ref_1448_7">First_Line_Position</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_1451_7" href="terminal_interface-curses__ads.htm#ref_1449_7">First_Column_Position</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1453_16">Subpad</a></span>
+        (<span class="symbol"><a name="ref_1454_10">Pad</a></span>                   : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+         <span class="symbol"><a name="ref_1455_10">Number_Of_Lines</a></span>       : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+         <span class="symbol"><a name="ref_1456_10">Number_Of_Columns</a></span>     : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+         <span class="symbol"><a name="ref_1457_10">First_Line_Position</a></span>   : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+         <span class="symbol"><a name="ref_1458_10">First_Column_Position</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <b>pragma</b> Import (C, Subpad, "subpad");
+
+      <span class="symbol"><a name="ref_1461_7">W</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+   <b>begin</b>
+      <a href="terminal_interface-curses__adb.htm#ref_1461_7">W</a> := <a href="terminal_interface-curses__adb.htm#ref_1453_16">Subpad</a> (<a href="terminal_interface-curses__ads.htm#ref_1445_7">Pad</a>,
+                   <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1446_7">Number_Of_Lines</a>),
+                   <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1447_7">Number_Of_Columns</a>),
+                   <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1448_7">First_Line_Position</a>),
+                   <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1449_7">First_Column_Position</a>));
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1461_7">W</a> = <a href="terminal_interface-curses__ads.htm#ref_57_4">Null_Window</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+      <b>return</b> <a href="terminal_interface-curses__adb.htm#ref_1461_7">W</a>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1444_13">Sub_Pad</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1474_14" href="terminal_interface-curses__ads.htm#ref_1454_14">Refresh</a></span>
+     (<span class="symbol"><a name="ref_1475_7" href="terminal_interface-curses__ads.htm#ref_1455_7">Pad</a></span>                      : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <span class="symbol"><a name="ref_1476_7" href="terminal_interface-curses__ads.htm#ref_1456_7">Source_Top_Row</a></span>           : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_1477_7" href="terminal_interface-curses__ads.htm#ref_1457_7">Source_Left_Column</a></span>       : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+      <span class="symbol"><a name="ref_1478_7" href="terminal_interface-curses__ads.htm#ref_1458_7">Destination_Top_Row</a></span>      : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_1479_7" href="terminal_interface-curses__ads.htm#ref_1459_7">Destination_Left_Column</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+      <span class="symbol"><a name="ref_1480_7" href="terminal_interface-curses__ads.htm#ref_1460_7">Destination_Bottom_Row</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_1481_7" href="terminal_interface-curses__ads.htm#ref_1461_7">Destination_Right_Column</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1483_16">Prefresh</a></span>
+        (<span class="symbol"><a name="ref_1484_10">Pad</a></span>                      : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+         <span class="symbol"><a name="ref_1485_10">Source_Top_Row</a></span>           : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+         <span class="symbol"><a name="ref_1486_10">Source_Left_Column</a></span>       : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+         <span class="symbol"><a name="ref_1487_10">Destination_Top_Row</a></span>      : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+         <span class="symbol"><a name="ref_1488_10">Destination_Left_Column</a></span>  : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+         <span class="symbol"><a name="ref_1489_10">Destination_Bottom_Row</a></span>   : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+         <span class="symbol"><a name="ref_1490_10">Destination_Right_Column</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Prefresh, "prefresh");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1483_16">Prefresh</a> (<a href="terminal_interface-curses__ads.htm#ref_1455_7">Pad</a>,
+                   <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1456_7">Source_Top_Row</a>),
+                   <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1457_7">Source_Left_Column</a>),
+                   <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1458_7">Destination_Top_Row</a>),
+                   <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1459_7">Destination_Left_Column</a>),
+                   <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1460_7">Destination_Bottom_Row</a>),
+                   <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1461_7">Destination_Right_Column</a>)) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a>
+      <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1454_14">Refresh</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1505_14" href="terminal_interface-curses__ads.htm#ref_1466_14">Refresh_Without_Update</a></span>
+     (<span class="symbol"><a name="ref_1506_7" href="terminal_interface-curses__ads.htm#ref_1467_7">Pad</a></span>                      : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <span class="symbol"><a name="ref_1507_7" href="terminal_interface-curses__ads.htm#ref_1468_7">Source_Top_Row</a></span>           : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_1508_7" href="terminal_interface-curses__ads.htm#ref_1469_7">Source_Left_Column</a></span>       : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+      <span class="symbol"><a name="ref_1509_7" href="terminal_interface-curses__ads.htm#ref_1470_7">Destination_Top_Row</a></span>      : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_1510_7" href="terminal_interface-curses__ads.htm#ref_1471_7">Destination_Left_Column</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+      <span class="symbol"><a name="ref_1511_7" href="terminal_interface-curses__ads.htm#ref_1472_7">Destination_Bottom_Row</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_1512_7" href="terminal_interface-curses__ads.htm#ref_1473_7">Destination_Right_Column</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1514_16">Pnoutrefresh</a></span>
+        (<span class="symbol"><a name="ref_1515_10">Pad</a></span>                      : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+         <span class="symbol"><a name="ref_1516_10">Source_Top_Row</a></span>           : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+         <span class="symbol"><a name="ref_1517_10">Source_Left_Column</a></span>       : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+         <span class="symbol"><a name="ref_1518_10">Destination_Top_Row</a></span>      : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+         <span class="symbol"><a name="ref_1519_10">Destination_Left_Column</a></span>  : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+         <span class="symbol"><a name="ref_1520_10">Destination_Bottom_Row</a></span>   : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+         <span class="symbol"><a name="ref_1521_10">Destination_Right_Column</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Pnoutrefresh, "pnoutrefresh");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1514_16">Pnoutrefresh</a> (<a href="terminal_interface-curses__ads.htm#ref_1467_7">Pad</a>,
+                       <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1468_7">Source_Top_Row</a>),
+                       <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1469_7">Source_Left_Column</a>),
+                       <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1470_7">Destination_Top_Row</a>),
+                       <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1471_7">Destination_Left_Column</a>),
+                       <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1472_7">Destination_Bottom_Row</a>),
+                       <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1473_7">Destination_Right_Column</a>)) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a>
+      <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1466_14">Refresh_Without_Update</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1536_14" href="terminal_interface-curses__ads.htm#ref_1478_14">Add_Character_To_Pad_And_Echo_It</a></span>
+     (<span class="symbol"><a name="ref_1537_7" href="terminal_interface-curses__ads.htm#ref_1479_7">Pad</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <span class="symbol"><a name="ref_1538_7" href="terminal_interface-curses__ads.htm#ref_1480_7">Ch</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1540_16">Pechochar</a></span> (<span class="symbol"><a name="ref_1540_27">Pad</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>; <span class="symbol"><a name="ref_1540_41">Ch</a></span> : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>)
+                          <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Pechochar, "pechochar");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1540_16">Pechochar</a> (<a href="terminal_interface-curses__ads.htm#ref_1479_7">Pad</a>, <a href="terminal_interface-curses__ads.htm#ref_1480_7">Ch</a>) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1478_14">Add_Character_To_Pad_And_Echo_It</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1549_14" href="terminal_interface-curses__ads.htm#ref_1483_14">Add_Character_To_Pad_And_Echo_It</a></span>
+     (<span class="symbol"><a name="ref_1550_7" href="terminal_interface-curses__ads.htm#ref_1484_7">Pad</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <span class="symbol"><a name="ref_1551_7" href="terminal_interface-curses__ads.htm#ref_1485_7">Ch</a></span>  : Character)
+   <b>is</b>
+   <b>begin</b>
+      <a href="terminal_interface-curses__ads.htm#ref_1478_14">Add_Character_To_Pad_And_Echo_It</a>
+        (<a href="terminal_interface-curses__ads.htm#ref_1484_7">Pad</a>,
+         <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>'(<a href="terminal_interface-curses__ads.htm#ref_492_10">Ch</a>    =&gt; <a href="terminal_interface-curses__ads.htm#ref_1485_7">Ch</a>,
+                               <a href="terminal_interface-curses__ads.htm#ref_491_10">Color</a> =&gt; <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>'First,
+                               <a href="terminal_interface-curses__ads.htm#ref_490_10">Attr</a>  =&gt; <a href="terminal_interface-curses__ads.htm#ref_486_4">Normal_Video</a>));
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1483_14">Add_Character_To_Pad_And_Echo_It</a>;
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1561_14" href="terminal_interface-curses__ads.htm#ref_1493_14">Scroll</a></span> (<span class="symbol"><a name="ref_1561_22" href="terminal_interface-curses__ads.htm#ref_1493_22">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                     <span class="symbol"><a name="ref_1562_22" href="terminal_interface-curses__ads.htm#ref_1494_22">Amount</a></span> : Integer := 1)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1564_16">Wscrl</a></span> (<span class="symbol"><a name="ref_1564_23">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>; <span class="symbol"><a name="ref_1564_37">N</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Wscrl, "wscrl");
+
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1564_16">Wscrl</a> (<a href="terminal_interface-curses__ads.htm#ref_1493_22">Win</a>, <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1494_22">Amount</a>)) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1493_14">Scroll</a>;
+
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1574_14" href="terminal_interface-curses__ads.htm#ref_1505_14">Delete_Character</a></span> (<span class="symbol"><a name="ref_1574_32" href="terminal_interface-curses__ads.htm#ref_1505_32">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1576_16">Wdelch</a></span> (<span class="symbol"><a name="ref_1576_24">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Wdelch, "wdelch");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1576_16">Wdelch</a> (<a href="terminal_interface-curses__ads.htm#ref_1505_32">Win</a>) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1505_14">Delete_Character</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1584_14" href="terminal_interface-curses__ads.htm#ref_1510_14">Delete_Character</a></span>
+     (<span class="symbol"><a name="ref_1585_7" href="terminal_interface-curses__ads.htm#ref_1511_7">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_1586_7" href="terminal_interface-curses__ads.htm#ref_1512_7">Line</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_1587_7" href="terminal_interface-curses__ads.htm#ref_1513_7">Column</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1589_16">Mvwdelch</a></span> (<span class="symbol"><a name="ref_1589_26">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+                         <span class="symbol"><a name="ref_1590_26">Lin</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+                         <span class="symbol"><a name="ref_1591_26">Col</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Mvwdelch, "mvwdelch");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1589_16">Mvwdelch</a> (<a href="terminal_interface-curses__ads.htm#ref_1511_7">Win</a>, <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1512_7">Line</a>), <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1513_7">Column</a>)) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1510_14">Delete_Character</a>;
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_1599_13" href="terminal_interface-curses__ads.htm#ref_1523_13">Peek</a></span> (<span class="symbol"><a name="ref_1599_19" href="terminal_interface-curses__ads.htm#ref_1523_19">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>)
+     <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1602_16">Winch</a></span> (<span class="symbol"><a name="ref_1602_23">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>;
+      <b>pragma</b> Import (C, Winch, "winch");
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses__adb.htm#ref_1602_16">Winch</a> (<a href="terminal_interface-curses__ads.htm#ref_1523_19">Win</a>);
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1523_13">Peek</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_1608_13" href="terminal_interface-curses__ads.htm#ref_1529_13">Peek</a></span>
+     (<span class="symbol"><a name="ref_1609_7" href="terminal_interface-curses__ads.htm#ref_1530_7">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_1610_7" href="terminal_interface-curses__ads.htm#ref_1531_7">Line</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_1611_7" href="terminal_interface-curses__ads.htm#ref_1532_7">Column</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1613_16">Mvwinch</a></span> (<span class="symbol"><a name="ref_1613_25">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+                        <span class="symbol"><a name="ref_1614_25">Lin</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+                        <span class="symbol"><a name="ref_1615_25">Col</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>;
+      <b>pragma</b> Import (C, Mvwinch, "mvwinch");
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses__adb.htm#ref_1613_16">Mvwinch</a> (<a href="terminal_interface-curses__ads.htm#ref_1530_7">Win</a>, <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1531_7">Line</a>), <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1532_7">Column</a>));
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1529_13">Peek</a>;
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1621_14" href="terminal_interface-curses__ads.htm#ref_1542_14">Insert</a></span> (<span class="symbol"><a name="ref_1621_22" href="terminal_interface-curses__ads.htm#ref_1542_22">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                     <span class="symbol"><a name="ref_1622_22" href="terminal_interface-curses__ads.htm#ref_1543_22">Ch</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1624_16">Winsch</a></span> (<span class="symbol"><a name="ref_1624_24">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>; <span class="symbol"><a name="ref_1624_38">Ch</a></span> : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Winsch, "winsch");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1624_16">Winsch</a> (<a href="terminal_interface-curses__ads.htm#ref_1542_22">Win</a>, <a href="terminal_interface-curses__ads.htm#ref_1543_22">Ch</a>) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1542_14">Insert</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1632_14" href="terminal_interface-curses__ads.htm#ref_1548_14">Insert</a></span>
+     (<span class="symbol"><a name="ref_1633_7" href="terminal_interface-curses__ads.htm#ref_1548_22">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_1634_7" href="terminal_interface-curses__ads.htm#ref_1549_22">Line</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_1635_7" href="terminal_interface-curses__ads.htm#ref_1550_22">Column</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+      <span class="symbol"><a name="ref_1636_7" href="terminal_interface-curses__ads.htm#ref_1551_22">Ch</a></span>     : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1638_16">Mvwinsch</a></span> (<span class="symbol"><a name="ref_1638_26">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+                         <span class="symbol"><a name="ref_1639_26">Lin</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+                         <span class="symbol"><a name="ref_1640_26">Col</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+                         <span class="symbol"><a name="ref_1641_26">Ch</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Mvwinsch, "mvwinsch");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1638_16">Mvwinsch</a> (<a href="terminal_interface-curses__ads.htm#ref_1548_22">Win</a>,
+                   <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1549_22">Line</a>),
+                   <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1550_22">Column</a>),
+                   <a href="terminal_interface-curses__ads.htm#ref_1551_22">Ch</a>) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a>
+      <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1548_14">Insert</a>;
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1653_14" href="terminal_interface-curses__ads.htm#ref_1560_14">Insert</a></span> (<span class="symbol"><a name="ref_1653_22" href="terminal_interface-curses__ads.htm#ref_1560_22">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                     <span class="symbol"><a name="ref_1654_22" href="terminal_interface-curses__ads.htm#ref_1561_22">Str</a></span> : String;
+                     <span class="symbol"><a name="ref_1655_22" href="terminal_interface-curses__ads.htm#ref_1562_22">Len</a></span> : Integer := -1)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1657_16">Winsnstr</a></span> (<span class="symbol"><a name="ref_1657_26">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+                         <span class="symbol"><a name="ref_1658_26">Str</a></span> : char_array;
+                         <span class="symbol"><a name="ref_1659_26">Len</a></span> : Integer := -1) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Winsnstr, "winsnstr");
+
+      <span class="symbol"><a name="ref_1662_7">Txt</a></span>    : char_array (0 .. <a href="terminal_interface-curses__ads.htm#ref_1561_22">Str</a>'Length);
+      <span class="symbol"><a name="ref_1663_7">Length</a></span> : size_t;
+   <b>begin</b>
+      To_C (<a href="terminal_interface-curses__ads.htm#ref_1561_22">Str</a>, <a href="terminal_interface-curses__adb.htm#ref_1662_7">Txt</a>, <a href="terminal_interface-curses__adb.htm#ref_1663_7">Length</a>);
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1657_16">Winsnstr</a> (<a href="terminal_interface-curses__ads.htm#ref_1560_22">Win</a>, <a href="terminal_interface-curses__adb.htm#ref_1662_7">Txt</a>, <a href="terminal_interface-curses__ads.htm#ref_1562_22">Len</a>) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1560_14">Insert</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1671_14" href="terminal_interface-curses__ads.htm#ref_1569_14">Insert</a></span>
+     (<span class="symbol"><a name="ref_1672_7" href="terminal_interface-curses__ads.htm#ref_1569_22">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_1673_7" href="terminal_interface-curses__ads.htm#ref_1570_22">Line</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_1674_7" href="terminal_interface-curses__ads.htm#ref_1571_22">Column</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+      <span class="symbol"><a name="ref_1675_7" href="terminal_interface-curses__ads.htm#ref_1572_22">Str</a></span>    : String;
+      <span class="symbol"><a name="ref_1676_7" href="terminal_interface-curses__ads.htm#ref_1573_22">Len</a></span>    : Integer := -1)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1678_16">Mvwinsnstr</a></span> (<span class="symbol"><a name="ref_1678_28">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+                           <span class="symbol"><a name="ref_1679_28">Line</a></span>   : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+                           <span class="symbol"><a name="ref_1680_28">Column</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+                           <span class="symbol"><a name="ref_1681_28">Str</a></span>    : char_array;
+                           <span class="symbol"><a name="ref_1682_28">Len</a></span>    : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Mvwinsnstr, "mvwinsnstr");
+
+      <span class="symbol"><a name="ref_1685_7">Txt</a></span>    : char_array (0 .. <a href="terminal_interface-curses__ads.htm#ref_1572_22">Str</a>'Length);
+      <span class="symbol"><a name="ref_1686_7">Length</a></span> : size_t;
+   <b>begin</b>
+      To_C (<a href="terminal_interface-curses__ads.htm#ref_1572_22">Str</a>, <a href="terminal_interface-curses__adb.htm#ref_1685_7">Txt</a>, <a href="terminal_interface-curses__adb.htm#ref_1686_7">Length</a>);
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1678_16">Mvwinsnstr</a> (<a href="terminal_interface-curses__ads.htm#ref_1569_22">Win</a>, <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1570_22">Line</a>), <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1571_22">Column</a>), <a href="terminal_interface-curses__adb.htm#ref_1685_7">Txt</a>, <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1573_22">Len</a>))
+        = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a>
+      <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1569_14">Insert</a>;
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1696_14" href="terminal_interface-curses__ads.htm#ref_1585_14">Peek</a></span> (<span class="symbol"><a name="ref_1696_20" href="terminal_interface-curses__ads.htm#ref_1585_20">Win</a></span> :  <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                   <span class="symbol"><a name="ref_1697_20" href="terminal_interface-curses__ads.htm#ref_1586_20">Str</a></span> : <b>out</b> String;
+                   <span class="symbol"><a name="ref_1698_20" href="terminal_interface-curses__ads.htm#ref_1587_20">Len</a></span> :  Integer := -1)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1700_16">Winnstr</a></span> (<span class="symbol"><a name="ref_1700_25">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+                        <span class="symbol"><a name="ref_1701_25">Str</a></span> : char_array;
+                        <span class="symbol"><a name="ref_1702_25">Len</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Winnstr, "winnstr");
+
+      <span class="symbol"><a name="ref_1705_7">N</a></span>   : Integer := <a href="terminal_interface-curses__ads.htm#ref_1587_20">Len</a>;
+      <span class="symbol"><a name="ref_1706_7">Txt</a></span> : char_array (0 .. <a href="terminal_interface-curses__ads.htm#ref_1586_20">Str</a>'Length);
+      <span class="symbol"><a name="ref_1707_7">Cnt</a></span> : Natural;
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1705_7">N</a> &lt; 0 <b>then</b>
+         <a href="terminal_interface-curses__adb.htm#ref_1705_7">N</a> := <a href="terminal_interface-curses__ads.htm#ref_1586_20">Str</a>'Length;
+      <b>end</b> <b>if</b>;
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1705_7">N</a> &gt; <a href="terminal_interface-curses__ads.htm#ref_1586_20">Str</a>'Length <b>then</b>
+         <b>raise</b> Constraint_Error;
+      <b>end</b> <b>if</b>;
+      <a href="terminal_interface-curses__adb.htm#ref_1706_7">Txt</a> (0) := <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.char'First;
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1700_16">Winnstr</a> (<a href="terminal_interface-curses__ads.htm#ref_1585_20">Win</a>, <a href="terminal_interface-curses__adb.htm#ref_1706_7">Txt</a>, <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__adb.htm#ref_1705_7">N</a>)) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+      To_Ada (<a href="terminal_interface-curses__adb.htm#ref_1706_7">Txt</a>, <a href="terminal_interface-curses__ads.htm#ref_1586_20">Str</a>, <a href="terminal_interface-curses__adb.htm#ref_1707_7">Cnt</a>, True);
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1707_7">Cnt</a> &lt; <a href="terminal_interface-curses__ads.htm#ref_1586_20">Str</a>'Length <b>then</b>
+         <a href="terminal_interface-curses__ads.htm#ref_1586_20">Str</a> ((<a href="terminal_interface-curses__ads.htm#ref_1586_20">Str</a>'First + <a href="terminal_interface-curses__adb.htm#ref_1707_7">Cnt</a>) .. <a href="terminal_interface-curses__ads.htm#ref_1586_20">Str</a>'Last) := (<b>others</b> =&gt; ' ');
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1585_14">Peek</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1725_14" href="terminal_interface-curses__ads.htm#ref_1594_14">Peek</a></span>
+     (<span class="symbol"><a name="ref_1726_7" href="terminal_interface-curses__ads.htm#ref_1594_20">Win</a></span>    :  <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_1727_7" href="terminal_interface-curses__ads.htm#ref_1595_20">Line</a></span>   :  <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_1728_7" href="terminal_interface-curses__ads.htm#ref_1596_20">Column</a></span> :  <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+      <span class="symbol"><a name="ref_1729_7" href="terminal_interface-curses__ads.htm#ref_1597_20">Str</a></span>    : <b>out</b> String;
+      <span class="symbol"><a name="ref_1730_7" href="terminal_interface-curses__ads.htm#ref_1598_20">Len</a></span>    :  Integer := -1)
+   <b>is</b>
+   <b>begin</b>
+      <a href="terminal_interface-curses__ads.htm#ref_682_14">Move_Cursor</a> (<a href="terminal_interface-curses__ads.htm#ref_1594_20">Win</a>, <a href="terminal_interface-curses__ads.htm#ref_1595_20">Line</a>, <a href="terminal_interface-curses__ads.htm#ref_1596_20">Column</a>);
+      <a href="terminal_interface-curses__ads.htm#ref_1585_14">Peek</a> (<a href="terminal_interface-curses__ads.htm#ref_1594_20">Win</a>, <a href="terminal_interface-curses__ads.htm#ref_1597_20">Str</a>, <a href="terminal_interface-curses__ads.htm#ref_1598_20">Len</a>);
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1594_14">Peek</a>;
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1737_14" href="terminal_interface-curses__ads.htm#ref_1609_14">Peek</a></span>
+     (<span class="symbol"><a name="ref_1738_7" href="terminal_interface-curses__ads.htm#ref_1609_20">Win</a></span> :  <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_1739_7" href="terminal_interface-curses__ads.htm#ref_1610_20">Str</a></span> : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_510_4">Attributed_String</a>;
+      <span class="symbol"><a name="ref_1740_7" href="terminal_interface-curses__ads.htm#ref_1611_20">Len</a></span> :  Integer := -1)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1742_16">Winchnstr</a></span> (<span class="symbol"><a name="ref_1742_27">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+                          <span class="symbol"><a name="ref_1743_27">Str</a></span> : chtype_array;             <span class="comment"><em>-- out</em></span>
+                          <span class="symbol"><a name="ref_1744_27">Len</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Winchnstr, "winchnstr");
+
+      <span class="symbol"><a name="ref_1747_7">N</a></span>   : Integer := <a href="terminal_interface-curses__ads.htm#ref_1611_20">Len</a>;
+      <span class="symbol"><a name="ref_1748_7">Txt</a></span> : <b>constant</b> chtype_array (0 .. <a href="terminal_interface-curses__ads.htm#ref_1610_20">Str</a>'Length)
+          := (0 =&gt; <a href="terminal_interface-curses__ads.htm#ref_510_4">Default_Character</a>);
+      <span class="symbol"><a name="ref_1750_7">Cnt</a></span> : Natural := 0;
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1747_7">N</a> &lt; 0 <b>then</b>
+         <a href="terminal_interface-curses__adb.htm#ref_1747_7">N</a> := <a href="terminal_interface-curses__ads.htm#ref_1610_20">Str</a>'Length;
+      <b>end</b> <b>if</b>;
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1747_7">N</a> &gt; <a href="terminal_interface-curses__ads.htm#ref_1610_20">Str</a>'Length <b>then</b>
+         <b>raise</b> Constraint_Error;
+      <b>end</b> <b>if</b>;
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1742_16">Winchnstr</a> (<a href="terminal_interface-curses__ads.htm#ref_1609_20">Win</a>, <a href="terminal_interface-curses__adb.htm#ref_1748_7">Txt</a>, <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__adb.htm#ref_1747_7">N</a>)) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+      <b>for</b> <span class="symbol"><a name="ref_1761_11">To</a></span> <b>in</b> <a href="terminal_interface-curses__ads.htm#ref_1610_20">Str</a>'<b>Range</b> <b>loop</b>
+         <b>exit</b> <b>when</b> <a href="terminal_interface-curses__adb.htm#ref_1748_7">Txt</a> (size_t (<a href="terminal_interface-curses__adb.htm#ref_1750_7">Cnt</a>)) = <a href="terminal_interface-curses__ads.htm#ref_510_4">Default_Character</a>;
+         <a href="terminal_interface-curses__ads.htm#ref_1610_20">Str</a> (<a href="terminal_interface-curses__adb.htm#ref_1761_11">To</a>) := <a href="terminal_interface-curses__adb.htm#ref_1748_7">Txt</a> (size_t (<a href="terminal_interface-curses__adb.htm#ref_1750_7">Cnt</a>));
+         <a href="terminal_interface-curses__adb.htm#ref_1750_7">Cnt</a> := <a href="terminal_interface-curses__adb.htm#ref_1750_7">Cnt</a> + 1;
+      <b>end</b> <b>loop</b>;
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1750_7">Cnt</a> &lt; <a href="terminal_interface-curses__ads.htm#ref_1610_20">Str</a>'Length <b>then</b>
+         <a href="terminal_interface-curses__ads.htm#ref_1610_20">Str</a> ((<a href="terminal_interface-curses__ads.htm#ref_1610_20">Str</a>'First + <a href="terminal_interface-curses__adb.htm#ref_1750_7">Cnt</a>) .. <a href="terminal_interface-curses__ads.htm#ref_1610_20">Str</a>'Last) :=
+           (<b>others</b> =&gt; (<a href="terminal_interface-curses__ads.htm#ref_492_10">Ch</a> =&gt; ' ',
+                       <a href="terminal_interface-curses__ads.htm#ref_491_10">Color</a> =&gt; <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>'First,
+                       <a href="terminal_interface-curses__ads.htm#ref_490_10">Attr</a> =&gt; <a href="terminal_interface-curses__ads.htm#ref_486_4">Normal_Video</a>));
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1609_14">Peek</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1774_14" href="terminal_interface-curses__ads.htm#ref_1618_14">Peek</a></span>
+     (<span class="symbol"><a name="ref_1775_7" href="terminal_interface-curses__ads.htm#ref_1618_20">Win</a></span>    :  <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_1776_7" href="terminal_interface-curses__ads.htm#ref_1619_20">Line</a></span>   :  <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_1777_7" href="terminal_interface-curses__ads.htm#ref_1620_20">Column</a></span> :  <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+      <span class="symbol"><a name="ref_1778_7" href="terminal_interface-curses__ads.htm#ref_1621_20">Str</a></span>    : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_510_4">Attributed_String</a>;
+      <span class="symbol"><a name="ref_1779_7" href="terminal_interface-curses__ads.htm#ref_1622_20">Len</a></span>    : Integer := -1)
+   <b>is</b>
+   <b>begin</b>
+      <a href="terminal_interface-curses__ads.htm#ref_682_14">Move_Cursor</a> (<a href="terminal_interface-curses__ads.htm#ref_1618_20">Win</a>, <a href="terminal_interface-curses__ads.htm#ref_1619_20">Line</a>, <a href="terminal_interface-curses__ads.htm#ref_1620_20">Column</a>);
+      <a href="terminal_interface-curses__ads.htm#ref_1609_14">Peek</a> (<a href="terminal_interface-curses__ads.htm#ref_1618_20">Win</a>, <a href="terminal_interface-curses__ads.htm#ref_1621_20">Str</a>, <a href="terminal_interface-curses__ads.htm#ref_1622_20">Len</a>);
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1618_14">Peek</a>;
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1786_14" href="terminal_interface-curses__ads.htm#ref_1634_14">Get</a></span> (<span class="symbol"><a name="ref_1786_19" href="terminal_interface-curses__ads.htm#ref_1634_19">Win</a></span> :  <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                  <span class="symbol"><a name="ref_1787_19" href="terminal_interface-curses__ads.htm#ref_1635_19">Str</a></span> : <b>out</b> String;
+                  <span class="symbol"><a name="ref_1788_19" href="terminal_interface-curses__ads.htm#ref_1636_19">Len</a></span> :  Integer := -1)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1790_16">Wgetnstr</a></span> (<span class="symbol"><a name="ref_1790_26">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+                         <span class="symbol"><a name="ref_1791_26">Str</a></span> : char_array;
+                         <span class="symbol"><a name="ref_1792_26">Len</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Wgetnstr, "wgetnstr");
+
+      <span class="symbol"><a name="ref_1795_7">N</a></span>   : Integer := <a href="terminal_interface-curses__ads.htm#ref_1636_19">Len</a>;
+      <span class="symbol"><a name="ref_1796_7">Txt</a></span> : char_array (0 .. <a href="terminal_interface-curses__ads.htm#ref_1635_19">Str</a>'Length);
+      <span class="symbol"><a name="ref_1797_7">Cnt</a></span> : Natural;
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1795_7">N</a> &lt; 0 <b>then</b>
+         <a href="terminal_interface-curses__adb.htm#ref_1795_7">N</a> := <a href="terminal_interface-curses__ads.htm#ref_1635_19">Str</a>'Length;
+      <b>end</b> <b>if</b>;
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1795_7">N</a> &gt; <a href="terminal_interface-curses__ads.htm#ref_1635_19">Str</a>'Length <b>then</b>
+         <b>raise</b> Constraint_Error;
+      <b>end</b> <b>if</b>;
+      <a href="terminal_interface-curses__adb.htm#ref_1796_7">Txt</a> (0) := <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.char'First;
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1790_16">Wgetnstr</a> (<a href="terminal_interface-curses__ads.htm#ref_1634_19">Win</a>, <a href="terminal_interface-curses__adb.htm#ref_1796_7">Txt</a>, <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__adb.htm#ref_1795_7">N</a>)) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+      To_Ada (<a href="terminal_interface-curses__adb.htm#ref_1796_7">Txt</a>, <a href="terminal_interface-curses__ads.htm#ref_1635_19">Str</a>, <a href="terminal_interface-curses__adb.htm#ref_1797_7">Cnt</a>, True);
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1797_7">Cnt</a> &lt; <a href="terminal_interface-curses__ads.htm#ref_1635_19">Str</a>'Length <b>then</b>
+         <a href="terminal_interface-curses__ads.htm#ref_1635_19">Str</a> ((<a href="terminal_interface-curses__ads.htm#ref_1635_19">Str</a>'First + <a href="terminal_interface-curses__adb.htm#ref_1797_7">Cnt</a>) .. <a href="terminal_interface-curses__ads.htm#ref_1635_19">Str</a>'Last) := (<b>others</b> =&gt; ' ');
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1634_14">Get</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1815_14" href="terminal_interface-curses__ads.htm#ref_1645_14">Get</a></span>
+     (<span class="symbol"><a name="ref_1816_7" href="terminal_interface-curses__ads.htm#ref_1645_19">Win</a></span>    :  <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_1817_7" href="terminal_interface-curses__ads.htm#ref_1646_19">Line</a></span>   :  <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_1818_7" href="terminal_interface-curses__ads.htm#ref_1647_19">Column</a></span> :  <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+      <span class="symbol"><a name="ref_1819_7" href="terminal_interface-curses__ads.htm#ref_1648_19">Str</a></span>    : <b>out</b> String;
+      <span class="symbol"><a name="ref_1820_7" href="terminal_interface-curses__ads.htm#ref_1649_19">Len</a></span>    :  Integer := -1)
+   <b>is</b>
+   <b>begin</b>
+      <a href="terminal_interface-curses__ads.htm#ref_682_14">Move_Cursor</a> (<a href="terminal_interface-curses__ads.htm#ref_1645_19">Win</a>, <a href="terminal_interface-curses__ads.htm#ref_1646_19">Line</a>, <a href="terminal_interface-curses__ads.htm#ref_1647_19">Column</a>);
+      <a href="terminal_interface-curses__ads.htm#ref_1634_14">Get</a> (<a href="terminal_interface-curses__ads.htm#ref_1645_19">Win</a>, <a href="terminal_interface-curses__ads.htm#ref_1648_19">Str</a>, <a href="terminal_interface-curses__ads.htm#ref_1649_19">Len</a>);
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1645_14">Get</a>;
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1827_14" href="terminal_interface-curses__ads.htm#ref_1670_14">Init_Soft_Label_Keys</a></span>
+     (<span class="symbol"><a name="ref_1828_7" href="terminal_interface-curses__ads.htm#ref_1671_7">Format</a></span> : <a href="terminal_interface-curses__ads.htm#ref_1662_9">Soft_Label_Key_Format</a> := <a href="terminal_interface-curses__ads.htm#ref_1662_35">Three_Two_Three</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1830_16">Slk_Init</a></span> (<span class="symbol"><a name="ref_1830_26">Fmt</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Slk_Init, "slk_init");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1830_16">Slk_Init</a> (<a href="terminal_interface-curses__ads.htm#ref_1662_9">Soft_Label_Key_Format</a>'Pos (<a href="terminal_interface-curses__ads.htm#ref_1671_7">Format</a>)) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1670_14">Init_Soft_Label_Keys</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1838_14" href="terminal_interface-curses__ads.htm#ref_1676_14">Set_Soft_Label_Key</a></span> (<span class="symbol"><a name="ref_1838_34" href="terminal_interface-curses__ads.htm#ref_1676_34">Label</a></span> : <a href="terminal_interface-curses__ads.htm#ref_1666_9">Label_Number</a>;
+                                 <span class="symbol"><a name="ref_1839_34" href="terminal_interface-curses__ads.htm#ref_1677_34">Text</a></span>  : String;
+                                 <span class="symbol"><a name="ref_1840_34" href="terminal_interface-curses__ads.htm#ref_1678_34">Fmt</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_1667_9">Label_Justification</a> := <a href="terminal_interface-curses__ads.htm#ref_1667_33">Left</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1842_16">Slk_Set</a></span> (<span class="symbol"><a name="ref_1842_25">Label</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+                        <span class="symbol"><a name="ref_1843_25">Txt</a></span>   : char_array;
+                        <span class="symbol"><a name="ref_1844_25">Fmt</a></span>   : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Slk_Set, "slk_set");
+
+      <span class="symbol"><a name="ref_1847_7">Txt</a></span> : char_array (0 .. <a href="terminal_interface-curses__ads.htm#ref_1677_34">Text</a>'Length);
+      <span class="symbol"><a name="ref_1848_7">Len</a></span> : size_t;
+   <b>begin</b>
+      To_C (<a href="terminal_interface-curses__ads.htm#ref_1677_34">Text</a>, <a href="terminal_interface-curses__adb.htm#ref_1847_7">Txt</a>, <a href="terminal_interface-curses__adb.htm#ref_1848_7">Len</a>);
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1842_16">Slk_Set</a> (<a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1676_34">Label</a>), <a href="terminal_interface-curses__adb.htm#ref_1847_7">Txt</a>,
+                  <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1667_9">Label_Justification</a>'Pos (<a href="terminal_interface-curses__ads.htm#ref_1678_34">Fmt</a>))) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a>
+      <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1676_14">Set_Soft_Label_Key</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1858_14" href="terminal_interface-curses__ads.htm#ref_1683_14">Refresh_Soft_Label_Keys</a></span>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1860_16">Slk_Refresh</a></span> <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Slk_Refresh, "slk_refresh");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1860_16">Slk_Refresh</a> = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1683_14">Refresh_Soft_Label_Keys</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1868_14" href="terminal_interface-curses__ads.htm#ref_1688_14">Refresh_Soft_Label_Keys_Without_Update</a></span>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1870_16">Slk_Noutrefresh</a></span> <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Slk_Noutrefresh, "slk_noutrefresh");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1870_16">Slk_Noutrefresh</a> = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1688_14">Refresh_Soft_Label_Keys_Without_Update</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1878_14" href="terminal_interface-curses__ads.htm#ref_1693_14">Get_Soft_Label_Key</a></span> (<span class="symbol"><a name="ref_1878_34" href="terminal_interface-curses__ads.htm#ref_1693_34">Label</a></span> : <a href="terminal_interface-curses__ads.htm#ref_1666_9">Label_Number</a>;
+                                 <span class="symbol"><a name="ref_1879_34" href="terminal_interface-curses__ads.htm#ref_1694_34">Text</a></span>  : <b>out</b> String)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1881_16">Slk_Label</a></span> (<span class="symbol"><a name="ref_1881_27">Label</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> chars_ptr;
+      <b>pragma</b> Import (C, Slk_Label, "slk_label");
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_91_14">Fill_String</a> (<a href="terminal_interface-curses__adb.htm#ref_1881_16">Slk_Label</a> (<a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1693_34">Label</a>)), <a href="terminal_interface-curses__ads.htm#ref_1694_34">Text</a>);
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1693_14">Get_Soft_Label_Key</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_1887_13" href="terminal_interface-curses__ads.htm#ref_1698_13">Get_Soft_Label_Key</a></span> (<span class="symbol"><a name="ref_1887_33" href="terminal_interface-curses__ads.htm#ref_1698_33">Label</a></span> : <a href="terminal_interface-curses__ads.htm#ref_1666_9">Label_Number</a>) <b>return</b> String
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1889_16">Slk_Label</a></span> (<span class="symbol"><a name="ref_1889_27">Label</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> chars_ptr;
+      <b>pragma</b> Import (C, Slk_Label, "slk_label");
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_96_13">Fill_String</a> (<a href="terminal_interface-curses__adb.htm#ref_1889_16">Slk_Label</a> (<a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1698_33">Label</a>)));
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1698_13">Get_Soft_Label_Key</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1895_14" href="terminal_interface-curses__ads.htm#ref_1704_14">Clear_Soft_Label_Keys</a></span>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1897_16">Slk_Clear</a></span> <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Slk_Clear, "slk_clear");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1897_16">Slk_Clear</a> = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1704_14">Clear_Soft_Label_Keys</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1905_14" href="terminal_interface-curses__ads.htm#ref_1709_14">Restore_Soft_Label_Keys</a></span>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1907_16">Slk_Restore</a></span> <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Slk_Restore, "slk_restore");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1907_16">Slk_Restore</a> = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1709_14">Restore_Soft_Label_Keys</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1915_14" href="terminal_interface-curses__ads.htm#ref_1714_14">Touch_Soft_Label_Keys</a></span>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1917_16">Slk_Touch</a></span> <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Slk_Touch, "slk_touch");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1917_16">Slk_Touch</a> = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1714_14">Touch_Soft_Label_Keys</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1925_14" href="terminal_interface-curses__ads.htm#ref_1719_14">Switch_Soft_Label_Key_Attributes</a></span>
+     (<span class="symbol"><a name="ref_1926_7" href="terminal_interface-curses__ads.htm#ref_1720_7">Attr</a></span> : <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a>;
+      <span class="symbol"><a name="ref_1927_7" href="terminal_interface-curses__ads.htm#ref_1721_7">On</a></span>   : Boolean := True)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1929_16">Slk_Attron</a></span> (<span class="symbol"><a name="ref_1929_28">Ch</a></span> : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Slk_Attron, "slk_attron");
+      <b>function</b> <span class="symbol"><a name="ref_1931_16">Slk_Attroff</a></span> (<span class="symbol"><a name="ref_1931_29">Ch</a></span> : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Slk_Attroff, "slk_attroff");
+
+      <span class="symbol"><a name="ref_1934_7">Err</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <span class="symbol"><a name="ref_1935_7">Ch</a></span>  : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a> := (<a href="terminal_interface-curses__ads.htm#ref_492_10">Ch</a>    =&gt; Character'First,
+                                              <a href="terminal_interface-curses__ads.htm#ref_490_10">Attr</a>  =&gt; <a href="terminal_interface-curses__ads.htm#ref_1720_7">Attr</a>,
+                                              <a href="terminal_interface-curses__ads.htm#ref_491_10">Color</a> =&gt; <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>'First);
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__ads.htm#ref_1721_7">On</a> <b>then</b>
+         <a href="terminal_interface-curses__adb.htm#ref_1934_7">Err</a> := <a href="terminal_interface-curses__adb.htm#ref_1929_16">Slk_Attron</a>  (<a href="terminal_interface-curses__adb.htm#ref_1935_7">Ch</a>);
+      <b>else</b>
+         <a href="terminal_interface-curses__adb.htm#ref_1934_7">Err</a> := <a href="terminal_interface-curses__adb.htm#ref_1931_16">Slk_Attroff</a> (<a href="terminal_interface-curses__adb.htm#ref_1935_7">Ch</a>);
+      <b>end</b> <b>if</b>;
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1934_7">Err</a> = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1719_14">Switch_Soft_Label_Key_Attributes</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1949_14" href="terminal_interface-curses__ads.htm#ref_1727_14">Set_Soft_Label_Key_Attributes</a></span>
+     (<span class="symbol"><a name="ref_1950_7" href="terminal_interface-curses__ads.htm#ref_1728_7">Attr</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a> := <a href="terminal_interface-curses__ads.htm#ref_486_4">Normal_Video</a>;
+      <span class="symbol"><a name="ref_1951_7" href="terminal_interface-curses__ads.htm#ref_1729_7">Color</a></span> : <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a> := <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>'First)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1953_16">Slk_Attrset</a></span> (<span class="symbol"><a name="ref_1953_29">Ch</a></span> : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Slk_Attrset, "slk_attrset");
+
+      <span class="symbol"><a name="ref_1956_7">Ch</a></span> : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a> := (<a href="terminal_interface-curses__ads.htm#ref_492_10">Ch</a>    =&gt; Character'First,
+                                             <a href="terminal_interface-curses__ads.htm#ref_490_10">Attr</a>  =&gt; <a href="terminal_interface-curses__ads.htm#ref_1728_7">Attr</a>,
+                                             <a href="terminal_interface-curses__ads.htm#ref_491_10">Color</a> =&gt; <a href="terminal_interface-curses__ads.htm#ref_1729_7">Color</a>);
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1953_16">Slk_Attrset</a> (<a href="terminal_interface-curses__adb.htm#ref_1956_7">Ch</a>) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1727_14">Set_Soft_Label_Key_Attributes</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_1965_13" href="terminal_interface-curses__ads.htm#ref_1734_13">Get_Soft_Label_Key_Attributes</a></span> <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1967_16">Slk_Attr</a></span> <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>;
+      <b>pragma</b> Import (C, Slk_Attr, "slk_attr");
+
+      <span class="symbol"><a name="ref_1970_7">Attr</a></span> : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a> := <a href="terminal_interface-curses__adb.htm#ref_1967_16">Slk_Attr</a>;
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses__adb.htm#ref_1970_7">Attr</a>.<a href="terminal_interface-curses__ads.htm#ref_490_10">Attr</a>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1734_13">Get_Soft_Label_Key_Attributes</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_1975_13" href="terminal_interface-curses__ads.htm#ref_1738_13">Get_Soft_Label_Key_Attributes</a></span> <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1977_16">Slk_Attr</a></span> <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>;
+      <b>pragma</b> Import (C, Slk_Attr, "slk_attr");
+
+      <span class="symbol"><a name="ref_1980_7">Attr</a></span> : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a> := <a href="terminal_interface-curses__adb.htm#ref_1977_16">Slk_Attr</a>;
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses__adb.htm#ref_1980_7">Attr</a>.<a href="terminal_interface-curses__ads.htm#ref_491_10">Color</a>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1738_13">Get_Soft_Label_Key_Attributes</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1985_14" href="terminal_interface-curses__ads.htm#ref_1743_14">Set_Soft_Label_Key_Color</a></span> (<span class="symbol"><a name="ref_1985_40" href="terminal_interface-curses__ads.htm#ref_1743_40">Pair</a></span> : <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1987_16">Slk_Color</a></span> (<span class="symbol"><a name="ref_1987_27">Color</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_50_12">C_Short</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Slk_Color, "slk_color");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1987_16">Slk_Color</a> (<a href="terminal_interface-curses-aux__ads.htm#ref_50_12">C_Short</a> (<a href="terminal_interface-curses__ads.htm#ref_1743_40">Pair</a>)) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1743_14">Set_Soft_Label_Key_Color</a>;
+
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1996_14" href="terminal_interface-curses__ads.htm#ref_1757_14">Enable_Key</a></span> (<span class="symbol"><a name="ref_1996_26" href="terminal_interface-curses__ads.htm#ref_1757_26">Key</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>;
+                         <span class="symbol"><a name="ref_1997_26" href="terminal_interface-curses__ads.htm#ref_1758_26">Enable</a></span> : Boolean := True)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_1999_16">Keyok</a></span> (<span class="symbol"><a name="ref_1999_23">Keycode</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+                      <span class="symbol"><a name="ref_2000_23">On_Off</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Keyok, "keyok");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_1999_16">Keyok</a> (<a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1757_26">Key</a>), <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a> (Boolean'Pos (<a href="terminal_interface-curses__ads.htm#ref_1758_26">Enable</a>)))
+        = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a>
+      <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1757_14">Enable_Key</a>;
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_2010_14" href="terminal_interface-curses__ads.htm#ref_1767_14">Define_Key</a></span> (<span class="symbol"><a name="ref_2010_26" href="terminal_interface-curses__ads.htm#ref_1767_26">Definition</a></span> : String;
+                         <span class="symbol"><a name="ref_2011_26" href="terminal_interface-curses__ads.htm#ref_1768_26">Key</a></span>        : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_2013_16">Defkey</a></span> (<span class="symbol"><a name="ref_2013_24">Def</a></span> : char_array;
+                       <span class="symbol"><a name="ref_2014_24">Key</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Defkey, "define_key");
+
+      <span class="symbol"><a name="ref_2017_7">Txt</a></span>    : char_array (0 .. <a href="terminal_interface-curses__ads.htm#ref_1767_26">Definition</a>'Length);
+      <span class="symbol"><a name="ref_2018_7">Length</a></span> : size_t;
+   <b>begin</b>
+      To_C (<a href="terminal_interface-curses__ads.htm#ref_1767_26">Definition</a>, <a href="terminal_interface-curses__adb.htm#ref_2017_7">Txt</a>, <a href="terminal_interface-curses__adb.htm#ref_2018_7">Length</a>);
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_2013_16">Defkey</a> (<a href="terminal_interface-curses__adb.htm#ref_2017_7">Txt</a>, <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1768_26">Key</a>)) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1767_14">Define_Key</a>;
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_2026_14" href="terminal_interface-curses__ads.htm#ref_1793_14">Un_Control</a></span> (<span class="symbol"><a name="ref_2026_26" href="terminal_interface-curses__ads.htm#ref_1793_26">Ch</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>;
+                         <span class="symbol"><a name="ref_2027_26" href="terminal_interface-curses__ads.htm#ref_1794_26">Str</a></span> : <b>out</b> String)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_2029_16">Unctrl</a></span> (<span class="symbol"><a name="ref_2029_24">Ch</a></span> : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>) <b>return</b> chars_ptr;
+      <b>pragma</b> Import (C, Unctrl, "unctrl");
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_91_14">Fill_String</a> (<a href="terminal_interface-curses__adb.htm#ref_2029_16">Unctrl</a> (<a href="terminal_interface-curses__ads.htm#ref_1793_26">Ch</a>), <a href="terminal_interface-curses__ads.htm#ref_1794_26">Str</a>);
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1793_14">Un_Control</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_2035_13" href="terminal_interface-curses__ads.htm#ref_1798_13">Un_Control</a></span> (<span class="symbol"><a name="ref_2035_25" href="terminal_interface-curses__ads.htm#ref_1798_25">Ch</a></span> : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>) <b>return</b> String
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_2037_16">Unctrl</a></span> (<span class="symbol"><a name="ref_2037_24">Ch</a></span> : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>) <b>return</b> chars_ptr;
+      <b>pragma</b> Import (C, Unctrl, "unctrl");
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_96_13">Fill_String</a> (<a href="terminal_interface-curses__adb.htm#ref_2037_16">Unctrl</a> (<a href="terminal_interface-curses__ads.htm#ref_1798_25">Ch</a>));
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1798_13">Un_Control</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_2043_14" href="terminal_interface-curses__ads.htm#ref_1804_14">Delay_Output</a></span> (<span class="symbol"><a name="ref_2043_28" href="terminal_interface-curses__ads.htm#ref_1804_28">Msecs</a></span> : Natural)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_2045_16">Delayoutput</a></span> (<span class="symbol"><a name="ref_2045_29">Msecs</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Delayoutput, "delay_output");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_2045_16">Delayoutput</a> (<a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1804_28">Msecs</a>)) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1804_14">Delay_Output</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_2053_14" href="terminal_interface-curses__ads.htm#ref_1809_14">Flush_Input</a></span>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_2055_16">Flushinp</a></span> <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Flushinp, "flushinp");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_2055_16">Flushinp</a> = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>  <span class="comment"><em>-- docu says that never happens, but...</em></span>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1809_14">Flush_Input</a>;
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_2063_13" href="terminal_interface-curses__ads.htm#ref_1818_13">Baudrate</a></span> <b>return</b> Natural
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_2065_16">Baud</a></span> <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Baud, "baudrate");
+   <b>begin</b>
+      <b>return</b> Natural (<a href="terminal_interface-curses__adb.htm#ref_2065_16">Baud</a>);
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1818_13">Baudrate</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_2071_13" href="terminal_interface-curses__ads.htm#ref_1823_13">Erase_Character</a></span> <b>return</b> Character
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_2073_16">Erasechar</a></span> <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Erasechar, "erasechar");
+   <b>begin</b>
+      <b>return</b> Character'Val (<a href="terminal_interface-curses__adb.htm#ref_2073_16">Erasechar</a>);
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1823_13">Erase_Character</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_2079_13" href="terminal_interface-curses__ads.htm#ref_1828_13">Kill_Character</a></span> <b>return</b> Character
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_2081_16">Killchar</a></span> <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Killchar, "killchar");
+   <b>begin</b>
+      <b>return</b> Character'Val (<a href="terminal_interface-curses__adb.htm#ref_2081_16">Killchar</a>);
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1828_13">Kill_Character</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_2087_13" href="terminal_interface-curses__ads.htm#ref_1833_13">Has_Insert_Character</a></span> <b>return</b> Boolean
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_2089_16">Has_Ic</a></span> <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>;
+      <b>pragma</b> Import (C, Has_Ic, "has_ic");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_2089_16">Has_Ic</a> = <a href="terminal_interface-curses__ads.htm#ref_2101_4">Curses_Bool_False</a> <b>then</b>
+         <b>return</b> False;
+      <b>else</b>
+         <b>return</b> True;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1833_13">Has_Insert_Character</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_2099_13" href="terminal_interface-curses__ads.htm#ref_1838_13">Has_Insert_Line</a></span> <b>return</b> Boolean
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_2101_16">Has_Il</a></span> <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>;
+      <b>pragma</b> Import (C, Has_Il, "has_il");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_2101_16">Has_Il</a> = <a href="terminal_interface-curses__ads.htm#ref_2101_4">Curses_Bool_False</a> <b>then</b>
+         <b>return</b> False;
+      <b>else</b>
+         <b>return</b> True;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1838_13">Has_Insert_Line</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_2111_13" href="terminal_interface-curses__ads.htm#ref_1843_13">Supported_Attributes</a></span> <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_2113_16">Termattrs</a></span> <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>;
+      <b>pragma</b> Import (C, Termattrs, "termattrs");
+
+      <span class="symbol"><a name="ref_2116_7">Ch</a></span> : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a> := <a href="terminal_interface-curses__adb.htm#ref_2113_16">Termattrs</a>;
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses__adb.htm#ref_2116_7">Ch</a>.<a href="terminal_interface-curses__ads.htm#ref_490_10">Attr</a>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1843_13">Supported_Attributes</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_2121_14" href="terminal_interface-curses__ads.htm#ref_1848_14">Long_Name</a></span> (<span class="symbol"><a name="ref_2121_25" href="terminal_interface-curses__ads.htm#ref_1848_25">Name</a></span> : <b>out</b> String)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_2123_16">Longname</a></span> <b>return</b> chars_ptr;
+      <b>pragma</b> Import (C, Longname, "longname");
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_91_14">Fill_String</a> (<a href="terminal_interface-curses__adb.htm#ref_2123_16">Longname</a>, <a href="terminal_interface-curses__ads.htm#ref_1848_25">Name</a>);
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1848_14">Long_Name</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_2129_13" href="terminal_interface-curses__ads.htm#ref_1852_13">Long_Name</a></span> <b>return</b> String
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_2131_16">Longname</a></span> <b>return</b> chars_ptr;
+      <b>pragma</b> Import (C, Longname, "longname");
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_96_13">Fill_String</a> (<a href="terminal_interface-curses__adb.htm#ref_2131_16">Longname</a>);
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1852_13">Long_Name</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_2137_14" href="terminal_interface-curses__ads.htm#ref_1858_14">Terminal_Name</a></span> (<span class="symbol"><a name="ref_2137_29" href="terminal_interface-curses__ads.htm#ref_1858_29">Name</a></span> : <b>out</b> String)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_2139_16">Termname</a></span> <b>return</b> chars_ptr;
+      <b>pragma</b> Import (C, Termname, "termname");
+   <b>begin</b>
+      <a href="terminal_interface-curses-aux__ads.htm#ref_91_14">Fill_String</a> (<a href="terminal_interface-curses__adb.htm#ref_2139_16">Termname</a>, <a href="terminal_interface-curses__ads.htm#ref_1858_29">Name</a>);
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1858_14">Terminal_Name</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_2145_13" href="terminal_interface-curses__ads.htm#ref_1862_13">Terminal_Name</a></span> <b>return</b> String
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_2147_16">Termname</a></span> <b>return</b> chars_ptr;
+      <b>pragma</b> Import (C, Termname, "termname");
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_96_13">Fill_String</a> (<a href="terminal_interface-curses__adb.htm#ref_2147_16">Termname</a>);
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1862_13">Terminal_Name</a>;
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_2153_14" href="terminal_interface-curses__ads.htm#ref_1883_14">Init_Pair</a></span> (<span class="symbol"><a name="ref_2153_25" href="terminal_interface-curses__ads.htm#ref_1883_25">Pair</a></span> : <a href="terminal_interface-curses__ads.htm#ref_412_12">Redefinable_Color_Pair</a>;
+                        <span class="symbol"><a name="ref_2154_25" href="terminal_interface-curses__ads.htm#ref_1884_25">Fore</a></span> : <a href="terminal_interface-curses__ads.htm#ref_390_9">Color_Number</a>;
+                        <span class="symbol"><a name="ref_2155_25" href="terminal_interface-curses__ads.htm#ref_1885_25">Back</a></span> : <a href="terminal_interface-curses__ads.htm#ref_390_9">Color_Number</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_2157_16">Initpair</a></span> (<span class="symbol"><a name="ref_2157_26">Pair</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_50_12">C_Short</a>;
+                         <span class="symbol"><a name="ref_2158_26">Fore</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_50_12">C_Short</a>;
+                         <span class="symbol"><a name="ref_2159_26">Back</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_50_12">C_Short</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Initpair, "init_pair");
+   <b>begin</b>
+      <b>if</b> Integer (<a href="terminal_interface-curses__ads.htm#ref_1883_25">Pair</a>) &gt;= <a href="terminal_interface-curses__ads.htm#ref_563_13">Number_Of_Color_Pairs</a> <b>then</b>
+         <b>raise</b> Constraint_Error;
+      <b>end</b> <b>if</b>;
+      <b>if</b> Integer (<a href="terminal_interface-curses__ads.htm#ref_1884_25">Fore</a>) &gt;= <a href="terminal_interface-curses__ads.htm#ref_560_13">Number_Of_Colors</a> <b>or</b> <b>else</b>
+         Integer (<a href="terminal_interface-curses__ads.htm#ref_1885_25">Back</a>) &gt;= <a href="terminal_interface-curses__ads.htm#ref_560_13">Number_Of_Colors</a>
+      <b>then</b>
+         <b>raise</b> Constraint_Error;
+      <b>end</b> <b>if</b>;
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_2157_16">Initpair</a> (<a href="terminal_interface-curses-aux__ads.htm#ref_50_12">C_Short</a> (<a href="terminal_interface-curses__ads.htm#ref_1883_25">Pair</a>), <a href="terminal_interface-curses-aux__ads.htm#ref_50_12">C_Short</a> (<a href="terminal_interface-curses__ads.htm#ref_1884_25">Fore</a>), <a href="terminal_interface-curses-aux__ads.htm#ref_50_12">C_Short</a> (<a href="terminal_interface-curses__ads.htm#ref_1885_25">Back</a>))
+        = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a>
+      <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1883_14">Init_Pair</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_2177_14" href="terminal_interface-curses__ads.htm#ref_1890_14">Pair_Content</a></span> (<span class="symbol"><a name="ref_2177_28" href="terminal_interface-curses__ads.htm#ref_1890_28">Pair</a></span> : <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>;
+                           <span class="symbol"><a name="ref_2178_28" href="terminal_interface-curses__ads.htm#ref_1891_28">Fore</a></span> : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_390_9">Color_Number</a>;
+                           <span class="symbol"><a name="ref_2179_28" href="terminal_interface-curses__ads.htm#ref_1892_28">Back</a></span> : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_390_9">Color_Number</a>)
+   <b>is</b>
+      <b>type</b> <span class="symbol"><a name="ref_2181_12">C_Short_Access</a></span> <b>is</b> <b>access</b> <b>all</b> <a href="terminal_interface-curses-aux__ads.htm#ref_50_12">C_Short</a>;
+      <b>function</b> <span class="symbol"><a name="ref_2182_16">Paircontent</a></span> (<span class="symbol"><a name="ref_2182_29">Pair</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_50_12">C_Short</a>;
+                            <span class="symbol"><a name="ref_2183_29">Fp</a></span>   : <a href="terminal_interface-curses__adb.htm#ref_2181_12">C_Short_Access</a>;
+                            <span class="symbol"><a name="ref_2184_29">Bp</a></span>   : <a href="terminal_interface-curses__adb.htm#ref_2181_12">C_Short_Access</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Paircontent, "pair_content");
+
+      <span class="symbol"><a name="ref_2187_7">F</a></span>, <span class="symbol"><a name="ref_2187_10">B</a></span> : <b>aliased</b> <a href="terminal_interface-curses-aux__ads.htm#ref_50_12">C_Short</a>;
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_2182_16">Paircontent</a> (<a href="terminal_interface-curses-aux__ads.htm#ref_50_12">C_Short</a> (<a href="terminal_interface-curses__ads.htm#ref_1890_28">Pair</a>), <a href="terminal_interface-curses__adb.htm#ref_2187_7">F</a>'<b>Access</b>, <a href="terminal_interface-curses__adb.htm#ref_2187_10">B</a>'<b>Access</b>) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>else</b>
+         <a href="terminal_interface-curses__ads.htm#ref_1891_28">Fore</a> := <a href="terminal_interface-curses__ads.htm#ref_390_9">Color_Number</a> (<a href="terminal_interface-curses__adb.htm#ref_2187_7">F</a>);
+         <a href="terminal_interface-curses__ads.htm#ref_1892_28">Back</a> := <a href="terminal_interface-curses__ads.htm#ref_390_9">Color_Number</a> (<a href="terminal_interface-curses__adb.htm#ref_2187_10">B</a>);
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1890_14">Pair_Content</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_2197_13" href="terminal_interface-curses__ads.htm#ref_1897_13">Has_Colors</a></span> <b>return</b> Boolean
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_2199_16">Hascolors</a></span> <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>;
+      <b>pragma</b> Import (C, Hascolors, "has_colors");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_2199_16">Hascolors</a> = <a href="terminal_interface-curses__ads.htm#ref_2101_4">Curses_Bool_False</a> <b>then</b>
+         <b>return</b> False;
+      <b>else</b>
+         <b>return</b> True;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1897_13">Has_Colors</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_2209_14" href="terminal_interface-curses__ads.htm#ref_1902_14">Init_Color</a></span> (<span class="symbol"><a name="ref_2209_26" href="terminal_interface-curses__ads.htm#ref_1902_26">Color</a></span> : <a href="terminal_interface-curses__ads.htm#ref_390_9">Color_Number</a>;
+                         <span class="symbol"><a name="ref_2210_26" href="terminal_interface-curses__ads.htm#ref_1903_26">Red</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_406_9">RGB_Value</a>;
+                         <span class="symbol"><a name="ref_2211_26" href="terminal_interface-curses__ads.htm#ref_1904_26">Green</a></span> : <a href="terminal_interface-curses__ads.htm#ref_406_9">RGB_Value</a>;
+                         <span class="symbol"><a name="ref_2212_26" href="terminal_interface-curses__ads.htm#ref_1905_26">Blue</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_406_9">RGB_Value</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_2214_16">Initcolor</a></span> (<span class="symbol"><a name="ref_2214_27">Col</a></span>   : <a href="terminal_interface-curses-aux__ads.htm#ref_50_12">C_Short</a>;
+                          <span class="symbol"><a name="ref_2215_27">Red</a></span>   : <a href="terminal_interface-curses-aux__ads.htm#ref_50_12">C_Short</a>;
+                          <span class="symbol"><a name="ref_2216_27">Green</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_50_12">C_Short</a>;
+                          <span class="symbol"><a name="ref_2217_27">Blue</a></span>  : <a href="terminal_interface-curses-aux__ads.htm#ref_50_12">C_Short</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Initcolor, "init_color");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_2214_16">Initcolor</a> (<a href="terminal_interface-curses-aux__ads.htm#ref_50_12">C_Short</a> (<a href="terminal_interface-curses__ads.htm#ref_1902_26">Color</a>), <a href="terminal_interface-curses-aux__ads.htm#ref_50_12">C_Short</a> (<a href="terminal_interface-curses__ads.htm#ref_1903_26">Red</a>), <a href="terminal_interface-curses-aux__ads.htm#ref_50_12">C_Short</a> (<a href="terminal_interface-curses__ads.htm#ref_1904_26">Green</a>),
+                    <a href="terminal_interface-curses-aux__ads.htm#ref_50_12">C_Short</a> (<a href="terminal_interface-curses__ads.htm#ref_1905_26">Blue</a>)) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a>
+      <b>then</b>
+            <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1902_14">Init_Color</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_2227_13" href="terminal_interface-curses__ads.htm#ref_1910_13">Can_Change_Color</a></span> <b>return</b> Boolean
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_2229_16">Canchangecolor</a></span> <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>;
+      <b>pragma</b> Import (C, Canchangecolor, "can_change_color");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_2229_16">Canchangecolor</a> = <a href="terminal_interface-curses__ads.htm#ref_2101_4">Curses_Bool_False</a> <b>then</b>
+         <b>return</b> False;
+      <b>else</b>
+         <b>return</b> True;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1910_13">Can_Change_Color</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_2239_14" href="terminal_interface-curses__ads.htm#ref_1915_14">Color_Content</a></span> (<span class="symbol"><a name="ref_2239_29" href="terminal_interface-curses__ads.htm#ref_1915_29">Color</a></span> :  <a href="terminal_interface-curses__ads.htm#ref_390_9">Color_Number</a>;
+                            <span class="symbol"><a name="ref_2240_29" href="terminal_interface-curses__ads.htm#ref_1916_29">Red</a></span>   : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_406_9">RGB_Value</a>;
+                            <span class="symbol"><a name="ref_2241_29" href="terminal_interface-curses__ads.htm#ref_1917_29">Green</a></span> : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_406_9">RGB_Value</a>;
+                            <span class="symbol"><a name="ref_2242_29" href="terminal_interface-curses__ads.htm#ref_1918_29">Blue</a></span>  : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_406_9">RGB_Value</a>)
+   <b>is</b>
+      <b>type</b> <span class="symbol"><a name="ref_2244_12">C_Short_Access</a></span> <b>is</b> <b>access</b> <b>all</b> <a href="terminal_interface-curses-aux__ads.htm#ref_50_12">C_Short</a>;
+
+      <b>function</b> <span class="symbol"><a name="ref_2246_16">Colorcontent</a></span> (<span class="symbol"><a name="ref_2246_30">Color</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_50_12">C_Short</a>; <span class="symbol"><a name="ref_2246_47">R</a></span>, <span class="symbol"><a name="ref_2246_50">G</a></span>, <span class="symbol"><a name="ref_2246_53">B</a></span> : <a href="terminal_interface-curses__adb.htm#ref_2244_12">C_Short_Access</a>)
+                             <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Colorcontent, "color_content");
+
+      <span class="symbol"><a name="ref_2250_7">R</a></span>, <span class="symbol"><a name="ref_2250_10">G</a></span>, <span class="symbol"><a name="ref_2250_13">B</a></span> : <b>aliased</b> <a href="terminal_interface-curses-aux__ads.htm#ref_50_12">C_Short</a>;
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_2246_16">Colorcontent</a> (<a href="terminal_interface-curses-aux__ads.htm#ref_50_12">C_Short</a> (<a href="terminal_interface-curses__ads.htm#ref_1915_29">Color</a>), <a href="terminal_interface-curses__adb.htm#ref_2250_7">R</a>'<b>Access</b>, <a href="terminal_interface-curses__adb.htm#ref_2250_10">G</a>'<b>Access</b>, <a href="terminal_interface-curses__adb.htm#ref_2250_13">B</a>'<b>Access</b>) =
+        <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a>
+      <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>else</b>
+         <a href="terminal_interface-curses__ads.htm#ref_1916_29">Red</a>   := <a href="terminal_interface-curses__ads.htm#ref_406_9">RGB_Value</a> (<a href="terminal_interface-curses__adb.htm#ref_2250_7">R</a>);
+         <a href="terminal_interface-curses__ads.htm#ref_1917_29">Green</a> := <a href="terminal_interface-curses__ads.htm#ref_406_9">RGB_Value</a> (<a href="terminal_interface-curses__adb.htm#ref_2250_10">G</a>);
+         <a href="terminal_interface-curses__ads.htm#ref_1918_29">Blue</a>  := <a href="terminal_interface-curses__ads.htm#ref_406_9">RGB_Value</a> (<a href="terminal_interface-curses__adb.htm#ref_2250_13">B</a>);
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1915_14">Color_Content</a>;
+
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_2264_14" href="terminal_interface-curses__ads.htm#ref_1930_14">Save_Curses_Mode</a></span> (<span class="symbol"><a name="ref_2264_32" href="terminal_interface-curses__ads.htm#ref_1930_32">Mode</a></span> : <a href="terminal_interface-curses__ads.htm#ref_1927_9">Curses_Mode</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_2266_16">Def_Prog_Mode</a></span> <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Def_Prog_Mode, "def_prog_mode");
+      <b>function</b> <span class="symbol"><a name="ref_2268_16">Def_Shell_Mode</a></span> <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Def_Shell_Mode, "def_shell_mode");
+
+      <span class="symbol"><a name="ref_2271_7">Err</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+   <b>begin</b>
+      <b>case</b> <a href="terminal_interface-curses__ads.htm#ref_1930_32">Mode</a> <b>is</b>
+         <b>when</b> <a href="terminal_interface-curses__ads.htm#ref_1927_25">Curses</a> =&gt; <a href="terminal_interface-curses__adb.htm#ref_2271_7">Err</a> := <a href="terminal_interface-curses__adb.htm#ref_2266_16">Def_Prog_Mode</a>;
+         <b>when</b> <a href="terminal_interface-curses__ads.htm#ref_1927_33">Shell</a>  =&gt; <a href="terminal_interface-curses__adb.htm#ref_2271_7">Err</a> := <a href="terminal_interface-curses__adb.htm#ref_2268_16">Def_Shell_Mode</a>;
+      <b>end</b> <b>case</b>;
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_2271_7">Err</a> = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1930_14">Save_Curses_Mode</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_2282_14" href="terminal_interface-curses__ads.htm#ref_1936_14">Reset_Curses_Mode</a></span> (<span class="symbol"><a name="ref_2282_33" href="terminal_interface-curses__ads.htm#ref_1936_33">Mode</a></span> : <a href="terminal_interface-curses__ads.htm#ref_1927_9">Curses_Mode</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_2284_16">Reset_Prog_Mode</a></span> <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Reset_Prog_Mode, "reset_prog_mode");
+      <b>function</b> <span class="symbol"><a name="ref_2286_16">Reset_Shell_Mode</a></span> <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Reset_Shell_Mode, "reset_shell_mode");
+
+      <span class="symbol"><a name="ref_2289_7">Err</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+   <b>begin</b>
+      <b>case</b> <a href="terminal_interface-curses__ads.htm#ref_1936_33">Mode</a> <b>is</b>
+         <b>when</b> <a href="terminal_interface-curses__ads.htm#ref_1927_25">Curses</a> =&gt; <a href="terminal_interface-curses__adb.htm#ref_2289_7">Err</a> := <a href="terminal_interface-curses__adb.htm#ref_2284_16">Reset_Prog_Mode</a>;
+         <b>when</b> <a href="terminal_interface-curses__ads.htm#ref_1927_33">Shell</a>  =&gt; <a href="terminal_interface-curses__adb.htm#ref_2289_7">Err</a> := <a href="terminal_interface-curses__adb.htm#ref_2286_16">Reset_Shell_Mode</a>;
+      <b>end</b> <b>case</b>;
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_2289_7">Err</a> = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1936_14">Reset_Curses_Mode</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_2300_14" href="terminal_interface-curses__ads.htm#ref_1942_14">Save_Terminal_State</a></span>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_2302_16">Savetty</a></span> <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Savetty, "savetty");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_2302_16">Savetty</a> = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1942_14">Save_Terminal_State</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_2310_14" href="terminal_interface-curses__ads.htm#ref_1947_14">Reset_Terminal_State</a></span>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_2312_16">Resetty</a></span> <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Resetty, "resetty");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_2312_16">Resetty</a> = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1947_14">Reset_Terminal_State</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_2320_14" href="terminal_interface-curses__ads.htm#ref_1960_14">Rip_Off_Lines</a></span> (<span class="symbol"><a name="ref_2320_29" href="terminal_interface-curses__ads.htm#ref_1960_29">Lines</a></span> : Integer;
+                            <span class="symbol"><a name="ref_2321_29" href="terminal_interface-curses__ads.htm#ref_1961_29">Proc</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_1951_9">Stdscr_Init_Proc</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_2323_16">Ripoffline</a></span> (<span class="symbol"><a name="ref_2323_28">Lines</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+                           <span class="symbol"><a name="ref_2324_28">Proc</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_1951_9">Stdscr_Init_Proc</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Ripoffline, "_nc_ripoffline");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_2323_16">Ripoffline</a> (<a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1960_29">Lines</a>), <a href="terminal_interface-curses__ads.htm#ref_1961_29">Proc</a>) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1960_14">Rip_Off_Lines</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_2332_14" href="terminal_interface-curses__ads.htm#ref_1972_14">Set_Cursor_Visibility</a></span> (<span class="symbol"><a name="ref_2332_37" href="terminal_interface-curses__ads.htm#ref_1972_37">Visibility</a></span> : <b>in</b> <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_1969_9">Cursor_Visibility</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_2334_16">Curs_Set</a></span> (<span class="symbol"><a name="ref_2334_26">Curs</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Curs_Set, "curs_set");
+
+      <span class="symbol"><a name="ref_2337_7">Res</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+   <b>begin</b>
+      <a href="terminal_interface-curses__adb.htm#ref_2337_7">Res</a> := <a href="terminal_interface-curses__adb.htm#ref_2334_16">Curs_Set</a> (<a href="terminal_interface-curses__ads.htm#ref_1969_9">Cursor_Visibility</a>'Pos (<a href="terminal_interface-curses__ads.htm#ref_1972_37">Visibility</a>));
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_2337_7">Res</a> /= <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <a href="terminal_interface-curses__ads.htm#ref_1972_37">Visibility</a> := <a href="terminal_interface-curses__ads.htm#ref_1969_9">Cursor_Visibility</a>'Val (<a href="terminal_interface-curses__adb.htm#ref_2337_7">Res</a>);
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1972_14">Set_Cursor_Visibility</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_2345_14" href="terminal_interface-curses__ads.htm#ref_1977_14">Nap_Milli_Seconds</a></span> (<span class="symbol"><a name="ref_2345_33" href="terminal_interface-curses__ads.htm#ref_1977_33">Ms</a></span> : Natural)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_2347_16">Napms</a></span> (<span class="symbol"><a name="ref_2347_23">Ms</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Napms, "napms");
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_2347_16">Napms</a> (<a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1977_33">Ms</a>)) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1977_14">Nap_Milli_Seconds</a>;
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_2355_13" href="terminal_interface-curses__ads.htm#ref_551_13">Lines</a></span> <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_2357_16">LINES_As_Function</a></span> <b>return</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.int;
+      <b>pragma</b> Import (C, LINES_As_Function, "LINES_as_function");
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a> (<a href="terminal_interface-curses__adb.htm#ref_2357_16">LINES_As_Function</a>);
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_551_13">Lines</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_2363_13" href="terminal_interface-curses__ads.htm#ref_554_13">Columns</a></span> <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a>
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_2365_16">COLS_As_Function</a></span> <b>return</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.int;
+      <b>pragma</b> Import (C, COLS_As_Function, "COLS_as_function");
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a> (<a href="terminal_interface-curses__adb.htm#ref_2365_16">COLS_As_Function</a>);
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_554_13">Columns</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_2371_13" href="terminal_interface-curses__ads.htm#ref_557_13">Tab_Size</a></span> <b>return</b> Natural
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_2373_16">TABSIZE_As_Function</a></span> <b>return</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.int;
+      <b>pragma</b> Import (C, TABSIZE_As_Function, "TABSIZE_as_function");
+
+   <b>begin</b>
+      <b>return</b> Natural (<a href="terminal_interface-curses__adb.htm#ref_2373_16">TABSIZE_As_Function</a>);
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_557_13">Tab_Size</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_2380_13" href="terminal_interface-curses__ads.htm#ref_560_13">Number_Of_Colors</a></span> <b>return</b> Natural
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_2382_16">COLORS_As_Function</a></span> <b>return</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.int;
+      <b>pragma</b> Import (C, COLORS_As_Function, "COLORS_as_function");
+   <b>begin</b>
+      <b>return</b> Natural (<a href="terminal_interface-curses__adb.htm#ref_2382_16">COLORS_As_Function</a>);
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_560_13">Number_Of_Colors</a>;
+
+   <b>function</b> <span class="symbol"><a name="ref_2388_13" href="terminal_interface-curses__ads.htm#ref_563_13">Number_Of_Color_Pairs</a></span> <b>return</b> Natural
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_2390_16">COLOR_PAIRS_As_Function</a></span> <b>return</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.int;
+      <b>pragma</b> Import (C, COLOR_PAIRS_As_Function, "COLOR_PAIRS_as_function");
+   <b>begin</b>
+      <b>return</b> Natural (<a href="terminal_interface-curses__adb.htm#ref_2390_16">COLOR_PAIRS_As_Function</a>);
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_563_13">Number_Of_Color_Pairs</a>;
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_2396_14" href="terminal_interface-curses__ads.htm#ref_1985_14">Transform_Coordinates</a></span>
+     (<span class="symbol"><a name="ref_2397_7" href="terminal_interface-curses__ads.htm#ref_1986_7">W</a></span>      : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_2398_7" href="terminal_interface-curses__ads.htm#ref_1987_7">Line</a></span>   : <b>in</b> <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_2399_7" href="terminal_interface-curses__ads.htm#ref_1988_7">Column</a></span> : <b>in</b> <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+      <span class="symbol"><a name="ref_2400_7" href="terminal_interface-curses__ads.htm#ref_1989_7">Dir</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_1984_9">Transform_Direction</a> := <a href="terminal_interface-curses__ads.htm#ref_1984_33">From_Screen</a>)
+   <b>is</b>
+      <b>type</b> <span class="symbol"><a name="ref_2402_12">Int_Access</a></span> <b>is</b> <b>access</b> <b>all</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>function</b> <span class="symbol"><a name="ref_2403_16">Transform</a></span> (<span class="symbol"><a name="ref_2403_27">W</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+                          <span class="symbol"><a name="ref_2404_27">Y</a></span>, <span class="symbol"><a name="ref_2404_30">X</a></span> : <a href="terminal_interface-curses__adb.htm#ref_2402_12">Int_Access</a>;
+                          <span class="symbol"><a name="ref_2405_27">Dir</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, Transform, "wmouse_trafo");
+
+      <span class="symbol"><a name="ref_2408_7">X</a></span> : <b>aliased</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> := <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1988_7">Column</a>);
+      <span class="symbol"><a name="ref_2409_7">Y</a></span> : <b>aliased</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> := <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_1987_7">Line</a>);
+      <span class="symbol"><a name="ref_2410_7">D</a></span> : <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a> := <a href="terminal_interface-curses__ads.htm#ref_2101_4">Curses_Bool_False</a>;
+      <span class="symbol"><a name="ref_2411_7">R</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__ads.htm#ref_1989_7">Dir</a> = <a href="terminal_interface-curses__ads.htm#ref_1984_46">To_Screen</a> <b>then</b>
+         <a href="terminal_interface-curses__adb.htm#ref_2410_7">D</a> := 1;
+      <b>end</b> <b>if</b>;
+      <a href="terminal_interface-curses__adb.htm#ref_2411_7">R</a> := <a href="terminal_interface-curses__adb.htm#ref_2403_16">Transform</a> (<a href="terminal_interface-curses__ads.htm#ref_1986_7">W</a>, <a href="terminal_interface-curses__adb.htm#ref_2409_7">Y</a>'<b>Access</b>, <a href="terminal_interface-curses__adb.htm#ref_2408_7">X</a>'<b>Access</b>, <a href="terminal_interface-curses__adb.htm#ref_2410_7">D</a>);
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_2411_7">R</a> = <a href="terminal_interface-curses-aux__ads.htm#ref_67_4">Curses_False</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>else</b>
+         <a href="terminal_interface-curses__ads.htm#ref_1987_7">Line</a>   := <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a> (<a href="terminal_interface-curses__adb.htm#ref_2409_7">Y</a>);
+         <a href="terminal_interface-curses__ads.htm#ref_1988_7">Column</a> := <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a> (<a href="terminal_interface-curses__adb.htm#ref_2408_7">X</a>);
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_1985_14">Transform_Coordinates</a>;
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_2425_14" href="terminal_interface-curses__ads.htm#ref_2004_14">Use_Default_Colors</a></span> <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_2426_16">C_Use_Default_Colors</a></span> <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, C_Use_Default_Colors, "use_default_colors");
+      <span class="symbol"><a name="ref_2428_7">Err</a></span> : <b>constant</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> := <a href="terminal_interface-curses__adb.htm#ref_2426_16">C_Use_Default_Colors</a>;
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_2428_7">Err</a> = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_2004_14">Use_Default_Colors</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_2435_14" href="terminal_interface-curses__ads.htm#ref_2009_14">Assume_Default_Colors</a></span> (<span class="symbol"><a name="ref_2435_37" href="terminal_interface-curses__ads.htm#ref_2009_37">Fore</a></span> : <a href="terminal_interface-curses__ads.htm#ref_390_9">Color_Number</a> := <a href="terminal_interface-curses__ads.htm#ref_2001_4">Default_Color</a>;
+                                    <span class="symbol"><a name="ref_2436_37" href="terminal_interface-curses__ads.htm#ref_2010_37">Back</a></span> : <a href="terminal_interface-curses__ads.htm#ref_390_9">Color_Number</a> := <a href="terminal_interface-curses__ads.htm#ref_2001_4">Default_Color</a>)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_2438_16">C_Assume_Default_Colors</a></span> (<span class="symbol"><a name="ref_2438_41">Fore</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+                                        <span class="symbol"><a name="ref_2439_41">Back</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, C_Assume_Default_Colors, "assume_default_colors");
+
+      <span class="symbol"><a name="ref_2442_7">Err</a></span> : <b>constant</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> := <a href="terminal_interface-curses__adb.htm#ref_2438_16">C_Assume_Default_Colors</a> (<a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_2009_37">Fore</a>),
+                                                       <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_2010_37">Back</a>));
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_2442_7">Err</a> = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_2009_14">Assume_Default_Colors</a>;
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_2450_13" href="terminal_interface-curses__ads.htm#ref_2019_13">Curses_Version</a></span> <b>return</b> String
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_2452_16">curses_versionC</a></span> <b>return</b> chars_ptr;
+      <b>pragma</b> Import (C, curses_versionC, "curses_version");
+      <span class="symbol"><a name="ref_2454_7">Result</a></span> : <b>constant</b> chars_ptr := <a href="terminal_interface-curses__adb.htm#ref_2452_16">curses_versionC</a>;
+   <b>begin</b>
+      <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_96_13">Fill_String</a> (<a href="terminal_interface-curses__adb.htm#ref_2454_7">Result</a>);
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_2019_13">Curses_Version</a>;
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_2459_14" href="terminal_interface-curses__ads.htm#ref_2032_14">Curses_Free_All</a></span> <b>is</b>
+      <b>procedure</b> <span class="symbol"><a name="ref_2460_17">curses_freeall</a></span>;
+      <b>pragma</b> Import (C, curses_freeall, "_nc_freeall");
+   <b>begin</b>
+      <span class="comment"><em>--  Use this only for testing: you cannot use curses after calling it,</em></span>
+      <span class="comment"><em>--  so it has to be the "last" thing done before exiting the program.</em></span>
+      <span class="comment"><em>--  This will not really free ALL of memory used by curses.  That is</em></span>
+      <span class="comment"><em>--  because it cannot free the memory used for stdout's setbuf.  The</em></span>
+      <span class="comment"><em>--  _nc_free_and_exit() procedure can do that, but it can be invoked</em></span>
+      <span class="comment"><em>--  safely only from C - and again, that only as the "last" thing done</em></span>
+      <span class="comment"><em>--  before exiting the program.</em></span>
+      <a href="terminal_interface-curses__adb.htm#ref_2460_17">curses_freeall</a>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_2032_14">Curses_Free_All</a>;
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_2473_13" href="terminal_interface-curses__ads.htm#ref_2024_13">Use_Extended_Names</a></span> (<span class="symbol"><a name="ref_2473_33" href="terminal_interface-curses__ads.htm#ref_2024_33">Enable</a></span> : Boolean) <b>return</b> Boolean
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_2475_16">use_extended_namesC</a></span> (<span class="symbol"><a name="ref_2475_37">e</a></span> : <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, use_extended_namesC, "use_extended_names");
+
+      <span class="symbol"><a name="ref_2478_7">Res</a></span> : <b>constant</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> :=
+         <a href="terminal_interface-curses__adb.htm#ref_2475_16">use_extended_namesC</a> (<a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a> (Boolean'Pos (<a href="terminal_interface-curses__ads.htm#ref_2024_33">Enable</a>)));
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_2478_7">Res</a> = <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_2101_4">Curses_Bool_False</a>) <b>then</b>
+         <b>return</b> False;
+      <b>else</b>
+         <b>return</b> True;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_2024_13">Use_Extended_Names</a>;
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_2488_14" href="terminal_interface-curses__ads.htm#ref_2040_14">Screen_Dump_To_File</a></span> (<span class="symbol"><a name="ref_2488_35" href="terminal_interface-curses__ads.htm#ref_2040_35">Filename</a></span> : String)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_2490_16">scr_dump</a></span> (<span class="symbol"><a name="ref_2490_26">f</a></span> : char_array) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, scr_dump, "scr_dump");
+      <span class="symbol"><a name="ref_2492_7">Txt</a></span>    : char_array (0 .. <a href="terminal_interface-curses__ads.htm#ref_2040_35">Filename</a>'Length);
+      <span class="symbol"><a name="ref_2493_7">Length</a></span> : size_t;
+   <b>begin</b>
+      To_C (<a href="terminal_interface-curses__ads.htm#ref_2040_35">Filename</a>, <a href="terminal_interface-curses__adb.htm#ref_2492_7">Txt</a>, <a href="terminal_interface-curses__adb.htm#ref_2493_7">Length</a>);
+      <b>if</b> <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> = <a href="terminal_interface-curses__adb.htm#ref_2490_16">scr_dump</a> (<a href="terminal_interface-curses__adb.htm#ref_2492_7">Txt</a>) <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_2040_14">Screen_Dump_To_File</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_2501_14" href="terminal_interface-curses__ads.htm#ref_2044_14">Screen_Restore_From_File</a></span> (<span class="symbol"><a name="ref_2501_40" href="terminal_interface-curses__ads.htm#ref_2044_40">Filename</a></span> : String)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_2503_16">scr_restore</a></span> (<span class="symbol"><a name="ref_2503_29">f</a></span> : char_array) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, scr_restore, "scr_restore");
+      <span class="symbol"><a name="ref_2505_7">Txt</a></span>    : char_array (0 .. <a href="terminal_interface-curses__ads.htm#ref_2044_40">Filename</a>'Length);
+      <span class="symbol"><a name="ref_2506_7">Length</a></span> : size_t;
+   <b>begin</b>
+      To_C (<a href="terminal_interface-curses__ads.htm#ref_2044_40">Filename</a>, <a href="terminal_interface-curses__adb.htm#ref_2505_7">Txt</a>, <a href="terminal_interface-curses__adb.htm#ref_2506_7">Length</a>);
+      <b>if</b> <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> = <a href="terminal_interface-curses__adb.htm#ref_2503_16">scr_restore</a> (<a href="terminal_interface-curses__adb.htm#ref_2505_7">Txt</a>)  <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_2044_14">Screen_Restore_From_File</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_2514_14" href="terminal_interface-curses__ads.htm#ref_2048_14">Screen_Init_From_File</a></span> (<span class="symbol"><a name="ref_2514_37" href="terminal_interface-curses__ads.htm#ref_2048_37">Filename</a></span> : String)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_2516_16">scr_init</a></span> (<span class="symbol"><a name="ref_2516_26">f</a></span> : char_array) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, scr_init, "scr_init");
+      <span class="symbol"><a name="ref_2518_7">Txt</a></span>    : char_array (0 .. <a href="terminal_interface-curses__ads.htm#ref_2048_37">Filename</a>'Length);
+      <span class="symbol"><a name="ref_2519_7">Length</a></span> : size_t;
+   <b>begin</b>
+      To_C (<a href="terminal_interface-curses__ads.htm#ref_2048_37">Filename</a>, <a href="terminal_interface-curses__adb.htm#ref_2518_7">Txt</a>, <a href="terminal_interface-curses__adb.htm#ref_2519_7">Length</a>);
+      <b>if</b> <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> = <a href="terminal_interface-curses__adb.htm#ref_2516_16">scr_init</a> (<a href="terminal_interface-curses__adb.htm#ref_2518_7">Txt</a>) <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_2048_14">Screen_Init_From_File</a>;
+
+   <b>procedure</b> <span class="symbol"><a name="ref_2527_14" href="terminal_interface-curses__ads.htm#ref_2052_14">Screen_Set_File</a></span> (<span class="symbol"><a name="ref_2527_31" href="terminal_interface-curses__ads.htm#ref_2052_31">Filename</a></span> : String)
+   <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_2529_16">scr_set</a></span> (<span class="symbol"><a name="ref_2529_25">f</a></span> : char_array) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, scr_set, "scr_set");
+      <span class="symbol"><a name="ref_2531_7">Txt</a></span>    : char_array (0 .. <a href="terminal_interface-curses__ads.htm#ref_2052_31">Filename</a>'Length);
+      <span class="symbol"><a name="ref_2532_7">Length</a></span> : size_t;
+   <b>begin</b>
+      To_C (<a href="terminal_interface-curses__ads.htm#ref_2052_31">Filename</a>, <a href="terminal_interface-curses__adb.htm#ref_2531_7">Txt</a>, <a href="terminal_interface-curses__adb.htm#ref_2532_7">Length</a>);
+      <b>if</b> <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a> = <a href="terminal_interface-curses__adb.htm#ref_2529_16">scr_set</a> (<a href="terminal_interface-curses__adb.htm#ref_2531_7">Txt</a>) <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_2052_14">Screen_Set_File</a>;
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_2540_14" href="terminal_interface-curses__ads.htm#ref_2084_14">Resize</a></span> (<span class="symbol"><a name="ref_2540_22" href="terminal_interface-curses__ads.htm#ref_2084_22">Win</a></span>               : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                     <span class="symbol"><a name="ref_2541_22" href="terminal_interface-curses__ads.htm#ref_2085_22">Number_Of_Lines</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a>;
+                     <span class="symbol"><a name="ref_2542_22" href="terminal_interface-curses__ads.htm#ref_2086_22">Number_Of_Columns</a></span> : <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a>) <b>is</b>
+      <b>function</b> <span class="symbol"><a name="ref_2543_16">wresize</a></span> (<span class="symbol"><a name="ref_2543_25">win</a></span>     : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+                        <span class="symbol"><a name="ref_2544_25">lines</a></span>   : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+                        <span class="symbol"><a name="ref_2545_25">columns</a></span> : <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>) <b>return</b> <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a>;
+      <b>pragma</b> Import (C, wresize);
+   <b>begin</b>
+      <b>if</b> <a href="terminal_interface-curses__adb.htm#ref_2543_16">wresize</a> (<a href="terminal_interface-curses__ads.htm#ref_2084_22">Win</a>,
+                  <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_2085_22">Number_Of_Lines</a>),
+                  <a href="terminal_interface-curses-aux__ads.htm#ref_49_12">C_Int</a> (<a href="terminal_interface-curses__ads.htm#ref_2086_22">Number_Of_Columns</a>)) = <a href="terminal_interface-curses-aux__ads.htm#ref_64_4">Curses_Err</a>
+      <b>then</b>
+         <b>raise</b> <a href="terminal_interface-curses__ads.htm#ref_522_4">Curses_Exception</a>;
+      <b>end</b> <b>if</b>;
+   <b>end</b> <a href="terminal_interface-curses__ads.htm#ref_2084_14">Resize</a>;
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses__ads.htm b/doc/html/ada/terminal_interface-curses__ads.htm
new file mode 100644
index 0000000..c39b2f4
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses__ads.htm
@@ -0,0 +1,2121 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses.ads</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses.ads </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                         Terminal_Interface.Curses                        --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 S P E C                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1998-2011,2014 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.48 @</em></span>
+<span class="comment"><em>--  @Date: 2020/02/02 23:34:34 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>with</b> System.Storage_Elements;
+<b>with</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C;   <span class="comment"><em>--  We need this for some assertions.</em></span>
+
+<b>with</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>;
+
+<b>package</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<span class="symbol"><a name="ref_48_28" href="terminal_interface-curses__adb.htm#ref_51_33">Curses</a></span> <b>is</b>
+   <b>pragma</b> Preelaborate (<a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>);
+   <b>pragma</b> Linker_Options ("-lncurses" &amp; <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_9_4">DFT_ARG_SUFFIX</a>);
+
+   <span class="symbol"><a name="ref_52_4">Major_Version</a></span> : <b>constant</b> := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_21_4">NCURSES_VERSION_MAJOR</a>;
+   <span class="symbol"><a name="ref_53_4">Minor_Version</a></span> : <b>constant</b> := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_22_4">NCURSES_VERSION_MINOR</a>;
+   NC_Version : String <b>renames</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_23_4">Version</a>;
+
+   <b>type</b> <span class="symbol"><a name="ref_56_9">Window</a></span> <b>is</b> <b>private</b>;
+   <span class="symbol"><a name="ref_57_4">Null_Window</a></span> : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+
+   <b>type</b> <span class="symbol"><a name="ref_59_9">Line_Position</a></span>   <b>is</b> <b>new</b> Integer; <span class="comment"><em>--  line coordinate</em></span>
+   <b>type</b> <span class="symbol"><a name="ref_60_9">Column_Position</a></span> <b>is</b> <b>new</b> Integer; <span class="comment"><em>--  column coordinate</em></span>
+
+   <b>subtype</b> <span class="symbol"><a name="ref_62_12">Line_Count</a></span>   <b>is</b> <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>   <b>range</b> 1 .. <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>'Last;
+   <span class="comment"><em>--  Type to count lines. We do not allow null windows, so must be positive</em></span>
+   <b>subtype</b> <span class="symbol"><a name="ref_64_12">Column_Count</a></span> <b>is</b> <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a> <b>range</b> 1 .. <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>'Last;
+   <span class="comment"><em>--  Type to count columns. We do not allow null windows, so must be positive</em></span>
+
+   <b>type</b> <span class="symbol"><a name="ref_67_9">Key_Code</a></span> <b>is</b> <b>new</b> Integer;
+   <span class="comment"><em>--  That is anything including real characters, special keys and logical</em></span>
+   <span class="comment"><em>--  request codes.</em></span>
+
+   <span class="comment"><em>--  FIXME: The "-1" should be Curses_Err</em></span>
+   <b>subtype</b> <span class="symbol"><a name="ref_72_12">Real_Key_Code</a></span> <b>is</b> <a href="terminal_interface-curses__ads.htm#ref_67_9">Key_Code</a> <b>range</b> -1 .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_99_4">KEY_MAX</a>;
+   <span class="comment"><em>--  This are the codes that potentially represent a real keystroke.</em></span>
+   <span class="comment"><em>--  Not all codes may be possible on a specific terminal. To check the</em></span>
+   <span class="comment"><em>--  availability of a special key, the Has_Key function is provided.</em></span>
+
+   <b>subtype</b> <span class="symbol"><a name="ref_77_12">Special_Key_Code</a></span> <b>is</b> <a href="terminal_interface-curses__ads.htm#ref_72_12">Real_Key_Code</a>
+     <b>range</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>. <a href="terminal_interface-curses_constants__ads.htm#ref_98_4">KEY_MIN</a> - 1 .. <a href="terminal_interface-curses__ads.htm#ref_72_12">Real_Key_Code</a>'Last;
+   <span class="comment"><em>--  Type for a function- or special key number</em></span>
+
+   <b>subtype</b> <span class="symbol"><a name="ref_81_12">Normal_Key_Code</a></span> <b>is</b> <a href="terminal_interface-curses__ads.htm#ref_72_12">Real_Key_Code</a> <b>range</b>
+     Character'Pos (Character'First) .. Character'Pos (Character'Last);
+   <span class="comment"><em>--  This are the codes for regular (incl. non-graphical) characters.</em></span>
+
+   <span class="comment"><em>--  For those who like to use the original key names we produce them were</em></span>
+   <span class="comment"><em>--  they differ from the original.</em></span>
+
+   <span class="comment"><em>--  Constants for function- and special keys</em></span>
+   <span class="symbol"><a name="ref_89_4">Key_None</a></span>                    : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_98_4">KEY_MIN</a> - 1;
+   <span class="symbol"><a name="ref_91_4">Key_Min</a></span>                     : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_98_4">KEY_MIN</a>;
+   <span class="symbol"><a name="ref_93_4">Key_Break</a></span>                   : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_104_4">KEY_BREAK</a>;
+   <span class="symbol"><a name="ref_95_4">KEY_DOWN</a></span>                    : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_105_4">KEY_DOWN</a>;
+   Key_Cursor_Down             : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_95_4">KEY_DOWN</a>;
+   <span class="symbol"><a name="ref_98_4">KEY_UP</a></span>                      : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_106_4">KEY_UP</a>;
+   Key_Cursor_Up               : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_98_4">KEY_UP</a>;
+   <span class="symbol"><a name="ref_101_4">KEY_LEFT</a></span>                    : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_107_4">KEY_LEFT</a>;
+   Key_Cursor_Left             : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_101_4">KEY_LEFT</a>;
+   <span class="symbol"><a name="ref_104_4">KEY_RIGHT</a></span>                   : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_108_4">KEY_RIGHT</a>;
+   Key_Cursor_Right            : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_104_4">KEY_RIGHT</a>;
+   <span class="symbol"><a name="ref_107_4">Key_Home</a></span>                    : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_109_4">KEY_HOME</a>;
+   <span class="symbol"><a name="ref_109_4">Key_Backspace</a></span>               : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_110_4">KEY_BACKSPACE</a>;
+   <span class="symbol"><a name="ref_111_4">Key_F0</a></span>                      : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_111_4">KEY_F0</a>;
+   <span class="symbol"><a name="ref_113_4">Key_F1</a></span>                      : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_112_4">KEY_F1</a>;
+   <span class="symbol"><a name="ref_115_4">Key_F2</a></span>                      : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_113_4">KEY_F2</a>;
+   <span class="symbol"><a name="ref_117_4">Key_F3</a></span>                      : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_114_4">KEY_F3</a>;
+   <span class="symbol"><a name="ref_119_4">Key_F4</a></span>                      : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_115_4">KEY_F4</a>;
+   <span class="symbol"><a name="ref_121_4">Key_F5</a></span>                      : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_116_4">KEY_F5</a>;
+   <span class="symbol"><a name="ref_123_4">Key_F6</a></span>                      : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_117_4">KEY_F6</a>;
+   <span class="symbol"><a name="ref_125_4">Key_F7</a></span>                      : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_118_4">KEY_F7</a>;
+   <span class="symbol"><a name="ref_127_4">Key_F8</a></span>                      : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_119_4">KEY_F8</a>;
+   <span class="symbol"><a name="ref_129_4">Key_F9</a></span>                      : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_120_4">KEY_F9</a>;
+   <span class="symbol"><a name="ref_131_4">Key_F10</a></span>                     : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_121_4">KEY_F10</a>;
+   <span class="symbol"><a name="ref_133_4">Key_F11</a></span>                     : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_122_4">KEY_F11</a>;
+   <span class="symbol"><a name="ref_135_4">Key_F12</a></span>                     : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_123_4">KEY_F12</a>;
+   <span class="symbol"><a name="ref_137_4">Key_F13</a></span>                     : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_124_4">KEY_F13</a>;
+   <span class="symbol"><a name="ref_139_4">Key_F14</a></span>                     : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_125_4">KEY_F14</a>;
+   <span class="symbol"><a name="ref_141_4">Key_F15</a></span>                     : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_126_4">KEY_F15</a>;
+   <span class="symbol"><a name="ref_143_4">Key_F16</a></span>                     : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_127_4">KEY_F16</a>;
+   <span class="symbol"><a name="ref_145_4">Key_F17</a></span>                     : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_128_4">KEY_F17</a>;
+   <span class="symbol"><a name="ref_147_4">Key_F18</a></span>                     : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_129_4">KEY_F18</a>;
+   <span class="symbol"><a name="ref_149_4">Key_F19</a></span>                     : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_130_4">KEY_F19</a>;
+   <span class="symbol"><a name="ref_151_4">Key_F20</a></span>                     : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_131_4">KEY_F20</a>;
+   <span class="symbol"><a name="ref_153_4">Key_F21</a></span>                     : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_132_4">KEY_F21</a>;
+   <span class="symbol"><a name="ref_155_4">Key_F22</a></span>                     : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_133_4">KEY_F22</a>;
+   <span class="symbol"><a name="ref_157_4">Key_F23</a></span>                     : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_134_4">KEY_F23</a>;
+   <span class="symbol"><a name="ref_159_4">Key_F24</a></span>                     : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_135_4">KEY_F24</a>;
+   <span class="symbol"><a name="ref_161_4">KEY_DL</a></span>                      : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_136_4">KEY_DL</a>;
+   Key_Delete_Line             : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_161_4">KEY_DL</a>;
+   <span class="symbol"><a name="ref_164_4">KEY_IL</a></span>                      : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_137_4">KEY_IL</a>;
+   Key_Insert_Line             : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_164_4">KEY_IL</a>;
+   <span class="symbol"><a name="ref_167_4">KEY_DC</a></span>                      : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_138_4">KEY_DC</a>;
+   Key_Delete_Char             : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_167_4">KEY_DC</a>;
+   <span class="symbol"><a name="ref_170_4">KEY_IC</a></span>                      : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_139_4">KEY_IC</a>;
+   Key_Insert_Char             : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_170_4">KEY_IC</a>;
+   <span class="symbol"><a name="ref_173_4">KEY_EIC</a></span>                     : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_140_4">KEY_EIC</a>;
+   Key_Exit_Insert_Mode        : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_173_4">KEY_EIC</a>;
+   <span class="symbol"><a name="ref_176_4">KEY_CLEAR</a></span>                   : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_141_4">KEY_CLEAR</a>;
+   Key_Clear_Screen            : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_176_4">KEY_CLEAR</a>;
+   <span class="symbol"><a name="ref_179_4">KEY_EOS</a></span>                     : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_142_4">KEY_EOS</a>;
+   Key_Clear_End_Of_Screen     : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_179_4">KEY_EOS</a>;
+   <span class="symbol"><a name="ref_182_4">KEY_EOL</a></span>                     : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_143_4">KEY_EOL</a>;
+   Key_Clear_End_Of_Line       : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_182_4">KEY_EOL</a>;
+   <span class="symbol"><a name="ref_185_4">KEY_SF</a></span>                      : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_144_4">KEY_SF</a>;
+   Key_Scroll_1_Forward        : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_185_4">KEY_SF</a>;
+   <span class="symbol"><a name="ref_188_4">KEY_SR</a></span>                      : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_145_4">KEY_SR</a>;
+   Key_Scroll_1_Backward       : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_188_4">KEY_SR</a>;
+   <span class="symbol"><a name="ref_191_4">KEY_NPAGE</a></span>                   : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_146_4">KEY_NPAGE</a>;
+   Key_Next_Page               : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_191_4">KEY_NPAGE</a>;
+   <span class="symbol"><a name="ref_194_4">KEY_PPAGE</a></span>                   : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_147_4">KEY_PPAGE</a>;
+   Key_Previous_Page           : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_194_4">KEY_PPAGE</a>;
+   <span class="symbol"><a name="ref_197_4">KEY_STAB</a></span>                    : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_148_4">KEY_STAB</a>;
+   Key_Set_Tab                 : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_197_4">KEY_STAB</a>;
+   <span class="symbol"><a name="ref_200_4">KEY_CTAB</a></span>                    : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_149_4">KEY_CTAB</a>;
+   Key_Clear_Tab               : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_200_4">KEY_CTAB</a>;
+   <span class="symbol"><a name="ref_203_4">KEY_CATAB</a></span>                   : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_150_4">KEY_CATAB</a>;
+   Key_Clear_All_Tabs          : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_203_4">KEY_CATAB</a>;
+   <span class="symbol"><a name="ref_206_4">KEY_ENTER</a></span>                   : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_151_4">KEY_ENTER</a>;
+   Key_Enter_Or_Send           : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_206_4">KEY_ENTER</a>;
+   <span class="symbol"><a name="ref_209_4">KEY_SRESET</a></span>                  : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_152_4">KEY_SRESET</a>;
+   Key_Soft_Reset              : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_209_4">KEY_SRESET</a>;
+   <span class="symbol"><a name="ref_212_4">Key_Reset</a></span>                   : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_153_4">KEY_RESET</a>;
+   <span class="symbol"><a name="ref_214_4">Key_Print</a></span>                   : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_154_4">KEY_PRINT</a>;
+   <span class="symbol"><a name="ref_216_4">KEY_LL</a></span>                      : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_155_4">KEY_LL</a>;
+   Key_Bottom                  : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_216_4">KEY_LL</a>;
+   <span class="symbol"><a name="ref_219_4">KEY_A1</a></span>                      : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_156_4">KEY_A1</a>;
+   Key_Upper_Left_Of_Keypad    : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_219_4">KEY_A1</a>;
+   <span class="symbol"><a name="ref_222_4">KEY_A3</a></span>                      : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_157_4">KEY_A3</a>;
+   Key_Upper_Right_Of_Keypad   : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_222_4">KEY_A3</a>;
+   <span class="symbol"><a name="ref_225_4">KEY_B2</a></span>                      : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_158_4">KEY_B2</a>;
+   Key_Center_Of_Keypad        : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_225_4">KEY_B2</a>;
+   <span class="symbol"><a name="ref_228_4">KEY_C1</a></span>                      : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_159_4">KEY_C1</a>;
+   Key_Lower_Left_Of_Keypad    : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_228_4">KEY_C1</a>;
+   <span class="symbol"><a name="ref_231_4">KEY_C3</a></span>                      : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_160_4">KEY_C3</a>;
+   Key_Lower_Right_Of_Keypad   : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_231_4">KEY_C3</a>;
+   <span class="symbol"><a name="ref_234_4">KEY_BTAB</a></span>                    : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_161_4">KEY_BTAB</a>;
+   Key_Back_Tab                : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_234_4">KEY_BTAB</a>;
+   <span class="symbol"><a name="ref_237_4">KEY_BEG</a></span>                     : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_162_4">KEY_BEG</a>;
+   Key_Beginning               : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_237_4">KEY_BEG</a>;
+   <span class="symbol"><a name="ref_240_4">Key_Cancel</a></span>                  : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_163_4">KEY_CANCEL</a>;
+   <span class="symbol"><a name="ref_242_4">Key_Close</a></span>                   : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_164_4">KEY_CLOSE</a>;
+   <span class="symbol"><a name="ref_244_4">Key_Command</a></span>                 : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_165_4">KEY_COMMAND</a>;
+   <span class="symbol"><a name="ref_246_4">Key_Copy</a></span>                    : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_166_4">KEY_COPY</a>;
+   <span class="symbol"><a name="ref_248_4">Key_Create</a></span>                  : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_167_4">KEY_CREATE</a>;
+   <span class="symbol"><a name="ref_250_4">Key_End</a></span>                     : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_168_4">KEY_END</a>;
+   <span class="symbol"><a name="ref_252_4">Key_Exit</a></span>                    : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_169_4">KEY_EXIT</a>;
+   <span class="symbol"><a name="ref_254_4">Key_Find</a></span>                    : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_170_4">KEY_FIND</a>;
+   <span class="symbol"><a name="ref_256_4">Key_Help</a></span>                    : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_171_4">KEY_HELP</a>;
+   <span class="symbol"><a name="ref_258_4">Key_Mark</a></span>                    : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_172_4">KEY_MARK</a>;
+   <span class="symbol"><a name="ref_260_4">Key_Message</a></span>                 : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_173_4">KEY_MESSAGE</a>;
+   <span class="symbol"><a name="ref_262_4">Key_Move</a></span>                    : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_174_4">KEY_MOVE</a>;
+   <span class="symbol"><a name="ref_264_4">Key_Next</a></span>                    : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_175_4">KEY_NEXT</a>;
+   <span class="symbol"><a name="ref_266_4">Key_Open</a></span>                    : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_176_4">KEY_OPEN</a>;
+   <span class="symbol"><a name="ref_268_4">Key_Options</a></span>                 : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_177_4">KEY_OPTIONS</a>;
+   <span class="symbol"><a name="ref_270_4">Key_Previous</a></span>                : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_178_4">KEY_PREVIOUS</a>;
+   <span class="symbol"><a name="ref_272_4">Key_Redo</a></span>                    : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_179_4">KEY_REDO</a>;
+   <span class="symbol"><a name="ref_274_4">Key_Reference</a></span>               : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_180_4">KEY_REFERENCE</a>;
+   <span class="symbol"><a name="ref_276_4">Key_Refresh</a></span>                 : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_181_4">KEY_REFRESH</a>;
+   <span class="symbol"><a name="ref_278_4">Key_Replace</a></span>                 : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_182_4">KEY_REPLACE</a>;
+   <span class="symbol"><a name="ref_280_4">Key_Restart</a></span>                 : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_183_4">KEY_RESTART</a>;
+   <span class="symbol"><a name="ref_282_4">Key_Resume</a></span>                  : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_184_4">KEY_RESUME</a>;
+   <span class="symbol"><a name="ref_284_4">Key_Save</a></span>                    : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_185_4">KEY_SAVE</a>;
+   <span class="symbol"><a name="ref_286_4">KEY_SBEG</a></span>                    : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_186_4">KEY_SBEG</a>;
+   Key_Shift_Begin             : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_286_4">KEY_SBEG</a>;
+   <span class="symbol"><a name="ref_289_4">KEY_SCANCEL</a></span>                 : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_187_4">KEY_SCANCEL</a>;
+   Key_Shift_Cancel            : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_289_4">KEY_SCANCEL</a>;
+   <span class="symbol"><a name="ref_292_4">KEY_SCOMMAND</a></span>                : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_188_4">KEY_SCOMMAND</a>;
+   Key_Shift_Command           : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_292_4">KEY_SCOMMAND</a>;
+   <span class="symbol"><a name="ref_295_4">KEY_SCOPY</a></span>                   : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_189_4">KEY_SCOPY</a>;
+   Key_Shift_Copy              : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_295_4">KEY_SCOPY</a>;
+   <span class="symbol"><a name="ref_298_4">KEY_SCREATE</a></span>                 : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_190_4">KEY_SCREATE</a>;
+   Key_Shift_Create            : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_298_4">KEY_SCREATE</a>;
+   <span class="symbol"><a name="ref_301_4">KEY_SDC</a></span>                     : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_191_4">KEY_SDC</a>;
+   Key_Shift_Delete_Char       : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_301_4">KEY_SDC</a>;
+   <span class="symbol"><a name="ref_304_4">KEY_SDL</a></span>                     : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_192_4">KEY_SDL</a>;
+   Key_Shift_Delete_Line       : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_304_4">KEY_SDL</a>;
+   <span class="symbol"><a name="ref_307_4">Key_Select</a></span>                  : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_193_4">KEY_SELECT</a>;
+   <span class="symbol"><a name="ref_309_4">KEY_SEND</a></span>                    : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_194_4">KEY_SEND</a>;
+   Key_Shift_End               : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_309_4">KEY_SEND</a>;
+   <span class="symbol"><a name="ref_312_4">KEY_SEOL</a></span>                    : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_195_4">KEY_SEOL</a>;
+   Key_Shift_Clear_End_Of_Line : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_312_4">KEY_SEOL</a>;
+   <span class="symbol"><a name="ref_315_4">KEY_SEXIT</a></span>                   : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_196_4">KEY_SEXIT</a>;
+   Key_Shift_Exit              : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_315_4">KEY_SEXIT</a>;
+   <span class="symbol"><a name="ref_318_4">KEY_SFIND</a></span>                   : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_197_4">KEY_SFIND</a>;
+   Key_Shift_Find              : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_318_4">KEY_SFIND</a>;
+   <span class="symbol"><a name="ref_321_4">KEY_SHELP</a></span>                   : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_198_4">KEY_SHELP</a>;
+   Key_Shift_Help              : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_321_4">KEY_SHELP</a>;
+   <span class="symbol"><a name="ref_324_4">KEY_SHOME</a></span>                   : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_199_4">KEY_SHOME</a>;
+   Key_Shift_Home              : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_324_4">KEY_SHOME</a>;
+   <span class="symbol"><a name="ref_327_4">KEY_SIC</a></span>                     : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_200_4">KEY_SIC</a>;
+   Key_Shift_Insert_Char       : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_327_4">KEY_SIC</a>;
+   <span class="symbol"><a name="ref_330_4">KEY_SLEFT</a></span>                   : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_201_4">KEY_SLEFT</a>;
+   Key_Shift_Cursor_Left       : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_330_4">KEY_SLEFT</a>;
+   <span class="symbol"><a name="ref_333_4">KEY_SMESSAGE</a></span>                : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_202_4">KEY_SMESSAGE</a>;
+   Key_Shift_Message           : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_333_4">KEY_SMESSAGE</a>;
+   <span class="symbol"><a name="ref_336_4">KEY_SMOVE</a></span>                   : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_203_4">KEY_SMOVE</a>;
+   Key_Shift_Move              : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_336_4">KEY_SMOVE</a>;
+   <span class="symbol"><a name="ref_339_4">KEY_SNEXT</a></span>                   : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_204_4">KEY_SNEXT</a>;
+   Key_Shift_Next_Page         : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_339_4">KEY_SNEXT</a>;
+   <span class="symbol"><a name="ref_342_4">KEY_SOPTIONS</a></span>                : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_205_4">KEY_SOPTIONS</a>;
+   Key_Shift_Options           : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_342_4">KEY_SOPTIONS</a>;
+   <span class="symbol"><a name="ref_345_4">KEY_SPREVIOUS</a></span>               : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_206_4">KEY_SPREVIOUS</a>;
+   Key_Shift_Previous_Page     : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_345_4">KEY_SPREVIOUS</a>;
+   <span class="symbol"><a name="ref_348_4">KEY_SPRINT</a></span>                  : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_207_4">KEY_SPRINT</a>;
+   Key_Shift_Print             : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_348_4">KEY_SPRINT</a>;
+   <span class="symbol"><a name="ref_351_4">KEY_SREDO</a></span>                   : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_208_4">KEY_SREDO</a>;
+   Key_Shift_Redo              : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_351_4">KEY_SREDO</a>;
+   <span class="symbol"><a name="ref_354_4">KEY_SREPLACE</a></span>                : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_209_4">KEY_SREPLACE</a>;
+   Key_Shift_Replace           : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_354_4">KEY_SREPLACE</a>;
+   <span class="symbol"><a name="ref_357_4">KEY_SRIGHT</a></span>                  : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_210_4">KEY_SRIGHT</a>;
+   Key_Shift_Cursor_Right      : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_357_4">KEY_SRIGHT</a>;
+   <span class="symbol"><a name="ref_360_4">KEY_SRSUME</a></span>                  : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_211_4">KEY_SRSUME</a>;
+   Key_Shift_Resume            : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_360_4">KEY_SRSUME</a>;
+   <span class="symbol"><a name="ref_363_4">KEY_SSAVE</a></span>                   : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_212_4">KEY_SSAVE</a>;
+   Key_Shift_Save              : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_363_4">KEY_SSAVE</a>;
+   <span class="symbol"><a name="ref_366_4">KEY_SSUSPEND</a></span>                : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_213_4">KEY_SSUSPEND</a>;
+   Key_Shift_Suspend           : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_366_4">KEY_SSUSPEND</a>;
+   <span class="symbol"><a name="ref_369_4">KEY_SUNDO</a></span>                   : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_214_4">KEY_SUNDO</a>;
+   Key_Shift_Undo              : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_369_4">KEY_SUNDO</a>;
+   <span class="symbol"><a name="ref_372_4">Key_Suspend</a></span>                 : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_215_4">KEY_SUSPEND</a>;
+   <span class="symbol"><a name="ref_374_4">Key_Undo</a></span>                    : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_216_4">KEY_UNDO</a>;
+   <span class="symbol"><a name="ref_376_4">Key_Mouse</a></span>                   : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_217_4">KEY_MOUSE</a>;
+   <span class="symbol"><a name="ref_378_4">Key_Resize</a></span>                  : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_218_4">KEY_RESIZE</a>;
+   <span class="symbol"><a name="ref_380_4">Key_Max</a></span>                     : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>
+     := <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>'Last;
+
+   <b>subtype</b> <span class="symbol"><a name="ref_383_12">User_Key_Code</a></span> <b>is</b> <a href="terminal_interface-curses__ads.htm#ref_67_9">Key_Code</a>
+     <b>range</b> (<a href="terminal_interface-curses__ads.htm#ref_380_4">Key_Max</a> + 129) .. <a href="terminal_interface-curses__ads.htm#ref_67_9">Key_Code</a>'Last;
+   <span class="comment"><em>--  This is reserved for user defined key codes. The range between Key_Max</em></span>
+   <span class="comment"><em>--  and the first user code is reserved for subsystems like menu and forms.</em></span>
+
+   <span class="comment"><em>--------------------------------------------------------------------------</em></span>
+
+   <b>type</b> <span class="symbol"><a name="ref_390_9">Color_Number</a></span> <b>is</b> <b>range</b> -1 .. Integer (<a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.short'Last);
+   <b>for</b> <a href="terminal_interface-curses__ads.htm#ref_390_9">Color_Number</a>'Size <b>use</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.short'Size;
+   <span class="comment"><em>--  (n)curses uses a short for the color index</em></span>
+   <span class="comment"><em>--  The model is, that a Color_Number is an index into an array of</em></span>
+   <span class="comment"><em>--  (potentially) definable colors. Some of those indices are</em></span>
+   <span class="comment"><em>--  predefined (see below), although they may not really exist.</em></span>
+
+   <span class="symbol"><a name="ref_397_4">Black</a></span>   : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_390_9">Color_Number</a> := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_69_4">COLOR_BLACK</a>;
+   <span class="symbol"><a name="ref_398_4">Red</a></span>     : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_390_9">Color_Number</a> := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_70_4">COLOR_RED</a>;
+   <span class="symbol"><a name="ref_399_4">Green</a></span>   : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_390_9">Color_Number</a> := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_71_4">COLOR_GREEN</a>;
+   <span class="symbol"><a name="ref_400_4">Yellow</a></span>  : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_390_9">Color_Number</a> := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_72_4">COLOR_YELLOW</a>;
+   <span class="symbol"><a name="ref_401_4">Blue</a></span>    : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_390_9">Color_Number</a> := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_73_4">COLOR_BLUE</a>;
+   <span class="symbol"><a name="ref_402_4">Magenta</a></span> : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_390_9">Color_Number</a> := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_74_4">COLOR_MAGENTA</a>;
+   <span class="symbol"><a name="ref_403_4">Cyan</a></span>    : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_390_9">Color_Number</a> := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_75_4">COLOR_CYAN</a>;
+   <span class="symbol"><a name="ref_404_4">White</a></span>   : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_390_9">Color_Number</a> := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_76_4">COLOR_WHITE</a>;
+
+   <b>type</b> <span class="symbol"><a name="ref_406_9">RGB_Value</a></span> <b>is</b> <b>range</b> 0 .. Integer (<a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.short'Last);
+   <b>for</b> <a href="terminal_interface-curses__ads.htm#ref_406_9">RGB_Value</a>'Size <b>use</b> <a href="interfac__ads.htm#ref_38_9">Interfaces</a>.C.short'Size;
+   <span class="comment"><em>--  Some system may allow to redefine a color by setting RGB values.</em></span>
+
+   <b>type</b> <span class="symbol"><a name="ref_410_9">Color_Pair</a></span> <b>is</b> <b>range</b> 0 .. 255;
+   <b>for</b> <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>'Size <b>use</b> 8;
+   <b>subtype</b> <span class="symbol"><a name="ref_412_12">Redefinable_Color_Pair</a></span> <b>is</b> <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a> <b>range</b> 1 .. 255;
+   <span class="comment"><em>--  (n)curses reserves 1 Byte for the color-pair number. Color Pair 0</em></span>
+   <span class="comment"><em>--  is fixed (Black &amp; White). A color pair is simply a combination of</em></span>
+   <span class="comment"><em>--  two colors described by Color_Numbers, one for the foreground and</em></span>
+   <span class="comment"><em>--  the other for the background</em></span>
+
+   <b>type</b> <span class="symbol"><a name="ref_418_9">Character_Attribute_Set</a></span> <b>is</b>
+      <b>record</b>
+         <span class="symbol"><a name="ref_420_10">Stand_Out</a></span>               : Boolean;
+         <span class="symbol"><a name="ref_421_10">Under_Line</a></span>              : Boolean;
+         <span class="symbol"><a name="ref_422_10">Reverse_Video</a></span>           : Boolean;
+         <span class="symbol"><a name="ref_423_10">Blink</a></span>                   : Boolean;
+         <span class="symbol"><a name="ref_424_10">Dim_Character</a></span>           : Boolean;
+         <span class="symbol"><a name="ref_425_10">Bold_Character</a></span>          : Boolean;
+         <span class="symbol"><a name="ref_426_10">Protected_Character</a></span>     : Boolean;
+         <span class="symbol"><a name="ref_427_10">Invisible_Character</a></span>     : Boolean;
+         <span class="symbol"><a name="ref_428_10">Alternate_Character_Set</a></span> : Boolean;
+         <span class="symbol"><a name="ref_429_10">Horizontal</a></span>              : Boolean;
+         <span class="symbol"><a name="ref_430_10">Left</a></span>                    : Boolean;
+         <span class="symbol"><a name="ref_431_10">Low</a></span>                     : Boolean;
+         <span class="symbol"><a name="ref_432_10">Right</a></span>                   : Boolean;
+         <span class="symbol"><a name="ref_433_10">Top</a></span>                     : Boolean;
+         <span class="symbol"><a name="ref_434_10">Vertical</a></span>                : Boolean;
+      <b>end</b> <b>record</b>;
+
+   <b>for</b> <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a> <b>use</b>
+      <b>record</b>
+         <a href="terminal_interface-curses__ads.htm#ref_420_10">Stand_Out</a> <b>at</b> 0 <b>range</b>
+           <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_35_4">A_STANDOUT_First</a> - <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_33_4">Attr_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_36_4">A_STANDOUT_Last</a> - <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_33_4">Attr_First</a>;
+         <a href="terminal_interface-curses__ads.htm#ref_421_10">Under_Line</a> <b>at</b> 0 <b>range</b>
+           <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_37_4">A_UNDERLINE_First</a> - <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_33_4">Attr_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_38_4">A_UNDERLINE_Last</a> - <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_33_4">Attr_First</a>;
+         <a href="terminal_interface-curses__ads.htm#ref_422_10">Reverse_Video</a> <b>at</b> 0 <b>range</b>
+           <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_39_4">A_REVERSE_First</a> - <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_33_4">Attr_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_40_4">A_REVERSE_Last</a> - <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_33_4">Attr_First</a>;
+         <a href="terminal_interface-curses__ads.htm#ref_423_10">Blink</a> <b>at</b> 0 <b>range</b>
+           <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_41_4">A_BLINK_First</a> - <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_33_4">Attr_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_42_4">A_BLINK_Last</a> - <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_33_4">Attr_First</a>;
+         <a href="terminal_interface-curses__ads.htm#ref_424_10">Dim_Character</a> <b>at</b> 0 <b>range</b>
+           <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_43_4">A_DIM_First</a> - <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_33_4">Attr_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_44_4">A_DIM_Last</a> - <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_33_4">Attr_First</a>;
+         <a href="terminal_interface-curses__ads.htm#ref_425_10">Bold_Character</a> <b>at</b> 0 <b>range</b>
+           <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_45_4">A_BOLD_First</a> - <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_33_4">Attr_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_46_4">A_BOLD_Last</a> - <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_33_4">Attr_First</a>;
+         <a href="terminal_interface-curses__ads.htm#ref_426_10">Protected_Character</a> <b>at</b> 0 <b>range</b>
+           <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_47_4">A_PROTECT_First</a> - <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_33_4">Attr_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_48_4">A_PROTECT_Last</a> - <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_33_4">Attr_First</a>;
+         <a href="terminal_interface-curses__ads.htm#ref_427_10">Invisible_Character</a> <b>at</b> 0 <b>range</b>
+           <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_49_4">A_INVIS_First</a> - <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_33_4">Attr_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_50_4">A_INVIS_Last</a> - <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_33_4">Attr_First</a>;
+         <a href="terminal_interface-curses__ads.htm#ref_428_10">Alternate_Character_Set</a> <b>at</b> 0 <b>range</b>
+           <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_51_4">A_ALTCHARSET_First</a> - <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_33_4">Attr_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_52_4">A_ALTCHARSET_Last</a> - <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_33_4">Attr_First</a>;
+         <a href="terminal_interface-curses__ads.htm#ref_429_10">Horizontal</a> <b>at</b> 0 <b>range</b>
+           <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_53_4">A_HORIZONTAL_First</a> - <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_33_4">Attr_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_54_4">A_HORIZONTAL_Last</a> - <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_33_4">Attr_First</a>;
+         <a href="terminal_interface-curses__ads.htm#ref_430_10">Left</a> <b>at</b> 0 <b>range</b>
+           <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_55_4">A_LEFT_First</a> - <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_33_4">Attr_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_56_4">A_LEFT_Last</a> - <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_33_4">Attr_First</a>;
+         <a href="terminal_interface-curses__ads.htm#ref_431_10">Low</a> <b>at</b> 0 <b>range</b>
+           <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_57_4">A_LOW_First</a> - <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_33_4">Attr_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_58_4">A_LOW_Last</a> - <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_33_4">Attr_First</a>;
+         <a href="terminal_interface-curses__ads.htm#ref_432_10">Right</a> <b>at</b> 0 <b>range</b>
+           <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_59_4">A_RIGHT_First</a> - <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_33_4">Attr_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_60_4">A_RIGHT_Last</a> - <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_33_4">Attr_First</a>;
+         <a href="terminal_interface-curses__ads.htm#ref_433_10">Top</a> <b>at</b> 0 <b>range</b>
+           <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_61_4">A_TOP_First</a> - <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_33_4">Attr_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_62_4">A_TOP_Last</a> - <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_33_4">Attr_First</a>;
+         <a href="terminal_interface-curses__ads.htm#ref_434_10">Vertical</a> <b>at</b> 0 <b>range</b>
+           <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_63_4">A_VERTICAL_First</a> - <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_33_4">Attr_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_64_4">A_VERTICAL_Last</a> - <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_33_4">Attr_First</a>;
+      <b>end</b> <b>record</b>;
+
+   <span class="symbol"><a name="ref_486_4">Normal_Video</a></span> : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a> := (<b>others</b> =&gt; False);
+
+   <b>type</b> <span class="symbol"><a name="ref_488_9">Attributed_Character</a></span> <b>is</b>
+      <b>record</b>
+         <span class="symbol"><a name="ref_490_10">Attr</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a>;
+         <span class="symbol"><a name="ref_491_10">Color</a></span> : <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>;
+         <span class="symbol"><a name="ref_492_10">Ch</a></span>    : Character;
+      <b>end</b> <b>record</b>;
+   <b>pragma</b> Convention (C_Pass_By_Copy, <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>);
+   <span class="comment"><em>--  This is the counterpart for the chtype in C.</em></span>
+
+   <b>for</b> <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a> <b>use</b>
+      <b>record</b>
+         <a href="terminal_interface-curses__ads.htm#ref_492_10">Ch</a>    <b>at</b> 0 <b>range</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_29_4">A_CHARTEXT_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_30_4">A_CHARTEXT_Last</a>;
+         <a href="terminal_interface-curses__ads.htm#ref_491_10">Color</a> <b>at</b> 0 <b>range</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_31_4">A_COLOR_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_32_4">A_COLOR_Last</a>;
+         <b>pragma</b> Warnings (Off);
+         <a href="terminal_interface-curses__ads.htm#ref_490_10">Attr</a>  <b>at</b> 0 <b>range</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_33_4">Attr_First</a>
+           .. <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_34_4">Attr_Last</a>;
+         <b>pragma</b> Warnings (On);
+      <b>end</b> <b>record</b>;
+   <b>for</b> <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>'Size <b>use</b> <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_65_4">chtype_Size</a>;
+
+   <span class="symbol"><a name="ref_510_4">Default_Character</a></span> : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>
+     := (<a href="terminal_interface-curses__ads.htm#ref_492_10">Ch</a>    =&gt; Character'First,
+         <a href="terminal_interface-curses__ads.htm#ref_491_10">Color</a> =&gt; <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>'First,
+         <a href="terminal_interface-curses__ads.htm#ref_490_10">Attr</a>  =&gt; (<b>others</b> =&gt; False));  <span class="comment"><em>--  preelaboratable Normal_Video</em></span>
+
+   <b>type</b> Attributed_String <b>is</b> <b>array</b> (Positive <b>range</b> &lt;&gt;) <b>of</b> <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>;
+   <b>pragma</b> Convention (C, Attributed_String);
+   <span class="comment"><em>--  In this binding we allow strings of attributed characters.</em></span>
+
+   <span class="comment"><em>------------------</em></span>
+   <span class="comment"><em>--  Exceptions  --</em></span>
+   <span class="comment"><em>------------------</em></span>
+   <span class="symbol"><a name="ref_522_4">Curses_Exception</a></span>     : <b>exception</b>;
+   <span class="symbol"><a name="ref_523_4">Wrong_Curses_Version</a></span> : <b>exception</b>;
+
+   <span class="comment"><em>--  Those exceptions are raised by the ETI (Extended Terminal Interface)</em></span>
+   <span class="comment"><em>--  subpackets for Menu and Forms handling.</em></span>
+   <span class="comment"><em>--</em></span>
+   <span class="symbol"><a name="ref_528_4">Eti_System_Error</a></span>    : <b>exception</b>;
+   <span class="symbol"><a name="ref_529_4">Eti_Bad_Argument</a></span>    : <b>exception</b>;
+   <span class="symbol"><a name="ref_530_4">Eti_Posted</a></span>          : <b>exception</b>;
+   <span class="symbol"><a name="ref_531_4">Eti_Connected</a></span>       : <b>exception</b>;
+   <span class="symbol"><a name="ref_532_4">Eti_Bad_State</a></span>       : <b>exception</b>;
+   <span class="symbol"><a name="ref_533_4">Eti_No_Room</a></span>         : <b>exception</b>;
+   <span class="symbol"><a name="ref_534_4">Eti_Not_Posted</a></span>      : <b>exception</b>;
+   <span class="symbol"><a name="ref_535_4">Eti_Unknown_Command</a></span> : <b>exception</b>;
+   <span class="symbol"><a name="ref_536_4">Eti_No_Match</a></span>        : <b>exception</b>;
+   <span class="symbol"><a name="ref_537_4">Eti_Not_Selectable</a></span>  : <b>exception</b>;
+   <span class="symbol"><a name="ref_538_4">Eti_Not_Connected</a></span>   : <b>exception</b>;
+   <span class="symbol"><a name="ref_539_4">Eti_Request_Denied</a></span>  : <b>exception</b>;
+   <span class="symbol"><a name="ref_540_4">Eti_Invalid_Field</a></span>   : <b>exception</b>;
+   <span class="symbol"><a name="ref_541_4">Eti_Current</a></span>         : <b>exception</b>;
+
+   <span class="comment"><em>--------------------------------------------------------------------------</em></span>
+   <span class="comment"><em>--  External C variables</em></span>
+   <span class="comment"><em>--  Conceptually even in C this are kind of constants, but they are</em></span>
+   <span class="comment"><em>--  initialized and sometimes changed by the library routines at runtime</em></span>
+   <span class="comment"><em>--  depending on the type of terminal. I believe the best way to model</em></span>
+   <span class="comment"><em>--  this is to use functions.</em></span>
+   <span class="comment"><em>--------------------------------------------------------------------------</em></span>
+
+   <b>function</b> <span class="symbol"><a name="ref_551_13" href="terminal_interface-curses__adb.htm#ref_2355_13">Lines</a></span>            <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a>;
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_551_13">Lines</a>);
+
+   <b>function</b> <span class="symbol"><a name="ref_554_13" href="terminal_interface-curses__adb.htm#ref_2363_13">Columns</a></span>          <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a>;
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_554_13">Columns</a>);
+
+   <b>function</b> <span class="symbol"><a name="ref_557_13" href="terminal_interface-curses__adb.htm#ref_2371_13">Tab_Size</a></span>         <b>return</b> Natural;
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_557_13">Tab_Size</a>);
+
+   <b>function</b> <span class="symbol"><a name="ref_560_13" href="terminal_interface-curses__adb.htm#ref_2380_13">Number_Of_Colors</a></span> <b>return</b> Natural;
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_560_13">Number_Of_Colors</a>);
+
+   <b>function</b> <span class="symbol"><a name="ref_563_13" href="terminal_interface-curses__adb.htm#ref_2388_13">Number_Of_Color_Pairs</a></span> <b>return</b> Natural;
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_563_13">Number_Of_Color_Pairs</a>);
+
+   <b>subtype</b> <span class="symbol"><a name="ref_566_12">ACS_Index</a></span> <b>is</b> Character <b>range</b>
+     Character'Val (0) .. Character'Val (127);
+   <b>function</b> <span class="symbol"><a name="ref_568_13">ACS_Map</a></span> (<span class="symbol"><a name="ref_568_22">Index</a></span> : <a href="terminal_interface-curses__ads.htm#ref_566_12">ACS_Index</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>;
+   <b>pragma</b> Import (C, ACS_Map, "acs_map_as_function");
+
+   <span class="comment"><em>--  Constants for several characters from the Alternate Character Set</em></span>
+   <span class="comment"><em>--  You must use these constants as indices into the ACS_Map function</em></span>
+   <span class="comment"><em>--  to get the corresponding attributed character at runtime</em></span>
+   <span class="symbol"><a name="ref_574_4">ACS_Upper_Left_Corner</a></span>  : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_566_12">ACS_Index</a>
+      := Character'Val (<a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_222_4">ACS_ULCORNER</a>);
+   <span class="symbol"><a name="ref_576_4">ACS_Lower_Left_Corner</a></span>  : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_566_12">ACS_Index</a>
+      := Character'Val (<a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_223_4">ACS_LLCORNER</a>);
+   <span class="symbol"><a name="ref_578_4">ACS_Upper_Right_Corner</a></span> : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_566_12">ACS_Index</a>
+      := Character'Val (<a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_224_4">ACS_URCORNER</a>);
+   <span class="symbol"><a name="ref_580_4">ACS_Lower_Right_Corner</a></span> : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_566_12">ACS_Index</a>
+      := Character'Val (<a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_225_4">ACS_LRCORNER</a>);
+   <span class="symbol"><a name="ref_582_4">ACS_Left_Tee</a></span>           : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_566_12">ACS_Index</a>
+      := Character'Val (<a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_226_4">ACS_LTEE</a>);
+   <span class="symbol"><a name="ref_584_4">ACS_Right_Tee</a></span>          : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_566_12">ACS_Index</a>
+      := Character'Val (<a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_227_4">ACS_RTEE</a>);
+   <span class="symbol"><a name="ref_586_4">ACS_Bottom_Tee</a></span>         : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_566_12">ACS_Index</a>
+      := Character'Val (<a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_228_4">ACS_BTEE</a>);
+   <span class="symbol"><a name="ref_588_4">ACS_Top_Tee</a></span>            : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_566_12">ACS_Index</a>
+      := Character'Val (<a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_229_4">ACS_TTEE</a>);
+   <span class="symbol"><a name="ref_590_4">ACS_Horizontal_Line</a></span>    : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_566_12">ACS_Index</a>
+      := Character'Val (<a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_230_4">ACS_HLINE</a>);
+   <span class="symbol"><a name="ref_592_4">ACS_Vertical_Line</a></span>      : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_566_12">ACS_Index</a>
+      := Character'Val (<a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_231_4">ACS_VLINE</a>);
+   <span class="symbol"><a name="ref_594_4">ACS_Plus_Symbol</a></span>        : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_566_12">ACS_Index</a>
+      := Character'Val (<a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_232_4">ACS_PLUS</a>);
+   <span class="symbol"><a name="ref_596_4">ACS_Scan_Line_1</a></span>        : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_566_12">ACS_Index</a>
+      := Character'Val (<a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_233_4">ACS_S1</a>);
+   <span class="symbol"><a name="ref_598_4">ACS_Scan_Line_9</a></span>        : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_566_12">ACS_Index</a>
+      := Character'Val (<a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_234_4">ACS_S9</a>);
+   <span class="symbol"><a name="ref_600_4">ACS_Diamond</a></span>            : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_566_12">ACS_Index</a>
+      := Character'Val (<a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_235_4">ACS_DIAMOND</a>);
+   <span class="symbol"><a name="ref_602_4">ACS_Checker_Board</a></span>      : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_566_12">ACS_Index</a>
+      := Character'Val (<a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_236_4">ACS_CKBOARD</a>);
+   <span class="symbol"><a name="ref_604_4">ACS_Degree</a></span>             : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_566_12">ACS_Index</a>
+      := Character'Val (<a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_237_4">ACS_DEGREE</a>);
+   <span class="symbol"><a name="ref_606_4">ACS_Plus_Minus</a></span>         : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_566_12">ACS_Index</a>
+      := Character'Val (<a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_238_4">ACS_PLMINUS</a>);
+   <span class="symbol"><a name="ref_608_4">ACS_Bullet</a></span>             : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_566_12">ACS_Index</a>
+      := Character'Val (<a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_239_4">ACS_BULLET</a>);
+   <span class="symbol"><a name="ref_610_4">ACS_Left_Arrow</a></span>         : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_566_12">ACS_Index</a>
+      := Character'Val (<a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_240_4">ACS_LARROW</a>);
+   <span class="symbol"><a name="ref_612_4">ACS_Right_Arrow</a></span>        : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_566_12">ACS_Index</a>
+      := Character'Val (<a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_241_4">ACS_RARROW</a>);
+   <span class="symbol"><a name="ref_614_4">ACS_Down_Arrow</a></span>         : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_566_12">ACS_Index</a>
+      := Character'Val (<a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_242_4">ACS_DARROW</a>);
+   <span class="symbol"><a name="ref_616_4">ACS_Up_Arrow</a></span>           : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_566_12">ACS_Index</a>
+      := Character'Val (<a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_243_4">ACS_UARROW</a>);
+   <span class="symbol"><a name="ref_618_4">ACS_Board_Of_Squares</a></span>   : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_566_12">ACS_Index</a>
+      := Character'Val (<a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_244_4">ACS_BOARD</a>);
+   <span class="symbol"><a name="ref_620_4">ACS_Lantern</a></span>            : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_566_12">ACS_Index</a>
+      := Character'Val (<a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_245_4">ACS_LANTERN</a>);
+   <span class="symbol"><a name="ref_622_4">ACS_Solid_Block</a></span>        : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_566_12">ACS_Index</a>
+      := Character'Val (<a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_246_4">ACS_BLOCK</a>);
+   <span class="symbol"><a name="ref_624_4">ACS_Scan_Line_3</a></span>        : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_566_12">ACS_Index</a>
+      := Character'Val (<a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_247_4">ACS_S3</a>);
+   <span class="symbol"><a name="ref_626_4">ACS_Scan_Line_7</a></span>        : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_566_12">ACS_Index</a>
+      := Character'Val (<a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_248_4">ACS_S7</a>);
+   <span class="symbol"><a name="ref_628_4">ACS_Less_Or_Equal</a></span>      : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_566_12">ACS_Index</a>
+      := Character'Val (<a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_249_4">ACS_LEQUAL</a>);
+   <span class="symbol"><a name="ref_630_4">ACS_Greater_Or_Equal</a></span>   : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_566_12">ACS_Index</a>
+      := Character'Val (<a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_250_4">ACS_GEQUAL</a>);
+   <span class="symbol"><a name="ref_632_4">ACS_PI</a></span>                 : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_566_12">ACS_Index</a>
+      := Character'Val (<a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_251_4">ACS_PI</a>);
+   <span class="symbol"><a name="ref_634_4">ACS_Not_Equal</a></span>          : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_566_12">ACS_Index</a>
+      := Character'Val (<a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_252_4">ACS_NEQUAL</a>);
+   <span class="symbol"><a name="ref_636_4">ACS_Sterling</a></span>           : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_566_12">ACS_Index</a>
+      := Character'Val (<a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_253_4">ACS_STERLING</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/curs_initscr.3x.html">curs_initscr.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Not implemented: newterm, set_term, delscreen</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_1">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_645_13">Standard_Window</a></span> <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_initscr.3x.html">stdscr</A></em></span>
+   <b>pragma</b> Import (C, Standard_Window, "stdscr_as_function");
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_2">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_651_13">Current_Window</a></span> <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_initscr.3x.html">curscr</A></em></span>
+   <b>pragma</b> Import (C, Current_Window, "curscr_as_function");
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_651_13">Current_Window</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_3">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_657_14" href="terminal_interface-curses__adb.htm#ref_98_14">Init_Screen</a></span>;
+
+   <span class="comment"><em>--  <A NAME="AFU_4">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_660_14">Init_Windows</a></span> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_657_14">Init_Screen</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_initscr.3x.html">initscr()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_657_14">Init_Screen</a>);
+   <span class="comment"><em>--  pragma Inline (Init_Windows);</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_5">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_666_14" href="terminal_interface-curses__adb.htm#ref_111_14">End_Windows</a></span>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_initscr.3x.html">endwin()</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_668_14">End_Screen</a></span> <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_666_14">End_Windows</a>;
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_666_14">End_Windows</a>);
+   <span class="comment"><em>--  pragma Inline (End_Screen);</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_6">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_673_13" href="terminal_interface-curses__adb.htm#ref_121_13">Is_End_Window</a></span> <b>return</b> Boolean;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_initscr.3x.html">isendwin()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_673_13">Is_End_Window</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/curs_move.3x.html">curs_move.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_7">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_682_14" href="terminal_interface-curses__adb.htm#ref_133_14">Move_Cursor</a></span> (<span class="symbol"><a name="ref_682_27" href="terminal_interface-curses__adb.htm#ref_133_27">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                          <span class="symbol"><a name="ref_683_27" href="terminal_interface-curses__adb.htm#ref_134_27">Line</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+                          <span class="symbol"><a name="ref_684_27" href="terminal_interface-curses__adb.htm#ref_135_27">Column</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_move.3x.html">wmove()</A></em></span>
+   <span class="comment"><em>--  AKA: move()</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_682_14">Move_Cursor</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/curs_addch.3x.html">curs_addch.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_8">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_694_14" href="terminal_interface-curses__adb.htm#ref_148_14">Add</a></span> (<span class="symbol"><a name="ref_694_19" href="terminal_interface-curses__adb.htm#ref_148_19">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                  <span class="symbol"><a name="ref_695_19" href="terminal_interface-curses__adb.htm#ref_149_19">Ch</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_addch.3x.html">waddch()</A></em></span>
+   <span class="comment"><em>--  AKA: addch()</em></span>
+
+   <b>procedure</b> <span class="symbol"><a name="ref_699_14" href="terminal_interface-curses__adb.htm#ref_160_14">Add</a></span> (<span class="symbol"><a name="ref_699_19" href="terminal_interface-curses__adb.htm#ref_160_19">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                  <span class="symbol"><a name="ref_700_19" href="terminal_interface-curses__adb.htm#ref_161_19">Ch</a></span>  : Character);
+   <span class="comment"><em>--  Add a single character at the current logical cursor position to</em></span>
+   <span class="comment"><em>--  the window. Use the current windows attributes.</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_9">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_705_14" href="terminal_interface-curses__adb.htm#ref_170_14">Add</a></span>
+     (<span class="symbol"><a name="ref_706_7" href="terminal_interface-curses__adb.htm#ref_171_7">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_707_7" href="terminal_interface-curses__adb.htm#ref_172_7">Line</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_708_7" href="terminal_interface-curses__adb.htm#ref_173_7">Column</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+      <span class="symbol"><a name="ref_709_7" href="terminal_interface-curses__adb.htm#ref_174_7">Ch</a></span>     : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_addch.3x.html">mvwaddch()</A></em></span>
+   <span class="comment"><em>--  AKA: mvaddch()</em></span>
+
+   <b>procedure</b> <span class="symbol"><a name="ref_713_14" href="terminal_interface-curses__adb.htm#ref_190_14">Add</a></span>
+     (<span class="symbol"><a name="ref_714_7" href="terminal_interface-curses__adb.htm#ref_191_7">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_715_7" href="terminal_interface-curses__adb.htm#ref_192_7">Line</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_716_7" href="terminal_interface-curses__adb.htm#ref_193_7">Column</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+      <span class="symbol"><a name="ref_717_7" href="terminal_interface-curses__adb.htm#ref_194_7">Ch</a></span>     : Character);
+   <span class="comment"><em>--  Move to the position and add a single character into the window</em></span>
+   <span class="comment"><em>--  There are more Add routines, so the Inline pragma follows later</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_10">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_722_14" href="terminal_interface-curses__adb.htm#ref_205_14">Add_With_Immediate_Echo</a></span>
+     (<span class="symbol"><a name="ref_723_7" href="terminal_interface-curses__adb.htm#ref_206_7">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_724_7" href="terminal_interface-curses__adb.htm#ref_207_7">Ch</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_addch.3x.html">wechochar()</A></em></span>
+   <span class="comment"><em>--  AKA: echochar()</em></span>
+
+   <b>procedure</b> <span class="symbol"><a name="ref_728_14" href="terminal_interface-curses__adb.htm#ref_218_14">Add_With_Immediate_Echo</a></span>
+     (<span class="symbol"><a name="ref_729_7" href="terminal_interface-curses__adb.htm#ref_219_7">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_730_7" href="terminal_interface-curses__adb.htm#ref_220_7">Ch</a></span>  : Character);
+   <span class="comment"><em>--  Add a character and do an immediate refresh of the screen.</em></span>
+   <b>pragma</b> Inline (Add_With_Immediate_Echo);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/curs_window.3x.html">curs_window.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  Not Implemented: wcursyncup</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_11">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_740_13" href="terminal_interface-curses__adb.htm#ref_230_13">Create</a></span>
+     (<span class="symbol"><a name="ref_741_7" href="terminal_interface-curses__adb.htm#ref_230_21">Number_Of_Lines</a></span>       : <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a>;
+      <span class="symbol"><a name="ref_742_7" href="terminal_interface-curses__adb.htm#ref_231_21">Number_Of_Columns</a></span>     : <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a>;
+      <span class="symbol"><a name="ref_743_7" href="terminal_interface-curses__adb.htm#ref_232_21">First_Line_Position</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_744_7" href="terminal_interface-curses__adb.htm#ref_233_21">First_Column_Position</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+   <span class="comment"><em>--  Not Implemented: Default Number_Of_Lines, Number_Of_Columns</em></span>
+   <span class="comment"><em>--  the C version lets them be 0, see the man page.</em></span>
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_window.3x.html">newwin()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_740_13">Create</a>);
+
+   <b>function</b> New_Window
+     (<span class="symbol"><a name="ref_751_7">Number_Of_Lines</a></span>       : <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a>;
+      <span class="symbol"><a name="ref_752_7">Number_Of_Columns</a></span>     : <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a>;
+      <span class="symbol"><a name="ref_753_7">First_Line_Position</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_754_7">First_Column_Position</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>
+     <b>renames</b> <a href="terminal_interface-curses__ads.htm#ref_740_13">Create</a>;
+   <span class="comment"><em>--  pragma Inline (New_Window);</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_12">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_759_14" href="terminal_interface-curses__adb.htm#ref_253_14">Delete</a></span> (<span class="symbol"><a name="ref_759_22" href="terminal_interface-curses__adb.htm#ref_253_22">Win</a></span> : <b>in</b> <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_window.3x.html">delwin()</A></em></span>
+   <span class="comment"><em>--  Reset Win to Null_Window</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_759_14">Delete</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_13">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_765_13" href="terminal_interface-curses__adb.htm#ref_264_13">Sub_Window</a></span>
+     (<span class="symbol"><a name="ref_766_7" href="terminal_interface-curses__adb.htm#ref_265_7">Win</a></span>                   : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_767_7" href="terminal_interface-curses__adb.htm#ref_266_7">Number_Of_Lines</a></span>       : <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a>;
+      <span class="symbol"><a name="ref_768_7" href="terminal_interface-curses__adb.htm#ref_267_7">Number_Of_Columns</a></span>     : <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a>;
+      <span class="symbol"><a name="ref_769_7" href="terminal_interface-curses__adb.htm#ref_268_7">First_Line_Position</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_770_7" href="terminal_interface-curses__adb.htm#ref_269_7">First_Column_Position</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_window.3x.html">subwin()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_765_13">Sub_Window</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_14">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_775_13" href="terminal_interface-curses__adb.htm#ref_292_13">Derived_Window</a></span>
+     (<span class="symbol"><a name="ref_776_7" href="terminal_interface-curses__adb.htm#ref_293_7">Win</a></span>                   : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_777_7" href="terminal_interface-curses__adb.htm#ref_294_7">Number_Of_Lines</a></span>       : <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a>;
+      <span class="symbol"><a name="ref_778_7" href="terminal_interface-curses__adb.htm#ref_295_7">Number_Of_Columns</a></span>     : <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a>;
+      <span class="symbol"><a name="ref_779_7" href="terminal_interface-curses__adb.htm#ref_296_7">First_Line_Position</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_780_7" href="terminal_interface-curses__adb.htm#ref_297_7">First_Column_Position</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_window.3x.html">derwin()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_775_13">Derived_Window</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_15">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_785_13" href="terminal_interface-curses__adb.htm#ref_320_13">Duplicate</a></span> (<span class="symbol"><a name="ref_785_24" href="terminal_interface-curses__adb.htm#ref_320_24">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_window.3x.html">dupwin()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_785_13">Duplicate</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_16">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_790_14" href="terminal_interface-curses__adb.htm#ref_333_14">Move_Window</a></span> (<span class="symbol"><a name="ref_790_27" href="terminal_interface-curses__adb.htm#ref_333_27">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+                          <span class="symbol"><a name="ref_791_27" href="terminal_interface-curses__adb.htm#ref_334_27">Line</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+                          <span class="symbol"><a name="ref_792_27" href="terminal_interface-curses__adb.htm#ref_335_27">Column</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_window.3x.html">mvwin()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_790_14">Move_Window</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_17">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_797_14" href="terminal_interface-curses__adb.htm#ref_347_14">Move_Derived_Window</a></span> (<span class="symbol"><a name="ref_797_35" href="terminal_interface-curses__adb.htm#ref_347_35">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+                                  <span class="symbol"><a name="ref_798_35" href="terminal_interface-curses__adb.htm#ref_348_35">Line</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+                                  <span class="symbol"><a name="ref_799_35" href="terminal_interface-curses__adb.htm#ref_349_35">Column</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_window.3x.html">mvderwin()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_797_14">Move_Derived_Window</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_18">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_804_14">Synchronize_Upwards</a></span> (<span class="symbol"><a name="ref_804_35">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_window.3x.html">wsyncup()</A></em></span>
+   <b>pragma</b> Import (C, Synchronize_Upwards, "wsyncup");
+
+   <span class="comment"><em>--  <A NAME="AFU_19">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_809_14">Synchronize_Downwards</a></span> (<span class="symbol"><a name="ref_809_37">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_window.3x.html">wsyncdown()</A></em></span>
+   <b>pragma</b> Import (C, Synchronize_Downwards, "wsyncdown");
+
+   <span class="comment"><em>--  <A NAME="AFU_20">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_814_14" href="terminal_interface-curses__adb.htm#ref_361_14">Set_Synch_Mode</a></span> (<span class="symbol"><a name="ref_814_30" href="terminal_interface-curses__adb.htm#ref_361_30">Win</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                             <span class="symbol"><a name="ref_815_30" href="terminal_interface-curses__adb.htm#ref_362_30">Mode</a></span> : Boolean := False);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_window.3x.html">syncok()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_814_14">Set_Synch_Mode</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/curs_addstr.3x.html">curs_addstr.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_21">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_824_14" href="terminal_interface-curses__adb.htm#ref_373_14">Add</a></span> (<span class="symbol"><a name="ref_824_19" href="terminal_interface-curses__adb.htm#ref_373_19">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                  <span class="symbol"><a name="ref_825_19" href="terminal_interface-curses__adb.htm#ref_374_19">Str</a></span> : String;
+                  <span class="symbol"><a name="ref_826_19" href="terminal_interface-curses__adb.htm#ref_375_19">Len</a></span> : Integer := -1);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_addstr.3x.html">waddnstr()</A></em></span>
+   <span class="comment"><em>--  AKA: waddstr()</em></span>
+   <span class="comment"><em>--  AKA: addnstr()</em></span>
+   <span class="comment"><em>--  AKA: addstr()</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_22">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_833_14" href="terminal_interface-curses__adb.htm#ref_391_14">Add</a></span> (<span class="symbol"><a name="ref_833_19" href="terminal_interface-curses__adb.htm#ref_392_7">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                  <span class="symbol"><a name="ref_834_19" href="terminal_interface-curses__adb.htm#ref_393_7">Line</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+                  <span class="symbol"><a name="ref_835_19" href="terminal_interface-curses__adb.htm#ref_394_7">Column</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+                  <span class="symbol"><a name="ref_836_19" href="terminal_interface-curses__adb.htm#ref_395_7">Str</a></span>    : String;
+                  <span class="symbol"><a name="ref_837_19" href="terminal_interface-curses__adb.htm#ref_396_7">Len</a></span>    : Integer := -1);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_addstr.3x.html">mvwaddnstr()</A></em></span>
+   <span class="comment"><em>--  AKA: mvwaddstr()</em></span>
+   <span class="comment"><em>--  AKA: mvaddnstr()</em></span>
+   <span class="comment"><em>--  AKA: mvaddstr()</em></span>
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/curs_addchstr.3x.html">curs_addchstr.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_23">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_848_14" href="terminal_interface-curses__adb.htm#ref_403_14">Add</a></span> (<span class="symbol"><a name="ref_848_19" href="terminal_interface-curses__adb.htm#ref_404_7">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                  <span class="symbol"><a name="ref_849_19" href="terminal_interface-curses__adb.htm#ref_405_7">Str</a></span> : Attributed_String;
+                  <span class="symbol"><a name="ref_850_19" href="terminal_interface-curses__adb.htm#ref_406_7">Len</a></span> : Integer := -1);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_addchstr.3x.html">waddchnstr()</A></em></span>
+   <span class="comment"><em>--  AKA: waddchstr()</em></span>
+   <span class="comment"><em>--  AKA: addchnstr()</em></span>
+   <span class="comment"><em>--  AKA: addchstr()</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_24">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_857_14" href="terminal_interface-curses__adb.htm#ref_427_14">Add</a></span> (<span class="symbol"><a name="ref_857_19" href="terminal_interface-curses__adb.htm#ref_428_7">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                  <span class="symbol"><a name="ref_858_19" href="terminal_interface-curses__adb.htm#ref_429_7">Line</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+                  <span class="symbol"><a name="ref_859_19" href="terminal_interface-curses__adb.htm#ref_430_7">Column</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+                  <span class="symbol"><a name="ref_860_19" href="terminal_interface-curses__adb.htm#ref_431_7">Str</a></span>    : Attributed_String;
+                  <span class="symbol"><a name="ref_861_19" href="terminal_interface-curses__adb.htm#ref_432_7">Len</a></span>    : Integer := -1);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_addchstr.3x.html">mvwaddchnstr()</A></em></span>
+   <span class="comment"><em>--  AKA: mvwaddchstr()</em></span>
+   <span class="comment"><em>--  AKA: mvaddchnstr()</em></span>
+   <span class="comment"><em>--  AKA: mvaddchstr()</em></span>
+   <b>pragma</b> Inline (Add);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/curs_border.3x.html">curs_border.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Not implemented: mvhline,  mvwhline, mvvline, mvwvline</em></span>
+   <span class="comment"><em>--  | use Move_Cursor then Horizontal_Line or Vertical_Line</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_25">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_875_14" href="terminal_interface-curses__adb.htm#ref_439_14">Border</a></span>
+     (<span class="symbol"><a name="ref_876_7" href="terminal_interface-curses__adb.htm#ref_440_7">Win</a></span>                       : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_877_7" href="terminal_interface-curses__adb.htm#ref_441_7">Left_Side_Symbol</a></span>          : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a> := <a href="terminal_interface-curses__ads.htm#ref_510_4">Default_Character</a>;
+      <span class="symbol"><a name="ref_878_7" href="terminal_interface-curses__adb.htm#ref_442_7">Right_Side_Symbol</a></span>         : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a> := <a href="terminal_interface-curses__ads.htm#ref_510_4">Default_Character</a>;
+      <span class="symbol"><a name="ref_879_7" href="terminal_interface-curses__adb.htm#ref_443_7">Top_Side_Symbol</a></span>           : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a> := <a href="terminal_interface-curses__ads.htm#ref_510_4">Default_Character</a>;
+      <span class="symbol"><a name="ref_880_7" href="terminal_interface-curses__adb.htm#ref_444_7">Bottom_Side_Symbol</a></span>        : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a> := <a href="terminal_interface-curses__ads.htm#ref_510_4">Default_Character</a>;
+      <span class="symbol"><a name="ref_881_7" href="terminal_interface-curses__adb.htm#ref_445_7">Upper_Left_Corner_Symbol</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a> := <a href="terminal_interface-curses__ads.htm#ref_510_4">Default_Character</a>;
+      <span class="symbol"><a name="ref_882_7" href="terminal_interface-curses__adb.htm#ref_446_7">Upper_Right_Corner_Symbol</a></span> : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a> := <a href="terminal_interface-curses__ads.htm#ref_510_4">Default_Character</a>;
+      <span class="symbol"><a name="ref_883_7" href="terminal_interface-curses__adb.htm#ref_447_7">Lower_Left_Corner_Symbol</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a> := <a href="terminal_interface-curses__ads.htm#ref_510_4">Default_Character</a>;
+      <span class="symbol"><a name="ref_884_7" href="terminal_interface-curses__adb.htm#ref_448_7">Lower_Right_Corner_Symbol</a></span> : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a> := <a href="terminal_interface-curses__ads.htm#ref_510_4">Default_Character</a>
+     );
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_border.3x.html">wborder()</A></em></span>
+   <span class="comment"><em>--  AKA: border()</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_875_14">Border</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_26">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_891_14" href="terminal_interface-curses__adb.htm#ref_475_14">Box</a></span>
+     (<span class="symbol"><a name="ref_892_7" href="terminal_interface-curses__adb.htm#ref_476_7">Win</a></span>               : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_893_7" href="terminal_interface-curses__adb.htm#ref_477_7">Vertical_Symbol</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a> := <a href="terminal_interface-curses__ads.htm#ref_510_4">Default_Character</a>;
+      <span class="symbol"><a name="ref_894_7" href="terminal_interface-curses__adb.htm#ref_478_7">Horizontal_Symbol</a></span> : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a> := <a href="terminal_interface-curses__ads.htm#ref_510_4">Default_Character</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_border.3x.html">box()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_891_14">Box</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_27">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_899_14" href="terminal_interface-curses__adb.htm#ref_486_14">Horizontal_Line</a></span>
+     (<span class="symbol"><a name="ref_900_7" href="terminal_interface-curses__adb.htm#ref_487_7">Win</a></span>         : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_901_7" href="terminal_interface-curses__adb.htm#ref_488_7">Line_Size</a></span>   : Natural;
+      <span class="symbol"><a name="ref_902_7" href="terminal_interface-curses__adb.htm#ref_489_7">Line_Symbol</a></span> : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a> := <a href="terminal_interface-curses__ads.htm#ref_510_4">Default_Character</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_border.3x.html">whline()</A></em></span>
+   <span class="comment"><em>--  AKA: hline()</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_899_14">Horizontal_Line</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_28">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_908_14" href="terminal_interface-curses__adb.htm#ref_504_14">Vertical_Line</a></span>
+     (<span class="symbol"><a name="ref_909_7" href="terminal_interface-curses__adb.htm#ref_505_7">Win</a></span>         : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_910_7" href="terminal_interface-curses__adb.htm#ref_506_7">Line_Size</a></span>   : Natural;
+      <span class="symbol"><a name="ref_911_7" href="terminal_interface-curses__adb.htm#ref_507_7">Line_Symbol</a></span> : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a> := <a href="terminal_interface-curses__ads.htm#ref_510_4">Default_Character</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_border.3x.html">wvline()</A></em></span>
+   <span class="comment"><em>--  AKA: vline()</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_908_14">Vertical_Line</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/curs_getch.3x.html">curs_getch.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  Not implemented: mvgetch, mvwgetch</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_29">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_922_13" href="terminal_interface-curses__adb.htm#ref_523_13">Get_Keystroke</a></span> (<span class="symbol"><a name="ref_922_28" href="terminal_interface-curses__adb.htm#ref_523_28">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>)
+                           <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_72_12">Real_Key_Code</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_getch.3x.html">wgetch()</A></em></span>
+   <span class="comment"><em>--  AKA: getch()</em></span>
+   <span class="comment"><em>--  Get a character from the keyboard and echo it - if enabled - to the</em></span>
+   <span class="comment"><em>--  window.</em></span>
+   <span class="comment"><em>--  If for any reason (i.e. a timeout) we could not get a character the</em></span>
+   <span class="comment"><em>--  returned keycode is Key_None.</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_922_13">Get_Keystroke</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_30">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_933_14" href="terminal_interface-curses__adb.htm#ref_538_14">Undo_Keystroke</a></span> (<span class="symbol"><a name="ref_933_30" href="terminal_interface-curses__adb.htm#ref_538_30">Key</a></span> : <a href="terminal_interface-curses__ads.htm#ref_72_12">Real_Key_Code</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_getch.3x.html">ungetch()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_933_14">Undo_Keystroke</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_31">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_938_13" href="terminal_interface-curses__adb.htm#ref_548_13">Has_Key</a></span> (<span class="symbol"><a name="ref_938_22" href="terminal_interface-curses__adb.htm#ref_548_22">Key</a></span> : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>) <b>return</b> Boolean;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_getch.3x.html">has_key()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_938_13">Has_Key</a>);
+
+   <span class="comment"><em>--  |</em></span>
+   <span class="comment"><em>--  | Some helper functions</em></span>
+   <span class="comment"><em>--  |</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_945_13" href="terminal_interface-curses__adb.htm#ref_560_13">Is_Function_Key</a></span> (<span class="symbol"><a name="ref_945_30" href="terminal_interface-curses__adb.htm#ref_560_30">Key</a></span> : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>) <b>return</b> Boolean;
+   <span class="comment"><em>--  Return True if the Key is a function key (i.e. one of F0 .. F63)</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_945_13">Is_Function_Key</a>);
+
+   <b>subtype</b> <span class="symbol"><a name="ref_949_12">Function_Key_Number</a></span> <b>is</b> Integer <b>range</b> 0 .. 63;
+   <span class="comment"><em>--  (n)curses allows for 64 function keys.</em></span>
+
+   <b>function</b> <span class="symbol"><a name="ref_952_13" href="terminal_interface-curses__adb.htm#ref_572_13">Function_Key</a></span> (<span class="symbol"><a name="ref_952_27" href="terminal_interface-curses__adb.htm#ref_572_27">Key</a></span> : <a href="terminal_interface-curses__ads.htm#ref_72_12">Real_Key_Code</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_949_12">Function_Key_Number</a>;
+   <span class="comment"><em>--  Return the number of the function key. If the code is not a</em></span>
+   <span class="comment"><em>--  function key, a CONSTRAINT_ERROR will be raised.</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_952_13">Function_Key</a>);
+
+   <b>function</b> <span class="symbol"><a name="ref_957_13" href="terminal_interface-curses__adb.htm#ref_583_13">Function_Key_Code</a></span> (<span class="symbol"><a name="ref_957_32" href="terminal_interface-curses__adb.htm#ref_583_32">Key</a></span> : <a href="terminal_interface-curses__ads.htm#ref_949_12">Function_Key_Number</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_72_12">Real_Key_Code</a>;
+   <span class="comment"><em>--  Return the key code for a given function-key number.</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_957_13">Function_Key_Code</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/curs_attr.3x.html">curs_attr.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Not implemented attr_off,  wattr_off,</em></span>
+   <span class="comment"><em>--  |  attr_on, wattr_on, attr_set, wattr_set</em></span>
+
+   <span class="comment"><em>--  PAIR_NUMBER</em></span>
+   <span class="comment"><em>--  PAIR_NUMBER(c) is the same as c.Color</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_32">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_971_14" href="terminal_interface-curses__adb.htm#ref_589_14">Standout</a></span> (<span class="symbol"><a name="ref_971_24" href="terminal_interface-curses__adb.htm#ref_589_24">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>  := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                       <span class="symbol"><a name="ref_972_24" href="terminal_interface-curses__adb.htm#ref_590_24">On</a></span>  : Boolean := True);
+   <span class="comment"><em>--  AKA: wstandout()</em></span>
+   <span class="comment"><em>--  AKA: wstandend()</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_33">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_977_14" href="terminal_interface-curses__adb.htm#ref_609_14">Switch_Character_Attribute</a></span>
+     (<span class="symbol"><a name="ref_978_7" href="terminal_interface-curses__adb.htm#ref_610_7">Win</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_979_7" href="terminal_interface-curses__adb.htm#ref_611_7">Attr</a></span> : <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a> := <a href="terminal_interface-curses__ads.htm#ref_486_4">Normal_Video</a>;
+      <span class="symbol"><a name="ref_980_7" href="terminal_interface-curses__adb.htm#ref_612_7">On</a></span>   : Boolean := True); <span class="comment"><em>--  if False we switch Off.</em></span>
+   <span class="comment"><em>--  Switches those Attributes set to true in the list.</em></span>
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_attr.3x.html">wattron()</A></em></span>
+   <span class="comment"><em>--  AKA: wattroff()</em></span>
+   <span class="comment"><em>--  AKA: attron()</em></span>
+   <span class="comment"><em>--  AKA: attroff()</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_34">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_988_14" href="terminal_interface-curses__adb.htm#ref_637_14">Set_Character_Attributes</a></span>
+     (<span class="symbol"><a name="ref_989_7" href="terminal_interface-curses__adb.htm#ref_638_7">Win</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_990_7" href="terminal_interface-curses__adb.htm#ref_639_7">Attr</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a> := <a href="terminal_interface-curses__ads.htm#ref_486_4">Normal_Video</a>;
+      <span class="symbol"><a name="ref_991_7" href="terminal_interface-curses__adb.htm#ref_640_7">Color</a></span> : <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a> := <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>'First);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_attr.3x.html">wattrset()</A></em></span>
+   <span class="comment"><em>--  AKA: attrset()</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_988_14">Set_Character_Attributes</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_35">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_997_13" href="terminal_interface-curses__adb.htm#ref_654_13">Get_Character_Attribute</a></span>
+     (<span class="symbol"><a name="ref_998_7" href="terminal_interface-curses__adb.htm#ref_654_38">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_attr.3x.html">wattr_get()</A></em></span>
+   <span class="comment"><em>--  AKA: attr_get()</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_36">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_1003_13" href="terminal_interface-curses__adb.htm#ref_675_13">Get_Character_Attribute</a></span>
+     (<span class="symbol"><a name="ref_1004_7" href="terminal_interface-curses__adb.htm#ref_675_38">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_attr.3x.html">wattr_get()</A></em></span>
+   <b>pragma</b> Inline (Get_Character_Attribute);
+
+   <span class="comment"><em>--  <A NAME="AFU_37">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1009_14" href="terminal_interface-curses__adb.htm#ref_696_14">Set_Color</a></span> (<span class="symbol"><a name="ref_1009_25" href="terminal_interface-curses__adb.htm#ref_696_25">Win</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                        <span class="symbol"><a name="ref_1010_25" href="terminal_interface-curses__adb.htm#ref_697_25">Pair</a></span> : <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_attr.3x.html">wcolor_set()</A></em></span>
+   <span class="comment"><em>--  AKA: color_set()</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1009_14">Set_Color</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_38">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1016_14" href="terminal_interface-curses__adb.htm#ref_712_14">Change_Attributes</a></span>
+     (<span class="symbol"><a name="ref_1017_7" href="terminal_interface-curses__adb.htm#ref_713_7">Win</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_1018_7" href="terminal_interface-curses__adb.htm#ref_714_7">Count</a></span> : Integer := -1;
+      <span class="symbol"><a name="ref_1019_7" href="terminal_interface-curses__adb.htm#ref_715_7">Attr</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a> := <a href="terminal_interface-curses__ads.htm#ref_486_4">Normal_Video</a>;
+      <span class="symbol"><a name="ref_1020_7" href="terminal_interface-curses__adb.htm#ref_716_7">Color</a></span> : <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a> := <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>'First);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_attr.3x.html">wchgat()</A></em></span>
+   <span class="comment"><em>--  AKA: chgat()</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_39">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1025_14" href="terminal_interface-curses__adb.htm#ref_737_14">Change_Attributes</a></span>
+     (<span class="symbol"><a name="ref_1026_7" href="terminal_interface-curses__adb.htm#ref_738_7">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_1027_7" href="terminal_interface-curses__adb.htm#ref_739_7">Line</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a> := <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>'First;
+      <span class="symbol"><a name="ref_1028_7" href="terminal_interface-curses__adb.htm#ref_740_7">Column</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a> := <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>'First;
+      <span class="symbol"><a name="ref_1029_7" href="terminal_interface-curses__adb.htm#ref_741_7">Count</a></span>  : Integer := -1;
+      <span class="symbol"><a name="ref_1030_7" href="terminal_interface-curses__adb.htm#ref_742_7">Attr</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a> := <a href="terminal_interface-curses__ads.htm#ref_486_4">Normal_Video</a>;
+      <span class="symbol"><a name="ref_1031_7" href="terminal_interface-curses__adb.htm#ref_743_7">Color</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a> := <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>'First);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_attr.3x.html">mvwchgat()</A></em></span>
+   <span class="comment"><em>--  AKA: mvchgat()</em></span>
+   <b>pragma</b> Inline (Change_Attributes);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/curs_beep.3x.html">curs_beep.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_40">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1041_14" href="terminal_interface-curses__adb.htm#ref_750_14">Beep</a></span>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_beep.3x.html">beep()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1041_14">Beep</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_41">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1046_14" href="terminal_interface-curses__adb.htm#ref_760_14">Flash_Screen</a></span>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_beep.3x.html">flash()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1046_14">Flash_Screen</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/curs_inopts.3x.html">curs_inopts.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  | Not implemented : typeahead</em></span>
+   <span class="comment"><em>--</em></span>
+   <span class="comment"><em>--  <A NAME="AFU_42">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1057_14" href="terminal_interface-curses__adb.htm#ref_770_14">Set_Cbreak_Mode</a></span> (<span class="symbol"><a name="ref_1057_31" href="terminal_interface-curses__adb.htm#ref_770_31">SwitchOn</a></span> : Boolean := True);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_inopts.3x.html">cbreak()</A></em></span>
+   <span class="comment"><em>--  AKA: nocbreak()</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1057_14">Set_Cbreak_Mode</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_43">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1063_14" href="terminal_interface-curses__adb.htm#ref_789_14">Set_Raw_Mode</a></span> (<span class="symbol"><a name="ref_1063_28" href="terminal_interface-curses__adb.htm#ref_789_28">SwitchOn</a></span> : Boolean := True);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_inopts.3x.html">raw()</A></em></span>
+   <span class="comment"><em>--  AKA: noraw()</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1063_14">Set_Raw_Mode</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_44">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1069_14" href="terminal_interface-curses__adb.htm#ref_808_14">Set_Echo_Mode</a></span> (<span class="symbol"><a name="ref_1069_29" href="terminal_interface-curses__adb.htm#ref_808_29">SwitchOn</a></span> : Boolean := True);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_inopts.3x.html">echo()</A></em></span>
+   <span class="comment"><em>--  AKA: noecho()</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1069_14">Set_Echo_Mode</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_45">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1075_14" href="terminal_interface-curses__adb.htm#ref_827_14">Set_Meta_Mode</a></span> (<span class="symbol"><a name="ref_1075_29" href="terminal_interface-curses__adb.htm#ref_827_29">Win</a></span>      : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                            <span class="symbol"><a name="ref_1076_29" href="terminal_interface-curses__adb.htm#ref_828_29">SwitchOn</a></span> : Boolean := True);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_inopts.3x.html">meta()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1075_14">Set_Meta_Mode</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_46">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1081_14" href="terminal_interface-curses__adb.htm#ref_838_14">Set_KeyPad_Mode</a></span> (<span class="symbol"><a name="ref_1081_31" href="terminal_interface-curses__adb.htm#ref_838_31">Win</a></span>      : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                              <span class="symbol"><a name="ref_1082_31" href="terminal_interface-curses__adb.htm#ref_839_31">SwitchOn</a></span> : Boolean := True);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_inopts.3x.html">keypad()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1081_14">Set_KeyPad_Mode</a>);
+
+   <b>function</b> <span class="symbol"><a name="ref_1086_13" href="terminal_interface-curses__adb.htm#ref_849_13">Get_KeyPad_Mode</a></span> (<span class="symbol"><a name="ref_1086_30" href="terminal_interface-curses__adb.htm#ref_849_30">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>)
+                             <b>return</b> Boolean;
+   <span class="comment"><em>--  This has no pendant in C. There you've to look into the WINDOWS</em></span>
+   <span class="comment"><em>--  structure to get the value. Bad practice, not repeated in Ada.</em></span>
+
+   <b>type</b> <span class="symbol"><a name="ref_1091_9">Half_Delay_Amount</a></span> <b>is</b> <b>range</b> 1 .. 255;
+
+   <span class="comment"><em>--  <A NAME="AFU_47">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1094_14" href="terminal_interface-curses__adb.htm#ref_858_14">Half_Delay</a></span> (<span class="symbol"><a name="ref_1094_26" href="terminal_interface-curses__adb.htm#ref_858_26">Amount</a></span> : <a href="terminal_interface-curses__ads.htm#ref_1091_9">Half_Delay_Amount</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_inopts.3x.html">halfdelay()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1094_14">Half_Delay</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_48">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1099_14" href="terminal_interface-curses__adb.htm#ref_868_14">Set_Flush_On_Interrupt_Mode</a></span>
+     (<span class="symbol"><a name="ref_1100_7" href="terminal_interface-curses__adb.htm#ref_869_7">Win</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_1101_7" href="terminal_interface-curses__adb.htm#ref_870_7">Mode</a></span> : Boolean := True);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_inopts.3x.html">intrflush()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1099_14">Set_Flush_On_Interrupt_Mode</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_49">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1106_14" href="terminal_interface-curses__adb.htm#ref_880_14">Set_Queue_Interrupt_Mode</a></span>
+     (<span class="symbol"><a name="ref_1107_7" href="terminal_interface-curses__adb.htm#ref_881_7">Win</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_1108_7" href="terminal_interface-curses__adb.htm#ref_882_7">Flush</a></span> : Boolean := True);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_inopts.3x.html">qiflush()</A></em></span>
+   <span class="comment"><em>--  AKA: noqiflush()</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1106_14">Set_Queue_Interrupt_Mode</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_50">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1114_14" href="terminal_interface-curses__adb.htm#ref_899_14">Set_NoDelay_Mode</a></span>
+     (<span class="symbol"><a name="ref_1115_7" href="terminal_interface-curses__adb.htm#ref_900_7">Win</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_1116_7" href="terminal_interface-curses__adb.htm#ref_901_7">Mode</a></span> : Boolean := False);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_inopts.3x.html">nodelay()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1114_14">Set_NoDelay_Mode</a>);
+
+   <b>type</b> <span class="symbol"><a name="ref_1120_9">Timeout_Mode</a></span> <b>is</b> (<span class="symbol"><a name="ref_1120_26">Blocking</a></span>, <span class="symbol"><a name="ref_1120_36">Non_Blocking</a></span>, <span class="symbol"><a name="ref_1120_50">Delayed</a></span>);
+
+   <span class="comment"><em>--  <A NAME="AFU_51">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1123_14" href="terminal_interface-curses__adb.htm#ref_911_14">Set_Timeout_Mode</a></span> (<span class="symbol"><a name="ref_1123_32" href="terminal_interface-curses__adb.htm#ref_911_32">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                               <span class="symbol"><a name="ref_1124_32" href="terminal_interface-curses__adb.htm#ref_912_32">Mode</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_1120_9">Timeout_Mode</a>;
+                               <span class="symbol"><a name="ref_1125_32" href="terminal_interface-curses__adb.htm#ref_913_32">Amount</a></span> : Natural); <span class="comment"><em>--  in Milliseconds</em></span>
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_inopts.3x.html">wtimeout()</A></em></span>
+   <span class="comment"><em>--  AKA: timeout()</em></span>
+   <span class="comment"><em>--  Instead of overloading the semantic of the sign of amount, we</em></span>
+   <span class="comment"><em>--  introduce the Timeout_Mode parameter. This should improve</em></span>
+   <span class="comment"><em>--  readability. For Blocking and Non_Blocking, the Amount is not</em></span>
+   <span class="comment"><em>--  evaluated.</em></span>
+   <span class="comment"><em>--  We do not inline this procedure.</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_52">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1135_14" href="terminal_interface-curses__adb.htm#ref_932_14">Set_Escape_Timer_Mode</a></span>
+     (<span class="symbol"><a name="ref_1136_7" href="terminal_interface-curses__adb.htm#ref_933_7">Win</a></span>       : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_1137_7" href="terminal_interface-curses__adb.htm#ref_934_7">Timer_Off</a></span> : Boolean := False);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_inopts.3x.html">notimeout()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1135_14">Set_Escape_Timer_Mode</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/curs_outopts.3x.html">curs_outopts.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_53">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1146_14" href="terminal_interface-curses__adb.htm#ref_947_14">Set_NL_Mode</a></span> (<span class="symbol"><a name="ref_1146_27" href="terminal_interface-curses__adb.htm#ref_947_27">SwitchOn</a></span> : Boolean := True);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_outopts.3x.html">nl()</A></em></span>
+   <span class="comment"><em>--  AKA: nonl()</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1146_14">Set_NL_Mode</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_54">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1152_14" href="terminal_interface-curses__adb.htm#ref_966_14">Clear_On_Next_Update</a></span>
+     (<span class="symbol"><a name="ref_1153_7" href="terminal_interface-curses__adb.htm#ref_967_7">Win</a></span>      : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_1154_7" href="terminal_interface-curses__adb.htm#ref_968_7">Do_Clear</a></span> : Boolean := True);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_outopts.3x.html">clearok()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1152_14">Clear_On_Next_Update</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_55">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1159_14" href="terminal_interface-curses__adb.htm#ref_978_14">Use_Insert_Delete_Line</a></span>
+     (<span class="symbol"><a name="ref_1160_7" href="terminal_interface-curses__adb.htm#ref_979_7">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_1161_7" href="terminal_interface-curses__adb.htm#ref_980_7">Do_Idl</a></span> : Boolean := True);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_outopts.3x.html">idlok()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1159_14">Use_Insert_Delete_Line</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_56">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1166_14" href="terminal_interface-curses__adb.htm#ref_990_14">Use_Insert_Delete_Character</a></span>
+     (<span class="symbol"><a name="ref_1167_7" href="terminal_interface-curses__adb.htm#ref_991_7">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_1168_7" href="terminal_interface-curses__adb.htm#ref_992_7">Do_Idc</a></span> : Boolean := True);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_outopts.3x.html">idcok()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1166_14">Use_Insert_Delete_Character</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_57">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1173_14" href="terminal_interface-curses__adb.htm#ref_1000_14">Leave_Cursor_After_Update</a></span>
+     (<span class="symbol"><a name="ref_1174_7" href="terminal_interface-curses__adb.htm#ref_1001_7">Win</a></span>      : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_1175_7" href="terminal_interface-curses__adb.htm#ref_1002_7">Do_Leave</a></span> : Boolean := True);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_outopts.3x.html">leaveok()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1173_14">Leave_Cursor_After_Update</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_58">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1180_14" href="terminal_interface-curses__adb.htm#ref_1012_14">Immediate_Update_Mode</a></span>
+     (<span class="symbol"><a name="ref_1181_7" href="terminal_interface-curses__adb.htm#ref_1013_7">Win</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_1182_7" href="terminal_interface-curses__adb.htm#ref_1014_7">Mode</a></span> : Boolean := False);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_outopts.3x.html">immedok()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1180_14">Immediate_Update_Mode</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_59">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1187_14" href="terminal_interface-curses__adb.htm#ref_1022_14">Allow_Scrolling</a></span>
+     (<span class="symbol"><a name="ref_1188_7" href="terminal_interface-curses__adb.htm#ref_1023_7">Win</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_1189_7" href="terminal_interface-curses__adb.htm#ref_1024_7">Mode</a></span> : Boolean := False);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_outopts.3x.html">scrollok()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1187_14">Allow_Scrolling</a>);
+
+   <b>function</b> <span class="symbol"><a name="ref_1193_13" href="terminal_interface-curses__adb.htm#ref_1034_13">Scrolling_Allowed</a></span> (<span class="symbol"><a name="ref_1193_32" href="terminal_interface-curses__adb.htm#ref_1034_32">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>) <b>return</b> Boolean;
+   <span class="comment"><em>--  There is no such function in the C interface.</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1193_13">Scrolling_Allowed</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_60">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1198_14" href="terminal_interface-curses__adb.htm#ref_1043_14">Set_Scroll_Region</a></span>
+     (<span class="symbol"><a name="ref_1199_7" href="terminal_interface-curses__adb.htm#ref_1044_7">Win</a></span>         : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_1200_7" href="terminal_interface-curses__adb.htm#ref_1045_7">Top_Line</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_1201_7" href="terminal_interface-curses__adb.htm#ref_1046_7">Bottom_Line</a></span> : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_outopts.3x.html">wsetscrreg()</A></em></span>
+   <span class="comment"><em>--  AKA: setscrreg()</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1198_14">Set_Scroll_Region</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/curs_refresh.3x.html">curs_refresh.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_61">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1211_14" href="terminal_interface-curses__adb.htm#ref_1060_14">Update_Screen</a></span>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_refresh.3x.html">doupdate()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1211_14">Update_Screen</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_62">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1216_14" href="terminal_interface-curses__adb.htm#ref_1070_14">Refresh</a></span> (<span class="symbol"><a name="ref_1216_23" href="terminal_interface-curses__adb.htm#ref_1070_23">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_refresh.3x.html">wrefresh()</A></em></span>
+   <span class="comment"><em>--  There is an overloaded Refresh for Pads.</em></span>
+   <span class="comment"><em>--  The Inline pragma appears there</em></span>
+   <span class="comment"><em>--  AKA: refresh()</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_63">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1223_14" href="terminal_interface-curses__adb.htm#ref_1080_14">Refresh_Without_Update</a></span>
+     (<span class="symbol"><a name="ref_1224_7" href="terminal_interface-curses__adb.htm#ref_1081_7">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_refresh.3x.html">wnoutrefresh()</A></em></span>
+   <span class="comment"><em>--  There is an overloaded Refresh_Without_Update for Pads.</em></span>
+   <span class="comment"><em>--  The Inline pragma appears there</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_64">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1230_14" href="terminal_interface-curses__adb.htm#ref_1091_14">Redraw</a></span> (<span class="symbol"><a name="ref_1230_22" href="terminal_interface-curses__adb.htm#ref_1091_22">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_refresh.3x.html">redrawwin()</A></em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_65">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1234_14" href="terminal_interface-curses__adb.htm#ref_1101_14">Redraw</a></span> (<span class="symbol"><a name="ref_1234_22" href="terminal_interface-curses__adb.htm#ref_1102_7">Win</a></span>        : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                     <span class="symbol"><a name="ref_1235_22" href="terminal_interface-curses__adb.htm#ref_1103_7">Begin_Line</a></span> : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+                     <span class="symbol"><a name="ref_1236_22" href="terminal_interface-curses__adb.htm#ref_1104_7">Line_Count</a></span> : Positive);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_refresh.3x.html">wredrawln()</A></em></span>
+   <b>pragma</b> Inline (Redraw);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/curs_clear.3x.html">curs_clear.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_66">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1245_14" href="terminal_interface-curses__adb.htm#ref_1119_14">Erase</a></span> (<span class="symbol"><a name="ref_1245_21" href="terminal_interface-curses__adb.htm#ref_1119_21">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_clear.3x.html">werase()</A></em></span>
+   <span class="comment"><em>--  AKA: erase()</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1245_14">Erase</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_67">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1251_14" href="terminal_interface-curses__adb.htm#ref_1129_14">Clear</a></span>
+     (<span class="symbol"><a name="ref_1252_7" href="terminal_interface-curses__adb.htm#ref_1129_21">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_clear.3x.html">wclear()</A></em></span>
+   <span class="comment"><em>--  AKA: clear()</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1251_14">Clear</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_68">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1258_14" href="terminal_interface-curses__adb.htm#ref_1139_14">Clear_To_End_Of_Screen</a></span>
+     (<span class="symbol"><a name="ref_1259_7" href="terminal_interface-curses__adb.htm#ref_1139_38">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_clear.3x.html">wclrtobot()</A></em></span>
+   <span class="comment"><em>--  AKA: clrtobot()</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1258_14">Clear_To_End_Of_Screen</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_69">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1265_14" href="terminal_interface-curses__adb.htm#ref_1149_14">Clear_To_End_Of_Line</a></span>
+     (<span class="symbol"><a name="ref_1266_7" href="terminal_interface-curses__adb.htm#ref_1149_36">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_clear.3x.html">wclrtoeol()</A></em></span>
+   <span class="comment"><em>--  AKA: clrtoeol()</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1265_14">Clear_To_End_Of_Line</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/curs_bkgd.3x.html">curs_bkgd.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_70">|</A></em></span>
+   <span class="comment"><em>--  TODO: we could have Set_Background(Window; Character_Attribute_Set)</em></span>
+   <span class="comment"><em>--  because in C it is common to see bkgdset(A_BOLD) or</em></span>
+   <span class="comment"><em>--  bkgdset(COLOR_PAIR(n))</em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1279_14" href="terminal_interface-curses__adb.htm#ref_1159_14">Set_Background</a></span>
+     (<span class="symbol"><a name="ref_1280_7" href="terminal_interface-curses__adb.htm#ref_1160_7">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_1281_7" href="terminal_interface-curses__adb.htm#ref_1161_7">Ch</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_bkgd.3x.html">wbkgdset()</A></em></span>
+   <span class="comment"><em>--  AKA: bkgdset()</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1279_14">Set_Background</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_71">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1287_14" href="terminal_interface-curses__adb.htm#ref_1169_14">Change_Background</a></span>
+     (<span class="symbol"><a name="ref_1288_7" href="terminal_interface-curses__adb.htm#ref_1170_7">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_1289_7" href="terminal_interface-curses__adb.htm#ref_1171_7">Ch</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_bkgd.3x.html">wbkgd()</A></em></span>
+   <span class="comment"><em>--  AKA: bkgd()</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1287_14">Change_Background</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_72">|</A></em></span>
+   <span class="comment"><em>--  ? wbkgdget is not listed in curs_bkgd, getbkgd is thpough.</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_1296_13" href="terminal_interface-curses__adb.htm#ref_1182_13">Get_Background</a></span> (<span class="symbol"><a name="ref_1296_29" href="terminal_interface-curses__adb.htm#ref_1182_29">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>)
+     <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_bkgd.3x.html">wbkgdget()</A></em></span>
+   <span class="comment"><em>--  AKA: bkgdget()</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1296_13">Get_Background</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/curs_touch.3x.html">curs_touch.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_73">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1307_14" href="terminal_interface-curses__adb.htm#ref_1219_14">Untouch</a></span> (<span class="symbol"><a name="ref_1307_23" href="terminal_interface-curses__adb.htm#ref_1219_23">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_touch.3x.html">untouchwin()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1307_14">Untouch</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_74">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1312_14" href="terminal_interface-curses__adb.htm#ref_1209_14">Touch</a></span> (<span class="symbol"><a name="ref_1312_21" href="terminal_interface-curses__adb.htm#ref_1209_21">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_touch.3x.html">touchwin()</A></em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_75">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1316_14" href="terminal_interface-curses__adb.htm#ref_1229_14">Touch</a></span> (<span class="symbol"><a name="ref_1316_21" href="terminal_interface-curses__adb.htm#ref_1229_21">Win</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                    <span class="symbol"><a name="ref_1317_21" href="terminal_interface-curses__adb.htm#ref_1230_21">Start</a></span> : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+                    <span class="symbol"><a name="ref_1318_21" href="terminal_interface-curses__adb.htm#ref_1231_21">Count</a></span> : Positive);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_touch.3x.html">touchline()</A></em></span>
+   <b>pragma</b> Inline (Touch);
+
+   <span class="comment"><em>--  <A NAME="AFU_76">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1323_14" href="terminal_interface-curses__adb.htm#ref_1191_14">Change_Lines_Status</a></span> (<span class="symbol"><a name="ref_1323_35" href="terminal_interface-curses__adb.htm#ref_1191_35">Win</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                                  <span class="symbol"><a name="ref_1324_35" href="terminal_interface-curses__adb.htm#ref_1192_35">Start</a></span> : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+                                  <span class="symbol"><a name="ref_1325_35" href="terminal_interface-curses__adb.htm#ref_1193_35">Count</a></span> : Positive;
+                                  <span class="symbol"><a name="ref_1326_35" href="terminal_interface-curses__adb.htm#ref_1194_35">State</a></span> : Boolean);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_touch.3x.html">wtouchln()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1323_14">Change_Lines_Status</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_77">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_1331_13" href="terminal_interface-curses__adb.htm#ref_1237_13">Is_Touched</a></span> (<span class="symbol"><a name="ref_1331_25" href="terminal_interface-curses__adb.htm#ref_1238_7">Win</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                        <span class="symbol"><a name="ref_1332_25" href="terminal_interface-curses__adb.htm#ref_1239_7">Line</a></span> : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>) <b>return</b> Boolean;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_touch.3x.html">is_linetouched()</A></em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_78">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_1336_13" href="terminal_interface-curses__adb.htm#ref_1251_13">Is_Touched</a></span> (<span class="symbol"><a name="ref_1336_25" href="terminal_interface-curses__adb.htm#ref_1252_7">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>) <b>return</b> Boolean;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_touch.3x.html">is_wintouched()</A></em></span>
+   <b>pragma</b> Inline (Is_Touched);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/curs_overlay.3x.html">curs_overlay.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_79">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1345_14" href="terminal_interface-curses__adb.htm#ref_1264_14">Copy</a></span>
+     (<span class="symbol"><a name="ref_1346_7" href="terminal_interface-curses__adb.htm#ref_1265_7">Source_Window</a></span>            : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <span class="symbol"><a name="ref_1347_7" href="terminal_interface-curses__adb.htm#ref_1266_7">Destination_Window</a></span>       : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <span class="symbol"><a name="ref_1348_7" href="terminal_interface-curses__adb.htm#ref_1267_7">Source_Top_Row</a></span>           : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_1349_7" href="terminal_interface-curses__adb.htm#ref_1268_7">Source_Left_Column</a></span>       : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+      <span class="symbol"><a name="ref_1350_7" href="terminal_interface-curses__adb.htm#ref_1269_7">Destination_Top_Row</a></span>      : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_1351_7" href="terminal_interface-curses__adb.htm#ref_1270_7">Destination_Left_Column</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+      <span class="symbol"><a name="ref_1352_7" href="terminal_interface-curses__adb.htm#ref_1271_7">Destination_Bottom_Row</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_1353_7" href="terminal_interface-curses__adb.htm#ref_1272_7">Destination_Right_Column</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+      <span class="symbol"><a name="ref_1354_7" href="terminal_interface-curses__adb.htm#ref_1273_7">Non_Destructive_Mode</a></span>     : Boolean := True);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_overlay.3x.html">copywin()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1345_14">Copy</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_80">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1359_14" href="terminal_interface-curses__adb.htm#ref_1301_14">Overwrite</a></span> (<span class="symbol"><a name="ref_1359_25" href="terminal_interface-curses__adb.htm#ref_1302_7">Source_Window</a></span>      : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+                        <span class="symbol"><a name="ref_1360_25" href="terminal_interface-curses__adb.htm#ref_1303_7">Destination_Window</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_overlay.3x.html">overwrite()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1359_14">Overwrite</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_81">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1365_14" href="terminal_interface-curses__adb.htm#ref_1313_14">Overlay</a></span> (<span class="symbol"><a name="ref_1365_23" href="terminal_interface-curses__adb.htm#ref_1314_7">Source_Window</a></span>      : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+                      <span class="symbol"><a name="ref_1366_23" href="terminal_interface-curses__adb.htm#ref_1315_7">Destination_Window</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_overlay.3x.html">overlay()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1365_14">Overlay</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/curs_deleteln.3x.html">curs_deleteln.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_82">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1375_14" href="terminal_interface-curses__adb.htm#ref_1326_14">Insert_Delete_Lines</a></span>
+     (<span class="symbol"><a name="ref_1376_7" href="terminal_interface-curses__adb.htm#ref_1327_7">Win</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>  := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_1377_7" href="terminal_interface-curses__adb.htm#ref_1328_7">Lines</a></span> : Integer := 1); <span class="comment"><em>--  default is to insert one line above</em></span>
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_deleteln.3x.html">winsdelln()</A></em></span>
+   <span class="comment"><em>--  AKA: insdelln()</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1375_14">Insert_Delete_Lines</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_83">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1383_14" href="terminal_interface-curses__adb.htm#ref_1338_14">Delete_Line</a></span> (<span class="symbol"><a name="ref_1383_27" href="terminal_interface-curses__adb.htm#ref_1338_27">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_deleteln.3x.html">wdeleteln()</A></em></span>
+   <span class="comment"><em>--  AKA: deleteln()</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1383_14">Delete_Line</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_84">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1389_14" href="terminal_interface-curses__adb.htm#ref_1344_14">Insert_Line</a></span> (<span class="symbol"><a name="ref_1389_27" href="terminal_interface-curses__adb.htm#ref_1344_27">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_deleteln.3x.html">winsertln()</A></em></span>
+   <span class="comment"><em>--  AKA: insertln()</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1389_14">Insert_Line</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/curs_getyx.3x.html">curs_getyx.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_85">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1399_14" href="terminal_interface-curses__adb.htm#ref_1351_14">Get_Size</a></span>
+     (<span class="symbol"><a name="ref_1400_7" href="terminal_interface-curses__adb.htm#ref_1352_7">Win</a></span>               : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_1401_7" href="terminal_interface-curses__adb.htm#ref_1353_7">Number_Of_Lines</a></span>   : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a>;
+      <span class="symbol"><a name="ref_1402_7" href="terminal_interface-curses__adb.htm#ref_1354_7">Number_Of_Columns</a></span> : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_getyx.3x.html">getmaxyx()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1399_14">Get_Size</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_86">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1407_14" href="terminal_interface-curses__adb.htm#ref_1369_14">Get_Window_Position</a></span>
+     (<span class="symbol"><a name="ref_1408_7" href="terminal_interface-curses__adb.htm#ref_1370_7">Win</a></span>             : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_1409_7" href="terminal_interface-curses__adb.htm#ref_1371_7">Top_Left_Line</a></span>   : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_1410_7" href="terminal_interface-curses__adb.htm#ref_1372_7">Top_Left_Column</a></span> : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_getyx.3x.html">getbegyx()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1407_14">Get_Window_Position</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_87">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1415_14" href="terminal_interface-curses__adb.htm#ref_1387_14">Get_Cursor_Position</a></span>
+     (<span class="symbol"><a name="ref_1416_7" href="terminal_interface-curses__adb.htm#ref_1388_7">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_1417_7" href="terminal_interface-curses__adb.htm#ref_1389_7">Line</a></span>   : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_1418_7" href="terminal_interface-curses__adb.htm#ref_1390_7">Column</a></span> : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_getyx.3x.html">getyx()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1415_14">Get_Cursor_Position</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_88">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1423_14" href="terminal_interface-curses__adb.htm#ref_1405_14">Get_Origin_Relative_To_Parent</a></span>
+     (<span class="symbol"><a name="ref_1424_7" href="terminal_interface-curses__adb.htm#ref_1406_7">Win</a></span>                : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <span class="symbol"><a name="ref_1425_7" href="terminal_interface-curses__adb.htm#ref_1407_7">Top_Left_Line</a></span>      : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_1426_7" href="terminal_interface-curses__adb.htm#ref_1408_7">Top_Left_Column</a></span>    : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+      <span class="symbol"><a name="ref_1427_7" href="terminal_interface-curses__adb.htm#ref_1409_7">Is_Not_A_Subwindow</a></span> : <b>out</b> Boolean);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_getyx.3x.html">getparyx()</A></em></span>
+   <span class="comment"><em>--  Instead of placing -1 in the coordinates as return, we use a Boolean</em></span>
+   <span class="comment"><em>--  to return the info that the window has no parent.</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1423_14">Get_Origin_Relative_To_Parent</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/curs_pad.3x.html">curs_pad.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_89">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_1438_13" href="terminal_interface-curses__adb.htm#ref_1431_13">New_Pad</a></span> (<span class="symbol"><a name="ref_1438_22" href="terminal_interface-curses__adb.htm#ref_1431_22">Lines</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a>;
+                     <span class="symbol"><a name="ref_1439_22" href="terminal_interface-curses__adb.htm#ref_1432_22">Columns</a></span> : <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_pad.3x.html">newpad()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1438_13">New_Pad</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_90">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_1444_13" href="terminal_interface-curses__adb.htm#ref_1446_13">Sub_Pad</a></span>
+     (<span class="symbol"><a name="ref_1445_7" href="terminal_interface-curses__adb.htm#ref_1447_7">Pad</a></span>                   : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <span class="symbol"><a name="ref_1446_7" href="terminal_interface-curses__adb.htm#ref_1448_7">Number_Of_Lines</a></span>       : <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a>;
+      <span class="symbol"><a name="ref_1447_7" href="terminal_interface-curses__adb.htm#ref_1449_7">Number_Of_Columns</a></span>     : <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a>;
+      <span class="symbol"><a name="ref_1448_7" href="terminal_interface-curses__adb.htm#ref_1450_7">First_Line_Position</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_1449_7" href="terminal_interface-curses__adb.htm#ref_1451_7">First_Column_Position</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_pad.3x.html">subpad()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1444_13">Sub_Pad</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_91">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1454_14" href="terminal_interface-curses__adb.htm#ref_1474_14">Refresh</a></span>
+     (<span class="symbol"><a name="ref_1455_7" href="terminal_interface-curses__adb.htm#ref_1475_7">Pad</a></span>                      : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <span class="symbol"><a name="ref_1456_7" href="terminal_interface-curses__adb.htm#ref_1476_7">Source_Top_Row</a></span>           : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_1457_7" href="terminal_interface-curses__adb.htm#ref_1477_7">Source_Left_Column</a></span>       : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+      <span class="symbol"><a name="ref_1458_7" href="terminal_interface-curses__adb.htm#ref_1478_7">Destination_Top_Row</a></span>      : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_1459_7" href="terminal_interface-curses__adb.htm#ref_1479_7">Destination_Left_Column</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+      <span class="symbol"><a name="ref_1460_7" href="terminal_interface-curses__adb.htm#ref_1480_7">Destination_Bottom_Row</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_1461_7" href="terminal_interface-curses__adb.htm#ref_1481_7">Destination_Right_Column</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_pad.3x.html">prefresh()</A></em></span>
+   <b>pragma</b> Inline (Refresh);
+
+   <span class="comment"><em>--  <A NAME="AFU_92">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1466_14" href="terminal_interface-curses__adb.htm#ref_1505_14">Refresh_Without_Update</a></span>
+     (<span class="symbol"><a name="ref_1467_7" href="terminal_interface-curses__adb.htm#ref_1506_7">Pad</a></span>                      : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <span class="symbol"><a name="ref_1468_7" href="terminal_interface-curses__adb.htm#ref_1507_7">Source_Top_Row</a></span>           : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_1469_7" href="terminal_interface-curses__adb.htm#ref_1508_7">Source_Left_Column</a></span>       : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+      <span class="symbol"><a name="ref_1470_7" href="terminal_interface-curses__adb.htm#ref_1509_7">Destination_Top_Row</a></span>      : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_1471_7" href="terminal_interface-curses__adb.htm#ref_1510_7">Destination_Left_Column</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+      <span class="symbol"><a name="ref_1472_7" href="terminal_interface-curses__adb.htm#ref_1511_7">Destination_Bottom_Row</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_1473_7" href="terminal_interface-curses__adb.htm#ref_1512_7">Destination_Right_Column</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_pad.3x.html">pnoutrefresh()</A></em></span>
+   <b>pragma</b> Inline (Refresh_Without_Update);
+
+   <span class="comment"><em>--  <A NAME="AFU_93">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1478_14" href="terminal_interface-curses__adb.htm#ref_1536_14">Add_Character_To_Pad_And_Echo_It</a></span>
+     (<span class="symbol"><a name="ref_1479_7" href="terminal_interface-curses__adb.htm#ref_1537_7">Pad</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <span class="symbol"><a name="ref_1480_7" href="terminal_interface-curses__adb.htm#ref_1538_7">Ch</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_pad.3x.html">pechochar()</A></em></span>
+
+   <b>procedure</b> <span class="symbol"><a name="ref_1483_14" href="terminal_interface-curses__adb.htm#ref_1549_14">Add_Character_To_Pad_And_Echo_It</a></span>
+     (<span class="symbol"><a name="ref_1484_7" href="terminal_interface-curses__adb.htm#ref_1550_7">Pad</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+      <span class="symbol"><a name="ref_1485_7" href="terminal_interface-curses__adb.htm#ref_1551_7">Ch</a></span>  : Character);
+   <b>pragma</b> Inline (Add_Character_To_Pad_And_Echo_It);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/curs_scroll.3x.html">curs_scroll.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_94">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1493_14" href="terminal_interface-curses__adb.htm#ref_1561_14">Scroll</a></span> (<span class="symbol"><a name="ref_1493_22" href="terminal_interface-curses__adb.htm#ref_1561_22">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>  := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                     <span class="symbol"><a name="ref_1494_22" href="terminal_interface-curses__adb.htm#ref_1562_22">Amount</a></span> : Integer := 1);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_scroll.3x.html">wscrl()</A></em></span>
+   <span class="comment"><em>--  AKA: scroll()</em></span>
+   <span class="comment"><em>--  AKA: scrl()</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1493_14">Scroll</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/curs_delch.3x.html">curs_delch.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_95">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1505_14" href="terminal_interface-curses__adb.htm#ref_1574_14">Delete_Character</a></span> (<span class="symbol"><a name="ref_1505_32" href="terminal_interface-curses__adb.htm#ref_1574_32">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_delch.3x.html">wdelch()</A></em></span>
+   <span class="comment"><em>--  AKA: delch()</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_96">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1510_14" href="terminal_interface-curses__adb.htm#ref_1584_14">Delete_Character</a></span>
+     (<span class="symbol"><a name="ref_1511_7" href="terminal_interface-curses__adb.htm#ref_1585_7">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_1512_7" href="terminal_interface-curses__adb.htm#ref_1586_7">Line</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_1513_7" href="terminal_interface-curses__adb.htm#ref_1587_7">Column</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_delch.3x.html">mvwdelch()</A></em></span>
+   <span class="comment"><em>--  AKA: mvdelch()</em></span>
+   <b>pragma</b> Inline (Delete_Character);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/curs_inch.3x.html">curs_inch.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_97">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_1523_13" href="terminal_interface-curses__adb.htm#ref_1599_13">Peek</a></span> (<span class="symbol"><a name="ref_1523_19" href="terminal_interface-curses__adb.htm#ref_1599_19">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>)
+     <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>;
+   <span class="comment"><em>--  AKA: inch()</em></span>
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_inch.3x.html">winch()</A></em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_98">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_1529_13" href="terminal_interface-curses__adb.htm#ref_1608_13">Peek</a></span>
+     (<span class="symbol"><a name="ref_1530_7" href="terminal_interface-curses__adb.htm#ref_1609_7">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_1531_7" href="terminal_interface-curses__adb.htm#ref_1610_7">Line</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_1532_7" href="terminal_interface-curses__adb.htm#ref_1611_7">Column</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>) <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_inch.3x.html">mvwinch()</A></em></span>
+   <span class="comment"><em>--  AKA: mvinch()</em></span>
+   <span class="comment"><em>--  More Peek's follow, pragma Inline appears later.</em></span>
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/curs_insch.3x.html">curs_insch.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_99">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1542_14" href="terminal_interface-curses__adb.htm#ref_1621_14">Insert</a></span> (<span class="symbol"><a name="ref_1542_22" href="terminal_interface-curses__adb.htm#ref_1621_22">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                     <span class="symbol"><a name="ref_1543_22" href="terminal_interface-curses__adb.htm#ref_1622_22">Ch</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_insch.3x.html">winsch()</A></em></span>
+   <span class="comment"><em>--  AKA: insch()</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_100">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1548_14" href="terminal_interface-curses__adb.htm#ref_1632_14">Insert</a></span> (<span class="symbol"><a name="ref_1548_22" href="terminal_interface-curses__adb.htm#ref_1633_7">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                     <span class="symbol"><a name="ref_1549_22" href="terminal_interface-curses__adb.htm#ref_1634_7">Line</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+                     <span class="symbol"><a name="ref_1550_22" href="terminal_interface-curses__adb.htm#ref_1635_7">Column</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+                     <span class="symbol"><a name="ref_1551_22" href="terminal_interface-curses__adb.htm#ref_1636_7">Ch</a></span>     : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_insch.3x.html">mvwinsch()</A></em></span>
+   <span class="comment"><em>--  AKA: mvinsch()</em></span>
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/curs_insstr.3x.html">curs_insstr.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_101">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1560_14" href="terminal_interface-curses__adb.htm#ref_1653_14">Insert</a></span> (<span class="symbol"><a name="ref_1560_22" href="terminal_interface-curses__adb.htm#ref_1653_22">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                     <span class="symbol"><a name="ref_1561_22" href="terminal_interface-curses__adb.htm#ref_1654_22">Str</a></span> : String;
+                     <span class="symbol"><a name="ref_1562_22" href="terminal_interface-curses__adb.htm#ref_1655_22">Len</a></span> : Integer := -1);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_insstr.3x.html">winsnstr()</A></em></span>
+   <span class="comment"><em>--  AKA: winsstr()</em></span>
+   <span class="comment"><em>--  AKA: insnstr()</em></span>
+   <span class="comment"><em>--  AKA: insstr()</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_102">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1569_14" href="terminal_interface-curses__adb.htm#ref_1671_14">Insert</a></span> (<span class="symbol"><a name="ref_1569_22" href="terminal_interface-curses__adb.htm#ref_1672_7">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                     <span class="symbol"><a name="ref_1570_22" href="terminal_interface-curses__adb.htm#ref_1673_7">Line</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+                     <span class="symbol"><a name="ref_1571_22" href="terminal_interface-curses__adb.htm#ref_1674_7">Column</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+                     <span class="symbol"><a name="ref_1572_22" href="terminal_interface-curses__adb.htm#ref_1675_7">Str</a></span>    : String;
+                     <span class="symbol"><a name="ref_1573_22" href="terminal_interface-curses__adb.htm#ref_1676_7">Len</a></span>    : Integer := -1);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_insstr.3x.html">mvwinsnstr()</A></em></span>
+   <span class="comment"><em>--  AKA: mvwinsstr()</em></span>
+   <span class="comment"><em>--  AKA: mvinsnstr()</em></span>
+   <span class="comment"><em>--  AKA: mvinsstr()</em></span>
+   <b>pragma</b> Inline (Insert);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/curs_instr.3x.html">curs_instr.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_103">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1585_14" href="terminal_interface-curses__adb.htm#ref_1696_14">Peek</a></span> (<span class="symbol"><a name="ref_1585_20" href="terminal_interface-curses__adb.htm#ref_1696_20">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                   <span class="symbol"><a name="ref_1586_20" href="terminal_interface-curses__adb.htm#ref_1697_20">Str</a></span> : <b>out</b> String;
+                   <span class="symbol"><a name="ref_1587_20" href="terminal_interface-curses__adb.htm#ref_1698_20">Len</a></span> : Integer := -1);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_instr.3x.html">winnstr()</A></em></span>
+   <span class="comment"><em>--  AKA: winstr()</em></span>
+   <span class="comment"><em>--  AKA: innstr()</em></span>
+   <span class="comment"><em>--  AKA: instr()</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_104">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1594_14" href="terminal_interface-curses__adb.htm#ref_1725_14">Peek</a></span> (<span class="symbol"><a name="ref_1594_20" href="terminal_interface-curses__adb.htm#ref_1726_7">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                   <span class="symbol"><a name="ref_1595_20" href="terminal_interface-curses__adb.htm#ref_1727_7">Line</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+                   <span class="symbol"><a name="ref_1596_20" href="terminal_interface-curses__adb.htm#ref_1728_7">Column</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+                   <span class="symbol"><a name="ref_1597_20" href="terminal_interface-curses__adb.htm#ref_1729_7">Str</a></span>    : <b>out</b> String;
+                   <span class="symbol"><a name="ref_1598_20" href="terminal_interface-curses__adb.htm#ref_1730_7">Len</a></span>    : Integer := -1);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_instr.3x.html">mvwinnstr()</A></em></span>
+   <span class="comment"><em>--  AKA: mvwinstr()</em></span>
+   <span class="comment"><em>--  AKA: mvinnstr()</em></span>
+   <span class="comment"><em>--  AKA: mvinstr()</em></span>
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/curs_inchstr.3x.html">curs_inchstr.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_105">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1609_14" href="terminal_interface-curses__adb.htm#ref_1737_14">Peek</a></span> (<span class="symbol"><a name="ref_1609_20" href="terminal_interface-curses__adb.htm#ref_1738_7">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                   <span class="symbol"><a name="ref_1610_20" href="terminal_interface-curses__adb.htm#ref_1739_7">Str</a></span> : <b>out</b> Attributed_String;
+                   <span class="symbol"><a name="ref_1611_20" href="terminal_interface-curses__adb.htm#ref_1740_7">Len</a></span> : Integer := -1);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_inchstr.3x.html">winchnstr()</A></em></span>
+   <span class="comment"><em>--  AKA: winchstr()</em></span>
+   <span class="comment"><em>--  AKA: inchnstr()</em></span>
+   <span class="comment"><em>--  AKA: inchstr()</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_106">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1618_14" href="terminal_interface-curses__adb.htm#ref_1774_14">Peek</a></span> (<span class="symbol"><a name="ref_1618_20" href="terminal_interface-curses__adb.htm#ref_1775_7">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                   <span class="symbol"><a name="ref_1619_20" href="terminal_interface-curses__adb.htm#ref_1776_7">Line</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+                   <span class="symbol"><a name="ref_1620_20" href="terminal_interface-curses__adb.htm#ref_1777_7">Column</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+                   <span class="symbol"><a name="ref_1621_20" href="terminal_interface-curses__adb.htm#ref_1778_7">Str</a></span>    : <b>out</b> Attributed_String;
+                   <span class="symbol"><a name="ref_1622_20" href="terminal_interface-curses__adb.htm#ref_1779_7">Len</a></span>    : Integer := -1);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_inchstr.3x.html">mvwinchnstr()</A></em></span>
+   <span class="comment"><em>--  AKA: mvwinchstr()</em></span>
+   <span class="comment"><em>--  AKA: mvinchnstr()</em></span>
+   <span class="comment"><em>--  AKA: mvinchstr()</em></span>
+   <span class="comment"><em>--  We do not inline the Peek procedures</em></span>
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/curs_getstr.3x.html">curs_getstr.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_107">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1634_14" href="terminal_interface-curses__adb.htm#ref_1786_14">Get</a></span> (<span class="symbol"><a name="ref_1634_19" href="terminal_interface-curses__adb.htm#ref_1786_19">Win</a></span> : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                  <span class="symbol"><a name="ref_1635_19" href="terminal_interface-curses__adb.htm#ref_1787_19">Str</a></span> : <b>out</b> String;
+                  <span class="symbol"><a name="ref_1636_19" href="terminal_interface-curses__adb.htm#ref_1788_19">Len</a></span> : Integer := -1);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_getstr.3x.html">wgetnstr()</A></em></span>
+   <span class="comment"><em>--  AKA: wgetstr()</em></span>
+   <span class="comment"><em>--  AKA: getnstr()</em></span>
+   <span class="comment"><em>--  AKA: getstr()</em></span>
+   <span class="comment"><em>--  actually getstr is not supported because that results in buffer</em></span>
+   <span class="comment"><em>--  overflows.</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_108">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1645_14" href="terminal_interface-curses__adb.htm#ref_1815_14">Get</a></span> (<span class="symbol"><a name="ref_1645_19" href="terminal_interface-curses__adb.htm#ref_1816_7">Win</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                  <span class="symbol"><a name="ref_1646_19" href="terminal_interface-curses__adb.htm#ref_1817_7">Line</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+                  <span class="symbol"><a name="ref_1647_19" href="terminal_interface-curses__adb.htm#ref_1818_7">Column</a></span> : <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+                  <span class="symbol"><a name="ref_1648_19" href="terminal_interface-curses__adb.htm#ref_1819_7">Str</a></span>    : <b>out</b> String;
+                  <span class="symbol"><a name="ref_1649_19" href="terminal_interface-curses__adb.htm#ref_1820_7">Len</a></span>    : Integer := -1);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_getstr.3x.html">mvwgetnstr()</A></em></span>
+   <span class="comment"><em>--  AKA: mvwgetstr()</em></span>
+   <span class="comment"><em>--  AKA: mvgetnstr()</em></span>
+   <span class="comment"><em>--  AKA: mvgetstr()</em></span>
+   <span class="comment"><em>--  Get is not inlined</em></span>
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/curs_slk.3x.html">curs_slk.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  Not Implemented: slk_attr_on, slk_attr_off, slk_attr_set</em></span>
+
+   <b>type</b> <span class="symbol"><a name="ref_1662_9">Soft_Label_Key_Format</a></span> <b>is</b> (<span class="symbol"><a name="ref_1662_35">Three_Two_Three</a></span>,
+                                  <span class="symbol"><a name="ref_1663_35">Four_Four</a></span>,
+                                  <span class="symbol"><a name="ref_1664_35">PC_Style</a></span>,              <span class="comment"><em>--  ncurses specific</em></span>
+                                  <span class="symbol"><a name="ref_1665_35">PC_Style_With_Index</a></span>);  <span class="comment"><em>--  "</em></span>
+   <b>type</b> <span class="symbol"><a name="ref_1666_9">Label_Number</a></span> <b>is</b> <b>new</b> Positive <b>range</b> 1 .. 12;
+   <b>type</b> <span class="symbol"><a name="ref_1667_9">Label_Justification</a></span> <b>is</b> (<span class="symbol"><a name="ref_1667_33">Left</a></span>, <span class="symbol"><a name="ref_1667_39">Centered</a></span>, <span class="symbol"><a name="ref_1667_49">Right</a></span>);
+
+   <span class="comment"><em>--  <A NAME="AFU_109">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1670_14" href="terminal_interface-curses__adb.htm#ref_1827_14">Init_Soft_Label_Keys</a></span>
+     (<span class="symbol"><a name="ref_1671_7" href="terminal_interface-curses__adb.htm#ref_1828_7">Format</a></span> : <a href="terminal_interface-curses__ads.htm#ref_1662_9">Soft_Label_Key_Format</a> := <a href="terminal_interface-curses__ads.htm#ref_1662_35">Three_Two_Three</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_slk.3x.html">slk_init()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1670_14">Init_Soft_Label_Keys</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_110">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1676_14" href="terminal_interface-curses__adb.htm#ref_1838_14">Set_Soft_Label_Key</a></span> (<span class="symbol"><a name="ref_1676_34" href="terminal_interface-curses__adb.htm#ref_1838_34">Label</a></span> : <a href="terminal_interface-curses__ads.htm#ref_1666_9">Label_Number</a>;
+                                 <span class="symbol"><a name="ref_1677_34" href="terminal_interface-curses__adb.htm#ref_1839_34">Text</a></span>  : String;
+                                 <span class="symbol"><a name="ref_1678_34" href="terminal_interface-curses__adb.htm#ref_1840_34">Fmt</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_1667_9">Label_Justification</a> := <a href="terminal_interface-curses__ads.htm#ref_1667_33">Left</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_slk.3x.html">slk_set()</A></em></span>
+   <span class="comment"><em>--  We do not inline this procedure</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_111">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1683_14" href="terminal_interface-curses__adb.htm#ref_1858_14">Refresh_Soft_Label_Keys</a></span>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_slk.3x.html">slk_refresh()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1683_14">Refresh_Soft_Label_Keys</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_112">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1688_14" href="terminal_interface-curses__adb.htm#ref_1868_14">Refresh_Soft_Label_Keys_Without_Update</a></span>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_slk.3x.html">slk_noutrefresh()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1688_14">Refresh_Soft_Label_Keys_Without_Update</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_113">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1693_14" href="terminal_interface-curses__adb.htm#ref_1878_14">Get_Soft_Label_Key</a></span> (<span class="symbol"><a name="ref_1693_34" href="terminal_interface-curses__adb.htm#ref_1878_34">Label</a></span> : <a href="terminal_interface-curses__ads.htm#ref_1666_9">Label_Number</a>;
+                                 <span class="symbol"><a name="ref_1694_34" href="terminal_interface-curses__adb.htm#ref_1879_34">Text</a></span>  : <b>out</b> String);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_slk.3x.html">slk_label()</A></em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_114">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_1698_13" href="terminal_interface-curses__adb.htm#ref_1887_13">Get_Soft_Label_Key</a></span> (<span class="symbol"><a name="ref_1698_33" href="terminal_interface-curses__adb.htm#ref_1887_33">Label</a></span> : <a href="terminal_interface-curses__ads.htm#ref_1666_9">Label_Number</a>) <b>return</b> String;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_slk.3x.html">slk_label()</A></em></span>
+   <span class="comment"><em>--  Same as function</em></span>
+   <b>pragma</b> Inline (Get_Soft_Label_Key);
+
+   <span class="comment"><em>--  <A NAME="AFU_115">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1704_14" href="terminal_interface-curses__adb.htm#ref_1895_14">Clear_Soft_Label_Keys</a></span>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_slk.3x.html">slk_clear()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1704_14">Clear_Soft_Label_Keys</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_116">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1709_14" href="terminal_interface-curses__adb.htm#ref_1905_14">Restore_Soft_Label_Keys</a></span>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_slk.3x.html">slk_restore()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1709_14">Restore_Soft_Label_Keys</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_117">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1714_14" href="terminal_interface-curses__adb.htm#ref_1915_14">Touch_Soft_Label_Keys</a></span>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_slk.3x.html">slk_touch()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1714_14">Touch_Soft_Label_Keys</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_118">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1719_14" href="terminal_interface-curses__adb.htm#ref_1925_14">Switch_Soft_Label_Key_Attributes</a></span>
+     (<span class="symbol"><a name="ref_1720_7" href="terminal_interface-curses__adb.htm#ref_1926_7">Attr</a></span> : <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a>;
+      <span class="symbol"><a name="ref_1721_7" href="terminal_interface-curses__adb.htm#ref_1927_7">On</a></span>   : Boolean := True);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_slk.3x.html">slk_attron()</A></em></span>
+   <span class="comment"><em>--  AKA: slk_attroff()</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1719_14">Switch_Soft_Label_Key_Attributes</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_119">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1727_14" href="terminal_interface-curses__adb.htm#ref_1949_14">Set_Soft_Label_Key_Attributes</a></span>
+     (<span class="symbol"><a name="ref_1728_7" href="terminal_interface-curses__adb.htm#ref_1950_7">Attr</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a> := <a href="terminal_interface-curses__ads.htm#ref_486_4">Normal_Video</a>;
+      <span class="symbol"><a name="ref_1729_7" href="terminal_interface-curses__adb.htm#ref_1951_7">Color</a></span> : <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a> := <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>'First);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_slk.3x.html">slk_attrset()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1727_14">Set_Soft_Label_Key_Attributes</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_120">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_1734_13" href="terminal_interface-curses__adb.htm#ref_1965_13">Get_Soft_Label_Key_Attributes</a></span> <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_slk.3x.html">slk_attr()</A></em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_121">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_1738_13" href="terminal_interface-curses__adb.htm#ref_1975_13">Get_Soft_Label_Key_Attributes</a></span> <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_slk.3x.html">slk_attr()</A></em></span>
+   <b>pragma</b> Inline (Get_Soft_Label_Key_Attributes);
+
+   <span class="comment"><em>--  <A NAME="AFU_122">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1743_14" href="terminal_interface-curses__adb.htm#ref_1985_14">Set_Soft_Label_Key_Color</a></span> (<span class="symbol"><a name="ref_1743_40" href="terminal_interface-curses__adb.htm#ref_1985_40">Pair</a></span> : <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_slk.3x.html">slk_color()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1743_14">Set_Soft_Label_Key_Color</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/keybound.3x.html">keybound.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  Not Implemented: keybound</em></span>
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/keyok.3x.html">keyok.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_123">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1757_14" href="terminal_interface-curses__adb.htm#ref_1996_14">Enable_Key</a></span> (<span class="symbol"><a name="ref_1757_26" href="terminal_interface-curses__adb.htm#ref_1996_26">Key</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>;
+                         <span class="symbol"><a name="ref_1758_26" href="terminal_interface-curses__adb.htm#ref_1997_26">Enable</a></span> : Boolean := True);
+   <span class="comment"><em>--  AKA: <A HREF="../man/keyok.3x.html">keyok()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1757_14">Enable_Key</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/define_key.3x.html">define_key.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_124">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1767_14" href="terminal_interface-curses__adb.htm#ref_2010_14">Define_Key</a></span> (<span class="symbol"><a name="ref_1767_26" href="terminal_interface-curses__adb.htm#ref_2010_26">Definition</a></span> : String;
+                         <span class="symbol"><a name="ref_1768_26" href="terminal_interface-curses__adb.htm#ref_2011_26">Key</a></span>        : <a href="terminal_interface-curses__ads.htm#ref_77_12">Special_Key_Code</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/define_key.3x.html">define_key()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1767_14">Define_Key</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/curs_util.3x.html">curs_util.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  | Not implemented : filter, use_env</em></span>
+   <span class="comment"><em>--  | putwin, getwin are in the child package PutWin</em></span>
+   <span class="comment"><em>--</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_125">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1781_14" href="terminal_interface-curses__adb.htm#ref_90_14">Key_Name</a></span> (<span class="symbol"><a name="ref_1781_24" href="terminal_interface-curses__adb.htm#ref_90_24">Key</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_72_12">Real_Key_Code</a>;
+                       <span class="symbol"><a name="ref_1782_24" href="terminal_interface-curses__adb.htm#ref_91_24">Name</a></span> : <b>out</b> String);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_util.3x.html">keyname()</A></em></span>
+   <span class="comment"><em>--  The external name for a real keystroke.</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_126">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_1787_13" href="terminal_interface-curses__adb.htm#ref_62_13">Key_Name</a></span> (<span class="symbol"><a name="ref_1787_23" href="terminal_interface-curses__adb.htm#ref_62_23">Key</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_72_12">Real_Key_Code</a>) <b>return</b> String;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_util.3x.html">keyname()</A></em></span>
+   <span class="comment"><em>--  Same as function</em></span>
+   <span class="comment"><em>--  We do not inline this routine</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_127">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1793_14" href="terminal_interface-curses__adb.htm#ref_2026_14">Un_Control</a></span> (<span class="symbol"><a name="ref_1793_26" href="terminal_interface-curses__adb.htm#ref_2026_26">Ch</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>;
+                         <span class="symbol"><a name="ref_1794_26" href="terminal_interface-curses__adb.htm#ref_2027_26">Str</a></span> : <b>out</b> String);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_util.3x.html">unctrl()</A></em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_128">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_1798_13" href="terminal_interface-curses__adb.htm#ref_2035_13">Un_Control</a></span> (<span class="symbol"><a name="ref_1798_25" href="terminal_interface-curses__adb.htm#ref_2035_25">Ch</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_488_9">Attributed_Character</a>) <b>return</b> String;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_util.3x.html">unctrl()</A></em></span>
+   <span class="comment"><em>--  Same as function</em></span>
+   <b>pragma</b> Inline (Un_Control);
+
+   <span class="comment"><em>--  <A NAME="AFU_129">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1804_14" href="terminal_interface-curses__adb.htm#ref_2043_14">Delay_Output</a></span> (<span class="symbol"><a name="ref_1804_28" href="terminal_interface-curses__adb.htm#ref_2043_28">Msecs</a></span> : Natural);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_util.3x.html">delay_output()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1804_14">Delay_Output</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_130">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1809_14" href="terminal_interface-curses__adb.htm#ref_2053_14">Flush_Input</a></span>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_util.3x.html">flushinp()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1809_14">Flush_Input</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/curs_termattrs.3x.html">curs_termattrs.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_131">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_1818_13" href="terminal_interface-curses__adb.htm#ref_2063_13">Baudrate</a></span> <b>return</b> Natural;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_termattrs.3x.html">baudrate()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1818_13">Baudrate</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_132">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_1823_13" href="terminal_interface-curses__adb.htm#ref_2071_13">Erase_Character</a></span> <b>return</b> Character;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_termattrs.3x.html">erasechar()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1823_13">Erase_Character</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_133">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_1828_13" href="terminal_interface-curses__adb.htm#ref_2079_13">Kill_Character</a></span> <b>return</b> Character;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_termattrs.3x.html">killchar()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1828_13">Kill_Character</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_134">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_1833_13" href="terminal_interface-curses__adb.htm#ref_2087_13">Has_Insert_Character</a></span> <b>return</b> Boolean;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_termattrs.3x.html">has_ic()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1833_13">Has_Insert_Character</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_135">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_1838_13" href="terminal_interface-curses__adb.htm#ref_2099_13">Has_Insert_Line</a></span> <b>return</b> Boolean;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_termattrs.3x.html">has_il()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1838_13">Has_Insert_Line</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_136">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_1843_13" href="terminal_interface-curses__adb.htm#ref_2111_13">Supported_Attributes</a></span> <b>return</b> <a href="terminal_interface-curses__ads.htm#ref_418_9">Character_Attribute_Set</a>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_termattrs.3x.html">termattrs()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1843_13">Supported_Attributes</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_137">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1848_14" href="terminal_interface-curses__adb.htm#ref_2121_14">Long_Name</a></span> (<span class="symbol"><a name="ref_1848_25" href="terminal_interface-curses__adb.htm#ref_2121_25">Name</a></span> : <b>out</b> String);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_termattrs.3x.html">longname()</A></em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_138">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_1852_13" href="terminal_interface-curses__adb.htm#ref_2129_13">Long_Name</a></span> <b>return</b> String;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_termattrs.3x.html">longname()</A></em></span>
+   <span class="comment"><em>--  Same as function</em></span>
+   <b>pragma</b> Inline (Long_Name);
+
+   <span class="comment"><em>--  <A NAME="AFU_139">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1858_14" href="terminal_interface-curses__adb.htm#ref_2137_14">Terminal_Name</a></span> (<span class="symbol"><a name="ref_1858_29" href="terminal_interface-curses__adb.htm#ref_2137_29">Name</a></span> : <b>out</b> String);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_termattrs.3x.html">termname()</A></em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_140">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_1862_13" href="terminal_interface-curses__adb.htm#ref_2145_13">Terminal_Name</a></span> <b>return</b> String;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_termattrs.3x.html">termname()</A></em></span>
+   <span class="comment"><em>--  Same as function</em></span>
+   <b>pragma</b> Inline (Terminal_Name);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/curs_color.3x.html">curs_color.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  COLOR_PAIR</em></span>
+   <span class="comment"><em>--  COLOR_PAIR(n) in C is the same as</em></span>
+   <span class="comment"><em>--  Attributed_Character(Ch =&gt; Nul, Color =&gt; n, Attr =&gt; Normal_Video)</em></span>
+   <span class="comment"><em>--  In C you often see something like c = c | COLOR_PAIR(n);</em></span>
+   <span class="comment"><em>--  This is equivalent to c.Color := n;</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_141">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1878_14">Start_Color</a></span>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_color.3x.html">start_color()</A></em></span>
+   <b>pragma</b> Import (C, Start_Color, "start_color");
+
+   <span class="comment"><em>--  <A NAME="AFU_142">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1883_14" href="terminal_interface-curses__adb.htm#ref_2153_14">Init_Pair</a></span> (<span class="symbol"><a name="ref_1883_25" href="terminal_interface-curses__adb.htm#ref_2153_25">Pair</a></span> : <a href="terminal_interface-curses__ads.htm#ref_412_12">Redefinable_Color_Pair</a>;
+                        <span class="symbol"><a name="ref_1884_25" href="terminal_interface-curses__adb.htm#ref_2154_25">Fore</a></span> : <a href="terminal_interface-curses__ads.htm#ref_390_9">Color_Number</a>;
+                        <span class="symbol"><a name="ref_1885_25" href="terminal_interface-curses__adb.htm#ref_2155_25">Back</a></span> : <a href="terminal_interface-curses__ads.htm#ref_390_9">Color_Number</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_color.3x.html">init_pair()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1883_14">Init_Pair</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_143">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1890_14" href="terminal_interface-curses__adb.htm#ref_2177_14">Pair_Content</a></span> (<span class="symbol"><a name="ref_1890_28" href="terminal_interface-curses__adb.htm#ref_2177_28">Pair</a></span> : <a href="terminal_interface-curses__ads.htm#ref_410_9">Color_Pair</a>;
+                           <span class="symbol"><a name="ref_1891_28" href="terminal_interface-curses__adb.htm#ref_2178_28">Fore</a></span> : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_390_9">Color_Number</a>;
+                           <span class="symbol"><a name="ref_1892_28" href="terminal_interface-curses__adb.htm#ref_2179_28">Back</a></span> : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_390_9">Color_Number</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_color.3x.html">pair_content()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1890_14">Pair_Content</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_144">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_1897_13" href="terminal_interface-curses__adb.htm#ref_2197_13">Has_Colors</a></span> <b>return</b> Boolean;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_color.3x.html">has_colors()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1897_13">Has_Colors</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_145">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1902_14" href="terminal_interface-curses__adb.htm#ref_2209_14">Init_Color</a></span> (<span class="symbol"><a name="ref_1902_26" href="terminal_interface-curses__adb.htm#ref_2209_26">Color</a></span> : <a href="terminal_interface-curses__ads.htm#ref_390_9">Color_Number</a>;
+                         <span class="symbol"><a name="ref_1903_26" href="terminal_interface-curses__adb.htm#ref_2210_26">Red</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_406_9">RGB_Value</a>;
+                         <span class="symbol"><a name="ref_1904_26" href="terminal_interface-curses__adb.htm#ref_2211_26">Green</a></span> : <a href="terminal_interface-curses__ads.htm#ref_406_9">RGB_Value</a>;
+                         <span class="symbol"><a name="ref_1905_26" href="terminal_interface-curses__adb.htm#ref_2212_26">Blue</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_406_9">RGB_Value</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_color.3x.html">init_color()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1902_14">Init_Color</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_146">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_1910_13" href="terminal_interface-curses__adb.htm#ref_2227_13">Can_Change_Color</a></span> <b>return</b> Boolean;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_color.3x.html">can_change_color()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1910_13">Can_Change_Color</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_147">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1915_14" href="terminal_interface-curses__adb.htm#ref_2239_14">Color_Content</a></span> (<span class="symbol"><a name="ref_1915_29" href="terminal_interface-curses__adb.htm#ref_2239_29">Color</a></span> : <a href="terminal_interface-curses__ads.htm#ref_390_9">Color_Number</a>;
+                            <span class="symbol"><a name="ref_1916_29" href="terminal_interface-curses__adb.htm#ref_2240_29">Red</a></span>   : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_406_9">RGB_Value</a>;
+                            <span class="symbol"><a name="ref_1917_29" href="terminal_interface-curses__adb.htm#ref_2241_29">Green</a></span> : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_406_9">RGB_Value</a>;
+                            <span class="symbol"><a name="ref_1918_29" href="terminal_interface-curses__adb.htm#ref_2242_29">Blue</a></span>  : <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_406_9">RGB_Value</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_color.3x.html">color_content()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1915_14">Color_Content</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/curs_kernel.3x.html">curs_kernel.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Not implemented: getsyx, setsyx</em></span>
+   <span class="comment"><em>--</em></span>
+   <b>type</b> <span class="symbol"><a name="ref_1927_9">Curses_Mode</a></span> <b>is</b> (<span class="symbol"><a name="ref_1927_25">Curses</a></span>, <span class="symbol"><a name="ref_1927_33">Shell</a></span>);
+
+   <span class="comment"><em>--  <A NAME="AFU_148">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1930_14" href="terminal_interface-curses__adb.htm#ref_2264_14">Save_Curses_Mode</a></span> (<span class="symbol"><a name="ref_1930_32" href="terminal_interface-curses__adb.htm#ref_2264_32">Mode</a></span> : <a href="terminal_interface-curses__ads.htm#ref_1927_9">Curses_Mode</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_kernel.3x.html">def_prog_mode()</A></em></span>
+   <span class="comment"><em>--  AKA: def_shell_mode()</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1930_14">Save_Curses_Mode</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_149">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1936_14" href="terminal_interface-curses__adb.htm#ref_2282_14">Reset_Curses_Mode</a></span> (<span class="symbol"><a name="ref_1936_33" href="terminal_interface-curses__adb.htm#ref_2282_33">Mode</a></span> : <a href="terminal_interface-curses__ads.htm#ref_1927_9">Curses_Mode</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_kernel.3x.html">reset_prog_mode()</A></em></span>
+   <span class="comment"><em>--  AKA: reset_shell_mode()</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1936_14">Reset_Curses_Mode</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_150">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1942_14" href="terminal_interface-curses__adb.htm#ref_2300_14">Save_Terminal_State</a></span>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_kernel.3x.html">savetty()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1942_14">Save_Terminal_State</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_151">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1947_14" href="terminal_interface-curses__adb.htm#ref_2310_14">Reset_Terminal_State</a></span>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_kernel.3x.html">resetty();</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1947_14">Reset_Terminal_State</a>);
+
+   <b>type</b> <span class="symbol"><a name="ref_1951_9">Stdscr_Init_Proc</a></span> <b>is</b> <b>access</b>
+      <b>function</b> (<span class="symbol"><a name="ref_1952_17">Win</a></span>     : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a>;
+                <span class="symbol"><a name="ref_1953_17">Columns</a></span> : <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a>) <b>return</b> Integer;
+   <b>pragma</b> Convention (C, <a href="terminal_interface-curses__ads.htm#ref_1951_9">Stdscr_Init_Proc</a>);
+   <span class="comment"><em>--  N.B.: the return value is actually ignored, but it seems to be</em></span>
+   <span class="comment"><em>--        a good practice to return 0 if you think all went fine</em></span>
+   <span class="comment"><em>--        and -1 otherwise.</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_152">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1960_14" href="terminal_interface-curses__adb.htm#ref_2320_14">Rip_Off_Lines</a></span> (<span class="symbol"><a name="ref_1960_29" href="terminal_interface-curses__adb.htm#ref_2320_29">Lines</a></span> : Integer;
+                            <span class="symbol"><a name="ref_1961_29" href="terminal_interface-curses__adb.htm#ref_2321_29">Proc</a></span>  : <a href="terminal_interface-curses__ads.htm#ref_1951_9">Stdscr_Init_Proc</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_kernel.3x.html">ripoffline()</A></em></span>
+   <span class="comment"><em>--  N.B.: to be more precise, this uses a ncurses specific enhancement of</em></span>
+   <span class="comment"><em>--        ripoffline(), in which the Lines argument absolute value is the</em></span>
+   <span class="comment"><em>--        number of lines to be ripped of. The official ripoffline() only</em></span>
+   <span class="comment"><em>--        uses the sign of Lines to remove a single line from bottom or top.</em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1960_14">Rip_Off_Lines</a>);
+
+   <b>type</b> <span class="symbol"><a name="ref_1969_9">Cursor_Visibility</a></span> <b>is</b> (<span class="symbol"><a name="ref_1969_31">Invisible</a></span>, <span class="symbol"><a name="ref_1969_42">Normal</a></span>, <span class="symbol"><a name="ref_1969_50">Very_Visible</a></span>);
+
+   <span class="comment"><em>--  <A NAME="AFU_153">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1972_14" href="terminal_interface-curses__adb.htm#ref_2332_14">Set_Cursor_Visibility</a></span> (<span class="symbol"><a name="ref_1972_37" href="terminal_interface-curses__adb.htm#ref_2332_37">Visibility</a></span> : <b>in</b> <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_1969_9">Cursor_Visibility</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_kernel.3x.html">curs_set()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1972_14">Set_Cursor_Visibility</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_154">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_1977_14" href="terminal_interface-curses__adb.htm#ref_2345_14">Nap_Milli_Seconds</a></span> (<span class="symbol"><a name="ref_1977_33" href="terminal_interface-curses__adb.htm#ref_2345_33">Ms</a></span> : Natural);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_kernel.3x.html">napms()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_1977_14">Nap_Milli_Seconds</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Some useful helpers.</em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <b>type</b> <span class="symbol"><a name="ref_1984_9">Transform_Direction</a></span> <b>is</b> (<span class="symbol"><a name="ref_1984_33">From_Screen</a></span>, <span class="symbol"><a name="ref_1984_46">To_Screen</a></span>);
+   <b>procedure</b> <span class="symbol"><a name="ref_1985_14" href="terminal_interface-curses__adb.htm#ref_2396_14">Transform_Coordinates</a></span>
+     (<span class="symbol"><a name="ref_1986_7" href="terminal_interface-curses__adb.htm#ref_2397_7">W</a></span>      : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+      <span class="symbol"><a name="ref_1987_7" href="terminal_interface-curses__adb.htm#ref_2398_7">Line</a></span>   : <b>in</b> <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_59_9">Line_Position</a>;
+      <span class="symbol"><a name="ref_1988_7" href="terminal_interface-curses__adb.htm#ref_2399_7">Column</a></span> : <b>in</b> <b>out</b> <a href="terminal_interface-curses__ads.htm#ref_60_9">Column_Position</a>;
+      <span class="symbol"><a name="ref_1989_7" href="terminal_interface-curses__adb.htm#ref_2400_7">Dir</a></span>    : <a href="terminal_interface-curses__ads.htm#ref_1984_9">Transform_Direction</a> := <a href="terminal_interface-curses__ads.htm#ref_1984_33">From_Screen</a>);
+   <span class="comment"><em>--  This procedure transforms screen coordinates into coordinates relative</em></span>
+   <span class="comment"><em>--  to the window and vice versa, depending on the Dir parameter.</em></span>
+   <span class="comment"><em>--  Screen coordinates are the position information for the physical device.</em></span>
+   <span class="comment"><em>--  An Curses_Exception will be raised if Line and Column are not in the</em></span>
+   <span class="comment"><em>--  Window or if you pass the Null_Window as argument.</em></span>
+   <span class="comment"><em>--  We do not inline this procedure</em></span>
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/default_colors.3x.html">default_colors.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="symbol"><a name="ref_2001_4">Default_Color</a></span> : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_390_9">Color_Number</a> := -1;
+
+   <span class="comment"><em>--  <A NAME="AFU_155">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_2004_14" href="terminal_interface-curses__adb.htm#ref_2425_14">Use_Default_Colors</a></span>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/default_colors.3x.html">use_default_colors()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_2004_14">Use_Default_Colors</a>);
+
+   <span class="comment"><em>--  <A NAME="AFU_156">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_2009_14" href="terminal_interface-curses__adb.htm#ref_2435_14">Assume_Default_Colors</a></span> (<span class="symbol"><a name="ref_2009_37" href="terminal_interface-curses__adb.htm#ref_2435_37">Fore</a></span> : <a href="terminal_interface-curses__ads.htm#ref_390_9">Color_Number</a> := <a href="terminal_interface-curses__ads.htm#ref_2001_4">Default_Color</a>;
+                                    <span class="symbol"><a name="ref_2010_37" href="terminal_interface-curses__adb.htm#ref_2436_37">Back</a></span> : <a href="terminal_interface-curses__ads.htm#ref_390_9">Color_Number</a> := <a href="terminal_interface-curses__ads.htm#ref_2001_4">Default_Color</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/default_colors.3x.html">assume_default_colors()</A></em></span>
+   <b>pragma</b> Inline (<a href="terminal_interface-curses__ads.htm#ref_2009_14">Assume_Default_Colors</a>);
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/curs_extend.3x.html">curs_extend.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_157">|</A></em></span>
+   <b>function</b> <span class="symbol"><a name="ref_2019_13" href="terminal_interface-curses__adb.htm#ref_2450_13">Curses_Version</a></span> <b>return</b> String;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_extend.3x.html">curses_version()</A></em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_158">|</A></em></span>
+   <span class="comment"><em>--  The returnvalue is the previous setting of the flag</em></span>
+   <b>function</b> <span class="symbol"><a name="ref_2024_13" href="terminal_interface-curses__adb.htm#ref_2473_13">Use_Extended_Names</a></span> (<span class="symbol"><a name="ref_2024_33" href="terminal_interface-curses__adb.htm#ref_2473_33">Enable</a></span> : Boolean) <b>return</b> Boolean;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_extend.3x.html">use_extended_names()</A></em></span>
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/curs_trace.3x.html">curs_trace.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_159">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_2032_14" href="terminal_interface-curses__adb.htm#ref_2459_14">Curses_Free_All</a></span>;
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_trace.3x.html">_nc_freeall()</A></em></span>
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/curs_scr_dump.3x.html">curs_scr_dump.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_160">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_2040_14" href="terminal_interface-curses__adb.htm#ref_2488_14">Screen_Dump_To_File</a></span> (<span class="symbol"><a name="ref_2040_35" href="terminal_interface-curses__adb.htm#ref_2488_35">Filename</a></span> : String);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_scr_dump.3x.html">scr_dump()</A></em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_161">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_2044_14" href="terminal_interface-curses__adb.htm#ref_2501_14">Screen_Restore_From_File</a></span> (<span class="symbol"><a name="ref_2044_40" href="terminal_interface-curses__adb.htm#ref_2501_40">Filename</a></span> : String);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_scr_dump.3x.html">scr_restore()</A></em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_162">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_2048_14" href="terminal_interface-curses__adb.htm#ref_2514_14">Screen_Init_From_File</a></span> (<span class="symbol"><a name="ref_2048_37" href="terminal_interface-curses__adb.htm#ref_2514_37">Filename</a></span> : String);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_scr_dump.3x.html">scr_init()</A></em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_163">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_2052_14" href="terminal_interface-curses__adb.htm#ref_2527_14">Screen_Set_File</a></span> (<span class="symbol"><a name="ref_2052_31" href="terminal_interface-curses__adb.htm#ref_2527_31">Filename</a></span> : String);
+   <span class="comment"><em>--  AKA: <A HREF="../man/curs_scr_dump.3x.html">scr_set()</A></em></span>
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/curs_print.3x.html">curs_print.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  Not implemented: mcprint</em></span>
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/curs_printw.3x.html">curs_printw.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  Not implemented: printw,  wprintw, mvprintw, mvwprintw, vwprintw,</em></span>
+   <span class="comment"><em>--                   vw_printw</em></span>
+   <span class="comment"><em>--  Please use the Ada style Text_IO child packages for formatted</em></span>
+   <span class="comment"><em>--  printing. It does not make a lot of sense to map the printf style</em></span>
+   <span class="comment"><em>--  C functions to Ada.</em></span>
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/curs_scanw.3x.html">curs_scanw.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  Not implemented: scanw, wscanw, mvscanw, mvwscanw, vwscanw, vw_scanw</em></span>
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/resizeterm.3x.html">resizeterm.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  Not Implemented: resizeterm</em></span>
+
+   <span class="comment"><em>--  |=====================================================================</em></span>
+   <span class="comment"><em>--  | Man page <A HREF="../man/wresize.3x.html">wresize.3x</A></em></span>
+   <span class="comment"><em>--  |=====================================================================</em></span>
+
+   <span class="comment"><em>--  <A NAME="AFU_164">|</A></em></span>
+   <b>procedure</b> <span class="symbol"><a name="ref_2084_14" href="terminal_interface-curses__adb.htm#ref_2540_14">Resize</a></span> (<span class="symbol"><a name="ref_2084_22" href="terminal_interface-curses__adb.htm#ref_2540_22">Win</a></span>               : <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := <a href="terminal_interface-curses__ads.htm#ref_645_13">Standard_Window</a>;
+                     <span class="symbol"><a name="ref_2085_22" href="terminal_interface-curses__adb.htm#ref_2541_22">Number_Of_Lines</a></span>   : <a href="terminal_interface-curses__ads.htm#ref_62_12">Line_Count</a>;
+                     <span class="symbol"><a name="ref_2086_22" href="terminal_interface-curses__adb.htm#ref_2542_22">Number_Of_Columns</a></span> : <a href="terminal_interface-curses__ads.htm#ref_64_12">Column_Count</a>);
+   <span class="comment"><em>--  AKA: <A HREF="../man/wresize.3x.html">wresize()</A></em></span>
+
+<b>private</b>
+   <b>type</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> <b>is</b> <b>new</b> System.Storage_Elements.Integer_Address;
+   <a href="terminal_interface-curses__ads.htm#ref_57_4">Null_Window</a> : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_56_9">Window</a> := 0;
+
+   <span class="comment"><em>--  The next constants are generated and may be different on your</em></span>
+   <span class="comment"><em>--  architecture.</em></span>
+   <span class="comment"><em>--</em></span>
+
+   <span class="symbol"><a name="ref_2097_4">Sizeof_Bool</a></span> : <b>constant</b> := <a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_11_4">Sizeof_Bool</a>;
+
+   <b>type</b> <span class="symbol"><a name="ref_2099_9">Curses_Bool</a></span> <b>is</b> <b>mod</b> 2 ** <a href="terminal_interface-curses__ads.htm#ref_2097_4">Sizeof_Bool</a>;
+
+   <span class="symbol"><a name="ref_2101_4">Curses_Bool_False</a></span> : <b>constant</b> <a href="terminal_interface-curses__ads.htm#ref_2099_9">Curses_Bool</a> := 0;
+
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses__ads.htm#ref_48_28">Curses</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface-curses_constants__ads.htm b/doc/html/ada/terminal_interface-curses_constants__ads.htm
new file mode 100644
index 0000000..8be0214
--- /dev/null
+++ b/doc/html/ada/terminal_interface-curses_constants__ads.htm
@@ -0,0 +1,401 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface-curses_constants.ads</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface-curses_constants.ads </h1></div><hr>
+<pre>
+<span class="comment"><em>--  Generated by the C program ./generate (source ./gen.c).</em></span>
+<span class="comment"><em>--  Do not edit this file directly.</em></span>
+<span class="comment"><em>--  The values provided here may vary on your system.</em></span>
+
+<b>with</b> System;
+<b>package</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<span class="symbol"><a name="ref_6_28">Curses_Constants</a></span> <b>is</b>
+   <b>pragma</b> Pure;
+
+   <span class="symbol"><a name="ref_9_4">DFT_ARG_SUFFIX</a></span> : <b>constant</b> String := "";
+   <span class="symbol"><a name="ref_10_4">Bit_Order</a></span> : <b>constant</b> System.Bit_Order := System.Low_Order_First;
+   <span class="symbol"><a name="ref_11_4">Sizeof_Bool</a></span>                  : <b>constant</b> := 8;
+   <span class="symbol"><a name="ref_12_4">OK</a></span>                           : <b>constant</b> := 0;
+   <span class="symbol"><a name="ref_13_4">ERR</a></span>                          : <b>constant</b> := -1;
+   <b>pragma</b> Warnings (Off); <span class="comment"><em>-- redefinition of Standard.True and False</em></span>
+   <span class="symbol"><a name="ref_15_4">TRUE</a></span>                         : <b>constant</b> := 1;
+   <span class="symbol"><a name="ref_16_4">FALSE</a></span>                        : <b>constant</b> := 0;
+   <b>pragma</b> Warnings (On);
+
+   <span class="comment"><em>--  Version of the ncurses library from extensions(3NCURSES)</em></span>
+
+   <span class="symbol"><a name="ref_21_4">NCURSES_VERSION_MAJOR</a></span>        : <b>constant</b> := 6;
+   <span class="symbol"><a name="ref_22_4">NCURSES_VERSION_MINOR</a></span>        : <b>constant</b> := 4;
+   <span class="symbol"><a name="ref_23_4">Version</a></span> : <b>constant</b> String := "6.4";
+
+   <span class="comment"><em>--  Character non-color attributes from attr(3NCURSES)</em></span>
+
+   <span class="comment"><em>--  attr_t and chtype may be signed in C.</em></span>
+   <b>type</b> <span class="symbol"><a name="ref_28_9">attr_t</a></span> <b>is</b> <b>mod</b> 2 ** 32;
+   <span class="symbol"><a name="ref_29_4">A_CHARTEXT_First</a></span>             : <b>constant</b> := 0;
+   <span class="symbol"><a name="ref_30_4">A_CHARTEXT_Last</a></span>              : <b>constant</b> := 7;
+   <span class="symbol"><a name="ref_31_4">A_COLOR_First</a></span>                : <b>constant</b> := 8;
+   <span class="symbol"><a name="ref_32_4">A_COLOR_Last</a></span>                 : <b>constant</b> := 15;
+   <span class="symbol"><a name="ref_33_4">Attr_First</a></span>                   : <b>constant</b> := 16;
+   <span class="symbol"><a name="ref_34_4">Attr_Last</a></span>                    : <b>constant</b> := 31;
+   <span class="symbol"><a name="ref_35_4">A_STANDOUT_First</a></span>             : <b>constant</b> := 16;
+   <span class="symbol"><a name="ref_36_4">A_STANDOUT_Last</a></span>              : <b>constant</b> := 16;
+   <span class="symbol"><a name="ref_37_4">A_UNDERLINE_First</a></span>            : <b>constant</b> := 17;
+   <span class="symbol"><a name="ref_38_4">A_UNDERLINE_Last</a></span>             : <b>constant</b> := 17;
+   <span class="symbol"><a name="ref_39_4">A_REVERSE_First</a></span>              : <b>constant</b> := 18;
+   <span class="symbol"><a name="ref_40_4">A_REVERSE_Last</a></span>               : <b>constant</b> := 18;
+   <span class="symbol"><a name="ref_41_4">A_BLINK_First</a></span>                : <b>constant</b> := 19;
+   <span class="symbol"><a name="ref_42_4">A_BLINK_Last</a></span>                 : <b>constant</b> := 19;
+   <span class="symbol"><a name="ref_43_4">A_DIM_First</a></span>                  : <b>constant</b> := 20;
+   <span class="symbol"><a name="ref_44_4">A_DIM_Last</a></span>                   : <b>constant</b> := 20;
+   <span class="symbol"><a name="ref_45_4">A_BOLD_First</a></span>                 : <b>constant</b> := 21;
+   <span class="symbol"><a name="ref_46_4">A_BOLD_Last</a></span>                  : <b>constant</b> := 21;
+   <span class="symbol"><a name="ref_47_4">A_PROTECT_First</a></span>              : <b>constant</b> := 24;
+   <span class="symbol"><a name="ref_48_4">A_PROTECT_Last</a></span>               : <b>constant</b> := 24;
+   <span class="symbol"><a name="ref_49_4">A_INVIS_First</a></span>                : <b>constant</b> := 23;
+   <span class="symbol"><a name="ref_50_4">A_INVIS_Last</a></span>                 : <b>constant</b> := 23;
+   <span class="symbol"><a name="ref_51_4">A_ALTCHARSET_First</a></span>           : <b>constant</b> := 22;
+   <span class="symbol"><a name="ref_52_4">A_ALTCHARSET_Last</a></span>            : <b>constant</b> := 22;
+   <span class="symbol"><a name="ref_53_4">A_HORIZONTAL_First</a></span>           : <b>constant</b> := 25;
+   <span class="symbol"><a name="ref_54_4">A_HORIZONTAL_Last</a></span>            : <b>constant</b> := 25;
+   <span class="symbol"><a name="ref_55_4">A_LEFT_First</a></span>                 : <b>constant</b> := 26;
+   <span class="symbol"><a name="ref_56_4">A_LEFT_Last</a></span>                  : <b>constant</b> := 26;
+   <span class="symbol"><a name="ref_57_4">A_LOW_First</a></span>                  : <b>constant</b> := 27;
+   <span class="symbol"><a name="ref_58_4">A_LOW_Last</a></span>                   : <b>constant</b> := 27;
+   <span class="symbol"><a name="ref_59_4">A_RIGHT_First</a></span>                : <b>constant</b> := 28;
+   <span class="symbol"><a name="ref_60_4">A_RIGHT_Last</a></span>                 : <b>constant</b> := 28;
+   <span class="symbol"><a name="ref_61_4">A_TOP_First</a></span>                  : <b>constant</b> := 29;
+   <span class="symbol"><a name="ref_62_4">A_TOP_Last</a></span>                   : <b>constant</b> := 29;
+   <span class="symbol"><a name="ref_63_4">A_VERTICAL_First</a></span>             : <b>constant</b> := 30;
+   <span class="symbol"><a name="ref_64_4">A_VERTICAL_Last</a></span>              : <b>constant</b> := 30;
+   <span class="symbol"><a name="ref_65_4">chtype_Size</a></span>                  : <b>constant</b> := 32;
+
+   <span class="comment"><em>--  predefined color numbers from color(3NCURSES)</em></span>
+
+   <span class="symbol"><a name="ref_69_4">COLOR_BLACK</a></span>                  : <b>constant</b> := 0;
+   <span class="symbol"><a name="ref_70_4">COLOR_RED</a></span>                    : <b>constant</b> := 1;
+   <span class="symbol"><a name="ref_71_4">COLOR_GREEN</a></span>                  : <b>constant</b> := 2;
+   <span class="symbol"><a name="ref_72_4">COLOR_YELLOW</a></span>                 : <b>constant</b> := 3;
+   <span class="symbol"><a name="ref_73_4">COLOR_BLUE</a></span>                   : <b>constant</b> := 4;
+   <span class="symbol"><a name="ref_74_4">COLOR_MAGENTA</a></span>                : <b>constant</b> := 5;
+   <span class="symbol"><a name="ref_75_4">COLOR_CYAN</a></span>                   : <b>constant</b> := 6;
+   <span class="symbol"><a name="ref_76_4">COLOR_WHITE</a></span>                  : <b>constant</b> := 7;
+
+   <span class="comment"><em>--  ETI return codes from ncurses.h</em></span>
+
+   <span class="symbol"><a name="ref_80_4">E_OK</a></span>                         : <b>constant</b> := 0;
+   <span class="symbol"><a name="ref_81_4">E_SYSTEM_ERROR</a></span>               : <b>constant</b> := -1;
+   <span class="symbol"><a name="ref_82_4">E_BAD_ARGUMENT</a></span>               : <b>constant</b> := -2;
+   <span class="symbol"><a name="ref_83_4">E_POSTED</a></span>                     : <b>constant</b> := -3;
+   <span class="symbol"><a name="ref_84_4">E_CONNECTED</a></span>                  : <b>constant</b> := -4;
+   <span class="symbol"><a name="ref_85_4">E_BAD_STATE</a></span>                  : <b>constant</b> := -5;
+   <span class="symbol"><a name="ref_86_4">E_NO_ROOM</a></span>                    : <b>constant</b> := -6;
+   <span class="symbol"><a name="ref_87_4">E_NOT_POSTED</a></span>                 : <b>constant</b> := -7;
+   <span class="symbol"><a name="ref_88_4">E_UNKNOWN_COMMAND</a></span>            : <b>constant</b> := -8;
+   <span class="symbol"><a name="ref_89_4">E_NO_MATCH</a></span>                   : <b>constant</b> := -9;
+   <span class="symbol"><a name="ref_90_4">E_NOT_SELECTABLE</a></span>             : <b>constant</b> := -10;
+   <span class="symbol"><a name="ref_91_4">E_NOT_CONNECTED</a></span>              : <b>constant</b> := -11;
+   <span class="symbol"><a name="ref_92_4">E_REQUEST_DENIED</a></span>             : <b>constant</b> := -12;
+   <span class="symbol"><a name="ref_93_4">E_INVALID_FIELD</a></span>              : <b>constant</b> := -13;
+   <span class="symbol"><a name="ref_94_4">E_CURRENT</a></span>                    : <b>constant</b> := -14;
+
+   <span class="comment"><em>--  Input key codes not defined in any ncurses manpage</em></span>
+
+   <span class="symbol"><a name="ref_98_4">KEY_MIN</a></span>                      : <b>constant</b> := 257;
+   <span class="symbol"><a name="ref_99_4">KEY_MAX</a></span>                      : <b>constant</b> := 511;
+   <span class="symbol"><a name="ref_100_4">KEY_CODE_YES</a></span>                 : <b>constant</b> := 256;
+
+   <span class="comment"><em>--  Input key codes from getch(3NCURSES)</em></span>
+
+   <span class="symbol"><a name="ref_104_4">KEY_BREAK</a></span>                    : <b>constant</b> := 257;
+   <span class="symbol"><a name="ref_105_4">KEY_DOWN</a></span>                     : <b>constant</b> := 258;
+   <span class="symbol"><a name="ref_106_4">KEY_UP</a></span>                       : <b>constant</b> := 259;
+   <span class="symbol"><a name="ref_107_4">KEY_LEFT</a></span>                     : <b>constant</b> := 260;
+   <span class="symbol"><a name="ref_108_4">KEY_RIGHT</a></span>                    : <b>constant</b> := 261;
+   <span class="symbol"><a name="ref_109_4">KEY_HOME</a></span>                     : <b>constant</b> := 262;
+   <span class="symbol"><a name="ref_110_4">KEY_BACKSPACE</a></span>                : <b>constant</b> := 263;
+   <span class="symbol"><a name="ref_111_4">KEY_F0</a></span>                       : <b>constant</b> := 264;
+   <span class="symbol"><a name="ref_112_4">KEY_F1</a></span>                       : <b>constant</b> := 265;
+   <span class="symbol"><a name="ref_113_4">KEY_F2</a></span>                       : <b>constant</b> := 266;
+   <span class="symbol"><a name="ref_114_4">KEY_F3</a></span>                       : <b>constant</b> := 267;
+   <span class="symbol"><a name="ref_115_4">KEY_F4</a></span>                       : <b>constant</b> := 268;
+   <span class="symbol"><a name="ref_116_4">KEY_F5</a></span>                       : <b>constant</b> := 269;
+   <span class="symbol"><a name="ref_117_4">KEY_F6</a></span>                       : <b>constant</b> := 270;
+   <span class="symbol"><a name="ref_118_4">KEY_F7</a></span>                       : <b>constant</b> := 271;
+   <span class="symbol"><a name="ref_119_4">KEY_F8</a></span>                       : <b>constant</b> := 272;
+   <span class="symbol"><a name="ref_120_4">KEY_F9</a></span>                       : <b>constant</b> := 273;
+   <span class="symbol"><a name="ref_121_4">KEY_F10</a></span>                      : <b>constant</b> := 274;
+   <span class="symbol"><a name="ref_122_4">KEY_F11</a></span>                      : <b>constant</b> := 275;
+   <span class="symbol"><a name="ref_123_4">KEY_F12</a></span>                      : <b>constant</b> := 276;
+   <span class="symbol"><a name="ref_124_4">KEY_F13</a></span>                      : <b>constant</b> := 277;
+   <span class="symbol"><a name="ref_125_4">KEY_F14</a></span>                      : <b>constant</b> := 278;
+   <span class="symbol"><a name="ref_126_4">KEY_F15</a></span>                      : <b>constant</b> := 279;
+   <span class="symbol"><a name="ref_127_4">KEY_F16</a></span>                      : <b>constant</b> := 280;
+   <span class="symbol"><a name="ref_128_4">KEY_F17</a></span>                      : <b>constant</b> := 281;
+   <span class="symbol"><a name="ref_129_4">KEY_F18</a></span>                      : <b>constant</b> := 282;
+   <span class="symbol"><a name="ref_130_4">KEY_F19</a></span>                      : <b>constant</b> := 283;
+   <span class="symbol"><a name="ref_131_4">KEY_F20</a></span>                      : <b>constant</b> := 284;
+   <span class="symbol"><a name="ref_132_4">KEY_F21</a></span>                      : <b>constant</b> := 285;
+   <span class="symbol"><a name="ref_133_4">KEY_F22</a></span>                      : <b>constant</b> := 286;
+   <span class="symbol"><a name="ref_134_4">KEY_F23</a></span>                      : <b>constant</b> := 287;
+   <span class="symbol"><a name="ref_135_4">KEY_F24</a></span>                      : <b>constant</b> := 288;
+   <span class="symbol"><a name="ref_136_4">KEY_DL</a></span>                       : <b>constant</b> := 328;
+   <span class="symbol"><a name="ref_137_4">KEY_IL</a></span>                       : <b>constant</b> := 329;
+   <span class="symbol"><a name="ref_138_4">KEY_DC</a></span>                       : <b>constant</b> := 330;
+   <span class="symbol"><a name="ref_139_4">KEY_IC</a></span>                       : <b>constant</b> := 331;
+   <span class="symbol"><a name="ref_140_4">KEY_EIC</a></span>                      : <b>constant</b> := 332;
+   <span class="symbol"><a name="ref_141_4">KEY_CLEAR</a></span>                    : <b>constant</b> := 333;
+   <span class="symbol"><a name="ref_142_4">KEY_EOS</a></span>                      : <b>constant</b> := 334;
+   <span class="symbol"><a name="ref_143_4">KEY_EOL</a></span>                      : <b>constant</b> := 335;
+   <span class="symbol"><a name="ref_144_4">KEY_SF</a></span>                       : <b>constant</b> := 336;
+   <span class="symbol"><a name="ref_145_4">KEY_SR</a></span>                       : <b>constant</b> := 337;
+   <span class="symbol"><a name="ref_146_4">KEY_NPAGE</a></span>                    : <b>constant</b> := 338;
+   <span class="symbol"><a name="ref_147_4">KEY_PPAGE</a></span>                    : <b>constant</b> := 339;
+   <span class="symbol"><a name="ref_148_4">KEY_STAB</a></span>                     : <b>constant</b> := 340;
+   <span class="symbol"><a name="ref_149_4">KEY_CTAB</a></span>                     : <b>constant</b> := 341;
+   <span class="symbol"><a name="ref_150_4">KEY_CATAB</a></span>                    : <b>constant</b> := 342;
+   <span class="symbol"><a name="ref_151_4">KEY_ENTER</a></span>                    : <b>constant</b> := 343;
+   <span class="symbol"><a name="ref_152_4">KEY_SRESET</a></span>                   : <b>constant</b> := 344;
+   <span class="symbol"><a name="ref_153_4">KEY_RESET</a></span>                    : <b>constant</b> := 345;
+   <span class="symbol"><a name="ref_154_4">KEY_PRINT</a></span>                    : <b>constant</b> := 346;
+   <span class="symbol"><a name="ref_155_4">KEY_LL</a></span>                       : <b>constant</b> := 347;
+   <span class="symbol"><a name="ref_156_4">KEY_A1</a></span>                       : <b>constant</b> := 348;
+   <span class="symbol"><a name="ref_157_4">KEY_A3</a></span>                       : <b>constant</b> := 349;
+   <span class="symbol"><a name="ref_158_4">KEY_B2</a></span>                       : <b>constant</b> := 350;
+   <span class="symbol"><a name="ref_159_4">KEY_C1</a></span>                       : <b>constant</b> := 351;
+   <span class="symbol"><a name="ref_160_4">KEY_C3</a></span>                       : <b>constant</b> := 352;
+   <span class="symbol"><a name="ref_161_4">KEY_BTAB</a></span>                     : <b>constant</b> := 353;
+   <span class="symbol"><a name="ref_162_4">KEY_BEG</a></span>                      : <b>constant</b> := 354;
+   <span class="symbol"><a name="ref_163_4">KEY_CANCEL</a></span>                   : <b>constant</b> := 355;
+   <span class="symbol"><a name="ref_164_4">KEY_CLOSE</a></span>                    : <b>constant</b> := 356;
+   <span class="symbol"><a name="ref_165_4">KEY_COMMAND</a></span>                  : <b>constant</b> := 357;
+   <span class="symbol"><a name="ref_166_4">KEY_COPY</a></span>                     : <b>constant</b> := 358;
+   <span class="symbol"><a name="ref_167_4">KEY_CREATE</a></span>                   : <b>constant</b> := 359;
+   <span class="symbol"><a name="ref_168_4">KEY_END</a></span>                      : <b>constant</b> := 360;
+   <span class="symbol"><a name="ref_169_4">KEY_EXIT</a></span>                     : <b>constant</b> := 361;
+   <span class="symbol"><a name="ref_170_4">KEY_FIND</a></span>                     : <b>constant</b> := 362;
+   <span class="symbol"><a name="ref_171_4">KEY_HELP</a></span>                     : <b>constant</b> := 363;
+   <span class="symbol"><a name="ref_172_4">KEY_MARK</a></span>                     : <b>constant</b> := 364;
+   <span class="symbol"><a name="ref_173_4">KEY_MESSAGE</a></span>                  : <b>constant</b> := 365;
+   <span class="symbol"><a name="ref_174_4">KEY_MOVE</a></span>                     : <b>constant</b> := 366;
+   <span class="symbol"><a name="ref_175_4">KEY_NEXT</a></span>                     : <b>constant</b> := 367;
+   <span class="symbol"><a name="ref_176_4">KEY_OPEN</a></span>                     : <b>constant</b> := 368;
+   <span class="symbol"><a name="ref_177_4">KEY_OPTIONS</a></span>                  : <b>constant</b> := 369;
+   <span class="symbol"><a name="ref_178_4">KEY_PREVIOUS</a></span>                 : <b>constant</b> := 370;
+   <span class="symbol"><a name="ref_179_4">KEY_REDO</a></span>                     : <b>constant</b> := 371;
+   <span class="symbol"><a name="ref_180_4">KEY_REFERENCE</a></span>                : <b>constant</b> := 372;
+   <span class="symbol"><a name="ref_181_4">KEY_REFRESH</a></span>                  : <b>constant</b> := 373;
+   <span class="symbol"><a name="ref_182_4">KEY_REPLACE</a></span>                  : <b>constant</b> := 374;
+   <span class="symbol"><a name="ref_183_4">KEY_RESTART</a></span>                  : <b>constant</b> := 375;
+   <span class="symbol"><a name="ref_184_4">KEY_RESUME</a></span>                   : <b>constant</b> := 376;
+   <span class="symbol"><a name="ref_185_4">KEY_SAVE</a></span>                     : <b>constant</b> := 377;
+   <span class="symbol"><a name="ref_186_4">KEY_SBEG</a></span>                     : <b>constant</b> := 378;
+   <span class="symbol"><a name="ref_187_4">KEY_SCANCEL</a></span>                  : <b>constant</b> := 379;
+   <span class="symbol"><a name="ref_188_4">KEY_SCOMMAND</a></span>                 : <b>constant</b> := 380;
+   <span class="symbol"><a name="ref_189_4">KEY_SCOPY</a></span>                    : <b>constant</b> := 381;
+   <span class="symbol"><a name="ref_190_4">KEY_SCREATE</a></span>                  : <b>constant</b> := 382;
+   <span class="symbol"><a name="ref_191_4">KEY_SDC</a></span>                      : <b>constant</b> := 383;
+   <span class="symbol"><a name="ref_192_4">KEY_SDL</a></span>                      : <b>constant</b> := 384;
+   <span class="symbol"><a name="ref_193_4">KEY_SELECT</a></span>                   : <b>constant</b> := 385;
+   <span class="symbol"><a name="ref_194_4">KEY_SEND</a></span>                     : <b>constant</b> := 386;
+   <span class="symbol"><a name="ref_195_4">KEY_SEOL</a></span>                     : <b>constant</b> := 387;
+   <span class="symbol"><a name="ref_196_4">KEY_SEXIT</a></span>                    : <b>constant</b> := 388;
+   <span class="symbol"><a name="ref_197_4">KEY_SFIND</a></span>                    : <b>constant</b> := 389;
+   <span class="symbol"><a name="ref_198_4">KEY_SHELP</a></span>                    : <b>constant</b> := 390;
+   <span class="symbol"><a name="ref_199_4">KEY_SHOME</a></span>                    : <b>constant</b> := 391;
+   <span class="symbol"><a name="ref_200_4">KEY_SIC</a></span>                      : <b>constant</b> := 392;
+   <span class="symbol"><a name="ref_201_4">KEY_SLEFT</a></span>                    : <b>constant</b> := 393;
+   <span class="symbol"><a name="ref_202_4">KEY_SMESSAGE</a></span>                 : <b>constant</b> := 394;
+   <span class="symbol"><a name="ref_203_4">KEY_SMOVE</a></span>                    : <b>constant</b> := 395;
+   <span class="symbol"><a name="ref_204_4">KEY_SNEXT</a></span>                    : <b>constant</b> := 396;
+   <span class="symbol"><a name="ref_205_4">KEY_SOPTIONS</a></span>                 : <b>constant</b> := 397;
+   <span class="symbol"><a name="ref_206_4">KEY_SPREVIOUS</a></span>                : <b>constant</b> := 398;
+   <span class="symbol"><a name="ref_207_4">KEY_SPRINT</a></span>                   : <b>constant</b> := 399;
+   <span class="symbol"><a name="ref_208_4">KEY_SREDO</a></span>                    : <b>constant</b> := 400;
+   <span class="symbol"><a name="ref_209_4">KEY_SREPLACE</a></span>                 : <b>constant</b> := 401;
+   <span class="symbol"><a name="ref_210_4">KEY_SRIGHT</a></span>                   : <b>constant</b> := 402;
+   <span class="symbol"><a name="ref_211_4">KEY_SRSUME</a></span>                   : <b>constant</b> := 403;
+   <span class="symbol"><a name="ref_212_4">KEY_SSAVE</a></span>                    : <b>constant</b> := 404;
+   <span class="symbol"><a name="ref_213_4">KEY_SSUSPEND</a></span>                 : <b>constant</b> := 405;
+   <span class="symbol"><a name="ref_214_4">KEY_SUNDO</a></span>                    : <b>constant</b> := 406;
+   <span class="symbol"><a name="ref_215_4">KEY_SUSPEND</a></span>                  : <b>constant</b> := 407;
+   <span class="symbol"><a name="ref_216_4">KEY_UNDO</a></span>                     : <b>constant</b> := 408;
+   <span class="symbol"><a name="ref_217_4">KEY_MOUSE</a></span>                    : <b>constant</b> := 409;
+   <span class="symbol"><a name="ref_218_4">KEY_RESIZE</a></span>                   : <b>constant</b> := 410;
+
+   <span class="comment"><em>--  alternate character codes (ACS) from addch(3NCURSES)</em></span>
+
+   <span class="symbol"><a name="ref_222_4">ACS_ULCORNER</a></span>                 : <b>constant</b> := 108;
+   <span class="symbol"><a name="ref_223_4">ACS_LLCORNER</a></span>                 : <b>constant</b> := 109;
+   <span class="symbol"><a name="ref_224_4">ACS_URCORNER</a></span>                 : <b>constant</b> := 107;
+   <span class="symbol"><a name="ref_225_4">ACS_LRCORNER</a></span>                 : <b>constant</b> := 106;
+   <span class="symbol"><a name="ref_226_4">ACS_LTEE</a></span>                     : <b>constant</b> := 116;
+   <span class="symbol"><a name="ref_227_4">ACS_RTEE</a></span>                     : <b>constant</b> := 117;
+   <span class="symbol"><a name="ref_228_4">ACS_BTEE</a></span>                     : <b>constant</b> := 118;
+   <span class="symbol"><a name="ref_229_4">ACS_TTEE</a></span>                     : <b>constant</b> := 119;
+   <span class="symbol"><a name="ref_230_4">ACS_HLINE</a></span>                    : <b>constant</b> := 113;
+   <span class="symbol"><a name="ref_231_4">ACS_VLINE</a></span>                    : <b>constant</b> := 120;
+   <span class="symbol"><a name="ref_232_4">ACS_PLUS</a></span>                     : <b>constant</b> := 110;
+   <span class="symbol"><a name="ref_233_4">ACS_S1</a></span>                       : <b>constant</b> := 111;
+   <span class="symbol"><a name="ref_234_4">ACS_S9</a></span>                       : <b>constant</b> := 115;
+   <span class="symbol"><a name="ref_235_4">ACS_DIAMOND</a></span>                  : <b>constant</b> := 96;
+   <span class="symbol"><a name="ref_236_4">ACS_CKBOARD</a></span>                  : <b>constant</b> := 97;
+   <span class="symbol"><a name="ref_237_4">ACS_DEGREE</a></span>                   : <b>constant</b> := 102;
+   <span class="symbol"><a name="ref_238_4">ACS_PLMINUS</a></span>                  : <b>constant</b> := 103;
+   <span class="symbol"><a name="ref_239_4">ACS_BULLET</a></span>                   : <b>constant</b> := 126;
+   <span class="symbol"><a name="ref_240_4">ACS_LARROW</a></span>                   : <b>constant</b> := 44;
+   <span class="symbol"><a name="ref_241_4">ACS_RARROW</a></span>                   : <b>constant</b> := 43;
+   <span class="symbol"><a name="ref_242_4">ACS_DARROW</a></span>                   : <b>constant</b> := 46;
+   <span class="symbol"><a name="ref_243_4">ACS_UARROW</a></span>                   : <b>constant</b> := 45;
+   <span class="symbol"><a name="ref_244_4">ACS_BOARD</a></span>                    : <b>constant</b> := 104;
+   <span class="symbol"><a name="ref_245_4">ACS_LANTERN</a></span>                  : <b>constant</b> := 105;
+   <span class="symbol"><a name="ref_246_4">ACS_BLOCK</a></span>                    : <b>constant</b> := 48;
+   <span class="symbol"><a name="ref_247_4">ACS_S3</a></span>                       : <b>constant</b> := 112;
+   <span class="symbol"><a name="ref_248_4">ACS_S7</a></span>                       : <b>constant</b> := 114;
+   <span class="symbol"><a name="ref_249_4">ACS_LEQUAL</a></span>                   : <b>constant</b> := 121;
+   <span class="symbol"><a name="ref_250_4">ACS_GEQUAL</a></span>                   : <b>constant</b> := 122;
+   <span class="symbol"><a name="ref_251_4">ACS_PI</a></span>                       : <b>constant</b> := 123;
+   <span class="symbol"><a name="ref_252_4">ACS_NEQUAL</a></span>                   : <b>constant</b> := 124;
+   <span class="symbol"><a name="ref_253_4">ACS_STERLING</a></span>                 : <b>constant</b> := 125;
+
+   <span class="comment"><em>--  Menu_Options from opts(3MENU)</em></span>
+
+   <span class="symbol"><a name="ref_257_4">O_ONEVALUE_First</a></span>             : <b>constant</b> := 0;
+   <span class="symbol"><a name="ref_258_4">O_ONEVALUE_Last</a></span>              : <b>constant</b> := 0;
+   <span class="symbol"><a name="ref_259_4">O_SHOWDESC_First</a></span>             : <b>constant</b> := 1;
+   <span class="symbol"><a name="ref_260_4">O_SHOWDESC_Last</a></span>              : <b>constant</b> := 1;
+   <span class="symbol"><a name="ref_261_4">O_ROWMAJOR_First</a></span>             : <b>constant</b> := 2;
+   <span class="symbol"><a name="ref_262_4">O_ROWMAJOR_Last</a></span>              : <b>constant</b> := 2;
+   <span class="symbol"><a name="ref_263_4">O_IGNORECASE_First</a></span>           : <b>constant</b> := 3;
+   <span class="symbol"><a name="ref_264_4">O_IGNORECASE_Last</a></span>            : <b>constant</b> := 3;
+   <span class="symbol"><a name="ref_265_4">O_SHOWMATCH_First</a></span>            : <b>constant</b> := 4;
+   <span class="symbol"><a name="ref_266_4">O_SHOWMATCH_Last</a></span>             : <b>constant</b> := 4;
+   <span class="symbol"><a name="ref_267_4">O_NONCYCLIC_First</a></span>            : <b>constant</b> := 5;
+   <span class="symbol"><a name="ref_268_4">O_NONCYCLIC_Last</a></span>             : <b>constant</b> := 5;
+   <span class="symbol"><a name="ref_269_4">Menu_Options_Size</a></span>            : <b>constant</b> := 32;
+
+   <span class="comment"><em>--  Item_Options from menu_opts(3MENU)</em></span>
+
+   <span class="symbol"><a name="ref_273_4">O_SELECTABLE_First</a></span>           : <b>constant</b> := 0;
+   <span class="symbol"><a name="ref_274_4">O_SELECTABLE_Last</a></span>            : <b>constant</b> := 0;
+   <span class="symbol"><a name="ref_275_4">Item_Options_Size</a></span>            : <b>constant</b> := 32;
+
+   <span class="comment"><em>--  Field_Options from field_opts(3FORM)</em></span>
+
+   <span class="symbol"><a name="ref_279_4">O_VISIBLE_First</a></span>              : <b>constant</b> := 0;
+   <span class="symbol"><a name="ref_280_4">O_VISIBLE_Last</a></span>               : <b>constant</b> := 0;
+   <span class="symbol"><a name="ref_281_4">O_ACTIVE_First</a></span>               : <b>constant</b> := 1;
+   <span class="symbol"><a name="ref_282_4">O_ACTIVE_Last</a></span>                : <b>constant</b> := 1;
+   <span class="symbol"><a name="ref_283_4">O_PUBLIC_First</a></span>               : <b>constant</b> := 2;
+   <span class="symbol"><a name="ref_284_4">O_PUBLIC_Last</a></span>                : <b>constant</b> := 2;
+   <span class="symbol"><a name="ref_285_4">O_EDIT_First</a></span>                 : <b>constant</b> := 3;
+   <span class="symbol"><a name="ref_286_4">O_EDIT_Last</a></span>                  : <b>constant</b> := 3;
+   <span class="symbol"><a name="ref_287_4">O_WRAP_First</a></span>                 : <b>constant</b> := 4;
+   <span class="symbol"><a name="ref_288_4">O_WRAP_Last</a></span>                  : <b>constant</b> := 4;
+   <span class="symbol"><a name="ref_289_4">O_BLANK_First</a></span>                : <b>constant</b> := 5;
+   <span class="symbol"><a name="ref_290_4">O_BLANK_Last</a></span>                 : <b>constant</b> := 5;
+   <span class="symbol"><a name="ref_291_4">O_AUTOSKIP_First</a></span>             : <b>constant</b> := 6;
+   <span class="symbol"><a name="ref_292_4">O_AUTOSKIP_Last</a></span>              : <b>constant</b> := 6;
+   <span class="symbol"><a name="ref_293_4">O_NULLOK_First</a></span>               : <b>constant</b> := 7;
+   <span class="symbol"><a name="ref_294_4">O_NULLOK_Last</a></span>                : <b>constant</b> := 7;
+   <span class="symbol"><a name="ref_295_4">O_PASSOK_First</a></span>               : <b>constant</b> := 8;
+   <span class="symbol"><a name="ref_296_4">O_PASSOK_Last</a></span>                : <b>constant</b> := 8;
+   <span class="symbol"><a name="ref_297_4">O_STATIC_First</a></span>               : <b>constant</b> := 9;
+   <span class="symbol"><a name="ref_298_4">O_STATIC_Last</a></span>                : <b>constant</b> := 9;
+   <span class="symbol"><a name="ref_299_4">Field_Options_Size</a></span>           : <b>constant</b> := 32;
+
+   <span class="comment"><em>--  Field_Options from opts(3FORM)</em></span>
+
+   <span class="symbol"><a name="ref_303_4">O_NL_OVERLOAD_First</a></span>          : <b>constant</b> := 0;
+   <span class="symbol"><a name="ref_304_4">O_NL_OVERLOAD_Last</a></span>           : <b>constant</b> := 0;
+   <span class="symbol"><a name="ref_305_4">O_BS_OVERLOAD_First</a></span>          : <b>constant</b> := 1;
+   <span class="symbol"><a name="ref_306_4">O_BS_OVERLOAD_Last</a></span>           : <b>constant</b> := 1;
+
+   <span class="comment"><em>--  MEVENT structure from mouse(3NCURSES)</em></span>
+
+   <span class="symbol"><a name="ref_310_4">MEVENT_id_First</a></span>              : <b>constant</b> := 0;
+   <span class="symbol"><a name="ref_311_4">MEVENT_id_Last</a></span>               : <b>constant</b> := 15;
+   <span class="symbol"><a name="ref_312_4">MEVENT_x_First</a></span>               : <b>constant</b> := 32;
+   <span class="symbol"><a name="ref_313_4">MEVENT_x_Last</a></span>                : <b>constant</b> := 63;
+   <span class="symbol"><a name="ref_314_4">MEVENT_y_First</a></span>               : <b>constant</b> := 64;
+   <span class="symbol"><a name="ref_315_4">MEVENT_y_Last</a></span>                : <b>constant</b> := 95;
+   <span class="symbol"><a name="ref_316_4">MEVENT_z_First</a></span>               : <b>constant</b> := 96;
+   <span class="symbol"><a name="ref_317_4">MEVENT_z_Last</a></span>                : <b>constant</b> := 127;
+   <span class="symbol"><a name="ref_318_4">MEVENT_bstate_First</a></span>          : <b>constant</b> := 128;
+   <span class="symbol"><a name="ref_319_4">MEVENT_bstate_Last</a></span>           : <b>constant</b> := 159;
+   <span class="symbol"><a name="ref_320_4">MEVENT_Size</a></span>                  : <b>constant</b> := 160;
+
+   <span class="comment"><em>--  mouse events from mouse(3NCURSES)</em></span>
+
+   <span class="symbol"><a name="ref_324_4">BUTTON1_RELEASED</a></span>             : <b>constant</b> := 1;
+   <span class="symbol"><a name="ref_325_4">BUTTON1_PRESSED</a></span>              : <b>constant</b> := 2;
+   <span class="symbol"><a name="ref_326_4">BUTTON1_CLICKED</a></span>              : <b>constant</b> := 4;
+   <span class="symbol"><a name="ref_327_4">BUTTON1_DOUBLE_CLICKED</a></span>       : <b>constant</b> := 8;
+   <span class="symbol"><a name="ref_328_4">BUTTON1_TRIPLE_CLICKED</a></span>       : <b>constant</b> := 16;
+   <span class="symbol"><a name="ref_329_4">all_events_button_1</a></span>          : <b>constant</b> := 31;
+   <span class="symbol"><a name="ref_330_4">BUTTON2_RELEASED</a></span>             : <b>constant</b> := 32;
+   <span class="symbol"><a name="ref_331_4">BUTTON2_PRESSED</a></span>              : <b>constant</b> := 64;
+   <span class="symbol"><a name="ref_332_4">BUTTON2_CLICKED</a></span>              : <b>constant</b> := 128;
+   <span class="symbol"><a name="ref_333_4">BUTTON2_DOUBLE_CLICKED</a></span>       : <b>constant</b> := 256;
+   <span class="symbol"><a name="ref_334_4">BUTTON2_TRIPLE_CLICKED</a></span>       : <b>constant</b> := 512;
+   <span class="symbol"><a name="ref_335_4">all_events_button_2</a></span>          : <b>constant</b> := 992;
+   <span class="symbol"><a name="ref_336_4">BUTTON3_RELEASED</a></span>             : <b>constant</b> := 1024;
+   <span class="symbol"><a name="ref_337_4">BUTTON3_PRESSED</a></span>              : <b>constant</b> := 2048;
+   <span class="symbol"><a name="ref_338_4">BUTTON3_CLICKED</a></span>              : <b>constant</b> := 4096;
+   <span class="symbol"><a name="ref_339_4">BUTTON3_DOUBLE_CLICKED</a></span>       : <b>constant</b> := 8192;
+   <span class="symbol"><a name="ref_340_4">BUTTON3_TRIPLE_CLICKED</a></span>       : <b>constant</b> := 16384;
+   <span class="symbol"><a name="ref_341_4">all_events_button_3</a></span>          : <b>constant</b> := 31744;
+   <span class="symbol"><a name="ref_342_4">BUTTON4_RELEASED</a></span>             : <b>constant</b> := 32768;
+   <span class="symbol"><a name="ref_343_4">BUTTON4_PRESSED</a></span>              : <b>constant</b> := 65536;
+   <span class="symbol"><a name="ref_344_4">BUTTON4_CLICKED</a></span>              : <b>constant</b> := 131072;
+   <span class="symbol"><a name="ref_345_4">BUTTON4_DOUBLE_CLICKED</a></span>       : <b>constant</b> := 262144;
+   <span class="symbol"><a name="ref_346_4">BUTTON4_TRIPLE_CLICKED</a></span>       : <b>constant</b> := 524288;
+   <span class="symbol"><a name="ref_347_4">all_events_button_4</a></span>          : <b>constant</b> := 1015808;
+   <span class="symbol"><a name="ref_348_4">BUTTON_CTRL</a></span>                  : <b>constant</b> := 33554432;
+   <span class="symbol"><a name="ref_349_4">BUTTON_SHIFT</a></span>                 : <b>constant</b> := 67108864;
+   <span class="symbol"><a name="ref_350_4">BUTTON_ALT</a></span>                   : <b>constant</b> := 134217728;
+   <span class="symbol"><a name="ref_351_4">REPORT_MOUSE_POSITION</a></span>        : <b>constant</b> := 268435456;
+   <span class="symbol"><a name="ref_352_4">ALL_MOUSE_EVENTS</a></span>             : <b>constant</b> := 268435455;
+
+   <span class="comment"><em>--  trace selection from trace(3NCURSES)</em></span>
+
+   <span class="symbol"><a name="ref_356_4">TRACE_TIMES_First</a></span>            : <b>constant</b> := 0;
+   <span class="symbol"><a name="ref_357_4">TRACE_TIMES_Last</a></span>             : <b>constant</b> := 0;
+   <span class="symbol"><a name="ref_358_4">TRACE_TPUTS_First</a></span>            : <b>constant</b> := 1;
+   <span class="symbol"><a name="ref_359_4">TRACE_TPUTS_Last</a></span>             : <b>constant</b> := 1;
+   <span class="symbol"><a name="ref_360_4">TRACE_UPDATE_First</a></span>           : <b>constant</b> := 2;
+   <span class="symbol"><a name="ref_361_4">TRACE_UPDATE_Last</a></span>            : <b>constant</b> := 2;
+   <span class="symbol"><a name="ref_362_4">TRACE_MOVE_First</a></span>             : <b>constant</b> := 3;
+   <span class="symbol"><a name="ref_363_4">TRACE_MOVE_Last</a></span>              : <b>constant</b> := 3;
+   <span class="symbol"><a name="ref_364_4">TRACE_CHARPUT_First</a></span>          : <b>constant</b> := 4;
+   <span class="symbol"><a name="ref_365_4">TRACE_CHARPUT_Last</a></span>           : <b>constant</b> := 4;
+   <span class="symbol"><a name="ref_366_4">TRACE_CALLS_First</a></span>            : <b>constant</b> := 5;
+   <span class="symbol"><a name="ref_367_4">TRACE_CALLS_Last</a></span>             : <b>constant</b> := 5;
+   <span class="symbol"><a name="ref_368_4">TRACE_VIRTPUT_First</a></span>          : <b>constant</b> := 6;
+   <span class="symbol"><a name="ref_369_4">TRACE_VIRTPUT_Last</a></span>           : <b>constant</b> := 6;
+   <span class="symbol"><a name="ref_370_4">TRACE_IEVENT_First</a></span>           : <b>constant</b> := 7;
+   <span class="symbol"><a name="ref_371_4">TRACE_IEVENT_Last</a></span>            : <b>constant</b> := 7;
+   <span class="symbol"><a name="ref_372_4">TRACE_BITS_First</a></span>             : <b>constant</b> := 8;
+   <span class="symbol"><a name="ref_373_4">TRACE_BITS_Last</a></span>              : <b>constant</b> := 8;
+   <span class="symbol"><a name="ref_374_4">TRACE_ICALLS_First</a></span>           : <b>constant</b> := 9;
+   <span class="symbol"><a name="ref_375_4">TRACE_ICALLS_Last</a></span>            : <b>constant</b> := 9;
+   <span class="symbol"><a name="ref_376_4">TRACE_CCALLS_First</a></span>           : <b>constant</b> := 10;
+   <span class="symbol"><a name="ref_377_4">TRACE_CCALLS_Last</a></span>            : <b>constant</b> := 10;
+   <span class="symbol"><a name="ref_378_4">TRACE_DATABASE_First</a></span>         : <b>constant</b> := 11;
+   <span class="symbol"><a name="ref_379_4">TRACE_DATABASE_Last</a></span>          : <b>constant</b> := 11;
+   <span class="symbol"><a name="ref_380_4">TRACE_ATTRS_First</a></span>            : <b>constant</b> := 12;
+   <span class="symbol"><a name="ref_381_4">TRACE_ATTRS_Last</a></span>             : <b>constant</b> := 12;
+   <span class="symbol"><a name="ref_382_4">Trace_Size</a></span>                   : <b>constant</b> := 32;
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>.<a href="terminal_interface-curses_constants__ads.htm#ref_6_28">Curses_Constants</a>;
+</pre></body></html>
diff --git a/doc/html/ada/terminal_interface__ads.htm b/doc/html/ada/terminal_interface__ads.htm
new file mode 100644
index 0000000..6876bd0
--- /dev/null
+++ b/doc/html/ada/terminal_interface__ads.htm
@@ -0,0 +1,66 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>terminal_interface.ads</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css">
+*.comment {
+	color: green;
+}
+*.symbol {
+	color: red;
+}
+</style>
+</head>
+<body>
+<hr><div style="text-align:center"><h1> File : terminal_interface.ads </h1></div><hr>
+<pre>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                           <strong>GNAT</strong> ncurses Binding                           --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                            Terminal_Interface                            --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>--                                 S P E C                                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>-- Copyright 2020 Thomas E. Dickey                                          --</em></span>
+<span class="comment"><em>-- Copyright 1999-2003,2006 Free Software Foundation, Inc.                  --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Permission is hereby granted, free of charge, to any person obtaining a  --</em></span>
+<span class="comment"><em>-- copy of this software and associated documentation files (the            --</em></span>
+<span class="comment"><em>-- "Software"), to deal in the Software without restriction, including      --</em></span>
+<span class="comment"><em>-- without limitation the rights to use, copy, modify, merge, publish,      --</em></span>
+<span class="comment"><em>-- distribute, distribute with modifications, sublicense, and/or sell       --</em></span>
+<span class="comment"><em>-- copies of the Software, and to permit persons to whom the Software is    --</em></span>
+<span class="comment"><em>-- furnished to do so, subject to the following conditions:                 --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- The above copyright notice and this permission notice shall be included  --</em></span>
+<span class="comment"><em>-- in all copies or substantial portions of the Software.                   --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --</em></span>
+<span class="comment"><em>-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --</em></span>
+<span class="comment"><em>-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --</em></span>
+<span class="comment"><em>-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --</em></span>
+<span class="comment"><em>-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --</em></span>
+<span class="comment"><em>-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --</em></span>
+<span class="comment"><em>-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --</em></span>
+<span class="comment"><em>--                                                                          --</em></span>
+<span class="comment"><em>-- Except as contained in this notice, the name(s) of the above copyright   --</em></span>
+<span class="comment"><em>-- holders shall not be used in advertising or otherwise to promote the     --</em></span>
+<span class="comment"><em>-- sale, use or other dealings in this Software without prior written       --</em></span>
+<span class="comment"><em>-- authorization.                                                           --</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<span class="comment"><em>--  Author:  Juergen Pfeifer, 1996</em></span>
+<span class="comment"><em>--  Version Control:</em></span>
+<span class="comment"><em>--  @Revision: 1.15 @</em></span>
+<span class="comment"><em>--  @Date: 2020/02/02 23:34:34 @</em></span>
+<span class="comment"><em>--  Binding Version 01.00</em></span>
+<span class="comment"><em>------------------------------------------------------------------------------</em></span>
+<b>package</b> <span class="symbol"><a name="ref_43_9">Terminal_Interface</a></span> <b>is</b>
+   <b>pragma</b> Pure (<a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>);
+<span class="comment"><em>--</em></span>
+<span class="comment"><em>--  Everything is in the child units</em></span>
+<span class="comment"><em>--</em></span>
+<b>end</b> <a href="terminal_interface__ads.htm#ref_43_9">Terminal_Interface</a>;
+</pre></body></html>
diff --git a/doc/html/announce.html b/doc/html/announce.html
new file mode 100644
index 0000000..5143316
--- /dev/null
+++ b/doc/html/announce.html
@@ -0,0 +1,1560 @@
+<!--
+  $Id: announce.html,v 1.68 2022/12/31 20:38:46 tom Exp $
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  *                                                                          *
+  * 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.                                                           *
+  ****************************************************************************
+-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+  <meta name="generator" content=
+  "HTML Tidy for HTML5 for Linux version 5.6.0">
+  <title>Announcing ncurses 6.4</title>
+  <link rel="author" href="mailto:bug-ncurses@gnu.org">
+  <meta http-equiv="Content-Type" content=
+  "text/html; charset=us-ascii">
+  <style type="text/css">
+  p,li { max-width:700px; }
+  dd { max-width:630px; }
+  *.main-name {
+        font-style: italic;
+        font-variant: small-caps;
+  }
+  *.part-name {
+        font-family: "Andale Mono", "Monotype.com", monospace;
+        font-size: 12pt;
+        font-weight: bold;
+  }
+  *.demo-name {
+        font-family: "Andale Mono", "Monotype.com", monospace;
+        font-size: 10pt;
+  }
+  </style>
+</head>
+<body>
+  <h1 class="no-header">Announcing ncurses 6.4</h1>
+
+  <h2><a name="h2-overview" id="h2-overview">Overview</a></h2>
+
+  <p>The <span class="main-name">ncurses</span> (new curses)
+  library is a free software emulation of curses in System V
+  Release 4.0 (SVr4), and more. It uses terminfo format, supports
+  pads and color and multiple highlights and forms characters and
+  function-key mapping, and has all the other SVr4-curses
+  enhancements over BSD curses. SVr4 curses became the basis of
+  X/Open Curses.</p>
+
+  <p>In mid-June 1995, the maintainer of 4.4BSD curses declared
+  that he considered 4.4BSD curses obsolete, and encouraged the
+  keepers of <span class="main-name">unix</span> releases such as
+  BSD/OS, FreeBSD and NetBSD to switch over to <span class=
+  "main-name">ncurses</span>.</p>
+
+  <p>Since 1995, <span class="main-name">ncurses</span> has been
+  ported to many systems:</p>
+
+  <ul>
+    <li>It is used in almost every system based on the Linux kernel
+    (aside from some embedded applications).</li>
+
+    <li>It is used as the system curses library on OpenBSD, FreeBSD
+    and MacOS.</li>
+
+    <li>It is used in environments such as Cygwin and MinGW. The
+    first of these was EMX on OS/2 Warp.</li>
+
+    <li>It is used (though usually not as the <em>system</em>
+    curses) on all of the vendor <span class=
+    "main-name">unix</span> systems, e.g., AIX, HP-UX, IRIX64, SCO,
+    Solaris, Tru64.</li>
+
+    <li>It should work readily on any ANSI/POSIX-conforming
+    <span class="main-name">unix</span>.</li>
+  </ul>
+
+  <p>The distribution includes the library and support utilities,
+  including</p>
+
+  <ul>
+    <li><a href="https://invisible-island.net/ncurses/man/captoinfo.1m.html"><span class=
+    "part-name">captoinfo</span></a>, a termcap conversion
+    tool</li>
+
+    <li><a href="https://invisible-island.net/ncurses/man/clear.1.html"><span class=
+    "part-name">clear</span></a>, utility for clearing the
+    screen</li>
+
+    <li><a href="https://invisible-island.net/ncurses/man/infocmp.1m.html"><span class=
+    "part-name">infocmp</span></a>, the terminfo decompiler</li>
+
+    <li><a href="https://invisible-island.net/ncurses/man/tabs.1.html"><span class=
+    "part-name">tabs</span></a>, set tabs on a terminal</li>
+
+    <li><a href="https://invisible-island.net/ncurses/man/tic.1m.html"><span class=
+    "part-name">tic</span></a>, the terminfo compiler</li>
+
+    <li><a href="https://invisible-island.net/ncurses/man/toe.1m.html"><span class=
+    "part-name">toe</span></a>, list (table of) terminfo
+    entries</li>
+
+    <li><a href="https://invisible-island.net/ncurses/man/tput.1.html"><span class=
+    "part-name">tput</span></a>, utility for retrieving terminal
+    capabilities in shell scripts</li>
+
+    <li><a href="https://invisible-island.net/ncurses/man/tset.1.html"><span class=
+    "part-name">tset</span></a>, to initialize the terminal</li>
+  </ul>
+
+  <p>Full manual pages are provided for the library and tools.</p>
+
+  <p>The <span class="main-name">ncurses</span> distribution is
+  available at <span class="main-name">ncurses</span>' <a href=
+  "https://invisible-island.net/ncurses/">homepage</a>:</p>
+
+  <blockquote>
+    <p><a href=
+    "https://invisible-island.net/archives/ncurses/">https://invisible-island.net/archives/ncurses/</a>
+    or<br>
+    <a href=
+    "https://invisible-mirror.net/archives/ncurses/">https://invisible-mirror.net/archives/ncurses/</a>&nbsp;.</p>
+  </blockquote>
+
+  <p>It is also available at the GNU distribution site</p>
+
+  <blockquote>
+    <p><a href=
+    "https://ftp.gnu.org/gnu/ncurses/">https://ftp.gnu.org/gnu/ncurses/</a>&nbsp;.</p>
+  </blockquote>
+
+  <h2><a name="h2-release-notes" id="h2-release-notes">Release
+  Notes</a></h2>
+
+  <p>These notes are for <span class="main-name">ncurses</span>
+  6.4, released <strong>December 31, 2022</strong>.</p>
+
+  <p>This release is designed to be source-compatible with
+  <span class="main-name">ncurses</span> 5.0 through 6.3; providing
+  extensions to the application binary interface (ABI). Although
+  the source can still be configured to support the <span class=
+  "main-name">ncurses</span> 5 ABI, the reason for the release is
+  to reflect improvements to the <span class=
+  "main-name">ncurses</span> 6 ABI and the supporting utility
+  programs.</p>
+
+  <p>There are, of course, numerous other improvements, listed in
+  this announcement.</p>
+
+  <p>The most <a href="#h3-bug-fixes">important
+  bug-fixes/improvements</a> dealt with robustness issues. The
+  release notes also mention some other bug-fixes, but are focused
+  on new features and improvements to existing features since
+  <span class="main-name">ncurses</span> 6.3 release.</p>
+
+  <h3><a name="h3-library" id="h3-library">Library improvements</a></h3>
+
+  <h4><a name="h4-new-library" id="h4-new-library">New features</a></h4>
+
+  <p>There are no new features in this release.</p>
+
+  <h4><a name="h4-fixes-library" id="h4-fixes-library">Other
+  improvements</a></h4>
+
+  <p>These are improvements to existing features:</p>
+
+  <ul>
+    <li>
+      <p>modify <tt>delscreen</tt> to more effectively delete all
+      windows on the given screen.</p>
+    </li>
+
+    <li>
+      <p>modify <tt>wnoutrefresh</tt> to call <tt>pnoutrefresh</tt>
+      if its parameter is a pad, rather than treating it as an
+      error, and modify new_panel to permit its window-parameter to
+      be a pad</p>
+    </li>
+
+    <li>
+      <p>modify curses_trace() to show the trace-mask as symbols,
+      e.g., <tt>TRACE_ORDINARY</tt>, <tt>DEBUG_LEVEL(3)</tt>.</p>
+    </li>
+
+    <li>
+      <p>improve checks for valid mouse events when an intermediate
+      mouse state is not part of the mousemask specified by the
+      caller</p>
+    </li>
+
+    <li>
+      <p>allow extended-color number in <em>opts</em> parameter of
+      <tt>wattr_on</tt>.</p>
+    </li>
+
+    <li>
+      <p>improve <tt>_tracecchar_t2</tt> formatting of
+      base+combining character.</p>
+    </li>
+
+    <li>
+      <p>trim out some unwanted linker options from ncurses*config
+      and .pc files seen in Fedora 36+.</p>
+    </li>
+
+    <li>
+      <p>improve shell-scripts with <em>shellcheck</em></p>
+    </li>
+
+    <li>
+      <p>improve use of "trap" in shell scripts, using a
+      script.</p>
+    </li>
+
+    <li>
+      <p>modify <tt>make-tar.sh</tt> scripts to make timestamps
+      more predictable.</p>
+    </li>
+  </ul>
+
+  <p>These are corrections to existing features:</p>
+
+  <ul>
+    <li>
+      <p>modify <tt>misc/gen-pkgconfig.in</tt> to allow for the
+      case where the library directory does not yet exist, since
+      this is processed before doing an install</p>
+    </li>
+
+    <li>
+      <p>set trailing null on string passed from <tt>winsnstr</tt>
+      to <tt>wins_nwstr</tt>.</p>
+    </li>
+
+    <li>
+      <p>modify <tt>waddch_literal</tt> to allow for double-width
+      base character when merging a combining character</p>
+    </li>
+  </ul>
+
+  <h3><a name="h3-programs" id="h3-programs">Program
+  improvements</a></h3>
+
+  <p id="h4-utilities">Several improvements were made to the
+  utility programs:</p>
+
+  <dl>
+    <dt><span class="part-name"><a href=
+    "https://invisible-island.net/ncurses/man/infocmp.1m.html">infocmp</a></span>
+    </dt>
+
+    <dd>
+      <ul>
+        <li>rewrite <tt>canonical_name</tt> function of
+        <tt>infocmp</tt> to ensure buffer size</li>
+
+        <li>improve readability of long parameterized expressions
+        with the infocmp &ldquo;<tt>-f</tt>&rdquo; option by
+        allowing split before a &ldquo;<tt>%p</tt>&rdquo;
+        marker.</li>
+
+        <li>modify verbose-option of <tt>infocmp</tt>,
+        <tt>tic</tt>, <tt>toe</tt> to enable debug-tracing if that
+        is configured.</li>
+      </ul>
+    </dd>
+
+    <dt><span class="part-name"><a href=
+    "https://invisible-island.net/ncurses/man/tabs.1.html">tabs</a></span>
+    </dt>
+
+    <dd>limit tab-stop values to max-columns</dd>
+
+    <dt><span class="part-name"><a href=
+    "https://invisible-island.net/ncurses/man/tic.1m.html">tic</a></span>
+    </dt>
+
+    <dd>add consistency check in tic for u6/u7/u8/u9 and NQ
+    capabilities.</dd>
+
+    <dt><span class="part-name"><a href=
+    "https://invisible-island.net/ncurses/man/tput.1.html">tput</a></span>
+    </dt>
+
+    <dd>corrected use of original tty-modes in <em>init/reset</em>
+    subcommands</dd>
+  </dl>
+
+  <h4><a name="h4-examples" id="h4-examples">Examples</a></h4>
+
+  <p>Along with the library and utilities, improvements were made
+  to the <a href=
+  "https://invisible-island.net/ncurses/ncurses-examples.html">ncurses-examples</a>. Most of
+  this activity aimed at improving the test-packages:</p>
+
+  <ul>
+    <li>
+      <p>add minimal <tt>-h</tt> (usage) and <tt>-V</tt> (version)
+      getopt logic to all ncurses-examples programs.</p>
+    </li>
+
+    <li>
+      <p>fix an error in "@" command in <tt>test/ncurses.c</tt>
+      F-menu</p>
+    </li>
+
+    <li>
+      <p>add curses_trace to ifdef's for <tt>START_TRACE</tt> in
+      <tt>test/test.priv.h</tt></p>
+    </li>
+
+    <li>
+      <p>improve pthread-configuration for test/worm.c</p>
+    </li>
+
+    <li>
+      <p>add <tt>setlocale</tt> call to several test-programs.</p>
+    </li>
+
+    <li>
+      <p>workaround in <tt>test/picsmap.c</tt> for use of floating
+      point for rgb values by ImageMagick 6.9.11, which appears to
+      use the wrong upper limit.</p>
+    </li>
+
+    <li>
+      <p>use static libraries for AdaCurses test-package for
+      Mageia, since no gprbuild package is available.</p>
+    </li>
+
+    <li>
+      <p>install Ada95 sample programs in libexecdir, adding a
+      wrapper script to invoke those.</p>
+    </li>
+
+    <li>
+      <p>install ncurses-examples programs in libexecdir, adding a
+      wrapper script to invoke those.</p>
+    </li>
+  </ul>
+
+  <p>There are other new demo/test programs and reusable
+  examples:</p>
+
+  <dl>
+    <dt><span class="part-name"><em>test/combine</em></span>
+    </dt>
+
+    <dd>demonstrate combining characters</dd>
+
+    <dt><span class="part-name"><em>test/test_delwin</em></span>
+    </dt>
+
+    <dd>demonstrate deleting a window</dd>
+
+    <dt><span class="part-name"><em>test/test_mouse</em></span>
+    </dt>
+
+    <dd>observe mouse events in the raw terminal or parsed ncurses
+    modes</dd>
+
+    <dt><span class="part-name"><em>test/test_unget_wch</em></span>
+    </dt>
+
+    <dd>demonstrate the unget_wch and unget functions</dd>
+  </dl>
+
+  <h3><a name="h3-database" id="h3-database">Terminal database</a></h3>
+
+  <p>There are several new terminal descriptions:</p>
+
+  <ul>
+    <li><tt><a href=
+    "https://invisible-island.net/ncurses/terminfo.src.html#tic-mosh">mosh</a></tt>
+    </li>
+
+    <li><tt><a href=
+    "https://invisible-island.net/ncurses/terminfo.src.html#tic-mosh-256color">mosh-256color</a></tt>
+    </li>
+
+    <li><tt><a href=
+    "https://invisible-island.net/ncurses/terminfo.src.html#tic-teken-16color">teken-16color</a></tt>
+    </li>
+
+    <li><tt><a href=
+    "https://invisible-island.net/ncurses/terminfo.src.html#tic-teken-sc">teken-sc</a></tt>
+    </li>
+
+    <li><tt><a href=
+    "https://invisible-island.net/ncurses/terminfo.src.html#tic-teken-vt">teken-vt</a></tt>
+    </li>
+
+    <li><tt><a href=
+    "https://invisible-island.net/ncurses/terminfo.src.html#tic-xgterm">xgterm</a></tt>
+    </li>
+  </ul>
+
+  <p>There are many changes to existing terminal descriptions. Some
+  were updates to several descriptions:</p>
+
+  <ul>
+    <li>
+      <p>make description-fields distinct</p>
+    </li>
+
+    <li>
+      <p>fix errata in description fields</p>
+    </li>
+
+    <li>
+      <p>add/use several building-blocks:</p>
+
+      <ul>
+        <li><a href=
+        "https://invisible-island.net/ncurses/terminfo.src.html#tic-aixterm_sl"><tt>aixterm+sl</tt></a></li>
+
+        <li><a href=
+        "https://invisible-island.net/ncurses/terminfo.src.html#tic-ansi_cpr"><tt>ansi+cpr</tt></a></li>
+
+        <li><a href=
+        "https://invisible-island.net/ncurses/terminfo.src.html#tic-apollo_vt132"><tt>apollo+vt132</tt></a></li>
+
+        <li><a href=
+        "https://invisible-island.net/ncurses/terminfo.src.html#tic-decid_cpr"><tt>decid+cpr</tt></a></li>
+
+        <li><a href=
+        "https://invisible-island.net/ncurses/terminfo.src.html#tic-ncr260vp_sl"><tt>ncr260vp+sl</tt></a></li>
+
+        <li><a href=
+        "https://invisible-island.net/ncurses/terminfo.src.html#tic-wyse_sl"><tt>wyse+sl</tt></a></li>
+
+        <li><a href=
+        "https://invisible-island.net/ncurses/terminfo.src.html#tic-x10term_sl"><tt>x10term+sl</tt></a></li>
+
+        <li><a href=
+        "https://invisible-island.net/ncurses/terminfo.src.html#tic-xterm_acs"><tt>xterm+acs</tt></a></li>
+
+        <li><a href=
+        "https://invisible-island.net/ncurses/terminfo.src.html#tic-xterm_alt47"><tt>xterm+alt47</tt></a></li>
+      </ul>
+    </li>
+  </ul>
+
+  <p>while others affected specific descriptions. These were
+  retested, to take into account changes by their developers:</p>
+
+  <ul>
+    <li>
+      <p><tt><a href=
+      "https://invisible-island.net/ncurses/terminfo.src.html#tic-kitty">kitty</a></tt>
+      </p>
+    </li>
+
+    <li>
+      <p><tt><a href=
+      "https://invisible-island.net/ncurses/terminfo.src.html#tic-teken">teken</a></tt>
+      </p>
+    </li>
+  </ul>
+
+  <p>while these are specific fixes based on reviewing
+  documentation, user reports, or warnings from <span class=
+  "part-name">tic</span>:</p>
+
+  <dl>
+    <dt><a href=
+    "https://invisible-island.net/ncurses/terminfo.src.html#tic-att610_cvis0">att610+cvis0</a>
+    </dt>
+
+    <dd>amended note as per documentation for att610, att620,
+    att730</dd>
+
+    <dt><a href="https://invisible-island.net/ncurses/terminfo.src.html#tic-kon">kon</a>,
+    kon2, jfbterm</dt>
+
+    <dd>revise to undo "linux2.6" change to smacs/rmacs/enacs</dd>
+
+    <dt><a href=
+    "https://invisible-island.net/ncurses/terminfo.src.html#tic-st-0_6">st-0.6</a>
+    </dt>
+
+    <dd>add dim, ecma+strikeout</dd>
+
+    <dt><a href=
+    "https://invisible-island.net/ncurses/terminfo.src.html#tic-foot_base">foot+base</a>
+    </dt>
+
+    <dd>add xterm+sl-alt</dd>
+
+    <dt><a href=
+    "https://invisible-island.net/ncurses/terminfo.src.html#tic-dec_sl">dec+sl</a>
+    </dt>
+
+    <dd>correct dsl in dec+sl</dd>
+
+    <dt><a href=
+    "https://invisible-island.net/ncurses/terminfo.src.html#tic-mintty">mintty</a> and
+    tmux</dt>
+
+    <dd>correct setal in mintty/tmux entries, add to vte-2018</dd>
+
+    <dt><a href=
+    "https://invisible-island.net/ncurses/terminfo.src.html#tic-nsterm">nsterm</a>
+    </dt>
+
+    <dd>modify nsterm to use xterm+alt1049</dd>
+
+    <dt><a href="https://invisible-island.net/ncurses/terminfo.src.html#tic-putty">putty</a>
+    </dt>
+
+    <dd>modify putty to use xterm+alt1049</dd>
+
+    <dt><a href=
+    "https://invisible-island.net/ncurses/terminfo.src.html#tic-vte-2018">vte-2018</a>
+    </dt>
+
+    <dd>add blink and setal</dd>
+  </dl>
+
+  <p>A few entries use extensions (user-defined terminal
+  capabilities):</p>
+
+  <ul>
+    <li>
+      <p>use <tt>ansi+enq</tt> and <tt>decid+cpr</tt> in cases
+      where the terminal probably supported the u6-u9 extension</p>
+    </li>
+
+    <li>
+      <p>remove u6-u9 from teken-2018</p>
+    </li>
+
+    <li>
+      <p>use <tt>NQ</tt> to flag entries where the terminal does
+      not support query and response</p>
+    </li>
+
+    <li>
+      <p>add/use <a href=
+      "https://invisible-island.net/ncurses/terminfo.src.html#tic-bracketed_paste"><tt>bracketed+paste</tt></a>
+      to help identify terminals supporting this xterm feature</p>
+    </li>
+
+    <li>
+      <p>modify samples for xterm mouse 1002/1003 modes to use 1006
+      mode, and also provide for focus in/out responses</p>
+    </li>
+
+    <li>
+      <p>xterm patch #371 supports DEC-compatible status-line. add
+      <tt>dec+sl</tt> to xterm-new, per xterm #371, add <a href=
+      "https://invisible-island.net/ncurses/terminfo.src.html#tic-xterm-p371"><tt>xterm-p371</tt></a>,
+      add <a href=
+      "https://invisible-island.net/ncurses/terminfo.src.html#tic-xterm-p370"><tt>xterm-p370</tt></a>,
+      for use in older terminals, and set &ldquo;xterm-new&rdquo;
+      to &ldquo;xterm-p370&rdquo; (to ease adoption).</p>
+    </li>
+  </ul>
+
+  <h3><a name="h3-documentation" id=
+  "h3-documentation">Documentation</a></h3>
+
+  <p>As usual, this release</p>
+
+  <ul>
+    <li>
+      <p>improves documentation by describing new features,</p>
+    </li>
+
+    <li>
+      <p>attempts to improve the description of features which
+      users have found confusing</p>
+    </li>
+
+    <li>
+      <p>fills in overlooked descriptions of features which were
+      described in the <a href="https://invisible-island.net/ncurses/NEWS.html">NEWS</a> file
+      but treated sketchily in manual pages.</p>
+    </li>
+  </ul>
+
+  <p>In addition to providing background information to explain
+  these features and show how they evolved, there are corrections,
+  clarifications, etc.:</p>
+
+  <ul>
+    <li>
+      <p>Corrections:</p>
+
+      <ul>
+        <li>
+          <p>remove a stray '/' from description of <tt>%g</tt> in
+          <a href=
+          "https://invisible-island.net/ncurses/man/terminfo.5.html#h3-Parameterized-Strings">
+          terminfo(5)</a>.</p>
+        </li>
+
+        <li>
+          <p>correct/improve font-formatting in <a href=
+          "https://invisible-island.net/ncurses/man/curs_getch.3x.html">curs_getch.3x</a>, as
+          well as other manual pages.</p>
+        </li>
+      </ul>
+    </li>
+
+    <li>
+      <p>New/improved history and portability sections:</p>
+
+      <ul>
+        <li>
+          <p>add portability notes for <a href=
+          "https://invisible-island.net/ncurses/man/curs_initscr.3x.html#h2-PORTABILITY">delscreen</a>
+          and <a href=
+          "https://invisible-island.net/ncurses/man/curs_window.3x.html#h2-PORTABILITY">delwin</a>
+          in manual.</p>
+        </li>
+
+        <li>
+          <p>improve <a href=
+          "https://invisible-island.net/ncurses/man/curs_slk.3x.html#h2-EXTENSIONS">curs_slk.3x</a>
+          discussion of extensions and portability</p>
+        </li>
+      </ul>
+    </li>
+
+    <li>
+      <p>Other improvements:</p>
+
+      <ul>
+        <li>
+          <p>improve <a href=
+          "https://invisible-island.net/ncurses/man/curs_bkgd.3x.html">curs_bkgd.3x</a>,
+          explaining that <tt>bkgdset</tt> can affect results for
+          <tt>bkgd</tt></p>
+        </li>
+
+        <li>
+          <p>add note on portable memory-leak checking in <a href=
+          "https://invisible-island.net/ncurses/man/curs_memleaks.3x.html#h2-PORTABILITY">curs_memleaks.3x</a></p>
+        </li>
+
+        <li>
+          <p>expanded description in <a href=
+          "https://invisible-island.net/ncurses/man/resizeterm.3x.html">resizeterm.3x</a></p>
+        </li>
+
+        <li>
+          <p>add section on releasing memory to <a href=
+          "https://invisible-island.net/ncurses/man/curs_termcap.3x.html#h3-Releasing-Memory">
+          curs_termcap.3x</a> and <a href=
+          "https://invisible-island.net/ncurses/man/curs_terminfo.3x.html#h3-Releasing-Memory">
+          curs_terminfo.3x</a> manpages.</p>
+        </li>
+
+        <li>
+          <p>add clarification of the scope of dynamic variables in
+          <a href=
+          "https://invisible-island.net/ncurses/man/terminfo.5.html">terminfo(5)</a>.</p>
+        </li>
+
+        <li>
+          <p>improve formatting of <a href=
+          "https://invisible-island.net/ncurses/ncurses-intro.html">ncurses-intro.html</a>
+          and <a href=
+          "https://invisible-island.net/ncurses/hackguide.html">hackguide.html</a></p>
+        </li>
+
+        <li>
+          <p>improve <a href=
+          "https://invisible-island.net/ncurses/man/curs_clear.3x.html">curs_clear.3x</a>
+          links to other pages</p>
+        </li>
+
+        <li>
+          <p>update <a href=
+          "https://invisible-island.net/ncurses/howto/NCURSES-Programming-HOWTO.html">ncurses-howto</a>,
+          making documentation fixes along with corrections to
+          example programs.</p>
+        </li>
+
+        <li>
+          <p>use newer version 1.36 of gnathtml for generating Ada
+          html files.</p>
+        </li>
+
+        <li>
+          <p>update external links in <a href=
+          "https://invisible-island.net/ncurses/Ada95.html">Ada95.html</a></p>
+        </li>
+      </ul>
+    </li>
+  </ul>
+
+  <p>There are no new manual pages (all of the manual page updates
+  are to existing pages).</p>
+
+  <h3><a name="h3-bug-fixes" id="h3-bug-fixes">Interesting
+  bug-fixes</a></h3>
+
+  <p>While there were many bugs fixed during development of ncurses
+  6.4, only a few (the reason for this release) were both important
+  and interesting. Most of the bug-fixes were for local issues
+  which did not affect compatibility across releases. Since those
+  are detailed in the <a href=
+  "https://invisible-island.net/ncurses/NEWS.html#t20221231">NEWS</a> file no elaboration is
+  needed here.</p>
+
+  <p>The interesting bugs were those dealing with memory leaks and
+  buffer overflows. Although the utilities are designed for
+  <em>text</em> files (which they do properly), some choose to test
+  them with <strong>non-</strong><em>text</em> files.</p>
+
+  <ul>
+    <li>
+      <p>Text files contain no embedded nulls. Also, they end with
+      a newline. Feeding <strong>tic</strong> non-text files
+      exposed a few cases where the program did not check for those
+      issues. As a result, further processing of the input found
+      limit-checks whose assumptions were invalid.</p>
+    </li>
+
+    <li>
+      <p>Fixing the limit-checks (first) found a problem with
+      <strong>tic</strong> managing the list of strings in a
+      terminal description. In merging two terminal descriptions
+      (i.e., the &ldquo;use=&rdquo; feature), <strong>tic</strong>
+      was not allocating a complete copy. A quick repair for that
+      introduced a memory leak.</p>
+    </li>
+
+    <li>
+      <p>The checks for non-text files are improved (i.e., embedded
+      nulls in the input file will cause <strong>tic</strong> to
+      reject it rather than attempting to process it).</p>
+    </li>
+
+    <li>
+      <p>The string allocations in <strong>tic</strong> are
+      likewise improved.</p>
+    </li>
+  </ul>
+
+  <h3><a name="h3-config-config" id=
+  "h3-config-config">Configuration changes</a></h3>
+
+  <h4><a name="h4-config-major" id="h4-config-major">Major
+  changes</a></h4>
+
+  <p>There are no major changes. No new options were added. Several
+  improvements were made to configure checks.</p>
+
+  <h4><a name="h4-config-options" id=
+  "h4-config-options">Configuration options</a></h4>
+
+  <p>There are a few new/modified configure options:</p>
+
+  <dl>
+    <dt><tt>--with-abi-version</tt>
+    </dt>
+
+    <dd>
+      <p>add ABI 7 defaults to configure script.</p>
+    </dd>
+
+    <dt><tt>--with-caps</tt>
+    </dt>
+
+    <dd>
+      <p>add warning in configure script if file specified for
+      &ldquo;<tt>--with-caps</tt>&rdquo; does not exist.</p>
+    </dd>
+
+    <dt><tt>--with-manpage-format</tt>
+    </dt>
+
+    <dd>
+      <p>bzip2 and xz compression are now supported</p>
+    </dd>
+
+    <dt><tt>--with-xterm-kbs</tt>
+    </dt>
+
+    <dd>
+      <p>add check/warning in configure script if option
+      &ldquo;<tt>--with-xterm-kbs</tt>&rdquo; is missing or
+      inconsistent</p>
+    </dd>
+  </dl>
+
+  <h3><a name="h3-portability" id="h3-portability">Portability</a></h3>
+
+  <p>Many of the portability changes are implemented via the
+  configure script:</p>
+
+  <ul>
+    <li>
+      <p>amend configure option's auto-search to account for
+      systems where none of the directories known to
+      <em>pkg-config</em> exist</p>
+    </li>
+
+    <li>
+      <p>corrected regex needed for older <em>pkg-config</em> used
+      in Solaris 10</p>
+    </li>
+
+    <li>
+      <p>improve handling of <tt>--with-pkg-config-libdir</tt>
+      option, allowing for the case where either
+      <tt>$PKG_CONFIG_LIBDIR</tt> or the option value has a
+      colon-separated list of directories</p>
+    </li>
+
+    <li>
+      <p>if the <tt>--with-pkg-config-libdir</tt> option is not
+      given, use <tt>${libdir}/pkgconfig</tt> as a default</p>
+    </li>
+
+    <li>
+      <p>improve search-path check for <em>pkg-config</em>, e.g.,
+      for Debian testing which installs <em>pkg-config</em> with
+      architecture-prefixes.</p>
+    </li>
+
+    <li>
+      <p>build-fix for cross-compiling to MingW, conditionally add
+      <tt>-lssp</tt></p>
+    </li>
+
+    <li>
+      <p>improve configure check for <tt>getttynam</tt></p>
+    </li>
+
+    <li>
+      <p>fixes to build with <em>dietlibc</em>:</p>
+
+      <ul>
+        <li>add configure check for <tt>fpathconf</tt></li>
+
+        <li>add configure check for math sine/cosine, needed in
+        test/tclock, and eliminate <tt>pow()</tt> from
+        test/hanoi</li>
+
+        <li>use <tt>wcsnlen</tt> as an alternative to
+        <tt>wmemchr</tt> if it is not found</li>
+      </ul>
+    </li>
+
+    <li>
+      <p>modify configure macro <tt>CF_BUILD_CC</tt> to check if
+      the build-compiler works, rather than that it is different
+      from the cross-compiler, e.g., to accommodate a compiler
+      which can be used for either purpose with different flags</p>
+    </li>
+
+    <li>
+      <p>modify configure/scripts to work around interference by
+      GNU grep 3.8</p>
+    </li>
+  </ul>
+
+  <p>Here are some of the other portability fixes:</p>
+
+  <ul>
+    <li>
+      <p>change <tt>man_db.renames</tt> to template, to handle
+      <em>ncurses*-config</em> script with the
+      <tt>--extra-suffix</tt> configure option.</p>
+    </li>
+
+    <li>
+      <p>update <tt>CF_XOPEN_SOURCE</tt> macro, adding variants
+      &ldquo;gnueabi" and &ldquo;gnueabihf" to get
+      <tt>_DEFAULT_SOURCE</tt> special case, as well as adding GNU
+      libc suffixes for &ldquo;abi64&rdquo;, &ldquo;abin32&rdquo;,
+      &ldquo;x32&rdquo; to distinguish it from other libc
+      flavors.</p>
+    </li>
+
+    <li>
+      <p>work around <em>musl</em>'s nonstandard use of feature
+      test macros by adding a definition for
+      <tt>NCURSES_WIDECHAR</tt> to the generated &ldquo;.pc&rdquo;
+      and <em><tt>*-config</tt></em> files.</p>
+    </li>
+
+    <li>
+      <p>use &ldquo;<tt>command -v</tt>&rdquo; rather than
+      &ldquo;<tt>type</tt>&rdquo; in <tt>Ada95/gen/Makefile.in</tt>
+      to fix a portability issue.</p>
+    </li>
+  </ul>
+
+  <hr>
+
+  <h2><a name="h2-features" id="h2-features">Features of
+  <span class="main-name">ncurses</span></a></h2>
+
+  <p>The <span class="main-name">ncurses</span> package is fully
+  upward-compatible with SVr4 (System V Release 4) curses:</p>
+
+  <ul>
+    <li>
+      <p>All of the SVr4 calls have been implemented (and are
+      documented).</p>
+    </li>
+
+    <li>
+      <p><span class="main-name">ncurses</span> supports all of the
+      for SVr4 curses features including keyboard mapping, color,
+      forms-drawing with ACS characters, and automatic recognition
+      of keypad and function keys.</p>
+    </li>
+
+    <li>
+      <p><span class="main-name">ncurses</span> provides these SVr4
+      add-on libraries (not part of X/Open Curses):</p>
+
+      <ul>
+        <li>
+          <p>the panels library, supporting a stack of windows with
+          backing store.</p>
+        </li>
+
+        <li>
+          <p>the menus library, supporting a uniform but flexible
+          interface for menu programming.</p>
+        </li>
+
+        <li>
+          <p>the form library, supporting data collection through
+          on-screen forms.</p>
+        </li>
+      </ul>
+    </li>
+
+    <li>
+      <p><span class="main-name">ncurses</span>'s terminal database
+      is fully compatible with that used by SVr4 curses.</p>
+
+      <ul>
+        <li>
+          <p><span class="main-name">ncurses</span> supports
+          user-defined capabilities which it can see, but which are
+          hidden from SVr4 curses applications using the
+          <em>same</em> terminal database.</p>
+        </li>
+
+        <li>
+          <p>It can be optionally configured to match the format
+          used in related systems such as AIX and Tru64.</p>
+        </li>
+
+        <li>
+          <p>Alternatively, <span class="main-name">ncurses</span>
+          can be configured to use hashed databases rather than the
+          directory of files used by SVr4 curses.</p>
+        </li>
+      </ul>
+    </li>
+
+    <li>
+      <p>The <span class="main-name">ncurses</span> utilities have
+      options to allow you to filter terminfo entries for use with
+      less capable <em>curses</em>/<em>terminfo</em> versions such
+      as the HP-UX and AIX ports.</p>
+    </li>
+  </ul>
+
+  <p>The <span class="main-name">ncurses</span> package also has
+  many useful extensions over SVr4:</p>
+
+  <ul>
+    <li>
+      <p>The API is 8-bit clean and base-level conformant with the
+      X/OPEN curses specification, XSI curses (that is, it
+      implements all <em>BASE</em> level features, and most
+      <em>EXTENDED</em> features). It includes many function calls
+      not supported under SVr4 curses (but portability of all calls
+      is documented so you can use the SVr4 subset only).</p>
+    </li>
+
+    <li>
+      <p>Unlike SVr3 curses, <span class="main-name">ncurses</span>
+      can write to the rightmost-bottommost corner of the screen if
+      your terminal has an insert-character capability.</p>
+    </li>
+
+    <li>
+      <p>Ada95 and C++ bindings.</p>
+    </li>
+
+    <li>
+      <p>Support for mouse event reporting with X Window xterm and
+      FreeBSD and OS/2 console windows.</p>
+    </li>
+
+    <li>
+      <p>Extended mouse support via Alessandro Rubini's gpm
+      package.</p>
+    </li>
+
+    <li>
+      <p>The function <code>wresize</code> allows you to resize
+      windows, preserving their data.</p>
+    </li>
+
+    <li>
+      <p>The function <code>use_default_colors</code> allows you to
+      use the terminal's default colors for the default color pair,
+      achieving the effect of transparent colors.</p>
+    </li>
+
+    <li>
+      <p>The functions <code>keyok</code> and
+      <code>define_key</code> allow you to better control the use
+      of function keys, e.g., disabling the <span class=
+      "main-name">ncurses</span> KEY_MOUSE, or by defining more
+      than one control sequence to map to a given key code.</p>
+    </li>
+
+    <li>
+      <p>Support for direct-color terminals, such as modern
+      xterm.</p>
+    </li>
+
+    <li>
+      <p>Support for 256-color terminals, such as modern xterm.</p>
+    </li>
+
+    <li>
+      <p>Support for 16-color terminals, such as <em>aixterm</em>
+      and <em>modern xterm</em>.</p>
+    </li>
+
+    <li>
+      <p>Better cursor-movement optimization. The package now
+      features a cursor-local-movement computation more efficient
+      than either BSD's or System V's.</p>
+    </li>
+
+    <li>
+      <p>Super hardware scrolling support. The screen-update code
+      incorporates a novel, simple, and cheap algorithm that
+      enables it to make optimal use of hardware scrolling,
+      line-insertion, and line-deletion for screen-line movements.
+      This algorithm is more powerful than the 4.4BSD curses
+      <code>quickch</code> routine.</p>
+    </li>
+
+    <li>
+      <p>Real support for terminals with the magic-cookie glitch.
+      The screen-update code will refrain from drawing a highlight
+      if the magic- cookie unattributed spaces required just before
+      the beginning and after the end would step on a non-space
+      character. It will automatically shift highlight boundaries
+      when doing so would make it possible to draw the highlight
+      without changing the visual appearance of the screen.</p>
+    </li>
+
+    <li>
+      <p>It is possible to generate the library with a list of
+      pre-loaded fallback entries linked to it so that it can serve
+      those terminal types even when no terminfo tree or termcap
+      file is accessible (this may be useful for support of
+      screen-oriented programs that must run in single-user
+      mode).</p>
+    </li>
+
+    <li>
+      <p>The <a href="https://invisible-island.net/ncurses/man/tic.1m.html"><span class=
+      "part-name">tic</span></a>/<a href=
+      "https://invisible-island.net/ncurses/man/captoinfo.1m.html">captoinfo</a> utility
+      provided with <span class="main-name">ncurses</span> has the
+      ability to translate many termcaps from the XENIX, IBM and
+      AT&amp;T extension sets.</p>
+    </li>
+
+    <li>
+      <p>A BSD-like <a href=
+      "https://invisible-island.net/ncurses/man/tset.1.html"><span class=
+      "part-name">tset</span></a> utility is provided.</p>
+    </li>
+
+    <li>
+      <p>The <span class="main-name">ncurses</span> library and
+      utilities will automatically read terminfo entries from
+      $HOME/.terminfo if it exists, and compile to that directory
+      if it exists and the user has no write access to the system
+      directory. This feature makes it easier for users to have
+      personal terminfo entries without giving up access to the
+      system terminfo directory.</p>
+    </li>
+
+    <li>
+      <p>You may specify a path of directories to search for
+      compiled descriptions with the environment variable
+      TERMINFO_DIRS (this generalizes the feature provided by
+      TERMINFO under stock System V.)</p>
+    </li>
+
+    <li>
+      <p>In terminfo source files, use capabilities may refer not
+      just to other entries in the same source file (as in System
+      V) but also to compiled entries in either the system terminfo
+      directory or the user's $HOME/.terminfo directory.</p>
+    </li>
+
+    <li>
+      <p>The table-of-entries utility <a href=
+      "https://invisible-island.net/ncurses/man/toe.1m.html"><span class=
+      "part-name">toe</span></a> makes it easy for users to see
+      exactly what terminal types are available on the system.</p>
+    </li>
+
+    <li>
+      <p>The library meets the XSI requirement that every macro
+      entry point has a corresponding function which may be linked
+      (and will be prototype-checked) if the macro definition is
+      disabled with <code>#undef</code>.</p>
+    </li>
+
+    <li>
+      <p>Extensive documentation is provided (see the <em><a href=
+      "https://invisible-island.net/ncurses/ncurses.faq.html#additional_reading">Additional
+      Reading</a></em> section of the <em><a href=
+      "https://invisible-island.net/ncurses/ncurses.faq.html"><span class=
+      "main-name">ncurses</span> FAQ</a></em> for online
+      documentation).</p>
+    </li>
+  </ul>
+
+  <h2><a name="h2-who-uses" id="h2-who-uses">Applications using
+  <span class="main-name">ncurses</span></a></h2>
+
+  <p>The <span class="main-name">ncurses</span> distribution
+  includes a selection of test programs (including a few games).
+  These are available separately as <a href=
+  "https://invisible-island.net/ncurses/ncurses-examples.html">ncurses-examples</a></p>
+
+  <p>The ncurses library has been tested with a wide variety of
+  applications including:</p>
+
+  <blockquote>
+    <dl>
+      <dt><span class="part-name">aptitude</span>
+      </dt>
+
+      <dd>
+        <p>FrontEnd to Apt, the debian package manager</p>
+
+        <p><a href=
+        "https://wiki.debian.org/Aptitude">https://wiki.debian.org/Aptitude</a></p>
+      </dd>
+
+      <dt><span class="part-name">cdk</span>
+      </dt>
+
+      <dd>
+        <p>Curses Development Kit</p>
+
+        <p><a href="https://invisible-island.net/cdk/">https://invisible-island.net/cdk/</a><br>
+        </p>
+      </dd>
+
+      <dt><span class="part-name">ded</span>
+      </dt>
+
+      <dd>
+        <p>directory-editor</p>
+
+        <p><a href="https://invisible-island.net/ded/">https://invisible-island.net/ded/</a></p>
+      </dd>
+
+      <dt><span class="part-name">dialog</span>
+      </dt>
+
+      <dd>
+        <p>the underlying application used in Slackware's setup,
+        and the basis for similar install/configure applications on
+        many systems.</p>
+
+        <p><a href="https://invisible-island.net/dialog/">https://invisible-island.net/dialog/</a></p>
+      </dd>
+
+      <dt><span class="part-name">lynx</span>
+      </dt>
+
+      <dd>
+        <p>the text WWW browser</p>
+
+        <p><a href=
+        "https://lynx.invisible-island.net/">https://lynx.invisible-island.net/</a></p>
+      </dd>
+
+      <dt><span class="part-name">mutt</span>
+      </dt>
+
+      <dd>
+        <p>mail utility</p>
+
+        <p><a href="http://www.mutt.org/">http://www.mutt.org/</a></p>
+      </dd>
+
+      <dt><span class="part-name">ncftp</span>
+      </dt>
+
+      <dd>
+        <p>file-transfer utility</p>
+
+        <p><a href=
+        "https://www.ncftp.com/">https://www.ncftp.com/</a></p>
+      </dd>
+
+      <dt><span class="part-name">nvi</span>
+      </dt>
+
+      <dd>
+        <p>New vi uses ncurses.</p>
+
+        <p><a href=
+        "https://sites.google.com/a/bostic.com/keithbostic/vi">https://sites.google.com/a/bostic.com/keithbostic/vi</a><br>
+
+        </p>
+      </dd>
+
+      <dt><span class="part-name">ranger</span>
+      </dt>
+
+      <dd>
+        <p>A console file manager with VI key bindings in
+        <em>Python</em>.</p>
+
+        <p><a href=
+        "https://ranger.github.io/">https://ranger.github.io/</a></p>
+      </dd>
+
+      <dt><span class="part-name">tin</span>
+      </dt>
+
+      <dd>
+        <p>newsreader, supporting color, MIME</p>
+
+        <p><a href="http://www.tin.org/">http://www.tin.org/</a></p>
+      </dd>
+
+      <dt><span class="part-name">vifm</span>
+      </dt>
+
+      <dd>
+        <p>File manager with vi like keybindings</p>
+
+        <p><a href="https://vifm.info/">https://vifm.info/</a></p>
+      </dd>
+    </dl>
+  </blockquote>
+
+  <p>as well as some that use <span class=
+  "main-name">ncurses</span> for the terminfo support alone:</p>
+
+  <blockquote>
+    <dl>
+      <dt><span class="part-name">minicom</span>
+      </dt>
+
+      <dd>
+        <p>terminal emulator for serial modem connections</p>
+
+        <p><a href=
+        "https://alioth.debian.org/projects/minicom/">https://alioth.debian.org/projects/minicom/</a></p>
+      </dd>
+
+      <dt><span class="part-name">mosh</span>
+      </dt>
+
+      <dd>
+        <p>a replacement for <code>ssh</code>.</p>
+
+        <p><a href="https://mosh.org/">https://mosh.org/</a></p>
+      </dd>
+
+      <dt><span class="part-name">tack</span>
+      </dt>
+
+      <dd>
+        <p>terminfo action checker</p>
+
+        <p><a href="https://invisible-island.net/ncurses/tack.html">https://invisible-island.net/ncurses/tack.html</a></p>
+      </dd>
+
+      <dt><span class="part-name">tmux</span>
+      </dt>
+
+      <dd>
+        <p>terminal multiplexor</p>
+
+        <p><a href=
+        "https://github.com/tmux/tmux/wiki">https://github.com/tmux/tmux/wiki</a></p>
+      </dd>
+
+      <dt><span class="part-name">vile</span>
+      </dt>
+
+      <dd>
+        <p><em>vi-like-emacs</em> may be built to use the terminfo,
+        termcap or curses interfaces.</p>
+
+        <p><a href="https://invisible-island.net/vile/">https://invisible-island.net/vile/</a></p>
+      </dd>
+    </dl>
+  </blockquote>
+
+  <p>and finally, those which use only the termcap interface:</p>
+
+  <blockquote>
+    <dl>
+      <dt><span class="part-name">emacs</span>
+      </dt>
+
+      <dd>
+        <p>text editor</p>
+
+        <p><a href=
+        "https://www.gnu.org/software/emacs/">https://www.gnu.org/software/emacs/</a></p>
+      </dd>
+
+      <dt><span class="part-name">less</span>
+      </dt>
+
+      <dd>
+        <p>The most commonly used <em>pager</em> (a program that
+        displays text files).</p>
+
+        <p><a href=
+        "http://www.greenwoodsoftware.com/less/">http://www.greenwoodsoftware.com/less/</a></p>
+      </dd>
+
+      <dt><span class="part-name">screen</span>
+      </dt>
+
+      <dd>
+        <p>terminal multiplexor</p>
+
+        <p><a href=
+        "https://www.gnu.org/software/screen/">https://www.gnu.org/software/screen/</a></p>
+      </dd>
+
+      <dt><span class="part-name">vim</span>
+      </dt>
+
+      <dd>
+        <p>text editor</p>
+
+        <p><a href="https://www.vim.org/">https://www.vim.org/</a></p>
+      </dd>
+    </dl>
+  </blockquote>
+
+  <h2><a name="h2-development" id="h2-development">Development
+  activities</a></h2>
+
+  <p>Zeyd Ben-Halim started <span class="main-name">ncurses</span>
+  from a previous package pcurses, written by Pavel Curtis. Eric S.
+  Raymond continued development. J&uuml;rgen Pfeifer wrote most of
+  the form and menu libraries.</p>
+
+  <p>Ongoing development work is done by <a href=
+  "mailto:dickey@invisible-island.net">Thomas E. Dickey</a>. Thomas
+  E. Dickey has acted as the maintainer for the Free Software
+  Foundation, which held a <a href=
+  "https://invisible-island.net/ncurses/ncurses-license.html">copyright on ncurses</a> for
+  releases 4.2 through 6.1. Following the release of ncurses 6.1,
+  effective as of release 6.2, copyright for ncurses reverted to
+  Thomas E. Dickey (see the <a href=
+  "https://invisible-island.net/ncurses/ncurses.faq.html#relicensed">ncurses FAQ</a> for
+  additional information).</p>
+
+  <p>Contact the current maintainers at</p>
+
+  <blockquote>
+    <a href="mailto:bug-ncurses@gnu.org">bug-ncurses@gnu.org</a>
+  </blockquote>
+
+  <p>To join the ncurses mailing list, please write email to</p>
+
+  <blockquote>
+    <a href=
+    "mailto:bug-ncurses-request@gnu.org">bug-ncurses-request@gnu.org</a>
+  </blockquote>
+  containing the line:
+  <blockquote>
+    <p><code>subscribe</code>
+    <em>&lt;name&gt;@&lt;host.domain&gt;</em></p>
+  </blockquote>
+
+  <p>This list is open to anyone interested in helping with the
+  development and testing of this package.</p>
+
+  <p>Beta versions of <span class="main-name">ncurses</span> are
+  made available at</p>
+
+  <blockquote>
+    <p><a href=
+    "https://invisible-island.net/archives/ncurses/current/">https://invisible-island.net/archives/ncurses/current/</a>
+    and<br>
+    <a href=
+    "https://invisible-mirror.net/archives/ncurses/current/">https://invisible-mirror.net/archives/ncurses/current/</a>&nbsp;.</p>
+  </blockquote>
+
+  <p>Patches to the current release are made available at</p>
+
+  <blockquote>
+    <p><a href=
+    "https://invisible-island.net/archives/ncurses/6.3/">https://invisible-island.net/archives/ncurses/6.3/</a>
+    and<br>
+    <a href=
+    "https://invisible-mirror.net/archives/ncurses/6.3/">https://invisible-mirror.net/archives/ncurses/6.3/</a>&nbsp;.</p>
+  </blockquote>
+
+  <p>There is an archive of the mailing list here:</p>
+
+  <blockquote>
+    <p><a href=
+    "http://lists.gnu.org/archive/html/bug-ncurses">http://lists.gnu.org/archive/html/bug-ncurses</a>
+    (also <a href=
+    "https://lists.gnu.org/archive/html/bug-ncurses">https</a>)</p>
+  </blockquote>
+
+  <h2><a name="h2-this-stuff" id="h2-this-stuff">Related
+  resources</a></h2>
+
+  <p>The release notes make scattered references to these pages,
+  which may be interesting by themselves:</p>
+
+  <ul>
+    <li><a href="https://invisible-island.net/ncurses/ncurses-license.html"><span class=
+    "main-name">ncurses</span> licensing</a></li>
+
+    <li><a href="https://invisible-island.net/ncurses/ncurses-mapsyms.html">Symbol versioning
+    in <span class="main-name">ncurses</span></a></li>
+
+    <li><a href="https://invisible-island.net/ncurses/ncurses-slang.html">Comments on
+    <span class="main-name">ncurses</span> versus <span class=
+    "main-name">slang</span> (S-Lang)</a></li>
+
+    <li><a href="https://invisible-island.net/ncurses/ncurses-openbsd.html">Comments on
+    <span class="main-name">OpenBSD</span></a></li>
+
+    <li><a href="https://invisible-island.net/ncurses/tack.html">tack &ndash; terminfo action
+    checker</a></li>
+
+    <li><a href="https://invisible-island.net/ncurses/tctest.html">tctest &ndash; termcap
+    library checker</a></li>
+
+    <li><a href=
+    "https://invisible-island.net/ncurses/ncurses.html#download_database">Terminal
+    Database</a></li>
+  </ul>
+
+  <h2><a name="h2-other-stuff" id="h2-other-stuff">Other
+  resources</a></h2>
+
+  <p>The distribution provides a newer version of the
+  terminfo-format terminal description file once maintained by
+  <a href="http://www.catb.org/~esr/terminfo/">Eric
+  Raymond</a>&nbsp;. Unlike the older version, the termcap and
+  terminfo data are provided in the same file, which also provides
+  several user-definable extensions beyond the X/Open
+  specification.</p>
+
+  <p>You can find lots of information on terminal-related topics
+  not covered in the terminfo file at <a href=
+  "http://web.archive.org/web/*/http://www.cs.utk.edu/~shuford/terminal">
+  Richard Shuford's archive</a>&nbsp;. The collection of computer
+  manuals at <a href=
+  "http://www.bitsavers.org/pdf/">bitsavers.org</a> has also been
+  useful.</p>
+
+  <div class="nav">
+    <ul>
+      <li><a href="#h2-overview">Overview</a></li>
+
+      <li>
+        <a href="#h2-release-notes">Release Notes</a>
+        <ul>
+          <li>
+            <a href="#h3-library">Library improvements</a>
+            <ul>
+              <li><a href="#h4-new-library">New features</a></li>
+
+              <li><a href="#h4-fixes-library">Other
+              improvements</a></li>
+            </ul>
+          </li>
+
+          <li>
+            <a href="#h3-programs">Program improvements</a>
+            <ul>
+              <li><a href="#h4-utilities">Utilities</a></li>
+
+              <li><a href="#h4-examples">Examples</a></li>
+            </ul>
+          </li>
+
+          <li><a href="#h3-database">Terminal database</a></li>
+
+          <li><a href="#h3-documentation">Documentation</a></li>
+
+          <li><a href="#h3-bug-fixes">Interesting bug-fixes</a></li>
+
+          <li>
+            <a href="#h3-config-config">Configuration changes</a>
+            <ul>
+              <li><a href="#h4-config-major">Major changes</a></li>
+
+              <li><a href="#h4-config-options">Configuration
+              options</a></li>
+            </ul>
+          </li>
+
+          <li><a href="#h3-portability">Portability</a></li>
+        </ul>
+      </li>
+
+      <li><a href="#h2-features">Features of <span class=
+      "main-name">ncurses</span></a></li>
+
+      <li><a href="#h2-who-uses">Applications using <span class=
+      "main-name">ncurses</span></a></li>
+
+      <li><a href="#h2-development">Development activities</a></li>
+
+      <li><a href="#h2-this-stuff">Related resources</a></li>
+
+      <li><a href="#h2-other-stuff">Other resources</a></li>
+    </ul>
+  </div>
+</body>
+</html>
diff --git a/doc/html/hackguide.html b/doc/html/hackguide.html
new file mode 100644
index 0000000..2b94455
--- /dev/null
+++ b/doc/html/hackguide.html
@@ -0,0 +1,962 @@
+<!--
+  $Id: hackguide.html,v 1.36 2022/11/26 19:31:56 tom Exp $
+  ****************************************************************************
+  * Copyright 2019-2020,2022 Thomas E. Dickey                                *
+  * Copyright 2000-2013,2017 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.                                                           *
+  ****************************************************************************
+-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+  <meta name="generator" content=
+  "HTML Tidy for HTML5 for Linux version 5.6.0">
+  <title>A Hacker's Guide to Ncurses Internals</title>
+  <link rel="author" href="mailto:bugs-ncurses@gnu.org">
+  <meta http-equiv="Content-Type" content=
+  "text/html; charset=us-ascii"><!--
+This document is self-contained, *except* that there is one relative link to
+the ncurses-intro.html document, expected to be in the same directory with
+this one.
+-->
+</head>
+<body>
+  <h1 class="no-header">A Hacker's Guide to NCURSES</h1>
+
+  <h2>A Hacker's Guide to NCURSES</h2>
+
+  <div class="nav">
+    <h2>Contents</h2>
+
+    <ul>
+      <li><a href="#abstract">Abstract</a></li>
+
+      <li>
+        <a href="#objective">Objective of the Package</a>
+        <ul>
+          <li><a href="#whysvr4">Why System V Curses?</a></li>
+
+          <li><a href="#extensions">How to Design Extensions</a></li>
+        </ul>
+      </li>
+
+      <li><a href="#portability">Portability and Configuration</a></li>
+
+      <li><a href="#documentation">Documentation Conventions</a></li>
+
+      <li><a href="#bugtrack">How to Report Bugs</a></li>
+
+      <li>
+        <a href="#ncurslib">A Tour of the Ncurses Library</a>
+        <ul>
+          <li><a href="#loverview">Library Overview</a></li>
+
+          <li><a href="#engine">The Engine Room</a></li>
+
+          <li><a href="#input">Keyboard Input</a></li>
+
+          <li><a href="#mouse">Mouse Events</a></li>
+
+          <li><a href="#output">Output and Screen Updating</a></li>
+        </ul>
+      </li>
+
+      <li><a href="#fmnote">The Forms and Menu Libraries</a></li>
+
+      <li>
+        <a href="#tic">A Tour of the Terminfo Compiler</a>
+        <ul>
+          <li><a href="#nonuse">Translation of
+          Non-<strong>use</strong> Capabilities</a></li>
+
+          <li><a href="#uses">Use Capability Resolution</a></li>
+
+          <li><a href="#translation">Source-Form Translation</a></li>
+        </ul>
+      </li>
+
+      <li><a href="#utils">Other Utilities</a></li>
+
+      <li><a href="#style">Style Tips for Developers</a></li>
+
+      <li><a href="#port">Porting Hints</a></li>
+    </ul>
+  </div>
+
+  <h2><a name="abstract" id="abstract">Abstract</a></h2>
+
+  <p>This document is a hacker's tour of the
+  <strong>ncurses</strong> library and utilities. It discusses
+  design philosophy, implementation methods, and the conventions
+  used for coding and documentation. It is recommended reading for
+  anyone who is interested in porting, extending or improving the
+  package.</p>
+
+  <h2><a name="objective" id="objective">Objective of the
+  Package</a></h2>
+
+  <p>The objective of the <strong>ncurses</strong> package is to
+  provide a free software API for character-cell terminals and
+  terminal emulators with the following characteristics:</p>
+
+  <ul>
+    <li>Source-compatible with historical curses implementations
+    (including the original BSD curses and System V curses.</li>
+
+    <li>Conformant with the XSI Curses standard issued as part of
+    XPG4 by X/Open.</li>
+
+    <li>High-quality &mdash; stable and reliable code, wide
+    portability, good packaging, superior documentation.</li>
+
+    <li>Featureful &mdash; should eliminate as much of the drudgery
+    of C interface programming as possible, freeing programmers to
+    think at a higher level of design.</li>
+  </ul>
+
+  <p>These objectives are in priority order. So, for example,
+  source compatibility with older version must trump featurefulness
+  &mdash; we cannot add features if it means breaking the portion
+  of the API corresponding to historical curses versions.</p>
+
+  <h3><a name="whysvr4" id="whysvr4">Why System V Curses?</a></h3>
+
+  <p>We used System V curses as a model, reverse-engineering their
+  API, in order to fulfill the first two objectives.</p>
+
+  <p>System V curses implementations can support BSD curses
+  programs with just a recompilation, so by capturing the System V
+  API we also capture BSD's.</p>
+
+  <p>More importantly for the future, the XSI Curses standard
+  issued by X/Open is explicitly and closely modeled on System V.
+  So conformance with System V took us most of the way to
+  base-level XSI conformance.</p>
+
+  <h3><a name="extensions" id="extensions">How to Design
+  Extensions</a></h3>
+
+  <p>The third objective (standards conformance) requires that it
+  be easy to condition source code using <strong>ncurses</strong>
+  so that the absence of nonstandard extensions does not break the
+  code.</p>
+
+  <p>Accordingly, we have a policy of associating with each
+  nonstandard extension a feature macro, so that ncurses client
+  code can use this macro to condition in or out the code that
+  requires the <strong>ncurses</strong> extension.</p>
+
+  <p>For example, there is a macro
+  <code>NCURSES_MOUSE_VERSION</code> which XSI Curses does not
+  define, but which is defined in the <strong>ncurses</strong>
+  library header. You can use this to condition the calls to the
+  mouse API calls.</p>
+
+  <h2><a name="portability" id="portability">Portability and
+  Configuration</a></h2>
+
+  <p>Code written for <strong>ncurses</strong> may assume an
+  ANSI-standard C compiler and POSIX-compatible OS interface. It
+  may also assume the presence of a System-V-compatible
+  <em>select(2)</em> call.</p>
+
+  <p>We encourage (but do not require) developers to make the code
+  friendly to less-capable UNIX environments wherever possible.</p>
+
+  <p>We encourage developers to support OS-specific optimizations
+  and methods not available under POSIX/ANSI, provided only
+  that:</p>
+
+  <ul>
+    <li>All such code is properly conditioned so the build process
+    does not attempt to compile it under a plain ANSI/POSIX
+    environment.</li>
+
+    <li>Adding such implementation methods does not introduce
+    incompatibilities in the <strong>ncurses</strong> API between
+    platforms.</li>
+  </ul>
+
+  <p>We use GNU <code>autoconf(1)</code> as a tool to deal with
+  portability issues. The right way to leverage an OS-specific
+  feature is to modify the autoconf specification files
+  (configure.in and aclocal.m4) to set up a new feature macro,
+  which you then use to condition your code.</p>
+
+  <h2><a name="documentation" id="documentation">Documentation
+  Conventions</a></h2>
+
+  <p>There are three kinds of documentation associated with this
+  package. Each has a different preferred format:</p>
+
+  <ul>
+    <li>Package-internal files (README, INSTALL, TO-DO etc.)</li>
+
+    <li>Manual pages.</li>
+
+    <li>Everything else (i.e., narrative documentation).</li>
+  </ul>
+
+  <p>Our conventions are simple:</p>
+
+  <ol>
+    <li><strong>Maintain package-internal files in plain
+    text.</strong> The expected viewer for them is <em>more(1)</em> or
+    an editor window; there is no point in elaborate mark-up.</li>
+
+    <li><strong>Mark up manual pages in the man macros.</strong>
+    These have to be viewable through traditional <em>man(1)</em>
+    programs.</li>
+
+    <li><strong>Write everything else in HTML.</strong>
+    </li>
+  </ol>
+
+  <p>When in doubt, HTMLize a master and use <em>lynx(1)</em> to
+  generate plain ASCII (as we do for the announcement
+  document).</p>
+
+  <p>The reason for choosing HTML is that it is (a) well-adapted
+  for on-line browsing through viewers that are everywhere; (b)
+  more easily readable as plain text than most other mark-ups, if
+  you do not have a viewer; and (c) carries enough information that
+  you can generate a nice-looking printed version from it. Also, of
+  course, it make exporting things like the announcement document
+  to WWW pretty trivial.</p>
+
+  <h2><a name="bugtrack" id="bugtrack">How to Report Bugs</a></h2>
+
+  <p>The <a name="bugreport" id="bugreport">reporting address for
+  bugs</a> is <a href=
+  "mailto:bug-ncurses@gnu.org">bug-ncurses@gnu.org</a>. This is a
+  majordomo list; to join, write to
+  <code>bug-ncurses-request@gnu.org</code> with a message
+  containing the line:</p>
+
+  <pre class="code-block">
+             subscribe &lt;name&gt;@&lt;host.domain&gt;
+</pre>
+  <p>The <code>ncurses</code> code is maintained by a small group
+  of volunteers. While we try our best to fix bugs promptly, we
+  simply do not have a lot of hours to spend on elementary
+  hand-holding. We rely on intelligent cooperation from our users.
+  If you think you have found a bug in <code>ncurses</code>, there
+  are some steps you can take before contacting us that will help
+  get the bug fixed quickly.</p>
+
+  <p>In order to use our bug-fixing time efficiently, we put people
+  who show us they have taken these steps at the head of our queue.
+  This means that if you do not, you will probably end up at the
+  tail end and have to wait a while.</p>
+
+  <ol>
+    <li><p>Develop a recipe to reproduce the bug.
+      <p>Bugs we can reproduce are likely to be fixed very quickly,
+      often within days. The most effective single thing you can do
+      to get a quick fix is develop a way we can duplicate the bad
+      behavior &mdash; ideally, by giving us source for a small,
+      portable test program that breaks the library. (Even better
+      is a keystroke recipe using one of the test programs provided
+      with the distribution.)</p>
+    </li>
+
+    <li><p>Try to reproduce the bug on a different terminal type.
+      <p>In our experience, most of the behaviors people report as
+      library bugs are actually due to subtle problems in terminal
+      descriptions. This is especially likely to be true if you are
+      using a traditional asynchronous terminal or PC-based
+      terminal emulator, rather than xterm or a UNIX console
+      entry.</p>
+
+      <p>It is therefore extremely helpful if you can tell us
+      whether or not your problem reproduces on other terminal
+      types. Usually you will have both a console type and xterm
+      available; please tell us whether or not your bug reproduces
+      on both.</p>
+
+      <p>If you have xterm available, it is also good to collect
+      xterm reports for different window sizes. This is especially
+      true if you normally use an unusual xterm window size &mdash;
+      a surprising number of the bugs we have seen are either
+      triggered or masked by these.</p>
+    </li>
+
+    <li><p>Generate and examine a trace file for the broken behavior.
+      <p>Recompile your program with the debugging versions of the
+      libraries. Insert a <code>trace()</code> call with the
+      argument set to <code>TRACE_UPDATE</code>. (See <a href=
+      "ncurses-intro.html#debugging">"Writing Programs with
+      NCURSES"</a> for details on trace levels.) Reproduce your
+      bug, then look at the trace file to see what the library was
+      actually doing.</p>
+
+      <p>Another frequent cause of apparent bugs is application
+      coding errors that cause the wrong things to be put on the
+      virtual screen. Looking at the virtual-screen dumps in the
+      trace file will tell you immediately if this is happening,
+      and save you from the possible embarrassment of being told
+      that the bug is in your code and is your problem rather than
+      ours.</p>
+
+      <p>If the virtual-screen dumps look correct but the bug
+      persists, it is possible to crank up the trace level to give
+      more and more information about the library's update actions
+      and the control sequences it issues to perform them. The test
+      directory of the distribution contains a tool for digesting
+      these logs to make them less tedious to wade through.</p>
+
+      <p>Often you will find terminfo problems at this stage by
+      noticing that the escape sequences put out for various
+      capabilities are wrong. If not, you are likely to learn
+      enough to be able to characterize any bug in the
+      screen-update logic quite exactly.</p>
+    </li>
+
+    <li><p>Report details and symptoms, not just interpretations.
+      <p>If you do the preceding two steps, it is very likely that
+      you will discover the nature of the problem yourself and be
+      able to send us a fix. This will create happy feelings all
+      around and earn you good karma for the first time you run
+      into a bug you really cannot characterize and fix
+      yourself.</p>
+
+      <p>If you are still stuck, at least you will know what to
+      tell us. Remember, we need details. If you guess about what
+      is safe to leave out, you are too likely to be wrong.</p>
+
+      <p>If your bug produces a bad update, include a trace file.
+      Try to make the trace at the <em>least</em> voluminous level
+      that pins down the bug. Logs that have been through
+      tracemunch are OK, it does not throw away any information
+      (actually they are better than un-munched ones because they
+      are easier to read).</p>
+
+      <p>If your bug produces a core-dump, please include a
+      symbolic stack trace generated by gdb(1) or your local
+      equivalent.</p>
+
+      <p>Tell us about every terminal on which you have reproduced
+      the bug &mdash; and every terminal on which you cannot.
+      Ideally, send us terminfo sources for all of these (yours
+      might differ from ours).</p>
+
+      <p>Include your ncurses version and your OS/machine type, of
+      course! You can find your ncurses version in the
+      <code>curses.h</code> file.</p>
+    </li>
+  </ol>
+
+  <p>If your problem smells like a logic error or in cursor
+  movement or scrolling or a bad capability, there are a couple of
+  tiny test frames for the library algorithms in the progs
+  directory that may help you isolate it. These are not part of the
+  normal build, but do have their own make productions.</p>
+
+  <p>The most important of these is <code>mvcur</code>, a test
+  frame for the cursor-movement optimization code. With this
+  program, you can see directly what control sequences will be
+  emitted for any given cursor movement or scroll/insert/delete
+  operations. If you think you have got a bad capability
+  identified, you can disable it and test again. The program is
+  command-driven and has on-line help.</p>
+
+  <p>If you think the vertical-scroll optimization is broken, or
+  just want to understand how it works better, build
+  <code>hashmap</code> and read the header comments of
+  <code>hardscroll.c</code> and <code>hashmap.c</code>; then try it
+  out. You can also test the hardware-scrolling optimization
+  separately with <code>hardscroll</code>.</p>
+
+  <h2><a name="ncurslib" id="ncurslib">A Tour of the Ncurses
+  Library</a></h2>
+
+  <h3><a name="loverview" id="loverview">Library Overview</a></h3>
+
+  <p>Most of the library is superstructure &mdash; fairly trivial
+  convenience interfaces to a small set of basic functions and data
+  structures used to manipulate the virtual screen (in particular,
+  none of this code does any I/O except through calls to more
+  fundamental modules described below). The files</p>
+
+  <blockquote>
+    <code>lib_addch.c lib_bkgd.c lib_box.c lib_chgat.c lib_clear.c
+    lib_clearok.c lib_clrbot.c lib_clreol.c lib_colorset.c
+    lib_data.c lib_delch.c lib_delwin.c lib_echo.c lib_erase.c
+    lib_gen.c lib_getstr.c lib_hline.c lib_immedok.c lib_inchstr.c
+    lib_insch.c lib_insdel.c lib_insstr.c lib_instr.c
+    lib_isendwin.c lib_keyname.c lib_leaveok.c lib_move.c
+    lib_mvwin.c lib_overlay.c lib_pad.c lib_printw.c lib_redrawln.c
+    lib_scanw.c lib_screen.c lib_scroll.c lib_scrollok.c
+    lib_scrreg.c lib_set_term.c lib_slk.c lib_slkatr_set.c
+    lib_slkatrof.c lib_slkatron.c lib_slkatrset.c lib_slkattr.c
+    lib_slkclear.c lib_slkcolor.c lib_slkinit.c lib_slklab.c
+    lib_slkrefr.c lib_slkset.c lib_slktouch.c lib_touch.c
+    lib_unctrl.c lib_vline.c lib_wattroff.c lib_wattron.c
+    lib_window.c</code>
+  </blockquote>
+
+  <p>are all in this category. They are very unlikely to need
+  change, barring bugs or some fundamental reorganization in the
+  underlying data structures.</p>
+
+  <p>These files are used only for debugging support:</p>
+
+  <blockquote>
+    <code>lib_trace.c lib_traceatr.c lib_tracebits.c lib_tracechr.c
+    lib_tracedmp.c lib_tracemse.c trace_buf.c</code>
+  </blockquote>
+
+  <p>It is rather unlikely you will ever need to change these,
+  unless you want to introduce a new debug trace level for some
+  reason.</p>
+
+  <p>There is another group of files that do direct I/O via
+  <em>tputs()</em>, computations on the terminal capabilities, or
+  queries to the OS environment, but nevertheless have only fairly
+  low complexity. These include:</p>
+
+  <blockquote>
+    <code>lib_acs.c lib_beep.c lib_color.c lib_endwin.c
+    lib_initscr.c lib_longname.c lib_newterm.c lib_options.c
+    lib_termcap.c lib_ti.c lib_tparm.c lib_tputs.c lib_vidattr.c
+    read_entry.c.</code>
+  </blockquote>
+
+  <p>They are likely to need revision only if ncurses is being
+  ported to an environment without an underlying terminfo
+  capability representation.</p>
+
+  <p>These files have serious hooks into the tty driver and signal
+  facilities:</p>
+
+  <blockquote>
+    <code>lib_kernel.c lib_baudrate.c lib_raw.c lib_tstp.c
+    lib_twait.c</code>
+  </blockquote>
+
+  <p>If you run into porting snafus moving the package to another
+  UNIX, the problem is likely to be in one of these files. The file
+  <code>lib_print.c</code> uses sleep(2) and also falls in this
+  category.</p>
+
+  <p>Almost all of the real work is done in the files</p>
+
+  <blockquote>
+    <code>hardscroll.c hashmap.c lib_addch.c lib_doupdate.c
+    lib_getch.c lib_mouse.c lib_mvcur.c lib_refresh.c lib_setup.c
+    lib_vidattr.c</code>
+  </blockquote>
+
+  <p>Most of the algorithmic complexity in the library lives in
+  these files. If there is a real bug in <strong>ncurses</strong>
+  itself, it is probably here. We will tour some of these files in
+  detail below (see <a href="#engine">The Engine Room</a>).</p>
+
+  <p>Finally, there is a group of files that is actually most of
+  the terminfo compiler. The reason this code lives in the
+  <strong>ncurses</strong> library is to support fallback to
+  /etc/termcap. These files include</p>
+
+  <blockquote>
+    <code>alloc_entry.c captoinfo.c comp_captab.c comp_error.c
+    comp_hash.c comp_parse.c comp_scan.c parse_entry.c
+    read_termcap.c write_entry.c</code>
+  </blockquote>
+
+  <p>We will discuss these in the compiler tour.</p>
+
+  <h3><a name="engine" id="engine">The Engine Room</a></h3>
+
+  <h4><a name="input" id="input">Keyboard Input</a></h4>
+
+  <p>All <code>ncurses</code> input funnels through the function
+  <code>wgetch()</code>, defined in <code>lib_getch.c</code>. This
+  function is tricky; it has to poll for keyboard and mouse events
+  and do a running match of incoming input against the set of
+  defined special keys.</p>
+
+  <p>The central data structure in this module is a FIFO queue,
+  used to match multiple-character input sequences against
+  special-key capabilities; also to implement pushback via
+  <code>ungetch()</code>.</p>
+
+  <p>The <code>wgetch()</code> code distinguishes between function
+  key sequences and the same sequences typed manually by doing a
+  timed wait after each input character that could lead a function
+  key sequence. If the entire sequence takes less than 1 second, it
+  is assumed to have been generated by a function key press.</p>
+
+  <p>Hackers bruised by previous encounters with variant
+  <code>select(2)</code> calls may find the code in
+  <code>lib_twait.c</code> interesting. It deals with the problem
+  that some BSD selects do not return a reliable time-left value.
+  The function <code>timed_wait()</code> effectively simulates a
+  System V select.</p>
+
+  <h4><a name="mouse" id="mouse">Mouse Events</a></h4>
+
+  <p>If the mouse interface is active, <code>wgetch()</code> polls
+  for mouse events each call, before it goes to the keyboard for
+  input. It is up to <code>lib_mouse.c</code> how the polling is
+  accomplished; it may vary for different devices.</p>
+
+  <p>Under xterm, however, mouse event notifications come in via
+  the keyboard input stream. They are recognized by having the
+  <strong>kmous</strong> capability as a prefix. This is kind of
+  klugey, but trying to wire in recognition of a mouse key prefix
+  without going through the function-key machinery would be just
+  too painful, and this turns out to imply having the prefix
+  somewhere in the function-key capabilities at terminal-type
+  initialization.</p>
+
+  <p>This kluge only works because <strong>kmous</strong> is not
+  actually used by any historic terminal type or curses
+  implementation we know of. Best guess is it is a relic of some
+  forgotten experiment in-house at Bell Labs that did not leave any
+  traces in the publicly-distributed System V terminfo files. If
+  System V or XPG4 ever gets serious about using it again, this
+  kluge may have to change.</p>
+
+  <p>Here are some more details about mouse event handling:</p>
+
+  <p>The <code>lib_mouse()</code> code is logically split into a
+  lower level that accepts event reports in a device-dependent
+  format and an upper level that parses mouse gestures and filters
+  events. The mediating data structure is a circular queue of event
+  structures.</p>
+
+  <p>Functionally, the lower level's job is to pick up primitive
+  events and put them on the circular queue. This can happen in one
+  of two ways: either (a) <code>_nc_mouse_event()</code> detects a
+  series of incoming mouse reports and queues them, or (b) code in
+  <code>lib_getch.c</code> detects the <strong>kmous</strong>
+  prefix in the keyboard input stream and calls _nc_mouse_inline to
+  queue up a series of adjacent mouse reports.</p>
+
+  <p>In either case, <code>_nc_mouse_parse()</code> should be
+  called after the series is accepted to parse the digested mouse
+  reports (low-level events) into a gesture (a high-level or
+  composite event).</p>
+
+  <h4><a name="output" id="output">Output and Screen Updating</a></h4>
+
+  <p>With the single exception of character echoes during a
+  <code>wgetnstr()</code> call (which simulates cooked-mode line
+  editing in an ncurses window), the library normally does all its
+  output at refresh time.</p>
+
+  <p>The main job is to go from the current state of the screen (as
+  represented in the <code>curscr</code> window structure) to the
+  desired new state (as represented in the <code>newscr</code>
+  window structure), while doing as little I/O as possible.</p>
+
+  <p>The brains of this operation are the modules
+  <code>hashmap.c</code>, <code>hardscroll.c</code> and
+  <code>lib_doupdate.c</code>; the latter two use
+  <code>lib_mvcur.c</code>. Essentially, what happens looks like
+  this:</p>
+
+  <ul>
+    <li>
+      <p>The <code>hashmap.c</code> module tries to detect vertical
+      motion changes between the real and virtual screens. This
+      information is represented by the oldindex members in the
+      newscr structure. These are modified by vertical-motion and
+      clear operations, and both are re-initialized after each
+      update. To this change-journalling information, the hashmap
+      code adds deductions made using a modified Heckel algorithm
+      on hash values generated from the line contents.</p>
+    </li>
+
+    <li>
+      <p>The <code>hardscroll.c</code> module computes an optimum
+      set of scroll, insertion, and deletion operations to make the
+      indices match. It calls <code>_nc_mvcur_scrolln()</code> in
+      <code>lib_mvcur.c</code> to do those motions.</p>
+    </li>
+
+    <li>
+      <p>Then <code>lib_doupdate.c</code> goes to work. Its job is
+      to do line-by-line transformations of <code>curscr</code>
+      lines to <code>newscr</code> lines. Its main tool is the
+      routine <code>mvcur()</code> in <code>lib_mvcur.c</code>.
+      This routine does cursor-movement optimization, attempting to
+      get from given screen location A to given location B in the
+      fewest output characters possible.</p>
+    </li>
+  </ul>
+
+  <p>If you want to work on screen optimizations, you should use
+  the fact that (in the trace-enabled version of the library)
+  enabling the <code>TRACE_TIMES</code> trace level causes a report
+  to be emitted after each screen update giving the elapsed time
+  and a count of characters emitted during the update. You can use
+  this to tell when an update optimization improves efficiency.</p>
+
+  <p>In the trace-enabled version of the library, it is also
+  possible to disable and re-enable various optimizations at
+  runtime by tweaking the variable
+  <code>_nc_optimize_enable</code>. See the file
+  <code>include/curses.h.in</code> for mask values, near the
+  end.</p>
+
+  <h2><a name="fmnote" id="fmnote">The Forms and Menu Libraries</a></h2>
+
+  <p>The forms and menu libraries should work reliably in any
+  environment you can port ncurses to. The only portability issue
+  anywhere in them is what flavor of regular expressions the
+  built-in form field type TYPE_REGEXP will recognize.</p>
+
+  <p>The configuration code prefers the POSIX regex facility,
+  modeled on System V's, but will settle for BSD regexps if the
+  former is not available.</p>
+
+  <p>Historical note: the panels code was written primarily to
+  assist in porting u386mon 2.0 (comp.sources.misc v14i001-4) to
+  systems lacking panels support; u386mon 2.10 and beyond use it.
+  This version has been slightly cleaned up for
+  <code>ncurses</code>.</p>
+
+  <h2><a name="tic" id="tic">A Tour of the Terminfo Compiler</a></h2>
+
+  <p>The <strong>ncurses</strong> implementation of
+  <strong>tic</strong> is rather complex internally; it has to do a
+  trying combination of missions. This starts with the fact that,
+  in addition to its normal duty of compiling terminfo sources into
+  loadable terminfo binaries, it has to be able to handle termcap
+  syntax and compile that too into terminfo entries.</p>
+
+  <p>The implementation therefore starts with a table-driven,
+  dual-mode lexical analyzer (in <code>comp_scan.c</code>). The
+  lexer chooses its mode (termcap or terminfo) based on the first
+  &ldquo;,&rdquo; or &ldquo;:&rdquo; it finds in each entry. The
+  lexer does all the work of recognizing capability names and
+  values; the grammar above it is trivial, just "parse entries till
+  you run out of file".</p>
+
+  <h3><a name="nonuse" id="nonuse">Translation of
+  Non-<strong>use</strong> Capabilities</a></h3>
+
+  <p>Translation of most things besides <strong>use</strong>
+  capabilities is pretty straightforward. The lexical analyzer's
+  tokenizer hands each capability name to a hash function, which
+  drives a table lookup. The table entry yields an index which is
+  used to look up the token type in another table, and controls
+  interpretation of the value.</p>
+
+  <p>One possibly interesting aspect of the implementation is the
+  way the compiler tables are initialized. All the tables are
+  generated by various awk/sed/sh scripts from a master table
+  <code>include/Caps</code>; these scripts actually write C
+  initializers which are linked to the compiler. Furthermore, the
+  hash table is generated in the same way, so it doesn't have to be
+  generated at compiler startup time (another benefit of this
+  organization is that the hash table can be in shareable text
+  space).</p>
+
+  <p>Thus, adding a new capability is usually pretty trivial, just
+  a matter of adding one line to the <code>include/Caps</code>
+  file. We will have more to say about this in the section on
+  <a href="#translation">Source-Form Translation</a>.</p>
+
+  <h3><a name="uses" id="uses">Use Capability Resolution</a></h3>
+
+  <p>The background problem that makes <strong>tic</strong> tricky
+  is not the capability translation itself, it is the resolution of
+  <strong>use</strong> capabilities. Older versions would not
+  handle forward <strong>use</strong> references for this reason
+  (that is, a using terminal always had to follow its use target in
+  the source file). By doing this, they got away with a simple
+  implementation tactic; compile everything as it blows by, then
+  resolve uses from compiled entries.</p>
+
+  <p>This will not do for <strong>ncurses</strong>. The problem is
+  that that the whole compilation process has to be embeddable in
+  the <strong>ncurses</strong> library so that it can be called by
+  the startup code to translate termcap entries on the fly. The
+  embedded version cannot go promiscuously writing everything it
+  translates out to disk &mdash; for one thing, it will typically
+  be running with non-root permissions.</p>
+
+  <p>So our <strong>tic</strong> is designed to parse an entire
+  terminfo file into a doubly-linked circular list of entry
+  structures in-core, and then do <strong>use</strong> resolution
+  in-memory before writing everything out. This design has other
+  advantages: it makes forward and back use-references equally easy
+  (so we get the latter for free), and it makes checking for name
+  collisions before they are written out easy to do.</p>
+
+  <p>And this is exactly how the embedded version works. But the
+  stand-alone user-accessible version of <strong>tic</strong>
+  partly reverts to the historical strategy; it writes to disk (not
+  keeping in core) any entry with no <strong>use</strong>
+  references.</p>
+
+  <p>This is strictly a core-economy kluge, implemented because the
+  terminfo master file is large enough that some core-poor systems
+  swap like crazy when you compile it all in memory...there have
+  been reports of this process taking <strong>three hours</strong>,
+  rather than the twenty seconds or less typical on the author's
+  development box.</p>
+
+  <p>So. The executable <strong>tic</strong> passes the
+  entry-parser a hook that <em>immediately</em> writes out the
+  referenced entry if it has no use capabilities. The compiler main
+  loop refrains from adding the entry to the in-core list when this
+  hook fires. If some other entry later needs to reference an entry
+  that got written immediately, that is OK; the resolution code
+  will fetch it off disk when it cannot find it in core.</p>
+
+  <p>Name collisions will still be detected, just not as cleanly.
+  The <code>write_entry()</code> code complains before overwriting
+  an entry that postdates the time of <strong>tic</strong>'s first
+  call to <code>write_entry()</code>, Thus it will complain about
+  overwriting entries newly made during the <strong>tic</strong>
+  run, but not about overwriting ones that predate it.</p>
+
+  <h3><a name="translation" id="translation">Source-Form
+  Translation</a></h3>
+
+  <p>Another use of <strong>tic</strong> is to do source
+  translation between various termcap and terminfo formats. There
+  are more variants out there than you might think; the ones we
+  know about are described in the <strong>captoinfo(1)</strong>
+  manual page.</p>
+
+  <p>The translation output code (<code>dump_entry()</code> in
+  <code>ncurses/dump_entry.c</code>) is shared with the
+  <strong>infocmp(1)</strong> utility. It takes the same internal
+  representation used to generate the binary form and dumps it to
+  standard output in a specified format.</p>
+
+  <p>The <code>include/Caps</code> file has a header comment
+  describing ways you can specify source translations for
+  nonstandard capabilities just by altering the master table. It is
+  possible to set up capability aliasing or tell the compiler to
+  plain ignore a given capability without writing any C code at
+  all.</p>
+
+  <p>For circumstances where you need to do algorithmic
+  translation, there are functions in <code>parse_entry.c</code>
+  called after the parse of each entry that are specifically
+  intended to encapsulate such translations. This, for example, is
+  where the AIX <strong>box1</strong> capability get translated to
+  an <strong>acsc</strong> string.</p>
+
+  <h2><a name="utils" id="utils">Other Utilities</a></h2>
+
+  <p>The <strong>infocmp</strong> utility is just a wrapper around
+  the same entry-dumping code used by <strong>tic</strong> for
+  source translation. Perhaps the one interesting aspect of the
+  code is the use of a predicate function passed in to
+  <code>dump_entry()</code> to control which capabilities are
+  dumped. This is necessary in order to handle both the ordinary
+  De-compilation case and entry difference reporting.</p>
+
+  <p>The <strong>tput</strong> and <strong>clear</strong> utilities
+  just do an entry load followed by a <code>tputs()</code> of a
+  selected capability.</p>
+
+  <h2><a name="style" id="style">Style Tips for Developers</a></h2>
+
+  <p>See the TO-DO file in the top-level directory of the source
+  distribution for additions that would be particularly useful.</p>
+
+  <p>The prefix <code>_nc_</code> should be used on library public
+  functions that are not part of the curses API in order to prevent
+  pollution of the application namespace. If you have to add to or
+  modify the function prototypes in curses.h.in, read
+  ncurses/MKlib_gen.sh first so you can avoid breaking XSI
+  conformance. Please join the ncurses mailing list. See the
+  INSTALL file in the top level of the distribution for details on
+  the list.</p>
+
+  <p>Look for the string <code>FIXME</code> in source files to tag
+  minor bugs and potential problems that could use fixing.</p>
+
+  <p>Do not try to auto-detect OS features in the main body of the
+  C code. That is the job of the configuration system.</p>
+
+  <p>To hold down complexity, do make your code data-driven.
+  Especially, if you can drive logic from a table filtered out of
+  <code>include/Caps</code>, do it. If you find you need to augment
+  the data in that file in order to generate the proper table, that
+  is still preferable to ad-hoc code &mdash; that is why the fifth
+  field (flags) is there.</p>
+
+  <p>Have fun!</p>
+
+  <h2><a name="port" id="port">Porting Hints</a></h2>
+
+  <p>The following notes are intended to be a first step towards
+  DOS and Macintosh ports of the ncurses libraries.</p>
+
+  <p>The following library modules are &ldquo;pure curses&rdquo;;
+  they operate only on the curses internal structures, do all
+  output through other curses calls (not including
+  <code>tputs()</code> and <code>putp()</code>) and do not call any
+  other UNIX routines such as signal(2) or the stdio library. Thus,
+  they should not need to be modified for single-terminal
+  ports.</p>
+
+  <blockquote>
+    <code>lib_addch.c lib_addstr.c lib_bkgd.c lib_box.c lib_clear.c
+    lib_clrbot.c lib_clreol.c lib_delch.c lib_delwin.c lib_erase.c
+    lib_inchstr.c lib_insch.c lib_insdel.c lib_insstr.c
+    lib_keyname.c lib_move.c lib_mvwin.c lib_newwin.c lib_overlay.c
+    lib_pad.c lib_printw.c lib_refresh.c lib_scanw.c lib_scroll.c
+    lib_scrreg.c lib_set_term.c lib_touch.c lib_tparm.c lib_tputs.c
+    lib_unctrl.c lib_window.c panel.c</code>
+  </blockquote>
+
+  <p>This module is pure curses, but calls outstr():</p>
+
+  <blockquote>
+    <code>lib_getstr.c</code>
+  </blockquote>
+
+  <p>These modules are pure curses, except that they use
+  <code>tputs()</code> and <code>putp()</code>:</p>
+
+  <blockquote>
+    <code>lib_beep.c lib_color.c lib_endwin.c lib_options.c
+    lib_slk.c lib_vidattr.c</code>
+  </blockquote>
+
+  <p>This modules assist in POSIX emulation on non-POSIX
+  systems:</p>
+
+  <dl>
+    <dt>sigaction.c</dt>
+
+    <dd>signal calls</dd>
+  </dl>
+
+  <p>The following source files will not be needed for a
+  single-terminal-type port.</p>
+
+  <blockquote>
+    <code>alloc_entry.c captoinfo.c clear.c comp_captab.c
+    comp_error.c comp_hash.c comp_main.c comp_parse.c comp_scan.c
+    dump_entry.c infocmp.c parse_entry.c read_entry.c tput.c
+    write_entry.c</code>
+  </blockquote>
+
+  <p>The following modules will use
+  open()/read()/write()/close()/lseek() on files, but no other OS
+  calls.</p>
+
+  <dl>
+    <dt>lib_screen.c</dt>
+
+    <dd>used to read/write screen dumps</dd>
+
+    <dt>lib_trace.c</dt>
+
+    <dd>used to write trace data to the logfile</dd>
+  </dl>
+
+  <p>Modules that would have to be modified for a port start
+  here:</p>
+
+  <p>The following modules are &ldquo;pure curses&rdquo; but
+  contain assumptions inappropriate for a memory-mapped port.</p>
+
+  <dl>
+    <dt>lib_longname.c</dt>
+
+    <dd>assumes there may be multiple terminals</dd>
+
+    <dt>lib_acs.c</dt>
+
+    <dd>assumes acs_map as a double indirection</dd>
+
+    <dt>lib_mvcur.c</dt>
+
+    <dd>assumes cursor moves have variable cost</dd>
+
+    <dt>lib_termcap.c</dt>
+
+    <dd>assumes there may be multiple terminals</dd>
+
+    <dt>lib_ti.c</dt>
+
+    <dd>assumes there may be multiple terminals</dd>
+  </dl>
+
+  <p>The following modules use UNIX-specific calls:</p>
+
+  <dl>
+    <dt>lib_doupdate.c</dt>
+
+    <dd>input checking</dd>
+
+    <dt>lib_getch.c</dt>
+
+    <dd>read()</dd>
+
+    <dt>lib_initscr.c</dt>
+
+    <dd>getenv()</dd>
+
+    <dt>lib_newterm.c</dt>
+
+    <dt>lib_baudrate.c</dt>
+
+    <dt>lib_kernel.c</dt>
+
+    <dd>various tty-manipulation and system calls</dd>
+
+    <dt>lib_raw.c</dt>
+
+    <dd>various tty-manipulation calls</dd>
+
+    <dt>lib_setup.c</dt>
+
+    <dd>various tty-manipulation calls</dd>
+
+    <dt>lib_restart.c</dt>
+
+    <dd>various tty-manipulation calls</dd>
+
+    <dt>lib_tstp.c</dt>
+
+    <dd>signal-manipulation calls</dd>
+
+    <dt>lib_twait.c</dt>
+
+    <dd>gettimeofday(), select().</dd>
+  </dl>
+
+  <hr>
+
+  <address>
+    Eric S. Raymond &lt;esr@snark.thyrsus.com&gt;
+  </address>
+  (Note: This is <em>not</em> the <a href="#bugtrack">bug
+  address</a>!)
+</body>
+</html>
diff --git a/doc/html/index.html b/doc/html/index.html
new file mode 100644
index 0000000..3f35122
--- /dev/null
+++ b/doc/html/index.html
@@ -0,0 +1,68 @@
+<!--
+  $Id: index.html,v 1.11 2022/11/26 17:39:53 tom Exp $
+  ****************************************************************************
+  * Copyright 2019-2020,2022 Thomas E. Dickey                                *
+  * Copyright 2000-2013,2017 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.                                                           *
+  ****************************************************************************
+-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+  <meta name="generator" content=
+  "HTML Tidy for HTML5 for Linux version 5.6.0">
+  <title>Welcome to ncurses</title>
+  <link rel="author" href="mailto:bug-ncurses@gnu.org">
+  <meta http-equiv="Content-Type" content=
+  "text/html; charset=us-ascii">
+</head>
+<body>
+  <h1>Welcome to ncurses</h1>
+
+  <p>From this index page you have access to these further
+  documents</p>
+
+  <ul>
+    <li>The <a href="announce.html">Announcement</a> of the current
+    version of ncurses.</li>
+
+    <li>An <a href="ncurses-intro.html">Introduction</a> into
+    (n)curses programming.</li>
+
+    <li>A <a href="hackguide.html">hackers guide</a> to
+    ncurses.</li>
+
+    <li>A description of the <a href="Ada95.html">Ada95
+    binding</a>, by J&uuml;rgen Pfeifer.</li>
+
+    <li>A <a href="NCURSES-Programming-HOWTO.html">A short
+    tutorial</a>, by Pradeep Padala.</li>
+  </ul>
+
+  <p>We also have HTML versions of all the ncurses <a href=
+  "man">manpages</a>.</p>
+</body>
+</html>
diff --git a/doc/html/man/adacurses6-config.1.html b/doc/html/man/adacurses6-config.1.html
new file mode 100644
index 0000000..90587e4
--- /dev/null
+++ b/doc/html/man/adacurses6-config.1.html
@@ -0,0 +1,146 @@
+<!--
+  ****************************************************************************
+  * Copyright 2019-2020,2021 Thomas E. Dickey                                *
+  * Copyright 2010-2014,2016 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: MKada_config.in,v 1.14 2021/12/25 17:39:16 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>ADACURSES 1   User Commands</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">ADACURSES 1   User Commands</H1>
+<PRE>
+<STRONG>ADACURSES(1)</STRONG>                     User Commands                    <STRONG>ADACURSES(1)</STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       adacurses6-config - helper script for AdaCurses libraries
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>adacurses6-config</STRONG> [<EM>options</EM>]
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       This  is  a shell script which simplifies configuring an application to
+       use the AdaCurses library binding to ncurses.
+
+
+</PRE><H2><a name="h2-OPTIONS">OPTIONS</a></H2><PRE>
+       <STRONG>--cflags</STRONG>
+              echos the gnat (Ada  compiler)  flags  needed  to  compile  with
+              AdaCurses.
+
+       <STRONG>--libs</STRONG> echos the gnat libraries needed to link with AdaCurses.
+
+       <STRONG>--version</STRONG>
+              echos  the  release+patchdate  version  of the ncurses libraries
+              used to configure and build AdaCurses.
+
+       <STRONG>--help</STRONG> prints a list of the <STRONG>adacurses6-config</STRONG> script's options.
+
+       If no options are given, <STRONG>adacurses6-config</STRONG> prints  the  combination  of
+       <STRONG>--cflags</STRONG> and <STRONG>--libs</STRONG> that <STRONG>gnatmake</STRONG> expects (see example).
+
+
+</PRE><H2><a name="h2-EXAMPLE">EXAMPLE</a></H2><PRE>
+       For  example,  supposing  that  you  want to compile the "Hello World!"
+       program for AdaCurses.  Make a file named "hello.adb":
+              with Terminal_Interface.Curses; use Terminal_Interface.Curses;
+
+              procedure Hello is
+
+                 Visibility : Cursor_Visibility := Invisible;
+                 done : Boolean := False;
+                 c : Key_Code;
+
+              begin
+
+                 Init_Screen;
+                 Set_Echo_Mode (False);
+
+                 Set_Cursor_Visibility (Visibility);
+                 Set_Timeout_Mode (Standard_Window, Non_Blocking, 0);
+
+                 Move_Cursor (Line =&gt; Lines / 2, Column =&gt; (Columns - 12) / 2);
+                 Add (Str =&gt; "Hello World!");
+
+                 while not done loop
+
+                    c := Get_Keystroke (Standard_Window);
+                    case c is
+                    when Character'Pos ('q') =&gt; done := True;
+                    when others =&gt; null;
+                    end case;
+
+                    Nap_Milli_Seconds (50);
+                 end loop;
+
+                 End_Windows;
+
+              end Hello;
+
+       Then, using
+              gnatmake `adacurses-config --cflags`  hello  -largs  `adacurses-
+              config --libs`
+
+       or (simpler):
+              gnatmake hello `adacurses-config`
+
+       you will compile and link the program.
+
+
+</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 20221231).
+
+
+
+                                                                  <STRONG>ADACURSES(1)</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></li>
+<li><a href="#h2-OPTIONS">OPTIONS</a></li>
+<li><a href="#h2-EXAMPLE">EXAMPLE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/captoinfo.1m.html b/doc/html/man/captoinfo.1m.html
new file mode 100644
index 0000000..ab99a7c
--- /dev/null
+++ b/doc/html/man/captoinfo.1m.html
@@ -0,0 +1,227 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2016 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: captoinfo.1m,v 1.33 2022/02/12 20:07:29 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>captoinfo 1m</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">captoinfo 1m</H1>
+<PRE>
+<STRONG><A HREF="captoinfo.1m.html">captoinfo(1m)</A></STRONG>                                                    <STRONG><A HREF="captoinfo.1m.html">captoinfo(1m)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>captoinfo</STRONG> - convert a <EM>termcap</EM> description into a <EM>terminfo</EM> description
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>captoinfo</STRONG> [<STRONG>-v</STRONG><EM>n</EM> <EM>width</EM>]  [<STRONG>-V</STRONG>] [<STRONG>-1</STRONG>] [<STRONG>-w</STRONG> <EM>width</EM>] <EM>file</EM> ...
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       <STRONG>captoinfo</STRONG>  looks in each given text <EM>file</EM> for <STRONG>termcap</STRONG> descriptions.  For
+       each one found,  an  equivalent  <STRONG>terminfo</STRONG>  description  is  written  to
+       standard  output.   Termcap  <STRONG>tc</STRONG> capabilities are translated directly to
+       terminfo <STRONG>use</STRONG> capabilities.
+
+       If no <EM>file</EM> is given, then the environment variable <STRONG>TERMCAP</STRONG> is used  for
+       the  filename  or entry.  If <STRONG>TERMCAP</STRONG> is a full pathname to a file, only
+       the terminal whose name is specified in the environment  variable  <STRONG>TERM</STRONG>
+       is  extracted  from  that file.  If the environment variable <STRONG>TERMCAP</STRONG> is
+       not set, then the file <STRONG>/usr/share/terminfo</STRONG> is read.
+
+       <STRONG>-v</STRONG>   print out tracing information on standard  error  as  the  program
+            runs.
+
+       <STRONG>-V</STRONG>   print  out the version of the program in use on standard error and
+            exit.
+
+       <STRONG>-1</STRONG>   cause the fields to print out  one  to  a  line.   Otherwise,  the
+            fields  will be printed several to a line to a maximum width of 60
+            characters.
+
+       <STRONG>-w</STRONG>   change the output to <EM>width</EM> characters.
+
+
+</PRE><H2><a name="h2-FILES">FILES</a></H2><PRE>
+       /usr/share/terminfo Compiled terminal description database.
+
+
+</PRE><H2><a name="h2-TRANSLATIONS-FROM-NONSTANDARD-CAPABILITIES">TRANSLATIONS FROM NONSTANDARD CAPABILITIES</a></H2><PRE>
+       Some obsolete nonstandard capabilities will automatically be translated
+       into  standard  (SVr4/XSI  Curses)  terminfo capabilities by <STRONG>captoinfo</STRONG>.
+       Whenever one of these automatic translations is done, the program  will
+       issue an notification to stderr, inviting the user to check that it has
+       not mistakenly translated a completely unknown  and  random  capability
+       and/or syntax error.
+
+       Nonstd   Std    From           Terminfo
+        name    name                 capability
+       -----------------------------------------------
+       BO       mr     AT&amp;T    enter_reverse_mode
+       CI       vi     AT&amp;T    cursor_invisible
+       CV       ve     AT&amp;T    cursor_normal
+       DS       mh     AT&amp;T    enter_dim_mode
+       EE       me     AT&amp;T    exit_attribute_mode
+       FE       LF     AT&amp;T    label_on
+       FL       LO     AT&amp;T    label_off
+       XS       mk     AT&amp;T    enter_secure_mode
+       EN       @7     XENIX   key_end
+       GE       ae     XENIX   exit_alt_charset_mode
+       GS       as     XENIX   enter_alt_charset_mode
+       HM       kh     XENIX   key_home
+       LD       kL     XENIX   key_dl
+       PD       kN     XENIX   key_npage
+       PN       po     XENIX   prtr_off
+       PS       pf     XENIX   prtr_on
+       PU       kP     XENIX   key_ppage
+
+       RT       @8     XENIX   kent
+       UP       ku     XENIX   kcuu1
+       KA       k;     Tek     key_f10
+       KB       F1     Tek     key_f11
+       KC       F2     Tek     key_f12
+       KD       F3     Tek     key_f13
+       KE       F4     Tek     key_f14
+       KF       F5     Tek     key_f15
+       BC       Sb     Tek     set_background
+       FC       Sf     Tek     set_foreground
+       HS       mh     Iris    enter_dim_mode
+
+       XENIX  termcap  also  used  to have a set of extension capabilities for
+       forms drawing, designed to take  advantage  of  the  IBM  PC  high-half
+       graphics.  They were as follows:
+
+       Cap          Graphic
+       -----------------------------
+       G2    upper left
+       G3    lower left
+       G1    upper right
+       G4    lower right
+       GR    pointing right
+       GL    pointing left
+       GU    pointing up
+       GD    pointing down
+       GH    horizontal line
+       GV    vertical line
+       GC    intersection
+       G6    upper left
+       G7    lower left
+       G5    upper right
+       G8    lower right
+       Gr    tee pointing right
+       Gr    tee pointing left
+       Gu    tee pointing up
+       Gd    tee pointing down
+       Gh    horizontal line
+       Gv    vertical line
+       Gc    intersection
+       GG    acs magic cookie count
+
+       If   the   single-line  capabilities  occur  in  an  entry,  they  will
+       automatically  be  composed  into  an  <STRONG>acsc</STRONG>  string.   The  double-line
+       capabilities and <STRONG>GG</STRONG> are discarded with a warning message.
+
+       IBM's  AIX  has  a  terminfo  facility descended from SVr1 terminfo but
+       incompatible with the SVr4 format.  The following  AIX  extensions  are
+       automatically translated:
+
+        IBM    XSI
+       -------------
+       ksel    kslt
+       kbtab   kcbt
+       font0   s0ds
+       font1   s1ds
+       font2   s2ds
+       font3   s3ds
+
+       Additionally,  the AIX <EM>box1</EM> capability will be automatically translated
+       to an <STRONG>acsc</STRONG> string.
+
+       Hewlett-Packard's terminfo library supports  two  nonstandard  terminfo
+       capabilities  <STRONG>meml</STRONG>  (memory lock) and <STRONG>memu</STRONG> (memory unlock).  These will
+       be discarded with a warning message.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       This utility is actually a link to <STRONG><A HREF="tic.1m.html">tic(1m)</A></STRONG>, running in  <EM>-I</EM>  mode.   You
+       can use other <STRONG>tic</STRONG> options such as <STRONG>-f</STRONG> and  <STRONG>-x</STRONG>.
+
+       The  verbose option is not identical to SVr4's.  Under SVr4, instead of
+       following the <STRONG>-v</STRONG> with a trace level n, you repeat it n times.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       X/Open Curses, Issue 7 (2009) describes <STRONG>tic</STRONG>  briefly,  but  omits  this
+       program.  SVr4 systems provide <STRONG>captoinfo</STRONG> as a separate application from
+       <STRONG>tic</STRONG>.
+
+       NetBSD does not provide this application.
+
+
+</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 20221231).
+
+
+</PRE><H2><a name="h2-AUTHOR">AUTHOR</a></H2><PRE>
+       Eric S. Raymond &lt;esr@snark.thyrsus.com&gt; and
+       Thomas E. Dickey &lt;dickey@invisible-island.net&gt;
+
+
+
+                                                                 <STRONG><A HREF="captoinfo.1m.html">captoinfo(1m)</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></li>
+<li><a href="#h2-FILES">FILES</a></li>
+<li><a href="#h2-TRANSLATIONS-FROM-NONSTANDARD-CAPABILITIES">TRANSLATIONS FROM NONSTANDARD CAPABILITIES</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-AUTHOR">AUTHOR</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/clear.1.html b/doc/html/man/clear.1.html
new file mode 100644
index 0000000..74f5198
--- /dev/null
+++ b/doc/html/man/clear.1.html
@@ -0,0 +1,171 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2016,2017 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: clear.1,v 1.27 2022/02/12 20:07:29 tom Exp @
+  * these would be fallbacks for DS/DE,
+  * but groff changed the meaning of the macros.
+-->
+<!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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>clear 1</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">clear 1</H1>
+<PRE>
+<STRONG><A HREF="clear.1.html">clear(1)</A></STRONG>                    General Commands Manual                   <STRONG><A HREF="clear.1.html">clear(1)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>clear</STRONG> - clear the terminal screen
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>clear</STRONG> [<STRONG>-T</STRONG><EM>type</EM>] [<STRONG>-V</STRONG>] [<STRONG>-x</STRONG>]
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       <STRONG>clear</STRONG>  clears your terminal's screen if this is possible, including the
+       terminal's scrollback  buffer  (if  the  extended  "E3"  capability  is
+       defined).   <STRONG>clear</STRONG>  looks in the environment for the terminal type given
+       by the environment variable <STRONG>TERM</STRONG>, and then in the <STRONG>terminfo</STRONG> database  to
+       determine how to clear the screen.
+
+       <STRONG>clear</STRONG>  writes  to  the  standard output.  You can redirect the standard
+       output to a file (which  prevents  <STRONG>clear</STRONG>  from  actually  clearing  the
+       screen),  and  later  <STRONG>cat</STRONG>  the  file to the screen, clearing it at that
+       point.
+
+
+</PRE><H2><a name="h2-OPTIONS">OPTIONS</a></H2><PRE>
+       <STRONG>-T</STRONG> <EM>type</EM>
+            indicates  the  <EM>type</EM>  of  terminal.   Normally  this   option   is
+            unnecessary,  because  the  default  is taken from the environment
+            variable <STRONG>TERM</STRONG>.  If <STRONG>-T</STRONG> is specified, then the shell variables <STRONG>LINES</STRONG>
+            and <STRONG>COLUMNS</STRONG> will also be ignored.
+
+       <STRONG>-V</STRONG>   reports the version of ncurses which was used in this program, and
+            exits.  The options are as follows:
+
+       <STRONG>-x</STRONG>   do not attempt to clear the terminal's scrollback buffer using the
+            extended "E3" capability.
+
+
+</PRE><H2><a name="h2-HISTORY">HISTORY</a></H2><PRE>
+       A  <STRONG>clear</STRONG>  command  appeared  in 2.79BSD dated February 24, 1979.  Later
+       that was provided in Unix 8th edition (1985).
+
+       AT&amp;T adapted a different BSD program  (<STRONG>tset</STRONG>)  to  make  a  new  command
+       (<STRONG>tput</STRONG>),  and used this to replace the <STRONG>clear</STRONG> command with a shell script
+       which calls <STRONG>tput</STRONG> <STRONG>clear</STRONG>, e.g.,
+
+           /usr/bin/tput ${1:+-T$1} clear 2&gt; /dev/null
+           exit
+
+       In 1989, when Keith Bostic revised the BSD  <STRONG>tput</STRONG>  command  to  make  it
+       similar  to  the  AT&amp;T  <STRONG>tput</STRONG>,  he  added  a  shell script for the <STRONG>clear</STRONG>
+       command:
+
+           exec tput clear
+
+       The remainder of the script in each case is a copyright notice.
+
+       The ncurses <STRONG>clear</STRONG> command began in 1995 by adapting  the  original  BSD
+       <STRONG>clear</STRONG> command (with terminfo, of course).
+
+       The <STRONG>E3</STRONG> extension came later:
+
+       <STRONG>o</STRONG>   In  June  1999, <STRONG>xterm</STRONG> provided an extension to the standard control
+           sequence for clearing the screen.  Rather than  clearing  just  the
+           visible part of the screen using
+
+               printf '\033[2J'
+
+           one could clear the <EM>scrollback</EM> using
+
+               printf '\033[<STRONG>3</STRONG>J'
+
+           This  is  documented  in  <EM>XTerm</EM>  <EM>Control</EM>  <EM>Sequences</EM>  as  a  feature
+           originating with <STRONG>xterm</STRONG>.
+
+       <STRONG>o</STRONG>   A few other terminal developers adopted the feature, e.g., PuTTY in
+           2006.
+
+       <STRONG>o</STRONG>   In  April  2011, a Red Hat developer submitted a patch to the Linux
+           kernel, modifying its console driver to do  the  same  thing.   The
+           Linux  change,  part  of  the  3.0  release, did not mention <STRONG>xterm</STRONG>,
+           although it was cited in the Red Hat bug report (#683733) which led
+           to the change.
+
+       <STRONG>o</STRONG>   Again,  a  few  other terminal developers adopted the feature.  But
+           the next relevant step was a change to the <STRONG>clear</STRONG> program in 2013 to
+           incorporate this extension.
+
+       <STRONG>o</STRONG>   In  2013,  the <STRONG>E3</STRONG> extension was overlooked in <STRONG>tput</STRONG> with the "clear"
+           parameter.  That was addressed in  2016  by  reorganizing  <STRONG>tput</STRONG>  to
+           share its logic with <STRONG>clear</STRONG> and <STRONG>tset</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       Neither IEEE Std 1003.1/The Open  Group  Base  Specifications  Issue  7
+       (POSIX.1-2008) nor X/Open Curses Issue 7 documents tset or reset.
+
+       The latter documents <STRONG>tput</STRONG>, which could be used to replace this  utility
+       either  via  a shell script or by an alias (such as a symbolic link) to
+       run <STRONG>tput</STRONG> as <STRONG>clear</STRONG>.
+
+
+</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 20221231).
+
+
+
+                                                                      <STRONG><A HREF="clear.1.html">clear(1)</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></li>
+<li><a href="#h2-OPTIONS">OPTIONS</a></li>
+<li><a href="#h2-HISTORY">HISTORY</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_add_wch.3x.html b/doc/html/man/curs_add_wch.3x.html
new file mode 100644
index 0000000..7a4ad42
--- /dev/null
+++ b/doc/html/man/curs_add_wch.3x.html
@@ -0,0 +1,313 @@
+<!--
+  ****************************************************************************
+  * Copyright 2019-2020,2021 Thomas E. Dickey                                *
+  * Copyright 2001-2015,2017 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_add_wch.3x,v 1.31 2021/12/25 21:37:49 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_add_wch 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_add_wch 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_add_wch.3x.html">curs_add_wch(3x)</A></STRONG>                                              <STRONG><A HREF="curs_add_wch.3x.html">curs_add_wch(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>add_wch</STRONG>, <STRONG>wadd_wch</STRONG>, <STRONG>mvadd_wch</STRONG>, <STRONG>mvwadd_wch</STRONG>, <STRONG>echo_wchar</STRONG>, <STRONG>wecho_wchar</STRONG> - add
+       a complex character and rendition to a <STRONG>curses</STRONG> window, then advance  the
+       cursor
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>add_wch(</STRONG> <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>wch</EM> <STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wadd_wch(</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>wch</EM> <STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvadd_wch(</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>wch</EM> <STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvwadd_wch(</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>wch</EM> <STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>echo_wchar(</STRONG> <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>wch</EM> <STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wecho_wchar(</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>wch</EM> <STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+
+</PRE><H3><a name="h3-add_wch">add_wch</a></H3><PRE>
+       The  <STRONG>add_wch</STRONG>,  <STRONG>wadd_wch</STRONG>,  <STRONG>mvadd_wch</STRONG>,  and  <STRONG>mvwadd_wch</STRONG> functions put the
+       complex character <EM>wch</EM> into the given window at  its  current  position,
+       which  is then advanced.  These functions perform wrapping and special-
+       character processing as follows:
+
+       <STRONG>o</STRONG>   If <EM>wch</EM> refers to a spacing character, then any  previous  character
+           at  that  location is removed.  A new character specified by <EM>wch</EM> is
+           placed at that location  with  rendition  specified  by  <EM>wch</EM>.   The
+           cursor then advances to the next spacing character on the screen.
+
+       <STRONG>o</STRONG>   If  <EM>wch</EM>  refers to a non-spacing character, all previous characters
+           at that location are preserved.  The non-spacing characters of  <EM>wch</EM>
+           are  added  to  the  spacing  complex  character, and the rendition
+           specified by <EM>wch</EM> is ignored.
+
+       <STRONG>o</STRONG>   If the character part of <EM>wch</EM> is a tab, newline, backspace or  other
+           control character, the window is updated and the cursor moves as if
+           <STRONG>addch</STRONG> were called.
+
+
+</PRE><H3><a name="h3-echo_wchar">echo_wchar</a></H3><PRE>
+       The <STRONG>echo_wchar</STRONG> function is functionally equivalent to a call to <STRONG>add_wch</STRONG>
+       followed  by  a  call  to  <STRONG><A HREF="curs_refresh.3x.html">refresh(3x)</A></STRONG>.   Similarly, the <STRONG>wecho_wchar</STRONG> is
+       functionally equivalent to a call to <STRONG>wadd_wch</STRONG> followed  by  a  call  to
+       <STRONG>wrefresh</STRONG>.   The  knowledge that only a single character is being output
+       is  taken  into  consideration  and,  for  non-control  characters,   a
+       considerable  performance  gain  might  be  seen  by  using  the *<STRONG>echo</STRONG>*
+       functions instead of their equivalents.
+
+
+</PRE><H3><a name="h3-Line-Graphics">Line Graphics</a></H3><PRE>
+       Like <STRONG><A HREF="curs_addch.3x.html">addch(3x)</A></STRONG>, <STRONG>addch_wch</STRONG> accepts symbols which make it simple to  draw
+       lines  and  other  frequently  used  special characters.  These symbols
+       correspond to the same VT100 line-drawing set as <STRONG><A HREF="curs_addch.3x.html">addch(3x)</A></STRONG>.
+
+       <STRONG>ACS</STRONG>               <STRONG>Unicode</STRONG>    <STRONG>ASCII</STRONG>     <STRONG>acsc</STRONG>    <STRONG>Glyph</STRONG>
+       <STRONG>Name</STRONG>              <STRONG>Default</STRONG>    <STRONG>Default</STRONG>   <STRONG>char</STRONG>    <STRONG>Name</STRONG>
+       ------------------------------------------------------------------------
+       WACS_BLOCK        0x25ae     #         0       solid square block
+       WACS_BOARD        0x2592     #         h       board of squares
+       WACS_BTEE         0x2534     +         v       bottom tee
+       WACS_BULLET       0x00b7     o         ~       bullet
+       WACS_CKBOARD      0x2592     :         a       checker board (stipple)
+       WACS_DARROW       0x2193     v         .       arrow pointing down
+       WACS_DEGREE       0x00b0     '         f       degree symbol
+
+       WACS_DIAMOND      0x25c6     +         `       diamond
+       WACS_GEQUAL       0x2265     &gt;         &gt;       greater-than-or-equal-to
+       WACS_HLINE        0x2500     -         q       horizontal line
+       WACS_LANTERN      0x2603     #         i       lantern symbol
+       WACS_LARROW       0x2190     &lt;         ,       arrow pointing left
+       WACS_LEQUAL       0x2264     &lt;         y       less-than-or-equal-to
+       WACS_LLCORNER     0x2514     +         m       lower left-hand corner
+       WACS_LRCORNER     0x2518     +         j       lower right-hand corner
+       WACS_LTEE         0x2524     +         t       left tee
+       WACS_NEQUAL       0x2260     !         |       not-equal
+       WACS_PI           0x03c0     *         {       greek pi
+       WACS_PLMINUS      0x00b1     #         g       plus/minus
+       WACS_PLUS         0x253c     +         n       plus
+       WACS_RARROW       0x2192     &gt;         +       arrow pointing right
+       WACS_RTEE         0x251c     +         u       right tee
+       WACS_S1           0x23ba     -         o       scan line 1
+       WACS_S3           0x23bb     -         p       scan line 3
+       WACS_S7           0x23bc     -         r       scan line 7
+       WACS_S9           0x23bd     _         s       scan line 9
+       WACS_STERLING     0x00a3     f         }       pound-sterling symbol
+       WACS_TTEE         0x252c     +         w       top tee
+       WACS_UARROW       0x2191     ^         -       arrow pointing up
+       WACS_ULCORNER     0x250c     +         l       upper left-hand corner
+       WACS_URCORNER     0x2510     +         k       upper right-hand corner
+       WACS_VLINE        0x2502     |         x       vertical line
+
+       The wide-character configuration of ncurses also  defines  symbols  for
+       thick lines (<STRONG>acsc</STRONG> "J" to "V"):
+
+       <STRONG>ACS</STRONG>               <STRONG>Unicode</STRONG>   <STRONG>ASCII</STRONG>     <STRONG>acsc</STRONG>    <STRONG>Glyph</STRONG>
+       <STRONG>Name</STRONG>              <STRONG>Default</STRONG>   <STRONG>Default</STRONG>   <STRONG>char</STRONG>    <STRONG>Name</STRONG>
+       -----------------------------------------------------------------------
+       WACS_T_BTEE       0x253b    +         V       thick tee pointing up
+       WACS_T_HLINE      0x2501    -         Q       thick horizontal line
+       WACS_T_LLCORNER   0x2517    +         M       thick lower left corner
+       WACS_T_LRCORNER   0x251b    +         J       thick lower right corner
+       WACS_T_LTEE       0x252b    +         T       thick tee pointing right
+       WACS_T_PLUS       0x254b    +         N       thick large plus
+       WACS_T_RTEE       0x2523    +         U       thick tee pointing left
+       WACS_T_TTEE       0x2533    +         W       thick tee pointing down
+       WACS_T_ULCORNER   0x250f    +         L       thick upper left corner
+       WACS_T_URCORNER   0x2513    +         K       thick upper right corner
+       WACS_T_VLINE      0x2503    |         X       thick vertical line
+
+       and for double-lines (<STRONG>acsc</STRONG> "A" to "I"):
+
+       <STRONG>ACS</STRONG>               <STRONG>Unicode</STRONG>   <STRONG>ASCII</STRONG>     <STRONG>acsc</STRONG>    <STRONG>Glyph</STRONG>
+       <STRONG>Name</STRONG>              <STRONG>Default</STRONG>   <STRONG>Default</STRONG>   <STRONG>char</STRONG>    <STRONG>Name</STRONG>
+       ------------------------------------------------------------------------
+       WACS_D_BTEE       0x2569    +         H       double tee pointing up
+       WACS_D_HLINE      0x2550    -         R       double horizontal line
+       WACS_D_LLCORNER   0x255a    +         D       double lower left corner
+       WACS_D_LRCORNER   0x255d    +         A       double lower right corner
+       WACS_D_LTEE       0x2560    +         F       double tee pointing right
+       WACS_D_PLUS       0x256c    +         E       double large plus
+       WACS_D_RTEE       0x2563    +         G       double tee pointing left
+       WACS_D_TTEE       0x2566    +         I       double tee pointing down
+       WACS_D_ULCORNER   0x2554    +         C       double upper left corner
+       WACS_D_URCORNER   0x2557    +         B       double upper right corner
+       WACS_D_VLINE      0x2551    |         Y       double vertical line
+
+       Unicode's  descriptions  for  these  characters  differs  slightly from
+       ncurses, by introducing the term "light"  (along  with  less  important
+       details).   Here are its descriptions for the normal, thick, and double
+       horizontal lines:
+
+       <STRONG>o</STRONG>   U+2500 BOX DRAWINGS LIGHT HORIZONTAL
+
+       <STRONG>o</STRONG>   U+2501 BOX DRAWINGS HEAVY HORIZONTAL
+
+       <STRONG>o</STRONG>   U+2550 BOX DRAWINGS DOUBLE HORIZONTAL
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       All routines return the integer <STRONG>ERR</STRONG> upon failure and <STRONG>OK</STRONG> on success.
+
+       X/Open does not  define  any  error  conditions.   This  implementation
+       returns an error
+
+       <STRONG>o</STRONG>   if the window pointer is null or
+
+       <STRONG>o</STRONG>   if it is not possible to add a complete character in the window.
+
+       The latter may be due to different causes:
+
+       <STRONG>o</STRONG>   If  <STRONG>scrollok</STRONG> is not enabled, writing a character at the lower right
+           margin succeeds.  However, an error is returned because it  is  not
+           possible to wrap to a new line
+
+       <STRONG>o</STRONG>   If  an error is detected when converting a multibyte character to a
+           sequence of bytes, or if it is not  possible  to  add  all  of  the
+           resulting bytes in the window, an error is returned.
+
+       Functions  with  a  "mv"  prefix  first perform a cursor movement using
+       <STRONG>wmove</STRONG>, and return an error if the position is outside the window, or if
+       the window pointer is null.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       Note that <STRONG>add_wch</STRONG>, <STRONG>mvadd_wch</STRONG>, <STRONG>mvwadd_wch</STRONG>, and <STRONG>echo_wchar</STRONG> may be macros.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       All  of these functions are described in the XSI Curses standard, Issue
+       4.  The defaults specified for line-drawing  characters  apply  in  the
+       POSIX locale.
+
+       X/Open  Curses  makes it clear that the WACS_ symbols should be defined
+       as a pointer to <STRONG>cchar_t</STRONG> data, e.g., in the discussion of <STRONG>border_set</STRONG>.  A
+       few implementations are problematic:
+
+       <STRONG>o</STRONG>   NetBSD curses defines the symbols as a <STRONG>wchar_t</STRONG> within a <STRONG>cchar_t</STRONG>.
+
+       <STRONG>o</STRONG>   HPUX curses equates some of the <STRONG>ACS_</STRONG> symbols to the analogous <STRONG>WACS_</STRONG>
+           symbols  as  if  the  <STRONG>ACS_</STRONG>  symbols  were  wide  characters.    The
+           misdefined  symbols  are the arrows and other symbols which are not
+           used for line-drawing.
+
+       X/Open Curses does not define symbols for thick- or double-lines.  SVr4
+       curses  implementations  defined their line-drawing symbols in terms of
+       intermediate  symbols.   This  implementation  extends  those  symbols,
+       providing new definitions which are not in the SVr4 implementations.
+
+       Not  all  Unicode-capable  terminals  provide  support  for VT100-style
+       alternate character  sets  (i.e.,  the  <STRONG>acsc</STRONG>  capability),  with  their
+       corresponding  line-drawing  characters.  X/Open Curses did not address
+       the  aspect  of  integrating  Unicode  with  line-drawing   characters.
+       Existing  implementations  of Unix curses (AIX, HPUX, Solaris) use only
+       the <STRONG>acsc</STRONG> character-mapping to provide this feature.  As a result, those
+       implementations  can  only  use  single-byte  line-drawing  characters.
+       Ncurses 5.3 (2002) provided a table of Unicode values  to  solve  these
+       problems.  NetBSD curses incorporated that table in 2010.
+
+       In  this  implementation,  the  Unicode  values are used instead of the
+       terminal description's <STRONG>acsc</STRONG> mapping as discussed in <STRONG><A HREF="ncurses.3x.html">ncurses(3x)</A></STRONG> for the
+       environment  variable  <STRONG>NCURSES_NO_UTF8_ACS</STRONG>.   In contrast, for the same
+       cases, the line-drawing characters described in <STRONG><A HREF="curs_addch.3x.html">curs_addch(3x)</A></STRONG> will use
+       only the ASCII default values.
+
+       Having  Unicode available does not solve all of the problems with line-
+       drawing for curses:
+
+       <STRONG>o</STRONG>   The closest Unicode equivalents to the VT100 graphics  <EM>S1</EM>,  <EM>S3</EM>,  <EM>S7</EM>
+           and  <EM>S9</EM> frequently are not displayed at the regular intervals which
+           the terminal used.
+
+       <STRONG>o</STRONG>   The <EM>lantern</EM> is a special case.  It originated with  the  AT&amp;T  4410
+           terminal  in the early 1980s.  There is no accessible documentation
+           depicting the lantern symbol on the AT&amp;T terminal.
+
+           Lacking documentation, most readers assume that a <EM>storm</EM> <EM>lantern</EM> was
+           intended.  But there are several possibilities, all with problems.
+
+           Unicode  6.0  (2010)  does provide two lantern symbols: U+1F383 and
+           U+1F3EE.  Those were not available  in  2002,  and  are  irrelevant
+           since  they  lie  outside the BMP and as a result are not generally
+           available in terminals.  They are not storm lanterns, in any case.
+
+           Most <EM>storm</EM> <EM>lanterns</EM> have a tapering glass chimney (to guard against
+           tipping); some have a wire grid protecting the chimney.
+
+           For  the  tapering  appearance,   U+2603 was adequate.  In use on a
+           terminal, no one can tell what the image represents.  Unicode calls
+           it a snowman.
+
+           Others have suggested these alternatives: &lt;section&gt; U+00A7 (section
+           mark), &lt;Theta&gt; U+0398 (theta), &lt;Phi&gt; U+03A6 (phi),  &lt;delta&gt;  U+03B4
+           (delta),  U+2327 (x in a rectangle),  U+256C (forms double vertical
+           and horizontal), and  U+2612 (ballot box with x).
+
+
+</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_addch.3x.html">curs_addch(3x)</A></STRONG>, <STRONG><A HREF="curs_attr.3x.html">curs_attr(3x)</A></STRONG>, <STRONG><A HREF="curs_clear.3x.html">curs_clear(3x)</A></STRONG>,
+       <STRONG><A HREF="curs_outopts.3x.html">curs_outopts(3x)</A></STRONG>, <STRONG><A HREF="curs_refresh.3x.html">curs_refresh(3x)</A></STRONG>, <STRONG>putwc(3)</STRONG>
+
+
+
+                                                              <STRONG><A HREF="curs_add_wch.3x.html">curs_add_wch(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-add_wch">add_wch</a></li>
+<li><a href="#h3-echo_wchar">echo_wchar</a></li>
+<li><a href="#h3-Line-Graphics">Line Graphics</a></li>
+</ul>
+</li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_add_wchstr.3x.html b/doc/html/man/curs_add_wchstr.3x.html
new file mode 100644
index 0000000..5e93f68
--- /dev/null
+++ b/doc/html/man/curs_add_wchstr.3x.html
@@ -0,0 +1,137 @@
+<!--
+  ****************************************************************************
+  * Copyright 2019-2021,2022 Thomas E. Dickey                                *
+  * Copyright 2002-2012,2017 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_add_wchstr.3x,v 1.19 2022/02/12 20:07:29 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_add_wchstr 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_add_wchstr 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_add_wchstr.3x.html">curs_add_wchstr(3x)</A></STRONG>                                        <STRONG><A HREF="curs_add_wchstr.3x.html">curs_add_wchstr(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>add_wchstr</STRONG>, <STRONG>add_wchnstr</STRONG>, <STRONG>wadd_wchstr</STRONG>, <STRONG>wadd_wchnstr</STRONG>, <STRONG>mvadd_wchstr</STRONG>,
+       <STRONG>mvadd_wchnstr</STRONG>, <STRONG>mvwadd_wchstr</STRONG>, <STRONG>mvwadd_wchnstr</STRONG> - add an array of complex
+       characters (and attributes) to a curses window
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>add_wchstr(const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>wchstr</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>add_wchnstr(const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>wchstr</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wadd_wchstr(WINDOW</STRONG> <STRONG>*</STRONG> <EM>win</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>wchstr</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wadd_wchnstr(WINDOW</STRONG> <STRONG>*</STRONG> <EM>win</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>wchstr</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>mvadd_wchstr(int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>wchstr</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvadd_wchnstr(int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>wchstr</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvwadd_wchstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>wchstr</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvwadd_wchnstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>wchstr</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       These  functions copy the (null-terminated) array of complex characters
+       <EM>wchstr</EM> into the window image structure starting at the  current  cursor
+       position.   The four functions with <EM>n</EM> as the last argument copy at most
+       <EM>n</EM> elements, but no more than will fit on the line.  If  <STRONG>n</STRONG>=<STRONG>-1</STRONG>  then  the
+       whole  array  is  copied, to the maximum number of characters that will
+       fit on the line.
+
+       The window cursor is <EM>not</EM> advanced.  These functions  work  faster  than
+       <STRONG>waddnstr</STRONG>.  On the other hand:
+
+       <STRONG>o</STRONG>   they  do  not perform checking (such as for the newline, backspace,
+           or carriage return characters),
+
+       <STRONG>o</STRONG>   they do not advance the current cursor position,
+
+       <STRONG>o</STRONG>   they do not expand other control characters to ^-escapes, and
+
+       <STRONG>o</STRONG>   they truncate the string if it crosses  the  right  margin,  rather
+           than wrapping it around to the new line.
+
+       These  functions  end  successfully  on encountering a null <STRONG>cchar_t</STRONG>, or
+       when they have filled the current line.  If a complex character  cannot
+       completely  fit  at  the end of the current line, the remaining columns
+       are filled with the background character and rendition.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       All functions return the integer <STRONG>ERR</STRONG> upon failure and <STRONG>OK</STRONG> on success.
+
+       X/Open does not define any error conditions.  This  implementation  re-
+       turns an error if the window pointer is null.
+
+       Functions  with  a  "mv"  prefix  first perform a cursor movement using
+       <STRONG>wmove</STRONG>, and return an error if the position is outside the window, or if
+       the window pointer is null.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       All functions except <STRONG>wadd_wchnstr</STRONG> may be macros.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These entry points are described in the XSI Curses standard, Issue 4.
+
+
+</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_addwstr.3x.html">curs_addwstr(3x)</A></STRONG>.
+
+       Comparable  functions in the narrow-character (ncurses) library are de-
+       scribed in <STRONG><A HREF="curs_addchstr.3x.html">curs_addchstr(3x)</A></STRONG>.
+
+
+
+                                                           <STRONG><A HREF="curs_add_wchstr.3x.html">curs_add_wchstr(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_addch.3x.html b/doc/html/man/curs_addch.3x.html
new file mode 100644
index 0000000..92f2c75
--- /dev/null
+++ b/doc/html/man/curs_addch.3x.html
@@ -0,0 +1,327 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2015,2017 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_addch.3x,v 1.59 2022/02/12 20:07:29 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_addch 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_addch 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_addch.3x.html">curs_addch(3x)</A></STRONG>                                                  <STRONG><A HREF="curs_addch.3x.html">curs_addch(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>addch</STRONG>, <STRONG>waddch</STRONG>, <STRONG>mvaddch</STRONG>, <STRONG>mvwaddch</STRONG>, <STRONG>echochar</STRONG>, <STRONG>wechochar</STRONG> - add a character
+       (with attributes) to a <STRONG>curses</STRONG> window, then advance the cursor
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>addch(const</STRONG> <STRONG>chtype</STRONG> <EM>ch</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>waddch(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>chtype</STRONG> <EM>ch</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvaddch(int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>chtype</STRONG> <EM>ch</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvwaddch(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>chtype</STRONG> <EM>ch</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>echochar(const</STRONG> <STRONG>chtype</STRONG> <EM>ch</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wechochar(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>chtype</STRONG> <EM>ch</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+
+</PRE><H3><a name="h3-Adding-characters">Adding characters</a></H3><PRE>
+       The <STRONG>addch</STRONG>, <STRONG>waddch</STRONG>, <STRONG>mvaddch</STRONG> and <STRONG>mvwaddch</STRONG> routines put the  character  <EM>ch</EM>
+       into  the  given  window  at its current window position, which is then
+       advanced.  They are  analogous  to  <STRONG>putchar(3)</STRONG>  in  <STRONG>stdio(3)</STRONG>.   If  the
+       advance is at the right margin:
+
+       <STRONG>o</STRONG>   The cursor automatically wraps to the beginning of the next line.
+
+       <STRONG>o</STRONG>   At  the  bottom of the current scrolling region, and if <STRONG>scrollok</STRONG> is
+           enabled, the scrolling region is scrolled up one line.
+
+       <STRONG>o</STRONG>   If <STRONG>scrollok</STRONG> is not enabled, writing a character at the lower  right
+           margin  succeeds.   However, an error is returned because it is not
+           possible to wrap to a new line
+
+       If <EM>ch</EM> is a tab, newline, carriage return or backspace,  the  cursor  is
+       moved appropriately within the window:
+
+       <STRONG>o</STRONG>   Backspace  moves the cursor one character left; at the left edge of
+           a window it does nothing.
+
+       <STRONG>o</STRONG>   Carriage return moves the cursor to the window left margin  on  the
+           current line.
+
+       <STRONG>o</STRONG>   Newline  does  a <STRONG>clrtoeol</STRONG>, then moves the cursor to the window left
+           margin on the next line, scrolling the window if on the last line.
+
+       <STRONG>o</STRONG>   Tabs are considered to be at every eighth column.  The tab interval
+           may be altered by setting the <STRONG>TABSIZE</STRONG> variable.
+
+       If  <EM>ch</EM>  is  any  other nonprintable character, it is drawn in printable
+       form, i.e., the <STRONG>^</STRONG><EM>X</EM> notation used by <STRONG><A HREF="unctrl.3x.html">unctrl(3x)</A></STRONG>.   Calling  <STRONG>winch</STRONG>  after
+       adding  a  nonprintable character does not return the character itself,
+       but instead returns the printable representation of the character.
+
+       Video attributes can be combined with a character  argument  passed  to
+       <STRONG>addch</STRONG>  or  related  functions by logical-ORing them into the character.
+       (Thus, text, including attributes, can be  copied  from  one  place  to
+       another  using  <STRONG><A HREF="curs_inch.3x.html">inch(3x)</A></STRONG>  and  <STRONG>addch</STRONG>.)   See the <STRONG><A HREF="curs_attr.3x.html">curs_attr(3x)</A></STRONG> page for
+       values of predefined video attribute constants  that  can  be  usefully
+       OR'ed into characters.
+
+
+</PRE><H3><a name="h3-Echoing-characters">Echoing characters</a></H3><PRE>
+       The  <STRONG>echochar</STRONG>  and <STRONG>wechochar</STRONG> routines are equivalent to a call to <STRONG>addch</STRONG>
+       followed by a call to <STRONG><A HREF="curs_refresh.3x.html">refresh(3x)</A></STRONG>, or a call to <STRONG>waddch</STRONG>  followed  by  a
+       call  to <STRONG>wrefresh</STRONG>.  The knowledge that only a single character is being
+       output  is  used  and,  for  non-control  characters,  a   considerable
+       performance  gain  may be seen by using these routines instead of their
+       equivalents.
+
+
+</PRE><H3><a name="h3-Line-Graphics">Line Graphics</a></H3><PRE>
+       The following variables may be used to add line drawing  characters  to
+       the  screen  with  routines of the <STRONG>addch</STRONG> family.  The default character
+       listed below is used if the <STRONG>acsc</STRONG> capability does not define a terminal-
+       specific   replacement   for   it,   or  if  the  terminal  and  locale
+       configuration requires  Unicode  but  the  library  is  unable  to  use
+       Unicode.
+
+       The names are taken from VT100 nomenclature.
+
+       <STRONG>ACS</STRONG>            <STRONG>ACS</STRONG>       <STRONG>acsc</STRONG>   <STRONG>Glyph</STRONG>
+       <STRONG>Name</STRONG>           <STRONG>Default</STRONG>   <STRONG>char</STRONG>   <STRONG>Name</STRONG>
+       ---------------------------------------------------------
+       ACS_BLOCK      #         0      solid square block
+       ACS_BOARD      #         h      board of squares
+       ACS_BTEE       +         v      bottom tee
+       ACS_BULLET     o         ~      bullet
+       ACS_CKBOARD    :         a      checker board (stipple)
+       ACS_DARROW     v         .      arrow pointing down
+       ACS_DEGREE     '         f      degree symbol
+       ACS_DIAMOND    +         `      diamond
+       ACS_GEQUAL     &gt;         &gt;      greater-than-or-equal-to
+       ACS_HLINE      -         q      horizontal line
+       ACS_LANTERN    #         i      lantern symbol
+       ACS_LARROW     &lt;         ,      arrow pointing left
+       ACS_LEQUAL     &lt;         y      less-than-or-equal-to
+       ACS_LLCORNER   +         m      lower left-hand corner
+       ACS_LRCORNER   +         j      lower right-hand corner
+       ACS_LTEE       +         t      left tee
+       ACS_NEQUAL     !         |      not-equal
+       ACS_PI         *         {      greek pi
+       ACS_PLMINUS    #         g      plus/minus
+       ACS_PLUS       +         n      plus
+       ACS_RARROW     &gt;         +      arrow pointing right
+       ACS_RTEE       +         u      right tee
+       ACS_S1         -         o      scan line 1
+       ACS_S3         -         p      scan line 3
+       ACS_S7         -         r      scan line 7
+       ACS_S9         _         s      scan line 9
+       ACS_STERLING   f         }      pound-sterling symbol
+       ACS_TTEE       +         w      top tee
+       ACS_UARROW     ^         -      arrow pointing up
+       ACS_ULCORNER   +         l      upper left-hand corner
+       ACS_URCORNER   +         k      upper right-hand corner
+       ACS_VLINE      |         x      vertical line
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       All routines return the integer <STRONG>ERR</STRONG> upon failure and <STRONG>OK</STRONG> on success (the
+       SVr4 manuals specify only "an  integer  value  other  than  <STRONG>ERR</STRONG>")  upon
+       successful  completion, unless otherwise noted in the preceding routine
+       descriptions.
+
+       Functions with a "mv" prefix first  perform  a  cursor  movement  using
+       <STRONG>wmove</STRONG>, and return an error if the position is outside the window, or if
+       the window pointer is null.
+
+       If it is not  possible  to  add  a  complete  character,  an  error  is
+       returned:
+
+       <STRONG>o</STRONG>   If  <STRONG>scrollok</STRONG> is not enabled, writing a character at the lower right
+           margin succeeds.  However, an error is returned because it  is  not
+           possible to wrap to a new line
+
+       <STRONG>o</STRONG>   If  an error is detected when converting a multibyte character to a
+           sequence of bytes, or if it is not  possible  to  add  all  of  the
+           resulting bytes in the window, an error is returned.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       Note that <STRONG>addch</STRONG>, <STRONG>mvaddch</STRONG>, <STRONG>mvwaddch</STRONG>, and <STRONG>echochar</STRONG> may be macros.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       All  these functions are described in the XSI Curses standard, Issue 4.
+       The defaults specified for forms-drawing characters apply in the  POSIX
+       locale.
+
+
+</PRE><H3><a name="h3-ACS-Symbols">ACS Symbols</a></H3><PRE>
+       X/Open Curses states that the <STRONG>ACS_</STRONG> definitions are <STRONG>char</STRONG> constants.  For
+       the  wide-character  implementation  (see  <STRONG>curs_add_wch</STRONG>),   there   are
+       analogous   <STRONG>WACS_</STRONG>   definitions  which  are  <STRONG>cchar_t</STRONG>  constants.   Some
+       implementations are problematic:
+
+       <STRONG>o</STRONG>   Some implementations define the ACS symbols to a constant (such  as
+           Solaris), while others define those to entries in an array.
+
+           This  implementation uses an array <STRONG>acs_map</STRONG>, as done in SVr4 curses.
+           NetBSD also uses an array, actually named <STRONG>_acs_char</STRONG>, with a <STRONG>#define</STRONG>
+           for compatibility.
+
+       <STRONG>o</STRONG>   HPUX curses equates some of the <STRONG>ACS_</STRONG> symbols to the analogous <STRONG>WACS_</STRONG>
+           symbols  as  if  the  <STRONG>ACS_</STRONG>  symbols  were  wide  characters.    The
+           misdefined  symbols  are the arrows and other symbols which are not
+           used for line-drawing.
+
+       <STRONG>o</STRONG>   X/Open Curses (issues 2 through 7) has a  typographical  error  for
+           the  ACS_LANTERN  symbol,  equating  its  "VT100+  Character"  to <STRONG>I</STRONG>
+           (capital I), while the header files for SVr4 curses and the various
+           implementations use <STRONG>i</STRONG> (lowercase).
+
+           None  of the terminal descriptions on Unix platforms use uppercase-
+           I,  except  for  Solaris  (i.e.,  <STRONG>screen</STRONG>'s  terminal   description,
+           apparently  based on the X/Open documentation around 1995).  On the
+           other hand, the terminal description <EM>gs6300</EM> (AT&amp;T PC6300 with EMOTS
+           Terminal Emulator) uses lowercase-i.
+
+       Some  ACS  symbols  (ACS_S3,  ACS_S7,  ACS_LEQUAL,  ACS_GEQUAL, ACS_PI,
+       ACS_NEQUAL, ACS_STERLING) were not documented in any publicly  released
+       System  V.   However,  many  publicly  available terminfos include <STRONG>acsc</STRONG>
+       strings in which their key characters (pryz{|})  are  embedded,  and  a
+       second-hand  list  of  their  character descriptions has come to light.
+       The ACS-prefixed names for them were invented for <STRONG><A HREF="ncurses.3x.html">ncurses(3x)</A></STRONG>.
+
+       The <EM>displayed</EM> values for the <STRONG>ACS_</STRONG> and <STRONG>WACS_</STRONG> constants depend on
+
+       <STRONG>o</STRONG>   the library configuration, i.e., <STRONG>ncurses</STRONG> versus <STRONG>ncursesw</STRONG>, where the
+           latter  is  capable  of displaying Unicode while the former is not,
+           and
+
+       <STRONG>o</STRONG>   whether the <EM>locale</EM> uses UTF-8 encoding.
+
+       In certain cases,  the  terminal  is  unable  to  display  line-drawing
+       characters   except   by   using   UTF-8   (see   the   discussion   of
+       <STRONG>NCURSES_NO_UTF8_ACS</STRONG> in <STRONG><A HREF="ncurses.3x.html">ncurses(3x)</A></STRONG>).
+
+
+</PRE><H3><a name="h3-Character-Set">Character Set</a></H3><PRE>
+       X/Open Curses assumes that the parameter passed to  <STRONG>waddch</STRONG>  contains  a
+       single  character.   As  discussed in <STRONG><A HREF="curs_attr.3x.html">curs_attr(3x)</A></STRONG>, that character may
+       have been more than eight bits in an SVr3 or SVr4  implementation,  but
+       in  the  X/Open Curses model, the details are not given.  The important
+       distinction between SVr4 curses and X/Open  Curses  is  that  the  non-
+       character  information  (attributes  and  color) was separated from the
+       character information which is packed in a <STRONG>chtype</STRONG> to pass to <STRONG>waddch</STRONG>.
+
+       In this implementation,  <STRONG>chtype</STRONG>  holds  an  eight-bit  character.   But
+       ncurses  allows  multibyte  characters  to be passed in a succession of
+       calls to <STRONG>waddch</STRONG>.  The other implementations do not do this; a  call  to
+       <STRONG>waddch</STRONG>  passes  exactly  one  character which may be rendered as one or
+       more cells on the screen depending on whether it is printable.
+
+       Depending on the locale settings, ncurses will inspect the byte  passed
+       in  each  call  to <STRONG>waddch</STRONG>, and check if the latest call will continue a
+       multibyte sequence.  When a character is <EM>complete</EM>, ncurses displays the
+       character and moves to the next position in the screen.
+
+       If  the  calling  application  interrupts  the succession of bytes in a
+       multibyte character by moving the current location (e.g., using <STRONG>wmove</STRONG>),
+       ncurses discards the partially built character, starting over again.
+
+       For  portability  to  other  implementations,  do  not  rely  upon this
+       behavior:
+
+       <STRONG>o</STRONG>   check if a character can be represented as a  single  byte  in  the
+           current locale before attempting call <STRONG>waddch</STRONG>, and
+
+       <STRONG>o</STRONG>   call <STRONG>wadd_wch</STRONG> for characters which cannot be handled by <STRONG>waddch</STRONG>.
+
+
+</PRE><H3><a name="h3-TABSIZE">TABSIZE</a></H3><PRE>
+       The  <STRONG>TABSIZE</STRONG>  variable  is  implemented  in  SVr4 and other versions of
+       curses, but is not part of X/Open curses  (see  <STRONG><A HREF="curs_variables.3x.html">curs_variables(3x)</A></STRONG>  for
+       more details).
+
+       If <EM>ch</EM> is a carriage return, the cursor is moved to the beginning of the
+       current row of the window.  This is true of other implementations,  but
+       is not documented.
+
+
+</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_attr.3x.html">curs_attr(3x)</A></STRONG>,      <STRONG><A HREF="curs_clear.3x.html">curs_clear(3x)</A></STRONG>,     <STRONG><A HREF="curs_inch.3x.html">curs_inch(3x)</A></STRONG>,
+       <STRONG><A HREF="curs_outopts.3x.html">curs_outopts(3x)</A></STRONG>, <STRONG><A HREF="curs_refresh.3x.html">curs_refresh(3x)</A></STRONG>, <STRONG><A HREF="curs_variables.3x.html">curs_variables(3x)</A></STRONG>, <STRONG>putc(3)</STRONG>.
+
+       Comparable functions  in  the  wide-character  (ncursesw)  library  are
+       described in <STRONG><A HREF="curs_add_wch.3x.html">curs_add_wch(3x)</A></STRONG>.
+
+
+
+                                                                <STRONG><A HREF="curs_addch.3x.html">curs_addch(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-Adding-characters">Adding characters</a></li>
+<li><a href="#h3-Echoing-characters">Echoing characters</a></li>
+<li><a href="#h3-Line-Graphics">Line Graphics</a></li>
+</ul>
+</li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a>
+<ul>
+<li><a href="#h3-ACS-Symbols">ACS Symbols</a></li>
+<li><a href="#h3-Character-Set">Character Set</a></li>
+<li><a href="#h3-TABSIZE">TABSIZE</a></li>
+</ul>
+</li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_addchstr.3x.html b/doc/html/man/curs_addchstr.3x.html
new file mode 100644
index 0000000..60798ea
--- /dev/null
+++ b/doc/html/man/curs_addchstr.3x.html
@@ -0,0 +1,131 @@
+<!--
+  ****************************************************************************
+  * Copyright 2019-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2012,2017 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_addchstr.3x,v 1.25 2022/02/12 20:07:29 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_addchstr 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_addchstr 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_addchstr.3x.html">curs_addchstr(3x)</A></STRONG>                                            <STRONG><A HREF="curs_addchstr.3x.html">curs_addchstr(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>addchstr</STRONG>, <STRONG>addchnstr</STRONG>, <STRONG>waddchstr</STRONG>, <STRONG>waddchnstr</STRONG>, <STRONG>mvaddchstr</STRONG>, <STRONG>mvaddchnstr</STRONG>,
+       <STRONG>mvwaddchstr</STRONG>, <STRONG>mvwaddchnstr</STRONG> - add a string of characters (and attributes)
+       to a <STRONG>curses</STRONG> window
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>addchstr(const</STRONG> <STRONG>chtype</STRONG> <STRONG>*</STRONG><EM>chstr</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>addchnstr(const</STRONG> <STRONG>chtype</STRONG> <STRONG>*</STRONG><EM>chstr</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>waddchstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>chtype</STRONG> <STRONG>*</STRONG><EM>chstr</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>waddchnstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>chtype</STRONG> <STRONG>*</STRONG><EM>chstr</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>mvaddchstr(int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>chtype</STRONG> <STRONG>*</STRONG><EM>chstr</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvaddchnstr(int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>chtype</STRONG> <STRONG>*</STRONG><EM>chstr</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvwaddchstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>chtype</STRONG> <STRONG>*</STRONG><EM>chstr</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvwaddchnstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>chtype</STRONG> <STRONG>*</STRONG><EM>chstr</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       These  functions copy the (null-terminated) <EM>chstr</EM> array into the window
+       image structure starting at the  current  cursor  position.   The  four
+       functions  with  <EM>n</EM> as the last argument copy at most <EM>n</EM> elements, but no
+       more than will fit on the line.   If  <STRONG>n</STRONG>=<STRONG>-1</STRONG>  then  the  whole  array  is
+       copied, to the maximum number of characters that will fit on the line.
+
+       The  window  cursor  is <EM>not</EM> advanced.  These functions work faster than
+       <STRONG>waddnstr</STRONG>.  On the other hand:
+
+       <STRONG>o</STRONG>   they do not perform checking (such as for the  newline,  backspace,
+           or carriage return characters),
+
+       <STRONG>o</STRONG>   they do not advance the current cursor position,
+
+       <STRONG>o</STRONG>   they do not expand other control characters to ^-escapes, and
+
+       <STRONG>o</STRONG>   they  truncate  the  string  if it crosses the right margin, rather
+           than wrapping it around to the new line.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       All functions return the integer <STRONG>ERR</STRONG> upon failure and <STRONG>OK</STRONG> on success.
+
+       X/Open does not define any error conditions.  This  implementation  re-
+       turns an error if the window pointer is null.
+
+       Functions  with  a  "mv"  prefix  first perform a cursor movement using
+       <STRONG>wmove</STRONG>, and return an error if the position is outside the window, or if
+       the window pointer is null.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       All functions except <STRONG>waddchnstr</STRONG> may be macros.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These entry points are described in the XSI Curses standard, Issue 4.
+
+
+</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_addstr.3x.html">curs_addstr(3x)</A></STRONG>.
+
+       Comparable  functions  in the wide-character (ncursesw) library are de-
+       scribed in <STRONG><A HREF="curs_add_wchstr.3x.html">curs_add_wchstr(3x)</A></STRONG>.
+
+
+
+                                                             <STRONG><A HREF="curs_addchstr.3x.html">curs_addchstr(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_addstr.3x.html b/doc/html/man/curs_addstr.3x.html
new file mode 100644
index 0000000..050c7a1
--- /dev/null
+++ b/doc/html/man/curs_addstr.3x.html
@@ -0,0 +1,135 @@
+<!--
+  ****************************************************************************
+  * Copyright 2019-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2012,2017 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_addstr.3x,v 1.26 2022/02/12 20:07:29 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_addstr 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_addstr 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_addstr.3x.html">curs_addstr(3x)</A></STRONG>                                                <STRONG><A HREF="curs_addstr.3x.html">curs_addstr(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>addstr</STRONG>, <STRONG>addnstr</STRONG>, <STRONG>waddstr</STRONG>, <STRONG>waddnstr</STRONG>, <STRONG>mvaddstr</STRONG>, <STRONG>mvaddnstr</STRONG>, <STRONG>mvwaddstr</STRONG>,
+       <STRONG>mvwaddnstr</STRONG> - add a string of characters to a <STRONG>curses</STRONG> window and advance
+       cursor
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>addstr(const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>addnstr(const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>waddstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>waddnstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>mvaddstr(int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvaddnstr(int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvwaddstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvwaddnstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str,</EM> <EM>int</EM> <EM>n</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       These functions write the (null-terminated) character string <EM>str</EM> on the
+       given window.  It is similar to calling <STRONG>waddch</STRONG> once for  each  byte  in
+       the string.
+
+       The <EM>mv</EM> functions perform cursor movement once, before writing any char-
+       acters.  Thereafter, the cursor is advanced as a side-effect of writing
+       to the window.
+
+       The  four  functions with <EM>n</EM> as the last argument write at most <EM>n</EM> bytes,
+       or until a terminating null is reached.  If <EM>n</EM> is -1,  then  the  entire
+       string will be added.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       All functions return the integer <STRONG>ERR</STRONG> upon failure and <STRONG>OK</STRONG> on success.
+
+       X/Open  does  not define any error conditions.  This implementation re-
+       turns an error
+
+       <STRONG>o</STRONG>   if the window pointer is null or
+
+       <STRONG>o</STRONG>   if the string pointer is null or
+
+       <STRONG>o</STRONG>   if the corresponding calls to <STRONG>waddch</STRONG> return an error.
+
+       Functions with a "mv" prefix first  perform  a  cursor  movement  using
+       <STRONG>wmove</STRONG>, and return an error if the position is outside the window, or if
+       the window pointer is null.  If an error is returned by the  <STRONG>wmove</STRONG>,  no
+       characters are added to the window.
+
+       If  an  error  is  returned  by <STRONG>waddch</STRONG> (e.g., because the window is not
+       large enough, or an illegal byte sequence was detected)  only  part  of
+       the  string  may be added.  Aside from that, there is a special case in
+       <STRONG>waddch</STRONG> where an error may be  returned  after  successfully  writing  a
+       character  to  the lower-right corner of a window when <STRONG>scrollok</STRONG> is dis-
+       abled.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       All of these functions except <STRONG>waddnstr</STRONG> may be macros.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These functions are described in the XSI Curses standard, Issue 4.
+
+
+</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_addch.3x.html">curs_addch(3x)</A></STRONG>.
+
+
+
+                                                               <STRONG><A HREF="curs_addstr.3x.html">curs_addstr(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_addwstr.3x.html b/doc/html/man/curs_addwstr.3x.html
new file mode 100644
index 0000000..ce6d21b
--- /dev/null
+++ b/doc/html/man/curs_addwstr.3x.html
@@ -0,0 +1,128 @@
+<!--
+  ****************************************************************************
+  * Copyright 2019-2021,2022 Thomas E. Dickey                                *
+  * Copyright 2002-2012,2017 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_addwstr.3x,v 1.18 2022/02/12 20:07:29 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_addwstr 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_addwstr 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_addwstr.3x.html">curs_addwstr(3x)</A></STRONG>                                              <STRONG><A HREF="curs_addwstr.3x.html">curs_addwstr(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>addwstr</STRONG>, <STRONG>addnwstr</STRONG>, <STRONG>waddwstr</STRONG>, <STRONG>waddnwstr</STRONG>, <STRONG>mvaddwstr</STRONG>, <STRONG>mvaddnwstr</STRONG>,
+       <STRONG>mvwaddwstr</STRONG>, <STRONG>mvwaddnwstr</STRONG> - add a string of wide characters to a <STRONG>curses</STRONG>
+       window and advance cursor
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>addwstr(const</STRONG> <STRONG>wchar_t</STRONG> <STRONG>*</STRONG><EM>wstr</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>addnwstr(const</STRONG> <STRONG>wchar_t</STRONG> <STRONG>*</STRONG><EM>wstr</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>waddwstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>wchar_t</STRONG> <STRONG>*</STRONG><EM>wstr</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>waddnwstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>wchar_t</STRONG> <STRONG>*</STRONG><EM>wstr</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>mvaddwstr(int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>wchar_t</STRONG> <STRONG>*</STRONG><EM>wstr</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvaddnwstr(int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>wchar_t</STRONG> <STRONG>*</STRONG><EM>wstr</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvwaddwstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>wchar_t</STRONG> <STRONG>*</STRONG><EM>wstr</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvwaddnwstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>wchar_t</STRONG> <STRONG>*</STRONG><EM>wstr</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       These  functions  write the characters of the (null-terminated) <STRONG>wchar_t</STRONG>
+       character string <EM>wstr</EM> on the given window.  It is similar to construct-
+       ing a <STRONG>cchar_t</STRONG> for each wchar_t in the string, then calling <STRONG>wadd_wch</STRONG> for
+       the resulting <STRONG>cchar_t</STRONG>.
+
+       The <EM>mv</EM> functions perform cursor movement once, before writing any char-
+       acters.  Thereafter, the cursor is advanced as a side-effect of writing
+       to the window.
+
+       The four functions with <EM>n</EM> as the last argument write at most <EM>n</EM>  <STRONG>wchar_t</STRONG>
+       characters,  or  until a terminating null is reached.  If <EM>n</EM> is -1, then
+       the entire string will be added.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       All functions return the integer <STRONG>ERR</STRONG> upon failure and <STRONG>OK</STRONG> on success.
+
+       X/Open does not define any error conditions.  This  implementation  re-
+       turns an error
+
+       <STRONG>o</STRONG>   if the window pointer is null or
+
+       <STRONG>o</STRONG>   if the string pointer is null or
+
+       <STRONG>o</STRONG>   if the corresponding calls to <STRONG>wadd_wch</STRONG> return an error.
+
+       Functions  with  a  "mv"  prefix  first perform a cursor movement using
+       <STRONG>wmove</STRONG>, and return an error if the position is outside the window, or if
+       the window pointer is null.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       All of these functions except <STRONG>waddnwstr</STRONG> may be macros.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These functions are described in the XSI Curses standard, Issue 4.
+
+
+</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_add_wch.3x.html">curs_add_wch(3x)</A></STRONG>
+
+
+
+                                                              <STRONG><A HREF="curs_addwstr.3x.html">curs_addwstr(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_attr.3x.html b/doc/html/man/curs_attr.3x.html
new file mode 100644
index 0000000..70dc745
--- /dev/null
+++ b/doc/html/man/curs_attr.3x.html
@@ -0,0 +1,548 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2016,2017 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_attr.3x,v 1.72 2022/04/16 19:18:32 tom Exp @
+  * ---------------------------------------------------------------------------
+  * attr_get
+  * .br
+  * .br
+  * .br
+  * .br
+  * .br
+  * ---------------------------------------------------------------------------
+  * ---------------------------------------------------------------------------
+  * ---------------------------------------------------------------------------
+  * ---------------------------------------------------------------------------
+  * ---------------------------------------------------------------------------
+  * ---------------------------------------------------------------------------
+  * ---------------------------------------------------------------------------
+  * ---------------------------------------------------------------------------
+  * ---------------------------------------------------------------------------
+  * ---------------------------------------------------------------------------
+  * ---------------------------------------------------------------------------
+  * ---------------------------------------------------------------------------
+  * ---------------------------------------------------------------------------
+  * ---------------------------------------------------------------------------
+-->
+<!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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_attr 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_attr 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_attr.3x.html">curs_attr(3x)</A></STRONG>                                                    <STRONG><A HREF="curs_attr.3x.html">curs_attr(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>attr_get</STRONG>, <STRONG>wattr_get</STRONG>, <STRONG>attr_set</STRONG>, <STRONG>wattr_set</STRONG>, <STRONG>attr_off</STRONG>, <STRONG>wattr_off</STRONG>, <STRONG>attr_on</STRONG>,
+       <STRONG>wattr_on</STRONG>, <STRONG>attroff</STRONG>, <STRONG>wattroff</STRONG>, <STRONG>attron</STRONG>, <STRONG>wattron</STRONG>, <STRONG>attrset</STRONG>, <STRONG>wattrset</STRONG>, <STRONG>chgat</STRONG>,
+       <STRONG>wchgat</STRONG>, <STRONG>mvchgat</STRONG>, <STRONG>mvwchgat</STRONG>, <STRONG>color_set</STRONG>, <STRONG>wcolor_set</STRONG>, <STRONG>standend</STRONG>, <STRONG>wstandend</STRONG>,
+       <STRONG>standout</STRONG>, <STRONG>wstandout</STRONG> - <STRONG>curses</STRONG> character and window attribute control
+       routines
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>attr_get(attr_t</STRONG> <STRONG>*</STRONG><EM>attrs</EM><STRONG>,</STRONG> <STRONG>short</STRONG> <STRONG>*</STRONG><EM>pair</EM><STRONG>,</STRONG> <STRONG>void</STRONG> <STRONG>*</STRONG><EM>opts</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wattr_get(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>attr_t</STRONG> <STRONG>*</STRONG><EM>attrs</EM><STRONG>,</STRONG> <STRONG>short</STRONG> <STRONG>*</STRONG><EM>pair</EM><STRONG>,</STRONG> <STRONG>void</STRONG> <STRONG>*</STRONG><EM>opts</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>attr_set(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>wattr_set(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>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>attr_off(attr_t</STRONG> <EM>attrs</EM><STRONG>,</STRONG> <STRONG>void</STRONG> <STRONG>*</STRONG><EM>opts</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wattr_off(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>attr_t</STRONG> <EM>attrs</EM><STRONG>,</STRONG> <STRONG>void</STRONG> <STRONG>*</STRONG><EM>opts</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>attr_on(attr_t</STRONG> <EM>attrs</EM><STRONG>,</STRONG> <STRONG>void</STRONG> <STRONG>*</STRONG><EM>opts</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wattr_on(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>attr_t</STRONG> <EM>attrs</EM><STRONG>,</STRONG> <STRONG>void</STRONG> <STRONG>*</STRONG><EM>opts</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>attroff(int</STRONG> <EM>attrs);</EM>
+       <STRONG>int</STRONG> <STRONG>wattroff(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>attrs</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>attron(int</STRONG> <EM>attrs</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wattron(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>attrs</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>attrset(int</STRONG> <EM>attrs</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wattrset(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>attrs</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>chgat(int</STRONG> <EM>n</EM><STRONG>,</STRONG> <STRONG>attr_t</STRONG> <EM>attr</EM><STRONG>,</STRONG> <STRONG>short</STRONG> <EM>pair</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>void</STRONG> <STRONG>*</STRONG><EM>opts</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wchgat(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG>
+             <STRONG>int</STRONG> <EM>n</EM><STRONG>,</STRONG> <STRONG>attr_t</STRONG> <EM>attr</EM><STRONG>,</STRONG> <STRONG>short</STRONG> <EM>pair</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>void</STRONG> <STRONG>*</STRONG><EM>opts</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvchgat(int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG>
+             <STRONG>int</STRONG> <EM>n</EM><STRONG>,</STRONG> <STRONG>attr_t</STRONG> <EM>attr</EM><STRONG>,</STRONG> <STRONG>short</STRONG> <EM>pair</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>void</STRONG> <STRONG>*</STRONG><EM>opts</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvwchgat(WINDOW</STRONG> <STRONG>*</STRONG><EM>win,</EM> <EM>int</EM> <EM>y,</EM> <EM>int</EM> <EM>x</EM><STRONG>,</STRONG>
+             <STRONG>int</STRONG> <EM>n,</EM> <STRONG>attr_t</STRONG> <EM>attr</EM><STRONG>,</STRONG> <STRONG>short</STRONG> <EM>pair</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>void</STRONG> <STRONG>*</STRONG><EM>opts</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>color_set(short</STRONG> <EM>pair</EM><STRONG>,</STRONG> <STRONG>void*</STRONG> <EM>opts</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wcolor_set(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>short</STRONG> <EM>pair</EM><STRONG>,</STRONG> <STRONG>void*</STRONG> <EM>opts);</EM>
+
+       <STRONG>int</STRONG> <STRONG>standend(void);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wstandend(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>standout(void);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wstandout(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       These  routines  manipulate the current attributes of the named window,
+       which then apply to all characters that are  written  into  the  window
+       with  <STRONG>waddch</STRONG>,  <STRONG>waddstr</STRONG>  and  <STRONG>wprintw</STRONG>.  Attributes are a property of the
+       character, and move with the character through any  scrolling  and  in-
+       sert/delete  line/character  operations.   To the extent possible, they
+       are displayed as appropriate modifications to the graphic rendition  of
+       characters put on the screen.
+
+       These  routines do not affect the attributes used when erasing portions
+       of the window.  See <STRONG><A HREF="curs_bkgd.3x.html">curs_bkgd(3x)</A></STRONG> for functions which  modify  the  at-
+       tributes used for erasing and clearing.
+
+       Routines  which  do  not have a <STRONG>WINDOW*</STRONG> parameter apply to <STRONG>stdscr</STRONG>.  For
+       example, <STRONG>attr_set</STRONG> is the <STRONG>stdscr</STRONG> variant of <STRONG>wattr_set</STRONG>.
+
+
+</PRE><H3><a name="h3-Window-attributes">Window attributes</a></H3><PRE>
+       There are two sets of functions:
+
+       <STRONG>o</STRONG>   functions for manipulating the window attributes  and  color:  <STRONG>wat-</STRONG>
+           <STRONG>tr_set</STRONG> and <STRONG>wattr_get</STRONG>.
+
+       <STRONG>o</STRONG>   functions  for manipulating only the window attributes (not color):
+           <STRONG>wattr_on</STRONG> and <STRONG>wattr_off</STRONG>.
+
+       The <STRONG>wattr_set</STRONG> function sets the current attributes of the given  window
+       to <EM>attrs</EM>, with color specified by <EM>pair</EM>.
+
+       Use <STRONG>wattr_get</STRONG> to retrieve attributes for the given window.
+
+       Use  <STRONG>attr_on</STRONG>  and  <STRONG>wattr_on</STRONG>  to turn on window attributes, i.e., values
+       OR'd together in <EM>attr</EM>, without affecting  other  attributes.   Use  <STRONG>at-</STRONG>
+       <STRONG>tr_off</STRONG>  and  <STRONG>wattr_off</STRONG> to turn off window attributes, again values OR'd
+       together in <EM>attr</EM>, without affecting other attributes.
+
+
+</PRE><H3><a name="h3-Legacy-window-attributes">Legacy window attributes</a></H3><PRE>
+       The X/Open window attribute routines which <EM>set</EM> or <EM>get</EM>, turn <EM>on</EM>  or  <EM>off</EM>
+       are extensions of older routines which assume that color pairs are OR'd
+       into the attribute parameter.  These newer routines use similar  names,
+       because X/Open simply added an underscore (<STRONG>_</STRONG>) for the newer names.
+
+       The <STRONG>int</STRONG> datatype used in the legacy routines is treated as if it is the
+       same size as <STRONG>chtype</STRONG> (used by <STRONG><A HREF="curs_addch.3x.html">addch(3x)</A></STRONG>).  It holds the common video at-
+       tributes  (such  as  bold,  reverse),  as well as a few bits for color.
+       Those bits correspond to the <STRONG>A_COLOR</STRONG> symbol.  The <STRONG>COLOR_PAIR</STRONG> macro pro-
+       vides  a value which can be OR'd into the attribute parameter.  For ex-
+       ample, as long as that value fits into the  <STRONG>A_COLOR</STRONG>  mask,  then  these
+       calls produce similar results:
+
+           attrset(A_BOLD | COLOR_PAIR(<EM>pair</EM>));
+           attr_set(A_BOLD, <EM>pair</EM>, NULL);
+
+       However, if the value does not fit, then the <STRONG>COLOR_PAIR</STRONG> macro uses only
+       the bits that fit.  For example, because in ncurses <STRONG>A_COLOR</STRONG>  has  eight
+       (8) bits, then <STRONG>COLOR_PAIR(</STRONG><EM>259</EM><STRONG>)</STRONG> is 4 (i.e., 259 is 4 more than the limit
+       255).
+
+       The <STRONG>PAIR_NUMBER</STRONG> macro extracts a pair number from an <STRONG>int</STRONG>  (or  <STRONG>chtype</STRONG>).
+       For  example,  the <EM>input</EM> and <EM>output</EM> values in these statements would be
+       the same:
+
+           int value = A_BOLD | COLOR_PAIR(<EM>input</EM>);
+           int <EM>output</EM> = PAIR_NUMBER(value);
+
+       The <STRONG>attrset</STRONG> routine is a legacy feature predating SVr4 curses but  kept
+       in X/Open Curses for the same reason that SVr4 curses kept it: compati-
+       bility.
+
+       The remaining <STRONG>attr</STRONG>* functions operate exactly  like  the  corresponding
+       <STRONG>attr_</STRONG>*  functions,  except  that they take arguments of type <STRONG>int</STRONG> rather
+       than <STRONG>attr_t</STRONG>.
+
+       There is no corresponding <STRONG>attrget</STRONG> function as such  in  X/Open  Curses,
+       although ncurses provides <STRONG>getattrs</STRONG> (see <STRONG><A HREF="curs_legacy.3x.html">curs_legacy(3x)</A></STRONG>).
+
+
+</PRE><H3><a name="h3-Change-character-rendition">Change character rendition</a></H3><PRE>
+       The  routine  <STRONG>chgat</STRONG> changes the attributes of a given number of charac-
+       ters starting at the current cursor location of <STRONG>stdscr</STRONG>.   It  does  not
+       update  the cursor and does not perform wrapping.  A character count of
+       -1 or greater than the remaining  window  width  means  to  change  at-
+       tributes  all the way to the end of the current line.  The <STRONG>wchgat</STRONG> func-
+       tion generalizes this to any window; the <STRONG>mvwchgat</STRONG> function does a  cur-
+       sor move before acting.
+
+       In  these  functions, the color <EM>pair</EM> argument is a color-pair index (as
+       in the first argument of <STRONG>init_pair</STRONG>, see <STRONG><A HREF="curs_color.3x.html">curs_color(3x)</A></STRONG>).
+
+
+</PRE><H3><a name="h3-Change-window-color">Change window color</a></H3><PRE>
+       The routine <STRONG>color_set</STRONG> sets the current color of the given window to the
+       foreground/background  combination  described by the color <EM>pair</EM> parame-
+       ter.
+
+
+</PRE><H3><a name="h3-Standout">Standout</a></H3><PRE>
+       The routine <STRONG>standout</STRONG> is the same as  <STRONG>attron(A_STANDOUT)</STRONG>.   The  routine
+       <STRONG>standend</STRONG>  is  the  same as <STRONG>attrset(A_NORMAL)</STRONG> or <STRONG>attrset(0)</STRONG>, that is, it
+       turns off all attributes.
+
+       X/Open does not mark these "restricted", because
+
+       <STRONG>o</STRONG>   they have well established legacy use, and
+
+       <STRONG>o</STRONG>   there is no ambiguity about the way the attributes  might  be  com-
+           bined with a color pair.
+
+
+</PRE><H2><a name="h2-VIDEO-ATTRIBUTES">VIDEO ATTRIBUTES</a></H2><PRE>
+       The following video attributes, defined in <STRONG>&lt;curses.h&gt;</STRONG>, can be passed to
+       the routines <STRONG>attron</STRONG>, <STRONG>attroff</STRONG>, and <STRONG>attrset</STRONG>, or OR'd with the  characters
+       passed to <STRONG>addch</STRONG> (see <STRONG><A HREF="curs_addch.3x.html">curs_addch(3x)</A></STRONG>).
+
+              <STRONG>Name</STRONG>           <STRONG>Description</STRONG>
+              -----------------------------------------------------------------
+              <STRONG>A_NORMAL</STRONG>       Normal display (no highlight)
+              <STRONG>A_STANDOUT</STRONG>     Best highlighting mode of the terminal.
+              <STRONG>A_UNDERLINE</STRONG>    Underlining
+              <STRONG>A_REVERSE</STRONG>      Reverse video
+              <STRONG>A_BLINK</STRONG>        Blinking
+              <STRONG>A_DIM</STRONG>          Half bright
+              <STRONG>A_BOLD</STRONG>         Extra bright or bold
+              <STRONG>A_PROTECT</STRONG>      Protected mode
+              <STRONG>A_INVIS</STRONG>        Invisible or blank mode
+              <STRONG>A_ALTCHARSET</STRONG>   Alternate character set
+              <STRONG>A_ITALIC</STRONG>       Italics (non-X/Open extension)
+              <STRONG>A_CHARTEXT</STRONG>     Bit-mask to extract a character
+              <STRONG>A_COLOR</STRONG>        Bit-mask to extract a color (legacy routines)
+
+       These  video  attributes are supported by <STRONG>attr_on</STRONG> and related functions
+       (which also support the attributes recognized by <STRONG>attron</STRONG>, etc.):
+
+              <STRONG>Name</STRONG>            <STRONG>Description</STRONG>
+              -----------------------------------------
+              <STRONG>WA_HORIZONTAL</STRONG>   Horizontal highlight
+              <STRONG>WA_LEFT</STRONG>         Left highlight
+              <STRONG>WA_LOW</STRONG>          Low highlight
+              <STRONG>WA_RIGHT</STRONG>        Right highlight
+              <STRONG>WA_TOP</STRONG>          Top highlight
+              <STRONG>WA_VERTICAL</STRONG>     Vertical highlight
+
+       The return values of many of these routines are  not  meaningful  (they
+       are  implemented  as macro-expanded assignments and simply return their
+       argument).  The SVr4 manual page claims (falsely) that  these  routines
+       always return <STRONG>1</STRONG>.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       These functions may be macros:
+
+              <STRONG>attroff</STRONG>,  <STRONG>wattroff</STRONG>, <STRONG>attron</STRONG>, <STRONG>wattron</STRONG>, <STRONG>attrset</STRONG>, <STRONG>wattrset</STRONG>, <STRONG>standend</STRONG>
+              and <STRONG>standout</STRONG>.
+
+       Color pair values can only be OR'd with attributes if the  pair  number
+       is less than 256.  The alternate functions such as <STRONG>color_set</STRONG> can pass a
+       color pair value directly.  However, ncurses ABI 4 and 5 simply OR this
+       value  within  the  alternate functions.  You must use ncurses ABI 6 to
+       support more than 256 color pairs.
+
+
+</PRE><H2><a name="h2-HISTORY">HISTORY</a></H2><PRE>
+       X/Open Curses is largely based  on  SVr4  curses,  adding  support  for
+       "wide-characters"  (not  specific to Unicode).  Some of the X/Open dif-
+       ferences from SVr4 curses address the way video attributes can  be  ap-
+       plied  to  wide-characters.   But aside from that, <STRONG>attrset</STRONG> and <STRONG>attr_set</STRONG>
+       are similar.  SVr4 curses provided the basic features for  manipulating
+       video  attributes.  However, earlier versions of curses provided a part
+       of these features.
+
+       As seen in 2.8BSD, curses assumed 7-bit characters,  using  the  eighth
+       bit  of  a byte to represent the <EM>standout</EM> feature (often implemented as
+       bold and/or reverse video).  The BSD curses library provided  functions
+       <STRONG>standout</STRONG>  and  <STRONG>standend</STRONG> which were carried along into X/Open Curses due
+       to their pervasive use in legacy applications.
+
+       Some terminals in the 1980s  could  support  a  variety  of  video  at-
+       tributes,  although the BSD curses library could do nothing with those.
+       System V (1983) provided an improved curses library.  It defined the <STRONG>A_</STRONG>
+       symbols  for  use  by  applications to manipulate the other attributes.
+       There are few useful references for the chronology.
+
+       Goodheart's book <EM>UNIX</EM> <EM>Curses</EM> <EM>Explained</EM> (1991)  describes  SVr3  (1987),
+       commenting on several functions:
+
+       <STRONG>o</STRONG>   the  <STRONG>attron</STRONG>,  <STRONG>attroff</STRONG>, <STRONG>attrset</STRONG> functions (and most of the functions
+           found in SVr4 but not in BSD curses) were introduced by System V,
+
+       <STRONG>o</STRONG>   the alternate character set feature with <STRONG>A_ALTCHARSET</STRONG> was added  in
+           SVr2 and improved in SVr3 (by adding <STRONG>acs_map[]</STRONG>),
+
+       <STRONG>o</STRONG>   <STRONG>start_color</STRONG>  and  related color-functions were introduced by System
+           V.3.2,
+
+       <STRONG>o</STRONG>   pads, soft-keys were added in SVr3, and
+
+       Goodheart did not mention the background character or the <STRONG>cchar_t</STRONG> type.
+       Those are respectively SVr4 and X/Open features.  He did mention the <STRONG>A_</STRONG>
+       constants, but did not indicate their values.  Those were not the  same
+       in different systems, even for those marked as System V.
+
+       Different  Unix  systems  used  different  sizes  for the bit-fields in
+       <STRONG>chtype</STRONG> for <EM>characters</EM> and <EM>colors</EM>, and took into account  the  different
+       integer sizes (32-bit versus 64-bit).
+
+       This  table  showing  the number of bits for <STRONG>A_COLOR</STRONG> and <STRONG>A_CHARTEXT</STRONG> was
+       gleaned from the curses header files for various operating systems  and
+       architectures.   The inferred architecture and notes reflect the format
+       and size of the defined constants as well as clues such as  the  alter-
+       nate  character  set implementation.  A 32-bit library can be used on a
+       64-bit system, but not necessarily the reverse.
+
+              <STRONG>Year</STRONG>   <STRONG>System</STRONG>        <STRONG>Arch</STRONG>    <STRONG>Color</STRONG>   <STRONG>Char</STRONG>   <STRONG>Notes</STRONG>
+              ----------------------------------------------------------------
+              1992   Solaris 5.2   32      6       17     SVr4 curses
+              1992   HPUX 9        32      no      8      SVr2 curses
+              1992   AIX 3.2       32      no      23     SVr2 curses
+              1994   OSF/1 r3      32      no      23     SVr2 curses
+              1995   HP-UX 10.00   32      6       16     SVr3 "curses_colr"
+              1995   HP-UX 10.00   32      6       8      SVr4, X/Open curses
+              1995   Solaris 5.4   32/64   7       16     X/Open curses
+              1996   AIX 4.2       32      7       16     X/Open curses
+              1996   OSF/1 r4      32      6       16     X/Open curses
+
+              1997   HP-UX 11.00   32      6       8      X/Open curses
+              2000   U/Win         32/64   7/31    16     uses <STRONG>chtype</STRONG>
+
+       Notes:
+
+          Regarding HP-UX,
+
+          <STRONG>o</STRONG>   HP-UX 10.20 (1996) added support for 64-bit  PA-RISC  processors
+              in 1996.
+
+          <STRONG>o</STRONG>   HP-UX  10.30 (1997) marked "curses_colr" obsolete.  That version
+              of curses was dropped with HP-UX 11.30 in 2006.
+
+          Regarding OSF/1 (and Tru64),
+
+          <STRONG>o</STRONG>   These used 64-bit hardware.  Like ncurses, the OSF/1 curses  in-
+              terface is not customized for 32-bit and 64-bit versions.
+
+          <STRONG>o</STRONG>   Unlike other systems which evolved from AT&amp;T code, OSF/1 provid-
+              ed a new implementation for X/Open curses.
+
+          Regarding Solaris,
+
+          <STRONG>o</STRONG>   The initial release of Solaris was in 1992.
+
+          <STRONG>o</STRONG>   The <EM>xpg4</EM> (X/Open) curses was developed by MKS from 1990 to 1995.
+              Sun's copyright began in 1996.
+
+          <STRONG>o</STRONG>   Sun updated the X/Open curses interface after 64-bit support was
+              introduced in 1997, but did not modify the  SVr4  curses  inter-
+              face.
+
+          Regarding U/Win,
+
+          <STRONG>o</STRONG>   Development  of  the  curses  library  began in 1991, stopped in
+              2000.
+
+          <STRONG>o</STRONG>   Color support was added in 1998.
+
+          <STRONG>o</STRONG>   The library uses only <STRONG>chtype</STRONG> (no <STRONG>cchar_t</STRONG>).
+
+       Once X/Open curses was adopted in the mid-1990s, the  constraint  of  a
+       32-bit interface with many colors and wide-characters for <STRONG>chtype</STRONG> became
+       a moot point.  The <STRONG>cchar_t</STRONG> structure (whose size and  members  are  not
+       specified in X/Open Curses) could be extended as needed.
+
+       Other interfaces are rarely used now:
+
+       <STRONG>o</STRONG>   BSD  curses was improved slightly in 1993/1994 using Keith Bostic's
+           modification to make the library 8-bit clean for <STRONG>nvi(1)</STRONG>.  He  moved
+           <EM>standout</EM> attribute to a structure member.
+
+           The  resulting  4.4BSD curses was replaced by ncurses over the next
+           ten years.
+
+       <STRONG>o</STRONG>   U/Win is rarely used now.
+
+
+</PRE><H2><a name="h2-EXTENSIONS">EXTENSIONS</a></H2><PRE>
+       This implementation provides the <STRONG>A_ITALIC</STRONG> attribute for terminals which
+       have  the  <STRONG>enter_italics_mode</STRONG> (<STRONG>sitm</STRONG>) and <STRONG>exit_italics_mode</STRONG> (<STRONG>ritm</STRONG>) capa-
+       bilities.  Italics are not mentioned in X/Open Curses.  Unlike the oth-
+       er  video attributes, <STRONG>A_ITALIC</STRONG> is unrelated to the <STRONG>set_attributes</STRONG> capa-
+       bilities.  This implementation makes the  assumption  that  <STRONG>exit_attri-</STRONG>
+       <STRONG>bute_mode</STRONG> may also reset italics.
+
+       Each  of  the functions added by XSI Curses has a parameter <EM>opts</EM>, which
+       X/Open Curses still (after more than twenty  years)  documents  as  re-
+       served for future use, saying that it should be <STRONG>NULL</STRONG>.  This implementa-
+       tion uses that parameter in ABI 6 for the functions which have a color-
+       pair parameter to support <EM>extended</EM> <EM>color</EM> <EM>pairs</EM>:
+
+       <STRONG>o</STRONG>   For functions which modify the color, e.g., <STRONG>wattr_set</STRONG> and <STRONG>wattr_on</STRONG>,
+           if <EM>opts</EM> is set it is treated as a pointer to <STRONG>int</STRONG>, and used  to  set
+           the color pair instead of the <STRONG>short</STRONG> <EM>pair</EM> parameter.
+
+       <STRONG>o</STRONG>   For functions which retrieve the color, e.g., <STRONG>wattr_get</STRONG>, if <EM>opts</EM> is
+           set it is treated as a pointer to <STRONG>int</STRONG>, and  used  to  retrieve  the
+           color  pair  as  an <STRONG>int</STRONG> value, in addition to retrieving it via the
+           standard pointer to <STRONG>short</STRONG> parameter.
+
+       <STRONG>o</STRONG>   For functions which turn attributes off, e.g., <STRONG>wattr_off</STRONG>, the  <EM>opts</EM>
+           parameter is ignored except except to check that it is <STRONG>NULL</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These functions are supported in the XSI Curses standard, Issue 4.  The
+       standard defined the dedicated type for highlights, <STRONG>attr_t</STRONG>,  which  was
+       not defined in SVr4 curses.  The functions taking <STRONG>attr_t</STRONG> arguments were
+       not supported under SVr4.
+
+       Very old versions of this library did not force an update of the screen
+       when  changing  the  attributes.   Use  <STRONG>touchwin</STRONG> to force the screen to
+       match the updated attributes.
+
+       The XSI Curses standard states that whether the  traditional  functions
+       <STRONG>attron</STRONG>/<STRONG>attroff</STRONG>/<STRONG>attrset</STRONG>  can  manipulate  attributes other than <STRONG>A_BLINK</STRONG>,
+       <STRONG>A_BOLD</STRONG>, <STRONG>A_DIM</STRONG>, <STRONG>A_REVERSE</STRONG>, <STRONG>A_STANDOUT</STRONG>, or <STRONG>A_UNDERLINE</STRONG> is  "unspecified".
+       Under  this implementation as well as SVr4 curses, these functions cor-
+       rectly manipulate all  other  highlights  (specifically,  <STRONG>A_ALTCHARSET</STRONG>,
+       <STRONG>A_PROTECT</STRONG>, and <STRONG>A_INVIS</STRONG>).
+
+       XSI Curses added these entry points:
+
+              <STRONG>attr_get</STRONG>, <STRONG>attr_on</STRONG>, <STRONG>attr_off</STRONG>, <STRONG>attr_set</STRONG>, <STRONG>wattr_on</STRONG>, <STRONG>wattr_off</STRONG>, <STRONG>wat-</STRONG>
+              <STRONG>tr_get</STRONG>, <STRONG>wattr_set</STRONG>
+
+       The new functions are intended to work with a new series  of  highlight
+       macros prefixed with <STRONG>WA_</STRONG>.  The older macros have direct counterparts in
+       the newer set of names:
+
+              <STRONG>Name</STRONG>            <STRONG>Description</STRONG>
+              ------------------------------------------------------------
+              <STRONG>WA_NORMAL</STRONG>       Normal display (no highlight)
+              <STRONG>WA_STANDOUT</STRONG>     Best highlighting mode of the terminal.
+              <STRONG>WA_UNDERLINE</STRONG>    Underlining
+              <STRONG>WA_REVERSE</STRONG>      Reverse video
+              <STRONG>WA_BLINK</STRONG>        Blinking
+              <STRONG>WA_DIM</STRONG>          Half bright
+              <STRONG>WA_BOLD</STRONG>         Extra bright or bold
+              <STRONG>WA_ALTCHARSET</STRONG>   Alternate character set
+
+       XSI curses does not assign values to these symbols, nor does  it  state
+       whether or not they are related to the similarly-named A_NORMAL, etc.:
+
+       <STRONG>o</STRONG>   The  XSI  curses standard specifies that each pair of corresponding
+           <STRONG>A_</STRONG> and <STRONG>WA_</STRONG>-using functions operates on the  same  current-highlight
+           information.
+
+       <STRONG>o</STRONG>   However, in some implementations, those symbols have unrelated val-
+           ues.
+
+           For example, the Solaris <EM>xpg4</EM> (X/Open) curses declares <STRONG>attr_t</STRONG> to be
+           an unsigned short integer (16-bits), while <STRONG>chtype</STRONG> is a unsigned in-
+           teger (32-bits).  The <STRONG>WA_</STRONG> symbols in this case are  different  from
+           the  <STRONG>A_</STRONG>  symbols because they are used for a smaller datatype which
+           does not represent <STRONG>A_CHARTEXT</STRONG> or <STRONG>A_COLOR</STRONG>.
+
+           In this implementation (as in many others), the values happen to be
+           the  same  because it simplifies copying information between <STRONG>chtype</STRONG>
+           and <STRONG>cchar_t</STRONG> variables.
+
+       <STRONG>o</STRONG>   Because ncurses's <STRONG>attr_t</STRONG> can hold a  color  pair  (in  the  <STRONG>A_COLOR</STRONG>
+           field),  a  call to <STRONG>wattr_on</STRONG>, <STRONG>wattr_off</STRONG>, or <STRONG>wattr_set</STRONG> may alter the
+           window's color.  If the color pair information in the attribute pa-
+           rameter is zero, no change is made to the window's color.
+
+           This is consistent with SVr4 curses; X/Open Curses does not specify
+           this.
+
+       The XSI standard extended conformance level adds new highlights <STRONG>A_HORI-</STRONG>
+       <STRONG>ZONTAL</STRONG>,  <STRONG>A_LEFT</STRONG>,  <STRONG>A_LOW</STRONG>,  <STRONG>A_RIGHT</STRONG>, <STRONG>A_TOP</STRONG>, <STRONG>A_VERTICAL</STRONG> (and corresponding
+       <STRONG>WA_</STRONG> macros for each).  As of August 2013, no  known  terminal  provides
+       these highlights (i.e., via the <STRONG>sgr1</STRONG> capability).
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       All routines return the integer <STRONG>OK</STRONG> on success, or <STRONG>ERR</STRONG> on failure.
+
+       X/Open does not define any error conditions.
+
+       This implementation
+
+       <STRONG>o</STRONG>   returns an error if the window pointer is null.
+
+       <STRONG>o</STRONG>   returns an error if the color pair parameter for <STRONG>wcolor_set</STRONG> is out-
+           side the range 0..COLOR_PAIRS-1.
+
+       <STRONG>o</STRONG>   does not return an error if either of the parameters  of  <STRONG>wattr_get</STRONG>
+           used for retrieving attribute or color-pair values is <STRONG>NULL</STRONG>.
+
+       Functions  with  a  "mv"  prefix  first perform a cursor movement using
+       <STRONG>wmove</STRONG>, and return an error if the position is outside the window, or if
+       the window pointer is null.
+
+
+</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_addch.3x.html">curs_addch(3x)</A></STRONG>, <STRONG><A HREF="curs_addstr.3x.html">curs_addstr(3x)</A></STRONG>, <STRONG><A HREF="curs_bkgd.3x.html">curs_bkgd(3x)</A></STRONG>,
+       <STRONG><A HREF="curs_printw.3x.html">curs_printw(3x)</A></STRONG>, <STRONG><A HREF="curs_variables.3x.html">curs_variables(3x)</A></STRONG>
+
+
+
+                                                                 <STRONG><A HREF="curs_attr.3x.html">curs_attr(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-Window-attributes">Window attributes</a></li>
+<li><a href="#h3-Legacy-window-attributes">Legacy window attributes</a></li>
+<li><a href="#h3-Change-character-rendition">Change character rendition</a></li>
+<li><a href="#h3-Change-window-color">Change window color</a></li>
+<li><a href="#h3-Standout">Standout</a></li>
+</ul>
+</li>
+<li><a href="#h2-VIDEO-ATTRIBUTES">VIDEO ATTRIBUTES</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-HISTORY">HISTORY</a></li>
+<li><a href="#h2-EXTENSIONS">EXTENSIONS</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_beep.3x.html b/doc/html/man/curs_beep.3x.html
new file mode 100644
index 0000000..0db95ef
--- /dev/null
+++ b/doc/html/man/curs_beep.3x.html
@@ -0,0 +1,103 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2020,2021 Thomas E. Dickey                                *
+  * Copyright 1998-2005,2010 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_beep.3x,v 1.16 2021/12/25 21:41:58 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_beep 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_beep 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_beep.3x.html">curs_beep(3x)</A></STRONG>                                                    <STRONG><A HREF="curs_beep.3x.html">curs_beep(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>beep</STRONG>, <STRONG>flash</STRONG> - <STRONG>curses</STRONG> bell and screen flash routines
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>beep(void);</STRONG>
+       <STRONG>int</STRONG> <STRONG>flash(void);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The  <STRONG>beep</STRONG>  and <STRONG>flash</STRONG> routines are used to alert the terminal user.  The
+       routine <STRONG>beep</STRONG> sounds an audible alarm  on  the  terminal,  if  possible;
+       otherwise  it  flashes  the  screen  (visible bell).  The routine <STRONG>flash</STRONG>
+       flashes the screen, and if that is not possible, sounds the alert.   If
+       neither  alert is possible, nothing happens.  Nearly all terminals have
+       an audible alert (bell or beep), but only some can flash the screen.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       These routines return <STRONG>OK</STRONG> if they succeed in beeping  or  flashing,  <STRONG>ERR</STRONG>
+       otherwise.
+
+
+</PRE><H2><a name="h2-EXTENSIONS">EXTENSIONS</a></H2><PRE>
+       SVr4's  beep  and  flash  routines  always  returned  <STRONG>OK</STRONG>, so it was not
+       possible to tell when the beep or flash failed.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These functions are described in the  XSI  Curses  standard,  Issue  4.
+       Like SVr4, it specifies that they always return <STRONG>OK</STRONG>.
+
+
+</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_beep.3x.html">curs_beep(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-EXTENSIONS">EXTENSIONS</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_bkgd.3x.html b/doc/html/man/curs_bkgd.3x.html
new file mode 100644
index 0000000..d4a6a1d
--- /dev/null
+++ b/doc/html/man/curs_bkgd.3x.html
@@ -0,0 +1,202 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2015,2017 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_bkgd.3x,v 1.35 2022/06/25 21:55:45 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_bkgd 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_bkgd 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_bkgd.3x.html">curs_bkgd(3x)</A></STRONG>                                                    <STRONG><A HREF="curs_bkgd.3x.html">curs_bkgd(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>bkgdset</STRONG>,  <STRONG>wbkgdset</STRONG>,  <STRONG>bkgd</STRONG>,  <STRONG>wbkgd</STRONG>,  <STRONG>getbkgd</STRONG>  - <STRONG>curses</STRONG> window background
+       manipulation routines
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>void</STRONG> <STRONG>bkgdset(chtype</STRONG> <EM>ch</EM><STRONG>);</STRONG>
+       <STRONG>void</STRONG> <STRONG>wbkgdset(WINDOW</STRONG> <STRONG>*</STRONG><EM>win,</EM> <EM>chtype</EM> <EM>ch</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>bkgd(chtype</STRONG> <EM>ch</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wbkgd(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>chtype</STRONG> <EM>ch</EM><STRONG>);</STRONG>
+
+       <STRONG>chtype</STRONG> <STRONG>getbkgd(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+
+</PRE><H3><a name="h3-bkgdset">bkgdset</a></H3><PRE>
+       The <STRONG>bkgdset</STRONG> and <STRONG>wbkgdset</STRONG> routines set the <EM>background</EM> for a  window.   A
+       window's  background  is  a  <STRONG>chtype</STRONG>  consisting  of  any combination of
+       attributes (i.e., rendition) and a character:
+
+       <STRONG>o</STRONG>   The attribute part of the background is combined (OR'ed)  with  all
+           non-blank characters that are written into the window with <STRONG>waddch</STRONG>.
+
+       <STRONG>o</STRONG>   Both  the  character  and  attribute  parts  of  the background are
+           combined with blank characters that are written into the window.
+
+       The background becomes a property of each character and moves with  the
+       character   through  any  scrolling  and  insert/delete  line/character
+       operations.
+
+       To the extent possible on a particular terminal, the attribute part  of
+       the  background  is displayed as the graphic rendition of the character
+       put on the screen.
+
+
+</PRE><H3><a name="h3-bkgd">bkgd</a></H3><PRE>
+       The <STRONG>bkgd</STRONG> and <STRONG>wbkgd</STRONG> functions set the background property of the current
+       or  specified  window  and  then  apply this setting to every character
+       position in that window.  According to  X/Open  Curses,  it  should  do
+       this:
+
+       <STRONG>o</STRONG>   The  rendition  of  every character on the screen is changed to the
+           new background rendition.
+
+       <STRONG>o</STRONG>   Wherever the former background character appears, it is changed  to
+           the new background character.
+
+       Neither  X/Open Curses nor the SVr4 manual pages give details about the
+       way the rendition of characters on the screen is updated when  <STRONG>bkgd</STRONG>  or
+       <STRONG>wbkgd</STRONG> is used to change the background character.
+
+       This  implementation,  like  SVr4 curses, does not store the background
+       and window attribute contributions to each cell separately.  It updates
+       the  rendition  by  comparing  the  character, non-color attributes and
+       colors contained in the background.   For  each  cell  in  the  window,
+       whether or not it is blank:
+
+       <STRONG>o</STRONG>   The  library  first  compares  the <EM>character</EM>, and if it matches the
+           current character part of the background, it replaces that with the
+           new background character.
+
+           When <STRONG>bkgdset</STRONG> is used to set the background character, that does not
+           update each cell in the window.  A subsequent  call  to  <STRONG>bkgd</STRONG>  will
+           only  modify  the  <EM>character</EM>  in  cells  which  match  the  current
+           background character.
+
+       <STRONG>o</STRONG>   The library then checks if the cell uses  color,  i.e.,  its  color
+           pair  value  is nonzero.  If not, it simply replaces the attributes
+           and color pair in the cell  with  those  from  the  new  background
+           character.
+
+       <STRONG>o</STRONG>   If  the  cell uses color, and that matches the color in the current
+           background, the library removes attributes which may have come from
+           the current background and adds attributes from the new background.
+           It finishes by setting the cell to  use  the  color  from  the  new
+           background.
+
+       <STRONG>o</STRONG>   If  the  cell  uses color, and that does not match the color in the
+           current  background,  the  library  updates  only   the   non-color
+           attributes,  first  removing  those  which  may  have come from the
+           current  background,  and  then  adding  attributes  from  the  new
+           background.
+
+       If the background's character value is zero (0), a space is assumed.
+
+       If  the  terminal  does  not  support  color,  or if color has not been
+       started  with  <STRONG>start_color</STRONG>,  the  new  background   character's   color
+       attribute will be ignored.
+
+
+</PRE><H3><a name="h3-getbkgd">getbkgd</a></H3><PRE>
+       The  <STRONG>getbkgd</STRONG>  function  returns  the  given window's current background
+       character/attribute pair.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       These functions are described in the XSI Curses standard, Issue 4.   It
+       specifies  that  <STRONG>bkgd</STRONG>  and  <STRONG>wbkgd</STRONG>  return  <STRONG>ERR</STRONG> on failure, but gives no
+       failure conditions.
+
+       The routines <STRONG>bkgd</STRONG> and <STRONG>wbkgd</STRONG> return the integer <STRONG>OK</STRONG>, unless  the  library
+       has not been initialized.
+
+       In  contrast, the SVr4.0 manual says <STRONG>bkgd</STRONG> and <STRONG>wbkgd</STRONG> may return <STRONG>OK</STRONG> "or a
+       non-negative integer if <STRONG>immedok</STRONG> is set", which  refers  to  the  return
+       value  from <STRONG>wrefresh</STRONG> (used to implement the immediate repainting).  The
+       SVr4 curses <STRONG>wrefresh</STRONG> returns the number of characters  written  to  the
+       screen during the refresh.  This implementation does not do that.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       Note that <STRONG>bkgdset</STRONG> and <STRONG>bkgd</STRONG> may be macros.
+
+       X/Open  Curses  mentions that the character part of the background must
+       be a single-byte value.  This  implementation,  like  SVr4,  checks  to
+       ensure  that,  and will reuse the old background character if the check
+       fails.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These functions are described in  the  XSI  Curses  standard,  Issue  4
+       (X/Open Curses).
+
+
+</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_addch.3x.html">curs_addch(3x)</A></STRONG>, <STRONG><A HREF="curs_attr.3x.html">curs_attr(3x)</A></STRONG>, <STRONG><A HREF="curs_outopts.3x.html">curs_outopts(3x)</A></STRONG>
+
+
+
+                                                                 <STRONG><A HREF="curs_bkgd.3x.html">curs_bkgd(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-bkgdset">bkgdset</a></li>
+<li><a href="#h3-bkgd">bkgd</a></li>
+<li><a href="#h3-getbkgd">getbkgd</a></li>
+</ul>
+</li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_bkgrnd.3x.html b/doc/html/man/curs_bkgrnd.3x.html
new file mode 100644
index 0000000..87b126c
--- /dev/null
+++ b/doc/html/man/curs_bkgrnd.3x.html
@@ -0,0 +1,156 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 2002-2015,2017 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_bkgrnd.3x,v 1.16 2022/06/25 21:57: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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_bkgrnd 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_bkgrnd 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_bkgrnd.3x.html">curs_bkgrnd(3x)</A></STRONG>                                                <STRONG><A HREF="curs_bkgrnd.3x.html">curs_bkgrnd(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>bkgrnd</STRONG>,  <STRONG>wbkgrnd</STRONG>, <STRONG>bkgrndset</STRONG>, <STRONG>wbkgrndset</STRONG>, <STRONG>getbkgrnd</STRONG>, <STRONG>wgetbkgrnd</STRONG> - <STRONG>curses</STRONG>
+       window complex background manipulation routines
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>bkgrnd(</STRONG> <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>wch</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wbkgrnd(</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>wch</EM><STRONG>);</STRONG>
+
+       <STRONG>void</STRONG> <STRONG>bkgrndset(const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>wch</EM> <STRONG>);</STRONG>
+       <STRONG>void</STRONG> <STRONG>wbkgrndset(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>wch</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>getbkgrnd(cchar_t</STRONG> <STRONG>*</STRONG><EM>wch</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wgetbkgrnd(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>wch</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+
+</PRE><H3><a name="h3-bkgrndset">bkgrndset</a></H3><PRE>
+       The <STRONG>bkgrndset</STRONG> and <STRONG>wbkgrndset</STRONG> routines manipulate the background of  the
+       named  window.   The  window  background is a <STRONG>cchar_t</STRONG> consisting of any
+       combination of attributes (i.e., rendition) and a complex character.
+
+       <STRONG>o</STRONG>   The attribute part of the background is combined (OR'ed)  with  all
+           non-blank characters that are written into the window with <STRONG>waddch</STRONG>.
+
+       <STRONG>o</STRONG>   Both  the  character  and  attribute  parts  of  the background are
+           combined with the blank characters.
+
+       The background becomes a property of the character and moves  with  the
+       character   through  any  scrolling  and  insert/delete  line/character
+       operations.
+
+       To the extent possible on a particular terminal, the attribute part  of
+       the  background  is displayed as the graphic rendition of the character
+       put on the screen.
+
+
+</PRE><H3><a name="h3-bkgrnd">bkgrnd</a></H3><PRE>
+       The <STRONG>bkgrnd</STRONG> and <STRONG>wbkgrnd</STRONG> functions set the  background  property  of  the
+       current  or  specified  window  and  then  apply  this setting to every
+       character position in that window:
+
+       <STRONG>o</STRONG>   The rendition of every character on the screen is  changed  to  the
+           new background rendition.
+
+       <STRONG>o</STRONG>   Wherever  the former background character appears, it is changed to
+           the new background character.
+
+
+</PRE><H3><a name="h3-getbkgrnd">getbkgrnd</a></H3><PRE>
+       The <STRONG>getbkgrnd</STRONG> function returns the given  window's  current  background
+       character/attribute  pair  via  the  <STRONG>wch</STRONG>  pointer.  If the given window
+       pointer is null, the character is not updated (but no error returned).
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       Note that <STRONG>bkgrnd</STRONG>, <STRONG>bkgrndset</STRONG>, and <STRONG>getbkgrnd</STRONG> may be macros.
+
+       X/Open Curses does not provide details on how the rendition is changed.
+       This  implementation follows the approach used in SVr4 curses, which is
+       explained in the manual page for <STRONG>wbkgd</STRONG>.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       The <STRONG>bkgrndset</STRONG> and <STRONG>wbkgrndset</STRONG> routines do not return a value.
+
+       Upon successful completion, the other functions return <STRONG>OK</STRONG>.   Otherwise,
+       they return <STRONG>ERR</STRONG>:
+
+       <STRONG>o</STRONG>   A null window pointer is treated as an error.
+
+       <STRONG>o</STRONG>   A null character pointer is treated as an error.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These  functions  are  described  in  the  XSI Curses standard, Issue 4
+       (X/Open Curses).
+
+
+</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_bkgd.3x.html">curs_bkgd(3x)</A></STRONG>
+
+
+
+                                                               <STRONG><A HREF="curs_bkgrnd.3x.html">curs_bkgrnd(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-bkgrndset">bkgrndset</a></li>
+<li><a href="#h3-bkgrnd">bkgrnd</a></li>
+<li><a href="#h3-getbkgrnd">getbkgrnd</a></li>
+</ul>
+</li>
+<li><a href="#h2-NOTES">NOTES</a></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>
diff --git a/doc/html/man/curs_border.3x.html b/doc/html/man/curs_border.3x.html
new file mode 100644
index 0000000..abb2a4e
--- /dev/null
+++ b/doc/html/man/curs_border.3x.html
@@ -0,0 +1,161 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2007,2010 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_border.3x,v 1.30 2022/02/12 20:06:41 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_border 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_border 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_border.3x.html">curs_border(3x)</A></STRONG>                                                <STRONG><A HREF="curs_border.3x.html">curs_border(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>border</STRONG>, <STRONG>wborder</STRONG>, <STRONG>box</STRONG>, <STRONG>hline</STRONG>, <STRONG>whline</STRONG>, <STRONG>vline</STRONG>, <STRONG>wvline</STRONG>, <STRONG>mvhline</STRONG>, <STRONG>mvwhline</STRONG>,
+       <STRONG>mvvline</STRONG>, <STRONG>mvwvline</STRONG> - create <STRONG>curses</STRONG> borders, horizontal and vertical
+       lines
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>border(chtype</STRONG> <EM>ls</EM><STRONG>,</STRONG> <STRONG>chtype</STRONG> <EM>rs</EM><STRONG>,</STRONG> <STRONG>chtype</STRONG> <EM>ts</EM><STRONG>,</STRONG> <STRONG>chtype</STRONG> <EM>bs</EM><STRONG>,</STRONG>
+                  <STRONG>chtype</STRONG> <EM>tl</EM><STRONG>,</STRONG> <STRONG>chtype</STRONG> <EM>tr</EM><STRONG>,</STRONG> <STRONG>chtype</STRONG> <EM>bl</EM><STRONG>,</STRONG> <STRONG>chtype</STRONG> <EM>br</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wborder(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>chtype</STRONG> <EM>ls</EM><STRONG>,</STRONG> <STRONG>chtype</STRONG> <EM>rs</EM><STRONG>,</STRONG>
+                   <STRONG>chtype</STRONG> <EM>ts</EM><STRONG>,</STRONG> <STRONG>chtype</STRONG> <EM>bs</EM><STRONG>,</STRONG> <STRONG>chtype</STRONG> <EM>tl</EM><STRONG>,</STRONG> <STRONG>chtype</STRONG> <EM>tr</EM><STRONG>,</STRONG>
+                   <STRONG>chtype</STRONG> <EM>bl</EM><STRONG>,</STRONG> <STRONG>chtype</STRONG> <EM>br</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>box(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>chtype</STRONG> <EM>verch</EM><STRONG>,</STRONG> <STRONG>chtype</STRONG> <EM>horch</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>hline(chtype</STRONG> <EM>ch</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>whline(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>chtype</STRONG> <EM>ch</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>vline(chtype</STRONG> <EM>ch</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wvline(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>chtype</STRONG> <EM>ch</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>mvhline(int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>chtype</STRONG> <EM>ch</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvwhline(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>chtype</STRONG> <EM>ch</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvvline(int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>chtype</STRONG> <EM>ch</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvwvline(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>chtype</STRONG> <EM>ch</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The  <STRONG>border</STRONG>,  <STRONG>wborder</STRONG> and <STRONG>box</STRONG> routines draw a box around the edges of a
+       window.  Other than the window, each argument is a character  with  at-
+       tributes:
+
+              <EM>ls</EM> - left side,
+              <EM>rs</EM> - right side,
+              <EM>ts</EM> - top side,
+              <EM>bs</EM> - bottom side,
+              <EM>tl</EM> - top left-hand corner,
+              <EM>tr</EM> - top right-hand corner,
+              <EM>bl</EM> - bottom left-hand corner, and
+              <EM>br</EM> - bottom right-hand corner.
+
+       If  any of these arguments is zero, then the corresponding default val-
+       ues (defined in <STRONG>curses.h</STRONG>) are used instead:
+
+              <STRONG>ACS_VLINE</STRONG>,
+              <STRONG>ACS_VLINE</STRONG>,
+              <STRONG>ACS_HLINE</STRONG>,
+              <STRONG>ACS_HLINE</STRONG>,
+              <STRONG>ACS_ULCORNER</STRONG>,
+              <STRONG>ACS_URCORNER</STRONG>,
+              <STRONG>ACS_LLCORNER</STRONG>,
+              <STRONG>ACS_LRCORNER</STRONG>.
+
+       <STRONG>box(</STRONG><EM>win</EM><STRONG>,</STRONG> <EM>verch</EM><STRONG>,</STRONG> <EM>horch</EM><STRONG>)</STRONG> is a shorthand for  the  following  call:  <STRONG>wbor-</STRONG>
+       <STRONG>der(</STRONG><EM>win</EM><STRONG>,</STRONG> <EM>verch</EM><STRONG>,</STRONG> <EM>verch</EM><STRONG>,</STRONG> <EM>horch</EM><STRONG>,</STRONG> <EM>horch</EM><STRONG>,</STRONG> <STRONG>0,</STRONG> <STRONG>0,</STRONG> <STRONG>0,</STRONG> <STRONG>0)</STRONG>.
+
+       The  <STRONG>hline</STRONG>  and <STRONG>whline</STRONG> functions draw a horizontal (left to right) line
+       using <EM>ch</EM> starting at the current cursor position in  the  window.   The
+       current  cursor position is not changed.  The line is at most <EM>n</EM> charac-
+       ters long, or as many as fit into the window.
+
+       The <STRONG>vline</STRONG> and <STRONG>wvline</STRONG> functions draw a vertical (top to bottom) line us-
+       ing <EM>ch</EM> starting at the current cursor position in the window.  The cur-
+       rent cursor position is not changed.  The line is at most <EM>n</EM>  characters
+       long, or as many as fit into the window.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       All  routines return the integer <STRONG>OK</STRONG>.  The SVr4.0 manual says "or a non-
+       negative integer if <STRONG>immedok</STRONG> is set", but this appears to be an error.
+
+       X/Open does not define any error conditions.  This  implementation  re-
+       turns an error if the window pointer is null.
+
+       Functions  with  a  "mv"  prefix  first perform a cursor movement using
+       <STRONG>wmove</STRONG>, and return an error if the position is outside the window, or if
+       the window pointer is null.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  borders  generated  by these functions are <EM>inside</EM> borders (this is
+       also true of SVr4 curses, though the fact is not documented).
+
+       Note that <STRONG>border</STRONG> and <STRONG>box</STRONG> may be macros.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These functions are described in the XSI Curses standard, Issue 4.  The
+       standard  specifies  that  they return <STRONG>ERR</STRONG> on failure, but specifies no
+       error conditions.
+
+
+</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_outopts.3x.html">curs_outopts(3x)</A></STRONG>.
+
+
+
+                                                               <STRONG><A HREF="curs_border.3x.html">curs_border(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_border_set.3x.html b/doc/html/man/curs_border_set.3x.html
new file mode 100644
index 0000000..589342a
--- /dev/null
+++ b/doc/html/man/curs_border_set.3x.html
@@ -0,0 +1,177 @@
+<!--
+  ****************************************************************************
+  * Copyright 2019-2021,2022 Thomas E. Dickey                                *
+  * Copyright 2002-2011,2012 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_border_set.3x,v 1.16 2022/02/12 20:06:41 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_border_set 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_border_set 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_border_set.3x.html">curs_border_set(3x)</A></STRONG>                                        <STRONG><A HREF="curs_border_set.3x.html">curs_border_set(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>border_set</STRONG>, <STRONG>wborder_set</STRONG>, <STRONG>box_set</STRONG>, <STRONG>hline_set</STRONG>, <STRONG>whline_set</STRONG>, <STRONG>mvhline_set</STRONG>,
+       <STRONG>mvwhline_set</STRONG>, <STRONG>vline_set</STRONG>, <STRONG>wvline_set</STRONG>, <STRONG>mvvline_set</STRONG>, <STRONG>mvwvline_set</STRONG> - create
+       <STRONG>curses</STRONG> borders or lines using complex characters and renditions
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>border_set(</STRONG>
+          <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>ls</EM>, <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>rs</EM>,
+          <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>ts</EM>, <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>bs</EM>,
+          <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>tl</EM>, <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>tr</EM>,
+          <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>bl</EM>, <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>br</EM> <STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wborder_set(</STRONG>
+          <STRONG>WINDOW</STRONG> <STRONG>*win</STRONG>,
+          <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>ls</EM>, <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>rs</EM>,
+          <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>ts</EM>, <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>bs</EM>,
+          <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>tl</EM>, <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>tr</EM>,
+          <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>bl</EM>, <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>br</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>box_set(</STRONG>
+          <STRONG>WINDOW</STRONG> <STRONG>*win</STRONG>,
+          <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>verch</EM>,
+          <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>horch</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>hline_set(</STRONG>
+          <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>wch</EM>, <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>whline_set(</STRONG>
+          <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM>,
+          <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>wch</EM>, <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvhline_set(</STRONG>
+          <STRONG>int</STRONG> <EM>y</EM>, <STRONG>int</STRONG> <EM>x</EM>,
+          <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>wch</EM>, <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvwhline_set(</STRONG>
+          <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM>,
+          <STRONG>int</STRONG> <EM>y</EM>, <STRONG>int</STRONG> <EM>x</EM>,
+          <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>wch</EM>, <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>vline_set(</STRONG>
+          <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>wch</EM>, <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wvline_set(</STRONG>
+          <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM>,
+          <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>wch</EM>, <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvvline_set(</STRONG>
+          <STRONG>int</STRONG> <EM>y</EM>, <STRONG>int</STRONG> <EM>x</EM>,
+          <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>wch</EM>, <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvwvline_set(</STRONG>
+          <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM>,
+          <STRONG>int</STRONG> <EM>y</EM>, <STRONG>int</STRONG> <EM>x</EM>,
+          <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>wch</EM>, <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The <STRONG>border_set</STRONG> and <STRONG>wborder_set</STRONG> functions draw a border around the edges
+       of the current or specified window.  These functions do not change  the
+       cursor position, and do not wrap.
+
+       Other  than  the  window, each argument is a complex character with at-
+       tributes:
+              <EM>ls</EM> - left side,
+              <EM>rs</EM> - right side,
+              <EM>ts</EM> - top side,
+              <EM>bs</EM> - bottom side,
+              <EM>tl</EM> - top left-hand corner,
+              <EM>tr</EM> - top right-hand corner,
+              <EM>bl</EM> - bottom left-hand corner, and
+              <EM>br</EM> - bottom right-hand corner.
+
+       If any of these arguments is zero, then the corresponding default  val-
+       ues (defined in <STRONG>curses.h</STRONG>) are used instead:
+              <STRONG>WACS_VLINE</STRONG>,
+              <STRONG>WACS_VLINE</STRONG>,
+              <STRONG>WACS_HLINE</STRONG>,
+              <STRONG>WACS_HLINE</STRONG>,
+              <STRONG>WACS_ULCORNER</STRONG>,
+              <STRONG>WACS_URCORNER</STRONG>,
+              <STRONG>WACS_LLCORNER</STRONG>, and
+              <STRONG>WACS_LRCORNER</STRONG>.
+
+       <STRONG>box_set(</STRONG><EM>win</EM>, <EM>verch</EM><STRONG>,</STRONG> <EM>horch</EM><STRONG>);</STRONG> is a shorthand for the following call:
+
+       <STRONG>wborder_set(</STRONG><EM>win</EM><STRONG>,</STRONG> <EM>verch</EM><STRONG>,</STRONG> <EM>verch</EM><STRONG>,</STRONG>
+           <EM>horch</EM><STRONG>,</STRONG> <EM>horch</EM><STRONG>,</STRONG> <STRONG>NULL,</STRONG> <STRONG>NULL,</STRONG> <STRONG>NULL,</STRONG> <STRONG>NULL);</STRONG>
+
+       The  <STRONG>*line_set</STRONG> functions use <EM>wch</EM> to draw a line starting at the current
+       cursor position in the window.  The line is at most <EM>n</EM>  characters  long
+       or  as many as fit into the window.  The current cursor position is not
+       changed.
+
+       The <STRONG>hline_set</STRONG>, <STRONG>mvhline_set</STRONG>, <STRONG>mvwhline_set</STRONG>, and <STRONG>whline_set</STRONG> functions draw
+       a line proceeding toward the last column of the same line.
+
+       The <STRONG>vline_set</STRONG>, <STRONG>mvvline_set</STRONG>, <STRONG>mvwvline_set</STRONG>, and <STRONG>wvline_set</STRONG> functions draw
+       a line proceeding toward the last line of the window.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       Note  that  <STRONG>border_set</STRONG>,  <STRONG>hline_set</STRONG>,  <STRONG>mvhline_set</STRONG>,  <STRONG>mvvline_set</STRONG>,   <STRONG>mvwh-</STRONG>
+       <STRONG>line_set</STRONG>, <STRONG>mvwvline_set</STRONG>, and <STRONG>vline_set</STRONG> may be macros.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       Upon successful completion, these functions return <STRONG>OK</STRONG>.  Otherwise, they
+       return <STRONG>ERR</STRONG>.
+
+       Functions using a window parameter return an error if it is null.
+
+       Functions with a "mv" prefix first  perform  a  cursor  movement  using
+       <STRONG>wmove</STRONG>, and return an error if the position is outside the window, or if
+       the window pointer is null.
+
+
+</PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
+       <STRONG><A HREF="ncurses.3x.html">ncurses(3x)</A></STRONG>, <STRONG><A HREF="curs_add_wch.3x.html">curs_add_wch(3x)</A></STRONG>, <STRONG><A HREF="curs_border.3x.html">curs_border(3x)</A></STRONG>, <STRONG><A HREF="curs_outopts.3x.html">curs_outopts(3x)</A></STRONG>
+
+
+
+                                                           <STRONG><A HREF="curs_border_set.3x.html">curs_border_set(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></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_clear.3x.html b/doc/html/man/curs_clear.3x.html
new file mode 100644
index 0000000..5162d27
--- /dev/null
+++ b/doc/html/man/curs_clear.3x.html
@@ -0,0 +1,164 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2016 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_clear.3x,v 1.27 2022/11/26 16:23:47 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_clear 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_clear 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_clear.3x.html">curs_clear(3x)</A></STRONG>                                                  <STRONG><A HREF="curs_clear.3x.html">curs_clear(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>erase</STRONG>, <STRONG>werase</STRONG>, <STRONG>clear</STRONG>, <STRONG>wclear</STRONG>, <STRONG>clrtobot</STRONG>, <STRONG>wclrtobot</STRONG>, <STRONG>clrtoeol</STRONG>, <STRONG>wclrtoeol</STRONG>
+       - clear all or part of a <STRONG>curses</STRONG> window
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>erase(void);</STRONG>
+       <STRONG>int</STRONG> <STRONG>werase(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>clear(void);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wclear(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>clrtobot(void);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wclrtobot(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>clrtoeol(void);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wclrtoeol(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+
+</PRE><H3><a name="h3-erase_werase">erase/werase</a></H3><PRE>
+       The <STRONG>erase</STRONG> and <STRONG>werase</STRONG> routines copy blanks to every position in the win-
+       dow, clearing the screen.
+
+       Blanks created by erasure have the current background rendition (as set
+       by <STRONG><A HREF="curs_bkgd.3x.html">wbkgdset(3x)</A></STRONG>) merged into them.
+
+
+</PRE><H3><a name="h3-clear_wclear">clear/wclear</a></H3><PRE>
+       The <STRONG>clear</STRONG> and <STRONG>wclear</STRONG> routines are like <STRONG>erase</STRONG> and <STRONG>werase</STRONG>, but they  also
+       call  <STRONG><A HREF="curs_outopts.3x.html">clearok(3x)</A></STRONG>, so that the screen is cleared completely on the next
+       call to <STRONG>wrefresh</STRONG> for that window and repainted from scratch.
+
+
+</PRE><H3><a name="h3-clrtobot_wclrtobot">clrtobot/wclrtobot</a></H3><PRE>
+       The <STRONG>clrtobot</STRONG> and <STRONG>wclrtobot</STRONG> routines erase from the cursor to the end of
+       screen.   That is, they erase all lines below the cursor in the window.
+       Also, the current line to  the  right  of  the  cursor,  inclusive,  is
+       erased.
+
+
+</PRE><H3><a name="h3-clrtoeol_wclrtoeol">clrtoeol/wclrtoeol</a></H3><PRE>
+       The <STRONG>clrtoeol</STRONG> and <STRONG>wclrtoeol</STRONG> routines erase the current line to the right
+       of the cursor, inclusive, to the end of the current line.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       All routines return the integer <STRONG>OK</STRONG> on success and <STRONG>ERR</STRONG> on failure.
+
+       X/Open defines no error conditions.  In this implementation,
+
+       <STRONG>o</STRONG>   functions using a window pointer parameter return an error if it is
+           null
+
+       <STRONG>o</STRONG>   <STRONG>wclrtoeol</STRONG> returns an error if the cursor position is about to wrap.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       Note  that  <STRONG>erase</STRONG>, <STRONG>werase</STRONG>, <STRONG>clear</STRONG>, <STRONG>wclear</STRONG>, <STRONG>clrtobot</STRONG>, and <STRONG>clrtoeol</STRONG> may be
+       macros.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These functions are described in the XSI Curses standard, Issue 4.  The
+       standard  specifies  that  they return <STRONG>ERR</STRONG> on failure, but specifies no
+       error conditions.
+
+       The SVr4.0 manual says that these functions could return  "a  non-nega-
+       tive  integer  if <STRONG><A HREF="curs_outopts.3x.html">immedok(3x)</A></STRONG> is set", referring to the return-value of
+       <STRONG>wrefresh</STRONG>.  In that implementation, <STRONG>wrefresh</STRONG> would return a count of the
+       number of characters written to the terminal.
+
+       Some  historic  curses implementations had, as an undocumented feature,
+       the ability to do the equivalent of <STRONG>clearok(...,</STRONG> <STRONG>1)</STRONG>  by  saying  <STRONG>touch-</STRONG>
+       <STRONG>win(stdscr)</STRONG> or <STRONG>clear(stdscr)</STRONG>.  This will not work under ncurses.
+
+       This implementation, and others such as Solaris, sets the current posi-
+       tion to 0,0 after erasing via <STRONG>werase</STRONG> and <STRONG>wclear</STRONG>.  That fact is not doc-
+       umented  in  other  implementations, and may not be true of implementa-
+       tions which were not derived from SVr4 source.
+
+       Not obvious from the description, most implementations clear the screen
+       after  <STRONG>wclear</STRONG>  even  for  a subwindow or derived window.  If you do not
+       want to clear the screen during the next <STRONG>wrefresh</STRONG>, use <STRONG>werase</STRONG> instead.
+
+
+</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_outopts.3x.html">curs_outopts(3x)</A></STRONG>, <STRONG><A HREF="curs_refresh.3x.html">curs_refresh(3x)</A></STRONG>, <STRONG><A HREF="curs_variables.3x.html">curs_variables(3x)</A></STRONG>
+
+
+
+                                                                <STRONG><A HREF="curs_clear.3x.html">curs_clear(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-erase_werase">erase/werase</a></li>
+<li><a href="#h3-clear_wclear">clear/wclear</a></li>
+<li><a href="#h3-clrtobot_wclrtobot">clrtobot/wclrtobot</a></li>
+<li><a href="#h3-clrtoeol_wclrtoeol">clrtoeol/wclrtoeol</a></li>
+</ul>
+</li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_color.3x.html b/doc/html/man/curs_color.3x.html
new file mode 100644
index 0000000..15ad174
--- /dev/null
+++ b/doc/html/man/curs_color.3x.html
@@ -0,0 +1,564 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2016,2017 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_color.3x,v 1.68 2022/02/12 20:06:41 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_color 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_color 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_color.3x.html">curs_color(3x)</A></STRONG>                                                  <STRONG><A HREF="curs_color.3x.html">curs_color(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>start_color</STRONG>, <STRONG>has_colors</STRONG>, <STRONG>can_change_color</STRONG>, <STRONG>init_pair</STRONG>, <STRONG>init_color</STRONG>,
+       <STRONG>init_extended_pair</STRONG>, <STRONG>init_extended_color</STRONG>, <STRONG>color_content</STRONG>, <STRONG>pair_content</STRONG>,
+       <STRONG>extended_color_content</STRONG>, <STRONG>extended_pair_content</STRONG>, <STRONG>reset_color_pairs</STRONG>,
+       <STRONG>COLOR_PAIR</STRONG>, <STRONG>PAIR_NUMBER</STRONG> - <STRONG>curses</STRONG> color manipulation routines
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>start_color(void);</STRONG>
+
+       <STRONG>bool</STRONG> <STRONG>has_colors(void);</STRONG>
+       <STRONG>bool</STRONG> <STRONG>can_change_color(void);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>init_pair(short</STRONG> <EM>pair</EM><STRONG>,</STRONG> <STRONG>short</STRONG> <EM>f</EM><STRONG>,</STRONG> <STRONG>short</STRONG> <EM>b</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>init_color(short</STRONG> <EM>color</EM><STRONG>,</STRONG> <STRONG>short</STRONG> <EM>r</EM><STRONG>,</STRONG> <STRONG>short</STRONG> <EM>g</EM><STRONG>,</STRONG> <STRONG>short</STRONG> <EM>b</EM><STRONG>);</STRONG>
+       /* extensions */
+       <STRONG>int</STRONG> <STRONG>init_extended_pair(int</STRONG> <EM>pair</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>f</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>b</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>init_extended_color(int</STRONG> <EM>color</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>r</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>g</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>b</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>color_content(short</STRONG> <EM>color</EM><STRONG>,</STRONG> <STRONG>short</STRONG> <STRONG>*</STRONG><EM>r</EM><STRONG>,</STRONG> <STRONG>short</STRONG> <STRONG>*</STRONG><EM>g</EM><STRONG>,</STRONG> <STRONG>short</STRONG> <STRONG>*</STRONG><EM>b</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>pair_content(short</STRONG> <EM>pair</EM><STRONG>,</STRONG> <STRONG>short</STRONG> <STRONG>*</STRONG><EM>f</EM><STRONG>,</STRONG> <STRONG>short</STRONG> <STRONG>*</STRONG><EM>b</EM><STRONG>);</STRONG>
+       /* extensions */
+       <STRONG>int</STRONG> <STRONG>extended_color_content(int</STRONG> <EM>color</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <STRONG>*</STRONG><EM>r</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <STRONG>*</STRONG><EM>g</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <STRONG>*</STRONG><EM>b</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>extended_pair_content(int</STRONG> <EM>pair</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <STRONG>*</STRONG><EM>f</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <STRONG>*</STRONG><EM>b</EM><STRONG>);</STRONG>
+
+       /* extensions */
+       <STRONG>void</STRONG> <STRONG>reset_color_pairs(void);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>COLOR_PAIR(int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+       <STRONG>PAIR_NUMBER(</STRONG><EM>attrs</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+
+</PRE><H3><a name="h3-Overview">Overview</a></H3><PRE>
+       <STRONG>curses</STRONG> supports color attributes on terminals with that capability.  To
+       use  these  routines  <STRONG>start_color</STRONG>  must  be called, usually right after
+       <STRONG>initscr</STRONG>.  Colors are always used in pairs (referred to as color-pairs).
+       A  color-pair  consists  of  a  foreground color (for characters) and a
+       background color (for the blank field on which the characters are  dis-
+       played).   A  programmer  initializes  a  color-pair  with  the routine
+       <STRONG>init_pair</STRONG>.  After it has been initialized, <STRONG>COLOR_PAIR</STRONG>(<EM>n</EM>) can be used to
+       convert the pair to a video attribute.
+
+       If  a  terminal is capable of redefining colors, the programmer can use
+       the routine <STRONG>init_color</STRONG> to change the definition of a color.   The  rou-
+       tines  <STRONG>has_colors</STRONG>  and <STRONG>can_change_color</STRONG> return <STRONG>TRUE</STRONG> or <STRONG>FALSE</STRONG>, depending
+       on whether the terminal has color capabilities and whether the program-
+       mer can change the colors.  The routine <STRONG>color_content</STRONG> allows a program-
+       mer to extract the amounts of red, green, and  blue  components  in  an
+       initialized  color.   The  routine  <STRONG>pair_content</STRONG> allows a programmer to
+       find out how a given color-pair is currently defined.
+
+
+</PRE><H3><a name="h3-Color-Rendering">Color Rendering</a></H3><PRE>
+       The <STRONG>curses</STRONG> library combines these inputs to produce  the  actual  fore-
+       ground and background colors shown on the screen:
+
+       <STRONG>o</STRONG>   per-character video attributes (e.g., via <STRONG>waddch</STRONG>),
+
+       <STRONG>o</STRONG>   the window attribute (e.g., by <STRONG>wattrset</STRONG>), and
+
+       <STRONG>o</STRONG>   the background character (e.g., <STRONG>wbkgdset</STRONG>).
+
+       Per-character and window attributes are usually set by a parameter con-
+       taining video attributes including a color pair value.  Some  functions
+       such as <STRONG>wattr_set</STRONG> use a separate parameter which is the color pair num-
+       ber.
+
+       The background character is a special case:  it  includes  a  character
+       value, just as if it were passed to <STRONG>waddch</STRONG>.
+
+       The  <STRONG>curses</STRONG> library does the actual work of combining these color pairs
+       in an internal function called from <STRONG>waddch</STRONG>:
+
+       <STRONG>o</STRONG>   If the parameter passed to <STRONG>waddch</STRONG> is <EM>blank</EM>, and it uses the special
+           color pair 0,
+
+           <STRONG>o</STRONG>   <STRONG>curses</STRONG> next checks the window attribute.
+
+           <STRONG>o</STRONG>   If  the window attribute does not use color pair 0, <STRONG>curses</STRONG> uses
+               the color pair from the window attribute.
+
+           <STRONG>o</STRONG>   Otherwise, <STRONG>curses</STRONG> uses the background character.
+
+       <STRONG>o</STRONG>   If the parameter passed to <STRONG>waddch</STRONG> is <EM>not</EM> <EM>blank</EM>, or it does not  use
+           the  special  color  pair 0, <STRONG>curses</STRONG> prefers the color pair from the
+           parameter, if it is nonzero.  Otherwise, it tries the window attri-
+           bute next, and finally the background character.
+
+       Some  <STRONG>curses</STRONG>  functions such as <STRONG>wprintw</STRONG> call <STRONG>waddch</STRONG>.  Those do not com-
+       bine its parameter with a color pair.  Consequently those calls use on-
+       ly the window attribute or the background character.
+
+
+</PRE><H2><a name="h2-CONSTANTS">CONSTANTS</a></H2><PRE>
+       In <STRONG>&lt;curses.h&gt;</STRONG> the following macros are defined.  These are the standard
+       colors (ISO-6429).  <STRONG>curses</STRONG> also assumes that <STRONG>COLOR_BLACK</STRONG> is the default
+       background color for all terminals.
+
+             <STRONG>COLOR_BLACK</STRONG>
+             <STRONG>COLOR_RED</STRONG>
+             <STRONG>COLOR_GREEN</STRONG>
+             <STRONG>COLOR_YELLOW</STRONG>
+             <STRONG>COLOR_BLUE</STRONG>
+             <STRONG>COLOR_MAGENTA</STRONG>
+             <STRONG>COLOR_CYAN</STRONG>
+             <STRONG>COLOR_WHITE</STRONG>
+
+       Some  terminals  support  more than the eight (8) "ANSI" colors.  There
+       are no standard names for those additional colors.
+
+
+</PRE><H2><a name="h2-VARIABLES">VARIABLES</a></H2><PRE>
+
+</PRE><H3><a name="h3-COLORS">COLORS</a></H3><PRE>
+       is initialized by <STRONG>start_color</STRONG> to the maximum number of colors the  ter-
+       minal can support.
+
+
+</PRE><H3><a name="h3-COLOR_PAIRS">COLOR_PAIRS</a></H3><PRE>
+       is  initialized by <STRONG>start_color</STRONG> to the maximum number of color pairs the
+       terminal can support.
+
+
+</PRE><H2><a name="h2-FUNCTIONS">FUNCTIONS</a></H2><PRE>
+
+</PRE><H3><a name="h3-start_color">start_color</a></H3><PRE>
+       The <STRONG>start_color</STRONG> routine requires no arguments.  It must  be  called  if
+       the  programmer wants to use colors, and before any other color manipu-
+       lation routine is called.  It is good practice  to  call  this  routine
+       right after <STRONG>initscr</STRONG>.  <STRONG>start_color</STRONG> does this:
+
+       <STRONG>o</STRONG>   It  initializes  two  global variables, <STRONG>COLORS</STRONG> and <STRONG>COLOR_PAIRS</STRONG> (re-
+           spectively defining the maximum number of  colors  and  color-pairs
+           the terminal can support).
+
+       <STRONG>o</STRONG>   It  initializes  the special color pair <STRONG>0</STRONG> to the default foreground
+           and background colors.  No other color pairs are initialized.
+
+       <STRONG>o</STRONG>   It restores the colors on the terminal to the values they had  when
+           the terminal was just turned on.
+
+       <STRONG>o</STRONG>   If  the  terminal supports the <STRONG>initc</STRONG> (<STRONG>initialize_color</STRONG>) capability,
+           <STRONG>start_color</STRONG> initializes its internal table  representing  the  red,
+           green, and blue components of the color palette.
+
+           The components depend on whether the terminal uses CGA (aka "ANSI")
+           or HLS (i.e.,  the  <STRONG>hls</STRONG>  (<STRONG>hue_lightness_saturation</STRONG>)  capability  is
+           set).   The  table  is  initialized  first  for  eight basic colors
+           (black, red, green, yellow, blue, magenta, cyan, and white),  using
+           weights that depend upon the CGA/HLS choice.  For "ANSI" colors the
+           weights are <STRONG>680</STRONG> or <STRONG>0</STRONG> depending on whether  the  corresponding  red,
+           green,  or  blue component is used or not.  That permits using <STRONG>1000</STRONG>
+           to represent bold/bright colors.  After the  initial  eight  colors
+           (if  the  terminal  supports more than eight colors) the components
+           are initialized using the same pattern, but with weights  of  <STRONG>1000</STRONG>.
+           SVr4 uses a similar scheme, but uses <STRONG>1000</STRONG> for the components of the
+           initial eight colors.
+
+           <STRONG>start_color</STRONG> does not attempt to set the terminal's color palette to
+           match its built-in table.  An application may use <STRONG>init_color</STRONG> to al-
+           ter the internal table along with the terminal's color.
+
+       These limits apply to color values and  color  pairs.   Values  outside
+       these limits are not legal, and may result in a runtime error:
+
+       <STRONG>o</STRONG>   <STRONG>COLORS</STRONG>  corresponds to the terminal database's <STRONG>max_colors</STRONG> capabili-
+           ty, (see <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG>).
+
+       <STRONG>o</STRONG>   color values are expected to be in the range <STRONG>0</STRONG> to <STRONG>COLORS-1</STRONG>,  inclu-
+           sive (including <STRONG>0</STRONG> and <STRONG>COLORS-1</STRONG>).
+
+       <STRONG>o</STRONG>   a  special  color value <STRONG>-1</STRONG> is used in certain extended functions to
+           denote the <EM>default</EM> <EM>color</EM> (see <STRONG><A HREF="default_colors.3x.html">use_default_colors(3x)</A></STRONG>).
+
+       <STRONG>o</STRONG>   <STRONG>COLOR_PAIRS</STRONG> corresponds to the terminal database's <STRONG>max_pairs</STRONG>  capa-
+           bility, (see <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG>).
+
+       <STRONG>o</STRONG>   legal color pair values are in the range <STRONG>1</STRONG> to <STRONG>COLOR_PAIRS-1</STRONG>, inclu-
+           sive.
+
+       <STRONG>o</STRONG>   color pair <STRONG>0</STRONG> is special; it denotes "no color".
+
+           Color pair <STRONG>0</STRONG> is assumed to be white on black, but is actually what-
+           ever  the terminal implements before color is initialized.  It can-
+           not be modified by the application.
+
+
+</PRE><H3><a name="h3-has_colors">has_colors</a></H3><PRE>
+       The <STRONG>has_colors</STRONG> routine requires no arguments.  It returns <STRONG>TRUE</STRONG>  if  the
+       terminal can manipulate colors; otherwise, it returns <STRONG>FALSE</STRONG>.  This rou-
+       tine facilitates writing terminal-independent programs.  For example, a
+       programmer  can  use  it  to  decide whether to use color or some other
+       video attribute.
+
+
+</PRE><H3><a name="h3-can_change_color">can_change_color</a></H3><PRE>
+       The <STRONG>can_change_color</STRONG> routine requires no arguments.  It returns <STRONG>TRUE</STRONG> if
+       the  terminal  supports colors and can change their definitions; other,
+       it returns <STRONG>FALSE</STRONG>.  This routine facilitates  writing  terminal-indepen-
+       dent programs.
+
+
+</PRE><H3><a name="h3-init_pair">init_pair</a></H3><PRE>
+       The <STRONG>init_pair</STRONG> routine changes the definition of a color-pair.  It takes
+       three arguments: the number of the color-pair to be changed, the  fore-
+       ground color number, and the background color number.  For portable ap-
+       plications:
+
+       <STRONG>o</STRONG>   The first argument must be a legal color pair  value.   If  default
+           colors are used (see <STRONG><A HREF="default_colors.3x.html">use_default_colors(3x)</A></STRONG>) the upper limit is ad-
+           justed to allow for extra pairs which use a default color in  fore-
+           ground and/or background.
+
+       <STRONG>o</STRONG>   The second and third arguments must be legal color values.
+
+       If  the  color-pair was previously initialized, the screen is refreshed
+       and all occurrences of that color-pair are changed to the  new  defini-
+       tion.
+
+       As  an  extension,  ncurses  allows you to set color pair <STRONG>0</STRONG> via the <STRONG>as-</STRONG>
+       <STRONG><A HREF="assume_default_colors.3x.html">sume_default_colors(3x)</A></STRONG> routine, or to specify the use of default  col-
+       ors  (color  number  <STRONG>-1</STRONG>) if you first invoke the <STRONG><A HREF="default_colors.3x.html">use_default_colors(3x)</A></STRONG>
+       routine.
+
+
+</PRE><H3><a name="h3-init_extended_pair">init_extended_pair</a></H3><PRE>
+       Because <STRONG>init_pair</STRONG> uses signed <STRONG>short</STRONG>s for its  parameters,  that  limits
+       color-pairs  and  color-values to 32767 on modern hardware.  The exten-
+       sion <STRONG>init_extended_pair</STRONG> uses <STRONG>int</STRONG>s for the color-pair  and  color-value,
+       allowing a larger number of colors to be supported.
+
+
+</PRE><H3><a name="h3-init_color">init_color</a></H3><PRE>
+       The  <STRONG>init_color</STRONG>  routine  changes  the definition of a color.  It takes
+       four arguments: the number of the color to be changed followed by three
+       RGB values (for the amounts of red, green, and blue components).
+
+       <STRONG>o</STRONG>   The  first argument must be a legal color value; default colors are
+           not allowed here.  (See the section <STRONG>Colors</STRONG> for  the  default  color
+           index.)
+
+       <STRONG>o</STRONG>   Each  of  the  last  three arguments must be a value in the range <STRONG>0</STRONG>
+           through <STRONG>1000</STRONG>.
+
+       When <STRONG>init_color</STRONG> is used, all occurrences of that color  on  the  screen
+       immediately change to the new definition.
+
+
+</PRE><H3><a name="h3-init_extended_color">init_extended_color</a></H3><PRE>
+       Because  <STRONG>init_color</STRONG>  uses signed <STRONG>short</STRONG>s for its parameters, that limits
+       color-values and their red, green, and blue components to 32767 on mod-
+       ern hardware.  The extension <STRONG>init_extended_color</STRONG> uses <STRONG>int</STRONG>s for the col-
+       or value and for setting the red, green, and blue components,  allowing
+       a larger number of colors to be supported.
+
+
+</PRE><H3><a name="h3-color_content">color_content</a></H3><PRE>
+       The <STRONG>color_content</STRONG> routine gives programmers a way to find the intensity
+       of the red, green, and blue (RGB) components in a color.   It  requires
+       four  arguments:  the  color  number, and three addresses of <STRONG>short</STRONG>s for
+       storing the information about the amounts of red, green, and blue  com-
+       ponents in the given color.
+
+       <STRONG>o</STRONG>   The  first  argument  must  be a legal color value, i.e., <STRONG>0</STRONG> through
+           <STRONG>COLORS-1</STRONG>, inclusive.
+
+       <STRONG>o</STRONG>   The values that are stored at the addresses pointed to by the  last
+           three  arguments  are  in  the  range <STRONG>0</STRONG> (no component) through <STRONG>1000</STRONG>
+           (maximum amount of component), inclusive.
+
+
+</PRE><H3><a name="h3-extended_color_content">extended_color_content</a></H3><PRE>
+       Because <STRONG>color_content</STRONG> uses signed <STRONG>short</STRONG>s for its parameters, that  lim-
+       its  color-values and their red, green, and blue components to 32767 on
+       modern hardware.  The extension <STRONG>extended_color_content</STRONG>  uses  <STRONG>int</STRONG>s  for
+       the  color value and for returning the red, green, and blue components,
+       allowing a larger number of colors to be supported.
+
+
+</PRE><H3><a name="h3-pair_content">pair_content</a></H3><PRE>
+       The <STRONG>pair_content</STRONG> routine allows programmers to find out what  colors  a
+       given  color-pair consists of.  It requires three arguments: the color-
+       pair number, and two addresses of <STRONG>short</STRONG>s for storing the foreground and
+       the background color numbers.
+
+       <STRONG>o</STRONG>   The  first argument must be a legal color value, i.e., in the range
+           <STRONG>1</STRONG> through <STRONG>COLOR_PAIRS-1</STRONG>, inclusive.
+
+       <STRONG>o</STRONG>   The values that are stored at the addresses pointed to by the  sec-
+           ond  and  third arguments are in the range <STRONG>0</STRONG> through <STRONG>COLORS</STRONG>, inclu-
+           sive.
+
+
+</PRE><H3><a name="h3-extended_pair_content">extended_pair_content</a></H3><PRE>
+       Because <STRONG>pair_content</STRONG> uses signed <STRONG>short</STRONG>s for its parameters, that limits
+       color-pair and color-values to 32767 on modern hardware.  The extension
+       <STRONG>extended_pair_content</STRONG> uses <STRONG>int</STRONG>s for the color pair  and  for  returning
+       the  foreground and background colors, allowing a larger number of col-
+       ors to be supported.
+
+
+</PRE><H3><a name="h3-reset_color_pairs">reset_color_pairs</a></H3><PRE>
+       The extension <STRONG>reset_color_pairs</STRONG> tells ncurses to  discard  all  of  the
+       color-pair  information  which was set with <STRONG>init_pair</STRONG>.  It also touches
+       the current- and standard-screens, allowing an  application  to  switch
+       color palettes rapidly.
+
+
+</PRE><H3><a name="h3-PAIR_NUMBER">PAIR_NUMBER</a></H3><PRE>
+       <STRONG>PAIR_NUMBER(</STRONG><EM>attrs</EM>)  extracts  the  color value from its <EM>attrs</EM> parameter
+       and returns it as a color pair number.
+
+
+</PRE><H3><a name="h3-COLOR_PAIR">COLOR_PAIR</a></H3><PRE>
+       Its inverse <STRONG>COLOR_PAIR(</STRONG><EM>n</EM><STRONG>)</STRONG> converts a color pair number to an attribute.
+       Attributes  can  hold color pairs in the range 0 to 255.  If you need a
+       color pair larger than that, you must use functions  such  as  <STRONG>attr_set</STRONG>
+       (which  pass  the  color  pair as a separate parameter) rather than the
+       legacy functions such as <STRONG>attrset</STRONG>.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       The routines <STRONG>can_change_color</STRONG> and <STRONG>has_colors</STRONG> return <STRONG>TRUE</STRONG> or <STRONG>FALSE</STRONG>.
+
+       All other routines return the integer <STRONG>ERR</STRONG> upon failure and an <STRONG>OK</STRONG>  (SVr4
+       specifies  only "an integer value other than <STRONG>ERR</STRONG>") upon successful com-
+       pletion.
+
+       X/Open defines no error conditions.  SVr4 does document some error con-
+       ditions which apply in general:
+
+       <STRONG>o</STRONG>   This implementation will return <STRONG>ERR</STRONG> on attempts to use color values
+           outside the range <STRONG>0</STRONG> to <STRONG>COLORS</STRONG>-1 (except for the default colors  ex-
+           tension), or use color pairs outside the range <STRONG>0</STRONG> to <STRONG>COLOR_PAIRS-1</STRONG>.
+
+           Color values used in <STRONG>init_color</STRONG> must be in the range <STRONG>0</STRONG> to <STRONG>1000</STRONG>.
+
+           An  error  is  returned  from all functions if the terminal has not
+           been initialized.
+
+           An error is returned from secondary functions such as <STRONG>init_pair</STRONG>  if
+           <STRONG>start_color</STRONG> was not called.
+
+       <STRONG>o</STRONG>   SVr4  does much the same, except that it returns <STRONG>ERR</STRONG> from <STRONG>pair_con-</STRONG>
+           <STRONG>tent</STRONG> if the pair was not initialized using <STRONG>init_pairs</STRONG>  and  it  re-
+           turns  <STRONG>ERR</STRONG>  from  <STRONG>color_content</STRONG>  if  the  terminal does not support
+           changing colors.
+
+           This implementation does not return <STRONG>ERR</STRONG> for either case.
+
+       Specific functions make additional checks:
+
+          <STRONG>init_color</STRONG>
+               returns an error if the terminal does not support this feature,
+               e.g.,  if  the  <STRONG>initialize_color</STRONG>  capability is absent from the
+               terminal description.
+
+          <STRONG>start_color</STRONG>
+               returns an error if the color table cannot be allocated.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       In the <STRONG>ncurses</STRONG> implementation, there is  a  separate  color  activation
+       flag,  color palette, color pairs table, and associated <STRONG>COLORS</STRONG> and <STRONG>COL-</STRONG>
+       <STRONG>OR_PAIRS</STRONG> counts for each screen; the <STRONG>start_color</STRONG> function only  affects
+       the current screen.  The SVr4/XSI interface is not really designed with
+       this in mind, and historical implementations may use  a  single  shared
+       color palette.
+
+       Setting  an  implicit  background  color  via a color pair affects only
+       character cells that a character write  operation  explicitly  touches.
+       To  change the background color used when parts of a window are blanked
+       by erasing or scrolling operations, see <STRONG><A HREF="curs_bkgd.3x.html">curs_bkgd(3x)</A></STRONG>.
+
+       Several caveats apply on older x86 machines  (e.g.,  i386,  i486)  with
+       VGA-compatible graphics:
+
+       <STRONG>o</STRONG>   COLOR_YELLOW  is  actually  brown.  To get yellow, use COLOR_YELLOW
+           combined with the <STRONG>A_BOLD</STRONG> attribute.
+
+       <STRONG>o</STRONG>   The A_BLINK attribute should in theory cause the background  to  go
+           bright.  This often fails to work, and even some cards for which it
+           mostly works (such as the Paradise and compatibles)  do  the  wrong
+           thing  when  you try to set a bright "yellow" background (you get a
+           blinking yellow foreground instead).
+
+       <STRONG>o</STRONG>   Color RGB values are not settable.
+
+
+</PRE><H2><a name="h2-HISTORY">HISTORY</a></H2><PRE>
+       SVr3.2 introduced color support to curses in 1987.
+
+       SVr4 made internal changes, e.g., moving  the  storage  for  the  color
+       state  from  <STRONG>SP</STRONG> (the <STRONG>SCREEN</STRONG> structure) to <STRONG>cur_term</STRONG> (the <STRONG>TERMINAL</STRONG> struc-
+       ture), but provided the same set of library functions.
+
+       SVr4 curses limits the number of color pairs  to  64,  reserving  color
+       pair  zero  (0)  as the terminal's initial uncolored state.  This limit
+       arises because the color pair information is a bitfield in  the  <STRONG>chtype</STRONG>
+       data type (denoted by <STRONG>A_COLOR</STRONG>).
+
+       Other implementations of curses had different limits:
+
+       <STRONG>o</STRONG>   PCCurses (1987-1990) provided for only eight (8) colors.
+
+       <STRONG>o</STRONG>   PDCurses  (1992-present)  inherited the 8-color limitation from PC-
+           Curses, but changed this to 256 in version 2.5 (2001),  along  with
+           changing <STRONG>chtype</STRONG> from 16-bits to 32-bits.
+
+       <STRONG>o</STRONG>   X/Open Curses (1992-present) added a new structure <STRONG>cchar_t</STRONG> to store
+           the character, attributes and color-pair values, allowing increased
+           range  of  color-pairs.   Both  color-pairs and color-values used a
+           signed <STRONG>short</STRONG>, limiting values to 15 bits.
+
+       <STRONG>o</STRONG>   ncurses (1992-present) uses eight bits for <STRONG>A_COLOR</STRONG> in  <STRONG>chtype</STRONG>  val-
+           ues.
+
+           Version  5.3  provided  a wide-character interface (2002), but left
+           color-pairs as part of the attributes-field.
+
+           Since version 6 (2015), ncurses uses a separate <STRONG>int</STRONG> for color-pairs
+           in the <STRONG>cchar_t</STRONG> values.  When those color-pair values fit in 8 bits,
+           ncurses allows color-pairs to be manipulated via the functions  us-
+           ing <STRONG>chtype</STRONG> values.
+
+       <STRONG>o</STRONG>   NetBSD  curses  used  6 bits from 2000 (when colors were first sup-
+           ported) until 2004.  At that point, NetBSD changed to use 10  bits.
+           As of 2021, that size is unchanged.  Like ncurses before version 6,
+           the NetBSD color-pair information is stored in the attributes field
+           of  <STRONG>cchar_t</STRONG>,  limiting the number of color-pairs by the size of the
+           bitfield.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       This implementation satisfies XSI Curses's minimum maximums for  <STRONG>COLORS</STRONG>
+       and <STRONG>COLOR_PAIRS</STRONG>.
+
+       The  <STRONG>init_pair</STRONG>  routine accepts negative values of foreground and back-
+       ground color to support the <STRONG><A HREF="default_colors.3x.html">use_default_colors(3x)</A></STRONG> extension, but  only
+       if that routine has been first invoked.
+
+       The assumption that <STRONG>COLOR_BLACK</STRONG> is the default background color for all
+       terminals can be modified using  the  <STRONG><A HREF="default_colors.3x.html">assume_default_colors(3x)</A></STRONG>  exten-
+       sion.
+
+       This  implementation checks the pointers, e.g., for the values returned
+       by <STRONG>color_content</STRONG> and <STRONG>pair_content</STRONG>, and will treat those as optional pa-
+       rameters when null.
+
+       X/Open  Curses  does  not  specify a limit for the number of colors and
+       color pairs which a terminal can support.  However, in its use of <STRONG>short</STRONG>
+       for  the  parameters,  it carries over SVr4's implementation detail for
+       the compiled terminfo database, which uses signed 16-bit numbers.  This
+       implementation  provides extended versions of those functions which use
+       <STRONG>short</STRONG> parameters, allowing applications to use larger color- and  pair-
+       numbers.
+
+       The <STRONG>reset_color_pairs</STRONG> function is an extension of ncurses.
+
+
+</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_attr.3x.html">curs_attr(3x)</A></STRONG>,  <STRONG><A HREF="curs_variables.3x.html">curs_variables(3x)</A></STRONG>, <STRONG>de-</STRONG>
+       <STRONG><A HREF="default_colors.3x.html">fault_colors(3x)</A></STRONG>
+
+
+
+                                                                <STRONG><A HREF="curs_color.3x.html">curs_color(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-Overview">Overview</a></li>
+<li><a href="#h3-Color-Rendering">Color Rendering</a></li>
+</ul>
+</li>
+<li><a href="#h2-CONSTANTS">CONSTANTS</a></li>
+<li><a href="#h2-VARIABLES">VARIABLES</a>
+<ul>
+<li><a href="#h3-COLORS">COLORS</a></li>
+<li><a href="#h3-COLOR_PAIRS">COLOR_PAIRS</a></li>
+</ul>
+</li>
+<li><a href="#h2-FUNCTIONS">FUNCTIONS</a>
+<ul>
+<li><a href="#h3-start_color">start_color</a></li>
+<li><a href="#h3-has_colors">has_colors</a></li>
+<li><a href="#h3-can_change_color">can_change_color</a></li>
+<li><a href="#h3-init_pair">init_pair</a></li>
+<li><a href="#h3-init_extended_pair">init_extended_pair</a></li>
+<li><a href="#h3-init_color">init_color</a></li>
+<li><a href="#h3-init_extended_color">init_extended_color</a></li>
+<li><a href="#h3-color_content">color_content</a></li>
+<li><a href="#h3-extended_color_content">extended_color_content</a></li>
+<li><a href="#h3-pair_content">pair_content</a></li>
+<li><a href="#h3-extended_pair_content">extended_pair_content</a></li>
+<li><a href="#h3-reset_color_pairs">reset_color_pairs</a></li>
+<li><a href="#h3-PAIR_NUMBER">PAIR_NUMBER</a></li>
+<li><a href="#h3-COLOR_PAIR">COLOR_PAIR</a></li>
+</ul>
+</li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-HISTORY">HISTORY</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_delch.3x.html b/doc/html/man/curs_delch.3x.html
new file mode 100644
index 0000000..dacb4aa
--- /dev/null
+++ b/doc/html/man/curs_delch.3x.html
@@ -0,0 +1,111 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2006,2010 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_delch.3x,v 1.18 2022/02/12 20:06:41 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_delch 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_delch 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_delch.3x.html">curs_delch(3x)</A></STRONG>                                                  <STRONG><A HREF="curs_delch.3x.html">curs_delch(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>delch</STRONG>, <STRONG>wdelch</STRONG>, <STRONG>mvdelch</STRONG>, <STRONG>mvwdelch</STRONG> - delete character under the cursor in
+       a <STRONG>curses</STRONG> window
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>delch(void);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wdelch(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvdelch(int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvwdelch(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       These routines delete the character under the cursor; all characters to
+       the  right  of  the  cursor  on the same line are moved to the left one
+       position and the last character on the line is  filled  with  a  blank.
+       The  cursor  position  does  not  change  (after  moving  to  <EM>y</EM>,  <EM>x</EM>, if
+       specified).  (This does not imply use of the hardware delete  character
+       feature.)
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       All  routines  return  the  integer  <STRONG>ERR</STRONG>  upon  failure and an <STRONG>OK</STRONG> (SVr4
+       specifies only "an integer  value  other  than  <STRONG>ERR</STRONG>")  upon  successful
+       completion.
+
+       Functions  with  a  "mv"  prefix  first perform a cursor movement using
+       <STRONG>wmove</STRONG>, and return an error if the position is outside the window, or if
+       the window pointer is null.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       Note that <STRONG>delch</STRONG>, <STRONG>mvdelch</STRONG>, and <STRONG>mvwdelch</STRONG> may be macros.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These functions are described in the XSI Curses standard, Issue 4.  The
+       standard specifies that they return <STRONG>ERR</STRONG> on failure,  but  specifies  no
+       error conditions.
+
+
+</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_delch.3x.html">curs_delch(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_deleteln.3x.html b/doc/html/man/curs_deleteln.3x.html
new file mode 100644
index 0000000..a0676f2
--- /dev/null
+++ b/doc/html/man/curs_deleteln.3x.html
@@ -0,0 +1,126 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2007,2010 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_deleteln.3x,v 1.20 2022/02/12 20:06:41 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_deleteln 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_deleteln 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_deleteln.3x.html">curs_deleteln(3x)</A></STRONG>                                            <STRONG><A HREF="curs_deleteln.3x.html">curs_deleteln(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>deleteln</STRONG>,  <STRONG>wdeleteln</STRONG>, <STRONG>insdelln</STRONG>, <STRONG>winsdelln</STRONG>, <STRONG>insertln</STRONG>, <STRONG>winsertln</STRONG> - delete
+       and insert lines in a <STRONG>curses</STRONG> window
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>deleteln(void);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wdeleteln(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>insdelln(int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>winsdelln(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>insertln(void);</STRONG>
+       <STRONG>int</STRONG> <STRONG>winsertln(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The <STRONG>deleteln</STRONG> and <STRONG>wdeleteln</STRONG> routines delete the line under the cursor in
+       the  window;  all  lines  below the current line are moved up one line.
+       The bottom line of the window is cleared.  The cursor position does not
+       change.
+
+       The  <STRONG>insdelln</STRONG>  and  <STRONG>winsdelln</STRONG>  routines, for positive <EM>n</EM>, insert <EM>n</EM> lines
+       into the specified window above the current line.  The <EM>n</EM>  bottom  lines
+       are  lost.  For negative <EM>n</EM>, delete <EM>n</EM> lines (starting with the one under
+       the cursor), and move the remaining lines up.  The bottom <EM>n</EM>  lines  are
+       cleared.  The current cursor position remains the same.
+
+       The  <STRONG>insertln</STRONG>  and  <STRONG>winsertln</STRONG>  routines  insert  a blank line above the
+       current line and the bottom line is lost.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       All routines return the integer  <STRONG>ERR</STRONG>  upon  failure  and  an  <STRONG>OK</STRONG>  (SVr4
+       specifies  only  "an  integer  value  other  than <STRONG>ERR</STRONG>") upon successful
+       completion.
+
+       X/Open defines no error conditions.  In  this  implementation,  if  the
+       window parameter is null, an error is returned.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These functions are described in the XSI Curses standard, Issue 4.  The
+       standard specifies that they return <STRONG>ERR</STRONG> on failure,  but  specifies  no
+       error conditions.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       Note that all but <STRONG>winsdelln</STRONG> may be macros.
+
+       These  routines do not require a hardware line delete or insert feature
+       in  the  terminal.   In  fact,  they  will  not   use   hardware   line
+       delete/insert  unless  <STRONG>idlok(...,</STRONG>  <STRONG>TRUE)</STRONG>  has  been  set on the current
+       window.
+
+
+</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_deleteln.3x.html">curs_deleteln(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_extend.3x.html b/doc/html/man/curs_extend.3x.html
new file mode 100644
index 0000000..f3d396e
--- /dev/null
+++ b/doc/html/man/curs_extend.3x.html
@@ -0,0 +1,127 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1999-2010,2016 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.                                                           *
+  ****************************************************************************
+  * Author: Thomas E. Dickey 1999-on
+  * @Id: curs_extend.3x,v 1.28 2022/02/12 20:07:29 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_extend 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_extend 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_extend.3x.html">curs_extend(3x)</A></STRONG>                                                <STRONG><A HREF="curs_extend.3x.html">curs_extend(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>curses_version</STRONG>, <STRONG>use_extended_names</STRONG> - miscellaneous curses extensions
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG> <STRONG>curses_version(void);</STRONG>
+       <STRONG>int</STRONG> <STRONG>use_extended_names(bool</STRONG> <EM>enable</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       These  functions  are extensions to the curses library which do not fit
+       easily into other categories.
+
+
+</PRE><H3><a name="h3-curses_version">curses_version</a></H3><PRE>
+       Use <STRONG>curses_version</STRONG> to get the version number, including patch level  of
+       the library, prefixed by "ncurses", e.g.,
+
+              <STRONG>ncurses</STRONG> <STRONG>5.0.19991023</STRONG>
+
+
+</PRE><H3><a name="h3-use_extended_names">use_extended_names</a></H3><PRE>
+       The   <STRONG>use_extended_names</STRONG>   function   controls   whether   the  calling
+       application is able to use user-defined or nonstandard names which  may
+       be  compiled  into  the terminfo description, i.e., via the terminfo or
+       termcap interfaces.  Normally these names are available for use,  since
+       the essential decision is made by using the <STRONG>-x</STRONG> option of <STRONG>tic</STRONG> to compile
+       extended terminal definitions.  However you can disable this feature to
+       ensure compatibility with other implementations of curses.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       <STRONG>curses_version</STRONG>  returns a pointer to static memory; you should not free
+       this in your application.
+
+       <STRONG>use_extended_names</STRONG> returns the previous state,  allowing  you  to  save
+       this and restore it.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These  routines  are  specific  to ncurses.  They were not supported on
+       Version 7, BSD or System V implementations.  It is recommended that any
+       code depending on them be conditioned using NCURSES_VERSION.
+
+
+</PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
+       <STRONG><A HREF="curs_getch.3x.html">curs_getch(3x)</A></STRONG>,    <STRONG><A HREF="curs_mouse.3x.html">curs_mouse(3x)</A></STRONG>,    <STRONG><A HREF="curs_print.3x.html">curs_print(3x)</A></STRONG>,    <STRONG><A HREF="curs_util.3x.html">curs_util(3x)</A></STRONG>,
+       <STRONG><A HREF="default_colors.3x.html">default_colors(3x)</A></STRONG>,    <STRONG><A HREF="define_key.3x.html">define_key(3x)</A></STRONG>,     <STRONG><A HREF="keybound.3x.html">keybound(3x)</A></STRONG>,     <STRONG><A HREF="keyok.3x.html">keyok(3x)</A></STRONG>,
+       <STRONG><A HREF="resizeterm.3x.html">resizeterm(3x)</A></STRONG>, <STRONG><A HREF="wresize.3x.html">wresize(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-AUTHOR">AUTHOR</a></H2><PRE>
+       Thomas Dickey.
+
+
+
+                                                               <STRONG><A HREF="curs_extend.3x.html">curs_extend(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-curses_version">curses_version</a></li>
+<li><a href="#h3-use_extended_names">use_extended_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>
+<li><a href="#h2-AUTHOR">AUTHOR</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_get_wch.3x.html b/doc/html/man/curs_get_wch.3x.html
new file mode 100644
index 0000000..903172b
--- /dev/null
+++ b/doc/html/man/curs_get_wch.3x.html
@@ -0,0 +1,172 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 2002-2016,2017 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_get_wch.3x,v 1.17 2022/02/12 20:07:29 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_get_wch 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_get_wch 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_get_wch.3x.html">curs_get_wch(3x)</A></STRONG>                                              <STRONG><A HREF="curs_get_wch.3x.html">curs_get_wch(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>get_wch</STRONG>, <STRONG>wget_wch</STRONG>, <STRONG>mvget_wch</STRONG>, <STRONG>mvwget_wch</STRONG>, <STRONG>unget_wch</STRONG> - get (or push
+       back) a wide character from curses terminal keyboard
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>get_wch(wint_t</STRONG> <STRONG>*</STRONG><EM>wch</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wget_wch(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>wint_t</STRONG> <STRONG>*</STRONG><EM>wch</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvget_wch(int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>wint_t</STRONG> <STRONG>*</STRONG><EM>wch</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvwget_wch(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>wint_t</STRONG> <STRONG>*</STRONG><EM>wch</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>unget_wch(const</STRONG> <STRONG>wchar_t</STRONG> <EM>wch</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+
+</PRE><H3><a name="h3-wget_wch">wget_wch</a></H3><PRE>
+       The <STRONG>get_wch</STRONG>, <STRONG>wget_wch</STRONG>, <STRONG>mvget_wch</STRONG>, and <STRONG>mvwget_wch</STRONG> functions read a char-
+       acter  from  the terminal associated with the current or specified win-
+       dow.  In no-delay mode, if no input is waiting, the value  <STRONG>ERR</STRONG>  is  re-
+       turned.   In delay mode, the program waits until the system passes text
+       through to the program.  Depending on the setting of  <STRONG>cbreak</STRONG>,  this  is
+       after one character (cbreak mode), or after the first newline (nocbreak
+       mode).  In half-delay mode, the program waits until the  user  types  a
+       character or the specified timeout interval has elapsed.
+
+       Unless  <STRONG>noecho</STRONG> has been set, these routines echo the character into the
+       designated window.
+
+       If the window is not a pad and has been moved  or  modified  since  the
+       last call to <STRONG>wrefresh</STRONG>, <STRONG>wrefresh</STRONG> will be called before another character
+       is read.
+
+       If <STRONG>keypad</STRONG> is enabled, these functions respond  to  the  pressing  of  a
+       function key by setting the object pointed to by <EM>wch</EM> to the keycode as-
+       signed to the function key, and returning <STRONG>KEY_CODE_YES</STRONG>.  If a character
+       (such  as  escape) that could be the beginning of a function key is re-
+       ceived, curses sets a timer.  If the remainder of the sequence does ar-
+       rive  within  the designated time, curses passes through the character;
+       otherwise, curses returns the function key  value.   For  this  reason,
+       many  terminals  experience a delay between the time a user presses the
+       escape key and the time the escape is returned to the program.
+
+       The keycodes returned by these functions are the same as those returned
+       by <STRONG>wgetch</STRONG>:
+
+       <STRONG>o</STRONG>   The  predefined  function  keys  are listed in <STRONG>&lt;curses.h&gt;</STRONG> as macros
+           with values outside the range of 8-bit characters.  Their names be-
+           gin with <STRONG>KEY_</STRONG>.
+
+       <STRONG>o</STRONG>   Other  (user-defined)  function keys which may be defined using <STRONG>de-</STRONG>
+           <STRONG><A HREF="define_key.3x.html">fine_key(3x)</A></STRONG> have no names, but also are expected  to  have  values
+           outside the range of 8-bit characters.
+
+
+</PRE><H3><a name="h3-unget_wch">unget_wch</a></H3><PRE>
+       The <STRONG>unget_wch</STRONG> function pushes the wide character <EM>wch</EM> back onto the head
+       of the input queue, so the wide character is returned by the next  call
+       to  <STRONG>get_wch</STRONG>.  The pushback of one character is guaranteed.  If the pro-
+       gram calls <STRONG>unget_wch</STRONG> too many times  without  an  intervening  call  to
+       <STRONG>get_wch</STRONG>, the operation may fail.
+
+       Unlike <STRONG>ungetch</STRONG> and <STRONG>wgetch</STRONG>, <STRONG>unget_wch</STRONG> cannot distinguish special charac-
+       ters returned by <STRONG>wget_wch</STRONG> from ordinary characters.  An application can
+       push  special  keys  which it may read via <STRONG>wget_wch</STRONG> by checking for the
+       <STRONG>KEY_CODE_YES</STRONG> result, and using <STRONG>ungetch</STRONG> for those special keys.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The header file  <STRONG>&lt;curses.h&gt;</STRONG>  automatically  includes  the  header  file
+       <STRONG>&lt;stdio.h&gt;</STRONG>.
+
+       Applications  should  not  define the escape key by itself as a single-
+       character function.
+
+       When using <STRONG>get_wch</STRONG>, <STRONG>wget_wch</STRONG>, <STRONG>mvget_wch</STRONG>,  or  <STRONG>mvwget_wch</STRONG>,  applications
+       should not use <STRONG>nocbreak</STRONG> mode and <STRONG>echo</STRONG> mode at the same time.  Depending
+       on the state of the tty driver when each character is typed,  the  pro-
+       gram may produce undesirable results.
+
+       All functions except <STRONG>wget_wch</STRONG> and <STRONG>unget_wch</STRONG> may be macros.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       When <STRONG>get_wch</STRONG>, <STRONG>wget_wch</STRONG>, <STRONG>mvget_wch</STRONG>, and <STRONG>mvwget_wch</STRONG> functions successful-
+       ly report the pressing of a function  key,  they  return  <STRONG>KEY_CODE_YES</STRONG>.
+       When they successfully report a wide character, they return <STRONG>OK</STRONG>.  Other-
+       wise, they return <STRONG>ERR</STRONG>.
+
+       Upon successful completion, <STRONG>unget_wch</STRONG> returns <STRONG>OK</STRONG>.  Otherwise, the func-
+       tion returns <STRONG>ERR</STRONG>.
+
+       Functions  with  a  "mv"  prefix  first perform a cursor movement using
+       <STRONG>wmove</STRONG>, and return an error if the position is outside the window, or if
+       the window pointer is null.
+
+
+</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_getch.3x.html">curs_getch(3x)</A></STRONG>,    <STRONG><A HREF="curs_ins_wch.3x.html">curs_ins_wch(3x)</A></STRONG>,    <STRONG><A HREF="curs_inopts.3x.html">curs_inopts(3x)</A></STRONG>,
+       <STRONG><A HREF="curs_move.3x.html">curs_move(3x)</A></STRONG>, <STRONG><A HREF="curs_refresh.3x.html">curs_refresh(3x)</A></STRONG>
+
+
+
+                                                              <STRONG><A HREF="curs_get_wch.3x.html">curs_get_wch(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-wget_wch">wget_wch</a></li>
+<li><a href="#h3-unget_wch">unget_wch</a></li>
+</ul>
+</li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_get_wstr.3x.html b/doc/html/man/curs_get_wstr.3x.html
new file mode 100644
index 0000000..4623161
--- /dev/null
+++ b/doc/html/man/curs_get_wstr.3x.html
@@ -0,0 +1,185 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 2002-2012,2017 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_get_wstr.3x,v 1.26 2022/02/12 20:07:29 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_get_wstr 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_get_wstr 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_get_wstr.3x.html">curs_get_wstr(3x)</A></STRONG>                                            <STRONG><A HREF="curs_get_wstr.3x.html">curs_get_wstr(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>get_wstr</STRONG>, <STRONG>getn_wstr</STRONG>, <STRONG>wget_wstr</STRONG>, <STRONG>wgetn_wstr</STRONG>, <STRONG>mvget_wstr</STRONG>, <STRONG>mvgetn_wstr</STRONG>,
+       <STRONG>mvwget_wstr</STRONG>, <STRONG>mvwgetn_wstr</STRONG> - get an array of wide characters from a
+       curses terminal keyboard
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>get_wstr(wint_t</STRONG> <STRONG>*</STRONG><EM>wstr</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>getn_wstr(wint_t</STRONG> <STRONG>*</STRONG><EM>wstr</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wget_wstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>wint_t</STRONG> <STRONG>*</STRONG><EM>wstr</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wgetn_wstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>wint_t</STRONG> <STRONG>*</STRONG><EM>wstr</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>mvget_wstr(int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>wint_t</STRONG> <STRONG>*</STRONG><EM>wstr</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvgetn_wstr(int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>wint_t</STRONG> <STRONG>*</STRONG><EM>wstr</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvwget_wstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>wint_t</STRONG> <STRONG>*</STRONG><EM>wstr</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvwgetn_wstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>wint_t</STRONG> <STRONG>*</STRONG><EM>wstr</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The  effect  of  <STRONG>get_wstr</STRONG> is as though a series of calls to <STRONG><A HREF="curs_get_wch.3x.html">get_wch(3x)</A></STRONG>
+       were made, until a newline, other end-of-line, or end-of-file condition
+       is  processed.  An end-of-file condition is represented by <STRONG>WEOF</STRONG>, as de-
+       fined in <STRONG>&lt;wchar.h&gt;</STRONG>.  The newline and end-of-line conditions are  repre-
+       sented  by  the  <STRONG>\n</STRONG>  <STRONG>wchar_t</STRONG>  value.   In all instances, the end of the
+       string is terminated by a null <STRONG>wchar_t</STRONG>.  The routine  places  resulting
+       values in the area pointed to by <EM>wstr</EM>.
+
+       The  user's  erase and kill characters are interpreted.  If keypad mode
+       is on for the window, <STRONG>KEY_LEFT</STRONG> and <STRONG>KEY_BACKSPACE</STRONG>  are  both  considered
+       equivalent to the user's kill character.
+
+       Characters  input  are  echoed  only  if <STRONG>echo</STRONG> is currently on.  In that
+       case, backspace is echoed as deletion of the previous character  (typi-
+       cally a left motion).
+
+       The effect of <STRONG>wget_wstr</STRONG> is as though a series of calls to <STRONG>wget_wch</STRONG> were
+       made.
+
+       The effect of <STRONG>mvget_wstr</STRONG> is as though a call to <STRONG>move</STRONG> and then a  series
+       of calls to <STRONG>get_wch</STRONG> were made.
+
+       The  effect  of <STRONG>mvwget_wstr</STRONG> is as though a call to <STRONG>wmove</STRONG> and then a se-
+       ries of calls to <STRONG>wget_wch</STRONG> were made.
+
+       The <STRONG>getn_wstr</STRONG>, <STRONG>mvgetn_wstr</STRONG>, <STRONG>mvwgetn_wstr</STRONG>, and <STRONG>wgetn_wstr</STRONG> functions  are
+       identical to the <STRONG>get_wstr</STRONG>, <STRONG>mvget_wstr</STRONG>, <STRONG>mvwget_wstr</STRONG>, and <STRONG>wget_wstr</STRONG> func-
+       tions, respectively, except that the <STRONG>*n_*</STRONG> versions read at most <EM>n</EM> char-
+       acters, letting the application prevent overflow of the input buffer.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       Using  <STRONG>get_wstr</STRONG>,  <STRONG>mvget_wstr</STRONG>,  <STRONG>mvwget_wstr</STRONG>, or <STRONG>wget_wstr</STRONG> to read a line
+       that overflows the array pointed to by <STRONG>wstr</STRONG> causes  undefined  results.
+       The use of <STRONG>getn_wstr</STRONG>, <STRONG>mvgetn_wstr</STRONG>, <STRONG>mvwgetn_wstr</STRONG>, or <STRONG>wgetn_wstr</STRONG>, respec-
+       tively, is recommended.
+
+       These functions cannot return <STRONG>KEY_</STRONG> values because there is  no  way  to
+       distinguish a <STRONG>KEY_</STRONG> value from a valid <STRONG>wchar_t</STRONG> value.
+
+       All of these routines except <STRONG>wgetn_wstr</STRONG> may be macros.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       All  of  these  functions return <STRONG>OK</STRONG> upon successful completion.  Other-
+       wise, they return <STRONG>ERR</STRONG>.
+
+       Functions using a window parameter return an error if it is null.
+
+              <STRONG>wgetn_wstr</STRONG>
+                   returns an error if the associated call to <STRONG>wget_wch</STRONG> failed.
+
+       Functions with a "mv" prefix first  perform  a  cursor  movement  using
+       <STRONG>wmove</STRONG>, and return an error if the position is outside the window, or if
+       the window pointer is null.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These functions are described in The Single Unix Specification, Version
+       2.   No  error conditions are defined.  This implementation returns <STRONG>ERR</STRONG>
+       if the window pointer is null, or if the lower-level <STRONG>wget_wch</STRONG> call  re-
+       turns  an <STRONG>ERR</STRONG>.  In the latter case, an <STRONG>ERR</STRONG> return without other data is
+       treated as an end-of-file condition, and the returned array contains  a
+       <STRONG>WEOF</STRONG> followed by a null <STRONG>wchar_t</STRONG>.
+
+       X/Open curses documented these functions to pass an array of <STRONG>wchar_t</STRONG> in
+       1997, but that was an error because of this part of the description:
+
+              The effect of <STRONG>get_wstr</STRONG> is as though a series of calls to <STRONG>get_wch</STRONG>
+              were  made, until a newline character, end-of-line character, or
+              end-of-file character is processed.
+
+       The latter function <EM>get</EM><STRONG>_</STRONG><EM>wch</EM> can return a negative value, while  <STRONG>wchar_t</STRONG>
+       is  a  unsigned  type.  All of the vendors implement this using <STRONG>wint_t</STRONG>,
+       following the standard.
+
+       X/Open Curses, Issue 7 (2009) is unclear regarding whether  the  termi-
+       nating <EM>null</EM> <STRONG>wchar_t</STRONG> value is counted in the length parameter <EM>n</EM>.  X/Open
+       Curses, Issue 7 revised the corresponding description  of  <STRONG>wgetnstr</STRONG>  to
+       address this issue.  The unrevised description of <STRONG>wget_nwstr</STRONG> can be in-
+       terpreted either way.  This implementation counts the terminator in the
+       length.
+
+       X/Open  Curses  does  not specify what happens if the length <EM>n</EM> is nega-
+       tive.
+
+       <STRONG>o</STRONG>   For analogy with <STRONG>wgetnstr</STRONG>, ncurses  6.2  uses  a  limit  (based  on
+           <STRONG>LINE_MAX</STRONG>).
+
+       <STRONG>o</STRONG>   Some  other  implementations (such as Solaris xcurses) do the same,
+           while others (PDCurses) do not allow this.
+
+       <STRONG>o</STRONG>   NetBSD 7 curses imitates ncurses 6.1 in this regard, treating a  <STRONG>-1</STRONG>
+           as an indefinite number of characters.
+
+
+</PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
+       Functions: <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG>, <STRONG><A HREF="curs_get_wch.3x.html">curs_get_wch(3x)</A></STRONG>, <STRONG><A HREF="curs_getstr.3x.html">curs_getstr(3x)</A></STRONG>.
+
+
+
+                                                             <STRONG><A HREF="curs_get_wstr.3x.html">curs_get_wstr(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></li>
+<li><a href="#h2-NOTES">NOTES</a></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>
diff --git a/doc/html/man/curs_getcchar.3x.html b/doc/html/man/curs_getcchar.3x.html
new file mode 100644
index 0000000..b3f0383
--- /dev/null
+++ b/doc/html/man/curs_getcchar.3x.html
@@ -0,0 +1,219 @@
+<!--
+  ****************************************************************************
+  * Copyright 2019-2020,2021 Thomas E. Dickey                                *
+  * Copyright 2001-2015,2017 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_getcchar.3x,v 1.27 2021/12/25 20:35:03 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_getcchar 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_getcchar 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_getcchar.3x.html">curs_getcchar(3x)</A></STRONG>                                            <STRONG><A HREF="curs_getcchar.3x.html">curs_getcchar(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>getcchar</STRONG>,  <STRONG>setcchar</STRONG>  - Get a wide character string and rendition from a
+       <STRONG>cchar_t</STRONG> or set a <STRONG>cchar_t</STRONG> from a wide-character string
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>getcchar(</STRONG>
+               <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>wcval</EM><STRONG>,</STRONG>
+               <STRONG>wchar_t</STRONG> <STRONG>*</STRONG><EM>wch</EM><STRONG>,</STRONG>
+               <STRONG>attr_t</STRONG> <STRONG>*</STRONG><EM>attrs</EM><STRONG>,</STRONG>
+               <STRONG>short</STRONG> <STRONG>*</STRONG><EM>color</EM><STRONG>_</STRONG><EM>pair</EM><STRONG>,</STRONG>
+               <STRONG>void</STRONG> <STRONG>*</STRONG><EM>opts</EM> <STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>setcchar(</STRONG>
+               <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>wcval</EM><STRONG>,</STRONG>
+               <STRONG>const</STRONG> <STRONG>wchar_t</STRONG> <STRONG>*</STRONG><EM>wch</EM><STRONG>,</STRONG>
+               <STRONG>const</STRONG> <STRONG>attr_t</STRONG> <EM>attrs</EM><STRONG>,</STRONG>
+               <STRONG>short</STRONG> <EM>color</EM><STRONG>_</STRONG><EM>pair</EM><STRONG>,</STRONG>
+               <STRONG>const</STRONG> <STRONG>void</STRONG> <STRONG>*</STRONG><EM>opts</EM> <STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+
+</PRE><H3><a name="h3-getcchar">getcchar</a></H3><PRE>
+       The <STRONG>getcchar</STRONG> function gets a wide-character string and rendition from a
+       <STRONG>cchar_t</STRONG>  argument.   When  <EM>wch</EM>  is  not  a  null  pointer, the <STRONG>getcchar</STRONG>
+       function does the following:
+
+       <STRONG>o</STRONG>   Extracts information from a <STRONG>cchar_t</STRONG> value <EM>wcval</EM>
+
+       <STRONG>o</STRONG>   Stores the character attributes in the location pointed to by <EM>attrs</EM>
+
+       <STRONG>o</STRONG>   Stores the color-pair in the location pointed to by <EM>color</EM><STRONG>_</STRONG><EM>pair</EM>
+
+       <STRONG>o</STRONG>   Stores the wide-character string, characters referenced  by  <EM>wcval</EM>,
+           into the array pointed to by <EM>wch</EM>.
+
+       When <EM>wch</EM> is a null pointer, the <STRONG>getcchar</STRONG> function does the following:
+
+       <STRONG>o</STRONG>   Obtains the number of wide characters pointed to by <EM>wcval</EM>
+
+       <STRONG>o</STRONG>   Does not change the data referenced by <EM>attrs</EM> or <EM>color</EM><STRONG>_</STRONG><EM>pair</EM>
+
+
+</PRE><H3><a name="h3-setcchar">setcchar</a></H3><PRE>
+       The  <STRONG>setcchar</STRONG>  function initializes the location pointed to by <EM>wcval</EM> by
+       using:
+
+       <STRONG>o</STRONG>   The character attributes in <EM>attrs</EM>
+
+       <STRONG>o</STRONG>   The color pair in <EM>color</EM><STRONG>_</STRONG><EM>pair</EM>
+
+       <STRONG>o</STRONG>   The wide-character string pointed to by <EM>wch</EM>.  The  string  must  be
+           L'\0' terminated, contain at most one spacing character, which must
+           be the first.
+
+           Up to <STRONG>CCHARW_MAX</STRONG>-1 nonspacing characters  may  follow.   Additional
+           nonspacing characters are ignored.
+
+           The string may contain a single control character instead.  In that
+           case, no nonspacing characters are allowed.
+
+
+</PRE><H2><a name="h2-EXTENSIONS">EXTENSIONS</a></H2><PRE>
+       X/Open Curses documents the <EM>opts</EM> argument as reserved for  future  use,
+       saying  that  it must be null.  This implementation uses that parameter
+       in ABI 6 for the functions which have a color-pair parameter to support
+       extended color pairs:
+
+       <STRONG>o</STRONG>   For   functions  which modify the color, e.g., <STRONG>setcchar</STRONG>, if <EM>opts</EM> is
+           set it is treated as a pointer to <STRONG>int</STRONG>, and used to  set  the  color
+           pair instead of the <STRONG>short</STRONG> pair parameter.
+
+       <STRONG>o</STRONG>   For  functions which retrieve the color, e.g., <STRONG>getcchar</STRONG>, if <EM>opts</EM> is
+           set it is treated as a pointer to <STRONG>int</STRONG>, and  used  to  retrieve  the
+           color  pair  as  an  <STRONG>int</STRONG>  value,  in addition retrieving it via the
+           standard pointer to <STRONG>short</STRONG> parameter.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The <EM>wcval</EM> argument may be a value generated by a call to <STRONG>setcchar</STRONG> or by
+       a function that has a <STRONG>cchar_t</STRONG> output argument.  If <EM>wcval</EM> is constructed
+       by any other means, the effect is unspecified.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       When <EM>wch</EM> is a  null  pointer,  <STRONG>getcchar</STRONG>  returns  the  number  of  wide
+       characters referenced by <EM>wcval</EM>, including one for a trailing null.
+
+       When  <EM>wch</EM>  is  not  a null pointer, <STRONG>getcchar</STRONG> returns <STRONG>OK</STRONG> upon successful
+       completion, and <STRONG>ERR</STRONG> otherwise.
+
+       Upon successful completion, <STRONG>setcchar</STRONG> returns <STRONG>OK</STRONG>.  Otherwise, it returns
+       <STRONG>ERR</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       The  <STRONG>CCHARW_MAX</STRONG>  symbol is specific to ncurses.  X/Open Curses does not
+       provide details for the layout of the <STRONG>cchar_t</STRONG> structure.  It tells what
+       data are stored in it:
+
+       <STRONG>o</STRONG>   a spacing character (<STRONG>wchar_t</STRONG>, i.e., 32-bits).
+
+       <STRONG>o</STRONG>   non-spacing characters (again, <STRONG>wchar_t</STRONG>'s).
+
+       <STRONG>o</STRONG>   attributes  (at  least  16 bits, inferred from the various ACS- and
+           WACS-flags).
+
+       <STRONG>o</STRONG>   color pair (at least 16 bits,  inferred  from  the  <STRONG>unsigned</STRONG>  <STRONG>short</STRONG>
+           type).
+
+       The non-spacing characters are optional, in the sense that zero or more
+       may be stored in a <STRONG>cchar_t</STRONG>.  XOpen/Curses specifies a limit:
+
+           Implementations may limit the number of non-spacing characters that
+           can  be  associated with a spacing character, provided any limit is
+           at least 5.
+
+       The Unix implementations at the time follow that limit:
+
+       <STRONG>o</STRONG>   AIX 4 and OSF1 4 use the same declaration with an array of  5  non-
+           spacing characters <EM>z</EM> and a single spacing character <EM>c</EM>.
+
+       <STRONG>o</STRONG>   HP-UX 10  uses  an  opaque  structure with 28 bytes, which is large
+           enough for the 6 <STRONG>wchar_t</STRONG> values.
+
+       <STRONG>o</STRONG>   Solaris <EM>xpg4</EM> curses uses a single array of 6 <STRONG>wchar_t</STRONG> values.
+
+       This implementation's <STRONG>cchar_t</STRONG> was defined in 1995 using <STRONG>5</STRONG> for the total
+       of  spacing and non-spacing characters (<STRONG>CCHARW_MAX</STRONG>).  That was probably
+       due to a misreading of the  AIX 4  header  files,  because  the  X/Open
+       Curses  document  was  not generally available at that time.  Later (in
+       2002), this detail was  overlooked  when  beginning  to  implement  the
+       functions using the structure.
+
+       In  practice, even four non-spacing characters may seem enough.  X/Open
+       Curses documents possible uses for  non-spacing  characters,  including
+       using  them  for ligatures between characters (a feature apparently not
+       supported by any curses implementation).  Unicode does  not  limit  the
+       (analogous) number of combining characters, so some applications may be
+       affected.
+
+
+</PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
+       Functions: <STRONG><A HREF="curs_attr.3x.html">curs_attr(3x)</A></STRONG>, <STRONG><A HREF="curs_color.3x.html">curs_color(3x)</A></STRONG>, <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG>, <STRONG>wcwidth(3)</STRONG>.
+
+
+
+                                                             <STRONG><A HREF="curs_getcchar.3x.html">curs_getcchar(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-getcchar">getcchar</a></li>
+<li><a href="#h3-setcchar">setcchar</a></li>
+</ul>
+</li>
+<li><a href="#h2-EXTENSIONS">EXTENSIONS</a></li>
+<li><a href="#h2-NOTES">NOTES</a></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>
diff --git a/doc/html/man/curs_getch.3x.html b/doc/html/man/curs_getch.3x.html
new file mode 100644
index 0000000..5a1afc5
--- /dev/null
+++ b/doc/html/man/curs_getch.3x.html
@@ -0,0 +1,408 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2016,2017 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_getch.3x,v 1.63 2022/02/12 20:07:45 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_getch 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_getch 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_getch.3x.html">curs_getch(3x)</A></STRONG>                                                  <STRONG><A HREF="curs_getch.3x.html">curs_getch(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>getch</STRONG>, <STRONG>wgetch</STRONG>, <STRONG>mvgetch</STRONG>, <STRONG>mvwgetch</STRONG>, <STRONG>ungetch</STRONG>, <STRONG>has_key</STRONG> - get (or push back)
+       characters from <STRONG>curses</STRONG> terminal keyboard
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>getch(void);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wgetch(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>mvgetch(int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvwgetch(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>ungetch(int</STRONG> <EM>ch</EM><STRONG>);</STRONG>
+
+       /* extension */
+       <STRONG>int</STRONG> <STRONG>has_key(int</STRONG> <EM>ch</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+
+</PRE><H3><a name="h3-Reading-characters">Reading characters</a></H3><PRE>
+       The <STRONG>getch</STRONG>, <STRONG>wgetch</STRONG>, <STRONG>mvgetch</STRONG> and <STRONG>mvwgetch</STRONG>, routines read a character from
+       the window.  In no-delay mode, if no input is waiting, the value <STRONG>ERR</STRONG> is
+       returned.  In delay mode, the program waits  until  the  system  passes
+       text  through to the program.  Depending on the setting of <STRONG>cbreak</STRONG>, this
+       is after one character  (cbreak  mode),  or  after  the  first  newline
+       (nocbreak mode).  In half-delay mode, the program waits until a charac-
+       ter is typed or the specified timeout has been reached.
+
+       If <STRONG>echo</STRONG> is enabled, and the window is not a  pad,  then  the  character
+       will also be echoed into the designated window according to the follow-
+       ing rules:
+
+       <STRONG>o</STRONG>   If the character is the current erase  character,  left  arrow,  or
+           backspace,  the  cursor  is  moved  one  space to the left and that
+           screen position is erased as if <STRONG>delch</STRONG> had been called.
+
+       <STRONG>o</STRONG>   If the character value is any other <STRONG>KEY_</STRONG> define, the user is alert-
+           ed with a <STRONG>beep</STRONG> call.
+
+       <STRONG>o</STRONG>   If  the character is a carriage-return, and if <STRONG>nl</STRONG> is enabled, it is
+           translated to a line-feed after echoing.
+
+       <STRONG>o</STRONG>   Otherwise the character is simply output to the screen.
+
+       If the window is not a pad, and it has been moved or modified since the
+       last call to <STRONG>wrefresh</STRONG>, <STRONG>wrefresh</STRONG> will be called before another character
+       is read.
+
+
+</PRE><H3><a name="h3-Keypad-mode">Keypad mode</a></H3><PRE>
+       If <STRONG>keypad</STRONG> is <STRONG>TRUE</STRONG>, and a function key is pressed, the  token  for  that
+       function key is returned instead of the raw characters:
+
+       <STRONG>o</STRONG>   The  predefined  function  keys  are listed in <STRONG>&lt;curses.h&gt;</STRONG> as macros
+           with values outside the range of 8-bit characters.  Their names be-
+           gin with <STRONG>KEY_</STRONG>.
+
+       <STRONG>o</STRONG>   Other  (user-defined)  function keys which may be defined using <STRONG>de-</STRONG>
+           <STRONG><A HREF="define_key.3x.html">fine_key(3x)</A></STRONG> have no names, but also are expected  to  have  values
+           outside the range of 8-bit characters.
+
+       Thus,  a  variable  intended to hold the return value of a function key
+       must be of short size or larger.
+
+       When a character that could be the beginning of a function key  is  re-
+       ceived  (which, on modern terminals, means an escape character), <STRONG>curses</STRONG>
+       sets a timer.  If the remainder of the sequence does not come in within
+       the  designated  time,  the character is passed through; otherwise, the
+       function key value is returned.  For this reason, many terminals  expe-
+       rience  a  delay between the time a user presses the escape key and the
+       escape is returned to the program.
+
+       In <STRONG>ncurses</STRONG>, the timer normally expires after the value in <STRONG>ESCDELAY</STRONG> (see
+       <STRONG><A HREF="curs_variables.3x.html">curs_variables(3x)</A></STRONG>).   If <STRONG>notimeout</STRONG> is <STRONG>TRUE</STRONG>, the timer does not expire;
+       it is an infinite (or very large) value.  Because function keys usually
+       begin  with an escape character, the terminal may appear to hang in no-
+       timeout mode after  pressing  the  escape  key  until  another  key  is
+       pressed.
+
+
+</PRE><H3><a name="h3-Ungetting-characters">Ungetting characters</a></H3><PRE>
+       The  <STRONG>ungetch</STRONG> routine places <EM>ch</EM> back onto the input queue to be returned
+       by the next call to <STRONG>wgetch</STRONG>.  There is just one input queue for all win-
+       dows.
+
+
+</PRE><H3><a name="h3-Predefined-key-codes">Predefined key-codes</a></H3><PRE>
+       The following special keys are defined in <STRONG>&lt;curses.h&gt;</STRONG>.
+
+       <STRONG>o</STRONG>   Except  for  the special case <STRONG>KEY_RESIZE</STRONG>, it is necessary to enable
+           <STRONG>keypad</STRONG> for <STRONG>getch</STRONG> to return these codes.
+
+       <STRONG>o</STRONG>   Not all of these are necessarily supported on any particular termi-
+           nal.
+
+       <STRONG>o</STRONG>   The  naming  convention  may  seem obscure, with some apparent mis-
+           spellings (such as "RSUME" for "resume").  The names correspond  to
+           the  long  terminfo capability names for the keys, and were defined
+           long ago, in the 1980s.
+
+                  <STRONG>Name</STRONG>            <STRONG>Key</STRONG> <STRONG>name</STRONG>
+                  -------------------------------------------------
+                  KEY_BREAK       Break key
+                  KEY_DOWN        The four arrow keys ...
+                  KEY_UP
+                  KEY_LEFT
+                  KEY_RIGHT
+                  KEY_HOME        Home key (upward+left arrow)
+                  KEY_BACKSPACE   Backspace
+                  KEY_F0          Function keys; space for 64 keys
+                                  is reserved.
+                  KEY_F(<EM>n</EM>)        For 0 &lt;= <EM>n</EM> &lt;= 63
+                  KEY_DL          Delete line
+                  KEY_IL          Insert line
+                  KEY_DC          Delete character
+                  KEY_IC          Insert char or enter insert mode
+                  KEY_EIC         Exit insert char mode
+                  KEY_CLEAR       Clear screen
+                  KEY_EOS         Clear to end of screen
+                  KEY_EOL         Clear to end of line
+                  KEY_SF          Scroll 1 line forward
+                  KEY_SR          Scroll 1 line backward (reverse)
+                  KEY_NPAGE       Next page
+                  KEY_PPAGE       Previous page
+                  KEY_STAB        Set tab
+                  KEY_CTAB        Clear tab
+                  KEY_CATAB       Clear all tabs
+                  KEY_ENTER       Enter or send
+                  KEY_SRESET      Soft (partial) reset
+                  KEY_RESET       Reset or hard reset
+
+                  KEY_PRINT       Print or copy
+                  KEY_LL          Home down or bottom (lower left)
+                  KEY_A1          Upper left of keypad
+                  KEY_A3          Upper right of keypad
+                  KEY_B2          Center of keypad
+                  KEY_C1          Lower left of keypad
+                  KEY_C3          Lower right of keypad
+                  KEY_BTAB        Back tab key
+                  KEY_BEG         Beg(inning) key
+                  KEY_CANCEL      Cancel key
+                  KEY_CLOSE       Close key
+                  KEY_COMMAND     Cmd (command) key
+                  KEY_COPY        Copy key
+                  KEY_CREATE      Create key
+                  KEY_END         End key
+                  KEY_EXIT        Exit key
+                  KEY_FIND        Find key
+                  KEY_HELP        Help key
+                  KEY_MARK        Mark key
+                  KEY_MESSAGE     Message key
+                  KEY_MOUSE       Mouse event occurred
+                  KEY_MOVE        Move key
+                  KEY_NEXT        Next object key
+                  KEY_OPEN        Open key
+                  KEY_OPTIONS     Options key
+                  KEY_PREVIOUS    Previous object key
+                  KEY_REDO        Redo key
+                  KEY_REFERENCE   Ref(erence) key
+                  KEY_REFRESH     Refresh key
+                  KEY_REPLACE     Replace key
+                  KEY_RESIZE      Screen resized
+                  KEY_RESTART     Restart key
+                  KEY_RESUME      Resume key
+                  KEY_SAVE        Save key
+                  KEY_SBEG        Shifted beginning key
+                  KEY_SCANCEL     Shifted cancel key
+                  KEY_SCOMMAND    Shifted command key
+                  KEY_SCOPY       Shifted copy key
+                  KEY_SCREATE     Shifted create key
+                  KEY_SDC         Shifted delete char key
+                  KEY_SDL         Shifted delete line key
+                  KEY_SELECT      Select key
+                  KEY_SEND        Shifted end key
+                  KEY_SEOL        Shifted clear line key
+                  KEY_SEXIT       Shifted exit key
+                  KEY_SFIND       Shifted find key
+                  KEY_SHELP       Shifted help key
+                  KEY_SHOME       Shifted home key
+                  KEY_SIC         Shifted insert key
+                  KEY_SLEFT       Shifted left arrow key
+                  KEY_SMESSAGE    Shifted message key
+                  KEY_SMOVE       Shifted move key
+                  KEY_SNEXT       Shifted next key
+                  KEY_SOPTIONS    Shifted options key
+                  KEY_SPREVIOUS   Shifted prev key
+                  KEY_SPRINT      Shifted print key
+                  KEY_SREDO       Shifted redo key
+                  KEY_SREPLACE    Shifted replace key
+                  KEY_SRIGHT      Shifted right arrow key
+                  KEY_SRSUME      Shifted resume key
+                  KEY_SSAVE       Shifted save key
+                  KEY_SSUSPEND    Shifted suspend key
+                  KEY_SUNDO       Shifted undo key
+                  KEY_SUSPEND     Suspend key
+                  KEY_UNDO        Undo key
+
+       Keypad is arranged like this:
+
+                                +-----+------+-------+
+                                | <STRONG>A1</STRONG>  |  <STRONG>up</STRONG>  |  <STRONG>A3</STRONG>   |
+                                +-----+------+-------+
+                                |<STRONG>left</STRONG> |  <STRONG>B2</STRONG>  | <STRONG>right</STRONG> |
+                                +-----+------+-------+
+                                | <STRONG>C1</STRONG>  | <STRONG>down</STRONG> |  <STRONG>C3</STRONG>   |
+                                +-----+------+-------+
+       A few of these predefined values do <EM>not</EM> correspond to a real key:
+
+       <STRONG>o</STRONG>   <STRONG>KEY_RESIZE</STRONG>  is  returned when the <STRONG>SIGWINCH</STRONG> signal has been detected
+           (see  <STRONG><A HREF="curs_initscr.3x.html">initscr(3x)</A></STRONG>  and  <STRONG><A HREF="resizeterm.3x.html">resizeterm(3x)</A></STRONG>).   This  code  is  returned
+           whether or not <STRONG>keypad</STRONG> has been enabled.
+
+       <STRONG>o</STRONG>   <STRONG>KEY_MOUSE</STRONG>  is returned for mouse-events (see <STRONG><A HREF="curs_mouse.3x.html">curs_mouse(3x)</A></STRONG>).  This
+           code relies upon whether or not <STRONG><A HREF="curs_inopts.3x.html">keypad(3x)</A></STRONG> has  been  enabled,  be-
+           cause  (e.g., with <STRONG>xterm(1)</STRONG> mouse prototocol) ncurses must read es-
+           cape sequences, just like a function key.
+
+
+</PRE><H3><a name="h3-Testing-key-codes">Testing key-codes</a></H3><PRE>
+       The <STRONG>has_key</STRONG> routine takes a key-code value from the above list, and re-
+       turns <STRONG>TRUE</STRONG> or <STRONG>FALSE</STRONG> according to whether the current terminal type rec-
+       ognizes a key with that value.
+
+       The library also supports these extensions:
+
+          <STRONG>define_key</STRONG>
+               defines a key-code for a given string (see <STRONG><A HREF="define_key.3x.html">define_key(3x)</A></STRONG>).
+
+          <STRONG>key_defined</STRONG>
+               checks if there is a key-code defined for a given  string  (see
+               <STRONG><A HREF="key_defined.3x.html">key_defined(3x)</A></STRONG>).
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       All  routines  return the integer <STRONG>ERR</STRONG> upon failure and an integer value
+       other than <STRONG>ERR</STRONG> (<STRONG>OK</STRONG> in the case of <STRONG>ungetch</STRONG>) upon successful completion.
+
+          <STRONG>ungetch</STRONG>
+               returns <STRONG>ERR</STRONG> if there is no more room in the FIFO.
+
+          <STRONG>wgetch</STRONG>
+               returns <STRONG>ERR</STRONG> if the window pointer is null, or  if  its  timeout
+               expires without having any data, or if the execution was inter-
+               rupted by a signal (<STRONG>errno</STRONG> will be set to <STRONG>EINTR</STRONG>).
+
+       Functions with a "mv" prefix first  perform  a  cursor  movement  using
+       <STRONG>wmove</STRONG>, and return an error if the position is outside the window, or if
+       the window pointer is null.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       Use of the escape key by a programmer for a single  character  function
+       is  discouraged, as it will cause a delay of up to one second while the
+       keypad code looks for a following function-key sequence.
+
+       Some keys may be the same as commonly used control keys, e.g.,  <STRONG>KEY_EN-</STRONG>
+       <STRONG>TER</STRONG>  versus control/M, <STRONG>KEY_BACKSPACE</STRONG> versus control/H.  Some curses im-
+       plementations may differ according to whether they treat these  control
+       keys  specially  (and ignore the terminfo), or use the terminfo defini-
+       tions.  <STRONG>Ncurses</STRONG> uses the terminfo definition.  If it says that  <STRONG>KEY_EN-</STRONG>
+       <STRONG>TER</STRONG> is control/M, <STRONG>getch</STRONG> will return <STRONG>KEY_ENTER</STRONG> when you press control/M.
+
+       Generally,  <STRONG>KEY_ENTER</STRONG> denotes the character(s) sent by the <EM>Enter</EM> key on
+       the numeric keypad:
+
+       <STRONG>o</STRONG>   the terminal description lists the most useful keys,
+
+       <STRONG>o</STRONG>   the <EM>Enter</EM> key on the regular keyboard is  already  handled  by  the
+           standard ASCII characters for carriage-return and line-feed,
+
+       <STRONG>o</STRONG>   depending on whether <STRONG>nl</STRONG> or <STRONG>nonl</STRONG> was called, pressing "Enter" on the
+           regular keyboard may return either a carriage-return or  line-feed,
+           and finally
+
+       <STRONG>o</STRONG>   "Enter or send" is the standard description for this key.
+
+       When   using   <STRONG>getch</STRONG>,  <STRONG>wgetch</STRONG>,  <STRONG>mvgetch</STRONG>,  or  <STRONG>mvwgetch</STRONG>,  nocbreak  mode
+       (<STRONG>nocbreak</STRONG>) and echo mode (<STRONG>echo</STRONG>) should not be used at  the  same  time.
+       Depending  on the state of the tty driver when each character is typed,
+       the program may produce undesirable results.
+
+       Note that <STRONG>getch</STRONG>, <STRONG>mvgetch</STRONG>, and <STRONG>mvwgetch</STRONG> may be macros.
+
+       Historically, the set of keypad macros was largely defined by  the  ex-
+       tremely  function-key-rich  keyboard of the AT&amp;T 7300, aka 3B1, aka Sa-
+       fari 4.  Modern personal computers usually have only a small subset  of
+       these.   IBM  PC-style  consoles  typically  support  little  more than
+       <STRONG>KEY_UP</STRONG>, <STRONG>KEY_DOWN</STRONG>, <STRONG>KEY_LEFT</STRONG>, <STRONG>KEY_RIGHT</STRONG>,  <STRONG>KEY_HOME</STRONG>,  <STRONG>KEY_END</STRONG>,  <STRONG>KEY_NPAGE</STRONG>,
+       <STRONG>KEY_PPAGE</STRONG>,  and  function  keys  1  through 12.  The Ins key is usually
+       mapped to <STRONG>KEY_IC</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       The *get* functions are described in the XSI Curses standard, Issue  4.
+       They  read  single-byte  characters  only.  The standard specifies that
+       they return <STRONG>ERR</STRONG> on failure, but specifies no error conditions.
+
+       The echo behavior of these functions on  input  of  <STRONG>KEY_</STRONG>  or  backspace
+       characters  was not specified in the SVr4 documentation.  This descrip-
+       tion is adopted from the XSI Curses standard.
+
+       The behavior of <STRONG>getch</STRONG> and friends in the presence of handled signals is
+       unspecified in the SVr4 and XSI Curses documentation.  Under historical
+       curses implementations, it varied depending on  whether  the  operating
+       system's  implementation of handled signal receipt interrupts a <STRONG>read(2)</STRONG>
+       call in progress or not, and also (in some  implementations)  depending
+       on whether an input timeout or non-blocking mode has been set.
+
+       <STRONG>KEY_MOUSE</STRONG> is mentioned in XSI Curses, along with a few related terminfo
+       capabilities, but no higher-level functions use the feature.   The  im-
+       plementation in ncurses is an extension.
+
+       <STRONG>KEY_RESIZE</STRONG> is an extension first implemented for ncurses.  NetBSD curs-
+       es later added this extension.
+
+       Programmers concerned about portability should be prepared  for  either
+       of  two  cases: (a) signal receipt does not interrupt <STRONG>getch</STRONG>; (b) signal
+       receipt interrupts <STRONG>getch</STRONG> and causes it to return <STRONG>ERR</STRONG> with <STRONG>errno</STRONG> set  to
+       <STRONG>EINTR</STRONG>.
+
+       The  <STRONG>has_key</STRONG> function is unique to <STRONG>ncurses</STRONG>.  We recommend that any code
+       using it be conditionalized on the <STRONG>NCURSES_VERSION</STRONG> feature macro.
+
+
+</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_inopts.3x.html">curs_inopts(3x)</A></STRONG>, <STRONG><A HREF="curs_mouse.3x.html">curs_mouse(3x)</A></STRONG>,  <STRONG><A HREF="curs_move.3x.html">curs_move(3x)</A></STRONG>,  <STRONG>curs_out-</STRONG>
+       <STRONG><A HREF="curs_outopts.3x.html">opts(3x)</A></STRONG>, <STRONG><A HREF="curs_refresh.3x.html">curs_refresh(3x)</A></STRONG>, <STRONG><A HREF="curs_variables.3x.html">curs_variables(3x)</A></STRONG>, <STRONG><A HREF="resizeterm.3x.html">resizeterm(3x)</A></STRONG>.
+
+       Comparable  functions  in the wide-character (ncursesw) library are de-
+       scribed in <STRONG><A HREF="curs_get_wch.3x.html">curs_get_wch(3x)</A></STRONG>.
+
+
+
+                                                                <STRONG><A HREF="curs_getch.3x.html">curs_getch(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-Reading-characters">Reading characters</a></li>
+<li><a href="#h3-Keypad-mode">Keypad mode</a></li>
+<li><a href="#h3-Ungetting-characters">Ungetting characters</a></li>
+<li><a href="#h3-Predefined-key-codes">Predefined key-codes</a></li>
+<li><a href="#h3-Testing-key-codes">Testing key-codes</a></li>
+</ul>
+</li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_getstr.3x.html b/doc/html/man/curs_getstr.3x.html
new file mode 100644
index 0000000..97089e2
--- /dev/null
+++ b/doc/html/man/curs_getstr.3x.html
@@ -0,0 +1,236 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2017 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_getstr.3x,v 1.36 2022/02/12 20:07:29 tom Exp @
+  * X/Open says also until EOf
+  * X/Open says then an EOS is added to the result
+  * X/Open doesn't mention n&lt;0
+-->
+<!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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_getstr 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_getstr 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_getstr.3x.html">curs_getstr(3x)</A></STRONG>                                                <STRONG><A HREF="curs_getstr.3x.html">curs_getstr(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>getstr</STRONG>, <STRONG>getnstr</STRONG>, <STRONG>wgetstr</STRONG>, <STRONG>wgetnstr</STRONG>, <STRONG>mvgetstr</STRONG>, <STRONG>mvgetnstr</STRONG>, <STRONG>mvwgetstr</STRONG>,
+       <STRONG>mvwgetnstr</STRONG> - accept character strings from <STRONG>curses</STRONG> terminal keyboard
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>getstr(char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>getnstr(char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wgetstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wgetnstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>mvgetstr(int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvwgetstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvgetnstr(int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvwgetnstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The function <STRONG>getstr</STRONG> is equivalent to a series of calls to <STRONG>getch</STRONG>,  until
+       a  newline or carriage return is received (the terminating character is
+       not included in the returned string).  The resulting value is placed in
+       the area pointed to by the character pointer <EM>str</EM>, followed by a NUL.
+
+       The  <STRONG>getnstr</STRONG>  function reads from the <EM>stdscr</EM> default window.  The other
+       functions, such as <STRONG>wgetnstr</STRONG>, read from the window given as a parameter.
+
+       <STRONG>getnstr</STRONG> reads at most <EM>n</EM> characters, thus preventing a possible overflow
+       of  the input buffer.  Any attempt to enter more characters (other than
+       the terminating newline or carriage return) causes  a  beep.   Function
+       keys also cause a beep and are ignored.
+
+       The user's <EM>erase</EM> and <EM>kill</EM> characters are interpreted:
+
+       <STRONG>o</STRONG>   The  <EM>erase</EM>  character (e.g., <STRONG>^H</STRONG>) erases the character at the end of
+           the buffer, moving the cursor to the left.
+
+           If <EM>keypad</EM> mode is on for the window, <STRONG>KEY_LEFT</STRONG> and <STRONG>KEY_BACKSPACE</STRONG> are
+           both considered equivalent to the user's erase character.
+
+       <STRONG>o</STRONG>   The <EM>kill</EM> character (e.g., <STRONG>^U</STRONG>) erases the entire buffer, leaving the
+           cursor at the beginning of the buffer.
+
+       Characters input are echoed only if <STRONG>echo</STRONG>  is  currently  on.   In  that
+       case,  backspace is echoed as deletion of the previous character (typi-
+       cally a left motion).
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       All routines return the integer <STRONG>ERR</STRONG> upon failure and an <STRONG>OK</STRONG> (SVr4 speci-
+       fies  only  "an  integer value other than <STRONG>ERR</STRONG>") upon successful comple-
+       tion.
+
+       X/Open defines no error conditions.
+
+       In this implementation, these functions return an error if  the  window
+       pointer is null, or if its timeout expires without having any data.
+
+       This  implementation  provides an extension as well.  If a <STRONG>SIGWINCH</STRONG> in-
+       terrupts the function, it will return <STRONG>KEY_RESIZE</STRONG> rather than <STRONG>OK</STRONG> or <STRONG>ERR</STRONG>.
+
+       Functions with a "mv" prefix first  perform  a  cursor  movement  using
+       <STRONG>wmove</STRONG>, and return an error if the position is outside the window, or if
+       the window pointer is null.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       Note that <STRONG>getstr</STRONG>, <STRONG>mvgetstr</STRONG>, and <STRONG>mvwgetstr</STRONG> may be macros.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These functions are described in the  XSI  Curses  standard,  Issue  4.
+       They  read  single-byte  characters only.  The standard does not define
+       any error conditions.  This implementation returns <STRONG>ERR</STRONG>  if  the  window
+       pointer is null, or if the lower-level <STRONG><A HREF="curs_getch.3x.html">wgetch(3x)</A></STRONG> call returns an <STRONG>ERR</STRONG>.
+
+       SVr3  and  early  SVr4  curses  implementations did not reject function
+       keys; the SVr4.0 documentation claimed that  "special  keys"  (such  as
+       function  keys, "home" key, "clear" key, <EM>etc</EM>.) are "interpreted", with-
+       out giving details.  It lied.  In fact, the "character" value  appended
+       to  the  string by those implementations was predictable but not useful
+       (being, in fact, the low-order eight bits of the key's KEY_ value).
+
+       The functions <STRONG>getnstr</STRONG>, <STRONG>mvgetnstr</STRONG>, and <STRONG>mvwgetnstr</STRONG> were present  but  not
+       documented in SVr4.
+
+       X/Open Curses, Issue 5 (2007) stated that these functions "read at most
+       <EM>n</EM> bytes" but did not state whether the terminating NUL  is  counted  in
+       that  limit.   X/Open  Curses,  Issue 7 (2009) changed that to say they
+       "read at most <EM>n</EM>-1 bytes" to allow for the terminating NUL.  As of 2018,
+       some implementations do, some do not count it:
+
+       <STRONG>o</STRONG>   ncurses  6.1  and PDCurses do not count the NUL in the given limit,
+           while
+
+       <STRONG>o</STRONG>   Solaris SVr4 and NetBSD curses count the NUL as part of the limit.
+
+       <STRONG>o</STRONG>   Solaris xcurses provides both:  its  wide-character  <STRONG>wget_nstr</STRONG>  re-
+           serves a NUL, but its <STRONG>wgetnstr</STRONG> does not count the NUL consistently.
+
+       In SVr4 curses, a negative value of <EM>n</EM> tells <STRONG>wgetnstr</STRONG> to assume that the
+       caller's buffer is large enough to hold the result, i.e., to  act  like
+       <STRONG>wgetstr</STRONG>.   X/Open  Curses does not mention this (or anything related to
+       negative or zero values of <EM>n</EM>), however  most  implementations  use  the
+       feature, with different limits:
+
+       <STRONG>o</STRONG>   Solaris  SVr4  curses  and  PDCurses limit the result to 255 bytes.
+           Other Unix systems than Solaris are likely to use the same limit.
+
+       <STRONG>o</STRONG>   Solaris xcurses limits the result to <STRONG>LINE_MAX</STRONG> bytes.
+
+       <STRONG>o</STRONG>   NetBSD 7 assumes no particular limit for the result  from  <STRONG>wgetstr</STRONG>.
+           However,  it  limits  the <STRONG>wgetnstr</STRONG> parameter <EM>n</EM> to ensure that it is
+           greater than zero.
+
+           A comment in NetBSD's source code states that this is specified  in
+           SUSv2.
+
+       <STRONG>o</STRONG>   ncurses  (before  6.2)  assumes  no particular limit for the result
+           from <STRONG>wgetstr</STRONG>, and treats the <EM>n</EM>  parameter  of  <STRONG>wgetnstr</STRONG>  like  SVr4
+           curses.
+
+       <STRONG>o</STRONG>   ncurses  6.2  uses  <STRONG>LINE_MAX</STRONG>,  or a larger (system-dependent) value
+           which the <STRONG>sysconf</STRONG> function may provide.   If  neither  <STRONG>LINE_MAX</STRONG>  or
+           <STRONG>sysconf</STRONG>  is available, ncurses uses the POSIX value for <STRONG>LINE_MAX</STRONG> (a
+           2048 byte limit).  In either case, it reserves a byte for the  ter-
+           minating NUL.
+
+       Although  <STRONG>getnstr</STRONG>  is equivalent to a series of calls to <STRONG>getch</STRONG>, it also
+       makes changes to the curses modes to allow simple editing of the  input
+       buffer:
+
+       <STRONG>o</STRONG>   <STRONG>getnstr</STRONG>  saves  the  current  value of the <STRONG>nl</STRONG>, <STRONG>echo</STRONG>, <STRONG>raw</STRONG> and <STRONG>cbreak</STRONG>
+           modes, and sets <STRONG>nl</STRONG>, <STRONG>noecho</STRONG>, <STRONG>noraw</STRONG>, and <STRONG>cbreak</STRONG>.
+
+           <STRONG>getnstr</STRONG> handles the echoing of characters, rather than  relying  on
+           the caller to set an appropriate mode.
+
+       <STRONG>o</STRONG>   It  also  obtains  the <EM>erase</EM> and <EM>kill</EM> characters from <STRONG>erasechar</STRONG> and
+           <STRONG>killchar</STRONG>, respectively.
+
+       <STRONG>o</STRONG>   On return, <STRONG>getnstr</STRONG> restores the modes to their previous values.
+
+       Other implementations differ in their treatment of special characters:
+
+       <STRONG>o</STRONG>   While they may set the <EM>echo</EM> mode, other implementations do not mod-
+           ify  the  <EM>raw</EM> mode, They may take the <EM>cbreak</EM> mode set by the caller
+           into account when deciding whether to handle echoing within <STRONG>getnstr</STRONG>
+           or as a side-effect of the <STRONG>getch</STRONG> calls.
+
+       <STRONG>o</STRONG>   The original ncurses (as <EM>pcurses</EM> in 1986) set <STRONG>noraw</STRONG> and <STRONG>cbreak</STRONG> when
+           accepting input for <STRONG>getnstr</STRONG>.  That may have been done to make func-
+           tion- and cursor-keys work; it is not necessary with ncurses.
+
+           Since  1995, ncurses has provided signal handlers for INTR and QUIT
+           (e.g., <STRONG>^C</STRONG> or <STRONG>^\</STRONG>).  With the <STRONG>noraw</STRONG> and <STRONG>cbreak</STRONG>  settings,  those  may
+           catch  a  signal  and stop the program, where other implementations
+           allow one to enter those characters in the buffer.
+
+       <STRONG>o</STRONG>   Starting in 2021 (ncurses 6.3), <STRONG>getnstr</STRONG> sets <STRONG>raw</STRONG>, rather than <STRONG>noraw</STRONG>
+           and  <STRONG>cbreak</STRONG> for better compatibility with SVr4-curses, e.g., allow-
+           ing one to enter a <STRONG>^C</STRONG> into the buffer.
+
+
+</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_getch.3x.html">curs_getch(3x)</A></STRONG>, <STRONG><A HREF="curs_termattrs.3x.html">curs_termattrs(3x)</A></STRONG>, <STRONG><A HREF="curs_variables.3x.html">curs_variables(3x)</A></STRONG>.
+
+
+
+                                                               <STRONG><A HREF="curs_getstr.3x.html">curs_getstr(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_getyx.3x.html b/doc/html/man/curs_getyx.3x.html
new file mode 100644
index 0000000..0f463c5
--- /dev/null
+++ b/doc/html/man/curs_getyx.3x.html
@@ -0,0 +1,126 @@
+<!--
+  ****************************************************************************
+  * Copyright 2020-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2007,2010 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_getyx.3x,v 1.23 2022/02/12 20:07:29 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_getyx 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_getyx 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_getyx.3x.html">curs_getyx(3x)</A></STRONG>                                                  <STRONG><A HREF="curs_getyx.3x.html">curs_getyx(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>getyx</STRONG>,  <STRONG>getparyx</STRONG>,  <STRONG>getbegyx</STRONG>,  <STRONG>getmaxyx</STRONG>  -  get <STRONG>curses</STRONG> cursor and window
+       coordinates
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>void</STRONG> <STRONG>getyx(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>);</STRONG>
+       <STRONG>void</STRONG> <STRONG>getparyx(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>);</STRONG>
+       <STRONG>void</STRONG> <STRONG>getbegyx(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>);</STRONG>
+       <STRONG>void</STRONG> <STRONG>getmaxyx(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The <STRONG>getyx</STRONG> macro places the current cursor position of the given  window
+       in the two integer variables <EM>y</EM> and <EM>x</EM>.
+
+       If  <EM>win</EM>  is  a  subwindow,  the  <STRONG>getparyx</STRONG>  macro  places  the beginning
+       coordinates of the subwindow relative to the  parent  window  into  two
+       integer variables <EM>y</EM> and <EM>x</EM>.  Otherwise, <STRONG>-1</STRONG> is placed into <EM>y</EM> and <EM>x</EM>.
+
+       Like  <STRONG>getyx</STRONG>,  the  <STRONG>getbegyx</STRONG>  and  <STRONG>getmaxyx</STRONG>  macros  store  the  current
+       beginning coordinates and size of the specified window.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       The return values of these macros are undefined (i.e., they should  not
+       be used as the right-hand side of assignment statements).
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       All  of these interfaces are macros.  A "<STRONG>&amp;</STRONG>" is not necessary before the
+       variables <EM>y</EM> and <EM>x</EM>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       The <STRONG>getyx</STRONG>, <STRONG>getparyx</STRONG>, <STRONG>getbegyx</STRONG> and <STRONG>getmaxyx</STRONG> macros are described in  the
+       XSI Curses standard, Issue 4.
+
+       This  implementation also provides functions <STRONG>getbegx</STRONG>, <STRONG>getbegy</STRONG>, <STRONG>getcurx</STRONG>,
+       <STRONG>getcury</STRONG>, <STRONG>getmaxx</STRONG>, <STRONG>getmaxy</STRONG>, <STRONG>getparx</STRONG> and <STRONG>getpary</STRONG> for  compatibility  with
+       older versions of curses.
+
+       Although  X/Open  Curses  does  not  address this, many implementations
+       provide members of the WINDOW structure containing values corresponding
+       to  these  macros.  For best portability, do not rely on using the data
+       in WINDOW, since some implementations make WINDOW opaque (do not  allow
+       direct use of its members).
+
+       Besides the problem of opaque structures, the data stored in like-named
+       members may not have like-values  in  different  implementations.   For
+       example,  the  WINDOW._maxx and WINDOW._maxy values in ncurses have (at
+       least  since  release  1.8.1)  differed  by   one   from   some   other
+       implementations.   The  difference  is  hidden  by  means  of the macro
+       <STRONG>getmaxyx</STRONG>.
+
+
+</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_legacy.3x.html">curs_legacy(3x)</A></STRONG>, <STRONG><A HREF="curs_opaque.3x.html">curs_opaque(3x)</A></STRONG>
+
+
+
+                                                                <STRONG><A HREF="curs_getyx.3x.html">curs_getyx(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_in_wch.3x.html b/doc/html/man/curs_in_wch.3x.html
new file mode 100644
index 0000000..f1ce0f4
--- /dev/null
+++ b/doc/html/man/curs_in_wch.3x.html
@@ -0,0 +1,108 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 2002-2010,2017 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_in_wch.3x,v 1.13 2022/02/12 20:07:29 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_in_wch 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_in_wch 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_in_wch.3x.html">curs_in_wch(3x)</A></STRONG>                                                <STRONG><A HREF="curs_in_wch.3x.html">curs_in_wch(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>in_wch</STRONG>,  <STRONG>mvin_wch</STRONG>, <STRONG>mvwin_wch</STRONG>, <STRONG>win_wch</STRONG> - extract a complex character and
+       rendition from a window
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>in_wch(cchar_t</STRONG> <STRONG>*</STRONG><EM>wcval</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>win_wch(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>wcval</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>mvin_wch(int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>wcval</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvwin_wch(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>wcval</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       These functions extract the complex character and  rendition  from  the
+       current position in the named window into the <STRONG>cchar_t</STRONG> object referenced
+       by wcval.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       No errors are defined in the XSI Curses standard.  This  implementation
+       checks  for  null  pointers,  returns  <STRONG>ERR</STRONG>  in that case.  Also, the <EM>mv</EM>
+       routines check for error moving the cursor, returning <STRONG>ERR</STRONG> in that case.
+       Otherwise they return <STRONG>OK</STRONG>.
+
+       Functions  with  a  "mv"  prefix  first perform a cursor movement using
+       <STRONG>wmove</STRONG>, and return an error if the position is outside the window, or if
+       the window pointer is null.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       Note that all of these routines may be macros.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These functions are described in the XSI Curses standard, Issue 4.
+
+
+</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_inch.3x.html">curs_inch(3x)</A></STRONG>.
+
+
+
+                                                               <STRONG><A HREF="curs_in_wch.3x.html">curs_in_wch(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_in_wchstr.3x.html b/doc/html/man/curs_in_wchstr.3x.html
new file mode 100644
index 0000000..957bef2
--- /dev/null
+++ b/doc/html/man/curs_in_wchstr.3x.html
@@ -0,0 +1,121 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 2002-2012,2017 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_in_wchstr.3x,v 1.17 2022/02/12 20:07:29 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_in_wchstr 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_in_wchstr 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_in_wchstr.3x.html">curs_in_wchstr(3x)</A></STRONG>                                          <STRONG><A HREF="curs_in_wchstr.3x.html">curs_in_wchstr(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>in_wchstr</STRONG>, <STRONG>in_wchnstr</STRONG>, <STRONG>win_wchstr</STRONG>, <STRONG>win_wchnstr</STRONG>, <STRONG>mvin_wchstr</STRONG>,
+       <STRONG>mvin_wchnstr</STRONG>, <STRONG>mvwin_wchstr</STRONG>, <STRONG>mvwin_wchnstr</STRONG> - get an array of complex
+       characters and renditions from a curses window
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>in_wchstr(cchar_t</STRONG> <STRONG>*</STRONG><EM>wchstr</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>in_wchnstr(cchar_t</STRONG> <STRONG>*</STRONG><EM>wchstr</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>win_wchstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>wchstr</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>win_wchnstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>wchstr</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>mvin_wchstr(int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>wchstr</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvin_wchnstr(int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>wchstr</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvwin_wchstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>wchstr</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvwin_wchnstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>wchstr</EM>, int <EM>n</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       These functions return an array of complex characters in <EM>wchstr</EM>, start-
+       ing at the current cursor position in  the  named  window.   Attributes
+       (rendition) are stored with the characters.
+
+       The  <STRONG>in_wchnstr</STRONG>,  <STRONG>mvin_wchnstr</STRONG>,  <STRONG>mvwin_wchnstr</STRONG> and <STRONG>win_wchnstr</STRONG> fill the
+       array with at most <EM>n</EM> <STRONG>cchar_t</STRONG> elements.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       Note that all routines except <STRONG>win_wchnstr</STRONG> may be macros.
+
+       Reading a line that overflows the  array  pointed  to  by  <EM>wchstr</EM>  with
+       <STRONG>in_wchstr</STRONG>, <STRONG>mvin_wchstr</STRONG>, <STRONG>mvwin_wchstr</STRONG> or <STRONG>win_wchstr</STRONG> causes undefined re-
+       sults.  Therefore, the use of <STRONG>in_wchnstr</STRONG>, <STRONG>mvin_wchnstr</STRONG>,  <STRONG>mvwin_wchnstr</STRONG>,
+       or <STRONG>win_wchnstr</STRONG> is recommended.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       Upon successful completion, these functions return <STRONG>OK</STRONG>.  Otherwise, they
+       return <STRONG>ERR</STRONG>.
+
+       Functions with a "mv" prefix first  perform  a  cursor  movement  using
+       <STRONG>wmove</STRONG>, and return an error if the position is outside the window, or if
+       the window pointer is null.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       The XSI Curses defines no error conditions.  This implementation checks
+       for null pointers, returning <STRONG>ERR</STRONG> in that case.
+
+
+</PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
+       Functions: <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG>, <STRONG><A HREF="curs_in_wch.3x.html">curs_in_wch(3x)</A></STRONG>, <STRONG><A HREF="curs_instr.3x.html">curs_instr(3x)</A></STRONG>, <STRONG><A HREF="curs_inwstr.3x.html">curs_inwstr(3x)</A></STRONG>
+       <STRONG><A HREF="curs_inchstr.3x.html">curs_inchstr(3x)</A></STRONG>
+
+
+
+                                                            <STRONG><A HREF="curs_in_wchstr.3x.html">curs_in_wchstr(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></li>
+<li><a href="#h2-NOTES">NOTES</a></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>
diff --git a/doc/html/man/curs_inch.3x.html b/doc/html/man/curs_inch.3x.html
new file mode 100644
index 0000000..db7a895
--- /dev/null
+++ b/doc/html/man/curs_inch.3x.html
@@ -0,0 +1,154 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2017 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_inch.3x,v 1.28 2022/02/12 20:07:29 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_inch 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_inch 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_inch.3x.html">curs_inch(3x)</A></STRONG>                                                    <STRONG><A HREF="curs_inch.3x.html">curs_inch(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>inch</STRONG>,  <STRONG>winch</STRONG>,  <STRONG>mvinch</STRONG>,  <STRONG>mvwinch</STRONG> - get a character and attributes from a
+       <STRONG>curses</STRONG> window
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>chtype</STRONG> <STRONG>inch(void);</STRONG>
+       <STRONG>chtype</STRONG> <STRONG>winch(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+
+       <STRONG>chtype</STRONG> <STRONG>mvinch(int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>);</STRONG>
+       <STRONG>chtype</STRONG> <STRONG>mvwinch(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       These routines return the character, of type  <STRONG>chtype</STRONG>,  at  the  current
+       position  in  the  named  window.   If  any attributes are set for that
+       position, their values are OR'ed into the  value  returned.   Constants
+       defined  in <STRONG>&lt;curses.h&gt;</STRONG> can be used with the <STRONG>&amp;</STRONG> (logical AND) operator to
+       extract the character or attributes alone.
+
+
+</PRE><H3><a name="h3-Attributes">Attributes</a></H3><PRE>
+       The following bit-masks may  be  AND-ed  with  characters  returned  by
+       <STRONG>winch</STRONG>.
+
+       <STRONG>A_CHARTEXT</STRONG>     Bit-mask to extract character
+       <STRONG>A_ATTRIBUTES</STRONG>   Bit-mask to extract attributes
+       <STRONG>A_COLOR</STRONG>        Bit-mask to extract color-pair field information
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       Functions  with  a  "mv"  prefix  first perform a cursor movement using
+       <STRONG>wmove</STRONG>, and return an error if the position is outside the window, or if
+       the window pointer is null.
+
+       The  <STRONG>winch</STRONG>  function  does  not  return an error if the window contains
+       characters larger than 8-bits (255).  Only the low-order 8 bits of  the
+       character are used by <STRONG>winch</STRONG>.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       Note that all of these routines may be macros.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These functions are described in the XSI Curses standard, Issue 4.
+
+       Very  old systems (before standardization) provide a different function
+       with the same name:
+
+       <STRONG>o</STRONG>   The <STRONG>winch</STRONG> function was part of the  original  BSD  curses  library,
+           which   stored   a  7-bit  character  combined  with  the  <EM>standout</EM>
+           attribute.
+
+           In BSD curses, <STRONG>winch</STRONG> returned only the character  (as  an  integer)
+           with the <EM>standout</EM> attribute removed.
+
+       <STRONG>o</STRONG>   System  V  curses  added support for several video attributes which
+           could be combined with characters in the window.
+
+           Reflecting this improvement, the function was altered to return the
+           character combined with all video attributes in a <STRONG>chtype</STRONG> value.
+
+       X/Open Curses does not specify the size and layout of attributes, color
+       and character values in <STRONG>chtype</STRONG>; it is  implementation-dependent.   This
+       implementation  uses 8 bits for character values.  An application using
+       more bits,  e.g.,  a  Unicode  value,  should  use  the  wide-character
+       equivalents to these functions.
+
+
+</PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
+       <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG>
+            gives an overview of the WINDOW and <STRONG>chtype</STRONG> data types.
+
+       <STRONG><A HREF="curs_attr.3x.html">curs_attr(3x)</A></STRONG>
+            goes  into  more  detail,  pointing  out  portability problems and
+            constraints on the use of <STRONG>chtype</STRONG> for returning window information.
+
+       <STRONG><A HREF="curs_in_wch.3x.html">curs_in_wch(3x)</A></STRONG>
+            describes comparable functions for the  wide-character  (ncursesw)
+            library.
+
+
+
+                                                                 <STRONG><A HREF="curs_inch.3x.html">curs_inch(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-Attributes">Attributes</a></li>
+</ul>
+</li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_inchstr.3x.html b/doc/html/man/curs_inchstr.3x.html
new file mode 100644
index 0000000..691a809
--- /dev/null
+++ b/doc/html/man/curs_inchstr.3x.html
@@ -0,0 +1,131 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2017 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_inchstr.3x,v 1.24 2022/02/12 20:07:29 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_inchstr 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_inchstr 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_inchstr.3x.html">curs_inchstr(3x)</A></STRONG>                                              <STRONG><A HREF="curs_inchstr.3x.html">curs_inchstr(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>inchstr</STRONG>, <STRONG>inchnstr</STRONG>, <STRONG>winchstr</STRONG>, <STRONG>winchnstr</STRONG>, <STRONG>mvinchstr</STRONG>, <STRONG>mvinchnstr</STRONG>,
+       <STRONG>mvwinchstr</STRONG>, <STRONG>mvwinchnstr</STRONG> - get a string of characters (and attributes)
+       from a <STRONG>curses</STRONG> window
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>inchstr(chtype</STRONG> <STRONG>*</STRONG><EM>chstr</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>inchnstr(chtype</STRONG> <STRONG>*</STRONG><EM>chstr</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>winchstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>chtype</STRONG> <STRONG>*</STRONG><EM>chstr</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>winchnstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>chtype</STRONG> <STRONG>*</STRONG><EM>chstr</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>mvinchstr(int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>chtype</STRONG> <STRONG>*</STRONG><EM>chstr</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvinchnstr(int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>chtype</STRONG> <STRONG>*</STRONG><EM>chstr</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvwinchstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>chtype</STRONG> <STRONG>*</STRONG><EM>chstr</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvwinchnstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>chtype</STRONG> <STRONG>*</STRONG><EM>chstr</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       These  routines  return  a  NULL-terminated array of <STRONG>chtype</STRONG> quantities,
+       starting at the current cursor position in the named window and  ending
+       at  the  right  margin of the window.  The four functions with <EM>n</EM> as the
+       last argument, return a leading substring at  most  <EM>n</EM>  characters  long
+       (exclusive of the trailing (chtype)0).  Constants defined in <STRONG>&lt;curses.h&gt;</STRONG>
+       can be used with the <STRONG>&amp;</STRONG> (logical AND) operator to extract the  character
+       or   the   attribute   alone  from  any  position  in  the  <EM>chstr</EM>  [see
+       <STRONG><A HREF="curs_inch.3x.html">curs_inch(3x)</A></STRONG>].
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       All routines return the integer <STRONG>ERR</STRONG> upon failure and an  integer  value
+       other than <STRONG>ERR</STRONG> upon successful completion (the number of characters re-
+       trieved, exclusive of the trailing 0).
+
+       X/Open Curses defines no error conditions.  In this implementation:
+
+       <STRONG>o</STRONG>   If the <EM>win</EM> parameter is null, an error is returned,
+
+       <STRONG>o</STRONG>   If the <EM>chstr</EM> parameter is null, an error is returned,
+
+       Functions with a "mv" prefix first  perform  a  cursor  movement  using
+       <STRONG>wmove</STRONG>, and return an error if the position is outside the window, or if
+       the window pointer is null.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       Note that all routines except <STRONG>winchnstr</STRONG> may be macros.  SVr4  does  not
+       document whether the result string is zero-terminated; it does not doc-
+       ument whether a length limit argument includes any trailing 0;  and  it
+       does not document the meaning of the return value.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These  functions are described in the XSI Curses standard, Issue 4.  It
+       is no more specific than the SVr4 documentation on the trailing 0.   It
+       does specify that the successful return of the functions is <STRONG>OK</STRONG>.
+
+
+</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_inch.3x.html">curs_inch(3x)</A></STRONG>.
+
+       Comparable  functions  in the wide-character (ncursesw) library are de-
+       scribed in <STRONG><A HREF="curs_in_wchstr.3x.html">curs_in_wchstr(3x)</A></STRONG>.
+
+
+
+                                                              <STRONG><A HREF="curs_inchstr.3x.html">curs_inchstr(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_initscr.3x.html b/doc/html/man/curs_initscr.3x.html
new file mode 100644
index 0000000..08d21a6
--- /dev/null
+++ b/doc/html/man/curs_initscr.3x.html
@@ -0,0 +1,300 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2016,2017 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_initscr.3x,v 1.39 2022/07/24 15:46:49 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_initscr 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_initscr 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_initscr.3x.html">curs_initscr(3x)</A></STRONG>                                              <STRONG><A HREF="curs_initscr.3x.html">curs_initscr(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>initscr</STRONG>, <STRONG>newterm</STRONG>, <STRONG>endwin</STRONG>, <STRONG>isendwin</STRONG>, <STRONG>set_term</STRONG>, <STRONG>delscreen</STRONG> - <STRONG>curses</STRONG> screen
+       initialization and manipulation routines
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>WINDOW</STRONG> <STRONG>*initscr(void);</STRONG>
+       <STRONG>int</STRONG> <STRONG>endwin(void);</STRONG>
+
+       <STRONG>bool</STRONG> <STRONG>isendwin(void);</STRONG>
+
+       <STRONG>SCREEN</STRONG> <STRONG>*newterm(const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>type</EM><STRONG>,</STRONG> <STRONG>FILE</STRONG> <STRONG>*</STRONG><EM>outfd</EM><STRONG>,</STRONG> <STRONG>FILE</STRONG> <STRONG>*</STRONG><EM>infd</EM><STRONG>);</STRONG>
+       <STRONG>SCREEN</STRONG> <STRONG>*set_term(SCREEN</STRONG> <STRONG>*</STRONG><EM>new</EM><STRONG>);</STRONG>
+       <STRONG>void</STRONG> <STRONG>delscreen(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+
+</PRE><H3><a name="h3-initscr">initscr</a></H3><PRE>
+       <STRONG>initscr</STRONG> is normally the first <STRONG>curses</STRONG> routine to call when  initializing
+       a  program.   A few special routines sometimes need to be called before
+       it; these are <STRONG><A HREF="curs_slk.3x.html">slk_init(3x)</A></STRONG>, <STRONG>filter</STRONG>, <STRONG>ripoffline</STRONG>, <STRONG>use_env</STRONG>.  For multiple-
+       terminal applications, <STRONG>newterm</STRONG> may be called before <STRONG>initscr</STRONG>.
+
+       The initscr code determines the terminal type and initializes all <STRONG>curs-</STRONG>
+       <STRONG>es</STRONG> data structures.  <STRONG>initscr</STRONG> also causes the first call to  <STRONG><A HREF="curscurs_refresh.3x.html">refresh(3x)</A></STRONG>
+       to  clear  the  screen.  If errors occur, <STRONG>initscr</STRONG> writes an appropriate
+       error message to standard error and exits; otherwise, a pointer is  re-
+       turned to <STRONG>stdscr</STRONG>.
+
+
+</PRE><H3><a name="h3-newterm">newterm</a></H3><PRE>
+       A program that outputs to more than one terminal should use the <STRONG>newterm</STRONG>
+       routine for each terminal instead of <STRONG>initscr</STRONG>.  A program that needs  to
+       inspect capabilities, so it can continue to run in a line-oriented mode
+       if the terminal cannot support a screen-oriented  program,  would  also
+       use <STRONG>newterm</STRONG>.  The routine <STRONG>newterm</STRONG> should be called once for each termi-
+       nal.  It returns a variable of type <STRONG>SCREEN</STRONG> <STRONG>*</STRONG> which should be saved as a
+       reference to that terminal.  <STRONG>newterm</STRONG>'s arguments are
+
+       <STRONG>o</STRONG>   the <EM>type</EM> of the terminal to be used in place of <STRONG>$TERM</STRONG>,
+
+       <STRONG>o</STRONG>   a file pointer for output to the terminal, and
+
+       <STRONG>o</STRONG>   another file pointer for input from the terminal
+
+       If the <EM>type</EM> parameter is <STRONG>NULL</STRONG>, <STRONG>$TERM</STRONG> will be used.
+
+
+</PRE><H3><a name="h3-endwin">endwin</a></H3><PRE>
+       The  program  must also call <STRONG>endwin</STRONG> for each terminal being used before
+       exiting from <STRONG>curses</STRONG>.  If <STRONG>newterm</STRONG> is called more than once for the  same
+       terminal, the first terminal referred to must be the last one for which
+       <STRONG>endwin</STRONG> is called.
+
+       A program should always call <STRONG>endwin</STRONG> before  exiting  or  escaping  from
+       <STRONG>curses</STRONG> mode temporarily.  This routine
+
+       <STRONG>o</STRONG>   resets colors to correspond with the default color pair 0,
+
+       <STRONG>o</STRONG>   moves the cursor to the lower left-hand corner of the screen,
+
+       <STRONG>o</STRONG>   clears  the  remainder of the line so that it uses the default col-
+           ors,
+
+       <STRONG>o</STRONG>   sets the cursor to normal visibility (see <STRONG><A HREF="curs_kernel.3x.html">curs_set(3x)</A></STRONG>),
+
+       <STRONG>o</STRONG>   stops cursor-addressing mode using the <EM>exit</EM><STRONG>_</STRONG><EM>ca</EM><STRONG>_</STRONG><EM>mode</EM> terminal  capa-
+           bility,
+
+       <STRONG>o</STRONG>   restores tty modes (see <STRONG><A HREF="curs_kernel.3x.html">reset_shell_mode(3x)</A></STRONG>).
+
+       Calling <STRONG><A HREF="curs_refresh.3x.html">refresh(3x)</A></STRONG> or <STRONG><A HREF="curs_refresh.3x.html">doupdate(3x)</A></STRONG> after a temporary escape causes the
+       program to resume visual mode.
+
+
+</PRE><H3><a name="h3-isendwin">isendwin</a></H3><PRE>
+       The <STRONG>isendwin</STRONG> routine returns <STRONG>TRUE</STRONG> if <STRONG>endwin</STRONG> has been called without any
+       subsequent calls to <STRONG>wrefresh</STRONG>, and <STRONG>FALSE</STRONG> otherwise.
+
+
+</PRE><H3><a name="h3-set_term">set_term</a></H3><PRE>
+       The  <STRONG>set_term</STRONG>  routine  is  used to switch between different terminals.
+       The screen reference <EM>new</EM> becomes the new current terminal.  The  previ-
+       ous  terminal  is  returned  by  the routine.  This is the only routine
+       which manipulates <STRONG>SCREEN</STRONG> pointers; all other routines affect  only  the
+       current terminal.
+
+
+</PRE><H3><a name="h3-delscreen">delscreen</a></H3><PRE>
+       The  <STRONG>delscreen</STRONG>  routine  frees  storage associated with the <STRONG>SCREEN</STRONG> data
+       structure.  The <STRONG>endwin</STRONG> routine does not do this, so <STRONG>delscreen</STRONG> should be
+       called after <STRONG>endwin</STRONG> if a particular <STRONG>SCREEN</STRONG> is no longer needed.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       <STRONG>endwin</STRONG> returns the integer <STRONG>ERR</STRONG> upon failure and <STRONG>OK</STRONG> upon successful com-
+       pletion.
+
+       Routines that return pointers always return <STRONG>NULL</STRONG> on error.
+
+       X/Open defines no error conditions.  In this implementation
+
+       <STRONG>o</STRONG>   <STRONG>endwin</STRONG> returns an error if the terminal was not initialized.
+
+       <STRONG>o</STRONG>   <STRONG>newterm</STRONG> returns an error if it cannot allocate the data  structures
+           for  the  screen,  or  for the top-level windows within the screen,
+           i.e., <STRONG>curscr</STRONG>, <STRONG>newscr</STRONG>, or <STRONG>stdscr</STRONG>.
+
+       <STRONG>o</STRONG>   <STRONG>set_term</STRONG> returns no error.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These functions were described in the XSI Curses standard, Issue 4.  As
+       of 2015, the current document is X/Open Curses, Issue 7.
+
+
+</PRE><H3><a name="h3-Differences">Differences</a></H3><PRE>
+       X/Open  specifies that portable applications must not call <STRONG>initscr</STRONG> more
+       than once:
+
+       <STRONG>o</STRONG>   The portable way to use <STRONG>initscr</STRONG> is once only,  using  <STRONG>refresh</STRONG>  (see
+           <STRONG><A HREF="curs_refresh.3x.html">curs_refresh(3x)</A></STRONG>) to restore the screen after <STRONG>endwin</STRONG>.
+
+       <STRONG>o</STRONG>   This implementation allows using <STRONG>initscr</STRONG> after <STRONG>endwin</STRONG>.
+
+       Old versions of curses, e.g., BSD 4.4, would return a null pointer from
+       <STRONG>initscr</STRONG> when an error is detected, rather than exiting.  It is safe but
+       redundant to check the return value of <STRONG>initscr</STRONG> in XSI Curses.
+
+       Calling  <STRONG>endwin</STRONG>  does not dispose of the memory allocated in <STRONG>initscr</STRONG> or
+       <STRONG>newterm</STRONG>.  Deleting a <STRONG>SCREEN</STRONG> provides a way to do this:
+
+       <STRONG>o</STRONG>   X/Open Curses does not say what happens to <STRONG>WINDOW</STRONG>s  when  <STRONG>delscreen</STRONG>
+           "frees  storage associated with the <STRONG>SCREEN</STRONG>" nor does the SVr4 docu-
+           mentation help, adding that it should be called after <STRONG>endwin</STRONG>  if  a
+           <STRONG>SCREEN</STRONG> is no longer needed.
+
+       <STRONG>o</STRONG>   However,  <STRONG>WINDOW</STRONG>s are implicitly associated with a <STRONG>SCREEN</STRONG>.  so that
+           it is reasonable to expect <STRONG>delscreen</STRONG> to deal with these.
+
+       <STRONG>o</STRONG>   SVr4 curses deletes  the  standard  <STRONG>WINDOW</STRONG>  structures  <STRONG>stdscr</STRONG>  and
+           <STRONG>curscr</STRONG>  as  well  as a work area <STRONG>newscr</STRONG>.  SVr4 curses ignores other
+           windows.
+
+       <STRONG>o</STRONG>   Since version 4.0 (1996), ncurses has maintained a list of all win-
+           dows  for  each screen, using that information to delete those win-
+           dows when <STRONG>delscreen</STRONG> is called.
+
+       <STRONG>o</STRONG>   NetBSD copied this feature of ncurses in  2001.   PDCurses  follows
+           the SVr4 model, deleting only the standard <STRONG>WINDOW</STRONG> structures.
+
+
+</PRE><H3><a name="h3-Unset-TERM-Variable">Unset TERM Variable</a></H3><PRE>
+       If  the  TERM variable is missing or empty, <STRONG>initscr</STRONG> uses the value "un-
+       known", which normally corresponds to a terminal entry with the <EM>generic</EM>
+       (<EM>gn</EM>)  capability.   Generic  entries  are  detected  by  <STRONG>setupterm</STRONG> (see
+       <STRONG><A HREF="curs_terminfo.3x.html">curs_terminfo(3x)</A></STRONG>) and cannot be used for full-screen operation.  Other
+       implementations may handle a missing/empty TERM variable differently.
+
+
+</PRE><H3><a name="h3-Signal-Handlers">Signal Handlers</a></H3><PRE>
+       Quoting from X/Open Curses, section 3.1.1:
+
+            <EM>Curses</EM>  <EM>implementations</EM>  <EM>may</EM>  <EM>provide</EM>  <EM>for</EM> <EM>special</EM> <EM>handling</EM> <EM>of</EM> <EM>the</EM>
+            <STRONG>SIGINT</STRONG><EM>,</EM> <STRONG>SIGQUIT</STRONG>  <EM>and</EM>  <STRONG>SIGTSTP</STRONG>  <EM>signals</EM>  <EM>if</EM>  <EM>their</EM>  <EM>disposition</EM>  <EM>is</EM>
+            <STRONG>SIG_DFL</STRONG> <EM>at</EM> <EM>the</EM> <EM>time</EM> <STRONG>initscr</STRONG> <EM>is</EM> <EM>called</EM> ...
+
+            <EM>Any</EM>  <EM>special</EM>  <EM>handling</EM>  <EM>for</EM> <EM>these</EM> <EM>signals</EM> <EM>may</EM> <EM>remain</EM> <EM>in</EM> <EM>effect</EM> <EM>for</EM>
+            <EM>the</EM>  <EM>life</EM>  <EM>of</EM>  <EM>the</EM>  <EM>process</EM>  <EM>or</EM>  <EM>until</EM>  <EM>the</EM>  <EM>process</EM>  <EM>changes</EM>  <EM>the</EM>
+            <EM>disposition</EM> <EM>of</EM> <EM>the</EM> <EM>signal.</EM>
+
+            <EM>None</EM>  <EM>of</EM> <EM>the</EM> <EM>Curses</EM> <EM>functions</EM> <EM>are</EM> <EM>required</EM> <EM>to</EM> <EM>be</EM> <EM>safe</EM> <EM>with</EM> <EM>respect</EM>
+            <EM>to</EM> <EM>signals</EM> ...
+
+       This implementation establishes signal handlers during  initialization,
+       e.g., <STRONG>initscr</STRONG> or <STRONG>newterm</STRONG>.  Applications which must handle these signals
+       should set up the corresponding handlers  <EM>after</EM>  initializing  the  li-
+       brary:
+
+       <STRONG>SIGINT</STRONG>
+            The  handler  <EM>attempts</EM> to cleanup the screen on exit.  Although it
+            <EM>usually</EM> works as expected, there are limitations:
+
+            <STRONG>o</STRONG>   Walking the <STRONG>SCREEN</STRONG> list is unsafe, since all  list  management
+                is done without any signal blocking.
+
+            <STRONG>o</STRONG>   On systems which have <STRONG>REENTRANT</STRONG> turned on, <STRONG>set_term</STRONG> uses func-
+                tions which could deadlock or misbehave in other ways.
+
+            <STRONG>o</STRONG>   <STRONG>endwin</STRONG> calls other functions, many of which use stdio or other
+                library functions which are clearly unsafe.
+
+       <STRONG>SIGTERM</STRONG>
+            This  uses  the same handler as <STRONG>SIGINT</STRONG>, with the same limitations.
+            It is not mentioned in X/Open Curses, but  is  more  suitable  for
+            this purpose than <STRONG>SIGQUIT</STRONG> (which is used in debugging).
+
+       <STRONG>SIGTSTP</STRONG>
+            This  handles the <EM>stop</EM> signal, used in job control.  When resuming
+            the process,  this  implementation  discards  pending  input  with
+            <STRONG>flushinput</STRONG>  (see  <STRONG><A HREF="curs_util.3x.html">curs_util(3x)</A></STRONG>), and repaints the screen assuming
+            that it has been completely altered.  It also  updates  the  saved
+            terminal modes with <STRONG>def_shell_mode</STRONG> (see <STRONG><A HREF="curs_kernel.3x.html">curs_kernel(3x)</A></STRONG>).
+
+       <STRONG>SIGWINCH</STRONG>
+            This  handles  the  window-size  changes which were ignored in the
+            standardization efforts.  The handler sets a  (signal-safe)  vari-
+            able  which  is  later  tested in <STRONG>wgetch</STRONG> (see <STRONG><A HREF="curs_getch.3x.html">curs_getch(3x)</A></STRONG>).  If
+            <STRONG>keypad</STRONG> has been enabled for the corresponding window,  <STRONG>wgetch</STRONG>  re-
+            turns  the  key symbol <STRONG>KEY_RESIZE</STRONG>.  At the same time, <STRONG>wgetch</STRONG> calls
+            <STRONG>resizeterm</STRONG> to adjust the standard screen <STRONG>stdscr</STRONG>, and update  other
+            data such as <STRONG>LINES</STRONG> and <STRONG>COLS</STRONG>.
+
+
+</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_kernel.3x.html">curs_kernel(3x)</A></STRONG>, <STRONG><A HREF="curs_refresh.3x.html">curs_refresh(3x)</A></STRONG>, <STRONG><A HREF="curs_slk.3x.html">curs_slk(3x)</A></STRONG>, <STRONG>curs_ter-</STRONG>
+       <STRONG><A HREF="curs_terminfo.3x.html">minfo(3x)</A></STRONG>, <STRONG><A HREF="curs_util.3x.html">curs_util(3x)</A></STRONG>, <STRONG><A HREF="curs_variables.3x.html">curs_variables(3x)</A></STRONG>.
+
+
+
+                                                              <STRONG><A HREF="curs_initscr.3x.html">curs_initscr(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-initscr">initscr</a></li>
+<li><a href="#h3-newterm">newterm</a></li>
+<li><a href="#h3-endwin">endwin</a></li>
+<li><a href="#h3-isendwin">isendwin</a></li>
+<li><a href="#h3-set_term">set_term</a></li>
+<li><a href="#h3-delscreen">delscreen</a></li>
+</ul>
+</li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a>
+<ul>
+<li><a href="#h3-Differences">Differences</a></li>
+<li><a href="#h3-Unset-TERM-Variable">Unset TERM Variable</a></li>
+<li><a href="#h3-Signal-Handlers">Signal Handlers</a></li>
+</ul>
+</li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_inopts.3x.html b/doc/html/man/curs_inopts.3x.html
new file mode 100644
index 0000000..4bee87a
--- /dev/null
+++ b/doc/html/man/curs_inopts.3x.html
@@ -0,0 +1,335 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2016,2017 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_inopts.3x,v 1.36 2022/02/12 20:07:29 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_inopts 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_inopts 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_inopts.3x.html">curs_inopts(3x)</A></STRONG>                                                <STRONG><A HREF="curs_inopts.3x.html">curs_inopts(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>cbreak</STRONG>, <STRONG>nocbreak</STRONG>, <STRONG>echo</STRONG>, <STRONG>noecho</STRONG>, <STRONG>halfdelay</STRONG>, <STRONG>intrflush</STRONG>, <STRONG>keypad</STRONG>, <STRONG>meta</STRONG>, <STRONG>nl</STRONG>,
+       <STRONG>nonl</STRONG>, <STRONG>nodelay</STRONG>, <STRONG>notimeout</STRONG>, <STRONG>raw</STRONG>, <STRONG>noraw</STRONG>, <STRONG>qiflush</STRONG>, <STRONG>noqiflush</STRONG>, <STRONG>timeout</STRONG>,
+       <STRONG>wtimeout</STRONG>, <STRONG>typeahead</STRONG> - <STRONG>curses</STRONG> input options
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>cbreak(void);</STRONG>
+       <STRONG>int</STRONG> <STRONG>nocbreak(void);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>echo(void);</STRONG>
+       <STRONG>int</STRONG> <STRONG>noecho(void);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>intrflush(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>bool</STRONG> <EM>bf</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>keypad(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>bool</STRONG> <EM>bf</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>meta(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>bool</STRONG> <EM>bf</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>nodelay(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>bool</STRONG> <EM>bf</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>notimeout(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>bool</STRONG> <EM>bf</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>nl(void);</STRONG>
+       <STRONG>int</STRONG> <STRONG>nonl(void);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>raw(void);</STRONG>
+       <STRONG>int</STRONG> <STRONG>noraw(void);</STRONG>
+
+       <STRONG>void</STRONG> <STRONG>qiflush(void);</STRONG>
+       <STRONG>void</STRONG> <STRONG>noqiflush(void);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>halfdelay(int</STRONG> <EM>tenths</EM><STRONG>);</STRONG>
+       <STRONG>void</STRONG> <STRONG>timeout(int</STRONG> <EM>delay</EM><STRONG>);</STRONG>
+       <STRONG>void</STRONG> <STRONG>wtimeout(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>delay</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>typeahead(int</STRONG> <EM>fd</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The <STRONG>ncurses</STRONG> library provides several functions which let an application
+       change the way input from the terminal is handled.   Some  are  global,
+       applying to all windows.  Others apply only to a specific window.  Win-
+       dow-specific settings are not automatically applied to new  or  derived
+       windows.   An  application must apply these to each window, if the same
+       behavior is needed.
+
+
+</PRE><H3><a name="h3-cbreak_nocbreak">cbreak/nocbreak</a></H3><PRE>
+       Normally, the tty driver buffers typed characters until  a  newline  or
+       carriage  return  is typed.  The <STRONG>cbreak</STRONG> routine disables line buffering
+       and erase/kill character-processing (interrupt and flow control charac-
+       ters  are  unaffected), making characters typed by the user immediately
+       available to the program.  The <STRONG>nocbreak</STRONG> routine returns the terminal to
+       normal (cooked) mode.
+
+       Initially the terminal may or may not be in <STRONG>cbreak</STRONG> mode, as the mode is
+       inherited; therefore, a program should call <STRONG>cbreak</STRONG> or <STRONG>nocbreak</STRONG>  explic-
+       itly.   Most  interactive  programs  using  <STRONG>curses</STRONG> set the <STRONG>cbreak</STRONG> mode.
+       Note that <STRONG>cbreak</STRONG> overrides <STRONG>raw</STRONG>.  [See <STRONG><A HREF="curs_getch.3x.html">curs_getch(3x)</A></STRONG> for  a  discussion
+       of how these routines interact with <STRONG>echo</STRONG> and <STRONG>noecho</STRONG>.]
+
+
+</PRE><H3><a name="h3-echo_noecho">echo/noecho</a></H3><PRE>
+       The  <STRONG>echo</STRONG>  and  <STRONG>noecho</STRONG> routines control whether characters typed by the
+       user are echoed by <STRONG><A HREF="curs_getch.3x.html">getch(3x)</A></STRONG> as they are typed.   Echoing  by  the  tty
+       driver  is  always  disabled,  but  initially <STRONG>getch</STRONG> is in echo mode, so
+       characters typed are echoed.  Authors of most interactive programs pre-
+       fer  to do their own echoing in a controlled area of the screen, or not
+       to echo at all, so  they  disable  echoing  by  calling  <STRONG>noecho</STRONG>.   [See
+       <STRONG><A HREF="curs_getch.3x.html">curs_getch(3x)</A></STRONG>  for  a  discussion  of how these routines interact with
+       <STRONG>cbreak</STRONG> and <STRONG>nocbreak</STRONG>.]
+
+
+</PRE><H3><a name="h3-halfdelay">halfdelay</a></H3><PRE>
+       The <STRONG>halfdelay</STRONG> routine is used for half-delay mode, which is similar  to
+       <STRONG>cbreak</STRONG> mode in that characters typed by the user are immediately avail-
+       able to the program.  However, after blocking for <EM>tenths</EM> tenths of sec-
+       onds,  <STRONG>ERR</STRONG>  is returned if nothing has been typed.  The value of <EM>tenths</EM>
+       must be a number between 1 and 255.  Use <STRONG>nocbreak</STRONG> to  leave  half-delay
+       mode.
+
+
+</PRE><H3><a name="h3-intrflush">intrflush</a></H3><PRE>
+       If  the  <STRONG>intrflush</STRONG> option is enabled (<EM>bf</EM> is <STRONG>TRUE</STRONG>), and an interrupt key
+       is pressed on the keyboard (interrupt, break, quit), all output in  the
+       tty  driver queue will be flushed, giving the effect of faster response
+       to the interrupt, but causing <STRONG>curses</STRONG> to have the wrong idea of what  is
+       on  the screen.  Disabling the option (<EM>bf</EM> is <STRONG>FALSE</STRONG>) prevents the flush.
+       The default for the option is inherited from the tty  driver  settings.
+       The window argument is ignored.
+
+
+</PRE><H3><a name="h3-keypad">keypad</a></H3><PRE>
+       The  <STRONG>keypad</STRONG>  option  enables the keypad of the user's terminal.  If en-
+       abled (<EM>bf</EM> is <STRONG>TRUE</STRONG>), the user can press a function key (such as an arrow
+       key)  and  <STRONG><A HREF="curs_getch.3x.html">wgetch(3x)</A></STRONG>  returns a single value representing the function
+       key, as in <STRONG>KEY_LEFT</STRONG>.  If disabled (<EM>bf</EM> is <STRONG>FALSE</STRONG>), <STRONG>curses</STRONG> does not  treat
+       function keys specially and the program has to interpret the escape se-
+       quences itself.  If the keypad in the terminal can be turned  on  (made
+       to  transmit)  and  off  (made to work locally), turning on this option
+       causes the terminal keypad to be turned on when <STRONG><A HREF="curs_getch.3x.html">wgetch(3x)</A></STRONG>  is  called.
+       The default value for keypad is <STRONG>FALSE</STRONG>.
+
+
+</PRE><H3><a name="h3-meta">meta</a></H3><PRE>
+       Initially,  whether the terminal returns 7 or 8 significant bits on in-
+       put depends on the control mode of the tty driver [see <STRONG>termios(3)</STRONG>].  To
+       force  8  bits  to be returned, invoke <STRONG>meta</STRONG>(<EM>win</EM>, <STRONG>TRUE</STRONG>); this is equiva-
+       lent, under POSIX, to setting the CS8 flag on the terminal.  To force 7
+       bits to be returned, invoke <STRONG>meta</STRONG>(<EM>win</EM>, <STRONG>FALSE</STRONG>); this is equivalent, under
+       POSIX, to setting the CS7 flag on the terminal.  The  window  argument,
+       <EM>win</EM>, is always ignored.  If the terminfo capabilities <STRONG>smm</STRONG> (meta_on) and
+       <STRONG>rmm</STRONG> (meta_off) are defined for the terminal, <STRONG>smm</STRONG> is sent to the  termi-
+       nal  when  <STRONG>meta</STRONG>(<EM>win</EM>,  <STRONG>TRUE</STRONG>)  is  called  and <STRONG>rmm</STRONG> is sent when <STRONG>meta</STRONG>(<EM>win</EM>,
+       <STRONG>FALSE</STRONG>) is called.
+
+
+</PRE><H3><a name="h3-nl_nonl">nl/nonl</a></H3><PRE>
+       The <STRONG>nl</STRONG> and <STRONG>nonl</STRONG> routines control whether the underlying display  device
+       translates the return key into newline on input.
+
+
+</PRE><H3><a name="h3-nodelay">nodelay</a></H3><PRE>
+       The <STRONG>nodelay</STRONG> option causes <STRONG>getch</STRONG> to be a non-blocking call.  If no input
+       is ready, <STRONG>getch</STRONG> returns <STRONG>ERR</STRONG>.  If disabled (<EM>bf</EM> is  <STRONG>FALSE</STRONG>),  <STRONG>getch</STRONG>  waits
+       until a key is pressed.
+
+
+</PRE><H3><a name="h3-notimeout">notimeout</a></H3><PRE>
+       When  interpreting  an  escape  sequence, <STRONG><A HREF="curs_getch.3x.html">wgetch(3x)</A></STRONG> sets a timer while
+       waiting for the next character.  If  <STRONG>notimeout(</STRONG><EM>win</EM>,  <STRONG>TRUE</STRONG>)  is  called,
+       then  <STRONG>wgetch</STRONG>  does  not  set a timer.  The purpose of the timeout is to
+       differentiate between sequences received from a function key and  those
+       typed by a user.
+
+
+</PRE><H3><a name="h3-raw_noraw">raw/noraw</a></H3><PRE>
+       The  <STRONG>raw</STRONG> and <STRONG>noraw</STRONG> routines place the terminal into or out of raw mode.
+       Raw mode is similar to <STRONG>cbreak</STRONG> mode, in that characters typed are  imme-
+       diately  passed  through to the user program.  The differences are that
+       in raw mode, the interrupt, quit, suspend, and flow control  characters
+       are  all  passed through uninterpreted, instead of generating a signal.
+       The behavior of the BREAK key depends on other bits in the  tty  driver
+       that are not set by <STRONG>curses</STRONG>.
+
+
+</PRE><H3><a name="h3-qiflush_noqiflush">qiflush/noqiflush</a></H3><PRE>
+       When  the  <STRONG>noqiflush</STRONG>  routine is used, normal flush of input and output
+       queues associated with the <STRONG>INTR</STRONG>, <STRONG>QUIT</STRONG> and <STRONG>SUSP</STRONG> characters will  not  be
+       done  [see  <STRONG>termios(3)</STRONG>].   When  <STRONG>qiflush</STRONG>  is called, the queues will be
+       flushed when these control characters are read.  You may want  to  call
+       <STRONG>noqiflush</STRONG>  in a signal handler if you want output to continue as though
+       the interrupt had not occurred, after the handler exits.
+
+
+</PRE><H3><a name="h3-timeout_wtimeout">timeout/wtimeout</a></H3><PRE>
+       The <STRONG>timeout</STRONG> and <STRONG>wtimeout</STRONG> routines set blocking or non-blocking read for
+       a  given  window.   If  <EM>delay</EM> is negative, blocking read is used (i.e.,
+       waits indefinitely for input).  If <EM>delay</EM>  is  zero,  then  non-blocking
+       read is used (i.e., read returns <STRONG>ERR</STRONG> if no input is waiting).  If <EM>delay</EM>
+       is positive, then read blocks for <EM>delay</EM> milliseconds, and  returns  <STRONG>ERR</STRONG>
+       if  there  is  still  no input.  Hence, these routines provide the same
+       functionality as <STRONG>nodelay</STRONG>, plus the additional capability of being  able
+       to block for only <EM>delay</EM> milliseconds (where <EM>delay</EM> is positive).
+
+
+</PRE><H3><a name="h3-typeahead">typeahead</a></H3><PRE>
+       The <STRONG>curses</STRONG> library does "line-breakout optimization" by looking for ty-
+       peahead periodically while updating the screen.  If input is found, and
+       it  is  coming  from  a  tty, the current update is postponed until <STRONG>re-</STRONG>
+       <STRONG><A HREF="refresh.3x.html">fresh(3x)</A></STRONG> or <STRONG>doupdate</STRONG> is called again.  This allows faster response  to
+       commands  typed in advance.  Normally, the input FILE pointer passed to
+       <STRONG>newterm</STRONG>, or <STRONG>stdin</STRONG> in the case that <STRONG>initscr</STRONG> was used, will be used to do
+       this typeahead checking.  The <STRONG>typeahead</STRONG> routine specifies that the file
+       descriptor <EM>fd</EM> is to be used to check for typeahead instead.  If  <EM>fd</EM>  is
+       -1, then no typeahead checking is done.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       All  routines  that  return  an  integer return <STRONG>ERR</STRONG> upon failure and <STRONG>OK</STRONG>
+       (SVr4 specifies only "an integer value other than <STRONG>ERR</STRONG>") upon successful
+       completion,  unless  otherwise  noted in the preceding routine descrip-
+       tions.
+
+       X/Open does not define any error conditions.  In  this  implementation,
+       functions  with  a window parameter will return an error if it is null.
+       Any function will also return an error if the terminal was not initial-
+       ized.  Also,
+
+              <STRONG>halfdelay</STRONG>
+                   returns  an  error  if  its  parameter is outside the range
+                   1..255.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These functions are described in the XSI Curses standard, Issue 4.
+
+       The ncurses library obeys the XPG4 standard and the historical practice
+       of  the  AT&amp;T  curses  implementations, in that the echo bit is cleared
+       when curses initializes the terminal state.  BSD curses  differed  from
+       this  slightly;  it left the echo bit on at initialization, but the BSD
+       <STRONG>raw</STRONG> call turned it off as a side-effect.   For  best  portability,  set
+       <STRONG>echo</STRONG>  or <STRONG>noecho</STRONG> explicitly just after initialization, even if your pro-
+       gram remains in cooked mode.
+
+       The XSI Curses standard is ambiguous on the  question  of  whether  <STRONG>raw</STRONG>
+       should  disable  the  CRLF translations controlled by <STRONG>nl</STRONG> and <STRONG>nonl</STRONG>.  BSD
+       curses did turn off these translations; AT&amp;T curses (at least  as  late
+       as  SVr1)  did not.  We chose to do so, on the theory that a programmer
+       requesting raw input wants a clean  (ideally  8-bit  clean)  connection
+       that the operating system will not alter.
+
+       When <STRONG>keypad</STRONG> is first enabled, ncurses loads the key-definitions for the
+       current terminal description.  If the terminal description includes ex-
+       tended string capabilities, e.g., from using the <STRONG>-x</STRONG> option of <STRONG>tic</STRONG>, then
+       ncurses also defines keys for the capabilities whose names  begin  with
+       "k".  The corresponding keycodes are generated and (depending on previ-
+       ous loads of terminal descriptions) may differ from one execution of  a
+       program to the next.  The generated keycodes are recognized by the <STRONG>key-</STRONG>
+       <STRONG>name</STRONG> function (which will then return a name beginning with "k"  denot-
+       ing  the terminfo capability name rather than "K", used for curses key-
+       names).  On the other hand, an application can use <STRONG>define_key</STRONG> to estab-
+       lish a specific keycode for a given string.  This makes it possible for
+       an application to check for  an  extended  capability's  presence  with
+       <STRONG>tigetstr</STRONG>, and reassign the keycode to match its own needs.
+
+       Low-level applications can use <STRONG>tigetstr</STRONG> to obtain the definition of any
+       particular string capability.  Higher-level applications which use  the
+       curses  <STRONG>wgetch</STRONG>  and  similar functions to return keycodes rely upon the
+       order in which the strings are loaded.  If more than one key definition
+       has  the  same  string  value, then <STRONG>wgetch</STRONG> can return only one keycode.
+       Most curses implementations (including ncurses) load key definitions in
+       the  order  defined  by the array of string capability names.  The last
+       key to be loaded determines the keycode which  will  be  returned.   In
+       ncurses,  you  may  also  have extended capabilities interpreted as key
+       definitions.  These are loaded after the predefined keys, and if a  ca-
+       pability's value is the same as a previously-loaded key definition, the
+       later definition is the one used.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       Note that <STRONG>echo</STRONG>, <STRONG>noecho</STRONG>, <STRONG>halfdelay</STRONG>, <STRONG>intrflush</STRONG>, <STRONG>meta</STRONG>, <STRONG>nl</STRONG>, <STRONG>nonl</STRONG>,  <STRONG>nodelay</STRONG>,
+       <STRONG>notimeout</STRONG>, <STRONG>noqiflush</STRONG>, <STRONG>qiflush</STRONG>, <STRONG>timeout</STRONG>, and <STRONG>wtimeout</STRONG> may be macros.
+
+       The  <STRONG>noraw</STRONG>  and  <STRONG>nocbreak</STRONG> calls follow historical practice in that they
+       attempt to restore to normal ("cooked") mode from raw and cbreak  modes
+       respectively.   Mixing raw/noraw and cbreak/nocbreak calls leads to tty
+       driver control states that are hard to predict or understand; it is not
+       recommended.
+
+
+</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_getch.3x.html">curs_getch(3x)</A></STRONG>,   <STRONG><A HREF="curs_initscr.3x.html">curs_initscr(3x)</A></STRONG>,   <STRONG><A HREF="curs_util.3x.html">curs_util(3x)</A></STRONG>,  <STRONG>de-</STRONG>
+       <STRONG><A HREF="define_key.3x.html">fine_key(3x)</A></STRONG>, <STRONG>termios(3)</STRONG>
+
+
+
+                                                               <STRONG><A HREF="curs_inopts.3x.html">curs_inopts(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-cbreak_nocbreak">cbreak/nocbreak</a></li>
+<li><a href="#h3-echo_noecho">echo/noecho</a></li>
+<li><a href="#h3-halfdelay">halfdelay</a></li>
+<li><a href="#h3-intrflush">intrflush</a></li>
+<li><a href="#h3-keypad">keypad</a></li>
+<li><a href="#h3-meta">meta</a></li>
+<li><a href="#h3-nl_nonl">nl/nonl</a></li>
+<li><a href="#h3-nodelay">nodelay</a></li>
+<li><a href="#h3-notimeout">notimeout</a></li>
+<li><a href="#h3-raw_noraw">raw/noraw</a></li>
+<li><a href="#h3-qiflush_noqiflush">qiflush/noqiflush</a></li>
+<li><a href="#h3-timeout_wtimeout">timeout/wtimeout</a></li>
+<li><a href="#h3-typeahead">typeahead</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-NOTES">NOTES</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_ins_wch.3x.html b/doc/html/man/curs_ins_wch.3x.html
new file mode 100644
index 0000000..883121e
--- /dev/null
+++ b/doc/html/man/curs_ins_wch.3x.html
@@ -0,0 +1,102 @@
+<!--
+  ****************************************************************************
+  * Copyright 2019-2021,2022 Thomas E. Dickey                                *
+  * Copyright 2002-2010,2017 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_ins_wch.3x,v 1.13 2022/02/12 20:05:11 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_ins_wch 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_ins_wch 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_ins_wch.3x.html">curs_ins_wch(3x)</A></STRONG>                                              <STRONG><A HREF="curs_ins_wch.3x.html">curs_ins_wch(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>ins_wch</STRONG>,  <STRONG>mvins_wch</STRONG>,  <STRONG>mvwins_wch</STRONG>, <STRONG>wins_wch</STRONG> - insert a complex character
+       and rendition into a window
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       #include &lt;curses.h&gt;
+
+       <STRONG>int</STRONG> <STRONG>ins_wch(const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>wch</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wins_wch(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>wch</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>mvins_wch(int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>wch</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvwins_wch(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>wch</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       These routines, insert the complex character <EM>wch</EM> with rendition  before
+       the  character  under  the  cursor.  All characters to the right of the
+       cursor are moved one space to the right, with the  possibility  of  the
+       rightmost  character  on  the line being lost.  The insertion operation
+       does not change the cursor position.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       If successful, these functions return <STRONG>OK</STRONG>.  If not, they return <STRONG>ERR</STRONG>.
+
+       Functions with a "mv" prefix first  perform  a  cursor  movement  using
+       <STRONG>wmove</STRONG>, and return an error if the position is outside the window, or if
+       the window pointer is null.
+
+
+</PRE><H2><a name="h2-ERRORS">ERRORS</a></H2><PRE>
+       No errors are defined.
+
+
+</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_insch.3x.html">curs_insch(3x)</A></STRONG>.
+
+
+
+                                                              <STRONG><A HREF="curs_ins_wch.3x.html">curs_ins_wch(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-ERRORS">ERRORS</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_ins_wstr.3x.html b/doc/html/man/curs_ins_wstr.3x.html
new file mode 100644
index 0000000..fa42893
--- /dev/null
+++ b/doc/html/man/curs_ins_wstr.3x.html
@@ -0,0 +1,124 @@
+<!--
+  ****************************************************************************
+  * Copyright 2019-2021,2022 Thomas E. Dickey                                *
+  * Copyright 2002-2012,2017 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_ins_wstr.3x,v 1.14 2022/02/12 20:05:11 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_ins_wstr 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_ins_wstr 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_ins_wstr.3x.html">curs_ins_wstr(3x)</A></STRONG>                                            <STRONG><A HREF="curs_ins_wstr.3x.html">curs_ins_wstr(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>ins_wstr</STRONG>, <STRONG>ins_nwstr</STRONG>, <STRONG>wins_wstr</STRONG>, <STRONG>wins_nwstr</STRONG>, <STRONG>mvins_wstr</STRONG>, <STRONG>mvins_nwstr</STRONG>,
+       <STRONG>mvwins_wstr</STRONG>, <STRONG>mvwins_nwstr</STRONG> - insert a wide-character string into a
+       curses window
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>ins_wstr(const</STRONG> <STRONG>wchar_t</STRONG> <STRONG>*</STRONG><EM>wstr);</EM>
+       <STRONG>int</STRONG> <STRONG>ins_nwstr(const</STRONG> <STRONG>wchar_t</STRONG> <STRONG>*</STRONG><EM>wstr</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wins_wstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>wchar_t</STRONG> <STRONG>*</STRONG><EM>wstr</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wins_nwstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>wchar_t</STRONG> <STRONG>*</STRONG><EM>wstr</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>mvins_wstr(int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>wchar_t</STRONG> <STRONG>*</STRONG><EM>wstr</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvins_nwstr(int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>wchar_t</STRONG> <STRONG>*</STRONG><EM>wstr</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvwins_wstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>wchar_t</STRONG> <STRONG>*</STRONG><EM>wstr</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvwins_nwstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>wchar_t</STRONG> <STRONG>*</STRONG><EM>wstr</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       These routines insert a <STRONG>wchar_t</STRONG> character string (as many characters as
+       will fit on the line) before the character under the cursor.  All char-
+       acters to the right of the cursor are shifted right, with the possibil-
+       ity of the rightmost characters on the line being lost.  No wrapping is
+       performed.   The cursor position does not change (after moving to <EM>y</EM>, <EM>x</EM>,
+       if specified).  The four routines with <EM>n</EM> as the last argument insert  a
+       leading  substring  of at most <EM>n</EM> <STRONG>wchar_t</STRONG> characters.  If <EM>n</EM> is less than
+       1, the entire string is inserted.
+
+       If a character in <EM>wstr</EM> is a tab, newline, carriage return or backspace,
+       the  cursor  is  moved appropriately within the window.  A newline also
+       does a <STRONG>clrtoeol</STRONG> before moving.  Tabs are  considered  to  be  at  every
+       eighth column.  If a character in <EM>wstr</EM> is another control character, it
+       is drawn in the <STRONG>^</STRONG><EM>X</EM> notation.  Calling <STRONG>win_wch</STRONG> after  adding  a  control
+       character  (and moving to it, if necessary) does not return the control
+       character, but instead returns a character in the  ^-representation  of
+       the control character.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       Note that all but wins_nwstr may be macros.
+
+       If  the  first character in the string is a nonspacing character, these
+       functions will fail.  XSI does not define what will happen  if  a  non-
+       spacing character follows a control character.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       Upon successful completion, these functions return <STRONG>OK</STRONG>.  Otherwise, they
+       return <STRONG>ERR</STRONG>.
+
+       Functions with a "mv" prefix first  perform  a  cursor  movement  using
+       <STRONG>wmove</STRONG>, and return an error if the position is outside the window, or if
+       the window pointer is null.
+
+
+</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_insstr.3x.html">curs_insstr(3x)</A></STRONG>, <STRONG><A HREF="curs_in_wch.3x.html">curs_in_wch(3x)</A></STRONG>, <STRONG><A HREF="curs_ins_wch.3x.html">curs_ins_wch(3x)</A></STRONG>.
+
+
+
+                                                             <STRONG><A HREF="curs_ins_wstr.3x.html">curs_ins_wstr(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></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_insch.3x.html b/doc/html/man/curs_insch.3x.html
new file mode 100644
index 0000000..12edc6c
--- /dev/null
+++ b/doc/html/man/curs_insch.3x.html
@@ -0,0 +1,116 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2017 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_insch.3x,v 1.22 2022/02/12 20:05:11 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_insch 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_insch 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_insch.3x.html">curs_insch(3x)</A></STRONG>                                                  <STRONG><A HREF="curs_insch.3x.html">curs_insch(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>insch</STRONG>,  <STRONG>winsch</STRONG>, <STRONG>mvinsch</STRONG>, <STRONG>mvwinsch</STRONG> - insert a character before cursor in
+       a <STRONG>curses</STRONG> window
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>insch(chtype</STRONG> <EM>ch</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>winsch(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>chtype</STRONG> <EM>ch</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>mvinsch(int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>chtype</STRONG> <EM>ch</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvwinsch(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>chtype</STRONG> <EM>ch</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       These routines insert the character <EM>ch</EM> before the character  under  the
+       cursor.   All characters to the right of the cursor are moved one space
+       to the right, with the possibility of the rightmost  character  on  the
+       line  being  lost.   The insertion operation does not change the cursor
+       position.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       All routines that return an integer return  <STRONG>ERR</STRONG>  upon  failure  and  <STRONG>OK</STRONG>
+       (SVr4 specifies only "an integer value other than <STRONG>ERR</STRONG>") upon successful
+       completion,  unless  otherwise   noted   in   the   preceding   routine
+       descriptions.
+
+       Functions  with  a  "mv"  prefix  first perform a cursor movement using
+       <STRONG>wmove</STRONG>, and return an error if the position is outside the window, or if
+       the window pointer is null.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       These  routines  do  not  necessarily  imply  use  of a hardware insert
+       character feature.
+
+       Note that <STRONG>insch</STRONG>, <STRONG>mvinsch</STRONG>, and <STRONG>mvwinsch</STRONG> may be macros.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These functions are described in the XSI Curses standard, Issue 4.
+
+
+</PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
+       <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG>.
+
+       Comparable functions  in  the  wide-character  (ncursesw)  library  are
+       described in <STRONG><A HREF="curs_ins_wch.3x.html">curs_ins_wch(3x)</A></STRONG>.
+
+
+
+                                                                <STRONG><A HREF="curs_insch.3x.html">curs_insch(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_insstr.3x.html b/doc/html/man/curs_insstr.3x.html
new file mode 100644
index 0000000..2692a54
--- /dev/null
+++ b/doc/html/man/curs_insstr.3x.html
@@ -0,0 +1,127 @@
+<!--
+  ****************************************************************************
+  * Copyright 2019-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2017 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_insstr.3x,v 1.29 2022/02/12 20:05:11 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_insstr 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_insstr 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_insstr.3x.html">curs_insstr(3x)</A></STRONG>                                                <STRONG><A HREF="curs_insstr.3x.html">curs_insstr(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>insstr</STRONG>,  <STRONG>insnstr</STRONG>,  <STRONG>winsstr</STRONG>,  <STRONG>winsnstr</STRONG>,  <STRONG>mvinsstr</STRONG>, <STRONG>mvinsnstr</STRONG>, <STRONG>mvwinsstr</STRONG>,
+       <STRONG>mvwinsnstr</STRONG> - insert string before cursor in a <STRONG>curses</STRONG> window
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+       <STRONG>int</STRONG> <STRONG>insstr(const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>insnstr(const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>winsstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>winsnstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>mvinsstr(int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvinsnstr(int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvwinsstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvwinsnstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       These routines insert a character string (as many  characters  as  will
+       fit on the line) before the character under the cursor.  All characters
+       to the right of the cursor are shifted right with  the  possibility  of
+       the  rightmost  characters on the line being lost.  The cursor position
+       does not change (after moving to <EM>y</EM>, <EM>x</EM>, if  specified).   The  functions
+       with  <EM>n</EM>  as  the  last argument insert a leading substring of at most <EM>n</EM>
+       characters.  If <EM>n</EM>&lt;=0, then the entire string is inserted.
+
+       Special characters are handled as in <STRONG>addch</STRONG>.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       All routines that return an integer return  <STRONG>ERR</STRONG>  upon  failure  and  <STRONG>OK</STRONG>
+       (SVr4 specifies only "an integer value other than <STRONG>ERR</STRONG>") upon successful
+       completion,  unless  otherwise   noted   in   the   preceding   routine
+       descriptions.
+
+       X/Open  defines  no  error  conditions.  In this implementation, if the
+       window parameter is null or the str parameter  is  null,  an  error  is
+       returned.
+
+       Functions  with  a  "mv"  prefix  first perform a cursor movement using
+       <STRONG>wmove</STRONG>, and return an error if the position is outside the window, or if
+       the window pointer is null.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       Note that all but <STRONG>winsnstr</STRONG> may be macros.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These  functions  are  described  in  the XSI Curses standard, Issue 4,
+       which adds const qualifiers to the arguments.
+
+       The Single Unix  Specification,  Version  2  states  that  <STRONG>insnstr</STRONG>  and
+       <STRONG>winsnstr</STRONG>  perform  wrapping.  This is probably an error, since it makes
+       this group of  functions  inconsistent.   Also,  no  implementation  of
+       curses documents this inconsistency.
+
+
+</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_util.3x.html">curs_util(3x)</A></STRONG>, <STRONG><A HREF="curs_clear.3x.html">curs_clear(3x)</A></STRONG>, <STRONG><A HREF="curs_inch.3x.html">curs_inch(3x)</A></STRONG>.
+
+
+
+                                                               <STRONG><A HREF="curs_insstr.3x.html">curs_insstr(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_instr.3x.html b/doc/html/man/curs_instr.3x.html
new file mode 100644
index 0000000..28be2ba
--- /dev/null
+++ b/doc/html/man/curs_instr.3x.html
@@ -0,0 +1,123 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2017 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_instr.3x,v 1.25 2022/02/12 20:05:11 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_instr 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_instr 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_instr.3x.html">curs_instr(3x)</A></STRONG>                                                  <STRONG><A HREF="curs_instr.3x.html">curs_instr(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>instr</STRONG>,  <STRONG>innstr</STRONG>, <STRONG>winstr</STRONG>, <STRONG>winnstr</STRONG>, <STRONG>mvinstr</STRONG>, <STRONG>mvinnstr</STRONG>, <STRONG>mvwinstr</STRONG>, <STRONG>mvwinnstr</STRONG>
+       - get a string of characters from a <STRONG>curses</STRONG> window
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>instr(char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>innstr(char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>winstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>winnstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>mvinstr(int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvinnstr(int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvwinstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvwinnstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       These routines return a string of characters in <EM>str</EM>, extracted starting
+       at  the  current  cursor  position in the named window.  Attributes are
+       stripped from the characters.  The four functions with <EM>n</EM>  as  the  last
+       argument   return  a  leading  substring  at  most  <EM>n</EM>  characters  long
+       (exclusive of the trailing NUL).
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       All of the  functions  return  <STRONG>ERR</STRONG>  upon  failure,  or  the  number  of
+       characters actually read into the string.
+
+       X/Open Curses defines no error conditions.  In this implementation:
+
+       <STRONG>o</STRONG>   If the <EM>win</EM> parameter is null, an error is returned,
+
+       <STRONG>o</STRONG>   If the <EM>chstr</EM> parameter is null, an error is returned,
+
+       Functions  with  a  "mv"  prefix  first perform a cursor movement using
+       <STRONG>wmove</STRONG>, and return an error if the position is outside the window, or if
+       the window pointer is null.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       Note that all routines except <STRONG>winnstr</STRONG> may be macros.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       SVr4  does not document whether a length limit includes or excludes the
+       trailing NUL.
+
+       The ncurses library extends the XSI description by allowing a  negative
+       value  for  <EM>n</EM>.  In this case, the functions return the string ending at
+       the right margin.
+
+
+</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_instr.3x.html">curs_instr(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_inwstr.3x.html b/doc/html/man/curs_inwstr.3x.html
new file mode 100644
index 0000000..0d8c3c1
--- /dev/null
+++ b/doc/html/man/curs_inwstr.3x.html
@@ -0,0 +1,118 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 2002-2012,2017 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_inwstr.3x,v 1.17 2022/02/12 20:05:11 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_inwstr 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_inwstr 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_inwstr.3x.html">curs_inwstr(3x)</A></STRONG>                                                <STRONG><A HREF="curs_inwstr.3x.html">curs_inwstr(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>inwstr</STRONG>,  <STRONG>innwstr</STRONG>,  <STRONG>winwstr</STRONG>,  <STRONG>winnwstr</STRONG>,  <STRONG>mvinwstr</STRONG>, <STRONG>mvinnwstr</STRONG>, <STRONG>mvwinwstr</STRONG>,
+       <STRONG>mvwinnwstr</STRONG> - get a string of <STRONG>wchar_t</STRONG> characters from a curses window
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>inwstr(wchar_t</STRONG> <STRONG>*</STRONG><EM>wstr</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>innwstr(wchar_t</STRONG> <STRONG>*</STRONG><EM>wstr</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>winwstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>wchar_t</STRONG> <STRONG>*</STRONG><EM>wstr</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>winnwstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>wchar_t</STRONG> <STRONG>*</STRONG><EM>wstr</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>mvinwstr(int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>wchar_t</STRONG> <STRONG>*</STRONG><EM>wstr</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvinnwstr(int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>wchar_t</STRONG> <STRONG>*</STRONG><EM>wstr</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvwinwstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>wchar_t</STRONG> <STRONG>*</STRONG><EM>wstr</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvwinnwstr(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>wchar_t</STRONG> <STRONG>*</STRONG><EM>wstr</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       These routines return a string of  <STRONG>wchar_t</STRONG>  wide  characters  in  <EM>wstr</EM>,
+       extracted starting at the current cursor position in the named window.
+
+       The  four  functions  with  <EM>n</EM>  as  the  last  argument return a leading
+       substring at most <EM>n</EM> characters long (exclusive of  the  trailing  NUL).
+       Transfer  stops  at  the  end of the current line, or when <EM>n</EM> characters
+       have been stored at the location referenced by <EM>wstr</EM>.
+
+       If the size  <EM>n</EM>  is  not  large  enough  to  store  a  complete  complex
+       character, an error is generated.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       All routines except <STRONG>winnwstr</STRONG> may be macros.
+
+       Each  cell  in  the  window  holds a complex character (i.e., base- and
+       combining-characters)  together  with  attributes  and  color.    These
+       functions  store  only  the  wide  characters,  ignoring attributes and
+       color.  Use <STRONG>in_wchstr</STRONG> to return the complex characters from a window.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       All routines return <STRONG>ERR</STRONG> upon failure.  Upon successful completion,  the
+       *<STRONG>inwstr</STRONG> routines return <STRONG>OK</STRONG>, and the *<STRONG>innwstr</STRONG> routines return the number
+       of characters read into the string.
+
+       Functions with a "mv" prefix first  perform  a  cursor  movement  using
+       <STRONG>wmove</STRONG>, and return an error if the position is outside the window, or if
+       the window pointer is null.
+
+
+</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_instr.3x.html">curs_instr(3x)</A></STRONG>, <STRONG><A HREF="curs_in_wchstr.3x.html">curs_in_wchstr(3x)</A></STRONG>
+
+
+
+                                                               <STRONG><A HREF="curs_inwstr.3x.html">curs_inwstr(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></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_kernel.3x.html b/doc/html/man/curs_kernel.3x.html
new file mode 100644
index 0000000..da6792c
--- /dev/null
+++ b/doc/html/man/curs_kernel.3x.html
@@ -0,0 +1,232 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2016,2017 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_kernel.3x,v 1.32 2022/02/12 20:05:11 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_kernel 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_kernel 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_kernel.3x.html">curs_kernel(3x)</A></STRONG>                                                <STRONG><A HREF="curs_kernel.3x.html">curs_kernel(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>def_prog_mode</STRONG>, <STRONG>def_shell_mode</STRONG>, <STRONG>reset_prog_mode</STRONG>, <STRONG>reset_shell_mode</STRONG>,
+       <STRONG>resetty</STRONG>, <STRONG>savetty</STRONG>, <STRONG>getsyx</STRONG>, <STRONG>setsyx</STRONG>, <STRONG>ripoffline</STRONG>, <STRONG>curs_set</STRONG>, <STRONG>napms</STRONG> - low-
+       level <STRONG>curses</STRONG> routines
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>def_prog_mode(void);</STRONG>
+       <STRONG>int</STRONG> <STRONG>def_shell_mode(void);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>reset_prog_mode(void);</STRONG>
+       <STRONG>int</STRONG> <STRONG>reset_shell_mode(void);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>resetty(void);</STRONG>
+       <STRONG>int</STRONG> <STRONG>savetty(void);</STRONG>
+
+       <STRONG>void</STRONG> <STRONG>getsyx(int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>);</STRONG>
+       <STRONG>void</STRONG> <STRONG>setsyx(int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>ripoffline(int</STRONG> <EM>line</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <STRONG>(*</STRONG><EM>init</EM><STRONG>)(WINDOW</STRONG> <STRONG>*,</STRONG> <STRONG>int));</STRONG>
+       <STRONG>int</STRONG> <STRONG>curs_set(int</STRONG> <EM>visibility</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>napms(int</STRONG> <EM>ms</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The following routines give low-level access to various <STRONG>curses</STRONG> capabil-
+       ities.  These routines typically are used inside library routines.
+
+
+</PRE><H3><a name="h3-def_prog_mode_-def_shell_mode">def_prog_mode, def_shell_mode</a></H3><PRE>
+       The <STRONG>def_prog_mode</STRONG> and <STRONG>def_shell_mode</STRONG> routines save the current terminal
+       modes as the "program" (in <STRONG>curses</STRONG>) or "shell" (not in <STRONG>curses</STRONG>) state for
+       use by the <STRONG>reset_prog_mode</STRONG> and <STRONG>reset_shell_mode</STRONG> routines.  This is done
+       automatically  by <STRONG>initscr</STRONG>.  There is one such save area for each screen
+       context allocated by <STRONG>newterm</STRONG>.
+
+
+</PRE><H3><a name="h3-reset_prog_mode_-reset_shell_mode">reset_prog_mode, reset_shell_mode</a></H3><PRE>
+       The <STRONG>reset_prog_mode</STRONG> and <STRONG>reset_shell_mode</STRONG> routines restore the  terminal
+       to  "program"  (in <STRONG>curses</STRONG>) or "shell" (out of <STRONG>curses</STRONG>) state.  These are
+       done automatically by <STRONG><A HREF="curs_initscr.3x.html">endwin(3x)</A></STRONG> and, after an <STRONG>endwin</STRONG>, by <STRONG>doupdate</STRONG>,  so
+       they normally are not called.
+
+
+</PRE><H3><a name="h3-resetty_-savetty">resetty, savetty</a></H3><PRE>
+       The <STRONG>resetty</STRONG> and <STRONG>savetty</STRONG> routines save and restore the state of the ter-
+       minal modes.  <STRONG>savetty</STRONG> saves the current state in a buffer  and  <STRONG>resetty</STRONG>
+       restores the state to what it was at the last call to <STRONG>savetty</STRONG>.
+
+
+</PRE><H3><a name="h3-getsyx">getsyx</a></H3><PRE>
+       The  <STRONG>getsyx</STRONG>  routine  returns  the  current  coordinates of the <EM>virtual</EM>
+       <EM>screen</EM> cursor in <EM>y</EM> and <EM>x</EM>.  If <STRONG>leaveok</STRONG> is currently <STRONG>TRUE</STRONG>, then <STRONG>-1</STRONG>,<STRONG>-1</STRONG>  is
+       returned.  If lines have been removed from the top of the screen, using
+       <STRONG>ripoffline</STRONG>, <EM>y</EM> and <EM>x</EM> include these lines; therefore, <EM>y</EM> and <EM>x</EM>  should  be
+       used only as arguments for <STRONG>setsyx</STRONG>.
+
+       Few applications will use this feature, most use <STRONG>getyx</STRONG> instead.
+
+
+</PRE><H3><a name="h3-setsyx">setsyx</a></H3><PRE>
+       The  <STRONG>setsyx</STRONG> routine sets the <EM>virtual</EM> <EM>screen</EM> cursor to <EM>y</EM>, <EM>x</EM>.  If <EM>y</EM> and <EM>x</EM>
+       are both <STRONG>-1</STRONG>, then <STRONG>leaveok</STRONG> is set.  The two routines <STRONG>getsyx</STRONG>  and  <STRONG>setsyx</STRONG>
+       are  designed to be used by a library routine, which manipulates <STRONG>curses</STRONG>
+       windows but does not want to change the current position  of  the  pro-
+       gram's cursor.  The library routine would call <STRONG>getsyx</STRONG> at the beginning,
+       do its manipulation of its own windows, do a <STRONG>wnoutrefresh</STRONG> on  its  win-
+       dows, call <STRONG>setsyx</STRONG>, and then call <STRONG>doupdate</STRONG>.
+
+       Few applications will use this feature, most use <STRONG>wmove</STRONG> instead.
+
+
+</PRE><H3><a name="h3-ripoffline">ripoffline</a></H3><PRE>
+       The  <STRONG>ripoffline</STRONG>  routine  provides  access  to  the  same facility that
+       <STRONG>slk_init</STRONG> [see <STRONG><A HREF="curs_slk.3x.html">curs_slk(3x)</A></STRONG>] uses to reduce  the  size  of  the  screen.
+       <STRONG>ripoffline</STRONG>  must be called before <STRONG>initscr</STRONG> or <STRONG>newterm</STRONG> is called, to pre-
+       pare these initial actions:
+
+       <STRONG>o</STRONG>   If <EM>line</EM> is positive, a line is removed from the top of <STRONG>stdscr</STRONG>.
+
+       <STRONG>o</STRONG>   if <EM>line</EM> is negative, a line is removed from the bottom.
+
+       When the resulting initialization is done inside <STRONG>initscr</STRONG>,  the  routine
+       <STRONG>init</STRONG> (supplied by the user) is called with two arguments:
+
+       <STRONG>o</STRONG>   a window pointer to the one-line window that has been allocated and
+
+       <STRONG>o</STRONG>   an integer with the number of columns in the window.
+
+       Inside  this  initialization  routine,  the integer variables <STRONG>LINES</STRONG> and
+       <STRONG>COLS</STRONG> (defined in <STRONG>&lt;curses.h&gt;</STRONG>) are not guaranteed to be accurate and <STRONG>wre-</STRONG>
+       <STRONG>fresh</STRONG> or <STRONG>doupdate</STRONG> must not be called.  It is allowable to call <STRONG>wnoutre-</STRONG>
+       <STRONG>fresh</STRONG> during the initialization routine.
+
+       <STRONG>ripoffline</STRONG> can be called up to five times  before  calling  <STRONG>initscr</STRONG>  or
+       <STRONG>newterm</STRONG>.
+
+
+</PRE><H3><a name="h3-curs_set">curs_set</a></H3><PRE>
+       The  <STRONG>curs_set</STRONG>  routine  sets  the cursor state to invisible, normal, or
+       very visible for <STRONG>visibility</STRONG> equal to <STRONG>0</STRONG>, <STRONG>1</STRONG>, or <STRONG>2</STRONG> respectively.   If  the
+       terminal  supports  the <EM>visibility</EM> requested, the previous <EM>cursor</EM> state
+       is returned; otherwise, <STRONG>ERR</STRONG> is returned.
+
+
+</PRE><H3><a name="h3-napms">napms</a></H3><PRE>
+       The <STRONG>napms</STRONG> routine is used to sleep for <EM>ms</EM> milliseconds.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       Except for <STRONG>curs_set</STRONG>, these routines always return <STRONG>OK</STRONG>.
+
+       <STRONG>curs_set</STRONG> returns the previous cursor state, or  <STRONG>ERR</STRONG>  if  the  requested
+       <EM>visibility</EM> is not supported.
+
+       X/Open defines no error conditions.  In this implementation
+
+       <STRONG>def_prog_mode</STRONG>, <STRONG>def_shell_mode</STRONG>, <STRONG>reset_prog_mode</STRONG>, <STRONG>reset_shell_mode</STRONG>
+            return an error if the terminal was not initialized, or if the I/O
+            call to obtain the terminal settings fails.
+
+       <STRONG>ripoffline</STRONG>
+            returns an error if the maximum number of ripped-off lines exceeds
+            the maximum (NRIPS = 5).
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       Note that <STRONG>getsyx</STRONG> is a macro, so <STRONG>&amp;</STRONG> is not necessary before the variables
+       <EM>y</EM> and <EM>x</EM>.
+
+       Older SVr4 man pages warn that the return value of  <STRONG>curs_set</STRONG>  "is  cur-
+       rently  incorrect".   This  implementation gets it right, but it may be
+       unwise to count on the correctness of the return value anywhere else.
+
+       Both ncurses and SVr4 will call <STRONG>curs_set</STRONG> in <STRONG>endwin</STRONG> if <STRONG>curs_set</STRONG> has been
+       called  to make the cursor other than normal, i.e., either invisible or
+       very visible.  There is no way for ncurses  to  determine  the  initial
+       cursor state to restore that.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       The <EM>virtual</EM> <EM>screen</EM> functions <STRONG>setsyx</STRONG> and <STRONG>getsyx</STRONG> are not described in the
+       XSI Curses standard, Issue 4.  All other functions are as described  in
+       XSI Curses.
+
+       The  SVr4  documentation  describes  <STRONG>setsyx</STRONG> and <STRONG>getsyx</STRONG> as having return
+       type int.  This is misleading, as they are macros  with  no  documented
+       semantics for the return value.
+
+
+</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_outopts.3x.html">curs_outopts(3x)</A></STRONG>,   <STRONG><A HREF="curs_refresh.3x.html">curs_refresh(3x)</A></STRONG>,
+       <STRONG><A HREF="curs_scr_dump.3x.html">curs_scr_dump(3x)</A></STRONG>, <STRONG><A HREF="curs_slk.3x.html">curs_slk(3x)</A></STRONG>, <STRONG><A HREF="curs_variables.3x.html">curs_variables(3x)</A></STRONG>.
+
+
+
+                                                               <STRONG><A HREF="curs_kernel.3x.html">curs_kernel(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-def_prog_mode_-def_shell_mode">def_prog_mode, def_shell_mode</a></li>
+<li><a href="#h3-reset_prog_mode_-reset_shell_mode">reset_prog_mode, reset_shell_mode</a></li>
+<li><a href="#h3-resetty_-savetty">resetty, savetty</a></li>
+<li><a href="#h3-getsyx">getsyx</a></li>
+<li><a href="#h3-setsyx">setsyx</a></li>
+<li><a href="#h3-ripoffline">ripoffline</a></li>
+<li><a href="#h3-curs_set">curs_set</a></li>
+<li><a href="#h3-napms">napms</a></li>
+</ul>
+</li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_legacy.3x.html b/doc/html/man/curs_legacy.3x.html
new file mode 100644
index 0000000..5947cde
--- /dev/null
+++ b/doc/html/man/curs_legacy.3x.html
@@ -0,0 +1,140 @@
+<!--
+  ****************************************************************************
+  * Copyright 2019-2020,2022 Thomas E. Dickey                                *
+  * Copyright 2007-2015,2017 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_legacy.3x,v 1.13 2022/02/12 20:05:11 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_legacy 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_legacy 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_legacy.3x.html">curs_legacy(3x)</A></STRONG>                                                <STRONG><A HREF="curs_legacy.3x.html">curs_legacy(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       curs_legacy - get <STRONG>curses</STRONG> cursor and window coordinates, attributes
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>getattrs(const</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>getbegx(const</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>getbegy(const</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>getcurx(const</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>getcury(const</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>getmaxx(const</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>getmaxy(const</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>getparx(const</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>getpary(const</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       These  legacy  functions  are  simpler  to  use  than the X/Open Curses
+       functions:
+
+       <STRONG>o</STRONG>   The <STRONG>getattrs</STRONG> function returns the same attribute data as <STRONG>wattr_get</STRONG>.
+
+           However, <STRONG>getattrs</STRONG> returns an integer  (actually  a  <STRONG>chtype</STRONG>),  while
+           <STRONG>wattr_get</STRONG>  returns  the current color pair in a separate parameter.
+           In the wide-character library configuration, color  pairs  may  not
+           fit into a <STRONG>chtype</STRONG>, so <STRONG>wattr_get</STRONG> is the only way to obtain the color
+           information.
+
+           Because <STRONG>getattrs</STRONG> returns the attributes in a single  parameter,  it
+           would  not  be possible for an application to distinguish that from
+           <STRONG>ERR</STRONG> (a <EM>-1</EM>).  If the window  parameter  is  null,  <STRONG>getattrs</STRONG>  returns
+           <STRONG>A_NORMAL</STRONG> (zero).
+
+       <STRONG>o</STRONG>   The <STRONG>getbegy</STRONG> and <STRONG>getbegx</STRONG> functions return the same data as <STRONG>getbegyx</STRONG>.
+
+       <STRONG>o</STRONG>   The <STRONG>getcury</STRONG> and <STRONG>getcurx</STRONG> functions return the same data as <STRONG>getyx</STRONG>.
+
+       <STRONG>o</STRONG>   The <STRONG>getmaxy</STRONG> and <STRONG>getmaxx</STRONG> functions return the same data as <STRONG>getmaxyx</STRONG>.
+
+       <STRONG>o</STRONG>   The <STRONG>getpary</STRONG> and <STRONG>getparx</STRONG> functions return the same data as <STRONG>getparyx</STRONG>.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       Except  as  noted,  these  functions  return  an integer, or <STRONG>ERR</STRONG> if the
+       window parameter is null.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       All of these interfaces are provided  as  macros  and  functions.   The
+       macros   are   suppressed   (and  only  the  functions  provided)  when
+       <STRONG>NCURSES_OPAQUE</STRONG> is defined.  The standard forms such as  <STRONG>getyx</STRONG>  must  be
+       implemented  as  macros,  and  (in  this implementation) are defined in
+       terms of the functions described here, to avoid  reliance  on  internal
+       details of the WINDOW structure.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These   functions  were  supported  on  Version  7,  BSD  or  System  V
+       implementations.  None of  those  implementations  checked  the  window
+       parameter.
+
+       The  <STRONG>getattrs</STRONG>  function  and  macro  are  defined  to return a (signed)
+       integer  for  compatibility  with  those  implementations  although  an
+       unsigned type would have been more appropriate.
+
+
+</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_getyx.3x.html">curs_getyx(3x)</A></STRONG>, <STRONG><A HREF="curs_opaque.3x.html">curs_opaque(3x)</A></STRONG>
+
+
+
+                                                               <STRONG><A HREF="curs_legacy.3x.html">curs_legacy(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_memleaks.3x.html b/doc/html/man/curs_memleaks.3x.html
new file mode 100644
index 0000000..7ac7342
--- /dev/null
+++ b/doc/html/man/curs_memleaks.3x.html
@@ -0,0 +1,148 @@
+<!--
+  ****************************************************************************
+  * Copyright 2019-2021,2022 Thomas E. Dickey                                *
+  * Copyright 2008-2010,2017 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_memleaks.3x,v 1.15 2022/06/04 23:33:48 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_memleaks 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_memleaks 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_memleaks.3x.html">curs_memleaks(3x)</A></STRONG>                                            <STRONG><A HREF="curs_memleaks.3x.html">curs_memleaks(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>exit_curses</STRONG>, <STRONG>exit_terminfo</STRONG> - <STRONG>curses</STRONG> memory-leak checking
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+       <STRONG>void</STRONG> <STRONG>exit_curses(int</STRONG> <EM>code</EM><STRONG>);</STRONG>
+
+       <STRONG>#include</STRONG> <STRONG>&lt;term.h&gt;</STRONG>
+       <STRONG>void</STRONG> <STRONG>exit_terminfo(int</STRONG> <EM>code</EM><STRONG>);</STRONG>
+
+       /* deprecated (intentionally not declared in curses.h or term.h) */
+       <STRONG>void</STRONG> <STRONG>_nc_freeall(void);</STRONG>
+       <STRONG>void</STRONG> <STRONG>_nc_free_and_exit(int</STRONG> <EM>code</EM><STRONG>);</STRONG>
+       <STRONG>void</STRONG> <STRONG>_nc_free_tinfo(int</STRONG> <EM>code</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       These  functions  are  used to simplify analysis of memory leaks in the
+       ncurses library.
+
+       Any implementation of curses must not free the memory associated with a
+       screen, since (even after calling <STRONG><A HREF="curs_initscr.3x.html">endwin(3x)</A></STRONG>), it must be available for
+       use in the next call to <STRONG><A HREF="curs_refresh.3x.html">refresh(3x)</A></STRONG>.  There are also chunks  of  memory
+       held for performance reasons.  That makes it hard to analyze curses ap-
+       plications for memory leaks.  When using the specially  configured  de-
+       bugging version of the ncurses library, applications can call functions
+       which free those chunks of memory, simplifying the process  of  memory-
+       leak checking.
+
+       Some  of  the functions are named with a "_nc_" prefix because they are
+       not intended for use in the non-debugging library:
+
+       <STRONG>_nc_freeall</STRONG>
+            This frees (almost) all of the memory allocated by ncurses.
+
+       <STRONG>_nc_free_and_exit</STRONG>
+            This frees the memory allocated by ncurses (like <STRONG>_nc_freeall</STRONG>), and
+            exits the program.  It is preferred over <STRONG>_nc_freeall</STRONG> since some of
+            that memory may be required to keep the application running.  Sim-
+            ply exiting (with the given exit-code) is safer.
+
+       <STRONG>_nc_free_tinfo</STRONG>
+            Use  this  function  if only the low-level terminfo functions (and
+            corresponding library) are used.  Like <STRONG>_nc_free_and_exit</STRONG>, it exits
+            the program after freeing memory.
+
+       The  functions  prefixed "_nc" are normally not available; they must be
+       configured into the library at build time using the <STRONG>--disable-leaks</STRONG> op-
+       tion.   That compiles-in code that frees memory that normally would not
+       be freed.
+
+       The <STRONG>exit_curses</STRONG> and <STRONG>exit_terminfo</STRONG> functions call <STRONG>_nc_free_and_exit</STRONG>  and
+       <STRONG>_nc_free_tinfo</STRONG>  if  the  library  is  configured to support memory-leak
+       checking.  If the library is  not  configured  to  support  memory-leak
+       checking, they simply call <STRONG>exit</STRONG>.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       These functions do not return a value.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These functions are not part of X/Open Curses; nor do other implementa-
+       tions of curses provide a similar feature.
+
+       In any implementation of X/Open Curses, an application can free part of
+       the memory allocated by curses:
+
+       <STRONG>o</STRONG>   The  portable  part  of  <STRONG>exit_curses</STRONG>  can be freed using <STRONG>delscreen</STRONG>,
+           passing the <STRONG>SCREEN*</STRONG> pointer returned by <STRONG>newterm</STRONG>.
+
+           In some implementations, there is a global variable <STRONG>sp</STRONG> which  could
+           be used, e.g., if the screen were only initialized using <STRONG>initscr</STRONG>.
+
+       <STRONG>o</STRONG>   The portable part of <STRONG>exit_terminfo</STRONG> can be freed using <STRONG>del_curterm</STRONG>.
+
+           In this case, there is a global variable <STRONG>cur_term</STRONG> which can be used
+           as parameter.
+
+
+</PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
+       <STRONG><A HREF="curs_initscr.3x.html">curs_initscr(3x)</A></STRONG>, <STRONG><A HREF="curs_terminfo.3x.html">curs_terminfo(3x)</A></STRONG>.  <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG>.
+
+
+
+                                                             <STRONG><A HREF="curs_memleaks.3x.html">curs_memleaks(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></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>
diff --git a/doc/html/man/curs_mouse.3x.html b/doc/html/man/curs_mouse.3x.html
new file mode 100644
index 0000000..2228690
--- /dev/null
+++ b/doc/html/man/curs_mouse.3x.html
@@ -0,0 +1,404 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2022,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2015,2017 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_mouse.3x,v 1.59 2022/02/12 20:05:11 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_mouse 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_mouse 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_mouse.3x.html">curs_mouse(3x)</A></STRONG>                                                  <STRONG><A HREF="curs_mouse.3x.html">curs_mouse(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>has_mouse</STRONG>, <STRONG>getmouse</STRONG>, <STRONG>ungetmouse</STRONG>, <STRONG>mousemask</STRONG>, <STRONG>wenclose</STRONG>, <STRONG>mouse_trafo</STRONG>,
+       <STRONG>wmouse_trafo</STRONG>, <STRONG>mouseinterval</STRONG> - mouse interface through curses
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>typedef</STRONG> <STRONG>unsigned</STRONG> <STRONG>long</STRONG> <STRONG>mmask_t;</STRONG>
+
+       <STRONG>typedef</STRONG> <STRONG>struct</STRONG> <STRONG>{</STRONG>
+           <STRONG>short</STRONG> <STRONG>id;</STRONG>         <EM>/*</EM> <EM>ID</EM> <EM>to</EM> <EM>distinguish</EM> <EM>multiple</EM> <EM>devices</EM> <EM>*/</EM>
+           <STRONG>int</STRONG> <STRONG>x,</STRONG> <STRONG>y,</STRONG> <STRONG>z;</STRONG>      <EM>/*</EM> <EM>event</EM> <EM>coordinates</EM> <EM>*/</EM>
+           <STRONG>mmask_t</STRONG> <STRONG>bstate;</STRONG>   <EM>/*</EM> <EM>button</EM> <EM>state</EM> <EM>bits</EM> <EM>*/</EM>
+       <STRONG>}</STRONG> <STRONG>MEVENT;</STRONG>
+
+       <STRONG>bool</STRONG> <STRONG>has_mouse(void);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>getmouse(MEVENT</STRONG> <STRONG>*</STRONG><EM>event</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>ungetmouse(MEVENT</STRONG> <STRONG>*</STRONG><EM>event</EM><STRONG>);</STRONG>
+
+       <STRONG>mmask_t</STRONG> <STRONG>mousemask(mmask_t</STRONG> <EM>newmask</EM><STRONG>,</STRONG> <STRONG>mmask_t</STRONG> <STRONG>*</STRONG><EM>oldmask</EM><STRONG>);</STRONG>
+
+       <STRONG>bool</STRONG> <STRONG>wenclose(const</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>);</STRONG>
+
+       <STRONG>bool</STRONG> <STRONG>mouse_trafo(int*</STRONG> <EM>pY</EM><STRONG>,</STRONG> <STRONG>int*</STRONG> <EM>pX</EM><STRONG>,</STRONG> <STRONG>bool</STRONG> <EM>to</EM><STRONG>_</STRONG><EM>screen</EM><STRONG>);</STRONG>
+       <STRONG>bool</STRONG> <STRONG>wmouse_trafo(const</STRONG> <STRONG>WINDOW*</STRONG> <EM>win</EM><STRONG>,</STRONG>
+                         <STRONG>int*</STRONG> <EM>pY</EM><STRONG>,</STRONG> <STRONG>int*</STRONG> <EM>pX</EM><STRONG>,</STRONG> <STRONG>bool</STRONG> <EM>to</EM><STRONG>_</STRONG><EM>screen</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>mouseinterval(int</STRONG> <EM>erval</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       These functions provide an interface to mouse events from  <STRONG><A HREF="ncurses.3x.html">ncurses(3x)</A></STRONG>.
+       Mouse  events  are  represented  by  <STRONG>KEY_MOUSE</STRONG> pseudo-key values in the
+       <STRONG><A HREF="curs_getch.3x.html">wgetch(3x)</A></STRONG> input stream.
+
+
+</PRE><H3><a name="h3-mousemask">mousemask</a></H3><PRE>
+       To make mouse events visible, use the <STRONG>mousemask</STRONG>  function.   This  sets
+       the  mouse  events to be reported.  By default, no mouse events are re-
+       ported.
+
+       <STRONG>o</STRONG>   The function returns an updated copy of <EM>newmask</EM> to  indicate  which
+           of the specified mouse events can be reported.
+
+           If the screen has not been initialized, or if the terminal does not
+           support mouse-events, this function returns 0.
+
+       <STRONG>o</STRONG>   If <EM>oldmask</EM> is non-NULL, this function fills the indicated  location
+           with the previous value of the current screen's mouse event mask.
+
+       As  a  side  effect,  setting  a  zero mousemask may turn off the mouse
+       pointer; setting a nonzero mask may turn it on.  Whether  this  happens
+       is device-dependent.
+
+
+</PRE><H3><a name="h3-Mouse-events">Mouse events</a></H3><PRE>
+       Here are the mouse event type masks which may be defined:
+
+       <STRONG>Name</STRONG>                     <STRONG>Description</STRONG>
+       ---------------------------------------------------------------------
+       BUTTON1_PRESSED          mouse button 1 down
+       BUTTON1_RELEASED         mouse button 1 up
+       BUTTON1_CLICKED          mouse button 1 clicked
+
+       BUTTON1_DOUBLE_CLICKED   mouse button 1 double clicked
+       BUTTON1_TRIPLE_CLICKED   mouse button 1 triple clicked
+       ---------------------------------------------------------------------
+       BUTTON2_PRESSED          mouse button 2 down
+       BUTTON2_RELEASED         mouse button 2 up
+       BUTTON2_CLICKED          mouse button 2 clicked
+       BUTTON2_DOUBLE_CLICKED   mouse button 2 double clicked
+       BUTTON2_TRIPLE_CLICKED   mouse button 2 triple clicked
+       ---------------------------------------------------------------------
+       BUTTON3_PRESSED          mouse button 3 down
+       BUTTON3_RELEASED         mouse button 3 up
+       BUTTON3_CLICKED          mouse button 3 clicked
+       BUTTON3_DOUBLE_CLICKED   mouse button 3 double clicked
+       BUTTON3_TRIPLE_CLICKED   mouse button 3 triple clicked
+       ---------------------------------------------------------------------
+       BUTTON4_PRESSED          mouse button 4 down
+       BUTTON4_RELEASED         mouse button 4 up
+       BUTTON4_CLICKED          mouse button 4 clicked
+       BUTTON4_DOUBLE_CLICKED   mouse button 4 double clicked
+       BUTTON4_TRIPLE_CLICKED   mouse button 4 triple clicked
+       ---------------------------------------------------------------------
+       BUTTON5_PRESSED          mouse button 5 down
+       BUTTON5_RELEASED         mouse button 5 up
+       BUTTON5_CLICKED          mouse button 5 clicked
+       BUTTON5_DOUBLE_CLICKED   mouse button 5 double clicked
+       BUTTON5_TRIPLE_CLICKED   mouse button 5 triple clicked
+       ---------------------------------------------------------------------
+       BUTTON_SHIFT             shift was down during button state change
+       BUTTON_CTRL              control was down during button state change
+       BUTTON_ALT               alt was down during button state change
+       ALL_MOUSE_EVENTS         report all button state changes
+       REPORT_MOUSE_POSITION    report mouse movement
+       ---------------------------------------------------------------------
+
+
+</PRE><H3><a name="h3-getmouse">getmouse</a></H3><PRE>
+       Once a class of mouse events has been made visible in a window, calling
+       the <STRONG>wgetch</STRONG> function on that window may return <STRONG>KEY_MOUSE</STRONG> as an indicator
+       that a mouse event has been queued.  To read the event data and pop the
+       event off the queue, call <STRONG>getmouse</STRONG>.  This function will return <STRONG>OK</STRONG> if  a
+       mouse  event  is  actually  visible in the given window, <STRONG>ERR</STRONG> otherwise.
+       When <STRONG>getmouse</STRONG> returns <STRONG>OK</STRONG>, the data deposited as y and x  in  the  event
+       structure  coordinates  will  be screen-relative character-cell coordi-
+       nates.  The returned state mask will have exactly one bit set to  indi-
+       cate the event type.  The corresponding data in the queue is marked in-
+       valid.  A subsequent call to <STRONG>getmouse</STRONG> will retrieve the next older item
+       from the queue.
+
+
+</PRE><H3><a name="h3-ungetmouse">ungetmouse</a></H3><PRE>
+       The  <STRONG>ungetmouse</STRONG>  function  behaves analogously to <STRONG>ungetch</STRONG>.  It pushes a
+       <STRONG>KEY_MOUSE</STRONG> event onto the input queue, and associates  with  that  event
+       the given state data and screen-relative character-cell coordinates.
+
+
+</PRE><H3><a name="h3-wenclose">wenclose</a></H3><PRE>
+       The  <STRONG>wenclose</STRONG>  function  tests  whether a given pair of screen-relative
+       character-cell coordinates is enclosed by  a  given  window,  returning
+       <STRONG>TRUE</STRONG>  if  it is and <STRONG>FALSE</STRONG> otherwise.  It is useful for determining what
+       subset of the screen windows enclose the location of a mouse event.
+
+
+</PRE><H3><a name="h3-wmouse_trafo">wmouse_trafo</a></H3><PRE>
+       The <STRONG>wmouse_trafo</STRONG> function transforms a given pair of  coordinates  from
+       stdscr-relative coordinates to coordinates relative to the given window
+       or vice versa.  The resulting stdscr-relative coordinates are  not  al-
+       ways  identical  to window-relative coordinates due to the mechanism to
+       reserve lines on top or bottom of the screen for  other  purposes  (see
+       the <STRONG>ripoffline</STRONG> and <STRONG><A HREF="curs_slk.3x.html">slk_init(3x)</A></STRONG> calls, for example).
+
+       <STRONG>o</STRONG>   If the parameter <EM>to</EM><STRONG>_</STRONG><EM>screen</EM> is <STRONG>TRUE</STRONG>, the pointers <EM>pY,</EM> <EM>pX</EM> must refer-
+           ence the coordinates of a location inside the window <EM>win</EM>.  They are
+           converted  to  window-relative coordinates and returned through the
+           pointers.  If the conversion was successful, the  function  returns
+           <STRONG>TRUE</STRONG>.
+
+       <STRONG>o</STRONG>   If one of the parameters was NULL or the location is not inside the
+           window, <STRONG>FALSE</STRONG> is returned.
+
+       <STRONG>o</STRONG>   If <EM>to</EM><STRONG>_</STRONG><EM>screen</EM> is <STRONG>FALSE</STRONG>, the pointers <EM>pY,</EM> <EM>pX</EM> must  reference  window-
+           relative  coordinates.  They are converted to stdscr-relative coor-
+           dinates if the window <EM>win</EM> encloses this point.  In  this  case  the
+           function returns <STRONG>TRUE</STRONG>.
+
+       <STRONG>o</STRONG>   If  one  of  the  parameters is NULL or the point is not inside the
+           window, <STRONG>FALSE</STRONG> is returned.  The referenced coordinates are only re-
+           placed  by the converted coordinates if the transformation was suc-
+           cessful.
+
+
+</PRE><H3><a name="h3-mouse_trafo">mouse_trafo</a></H3><PRE>
+       The <STRONG>mouse_trafo</STRONG> function performs the same translation as <STRONG>wmouse_trafo</STRONG>,
+       using stdscr for <EM>win</EM>.
+
+
+</PRE><H3><a name="h3-mouseinterval">mouseinterval</a></H3><PRE>
+       The  <STRONG>mouseinterval</STRONG>  function  sets  the maximum time (in thousands of a
+       second) that can elapse between press and release events for them to be
+       recognized  as  a click.  Use <STRONG>mouseinterval(0)</STRONG> to disable click resolu-
+       tion.  This function returns the previous interval value.  Use <STRONG>mousein-</STRONG>
+       <STRONG>terval(-1)</STRONG>  to obtain the interval without altering it.  The default is
+       one sixth of a second.
+
+
+</PRE><H3><a name="h3-has_mouse">has_mouse</a></H3><PRE>
+       The <STRONG>has_mouse</STRONG> function returns <STRONG>TRUE</STRONG> if the mouse driver has  been  suc-
+       cessfully initialized.
+
+       Note  that  mouse  events will be ignored when input is in cooked mode,
+       and will cause an error beep when cooked mode is being simulated  in  a
+       window  by a function such as <STRONG>getstr</STRONG> that expects a linefeed for input-
+       loop termination.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       <STRONG>getmouse</STRONG> and <STRONG>ungetmouse</STRONG> return the integer <STRONG>ERR</STRONG> upon failure or <STRONG>OK</STRONG>  upon
+       successful completion:
+
+          <STRONG>getmouse</STRONG>
+               returns an error.
+
+          <STRONG>o</STRONG>   If  no mouse driver was initialized, or if the mask parameter is
+              zero,
+
+          <STRONG>o</STRONG>   It returns an error if a mouse event was detected which did  not
+              match the current <EM>mousemask</EM>.
+
+          <STRONG>o</STRONG>   It also returns an error if no more events remain in the queue.
+
+          <STRONG>ungetmouse</STRONG>
+               returns an error if the FIFO is full.
+
+       <STRONG>mousemask</STRONG> returns the mask of reportable events.
+
+       <STRONG>mouseinterval</STRONG>  returns the previous interval value, unless the terminal
+       was not initialized.  In that case, it  returns  the  maximum  interval
+       value (166).
+
+       <STRONG>wenclose</STRONG> and <STRONG>wmouse_trafo</STRONG> are boolean functions returning <STRONG>TRUE</STRONG> or <STRONG>FALSE</STRONG>
+       depending on their test result.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These calls 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 version of curses.
+
+       SVr4  curses had support for the mouse in a variant of <STRONG>xterm(1)</STRONG>.  It is
+       mentioned in a few places, but with no supporting documentation:
+
+       <STRONG>o</STRONG>   the "libcurses" manual page lists functions for this feature  which
+           are prototyped in <STRONG>curses.h</STRONG>:
+
+               extern int mouse_set(long int);
+               extern int mouse_on(long int);
+               extern int mouse_off(long int);
+               extern int request_mouse_pos(void);
+               extern int map_button(unsigned long);
+               extern void wmouse_position(WINDOW *, int *, int *);
+               extern unsigned long getmouse(void), getbmap(void);
+
+       <STRONG>o</STRONG>   the "terminfo" manual page lists capabilities for the feature
+
+               buttons           btns    BT       Number of buttons on the mouse
+               get_mouse         getm    Gm       Curses should get button events
+               key_mouse         kmous   Km       0631, Mouse event has occurred
+               mouse_info        minfo   Mi       Mouse status information
+               req_mouse_pos     reqmp   RQ       Request mouse position report
+
+       <STRONG>o</STRONG>   the  interface  made assumptions (as does ncurses) about the escape
+           sequences sent to and received from the terminal.
+
+           For instance the SVr4 curses library used the <STRONG>get_mouse</STRONG>  capability
+           to  tell  the  terminal  which  mouse button events it should send,
+           passing the mouse-button bit-mask to the terminal.  Also, it  could
+           ask  the terminal where the mouse was using the <STRONG>req_mouse_pos</STRONG> capa-
+           bility.
+
+           Those features required a terminal which had been modified to  work
+           with curses.  They were not part of the X Consortium's xterm.
+
+       When  developing the xterm mouse support for ncurses in September 1995,
+       Eric Raymond was uninterested in using the same interface  due  to  its
+       lack of documentation.  Later, in 1998, Mark Hesseling provided support
+       in PDCurses 2.3 using the SVr4 interface.  PDCurses, however, does  not
+       use  video  terminals, making it unnecessary to be concerned about com-
+       patibility with the escape sequences.
+
+       The feature macro <STRONG>NCURSES_MOUSE_VERSION</STRONG> is provided so the preprocessor
+       can  be used to test whether these features are present.  If the inter-
+       face is changed, the value of <STRONG>NCURSES_MOUSE_VERSION</STRONG> will be  increment-
+       ed.   These values for <STRONG>NCURSES_MOUSE_VERSION</STRONG> may be specified when con-
+       figuring ncurses:
+
+          1  has definitions for reserved events.  The mask uses 28 bits.
+
+          2  adds definitions for button 5, removes the  definitions  for  re-
+             served events.  The mask uses 29 bits.
+
+       The order of the <STRONG>MEVENT</STRONG> structure members is not guaranteed.  Addition-
+       al fields may be added to the structure in the future.
+
+       Under <STRONG><A HREF="ncurses.3x.html">ncurses(3x)</A></STRONG>, these calls are  implemented  using  either  xterm's
+       built-in mouse-tracking API or platform-specific drivers including
+
+          <STRONG>o</STRONG>   Alessandro Rubini's gpm server
+
+          <STRONG>o</STRONG>   FreeBSD sysmouse
+
+          <STRONG>o</STRONG>   OS/2 EMX
+
+       If you are using an unsupported configuration, mouse events will not be
+       visible to <STRONG><A HREF="ncurses.3x.html">ncurses(3x)</A></STRONG> (and the <STRONG>mousemask</STRONG> function will  always  return
+       <STRONG>0</STRONG>).
+
+       If  the  terminfo entry contains a <STRONG>XM</STRONG> string, this is used in the xterm
+       mouse driver to control the way the terminal is initialized  for  mouse
+       operation.   The  default,  if  <STRONG>XM</STRONG> is not found, corresponds to private
+       mode 1000 of xterm:
+
+          \E[?1000%?%p1%{1}%=%th%el%;
+
+       The mouse driver also recognizes a newer xterm private mode 1006, e.g.,
+
+          \E[?1006;1000%?%p1%{1}%=%th%el%;
+
+       The <EM>z</EM> member in the event structure is not presently used.  It  is  in-
+       tended  for use with touch screens (which may be pressure-sensitive) or
+       with 3D-mice/trackballs/power gloves.
+
+       The <STRONG>ALL_MOUSE_EVENTS</STRONG>  class  does  not  include  <STRONG>REPORT_MOUSE_POSITION</STRONG>.
+       They  are  distinct.   For example, in xterm, wheel/scrolling mice send
+       position reports as a sequence of presses of buttons  4  or  5  without
+       matching button-releases.
+
+
+</PRE><H2><a name="h2-BUGS">BUGS</a></H2><PRE>
+       Mouse  events  under  xterm  will  not in fact be ignored during cooked
+       mode, if they have been enabled by <STRONG>mousemask</STRONG>.  Instead, the xterm mouse
+       report sequence will appear in the string read.
+
+       Mouse  events  under  xterm  will not be detected correctly in a window
+       with its keypad bit off, since they are interpreted  as  a  variety  of
+       function  key.   Your  terminfo  description  should  have <STRONG>kmous</STRONG> set to
+       "\E[M" (the beginning of the response from  xterm  for  mouse  clicks).
+       Other  values  for  <STRONG>kmous</STRONG> are permitted, but under the same assumption,
+       i.e., it is the beginning of the response.
+
+       Because there are no standard terminal responses that  would  serve  to
+       identify  terminals which support the xterm mouse protocol, <STRONG>ncurses</STRONG> as-
+       sumes that if <STRONG>kmous</STRONG> is defined in the terminal description, or  if  the
+       terminal  description's  primary  name  or  aliases  contain the string
+       "xterm", then the terminal may send mouse events.  The <STRONG>kmous</STRONG> capability
+       is  checked first, allowing the use of newer xterm mouse protocols such
+       as xterm's private mode 1006.
+
+
+</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_inopts.3x.html">curs_inopts(3x)</A></STRONG>, <STRONG><A HREF="curs_kernel.3x.html">curs_kernel(3x)</A></STRONG>, <STRONG><A HREF="curs_slk.3x.html">curs_slk(3x)</A></STRONG>,  <STRONG>curs_vari-</STRONG>
+       <STRONG><A HREF="curs_variables.3x.html">ables(3x)</A></STRONG>.
+
+
+
+                                                                <STRONG><A HREF="curs_mouse.3x.html">curs_mouse(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-mousemask">mousemask</a></li>
+<li><a href="#h3-Mouse-events">Mouse events</a></li>
+<li><a href="#h3-getmouse">getmouse</a></li>
+<li><a href="#h3-ungetmouse">ungetmouse</a></li>
+<li><a href="#h3-wenclose">wenclose</a></li>
+<li><a href="#h3-wmouse_trafo">wmouse_trafo</a></li>
+<li><a href="#h3-mouse_trafo">mouse_trafo</a></li>
+<li><a href="#h3-mouseinterval">mouseinterval</a></li>
+<li><a href="#h3-has_mouse">has_mouse</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-BUGS">BUGS</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_move.3x.html b/doc/html/man/curs_move.3x.html
new file mode 100644
index 0000000..8d7d7e4
--- /dev/null
+++ b/doc/html/man/curs_move.3x.html
@@ -0,0 +1,102 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2017 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_move.3x,v 1.22 2022/02/12 20:05:11 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_move 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_move 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_move.3x.html">curs_move(3x)</A></STRONG>                                                    <STRONG><A HREF="curs_move.3x.html">curs_move(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>move</STRONG>, <STRONG>wmove</STRONG> - move <STRONG>curses</STRONG> window cursor
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>move(int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wmove(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       These routines move the cursor associated with the window to line <EM>y</EM> and
+       column <EM>x</EM>.  This routine does not move the physical cursor of the termi-
+       nal until <STRONG><A HREF="curs_refresh.3x.html">refresh(3x)</A></STRONG> is called.  The position specified is relative to
+       the upper left-hand corner of the window, which is (0,0).
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       These routines return <STRONG>ERR</STRONG> upon failure and <STRONG>OK</STRONG> (SVr4 specifies only  "an
+       integer value other than <STRONG>ERR</STRONG>") upon successful completion.
+
+       Specifically, they return an error if the window pointer is null, or if
+       the position is outside the window.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       Note that <STRONG>move</STRONG> may be a macro.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These functions are described in the XSI Curses standard, Issue 4.
+
+
+</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_refresh.3x.html">curs_refresh(3x)</A></STRONG>
+
+
+
+                                                                 <STRONG><A HREF="curs_move.3x.html">curs_move(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_opaque.3x.html b/doc/html/man/curs_opaque.3x.html
new file mode 100644
index 0000000..fd7017d
--- /dev/null
+++ b/doc/html/man/curs_opaque.3x.html
@@ -0,0 +1,163 @@
+<!--
+  ****************************************************************************
+  * Copyright 2020-2021,2022 Thomas E. Dickey                                *
+  * Copyright 2007-2014,2015 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_opaque.3x,v 1.18 2022/02/12 20:05:11 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_opaque 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_opaque 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_opaque.3x.html">curs_opaque(3x)</A></STRONG>                                                <STRONG><A HREF="curs_opaque.3x.html">curs_opaque(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>is_cleared</STRONG>, <STRONG>is_idlok</STRONG>, <STRONG>is_idcok</STRONG>, <STRONG>is_immedok</STRONG>, <STRONG>is_keypad</STRONG>, <STRONG>is_leaveok</STRONG>,
+       <STRONG>is_nodelay</STRONG>, <STRONG>is_notimeout</STRONG>, <STRONG>is_pad</STRONG>, <STRONG>is_scrollok</STRONG>, <STRONG>is_subwin</STRONG>, <STRONG>is_syncok</STRONG>,
+       <STRONG>wgetdelay</STRONG>, <STRONG>wgetparent</STRONG>, <STRONG>wgetscrreg</STRONG> - <STRONG>curses</STRONG> window properties
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>bool</STRONG> <STRONG>is_cleared(const</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+       <STRONG>bool</STRONG> <STRONG>is_idcok(const</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+       <STRONG>bool</STRONG> <STRONG>is_idlok(const</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+       <STRONG>bool</STRONG> <STRONG>is_immedok(const</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+       <STRONG>bool</STRONG> <STRONG>is_keypad(const</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+       <STRONG>bool</STRONG> <STRONG>is_leaveok(const</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+       <STRONG>bool</STRONG> <STRONG>is_nodelay(const</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+       <STRONG>bool</STRONG> <STRONG>is_notimeout(const</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+       <STRONG>bool</STRONG> <STRONG>is_pad(const</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+       <STRONG>bool</STRONG> <STRONG>is_scrollok(const</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+       <STRONG>bool</STRONG> <STRONG>is_subwin(const</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+       <STRONG>bool</STRONG> <STRONG>is_syncok(const</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+       <STRONG>WINDOW</STRONG> <STRONG>*</STRONG> <STRONG>wgetparent(const</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wgetdelay(const</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wgetscrreg(const</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <STRONG>*</STRONG><EM>top</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <STRONG>*</STRONG><EM>bottom</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       This  implementation  provides functions which return properties set in
+       the WINDOW structure, allowing it to be "opaque" if the  symbol  <STRONG>NCURS-</STRONG>
+       <STRONG>ES_OPAQUE</STRONG> is defined:
+
+       <STRONG>is_cleared</STRONG>
+            returns the value set in <STRONG>clearok</STRONG>
+
+       <STRONG>is_idcok</STRONG>
+            returns the value set in <STRONG>idcok</STRONG>
+
+       <STRONG>is_idlok</STRONG>
+            returns the value set in <STRONG>idlok</STRONG>
+
+       <STRONG>is_immedok</STRONG>
+            returns the value set in <STRONG>immedok</STRONG>
+
+       <STRONG>is_keypad</STRONG>
+            returns the value set in <STRONG>keypad</STRONG>
+
+       <STRONG>is_leaveok</STRONG>
+            returns the value set in <STRONG>leaveok</STRONG>
+
+       <STRONG>is_nodelay</STRONG>
+            returns the value set in <STRONG>nodelay</STRONG>
+
+       <STRONG>is_notimeout</STRONG>
+            returns the value set in <STRONG>notimeout</STRONG>
+
+       <STRONG>is_pad</STRONG>
+            returns <STRONG>TRUE</STRONG> if the window is a pad i.e., created by <STRONG>newpad</STRONG>
+
+       <STRONG>is_scrollok</STRONG>
+            returns the value set in <STRONG>scrollok</STRONG>
+
+       <STRONG>is_subwin</STRONG>
+            returns <STRONG>TRUE</STRONG> if the window is a subwindow, i.e., created by <STRONG>subwin</STRONG>
+            or <STRONG>derwin</STRONG>
+
+       <STRONG>is_syncok</STRONG>
+            returns the value set in <STRONG>syncok</STRONG>
+
+       <STRONG>wgetdelay</STRONG>
+            returns the delay timeout as set in <STRONG>wtimeout</STRONG>.
+
+       <STRONG>wgetparent</STRONG>
+            returns the parent WINDOW pointer for subwindows, or NULL for win-
+            dows having no parent.
+
+       <STRONG>wgetscrreg</STRONG>
+            returns the top and bottom rows for the scrolling margin as set in
+            <STRONG>wsetscrreg</STRONG>.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       These functions all return <STRONG>TRUE</STRONG> or <STRONG>FALSE</STRONG>, except as noted.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       Both a macro and a function are provided for each name.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These routines are specific to ncurses.  They  were  not  supported  on
+       Version 7, BSD or System V implementations.  It is recommended that any
+       code depending on ncurses extensions be conditioned using  NCURSES_VER-
+       SION.
+
+
+</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_inopts.3x.html">curs_inopts(3x)</A></STRONG>, <STRONG><A HREF="curs_outopts.3x.html">curs_outopts(3x)</A></STRONG>, <STRONG><A HREF="curs_window.3x.html">curs_window(3x)</A></STRONG>
+
+
+
+                                                               <STRONG><A HREF="curs_opaque.3x.html">curs_opaque(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_outopts.3x.html b/doc/html/man/curs_outopts.3x.html
new file mode 100644
index 0000000..5e86a9f
--- /dev/null
+++ b/doc/html/man/curs_outopts.3x.html
@@ -0,0 +1,230 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2016,2017 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_outopts.3x,v 1.36 2022/02/12 20:05:11 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_outopts 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_outopts 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_outopts.3x.html">curs_outopts(3x)</A></STRONG>                                              <STRONG><A HREF="curs_outopts.3x.html">curs_outopts(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>clearok</STRONG>, <STRONG>idlok</STRONG>, <STRONG>idcok</STRONG>, <STRONG>immedok</STRONG>, <STRONG>leaveok</STRONG>, <STRONG>setscrreg</STRONG>, <STRONG>wsetscrreg</STRONG>,
+       <STRONG>scrollok</STRONG> - <STRONG>curses</STRONG> output options
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>clearok(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>bool</STRONG> <EM>bf</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>idlok(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>bool</STRONG> <EM>bf</EM><STRONG>);</STRONG>
+       <STRONG>void</STRONG> <STRONG>idcok(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>bool</STRONG> <EM>bf</EM><STRONG>);</STRONG>
+       <STRONG>void</STRONG> <STRONG>immedok(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>bool</STRONG> <EM>bf</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>leaveok(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>bool</STRONG> <EM>bf</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>scrollok(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>bool</STRONG> <EM>bf</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>setscrreg(int</STRONG> <EM>top</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>bot</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wsetscrreg(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>top</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>bot</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       These routines set options that change the style of output within <STRONG>curs-</STRONG>
+       <STRONG>es</STRONG>.   All  options are initially <STRONG>FALSE</STRONG>, unless otherwise stated.  It is
+       not necessary to turn these options off before calling <STRONG><A HREF="curs_initscr.3x.html">endwin(3x)</A></STRONG>.
+
+
+</PRE><H3><a name="h3-clearok">clearok</a></H3><PRE>
+       If <STRONG>clearok</STRONG> is called with <STRONG>TRUE</STRONG> as argument, the next call  to  <STRONG>wrefresh</STRONG>
+       with this window will clear the screen completely and redraw the entire
+       screen from scratch.  This is useful when the contents  of  the  screen
+       are  uncertain, or in some cases for a more pleasing visual effect.  If
+       the <EM>win</EM> argument to <STRONG>clearok</STRONG> is the global  variable  <STRONG>curscr</STRONG>,  the  next
+       call  to  <STRONG>wrefresh</STRONG>  with any window causes the screen to be cleared and
+       repainted from scratch.
+
+
+</PRE><H3><a name="h3-idlok">idlok</a></H3><PRE>
+       If <STRONG>idlok</STRONG> is called with <STRONG>TRUE</STRONG> as second argument, <STRONG>curses</STRONG> considers using
+       the  hardware  insert/delete  line  feature  of  terminals so equipped.
+       Calling <STRONG>idlok</STRONG> with <STRONG>FALSE</STRONG> as second argument disables use of line inser-
+       tion  and deletion.  This option should be enabled only if the applica-
+       tion needs insert/delete line, for example, for a screen editor.  It is
+       disabled by default because insert/delete line tends to be visually an-
+       noying when used in applications where it is not really needed.  If in-
+       sert/delete line cannot be used, <STRONG>curses</STRONG> redraws the changed portions of
+       all lines.
+
+
+</PRE><H3><a name="h3-idcok">idcok</a></H3><PRE>
+       If <STRONG>idcok</STRONG> is called with <STRONG>FALSE</STRONG> as second argument, <STRONG>curses</STRONG> no longer con-
+       siders  using the hardware insert/delete character feature of terminals
+       so equipped.  Use of character insert/delete  is  enabled  by  default.
+       Calling  <STRONG>idcok</STRONG> with <STRONG>TRUE</STRONG> as second argument re-enables use of character
+       insertion and deletion.
+
+
+</PRE><H3><a name="h3-immedok">immedok</a></H3><PRE>
+       If <STRONG>immedok</STRONG> is called with <STRONG>TRUE</STRONG> <STRONG>as</STRONG> <STRONG>argument</STRONG>, any change  in  the  window
+       image, such as the ones caused by <STRONG>waddch,</STRONG> <STRONG>wclrtobot,</STRONG> <STRONG>wscrl</STRONG>, etc., auto-
+       matically cause a call to <STRONG>wrefresh</STRONG>.  However, it  may  degrade  perfor-
+       mance  considerably, due to repeated calls to <STRONG>wrefresh</STRONG>.  It is disabled
+       by default.
+
+
+</PRE><H3><a name="h3-leaveok">leaveok</a></H3><PRE>
+       Normally, the hardware cursor is left at the  location  of  the  window
+       cursor  being  refreshed.   The  <STRONG>leaveok</STRONG> option allows the cursor to be
+       left wherever the update happens to leave it.  It is useful for  appli-
+       cations  where  the  cursor  is not used, since it reduces the need for
+       cursor motions.
+
+
+</PRE><H3><a name="h3-scrollok">scrollok</a></H3><PRE>
+       The <STRONG>scrollok</STRONG> option controls what happens when the cursor of  a  window
+       is  moved  off  the edge of the window or scrolling region, either as a
+       result of a newline action on the bottom line, or typing the last char-
+       acter of the last line.  If disabled, (<EM>bf</EM> is <STRONG>FALSE</STRONG>), the cursor is left
+       on the bottom line.  If enabled, (<EM>bf</EM> is <STRONG>TRUE</STRONG>), the window  is  scrolled
+       up one line (Note that to get the physical scrolling effect on the ter-
+       minal, it is also necessary to call <STRONG>idlok</STRONG>).
+
+
+</PRE><H3><a name="h3-setscrreg_wsetscrreg">setscrreg/wsetscrreg</a></H3><PRE>
+       The <STRONG>setscrreg</STRONG> and <STRONG>wsetscrreg</STRONG> routines allow the application  programmer
+       to set a software scrolling region in a window.  The <EM>top</EM> and <EM>bot</EM> param-
+       eters are the line  numbers  of  the  top  and  bottom  margin  of  the
+       scrolling region.  (Line 0 is the top line of the window.)  If this op-
+       tion and <STRONG>scrollok</STRONG> are enabled, an attempt to move off the bottom margin
+       line causes all lines in the scrolling region to scroll one line in the
+       direction of the first line.  Only the text of the window is  scrolled.
+       (Note  that this has nothing to do with the use of a physical scrolling
+       region capability in the terminal, like that in the VT100.  If <STRONG>idlok</STRONG> is
+       enabled and the terminal has either a scrolling region or insert/delete
+       line capability, they will probably be used by the output routines.)
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       The functions <STRONG>setscrreg</STRONG> and <STRONG>wsetscrreg</STRONG> return <STRONG>OK</STRONG> upon success  and  <STRONG>ERR</STRONG>
+       upon  failure.  All other routines that return an integer always return
+       <STRONG>OK</STRONG>.
+
+       X/Open Curses does not define any error conditions.
+
+       In this implementation,
+
+       <STRONG>o</STRONG>   those functions that have a window pointer will return an error  if
+           the window pointer is null
+
+       <STRONG>o</STRONG>   <STRONG>wsetscrreg</STRONG>  returns  an error if the scrolling region limits extend
+           outside the window.
+
+       X/Open does not define any error conditions.  This  implementation  re-
+       turns an error if the window pointer is null.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These functions are described in the XSI Curses standard, Issue 4.
+
+       From the outset, ncurses used <STRONG>nl</STRONG>/<STRONG>nonl</STRONG> to control the conversion of new-
+       lines to carriage return/line-feed on output as  well  as  input.   XSI
+       Curses  documents only the use of these functions for input.  This dif-
+       ference arose from converting the  <EM>pcurses</EM>  source  (which  used  <STRONG>ioctl</STRONG>
+       calls  with  the <STRONG>sgttyb</STRONG> structure) to termios (i.e., the POSIX terminal
+       interface).  In the former, both input and output were controlled via a
+       single  option  <STRONG>CRMOD</STRONG>,  while the latter separates these features.  Be-
+       cause that conversion interferes with output optimization, <STRONG>nl</STRONG>/<STRONG>nonl</STRONG> were
+       amended after ncurses 6.2 to eliminate their effect on output.
+
+       Some  historic  curses implementations had, as an undocumented feature,
+       the ability to do the equivalent of <STRONG>clearok(...,</STRONG> <STRONG>1)</STRONG>  by  saying  <STRONG>touch-</STRONG>
+       <STRONG>win(stdscr)</STRONG> or <STRONG>clear(stdscr)</STRONG>.  This will not work under ncurses.
+
+       Earlier  System  V  curses implementations specified that with <STRONG>scrollok</STRONG>
+       enabled, any window modification triggering  a  scroll  also  forced  a
+       physical refresh.  XSI Curses does not require this, and <STRONG>ncurses</STRONG> avoids
+       doing it to perform better  vertical-motion  optimization  at  <STRONG>wrefresh</STRONG>
+       time.
+
+       The XSI Curses standard does not mention that the cursor should be made
+       invisible as a side-effect of <STRONG>leaveok</STRONG>.  SVr4 curses documentation  does
+       this,  but  the code does not.  Use <STRONG>curs_set</STRONG> to make the cursor invisi-
+       ble.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       Note that <STRONG>clearok</STRONG>, <STRONG>leaveok</STRONG>,  <STRONG>scrollok</STRONG>,  <STRONG>idcok</STRONG>,  and  <STRONG>setscrreg</STRONG>  may  be
+       macros.
+
+       The <STRONG>immedok</STRONG> routine is useful for windows that are used as terminal em-
+       ulators.
+
+
+</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_addch.3x.html">curs_addch(3x)</A></STRONG>, <STRONG><A HREF="curs_clear.3x.html">curs_clear(3x)</A></STRONG>, <STRONG><A HREF="curs_initscr.3x.html">curs_initscr(3x)</A></STRONG>,
+       <STRONG><A HREF="curs_scroll.3x.html">curs_scroll(3x)</A></STRONG>, <STRONG><A HREF="curs_refresh.3x.html">curs_refresh(3x)</A></STRONG>, <STRONG><A HREF="curs_variables.3x.html">curs_variables(3x)</A></STRONG>.
+
+
+
+                                                              <STRONG><A HREF="curs_outopts.3x.html">curs_outopts(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-clearok">clearok</a></li>
+<li><a href="#h3-idlok">idlok</a></li>
+<li><a href="#h3-idcok">idcok</a></li>
+<li><a href="#h3-immedok">immedok</a></li>
+<li><a href="#h3-leaveok">leaveok</a></li>
+<li><a href="#h3-scrollok">scrollok</a></li>
+<li><a href="#h3-setscrreg_wsetscrreg">setscrreg/wsetscrreg</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-NOTES">NOTES</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_overlay.3x.html b/doc/html/man/curs_overlay.3x.html
new file mode 100644
index 0000000..f87fc88
--- /dev/null
+++ b/doc/html/man/curs_overlay.3x.html
@@ -0,0 +1,128 @@
+<!--
+  ****************************************************************************
+  * Copyright 2020-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2013,2015 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_overlay.3x,v 1.22 2022/02/12 20:05:11 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_overlay 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_overlay 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_overlay.3x.html">curs_overlay(3x)</A></STRONG>                                              <STRONG><A HREF="curs_overlay.3x.html">curs_overlay(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>overlay</STRONG>, <STRONG>overwrite</STRONG>, <STRONG>copywin</STRONG> - overlay and manipulate overlapped <STRONG>curses</STRONG>
+       windows
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>overlay(const</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>srcwin</EM><STRONG>,</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>dstwin</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>overwrite(const</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>srcwin</EM><STRONG>,</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>dstwin</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>copywin(const</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>srcwin</EM><STRONG>,</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>dstwin</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>sminrow</EM><STRONG>,</STRONG>
+             <STRONG>int</STRONG> <EM>smincol</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>dminrow</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>dmincol</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>dmaxrow</EM><STRONG>,</STRONG>
+             <STRONG>int</STRONG> <EM>dmaxcol</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>overlay</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+
+</PRE><H3><a name="h3-overlay_-overwrite">overlay, overwrite</a></H3><PRE>
+       The <STRONG>overlay</STRONG> and <STRONG>overwrite</STRONG> routines overlay <EM>srcwin</EM>  on  top  of  <EM>dstwin</EM>.
+       <EM>scrwin</EM> and <EM>dstwin</EM> are not required to be the same size; only text where
+       the two windows overlap is copied.  The difference is that  <STRONG>overlay</STRONG>  is
+       non-destructive  (blanks  are not copied) whereas <STRONG>overwrite</STRONG> is destruc-
+       tive.
+
+
+</PRE><H3><a name="h3-copywin">copywin</a></H3><PRE>
+       The <STRONG>copywin</STRONG> routine provides a finer granularity of  control  over  the
+       <STRONG>overlay</STRONG>  and <STRONG>overwrite</STRONG> routines.  As in the <STRONG>prefresh</STRONG> routine, a rectan-
+       gle is specified in the  destination  window,  (<EM>dminrow</EM>,  <EM>dmincol</EM>)  and
+       (<EM>dmaxrow</EM>, <EM>dmaxcol</EM>), and the upper-left-corner coordinates of the source
+       window, (<EM>sminrow</EM>, <EM>smincol</EM>).  If the  argument  <EM>overlay</EM>  is  <STRONG>true</STRONG>,  then
+       copying is non-destructive, as in <STRONG>overlay</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  com-
+       pletion.
+
+       X/Open  defines  no error conditions.  In this implementation, <STRONG>copywin</STRONG>,
+       <STRONG>overlay</STRONG> and <STRONG>overwrite</STRONG> return an error if either of the window  pointers
+       are null, or if some part of the window would be placed off-screen.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       Note that <STRONG>overlay</STRONG> and <STRONG>overwrite</STRONG> may be macros.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       The  XSI Curses standard, Issue 4 describes these functions (adding the
+       const qualifiers).  It further specifies their behavior in the presence
+       of  characters with multibyte renditions (not yet supported in this im-
+       plementation).
+
+
+</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_pad.3x.html">curs_pad(3x)</A></STRONG>, <STRONG><A HREF="curs_refresh.3x.html">curs_refresh(3x)</A></STRONG>
+
+
+
+                                                              <STRONG><A HREF="curs_overlay.3x.html">curs_overlay(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-overlay_-overwrite">overlay, overwrite</a></li>
+<li><a href="#h3-copywin">copywin</a></li>
+</ul>
+</li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_pad.3x.html b/doc/html/man/curs_pad.3x.html
new file mode 100644
index 0000000..4758d36
--- /dev/null
+++ b/doc/html/man/curs_pad.3x.html
@@ -0,0 +1,257 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2015,2017 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_pad.3x,v 1.29 2022/02/12 20:05:11 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_pad 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_pad 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_pad.3x.html">curs_pad(3x)</A></STRONG>                                                      <STRONG><A HREF="curs_pad.3x.html">curs_pad(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>newpad</STRONG>, <STRONG>subpad</STRONG>, <STRONG>prefresh</STRONG>, <STRONG>pnoutrefresh</STRONG>, <STRONG>pechochar</STRONG>, <STRONG>pecho_wchar</STRONG> - create
+       and display <STRONG>curses</STRONG> pads
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>WINDOW</STRONG> <STRONG>*newpad(int</STRONG> <EM>nlines</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>ncols</EM><STRONG>);</STRONG>
+       <STRONG>WINDOW</STRONG> <STRONG>*subpad(WINDOW</STRONG> <STRONG>*</STRONG><EM>orig</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>nlines</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>ncols</EM><STRONG>,</STRONG>
+             <STRONG>int</STRONG> <EM>begin</EM><STRONG>_</STRONG><EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>begin</EM><STRONG>_</STRONG><EM>x</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>prefresh(WINDOW</STRONG> <STRONG>*</STRONG><EM>pad</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>pminrow</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>pmincol</EM><STRONG>,</STRONG>
+             <STRONG>int</STRONG> <EM>sminrow</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>smincol</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>smaxrow</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>smaxcol</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>pnoutrefresh(WINDOW</STRONG> <STRONG>*</STRONG><EM>pad</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>pminrow</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>pmincol</EM><STRONG>,</STRONG>
+             <STRONG>int</STRONG> <EM>sminrow</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>smincol</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>smaxrow</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>smaxcol</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>pechochar(WINDOW</STRONG> <STRONG>*</STRONG><EM>pad</EM><STRONG>,</STRONG> <STRONG>chtype</STRONG> <EM>ch</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>pecho_wchar(WINDOW</STRONG> <STRONG>*</STRONG><EM>pad</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>wch</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+
+</PRE><H3><a name="h3-newpad">newpad</a></H3><PRE>
+       The <STRONG>newpad</STRONG> routine creates and returns a pointer  to  a  new  pad  data
+       structure  with  the given number of lines, <EM>nlines</EM>, and columns, <EM>ncols</EM>.
+       A pad is like a window, except that it is not restricted by the  screen
+       size,  and  is not necessarily associated with a particular part of the
+       screen.  Pads can be used when a large window is  needed,  and  only  a
+       part  of  the  window will be on the screen at one time.  Automatic re-
+       freshes of pads (e.g., from scrolling or echoing of input) do  not  oc-
+       cur.
+
+       It  is  not  legal to call <STRONG>wrefresh</STRONG> with a <EM>pad</EM> as an argument; the rou-
+       tines <STRONG>prefresh</STRONG> or <STRONG>pnoutrefresh</STRONG> should be  called  instead.   Note  that
+       these routines require additional parameters to specify the part of the
+       pad to be displayed and the location on the screen to be used  for  the
+       display.
+
+
+</PRE><H3><a name="h3-subpad">subpad</a></H3><PRE>
+       The  <STRONG>subpad</STRONG> routine creates and returns a pointer to a subwindow within
+       a pad with the given number of lines, <EM>nlines</EM>, and columns, <EM>ncols</EM>.   Un-
+       like  <STRONG>subwin</STRONG>,  which uses screen coordinates, the window is at position
+       (<EM>begin</EM>_<EM>x</EM><STRONG>,</STRONG> <EM>begin</EM>_<EM>y</EM>) on the pad.  The window is made in the middle of the
+       window  <EM>orig</EM>,  so  that changes made to one window affect both windows.
+       During the use of this routine, it will  often  be  necessary  to  call
+       <STRONG>touchwin</STRONG> or <STRONG>touchline</STRONG> on <EM>orig</EM> before calling <STRONG>prefresh</STRONG>.
+
+
+</PRE><H3><a name="h3-prefresh_-pnoutrefresh">prefresh, pnoutrefresh</a></H3><PRE>
+       The  <STRONG>prefresh</STRONG>  and  <STRONG>pnoutrefresh</STRONG> routines are analogous to <STRONG>wrefresh</STRONG> and
+       <STRONG>wnoutrefresh</STRONG> except that they relate to pads instead of  windows.   The
+       additional  parameters  are needed to indicate what part of the pad and
+       screen are involved.
+
+       <STRONG>o</STRONG>   The <EM>pminrow</EM> and <EM>pmincol</EM> parameters specify the upper left-hand cor-
+           ner of the rectangle to be displayed in the pad.
+
+       <STRONG>o</STRONG>   The  <EM>sminrow</EM>,  <EM>smincol</EM>, <EM>smaxrow</EM>, and <EM>smaxcol</EM> parameters specify the
+           edges of the rectangle to be displayed on the screen.
+
+       The lower right-hand corner of the rectangle to be displayed in the pad
+       is calculated from the screen coordinates, since the rectangles must be
+       the same size.  Both rectangles must be entirely contained within their
+       respective  structures.   Negative values of <EM>pminrow</EM>, <EM>pmincol</EM>, <EM>sminrow</EM>,
+       or <EM>smincol</EM> are treated as if they were zero.
+
+
+</PRE><H3><a name="h3-pechochar">pechochar</a></H3><PRE>
+       The <STRONG>pechochar</STRONG> routine is functionally equivalent to  a  call  to  <STRONG>addch</STRONG>
+       followed  by a call to <STRONG><A HREF="curs_refresh.3x.html">refresh(3x)</A></STRONG>, a call to <STRONG>waddch</STRONG> followed by a call
+       to <STRONG>wrefresh</STRONG>, or a call to <STRONG>waddch</STRONG> followed by a call to  <STRONG>prefresh</STRONG>.   The
+       knowledge  that  only  a single character is being output is taken into
+       consideration and, for non-control characters, a  considerable  perfor-
+       mance  gain  might  be  seen  by  using these routines instead of their
+       equivalents.  In the case of <STRONG>pechochar</STRONG>, the last location of the pad on
+       the screen is reused for the arguments to <STRONG>prefresh</STRONG>.
+
+
+</PRE><H3><a name="h3-pecho_wchar">pecho_wchar</a></H3><PRE>
+       The  <STRONG>pecho_wchar</STRONG>  function  is the analogous wide-character form of <STRONG>pe-</STRONG>
+       <STRONG>chochar</STRONG>.  It outputs one character to a pad and  immediately  refreshes
+       the pad.  It does this by a call to <STRONG>wadd_wch</STRONG> followed by a call to <STRONG>pre-</STRONG>
+       <STRONG>fresh</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 com-
+       pletion.
+
+       Routines that return pointers return <STRONG>NULL</STRONG> on error, and  set  <STRONG>errno</STRONG>  to
+       <STRONG>ENOMEM</STRONG>.
+
+       X/Open does not define any error conditions.  In this implementation
+
+          <STRONG>prefresh</STRONG> and <STRONG>pnoutrefresh</STRONG>
+               return an error if the window pointer is null, or if the window
+               is not really a pad or if the  area  to  refresh  extends  off-
+               screen or if the minimum coordinates are greater than the maxi-
+               mum.
+
+          <STRONG>pechochar</STRONG>
+               returns an error if the window is not really a pad, and the as-
+               sociated call to <STRONG>wechochar</STRONG> returns an error.
+
+          <STRONG>pecho_wchar</STRONG>
+               returns an error if the window is not really a pad, and the as-
+               sociated call to <STRONG>wecho_wchar</STRONG> returns an error.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       Note that <STRONG>pechochar</STRONG> may be a macro.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       BSD curses has no <EM>pad</EM> feature.
+
+       SVr2 curses (1986) provided the <STRONG>newpad</STRONG> and related functions, document-
+       ing  them  in  a single line each.  SVr3 (1987) provided more extensive
+       documentation.
+
+       The documentation does not explain the term <EM>pad</EM>.  However,  the  Apollo
+       <EM>Aegis</EM> workstation operating system supported a graphical <EM>pad</EM> feature:
+
+       <STRONG>o</STRONG>   These  graphical pads could be much larger than the computer's dis-
+           play.
+
+       <STRONG>o</STRONG>   The read-only output from a command could be scrolled back  to  in-
+           spect, and select text from the pad.
+
+       The two uses may be related.
+
+       The  XSI  Curses  standard,  Issue 4 describes these functions, without
+       significant change from the SVr3 documentation.  It describes no  error
+       conditions.   The  behavior of <STRONG>subpad</STRONG> if the parent window is not a pad
+       is undocumented, and is not checked by the vendor Unix implementations:
+
+       <STRONG>o</STRONG>   SVr4 curses sets a flag in the <STRONG>WINDOW</STRONG>  structure  in  <STRONG>newpad</STRONG>  which
+           tells if the window is a <EM>pad</EM>.
+
+           However,  it  uses this information only in <STRONG>waddch</STRONG> (to decide if it
+           should call <STRONG>wrefresh</STRONG>) and <STRONG>wscrl</STRONG> (to avoid  scrolling  a  pad),  and
+           does  not  check  in  <STRONG>wrefresh</STRONG>  to ensure that the pad is refreshed
+           properly.
+
+       <STRONG>o</STRONG>   Solaris X/Open Curses checks if a window is a pad in  <STRONG>wnoutrefresh</STRONG>,
+           returning <STRONG>ERR</STRONG> in that case.
+
+           However,  it only sets the flag for subwindows if the parent window
+           is a pad.  Its <STRONG>newpad</STRONG> function does not set this information.  Con-
+           sequently, the check will never fail.
+
+           It  makes no comparable check in <STRONG>pnoutrefresh</STRONG>, though interestingly
+           enough, a comment in the source code states  that  the  lack  of  a
+           check was an MKS extension.
+
+       <STRONG>o</STRONG>   NetBSD  7 curses sets a flag in the <STRONG>WINDOW</STRONG> structure for <STRONG>newpad</STRONG> and
+           <STRONG>subpad</STRONG>, using this to help with the  distinction  between  <STRONG>wnoutre-</STRONG>
+           <STRONG>fresh</STRONG> and <STRONG>pnoutrefresh</STRONG>.
+
+           It  does  not  check for the case where a subwindow is created in a
+           pad using <STRONG>subwin</STRONG> or <STRONG>derwin</STRONG>.
+
+           The <STRONG>dupwin</STRONG> function returns a regular  window  when  duplicating  a
+           pad.   Likewise,  <STRONG>getwin</STRONG> always returns a window, even if the saved
+           data was from a pad.
+
+       This implementation
+
+       <STRONG>o</STRONG>   sets a flag in the <STRONG>WINDOW</STRONG> structure for <STRONG>newpad</STRONG> and <STRONG>subpad</STRONG>,
+
+       <STRONG>o</STRONG>   allows a <STRONG>subwin</STRONG> or <STRONG>derwin</STRONG> call to succeed having a  pad  parent  by
+           forcing the subwindow to be a pad,
+
+       <STRONG>o</STRONG>   checks  in  both  <STRONG>wnoutrefresh</STRONG> and <STRONG>pnoutrefresh</STRONG> to ensure that pads
+           and windows are handled distinctly, and
+
+       <STRONG>o</STRONG>   ensures that <STRONG>dupwin</STRONG> and <STRONG>getwin</STRONG> treat pads  versus  windows  consis-
+           tently.
+
+
+</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_refresh.3x.html">curs_refresh(3x)</A></STRONG>, <STRONG><A HREF="curs_touch.3x.html">curs_touch(3x)</A></STRONG>, <STRONG><A HREF="curs_addch.3x.html">curs_addch(3x)</A></STRONG>.
+
+
+
+                                                                  <STRONG><A HREF="curs_pad.3x.html">curs_pad(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-newpad">newpad</a></li>
+<li><a href="#h3-subpad">subpad</a></li>
+<li><a href="#h3-prefresh_-pnoutrefresh">prefresh, pnoutrefresh</a></li>
+<li><a href="#h3-pechochar">pechochar</a></li>
+<li><a href="#h3-pecho_wchar">pecho_wchar</a></li>
+</ul>
+</li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_print.3x.html b/doc/html/man/curs_print.3x.html
new file mode 100644
index 0000000..24c62d2
--- /dev/null
+++ b/doc/html/man/curs_print.3x.html
@@ -0,0 +1,115 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2017 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_print.3x,v 1.19 2022/02/12 20:05:11 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_print 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_print 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_print.3x.html">curs_print(3x)</A></STRONG>                                                  <STRONG><A HREF="curs_print.3x.html">curs_print(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>mcprint</STRONG> - ship binary data to printer
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>mcprint(char</STRONG> <STRONG>*</STRONG><EM>data</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>len</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       This  function  uses  the <STRONG>mc5p</STRONG> or <STRONG>mc4</STRONG> and <STRONG>mc5</STRONG> capabilities, if they are
+       present, to ship given data to a printer attached to the terminal.
+
+       Note that the <STRONG>mcprint</STRONG> code has no way  to  do  flow  control  with  the
+       printer  or  to  know  how  much buffering it has.  Your application is
+       responsible for keeping the rate of writes to  the  printer  below  its
+       continuous  throughput  rate  (typically  about half of its nominal cps
+       rating).   Dot-matrix  printers  and   6-page-per-minute   lasers   can
+       typically  handle  80cps,  so  a  good conservative rule of thumb is to
+       sleep for a second after shipping each 80-character line.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       The <STRONG>mcprint</STRONG> function returns <STRONG>ERR</STRONG> if the  write  operation  aborted  for
+       some  reason.   In  this  case,  <STRONG>errno</STRONG>  will  contain  either  an error
+       associated with <STRONG>write(2)</STRONG> or one of the following:
+
+       ENODEV
+            Capabilities for printer redirection do not exist.
+
+       ENOMEM
+            Couldn't allocate sufficient memory to buffer the printer write.
+
+       When <STRONG>mcprint</STRONG> succeeds, it returns the  number  of  characters  actually
+       sent to the printer.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       The <STRONG>mcprint</STRONG> call was designed for <STRONG><A HREF="ncurses.3x.html">ncurses(3x)</A></STRONG>, and is not found in SVr4
+       curses, 4.4BSD curses, or any other previous version of curses.
+
+
+</PRE><H2><a name="h2-BUGS">BUGS</a></H2><PRE>
+       Padding in the <STRONG>mc5p</STRONG>, <STRONG>mc4</STRONG> and <STRONG>mc5</STRONG> capabilities will not be interpreted.
+
+
+</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_print.3x.html">curs_print(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-BUGS">BUGS</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_printw.3x.html b/doc/html/man/curs_printw.3x.html
new file mode 100644
index 0000000..90a016c
--- /dev/null
+++ b/doc/html/man/curs_printw.3x.html
@@ -0,0 +1,159 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2017 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_printw.3x,v 1.32 2022/02/12 20:05:11 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_printw 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_printw 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_printw.3x.html">curs_printw(3x)</A></STRONG>                                                <STRONG><A HREF="curs_printw.3x.html">curs_printw(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>printw</STRONG>, <STRONG>wprintw</STRONG>, <STRONG>mvprintw</STRONG>, <STRONG>mvwprintw</STRONG>, <STRONG>vwprintw</STRONG>, <STRONG>vw_printw</STRONG> - print
+       formatted output in <STRONG>curses</STRONG> windows
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>printw(const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>fmt</EM><STRONG>,</STRONG> <STRONG>...);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wprintw(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>fmt</EM><STRONG>,</STRONG> <STRONG>...);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvprintw(int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>fmt</EM><STRONG>,</STRONG> <STRONG>...);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvwprintw(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>fmt</EM><STRONG>,</STRONG> <STRONG>...);</STRONG>
+       <STRONG>int</STRONG> <STRONG>vw_printw(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>fmt</EM><STRONG>,</STRONG> <STRONG>va_list</STRONG> <EM>varglist</EM><STRONG>);</STRONG>
+
+       /* obsolete */
+       <STRONG>int</STRONG> <STRONG>vwprintw(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>fmt</EM><STRONG>,</STRONG> <STRONG>va_list</STRONG> <EM>varglist</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The <STRONG>printw</STRONG>, <STRONG>wprintw</STRONG>, <STRONG>mvprintw</STRONG> and <STRONG>mvwprintw</STRONG> routines are  analogous  to
+       <STRONG>printf</STRONG>  [see <STRONG>printf(3)</STRONG>].  In effect, the string that would be output by
+       <STRONG>printf</STRONG> is output instead as though <STRONG>waddstr</STRONG> were used on the given  win-
+       dow.
+
+       The  <STRONG>vwprintw</STRONG>  and  <STRONG>vw_printw</STRONG>  routines  are  analogous to <STRONG>vprintf</STRONG> [see
+       <STRONG>printf(3)</STRONG>] and perform a <STRONG>wprintw</STRONG> using a variable argument  list.   The
+       third  argument  is a <STRONG>va_list</STRONG>, a pointer to a list of arguments, as de-
+       fined in <STRONG>&lt;stdarg.h&gt;</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 com-
+       pletion.
+
+       X/Open defines no error conditions.  In this implementation,  an  error
+       may be returned if it cannot allocate enough memory for the buffer used
+       to format the results.  It will return an error if the  window  pointer
+       is null.
+
+       Functions  with  a  "mv"  prefix  first perform a cursor movement using
+       <STRONG>wmove</STRONG>, and return an error if the position is outside the window, or if
+       the window pointer is null.
+
+
+</PRE><H2><a name="h2-HISTORY">HISTORY</a></H2><PRE>
+       While <STRONG>printw</STRONG> was implemented in 4BSD, it was unused until 4.2BSD (which
+       used it in games).  That early version of curses was before the ANSI  C
+       standard.   It  did not use &lt;varargs.h&gt;, though that was available.  In
+       1991 (a couple of years after SVr4 was generally available,  and  after
+       the  C  standard  was published), other developers updated the library,
+       using &lt;stdarg.h&gt; internally in 4.4BSD curses.  Even with this  improve-
+       ment, BSD curses did not use function prototypes (or even declare func-
+       tions) in the &lt;curses.h&gt; header until 1992.
+
+       SVr2 documented <STRONG>printw</STRONG>, <STRONG>wprintw</STRONG>  tersely  as  "printf  on  <EM>stdscr</EM>"  and
+       tersely as "printf on <EM>win</EM>", respectively.
+
+       SVr3  added  <STRONG>mvprintw</STRONG>,  and <STRONG>mvwprintw</STRONG>, with a three-line summary saying
+       that they were analogous to <STRONG>printf(3)</STRONG>, explaining that the string which
+       would be output from <STRONG>printf(3)</STRONG> would instead be output using <STRONG>waddstr</STRONG> on
+       the given window.  SVr3 also added <STRONG>vwprintw</STRONG>, saying that the third  pa-
+       rameter  is a <STRONG>va_list</STRONG>, defined in &lt;varargs.h&gt;, and referring the reader
+       to the manual pages for <EM>varargs</EM> and <STRONG>vprintf</STRONG> for detailed descriptions.
+
+       SVr4 added  no  new  variations  of  <STRONG>printw</STRONG>,  but  provided  for  using
+       &lt;varargs.h&gt; or &lt;stdarg.h&gt; to define the <STRONG>va_list</STRONG> type.
+
+       X/Open  Curses  added  <STRONG>vw_printw</STRONG>  to replace <STRONG>vwprintw</STRONG>, stating that its
+       <STRONG>va_list</STRONG> definition requires &lt;stdarg.h&gt;.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       In this implementation, <STRONG>vw_printw</STRONG> and <STRONG>vwprintw</STRONG> are equivalent, to  sup-
+       port legacy applications.  However, the latter (<STRONG>vwprintw</STRONG>) is obsolete:
+
+       <STRONG>o</STRONG>   The  XSI  Curses  standard, Issue 4 described these functions.  The
+           function <STRONG>vwprintw</STRONG> is marked TO BE WITHDRAWN, and is to be  replaced
+           by a function <STRONG>vw_printw</STRONG> using the <STRONG>&lt;stdarg.h&gt;</STRONG> interface.
+
+       <STRONG>o</STRONG>   The  Single Unix Specification, Version 2 states that <STRONG>vw_printw</STRONG>  is
+           preferred  to  <STRONG>vwprintw</STRONG>  since  the   latter   requires   including
+           <STRONG>&lt;varargs.h&gt;</STRONG>,  which  cannot be used in the same file as <STRONG>&lt;stdarg.h&gt;</STRONG>.
+           This implementation uses <STRONG>&lt;stdarg.h&gt;</STRONG> for both, because  that  header
+           is included in <STRONG>&lt;curses.h</STRONG>&gt;.
+
+       <STRONG>o</STRONG>   X/Open  Curses, Issue 5 (December 2007) marked <STRONG>vwprintw</STRONG> (along with
+           <STRONG>vwscanw</STRONG> and the termcap interface) as withdrawn.
+
+
+</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_addstr.3x.html">curs_addstr(3x)</A></STRONG>, <STRONG><A HREF="curs_scanw.3x.html">curs_scanw(3x)</A></STRONG>, <STRONG><A HREF="curs_termcap.3x.html">curs_termcap(3x)</A></STRONG>,
+       <STRONG>printf(3)</STRONG>, <STRONG>vprintf(3)</STRONG>.
+
+
+
+                                                               <STRONG><A HREF="curs_printw.3x.html">curs_printw(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-HISTORY">HISTORY</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_refresh.3x.html b/doc/html/man/curs_refresh.3x.html
new file mode 100644
index 0000000..7a81e03
--- /dev/null
+++ b/doc/html/man/curs_refresh.3x.html
@@ -0,0 +1,182 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2016 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_refresh.3x,v 1.25 2022/02/12 20:05:11 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_refresh 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_refresh 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_refresh.3x.html">curs_refresh(3x)</A></STRONG>                                              <STRONG><A HREF="curs_refresh.3x.html">curs_refresh(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>doupdate</STRONG>, <STRONG>redrawwin</STRONG>, <STRONG>refresh</STRONG>, <STRONG>wnoutrefresh</STRONG>, <STRONG>wredrawln</STRONG>, <STRONG>wrefresh</STRONG> -
+       refresh <STRONG>curses</STRONG> windows and lines
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>refresh(void);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wrefresh(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wnoutrefresh(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>doupdate(void);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>redrawwin(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wredrawln(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>beg</EM><STRONG>_</STRONG><EM>line</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>num</EM><STRONG>_</STRONG><EM>lines</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+
+</PRE><H3><a name="h3-refresh_wrefresh">refresh/wrefresh</a></H3><PRE>
+       The <STRONG>refresh</STRONG> and <STRONG>wrefresh</STRONG> routines (or <STRONG>wnoutrefresh</STRONG> and  <STRONG>doupdate</STRONG>)  must
+       be called to get actual output to the terminal, as other routines mere-
+       ly manipulate data structures.  The routine <STRONG>wrefresh</STRONG> copies  the  named
+       window  to  the  <EM>physical</EM>  <EM>screen</EM>,  taking into account what is already
+       there to do optimizations.  The <STRONG>refresh</STRONG> routine is the same, using <STRONG>std-</STRONG>
+       <STRONG>scr</STRONG> as the default window.  Unless <STRONG>leaveok</STRONG> has been enabled, the physi-
+       cal cursor of the terminal is left at the location of  the  cursor  for
+       that window.
+
+
+</PRE><H3><a name="h3-wnoutrefresh_doupdate">wnoutrefresh/doupdate</a></H3><PRE>
+       The <STRONG>wnoutrefresh</STRONG> and <STRONG>doupdate</STRONG> routines allow multiple updates with more
+       efficiency than <STRONG>wrefresh</STRONG> alone.  In addition to all the  window  struc-
+       tures,  <STRONG>curses</STRONG>  keeps  two  data  structures  representing the terminal
+       screen:
+
+       <STRONG>o</STRONG>   a <EM>physical</EM> <EM>screen</EM>, describing what is actually on the screen, and
+
+       <STRONG>o</STRONG>   a <EM>virtual</EM> <EM>screen</EM>, describing what the programmer wants to  have  on
+           the screen.
+
+       The routine <STRONG>wrefresh</STRONG> works by
+
+       <STRONG>o</STRONG>   first  calling  <STRONG>wnoutrefresh</STRONG>,  which copies the named window to the
+           <EM>virtual</EM> <EM>screen</EM>, and
+
+       <STRONG>o</STRONG>   then calling <STRONG>doupdate</STRONG>, which compares the  <EM>virtual</EM>  <EM>screen</EM>  to  the
+           <EM>physical</EM> <EM>screen</EM> and does the actual update.
+
+       If the programmer wishes to output several windows at once, a series of
+       calls to <STRONG>wrefresh</STRONG> results in  alternating  calls  to  <STRONG>wnoutrefresh</STRONG>  and
+       <STRONG>doupdate</STRONG>,  causing  several  bursts  of output to the screen.  By first
+       calling <STRONG>wnoutrefresh</STRONG> for each window, it is then possible to call <STRONG>doup-</STRONG>
+       <STRONG>date</STRONG>  once,  resulting  in  only  one burst of output, with fewer total
+       characters transmitted and less CPU time used.
+
+       If the <EM>win</EM> argument to <STRONG>wrefresh</STRONG> is the <EM>physical</EM> <EM>screen</EM> (i.e., the glob-
+       al  variable  <STRONG>curscr</STRONG>),  the screen is immediately cleared and repainted
+       from scratch.
+
+       The phrase "copies the named window to the virtual screen" above is am-
+       biguous.   What actually happens is that all <EM>touched</EM> (changed) lines in
+       the window are copied to the virtual  screen.   This  affects  programs
+       that use overlapping windows; it means that if two windows overlap, you
+       can refresh them in either order and the overlap region will  be  modi-
+       fied  only  when  it  is  explicitly  changed.  (But see the section on
+       <STRONG>PORTABILITY</STRONG> below for a warning about exploiting this behavior.)
+
+
+</PRE><H3><a name="h3-wredrawln_redrawwin">wredrawln/redrawwin</a></H3><PRE>
+       The <STRONG>wredrawln</STRONG> routine indicates to <STRONG>curses</STRONG> that some  screen  lines  are
+       corrupted  and  should  be  thrown away before anything is written over
+       them.  It touches the indicated lines (marking them changed).  The rou-
+       tine <STRONG>redrawwin</STRONG> touches the entire window.
+
+
+</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  com-
+       pletion.
+
+       X/Open does not define any error conditions.  In this implementation
+
+          <STRONG>wnoutrefresh</STRONG>
+               returns  an error if the window pointer is null, or if the win-
+               dow is really a pad.
+
+          <STRONG>wredrawln</STRONG>
+               returns an error if the associated call to <STRONG>touchln</STRONG>  returns  an
+               error.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       Note that <STRONG>refresh</STRONG> and <STRONG>redrawwin</STRONG> may be macros.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       The XSI Curses standard, Issue 4 describes these functions.
+
+       Whether  <STRONG>wnoutrefresh</STRONG>  copies to the virtual screen the entire contents
+       of a window or just its changed portions has never been well-documented
+       in  historic  curses  versions (including SVr4).  It might be unwise to
+       rely on either behavior in programs that might have to be  linked  with
+       other curses implementations.  Instead, you can do an explicit <STRONG>touchwin</STRONG>
+       before the <STRONG>wnoutrefresh</STRONG> call to guarantee an entire-contents copy  any-
+       where.
+
+
+</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_outopts.3x.html">curs_outopts(3x)</A></STRONG> <STRONG><A HREF="curs_variables.3x.html">curs_variables(3x)</A></STRONG>.
+
+
+
+                                                              <STRONG><A HREF="curs_refresh.3x.html">curs_refresh(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-refresh_wrefresh">refresh/wrefresh</a></li>
+<li><a href="#h3-wnoutrefresh_doupdate">wnoutrefresh/doupdate</a></li>
+<li><a href="#h3-wredrawln_redrawwin">wredrawln/redrawwin</a></li>
+</ul>
+</li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_scanw.3x.html b/doc/html/man/curs_scanw.3x.html
new file mode 100644
index 0000000..19a8e65
--- /dev/null
+++ b/doc/html/man/curs_scanw.3x.html
@@ -0,0 +1,180 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2017 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_scanw.3x,v 1.32 2022/02/12 20:05:11 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_scanw 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_scanw 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_scanw.3x.html">curs_scanw(3x)</A></STRONG>                                                  <STRONG><A HREF="curs_scanw.3x.html">curs_scanw(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>scanw</STRONG>, <STRONG>wscanw</STRONG>, <STRONG>mvscanw</STRONG>, <STRONG>mvwscanw</STRONG>, <STRONG>vwscanw</STRONG>, <STRONG>vw_scanw</STRONG> - convert formatted
+       input from a <STRONG>curses</STRONG> window
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>scanw(const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>fmt</EM><STRONG>,</STRONG> <STRONG>...);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wscanw(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>fmt</EM><STRONG>,</STRONG> <STRONG>...);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvscanw(int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>fmt</EM><STRONG>,</STRONG> <STRONG>...);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvwscanw(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>fmt</EM><STRONG>,</STRONG> <STRONG>...);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>vw_scanw(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>fmt</EM><STRONG>,</STRONG> <STRONG>va_list</STRONG> <EM>varglist</EM><STRONG>);</STRONG>
+
+       /* obsolete */
+       <STRONG>int</STRONG> <STRONG>vwscanw(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>fmt</EM><STRONG>,</STRONG> <STRONG>va_list</STRONG> <EM>varglist</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The <STRONG>scanw</STRONG>, <STRONG>wscanw</STRONG> and <STRONG>mvscanw</STRONG> routines  are  analogous  to  <STRONG>scanf</STRONG>  [see
+       <STRONG>scanf(3)</STRONG>].   The  effect  of  these  routines is as though <STRONG>wgetstr</STRONG> were
+       called on the  window,  and  the  resulting  line  used  as  input  for
+       <STRONG>sscanf(3)</STRONG>.   Fields which do not map to a variable in the <EM>fmt</EM> field are
+       lost.
+
+       The <STRONG>vwscanw</STRONG> and <STRONG>vw_scanw</STRONG> routines are  analogous  to  <STRONG>vscanf(3)</STRONG>.   They
+       perform a <STRONG>wscanw</STRONG> using a variable argument list.  The third argument is
+       a <STRONG>va_list</STRONG>, a pointer to a list of arguments, as defined in <STRONG>&lt;stdarg.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       <STRONG>vwscanw</STRONG> returns <STRONG>ERR</STRONG> on failure and an integer equal to  the  number  of
+       fields scanned on success.
+
+       Applications  may  use the return value from the <STRONG>scanw</STRONG>, <STRONG>wscanw</STRONG>, <STRONG>mvscanw</STRONG>
+       and <STRONG>mvwscanw</STRONG> routines to determine the  number  of  fields  which  were
+       mapped in the call.
+
+       Functions  with  a  "mv"  prefix  first perform a cursor movement using
+       <STRONG>wmove</STRONG>, and return an error if the position is outside the window, or if
+       the window pointer is null.
+
+
+</PRE><H2><a name="h2-HISTORY">HISTORY</a></H2><PRE>
+       While  <STRONG>scanw</STRONG>  was implemented in 4BSD, none of the BSD releases used it
+       until 4.4BSD (in a game).  That early version of curses was before  the
+       ANSI  C  standard.   It  did  not  use  &lt;varargs.h&gt;,  though  that  was
+       available.  In 1991  (a  couple  of  years  after  SVr4  was  generally
+       available,  and  after  the C standard was published), other developers
+       updated the library, using  &lt;stdarg.h&gt;  internally  in  4.4BSD  curses.
+       Even  with this improvement, BSD curses did not use function prototypes
+       (or even declare functions) in the &lt;curses.h&gt; header until 1992.
+
+       SVr2 documented <STRONG>scanw</STRONG>, <STRONG>wscanw</STRONG> tersely as  "scanf  through  <EM>stdscr</EM>"  and
+       tersely as "scanf through <EM>win</EM>", respectively.
+
+       SVr3 added <STRONG>mvscanw</STRONG>, and <STRONG>mvwscanw</STRONG>, with a three-line summary saying that
+       they were analogous to <STRONG>scanf(3)</STRONG>, explaining that the string which would
+       be  output  from  <STRONG>scanf(3)</STRONG> would instead be output using <STRONG>waddstr</STRONG> on the
+       given window.  SVr3 also added <STRONG>vwscanw</STRONG>, saying that the third parameter
+       is  a  <STRONG>va_list</STRONG>, defined in &lt;varargs.h&gt;, and referring the reader to the
+       manual  pages  for  <EM>varargs</EM>  and  <STRONG>vprintf</STRONG>  for  detailed  descriptions.
+       (Because the SVr3 documentation does not mention <STRONG>vscanf</STRONG>, that reference
+       to <STRONG>vprintf</STRONG> may not be an error).
+
+       SVr4  added  no  new  variations  of  <STRONG>scanw</STRONG>,  but  provided  for  using
+       &lt;varargs.h&gt; or &lt;stdarg.h&gt; to define the <STRONG>va_list</STRONG> type.
+
+       X/Open  Curses  added  <STRONG>vw_scanw</STRONG>  to  replace  <STRONG>vwscanw</STRONG>, stating that its
+       <STRONG>va_list</STRONG> definition requires &lt;stdarg.h&gt;.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       In this implementation, <STRONG>vw_scanw</STRONG> and <STRONG>vwscanw</STRONG> are equivalent, to support
+       legacy applications.  However, the latter (<STRONG>vwscanw</STRONG>) is obsolete:
+
+       <STRONG>o</STRONG>   The  XSI Curses standard, Issue 4 described these functions, noting
+           that the function <STRONG>vwscanw</STRONG> is marked TO BE WITHDRAWN, and is  to  be
+           replaced by a function <STRONG>vw_scanw</STRONG> using the <STRONG>&lt;stdarg.h&gt;</STRONG> interface.
+
+       <STRONG>o</STRONG>   The  Single  Unix Specification, Version 2 states that <STRONG>vw_scanw</STRONG>  is
+           preferred  to  <STRONG>vwscanw</STRONG>  since   the   latter   requires   including
+           <STRONG>&lt;varargs.h&gt;</STRONG>,  which  cannot be used in the same file as <STRONG>&lt;stdarg.h&gt;</STRONG>.
+           This implementation uses <STRONG>&lt;stdarg.h&gt;</STRONG> for both, because  that  header
+           is included in <STRONG>&lt;curses.h</STRONG>&gt;.
+
+       <STRONG>o</STRONG>   X/Open  Curses,  Issue 5 (December 2007) marked <STRONG>vwscanw</STRONG> (along with
+           <STRONG>vwprintw</STRONG> and the termcap interface) as withdrawn.
+
+       Both XSI and The Single Unix Specification, Version 2 state that  these
+       functions return <STRONG>ERR</STRONG> or <STRONG>OK</STRONG>.
+
+       <STRONG>o</STRONG>   Since  the  underlying  <STRONG>scanf(3)</STRONG>  can  return  the  number of items
+           scanned, and the SVr4 code was documented to use this feature, this
+           is  probably  an  editing error which was introduced in XSI, rather
+           than being done intentionally.
+
+       <STRONG>o</STRONG>   This implementation  returns  the  number  of  items  scanned,  for
+           compatibility  with  SVr4  curses.   As of 2018, NetBSD curses also
+           returns the number of  items  scanned.   Both  ncurses  and  NetBSD
+           curses call <STRONG>vsscanf</STRONG> to scan the string, which returns <STRONG>EOF</STRONG> on error.
+
+       <STRONG>o</STRONG>   Portable  applications should only test if the return value is <STRONG>ERR</STRONG>,
+           since the <STRONG>OK</STRONG> value (zero) is likely to be misleading.
+
+           One possible way to get useful results  would  be  to  use  a  "%n"
+           conversion at the end of the format string to ensure that something
+           was processed.
+
+
+</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_getstr.3x.html">curs_getstr(3x)</A></STRONG>, <STRONG><A HREF="curs_printw.3x.html">curs_printw(3x)</A></STRONG>, <STRONG><A HREF="curs_termcap.3x.html">curs_termcap(3x)</A></STRONG>,
+       <STRONG>scanf(3)</STRONG>.
+
+
+
+                                                                <STRONG><A HREF="curs_scanw.3x.html">curs_scanw(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-HISTORY">HISTORY</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_scr_dump.3x.html b/doc/html/man/curs_scr_dump.3x.html
new file mode 100644
index 0000000..7f964c9
--- /dev/null
+++ b/doc/html/man/curs_scr_dump.3x.html
@@ -0,0 +1,150 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2017 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_scr_dump.3x,v 1.20 2022/02/12 20:05:11 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_scr_dump 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_scr_dump 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_scr_dump.3x.html">curs_scr_dump(3x)</A></STRONG>                                            <STRONG><A HREF="curs_scr_dump.3x.html">curs_scr_dump(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>scr_dump</STRONG>, <STRONG>scr_restore</STRONG>, <STRONG>scr_init</STRONG>, <STRONG>scr_set</STRONG> - read (write) a <STRONG>curses</STRONG> screen
+       from (to) a file
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>scr_dump(const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>filename</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>scr_restore(const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>filename</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>scr_init(const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>filename</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>scr_set(const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>filename</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+
+</PRE><H3><a name="h3-scr_dump">scr_dump</a></H3><PRE>
+       The <STRONG>scr_dump</STRONG> routine dumps the current contents of the  <EM>virtual</EM>  <EM>screen</EM>
+       to the file <EM>filename</EM>.
+
+
+</PRE><H3><a name="h3-scr_restore">scr_restore</a></H3><PRE>
+       The  <STRONG>scr_restore</STRONG>  routine  sets  the  <EM>virtual</EM> <EM>screen</EM> to the contents of
+       <EM>filename</EM>, which must have been written using <STRONG>scr_dump</STRONG>.  The  next  call
+       to  <STRONG>doupdate</STRONG>  restores  the <EM>physical</EM> <EM>screen</EM> to the way it looked in the
+       dump file.
+
+
+</PRE><H3><a name="h3-scr_init">scr_init</a></H3><PRE>
+       The <STRONG>scr_init</STRONG> routine reads in the contents of <EM>filename</EM> and uses them to
+       initialize the <STRONG>curses</STRONG> data structures about what the terminal currently
+       has on its screen.  If the data is determined to be valid, <STRONG>curses</STRONG> bases
+       its  next update of the screen on this information rather than clearing
+       the  screen  and  starting  from  scratch.   <STRONG>scr_init</STRONG>  is  used   after
+       <STRONG><A HREF="curs_initscr.3x.html">initscr(3x)</A></STRONG>  or  a  <STRONG>system(3)</STRONG>  call  to  share  the screen with another
+       process which has done a <STRONG>scr_dump</STRONG> after its <STRONG><A HREF="curs_initscr.3x.html">endwin(3x)</A></STRONG> call.  The  data
+       is declared invalid
+
+       <STRONG>o</STRONG>   if the terminfo capabilities <STRONG>rmcup</STRONG> and <STRONG>nrrmc</STRONG> exist, also
+
+       <STRONG>o</STRONG>   if  the  terminal  has been written to since the preceding <STRONG>scr_dump</STRONG>
+           call.
+
+
+</PRE><H3><a name="h3-scr_set">scr_set</a></H3><PRE>
+       The <STRONG>scr_set</STRONG> routine is a combination of <STRONG>scr_restore</STRONG> and  <STRONG>scr_init</STRONG>.   It
+       tells the program that the information in <EM>filename</EM> is what is currently
+       on the screen, and also what the program wants on the screen.  This can
+       be thought of as a screen inheritance function.
+
+       To  read  (write)  a window from (to) a file, use the <STRONG>getwin</STRONG> and <STRONG>putwin</STRONG>
+       routines [see <STRONG><A HREF="curs_util.3x.html">curs_util(3x)</A></STRONG>].
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       All routines return the integer <STRONG>ERR</STRONG> upon failure and <STRONG>OK</STRONG> upon success.
+
+       X/Open defines no error conditions.  In this implementation, each  will
+       return an error if the file cannot be opened.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       Note that <STRONG>scr_init</STRONG>, <STRONG>scr_set</STRONG>, and <STRONG>scr_restore</STRONG> may be macros.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       The XSI Curses standard, Issue 4, describes these functions (adding the
+       const qualifiers).
+
+       The SVr4 docs merely say under <STRONG>scr_init</STRONG> that the dump data is also con-
+       sidered invalid "if the time-stamp of the tty is old" but do not define
+       "old".
+
+
+</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_refresh.3x.html">curs_refresh(3x)</A></STRONG>,    <STRONG><A HREF="curs_util.3x.html">curs_util(3x)</A></STRONG>,
+       <STRONG><A HREF="scr_dump.5.html">scr_dump(5)</A></STRONG>, <STRONG>system(3)</STRONG>
+
+
+
+                                                             <STRONG><A HREF="curs_scr_dump.3x.html">curs_scr_dump(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-scr_dump">scr_dump</a></li>
+<li><a href="#h3-scr_restore">scr_restore</a></li>
+<li><a href="#h3-scr_init">scr_init</a></li>
+<li><a href="#h3-scr_set">scr_set</a></li>
+</ul>
+</li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_scroll.3x.html b/doc/html/man/curs_scroll.3x.html
new file mode 100644
index 0000000..4b9fe87
--- /dev/null
+++ b/doc/html/man/curs_scroll.3x.html
@@ -0,0 +1,123 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2006,2010 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_scroll.3x,v 1.22 2022/02/12 20:05:11 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_scroll 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_scroll 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_scroll.3x.html">curs_scroll(3x)</A></STRONG>                                                <STRONG><A HREF="curs_scroll.3x.html">curs_scroll(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>scroll</STRONG>, <STRONG>scrl</STRONG>, <STRONG>wscrl</STRONG> - scroll a <STRONG>curses</STRONG> window
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>scroll(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>scrl(int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wscrl(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The  <STRONG>scroll</STRONG> routine scrolls the window up one line.  This involves mov-
+       ing the lines in the window data structure.  As an optimization, if the
+       scrolling  region  of  the  window  is  the entire screen, the <EM>physical</EM>
+       <EM>screen</EM> may be scrolled at the same time.
+
+       For positive <EM>n</EM>, the <STRONG>scrl</STRONG> and <STRONG>wscrl</STRONG> routines  scroll  the  window  up  <EM>n</EM>
+       lines  (line  <EM>i</EM>+<EM>n</EM> becomes <EM>i</EM>); otherwise scroll the window down <EM>n</EM> lines.
+       This involves moving the lines in the window character image structure.
+       The current cursor position is not changed.
+
+       For these functions to work, scrolling must be enabled via <STRONG>scrollok</STRONG>.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       These routines return <STRONG>ERR</STRONG> upon failure, and <STRONG>OK</STRONG> (SVr4 only specifies "an
+       integer value other than <STRONG>ERR</STRONG>") upon successful completion.
+
+       X/Open defines no error conditions.
+
+       This implementation returns an error if the window pointer is null,  or
+       if scrolling is not enabled in the window, e.g., with <STRONG>scrollok</STRONG>.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       Note that <STRONG>scrl</STRONG> and <STRONG>scroll</STRONG> may be macros.
+
+       The  SVr4  documentation  says  that  the  optimization  of  physically
+       scrolling immediately if the scroll region is the  entire  screen  "is"
+       performed,  not  "may  be" performed.  This implementation deliberately
+       does not guarantee that this will occur, to leave open the  possibility
+       of smarter optimization of multiple scroll actions on the next update.
+
+       Neither  the SVr4 nor the XSI documentation specify whether the current
+       attribute or current color-pair of blanks generated by the scroll func-
+       tion is zeroed.  Under this implementation it is.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       The XSI Curses standard, Issue 4 describes these functions.
+
+
+</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_outopts.3x.html">curs_outopts(3x)</A></STRONG>
+
+
+
+                                                               <STRONG><A HREF="curs_scroll.3x.html">curs_scroll(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_slk.3x.html b/doc/html/man/curs_slk.3x.html
new file mode 100644
index 0000000..84b202d
--- /dev/null
+++ b/doc/html/man/curs_slk.3x.html
@@ -0,0 +1,336 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2016,2017 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_slk.3x,v 1.44 2022/10/29 22:44:14 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_slk 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_slk 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_slk.3x.html">curs_slk(3x)</A></STRONG>                                                      <STRONG><A HREF="curs_slk.3x.html">curs_slk(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>slk_init</STRONG>, <STRONG>slk_set</STRONG>, <STRONG>slk_wset</STRONG>, <STRONG>slk_refresh</STRONG>, <STRONG>slk_noutrefresh</STRONG>, <STRONG>slk_label</STRONG>,
+       <STRONG>slk_clear</STRONG>, <STRONG>slk_restore</STRONG>, <STRONG>slk_touch</STRONG>, <STRONG>slk_attron</STRONG>, <STRONG>slk_attrset</STRONG>,
+       <STRONG>slk_attroff</STRONG>, <STRONG>slk_attr_on</STRONG>, <STRONG>slk_attr_set</STRONG>, <STRONG>slk_attr_off</STRONG>, <STRONG>slk_attr</STRONG>,
+       <STRONG>slk_color</STRONG>, <STRONG>extended_slk_color</STRONG> - <STRONG>curses</STRONG> soft label routines
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>slk_init(int</STRONG> <EM>fmt</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>slk_set(int</STRONG> <EM>labnum</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>label</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>fmt</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>slk_wset(int</STRONG> <EM>labnum</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>wchar_t</STRONG> <STRONG>*</STRONG><EM>label</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>fmt</EM><STRONG>);</STRONG>
+
+       <STRONG>char</STRONG> <STRONG>*slk_label(int</STRONG> <EM>labnum</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>slk_refresh(void);</STRONG>
+       <STRONG>int</STRONG> <STRONG>slk_noutrefresh(void);</STRONG>
+       <STRONG>int</STRONG> <STRONG>slk_clear(void);</STRONG>
+       <STRONG>int</STRONG> <STRONG>slk_restore(void);</STRONG>
+       <STRONG>int</STRONG> <STRONG>slk_touch(void);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>slk_attron(const</STRONG> <STRONG>chtype</STRONG> <EM>attrs</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>slk_attroff(const</STRONG> <STRONG>chtype</STRONG> <EM>attrs</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>slk_attrset(const</STRONG> <STRONG>chtype</STRONG> <EM>attrs</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>slk_attr_on(attr_t</STRONG> <EM>attrs</EM><STRONG>,</STRONG> <STRONG>void*</STRONG> <EM>opts</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>slk_attr_off(const</STRONG> <STRONG>attr_t</STRONG> <EM>attrs</EM><STRONG>,</STRONG> <STRONG>void</STRONG> <STRONG>*</STRONG> <EM>opts</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>slk_attr_set(const</STRONG> <STRONG>attr_t</STRONG> <EM>attrs</EM><STRONG>,</STRONG> <STRONG>short</STRONG> <EM>pair</EM><STRONG>,</STRONG> <STRONG>void*</STRONG> <EM>opts</EM><STRONG>);</STRONG>
+       /* extension */
+       <STRONG>attr_t</STRONG> <STRONG>slk_attr(void);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>slk_color(short</STRONG> <EM>pair</EM><STRONG>);</STRONG>
+       /* extension */
+       <STRONG>int</STRONG> <STRONG>extended_slk_color(int</STRONG> <EM>pair</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The slk* functions manipulate the set of soft function-key labels  that
+       exist on many terminals.  For those terminals that do not have soft la-
+       bels, <STRONG>curses</STRONG> takes over the bottom line of <STRONG>stdscr</STRONG>, reducing the size of
+       <STRONG>stdscr</STRONG>  and the variable <STRONG>LINES</STRONG>.  <STRONG>curses</STRONG> standardizes on eight labels of
+       up to eight characters each.  In addition to this, the  ncurses  imple-
+       mentation  supports  a  mode where it simulates 12 labels of up to five
+       characters each.  This is useful for PC-like enduser devices.   ncurses
+       simulates this mode by taking over up to two lines at the bottom of the
+       screen; it does not try to use any hardware support for this mode.
+
+
+</PRE><H3><a name="h3-Initialization">Initialization</a></H3><PRE>
+       The <STRONG>slk_init</STRONG> routine must  be  called  before  <STRONG>initscr</STRONG>  or  <STRONG>newterm</STRONG>  is
+       called.   If  <STRONG>initscr</STRONG> eventually uses a line from <STRONG>stdscr</STRONG> to emulate the
+       soft labels, then <EM>fmt</EM> determines how the labels  are  arranged  on  the
+       screen:
+
+          <STRONG>0</STRONG>  indicates a 3-2-3 arrangement of the labels.
+
+          <STRONG>1</STRONG>  indicates a 4-4 arrangement
+
+          <STRONG>2</STRONG>  indicates the PC-like 4-4-4 mode.
+
+          <STRONG>3</STRONG>  is again the PC-like 4-4-4 mode, but in addition an index line is
+             generated, helping the user to identify the key numbers easily.
+
+
+</PRE><H3><a name="h3-Labels">Labels</a></H3><PRE>
+       The <STRONG>slk_set</STRONG> routine (and the <STRONG>slk_wset</STRONG> routine  for  the  wide-character
+       library) has three parameters:
+
+          <EM>labnum</EM>
+               is the label number, from <STRONG>1</STRONG> to <STRONG>8</STRONG> (12 if <EM>fmt</EM> in <STRONG>slk_init</STRONG> is <STRONG>2</STRONG> or
+               <STRONG>3</STRONG>);
+
+          <EM>label</EM>
+               is be the string to put on the label, up to eight (five if  <EM>fmt</EM>
+               in  <STRONG>slk_init</STRONG> is <STRONG>2</STRONG> or <STRONG>3</STRONG>) characters in length.  A null string or
+               a null pointer sets up a blank label.
+
+          <EM>fmt</EM>  is either <STRONG>0</STRONG>, <STRONG>1</STRONG>, or <STRONG>2</STRONG>, indicating whether the  label  is  to  be
+               left-justified,  centered,  or  right-justified,  respectively,
+               within the label.
+
+       The <STRONG>slk_label</STRONG> routine returns the current label for label  number  <EM>lab-</EM>
+       <EM>num</EM>, with leading and trailing blanks stripped.
+
+
+</PRE><H3><a name="h3-Screen-updates">Screen updates</a></H3><PRE>
+       The <STRONG>slk_refresh</STRONG> and <STRONG>slk_noutrefresh</STRONG> routines correspond to the <STRONG>wrefresh</STRONG>
+       and <STRONG>wnoutrefresh</STRONG> routines.
+
+       The <STRONG>slk_clear</STRONG> routine clears the soft labels from the screen.
+
+       The <STRONG>slk_restore</STRONG> routine restores the soft labels to the screen after  a
+       <STRONG>slk_clear</STRONG> has been performed.
+
+       The  <STRONG>slk_touch</STRONG> routine forces all the soft labels to be output the next
+       time a <STRONG>slk_noutrefresh</STRONG> is performed.
+
+
+</PRE><H3><a name="h3-Video-attributes">Video attributes</a></H3><PRE>
+       The <STRONG>slk_attron</STRONG>, <STRONG>slk_attrset</STRONG>, <STRONG>slk_attroff</STRONG> and <STRONG>slk_attr</STRONG>  routines  corre-
+       spond  to  <STRONG>attron</STRONG>,  <STRONG>attrset</STRONG>,  <STRONG>attroff</STRONG> and <STRONG>attr_get</STRONG>, respectively.  They
+       have an effect only if soft labels are simulated on the bottom line  of
+       the  screen.   The default highlight for soft keys is A_STANDOUT (as in
+       System V curses, which does not document this fact).
+
+
+</PRE><H3><a name="h3-Colors">Colors</a></H3><PRE>
+       The <STRONG>slk_color</STRONG> routine corresponds to <STRONG>color_set</STRONG>.  It has an effect  only
+       if soft labels are simulated on the bottom line of the screen.
+
+       Because  <STRONG>slk_color</STRONG>  accepts  only <STRONG>short</STRONG> (signed 16-bit integer) values,
+       this implementation provides <STRONG>extended_slk_color</STRONG> which accepts an  inte-
+       ger value, e.g., 32-bits.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       These  routines return <STRONG>ERR</STRONG> upon failure and <STRONG>OK</STRONG> (SVr4 specifies only "an
+       integer value other than <STRONG>ERR</STRONG>") upon successful completion.
+
+       X/Open defines no error conditions.  In this implementation
+
+          <STRONG>slk_attr</STRONG>
+               returns the attribute used for the soft keys.
+
+          <STRONG>slk_attroff</STRONG>, <STRONG>slk_attron</STRONG>, <STRONG>slk_clear</STRONG>, <STRONG>slk_noutrefresh</STRONG>, <STRONG>slk_refresh</STRONG>,
+          <STRONG>slk_touch</STRONG>
+               return  an  error if the terminal or the softkeys were not ini-
+               tialized.
+
+          <STRONG>slk_attrset</STRONG>
+               returns an error if the terminal or the softkeys were not  ini-
+               tialized.
+
+          <STRONG>slk_attr_set</STRONG>
+               returns  an error if the terminal or the softkeys were not ini-
+               tialized, or the  color  pair  is  outside  the  range  0..COL-
+               OR_PAIRS-1.
+
+          <STRONG>slk_color</STRONG>
+               returns  an error if the terminal or the softkeys were not ini-
+               tialized, or the  color  pair  is  outside  the  range  0..COL-
+               OR_PAIRS-1.
+
+          <STRONG>slk_init</STRONG>
+               returns  an  error if the format parameter is outside the range
+               0..3.
+
+          <STRONG>slk_label</STRONG>
+               returns <STRONG>NULL</STRONG> on error.
+
+          <STRONG>slk_set</STRONG>
+               returns an error if the terminal or the softkeys were not  ini-
+               tialized, or the <EM>labnum</EM> parameter is outside the range of label
+               counts, or if the format parameter is outside the  range  0..2,
+               or if memory for the labels cannot be allocated.
+
+
+</PRE><H2><a name="h2-HISTORY">HISTORY</a></H2><PRE>
+       SVr3 introduced these functions:
+         slk_clear
+         slk_init
+         slk_label
+         slk_noutrefresh
+         slk_refresh
+         slk_restore
+         slk_set
+         slk_touch
+
+       SVr4 added these functions:
+         slk_attroff
+         slk_attron
+         slk_attrset
+         slk_start
+
+       X/Open Curses added these:
+         slk_attr_off
+         slk_attr_on
+         slk_attr_set
+         slk_color
+         slk_wset
+
+
+</PRE><H2><a name="h2-EXTENSIONS">EXTENSIONS</a></H2><PRE>
+       X/Open  Curses  documents the <EM>opts</EM> argument as reserved for future use,
+       saying that it must be null.  This implementation uses  that  parameter
+       in ABI 6 for the functions which have a color-pair parameter to support
+       extended color pairs.
+
+       For  functions  which modify the color, e.g., <STRONG>slk_attr_set</STRONG>, if <EM>opts</EM>  is
+       set  it  is  treated  as a pointer to <STRONG>int</STRONG>, and used to  set  the  color
+       pair instead of the <STRONG>short</STRONG> pair parameter.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       Most applications would use <STRONG>slk_noutrefresh</STRONG> because a <STRONG>wrefresh</STRONG> is like-
+       ly to follow soon.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       The  XSI  Curses  standard,  Issue 4, described the soft-key functions,
+       with some differences from SVr4 curses:
+
+       <STRONG>o</STRONG>   It added functions like the SVr4  attribute-manipulation  functions
+           <STRONG>slk_attron</STRONG>,  <STRONG>slk_attroff</STRONG>, <STRONG>slk_attrset</STRONG>, but which use <STRONG>attr_t</STRONG> parame-
+           ters (rather than <STRONG>chtype</STRONG>), along with a reserved <EM>opts</EM> parameter.
+
+           Two of these new functions (unlike the SVr4 functions) have no pro-
+           vision for color: <STRONG>slk_attr_on</STRONG> and <STRONG>slk_attr_off</STRONG>.
+
+           The third function (<STRONG>slk_attr_set</STRONG>) has a color-pair parameter.
+
+       <STRONG>o</STRONG>   It added <STRONG>const</STRONG> qualifiers to parameters (unnecessarily), and
+
+       <STRONG>o</STRONG>   It added <STRONG>slk_color</STRONG>.
+
+       Although  <STRONG>slk_start</STRONG>  is  declared in the curses header file, it was not
+       documented by SVr4 other than its presence in a list of libtermlib.so.1
+       symbols.  Reading the source code (i.e., Illumos):
+
+       <STRONG>o</STRONG>   <STRONG>slk_start</STRONG> has two parameters:
+
+           <STRONG>o</STRONG>   <EM>ng</EM> (number of groups) and
+
+           <STRONG>o</STRONG>   <EM>gp</EM> (group pointer).
+
+       <STRONG>o</STRONG>   Soft-key groups are an array of <EM>ng</EM> integers.
+
+       <STRONG>o</STRONG>   In  SVr4, <STRONG>slk_init</STRONG> calls <STRONG>slk_start</STRONG> passing a null for <EM>gp</EM>.  For this
+           case, <STRONG>slk_start</STRONG> uses the number of groups <EM>ng</EM> (3 for the 3-2-3  lay-
+           out, 2 for the 4-4 layout) which <STRONG>slk_init</STRONG> provided.
+
+           If  <EM>ng</EM>  is  neither  2 or 3, <STRONG>slk_start</STRONG> checks the terminfo <EM>fln</EM> (la-
+           bel_format) capability, interpreting that as a comma-separated list
+           of numbers, e.g., "3,2,3" for the 3-2-3 layout.
+
+           Finally, if there is no <EM>fln</EM> capability, <STRONG>slk_start</STRONG> returns ERR.
+
+       <STRONG>o</STRONG>   If  <STRONG>slk_start</STRONG>  is given a non-null <EM>gp</EM>, it copies the <EM>ng</EM> elements of
+           the group of soft-keys, up to 16.
+
+           If there are more than 16 elements, <STRONG>slk_start</STRONG> returns an error.
+
+       <STRONG>o</STRONG>   The format codes <STRONG>2</STRONG> and <STRONG>3</STRONG> for <STRONG>slk_init</STRONG>  were  added  by  ncurses  in
+           1996.  PDCurses 2.4 added this feature in 2001.
+
+       The function <STRONG>slk_attr</STRONG> was added by ncurses in 1996.
+
+       X/Open  Curses  does  not  specify a limit for the number of colors and
+       color pairs which a terminal can support.  However, in its use of <STRONG>short</STRONG>
+       for  the  parameters,  it carries over SVr4's implementation detail for
+       the compiled terminfo database, which uses signed 16-bit numbers.  This
+       implementation  provides extended versions of those functions which use
+       <STRONG>int</STRONG> parameters, allowing applications to use larger  color-  and  pair-
+       numbers.
+
+
+</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_attr.3x.html">curs_attr(3x)</A></STRONG>,    <STRONG><A HREF="curs_initscr.3x.html">curs_initscr(3x)</A></STRONG>,    <STRONG><A HREF="curs_refresh.3x.html">curs_refresh(3x)</A></STRONG>,
+       <STRONG><A HREF="curs_variables.3x.html">curs_variables(3x)</A></STRONG>.
+
+
+
+                                                                  <STRONG><A HREF="curs_slk.3x.html">curs_slk(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-Labels">Labels</a></li>
+<li><a href="#h3-Screen-updates">Screen updates</a></li>
+<li><a href="#h3-Video-attributes">Video attributes</a></li>
+<li><a href="#h3-Colors">Colors</a></li>
+</ul>
+</li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-HISTORY">HISTORY</a></li>
+<li><a href="#h2-EXTENSIONS">EXTENSIONS</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_sp_funcs.3x.html b/doc/html/man/curs_sp_funcs.3x.html
new file mode 100644
index 0000000..c726d0b
--- /dev/null
+++ b/doc/html/man/curs_sp_funcs.3x.html
@@ -0,0 +1,311 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 2010-2015,2017 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_sp_funcs.3x,v 1.27 2022/02/12 20:05:11 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_sp_funcs 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_sp_funcs 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_sp_funcs.3x.html">curs_sp_funcs(3x)</A></STRONG>                                            <STRONG><A HREF="curs_sp_funcs.3x.html">curs_sp_funcs(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       curs_sp_funcs - <STRONG>curses</STRONG> screen-pointer extension
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>alloc_pair_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>fg</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>bg</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>assume_default_colors_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>fg</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>bg</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>baudrate_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>beep_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>bool</STRONG> <STRONG>can_change_color_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>cbreak_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>color_content_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>short</STRONG> <EM>color</EM><STRONG>,</STRONG> <STRONG>short*</STRONG> <EM>r</EM><STRONG>,</STRONG> <STRONG>short*</STRONG> <EM>g</EM><STRONG>,</STRONG> <STRONG>short*</STRONG> <EM>b</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>curs_set_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>visibility</EM>);
+       <STRONG>int</STRONG> <STRONG>def_prog_mode_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>def_shell_mode_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>define_key_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG> <EM>definition</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>keycode</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>delay_output_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>ms</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>doupdate_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>echo_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>endwin_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>char</STRONG> <STRONG>erasechar_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>erasewchar_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>wchar_t</STRONG> <STRONG>*</STRONG><EM>ch</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>extended_color_content_sp(SCREEN</STRONG> <STRONG>*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>color</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <STRONG>*</STRONG> <EM>r</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <STRONG>*</STRONG> <EM>g</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <STRONG>*</STRONG> <EM>b</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>extended_pair_content_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>pair</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <STRONG>*</STRONG> <EM>fg</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <STRONG>*</STRONG> <EM>bg</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>extended_slk_color_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>pair</EM><STRONG>);</STRONG>
+
+       <STRONG>void</STRONG> <STRONG>filter_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>find_pair_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>fg</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>bg</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>flash_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>flushinp_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>free_pair_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>pair</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>get_escdelay_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>getmouse_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>MEVENT*</STRONG> <STRONG>event);</STRONG>
+       <STRONG>WINDOW*</STRONG> <STRONG>getwin_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>FILE*</STRONG> <EM>filep</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>halfdelay_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>tenths</EM><STRONG>);</STRONG>
+       <STRONG>bool</STRONG> <STRONG>has_colors_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+
+       <STRONG>bool</STRONG> <STRONG>has_ic_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>bool</STRONG> <STRONG>has_il_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>has_key_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>ch</EM><STRONG>);</STRONG>
+       <STRONG>bool</STRONG> <STRONG>has_mouse_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>init_color_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>short</STRONG> <EM>color</EM><STRONG>,</STRONG> <STRONG>short</STRONG> <EM>r</EM><STRONG>,</STRONG> <STRONG>short</STRONG> <EM>g</EM><STRONG>,</STRONG> <STRONG>short</STRONG> <EM>b</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>init_extended_color_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>color</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>r</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>g</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>b</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>init_extended_pair_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>pair</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>fg</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>bg</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>init_pair_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>short</STRONG> <EM>pair</EM><STRONG>,</STRONG> <STRONG>short</STRONG> <EM>fg</EM><STRONG>,</STRONG> <STRONG>short</STRONG> <EM>bg</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>intrflush_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>WINDOW*</STRONG> <EM>win</EM><STRONG>,</STRONG> <STRONG>bool</STRONG> <EM>bf</EM><STRONG>);</STRONG>
+       <STRONG>bool</STRONG> <STRONG>is_term_resized_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>lines</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>columns</EM><STRONG>);</STRONG>
+
+       <STRONG>bool</STRONG> <STRONG>isendwin_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>key_defined_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>definition</EM><STRONG>);</STRONG>
+       <STRONG>char*</STRONG> <STRONG>keybound_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>keycode</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>count</EM><STRONG>);</STRONG>
+       <STRONG>NCURSES_CONST</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG> <STRONG>keyname_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>c</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>keyok_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>keycode</EM><STRONG>,</STRONG> <STRONG>bool</STRONG> <EM>enable</EM><STRONG>);</STRONG>
+       <STRONG>char</STRONG> <STRONG>killchar_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>killwchar_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>wchar_t</STRONG> <STRONG>*</STRONG><EM>ch</EM><STRONG>);</STRONG>
+       <STRONG>char*</STRONG> <STRONG>longname_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mcprint_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>data</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>len</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mouseinterval_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>erval</EM><STRONG>);</STRONG>
+
+       <STRONG>mmask_t</STRONG> <STRONG>mousemask_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>mmask_t</STRONG> <EM>newmask</EM><STRONG>,</STRONG> <STRONG>mmask_t</STRONG> <STRONG>*</STRONG><EM>oldmask</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvcur_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>oldrow</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>oldcol</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>newrow</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>newcol</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>napms_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>ms</EM><STRONG>);</STRONG>
+       <STRONG>WINDOW*</STRONG> <STRONG>newpad_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>nrows</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>ncols</EM><STRONG>);</STRONG>
+       <STRONG>SCREEN*</STRONG> <STRONG>new_prescr(void);</STRONG>
+       <STRONG>SCREEN*</STRONG> <STRONG>newterm_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>type</EM><STRONG>,</STRONG> <STRONG>FILE</STRONG> <STRONG>*</STRONG><EM>outfd</EM><STRONG>,</STRONG> <STRONG>FILE</STRONG> <STRONG>*</STRONG><EM>infd</EM><STRONG>);</STRONG>
+       <STRONG>WINDOW*</STRONG> <STRONG>newwin_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>nlines</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>ncols</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>begin</EM><STRONG>_</STRONG><EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>begin</EM><STRONG>_</STRONG><EM>x</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>nl_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>nocbreak_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>noecho_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+
+       <STRONG>void</STRONG> <STRONG>nofilter_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>nonl_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>void</STRONG> <STRONG>noqiflush_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>noraw_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>pair_content_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>short</STRONG> <EM>pair</EM><STRONG>,</STRONG> <STRONG>short*</STRONG> <EM>fg</EM><STRONG>,</STRONG> <STRONG>short*</STRONG> <EM>bg</EM><STRONG>);</STRONG>
+       <STRONG>void</STRONG> <STRONG>qiflush_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>raw_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>reset_prog_mode_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>void</STRONG> <STRONG>reset_color_pairs_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>reset_shell_mode_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>resetty_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>resize_term_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>lines</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>columns</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>resizeterm_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>lines</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>columns</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>ripoffline_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>line</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <STRONG>(*</STRONG><EM>init</EM><STRONG>)(WINDOW*</STRONG> <EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>fmt</EM><STRONG>));</STRONG>
+       <STRONG>int</STRONG> <STRONG>savetty_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>scr_init_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>filename</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>scr_restore_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>filename</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>scr_set_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>filename</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>set_escdelay_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>ms</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>set_tabsize_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>cols</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>slk_attr_set_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>attr_t</STRONG> <EM>attrs</EM><STRONG>,</STRONG> <STRONG>short</STRONG> <EM>pair</EM><STRONG>,</STRONG> <STRONG>void*</STRONG><EM>opts</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>slk_attrset_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>chtype</STRONG> <EM>a</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>slk_attroff_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>chtype</STRONG> <EM>a</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>slk_attron_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>chtype</STRONG> <EM>a</EM><STRONG>);</STRONG>
+       <STRONG>attr_t</STRONG> <STRONG>slk_attr_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>slk_clear_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>slk_color_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>short</STRONG> <EM>pair</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>slk_init_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>fmt</EM><STRONG>);</STRONG>
+       <STRONG>char*</STRONG> <STRONG>slk_label_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>labnum</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>slk_noutrefresh_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>slk_refresh_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>slk_restore_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>slk_set_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>labnum</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG> <EM>label</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>fmt</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>slk_touch_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>start_color_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>attr_t</STRONG> <STRONG>term_attrs_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>chtype</STRONG> <STRONG>termattrs_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>char*</STRONG> <STRONG>termname_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>typeahead_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>fd</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>unget_wch_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>wchar_t</STRONG> <EM>wch</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>ungetch_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>ch</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>ungetmouse_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,MEVENT</STRONG> <STRONG>*</STRONG> <STRONG>event);</STRONG>
+       <STRONG>int</STRONG> <STRONG>use_default_colors_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>void</STRONG> <STRONG>use_env_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>bool</STRONG> <EM>bf</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>use_legacy_coding_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>level</EM><STRONG>);</STRONG>
+       <STRONG>void</STRONG> <STRONG>use_tioctl_sp(SCREEN</STRONG> <STRONG>*</STRONG><EM>sp</EM><STRONG>,</STRONG> <STRONG>bool</STRONG> <EM>bf</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>vid_attr_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>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>vid_puts_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>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>NCURSES_SP_OUTC</STRONG> <EM>putc</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>vidattr_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>chtype</STRONG> <EM>attrs</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>vidputs_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>chtype</STRONG> <EM>attrs</EM><STRONG>,</STRONG> <STRONG>NCURSES_SP_OUTC</STRONG> <EM>putc</EM><STRONG>);</STRONG>
+       <STRONG>wchar_t*</STRONG> <STRONG>wunctrl_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>ch</EM><STRONG>);</STRONG>
+
+       <STRONG>#include</STRONG> <STRONG>&lt;form.h&gt;</STRONG>
+
+       <STRONG>FORM*</STRONG> <STRONG>new_form_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>FIELD</STRONG> <STRONG>**</STRONG><EM>fields</EM><STRONG>);</STRONG>
+
+       <STRONG>#include</STRONG> <STRONG>&lt;menu.h&gt;</STRONG>
+
+       <STRONG>MENU*</STRONG> <STRONG>new_menu_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>ITEM</STRONG> <STRONG>**</STRONG><EM>items</EM><STRONG>);</STRONG>
+
+       <STRONG>#include</STRONG> <STRONG>&lt;panel.h&gt;</STRONG>
+
+       <STRONG>PANEL*</STRONG> <STRONG>ceiling_panel(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>PANEL*</STRONG> <STRONG>ground_panel(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>void</STRONG> <STRONG>update_panels_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>);</STRONG>
+
+       <STRONG>#include</STRONG> <STRONG>&lt;term.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>del_curterm_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>TERMINAL</STRONG> <STRONG>*</STRONG><EM>oterm</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>putp_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>restartterm_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>NCURSES_CONST</STRONG> <STRONG>char*</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>TERMINAL*</STRONG> <STRONG>set_curterm_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>TERMINAL*</STRONG><EM>nterm</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>tgetent_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>bp</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>name</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>tgetflag_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>capname</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>tgetnum_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>capname</EM><STRONG>);</STRONG>
+       <STRONG>char*</STRONG> <STRONG>tgetstr_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>capname</EM><STRONG>,</STRONG> <STRONG>char</STRONG> <STRONG>**</STRONG><EM>area</EM><STRONG>);</STRONG>
+       <STRONG>char*</STRONG> <STRONG>tgoto_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>capname</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>col</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>row</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>tigetflag_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>capname</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>tigetnum_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>capname</EM><STRONG>);</STRONG>
+       <STRONG>char*</STRONG> <STRONG>tigetstr_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>capname</EM><STRONG>);</STRONG>
+       /* may instead use 9 long parameters */
+       <STRONG>char*</STRONG> <STRONG>tparm_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>,</STRONG> <STRONG>...);</STRONG>
+       <STRONG>int</STRONG> <STRONG>tputs_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>affcnt</EM><STRONG>,</STRONG> <STRONG>NCURSES_SP_OUTC</STRONG> <EM>putc</EM><STRONG>);</STRONG>
+
+       <STRONG>#include</STRONG> <STRONG>&lt;unctrl.h&gt;</STRONG>
+
+       <STRONG>NCURSES_CONST</STRONG> <STRONG>char*</STRONG> <STRONG>unctrl_sp(SCREEN*</STRONG> <EM>sp</EM><STRONG>,</STRONG> <STRONG>chtype</STRONG> <EM>c</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       This  implementation  can  be  configured to provide a set of functions
+       which improve the ability to manage multiple screens.  This feature can
+       be added to any of the configurations supported by ncurses; it adds new
+       entrypoints without changing the meaning of any of the existing ones.
+
+
+</PRE><H3><a name="h3-IMPROVED-FUNCTIONS">IMPROVED FUNCTIONS</a></H3><PRE>
+       Most of the functions are new versions of existing functions.  A param-
+       eter  is  added  at  the  front  of the parameter list.  It is a SCREEN
+       pointer.
+
+       The existing functions all use the current screen, which  is  a  static
+       variable.  The extended functions use the specified screen, thereby re-
+       ducing the number of variables which must be modified to update  multi-
+       ple screens.
+
+
+</PRE><H3><a name="h3-NEW-FUNCTIONS">NEW FUNCTIONS</a></H3><PRE>
+       Here are the new functions:
+
+       ceiling_panel
+            this returns a pointer to the topmost panel in the given screen.
+
+       ground_panel
+            this returns a pointer to the lowest panel in the given screen.
+
+       new_prescr
+            when  creating  a  new  screen,  the library uses static variables
+            which have been preset, e.g.,  by  <STRONG><A HREF="curs_util.3x.html">use_env(3x)</A></STRONG>,  <STRONG><A HREF="curs_util.3x.html">filter(3x)</A></STRONG>,  etc.
+            With  the  screen-pointer extension, there are situations where it
+            must create a current screen before the unextended  library  does.
+            The  <STRONG>new_prescr</STRONG> function is used internally to handle these cases.
+            It is also provided as an entrypoint to allow applications to cus-
+            tomize the library initialization.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       This extension introduces some new names:
+
+       NCURSES_SP_FUNCS
+            This  is set to the library patch-level number.  In the unextended
+            library, this is zero (0), to make it useful for checking  if  the
+            extension is provided.
+
+       NCURSES_SP_NAME
+            The new functions are named using the macro <EM>NCURSES</EM><STRONG>_</STRONG><EM>SP</EM><STRONG>_</STRONG><EM>NAME</EM>, which
+            hides the actual implementation.  Currently this adds a "_sp" suf-
+            fix  to the name of the unextended function.  This manual page in-
+            dexes the extensions showing the full name.   However  the  proper
+            usage of these functions uses the macro, to provide for the possi-
+            bility of changing the naming convention for specific library con-
+            figurations.
+
+       NCURSES_SP_OUTC
+            This  is  a new function-pointer type to use in the screen-pointer
+            functions where an <EM>NCURSES</EM><STRONG>_</STRONG><EM>OUTC</EM> is used in the unextended library.
+
+       NCURSES_OUTC
+            This is a function-pointer type used for the cases where  a  func-
+            tion passes characters to the output stream, e.g., <STRONG><A HREF="curs_terminfo.3x.html">vidputs(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These  routines  are  specific  to ncurses.  They were not supported on
+       Version 7, BSD or System V implementations.  It is recommended that any
+       code  depending  on  ncurses  extensions  be  conditioned  using <EM>NCURS-</EM>
+       <EM>ES</EM><STRONG>_</STRONG><EM>SP</EM><STRONG>_</STRONG><EM>FUNCS</EM>.
+
+
+</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_opaque.3x.html">curs_opaque(3x)</A></STRONG>, <STRONG><A HREF="curs_threads.3x.html">curs_threads(3x)</A></STRONG>.
+
+
+
+                                                             <STRONG><A HREF="curs_sp_funcs.3x.html">curs_sp_funcs(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-IMPROVED-FUNCTIONS">IMPROVED FUNCTIONS</a></li>
+<li><a href="#h3-NEW-FUNCTIONS">NEW FUNCTIONS</a></li>
+</ul>
+</li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_termattrs.3x.html b/doc/html/man/curs_termattrs.3x.html
new file mode 100644
index 0000000..bc8b9c1
--- /dev/null
+++ b/doc/html/man/curs_termattrs.3x.html
@@ -0,0 +1,176 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2015 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_termattrs.3x,v 1.19 2022/02/12 20:05:11 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_termattrs 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_termattrs 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_termattrs.3x.html">curs_termattrs(3x)</A></STRONG>                                          <STRONG><A HREF="curs_termattrs.3x.html">curs_termattrs(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>baudrate</STRONG>,  <STRONG>erasechar</STRONG>,  <STRONG>erasewchar</STRONG>, <STRONG>has_ic</STRONG>, <STRONG>has_il</STRONG>, <STRONG>killchar</STRONG>, <STRONG>killwchar</STRONG>,
+       <STRONG>longname</STRONG>, <STRONG>term_attrs</STRONG>, <STRONG>termattrs</STRONG>, <STRONG>termname</STRONG> -  <STRONG>curses</STRONG>  environment  query
+       routines
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>baudrate(void);</STRONG>
+       <STRONG>char</STRONG> <STRONG>erasechar(void);</STRONG>
+       <STRONG>int</STRONG> <STRONG>erasewchar(wchar_t</STRONG> <STRONG>*</STRONG><EM>ch</EM><STRONG>);</STRONG>
+       <STRONG>bool</STRONG> <STRONG>has_ic(void);</STRONG>
+       <STRONG>bool</STRONG> <STRONG>has_il(void);</STRONG>
+       <STRONG>char</STRONG> <STRONG>killchar(void);</STRONG>
+       <STRONG>int</STRONG> <STRONG>killwchar(wchar_t</STRONG> <STRONG>*</STRONG><EM>ch</EM><STRONG>);</STRONG>
+       <STRONG>char</STRONG> <STRONG>*longname(void);</STRONG>
+       <STRONG>attr_t</STRONG> <STRONG>term_attrs(void);</STRONG>
+       <STRONG>chtype</STRONG> <STRONG>termattrs(void);</STRONG>
+       <STRONG>char</STRONG> <STRONG>*termname(void);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+
+</PRE><H3><a name="h3-baudrate">baudrate</a></H3><PRE>
+       The  <STRONG>baudrate</STRONG>  routine  returns  the output speed of the terminal.  The
+       number returned is in bits per second, for  example  <STRONG>9600</STRONG>,  and  is  an
+       integer.
+
+
+</PRE><H3><a name="h3-erasechar_-erasewchar">erasechar, erasewchar</a></H3><PRE>
+       The <STRONG>erasechar</STRONG> routine returns the user's current erase character.
+
+       The  <STRONG>erasewchar</STRONG>  routine  stores  the  current  erase  character in the
+       location referenced by <EM>ch</EM>.  If no erase character has been defined, the
+       routine fails and the location referenced by <EM>ch</EM> is not changed.
+
+
+</PRE><H3><a name="h3-has_is_-has_il">has_is, has_il</a></H3><PRE>
+       The  <STRONG>has_ic</STRONG>  routine  is  true  if the terminal has insert- and delete-
+       character capabilities.
+
+       The <STRONG>has_il</STRONG> routine is true if the terminal has insert- and  delete-line
+       capabilities, or can simulate them using scrolling regions.  This might
+       be used to determine if it would be appropriate  to  turn  on  physical
+       scrolling using <STRONG>scrollok</STRONG>.
+
+
+</PRE><H3><a name="h3-killchar_-killwchar">killchar, killwchar</a></H3><PRE>
+       The <STRONG>killchar</STRONG> routine returns the user's current line kill character.
+
+       The  <STRONG>killwchar</STRONG>  routine  stores  the current line-kill character in the
+       location referenced by <EM>ch</EM>.  If no line-kill character has been defined,
+       the routine fails and the location referenced by <EM>ch</EM> is not changed.
+
+
+</PRE><H3><a name="h3-longname">longname</a></H3><PRE>
+       The  <STRONG>longname</STRONG>  routine  returns a pointer to a static area containing a
+       verbose description of the current terminal.  The maximum length  of  a
+       verbose  description  is  128 characters.  It is defined only after the
+       call to <STRONG>initscr</STRONG> or <STRONG>newterm</STRONG>.  The area is overwritten by  each  call  to
+       <STRONG>newterm</STRONG>  and  is not restored by <STRONG>set_term</STRONG>, so the value should be saved
+       between calls to <STRONG>newterm</STRONG> if <STRONG>longname</STRONG> is going to be used with  multiple
+       terminals.
+
+
+</PRE><H3><a name="h3-termattrs_-term_attrs">termattrs, term_attrs</a></H3><PRE>
+       If  a  given  terminal  does  not  support  a  video  attribute that an
+       application program is trying to use, <STRONG>curses</STRONG> may substitute a different
+       video  attribute for it.  The <STRONG>termattrs</STRONG> and <STRONG>term_attrs</STRONG> functions return
+       a logical <STRONG>OR</STRONG> of all video attributes supported by the terminal using <STRONG>A_</STRONG>
+       and  <STRONG>WA_</STRONG>  constants  respectively.   This  information is useful when a
+       <STRONG>curses</STRONG> program needs  complete  control  over  the  appearance  of  the
+       screen.
+
+
+</PRE><H3><a name="h3-termname">termname</a></H3><PRE>
+       The <STRONG>termname</STRONG> routine returns the terminal name used by <STRONG>setupterm</STRONG>.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       <STRONG>longname</STRONG> and <STRONG>termname</STRONG> return <STRONG>NULL</STRONG> on error.
+
+       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.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       Note that <STRONG>termattrs</STRONG> may be a macro.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       The XSI Curses standard, Issue 4 describes these functions.  It changes
+       the return type of <STRONG>termattrs</STRONG> to the new type <STRONG>attr_t</STRONG>.  Most versions  of
+       curses truncate the result returned by <STRONG>termname</STRONG> to 14 characters.
+
+
+</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_outopts.3x.html">curs_outopts(3x)</A></STRONG>
+
+
+
+                                                            <STRONG><A HREF="curs_termattrs.3x.html">curs_termattrs(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-baudrate">baudrate</a></li>
+<li><a href="#h3-erasechar_-erasewchar">erasechar, erasewchar</a></li>
+<li><a href="#h3-has_is_-has_il">has_is, has_il</a></li>
+<li><a href="#h3-killchar_-killwchar">killchar, killwchar</a></li>
+<li><a href="#h3-longname">longname</a></li>
+<li><a href="#h3-termattrs_-term_attrs">termattrs, term_attrs</a></li>
+<li><a href="#h3-termname">termname</a></li>
+</ul>
+</li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_termcap.3x.html b/doc/html/man/curs_termcap.3x.html
new file mode 100644
index 0000000..9cd555e
--- /dev/null
+++ b/doc/html/man/curs_termcap.3x.html
@@ -0,0 +1,368 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2022,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2017,2018 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_termcap.3x,v 1.56 2022/02/12 20:05:11 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_termcap 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_termcap 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_termcap.3x.html">curs_termcap(3x)</A></STRONG>                                              <STRONG><A HREF="curs_termcap.3x.html">curs_termcap(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>PC</STRONG>, <STRONG>UP</STRONG>, <STRONG>BC</STRONG>, <STRONG>ospeed</STRONG>, <STRONG>tgetent</STRONG>, <STRONG>tgetflag</STRONG>, <STRONG>tgetnum</STRONG>, <STRONG>tgetstr</STRONG>, <STRONG>tgoto</STRONG>, <STRONG>tputs</STRONG> -
+       <STRONG>curses</STRONG> emulation of termcap
+
+
+</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>extern</STRONG> <STRONG>char</STRONG> <STRONG>PC;</STRONG>
+       <STRONG>extern</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG> <STRONG>UP;</STRONG>
+       <STRONG>extern</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG> <STRONG>BC;</STRONG>
+       <STRONG>extern</STRONG> <STRONG>short</STRONG> <STRONG>ospeed;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>tgetent(char</STRONG> <STRONG>*</STRONG><EM>bp</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>name</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>tgetflag(const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>id</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>tgetnum(const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>id</EM><STRONG>);</STRONG>
+       <STRONG>char</STRONG> <STRONG>*tgetstr(const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>id</EM><STRONG>,</STRONG> <STRONG>char</STRONG> <STRONG>**</STRONG><EM>area</EM><STRONG>);</STRONG>
+       <STRONG>char</STRONG> <STRONG>*tgoto(const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>cap</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>col</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>row</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>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       These routines are included as a conversion aid for programs  that  use
+       the  <EM>termcap</EM>  library.  Their parameters are the same, but the routines
+       are emulated using the <EM>terminfo</EM> database.  Thus, they can only be  used
+       to  query  the  capabilities  of entries for which a terminfo entry has
+       been compiled.
+
+
+</PRE><H3><a name="h3-Initialization">Initialization</a></H3><PRE>
+       The <STRONG>tgetent</STRONG> routine loads the entry for <EM>name</EM>.  It returns:
+
+          1  on success,
+
+          0  if there is no such entry (or that it is a generic  type,  having
+             too little information for curses applications to run), and
+
+          -1 if the terminfo database could not be found.
+
+       This differs from the <EM>termcap</EM> library in two ways:
+
+          <STRONG>o</STRONG>   The  emulation  ignores  the buffer pointer <EM>bp</EM>.  The <EM>termcap</EM> li-
+              brary would store a copy of the terminal description in the area
+              referenced  by this pointer.  However, ncurses stores its termi-
+              nal descriptions in compiled binary form, which is not the  same
+              thing.
+
+          <STRONG>o</STRONG>   There is a difference in return codes.  The <EM>termcap</EM> library does
+              not check if the terminal description is marked with the <EM>generic</EM>
+              capability,  or  if the terminal description has cursor-address-
+              ing.
+
+
+</PRE><H3><a name="h3-Capability-Values">Capability Values</a></H3><PRE>
+       The <STRONG>tgetflag</STRONG> routine gets the boolean entry for <EM>id</EM>, or zero  if  it  is
+       not available.
+
+       The  <STRONG>tgetnum</STRONG>  routine gets the numeric entry for <EM>id</EM>, or -1 if it is not
+       available.
+
+       The <STRONG>tgetstr</STRONG> routine returns the string entry for <EM>id</EM>, or zero if  it  is
+       not  available.  Use <STRONG>tputs</STRONG> to output the returned string.  The <EM>area</EM> pa-
+       rameter is used as follows:
+
+          <STRONG>o</STRONG>   It is assumed to be the address of a pointer to a buffer managed
+              by the calling application.
+
+          <STRONG>o</STRONG>   However, ncurses checks to ensure that <STRONG>area</STRONG> is not NULL, and al-
+              so that the resulting buffer pointer is  not  NULL.   If  either
+              check fails, the <EM>area</EM> parameter is ignored.
+
+          <STRONG>o</STRONG>   If  the  checks succeed, ncurses also copies the return value to
+              the buffer pointed to by <EM>area</EM>, and the <EM>area</EM> value will be updat-
+              ed to point past the null ending this value.
+
+          <STRONG>o</STRONG>   The  return  value itself is an address in the terminal descrip-
+              tion which is loaded into memory.
+
+       Only the first two characters of the <STRONG>id</STRONG> parameter of <STRONG>tgetflag</STRONG>,  <STRONG>tgetnum</STRONG>
+       and <STRONG>tgetstr</STRONG> are compared in lookups.
+
+
+</PRE><H3><a name="h3-Formatting-Capabilities">Formatting Capabilities</a></H3><PRE>
+       The <STRONG>tgoto</STRONG> routine expands the given capability using the parameters.
+
+       <STRONG>o</STRONG>   Because  the  capability may have padding characters, the output of
+           <STRONG>tgoto</STRONG> should be passed to <STRONG>tputs</STRONG> rather than some other output func-
+           tion such as <STRONG>printf(3)</STRONG>.
+
+       <STRONG>o</STRONG>   While  <STRONG>tgoto</STRONG> is assumed to be used for the two-parameter cursor po-
+           sitioning capability, termcap applications also use it for  single-
+           parameter capabilities.
+
+           Doing this shows a quirk in <STRONG>tgoto</STRONG>: most hardware terminals use cur-
+           sor addressing with <EM>row</EM> first, but the original developers  of  the
+           termcap  interface  chose  to  put the <EM>column</EM> parameter first.  The
+           <STRONG>tgoto</STRONG> function swaps the order of parameters.  It  does  this  also
+           for  calls  requiring  only  a single parameter.  In that case, the
+           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).
+
+           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.
+       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
+       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
+       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-
+       minfo.
+
+       On the other hand, terminfo allocates memory.  It uses <STRONG>setupterm</STRONG> to re-
+       trieve the data used by <STRONG>tgetent</STRONG> and the functions which return capabil-
+       ity values such as <STRONG>tgetstr</STRONG>.  One could use
+
+            <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-
+       gram relies upon this arrangement, to improve its performance.
+
+       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
+       than <STRONG>ERR</STRONG>") upon successful completion.
+
+       Routines that return pointers return <STRONG>NULL</STRONG> on 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
+       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 "$&lt;..&gt;" 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-
+       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
+           have been configured to support the BSD-style padding.
+
+           In that case, <STRONG>tputs</STRONG> inspects strings passed to it, looking for dig-
+           its at the beginning of the string.
+
+           <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
+       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
+       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
+           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,
+       Version 2 rather than in ncurses.
+
+
+</PRE><H3><a name="h3-Compatibility-with-BSD-Termcap">Compatibility with BSD Termcap</a></H3><PRE>
+       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>
+       <STRONG>peed</STRONG>.
+
+       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
+       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-
+           tion.  You should not rely upon this behavior in portable programs.
+           This implementation disallows matches against single-character  ca-
+           pability names.
+
+       <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
+       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-
+       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
+       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.
+           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
+           <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>
+           <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
+       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
+       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
+       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
+       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>   it provided function prototypes (using <STRONG>const</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
+       termcap library interfaces.
+
+
+</PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
+       <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG>, <STRONG>putc(3)</STRONG>, <STRONG><A HREF="term_variables.3x.html">term_variables(3x)</A></STRONG>, <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG>.
+
+       https://invisible-island.net/ncurses/tctest.html
+
+
+
+                                                              <STRONG><A HREF="curs_termcap.3x.html">curs_termcap(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-Capability-Values">Capability Values</a></li>
+<li><a href="#h3-Formatting-Capabilities">Formatting Capabilities</a></li>
+<li><a href="#h3-Global-Variables">Global Variables</a></li>
+<li><a href="#h3-Releasing-Memory">Releasing Memory</a></li>
+</ul>
+</li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-BUGS">BUGS</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a>
+<ul>
+<li><a href="#h3-Standards">Standards</a></li>
+<li><a href="#h3-Compatibility-with-BSD-Termcap">Compatibility with BSD Termcap</a></li>
+<li><a href="#h3-Other-Compatibility">Other Compatibility</a></li>
+</ul>
+</li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_terminfo.3x.html b/doc/html/man/curs_terminfo.3x.html
new file mode 100644
index 0000000..c50d7db
--- /dev/null
+++ b/doc/html/man/curs_terminfo.3x.html
@@ -0,0 +1,651 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2022,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2016,2017 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.82 2022/06/04 22:47:05 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_terminfo 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</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>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>TERMINAL</STRONG> <STRONG>*cur_term;</STRONG>
+
+       <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG> <STRONG>const</STRONG> <STRONG>boolnames[];</STRONG>
+       <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG> <STRONG>const</STRONG> <STRONG>boolcodes[];</STRONG>
+       <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG> <STRONG>const</STRONG> <STRONG>boolfnames[];</STRONG>
+       <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG> <STRONG>const</STRONG> <STRONG>numnames[];</STRONG>
+       <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG> <STRONG>const</STRONG> <STRONG>numcodes[];</STRONG>
+       <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG> <STRONG>const</STRONG> <STRONG>numfnames[];</STRONG>
+       <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG> <STRONG>const</STRONG> <STRONG>strnames[];</STRONG>
+       <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG> <STRONG>const</STRONG> <STRONG>strcodes[];</STRONG>
+       <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG> <STRONG>const</STRONG> <STRONG>strfnames[];</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>setupterm(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>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(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>
+       <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(const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>capname</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>tigetnum(const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>capname</EM><STRONG>);</STRONG>
+       <STRONG>char</STRONG> <STRONG>*tigetstr(const</STRONG> <STRONG>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 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
+       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
+           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
+       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-
+       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>
+       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>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
+           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 exiting [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, 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.
+
+          <EM>errret</EM>
+               points to an optional location where an error status can be re-
+               turned  to  the  caller.  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>errret</EM>.  A return value of <STRONG>OK</STRONG> combined with sta-
+               tus 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 <STRONG>hc</STRONG> (<STRONG>hardcopy</STRONG>) 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 <STRONG>gn</STRONG> (<STRONG>generic</STRONG>) 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 find-
+               ing 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>stdout</STRONG>.
+
+
+</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
+       applications.
+
+       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 termi-
+       nal's capabilities in memory.  If it is called for  different  terminal
+       types,  <STRONG>setupterm</STRONG>  allocates new storage for each set of terminal capa-
+       bilities.
+
+       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>, refer-
+       ences to any of the <STRONG>terminfo</STRONG> boolean,  numeric,  and  string  variables
+       thereafter  may  refer  to  invalid  memory locations until another <STRONG>se-</STRONG>
+       <STRONG>tupterm</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 exam-
+       ple, 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  parameters  <EM>pi</EM>.   A
+       pointer  is  returned to the result of <EM>str</EM> with the parameters applied.
+       Application developers should keep in mind these quirks of  the  inter-
+       face:
+
+       <STRONG>o</STRONG>   Although  <STRONG>tparm</STRONG>'s actual parameters may be integers or strings, the
+           prototype expects <STRONG>long</STRONG> (integer) values.
+
+       <STRONG>o</STRONG>   Aside from the <STRONG>set_attributes</STRONG> (<STRONG>sgr</STRONG>) capability, most terminal capa-
+           bilities require no more than one or two parameters.
+
+       <STRONG>o</STRONG>   Padding  information  is  ignored  by  <STRONG>tparm</STRONG>;  it is interpreted by
+           <STRONG>tputs</STRONG>.
+
+       <STRONG>o</STRONG>   The capability string is  null-terminated.   Use  "\200"  where  an
+           ASCII NUL is needed in the output.
+
+       <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 parameters 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 (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
+           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-
+           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,
+           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-
+       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
+       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.,
+
+       <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
+       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
+       <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).
+
+       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
+       this (see <EM>HISTORY</EM>).
+
+
+</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>capname</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 description.
+
+       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 description.
+
+       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 description.
+
+
+</PRE><H3><a name="h3-Terminal-Capability-Names">Terminal Capability Names</a></H3><PRE>
+       These null-terminated arrays contain
+
+       <STRONG>o</STRONG>   the short terminfo names ("codes"),
+
+       <STRONG>o</STRONG>   the <STRONG>termcap</STRONG> names ("names"), and
+
+       <STRONG>o</STRONG>   the long terminfo names ("fnames")
+
+       for each of the predefined <STRONG>terminfo</STRONG> variables:
+
+              <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*boolnames[]</STRONG>, <STRONG>*boolcodes[]</STRONG>, <STRONG>*boolfnames[]</STRONG>
+              <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*numnames[]</STRONG>, <STRONG>*numcodes[]</STRONG>, <STRONG>*numfnames[]</STRONG>
+              <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*strnames[]</STRONG>, <STRONG>*strcodes[]</STRONG>, <STRONG>*strfnames[]</STRONG>
+
+
+</PRE><H3><a name="h3-Releasing-Memory">Releasing Memory</a></H3><PRE>
+       Each successful call to <STRONG>setupterm</STRONG> allocates memory to hold the terminal
+       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>
+
+       the memory will be freed.
+
+       The formatting functions <STRONG>tparm</STRONG> and <STRONG>tiparm</STRONG> extend the storage  allocated
+       by <STRONG>setupterm</STRONG>:
+
+       <STRONG>o</STRONG>   the  "static"  terminfo variables [a-z].  Before ncurses 6.3, those
+           were shared by all screens.  With ncurses 6.3, those are  allocated
+           per screen.  See <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG> for details.
+
+       <STRONG>o</STRONG>   to  improve performance, ncurses 6.3 caches the result of analyzing
+           terminfo strings for their parameter types.  That is  stored  as  a
+           binary tree referenced from the <STRONG>TERMINAL</STRONG> structure.
+
+       The higher-level <STRONG>initscr</STRONG> and <STRONG>newterm</STRONG> functions use <STRONG>setupterm</STRONG>.  Normally
+       they do not free this memory, but it is possible to do that  using  the
+       <STRONG><A HREF="curs_initscr.3x.html">delscreen(3x)</A></STRONG> function.
+
+
+</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  com-
+       pletion, 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 implementation
+
+          <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>setupterm</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 con-
+               ditions 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><H3><a name="h3-Compatibility-macros">Compatibility macros</a></H3><PRE>
+       This implementation provides a few macros for compatibility  with  sys-
+       tems  before  SVr4  (see  <EM>HISTORY</EM>).   Those  include  <STRONG>crmode</STRONG>,  <STRONG>fixterm</STRONG>,
+       <STRONG>gettmode</STRONG>, <STRONG>nocrmode</STRONG>, <STRONG>resetterm</STRONG>, <STRONG>saveterm</STRONG>, and <STRONG>setterm</STRONG>.
+
+       In SVr4, those are found in <STRONG>&lt;curses.h&gt;</STRONG>, but  except  for  <STRONG>setterm</STRONG>,  are
+       likewise macros.  The one function, <STRONG>setterm</STRONG>, is mentioned in the manual
+       page.  The manual page notes that the <STRONG>setterm</STRONG> routine was  replaced  by
+       <STRONG>setupterm</STRONG>, stating that 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>, and is not recommend-
+       ed for new programs.  This implementation provides each of  those  sym-
+       bols as macros for BSD compatibility,
+
+
+</PRE><H2><a name="h2-HISTORY">HISTORY</a></H2><PRE>
+       SVr2 introduced the terminfo feature.  Its programming manual mentioned
+       these low-level functions:
+
+       <STRONG>Function</STRONG>    <STRONG>Description</STRONG>
+       ------------------------------------------------------------
+       fixterm     restore tty to "in curses" state
+       gettmode    establish current tty modes
+       mvcur       low level cursor motion
+       putp        utility function that uses <STRONG>tputs</STRONG> to send  char-
+                   acters via <STRONG>putchar</STRONG>.
+       resetterm   set tty modes to "out of curses" state
+       resetty     reset tty flags to stored value
+       saveterm    save current modes as "in curses" state
+       savetty     store current tty flags
+       setterm     establish terminal with given type
+       setupterm   establish terminal with given type
+       tparm       instantiate a string expression with parameters
+       tputs       apply padding information to a string
+       vidattr     like <STRONG>vidputs</STRONG>, but outputs through <STRONG>putchar</STRONG>
+       vidputs     output  a string to put terminal in a specified
+                   video attribute mode
+
+       The programming manual also mentioned functions  provided  for  termcap
+       compatibility (commenting that they "may go away at a later date"):
+
+       <STRONG>Function</STRONG>   <STRONG>Description</STRONG>
+       ------------------------------------------------
+       tgetent    look up termcap entry for given <EM>name</EM>
+       tgetflag   get boolean entry for given <EM>id</EM>
+       tgetnum    get numeric entry for given <EM>id</EM>
+       tgetstr    get string entry for given <EM>id</EM>
+       tgoto      apply parameters to given capability
+       tputs      apply padding to capability, calling
+                  a function to put characters
+
+       Early terminfo programs obtained capability values  from  the  <STRONG>TERMINAL</STRONG>
+       structure initialized by <STRONG>setupterm</STRONG>.
+
+       SVr3  extended terminfo by adding functions to retrieve capability val-
+       ues (like the termcap interface), and reusing tgoto and tputs:
+
+       <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>
+
+       SVr3 also replaced several of the SVr2 terminfo functions which had  no
+       counterpart in the termcap interface, documenting them as obsolete:
+
+       <STRONG>Function</STRONG>    <STRONG>Replaced</STRONG> <STRONG>by</STRONG>
+       -----------------------------
+       crmode      cbreak
+       fixterm     reset_prog_mode
+       gettmode    N/A
+       nocrmode    nocbreak
+       resetterm   reset_shell_mode
+       saveterm    def_prog_mode
+       setterm     setupterm
+
+       SVr3  kept  the  <STRONG>mvcur</STRONG>, <STRONG>vidattr</STRONG> and <STRONG>vidputs</STRONG> functions, along with <STRONG>putp</STRONG>,
+       <STRONG>tparm</STRONG> and <STRONG>tputs</STRONG>.  The latter were needed to support padding,  and  han-
+       dling  functions  such as <STRONG>vidattr</STRONG> (which used more than the two parame-
+       ters supported by <STRONG>tgoto</STRONG>).
+
+       SVr3 introduced the functions for switching between  terminal  descrip-
+       tions, e.g., <STRONG>set_curterm</STRONG>.  Some of that was incremental improvements to
+       the SVr2 library:
+
+       <STRONG>o</STRONG>   The <STRONG>TERMINAL</STRONG> type definition was introduced  in  SVr3.01,  for  the
+           <STRONG>term</STRONG> structure provided in SVr2.
+
+       <STRONG>o</STRONG>   The  various  global  variables such as <STRONG>boolnames</STRONG> were mentioned in
+           the programming manual at this point,  though  the  variables  were
+           provided in SVr2.
+
+       SVr4 added the <STRONG>vid_attr</STRONG> and <STRONG>vid_puts</STRONG> functions.
+
+       There are other low-level functions declared in the curses header files
+       on Unix systems, but none were documented.  The functions marked "obso-
+       lete" remained in use by the Unix <STRONG>vi(1)</STRONG> editor.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+
+</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.
+
+       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.
+
+
+</PRE><H3><a name="h3-Legacy-data">Legacy data</a></H3><PRE>
+       <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.
+
+       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><H3><a name="h3-Output-buffering">Output buffering</a></H3><PRE>
+       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 addition to the limitation that the ter-
+       minal was left in block-buffered mode on exit (like System  V  curses),
+       it  was  problematic  because  <STRONG>ncurses</STRONG>  did not allow a reliable way to
+       cleanup on receiving SIGTSTP.
+
+       The current version (ncurses6) 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-lev-
+       el functions in <STRONG>ncurses</STRONG> use alternate versions of these functions using
+       the more reliable buffering scheme.
+
+
+</PRE><H3><a name="h3-Function-prototypes">Function prototypes</a></H3><PRE>
+       The X/Open Curses prototypes are based on the SVr4 curses header decla-
+       rations,  which  were defined at the same time the C language was first
+       standardized in the late 1980s.
+
+       <STRONG>o</STRONG>   X/Open Curses uses <STRONG>const</STRONG>  less  effectively  than  a  later  design
+           might,  in  some cases applying it needlessly to values are already
+           constant, and in most cases overlooking parameters  which  normally
+           would  use <STRONG>const</STRONG>.  Using constant parameters for functions which do
+           not use <STRONG>const</STRONG> may prevent the program from compiling.  On the other
+           hand, <EM>writable</EM> <EM>strings</EM> are an obsolescent feature.
+
+           As  an  extension,  this implementation can be configured to change
+           the function prototypes to use the <STRONG>const</STRONG> keyword.  The ncurses  ABI
+           6 enables this feature by default.
+
+       <STRONG>o</STRONG>   X/Open  Curses  prototypes <STRONG>tparm</STRONG> with a fixed number of parameters,
+           rather than a variable argument list.
+
+           This implementation uses a variable argument list, but can be  con-
+           figured  to  use  the  fixed-parameter list.  Portable applications
+           should provide 9 parameters after the format; zeroes are  fine  for
+           this purpose.
+
+           In  response  to review comments by Thomas E. Dickey, X/Open Curses
+           Issue 7 proposed the <STRONG>tiparm</STRONG> function in mid-2009.
+
+
+</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".
+
+       <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.
+
+
+</PRE><H3><a name="h3-Other-portability-issues">Other portability issues</a></H3><PRE>
+       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) returns a value
+       other than <STRONG>OK</STRONG>/<STRONG>ERR</STRONG> from <STRONG>tputs</STRONG>.  That returns the length of  the  string,
+       and does no error-checking.
+
+       X/Open  notes  that after calling <STRONG>mvcur</STRONG>, the curses state may not match
+       the actual terminal state, and that an application should touch and re-
+       fresh the window before resuming normal curses calls.  Both <STRONG>ncurses</STRONG> and
+       System V Release 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 documented 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 im-
+       plementation allows the caller to use -1's for the old  ordinates.   In
+       that case, the old location is unknown.
+
+
+</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><A HREF="curs_memleaks.3x.html">curs_memleaks(3x)</A></STRONG>,
+       <STRONG><A HREF="curs_termcap.3x.html">curs_termcap(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>ter-</STRONG>
+       <STRONG><A HREF="terminfo.5.html">minfo(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>
+<li><a href="#h3-Releasing-Memory">Releasing Memory</a></li>
+</ul>
+</li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a>
+<ul>
+<li><a href="#h3-Compatibility-macros">Compatibility macros</a></li>
+</ul>
+</li>
+<li><a href="#h2-HISTORY">HISTORY</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a>
+<ul>
+<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>
+<li><a href="#h3-Function-prototypes">Function prototypes</a></li>
+<li><a href="#h3-Special-TERM-treatment">Special TERM treatment</a></li>
+<li><a href="#h3-Other-portability-issues">Other portability issues</a></li>
+</ul>
+</li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_threads.3x.html b/doc/html/man/curs_threads.3x.html
new file mode 100644
index 0000000..001c86f
--- /dev/null
+++ b/doc/html/man/curs_threads.3x.html
@@ -0,0 +1,629 @@
+<!--
+  ****************************************************************************
+  * Copyright 2021,2022 Thomas E. Dickey                                     *
+  * Copyright 2008-2015,2017 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_threads.3x,v 1.31 2022/02/12 20:05:11 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_threads 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_threads 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_threads.3x.html">curs_threads(3x)</A></STRONG>                                              <STRONG><A HREF="curs_threads.3x.html">curs_threads(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>curs_threads</STRONG> - <STRONG>curses</STRONG> thread support
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>typedef</STRONG> <STRONG>int</STRONG> <STRONG>(*NCURSES_WINDOW_CB)(WINDOW</STRONG> <STRONG>*,</STRONG> <STRONG>void</STRONG> <STRONG>*);</STRONG>
+       <STRONG>typedef</STRONG> <STRONG>int</STRONG> <STRONG>(*NCURSES_SCREEN_CB)(SCREEN</STRONG> <STRONG>*,</STRONG> <STRONG>void</STRONG> <STRONG>*);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>get_escdelay(void);</STRONG>
+       <STRONG>int</STRONG> <STRONG>set_escdelay(int</STRONG> <EM>ms</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>set_tabsize(int</STRONG> <EM>cols</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>use_screen(SCREEN</STRONG> <STRONG>*</STRONG><EM>scr</EM><STRONG>,</STRONG> <STRONG>NCURSES_SCREEN_CB</STRONG> <EM>func</EM><STRONG>,</STRONG> <STRONG>void</STRONG> <STRONG>*</STRONG><EM>data</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>use_window(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>NCURSES_WINDOW_CB</STRONG> <EM>func</EM><STRONG>,</STRONG> <STRONG>void</STRONG> <STRONG>*</STRONG><EM>data</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       This  implementation  can  be configured to provide rudimentary support
+       for multi-threaded applications.  This makes a  different  set  of  li-
+       braries, e.g., <STRONG>libncursest</STRONG> since the binary interfaces are different.
+
+       Rather  than  modify  the interfaces to pass a thread specifier to each
+       function, it adds a few functions which can be used in  any  configura-
+       tion  which  hide  the  mutex's needed to prevent concurrent use of the
+       global variables when configured for threading.
+
+       In addition to forcing access to members of the <STRONG>WINDOW</STRONG> structure to  be
+       via  functions  (see <STRONG><A HREF="curs_opaque.3x.html">curs_opaque(3x)</A></STRONG>), it makes functions of the common
+       global variables, e.g., COLORS,  COLOR_PAIRS,  COLS,  ESCDELAY,  LINES,
+       TABSIZE  curscr, newscr and ttytype.  Those variables are maintained as
+       read-only values, stored in the <STRONG>SCREEN</STRONG> structure.
+
+       Even this is not enough to make a thread-safe application using curses.
+       A multi-threaded application would be expected to have threads updating
+       separate windows (within the same  device),  or  updating  on  separate
+       screens  (on  different  devices).  Also, a few of the global variables
+       are considered writable by some applications.  The functions  described
+       here address these special situations.
+
+       The ESCDELAY and TABSIZE global variables are modified by some applica-
+       tions.  To modify them in any configuration, use  the  <STRONG>set_escdelay</STRONG>  or
+       <STRONG>set_tabsize</STRONG> functions.  Other global variables are not modifiable.
+
+       The <STRONG>get_escdelay</STRONG> function returns the value for ESCDELAY.
+
+       The  <STRONG>use_window</STRONG> and <STRONG>use_screen</STRONG> functions provide coarse granularity mu-
+       texes for their respective <STRONG>WINDOW</STRONG> and <STRONG>SCREEN</STRONG> parameters, and call a us-
+       er-supplied  function,  passing  it a <EM>data</EM> parameter, and returning the
+       value from the user-supplied function to the application.
+
+
+</PRE><H3><a name="h3-USAGE">USAGE</a></H3><PRE>
+       All of the ncurses library functions assume that the locale is not  al-
+       tered during operation.  In addition, they use data which is maintained
+       within a hierarchy of scopes.
+
+          <STRONG>o</STRONG>   global data, e.g., used in the low-level terminfo or termcap in-
+              terfaces.
+
+          <STRONG>o</STRONG>   terminal data, e.g., associated with a call to <STRONG>set_curterm</STRONG>.  The
+              terminal data are initialized when screens are created.
+
+          <STRONG>o</STRONG>   screen data, e.g., associated with a call to <STRONG>newterm</STRONG> or <STRONG>initscr</STRONG>.
+
+          <STRONG>o</STRONG>   window data, e.g., associated with a call to <STRONG>newwin</STRONG>  or  <STRONG>subwin</STRONG>.
+              Windows  are  associated with screens.  Pads are not necessarily
+              associated with a particular screen.
+
+              Most curses applications operate on one or more windows within a
+              single screen.
+
+          <STRONG>o</STRONG>   reentrant, i.e., it uses only the data passed as parameters.
+
+       This  table lists the scope of data used for each symbol in the ncurses
+       library when it is configured to support threading:
+
+            Symbol                  Scope
+            -------------------------------------------------------------
+            BC                      global
+            COLORS                  screen (readonly)
+            COLOR_PAIR              reentrant
+            COLOR_PAIRS             screen (readonly)
+            COLS                    screen (readonly)
+            ESCDELAY                screen (readonly, see <STRONG>set_escdelay</STRONG>)
+            LINES                   screen (readonly)
+            PAIR_NUMBER             reentrant
+            PC                      global
+            SP                      global
+            TABSIZE                 screen (readonly)
+            UP                      global
+            acs_map                 screen (readonly)
+            add_wch                 window (stdscr)
+            add_wchnstr             window (stdscr)
+            add_wchstr              window (stdscr)
+            addch                   window (stdscr)
+            addchnstr               window (stdscr)
+            addchstr                window (stdscr)
+            addnstr                 window (stdscr)
+            addnwstr                window (stdscr)
+            addstr                  window (stdscr)
+            addwstr                 window (stdscr)
+            assume_default_colors   screen
+            attr_get                window (stdscr)
+            attr_off                window (stdscr)
+            attr_on                 window (stdscr)
+            attr_set                window (stdscr)
+            attroff                 window (stdscr)
+            attron                  window (stdscr)
+            attrset                 window (stdscr)
+            baudrate                screen
+            beep                    screen
+            bkgd                    window (stdscr)
+            bkgdset                 window (stdscr)
+            bkgrnd                  window (stdscr)
+            bkgrndset               window (stdscr)
+            boolcodes               global (readonly)
+            boolfnames              global (readonly)
+            boolnames               global (readonly)
+            border                  window (stdscr)
+            border_set              window (stdscr)
+            box                     window (stdscr)
+            box_set                 window (stdscr)
+            can_change_color        terminal
+            cbreak                  screen
+            chgat                   window (stdscr)
+            clear                   window (stdscr)
+            clearok                 window
+            clrtobot                window (stdscr)
+            clrtoeol                window (stdscr)
+            color_content           screen
+
+            color_set               window (stdscr)
+            copywin                 window locks(source, target)
+            cur_term                terminal
+            curs_set                screen
+            curscr                  screen (readonly)
+            curses_version          global (readonly)
+            def_prog_mode           terminal
+            def_shell_mode          terminal
+            define_key              screen
+            del_curterm             screen
+            delay_output            screen
+            delch                   window (stdscr)
+            deleteln                window (stdscr)
+            delscreen               global locks(screenlist, screen)
+            delwin                  global locks(windowlist)
+            derwin                  screen
+            doupdate                screen
+            dupwin                  screen locks(window)
+            echo                    screen
+            echo_wchar              window (stdscr)
+            echochar                window (stdscr)
+            endwin                  screen
+            erase                   window (stdscr)
+            erasechar               window (stdscr)
+            erasewchar              window (stdscr)
+            filter                  global
+            flash                   terminal
+            flushinp                screen
+            get_wch                 screen (input-operation)
+            get_wstr                screen (input-operation)
+            getattrs                window
+            getbegx                 window
+            getbegy                 window
+            getbkgd                 window
+            getbkgrnd               window
+            getcchar                reentrant
+            getch                   screen (input-operation)
+            getcurx                 window
+            getcury                 window
+            getmaxx                 window
+            getmaxy                 window
+            getmouse                screen (input-operation)
+            getn_wstr               screen (input-operation)
+            getnstr                 screen (input-operation)
+            getparx                 window
+            getpary                 window
+            getstr                  screen (input-operation)
+            getwin                  screen (input-operation)
+            halfdelay               screen
+            has_colors              terminal
+            has_ic                  terminal
+            has_il                  terminal
+            has_key                 screen
+            hline                   window (stdscr)
+            hline_set               window (stdscr)
+            idcok                   window
+            idlok                   window
+            immedok                 window
+            in_wch                  window (stdscr)
+            in_wchnstr              window (stdscr)
+            in_wchstr               window (stdscr)
+            inch                    window (stdscr)
+            inchnstr                window (stdscr)
+            inchstr                 window (stdscr)
+            init_color              screen
+            init_pair               screen
+
+            initscr                 global locks(screenlist)
+            innstr                  window (stdscr)
+            innwstr                 window (stdscr)
+            ins_nwstr               window (stdscr)
+            ins_wch                 window (stdscr)
+            ins_wstr                window (stdscr)
+            insch                   window (stdscr)
+            insdelln                window (stdscr)
+            insertln                window (stdscr)
+            insnstr                 window (stdscr)
+            insstr                  window (stdscr)
+            instr                   window (stdscr)
+            intrflush               terminal
+            inwstr                  window (stdscr)
+            is_cleared              window
+            is_idcok                window
+            is_idlok                window
+            is_immedok              window
+            is_keypad               window
+            is_leaveok              window
+            is_linetouched          window
+            is_nodelay              window
+            is_notimeout            window
+            is_scrollok             window
+            is_syncok               window
+            is_term_resized         terminal
+            is_wintouched           window
+            isendwin                screen
+            key_defined             screen
+            key_name                global (static data)
+            keybound                screen
+            keyname                 global (static data)
+            keyok                   screen
+            keypad                  window
+            killchar                terminal
+            killwchar               terminal
+            leaveok                 window
+            longname                screen
+            mcprint                 terminal
+            meta                    screen
+            mouse_trafo             window (stdscr)
+            mouseinterval           screen
+            mousemask               screen
+            move                    window (stdscr)
+            mvadd_wch               window (stdscr)
+            mvadd_wchnstr           window (stdscr)
+            mvadd_wchstr            window (stdscr)
+            mvaddch                 window (stdscr)
+            mvaddchnstr             window (stdscr)
+            mvaddchstr              window (stdscr)
+            mvaddnstr               window (stdscr)
+            mvaddnwstr              window (stdscr)
+            mvaddstr                window (stdscr)
+            mvaddwstr               window (stdscr)
+            mvchgat                 window (stdscr)
+            mvcur                   screen
+            mvdelch                 window (stdscr)
+            mvderwin                window (stdscr)
+            mvget_wch               screen (input-operation)
+            mvget_wstr              screen (input-operation)
+            mvgetch                 screen (input-operation)
+            mvgetn_wstr             screen (input-operation)
+            mvgetnstr               screen (input-operation)
+            mvgetstr                screen (input-operation)
+            mvhline                 window (stdscr)
+            mvhline_set             window (stdscr)
+
+            mvin_wch                window (stdscr)
+            mvin_wchnstr            window (stdscr)
+            mvin_wchstr             window (stdscr)
+            mvinch                  window (stdscr)
+            mvinchnstr              window (stdscr)
+            mvinchstr               window (stdscr)
+            mvinnstr                window (stdscr)
+            mvinnwstr               window (stdscr)
+            mvins_nwstr             window (stdscr)
+            mvins_wch               window (stdscr)
+            mvins_wstr              window (stdscr)
+            mvinsch                 window (stdscr)
+            mvinsnstr               window (stdscr)
+            mvinsstr                window (stdscr)
+            mvinstr                 window (stdscr)
+            mvinwstr                window (stdscr)
+            mvprintw                window (stdscr)
+            mvscanw                 screen
+            mvvline                 window (stdscr)
+            mvvline_set             window (stdscr)
+            mvwadd_wch              window
+            mvwadd_wchnstr          window
+            mvwadd_wchstr           window
+            mvwaddch                window
+            mvwaddchnstr            window
+            mvwaddchstr             window
+            mvwaddnstr              window
+            mvwaddnwstr             window
+            mvwaddstr               window
+            mvwaddwstr              window
+            mvwchgat                window
+            mvwdelch                window
+            mvwget_wch              screen (input-operation)
+            mvwget_wstr             screen (input-operation)
+            mvwgetch                screen (input-operation)
+            mvwgetn_wstr            screen (input-operation)
+            mvwgetnstr              screen (input-operation)
+            mvwgetstr               screen (input-operation)
+            mvwhline                window
+            mvwhline_set            window
+            mvwin                   window
+            mvwin_wch               window
+            mvwin_wchnstr           window
+            mvwin_wchstr            window
+            mvwinch                 window
+            mvwinchnstr             window
+            mvwinchstr              window
+            mvwinnstr               window
+            mvwinnwstr              window
+            mvwins_nwstr            window
+            mvwins_wch              window
+            mvwins_wstr             window
+            mvwinsch                window
+            mvwinsnstr              window
+            mvwinsstr               window
+            mvwinstr                window
+            mvwinwstr               window
+            mvwprintw               window
+            mvwscanw                screen
+            mvwvline                window
+            mvwvline_set            window
+            napms                   reentrant
+            newpad                  global locks(windowlist)
+            newscr                  screen (readonly)
+            newterm                 global locks(screenlist)
+            newwin                  global locks(windowlist)
+
+            nl                      screen
+            nocbreak                screen
+            nodelay                 window
+            noecho                  screen
+            nofilter                global
+            nonl                    screen
+            noqiflush               terminal
+            noraw                   screen
+            notimeout               window
+            numcodes                global (readonly)
+            numfnames               global (readonly)
+            numnames                global (readonly)
+            ospeed                  global
+            overlay                 window locks(source, target)
+            overwrite               window locks(source, target)
+            pair_content            screen
+            pecho_wchar             screen
+            pechochar               screen
+            pnoutrefresh            screen
+            prefresh                screen
+            printw                  window
+            putp                    global
+            putwin                  window
+            qiflush                 terminal
+            raw                     screen
+            redrawwin               window
+            refresh                 screen
+            reset_prog_mode         screen
+            reset_shell_mode        screen
+            resetty                 terminal
+            resize_term             screen locks(windowlist)
+            resizeterm              screen
+            restartterm             screen
+            ripoffline              global (static data)
+            savetty                 terminal
+            scanw                   screen
+            scr_dump                screen
+            scr_init                screen
+            scr_restore             screen
+            scr_set                 screen
+            scrl                    window (stdscr)
+            scroll                  window
+            scrollok                window
+            set_curterm             screen
+            set_escdelay            screen
+            set_tabsize             screen
+            set_term                global locks(screenlist, screen)
+            setcchar                reentrant
+            setscrreg               window (stdscr)
+            setupterm               global
+            slk_attr                screen
+            slk_attr_off            screen
+            slk_attr_on             screen
+            slk_attr_set            screen
+            slk_attroff             screen
+            slk_attron              screen
+            slk_attrset             screen
+            slk_clear               screen
+            slk_color               screen
+            slk_init                screen
+            slk_label               screen
+            slk_noutrefresh         screen
+            slk_refresh             screen
+            slk_restore             screen
+            slk_set                 screen
+            slk_touch               screen
+
+            slk_wset                screen
+            standend                window
+            standout                window
+            start_color             screen
+            stdscr                  screen (readonly)
+            strcodes                global (readonly)
+            strfnames               global (readonly)
+            strnames                global (readonly)
+            subpad                  window
+            subwin                  window
+            syncok                  window
+            term_attrs              screen
+            termattrs               screen
+            termname                terminal
+            tgetent                 global
+            tgetflag                global
+            tgetnum                 global
+            tgetstr                 global
+            tgoto                   global
+            tigetflag               terminal
+            tigetnum                terminal
+            tigetstr                terminal
+            timeout                 window (stdscr)
+            touchline               window
+            touchwin                window
+            tparm                   global (static data)
+            tputs                   screen
+            trace                   global (static data)
+            ttytype                 screen (readonly)
+            typeahead               screen
+            unctrl                  screen
+            unget_wch               screen (input-operation)
+            ungetch                 screen (input-operation)
+            ungetmouse              screen (input-operation)
+            untouchwin              window
+            use_default_colors      screen
+            use_env                 global (static data)
+            use_extended_names      global (static data)
+            use_legacy_coding       screen
+            use_screen              global locks(screenlist, screen)
+            use_window              global locks(windowlist, window)
+            vid_attr                screen
+            vid_puts                screen
+            vidattr                 screen
+            vidputs                 screen
+            vline                   window (stdscr)
+            vline_set               window (stdscr)
+            vw_printw               window
+            vw_scanw                screen
+            vwprintw                window
+            vwscanw                 screen
+            wadd_wch                window
+            wadd_wchnstr            window
+            wadd_wchstr             window
+            waddch                  window
+            waddchnstr              window
+            waddchstr               window
+            waddnstr                window
+            waddnwstr               window
+            waddstr                 window
+            waddwstr                window
+            wattr_get               window
+            wattr_off               window
+            wattr_on                window
+            wattr_set               window
+            wattroff                window
+
+            wattron                 window
+            wattrset                window
+            wbkgd                   window
+            wbkgdset                window
+            wbkgrnd                 window
+            wbkgrndset              window
+            wborder                 window
+            wborder_set             window
+            wchgat                  window
+            wclear                  window
+            wclrtobot               window
+            wclrtoeol               window
+            wcolor_set              window
+            wcursyncup              screen (affects window plus parents)
+            wdelch                  window
+            wdeleteln               window
+            wecho_wchar             window
+            wechochar               window
+            wenclose                window
+            werase                  window
+            wget_wch                screen (input-operation)
+            wget_wstr               screen (input-operation)
+            wgetbkgrnd              window
+            wgetch                  screen (input-operation)
+            wgetdelay               window
+            wgetn_wstr              screen (input-operation)
+            wgetnstr                screen (input-operation)
+            wgetparent              window
+            wgetscrreg              window
+            wgetstr                 screen (input-operation)
+            whline                  window
+            whline_set              window
+            win_wch                 window
+            win_wchnstr             window
+            win_wchstr              window
+            winch                   window
+            winchnstr               window
+            winchstr                window
+            winnstr                 window
+            winnwstr                window
+            wins_nwstr              window
+            wins_wch                window
+            wins_wstr               window
+            winsch                  window
+            winsdelln               window
+            winsertln               window
+            winsnstr                window
+            winsstr                 window
+            winstr                  window
+            winwstr                 window
+            wmouse_trafo            window
+            wmove                   window
+            wnoutrefresh            screen
+            wprintw                 window
+            wredrawln               window
+            wrefresh                screen
+            wresize                 window locks(windowlist)
+            wscanw                  screen
+            wscrl                   window
+            wsetscrreg              window
+            wstandend               window
+            wstandout               window
+            wsyncdown               screen (affects window plus parents)
+            wsyncup                 screen (affects window plus parents)
+            wtimeout                window
+            wtouchln                window
+
+            wunctrl                 global (static data)
+            wvline                  window
+            wvline_set              window
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       These functions all return <STRONG>TRUE</STRONG> or <STRONG>FALSE</STRONG>, except as noted.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       Both a macro and a function are provided for each name.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These routines are specific to ncurses.  They  were  not  supported  on
+       Version 7, BSD or System V implementations.  It is recommended that any
+       code depending on ncurses extensions be conditioned using  NCURSES_VER-
+       SION.
+
+
+</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_opaque.3x.html">curs_opaque(3x)</A></STRONG>, <STRONG><A HREF="curs_variables.3x.html">curs_variables(3x)</A></STRONG>.
+
+
+
+                                                              <STRONG><A HREF="curs_threads.3x.html">curs_threads(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-USAGE">USAGE</a></li>
+</ul>
+</li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_touch.3x.html b/doc/html/man/curs_touch.3x.html
new file mode 100644
index 0000000..4c63cb9
--- /dev/null
+++ b/doc/html/man/curs_touch.3x.html
@@ -0,0 +1,149 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2015,2017 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_touch.3x,v 1.26 2022/02/12 20:05:11 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_touch 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_touch 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_touch.3x.html">curs_touch(3x)</A></STRONG>                                                  <STRONG><A HREF="curs_touch.3x.html">curs_touch(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>touchwin</STRONG>, <STRONG>touchline</STRONG>, <STRONG>untouchwin</STRONG>, <STRONG>wtouchln</STRONG>, <STRONG>is_linetouched</STRONG>,
+       <STRONG>is_wintouched</STRONG> - <STRONG>curses</STRONG> refresh control routines
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>touchline(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>start</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>count</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>touchwin(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>wtouchln(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>changed</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>untouchwin(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+
+       <STRONG>bool</STRONG> <STRONG>is_linetouched(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>line</EM><STRONG>);</STRONG>
+       <STRONG>bool</STRONG> <STRONG>is_wintouched(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The <STRONG>touchwin</STRONG> and <STRONG>touchline</STRONG> routines throw away all optimization  infor-
+       mation about which parts of the window have been touched, by pretending
+       that the entire window has been drawn on.  This is sometimes  necessary
+       when  using  overlapping  windows, since a change to one window affects
+       the other window, but the records of which lines have been  changed  in
+       the other window do not reflect the change.  The routine <STRONG>touchline</STRONG> only
+       pretends that <EM>count</EM> lines have been changed, beginning with line <EM>start</EM>.
+
+       The <STRONG>untouchwin</STRONG> routine marks all lines in the window as unchanged since
+       the last call to <STRONG>wrefresh</STRONG>.
+
+       The  <STRONG>wtouchln</STRONG>  routine makes <EM>n</EM> lines in the window, starting at line <EM>y</EM>,
+       look as if they have (<EM>changed</EM><STRONG>=1</STRONG>) or have not (<EM>changed</EM><STRONG>=0</STRONG>)  been  changed
+       since the last call to <STRONG>wrefresh</STRONG>.
+
+       The <STRONG>is_linetouched</STRONG> and <STRONG>is_wintouched</STRONG> routines return <STRONG>TRUE</STRONG> if the speci-
+       fied line/window was modified since the last call to  <STRONG>wrefresh</STRONG>;  other-
+       wise  they  return  <STRONG>FALSE</STRONG>.   In addition, <STRONG>is_linetouched</STRONG> returns <STRONG>ERR</STRONG> if
+       <EM>line</EM> is not valid for the given window.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       All routines return the integer <STRONG>ERR</STRONG> upon failure and an  integer  value
+       other  than  <STRONG>ERR</STRONG>  upon successful completion, unless otherwise noted in
+       the preceding routine descriptions.
+
+       X/Open does not define any error conditions.  In this implementation
+
+          <STRONG>is_linetouched</STRONG>
+               returns an error if the window pointer is null, or if the  line
+               number is outside the window.
+
+               The constant <STRONG>ERR</STRONG> is distinct from <STRONG>TRUE</STRONG> and <STRONG>FALSE</STRONG>, which are the
+               normal return values of this function.   Because  the  function
+               returns a <STRONG>bool</STRONG>, returning <STRONG>ERR</STRONG> (which is neither <STRONG>TRUE</STRONG> nor <STRONG>FALSE</STRONG>)
+               may not be supported by the compiler.
+
+               To provide error-checking and also match  the  X/Open  function
+               prototype, the <STRONG>ERR</STRONG> is provided by a macro named <STRONG>is_linetouched</STRONG>.
+               The actual function returns <STRONG>FALSE</STRONG> when it detects an error.
+
+          <STRONG>wtouchln</STRONG>
+               returns an error if the window pointer is null, or if the  line
+               number is outside the window.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These  functions  were  introduced  by SVr4.  The Solaris curses header
+       file, for instance, defines both an actual function and macro for each.
+       The  macros  give the same result as the actual functions.  SVr4 curses
+       does not check the window parameter <EM>win</EM> to ensure that it is not  <STRONG>NULL</STRONG>;
+       otherwise this implementation behaves the same as SVr4.
+
+       The XSI Curses standard, Issue 4 describes these functions, but defines
+       no error conditions.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       All of these routines except <STRONG>wtouchln</STRONG> may be macros.
+
+
+</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_refresh.3x.html">curs_refresh(3x)</A></STRONG>, <STRONG><A HREF="curs_variables.3x.html">curs_variables(3x)</A></STRONG>.
+
+
+
+                                                                <STRONG><A HREF="curs_touch.3x.html">curs_touch(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_trace.3x.html b/doc/html/man/curs_trace.3x.html
new file mode 100644
index 0000000..f670c86
--- /dev/null
+++ b/doc/html/man/curs_trace.3x.html
@@ -0,0 +1,280 @@
+<!--
+  ****************************************************************************
+  * Copyright 2019-2021,2022 Thomas E. Dickey                                *
+  * Copyright 2000-2016,2017 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_trace.3x,v 1.25 2022/02/12 20:06:41 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_trace 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_trace 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_trace.3x.html">curs_trace(3x)</A></STRONG>                                                  <STRONG><A HREF="curs_trace.3x.html">curs_trace(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>curses_trace</STRONG>, <STRONG>trace</STRONG>, <STRONG>_tracef</STRONG>, <STRONG>_traceattr</STRONG>, <STRONG>_traceattr2</STRONG>, <STRONG>_tracecchar_t</STRONG>,
+       <STRONG>_tracecchar_t2</STRONG>, <STRONG>_tracechar</STRONG>, <STRONG>_tracechtype</STRONG>, <STRONG>_tracechtype2</STRONG>, <STRONG>_nc_tracebits</STRONG>,
+       <STRONG>_tracedump</STRONG>, <STRONG>_tracemouse</STRONG> - <STRONG>curses</STRONG> debugging routines
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>unsigned</STRONG> <STRONG>curses_trace(const</STRONG> <STRONG>unsigned</STRONG> <EM>param</EM><STRONG>);</STRONG>
+
+       <STRONG>void</STRONG> <STRONG>_tracef(const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>format</EM><STRONG>,</STRONG> <STRONG>...);</STRONG>
+
+       <STRONG>char</STRONG> <STRONG>*_traceattr(attr_t</STRONG> <EM>attr</EM><STRONG>);</STRONG>
+       <STRONG>char</STRONG> <STRONG>*_traceattr2(int</STRONG> <EM>buffer</EM><STRONG>,</STRONG> <STRONG>chtype</STRONG> <EM>ch</EM><STRONG>);</STRONG>
+       <STRONG>char</STRONG> <STRONG>*_tracecchar_t(const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>string</EM><STRONG>);</STRONG>
+       <STRONG>char</STRONG> <STRONG>*_tracecchar_t2(int</STRONG> <EM>buffer</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>cchar_t</STRONG> <STRONG>*</STRONG><EM>string</EM><STRONG>);</STRONG>
+       <STRONG>char</STRONG> <STRONG>*_tracechar(int</STRONG> <EM>ch</EM><STRONG>);</STRONG>
+       <STRONG>char</STRONG> <STRONG>*_tracechtype(chtype</STRONG> <EM>ch</EM><STRONG>);</STRONG>
+       <STRONG>char</STRONG> <STRONG>*_tracechtype2(int</STRONG> <EM>buffer</EM><STRONG>,</STRONG> <STRONG>chtype</STRONG> <EM>ch</EM><STRONG>);</STRONG>
+
+       <STRONG>void</STRONG> <STRONG>_tracedump(const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>label</EM><STRONG>,</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+       <STRONG>char</STRONG> <STRONG>*_nc_tracebits(void);</STRONG>
+       <STRONG>char</STRONG> <STRONG>*_tracemouse(const</STRONG> <STRONG>MEVENT</STRONG> <STRONG>*</STRONG><EM>event</EM><STRONG>);</STRONG>
+
+       /* deprecated */
+       <STRONG>void</STRONG> <STRONG>trace(const</STRONG> <STRONG>unsigned</STRONG> <STRONG>int</STRONG> <EM>param</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The <EM>curses</EM> <EM>trace</EM> routines are used for debugging the ncurses libraries,
+       as well as applications which use the ncurses libraries.  Some  limita-
+       tions apply:
+
+       <STRONG>o</STRONG>   Aside from <STRONG>curses_trace</STRONG>, the other functions are normally available
+           only with the debugging library e.g., <STRONG>libncurses_g.a</STRONG>.
+
+           All of the trace functions may be compiled into any model  (shared,
+           static, profile) by defining the symbol <STRONG>TRACE</STRONG>.
+
+       <STRONG>o</STRONG>   Additionally,  the  functions  which use <STRONG>cchar_t</STRONG> are only available
+           with the wide-character configuration of the libraries.
+
+
+</PRE><H3><a name="h3-Functions">Functions</a></H3><PRE>
+       The principal parts of this interface are
+
+       <STRONG>o</STRONG>   <STRONG>curses_trace</STRONG>, which selectively enables different tracing features,
+           and
+
+       <STRONG>o</STRONG>   <STRONG>_tracef</STRONG>, which writes formatted data to the <EM>trace</EM> file.
+
+           The other functions either return a pointer to a string-area (allo-
+           cated by the corresponding function), or return no value  (such  as
+           <STRONG>_tracedump</STRONG>,  which  implements  the  screen dump for <STRONG>TRACE_UPDATE</STRONG>).
+           The caller should not free these strings, since the  allocation  is
+           reused on successive calls.  To work around the problem of a single
+           string-area per  function,  some  use  a  buffer-number  parameter,
+           telling the library to allocate additional string-areas.
+
+       The <STRONG>curses_trace</STRONG> function is always available, whether or not the other
+       trace functions are available:
+
+       <STRONG>o</STRONG>   If tracing is available, calling <STRONG>curses_trace</STRONG> with a nonzero param-
+           eter updates the trace mask, and returns the previous trace mask.
+
+           When the trace mask is nonzero, ncurses creates the file "trace" in
+           the current directory for output.  If the file already  exists,  no
+           tracing is done.
+
+       <STRONG>o</STRONG>   If tracing is not available, <STRONG>curses_trace</STRONG> returns zero (0).
+
+
+</PRE><H3><a name="h3-Trace-Parameter">Trace Parameter</a></H3><PRE>
+       The  trace  parameter  is  formed  by  OR'ing  values  from the list of
+       <STRONG>TRACE_</STRONG><EM>xxx</EM> definitions in <STRONG>&lt;curses.h&gt;</STRONG>.  These include:
+
+       <STRONG>TRACE_DISABLE</STRONG>
+            turn off tracing by passing a zero parameter.
+
+            The library flushes the output file, but retains an open  file-de-
+            scriptor  to the trace file so that it can resume tracing later if
+            a nonzero parameter is passed to the <STRONG>curses_trace</STRONG> function.
+
+       <STRONG>TRACE_TIMES</STRONG>
+            trace user and system times of updates.
+
+       <STRONG>TRACE_TPUTS</STRONG>
+            trace <STRONG><A HREF="curs_terminfo.3x.html">tputs(3x)</A></STRONG> calls.
+
+       <STRONG>TRACE_UPDATE</STRONG>
+            trace update actions, old &amp; new screens.
+
+       <STRONG>TRACE_MOVE</STRONG>
+            trace cursor movement and scrolling.
+
+       <STRONG>TRACE_CHARPUT</STRONG>
+            trace all character outputs.
+
+       <STRONG>TRACE_ORDINARY</STRONG>
+            trace all update actions.  The old and  new  screen  contents  are
+            written to the trace file for each refresh.
+
+       <STRONG>TRACE_CALLS</STRONG>
+            trace  all curses calls.  The parameters for each call are traced,
+            as well as return values.
+
+       <STRONG>TRACE_VIRTPUT</STRONG>
+            trace virtual character puts, i.e., calls to <STRONG>addch</STRONG>.
+
+       <STRONG>TRACE_IEVENT</STRONG>
+            trace low-level input processing, including timeouts.
+
+       <STRONG>TRACE_BITS</STRONG>
+            trace state of TTY control bits.
+
+       <STRONG>TRACE_ICALLS</STRONG>
+            trace internal/nested calls.
+
+       <STRONG>TRACE_CCALLS</STRONG>
+            trace per-character calls.
+
+       <STRONG>TRACE_DATABASE</STRONG>
+            trace read/write of terminfo/termcap data.
+
+       <STRONG>TRACE_ATTRS</STRONG>
+            trace changes to video attributes and colors.
+
+       <STRONG>TRACE_MAXIMUM</STRONG>
+            maximum trace level, enables all of the separate trace features.
+
+       Some tracing features are enabled whenever the  <STRONG>curses_trace</STRONG>  parameter
+       is  nonzero.   Some features overlap.  The specific names are used as a
+       guideline.
+
+
+</PRE><H3><a name="h3-Initialization">Initialization</a></H3><PRE>
+       These functions check the <STRONG>NCURSES_TRACE</STRONG> environment  variable,  to  set
+       the tracing feature as if <STRONG>curses_trace</STRONG> was called:
+
+           filter, initscr, new_prescr, newterm, nofilter, restartterm,
+           ripoffline, setupterm, slk_init, tgetent, use_env,
+           use_extended_names, use_tioctl
+
+
+</PRE><H3><a name="h3-Command-line-Utilities">Command-line Utilities</a></H3><PRE>
+       The  command-line  utilities  such  as  <STRONG><A HREF="tic.1m.html">tic(1)</A></STRONG> provide a verbose option
+       which extends the set of messages written using the <STRONG>curses_trace</STRONG>  func-
+       tion.   Both  of  these  (<STRONG>-v</STRONG>  and  <STRONG>curses_trace</STRONG>)  use the same variable
+       (<STRONG>_nc_tracing</STRONG>), which determines the messages which are written.
+
+       Because the command-line utilities may  call  initialization  functions
+       such  as <STRONG>setupterm</STRONG>, <STRONG>tgetent</STRONG> or <STRONG>use_extended_names</STRONG>, some of their debug-
+       ging output may be directed to the <EM>trace</EM> file if the <STRONG>NCURSES_TRACE</STRONG>  en-
+       vironment variable is set:
+
+       <STRONG>o</STRONG>   messages produced in the utility are written to the standard error.
+
+       <STRONG>o</STRONG>   messages produced by the underlying library are written to <EM>trace</EM>.
+
+       If  ncurses  is built without tracing, none of the latter are produced,
+       and fewer diagnostics are provided by the command-line utilities.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       Routines which return a value are designed to be used as parameters  to
+       the <STRONG>_tracef</STRONG> routine.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These  functions  are not part of the XSI interface.  Some other curses
+       implementations are known to have similar features, but  they  are  not
+       compatible with ncurses:
+
+       <STRONG>o</STRONG>   SVr4  provided  <STRONG>traceon</STRONG>  and <STRONG>traceoff</STRONG>, to control whether debugging
+           information was written to the "trace" file.  While  the  functions
+           were  always  available, this feature was only enabled if <STRONG>DEBUG</STRONG> was
+           defined when building the library.
+
+           The SVr4 tracing feature is undocumented.
+
+       <STRONG>o</STRONG>   PDCurses provides <STRONG>traceon</STRONG> and <STRONG>traceoff</STRONG>, which (like SVr4)  are  al-
+           ways  available, and enable tracing to the "trace" file only when a
+           debug-library is built.
+
+           PDCurses has a short description of these functions,  with  a  note
+           that  they are not present in X/Open Curses, ncurses or NetBSD.  It
+           does not mention SVr4, but the functions'  inclusion  in  a  header
+           file section labeled "Quasi-standard" hints at the origin.
+
+       <STRONG>o</STRONG>   NetBSD  does  not  provide functions for enabling/disabling traces.
+           It  uses  environment   variables   <STRONG>CURSES_TRACE_MASK</STRONG>   and   <STRONG>CURS-</STRONG>
+           <STRONG>ES_TRACE_FILE</STRONG>  to  determine  what is traced, and where the results
+           are written.  This is available only when a debug-library is built.
+
+           The NetBSD tracing feature is undocumented.
+
+       A few ncurses functions are not  provided  when  symbol  versioning  is
+       used:
+
+           _nc_tracebits, _tracedump, _tracemouse
+
+       The  original  <STRONG>trace</STRONG> routine was deprecated because it often conflicted
+       with application names.
+
+
+</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_trace.3x.html">curs_trace(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-Functions">Functions</a></li>
+<li><a href="#h3-Trace-Parameter">Trace Parameter</a></li>
+<li><a href="#h3-Initialization">Initialization</a></li>
+<li><a href="#h3-Command-line-Utilities">Command-line Utilities</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>
diff --git a/doc/html/man/curs_util.3x.html b/doc/html/man/curs_util.3x.html
new file mode 100644
index 0000000..cd4fefd
--- /dev/null
+++ b/doc/html/man/curs_util.3x.html
@@ -0,0 +1,393 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2015,2017 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_util.3x,v 1.65 2022/02/12 20:06:41 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_util 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_util 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_util.3x.html">curs_util(3x)</A></STRONG>                                                    <STRONG><A HREF="curs_util.3x.html">curs_util(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>delay_output</STRONG>, <STRONG>filter</STRONG>, <STRONG>flushinp</STRONG>, <STRONG>getwin</STRONG>, <STRONG>key_name</STRONG>, <STRONG>keyname</STRONG>, <STRONG>nofilter</STRONG>,
+       <STRONG>putwin</STRONG>, <STRONG>unctrl</STRONG>, <STRONG>use_env</STRONG>, <STRONG>use_tioctl</STRONG>, <STRONG>wunctrl</STRONG> - miscellaneous <STRONG>curses</STRONG>
+       utility routines
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*unctrl(chtype</STRONG> <EM>c</EM><STRONG>);</STRONG>
+       <STRONG>wchar_t</STRONG> <STRONG>*wunctrl(cchar_t</STRONG> <STRONG>*</STRONG><EM>c</EM><STRONG>);</STRONG>
+
+       <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*keyname(int</STRONG> <EM>c</EM><STRONG>);</STRONG>
+       <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*key_name(wchar_t</STRONG> <EM>w</EM><STRONG>);</STRONG>
+
+       <STRONG>void</STRONG> <STRONG>filter(void);</STRONG>
+       <STRONG>void</STRONG> <STRONG>nofilter(void);</STRONG>
+
+       <STRONG>void</STRONG> <STRONG>use_env(bool</STRONG> <EM>f</EM><STRONG>);</STRONG>
+       <STRONG>void</STRONG> <STRONG>use_tioctl(bool</STRONG> <EM>f</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>putwin(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>FILE</STRONG> <STRONG>*</STRONG><EM>filep</EM><STRONG>);</STRONG>
+       <STRONG>WINDOW</STRONG> <STRONG>*getwin(FILE</STRONG> <STRONG>*</STRONG><EM>filep</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>delay_output(int</STRONG> <EM>ms</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>flushinp(void);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+
+</PRE><H3><a name="h3-unctrl">unctrl</a></H3><PRE>
+       The <STRONG>unctrl</STRONG> routine returns a character string which is a printable rep-
+       resentation of the character <EM>c</EM>, ignoring attributes.   Control  charac-
+       ters  are  displayed  in the <STRONG>^</STRONG><EM>X</EM> notation.  Printing characters are dis-
+       played as is.  The corresponding <STRONG>wunctrl</STRONG> returns a printable  represen-
+       tation of a wide character.
+
+
+</PRE><H3><a name="h3-keyname_key_name">keyname/key_name</a></H3><PRE>
+       The <STRONG>keyname</STRONG> routine returns a character string corresponding to the key
+       <EM>c</EM>:
+
+       <STRONG>o</STRONG>   Printable characters are displayed as themselves, e.g., a one-char-
+           acter string containing the key.
+
+       <STRONG>o</STRONG>   Control characters are displayed in the <STRONG>^</STRONG><EM>X</EM> notation.
+
+       <STRONG>o</STRONG>   DEL (character 127) is displayed as <STRONG>^?</STRONG>.
+
+       <STRONG>o</STRONG>   Values  above 128 are either meta characters (if the screen has not
+           been initialized, or if <STRONG><A HREF="curs_inopts.3x.html">meta(3x)</A></STRONG> has been called with a <STRONG>TRUE</STRONG> param-
+           eter),  shown  in the <STRONG>M-</STRONG><EM>X</EM> notation, or are displayed as themselves.
+           In the latter case, the values may not be printable;  this  follows
+           the X/Open specification.
+
+       <STRONG>o</STRONG>   Values above 256 may be the names of the names of function keys.
+
+       <STRONG>o</STRONG>   Otherwise  (if there is no corresponding name) the function returns
+           null, to denote an error.  X/Open also lists an "UNKNOWN  KEY"  re-
+           turn value, which some implementations return rather than null.
+
+       The  corresponding <STRONG>key_name</STRONG> returns a character string corresponding to
+       the wide-character value <EM>w</EM>.  The two functions do not return  the  same
+       set  of strings; the latter returns null where the former would display
+       a meta character.
+
+
+</PRE><H3><a name="h3-filter_nofilter">filter/nofilter</a></H3><PRE>
+       The <STRONG>filter</STRONG> routine, if used, must be called before <STRONG>initscr</STRONG>  or  <STRONG>newterm</STRONG>
+       are called.  Calling <STRONG>filter</STRONG> causes these changes in initialization:
+
+       <STRONG>o</STRONG>   <STRONG>LINES</STRONG> is set to 1;
+
+       <STRONG>o</STRONG>   the  capabilities  <STRONG>clear</STRONG>,  <STRONG>cud1</STRONG>,  <STRONG>cud</STRONG>, <STRONG>cup</STRONG>, <STRONG>cuu1</STRONG>, <STRONG>cuu</STRONG>, <STRONG>vpa</STRONG> are dis-
+           abled;
+
+       <STRONG>o</STRONG>   the capability <STRONG>ed</STRONG> is disabled if <STRONG>bce</STRONG> is set;
+
+       <STRONG>o</STRONG>   and the <STRONG>home</STRONG> string is set to the value of <STRONG>cr</STRONG>.
+
+       The <STRONG>nofilter</STRONG> routine cancels the effect of  a  preceding  <STRONG>filter</STRONG>  call.
+       That  allows  the  caller to initialize a screen on a different device,
+       using a different value of <STRONG>$TERM</STRONG>.  The limitation  arises  because  the
+       <STRONG>filter</STRONG> routine modifies the in-memory copy of the terminal information.
+
+
+</PRE><H3><a name="h3-use_env">use_env</a></H3><PRE>
+       The  <STRONG>use_env</STRONG>  routine,  if  used,  should  be  called before <STRONG>initscr</STRONG> or
+       <STRONG>newterm</STRONG> are called (because those compute the screen size).   It  modi-
+       fies  the way <STRONG>ncurses</STRONG> treats environment variables when determining the
+       screen size.
+
+       <STRONG>o</STRONG>   Normally <STRONG>ncurses</STRONG> looks first  at  the  terminal  database  for  the
+           screen size.
+
+           If  <STRONG>use_env</STRONG>  was called with <STRONG>FALSE</STRONG> for parameter, it stops here un-
+           less <STRONG>use_tioctl</STRONG> was also called with <STRONG>TRUE</STRONG> for parameter.
+
+       <STRONG>o</STRONG>   Then it asks for the screen size via operating  system  calls.   If
+           successful, it overrides the values from the terminal database.
+
+       <STRONG>o</STRONG>   Finally  (unless  <STRONG>use_env</STRONG> was called with <STRONG>FALSE</STRONG> parameter), <STRONG>ncurses</STRONG>
+           examines the <STRONG>LINES</STRONG> or <STRONG>COLUMNS</STRONG> environment variables, using a  value
+           in  those to override the results from the operating system or ter-
+           minal database.
+
+           <STRONG>Ncurses</STRONG> also updates the screen size in response to  <STRONG>SIGWINCH</STRONG>,  un-
+           less overridden by the <STRONG>LINES</STRONG> or <STRONG>COLUMNS</STRONG> environment variables,
+
+
+</PRE><H3><a name="h3-use_tioctl">use_tioctl</a></H3><PRE>
+       The  <STRONG>use_tioctl</STRONG>  routine,  if  used, should be called before <STRONG>initscr</STRONG> or
+       <STRONG>newterm</STRONG> are called (because those  compute  the  screen  size).   After
+       <STRONG>use_tioctl</STRONG>  is  called  with  <STRONG>TRUE</STRONG> as an argument, <STRONG>ncurses</STRONG> modifies the
+       last step in its computation of screen size as follows:
+
+       <STRONG>o</STRONG>   checks if the <STRONG>LINES</STRONG> and <STRONG>COLUMNS</STRONG> environment variables are set to  a
+           number greater than zero.
+
+       <STRONG>o</STRONG>   for  each,  <STRONG>ncurses</STRONG>  updates the corresponding environment variable
+           with the value that it has obtained via operating  system  call  or
+           from the terminal database.
+
+       <STRONG>o</STRONG>   <STRONG>ncurses</STRONG>  re-fetches  the value of the environment variables so that
+           it is still the environment variables which set the screen size.
+
+       The <STRONG>use_env</STRONG> and <STRONG>use_tioctl</STRONG> routines combine as summarized here:
+
+           <STRONG>use_env</STRONG>   <STRONG>use_tioctl</STRONG>   <STRONG>Summary</STRONG>
+           ----------------------------------------------------------------
+           TRUE      FALSE        This is the default  behavior.   <STRONG>ncurses</STRONG>
+                                  uses operating system calls unless over-
+                                  ridden by $LINES or $COLUMNS environment
+                                  variables.
+
+           TRUE      TRUE         <STRONG>ncurses</STRONG>   updates  $LINES  and  $COLUMNS
+                                  based on operating system calls.
+           FALSE     TRUE         <STRONG>ncurses</STRONG> ignores $LINES and $COLUMNS, us-
+                                  es  operating  system  calls  to  obtain
+                                  size.
+           FALSE     FALSE        <STRONG>ncurses</STRONG> relies on the terminal  database
+                                  to determine size.
+
+
+</PRE><H3><a name="h3-putwin_getwin">putwin/getwin</a></H3><PRE>
+       The  <STRONG>putwin</STRONG> routine writes all data associated with window (or pad) <EM>win</EM>
+       into the file to which <EM>filep</EM> points.  This information can be later re-
+       trieved using the <STRONG>getwin</STRONG> function.
+
+       The  <STRONG>getwin</STRONG>  routine  reads  window  related data stored in the file by
+       <STRONG>putwin</STRONG>.  The routine then creates and initializes a  new  window  using
+       that  data.   It  returns a pointer to the new window.  There are a few
+       caveats:
+
+       <STRONG>o</STRONG>   the data written is a copy of the <STRONG>WINDOW</STRONG> structure, and its associ-
+           ated  character cells.  The format differs between the wide-charac-
+           ter (<STRONG>ncursesw</STRONG>) and non-wide (<STRONG>ncurses</STRONG>) libraries.  You can  transfer
+           data between the two, however.
+
+       <STRONG>o</STRONG>   the  retrieved  window  is always created as a top-level window (or
+           pad), rather than a subwindow.
+
+       <STRONG>o</STRONG>   the window's character cells contain the color pair <EM>value</EM>, but  not
+           the  actual  color  <EM>numbers</EM>.   If cells in the retrieved window use
+           color pairs which have not been created in  the  application  using
+           <STRONG>init_pair</STRONG>, they will not be colored when the window is refreshed.
+
+
+</PRE><H3><a name="h3-delay_output">delay_output</a></H3><PRE>
+       The  <STRONG>delay_output</STRONG>  routine  inserts  an <EM>ms</EM> millisecond pause in output.
+       This routine should not be used extensively because padding  characters
+       are  used  rather  than a CPU pause.  If no padding character is speci-
+       fied, this uses <STRONG>napms</STRONG> to perform the delay.
+
+
+</PRE><H3><a name="h3-flushinp">flushinp</a></H3><PRE>
+       The <STRONG>flushinp</STRONG> routine throws away any typeahead that has been  typed  by
+       the user and has not yet been read by the program.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       Except  for  <STRONG>flushinp</STRONG>,  routines that return an integer return <STRONG>ERR</STRONG> upon
+       failure and <STRONG>OK</STRONG> (SVr4 specifies only "an integer value other than  <STRONG>ERR</STRONG>")
+       upon successful completion.
+
+       Routines that return pointers return <STRONG>NULL</STRONG> on error.
+
+       X/Open does not define any error conditions.  In this implementation
+
+          <STRONG>flushinp</STRONG>
+               returns an error if the terminal was not initialized.
+
+          <STRONG>putwin</STRONG>
+               returns  an  error if the associated <STRONG>fwrite</STRONG> calls return an er-
+               ror.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+
+</PRE><H3><a name="h3-filter">filter</a></H3><PRE>
+       The SVr4 documentation describes the  action  of  <STRONG>filter</STRONG>  only  in  the
+       vaguest  terms.   The  description  here is adapted from the XSI Curses
+       standard (which erroneously fails to describe the disabling of <STRONG>cuu</STRONG>).
+
+
+</PRE><H3><a name="h3-keyname">keyname</a></H3><PRE>
+       The <STRONG>keyname</STRONG> function may return the names of user-defined string  capa-
+       bilities  which  are defined in the terminfo entry via the <STRONG>-x</STRONG> option of
+       <STRONG>tic</STRONG>.  This implementation automatically assigns at run-time keycodes to
+       user-defined  strings  which  begin  with  "k".   The keycodes start at
+       KEY_MAX, but are not guaranteed to be the same value for different runs
+       because  user-defined  codes  are merged from all terminal descriptions
+       which have been loaded.  The <STRONG><A HREF="curs_extend.3x.html">use_extended_names(3x)</A></STRONG>  function  controls
+       whether  this  data  is loaded when the terminal description is read by
+       the library.
+
+
+</PRE><H3><a name="h3-nofilter_use_tioctl">nofilter/use_tioctl</a></H3><PRE>
+       The <STRONG>nofilter</STRONG> and <STRONG>use_tioctl</STRONG> routines are  specific  to  <STRONG>ncurses</STRONG>.   They
+       were  not  supported on Version 7, BSD or System V implementations.  It
+       is recommended that any code depending on <STRONG>ncurses</STRONG> extensions be  condi-
+       tioned using NCURSES_VERSION.
+
+
+</PRE><H3><a name="h3-putwin_getwin-file-format">putwin/getwin file-format</a></H3><PRE>
+       The <STRONG>putwin</STRONG> and <STRONG>getwin</STRONG> functions have several issues with portability:
+
+       <STRONG>o</STRONG>   The  files  written  and read by these functions use an implementa-
+           tion-specific format.  Although the format is an obvious target for
+           standardization, it has been overlooked.
+
+           Interestingly  enough,  according to the copyright dates in Solaris
+           source, the functions (along with <STRONG>scr_init</STRONG>, etc.)  originated  with
+           the University of California, Berkeley (in 1982) and were later (in
+           1988) incorporated into SVr4.  Oddly, there are no  such  functions
+           in the 4.3BSD curses sources.
+
+       <STRONG>o</STRONG>   Most implementations simply dump the binary <STRONG>WINDOW</STRONG> structure to the
+           file.  These include SVr4 curses, NetBSD and PDCurses, as  well  as
+           older <STRONG>ncurses</STRONG> versions.  This implementation (as well as the X/Open
+           variant of Solaris curses, dated 1995) uses textual dumps.
+
+           The implementations which  use  binary  dumps  use  block-I/O  (the
+           <STRONG>fwrite</STRONG>  and  <STRONG>fread</STRONG>  functions).   Those  that use textual dumps use
+           buffered-I/O.  A few applications may happen to write extra data in
+           the  file  using these functions.  Doing that can run into problems
+           mixing block- and buffered-I/O.  This  implementation  reduces  the
+           problem  on writes by flushing the output.  However, reading from a
+           file written using mixed schemes may not be successful.
+
+
+</PRE><H3><a name="h3-unctrl_wunctrl">unctrl/wunctrl</a></H3><PRE>
+       The XSI Curses standard, Issue 4 describes these functions.  It  states
+       that <STRONG>unctrl</STRONG> and <STRONG>wunctrl</STRONG> will return a null pointer if unsuccessful, but
+       does not define any error conditions.  This implementation  checks  for
+       three cases:
+
+       <STRONG>o</STRONG>   the  parameter  is  a  7-bit  US-ASCII code.  This is the case that
+           X/Open Curses documented.
+
+       <STRONG>o</STRONG>   the parameter is in the range 128-159, i.e., a C1 control code.  If
+           <STRONG><A HREF="legacy_coding.3x.html">use_legacy_coding(3x)</A></STRONG>  has  been  called with a <STRONG>2</STRONG> parameter, <STRONG>unctrl</STRONG>
+           returns the parameter, i.e., a one-character string with the param-
+           eter  as  the  first  character.  Otherwise, it returns "~@", "~A",
+           etc., analogous to "^@", "^A", C0 controls.
+
+           X/Open Curses does not document whether <STRONG>unctrl</STRONG> can be called before
+           initializing curses.  This implementation permits that, and returns
+           the "~@", etc., values in that case.
+
+       <STRONG>o</STRONG>   parameter values outside the 0 to 255 range.  <STRONG>unctrl</STRONG> returns a null
+           pointer.
+
+       The strings returned by <STRONG>unctrl</STRONG> in this implementation are determined at
+       compile time, showing C1 controls from the upper-128 codes with  a  "~"
+       prefix  rather  than "^".  Other implementations have different conven-
+       tions.  For example, they may show both sets of control characters with
+       "^", and strip the parameter to 7 bits.  Or they may ignore C1 controls
+       and treat all of the upper-128 codes as printable.  This implementation
+       uses  8  bits  but  does  not modify the string to reflect locale.  The
+       <STRONG><A HREF="legacy_coding.3x.html">use_legacy_coding(3x)</A></STRONG> function allows the caller to change  the  output
+       of <STRONG>unctrl</STRONG>.
+
+       Likewise,  the <STRONG><A HREF="curs_inopts.3x.html">meta(3x)</A></STRONG> function allows the caller to change the output
+       of <STRONG>keyname</STRONG>, i.e., it determines whether to  use  the  "M-"  prefix  for
+       "meta"  keys  (codes  in  the  range 128 to 255).  Both <STRONG>use_legacy_cod-</STRONG>
+       <STRONG><A HREF="use_legacy_coding.3x.html">ing(3x)</A></STRONG> and <STRONG><A HREF="curs_inopts.3x.html">meta(3x)</A></STRONG> succeed only after curses is initialized.   X/Open
+       Curses  does  not  document  the  treatment  of codes 128 to 159.  When
+       treating them as "meta" keys (or if <STRONG>keyname</STRONG> is called before initializ-
+       ing curses), this implementation returns strings "M-^@", "M-^A", etc.
+
+       X/Open Curses documents <STRONG>unctrl</STRONG> as declared in <STRONG>&lt;unctrl.h&gt;</STRONG>, which <STRONG>ncurses</STRONG>
+       does.  However, <STRONG>ncurses</STRONG>' <STRONG>&lt;curses.h&gt;</STRONG> includes <STRONG>&lt;unctrl.h&gt;</STRONG>,  matching  the
+       behavior of SVr4 curses.  Other implementations may not do that.
+
+
+</PRE><H3><a name="h3-use_env_use_tioctl">use_env/use_tioctl</a></H3><PRE>
+       If  <STRONG>ncurses</STRONG>  is  configured  to provide the sp-functions extension, the
+       state of <STRONG>use_env</STRONG> and <STRONG>use_tioctl</STRONG> may be  updated  before  creating  each
+       <EM>screen</EM>  rather  than  once  only  (<STRONG><A HREF="curs_sp_funcs.3x.html">curs_sp_funcs(3x)</A></STRONG>).  This feature of
+       <STRONG>use_env</STRONG> is not provided by other implementation of curses.
+
+
+</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_inopts.3x.html">curs_inopts(3x)</A></STRONG>,    <STRONG><A HREF="curs_kernel.3x.html">curs_kernel(3x)</A></STRONG>,
+       <STRONG><A HREF="curs_scr_dump.3x.html">curs_scr_dump(3x)</A></STRONG>,  <STRONG><A HREF="curs_sp_funcs.3x.html">curs_sp_funcs(3x)</A></STRONG>,  <STRONG><A HREF="curs_variables.3x.html">curs_variables(3x)</A></STRONG>, <STRONG>legacy_cod-</STRONG>
+       <STRONG><A HREF="legacy_coding.3x.html">ing(3x)</A></STRONG>.
+
+
+
+                                                                 <STRONG><A HREF="curs_util.3x.html">curs_util(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-unctrl">unctrl</a></li>
+<li><a href="#h3-keyname_key_name">keyname/key_name</a></li>
+<li><a href="#h3-filter_nofilter">filter/nofilter</a></li>
+<li><a href="#h3-use_env">use_env</a></li>
+<li><a href="#h3-use_tioctl">use_tioctl</a></li>
+<li><a href="#h3-putwin_getwin">putwin/getwin</a></li>
+<li><a href="#h3-delay_output">delay_output</a></li>
+<li><a href="#h3-flushinp">flushinp</a></li>
+</ul>
+</li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a>
+<ul>
+<li><a href="#h3-filter">filter</a></li>
+<li><a href="#h3-keyname">keyname</a></li>
+<li><a href="#h3-nofilter_use_tioctl">nofilter/use_tioctl</a></li>
+<li><a href="#h3-putwin_getwin-file-format">putwin/getwin file-format</a></li>
+<li><a href="#h3-unctrl_wunctrl">unctrl/wunctrl</a></li>
+<li><a href="#h3-use_env_use_tioctl">use_env/use_tioctl</a></li>
+</ul>
+</li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_variables.3x.html b/doc/html/man/curs_variables.3x.html
new file mode 100644
index 0000000..1dd822f
--- /dev/null
+++ b/doc/html/man/curs_variables.3x.html
@@ -0,0 +1,220 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2020,2021 Thomas E. Dickey                                *
+  * Copyright 2010-2015,2017 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_variables.3x,v 1.17 2021/12/25 21:49:32 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_variables 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_variables 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_variables.3x.html">curs_variables(3x)</A></STRONG>                                          <STRONG><A HREF="curs_variables.3x.html">curs_variables(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>COLORS</STRONG>, <STRONG>COLOR_PAIRS</STRONG>, <STRONG>COLS</STRONG>, <STRONG>ESCDELAY</STRONG>, <STRONG>LINES</STRONG>, <STRONG>TABSIZE</STRONG>, <STRONG>curscr</STRONG>, <STRONG>newscr</STRONG>,
+       <STRONG>stdscr</STRONG> - <STRONG>curses</STRONG> global variables
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>COLOR_PAIRS;</STRONG>
+       <STRONG>int</STRONG> <STRONG>COLORS;</STRONG>
+       <STRONG>int</STRONG> <STRONG>COLS;</STRONG>
+       <STRONG>int</STRONG> <STRONG>ESCDELAY;</STRONG>
+       <STRONG>int</STRONG> <STRONG>LINES;</STRONG>
+       <STRONG>int</STRONG> <STRONG>TABSIZE;</STRONG>
+       <STRONG>WINDOW</STRONG> <STRONG>*</STRONG> <STRONG>curscr;</STRONG>
+       <STRONG>WINDOW</STRONG> <STRONG>*</STRONG> <STRONG>newscr;</STRONG>
+       <STRONG>WINDOW</STRONG> <STRONG>*</STRONG> <STRONG>stdscr;</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       This page summarizes variables provided by the <STRONG>curses</STRONG> library.  A  more
+       complete description is given in the <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG> manual page.
+
+       Depending  on  the  configuration,  these  may  be actual variables, or
+       macros (see <STRONG><A HREF="curs_threads.3x.html">curs_threads(3x)</A></STRONG> and <STRONG><A HREF="curs_opaque.3x.html">curs_opaque(3x)</A></STRONG>) which  provide  read-
+       only  access  to  <EM>curses</EM>'s  state.  In either case, applications should
+       treat them as read-only to avoid confusing the library.
+
+
+</PRE><H3><a name="h3-COLOR_PAIRS">COLOR_PAIRS</a></H3><PRE>
+       After initializing curses, this variable contains the number  of  color
+       pairs  which  the  terminal  can  support.  Usually the number of color
+       pairs will be the product <STRONG>COLORS</STRONG>*<STRONG>COLORS</STRONG>, however  this  is  not  always
+       true:
+
+       <STRONG>o</STRONG>   a few terminals use HLS colors, which do not follow this rule
+
+       <STRONG>o</STRONG>   terminals  supporting  a  large number of colors are limited by the
+           number of color pairs that can be represented  in  a  <EM>signed</EM>  <EM>short</EM>
+           value.
+
+
+</PRE><H3><a name="h3-COLORS">COLORS</a></H3><PRE>
+       After  initializing curses, this variable contains the number of colors
+       which the terminal can support.
+
+
+</PRE><H3><a name="h3-COLS">COLS</a></H3><PRE>
+       After initializing curses, this variable  contains  the  width  of  the
+       screen, i.e., the number of columns.
+
+
+</PRE><H3><a name="h3-ESCDELAY">ESCDELAY</a></H3><PRE>
+       This variable holds the number of milliseconds to wait after reading an
+       escape character, to distinguish between an individual escape character
+       entered on the keyboard from escape sequences sent by cursor- and func-
+       tion-keys (see <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG>).
+
+
+</PRE><H3><a name="h3-LINES">LINES</a></H3><PRE>
+       After initializing curses, this variable contains  the  height  of  the
+       screen, i.e., the number of lines.
+
+
+</PRE><H3><a name="h3-TABSIZE">TABSIZE</a></H3><PRE>
+       This  variable  holds  the number of columns used by the <EM>curses</EM> library
+       when converting a tab character to spaces as it adds the tab to a  win-
+       dow (see <STRONG><A HREF="curs_addch.3x.html">curs_addch(3x)</A></STRONG>.
+
+
+</PRE><H3><a name="h3-The-Current-Screen">The Current Screen</a></H3><PRE>
+       This  implementation  of  curses uses a special window <STRONG>curscr</STRONG> to record
+       its updates to the terminal screen.
+
+       This is referred to as the "physical screen"  in  the  <STRONG><A HREF="curs_refresh.3x.html">curs_refresh(3x)</A></STRONG>
+       and <STRONG><A HREF="curs_outopts.3x.html">curs_outopts(3x)</A></STRONG> manual pages.
+
+
+</PRE><H3><a name="h3-The-New-Screen">The New Screen</a></H3><PRE>
+       This  implementation of curses uses a special window <STRONG>newscr</STRONG> to hold up-
+       dates to the terminal screen before applying them to <STRONG>curscr</STRONG>.
+
+       This is referred to as the "virtual  screen"  in  the  <STRONG><A HREF="curs_kernel.3x.html">curs_kernel(3x)</A></STRONG>,
+       <STRONG><A HREF="curs_refresh.3x.html">curs_refresh(3x)</A></STRONG> and <STRONG><A HREF="curs_outopts.3x.html">curs_outopts(3x)</A></STRONG> manual pages.
+
+
+</PRE><H3><a name="h3-The-Standard-Screen">The Standard Screen</a></H3><PRE>
+       Upon  initializing curses, a default window called <STRONG>stdscr</STRONG>, which is the
+       size of the terminal screen, is created.   Many  curses  functions  use
+       this window.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The   curses  library  is  initialized  using  either  <STRONG><A HREF="curs_initscr.3x.html">initscr(3x)</A></STRONG>,  or
+       <STRONG><A HREF="curs_initscr.3x.html">newterm(3x)</A></STRONG>.
+
+       If <STRONG>curses</STRONG> is configured to use separate curses/terminfo libraries, most
+       of these variables reside in the curses library.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       <STRONG>TABSIZE</STRONG>  is  a feature of SVr4 curses which is not documented by X/Open
+       curses.
+
+       <STRONG>o</STRONG>   In SVr4 curses, <STRONG>TABSIZE</STRONG> is initially set from the terminal descrip-
+           tion's  <STRONG>init_tabs</STRONG> capability.  After that, it can be altered by the
+           applications using SVr4 curses.
+
+           SVr4 curses uses the current value of <STRONG>TABSIZE</STRONG> to compute the  posi-
+           tion  of  tabstops  for  updating both the virtual screen with <STRONG>add-</STRONG>
+           <STRONG><A HREF="addch.3x.html">ch(3x)</A></STRONG> as well as the physical screen with <STRONG><A HREF="curs_terminfo.3x.html">mvcur(3x)</A></STRONG>.
+
+       <STRONG>o</STRONG>   This implementation uses the current value of <STRONG>TABSIZE</STRONG> only for  up-
+           dating  the  virtual screen.  It uses the terminal description's <STRONG>it</STRONG>
+           (<STRONG>init_tabs</STRONG>) capability for computing hardware tabs (i.e., tab stops
+           on the physical screen).
+
+       <STRONG>o</STRONG>   Other  implementations  differ.  For instance, NetBSD curses allows
+           <STRONG>TABSIZE</STRONG> to be set through an environment variable.  This  implemen-
+           tation does not.
+
+           NetBSD curses does not support hardware tabs; it uses the <STRONG>init_tabs</STRONG>
+           capability and the <STRONG>TABSIZE</STRONG> variable only for updating  the  virtual
+           screen.
+
+       <STRONG>ESCDELAY</STRONG> is an extension in AIX curses:
+
+       <STRONG>o</STRONG>   In AIX, the units for <STRONG>ESCDELAY</STRONG> are <EM>fifths</EM> of a millisecond.
+
+       <STRONG>o</STRONG>   The default value for AIX's <STRONG>ESCDELAY</STRONG> is 0.1 seconds.
+
+       <STRONG>o</STRONG>   AIX  also enforces a limit of 10,000 seconds for <STRONG>ESCDELAY</STRONG>; this im-
+           plementation currently has no upper limit.
+
+       This implementation has long used <STRONG>ESCDELAY</STRONG> with units of  milliseconds,
+       making  it  impossible to be completely compatible with AIX.  Likewise,
+       most users have either decided to override the value, or rely upon  its
+       default value.
+
+
+</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_opaque.3x.html">curs_opaque(3x)</A></STRONG>,   <STRONG><A HREF="curs_terminfo.3x.html">curs_terminfo(3x)</A></STRONG>,   <STRONG><A HREF="curs_threads.3x.html">curs_threads(3x)</A></STRONG>,
+       <STRONG><A HREF="term_variables.3x.html">term_variables(3x)</A></STRONG>, <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG>.
+
+
+
+                                                            <STRONG><A HREF="curs_variables.3x.html">curs_variables(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-COLOR_PAIRS">COLOR_PAIRS</a></li>
+<li><a href="#h3-COLORS">COLORS</a></li>
+<li><a href="#h3-COLS">COLS</a></li>
+<li><a href="#h3-ESCDELAY">ESCDELAY</a></li>
+<li><a href="#h3-LINES">LINES</a></li>
+<li><a href="#h3-TABSIZE">TABSIZE</a></li>
+<li><a href="#h3-The-Current-Screen">The Current Screen</a></li>
+<li><a href="#h3-The-New-Screen">The New Screen</a></li>
+<li><a href="#h3-The-Standard-Screen">The Standard Screen</a></li>
+</ul>
+</li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/curs_window.3x.html b/doc/html/man/curs_window.3x.html
new file mode 100644
index 0000000..660ed56
--- /dev/null
+++ b/doc/html/man/curs_window.3x.html
@@ -0,0 +1,284 @@
+<!--
+  ****************************************************************************
+  * Copyright 2020-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2015,2016 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_window.3x,v 1.28 2022/08/13 23:24:22 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>curs_window 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">curs_window 3x</H1>
+<PRE>
+<STRONG><A HREF="curs_window.3x.html">curs_window(3x)</A></STRONG>                                                <STRONG><A HREF="curs_window.3x.html">curs_window(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>newwin</STRONG>, <STRONG>delwin</STRONG>, <STRONG>mvwin</STRONG>, <STRONG>subwin</STRONG>, <STRONG>derwin</STRONG>, <STRONG>mvderwin</STRONG>, <STRONG>dupwin</STRONG>, <STRONG>wsyncup</STRONG>,
+       <STRONG>syncok</STRONG>, <STRONG>wcursyncup</STRONG>, <STRONG>wsyncdown</STRONG> - create <STRONG>curses</STRONG> windows
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>WINDOW</STRONG> <STRONG>*newwin(</STRONG>
+             <STRONG>int</STRONG> <EM>nlines</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>ncols</EM><STRONG>,</STRONG>
+             <STRONG>int</STRONG> <EM>begin</EM><STRONG>_</STRONG><EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>begin</EM><STRONG>_</STRONG><EM>x</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>delwin(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvwin(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>x</EM><STRONG>);</STRONG>
+       <STRONG>WINDOW</STRONG> <STRONG>*subwin(WINDOW</STRONG> <STRONG>*</STRONG><EM>orig</EM><STRONG>,</STRONG>
+             <STRONG>int</STRONG> <EM>nlines</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>ncols</EM><STRONG>,</STRONG>
+             <STRONG>int</STRONG> <EM>begin</EM><STRONG>_</STRONG><EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>begin</EM><STRONG>_</STRONG><EM>x</EM><STRONG>);</STRONG>
+       <STRONG>WINDOW</STRONG> <STRONG>*derwin(WINDOW</STRONG> <STRONG>*</STRONG><EM>orig</EM><STRONG>,</STRONG>
+             <STRONG>int</STRONG> <EM>nlines</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>ncols</EM><STRONG>,</STRONG>
+             <STRONG>int</STRONG> <EM>begin</EM><STRONG>_</STRONG><EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>begin</EM><STRONG>_</STRONG><EM>x</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>mvderwin(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>par</EM><STRONG>_</STRONG><EM>y</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>par</EM><STRONG>_</STRONG><EM>x</EM><STRONG>);</STRONG>
+       <STRONG>WINDOW</STRONG> <STRONG>*dupwin(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+       <STRONG>void</STRONG> <STRONG>wsyncup(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>syncok(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>bool</STRONG> <EM>bf</EM><STRONG>);</STRONG>
+       <STRONG>void</STRONG> <STRONG>wcursyncup(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+       <STRONG>void</STRONG> <STRONG>wsyncdown(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+
+</PRE><H3><a name="h3-newwin">newwin</a></H3><PRE>
+       Calling <STRONG>newwin</STRONG> creates and returns a pointer to a new window  with  the
+       given  number  of lines and columns.  The upper left-hand corner of the
+       window is at
+              line <EM>begin</EM>_<EM>y</EM>,
+              column <EM>begin</EM>_<EM>x</EM>
+
+       If either <EM>nlines</EM> or <EM>ncols</EM> is zero, they default to
+              <STRONG>LINES</STRONG> <STRONG>-</STRONG> <EM>begin</EM>_<EM>y</EM> and
+              <STRONG>COLS</STRONG> <STRONG>-</STRONG> <EM>begin</EM>_<EM>x</EM>.
+
+       A new full-screen window is created by calling <STRONG>newwin(0,0,0,0)</STRONG>.
+
+       Regardless of the function  used  for  creating  a  new  window  (e.g.,
+       <STRONG>newwin</STRONG>, <STRONG>subwin</STRONG>, <STRONG>derwin</STRONG>, <STRONG>newpad</STRONG>), rather than a duplicate (with <STRONG>dupwin</STRONG>),
+       all of the window modes are initialized to the default  values.   These
+       functions set window modes after a window is created:
+
+              idcok, idlok, immedok, keypad, leaveok, nodelay, scrollok,
+              setscrreg, syncok, wbkgdset, wbkgrndset, and wtimeout
+
+
+</PRE><H3><a name="h3-delwin">delwin</a></H3><PRE>
+       Calling <STRONG>delwin</STRONG> deletes the named window, freeing all memory  associated
+       with  it  (it does not actually erase the window's screen image).  Sub-
+       windows must be deleted before the main window can be deleted.
+
+
+</PRE><H3><a name="h3-mvwin">mvwin</a></H3><PRE>
+       Calling <STRONG>mvwin</STRONG> moves the window so that the upper left-hand corner is at
+       position  (<EM>x</EM>,  <EM>y</EM>).   If  the  move would cause the window to be off the
+       screen, it is an error and the window is not moved.  Moving  subwindows
+       is allowed, but should be avoided.
+
+
+</PRE><H3><a name="h3-subwin">subwin</a></H3><PRE>
+       Calling  <STRONG>subwin</STRONG>  creates and returns a pointer to a new window with the
+       given number of lines, <EM>nlines</EM>, and columns, <EM>ncols</EM>.  The  window  is  at
+       position (<EM>begin</EM>_<EM>y</EM>, <EM>begin</EM>_<EM>x</EM>) on the screen.  The subwindow shares memory
+       with the window <EM>orig</EM>, so that changes made to one  window  will  affect
+       both  windows.  When using this routine, it is necessary to call <STRONG>touch-</STRONG>
+       <STRONG>win</STRONG> or <STRONG>touchline</STRONG> on <EM>orig</EM> before calling <STRONG>wrefresh</STRONG> on the subwindow.
+
+
+</PRE><H3><a name="h3-derwin">derwin</a></H3><PRE>
+       Calling <STRONG>derwin</STRONG> is the same as calling <STRONG>subwin,</STRONG> except that  <EM>begin</EM>_<EM>y</EM>  and
+       <EM>begin</EM>_<EM>x</EM>  are  relative to the origin of the window <EM>orig</EM> rather than the
+       screen.  There is no difference between the subwindows and the  derived
+       windows.
+
+       Calling  <STRONG>mvderwin</STRONG> moves a derived window (or subwindow) inside its par-
+       ent window.  The screen-relative  parameters  of  the  window  are  not
+       changed.  This routine is used to display different parts of the parent
+       window at the same physical position on the screen.
+
+
+</PRE><H3><a name="h3-dupwin">dupwin</a></H3><PRE>
+       Calling <STRONG>dupwin</STRONG> creates an exact duplicate of the window <EM>win</EM>.
+
+
+</PRE><H3><a name="h3-wsyncup">wsyncup</a></H3><PRE>
+       Calling <STRONG>wsyncup</STRONG> touches all locations in  ancestors  of  <EM>win</EM>  that  are
+       changed  in  <EM>win</EM>.   If  <STRONG>syncok</STRONG> is called with second argument <STRONG>TRUE</STRONG> then
+       <STRONG>wsyncup</STRONG> is called automatically whenever there is a change in the  win-
+       dow.
+
+
+</PRE><H3><a name="h3-wsyncdown">wsyncdown</a></H3><PRE>
+       The  <STRONG>wsyncdown</STRONG>  routine  touches  each  location  in  <EM>win</EM> that has been
+       touched in any of its ancestor windows.  This routine is called by <STRONG>wre-</STRONG>
+       <STRONG>fresh</STRONG>, so it should almost never be necessary to call it manually.
+
+
+</PRE><H3><a name="h3-wcursyncup">wcursyncup</a></H3><PRE>
+       The  routine  <STRONG>wcursyncup</STRONG> updates the current cursor position of all the
+       ancestors of the window to reflect the current cursor position  of  the
+       window.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       Routines that return an integer return the integer <STRONG>ERR</STRONG> upon failure and
+       <STRONG>OK</STRONG> (SVr4 only specifies "an integer value other than  <STRONG>ERR</STRONG>")  upon  suc-
+       cessful completion.
+
+       Routines that return pointers return <STRONG>NULL</STRONG> on error.
+
+       X/Open defines no error conditions.  In this implementation
+
+       <STRONG>delwin</STRONG>
+            returns  an  error if the window pointer is null, or if the window
+            is the parent of another window.
+
+       <STRONG>derwin</STRONG>
+            returns an error if the parent window pointer is null, or  if  any
+            of  its  ordinates  or dimensions is negative, or if the resulting
+            window does not fit inside the parent window.
+
+       <STRONG>dupwin</STRONG>
+            returns an error if the window pointer is null.
+
+            This implementation also maintains a list of windows,  and  checks
+            that  the pointer passed to <STRONG>delwin</STRONG> is one that it created, return-
+            ing an error if it was not..
+
+       <STRONG>mvderwin</STRONG>
+            returns an error if the window pointer is null, or if some part of
+            the window would be placed off-screen.
+
+       <STRONG>mvwin</STRONG>
+            returns  an  error if the window pointer is null, or if the window
+            is really a pad, or if some part of the  window  would  be  placed
+            off-screen.
+
+       <STRONG>newwin</STRONG>
+            will  fail if either of its beginning ordinates is negative, or if
+            either the number of lines or columns is negative.
+
+       <STRONG>syncok</STRONG>
+            returns an error if the window pointer is null.
+
+       <STRONG>subwin</STRONG>
+            returns an error if the parent window pointer is null, or  if  any
+            of  its  ordinates  or dimensions is negative, or if the resulting
+            window does not fit inside the parent window.
+
+       The functions which return a window pointer may also fail if  there  is
+       insufficient  memory  for  its data structures.  Any of these functions
+       will fail if the screen has not been initialized, i.e., with <STRONG>initscr</STRONG> or
+       <STRONG>newterm</STRONG>.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       If  many small changes are made to the window, the <STRONG>wsyncup</STRONG> option could
+       degrade performance.
+
+       Note that <STRONG>syncok</STRONG> may be a macro.
+
+
+</PRE><H2><a name="h2-BUGS">BUGS</a></H2><PRE>
+       The subwindow functions (<STRONG>subwin</STRONG>, <STRONG>derwin</STRONG>, <STRONG>mvderwin</STRONG>, <STRONG>wsyncup</STRONG>,  <STRONG>wsyncdown</STRONG>,
+       <STRONG>wcursyncup</STRONG>,  <STRONG>syncok</STRONG>)  are flaky, incompletely implemented, and not well
+       tested.
+
+       The System V curses documentation is very unclear  about  what  <STRONG>wsyncup</STRONG>
+       and  <STRONG>wsyncdown</STRONG>  actually do.  It seems to imply that they are only sup-
+       posed to touch exactly  those  lines  that  are  affected  by  ancestor
+       changes.  The language here, and the behavior of the <STRONG>curses</STRONG> implementa-
+       tion, is patterned on the XPG4 curses standard.  The weaker  XPG4  spec
+       may result in slower updates.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       The XSI Curses standard, Issue 4 describes these functions.
+
+       X/Open Curses states regarding <STRONG>delwin</STRONG>:
+
+       <STRONG>o</STRONG>   It must delete subwindows before deleting their parent.
+
+       <STRONG>o</STRONG>   If  <STRONG>delwin</STRONG>  is asked to delete a parent window, it can only succeed
+           if the curses library keeps a list of the subwindows.  SVr4  curses
+           kept  a  count  of the number of subwindows rather than a list.  It
+           simply returned <STRONG>ERR</STRONG> when asked  to  delete  a  subwindow.   Solaris
+           X/Open curses does not even make that check, and will delete a par-
+           ent window which still has subwindows.
+
+       <STRONG>o</STRONG>   Since release 4.0 (1996), ncurses maintains a list of  windows  for
+           each  screen,  to ensure that a window has no subwindows before al-
+           lowing deletion.
+
+       <STRONG>o</STRONG>   NetBSD copied this feature of ncurses in 2003.
+           PDCurses follows the scheme used in Solaris X/Open curses.
+
+
+</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_refresh.3x.html">curs_refresh(3x)</A></STRONG>,    <STRONG><A HREF="curs_touch.3x.html">curs_touch(3x)</A></STRONG>,
+       <STRONG><A HREF="curs_variables.3x.html">curs_variables(3x)</A></STRONG>
+
+
+
+                                                               <STRONG><A HREF="curs_window.3x.html">curs_window(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-newwin">newwin</a></li>
+<li><a href="#h3-delwin">delwin</a></li>
+<li><a href="#h3-mvwin">mvwin</a></li>
+<li><a href="#h3-subwin">subwin</a></li>
+<li><a href="#h3-derwin">derwin</a></li>
+<li><a href="#h3-dupwin">dupwin</a></li>
+<li><a href="#h3-wsyncup">wsyncup</a></li>
+<li><a href="#h3-wsyncdown">wsyncdown</a></li>
+<li><a href="#h3-wcursyncup">wcursyncup</a></li>
+</ul>
+</li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-BUGS">BUGS</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/default_colors.3x.html b/doc/html/man/default_colors.3x.html
new file mode 100644
index 0000000..9614eec
--- /dev/null
+++ b/doc/html/man/default_colors.3x.html
@@ -0,0 +1,167 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 2000-2011,2016 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.                                                           *
+  ****************************************************************************
+  * Author: Thomas E. Dickey 1997,1999,2000,2005
+  * @Id: default_colors.3x,v 1.35 2022/02/12 20:03:40 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>default_colors 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">default_colors 3x</H1>
+<PRE>
+<STRONG><A HREF="default_colors.3x.html">default_colors(3x)</A></STRONG>                                          <STRONG><A HREF="default_colors.3x.html">default_colors(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>use_default_colors</STRONG>,  <STRONG>assume_default_colors</STRONG>  -  use  terminal's  default
+       colors
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>use_default_colors(void);</STRONG>
+       <STRONG>int</STRONG> <STRONG>assume_default_colors(int</STRONG> <EM>fg</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>bg</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The  <STRONG>use_default_colors</STRONG>   and   <STRONG>assume_default_colors</STRONG>   functions   are
+       extensions  to  the  curses library.  They are used with terminals that
+       support ISO 6429 color,  or  equivalent.   These  terminals  allow  the
+       application  to reset color to an unspecified default value (e.g., with
+       SGR 39 or SGR 49).
+
+       Applications that paint a colored background over the whole  screen  do
+       not  take  advantage  of  SGR  39  and  SGR  49.  Some applications are
+       designed to work with the default background,  using  colors  only  for
+       text.  For example, there are several implementations of the <STRONG>ls</STRONG> program
+       which use colors to denote different file types or permissions.   These
+       "color  ls"  programs  do  not necessarily modify the background color,
+       typically  using  only  the  <STRONG>setaf</STRONG>  terminfo  capability  to  set   the
+       foreground color.  Full-screen applications that use default colors can
+       achieve similar visual effects.
+
+       The first function, <STRONG>use_default_colors</STRONG>  tells  the  curses  library  to
+       assign  terminal  default  foreground/background colors to color number
+       -1.  So init_pair(x,COLOR_RED,-1) will initialize  pair  x  as  red  on
+       default  background and init_pair(x,-1,COLOR_BLUE) will initialize pair
+       x as default foreground on blue.
+
+       The other, <STRONG>assume_default_colors</STRONG> is  a  refinement  which  tells  which
+       colors  to  paint for color pair 0.  This function recognizes a special
+       color number -1, which denotes the default terminal color.
+
+       The following are equivalent:
+              <EM>use</EM><STRONG>_</STRONG><EM>default</EM><STRONG>_</STRONG><EM>colors();</EM>
+              <EM>assume</EM><STRONG>_</STRONG><EM>default</EM><STRONG>_</STRONG><EM>colors(-1,-1);</EM>
+
+       These are ncurses extensions.  For other curses implementations,  color
+       number  -1  does  not  mean  anything,  just  as  for  ncurses before a
+       successful call of <STRONG>use_default_colors</STRONG> or <STRONG>assume_default_colors</STRONG>.
+
+       Other curses implementations do not  allow  an  application  to  modify
+       color  pair  0.  They assume that the background is COLOR_BLACK, but do
+       not ensure that the color pair 0 is painted to  match  the  assumption.
+       If   your   application  does  not  use  either  <STRONG>use_default_colors</STRONG>  or
+       <STRONG>assume_default_colors</STRONG> ncurses will paint a white foreground (text) with
+       black background for color pair 0.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       These  functions return the integer <STRONG>ERR</STRONG> upon failure and <STRONG>OK</STRONG> on success.
+       They will fail if either the terminal does not support the <STRONG>orig_pair</STRONG> or
+       <STRONG>orig_colors</STRONG>  capability.   If  the  <STRONG>initialize_pair</STRONG>  capability  is not
+       found, this causes an error as well.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       Associated with this extension, the <STRONG>init_pair</STRONG> function accepts negative
+       arguments to specify default foreground or background colors.
+
+       The  <STRONG>use_default_colors</STRONG>  function  was added to support <STRONG>ded</STRONG>.  This is a
+       full-screen application which uses curses to manage only  part  of  the
+       screen.  The bottom portion of the screen, which is of adjustable size,
+       is left uncolored to display the results from shell commands.  The  top
+       portion  of  the screen colors filenames using a scheme like the "color
+       ls" programs.  Attempting to manage the background color of the  screen
+       for this application would give unsatisfactory results for a variety of
+       reasons.  This extension was devised after noting that color xterm (and
+       similar   programs)   provides   a  background  color  which  does  not
+       necessarily correspond to any of the  ANSI  colors.   While  a  special
+       terminfo  entry  could  be  constructed using nine colors, there was no
+       mechanism provided within curses to account for the  related  <STRONG>orig_pair</STRONG>
+       and <STRONG>back_color_erase</STRONG> capabilities.
+
+       The  <STRONG>assume_default_colors</STRONG>  function  was  added  to  solve a different
+       problem: support for applications which would use environment variables
+       and  other  configuration  to  bypass  curses' notion of the terminal's
+       default colors, setting specific values.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These routines are specific to ncurses.  They  were  not  supported  on
+       Version 7, BSD or System V implementations.  It is recommended that any
+       code depending on them be conditioned using NCURSES_VERSION.
+
+
+</PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
+       <STRONG>ded(1)</STRONG>, <STRONG><A HREF="curs_color.3x.html">curs_color(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-AUTHOR">AUTHOR</a></H2><PRE>
+       Thomas Dickey (from an analysis of the requirements for color xterm for
+       XFree86 3.1.2C, February 1996).
+
+
+
+                                                            <STRONG><A HREF="default_colors.3x.html">default_colors(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-AUTHOR">AUTHOR</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/define_key.3x.html b/doc/html/man/define_key.3x.html
new file mode 100644
index 0000000..4ab7c78
--- /dev/null
+++ b/doc/html/man/define_key.3x.html
@@ -0,0 +1,107 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2017 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.                                                           *
+  ****************************************************************************
+  * Author: Thomas E. Dickey 1997
+  * @Id: define_key.3x,v 1.21 2022/02/12 20:03:40 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>define_key 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">define_key 3x</H1>
+<PRE>
+<STRONG><A HREF="define_key.3x.html">define_key(3x)</A></STRONG>                                                  <STRONG><A HREF="define_key.3x.html">define_key(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>define_key</STRONG> - define a keycode
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>define_key(const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>definition</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>keycode</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       This  is an extension to the curses library.  It permits an application
+       to define keycodes with their corresponding control  strings,  so  that
+       the ncurses library will interpret them just as it would the predefined
+       codes in the terminfo database.
+
+       If the given string is null, any existing definition for the keycode is
+       removed.   Similarly,  if  the  given  keycode is negative or zero, any
+       existing string for the given definition is removed.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       The keycode must  be  greater  than  zero,  and  the  string  non-null,
+       otherwise  <STRONG>ERR</STRONG>  is  returned.   <STRONG>ERR</STRONG>  may  also  be returned if there is
+       insufficient memory to allocate the data to store the  definition.   If
+       no error is detected, <STRONG>OK</STRONG> is returned.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These  routines  are  specific  to ncurses.  They were not supported on
+       Version 7, BSD or System V implementations.  It is recommended that any
+       code depending on them be conditioned using NCURSES_VERSION.
+
+
+</PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
+       <STRONG><A HREF="keyok.3x.html">keyok(3x)</A></STRONG>, <STRONG><A HREF="key_defined.3x.html">key_defined(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-AUTHOR">AUTHOR</a></H2><PRE>
+       Thomas Dickey.
+
+
+
+                                                                <STRONG><A HREF="define_key.3x.html">define_key(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></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>
+<li><a href="#h2-AUTHOR">AUTHOR</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/form.3x.html b/doc/html/man/form.3x.html
new file mode 100644
index 0000000..422171c
--- /dev/null
+++ b/doc/html/man/form.3x.html
@@ -0,0 +1,275 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2020,2021 Thomas E. Dickey                                *
+  * Copyright 1998-2016,2017 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: form.3x,v 1.38 2021/12/25 21:49:32 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>form 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">form 3x</H1>
+<PRE>
+<STRONG><A HREF="form.3x.html">form(3x)</A></STRONG>                                                              <STRONG><A HREF="form.3x.html">form(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>form</STRONG> - curses extension for programming forms
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;form.h&gt;</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The <STRONG>form</STRONG> library provides terminal-independent facilities for composing
+       form screens on character-cell terminals.  The library includes:  field
+       routines, which create and modify form fields; and form routines, which
+       group fields into forms,  display  forms  on  the  screen,  and  handle
+       interaction with the user.
+
+       The  <STRONG>form</STRONG>  library uses the <STRONG>curses</STRONG> libraries.  To use the <STRONG>form</STRONG> library,
+       link with the options <STRONG>-lform</STRONG> <STRONG>-lcurses</STRONG>.
+
+       Your program should set up the locale, e.g.,
+
+            <STRONG>setlocale(LC_ALL,</STRONG> <STRONG>"");</STRONG>
+
+       so that input/output processing will work.
+
+       A curses initialization routine such as <STRONG>initscr</STRONG> must be  called  before
+       using any of these functions.
+
+
+</PRE><H3><a name="h3-Current-Default-Values-for-Field-Attributes">Current Default Values for Field Attributes</a></H3><PRE>
+       The  <STRONG>form</STRONG>  library maintains a default value for field attributes.  You
+       can get or  set  this  default  by  calling  the  appropriate  <STRONG>set_</STRONG>  or
+       retrieval  routine  with  a  <STRONG>NULL</STRONG> field pointer.  Changing this default
+       with a <STRONG>set_</STRONG> function affects  future  field  creations,  but  does  not
+       change the rendering of fields already created.
+
+
+</PRE><H3><a name="h3-Routine-Name-Index">Routine Name Index</a></H3><PRE>
+       The  following table lists each <STRONG>form</STRONG> routine and the name of the manual
+       page on which it is described.  Routines flagged with "*" are  ncurses-
+       specific, not present in SVr4.
+
+       <STRONG>curses</STRONG> Routine Name     Manual Page Name
+       --------------------------------------------------
+       current_field           <STRONG><A HREF="form_page.3x.html">form_page(3x)</A></STRONG>
+       data_ahead              <STRONG><A HREF="form_data.3x.html">form_data(3x)</A></STRONG>
+       data_behind             <STRONG><A HREF="form_data.3x.html">form_data(3x)</A></STRONG>
+       dup_field               <STRONG><A HREF="form_field_new.3x.html">form_field_new(3x)</A></STRONG>
+       dynamic_field_info      <STRONG><A HREF="form_field_info.3x.html">form_field_info(3x)</A></STRONG>
+       field_arg               <STRONG><A HREF="form_field_validation.3x.html">form_field_validation(3x)</A></STRONG>
+       field_back              <STRONG><A HREF="form_field_attributes.3x.html">form_field_attributes(3x)</A></STRONG>
+       field_buffer            <STRONG><A HREF="form_field_buffer.3x.html">form_field_buffer(3x)</A></STRONG>
+       field_count             <STRONG><A HREF="form_field.3x.html">form_field(3x)</A></STRONG>
+       field_fore              <STRONG><A HREF="form_field_attributes.3x.html">form_field_attributes(3x)</A></STRONG>
+       field_index             <STRONG><A HREF="form_page.3x.html">form_page(3x)</A></STRONG>
+       field_info              <STRONG><A HREF="form_field_info.3x.html">form_field_info(3x)</A></STRONG>
+       field_init              <STRONG><A HREF="form_hook.3x.html">form_hook(3x)</A></STRONG>
+       field_just              <STRONG><A HREF="form_field_just.3x.html">form_field_just(3x)</A></STRONG>
+       field_opts              <STRONG><A HREF="form_field_opts.3x.html">form_field_opts(3x)</A></STRONG>
+       field_opts_off          <STRONG><A HREF="form_field_opts.3x.html">form_field_opts(3x)</A></STRONG>
+       field_opts_on           <STRONG><A HREF="form_field_opts.3x.html">form_field_opts(3x)</A></STRONG>
+       field_pad               <STRONG><A HREF="form_field_attributes.3x.html">form_field_attributes(3x)</A></STRONG>
+       field_status            <STRONG><A HREF="form_field_buffer.3x.html">form_field_buffer(3x)</A></STRONG>
+       field_term              <STRONG><A HREF="form_hook.3x.html">form_hook(3x)</A></STRONG>
+       field_type              <STRONG><A HREF="form_field_validation.3x.html">form_field_validation(3x)</A></STRONG>
+       field_userptr           <STRONG><A HREF="form_field_userptr.3x.html">form_field_userptr(3x)</A></STRONG>
+
+       form_driver             <STRONG><A HREF="form_driver.3x.html">form_driver(3x)</A></STRONG>
+       form_driver_w           <STRONG><A HREF="form_driver.3x.html">form_driver(3x)</A></STRONG>*
+       form_fields             <STRONG><A HREF="form_field.3x.html">form_field(3x)</A></STRONG>
+       form_init               <STRONG><A HREF="form_hook.3x.html">form_hook(3x)</A></STRONG>
+       form_opts               <STRONG><A HREF="form_opts.3x.html">form_opts(3x)</A></STRONG>
+       form_opts_off           <STRONG><A HREF="form_opts.3x.html">form_opts(3x)</A></STRONG>
+       form_opts_on            <STRONG><A HREF="form_opts.3x.html">form_opts(3x)</A></STRONG>
+       form_page               <STRONG><A HREF="form_page.3x.html">form_page(3x)</A></STRONG>
+       form_request_by_name    <STRONG><A HREF="form_requestname.3x.html">form_requestname(3x)</A></STRONG>*
+       form_request_name       <STRONG><A HREF="form_requestname.3x.html">form_requestname(3x)</A></STRONG>*
+       form_sub                <STRONG><A HREF="form_win.3x.html">form_win(3x)</A></STRONG>
+       form_term               <STRONG><A HREF="form_hook.3x.html">form_hook(3x)</A></STRONG>
+       form_userptr            <STRONG><A HREF="form_userptr.3x.html">form_userptr(3x)</A></STRONG>
+       form_win                <STRONG><A HREF="form_win.3x.html">form_win(3x)</A></STRONG>
+       free_field              <STRONG><A HREF="form_field_new.3x.html">form_field_new(3x)</A></STRONG>
+       free_fieldtype          <STRONG><A HREF="form_fieldtype.3x.html">form_fieldtype(3x)</A></STRONG>
+       free_form               <STRONG><A HREF="form_new.3x.html">form_new(3x)</A></STRONG>
+       link_field              <STRONG><A HREF="form_field_new.3x.html">form_field_new(3x)</A></STRONG>
+       link_fieldtype          <STRONG><A HREF="form_fieldtype.3x.html">form_fieldtype(3x)</A></STRONG>
+       move_field              <STRONG><A HREF="form_field.3x.html">form_field(3x)</A></STRONG>
+       new_field               <STRONG><A HREF="form_field_new.3x.html">form_field_new(3x)</A></STRONG>
+       new_fieldtype           <STRONG><A HREF="form_fieldtype.3x.html">form_fieldtype(3x)</A></STRONG>
+       new_form                <STRONG><A HREF="form_new.3x.html">form_new(3x)</A></STRONG>
+       new_page                <STRONG><A HREF="form_new_page.3x.html">form_new_page(3x)</A></STRONG>
+       pos_form_cursor         <STRONG><A HREF="form_cursor.3x.html">form_cursor(3x)</A></STRONG>
+       post_form               <STRONG><A HREF="form_post.3x.html">form_post(3x)</A></STRONG>
+       scale_form              <STRONG><A HREF="form_win.3x.html">form_win(3x)</A></STRONG>
+       set_current_field       <STRONG><A HREF="form_page.3x.html">form_page(3x)</A></STRONG>
+       set_field_back          <STRONG><A HREF="form_field_attributes.3x.html">form_field_attributes(3x)</A></STRONG>
+       set_field_buffer        <STRONG><A HREF="form_field_buffer.3x.html">form_field_buffer(3x)</A></STRONG>
+       set_field_fore          <STRONG><A HREF="form_field_attributes.3x.html">form_field_attributes(3x)</A></STRONG>
+       set_field_init          <STRONG><A HREF="form_hook.3x.html">form_hook(3x)</A></STRONG>
+       set_field_just          <STRONG><A HREF="form_field_just.3x.html">form_field_just(3x)</A></STRONG>
+       set_field_opts          <STRONG><A HREF="form_field_opts.3x.html">form_field_opts(3x)</A></STRONG>
+       set_field_pad           <STRONG><A HREF="form_field_attributes.3x.html">form_field_attributes(3x)</A></STRONG>
+       set_field_status        <STRONG><A HREF="form_field_buffer.3x.html">form_field_buffer(3x)</A></STRONG>
+       set_field_term          <STRONG><A HREF="form_hook.3x.html">form_hook(3x)</A></STRONG>
+       set_field_type          <STRONG><A HREF="form_field_validation.3x.html">form_field_validation(3x)</A></STRONG>
+       set_field_userptr       <STRONG><A HREF="form_field_userptr.3x.html">form_field_userptr(3x)</A></STRONG>
+       set_fieldtype_arg       <STRONG><A HREF="form_fieldtype.3x.html">form_fieldtype(3x)</A></STRONG>
+       set_fieldtype_choice    <STRONG><A HREF="form_fieldtype.3x.html">form_fieldtype(3x)</A></STRONG>
+       set_form_fields         <STRONG><A HREF="form_field.3x.html">form_field(3x)</A></STRONG>
+       set_form_init           <STRONG><A HREF="form_hook.3x.html">form_hook(3x)</A></STRONG>
+       set_form_opts           <STRONG><A HREF="form_field_opts.3x.html">form_field_opts(3x)</A></STRONG>
+       set_form_page           <STRONG><A HREF="form_page.3x.html">form_page(3x)</A></STRONG>
+       set_form_sub            <STRONG><A HREF="form_win.3x.html">form_win(3x)</A></STRONG>
+       set_form_term           <STRONG><A HREF="form_hook.3x.html">form_hook(3x)</A></STRONG>
+       set_form_userptr        <STRONG><A HREF="form_userptr.3x.html">form_userptr(3x)</A></STRONG>
+       set_form_win            <STRONG><A HREF="form_win.3x.html">form_win(3x)</A></STRONG>
+       set_max_field           <STRONG><A HREF="form_field_buffer.3x.html">form_field_buffer(3x)</A></STRONG>
+       set_new_page            <STRONG><A HREF="form_new_page.3x.html">form_new_page(3x)</A></STRONG>
+       unfocus_current_field   <STRONG><A HREF="form_page.3x.html">form_page(3x)</A></STRONG>*
+       unpost_form             <STRONG><A HREF="form_post.3x.html">form_post(3x)</A></STRONG>
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       Routines  that  return  pointers return <STRONG>NULL</STRONG> on error, and set <STRONG>errno</STRONG> to
+       the  corresponding  error-code  returned  by  functions  returning   an
+       integer.   Routines  that return an integer return one of the following
+       error codes:
+
+       <STRONG>E_OK</STRONG> The routine succeeded.
+
+       <STRONG>E_BAD_ARGUMENT</STRONG>
+            Routine detected an incorrect or out-of-range argument.
+
+       <STRONG>E_BAD_STATE</STRONG>
+            Routine was called from an initialization or termination function.
+
+       <STRONG>E_CONNECTED</STRONG>
+            The field is already connected to a form.
+
+       <STRONG>E_INVALID_FIELD</STRONG>
+            Contents of a field are not valid.
+
+       <STRONG>E_NOT_CONNECTED</STRONG>
+            No fields are connected to the form.
+
+       <STRONG>E_NOT_POSTED</STRONG>
+            The form has not been posted.
+
+       <STRONG>E_NO_ROOM</STRONG>
+            Form is too large for its window.
+
+       <STRONG>E_POSTED</STRONG>
+            The form is already posted.
+
+       <STRONG>E_REQUEST_DENIED</STRONG>
+            The form driver could not process the request.
+
+       <STRONG>E_SYSTEM_ERROR</STRONG>
+            System error occurred (see <STRONG>errno(3)</STRONG>).
+
+       <STRONG>E_UNKNOWN_COMMAND</STRONG>
+            The form driver code saw an unknown request code.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The header  file  <STRONG>&lt;form.h&gt;</STRONG>  automatically  includes  the  header  files
+       <STRONG>&lt;curses.h&gt;</STRONG> and <STRONG>&lt;eti.h&gt;</STRONG>.
+
+       In your library list, libform.a should be before libncurses.a; that is,
+       you want to say "-lform -lncurses", not the  other  way  around  (which
+       would give you a link error when using static libraries).
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These  routines  emulate  the  System  V  forms library.  They were not
+       supported on Version 7 or BSD versions.
+
+       The menu facility was documented in SVr4.2 in <EM>Character</EM> <EM>User</EM>  <EM>Interface</EM>
+       <EM>Programming</EM> <EM>(UNIX</EM> <EM>SVR4.2)</EM>.
+
+       It is not part of X/Open Curses.
+
+       Aside from ncurses, there are few implementations:
+
+       <STRONG>o</STRONG>   systems based on SVr4 source code, e.g., Solaris.
+
+       <STRONG>o</STRONG>   NetBSD curses.
+
+       A  few  functions  in  this  implementation  are  extensions  added for
+       ncurses,   but   not   provided   by   other   implementations,   e.g.,
+       <STRONG>form_driver_w</STRONG>, <STRONG>unfocus_current_field</STRONG>.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen  Pfeifer.   Manual  pages and adaptation for ncurses by Eric S.
+       Raymond.
+
+
+</PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
+       <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 20221231).
+
+
+
+                                                                      <STRONG><A HREF="form.3x.html">form(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-Current-Default-Values-for-Field-Attributes">Current Default Values for Field Attributes</a></li>
+<li><a href="#h3-Routine-Name-Index">Routine Name Index</a></li>
+</ul>
+</li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/form_cursor.3x.html b/doc/html/man/form_cursor.3x.html
new file mode 100644
index 0000000..5aecefc
--- /dev/null
+++ b/doc/html/man/form_cursor.3x.html
@@ -0,0 +1,117 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2015 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: form_cursor.3x,v 1.17 2022/02/12 20:03:40 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>form_cursor 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">form_cursor 3x</H1>
+<PRE>
+<STRONG><A HREF="form_cursor.3x.html">form_cursor(3x)</A></STRONG>                                                <STRONG><A HREF="form_cursor.3x.html">form_cursor(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>pos_form_cursor</STRONG> - position a form window cursor
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;form.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>pos_form_cursor(FORM</STRONG> <STRONG>*</STRONG><EM>form</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The  function  <STRONG>pos_form_cursor</STRONG>  restores  the  cursor  to  the position
+       required for the forms driver to continue processing requests.  This is
+       useful  after <STRONG>curses</STRONG> routines have been called to do screen-painting in
+       response to a form operation.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       This routine returns one of the following:
+
+       <STRONG>E_OK</STRONG> The routine succeeded.
+
+       <STRONG>E_BAD_ARGUMENT</STRONG>
+            Routine detected an incorrect or out-of-range argument.
+
+       <STRONG>E_NOT_POSTED</STRONG>
+            The form has not been posted.
+
+       <STRONG>E_SYSTEM_ERROR</STRONG>
+            System error occurred (see <STRONG>errno(3)</STRONG>).
+
+
+</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="form.3x.html">form(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  header  file  <STRONG>&lt;form.h&gt;</STRONG>  automatically  includes  the  header  file
+       <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These  routines  emulate  the  System  V  forms library.  They were not
+       supported on Version 7 or BSD versions.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                               <STRONG><A HREF="form_cursor.3x.html">form_cursor(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/form_data.3x.html b/doc/html/man/form_data.3x.html
new file mode 100644
index 0000000..3c42b46
--- /dev/null
+++ b/doc/html/man/form_data.3x.html
@@ -0,0 +1,103 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2015 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: form_data.3x,v 1.18 2022/02/12 20:03:40 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>form_data 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">form_data 3x</H1>
+<PRE>
+<STRONG><A HREF="form_data.3x.html">form_data(3x)</A></STRONG>                                                    <STRONG><A HREF="form_data.3x.html">form_data(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>data_ahead</STRONG>, <STRONG>data_behind</STRONG> - test for off-screen data in given forms
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;form.h&gt;</STRONG>
+
+       <STRONG>bool</STRONG> <STRONG>data_ahead(const</STRONG> <STRONG>FORM</STRONG> <STRONG>*</STRONG><EM>form</EM><STRONG>);</STRONG>
+       <STRONG>bool</STRONG> <STRONG>data_behind(const</STRONG> <STRONG>FORM</STRONG> <STRONG>*</STRONG><EM>form</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The function <STRONG>data_ahead</STRONG> tests whether there is off-screen data ahead in
+       the given form.  It returns TRUE (1) or FALSE (0).
+
+       The function <STRONG>data_behind</STRONG> tests whether there is off-screen data  behind
+       in the given form.  It returns TRUE (1) or FALSE (0).
+
+
+</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="form.3x.html">form(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  header  file  <STRONG>&lt;form.h&gt;</STRONG>  automatically  includes  the  header  file
+       <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These routines emulate the System  V  forms  library.   They  were  not
+       supported on Version 7 or BSD versions.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                                 <STRONG><A HREF="form_data.3x.html">form_data(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></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/form_driver.3x.html b/doc/html/man/form_driver.3x.html
new file mode 100644
index 0000000..b6420bc
--- /dev/null
+++ b/doc/html/man/form_driver.3x.html
@@ -0,0 +1,306 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2016,2017 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: form_driver.3x,v 1.39 2022/02/12 20:03:40 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>form_driver 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">form_driver 3x</H1>
+<PRE>
+<STRONG><A HREF="form_driver.3x.html">form_driver(3x)</A></STRONG>                                                <STRONG><A HREF="form_driver.3x.html">form_driver(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>form_driver</STRONG>, <STRONG>form_driver_w</STRONG> - command-processing loop of the form system
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;form.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>form_driver(FORM</STRONG> <STRONG>*</STRONG><EM>form</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>c</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>form_driver_w(FORM</STRONG> <STRONG>*</STRONG><EM>form</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>c</EM><STRONG>,</STRONG> <STRONG>wchar_t</STRONG> <EM>wch</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+
+</PRE><H3><a name="h3-form_driver">form_driver</a></H3><PRE>
+       Once a form has been posted (displayed), you should funnel input events
+       to it through <STRONG>form_driver</STRONG>.  This routine has three major input cases:
+
+       <STRONG>o</STRONG>   The input is a form navigation request.  Navigation  request  codes
+           are constants defined in <STRONG>&lt;form.h&gt;</STRONG>, which are distinct from the key-
+           and character codes returned by <STRONG><A HREF="curs_getch.3x.html">wgetch(3x)</A></STRONG>.
+
+       <STRONG>o</STRONG>   The input is a printable character.   Printable  characters  (which
+           must  be  positive,  less  than  256)  are checked according to the
+           program's locale settings.
+
+       <STRONG>o</STRONG>   The input is the KEY_MOUSE special key  associated  with  an  mouse
+           event.
+
+
+</PRE><H3><a name="h3-form_driver_w">form_driver_w</a></H3><PRE>
+       This  extension  simplifies  the  use  of  the forms library using wide
+       characters.  The input is either a key  code  (a  request)  or  a  wide
+       character returned by <STRONG><A HREF="curs_get_wch.3x.html">get_wch(3x)</A></STRONG>.  The type must be passed as well, to
+       enable the library  to  determine  whether  the  parameter  is  a  wide
+       character or a request.
+
+
+</PRE><H3><a name="h3-Form-driver-requests">Form-driver requests</a></H3><PRE>
+       The form driver requests are as follows:
+
+       <STRONG>Name</STRONG>               <STRONG>Description</STRONG>
+       ---------------------------------------------------------------------
+       REQ_BEG_FIELD      Move to the beginning of the field.
+       REQ_BEG_LINE       Move to the beginning of the line.
+       REQ_CLR_EOF        Clear to end of field from cursor.
+       REQ_CLR_EOL        Clear to end of line from cursor.
+       REQ_CLR_FIELD      Clear the entire field.
+       REQ_DEL_CHAR       Delete character at the cursor.
+       REQ_DEL_LINE       Delete line at the cursor.
+       REQ_DEL_PREV       Delete character before the cursor.
+       REQ_DEL_WORD       Delete blank-delimited word at the cursor.
+       REQ_DOWN_CHAR      Move down in the field.
+       REQ_DOWN_FIELD     Move down to a field.
+       REQ_END_FIELD      Move to the end of the field.
+       REQ_END_LINE       Move to the end of the line.
+       REQ_FIRST_FIELD    Move to the first field.
+       REQ_FIRST_PAGE     Move to the first page.
+       REQ_INS_CHAR       Insert a blank at the cursor.
+       REQ_INS_LINE       Insert a blank line at the cursor.
+       REQ_INS_MODE       Enter insert mode.
+       REQ_LAST_FIELD     Move to the last field.
+       REQ_LAST_PAGE      Move to the last field.
+       REQ_LEFT_CHAR      Move left in the field.
+       REQ_LEFT_FIELD     Move left to a field.
+       REQ_NEW_LINE       Insert or overlay a new line.
+       REQ_NEXT_CHAR      Move to the next char.
+
+       REQ_NEXT_CHOICE    Display next field choice.
+       REQ_NEXT_FIELD     Move to the next field.
+       REQ_NEXT_LINE      Move to the next line.
+       REQ_NEXT_PAGE      Move to the next page.
+       REQ_NEXT_PAGE      Move to the next page.
+       REQ_NEXT_WORD      Move to the next word.
+       REQ_OVL_MODE       Enter overlay mode.
+       REQ_PREV_CHAR      Move to the previous char.
+       REQ_PREV_CHOICE    Display previous field choice.
+       REQ_PREV_FIELD     Move to the previous field.
+       REQ_PREV_LINE      Move to the previous line.
+       REQ_PREV_PAGE      Move to the previous page.
+       REQ_PREV_WORD      Move to the previous word.
+       REQ_RIGHT_CHAR     Move right in the field.
+       REQ_RIGHT_FIELD    Move right to a field.
+       REQ_SCR_BCHAR      Scroll the field backward a character.
+       REQ_SCR_BHPAGE     Scroll the field backward half a page.
+       REQ_SCR_BLINE      Scroll the field backward a line.
+       REQ_SCR_BPAGE      Scroll the field backward a page.
+       REQ_SCR_FCHAR      Scroll the field forward a character.
+       REQ_SCR_FHPAGE     Scroll the field forward half a page.
+       REQ_SCR_FLINE      Scroll the field forward a line.
+       REQ_SCR_FPAGE      Scroll the field forward a page.
+       REQ_SCR_HBHALF     Horizontal scroll the field backward half a line.
+       REQ_SCR_HBLINE     Horizontal scroll the field backward a line.
+       REQ_SCR_HFHALF     Horizontal scroll the field forward half a line.
+       REQ_SCR_HFLINE     Horizontal scroll the field forward a line.
+       REQ_SFIRST_FIELD   Move to the sorted first field.
+       REQ_SLAST_FIELD    Move to the sorted last field.
+       REQ_SNEXT_FIELD    Move to the sorted next field.
+       REQ_SPREV_FIELD    Move to the sorted previous field.
+       REQ_UP_CHAR        Move up in the field.
+       REQ_UP_FIELD       Move up to a field.
+       REQ_VALIDATION     Validate field.
+
+       If  the  second argument is a printable character, the driver places it
+       in the current position in the current field.  If  it  is  one  of  the
+       forms requests listed above, that request is executed.
+
+
+</PRE><H3><a name="h3-Field-validation">Field validation</a></H3><PRE>
+       The  form  library  makes  updates  to  the window associated with form
+       fields rather than directly to the field buffers.
+
+       The form driver provides low-level control over  updates  to  the  form
+       fields.   The  form driver also provides for validating modified fields
+       to ensure that the contents meet whatever  constraints  an  application
+       may attach using <STRONG>set_field_type</STRONG>.
+
+       You  can  validate  a  field  without  making  any  changes to it using
+       <STRONG>REQ_VALIDATION</STRONG>.  The form driver also validates a field in these cases:
+
+       <STRONG>o</STRONG>   a call to <STRONG>set_current_field</STRONG> attempts to move to a different field.
+
+       <STRONG>o</STRONG>   a call to <STRONG>set_current_page</STRONG> attempts to move to a different page  of
+           the form.
+
+       <STRONG>o</STRONG>   a request attempts to move to a different field.
+
+       <STRONG>o</STRONG>   a request attempts to move to a different page of the form.
+
+       In each case, the move fails if the field is invalid.
+
+       If  the  modified  field  is valid, the form driver copies the modified
+       data from the window associated with the field to the field buffer.
+
+
+</PRE><H3><a name="h3-Mouse-handling">Mouse handling</a></H3><PRE>
+       If the second argument is the KEY_MOUSE  special  key,  the  associated
+       mouse  event  is translated into one of the above pre-defined requests.
+       Currently only clicks in the user window (e.g., inside the form display
+       area or the decoration window) are handled.
+
+       If you click above the display region of the form:
+
+          a REQ_PREV_FIELD is generated for a single click,
+
+          a REQ_PREV_PAGE is generated for a double-click and
+
+          a REQ_FIRST_FIELD is generated for a triple-click.
+
+       If you click below the display region of the form:
+
+          a REQ_NEXT_FIELD is generated for a single click,
+
+          a REQ_NEXT_PAGE is generated for a double-click and
+
+          a REQ_LAST_FIELD is generated for a triple-click.
+
+       If you click at an field inside the display area of the form:
+
+          <STRONG>o</STRONG>   the form cursor is positioned to that field.
+
+          <STRONG>o</STRONG>   If  you  double-click  a field, the form cursor is positioned to
+              that field and <STRONG>E_UNKNOWN_COMMAND</STRONG> is returned.  This return value
+              makes sense, because a double click usually means that an field-
+              specific action should be returned.  It is exactly  the  purpose
+              of  this  return  value  to  signal that an application specific
+              command should be executed.
+
+          <STRONG>o</STRONG>   If a translation into a request was  done,  <STRONG>form_driver</STRONG>  returns
+              the result of this request.
+
+       If  you clicked outside the user window or the mouse event could not be
+       translated into a form request an <STRONG>E_REQUEST_DENIED</STRONG> is returned.
+
+
+</PRE><H3><a name="h3-Application-defined-commands">Application-defined commands</a></H3><PRE>
+       If the second argument is neither printable nor one of the  above  pre-
+       defined form requests, the driver assumes it is an application-specific
+       command and returns  <STRONG>E_UNKNOWN_COMMAND</STRONG>.   Application-defined  commands
+       should  be  defined relative to <STRONG>MAX_COMMAND</STRONG>, the maximum value of these
+       pre-defined requests.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       <STRONG>form_driver</STRONG> returns one of the following error codes:
+
+       <STRONG>E_OK</STRONG> The routine succeeded.
+
+       <STRONG>E_BAD_ARGUMENT</STRONG>
+            Routine detected an incorrect or out-of-range argument.
+
+       <STRONG>E_BAD_STATE</STRONG>
+            Routine was called from an initialization or termination function.
+
+       <STRONG>E_NOT_POSTED</STRONG>
+            The form has not been posted.
+
+       <STRONG>E_INVALID_FIELD</STRONG>
+            Contents of field is invalid.
+
+       <STRONG>E_NOT_CONNECTED</STRONG>
+            No fields are connected to the form.
+
+       <STRONG>E_REQUEST_DENIED</STRONG>
+            The form driver could not process the request.
+
+       <STRONG>E_SYSTEM_ERROR</STRONG>
+            System error occurred (see <STRONG>errno(3)</STRONG>).
+
+       <STRONG>E_UNKNOWN_COMMAND</STRONG>
+            The form driver code saw an unknown request code.
+
+
+</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="form.3x.html">form(3x)</A></STRONG>,   <STRONG><A HREF="form_fieldtype.3x.html">form_fieldtype(3x)</A></STRONG>,    <STRONG><A HREF="form_field_buffer.3x.html">form_field_buffer(3x)</A></STRONG>,
+       <STRONG><A HREF="form_field_validation.3x.html">form_field_validation(3x)</A></STRONG>, <STRONG><A HREF="form_variables.3x.html">form_variables(3x)</A></STRONG>, <STRONG><A HREF="curs_getch.3x.html">getch(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  header  file  <STRONG>&lt;form.h&gt;</STRONG>  automatically  includes  the  header files
+       <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These routines emulate the System  V  forms  library.   They  were  not
+       supported on Version 7 or BSD versions.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                               <STRONG><A HREF="form_driver.3x.html">form_driver(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-form_driver">form_driver</a></li>
+<li><a href="#h3-form_driver_w">form_driver_w</a></li>
+<li><a href="#h3-Form-driver-requests">Form-driver requests</a></li>
+<li><a href="#h3-Field-validation">Field validation</a></li>
+<li><a href="#h3-Mouse-handling">Mouse handling</a></li>
+<li><a href="#h3-Application-defined-commands">Application-defined commands</a></li>
+</ul>
+</li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/form_field.3x.html b/doc/html/man/form_field.3x.html
new file mode 100644
index 0000000..0f51ef5
--- /dev/null
+++ b/doc/html/man/form_field.3x.html
@@ -0,0 +1,137 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2012 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: form_field.3x,v 1.20 2022/02/12 20:03:40 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>form_field 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">form_field 3x</H1>
+<PRE>
+<STRONG><A HREF="form_field.3x.html">form_field(3x)</A></STRONG>                                                  <STRONG><A HREF="form_field.3x.html">form_field(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>form_field</STRONG> - make and break connections between fields and forms
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;form.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>set_form_fields(FORM</STRONG> <STRONG>*</STRONG><EM>form</EM><STRONG>,</STRONG> <STRONG>FIELD</STRONG> <STRONG>**</STRONG><EM>fields</EM><STRONG>);</STRONG>
+       <STRONG>FIELD</STRONG> <STRONG>**form_fields(const</STRONG> <STRONG>FORM</STRONG> <STRONG>*</STRONG><EM>form</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>field_count(const</STRONG> <STRONG>FORM</STRONG> <STRONG>*</STRONG><EM>form</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>move_field(FIELD</STRONG> <STRONG>*</STRONG><EM>field</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>frow</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>fcol</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The  function  <STRONG>set_form_fields</STRONG>  changes  the field pointer array of the
+       given <EM>form</EM>.  The array must be terminated by a <STRONG>NULL</STRONG>.
+
+       The function <STRONG>form_fields</STRONG> returns the field array of the given form.
+
+       The function <STRONG>field_count</STRONG> returns the count of fields in <EM>form</EM>.
+
+       The  function  <STRONG>move_field</STRONG>  moves  the  given  field  (which   must   be
+       disconnected) to a specified location on the screen.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       The  function  <STRONG>form_fields</STRONG>  returns  a pointer (which may be <STRONG>NULL</STRONG>).  It
+       does not set <STRONG>errno</STRONG>.
+
+       The function <STRONG>field_count</STRONG> returns <STRONG>ERR</STRONG> if the <EM>form</EM> parameter is <STRONG>NULL</STRONG>.
+
+       The  functions  <STRONG>set_form_fields</STRONG>  and  <STRONG>move_field</STRONG>  return  one  of   the
+       following codes on error:
+
+       <STRONG>E_OK</STRONG> The routine succeeded.
+
+       <STRONG>E_BAD_ARGUMENT</STRONG>
+            Routine detected an incorrect or out-of-range argument.
+
+       <STRONG>E_CONNECTED</STRONG>
+            The field is already connected to a form.
+
+       <STRONG>E_POSTED</STRONG>
+            The form is already posted.
+
+       <STRONG>E_SYSTEM_ERROR</STRONG>
+            System error occurred (see <STRONG>errno(3)</STRONG>).
+
+
+</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="form.3x.html">form(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  header  file  <STRONG>&lt;form.h&gt;</STRONG>  automatically  includes  the  header  file
+       <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These routines emulate the System  V  forms  library.   They  were  not
+       supported on Version 7 or BSD versions.
+
+       The  SVr4  forms  library documentation specifies the <STRONG>field_count</STRONG> error
+       value as -1 (which is the value of <STRONG>ERR</STRONG>).
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                                <STRONG><A HREF="form_field.3x.html">form_field(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/form_field_attributes.3x.html b/doc/html/man/form_field_attributes.3x.html
new file mode 100644
index 0000000..7996122
--- /dev/null
+++ b/doc/html/man/form_field_attributes.3x.html
@@ -0,0 +1,131 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2006,2010 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: form_field_attributes.3x,v 1.21 2022/02/12 20:03:40 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>form_field_attributes 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">form_field_attributes 3x</H1>
+<PRE>
+<STRONG><A HREF="form_field_attributes.3x.html">form_field_attributes(3x)</A></STRONG>                            <STRONG><A HREF="form_field_attributes.3x.html">form_field_attributes(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>form_field_attributes</STRONG> - color and attribute control for form fields
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;form.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>set_field_fore(FIELD</STRONG> <STRONG>*</STRONG><EM>field</EM><STRONG>,</STRONG> <STRONG>chtype</STRONG> <EM>attr</EM><STRONG>);</STRONG>
+       <STRONG>chtype</STRONG> <STRONG>field_fore(const</STRONG> <STRONG>FIELD</STRONG> <STRONG>*</STRONG><EM>field</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>set_field_back(FIELD</STRONG> <STRONG>*</STRONG><EM>field</EM><STRONG>,</STRONG> <STRONG>chtype</STRONG> <EM>attr</EM><STRONG>);</STRONG>
+       <STRONG>chtype</STRONG> <STRONG>field_back(const</STRONG> <STRONG>FIELD</STRONG> <STRONG>*</STRONG><EM>field</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>set_field_pad(FIELD</STRONG> <STRONG>*</STRONG><EM>field</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>pad</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>field_pad(const</STRONG> <STRONG>FIELD</STRONG> <STRONG>*</STRONG><EM>field</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The  function  <STRONG>set_field_fore</STRONG>  sets  the foreground attribute of <EM>field</EM>.
+       This is the highlight used to display the field contents.  The function
+       <STRONG>field_fore</STRONG>   returns   the   foreground   attribute.   The  default  is
+       <STRONG>A_STANDOUT</STRONG>.
+
+       The function <STRONG>set_field_back</STRONG> sets the background attribute of <EM>form</EM>. This
+       is  the  highlight  used to display the extent fields in the form.  The
+       function <STRONG>field_back</STRONG> returns the background attribute.  The  default  is
+       <STRONG>A_NORMAL</STRONG>.
+
+       The  function  <STRONG>set_field_pad</STRONG> sets the character used to fill the field.
+       The function <STRONG>field_pad</STRONG> returns the given  form's  pad  character.   The
+       default is a blank.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       These routines return one of the following:
+
+       <STRONG>E_OK</STRONG> The routine succeeded.
+
+       <STRONG>E_BAD_ARGUMENT</STRONG>
+            Routine detected an incorrect or out-of-range argument.
+
+       <STRONG>E_SYSTEM_ERROR</STRONG>
+            System error occurred (see <STRONG>errno(3)</STRONG>).
+
+
+</PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
+       <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG>  and  related  pages  whose names begin "form_" for detailed
+       descriptions of the entry points.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  header  file  <STRONG>&lt;form.h&gt;</STRONG>  automatically  includes  the  header  file
+       <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These  routines  emulate  the  System  V  forms library.  They were not
+       supported on Version 7 or BSD versions.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                     <STRONG><A HREF="form_field_attributes.3x.html">form_field_attributes(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/form_field_buffer.3x.html b/doc/html/man/form_field_buffer.3x.html
new file mode 100644
index 0000000..1bc00e3
--- /dev/null
+++ b/doc/html/man/form_field_buffer.3x.html
@@ -0,0 +1,173 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2017 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: form_field_buffer.3x,v 1.30 2022/02/12 20:03:40 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>form_field_buffer 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">form_field_buffer 3x</H1>
+<PRE>
+<STRONG><A HREF="form_field_buffer.3x.html">form_field_buffer(3x)</A></STRONG>                                    <STRONG><A HREF="form_field_buffer.3x.html">form_field_buffer(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>form_field_buffer</STRONG> - field buffer control
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;form.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>set_field_buffer(FIELD</STRONG> <STRONG>*</STRONG><EM>field</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>buf</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>value</EM><STRONG>);</STRONG>
+       <STRONG>char</STRONG> <STRONG>*field_buffer(const</STRONG> <STRONG>FIELD</STRONG> <STRONG>*</STRONG><EM>field</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>buffer</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>set_field_status(FIELD</STRONG> <STRONG>*</STRONG><EM>field</EM><STRONG>,</STRONG> <STRONG>bool</STRONG> <EM>status</EM><STRONG>);</STRONG>
+       <STRONG>bool</STRONG> <STRONG>field_status(const</STRONG> <STRONG>FIELD</STRONG> <STRONG>*</STRONG><EM>field</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>set_max_field(FIELD</STRONG> <STRONG>*</STRONG><EM>field</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>max</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The  function  <STRONG>set_field_buffer</STRONG>  sets  the numbered buffer of the given
+       field to contain a given string:
+
+          <STRONG>o</STRONG>   Buffer 0 is the displayed value of the field.
+
+          <STRONG>o</STRONG>   Other numbered buffers may be allocated by applications  through
+              the  <STRONG>nbuf</STRONG>  argument  of  (see  <STRONG><A HREF="form_field_new.3x.html">form_field_new(3x)</A></STRONG>)  but  are not
+              manipulated by the forms library.
+
+       The function <STRONG>field_buffer</STRONG> returns a pointer  to  the  contents  of  the
+       given numbered buffer:
+
+          <STRONG>o</STRONG>   The  buffer contents always have the same length, and are padded
+              with trailing spaces as needed to  ensure  this  length  is  the
+              same.
+
+          <STRONG>o</STRONG>   The  buffer  may contain leading spaces, depending on how it was
+              set.
+
+          <STRONG>o</STRONG>   The buffer contents are set with <STRONG>set_field_buffer</STRONG>, or as a  side
+              effect of any editing operations on the corresponding field.
+
+          <STRONG>o</STRONG>   Editing  operations  are  based on the <EM>window</EM> which displays the
+              field, rather than a <EM>string</EM>.  The window contains only printable
+              characters,  and  is  filled  with  blanks.  If you want the raw
+              data, you must write your own routine that copies the value  out
+              of the buffer and removes the leading and trailing spaces.
+
+          <STRONG>o</STRONG>   Because  editing  operations change the content of the buffer to
+              correspond to the window, you should not rely on  using  buffers
+              for long-term storage of form data.
+
+       The function <STRONG>set_field_status</STRONG> sets the associated status flag of <EM>field</EM>;
+       <STRONG>field_status</STRONG> gets the current value.  The  status  flag  is  set  to  a
+       nonzero value whenever the field changes.
+
+       The  function  <STRONG>set_max_field</STRONG> sets the maximum size for a dynamic field.
+       An argument of 0 turns off any maximum size threshold for that field.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       The <STRONG>field_buffer</STRONG>  function  returns  NULL  on  error.   It  sets  <STRONG>errno</STRONG>
+       according to their success:
+
+       <STRONG>E_OK</STRONG> The routine succeeded.
+
+       <STRONG>E_BAD_ARGUMENT</STRONG>
+            Routine detected an incorrect or out-of-range argument.
+
+       The <STRONG>field_status</STRONG> function returns <STRONG>TRUE</STRONG> or <STRONG>FALSE</STRONG>.
+
+       The remaining routines return one of the following:
+
+       <STRONG>E_OK</STRONG> The routine succeeded.
+
+       <STRONG>E_SYSTEM_ERROR</STRONG>
+            System error occurred (see <STRONG>errno(3)</STRONG>).
+
+       <STRONG>E_BAD_ARGUMENT</STRONG>
+            Routine detected an incorrect or out-of-range argument.
+
+
+</PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
+       <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG>  and  related  pages  whose names begin "form_" for detailed
+       descriptions of the entry points.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The header file <STRONG>&lt;form.h&gt;</STRONG> automatically includes the header file
+
+       When configured for wide characters, <STRONG>field_buffer</STRONG> returns a pointer  to
+       temporary   storage   (allocated   and  freed  by  the  library).   The
+       application should not attempt to modify the data.  It will be freed on
+       the next call to <STRONG>field_buffer</STRONG> to return the same buffer.  <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These  routines  emulate  the  System  V  forms library.  They were not
+       supported on Version 7 or BSD versions.
+
+       The  <STRONG>set_max_field</STRONG>   function   checks   for   an   ncurses   extension
+       <STRONG>O_INPUT_FIELD</STRONG>  which  allows a dynamic field to shrink if the new limit
+       is smaller than the current field size.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                         <STRONG><A HREF="form_field_buffer.3x.html">form_field_buffer(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/form_field_info.3x.html b/doc/html/man/form_field_info.3x.html
new file mode 100644
index 0000000..a485212
--- /dev/null
+++ b/doc/html/man/form_field_info.3x.html
@@ -0,0 +1,130 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2015 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: form_field_info.3x,v 1.21 2022/02/12 20:03:40 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>form_field_info 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">form_field_info 3x</H1>
+<PRE>
+<STRONG><A HREF="form_field_info.3x.html">form_field_info(3x)</A></STRONG>                                        <STRONG><A HREF="form_field_info.3x.html">form_field_info(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>dynamic_field_info</STRONG>, <STRONG>field_info</STRONG> - retrieve field characteristics
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;form.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>field_info(const</STRONG> <STRONG>FIELD</STRONG> <STRONG>*</STRONG><EM>field</EM><STRONG>,</STRONG>
+                      <STRONG>int</STRONG> <STRONG>*</STRONG><EM>rows</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <STRONG>*</STRONG><EM>cols</EM><STRONG>,</STRONG>
+                      <STRONG>int</STRONG> <STRONG>*</STRONG><EM>frow</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <STRONG>*</STRONG><EM>fcol</EM><STRONG>,</STRONG>
+                      <STRONG>int</STRONG> <STRONG>*</STRONG><EM>nrow</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <STRONG>*</STRONG><EM>nbuf</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>dynamic_field_info(const</STRONG> <STRONG>FIELD</STRONG> <STRONG>*</STRONG><EM>field</EM><STRONG>,</STRONG>
+                              <STRONG>int</STRONG> <STRONG>*</STRONG><EM>rows</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <STRONG>*</STRONG><EM>cols</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <STRONG>*</STRONG><EM>max</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The  function  <STRONG>field_info</STRONG> returns the sizes and other attributes passed
+       in to the field at its creation  time.   The  attributes  are:  height,
+       width,  row  of  upper-left corner, column of upper-left corner, number
+       off-screen rows, and number of working buffers.
+
+       The function <STRONG>dynamic_field_info</STRONG> returns the actual size of  the  field,
+       and  its  maximum  possible  size.  If the field has no size limit, the
+       location addressed by the third argument will be set to 0.  A field can
+       be made dynamic by turning off the <STRONG>O_STATIC</STRONG> option with <STRONG>field_opts_off</STRONG>.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       These routines return one of the following:
+
+       <STRONG>E_OK</STRONG> The routine succeeded.
+
+       <STRONG>E_SYSTEM_ERROR</STRONG>
+            System error occurred (see <STRONG>errno(3)</STRONG>).
+
+       <STRONG>E_BAD_ARGUMENT</STRONG>
+            Routine detected an incorrect or out-of-range argument.
+
+
+</PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
+       <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG>  and  related  pages  whose names begin "form_" for detailed
+       descriptions of the entry points.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  header  file  <STRONG>&lt;form.h&gt;</STRONG>  automatically  includes  the  header  file
+       <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These  routines  emulate  the  System  V  forms library.  They were not
+       supported on Version 7 or BSD versions.
+
+       A null (zero pointer) is accepted for any  of  the  return  values,  to
+       ignore  that  value.  Not all implementations allow this, e.g., Solaris
+       2.7 does not.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                           <STRONG><A HREF="form_field_info.3x.html">form_field_info(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/form_field_just.3x.html b/doc/html/man/form_field_just.3x.html
new file mode 100644
index 0000000..c40c6b2
--- /dev/null
+++ b/doc/html/man/form_field_just.3x.html
@@ -0,0 +1,119 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2015 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: form_field_just.3x,v 1.21 2022/02/12 20:03:40 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>form_field_just 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">form_field_just 3x</H1>
+<PRE>
+<STRONG><A HREF="form_field_just.3x.html">form_field_just(3x)</A></STRONG>                                        <STRONG><A HREF="form_field_just.3x.html">form_field_just(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>set_field_just</STRONG>, <STRONG>field_just</STRONG> - retrieve field characteristics
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;form.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>set_field_just(FIELD</STRONG> <STRONG>*</STRONG><EM>field</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>justification</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>field_just(const</STRONG> <STRONG>FIELD</STRONG> <STRONG>*</STRONG><EM>field</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The  function  <STRONG>set_field_just</STRONG>  sets  the  justification  attribute of a
+       field; <STRONG>field_just</STRONG>  returns  a  field's  justification  attribute.   The
+       attribute  may be one of NO_JUSTIFICATION, JUSTIFY_RIGHT, JUSTIFY_LEFT,
+       or JUSTIFY_CENTER.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       The   function   <STRONG>field_just</STRONG>   returns   one    of:    NO_JUSTIFICATION,
+       JUSTIFY_RIGHT, JUSTIFY_LEFT, or JUSTIFY_CENTER.
+
+       The function <STRONG>set_field_just</STRONG> returns one of the following:
+
+       <STRONG>E_OK</STRONG> The routine succeeded.
+
+       <STRONG>E_SYSTEM_ERROR</STRONG>
+            System error occurred (see <STRONG>errno(3)</STRONG>).
+
+       <STRONG>E_BAD_ARGUMENT</STRONG>
+            Routine detected an incorrect or out-of-range argument.
+
+
+</PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
+       <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG>  and  related  pages  whose names begin "form_" for detailed
+       descriptions of the entry points.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  header  file  <STRONG>&lt;form.h&gt;</STRONG>  automatically  includes  the  header  file
+       <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These  routines  emulate  the  System  V  forms library.  They were not
+       supported on Version 7 or BSD versions.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                           <STRONG><A HREF="form_field_just.3x.html">form_field_just(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/form_field_new.3x.html b/doc/html/man/form_field_new.3x.html
new file mode 100644
index 0000000..d52ee9e
--- /dev/null
+++ b/doc/html/man/form_field_new.3x.html
@@ -0,0 +1,146 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2015 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: form_field_new.3x,v 1.27 2022/02/12 20:03:40 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>form_field_new 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">form_field_new 3x</H1>
+<PRE>
+<STRONG><A HREF="form_field_new.3x.html">form_field_new(3x)</A></STRONG>                                          <STRONG><A HREF="form_field_new.3x.html">form_field_new(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>new_field</STRONG>,  <STRONG>dup_field</STRONG>, <STRONG>link_field</STRONG>, <STRONG>free_field</STRONG> - create and destroy form
+       fields
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;form.h&gt;</STRONG>
+
+       <STRONG>FIELD</STRONG> <STRONG>*new_field(int</STRONG> <EM>height</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>width</EM><STRONG>,</STRONG>
+                        <STRONG>int</STRONG> <EM>toprow</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>leftcol</EM><STRONG>,</STRONG>
+                        <STRONG>int</STRONG> <EM>offscreen</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>nbuffers</EM><STRONG>);</STRONG>
+       <STRONG>FIELD</STRONG> <STRONG>*dup_field(FIELD</STRONG> <STRONG>*</STRONG><EM>field</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>toprow</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>leftcol</EM><STRONG>);</STRONG>
+       <STRONG>FIELD</STRONG> <STRONG>*link_field(FIELD</STRONG> <STRONG>*</STRONG><EM>field</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>toprow</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>leftcol</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>free_field(FIELD</STRONG> <STRONG>*</STRONG><EM>field</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The function <STRONG>new_field</STRONG> allocates a new field and  initializes  it  from
+       the  parameters  given: height, width, row of upper-left corner, column
+       of upper-left corner, number off-screen rows, and number of  additional
+       working buffers.
+
+       The  function  <STRONG>dup_field</STRONG>  duplicates  a  field at a new location.  Most
+       attributes (including current contents, size, validation  type,  buffer
+       count,  growth  threshold,  justification,  foreground, background, pad
+       character, options, and user pointer) are copied.  Field status and the
+       field page bit are not copied.
+
+       The  function  <STRONG>link_field</STRONG> acts like <STRONG>dup_field</STRONG>, but the new field shares
+       buffers with its parent.  Attribute data is separate.
+
+       The function <STRONG>free_field</STRONG> de-allocates storage associated with a field.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       The functions <STRONG>new_field</STRONG>, <STRONG>dup_field</STRONG>, <STRONG>link_field</STRONG> return  <STRONG>NULL</STRONG>  on  error.
+       They set <STRONG>errno</STRONG> according to their success:
+
+       <STRONG>E_OK</STRONG> The routine succeeded.
+
+       <STRONG>E_BAD_ARGUMENT</STRONG>
+            Routine detected an incorrect or out-of-range argument.
+
+       <STRONG>E_SYSTEM_ERROR</STRONG>
+            System error occurred, e.g., malloc failure.
+
+       The function <STRONG>free_field</STRONG> returns one of the following:
+
+       <STRONG>E_OK</STRONG> The routine succeeded.
+
+       <STRONG>E_BAD_ARGUMENT</STRONG>
+            Routine detected an incorrect or out-of-range argument.
+
+       <STRONG>E_CONNECTED</STRONG>
+            field is connected.
+
+
+</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="form.3x.html">form(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  header  file  <STRONG>&lt;form.h&gt;</STRONG>  automatically  includes  the  header  file
+       <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These routines emulate the System  V  forms  library.   They  were  not
+       supported on Version 7 or BSD versions.
+
+       It  may be unwise to count on the set of attributes copied by <STRONG>dup_field</STRONG>
+       being portable; the System V  forms  library  documents  are  not  very
+       explicit about what gets copied and what does not.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                            <STRONG><A HREF="form_field_new.3x.html">form_field_new(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/form_field_opts.3x.html b/doc/html/man/form_field_opts.3x.html
new file mode 100644
index 0000000..71bc188
--- /dev/null
+++ b/doc/html/man/form_field_opts.3x.html
@@ -0,0 +1,188 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2014,2015 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: form_field_opts.3x,v 1.30 2022/02/12 20:03:40 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>form_field_opts 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">form_field_opts 3x</H1>
+<PRE>
+<STRONG><A HREF="form_field_opts.3x.html">form_field_opts(3x)</A></STRONG>                                        <STRONG><A HREF="form_field_opts.3x.html">form_field_opts(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>set_field_opts</STRONG>, <STRONG>field_opts_on</STRONG>, <STRONG>field_opts_off</STRONG>, <STRONG>field_opts</STRONG> - set and get
+       field options
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;form.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>set_field_opts(FIELD</STRONG> <STRONG>*</STRONG><EM>field</EM><STRONG>,</STRONG> <STRONG>Field_Options</STRONG> <EM>opts</EM><STRONG>);</STRONG>
+       <STRONG>Field_Options</STRONG> <STRONG>field_opts(const</STRONG> <STRONG>FIELD</STRONG> <STRONG>*</STRONG><EM>field</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>field_opts_on(FIELD</STRONG> <STRONG>*</STRONG><EM>field</EM><STRONG>,</STRONG> <STRONG>Field_Options</STRONG> <EM>opts</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>field_opts_off(FIELD</STRONG> <STRONG>*</STRONG><EM>field</EM><STRONG>,</STRONG> <STRONG>Field_Options</STRONG> <EM>opts</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The function <STRONG>set_field_opts</STRONG> sets all  the  given  field's  option  bits
+       (field option bits may be logically-OR'ed together).
+
+       The  function  <STRONG>field_opts_on</STRONG> turns on the given option bits, and leaves
+       others alone.
+
+       The function <STRONG>field_opts_off</STRONG> turns off the given option bits, and leaves
+       others alone.
+
+       The function <STRONG>field_opts</STRONG> returns the field's current option bits.
+
+       The following standard options are defined (all are on by default):
+
+       O_ACTIVE
+            The  field  is  visited during processing.  If this option is off,
+            the field will not be reachable by navigation keys.  Please notice
+            that an invisible field appears to be inactive also.
+
+       O_AUTOSKIP
+            Skip to the next field when this one fills.
+
+       O_BLANK
+            The  field is cleared whenever a character is entered at the first
+            position.
+
+       O_EDIT
+            The field can be edited.
+
+       O_NULLOK
+            Allow a blank field.
+
+       O_PASSOK
+            Validate field only if modified by user.
+
+       O_PUBLIC
+            The field contents are displayed as data is entered.
+
+       O_STATIC
+            Field buffers are fixed  to  field's  original  size.   Turn  this
+            option off to create a dynamic field.
+
+       O_VISIBLE
+            The  field  is  displayed.   If this option is off, display of the
+            field is suppressed.
+
+       O_WRAP
+            Words that do not fit on a line are  wrapped  to  the  next  line.
+            Words are blank-separated.
+
+       These extension options are defined (extensions are off by default):
+
+       O_DYNAMIC_JUSTIFY
+            Permit dynamic fields to be justified, like static fields.
+
+       O_NO_LEFT_STRIP
+            Preserve leading whitespace in the field buffer, which is normally
+            discarded.
+
+       O_EDGE_INSERT_STAY
+            When  inserting  into  a  field  up  to  the  boundary   position,
+            optionally   delay  the  scrolling,  so  that  the  last  inserted
+            character remains visible, but advance the cursor to  reflect  the
+            insertion.   This  allows the form library to display the inserted
+            character in one-character fields as well as allowing the  library
+            to maintain consistent state.
+
+       O_INPUT_FIELD
+            The <STRONG>set_max_field</STRONG> function checks for this extension, which allows
+            a dynamic field to shrink if the new limit  is  smaller  than  the
+            current field size.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       Except for <STRONG>field_opts</STRONG>, each routine returns one of the following:
+
+       <STRONG>E_OK</STRONG> The routine succeeded.
+
+       <STRONG>E_BAD_ARGUMENT</STRONG>
+            Routine detected an incorrect or out-of-range argument.
+
+       <STRONG>E_CURRENT</STRONG>
+            The field is the current field.
+
+       <STRONG>E_SYSTEM_ERROR</STRONG>
+            System error occurred (see <STRONG>errno(3)</STRONG>).
+
+
+</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="form.3x.html">form(3x)</A></STRONG>.  <STRONG><A HREF="form_field_just.3x.html">form_field_just(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  header  file  <STRONG>&lt;form.h&gt;</STRONG>  automatically  includes  the  header  file
+       <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These routines emulate the System  V  forms  library.   They  were  not
+       supported on Version 7 or BSD versions.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                           <STRONG><A HREF="form_field_opts.3x.html">form_field_opts(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/form_field_userptr.3x.html b/doc/html/man/form_field_userptr.3x.html
new file mode 100644
index 0000000..bdf4b9f
--- /dev/null
+++ b/doc/html/man/form_field_userptr.3x.html
@@ -0,0 +1,113 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2015 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: form_field_userptr.3x,v 1.19 2022/02/12 20:03:40 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>form_field_userptr 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">form_field_userptr 3x</H1>
+<PRE>
+<STRONG><A HREF="form_field_userptr.3x.html">form_field_userptr(3x)</A></STRONG>                                  <STRONG><A HREF="form_field_userptr.3x.html">form_field_userptr(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>set_field_userptr</STRONG>,  <STRONG>field_userptr</STRONG>  -  associate application data with a
+       form field
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;form.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>set_field_userptr(FIELD</STRONG> <STRONG>*</STRONG><EM>field</EM><STRONG>,</STRONG> <STRONG>void</STRONG> <STRONG>*</STRONG><EM>userptr</EM><STRONG>);</STRONG>
+       <STRONG>void</STRONG> <STRONG>*field_userptr(const</STRONG> <STRONG>FIELD</STRONG> <STRONG>*</STRONG><EM>field</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       Every form field has a field that can  be  used  to  hold  application-
+       specific  data  (that is, the form-driver code leaves it alone).  These
+       functions get and set that field.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       The function <STRONG>field_userptr</STRONG> returns a pointer (which may be  <STRONG>NULL</STRONG>).   It
+       does not set <STRONG>errno</STRONG>.
+
+       The function <STRONG>set_field_userptr</STRONG> returns <STRONG>E_OK</STRONG> (success).
+
+
+</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="form.3x.html">form(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  header  file  <STRONG>&lt;form.h&gt;</STRONG>  automatically  includes  the  header  file
+       <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These routines emulate the System  V  forms  library.   They  were  not
+       supported on Version 7 or BSD versions.
+
+       The user pointer is a void pointer.  We chose not to leave it as a char
+       pointer for SVr4 compatibility.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                        <STRONG><A HREF="form_field_userptr.3x.html">form_field_userptr(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/form_field_validation.3x.html b/doc/html/man/form_field_validation.3x.html
new file mode 100644
index 0000000..c0a0f9e
--- /dev/null
+++ b/doc/html/man/form_field_validation.3x.html
@@ -0,0 +1,249 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2017 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: form_field_validation.3x,v 1.36 2022/02/12 20:03:40 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>form_field_validation 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">form_field_validation 3x</H1>
+<PRE>
+<STRONG><A HREF="form_field_validation.3x.html">form_field_validation(3x)</A></STRONG>                            <STRONG><A HREF="form_field_validation.3x.html">form_field_validation(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>form_field_validation</STRONG> - data type validation for fields
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;form.h&gt;</STRONG>
+
+       <STRONG>void</STRONG> <STRONG>*field_arg(const</STRONG> <STRONG>FIELD</STRONG> <STRONG>*</STRONG><EM>field</EM><STRONG>);</STRONG>
+       <STRONG>FIELDTYPE</STRONG> <STRONG>*field_type(const</STRONG> <STRONG>FIELD</STRONG> <STRONG>*</STRONG><EM>field</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>set_field_type(FIELD</STRONG> <STRONG>*</STRONG><EM>field</EM><STRONG>,</STRONG> <STRONG>FIELDTYPE</STRONG> <STRONG>*</STRONG><EM>type</EM><STRONG>,</STRONG> <STRONG>...);</STRONG>
+
+       /* predefined field types */
+       <STRONG>FIELDTYPE</STRONG> <STRONG>*TYPE_ALNUM;</STRONG>
+       <STRONG>FIELDTYPE</STRONG> <STRONG>*TYPE_ALPHA;</STRONG>
+       <STRONG>FIELDTYPE</STRONG> <STRONG>*TYPE_ENUM;</STRONG>
+       <STRONG>FIELDTYPE</STRONG> <STRONG>*TYPE_INTEGER;</STRONG>
+       <STRONG>FIELDTYPE</STRONG> <STRONG>*TYPE_NUMERIC;</STRONG>
+       <STRONG>FIELDTYPE</STRONG> <STRONG>*TYPE_REGEXP;</STRONG>
+       <STRONG>FIELDTYPE</STRONG> <STRONG>*TYPE_IPV4;</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       By  default, no validation is done on form fields.  You can associate a
+       form with with a <EM>field</EM> <EM>type</EM>, making the form library validate input.
+
+
+</PRE><H3><a name="h3-field_arg">field_arg</a></H3><PRE>
+       Returns a pointer to the field's argument block.  The <EM>argument</EM> <EM>block</EM> is
+       an  opaque  structure  containing a copy of the arguments provided in a
+       <STRONG>set_field_type</STRONG> call.
+
+
+</PRE><H3><a name="h3-field_type">field_type</a></H3><PRE>
+       Returns a pointer to the <EM>field</EM> <EM>type</EM> associated  with  the  form  field,
+       i.e., by calling <STRONG>set_field_type</STRONG>.
+
+
+</PRE><H3><a name="h3-set_field_type">set_field_type</a></H3><PRE>
+       The  function  <STRONG>set_field_type</STRONG> associates a field type with a given form
+       field.  This is the type checked by validation functions.   Most  field
+       types  are  configurable,  via arguments which the caller provides when
+       calling <STRONG>set_field_type</STRONG>.
+
+       Several field types are predefined by the form library.
+
+
+</PRE><H3><a name="h3-Predefined-types">Predefined types</a></H3><PRE>
+       It is possible to set up new  programmer-defined  field  types.   Field
+       types  are implemented via the <STRONG>FIELDTYPE</STRONG> data structure, which contains
+       several pointers to functions.
+
+       See the <STRONG><A HREF="form_fieldtype.3x.html">form_fieldtype(3x)</A></STRONG> manual page, which describes functions which
+       can be used to construct a field-type dynamically.
+
+       The predefined types are as follows:
+
+       TYPE_ALNUM
+            Alphanumeric data.  Required parameter:
+
+            <STRONG>o</STRONG>   a third <STRONG>int</STRONG> argument, a minimum field width.
+
+       TYPE_ALPHA
+            Character data.  Required parameter:
+
+            <STRONG>o</STRONG>   a third <STRONG>int</STRONG> argument, a minimum field width.
+
+       TYPE_ENUM
+            Accept one of a specified set of strings.  Required parameters:
+
+            <STRONG>o</STRONG>   a third <STRONG>(char</STRONG> <STRONG>**)</STRONG> argument pointing to a string list;
+
+            <STRONG>o</STRONG>   a fourth <STRONG>int</STRONG> flag argument to enable case-sensitivity;
+
+            <STRONG>o</STRONG>   a  fifth  <STRONG>int</STRONG> flag argument specifying whether a partial match
+                must be a unique one.  If this flag is off, a  prefix  matches
+                the  first of any set of more than one list elements with that
+                prefix.
+
+            The library copies the string list, so you may  use  a  list  that
+            lives in automatic variables on the stack.
+
+       TYPE_INTEGER
+            Integer  data,  parsable  to  an  integer  by  <STRONG>atoi(3)</STRONG>.   Required
+            parameters:
+
+            <STRONG>o</STRONG>   a third <STRONG>int</STRONG> argument controlling the precision,
+
+            <STRONG>o</STRONG>   a fourth <STRONG>long</STRONG> argument constraining minimum value,
+
+            <STRONG>o</STRONG>   a fifth <STRONG>long</STRONG> constraining maximum value.  If the maximum value
+                is  less  than  or  equal  to  the minimum value, the range is
+                simply ignored.
+
+            On return, the field buffer is formatted according to  the  <STRONG>printf</STRONG>
+            format  specification  ".*ld",  where  the  "*" is replaced by the
+            precision argument.
+
+            For details of the precision handling see <STRONG>printf(3)</STRONG>.
+
+       TYPE_NUMERIC
+            Numeric  data  (may  have   a   decimal-point   part).    Required
+            parameters:
+
+            <STRONG>o</STRONG>   a third <STRONG>int</STRONG> argument controlling the precision,
+
+            <STRONG>o</STRONG>   a fourth <STRONG>double</STRONG> argument constraining minimum value,
+
+            <STRONG>o</STRONG>   and a fifth <STRONG>double</STRONG> constraining maximum value.  If your system
+                supports locales, the decimal point character must be the  one
+                specified  by  your locale.  If the maximum value is less than
+                or equal to the minimum value, the range is simply ignored.
+
+            On return, the field buffer is formatted according to  the  <STRONG>printf</STRONG>
+            format  specification  ".*f",  where  the  "*"  is replaced by the
+            precision argument.
+
+            For details of the precision handling see <STRONG>printf(3)</STRONG>.
+
+       TYPE_REGEXP
+            Regular expression data.  Required parameter:
+
+            <STRONG>o</STRONG>   a third argument, a regular expression <STRONG>(char</STRONG> <STRONG>*)</STRONG>  string.   The
+                data is valid if the regular expression matches it.
+
+            Regular expressions are in the format of <STRONG>regcomp</STRONG> and <STRONG>regexec</STRONG>.
+
+            The  regular  expression  must match the whole field.  If you have
+            for example, an eight character wide field, a  regular  expression
+            "^[0-9]*$"  always means that you have to fill all eight positions
+            with digits.  If you want to allow fewer digits, you may  use  for
+            example  "^[0-9]*  *$" which is good for trailing spaces (up to an
+            empty field), or "^ *[0-9]* *$" which  is  good  for  leading  and
+            trailing spaces around the digits.
+
+       TYPE_IPV4
+            An Internet Protocol Version 4 address.  Required parameter:
+
+            <STRONG>o</STRONG>   none
+
+            The  form  library  checks  whether or not the buffer has the form
+            <EM>a.b.c.d</EM>, where <EM>a</EM>, <EM>b</EM>, <EM>c</EM>, and <EM>d</EM> are numbers in the range 0  to  255.
+            Trailing  blanks in the buffer are ignored.  The address itself is
+            not validated.
+
+            This is an ncurses extension; this field type may not be available
+            in other curses implementations.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       The  functions  <STRONG>field_type</STRONG>  and  <STRONG>field_arg</STRONG>  return  <STRONG>NULL</STRONG> on error.  The
+       function <STRONG>set_field_type</STRONG> returns one of the following:
+
+       <STRONG>E_OK</STRONG> The routine succeeded.
+
+       <STRONG>E_SYSTEM_ERROR</STRONG>
+            System error occurred (see <STRONG>errno(3)</STRONG>).
+
+
+</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="form.3x.html">form(3x)</A></STRONG>, <STRONG><A HREF="form_fieldtype.3x.html">form_fieldtype(3x)</A></STRONG>, <STRONG><A HREF="form_variables.3x.html">form_variables(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  header  file  <STRONG>&lt;form.h&gt;</STRONG>  automatically  includes  the  header  file
+       <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These  routines  emulate  the  System  V  forms library.  They were not
+       supported on Version 7 or BSD versions.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                     <STRONG><A HREF="form_field_validation.3x.html">form_field_validation(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-field_arg">field_arg</a></li>
+<li><a href="#h3-field_type">field_type</a></li>
+<li><a href="#h3-set_field_type">set_field_type</a></li>
+<li><a href="#h3-Predefined-types">Predefined types</a></li>
+</ul>
+</li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/form_fieldtype.3x.html b/doc/html/man/form_fieldtype.3x.html
new file mode 100644
index 0000000..5e67553
--- /dev/null
+++ b/doc/html/man/form_fieldtype.3x.html
@@ -0,0 +1,215 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2006,2010 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: form_fieldtype.3x,v 1.31 2022/02/12 20:03:40 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>form_fieldtype 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">form_fieldtype 3x</H1>
+<PRE>
+<STRONG><A HREF="form_fieldtype.3x.html">form_fieldtype(3x)</A></STRONG>                                          <STRONG><A HREF="form_fieldtype.3x.html">form_fieldtype(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>form_fieldtype</STRONG> - define validation-field types
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;form.h&gt;</STRONG>
+
+       <STRONG>FIELDTYPE</STRONG> <STRONG>*new_fieldtype(</STRONG>
+           <STRONG>bool</STRONG> <STRONG>(*</STRONG> <STRONG>const</STRONG> <EM>field</EM><STRONG>_</STRONG><EM>check</EM><STRONG>)(FIELD</STRONG> <STRONG>*,</STRONG> <STRONG>const</STRONG> <STRONG>void</STRONG> <STRONG>*),</STRONG>
+           <STRONG>bool</STRONG> <STRONG>(*</STRONG> <STRONG>const</STRONG> <EM>char</EM><STRONG>_</STRONG><EM>check</EM><STRONG>)(int,</STRONG> <STRONG>const</STRONG> <STRONG>void</STRONG> <STRONG>*));</STRONG>
+       <STRONG>int</STRONG> <STRONG>free_fieldtype(FIELDTYPE</STRONG> <STRONG>*</STRONG><EM>fieldtype</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>set_fieldtype_arg(</STRONG>
+           <STRONG>FIELDTYPE</STRONG> <STRONG>*</STRONG><EM>fieldtype</EM><STRONG>,</STRONG>
+           <STRONG>void</STRONG> <STRONG>*(*</STRONG> <STRONG>const</STRONG> <EM>make</EM><STRONG>_</STRONG><EM>arg</EM><STRONG>)(va_list</STRONG> <STRONG>*),</STRONG>
+           <STRONG>void</STRONG> <STRONG>*(*</STRONG> <STRONG>const</STRONG> <EM>copy</EM><STRONG>_</STRONG><EM>arg</EM><STRONG>)(const</STRONG> <STRONG>void</STRONG> <STRONG>*),</STRONG>
+           <STRONG>void</STRONG>  <STRONG>(*</STRONG> <STRONG>const</STRONG> <EM>free</EM><STRONG>_</STRONG><EM>arg</EM><STRONG>)(void</STRONG> <STRONG>*));</STRONG>
+       <STRONG>int</STRONG> <STRONG>set_fieldtype_choice(</STRONG>
+           <STRONG>FIELDTYPE</STRONG> <STRONG>*</STRONG><EM>fieldtype</EM><STRONG>,</STRONG>
+           <STRONG>bool</STRONG> <STRONG>(*</STRONG> <STRONG>const</STRONG> <EM>next</EM><STRONG>_</STRONG><EM>choice</EM><STRONG>)(FIELD</STRONG> <STRONG>*,</STRONG> <STRONG>const</STRONG> <STRONG>void</STRONG> <STRONG>*),</STRONG>
+           <STRONG>bool</STRONG> <STRONG>(*</STRONG> <STRONG>const</STRONG> <EM>prev</EM><STRONG>_</STRONG><EM>choice</EM><STRONG>)(FIELD</STRONG> <STRONG>*,</STRONG> <STRONG>const</STRONG> <STRONG>void</STRONG> <STRONG>*));</STRONG>
+
+       <STRONG>FIELDTYPE</STRONG> <STRONG>*link_fieldtype(FIELDTYPE</STRONG> <STRONG>*</STRONG><EM>type1</EM><STRONG>,</STRONG>
+                                 <STRONG>FIELDTYPE</STRONG> <STRONG>*</STRONG><EM>type2</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+
+</PRE><H3><a name="h3-new_fieldtype">new_fieldtype</a></H3><PRE>
+       The  function  <STRONG>new_fieldtype</STRONG>  creates  a new field type usable for data
+       validation.  Its parameters are function pointers:
+
+       <EM>field</EM><STRONG>_</STRONG><EM>check</EM>
+            This function checks  the  validity  of  an  entered  data  string
+            whenever  the  user  attempts  to  leave  a  field.   It  has  two
+            arguments:
+
+            <STRONG>o</STRONG>   The  (FIELD  *)  argument  is  passed  in  so  the  validation
+                predicate   can  see  the  field's  buffer,  sizes  and  other
+                attributes.
+
+            <STRONG>o</STRONG>   The second argument  is  an  argument-block  structure,  about
+                which more below.
+
+       <EM>char</EM><STRONG>_</STRONG><EM>check</EM>
+            This function validates input characters as they are entered.  The
+            form library passes it the character to be checked and  a  pointer
+            to an argument-block structure.
+
+
+</PRE><H3><a name="h3-free_fieldtype">free_fieldtype</a></H3><PRE>
+       The  <STRONG>free_fieldtype</STRONG>  function  frees  the  space  allocated for a given
+       validation type by <STRONG>new_fieldtype</STRONG>.
+
+
+</PRE><H3><a name="h3-set_fieldtype_arg">set_fieldtype_arg</a></H3><PRE>
+       The  function  <STRONG>set_fieldtype_arg</STRONG>  associates  three  storage-management
+       functions with a field type:
+
+       <EM>make</EM><STRONG>_</STRONG><EM>arg</EM>
+            This  function  is  automatically applied to the list of arguments
+            you give <STRONG>set_field_type</STRONG> when attaching validation to a field.   It
+            stores  the  arguments in an allocated argument-block object which
+            is used when validating input.
+
+       <EM>copy</EM><STRONG>_</STRONG><EM>arg</EM>
+            This function may be used by applications to copy argument-blocks.
+
+       <EM>free</EM><STRONG>_</STRONG><EM>arg</EM>
+            Frees an argument-block structure.
+
+       You must supply the <EM>make</EM><STRONG>_</STRONG><EM>arg</EM> function.  The other two are optional: you
+       may  supply NULL for them.  In this case, the form library assumes that
+       <EM>make</EM><STRONG>_</STRONG><EM>arg</EM> does not allocate memory but simply loads the argument into  a
+       single scalar value.
+
+
+</PRE><H3><a name="h3-set_fieldtype_choice">set_fieldtype_choice</a></H3><PRE>
+       The  form  driver  requests  <STRONG>REQ_NEXT_CHOICE</STRONG> and <STRONG>REQ_PREV_CHOICE</STRONG> assume
+       that the possible values of a field form an ordered  set,  and  provide
+       the forms user with a way to move through the set.
+
+       The  <STRONG>set_fieldtype_choice</STRONG>  function  allows forms programmers to define
+       successor  and  predecessor  functions  for  the  field  type.    These
+       functions  take  the  field  pointer and an argument-block structure as
+       arguments.
+
+
+</PRE><H3><a name="h3-link_fieldtype">link_fieldtype</a></H3><PRE>
+       The function <STRONG>link_fieldtype</STRONG> creates a new field type from the two given
+       types.  They are connected by an logical 'OR'.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       The  pointer-valued  routines  return  NULL  on  error.  They set <STRONG>errno</STRONG>
+       according to their success:
+
+       <STRONG>E_OK</STRONG> The routine succeeded.
+
+       <STRONG>E_BAD_ARGUMENT</STRONG>
+            Routine detected an incorrect or out-of-range argument.
+
+       <STRONG>E_SYSTEM_ERROR</STRONG>
+            System error occurred, e.g., malloc failure.
+
+       The integer-valued routines return one of the following codes on error:
+
+       <STRONG>E_OK</STRONG> The routine succeeded.
+
+       <STRONG>E_BAD_ARGUMENT</STRONG>
+            Routine detected an incorrect or out-of-range argument.
+
+       <STRONG>E_CONNECTED</STRONG>
+            The field is already connected to a form.
+
+       <STRONG>E_CURRENT</STRONG>
+            The field is the current field.
+
+       <STRONG>E_SYSTEM_ERROR</STRONG>
+            System error occurred (see <STRONG>errno(3)</STRONG>).
+
+
+</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="form.3x.html">form(3x)</A></STRONG>, <STRONG><A HREF="form_field_validation.3x.html">form_field_validation(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  header  file  <STRONG>&lt;form.h&gt;</STRONG>  automatically  includes  the  header  file
+       <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These  routines  emulate  the  System  V  forms library.  They were not
+       supported on Version 7 or BSD versions.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                            <STRONG><A HREF="form_fieldtype.3x.html">form_fieldtype(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-new_fieldtype">new_fieldtype</a></li>
+<li><a href="#h3-free_fieldtype">free_fieldtype</a></li>
+<li><a href="#h3-set_fieldtype_arg">set_fieldtype_arg</a></li>
+<li><a href="#h3-set_fieldtype_choice">set_fieldtype_choice</a></li>
+<li><a href="#h3-link_fieldtype">link_fieldtype</a></li>
+</ul>
+</li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/form_hook.3x.html b/doc/html/man/form_hook.3x.html
new file mode 100644
index 0000000..decd850
--- /dev/null
+++ b/doc/html/man/form_hook.3x.html
@@ -0,0 +1,139 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2007,2010 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: form_hook.3x,v 1.19 2022/02/12 20:03:40 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>form_hook 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">form_hook 3x</H1>
+<PRE>
+<STRONG><A HREF="form_hook.3x.html">form_hook(3x)</A></STRONG>                                                    <STRONG><A HREF="form_hook.3x.html">form_hook(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>form_hook</STRONG> - set hooks for automatic invocation by applications
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;form.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>set_field_init(FORM</STRONG> <STRONG>*</STRONG><EM>form</EM><STRONG>,</STRONG> <STRONG>Form_Hook</STRONG> <EM>func</EM><STRONG>);</STRONG>
+       <STRONG>Form_Hook</STRONG> <STRONG>field_init(const</STRONG> <STRONG>FORM</STRONG> <STRONG>*</STRONG><EM>form</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>set_field_term(FORM</STRONG> <STRONG>*</STRONG><EM>form</EM><STRONG>,</STRONG> <STRONG>Form_Hook</STRONG> <EM>func</EM><STRONG>);</STRONG>
+       <STRONG>Form_Hook</STRONG> <STRONG>field_term(const</STRONG> <STRONG>FORM</STRONG> <STRONG>*</STRONG><EM>form</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>set_form_init(FORM</STRONG> <STRONG>*</STRONG><EM>form</EM><STRONG>,</STRONG> <STRONG>Form_Hook</STRONG> <EM>func</EM><STRONG>);</STRONG>
+       <STRONG>Form_Hook</STRONG> <STRONG>form_init(const</STRONG> <STRONG>FORM</STRONG> <STRONG>*</STRONG><EM>form</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>set_form_term(FORM</STRONG> <STRONG>*</STRONG><EM>form</EM><STRONG>,</STRONG> <STRONG>Form_Hook</STRONG> <EM>func</EM><STRONG>);</STRONG>
+       <STRONG>Form_Hook</STRONG> <STRONG>form_term(const</STRONG> <STRONG>FORM</STRONG> <STRONG>*</STRONG><EM>form</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       These  functions make it possible to set hook functions to be called at
+       various points in the automatic processing  of  input  event  codes  by
+       <STRONG>form_driver</STRONG>.
+
+       The  function <STRONG>set_field_init</STRONG> sets a hook to be called at form-post time
+       and  each  time  the  selected  field  changes  (after   the   change).
+       <STRONG>field_init</STRONG>  returns  the current field init hook, if any (<STRONG>NULL</STRONG> if there
+       is no such hook).
+
+       The function <STRONG>set_field_term</STRONG> sets a hook to  be  called  at  form-unpost
+       time  and  each  time  the  selected field changes (before the change).
+       <STRONG>field_term</STRONG> returns the current field term hook, if any (<STRONG>NULL</STRONG>  if  there
+       is no such hook).
+
+       The  function  <STRONG>set_form_init</STRONG> sets a hook to be called at form-post time
+       and just after a page change once it is posted.  <STRONG>form_init</STRONG> returns  the
+       current form init hook, if any (<STRONG>NULL</STRONG> if there is no such hook).
+
+       The function <STRONG>set_form_term</STRONG> sets a hook to be called at form-unpost time
+       and just before a page change once it is posted.  <STRONG>form_init</STRONG> returns the
+       current form term hook, if any (<STRONG>NULL</STRONG> if there is no such hook).
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       Routines  that  return  pointers  return <STRONG>NULL</STRONG> on error.  Other routines
+       return one of the following:
+
+       <STRONG>E_OK</STRONG> The routine succeeded.
+
+       <STRONG>E_SYSTEM_ERROR</STRONG>
+            System error occurred (see <STRONG>errno(3)</STRONG>).
+
+
+</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="form.3x.html">form(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  header  file  <STRONG>&lt;form.h&gt;</STRONG>  automatically  includes  the  header  file
+       <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These  routines  emulate  the  System  V  forms library.  They were not
+       supported on Version 7 or BSD versions.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                                 <STRONG><A HREF="form_hook.3x.html">form_hook(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/form_new.3x.html b/doc/html/man/form_new.3x.html
new file mode 100644
index 0000000..1246c42
--- /dev/null
+++ b/doc/html/man/form_new.3x.html
@@ -0,0 +1,130 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2015 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: form_new.3x,v 1.18 2022/02/12 20:03:40 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>form_new 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">form_new 3x</H1>
+<PRE>
+<STRONG><A HREF="form_new.3x.html">form_new(3x)</A></STRONG>                                                      <STRONG><A HREF="form_new.3x.html">form_new(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>new_form</STRONG>, <STRONG>free_form</STRONG> - create and destroy forms
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;form.h&gt;</STRONG>
+
+       <STRONG>FORM</STRONG> <STRONG>*new_form(FIELD</STRONG> <STRONG>**</STRONG><EM>fields</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>free_form(FORM</STRONG> <STRONG>*</STRONG><EM>form</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The function <STRONG>new_form</STRONG> creates a new form connected to a specified field
+       pointer array (which must be <STRONG>NULL</STRONG>-terminated).
+
+       The function <STRONG>free_form</STRONG> disconnects <EM>form</EM> from its field array and  frees
+       the storage allocated for the form.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       The  function  <STRONG>new_form</STRONG> returns <STRONG>NULL</STRONG> on error.  It sets <STRONG>errno</STRONG> according
+       to the function's success:
+
+       <STRONG>E_OK</STRONG> The routine succeeded.
+
+       <STRONG>E_BAD_ARGUMENT</STRONG>
+            Routine detected an incorrect or out-of-range argument.
+
+       <STRONG>E_CONNECTED</STRONG>
+            The field is already connected to a form.
+
+       <STRONG>E_SYSTEM_ERROR</STRONG>
+            System error occurred, e.g., malloc failure.
+
+       The function <STRONG>free_form</STRONG> returns one of the following:
+
+       <STRONG>E_OK</STRONG> The routine succeeded.
+
+       <STRONG>E_BAD_ARGUMENT</STRONG>
+            Routine detected an incorrect or out-of-range argument.
+
+       <STRONG>E_POSTED</STRONG>
+            The form has already been posted.
+
+
+</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="form.3x.html">form(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  header  file  <STRONG>&lt;form.h&gt;</STRONG>  automatically  includes  the  header  file
+       <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These  routines  emulate  the  System  V  forms library.  They were not
+       supported on Version 7 or BSD versions.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                                  <STRONG><A HREF="form_new.3x.html">form_new(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/form_new_page.3x.html b/doc/html/man/form_new_page.3x.html
new file mode 100644
index 0000000..0db3ac7
--- /dev/null
+++ b/doc/html/man/form_new_page.3x.html
@@ -0,0 +1,116 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2015 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: form_new_page.3x,v 1.20 2022/02/12 20:03:40 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>form_new_page 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">form_new_page 3x</H1>
+<PRE>
+<STRONG><A HREF="form_new_page.3x.html">form_new_page(3x)</A></STRONG>                                            <STRONG><A HREF="form_new_page.3x.html">form_new_page(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>set_new_page</STRONG>, <STRONG>new_page</STRONG> - form pagination functions
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;form.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>set_new_page(FIELD</STRONG> <STRONG>*</STRONG><EM>field</EM><STRONG>,</STRONG> <STRONG>bool</STRONG> <EM>new</EM><STRONG>_</STRONG><EM>page</EM><STRONG>_</STRONG><EM>flag</EM><STRONG>);</STRONG>
+       <STRONG>bool</STRONG> <STRONG>new_page(const</STRONG> <STRONG>FIELD</STRONG> <STRONG>*</STRONG><EM>field</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The function <STRONG>set_new_page</STRONG> sets or resets a flag marking the given field
+       as the beginning of a new page on its form.
+
+       The function <STRONG>new_page</STRONG> is a predicate which tests if a given field marks
+       a page beginning on its form.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       The function <STRONG>new_page</STRONG> returns <STRONG>TRUE</STRONG> or <STRONG>FALSE</STRONG>.
+
+       The function <STRONG>set_new_page</STRONG> returns one of the following:
+
+       <STRONG>E_OK</STRONG> The routine succeeded.
+
+       <STRONG>E_CONNECTED</STRONG>
+            The given field is already connected to a form.
+
+
+</PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
+       <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG>  and  related  pages  whose names begin "form_" for detailed
+       descriptions of the entry points.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  header  file  <STRONG>&lt;form.h&gt;</STRONG>  automatically  includes  the  header  file
+       <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These  routines  emulate  the  System  V  forms library.  They were not
+       supported on Version 7 or BSD versions.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                             <STRONG><A HREF="form_new_page.3x.html">form_new_page(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/form_opts.3x.html b/doc/html/man/form_opts.3x.html
new file mode 100644
index 0000000..9fda745
--- /dev/null
+++ b/doc/html/man/form_opts.3x.html
@@ -0,0 +1,132 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2015 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: form_opts.3x,v 1.20 2022/02/12 20:03:40 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>form_opts 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">form_opts 3x</H1>
+<PRE>
+<STRONG><A HREF="form_opts.3x.html">form_opts(3x)</A></STRONG>                                                    <STRONG><A HREF="form_opts.3x.html">form_opts(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>set_form_opts</STRONG>,  <STRONG>form_opts_on</STRONG>,  <STRONG>form_opts_off</STRONG>,  <STRONG>form_opts</STRONG>  - set and get
+       form options
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;form.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>set_form_opts(FORM</STRONG> <STRONG>*</STRONG><EM>form</EM><STRONG>,</STRONG> <STRONG>Field_Options</STRONG> <EM>opts</EM><STRONG>);</STRONG>
+       <STRONG>Field_Options</STRONG> <STRONG>form_opts(const</STRONG> <STRONG>FORM</STRONG> <STRONG>*</STRONG><EM>form</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>form_opts_on(FORM</STRONG> <STRONG>*</STRONG><EM>form</EM><STRONG>,</STRONG> <STRONG>Field_Options</STRONG> <EM>opts</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>form_opts_off(FORM</STRONG> <STRONG>*</STRONG><EM>form</EM><STRONG>,</STRONG> <STRONG>Field_Options</STRONG> <EM>opts</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The function <STRONG>set_form_opts</STRONG> sets all the given form's option bits  (form
+       option bits may be logically-OR'ed together).
+
+       The  function  <STRONG>form_opts_on</STRONG>  turns on the given option bits, and leaves
+       others alone.
+
+       The function <STRONG>form_opts_off</STRONG> turns off the given option bits, and  leaves
+       others alone.
+
+       The function <STRONG>form_opts</STRONG> returns the form's current option bits.
+
+       The following options are defined (all are on by default):
+
+       O_NL_OVERLOAD
+            Overload  the <STRONG>REQ_NEW_LINE</STRONG> forms driver request so that calling it
+            at the end of a field goes to the next field.
+
+       O_BS_OVERLOAD
+            Overload the <STRONG>REQ_DEL_PREV</STRONG> forms driver request so that calling  it
+            at the beginning of a field goes to the previous field.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       Except for <STRONG>form_opts</STRONG>, each routine returns one of the following:
+
+       <STRONG>E_OK</STRONG> The routine succeeded.
+
+       <STRONG>E_SYSTEM_ERROR</STRONG>
+            System error occurred (see <STRONG>errno(3)</STRONG>).
+
+
+</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="form.3x.html">form(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  header  file  <STRONG>&lt;form.h&gt;</STRONG>  automatically  includes  the  header  file
+       <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These routines emulate the System  V  forms  library.   They  were  not
+       supported on Version 7 or BSD versions.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                                 <STRONG><A HREF="form_opts.3x.html">form_opts(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/form_page.3x.html b/doc/html/man/form_page.3x.html
new file mode 100644
index 0000000..b0ab37d
--- /dev/null
+++ b/doc/html/man/form_page.3x.html
@@ -0,0 +1,144 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2016 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: form_page.3x,v 1.22 2022/02/12 20:03:40 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>form_page 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">form_page 3x</H1>
+<PRE>
+<STRONG><A HREF="form_page.3x.html">form_page(3x)</A></STRONG>                                                    <STRONG><A HREF="form_page.3x.html">form_page(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>form_page</STRONG> - set and get form page number
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;form.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>set_current_field(FORM</STRONG> <STRONG>*</STRONG><EM>form</EM><STRONG>,</STRONG> <STRONG>FIELD</STRONG> <STRONG>*</STRONG><EM>field</EM><STRONG>);</STRONG>
+       <STRONG>FIELD</STRONG> <STRONG>*current_field(const</STRONG> <STRONG>FORM</STRONG> <STRONG>*</STRONG><EM>form</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>unfocus_current_field(FORM</STRONG> <STRONG>*</STRONG><EM>form</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>set_form_page(FORM</STRONG> <STRONG>*</STRONG><EM>form</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>n</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>form_page(const</STRONG> <STRONG>FORM</STRONG> <STRONG>*</STRONG><EM>form</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>field_index(const</STRONG> <STRONG>FIELD</STRONG> <STRONG>*</STRONG><EM>field</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The  function  <STRONG>set_current_field</STRONG>  sets  the  current field of the given
+       form; <STRONG>current_field</STRONG> returns the current field of the given form.
+
+       The function <STRONG>unfocus_current_field</STRONG> removes the focus from  the  current
+       field  of  the  form.  In such state, inquiries via <STRONG>current_field</STRONG> shall
+       return a NULL pointer.
+
+       The function <STRONG>set_form_page</STRONG> sets the form's page number (goes to page  <EM>n</EM>
+       of the form).
+
+       The function <STRONG>form_page</STRONG> returns the form's current page number.
+
+       The  function  <STRONG>field_index</STRONG>  returns the index of the field in the field
+       array of the form it is connected to.  It returns <STRONG>ERR</STRONG> if  the  argument
+       is the null pointer or the field is not connected.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       Except for <STRONG>form_page</STRONG>, each routine returns one of the following:
+
+       <STRONG>E_OK</STRONG> The routine succeeded.
+
+       <STRONG>E_BAD_ARGUMENT</STRONG>
+            Routine detected an incorrect or out-of-range argument.
+
+       <STRONG>E_BAD_STATE</STRONG>
+            Routine was called from an initialization or termination function.
+
+       <STRONG>E_INVALID_FIELD</STRONG>
+            Contents of a field are not valid.
+
+       <STRONG>E_REQUEST_DENIED</STRONG>
+            The form driver could not process the request.
+
+       <STRONG>E_SYSTEM_ERROR</STRONG>
+            System error occurred (see <STRONG>errno(3)</STRONG>).
+
+
+</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="form.3x.html">form(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  header  file  <STRONG>&lt;form.h&gt;</STRONG>  automatically  includes  the  header  file
+       <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These routines emulate the System  V  forms  library.   They  were  not
+       supported on Version 7 or BSD versions.
+
+       The <STRONG>unfocus_current_field</STRONG> function is an ncurses extension.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                                 <STRONG><A HREF="form_page.3x.html">form_page(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/form_post.3x.html b/doc/html/man/form_post.3x.html
new file mode 100644
index 0000000..ebb2f01
--- /dev/null
+++ b/doc/html/man/form_post.3x.html
@@ -0,0 +1,133 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2015,2017 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: form_post.3x,v 1.19 2022/02/12 20:03:40 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>form_post 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">form_post 3x</H1>
+<PRE>
+<STRONG><A HREF="form_post.3x.html">form_post(3x)</A></STRONG>                                                    <STRONG><A HREF="form_post.3x.html">form_post(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>post_form</STRONG>,   <STRONG>unpost_form</STRONG>   -  write  or  erase  forms  from  associated
+       subwindows
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;form.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>post_form(FORM</STRONG> <STRONG>*</STRONG><EM>form</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>unpost_form(FORM</STRONG> <STRONG>*</STRONG><EM>form</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The function <STRONG>post_form</STRONG> displays a form to its associated subwindow.  To
+       trigger  physical  display  of  the  subwindow, use <STRONG><A HREF="curs_refresh.3x.html">refresh(3x)</A></STRONG> or some
+       equivalent <STRONG>curses</STRONG> routine (the implicit <STRONG>doupdate</STRONG> triggered by an <STRONG>curses</STRONG>
+       input request will do).
+
+       The function <STRONG>unpost_form</STRONG> erases form from its associated subwindow.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       These routines return one of the following:
+
+       <STRONG>E_OK</STRONG> The routine succeeded.
+
+       <STRONG>E_BAD_ARGUMENT</STRONG>
+            Routine detected an incorrect or out-of-range argument.
+
+       <STRONG>E_BAD_STATE</STRONG>
+            Routine was called from an initialization or termination function.
+
+       <STRONG>E_NOT_POSTED</STRONG>
+            The form has not been posted.
+
+       <STRONG>E_NOT_CONNECTED</STRONG>
+            No items are connected to the form.
+
+       <STRONG>E_NO_ROOM</STRONG>
+            Form is too large for its window.
+
+       <STRONG>E_POSTED</STRONG>
+            The form has already been posted.
+
+       <STRONG>E_SYSTEM_ERROR</STRONG>
+            System error occurred (see <STRONG>errno(3)</STRONG>).
+
+
+</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="form.3x.html">form(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  header  file  <STRONG>&lt;form.h&gt;</STRONG>  automatically  includes  the  header  file
+       <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These routines emulate the System  V  forms  library.   They  were  not
+       supported on Version 7 or BSD versions.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                                 <STRONG><A HREF="form_post.3x.html">form_post(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/form_requestname.3x.html b/doc/html/man/form_requestname.3x.html
new file mode 100644
index 0000000..37122c6
--- /dev/null
+++ b/doc/html/man/form_requestname.3x.html
@@ -0,0 +1,124 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2015 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: form_requestname.3x,v 1.19 2022/02/12 20:03:40 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>form_requestname 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">form_requestname 3x</H1>
+<PRE>
+<STRONG><A HREF="form_requestname.3x.html">form_requestname(3x)</A></STRONG>                                      <STRONG><A HREF="form_requestname.3x.html">form_requestname(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>form_request_by_name</STRONG>, <STRONG>form_request_name</STRONG> - handle printable form request
+       names
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;form.h&gt;</STRONG>
+
+       <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*form_request_name(int</STRONG> <EM>request</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>form_request_by_name(const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>name</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+
+</PRE><H3><a name="h3-form_request_name">form_request_name</a></H3><PRE>
+       The function <STRONG>form_request_name</STRONG> returns the printable  name  of  a  form
+       request code.
+
+
+</PRE><H3><a name="h3-form_request_name_by_name">form_request_name_by_name</a></H3><PRE>
+       The  function  <STRONG>form_request_by_name</STRONG>  searches  in  the name-table for a
+       request with the given name and returns its  request  code.   Otherwise
+       E_NO_MATCH is returned.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       <STRONG>form_request_name</STRONG>   returns   <STRONG>NULL</STRONG>   on   error   and   sets  <STRONG>errno</STRONG>  to
+       <STRONG>E_BAD_ARGUMENT</STRONG>.
+
+       <STRONG>form_request_by_name</STRONG> returns <STRONG>E_NO_MATCH</STRONG> on  error.   It  does  not  set
+       <STRONG>errno</STRONG>.
+
+
+</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="form.3x.html">form(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  header  file  <STRONG>&lt;form.h&gt;</STRONG>  automatically  includes  the  header  file
+       <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These routines are specific to ncurses.  They  were  not  supported  on
+       Version 7, BSD or System V implementations.  It is recommended that any
+       code depending on them be conditioned using NCURSES_VERSION.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                          <STRONG><A HREF="form_requestname.3x.html">form_requestname(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-form_request_name">form_request_name</a></li>
+<li><a href="#h3-form_request_name_by_name">form_request_name_by_name</a></li>
+</ul>
+</li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/form_userptr.3x.html b/doc/html/man/form_userptr.3x.html
new file mode 100644
index 0000000..a5033f7
--- /dev/null
+++ b/doc/html/man/form_userptr.3x.html
@@ -0,0 +1,113 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2015 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: form_userptr.3x,v 1.22 2022/02/12 20:03:40 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>form_userptr 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">form_userptr 3x</H1>
+<PRE>
+<STRONG><A HREF="form_userptr.3x.html">form_userptr(3x)</A></STRONG>                                              <STRONG><A HREF="form_userptr.3x.html">form_userptr(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>set_form_userptr</STRONG>, <STRONG>form_userptr</STRONG> - associate application data with a form
+       item
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;form.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>set_form_userptr(FORM</STRONG> <STRONG>*</STRONG><EM>form</EM><STRONG>,</STRONG> <STRONG>void</STRONG> <STRONG>*</STRONG><EM>userptr</EM><STRONG>);</STRONG>
+       <STRONG>void*</STRONG> <STRONG>form_userptr(const</STRONG> <STRONG>FORM</STRONG> <STRONG>*</STRONG><EM>form</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       Every form and every form item has a field that can  be  used  to  hold
+       application-specific  data  (that  is,  the  form-driver code leaves it
+       alone).  These functions get and set the form user pointer field.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       The function <STRONG>form_userptr</STRONG> returns a pointer (which may  be  <STRONG>NULL</STRONG>).   It
+       does not set <STRONG>errno</STRONG>.
+
+       The function <STRONG>set_form_userptr</STRONG> returns <STRONG>E_OK</STRONG> (success).
+
+
+</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="form.3x.html">form(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  header  file  <STRONG>&lt;form.h&gt;</STRONG>  automatically  includes  the  header  file
+       <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These routines emulate the System  V  forms  library.   They  were  not
+       supported on Version 7 or BSD versions.
+
+       The user pointer is a void pointer.  We chose not to leave it as a char
+       pointer for SVr4 compatibility.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                              <STRONG><A HREF="form_userptr.3x.html">form_userptr(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/form_variables.3x.html b/doc/html/man/form_variables.3x.html
new file mode 100644
index 0000000..93d0a06
--- /dev/null
+++ b/doc/html/man/form_variables.3x.html
@@ -0,0 +1,133 @@
+<!--
+  ****************************************************************************
+  * Copyright 2020,2021 Thomas E. Dickey                                     *
+  * Copyright 2010-2013,2017 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: form_variables.3x,v 1.9 2021/12/25 21:50:36 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>form_variables 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">form_variables 3x</H1>
+<PRE>
+<STRONG><A HREF="form_variables.3x.html">form_variables(3x)</A></STRONG>                                          <STRONG><A HREF="form_variables.3x.html">form_variables(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>TYPE_ALNUM</STRONG>, <STRONG>TYPE_ALPHA</STRONG>, <STRONG>TYPE_ENUM</STRONG>, <STRONG>TYPE_INTEGER</STRONG>, <STRONG>TYPE_IPV4</STRONG>,
+       <STRONG>TYPE_NUMERIC</STRONG>, <STRONG>TYPE_REGEXP</STRONG> - form system global variables
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;form.h&gt;</STRONG>
+
+       <STRONG>FIELDTYPE</STRONG> <STRONG>*</STRONG> <STRONG>TYPE_ALNUM;</STRONG>
+       <STRONG>FIELDTYPE</STRONG> <STRONG>*</STRONG> <STRONG>TYPE_ALPHA;</STRONG>
+       <STRONG>FIELDTYPE</STRONG> <STRONG>*</STRONG> <STRONG>TYPE_ENUM;</STRONG>
+       <STRONG>FIELDTYPE</STRONG> <STRONG>*</STRONG> <STRONG>TYPE_INTEGER;</STRONG>
+       <STRONG>FIELDTYPE</STRONG> <STRONG>*</STRONG> <STRONG>TYPE_IPV4;</STRONG>
+       <STRONG>FIELDTYPE</STRONG> <STRONG>*</STRONG> <STRONG>TYPE_NUMERIC;</STRONG>
+       <STRONG>FIELDTYPE</STRONG> <STRONG>*</STRONG> <STRONG>TYPE_REGEXP;</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       These are building blocks for the form library,  defining  fields  that
+       can  be  created using the <STRONG><A HREF="form_fieldtype.3x.html">form_fieldtype(3x)</A></STRONG> functions.  Each provides
+       functions for field- and character-validation, according to  the  given
+       datatype.
+
+
+</PRE><H3><a name="h3-TYPE_ALNUM">TYPE_ALNUM</a></H3><PRE>
+       This holds alphanumeric data.
+
+
+</PRE><H3><a name="h3-TYPE_ALPHA">TYPE_ALPHA</a></H3><PRE>
+       This holds alphabetic data.
+
+
+</PRE><H3><a name="h3-TYPE_ENUM">TYPE_ENUM</a></H3><PRE>
+       This holds an enumerated type.
+
+
+</PRE><H3><a name="h3-TYPE_INTEGER">TYPE_INTEGER</a></H3><PRE>
+       This holds a decimal integer.
+
+
+</PRE><H3><a name="h3-TYPE_IPV4">TYPE_IPV4</a></H3><PRE>
+       This holds an IPv4 internet address, e.g., "127.0.0.1".
+
+
+</PRE><H3><a name="h3-TYPE_NUMERIC">TYPE_NUMERIC</a></H3><PRE>
+       This holds a decimal number, with optional sign and decimal point.
+
+
+</PRE><H3><a name="h3-TYPE_REGEXP">TYPE_REGEXP</a></H3><PRE>
+       This holds a regular expression.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       The  <STRONG>TYPE_IPV4</STRONG> variable is an extension not provided by older implemen-
+       tations of the form library.
+
+
+</PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
+       <STRONG><A HREF="form.3x.html">form(3x)</A></STRONG>.
+
+
+
+                                                            <STRONG><A HREF="form_variables.3x.html">form_variables(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-TYPE_ALNUM">TYPE_ALNUM</a></li>
+<li><a href="#h3-TYPE_ALPHA">TYPE_ALPHA</a></li>
+<li><a href="#h3-TYPE_ENUM">TYPE_ENUM</a></li>
+<li><a href="#h3-TYPE_INTEGER">TYPE_INTEGER</a></li>
+<li><a href="#h3-TYPE_IPV4">TYPE_IPV4</a></li>
+<li><a href="#h3-TYPE_NUMERIC">TYPE_NUMERIC</a></li>
+<li><a href="#h3-TYPE_REGEXP">TYPE_REGEXP</a></li>
+</ul>
+</li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/form_win.3x.html b/doc/html/man/form_win.3x.html
new file mode 100644
index 0000000..1baf012
--- /dev/null
+++ b/doc/html/man/form_win.3x.html
@@ -0,0 +1,138 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2006,2010 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: form_win.3x,v 1.21 2022/02/12 20:03:40 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>form_win 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">form_win 3x</H1>
+<PRE>
+<STRONG><A HREF="form_win.3x.html">form_win(3x)</A></STRONG>                                                      <STRONG><A HREF="form_win.3x.html">form_win(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>form_win</STRONG> - make and break form window and subwindow associations
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;form.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>set_form_win(FORM</STRONG> <STRONG>*</STRONG><EM>form</EM><STRONG>,</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+       <STRONG>WINDOW</STRONG> <STRONG>*form_win(const</STRONG> <STRONG>FORM</STRONG> <STRONG>*</STRONG><EM>form</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>set_form_sub(FORM</STRONG> <STRONG>*</STRONG><EM>form</EM><STRONG>,</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>sub</EM><STRONG>);</STRONG>
+       <STRONG>WINDOW</STRONG> <STRONG>*form_sub(const</STRONG> <STRONG>FORM</STRONG> <STRONG>*</STRONG><EM>form</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>scale_form(const</STRONG> <STRONG>FORM</STRONG> <STRONG>*</STRONG><EM>form</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <STRONG>*</STRONG><EM>rows</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <STRONG>*</STRONG><EM>columns</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       Every  form  has an associated pair of <STRONG>curses</STRONG> windows.  The form window
+       displays any title and border associated  with  the  window;  the  form
+       subwindow  displays  the items of the form that are currently available
+       for selection.
+
+       The first four  functions  get  and  set  those  windows.   It  is  not
+       necessary to set either window; by default, the driver code uses <STRONG>stdscr</STRONG>
+       for both.
+
+       In the <STRONG>set_</STRONG> functions, window argument of <STRONG>NULL</STRONG> is treated as though  it
+       were <STRONG>stsdcr</STRONG>.  A form argument of <STRONG>NULL</STRONG> is treated as a request to change
+       the system default form window or subwindow.
+
+       The function <STRONG>scale_form</STRONG> returns  the  minimum  size  required  for  the
+       subwindow of <EM>form</EM>.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       Routines  that  return  pointers  return  <STRONG>NULL</STRONG> on error.  Routines that
+       return an integer return one of the following error codes:
+
+       <STRONG>E_OK</STRONG> The routine succeeded.
+
+       <STRONG>E_SYSTEM_ERROR</STRONG>
+            System error occurred (see <STRONG>errno(3)</STRONG>).
+
+       <STRONG>E_BAD_ARGUMENT</STRONG>
+            Routine detected an incorrect or out-of-range argument.
+
+       <STRONG>E_POSTED</STRONG>
+            The form has already been posted.
+
+       <STRONG>E_NOT_CONNECTED</STRONG>
+            No items are connected to the form.
+
+
+</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>, <STRONG><A HREF="form.3x.html">form(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  header  file  <STRONG>&lt;form.h&gt;</STRONG>  automatically  includes  the  header  file
+       <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These  routines  emulate  the  System  V  forms library.  They were not
+       supported on Version 7 or BSD versions.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                                  <STRONG><A HREF="form_win.3x.html">form_win(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/index.html b/doc/html/man/index.html
new file mode 100644
index 0000000..07d986b
--- /dev/null
+++ b/doc/html/man/index.html
@@ -0,0 +1,126 @@
+<!--
+  $Id: index.html,v 1.12 2020/02/02 23:34:34 tom Exp $
+  ****************************************************************************
+  * Copyright 2019,2020 Thomas E. Dickey                                     *
+  * Copyright 2001-2013,2017 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.                                                           *
+  ****************************************************************************
+  -->
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+
+<html>
+<head>
+  <meta name="generator" content=
+  "HTML Tidy for Linux (vers 25 March 2009), see www.w3.org">
+
+  <title>NCURSES &ndash; Manual Pages</title>
+  <link rel="author" href="mailto:dickey@invisible-island.net">
+  <meta http-equiv="Content-Type" content=
+  "text/html; charset=us-ascii">
+</head>
+
+<body>
+  <ul>
+    <li>Programs:
+
+      <ul>
+        <li><a href="captoinfo.1m.html">captoinfo &ndash; convert a
+        termcap description into a terminfo description</a></li>
+
+        <li><a href="clear.1.html">clear &ndash; clear the terminal
+        screen</a></li>
+
+        <li><a href="infocmp.1m.html">infocmp &ndash; compare or
+        print out terminfo descriptions</a></li>
+
+        <li><a href="infotocap.1m.html">infotocap &ndash; convert a
+        terminfo description into a termcap description</a></li>
+
+        <li><a href="tabs.1.html">tabs &ndash; set tabs on a
+        terminal</a></li>
+
+        <li><a href="tic.1m.html">tic &ndash; the terminfo
+        entry-description compiler</a></li>
+
+        <li><a href="toe.1m.html">toe &ndash; table of (terminfo)
+        entries</a></li>
+
+        <li><a href="tput.1.html">tput &ndash; initialize a
+        terminal or query terminfo database</a></li>
+
+        <li><a href="tset.1.html">tset &ndash; terminal
+        initialization</a></li>
+      </ul>
+    </li>
+
+    <li>Scripts:
+
+      <ul>
+        <li><a href=
+        "adacurses6-config.1.html">adacurses*-config</a> &ndash;
+        helper script for AdaCurses libraries</li>
+
+        <li><a href="ncurses6-config.1.html">ncurses*-config</a>
+        &ndash; helper script for ncurses libraries</li>
+      </ul>
+    </li>
+
+    <li>Libraries:
+
+      <ul>
+        <li><a href="ncurses.3x.html">ncurses &ndash; CRT screen
+        handling and optimization package</a></li>
+
+        <li><a href="panel.3x.html">panel &ndash; panel stack
+        extension for curses</a></li>
+
+        <li><a href="form.3x.html">form &ndash; curses extension
+        for programming forms</a></li>
+
+        <li><a href="menu.3x.html">menu &ndash; curses extension
+        for programming menus</a></li>
+      </ul>
+    </li>
+
+    <li>File formats:
+
+      <ul>
+        <li><a href="terminfo.5.html">terminfo &ndash; terminal
+        capability data base</a></li>
+
+        <li><a href="term.5.html">term &ndash; format of compiled
+        term file.</a></li>
+
+        <li><a href="scr_dump.5.html">scr_dump &ndash; format of
+        curses screen dumps.</a></li>
+
+        <li><a href="term.7.html">term &ndash; conventions for
+        naming terminal types</a></li>
+      </ul>
+    </li>
+  </ul>
+</body>
+</html>
diff --git a/doc/html/man/infocmp.1m.html b/doc/html/man/infocmp.1m.html
new file mode 100644
index 0000000..81b95ac
--- /dev/null
+++ b/doc/html/man/infocmp.1m.html
@@ -0,0 +1,551 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2017,2018 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: infocmp.1m,v 1.81 2022/02/12 20:02:20 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>infocmp 1m</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">infocmp 1m</H1>
+<PRE>
+<STRONG><A HREF="infocmp.1m.html">infocmp(1m)</A></STRONG>                                                        <STRONG><A HREF="infocmp.1m.html">infocmp(1m)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>infocmp</STRONG> - compare or print out <EM>terminfo</EM> descriptions
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>infocmp</STRONG> [<STRONG>-1CDEFGIKLTUVWcdegilnpqrtux</STRONG>]
+             [<STRONG>-v</STRONG> <EM>n</EM>] [<STRONG>-s</STRONG> <STRONG>d</STRONG>| <STRONG>i</STRONG>| <STRONG>l</STRONG>| <STRONG>c</STRONG>] [<STRONG>-Q</STRONG> <EM>n</EM>] [<STRONG>-R</STRONG> <STRONG>subset</STRONG>]
+             [<STRONG>-w</STRONG> <EM>width</EM>] [<STRONG>-A</STRONG> <EM>directory</EM>] [<STRONG>-B</STRONG> <EM>directory</EM>]
+             [<EM>termname</EM>...]
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       <STRONG>infocmp</STRONG>  can  be  used  to  compare  a binary <STRONG>terminfo</STRONG> entry with other
+       terminfo entries, rewrite a <STRONG>terminfo</STRONG> description to take  advantage  of
+       the  <STRONG>use=</STRONG>  terminfo field, or print out a <STRONG>terminfo</STRONG> description from the
+       binary file (<STRONG>term</STRONG>) in a variety of formats.  In all cases, the  boolean
+       fields  will be printed first, followed by the numeric fields, followed
+       by the string fields.
+
+
+</PRE><H3><a name="h3-Default-Options">Default Options</a></H3><PRE>
+       If no options are specified and zero or one  <EM>termnames</EM>  are  specified,
+       the <STRONG>-I</STRONG> option will be assumed.  If more than one <EM>termname</EM> is specified,
+       the <STRONG>-d</STRONG> option will be assumed.
+
+
+</PRE><H3><a name="h3-Comparison-Options-_-d_-_-c_-_-n_">Comparison Options [-d] [-c] [-n]</a></H3><PRE>
+       <STRONG>infocmp</STRONG>  compares  the  <STRONG>terminfo</STRONG>  description  of  the  first  terminal
+       <EM>termname</EM>  with  each  of  the descriptions given by the entries for the
+       other terminal's <EM>termnames</EM>.  If a capability is defined for only one of
+       the   terminals,  the  value  returned  depends  on  the  type  of  the
+       capability:
+
+       <STRONG>o</STRONG>   <STRONG>F</STRONG> for missing boolean variables
+
+       <STRONG>o</STRONG>   <STRONG>NULL</STRONG> for missing integer or string variables
+
+       Use the <STRONG>-q</STRONG> option to show the distinction between <EM>absent</EM> and  <EM>cancelled</EM>
+       capabilities.
+
+       These  options  produce a list which you can use to compare two or more
+       terminal descriptions:
+
+       <STRONG>-d</STRONG>   produces a list of each capability that is <EM>different</EM>  between  two
+            entries.   Each  item  in  the list shows ":" after the capability
+            name, followed by the capability values, separated by a comma.
+
+       <STRONG>-c</STRONG>   produces a list of each capability that is <EM>common</EM> between  two  or
+            more entries.  Missing capabilities are ignored.  Each item in the
+            list  shows  "="  after  the  capability  name,  followed  by  the
+            capability value.
+
+            The  <STRONG>-u</STRONG>  option  provides  a  related  output,  showing  the first
+            terminal description rewritten to use the  second  as  a  building
+            block via the "use=" clause.
+
+       <STRONG>-n</STRONG>   produces  a  list  of each capability that is in <EM>none</EM> of the given
+            entries.  Each item in the list shows "!"  before  the  capability
+            name.
+
+            Normally only the conventional capabilities are shown.  Use the <STRONG>-x</STRONG>
+            option to add the BSD-compatibility capabilities  (names  prefixed
+            with "OT").
+
+            If  no  <EM>termnames</EM> are given, <STRONG>infocmp</STRONG> uses the environment variable
+            <STRONG>TERM</STRONG> for each of the <EM>termnames</EM>.
+
+
+</PRE><H3><a name="h3-Source-Listing-Options-_-I_-_-L_-_-C_-_-r_">Source Listing Options [-I] [-L] [-C] [-r]</a></H3><PRE>
+       The <STRONG>-I</STRONG>, <STRONG>-L</STRONG>, and <STRONG>-C</STRONG> options will  produce  a  source  listing  for  each
+       terminal named.
+
+            <STRONG>-I</STRONG>   use the <STRONG>terminfo</STRONG> names
+            <STRONG>-L</STRONG>   use the long C variable name listed in &lt;<STRONG>term.h</STRONG>&gt;
+            <STRONG>-C</STRONG>   use the <STRONG>termcap</STRONG> names
+            <STRONG>-r</STRONG>   when using <STRONG>-C</STRONG>, put out all capabilities in <STRONG>termcap</STRONG> form
+            <STRONG>-K</STRONG>   modifies the <STRONG>-C</STRONG> option, improving BSD-compatibility.
+
+       If  no  <EM>termnames</EM> are given, the environment variable <STRONG>TERM</STRONG> will be used
+       for the terminal name.
+
+       The source produced by the <STRONG>-C</STRONG> option may be used directly as a  <STRONG>termcap</STRONG>
+       entry,  but not all parameterized strings can be changed to the <STRONG>termcap</STRONG>
+       format.  <STRONG>infocmp</STRONG> will attempt to  convert  most  of  the  parameterized
+       information,  and  anything not converted will be plainly marked in the
+       output and commented out.  These should be edited by hand.
+
+       For best results when converting to <STRONG>termcap</STRONG> format, you should use both
+       <STRONG>-C</STRONG>  and  <STRONG>-r</STRONG>.   Normally a termcap description is limited to 1023 bytes.
+       <STRONG>infocmp</STRONG> trims away less essential parts to make it  fit.   If  you  are
+       converting to one of the (rare) termcap implementations which accept an
+       unlimited size of termcap, you may want to add  the  <STRONG>-T</STRONG>  option.   More
+       often  however,  you  must  help  the  termcap implementation, and trim
+       excess whitespace (use the <STRONG>-0</STRONG> option for that).
+
+       All padding information for strings  will  be  collected  together  and
+       placed  at  the  beginning  of  the  string  where  <STRONG>termcap</STRONG> expects it.
+       Mandatory padding (padding information with a trailing "/") will become
+       optional.
+
+       All  <STRONG>termcap</STRONG>  variables  no longer supported by <STRONG>terminfo</STRONG>, but which are
+       derivable from other <STRONG>terminfo</STRONG>  variables,  will  be  output.   Not  all
+       <STRONG>terminfo</STRONG>  capabilities  will  be translated; only those variables which
+       were part of <STRONG>termcap</STRONG> will normally be output.  Specifying the <STRONG>-r</STRONG> option
+       will  take off this restriction, allowing all capabilities to be output
+       in <EM>termcap</EM> form.  Normally you would use both the <STRONG>-C</STRONG>  and  <STRONG>-r</STRONG>  options.
+       The  actual  format  used  incorporates  some  improvements for escaped
+       characters  from  terminfo  format.   For  a  stricter   BSD-compatible
+       translation, use the <STRONG>-K</STRONG> option rather than <STRONG>-C</STRONG>.
+
+       Note  that  because  padding  is  collected  to  the  beginning  of the
+       capability, not all capabilities are output.  Mandatory padding is  not
+       supported.   Because  <STRONG>termcap</STRONG>  strings  are  not as flexible, it is not
+       always possible  to  convert  a  <STRONG>terminfo</STRONG>  string  capability  into  an
+       equivalent <STRONG>termcap</STRONG> format.  A subsequent conversion of the <STRONG>termcap</STRONG> file
+       back into <STRONG>terminfo</STRONG> format will not necessarily reproduce  the  original
+       <STRONG>terminfo</STRONG> source.
+
+       Some  common  <STRONG>terminfo</STRONG>  parameter sequences, their <STRONG>termcap</STRONG> equivalents,
+       and some terminal types which commonly have such sequences, are:
+
+           <STRONG>terminfo</STRONG>                    <STRONG>termcap</STRONG>   Representative Terminals
+           ---------------------------------------------------------------
+           <STRONG>%p1%c</STRONG>                       <STRONG>%.</STRONG>        adm
+           <STRONG>%p1%d</STRONG>                       <STRONG>%d</STRONG>        hp, ANSI standard, vt100
+           <STRONG>%p1%'x'%+%c</STRONG>                 <STRONG>%+x</STRONG>       concept
+           <STRONG>%i</STRONG>                          <STRONG>%i</STRONG>q       ANSI standard, vt100
+           <STRONG>%p1%?%'x'%&gt;%t%p1%'y'%+%;</STRONG>    <STRONG>%&gt;xy</STRONG>      concept
+           <STRONG>%p2</STRONG> is printed before <STRONG>%p1</STRONG>   <STRONG>%r</STRONG>        hp
+
+
+</PRE><H3><a name="h3-Use_-Option-_-u_">Use= Option [-u]</a></H3><PRE>
+       The <STRONG>-u</STRONG> option produces a  <STRONG>terminfo</STRONG>  source  description  of  the  first
+       terminal  <EM>termname</EM>  which  is  relative  to the sum of the descriptions
+       given by the entries for the other terminals <EM>termnames</EM>.  It  does  this
+       by  analyzing  the differences between the first <EM>termname</EM> and the other
+       <EM>termnames</EM> and producing a description with <STRONG>use=</STRONG> fields  for  the  other
+       terminals.  In this manner, it is possible to retrofit generic terminfo
+       entries into a terminal's description.  Or, if  two  similar  terminals
+       exist, but were coded at different times or by different people so that
+       each description is a full description, using <STRONG>infocmp</STRONG>  will  show  what
+       can be done to change one description to be relative to the other.
+
+       A capability will be printed with an at-sign (@) if it no longer exists
+       in the first <EM>termname</EM>, but one of the other <EM>termname</EM> entries contains a
+       value for it.  A capability's value will be printed if the value in the
+       first <EM>termname</EM> is not found in any of the other <EM>termname</EM> entries, or if
+       the  first of the other <EM>termname</EM> entries that has this capability gives
+       a different value for the capability than that in the first <EM>termname</EM>.
+
+       The order of the other <EM>termname</EM>  entries  is  significant.   Since  the
+       terminfo  compiler  <STRONG>tic</STRONG>  does a left-to-right scan of the capabilities,
+       specifying two <STRONG>use=</STRONG> entries that contain differing entries for the same
+       capabilities will produce different results depending on the order that
+       the entries are given in.  <STRONG>infocmp</STRONG> will flag any  such  inconsistencies
+       between the other <EM>termname</EM> entries as they are found.
+
+       Alternatively, specifying a capability <EM>after</EM> a <STRONG>use=</STRONG> entry that contains
+       that capability will cause the  second  specification  to  be  ignored.
+       Using  <STRONG>infocmp</STRONG>  to recreate a description can be a useful check to make
+       sure that everything was specified correctly  in  the  original  source
+       description.
+
+       Another  error  that  does not cause incorrect compiled files, but will
+       slow down the compilation time, is specifying extra  <STRONG>use=</STRONG>  fields  that
+       are superfluous.  <STRONG>infocmp</STRONG> will flag any other <EM>termname</EM> <EM>use=</EM> fields that
+       were not needed.
+
+   <STRONG>Changing</STRONG> <STRONG>Databases</STRONG> <STRONG>[-A</STRONG> <EM>directory</EM>] [-B <EM>directory</EM>]
+       Like  other  <STRONG>ncurses</STRONG>  utilities,  <STRONG>infocmp</STRONG>  looks   for   the   terminal
+       descriptions   in  several  places.   You  can  use  the  <STRONG>TERMINFO</STRONG>  and
+       <STRONG>TERMINFO_DIRS</STRONG> environment variables to override the compiled-in default
+       list of places to search (see <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG> for details).
+
+       You  can  also use the options <STRONG>-A</STRONG> and <STRONG>-B</STRONG> to override the list of places
+       to search when comparing terminal descriptions:
+
+       <STRONG>o</STRONG>   The <STRONG>-A</STRONG> option sets the location for the first <EM>termname</EM>
+
+       <STRONG>o</STRONG>   The <STRONG>-B</STRONG> option sets the location for the other <EM>termnames</EM>.
+
+       Using these options, it is  possible  to  compare  descriptions  for  a
+       terminal  with  the  same name located in two different databases.  For
+       instance, you can use this feature for comparing descriptions  for  the
+       same terminal created by different people.
+
+
+</PRE><H3><a name="h3-Other-Options">Other Options</a></H3><PRE>
+       <STRONG>-0</STRONG>   causes the fields to be printed on one line, without wrapping.
+
+       <STRONG>-1</STRONG>   causes the fields to be printed out one to a line.  Otherwise, the
+            fields will be printed several to a line to a maximum width of  60
+            characters.
+
+       <STRONG>-a</STRONG>   tells  <STRONG>infocmp</STRONG>  to  retain  commented-out capabilities rather than
+            discarding them.  Capabilities are  commented  by  prefixing  them
+            with a period.
+
+       <STRONG>-D</STRONG>   tells <STRONG>infocmp</STRONG> to print the database locations that it knows about,
+            and exit.
+
+       <STRONG>-E</STRONG>   Dump the capabilities of the given terminal as tables,  needed  in
+            the   C   initializer  for  a  TERMTYPE  structure  (the  terminal
+            capability structure in the <STRONG>&lt;term.h&gt;</STRONG>).  This option is useful  for
+            preparing  versions  of  the  curses library hardwired for a given
+            terminal type.  The tables are all declared static, and are  named
+            according  to  the type and the name of the corresponding terminal
+            entry.
+
+            Before ncurses 5.0, the split between the <STRONG>-e</STRONG> and  <STRONG>-E</STRONG>  options  was
+            not  needed;  but  support  for extended names required making the
+            arrays  of  terminal  capabilities  separate  from  the   TERMTYPE
+            structure.
+
+       <STRONG>-e</STRONG>   Dump the capabilities of the given terminal as a C initializer for
+            a TERMTYPE structure (the terminal  capability  structure  in  the
+            <STRONG>&lt;term.h&gt;</STRONG>).   This  option  is useful for preparing versions of the
+            curses library hardwired for a given terminal type.
+
+       <STRONG>-F</STRONG>   compare terminfo files.  This assumes that two following arguments
+            are  filenames.   The  files  are  searched  for  pairwise matches
+            between entries, with two entries considered to match  if  any  of
+            their  names  do.   The  report  printed  to standard output lists
+            entries with no matches in the other file, and entries  with  more
+            than  one match.  For entries with exactly one match it includes a
+            difference report.  Normally, to reduce the volume of the  report,
+            use  references  are  not resolved before looking for differences,
+            but resolution can be forced by also specifying <STRONG>-r</STRONG>.
+
+       <STRONG>-f</STRONG>   Display complex terminfo strings which contain  if/then/else/endif
+            expressions indented for readability.
+
+       <STRONG>-G</STRONG>   Display  constant  literals  in  decimal  form  rather  than their
+            character equivalents.
+
+       <STRONG>-g</STRONG>   Display constant character literals in  quoted  form  rather  than
+            their decimal equivalents.
+
+       <STRONG>-i</STRONG>   Analyze  the  initialization (<STRONG>is1</STRONG>, <STRONG>is2</STRONG>, <STRONG>is3</STRONG>), and reset (<STRONG>rs1</STRONG>, <STRONG>rs2</STRONG>,
+            <STRONG>rs3</STRONG>),  strings  in  the  entry,  as  well  as   those   used   for
+            starting/stopping  cursor-positioning  mode (<STRONG>smcup</STRONG>, <STRONG>rmcup</STRONG>) as well
+            as starting/stopping keymap mode (<STRONG>smkx</STRONG>, <STRONG>rmkx</STRONG>).
+
+            For each string, the code tries to  analyze  it  into  actions  in
+            terms  of  the  other capabilities in the entry, certain X3.64/ISO
+            6429/ECMA-48 capabilities, and certain DEC VT-series private modes
+            (the  set  of  recognized  special sequences has been selected for
+            completeness over the existing terminfo  database).   Each  report
+            line  consists  of  the  capability  name, followed by a colon and
+            space, followed by a printable expansion of the capability  string
+            with   sections   matching   recognized  actions  translated  into
+            {}-bracketed descriptions.
+
+            Here is a list of the DEC/ANSI special sequences recognized:
+
+                         Action        Meaning
+                         -----------------------------------------
+                         RIS           full reset
+                         SC            save cursor
+                         RC            restore cursor
+                         LL            home-down
+                         RSR           reset scroll region
+                         -----------------------------------------
+                         DECSTR        soft reset (VT320)
+                         S7C1T         7-bit controls (VT220)
+                         -----------------------------------------
+
+                         ISO DEC G0    enable DEC graphics for G0
+                         ISO UK G0     enable UK chars for G0
+                         ISO US G0     enable US chars for G0
+                         ISO DEC G1    enable DEC graphics for G1
+                         ISO UK G1     enable UK chars for G1
+                         ISO US G1     enable US chars for G1
+                         -----------------------------------------
+                         DECPAM        application keypad mode
+                         DECPNM        normal keypad mode
+                         DECANSI       enter ANSI mode
+                         -----------------------------------------
+                         ECMA[+-]AM    keyboard action mode
+                         ECMA[+-]IRM   insert replace mode
+                         ECMA[+-]SRM   send receive mode
+                         ECMA[+-]LNM   linefeed mode
+                         -----------------------------------------
+                         DEC[+-]CKM    application cursor keys
+                         DEC[+-]ANM    set VT52 mode
+                         DEC[+-]COLM   132-column mode
+                         DEC[+-]SCLM   smooth scroll
+                         DEC[+-]SCNM   reverse video mode
+                         DEC[+-]OM     origin mode
+                         DEC[+-]AWM    wraparound mode
+                         DEC[+-]ARM    auto-repeat mode
+
+            It  also  recognizes  a  SGR  action  corresponding  to   ANSI/ISO
+            6429/ECMA  Set  Graphics  Rendition, with the values NORMAL, BOLD,
+            UNDERLINE, BLINK, and REVERSE.  All but  NORMAL  may  be  prefixed
+            with
+
+            <STRONG>o</STRONG>   "+" (turn on) or
+
+            <STRONG>o</STRONG>   "-" (turn off).
+
+            An  SGR0  designates  an  empty  highlight sequence (equivalent to
+            {SGR:NORMAL}).
+
+       <STRONG>-l</STRONG>   Set output format to terminfo.
+
+       <STRONG>-p</STRONG>   Ignore padding specifications when comparing strings.
+
+       <STRONG>-Q</STRONG> <EM>n</EM> Rather than show source  in  terminfo  (text)  format,  print  the
+            compiled  (binary) format in hexadecimal or base64 form, depending
+            on the option's value:
+
+               1  hexadecimal
+
+               2  base64
+
+               3  hexadecimal and base64
+
+            For example, this prints the compiled terminfo value as  a  string
+            which could be assigned to the <STRONG>TERMINFO</STRONG> environment variable:
+
+                infocmp -0 -q -Q2
+
+       <STRONG>-q</STRONG>   This makes the output a little shorter:
+
+            <STRONG>o</STRONG>   Make  the  comparison listing shorter by omitting subheadings,
+                and using "-" for absent capabilities, "@" for canceled rather
+                than "NULL".
+
+            <STRONG>o</STRONG>   However,   show   differences  between  absent  and  cancelled
+                capabilities.
+
+            <STRONG>o</STRONG>   Omit the "Reconstructed from" comment for source listings.
+
+       <STRONG>-R</STRONG><EM>subset</EM>
+            Restrict output to a given subset.  This option is  for  use  with
+            archaic  versions of terminfo like those on SVr1, Ultrix, or HP-UX
+            that do not support the full set of SVR4/XSI Curses terminfo;  and
+            variants  such  as AIX that have their own extensions incompatible
+            with SVr4/XSI.
+
+            <STRONG>o</STRONG>   Available terminfo subsets are  "SVr1",  "Ultrix",  "HP",  and
+                "AIX"; see <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG> for details.
+
+            <STRONG>o</STRONG>   You  can  also  choose  the  subset  "BSD"  which selects only
+                capabilities with termcap equivalents  recognized  by  4.4BSD.
+                The <STRONG>-C</STRONG> option sets the "BSD" subset as a side-effect.
+
+            <STRONG>o</STRONG>   If  you  select  any  other value for <STRONG>-R</STRONG>, it is the same as no
+                subset, i.e.,  all  capabilities  are  used.   The  <STRONG>-I</STRONG>  option
+                likewise selects no subset as a side-effect.
+
+       <STRONG>-s</STRONG> <EM>[d|i|l|c]</EM>
+            The  <STRONG>-s</STRONG>  option sorts the fields within each type according to the
+            argument below:
+
+            <STRONG>d</STRONG>    leave fields in  the  order  that  they  are  stored  in  the
+                 <EM>terminfo</EM> database.
+
+            <STRONG>i</STRONG>    sort by <EM>terminfo</EM> name.
+
+            <STRONG>l</STRONG>    sort by the long C variable name.
+
+            <STRONG>c</STRONG>    sort by the <EM>termcap</EM> name.
+
+            If  the  <STRONG>-s</STRONG>  option  is  not given, the fields printed out will be
+            sorted alphabetically by  the  <STRONG>terminfo</STRONG>  name  within  each  type,
+            except  in  the  case of the <STRONG>-C</STRONG> or the <STRONG>-L</STRONG> options, which cause the
+            sorting to be done by the <STRONG>termcap</STRONG> name  or  the  long  C  variable
+            name, respectively.
+
+       <STRONG>-T</STRONG>   eliminates  size-restrictions  on  the  generated  text.   This is
+            mainly  useful  for  testing  and  analysis,  since  the  compiled
+            descriptions  are  limited  (e.g.,  1023  for  termcap,  4096  for
+            terminfo).
+
+       <STRONG>-t</STRONG>   tells <STRONG>tic</STRONG> to discard commented-out  capabilities.   Normally  when
+            translating  from terminfo to termcap, untranslatable capabilities
+            are commented-out.
+
+       <STRONG>-U</STRONG>   tells <STRONG>infocmp</STRONG> to not  post-process  the  data  after  parsing  the
+            source  file.   This  feature  helps  when  comparing  the  actual
+            contents of two source files, since  it  excludes  the  inferences
+            that <STRONG>infocmp</STRONG> makes to fill in missing data.
+
+       <STRONG>-V</STRONG>   reports the version of ncurses which was used in this program, and
+            exits.
+
+       <STRONG>-v</STRONG> <EM>n</EM> prints out tracing information on standard error  as  the  program
+            runs.
+
+            The  optional  parameter  <EM>n</EM>  is  a number from 1 to 10, inclusive,
+            indicating the desired level of detail of information.  If ncurses
+            is  built  without  tracing  support,  the  optional  parameter is
+            ignored.
+
+       <STRONG>-W</STRONG>   By itself, the <STRONG>-w</STRONG>  option  will  not  force  long  strings  to  be
+            wrapped.  Use the <STRONG>-W</STRONG> option to do this.
+
+       <STRONG>-w</STRONG> <EM>width</EM>
+            changes the output to <EM>width</EM> characters.
+
+       <STRONG>-x</STRONG>   print information for user-defined capabilities (see <STRONG>user_caps(5)</STRONG>.
+            These are extensions to  the  terminfo  repertoire  which  can  be
+            loaded using the <STRONG>-x</STRONG> option of <STRONG>tic</STRONG>.
+
+
+</PRE><H2><a name="h2-FILES">FILES</a></H2><PRE>
+       /usr/share/terminfo Compiled terminal description database.
+
+
+</PRE><H2><a name="h2-HISTORY">HISTORY</a></H2><PRE>
+       Although  System  V  Release  2  provided a terminfo library, it had no
+       documented tool for decompiling the terminal descriptions.  Tony Hansen
+       (AT&amp;T) wrote the first <STRONG>infocmp</STRONG> in early 1984, for System V Release 3.
+
+       Eric  Raymond  used  the  AT&amp;T  documentation  in  1995  to  provide an
+       equivalent <STRONG>infocmp</STRONG> for ncurses.   In  addition,  he  added  a  few  new
+       features such as:
+
+       <STRONG>o</STRONG>   the   <STRONG>-e</STRONG>   option,   to  support  <EM>fallback</EM>  (compiled-in)  terminal
+           descriptions
+
+       <STRONG>o</STRONG>   the <STRONG>-i</STRONG> option, to help with analysis
+
+       Later, Thomas Dickey added the <STRONG>-x</STRONG> (user-defined  capabilities)  option,
+       and  the  <STRONG>-E</STRONG>  option  to  support  fallback  entries  with user-defined
+       capabilities.
+
+       For a complete list, see the <EM>EXTENSIONS</EM> section.
+
+       In 2010, Roy Marples provided an <STRONG>infocmp</STRONG> program  for  NetBSD.   It  is
+       less  capable  than  the  SVr4  or ncurses versions (e.g., it lacks the
+       sorting options documented in X/Open), but does include the  <STRONG>-x</STRONG>  option
+       adapted from ncurses.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       X/Open  Curses,  Issue  7 (2009) provides a description of <STRONG>infocmp</STRONG>.  It
+       does not mention the options used for converting to termcap format.
+
+
+</PRE><H2><a name="h2-EXTENSIONS">EXTENSIONS</a></H2><PRE>
+       The <STRONG>-0</STRONG>, <STRONG>-1</STRONG>, <STRONG>-E</STRONG>, <STRONG>-F</STRONG>, <STRONG>-G</STRONG>, <STRONG>-Q</STRONG>, <STRONG>-R</STRONG>, <STRONG>-T</STRONG>, <STRONG>-V</STRONG>, <STRONG>-a</STRONG>, <STRONG>-e</STRONG>, <STRONG>-f</STRONG>, <STRONG>-g</STRONG>, <STRONG>-i</STRONG>, <STRONG>-l</STRONG>, <STRONG>-p</STRONG>,  <STRONG>-q</STRONG>
+       and <STRONG>-t</STRONG> options are not supported in SVr4 curses.
+
+       SVr4   infocmp  does  not  distinguish  between  absent  and  cancelled
+       capabilities.  Also, it shows missing integer capabilities as  <STRONG>-1</STRONG>  (the
+       internal   value   used   to   represent   missing   integers).    This
+       implementation shows those as  "NULL",  for  consistency  with  missing
+       strings.
+
+       The  <STRONG>-r</STRONG>  option's  notion of "termcap" capabilities is System V Release
+       4's.  Actual BSD curses versions will have a more restricted  set.   To
+       see only the 4.4BSD set, use <STRONG>-r</STRONG> <STRONG>-RBSD</STRONG>.
+
+
+</PRE><H2><a name="h2-BUGS">BUGS</a></H2><PRE>
+       The <STRONG>-F</STRONG> option of <STRONG><A HREF="infocmp.1m.html">infocmp(1m)</A></STRONG> should be a <STRONG><A HREF="toe.1m.html">toe(1m)</A></STRONG> mode.
+
+
+</PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
+       <STRONG><A HREF="captoinfo.1m.html">captoinfo(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="toe.1m.html">toe(1m)</A></STRONG>,    <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG>,
+       <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG>.  <STRONG><A HREF="user_caps.5.html">user_caps(5)</A></STRONG>.
+
+       https://invisible-island.net/ncurses/tctest.html
+
+       This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20221231).
+
+
+</PRE><H2><a name="h2-AUTHOR">AUTHOR</a></H2><PRE>
+       Eric S. Raymond &lt;esr@snark.thyrsus.com&gt; and
+       Thomas E. Dickey &lt;dickey@invisible-island.net&gt;
+
+
+
+                                                                   <STRONG><A HREF="infocmp.1m.html">infocmp(1m)</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-Default-Options">Default Options</a></li>
+<li><a href="#h3-Comparison-Options-_-d_-_-c_-_-n_">Comparison Options [-d] [-c] [-n]</a></li>
+<li><a href="#h3-Source-Listing-Options-_-I_-_-L_-_-C_-_-r_">Source Listing Options [-I] [-L] [-C] [-r]</a></li>
+<li><a href="#h3-Use_-Option-_-u_">Use= Option [-u]</a></li>
+<li><a href="#h3-Other-Options">Other Options</a></li>
+</ul>
+</li>
+<li><a href="#h2-FILES">FILES</a></li>
+<li><a href="#h2-HISTORY">HISTORY</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-EXTENSIONS">EXTENSIONS</a></li>
+<li><a href="#h2-BUGS">BUGS</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-AUTHOR">AUTHOR</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/infotocap.1m.html b/doc/html/man/infotocap.1m.html
new file mode 100644
index 0000000..1ea690c
--- /dev/null
+++ b/doc/html/man/infotocap.1m.html
@@ -0,0 +1,118 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1999-2010,2016 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: infotocap.1m,v 1.20 2022/02/12 20:02:20 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>infotocap 1m</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">infotocap 1m</H1>
+<PRE>
+<STRONG><A HREF="infotocap.1m.html">infotocap(1m)</A></STRONG>                                                    <STRONG><A HREF="infotocap.1m.html">infotocap(1m)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>infotocap</STRONG> - convert a <EM>terminfo</EM> description into a <EM>termcap</EM> description
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>infotocap</STRONG> [<STRONG>-v</STRONG><EM>n</EM> <EM>width</EM>]  [<STRONG>-V</STRONG>] [<STRONG>-1</STRONG>] [<STRONG>-w</STRONG> <EM>width</EM>] <EM>file</EM> ...
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       <STRONG>infotocap</STRONG> looks in each given text <EM>file</EM> for <STRONG>terminfo</STRONG> descriptions.  For
+       each terminfo description found, an equivalent <STRONG>termcap</STRONG>  description  is
+       written  to  standard output.  Terminfo <STRONG>use</STRONG> capabilities are translated
+       directly to termcap <STRONG>tc</STRONG> capabilities.
+
+       <STRONG>-v</STRONG>   print out tracing information on standard  error  as  the  program
+            runs.
+
+       <STRONG>-V</STRONG>   print  out the version of the program in use on standard error and
+            exit.
+
+       <STRONG>-1</STRONG>   cause the fields to print out  one  to  a  line.   Otherwise,  the
+            fields  will be printed several to a line to a maximum width of 60
+            characters.
+
+       <STRONG>-w</STRONG>   change the output to <EM>width</EM> characters.
+
+
+</PRE><H2><a name="h2-FILES">FILES</a></H2><PRE>
+       /usr/share/terminfo Compiled terminal description database.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       This utility is actually a link to <STRONG>tic</STRONG>, running in <EM>-C</EM>  mode.   You  can
+       use other <STRONG>tic</STRONG> options such as <STRONG>-f</STRONG> and  <STRONG>-x</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       None  of  X/Open  Curses,  Issue 7 (2009), SVr4 or NetBSD document this
+       application.
+
+
+</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 20221231).
+
+
+</PRE><H2><a name="h2-AUTHOR">AUTHOR</a></H2><PRE>
+       Eric S. Raymond &lt;esr@snark.thyrsus.com&gt; and
+       Thomas E. Dickey &lt;dickey@invisible-island.net&gt;
+
+
+
+                                                                 <STRONG><A HREF="infotocap.1m.html">infotocap(1m)</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></li>
+<li><a href="#h2-FILES">FILES</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-AUTHOR">AUTHOR</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/key_defined.3x.html b/doc/html/man/key_defined.3x.html
new file mode 100644
index 0000000..f39d326
--- /dev/null
+++ b/doc/html/man/key_defined.3x.html
@@ -0,0 +1,100 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 2003-2006,2010 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.                                                           *
+  ****************************************************************************
+  * Author: Thomas E. Dickey 2003
+  * @Id: key_defined.3x,v 1.13 2022/02/12 20:03:40 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>key_defined 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">key_defined 3x</H1>
+<PRE>
+<STRONG><A HREF="key_defined.3x.html">key_defined(3x)</A></STRONG>                                                <STRONG><A HREF="key_defined.3x.html">key_defined(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>key_defined</STRONG> - check if a keycode is defined
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>key_defined(const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>definition</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       This  is an extension to the curses library.  It permits an application
+       to determine if a string is currently bound to any keycode.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       If the string is bound to a keycode, its value (greater than  zero)  is
+       returned.   If  no  keycode  is bound, zero is returned.  If the string
+       conflicts with longer strings which are bound to keys, -1 is returned.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These routines are specific to ncurses.  They  were  not  supported  on
+       Version 7, BSD or System V implementations.  It is recommended that any
+       code depending on them be conditioned using NCURSES_VERSION.
+
+
+</PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
+       <STRONG><A HREF="define_key.3x.html">define_key(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-AUTHOR">AUTHOR</a></H2><PRE>
+       Thomas Dickey.
+
+
+
+                                                               <STRONG><A HREF="key_defined.3x.html">key_defined(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></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>
+<li><a href="#h2-AUTHOR">AUTHOR</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/keybound.3x.html b/doc/html/man/keybound.3x.html
new file mode 100644
index 0000000..f605c1b
--- /dev/null
+++ b/doc/html/man/keybound.3x.html
@@ -0,0 +1,103 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1999-2008,2010 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.                                                           *
+  ****************************************************************************
+  * Author: Thomas E. Dickey 1999
+  * @Id: keybound.3x,v 1.14 2022/02/12 20:03:40 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>keybound 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">keybound 3x</H1>
+<PRE>
+<STRONG><A HREF="keybound.3x.html">keybound(3x)</A></STRONG>                                                      <STRONG><A HREF="keybound.3x.html">keybound(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>keybound</STRONG> - return definition of keycode
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>char</STRONG> <STRONG>*</STRONG> <STRONG>keybound(int</STRONG> <EM>keycode</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>count);</EM>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       This  is an extension to the curses library.  It permits an application
+       to determine the string which is defined in the terminfo  for  specific
+       keycodes.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       The <EM>keycode</EM> parameter must be greater than zero, else NULL is returned.
+       If it does not correspond to a defined key, then NULL is returned.  The
+       <EM>count</EM>  parameter  is  used  to allow the application to iterate through
+       multiple  definitions,  counting  from  zero.   When  successful,   the
+       function returns a string which must be freed by the caller.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These  routines  are  specific  to ncurses.  They were not supported on
+       Version 7, BSD or System V implementations.  It is recommended that any
+       code depending on them be conditioned using NCURSES_VERSION.
+
+
+</PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
+       <STRONG><A HREF="define_key.3x.html">define_key(3x)</A></STRONG>, <STRONG><A HREF="keyok.3x.html">keyok(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-AUTHOR">AUTHOR</a></H2><PRE>
+       Thomas Dickey.
+
+
+
+                                                                  <STRONG><A HREF="keybound.3x.html">keybound(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></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>
+<li><a href="#h2-AUTHOR">AUTHOR</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/keyok.3x.html b/doc/html/man/keyok.3x.html
new file mode 100644
index 0000000..dbb3f0c
--- /dev/null
+++ b/doc/html/man/keyok.3x.html
@@ -0,0 +1,102 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2017 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.                                                           *
+  ****************************************************************************
+  * Author: Thomas E. Dickey 1997
+  * @Id: keyok.3x,v 1.19 2022/02/12 20:03:40 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>keyok 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">keyok 3x</H1>
+<PRE>
+<STRONG><A HREF="keyok.3x.html">keyok(3x)</A></STRONG>                                                            <STRONG><A HREF="keyok.3x.html">keyok(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>keyok</STRONG> - enable or disable a keycode
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>keyok(int</STRONG> <EM>keycode</EM><STRONG>,</STRONG> <STRONG>bool</STRONG> <EM>enable</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       This  is an extension to the curses library.  It permits an application
+       to disable specific keycodes, rather than use the  <STRONG>keypad</STRONG>  function  to
+       disable all keycodes.  Keys that have been disabled can be re-enabled.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       The  keycode  must  be  greater than zero, else <STRONG>ERR</STRONG> is returned.  If it
+       does not correspond to a defined key, then <STRONG>ERR</STRONG>  is  returned.   If  the
+       <EM>enable</EM>  parameter  is  true,  then the key must have been disabled, and
+       vice versa.  Otherwise, the function returns <STRONG>OK</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These routines are specific to ncurses.  They  were  not  supported  on
+       Version 7, BSD or System V implementations.  It is recommended that any
+       code depending on them be conditioned using NCURSES_VERSION.
+
+
+</PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
+       <STRONG><A HREF="define_key.3x.html">define_key(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-AUTHOR">AUTHOR</a></H2><PRE>
+       Thomas Dickey.
+
+
+
+                                                                     <STRONG><A HREF="keyok.3x.html">keyok(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></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>
+<li><a href="#h2-AUTHOR">AUTHOR</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/legacy_coding.3x.html b/doc/html/man/legacy_coding.3x.html
new file mode 100644
index 0000000..c4aa096
--- /dev/null
+++ b/doc/html/man/legacy_coding.3x.html
@@ -0,0 +1,115 @@
+<!--
+  ****************************************************************************
+  * Copyright 2020-2021,2022 Thomas E. Dickey                                *
+  * Copyright 2005-2016,2017 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.                                                           *
+  ****************************************************************************
+  * Author: Thomas E. Dickey
+  * @Id: legacy_coding.3x,v 1.11 2022/02/12 20:07:56 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>legacy_coding 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">legacy_coding 3x</H1>
+<PRE>
+<STRONG><A HREF="legacy_coding.3x.html">legacy_coding(3x)</A></STRONG>                                            <STRONG><A HREF="legacy_coding.3x.html">legacy_coding(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>use_legacy_coding</STRONG> - override locale-encoding checks
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>use_legacy_coding(int</STRONG> <EM>level</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The  <STRONG>use_legacy_coding</STRONG>  function is an extension to the curses library.
+       It allows the caller to change  the  result  of  <STRONG>unctrl</STRONG>,  and  suppress
+       related checks within the library that would normally cause nonprinting
+       characters to be rendered in visible form.   This  affects  only  8-bit
+       characters.
+
+       The <EM>level</EM> parameter controls the result:
+
+              0    the   library  functions  normally,  rendering  nonprinting
+                   characters as described in <STRONG>unctrl</STRONG>.
+
+              1    the  library  ignores  <STRONG>isprintf</STRONG>  for  codes  in  the  range
+                   160-255.
+
+              2    the  library  ignores  <STRONG>isprintf</STRONG>  for  codes  in  the  range
+                   128-255.  It also modifies the output  of  <STRONG>unctrl</STRONG>,  showing
+                   codes in the range 128-159 as is.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       If  the  screen has not been initialized, or the <EM>level</EM> parameter is out
+       of range, the function returns <STRONG>ERR</STRONG>.  Otherwise, it returns the previous
+       level: <STRONG>0</STRONG>, <STRONG>1</STRONG> or <STRONG>2</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       This  routine  is specific to ncurses.  It was not supported on Version
+       7, BSD or System V implementations.  It is recommended  that  any  code
+       depending on ncurses extensions be conditioned using NCURSES_VERSION.
+
+
+</PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
+       <STRONG><A HREF="unctrl.3x.html">unctrl(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-AUTHOR">AUTHOR</a></H2><PRE>
+       Thomas Dickey (to support lynx's font-switching feature).
+
+
+
+                                                             <STRONG><A HREF="legacy_coding.3x.html">legacy_coding(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></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>
+<li><a href="#h2-AUTHOR">AUTHOR</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/menu.3x.html b/doc/html/man/menu.3x.html
new file mode 100644
index 0000000..a8f2c96
--- /dev/null
+++ b/doc/html/man/menu.3x.html
@@ -0,0 +1,250 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2020,2021 Thomas E. Dickey                                *
+  * Copyright 1998-2014,2017 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: menu.3x,v 1.29 2021/12/25 21:49:32 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>menu 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">menu 3x</H1>
+<PRE>
+<STRONG><A HREF="menu.3x.html">menu(3x)</A></STRONG>                                                              <STRONG><A HREF="menu.3x.html">menu(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>menu</STRONG> - curses extension for programming menus
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;menu.h&gt;</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The <STRONG>menu</STRONG> library provides terminal-independent facilities for composing
+       menu systems on character-cell terminals.  The library  includes:  item
+       routines,  which create and modify menu items; and menu routines, which
+       group items into  menus,  display  menus  on  the  screen,  and  handle
+       interaction with the user.
+
+       The <STRONG>menu</STRONG> library uses the <STRONG>curses</STRONG> libraries, and a curses initialization
+       routine such as <STRONG>initscr</STRONG> must  be  called  before  using  any  of  these
+       functions.   To  use  the  <STRONG>menu</STRONG>  library,  link with the options <STRONG>-lmenu</STRONG>
+       <STRONG>-lcurses</STRONG>.
+
+
+</PRE><H3><a name="h3-Current-Default-Values-for-Item-Attributes">Current Default Values for Item Attributes</a></H3><PRE>
+       The <STRONG>menu</STRONG> library maintains a default value for  item  attributes.   You
+       can  get  or  set  this default by calling the appropriate <STRONG>get_</STRONG> or <STRONG>set_</STRONG>
+       routine with a <STRONG>NULL</STRONG> item pointer.  Changing this default  with  a  <STRONG>set_</STRONG>
+       function  affects  future  item  creations,  but  does  not  change the
+       rendering of items already created.
+
+
+</PRE><H3><a name="h3-Routine-Name-Index">Routine Name Index</a></H3><PRE>
+       The following table lists each <STRONG>menu</STRONG> routine and the name of the  manual
+       page on which it is described.
+
+       <STRONG>curses</STRONG> Routine Name    Manual Page Name
+       --------------------------------------------
+       current_item           <STRONG><A HREF="mitem_current.3x.html">mitem_current(3x)</A></STRONG>
+       free_item              <STRONG><A HREF="mitem_new.3x.html">mitem_new(3x)</A></STRONG>
+       free_menu              <STRONG><A HREF="menu_new.3x.html">menu_new(3x)</A></STRONG>
+       item_count             <STRONG><A HREF="menu_items.3x.html">menu_items(3x)</A></STRONG>
+       item_description       <STRONG><A HREF="mitem_name.3x.html">mitem_name(3x)</A></STRONG>
+       item_index             <STRONG><A HREF="mitem_current.3x.html">mitem_current(3x)</A></STRONG>
+       item_init              <STRONG><A HREF="menu_hook.3x.html">menu_hook(3x)</A></STRONG>
+       item_name              <STRONG><A HREF="mitem_name.3x.html">mitem_name(3x)</A></STRONG>
+       item_opts              <STRONG><A HREF="mitem_opts.3x.html">mitem_opts(3x)</A></STRONG>
+       item_opts_off          <STRONG><A HREF="mitem_opts.3x.html">mitem_opts(3x)</A></STRONG>
+       item_opts_on           <STRONG><A HREF="mitem_opts.3x.html">mitem_opts(3x)</A></STRONG>
+       item_term              <STRONG><A HREF="menu_hook.3x.html">menu_hook(3x)</A></STRONG>
+       item_userptr           <STRONG><A HREF="mitem_userptr.3x.html">mitem_userptr(3x)</A></STRONG>
+       item_value             <STRONG><A HREF="mitem_value.3x.html">mitem_value(3x)</A></STRONG>
+       item_visible           <STRONG><A HREF="mitem_visible.3x.html">mitem_visible(3x)</A></STRONG>
+       menu_back              <STRONG><A HREF="menu_attributes.3x.html">menu_attributes(3x)</A></STRONG>
+       menu_driver            <STRONG><A HREF="menu_driver.3x.html">menu_driver(3x)</A></STRONG>
+       menu_fore              <STRONG><A HREF="menu_attributes.3x.html">menu_attributes(3x)</A></STRONG>
+       menu_format            <STRONG><A HREF="menu_format.3x.html">menu_format(3x)</A></STRONG>
+       menu_grey              <STRONG><A HREF="menu_attributes.3x.html">menu_attributes(3x)</A></STRONG>
+       menu_init              <STRONG><A HREF="menu_hook.3x.html">menu_hook(3x)</A></STRONG>
+       menu_items             <STRONG><A HREF="menu_items.3x.html">menu_items(3x)</A></STRONG>
+       menu_mark              <STRONG><A HREF="menu_mark.3x.html">menu_mark(3x)</A></STRONG>
+       menu_opts              <STRONG><A HREF="menu_opts.3x.html">menu_opts(3x)</A></STRONG>
+       menu_opts_off          <STRONG><A HREF="menu_opts.3x.html">menu_opts(3x)</A></STRONG>
+       menu_opts_on           <STRONG><A HREF="menu_opts.3x.html">menu_opts(3x)</A></STRONG>
+       menu_pad               <STRONG><A HREF="menu_attributes.3x.html">menu_attributes(3x)</A></STRONG>
+       menu_pattern           <STRONG><A HREF="menu_pattern.3x.html">menu_pattern(3x)</A></STRONG>
+       menu_request_by_name   <STRONG><A HREF="menu_requestname.3x.html">menu_requestname(3x)</A></STRONG>
+       menu_request_name      <STRONG><A HREF="menu_requestname.3x.html">menu_requestname(3x)</A></STRONG>
+
+       menu_spacing           <STRONG><A HREF="menu_spacing.3x.html">menu_spacing(3x)</A></STRONG>
+       menu_sub               <STRONG><A HREF="menu_win.3x.html">menu_win(3x)</A></STRONG>
+       menu_term              <STRONG><A HREF="menu_hook.3x.html">menu_hook(3x)</A></STRONG>
+       menu_userptr           <STRONG><A HREF="menu_userptr.3x.html">menu_userptr(3x)</A></STRONG>
+       menu_win               <STRONG><A HREF="menu_win.3x.html">menu_win(3x)</A></STRONG>
+       new_item               <STRONG><A HREF="mitem_new.3x.html">mitem_new(3x)</A></STRONG>
+       new_menu               <STRONG><A HREF="menu_new.3x.html">menu_new(3x)</A></STRONG>
+       pos_menu_cursor        <STRONG><A HREF="menu_cursor.3x.html">menu_cursor(3x)</A></STRONG>
+       post_menu              <STRONG><A HREF="menu_post.3x.html">menu_post(3x)</A></STRONG>
+       scale_menu             <STRONG><A HREF="menu_win.3x.html">menu_win(3x)</A></STRONG>
+       set_current_item       <STRONG><A HREF="mitem_current.3x.html">mitem_current(3x)</A></STRONG>
+       set_item_init          <STRONG><A HREF="menu_hook.3x.html">menu_hook(3x)</A></STRONG>
+       set_item_opts          <STRONG><A HREF="mitem_opts.3x.html">mitem_opts(3x)</A></STRONG>
+       set_item_term          <STRONG><A HREF="menu_hook.3x.html">menu_hook(3x)</A></STRONG>
+       set_item_userptr       <STRONG><A HREF="mitem_userptr.3x.html">mitem_userptr(3x)</A></STRONG>
+       set_item_value         <STRONG><A HREF="mitem_value.3x.html">mitem_value(3x)</A></STRONG>
+       set_menu_back          <STRONG><A HREF="menu_attributes.3x.html">menu_attributes(3x)</A></STRONG>
+       set_menu_fore          <STRONG><A HREF="menu_attributes.3x.html">menu_attributes(3x)</A></STRONG>
+       set_menu_format        <STRONG><A HREF="menu_format.3x.html">menu_format(3x)</A></STRONG>
+       set_menu_grey          <STRONG><A HREF="menu_attributes.3x.html">menu_attributes(3x)</A></STRONG>
+       set_menu_init          <STRONG><A HREF="menu_hook.3x.html">menu_hook(3x)</A></STRONG>
+       set_menu_items         <STRONG><A HREF="menu_items.3x.html">menu_items(3x)</A></STRONG>
+       set_menu_mark          <STRONG><A HREF="menu_mark.3x.html">menu_mark(3x)</A></STRONG>
+       set_menu_opts          <STRONG><A HREF="mitem_opts.3x.html">mitem_opts(3x)</A></STRONG>
+       set_menu_pad           <STRONG><A HREF="menu_attributes.3x.html">menu_attributes(3x)</A></STRONG>
+       set_menu_pattern       <STRONG><A HREF="menu_pattern.3x.html">menu_pattern(3x)</A></STRONG>
+       set_menu_spacing       <STRONG><A HREF="menu_spacing.3x.html">menu_spacing(3x)</A></STRONG>
+       set_menu_sub           <STRONG><A HREF="menu_win.3x.html">menu_win(3x)</A></STRONG>
+       set_menu_term          <STRONG><A HREF="menu_hook.3x.html">menu_hook(3x)</A></STRONG>
+       set_menu_userptr       <STRONG><A HREF="menu_userptr.3x.html">menu_userptr(3x)</A></STRONG>
+       set_menu_win           <STRONG><A HREF="menu_win.3x.html">menu_win(3x)</A></STRONG>
+       set_top_row            <STRONG><A HREF="mitem_current.3x.html">mitem_current(3x)</A></STRONG>
+       top_row                <STRONG><A HREF="mitem_current.3x.html">mitem_current(3x)</A></STRONG>
+       unpost_menu            <STRONG><A HREF="menu_post.3x.html">menu_post(3x)</A></STRONG>
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       Routines  that  return  pointers  return  <STRONG>NULL</STRONG> on error.  Routines that
+       return an integer return one of the following error codes:
+
+       <STRONG>E_OK</STRONG> The routine succeeded.
+
+       <STRONG>E_BAD_ARGUMENT</STRONG>
+            Routine detected an incorrect or out-of-range argument.
+
+       <STRONG>E_BAD_STATE</STRONG>
+            Routine was called from an initialization or termination function.
+
+       <STRONG>E_NO_MATCH</STRONG>
+            Character failed to match.
+
+       <STRONG>E_NO_ROOM</STRONG>
+            Menu is too large for its window.
+
+       <STRONG>E_NOT_CONNECTED</STRONG>
+            No items are connected to the menu.
+
+       <STRONG>E_NOT_POSTED</STRONG>
+            The menu has not been posted.
+
+       <STRONG>E_NOT_SELECTABLE</STRONG>
+            The designated item cannot be selected.
+
+       <STRONG>E_POSTED</STRONG>
+            The menu is already posted.
+
+       <STRONG>E_REQUEST_DENIED</STRONG>
+            The menu driver could not process the request.
+
+       <STRONG>E_SYSTEM_ERROR</STRONG>
+            System error occurred (see <STRONG>errno(3)</STRONG>).
+
+       <STRONG>E_UNKNOWN_COMMAND</STRONG>
+            The menu driver code saw an unknown request code.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The header  file  <STRONG>&lt;menu.h&gt;</STRONG>  automatically  includes  the  header  files
+       <STRONG>&lt;curses.h&gt;</STRONG> and <STRONG>&lt;eti.h&gt;</STRONG>.
+
+       In your library list, libmenu.a should be before libncurses.a; that is,
+       you should say "-lmenu -lncurses", not  the  other  way  around  (which
+       would give a link-error when using static libraries).
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These  routines  emulate  the  System  V  menu  library.  They were not
+       supported on Version 7 or BSD versions.
+
+       The menu facility was documented in SVr4.2 in <EM>Character</EM> <EM>User</EM>  <EM>Interface</EM>
+       <EM>Programming</EM> <EM>(UNIX</EM> <EM>SVR4.2)</EM>.
+
+       It is not part of X/Open Curses.
+
+       Aside from ncurses, there are few implementations:
+
+       <STRONG>o</STRONG>   systems based on SVr4 source code, e.g., Solaris.
+
+       <STRONG>o</STRONG>   NetBSD curses.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen  Pfeifer.   Manual  pages and adaptation for ncurses by Eric S.
+       Raymond.
+
+
+</PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</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 20221231).
+
+
+
+                                                                      <STRONG><A HREF="menu.3x.html">menu(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-Current-Default-Values-for-Item-Attributes">Current Default Values for Item Attributes</a></li>
+<li><a href="#h3-Routine-Name-Index">Routine Name Index</a></li>
+</ul>
+</li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/menu_attributes.3x.html b/doc/html/man/menu_attributes.3x.html
new file mode 100644
index 0000000..62252e0
--- /dev/null
+++ b/doc/html/man/menu_attributes.3x.html
@@ -0,0 +1,140 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2015 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: menu_attributes.3x,v 1.22 2022/02/12 20:05:11 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>menu_attributes 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">menu_attributes 3x</H1>
+<PRE>
+<STRONG><A HREF="menu_attributes.3x.html">menu_attributes(3x)</A></STRONG>                                        <STRONG><A HREF="menu_attributes.3x.html">menu_attributes(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>menu_back</STRONG>,     <STRONG>menu_fore</STRONG>,     <STRONG>menu_grey</STRONG>,    <STRONG>menu_pad</STRONG>,    <STRONG>set_menu_back</STRONG>,
+       <STRONG>set_menu_fore</STRONG>,  <STRONG>set_menu_grey</STRONG>,  <STRONG>set_menu_pad</STRONG>  -  color  and   attribute
+       control for menus
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;menu.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>set_menu_fore(MENU</STRONG> <STRONG>*</STRONG><EM>menu</EM><STRONG>,</STRONG> <STRONG>chtype</STRONG> <EM>attr</EM><STRONG>);</STRONG>
+       <STRONG>chtype</STRONG> <STRONG>menu_fore(const</STRONG> <STRONG>MENU</STRONG> <STRONG>*</STRONG><EM>menu</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>set_menu_back(MENU</STRONG> <STRONG>*</STRONG><EM>menu</EM><STRONG>,</STRONG> <STRONG>chtype</STRONG> <EM>attr</EM><STRONG>);</STRONG>
+       <STRONG>chtype</STRONG> <STRONG>menu_back(const</STRONG> <STRONG>MENU</STRONG> <STRONG>*</STRONG><EM>menu</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>set_menu_grey(MENU</STRONG> <STRONG>*</STRONG><EM>menu</EM><STRONG>,</STRONG> <STRONG>chtype</STRONG> <EM>attr</EM><STRONG>);</STRONG>
+       <STRONG>chtype</STRONG> <STRONG>menu_grey(const</STRONG> <STRONG>MENU</STRONG> <STRONG>*</STRONG><EM>menu</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>set_menu_pad(MENU</STRONG> <STRONG>*</STRONG><EM>menu</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>pad</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>menu_pad(const</STRONG> <STRONG>MENU</STRONG> <STRONG>*</STRONG><EM>menu</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The  function <STRONG>set_menu_fore</STRONG> sets the foreground attribute of <EM>menu</EM>. This
+       is the highlight used for selected menu items.  <STRONG>menu_fore</STRONG>  returns  the
+       foreground attribute.  The default is <STRONG>A_REVERSE</STRONG>.
+
+       The  function <STRONG>set_menu_back</STRONG> sets the background attribute of <EM>menu</EM>. This
+       is the highlight used for selectable (but not currently selected)  menu
+       items.   The  function <STRONG>menu_back</STRONG> returns the background attribute.  The
+       default is <STRONG>A_NORMAL</STRONG>.
+
+       The function <STRONG>set_menu_grey</STRONG> sets the grey attribute of <EM>menu</EM>. This is the
+       highlight  used  for un-selectable menu items in menus that permit more
+       than one selection.  The function <STRONG>menu_grey</STRONG> returns the grey attribute.
+       The default is <STRONG>A_UNDERLINE</STRONG>.
+
+       The  function  <STRONG>set_menu_pad</STRONG>  sets  the character used to fill the space
+       between the name and  description  parts  of  a  menu  item.   <STRONG>menu_pad</STRONG>
+       returns the given menu's pad character.  The default is a blank.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       These routines return one of the following:
+
+       <STRONG>E_OK</STRONG> The routine succeeded.
+
+       <STRONG>E_SYSTEM_ERROR</STRONG>
+            System error occurred (see <STRONG>errno(3)</STRONG>).
+
+       <STRONG>E_BAD_ARGUMENT</STRONG>
+            Routine detected an incorrect or out-of-range argument.
+
+
+</PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</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.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  header  file  <STRONG>&lt;menu.h&gt;</STRONG>  automatically  includes  the  header  file
+       <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These  routines  emulate  the  System  V  menu  library.  They were not
+       supported on Version 7 or BSD versions.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                           <STRONG><A HREF="menu_attributes.3x.html">menu_attributes(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/menu_cursor.3x.html b/doc/html/man/menu_cursor.3x.html
new file mode 100644
index 0000000..8f28ca1
--- /dev/null
+++ b/doc/html/man/menu_cursor.3x.html
@@ -0,0 +1,117 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2015 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: menu_cursor.3x,v 1.16 2022/02/12 20:05:11 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>menu_cursor 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">menu_cursor 3x</H1>
+<PRE>
+<STRONG><A HREF="menu_cursor.3x.html">menu_cursor(3x)</A></STRONG>                                                <STRONG><A HREF="menu_cursor.3x.html">menu_cursor(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>pos_menu_cursor</STRONG> - position a menu's cursor
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;menu.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>pos_menu_cursor(const</STRONG> <STRONG>MENU</STRONG> <STRONG>*</STRONG><EM>menu</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The  function  <STRONG>pos_menu_cursor</STRONG>  restores  the  cursor  to  the  current
+       position associated with the menu's  selected  item.   This  is  useful
+       after  <STRONG>curses</STRONG>  routines  have  been  called  to  do  screen-painting in
+       response to a menu select.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       This routine returns one of the following:
+
+       <STRONG>E_OK</STRONG> The routine succeeded.
+
+       <STRONG>E_SYSTEM_ERROR</STRONG>
+            System error occurred (see <STRONG>errno(3)</STRONG>).
+
+       <STRONG>E_BAD_ARGUMENT</STRONG>
+            Routine detected an incorrect or out-of-range argument.
+
+       <STRONG>E_NOT_POSTED</STRONG>
+            The menu has not been posted.
+
+
+</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="menu.3x.html">menu(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  header  file  <STRONG>&lt;menu.h&gt;</STRONG>  automatically  includes  the  header  file
+       <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These  routines  emulate  the  System  V  menu  library.  They were not
+       supported on Version 7 or BSD versions.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                               <STRONG><A HREF="menu_cursor.3x.html">menu_cursor(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/menu_driver.3x.html b/doc/html/man/menu_driver.3x.html
new file mode 100644
index 0000000..df2fbe8
--- /dev/null
+++ b/doc/html/man/menu_driver.3x.html
@@ -0,0 +1,251 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2017 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: menu_driver.3x,v 1.31 2022/02/12 20:05:11 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>menu_driver 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">menu_driver 3x</H1>
+<PRE>
+<STRONG><A HREF="menu_driver.3x.html">menu_driver(3x)</A></STRONG>                                                <STRONG><A HREF="menu_driver.3x.html">menu_driver(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>menu_driver</STRONG> - command-processing loop of the menu system
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;menu.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>menu_driver(MENU</STRONG> <STRONG>*</STRONG><EM>menu</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>c</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       Once a menu has been posted (displayed), you should funnel input events
+       to it through <STRONG>menu_driver</STRONG>.  This routine has three major input cases:
+
+       <STRONG>o</STRONG>   The input is a form navigation request.  Navigation  request  codes
+           are constants defined in <STRONG>&lt;form.h&gt;</STRONG>, which are distinct from the key-
+           and character codes returned by <STRONG><A HREF="curs_getch.3x.html">wgetch(3x)</A></STRONG>.
+
+       <STRONG>o</STRONG>   The input is a printable character.   Printable  characters  (which
+           must  be  positive,  less  than  256)  are checked according to the
+           program's locale settings.
+
+       <STRONG>o</STRONG>   The input is the KEY_MOUSE special key  associated  with  an  mouse
+           event.
+
+       The menu driver requests are as follows:
+
+       REQ_LEFT_ITEM
+            Move left to an item.
+
+       REQ_RIGHT_ITEM
+            Move right to an item.
+
+       REQ_UP_ITEM
+            Move up to an item.
+
+       REQ_DOWN_ITEM
+            Move down to an item.
+
+       REQ_SCR_ULINE
+            Scroll up a line.
+
+       REQ_SCR_DLINE
+            Scroll down a line.
+
+       REQ_SCR_DPAGE
+            Scroll down a page.
+
+       REQ_SCR_UPAGE
+            Scroll up a page.
+
+       REQ_FIRST_ITEM
+            Move to the first item.
+
+       REQ_LAST_ITEM
+            Move to the last item.
+
+       REQ_NEXT_ITEM
+            Move to the next item.
+
+       REQ_PREV_ITEM
+            Move to the previous item.
+
+       REQ_TOGGLE_ITEM
+            Select/deselect an item.
+
+       REQ_CLEAR_PATTERN
+            Clear the menu pattern buffer.
+
+       REQ_BACK_PATTERN
+            Delete the previous character from the pattern buffer.
+
+       REQ_NEXT_MATCH
+            Move to the next item matching the pattern match.
+
+       REQ_PREV_MATCH
+            Move to the previous item matching the pattern match.
+
+       If the second argument is a printable character, the code appends it to
+       the pattern buffer and attempts to move to the next item  matching  the
+       new pattern.  If there is no such match, <STRONG>menu_driver</STRONG> returns <STRONG>E_NO_MATCH</STRONG>
+       and deletes the appended character from the buffer.
+
+       If the second argument is one of the above  pre-defined  requests,  the
+       corresponding action is performed.
+
+
+</PRE><H3><a name="h3-MOUSE-HANDLING">MOUSE HANDLING</a></H3><PRE>
+       If  the  second  argument  is the KEY_MOUSE special key, the associated
+       mouse event is translated into one of the above  pre-defined  requests.
+       Currently only clicks in the user window (e.g., inside the menu display
+       area or the decoration window) are handled.
+
+       If you click above the display region of the menu:
+
+       <STRONG>o</STRONG>   a REQ_SCR_ULINE is generated for a single click,
+
+       <STRONG>o</STRONG>   a REQ_SCR_UPAGE is generated for a double-click and
+
+       <STRONG>o</STRONG>   a REQ_FIRST_ITEM is generated for a triple-click.
+
+       If you click below the display region of the menu:
+
+       <STRONG>o</STRONG>   a REQ_SCR_DLINE is generated for a single click,
+
+       <STRONG>o</STRONG>   a REQ_SCR_DPAGE is generated for a double-click and
+
+       <STRONG>o</STRONG>   a REQ_LAST_ITEM is generated for a triple-click.
+
+       If you click at an item inside the display area of the menu:
+
+       <STRONG>o</STRONG>   the menu cursor is positioned to that item.
+
+       <STRONG>o</STRONG>   If you double-click an item  a  REQ_TOGGLE_ITEM  is  generated  and
+           <STRONG>E_UNKNOWN_COMMAND</STRONG>  is  returned.   This  return  value makes sense,
+           because a double click usually means that an  item-specific  action
+           should be returned.  It is exactly the purpose of this return value
+           to signal that an application specific command should be executed.
+
+       <STRONG>o</STRONG>   If a translation into a request was done, <STRONG>menu_driver</STRONG>  returns  the
+           result of this request.
+
+       If  you clicked outside the user window or the mouse event could not be
+       translated into a menu request an <STRONG>E_REQUEST_DENIED</STRONG> is returned.
+
+
+</PRE><H3><a name="h3-APPLICATION-DEFINED-COMMANDS">APPLICATION-DEFINED COMMANDS</a></H3><PRE>
+       If the second argument is neither printable nor one of the  above  pre-
+       defined  menu  requests  or  KEY_MOUSE,  the  drive  assumes  it  is an
+       application-specific    command    and    returns    <STRONG>E_UNKNOWN_COMMAND</STRONG>.
+       Application-defined commands should be defined relative to <STRONG>MAX_COMMAND</STRONG>,
+       the maximum value of these pre-defined requests.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       <STRONG>menu_driver</STRONG> return one of the following error codes:
+
+       <STRONG>E_OK</STRONG> The routine succeeded.
+
+       <STRONG>E_SYSTEM_ERROR</STRONG>
+            System error occurred (see <STRONG>errno(3)</STRONG>).
+
+       <STRONG>E_BAD_ARGUMENT</STRONG>
+            Routine detected an incorrect or out-of-range argument.
+
+       <STRONG>E_BAD_STATE</STRONG>
+            Routine was called from an initialization or termination function.
+
+       <STRONG>E_NOT_POSTED</STRONG>
+            The menu has not been posted.
+
+       <STRONG>E_UNKNOWN_COMMAND</STRONG>
+            The menu driver code saw an unknown request code.
+
+       <STRONG>E_NO_MATCH</STRONG>
+            Character failed to match.
+
+       <STRONG>E_REQUEST_DENIED</STRONG>
+            The menu driver could not process the request.
+
+
+</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_getch.3x.html">getch(3x)</A></STRONG>, <STRONG><A HREF="menu.3x.html">menu(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The header  file  <STRONG>&lt;menu.h&gt;</STRONG>  automatically  includes  the  header  files
+       <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These  routines  emulate  the  System  V  menu  library.  They were not
+       supported on Version 7 or BSD versions.  The support for  mouse  events
+       is ncurses specific.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                               <STRONG><A HREF="menu_driver.3x.html">menu_driver(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-MOUSE-HANDLING">MOUSE HANDLING</a></li>
+<li><a href="#h3-APPLICATION-DEFINED-COMMANDS">APPLICATION-DEFINED COMMANDS</a></li>
+</ul>
+</li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/menu_format.3x.html b/doc/html/man/menu_format.3x.html
new file mode 100644
index 0000000..8b70d01
--- /dev/null
+++ b/doc/html/man/menu_format.3x.html
@@ -0,0 +1,130 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2015,2016 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: menu_format.3x,v 1.21 2022/02/12 20:05:11 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>menu_format 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">menu_format 3x</H1>
+<PRE>
+<STRONG><A HREF="menu_format.3x.html">menu_format(3x)</A></STRONG>                                                <STRONG><A HREF="menu_format.3x.html">menu_format(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>set_menu_format</STRONG>, <STRONG>menu_format</STRONG> - set and get menu sizes
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;menu.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>set_menu_format(MENU</STRONG> <STRONG>*</STRONG><EM>menu</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>rows</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>cols</EM><STRONG>);</STRONG>
+       <STRONG>void</STRONG> <STRONG>menu_format(const</STRONG> <STRONG>MENU</STRONG> <STRONG>*</STRONG><EM>menu</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <STRONG>*</STRONG><EM>rows</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <STRONG>*</STRONG><EM>cols</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The function <STRONG>set_menu_format</STRONG> sets the maximum display size of the given
+       menu.  If this size is too small to display all menu  items,  the  menu
+       will  be  made  scrollable.   If  this  size  is  larger than the menus
+       subwindow and the subwindow is too small to  display  all  menu  items,
+       <STRONG>post_menu</STRONG> will fail.
+
+       The  default format is 16 rows, 1 column.  Calling <STRONG>set_menu_format</STRONG> with
+       a null menu pointer will change this default.  A  zero  row  or  column
+       argument  to  <STRONG>set_menu_format</STRONG> is interpreted as a request not to change
+       the current value.
+
+       The function <STRONG>menu_format</STRONG> returns the maximum-size constraints  for  the
+       given menu into the storage addressed by <STRONG>rows</STRONG> and <STRONG>cols</STRONG>.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       These routines returns one of the following:
+
+       <STRONG>E_OK</STRONG> The routine succeeded.
+
+       <STRONG>E_SYSTEM_ERROR</STRONG>
+            System error occurred (see <STRONG>errno(3)</STRONG>).
+
+       <STRONG>E_BAD_ARGUMENT</STRONG>
+            Routine detected an incorrect or out-of-range argument.
+
+       <STRONG>E_POSTED</STRONG>
+            The menu is already posted.
+
+       <STRONG>E_NOT_CONNECTED</STRONG>
+            No items are connected to the menu.
+
+
+</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="menu.3x.html">menu(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  header  file  <STRONG>&lt;menu.h&gt;</STRONG>  automatically  includes  the  header  file
+       <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These routines emulate the  System  V  menu  library.   They  were  not
+       supported on Version 7 or BSD versions.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                               <STRONG><A HREF="menu_format.3x.html">menu_format(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/menu_hook.3x.html b/doc/html/man/menu_hook.3x.html
new file mode 100644
index 0000000..88bb67d
--- /dev/null
+++ b/doc/html/man/menu_hook.3x.html
@@ -0,0 +1,141 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2007,2010 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: menu_hook.3x,v 1.18 2022/02/12 20:05:11 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>menu_hook 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">menu_hook 3x</H1>
+<PRE>
+<STRONG><A HREF="menu_hook.3x.html">menu_hook(3x)</A></STRONG>                                                    <STRONG><A HREF="menu_hook.3x.html">menu_hook(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>menu_hook</STRONG> - set hooks for automatic invocation by applications
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;menu.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>set_item_init(MENU</STRONG> <STRONG>*</STRONG><EM>menu</EM><STRONG>,</STRONG> <STRONG>Menu_Hook</STRONG> <EM>func);</EM>
+       <STRONG>Menu_Hook</STRONG> <STRONG>item_init(const</STRONG> <STRONG>MENU</STRONG> <STRONG>*</STRONG><EM>menu);</EM>
+
+       <STRONG>int</STRONG> <STRONG>set_item_term(MENU</STRONG> <STRONG>*</STRONG><EM>menu</EM><STRONG>,</STRONG> <STRONG>Menu_Hook</STRONG> <EM>func);</EM>
+       <STRONG>Menu_Hook</STRONG> <STRONG>item_term(const</STRONG> <STRONG>MENU</STRONG> <STRONG>*</STRONG><EM>menu);</EM>
+
+       <STRONG>int</STRONG> <STRONG>set_menu_init(MENU</STRONG> <STRONG>*</STRONG><EM>menu</EM><STRONG>,</STRONG> <STRONG>Menu_Hook</STRONG> <EM>func);</EM>
+       <STRONG>Menu_Hook</STRONG> <STRONG>menu_init(const</STRONG> <STRONG>MENU</STRONG> <STRONG>*</STRONG><EM>menu);</EM>
+
+       <STRONG>int</STRONG> <STRONG>set_menu_term(MENU</STRONG> <STRONG>*</STRONG><EM>menu</EM><STRONG>,</STRONG> <STRONG>Menu_Hook</STRONG> <EM>func);</EM>
+       <STRONG>Menu_Hook</STRONG> <STRONG>menu_term(const</STRONG> <STRONG>MENU</STRONG> <STRONG>*</STRONG><EM>menu);</EM>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       These  functions make it possible to set hook functions to be called at
+       various points in the automatic processing  of  input  event  codes  by
+       <STRONG>menu_driver</STRONG>.
+
+       The  function  <STRONG>set_item_init</STRONG> sets a hook to be called at menu-post time
+       and each time the selected item changes (after the change).   <STRONG>item_init</STRONG>
+       returns  the  current  item init hook, if any (<STRONG>NULL</STRONG> if there is no such
+       hook).
+
+       The function <STRONG>set_item_term</STRONG> sets a hook to be called at menu-unpost time
+       and each time the selected item changes (before the change).  <STRONG>item_term</STRONG>
+       returns the current item term hook, if any (<STRONG>NULL</STRONG> if there  is  no  such
+       hook).
+
+       The  function  <STRONG>set_menu_init</STRONG> sets a hook to be called at menu-post time
+       and just after the top row on the  menu  changes  once  it  is  posted.
+       <STRONG>menu_init</STRONG>  returns the current menu init hook, if any (<STRONG>NULL</STRONG> if there is
+       no such hook).
+
+       The function <STRONG>set_menu_term</STRONG> sets a hook to be called at menu-unpost time
+       and  just  before  the  top  row on the menu changes once it is posted.
+       <STRONG>menu_term</STRONG> returns the current menu term hook, if any (<STRONG>NULL</STRONG> if there  is
+       no such hook).
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       Routines  that  return  pointers  return <STRONG>NULL</STRONG> on error.  Other routines
+       return one of the following:
+
+       <STRONG>E_OK</STRONG> The routine succeeded.
+
+       <STRONG>E_SYSTEM_ERROR</STRONG>
+            System error occurred (see <STRONG>errno(3)</STRONG>).
+
+
+</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="menu.3x.html">menu(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  header  file  <STRONG>&lt;menu.h&gt;</STRONG>  automatically  includes  the  header  file
+       <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These  routines  emulate  the  System  V  menu  library.  They were not
+       supported on Version 7 or BSD versions.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                                 <STRONG><A HREF="menu_hook.3x.html">menu_hook(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/menu_items.3x.html b/doc/html/man/menu_items.3x.html
new file mode 100644
index 0000000..3e9791a
--- /dev/null
+++ b/doc/html/man/menu_items.3x.html
@@ -0,0 +1,135 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2012,2015 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: menu_items.3x,v 1.20 2022/02/12 20:05:11 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>menu_items 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">menu_items 3x</H1>
+<PRE>
+<STRONG><A HREF="menu_items.3x.html">menu_items(3x)</A></STRONG>                                                  <STRONG><A HREF="menu_items.3x.html">menu_items(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>set_menu_items</STRONG>,  <STRONG>menu_items</STRONG>,  <STRONG>item_count</STRONG>  -  make and break connections
+       between items and menus
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;menu.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>set_menu_items(MENU</STRONG> <STRONG>*</STRONG><EM>menu</EM><STRONG>,</STRONG> <STRONG>ITEM</STRONG> <STRONG>**</STRONG><EM>items</EM><STRONG>);</STRONG>
+       <STRONG>ITEM</STRONG> <STRONG>**menu_items(const</STRONG> <STRONG>MENU</STRONG> <STRONG>*</STRONG><EM>menu</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>item_count(const</STRONG> <STRONG>MENU</STRONG> <STRONG>*</STRONG><EM>menu</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The function <STRONG>set_menu_items</STRONG> changes the item pointer array of the given
+       <EM>menu</EM>.  The array must be terminated by a <STRONG>NULL</STRONG>.
+
+       The function <STRONG>menu_items</STRONG> returns the item array of the given menu.
+
+       The function <STRONG>item_count</STRONG> returns the count of items in <EM>menu</EM>.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       The function <STRONG>menu_items</STRONG> returns a pointer (which may be <STRONG>NULL</STRONG>).  It does
+       not set <STRONG>errno</STRONG>.
+
+       The function <STRONG>item_count</STRONG> returns <STRONG>ERR</STRONG> (the general  <STRONG>curses</STRONG>  error  return
+       value) if its <EM>menu</EM> parameter is <STRONG>NULL</STRONG>.
+
+       The  function  <STRONG>set_menu_items</STRONG>  returns  one  of  the following codes on
+       error:
+
+       <STRONG>E_OK</STRONG> The routine succeeded.
+
+       <STRONG>E_BAD_ARGUMENT</STRONG>
+            Routine detected an incorrect or out-of-range argument.
+
+       <STRONG>E_NOT_CONNECTED</STRONG>
+            No items are connected to the menu.
+
+       <STRONG>E_POSTED</STRONG>
+            The menu is already posted.
+
+       <STRONG>E_SYSTEM_ERROR</STRONG>
+            System error occurred (see <STRONG>errno(3)</STRONG>).
+
+
+</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="menu.3x.html">menu(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  header  file  <STRONG>&lt;menu.h&gt;</STRONG>  automatically  includes  the  header  file
+       <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These  routines  emulate  the  System  V  menu  library.  They were not
+       supported on Version 7 or BSD versions.
+
+       The SVr4 menu library  documentation  specifies  the  <STRONG>item_count</STRONG>  error
+       value as -1 (which is the value of <STRONG>ERR</STRONG>).
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                                <STRONG><A HREF="menu_items.3x.html">menu_items(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/menu_mark.3x.html b/doc/html/man/menu_mark.3x.html
new file mode 100644
index 0000000..996069a
--- /dev/null
+++ b/doc/html/man/menu_mark.3x.html
@@ -0,0 +1,128 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2015 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: menu_mark.3x,v 1.21 2022/02/12 20:02:20 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>menu_mark 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">menu_mark 3x</H1>
+<PRE>
+<STRONG><A HREF="menu_mark.3x.html">menu_mark(3x)</A></STRONG>                                                    <STRONG><A HREF="menu_mark.3x.html">menu_mark(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>set_menu_mark</STRONG>, <STRONG>menu_mark</STRONG> - get and set the menu mark string
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;menu.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>set_menu_mark(MENU</STRONG> <STRONG>*</STRONG><EM>menu</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>mark</EM><STRONG>);</STRONG>
+       <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*menu_mark(const</STRONG> <STRONG>MENU</STRONG> <STRONG>*</STRONG><EM>menu</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       In  order  to  make  menu selections visible on older terminals without
+       highlighting or color capability, the menu library marks selected items
+       in a menu with a prefix string.
+
+       The  function  <STRONG>set_menu_mark</STRONG>  sets  the mark string for the given menu.
+       Calling <STRONG>set_menu_mark</STRONG> with a null  menu  item  will  abolish  the  mark
+       string.   Note  that  changing the length of the mark string for a menu
+       while the menu is posted is likely to produce unhelpful behavior.
+
+       The default string is "-" (a dash).  Calling <STRONG>set_menu_mark</STRONG> with a  non-
+       <STRONG>NULL</STRONG> menu argument will change this default.
+
+       The function <STRONG>menu_mark</STRONG> returns the menu's mark string (or <STRONG>NULL</STRONG> if there
+       is none).
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       The function <STRONG>menu_mark</STRONG> returns a pointer (which may be <STRONG>NULL</STRONG>).  It  does
+       not set <STRONG>errno</STRONG>.
+
+       The function <STRONG>set_menu_mark</STRONG> may return the following error codes:
+
+       <STRONG>E_OK</STRONG> The routine succeeded.
+
+       <STRONG>E_BAD_ARGUMENT</STRONG>
+            Routine detected an incorrect or out-of-range argument.
+
+       <STRONG>E_SYSTEM_ERROR</STRONG>
+            System error occurred (see <STRONG>errno(3)</STRONG>).
+
+
+</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="menu.3x.html">menu(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  header  file  <STRONG>&lt;menu.h&gt;</STRONG>  automatically  includes  the  header  file
+       <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These routines emulate the  System  V  menu  library.   They  were  not
+       supported on Version 7 or BSD versions.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                                 <STRONG><A HREF="menu_mark.3x.html">menu_mark(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/menu_new.3x.html b/doc/html/man/menu_new.3x.html
new file mode 100644
index 0000000..ad6a2b9
--- /dev/null
+++ b/doc/html/man/menu_new.3x.html
@@ -0,0 +1,128 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2015 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: menu_new.3x,v 1.21 2022/02/12 20:02:20 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>menu_new 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">menu_new 3x</H1>
+<PRE>
+<STRONG><A HREF="menu_new.3x.html">menu_new(3x)</A></STRONG>                                                      <STRONG><A HREF="menu_new.3x.html">menu_new(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>new_menu</STRONG>, <STRONG>free_menu</STRONG> - create and destroy menus
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;menu.h&gt;</STRONG>
+
+       <STRONG>MENU</STRONG> <STRONG>*new_menu(ITEM</STRONG> <STRONG>**</STRONG><EM>items</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>free_menu(MENU</STRONG> <STRONG>*</STRONG><EM>menu</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The  function <STRONG>new_menu</STRONG> creates a new menu connected to a specified item
+       pointer array (which must be <STRONG>NULL</STRONG>-terminated).
+
+       The function <STRONG>free_menu</STRONG> disconnects <EM>menu</EM> from its item array  and  frees
+       the storage allocated for the menu.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       The  function  <STRONG>new_menu</STRONG> returns <STRONG>NULL</STRONG> on error.  It sets <STRONG>errno</STRONG> according
+       to the function's failure:
+
+       <STRONG>E_NOT_CONNECTED</STRONG>
+            No items are connected to the menu.
+
+       <STRONG>E_SYSTEM_ERROR</STRONG>
+            System error occurred, e.g., malloc failure.
+
+       The function <STRONG>free_menu</STRONG> returns one of the following:
+
+       <STRONG>E_OK</STRONG> The routine succeeded.
+
+       <STRONG>E_SYSTEM_ERROR</STRONG>
+            System error occurred (see <STRONG>errno(3)</STRONG>).
+
+       <STRONG>E_BAD_ARGUMENT</STRONG>
+            Routine detected an incorrect or out-of-range argument.
+
+       <STRONG>E_POSTED</STRONG>
+            The menu has already been posted.
+
+
+</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="menu.3x.html">menu(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  header  file  <STRONG>&lt;menu.h&gt;</STRONG>  automatically  includes  the  header  file
+       <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These  routines  emulate  the  System  V  menu  library.  They were not
+       supported on Version 7 or BSD versions.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                                  <STRONG><A HREF="menu_new.3x.html">menu_new(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/menu_opts.3x.html b/doc/html/man/menu_opts.3x.html
new file mode 100644
index 0000000..208bd63
--- /dev/null
+++ b/doc/html/man/menu_opts.3x.html
@@ -0,0 +1,152 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2015,2016 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: menu_opts.3x,v 1.21 2022/02/12 20:02:20 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>menu_opts 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">menu_opts 3x</H1>
+<PRE>
+<STRONG><A HREF="menu_opts.3x.html">menu_opts(3x)</A></STRONG>                                                    <STRONG><A HREF="menu_opts.3x.html">menu_opts(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>set_menu_opts</STRONG>,  <STRONG>menu_opts_on</STRONG>,  <STRONG>menu_opts_off</STRONG>,  <STRONG>menu_opts</STRONG>  - set and get
+       menu options
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;menu.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>set_menu_opts(MENU</STRONG> <STRONG>*</STRONG><EM>menu</EM><STRONG>,</STRONG> <STRONG>Menu_Options</STRONG> <EM>opts</EM><STRONG>);</STRONG>
+       <STRONG>Menu_Options</STRONG> <STRONG>menu_opts(const</STRONG> <STRONG>MENU</STRONG> <STRONG>*</STRONG><EM>menu</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>menu_opts_on(MENU</STRONG> <STRONG>*</STRONG><EM>menu</EM><STRONG>,</STRONG> <STRONG>Menu_Options</STRONG> <EM>opts</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>menu_opts_off(MENU</STRONG> <STRONG>*</STRONG><EM>menu</EM><STRONG>,</STRONG> <STRONG>Menu_Options</STRONG> <EM>opts</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The function <STRONG>set_menu_opts</STRONG> sets all the given menu's option bits  (menu
+       option bits may be logically-OR'ed together).
+
+       The  function  <STRONG>menu_opts_on</STRONG>  turns on the given option bits, and leaves
+       others alone.
+
+       The function <STRONG>menu_opts_off</STRONG> turns off the given option bits, and  leaves
+       others alone.
+
+       The function <STRONG>menu_opts</STRONG> returns the menu's current option bits.
+
+       The following options are defined (all are on by default):
+
+       O_ONEVALUE
+            Only one item can be selected for this menu.
+
+       O_SHOWDESC
+            Display the item descriptions when the menu is posted.
+
+       O_ROWMAJOR
+            Display the menu in row-major order.
+
+       O_IGNORECASE
+            Ignore the case when pattern-matching.
+
+       O_SHOWMATCH
+            Move the cursor to within the item name while pattern-matching.
+
+       O_NONCYCLIC
+            Don't  wrap  around  next-item  and previous-item, requests to the
+            other end of the menu.
+
+       O_MOUSE_MENU
+            If user clicks with  the  mouse  and  it  does  not  fall  on  the
+            currently  active menu, push <STRONG>KEY_MOUSE</STRONG> and the <STRONG>MEVENT</STRONG> data back on
+            the queue to allow processing  in  another  part  of  the  calling
+            program.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       Except for <STRONG>menu_opts</STRONG>, each routine returns one of the following:
+
+       <STRONG>E_OK</STRONG> The routine succeeded.
+
+       <STRONG>E_SYSTEM_ERROR</STRONG>
+            System error occurred (see <STRONG>errno(3)</STRONG>).
+
+       <STRONG>E_POSTED</STRONG>
+            The menu is already posted.
+
+
+</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="menu.3x.html">menu(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  header  file  <STRONG>&lt;menu.h&gt;</STRONG>  automatically  includes  the  header  file
+       <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These routines emulate the  System  V  menu  library.   They  were  not
+       supported on Version 7 or BSD versions.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                                 <STRONG><A HREF="menu_opts.3x.html">menu_opts(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/menu_pattern.3x.html b/doc/html/man/menu_pattern.3x.html
new file mode 100644
index 0000000..cf2f296
--- /dev/null
+++ b/doc/html/man/menu_pattern.3x.html
@@ -0,0 +1,132 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2015 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: menu_pattern.3x,v 1.24 2022/02/12 20:02:20 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>menu_pattern 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">menu_pattern 3x</H1>
+<PRE>
+<STRONG><A HREF="menu_pattern.3x.html">menu_pattern(3x)</A></STRONG>                                              <STRONG><A HREF="menu_pattern.3x.html">menu_pattern(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>set_menu_pattern</STRONG>, <STRONG>menu_pattern</STRONG> - set and get a menu's pattern buffer
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;menu.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>set_menu_pattern(MENU</STRONG> <STRONG>*</STRONG><EM>menu</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>pattern</EM><STRONG>);</STRONG>
+       <STRONG>char</STRONG> <STRONG>*menu_pattern(const</STRONG> <STRONG>MENU</STRONG> <STRONG>*</STRONG><EM>menu</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       Every  menu  has  an  associated pattern match buffer.  As input events
+       that are printable characters come in, they are appended to this  match
+       buffer and tested for a match, as described in <STRONG><A HREF="menu_driver.3x.html">menu_driver(3x)</A></STRONG>.
+
+       The  function  <STRONG>set_menu_pattern</STRONG>  sets  the pattern buffer for the given
+       menu and tries to find the first matching item.  If it  succeeds,  that
+       item becomes current; if not, the current item does not change.
+
+       The function <STRONG>menu_pattern</STRONG> returns the pattern buffer of the given <EM>menu</EM>.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       The  function <STRONG>menu_pattern</STRONG> returns a pointer, which is <STRONG>NULL</STRONG> if the <EM>menu</EM>
+       parameter is <STRONG>NULL</STRONG>.  Otherwise, it is a pointer to  a  string  which  is
+       empty if no pattern has been set.  It does not set <STRONG>errno</STRONG>.
+
+       The function <STRONG>set_menu_pattern</STRONG> may return the following error codes:
+
+       <STRONG>E_OK</STRONG> The routine succeeded.
+
+       <STRONG>E_BAD_ARGUMENT</STRONG>
+            Routine detected an incorrect or out-of-range argument.
+
+       <STRONG>E_BAD_STATE</STRONG>
+            Routine was called from an initialization or termination function.
+
+       <STRONG>E_NOT_CONNECTED</STRONG>
+            No items are connected to menu.
+
+       <STRONG>E_NO_MATCH</STRONG>
+            Character failed to match.
+
+       <STRONG>E_SYSTEM_ERROR</STRONG>
+            System error occurred (see <STRONG>errno(3)</STRONG>).
+
+
+</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="menu.3x.html">menu(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  header  file  <STRONG>&lt;menu.h&gt;</STRONG>  automatically  includes  the  header  file
+       <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These routines emulate the  System  V  menu  library.   They  were  not
+       supported on Version 7 or BSD versions.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                              <STRONG><A HREF="menu_pattern.3x.html">menu_pattern(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/menu_post.3x.html b/doc/html/man/menu_post.3x.html
new file mode 100644
index 0000000..cc2274b
--- /dev/null
+++ b/doc/html/man/menu_post.3x.html
@@ -0,0 +1,135 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2016,2017 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: menu_post.3x,v 1.22 2022/02/12 20:02:20 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>menu_post 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">menu_post 3x</H1>
+<PRE>
+<STRONG><A HREF="menu_post.3x.html">menu_post(3x)</A></STRONG>                                                    <STRONG><A HREF="menu_post.3x.html">menu_post(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>post_menu</STRONG>,   <STRONG>unpost_menu</STRONG>   -  write  or  erase  menus  from  associated
+       subwindows
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;menu.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>post_menu(MENU</STRONG> <STRONG>*</STRONG><EM>menu</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>unpost_menu(MENU</STRONG> <STRONG>*</STRONG><EM>menu</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The function <STRONG>post_menu</STRONG> displays a menu to its associated subwindow.  To
+       trigger  physical  display  of  the  subwindow, use <STRONG><A HREF="curs_refresh.3x.html">refresh(3x)</A></STRONG> or some
+       equivalent <STRONG>curses</STRONG> routine (the implicit <STRONG>doupdate</STRONG> triggered by an <STRONG>curses</STRONG>
+       input  request  will do).  <STRONG>post_menu</STRONG> resets the selection status of all
+       items.
+
+       The function <STRONG>unpost_menu</STRONG> erases menu from its associated subwindow.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       These routines return one of the following:
+
+       <STRONG>E_OK</STRONG> The routine succeeded.
+
+       <STRONG>E_SYSTEM_ERROR</STRONG>
+            System error occurred (see <STRONG>errno(3)</STRONG>).
+
+       <STRONG>E_BAD_ARGUMENT</STRONG>
+            Routine detected an incorrect or out-of-range argument.
+
+       <STRONG>E_POSTED</STRONG>
+            The menu has already been posted.
+
+       <STRONG>E_BAD_STATE</STRONG>
+            Routine was called from an initialization or termination function.
+
+       <STRONG>E_NO_ROOM</STRONG>
+            Menu is too large for  its  window.   You  should  consider  using
+            <STRONG>set_menu_format</STRONG> to solve the problem.
+
+       <STRONG>E_NOT_POSTED</STRONG>
+            The menu has not been posted.
+
+       <STRONG>E_NOT_CONNECTED</STRONG>
+            No items are connected to the menu.
+
+
+</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="menu.3x.html">menu(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  header  file  <STRONG>&lt;menu.h&gt;</STRONG>  automatically  includes  the  header  file
+       <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These routines emulate the  System  V  menu  library.   They  were  not
+       supported on Version 7 or BSD versions.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                                 <STRONG><A HREF="menu_post.3x.html">menu_post(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/menu_requestname.3x.html b/doc/html/man/menu_requestname.3x.html
new file mode 100644
index 0000000..ab12977
--- /dev/null
+++ b/doc/html/man/menu_requestname.3x.html
@@ -0,0 +1,113 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2015 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: menu_requestname.3x,v 1.18 2022/02/12 20:02:20 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>menu_requestname 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">menu_requestname 3x</H1>
+<PRE>
+<STRONG><A HREF="menu_requestname.3x.html">menu_requestname(3x)</A></STRONG>                                      <STRONG><A HREF="menu_requestname.3x.html">menu_requestname(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>menu_request_by_name</STRONG>, <STRONG>menu_request_name</STRONG> - handle printable menu request
+       names
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;menu.h&gt;</STRONG>
+
+       <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*menu_request_name(int</STRONG> <EM>request</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>menu_request_by_name(const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>name</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The function <STRONG>menu_request_name</STRONG> returns the printable  name  of  a  menu
+       request code.
+       The  function  <STRONG>menu_request_by_name</STRONG>  searches  in  the name-table for a
+       request with the given name and returns its  request  code.   Otherwise
+       E_NO_MATCH is returned.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       <STRONG>menu_request_name</STRONG>   returns   <STRONG>NULL</STRONG>   on   error   and   sets  <STRONG>errno</STRONG>  to
+       <STRONG>E_BAD_ARGUMENT</STRONG>.
+       <STRONG>menu_request_by_name</STRONG> returns <STRONG>E_NO_MATCH</STRONG> on  error.   It  does  not  set
+       <STRONG>errno</STRONG>.
+
+
+</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="menu.3x.html">menu(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  header  file  <STRONG>&lt;menu.h&gt;</STRONG>  automatically  includes  the  header  file
+       <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These routines are specific to ncurses.  They  were  not  supported  on
+       Version 7, BSD or System V implementations.  It is recommended that any
+       code depending on them be conditioned using NCURSES_VERSION.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                          <STRONG><A HREF="menu_requestname.3x.html">menu_requestname(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/menu_spacing.3x.html b/doc/html/man/menu_spacing.3x.html
new file mode 100644
index 0000000..45bbabd
--- /dev/null
+++ b/doc/html/man/menu_spacing.3x.html
@@ -0,0 +1,127 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2015 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: menu_spacing.3x,v 1.20 2022/02/12 20:02:20 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>menu_spacing 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">menu_spacing 3x</H1>
+<PRE>
+<STRONG><A HREF="menu_spacing.3x.html">menu_spacing(3x)</A></STRONG>                                              <STRONG><A HREF="menu_spacing.3x.html">menu_spacing(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>set_menu_spacing</STRONG>,  <STRONG>menu_spacing</STRONG>  -  set  and  get  spacing between menu
+       items.
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;menu.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>set_menu_spacing(MENU</STRONG> <STRONG>*</STRONG><EM>menu</EM><STRONG>,</STRONG>
+                            <STRONG>int</STRONG> <EM>spc</EM><STRONG>_</STRONG><EM>description</EM><STRONG>,</STRONG>
+                            <STRONG>int</STRONG> <EM>spc</EM><STRONG>_</STRONG><EM>rows</EM><STRONG>,</STRONG>
+                            <STRONG>int</STRONG> <EM>spc</EM><STRONG>_</STRONG><EM>columns</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>menu_spacing(const</STRONG> <STRONG>MENU</STRONG> <STRONG>*</STRONG><EM>menu</EM><STRONG>,</STRONG>
+                        <STRONG>int*</STRONG> <EM>spc</EM><STRONG>_</STRONG><EM>description</EM><STRONG>,</STRONG>
+                        <STRONG>int*</STRONG> <EM>spc</EM><STRONG>_</STRONG><EM>rows</EM><STRONG>,</STRONG>
+                        <STRONG>int*</STRONG> <EM>spc</EM><STRONG>_</STRONG><EM>columns</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The function <STRONG>set_menu_spacing</STRONG> sets  the  spacing  information  for  the
+       menu.   Its  parameter  <STRONG>spc_description</STRONG>  controls  the number of spaces
+       between an item name and an item description.  It must  not  be  larger
+       than  <STRONG>TABSIZE</STRONG>.  The menu system puts in the middle of this spacing area
+       the pad character.  The remaining parts are filled  with  spaces.   The
+       <STRONG>spc_rows</STRONG>  parameter  controls  the  number of rows that are used for an
+       item.  It must not be larger than 3.  The menu system inserts the blank
+       lines  between item rows, these lines will contain the pad character in
+       the appropriate positions.   The  <STRONG>spc_columns</STRONG>  parameter  controls  the
+       number  of blanks between columns of items.  It must not be larger than
+       <STRONG>TABSIZE</STRONG>.  A value of 0 for all the spacing values resets  them  to  the
+       default, which is 1 for all of them.
+       The  function  <STRONG>menu_spacing</STRONG>  passes back the spacing info for the menu.
+       If a pointer is NULL, this specific info is simply not returned.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       Both routines return <STRONG>E_OK</STRONG>  on  success.   <STRONG>set_menu_spacing</STRONG>  may  return
+       <STRONG>E_POSTED</STRONG> if the menu is posted, or <STRONG>E_BAD_ARGUMENT</STRONG> if one of the spacing
+       values is out of range.
+
+
+</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>, <STRONG><A HREF="menu.3x.html">menu(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  header  file  <STRONG>&lt;menu.h&gt;</STRONG>  automatically  includes  the  header  file
+       <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These  routines  are  specific  to ncurses.  They were not supported on
+       Version 7, BSD or System V implementations.  It is recommended that any
+       code depending on them be conditioned using NCURSES_VERSION.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                              <STRONG><A HREF="menu_spacing.3x.html">menu_spacing(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/menu_userptr.3x.html b/doc/html/man/menu_userptr.3x.html
new file mode 100644
index 0000000..cc6873c
--- /dev/null
+++ b/doc/html/man/menu_userptr.3x.html
@@ -0,0 +1,113 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2015 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: menu_userptr.3x,v 1.19 2022/02/12 20:02:20 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>menu_userptr 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">menu_userptr 3x</H1>
+<PRE>
+<STRONG><A HREF="menu_userptr.3x.html">menu_userptr(3x)</A></STRONG>                                              <STRONG><A HREF="menu_userptr.3x.html">menu_userptr(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>set_menu_userptr</STRONG>, <STRONG>menu_userptr</STRONG> - associate application data with a menu
+       item
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;menu.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>set_menu_userptr(MENU</STRONG> <STRONG>*</STRONG><EM>menu</EM><STRONG>,</STRONG> <STRONG>void</STRONG> <STRONG>*</STRONG><EM>userptr</EM><STRONG>);</STRONG>
+       <STRONG>void</STRONG> <STRONG>*menu_userptr(const</STRONG> <STRONG>MENU</STRONG> <STRONG>*</STRONG><EM>menu</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       Every menu and every menu item has a field that can  be  used  to  hold
+       application-specific  data  (that  is,  the  menu-driver code leaves it
+       alone).  These functions get and set the menu user pointer field.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       <STRONG>menu_userptr</STRONG> returns a pointer (which may be <STRONG>NULL</STRONG>).  It  does  not  set
+       <STRONG>errno</STRONG>.
+
+       <STRONG>set_menu_userptr</STRONG> returns <STRONG>E_OK</STRONG> (success).
+
+
+</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="menu.3x.html">menu(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  header  file  <STRONG>&lt;menu.h&gt;</STRONG>  automatically  includes  the  header  file
+       <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These routines emulate the  System  V  menu  library.   They  were  not
+       supported on Version 7 or BSD versions.
+
+       The user pointer is a void pointer.  We chose not to leave it as a char
+       pointer for SVr4 compatibility.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                              <STRONG><A HREF="menu_userptr.3x.html">menu_userptr(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/menu_win.3x.html b/doc/html/man/menu_win.3x.html
new file mode 100644
index 0000000..12849d7
--- /dev/null
+++ b/doc/html/man/menu_win.3x.html
@@ -0,0 +1,138 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2006,2010 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: menu_win.3x,v 1.18 2022/02/12 20:02:20 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>menu_win 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">menu_win 3x</H1>
+<PRE>
+<STRONG><A HREF="menu_win.3x.html">menu_win(3x)</A></STRONG>                                                      <STRONG><A HREF="menu_win.3x.html">menu_win(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>menu_win</STRONG> - make and break menu window and subwindow associations
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;menu.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>set_menu_win(MENU</STRONG> <STRONG>*</STRONG><EM>menu</EM><STRONG>,</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+       <STRONG>WINDOW</STRONG> <STRONG>*menu_win(const</STRONG> <STRONG>MENU</STRONG> <STRONG>*</STRONG><EM>menu</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>set_menu_sub(MENU</STRONG> <STRONG>*</STRONG><EM>menu</EM><STRONG>,</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>sub</EM><STRONG>);</STRONG>
+       <STRONG>WINDOW</STRONG> <STRONG>*menu_sub(const</STRONG> <STRONG>MENU</STRONG> <STRONG>*</STRONG><EM>menu</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>scale_menu(const</STRONG> <STRONG>MENU</STRONG> <STRONG>*</STRONG><EM>menu,</EM> <EM>int</EM> <EM>*rows</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <STRONG>*</STRONG><EM>columns);</EM>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       Every  menu  has an associated pair of <STRONG>curses</STRONG> windows.  The menu window
+       displays any title and border associated  with  the  window;  the  menu
+       subwindow  displays  the items of the menu that are currently available
+       for selection.
+
+       The first four  functions  get  and  set  those  windows.   It  is  not
+       necessary to set either window; by default, the driver code uses <STRONG>stdscr</STRONG>
+       for both.
+
+       In the <STRONG>set_</STRONG> functions, window argument of <STRONG>NULL</STRONG> is treated as though  it
+       were <STRONG>stsdcr</STRONG>.  A menu argument of <STRONG>NULL</STRONG> is treated as a request to change
+       the system default menu window or subwindow.
+
+       The function <STRONG>scale_menu</STRONG> returns  the  minimum  size  required  for  the
+       subwindow of <EM>menu</EM>.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       Routines  that  return  pointers  return  <STRONG>NULL</STRONG> on error.  Routines that
+       return an integer return one of the following error codes:
+
+       <STRONG>E_OK</STRONG> The routine succeeded.
+
+       <STRONG>E_SYSTEM_ERROR</STRONG>
+            System error occurred (see <STRONG>errno(3)</STRONG>).
+
+       <STRONG>E_BAD_ARGUMENT</STRONG>
+            Routine detected an incorrect or out-of-range argument.
+
+       <STRONG>E_POSTED</STRONG>
+            The menu has already been posted.
+
+       <STRONG>E_NOT_CONNECTED</STRONG>
+            No items are connected to the menu.
+
+
+</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>, <STRONG><A HREF="menu.3x.html">menu(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  header  file  <STRONG>&lt;menu.h&gt;</STRONG>  automatically  includes  the  header  file
+       <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These  routines  emulate  the  System  V  menu  library.  They were not
+       supported on Version 7 or BSD versions.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                                  <STRONG><A HREF="menu_win.3x.html">menu_win(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/mitem_current.3x.html b/doc/html/man/mitem_current.3x.html
new file mode 100644
index 0000000..1e43842
--- /dev/null
+++ b/doc/html/man/mitem_current.3x.html
@@ -0,0 +1,143 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2006,2010 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: mitem_current.3x,v 1.23 2022/02/12 20:02:20 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>mitem_current 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">mitem_current 3x</H1>
+<PRE>
+<STRONG><A HREF="mitem_current.3x.html">mitem_current(3x)</A></STRONG>                                            <STRONG><A HREF="mitem_current.3x.html">mitem_current(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>mitem_current</STRONG> - set and get current_menu_item
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;menu.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>set_current_item(MENU</STRONG> <STRONG>*</STRONG><EM>menu</EM><STRONG>,</STRONG> <STRONG>ITEM</STRONG> <STRONG>*</STRONG><EM>item</EM><STRONG>);</STRONG>
+       <STRONG>ITEM</STRONG> <STRONG>*current_item(const</STRONG> <STRONG>MENU</STRONG> <STRONG>*</STRONG><EM>menu</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>set_top_row(MENU</STRONG> <STRONG>*</STRONG><EM>menu</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>row</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>top_row(const</STRONG> <STRONG>MENU</STRONG> <STRONG>*</STRONG><EM>menu</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>item_index(const</STRONG> <STRONG>ITEM</STRONG> <STRONG>*</STRONG><EM>item</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The  function <STRONG>set_current_item</STRONG> sets the current item (the item on which
+       the menu cursor is positioned).  <STRONG>current_item</STRONG> returns a pointer to  the
+       current item in the given menu.
+
+       The function <STRONG>set_top_row</STRONG> sets the top row of the menu to show the given
+       row (the top row is initially 0, and is reset to  this  value  whenever
+       the  <STRONG>O_ROWMAJOR</STRONG> option is toggled).  The item leftmost on the given row
+       becomes current.  The function <STRONG>top_row</STRONG> returns the number  of  the  top
+       menu row being displayed.
+
+       The  function <STRONG>item_index</STRONG> returns the (zero-origin) index of <EM>item</EM> in the
+       menu's item pointer list.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       <STRONG>current_item</STRONG> returns a pointer (which may be <STRONG>NULL</STRONG>).  It  does  not  set
+       <STRONG>errno</STRONG>.
+
+       <STRONG>top_row</STRONG>  and  <STRONG>item_index</STRONG> return <STRONG>ERR</STRONG> (the general <STRONG>curses</STRONG> error value) if
+       their <EM>menu</EM> parameter is <STRONG>NULL</STRONG>.
+
+       <STRONG>set_current_item</STRONG> and <STRONG>set_top_row</STRONG> return one of the following:
+
+       <STRONG>E_OK</STRONG> The routine succeeded.
+
+       <STRONG>E_BAD_ARGUMENT</STRONG>
+            Routine detected an incorrect or out-of-range argument.
+
+       <STRONG>E_BAD_STATE</STRONG>
+            Routine was called from an initialization or termination function.
+
+       <STRONG>E_NOT_CONNECTED</STRONG>
+            No items are connected to the menu.
+
+       <STRONG>E_SYSTEM_ERROR</STRONG>
+            System error occurred (see <STRONG>errno(3)</STRONG>).
+
+
+</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="menu.3x.html">menu(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  header  file  <STRONG>&lt;menu.h&gt;</STRONG>  automatically  includes  the  header  file
+       <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These  routines  emulate  the  System  V  menu  library.  They were not
+       supported on Version 7 or BSD versions.
+
+       The  SVr4  menu  library  documentation  specifies  the   <STRONG>top_row</STRONG>   and
+       <STRONG>index_item</STRONG> error value as -1 (which is the value of <STRONG>ERR</STRONG>).
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                             <STRONG><A HREF="mitem_current.3x.html">mitem_current(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/mitem_name.3x.html b/doc/html/man/mitem_name.3x.html
new file mode 100644
index 0000000..af84f55
--- /dev/null
+++ b/doc/html/man/mitem_name.3x.html
@@ -0,0 +1,107 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2015 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: mitem_name.3x,v 1.17 2022/02/12 20:02:20 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>mitem_name 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">mitem_name 3x</H1>
+<PRE>
+<STRONG><A HREF="mitem_name.3x.html">mitem_name(3x)</A></STRONG>                                                  <STRONG><A HREF="mitem_name.3x.html">mitem_name(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>item_name</STRONG>, <STRONG>item_description</STRONG> - get menu item name and description fields
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;menu.h&gt;</STRONG>
+
+       <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*item_name(const</STRONG> <STRONG>ITEM</STRONG> <STRONG>*</STRONG><EM>item</EM><STRONG>);</STRONG>
+       <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*item_description(const</STRONG> <STRONG>ITEM</STRONG> <STRONG>*</STRONG><EM>item</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The function <STRONG>item_name</STRONG> returns the name part of the given item.
+       The function <STRONG>item_description</STRONG> returns the description part of the given
+       item.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       These routines return a pointer (which may be <STRONG>NULL</STRONG>).  They do  not  set
+       <STRONG>errno</STRONG>.
+
+
+</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="menu.3x.html">menu(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  header  file  <STRONG>&lt;menu.h&gt;</STRONG>  automatically  includes  the  header  file
+       <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These routines emulate the  System  V  menu  library.   They  were  not
+       supported on Version 7 or BSD versions.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                                <STRONG><A HREF="mitem_name.3x.html">mitem_name(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/mitem_new.3x.html b/doc/html/man/mitem_new.3x.html
new file mode 100644
index 0000000..2e1dcde
--- /dev/null
+++ b/doc/html/man/mitem_new.3x.html
@@ -0,0 +1,131 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2015 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: mitem_new.3x,v 1.22 2022/02/12 20:02:20 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>mitem_new 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">mitem_new 3x</H1>
+<PRE>
+<STRONG><A HREF="mitem_new.3x.html">mitem_new(3x)</A></STRONG>                                                    <STRONG><A HREF="mitem_new.3x.html">mitem_new(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>new_item</STRONG>, <STRONG>free_item</STRONG> - create and destroy menu items
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;menu.h&gt;</STRONG>
+
+       <STRONG>ITEM</STRONG> <STRONG>*new_item(const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>name</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>description</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>free_item(ITEM</STRONG> <STRONG>*</STRONG><EM>item</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The  function <STRONG>new_item</STRONG> allocates a new item and initializes it from the
+       <STRONG>name</STRONG> and <STRONG>description</STRONG> pointers.  Please notice that the item stores only
+       the pointers to the name and description.  Those pointers must be valid
+       during the lifetime of the item.  So you should be  very  careful  with
+       names or descriptions allocated on the stack of some routines.
+       The  function <STRONG>free_item</STRONG> de-allocates an item.  Please notice that it is
+       the responsibility of the application to release  the  memory  for  the
+       name or the description of the item.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       The  function  <STRONG>new_item</STRONG> returns <STRONG>NULL</STRONG> on error.  It sets <STRONG>errno</STRONG> according
+       to the function's failure:
+
+       <STRONG>E_BAD_ARGUMENT</STRONG>
+            Routine detected an incorrect or out-of-range argument.
+
+       <STRONG>E_SYSTEM_ERROR</STRONG>
+            System error occurred, e.g., malloc failure.
+
+       The function <STRONG>free_item</STRONG> returns one of the following:
+
+       <STRONG>E_OK</STRONG> The routine succeeded.
+
+       <STRONG>E_BAD_ARGUMENT</STRONG>
+            Routine detected an incorrect or out-of-range argument.
+
+       <STRONG>E_CONNECTED</STRONG>
+            Item is connected to a menu.
+
+       <STRONG>E_SYSTEM_ERROR</STRONG>
+            System error occurred (see <STRONG>errno(3)</STRONG>).
+
+
+</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="menu.3x.html">menu(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  header  file  <STRONG>&lt;menu.h&gt;</STRONG>  automatically  includes  the  header  file
+       <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These  routines  emulate  the  System  V  menu  library.  They were not
+       supported on Version 7 or BSD versions.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                                 <STRONG><A HREF="mitem_new.3x.html">mitem_new(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/mitem_opts.3x.html b/doc/html/man/mitem_opts.3x.html
new file mode 100644
index 0000000..0cd0ec6
--- /dev/null
+++ b/doc/html/man/mitem_opts.3x.html
@@ -0,0 +1,126 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2015 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: mitem_opts.3x,v 1.19 2022/02/12 20:02:20 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>mitem_opts 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">mitem_opts 3x</H1>
+<PRE>
+<STRONG><A HREF="mitem_opts.3x.html">mitem_opts(3x)</A></STRONG>                                                  <STRONG><A HREF="mitem_opts.3x.html">mitem_opts(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>set_item_opts</STRONG>,  <STRONG>item_opts_on</STRONG>,  <STRONG>item_opts_off</STRONG>,  <STRONG>item_opts</STRONG>  - set and get
+       menu item options
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;menu.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>set_item_opts(ITEM</STRONG> <STRONG>*</STRONG><EM>item</EM><STRONG>,</STRONG> <STRONG>Item_Options</STRONG> <EM>opts</EM><STRONG>);</STRONG>
+       <STRONG>Item_Options</STRONG> <STRONG>item_opts(const</STRONG> <STRONG>ITEM</STRONG> <STRONG>*</STRONG><EM>item</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>item_opts_on(ITEM</STRONG> <STRONG>*</STRONG><EM>item</EM><STRONG>,</STRONG> <STRONG>Item_Options</STRONG> <EM>opts</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>item_opts_off(ITEM</STRONG> <STRONG>*</STRONG><EM>item</EM><STRONG>,</STRONG> <STRONG>Item_Options</STRONG> <EM>opts</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The function <STRONG>set_item_opts</STRONG> sets all the given item's option bits  (menu
+       option bits may be logically-OR'ed together).
+
+       The  function  <STRONG>item_opts_on</STRONG>  turns on the given option bits, and leaves
+       others alone.
+
+       The function <STRONG>item_opts_off</STRONG> turns off the given option bits, and  leaves
+       others alone.
+
+       The function <STRONG>item_opts</STRONG> returns the item's current option bits.
+
+       There  is only one defined option bit mask, <STRONG>O_SELECTABLE</STRONG>.  When this is
+       on, the item may be  selected  during  menu  processing.   This  option
+       defaults to on.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       Except for <STRONG>item_opts</STRONG>, each routine returns one of the following:
+
+       <STRONG>E_OK</STRONG> The routine succeeded.
+
+       <STRONG>E_SYSTEM_ERROR</STRONG>
+            System error occurred (see <STRONG>errno(3)</STRONG>).
+
+
+</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="menu.3x.html">menu(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  header  file  <STRONG>&lt;menu.h&gt;</STRONG>  automatically  includes  the  header  file
+       <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These routines emulate the  System  V  menu  library.   They  were  not
+       supported on Version 7 or BSD versions.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                                <STRONG><A HREF="mitem_opts.3x.html">mitem_opts(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/mitem_userptr.3x.html b/doc/html/man/mitem_userptr.3x.html
new file mode 100644
index 0000000..ee8a3b8
--- /dev/null
+++ b/doc/html/man/mitem_userptr.3x.html
@@ -0,0 +1,113 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2015 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: mitem_userptr.3x,v 1.20 2022/02/12 20:02:20 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>mitem_userptr 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">mitem_userptr 3x</H1>
+<PRE>
+<STRONG><A HREF="mitem_userptr.3x.html">mitem_userptr(3x)</A></STRONG>                                            <STRONG><A HREF="mitem_userptr.3x.html">mitem_userptr(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>set_item_userptr</STRONG>, <STRONG>item_userptr</STRONG> - associate application data with a menu
+       item
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;menu.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>set_item_userptr(ITEM</STRONG> <STRONG>*</STRONG><EM>item</EM><STRONG>,</STRONG> <STRONG>void</STRONG> <STRONG>*</STRONG><EM>userptr</EM><STRONG>);</STRONG>
+       <STRONG>void</STRONG> <STRONG>*item_userptr(const</STRONG> <STRONG>ITEM</STRONG> <STRONG>*</STRONG><EM>item</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       Every menu item has a field that  can  be  used  to  hold  application-
+       specific  data  (that is, the menu-driver code leaves it alone).  These
+       functions get and set that field.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       The function <STRONG>item_userptr</STRONG> returns a pointer (possibly <STRONG>NULL</STRONG>).   It  does
+       not set <STRONG>errno</STRONG>.
+
+       The <STRONG>set_item_userptr</STRONG> always returns <STRONG>E_OK</STRONG> (success).
+
+
+</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="menu.3x.html">menu(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  header  file  <STRONG>&lt;menu.h&gt;</STRONG>  automatically  includes  the  header  file
+       <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These routines emulate the  System  V  menu  library.   They  were  not
+       supported on Version 7 or BSD versions.
+
+       The user pointer is a void pointer.  We chose not to leave it as a char
+       pointer for SVr4 compatibility.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                             <STRONG><A HREF="mitem_userptr.3x.html">mitem_userptr(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/mitem_value.3x.html b/doc/html/man/mitem_value.3x.html
new file mode 100644
index 0000000..6e1e6ab
--- /dev/null
+++ b/doc/html/man/mitem_value.3x.html
@@ -0,0 +1,117 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2015 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: mitem_value.3x,v 1.18 2022/02/12 20:02:20 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>mitem_value 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">mitem_value 3x</H1>
+<PRE>
+<STRONG><A HREF="mitem_value.3x.html">mitem_value(3x)</A></STRONG>                                                <STRONG><A HREF="mitem_value.3x.html">mitem_value(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>set_item_value</STRONG>, <STRONG>item_value</STRONG> - set and get menu item values
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;menu.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>set_item_value(ITEM</STRONG> <STRONG>*</STRONG><EM>item</EM><STRONG>,</STRONG> <STRONG>bool</STRONG> <EM>value</EM><STRONG>);</STRONG>
+       <STRONG>bool</STRONG> <STRONG>item_value(const</STRONG> <STRONG>ITEM</STRONG> <STRONG>*</STRONG><EM>item</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       If you turn off the menu option <STRONG>O_ONEVALUE</STRONG> (e.g., with <STRONG>set_menu_opts</STRONG> or
+       <STRONG>menu_opts_off</STRONG>; see <STRONG><A HREF="menu_opts.3x.html">menu_opts(3x)</A></STRONG>), the menu becomes multi-valued;  that
+       is, more than one item may simultaneously be selected.
+
+       In a multi_valued menu, you can used <STRONG>set_item_value</STRONG> to select the given
+       menu item (second  argument  <STRONG>TRUE</STRONG>)  or  deselect  it  (second  argument
+       <STRONG>FALSE</STRONG>).
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       The function <STRONG>set_item_value</STRONG> returns one of the following:
+
+       <STRONG>E_OK</STRONG> The routine succeeded.
+
+       <STRONG>E_SYSTEM_ERROR</STRONG>
+            System error occurred (see <STRONG>errno(3)</STRONG>).
+
+       <STRONG>E_REQUEST_DENIED</STRONG>
+            The menu driver could not process the request.
+
+
+</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="menu.3x.html">menu(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  header  file  <STRONG>&lt;menu.h&gt;</STRONG>  automatically  includes  the  header  file
+       <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These routines emulate the  System  V  menu  library.   They  were  not
+       supported on Version 7 or BSD versions.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                               <STRONG><A HREF="mitem_value.3x.html">mitem_value(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/mitem_visible.3x.html b/doc/html/man/mitem_visible.3x.html
new file mode 100644
index 0000000..9c8efbe
--- /dev/null
+++ b/doc/html/man/mitem_visible.3x.html
@@ -0,0 +1,100 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998,2010 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: mitem_visible.3x,v 1.13 2022/02/12 20:03:40 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>mitem_visible 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">mitem_visible 3x</H1>
+<PRE>
+<STRONG><A HREF="mitem_visible.3x.html">mitem_visible(3x)</A></STRONG>                                            <STRONG><A HREF="mitem_visible.3x.html">mitem_visible(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>mitem_visible</STRONG> - check visibility of a menu item
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;menu.h&gt;</STRONG>
+
+       <STRONG>bool</STRONG> <STRONG>item_visible(const</STRONG> <STRONG>ITEM</STRONG> <STRONG>*</STRONG><EM>item</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       A  menu item is visible when it is in the portion of a posted menu that
+       is mapped onto the screen (if the menu is  scrollable,  in  particular,
+       this portion will be smaller than the whole menu).
+
+
+</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="menu.3x.html">menu(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  header  file  <STRONG>&lt;menu.h&gt;</STRONG>  automatically  includes  the  header  file
+       <STRONG>&lt;curses.h&gt;</STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These routines emulate the  System  V  menu  library.   They  were  not
+       supported on Version 7 or BSD versions.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+
+                                                             <STRONG><A HREF="mitem_visible.3x.html">mitem_visible(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></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/ncurses.3x.html b/doc/html/man/ncurses.3x.html
new file mode 100644
index 0000000..ab2b69d
--- /dev/null
+++ b/doc/html/man/ncurses.3x.html
@@ -0,0 +1,1537 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2020,2021 Thomas E. Dickey                                *
+  * Copyright 1998-2015,2017 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: ncurses.3x,v 1.156 2021/12/25 21:19:26 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>ncurses 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">ncurses 3x</H1>
+<PRE>
+<STRONG><A HREF="ncurses.3x.html">ncurses(3x)</A></STRONG>                                                        <STRONG><A HREF="ncurses.3x.html">ncurses(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>ncurses</STRONG> - CRT screen handling and optimization package
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The  <STRONG>ncurses</STRONG>  library  routines  give  the  user a terminal-independent
+       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 20221231).
+
+       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
+       curses).   XSI  stands  for  X/Open  System  Interfaces Extension.  The
+       <STRONG>ncurses</STRONG> library is freely redistributable in source form.   Differences
+       from   the   SVr4  curses  are  summarized  under  the  <EM>EXTENSIONS</EM>  and
+       <EM>PORTABILITY</EM> sections below and described in detail  in  the  respective
+       <EM>EXTENSIONS</EM>, <EM>PORTABILITY</EM> and <EM>BUGS</EM> sections of individual man pages.
+
+       The  <STRONG>ncurses</STRONG>  library  also  provides  many  useful  extensions,  i.e.,
+       features which cannot be implemented by a  simple  add-on  library  but
+       which require access to the internals of the library.
+
+       A  program  using  these  routines  must  be  linked with the <STRONG>-lncurses</STRONG>
+       option, or (if it  has  been  generated)  with  the  debugging  library
+       <STRONG>-lncurses_g</STRONG>.   (Your  system  integrator  may also have installed these
+       libraries under the names  <STRONG>-lcurses</STRONG>  and  <STRONG>-lcurses_g</STRONG>.)   The  ncurses_g
+       library  generates  trace logs (in a file called "trace" in the current
+       directory) that describe curses  actions.   See  also  the  section  on
+       <STRONG>ALTERNATE</STRONG> <STRONG>CONFIGURATIONS</STRONG>.
+
+       The   <STRONG>ncurses</STRONG>   package   supports:  overall  screen,  window  and  pad
+       manipulation; output to  windows  and  pads;  reading  terminal  input;
+       control  over terminal and <STRONG>curses</STRONG> input and output options; environment
+       query routines; color manipulation; use of soft  label  keys;  terminfo
+       capabilities; and access to low-level terminal-manipulation routines.
+
+
+</PRE><H3><a name="h3-Initialization">Initialization</a></H3><PRE>
+       The  library uses the locale which the calling program has initialized.
+       That is normally done with <STRONG>setlocale(3)</STRONG>:
+
+           <STRONG>setlocale(LC_ALL,</STRONG> <STRONG>"");</STRONG>
+
+       If the locale is not initialized, the library assumes  that  characters
+       are  printable  as in ISO-8859-1, to work with certain legacy programs.
+       You should initialize the locale and not rely on  specific  details  of
+       the library when the locale has not been setup.
+
+       The  function  <STRONG>initscr</STRONG>  or  <STRONG>newterm</STRONG>  must  be  called to initialize the
+       library before any of the other routines that  deal  with  windows  and
+       screens  are  used.   The  routine  <STRONG><A HREF="curs_initscr.3x.html">endwin(3x)</A></STRONG>  must  be  called before
+       exiting.
+
+       To get character-at-a-time input  without  echoing  (most  interactive,
+       screen  oriented  programs want this), the following sequence should be
+       used:
+
+           <STRONG>initscr();</STRONG> <STRONG>cbreak();</STRONG> <STRONG>noecho();</STRONG>
+
+       Most programs would additionally use the sequence:
+
+           <STRONG>intrflush(stdscr,</STRONG> <STRONG>FALSE);</STRONG>
+           <STRONG>keypad(stdscr,</STRONG> <STRONG>TRUE);</STRONG>
+
+       Before a <STRONG>curses</STRONG> program is run, the tab stops of the terminal should be
+       set  and  its initialization strings, if defined, must be output.  This
+       can be done  by  executing  the  <STRONG>tput</STRONG>  <STRONG>init</STRONG>  command  after  the  shell
+       environment  variable  <STRONG>TERM</STRONG>  has  been  exported.   <STRONG>tset(1)</STRONG>  is usually
+       responsible for doing this.  [See <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG> for further details.]
+
+
+</PRE><H3><a name="h3-Datatypes">Datatypes</a></H3><PRE>
+       The <STRONG>ncurses</STRONG> library permits manipulation  of  data  structures,  called
+       <EM>windows</EM>,   which  can  be  thought  of  as  two-dimensional  arrays  of
+       characters representing all or part of a CRT screen.  A default  window
+       called  <STRONG>stdscr</STRONG>,  which is the size of the terminal screen, is supplied.
+       Others may be created with <STRONG>newwin</STRONG>.
+
+       Note that <STRONG>curses</STRONG> does not handle overlapping windows,  that's  done  by
+       the  <STRONG><A HREF="panel.3x.html">panel(3x)</A></STRONG>  library.   This means that you can either use <STRONG>stdscr</STRONG> or
+       divide the screen into tiled windows  and  not  using  <STRONG>stdscr</STRONG>  at  all.
+       Mixing the two will result in unpredictable, and undesired, effects.
+
+       Windows  are referred to by variables declared as <STRONG>WINDOW</STRONG> <STRONG>*</STRONG>.  These data
+       structures are manipulated with routines described here  and  elsewhere
+       in  the <STRONG>ncurses</STRONG> manual pages.  Among those, the most basic routines are
+       <STRONG>move</STRONG> and <STRONG>addch</STRONG>.  More general versions of these routines  are  included
+       with  names  beginning  with  <STRONG>w</STRONG>, allowing the user to specify a window.
+       The routines not beginning with <STRONG>w</STRONG> affect <STRONG>stdscr</STRONG>.
+
+       After using routines to manipulate a  window,  <STRONG><A HREF="curs_refresh.3x.html">refresh(3x)</A></STRONG>  is  called,
+       telling  <STRONG>curses</STRONG>  to  make  the user's CRT screen look like <STRONG>stdscr</STRONG>.  The
+       characters in a window are actually  of  type  <STRONG>chtype</STRONG>,  (character  and
+       attribute  data) so that other information about the character may also
+       be stored with each character.
+
+       Special windows called <EM>pads</EM> may also be manipulated.  These are windows
+       which  are not constrained to the size of the screen and whose contents
+       need  not  be  completely  displayed.   See   <STRONG><A HREF="curs_pad.3x.html">curs_pad(3x)</A></STRONG>   for   more
+       information.
+
+       In  addition  to drawing characters on the screen, video attributes and
+       colors may be supported, causing the characters  to  show  up  in  such
+       modes  as  underlined,  in reverse video, or in color on terminals that
+       support such display enhancements.   Line  drawing  characters  may  be
+       specified  to  be  output.   On input, <STRONG>curses</STRONG> is also able to translate
+       arrow and function keys that  transmit  escape  sequences  into  single
+       values.   The  video  attributes,  line  drawing  characters, and input
+       values use names, defined in <STRONG>&lt;curses.h&gt;</STRONG>, such as <STRONG>A_REVERSE</STRONG>,  <STRONG>ACS_HLINE</STRONG>,
+       and <STRONG>KEY_LEFT</STRONG>.
+
+
+</PRE><H3><a name="h3-Environment-variables">Environment variables</a></H3><PRE>
+       If  the  environment  variables  <STRONG>LINES</STRONG>  and  <STRONG>COLUMNS</STRONG> are set, or if the
+       program  is  executing  in  a  window  environment,  line  and   column
+       information  in  the  environment  will  override  information  read by
+       <EM>terminfo</EM>.  This would affect a program running in an  AT&amp;T  630  layer,
+       for   example,   where   the  size  of  a  screen  is  changeable  (see
+       <STRONG>ENVIRONMENT</STRONG>).
+
+       If the environment variable <STRONG>TERMINFO</STRONG>  is  defined,  any  program  using
+       <STRONG>curses</STRONG>  checks  for  a local terminal definition before checking in the
+       standard place.  For example, if <STRONG>TERM</STRONG>  is  set  to  <STRONG>att4424</STRONG>,  then  the
+       compiled terminal definition is found in
+
+           <STRONG>/usr/share/terminfo/a/att4424</STRONG>.
+
+       (The  <STRONG>a</STRONG> is copied from the first letter of <STRONG>att4424</STRONG> to avoid creation of
+       huge directories.)  However,  if  <STRONG>TERMINFO</STRONG>  is  set  to  <STRONG>$HOME/myterms</STRONG>,
+       <STRONG>curses</STRONG> first checks
+
+           <STRONG>$HOME/myterms/a/att4424</STRONG>,
+
+       and if that fails, it then checks
+
+           <STRONG>/usr/share/terminfo/a/att4424</STRONG>.
+
+       This  is  useful  for developing experimental definitions or when write
+       permission in <STRONG>/usr/share/terminfo</STRONG> is not available.
+
+       The integer variables <STRONG>LINES</STRONG> and <STRONG>COLS</STRONG> are defined in <STRONG>&lt;curses.h&gt;</STRONG> and will
+       be  filled  in  by  <STRONG>initscr</STRONG> with the size of the screen.  The constants
+       <STRONG>TRUE</STRONG> and <STRONG>FALSE</STRONG> have the values <STRONG>1</STRONG> and <STRONG>0</STRONG>, respectively.
+
+       The <STRONG>curses</STRONG> routines also define the <STRONG>WINDOW</STRONG> <STRONG>*</STRONG> variable <STRONG>curscr</STRONG>  which  is
+       used  for  certain  low-level  operations like clearing and redrawing a
+       screen containing garbage.  The <STRONG>curscr</STRONG>  can  be  used  in  only  a  few
+       routines.
+
+
+</PRE><H3><a name="h3-Routine-and-Argument-Names">Routine and Argument Names</a></H3><PRE>
+       Many  <STRONG>curses</STRONG> routines have two or more versions.  The routines prefixed
+       with <EM>w</EM> require a window argument.  The routines prefixed with <EM>p</EM> require
+       a pad argument.  Those without a prefix generally use <STRONG>stdscr</STRONG>.
+
+       The  routines  prefixed with <STRONG>mv</STRONG> require a <EM>y</EM> and <EM>x</EM> coordinate to move to
+       before performing the appropriate action.  The <STRONG>mv</STRONG> routines imply a call
+       to  <STRONG>move</STRONG> before the call to the other routine.  The coordinate <EM>y</EM> always
+       refers to the row (of the window), and <EM>x</EM> always refers to  the  column.
+       The upper left-hand corner is always (0,0), not (1,1).
+
+       The  routines prefixed with <STRONG>mvw</STRONG> take both a window argument and <EM>x</EM> and <EM>y</EM>
+       coordinates.  The  window  argument  is  always  specified  before  the
+       coordinates.
+
+       In  each case, <EM>win</EM> is the window affected, and <EM>pad</EM> is the pad affected;
+       <EM>win</EM> and <EM>pad</EM> are always pointers to type <STRONG>WINDOW</STRONG>.
+
+       Option setting routines require a Boolean flag <EM>bf</EM> with the  value  <STRONG>TRUE</STRONG>
+       or  <STRONG>FALSE</STRONG>;  <EM>bf</EM>  is always of type <STRONG>bool</STRONG>.  Most of the data types used in
+       the library routines, such as <STRONG>WINDOW</STRONG>,  <STRONG>SCREEN</STRONG>,  <STRONG>bool</STRONG>,  and  <STRONG>chtype</STRONG>  are
+       defined  in  <STRONG>&lt;curses.h&gt;</STRONG>.   Types used for the terminfo routines such as
+       <STRONG>TERMINAL</STRONG> are defined in <STRONG>&lt;term.h&gt;</STRONG>.
+
+       This  manual  page  describes  functions  which  may  appear   in   any
+       configuration  of  the library.  There are two common configurations of
+       the library:
+
+          <EM>ncurses</EM>
+               the "normal" library,  which  handles  8-bit  characters.   The
+               normal   (8-bit)   library   stores  characters  combined  with
+               attributes in <STRONG>chtype</STRONG> data.
+
+               Attributes alone (no corresponding character) may be stored  in
+               <STRONG>chtype</STRONG> or the equivalent <STRONG>attr_t</STRONG> data.  In either case, the data
+               is stored in something like an integer.
+
+               Each cell (row and column) in a <STRONG>WINDOW</STRONG> is stored as a <STRONG>chtype</STRONG>.
+
+          <EM>ncursesw</EM>
+               the  so-called  "wide"   library,   which   handles   multibyte
+               characters  (see the section on <STRONG>ALTERNATE</STRONG> <STRONG>CONFIGURATIONS</STRONG>).  The
+               "wide" library includes all of  the  calls  from  the  "normal"
+               library.   It  adds about one third more calls using data types
+               which store multibyte characters:
+
+               <STRONG>cchar_t</STRONG>
+                    corresponds to <STRONG>chtype</STRONG>.  However it is a structure, because
+                    more  data  is  stored  than can fit into an integer.  The
+                    characters are large enough  to  require  a  full  integer
+                    value - and there may be more than one character per cell.
+                    The video attributes and  color  are  stored  in  separate
+                    fields of the structure.
+
+                    Each  cell  (row  and  column)  in a <STRONG>WINDOW</STRONG> is stored as a
+                    <STRONG>cchar_t</STRONG>.
+
+                    The <STRONG><A HREF="curs_getcchar.3x.html">setcchar(3x)</A></STRONG>  and  <STRONG><A HREF="curs_getcchar.3x.html">getcchar(3x)</A></STRONG>  functions  store  and
+                    retrieve the data from a <STRONG>cchar_t</STRONG> structure.
+
+               <STRONG>wchar_t</STRONG>
+                    stores  a  "wide"  character.  Like <STRONG>chtype</STRONG>, this may be an
+                    integer.
+
+               <STRONG>wint_t</STRONG>
+                    stores a <STRONG>wchar_t</STRONG> or <STRONG>WEOF</STRONG> - not the same, though  both  may
+                    have the same size.
+
+               The  "wide"  library provides new functions which are analogous
+               to functions in  the  "normal"  library.   There  is  a  naming
+               convention  which  relates  many of the normal/wide variants: a
+               "_w" is inserted into the name.  For  example,  <STRONG>waddch</STRONG>  becomes
+               <STRONG>wadd_wch</STRONG>.
+
+
+</PRE><H3><a name="h3-Routine-Name-Index">Routine Name Index</a></H3><PRE>
+       The  following table lists the <STRONG>curses</STRONG> routines provided in the "normal"
+       and "wide" libraries and the names of the manual pages  on  which  they
+       are  described.   Routines  flagged  with "*" are ncurses-specific, not
+       described by XPG4 or present in SVr4.
+
+                    <STRONG>curses</STRONG> Routine Name      Manual Page Name
+                    ---------------------------------------------
+                    COLOR_PAIR               <STRONG><A HREF="curs_color.3x.html">curs_color(3x)</A></STRONG>
+                    PAIR_NUMBER              <STRONG><A HREF="curs_attr.3x.html">curs_attr(3x)</A></STRONG>
+                    add_wch                  <STRONG><A HREF="curs_add_wch.3x.html">curs_add_wch(3x)</A></STRONG>
+                    add_wchnstr              <STRONG><A HREF="curs_add_wchstr.3x.html">curs_add_wchstr(3x)</A></STRONG>
+                    add_wchstr               <STRONG><A HREF="curs_add_wchstr.3x.html">curs_add_wchstr(3x)</A></STRONG>
+                    addch                    <STRONG><A HREF="curs_addch.3x.html">curs_addch(3x)</A></STRONG>
+                    addchnstr                <STRONG><A HREF="curs_addchstr.3x.html">curs_addchstr(3x)</A></STRONG>
+                    addchstr                 <STRONG><A HREF="curs_addchstr.3x.html">curs_addchstr(3x)</A></STRONG>
+                    addnstr                  <STRONG><A HREF="curs_addstr.3x.html">curs_addstr(3x)</A></STRONG>
+                    addnwstr                 <STRONG><A HREF="curs_addwstr.3x.html">curs_addwstr(3x)</A></STRONG>
+                    addstr                   <STRONG><A HREF="curs_addstr.3x.html">curs_addstr(3x)</A></STRONG>
+                    addwstr                  <STRONG><A HREF="curs_addwstr.3x.html">curs_addwstr(3x)</A></STRONG>
+                    alloc_pair               <STRONG><A HREF="new_pair.3x.html">new_pair(3x)</A></STRONG>*
+                    assume_default_colors    <STRONG><A HREF="default_colors.3x.html">default_colors(3x)</A></STRONG>*
+                    attr_get                 <STRONG><A HREF="curs_attr.3x.html">curs_attr(3x)</A></STRONG>
+                    attr_off                 <STRONG><A HREF="curs_attr.3x.html">curs_attr(3x)</A></STRONG>
+                    attr_on                  <STRONG><A HREF="curs_attr.3x.html">curs_attr(3x)</A></STRONG>
+                    attr_set                 <STRONG><A HREF="curs_attr.3x.html">curs_attr(3x)</A></STRONG>
+                    attroff                  <STRONG><A HREF="curs_attr.3x.html">curs_attr(3x)</A></STRONG>
+                    attron                   <STRONG><A HREF="curs_attr.3x.html">curs_attr(3x)</A></STRONG>
+                    attrset                  <STRONG><A HREF="curs_attr.3x.html">curs_attr(3x)</A></STRONG>
+                    baudrate                 <STRONG><A HREF="curs_termattrs.3x.html">curs_termattrs(3x)</A></STRONG>
+                    beep                     <STRONG><A HREF="curs_beep.3x.html">curs_beep(3x)</A></STRONG>
+                    bkgd                     <STRONG><A HREF="curs_bkgd.3x.html">curs_bkgd(3x)</A></STRONG>
+                    bkgdset                  <STRONG><A HREF="curs_bkgd.3x.html">curs_bkgd(3x)</A></STRONG>
+                    bkgrnd                   <STRONG><A HREF="curs_bkgrnd.3x.html">curs_bkgrnd(3x)</A></STRONG>
+                    bkgrndset                <STRONG><A HREF="curs_bkgrnd.3x.html">curs_bkgrnd(3x)</A></STRONG>
+                    border                   <STRONG><A HREF="curs_border.3x.html">curs_border(3x)</A></STRONG>
+
+                    border_set               <STRONG><A HREF="curs_border_set.3x.html">curs_border_set(3x)</A></STRONG>
+                    box                      <STRONG><A HREF="curs_border.3x.html">curs_border(3x)</A></STRONG>
+                    box_set                  <STRONG><A HREF="curs_border_set.3x.html">curs_border_set(3x)</A></STRONG>
+                    can_change_color         <STRONG><A HREF="curs_color.3x.html">curs_color(3x)</A></STRONG>
+                    cbreak                   <STRONG><A HREF="curs_inopts.3x.html">curs_inopts(3x)</A></STRONG>
+                    chgat                    <STRONG><A HREF="curs_attr.3x.html">curs_attr(3x)</A></STRONG>
+                    clear                    <STRONG><A HREF="curs_clear.3x.html">curs_clear(3x)</A></STRONG>
+                    clearok                  <STRONG><A HREF="curs_outopts.3x.html">curs_outopts(3x)</A></STRONG>
+                    clrtobot                 <STRONG><A HREF="curs_clear.3x.html">curs_clear(3x)</A></STRONG>
+                    clrtoeol                 <STRONG><A HREF="curs_clear.3x.html">curs_clear(3x)</A></STRONG>
+                    color_content            <STRONG><A HREF="curs_color.3x.html">curs_color(3x)</A></STRONG>
+                    color_set                <STRONG><A HREF="curs_attr.3x.html">curs_attr(3x)</A></STRONG>
+                    copywin                  <STRONG><A HREF="curs_overlay.3x.html">curs_overlay(3x)</A></STRONG>
+                    curs_set                 <STRONG><A HREF="curs_kernel.3x.html">curs_kernel(3x)</A></STRONG>
+                    curses_trace             <STRONG><A HREF="curs_trace.3x.html">curs_trace(3x)</A></STRONG>*
+                    curses_version           <STRONG><A HREF="curs_extend.3x.html">curs_extend(3x)</A></STRONG>*
+                    def_prog_mode            <STRONG><A HREF="curs_kernel.3x.html">curs_kernel(3x)</A></STRONG>
+                    def_shell_mode           <STRONG><A HREF="curs_kernel.3x.html">curs_kernel(3x)</A></STRONG>
+                    define_key               <STRONG><A HREF="define_key.3x.html">define_key(3x)</A></STRONG>*
+                    del_curterm              <STRONG><A HREF="curs_terminfo.3x.html">curs_terminfo(3x)</A></STRONG>
+                    delay_output             <STRONG><A HREF="curs_util.3x.html">curs_util(3x)</A></STRONG>
+                    delch                    <STRONG><A HREF="curs_delch.3x.html">curs_delch(3x)</A></STRONG>
+                    deleteln                 <STRONG><A HREF="curs_deleteln.3x.html">curs_deleteln(3x)</A></STRONG>
+                    delscreen                <STRONG><A HREF="curs_initscr.3x.html">curs_initscr(3x)</A></STRONG>
+                    delwin                   <STRONG><A HREF="curs_window.3x.html">curs_window(3x)</A></STRONG>
+                    derwin                   <STRONG><A HREF="curs_window.3x.html">curs_window(3x)</A></STRONG>
+                    doupdate                 <STRONG><A HREF="curs_refresh.3x.html">curs_refresh(3x)</A></STRONG>
+                    dupwin                   <STRONG><A HREF="curs_window.3x.html">curs_window(3x)</A></STRONG>
+                    echo                     <STRONG><A HREF="curs_inopts.3x.html">curs_inopts(3x)</A></STRONG>
+                    echo_wchar               <STRONG><A HREF="curs_add_wch.3x.html">curs_add_wch(3x)</A></STRONG>
+                    echochar                 <STRONG><A HREF="curs_addch.3x.html">curs_addch(3x)</A></STRONG>
+                    endwin                   <STRONG><A HREF="curs_initscr.3x.html">curs_initscr(3x)</A></STRONG>
+                    erase                    <STRONG><A HREF="curs_clear.3x.html">curs_clear(3x)</A></STRONG>
+                    erasechar                <STRONG><A HREF="curs_termattrs.3x.html">curs_termattrs(3x)</A></STRONG>
+                    erasewchar               <STRONG><A HREF="curs_termattrs.3x.html">curs_termattrs(3x)</A></STRONG>
+                    exit_curses              <STRONG><A HREF="curs_memleaks.3x.html">curs_memleaks(3x)</A></STRONG>*
+                    exit_terminfo            <STRONG><A HREF="curs_memleaks.3x.html">curs_memleaks(3x)</A></STRONG>*
+                    extended_color_content   <STRONG><A HREF="curs_color.3x.html">curs_color(3x)</A></STRONG>*
+                    extended_pair_content    <STRONG><A HREF="curs_color.3x.html">curs_color(3x)</A></STRONG>*
+                    extended_slk_color       <STRONG><A HREF="curs_slk.3x.html">curs_slk(3x)</A></STRONG>*
+                    filter                   <STRONG><A HREF="curs_util.3x.html">curs_util(3x)</A></STRONG>
+                    find_pair                <STRONG><A HREF="new_pair.3x.html">new_pair(3x)</A></STRONG>*
+                    flash                    <STRONG><A HREF="curs_beep.3x.html">curs_beep(3x)</A></STRONG>
+                    flushinp                 <STRONG><A HREF="curs_util.3x.html">curs_util(3x)</A></STRONG>
+                    free_pair                <STRONG><A HREF="new_pair.3x.html">new_pair(3x)</A></STRONG>*
+                    get_wch                  <STRONG><A HREF="curs_get_wch.3x.html">curs_get_wch(3x)</A></STRONG>
+                    get_wstr                 <STRONG><A HREF="curs_get_wstr.3x.html">curs_get_wstr(3x)</A></STRONG>
+                    getattrs                 <STRONG><A HREF="curs_attr.3x.html">curs_attr(3x)</A></STRONG>
+                    getbegx                  <STRONG><A HREF="curs_legacy.3x.html">curs_legacy(3x)</A></STRONG>*
+                    getbegy                  <STRONG><A HREF="curs_legacy.3x.html">curs_legacy(3x)</A></STRONG>*
+                    getbegyx                 <STRONG><A HREF="curs_getyx.3x.html">curs_getyx(3x)</A></STRONG>
+                    getbkgd                  <STRONG><A HREF="curs_bkgd.3x.html">curs_bkgd(3x)</A></STRONG>
+                    getbkgrnd                <STRONG><A HREF="curs_bkgrnd.3x.html">curs_bkgrnd(3x)</A></STRONG>
+                    getcchar                 <STRONG><A HREF="curs_getcchar.3x.html">curs_getcchar(3x)</A></STRONG>
+                    getch                    <STRONG><A HREF="curs_getch.3x.html">curs_getch(3x)</A></STRONG>
+                    getcurx                  <STRONG><A HREF="curs_legacy.3x.html">curs_legacy(3x)</A></STRONG>*
+                    getcury                  <STRONG><A HREF="curs_legacy.3x.html">curs_legacy(3x)</A></STRONG>*
+                    getmaxx                  <STRONG><A HREF="curs_legacy.3x.html">curs_legacy(3x)</A></STRONG>*
+                    getmaxy                  <STRONG><A HREF="curs_legacy.3x.html">curs_legacy(3x)</A></STRONG>*
+                    getmaxyx                 <STRONG><A HREF="curs_getyx.3x.html">curs_getyx(3x)</A></STRONG>
+                    getmouse                 <STRONG><A HREF="curs_mouse.3x.html">curs_mouse(3x)</A></STRONG>*
+                    getn_wstr                <STRONG><A HREF="curs_get_wstr.3x.html">curs_get_wstr(3x)</A></STRONG>
+                    getnstr                  <STRONG><A HREF="curs_getstr.3x.html">curs_getstr(3x)</A></STRONG>
+                    getparx                  <STRONG><A HREF="curs_legacy.3x.html">curs_legacy(3x)</A></STRONG>*
+                    getpary                  <STRONG><A HREF="curs_legacy.3x.html">curs_legacy(3x)</A></STRONG>*
+
+                    getparyx                 <STRONG><A HREF="curs_getyx.3x.html">curs_getyx(3x)</A></STRONG>
+                    getstr                   <STRONG><A HREF="curs_getstr.3x.html">curs_getstr(3x)</A></STRONG>
+                    getsyx                   <STRONG><A HREF="curs_kernel.3x.html">curs_kernel(3x)</A></STRONG>
+                    getwin                   <STRONG><A HREF="curs_util.3x.html">curs_util(3x)</A></STRONG>
+                    getyx                    <STRONG><A HREF="curs_getyx.3x.html">curs_getyx(3x)</A></STRONG>
+                    halfdelay                <STRONG><A HREF="curs_inopts.3x.html">curs_inopts(3x)</A></STRONG>
+                    has_colors               <STRONG><A HREF="curs_color.3x.html">curs_color(3x)</A></STRONG>
+                    has_ic                   <STRONG><A HREF="curs_termattrs.3x.html">curs_termattrs(3x)</A></STRONG>
+                    has_il                   <STRONG><A HREF="curs_termattrs.3x.html">curs_termattrs(3x)</A></STRONG>
+                    has_key                  <STRONG><A HREF="curs_getch.3x.html">curs_getch(3x)</A></STRONG>*
+                    has_mouse                <STRONG><A HREF="curs_mouse.3x.html">curs_mouse(3x)</A></STRONG>*
+                    hline                    <STRONG><A HREF="curs_border.3x.html">curs_border(3x)</A></STRONG>
+                    hline_set                <STRONG><A HREF="curs_border_set.3x.html">curs_border_set(3x)</A></STRONG>
+                    idcok                    <STRONG><A HREF="curs_outopts.3x.html">curs_outopts(3x)</A></STRONG>
+                    idlok                    <STRONG><A HREF="curs_outopts.3x.html">curs_outopts(3x)</A></STRONG>
+                    immedok                  <STRONG><A HREF="curs_outopts.3x.html">curs_outopts(3x)</A></STRONG>
+                    in_wch                   <STRONG><A HREF="curs_in_wch.3x.html">curs_in_wch(3x)</A></STRONG>
+                    in_wchnstr               <STRONG><A HREF="curs_in_wchstr.3x.html">curs_in_wchstr(3x)</A></STRONG>
+                    in_wchstr                <STRONG><A HREF="curs_in_wchstr.3x.html">curs_in_wchstr(3x)</A></STRONG>
+                    inch                     <STRONG><A HREF="curs_inch.3x.html">curs_inch(3x)</A></STRONG>
+                    inchnstr                 <STRONG><A HREF="curs_inchstr.3x.html">curs_inchstr(3x)</A></STRONG>
+                    inchstr                  <STRONG><A HREF="curs_inchstr.3x.html">curs_inchstr(3x)</A></STRONG>
+                    init_color               <STRONG><A HREF="curs_color.3x.html">curs_color(3x)</A></STRONG>
+                    init_extended_color      <STRONG><A HREF="curs_color.3x.html">curs_color(3x)</A></STRONG>*
+                    init_extended_pair       <STRONG><A HREF="curs_color.3x.html">curs_color(3x)</A></STRONG>*
+                    init_pair                <STRONG><A HREF="curs_color.3x.html">curs_color(3x)</A></STRONG>
+                    initscr                  <STRONG><A HREF="curs_initscr.3x.html">curs_initscr(3x)</A></STRONG>
+                    innstr                   <STRONG><A HREF="curs_instr.3x.html">curs_instr(3x)</A></STRONG>
+                    innwstr                  <STRONG><A HREF="curs_inwstr.3x.html">curs_inwstr(3x)</A></STRONG>
+                    ins_nwstr                <STRONG><A HREF="curs_ins_wstr.3x.html">curs_ins_wstr(3x)</A></STRONG>
+                    ins_wch                  <STRONG><A HREF="curs_ins_wch.3x.html">curs_ins_wch(3x)</A></STRONG>
+                    ins_wstr                 <STRONG><A HREF="curs_ins_wstr.3x.html">curs_ins_wstr(3x)</A></STRONG>
+                    insch                    <STRONG><A HREF="curs_insch.3x.html">curs_insch(3x)</A></STRONG>
+                    insdelln                 <STRONG><A HREF="curs_deleteln.3x.html">curs_deleteln(3x)</A></STRONG>
+                    insertln                 <STRONG><A HREF="curs_deleteln.3x.html">curs_deleteln(3x)</A></STRONG>
+                    insnstr                  <STRONG><A HREF="curs_insstr.3x.html">curs_insstr(3x)</A></STRONG>
+                    insstr                   <STRONG><A HREF="curs_insstr.3x.html">curs_insstr(3x)</A></STRONG>
+                    instr                    <STRONG><A HREF="curs_instr.3x.html">curs_instr(3x)</A></STRONG>
+                    intrflush                <STRONG><A HREF="curs_inopts.3x.html">curs_inopts(3x)</A></STRONG>
+                    inwstr                   <STRONG><A HREF="curs_inwstr.3x.html">curs_inwstr(3x)</A></STRONG>
+                    is_cleared               <STRONG><A HREF="curs_opaque.3x.html">curs_opaque(3x)</A></STRONG>*
+                    is_idcok                 <STRONG><A HREF="curs_opaque.3x.html">curs_opaque(3x)</A></STRONG>*
+                    is_idlok                 <STRONG><A HREF="curs_opaque.3x.html">curs_opaque(3x)</A></STRONG>*
+                    is_immedok               <STRONG><A HREF="curs_opaque.3x.html">curs_opaque(3x)</A></STRONG>*
+                    is_keypad                <STRONG><A HREF="curs_opaque.3x.html">curs_opaque(3x)</A></STRONG>*
+                    is_leaveok               <STRONG><A HREF="curs_opaque.3x.html">curs_opaque(3x)</A></STRONG>*
+                    is_linetouched           <STRONG><A HREF="curs_touch.3x.html">curs_touch(3x)</A></STRONG>
+                    is_nodelay               <STRONG><A HREF="curs_opaque.3x.html">curs_opaque(3x)</A></STRONG>*
+                    is_notimeout             <STRONG><A HREF="curs_opaque.3x.html">curs_opaque(3x)</A></STRONG>*
+                    is_pad                   <STRONG><A HREF="curs_opaque.3x.html">curs_opaque(3x)</A></STRONG>*
+                    is_scrollok              <STRONG><A HREF="curs_opaque.3x.html">curs_opaque(3x)</A></STRONG>*
+                    is_subwin                <STRONG><A HREF="curs_opaque.3x.html">curs_opaque(3x)</A></STRONG>*
+                    is_syncok                <STRONG><A HREF="curs_opaque.3x.html">curs_opaque(3x)</A></STRONG>*
+                    is_term_resized          <STRONG><A HREF="resizeterm.3x.html">resizeterm(3x)</A></STRONG>*
+                    is_wintouched            <STRONG><A HREF="curs_touch.3x.html">curs_touch(3x)</A></STRONG>
+                    isendwin                 <STRONG><A HREF="curs_initscr.3x.html">curs_initscr(3x)</A></STRONG>
+                    key_defined              <STRONG><A HREF="key_defined.3x.html">key_defined(3x)</A></STRONG>*
+                    key_name                 <STRONG><A HREF="curs_util.3x.html">curs_util(3x)</A></STRONG>
+                    keybound                 <STRONG><A HREF="keybound.3x.html">keybound(3x)</A></STRONG>*
+                    keyname                  <STRONG><A HREF="curs_util.3x.html">curs_util(3x)</A></STRONG>
+                    keyok                    <STRONG><A HREF="keyok.3x.html">keyok(3x)</A></STRONG>*
+                    keypad                   <STRONG><A HREF="curs_inopts.3x.html">curs_inopts(3x)</A></STRONG>
+                    killchar                 <STRONG><A HREF="curs_termattrs.3x.html">curs_termattrs(3x)</A></STRONG>
+                    killwchar                <STRONG><A HREF="curs_termattrs.3x.html">curs_termattrs(3x)</A></STRONG>
+                    leaveok                  <STRONG><A HREF="curs_outopts.3x.html">curs_outopts(3x)</A></STRONG>
+
+                    longname                 <STRONG><A HREF="curs_termattrs.3x.html">curs_termattrs(3x)</A></STRONG>
+                    mcprint                  <STRONG><A HREF="curs_print.3x.html">curs_print(3x)</A></STRONG>*
+                    meta                     <STRONG><A HREF="curs_inopts.3x.html">curs_inopts(3x)</A></STRONG>
+                    mouse_trafo              <STRONG><A HREF="curs_mouse.3x.html">curs_mouse(3x)</A></STRONG>*
+                    mouseinterval            <STRONG><A HREF="curs_mouse.3x.html">curs_mouse(3x)</A></STRONG>*
+                    mousemask                <STRONG><A HREF="curs_mouse.3x.html">curs_mouse(3x)</A></STRONG>*
+                    move                     <STRONG><A HREF="curs_move.3x.html">curs_move(3x)</A></STRONG>
+                    mvadd_wch                <STRONG><A HREF="curs_add_wch.3x.html">curs_add_wch(3x)</A></STRONG>
+                    mvadd_wchnstr            <STRONG><A HREF="curs_add_wchstr.3x.html">curs_add_wchstr(3x)</A></STRONG>
+                    mvadd_wchstr             <STRONG><A HREF="curs_add_wchstr.3x.html">curs_add_wchstr(3x)</A></STRONG>
+                    mvaddch                  <STRONG><A HREF="curs_addch.3x.html">curs_addch(3x)</A></STRONG>
+                    mvaddchnstr              <STRONG><A HREF="curs_addchstr.3x.html">curs_addchstr(3x)</A></STRONG>
+                    mvaddchstr               <STRONG><A HREF="curs_addchstr.3x.html">curs_addchstr(3x)</A></STRONG>
+                    mvaddnstr                <STRONG><A HREF="curs_addstr.3x.html">curs_addstr(3x)</A></STRONG>
+                    mvaddnwstr               <STRONG><A HREF="curs_addwstr.3x.html">curs_addwstr(3x)</A></STRONG>
+                    mvaddstr                 <STRONG><A HREF="curs_addstr.3x.html">curs_addstr(3x)</A></STRONG>
+                    mvaddwstr                <STRONG><A HREF="curs_addwstr.3x.html">curs_addwstr(3x)</A></STRONG>
+                    mvchgat                  <STRONG><A HREF="curs_attr.3x.html">curs_attr(3x)</A></STRONG>
+                    mvcur                    <STRONG><A HREF="curs_terminfo.3x.html">curs_terminfo(3x)</A></STRONG>
+                    mvdelch                  <STRONG><A HREF="curs_delch.3x.html">curs_delch(3x)</A></STRONG>
+                    mvderwin                 <STRONG><A HREF="curs_window.3x.html">curs_window(3x)</A></STRONG>
+                    mvget_wch                <STRONG><A HREF="curs_get_wch.3x.html">curs_get_wch(3x)</A></STRONG>
+                    mvget_wstr               <STRONG><A HREF="curs_get_wstr.3x.html">curs_get_wstr(3x)</A></STRONG>
+                    mvgetch                  <STRONG><A HREF="curs_getch.3x.html">curs_getch(3x)</A></STRONG>
+                    mvgetn_wstr              <STRONG><A HREF="curs_get_wstr.3x.html">curs_get_wstr(3x)</A></STRONG>
+                    mvgetnstr                <STRONG><A HREF="curs_getstr.3x.html">curs_getstr(3x)</A></STRONG>
+                    mvgetstr                 <STRONG><A HREF="curs_getstr.3x.html">curs_getstr(3x)</A></STRONG>
+                    mvhline                  <STRONG><A HREF="curs_border.3x.html">curs_border(3x)</A></STRONG>
+                    mvhline_set              <STRONG><A HREF="curs_border_set.3x.html">curs_border_set(3x)</A></STRONG>
+                    mvin_wch                 <STRONG><A HREF="curs_in_wch.3x.html">curs_in_wch(3x)</A></STRONG>
+                    mvin_wchnstr             <STRONG><A HREF="curs_in_wchstr.3x.html">curs_in_wchstr(3x)</A></STRONG>
+                    mvin_wchstr              <STRONG><A HREF="curs_in_wchstr.3x.html">curs_in_wchstr(3x)</A></STRONG>
+                    mvinch                   <STRONG><A HREF="curs_inch.3x.html">curs_inch(3x)</A></STRONG>
+                    mvinchnstr               <STRONG><A HREF="curs_inchstr.3x.html">curs_inchstr(3x)</A></STRONG>
+                    mvinchstr                <STRONG><A HREF="curs_inchstr.3x.html">curs_inchstr(3x)</A></STRONG>
+                    mvinnstr                 <STRONG><A HREF="curs_instr.3x.html">curs_instr(3x)</A></STRONG>
+                    mvinnwstr                <STRONG><A HREF="curs_inwstr.3x.html">curs_inwstr(3x)</A></STRONG>
+                    mvins_nwstr              <STRONG><A HREF="curs_ins_wstr.3x.html">curs_ins_wstr(3x)</A></STRONG>
+                    mvins_wch                <STRONG><A HREF="curs_ins_wch.3x.html">curs_ins_wch(3x)</A></STRONG>
+                    mvins_wstr               <STRONG><A HREF="curs_ins_wstr.3x.html">curs_ins_wstr(3x)</A></STRONG>
+                    mvinsch                  <STRONG><A HREF="curs_insch.3x.html">curs_insch(3x)</A></STRONG>
+                    mvinsnstr                <STRONG><A HREF="curs_insstr.3x.html">curs_insstr(3x)</A></STRONG>
+                    mvinsstr                 <STRONG><A HREF="curs_insstr.3x.html">curs_insstr(3x)</A></STRONG>
+                    mvinstr                  <STRONG><A HREF="curs_instr.3x.html">curs_instr(3x)</A></STRONG>
+                    mvinwstr                 <STRONG><A HREF="curs_inwstr.3x.html">curs_inwstr(3x)</A></STRONG>
+                    mvprintw                 <STRONG><A HREF="curs_printw.3x.html">curs_printw(3x)</A></STRONG>
+                    mvscanw                  <STRONG><A HREF="curs_scanw.3x.html">curs_scanw(3x)</A></STRONG>
+                    mvvline                  <STRONG><A HREF="curs_border.3x.html">curs_border(3x)</A></STRONG>
+                    mvvline_set              <STRONG><A HREF="curs_border_set.3x.html">curs_border_set(3x)</A></STRONG>
+                    mvwadd_wch               <STRONG><A HREF="curs_add_wch.3x.html">curs_add_wch(3x)</A></STRONG>
+                    mvwadd_wchnstr           <STRONG><A HREF="curs_add_wchstr.3x.html">curs_add_wchstr(3x)</A></STRONG>
+                    mvwadd_wchstr            <STRONG><A HREF="curs_add_wchstr.3x.html">curs_add_wchstr(3x)</A></STRONG>
+                    mvwaddch                 <STRONG><A HREF="curs_addch.3x.html">curs_addch(3x)</A></STRONG>
+                    mvwaddchnstr             <STRONG><A HREF="curs_addchstr.3x.html">curs_addchstr(3x)</A></STRONG>
+                    mvwaddchstr              <STRONG><A HREF="curs_addchstr.3x.html">curs_addchstr(3x)</A></STRONG>
+                    mvwaddnstr               <STRONG><A HREF="curs_addstr.3x.html">curs_addstr(3x)</A></STRONG>
+                    mvwaddnwstr              <STRONG><A HREF="curs_addwstr.3x.html">curs_addwstr(3x)</A></STRONG>
+                    mvwaddstr                <STRONG><A HREF="curs_addstr.3x.html">curs_addstr(3x)</A></STRONG>
+                    mvwaddwstr               <STRONG><A HREF="curs_addwstr.3x.html">curs_addwstr(3x)</A></STRONG>
+                    mvwchgat                 <STRONG><A HREF="curs_attr.3x.html">curs_attr(3x)</A></STRONG>
+                    mvwdelch                 <STRONG><A HREF="curs_delch.3x.html">curs_delch(3x)</A></STRONG>
+                    mvwget_wch               <STRONG><A HREF="curs_get_wch.3x.html">curs_get_wch(3x)</A></STRONG>
+                    mvwget_wstr              <STRONG><A HREF="curs_get_wstr.3x.html">curs_get_wstr(3x)</A></STRONG>
+                    mvwgetch                 <STRONG><A HREF="curs_getch.3x.html">curs_getch(3x)</A></STRONG>
+                    mvwgetn_wstr             <STRONG><A HREF="curs_get_wstr.3x.html">curs_get_wstr(3x)</A></STRONG>
+
+                    mvwgetnstr               <STRONG><A HREF="curs_getstr.3x.html">curs_getstr(3x)</A></STRONG>
+                    mvwgetstr                <STRONG><A HREF="curs_getstr.3x.html">curs_getstr(3x)</A></STRONG>
+                    mvwhline                 <STRONG><A HREF="curs_border.3x.html">curs_border(3x)</A></STRONG>
+                    mvwhline_set             <STRONG><A HREF="curs_border_set.3x.html">curs_border_set(3x)</A></STRONG>
+                    mvwin                    <STRONG><A HREF="curs_window.3x.html">curs_window(3x)</A></STRONG>
+                    mvwin_wch                <STRONG><A HREF="curs_in_wch.3x.html">curs_in_wch(3x)</A></STRONG>
+                    mvwin_wchnstr            <STRONG><A HREF="curs_in_wchstr.3x.html">curs_in_wchstr(3x)</A></STRONG>
+                    mvwin_wchstr             <STRONG><A HREF="curs_in_wchstr.3x.html">curs_in_wchstr(3x)</A></STRONG>
+                    mvwinch                  <STRONG><A HREF="curs_inch.3x.html">curs_inch(3x)</A></STRONG>
+                    mvwinchnstr              <STRONG><A HREF="curs_inchstr.3x.html">curs_inchstr(3x)</A></STRONG>
+                    mvwinchstr               <STRONG><A HREF="curs_inchstr.3x.html">curs_inchstr(3x)</A></STRONG>
+                    mvwinnstr                <STRONG><A HREF="curs_instr.3x.html">curs_instr(3x)</A></STRONG>
+                    mvwinnwstr               <STRONG><A HREF="curs_inwstr.3x.html">curs_inwstr(3x)</A></STRONG>
+                    mvwins_nwstr             <STRONG><A HREF="curs_ins_wstr.3x.html">curs_ins_wstr(3x)</A></STRONG>
+                    mvwins_wch               <STRONG><A HREF="curs_ins_wch.3x.html">curs_ins_wch(3x)</A></STRONG>
+                    mvwins_wstr              <STRONG><A HREF="curs_ins_wstr.3x.html">curs_ins_wstr(3x)</A></STRONG>
+                    mvwinsch                 <STRONG><A HREF="curs_insch.3x.html">curs_insch(3x)</A></STRONG>
+                    mvwinsnstr               <STRONG><A HREF="curs_insstr.3x.html">curs_insstr(3x)</A></STRONG>
+                    mvwinsstr                <STRONG><A HREF="curs_insstr.3x.html">curs_insstr(3x)</A></STRONG>
+                    mvwinstr                 <STRONG><A HREF="curs_instr.3x.html">curs_instr(3x)</A></STRONG>
+                    mvwinwstr                <STRONG><A HREF="curs_inwstr.3x.html">curs_inwstr(3x)</A></STRONG>
+                    mvwprintw                <STRONG><A HREF="curs_printw.3x.html">curs_printw(3x)</A></STRONG>
+                    mvwscanw                 <STRONG><A HREF="curs_scanw.3x.html">curs_scanw(3x)</A></STRONG>
+                    mvwvline                 <STRONG><A HREF="curs_border.3x.html">curs_border(3x)</A></STRONG>
+                    mvwvline_set             <STRONG><A HREF="curs_border_set.3x.html">curs_border_set(3x)</A></STRONG>
+                    napms                    <STRONG><A HREF="curs_kernel.3x.html">curs_kernel(3x)</A></STRONG>
+                    newpad                   <STRONG><A HREF="curs_pad.3x.html">curs_pad(3x)</A></STRONG>
+                    newterm                  <STRONG><A HREF="curs_initscr.3x.html">curs_initscr(3x)</A></STRONG>
+                    newwin                   <STRONG><A HREF="curs_window.3x.html">curs_window(3x)</A></STRONG>
+                    nl                       <STRONG><A HREF="curs_inopts.3x.html">curs_inopts(3x)</A></STRONG>
+                    nocbreak                 <STRONG><A HREF="curs_inopts.3x.html">curs_inopts(3x)</A></STRONG>
+                    nodelay                  <STRONG><A HREF="curs_inopts.3x.html">curs_inopts(3x)</A></STRONG>
+                    noecho                   <STRONG><A HREF="curs_inopts.3x.html">curs_inopts(3x)</A></STRONG>
+                    nofilter                 <STRONG><A HREF="curs_util.3x.html">curs_util(3x)</A></STRONG>*
+                    nonl                     <STRONG><A HREF="curs_inopts.3x.html">curs_inopts(3x)</A></STRONG>
+                    noqiflush                <STRONG><A HREF="curs_inopts.3x.html">curs_inopts(3x)</A></STRONG>
+                    noraw                    <STRONG><A HREF="curs_inopts.3x.html">curs_inopts(3x)</A></STRONG>
+                    notimeout                <STRONG><A HREF="curs_inopts.3x.html">curs_inopts(3x)</A></STRONG>
+                    overlay                  <STRONG><A HREF="curs_overlay.3x.html">curs_overlay(3x)</A></STRONG>
+                    overwrite                <STRONG><A HREF="curs_overlay.3x.html">curs_overlay(3x)</A></STRONG>
+                    pair_content             <STRONG><A HREF="curs_color.3x.html">curs_color(3x)</A></STRONG>
+                    pecho_wchar              <STRONG><A HREF="curs_pad.3x.html">curs_pad(3x)</A></STRONG>*
+                    pechochar                <STRONG><A HREF="curs_pad.3x.html">curs_pad(3x)</A></STRONG>
+                    pnoutrefresh             <STRONG><A HREF="curs_pad.3x.html">curs_pad(3x)</A></STRONG>
+                    prefresh                 <STRONG><A HREF="curs_pad.3x.html">curs_pad(3x)</A></STRONG>
+                    printw                   <STRONG><A HREF="curs_printw.3x.html">curs_printw(3x)</A></STRONG>
+                    putp                     <STRONG><A HREF="curs_terminfo.3x.html">curs_terminfo(3x)</A></STRONG>
+                    putwin                   <STRONG><A HREF="curs_util.3x.html">curs_util(3x)</A></STRONG>
+                    qiflush                  <STRONG><A HREF="curs_inopts.3x.html">curs_inopts(3x)</A></STRONG>
+                    raw                      <STRONG><A HREF="curs_inopts.3x.html">curs_inopts(3x)</A></STRONG>
+                    redrawwin                <STRONG><A HREF="curs_refresh.3x.html">curs_refresh(3x)</A></STRONG>
+                    refresh                  <STRONG><A HREF="curs_refresh.3x.html">curs_refresh(3x)</A></STRONG>
+                    reset_color_pairs        <STRONG><A HREF="curs_color.3x.html">curs_color(3x)</A></STRONG>*
+                    reset_prog_mode          <STRONG><A HREF="curs_kernel.3x.html">curs_kernel(3x)</A></STRONG>
+                    reset_shell_mode         <STRONG><A HREF="curs_kernel.3x.html">curs_kernel(3x)</A></STRONG>
+                    resetty                  <STRONG><A HREF="curs_kernel.3x.html">curs_kernel(3x)</A></STRONG>
+                    resize_term              <STRONG><A HREF="resizeterm.3x.html">resizeterm(3x)</A></STRONG>*
+                    resizeterm               <STRONG><A HREF="resizeterm.3x.html">resizeterm(3x)</A></STRONG>*
+                    restartterm              <STRONG><A HREF="curs_terminfo.3x.html">curs_terminfo(3x)</A></STRONG>
+                    ripoffline               <STRONG><A HREF="curs_kernel.3x.html">curs_kernel(3x)</A></STRONG>
+                    savetty                  <STRONG><A HREF="curs_kernel.3x.html">curs_kernel(3x)</A></STRONG>
+                    scanw                    <STRONG><A HREF="curs_scanw.3x.html">curs_scanw(3x)</A></STRONG>
+                    scr_dump                 <STRONG><A HREF="curs_scr_dump.3x.html">curs_scr_dump(3x)</A></STRONG>
+                    scr_init                 <STRONG><A HREF="curs_scr_dump.3x.html">curs_scr_dump(3x)</A></STRONG>
+                    scr_restore              <STRONG><A HREF="curs_scr_dump.3x.html">curs_scr_dump(3x)</A></STRONG>
+
+                    scr_set                  <STRONG><A HREF="curs_scr_dump.3x.html">curs_scr_dump(3x)</A></STRONG>
+                    scrl                     <STRONG><A HREF="curs_scroll.3x.html">curs_scroll(3x)</A></STRONG>
+                    scroll                   <STRONG><A HREF="curs_scroll.3x.html">curs_scroll(3x)</A></STRONG>
+                    scrollok                 <STRONG><A HREF="curs_outopts.3x.html">curs_outopts(3x)</A></STRONG>
+                    set_curterm              <STRONG><A HREF="curs_terminfo.3x.html">curs_terminfo(3x)</A></STRONG>
+                    set_term                 <STRONG><A HREF="curs_initscr.3x.html">curs_initscr(3x)</A></STRONG>
+                    setcchar                 <STRONG><A HREF="curs_getcchar.3x.html">curs_getcchar(3x)</A></STRONG>
+                    setscrreg                <STRONG><A HREF="curs_outopts.3x.html">curs_outopts(3x)</A></STRONG>
+                    setsyx                   <STRONG><A HREF="curs_kernel.3x.html">curs_kernel(3x)</A></STRONG>
+                    setupterm                <STRONG><A HREF="curs_terminfo.3x.html">curs_terminfo(3x)</A></STRONG>
+                    slk_attr                 <STRONG><A HREF="curs_slk.3x.html">curs_slk(3x)</A></STRONG>*
+                    slk_attr_off             <STRONG><A HREF="curs_slk.3x.html">curs_slk(3x)</A></STRONG>
+                    slk_attr_on              <STRONG><A HREF="curs_slk.3x.html">curs_slk(3x)</A></STRONG>
+                    slk_attr_set             <STRONG><A HREF="curs_slk.3x.html">curs_slk(3x)</A></STRONG>
+                    slk_attroff              <STRONG><A HREF="curs_slk.3x.html">curs_slk(3x)</A></STRONG>
+                    slk_attron               <STRONG><A HREF="curs_slk.3x.html">curs_slk(3x)</A></STRONG>
+                    slk_attrset              <STRONG><A HREF="curs_slk.3x.html">curs_slk(3x)</A></STRONG>
+                    slk_clear                <STRONG><A HREF="curs_slk.3x.html">curs_slk(3x)</A></STRONG>
+                    slk_color                <STRONG><A HREF="curs_slk.3x.html">curs_slk(3x)</A></STRONG>
+                    slk_init                 <STRONG><A HREF="curs_slk.3x.html">curs_slk(3x)</A></STRONG>
+                    slk_label                <STRONG><A HREF="curs_slk.3x.html">curs_slk(3x)</A></STRONG>
+                    slk_noutrefresh          <STRONG><A HREF="curs_slk.3x.html">curs_slk(3x)</A></STRONG>
+                    slk_refresh              <STRONG><A HREF="curs_slk.3x.html">curs_slk(3x)</A></STRONG>
+                    slk_restore              <STRONG><A HREF="curs_slk.3x.html">curs_slk(3x)</A></STRONG>
+                    slk_set                  <STRONG><A HREF="curs_slk.3x.html">curs_slk(3x)</A></STRONG>
+                    slk_touch                <STRONG><A HREF="curs_slk.3x.html">curs_slk(3x)</A></STRONG>
+                    slk_wset                 <STRONG><A HREF="curs_slk.3x.html">curs_slk(3x)</A></STRONG>*
+                    standend                 <STRONG><A HREF="curs_attr.3x.html">curs_attr(3x)</A></STRONG>
+                    standout                 <STRONG><A HREF="curs_attr.3x.html">curs_attr(3x)</A></STRONG>
+                    start_color              <STRONG><A HREF="curs_color.3x.html">curs_color(3x)</A></STRONG>
+                    subpad                   <STRONG><A HREF="curs_pad.3x.html">curs_pad(3x)</A></STRONG>
+                    subwin                   <STRONG><A HREF="curs_window.3x.html">curs_window(3x)</A></STRONG>
+                    syncok                   <STRONG><A HREF="curs_window.3x.html">curs_window(3x)</A></STRONG>
+                    term_attrs               <STRONG><A HREF="curs_termattrs.3x.html">curs_termattrs(3x)</A></STRONG>
+                    termattrs                <STRONG><A HREF="curs_termattrs.3x.html">curs_termattrs(3x)</A></STRONG>
+                    termname                 <STRONG><A HREF="curs_termattrs.3x.html">curs_termattrs(3x)</A></STRONG>
+                    tgetent                  <STRONG><A HREF="curs_termcap.3x.html">curs_termcap(3x)</A></STRONG>
+                    tgetflag                 <STRONG><A HREF="curs_termcap.3x.html">curs_termcap(3x)</A></STRONG>
+                    tgetnum                  <STRONG><A HREF="curs_termcap.3x.html">curs_termcap(3x)</A></STRONG>
+                    tgetstr                  <STRONG><A HREF="curs_termcap.3x.html">curs_termcap(3x)</A></STRONG>
+                    tgoto                    <STRONG><A HREF="curs_termcap.3x.html">curs_termcap(3x)</A></STRONG>
+                    tigetflag                <STRONG><A HREF="curs_terminfo.3x.html">curs_terminfo(3x)</A></STRONG>
+                    tigetnum                 <STRONG><A HREF="curs_terminfo.3x.html">curs_terminfo(3x)</A></STRONG>
+                    tigetstr                 <STRONG><A HREF="curs_terminfo.3x.html">curs_terminfo(3x)</A></STRONG>
+                    timeout                  <STRONG><A HREF="curs_inopts.3x.html">curs_inopts(3x)</A></STRONG>
+                    tiparm                   <STRONG><A HREF="curs_terminfo.3x.html">curs_terminfo(3x)</A></STRONG>*
+                    touchline                <STRONG><A HREF="curs_touch.3x.html">curs_touch(3x)</A></STRONG>
+                    touchwin                 <STRONG><A HREF="curs_touch.3x.html">curs_touch(3x)</A></STRONG>
+                    tparm                    <STRONG><A HREF="curs_terminfo.3x.html">curs_terminfo(3x)</A></STRONG>
+                    tputs                    <STRONG><A HREF="curs_termcap.3x.html">curs_termcap(3x)</A></STRONG>
+                    tputs                    <STRONG><A HREF="curs_terminfo.3x.html">curs_terminfo(3x)</A></STRONG>
+                    trace                    <STRONG><A HREF="curs_trace.3x.html">curs_trace(3x)</A></STRONG>*
+                    typeahead                <STRONG><A HREF="curs_inopts.3x.html">curs_inopts(3x)</A></STRONG>
+                    unctrl                   <STRONG><A HREF="curs_util.3x.html">curs_util(3x)</A></STRONG>
+                    unget_wch                <STRONG><A HREF="curs_get_wch.3x.html">curs_get_wch(3x)</A></STRONG>
+                    ungetch                  <STRONG><A HREF="curs_getch.3x.html">curs_getch(3x)</A></STRONG>
+                    ungetmouse               <STRONG><A HREF="curs_mouse.3x.html">curs_mouse(3x)</A></STRONG>*
+                    untouchwin               <STRONG><A HREF="curs_touch.3x.html">curs_touch(3x)</A></STRONG>
+                    use_default_colors       <STRONG><A HREF="default_colors.3x.html">default_colors(3x)</A></STRONG>*
+                    use_env                  <STRONG><A HREF="curs_util.3x.html">curs_util(3x)</A></STRONG>
+                    use_extended_names       <STRONG><A HREF="curs_extend.3x.html">curs_extend(3x)</A></STRONG>*
+                    use_legacy_coding        <STRONG><A HREF="legacy_coding.3x.html">legacy_coding(3x)</A></STRONG>*
+                    use_tioctl               <STRONG><A HREF="curs_util.3x.html">curs_util(3x)</A></STRONG>*
+                    vid_attr                 <STRONG><A HREF="curs_terminfo.3x.html">curs_terminfo(3x)</A></STRONG>
+                    vid_puts                 <STRONG><A HREF="curs_terminfo.3x.html">curs_terminfo(3x)</A></STRONG>
+
+                    vidattr                  <STRONG><A HREF="curs_terminfo.3x.html">curs_terminfo(3x)</A></STRONG>
+                    vidputs                  <STRONG><A HREF="curs_terminfo.3x.html">curs_terminfo(3x)</A></STRONG>
+                    vline                    <STRONG><A HREF="curs_border.3x.html">curs_border(3x)</A></STRONG>
+                    vline_set                <STRONG><A HREF="curs_border_set.3x.html">curs_border_set(3x)</A></STRONG>
+                    vw_printw                <STRONG><A HREF="curs_printw.3x.html">curs_printw(3x)</A></STRONG>
+                    vw_scanw                 <STRONG><A HREF="curs_scanw.3x.html">curs_scanw(3x)</A></STRONG>
+                    vwprintw                 <STRONG><A HREF="curs_printw.3x.html">curs_printw(3x)</A></STRONG>
+                    vwscanw                  <STRONG><A HREF="curs_scanw.3x.html">curs_scanw(3x)</A></STRONG>
+                    wadd_wch                 <STRONG><A HREF="curs_add_wch.3x.html">curs_add_wch(3x)</A></STRONG>
+                    wadd_wchnstr             <STRONG><A HREF="curs_add_wchstr.3x.html">curs_add_wchstr(3x)</A></STRONG>
+                    wadd_wchstr              <STRONG><A HREF="curs_add_wchstr.3x.html">curs_add_wchstr(3x)</A></STRONG>
+                    waddch                   <STRONG><A HREF="curs_addch.3x.html">curs_addch(3x)</A></STRONG>
+                    waddchnstr               <STRONG><A HREF="curs_addchstr.3x.html">curs_addchstr(3x)</A></STRONG>
+                    waddchstr                <STRONG><A HREF="curs_addchstr.3x.html">curs_addchstr(3x)</A></STRONG>
+                    waddnstr                 <STRONG><A HREF="curs_addstr.3x.html">curs_addstr(3x)</A></STRONG>
+                    waddnwstr                <STRONG><A HREF="curs_addwstr.3x.html">curs_addwstr(3x)</A></STRONG>
+                    waddstr                  <STRONG><A HREF="curs_addstr.3x.html">curs_addstr(3x)</A></STRONG>
+                    waddwstr                 <STRONG><A HREF="curs_addwstr.3x.html">curs_addwstr(3x)</A></STRONG>
+                    wattr_get                <STRONG><A HREF="curs_attr.3x.html">curs_attr(3x)</A></STRONG>
+                    wattr_off                <STRONG><A HREF="curs_attr.3x.html">curs_attr(3x)</A></STRONG>
+                    wattr_on                 <STRONG><A HREF="curs_attr.3x.html">curs_attr(3x)</A></STRONG>
+                    wattr_set                <STRONG><A HREF="curs_attr.3x.html">curs_attr(3x)</A></STRONG>
+                    wattroff                 <STRONG><A HREF="curs_attr.3x.html">curs_attr(3x)</A></STRONG>
+                    wattron                  <STRONG><A HREF="curs_attr.3x.html">curs_attr(3x)</A></STRONG>
+                    wattrset                 <STRONG><A HREF="curs_attr.3x.html">curs_attr(3x)</A></STRONG>
+                    wbkgd                    <STRONG><A HREF="curs_bkgd.3x.html">curs_bkgd(3x)</A></STRONG>
+                    wbkgdset                 <STRONG><A HREF="curs_bkgd.3x.html">curs_bkgd(3x)</A></STRONG>
+                    wbkgrnd                  <STRONG><A HREF="curs_bkgrnd.3x.html">curs_bkgrnd(3x)</A></STRONG>
+                    wbkgrndset               <STRONG><A HREF="curs_bkgrnd.3x.html">curs_bkgrnd(3x)</A></STRONG>
+                    wborder                  <STRONG><A HREF="curs_border.3x.html">curs_border(3x)</A></STRONG>
+                    wborder_set              <STRONG><A HREF="curs_border_set.3x.html">curs_border_set(3x)</A></STRONG>
+                    wchgat                   <STRONG><A HREF="curs_attr.3x.html">curs_attr(3x)</A></STRONG>
+                    wclear                   <STRONG><A HREF="curs_clear.3x.html">curs_clear(3x)</A></STRONG>
+                    wclrtobot                <STRONG><A HREF="curs_clear.3x.html">curs_clear(3x)</A></STRONG>
+                    wclrtoeol                <STRONG><A HREF="curs_clear.3x.html">curs_clear(3x)</A></STRONG>
+                    wcolor_set               <STRONG><A HREF="curs_attr.3x.html">curs_attr(3x)</A></STRONG>
+                    wcursyncup               <STRONG><A HREF="curs_window.3x.html">curs_window(3x)</A></STRONG>
+                    wdelch                   <STRONG><A HREF="curs_delch.3x.html">curs_delch(3x)</A></STRONG>
+                    wdeleteln                <STRONG><A HREF="curs_deleteln.3x.html">curs_deleteln(3x)</A></STRONG>
+                    wecho_wchar              <STRONG><A HREF="curs_add_wch.3x.html">curs_add_wch(3x)</A></STRONG>
+                    wechochar                <STRONG><A HREF="curs_addch.3x.html">curs_addch(3x)</A></STRONG>
+                    wenclose                 <STRONG><A HREF="curs_mouse.3x.html">curs_mouse(3x)</A></STRONG>*
+                    werase                   <STRONG><A HREF="curs_clear.3x.html">curs_clear(3x)</A></STRONG>
+                    wget_wch                 <STRONG><A HREF="curs_get_wch.3x.html">curs_get_wch(3x)</A></STRONG>
+                    wget_wstr                <STRONG><A HREF="curs_get_wstr.3x.html">curs_get_wstr(3x)</A></STRONG>
+                    wgetbkgrnd               <STRONG><A HREF="curs_bkgrnd.3x.html">curs_bkgrnd(3x)</A></STRONG>
+                    wgetch                   <STRONG><A HREF="curs_getch.3x.html">curs_getch(3x)</A></STRONG>
+                    wgetdelay                <STRONG><A HREF="curs_opaque.3x.html">curs_opaque(3x)</A></STRONG>*
+                    wgetn_wstr               <STRONG><A HREF="curs_get_wstr.3x.html">curs_get_wstr(3x)</A></STRONG>
+                    wgetnstr                 <STRONG><A HREF="curs_getstr.3x.html">curs_getstr(3x)</A></STRONG>
+                    wgetparent               <STRONG><A HREF="curs_opaque.3x.html">curs_opaque(3x)</A></STRONG>*
+                    wgetscrreg               <STRONG><A HREF="curs_opaque.3x.html">curs_opaque(3x)</A></STRONG>*
+                    wgetstr                  <STRONG><A HREF="curs_getstr.3x.html">curs_getstr(3x)</A></STRONG>
+                    whline                   <STRONG><A HREF="curs_border.3x.html">curs_border(3x)</A></STRONG>
+                    whline_set               <STRONG><A HREF="curs_border_set.3x.html">curs_border_set(3x)</A></STRONG>
+                    win_wch                  <STRONG><A HREF="curs_in_wch.3x.html">curs_in_wch(3x)</A></STRONG>
+                    win_wchnstr              <STRONG><A HREF="curs_in_wchstr.3x.html">curs_in_wchstr(3x)</A></STRONG>
+                    win_wchstr               <STRONG><A HREF="curs_in_wchstr.3x.html">curs_in_wchstr(3x)</A></STRONG>
+                    winch                    <STRONG><A HREF="curs_inch.3x.html">curs_inch(3x)</A></STRONG>
+                    winchnstr                <STRONG><A HREF="curs_inchstr.3x.html">curs_inchstr(3x)</A></STRONG>
+                    winchstr                 <STRONG><A HREF="curs_inchstr.3x.html">curs_inchstr(3x)</A></STRONG>
+                    winnstr                  <STRONG><A HREF="curs_instr.3x.html">curs_instr(3x)</A></STRONG>
+                    winnwstr                 <STRONG><A HREF="curs_inwstr.3x.html">curs_inwstr(3x)</A></STRONG>
+                    wins_nwstr               <STRONG><A HREF="curs_ins_wstr.3x.html">curs_ins_wstr(3x)</A></STRONG>
+                    wins_wch                 <STRONG><A HREF="curs_ins_wch.3x.html">curs_ins_wch(3x)</A></STRONG>
+
+                    wins_wstr                <STRONG><A HREF="curs_ins_wstr.3x.html">curs_ins_wstr(3x)</A></STRONG>
+                    winsch                   <STRONG><A HREF="curs_insch.3x.html">curs_insch(3x)</A></STRONG>
+                    winsdelln                <STRONG><A HREF="curs_deleteln.3x.html">curs_deleteln(3x)</A></STRONG>
+                    winsertln                <STRONG><A HREF="curs_deleteln.3x.html">curs_deleteln(3x)</A></STRONG>
+                    winsnstr                 <STRONG><A HREF="curs_insstr.3x.html">curs_insstr(3x)</A></STRONG>
+                    winsstr                  <STRONG><A HREF="curs_insstr.3x.html">curs_insstr(3x)</A></STRONG>
+                    winstr                   <STRONG><A HREF="curs_instr.3x.html">curs_instr(3x)</A></STRONG>
+                    winwstr                  <STRONG><A HREF="curs_inwstr.3x.html">curs_inwstr(3x)</A></STRONG>
+                    wmouse_trafo             <STRONG><A HREF="curs_mouse.3x.html">curs_mouse(3x)</A></STRONG>*
+                    wmove                    <STRONG><A HREF="curs_move.3x.html">curs_move(3x)</A></STRONG>
+                    wnoutrefresh             <STRONG><A HREF="curs_refresh.3x.html">curs_refresh(3x)</A></STRONG>
+                    wprintw                  <STRONG><A HREF="curs_printw.3x.html">curs_printw(3x)</A></STRONG>
+                    wredrawln                <STRONG><A HREF="curs_refresh.3x.html">curs_refresh(3x)</A></STRONG>
+                    wrefresh                 <STRONG><A HREF="curs_refresh.3x.html">curs_refresh(3x)</A></STRONG>
+                    wresize                  <STRONG><A HREF="wresize.3x.html">wresize(3x)</A></STRONG>*
+                    wscanw                   <STRONG><A HREF="curs_scanw.3x.html">curs_scanw(3x)</A></STRONG>
+                    wscrl                    <STRONG><A HREF="curs_scroll.3x.html">curs_scroll(3x)</A></STRONG>
+                    wsetscrreg               <STRONG><A HREF="curs_outopts.3x.html">curs_outopts(3x)</A></STRONG>
+                    wstandend                <STRONG><A HREF="curs_attr.3x.html">curs_attr(3x)</A></STRONG>
+                    wstandout                <STRONG><A HREF="curs_attr.3x.html">curs_attr(3x)</A></STRONG>
+                    wsyncdown                <STRONG><A HREF="curs_window.3x.html">curs_window(3x)</A></STRONG>
+                    wsyncup                  <STRONG><A HREF="curs_window.3x.html">curs_window(3x)</A></STRONG>
+                    wtimeout                 <STRONG><A HREF="curs_inopts.3x.html">curs_inopts(3x)</A></STRONG>
+                    wtouchln                 <STRONG><A HREF="curs_touch.3x.html">curs_touch(3x)</A></STRONG>
+                    wunctrl                  <STRONG><A HREF="curs_util.3x.html">curs_util(3x)</A></STRONG>
+                    wvline                   <STRONG><A HREF="curs_border.3x.html">curs_border(3x)</A></STRONG>
+                    wvline_set               <STRONG><A HREF="curs_border_set.3x.html">curs_border_set(3x)</A></STRONG>
+
+       Depending on the configuration, additional sets  of  functions  may  be
+       available:
+
+          <STRONG><A HREF="curs_memleaks.3x.html">curs_memleaks(3x)</A></STRONG> - curses memory-leak checking
+
+          <STRONG><A HREF="curs_sp_funcs.3x.html">curs_sp_funcs(3x)</A></STRONG> - curses screen-pointer extension
+
+          <STRONG><A HREF="curs_threads.3x.html">curs_threads(3x)</A></STRONG> - curses thread support
+
+          <STRONG><A HREF="curs_trace.3x.html">curs_trace(3x)</A></STRONG> - curses debugging routines
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       Routines  that return an integer return <STRONG>ERR</STRONG> upon failure and an integer
+       value other than <STRONG>ERR</STRONG> upon successful completion, unless otherwise noted
+       in the routine descriptions.
+
+       As  a  general  rule,  routines  check  for  null  pointers  passed  as
+       parameters, and handle this as an error.
+
+       All macros return  the  value  of  the  <STRONG>w</STRONG>  version,  except  <STRONG>setscrreg</STRONG>,
+       <STRONG>wsetscrreg</STRONG>,  <STRONG>getyx</STRONG>,  <STRONG>getbegyx</STRONG>,  and  <STRONG>getmaxyx</STRONG>.   The  return  values of
+       <STRONG>setscrreg</STRONG>, <STRONG>wsetscrreg</STRONG>, <STRONG>getyx</STRONG>,  <STRONG>getbegyx</STRONG>,  and  <STRONG>getmaxyx</STRONG>  are  undefined
+       (i.e.,  these  should  not be used as the right-hand side of assignment
+       statements).
+
+       Functions with a "mv" prefix first  perform  a  cursor  movement  using
+       <STRONG>wmove</STRONG>, and return an error if the position is outside the window, or if
+       the window pointer  is  null.   Most  "mv"-prefixed  functions  (except
+       variadic  functions  such  as <STRONG>mvprintw</STRONG>) are provided both as macros and
+       functions.
+
+       Routines that return pointers return <STRONG>NULL</STRONG> on error.
+
+
+</PRE><H2><a name="h2-ENVIRONMENT">ENVIRONMENT</a></H2><PRE>
+       The following  environment  symbols  are  useful  for  customizing  the
+       runtime  behavior of the <STRONG>ncurses</STRONG> library.  The most important ones have
+       been already discussed in detail.
+
+
+</PRE><H3><a name="h3-CC-command-character">CC command-character</a></H3><PRE>
+       When set, change occurrences of the command_character (i.e., the  <STRONG>cmdch</STRONG>
+       capability)  of  the  loaded  terminfo  entries  to  the  value of this
+       variable.  Very few terminfo entries provide this feature.
+
+       Because this name is also used in development environments to represent
+       the C compiler's name, <STRONG>ncurses</STRONG> ignores it if it does not happen to be a
+       single character.
+
+
+</PRE><H3><a name="h3-BAUDRATE">BAUDRATE</a></H3><PRE>
+       The  debugging  library  checks  this  environment  variable  when  the
+       application  has  redirected  output to a file.  The variable's numeric
+       value is used for the baudrate.  If no value  is  found,  <STRONG>ncurses</STRONG>  uses
+       9600.  This allows testers to construct repeatable test-cases that take
+       into account costs that depend on baudrate.
+
+
+</PRE><H3><a name="h3-COLUMNS">COLUMNS</a></H3><PRE>
+       Specify the width of the screen in characters.  Applications running in
+       a  windowing  environment  usually  are able to obtain the width of the
+       window in which they are executing.  If neither the <STRONG>COLUMNS</STRONG>  value  nor
+       the  terminal's  screen  size is available, <STRONG>ncurses</STRONG> uses the size which
+       may be specified in the terminfo database (i.e., the <STRONG>cols</STRONG> capability).
+
+       It is important that your  application  use  a  correct  size  for  the
+       screen.   This  is  not always possible because your application may be
+       running on a host which does not honor NAWS (Negotiations About  Window
+       Size),  or  because  you  are  temporarily  running  as  another  user.
+       However, setting <STRONG>COLUMNS</STRONG> and/or <STRONG>LINES</STRONG> overrides the  library's  use  of
+       the screen size obtained from the operating system.
+
+       Either  <STRONG>COLUMNS</STRONG>  or <STRONG>LINES</STRONG> symbols may be specified independently.  This
+       is  mainly  useful  to  circumvent  legacy  misfeatures   of   terminal
+       descriptions,  e.g.,  xterm  which commonly specifies a 65 line screen.
+       For best results, <STRONG>lines</STRONG> and <STRONG>cols</STRONG> should not be specified in a  terminal
+       description for terminals which are run as emulations.
+
+       Use  the  <STRONG>use_env</STRONG>  function  to disable all use of external environment
+       (but not including system calls) to determine the screen size.  Use the
+       <STRONG>use_tioctl</STRONG> function to update <STRONG>COLUMNS</STRONG> or <STRONG>LINES</STRONG> to match the screen size
+       obtained from system calls or the terminal database.
+
+
+</PRE><H3><a name="h3-ESCDELAY">ESCDELAY</a></H3><PRE>
+       Specifies the total time, in milliseconds, for which ncurses will await
+       a  character  sequence,  e.g., a function key.  The default value, 1000
+       milliseconds, is enough for most uses.  However, it is made a  variable
+       to accommodate unusual applications.
+
+       The  most common instance where you may wish to change this value is to
+       work with slow hosts, e.g., running on a network.  If the  host  cannot
+       read  characters rapidly enough, it will have the same effect as if the
+       terminal did not send characters  rapidly  enough.   The  library  will
+       still see a timeout.
+
+       Note  that  xterm  mouse  events  are built up from character sequences
+       received from the xterm.   If  your  application  makes  heavy  use  of
+       multiple-clicking,  you may wish to lengthen this default value because
+       the timeout applies to the composed multi-click event as  well  as  the
+       individual clicks.
+
+       In addition to the environment variable, this implementation provides a
+       global variable with the same name.  Portable applications  should  not
+       rely  upon  the  presence  of  ESCDELAY in either form, but setting the
+       environment variable rather than the global variable  does  not  create
+       problems when compiling an application.
+
+
+</PRE><H3><a name="h3-HOME">HOME</a></H3><PRE>
+       Tells  <STRONG>ncurses</STRONG> where your home directory is.  That is where it may read
+       and write auxiliary terminal descriptions:
+
+           $HOME/.termcap
+           $HOME/.terminfo
+
+
+</PRE><H3><a name="h3-LINES">LINES</a></H3><PRE>
+       Like COLUMNS, specify the height of  the  screen  in  characters.   See
+       COLUMNS for a detailed description.
+
+
+</PRE><H3><a name="h3-MOUSE_BUTTONS_123">MOUSE_BUTTONS_123</a></H3><PRE>
+       This  applies  only  to  the  OS/2 EMX port.  It specifies the order of
+       buttons on the mouse.  OS/2 numbers  a  3-button  mouse  inconsistently
+       from other platforms:
+
+           1 = left
+           2 = right
+           3 = middle.
+
+       This variable lets you customize the mouse.  The variable must be three
+       numeric digits 1-3 in any order, e.g.,  123  or  321.   If  it  is  not
+       specified, <STRONG>ncurses</STRONG> uses 132.
+
+
+</PRE><H3><a name="h3-NCURSES_ASSUMED_COLORS">NCURSES_ASSUMED_COLORS</a></H3><PRE>
+       Override  the compiled-in assumption that the terminal's default colors
+       are  white-on-black  (see  <STRONG><A HREF="default_colors.3x.html">default_colors(3x)</A></STRONG>).   You   may   set   the
+       foreground  and  background color values with this environment variable
+       by proving a 2-element list: foreground,background.   For  example,  to
+       tell  ncurses  to  not  assume  anything  about the colors, set this to
+       "-1,-1".  To make it green-on-black, set it  to  "2,0".   Any  positive
+       value from zero to the terminfo <STRONG>max_colors</STRONG> value is allowed.
+
+
+</PRE><H3><a name="h3-NCURSES_CONSOLE2">NCURSES_CONSOLE2</a></H3><PRE>
+       This applies only to the MinGW port of ncurses.
+
+       The  <STRONG>Console2</STRONG>  program's  handling  of  the  Microsoft Console API call
+       <STRONG>CreateConsoleScreenBuffer</STRONG> is defective.  Applications  which  use  this
+       will hang.  However, it is possible to simulate the action of this call
+       by mapping coordinates, explicitly saving and  restoring  the  original
+       screen  contents.   Setting the environment variable <STRONG>NCGDB</STRONG> has the same
+       effect.
+
+
+</PRE><H3><a name="h3-NCURSES_GPM_TERMS">NCURSES_GPM_TERMS</a></H3><PRE>
+       This applies only to ncurses configured to use the GPM interface.
+
+       If present, the environment variable is a list of one or more  terminal
+       names  against which the <STRONG>TERM</STRONG> environment variable is matched.  Setting
+       it to an empty value disables the GPM  interface;  using  the  built-in
+       support for xterm, etc.
+
+       If the environment variable is absent, ncurses will attempt to open GPM
+       if <STRONG>TERM</STRONG> contains "linux".
+
+
+</PRE><H3><a name="h3-NCURSES_NO_HARD_TABS">NCURSES_NO_HARD_TABS</a></H3><PRE>
+       <STRONG>Ncurses</STRONG> may use tabs as part of the cursor movement  optimization.   In
+       some  cases,  your  terminal driver may not handle these properly.  Set
+       this environment variable to disable the feature.  You can also  adjust
+       your <STRONG>stty(1)</STRONG> settings to avoid the problem.
+
+
+</PRE><H3><a name="h3-NCURSES_NO_MAGIC_COOKIE">NCURSES_NO_MAGIC_COOKIE</a></H3><PRE>
+       Some  terminals  use  a  magic-cookie  feature  which  requires special
+       handling to  make  highlighting  and  other  video  attributes  display
+       properly.   You  can  suppress  the  highlighting  entirely  for  these
+       terminals by setting this environment variable.
+
+
+</PRE><H3><a name="h3-NCURSES_NO_PADDING">NCURSES_NO_PADDING</a></H3><PRE>
+       Most of the terminal descriptions in the terminfo database are  written
+       for  real  "hardware"  terminals.   Many  people use terminal emulators
+       which run in a windowing environment and use curses-based applications.
+       Terminal  emulators  can  duplicate  all  of the important aspects of a
+       hardware terminal, but they do not  have  the  same  limitations.   The
+       chief  limitation  of  a  hardware terminal from the standpoint of your
+       application is the management of  dataflow,  i.e.,  timing.   Unless  a
+       hardware  terminal  is  interfaced  into a terminal concentrator (which
+       does flow control), it (or  your  application)  must  manage  dataflow,
+       preventing  overruns.   The cheapest solution (no hardware cost) is for
+       your program to do this by pausing after operations that  the  terminal
+       does slowly, such as clearing the display.
+
+       As  a  result,  many  terminal  descriptions (including the vt100) have
+       delay times embedded.  You may wish to use these descriptions, but  not
+       want to pay the performance penalty.
+
+       Set  the  NCURSES_NO_PADDING  environment  variable  to disable all but
+       mandatory padding.  Mandatory padding is used  as  a  part  of  special
+       control sequences such as <STRONG>flash</STRONG>.
+
+
+</PRE><H3><a name="h3-NCURSES_NO_SETBUF">NCURSES_NO_SETBUF</a></H3><PRE>
+       This setting is obsolete.  Before changes
+
+          <STRONG>o</STRONG>   started with 5.9 patch 20120825 and
+
+          <STRONG>o</STRONG>   continued though 5.9 patch 20130126
+
+       <STRONG>ncurses</STRONG>  enabled  buffered output during terminal initialization.  This
+       was done (as in SVr4 curses)  for  performance  reasons.   For  testing
+       purposes,  both  of  <STRONG>ncurses</STRONG> and certain applications, this feature was
+       made optional.  Setting the NCURSES_NO_SETBUF variable disabled  output
+       buffering,  leaving  the output in the original (usually line buffered)
+       mode.
+
+       In the current implementation, ncurses performs its own  buffering  and
+       does  not require this workaround.  It does not modify the buffering of
+       the standard output.
+
+       The reason for the change was to make the behavior for  interrupts  and
+       other   signals   more   robust.    One   drawback   is   that  certain
+       nonconventional programs would mix ordinary stdio  calls  with  ncurses
+       calls  and (usually) work.  This is no longer possible since ncurses is
+       not using the buffered standard output but its own output (to the  same
+       file  descriptor).  As a special case, the low-level calls such as <STRONG>putp</STRONG>
+       still use the standard output.  But high-level curses calls do not.
+
+
+</PRE><H3><a name="h3-NCURSES_NO_UTF8_ACS">NCURSES_NO_UTF8_ACS</a></H3><PRE>
+       During initialization, the <STRONG>ncurses</STRONG> library  checks  for  special  cases
+       where VT100 line-drawing (and the corresponding alternate character set
+       capabilities) described in  the  terminfo  are  known  to  be  missing.
+       Specifically,  when  running  in  a  UTF-8  locale,  the  Linux console
+       emulator and the GNU screen program ignore these.  Ncurses  checks  the
+       <STRONG>TERM</STRONG>  environment  variable  for  these.   For other special cases, you
+       should set this environment variable.  Doing this tells ncurses to  use
+       Unicode values which correspond to the VT100 line-drawing glyphs.  That
+       works for the special cases cited, and is likely to work  for  terminal
+       emulators.
+
+       When  setting  this  variable,  you  should  set it to a nonzero value.
+       Setting it to zero (or to a nonnumber) disables the special  check  for
+       "linux" and "screen".
+
+       As  an  alternative  to the environment variable, ncurses checks for an
+       extended terminfo capability <STRONG>U8</STRONG>.  This is a  numeric  capability  which
+       can be compiled using <STRONG>tic</STRONG> <STRONG>-x</STRONG>.  For example
+
+          # linux console, if patched to provide working
+          # VT100 shift-in/shift-out, with corresponding font.
+          linux-vt100|linux console with VT100 line-graphics,
+                  U8#0, use=linux,
+
+          # uxterm with vt100Graphics resource set to false
+          xterm-utf8|xterm relying on UTF-8 line-graphics,
+                  U8#1, use=xterm,
+
+       The  name  "U8" is chosen to be two characters, to permit it to be used
+       by applications that use ncurses' termcap interface.
+
+
+</PRE><H3><a name="h3-NCURSES_TRACE">NCURSES_TRACE</a></H3><PRE>
+       During  initialization,  the  <STRONG>ncurses</STRONG>  debugging  library  checks   the
+       NCURSES_TRACE  environment  variable.   If  it is defined, to a numeric
+       value, <STRONG>ncurses</STRONG> calls the  <STRONG>trace</STRONG>  function,  using  that  value  as  the
+       argument.
+
+       The  argument  values,  which  are defined in <STRONG>curses.h</STRONG>, provide several
+       types  of  information.   When  running  with  traces   enabled,   your
+       application will write the file <STRONG>trace</STRONG> to the current directory.
+
+       See <STRONG><A HREF="curs_trace.3x.html">curs_trace(3x)</A></STRONG> for more information.
+
+
+</PRE><H3><a name="h3-TERM">TERM</a></H3><PRE>
+       Denotes  your  terminal  type.   Each terminal type is distinct, though
+       many are similar.
+
+       <STRONG>TERM</STRONG> is commonly set by terminal emulators to help applications find  a
+       workable   terminal  description.   Some  of  those  choose  a  popular
+       approximation, e.g., "ansi", "vt100", "xterm" rather than an exact fit.
+       Not  infrequently,  your  application  will  have  problems  with  that
+       approach, e.g., incorrect function-key definitions.
+
+       If you set <STRONG>TERM</STRONG> in your environment, it has no effect on the  operation
+       of  the  terminal  emulator.  It only affects the way applications work
+       within the terminal.  Likewise, as a general  rule  (<STRONG>xterm(1)</STRONG>  being  a
+       rare  exception), terminal emulators which allow you to specify <STRONG>TERM</STRONG> as
+       a parameter or configuration value do  not  change  their  behavior  to
+       match that setting.
+
+
+</PRE><H3><a name="h3-TERMCAP">TERMCAP</a></H3><PRE>
+       If  the  <STRONG>ncurses</STRONG>  library  has  been  configured  with <EM>termcap</EM> support,
+       <STRONG>ncurses</STRONG> will check for a terminal's description in termcap form  if  it
+       is not available in the terminfo database.
+
+       The <STRONG>TERMCAP</STRONG> environment variable contains either a terminal description
+       (with newlines  stripped  out),  or  a  file  name  telling  where  the
+       information denoted by the <STRONG>TERM</STRONG> environment variable exists.  In either
+       case, setting it directs <STRONG>ncurses</STRONG> to ignore the  usual  place  for  this
+       information, e.g., /etc/termcap.
+
+
+</PRE><H3><a name="h3-TERMINFO">TERMINFO</a></H3><PRE>
+       <STRONG>ncurses</STRONG>  can  be  configured  to read from multiple terminal databases.
+       The <STRONG>TERMINFO</STRONG> variable overrides the location for the  default  terminal
+       database.   Terminal  descriptions  (in  terminal format) are stored in
+       terminal databases:
+
+       <STRONG>o</STRONG>   Normally these are stored in a directory tree, using subdirectories
+           named by the first letter of the terminal names therein.
+
+           This is the scheme used in System V, which legacy Unix systems use,
+           and the <STRONG>TERMINFO</STRONG> variable is used by <EM>curses</EM> applications  on  those
+           systems to override the default location of the terminal database.
+
+       <STRONG>o</STRONG>   If  <STRONG>ncurses</STRONG>  is  built  to use hashed databases, then each entry in
+           this list may be the path of a hashed database file, e.g.,
+
+               /usr/share/terminfo.db
+
+           rather than
+
+               /usr/share/terminfo/
+
+           The hashed database uses less disk-space and  is  a  little  faster
+           than  the  directory  tree.   However, some applications assume the
+           existence of the directory tree, reading it  directly  rather  than
+           using the terminfo library calls.
+
+       <STRONG>o</STRONG>   If  <STRONG>ncurses</STRONG>  is  built  with  a  support  for reading termcap files
+           directly, then an entry in this list may be the path of  a  termcap
+           file.
+
+       <STRONG>o</STRONG>   If the <STRONG>TERMINFO</STRONG> variable begins with "hex:" or "b64:", <STRONG>ncurses</STRONG> uses
+           the remainder of that variable as a compiled terminal  description.
+           You might produce the base64 format using <STRONG><A HREF="infocmp.1m.html">infocmp(1m)</A></STRONG>:
+
+               TERMINFO="$(infocmp -0 -Q2 -q)"
+               export TERMINFO
+
+           The  compiled description is used if it corresponds to the terminal
+           identified by the <STRONG>TERM</STRONG> variable.
+
+       Setting <STRONG>TERMINFO</STRONG> is the simplest, but not the only way to set  location
+       of  the  default  terminal  database.   The  complete  list of database
+       locations in order follows:
+
+          <STRONG>o</STRONG>   the last terminal database to which <STRONG>ncurses</STRONG> wrote,  if  any,  is
+              searched first
+
+          <STRONG>o</STRONG>   the location specified by the TERMINFO environment variable
+
+          <STRONG>o</STRONG>   $HOME/.terminfo
+
+          <STRONG>o</STRONG>   locations listed in the TERMINFO_DIRS environment variable
+
+          <STRONG>o</STRONG>   one  or  more  locations whose names are configured and compiled
+              into the ncurses library, i.e.,
+
+             <STRONG>o</STRONG>   no  default  value  (corresponding   to   the   TERMINFO_DIRS
+                 variable)
+
+             <STRONG>o</STRONG>   /usr/share/terminfo (corresponding to the TERMINFO variable)
+
+
+</PRE><H3><a name="h3-TERMINFO_DIRS">TERMINFO_DIRS</a></H3><PRE>
+       Specifies  a  list  of  locations  to search for terminal descriptions.
+       Each location in the list is a terminal database as  described  in  the
+       section  on  the  <STRONG>TERMINFO</STRONG>  variable.   The list is separated by colons
+       (i.e., ":") on Unix, semicolons on OS/2 EMX.
+
+       There is no corresponding feature  in  System  V  terminfo;  it  is  an
+       extension developed for <STRONG>ncurses</STRONG>.
+
+
+</PRE><H3><a name="h3-TERMPATH">TERMPATH</a></H3><PRE>
+       If  <STRONG>TERMCAP</STRONG>  does not hold a file name then <STRONG>ncurses</STRONG> checks the <STRONG>TERMPATH</STRONG>
+       environment variable.  This is a list of filenames separated by  spaces
+       or colons (i.e., ":") on Unix, semicolons on OS/2 EMX.
+
+       If  the  <STRONG>TERMPATH</STRONG> environment variable is not set, <STRONG>ncurses</STRONG> looks in the
+       files
+
+           /etc/termcap, /usr/share/misc/termcap and $HOME/.termcap,
+
+       in that order.
+
+       The library may be configured to disregard the following variables when
+       the  current  user  is the superuser (root), or if the application uses
+       setuid or setgid permissions:
+
+           $TERMINFO, $TERMINFO_DIRS, $TERMPATH, as well as $HOME.
+
+
+</PRE><H2><a name="h2-ALTERNATE-CONFIGURATIONS">ALTERNATE CONFIGURATIONS</a></H2><PRE>
+       Several  different  configurations  are  possible,  depending  on   the
+       configure  script  options used when building <STRONG>ncurses</STRONG>.  There are a few
+       main options whose effects are visible to  the  applications  developer
+       using <STRONG>ncurses</STRONG>:
+
+       --disable-overwrite
+            The standard include for <STRONG>ncurses</STRONG> is as noted in <STRONG>SYNOPSIS</STRONG>:
+
+                <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+            This  option  is  used to avoid filename conflicts when <STRONG>ncurses</STRONG> is
+            not the main implementation of curses of the computer.  If <STRONG>ncurses</STRONG>
+            is  installed  disabling  overwrite,  it  puts  its  headers  in a
+            subdirectory, e.g.,
+
+                <STRONG>#include</STRONG> <STRONG>&lt;ncurses/curses.h&gt;</STRONG>
+
+            It also omits a  symbolic  link  which  would  allow  you  to  use
+            <STRONG>-lcurses</STRONG> to build executables.
+
+       --enable-widec
+            The   configure   script   renames   the   library   and  (if  the
+            <STRONG>--disable-overwrite</STRONG> option is used) puts the  header  files  in  a
+            different  subdirectory.   All  of  the  library  names have a "w"
+            appended to them, i.e., instead of
+
+                <STRONG>-lncurses</STRONG>
+
+            you link with
+
+                <STRONG>-lncursesw</STRONG>
+
+            You must also enable the wide-character  features  in  the  header
+            file  when  compiling  for  the  wide-character library to use the
+            extended (wide-character) functions.   The  symbol  which  enables
+            these features has changed since XSI Curses, Issue 4:
+
+            <STRONG>o</STRONG>   Originally,  the  wide-character  feature  required the symbol
+                <STRONG>_XOPEN_SOURCE_EXTENDED</STRONG>  but  that  was  only  valid  for  XPG4
+                (1996).
+
+            <STRONG>o</STRONG>   Later,  that was deemed conflicting with <STRONG>_XOPEN_SOURCE</STRONG> defined
+                to 500.
+
+            <STRONG>o</STRONG>   As of mid-2018, none of the features  in  this  implementation
+                require  a  <STRONG>_XOPEN_SOURCE</STRONG>  feature greater than 600.  However,
+                X/Open Curses, Issue 7 (2009) recommends defining it to 700.
+
+            <STRONG>o</STRONG>   Alternatively,  you  can  enable  the  feature   by   defining
+                <STRONG>NCURSES_WIDECHAR</STRONG>  with  the caveat that some other header file
+                than <STRONG>curses.h</STRONG> may require a specific value  for  <STRONG>_XOPEN_SOURCE</STRONG>
+                (or a system-specific symbol).
+
+            The  <STRONG>curses.h</STRONG>  file  which  is  installed  for  the wide-character
+            library is designed to be compatible  with  the  normal  library's
+            header.   Only  the size of the <STRONG>WINDOW</STRONG> structure differs, and very
+            few applications require more than a pointer to <STRONG>WINDOW</STRONG>s.
+
+            If  the  headers  are  installed  allowing  overwrite,  the  wide-
+            character  library's  headers  should  be installed last, to allow
+            applications to be built using either library from the same set of
+            headers.
+
+       --with-pthread
+            The  configure  script  renames  the  library.  All of the library
+            names have a "t"  appended  to  them  (before  any  "w"  added  by
+            <STRONG>--enable-widec</STRONG>).
+
+            The global variables such as <STRONG>LINES</STRONG> are replaced by macros to allow
+            read-only access.  At the same time, setter-functions are provided
+            to  set  these  values.   Some applications (very few) may require
+            changes to work with this convention.
+
+       --with-shared
+
+       --with-normal
+
+       --with-debug
+
+       --with-profile
+            The shared and normal  (static)  library  names  differ  by  their
+            suffixes,  e.g.,  <STRONG>libncurses.so</STRONG>  and  <STRONG>libncurses.a</STRONG>.  The debug and
+            profiling libraries add a "_g"  and  a  "_p"  to  the  root  names
+            respectively, e.g., <STRONG>libncurses_g.a</STRONG> and <STRONG>libncurses_p.a</STRONG>.
+
+       --with-termlib
+            Low-level  functions  which do not depend upon whether the library
+            supports wide-characters, are provided in the tinfo library.
+
+            By doing this, it is possible to share the tinfo  library  between
+            wide/normal  configurations  as  well  as  reduce  the size of the
+            library when only low-level functions are needed.
+
+            Those functions are described in these pages:
+
+            <STRONG>o</STRONG>   <STRONG><A HREF="curs_extend.3x.html">curs_extend(3x)</A></STRONG> - miscellaneous curses extensions
+
+            <STRONG>o</STRONG>   <STRONG><A HREF="curs_inopts.3x.html">curs_inopts(3x)</A></STRONG> - <STRONG>curses</STRONG> input options
+
+            <STRONG>o</STRONG>   <STRONG><A HREF="curs_kernel.3x.html">curs_kernel(3x)</A></STRONG> - low-level <STRONG>curses</STRONG> routines
+
+            <STRONG>o</STRONG>   <STRONG><A HREF="curs_termattrs.3x.html">curs_termattrs(3x)</A></STRONG> - <STRONG>curses</STRONG> environment query routines
+
+            <STRONG>o</STRONG>   <STRONG><A HREF="curs_termcap.3x.html">curs_termcap(3x)</A></STRONG> - <STRONG>curses</STRONG> emulation of termcap
+
+            <STRONG>o</STRONG>   <STRONG><A HREF="curs_terminfo.3x.html">curs_terminfo(3x)</A></STRONG> - <STRONG>curses</STRONG> interfaces to terminfo database
+
+            <STRONG>o</STRONG>   <STRONG><A HREF="curs_util.3x.html">curs_util(3x)</A></STRONG> - miscellaneous <STRONG>curses</STRONG> utility routines
+
+       --with-trace
+            The <STRONG>trace</STRONG> function normally resides in the debug library,  but  it
+            is  sometimes  useful  to  configure  this  in the shared library.
+            Configure scripts should check for the function's existence rather
+            than assuming it is always in the debug library.
+
+
+</PRE><H2><a name="h2-FILES">FILES</a></H2><PRE>
+       /usr/share/tabset
+            directory   containing   initialization  files  for  the  terminal
+            capability  database   /usr/share/terminfo   terminal   capability
+            database
+
+
+</PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
+       <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG>  and  related  pages whose names begin "curs_" for detailed
+       routine descriptions.
+       <STRONG><A HREF="curs_variables.3x.html">curs_variables(3x)</A></STRONG>
+       <STRONG><A HREF="user_caps.5.html">user_caps(5)</A></STRONG> for user-defined capabilities
+
+
+</PRE><H2><a name="h2-EXTENSIONS">EXTENSIONS</a></H2><PRE>
+       The <STRONG>ncurses</STRONG> library can be compiled with an option (<STRONG>-DUSE_GETCAP</STRONG>)  that
+       falls  back  to  the  old-style /etc/termcap file if the terminal setup
+       code cannot find a terminfo entry corresponding to <STRONG>TERM</STRONG>.  Use  of  this
+       feature  is  not  recommended,  as  it  essentially  includes an entire
+       termcap compiler in the <STRONG>ncurses</STRONG> startup code, at  significant  cost  in
+       core and startup cycles.
+
+       The  <STRONG>ncurses</STRONG>  library includes facilities for capturing mouse events on
+       certain terminals (including xterm).   See  the  <STRONG><A HREF="curs_mouse.3x.html">curs_mouse(3x)</A></STRONG>  manual
+       page for details.
+
+       The  <STRONG>ncurses</STRONG>  library  includes  facilities  for  responding  to window
+       resizing  events,  e.g.,  when  running   in   an   xterm.    See   the
+       <STRONG><A HREF="resizeterm.3x.html">resizeterm(3x)</A></STRONG>  and <STRONG><A HREF="wresize.3x.html">wresize(3x)</A></STRONG> manual pages for details.  In addition,
+       the library may be configured with a <STRONG>SIGWINCH</STRONG> handler.
+
+       The <STRONG>ncurses</STRONG> library extends the fixed set of function key  capabilities
+       of  terminals by allowing the application designer to define additional
+       key sequences at runtime.  See the <STRONG><A HREF="define_key.3x.html">define_key(3x)</A></STRONG> <STRONG><A HREF="key_defined.3x.html">key_defined(3x)</A></STRONG>,  and
+       <STRONG><A HREF="keyok.3x.html">keyok(3x)</A></STRONG> manual pages for details.
+
+       The  <STRONG>ncurses</STRONG>  library  can  exploit the capabilities of terminals which
+       implement the ISO-6429 SGR 39 and  SGR  49  controls,  which  allow  an
+       application  to  reset  the  terminal  to  its  original foreground and
+       background colors.  From the users'  perspective,  the  application  is
+       able  to  draw  colored  text  on  a  background  whose  color  is  set
+       independently, providing better control over color contrasts.  See  the
+       <STRONG><A HREF="default_colors.3x.html">default_colors(3x)</A></STRONG> manual page for details.
+
+       The  <STRONG>ncurses</STRONG>  library  includes  a  function  for directing application
+       output  to  a  printer  attached  to  the  terminal  device.   See  the
+       <STRONG><A HREF="curs_print.3x.html">curs_print(3x)</A></STRONG> manual page for details.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       The  <STRONG>ncurses</STRONG>  library  is intended to be BASE-level conformant with XSI
+       Curses.   The  EXTENDED  XSI  Curses  functionality  (including   color
+       support) is supported.
+
+       A  small  number  of local differences (that is, individual differences
+       between the XSI Curses and <STRONG>ncurses</STRONG> calls) are described in  <STRONG>PORTABILITY</STRONG>
+       sections of the library man pages.
+
+
+</PRE><H3><a name="h3-Error-checking">Error checking</a></H3><PRE>
+       In  many cases, X/Open Curses is vague about error conditions, omitting
+       some of the SVr4 documentation.
+
+       Unlike other  implementations,  this  one  checks  parameters  such  as
+       pointers  to  WINDOW  structures to ensure they are not null.  The main
+       reason for providing this  behavior  is  to  guard  against  programmer
+       error.   The  standard interface does not provide a way for the library
+       to tell an application which of several possible errors were  detected.
+       Relying  on  this  (or  some other) extension will adversely affect the
+       portability of curses applications.
+
+
+</PRE><H3><a name="h3-Extensions-versus-portability">Extensions versus portability</a></H3><PRE>
+       Most of the extensions provided by ncurses have not been  standardized.
+       Some  have  been  incorporated  into  other  implementations,  such  as
+       PDCurses or NetBSD curses.  Here are a few to consider:
+
+       <STRONG>o</STRONG>   The routine <STRONG>has_key</STRONG> is not part of XPG4, nor is it present in SVr4.
+           See the <STRONG><A HREF="curs_getch.3x.html">curs_getch(3x)</A></STRONG> manual page for details.
+
+       <STRONG>o</STRONG>   The  routine  <STRONG>slk_attr</STRONG>  is  not  part of XPG4, nor is it present in
+           SVr4.  See the <STRONG><A HREF="curs_slk.3x.html">curs_slk(3x)</A></STRONG> manual page for details.
+
+       <STRONG>o</STRONG>   The routines <STRONG>getmouse</STRONG>, <STRONG>mousemask</STRONG>,  <STRONG>ungetmouse</STRONG>,  <STRONG>mouseinterval</STRONG>,  and
+           <STRONG>wenclose</STRONG>  relating  to  mouse interfacing are not part of XPG4, nor
+           are they present in SVr4.  See the <STRONG><A HREF="curs_mouse.3x.html">curs_mouse(3x)</A></STRONG> manual  page  for
+           details.
+
+       <STRONG>o</STRONG>   The  routine  <STRONG>mcprint</STRONG>  was  not  present  in  any  previous  curses
+           implementation.  See the <STRONG><A HREF="curs_print.3x.html">curs_print(3x)</A></STRONG> manual page for details.
+
+       <STRONG>o</STRONG>   The routine <STRONG>wresize</STRONG> is not part of XPG4, nor is it present in SVr4.
+           See the <STRONG><A HREF="wresize.3x.html">wresize(3x)</A></STRONG> manual page for details.
+
+       <STRONG>o</STRONG>   The   WINDOW  structure's  internal  details  can  be  hidden  from
+           application programs.  See <STRONG><A HREF="curs_opaque.3x.html">curs_opaque(3x)</A></STRONG> for  the  discussion  of
+           <STRONG>is_scrollok</STRONG>, etc.
+
+       <STRONG>o</STRONG>   This  implementation  can  be  configured  to  provide  rudimentary
+           support for multi-threaded applications.  See <STRONG><A HREF="curs_threads.3x.html">curs_threads(3x)</A></STRONG>  for
+           details.
+
+       <STRONG>o</STRONG>   This  implementation  can  also  be  configured to provide a set of
+           functions which improve the ability  to  manage  multiple  screens.
+           See <STRONG><A HREF="curs_sp_funcs.3x.html">curs_sp_funcs(3x)</A></STRONG> for details.
+
+
+</PRE><H3><a name="h3-Padding-differences">Padding differences</a></H3><PRE>
+       In  historic  curses  versions, delays embedded in the capabilities <STRONG>cr</STRONG>,
+       <STRONG>ind</STRONG>, <STRONG>cub1</STRONG>, <STRONG>ff</STRONG> and <STRONG>tab</STRONG> activated corresponding delay bits  in  the  UNIX
+       tty driver.  In this implementation, all padding is done by sending NUL
+       bytes.  This  method  is  slightly  more  expensive,  but  narrows  the
+       interface  to the UNIX kernel significantly and increases the package's
+       portability correspondingly.
+
+
+</PRE><H3><a name="h3-Header-files">Header files</a></H3><PRE>
+       The header file <STRONG>&lt;curses.h&gt;</STRONG>  automatically  includes  the  header  files
+       <STRONG>&lt;stdio.h&gt;</STRONG> and <STRONG>&lt;unctrl.h&gt;</STRONG>.
+
+       X/Open Curses has more to say, but does not finish the story:
+
+           The  inclusion  of &lt;curses.h&gt; may make visible all symbols from the
+           headers &lt;stdio.h&gt;, &lt;term.h&gt;, &lt;termios.h&gt;, and &lt;wchar.h&gt;.
+
+       Here is a more complete story:
+
+       <STRONG>o</STRONG>   Starting  with  BSD  curses,  all  implementations  have   included
+           &lt;stdio.h&gt;.
+
+           BSD  curses  included  &lt;curses.h&gt;  and  &lt;unctrl.h&gt; from an internal
+           header "curses.ext" ("ext" was a short name for <EM>externs</EM>).
+
+           BSD curses used &lt;stdio.h&gt; internally (for <STRONG>printw</STRONG>  and  <STRONG>scanw</STRONG>),  but
+           nothing in &lt;curses.h&gt; itself relied upon &lt;stdio.h&gt;.
+
+       <STRONG>o</STRONG>   SVr2  curses  added <STRONG><A HREF="curs_initscr.3x.html">newterm(3x)</A></STRONG>, which relies upon &lt;stdio.h&gt;.  That
+           is, the function prototype uses <STRONG>FILE</STRONG>.
+
+           SVr4 curses added <STRONG>putwin</STRONG> and <STRONG>getwin</STRONG>, which also use &lt;stdio.h&gt;.
+
+           X/Open Curses documents all three of these functions.
+
+           SVr4 curses and X/Open Curses  do  not  require  the  developer  to
+           include  &lt;stdio.h&gt;  before  including  &lt;curses.h&gt;.   Both  document
+           curses showing &lt;curses.h&gt; as the only required header.
+
+           As a result, standard &lt;curses.h&gt; will always include &lt;stdio.h&gt;.
+
+       <STRONG>o</STRONG>   X/Open Curses  is  inconsistent  with  respect  to  SVr4  regarding
+           &lt;unctrl.h&gt;.
+
+           As   noted  in  <STRONG><A HREF="curs_util.3x.html">curs_util(3x)</A></STRONG>,  ncurses  includes  &lt;unctrl.h&gt;  from
+           &lt;curses.h&gt; (like SVr4).
+
+       <STRONG>o</STRONG>   X/Open's comments about &lt;term.h&gt; and &lt;termios.h&gt; may refer to HP-UX
+           and AIX:
+
+           HP-UX curses includes &lt;term.h&gt; from &lt;curses.h&gt; to declare <STRONG>setupterm</STRONG>
+           in curses.h, but ncurses (and Solaris curses) do not.
+
+           AIX curses includes &lt;term.h&gt; and &lt;termios.h&gt;.  Again, ncurses  (and
+           Solaris curses) do not.
+
+       <STRONG>o</STRONG>   X/Open  says  that &lt;curses.h&gt; <EM>may</EM> include &lt;term.h&gt;, but there is no
+           requirement that it do that.
+
+           Some  programs  use  functions  declared  in  both  &lt;curses.h&gt;  and
+           &lt;term.h&gt;,  and  must include both headers in the same module.  Very
+           old versions of AIX curses  required  including  &lt;curses.h&gt;  before
+           including &lt;term.h&gt;.
+
+           Because  ncurses  header files include the headers needed to define
+           datatypes used in the headers, ncurses header files can be included
+           in  any  order.  But for portability, you should include &lt;curses.h&gt;
+           before &lt;term.h&gt;.
+
+       <STRONG>o</STRONG>   X/Open Curses says <EM>"may</EM> <EM>make</EM> <EM>visible"</EM> because  including  a  header
+           file does not necessarily make all symbols in it visible (there are
+           ifdef's to consider).
+
+           For instance, in ncurses &lt;wchar.h&gt; <EM>may</EM> be included  if  the  proper
+           symbol  is defined, and if ncurses is configured for wide-character
+           support.  If the header  is  included,  its  symbols  may  be  made
+           visible.   That depends on the value used for <STRONG>_XOPEN_SOURCE</STRONG> feature
+           test macro.
+
+       <STRONG>o</STRONG>   X/Open Curses documents one required header,  in  a  special  case:
+           &lt;stdarg.h&gt;   before  &lt;curses.h&gt;  to  prototype  the  <STRONG>vw_printw</STRONG>  and
+           <STRONG>vw_scanw</STRONG> functions (as  well  as  the  obsolete  the  <STRONG>vwprintw</STRONG>  and
+           <STRONG>vwscanw</STRONG> functions).  Each of those uses a <STRONG>va_list</STRONG> parameter.
+
+           The  two  obsolete  functions  were  introduced in SVr3.  The other
+           functions were introduced  in  X/Open  Curses.   In  between,  SVr4
+           curses  provided  for  the  possibility  that  an application might
+           include either &lt;varargs.h&gt; or &lt;stdarg.h&gt;.  Initially, that was done
+           by  using  <STRONG>void*</STRONG>  for the <STRONG>va_list</STRONG> parameter.  Later, a special type
+           (defined in &lt;stdio.h&gt;) was introduced, to allow for compiler  type-
+           checking.  That special type is always available, because &lt;stdio.h&gt;
+           is always included by &lt;curses.h&gt;.
+
+           None of the X/Open Curses implementations require an application to
+           include  &lt;stdarg.h&gt;  before  &lt;curses.h&gt;  because  they  either have
+           allowed for a special type, or (like  ncurses)  include  &lt;stdarg.h&gt;
+           directly to provide a portable interface.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       If  standard  output from a <STRONG>ncurses</STRONG> program is re-directed to something
+       which is not a tty, screen updates will be directed to standard  error.
+       This was an undocumented feature of AT&amp;T System V Release 3 curses.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Zeyd M. Ben-Halim, Eric S. Raymond, Thomas E. Dickey.  Based on <EM>pcurses</EM>
+       by Pavel Curtis.
+
+
+
+                                                                   <STRONG><A HREF="ncurses.3x.html">ncurses(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-Datatypes">Datatypes</a></li>
+<li><a href="#h3-Environment-variables">Environment variables</a></li>
+<li><a href="#h3-Routine-and-Argument-Names">Routine and Argument Names</a></li>
+<li><a href="#h3-Routine-Name-Index">Routine Name Index</a></li>
+</ul>
+</li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-ENVIRONMENT">ENVIRONMENT</a>
+<ul>
+<li><a href="#h3-CC-command-character">CC command-character</a></li>
+<li><a href="#h3-BAUDRATE">BAUDRATE</a></li>
+<li><a href="#h3-COLUMNS">COLUMNS</a></li>
+<li><a href="#h3-ESCDELAY">ESCDELAY</a></li>
+<li><a href="#h3-HOME">HOME</a></li>
+<li><a href="#h3-LINES">LINES</a></li>
+<li><a href="#h3-MOUSE_BUTTONS_123">MOUSE_BUTTONS_123</a></li>
+<li><a href="#h3-NCURSES_ASSUMED_COLORS">NCURSES_ASSUMED_COLORS</a></li>
+<li><a href="#h3-NCURSES_CONSOLE2">NCURSES_CONSOLE2</a></li>
+<li><a href="#h3-NCURSES_GPM_TERMS">NCURSES_GPM_TERMS</a></li>
+<li><a href="#h3-NCURSES_NO_HARD_TABS">NCURSES_NO_HARD_TABS</a></li>
+<li><a href="#h3-NCURSES_NO_MAGIC_COOKIE">NCURSES_NO_MAGIC_COOKIE</a></li>
+<li><a href="#h3-NCURSES_NO_PADDING">NCURSES_NO_PADDING</a></li>
+<li><a href="#h3-NCURSES_NO_SETBUF">NCURSES_NO_SETBUF</a></li>
+<li><a href="#h3-NCURSES_NO_UTF8_ACS">NCURSES_NO_UTF8_ACS</a></li>
+<li><a href="#h3-NCURSES_TRACE">NCURSES_TRACE</a></li>
+<li><a href="#h3-TERM">TERM</a></li>
+<li><a href="#h3-TERMCAP">TERMCAP</a></li>
+<li><a href="#h3-TERMINFO">TERMINFO</a></li>
+<li><a href="#h3-TERMINFO_DIRS">TERMINFO_DIRS</a></li>
+<li><a href="#h3-TERMPATH">TERMPATH</a></li>
+</ul>
+</li>
+<li><a href="#h2-ALTERNATE-CONFIGURATIONS">ALTERNATE CONFIGURATIONS</a></li>
+<li><a href="#h2-FILES">FILES</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-EXTENSIONS">EXTENSIONS</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a>
+<ul>
+<li><a href="#h3-Error-checking">Error checking</a></li>
+<li><a href="#h3-Extensions-versus-portability">Extensions versus portability</a></li>
+<li><a href="#h3-Padding-differences">Padding differences</a></li>
+<li><a href="#h3-Header-files">Header files</a></li>
+</ul>
+</li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/ncurses6-config.1.html b/doc/html/man/ncurses6-config.1.html
new file mode 100644
index 0000000..0f64e3d
--- /dev/null
+++ b/doc/html/man/ncurses6-config.1.html
@@ -0,0 +1,132 @@
+<!--
+  ****************************************************************************
+  * Copyright 2020,2021 Thomas E. Dickey                                     *
+  * Copyright 2010 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: MKncu_config.in,v 1.6 2021/12/25 17:39:16 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>ncurses6-config 1</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">ncurses6-config 1</H1>
+<PRE>
+<STRONG><A HREF="ncurses6-config.1.html">ncurses6-config(1)</A></STRONG>          General Commands Manual         <STRONG><A HREF="ncurses6-config.1.html">ncurses6-config(1)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       ncurses6-config - helper script for ncurses libraries
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>ncurses6-config</STRONG> [<EM>options</EM>]
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       This  is  a  shell  script  which  simplifies  configuring applications
+       against a particular set of ncurses libraries.
+
+
+</PRE><H2><a name="h2-OPTIONS">OPTIONS</a></H2><PRE>
+       <STRONG>--prefix</STRONG>
+              echos the package-prefix of ncurses
+
+       <STRONG>--exec-prefix</STRONG>
+              echos the executable-prefix of ncurses
+
+       <STRONG>--cflags</STRONG>
+              echos the C compiler flags needed to compile with ncurses
+
+       <STRONG>--libs</STRONG> echos the libraries needed to link with ncurses
+
+       <STRONG>--version</STRONG>
+              echos the release+patchdate version of ncurses
+
+       <STRONG>--abi-version</STRONG>
+              echos the ABI version of ncurses
+
+       <STRONG>--mouse-version</STRONG>
+              echos the mouse-interface version of ncurses
+
+       <STRONG>--bindir</STRONG>
+              echos the directory containing ncurses programs
+
+       <STRONG>--datadir</STRONG>
+              echos the directory containing ncurses data
+
+       <STRONG>--includedir</STRONG>
+              echos the directory containing ncurses header files
+
+       <STRONG>--libdir</STRONG>
+              echos the directory containing ncurses libraries
+
+       <STRONG>--mandir</STRONG>
+              echos the directory containing ncurses manpages
+
+       <STRONG>--terminfo</STRONG>
+              echos the $TERMINFO terminfo database path, e.g.,
+              /usr/share/terminfo
+
+       <STRONG>--terminfo-dirs</STRONG>
+              echos the $TERMINFO_DIRS directory list, e.g.,
+              /usr/share/terminfo
+
+       <STRONG>--termpath</STRONG>
+              echos the $TERMPATH termcap list,  if  support  for  termcap  is
+              configured.
+
+       <STRONG>--help</STRONG> prints this message
+
+
+</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 20221231).
+
+
+
+                                                            <STRONG><A HREF="ncurses6-config.1.html">ncurses6-config(1)</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></li>
+<li><a href="#h2-OPTIONS">OPTIONS</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/new_pair.3x.html b/doc/html/man/new_pair.3x.html
new file mode 100644
index 0000000..524f96c
--- /dev/null
+++ b/doc/html/man/new_pair.3x.html
@@ -0,0 +1,187 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 2017 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.                                                           *
+  ****************************************************************************
+  * Author: Thomas E. Dickey
+  * @Id: new_pair.3x,v 1.19 2022/02/12 20:03:40 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>new_pair 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">new_pair 3x</H1>
+<PRE>
+<STRONG><A HREF="new_pair.3x.html">new_pair(3x)</A></STRONG>                                                      <STRONG><A HREF="new_pair.3x.html">new_pair(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>alloc_pair</STRONG>, <STRONG>find_pair</STRONG>, <STRONG>free_pair</STRONG> - new curses color-pair functions
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>alloc_pair(int</STRONG> <EM>fg</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>bg</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>find_pair(int</STRONG> <EM>fg</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>bg</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>free_pair(int</STRONG> <EM>pair</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       These functions are an extension to the curses library.  They permit an
+       application  to  dynamically  allocate   a   color   pair   using   the
+       foreground/background  colors  rather  than  assign  a fixed color pair
+       number, and return an unused pair to the pool.
+
+       The number of colors may be related to the  number  of  possible  color
+       pairs for a given terminal, or it may not:
+
+       <STRONG>o</STRONG>   While  almost  all  terminals  allow  setting  the color <EM>attributes</EM>
+           independently, it is unlikely that  your  terminal  allows  you  to
+           modify  the  attributes of a given character cell without rewriting
+           it.  That is, the foreground and background colors are applied as a
+           pair.
+
+       <STRONG>o</STRONG>   Color  pairs  are  the  curses  library's  way  of managing a color
+           palette on a terminal.  If the library does not keep track  of  the
+           <EM>combinations</EM> of colors which are displayed, it will be inefficient.
+
+       <STRONG>o</STRONG>   For   simple  terminal  emulators  with  only  a  few  dozen  color
+           combinations, it  is  convenient  to  use  the  maximum  number  of
+           combinations as the limit on color pairs:
+
+               <STRONG>COLORS</STRONG> <EM>*</EM> <STRONG>COLORS</STRONG>
+
+       <STRONG>o</STRONG>   Terminals  which support <EM>default</EM> <EM>colors</EM> distinct from "ANSI colors"
+           add to the possible combinations, producing this total:
+
+               <EM>(</EM> <STRONG>COLORS</STRONG> <EM>+</EM> <EM>1</EM> <EM>)</EM> <EM>*</EM> <EM>(</EM> <STRONG>COLORS</STRONG> <EM>+</EM> <EM>1</EM> <EM>)</EM>
+
+       <STRONG>o</STRONG>   An application might use up to a few dozen color pairs to implement
+           a predefined color scheme.
+
+           Beyond  that lies in the realm of programs using the foreground and
+           background colors  for  "ASCII  art"  (or  some  other  non-textual
+           application).
+
+           Also beyond those few dozen pairs, the required size for a table to
+           represent the combinations grows rapidly with an increasing  number
+           of colors.
+
+           These  functions allow a developer to let the screen library manage
+           color pairs.
+
+
+</PRE><H3><a name="h3-alloc_pair">alloc_pair</a></H3><PRE>
+       The  <STRONG>alloc_pair</STRONG>  function  accepts  parameters   for   foreground   and
+       background  color,  and  checks  if  that  color combination is already
+       associated with a color pair.
+
+       <STRONG>o</STRONG>   If the combination already exists, <STRONG>alloc_pair</STRONG> returns the  existing
+           pair.
+
+       <STRONG>o</STRONG>   If the combination does not exist, <STRONG>alloc_pair</STRONG> allocates a new color
+           pair and returns that.
+
+       <STRONG>o</STRONG>   If the table  fills  up,  <STRONG>alloc_pair</STRONG>  discards  the  least-recently
+           allocated entry using <STRONG>free_pair</STRONG> and allocates a new color pair.
+
+       All  of  the  color  pairs are allocated from a table of possible color
+       pairs.  The size of the table  is  determined  by  the  terminfo  <STRONG>pairs</STRONG>
+       capability.   The  table  is  shared with <STRONG>init_pair</STRONG>; in fact <STRONG>alloc_pair</STRONG>
+       calls <STRONG>init_pair</STRONG> after updating the ncurses library's fast index to  the
+       colors versus color pairs.
+
+
+</PRE><H3><a name="h3-find_pair">find_pair</a></H3><PRE>
+       The <STRONG>find_pair</STRONG> function accepts parameters for foreground and background
+       color, and checks if that color combination is already associated  with
+       a  color  pair,  returning  the  pair  number if it has been allocated.
+       Otherwise it returns -1.
+
+
+</PRE><H3><a name="h3-free_pair">free_pair</a></H3><PRE>
+       Marks the given color pair as unused, i.e., like color pair 0.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       The <STRONG>alloc_pair</STRONG> function returns a color pair  number  in  the  range  1
+       through  <STRONG>COLOR_PAIRS</STRONG>-1, unless it encounters an error updating its fast
+       index to the color pair values, preventing it from allocating  a  color
+       pair.  In that case, it returns -1.
+
+       The  <STRONG>find_pair</STRONG>  function returns a color pair number if the given color
+       combination has been associated with a color pair, or -1 if not.
+
+       Likewise, <STRONG>free_pair</STRONG> returns <STRONG>OK</STRONG> unless it encounters an  error  updating
+       the fast index or if no such color pair is in use.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       These  routines  are  specific  to ncurses.  They were not supported on
+       Version 7, BSD or System V implementations.  It is recommended that any
+       code depending on them be conditioned using NCURSES_VERSION.
+
+
+</PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
+       <STRONG><A HREF="curs_color.3x.html">curs_color(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-AUTHOR">AUTHOR</a></H2><PRE>
+       Thomas Dickey.
+
+
+
+                                                                  <STRONG><A HREF="new_pair.3x.html">new_pair(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-alloc_pair">alloc_pair</a></li>
+<li><a href="#h3-find_pair">find_pair</a></li>
+<li><a href="#h3-free_pair">free_pair</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>
+<li><a href="#h2-AUTHOR">AUTHOR</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/panel.3x.html b/doc/html/man/panel.3x.html
new file mode 100644
index 0000000..761a0fb
--- /dev/null
+++ b/doc/html/man/panel.3x.html
@@ -0,0 +1,336 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2016,2017 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: panel.3x,v 1.42 2022/02/12 20:03:40 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>panel 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">panel 3x</H1>
+<PRE>
+<STRONG><A HREF="panel.3x.html">panel(3x)</A></STRONG>                                                            <STRONG><A HREF="panel.3x.html">panel(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       panel - panel stack extension for curses
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;panel.h&gt;</STRONG>
+
+       <STRONG>cc</STRONG> <STRONG>[flags]</STRONG> <STRONG>sourcefiles</STRONG> <STRONG>-lpanel</STRONG> <STRONG>-lncurses</STRONG>
+
+       <STRONG>PANEL</STRONG> <STRONG>*new_panel(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>bottom_panel(PANEL</STRONG> <STRONG>*</STRONG><EM>pan</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>top_panel(PANEL</STRONG> <STRONG>*</STRONG><EM>pan</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>show_panel(PANEL</STRONG> <STRONG>*</STRONG><EM>pan</EM><STRONG>);</STRONG>
+       <STRONG>void</STRONG> <STRONG>update_panels(void);</STRONG>
+       <STRONG>int</STRONG> <STRONG>hide_panel(PANEL</STRONG> <STRONG>*</STRONG><EM>pan</EM><STRONG>);</STRONG>
+
+       <STRONG>WINDOW</STRONG> <STRONG>*panel_window(const</STRONG> <STRONG>PANEL</STRONG> <STRONG>*</STRONG><EM>pan</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>replace_panel(PANEL</STRONG> <STRONG>*</STRONG><EM>pan</EM><STRONG>,</STRONG> <STRONG>WINDOW</STRONG> <STRONG>*</STRONG><EM>window</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>move_panel(PANEL</STRONG> <STRONG>*</STRONG><EM>pan</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>starty</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>startx</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>panel_hidden(const</STRONG> <STRONG>PANEL</STRONG> <STRONG>*</STRONG><EM>pan</EM><STRONG>);</STRONG>
+
+       <STRONG>PANEL</STRONG> <STRONG>*panel_above(const</STRONG> <STRONG>PANEL</STRONG> <STRONG>*</STRONG><EM>pan</EM><STRONG>);</STRONG>
+       <STRONG>PANEL</STRONG> <STRONG>*panel_below(const</STRONG> <STRONG>PANEL</STRONG> <STRONG>*</STRONG><EM>pan</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>set_panel_userptr(PANEL</STRONG> <STRONG>*</STRONG><EM>pan</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>void</STRONG> <STRONG>*</STRONG><EM>ptr</EM><STRONG>);</STRONG>
+       <STRONG>const</STRONG> <STRONG>void</STRONG> <STRONG>*panel_userptr(const</STRONG> <STRONG>PANEL</STRONG> <STRONG>*</STRONG><EM>pan</EM><STRONG>);</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>del_panel(PANEL</STRONG> <STRONG>*</STRONG><EM>pan</EM><STRONG>);</STRONG>
+
+       /* ncurses-extensions */
+       <STRONG>PANEL</STRONG> <STRONG>*ground_panel(SCREEN</STRONG> <STRONG>*</STRONG><EM>sp</EM><STRONG>);</STRONG>
+       <STRONG>PANEL</STRONG> <STRONG>*ceiling_panel(SCREEN</STRONG> <STRONG>*</STRONG><EM>sp</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       Panels  are  <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG> windows with the added feature of depth.  Panel
+       functions allow the use  of  stacked  windows  and  ensure  the  proper
+       portions  of  each  window  and  the curses <STRONG>stdscr</STRONG> window are hidden or
+       displayed when panels are added, moved, modified or removed.   The  set
+       of  currently visible panels is the stack of panels.  The <STRONG>stdscr</STRONG> window
+       is beneath all panels, and is not considered part of the stack.
+
+       A window is associated with every panel.  The panel routines enable you
+       to  create, move, hide, and show panels, as well as position a panel at
+       any desired location in the stack.
+
+       Panel routines are a functional layer added to  <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG>,  make  only
+       high-level curses calls, and work anywhere terminfo curses does.
+
+
+</PRE><H2><a name="h2-FUNCTIONS">FUNCTIONS</a></H2><PRE>
+
+</PRE><H3><a name="h3-bottom_panel">bottom_panel</a></H3><PRE>
+       <STRONG>bottom_panel(</STRONG><EM>pan</EM><STRONG>)</STRONG> puts panel <EM>pan</EM> at the bottom of all panels.
+
+
+</PRE><H3><a name="h3-ceiling_panel">ceiling_panel</a></H3><PRE>
+       <STRONG>ceiling_panel(</STRONG><EM>sp</EM><STRONG>)</STRONG> acts like <STRONG>panel_below(NULL)</STRONG>, for the given <STRONG>SCREEN</STRONG> <EM>sp</EM>.
+
+
+</PRE><H3><a name="h3-del_panel">del_panel</a></H3><PRE>
+       <STRONG>del_panel(</STRONG><EM>pan</EM><STRONG>)</STRONG>  removes  the  given  panel  <EM>pan</EM>  from  the   stack  and
+       deallocates the <STRONG>PANEL</STRONG> structure (but not its associated window).
+
+
+</PRE><H3><a name="h3-ground_panel">ground_panel</a></H3><PRE>
+       <STRONG>ground_panel(</STRONG><EM>sp</EM><STRONG>)</STRONG> acts like <STRONG>panel_above(NULL)</STRONG>, for the given <STRONG>SCREEN</STRONG> <EM>sp</EM>.
+
+
+</PRE><H3><a name="h3-hide_panel">hide_panel</a></H3><PRE>
+       <STRONG>hide_panel(</STRONG><EM>pan</EM><STRONG>)</STRONG> removes the given panel <EM>pan</EM> from the  panel  stack  and
+       thus  hides  it  from  view.   The  <STRONG>PANEL</STRONG> structure is not lost, merely
+       removed from the stack.
+
+
+</PRE><H3><a name="h3-move_panel">move_panel</a></H3><PRE>
+       <STRONG>move_panel(</STRONG><EM>pan</EM><STRONG>,</STRONG><EM>starty</EM><STRONG>,</STRONG><EM>startx</EM><STRONG>)</STRONG> moves the given  panel  <EM>pan</EM>'s  window  so
+       that  its  upper-left  corner is at <EM>starty</EM>, <EM>startx</EM>.  It does not change
+       the position of the panel in the stack.  Be sure to use this  function,
+       not <STRONG><A HREF="curs_window.3x.html">mvwin(3x)</A></STRONG>, to move a panel window.
+
+
+</PRE><H3><a name="h3-new_panel">new_panel</a></H3><PRE>
+       <STRONG>new_panel(</STRONG><EM>win</EM><STRONG>)</STRONG>  allocates  a  <STRONG>PANEL</STRONG>  structure, associates it with <EM>win</EM>,
+       places the panel on the top of the stack (causes  it to  be   displayed
+       above any other panel) and returns a pointer to the new panel.
+
+
+</PRE><H3><a name="h3-panel_above">panel_above</a></H3><PRE>
+       <STRONG>panel_above(</STRONG><EM>pan</EM><STRONG>)</STRONG>  returns  a  pointer  to  the panel above <EM>pan</EM>.  If the
+       panel argument is <STRONG>(PANEL</STRONG> <STRONG>*)0</STRONG>, it returns a pointer to the bottom  panel
+       in the stack.
+
+
+</PRE><H3><a name="h3-panel_below">panel_below</a></H3><PRE>
+       <STRONG>panel_below(</STRONG><EM>pan</EM><STRONG>)</STRONG> returns a pointer to the panel just below <EM>pan</EM>.  If the
+       panel argument is <STRONG>(PANEL</STRONG> <STRONG>*)0</STRONG>, it returns a pointer to the top panel  in
+       the stack.
+
+
+</PRE><H3><a name="h3-panel_hidden">panel_hidden</a></H3><PRE>
+       <STRONG>panel_hidden(</STRONG><EM>pan</EM><STRONG>)</STRONG>  returns <STRONG>TRUE</STRONG> if the panel <EM>pan</EM> is in the panel stack,
+       <STRONG>FALSE</STRONG> if it is not.  If the panel is a null pointer, return <STRONG>ERR</STRONG>.
+
+
+</PRE><H3><a name="h3-panel_userptr">panel_userptr</a></H3><PRE>
+       <STRONG>panel_userptr(</STRONG><EM>pan</EM><STRONG>)</STRONG> returns the user pointer for a given panel <EM>pan</EM>.
+
+
+</PRE><H3><a name="h3-panel_window">panel_window</a></H3><PRE>
+       <STRONG>panel_window(</STRONG><EM>pan</EM><STRONG>)</STRONG> returns a pointer to the window of  the  given  panel
+       <EM>pan</EM>.
+
+
+</PRE><H3><a name="h3-replace_panel">replace_panel</a></H3><PRE>
+       <STRONG>replace_panel(</STRONG><EM>pan</EM><STRONG>,</STRONG><EM>window</EM><STRONG>)</STRONG> replaces the current window of panel <EM>pan</EM> with
+       <EM>window</EM> This is useful, for example if you want to resize a  panel.   In
+       <STRONG>ncurses</STRONG>,  you  can  call <STRONG>replace_panel</STRONG> to resize a panel using a window
+       resized with <STRONG><A HREF="wresize.3x.html">wresize(3x)</A></STRONG>.  It does not change the position of the panel
+       in the stack.
+
+
+</PRE><H3><a name="h3-set_panel_userptr">set_panel_userptr</a></H3><PRE>
+       <STRONG>set_panel_userptr(</STRONG><EM>pan</EM><STRONG>,</STRONG><EM>ptr</EM><STRONG>)</STRONG> sets the panel's user pointer.
+
+
+</PRE><H3><a name="h3-show_panel">show_panel</a></H3><PRE>
+       <STRONG>show_panel(</STRONG><EM>pan</EM><STRONG>)</STRONG>  makes  a  hidden panel visible by placing it on top of
+       the panels in the panel stack.  See <STRONG>COMPATIBILITY</STRONG> below.
+
+
+</PRE><H3><a name="h3-top_panel">top_panel</a></H3><PRE>
+       <STRONG>top_panel(</STRONG><EM>pan</EM><STRONG>)</STRONG> puts the given visible panel <EM>pan</EM> on top of all panels in
+       the stack.  See <STRONG>COMPATIBILITY</STRONG> below.
+
+
+</PRE><H3><a name="h3-update_panels">update_panels</a></H3><PRE>
+       <STRONG>update_panels()</STRONG>  refreshes  the <EM>virtual</EM> <EM>screen</EM> to reflect the relations
+       between the panels in the stack, but  does  not  call  <STRONG><A HREF="curs_refresh.3x.html">doupdate(3x)</A></STRONG>  to
+       refresh the <EM>physical</EM> <EM>screen</EM>.  Use this function and not <STRONG><A HREF="curs_refresh.3x.html">wrefresh(3x)</A></STRONG> or
+       <STRONG><A HREF="curs_refresh.3x.html">wnoutrefresh(3x)</A></STRONG>.
+
+       <STRONG>update_panels</STRONG> may be called more than once before a call  to  <STRONG>doupdate</STRONG>,
+       but  <STRONG>doupdate</STRONG>  is  the  function  responsible for updating the <EM>physical</EM>
+       <EM>screen</EM>.
+
+
+</PRE><H2><a name="h2-DIAGNOSTICS">DIAGNOSTICS</a></H2><PRE>
+       Each routine that returns a pointer returns <STRONG>NULL</STRONG> if  an  error  occurs.
+       Each  routine  that  returns  an  int  value  returns <STRONG>OK</STRONG> if it executes
+       successfully and <STRONG>ERR</STRONG> if not.
+
+       Except as noted, the <EM>pan</EM> and <EM>window</EM> parameters must  be  non-null.   If
+       those are null, an error is returned.
+
+       The  <STRONG>move_panel</STRONG>  function  uses  <STRONG><A HREF="curs_window.3x.html">mvwin(3x)</A></STRONG>, and will return an error if
+       <STRONG>mvwin</STRONG> returns an error.
+
+
+</PRE><H2><a name="h2-COMPATIBILITY">COMPATIBILITY</a></H2><PRE>
+       Reasonable care has been taken  to   ensure   compatibility  with   the
+       native   panel  facility introduced in System V (inspection of the SVr4
+       manual pages suggests the programming  interface  is  unchanged).   The
+       <STRONG>PANEL</STRONG>   data  structures  are  merely   similar.   The   programmer  is
+       cautioned not to directly use <STRONG>PANEL</STRONG> fields.
+
+       The  functions  <STRONG>show_panel</STRONG>  and  <STRONG>top_panel</STRONG>  are   identical   in   this
+       implementation,  and work equally well with displayed or hidden panels.
+       In the native System  V  implementation,  <STRONG>show_panel</STRONG>  is  intended  for
+       making  a  hidden panel visible (at the top of the stack) and <STRONG>top_panel</STRONG>
+       is intended for making an already-visible panel move to the top of  the
+       stack.   You  are  cautioned  to  use  the  correct  function to ensure
+       compatibility with native panel libraries.
+
+
+</PRE><H2><a name="h2-NOTE">NOTE</a></H2><PRE>
+       In your library list, libpanel.a should be  before  libncurses.a;  that
+       is, you should say "-lpanel -lncurses", not the other way around (which
+       would give a link-error with static libraries).
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       The panel facility was documented in SVr4.2 in <EM>Character</EM> <EM>User</EM> <EM>Interface</EM>
+       <EM>Programming</EM> <EM>(UNIX</EM> <EM>SVR4.2)</EM>.
+
+       It is not part of X/Open Curses.
+
+       A few implementations exist:
+
+       <STRONG>o</STRONG>   Systems  based  on  SVr4  source  code, e.g., Solaris, provide this
+           library.
+
+       <STRONG>o</STRONG>   <STRONG>ncurses</STRONG> (since version 0.6 in 1993) and <STRONG>PDCurses</STRONG> (since version 2.2
+           in 1995) provide a panel library whose common ancestor was a public
+           domain implementation by Warren Tucker published  in  <EM>u386mon</EM>  2.20
+           (1990).
+
+           According  to  Tucker, the SystemV panel library was first released
+           in SVr3.2 (1988), and his implementation  helped  with  a  port  to
+           SVr3.1 (1987).
+
+           Several  developers have improved each of these; they are no longer
+           the same as Tucker's implementation.
+
+       <STRONG>o</STRONG>   NetBSD 8 (2018) has a panel library  begun  by  Valery  Ushakov  in
+           2015.  This is based on the AT&amp;T documentation.
+
+
+</PRE><H2><a name="h2-FILES">FILES</a></H2><PRE>
+       panel.h interface for the panels library
+
+       libpanel.a the panels library itself
+
+
+</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 20221231).
+
+
+</PRE><H2><a name="h2-AUTHOR">AUTHOR</a></H2><PRE>
+       Originally   written   by   Warren   Tucker  &lt;wht@n4hgf.mt-park.ga.us&gt;,
+       primarily to assist in porting <EM>u386mon</EM>  to  systems  without  a  native
+       panels library.
+
+       Repackaged for ncurses by Zeyd ben-Halim.
+
+       Juergen Pfeifer and Thomas E. Dickey revised/improved the library.
+
+
+
+                                                                     <STRONG><A HREF="panel.3x.html">panel(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></li>
+<li><a href="#h2-FUNCTIONS">FUNCTIONS</a>
+<ul>
+<li><a href="#h3-bottom_panel">bottom_panel</a></li>
+<li><a href="#h3-ceiling_panel">ceiling_panel</a></li>
+<li><a href="#h3-del_panel">del_panel</a></li>
+<li><a href="#h3-ground_panel">ground_panel</a></li>
+<li><a href="#h3-hide_panel">hide_panel</a></li>
+<li><a href="#h3-move_panel">move_panel</a></li>
+<li><a href="#h3-new_panel">new_panel</a></li>
+<li><a href="#h3-panel_above">panel_above</a></li>
+<li><a href="#h3-panel_below">panel_below</a></li>
+<li><a href="#h3-panel_hidden">panel_hidden</a></li>
+<li><a href="#h3-panel_userptr">panel_userptr</a></li>
+<li><a href="#h3-panel_window">panel_window</a></li>
+<li><a href="#h3-replace_panel">replace_panel</a></li>
+<li><a href="#h3-set_panel_userptr">set_panel_userptr</a></li>
+<li><a href="#h3-show_panel">show_panel</a></li>
+<li><a href="#h3-top_panel">top_panel</a></li>
+<li><a href="#h3-update_panels">update_panels</a></li>
+</ul>
+</li>
+<li><a href="#h2-DIAGNOSTICS">DIAGNOSTICS</a></li>
+<li><a href="#h2-COMPATIBILITY">COMPATIBILITY</a></li>
+<li><a href="#h2-NOTE">NOTE</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-FILES">FILES</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-AUTHOR">AUTHOR</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/resizeterm.3x.html b/doc/html/man/resizeterm.3x.html
new file mode 100644
index 0000000..ebf6c55
--- /dev/null
+++ b/doc/html/man/resizeterm.3x.html
@@ -0,0 +1,217 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2015,2017 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.                                                           *
+  ****************************************************************************
+  * Author: Thomas E. Dickey 1996-on
+  * @Id: resizeterm.3x,v 1.32 2022/02/20 00:32:18 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>resizeterm 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">resizeterm 3x</H1>
+<PRE>
+<STRONG><A HREF="resizeterm.3x.html">resizeterm(3x)</A></STRONG>                                                  <STRONG><A HREF="resizeterm.3x.html">resizeterm(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>is_term_resized</STRONG>,  <STRONG>resize_term</STRONG>,  <STRONG>resizeterm</STRONG> - change the curses terminal
+       size
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>bool</STRONG> <STRONG>is_term_resized(int</STRONG> <EM>lines</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>columns</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>resize_term(int</STRONG> <EM>lines</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>columns</EM><STRONG>);</STRONG>
+       <STRONG>int</STRONG> <STRONG>resizeterm(int</STRONG> <EM>lines</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>columns</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       This is an extension to the curses library.  It provides callers with a
+       hook  into  the  <STRONG>ncurses</STRONG>  data  to resize windows, primarily for use by
+       programs running in  an  X  Window  terminal  (e.g.,  xterm)  when  the
+       terminal's screen size is changed by the user:
+
+       <STRONG>o</STRONG>   Curses  windows  cannot extend outside the screen.  If the terminal
+           is shrunk, curses windows must be shrunk to fit.
+
+       <STRONG>o</STRONG>   If the terminal is stretched, rows and/or columns can be  added  to
+           existing  windows.   The  added  cells  should  match  the  current
+           attributes of the windows.
+
+       If the calling program has not set up a handler for  <STRONG>SIGWINCH</STRONG>  when  it
+       initializes  <STRONG>ncurses</STRONG>  (e.g.,  using  <STRONG><A HREF="curs_initscr.3x.html">initscr(3x)</A></STRONG>  or <STRONG><A HREF="curs_initscr.3x.html">newterm(3x)</A></STRONG>), then
+       <STRONG>ncurses</STRONG> sets a handler for <STRONG>SIGWINCH</STRONG> which notifies the library  when  a
+       window-size   event   has   occurred.   The  library  checks  for  this
+       notification
+
+       <STRONG>o</STRONG>   when reading input data,
+
+       <STRONG>o</STRONG>   when implicitly resuming program mode (e.g., between <STRONG><A HREF="curs_initscr.3x.html">endwin(3x)</A></STRONG> and
+           <STRONG><A HREF="curs_refresh.3x.html">wrefresh(3x)</A></STRONG>), and
+
+       <STRONG>o</STRONG>   when explicitly resuming program mode in <STRONG><A HREF="curs_terminfo.3x.html">restartterm(3x)</A></STRONG>.
+
+       When the library has found that the terminal's window-size has changed,
+       it calls <STRONG>resizeterm</STRONG> to update its data structures.
+
+       An application which establishes its  own  <STRONG>SIGWINCH</STRONG>  handler  can  call
+       <STRONG>resizeterm</STRONG>,  but  in  that case, the library will not see <STRONG>SIGWINCH</STRONG>, and
+       proper layout will rely upon the application.
+
+
+</PRE><H2><a name="h2-FUNCTIONS">FUNCTIONS</a></H2><PRE>
+
+</PRE><H3><a name="h3-resizeterm">resizeterm</a></H3><PRE>
+       The function <STRONG>resizeterm</STRONG> resizes the standard and current windows (i.e.,
+       <STRONG>stdscr</STRONG>  and  <STRONG>curscr</STRONG>)  to  the  specified  dimensions, and adjusts other
+       bookkeeping data used by the <STRONG>ncurses</STRONG> library  that  record  the  window
+       dimensions such as the <STRONG>LINES</STRONG> and <STRONG>COLS</STRONG> variables.
+
+
+</PRE><H3><a name="h3-resize_term">resize_term</a></H3><PRE>
+       Most  of  the  work  for  <STRONG>resizeterm</STRONG>  is  done  by  the  inner function
+       <STRONG>resize_term</STRONG>.  The outer function <STRONG>resizeterm</STRONG> adds  bookkeeping  for  the
+       <STRONG>SIGWINCH</STRONG>  handler,  as  well  as  repainting  the  soft-key  area  (see
+       <STRONG><A HREF="curs_slk.3x.html">slk_touch(3x)</A></STRONG>).
+
+       The <STRONG>resize_term</STRONG> function attempts to resize all  windows.   This  helps
+       with simple applications.  However:
+
+       <STRONG>o</STRONG>   It is not possible to automatically resize pads.
+
+       <STRONG>o</STRONG>   Applications  which  have  complicated  layouts  should  check  for
+           <STRONG>KEY_RESIZE</STRONG> returned from <STRONG>wgetch</STRONG>, and  adjust  their  layout,  e.g.,
+           using <STRONG>wresize</STRONG> and <STRONG>mvwin</STRONG>, or by recreating the windows.
+
+       When  resizing  windows,  <STRONG>resize_term</STRONG>  recursively  adjusts subwindows,
+       keeping them within the updated parent window's limits.  If a top-level
+       window  happens  to extend to the screen's limits, then on resizing the
+       window, <STRONG>resize_term</STRONG> will keep the window extending to the corresponding
+       limit, regardless of whether the screen has shrunk or grown.
+
+
+</PRE><H3><a name="h3-is_term_resized">is_term_resized</a></H3><PRE>
+       A support function <STRONG>is_term_resized</STRONG> is provided so that applications can
+       check if the <STRONG>resize_term</STRONG> function would modify the  window  structures.
+       It returns <STRONG>TRUE</STRONG> if the windows would be modified, and <STRONG>FALSE</STRONG> otherwise.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       Except  as  noted,  these functions return the integer <STRONG>ERR</STRONG> upon failure
+       and <STRONG>OK</STRONG> on success.  They will fail if either of the dimensions are less
+       than  or  equal  to  zero,  or  if an error occurs while (re)allocating
+       memory for the windows.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       While these functions are intended to  be  used  to  support  a  signal
+       handler  (i.e.,  for  <STRONG>SIGWINCH</STRONG>), care should be taken to avoid invoking
+       them in a context where <STRONG>malloc</STRONG> or <STRONG>realloc</STRONG> may  have  been  interrupted,
+       since it uses those functions.
+
+       If ncurses is configured to supply its own <STRONG>SIGWINCH</STRONG> handler,
+
+       <STRONG>o</STRONG>   on receipt of a <STRONG>SIGWINCH</STRONG>, the handler sets a flag
+
+       <STRONG>o</STRONG>   which is tested in <STRONG><A HREF="curs_getch.3x.html">wgetch(3x)</A></STRONG>, <STRONG><A HREF="curs_refresh.3x.html">doupdate(3x)</A></STRONG> and <STRONG><A HREF="curs_terminfo.3x.html">restartterm(3x)</A></STRONG>,
+
+       <STRONG>o</STRONG>   in turn, calling the <STRONG>resizeterm</STRONG> function,
+
+       <STRONG>o</STRONG>   which <STRONG>ungetch</STRONG>'s a <STRONG>KEY_RESIZE</STRONG> which will be read on the next call to
+           <STRONG>wgetch</STRONG>.
+
+           The <STRONG>KEY_RESIZE</STRONG> alerts an  application  that  the  screen  size  has
+           changed,  and  that it should repaint special features such as pads
+           that cannot be done automatically.
+
+           Calling <STRONG>resizeterm</STRONG> or <STRONG>resize_term</STRONG> directly from a signal handler is
+           unsafe.   This  indirect  method  is  used to provide a safe way to
+           resize the ncurses data structures.
+
+       If the environment variables <STRONG>LINES</STRONG> or <STRONG>COLUMNS</STRONG> are set,  this  overrides
+       the  library's  use  of  the  window  size  obtained from the operating
+       system.  Thus, even if a <STRONG>SIGWINCH</STRONG> is received, no  screen  size  change
+       may be recorded.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       It is possible to resize the screen with SVr4 curses, by
+
+       <STRONG>o</STRONG>   exiting curses with <STRONG><A HREF="curs_initscr.3x.html">endwin(3x)</A></STRONG> and
+
+       <STRONG>o</STRONG>   resuming using <STRONG><A HREF="curs_refresh.3x.html">refresh(3x)</A></STRONG>.
+
+       Doing that clears the screen and is visually distracting.
+
+       This  extension  of ncurses was introduced in mid-1995.  It was adopted
+       in NetBSD curses (2001) and PDCurses (2003).
+
+
+</PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
+       <STRONG><A HREF="curs_getch.3x.html">curs_getch(3x)</A></STRONG>, <STRONG><A HREF="curs_variables.3x.html">curs_variables(3x)</A></STRONG>, <STRONG><A HREF="wresize.3x.html">wresize(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-AUTHOR">AUTHOR</a></H2><PRE>
+       Thomas Dickey (from an equivalent function  written  in  1988  for  BSD
+       curses).
+
+
+
+                                                                <STRONG><A HREF="resizeterm.3x.html">resizeterm(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></li>
+<li><a href="#h2-FUNCTIONS">FUNCTIONS</a>
+<ul>
+<li><a href="#h3-resizeterm">resizeterm</a></li>
+<li><a href="#h3-resize_term">resize_term</a></li>
+<li><a href="#h3-is_term_resized">is_term_resized</a></li>
+</ul>
+</li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-AUTHOR">AUTHOR</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/scr_dump.5.html b/doc/html/man/scr_dump.5.html
new file mode 100644
index 0000000..459a30c
--- /dev/null
+++ b/doc/html/man/scr_dump.5.html
@@ -0,0 +1,437 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2020,2021 Thomas E. Dickey                                *
+  * Copyright 2017 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: scr_dump.5,v 1.20 2021/12/25 21:13:38 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>scr_dump 5</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">scr_dump 5</H1>
+<PRE>
+<STRONG><A HREF="scr_dump.5.html">scr_dump(5)</A></STRONG>                   File Formats Manual                  <STRONG><A HREF="scr_dump.5.html">scr_dump(5)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       scr_dump - format of curses screen-dumps.
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>scr_dump</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The  curses library provides applications with the ability to write the
+       contents of a window to an external file using <STRONG>scr_dump</STRONG> or <STRONG>putwin</STRONG>,  and
+       read it back using <STRONG>scr_restore</STRONG> or <STRONG>getwin</STRONG>.
+
+       The  <STRONG>putwin</STRONG>  and  <STRONG>getwin</STRONG>  functions  do  the  work;  while <STRONG>scr_dump</STRONG> and
+       <STRONG>scr_restore</STRONG> conveniently save  and  restore  the  whole  screen,  i.e.,
+       <STRONG>stdscr</STRONG>.
+
+
+</PRE><H3><a name="h3-ncurses6">ncurses6</a></H3><PRE>
+       A  longstanding implementation of screen-dump was revised with ncurses6
+       to remedy problems with the earlier approach:
+
+       <STRONG>o</STRONG>   A "magic number" is written to the  beginning  of  the  dump  file,
+           allowing  applications  (such  as <STRONG>file(1)</STRONG>) to recognize curses dump
+           files.
+
+           Because ncurses6 uses a new  format,  that  requires  a  new  magic
+           number  was  unused  by other applications.  This 16-bit number was
+           unused:
+
+               0x8888 (octal "\210\210")
+
+           but to be more certain, this 32-bit number was chosen:
+
+               0x88888888 (octal "\210\210\210\210")
+
+           This is the pattern  submitted  to  the  maintainers  of  the  <STRONG>file</STRONG>
+           program:
+
+               #
+               # ncurses5 (and before) did not use a magic number,
+               # making screen dumps "data".
+               #
+               # ncurses6 (2015) uses this format, ignoring byte-order
+               0    string    \210\210\210\210ncurses    ncurses6 screen image
+               #
+
+       <STRONG>o</STRONG>   The screen dumps are written in textual form, so that internal data
+           sizes are not directly related to the dump-format, and enabling the
+           library  to  read  dumps  from  either  narrow-  or wide-character-
+           configurations.
+
+           The  <EM>narrow</EM>  library  configuration  holds  characters  and   video
+           attributes  in  a  32-bit  <STRONG>chtype</STRONG>, while the <EM>wide-character</EM> library
+           stores this information in the <STRONG>cchar_t</STRONG>  structure,  which  is  much
+           larger than 32-bits.
+
+       <STRONG>o</STRONG>   It  is  possible  to  read  a  screen  dump  into a terminal with a
+           different screen-size, because the library truncates or  fills  the
+           screen as necessary.
+
+       <STRONG>o</STRONG>   The ncurses6 <STRONG>getwin</STRONG> reads the legacy screen dumps from ncurses5.
+
+
+</PRE><H3><a name="h3-ncurses5-_legacy_">ncurses5 (legacy)</a></H3><PRE>
+       The screen-dump feature was added to ncurses in June 1995.  While there
+       were fixes and improvements in succeeding years, the basic  scheme  was
+       unchanged:
+
+       <STRONG>o</STRONG>   The <STRONG>WINDOW</STRONG> structure was written in binary form.
+
+       <STRONG>o</STRONG>   The <STRONG>WINDOW</STRONG> structure refers to lines of data, which were written as
+           an array of binary data following the <STRONG>WINDOW</STRONG>.
+
+       <STRONG>o</STRONG>   When <STRONG>getwin</STRONG> restored the window, it would  keep  track  of  offsets
+           into  the  array of line-data and adjust the <STRONG>WINDOW</STRONG> structure which
+           was read back into memory.
+
+       This is similar to Unix SystemV, but does not write a "magic number" to
+       identify the file format.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       There  is  no  standard  format for <STRONG>putwin</STRONG>.  This section gives a brief
+       description of the existing formats.
+
+
+</PRE><H3><a name="h3-X_Open-Curses">X/Open Curses</a></H3><PRE>
+       Refer to <EM>X/Open</EM> <EM>Curses,</EM> <EM>Issue</EM> <EM>7</EM> (2009).
+
+       X/Open's documentation for <EM>enhanced</EM> <EM>curses</EM> says only:
+
+          The <STRONG>getwin(</STRONG> <STRONG>)</STRONG> function reads window-related data stored in the  file
+          by  <EM>putwin(</EM> <EM>)</EM>.   The  function  then  creates  and initializes a new
+          window using that data.
+
+          The <STRONG>putwin(</STRONG> <STRONG>)</STRONG> function writes all data associated with <EM>win</EM> into  the
+          <STRONG>stdio(3)</STRONG>  stream to which <EM>filep</EM> points, using an <STRONG>unspecified</STRONG> <STRONG>format</STRONG>.
+          This information can be retrieved later using <STRONG>getwin(</STRONG> <STRONG>)</STRONG>.
+
+       In the mid-1990s when the X/Open Curses  document  was  written,  there
+       were  still  systems  using older, less capable curses libraries (aside
+       from the BSD curses library which was not relevant to X/Open because it
+       did not meet the criteria for <EM>base</EM> <EM>curses</EM>).  The document explained the
+       term "enhanced" as follows:
+
+          <STRONG>o</STRONG>   Shading is used to identify  <EM>X/Open</EM>  <EM>Enhanced</EM>  <EM>Curses</EM>  material,
+              relating to interfaces included to provide enhanced capabilities
+              for applications originally written to be  compiled  on  systems
+              based  on  the  UNIX  operating system.  Therefore, the features
+              described may not be present on systems that conform to <STRONG>XPG4</STRONG>  <STRONG>or</STRONG>
+              <STRONG>to</STRONG>  <STRONG>earlier</STRONG>  <STRONG>XPG</STRONG>  <STRONG>releases</STRONG>.   The  relevant  reference pages may
+              provide additional or more specific portability  warnings  about
+              use of the material.
+
+       In  the foregoing, emphasis was added to <STRONG>unspecified</STRONG> <STRONG>format</STRONG> and to <STRONG>XPG4</STRONG>
+       <STRONG>or</STRONG> <STRONG>to</STRONG> <STRONG>earlier</STRONG> <STRONG>XPG</STRONG> <STRONG>releases</STRONG>, for clarity.
+
+
+</PRE><H3><a name="h3-Unix-SystemV">Unix SystemV</a></H3><PRE>
+       Unix SystemV curses identified the file  format  by  writing  a  "magic
+       number" at the beginning of the dump.  The <STRONG>WINDOW</STRONG> data and the lines of
+       text follow, all in binary form.
+
+       The Solaris curses source has these definitions:
+
+           /* terminfo magic number */
+           #define MAGNUM  0432
+
+           /* curses screen dump magic number */
+           #define SVR2_DUMP_MAGIC_NUMBER  0433
+           #define SVR3_DUMP_MAGIC_NUMBER  0434
+
+       That is, the feature was likely introduced in SVr2 (1984), and improved
+       in SVr3 (1987).  The Solaris curses source has no magic number for SVr4
+       (1989).  Other operating systems (AIX and  HPUX)  use  a  magic  number
+       which would correspond to this definition:
+
+           /* curses screen dump magic number */
+           #define SVR4_DUMP_MAGIC_NUMBER  0435
+
+       That  octal number in bytes is 001, 035.  Because most Unix vendors use
+       big-endian hardware, the magic number is written  with  the  high-order
+       byte first, e.g.,
+
+            01 35
+
+       After  the magic number, the <STRONG>WINDOW</STRONG> structure and line-data are written
+       in binary format.  While the magic number used by the Unix systems  can
+       be seen using <STRONG>od(1)</STRONG>, none of the Unix systems documents the format used
+       for screen-dumps.
+
+       The Unix systems  do  not  use  identical  formats.   While  collecting
+       information  for  for  this  manual  page,  the <EM>savescreen</EM> test-program
+       produced dumps of different size (all  on  64-bit  hardware,  on  40x80
+       screens):
+
+       <STRONG>o</STRONG>   AIX (51817 bytes)
+
+       <STRONG>o</STRONG>   HPUX (90093 bytes)
+
+       <STRONG>o</STRONG>   Solaris 10 (13273 bytes)
+
+       <STRONG>o</STRONG>   ncurses5 (12888 bytes)
+
+
+</PRE><H3><a name="h3-Solaris">Solaris</a></H3><PRE>
+       As  noted  above,  Solaris  curses has no magic number corresponding to
+       SVr4 curses.  This is odd since Solaris was the first operating  system
+       to pass the SVr4 guidelines.  Solaris has two versions of curses:
+
+       <STRONG>o</STRONG>   The default curses library uses the SVr3 magic number.
+
+       <STRONG>o</STRONG>   There  is  an  alternate  curses library in <STRONG>/usr/xpg4</STRONG>.  This uses a
+           textual format with no magic number.
+
+           According to the copyright notice, the <EM>xpg4</EM> Solaris curses  library
+           was developed by MKS (Mortice Kern Systems) from 1990 to 1995.
+
+           Like  ncurses6,  there  is  a  file-header with parameters.  Unlike
+           ncurses6, the contents of the window are  written  piecemeal,  with
+           coordinates  and  attributes  for  each  chunk  of text rather than
+           writing the whole window from top to bottom.
+
+
+</PRE><H3><a name="h3-PDCurses">PDCurses</a></H3><PRE>
+       PDCurses added support for screen dumps in version  2.7  (2005).   Like
+       Unix  SystemV  and  ncurses5, it writes the <STRONG>WINDOW</STRONG> structure in binary,
+       but begins the file with its three-byte identifier "PDC", followed by a
+       one-byte version, e.g.,
+
+                "PDC\001"
+
+
+</PRE><H3><a name="h3-NetBSD">NetBSD</a></H3><PRE>
+       As  of  April  2017,  NetBSD  curses  does  not  support  <STRONG>scr_dump</STRONG>  and
+       <STRONG>scr_restore</STRONG> (or <STRONG>scr_init</STRONG>, <STRONG>scr_set</STRONG>), although it has <STRONG>putwin</STRONG> and <STRONG>getwin</STRONG>.
+
+       Like ncurses5, NetBSD <STRONG>putwin</STRONG> does not identify its dumps with a  useful
+       magic number.  It writes
+
+       <STRONG>o</STRONG>   the curses shared library major and minor versions as the first two
+           bytes (e.g., 7 and 1),
+
+       <STRONG>o</STRONG>   followed by a binary dump of the <STRONG>WINDOW</STRONG>,
+
+       <STRONG>o</STRONG>   some data for wide-characters referenced by the  <STRONG>WINDOW</STRONG>  structure,
+           and
+
+       <STRONG>o</STRONG>   finally, lines as done by other implementations.
+
+
+</PRE><H2><a name="h2-EXAMPLE">EXAMPLE</a></H2><PRE>
+       Given  a  simple  program  which writes text to the screen (and for the
+       sake of example, limiting the screen-size to 10x20):
+
+           #include &lt;curses.h&gt;
+
+           int
+           main(void)
+           {
+               putenv("LINES=10");
+               putenv("COLUMNS=20");
+               initscr();
+               start_color();
+               init_pair(1, COLOR_WHITE, COLOR_BLUE);
+               init_pair(2, COLOR_RED, COLOR_BLACK);
+               bkgd(<STRONG>COLOR_PAIR(1)</STRONG>);
+               move(4, 5);
+               attron(A_BOLD);
+               addstr("Hello");
+               move(5, 5);
+               attroff(A_BOLD);
+               attrset(A_REVERSE | <STRONG>COLOR_PAIR(2)</STRONG>);
+               addstr("World!");
+               refresh();
+               scr_dump("foo.out");
+               endwin();
+               return 0;
+           }
+
+       When run using ncurses6, the output looks like this:
+
+           \210\210\210\210ncurses 6.0.20170415
+           _cury=5
+           _curx=11
+           _maxy=9
+           _maxx=19
+           _flags=14
+           _attrs=\{REVERSE|C2}
+           flag=_idcok
+           _delay=-1
+           _regbottom=9
+           _bkgrnd=\{NORMAL|C1}\s
+           rows:
+           1:\{NORMAL|C1}\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s
+           2:\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s
+           3:\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s
+           4:\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s
+           5:\s\s\s\s\s\{BOLD}Hello\{NORMAL}\s\s\s\s\s\s\s\s\s\s
+           6:\s\s\s\s\s\{REVERSE|C2}World!\{NORMAL|C1}\s\s\s\s\s\s\s\s\s
+           7:\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s
+           8:\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s
+           9:\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s
+           10:\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s
+
+       The first four octal escapes are actually nonprinting characters, while
+       the remainder of the file is printable text.  You may notice:
+
+       <STRONG>o</STRONG>   The actual color pair values are not written to the file.
+
+       <STRONG>o</STRONG>   All  characters  are  shown  in  printable form; spaces are "\s" to
+           ensure they are not overlooked.
+
+       <STRONG>o</STRONG>   Attributes are written in escaped curly  braces,  e.g.,  "\{BOLD}",
+           and may include a color-pair (C1 or C2 in this example).
+
+       <STRONG>o</STRONG>   The  parameters  in  the  header  are  written out only if they are
+           nonzero.  When reading back, order does not matter.
+
+       Running the same program with Solaris <EM>xpg4</EM> curses gives this dump:
+
+           MAX=10,20
+           BEG=0,0
+           SCROLL=0,10
+           VMIN=1
+           VTIME=0
+           FLAGS=0x1000
+           FG=0,0
+           BG=0,0,
+           0,0,0,1,
+           0,19,0,0,
+           1,0,0,1,
+           1,19,0,0,
+           2,0,0,1,
+           2,19,0,0,
+           3,0,0,1,
+           3,19,0,0,
+           4,0,0,1,
+           4,5,0x20,0,Hello
+           4,10,0,1,
+           4,19,0,0,
+           5,0,0,1,
+           5,5,0x4,2,World!
+           5,11,0,1,
+           5,19,0,0,
+           6,0,0,1,
+           6,19,0,0,
+           7,0,0,1,
+           7,19,0,0,
+           8,0,0,1,
+           8,19,0,0,
+           9,0,0,1,
+           9,19,0,0,
+           CUR=11,5
+
+       Solaris <STRONG>getwin</STRONG> requires that all parameters are  present,  and  in  the
+       same  order.  The <EM>xpg4</EM> curses library does not know about the <STRONG>bce</STRONG> (back
+       color erase) capability, and does not color the window background.
+
+       On the other  hand,  the  SVr4  curses  library  does  know  about  the
+       background  color.   However,  its screen dumps are in binary.  Here is
+       the corresponding dump (using "od -t x1"):
+
+           0000000 1c 01 c3 d6 f3 58 05 00 0b 00 0a 00 14 00 00 00
+           0000020 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00
+           0000040 00 00 b8 1a 06 08 cc 1a 06 08 00 00 09 00 10 00
+           0000060 00 00 00 80 00 00 20 00 00 00 ff ff ff ff 00 00
+           0000100 ff ff ff ff 00 00 00 00 20 80 00 00 20 80 00 00
+           0000120 20 80 00 00 20 80 00 00 20 80 00 00 20 80 00 00
+           *
+           0000620 20 80 00 00 20 80 00 00 20 80 00 00 48 80 00 04
+           0000640 65 80 00 04 6c 80 00 04 6c 80 00 04 6f 80 00 04
+           0000660 20 80 00 00 20 80 00 00 20 80 00 00 20 80 00 00
+           *
+           0000740 20 80 00 00 20 80 00 00 20 80 00 00 57 00 81 00
+           0000760 6f 00 81 00 72 00 81 00 6c 00 81 00 64 00 81 00
+           0001000 21 00 81 00 20 80 00 00 20 80 00 00 20 80 00 00
+           0001020 20 80 00 00 20 80 00 00 20 80 00 00 20 80 00 00
+           *
+           0001540 20 80 00 00 20 80 00 00 00 00 f6 d1 01 00 f6 d1
+           0001560 08 00 00 00 40 00 00 00 00 00 00 00 00 00 00 07
+           0001600 00 04 00 01 00 01 00 00 00 01 00 00 00 00 00 00
+           0001620 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+           *
+           0002371
+
+
+</PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
+       <STRONG><A HREF="curs_scr_dump.3x.html">curs_scr_dump(3x)</A></STRONG>, <STRONG><A HREF="curs_util.3x.html">curs_util(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Thomas E. Dickey
+       extended screen-dump format for ncurses 6.0 (2015)
+
+       Eric S. Raymond
+       screen dump feature in ncurses 1.9.2d (1995)
+
+
+
+                                                                   <STRONG><A HREF="scr_dump.5.html">scr_dump(5)</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-ncurses6">ncurses6</a></li>
+<li><a href="#h3-ncurses5-_legacy_">ncurses5 (legacy)</a></li>
+</ul>
+</li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a>
+<ul>
+<li><a href="#h3-X_Open-Curses">X/Open Curses</a></li>
+<li><a href="#h3-Unix-SystemV">Unix SystemV</a></li>
+<li><a href="#h3-Solaris">Solaris</a></li>
+<li><a href="#h3-PDCurses">PDCurses</a></li>
+<li><a href="#h3-NetBSD">NetBSD</a></li>
+</ul>
+</li>
+<li><a href="#h2-EXAMPLE">EXAMPLE</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/tabs.1.html b/doc/html/man/tabs.1.html
new file mode 100644
index 0000000..3e9f0f9
--- /dev/null
+++ b/doc/html/man/tabs.1.html
@@ -0,0 +1,280 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2020,2021 Thomas E. Dickey                                *
+  * Copyright 2008-2016,2017 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: tabs.1,v 1.35 2021/12/25 19:04:39 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>tabs 1</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">tabs 1</H1>
+<PRE>
+<STRONG><A HREF="tabs.1.html">tabs(1)</A></STRONG>                     General Commands Manual                    <STRONG><A HREF="tabs.1.html">tabs(1)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>tabs</STRONG> - set tabs on a terminal
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>tabs</STRONG> [<EM>options</EM>]] <EM>[tabstop-list]</EM>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The  <STRONG>tabs</STRONG> program clears and sets tab-stops on the terminal.  This uses
+       the terminfo <STRONG>clear_all_tabs</STRONG> and <STRONG>set_tab</STRONG>  capabilities.   If  either  is
+       absent,  <STRONG>tabs</STRONG> is unable to clear/set tab-stops.  The terminal should be
+       configured to use hard tabs, e.g.,
+
+           stty tab0
+
+       Like <STRONG><A HREF="clear.1.html">clear(1)</A></STRONG>, <STRONG>tabs</STRONG> writes to the standard output.   You  can  redirect
+       the  standard  output  to  a  file  (which  prevents <STRONG>tabs</STRONG> from actually
+       changing the tabstops), and later <STRONG>cat</STRONG> the file to the  screen,  setting
+       tabstops at that point.
+
+       These   are   hardware   tabs,  which  cannot  be  queried  rapidly  by
+       applications running in the terminal, if  at  all.   Curses  and  other
+       full-screen  applications  may  use  hardware  tabs in optimizing their
+       output to the terminal.  If  the  hardware  tabstops  differ  from  the
+       information  in  the  terminal  database,  the result is unpredictable.
+       Before running curses programs, you should either  reset  tab-stops  to
+       the standard interval
+
+           tabs -8
+
+       or  use the <STRONG>reset</STRONG> program, since the normal initialization sequences do
+       not ensure that tab-stops are reset.
+
+
+</PRE><H2><a name="h2-OPTIONS">OPTIONS</a></H2><PRE>
+
+</PRE><H3><a name="h3-General-Options">General Options</a></H3><PRE>
+       <STRONG>-T</STRONG><EM>name</EM>
+            Tell <STRONG>tabs</STRONG> which terminal type to  use.   If  this  option  is  not
+            given,  <STRONG>tabs</STRONG>  will use the <STRONG>$TERM</STRONG> environment variable.  If that is
+            not set, it will use the <EM>ansi+tabs</EM> entry.
+
+       <STRONG>-d</STRONG>   The debugging option shows a ruler  line,  followed  by  two  data
+            lines.   The  first  data line shows the expected tab-stops marked
+            with asterisks.  The second data line shows the actual  tab-stops,
+            marked with asterisks.
+
+       <STRONG>-n</STRONG>   This  option tells <STRONG>tabs</STRONG> to check the options and run any debugging
+            option, but not to modify the terminal settings.
+
+       <STRONG>-V</STRONG>   reports the version of ncurses which was used in this program, and
+            exits.
+
+       The <STRONG>tabs</STRONG> program processes a single list of tab stops.  The last option
+       to be processed which defines a list is the  one  that  determines  the
+       list to be processed.
+
+
+</PRE><H3><a name="h3-Implicit-Lists">Implicit Lists</a></H3><PRE>
+       Use  a  single number as an option, e.g., "<STRONG>-5</STRONG>" to set tabs at the given
+       interval (in this case 1, 6, 11, 16, 21, etc.).  Tabs are  repeated  up
+       to the right margin of the screen.
+
+       Use "<STRONG>-0</STRONG>" to clear all tabs.
+
+       Use "<STRONG>-8</STRONG>" to set tabs to the standard interval.
+
+
+</PRE><H3><a name="h3-Explicit-Lists">Explicit Lists</a></H3><PRE>
+       An  explicit list can be defined after the options (this does not use a
+       "-").  The values in the list must be in increasing numeric order,  and
+       greater  than  zero.   They  are  separated  by a comma or a blank, for
+       example,
+
+           tabs 1,6,11,16,21
+           tabs 1 6 11 16 21
+
+       Use a "+" to treat a number as an increment relative  to  the  previous
+       value, e.g.,
+
+           tabs 1,+5,+5,+5,+5
+
+       which is equivalent to the 1,6,11,16,21 example.
+
+
+</PRE><H3><a name="h3-Predefined-Tab-Stops">Predefined Tab-Stops</a></H3><PRE>
+       POSIX defines several predefined lists of tab stops.
+
+       <STRONG>-a</STRONG>   Assembler, IBM S/370, first format
+            1,10,16,36,72
+
+       <STRONG>-a2</STRONG>  Assembler, IBM S/370, second format
+            1,10,16,40,72
+
+       <STRONG>-c</STRONG>   COBOL, normal format
+            1,8,12,16,20,55
+
+       <STRONG>-c2</STRONG>  COBOL compact format
+            1,6,10,14,49
+
+       <STRONG>-c3</STRONG>  COBOL compact format extended
+            1,6,10,14,18,22,26,30,34,38,42,46,50,54,58,62,67
+
+       <STRONG>-f</STRONG>   FORTRAN
+            1,7,11,15,19,23
+
+       <STRONG>-p</STRONG>   PL/I
+            1,5,9,13,17,21,25,29,33,37,41,45,49,53,57,61
+
+       <STRONG>-s</STRONG>   SNOBOL
+            1,10,55
+
+       <STRONG>-u</STRONG>   UNIVAC 1100 Assembler
+            1,12,20,44
+
+
+</PRE><H3><a name="h3-Margins">Margins</a></H3><PRE>
+       A  few  terminals  provide the capability for changing their left/right
+       margins.  The tabs program has an option to use this feature:
+
+       <STRONG>+m</STRONG> <EM>margin</EM>
+            The  effect  depends  on  whether  the  terminal  has  the  margin
+            capabilities:
+
+            <STRONG>o</STRONG>   If  the  terminal provides the capability for setting the left
+                margin, tabs uses this, and adjusts the  available  width  for
+                tab-stops.
+
+            <STRONG>o</STRONG>   If the terminal does not provide the margin capabilities, tabs
+                imitates the effect, putting the tab stops at the  appropriate
+                place  on  each  line.   The  terminal's  left-margin  is  not
+                modified.
+
+            If the <EM>margin</EM> parameter is omitted, the default is 10.  Use <STRONG>+m0</STRONG> to
+            reset  the  left  margin, i.e., to the left edge of the terminal's
+            display.  Before setting a left-margin, tabs resets the margin  to
+            reduce  problems which might arise on moving the cursor before the
+            current left-margin.
+
+       When setting or resetting the left-margin, tabs may  reset  the  right-
+       margin.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       <EM>IEEE</EM>   <EM>Std</EM>   <EM>1003.1/The</EM>   <EM>Open</EM>   <EM>Group</EM>   <EM>Base</EM>  <EM>Specifications</EM>  <EM>Issue</EM>  <EM>7</EM>
+       (POSIX.1-2008) describes a <STRONG>tabs</STRONG> utility.  However
+
+       <STRONG>o</STRONG>   This standard describes a <STRONG>+m</STRONG> option,  to  set  a  terminal's  left-
+           margin.   Very  few of the entries in the terminal database provide
+           the  <STRONG>smgl</STRONG>   (<STRONG>set_left_margin</STRONG>)   or   <STRONG>smglp</STRONG>   (<STRONG>set_left_margin_parm</STRONG>)
+           capability needed to support the feature.
+
+       <STRONG>o</STRONG>   There  is no counterpart in X/Open Curses Issue 7 for this utility,
+           unlike <STRONG><A HREF="tput.1.html">tput(1)</A></STRONG>.
+
+       The <STRONG>-d</STRONG> (debug) and <STRONG>-n</STRONG> (no-op) options are extensions  not  provided  by
+       other implementations.
+
+       A  <STRONG>tabs</STRONG>  utility  appeared in PWB/Unix 1.0 (1977).  There was a reduced
+       version of the <STRONG>tabs</STRONG> utility in Unix 7th edition  and  in  3BSD  (1979).
+       The  latter supported a single "-n" option (to cause the first tab stop
+       to be set on the left margin).  That option is not documented by POSIX.
+
+       The PWB/Unix <STRONG>tabs</STRONG> utility, which was included  in  System  III  (1980),
+       used  built-in  tables  rather than the terminal database, to support a
+       half-dozen hardcopy terminal (printer) types.   It  also  had  built-in
+       logic  to support the left-margin, as well as a feature for copying the
+       tab settings from a file.
+
+       Later versions of Unix, e.g., SVr4,  added  support  for  the  terminal
+       database,  but  kept the tables to support the printers.  In an earlier
+       development effort, the tab-stop initialization provided by <STRONG>tset</STRONG> (1982)
+       and incorporated into <STRONG>tput</STRONG> uses the terminal database,
+
+       The  <STRONG>+m</STRONG>  option  was  documented  in  the  Base  Specifications Issue 5
+       (Unix98,  1997),  and  omitted  in  Issue  6  (Unix03,  2004)   without
+       documenting   the   rationale,  though  an  introductory  comment  <EM>"and</EM>
+       <EM>optionally</EM> <EM>adjusts</EM> <EM>the</EM> <EM>margin"</EM> remains, overlooked in the removal.  The
+       documented  <STRONG>tabs</STRONG>  utility  in  Issues  6 and later has no mechanism for
+       setting margins.  The <STRONG>+m</STRONG> option in this implementation differs from the
+       feature  in  SVr4  by  using terminal capabilities rather than built-in
+       tables.
+
+       POSIX documents no limits on the number of  tab  stops.   Documentation
+       for other implementations states that there is a limit on the number of
+       tab stops (e.g., 20 in PWB/Unix's <STRONG>tabs</STRONG> utility).  While some  terminals
+       may  not  accept  an arbitrary number of tab stops, this implementation
+       will attempt to set tab stops up to the right margin of the screen,  if
+       the given list happens to be that long.
+
+       The  <EM>Rationale</EM> section of the POSIX documentation goes into some detail
+       about the ways the committee considered redesigning the <STRONG>tabs</STRONG>  and  <STRONG>tput</STRONG>
+       utilities, without proposing an improved solution.  It comments that
+
+            no  known  historical  version  of tabs supports the capability of
+            setting arbitrary tab stops.
+
+       However,  the  <EM>Explicit</EM>  <EM>Lists</EM>  described  in  this  manual  page  were
+       implemented  in  PWB/Unix.   Those  provide  the  capability of setting
+       abitrary tab stops.
+
+
+</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 20221231).
+
+
+
+                                                                       <STRONG><A HREF="tabs.1.html">tabs(1)</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></li>
+<li><a href="#h2-OPTIONS">OPTIONS</a>
+<ul>
+<li><a href="#h3-General-Options">General Options</a></li>
+<li><a href="#h3-Implicit-Lists">Implicit Lists</a></li>
+<li><a href="#h3-Explicit-Lists">Explicit Lists</a></li>
+<li><a href="#h3-Predefined-Tab-Stops">Predefined Tab-Stops</a></li>
+<li><a href="#h3-Margins">Margins</a></li>
+</ul>
+</li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/term.5.html b/doc/html/man/term.5.html
new file mode 100644
index 0000000..ebeee22
--- /dev/null
+++ b/doc/html/man/term.5.html
@@ -0,0 +1,414 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2020,2021 Thomas E. Dickey                                *
+  * Copyright 1998-2016,2017 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: term.5,v 1.43 2021/12/25 21:28: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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>term 5</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">term 5</H1>
+<PRE>
+<STRONG><A HREF="term.5.html">term(5)</A></STRONG>                       File Formats Manual                      <STRONG><A HREF="term.5.html">term(5)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       term - format of compiled term file.
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>term</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+
+</PRE><H3><a name="h3-STORAGE-LOCATION">STORAGE LOCATION</a></H3><PRE>
+       Compiled   terminfo   descriptions   are  placed  under  the  directory
+       <STRONG>/usr/share/terminfo</STRONG>.  Two configurations are supported  (when  building
+       the <STRONG>ncurses</STRONG> libraries):
+
+       <STRONG>directory</STRONG> <STRONG>tree</STRONG>
+            A two-level scheme is used to avoid a linear search of a huge UNIX
+            system directory: <STRONG>/usr/share/terminfo/c/name</STRONG>  where  <EM>name</EM>  is  the
+            name of the terminal, and <EM>c</EM> is the first character of <EM>name</EM>.  Thus,
+            <EM>act4</EM>  can  be  found  in  the   file   <STRONG>/usr/share/terminfo/a/act4</STRONG>.
+            Synonyms  for  the same terminal are implemented by multiple links
+            to the same compiled file.
+
+       <STRONG>hashed</STRONG> <STRONG>database</STRONG>
+            Using Berkeley database, two types  of  records  are  stored:  the
+            terminfo  data  in  the  same format as stored in a directory tree
+            with the terminfo's primary name as a key, and records  containing
+            only aliases pointing to the primary name.
+
+            If  built  to  write  hashed  databases,  <STRONG>ncurses</STRONG>  can  still read
+            terminfo databases organized as a directory tree, but cannot write
+            entries  into  the  directory  tree.   It  can  write (or rewrite)
+            entries in the hashed database.
+
+            <STRONG>ncurses</STRONG>  distinguishes  the  two  cases  in   the   TERMINFO   and
+            TERMINFO_DIRS  environment  variable  by assuming a directory tree
+            for entries that correspond to an existing directory,  and  hashed
+            database otherwise.
+
+
+</PRE><H3><a name="h3-LEGACY-STORAGE-FORMAT">LEGACY STORAGE FORMAT</a></H3><PRE>
+       The format has been chosen so that it will be the same on all hardware.
+       An 8 or more bit  byte  is  assumed,  but  no  assumptions  about  byte
+       ordering or sign extension are made.
+
+       The  compiled  file  is  created  with the <STRONG>tic</STRONG> program, and read by the
+       routine <STRONG><A HREF="curs_terminfo.3x.html">setupterm(3x)</A></STRONG>.  The file is divided into six parts:
+
+            a) <EM>header</EM>,
+
+            b) <EM>terminal</EM> <EM>names</EM>,
+
+            c) <EM>boolean</EM> <EM>flags</EM>,
+
+            d) <EM>numbers</EM>,
+
+            e) <EM>strings</EM>, and
+
+            f) <EM>string</EM> <EM>table</EM>.
+
+       The <EM>header</EM> section begins the file.  This section  contains  six  short
+       integers in the format described below.  These integers are
+
+            (1) the <EM>magic</EM> <EM>number</EM> (octal 0432);
+
+            (2) the size, in bytes, of the <EM>terminal</EM> <EM>names</EM> section;
+
+            (3) the number of bytes in the <EM>boolean</EM> <EM>flags</EM> section;
+
+            (4) the number of short integers in the <EM>numbers</EM> section;
+
+            (5) the number of offsets (short integers) in the <EM>strings</EM> section;
+
+            (6) the size, in bytes, of the <EM>string</EM> <EM>table</EM>.
+
+       The  capabilities  in  the <EM>boolean</EM> <EM>flags</EM>, <EM>numbers</EM>, and <EM>strings</EM> sections
+       are in the same order as the file &lt;term.h&gt;.
+
+       Short integers are signed, in the range  -32768  to  32767.   They  are
+       stored  as  two  8-bit  bytes.   The  first  byte  contains  the  least
+       significant 8 bits of the value, and the second byte contains the  most
+       significant 8 bits.  (Thus, the value represented is 256*second+first.)
+       This format corresponds to the hardware of the VAX and PDP-11 (that is,
+       little-endian  machines).   Machines  where this does not correspond to
+       the hardware must read the  integers  as  two  bytes  and  compute  the
+       little-endian value.
+
+       Numbers  in  a  terminal  description,  whether they are entries in the
+       <EM>numbers</EM> or <EM>strings</EM> table, are positive  integers.   Boolean  flags  are
+       treated  as  positive  one-byte integers.  In each case, those positive
+       integers represent a terminal capability.  The  terminal  compiler  tic
+       uses  negative  integers  to handle the cases where a capability is not
+       available:
+
+       <STRONG>o</STRONG>   If a capability is absent from this terminal, tic stores  a  -1  in
+           the corresponding table.
+
+           The integer value -1 is represented by two bytes 0377, 0377.
+           Absent boolean values are represented by the byte 0 (false).
+
+       <STRONG>o</STRONG>   If  a capability has been canceled from this terminal, tic stores a
+           -2 in the corresponding table.
+
+           The integer value -2 is represented by two bytes 0377, 0376.
+           The boolean value -2 is represented by the byte 0376.
+
+       <STRONG>o</STRONG>   Other negative values are illegal.
+
+       The <EM>terminal</EM> <EM>names</EM> section comes after the  <EM>header</EM>.   It  contains  the
+       first  line  of the terminfo description, listing the various names for
+       the terminal, separated by  the  "|"  character.   The  <EM>terminal</EM>  <EM>names</EM>
+       section is terminated with an ASCII NUL character.
+
+       The  <EM>boolean</EM>  <EM>flags</EM>  section  has  one  byte  for  each  flag.  Boolean
+       capabilities are either 1 or 0 (true or false) according to whether the
+       terminal supports the given capability or not.
+
+       Between  the  <EM>boolean</EM> <EM>flags</EM> section and the <EM>number</EM> section, a null byte
+       will be inserted, if necessary,  to  ensure  that  the  <EM>number</EM>  section
+       begins  on  an even byte This is a relic of the PDP-11's word-addressed
+       architecture, originally designed to avoid traps induced by  addressing
+       a  word  on  an odd byte boundary.  All short integers are aligned on a
+       short word boundary.
+
+       The <EM>numbers</EM> section is similar to  the  <EM>boolean</EM>  <EM>flags</EM>  section.   Each
+       capability  takes  up two bytes, and is stored as a little-endian short
+       integer.
+
+       The <EM>strings</EM> section is also similar.  Each capability is  stored  as  a
+       short integer.  The capability value is an index into the <EM>string</EM> <EM>table</EM>.
+
+       The <EM>string</EM> <EM>table</EM> is the last section.  It contains all of the values of
+       string capabilities referenced in the <EM>strings</EM> section.  Each string  is
+       null-terminated.  Special characters in ^X or \c notation are stored in
+       their interpreted  form,  not  the  printing  representation.   Padding
+       information  $&lt;nn&gt;  and  parameter  information %x are stored intact in
+       uninterpreted form.
+
+
+</PRE><H3><a name="h3-EXTENDED-STORAGE-FORMAT">EXTENDED STORAGE FORMAT</a></H3><PRE>
+       The previous section describes the conventional terminfo binary format.
+       With  some  minor variations of the offsets (see PORTABILITY), the same
+       binary format is used in all modern UNIX systems.  Each system  uses  a
+       predefined set of boolean, number or string capabilities.
+
+       The <STRONG>ncurses</STRONG> libraries and applications support extended terminfo binary
+       format, allowing users to  define  capabilities  which  are  loaded  at
+       runtime.   This  extension  is made possible by using the fact that the
+       other implementations stop reading the terminfo  data  when  they  have
+       reached  the  end  of the size given in the header.  <STRONG>ncurses</STRONG> checks the
+       size, and if it exceeds that due to the predefined data,  continues  to
+       parse according to its own scheme.
+
+       First, it reads the extended header (5 short integers):
+
+            (1)  count of extended boolean capabilities
+
+            (2)  count of extended numeric capabilities
+
+            (3)  count of extended string capabilities
+
+            (4)  count of the items in extended string table
+
+            (5)  size of the extended string table in bytes
+
+       The  count-  and  size-values for the extended string table include the
+       extended capability <EM>names</EM> as well as extended capability <EM>values</EM>.
+
+       Using the counts and sizes, <STRONG>ncurses</STRONG> allocates arrays and reads data for
+       the extended capabilities in the same order as the header information.
+
+       The  extended  string  table  contains  values for string capabilities.
+       After the end of these values, it contains the names for  each  of  the
+       extended  capabilities  in  order,  e.g.,  booleans,  then  numbers and
+       finally strings.
+
+       Applications which manipulate terminal data  can  use  the  definitions
+       described  in  <STRONG><A HREF="term_variables.3x.html">term_variables(3x)</A></STRONG>  which  associate the long capability
+       names with members of a <STRONG>TERMTYPE</STRONG> structure.
+
+
+</PRE><H3><a name="h3-EXTENDED-NUMBER-FORMAT">EXTENDED NUMBER FORMAT</a></H3><PRE>
+       On occasion, 16-bit signed integers are not large enough.  With <STRONG>ncurses</STRONG>
+       6.1,  a new format was introduced by making a few changes to the legacy
+       format:
+
+       <STRONG>o</STRONG>   a different magic number (octal 01036)
+
+       <STRONG>o</STRONG>   changing the type for the <EM>number</EM> array from signed 16-bit  integers
+           to signed 32-bit integers.
+
+       To   maintain   compatibility,  the  library  presents  the  same  data
+       structures to direct users of the <STRONG>TERMTYPE</STRONG>  structure  as  in  previous
+       formats.   However,  that  cannot  provide  callers  with  the extended
+       numbers.   The  library  uses  a  similar  but  hidden  data  structure
+       <STRONG>TERMTYPE2</STRONG> to provide data for the terminfo functions.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+
+</PRE><H3><a name="h3-setupterm">setupterm</a></H3><PRE>
+       Note  that  it  is  possible for <STRONG>setupterm</STRONG> to expect a different set of
+       capabilities than  are  actually  present  in  the  file.   Either  the
+       database   may   have  been  updated  since  <STRONG>setupterm</STRONG>  was  recompiled
+       (resulting in extra unrecognized entries in the file)  or  the  program
+       may  have  been  recompiled more recently than the database was updated
+       (resulting in missing entries).  The routine <STRONG>setupterm</STRONG> must be prepared
+       for  both  possibilities  -  this  is  why  the  numbers  and sizes are
+       included.  Also, new capabilities must always be added at  the  end  of
+       the lists of boolean, number, and string capabilities.
+
+
+</PRE><H3><a name="h3-Binary-format">Binary format</a></H3><PRE>
+       X/Open  Curses  does  not  specify  a format for the terminfo database.
+       UNIX System V curses used a directory-tree of  binary  files,  one  per
+       terminal description.
+
+       Despite  the  consistent  use  of  little-endian  for  numbers  and the
+       otherwise  self-describing  format,  it  is  not  wise  to   count   on
+       portability   of   binary  terminfo  entries  between  commercial  UNIX
+       versions.  The problem is that there are at  least  three  versions  of
+       terminfo  (under  HP-UX,  AIX,  and OSF/1) which diverged from System V
+       terminfo after SVr1, and  have  added  extension  capabilities  to  the
+       string  table that (in the binary format) collide with System V and XSI
+       Curses extensions.  See <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG> for detailed discussion of terminfo
+       source compatibility issues.
+
+       This  implementation  is by default compatible with the binary terminfo
+       format used by Solaris curses, except in a few less-used details  where
+       it  was  found that the latter did not match X/Open Curses.  The format
+       used by the other Unix versions can be matched by building ncurses with
+       different configuration options.
+
+
+</PRE><H3><a name="h3-Magic-codes">Magic codes</a></H3><PRE>
+       The  magic  number  in a binary terminfo file is the first 16-bits (two
+       bytes).  Besides making it more reliable for the library to check  that
+       a  file  is  terminfo,  utilities such as <STRONG>file(1)</STRONG> also use that to tell
+       what the file-format is.  System V defined more than one magic  number,
+       with 0433, 0435 as screen-dumps (see <STRONG><A HREF="scr_dump.5.html">scr_dump(5)</A></STRONG>).  This implementation
+       uses 01036 as a continuation of that sequence,  but  with  a  different
+       high-order byte to avoid confusion.
+
+
+</PRE><H3><a name="h3-The-TERMTYPE-structure">The TERMTYPE structure</a></H3><PRE>
+       Direct  access  to  the  <STRONG>TERMTYPE</STRONG>  structure  is  provided  for  legacy
+       applications.  Portable  applications  should  use  the  <STRONG>tigetflag</STRONG>  and
+       related  functions  described in <STRONG><A HREF="curs_terminfo.3x.html">curs_terminfo(3x)</A></STRONG> for reading terminal
+       capabilities.
+
+
+</PRE><H3><a name="h3-Mixed-case-terminal-names">Mixed-case terminal names</a></H3><PRE>
+       A small number of terminal descriptions  use  uppercase  characters  in
+       their  names.   If  the  underlying  filesystem  ignores the difference
+       between  uppercase  and  lowercase,  <STRONG>ncurses</STRONG>  represents   the   "first
+       character"  of  the  terminal  name used as the intermediate level of a
+       directory tree in (two-character) hexadecimal form.
+
+
+</PRE><H2><a name="h2-EXAMPLE">EXAMPLE</a></H2><PRE>
+       As an example, here is a description  for  the  Lear-Siegler  ADM-3,  a
+       popular though rather stupid early terminal:
+
+           adm3a|lsi adm3a,
+                   am,
+                   cols#80, lines#24,
+                   bel=^G, clear= 32$&lt;1&gt;, cr=^M, cub1=^H, cud1=^J,
+                   cuf1=^L, cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K,
+                   home=^^, ind=^J,
+
+
+       and a hexadecimal dump of the compiled terminal description:
+
+           0000  1a 01 10 00 02 00 03 00  82 00 31 00 61 64 6d 33  ........ ..1.adm3
+           0010  61 7c 6c 73 69 20 61 64  6d 33 61 00 00 01 50 00  a|lsi ad m3a...P.
+           0020  ff ff 18 00 ff ff 00 00  02 00 ff ff ff ff 04 00  ........ ........
+           0030  ff ff ff ff ff ff ff ff  0a 00 25 00 27 00 ff ff  ........ ..%.'...
+           0040  29 00 ff ff ff ff 2b 00  ff ff 2d 00 ff ff ff ff  ).....+. ..-.....
+           0050  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
+           0060  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
+           0070  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
+           0080  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
+           0090  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
+           00a0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
+           00b0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
+           00c0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
+           00d0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
+           00e0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
+           00f0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
+           0100  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
+           0110  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
+           0120  ff ff ff ff ff ff 2f 00  07 00 0d 00 1a 24 3c 31  ....../. .....$&lt;1
+           0130  3e 00 1b 3d 25 70 31 25  7b 33 32 7d 25 2b 25 63  &gt;..=%p1% {32}%+%c
+           0140  25 70 32 25 7b 33 32 7d  25 2b 25 63 00 0a 00 1e  %p2%{32} %+%c....
+           0150  00 08 00 0c 00 0b 00 0a  00                       ........ .
+
+
+
+</PRE><H2><a name="h2-LIMITS">LIMITS</a></H2><PRE>
+       Some limitations:
+
+       <STRONG>o</STRONG>   total  compiled  entries  cannot  exceed  4096  bytes in the legacy
+           format.
+
+       <STRONG>o</STRONG>   total compiled entries cannot exceed 32768 bytes  in  the  extended
+           format.
+
+       <STRONG>o</STRONG>   the name field cannot exceed 128 bytes.
+
+       Compiled  entries  are  limited to 32768 bytes because offsets into the
+       <EM>strings</EM> <EM>table</EM> use two-byte integers.   The  legacy  format  could  have
+       supported  32768-byte  entries, but was limited a virtual memory page's
+       4096 bytes.
+
+
+</PRE><H2><a name="h2-FILES">FILES</a></H2><PRE>
+       /usr/share/terminfo/*/*  compiled terminal capability database
+
+
+</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="terminfo.5.html">terminfo(5)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Thomas E. Dickey
+       extended terminfo format for ncurses 5.0
+       hashed database support for ncurses 5.6
+       extended number support for ncurses 6.1
+
+       Eric S. Raymond
+       documented legacy terminfo format, e.g., from <EM>pcurses</EM>.
+
+
+
+                                                                       <STRONG><A HREF="term.5.html">term(5)</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-STORAGE-LOCATION">STORAGE LOCATION</a></li>
+<li><a href="#h3-LEGACY-STORAGE-FORMAT">LEGACY STORAGE FORMAT</a></li>
+<li><a href="#h3-EXTENDED-STORAGE-FORMAT">EXTENDED STORAGE FORMAT</a></li>
+<li><a href="#h3-EXTENDED-NUMBER-FORMAT">EXTENDED NUMBER FORMAT</a></li>
+</ul>
+</li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a>
+<ul>
+<li><a href="#h3-setupterm">setupterm</a></li>
+<li><a href="#h3-Binary-format">Binary format</a></li>
+<li><a href="#h3-Magic-codes">Magic codes</a></li>
+<li><a href="#h3-The-TERMTYPE-structure">The TERMTYPE structure</a></li>
+<li><a href="#h3-Mixed-case-terminal-names">Mixed-case terminal names</a></li>
+</ul>
+</li>
+<li><a href="#h2-EXAMPLE">EXAMPLE</a></li>
+<li><a href="#h2-LIMITS">LIMITS</a></li>
+<li><a href="#h2-FILES">FILES</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/term.7.html b/doc/html/man/term.7.html
new file mode 100644
index 0000000..009f674
--- /dev/null
+++ b/doc/html/man/term.7.html
@@ -0,0 +1,231 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2020,2021 Thomas E. Dickey                                *
+  * Copyright 1998-2011,2017 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: term.7,v 1.31 2021/12/25 17:39:16 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>term 7</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">term 7</H1>
+<PRE>
+<STRONG><A HREF="term.7.html">term(7)</A></STRONG>                Miscellaneous Information Manual                <STRONG><A HREF="term.7.html">term(7)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       term - conventions for naming terminal types
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The  environment variable <STRONG>TERM</STRONG> should normally contain the type name of
+       the terminal, console or  display-device  type  you  are  using.   This
+       information  is  critical  for  all screen-oriented programs, including
+       your editor and mailer.
+
+       A default <STRONG>TERM</STRONG> value  will  be  set  on  a  per-line  basis  by  either
+       <STRONG>/etc/inittab</STRONG>  (e.g.,  System-V-like  UNIXes) or <STRONG>/etc/ttys</STRONG> (BSD UNIXes).
+       This will nearly  always  suffice  for  workstation  and  microcomputer
+       consoles.
+
+       If  you  use a dialup line, the type of device attached to it may vary.
+       Older UNIX systems pre-set a very dumb terminal  type  like  "dumb"  or
+       "dialup"  on  dialup lines.  Newer ones may pre-set "vt100", reflecting
+       the prevalence of DEC VT100-compatible terminals and  personal-computer
+       emulators.
+
+       Modern  telnets pass your <STRONG>TERM</STRONG> environment variable from the local side
+       to the remote one.  There can be problems if  the  remote  terminfo  or
+       termcap  entry  for  your  type  is not compatible with yours, but this
+       situation is rare and  can  almost  always  be  avoided  by  explicitly
+       exporting  "vt100"  (assuming  you  are  in fact using a VT100-superset
+       console, terminal, or terminal emulator).
+
+       In any case, you are free to override the system <STRONG>TERM</STRONG> setting  to  your
+       taste in your shell profile.  The <STRONG><A HREF="tset.1.html">tset(1)</A></STRONG> utility may be of assistance;
+       you can give it a set of rules for deducing or  requesting  a  terminal
+       type based on the tty device and baud rate.
+
+       Setting  your  own  <STRONG>TERM</STRONG> value may also be useful if you have created a
+       custom entry incorporating options (such as  visual  bell  or  reverse-
+       video)  which  you  wish  to  override the system default type for your
+       line.
+
+       Terminal type descriptions are  stored  as  files  of  capability  data
+       underneath /usr/share/terminfo.  To browse a list of all terminal names
+       recognized by the system, do
+
+            toe | more
+
+       from your shell.   These  capability  files  are  in  a  binary  format
+       optimized for retrieval speed (unlike the old text-based <STRONG>termcap</STRONG> format
+       they replace); to examine  an  entry,  you  must  use  the  <STRONG><A HREF="infocmp.1m.html">infocmp(1m)</A></STRONG>
+       command.  Invoke it as follows:
+
+            infocmp <EM>entry</EM><STRONG>_</STRONG><EM>name</EM>
+
+       where  <EM>entry</EM><STRONG>_</STRONG><EM>name</EM>  is the name of the type you wish to examine (and the
+       name of its capability file  the  subdirectory  of  /usr/share/terminfo
+       named  for  its first letter).  This command dumps a capability file in
+       the text format described by <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG>.
+
+       The first line of a <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG> description gives the  names  by  which
+       terminfo  knows a terminal, separated by "|" (pipe-bar) characters with
+       the last name field terminated by a comma.  The first name field is the
+       type's <EM>primary</EM> <EM>name</EM>, and is the one to use when setting <STRONG>TERM</STRONG>.  The last
+       name field (if distinct from the first) is actually  a  description  of
+       the  terminal  type  (it  may contain blanks; the others must be single
+       words).  Name fields between  the  first  and  last  (if  present)  are
+       aliases  for  the  terminal,  usually  historical  names  retained  for
+       compatibility.
+
+       There are some conventions for how to  choose  terminal  primary  names
+       that  help  keep  them  informative and unique.  Here is a step-by-step
+       guide to naming terminals that also explains how to parse them:
+
+       First, choose a root name.  The  root  will  consist  of  a  lower-case
+       letter  followed by up to seven lower-case letters or digits.  You need
+       to avoid using punctuation characters in root names, because  they  are
+       used and interpreted as filenames and shell meta-characters (such as !,
+       $, *, ?, etc.) embedded in them may cause odd and  unhelpful  behavior.
+       The  slash  (/),  or  any  other  character  that may be interpreted by
+       anyone's file system (\, $, [, ]), is especially dangerous (terminfo is
+       platform-independent,  and choosing names with special characters could
+       someday make life difficult for users of a future port).  The  dot  (.)
+       character  is  relatively safe as long as there is at most one per root
+       name; some historical terminfo names use it.
+
+       The root name for a terminal or workstation console type should  almost
+       always  begin  with a vendor prefix (such as <STRONG>hp</STRONG> for Hewlett-Packard, <STRONG>wy</STRONG>
+       for Wyse, or <STRONG>att</STRONG> for AT&amp;T terminals), or a common name of the  terminal
+       line  (<STRONG>vt</STRONG>  for  the  VT  series  of  terminals from DEC, or <STRONG>sun</STRONG> for Sun
+       Microsystems workstation  consoles,  or  <STRONG>regent</STRONG>  for  the  ADDS  Regent
+       series.   You  can  list  the  terminfo  tree  to see what prefixes are
+       already in common use.  The root name prefix should  be  followed  when
+       appropriate by a model number; thus <STRONG>vt100</STRONG>, <STRONG>hp2621</STRONG>, <STRONG>wy50</STRONG>.
+
+       The  root  name for a PC-Unix console type should be the OS name, i.e.,
+       <STRONG>linux</STRONG>, <STRONG>bsdos</STRONG>, <STRONG>freebsd</STRONG>, <STRONG>netbsd</STRONG>.  It should <EM>not</EM> be <STRONG>console</STRONG> or  any  other
+       generic that might cause confusion in a multi-platform environment!  If
+       a model number follows, it should indicate either the OS release  level
+       or the console driver release level.
+
+       The  root name for a terminal emulator (assuming it does not fit one of
+       the standard ANSI or vt100 types) should  be  the  program  name  or  a
+       readily recognizable abbreviation of it (i.e., <STRONG>versaterm</STRONG>, <STRONG>ctrm</STRONG>).
+
+       Following  the  root name, you may add any reasonable number of hyphen-
+       separated feature suffixes.
+
+       2p   Has two pages of memory.  Likewise 4p, 8p, etc.
+
+       mc   Magic-cookie.  Some  terminals  (notably  older  Wyses)  can  only
+            support  one  attribute  without magic-cookie lossage.  Their base
+            entry is usually paired with another that has this suffix and uses
+            magic cookies to support multiple attributes.
+
+       -am  Enable auto-margin (right-margin wraparound).
+
+       -m   Mono mode - suppress color support.
+
+       -na  No  arrow  keys  -  termcap  ignores arrow keys which are actually
+            there on the terminal, so the user can use the arrow keys locally.
+
+       -nam No auto-margin - suppress am capability.
+
+       -nl  No labels - suppress soft labels.
+
+       -nsl No status line - suppress status line.
+
+       -pp  Has a printer port which is used.
+
+       -rv  Terminal in reverse video mode (black on white).
+
+       -s   Enable status line.
+
+       -vb  Use visible bell (flash) rather than beep.
+
+       -w   Wide; terminal is in 132-column mode.
+
+       Conventionally, if your terminal type is a variant intended to  specify
+       a  line  height,  that  suffix should go first.  So, for a hypothetical
+       FuBarCo model 2317 terminal in 30-line mode with  reverse  video,  best
+       form would be <STRONG>fubar-30-rv</STRONG> (rather than, say, "fubar-rv-30").
+
+       Terminal  types  that are written not as standalone entries, but rather
+       as components to be plugged into other entries  via  <STRONG>use</STRONG>  capabilities,
+       are distinguished by using embedded plus signs rather than dashes.
+
+       Commands which use a terminal type to control display often accept a -T
+       option that accepts a terminal name  argument.   Such  programs  should
+       fall  back  on  the  <STRONG>TERM</STRONG>  environment  variable  when  no -T option is
+       specified.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       For maximum compatibility with older System V UNIXes, names and aliases
+       should be unique within the first 14 characters.
+
+
+</PRE><H2><a name="h2-FILES">FILES</a></H2><PRE>
+       /usr/share/terminfo/?/*
+            compiled terminal capability database
+
+       /etc/inittab
+            tty line initialization (AT&amp;T-like UNIXes)
+
+       /etc/ttys
+            tty line initialization (BSD-like UNIXes)
+
+
+</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="terminfo.5.html">terminfo(5)</A></STRONG>, <STRONG><A HREF="term.5.html">term(5)</A></STRONG>.
+
+
+
+                                                                       <STRONG><A HREF="term.7.html">term(7)</A></STRONG>
+</PRE>
+<div class="nav">
+<ul>
+<li><a href="#h2-NAME">NAME</a></li>
+<li><a href="#h2-DESCRIPTION">DESCRIPTION</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-FILES">FILES</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/term_variables.3x.html b/doc/html/man/term_variables.3x.html
new file mode 100644
index 0000000..6e93083
--- /dev/null
+++ b/doc/html/man/term_variables.3x.html
@@ -0,0 +1,200 @@
+<!--
+  ****************************************************************************
+  * Copyright 2019-2020,2021 Thomas E. Dickey                                *
+  * Copyright 2010-2015,2017 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: term_variables.3x,v 1.15 2021/12/25 22:03:30 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>term_variables 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">term_variables 3x</H1>
+<PRE>
+<STRONG><A HREF="term_variables.3x.html">term_variables(3x)</A></STRONG>                                          <STRONG><A HREF="term_variables.3x.html">term_variables(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>SP</STRONG>, <STRONG>acs_map</STRONG>, <STRONG>boolcodes</STRONG>, <STRONG>boolfnames</STRONG>, <STRONG>boolnames</STRONG>, <STRONG>cur_term</STRONG>, <STRONG>numcodes</STRONG>,
+       <STRONG>numfnames</STRONG>, <STRONG>numnames</STRONG>, <STRONG>strcodes</STRONG>, <STRONG>strfnames</STRONG>, <STRONG>strnames</STRONG>, <STRONG>ttytype</STRONG> - <STRONG>curses</STRONG>
+       terminfo global variables
+
+
+</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>chtype</STRONG> <STRONG>acs_map[];</STRONG>
+
+       <STRONG>SCREEN</STRONG> <STRONG>*</STRONG> <STRONG>SP;</STRONG>
+
+       <STRONG>TERMINAL</STRONG> <STRONG>*</STRONG> <STRONG>cur_term;</STRONG>
+
+       <STRONG>char</STRONG> <STRONG>ttytype[];</STRONG>
+
+       <STRONG>NCURSES_CONST</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG> <STRONG>const</STRONG> <STRONG>boolcodes[];</STRONG>
+       <STRONG>NCURSES_CONST</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG> <STRONG>const</STRONG> <STRONG>boolfnames[];</STRONG>
+       <STRONG>NCURSES_CONST</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG> <STRONG>const</STRONG> <STRONG>boolnames[];</STRONG>
+
+       <STRONG>NCURSES_CONST</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG> <STRONG>const</STRONG> <STRONG>numcodes[];</STRONG>
+       <STRONG>NCURSES_CONST</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG> <STRONG>const</STRONG> <STRONG>numfnames[];</STRONG>
+       <STRONG>NCURSES_CONST</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG> <STRONG>const</STRONG> <STRONG>numnames[];</STRONG>
+
+       <STRONG>NCURSES_CONST</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG> <STRONG>const</STRONG> <STRONG>strcodes[];</STRONG>
+       <STRONG>NCURSES_CONST</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG> <STRONG>const</STRONG> <STRONG>strfnames[];</STRONG>
+       <STRONG>NCURSES_CONST</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG> <STRONG>const</STRONG> <STRONG>strnames[];</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       This  page  summarizes  variables provided by the <STRONG>curses</STRONG> library's low-
+       level terminfo interface.  A more complete description is given in  the
+       <STRONG><A HREF="curs_terminfo.3x.html">curs_terminfo(3x)</A></STRONG> manual page.
+
+       Depending  on  the  configuration,  these  may  be actual variables, or
+       macros (see <STRONG><A HREF="curs_threads.3x.html">curs_threads(3x)</A></STRONG>) which provide read-only access  to  <EM>curs-</EM>
+       <EM>es</EM>'s state.  In either case, applications should treat them as read-on-
+       ly to avoid confusing the library.
+
+
+</PRE><H3><a name="h3-Alternate-Character-Set-Mapping">Alternate Character Set Mapping</a></H3><PRE>
+       After initializing the curses or terminfo interfaces, the <STRONG>acs_map</STRONG> array
+       holds  information  used to translate cells with the <STRONG>A_ALTCHARSET</STRONG> video
+       attribute into line-drawing characters.
+
+       The encoding of the information in this array has changed periodically.
+       Application  developers  need  only know that it is used for the "ACS_"
+       constants in &lt;curses.h&gt;.
+
+       The comparable data for the wide-character library is a  private  vari-
+       able.
+
+
+</PRE><H3><a name="h3-Current-Terminal-Data">Current Terminal Data</a></H3><PRE>
+       After initializing the curses or terminfo interfaces, the <STRONG>cur_term</STRONG> con-
+       tains data describing the current terminal.  This variable is also  set
+       as a side-effect of <STRONG><A HREF="curs_initscr.3x.html">set_term(3x)</A></STRONG> and <STRONG><A HREF="curs_initscr.3x.html">delscreen(3x)</A></STRONG>.
+
+       It  is possible to save a value of <STRONG>cur_term</STRONG> for subsequent use as a pa-
+       rameter to <STRONG>set_term</STRONG>, for switching between screens.  Alternatively, one
+       can  save  the  return  value from <STRONG>newterm</STRONG> or <STRONG><A HREF="curs_terminfo.3x.html">setupterm(3x)</A></STRONG> to reuse in
+       <STRONG>set_term</STRONG>.
+
+
+</PRE><H3><a name="h3-Terminfo-Lookup-Tables">Terminfo Lookup Tables</a></H3><PRE>
+       The <STRONG><A HREF="tic.1m.html">tic(1)</A></STRONG> and <STRONG><A HREF="infocmp.1m.html">infocmp(1)</A></STRONG> programs use lookup tables for the  long  and
+       short  names  of  terminfo  capabilities,  as well as the corresponding
+       names for termcap capabilities.  These are available to other  applica-
+       tions,  although the hash-tables used by the terminfo and termcap func-
+       tions are not available.
+
+       The long terminfo capability names use a  "l"  (ell)  in  their  names:
+       <STRONG>boolfnames</STRONG>, <STRONG>numfnames</STRONG>, and <STRONG>strfnames</STRONG>.
+
+       These  are  the  short names for terminfo capabilities: <STRONG>boolnames</STRONG>, <STRONG>num-</STRONG>
+       <STRONG>names</STRONG>, and <STRONG>strnames</STRONG>.
+
+       These are the corresponding names used for termcap descriptions:  <STRONG>bool-</STRONG>
+       <STRONG>codes</STRONG>, <STRONG>numcodes</STRONG>, and <STRONG>strcodes</STRONG>.
+
+
+</PRE><H3><a name="h3-Terminal-Type">Terminal Type</a></H3><PRE>
+       A terminal description begins with one or more terminal names separated
+       by "|" (vertical bars).  On initialization of the  curses  or  terminfo
+       interfaces,  <STRONG><A HREF="curs_terminfo.3x.html">setupterm(3x)</A></STRONG>  copies the terminal names to the array <STRONG>tty-</STRONG>
+       <STRONG>type</STRONG>.
+
+
+</PRE><H3><a name="h3-Terminfo-Names">Terminfo Names</a></H3><PRE>
+       In addition to the variables, <STRONG>&lt;term.h&gt;</STRONG> also defines a symbol  for  each
+       terminfo  capability  <EM>long</EM> <EM>name</EM>.  These are in terms of the symbol <STRONG>CUR</STRONG>,
+       which is defined
+
+       #define CUR ((TERMTYPE *)(cur_term))-&gt;
+
+       These symbols provide a faster method of accessing  terminfo  capabili-
+       ties than using <STRONG><A HREF="curs_terminfo.3x.html">tigetstr(3x)</A></STRONG>, etc.
+
+       The  actual definition of <STRONG>CUR</STRONG> depends upon the implementation, but each
+       terminfo library provides these long names defined to  point  into  the
+       current terminal description loaded into memory.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  low-level  terminfo  interface is initialized using <STRONG><A HREF="curs_terminfo.3x.html">setupterm(3x)</A></STRONG>.
+       The upper-level curses interface uses the low-level terminfo interface,
+       internally.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       X/Open Curses does not describe any of these except for <STRONG>cur_term</STRONG>.  (The
+       inclusion of <STRONG>cur_term</STRONG> appears to be an oversight, since other  compara-
+       ble low-level information is omitted by X/Open).
+
+       Other  implementations may have comparable variables.  Some implementa-
+       tions provide the variables in their libraries, but omit them from  the
+       header files.
+
+       All  implementations  which provide terminfo interfaces add definitions
+       as described in the <STRONG>Terminfo</STRONG> <STRONG>Names</STRONG> section.  Most, but  not  all,  base
+       the definition upon the <STRONG>cur_term</STRONG> variable.
+
+
+</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_terminfo.3x.html">curs_terminfo(3x)</A></STRONG>, <STRONG><A HREF="curs_threads.3x.html">curs_threads(3x)</A></STRONG>, <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG>.
+
+
+
+                                                            <STRONG><A HREF="term_variables.3x.html">term_variables(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-Alternate-Character-Set-Mapping">Alternate Character Set Mapping</a></li>
+<li><a href="#h3-Current-Terminal-Data">Current Terminal Data</a></li>
+<li><a href="#h3-Terminfo-Lookup-Tables">Terminfo Lookup Tables</a></li>
+<li><a href="#h3-Terminal-Type">Terminal Type</a></li>
+<li><a href="#h3-Terminfo-Names">Terminfo Names</a></li>
+</ul>
+</li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/terminfo.5.html b/doc/html/man/terminfo.5.html
new file mode 100644
index 0000000..23b27bf
--- /dev/null
+++ b/doc/html/man/terminfo.5.html
@@ -0,0 +1,2704 @@
+<!--
+  * t
+  * DO NOT EDIT THIS FILE BY HAND!
+  * It is generated from terminfo.head,  ./../include/Caps ./../include/Caps-ncurses, and terminfo.tail.
+  * Note: this must be run through tbl before nroff.
+  * The magic cookie on the first line triggers this under some man programs.
+  ****************************************************************************
+  * Copyright 2018-2020,2021 Thomas E. Dickey                                *
+  * Copyright 1998-2016,2017 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: terminfo.head,v 1.42 2021/12/25 17:39:16 tom Exp @
+  * Head of terminfo man page ends here
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2016,2017 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: terminfo.tail,v 1.113 2022/12/10 19:51:10 tom Exp @
+  *.in -2
+  *.in +2
+  *.in -2
+  *.in +2
+  *.TH
+-->
+<!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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>terminfo 5   File Formats</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">terminfo 5   File Formats</H1>
+<PRE>
+<STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG>                      File Formats                      <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       terminfo - terminal capability database
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       /usr/share/terminfo/*/*
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       <EM>Terminfo</EM>  is  a  database describing terminals, used by screen-oriented
+       programs  such  as  <STRONG>nvi(1)</STRONG>,  <STRONG>lynx(1)</STRONG>,   <STRONG>mutt(1)</STRONG>,   and   other   curses
+       applications,  using  high-level calls to libraries such as <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG>.
+       It is also used via low-level calls by  non-curses  applications  which
+       may  be  screen-oriented  (such  as  <STRONG><A HREF="clear.1.html">clear(1)</A></STRONG>)  or  non-screen (such as
+       <STRONG><A HREF="tabs.1.html">tabs(1)</A></STRONG>).
+
+       <EM>Terminfo</EM> describes terminals by giving a set of capabilities which they
+       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 20221231).
+
+
+</PRE><H3><a name="h3-Terminfo-Entry-Syntax">Terminfo Entry Syntax</a></H3><PRE>
+       Entries in <EM>terminfo</EM> consist of a sequence of fields:
+
+       <STRONG>o</STRONG>   Each field ends with a comma "," (embedded commas  may  be  escaped
+           with a backslash or written as "\054").
+
+       <STRONG>o</STRONG>   White space between fields is ignored.
+
+       <STRONG>o</STRONG>   The first field in a <EM>terminfo</EM> entry begins in the first column.
+
+       <STRONG>o</STRONG>   Newlines  and  leading  whitespace (spaces or tabs) may be used for
+           formatting entries for readability.  These are removed from  parsed
+           entries.
+
+           The  <STRONG>infocmp</STRONG>  <STRONG>-f</STRONG> and <STRONG>-W</STRONG> options rely on this to format if-then-else
+           expressions, or  to  enforce  maximum  line-width.   The  resulting
+           formatted terminal description can be read by <STRONG>tic</STRONG>.
+
+       <STRONG>o</STRONG>   The  first  field for each terminal gives the names which are known
+           for the terminal, separated by "|" characters.
+
+           The first name given  is  the  most  common  abbreviation  for  the
+           terminal  (its  primary name), the last name given should be a long
+           name fully identifying the terminal  (see  <STRONG><A HREF="curs_termattrs.3x.html">longname(3x)</A></STRONG>),  and  all
+           others  are  treated as synonyms (aliases) for the primary terminal
+           name.
+
+           X/Open Curses advises that all names but  the  last  should  be  in
+           lower  case  and  contain no blanks; the last name may well contain
+           upper case and blanks for readability.
+
+           This implementation is not so strict; it allows mixed case  in  the
+           primary name and aliases.  If the last name has no embedded blanks,
+           it allows that to be both an alias and a  verbose  name  (but  will
+           warn about this ambiguity).
+
+       <STRONG>o</STRONG>   Lines  beginning  with  a  "#"  in  the first column are treated as
+           comments.
+
+           While comment lines are legal at any point, the output of <STRONG>captoinfo</STRONG>
+           and  <STRONG>infotocap</STRONG>  (aliases  for <STRONG>tic</STRONG>) will move comments so they occur
+           only between entries.
+
+       Terminal names (except for the last, verbose entry)  should  be  chosen
+       using  the  following  conventions.   The  particular piece of hardware
+       making up the terminal should have a root name,  thus  "hp2621".   This
+       name should not contain hyphens.  Modes that the hardware can be in, or
+       user preferences, should be indicated by appending a hyphen and a  mode
+       suffix.   Thus,  a  vt100  in  132-column  mode  would be vt100-w.  The
+       following suffixes should be used where possible:
+
+            <STRONG>Suffix</STRONG>                  <STRONG>Meaning</STRONG>                   <STRONG>Example</STRONG>
+            -<EM>nn</EM>      Number of lines on the screen            aaa-60
+            -<EM>n</EM>p      Number of pages of memory                c100-4p
+            -am      With automargins (usually the default)   vt100-am
+            -m       Mono mode; suppress color                ansi-m
+            -mc      Magic cookie; spaces when highlighting   wy30-mc
+            -na      No arrow keys (leave them in local)      c100-na
+            -nam     Without automatic margins                vt100-nam
+            -nl      No status line                           att4415-nl
+            -ns      No status line                           hp2626-ns
+            -rv      Reverse video                            c100-rv
+            -s       Enable status line                       vt100-s
+            -vb      Use visible bell instead of beep         wy370-vb
+            -w       Wide mode (&gt; 80 columns, usually 132)    vt100-w
+
+       For more on terminal naming conventions, see the <STRONG><A HREF="term.7.html">term(7)</A></STRONG> manual page.
+
+
+</PRE><H3><a name="h3-Terminfo-Capabilities-Syntax">Terminfo Capabilities Syntax</a></H3><PRE>
+       The terminfo entry consists of  several  <EM>capabilities</EM>,  i.e.,  features
+       that  the  terminal  has,  or  methods  for  exercising  the terminal's
+       features.
+
+       After the first field (giving the name(s) of the terminal entry), there
+       should be one or more <EM>capability</EM> fields.  These are boolean, numeric or
+       string names with corresponding values:
+
+       <STRONG>o</STRONG>   Boolean capabilities are true  when  present,  false  when  absent.
+           There is no explicit value for boolean capabilities.
+
+       <STRONG>o</STRONG>   Numeric  capabilities  have  a  "#"  following  the  name,  then an
+           unsigned decimal integer value.
+
+       <STRONG>o</STRONG>   String capabilities have a "=" following the name, then  an  string
+           of characters making up the capability value.
+
+           String  capabilities  can be split into multiple lines, just as the
+           fields comprising a terminal  entry  can  be  split  into  multiple
+           lines.   While  blanks  between fields are ignored, blanks embedded
+           within a string value are retained, except for leading blanks on  a
+           line.
+
+       Any  capability  can  be  <EM>canceled</EM>,  i.e., suppressed from the terminal
+       entry, by following its name with "@" rather than a capability value.
+
+
+</PRE><H3><a name="h3-Similar-Terminals">Similar Terminals</a></H3><PRE>
+       If there are two very similar  terminals,  one  (the  variant)  can  be
+       defined   as  being  just  like  the  other  (the  base)  with  certain
+       exceptions.  In the definition of the variant,  the  string  capability
+       <STRONG>use</STRONG> can be given with the name of the base terminal:
+
+       <STRONG>o</STRONG>   The  capabilities  given before <STRONG>use</STRONG> override those in the base type
+           named by <STRONG>use</STRONG>.
+
+       <STRONG>o</STRONG>   If there are multiple <STRONG>use</STRONG> capabilities, they are merged in  reverse
+           order.   That  is,  the rightmost <STRONG>use</STRONG> reference is processed first,
+           then the one to its left, and so forth.
+
+       <STRONG>o</STRONG>   Capabilities given explicitly in the entry override  those  brought
+           in by <STRONG>use</STRONG> references.
+
+       A  capability  can  be  canceled  by placing <STRONG>xx@</STRONG> to the left of the use
+       reference that imports it, where <EM>xx</EM> is the  capability.   For  example,
+       the entry
+
+              2621-nl, smkx@, rmkx@, use=2621,
+
+       defines a 2621-nl that does not have the <STRONG>smkx</STRONG> or <STRONG>rmkx</STRONG> capabilities, and
+       hence does not turn on the function key labels  when  in  visual  mode.
+       This  is  useful  for  different modes for a terminal, or for different
+       user preferences.
+
+       An entry included via <STRONG>use</STRONG> can contain canceled capabilities, which have
+       the  same  effect as if those cancels were inline in the using terminal
+       entry.
+
+
+</PRE><H3><a name="h3-Predefined-Capabilities">Predefined Capabilities</a></H3><PRE>
+       The following is a complete table of the  capabilities  included  in  a
+       terminfo  description  block  and available to terminfo-using code.  In
+       each line of the table,
+
+       The <STRONG>variable</STRONG> is the name by  which  the  programmer  (at  the  terminfo
+       level) accesses the capability.
+
+       The  <STRONG>capname</STRONG> is the short name used in the text of the database, and is
+       used by a person updating the database.   Whenever  possible,  capnames
+       are chosen to be the same as or similar to the ANSI X3.64-1979 standard
+       (now superseded by  ECMA-48,  which  uses  identical  or  very  similar
+       names).    Semantics   are   also   intended  to  match  those  of  the
+       specification.
+
+       The termcap code is the old <STRONG>termcap</STRONG> capability name (some  capabilities
+       are new, and have names which termcap did not originate).
+
+       Capability  names have no hard length limit, but an informal limit of 5
+       characters has been adopted to keep them short and to allow the tabs in
+       the source file <STRONG>Caps</STRONG> to line up nicely.
+
+       Finally,  the description field attempts to convey the semantics of the
+       capability.  You may find some codes in the description field:
+
+       (P)    indicates that padding may be specified
+
+       #[1-9] in the description field indicates that  the  string  is  passed
+              through <STRONG><A HREF="curs_terminfo.3x.html">tparm(3x)</A></STRONG> with parameters as given (#<EM>i</EM>).
+
+              If  no  parameters  are  listed  in the description, passing the
+              string through <STRONG><A HREF="curs_terminfo.3x.html">tparm(3x)</A></STRONG> may give unexpected results,  e.g.,  if
+              it contains percent (%%) signs.
+
+       (P*)   indicates  that  padding may vary in proportion to the number of
+              lines affected
+
+       (#<EM>i</EM>)   indicates the <EM>i</EM>th parameter.
+
+
+       These are the boolean capabilities:
+
+
+                  <STRONG>Variable</STRONG>            <STRONG>Cap-</STRONG>      <STRONG>TCap</STRONG>       <STRONG>Description</STRONG>
+                  <STRONG>Booleans</STRONG>            <STRONG>name</STRONG>      <STRONG>Code</STRONG>
+
+
+
+          auto_left_margin            bw        bw     cub1 wraps from
+                                                       column 0 to last
+                                                       column
+          auto_right_margin           am        am     terminal has
+                                                       automatic margins
+          back_color_erase            bce       ut     screen erased with
+                                                       background color
+          can_change                  ccc       cc     terminal can re-
+                                                       define existing
+                                                       colors
+          ceol_standout_glitch        xhp       xs     standout not erased
+                                                       by overwriting (hp)
+          col_addr_glitch             xhpa      YA     only positive motion
+                                                       for hpa/mhpa caps
+          cpi_changes_res             cpix      YF     changing character
+                                                       pitch changes
+                                                       resolution
+          cr_cancels_micro_mode       crxm      YB     using cr turns off
+                                                       micro mode
+          dest_tabs_magic_smso        xt        xt     tabs destructive,
+                                                       magic so char
+                                                       (t1061)
+          eat_newline_glitch          xenl      xn     newline ignored
+                                                       after 80 cols
+                                                       (concept)
+          erase_overstrike            eo        eo     can erase
+                                                       overstrikes with a
+                                                       blank
+          generic_type                gn        gn     generic line type
+          hard_copy                   hc        hc     hardcopy terminal
+          hard_cursor                 chts      HC     cursor is hard to
+                                                       see
+          has_meta_key                km        km     Has a meta key
+                                                       (i.e., sets 8th-bit)
+          has_print_wheel             daisy     YC     printer needs
+                                                       operator to change
+                                                       character set
+          has_status_line             hs        hs     has extra status
+                                                       line
+          hue_lightness_saturation    hls       hl     terminal uses only
+                                                       HLS color notation
+                                                       (Tektronix)
+          insert_null_glitch          in        in     insert mode
+                                                       distinguishes nulls
+          lpi_changes_res             lpix      YG     changing line pitch
+                                                       changes resolution
+          memory_above                da        da     display may be
+                                                       retained above the
+                                                       screen
+          memory_below                db        db     display may be
+                                                       retained below the
+                                                       screen
+          move_insert_mode            mir       mi     safe to move while
+                                                       in insert mode
+          move_standout_mode          msgr      ms     safe to move while
+                                                       in standout mode
+          needs_xon_xoff              nxon      nx     padding will not
+                                                       work, xon/xoff
+                                                       required
+          no_esc_ctlc                 xsb       xb     beehive (f1=escape,
+                                                       f2=ctrl C)
+          no_pad_char                 npc       NP     pad character does
+                                                       not exist
+          non_dest_scroll_region      ndscr     ND     scrolling region is
+                                                       non-destructive
+
+          non_rev_rmcup               nrrmc     NR     smcup does not
+                                                       reverse rmcup
+          over_strike                 os        os     terminal can
+                                                       overstrike
+          prtr_silent                 mc5i      5i     printer will not
+                                                       echo on screen
+          row_addr_glitch             xvpa      YD     only positive motion
+                                                       for vpa/mvpa caps
+          semi_auto_right_margin      sam       YE     printing in last
+                                                       column causes cr
+          status_line_esc_ok          eslok     es     escape can be used
+                                                       on the status line
+          tilde_glitch                hz        hz     cannot print ~'s
+                                                       (Hazeltine)
+          transparent_underline       ul        ul     underline character
+                                                       overstrikes
+          xon_xoff                    xon       xo     terminal uses
+                                                       xon/xoff handshaking
+
+       These are the numeric capabilities:
+
+
+                  <STRONG>Variable</STRONG>            <STRONG>Cap-</STRONG>      <STRONG>TCap</STRONG>       <STRONG>Description</STRONG>
+                   <STRONG>Numeric</STRONG>            <STRONG>name</STRONG>      <STRONG>Code</STRONG>
+          columns                     cols      co     number of columns in
+                                                       a line
+          init_tabs                   it        it     tabs initially every
+                                                       # spaces
+          label_height                lh        lh     rows in each label
+          label_width                 lw        lw     columns in each
+                                                       label
+          lines                       lines     li     number of lines on
+                                                       screen or page
+          lines_of_memory             lm        lm     lines of memory if &gt;
+                                                       line. 0 means varies
+          magic_cookie_glitch         xmc       sg     number of blank
+                                                       characters left by
+                                                       smso or rmso
+          max_attributes              ma        ma     maximum combined
+                                                       attributes terminal
+                                                       can handle
+          max_colors                  colors    Co     maximum number of
+                                                       colors on screen
+          max_pairs                   pairs     pa     maximum number of
+                                                       color-pairs on the
+                                                       screen
+          maximum_windows             wnum      MW     maximum number of
+                                                       definable windows
+          no_color_video              ncv       NC     video attributes
+                                                       that cannot be used
+                                                       with colors
+          num_labels                  nlab      Nl     number of labels on
+                                                       screen
+          padding_baud_rate           pb        pb     lowest baud rate
+                                                       where padding needed
+          virtual_terminal            vt        vt     virtual terminal
+                                                       number (CB/unix)
+          width_status_line           wsl       ws     number of columns in
+                                                       status line
+
+       The  following  numeric  capabilities  are  present  in the SVr4.0 term
+       structure, but are not yet documented in the man page.   They  came  in
+       with SVr4's printer support.
+
+
+
+                  <STRONG>Variable</STRONG>            <STRONG>Cap-</STRONG>      <STRONG>TCap</STRONG>       <STRONG>Description</STRONG>
+                   <STRONG>Numeric</STRONG>            <STRONG>name</STRONG>      <STRONG>Code</STRONG>
+          bit_image_entwining         bitwin    Yo     number of passes for
+                                                       each bit-image row
+          bit_image_type              bitype    Yp     type of bit-image
+                                                       device
+          buffer_capacity             bufsz     Ya     numbers of bytes
+                                                       buffered before
+                                                       printing
+          buttons                     btns      BT     number of buttons on
+                                                       mouse
+          dot_horz_spacing            spinh     Yc     spacing of dots
+                                                       horizontally in dots
+                                                       per inch
+          dot_vert_spacing            spinv     Yb     spacing of pins
+                                                       vertically in pins
+                                                       per inch
+          max_micro_address           maddr     Yd     maximum value in
+                                                       micro_..._address
+          max_micro_jump              mjump     Ye     maximum value in
+                                                       parm_..._micro
+          micro_col_size              mcs       Yf     character step size
+                                                       when in micro mode
+          micro_line_size             mls       Yg     line step size when
+                                                       in micro mode
+          number_of_pins              npins     Yh     numbers of pins in
+                                                       print-head
+          output_res_char             orc       Yi     horizontal
+                                                       resolution in units
+                                                       per line
+          output_res_horz_inch        orhi      Yk     horizontal
+                                                       resolution in units
+                                                       per inch
+          output_res_line             orl       Yj     vertical resolution
+                                                       in units per line
+          output_res_vert_inch        orvi      Yl     vertical resolution
+                                                       in units per inch
+          print_rate                  cps       Ym     print rate in
+                                                       characters per
+                                                       second
+          wide_char_size              widcs     Yn     character step size
+                                                       when in double wide
+                                                       mode
+
+       These are the string capabilities:
+
+
+                  <STRONG>Variable</STRONG>            <STRONG>Cap-</STRONG>      <STRONG>TCap</STRONG>       <STRONG>Description</STRONG>
+                   <STRONG>String</STRONG>             <STRONG>name</STRONG>      <STRONG>Code</STRONG>
+          acs_chars                   acsc      ac     graphics charset
+                                                       pairs, based on
+                                                       vt100
+          back_tab                    cbt       bt     back tab (P)
+          bell                        bel       bl     audible signal
+                                                       (bell) (P)
+          carriage_return             cr        cr     carriage return (P*)
+                                                       (P*)
+          change_char_pitch           cpi       ZA     Change number of
+                                                       characters per inch
+                                                       to #1
+          change_line_pitch           lpi       ZB     Change number of
+                                                       lines per inch to #1
+          change_res_horz             chr       ZC     Change horizontal
+                                                       resolution to #1
+
+
+          change_res_vert             cvr       ZD     Change vertical
+                                                       resolution to #1
+          change_scroll_region        csr       cs     change region to
+                                                       line #1 to line #2
+                                                       (P)
+          char_padding                rmp       rP     like ip but when in
+                                                       insert mode
+          clear_all_tabs              tbc       ct     clear all tab stops
+                                                       (P)
+          clear_margins               mgc       MC     clear right and left
+                                                       soft margins
+          clear_screen                clear     cl     clear screen and
+                                                       home cursor (P*)
+          clr_bol                     el1       cb     Clear to beginning
+                                                       of line
+          clr_eol                     el        ce     clear to end of line
+                                                       (P)
+          clr_eos                     ed        cd     clear to end of
+                                                       screen (P*)
+          column_address              hpa       ch     horizontal position
+                                                       #1, absolute (P)
+          command_character           cmdch     CC     terminal settable
+                                                       cmd character in
+                                                       prototype !?
+          create_window               cwin      CW     define a window #1
+                                                       from #2,#3 to #4,#5
+          cursor_address              cup       cm     move to row #1
+                                                       columns #2
+          cursor_down                 cud1      do     down one line
+          cursor_home                 home      ho     home cursor (if no
+                                                       cup)
+          cursor_invisible            civis     vi     make cursor
+                                                       invisible
+          cursor_left                 cub1      le     move left one space
+          cursor_mem_address          mrcup     CM     memory relative
+                                                       cursor addressing,
+                                                       move to row #1
+                                                       columns #2
+          cursor_normal               cnorm     ve     make cursor appear
+                                                       normal (undo
+                                                       civis/cvvis)
+          cursor_right                cuf1      nd     non-destructive
+                                                       space (move right
+                                                       one space)
+          cursor_to_ll                ll        ll     last line, first
+                                                       column (if no cup)
+          cursor_up                   cuu1      up     up one line
+          cursor_visible              cvvis     vs     make cursor very
+                                                       visible
+          define_char                 defc      ZE     Define a character
+                                                       #1, #2 dots wide,
+                                                       descender #3
+          delete_character            dch1      dc     delete character
+                                                       (P*)
+          delete_line                 dl1       dl     delete line (P*)
+          dial_phone                  dial      DI     dial number #1
+          dis_status_line             dsl       ds     disable status line
+          display_clock               dclk      DK     display clock
+          down_half_line              hd        hd     half a line down
+          ena_acs                     enacs     eA     enable alternate
+                                                       char set
+          enter_alt_charset_mode      smacs     as     start alternate
+                                                       character set (P)
+          enter_am_mode               smam      SA     turn on automatic
+                                                       margins
+
+          enter_blink_mode            blink     mb     turn on blinking
+          enter_bold_mode             bold      md     turn on bold (extra
+                                                       bright) mode
+          enter_ca_mode               smcup     ti     string to start
+                                                       programs using cup
+          enter_delete_mode           smdc      dm     enter delete mode
+          enter_dim_mode              dim       mh     turn on half-bright
+                                                       mode
+          enter_doublewide_mode       swidm     ZF     Enter double-wide
+                                                       mode
+          enter_draft_quality         sdrfq     ZG     Enter draft-quality
+                                                       mode
+          enter_insert_mode           smir      im     enter insert mode
+          enter_italics_mode          sitm      ZH     Enter italic mode
+          enter_leftward_mode         slm       ZI     Start leftward
+                                                       carriage motion
+          enter_micro_mode            smicm     ZJ     Start micro-motion
+                                                       mode
+          enter_near_letter_quality   snlq      ZK     Enter NLQ mode
+          enter_normal_quality        snrmq     ZL     Enter normal-quality
+                                                       mode
+          enter_protected_mode        prot      mp     turn on protected
+                                                       mode
+          enter_reverse_mode          rev       mr     turn on reverse
+                                                       video mode
+          enter_secure_mode           invis     mk     turn on blank mode
+                                                       (characters
+                                                       invisible)
+          enter_shadow_mode           sshm      ZM     Enter shadow-print
+                                                       mode
+          enter_standout_mode         smso      so     begin standout mode
+          enter_subscript_mode        ssubm     ZN     Enter subscript mode
+          enter_superscript_mode      ssupm     ZO     Enter superscript
+                                                       mode
+          enter_underline_mode        smul      us     begin underline mode
+          enter_upward_mode           sum       ZP     Start upward
+                                                       carriage motion
+          enter_xon_mode              smxon     SX     turn on xon/xoff
+                                                       handshaking
+          erase_chars                 ech       ec     erase #1 characters
+                                                       (P)
+          exit_alt_charset_mode       rmacs     ae     end alternate
+                                                       character set (P)
+          exit_am_mode                rmam      RA     turn off automatic
+                                                       margins
+          exit_attribute_mode         sgr0      me     turn off all
+                                                       attributes
+          exit_ca_mode                rmcup     te     strings to end
+                                                       programs using cup
+          exit_delete_mode            rmdc      ed     end delete mode
+          exit_doublewide_mode        rwidm     ZQ     End double-wide mode
+          exit_insert_mode            rmir      ei     exit insert mode
+          exit_italics_mode           ritm      ZR     End italic mode
+          exit_leftward_mode          rlm       ZS     End left-motion mode
+          exit_micro_mode             rmicm     ZT     End micro-motion
+                                                       mode
+          exit_shadow_mode            rshm      ZU     End shadow-print
+                                                       mode
+          exit_standout_mode          rmso      se     exit standout mode
+          exit_subscript_mode         rsubm     ZV     End subscript mode
+          exit_superscript_mode       rsupm     ZW     End superscript mode
+          exit_underline_mode         rmul      ue     exit underline mode
+          exit_upward_mode            rum       ZX     End reverse
+                                                       character motion
+
+
+          exit_xon_mode               rmxon     RX     turn off xon/xoff
+                                                       handshaking
+          fixed_pause                 pause     PA     pause for 2-3
+                                                       seconds
+          flash_hook                  hook      fh     flash switch hook
+          flash_screen                flash     vb     visible bell (may
+                                                       not move cursor)
+          form_feed                   ff        ff     hardcopy terminal
+                                                       page eject (P*)
+          from_status_line            fsl       fs     return from status
+                                                       line
+          goto_window                 wingo     WG     go to window #1
+          hangup                      hup       HU     hang-up phone
+          init_1string                is1       i1     initialization
+                                                       string
+          init_2string                is2       is     initialization
+                                                       string
+          init_3string                is3       i3     initialization
+                                                       string
+          init_file                   if        if     name of
+                                                       initialization file
+          init_prog                   iprog     iP     path name of program
+                                                       for initialization
+          initialize_color            initc     Ic     initialize color #1
+                                                       to (#2,#3,#4)
+          initialize_pair             initp     Ip     Initialize color
+                                                       pair #1 to
+                                                       fg=(#2,#3,#4),
+                                                       bg=(#5,#6,#7)
+          insert_character            ich1      ic     insert character (P)
+          insert_line                 il1       al     insert line (P*)
+          insert_padding              ip        ip     insert padding after
+                                                       inserted character
+          key_a1                      ka1       K1     upper left of keypad
+          key_a3                      ka3       K3     upper right of
+                                                       keypad
+          key_b2                      kb2       K2     center of keypad
+          key_backspace               kbs       kb     backspace key
+          key_beg                     kbeg      @1     begin key
+          key_btab                    kcbt      kB     back-tab key
+          key_c1                      kc1       K4     lower left of keypad
+          key_c3                      kc3       K5     lower right of
+                                                       keypad
+          key_cancel                  kcan      @2     cancel key
+          key_catab                   ktbc      ka     clear-all-tabs key
+          key_clear                   kclr      kC     clear-screen or
+                                                       erase key
+          key_close                   kclo      @3     close key
+          key_command                 kcmd      @4     command key
+          key_copy                    kcpy      @5     copy key
+          key_create                  kcrt      @6     create key
+          key_ctab                    kctab     kt     clear-tab key
+          key_dc                      kdch1     kD     delete-character key
+          key_dl                      kdl1      kL     delete-line key
+          key_down                    kcud1     kd     down-arrow key
+          key_eic                     krmir     kM     sent by rmir or smir
+                                                       in insert mode
+          key_end                     kend      @7     end key
+          key_enter                   kent      @8     enter/send key
+          key_eol                     kel       kE     clear-to-end-of-line
+                                                       key
+          key_eos                     ked       kS     clear-to-end-of-
+                                                       screen key
+          key_exit                    kext      @9     exit key
+          key_f0                      kf0       k0     F0 function key
+
+          key_f1                      kf1       k1     F1 function key
+          key_f10                     kf10      k;     F10 function key
+          key_f11                     kf11      F1     F11 function key
+          key_f12                     kf12      F2     F12 function key
+          key_f13                     kf13      F3     F13 function key
+          key_f14                     kf14      F4     F14 function key
+          key_f15                     kf15      F5     F15 function key
+          key_f16                     kf16      F6     F16 function key
+          key_f17                     kf17      F7     F17 function key
+          key_f18                     kf18      F8     F18 function key
+          key_f19                     kf19      F9     F19 function key
+          key_f2                      kf2       k2     F2 function key
+          key_f20                     kf20      FA     F20 function key
+          key_f21                     kf21      FB     F21 function key
+          key_f22                     kf22      FC     F22 function key
+          key_f23                     kf23      FD     F23 function key
+          key_f24                     kf24      FE     F24 function key
+          key_f25                     kf25      FF     F25 function key
+          key_f26                     kf26      FG     F26 function key
+          key_f27                     kf27      FH     F27 function key
+          key_f28                     kf28      FI     F28 function key
+          key_f29                     kf29      FJ     F29 function key
+          key_f3                      kf3       k3     F3 function key
+          key_f30                     kf30      FK     F30 function key
+          key_f31                     kf31      FL     F31 function key
+          key_f32                     kf32      FM     F32 function key
+          key_f33                     kf33      FN     F33 function key
+          key_f34                     kf34      FO     F34 function key
+          key_f35                     kf35      FP     F35 function key
+          key_f36                     kf36      FQ     F36 function key
+          key_f37                     kf37      FR     F37 function key
+          key_f38                     kf38      FS     F38 function key
+          key_f39                     kf39      FT     F39 function key
+          key_f4                      kf4       k4     F4 function key
+          key_f40                     kf40      FU     F40 function key
+          key_f41                     kf41      FV     F41 function key
+          key_f42                     kf42      FW     F42 function key
+          key_f43                     kf43      FX     F43 function key
+          key_f44                     kf44      FY     F44 function key
+          key_f45                     kf45      FZ     F45 function key
+          key_f46                     kf46      Fa     F46 function key
+          key_f47                     kf47      Fb     F47 function key
+          key_f48                     kf48      Fc     F48 function key
+          key_f49                     kf49      Fd     F49 function key
+          key_f5                      kf5       k5     F5 function key
+          key_f50                     kf50      Fe     F50 function key
+          key_f51                     kf51      Ff     F51 function key
+          key_f52                     kf52      Fg     F52 function key
+          key_f53                     kf53      Fh     F53 function key
+          key_f54                     kf54      Fi     F54 function key
+          key_f55                     kf55      Fj     F55 function key
+          key_f56                     kf56      Fk     F56 function key
+          key_f57                     kf57      Fl     F57 function key
+          key_f58                     kf58      Fm     F58 function key
+          key_f59                     kf59      Fn     F59 function key
+          key_f6                      kf6       k6     F6 function key
+          key_f60                     kf60      Fo     F60 function key
+          key_f61                     kf61      Fp     F61 function key
+          key_f62                     kf62      Fq     F62 function key
+          key_f63                     kf63      Fr     F63 function key
+          key_f7                      kf7       k7     F7 function key
+          key_f8                      kf8       k8     F8 function key
+          key_f9                      kf9       k9     F9 function key
+          key_find                    kfnd      @0     find key
+          key_help                    khlp      %1     help key
+
+          key_home                    khome     kh     home key
+          key_ic                      kich1     kI     insert-character key
+          key_il                      kil1      kA     insert-line key
+          key_left                    kcub1     kl     left-arrow key
+          key_ll                      kll       kH     lower-left key (home
+                                                       down)
+          key_mark                    kmrk      %2     mark key
+          key_message                 kmsg      %3     message key
+          key_move                    kmov      %4     move key
+          key_next                    knxt      %5     next key
+          key_npage                   knp       kN     next-page key
+          key_open                    kopn      %6     open key
+          key_options                 kopt      %7     options key
+          key_ppage                   kpp       kP     previous-page key
+          key_previous                kprv      %8     previous key
+          key_print                   kprt      %9     print key
+          key_redo                    krdo      %0     redo key
+          key_reference               kref      &amp;1     reference key
+          key_refresh                 krfr      &amp;2     refresh key
+          key_replace                 krpl      &amp;3     replace key
+          key_restart                 krst      &amp;4     restart key
+          key_resume                  kres      &amp;5     resume key
+          key_right                   kcuf1     kr     right-arrow key
+          key_save                    ksav      &amp;6     save key
+          key_sbeg                    kBEG      &amp;9     shifted begin key
+          key_scancel                 kCAN      &amp;0     shifted cancel key
+          key_scommand                kCMD      *1     shifted command key
+          key_scopy                   kCPY      *2     shifted copy key
+          key_screate                 kCRT      *3     shifted create key
+          key_sdc                     kDC       *4     shifted delete-
+                                                       character key
+          key_sdl                     kDL       *5     shifted delete-line
+                                                       key
+          key_select                  kslt      *6     select key
+          key_send                    kEND      *7     shifted end key
+          key_seol                    kEOL      *8     shifted clear-to-
+                                                       end-of-line key
+          key_sexit                   kEXT      *9     shifted exit key
+          key_sf                      kind      kF     scroll-forward key
+          key_sfind                   kFND      *0     shifted find key
+          key_shelp                   kHLP      #1     shifted help key
+          key_shome                   kHOM      #2     shifted home key
+          key_sic                     kIC       #3     shifted insert-
+                                                       character key
+          key_sleft                   kLFT      #4     shifted left-arrow
+                                                       key
+          key_smessage                kMSG      %a     shifted message key
+          key_smove                   kMOV      %b     shifted move key
+          key_snext                   kNXT      %c     shifted next key
+          key_soptions                kOPT      %d     shifted options key
+          key_sprevious               kPRV      %e     shifted previous key
+          key_sprint                  kPRT      %f     shifted print key
+          key_sr                      kri       kR     scroll-backward key
+          key_sredo                   kRDO      %g     shifted redo key
+          key_sreplace                kRPL      %h     shifted replace key
+          key_sright                  kRIT      %i     shifted right-arrow
+                                                       key
+          key_srsume                  kRES      %j     shifted resume key
+          key_ssave                   kSAV      !1     shifted save key
+          key_ssuspend                kSPD      !2     shifted suspend key
+          key_stab                    khts      kT     set-tab key
+          key_sundo                   kUND      !3     shifted undo key
+          key_suspend                 kspd      &amp;7     suspend key
+          key_undo                    kund      &amp;8     undo key
+          key_up                      kcuu1     ku     up-arrow key
+
+          keypad_local                rmkx      ke     leave
+                                                       'keyboard_transmit'
+                                                       mode
+          keypad_xmit                 smkx      ks     enter
+                                                       'keyboard_transmit'
+                                                       mode
+          lab_f0                      lf0       l0     label on function
+                                                       key f0 if not f0
+          lab_f1                      lf1       l1     label on function
+                                                       key f1 if not f1
+          lab_f10                     lf10      la     label on function
+                                                       key f10 if not f10
+          lab_f2                      lf2       l2     label on function
+                                                       key f2 if not f2
+          lab_f3                      lf3       l3     label on function
+                                                       key f3 if not f3
+          lab_f4                      lf4       l4     label on function
+                                                       key f4 if not f4
+          lab_f5                      lf5       l5     label on function
+                                                       key f5 if not f5
+          lab_f6                      lf6       l6     label on function
+                                                       key f6 if not f6
+          lab_f7                      lf7       l7     label on function
+                                                       key f7 if not f7
+          lab_f8                      lf8       l8     label on function
+                                                       key f8 if not f8
+          lab_f9                      lf9       l9     label on function
+                                                       key f9 if not f9
+          label_format                fln       Lf     label format
+          label_off                   rmln      LF     turn off soft labels
+          label_on                    smln      LO     turn on soft labels
+          meta_off                    rmm       mo     turn off meta mode
+          meta_on                     smm       mm     turn on meta mode
+                                                       (8th-bit on)
+          micro_column_address        mhpa      ZY     Like column_address
+                                                       in micro mode
+          micro_down                  mcud1     ZZ     Like cursor_down in
+                                                       micro mode
+          micro_left                  mcub1     Za     Like cursor_left in
+                                                       micro mode
+          micro_right                 mcuf1     Zb     Like cursor_right in
+                                                       micro mode
+          micro_row_address           mvpa      Zc     Like row_address #1
+                                                       in micro mode
+          micro_up                    mcuu1     Zd     Like cursor_up in
+                                                       micro mode
+          newline                     nel       nw     newline (behave like
+                                                       cr followed by lf)
+          order_of_pins               porder    Ze     Match software bits
+                                                       to print-head pins
+          orig_colors                 oc        oc     Set all color pairs
+                                                       to the original ones
+          orig_pair                   op        op     Set default pair to
+                                                       its original value
+          pad_char                    pad       pc     padding char
+                                                       (instead of null)
+          parm_dch                    dch       DC     delete #1 characters
+                                                       (P*)
+          parm_delete_line            dl        DL     delete #1 lines (P*)
+          parm_down_cursor            cud       DO     down #1 lines (P*)
+          parm_down_micro             mcud      Zf     Like
+                                                       parm_down_cursor in
+                                                       micro mode
+          parm_ich                    ich       IC     insert #1 characters
+                                                       (P*)
+
+          parm_index                  indn      SF     scroll forward #1
+                                                       lines (P)
+          parm_insert_line            il        AL     insert #1 lines (P*)
+          parm_left_cursor            cub       LE     move #1 characters
+                                                       to the left (P)
+          parm_left_micro             mcub      Zg     Like
+                                                       parm_left_cursor in
+                                                       micro mode
+          parm_right_cursor           cuf       RI     move #1 characters
+                                                       to the right (P*)
+          parm_right_micro            mcuf      Zh     Like
+                                                       parm_right_cursor in
+                                                       micro mode
+          parm_rindex                 rin       SR     scroll back #1 lines
+                                                       (P)
+          parm_up_cursor              cuu       UP     up #1 lines (P*)
+          parm_up_micro               mcuu      Zi     Like parm_up_cursor
+                                                       in micro mode
+          pkey_key                    pfkey     pk     program function key
+                                                       #1 to type string #2
+          pkey_local                  pfloc     pl     program function key
+                                                       #1 to execute string
+                                                       #2
+          pkey_xmit                   pfx       px     program function key
+                                                       #1 to transmit
+                                                       string #2
+          plab_norm                   pln       pn     program label #1 to
+                                                       show string #2
+          print_screen                mc0       ps     print contents of
+                                                       screen
+          prtr_non                    mc5p      pO     turn on printer for
+                                                       #1 bytes
+          prtr_off                    mc4       pf     turn off printer
+          prtr_on                     mc5       po     turn on printer
+          pulse                       pulse     PU     select pulse dialing
+          quick_dial                  qdial     QD     dial number #1
+                                                       without checking
+          remove_clock                rmclk     RC     remove clock
+          repeat_char                 rep       rp     repeat char #1 #2
+                                                       times (P*)
+          req_for_input               rfi       RF     send next input char
+                                                       (for ptys)
+          reset_1string               rs1       r1     reset string
+          reset_2string               rs2       r2     reset string
+          reset_3string               rs3       r3     reset string
+          reset_file                  rf        rf     name of reset file
+          restore_cursor              rc        rc     restore cursor to
+                                                       position of last
+                                                       save_cursor
+          row_address                 vpa       cv     vertical position #1
+                                                       absolute (P)
+          save_cursor                 sc        sc     save current cursor
+                                                       position (P)
+          scroll_forward              ind       sf     scroll text up (P)
+          scroll_reverse              ri        sr     scroll text down (P)
+          select_char_set             scs       Zj     Select character
+                                                       set, #1
+          set_attributes              sgr       sa     define video
+                                                       attributes #1-#9
+                                                       (PG9)
+          set_background              setb      Sb     Set background color
+                                                       #1
+          set_bottom_margin           smgb      Zk     Set bottom margin at
+                                                       current line
+
+
+          set_bottom_margin_parm      smgbp     Zl     Set bottom margin at
+                                                       line #1 or (if smgtp
+                                                       is not given) #2
+                                                       lines from bottom
+          set_clock                   sclk      SC     set clock, #1 hrs #2
+                                                       mins #3 secs
+          set_color_pair              scp       sp     Set current color
+                                                       pair to #1
+          set_foreground              setf      Sf     Set foreground color
+                                                       #1
+          set_left_margin             smgl      ML     set left soft margin
+                                                       at current
+                                                       column.     (ML is
+                                                       not in BSD termcap).
+          set_left_margin_parm        smglp     Zm     Set left (right)
+                                                       margin at column #1
+          set_right_margin            smgr      MR     set right soft
+                                                       margin at current
+                                                       column
+          set_right_margin_parm       smgrp     Zn     Set right margin at
+                                                       column #1
+          set_tab                     hts       st     set a tab in every
+                                                       row, current columns
+          set_top_margin              smgt      Zo     Set top margin at
+                                                       current line
+          set_top_margin_parm         smgtp     Zp     Set top (bottom)
+                                                       margin at row #1
+          set_window                  wind      wi     current window is
+                                                       lines #1-#2 cols
+                                                       #3-#4
+          start_bit_image             sbim      Zq     Start printing bit
+                                                       image graphics
+          start_char_set_def          scsd      Zr     Start character set
+                                                       definition #1, with
+                                                       #2 characters in the
+                                                       set
+          stop_bit_image              rbim      Zs     Stop printing bit
+                                                       image graphics
+          stop_char_set_def           rcsd      Zt     End definition of
+                                                       character set #1
+          subscript_characters        subcs     Zu     List of
+                                                       subscriptable
+                                                       characters
+          superscript_characters      supcs     Zv     List of
+                                                       superscriptable
+                                                       characters
+          tab                         ht        ta     tab to next 8-space
+                                                       hardware tab stop
+          these_cause_cr              docr      Zw     Printing any of
+                                                       these characters
+                                                       causes CR
+          to_status_line              tsl       ts     move to status line,
+                                                       column #1
+          tone                        tone      TO     select touch tone
+                                                       dialing
+          underline_char              uc        uc     underline char and
+                                                       move past it
+          up_half_line                hu        hu     half a line up
+          user0                       u0        u0     User string #0
+          user1                       u1        u1     User string #1
+          user2                       u2        u2     User string #2
+          user3                       u3        u3     User string #3
+          user4                       u4        u4     User string #4
+          user5                       u5        u5     User string #5
+          user6                       u6        u6     User string #6
+
+          user7                       u7        u7     User string #7
+          user8                       u8        u8     User string #8
+          user9                       u9        u9     User string #9
+          wait_tone                   wait      WA     wait for dial-tone
+          xoff_character              xoffc     XF     XOFF character
+          xon_character               xonc      XN     XON character
+          zero_motion                 zerom     Zx     No motion for
+                                                       subsequent character
+
+       The following string  capabilities  are  present  in  the  SVr4.0  term
+       structure, but were originally not documented in the man page.
+
+
+                  <STRONG>Variable</STRONG>            <STRONG>Cap-</STRONG>       <STRONG>TCap</STRONG>      <STRONG>Description</STRONG>
+                   <STRONG>String</STRONG>             <STRONG>name</STRONG>       <STRONG>Code</STRONG>
+          alt_scancode_esc            scesa      S8     Alternate escape
+                                                        for scancode
+                                                        emulation
+          bit_image_carriage_return   bicr       Yv     Move to beginning
+                                                        of same row
+          bit_image_newline           binel      Zz     Move to next row
+                                                        of the bit image
+          bit_image_repeat            birep      Xy     Repeat bit image
+                                                        cell #1 #2 times
+          char_set_names              csnm       Zy     Produce #1'th item
+                                                        from list of
+                                                        character set
+                                                        names
+          code_set_init               csin       ci     Init sequence for
+                                                        multiple codesets
+          color_names                 colornm    Yw     Give name for
+                                                        color #1
+          define_bit_image_region     defbi      Yx     Define rectangular
+                                                        bit image region
+          device_type                 devt       dv     Indicate
+                                                        language/codeset
+                                                        support
+          display_pc_char             dispc      S1     Display PC
+                                                        character #1
+          end_bit_image_region        endbi      Yy     End a bit-image
+                                                        region
+          enter_pc_charset_mode       smpch      S2     Enter PC character
+                                                        display mode
+          enter_scancode_mode         smsc       S4     Enter PC scancode
+                                                        mode
+          exit_pc_charset_mode        rmpch      S3     Exit PC character
+                                                        display mode
+          exit_scancode_mode          rmsc       S5     Exit PC scancode
+                                                        mode
+          get_mouse                   getm       Gm     Curses should get
+                                                        button events,
+                                                        parameter #1 not
+                                                        documented.
+          key_mouse                   kmous      Km     Mouse event has
+                                                        occurred
+          mouse_info                  minfo      Mi     Mouse status
+                                                        information
+          pc_term_options             pctrm      S6     PC terminal
+                                                        options
+          pkey_plab                   pfxl       xl     Program function
+                                                        key #1 to type
+                                                        string #2 and show
+                                                        string #3
+          req_mouse_pos               reqmp      RQ     Request mouse
+                                                        position
+
+          scancode_escape             scesc      S7     Escape for
+                                                        scancode emulation
+          set0_des_seq                s0ds       s0     Shift to codeset 0
+                                                        (EUC set 0, ASCII)
+          set1_des_seq                s1ds       s1     Shift to codeset 1
+          set2_des_seq                s2ds       s2     Shift to codeset 2
+          set3_des_seq                s3ds       s3     Shift to codeset 3
+          set_a_background            setab      AB     Set background
+                                                        color to #1, using
+                                                        ANSI escape
+          set_a_foreground            setaf      AF     Set foreground
+                                                        color to #1, using
+                                                        ANSI escape
+          set_color_band              setcolor   Yz     Change to ribbon
+                                                        color #1
+          set_lr_margin               smglr      ML     Set both left and
+                                                        right margins to
+                                                        #1, #2.  (ML is
+                                                        not in BSD
+                                                        termcap).
+          set_page_length             slines     YZ     Set page length to
+                                                        #1 lines
+          set_tb_margin               smgtb      MT     Sets both top and
+                                                        bottom margins to
+                                                        #1, #2
+
+        The XSI Curses standard added these hardcopy capabilities.  They  were
+        used  in  some post-4.1 versions of System V curses, e.g., Solaris 2.5
+        and IRIX 6.x.  Except for <STRONG>YI</STRONG>, the <STRONG>ncurses</STRONG> termcap names for  them  are
+        invented.   According to the XSI Curses standard, they have no termcap
+        names.  If your compiled terminfo entries use these, they may  not  be
+        binary-compatible with System V terminfo entries after SVr4.1; beware!
+
+
+                  <STRONG>Variable</STRONG>            <STRONG>Cap-</STRONG>      <STRONG>TCap</STRONG>       <STRONG>Description</STRONG>
+                   <STRONG>String</STRONG>             <STRONG>name</STRONG>      <STRONG>Code</STRONG>
+          enter_horizontal_hl_mode    ehhlm     Xh     Enter horizontal
+                                                       highlight mode
+          enter_left_hl_mode          elhlm     Xl     Enter left highlight
+                                                       mode
+          enter_low_hl_mode           elohlm    Xo     Enter low highlight
+                                                       mode
+          enter_right_hl_mode         erhlm     Xr     Enter right
+                                                       highlight mode
+          enter_top_hl_mode           ethlm     Xt     Enter top highlight
+                                                       mode
+          enter_vertical_hl_mode      evhlm     Xv     Enter vertical
+                                                       highlight mode
+          set_a_attributes            sgr1      sA     Define second set of
+                                                       video attributes
+                                                       #1-#6
+          set_pglen_inch              slength   YI     Set page length to
+                                                       #1 hundredth of an
+                                                       inch (some
+                                                       implementations use
+                                                       sL for termcap).
+
+
+</PRE><H3><a name="h3-User-Defined-Capabilities">User-Defined Capabilities</a></H3><PRE>
+       The  preceding  section  listed the <EM>predefined</EM> capabilities.  They deal
+       with some special features for terminals no longer (or possibly  never)
+       produced.   Occasionally  there are special features of newer terminals
+       which are awkward or impossible to represent by reusing the  predefined
+       capabilities.
+
+       <STRONG>ncurses</STRONG>    addresses   this   limitation   by   allowing   user-defined
+       capabilities.  The <STRONG>tic</STRONG> and <STRONG>infocmp</STRONG> programs provide the <STRONG>-x</STRONG>  option  for
+       this purpose.  When <STRONG>-x</STRONG> is set, <STRONG>tic</STRONG> treats unknown capabilities as user-
+       defined.  That is, if <STRONG>tic</STRONG> encounters a capability name  which  it  does
+       not  recognize, it infers its type (boolean, number or string) from the
+       syntax and makes an extended table  entry  for  that  capability.   The
+       <STRONG><A HREF="curs_extend.3x.html">use_extended_names(3x)</A></STRONG>  function  makes  this information conditionally
+       available to applications.   The  ncurses  library  provides  the  data
+       leaving most of the behavior to applications:
+
+       <STRONG>o</STRONG>   User-defined  capability  strings  whose  name  begins with "k" are
+           treated as function keys.
+
+       <STRONG>o</STRONG>   The types (boolean,  number,  string)  determined  by  <STRONG>tic</STRONG>  can  be
+           inferred by successful calls on <STRONG>tigetflag</STRONG>, etc.
+
+       <STRONG>o</STRONG>   If the capability name happens to be two characters, the capability
+           is also available through the termcap interface.
+
+       While termcap is said to be  extensible  because  it  does  not  use  a
+       predefined  set of capabilities, in practice it has been limited to the
+       capabilities defined by terminfo implementations.   As  a  rule,  user-
+       defined capabilities intended for use by termcap applications should be
+       limited to booleans and numbers to avoid running  past  the  1023  byte
+       limit  assumed  by  termcap implementations and their applications.  In
+       particular, providing extended sets  of  function  keys  (past  the  60
+       numbered keys and the handful of special named keys) is best done using
+       the longer names available using terminfo.
+
+
+</PRE><H3><a name="h3-A-Sample-Entry">A Sample Entry</a></H3><PRE>
+       The  following  entry,  describing  an   ANSI-standard   terminal,   is
+       representative of what a <STRONG>terminfo</STRONG> entry for a modern terminal typically
+       looks like.
+
+       ansi|ansi/pc-term compatible with color,
+               am, mc5i, mir, msgr,
+               colors#8, cols#80, it#8, lines#24, ncv#3, pairs#64,
+               acsc=+\020\,\021-\030.^Y0\333`\004a\261f\370g\361h\260
+                    j\331k\277l\332m\300n\305o~p\304q\304r\304s_t\303
+                    u\264v\301w\302x\263y\363z\362{\343|\330}\234~\376,
+               bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, clear=\E[H\E[J,
+               cr=^M, cub=\E[%p1%dD, cub1=\E[D, cud=\E[%p1%dB, cud1=\E[B,
+               cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH,
+               cuu=\E[%p1%dA, cuu1=\E[A, dch=\E[%p1%dP, dch1=\E[P,
+               dl=\E[%p1%dM, dl1=\E[M, ech=\E[%p1%dX, ed=\E[J, el=\E[K,
+               el1=\E[1K, home=\E[H, hpa=\E[%i%p1%dG, ht=\E[I, hts=\EH,
+               ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[L, ind=^J,
+               indn=\E[%p1%dS, invis=\E[8m, kbs=^H, kcbt=\E[Z, kcub1=\E[D,
+               kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, khome=\E[H, kich1=\E[L,
+               mc4=\E[4i, mc5=\E[5i, nel=\r\E[S, op=\E[39;49m,
+               rep=%p1%c\E[%p2%{1}%-%db, rev=\E[7m, rin=\E[%p1%dT,
+               rmacs=\E[10m, rmpch=\E[10m, rmso=\E[m, rmul=\E[m,
+               s0ds=\E(B, s1ds=\E)B, s2ds=\E*B, s3ds=\E+B,
+               setab=\E[4%p1%dm, setaf=\E[3%p1%dm,
+               sgr=\E[0;10%?%p1%t;7%;
+                          %?%p2%t;4%;
+                          %?%p3%t;7%;
+                          %?%p4%t;5%;
+                          %?%p6%t;1%;
+                          %?%p7%t;8%;
+                          %?%p9%t;11%;m,
+               sgr0=\E[0;10m, smacs=\E[11m, smpch=\E[11m, smso=\E[7m,
+               smul=\E[4m, tbc=\E[3g, u6=\E[%i%d;%dR, u7=\E[6n,
+               u8=\E[?%[;0123456789]c, u9=\E[c, vpa=\E[%i%p1%dd,
+
+       Entries may continue onto multiple lines by placing white space at  the
+       beginning  of  each line except the first.  Comments may be included on
+       lines beginning with "#".  Capabilities in <EM>terminfo</EM> are of three types:
+
+       <STRONG>o</STRONG>   Boolean capabilities which indicate  that  the  terminal  has  some
+           particular feature,
+
+       <STRONG>o</STRONG>   numeric capabilities giving the size of the terminal or the size of
+           particular delays, and
+
+       <STRONG>o</STRONG>   string capabilities, which give a sequence which  can  be  used  to
+           perform particular terminal operations.
+
+
+</PRE><H3><a name="h3-Types-of-Capabilities">Types of Capabilities</a></H3><PRE>
+       All capabilities have names.  For instance, the fact that ANSI-standard
+       terminals have <EM>automatic</EM> <EM>margins</EM> (i.e., an automatic return  and  line-
+       feed  when the end of a line is reached) is indicated by the capability
+       <STRONG>am</STRONG>.  Hence the description of ansi includes <STRONG>am</STRONG>.   Numeric  capabilities
+       are  followed  by  the  character  "#" and then a positive value.  Thus
+       <STRONG>cols</STRONG>, which indicates the number of columns the terminal has, gives the
+       value  "80" for ansi.  Values for numeric capabilities may be specified
+       in decimal, octal or hexadecimal,  using  the  C  programming  language
+       conventions (e.g., 255, 0377 and 0xff or 0xFF).
+
+       Finally,  string  valued capabilities, such as <STRONG>el</STRONG> (clear to end of line
+       sequence) are given by the two-character  code,  an  "=",  and  then  a
+       string ending at the next following ",".
+
+       A  number  of  escape  sequences  are  provided  in  the  string valued
+       capabilities for easy encoding of characters there:
+
+       <STRONG>o</STRONG>   Both <STRONG>\E</STRONG> and <STRONG>\e</STRONG> map to an ESCAPE character,
+
+       <STRONG>o</STRONG>   <STRONG>^x</STRONG> maps to a control-x for any appropriate <EM>x</EM>, and
+
+       <STRONG>o</STRONG>   the sequences
+
+             <STRONG>\n</STRONG>, <STRONG>\l</STRONG>, <STRONG>\r</STRONG>, <STRONG>\t</STRONG>, <STRONG>\b</STRONG>, <STRONG>\f</STRONG>, and <STRONG>\s</STRONG>
+
+           produce
+
+             <EM>newline</EM>, <EM>line-feed</EM>, <EM>return</EM>, <EM>tab</EM>, <EM>backspace</EM>, <EM>form-feed</EM>, and <EM>space</EM>,
+
+           respectively.
+
+       X/Open Curses does not say what "appropriate <EM>x</EM>" might be.  In practice,
+       that  is a printable ASCII graphic character.  The special case "^?" is
+       interpreted as DEL (127).  In all other cases, the character  value  is
+       AND'd  with 0x1f, mapping to ASCII control codes in the range 0 through
+       31.
+
+       Other escapes include
+
+       <STRONG>o</STRONG>   <STRONG>\^</STRONG> for <STRONG>^</STRONG>,
+
+       <STRONG>o</STRONG>   <STRONG>\\</STRONG> for <STRONG>\</STRONG>,
+
+       <STRONG>o</STRONG>   <STRONG>\</STRONG>, for comma,
+
+       <STRONG>o</STRONG>   <STRONG>\:</STRONG> for <STRONG>:</STRONG>,
+
+       <STRONG>o</STRONG>   and <STRONG>\0</STRONG> for null.
+
+           <STRONG>\0</STRONG> will produce \200, which does not terminate a string but behaves
+           as  a null character on most terminals, providing CS7 is specified.
+           See <STRONG>stty(1)</STRONG>.
+
+           The reason for this quirk is to maintain  binary  compatibility  of
+           the  compiled  terminfo files with other implementations, e.g., the
+           SVr4 systems, which document this.   Compiled  terminfo  files  use
+           null-terminated  strings,  with  no  lengths.  Modifying this would
+           require a new binary  format,  which  would  not  work  with  other
+           implementations.
+
+       Finally, characters may be given as three octal digits after a <STRONG>\</STRONG>.
+
+       A  delay  in  milliseconds  may appear anywhere in a string capability,
+       enclosed in $&lt;..&gt; brackets, as in <STRONG>el</STRONG>=\EK$&lt;5&gt;,  and  padding  characters
+       are supplied by <STRONG><A HREF="curs_terminfo.3x.html">tputs(3x)</A></STRONG> to provide this delay.
+
+       <STRONG>o</STRONG>   The  delay  must  be  a  number  with  at most one decimal place of
+           precision; it may be followed by suffixes "*" or "/" or both.
+
+       <STRONG>o</STRONG>   A "*" indicates that the padding required is  proportional  to  the
+           number  of lines affected by the operation, and the amount given is
+           the per-affected-unit padding required.  (In  the  case  of  insert
+           character, the factor is still the number of <EM>lines</EM> affected.)
+
+           Normally, padding is advisory if the device has the <STRONG>xon</STRONG> capability;
+           it is used for cost computation but does not trigger delays.
+
+       <STRONG>o</STRONG>   A "/" suffix indicates that the padding is mandatory and  forces  a
+           delay of the given number of milliseconds even on devices for which
+           <STRONG>xon</STRONG> is present to indicate flow control.
+
+       Sometimes individual capabilities must be commented out.  To  do  this,
+       put  a  period before the capability name.  For example, see the second
+       <STRONG>ind</STRONG> in the example above.
+
+
+</PRE><H3><a name="h3-Fetching-Compiled-Descriptions">Fetching Compiled Descriptions</a></H3><PRE>
+       The <STRONG>ncurses</STRONG> library  searches  for  terminal  descriptions  in  several
+       places.   It  uses only the first description found.  The library has a
+       compiled-in list of  places  to  search  which  can  be  overridden  by
+       environment  variables.   Before starting to search, <STRONG>ncurses</STRONG> eliminates
+       duplicates in its search list.
+
+       <STRONG>o</STRONG>   If the environment variable TERMINFO is set, it is  interpreted  as
+           the pathname of a directory containing the compiled description you
+           are working on.  Only that directory is searched.
+
+       <STRONG>o</STRONG>   If TERMINFO is not set, <STRONG>ncurses</STRONG> will instead look in the  directory
+           <STRONG>$HOME/.terminfo</STRONG> for a compiled description.
+
+       <STRONG>o</STRONG>   Next,  if  the  environment  variable TERMINFO_DIRS is set, <STRONG>ncurses</STRONG>
+           will interpret the contents of that variable as a  list  of  colon-
+           separated directories (or database files) to be searched.
+
+           An  empty directory name (i.e., if the variable begins or ends with
+           a colon, or contains adjacent colons) is interpreted as the  system
+           location <EM>/usr/share/terminfo</EM>.
+
+       <STRONG>o</STRONG>   Finally, <STRONG>ncurses</STRONG> searches these compiled-in locations:
+
+           <STRONG>o</STRONG>   a list of directories (no default value), and
+
+           <STRONG>o</STRONG>   the   system   terminfo   directory,  <EM>/usr/share/terminfo</EM>  (the
+               compiled-in default).
+
+
+</PRE><H3><a name="h3-Preparing-Descriptions">Preparing Descriptions</a></H3><PRE>
+       We now outline how to prepare  descriptions  of  terminals.   The  most
+       effective  way  to  prepare  a terminal description is by imitating the
+       description of a similar  terminal  in  <EM>terminfo</EM>  and  to  build  up  a
+       description gradually, using partial descriptions with <EM>vi</EM> or some other
+       screen-oriented program to check that they are correct.  Be aware  that
+       a  very  unusual terminal may expose deficiencies in the ability of the
+       <EM>terminfo</EM> file to describe it or bugs in the screen-handling code of the
+       test program.
+
+       To  get the padding for insert line right (if the terminal manufacturer
+       did not document it) a severe test is to edit  a  large  file  at  9600
+       baud, delete 16 or so lines from the middle of the screen, then hit the
+       "u" key several times quickly.  If the terminal messes up, more padding
+       is usually needed.  A similar test can be used for insert character.
+
+
+</PRE><H3><a name="h3-Basic-Capabilities">Basic Capabilities</a></H3><PRE>
+       The  number  of  columns  on each line for the terminal is given by the
+       <STRONG>cols</STRONG> numeric capability.  If the terminal is a CRT, then the number  of
+       lines  on the screen is given by the <STRONG>lines</STRONG> capability.  If the terminal
+       wraps around to the beginning of the next  line  when  it  reaches  the
+       right  margin,  then it should have the <STRONG>am</STRONG> capability.  If the terminal
+       can clear its screen, leaving the cursor in  the  home  position,  then
+       this  is  given  by  the  <STRONG>clear</STRONG>  string  capability.   If  the terminal
+       overstrikes (rather than clearing a position when a character is struck
+       over)  then  it  should  have  the <STRONG>os</STRONG> capability.  If the terminal is a
+       printing terminal, with no soft copy unit, give it both <STRONG>hc</STRONG> and <STRONG>os</STRONG>.  (<STRONG>os</STRONG>
+       applies  to  storage scope terminals, such as TEKTRONIX 4010 series, as
+       well as hard copy and APL terminals.)  If there is a code to  move  the
+       cursor to the left edge of the current row, give this as <STRONG>cr</STRONG>.  (Normally
+       this will be carriage return,  control/M.)   If  there  is  a  code  to
+       produce an audible signal (bell, beep, etc) give this as <STRONG>bel</STRONG>.
+
+       If there is a code to move the cursor one position to the left (such as
+       backspace) that capability should be given as <STRONG>cub1</STRONG>.   Similarly,  codes
+       to  move  to the right, up, and down should be given as <STRONG>cuf1</STRONG>, <STRONG>cuu1</STRONG>, and
+       <STRONG>cud1</STRONG>.  These local cursor motions should not alter the text  they  pass
+       over,  for  example,  you  would  not normally use "<STRONG>cuf1</STRONG>= " because the
+       space would erase the character moved over.
+
+       A very important point here is that the local cursor motions encoded in
+       <EM>terminfo</EM>  are  undefined  at  the left and top edges of a CRT terminal.
+       Programs should never attempt to backspace around the left edge, unless
+       <STRONG>bw</STRONG>  is given, and never attempt to go up locally off the top.  In order
+       to scroll text up, a program will go to the bottom left corner  of  the
+       screen and send the <STRONG>ind</STRONG> (index) string.
+
+       To  scroll  text  down,  a  program  goes to the top left corner of the
+       screen and sends the <STRONG>ri</STRONG> (reverse index) string.  The strings <STRONG>ind</STRONG> and <STRONG>ri</STRONG>
+       are undefined when not on their respective corners of the screen.
+
+       Parameterized  versions  of  the  scrolling  sequences are <STRONG>indn</STRONG> and <STRONG>rin</STRONG>
+       which have the same semantics as <STRONG>ind</STRONG> and <STRONG>ri</STRONG> except that they  take  one
+       parameter,  and scroll that many lines.  They are also undefined except
+       at the appropriate edge of the screen.
+
+       The <STRONG>am</STRONG> capability tells whether the cursor sticks at the right edge  of
+       the  screen when text is output, but this does not necessarily apply to
+       a <STRONG>cuf1</STRONG> from the last column.  The only local motion  which  is  defined
+       from  the  left  edge is if <STRONG>bw</STRONG> is given, then a <STRONG>cub1</STRONG> from the left edge
+       will move to the right edge of the previous row.  If <STRONG>bw</STRONG> is  not  given,
+       the  effect  is undefined.  This is useful for drawing a box around the
+       edge of the screen, for example.  If the terminal has switch selectable
+       automatic  margins,  the <EM>terminfo</EM> file usually assumes that this is on;
+       i.e., <STRONG>am</STRONG>.  If the terminal has a  command  which  moves  to  the  first
+       column  of  the  next line, that command can be given as <STRONG>nel</STRONG> (newline).
+       It does not matter if the command clears the remainder of  the  current
+       line,  so  if the terminal has no <STRONG>cr</STRONG> and <STRONG>lf</STRONG> it may still be possible to
+       craft a working <STRONG>nel</STRONG> out of one or both of them.
+
+       These  capabilities  suffice  to  describe  hard-copy  and  "glass-tty"
+       terminals.  Thus the model 33 teletype is described as
+
+       33|tty33|tty|model 33 teletype,
+               bel=^G, cols#72, cr=^M, cud1=^J, hc, ind=^J, os,
+
+       while the Lear Siegler ADM-3 is described as
+
+       adm3|3|lsi adm3,
+               am, bel=^G, clear=^Z, cols#80, cr=^M, cub1=^H, cud1=^J,
+               ind=^J, lines#24,
+
+
+</PRE><H3><a name="h3-Parameterized-Strings">Parameterized Strings</a></H3><PRE>
+       Cursor  addressing  and  other  strings  requiring  parameters  in  the
+       terminal are described  by  a  parameterized  string  capability,  with
+       <EM>printf</EM>-like  escapes  such  as  <EM>%x</EM>  in it.  For example, to address the
+       cursor, the <STRONG>cup</STRONG> capability is given, using two parameters: the row  and
+       column  to  address  to.   (Rows and columns are numbered from zero and
+       refer to the physical screen visible to the user,  not  to  any  unseen
+       memory.)   If  the terminal has memory relative cursor addressing, that
+       can be indicated by <STRONG>mrcup</STRONG>.
+
+       The parameter mechanism uses a stack and special <STRONG>%</STRONG> codes to  manipulate
+       it.   Typically  a  sequence  will  push one of the parameters onto the
+       stack and then print it in  some  format.   Print  (e.g.,  "%d")  is  a
+       special  case.  Other operations, including "%t" pop their operand from
+       the stack.   It  is  noted  that  more  complex  operations  are  often
+       necessary, e.g., in the <STRONG>sgr</STRONG> string.
+
+       The <STRONG>%</STRONG> encodings have the following meanings:
+
+       <STRONG>%%</STRONG>   outputs "%"
+
+       <STRONG>%</STRONG><EM>[[</EM>:<EM>]flags][width[.precision]][</EM><STRONG>doxXs</STRONG><EM>]</EM>
+            as  in  <STRONG>printf(3)</STRONG>,  flags are <EM>[-+#]</EM> and <EM>space</EM>.  Use a ":" to allow
+            the next character to be a "-" flag, avoiding interpreting "%-" as
+            an operator.
+
+       %c   print <EM>pop()</EM> like %c in <STRONG>printf</STRONG>
+
+       <STRONG>%s</STRONG>   print <EM>pop()</EM> like %s in <STRONG>printf</STRONG>
+
+       <STRONG>%p</STRONG><EM>[1-9]</EM>
+            push <EM>i</EM>'th parameter
+
+       <STRONG>%P</STRONG><EM>[a-z]</EM>
+            set dynamic variable <EM>[a-z]</EM> to <EM>pop()</EM>
+
+       <STRONG>%g</STRONG><EM>[a-z]</EM>
+            get dynamic variable <EM>[a-z]</EM> and push it
+
+       <STRONG>%P</STRONG><EM>[A-Z]</EM>
+            set static variable <EM>[a-z]</EM> to <EM>pop()</EM>
+
+       <STRONG>%g</STRONG><EM>[A-Z]</EM>
+            get static variable <EM>[a-z]</EM> and push it
+
+            The  terms  "static"  and "dynamic" are misleading.  Historically,
+            these are simply two different sets of variables, whose values are
+            not  reset  between calls to <STRONG><A HREF="curs_terminfo.3x.html">tparm(3x)</A></STRONG>.  However, that fact is not
+            documented in other implementations.  Relying on it will adversely
+            impact portability to other implementations:
+
+            <STRONG>o</STRONG>   SVr2  curses  supported <EM>dynamic</EM> variables.  Those are set only
+                by a <STRONG>%P</STRONG> operator.  A <STRONG>%g</STRONG> for a  given  variable  without  first
+                setting  it  with  <STRONG>%P</STRONG> will give unpredictable results, because
+                dynamic variables are an  uninitialized  local  array  on  the
+                stack in the <STRONG>tparm</STRONG> function.
+
+            <STRONG>o</STRONG>   SVr3.2  curses supported <EM>static</EM> variables.  Those are an array
+                in the <STRONG>TERMINAL</STRONG> structure (declared in <STRONG>term.h</STRONG>), and are zeroed
+                automatically when the <STRONG>setupterm</STRONG> function allocates the data.
+
+            <STRONG>o</STRONG>   SVr4 curses made no further improvements to the <EM>dynamic/static</EM>
+                variable feature.
+
+            <STRONG>o</STRONG>   Solaris XPG4 curses does not distinguish between  <EM>dynamic</EM>  and
+                <EM>static</EM>  variables.  They are the same.  Like SVr4 curses, XPG4
+                curses does not initialize these explicitly.
+
+            <STRONG>o</STRONG>   Before version 6.3, ncurses stores  both  <EM>dynamic</EM>  and  <EM>static</EM>
+                variables in persistent storage, initialized to zeros.
+
+            <STRONG>o</STRONG>   Beginning  with version 6.3, ncurses stores <EM>static</EM> and <EM>dynamic</EM>
+                variables in the same manner as SVr4.
+
+                <STRONG>o</STRONG>   Unlike  other  implementations,  ncurses   zeros   dynamic
+                    variables before the first <STRONG>%g</STRONG> or <STRONG>%P</STRONG> operator.
+
+                <STRONG>o</STRONG>   Like  SVr2,  the  scope of dynamic variables in ncurses is
+                    within the current call to <STRONG>tparm</STRONG>.  Use static variables if
+                    persistent storage is needed.
+
+       <STRONG>%'</STRONG><EM>c</EM><STRONG>'</STRONG> char constant <EM>c</EM>
+
+       <STRONG>%{</STRONG><EM>nn</EM><STRONG>}</STRONG>
+            integer constant <EM>nn</EM>
+
+       <STRONG>%l</STRONG>   push strlen(pop)
+
+       <STRONG>%+</STRONG>, <STRONG>%-</STRONG>, <STRONG>%*</STRONG>, <STRONG>%/</STRONG>, <STRONG>%m</STRONG>
+            arithmetic (%m is <EM>mod</EM>): <EM>push(pop()</EM> <EM>op</EM> <EM>pop())</EM>
+
+       <STRONG>%&amp;</STRONG>, <STRONG>%|</STRONG>, <STRONG>%^</STRONG>
+            bit operations (AND, OR and exclusive-OR): <EM>push(pop()</EM> <EM>op</EM> <EM>pop())</EM>
+
+       <STRONG>%=</STRONG>, <STRONG>%&gt;</STRONG>, <STRONG>%&lt;</STRONG>
+            logical operations: <EM>push(pop()</EM> <EM>op</EM> <EM>pop())</EM>
+
+       <STRONG>%A</STRONG>, <STRONG>%O</STRONG>
+            logical AND and OR operations (for conditionals)
+
+       <STRONG>%!</STRONG>, <STRONG>%~</STRONG>
+            unary operations (logical and bit complement): <EM>push(op</EM> <EM>pop())</EM>
+
+       <STRONG>%i</STRONG>   add 1 to first two parameters (for ANSI terminals)
+
+       <STRONG>%?</STRONG> <EM>expr</EM> <STRONG>%t</STRONG> <EM>thenpart</EM> <STRONG>%e</STRONG> <EM>elsepart</EM> <STRONG>%;</STRONG>
+            This forms an if-then-else.  The <STRONG>%e</STRONG> <EM>elsepart</EM> is optional.  Usually
+            the <STRONG>%?</STRONG> <EM>expr</EM> part pushes a value onto the stack,  and  <STRONG>%t</STRONG>  pops  it
+            from  the  stack,  testing if it is nonzero (true).  If it is zero
+            (false), control passes to the <STRONG>%e</STRONG> (else) part.
+
+            It is possible to form else-if's a la Algol 68:
+            <STRONG>%?</STRONG> c1 <STRONG>%t</STRONG> b1 <STRONG>%e</STRONG> c2 <STRONG>%t</STRONG> b2 <STRONG>%e</STRONG> c3 <STRONG>%t</STRONG> b3 <STRONG>%e</STRONG> c4 <STRONG>%t</STRONG> b4 <STRONG>%e</STRONG> <STRONG>%;</STRONG>
+
+            where ci are conditions, bi are bodies.
+
+            Use the <STRONG>-f</STRONG> option of <STRONG>tic</STRONG> or <STRONG>infocmp</STRONG> to see the  structure  of  if-
+            then-else's.  Some strings, e.g., <STRONG>sgr</STRONG> can be very complicated when
+            written on one line.  The <STRONG>-f</STRONG> option splits the string  into  lines
+            with the parts indented.
+
+       Binary  operations  are  in postfix form with the operands in the usual
+       order.  That is, to get x-5 one  would  use  "%gx%{5}%-".   <STRONG>%P</STRONG>  and  <STRONG>%g</STRONG>
+       variables are persistent across escape-string evaluations.
+
+       Consider  the HP2645, which, to get to row 3 and column 12, needs to be
+       sent \E&amp;a12c03Y padded for 6 milliseconds.  Note that the order of  the
+       rows  and  columns  is  inverted  here, and that the row and column are
+       printed   as   two   digits.     Thus    its    <STRONG>cup</STRONG>    capability    is
+       "cup=6\E&amp;%p2%2dc%p1%2dY".
+
+       The  Microterm ACT-IV needs the current row and column sent preceded by
+       a  <STRONG>^T</STRONG>,  with  the  row   and   column   simply   encoded   in   binary,
+       "cup=^T%p1%c%p2%c".   Terminals  which  use  "%c"  need  to  be able to
+       backspace the cursor (<STRONG>cub1</STRONG>), and to move the cursor up one line on  the
+       screen  (<STRONG>cuu1</STRONG>).   This  is  necessary  because it is not always safe to
+       transmit <STRONG>\n</STRONG> <STRONG>^D</STRONG> and <STRONG>\r</STRONG>, as the system may change or discard them.   (The
+       library  routines  dealing with terminfo set tty modes so that tabs are
+       never expanded, so \t is safe to send.  This turns out to be  essential
+       for the Ann Arbor 4080.)
+
+       A  final example is the LSI ADM-3a, which uses row and column offset by
+       a blank character, thus "cup=\E=%p1%' '%+%c%p2%' '%+%c".  After sending
+       "\E=",  this  pushes  the first parameter, pushes the ASCII value for a
+       space (32), adds them (pushing the sum on the stack in place of the two
+       previous  values) and outputs that value as a character.  Then the same
+       is done for the second parameter.  More complex arithmetic is  possible
+       using the stack.
+
+
+</PRE><H3><a name="h3-Cursor-Motions">Cursor Motions</a></H3><PRE>
+       If  the  terminal has a fast way to home the cursor (to very upper left
+       corner of screen) then this can be given as <STRONG>home</STRONG>; similarly a fast  way
+       of  getting  to the lower left-hand corner can be given as <STRONG>ll</STRONG>; this may
+       involve going up with <STRONG>cuu1</STRONG> from the home position, but a program should
+       never do this itself (unless <STRONG>ll</STRONG> does) because it can make no assumption
+       about the effect of moving up from the home position.   Note  that  the
+       home  position  is  the  same  as  addressing to (0,0): to the top left
+       corner of the screen, not of memory.  (Thus, the  \EH  sequence  on  HP
+       terminals cannot be used for <STRONG>home</STRONG>.)
+
+       If the terminal has row or column absolute cursor addressing, these can
+       be given as single  parameter  capabilities  <STRONG>hpa</STRONG>  (horizontal  position
+       absolute)  and  <STRONG>vpa</STRONG>  (vertical position absolute).  Sometimes these are
+       shorter than the more general  two  parameter  sequence  (as  with  the
+       hp2645)   and  can  be  used  in  preference  to  <STRONG>cup</STRONG>.   If  there  are
+       parameterized local motions (e.g., move <EM>n</EM> spaces to  the  right)  these
+       can  be  given  as  <STRONG>cud</STRONG>,  <STRONG>cub</STRONG>,  <STRONG>cuf</STRONG>,  and  <STRONG>cuu</STRONG>  with a single parameter
+       indicating how many spaces to move.  These are primarily useful if  the
+       terminal does not have <STRONG>cup</STRONG>, such as the TEKTRONIX 4025.
+
+       If  the  terminal  needs to be in a special mode when running a program
+       that uses these capabilities, the codes to enter and exit this mode can
+       be  given as <STRONG>smcup</STRONG> and <STRONG>rmcup</STRONG>.  This arises, for example, from terminals
+       like the Concept with more than one page of memory.   If  the  terminal
+       has  only  memory  relative  cursor  addressing and not screen relative
+       cursor addressing, a one screen-sized window must  be  fixed  into  the
+       terminal for cursor addressing to work properly.  This is also used for
+       the TEKTRONIX 4025, where <STRONG>smcup</STRONG> sets the command character  to  be  the
+       one  used  by  terminfo.   If  the  <STRONG>smcup</STRONG> sequence will not restore the
+       screen after an <STRONG>rmcup</STRONG>  sequence  is  output  (to  the  state  prior  to
+       outputting <STRONG>rmcup</STRONG>), specify <STRONG>nrrmc</STRONG>.
+
+
+</PRE><H3><a name="h3-Margins">Margins</a></H3><PRE>
+       SVr4  (and  X/Open Curses) list several string capabilities for setting
+       margins.  Two were intended for use with  terminals,  and  another  six
+       were intended for use with printers.
+
+       <STRONG>o</STRONG>   The two terminal capabilities assume that the terminal may have the
+           capability of setting the left and/or right margin at  the  current
+           cursor column position.
+
+       <STRONG>o</STRONG>   The printer capabilities assume that the printer may have two types
+           of capability:
+
+           <STRONG>o</STRONG>   the ability to set a top and/or bottom margin using the current
+               line position, and
+
+           <STRONG>o</STRONG>   parameterized  capabilities  for setting the top, bottom, left,
+               right margins given the number of rows or columns.
+
+       In practice, the categorization into "terminal" and  "printer"  is  not
+       suitable:
+
+       <STRONG>o</STRONG>   The  AT&amp;T  SVr4  terminal  database  uses <STRONG>smgl</STRONG> four times, for AT&amp;T
+           hardware.
+
+           Three of the four are printers.   They  lack  the  ability  to  set
+           left/right margins by specifying the column.
+
+       <STRONG>o</STRONG>   Other  (non-AT&amp;T) terminals may support margins but using different
+           assumptions from AT&amp;T.
+
+           For instance, the DEC VT420 supports left/right margins,  but  only
+           using a column parameter.  As an added complication, the VT420 uses
+           two settings to fully enable left/right margins (left/right  margin
+           mode,  and  origin  mode).   The  former enables the margins, which
+           causes printed text to wrap  within  margins,  but  the  latter  is
+           needed to prevent cursor-addressing outside those margins.
+
+       <STRONG>o</STRONG>   Both  DEC  VT420  left/right  margins are set with a single control
+           sequence.  If either is omitted, the corresponding margin is set to
+           the  left  or  right  edge  of the display (rather than leaving the
+           margin unmodified).
+
+       These are the margin-related capabilities:
+
+                <STRONG>Name</STRONG>       <STRONG>Description</STRONG>
+                ------------------------------------------------------
+                smgl       Set left margin at current column
+                smgr       Set right margin at current column
+                smgb       Set bottom margin at current line
+                smgt       Set top margin at current line
+                smgbp      Set bottom margin at line <EM>N</EM>
+                smglp      Set left margin at column <EM>N</EM>
+                smgrp      Set right margin at column <EM>N</EM>
+                smgtp      Set top margin at line <EM>N</EM>
+                smglr      Set both left and right margins to <EM>L</EM> and <EM>R</EM>
+                smgtb      Set both top and bottom margins to <EM>T</EM> and <EM>B</EM>
+
+       When writing an application that uses these  string  capabilities,  the
+       pairs  should be first checked to see if each capability in the pair is
+       set or only one is set:
+
+       <STRONG>o</STRONG>   If both <STRONG>smglp</STRONG> and <STRONG>smgrp</STRONG>  are  set,  each  is  used  with  a  single
+           argument,  <EM>N</EM>,  that  gives  the column number of the left and right
+           margin, respectively.
+
+       <STRONG>o</STRONG>   If both <STRONG>smgtp</STRONG> and <STRONG>smgbp</STRONG> are set, each is used to set  the  top  and
+           bottom margin, respectively:
+
+           <STRONG>o</STRONG>   <STRONG>smgtp</STRONG> is used with a single argument, <EM>N</EM>, the line number of the
+               top margin.
+
+           <STRONG>o</STRONG>   <STRONG>smgbp</STRONG> is used with two arguments, <EM>N</EM> and <EM>M</EM>, that give  the  line
+               number of the bottom margin, the first counting from the top of
+               the page  and  the  second  counting  from  the  bottom.   This
+               accommodates  the two styles of specifying the bottom margin in
+               different manufacturers' printers.
+
+           When designing a terminfo entry for a printer that has  a  settable
+           bottom  margin,  only  the first or second argument should be used,
+           depending on the printer.  When developing an application that uses
+           <STRONG>smgbp</STRONG> to set the bottom margin, both arguments must be given.
+
+       Conversely, when only one capability in the pair is set:
+
+       <STRONG>o</STRONG>   If  only  one  of  <STRONG>smglp</STRONG> and <STRONG>smgrp</STRONG> is set, then it is used with two
+           arguments, the column number of the left and right margins, in that
+           order.
+
+       <STRONG>o</STRONG>   Likewise,  if  only  one of <STRONG>smgtp</STRONG> and <STRONG>smgbp</STRONG> is set, then it is used
+           with two arguments that give the top and bottom  margins,  in  that
+           order, counting from the top of the page.
+
+           When designing a terminfo entry for a printer that requires setting
+           both left and right or top and bottom margins simultaneously,  only
+           one  capability  in  the  pairs  <STRONG>smglp</STRONG> and <STRONG>smgrp</STRONG> or <STRONG>smgtp</STRONG> and <STRONG>smgbp</STRONG>
+           should be defined, leaving the other unset.
+
+       Except for very old terminal descriptions, e.g.,  those  developed  for
+       SVr4,  the  scheme  just  described  should be considered obsolete.  An
+       improved set of capabilities was added late in the SVr4 releases (<STRONG>smglr</STRONG>
+       and  <STRONG>smgtb</STRONG>),  which  explicitly  use  two  parameters  for  setting the
+       left/right or top/bottom margins.
+
+       When setting margins, the line- and column-values are zero-based.
+
+       The <STRONG>mgc</STRONG> string capability should  be  defined.   Applications  such  as
+       <STRONG><A HREF="tabs.1.html">tabs(1)</A></STRONG> rely upon this to reset all margins.
+
+
+</PRE><H3><a name="h3-Area-Clears">Area Clears</a></H3><PRE>
+       If  the  terminal can clear from the current position to the end of the
+       line, leaving the cursor where it is, this should be given as  <STRONG>el</STRONG>.   If
+       the  terminal  can  clear from the beginning of the line to the current
+       position inclusive, leaving the cursor where  it  is,  this  should  be
+       given  as  <STRONG>el1</STRONG>.  If the terminal can clear from the current position to
+       the end of the display, then this should be given as <STRONG>ed</STRONG>.   <STRONG>Ed</STRONG>  is  only
+       defined from the first column of a line.  (Thus, it can be simulated by
+       a request to delete a large number of  lines,  if  a  true  <STRONG>ed</STRONG>  is  not
+       available.)
+
+
+</PRE><H3><a name="h3-Insert_delete-line-and-vertical-motions">Insert/delete line and vertical motions</a></H3><PRE>
+       If  the  terminal  can  open a new blank line before the line where the
+       cursor is, this should be given as <STRONG>il1</STRONG>; this  is  done  only  from  the
+       first  position  of  a  line.  The cursor must then appear on the newly
+       blank line.  If the terminal can delete the line which  the  cursor  is
+       on,  then this should be given as <STRONG>dl1</STRONG>; this is done only from the first
+       position on the line to be deleted.  Versions of <STRONG>il1</STRONG> and <STRONG>dl1</STRONG> which take
+       a single parameter and insert or delete that many lines can be given as
+       <STRONG>il</STRONG> and <STRONG>dl</STRONG>.
+
+       If the terminal has a settable scrolling region (like  the  vt100)  the
+       command  to  set  this  can be described with the <STRONG>csr</STRONG> capability, which
+       takes two parameters: the top and bottom lines of the scrolling region.
+       The cursor position is, alas, undefined after using this command.
+
+       It  is possible to get the effect of insert or delete line using <STRONG>csr</STRONG> on
+       a properly chosen region; the <STRONG>sc</STRONG>  and  <STRONG>rc</STRONG>  (save  and  restore  cursor)
+       commands may be useful for ensuring that your synthesized insert/delete
+       string does not move the cursor.  (Note that  the  <STRONG><A HREF="ncurses.3x.html">ncurses(3x)</A></STRONG>  library
+       does   this   synthesis   automatically,   so   you  need  not  compose
+       insert/delete strings for an entry with <STRONG>csr</STRONG>).
+
+       Yet another way to construct insert  and  delete  might  be  to  use  a
+       combination  of  index  with  the  memory-lock  feature  found  on some
+       terminals  (like  the  HP-700/90  series,  which   however   also   has
+       insert/delete).
+
+       Inserting  lines  at  the  top or bottom of the screen can also be done
+       using <STRONG>ri</STRONG> or <STRONG>ind</STRONG> on many terminals without a  true  insert/delete  line,
+       and is often faster even on terminals with those features.
+
+       The  boolean  <STRONG>non_dest_scroll_region</STRONG>  should  be  set if each scrolling
+       window is effectively a view port on a screen-sized  canvas.   To  test
+       for  this  capability,  create  a scrolling region in the middle of the
+       screen, write something to the bottom line, move the cursor to the  top
+       of  the region, and do <STRONG>ri</STRONG> followed by <STRONG>dl1</STRONG> or <STRONG>ind</STRONG>.  If the data scrolled
+       off the bottom of the region by the <STRONG>ri</STRONG> re-appears,  then  scrolling  is
+       non-destructive.   System  V  and XSI Curses expect that <STRONG>ind</STRONG>, <STRONG>ri</STRONG>, <STRONG>indn</STRONG>,
+       and  <STRONG>rin</STRONG>  will  simulate  destructive  scrolling;  their  documentation
+       cautions  you  not  to  define  <STRONG>csr</STRONG>  unless  this is true.  This <STRONG>curses</STRONG>
+       implementation is more  liberal  and  will  do  explicit  erases  after
+       scrolling if <STRONG>ndsrc</STRONG> is defined.
+
+       If  the  terminal has the ability to define a window as part of memory,
+       which all commands affect, it should  be  given  as  the  parameterized
+       string  <STRONG>wind</STRONG>.  The four parameters are the starting and ending lines in
+       memory and the starting and ending columns in memory, in that order.
+
+       If the terminal can retain display memory above, then the <STRONG>da</STRONG> capability
+       should  be  given;  if  display  memory  can be retained below, then <STRONG>db</STRONG>
+       should be given.  These indicate that deleting a line or scrolling  may
+       bring  non-blank lines up from below or that scrolling back with <STRONG>ri</STRONG> may
+       bring down non-blank lines.
+
+
+</PRE><H3><a name="h3-Insert_Delete-Character">Insert/Delete Character</a></H3><PRE>
+       There are two basic kinds of  intelligent  terminals  with  respect  to
+       insert/delete  character  which  can  be described using <EM>terminfo.</EM>  The
+       most  common  insert/delete  character  operations  affect   only   the
+       characters  on the current line and shift characters off the end of the
+       line rigidly.  Other terminals, such as the Concept 100 and the  Perkin
+       Elmer  Owl,  make a distinction between typed and untyped blanks on the
+       screen, shifting upon an insert or delete only to an untyped  blank  on
+       the  screen  which  is  either  eliminated,  or expanded to two untyped
+       blanks.
+
+       You can determine the kind of terminal you have by clearing the  screen
+       and  then  typing  text separated by cursor motions.  Type "abc    def"
+       using local cursor motions (not  spaces)  between  the  "abc"  and  the
+       "def".   Then position the cursor before the "abc" and put the terminal
+       in insert mode.  If typing characters causes the rest of  the  line  to
+       shift  rigidly  and  characters to fall off the end, then your terminal
+       does not distinguish between blanks  and  untyped  positions.   If  the
+       "abc"  shifts over to the "def" which then move together around the end
+       of the current line and onto the next  as  you  insert,  you  have  the
+       second  type  of  terminal,  and  should  give the capability <STRONG>in</STRONG>, which
+       stands for "insert null".
+
+       While these are two logically  separate  attributes  (one  line  versus
+       multi-line  insert  mode,  and  special treatment of untyped spaces) we
+       have seen no terminals whose insert mode cannot be described  with  the
+       single attribute.
+
+       Terminfo  can  describe  both  terminals which have an insert mode, and
+       terminals which send a simple sequence to open a blank position on  the
+       current line.  Give as <STRONG>smir</STRONG> the sequence to get into insert mode.  Give
+       as <STRONG>rmir</STRONG> the sequence to leave  insert  mode.   Now  give  as  <STRONG>ich1</STRONG>  any
+       sequence  needed  to  be  sent  just before sending the character to be
+       inserted.  Most terminals with a true insert mode will not  give  <STRONG>ich1</STRONG>;
+       terminals  which  send a sequence to open a screen position should give
+       it here.
+
+       If your terminal has both, insert mode is usually preferable  to  <STRONG>ich1</STRONG>.
+       Technically,  you  should  not  give  both unless the terminal actually
+       requires both to be used in combination.  Accordingly, some  non-curses
+       applications  get  confused if both are present; the symptom is doubled
+       characters in an update using insert.  This requirement  is  now  rare;
+       most  <STRONG>ich</STRONG>  sequences do not require previous smir, and most smir insert
+       modes do not require <STRONG>ich1</STRONG> before each character.   Therefore,  the  new
+       <STRONG>curses</STRONG>  actually  assumes this is the case and uses either <STRONG>rmir</STRONG>/<STRONG>smir</STRONG> or
+       <STRONG>ich</STRONG>/<STRONG>ich1</STRONG> as appropriate (but not both).  If you have to write an  entry
+       to  be  used  under  new curses for a terminal old enough to need both,
+       include the <STRONG>rmir</STRONG>/<STRONG>smir</STRONG> sequences in <STRONG>ich1</STRONG>.
+
+       If post insert padding is needed, give this as a number of milliseconds
+       in  <STRONG>ip</STRONG> (a string option).  Any other sequence which may need to be sent
+       after an insert of a single character may also be given in <STRONG>ip</STRONG>.  If your
+       terminal  needs  both  to be placed into an "insert mode" and a special
+       code to precede each inserted character, then both <STRONG>smir</STRONG>/<STRONG>rmir</STRONG>  and  <STRONG>ich1</STRONG>
+       can  be  given,  and  both  will be used.  The <STRONG>ich</STRONG> capability, with one
+       parameter, <EM>n</EM>, will repeat the effects of <STRONG>ich1</STRONG> <EM>n</EM> times.
+
+       If padding is necessary between characters typed while  not  in  insert
+       mode, give this as a number of milliseconds padding in <STRONG>rmp</STRONG>.
+
+       It  is  occasionally  necessary  to move around while in insert mode to
+       delete characters on the same line (e.g., if there is a tab  after  the
+       insertion  position).   If  your terminal allows motion while in insert
+       mode you can give the capability <STRONG>mir</STRONG> to  speed  up  inserting  in  this
+       case.   Omitting  <STRONG>mir</STRONG>  will affect only speed.  Some terminals (notably
+       Datamedia's) must not have <STRONG>mir</STRONG> because of the  way  their  insert  mode
+       works.
+
+       Finally,  you  can  specify <STRONG>dch1</STRONG> to delete a single character, <STRONG>dch</STRONG> with
+       one parameter, <EM>n</EM>, to delete <EM>n</EM> <EM>characters,</EM> and  delete  mode  by  giving
+       <STRONG>smdc</STRONG>  and  <STRONG>rmdc</STRONG>  to  enter  and exit delete mode (any mode the terminal
+       needs to be placed in for <STRONG>dch1</STRONG> to work).
+
+       A command to erase <EM>n</EM> characters  (equivalent  to  outputting  <EM>n</EM>  blanks
+       without moving the cursor) can be given as <STRONG>ech</STRONG> with one parameter.
+
+
+</PRE><H3><a name="h3-Highlighting_-Underlining_-and-Visible-Bells">Highlighting, Underlining, and Visible Bells</a></H3><PRE>
+       If your terminal has one or more kinds of display attributes, these can
+       be represented in a number of different ways.  You  should  choose  one
+       display  form  as  <EM>standout</EM>  <EM>mode</EM>,  representing a good, high contrast,
+       easy-on-the-eyes, format for  highlighting  error  messages  and  other
+       attention  getters.   (If  you  have a choice, reverse video plus half-
+       bright is good, or reverse video alone.)  The sequences  to  enter  and
+       exit  standout  mode  are given as <STRONG>smso</STRONG> and <STRONG>rmso</STRONG>, respectively.  If the
+       code to change into or out of standout mode  leaves  one  or  even  two
+       blank  spaces  on  the screen, as the TVI 912 and Teleray 1061 do, then
+       <STRONG>xmc</STRONG> should be given to tell how many spaces are left.
+
+       Codes to begin underlining and end underlining can be given as <STRONG>smul</STRONG> and
+       <STRONG>rmul</STRONG> respectively.  If the terminal has a code to underline the current
+       character and move the cursor one space  to  the  right,  such  as  the
+       Microterm Mime, this can be given as <STRONG>uc</STRONG>.
+
+       Other  capabilities  to  enter various highlighting modes include <STRONG>blink</STRONG>
+       (blinking) <STRONG>bold</STRONG> (bold or extra bright) <STRONG>dim</STRONG> (dim or  half-bright)  <STRONG>invis</STRONG>
+       (blanking  or invisible text) <STRONG>prot</STRONG> (protected) <STRONG>rev</STRONG> (reverse video) <STRONG>sgr0</STRONG>
+       (turn off <EM>all</EM> attribute modes) <STRONG>smacs</STRONG>  (enter  alternate  character  set
+       mode) and <STRONG>rmacs</STRONG> (exit alternate character set mode).  Turning on any of
+       these modes singly may or may not turn off other modes.
+
+       If there is a sequence to set arbitrary  combinations  of  modes,  this
+       should  be  given  as  <STRONG>sgr</STRONG> (set attributes), taking 9 parameters.  Each
+       parameter is either 0 or nonzero, as the corresponding attribute is  on
+       or  off.  The 9 parameters are, in order: standout, underline, reverse,
+       blink, dim, bold, blank, protect, alternate  character  set.   Not  all
+       modes  need  be  supported  by  <STRONG>sgr</STRONG>, only those for which corresponding
+       separate attribute commands exist.
+
+       For example, the DEC vt220 supports most of the modes:
+
+               <STRONG>tparm</STRONG> <STRONG>parameter</STRONG>      <STRONG>attribute</STRONG>        <STRONG>escape</STRONG> <STRONG>sequence</STRONG>
+
+               none                 none             \E[0m
+               p1                   standout         \E[0;1;7m
+               p2                   underline        \E[0;4m
+               p3                   reverse          \E[0;7m
+               p4                   blink            \E[0;5m
+               p5                   dim              not available
+               p6                   bold             \E[0;1m
+               p7                   invis            \E[0;8m
+               p8                   protect          not used
+               p9                   altcharset       ^O (off) ^N (on)
+
+       We begin each escape sequence by turning off any existing modes,  since
+       there  is  no quick way to determine whether they are active.  Standout
+       is set up to be  the  combination  of  reverse  and  bold.   The  vt220
+       terminal  has  a  protect  mode,  though it is not commonly used in sgr
+       because it protects characters on the screen from the host's  erasures.
+       The  altcharset  mode  also is different in that it is either ^O or ^N,
+       depending on whether it is off or on.  If all modes are turned on,  the
+       resulting sequence is \E[0;1;4;5;7;8m^N.
+
+       Some  sequences  are  common  to  different  modes.  For example, ;7 is
+       output when either p1 or p3 is true, that is,  if  either  standout  or
+       reverse modes are turned on.
+
+       Writing out the above sequences, along with their dependencies yields
+
+            <STRONG>sequence</STRONG>             <STRONG>when</STRONG> <STRONG>to</STRONG> <STRONG>output</STRONG>      <STRONG>terminfo</STRONG> <STRONG>translation</STRONG>
+
+            \E[0                 always              \E[0
+            ;1                   if p1 or p6         %?%p1%p6%|%t;1%;
+            ;4                   if p2               %?%p2%|%t;4%;
+            ;5                   if p4               %?%p4%|%t;5%;
+            ;7                   if p1 or p3         %?%p1%p3%|%t;7%;
+            ;8                   if p7               %?%p7%|%t;8%;
+            m                    always              m
+            ^N or ^O             if p9 ^N, else ^O   %?%p9%t^N%e^O%;
+
+       Putting this all together into the sgr sequence gives:
+
+           sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p4%t;5%;
+               %?%p1%p3%|%t;7%;%?%p7%t;8%;m%?%p9%t\016%e\017%;,
+
+       Remember  that  if  you specify sgr, you must also specify sgr0.  Also,
+       some implementations rely on sgr  being  given  if  sgr0  is,  Not  all
+       terminfo  entries  necessarily  have  an  sgr  string,  however.   Many
+       terminfo entries are derived from termcap entries  which  have  no  sgr
+       string.  The only drawback to adding an sgr string is that termcap also
+       assumes that sgr0 does not exit alternate character set mode.
+
+       Terminals  with  the  "magic  cookie"  glitch  (<STRONG>xmc</STRONG>)  deposit   special
+       "cookies"  when  they  receive mode-setting sequences, which affect the
+       display algorithm rather than having extra  bits  for  each  character.
+       Some  terminals, such as the HP 2621, automatically leave standout mode
+       when they move to a new line or  the  cursor  is  addressed.   Programs
+       using  standout mode should exit standout mode before moving the cursor
+       or sending a newline, unless the <STRONG>msgr</STRONG> capability, asserting that it  is
+       safe to move in standout mode, is present.
+
+       If  the  terminal has a way of flashing the screen to indicate an error
+       quietly (a bell replacement) then this can be given as <STRONG>flash</STRONG>;  it  must
+       not move the cursor.
+
+       If  the cursor needs to be made more visible than normal when it is not
+       on the bottom line (to make, for example, a non-blinking underline into
+       an  easier  to  find block or blinking underline) give this sequence as
+       <STRONG>cvvis</STRONG>.  If there is a way to make the cursor completely invisible, give
+       that  as  <STRONG>civis</STRONG>.  The capability <STRONG>cnorm</STRONG> should be given which undoes the
+       effects of both of these modes.
+
+       If your terminal correctly generates  underlined  characters  (with  no
+       special  codes  needed)  even  though  it does not overstrike, then you
+       should give the capability <STRONG>ul</STRONG>.  If  a  character  overstriking  another
+       leaves  both  characters  on the screen, specify the capability <STRONG>os</STRONG>.  If
+       overstrikes are erasable with a blank, then this should be indicated by
+       giving <STRONG>eo</STRONG>.
+
+
+</PRE><H3><a name="h3-Keypad-and-Function-Keys">Keypad and Function Keys</a></H3><PRE>
+       If  the  terminal  has  a keypad that transmits codes when the keys are
+       pressed, this information can be given.  Note that it is  not  possible
+       to handle terminals where the keypad only works in local (this applies,
+       for example, to the unshifted HP 2621 keys).  If the keypad can be  set
+       to  transmit  or  not  transmit,  give  these  codes  as <STRONG>smkx</STRONG> and <STRONG>rmkx</STRONG>.
+       Otherwise the keypad is assumed to always transmit.
+
+       The codes sent by the left arrow, right arrow, up  arrow,  down  arrow,
+       and  home  keys  can  be given as <STRONG>kcub1,</STRONG> <STRONG>kcuf1,</STRONG> <STRONG>kcuu1,</STRONG> <STRONG>kcud1,</STRONG> and <STRONG>khome</STRONG>
+       respectively.  If there are function keys such as f0, f1, ..., f10, the
+       codes  they  send  can  be given as <STRONG>kf0,</STRONG> <STRONG>kf1,</STRONG> <STRONG>...,</STRONG> <STRONG>kf10</STRONG>.  If these keys
+       have labels other than the default f0 through f10, the  labels  can  be
+       given as <STRONG>lf0,</STRONG> <STRONG>lf1,</STRONG> <STRONG>...,</STRONG> <STRONG>lf10</STRONG>.
+
+       The codes transmitted by certain other special keys can be given:
+
+       <STRONG>o</STRONG>   <STRONG>kll</STRONG> (home down),
+
+       <STRONG>o</STRONG>   <STRONG>kbs</STRONG> (backspace),
+
+       <STRONG>o</STRONG>   <STRONG>ktbc</STRONG> (clear all tabs),
+
+       <STRONG>o</STRONG>   <STRONG>kctab</STRONG> (clear the tab stop in this column),
+
+       <STRONG>o</STRONG>   <STRONG>kclr</STRONG> (clear screen or erase key),
+
+       <STRONG>o</STRONG>   <STRONG>kdch1</STRONG> (delete character),
+
+       <STRONG>o</STRONG>   <STRONG>kdl1</STRONG> (delete line),
+
+       <STRONG>o</STRONG>   <STRONG>krmir</STRONG> (exit insert mode),
+
+       <STRONG>o</STRONG>   <STRONG>kel</STRONG> (clear to end of line),
+
+       <STRONG>o</STRONG>   <STRONG>ked</STRONG> (clear to end of screen),
+
+       <STRONG>o</STRONG>   <STRONG>kich1</STRONG> (insert character or enter insert mode),
+
+       <STRONG>o</STRONG>   <STRONG>kil1</STRONG> (insert line),
+
+       <STRONG>o</STRONG>   <STRONG>knp</STRONG> (next page),
+
+       <STRONG>o</STRONG>   <STRONG>kpp</STRONG> (previous page),
+
+       <STRONG>o</STRONG>   <STRONG>kind</STRONG> (scroll forward/down),
+
+       <STRONG>o</STRONG>   <STRONG>kri</STRONG> (scroll backward/up),
+
+       <STRONG>o</STRONG>   <STRONG>khts</STRONG> (set a tab stop in this column).
+
+       In  addition,  if  the  keypad has a 3 by 3 array of keys including the
+       four arrow keys, the other five keys can be given  as  <STRONG>ka1</STRONG>,  <STRONG>ka3</STRONG>,  <STRONG>kb2</STRONG>,
+       <STRONG>kc1</STRONG>,  and  <STRONG>kc3</STRONG>.   These  keys  are  useful when the effects of a 3 by 3
+       directional pad are needed.
+
+       Strings to program function keys can be given as <STRONG>pfkey</STRONG>, <STRONG>pfloc</STRONG>, and <STRONG>pfx</STRONG>.
+       A  string to program screen labels should be specified as <STRONG>pln</STRONG>.  Each of
+       these strings takes two parameters: the function key number to  program
+       (from 0 to 10) and the string to program it with.  Function key numbers
+       out of this range may program undefined keys in  a  terminal  dependent
+       manner.   The  difference between the capabilities is that <STRONG>pfkey</STRONG> causes
+       pressing the given key to be the same as  the  user  typing  the  given
+       string;  <STRONG>pfloc</STRONG>  causes  the  string  to  be executed by the terminal in
+       local; and <STRONG>pfx</STRONG> causes the string to be transmitted to the computer.
+
+       The capabilities <STRONG>nlab</STRONG>, <STRONG>lw</STRONG> and <STRONG>lh</STRONG>  define  the  number  of  programmable
+       screen  labels  and  their  width and height.  If there are commands to
+       turn the labels on and off, give  them  in  <STRONG>smln</STRONG>  and  <STRONG>rmln</STRONG>.   <STRONG>smln</STRONG>  is
+       normally  output  after one or more pln sequences to make sure that the
+       change becomes visible.
+
+
+</PRE><H3><a name="h3-Tabs-and-Initialization">Tabs and Initialization</a></H3><PRE>
+       A few capabilities are used only for tabs:
+
+       <STRONG>o</STRONG>   If the terminal has hardware tabs, the command to  advance  to  the
+           next tab stop can be given as <STRONG>ht</STRONG> (usually control/I).
+
+       <STRONG>o</STRONG>   A "back-tab" command which moves leftward to the preceding tab stop
+           can be given as <STRONG>cbt</STRONG>.
+
+           By convention, if the teletype modes indicate that tabs  are  being
+           expanded  by  the  computer rather than being sent to the terminal,
+           programs should not use <STRONG>ht</STRONG> or <STRONG>cbt</STRONG> even if they are  present,  since
+           the user may not have the tab stops properly set.
+
+       <STRONG>o</STRONG>   If  the  terminal has hardware tabs which are initially set every <EM>n</EM>
+           spaces when the terminal is powered up, the numeric parameter <STRONG>it</STRONG> is
+           given, showing the number of spaces the tabs are set to.
+
+           The <STRONG>it</STRONG> capability is normally used by the <STRONG>tset</STRONG> command to determine
+           whether to set the mode for hardware tab expansion, and whether  to
+           set the tab stops.  If the terminal has tab stops that can be saved
+           in non-volatile memory, the terminfo description  can  assume  that
+           they are properly set.
+
+       Other capabilities include
+
+       <STRONG>o</STRONG>   <STRONG>is1</STRONG>, <STRONG>is2</STRONG>, and <STRONG>is3</STRONG>, initialization strings for the terminal,
+
+       <STRONG>o</STRONG>   <STRONG>iprog</STRONG>,  the  path  name  of  a  program to be run to initialize the
+           terminal,
+
+       <STRONG>o</STRONG>   and <STRONG>if</STRONG>, the name of a file containing long initialization strings.
+
+       These strings are expected to set the terminal  into  modes  consistent
+       with  the  rest of the terminfo description.  They are normally sent to
+       the terminal, by the <EM>init</EM> option of the <STRONG>tput</STRONG>  program,  each  time  the
+       user logs in.  They will be printed in the following order:
+
+              run the program
+                     <STRONG>iprog</STRONG>
+
+              output
+                     <STRONG>is1</STRONG> and
+                     <STRONG>is2</STRONG>
+
+              set the margins using
+                     <STRONG>mgc</STRONG> or
+                     <STRONG>smglp</STRONG> and <STRONG>smgrp</STRONG> or
+                     <STRONG>smgl</STRONG> and <STRONG>smgr</STRONG>
+
+              set tabs using
+                     <STRONG>tbc</STRONG> and <STRONG>hts</STRONG>
+
+              print the file
+                     <STRONG>if</STRONG>
+
+              and finally output
+                     <STRONG>is3</STRONG>.
+
+       Most  initialization  is  done with <STRONG>is2</STRONG>.  Special terminal modes can be
+       set up without duplicating strings by putting the common  sequences  in
+       <STRONG>is2</STRONG> and special cases in <STRONG>is1</STRONG> and <STRONG>is3</STRONG>.
+
+       A  set  of  sequences  that  does a harder reset from a totally unknown
+       state can be given as <STRONG>rs1</STRONG>, <STRONG>rs2</STRONG>, <STRONG>rf</STRONG> and <STRONG>rs3</STRONG>, analogous to <STRONG>is1</STRONG> <STRONG>,</STRONG> <STRONG>is2</STRONG> <STRONG>,</STRONG> <STRONG>if</STRONG>
+       and  <STRONG>is3</STRONG>  respectively.   These  strings  are output by <EM>reset</EM> option of
+       <STRONG>tput</STRONG>, or by the <STRONG>reset</STRONG> program (an alias of <STRONG>tset</STRONG>), which  is  used  when
+       the terminal gets into a wedged state.  Commands are normally placed in
+       <STRONG>rs1</STRONG>, <STRONG>rs2</STRONG> <STRONG>rs3</STRONG> and <STRONG>rf</STRONG> only if they produce annoying effects on the screen
+       and are not necessary when logging in.  For example, the command to set
+       the vt100 into 80-column mode would normally be part  of  <STRONG>is2</STRONG>,  but  it
+       causes  an  annoying  glitch  of  the screen and is not normally needed
+       since the terminal is usually already in 80-column mode.
+
+       The <STRONG>reset</STRONG> program writes strings including <STRONG>iprog</STRONG>,  etc.,  in  the  same
+       order  as  the  <EM>init</EM> program, using <STRONG>rs1</STRONG>, etc., instead of <STRONG>is1</STRONG>, etc.  If
+       any of <STRONG>rs1</STRONG>, <STRONG>rs2</STRONG>, <STRONG>rs3</STRONG>, or <STRONG>rf</STRONG> reset capability strings are  missing,  the
+       <STRONG>reset</STRONG>   program   falls  back  upon  the  corresponding  initialization
+       capability string.
+
+       If there are commands to set and clear tab stops, they can be given  as
+       <STRONG>tbc</STRONG> (clear all tab stops) and <STRONG>hts</STRONG> (set a tab stop in the current column
+       of every row).  If a more complex sequence is needed to  set  the  tabs
+       than can be described by this, the sequence can be placed in <STRONG>is2</STRONG> or <STRONG>if</STRONG>.
+
+       The  <STRONG>tput</STRONG>  <STRONG>reset</STRONG>  command uses the same capability strings as the <STRONG>reset</STRONG>
+       command, although the two programs (<STRONG>tput</STRONG> and <STRONG>reset</STRONG>)  provide  different
+       command-line options.
+
+       In  practice,  these  terminfo  capabilities  are  not  often  used  in
+       initialization of tabs (though they are required for the <STRONG>tabs</STRONG> program):
+
+       <STRONG>o</STRONG>   Almost all hardware terminals (at least those which supported tabs)
+           initialized those to every <EM>eight</EM> columns:
+
+           The  only  exception  was  the  AT&amp;T 2300 series, which set tabs to
+           every <EM>five</EM> columns.
+
+       <STRONG>o</STRONG>   In particular, developers  of  the  hardware  terminals  which  are
+           commonly  used  as  models  for  modern terminal emulators provided
+           documentation demonstrating that <EM>eight</EM> columns were the standard.
+
+       <STRONG>o</STRONG>   Because of this, the terminal initialization programs <STRONG>tput</STRONG> and <STRONG>tset</STRONG>
+           use   the  <STRONG>tbc</STRONG>  (<STRONG>clear_all_tabs</STRONG>)  and  <STRONG>hts</STRONG>  (<STRONG>set_tab</STRONG>)  capabilities
+           directly only when the <STRONG>it</STRONG> (<STRONG>init_tabs</STRONG>) capability is set to a  value
+           other than <EM>eight</EM>.
+
+
+</PRE><H3><a name="h3-Delays-and-Padding">Delays and Padding</a></H3><PRE>
+       Many  older  and slower terminals do not support either XON/XOFF or DTR
+       handshaking, including hard copy terminals and some very  archaic  CRTs
+       (including,  for  example,  DEC  VT100s).   These  may  require padding
+       characters after certain cursor motions and screen changes.
+
+       If the terminal uses xon/xoff handshaking for flow control (that is, it
+       automatically  emits  ^S  back  to  the host when its input buffers are
+       close to full), set <STRONG>xon</STRONG>.  This capability suppresses  the  emission  of
+       padding.   You  can  also  set  it  for  memory-mapped  console devices
+       effectively that do not have a speed limit.  Padding information should
+       still  be  included  so  that  routines can make better decisions about
+       relative costs, but actual pad characters will not be transmitted.
+
+       If <STRONG>pb</STRONG> (padding baud rate) is given, padding is suppressed at baud rates
+       below  the  value  of  <STRONG>pb</STRONG>.  If the entry has no padding baud rate, then
+       whether padding is emitted or not is completely controlled by <STRONG>xon</STRONG>.
+
+       If the terminal requires other than a null (zero) character as  a  pad,
+       then  this  can  be  given as <STRONG>pad</STRONG>.  Only the first character of the <STRONG>pad</STRONG>
+       string is used.
+
+
+</PRE><H3><a name="h3-Status-Lines">Status Lines</a></H3><PRE>
+       Some terminals have an extra "status line" which is not  normally  used
+       by software (and thus not counted in the terminal's <STRONG>lines</STRONG> capability).
+
+       The  simplest case is a status line which is cursor-addressable but not
+       part of the main scrolling region on the screen; the Heathkit H19 has a
+       status  line  of  this  kind,  as  would a 24-line VT100 with a 23-line
+       scrolling region set up on initialization.  This situation is indicated
+       by the <STRONG>hs</STRONG> capability.
+
+       Some  terminals  with status lines need special sequences to access the
+       status line.  These may be expressed as a string with single  parameter
+       <STRONG>tsl</STRONG>  which takes the cursor to a given zero-origin column on the status
+       line.  The  capability  <STRONG>fsl</STRONG>  must  return  to  the  main-screen  cursor
+       positions before the last <STRONG>tsl</STRONG>.  You may need to embed the string values
+       of <STRONG>sc</STRONG> (save  cursor)  and  <STRONG>rc</STRONG>  (restore  cursor)  in  <STRONG>tsl</STRONG>  and  <STRONG>fsl</STRONG>  to
+       accomplish this.
+
+       The  status  line is normally assumed to be the same width as the width
+       of the terminal.  If this is  untrue,  you  can  specify  it  with  the
+       numeric capability <STRONG>wsl</STRONG>.
+
+       A command to erase or blank the status line may be specified as <STRONG>dsl</STRONG>.
+
+       The  boolean  capability  <STRONG>eslok</STRONG>  specifies that escape sequences, tabs,
+       etc., work ordinarily in the status line.
+
+       The <STRONG>ncurses</STRONG> implementation does not yet use any of these  capabilities.
+       They are documented here in case they ever become important.
+
+
+</PRE><H3><a name="h3-Line-Graphics">Line Graphics</a></H3><PRE>
+       Many  terminals have alternate character sets useful for forms-drawing.
+       Terminfo and <STRONG>curses</STRONG> have built-in  support  for  most  of  the  drawing
+       characters  supported  by the VT100, with some characters from the AT&amp;T
+       4410v1 added.  This alternate character set may  be  specified  by  the
+       <STRONG>acsc</STRONG> capability.
+
+         <STRONG>Glyph</STRONG>                       <STRONG>ACS</STRONG>            <STRONG>Ascii</STRONG>     <STRONG>acsc</STRONG>     <STRONG>acsc</STRONG>
+         <STRONG>Name</STRONG>                        <STRONG>Name</STRONG>           <STRONG>Default</STRONG>   <STRONG>Char</STRONG>     <STRONG>Value</STRONG>
+         --------------------------------------------------------------------
+         arrow pointing right        ACS_RARROW     &gt;         +        0x2b
+         arrow pointing left         ACS_LARROW     &lt;         ,        0x2c
+
+         arrow pointing up           ACS_UARROW     ^         -        0x2d
+         arrow pointing down         ACS_DARROW     v         .        0x2e
+         solid square block          ACS_BLOCK      #         0        0x30
+         diamond                     ACS_DIAMOND    +         `        0x60
+         checker board (stipple)     ACS_CKBOARD    :         a        0x61
+         degree symbol               ACS_DEGREE     \         f        0x66
+         plus/minus                  ACS_PLMINUS    #         g        0x67
+         board of squares            ACS_BOARD      #         h        0x68
+         lantern symbol              ACS_LANTERN    #         i        0x69
+         lower right corner          ACS_LRCORNER   +         j        0x6a
+         upper right corner          ACS_URCORNER   +         k        0x6b
+         upper left corner           ACS_ULCORNER   +         l        0x6c
+         lower left corner           ACS_LLCORNER   +         m        0x6d
+         large plus or crossover     ACS_PLUS       +         n        0x6e
+         scan line 1                 ACS_S1         ~         o        0x6f
+         scan line 3                 ACS_S3         -         p        0x70
+         horizontal line             ACS_HLINE      -         q        0x71
+         scan line 7                 ACS_S7         -         r        0x72
+         scan line 9                 ACS_S9         _         s        0x73
+         tee pointing right          ACS_LTEE       +         t        0x74
+         tee pointing left           ACS_RTEE       +         u        0x75
+         tee pointing up             ACS_BTEE       +         v        0x76
+         tee pointing down           ACS_TTEE       +         w        0x77
+         vertical line               ACS_VLINE      |         x        0x78
+         less-than-or-equal-to       ACS_LEQUAL     &lt;         y        0x79
+         greater-than-or-equal-to    ACS_GEQUAL     &gt;         z        0x7a
+         greek pi                    ACS_PI         *         {        0x7b
+         not-equal                   ACS_NEQUAL     !         |        0x7c
+         UK pound sign               ACS_STERLING   f         }        0x7d
+         bullet                      ACS_BULLET     o         ~        0x7e
+
+       A few notes apply to the table itself:
+
+       <STRONG>o</STRONG>   X/Open  Curses  incorrectly  states that the mapping for <EM>lantern</EM> is
+           uppercase "I" although Unix implementations use the  lowercase  "i"
+           mapping.
+
+       <STRONG>o</STRONG>   The  DEC  VT100  implemented graphics using the alternate character
+           set feature, temporarily switching <EM>modes</EM> and sending characters  in
+           the  range  0x60  (96)  to 0x7e (126) (the <STRONG>acsc</STRONG> <STRONG>Value</STRONG> column in the
+           table).
+
+       <STRONG>o</STRONG>   The AT&amp;T terminal added graphics characters outside that range.
+
+           Some of the characters within the range do  not  match  the  VT100;
+           presumably  they  were  used in the AT&amp;T terminal: <EM>board</EM> <EM>of</EM> <EM>squares</EM>
+           replaces the VT100 <EM>newline</EM> symbol, while  <EM>lantern</EM>  <EM>symbol</EM>  replaces
+           the VT100 <EM>vertical</EM> <EM>tab</EM> symbol.  The other VT100 symbols for control
+           characters (<EM>horizontal</EM> <EM>tab</EM>, <EM>carriage</EM> <EM>return</EM> and <EM>line-feed</EM>) are  not
+           (re)used in curses.
+
+       The  best  way to define a new device's graphics set is to add a column
+       to a copy of this table for your terminal, giving the  character  which
+       (when  emitted  between  <STRONG>smacs</STRONG>/<STRONG>rmacs</STRONG>  switches) will be rendered as the
+       corresponding graphic.  Then read off the VT100/your terminal character
+       pairs right to left in sequence; these become the ACSC string.
+
+
+</PRE><H3><a name="h3-Color-Handling">Color Handling</a></H3><PRE>
+       The  curses  library  functions <STRONG>init_pair</STRONG> and <STRONG>init_color</STRONG> manipulate the
+       <EM>color</EM>  <EM>pairs</EM>  and  <EM>color</EM>  <EM>values</EM>  discussed  in   this   section   (see
+       <STRONG><A HREF="curs_color.3x.html">curs_color(3x)</A></STRONG> for details on these and related functions).
+
+       Most color terminals are either "Tektronix-like" or "HP-like":
+
+       <STRONG>o</STRONG>   Tektronix-like terminals have a predefined set of <EM>N</EM> colors (where <EM>N</EM>
+           is usually 8), and can set character-cell foreground and background
+           characters independently, mixing them into <EM>N</EM> * <EM>N</EM> color-pairs.
+
+       <STRONG>o</STRONG>   On  HP-like  terminals,  the  user  must  set  each  color  pair up
+           separately  (foreground  and  background  are   not   independently
+           settable).   Up  to  <EM>M</EM> color-pairs may be set up from 2*<EM>M</EM> different
+           colors.  ANSI-compatible terminals are Tektronix-like.
+
+       Some basic color capabilities are independent of the color method.  The
+       numeric  capabilities  <STRONG>colors</STRONG>  and <STRONG>pairs</STRONG> specify the maximum numbers of
+       colors and color-pairs that can be displayed  simultaneously.   The  <STRONG>op</STRONG>
+       (original pair) string resets foreground and background colors to their
+       default values for the terminal.  The <STRONG>oc</STRONG> string resets  all  colors  or
+       color-pairs  to  their default values for the terminal.  Some terminals
+       (including many PC terminal emulators)  erase  screen  areas  with  the
+       current  background  color rather than the power-up default background;
+       these should have the boolean capability <STRONG>bce</STRONG>.
+
+       While the  curses  library  works  with  <EM>color</EM>  <EM>pairs</EM>  (reflecting  the
+       inability  of  some  devices  to  set  foreground and background colors
+       independently), there  are  separate  capabilities  for  setting  these
+       features:
+
+       <STRONG>o</STRONG>   To   change  the  current  foreground  or  background  color  on  a
+           Tektronix-type terminal, use <STRONG>setaf</STRONG> (set ANSI foreground) and  <STRONG>setab</STRONG>
+           (set  ANSI  background)  or  <STRONG>setf</STRONG>  (set  foreground)  and <STRONG>setb</STRONG> (set
+           background).  These take one parameter, the color number.  The SVr4
+           documentation  describes only <STRONG>setaf</STRONG>/<STRONG>setab</STRONG>; the XPG4 draft says that
+           "If the terminal supports ANSI escape sequences to  set  background
+           and   foreground,   they  should  be  coded  as  <STRONG>setaf</STRONG>  and  <STRONG>setab</STRONG>,
+           respectively.
+
+       <STRONG>o</STRONG>   If the terminal supports other escape sequences to  set  background
+           and   foreground,   they   should   be  coded  as  <STRONG>setf</STRONG>  and  <STRONG>setb</STRONG>,
+           respectively.  The <STRONG>vidputs</STRONG> and the <STRONG><A HREF="curs_refresh.3x.html">refresh(3x)</A></STRONG>  functions  use  the
+           <STRONG>setaf</STRONG> and <STRONG>setab</STRONG> capabilities if they are defined.
+
+       The  <STRONG>setaf</STRONG>/<STRONG>setab</STRONG>  and  <STRONG>setf</STRONG>/<STRONG>setb</STRONG>  capabilities  take  a  single numeric
+       argument each.  Argument values 0-7 of <STRONG>setaf</STRONG>/<STRONG>setab</STRONG> are portably defined
+       as  follows (the middle column is the symbolic #define available in the
+       header for the <STRONG>curses</STRONG> or <STRONG>ncurses</STRONG> libraries).  The terminal hardware  is
+       free  to  map  these  as  it  likes, but the RGB values indicate normal
+       locations in color space.
+
+                    <STRONG>Color</STRONG>       <STRONG>#define</STRONG>       <STRONG>Value</STRONG>       <STRONG>RGB</STRONG>
+                    black     <STRONG>COLOR_BLACK</STRONG>       0     0, 0, 0
+                    red       <STRONG>COLOR_RED</STRONG>         1     max,0,0
+                    green     <STRONG>COLOR_GREEN</STRONG>       2     0,max,0
+                    yellow    <STRONG>COLOR_YELLOW</STRONG>      3     max,max,0
+                    blue      <STRONG>COLOR_BLUE</STRONG>        4     0,0,max
+                    magenta   <STRONG>COLOR_MAGENTA</STRONG>     5     max,0,max
+                    cyan      <STRONG>COLOR_CYAN</STRONG>        6     0,max,max
+                    white     <STRONG>COLOR_WHITE</STRONG>       7     max,max,max
+
+       The argument values of <STRONG>setf</STRONG>/<STRONG>setb</STRONG> historically correspond to a different
+       mapping, i.e.,
+
+                    <STRONG>Color</STRONG>       <STRONG>#define</STRONG>       <STRONG>Value</STRONG>       <STRONG>RGB</STRONG>
+                    black     <STRONG>COLOR_BLACK</STRONG>       0     0, 0, 0
+                    blue      <STRONG>COLOR_BLUE</STRONG>        1     0,0,max
+                    green     <STRONG>COLOR_GREEN</STRONG>       2     0,max,0
+                    cyan      <STRONG>COLOR_CYAN</STRONG>        3     0,max,max
+                    red       <STRONG>COLOR_RED</STRONG>         4     max,0,0
+                    magenta   <STRONG>COLOR_MAGENTA</STRONG>     5     max,0,max
+                    yellow    <STRONG>COLOR_YELLOW</STRONG>      6     max,max,0
+                    white     <STRONG>COLOR_WHITE</STRONG>       7     max,max,max
+
+       It  is  important  to  not  confuse the two sets of color capabilities;
+       otherwise red/blue will be interchanged on the display.
+
+       On an HP-like terminal, use <STRONG>scp</STRONG> with a color-pair number  parameter  to
+       set which color pair is current.
+
+       Some terminals allow the <EM>color</EM> <EM>values</EM> to be modified:
+
+       <STRONG>o</STRONG>   On  a Tektronix-like terminal, the capability <STRONG>ccc</STRONG> may be present to
+           indicate that colors can be modified.  If so, the <STRONG>initc</STRONG>  capability
+           will take a color number (0 to <STRONG>colors</STRONG> - 1)and three more parameters
+           which describe the color.  These three parameters default to  being
+           interpreted  as  RGB  (Red,  Green,  Blue)  values.  If the boolean
+           capability <STRONG>hls</STRONG> is present, they are instead as HLS (Hue, Lightness,
+           Saturation) indices.  The ranges are terminal-dependent.
+
+       <STRONG>o</STRONG>   On  an HP-like terminal, <STRONG>initp</STRONG> may give a capability for changing a
+           color-pair value.  It will  take  seven  parameters;  a  color-pair
+           number  (0  to  <STRONG>max_pairs</STRONG>  -  1),  and two triples describing first
+           background and then foreground colors.  These  parameters  must  be
+           (Red,  Green,  Blue)  or  (Hue, Lightness, Saturation) depending on
+           <STRONG>hls</STRONG>.
+
+       On some color terminals,  colors  collide  with  highlights.   You  can
+       register  these collisions with the <STRONG>ncv</STRONG> capability.  This is a bit-mask
+       of  attributes  not  to  be  used  when  colors   are   enabled.    The
+       correspondence with the attributes understood by <STRONG>curses</STRONG> is as follows:
+
+                  <STRONG>Attribute</STRONG>              <STRONG>Bit</STRONG>   <STRONG>Decimal</STRONG>      <STRONG>Set</STRONG> <STRONG>by</STRONG>
+                  A_STANDOUT             0     1            sgr
+                  A_UNDERLINE            1     2            sgr
+                  A_REVERSE              2     4            sgr
+                  A_BLINK                3     8            sgr
+                  A_DIM                  4     16           sgr
+                  A_BOLD                 5     32           sgr
+                  A_INVIS                6     64           sgr
+                  A_PROTECT              7     128          sgr
+                  A_ALTCHARSET           8     256          sgr
+                  A_HORIZONTAL           9     512          sgr1
+                  A_LEFT                 10    1024         sgr1
+                  A_LOW                  11    2048         sgr1
+                  A_RIGHT                12    4096         sgr1
+                  A_TOP                  13    8192         sgr1
+                  A_VERTICAL             14    16384        sgr1
+                  A_ITALIC               15    32768        sitm
+
+       For  example, on many IBM PC consoles, the underline attribute collides
+       with the foreground color blue and is  not  available  in  color  mode.
+       These should have an <STRONG>ncv</STRONG> capability of 2.
+
+       SVr4  curses does nothing with <STRONG>ncv</STRONG>, ncurses recognizes it and optimizes
+       the output in favor of colors.
+
+
+</PRE><H3><a name="h3-Miscellaneous">Miscellaneous</a></H3><PRE>
+       If the terminal requires other than a null (zero) character as  a  pad,
+       then  this  can  be  given as pad.  Only the first character of the pad
+       string is used.  If the terminal does not have a pad character, specify
+       npc.   Note that ncurses implements the termcap-compatible <STRONG>PC</STRONG> variable;
+       though the application may set this value to  something  other  than  a
+       null,  ncurses will test <STRONG>npc</STRONG> first and use napms if the terminal has no
+       pad character.
+
+       If the terminal can move up or down half a line, this can be  indicated
+       with  <STRONG>hu</STRONG>  (half-line  up)  and  <STRONG>hd</STRONG> (half-line down).  This is primarily
+       useful for superscripts and subscripts on hard-copy  terminals.   If  a
+       hard-copy terminal can eject to the next page (form feed), give this as
+       <STRONG>ff</STRONG> (usually control/L).
+
+       If there is a command to repeat a given character  a  given  number  of
+       times   (to   save  time  transmitting  a  large  number  of  identical
+       characters) this can be indicated with the  parameterized  string  <STRONG>rep</STRONG>.
+       The  first  parameter is the character to be repeated and the second is
+       the number of times to repeat it.  Thus, tparm(repeat_char, 'x', 10) is
+       the same as "xxxxxxxxxx".
+
+       If the terminal has a settable command character, such as the TEKTRONIX
+       4025, this can be indicated with <STRONG>cmdch</STRONG>.  A prototype command  character
+       is  chosen  which is used in all capabilities.  This character is given
+       in the <STRONG>cmdch</STRONG> capability to identify it.  The  following  convention  is
+       supported on some UNIX systems: The environment is to be searched for a
+       <STRONG>CC</STRONG> variable, and if found, all occurrences of the  prototype  character
+       are replaced with the character in the environment variable.
+
+       Terminal  descriptions  that  do not represent a specific kind of known
+       terminal, such as <EM>switch</EM>, <EM>dialup</EM>, <EM>patch</EM>, and  <EM>network</EM>,  should  include
+       the  <STRONG>gn</STRONG> (generic) capability so that programs can complain that they do
+       not know how to talk to the terminal.  (This capability does not  apply
+       to  <EM>virtual</EM>  terminal  descriptions  for which the escape sequences are
+       known.)
+
+       If the terminal has a "meta key" which acts as a shift key, setting the
+       8th  bit  of any character transmitted, this fact can be indicated with
+       <STRONG>km</STRONG>.  Otherwise, software will assume that the 8th bit is parity and  it
+       will  usually be cleared.  If strings exist to turn this "meta mode" on
+       and off, they can be given as <STRONG>smm</STRONG> and <STRONG>rmm</STRONG>.
+
+       If the terminal has more lines of memory than will fit on the screen at
+       once,  the number of lines of memory can be indicated with <STRONG>lm</STRONG>.  A value
+       of <STRONG>lm</STRONG>#0 indicates that the number of lines is not fixed, but that there
+       is still more memory than fits on the screen.
+
+       If  the terminal is one of those supported by the UNIX virtual terminal
+       protocol, the terminal number can be given as <STRONG>vt</STRONG>.
+
+       Media copy strings which control an auxiliary printer connected to  the
+       terminal  can  be  given as <STRONG>mc0</STRONG>: print the contents of the screen, <STRONG>mc4</STRONG>:
+       turn off the printer, and <STRONG>mc5</STRONG>: turn on the printer.  When  the  printer
+       is  on,  all text sent to the terminal will be sent to the printer.  It
+       is undefined whether the text is also displayed on the terminal  screen
+       when  the  printer  is  on.   A variation <STRONG>mc5p</STRONG> takes one parameter, and
+       leaves the printer on for as  many  characters  as  the  value  of  the
+       parameter, then turns the printer off.  The parameter should not exceed
+       255.  All text, including <STRONG>mc4</STRONG>, is transparently passed to  the  printer
+       while an <STRONG>mc5p</STRONG> is in effect.
+
+
+</PRE><H3><a name="h3-Glitches-and-Braindamage">Glitches and Braindamage</a></H3><PRE>
+       Hazeltine  terminals, which do not allow "~" characters to be displayed
+       should indicate <STRONG>hz</STRONG>.
+
+       Terminals which ignore a line-feed immediately after an <STRONG>am</STRONG>  wrap,  such
+       as the Concept and vt100, should indicate <STRONG>xenl</STRONG>.
+
+       If  <STRONG>el</STRONG>  is  required  to get rid of standout (instead of merely writing
+       normal text on top of it), <STRONG>xhp</STRONG> should be given.
+
+       Teleray terminals, where tabs turn all characters moved over to blanks,
+       should  indicate  <STRONG>xt</STRONG> (destructive tabs).  Note: the variable indicating
+       this  is  now  "dest_tabs_magic_smso";  in  older  versions,   it   was
+       teleray_glitch.   This  glitch  is  also  taken  to mean that it is not
+       possible to position the cursor on top of a  "magic  cookie",  that  to
+       erase  standout  mode  it is instead necessary to use delete and insert
+       line.  The ncurses implementation ignores this glitch.
+
+       The Beehive Superbee, which is unable to correctly transmit the  escape
+       or  control/C  characters,  has <STRONG>xsb</STRONG>, indicating that the f1 key is used
+       for escape and f2 for control/C.  (Only  certain  Superbees  have  this
+       problem,  depending on the ROM.)  Note that in older terminfo versions,
+       this capability was called "beehive_glitch"; it is now "no_esc_ctl_c".
+
+       Other specific terminal  problems  may  be  corrected  by  adding  more
+       capabilities of the form <STRONG>x</STRONG><EM>x</EM>.
+
+
+</PRE><H3><a name="h3-Pitfalls-of-Long-Entries">Pitfalls of Long Entries</a></H3><PRE>
+       Long  terminfo  entries are unlikely to be a problem; to date, no entry
+       has  even  approached  terminfo's   4096-byte   string-table   maximum.
+       Unfortunately,  the termcap translations are much more strictly limited
+       (to 1023 bytes), thus termcap translations of long terminfo entries can
+       cause problems.
+
+       The  man  pages  for  4.3BSD and older versions of <STRONG>tgetent</STRONG> instruct the
+       user to allocate a 1024-byte buffer for the termcap entry.   The  entry
+       gets  null-terminated by the termcap library, so that makes the maximum
+       safe length for a termcap entry 1k-1 (1023) bytes.  Depending  on  what
+       the  application  and the termcap library being used does, and where in
+       the termcap file the terminal type that <STRONG>tgetent</STRONG> is  searching  for  is,
+       several bad things can happen.
+
+       Some  termcap libraries print a warning message or exit if they find an
+       entry that's longer than 1023 bytes; others do not; others truncate the
+       entries  to  1023  bytes.  Some application programs allocate more than
+       the recommended 1K for the termcap entry; others do not.
+
+       Each termcap entry has two important sizes associated with  it:  before
+       "tc"  expansion, and after "tc" expansion.  "tc" is the capability that
+       tacks on another termcap entry to the end of the current one, to add on
+       its capabilities.  If a termcap entry does not use the "tc" capability,
+       then of course the two lengths are the same.
+
+       The "before tc expansion" length is the most important one, because  it
+       affects  more than just users of that particular terminal.  This is the
+       length of the entry as it exists in /etc/termcap, minus the  backslash-
+       newline pairs, which <STRONG>tgetent</STRONG> strips out while reading it.  Some termcap
+       libraries strip off the final newline, too (GNU termcap does not).  Now
+       suppose:
+
+       <STRONG>o</STRONG>   a termcap entry before expansion is more than 1023 bytes long,
+
+       <STRONG>o</STRONG>   and the application has only allocated a 1k buffer,
+
+       <STRONG>o</STRONG>   and  the termcap library (like the one in BSD/OS 1.1 and GNU) reads
+           the whole entry into the buffer, no matter what its length, to  see
+           if it is the entry it wants,
+
+       <STRONG>o</STRONG>   and  <STRONG>tgetent</STRONG>  is  searching  for a terminal type that either is the
+           long entry, appears in the termcap file after the  long  entry,  or
+           does  not  appear in the file at all (so that <STRONG>tgetent</STRONG> has to search
+           the whole termcap file).
+
+       Then <STRONG>tgetent</STRONG> will overwrite memory, perhaps  its  stack,  and  probably
+       core   dump   the  program.   Programs  like  telnet  are  particularly
+       vulnerable; modern telnets pass along values  like  the  terminal  type
+       automatically.   The  results  are almost as undesirable with a termcap
+       library, like SunOS 4.1.3 and Ultrix 4.4, that prints warning  messages
+       when  it  reads  an  overly  long  termcap entry.  If a termcap library
+       truncates long entries, like OSF/1 3.0, it is immune to dying here  but
+       will return incorrect data for the terminal.
+
+       The  "after  tc  expansion"  length  will  have a similar effect to the
+       above, but only for people who actually set TERM to that terminal type,
+       since  <STRONG>tgetent</STRONG>  only  does "tc" expansion once it is found the terminal
+       type it was looking for, not while searching.
+
+       In summary, a termcap entry that is longer than 1023 bytes  can  cause,
+       on  various  combinations of termcap libraries and applications, a core
+       dump, warnings, or incorrect operation.  If it is too long even  before
+       "tc"  expansion,  it will have this effect even for users of some other
+       terminal types and users whose TERM variable does not  have  a  termcap
+       entry.
+
+       When  in  -C (translate to termcap) mode, the <STRONG>ncurses</STRONG> implementation of
+       <STRONG><A HREF="tic.1m.html">tic(1m)</A></STRONG> issues warning messages when the pre-tc  length  of  a  termcap
+       translation  is  too  long.  The -c (check) option also checks resolved
+       (after tc expansion) lengths.
+
+
+</PRE><H3><a name="h3-Binary-Compatibility">Binary Compatibility</a></H3><PRE>
+       It is not wise to count  on  portability  of  binary  terminfo  entries
+       between  commercial  UNIX  versions.   The problem is that there are at
+       least two versions of terminfo (under HP-UX  and  AIX)  which  diverged
+       from   System   V   terminfo  after  SVr1,  and  have  added  extension
+       capabilities to the string table that (in the  binary  format)  collide
+       with System V and XSI Curses extensions.
+
+
+</PRE><H2><a name="h2-EXTENSIONS">EXTENSIONS</a></H2><PRE>
+       Searching    for   terminal   descriptions   in   <STRONG>$HOME/.terminfo</STRONG>   and
+       TERMINFO_DIRS is not supported by older implementations.
+
+       Some SVr4 <STRONG>curses</STRONG> implementations, and all  previous  to  SVr4,  do  not
+       interpret the %A and %O operators in parameter strings.
+
+       SVr4/XPG4  do  not  specify  whether <STRONG>msgr</STRONG> licenses movement while in an
+       alternate-character-set mode (such modes may, among other  things,  map
+       CR  and  NL  to  characters  that  do  not trigger local motions).  The
+       <STRONG>ncurses</STRONG> implementation ignores <STRONG>msgr</STRONG> in <STRONG>ALTCHARSET</STRONG>  mode.   This  raises
+       the  possibility  that  an  XPG4  implementation  making  the  opposite
+       interpretation may need terminfo entries made for <STRONG>ncurses</STRONG> to have  <STRONG>msgr</STRONG>
+       turned off.
+
+       The <STRONG>ncurses</STRONG> library handles insert-character and insert-character modes
+       in a slightly non-standard way to get better  update  efficiency.   See
+       the <STRONG>Insert/Delete</STRONG> <STRONG>Character</STRONG> subsection above.
+
+       The  parameter  substitutions  for  <STRONG>set_clock</STRONG> and <STRONG>display_clock</STRONG> are not
+       documented in SVr4 or the XSI Curses standard.  They are  deduced  from
+       the documentation for the AT&amp;T 505 terminal.
+
+       Be  careful  assigning the <STRONG>kmous</STRONG> capability.  The <STRONG>ncurses</STRONG> library wants
+       to interpret it as <STRONG>KEY_MOUSE</STRONG>, for use by terminals and  emulators  like
+       xterm  that can return mouse-tracking information in the keyboard-input
+       stream.
+
+       X/Open Curses does not mention  italics.   Portable  applications  must
+       assume  that  numeric  capabilities  are  signed  16-bit  values.  This
+       includes the <EM>no</EM><STRONG>_</STRONG><EM>color</EM><STRONG>_</STRONG><EM>video</EM> (ncv) capability.   The  32768  mask  value
+       used  for  italics with ncv can be confused with an absent or cancelled
+       ncv.  If italics should work with colors, then the ncv  value  must  be
+       specified, even if it is zero.
+
+       Different  commercial  ports  of  terminfo and curses support different
+       subsets of the XSI  Curses  standard  and  (in  some  cases)  different
+       extension sets.  Here is a summary, accurate as of October 1995:
+
+       <STRONG>o</STRONG>   <STRONG>SVR4,</STRONG> <STRONG>Solaris,</STRONG> <STRONG>ncurses</STRONG> -- These support all SVr4 capabilities.
+
+       <STRONG>o</STRONG>   <STRONG>SGI</STRONG> -- Supports the SVr4 set, adds one undocumented extended string
+           capability (<STRONG>set_pglen</STRONG>).
+
+       <STRONG>o</STRONG>   <STRONG>SVr1,</STRONG> <STRONG>Ultrix</STRONG> -- These  support  a  restricted  subset  of  terminfo
+           capabilities.   The  booleans  end with <STRONG>xon_xoff</STRONG>; the numerics with
+           <STRONG>width_status_line</STRONG>; and the strings with <STRONG>prtr_non</STRONG>.
+
+       <STRONG>o</STRONG>   <STRONG>HP/UX</STRONG> -- Supports the  SVr1  subset,  plus  the  SVr[234]  numerics
+           <STRONG>num_labels</STRONG>,   <STRONG>label_height</STRONG>,  <STRONG>label_width</STRONG>,  plus  function  keys  11
+           through 63, plus <STRONG>plab_norm</STRONG>,  <STRONG>label_on</STRONG>,  and  <STRONG>label_off</STRONG>,  plus  some
+           incompatible extensions in the string table.
+
+       <STRONG>o</STRONG>   <STRONG>AIX</STRONG>  -- Supports the SVr1 subset, plus function keys 11 through 63,
+           plus a number of incompatible string table extensions.
+
+       <STRONG>o</STRONG>   <STRONG>OSF</STRONG> -- Supports both the SVr4 set and the AIX extensions.
+
+
+</PRE><H2><a name="h2-FILES">FILES</a></H2><PRE>
+       /usr/share/terminfo/?/*  files containing terminal descriptions
+
+
+</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="tabs.1.html">tabs(1)</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="curs_color.3x.html">curs_color(3x)</A></STRONG>,
+       <STRONG><A HREF="curs_variables.3x.html">curs_variables(3x)</A></STRONG>,     <STRONG>printf(3)</STRONG>,     <STRONG><A HREF="term_variables.3x.html">term_variables(3x)</A></STRONG>.     <STRONG><A HREF="term.5.html">term(5)</A></STRONG>.
+       <STRONG><A HREF="user_caps.5.html">user_caps(5)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Zeyd M. Ben-Halim, Eric S. Raymond, Thomas E. Dickey.  Based on <EM>pcurses</EM>
+       by Pavel Curtis.
+
+
+
+                                                                   <STRONG><A HREF="terminfo.5.html">terminfo(5)</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-Terminfo-Entry-Syntax">Terminfo Entry Syntax</a></li>
+<li><a href="#h3-Terminfo-Capabilities-Syntax">Terminfo Capabilities Syntax</a></li>
+<li><a href="#h3-Similar-Terminals">Similar Terminals</a></li>
+<li><a href="#h3-Predefined-Capabilities">Predefined Capabilities</a></li>
+<li><a href="#h3-User-Defined-Capabilities">User-Defined Capabilities</a></li>
+<li><a href="#h3-A-Sample-Entry">A Sample Entry</a></li>
+<li><a href="#h3-Types-of-Capabilities">Types of Capabilities</a></li>
+<li><a href="#h3-Fetching-Compiled-Descriptions">Fetching Compiled Descriptions</a></li>
+<li><a href="#h3-Preparing-Descriptions">Preparing Descriptions</a></li>
+<li><a href="#h3-Basic-Capabilities">Basic Capabilities</a></li>
+<li><a href="#h3-Parameterized-Strings">Parameterized Strings</a></li>
+<li><a href="#h3-Cursor-Motions">Cursor Motions</a></li>
+<li><a href="#h3-Margins">Margins</a></li>
+<li><a href="#h3-Area-Clears">Area Clears</a></li>
+<li><a href="#h3-Insert_delete-line-and-vertical-motions">Insert/delete line and vertical motions</a></li>
+<li><a href="#h3-Insert_Delete-Character">Insert/Delete Character</a></li>
+<li><a href="#h3-Highlighting_-Underlining_-and-Visible-Bells">Highlighting, Underlining, and Visible Bells</a></li>
+<li><a href="#h3-Keypad-and-Function-Keys">Keypad and Function Keys</a></li>
+<li><a href="#h3-Tabs-and-Initialization">Tabs and Initialization</a></li>
+<li><a href="#h3-Delays-and-Padding">Delays and Padding</a></li>
+<li><a href="#h3-Status-Lines">Status Lines</a></li>
+<li><a href="#h3-Line-Graphics">Line Graphics</a></li>
+<li><a href="#h3-Color-Handling">Color Handling</a></li>
+<li><a href="#h3-Miscellaneous">Miscellaneous</a></li>
+<li><a href="#h3-Glitches-and-Braindamage">Glitches and Braindamage</a></li>
+<li><a href="#h3-Pitfalls-of-Long-Entries">Pitfalls of Long Entries</a></li>
+<li><a href="#h3-Binary-Compatibility">Binary Compatibility</a></li>
+</ul>
+</li>
+<li><a href="#h2-EXTENSIONS">EXTENSIONS</a></li>
+<li><a href="#h2-FILES">FILES</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/tic.1m.html b/doc/html/man/tic.1m.html
new file mode 100644
index 0000000..cced334
--- /dev/null
+++ b/doc/html/man/tic.1m.html
@@ -0,0 +1,508 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2016,2017 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: tic.1m,v 1.84 2022/09/17 19:01:24 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>tic 1m</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">tic 1m</H1>
+<PRE>
+<STRONG><A HREF="tic.1m.html">tic(1m)</A></STRONG>                                                                <STRONG><A HREF="tic.1m.html">tic(1m)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>tic</STRONG> - the <EM>terminfo</EM> entry-description compiler
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>tic</STRONG>  [<STRONG>-01CDGIKLNTUVWacfgqrstx</STRONG>]  [<STRONG>-e</STRONG> <EM>names</EM>] [<STRONG>-o</STRONG> <EM>dir</EM>] [<STRONG>-Q</STRONG>[<EM>n</EM>]] [<STRONG>-R</STRONG> <EM>subset</EM>]
+       [<STRONG>-v</STRONG>[<EM>n</EM>]] [<STRONG>-w</STRONG>[<EM>n</EM>]] <EM>file</EM>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The <STRONG>tic</STRONG> command translates a <STRONG>terminfo</STRONG>  file  from  source  format  into
+       compiled  format.   The  compiled  format is necessary for use with the
+       library routines in <STRONG><A HREF="ncurses.3x.html">ncurses(3x)</A></STRONG>.
+
+       As described in <STRONG><A HREF="term.5.html">term(5)</A></STRONG>, the database may be either  a  directory  tree
+       (one  file  per  terminal  entry)  or a hashed database (one record per
+       entry).  The <STRONG>tic</STRONG> command writes only one type of  entry,  depending  on
+       how it was built:
+
+       <STRONG>o</STRONG>   For    directory    trees,    the    top-level   directory,   e.g.,
+           /usr/share/terminfo, specifies the location of the database.
+
+       <STRONG>o</STRONG>   For hashed databases, a filename is needed.  If the given  file  is
+           not  found  by  that  name,  but  can be found by adding the suffix
+           ".db", then that is used.
+
+           The default name for the hashed database is the same as the default
+           directory name (only adding a ".db" suffix).
+
+       In  either  case  (directory  or  hashed database), <STRONG>tic</STRONG> will create the
+       container if it does not exist.  For a directory,  this  would  be  the
+       "terminfo" leaf, versus a "terminfo.db" file.
+
+       The  results  are  normally  placed  in  the  system  terminfo database
+       <STRONG>/usr/share/terminfo</STRONG>.  The compiled terminal description can  be  placed
+       in a different terminfo database.  There are two ways to achieve this:
+
+       <STRONG>o</STRONG>   First,  you  may override the system default either by using the <STRONG>-o</STRONG>
+           option,  or  by  setting  the  variable  <STRONG>TERMINFO</STRONG>  in  your   shell
+           environment to a valid database location.
+
+       <STRONG>o</STRONG>   Secondly,  if  <STRONG>tic</STRONG>  cannot  write  in  <EM>/usr/share/terminfo</EM>  or  the
+           location specified using your TERMINFO variable, it looks  for  the
+           directory  <EM>$HOME/.terminfo</EM> (or hashed database <EM>$HOME/.terminfo.db)</EM>;
+           if that location exists, the entry is placed there.
+
+       Libraries  that  read  terminfo  entries  are  expected  to  check   in
+       succession
+
+       <STRONG>o</STRONG>   a location specified with the TERMINFO environment variable,
+
+       <STRONG>o</STRONG>   <EM>$HOME/.terminfo</EM>,
+
+       <STRONG>o</STRONG>   directories listed in the TERMINFO_DIRS environment variable,
+
+       <STRONG>o</STRONG>   a compiled-in list of directories (no default value), and
+
+       <STRONG>o</STRONG>   the system terminfo database (<EM>/usr/share/terminfo</EM>).
+
+
+</PRE><H3><a name="h3-ALIASES">ALIASES</a></H3><PRE>
+       This  is the same program as infotocap and captoinfo; usually those are
+       linked to, or copied from this program:
+
+       <STRONG>o</STRONG>   When invoked as infotocap, tic sets the <STRONG>-I</STRONG> option.
+
+       <STRONG>o</STRONG>   When invoked as captoinfo, tic sets the <STRONG>-C</STRONG> option.
+
+
+</PRE><H3><a name="h3-OPTIONS">OPTIONS</a></H3><PRE>
+       <STRONG>-0</STRONG>     restricts the output to a single line
+
+       <STRONG>-1</STRONG>     restricts the output to a single column
+
+       <STRONG>-a</STRONG>     tells <STRONG>tic</STRONG>  to  retain  commented-out  capabilities  rather  than
+              discarding  them.   Capabilities are commented by prefixing them
+              with a period.  This sets the <STRONG>-x</STRONG> option, because it  treats  the
+              commented-out  entries  as user-defined names.  If the source is
+              termcap, accept the 2-character names  required  by  version  6.
+              Otherwise these are ignored.
+
+       <STRONG>-C</STRONG>     Force  source translation to termcap format.  Note: this differs
+              from the <STRONG>-C</STRONG> option of <STRONG><A HREF="infocmp.1m.html">infocmp(1m)</A></STRONG> in that  it  does  not  merely
+              translate capability names, but also translates terminfo strings
+              to termcap format.  Capabilities that are not  translatable  are
+              left  in  the entry under their terminfo names but commented out
+              with two preceding dots.  The actual  format  used  incorporates
+              some  improvements  for escaped characters from terminfo format.
+              For a stricter BSD-compatible translation, add the <STRONG>-K</STRONG> option.
+
+              If this is combined with <STRONG>-c</STRONG>,  <STRONG>tic</STRONG>  makes  additional  checks  to
+              report  cases  where  the  terminfo  values do not have an exact
+              equivalent in termcap form.  For example:
+
+              <STRONG>o</STRONG>   <STRONG>sgr</STRONG> usually will not  convert,  because  termcap  lacks  the
+                  ability  to  work with more than two parameters, and because
+                  termcap lacks many of the arithmetic/logical operators  used
+                  in terminfo.
+
+              <STRONG>o</STRONG>   capabilities  with more than one delay or with delays before
+                  the end of the string will not convert completely.
+
+       <STRONG>-c</STRONG>     tells <STRONG>tic</STRONG> to  only  check  <EM>file</EM>  for  errors,  including  syntax
+              problems  and  bad  use-links.  If you specify <STRONG>-C</STRONG> (<STRONG>-I</STRONG>) with this
+              option, the code will print warnings about entries which,  after
+              use  resolution, are more than 1023 (4096) bytes long.  Due to a
+              fixed buffer length in older termcap libraries, as well as buggy
+              checking  for  the  buffer  length  (and  a  documented limit in
+              terminfo),  these  entries  may  cause  core  dumps  with  other
+              implementations.
+
+              <STRONG>tic</STRONG>  checks  string  capabilities  to  ensure  that  those  with
+              parameters will be valid expressions.  It does this  check  only
+              for  the predefined string capabilities; those which are defined
+              with the <STRONG>-x</STRONG> option are ignored.
+
+       <STRONG>-D</STRONG>     tells <STRONG>tic</STRONG> to print the database locations that it  knows  about,
+              and exit.  The first location shown is the one to which it would
+              write compiled terminal descriptions.  If <STRONG>tic</STRONG>  is  not  able  to
+              find  a  writable  database  location  according  to  the  rules
+              summarized above, it will print a diagnostic and  exit  with  an
+              error rather than printing a list of database locations.
+
+       <STRONG>-e</STRONG> <EM>names</EM>
+              Limit  writes  and translations to the following comma-separated
+              list of terminals.  If any name or alias of a  terminal  matches
+              one  of  the  names  in  the  list, the entry will be written or
+              translated as normal.  Otherwise no output will be generated for
+              it.   The  option  value is interpreted as a file containing the
+              list if it contains a '/'.  (Note:  depending  on  how  tic  was
+              compiled, this option may require <STRONG>-I</STRONG> or <STRONG>-C</STRONG>.)
+
+       <STRONG>-f</STRONG>     Display     complex     terminfo     strings    which    contain
+              if/then/else/endif expressions indented for readability.
+
+       <STRONG>-G</STRONG>     Display constant literals in  decimal  form  rather  than  their
+              character equivalents.
+
+       <STRONG>-g</STRONG>     Display  constant  character literals in quoted form rather than
+              their decimal equivalents.
+
+       <STRONG>-I</STRONG>     Force source translation to terminfo format.
+
+       <STRONG>-K</STRONG>     Suppress some longstanding ncurses extensions to termcap format,
+              e.g., "\s" for space.
+
+       <STRONG>-L</STRONG>     Force  source  translation  to  terminfo format using the long C
+              variable names listed in &lt;<STRONG>term.h</STRONG>&gt;
+
+       <STRONG>-N</STRONG>     Disable smart defaults.  Normally, when translating from termcap
+              to  terminfo,  the  compiler makes a number of assumptions about
+              the   defaults    of    string    capabilities    <STRONG>reset1_string</STRONG>,
+              <STRONG>carriage_return</STRONG>,  <STRONG>cursor_left</STRONG>, <STRONG>cursor_down</STRONG>, <STRONG>scroll_forward</STRONG>, <STRONG>tab</STRONG>,
+              <STRONG>newline</STRONG>, <STRONG>key_backspace</STRONG>, <STRONG>key_left</STRONG>, and <STRONG>key_down</STRONG>, then attempts to
+              use  obsolete termcap capabilities to deduce correct values.  It
+              also normally suppresses output of obsolete termcap capabilities
+              such  as <STRONG>bs</STRONG>.  This option forces a more literal translation that
+              also preserves the obsolete capabilities.
+
+       <STRONG>-o</STRONG><EM>dir</EM>  Write compiled entries to given  database  location.   Overrides
+              the TERMINFO environment variable.
+
+       <STRONG>-Q</STRONG><EM>n</EM>    Rather  than  show  source  in terminfo (text) format, print the
+              compiled  (binary)  format  in  hexadecimal  or   base64   form,
+              depending on the option's value:
+
+               1  hexadecimal
+
+               2  base64
+
+               3  hexadecimal and base64
+
+       <STRONG>-q</STRONG>     Suppress  comments  and  blank  lines  when  showing  translated
+              source.
+
+       <STRONG>-R</STRONG><EM>subset</EM>
+              Restrict output to a given subset.  This option is for use  with
+              archaic  versions of terminfo like those on SVr1, Ultrix, or HP-
+              UX that do not support the full set of SVR4/XSI Curses terminfo;
+              and  outright  broken  ports  like  AIX  3.x that have their own
+              extensions incompatible with SVr4/XSI.   Available  subsets  are
+              "SVr1",  "Ultrix",  "HP",  "BSD"  and "AIX"; see <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG> for
+              details.
+
+       <STRONG>-r</STRONG>     Force  entry  resolution  (so  there   are   no   remaining   tc
+              capabilities)  even  when  doing  translation to termcap format.
+              This may be needed if you are preparing a  termcap  file  for  a
+              termcap  library (such as GNU termcap through version 1.3 or BSD
+              termcap  through  4.3BSD)  that  does  not  handle  multiple  tc
+              capabilities per entry.
+
+       <STRONG>-s</STRONG>     Summarize  the  compile  by  showing  the database location into
+              which entries are written, and the number of entries  which  are
+              compiled.
+
+       <STRONG>-T</STRONG>     eliminates  size-restrictions  on  the  generated text.  This is
+              mainly useful for  testing  and  analysis,  since  the  compiled
+              descriptions  are  limited  (e.g.,  1023  for  termcap, 4096 for
+              terminfo).
+
+       <STRONG>-t</STRONG>     tells <STRONG>tic</STRONG> to discard commented-out capabilities.  Normally  when
+              translating    from    terminfo   to   termcap,   untranslatable
+              capabilities are commented-out.
+
+       <STRONG>-U</STRONG>   tells <STRONG>tic</STRONG> to not post-process the data after  parsing  the  source
+            file.  Normally, it infers data which is commonly missing in older
+            terminfo data, or in termcaps.
+
+       <STRONG>-V</STRONG>   reports the version of ncurses which was used in this program, and
+            exits.
+
+       <STRONG>-v</STRONG><EM>n</EM>  specifies that (verbose) output be written to standard error trace
+            information showing <STRONG>tic</STRONG>'s progress.
+
+            The optional parameter <EM>n</EM> is a  number  from  1  to  9,  inclusive,
+            indicating the desired level of detail of information.
+
+            <STRONG>o</STRONG>   If  ncurses  is  built  without  tracing support, the optional
+                parameter is ignored.
+
+            <STRONG>o</STRONG>   If <EM>n</EM> is omitted, the default level is 1.
+
+            <STRONG>o</STRONG>   If <EM>n</EM> is specified and greater than 1, the level of  detail  is
+                increased,   and   the   output   is   written  (with  tracing
+                information) to the "trace" file.
+
+            The debug flag levels are as follows:
+
+            1   Names of files created and linked
+
+            2   Information related to the "use" facility
+
+            3   Statistics from the hashing algorithm
+
+            4   Details of extended capabilities
+
+            5   (unused)
+
+            6   (unused)
+
+            7   Entries into the string-table
+
+            8   List of tokens encountered by scanner
+
+            9   All values computed in construction of the hash table
+
+       <STRONG>-W</STRONG>   By itself, the <STRONG>-w</STRONG>  option  will  not  force  long  strings  to  be
+            wrapped.  Use the <STRONG>-W</STRONG> option to do this.
+
+            If  you specify both <STRONG>-f</STRONG> and <STRONG>-W</STRONG> options, the latter is ignored when
+            <STRONG>-f</STRONG> has already split the line.
+
+       <STRONG>-w</STRONG><EM>n</EM>  specifies the width of the output.  The parameter is optional.  If
+            it is omitted, it defaults to 60.
+
+       <STRONG>-x</STRONG>   Treat  unknown  capabilities  as  user-defined (see <STRONG>user_caps(5)</STRONG>).
+            That is, if you supply  a  capability  name  which  <STRONG>tic</STRONG>  does  not
+            recognize, it will infer its type (boolean, number or string) from
+            the syntax and make an  extended  table  entry  for  that.   User-
+            defined  capability strings whose name begins with "k" are treated
+            as function keys.
+
+
+</PRE><H3><a name="h3-PARAMETERS">PARAMETERS</a></H3><PRE>
+       <EM>file</EM>   contains one or more <STRONG>terminfo</STRONG> terminal  descriptions  in  source
+              format   [see   <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG>].   Each  description  in  the  file
+              describes the capabilities of a particular terminal.
+
+              If <EM>file</EM> is "-", then the data is read from the  standard  input.
+              The <EM>file</EM> parameter may also be the path of a character-device.
+
+
+</PRE><H3><a name="h3-PROCESSING">PROCESSING</a></H3><PRE>
+       All  but  one  of  the capabilities recognized by <STRONG>tic</STRONG> are documented in
+       <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG>.  The exception is the <STRONG>use</STRONG> capability.
+
+       When a <STRONG>use</STRONG>=<EM>entry</EM>-<EM>name</EM> field is discovered in a terminal entry currently
+       being  compiled,  <STRONG>tic</STRONG>  reads  in the binary from <STRONG>/usr/share/terminfo</STRONG> to
+       complete the entry.  (Entries created from <EM>file</EM>  will  be  used  first.
+       <STRONG>tic</STRONG>  duplicates  the  capabilities in <EM>entry</EM>-<EM>name</EM> for the current entry,
+       with the exception of those capabilities that explicitly are defined in
+       the current entry.
+
+       When  an  entry, e.g., <STRONG>entry_name_1</STRONG>, contains a <STRONG>use=</STRONG><EM>entry</EM>_<EM>name</EM>_<EM>2</EM> field,
+       any  canceled  capabilities  in  <EM>entry</EM>_<EM>name</EM>_<EM>2</EM>  must  also   appear   in
+       <STRONG>entry_name_1</STRONG>  before  <STRONG>use=</STRONG>  for  these  capabilities  to be canceled in
+       <STRONG>entry_name_1</STRONG>.
+
+       Total compiled entries cannot exceed 4096 bytes.  The name field cannot
+       exceed  512  bytes.   Terminal names exceeding the maximum alias length
+       (32 characters on systems with long filenames, 14 characters otherwise)
+       will  be  truncated  to  the maximum alias length and a warning message
+       will be printed.
+
+
+</PRE><H2><a name="h2-HISTORY">HISTORY</a></H2><PRE>
+       System V Release 2 provided  a  <STRONG>tic</STRONG>  utility.   It  accepted  a  single
+       option:  <STRONG>-v</STRONG>  (optionally  followed  by  a  number).   According to Ross
+       Ridge's comment in <EM>mytinfo</EM>, this version of <STRONG>tic</STRONG> was unable to represent
+       cancelled capabilities.
+
+       System  V  Release 3 provided a different <STRONG>tic</STRONG> utility, written by Pavel
+       Curtis, (originally named "compile" in <EM>pcurses</EM>).  This added an  option
+       <STRONG>-c</STRONG>  to check the file for errors, with the caveat that errors in "use="
+       links would not be reported.  System  V  Release  3  documented  a  few
+       warning  messages  which  did not appear in <EM>pcurses</EM>.  While the program
+       itself was changed  little  as  development  continued  with  System  V
+       Release  4,  the  table  of capabilities grew from 180 (<EM>pcurses</EM>) to 464
+       (Solaris).
+
+       In early development of ncurses (1993), Zeyd Ben-Halim used  the  table
+       from  <EM>mytinfo</EM>  to  extend  the  <EM>pcurses</EM>  table to 469 capabilities (456
+       matched SVr4, 8 were only in SVr4, 13 were not in SVr4).  Of those  13,
+       11  were  ultimately  discarded  (perhaps  to match the draft of X/Open
+       Curses).  The exceptions were <STRONG>memory_lock_above</STRONG> and <STRONG>memory_unlock</STRONG>  (see
+       <STRONG><A HREF="user_caps.5.html">user_caps(5)</A></STRONG>).
+
+       Eric  Raymond  incorporated  parts of <EM>mytinfo</EM> into ncurses to implement
+       the termcap-to-terminfo source conversion, and extended that  to  begin
+       development of the corresponding terminfo-to-termcap source conversion,
+       Thomas Dickey completed that development over  the  course  of  several
+       years.
+
+       In  1999,  Thomas  Dickey  added  the <STRONG>-x</STRONG> option to support user-defined
+       capabilities.
+
+       In 2010, Roy Marples provided a <STRONG>tic</STRONG> program and  terminfo  library  for
+       NetBSD.   That  implementation  adapts  several  features from ncurses,
+       including <STRONG>tic</STRONG>'s <STRONG>-x</STRONG> option.
+
+       The <STRONG>-c</STRONG> option tells <STRONG>tic</STRONG> to check for problems in  the  terminfo  source
+       file.  Continued development provides additional checks:
+
+       <STRONG>o</STRONG>   <EM>pcurses</EM> had 8 warnings
+
+       <STRONG>o</STRONG>   ncurses in 1996 had 16 warnings
+
+       <STRONG>o</STRONG>   Solaris (SVr4) curses has 28 warnings
+
+       <STRONG>o</STRONG>   NetBSD tic in 2019 has 19 warnings.
+
+       <STRONG>o</STRONG>   ncurses in 2019 has 96 warnings
+
+       The checking done in ncurses' <STRONG>tic</STRONG> helps with the conversion to termcap,
+       as well as pointing out errors and inconsistencies.  It is also used to
+       ensure  consistency  with the user-defined capabilities.  There are 527
+       distinct capabilities in ncurses' terminal database; 128 of  those  are
+       user-defined.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       X/Open  Curses, Issue 7 (2009) provides a brief description of <STRONG>tic</STRONG>.  It
+       lists one option: <STRONG>-c</STRONG>.  The omission of <STRONG>-v</STRONG> is  unexpected.   The  change
+       history  states  that  the  description  is  derived  from True64 UNIX.
+       According to its manual  pages,  that  system  also  supported  the  <STRONG>-v</STRONG>
+       option.
+
+       Shortly  after  Issue  7  was  released, Tru64 was discontinued.  As of
+       2019, the surviving implementations of <STRONG>tic</STRONG> are  SVr4  (AIX,  HP-UX  and
+       Solaris), ncurses and NetBSD curses.  The SVr4 <STRONG>tic</STRONG> programs all support
+       the <STRONG>-v</STRONG> option.  The NetBSD <STRONG>tic</STRONG> program follows X/Open's  documentation,
+       omitting the <STRONG>-v</STRONG> option.
+
+       The  X/Open  rationale  states  that  some  implementations of <STRONG>tic</STRONG> read
+       terminal descriptions from the standard input if the <EM>file</EM> parameter  is
+       omitted.   None of these implementations do that.  Further, it comments
+       that some  may  choose  to  read  from  "./terminfo.src"  but  that  is
+       obsolescent  behavior  from SVr2, and is not (for example) a documented
+       feature of SVr3.
+
+
+</PRE><H3><a name="h3-COMPATIBILITY">COMPATIBILITY</a></H3><PRE>
+       There is  some  evidence  that  historic  <STRONG>tic</STRONG>  implementations  treated
+       description  fields with no whitespace in them as additional aliases or
+       short names.  This <STRONG>tic</STRONG>  does  not  do  that,  but  it  does  warn  when
+       description fields may be treated that way and check them for dangerous
+       characters.
+
+
+</PRE><H3><a name="h3-EXTENSIONS">EXTENSIONS</a></H3><PRE>
+       Unlike the SVr4 <STRONG>tic</STRONG> command, this implementation can  actually  compile
+       termcap  sources.   In fact, entries in terminfo and termcap syntax can
+       be mixed in a single source file.  See  <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG>  for  the  list  of
+       termcap names taken to be equivalent to terminfo names.
+
+       The  SVr4  manual  pages  are not clear on the resolution rules for <STRONG>use</STRONG>
+       capabilities.   This  implementation  of  <STRONG>tic</STRONG>  will  find  <STRONG>use</STRONG>  targets
+       anywhere  in  the  source  file, or anywhere in the file tree rooted at
+       <STRONG>TERMINFO</STRONG> (if <STRONG>TERMINFO</STRONG> is defined), or  in  the  user's  <EM>$HOME/.terminfo</EM>
+       database  (if  it  exists),  or (finally) anywhere in the system's file
+       tree of compiled entries.
+
+       The error messages from this <STRONG>tic</STRONG> have the same format as  GNU  C  error
+       messages, and can be parsed by GNU Emacs's compile facility.
+
+       Aside from <STRONG>-c</STRONG> and <STRONG>-v</STRONG>, options are not portable:
+
+       <STRONG>o</STRONG>   Most of tic's options are not supported by SVr4 <STRONG>tic</STRONG>:
+
+           <STRONG>-0</STRONG> <STRONG>-1</STRONG> <STRONG>-C</STRONG> <STRONG>-G</STRONG> <STRONG>-I</STRONG> <STRONG>-N</STRONG> <STRONG>-R</STRONG> <STRONG>-T</STRONG> <STRONG>-V</STRONG> <STRONG>-a</STRONG> <STRONG>-e</STRONG> <STRONG>-f</STRONG> <STRONG>-g</STRONG> <STRONG>-o</STRONG> <STRONG>-r</STRONG> <STRONG>-s</STRONG> <STRONG>-t</STRONG> <STRONG>-x</STRONG>
+
+       <STRONG>o</STRONG>   The NetBSD <STRONG>tic</STRONG>  supports a few of the ncurses options
+
+           <STRONG>-a</STRONG> <STRONG>-o</STRONG> <STRONG>-x</STRONG>
+
+           and  adds  <STRONG>-S</STRONG>  (a feature which does the same thing as infocmp's <STRONG>-e</STRONG>
+           and <STRONG>-E</STRONG> options).
+
+       The SVr4 <STRONG>-c</STRONG> mode does not report bad "use=" links.
+
+       System V does  not  compile  entries  to  or  read  entries  from  your
+       <EM>$HOME/.terminfo</EM> database unless TERMINFO is explicitly set to it.
+
+
+</PRE><H2><a name="h2-FILES">FILES</a></H2><PRE>
+       <STRONG>/usr/share/terminfo/?/*</STRONG>
+            Compiled terminal description database.
+
+
+</PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</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="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 20221231).
+
+
+</PRE><H2><a name="h2-AUTHOR">AUTHOR</a></H2><PRE>
+       Eric S. Raymond &lt;esr@snark.thyrsus.com&gt; and
+       Thomas E. Dickey &lt;dickey@invisible-island.net&gt;
+
+
+
+                                                                       <STRONG><A HREF="tic.1m.html">tic(1m)</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-ALIASES">ALIASES</a></li>
+<li><a href="#h3-OPTIONS">OPTIONS</a></li>
+<li><a href="#h3-PARAMETERS">PARAMETERS</a></li>
+<li><a href="#h3-PROCESSING">PROCESSING</a></li>
+</ul>
+</li>
+<li><a href="#h2-HISTORY">HISTORY</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a>
+<ul>
+<li><a href="#h3-COMPATIBILITY">COMPATIBILITY</a></li>
+<li><a href="#h3-EXTENSIONS">EXTENSIONS</a></li>
+</ul>
+</li>
+<li><a href="#h2-FILES">FILES</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-AUTHOR">AUTHOR</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/toe.1m.html b/doc/html/man/toe.1m.html
new file mode 100644
index 0000000..a915118
--- /dev/null
+++ b/doc/html/man/toe.1m.html
@@ -0,0 +1,192 @@
+<!--
+  ****************************************************************************
+  * Copyright 2019-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2015,2017 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: toe.1m,v 1.36 2022/02/12 20:02:20 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>toe 1m</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">toe 1m</H1>
+<PRE>
+<STRONG><A HREF="toe.1m.html">toe(1m)</A></STRONG>                                                                <STRONG><A HREF="toe.1m.html">toe(1m)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>toe</STRONG> - table of (terminfo) entries
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>toe</STRONG> [<STRONG>-v</STRONG>[<EM>n</EM>]] [<STRONG>-ahsuUV</STRONG>] <EM>file...</EM>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       With no options, <STRONG>toe</STRONG> lists all available terminal types by primary name
+       with descriptions.   File  arguments  specify  the  directories  to  be
+       scanned;  if  no  such  arguments  are  given,  your  default  terminfo
+       directory is scanned.  If you also specify the <STRONG>-h</STRONG> option,  a  directory
+       header will be issued as each directory is entered.
+
+       There are other options intended for use by terminfo file maintainers:
+
+       <STRONG>-a</STRONG>     report  on  all  of  the  terminal databases which ncurses would
+              search, rather than only the first one that it finds.
+
+              If the <STRONG>-s</STRONG> is also given,  <STRONG>toe</STRONG>  adds  a  column  to  the  report,
+              showing (like <STRONG>conflict(1)</STRONG>) which entries which belong to a given
+              terminal database.  An "*" marks entries which differ,  and  "+"
+              marks equivalent entries.
+
+              Without  the <STRONG>-s</STRONG> option, <STRONG>toe</STRONG> does not attempt to merge duplicates
+              in its report
+
+       <STRONG>-s</STRONG>     sort the output by the entry names.
+
+       <STRONG>-u</STRONG> <EM>file</EM>
+              says  to  write  a  report  to  the  standard  output,   listing
+              dependencies  in  the  given  terminfo/termcap source file.  The
+              report condenses the "use" relation: each line consists  of  the
+              primary  name  of a terminal that has use capabilities, followed
+              by a colon, followed by the whitespace-separated  primary  names
+              of all terminals which occur in those use capabilities, followed
+              by a newline
+
+       <STRONG>-U</STRONG> <EM>file</EM>
+              says to write a report to the standard output,  listing  reverse
+              dependencies  in  the  given  terminfo/termcap source file.  The
+              report reverses the "use" relation: each line  consists  of  the
+              primary  name  of  a  terminal  that occurs in use capabilities,
+              followed  by  a  colon,  followed  by  the  whitespace-separated
+              primary names of all terminals which depend on it, followed by a
+              newline.
+
+       <STRONG>-v</STRONG><EM>n</EM>    specifies that (verbose) output be written  to  standard  error,
+              showing <STRONG>toe</STRONG>'s progress.
+
+              The  optional  parameter <EM>n</EM> is a number from 1 to 10, interpreted
+              as for <STRONG><A HREF="tic.1m.html">tic(1m)</A></STRONG>.  If ncurses is built  without  tracing  support,
+              the optional parameter is ignored.
+
+       <STRONG>-V</STRONG>     reports  the  version of ncurses which was used in this program,
+              and exits.
+
+
+</PRE><H2><a name="h2-EXAMPLES">EXAMPLES</a></H2><PRE>
+       Without sorting, the <STRONG>-a</STRONG> option reports all of the names found in all of
+       the   terminal  databases  found  by  the  <STRONG>TERMINFO</STRONG>  and  <STRONG>TERMINFO_DIRS</STRONG>
+       environment variables:
+
+           MtxOrb162      16x2 Matrix Orbital LCD display
+           MtxOrb204      20x4 Matrix Orbital LCD display
+           MtxOrb         Generic Matrix Orbital LCD display
+           qvt101+        qume qvt 101 PLUS product
+           qvt119+-25     QVT 119 PLUS with 25 data lines
+           qansi-g        QNX ANSI
+           qvt103         qume qvt 103
+           qnxw           QNX4 windows
+           qansi-w        QNX ansi for windows
+           qnxm           QNX4 with mouse events
+           qvt203-25-w    QVT 203 PLUS with 25 by 132 columns
+           qansi-t        QNX ansi without console writes
+           . . .
+
+       Use the <STRONG>-a</STRONG>  and  <STRONG>-s</STRONG>  options  together  to  show  where  each  terminal
+       description was found:
+
+           --&gt; /usr/local/ncurses/share/terminfo
+           ----&gt; /usr/share/terminfo
+           *-+-:     9term          Plan9 terminal emulator for X
+           *---:     Eterm          Eterm with xterm-style color support (X Window System)
+           *-*-:     Eterm-256color Eterm with xterm 256-colors
+           *-*-:     Eterm-88color  Eterm with 88 colors
+           *-+-:     MtxOrb         Generic Matrix Orbital LCD display
+           *-+-:     MtxOrb162      16x2 Matrix Orbital LCD display
+           *-+-:     MtxOrb204      20x4 Matrix Orbital LCD display
+           *-*-:     NCR260VT300WPP NCR 2900_260 vt300 wide mode pc+  kybd
+           *-+-:     aaa            ann arbor ambassador/30 lines
+           *-+-:     aaa+dec        ann arbor ambassador in dec vt100 mode
+           *-+-:     aaa+rv         ann arbor ambassador in reverse video
+           . . .
+
+
+</PRE><H2><a name="h2-FILES">FILES</a></H2><PRE>
+       <STRONG>/usr/share/terminfo/?/*</STRONG>
+            Compiled terminal description database.
+
+
+</PRE><H2><a name="h2-HISTORY">HISTORY</a></H2><PRE>
+       This  utility  is  not  provided by other implementations.  There is no
+       relevant X/Open or POSIX standard for <STRONG>toe</STRONG>.
+
+       The program name refers to a developer's pun:
+
+       <STRONG>o</STRONG>   <STRONG>tic</STRONG>,
+
+       <STRONG>o</STRONG>   <STRONG>tac</STRONG> (now <STRONG>tack</STRONG>),
+
+       <STRONG>o</STRONG>   <STRONG>toe</STRONG>.
+
+       It replaced a <STRONG>-T</STRONG> option which was  briefly  supported  by  the  ncurses
+       <STRONG>infocmp</STRONG> utility in 1995.
+
+       The  <STRONG>-a</STRONG>  and <STRONG>-s</STRONG> options were added to <STRONG>toe</STRONG> several years later (2006 and
+       2011, respectively).
+
+
+</PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</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 20221231).
+
+
+
+                                                                       <STRONG><A HREF="toe.1m.html">toe(1m)</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></li>
+<li><a href="#h2-EXAMPLES">EXAMPLES</a></li>
+<li><a href="#h2-FILES">FILES</a></li>
+<li><a href="#h2-HISTORY">HISTORY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/tput.1.html b/doc/html/man/tput.1.html
new file mode 100644
index 0000000..6a330a5
--- /dev/null
+++ b/doc/html/man/tput.1.html
@@ -0,0 +1,576 @@
+<!--
+  * t
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2016,2017 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: tput.1,v 1.76 2022/02/12 20:02:20 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>tput 1</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">tput 1</H1>
+<PRE>
+<STRONG><A HREF="tput.1.html">tput(1)</A></STRONG>                     General Commands Manual                    <STRONG><A HREF="tput.1.html">tput(1)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>tput</STRONG>, <STRONG>reset</STRONG> - initialize a terminal or query terminfo database
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>tput</STRONG> [<STRONG>-T</STRONG><EM>type</EM>] <EM>capname</EM> [<EM>parameters</EM>]
+       <STRONG>tput</STRONG> [<STRONG>-T</STRONG><EM>type</EM>] [<STRONG>-x</STRONG>] <STRONG>clear</STRONG>
+       <STRONG>tput</STRONG> [<STRONG>-T</STRONG><EM>type</EM>] <STRONG>init</STRONG>
+       <STRONG>tput</STRONG> [<STRONG>-T</STRONG><EM>type</EM>] <STRONG>reset</STRONG>
+       <STRONG>tput</STRONG> [<STRONG>-T</STRONG><EM>type</EM>] <STRONG>longname</STRONG>
+       <STRONG>tput</STRONG> <STRONG>-S</STRONG>  <STRONG>&lt;&lt;</STRONG>
+       <STRONG>tput</STRONG> <STRONG>-V</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       The  <STRONG>tput</STRONG>  utility  uses  the  <STRONG>terminfo</STRONG>  database to make the values of
+       terminal-dependent capabilities and information available to the  shell
+       (see  <STRONG>sh(1)</STRONG>),  to  initialize or reset the terminal, or return the long
+       name of the requested terminal  type.   The  result  depends  upon  the
+       capability's type:
+
+          string
+               <STRONG>tput</STRONG>  writes  the  string  to the standard output.  No trailing
+               newline is supplied.
+
+          integer
+               <STRONG>tput</STRONG> writes the decimal value to the standard  output,  with  a
+               trailing newline.
+
+          boolean
+               <STRONG>tput</STRONG>  simply sets the exit code (<STRONG>0</STRONG> for TRUE if the terminal has
+               the capability, <STRONG>1</STRONG> for FALSE if it does not), and writes nothing
+               to the standard output.
+
+       Before  using  a value returned on the standard output, the application
+       should test the exit code (e.g., <STRONG>$?</STRONG>, see <STRONG>sh(1)</STRONG>) to be  sure  it  is  <STRONG>0</STRONG>.
+       (See  the <STRONG>EXIT</STRONG> <STRONG>CODES</STRONG> and <STRONG>DIAGNOSTICS</STRONG> sections.)  For a complete list of
+       capabilities and the <EM>capname</EM> associated with each, see <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG>.
+
+
+</PRE><H3><a name="h3-Options">Options</a></H3><PRE>
+       <STRONG>-S</STRONG>     allows more than one capability per  invocation  of  <STRONG>tput</STRONG>.   The
+              capabilities  must  be  passed  to  <STRONG>tput</STRONG> from the standard input
+              instead of from  the  command  line  (see  example).   Only  one
+              <EM>capname</EM>  is allowed per line.  The <STRONG>-S</STRONG> option changes the meaning
+              of the <STRONG>0</STRONG> and <STRONG>1</STRONG> boolean and string exit codes (see the EXIT CODES
+              section).
+
+              Because  some capabilities may use <EM>string</EM> parameters rather than
+              <EM>numbers</EM>, <STRONG>tput</STRONG> uses a table and the presence of parameters in its
+              input  to  decide whether to use <STRONG><A HREF="curs_terminfo.3x.html">tparm(3x)</A></STRONG>, and how to interpret
+              the parameters.
+
+       <STRONG>-T</STRONG><EM>type</EM> indicates  the  <EM>type</EM>  of  terminal.   Normally  this  option  is
+              unnecessary,  because  the default is taken from the environment
+              variable <STRONG>TERM</STRONG>.  If <STRONG>-T</STRONG> is specified,  then  the  shell  variables
+              <STRONG>LINES</STRONG> and <STRONG>COLUMNS</STRONG> will also be ignored.
+
+       <STRONG>-V</STRONG>     reports  the  version of ncurses which was used in this program,
+              and exits.
+
+       <STRONG>-x</STRONG>     do not attempt to clear the terminal's scrollback  buffer  using
+              the extended "E3" capability.
+
+
+</PRE><H3><a name="h3-Commands">Commands</a></H3><PRE>
+       A few commands (<STRONG>init</STRONG>, <STRONG>reset</STRONG> and <STRONG>longname</STRONG>) are special; they are defined
+       by the <STRONG>tput</STRONG> program.  The others are the names of <EM>capabilities</EM> from the
+       terminal  database  (see  <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG>  for  a list).  Although <STRONG>init</STRONG> and
+       <STRONG>reset</STRONG> resemble capability names,  <STRONG>tput</STRONG>  uses  several  capabilities  to
+       perform these special functions.
+
+       <EM>capname</EM>
+              indicates the capability from the terminal database.
+
+              If  the  capability  is  a  string  that  takes  parameters, the
+              arguments following the capability will be  used  as  parameters
+              for the string.
+
+              Most  parameters  are numbers.  Only a few terminal capabilities
+              require string parameters; <STRONG>tput</STRONG> uses a table to decide which  to
+              pass  as  strings.   Normally <STRONG>tput</STRONG> uses <STRONG><A HREF="curs_terminfo.3x.html">tparm(3x)</A></STRONG> to perform the
+              substitution.  If no parameters are given  for  the  capability,
+              <STRONG>tput</STRONG> writes the string without performing the substitution.
+
+       <STRONG>init</STRONG>   If  the terminal database is present and an entry for the user's
+              terminal exists (see <STRONG>-T</STRONG><EM>type</EM>, above), the following will occur:
+
+              (1)  first, <STRONG>tput</STRONG> retrieves the current  terminal  mode  settings
+                   for your terminal.  It does this by successively testing
+
+                   <STRONG>o</STRONG>   the standard error,
+
+                   <STRONG>o</STRONG>   standard output,
+
+                   <STRONG>o</STRONG>   standard input and
+
+                   <STRONG>o</STRONG>   ultimately "/dev/tty"
+
+                   to   obtain  terminal  settings.   Having  retrieved  these
+                   settings, <STRONG>tput</STRONG> remembers which file descriptor to use  when
+                   updating settings.
+
+              (2)  if  the  window  size cannot be obtained from the operating
+                   system, but the terminal description (or environment, e.g.,
+                   <STRONG>LINES</STRONG>  and  <STRONG>COLUMNS</STRONG>  variables  specify  this),  update the
+                   operating system's notion of the window size.
+
+              (3)  the terminal modes will be updated:
+
+                   <STRONG>o</STRONG>   any delays (e.g., newline) specified in the entry  will
+                       be set in the tty driver,
+
+                   <STRONG>o</STRONG>   tabs  expansion  will  be turned on or off according to
+                       the specification in the entry, and
+
+                   <STRONG>o</STRONG>   if tabs are not expanded, standard  tabs  will  be  set
+                       (every 8 spaces).
+
+              (4)  if  present,  the terminal's initialization strings will be
+                   output as detailed in the <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG> section on  <EM>Tabs</EM>  <EM>and</EM>
+                   <EM>Initialization</EM>,
+
+              (5)  output is flushed.
+
+              If  an  entry does not contain the information needed for any of
+              these activities, that activity will silently be skipped.
+
+       <STRONG>reset</STRONG>  This is similar to <STRONG>init</STRONG>, with two differences:
+
+              (1)  before any other initialization, the terminal modes will be
+                   reset to a "sane" state:
+
+                   <STRONG>o</STRONG>   set cooked and echo modes,
+
+                   <STRONG>o</STRONG>   turn off cbreak and raw modes,
+
+                   <STRONG>o</STRONG>   turn on newline translation and
+
+                   <STRONG>o</STRONG>   reset  any  unset  special  characters to their default
+                       values
+
+              (2)  Instead  of  putting  out   <EM>initialization</EM>   strings,   the
+                   terminal's  <EM>reset</EM>  strings  will be output if present (<STRONG>rs1</STRONG>,
+                   <STRONG>rs2</STRONG>, <STRONG>rs3</STRONG>, <STRONG>rf</STRONG>).  If the <EM>reset</EM> strings are not  present,  but
+                   <EM>initialization</EM> strings are, the <EM>initialization</EM> strings will
+                   be output.
+
+              Otherwise, <STRONG>reset</STRONG> acts identically to <STRONG>init</STRONG>.
+
+       <STRONG>longname</STRONG>
+              If the terminal database is present and an entry for the  user's
+              terminal  exists  (see  <STRONG>-T</STRONG><EM>type</EM> above), then the long name of the
+              terminal will be put out.  The long name is the last name in the
+              first  line  of  the  terminal's  description  in  the  <STRONG>terminfo</STRONG>
+              database [see <STRONG><A HREF="term.5.html">term(5)</A></STRONG>].
+
+
+</PRE><H3><a name="h3-Aliases">Aliases</a></H3><PRE>
+       <STRONG>tput</STRONG> handles the <STRONG>clear</STRONG>, <STRONG>init</STRONG> and <STRONG>reset</STRONG> commands  specially:  it  allows
+       for the possibility that it is invoked by a link with those names.
+
+       If  <STRONG>tput</STRONG>  is invoked by a link named <STRONG>reset</STRONG>, this has the same effect as
+       <STRONG>tput</STRONG> <STRONG>reset</STRONG>.  The  <STRONG><A HREF="tset.1.html">tset(1)</A></STRONG>  utility  also  treats  a  link  named  <STRONG>reset</STRONG>
+       specially.
+
+       Before ncurses 6.1, the two utilities were different from each other:
+
+       <STRONG>o</STRONG>   <STRONG>tset</STRONG>  utility  reset the terminal modes and special characters (not
+           done with <STRONG>tput</STRONG>).
+
+       <STRONG>o</STRONG>   On the other hand, <STRONG>tset</STRONG>'s repertoire of terminal  capabilities  for
+           resetting  the terminal was more limited, i.e., only <STRONG>reset_1string</STRONG>,
+           <STRONG>reset_2string</STRONG> and <STRONG>reset_file</STRONG>  in  contrast  to  the  tab-stops  and
+           margins which are set by this utility.
+
+       <STRONG>o</STRONG>   The  <STRONG>reset</STRONG>  program  is  usually an alias for <STRONG>tset</STRONG>, because of this
+           difference with resetting terminal modes and special characters.
+
+       With the changes made for ncurses 6.1, the <EM>reset</EM>  feature  of  the  two
+       programs is (mostly) the same.  A few differences remain:
+
+       <STRONG>o</STRONG>   The  <STRONG>tset</STRONG>  program  waits  one  second  when  resetting, in case it
+           happens to be a hardware terminal.
+
+       <STRONG>o</STRONG>   The two programs  write  the  terminal  initialization  strings  to
+           different  streams  (i.e.,  the  standard  error  for  <STRONG>tset</STRONG> and the
+           standard output for <STRONG>tput</STRONG>).
+
+           <STRONG>Note:</STRONG>  although  these  programs  write   to   different   streams,
+           redirecting  their output to a file will capture only part of their
+           actions.  The changes to the terminal modes  are  not  affected  by
+           redirecting the output.
+
+       If  <STRONG>tput</STRONG>  is  invoked by a link named <STRONG>init</STRONG>, this has the same effect as
+       <STRONG>tput</STRONG> <STRONG>init</STRONG>.  Again, you are less likely to use that link because another
+       program named <STRONG>init</STRONG> has a more well-established use.
+
+
+</PRE><H3><a name="h3-Terminal-Size">Terminal Size</a></H3><PRE>
+       Besides  the  special  commands  (e.g.,  <STRONG>clear</STRONG>),  tput  treats  certain
+       terminfo  capabilities  specially:  <STRONG>lines</STRONG>   and   <STRONG>cols</STRONG>.    tput   calls
+       <STRONG><A HREF="curs_terminfo.3x.html">setupterm(3x)</A></STRONG> to obtain the terminal size:
+
+       <STRONG>o</STRONG>   first, it gets the size from the terminal database (which generally
+           is not provided for terminal emulators which do not  have  a  fixed
+           window size)
+
+       <STRONG>o</STRONG>   then  it  asks  the operating system for the terminal's size (which
+           generally works, unless connecting via a serial line which does not
+           support <EM>NAWS</EM>: negotiations about window size).
+
+       <STRONG>o</STRONG>   finally,  it  inspects  the environment variables <STRONG>LINES</STRONG> and <STRONG>COLUMNS</STRONG>
+           which may override the terminal size.
+
+       If the <STRONG>-T</STRONG> option is given tput ignores  the  environment  variables  by
+       calling   <STRONG>use_tioctl(TRUE)</STRONG>,  relying  upon  the  operating  system  (or
+       finally, the terminal database).
+
+
+</PRE><H2><a name="h2-EXAMPLES">EXAMPLES</a></H2><PRE>
+       <STRONG>tput</STRONG> <STRONG>init</STRONG>
+            Initialize the terminal according to the type of terminal  in  the
+            environmental  variable  <STRONG>TERM</STRONG>.  This command should be included in
+            everyone's .profile after the environmental variable <STRONG>TERM</STRONG> has been
+            exported, as illustrated on the <STRONG>profile(5)</STRONG> manual page.
+
+       <STRONG>tput</STRONG> <STRONG>-T5620</STRONG> <STRONG>reset</STRONG>
+            Reset  an  AT&amp;T  5620 terminal, overriding the type of terminal in
+            the environmental variable <STRONG>TERM</STRONG>.
+
+       <STRONG>tput</STRONG> <STRONG>cup</STRONG> <STRONG>0</STRONG> <STRONG>0</STRONG>
+            Send the sequence to move the cursor to row <STRONG>0</STRONG>, column <STRONG>0</STRONG> (the upper
+            left  corner  of  the  screen,  usually known as the "home" cursor
+            position).
+
+       <STRONG>tput</STRONG> <STRONG>clear</STRONG>
+            Echo the clear-screen sequence for the current terminal.
+
+       <STRONG>tput</STRONG> <STRONG>cols</STRONG>
+            Print the number of columns for the current terminal.
+
+       <STRONG>tput</STRONG> <STRONG>-T450</STRONG> <STRONG>cols</STRONG>
+            Print the number of columns for the 450 terminal.
+
+       <STRONG>bold=`tput</STRONG> <STRONG>smso`</STRONG> <STRONG>offbold=`tput</STRONG> <STRONG>rmso`</STRONG>
+            Set the shell variables <STRONG>bold</STRONG>, to begin  stand-out  mode  sequence,
+            and  <STRONG>offbold</STRONG>,  to  end  standout  mode  sequence,  for the current
+            terminal.  This might be followed by a prompt: <STRONG>echo</STRONG> <STRONG>"${bold}Please</STRONG>
+            <STRONG>type</STRONG> <STRONG>in</STRONG> <STRONG>your</STRONG> <STRONG>name:</STRONG> <STRONG>${offbold}\c"</STRONG>
+
+       <STRONG>tput</STRONG> <STRONG>hc</STRONG>
+            Set  exit  code to indicate if the current terminal is a hard copy
+            terminal.
+
+       <STRONG>tput</STRONG> <STRONG>cup</STRONG> <STRONG>23</STRONG> <STRONG>4</STRONG>
+            Send the sequence to move the cursor to row 23, column 4.
+
+       <STRONG>tput</STRONG> <STRONG>cup</STRONG>
+            Send the terminfo string for cursor-movement, with  no  parameters
+            substituted.
+
+       <STRONG>tput</STRONG> <STRONG>longname</STRONG>
+            Print  the  long  name  from the <STRONG>terminfo</STRONG> database for the type of
+            terminal specified in the environmental variable <STRONG>TERM</STRONG>.
+
+            <STRONG>tput</STRONG> <STRONG>-S</STRONG> <STRONG>&lt;&lt;!</STRONG>
+            <STRONG>&gt;</STRONG> <STRONG>clear</STRONG>
+            <STRONG>&gt;</STRONG> <STRONG>cup</STRONG> <STRONG>10</STRONG> <STRONG>10</STRONG>
+            <STRONG>&gt;</STRONG> <STRONG>bold</STRONG>
+            <STRONG>&gt;</STRONG> <STRONG>!</STRONG>
+
+            This example shows <STRONG>tput</STRONG> processing  several  capabilities  in  one
+            invocation.   It  clears  the screen, moves the cursor to position
+            10, 10 and turns  on  bold  (extra  bright)  mode.   The  list  is
+            terminated by an exclamation mark (<STRONG>!</STRONG>) on a line by itself.
+
+
+</PRE><H2><a name="h2-FILES">FILES</a></H2><PRE>
+       <STRONG>/usr/share/terminfo</STRONG>
+              compiled terminal description database
+
+       <STRONG>/usr/share/tabset/*</STRONG>
+              tab  settings  for some terminals, in a format appropriate to be
+              output to the terminal (escape sequences that  set  margins  and
+              tabs);  for  more  information, see the <EM>Tabs</EM> <EM>and</EM> <EM>Initialization</EM>,
+              section of <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG>
+
+
+</PRE><H2><a name="h2-EXIT-CODES">EXIT CODES</a></H2><PRE>
+       If the <STRONG>-S</STRONG> option is used, <STRONG>tput</STRONG> checks for errors from each line, and if
+       any  errors  are  found, will set the exit code to 4 plus the number of
+       lines with errors.  If no errors are found, the exit  code  is  <STRONG>0</STRONG>.   No
+       indication  of which line failed can be given so exit code <STRONG>1</STRONG> will never
+       appear.  Exit codes <STRONG>2</STRONG>, <STRONG>3</STRONG>, and <STRONG>4</STRONG> retain their usual interpretation.   If
+       the  <STRONG>-S</STRONG>  option  is  not  used,  the  exit  code depends on the type of
+       <EM>capname</EM>:
+
+          <EM>boolean</EM>
+                 a value of <STRONG>0</STRONG> is set for TRUE and <STRONG>1</STRONG> for FALSE.
+
+          <EM>string</EM> a value of <STRONG>0</STRONG> is set  if  the  <EM>capname</EM>  is  defined  for  this
+                 terminal  <EM>type</EM>  (the value of <EM>capname</EM> is returned on standard
+                 output); a value of <STRONG>1</STRONG> is set if <EM>capname</EM> is  not  defined  for
+                 this terminal <EM>type</EM> (nothing is written to standard output).
+
+          <EM>integer</EM>
+                 a value of <STRONG>0</STRONG> is always set, whether or not <EM>capname</EM> is defined
+                 for this terminal <EM>type</EM>.  To determine if <EM>capname</EM>  is  defined
+                 for  this terminal <EM>type</EM>, the user must test the value written
+                 to standard output.  A value of <STRONG>-1</STRONG> means that <EM>capname</EM> is  not
+                 defined for this terminal <EM>type</EM>.
+
+          <EM>other</EM>  <STRONG>reset</STRONG>  or  <STRONG>init</STRONG>  may fail to find their respective files.  In
+                 that case, the exit code is set to 4 + <STRONG>errno</STRONG>.
+
+       Any other exit code indicates an error; see the DIAGNOSTICS section.
+
+
+</PRE><H2><a name="h2-DIAGNOSTICS">DIAGNOSTICS</a></H2><PRE>
+       <STRONG>tput</STRONG> prints the following error messages  and  sets  the  corresponding
+       exit codes.
+
+       exit code   error message
+       ---------------------------------------------------------------------
+       <STRONG>0</STRONG>           (<EM>capname</EM>  is a numeric variable that is not specified in
+                   the <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG> database for this  terminal  type,  e.g.
+                   <STRONG>tput</STRONG> <STRONG>-T450</STRONG> <STRONG>lines</STRONG> and <STRONG>tput</STRONG> <STRONG>-Thp2621</STRONG> <STRONG>xmc</STRONG>)
+       <STRONG>1</STRONG>           no error message is printed, see the <STRONG>EXIT</STRONG> <STRONG>CODES</STRONG> section.
+       <STRONG>2</STRONG>           usage error
+       <STRONG>3</STRONG>           unknown terminal <EM>type</EM> or no <STRONG>terminfo</STRONG> database
+       <STRONG>4</STRONG>           unknown <STRONG>terminfo</STRONG> capability <EM>capname</EM>
+       <STRONG>&gt;4</STRONG>          error occurred in -S
+       ---------------------------------------------------------------------
+
+
+</PRE><H2><a name="h2-HISTORY">HISTORY</a></H2><PRE>
+       The  <STRONG>tput</STRONG>  command  was begun by Bill Joy in 1980.  The initial version
+       only cleared the screen.
+
+       AT&amp;T System V provided a different <STRONG>tput</STRONG> command:
+
+       <STRONG>o</STRONG>   SVr2 provided  a  rudimentary  <STRONG>tput</STRONG>  which  checked  the  parameter
+           against  each  predefined capability and returned the corresponding
+           value.  This  version  of  <STRONG>tput</STRONG>  did  not  use  <STRONG><A HREF="curs_terminfo.3x.html">tparm(3x)</A></STRONG>  for  the
+           capabilities which are parameterized.
+
+       <STRONG>o</STRONG>   SVr3 replaced that, a year later, by a more extensive program whose
+           <STRONG>init</STRONG> and <STRONG>reset</STRONG>  subcommands  (more  than  half  the  program)  were
+           incorporated  from  the  <STRONG>reset</STRONG>  feature of BSD <STRONG>tset</STRONG> written by Eric
+           Allman.
+
+       <STRONG>o</STRONG>   SVr4 added color initialization using the <STRONG>orig_colors</STRONG> and <STRONG>orig_pair</STRONG>
+           capabilities in the <STRONG>init</STRONG> subcommand.
+
+       Keith  Bostic  replaced  the  BSD  <STRONG>tput</STRONG>  command  in  1989  with  a new
+       implementation based on the AT&amp;T System V program <STRONG>tput</STRONG>.  Like the  AT&amp;T
+       program,  Bostic's  version accepted some parameters named for <EM>terminfo</EM>
+       capabilities (<STRONG>clear</STRONG>, <STRONG>init</STRONG>, <STRONG>longname</STRONG> and <STRONG>reset</STRONG>).   However  (because  he
+       had  only  <EM>termcap</EM>  available),  it  accepted  <EM>termcap</EM>  names for other
+       capabilities.  Also, Bostic's BSD <STRONG>tput</STRONG> did not modify the terminal  I/O
+       modes as the earlier BSD <STRONG>tset</STRONG> had done.
+
+       At the same time, Bostic added a shell script named "clear", which used
+       <STRONG>tput</STRONG> to clear the screen.
+
+       Both  of  these  appeared  in  4.4BSD,  becoming   the   "modern"   BSD
+       implementation of <STRONG>tput</STRONG>.
+
+       This  implementation of <STRONG>tput</STRONG> began from a different source than AT&amp;T or
+       BSD: Ross Ridge's <EM>mytinfo</EM> package, published  on  <EM>comp.sources.unix</EM>  in
+       December  1992.   Ridge's  program  made  more sophisticated use of the
+       terminal capabilities than the BSD program.   Eric  Raymond  used  that
+       <STRONG>tput</STRONG>  program  (and  other  parts  of <EM>mytinfo</EM>) in ncurses in June 1995.
+       Using the portions dealing with terminal  capabilities  almost  without
+       change,   Raymond   made  improvements  to  the  way  the  command-line
+       parameters were handled.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       This implementation of <STRONG>tput</STRONG> differs from AT&amp;T  <STRONG>tput</STRONG>  in  two  important
+       areas:
+
+       <STRONG>o</STRONG>   <STRONG>tput</STRONG>  <EM>capname</EM>  writes  to  the standard output.  That need not be a
+           regular  terminal.   However,  the  subcommands  which   manipulate
+           terminal modes may not use the standard output.
+
+           The  AT&amp;T  implementation's  <STRONG>init</STRONG>  and  <STRONG>reset</STRONG>  commands use the BSD
+           (4.1c)  <STRONG>tset</STRONG>  source,  which  manipulates   terminal   modes.    It
+           successively  tries standard output, standard error, standard input
+           before falling back to "/dev/tty" and finally just assumes a 1200Bd
+           terminal.  When updating terminal modes, it ignores errors.
+
+           Until  changes made after ncurses 6.0, <STRONG>tput</STRONG> did not modify terminal
+           modes.  <STRONG>tput</STRONG> now uses a similar scheme, using functions shared with
+           <STRONG>tset</STRONG>  (and ultimately based on the 4.4BSD <STRONG>tset</STRONG>).  If it is not able
+           to open a terminal, e.g., when running in <STRONG>cron(1)</STRONG>, <STRONG>tput</STRONG> will return
+           an error.
+
+       <STRONG>o</STRONG>   AT&amp;T <STRONG>tput</STRONG> guesses the type of its <EM>capname</EM> operands by seeing if all
+           of the characters are numeric, or not.
+
+           Most implementations which provide support for <EM>capname</EM> operands use
+           the  <STRONG>tparm</STRONG>  function  to  expand  parameters  in it.  That function
+           expects a mixture of numeric and string parameters, requiring  <STRONG>tput</STRONG>
+           to know which type to use.
+
+           This  implementation  uses a table to determine the parameter types
+           for the standard <EM>capname</EM> operands, and an internal library function
+           to analyze nonstandard <EM>capname</EM> operands.
+
+           Besides  providing  more  reliable operation than AT&amp;T's utility, a
+           portability problem is introduced  by  this  analysis:  An  OpenBSD
+           developer  adapted  the  internal  library function from ncurses to
+           port NetBSD's  termcap-based  <STRONG>tput</STRONG>  to  terminfo.   That  had  been
+           modified  to  interpret  multiple  commands  on  a  line.  Portable
+           applications should not rely upon this feature; ncurses provides it
+           to support applications written specifically for OpenBSD.
+
+       This  implementation  (unlike  others)  can  accept  both  <EM>termcap</EM>  and
+       <EM>terminfo</EM> names for the <EM>capname</EM> feature, if <EM>termcap</EM> support is  compiled
+       in.   However,  the  predefined  <EM>termcap</EM>  and  <EM>terminfo</EM>  names have two
+       ambiguities in this case (and the <EM>terminfo</EM> name is assumed):
+
+       <STRONG>o</STRONG>   The <EM>termcap</EM> name <STRONG>dl</STRONG> corresponds to the <EM>terminfo</EM>  name  <STRONG>dl1</STRONG>  (delete
+           one line).
+           The  <EM>terminfo</EM>  name <STRONG>dl</STRONG> corresponds to the <EM>termcap</EM> name <STRONG>DL</STRONG> (delete a
+           given number of lines).
+
+       <STRONG>o</STRONG>   The <EM>termcap</EM> name <STRONG>ed</STRONG> corresponds to  the  <EM>terminfo</EM>  name  <STRONG>rmdc</STRONG>  (end
+           delete mode).
+           The  <EM>terminfo</EM>  name <STRONG>ed</STRONG> corresponds to the <EM>termcap</EM> name <STRONG>cd</STRONG> (clear to
+           end of screen).
+
+       The <STRONG>longname</STRONG> and <STRONG>-S</STRONG> options, and  the  parameter-substitution  features
+       used  in  the  <STRONG>cup</STRONG>  example,  were  not  supported in BSD curses before
+       4.3reno (1989) or in AT&amp;T/USL curses before SVr4 (1988).
+
+       IEEE  Std  1003.1/The  Open  Group    Base   Specifications   Issue   7
+       (POSIX.1-2008)  documents  only the operands for <STRONG>clear</STRONG>, <STRONG>init</STRONG> and <STRONG>reset</STRONG>.
+       There are a few interesting observations to make regarding that:
+
+       <STRONG>o</STRONG>   In this implementation, <STRONG>clear</STRONG> is part of the <EM>capname</EM> support.   The
+           others   (<STRONG>init</STRONG>   and   <STRONG>longname</STRONG>)  do  not  correspond  to  terminal
+           capabilities.
+
+       <STRONG>o</STRONG>   Other  implementations  of  <STRONG>tput</STRONG>  on  SVr4-based  systems  such  as
+           Solaris,  IRIX64  and  HPUX as well as others such as AIX and Tru64
+           provide support for <EM>capname</EM> operands.
+
+       <STRONG>o</STRONG>   A few platforms such as FreeBSD recognize termcap names rather than
+           terminfo capability names in their respective <STRONG>tput</STRONG> commands.  Since
+           2010, NetBSD's <STRONG>tput</STRONG> uses terminfo names.   Before  that,  it  (like
+           FreeBSD) recognized termcap names.
+
+           Beginning  in  2021,  FreeBSD uses the ncurses <STRONG>tput</STRONG>, configured for
+           both terminfo (tested first) and termcap (as a fallback).
+
+       Because (apparently) <EM>all</EM> of the certified Unix systems support the full
+       set  of  capability names, the reasoning for documenting only a few may
+       not be apparent.
+
+       <STRONG>o</STRONG>   X/Open Curses Issue 7 documents <STRONG>tput</STRONG> differently, with <EM>capname</EM>  and
+           the other features used in this implementation.
+
+       <STRONG>o</STRONG>   That  is,  there  are  two standards for <STRONG>tput</STRONG>: POSIX (a subset) and
+           X/Open Curses (the full implementation).  POSIX documents a  subset
+           to  avoid  the  complication  of  including  X/Open  Curses and the
+           terminal capabilities database.
+
+       <STRONG>o</STRONG>   While it is certainly possible to  write  a  <STRONG>tput</STRONG>  program  without
+           using   curses,   none   of   the   systems  which  have  a  curses
+           implementation provide a <STRONG>tput</STRONG> utility which does  not  provide  the
+           <EM>capname</EM> feature.
+
+       X/Open  Curses  Issue  7  (2009)  is  the  first  version  to  document
+       utilities.  However that part of X/Open Curses does not follow existing
+       practice (i.e., Unix features documented in SVID 3):
+
+       <STRONG>o</STRONG>   It  assigns exit code 4 to "invalid operand", which may be the same
+           as <EM>unknown</EM> <EM>capability</EM>.  For instance, the source code for  Solaris'
+           xcurses uses the term "invalid" in this case.
+
+       <STRONG>o</STRONG>   It  assigns  exit  code  255  to  a  numeric  variable  that is not
+           specified in the terminfo database.  That likely is a documentation
+           error,  confusing  the  <STRONG>-1</STRONG>  written  to  the standard output for an
+           absent or cancelled numeric value versus an (unsigned) exit code.
+
+       The various Unix systems (AIX, HPUX, Solaris) use the  same  exit-codes
+       as ncurses.
+
+       NetBSD curses documents different exit codes which do not correspond to
+       either ncurses or X/Open.
+
+
+</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 20221231).
+
+
+
+                                                                       <STRONG><A HREF="tput.1.html">tput(1)</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-Options">Options</a></li>
+<li><a href="#h3-Commands">Commands</a></li>
+<li><a href="#h3-Aliases">Aliases</a></li>
+<li><a href="#h3-Terminal-Size">Terminal Size</a></li>
+</ul>
+</li>
+<li><a href="#h2-EXAMPLES">EXAMPLES</a></li>
+<li><a href="#h2-FILES">FILES</a></li>
+<li><a href="#h2-EXIT-CODES">EXIT CODES</a></li>
+<li><a href="#h2-DIAGNOSTICS">DIAGNOSTICS</a></li>
+<li><a href="#h2-HISTORY">HISTORY</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/tset.1.html b/doc/html/man/tset.1.html
new file mode 100644
index 0000000..c610a8c
--- /dev/null
+++ b/doc/html/man/tset.1.html
@@ -0,0 +1,421 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2016,2017 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: tset.1,v 1.62 2022/02/12 20:02:20 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>tset 1</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">tset 1</H1>
+<PRE>
+<STRONG><A HREF="tset.1.html">tset(1)</A></STRONG>                     General Commands Manual                    <STRONG><A HREF="tset.1.html">tset(1)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>tset</STRONG>, <STRONG>reset</STRONG> - terminal initialization
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>tset</STRONG> [<STRONG>-IQVcqrsw</STRONG>] [<STRONG>-</STRONG>] [<STRONG>-e</STRONG> <EM>ch</EM>] [<STRONG>-i</STRONG> <EM>ch</EM>] [<STRONG>-k</STRONG> <EM>ch</EM>] [<STRONG>-m</STRONG> <EM>mapping</EM>] [<EM>terminal</EM>]
+       <STRONG>reset</STRONG> [<STRONG>-IQVcqrsw</STRONG>] [<STRONG>-</STRONG>] [<STRONG>-e</STRONG> <EM>ch</EM>] [<STRONG>-i</STRONG> <EM>ch</EM>] [<STRONG>-k</STRONG> <EM>ch</EM>] [<STRONG>-m</STRONG> <EM>mapping</EM>] [<EM>terminal</EM>]
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+
+</PRE><H3><a name="h3-tset---initialization">tset - initialization</a></H3><PRE>
+       This program initializes terminals.
+
+       First,  <STRONG>tset</STRONG>  retrieves  the  current  terminal  mode settings for your
+       terminal.  It does this by successively testing
+
+       <STRONG>o</STRONG>   the standard error,
+
+       <STRONG>o</STRONG>   standard output,
+
+       <STRONG>o</STRONG>   standard input and
+
+       <STRONG>o</STRONG>   ultimately "/dev/tty"
+
+       to obtain terminal settings.  Having  retrieved  these  settings,  <STRONG>tset</STRONG>
+       remembers which file descriptor to use when updating settings.
+
+       Next,  <STRONG>tset</STRONG>  determines  the type of terminal that you are using.  This
+       determination is done as follows, using the first terminal type found.
+
+       1. The <STRONG>terminal</STRONG> argument specified on the command line.
+
+       2. The value of the <STRONG>TERM</STRONG> environmental variable.
+
+       3. (BSD systems only.) The terminal type associated with  the  standard
+       error  output  device  in the <EM>/etc/ttys</EM> file.  (On System-V-like UNIXes
+       and systems using that convention, <STRONG>getty(1)</STRONG> does this  job  by  setting
+       <STRONG>TERM</STRONG> according to the type passed to it by <EM>/etc/inittab</EM>.)
+
+       4. The default terminal type, "unknown".
+
+       If  the  terminal  type  was  not specified on the command-line, the <STRONG>-m</STRONG>
+       option mappings are then applied (see the section <STRONG>TERMINAL</STRONG> <STRONG>TYPE</STRONG> <STRONG>MAPPING</STRONG>
+       for  more  information).   Then,  if  the  terminal  type begins with a
+       question mark ("?"), the user  is  prompted  for  confirmation  of  the
+       terminal  type.   An empty response confirms the type, or, another type
+       can be entered to specify a new type.  Once the terminal type has  been
+       determined, the terminal description for the terminal is retrieved.  If
+       no terminal description is found for the type, the user is prompted for
+       another terminal type.
+
+       Once the terminal description is retrieved,
+
+       <STRONG>o</STRONG>   if  the  "<STRONG>-w</STRONG>"  option  is  enabled,  <STRONG>tset</STRONG> may update the terminal's
+           window size.
+
+           If the window size cannot be obtained from  the  operating  system,
+           but  the  terminal  description  (or  environment,  e.g., <STRONG>LINES</STRONG> and
+           <STRONG>COLUMNS</STRONG> variables specify this), use  this  to  set  the  operating
+           system's notion of the window size.
+
+       <STRONG>o</STRONG>   if  the  "<STRONG>-c</STRONG>"  option is enabled, the backspace, interrupt and line
+           kill characters (among many other things) are set
+
+       <STRONG>o</STRONG>   unless  the  "<STRONG>-I</STRONG>"  option  is  enabled,  the   terminal   and   tab
+           <EM>initialization</EM>  strings  are sent to the standard error output, and
+           <STRONG>tset</STRONG> waits one second (in case a hardware reset was issued).
+
+       <STRONG>o</STRONG>   Finally, if the erase, interrupt  and  line  kill  characters  have
+           changed,  or  are not set to their default values, their values are
+           displayed to the standard error output.
+
+
+</PRE><H3><a name="h3-reset---reinitialization">reset - reinitialization</a></H3><PRE>
+       When invoked as <STRONG>reset</STRONG>, <STRONG>tset</STRONG> sets the terminal modes to "sane" values:
+
+       <STRONG>o</STRONG>   sets cooked and echo modes,
+
+       <STRONG>o</STRONG>   turns off cbreak and raw modes,
+
+       <STRONG>o</STRONG>   turns on newline translation and
+
+       <STRONG>o</STRONG>   resets any unset special characters to their default values
+
+       before doing the terminal initialization described above.  Also, rather
+       than  using  the  terminal <EM>initialization</EM> strings, it uses the terminal
+       <EM>reset</EM> strings.
+
+       The <STRONG>reset</STRONG> command is useful after a program dies leaving a terminal  in
+       an abnormal state:
+
+       <STRONG>o</STRONG>   you may have to type
+
+               <EM>&lt;LF&gt;</EM><STRONG>reset</STRONG><EM>&lt;LF&gt;</EM>
+
+           (the line-feed character is normally control-J) to get the terminal
+           to work, as carriage-return may no  longer  work  in  the  abnormal
+           state.
+
+       <STRONG>o</STRONG>   Also, the terminal will often not echo the command.
+
+
+</PRE><H2><a name="h2-OPTIONS">OPTIONS</a></H2><PRE>
+       The options are as follows:
+
+       <STRONG>-c</STRONG>   Set control characters and modes.
+
+       <STRONG>-e</STRONG> <EM>ch</EM>
+            Set the erase character to <EM>ch</EM>.
+
+       <STRONG>-I</STRONG>   Do  not  send  the  terminal  or tab initialization strings to the
+            terminal.
+
+       <STRONG>-i</STRONG> <EM>ch</EM>
+            Set the interrupt character to <EM>ch</EM>.
+
+       <STRONG>-k</STRONG> <EM>ch</EM>
+            Set the line kill character to <EM>ch</EM>.
+
+       <STRONG>-m</STRONG> <EM>mapping</EM>
+            Specify a mapping from a port type to a terminal.  See the section
+            <STRONG>TERMINAL</STRONG> <STRONG>TYPE</STRONG> <STRONG>MAPPING</STRONG> for more information.
+
+       <STRONG>-Q</STRONG>   Do  not  display any values for the erase, interrupt and line kill
+            characters.   Normally  <STRONG>tset</STRONG>  displays  the  values  for   control
+            characters which differ from the system's default values.
+
+       <STRONG>-q</STRONG>   The  terminal  type  is  displayed to the standard output, and the
+            terminal is not initialized in any way.  The option "-" by  itself
+            is equivalent but archaic.
+
+       <STRONG>-r</STRONG>   Print the terminal type to the standard error output.
+
+       <STRONG>-s</STRONG>   Print the sequence of shell commands to initialize the environment
+            variable <STRONG>TERM</STRONG> to the standard output.  See the section <STRONG>SETTING</STRONG> <STRONG>THE</STRONG>
+            <STRONG>ENVIRONMENT</STRONG> for details.
+
+       <STRONG>-V</STRONG>   reports the version of ncurses which was used in this program, and
+            exits.
+
+       <STRONG>-w</STRONG>   Resize the window to match the  size  deduced  via  <STRONG><A HREF="curs_terminfo.3x.html">setupterm(3x)</A></STRONG>.
+            Normally  this  has  no  effect,  unless  <STRONG>setupterm</STRONG> is not able to
+            detect the window size.
+
+       The arguments for the <STRONG>-e</STRONG>, <STRONG>-i</STRONG>, and <STRONG>-k</STRONG> options may either be  entered  as
+       actual  characters  or by using the "hat" notation, i.e., control-h may
+       be specified as "^H" or "^h".
+
+       If neither <STRONG>-c</STRONG> or <STRONG>-w</STRONG> is given, both options are assumed.
+
+
+</PRE><H2><a name="h2-SETTING-THE-ENVIRONMENT">SETTING THE ENVIRONMENT</a></H2><PRE>
+       It is often desirable to enter the terminal type and information  about
+       the terminal's capabilities into the shell's environment.  This is done
+       using the <STRONG>-s</STRONG> option.
+
+       When the <STRONG>-s</STRONG> option is specified, the commands to enter the  information
+       into  the  shell's  environment are written to the standard output.  If
+       the <STRONG>SHELL</STRONG> environmental variable ends in "csh", the  commands  are  for
+       <STRONG>csh</STRONG>,  otherwise,  they  are  for <STRONG>sh(1)</STRONG>.  Note, the <STRONG>csh</STRONG> commands set and
+       unset the shell variable <STRONG>noglob</STRONG>, leaving it unset.  The following  line
+       in  the  <STRONG>.login</STRONG>  or  <STRONG>.profile</STRONG>  files  will  initialize  the environment
+       correctly:
+
+           eval `tset -s options ... `
+
+
+</PRE><H2><a name="h2-TERMINAL-TYPE-MAPPING">TERMINAL TYPE MAPPING</a></H2><PRE>
+       When the terminal is not hardwired into  the  system  (or  the  current
+       system  information  is  incorrect)  the terminal type derived from the
+       <EM>/etc/ttys</EM> file or the <STRONG>TERM</STRONG> environmental variable  is  often  something
+       generic  like  <STRONG>network</STRONG>,  <STRONG>dialup</STRONG>,  or  <STRONG>unknown</STRONG>.   When <STRONG>tset</STRONG> is used in a
+       startup script it is often desirable to provide information  about  the
+       type of terminal used on such ports.
+
+       The  <STRONG>-m</STRONG>  options  maps  from some set of conditions to a terminal type,
+       that is, to tell <STRONG>tset</STRONG> "If I'm on this port at a particular speed, guess
+       that I'm on that kind of terminal".
+
+       The  argument  to  the  <STRONG>-m</STRONG> option consists of an optional port type, an
+       optional operator, an optional baud  rate  specification,  an  optional
+       colon  (":")  character and a terminal type.  The port type is a string
+       (delimited by  either  the  operator  or  the  colon  character).   The
+       operator  may  be  any combination of "&gt;", "&lt;", "@", and "!"; "&gt;" means
+       greater than, "&lt;" means less than, "@" means equal to and  "!"  inverts
+       the  sense  of the test.  The baud rate is specified as a number and is
+       compared with the speed of the standard error output (which  should  be
+       the control terminal).  The terminal type is a string.
+
+       If  the  terminal  type  is  not  specified on the command line, the <STRONG>-m</STRONG>
+       mappings are applied to the terminal type.  If the port type  and  baud
+       rate  match  the  mapping,  the  terminal type specified in the mapping
+       replaces the current type.  If more than one mapping is specified,  the
+       first applicable mapping is used.
+
+       For  example,  consider  the following mapping: <STRONG>dialup&gt;9600:vt100</STRONG>.  The
+       port type is dialup , the operator is &gt;, the baud rate specification is
+       9600, and the terminal type is vt100.  The result of this mapping is to
+       specify that if the terminal type is  <STRONG>dialup</STRONG>,  and  the  baud  rate  is
+       greater than 9600 baud, a terminal type of <STRONG>vt100</STRONG> will be used.
+
+       If  no  baud  rate  is specified, the terminal type will match any baud
+       rate.  If no port type is specified, the terminal type will  match  any
+       port  type.   For  example,  <STRONG>-m</STRONG>  <STRONG>dialup:vt100</STRONG> <STRONG>-m</STRONG> <STRONG>:?xterm</STRONG> will cause any
+       dialup port, regardless of baud rate, to match the terminal type vt100,
+       and  any non-dialup port type to match the terminal type ?xterm.  Note,
+       because of the leading question mark, the user will  be  queried  on  a
+       default port as to whether they are actually using an xterm terminal.
+
+       No  whitespace  characters  are  permitted  in  the <STRONG>-m</STRONG> option argument.
+       Also, to avoid problems with meta-characters, it is suggested that  the
+       entire <STRONG>-m</STRONG> option argument be placed within single quote characters, and
+       that  <STRONG>csh</STRONG>  users  insert  a  backslash  character  ("\")   before   any
+       exclamation marks ("!").
+
+
+</PRE><H2><a name="h2-HISTORY">HISTORY</a></H2><PRE>
+       A  <STRONG>reset</STRONG> command appeared in 1BSD (March 1978), written by Kurt Shoens.
+       This program set the <EM>erase</EM> and <EM>kill</EM> characters to <STRONG>^H</STRONG> (backspace) and  <STRONG>@</STRONG>
+       respectively.  Mark Horton improved that in 3BSD (October 1979), adding
+       <EM>intr</EM>, <EM>quit</EM>, <EM>start</EM>/<EM>stop</EM> and <EM>eof</EM>  characters  as  well  as  changing  the
+       program  to  avoid  modifying any user settings.  That version of <STRONG>reset</STRONG>
+       did not use the termcap database.
+
+       A separate <STRONG>tset</STRONG> command was provided in 1BSD by Eric Allman, using  the
+       termcap  database.   Allman's comments in the source code indicate that
+       he began work in October 1977, continuing development over the next few
+       years.
+
+       According to comments in the source code, the <STRONG>tset</STRONG> program was modified
+       in September 1980, to use logic copied from the 3BSD  "reset"  when  it
+       was invoked as <STRONG>reset</STRONG>.  This version appeared in 4.1cBSD, late in 1982.
+
+       Other developers (e.g., Keith Bostic and Jim Bloom) continued to modify
+       <STRONG>tset</STRONG> until 4.4BSD was released in 1993.
+
+       The <STRONG>ncurses</STRONG> implementation was lightly adapted from the 4.4BSD  sources
+       for a terminfo environment by Eric S. Raymond &lt;esr@snark.thyrsus.com&gt;.
+
+
+</PRE><H2><a name="h2-COMPATIBILITY">COMPATIBILITY</a></H2><PRE>
+       Neither  IEEE  Std  1003.1/The  Open  Group Base Specifications Issue 7
+       (POSIX.1-2008) nor X/Open Curses Issue 7 documents <STRONG>tset</STRONG> or <STRONG>reset</STRONG>.
+
+       The AT&amp;T <STRONG>tput</STRONG> utility (AIX, HPUX, Solaris) incorporated  the  terminal-
+       mode  manipulation  as well as termcap-based features such as resetting
+       tabstops from <STRONG>tset</STRONG> in BSD (4.1c),  presumably  with  the  intention  of
+       making  <STRONG>tset</STRONG>  obsolete.   However, each of those systems still provides
+       <STRONG>tset</STRONG>.  In fact, the commonly-used <STRONG>reset</STRONG> utility is always an alias  for
+       <STRONG>tset</STRONG>.
+
+       The   <STRONG>tset</STRONG>   utility   provides  for  backward-compatibility  with  BSD
+       environments (under most modern UNIXes, <STRONG>/etc/inittab</STRONG> and  <STRONG>getty(1)</STRONG>  can
+       set  <STRONG>TERM</STRONG>  appropriately  for each dial-up line; this obviates what was
+       <STRONG>tset</STRONG>'s most important use).  This implementation  behaves  like  4.4BSD
+       <STRONG>tset</STRONG>, with a few exceptions specified here.
+
+       A  few  options are different because the <STRONG>TERMCAP</STRONG> variable is no longer
+       supported under terminfo-based <STRONG>ncurses</STRONG>:
+
+       <STRONG>o</STRONG>   The <STRONG>-S</STRONG> option of BSD <STRONG>tset</STRONG> no  longer  works;  it  prints  an  error
+           message to the standard error and dies.
+
+       <STRONG>o</STRONG>   The <STRONG>-s</STRONG> option only sets <STRONG>TERM</STRONG>, not <STRONG>TERMCAP</STRONG>.
+
+       There  was an undocumented 4.4BSD feature that invoking <STRONG>tset</STRONG> via a link
+       named "TSET" (or via  any  other  name  beginning  with  an  upper-case
+       letter) set the terminal to use upper-case only.  This feature has been
+       omitted.
+
+       The <STRONG>-A</STRONG>, <STRONG>-E</STRONG>, <STRONG>-h</STRONG>, <STRONG>-u</STRONG> and <STRONG>-v</STRONG> options were deleted from the <STRONG>tset</STRONG> utility in
+       4.4BSD.   None of them were documented in 4.3BSD and all are of limited
+       utility at best.   The  <STRONG>-a</STRONG>,  <STRONG>-d</STRONG>,  and  <STRONG>-p</STRONG>  options  are  similarly  not
+       documented  or  useful,  but  were  retained  as  they  appear to be in
+       widespread use.  It is strongly recommended that  any  usage  of  these
+       three options be changed to use the <STRONG>-m</STRONG> option instead.  The <STRONG>-a</STRONG>, <STRONG>-d</STRONG>, and
+       <STRONG>-p</STRONG> options are therefore omitted from the usage summary above.
+
+       Very old systems, e.g., 3BSD, used a different  terminal  driver  which
+       was  replaced  in  4BSD in the early 1980s.  To accommodate these older
+       systems, the 4BSD <STRONG>tset</STRONG> provided a <STRONG>-n</STRONG> option to  specify  that  the  new
+       terminal  driver  should be used.  This implementation does not provide
+       that choice.
+
+       It is still permissible to specify the <STRONG>-e</STRONG>, <STRONG>-i</STRONG>, and <STRONG>-k</STRONG>  options  without
+       arguments, although it is strongly recommended that such usage be fixed
+       to explicitly specify the character.
+
+       As of 4.4BSD, executing <STRONG>tset</STRONG> as <STRONG>reset</STRONG> no longer implies the <STRONG>-Q</STRONG>  option.
+       Also, the interaction between the - option and the <EM>terminal</EM> argument in
+       some historic implementations of <STRONG>tset</STRONG> has been removed.
+
+       The <STRONG>-c</STRONG> and  <STRONG>-w</STRONG>  options  are  not  found  in  earlier  implementations.
+       However, a different window size-change feature was provided in 4.4BSD.
+
+       <STRONG>o</STRONG>   In  4.4BSD,  <STRONG>tset</STRONG> uses the window size from the termcap description
+           to set the window size if <STRONG>tset</STRONG> is not able  to  obtain  the  window
+           size from the operating system.
+
+       <STRONG>o</STRONG>   In ncurses, <STRONG>tset</STRONG> obtains the window size using <STRONG>setupterm</STRONG>, which may
+           be from the operating system, the  <STRONG>LINES</STRONG>  and  <STRONG>COLUMNS</STRONG>  environment
+           variables or the terminal description.
+
+       Obtaining  the  window  size from the terminal description is common to
+       both implementations, but considered obsolescent.  Its  only  practical
+       use is for hardware terminals.  Generally speaking, a window size would
+       be unset only if there were some problem obtaining the value  from  the
+       operating  system  (and  <STRONG>setupterm</STRONG> would still fail).  For that reason,
+       the <STRONG>LINES</STRONG> and <STRONG>COLUMNS</STRONG> environment variables may be useful  for  working
+       around  window-size  problems.   Those  have  the  drawback that if the
+       window is resized, those variables must be recomputed  and  reassigned.
+       To do this more easily, use the <STRONG>resize(1)</STRONG> program.
+
+
+</PRE><H2><a name="h2-ENVIRONMENT">ENVIRONMENT</a></H2><PRE>
+       The <STRONG>tset</STRONG> command uses these environment variables:
+
+       SHELL
+            tells  <STRONG>tset</STRONG>  whether  to  initialize  <STRONG>TERM</STRONG>  using  <STRONG>sh(1)</STRONG> or <STRONG>csh(1)</STRONG>
+            syntax.
+
+       TERM Denotes your terminal  type.   Each  terminal  type  is  distinct,
+            though many are similar.
+
+       TERMCAP
+            may  denote  the  location of a termcap database.  If it is not an
+            absolute pathname, e.g., begins  with  a  "/",  <STRONG>tset</STRONG>  removes  the
+            variable  from  the  environment  before  looking for the terminal
+            description.
+
+
+</PRE><H2><a name="h2-FILES">FILES</a></H2><PRE>
+       /etc/ttys
+            system port name to terminal type mapping database  (BSD  versions
+            only).
+
+       /usr/share/terminfo
+            terminal capability database
+
+
+</PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
+       <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 20221231).
+
+
+
+                                                                       <STRONG><A HREF="tset.1.html">tset(1)</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-tset---initialization">tset - initialization</a></li>
+<li><a href="#h3-reset---reinitialization">reset - reinitialization</a></li>
+</ul>
+</li>
+<li><a href="#h2-OPTIONS">OPTIONS</a></li>
+<li><a href="#h2-SETTING-THE-ENVIRONMENT">SETTING THE ENVIRONMENT</a></li>
+<li><a href="#h2-TERMINAL-TYPE-MAPPING">TERMINAL TYPE MAPPING</a></li>
+<li><a href="#h2-HISTORY">HISTORY</a></li>
+<li><a href="#h2-COMPATIBILITY">COMPATIBILITY</a></li>
+<li><a href="#h2-ENVIRONMENT">ENVIRONMENT</a></li>
+<li><a href="#h2-FILES">FILES</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/user_caps.5.html b/doc/html/man/user_caps.5.html
new file mode 100644
index 0000000..d99c539
--- /dev/null
+++ b/doc/html/man/user_caps.5.html
@@ -0,0 +1,415 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 2017 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: user_caps.5,v 1.22 2022/07/03 20:01:04 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>user_caps 5</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">user_caps 5</H1>
+<PRE>
+<STRONG><A HREF="user_caps.5.html">user_caps(5)</A></STRONG>                  File Formats Manual                 <STRONG><A HREF="user_caps.5.html">user_caps(5)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       user_caps - user-defined terminfo capabilities
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>tic</STRONG> <STRONG>-x,</STRONG> <STRONG>infocmp</STRONG> <STRONG>-x</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+
+</PRE><H3><a name="h3-Background">Background</a></H3><PRE>
+       Before  ncurses  5.0,  terminfo  databases  used  a <EM>fixed</EM> <EM>repertoire</EM> of
+       terminal capabilities designed for the SVr2 terminal database in  1984,
+       and  extended  in  stages  through SVr4 (1989), and standardized in the
+       Single Unix Specification beginning in 1995.
+
+       Most of the <EM>extensions</EM> in this fixed repertoire were additions  to  the
+       tables of boolean, numeric and string capabilities.  Rather than change
+       the meaning of an existing capability,  a  new  name  was  added.   The
+       terminfo  database  uses  a  binary  format;  binary  compatibility was
+       ensured by using a header which gave the number of items in the  tables
+       for each type of capability.  The standardization was incomplete:
+
+       <STRONG>o</STRONG>   The  <EM>binary</EM>  <EM>format</EM>  itself  is  not described in the X/Open Curses
+           documentation.  Only the <EM>source</EM> <EM>format</EM> is described.
+
+           Library developers rely upon the SVr4 documentation,  and  reverse-
+           engineering the compiled terminfo files to match the binary format.
+
+       <STRONG>o</STRONG>   Lacking a standard for the binary format, most implementations copy
+           the SVr2 binary format, which uses 16-bit signed integers,  and  is
+           limited to 4096-byte entries.
+
+           The  format  cannot  represent very large numeric capabilities, nor
+           can it represent large numbers of special keyboard definitions.
+
+       <STRONG>o</STRONG>   The tables of capability names differ between implementations.
+
+           Although they <EM>may</EM> provide all of the standard capability names, the
+           position  in the tables differs because some features were added as
+           needed, while others were added  (out  of  order)  to  comply  with
+           X/Open Curses.
+
+           While  ncurses' repertoire of predefined capabilities is closest to
+           Solaris, Solaris's terminfo database has a few differences from the
+           list  published  by  X/Open  Curses.   For  example, ncurses can be
+           configured with tables which match the terminal databases for  AIX,
+           HP-UX or OSF/1, rather than the default Solaris-like configuration.
+
+       <STRONG>o</STRONG>   In  SVr4  curses  and  ncurses, the terminal database is defined at
+           compile-time using a text file which lists the  different  terminal
+           capabilities.
+
+           In  principle,  the  text-file  can  be  extended,  but  doing this
+           requires recompiling and reinstalling the library.   The  text-file
+           used  in  ncurses  for  terminal  capabilities includes details for
+           various systems past the documented X/Open  Curses  features.   For
+           example, ncurses supports these capabilities in each configuration:
+
+               memory_lock
+                    (meml) lock memory above cursor
+
+               memory_unlock
+                    (memu) unlock memory
+
+               box_chars_1
+                    (box1) box characters primary set
+
+           The memory lock/unlock capabilities were included because they were
+           used in the X11R6 terminal  description  for  <STRONG>xterm(1)</STRONG>.   The  <EM>box1</EM>
+           capability  is  used  in  tic  to  help  with terminal descriptions
+           written for AIX.
+
+       During the 1990s, some users were reluctant to use terminfo in spite of
+       its performance advantages over termcap:
+
+       <STRONG>o</STRONG>   The  fixed  repertoire  prevented  users  from  adding features for
+           unanticipated terminal improvements  (or  required  them  to  reuse
+           existing capabilities as a workaround).
+
+       <STRONG>o</STRONG>   The  limitation  to  16-bit  signed  integers  was  also mentioned.
+           Because termcap stores everything as a string, it  could  represent
+           larger numbers.
+
+       Although  termcap's  extensibility  was  rarely  used (it was never the
+       <EM>speaker</EM> who had actually used the feature), the criticism had a  point.
+       ncurses   5.0  provided  a  way  to  detect  nonstandard  capabilities,
+       determine their type and optionally store and retrieve them  in  a  way
+       which did not interfere with other applications.  These are referred to
+       as <EM>user-defined</EM> <EM>capabilities</EM> because no modifications to the  toolset's
+       predefined capability names are needed.
+
+       The  ncurses  utilities <STRONG>tic</STRONG> and <STRONG>infocmp</STRONG> have a command-line option "-x"
+       to  control  whether  the  nonstandard  capabilities  are   stored   or
+       retrieved.   A  library function <STRONG>use_extended_names</STRONG> is provided for the
+       same purpose.
+
+       When compiling a terminal database, if "-x" is set, <STRONG>tic</STRONG>  will  store  a
+       user-defined  capability  if  the  capability  name  is  not one of the
+       predefined names.
+
+       Because ncurses provides  a  termcap  library  interface,  these  user-
+       defined capabilities may be visible to termcap applications:
+
+       <STRONG>o</STRONG>   The   termcap  interface  (like  all  implementations  of  termcap)
+           requires that the capability names are 2-characters.
+
+           When  the  capability  is  simple  enough  for  use  in  a  termcap
+           application, it is provided as a 2-character name.
+
+       <STRONG>o</STRONG>   There  are  other user-defined capabilities which refer to features
+           not usable in termcap, e.g., parameterized strings  that  use  more
+           than two parameters or use more than the trivial expression support
+           provided by termcap.  For these, the terminfo database should  have
+           only capability names with 3 or more characters.
+
+       <STRONG>o</STRONG>   Some terminals can send distinct strings for special keys (cursor-,
+           keypad-  or  function-keys)  depending  on  modifier  keys  (shift,
+           control,  etc.).   While  terminfo  and  termcap  have  a set of 60
+           predefined function-key names, to which a series  of  keys  can  be
+           assigned,   that  is  insufficient  for  more  than  a  dozen  keys
+           multiplied by more than a couple  of  modifier  combinations.   The
+           ncurses  database  uses  a  convention based on <STRONG>xterm(1)</STRONG> to provide
+           extended special-key names.
+
+           Fitting that into termcap's limitation of 2-character  names  would
+           be   pointless.   These  extended  keys  are  available  only  with
+           terminfo.
+
+
+</PRE><H3><a name="h3-Recognized-capabilities">Recognized capabilities</a></H3><PRE>
+       The ncurses library uses the user-definable  capabilities.   While  the
+       terminfo  database  may  have  other extensions, ncurses makes explicit
+       checks for these:
+
+          AX <EM>boolean</EM>, asserts that the terminal interprets SGR 39 and  SGR  49
+             by  resetting  the foreground and background color, respectively,
+             to the default.
+
+             This is a feature recognized by the <STRONG>screen</STRONG> program as well.
+
+          E3 <EM>string</EM>, tells how to  clear  the  terminal's  scrollback  buffer.
+             When present, the <STRONG><A HREF="clear.1.html">clear(1)</A></STRONG> program sends this before clearing the
+             terminal.
+
+             The command "<STRONG>tput</STRONG> <STRONG>clear</STRONG>" does the same thing.
+
+          NQ used to suppress a consistency  check  in  tic  for  the  ncurses
+             capabilities  in  user6  through  user9 (u6, u7, u8 and u9) which
+             tell how to query the terminal's cursor position and  its  device
+             attributes.
+
+          RGB
+             <EM>boolean</EM>,   <EM>number</EM>   <STRONG>or</STRONG>   <EM>string</EM>,   used   to   assert   that  the
+             <STRONG>set_a_foreground</STRONG> and <STRONG>set_a_background</STRONG> capabilities correspond  to
+             <EM>direct</EM>  <EM>colors</EM>,  using  an RGB (red/green/blue) convention.  This
+             capability  allows   the   <STRONG>color_content</STRONG>   function   to   return
+             appropriate   values   without   requiring   the  application  to
+             initialize colors using <STRONG>init_color</STRONG>.
+
+             The capability type determines the values which ncurses sees:
+
+             <EM>boolean</EM>
+                implies that the number of bits for red, green  and  blue  are
+                the  same.   Using  the maximum number of colors, ncurses adds
+                two, divides that sum by three, and assigns the result to red,
+                green and blue in that order.
+
+                If the number of bits needed for the number of colors is not a
+                multiple of three, the blue (and  green)  components  lose  in
+                comparison to red.
+
+             <EM>number</EM>
+                tells  ncurses  what result to add to red, green and blue.  If
+                ncurses runs out of bits, blue (and green) lose just as in the
+                <EM>boolean</EM> case.
+
+             <EM>string</EM>
+                explicitly  list  the  number  of bits used for red, green and
+                blue components as a slash-separated list of decimal integers.
+
+             Because there are several  RGB  encodings  in  use,  applications
+             which  make  assumptions  about  the number of bits per color are
+             unlikely to work reliably.  As a trivial case, for  example,  one
+             could  define  <STRONG>RGB#1</STRONG> to represent the standard eight ANSI colors,
+             i.e., one bit per color.
+
+          U8 <EM>number</EM>, asserts that ncurses must use Unicode  values  for  line-
+             drawing  characters,  and  that  it  should  ignore the alternate
+             character set capabilities when the locale uses  UTF-8  encoding.
+             For  more  information, see the discussion of <STRONG>NCURSES_NO_UTF8_ACS</STRONG>
+             in <STRONG><A HREF="ncurses.3x.html">ncurses(3x)</A></STRONG>.
+
+             Set this capability to a nonzero value to enable it.
+
+          XM <EM>string</EM>, override ncurses's built-in string which enables/disables
+             <STRONG>xterm(1)</STRONG> mouse mode.
+
+             ncurses  sends a character sequence to the terminal to initialize
+             mouse mode, and when the user clicks the  mouse  buttons  or  (in
+             certain  modes) moves the mouse, handles the characters sent back
+             by the terminal to tell it what was done with the mouse.
+
+             The mouse protocol  is  enabled  when  the  <EM>mask</EM>  passed  in  the
+             <STRONG>mousemask</STRONG>  function  is nonzero.  By default, ncurses handles the
+             responses for the X11 xterm mouse protocol.  It also knows  about
+             the  <EM>SGR</EM>  <EM>1006</EM>  xterm mouse protocol, but must to be told to look
+             for this specifically.  It will not be able to guess  which  mode
+             is  used,  because  the  responses  are  enough  alike  that only
+             confusion would result.
+
+             The <STRONG>XM</STRONG> capability has a single parameter.  If nonzero, the  mouse
+             protocol  should  be enabled.  If zero, the mouse protocol should
+             be disabled.  ncurses inspects this capability if it is  present,
+             to  see whether the 1006 protocol is used.  If so, it expects the
+             responses to use the <EM>SGR</EM> <EM>1006</EM> xterm mouse protocol.
+
+             The xterm mouse protocol is used  by  other  terminal  emulators.
+             The  terminal database uses building-blocks for the various xterm
+             mouse  protocols  which  can  be  used  in  customized   terminal
+             descriptions.
+
+             The terminal database building blocks for this mouse feature also
+             have  an  experimental  capability  <EM>xm</EM>.   The   "xm"   capability
+             describes  the mouse response.  Currently there is no interpreter
+             which would use  this  information  to  make  the  mouse  support
+             completely data-driven.
+
+             <EM>xm</EM> shows the format of the mouse responses.  In this experimental
+             capability, the parameters are
+
+               <EM>p1</EM>   y-ordinate
+
+               <EM>p2</EM>   x-ordinate
+
+               <EM>p3</EM>   button
+
+               <EM>p4</EM>   state, e.g., pressed or released
+
+               <EM>p5</EM>   y-ordinate starting region
+
+               <EM>p6</EM>   x-ordinate starting region
+
+               <EM>p7</EM>   y-ordinate ending region
+
+               <EM>p8</EM>   x-ordinate ending region
+
+             Here are  examples  from  the  terminal  database  for  the  most
+             commonly used xterm mouse protocols:
+
+               xterm+x11mouse|X11 xterm mouse protocol,
+                       kmous=\E[M, XM=\E[?1000%?%p1%{1}%=%th%el%;,
+                       xm=\E[M
+                          %?%p4%t%p3%e%{3}%;%' '%+%c
+                          %p2%'!'%+%c
+                          %p1%'!'%+%c,
+
+               xterm+sm+1006|xterm SGR-mouse,
+                       kmous=\E[&lt;, XM=\E[?1006;1000%?%p1%{1}%=%th%el%;,
+                       xm=\E[&lt;%i%p3%d;
+                          %p1%d;
+                          %p2%d;
+                          %?%p4%tM%em%;,
+
+
+</PRE><H3><a name="h3-Extended-key-definitions">Extended key-definitions</a></H3><PRE>
+       Several  terminals  provide  the  ability  to send distinct strings for
+       combinations of modified special keys.  There is no standard  for  what
+       those keys can send.
+
+       Since  1999,  <STRONG>xterm(1)</STRONG>  has  supported  <EM>shift</EM>,  <EM>control</EM>,  <EM>alt</EM>, and <EM>meta</EM>
+       modifiers which produce distinct special-key strings.   In  a  terminal
+       description,  ncurses  has  no special knowledge of the modifiers used.
+       Applications can use the <EM>naming</EM> <EM>convention</EM>  established  for  <STRONG>xterm</STRONG>  to
+       find these special keys in the terminal description.
+
+       Starting  with  the curses convention that <EM>key</EM> <EM>names</EM> begin with "k" and
+       that shifted special keys are  an  uppercase  name,  ncurses'  terminal
+       database defines these names to which a suffix is added:
+
+            <STRONG>Name</STRONG>   <STRONG>Description</STRONG>
+            ---------------------------------------------------------------
+            kDC    special form of kdch1 (delete character)
+            kDN    special form of kcud1 (cursor down)
+            kEND   special form of kend (End)
+            kHOM   special form of khome (Home)
+            kLFT   special form of kcub1 (cursor-left or cursor-back)
+            kNXT   special form of knext (Next, or Page-Down)
+            kPRV   special form of kprev (Prev, or Page-Up)
+            kRIT   special form of kcuf1 (cursor-right, or cursor-forward)
+            kUP    special form of kcuu1 (cursor-up)
+
+       These are the suffixes used to denote the modifiers:
+
+            <STRONG>Value</STRONG>   <STRONG>Description</STRONG>
+            ----------------------------------
+            2       Shift
+            3       Alt
+            4       Shift + Alt
+            5       Control
+            6       Shift + Control
+            7       Alt + Control
+            8       Shift + Alt + Control
+            9       Meta
+            10      Meta + Shift
+            11      Meta + Alt
+            12      Meta + Alt + Shift
+            13      Meta + Ctrl
+            14      Meta + Ctrl + Shift
+            15      Meta + Ctrl + Alt
+            16      Meta + Ctrl + Alt + Shift
+
+       None  of these are predefined; terminal descriptions can refer to <EM>names</EM>
+       which ncurses will allocate at runtime to <EM>key-codes</EM>.  To use these keys
+       in an ncurses program, an application could do this:
+
+       <STRONG>o</STRONG>   using  a  list  of  extended  key <EM>names</EM>, ask <STRONG><A HREF="curs_terminfo.3x.html">tigetstr(3x)</A></STRONG> for their
+           values, and
+
+       <STRONG>o</STRONG>   given the list of values,  ask  <STRONG><A HREF="key_defined.3x.html">key_defined(3x)</A></STRONG>  for  the  <EM>key-code</EM>
+           which would be returned for those keys by <STRONG><A HREF="curs_getch.3x.html">wgetch(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       The  "-x"  extension  feature  of  <STRONG>tic</STRONG>  and <STRONG>infocmp</STRONG> has been adopted in
+       NetBSD curses.  That implementation stores  user-defined  capabilities,
+       but makes no use of these capabilities itself.
+
+
+</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>.
+
+       The  terminal  database  section  <EM>NCURSES</EM>  <EM>USER-DEFINABLE</EM>  <EM>CAPABILITIES</EM>
+       summarizes commonly-used user-defined capabilities which  are  used  in
+       the  terminal  descriptions.   Some  of those features are mentioned in
+       <STRONG>screen(1)</STRONG> or <STRONG>tmux(1)</STRONG>.
+
+       <EM>XTerm</EM> <EM>Control</EM> <EM>Sequences</EM> provides further information  on  the  <STRONG>xterm(1)</STRONG>
+       features which are used in these extended capabilities.
+
+
+</PRE><H2><a name="h2-AUTHORS">AUTHORS</a></H2><PRE>
+       Thomas E. Dickey
+       beginning with ncurses 5.0 (1999)
+
+
+
+                                                                  <STRONG><A HREF="user_caps.5.html">user_caps(5)</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-Background">Background</a></li>
+<li><a href="#h3-Recognized-capabilities">Recognized capabilities</a></li>
+<li><a href="#h3-Extended-key-definitions">Extended key-definitions</a></li>
+</ul>
+</li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-AUTHORS">AUTHORS</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/man/wresize.3x.html b/doc/html/man/wresize.3x.html
new file mode 100644
index 0000000..905a292
--- /dev/null
+++ b/doc/html/man/wresize.3x.html
@@ -0,0 +1,113 @@
+<!--
+  ****************************************************************************
+  * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+  * Copyright 1998-2010,2015 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.                                                           *
+  ****************************************************************************
+  * Author: Thomas E. Dickey 1996
+  * @Id: wresize.3x,v 1.20 2022/02/12 20:07:29 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 https://invisible-island.net/scripts/readme.html#others_scripts">
+<TITLE>wresize 3x</TITLE>
+<link rel="author" href="mailto:bug-ncurses@gnu.org">
+
+</HEAD>
+<BODY>
+<H1 class="no-header">wresize 3x</H1>
+<PRE>
+<STRONG><A HREF="wresize.3x.html">wresize(3x)</A></STRONG>                                                        <STRONG><A HREF="wresize.3x.html">wresize(3x)</A></STRONG>
+
+
+
+
+</PRE><H2><a name="h2-NAME">NAME</a></H2><PRE>
+       <STRONG>wresize</STRONG> - resize a curses window
+
+
+</PRE><H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
+       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
+
+       <STRONG>int</STRONG> <STRONG>wresize(WINDOW</STRONG> <STRONG>*</STRONG><EM>win</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>lines</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>columns</EM><STRONG>);</STRONG>
+
+
+</PRE><H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
+       This is an extension to the curses library.  It reallocates storage for
+       an <STRONG>ncurses</STRONG> window to adjust its dimensions to the specified values.  If
+       either  dimension  is larger than the current values, the window's data
+       is filled with blanks that have the current  background  rendition  (as
+       set by <STRONG>wbkgdset</STRONG>) merged into them.
+
+
+</PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
+       The  function  returns  the integer <STRONG>ERR</STRONG> upon failure and <STRONG>OK</STRONG> on success.
+       It will fail if either of the dimensions less than or equal to zero, or
+       if an error occurs while (re)allocating memory for the window.
+
+
+</PRE><H2><a name="h2-NOTES">NOTES</a></H2><PRE>
+       The  only  restriction placed on the dimensions is that they be greater
+       than zero.  The dimensions are not compared to <STRONG>curses</STRONG> screen dimensions
+       to  simplify  the logic of <STRONG>resizeterm</STRONG>.  The caller must ensure that the
+       window's dimensions fit within the actual screen dimensions.
+
+
+</PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
+       It is not possible to resize windows with SVr4 curses.
+
+       This extension of ncurses was introduced in mid-1995.  It  was  adopted
+       in NetBSD curses (2001) and PDCurses (2003).
+
+
+</PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
+       <STRONG><A HREF="resizeterm.3x.html">resizeterm(3x)</A></STRONG>.
+
+
+</PRE><H2><a name="h2-AUTHOR">AUTHOR</a></H2><PRE>
+       Thomas  Dickey  (from  an  equivalent  function written in 1988 for BSD
+       curses).
+
+
+
+                                                                   <STRONG><A HREF="wresize.3x.html">wresize(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></li>
+<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
+<li><a href="#h2-NOTES">NOTES</a></li>
+<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
+<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
+<li><a href="#h2-AUTHOR">AUTHOR</a></li>
+</ul>
+</div>
+</BODY>
+</HTML>
diff --git a/doc/html/ncurses-intro.html b/doc/html/ncurses-intro.html
new file mode 100644
index 0000000..1948502
--- /dev/null
+++ b/doc/html/ncurses-intro.html
@@ -0,0 +1,3390 @@
+<!--
+  $Id: ncurses-intro.html,v 1.57 2022/11/26 19:33:46 tom Exp $
+  ****************************************************************************
+  * Copyright 2019-2020,2022 Thomas E. Dickey                                *
+  * Copyright 2000-2013,2017 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.                                                           *
+  ****************************************************************************
+-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+  <meta name="generator" content=
+  "HTML Tidy for HTML5 for Linux version 5.6.0">
+  <title>Writing Programs with NCURSES</title>
+  <link rel="author" href="mailto:bugs-ncurses@gnu.org">
+  <meta http-equiv="Content-Type" content=
+  "text/html; charset=us-ascii">
+</head>
+<body>
+  <h1 class="no-header">Writing Programs with NCURSES</h1>
+
+  <h2>Writing Programs with NCURSES</h2>
+
+  <blockquote>
+    by Eric S. Raymond and Zeyd M. Ben-Halim<br>
+    updates since release 1.9.9e by Thomas Dickey
+  </blockquote>
+
+  <div class="nav">
+    <h2>Contents</h2>
+
+    <ul>
+      <li>
+        <a href="#introduction">Introduction</a>
+        <ul>
+          <li><a href="#history">A Brief History of Curses</a></li>
+
+          <li><a href="#scope">Scope of This Document</a></li>
+
+          <li><a href="#terminology">Terminology</a></li>
+        </ul>
+      </li>
+
+      <li>
+        <a href="#curses">The Curses Library</a>
+        <ul>
+          <li>
+            <a href="#overview">An Overview of Curses</a>
+            <ul>
+              <li><a href="#compiling">Compiling Programs using
+              Curses</a></li>
+
+              <li><a href="#updating">Updating the Screen</a></li>
+
+              <li><a href="#stdscr">Standard Windows and Function
+              Naming Conventions</a></li>
+
+              <li><a href="#variables">Variables</a></li>
+            </ul>
+          </li>
+
+          <li>
+            <a href="#using">Using the Library</a>
+            <ul>
+              <li><a href="#starting">Starting up</a></li>
+
+              <li><a href="#output">Output</a></li>
+
+              <li><a href="#input">Input</a></li>
+
+              <li><a href="#formschars">Using Forms Characters</a></li>
+
+              <li><a href="#attributes">Character Attributes and
+              Color</a></li>
+
+              <li><a href="#mouse">Mouse Interfacing</a></li>
+
+              <li><a href="#finishing">Finishing Up</a></li>
+            </ul>
+          </li>
+
+          <li>
+            <a href="#functions">Function Descriptions</a>
+            <ul>
+              <li><a href="#init">Initialization and Wrapup</a></li>
+
+              <li><a href="#flush">Causing Output to the
+              Terminal</a></li>
+
+              <li><a href="#lowlevel">Low-Level Capability
+              Access</a></li>
+
+              <li><a href="#debugging">Debugging</a></li>
+            </ul>
+          </li>
+
+          <li>
+            <a href="#hints">Hints, Tips, and Tricks</a>
+            <ul>
+              <li><a href="#caution">Some Notes of Caution</a></li>
+
+              <li><a href="#leaving">Temporarily Leaving ncurses
+              Mode</a></li>
+
+              <li><a href="#xterm">Using <code>ncurses</code> under
+              <code>xterm</code></a></li>
+
+              <li><a href="#screens">Handling Multiple Terminal
+              Screens</a></li>
+
+              <li><a href="#testing">Testing for Terminal
+              Capabilities</a></li>
+
+              <li><a href="#tuning">Tuning for Speed</a></li>
+
+              <li><a href="#special">Special Features of
+              <code>ncurses</code></a></li>
+            </ul>
+          </li>
+
+          <li>
+            <a href="#compat">Compatibility with Older Versions</a>
+            <ul>
+              <li><a href="#refbug">Refresh of Overlapping
+              Windows</a></li>
+
+              <li><a href="#backbug">Background Erase</a></li>
+            </ul>
+          </li>
+
+          <li><a href="#xsifuncs">XSI Curses Conformance</a></li>
+        </ul>
+      </li>
+
+      <li>
+        <a href="#panels">The Panels Library</a>
+        <ul>
+          <li><a href="#pcompile">Compiling With the Panels
+          Library</a></li>
+
+          <li><a href="#poverview">Overview of Panels</a></li>
+
+          <li><a href="#pstdscr">Panels, Input, and the Standard
+          Screen</a></li>
+
+          <li><a href="#hiding">Hiding Panels</a></li>
+
+          <li><a href="#pmisc">Miscellaneous Other Facilities</a></li>
+        </ul>
+      </li>
+
+      <li>
+        <a href="#menu">The Menu Library</a>
+        <ul>
+          <li><a href="#mcompile">Compiling with the menu
+          Library</a></li>
+
+          <li><a href="#moverview">Overview of Menus</a></li>
+
+          <li><a href="#mselect">Selecting items</a></li>
+
+          <li><a href="#mdisplay">Menu Display</a></li>
+
+          <li><a href="#mwindows">Menu Windows</a></li>
+
+          <li><a href="#minput">Processing Menu Input</a></li>
+
+          <li><a href="#mmisc">Miscellaneous Other Features</a></li>
+        </ul>
+      </li>
+
+      <li>
+        <a href="#form">The Forms Library</a>
+        <ul>
+          <li><a href="#fcompile">Compiling with the forms
+          Library</a></li>
+
+          <li><a href="#foverview">Overview of Forms</a></li>
+
+          <li><a href="#fcreate">Creating and Freeing Fields and
+          Forms</a></li>
+
+          <li>
+            <a href="#fattributes">Fetching and Changing Field
+            Attributes</a>
+            <ul>
+              <li><a href="#fsizes">Fetching Size and Location
+              Data</a></li>
+
+              <li><a href="#flocation">Changing the Field
+              Location</a></li>
+
+              <li><a href="#fjust">The Justification Attribute</a></li>
+
+              <li><a href="#fdispatts">Field Display Attributes</a></li>
+
+              <li><a href="#foptions">Field Option Bits</a></li>
+
+              <li><a href="#fstatus">Field Status</a></li>
+
+              <li><a href="#fuser">Field User Pointer</a></li>
+            </ul>
+          </li>
+
+          <li><a href="#fdynamic">Variable-Sized Fields</a></li>
+
+          <li>
+            <a href="#fvalidation">Field Validation</a>
+            <ul>
+              <li><a href="#ftype_alpha">TYPE_ALPHA</a></li>
+
+              <li><a href="#ftype_alnum">TYPE_ALNUM</a></li>
+
+              <li><a href="#ftype_enum">TYPE_ENUM</a></li>
+
+              <li><a href="#ftype_integer">TYPE_INTEGER</a></li>
+
+              <li><a href="#ftype_numeric">TYPE_NUMERIC</a></li>
+
+              <li><a href="#ftype_regexp">TYPE_REGEXP</a></li>
+            </ul>
+          </li>
+
+          <li><a href="#fbuffer">Direct Field Buffer
+          Manipulation</a></li>
+
+          <li><a href="#formattrs">Attributes of Forms</a></li>
+
+          <li><a href="#fdisplay">Control of Form Display</a></li>
+
+          <li>
+            <a href="#fdriver">Input Processing in the Forms
+            Driver</a>
+            <ul>
+              <li><a href="#fpage">Page Navigation Requests</a></li>
+
+              <li><a href="#ffield">Inter-Field Navigation
+              Requests</a></li>
+
+              <li><a href="#fifield">Intra-Field Navigation
+              Requests</a></li>
+
+              <li><a href="#fscroll">Scrolling Requests</a></li>
+
+              <li><a href="#fedit">Field Editing Requests</a></li>
+
+              <li><a href="#forder">Order Requests</a></li>
+
+              <li><a href="#fappcmds">Application Commands</a></li>
+            </ul>
+          </li>
+
+          <li><a href="#fhooks">Field Change Hooks</a></li>
+
+          <li><a href="#ffocus">Field Change Commands</a></li>
+
+          <li><a href="#frmoptions">Form Options</a></li>
+
+          <li>
+            <a href="#fcustom">Custom Validation Types</a>
+            <ul>
+              <li><a href="#flinktypes">Union Types</a></li>
+
+              <li><a href="#fnewtypes">New Field Types</a></li>
+
+              <li><a href="#fcheckargs">Validation Function
+              Arguments</a></li>
+
+              <li><a href="#fcustorder">Order Functions For Custom
+              Types</a></li>
+
+              <li><a href="#fcustprobs">Avoiding Problems</a></li>
+            </ul>
+          </li>
+        </ul>
+      </li>
+    </ul>
+  </div>
+
+  <hr>
+
+  <h2><a name="introduction" id="introduction">Introduction</a></h2>
+
+  <p>This document is an introduction to programming with
+  <code>curses</code>. It is not an exhaustive reference for the
+  curses Application Programming Interface (API); that role is
+  filled by the <code>curses</code> manual pages. Rather, it is
+  intended to help C programmers ease into using the package.</p>
+
+  <p>This document is aimed at C applications programmers not yet
+  specifically familiar with ncurses. If you are already an
+  experienced <code>curses</code> programmer, you should
+  nevertheless read the sections on <a href="#mouse">Mouse
+  Interfacing</a>, <a href="#debugging">Debugging</a>, <a href=
+  "#compat">Compatibility with Older Versions</a>, and <a href=
+  "#hints">Hints, Tips, and Tricks</a>. These will bring you up to
+  speed on the special features and quirks of the
+  <code>ncurses</code> implementation. If you are not so
+  experienced, keep reading.</p>
+
+  <p>The <code>curses</code> package is a subroutine library for
+  terminal-independent screen-painting and input-event handling
+  which presents a high level screen model to the programmer,
+  hiding differences between terminal types and doing automatic
+  optimization of output to change one screen full of text into
+  another. <code>Curses</code> uses terminfo, which is a database
+  format that can describe the capabilities of thousands of
+  different terminals.</p>
+
+  <p>The <code>curses</code> API may seem something of an archaism
+  on UNIX desktops increasingly dominated by X, Motif, and Tcl/Tk.
+  Nevertheless, UNIX still supports tty lines and X supports
+  <em>xterm(1)</em>; the <code>curses</code> API has the advantage
+  of (a) back-portability to character-cell terminals, and (b)
+  simplicity. For an application that does not require bit-mapped
+  graphics and multiple fonts, an interface implementation using
+  <code>curses</code> will typically be a great deal simpler and
+  less expensive than one using an X toolkit.</p>
+
+  <h3><a name="history" id="history">A Brief History of Curses</a></h3>
+
+  <p>Historically, the first ancestor of <code>curses</code> was
+  the routines written to provide screen-handling for the
+  <code>vi</code> editor; these used the <code>termcap</code>
+  database facility (both released in 3BSD) for describing terminal
+  capabilities. These routines were abstracted into a documented
+  library and first released with the early BSD UNIX versions. All
+  of this work was done by students at the University of California
+  (Berkeley campus). The curses library was first published in
+  4.0BSD, a year after 3BSD (i.e., late 1980).</p>
+
+  <p>After graduation, one of those students went to work at
+  AT&amp;T Bell Labs, and made an improved <code>termcap</code>
+  library called <code>terminfo</code> (i.e.,
+  &ldquo;libterm&rdquo;), and adapted the curses library to use
+  this. That was subsequently released in System V Release 2 (early
+  1984). Thereafter, other developers added to the curses and
+  terminfo libraries. For instance, a student at Cornell University
+  wrote an improved terminfo library as well as a tool
+  (<code>tic</code>) to compile the terminal descriptions. As a
+  general rule, AT&amp;T did not identify the developers in the
+  source-code or documentation; the <code>tic</code> and
+  <code>infocmp</code> programs are the exceptions.</p>
+
+  <p>System V Release 3 (System III UNIX) from Bell Labs featured a
+  rewritten and much-improved <code>curses</code> library, along
+  with the <code>tic</code> program (late 1986).</p>
+
+  <p>To recap, terminfo is based on Berkeley's termcap database,
+  but contains a number of improvements and extensions.
+  Parameterized capabilities strings were introduced, making it
+  possible to describe multiple video attributes, and colors and to
+  handle far more unusual terminals than possible with termcap. In
+  the later AT&amp;T System V releases, <code>curses</code> evolved
+  to use more facilities and offer more capabilities, going far
+  beyond BSD curses in power and flexibility.</p>
+
+  <h3><a name="scope" id="scope">Scope of This Document</a></h3>
+
+  <p>This document describes <code>ncurses</code>, a free
+  implementation of the System V <code>curses</code> API with some
+  clearly marked extensions. It includes the following System V
+  curses features:</p>
+
+  <ul>
+    <li>Support for multiple screen highlights (BSD curses could
+    only handle one &ldquo;standout&rdquo; highlight, usually
+    reverse-video).</li>
+
+    <li>Support for line- and box-drawing using forms
+    characters.</li>
+
+    <li>Recognition of function keys on input.</li>
+
+    <li>Color support.</li>
+
+    <li>Support for pads (windows of larger than screen size on
+    which the screen or a subwindow defines a viewport).</li>
+  </ul>
+
+  <p>Also, this package makes use of the insert and delete line and
+  character features of terminals so equipped, and determines how
+  to optimally use these features with no help from the programmer.
+  It allows arbitrary combinations of video attributes to be
+  displayed, even on terminals that leave &ldquo;magic
+  cookies&rdquo; on the screen to mark changes in attributes.</p>
+
+  <p>The <code>ncurses</code> package can also capture and use
+  event reports from a mouse in some environments (notably, xterm
+  under the X window system). This document includes tips for using
+  the mouse.</p>
+
+  <p>The <code>ncurses</code> package was originated by Pavel
+  Curtis. The original maintainer of this package is <a href=
+  "mailto:zmbenhal@netcom.com">Zeyd Ben-Halim</a>
+  &lt;zmbenhal@netcom.com&gt;. <a href=
+  "mailto:esr@snark.thyrsus.com">Eric S. Raymond</a>
+  &lt;esr@snark.thyrsus.com&gt; wrote many of the new features in
+  versions after 1.8.1 and wrote most of this introduction.
+  J&uuml;rgen Pfeifer wrote all of the menu and forms code as well
+  as the <a href="http://www.adahome.com">Ada95</a> binding.
+  Ongoing work is being done by <a href=
+  "mailto:dickey@invisible-island.net">Thomas Dickey</a>
+  (maintainer). Contact the current maintainers at <a href=
+  "mailto:bug-ncurses@gnu.org">bug-ncurses@gnu.org</a>.</p>
+
+  <p>This document also describes the <a href="#panels">panels</a>
+  extension library, similarly modeled on the SVr4 panels facility.
+  This library allows you to associate backing store with each of a
+  stack or deck of overlapping windows, and provides operations for
+  moving windows around in the stack that change their visibility
+  in the natural way (handling window overlaps).</p>
+
+  <p>Finally, this document describes in detail the <a href=
+  "#menu">menus</a> and <a href="#form">forms</a> extension
+  libraries, also cloned from System V, which support easy
+  construction and sequences of menus and fill-in forms.</p>
+
+  <h3><a name="terminology" id="terminology">Terminology</a></h3>
+
+  <p>In this document, the following terminology is used with
+  reasonable consistency:</p>
+
+  <dl>
+    <dt>window</dt>
+
+    <dd>A data structure describing a sub-rectangle of the screen
+    (possibly the entire screen). You can write to a window as
+    though it were a miniature screen, scrolling independently of
+    other windows on the physical screen.</dd>
+
+    <dt>screens</dt>
+
+    <dd>A subset of windows which are as large as the terminal
+    screen, i.e., they start at the upper left hand corner and
+    encompass the lower right hand corner. One of these,
+    <code>stdscr</code>, is automatically provided for the
+    programmer.</dd>
+
+    <dt>terminal screen</dt>
+
+    <dd>The package's idea of what the terminal display currently
+    looks like, i.e., what the user sees now. This is a special
+    screen.</dd>
+  </dl>
+
+  <h2><a name="curses" id="curses">The Curses Library</a></h2>
+
+  <h3><a name="overview" id="overview">An Overview of Curses</a></h3>
+
+  <h4><a name="compiling" id="compiling">Compiling Programs using
+  Curses</a></h4>
+
+  <p>In order to use the library, it is necessary to have certain
+  types and variables defined. Therefore, the programmer must have
+  a line:</p>
+
+  <pre class="code-block">
+          #include &lt;curses.h&gt;
+</pre>
+  <p>at the top of the program source. The screen package uses the
+  Standard I/O library, so <code>&lt;curses.h&gt;</code> includes
+  <code>&lt;stdio.h&gt;</code>. <code>&lt;curses.h&gt;</code> also
+  includes <code>&lt;termios.h&gt;</code>,
+  <code>&lt;termio.h&gt;</code>, or <code>&lt;sgtty.h&gt;</code>
+  depending on your system. It is redundant (but harmless) for the
+  programmer to do these includes, too. In linking with
+  <code>curses</code> you need to have <code>-lncurses</code> in
+  your LDFLAGS or on the command line. There is no need for any
+  other libraries.</p>
+
+  <h4><a name="updating" id="updating">Updating the Screen</a></h4>
+
+  <p>In order to update the screen optimally, it is necessary for
+  the routines to know what the screen currently looks like and
+  what the programmer wants it to look like next. For this purpose,
+  a data type (structure) named WINDOW is defined which describes a
+  window image to the routines, including its starting position on
+  the screen (the (y, x) coordinates of the upper left hand corner)
+  and its size. One of these (called <code>curscr</code>, for
+  current screen) is a screen image of what the terminal currently
+  looks like. Another screen (called <code>stdscr</code>, for
+  standard screen) is provided by default to make changes on.</p>
+
+  <p>A window is a purely internal representation. It is used to
+  build and store a potential image of a portion of the terminal.
+  It does not bear any necessary relation to what is really on the
+  terminal screen; it is more like a scratchpad or write
+  buffer.</p>
+
+  <p>To make the section of physical screen corresponding to a
+  window reflect the contents of the window structure, the routine
+  <code>refresh()</code> (or <code>wrefresh()</code> if the window
+  is not <code>stdscr</code>) is called.</p>
+
+  <p>A given physical screen section may be within the scope of any
+  number of overlapping windows. Also, changes can be made to
+  windows in any order, without regard to motion efficiency. Then,
+  at will, the programmer can effectively say &ldquo;make it look
+  like this,&rdquo; and let the package implementation determine
+  the most efficient way to repaint the screen.</p>
+
+  <h4><a name="stdscr" id="stdscr">Standard Windows and Function
+  Naming Conventions</a></h4>
+
+  <p>As hinted above, the routines can use several windows, but two
+  are automatically given: <code>curscr</code>, which knows what
+  the terminal looks like, and <code>stdscr</code>, which is what
+  the programmer wants the terminal to look like next. The user
+  should never actually access <code>curscr</code> directly.
+  Changes should be made to through the API, and then the routine
+  <code>refresh()</code> (or <code>wrefresh()</code>) called.</p>
+
+  <p>Many functions are defined to use <code>stdscr</code> as a
+  default screen. For example, to add a character to
+  <code>stdscr</code>, one calls <code>addch()</code> with the
+  desired character as argument. To write to a different window.
+  use the routine <code>waddch()</code> (for
+  <strong>w</strong>indow-specific addch()) is provided. This
+  convention of prepending function names with a &ldquo;w&rdquo;
+  when they are to be applied to specific windows is consistent.
+  The only routines which do not follow it are those for which a
+  window must always be specified.</p>
+
+  <p>In order to move the current (y, x) coordinates from one point
+  to another, the routines <code>move()</code> and
+  <code>wmove()</code> are provided. However, it is often desirable
+  to first move and then perform some I/O operation. In order to
+  avoid clumsiness, most I/O routines can be preceded by the prefix
+  &ldquo;mv&rdquo; and the desired (y, x) coordinates prepended to
+  the arguments to the function. For example, the calls</p>
+
+  <pre class="code-block">
+          move(y, x);
+          addch(ch);
+</pre>
+  <p>can be replaced by</p>
+
+  <pre class="code-block">
+          mvaddch(y, x, ch);
+</pre>
+  <p>and</p>
+
+  <pre class="code-block">
+          wmove(win, y, x);
+          waddch(win, ch);
+</pre>
+  <p>can be replaced by</p>
+
+  <pre class="code-block">
+          mvwaddch(win, y, x, ch);
+</pre>
+  <p>Note that the window description pointer (win) comes before
+  the added (y, x) coordinates. If a function requires a window
+  pointer, it is always the first parameter passed.</p>
+
+  <h4><a name="variables" id="variables">Variables</a></h4>
+
+  <p>The <code>curses</code> library sets some variables describing
+  the terminal capabilities.</p>
+
+  <pre class="code-block">
+      type   name      description
+      ------------------------------------------------------------------
+      int    LINES     number of lines on the terminal
+      int    COLS      number of columns on the terminal
+</pre>
+  <p>The <code>curses.h</code> also introduces some
+  <code>#define</code> constants and types of general
+  usefulness:</p>
+
+  <dl>
+    <dt><code>bool</code>
+    </dt>
+
+    <dd>boolean type, actually a &ldquo;char&rdquo; (e.g.,
+    <code>bool doneit;</code>)</dd>
+
+    <dt><code>TRUE</code>
+    </dt>
+
+    <dd>boolean &ldquo;true&rdquo; flag (1).</dd>
+
+    <dt><code>FALSE</code>
+    </dt>
+
+    <dd>boolean &ldquo;false&rdquo; flag (0).</dd>
+
+    <dt><code>ERR</code>
+    </dt>
+
+    <dd>error flag returned by routines on a failure (-1).</dd>
+
+    <dt><code>OK</code>
+    </dt>
+
+    <dd>error flag returned by routines when things go right.</dd>
+  </dl>
+
+  <h3><a name="using" id="using">Using the Library</a></h3>
+
+  <p>Now we describe how to actually use the screen package. In it,
+  we assume all updating, reading, etc. is applied to
+  <code>stdscr</code>. These instructions will work on any window,
+  providing you change the function names and parameters as
+  mentioned above.</p>
+
+  <p>Here is a sample program to motivate the discussion:</p>
+
+  <pre class="code-block">
+#include &lt;stdlib.h&gt;
+#include &lt;curses.h&gt;
+#include &lt;signal.h&gt;
+
+static void finish(int sig);
+
+int
+main(int argc, char *argv[])
+{
+    int num = 0;
+
+    /* initialize your non-curses data structures here */
+
+    (void) signal(SIGINT, finish);      /* arrange interrupts to terminate */
+
+    (void) initscr();      /* initialize the curses library */
+    keypad(stdscr, TRUE);  /* enable keyboard mapping */
+    (void) nonl();         /* tell curses not to do NL-&gt;CR/NL on output */
+    (void) cbreak();       /* take input chars one at a time, no wait for \n */
+    (void) echo();         /* echo input - in color */
+
+    if (has_colors())
+    {
+        start_color();
+
+        /*
+         * Simple color assignment, often all we need.  Color pair 0 cannot
+         * be redefined.  This example uses the same value for the color
+         * pair as for the foreground color, though of course that is not
+         * necessary:
+         */
+        init_pair(1, COLOR_RED,     COLOR_BLACK);
+        init_pair(2, COLOR_GREEN,   COLOR_BLACK);
+        init_pair(3, COLOR_YELLOW,  COLOR_BLACK);
+        init_pair(4, COLOR_BLUE,    COLOR_BLACK);
+        init_pair(5, COLOR_CYAN,    COLOR_BLACK);
+        init_pair(6, COLOR_MAGENTA, COLOR_BLACK);
+        init_pair(7, COLOR_WHITE,   COLOR_BLACK);
+    }
+
+    for (;;)
+    {
+        int c = getch();     /* refresh, accept single keystroke of input */
+        attrset(COLOR_PAIR(num % 8));
+        num++;
+
+        /* process the command keystroke */
+    }
+
+    finish(0);               /* we are done */
+}
+
+static void finish(int sig)
+{
+    endwin();
+
+    /* do your non-curses wrapup here */
+
+    exit(0);
+}
+</pre>
+  <h4><a name="starting" id="starting">Starting up</a></h4>
+
+  <p>In order to use the screen package, the routines must know
+  about terminal characteristics, and the space for
+  <code>curscr</code> and <code>stdscr</code> must be allocated.
+  These function <code>initscr()</code> does both these things.
+  Since it must allocate space for the windows, it can overflow
+  memory when attempting to do so. On the rare occasions this
+  happens, <code>initscr()</code> will terminate the program with
+  an error message. <code>initscr()</code> must always be called
+  before any of the routines which affect windows are used. If it
+  is not, the program will core dump as soon as either
+  <code>curscr</code> or <code>stdscr</code> are referenced.
+  However, it is usually best to wait to call it until after you
+  are sure you will need it, like after checking for startup
+  errors. Terminal status changing routines like <code>nl()</code>
+  and <code>cbreak()</code> should be called after
+  <code>initscr()</code>.</p>
+
+  <p>Once the screen windows have been allocated, you can set them
+  up for your program. If you want to, say, allow a screen to
+  scroll, use <code>scrollok()</code>. If you want the cursor to be
+  left in place after the last change, use <code>leaveok()</code>.
+  If this is not done, <code>refresh()</code> will move the cursor
+  to the window's current (y, x) coordinates after updating it.</p>
+
+  <p>You can create new windows of your own using the functions
+  <code>newwin()</code>, <code>derwin()</code>, and
+  <code>subwin()</code>. The routine <code>delwin()</code> will
+  allow you to get rid of old windows. All the options described
+  above can be applied to any window.</p>
+
+  <h4><a name="output" id="output">Output</a></h4>
+
+  <p>Now that we have set things up, we will want to actually
+  update the terminal. The basic functions used to change what will
+  go on a window are <code>addch()</code> and <code>move()</code>.
+  <code>addch()</code> adds a character at the current (y, x)
+  coordinates. <code>move()</code> changes the current (y, x)
+  coordinates to whatever you want them to be. It returns
+  <code>ERR</code> if you try to move off the window. As mentioned
+  above, you can combine the two into <code>mvaddch()</code> to do
+  both things at once.</p>
+
+  <p>The other output functions, such as <code>addstr()</code> and
+  <code>printw()</code>, all call <code>addch()</code> to add
+  characters to the window.</p>
+
+  <p>After you have put on the window what you want there, when you
+  want the portion of the terminal covered by the window to be made
+  to look like it, you must call <code>refresh()</code>. In order
+  to optimize finding changes, <code>refresh()</code> assumes that
+  any part of the window not changed since the last
+  <code>refresh()</code> of that window has not been changed on the
+  terminal, i.e., that you have not refreshed a portion of the
+  terminal with an overlapping window. If this is not the case, the
+  routine <code>touchwin()</code> is provided to make it look like
+  the entire window has been changed, thus making
+  <code>refresh()</code> check the whole subsection of the terminal
+  for changes.</p>
+
+  <p>If you call <code>wrefresh()</code> with <code>curscr</code>
+  as its argument, it will make the screen look like
+  <code>curscr</code> thinks it looks like. This is useful for
+  implementing a command which would redraw the screen in case it
+  get messed up.</p>
+
+  <h4><a name="input" id="input">Input</a></h4>
+
+  <p>The complementary function to <code>addch()</code> is
+  <code>getch()</code> which, if echo is set, will call
+  <code>addch()</code> to echo the character. Since the screen
+  package needs to know what is on the terminal at all times, if
+  characters are to be echoed, the tty must be in raw or cbreak
+  mode. Since initially the terminal has echoing enabled and is in
+  ordinary &ldquo;cooked&rdquo; mode, one or the other has to
+  changed before calling <code>getch()</code>; otherwise, the
+  program's output will be unpredictable.</p>
+
+  <p>When you need to accept line-oriented input in a window, the
+  functions <code>wgetstr()</code> and friends are available. There
+  is even a <code>wscanw()</code> function that can do
+  <code>scanf()</code>(3)-style multi-field parsing on window
+  input. These pseudo-line-oriented functions turn on echoing while
+  they execute.</p>
+
+  <p>The example code above uses the call <code>keypad(stdscr,
+  TRUE)</code> to enable support for function-key mapping. With
+  this feature, the <code>getch()</code> code watches the input
+  stream for character sequences that correspond to arrow and
+  function keys. These sequences are returned as pseudo-character
+  values. The <code>#define</code> values returned are listed in
+  the <code>curses.h</code> The mapping from sequences to
+  <code>#define</code> values is determined by <code>key_</code>
+  capabilities in the terminal's terminfo entry.</p>
+
+  <h4><a name="formschars" id="formschars">Using Forms
+  Characters</a></h4>
+
+  <p>The <code>addch()</code> function (and some others, including
+  <code>box()</code> and <code>border()</code>) can accept some
+  pseudo-character arguments which are specially defined by
+  <code>ncurses</code>. These are <code>#define</code> values set
+  up in the <code>curses.h</code> header; see there for a complete
+  list (look for the prefix <code>ACS_</code>).</p>
+
+  <p>The most useful of the ACS defines are the forms-drawing
+  characters. You can use these to draw boxes and simple graphs on
+  the screen. If the terminal does not have such characters,
+  <code>curses.h</code> will map them to a recognizable (though
+  ugly) set of ASCII defaults.</p>
+
+  <h4><a name="attributes" id="attributes">Character Attributes and
+  Color</a></h4>
+
+  <p>The <code>ncurses</code> package supports screen highlights
+  including standout, reverse-video, underline, and blink. It also
+  supports color, which is treated as another kind of
+  highlight.</p>
+
+  <p>Highlights are encoded, internally, as high bits of the
+  pseudo-character type (<code>chtype</code>) that
+  <code>curses.h</code> uses to represent the contents of a screen
+  cell. See the <code>curses.h</code> header file for a complete
+  list of highlight mask values (look for the prefix
+  <code>A_</code>).</p>
+
+  <p>There are two ways to make highlights. One is to logical-or
+  the value of the highlights you want into the character argument
+  of an <code>addch()</code> call, or any other output call that
+  takes a <code>chtype</code> argument.</p>
+
+  <p>The other is to set the current-highlight value. This is
+  <em>logical-OR</em>ed with any highlight you specify the first
+  way. You do this with the functions <code>attron()</code>,
+  <code>attroff()</code>, and <code>attrset()</code>; see the
+  manual pages for details. Color is a special kind of highlight.
+  The package actually thinks in terms of color pairs, combinations
+  of foreground and background colors. The sample code above sets
+  up eight color pairs, all of the guaranteed-available colors on
+  black. Note that each color pair is, in effect, given the name of
+  its foreground color. Any other range of eight non-conflicting
+  values could have been used as the first arguments of the
+  <code>init_pair()</code> values.</p>
+
+  <p>Once you have done an <code>init_pair()</code> that creates
+  color-pair N, you can use <code>COLOR_PAIR(N)</code> as a
+  highlight that invokes that particular color combination. Note
+  that <code>COLOR_PAIR(N)</code>, for constant N, is itself a
+  compile-time constant and can be used in initializers.</p>
+
+  <h4><a name="mouse" id="mouse">Mouse Interfacing</a></h4>
+
+  <p>The <code>ncurses</code> library also provides a mouse
+  interface.</p>
+
+  <blockquote>
+    <strong>NOTE:</strong> this facility is specific to
+    <code>ncurses</code>, it is not part of either the XSI Curses
+    standard, nor of System V Release 4, nor BSD curses. System V
+    Release 4 curses contains code with similar interface
+    definitions, however it is not documented. Other than by
+    disassembling the library, we have no way to determine exactly
+    how that mouse code works. Thus, we recommend that you wrap
+    mouse-related code in an #ifdef using the feature macro
+    NCURSES_MOUSE_VERSION so it will not be compiled and linked on
+    non-ncurses systems.
+  </blockquote>
+
+  <p>Presently, mouse event reporting works in the following
+  environments:</p>
+
+  <ul>
+    <li>xterm and similar programs such as rxvt.</li>
+
+    <li>Linux console, when configured with <code>gpm</code>(1),
+    Alessandro Rubini's mouse server.</li>
+
+    <li>FreeBSD sysmouse (console)</li>
+
+    <li>OS/2 EMX</li>
+  </ul>
+
+  <p>The mouse interface is very simple. To activate it, you use
+  the function <code>mousemask()</code>, passing it as first
+  argument a bit-mask that specifies what kinds of events you want
+  your program to be able to see. It will return the bit-mask of
+  events that actually become visible, which may differ from the
+  argument if the mouse device is not capable of reporting some of
+  the event types you specify.</p>
+
+  <p>Once the mouse is active, your application's command loop
+  should watch for a return value of <code>KEY_MOUSE</code> from
+  <code>wgetch()</code>. When you see this, a mouse event report
+  has been queued. To pick it off the queue, use the function
+  <code>getmouse()</code> (you must do this before the next
+  <code>wgetch()</code>, otherwise another mouse event might come
+  in and make the first one inaccessible).</p>
+
+  <p>Each call to <code>getmouse()</code> fills a structure (the
+  address of which you will pass it) with mouse event data. The
+  event data includes zero-origin, screen-relative character-cell
+  coordinates of the mouse pointer. It also includes an event mask.
+  Bits in this mask will be set, corresponding to the event type
+  being reported.</p>
+
+  <p>The mouse structure contains two additional fields which may
+  be significant in the future as ncurses interfaces to new kinds
+  of pointing device. In addition to x and y coordinates, there is
+  a slot for a z coordinate; this might be useful with
+  touch-screens that can return a pressure or duration parameter.
+  There is also a device ID field, which could be used to
+  distinguish between multiple pointing devices.</p>
+
+  <p>The class of visible events may be changed at any time via
+  <code>mousemask()</code>. Events that can be reported include
+  presses, releases, single-, double- and triple-clicks (you can
+  set the maximum button-down time for clicks). If you do not make
+  clicks visible, they will be reported as press-release pairs. In
+  some environments, the event mask may include bits reporting the
+  state of shift, alt, and ctrl keys on the keyboard during the
+  event.</p>
+
+  <p>A function to check whether a mouse event fell within a given
+  window is also supplied. You can use this to see whether a given
+  window should consider a mouse event relevant to it.</p>
+
+  <p>Because mouse event reporting will not be available in all
+  environments, it would be unwise to build <code>ncurses</code>
+  applications that <em>require</em> the use of a mouse. Rather,
+  you should use the mouse as a shortcut for point-and-shoot
+  commands your application would normally accept from the
+  keyboard. Two of the test games in the <code>ncurses</code>
+  distribution (<code>bs</code> and <code>knight</code>) contain
+  code that illustrates how this can be done.</p>
+
+  <p>See the manual page <code>curs_mouse(3X)</code> for full
+  details of the mouse-interface functions.</p>
+
+  <h4><a name="finishing" id="finishing">Finishing Up</a></h4>
+
+  <p>In order to clean up after the <code>ncurses</code> routines,
+  the routine <code>endwin()</code> is provided. It restores tty
+  modes to what they were when <code>initscr()</code> was first
+  called, and moves the cursor down to the lower-left corner. Thus,
+  anytime after the call to initscr, <code>endwin()</code> should
+  be called before exiting.</p>
+
+  <h3><a name="functions" id="functions">Function Descriptions</a></h3>
+
+  <p>We describe the detailed behavior of some important curses
+  functions here, as a supplement to the manual page
+  descriptions.</p>
+
+  <h4><a name="init" id="init">Initialization and Wrapup</a></h4>
+
+  <dl>
+    <dt><code>initscr()</code>
+    </dt>
+
+    <dd>The first function called should almost always be
+    <code>initscr()</code>. This will determine the terminal type
+    and initialize curses data structures. <code>initscr()</code>
+    also arranges that the first call to <code>refresh()</code>
+    will clear the screen. If an error occurs a message is written
+    to standard error and the program exits. Otherwise it returns a
+    pointer to stdscr. A few functions may be called before initscr
+    (<code>slk_init()</code>, <code>filter()</code>,
+    <code>ripoffline()</code>, <code>use_env()</code>, and, if you
+    are using multiple terminals, <code>newterm()</code>.)</dd>
+
+    <dt><code>endwin()</code>
+    </dt>
+
+    <dd>Your program should always call <code>endwin()</code>
+    before exiting or shelling out of the program. This function
+    will restore tty modes, move the cursor to the lower left
+    corner of the screen, reset the terminal into the proper
+    non-visual mode. Calling <code>refresh()</code> or
+    <code>doupdate()</code> after a temporary escape from the
+    program will restore the ncurses screen from before the
+    escape.</dd>
+
+    <dt><code>newterm(type, ofp, ifp)</code>
+    </dt>
+
+    <dd>A program which outputs to more than one terminal should
+    use <code>newterm()</code> instead of <code>initscr()</code>.
+    <code>newterm()</code> should be called once for each terminal.
+    It returns a variable of type <code>SCREEN *</code> which
+    should be saved as a reference to that terminal. (NOTE: a
+    SCREEN variable is not a <em>screen</em> in the sense we are
+    describing in this introduction, but a collection of parameters
+    used to assist in optimizing the display.) The arguments are
+    the type of the terminal (a string) and <code>FILE</code>
+    pointers for the output and input of the terminal. If type is
+    NULL then the environment variable <code>$TERM</code> is used.
+    <code>endwin()</code> should called once at wrapup time for
+    each terminal opened using this function.</dd>
+
+    <dt><code>set_term(new)</code>
+    </dt>
+
+    <dd>This function is used to switch to a different terminal
+    previously opened by <code>newterm()</code>. The screen
+    reference for the new terminal is passed as the parameter. The
+    previous terminal is returned by the function. All other calls
+    affect only the current terminal.</dd>
+
+    <dt><code>delscreen(sp)</code>
+    </dt>
+
+    <dd>The inverse of <code>newterm()</code>; deallocates the data
+    structures associated with a given <code>SCREEN</code>
+    reference.</dd>
+  </dl>
+
+  <h4><a name="flush" id="flush">Causing Output to the Terminal</a></h4>
+
+  <dl>
+    <dt><code>refresh()</code> and <code>wrefresh(win)</code></dt>
+
+    <dd>These functions must be called to actually get any output
+    on the terminal, as other routines merely manipulate data
+    structures. <code>wrefresh()</code> copies the named window to
+    the physical terminal screen, taking into account what is
+    already there in order to do optimizations.
+    <code>refresh()</code> does a refresh of <code>stdscr</code>.
+    Unless <code>leaveok()</code> has been enabled, the physical
+    cursor of the terminal is left at the location of the window's
+    cursor.</dd>
+
+    <dt><code>doupdate()</code> and
+    <code>wnoutrefresh(win)</code></dt>
+
+    <dd>These two functions allow multiple updates with more
+    efficiency than wrefresh. To use them, it is important to
+    understand how curses works. In addition to all the window
+    structures, curses keeps two data structures representing the
+    terminal screen: a physical screen, describing what is actually
+    on the screen, and a virtual screen, describing what the
+    programmer wants to have on the screen. wrefresh works by first
+    copying the named window to the virtual screen
+    (<code>wnoutrefresh()</code>), and then calling the routine to
+    update the screen (<code>doupdate()</code>). If the programmer
+    wishes to output several windows at once, a series of calls to
+    <code>wrefresh</code> will result in alternating calls to
+    <code>wnoutrefresh()</code> and <code>doupdate()</code>,
+    causing several bursts of output to the screen. By calling
+    <code>wnoutrefresh()</code> for each window, it is then
+    possible to call <code>doupdate()</code> once, resulting in
+    only one burst of output, with fewer total characters
+    transmitted (this also avoids a visually annoying flicker at
+    each update).</dd>
+  </dl>
+
+  <h4><a name="lowlevel" id="lowlevel">Low-Level Capability
+  Access</a></h4>
+
+  <dl>
+    <dt><code>setupterm(term, filenum, errret)</code>
+    </dt>
+
+    <dd>
+      This routine is called to initialize a terminal's
+      description, without setting up the curses screen structures
+      or changing the tty-driver mode bits. <code>term</code> is
+      the character string representing the name of the terminal
+      being used. <code>filenum</code> is the UNIX file descriptor
+      of the terminal to be used for output. <code>errret</code> is
+      a pointer to an integer, in which a success or failure
+      indication is returned. The values returned can be 1 (all is
+      well), 0 (no such terminal), or -1 (some problem locating the
+      terminfo database).
+      <p>The value of <code>term</code> can be given as NULL, which
+      will cause the value of <code>TERM</code> in the environment
+      to be used. The <code>errret</code> pointer can also be given
+      as NULL, meaning no error code is wanted. If
+      <code>errret</code> is defaulted, and something goes wrong,
+      <code>setupterm()</code> will print an appropriate error
+      message and exit, rather than returning. Thus, a simple
+      program can call setupterm(0, 1, 0) and not worry about
+      initialization errors.</p>
+
+      <p>After the call to <code>setupterm()</code>, the global
+      variable <code>cur_term</code> is set to point to the current
+      structure of terminal capabilities. By calling
+      <code>setupterm()</code> for each terminal, and saving and
+      restoring <code>cur_term</code>, it is possible for a program
+      to use two or more terminals at once.
+      <code>Setupterm()</code> also stores the names section of the
+      terminal description in the global character array
+      <code>ttytype[]</code>. Subsequent calls to
+      <code>setupterm()</code> will overwrite this array, so you
+      will have to save it yourself if need be.</p>
+    </dd>
+  </dl>
+
+  <h4><a name="debugging" id="debugging">Debugging</a></h4>
+
+  <blockquote>
+    <strong>NOTE:</strong> These functions are not part of the
+    standard curses API!
+  </blockquote>
+
+  <dl>
+    <dt><code>trace()</code>
+    </dt>
+
+    <dd>This function can be used to explicitly set a trace level.
+    If the trace level is nonzero, execution of your program will
+    generate a file called &ldquo;trace&rdquo; in the current
+    working directory containing a report on the library's actions.
+    Higher trace levels enable more detailed (and verbose)
+    reporting -- see comments attached to <code>TRACE_</code>
+    defines in the <code>curses.h</code> file for details. (It is
+    also possible to set a trace level by assigning a trace level
+    value to the environment variable
+    <code>NCURSES_TRACE</code>).</dd>
+
+    <dt><code>_tracef()</code>
+    </dt>
+
+    <dd>This function can be used to output your own debugging
+    information. It is only available only if you link with
+    -lncurses_g. It can be used the same way as
+    <code>printf()</code>, only it outputs a newline after the end
+    of arguments. The output goes to a file called
+    <code>trace</code> in the current directory.</dd>
+  </dl>
+
+  <p>Trace logs can be difficult to interpret due to the sheer
+  volume of data dumped in them. There is a script called
+  <strong>tracemunch</strong> included with the
+  <code>ncurses</code> distribution that can alleviate this problem
+  somewhat; it compacts long sequences of similar operations into
+  more succinct single-line pseudo-operations. These pseudo-ops can
+  be distinguished by the fact that they are named in capital
+  letters.</p>
+
+  <h3><a name="hints" id="hints">Hints, Tips, and Tricks</a></h3>
+
+  <p>The <code>ncurses</code> manual pages are a complete reference
+  for this library. In the remainder of this document, we discuss
+  various useful methods that may not be obvious from the manual
+  page descriptions.</p>
+
+  <h4><a name="caution" id="caution">Some Notes of Caution</a></h4>
+
+  <p>If you find yourself thinking you need to use
+  <code>noraw()</code> or <code>nocbreak()</code>, think again and
+  move carefully. It is probably better design to use
+  <code>getstr()</code> or one of its relatives to simulate cooked
+  mode. The <code>noraw()</code> and <code>nocbreak()</code>
+  functions try to restore cooked mode, but they may end up
+  clobbering some control bits set before you started your
+  application. Also, they have always been poorly documented, and
+  are likely to hurt your application's usability with other curses
+  libraries.</p>
+
+  <p>Bear in mind that <code>refresh()</code> is a synonym for
+  <code>wrefresh(stdscr)</code>. Do not try to mix use of
+  <code>stdscr</code> with use of windows declared by
+  <code>newwin()</code>; a <code>refresh()</code> call will blow
+  them off the screen. The right way to handle this is to use
+  <code>subwin()</code>, or not touch <code>stdscr</code> at all
+  and tile your screen with declared windows which you then
+  <code>wnoutrefresh()</code> somewhere in your program event loop,
+  with a single <code>doupdate()</code> call to trigger actual
+  repainting.</p>
+
+  <p>You are much less likely to run into problems if you design
+  your screen layouts to use tiled rather than overlapping windows.
+  Historically, curses support for overlapping windows has been
+  weak, fragile, and poorly documented. The <code>ncurses</code>
+  library is not yet an exception to this rule.</p>
+
+  <p>There is a panels library included in the <code>ncurses</code>
+  distribution that does a pretty good job of strengthening the
+  overlapping-windows facilities.</p>
+
+  <p>Try to avoid using the global variables LINES and COLS. Use
+  <code>getmaxyx()</code> on the <code>stdscr</code> context
+  instead. Reason: your code may be ported to run in an environment
+  with window resizes, in which case several screens could be open
+  with different sizes.</p>
+
+  <h4><a name="leaving" id="leaving">Temporarily Leaving NCURSES
+  Mode</a></h4>
+
+  <p>Sometimes you will want to write a program that spends most of
+  its time in screen mode, but occasionally returns to ordinary
+  &ldquo;cooked&rdquo; mode. A common reason for this is to support
+  shell-out. This behavior is simple to arrange in
+  <code>ncurses</code>.</p>
+
+  <p>To leave <code>ncurses</code> mode, call <code>endwin()</code>
+  as you would if you were intending to terminate the program. This
+  will take the screen back to cooked mode; you can do your
+  shell-out. When you want to return to <code>ncurses</code> mode,
+  simply call <code>refresh()</code> or <code>doupdate()</code>.
+  This will repaint the screen.</p>
+
+  <p>There is a boolean function, <code>isendwin()</code>, which
+  code can use to test whether <code>ncurses</code> screen mode is
+  active. It returns <code>TRUE</code> in the interval between an
+  <code>endwin()</code> call and the following
+  <code>refresh()</code>, <code>FALSE</code> otherwise.</p>
+
+  <p>Here is some sample code for shellout:</p>
+
+  <pre class="code-block">
+    addstr("Shelling out...");
+    def_prog_mode();           /* save current tty modes */
+    endwin();                  /* restore original tty modes */
+    system("sh");              /* run shell */
+    addstr("returned.\n");     /* prepare return message */
+    refresh();                 /* restore save modes, repaint screen */
+</pre>
+  <h4><a name="xterm" id="xterm">Using NCURSES under XTERM</a></h4>
+
+  <p>A resize operation in X sends <code>SIGWINCH</code> to the
+  application running under xterm. The easiest way to handle
+  <code>SIGWINCH</code> is to do an <code>endwin</code>, followed
+  by an <code>refresh</code> and a screen repaint you code
+  yourself. The <code>refresh</code> will pick up the new screen
+  size from the xterm's environment.</p>
+
+  <p>That is the standard way, of course (it even works with some
+  vendor's curses implementations). Its drawback is that it clears
+  the screen to reinitialize the display, and does not resize
+  subwindows which must be shrunk. <code>Ncurses</code> provides an
+  extension which works better, the <code>resizeterm</code>
+  function. That function ensures that all windows are limited to
+  the new screen dimensions, and pads <code>stdscr</code> with
+  blanks if the screen is larger.</p>
+
+  <p>The <code>ncurses</code> library provides a SIGWINCH signal
+  handler, which pushes a <code>KEY_RESIZE</code> via the wgetch()
+  calls. When <code>ncurses</code> returns that code, it calls
+  <code>resizeterm</code> to update the size of the standard
+  screen's window, repainting that (filling with blanks or
+  truncating as needed). It also resizes other windows, but its
+  effect may be less satisfactory because it cannot know how you
+  want the screen re-painted. You will usually have to write
+  special-purpose code to handle <code>KEY_RESIZE</code>
+  yourself.</p>
+
+  <h4><a name="screens" id="screens">Handling Multiple Terminal
+  Screens</a></h4>
+
+  <p>The <code>initscr()</code> function actually calls a function
+  named <code>newterm()</code> to do most of its work. If you are
+  writing a program that opens multiple terminals, use
+  <code>newterm()</code> directly.</p>
+
+  <p>For each call, you will have to specify a terminal type and a
+  pair of file pointers; each call will return a screen reference,
+  and <code>stdscr</code> will be set to the last one allocated.
+  You will switch between screens with the <code>set_term</code>
+  call. Note that you will also have to call
+  <code>def_shell_mode</code> and <code>def_prog_mode</code> on
+  each tty yourself.</p>
+
+  <h4><a name="testing" id="testing">Testing for Terminal
+  Capabilities</a></h4>
+
+  <p>Sometimes you may want to write programs that test for the
+  presence of various capabilities before deciding whether to go
+  into <code>ncurses</code> mode. An easy way to do this is to call
+  <code>setupterm()</code>, then use the functions
+  <code>tigetflag()</code>, <code>tigetnum()</code>, and
+  <code>tigetstr()</code> to do your testing.</p>
+
+  <p>A particularly useful case of this often comes up when you
+  want to test whether a given terminal type should be treated as
+  &ldquo;smart&rdquo; (cursor-addressable) or &ldquo;stupid&rdquo;.
+  The right way to test this is to see if the return value of
+  <code>tigetstr("cup")</code> is non-NULL. Alternatively, you can
+  include the <code>term.h</code> file and test the value of the
+  macro <code>cursor_address</code>.</p>
+
+  <h4><a name="tuning" id="tuning">Tuning for Speed</a></h4>
+
+  <p>Use the <code>addchstr()</code> family of functions for fast
+  screen-painting of text when you know the text does not contain
+  any control characters. Try to make attribute changes infrequent
+  on your screens. Do not use the <code>immedok()</code>
+  option!</p>
+
+  <h4><a name="special" id="special">Special Features of
+  NCURSES</a></h4>
+
+  <p>The <code>wresize()</code> function allows you to resize a
+  window in place. The associated <code>resizeterm()</code>
+  function simplifies the construction of <a href=
+  "#xterm">SIGWINCH</a> handlers, for resizing all windows.</p>
+
+  <p>The <code>define_key()</code> function allows you to define at
+  runtime function-key control sequences which are not in the
+  terminal description. The <code>keyok()</code> function allows
+  you to temporarily enable or disable interpretation of any
+  function-key control sequence.</p>
+
+  <p>The <code>use_default_colors()</code> function allows you to
+  construct applications which can use the terminal's default
+  foreground and background colors as an additional "default"
+  color. Several terminal emulators support this feature, which is
+  based on ISO 6429.</p>
+
+  <p>Ncurses supports up 16 colors, unlike SVr4 curses which
+  defines only 8. While most terminals which provide color allow
+  only 8 colors, about a quarter (including XFree86 xterm) support
+  16 colors.</p>
+
+  <h3><a name="compat" id="compat">Compatibility with Older
+  Versions</a></h3>
+
+  <p>Despite our best efforts, there are some differences between
+  <code>ncurses</code> and the (undocumented!) behavior of older
+  curses implementations. These arise from ambiguities or omissions
+  in the documentation of the API.</p>
+
+  <h4><a name="refbug" id="refbug">Refresh of Overlapping
+  Windows</a></h4>
+
+  <p>If you define two windows A and B that overlap, and then
+  alternately scribble on and refresh them, the changes made to the
+  overlapping region under historic <code>curses</code> versions
+  were often not documented precisely.</p>
+
+  <p>To understand why this is a problem, remember that screen
+  updates are calculated between two representations of the
+  <em>entire</em> display. The documentation says that when you
+  refresh a window, it is first copied to the virtual screen, and
+  then changes are calculated to update the physical screen (and
+  applied to the terminal). But "copied to" is not very specific,
+  and subtle differences in how copying works can produce different
+  behaviors in the case where two overlapping windows are each
+  being refreshed at unpredictable intervals.</p>
+
+  <p>What happens to the overlapping region depends on what
+  <code>wnoutrefresh()</code> does with its argument -- what
+  portions of the argument window it copies to the virtual screen.
+  Some implementations do "change copy", copying down only
+  locations in the window that have changed (or been marked changed
+  with <code>wtouchln()</code> and friends). Some implementations
+  do "entire copy", copying <em>all</em> window locations to the
+  virtual screen whether or not they have changed.</p>
+
+  <p>The <code>ncurses</code> library itself has not always been
+  consistent on this score. Due to a bug, versions 1.8.7 to 1.9.8a
+  did entire copy. Versions 1.8.6 and older, and versions 1.9.9 and
+  newer, do change copy.</p>
+
+  <p>For most commercial curses implementations, it is not
+  documented and not known for sure (at least not to the
+  <code>ncurses</code> maintainers) whether they do change copy or
+  entire copy. We know that System V release 3 curses has logic in
+  it that looks like an attempt to do change copy, but the
+  surrounding logic and data representations are sufficiently
+  complex, and our knowledge sufficiently indirect, that it is hard
+  to know whether this is reliable. It is not clear what the SVr4
+  documentation and XSI standard intend. The XSI Curses standard
+  barely mentions wnoutrefresh(); the SVr4 documents seem to be
+  describing entire-copy, but it is possible with some effort and
+  straining to read them the other way.</p>
+
+  <p>It might therefore be unwise to rely on either behavior in
+  programs that might have to be linked with other curses
+  implementations. Instead, you can do an explicit
+  <code>touchwin()</code> before the <code>wnoutrefresh()</code>
+  call to guarantee an entire-contents copy anywhere.</p>
+
+  <p>The really clean way to handle this is to use the panels
+  library. If, when you want a screen update, you do
+  <code>update_panels()</code>, it will do all the necessary
+  <code>wnoutrefresh()</code> calls for whatever panel stacking
+  order you have defined. Then you can do one
+  <code>doupdate()</code> and there will be a <em>single</em> burst
+  of physical I/O that will do all your updates.</p>
+
+  <h4><a name="backbug" id="backbug">Background Erase</a></h4>
+
+  <p>If you have been using a very old versions of
+  <code>ncurses</code> (1.8.7 or older) you may be surprised by the
+  behavior of the erase functions. In older versions, erased areas
+  of a window were filled with a blank modified by the window's
+  current attribute (as set by <strong>wattrset()</strong>,
+  <strong>wattron()</strong>, <strong>wattroff()</strong> and
+  friends).</p>
+
+  <p>In newer versions, this is not so. Instead, the attribute of
+  erased blanks is normal unless and until it is modified by the
+  functions <code>bkgdset()</code> or <code>wbkgdset()</code>.</p>
+
+  <p>This change in behavior conforms <code>ncurses</code> to
+  System V Release 4 and the XSI Curses standard.</p>
+
+  <h3><a name="xsifuncs" id="xsifuncs">XSI Curses Conformance</a></h3>
+
+  <p>The <code>ncurses</code> library is intended to be base-level
+  conformant with the XSI Curses standard from X/Open. Many
+  extended-level features (in fact, almost all features not
+  directly concerned with wide characters and internationalization)
+  are also supported.</p>
+
+  <p>One effect of XSI conformance is the change in behavior
+  described under <a href="#backbug">"Background Erase --
+  Compatibility with Old Versions"</a>.</p>
+
+  <p>Also, <code>ncurses</code> meets the XSI requirement that
+  every macro entry point have a corresponding function which may
+  be linked (and will be prototype-checked) if the macro definition
+  is disabled with <code>#undef</code>.</p>
+
+  <h2><a name="panels" id="panels">The Panels Library</a></h2>
+
+  <p>The <code>ncurses</code> library by itself provides good
+  support for screen displays in which the windows are tiled
+  (non-overlapping). In the more general case that windows may
+  overlap, you have to use a series of <code>wnoutrefresh()</code>
+  calls followed by a <code>doupdate()</code>, and be careful about
+  the order you do the window refreshes in. It has to be
+  bottom-upwards, otherwise parts of windows that should be
+  obscured will show through.</p>
+
+  <p>When your interface design is such that windows may dive
+  deeper into the visibility stack or pop to the top at runtime,
+  the resulting book-keeping can be tedious and difficult to get
+  right. Hence the panels library.</p>
+
+  <p>The <code>panel</code> library first appeared in AT&amp;T
+  System V. The version documented here is the <code>panel</code>
+  code distributed with <code>ncurses</code>.</p>
+
+  <h3><a name="pcompile" id="pcompile">Compiling With the Panels
+  Library</a></h3>
+
+  <p>Your panels-using modules must import the panels library
+  declarations with</p>
+
+  <pre class="code-block">
+          #include &lt;panel.h&gt;
+</pre>
+  <p>and must be linked explicitly with the panels library using an
+  <code>-lpanel</code> argument. Note that they must also link the
+  <code>ncurses</code> library with <code>-lncurses</code>. Many
+  linkers are two-pass and will accept either order, but it is
+  still good practice to put <code>-lpanel</code> first and
+  <code>-lncurses</code> second.</p>
+
+  <h3><a name="poverview" id="poverview">Overview of Panels</a></h3>
+
+  <p>A panel object is a window that is implicitly treated as part
+  of a <dfn>deck</dfn> including all other panel objects. The deck
+  has an implicit bottom-to-top visibility order. The panels
+  library includes an update function (analogous to
+  <code>refresh()</code>) that displays all panels in the deck in
+  the proper order to resolve overlaps. The standard window,
+  <code>stdscr</code>, is considered below all panels.</p>
+
+  <p>Details on the panels functions are available in the man
+  pages. We will just hit the highlights here.</p>
+
+  <p>You create a panel from a window by calling
+  <code>new_panel()</code> on a window pointer. It then becomes the
+  top of the deck. The panel's window is available as the value of
+  <code>panel_window()</code> called with the panel pointer as
+  argument.</p>
+
+  <p>You can delete a panel (removing it from the deck) with
+  <code>del_panel</code>. This will not deallocate the associated
+  window; you have to do that yourself. You can replace a panel's
+  window with a different window by calling
+  <code>replace_window</code>. The new window may be of different
+  size; the panel code will re-compute all overlaps. This operation
+  does not change the panel's position in the deck.</p>
+
+  <p>To move a panel's window, use <code>move_panel()</code>. The
+  <code>mvwin()</code> function on the panel's window is not
+  sufficient because it does not update the panels library's
+  representation of where the windows are. This operation leaves
+  the panel's depth, contents, and size unchanged.</p>
+
+  <p>Two functions (<code>top_panel()</code>,
+  <code>bottom_panel()</code>) are provided for rearranging the
+  deck. The first pops its argument window to the top of the deck;
+  the second sends it to the bottom. Either operation leaves the
+  panel's screen location, contents, and size unchanged.</p>
+
+  <p>The function <code>update_panels()</code> does all the
+  <code>wnoutrefresh()</code> calls needed to prepare for
+  <code>doupdate()</code> (which you must call yourself,
+  afterwards).</p>
+
+  <p>Typically, you will want to call <code>update_panels()</code>
+  and <code>doupdate()</code> just before accepting command input,
+  once in each cycle of interaction with the user. If you call
+  <code>update_panels()</code> after each and every panel write,
+  you will generate a lot of unnecessary refresh activity and
+  screen flicker.</p>
+
+  <h3><a name="pstdscr" id="pstdscr">Panels, Input, and the
+  Standard Screen</a></h3>
+
+  <p>You should not mix <code>wnoutrefresh()</code> or
+  <code>wrefresh()</code> operations with panels code; this will
+  work only if the argument window is either in the top panel or
+  unobscured by any other panels.</p>
+
+  <p>The <code>stsdcr</code> window is a special case. It is
+  considered below all panels. Because changes to panels may
+  obscure parts of <code>stdscr</code>, though, you should call
+  <code>update_panels()</code> before <code>doupdate()</code> even
+  when you only change <code>stdscr</code>.</p>
+
+  <p>Note that <code>wgetch</code> automatically calls
+  <code>wrefresh</code>. Therefore, before requesting input from a
+  panel window, you need to be sure that the panel is totally
+  unobscured.</p>
+
+  <p>There is presently no way to display changes to one obscured
+  panel without repainting all panels.</p>
+
+  <h3><a name="hiding" id="hiding">Hiding Panels</a></h3>
+
+  <p>It is possible to remove a panel from the deck temporarily;
+  use <code>hide_panel</code> for this. Use
+  <code>show_panel()</code> to render it visible again. The
+  predicate function <code>panel_hidden</code> tests whether or not
+  a panel is hidden.</p>
+
+  <p>The <code>panel_update</code> code ignores hidden panels. You
+  cannot do <code>top_panel()</code> or <code>bottom_panel</code>
+  on a hidden panel(). Other panels operations are applicable.</p>
+
+  <h3><a name="pmisc" id="pmisc">Miscellaneous Other Facilities</a></h3>
+
+  <p>It is possible to navigate the deck using the functions
+  <code>panel_above()</code> and <code>panel_below</code>. Handed a
+  panel pointer, they return the panel above or below that panel.
+  Handed <code>NULL</code>, they return the bottom-most or top-most
+  panel.</p>
+
+  <p>Every panel has an associated user pointer, not used by the
+  panel code, to which you can attach application data. See the man
+  page documentation of <code>set_panel_userptr()</code> and
+  <code>panel_userptr</code> for details.</p>
+
+  <h2><a name="menu" id="menu">The Menu Library</a></h2>
+
+  <p>A menu is a screen display that assists the user to choose
+  some subset of a given set of items. The <code>menu</code>
+  library is a curses extension that supports easy programming of
+  menu hierarchies with a uniform but flexible interface.</p>
+
+  <p>The <code>menu</code> library first appeared in AT&amp;T
+  System V. The version documented here is the <code>menu</code>
+  code distributed with <code>ncurses</code>.</p>
+
+  <h3><a name="mcompile" id="mcompile">Compiling With the menu
+  Library</a></h3>
+
+  <p>Your menu-using modules must import the menu library
+  declarations with</p>
+
+  <pre class="code-block">
+          #include &lt;menu.h&gt;
+</pre>
+  <p>and must be linked explicitly with the menus library using an
+  <code>-lmenu</code> argument. Note that they must also link the
+  <code>ncurses</code> library with <code>-lncurses</code>. Many
+  linkers are two-pass and will accept either order, but it is
+  still good practice to put <code>-lmenu</code> first and
+  <code>-lncurses</code> second.</p>
+
+  <h3><a name="moverview" id="moverview">Overview of Menus</a></h3>
+
+  <p>The menus created by this library consist of collections of
+  <dfn>items</dfn> including a name string part and a description
+  string part. To make menus, you create groups of these items and
+  connect them with menu frame objects.</p>
+
+  <p>The menu can then by <dfn>posted</dfn>, that is written to an
+  associated window. Actually, each menu has two associated
+  windows; a containing window in which the programmer can scribble
+  titles or borders, and a subwindow in which the menu items proper
+  are displayed. If this subwindow is too small to display all the
+  items, it will be a scrollable viewport on the collection of
+  items.</p>
+
+  <p>A menu may also be <dfn>unposted</dfn> (that is, undisplayed),
+  and finally freed to make the storage associated with it and its
+  items available for re-use.</p>
+
+  <p>The general flow of control of a menu program looks like
+  this:</p>
+
+  <ol>
+    <li>Initialize <code>curses</code>.</li>
+
+    <li>Create the menu items, using <code>new_item()</code>.</li>
+
+    <li>Create the menu using <code>new_menu()</code>.</li>
+
+    <li>Post the menu using <code>post_menu()</code>.</li>
+
+    <li>Refresh the screen.</li>
+
+    <li>Process user requests via an input loop.</li>
+
+    <li>Unpost the menu using <code>unpost_menu()</code>.</li>
+
+    <li>Free the menu, using <code>free_menu()</code>.</li>
+
+    <li>Free the items using <code>free_item()</code>.</li>
+
+    <li>Terminate <code>curses</code>.</li>
+  </ol>
+
+  <h3><a name="mselect" id="mselect">Selecting items</a></h3>
+
+  <p>Menus may be multi-valued or (the default) single-valued (see
+  the manual page <code>menu_opts(3x)</code> to see how to change
+  the default). Both types always have a <dfn>current
+  item</dfn>.</p>
+
+  <p>From a single-valued menu you can read the selected value
+  simply by looking at the current item. From a multi-valued menu,
+  you get the selected set by looping through the items applying
+  the <code>item_value()</code> predicate function. Your
+  menu-processing code can use the function
+  <code>set_item_value()</code> to flag the items in the select
+  set.</p>
+
+  <p>Menu items can be made unselectable using
+  <code>set_item_opts()</code> or <code>item_opts_off()</code> with
+  the <code>O_SELECTABLE</code> argument. This is the only option
+  so far defined for menus, but it is good practice to code as
+  though other option bits might be on.</p>
+
+  <h3><a name="mdisplay" id="mdisplay">Menu Display</a></h3>
+
+  <p>The menu library calculates a minimum display size for your
+  window, based on the following variables:</p>
+
+  <ul>
+    <li>The number and maximum length of the menu items</li>
+
+    <li>Whether the O_ROWMAJOR option is enabled</li>
+
+    <li>Whether display of descriptions is enabled</li>
+
+    <li>Whatever menu format may have been set by the
+    programmer</li>
+
+    <li>The length of the menu mark string used for highlighting
+    selected items</li>
+  </ul>
+
+  <p>The function <code>set_menu_format()</code> allows you to set
+  the maximum size of the viewport or <dfn>menu page</dfn> that
+  will be used to display menu items. You can retrieve any format
+  associated with a menu with <code>menu_format()</code>. The
+  default format is rows=16, columns=1.</p>
+
+  <p>The actual menu page may be smaller than the format size. This
+  depends on the item number and size and whether O_ROWMAJOR is on.
+  This option (on by default) causes menu items to be displayed in
+  a &ldquo;raster-scan&rdquo; pattern, so that if more than one
+  item will fit horizontally the first couple of items are
+  side-by-side in the top row. The alternative is column-major
+  display, which tries to put the first several items in the first
+  column.</p>
+
+  <p>As mentioned above, a menu format not large enough to allow
+  all items to fit on-screen will result in a menu display that is
+  vertically scrollable.</p>
+
+  <p>You can scroll it with requests to the menu driver, which will
+  be described in the section on <a href="#minput">menu input
+  handling</a>.</p>
+
+  <p>Each menu has a <dfn>mark string</dfn> used to visually tag
+  selected items; see the <code>menu_mark(3x)</code> manual page
+  for details. The mark string length also influences the menu page
+  size.</p>
+
+  <p>The function <code>scale_menu()</code> returns the minimum
+  display size that the menu code computes from all these factors.
+  There are other menu display attributes including a select
+  attribute, an attribute for selectable items, an attribute for
+  unselectable items, and a pad character used to separate item
+  name text from description text. These have reasonable defaults
+  which the library allows you to change (see the
+  <code>menu_attribs(3x)</code> manual page.</p>
+
+  <h3><a name="mwindows" id="mwindows">Menu Windows</a></h3>
+
+  <p>Each menu has, as mentioned previously, a pair of associated
+  windows. Both these windows are painted when the menu is posted
+  and erased when the menu is unposted.</p>
+
+  <p>The outer or frame window is not otherwise touched by the menu
+  routines. It exists so the programmer can associate a title, a
+  border, or perhaps help text with the menu and have it properly
+  refreshed or erased at post/unpost time. The inner window or
+  <dfn>subwindow</dfn> is where the current menu page is
+  displayed.</p>
+
+  <p>By default, both windows are <code>stdscr</code>. You can set
+  them with the functions in <code>menu_win(3x)</code>.</p>
+
+  <p>When you call <code>post_menu()</code>, you write the menu to
+  its subwindow. When you call <code>unpost_menu()</code>, you
+  erase the subwindow, However, neither of these actually modifies
+  the screen. To do that, call <code>wrefresh()</code> or some
+  equivalent.</p>
+
+  <h3><a name="minput" id="minput">Processing Menu Input</a></h3>
+
+  <p>The main loop of your menu-processing code should call
+  <code>menu_driver()</code> repeatedly. The first argument of this
+  routine is a menu pointer; the second is a menu command code. You
+  should write an input-fetching routine that maps input characters
+  to menu command codes, and pass its output to
+  <code>menu_driver()</code>. The menu command codes are fully
+  documented in <code>menu_driver(3x)</code>.</p>
+
+  <p>The simplest group of command codes is
+  <code>REQ_NEXT_ITEM</code>, <code>REQ_PREV_ITEM</code>,
+  <code>REQ_FIRST_ITEM</code>, <code>REQ_LAST_ITEM</code>,
+  <code>REQ_UP_ITEM</code>, <code>REQ_DOWN_ITEM</code>,
+  <code>REQ_LEFT_ITEM</code>, <code>REQ_RIGHT_ITEM</code>. These
+  change the currently selected item. These requests may cause
+  scrolling of the menu page if it only partially displayed.</p>
+
+  <p>There are explicit requests for scrolling which also change
+  the current item (because the select location does not change,
+  but the item there does). These are <code>REQ_SCR_DLINE</code>,
+  <code>REQ_SCR_ULINE</code>, <code>REQ_SCR_DPAGE</code>, and
+  <code>REQ_SCR_UPAGE</code>.</p>
+
+  <p>The <code>REQ_TOGGLE_ITEM</code> selects or deselects the
+  current item. It is for use in multi-valued menus; if you use it
+  with <code>O_ONEVALUE</code> on, you will get an error return
+  (<code>E_REQUEST_DENIED</code>).</p>
+
+  <p>Each menu has an associated pattern buffer. The
+  <code>menu_driver()</code> logic tries to accumulate printable
+  ASCII characters passed in in that buffer; when it matches a
+  prefix of an item name, that item (or the next matching item) is
+  selected. If appending a character yields no new match, that
+  character is deleted from the pattern buffer, and
+  <code>menu_driver()</code> returns <code>E_NO_MATCH</code>.</p>
+
+  <p>Some requests change the pattern buffer directly:
+  <code>REQ_CLEAR_PATTERN</code>, <code>REQ_BACK_PATTERN</code>,
+  <code>REQ_NEXT_MATCH</code>, <code>REQ_PREV_MATCH</code>. The
+  latter two are useful when pattern buffer input matches more than
+  one item in a multi-valued menu.</p>
+
+  <p>Each successful scroll or item navigation request clears the
+  pattern buffer. It is also possible to set the pattern buffer
+  explicitly with <code>set_menu_pattern()</code>.</p>
+
+  <p>Finally, menu driver requests above the constant
+  <code>MAX_COMMAND</code> are considered application-specific
+  commands. The <code>menu_driver()</code> code ignores them and
+  returns <code>E_UNKNOWN_COMMAND</code>.</p>
+
+  <h3><a name="mmisc" id="mmisc">Miscellaneous Other Features</a></h3>
+
+  <p>Various menu options can affect the processing and visual
+  appearance and input processing of menus. See <code>menu_opts(3x)
+  for details.</code></p>
+
+  <p>It is possible to change the current item from application
+  code; this is useful if you want to write your own navigation
+  requests. It is also possible to explicitly set the top row of
+  the menu display. See <code>mitem_current(3x)</code>. If your
+  application needs to change the menu subwindow cursor for any
+  reason, <code>pos_menu_cursor()</code> will restore it to the
+  correct location for continuing menu driver processing.</p>
+
+  <p>It is possible to set hooks to be called at menu
+  initialization and wrapup time, and whenever the selected item
+  changes. See <code>menu_hook(3x)</code>.</p>
+
+  <p>Each item, and each menu, has an associated user pointer on
+  which you can hang application data. See
+  <code>mitem_userptr(3x)</code> and
+  <code>menu_userptr(3x)</code>.</p>
+
+  <h2><a name="form" id="form">The Forms Library</a></h2>
+
+  <p>The <code>form</code> library is a curses extension that
+  supports easy programming of on-screen forms for data entry and
+  program control.</p>
+
+  <p>The <code>form</code> library first appeared in AT&amp;T
+  System V. The version documented here is the <code>form</code>
+  code distributed with <code>ncurses</code>.</p>
+
+  <h3><a name="fcompile" id="fcompile">Compiling With the form
+  Library</a></h3>
+
+  <p>Your form-using modules must import the form library
+  declarations with</p>
+
+  <pre class="code-block">
+          #include &lt;form.h&gt;
+</pre>
+  <p>and must be linked explicitly with the forms library using an
+  <code>-lform</code> argument. Note that they must also link the
+  <code>ncurses</code> library with <code>-lncurses</code>. Many
+  linkers are two-pass and will accept either order, but it is
+  still good practice to put <code>-lform</code> first and
+  <code>-lncurses</code> second.</p>
+
+  <h3><a name="foverview" id="foverview">Overview of Forms</a></h3>
+
+  <p>A form is a collection of fields; each field may be either a
+  label (explanatory text) or a data-entry location. Long forms may
+  be segmented into pages; each entry to a new page clears the
+  screen.</p>
+
+  <p>To make forms, you create groups of fields and connect them
+  with form frame objects; the form library makes this relatively
+  simple.</p>
+
+  <p>Once defined, a form can be <dfn>posted</dfn>, that is written
+  to an associated window. Actually, each form has two associated
+  windows; a containing window in which the programmer can scribble
+  titles or borders, and a subwindow in which the form fields
+  proper are displayed.</p>
+
+  <p>As the form user fills out the posted form, navigation and
+  editing keys support movement between fields, editing keys
+  support modifying field, and plain text adds to or changes data
+  in a current field. The form library allows you (the forms
+  designer) to bind each navigation and editing key to any
+  keystroke accepted by <code>curses</code> Fields may have
+  validation conditions on them, so that they check input data for
+  type and value. The form library supplies a rich set of
+  pre-defined field types, and makes it relatively easy to define
+  new ones.</p>
+
+  <p>Once its transaction is completed (or aborted), a form may be
+  <dfn>unposted</dfn> (that is, undisplayed), and finally freed to
+  make the storage associated with it and its items available for
+  re-use.</p>
+
+  <p>The general flow of control of a form program looks like
+  this:</p>
+
+  <ol>
+    <li>Initialize <code>curses</code>.</li>
+
+    <li>Create the form fields, using
+    <code>new_field()</code>.</li>
+
+    <li>Create the form using <code>new_form()</code>.</li>
+
+    <li>Post the form using <code>post_form()</code>.</li>
+
+    <li>Refresh the screen.</li>
+
+    <li>Process user requests via an input loop.</li>
+
+    <li>Unpost the form using <code>unpost_form()</code>.</li>
+
+    <li>Free the form, using <code>free_form()</code>.</li>
+
+    <li>Free the fields using <code>free_field()</code>.</li>
+
+    <li>Terminate <code>curses</code>.</li>
+  </ol>
+
+  <p>Note that this looks much like a menu program; the form
+  library handles tasks which are in many ways similar, and its
+  interface was obviously designed to resemble that of the <a href=
+  "#menu">menu library</a> wherever possible.</p>
+
+  <p>In forms programs, however, the &ldquo;process user
+  requests&rdquo; is somewhat more complicated than for menus.
+  Besides menu-like navigation operations, the menu driver loop has
+  to support field editing and data validation.</p>
+
+  <h3><a name="fcreate" id="fcreate">Creating and Freeing Fields
+  and Forms</a></h3>
+
+  <p>The basic function for creating fields is
+  <code>new_field()</code>:</p>
+
+  <pre class="code-block">
+FIELD *new_field(int height, int width,   /* new field size */
+                 int top, int left,       /* upper left corner */
+                 int offscreen,           /* number of offscreen rows */
+                 int nbuf);               /* number of working buffers */
+</pre>
+  <p>Menu items always occupy a single row, but forms fields may
+  have multiple rows. So <code>new_field()</code> requires you to
+  specify a width and height (the first two arguments, which mist
+  both be greater than zero).</p>
+
+  <p>You must also specify the location of the field's upper left
+  corner on the screen (the third and fourth arguments, which must
+  be zero or greater). Note that these coordinates are relative to
+  the form subwindow, which will coincide with <code>stdscr</code>
+  by default but need not be <code>stdscr</code> if you have done
+  an explicit <code>set_form_win()</code> call.</p>
+
+  <p>The fifth argument allows you to specify a number of
+  off-screen rows. If this is zero, the entire field will always be
+  displayed. If it is nonzero, the form will be scrollable, with
+  only one screen-full (initially the top part) displayed at any
+  given time. If you make a field dynamic and grow it so it will no
+  longer fit on the screen, the form will become scrollable even if
+  the <code>offscreen</code> argument was initially zero.</p>
+
+  <p>The forms library allocates one working buffer per field; the
+  size of each buffer is <code>((height + offscreen)*width +
+  1</code>, one character for each position in the field plus a NUL
+  terminator. The sixth argument is the number of additional data
+  buffers to allocate for the field; your application can use them
+  for its own purposes.</p>
+
+  <pre class="code-block">
+FIELD *dup_field(FIELD *field,            /* field to copy */
+                 int top, int left);      /* location of new copy */
+</pre>
+  <p>The function <code>dup_field()</code> duplicates an existing
+  field at a new location. Size and buffering information are
+  copied; some attribute flags and status bits are not (see the
+  <code>form_field_new(3X)</code> for details).</p>
+
+  <pre class="code-block">
+FIELD *link_field(FIELD *field,           /* field to copy */
+                  int top, int left);     /* location of new copy */
+</pre>
+  <p>The function <code>link_field()</code> also duplicates an
+  existing field at a new location. The difference from
+  <code>dup_field()</code> is that it arranges for the new field's
+  buffer to be shared with the old one.</p>
+
+  <p>Besides the obvious use in making a field editable from two
+  different form pages, linked fields give you a way to hack in
+  dynamic labels. If you declare several fields linked to an
+  original, and then make them inactive, changes from the original
+  will still be propagated to the linked fields.</p>
+
+  <p>As with duplicated fields, linked fields have attribute bits
+  separate from the original.</p>
+
+  <p>As you might guess, all these field-allocations return
+  <code>NULL</code> if the field allocation is not possible due to
+  an out-of-memory error or out-of-bounds arguments.</p>
+
+  <p>To connect fields to a form, use</p>
+
+  <pre class="code-block">
+FORM *new_form(FIELD **fields);
+</pre>
+  <p>This function expects to see a NULL-terminated array of field
+  pointers. Said fields are connected to a newly-allocated form
+  object; its address is returned (or else NULL if the allocation
+  fails).</p>
+
+  <p>Note that <code>new_field()</code> does <em>not</em> copy the
+  pointer array into private storage; if you modify the contents of
+  the pointer array during forms processing, all manner of bizarre
+  things might happen. Also note that any given field may only be
+  connected to one form.</p>
+
+  <p>The functions <code>free_field()</code> and
+  <code>free_form</code> are available to free field and form
+  objects. It is an error to attempt to free a field connected to a
+  form, but not vice-versa; thus, you will generally free your form
+  objects first.</p>
+
+  <h3><a name="fattributes" id="fattributes">Fetching and Changing
+  Field Attributes</a></h3>
+
+  <p>Each form field has a number of location and size attributes
+  associated with it. There are other field attributes used to
+  control display and editing of the field. Some (for example, the
+  <code>O_STATIC</code> bit) involve sufficient complications to be
+  covered in sections of their own later on. We cover the functions
+  used to get and set several basic attributes here.</p>
+
+  <p>When a field is created, the attributes not specified by the
+  <code>new_field</code> function are copied from an invisible
+  system default field. In attribute-setting and -fetching
+  functions, the argument NULL is taken to mean this field. Changes
+  to it persist as defaults until your forms application
+  terminates.</p>
+
+  <h4><a name="fsizes" id="fsizes">Fetching Size and Location
+  Data</a></h4>
+
+  <p>You can retrieve field sizes and locations through:</p>
+
+  <pre class="code-block">
+int field_info(FIELD *field,              /* field from which to fetch */
+               int *height, *int width,   /* field size */
+               int *top, int *left,       /* upper left corner */
+               int *offscreen,            /* number of offscreen rows */
+               int *nbuf);                /* number of working buffers */
+</pre>
+  <p>This function is a sort of inverse of
+  <code>new_field()</code>; instead of setting size and location
+  attributes of a new field, it fetches them from an existing
+  one.</p>
+
+  <h4><a name="flocation" id="flocation">Changing the Field
+  Location</a></h4>
+
+  <p>It is possible to move a field's location on the screen:</p>
+
+  <pre class="code-block">
+int move_field(FIELD *field,              /* field to alter */
+               int top, int left);        /* new upper-left corner */
+</pre>
+  <p>You can, of course. query the current location through
+  <code>field_info()</code>.</p>
+
+  <h4><a name="fjust" id="fjust">The Justification Attribute</a></h4>
+
+  <p>One-line fields may be unjustified, justified right, justified
+  left, or centered. Here is how you manipulate this attribute:</p>
+
+  <pre class="code-block">
+int set_field_just(FIELD *field,          /* field to alter */
+                   int justmode);         /* mode to set */
+
+int field_just(FIELD *field);             /* fetch mode of field */
+</pre>
+  <p>The mode values accepted and returned by this functions are
+  preprocessor macros <code>NO_JUSTIFICATION</code>,
+  <code>JUSTIFY_RIGHT</code>, <code>JUSTIFY_LEFT</code>, or
+  <code>JUSTIFY_CENTER</code>.</p>
+
+  <h4><a name="fdispatts" id="fdispatts">Field Display
+  Attributes</a></h4>
+
+  <p>For each field, you can set a foreground attribute for entered
+  characters, a background attribute for the entire field, and a
+  pad character for the unfilled portion of the field. You can also
+  control pagination of the form.</p>
+
+  <p>This group of four field attributes controls the visual
+  appearance of the field on the screen, without affecting in any
+  way the data in the field buffer.</p>
+
+  <pre class="code-block">
+int set_field_fore(FIELD *field,          /* field to alter */
+                   chtype attr);          /* attribute to set */
+
+chtype field_fore(FIELD *field);          /* field to query */
+
+int set_field_back(FIELD *field,          /* field to alter */
+                   chtype attr);          /* attribute to set */
+
+chtype field_back(FIELD *field);          /* field to query */
+
+int set_field_pad(FIELD *field,           /* field to alter */
+                 int pad);                /* pad character to set */
+
+chtype field_pad(FIELD *field);
+
+int set_new_page(FIELD *field,            /* field to alter */
+                 int flag);               /* TRUE to force new page */
+
+chtype new_page(FIELD *field);            /* field to query */
+</pre>
+  <p>The attributes set and returned by the first four functions
+  are normal <code>curses(3x)</code> display attribute values
+  (<code>A_STANDOUT</code>, <code>A_BOLD</code>,
+  <code>A_REVERSE</code> etc). The page bit of a field controls
+  whether it is displayed at the start of a new form screen.</p>
+
+  <h4><a name="foptions" id="foptions">Field Option Bits</a></h4>
+
+  <p>There is also a large collection of field option bits you can
+  set to control various aspects of forms processing. You can
+  manipulate them with these functions:</p>
+
+  <pre class="code-block">
+int set_field_opts(FIELD *field,          /* field to alter */
+                   int attr);             /* attribute to set */
+
+int field_opts_on(FIELD *field,           /* field to alter */
+                  int attr);              /* attributes to turn on */
+
+int field_opts_off(FIELD *field,          /* field to alter */
+                   int attr);             /* attributes to turn off */
+
+int field_opts(FIELD *field);             /* field to query */
+</pre>
+  <p>By default, all options are on. Here are the available option
+  bits:</p>
+
+  <dl>
+    <dt>O_VISIBLE</dt>
+
+    <dd>Controls whether the field is visible on the screen. Can be
+    used during form processing to hide or pop up fields depending
+    on the value of parent fields.</dd>
+
+    <dt>O_ACTIVE</dt>
+
+    <dd>Controls whether the field is active during forms
+    processing (i.e. visited by form navigation keys). Can be used
+    to make labels or derived fields with buffer values alterable
+    by the forms application, not the user.</dd>
+
+    <dt>O_PUBLIC</dt>
+
+    <dd>Controls whether data is displayed during field entry. If
+    this option is turned off on a field, the library will accept
+    and edit data in that field, but it will not be displayed and
+    the visible field cursor will not move. You can turn off the
+    O_PUBLIC bit to define password fields.</dd>
+
+    <dt>O_EDIT</dt>
+
+    <dd>Controls whether the field's data can be modified. When
+    this option is off, all editing requests except
+    <code>REQ_PREV_CHOICE</code> and <code>REQ_NEXT_CHOICE</code>
+    will fail. Such read-only fields may be useful for help
+    messages.</dd>
+
+    <dt>O_WRAP</dt>
+
+    <dd>Controls word-wrapping in multi-line fields. Normally, when
+    any character of a (blank-separated) word reaches the end of
+    the current line, the entire word is wrapped to the next line
+    (assuming there is one). When this option is off, the word will
+    be split across the line break.</dd>
+
+    <dt>O_BLANK</dt>
+
+    <dd>Controls field blanking. When this option is on, entering a
+    character at the first field position erases the entire field
+    (except for the just-entered character).</dd>
+
+    <dt>O_AUTOSKIP</dt>
+
+    <dd>Controls automatic skip to next field when this one fills.
+    Normally, when the forms user tries to type more data into a
+    field than will fit, the editing location jumps to next field.
+    When this option is off, the user's cursor will hang at the end
+    of the field. This option is ignored in dynamic fields that
+    have not reached their size limit.</dd>
+
+    <dt>O_NULLOK</dt>
+
+    <dd>Controls whether <a href="#fvalidation">validation</a> is
+    applied to blank fields. Normally, it is not; the user can
+    leave a field blank without invoking the usual validation check
+    on exit. If this option is off on a field, exit from it will
+    invoke a validation check.</dd>
+
+    <dt>O_PASSOK</dt>
+
+    <dd>Controls whether validation occurs on every exit, or only
+    after the field is modified. Normally the latter is true.
+    Setting O_PASSOK may be useful if your field's validation
+    function may change during forms processing.</dd>
+
+    <dt>O_STATIC</dt>
+
+    <dd>Controls whether the field is fixed to its initial
+    dimensions. If you turn this off, the field becomes <a href=
+    "#fdynamic">dynamic</a> and will stretch to fit entered
+    data.</dd>
+  </dl>
+
+  <p>A field's options cannot be changed while the field is
+  currently selected. However, options may be changed on posted
+  fields that are not current.</p>
+
+  <p>The option values are bit-masks and can be composed with
+  logical-or in the obvious way.</p>
+
+  <h3><a name="fstatus" id="fstatus">Field Status</a></h3>
+
+  <p>Every field has a status flag, which is set to FALSE when the
+  field is created and TRUE when the value in field buffer 0
+  changes. This flag can be queried and set directly:</p>
+
+  <pre class="code-block">
+int set_field_status(FIELD *field,      /* field to alter */
+                   int status);         /* mode to set */
+
+int field_status(FIELD *field);         /* fetch mode of field */
+</pre>
+  <p>Setting this flag under program control can be useful if you
+  use the same form repeatedly, looking for modified fields each
+  time.</p>
+
+  <p>Calling <code>field_status()</code> on a field not currently
+  selected for input will return a correct value. Calling
+  <code>field_status()</code> on a field that is currently selected
+  for input may not necessarily give a correct field status value,
+  because entered data is not necessarily copied to buffer zero
+  before the exit validation check. To guarantee that the returned
+  status value reflects reality, call <code>field_status()</code>
+  either (1) in the field's exit validation check routine, (2) from
+  the field's or form's initialization or termination hooks, or (3)
+  just after a <code>REQ_VALIDATION</code> request has been
+  processed by the forms driver.</p>
+
+  <h3><a name="fuser" id="fuser">Field User Pointer</a></h3>
+
+  <p>Each field structure contains one character pointer slot that
+  is not used by the forms library. It is intended to be used by
+  applications to store private per-field data. You can manipulate
+  it with:</p>
+
+  <pre class="code-block">
+int set_field_userptr(FIELD *field,       /* field to alter */
+                   char *userptr);        /* mode to set */
+
+char *field_userptr(FIELD *field);        /* fetch mode of field */
+</pre>(Properly, this user pointer field ought to have <code>(void
+*)</code> type. The <code>(char *)</code> type is retained for
+System V compatibility.)
+  <p>It is valid to set the user pointer of the default field (with
+  a <code>set_field_userptr()</code> call passed a NULL field
+  pointer.) When a new field is created, the default-field user
+  pointer is copied to initialize the new field's user pointer.</p>
+
+  <h3><a name="fdynamic" id="fdynamic">Variable-Sized Fields</a></h3>
+
+  <p>Normally, a field is fixed at the size specified for it at
+  creation time. If, however, you turn off its O_STATIC bit, it
+  becomes <dfn>dynamic</dfn> and will automatically resize itself
+  to accommodate data as it is entered. If the field has extra
+  buffers associated with it, they will grow right along with the
+  main input buffer.</p>
+
+  <p>A one-line dynamic field will have a fixed height (1) but
+  variable width, scrolling horizontally to display data within the
+  field area as originally dimensioned and located. A multi-line
+  dynamic field will have a fixed width, but variable height
+  (number of rows), scrolling vertically to display data within the
+  field area as originally dimensioned and located.</p>
+
+  <p>Normally, a dynamic field is allowed to grow without limit.
+  But it is possible to set an upper limit on the size of a dynamic
+  field. You do it with this function:</p>
+
+  <pre class="code-block">
+int set_max_field(FIELD *field,     /* field to alter (may not be NULL) */
+                   int max_size);   /* upper limit on field size */
+</pre>
+  <p>If the field is one-line, <code>max_size</code> is taken to be
+  a column size limit; if it is multi-line, it is taken to be a
+  line size limit. To disable any limit, use an argument of zero.
+  The growth limit can be changed whether or not the O_STATIC bit
+  is on, but has no effect until it is.</p>
+
+  <p>The following properties of a field change when it becomes
+  dynamic:</p>
+
+  <ul>
+    <li>If there is no growth limit, there is no final position of
+    the field; therefore <code>O_AUTOSKIP</code> and
+    <code>O_NL_OVERLOAD</code> are ignored.</li>
+
+    <li>Field justification will be ignored (though whatever
+    justification is set up will be retained internally and can be
+    queried).</li>
+
+    <li>The <code>dup_field()</code> and <code>link_field()</code>
+    calls copy dynamic-buffer sizes. If the <code>O_STATIC</code>
+    option is set on one of a collection of links, buffer resizing
+    will occur only when the field is edited through that
+    link.</li>
+
+    <li>The call <code>field_info()</code> will retrieve the
+    original static size of the field; use
+    <code>dynamic_field_info()</code> to get the actual dynamic
+    size.</li>
+  </ul>
+
+  <h3><a name="fvalidation" id="fvalidation">Field Validation</a></h3>
+
+  <p>By default, a field will accept any data that will fit in its
+  input buffer. However, it is possible to attach a validation type
+  to a field. If you do this, any attempt to leave the field while
+  it contains data that does not match the validation type will
+  fail. Some validation types also have a character-validity check
+  for each time a character is entered in the field.</p>
+
+  <p>A field's validation check (if any) is not called when
+  <code>set_field_buffer()</code> modifies the input buffer, nor
+  when that buffer is changed through a linked field.</p>
+
+  <p>The <code>form</code> library provides a rich set of
+  pre-defined validation types, and gives you the capability to
+  define custom ones of your own. You can examine and change field
+  validation attributes with the following functions:</p>
+
+  <pre class="code-block">
+int set_field_type(FIELD *field,          /* field to alter */
+                   FIELDTYPE *ftype,      /* type to associate */
+                   ...);                  /* additional arguments*/
+
+FIELDTYPE *field_type(FIELD *field);      /* field to query */
+</pre>
+  <p>The validation type of a field is considered an attribute of
+  the field. As with other field attributes, Also, doing
+  <code>set_field_type()</code> with a <code>NULL</code> field
+  default will change the system default for validation of
+  newly-created fields.</p>
+
+  <p>Here are the pre-defined validation types:</p>
+
+  <h4><a name="ftype_alpha" id="ftype_alpha">TYPE_ALPHA</a></h4>
+
+  <p>This field type accepts alphabetic data; no blanks, no digits,
+  no special characters (this is checked at character-entry time).
+  It is set up with:</p>
+
+  <pre class="code-block">
+int set_field_type(FIELD *field,          /* field to alter */
+                   TYPE_ALPHA,            /* type to associate */
+                   int width);            /* maximum width of field */
+</pre>
+  <p>The <code>width</code> argument sets a minimum width of data.
+  Typically you will want to set this to the field width; if it is
+  greater than the field width, the validation check will always
+  fail. A minimum width of zero makes field completion
+  optional.</p>
+
+  <h4><a name="ftype_alnum" id="ftype_alnum">TYPE_ALNUM</a></h4>
+
+  <p>This field type accepts alphabetic data and digits; no blanks,
+  no special characters (this is checked at character-entry time).
+  It is set up with:</p>
+
+  <pre class="code-block">
+int set_field_type(FIELD *field,          /* field to alter */
+                   TYPE_ALNUM,            /* type to associate */
+                   int width);            /* maximum width of field */
+</pre>
+  <p>The <code>width</code> argument sets a minimum width of data.
+  As with TYPE_ALPHA, typically you will want to set this to the
+  field width; if it is greater than the field width, the
+  validation check will always fail. A minimum width of zero makes
+  field completion optional.</p>
+
+  <h4><a name="ftype_enum" id="ftype_enum">TYPE_ENUM</a></h4>
+
+  <p>This type allows you to restrict a field's values to be among
+  a specified set of string values (for example, the two-letter
+  postal codes for U.S. states). It is set up with:</p>
+
+  <pre class="code-block">
+int set_field_type(FIELD *field,          /* field to alter */
+                   TYPE_ENUM,             /* type to associate */
+                   char **valuelist;      /* list of possible values */
+                   int checkcase;         /* case-sensitive? */
+                   int checkunique);      /* must specify uniquely? */
+</pre>
+  <p>The <code>valuelist</code> parameter must point at a
+  NULL-terminated list of valid strings. The <code>checkcase</code>
+  argument, if true, makes comparison with the string
+  case-sensitive.</p>
+
+  <p>When the user exits a TYPE_ENUM field, the validation
+  procedure tries to complete the data in the buffer to a valid
+  entry. If a complete choice string has been entered, it is of
+  course valid. But it is also possible to enter a prefix of a
+  valid string and have it completed for you.</p>
+
+  <p>By default, if you enter such a prefix and it matches more
+  than one value in the string list, the prefix will be completed
+  to the first matching value. But the <code>checkunique</code>
+  argument, if true, requires prefix matches to be unique in order
+  to be valid.</p>
+
+  <p>The <code>REQ_NEXT_CHOICE</code> and
+  <code>REQ_PREV_CHOICE</code> input requests can be particularly
+  useful with these fields.</p>
+
+  <h4><a name="ftype_integer" id="ftype_integer">TYPE_INTEGER</a></h4>
+
+  <p>This field type accepts an integer. It is set up as
+  follows:</p>
+
+  <pre class="code-block">
+int set_field_type(FIELD *field,          /* field to alter */
+                   TYPE_INTEGER,          /* type to associate */
+                   int padding,           /* # places to zero-pad to */
+                   int vmin, int vmax);   /* valid range */
+</pre>
+  <p>Valid characters consist of an optional leading minus and
+  digits. The range check is performed on exit. If the range
+  maximum is less than or equal to the minimum, the range is
+  ignored.</p>
+
+  <p>If the value passes its range check, it is padded with as many
+  leading zero digits as necessary to meet the padding
+  argument.</p>
+
+  <p>A <code>TYPE_INTEGER</code> value buffer can conveniently be
+  interpreted with the C library function <code>atoi(3)</code>.</p>
+
+  <h4><a name="ftype_numeric" id="ftype_numeric">TYPE_NUMERIC</a></h4>
+
+  <p>This field type accepts a decimal number. It is set up as
+  follows:</p>
+
+  <pre class="code-block">
+int set_field_type(FIELD *field,              /* field to alter */
+                   TYPE_NUMERIC,              /* type to associate */
+                   int padding,               /* # places of precision */
+                   double vmin, double vmax); /* valid range */
+</pre>
+  <p>Valid characters consist of an optional leading minus and
+  digits. possibly including a decimal point. If your system
+  supports locale's, the decimal point character used must be the
+  one defined by your locale. The range check is performed on exit.
+  If the range maximum is less than or equal to the minimum, the
+  range is ignored.</p>
+
+  <p>If the value passes its range check, it is padded with as many
+  trailing zero digits as necessary to meet the padding
+  argument.</p>
+
+  <p>A <code>TYPE_NUMERIC</code> value buffer can conveniently be
+  interpreted with the C library function <code>atof(3)</code>.</p>
+
+  <h4><a name="ftype_regexp" id="ftype_regexp">TYPE_REGEXP</a></h4>
+
+  <p>This field type accepts data matching a regular expression. It
+  is set up as follows:</p>
+
+  <pre class="code-block">
+int set_field_type(FIELD *field,          /* field to alter */
+                   TYPE_REGEXP,           /* type to associate */
+                   char *regexp);         /* expression to match */
+</pre>
+  <p>The syntax for regular expressions is that of
+  <code>regcomp(3)</code>. The check for regular-expression match
+  is performed on exit.</p>
+
+  <h3><a name="fbuffer" id="fbuffer">Direct Field Buffer
+  Manipulation</a></h3>
+
+  <p>The chief attribute of a field is its buffer contents. When a
+  form has been completed, your application usually needs to know
+  the state of each field buffer. You can find this out with:</p>
+
+  <pre class="code-block">
+char *field_buffer(FIELD *field,          /* field to query */
+                   int bufindex);         /* number of buffer to query */
+</pre>
+  <p>Normally, the state of the zero-numbered buffer for each field
+  is set by the user's editing actions on that field. It is
+  sometimes useful to be able to set the value of the zero-numbered
+  (or some other) buffer from your application:</p>
+
+  <pre class="code-block">
+int set_field_buffer(FIELD *field,        /* field to alter */
+                   int bufindex,          /* number of buffer to alter */
+                   char *value);          /* string value to set */
+</pre>
+  <p>If the field is not large enough and cannot be resized to a
+  sufficiently large size to contain the specified value, the value
+  will be truncated to fit.</p>
+
+  <p>Calling <code>field_buffer()</code> with a null field pointer
+  will raise an error. Calling <code>field_buffer()</code> on a
+  field not currently selected for input will return a correct
+  value. Calling <code>field_buffer()</code> on a field that is
+  currently selected for input may not necessarily give a correct
+  field buffer value, because entered data is not necessarily
+  copied to buffer zero before the exit validation check. To
+  guarantee that the returned buffer value reflects on-screen
+  reality, call <code>field_buffer()</code> either (1) in the
+  field's exit validation check routine, (2) from the field's or
+  form's initialization or termination hooks, or (3) just after a
+  <code>REQ_VALIDATION</code> request has been processed by the
+  forms driver.</p>
+
+  <h3><a name="formattrs" id="formattrs">Attributes of Forms</a></h3>
+
+  <p>As with field attributes, form attributes inherit a default
+  from a system default form structure. These defaults can be
+  queried or set by of these functions using a form-pointer
+  argument of <code>NULL</code>.</p>
+
+  <p>The principal attribute of a form is its field list. You can
+  query and change this list with:</p>
+
+  <pre class="code-block">
+int set_form_fields(FORM *form,           /* form to alter */
+                    FIELD **fields);      /* fields to connect */
+
+char *form_fields(FORM *form);            /* fetch fields of form */
+
+int field_count(FORM *form);              /* count connect fields */
+</pre>
+  <p>The second argument of <code>set_form_fields()</code> may be a
+  NULL-terminated field pointer array like the one required by
+  <code>new_form()</code>. In that case, the old fields of the form
+  are disconnected but not freed (and eligible to be connected to
+  other forms), then the new fields are connected.</p>
+
+  <p>It may also be null, in which case the old fields are
+  disconnected (and not freed) but no new ones are connected.</p>
+
+  <p>The <code>field_count()</code> function simply counts the
+  number of fields connected to a given from. It returns -1 if the
+  form-pointer argument is NULL.</p>
+
+  <h3><a name="fdisplay" id="fdisplay">Control of Form Display</a></h3>
+
+  <p>In the overview section, you saw that to display a form you
+  normally start by defining its size (and fields), posting it, and
+  refreshing the screen. There is an hidden step before posting,
+  which is the association of the form with a frame window
+  (actually, a pair of windows) within which it will be displayed.
+  By default, the forms library associates every form with the
+  full-screen window <code>stdscr</code>.</p>
+
+  <p>By making this step explicit, you can associate a form with a
+  declared frame window on your screen display. This can be useful
+  if you want to adapt the form display to different screen sizes,
+  dynamically tile forms on the screen, or use a form as part of an
+  interface layout managed by <a href="#panels">panels</a>.</p>
+
+  <p>The two windows associated with each form have the same
+  functions as their analogues in the <a href="#menu">menu
+  library</a>. Both these windows are painted when the form is
+  posted and erased when the form is unposted.</p>
+
+  <p>The outer or frame window is not otherwise touched by the form
+  routines. It exists so the programmer can associate a title, a
+  border, or perhaps help text with the form and have it properly
+  refreshed or erased at post/unpost time. The inner window or
+  subwindow is where the current form page is actually
+  displayed.</p>
+
+  <p>In order to declare your own frame window for a form, you will
+  need to know the size of the form's bounding rectangle. You can
+  get this information with:</p>
+
+  <pre class="code-block">
+int scale_form(FORM *form,                /* form to query */
+               int *rows,                 /* form rows */
+               int *cols);                /* form cols */
+</pre>
+  <p>The form dimensions are passed back in the locations pointed
+  to by the arguments. Once you have this information, you can use
+  it to declare of windows, then use one of these functions:</p>
+
+  <pre class="code-block">
+int set_form_win(FORM *form,              /* form to alter */
+                 WINDOW *win);            /* frame window to connect */
+
+WINDOW *form_win(FORM *form);             /* fetch frame window of form */
+
+int set_form_sub(FORM *form,              /* form to alter */
+                 WINDOW *win);            /* form subwindow to connect */
+
+WINDOW *form_sub(FORM *form);             /* fetch form subwindow of form */
+</pre>
+  <p>Note that curses operations, including <code>refresh()</code>,
+  on the form, should be done on the frame window, not the form
+  subwindow.</p>
+
+  <p>It is possible to check from your application whether all of a
+  scrollable field is actually displayed within the menu subwindow.
+  Use these functions:</p>
+
+  <pre class="code-block">
+int data_ahead(FORM *form);               /* form to be queried */
+
+int data_behind(FORM *form);              /* form to be queried */
+</pre>
+  <p>The function <code>data_ahead()</code> returns TRUE if (a) the
+  current field is one-line and has undisplayed data off to the
+  right, (b) the current field is multi-line and there is data
+  off-screen below it.</p>
+
+  <p>The function <code>data_behind()</code> returns TRUE if the
+  first (upper left hand) character position is off-screen (not
+  being displayed).</p>
+
+  <p>Finally, there is a function to restore the form window's
+  cursor to the value expected by the forms driver:</p>
+
+  <pre class="code-block">
+int pos_form_cursor(FORM *)               /* form to be queried */
+</pre>
+  <p>If your application changes the form window cursor, call this
+  function before handing control back to the forms driver in order
+  to re-synchronize it.</p>
+
+  <h3><a name="fdriver" id="fdriver">Input Processing in the Forms
+  Driver</a></h3>
+
+  <p>The function <code>form_driver()</code> handles virtualized
+  input requests for form navigation, editing, and validation
+  requests, just as <code>menu_driver</code> does for menus (see
+  the section on <a href="#minput">menu input handling</a>).</p>
+
+  <pre class="code-block">
+int form_driver(FORM *form,               /* form to pass input to */
+                int request);             /* form request code */
+</pre>
+  <p>Your input virtualization function needs to take input and
+  then convert it to either an alphanumeric character (which is
+  treated as data to be entered in the currently-selected field),
+  or a forms processing request.</p>
+
+  <p>The forms driver provides hooks (through input-validation and
+  field-termination functions) with which your application code can
+  check that the input taken by the driver matched what was
+  expected.</p>
+
+  <h4><a name="fpage" id="fpage">Page Navigation Requests</a></h4>
+
+  <p>These requests cause page-level moves through the form,
+  triggering display of a new form screen.</p>
+
+  <dl>
+    <dt><code>REQ_NEXT_PAGE</code>
+    </dt>
+
+    <dd>Move to the next form page.</dd>
+
+    <dt><code>REQ_PREV_PAGE</code>
+    </dt>
+
+    <dd>Move to the previous form page.</dd>
+
+    <dt><code>REQ_FIRST_PAGE</code>
+    </dt>
+
+    <dd>Move to the first form page.</dd>
+
+    <dt><code>REQ_LAST_PAGE</code>
+    </dt>
+
+    <dd>Move to the last form page.</dd>
+  </dl>
+
+  <p>These requests treat the list as cyclic; that is,
+  <code>REQ_NEXT_PAGE</code> from the last page goes to the first,
+  and <code>REQ_PREV_PAGE</code> from the first page goes to the
+  last.</p>
+
+  <h4><a name="ffield" id="ffield">Inter-Field Navigation
+  Requests</a></h4>
+
+  <p>These requests handle navigation between fields on the same
+  page.</p>
+
+  <dl>
+    <dt><code>REQ_NEXT_FIELD</code>
+    </dt>
+
+    <dd>Move to next field.</dd>
+
+    <dt><code>REQ_PREV_FIELD</code>
+    </dt>
+
+    <dd>Move to previous field.</dd>
+
+    <dt><code>REQ_FIRST_FIELD</code>
+    </dt>
+
+    <dd>Move to the first field.</dd>
+
+    <dt><code>REQ_LAST_FIELD</code>
+    </dt>
+
+    <dd>Move to the last field.</dd>
+
+    <dt><code>REQ_SNEXT_FIELD</code>
+    </dt>
+
+    <dd>Move to sorted next field.</dd>
+
+    <dt><code>REQ_SPREV_FIELD</code>
+    </dt>
+
+    <dd>Move to sorted previous field.</dd>
+
+    <dt><code>REQ_SFIRST_FIELD</code>
+    </dt>
+
+    <dd>Move to the sorted first field.</dd>
+
+    <dt><code>REQ_SLAST_FIELD</code>
+    </dt>
+
+    <dd>Move to the sorted last field.</dd>
+
+    <dt><code>REQ_LEFT_FIELD</code>
+    </dt>
+
+    <dd>Move left to field.</dd>
+
+    <dt><code>REQ_RIGHT_FIELD</code>
+    </dt>
+
+    <dd>Move right to field.</dd>
+
+    <dt><code>REQ_UP_FIELD</code>
+    </dt>
+
+    <dd>Move up to field.</dd>
+
+    <dt><code>REQ_DOWN_FIELD</code>
+    </dt>
+
+    <dd>Move down to field.</dd>
+  </dl>
+
+  <p>These requests treat the list of fields on a page as cyclic;
+  that is, <code>REQ_NEXT_FIELD</code> from the last field goes to
+  the first, and <code>REQ_PREV_FIELD</code> from the first field
+  goes to the last. The order of the fields for these (and the
+  <code>REQ_FIRST_FIELD</code> and <code>REQ_LAST_FIELD</code>
+  requests) is simply the order of the field pointers in the form
+  array (as set up by <code>new_form()</code> or
+  <code>set_form_fields()</code></p>
+
+  <p>It is also possible to traverse the fields as if they had been
+  sorted in screen-position order, so the sequence goes
+  left-to-right and top-to-bottom. To do this, use the second group
+  of four sorted-movement requests.</p>
+
+  <p>Finally, it is possible to move between fields using visual
+  directions up, down, right, and left. To accomplish this, use the
+  third group of four requests. Note, however, that the position of
+  a form for purposes of these requests is its upper-left
+  corner.</p>
+
+  <p>For example, suppose you have a multi-line field B, and two
+  single-line fields A and C on the same line with B, with A to the
+  left of B and C to the right of B. A <code>REQ_MOVE_RIGHT</code>
+  from A will go to B only if A, B, and C <em>all</em> share the
+  same first line; otherwise it will skip over B to C.</p>
+
+  <h4><a name="fifield" id="fifield">Intra-Field Navigation
+  Requests</a></h4>
+
+  <p>These requests drive movement of the edit cursor within the
+  currently selected field.</p>
+
+  <dl>
+    <dt><code>REQ_NEXT_CHAR</code>
+    </dt>
+
+    <dd>Move to next character.</dd>
+
+    <dt><code>REQ_PREV_CHAR</code>
+    </dt>
+
+    <dd>Move to previous character.</dd>
+
+    <dt><code>REQ_NEXT_LINE</code>
+    </dt>
+
+    <dd>Move to next line.</dd>
+
+    <dt><code>REQ_PREV_LINE</code>
+    </dt>
+
+    <dd>Move to previous line.</dd>
+
+    <dt><code>REQ_NEXT_WORD</code>
+    </dt>
+
+    <dd>Move to next word.</dd>
+
+    <dt><code>REQ_PREV_WORD</code>
+    </dt>
+
+    <dd>Move to previous word.</dd>
+
+    <dt><code>REQ_BEG_FIELD</code>
+    </dt>
+
+    <dd>Move to beginning of field.</dd>
+
+    <dt><code>REQ_END_FIELD</code>
+    </dt>
+
+    <dd>Move to end of field.</dd>
+
+    <dt><code>REQ_BEG_LINE</code>
+    </dt>
+
+    <dd>Move to beginning of line.</dd>
+
+    <dt><code>REQ_END_LINE</code>
+    </dt>
+
+    <dd>Move to end of line.</dd>
+
+    <dt><code>REQ_LEFT_CHAR</code>
+    </dt>
+
+    <dd>Move left in field.</dd>
+
+    <dt><code>REQ_RIGHT_CHAR</code>
+    </dt>
+
+    <dd>Move right in field.</dd>
+
+    <dt><code>REQ_UP_CHAR</code>
+    </dt>
+
+    <dd>Move up in field.</dd>
+
+    <dt><code>REQ_DOWN_CHAR</code>
+    </dt>
+
+    <dd>Move down in field.</dd>
+  </dl>
+
+  <p>Each <em>word</em> is separated from the previous and next
+  characters by whitespace. The commands to move to beginning and
+  end of line or field look for the first or last non-pad character
+  in their ranges.</p>
+
+  <h4><a name="fscroll" id="fscroll">Scrolling Requests</a></h4>
+
+  <p>Fields that are dynamic and have grown and fields explicitly
+  created with offscreen rows are scrollable. One-line fields
+  scroll horizontally; multi-line fields scroll vertically. Most
+  scrolling is triggered by editing and intra-field movement (the
+  library scrolls the field to keep the cursor visible). It is
+  possible to explicitly request scrolling with the following
+  requests:</p>
+
+  <dl>
+    <dt><code>REQ_SCR_FLINE</code>
+    </dt>
+
+    <dd>Scroll vertically forward a line.</dd>
+
+    <dt><code>REQ_SCR_BLINE</code>
+    </dt>
+
+    <dd>Scroll vertically backward a line.</dd>
+
+    <dt><code>REQ_SCR_FPAGE</code>
+    </dt>
+
+    <dd>Scroll vertically forward a page.</dd>
+
+    <dt><code>REQ_SCR_BPAGE</code>
+    </dt>
+
+    <dd>Scroll vertically backward a page.</dd>
+
+    <dt><code>REQ_SCR_FHPAGE</code>
+    </dt>
+
+    <dd>Scroll vertically forward half a page.</dd>
+
+    <dt><code>REQ_SCR_BHPAGE</code>
+    </dt>
+
+    <dd>Scroll vertically backward half a page.</dd>
+
+    <dt><code>REQ_SCR_FCHAR</code>
+    </dt>
+
+    <dd>Scroll horizontally forward a character.</dd>
+
+    <dt><code>REQ_SCR_BCHAR</code>
+    </dt>
+
+    <dd>Scroll horizontally backward a character.</dd>
+
+    <dt><code>REQ_SCR_HFLINE</code>
+    </dt>
+
+    <dd>Scroll horizontally one field width forward.</dd>
+
+    <dt><code>REQ_SCR_HBLINE</code>
+    </dt>
+
+    <dd>Scroll horizontally one field width backward.</dd>
+
+    <dt><code>REQ_SCR_HFHALF</code>
+    </dt>
+
+    <dd>Scroll horizontally one half field width forward.</dd>
+
+    <dt><code>REQ_SCR_HBHALF</code>
+    </dt>
+
+    <dd>Scroll horizontally one half field width backward.</dd>
+  </dl>
+
+  <p>For scrolling purposes, a <em>page</em> of a field is the
+  height of its visible part.</p>
+
+  <h4><a name="fedit" id="fedit">Editing Requests</a></h4>
+
+  <p>When you pass the forms driver an ASCII character, it is
+  treated as a request to add the character to the field's data
+  buffer. Whether this is an insertion or a replacement depends on
+  the field's edit mode (insertion is the default.</p>
+
+  <p>The following requests support editing the field and changing
+  the edit mode:</p>
+
+  <dl>
+    <dt><code>REQ_INS_MODE</code>
+    </dt>
+
+    <dd>Set insertion mode.</dd>
+
+    <dt><code>REQ_OVL_MODE</code>
+    </dt>
+
+    <dd>Set overlay mode.</dd>
+
+    <dt><code>REQ_NEW_LINE</code>
+    </dt>
+
+    <dd>New line request (see below for explanation).</dd>
+
+    <dt><code>REQ_INS_CHAR</code>
+    </dt>
+
+    <dd>Insert space at character location.</dd>
+
+    <dt><code>REQ_INS_LINE</code>
+    </dt>
+
+    <dd>Insert blank line at character location.</dd>
+
+    <dt><code>REQ_DEL_CHAR</code>
+    </dt>
+
+    <dd>Delete character at cursor.</dd>
+
+    <dt><code>REQ_DEL_PREV</code>
+    </dt>
+
+    <dd>Delete previous word at cursor.</dd>
+
+    <dt><code>REQ_DEL_LINE</code>
+    </dt>
+
+    <dd>Delete line at cursor.</dd>
+
+    <dt><code>REQ_DEL_WORD</code>
+    </dt>
+
+    <dd>Delete word at cursor.</dd>
+
+    <dt><code>REQ_CLR_EOL</code>
+    </dt>
+
+    <dd>Clear to end of line.</dd>
+
+    <dt><code>REQ_CLR_EOF</code>
+    </dt>
+
+    <dd>Clear to end of field.</dd>
+
+    <dt><code>REQ_CLEAR_FIELD</code>
+    </dt>
+
+    <dd>Clear entire field.</dd>
+  </dl>
+
+  <p>The behavior of the <code>REQ_NEW_LINE</code> and
+  <code>REQ_DEL_PREV</code> requests is complicated and partly
+  controlled by a pair of forms options. The special cases are
+  triggered when the cursor is at the beginning of a field, or on
+  the last line of the field.</p>
+
+  <p>First, we consider <code>REQ_NEW_LINE</code>:</p>
+
+  <p>The normal behavior of <code>REQ_NEW_LINE</code> in insert
+  mode is to break the current line at the position of the edit
+  cursor, inserting the portion of the current line after the
+  cursor as a new line following the current and moving the cursor
+  to the beginning of that new line (you may think of this as
+  inserting a newline in the field buffer).</p>
+
+  <p>The normal behavior of <code>REQ_NEW_LINE</code> in overlay
+  mode is to clear the current line from the position of the edit
+  cursor to end of line. The cursor is then moved to the beginning
+  of the next line.</p>
+
+  <p>However, <code>REQ_NEW_LINE</code> at the beginning of a
+  field, or on the last line of a field, instead does a
+  <code>REQ_NEXT_FIELD</code>. <code>O_NL_OVERLOAD</code> option is
+  off, this special action is disabled.</p>
+
+  <p>Now, let us consider <code>REQ_DEL_PREV</code>:</p>
+
+  <p>The normal behavior of <code>REQ_DEL_PREV</code> is to delete
+  the previous character. If insert mode is on, and the cursor is
+  at the start of a line, and the text on that line will fit on the
+  previous one, it instead appends the contents of the current line
+  to the previous one and deletes the current line (you may think
+  of this as deleting a newline from the field buffer).</p>
+
+  <p>However, <code>REQ_DEL_PREV</code> at the beginning of a field
+  is instead treated as a <code>REQ_PREV_FIELD</code>.</p>
+
+  <p>If the <code>O_BS_OVERLOAD</code> option is off, this special
+  action is disabled and the forms driver just returns
+  <code>E_REQUEST_DENIED</code>.</p>
+
+  <p>See <a href="#frmoptions">Form Options</a> for discussion of
+  how to set and clear the overload options.</p>
+
+  <h4><a name="forder" id="forder">Order Requests</a></h4>
+
+  <p>If the type of your field is ordered, and has associated
+  functions for getting the next and previous values of the type
+  from a given value, there are requests that can fetch that value
+  into the field buffer:</p>
+
+  <dl>
+    <dt><code>REQ_NEXT_CHOICE</code>
+    </dt>
+
+    <dd>Place the successor value of the current value in the
+    buffer.</dd>
+
+    <dt><code>REQ_PREV_CHOICE</code>
+    </dt>
+
+    <dd>Place the predecessor value of the current value in the
+    buffer.</dd>
+  </dl>
+
+  <p>Of the built-in field types, only <code>TYPE_ENUM</code> has
+  built-in successor and predecessor functions. When you define a
+  field type of your own (see <a href="#fcustom">Custom Validation
+  Types</a>), you can associate our own ordering functions.</p>
+
+  <h4><a name="fappcmds" id="fappcmds">Application Commands</a></h4>
+
+  <p>Form requests are represented as integers above the
+  <code>curses</code> value greater than <code>KEY_MAX</code> and
+  less than or equal to the constant <code>MAX_COMMAND</code>. If
+  your input-virtualization routine returns a value above
+  <code>MAX_COMMAND</code>, the forms driver will ignore it.</p>
+
+  <h3><a name="fhooks" id="fhooks">Field Change Hooks</a></h3>
+
+  <p>It is possible to set function hooks to be executed whenever
+  the current field or form changes. Here are the functions that
+  support this:</p>
+
+  <pre class="code-block">
+typedef void    (*HOOK)();       /* pointer to function returning void */
+
+int set_form_init(FORM *form,    /* form to alter */
+                  HOOK hook);    /* initialization hook */
+
+HOOK form_init(FORM *form);      /* form to query */
+
+int set_form_term(FORM *form,    /* form to alter */
+                  HOOK hook);    /* termination hook */
+
+HOOK form_term(FORM *form);      /* form to query */
+
+int set_field_init(FORM *form,   /* form to alter */
+                  HOOK hook);    /* initialization hook */
+
+HOOK field_init(FORM *form);     /* form to query */
+
+int set_field_term(FORM *form,   /* form to alter */
+                  HOOK hook);    /* termination hook */
+
+HOOK field_term(FORM *form);     /* form to query */
+</pre>
+  <p>These functions allow you to either set or query four
+  different hooks. In each of the set functions, the second
+  argument should be the address of a hook function. These
+  functions differ only in the timing of the hook call.</p>
+
+  <dl>
+    <dt>form_init</dt>
+
+    <dd>This hook is called when the form is posted; also, just
+    after each page change operation.</dd>
+
+    <dt>field_init</dt>
+
+    <dd>This hook is called when the form is posted; also, just
+    after each field change</dd>
+
+    <dt>field_term</dt>
+
+    <dd>This hook is called just after field validation; that is,
+    just before the field is altered. It is also called when the
+    form is unposted.</dd>
+
+    <dt>form_term</dt>
+
+    <dd>This hook is called when the form is unposted; also, just
+    before each page change operation.</dd>
+  </dl>
+
+  <p>Calls to these hooks may be triggered</p>
+
+  <ol>
+    <li>When user editing requests are processed by the forms
+    driver</li>
+
+    <li>When the current page is changed by
+    <code>set_current_field()</code> call</li>
+
+    <li>When the current field is changed by a
+    <code>set_form_page()</code> call</li>
+  </ol>
+
+  <p>See <a name="ffocus" id="ffocus">Field Change Commands</a> for
+  discussion of the latter two cases.</p>
+
+  <p>You can set a default hook for all fields by passing one of
+  the set functions a NULL first argument.</p>
+
+  <p>You can disable any of these hooks by (re)setting them to
+  NULL, the default value.</p>
+
+  <h3><a href="#ffocus">Field Change Commands</a></h3>
+
+  <p>Normally, navigation through the form will be driven by the
+  user's input requests. But sometimes it is useful to be able to
+  move the focus for editing and viewing under control of your
+  application, or ask which field it currently is in. The following
+  functions help you accomplish this:</p>
+
+  <pre class="code-block">
+int set_current_field(FORM *form,         /* form to alter */
+                      FIELD *field);      /* field to shift to */
+
+FIELD *current_field(FORM *form);         /* form to query */
+
+int field_index(FORM *form,               /* form to query */
+                FIELD *field);            /* field to get index of */
+</pre>
+  <p>The function <code>field_index()</code> returns the index of
+  the given field in the given form's field array (the array passed
+  to <code>new_form()</code> or
+  <code>set_form_fields()</code>).</p>
+
+  <p>The initial current field of a form is the first active field
+  on the first page. The function <code>set_form_fields()</code>
+  resets this.</p>
+
+  <p>It is also possible to move around by pages.</p>
+
+  <pre class="code-block">
+int set_form_page(FORM *form,             /* form to alter */
+                  int page);              /* page to go to (0-origin) */
+
+int form_page(FORM *form);                /* return form's current page */
+</pre>
+  <p>The initial page of a newly-created form is 0. The function
+  <code>set_form_fields()</code> resets this.</p>
+
+  <h3><a name="frmoptions" id="frmoptions">Form Options</a></h3>
+
+  <p>Like fields, forms may have control option bits. They can be
+  changed or queried with these functions:</p>
+
+  <pre class="code-block">
+int set_form_opts(FORM *form,             /* form to alter */
+                  int attr);              /* attribute to set */
+
+int form_opts_on(FORM *form,              /* form to alter */
+                 int attr);               /* attributes to turn on */
+
+int form_opts_off(FORM *form,             /* form to alter */
+                  int attr);              /* attributes to turn off */
+
+int form_opts(FORM *form);                /* form to query */
+</pre>
+  <p>By default, all options are on. Here are the available option
+  bits:</p>
+
+  <dl>
+    <dt>O_NL_OVERLOAD</dt>
+
+    <dd>Enable overloading of <code>REQ_NEW_LINE</code> as
+    described in <a href="#fedit">Editing Requests</a>. The value
+    of this option is ignored on dynamic fields that have not
+    reached their size limit; these have no last line, so the
+    circumstances for triggering a <code>REQ_NEXT_FIELD</code>
+    never arise.</dd>
+
+    <dt>O_BS_OVERLOAD</dt>
+
+    <dd>Enable overloading of <code>REQ_DEL_PREV</code> as
+    described in <a href="#fedit">Editing Requests</a>.</dd>
+  </dl>
+
+  <p>The option values are bit-masks and can be composed with
+  logical-or in the obvious way.</p>
+
+  <h3><a name="fcustom" id="fcustom">Custom Validation Types</a></h3>
+
+  <p>The <code>form</code> library gives you the capability to
+  define custom validation types of your own. Further, the optional
+  additional arguments of <code>set_field_type</code> effectively
+  allow you to parameterize validation types. Most of the
+  complications in the validation-type interface have to do with
+  the handling of the additional arguments within custom validation
+  functions.</p>
+
+  <h4><a name="flinktypes" id="flinktypes">Union Types</a></h4>
+
+  <p>The simplest way to create a custom data type is to compose it
+  from two preexisting ones:</p>
+
+  <pre class="code-block">
+FIELD *link_fieldtype(FIELDTYPE *type1,
+                      FIELDTYPE *type2);
+</pre>
+  <p>This function creates a field type that will accept any of the
+  values legal for either of its argument field types (which may be
+  either predefined or programmer-defined). If a
+  <code>set_field_type()</code> call later requires arguments, the
+  new composite type expects all arguments for the first type, than
+  all arguments for the second. Order functions (see <a href=
+  "#forder">Order Requests</a>) associated with the component types
+  will work on the composite; what it does is check the validation
+  function for the first type, then for the second, to figure what
+  type the buffer contents should be treated as.</p>
+
+  <h4><a name="fnewtypes" id="fnewtypes">New Field Types</a></h4>
+
+  <p>To create a field type from scratch, you need to specify one
+  or both of the following things:</p>
+
+  <ul>
+    <li>A character-validation function, to check each character as
+    it is entered.</li>
+
+    <li>A field-validation function to be applied on exit from the
+    field.</li>
+  </ul>
+
+  <p>Here is how you do that:</p>
+
+  <pre class="code-block">
+typedef int     (*HOOK)();       /* pointer to function returning int */
+
+FIELDTYPE *new_fieldtype(HOOK f_validate, /* field validator */
+                         HOOK c_validate) /* character validator */
+
+int free_fieldtype(FIELDTYPE *ftype);     /* type to free */
+</pre>
+  <p>At least one of the arguments of <code>new_fieldtype()</code>
+  must be non-NULL. The forms driver will automatically call the
+  new type's validation functions at appropriate points in
+  processing a field of the new type.</p>
+
+  <p>The function <code>free_fieldtype()</code> deallocates the
+  argument fieldtype, freeing all storage associated with it.</p>
+
+  <p>Normally, a field validator is called when the user attempts
+  to leave the field. Its first argument is a field pointer, from
+  which it can get to field buffer 0 and test it. If the function
+  returns TRUE, the operation succeeds; if it returns FALSE, the
+  edit cursor stays in the field.</p>
+
+  <p>A character validator gets the character passed in as a first
+  argument. It too should return TRUE if the character is valid,
+  FALSE otherwise.</p>
+
+  <h4><a name="fcheckargs" id="fcheckargs">Validation Function
+  Arguments</a></h4>
+
+  <p>Your field- and character- validation functions will be passed
+  a second argument as well. This second argument is the address of
+  a structure (which we will call a <em>pile</em>) built from any
+  of the field-type-specific arguments passed to
+  <code>set_field_type()</code>. If no such arguments are defined
+  for the field type, this pile pointer argument will be NULL.</p>
+
+  <p>In order to arrange for such arguments to be passed to your
+  validation functions, you must associate a small set of
+  storage-management functions with the type. The forms driver will
+  use these to synthesize a pile from the trailing arguments of
+  each <code>set_field_type()</code> argument, and a pointer to the
+  pile will be passed to the validation functions.</p>
+
+  <p>Here is how you make the association:</p>
+
+  <pre class="code-block">
+typedef char    *(*PTRHOOK)();    /* pointer to function returning (char *) */
+typedef void    (*VOIDHOOK)();    /* pointer to function returning void */
+
+int set_fieldtype_arg(FIELDTYPE *type,    /* type to alter */
+                      PTRHOOK make_str,   /* make structure from args */
+                      PTRHOOK copy_str,   /* make copy of structure */
+                      VOIDHOOK free_str); /* free structure storage */
+</pre>
+  <p>Here is how the storage-management hooks are used:</p>
+
+  <dl>
+    <dt><code>make_str</code>
+    </dt>
+
+    <dd>This function is called by <code>set_field_type()</code>.
+    It gets one argument, a <code>va_list</code> of the
+    type-specific arguments passed to
+    <code>set_field_type()</code>. It is expected to return a pile
+    pointer to a data structure that encapsulates those
+    arguments.</dd>
+
+    <dt><code>copy_str</code>
+    </dt>
+
+    <dd>This function is called by form library functions that
+    allocate new field instances. It is expected to take a pile
+    pointer, copy the pile to allocated storage, and return the
+    address of the pile copy.</dd>
+
+    <dt><code>free_str</code>
+    </dt>
+
+    <dd>This function is called by field- and type-deallocation
+    routines in the library. It takes a pile pointer argument, and
+    is expected to free the storage of that pile.</dd>
+  </dl>
+
+  <p>The <code>make_str</code> and <code>copy_str</code> functions
+  may return NULL to signal allocation failure. The library
+  routines will that call them will return error indication when
+  this happens. Thus, your validation functions should never see a
+  NULL file pointer and need not check specially for it.</p>
+
+  <h4><a name="fcustorder" id="fcustorder">Order Functions For
+  Custom Types</a></h4>
+
+  <p>Some custom field types are simply ordered in the same
+  well-defined way that <code>TYPE_ENUM</code> is. For such types,
+  it is possible to define successor and predecessor functions to
+  support the <code>REQ_NEXT_CHOICE</code> and
+  <code>REQ_PREV_CHOICE</code> requests. Here is how:</p>
+
+  <pre class="code-block">
+typedef int     (*INTHOOK)();     /* pointer to function returning int */
+
+int set_fieldtype_arg(FIELDTYPE *type,    /* type to alter */
+                      INTHOOK succ,       /* get successor value */
+                      INTHOOK pred);      /* get predecessor value */
+</pre>
+  <p>The successor and predecessor arguments will each be passed
+  two arguments; a field pointer, and a pile pointer (as for the
+  validation functions). They are expected to use the function
+  <code>field_buffer()</code> to read the current value, and
+  <code>set_field_buffer()</code> on buffer 0 to set the next or
+  previous value. Either hook may return TRUE to indicate success
+  (a legal next or previous value was set) or FALSE to indicate
+  failure.</p>
+
+  <h4><a name="fcustprobs" id="fcustprobs">Avoiding Problems</a></h4>
+
+  <p>The interface for defining custom types is complicated and
+  tricky. Rather than attempting to create a custom type entirely
+  from scratch, you should start by studying the library source
+  code for whichever of the pre-defined types seems to be closest
+  to what you want.</p>
+
+  <p>Use that code as a model, and evolve it towards what you
+  really want. You will avoid many problems and annoyances that
+  way. The code in the <code>ncurses</code> library has been
+  specifically exempted from the package copyright to support
+  this.</p>
+
+  <p>If your custom type defines order functions, have do something
+  intuitive with a blank field. A useful convention is to make the
+  successor of a blank field the types minimum value, and its
+  predecessor the maximum.</p>
+</body>
+</html>
diff --git a/doc/ncurses-intro.doc b/doc/ncurses-intro.doc
new file mode 100644
index 0000000..a20ee1a
--- /dev/null
+++ b/doc/ncurses-intro.doc
@@ -0,0 +1,2519 @@
+                         Writing Programs with NCURSES
+
+Writing Programs with NCURSES
+
+     by Eric S. Raymond and Zeyd M. Ben-Halim
+     updates since release 1.9.9e by Thomas Dickey
+
+Contents
+
+     * Introduction
+          + A Brief History of Curses
+          + Scope of This Document
+          + Terminology
+     * The Curses Library
+          + An Overview of Curses
+               o Compiling Programs using Curses
+               o Updating the Screen
+               o Standard Windows and Function Naming Conventions
+               o Variables
+          + Using the Library
+               o Starting up
+               o Output
+               o Input
+               o Using Forms Characters
+               o Character Attributes and Color
+               o Mouse Interfacing
+               o Finishing Up
+          + Function Descriptions
+               o Initialization and Wrapup
+               o Causing Output to the Terminal
+               o Low-Level Capability Access
+               o Debugging
+          + Hints, Tips, and Tricks
+               o Some Notes of Caution
+               o Temporarily Leaving ncurses Mode
+               o Using ncurses under xterm
+               o Handling Multiple Terminal Screens
+               o Testing for Terminal Capabilities
+               o Tuning for Speed
+               o Special Features of ncurses
+          + Compatibility with Older Versions
+               o Refresh of Overlapping Windows
+               o Background Erase
+          + XSI Curses Conformance
+     * The Panels Library
+          + Compiling With the Panels Library
+          + Overview of Panels
+          + Panels, Input, and the Standard Screen
+          + Hiding Panels
+          + Miscellaneous Other Facilities
+     * The Menu Library
+          + Compiling with the menu Library
+          + Overview of Menus
+          + Selecting items
+          + Menu Display
+          + Menu Windows
+          + Processing Menu Input
+          + Miscellaneous Other Features
+     * The Forms Library
+          + Compiling with the forms Library
+          + Overview of Forms
+          + Creating and Freeing Fields and Forms
+          + Fetching and Changing Field Attributes
+               o Fetching Size and Location Data
+               o Changing the Field Location
+               o The Justification Attribute
+               o Field Display Attributes
+               o Field Option Bits
+               o Field Status
+               o Field User Pointer
+          + Variable-Sized Fields
+          + Field Validation
+               o TYPE_ALPHA
+               o TYPE_ALNUM
+               o TYPE_ENUM
+               o TYPE_INTEGER
+               o TYPE_NUMERIC
+               o TYPE_REGEXP
+          + Direct Field Buffer Manipulation
+          + Attributes of Forms
+          + Control of Form Display
+          + Input Processing in the Forms Driver
+               o Page Navigation Requests
+               o Inter-Field Navigation Requests
+               o Intra-Field Navigation Requests
+               o Scrolling Requests
+               o Field Editing Requests
+               o Order Requests
+               o Application Commands
+          + Field Change Hooks
+          + Field Change Commands
+          + Form Options
+          + Custom Validation Types
+               o Union Types
+               o New Field Types
+               o Validation Function Arguments
+               o Order Functions For Custom Types
+               o Avoiding Problems
+     _________________________________________________________________
+
+Introduction
+
+   This document is an introduction to programming with curses. It is not
+   an   exhaustive  reference  for  the  curses  Application  Programming
+   Interface  (API);  that  role  is  filled  by the curses manual pages.
+   Rather,  it  is  intended  to  help  C programmers ease into using the
+   package.
+
+   This   document  is  aimed  at  C  applications  programmers  not  yet
+   specifically  familiar with ncurses. If you are already an experienced
+   curses  programmer, you should nevertheless read the sections on Mouse
+   Interfacing,  Debugging, Compatibility with Older Versions, and Hints,
+   Tips,  and  Tricks.  These  will  bring you up to speed on the special
+   features  and  quirks of the ncurses implementation. If you are not so
+   experienced, keep reading.
+
+   The  curses  package  is a subroutine library for terminal-independent
+   screen-painting  and  input-event handling which presents a high level
+   screen  model  to  the programmer, hiding differences between terminal
+   types  and doing automatic optimization of output to change one screen
+   full  of  text into another. Curses uses terminfo, which is a database
+   format  that  can  describe the capabilities of thousands of different
+   terminals.
+
+   The  curses  API  may  seem  something of an archaism on UNIX desktops
+   increasingly  dominated  by  X,  Motif, and Tcl/Tk. Nevertheless, UNIX
+   still  supports  tty lines and X supports xterm(1); the curses API has
+   the advantage of (a) back-portability to character-cell terminals, and
+   (b)  simplicity.  For  an application that does not require bit-mapped
+   graphics  and multiple fonts, an interface implementation using curses
+   will  typically  be  a  great deal simpler and less expensive than one
+   using an X toolkit.
+
+  A Brief History of Curses
+
+   Historically, the first ancestor of curses was the routines written to
+   provide  screen-handling  for  the  vi  editor; these used the termcap
+   database  facility  (both  released  in  3BSD) for describing terminal
+   capabilities. These routines were abstracted into a documented library
+   and  first released with the early BSD UNIX versions. All of this work
+   was  done  by  students  at  the  University  of  California (Berkeley
+   campus).  The  curses  library  was  first published in 4.0BSD, a year
+   after 3BSD (i.e., late 1980).
+
+   After  graduation,  one  of  those  students went to work at AT&T Bell
+   Labs,  and  made  an  improved  termcap library called terminfo (i.e.,
+   "libterm"),  and  adapted  the  curses  library  to use this. That was
+   subsequently  released in System V Release 2 (early 1984). Thereafter,
+   other  developers  added  to  the  curses  and terminfo libraries. For
+   instance,  a  student at Cornell University wrote an improved terminfo
+   library  as well as a tool (tic) to compile the terminal descriptions.
+   As  a  general  rule,  AT&T  did  not  identify  the developers in the
+   source-code  or  documentation;  the  tic and infocmp programs are the
+   exceptions.
+
+   System  V  Release  3  (System  III  UNIX)  from  Bell Labs featured a
+   rewritten and much-improved curses library, along with the tic program
+   (late 1986).
+
+   To  recap,  terminfo  is  based  on  Berkeley's  termcap database, but
+   contains  a  number  of  improvements  and  extensions.  Parameterized
+   capabilities  strings  were introduced, making it possible to describe
+   multiple  video  attributes, and colors and to handle far more unusual
+   terminals  than  possible  with  termcap.  In  the later AT&T System V
+   releases,  curses  evolved  to  use  more  facilities  and  offer more
+   capabilities, going far beyond BSD curses in power and flexibility.
+
+  Scope of This Document
+
+   This document describes ncurses, a free implementation of the System V
+   curses  API  with  some  clearly  marked  extensions.  It includes the
+   following System V curses features:
+     * Support  for  multiple  screen  highlights  (BSD curses could only
+       handle one "standout" highlight, usually reverse-video).
+     * Support for line- and box-drawing using forms characters.
+     * Recognition of function keys on input.
+     * Color support.
+     * Support  for pads (windows of larger than screen size on which the
+       screen or a subwindow defines a viewport).
+
+   Also,  this  package  makes  use  of  the  insert  and delete line and
+   character  features  of  terminals  so equipped, and determines how to
+   optimally  use  these  features  with  no help from the programmer. It
+   allows  arbitrary  combinations  of  video attributes to be displayed,
+   even  on  terminals  that  leave "magic cookies" on the screen to mark
+   changes in attributes.
+
+   The  ncurses  package  can  also  capture and use event reports from a
+   mouse in some environments (notably, xterm under the X window system).
+   This document includes tips for using the mouse.
+
+   The  ncurses  package  was  originated  by  Pavel Curtis. The original
+   maintainer  of  this  package is Zeyd Ben-Halim <zmbenhal@netcom.com>.
+   Eric S. Raymond <esr@snark.thyrsus.com> wrote many of the new features
+   in  versions  after 1.8.1 and wrote most of this introduction. Juergen
+   Pfeifer  wrote  all  of  the  menu and forms code as well as the Ada95
+   binding.  Ongoing  work  is  being done by Thomas Dickey (maintainer).
+   Contact the current maintainers at bug-ncurses@gnu.org.
+
+   This  document  also describes the panels extension library, similarly
+   modeled  on  the  SVr4  panels  facility.  This  library allows you to
+   associate  backing  store  with each of a stack or deck of overlapping
+   windows,  and  provides  operations  for  moving windows around in the
+   stack that change their visibility in the natural way (handling window
+   overlaps).
+
+   Finally,  this  document  describes  in  detail  the  menus  and forms
+   extension  libraries,  also  cloned  from System V, which support easy
+   construction and sequences of menus and fill-in forms.
+
+  Terminology
+
+   In  this  document,  the following terminology is used with reasonable
+   consistency:
+
+   window
+          A  data  structure  describing  a  sub-rectangle  of the screen
+          (possibly  the  entire  screen).  You  can write to a window as
+          though  it  were a miniature screen, scrolling independently of
+          other windows on the physical screen.
+
+   screens
+          A  subset of windows which are as large as the terminal screen,
+          i.e.,  they  start  at the upper left hand corner and encompass
+          the   lower  right  hand  corner.  One  of  these,  stdscr,  is
+          automatically provided for the programmer.
+
+   terminal screen
+          The package's idea of what the terminal display currently looks
+          like, i.e., what the user sees now. This is a special screen.
+
+The Curses Library
+
+  An Overview of Curses
+
+    Compiling Programs using Curses
+
+   In order to use the library, it is necessary to have certain types and
+   variables defined. Therefore, the programmer must have a line:
+          #include <curses.h>
+
+   at the top of the program source. The screen package uses the Standard
+   I/O   library,  so  <curses.h>  includes  <stdio.h>.  <curses.h>  also
+   includes  <termios.h>,  <termio.h>,  or  <sgtty.h>  depending  on your
+   system.  It is redundant (but harmless) for the programmer to do these
+   includes,  too.  In  linking with curses you need to have -lncurses in
+   your  LDFLAGS  or  on the command line. There is no need for any other
+   libraries.
+
+    Updating the Screen
+
+   In  order  to  update  the  screen  optimally, it is necessary for the
+   routines  to  know  what  the screen currently looks like and what the
+   programmer  wants  it to look like next. For this purpose, a data type
+   (structure)  named WINDOW is defined which describes a window image to
+   the  routines,  including its starting position on the screen (the (y,
+   x)  coordinates  of  the  upper left hand corner) and its size. One of
+   these  (called  curscr,  for current screen) is a screen image of what
+   the  terminal currently looks like. Another screen (called stdscr, for
+   standard screen) is provided by default to make changes on.
+
+   A  window is a purely internal representation. It is used to build and
+   store a potential image of a portion of the terminal. It does not bear
+   any necessary relation to what is really on the terminal screen; it is
+   more like a scratchpad or write buffer.
+
+   To  make  the  section  of  physical  screen corresponding to a window
+   reflect  the  contents  of the window structure, the routine refresh()
+   (or wrefresh() if the window is not stdscr) is called.
+
+   A  given physical screen section may be within the scope of any number
+   of  overlapping  windows.  Also, changes can be made to windows in any
+   order,  without  regard  to  motion  efficiency.  Then,  at  will, the
+   programmer  can  effectively say "make it look like this," and let the
+   package implementation determine the most efficient way to repaint the
+   screen.
+
+    Standard Windows and Function Naming Conventions
+
+   As  hinted  above,  the  routines can use several windows, but two are
+   automatically given: curscr, which knows what the terminal looks like,
+   and  stdscr,  which  is what the programmer wants the terminal to look
+   like  next.  The  user  should  never actually access curscr directly.
+   Changes  should  be  made  to  through  the  API, and then the routine
+   refresh() (or wrefresh()) called.
+
+   Many  functions  are  defined  to  use stdscr as a default screen. For
+   example,  to  add  a  character  to stdscr, one calls addch() with the
+   desired character as argument. To write to a different window. use the
+   routine  waddch()  (for  window-specific  addch())  is  provided. This
+   convention of prepending function names with a "w" when they are to be
+   applied  to specific windows is consistent. The only routines which do
+   not follow it are those for which a window must always be specified.
+
+   In  order  to  move  the  current (y, x) coordinates from one point to
+   another,  the routines move() and wmove() are provided. However, it is
+   often  desirable to first move and then perform some I/O operation. In
+   order  to  avoid  clumsiness, most I/O routines can be preceded by the
+   prefix  "mv"  and  the  desired  (y,  x)  coordinates prepended to the
+   arguments to the function. For example, the calls
+          move(y, x);
+          addch(ch);
+
+   can be replaced by
+          mvaddch(y, x, ch);
+
+   and
+          wmove(win, y, x);
+          waddch(win, ch);
+
+   can be replaced by
+          mvwaddch(win, y, x, ch);
+
+   Note  that the window description pointer (win) comes before the added
+   (y,  x)  coordinates.  If  a function requires a window pointer, it is
+   always the first parameter passed.
+
+    Variables
+
+   The  curses  library  sets  some  variables  describing  the  terminal
+   capabilities.
+      type   name      description
+      ------------------------------------------------------------------
+      int    LINES     number of lines on the terminal
+      int    COLS      number of columns on the terminal
+
+   The  curses.h  also  introduces  some  #define  constants and types of
+   general usefulness:
+
+   bool
+          boolean type, actually a "char" (e.g., bool doneit;)
+
+   TRUE
+          boolean "true" flag (1).
+
+   FALSE
+          boolean "false" flag (0).
+
+   ERR
+          error flag returned by routines on a failure (-1).
+
+   OK
+          error flag returned by routines when things go right.
+
+  Using the Library
+
+   Now  we  describe  how  to  actually use the screen package. In it, we
+   assume  all  updating,  reading,  etc.  is  applied  to  stdscr. These
+   instructions  will  work  on  any  window,  providing  you  change the
+   function names and parameters as mentioned above.
+
+   Here is a sample program to motivate the discussion:
+#include <stdlib.h>
+#include <curses.h>
+#include <signal.h>
+
+static void finish(int sig);
+
+int
+main(int argc, char *argv[])
+{
+    int num = 0;
+
+    /* initialize your non-curses data structures here */
+
+    (void) signal(SIGINT, finish);      /* arrange interrupts to terminate */
+
+    (void) initscr();      /* initialize the curses library */
+    keypad(stdscr, TRUE);  /* enable keyboard mapping */
+    (void) nonl();         /* tell curses not to do NL->CR/NL on output */
+    (void) cbreak();       /* take input chars one at a time, no wait for \n */
+    (void) echo();         /* echo input - in color */
+
+    if (has_colors())
+    {
+        start_color();
+
+        /*
+         * Simple color assignment, often all we need.  Color pair 0 cannot
+         * be redefined.  This example uses the same value for the color
+         * pair as for the foreground color, though of course that is not
+         * necessary:
+         */
+        init_pair(1, COLOR_RED,     COLOR_BLACK);
+        init_pair(2, COLOR_GREEN,   COLOR_BLACK);
+        init_pair(3, COLOR_YELLOW,  COLOR_BLACK);
+        init_pair(4, COLOR_BLUE,    COLOR_BLACK);
+        init_pair(5, COLOR_CYAN,    COLOR_BLACK);
+        init_pair(6, COLOR_MAGENTA, COLOR_BLACK);
+        init_pair(7, COLOR_WHITE,   COLOR_BLACK);
+    }
+
+    for (;;)
+    {
+        int c = getch();     /* refresh, accept single keystroke of input */
+        attrset(COLOR_PAIR(num % 8));
+        num++;
+
+        /* process the command keystroke */
+    }
+
+    finish(0);               /* we are done */
+}
+
+static void finish(int sig)
+{
+    endwin();
+
+    /* do your non-curses wrapup here */
+
+    exit(0);
+}
+
+    Starting up
+
+   In  order  to  use  the  screen  package, the routines must know about
+   terminal  characteristics, and the space for curscr and stdscr must be
+   allocated.  These  function initscr() does both these things. Since it
+   must  allocate  space  for  the  windows,  it can overflow memory when
+   attempting  to  do  so.  On the rare occasions this happens, initscr()
+   will  terminate  the  program  with  an  error message. initscr() must
+   always  be  called before any of the routines which affect windows are
+   used.  If  it  is  not,  the  program will core dump as soon as either
+   curscr  or  stdscr are referenced. However, it is usually best to wait
+   to  call  it  until  after  you  are sure you will need it, like after
+   checking  for  startup  errors. Terminal status changing routines like
+   nl() and cbreak() should be called after initscr().
+
+   Once  the  screen windows have been allocated, you can set them up for
+   your  program.  If  you  want  to,  say, allow a screen to scroll, use
+   scrollok().  If you want the cursor to be left in place after the last
+   change,  use  leaveok().  If this is not done, refresh() will move the
+   cursor to the window's current (y, x) coordinates after updating it.
+
+   You  can  create new windows of your own using the functions newwin(),
+   derwin(), and subwin(). The routine delwin() will allow you to get rid
+   of  old windows. All the options described above can be applied to any
+   window.
+
+    Output
+
+   Now  that  we  have set things up, we will want to actually update the
+   terminal.  The basic functions used to change what will go on a window
+   are addch() and move(). addch() adds a character at the current (y, x)
+   coordinates. move() changes the current (y, x) coordinates to whatever
+   you want them to be. It returns ERR if you try to move off the window.
+   As  mentioned above, you can combine the two into mvaddch() to do both
+   things at once.
+
+   The  other  output  functions, such as addstr() and printw(), all call
+   addch() to add characters to the window.
+
+   After  you  have  put on the window what you want there, when you want
+   the  portion  of the terminal covered by the window to be made to look
+   like  it,  you  must  call  refresh().  In  order  to optimize finding
+   changes,  refresh()  assumes  that  any part of the window not changed
+   since  the  last  refresh() of that window has not been changed on the
+   terminal,  i.e., that you have not refreshed a portion of the terminal
+   with  an  overlapping  window.  If  this  is not the case, the routine
+   touchwin() is provided to make it look like the entire window has been
+   changed,  thus  making  refresh()  check  the  whole subsection of the
+   terminal for changes.
+
+   If  you  call wrefresh() with curscr as its argument, it will make the
+   screen  look  like  curscr  thinks  it  looks like. This is useful for
+   implementing  a  command  which would redraw the screen in case it get
+   messed up.
+
+    Input
+
+   The  complementary  function  to  addch() is getch() which, if echo is
+   set, will call addch() to echo the character. Since the screen package
+   needs  to know what is on the terminal at all times, if characters are
+   to  be  echoed, the tty must be in raw or cbreak mode. Since initially
+   the terminal has echoing enabled and is in ordinary "cooked" mode, one
+   or  the  other  has  to changed before calling getch(); otherwise, the
+   program's output will be unpredictable.
+
+   When you need to accept line-oriented input in a window, the functions
+   wgetstr() and friends are available. There is even a wscanw() function
+   that  can  do  scanf()(3)-style  multi-field  parsing on window input.
+   These  pseudo-line-oriented  functions  turn  on  echoing  while  they
+   execute.
+
+   The  example  code  above uses the call keypad(stdscr, TRUE) to enable
+   support  for function-key mapping. With this feature, the getch() code
+   watches  the  input  stream for character sequences that correspond to
+   arrow   and   function   keys.   These   sequences   are  returned  as
+   pseudo-character values. The #define values returned are listed in the
+   curses.h The mapping from sequences to #define values is determined by
+   key_ capabilities in the terminal's terminfo entry.
+
+    Using Forms Characters
+
+   The  addch()  function (and some others, including box() and border())
+   can accept some pseudo-character arguments which are specially defined
+   by  ncurses.  These  are #define values set up in the curses.h header;
+   see there for a complete list (look for the prefix ACS_).
+
+   The  most  useful of the ACS defines are the forms-drawing characters.
+   You  can  use  these to draw boxes and simple graphs on the screen. If
+   the  terminal does not have such characters, curses.h will map them to
+   a recognizable (though ugly) set of ASCII defaults.
+
+    Character Attributes and Color
+
+   The  ncurses  package  supports  screen highlights including standout,
+   reverse-video,  underline, and blink. It also supports color, which is
+   treated as another kind of highlight.
+
+   Highlights   are   encoded,   internally,   as   high   bits   of  the
+   pseudo-character  type  (chtype)  that  curses.h uses to represent the
+   contents of a screen cell. See the curses.h header file for a complete
+   list of highlight mask values (look for the prefix A_).
+
+   There  are two ways to make highlights. One is to logical-or the value
+   of  the  highlights you want into the character argument of an addch()
+   call, or any other output call that takes a chtype argument.
+
+   The  other is to set the current-highlight value. This is logical-ORed
+   with  any  highlight  you  specify the first way. You do this with the
+   functions attron(), attroff(), and attrset(); see the manual pages for
+   details.  Color  is  a special kind of highlight. The package actually
+   thinks  in  terms  of  color  pairs,  combinations  of  foreground and
+   background  colors.  The  sample code above sets up eight color pairs,
+   all  of the guaranteed-available colors on black. Note that each color
+   pair  is, in effect, given the name of its foreground color. Any other
+   range  of  eight  non-conflicting  values  could have been used as the
+   first arguments of the init_pair() values.
+
+   Once  you  have done an init_pair() that creates color-pair N, you can
+   use  COLOR_PAIR(N)  as  a highlight that invokes that particular color
+   combination.  Note  that  COLOR_PAIR(N),  for  constant N, is itself a
+   compile-time constant and can be used in initializers.
+
+    Mouse Interfacing
+
+   The ncurses library also provides a mouse interface.
+
+     NOTE:  this  facility  is  specific  to  ncurses, it is not part of
+     either  the XSI Curses standard, nor of System V Release 4, nor BSD
+     curses.  System  V  Release  4  curses  contains  code with similar
+     interface  definitions, however it is not documented. Other than by
+     disassembling  the library, we have no way to determine exactly how
+     that   mouse   code   works.  Thus,  we  recommend  that  you  wrap
+     mouse-related   code   in   an   #ifdef  using  the  feature  macro
+     NCURSES_MOUSE_VERSION  so  it  will  not  be compiled and linked on
+     non-ncurses systems.
+
+   Presently, mouse event reporting works in the following environments:
+     * xterm and similar programs such as rxvt.
+     * Linux  console,  when  configured with gpm(1), Alessandro Rubini's
+       mouse server.
+     * FreeBSD sysmouse (console)
+     * OS/2 EMX
+
+   The  mouse  interface  is  very  simple.  To  activate it, you use the
+   function  mousemask(),  passing  it  as first argument a bit-mask that
+   specifies  what  kinds  of  events you want your program to be able to
+   see.  It  will  return  the  bit-mask  of  events that actually become
+   visible, which may differ from the argument if the mouse device is not
+   capable of reporting some of the event types you specify.
+
+   Once the mouse is active, your application's command loop should watch
+   for  a  return  value of KEY_MOUSE from wgetch(). When you see this, a
+   mouse  event report has been queued. To pick it off the queue, use the
+   function  getmouse()  (you  must  do  this  before  the next wgetch(),
+   otherwise  another  mouse  event  might come in and make the first one
+   inaccessible).
+
+   Each  call  to  getmouse() fills a structure (the address of which you
+   will  pass  it)  with  mouse  event  data.  The  event  data  includes
+   zero-origin,  screen-relative  character-cell coordinates of the mouse
+   pointer.  It  also  includes  an event mask. Bits in this mask will be
+   set, corresponding to the event type being reported.
+
+   The  mouse  structure  contains  two  additional  fields  which may be
+   significant  in  the  future  as  ncurses  interfaces  to new kinds of
+   pointing  device.  In addition to x and y coordinates, there is a slot
+   for  a  z coordinate; this might be useful with touch-screens that can
+   return  a  pressure  or  duration parameter. There is also a device ID
+   field,  which  could  be used to distinguish between multiple pointing
+   devices.
+
+   The   class  of  visible  events  may  be  changed  at  any  time  via
+   mousemask().  Events  that  can be reported include presses, releases,
+   single-,   double-   and   triple-clicks  (you  can  set  the  maximum
+   button-down  time for clicks). If you do not make clicks visible, they
+   will  be  reported  as  press-release pairs. In some environments, the
+   event  mask  may  include  bits reporting the state of shift, alt, and
+   ctrl keys on the keyboard during the event.
+
+   A  function  to check whether a mouse event fell within a given window
+   is  also  supplied.  You  can  use  this to see whether a given window
+   should consider a mouse event relevant to it.
+
+   Because   mouse   event   reporting  will  not  be  available  in  all
+   environments,  it  would  be unwise to build ncurses applications that
+   require  the  use  of  a  mouse. Rather, you should use the mouse as a
+   shortcut  for point-and-shoot commands your application would normally
+   accept  from  the  keyboard.  Two  of  the  test  games in the ncurses
+   distribution  (bs  and  knight) contain code that illustrates how this
+   can be done.
+
+   See   the   manual   page  curs_mouse(3X)  for  full  details  of  the
+   mouse-interface functions.
+
+    Finishing Up
+
+   In  order to clean up after the ncurses routines, the routine endwin()
+   is  provided.  It  restores tty modes to what they were when initscr()
+   was  first called, and moves the cursor down to the lower-left corner.
+   Thus,  anytime  after  the  call to initscr, endwin() should be called
+   before exiting.
+
+  Function Descriptions
+
+   We  describe  the detailed behavior of some important curses functions
+   here, as a supplement to the manual page descriptions.
+
+    Initialization and Wrapup
+
+   initscr()
+          The  first  function  called should almost always be initscr().
+          This  will  determine  the  terminal type and initialize curses
+          data structures. initscr() also arranges that the first call to
+          refresh()  will  clear the screen. If an error occurs a message
+          is  written  to standard error and the program exits. Otherwise
+          it  returns  a pointer to stdscr. A few functions may be called
+          before  initscr (slk_init(), filter(), ripoffline(), use_env(),
+          and, if you are using multiple terminals, newterm().)
+
+   endwin()
+          Your  program  should  always  call  endwin() before exiting or
+          shelling  out  of  the  program. This function will restore tty
+          modes,  move the cursor to the lower left corner of the screen,
+          reset  the  terminal  into  the proper non-visual mode. Calling
+          refresh()  or  doupdate()  after  a  temporary  escape from the
+          program will restore the ncurses screen from before the escape.
+
+   newterm(type, ofp, ifp)
+          A  program  which  outputs to more than one terminal should use
+          newterm() instead of initscr(). newterm() should be called once
+          for each terminal. It returns a variable of type SCREEN * which
+          should  be  saved  as  a  reference  to that terminal. (NOTE: a
+          SCREEN  variable is not a screen in the sense we are describing
+          in  this  introduction,  but a collection of parameters used to
+          assist  in  optimizing the display.) The arguments are the type
+          of the terminal (a string) and FILE pointers for the output and
+          input  of  the  terminal.  If type is NULL then the environment
+          variable  $TERM  is used. endwin() should called once at wrapup
+          time for each terminal opened using this function.
+
+   set_term(new)
+          This  function  is  used  to  switch  to  a  different terminal
+          previously  opened  by  newterm(). The screen reference for the
+          new  terminal is passed as the parameter. The previous terminal
+          is  returned  by  the function. All other calls affect only the
+          current terminal.
+
+   delscreen(sp)
+          The  inverse  of  newterm();  deallocates  the  data structures
+          associated with a given SCREEN reference.
+
+    Causing Output to the Terminal
+
+   refresh() and wrefresh(win)
+          These  functions  must  be called to actually get any output on
+          the   terminal,   as  other  routines  merely  manipulate  data
+          structures.  wrefresh() copies the named window to the physical
+          terminal  screen,  taking into account what is already there in
+          order  to do optimizations. refresh() does a refresh of stdscr.
+          Unless  leaveok()  has been enabled, the physical cursor of the
+          terminal is left at the location of the window's cursor.
+
+   doupdate() and wnoutrefresh(win)
+          These two functions allow multiple updates with more efficiency
+          than  wrefresh.  To use them, it is important to understand how
+          curses  works. In addition to all the window structures, curses
+          keeps  two  data structures representing the terminal screen: a
+          physical screen, describing what is actually on the screen, and
+          a  virtual screen, describing what the programmer wants to have
+          on the screen. wrefresh works by first copying the named window
+          to  the  virtual  screen (wnoutrefresh()), and then calling the
+          routine  to  update  the screen (doupdate()). If the programmer
+          wishes  to output several windows at once, a series of calls to
+          wrefresh will result in alternating calls to wnoutrefresh() and
+          doupdate(),  causing several bursts of output to the screen. By
+          calling  wnoutrefresh() for each window, it is then possible to
+          call  doupdate()  once,  resulting in only one burst of output,
+          with  fewer  total  characters  transmitted (this also avoids a
+          visually annoying flicker at each update).
+
+    Low-Level Capability Access
+
+   setupterm(term, filenum, errret)
+          This  routine is called to initialize a terminal's description,
+          without setting up the curses screen structures or changing the
+          tty-driver mode bits. term is the character string representing
+          the  name  of the terminal being used. filenum is the UNIX file
+          descriptor  of  the terminal to be used for output. errret is a
+          pointer to an integer, in which a success or failure indication
+          is  returned. The values returned can be 1 (all is well), 0 (no
+          such  terminal),  or  -1  (some  problem  locating the terminfo
+          database).
+
+          The  value  of  term can be given as NULL, which will cause the
+          value of TERM in the environment to be used. The errret pointer
+          can  also be given as NULL, meaning no error code is wanted. If
+          errret is defaulted, and something goes wrong, setupterm() will
+          print  an  appropriate  error  message  and  exit,  rather than
+          returning.  Thus,  a simple program can call setupterm(0, 1, 0)
+          and not worry about initialization errors.
+
+          After  the call to setupterm(), the global variable cur_term is
+          set to point to the current structure of terminal capabilities.
+          By  calling  setupterm()  for  each  terminal,  and  saving and
+          restoring  cur_term, it is possible for a program to use two or
+          more  terminals  at  once.  Setupterm()  also  stores the names
+          section  of  the  terminal  description in the global character
+          array ttytype[]. Subsequent calls to setupterm() will overwrite
+          this array, so you will have to save it yourself if need be.
+
+    Debugging
+
+     NOTE: These functions are not part of the standard curses API!
+
+   trace()
+          This  function  can be used to explicitly set a trace level. If
+          the  trace  level  is  nonzero,  execution of your program will
+          generate a file called "trace" in the current working directory
+          containing  a  report  on  the  library's actions. Higher trace
+          levels  enable  more  detailed  (and  verbose) reporting -- see
+          comments  attached  to  TRACE_ defines in the curses.h file for
+          details. (It is also possible to set a trace level by assigning
+          a trace level value to the environment variable NCURSES_TRACE).
+
+   _tracef()
+          This  function  can  be  used  to  output  your  own  debugging
+          information.  It  is  only  available  only  if  you  link with
+          -lncurses_g.  It  can be used the same way as printf(), only it
+          outputs  a  newline after the end of arguments. The output goes
+          to a file called trace in the current directory.
+
+   Trace  logs  can  be difficult to interpret due to the sheer volume of
+   data dumped in them. There is a script called tracemunch included with
+   the  ncurses distribution that can alleviate this problem somewhat; it
+   compacts  long  sequences  of  similar  operations  into more succinct
+   single-line  pseudo-operations.  These pseudo-ops can be distinguished
+   by the fact that they are named in capital letters.
+
+  Hints, Tips, and Tricks
+
+   The ncurses manual pages are a complete reference for this library. In
+   the remainder of this document, we discuss various useful methods that
+   may not be obvious from the manual page descriptions.
+
+    Some Notes of Caution
+
+   If  you  find yourself thinking you need to use noraw() or nocbreak(),
+   think  again  and  move carefully. It is probably better design to use
+   getstr()  or one of its relatives to simulate cooked mode. The noraw()
+   and  nocbreak() functions try to restore cooked mode, but they may end
+   up   clobbering   some  control  bits  set  before  you  started  your
+   application.  Also,  they  have always been poorly documented, and are
+   likely   to  hurt  your  application's  usability  with  other  curses
+   libraries.
+
+   Bear  in mind that refresh() is a synonym for wrefresh(stdscr). Do not
+   try  to  mix use of stdscr with use of windows declared by newwin(); a
+   refresh()  call will blow them off the screen. The right way to handle
+   this  is  to  use  subwin(),  or not touch stdscr at all and tile your
+   screen  with  declared windows which you then wnoutrefresh() somewhere
+   in  your  program event loop, with a single doupdate() call to trigger
+   actual repainting.
+
+   You  are  much  less  likely  to  run into problems if you design your
+   screen   layouts   to  use  tiled  rather  than  overlapping  windows.
+   Historically,  curses  support  for overlapping windows has been weak,
+   fragile,  and  poorly  documented.  The  ncurses library is not yet an
+   exception to this rule.
+
+   There  is  a  panels library included in the ncurses distribution that
+   does  a  pretty  good  job  of  strengthening  the overlapping-windows
+   facilities.
+
+   Try to avoid using the global variables LINES and COLS. Use getmaxyx()
+   on  the stdscr context instead. Reason: your code may be ported to run
+   in  an  environment with window resizes, in which case several screens
+   could be open with different sizes.
+
+    Temporarily Leaving NCURSES Mode
+
+   Sometimes  you  will  want  to write a program that spends most of its
+   time  in  screen  mode,  but occasionally returns to ordinary "cooked"
+   mode.  A common reason for this is to support shell-out. This behavior
+   is simple to arrange in ncurses.
+
+   To  leave  ncurses  mode,  call  endwin()  as  you  would  if you were
+   intending  to terminate the program. This will take the screen back to
+   cooked  mode;  you  can  do your shell-out. When you want to return to
+   ncurses  mode,  simply call refresh() or doupdate(). This will repaint
+   the screen.
+
+   There  is  a  boolean function, isendwin(), which code can use to test
+   whether ncurses screen mode is active. It returns TRUE in the interval
+   between an endwin() call and the following refresh(), FALSE otherwise.
+
+   Here is some sample code for shellout:
+    addstr("Shelling out...");
+    def_prog_mode();           /* save current tty modes */
+    endwin();                  /* restore original tty modes */
+    system("sh");              /* run shell */
+    addstr("returned.\n");     /* prepare return message */
+    refresh();                 /* restore save modes, repaint screen */
+
+    Using NCURSES under XTERM
+
+   A  resize  operation  in  X  sends SIGWINCH to the application running
+   under  xterm.  The  easiest way to handle SIGWINCH is to do an endwin,
+   followed  by  an  refresh  and a screen repaint you code yourself. The
+   refresh will pick up the new screen size from the xterm's environment.
+
+   That  is the standard way, of course (it even works with some vendor's
+   curses  implementations). Its drawback is that it clears the screen to
+   reinitialize the display, and does not resize subwindows which must be
+   shrunk.   Ncurses  provides  an  extension  which  works  better,  the
+   resizeterm  function.  That  function  ensures  that  all  windows are
+   limited  to  the new screen dimensions, and pads stdscr with blanks if
+   the screen is larger.
+
+   The ncurses library provides a SIGWINCH signal handler, which pushes a
+   KEY_RESIZE  via the wgetch() calls. When ncurses returns that code, it
+   calls  resizeterm  to update the size of the standard screen's window,
+   repainting that (filling with blanks or truncating as needed). It also
+   resizes other windows, but its effect may be less satisfactory because
+   it  cannot  know  how you want the screen re-painted. You will usually
+   have to write special-purpose code to handle KEY_RESIZE yourself.
+
+    Handling Multiple Terminal Screens
+
+   The initscr() function actually calls a function named newterm() to do
+   most  of  its  work.  If you are writing a program that opens multiple
+   terminals, use newterm() directly.
+
+   For  each call, you will have to specify a terminal type and a pair of
+   file  pointers;  each  call will return a screen reference, and stdscr
+   will be set to the last one allocated. You will switch between screens
+   with  the  set_term  call.  Note  that  you  will  also  have  to call
+   def_shell_mode and def_prog_mode on each tty yourself.
+
+    Testing for Terminal Capabilities
+
+   Sometimes you may want to write programs that test for the presence of
+   various  capabilities before deciding whether to go into ncurses mode.
+   An  easy way to do this is to call setupterm(), then use the functions
+   tigetflag(), tigetnum(), and tigetstr() to do your testing.
+
+   A  particularly  useful  case  of this often comes up when you want to
+   test  whether  a  given  terminal  type  should  be treated as "smart"
+   (cursor-addressable) or "stupid". The right way to test this is to see
+   if the return value of tigetstr("cup") is non-NULL. Alternatively, you
+   can  include  the  term.h  file  and  test  the  value  of  the  macro
+   cursor_address.
+
+    Tuning for Speed
+
+   Use  the  addchstr()  family  of functions for fast screen-painting of
+   text  when  you know the text does not contain any control characters.
+   Try  to  make attribute changes infrequent on your screens. Do not use
+   the immedok() option!
+
+    Special Features of NCURSES
+
+   The  wresize()  function  allows  you to resize a window in place. The
+   associated   resizeterm()  function  simplifies  the  construction  of
+   SIGWINCH handlers, for resizing all windows.
+
+   The define_key() function allows you to define at runtime function-key
+   control  sequences  which  are  not  in  the terminal description. The
+   keyok()   function   allows  you  to  temporarily  enable  or  disable
+   interpretation of any function-key control sequence.
+
+   The use_default_colors() function allows you to construct applications
+   which  can use the terminal's default foreground and background colors
+   as  an  additional "default" color. Several terminal emulators support
+   this feature, which is based on ISO 6429.
+
+   Ncurses  supports  up 16 colors, unlike SVr4 curses which defines only
+   8. While most terminals which provide color allow only 8 colors, about
+   a quarter (including XFree86 xterm) support 16 colors.
+
+  Compatibility with Older Versions
+
+   Despite  our  best efforts, there are some differences between ncurses
+   and  the  (undocumented!)  behavior  of  older curses implementations.
+   These  arise from ambiguities or omissions in the documentation of the
+   API.
+
+    Refresh of Overlapping Windows
+
+   If  you  define two windows A and B that overlap, and then alternately
+   scribble  on  and  refresh  them,  the changes made to the overlapping
+   region  under  historic  curses  versions  were  often  not documented
+   precisely.
+
+   To  understand why this is a problem, remember that screen updates are
+   calculated  between  two  representations  of  the entire display. The
+   documentation  says that when you refresh a window, it is first copied
+   to  the  virtual screen, and then changes are calculated to update the
+   physical  screen (and applied to the terminal). But "copied to" is not
+   very specific, and subtle differences in how copying works can produce
+   different behaviors in the case where two overlapping windows are each
+   being refreshed at unpredictable intervals.
+
+   What  happens to the overlapping region depends on what wnoutrefresh()
+   does  with  its  argument  --  what portions of the argument window it
+   copies  to  the virtual screen. Some implementations do "change copy",
+   copying  down  only locations in the window that have changed (or been
+   marked  changed  with wtouchln() and friends). Some implementations do
+   "entire  copy",  copying  all  window  locations to the virtual screen
+   whether or not they have changed.
+
+   The  ncurses  library  itself  has  not always been consistent on this
+   score.  Due  to  a  bug,  versions  1.8.7  to  1.9.8a did entire copy.
+   Versions  1.8.6  and  older,  and  versions 1.9.9 and newer, do change
+   copy.
+
+   For  most  commercial curses implementations, it is not documented and
+   not  known  for sure (at least not to the ncurses maintainers) whether
+   they  do  change  copy or entire copy. We know that System V release 3
+   curses  has  logic in it that looks like an attempt to do change copy,
+   but  the  surrounding  logic and data representations are sufficiently
+   complex,  and  our knowledge sufficiently indirect, that it is hard to
+   know  whether  this  is  reliable.  It  is  not  clear  what  the SVr4
+   documentation  and XSI standard intend. The XSI Curses standard barely
+   mentions  wnoutrefresh();  the  SVr4  documents  seem to be describing
+   entire-copy, but it is possible with some effort and straining to read
+   them the other way.
+
+   It  might  therefore  be unwise to rely on either behavior in programs
+   that  might  have  to  be  linked  with  other curses implementations.
+   Instead,  you  can do an explicit touchwin() before the wnoutrefresh()
+   call to guarantee an entire-contents copy anywhere.
+
+   The  really clean way to handle this is to use the panels library. If,
+   when  you want a screen update, you do update_panels(), it will do all
+   the  necessary  wnoutrefresh() calls for whatever panel stacking order
+   you  have  defined. Then you can do one doupdate() and there will be a
+   single burst of physical I/O that will do all your updates.
+
+    Background Erase
+
+   If you have been using a very old versions of ncurses (1.8.7 or older)
+   you  may be surprised by the behavior of the erase functions. In older
+   versions,  erased  areas of a window were filled with a blank modified
+   by  the  window's  current attribute (as set by wattrset(), wattron(),
+   wattroff() and friends).
+
+   In  newer  versions,  this is not so. Instead, the attribute of erased
+   blanks  is  normal  unless  and  until it is modified by the functions
+   bkgdset() or wbkgdset().
+
+   This change in behavior conforms ncurses to System V Release 4 and the
+   XSI Curses standard.
+
+  XSI Curses Conformance
+
+   The  ncurses  library is intended to be base-level conformant with the
+   XSI  Curses  standard  from  X/Open.  Many extended-level features (in
+   fact,  almost all features not directly concerned with wide characters
+   and internationalization) are also supported.
+
+   One  effect  of  XSI  conformance  is the change in behavior described
+   under "Background Erase -- Compatibility with Old Versions".
+
+   Also,  ncurses  meets the XSI requirement that every macro entry point
+   have  a  corresponding  function  which  may  be  linked  (and will be
+   prototype-checked) if the macro definition is disabled with #undef.
+
+The Panels Library
+
+   The  ncurses  library  by  itself  provides  good  support  for screen
+   displays in which the windows are tiled (non-overlapping). In the more
+   general  case  that  windows  may overlap, you have to use a series of
+   wnoutrefresh()  calls  followed  by a doupdate(), and be careful about
+   the order you do the window refreshes in. It has to be bottom-upwards,
+   otherwise parts of windows that should be obscured will show through.
+
+   When  your  interface design is such that windows may dive deeper into
+   the  visibility  stack  or  pop  to  the top at runtime, the resulting
+   book-keeping  can  be  tedious  and  difficult to get right. Hence the
+   panels library.
+
+   The  panel  library  first  appeared  in  AT&T  System  V. The version
+   documented here is the panel code distributed with ncurses.
+
+  Compiling With the Panels Library
+
+   Your  panels-using modules must import the panels library declarations
+   with
+          #include <panel.h>
+
+   and must be linked explicitly with the panels library using an -lpanel
+   argument.  Note  that  they  must  also  link the ncurses library with
+   -lncurses. Many linkers are two-pass and will accept either order, but
+   it is still good practice to put -lpanel first and -lncurses second.
+
+  Overview of Panels
+
+   A  panel  object  is  a window that is implicitly treated as part of a
+   deck  including  all  other  panel  objects.  The deck has an implicit
+   bottom-to-top  visibility order. The panels library includes an update
+   function (analogous to refresh()) that displays all panels in the deck
+   in  the proper order to resolve overlaps. The standard window, stdscr,
+   is considered below all panels.
+
+   Details  on  the  panels  functions are available in the man pages. We
+   will just hit the highlights here.
+
+   You  create  a  panel from a window by calling new_panel() on a window
+   pointer.  It  then  becomes the top of the deck. The panel's window is
+   available as the value of panel_window() called with the panel pointer
+   as argument.
+
+   You  can  delete  a  panel (removing it from the deck) with del_panel.
+   This  will  not  deallocate the associated window; you have to do that
+   yourself.  You can replace a panel's window with a different window by
+   calling  replace_window.  The new window may be of different size; the
+   panel  code  will  re-compute  all  overlaps.  This operation does not
+   change the panel's position in the deck.
+
+   To  move  a  panel's window, use move_panel(). The mvwin() function on
+   the  panel's  window  is not sufficient because it does not update the
+   panels  library's  representation  of  where  the  windows  are.  This
+   operation leaves the panel's depth, contents, and size unchanged.
+
+   Two   functions   (top_panel(),   bottom_panel())   are  provided  for
+   rearranging the deck. The first pops its argument window to the top of
+   the  deck;  the second sends it to the bottom. Either operation leaves
+   the panel's screen location, contents, and size unchanged.
+
+   The  function update_panels() does all the wnoutrefresh() calls needed
+   to prepare for doupdate() (which you must call yourself, afterwards).
+
+   Typically,  you  will want to call update_panels() and doupdate() just
+   before accepting command input, once in each cycle of interaction with
+   the  user.  If  you  call  update_panels()  after each and every panel
+   write,  you  will  generate  a lot of unnecessary refresh activity and
+   screen flicker.
+
+  Panels, Input, and the Standard Screen
+
+   You should not mix wnoutrefresh() or wrefresh() operations with panels
+   code;  this will work only if the argument window is either in the top
+   panel or unobscured by any other panels.
+
+   The  stsdcr  window  is  a  special  case.  It is considered below all
+   panels. Because changes to panels may obscure parts of stdscr, though,
+   you  should  call update_panels() before doupdate() even when you only
+   change stdscr.
+
+   Note  that  wgetch  automatically  calls  wrefresh.  Therefore, before
+   requesting  input  from  a  panel window, you need to be sure that the
+   panel is totally unobscured.
+
+   There  is  presently  no  way to display changes to one obscured panel
+   without repainting all panels.
+
+  Hiding Panels
+
+   It  is  possible  to  remove  a  panel  from the deck temporarily; use
+   hide_panel  for this. Use show_panel() to render it visible again. The
+   predicate  function  panel_hidden  tests  whether  or  not  a panel is
+   hidden.
+
+   The panel_update code ignores hidden panels. You cannot do top_panel()
+   or  bottom_panel  on  a  hidden  panel().  Other panels operations are
+   applicable.
+
+  Miscellaneous Other Facilities
+
+   It  is possible to navigate the deck using the functions panel_above()
+   and  panel_below.  Handed a panel pointer, they return the panel above
+   or  below  that  panel.  Handed  NULL,  they return the bottom-most or
+   top-most panel.
+
+   Every  panel  has  an  associated  user pointer, not used by the panel
+   code,  to  which  you  can  attach  application data. See the man page
+   documentation of set_panel_userptr() and panel_userptr for details.
+
+The Menu Library
+
+   A menu is a screen display that assists the user to choose some subset
+   of  a  given set of items. The menu library is a curses extension that
+   supports  easy  programming  of  menu  hierarchies  with a uniform but
+   flexible interface.
+
+   The  menu  library  first  appeared  in  AT&T  System  V.  The version
+   documented here is the menu code distributed with ncurses.
+
+  Compiling With the menu Library
+
+   Your menu-using modules must import the menu library declarations with
+          #include <menu.h>
+
+   and  must  be linked explicitly with the menus library using an -lmenu
+   argument.  Note  that  they  must  also  link the ncurses library with
+   -lncurses. Many linkers are two-pass and will accept either order, but
+   it is still good practice to put -lmenu first and -lncurses second.
+
+  Overview of Menus
+
+   The  menus  created  by  this  library consist of collections of items
+   including  a  name  string part and a description string part. To make
+   menus,  you  create  groups  of these items and connect them with menu
+   frame objects.
+
+   The  menu can then by posted, that is written to an associated window.
+   Actually, each menu has two associated windows; a containing window in
+   which  the  programmer can scribble titles or borders, and a subwindow
+   in which the menu items proper are displayed. If this subwindow is too
+   small  to  display  all the items, it will be a scrollable viewport on
+   the collection of items.
+
+   A  menu may also be unposted (that is, undisplayed), and finally freed
+   to  make  the  storage  associated with it and its items available for
+   re-use.
+
+   The general flow of control of a menu program looks like this:
+    1. Initialize curses.
+    2. Create the menu items, using new_item().
+    3. Create the menu using new_menu().
+    4. Post the menu using post_menu().
+    5. Refresh the screen.
+    6. Process user requests via an input loop.
+    7. Unpost the menu using unpost_menu().
+    8. Free the menu, using free_menu().
+    9. Free the items using free_item().
+   10. Terminate curses.
+
+  Selecting items
+
+   Menus  may  be  multi-valued  or  (the default) single-valued (see the
+   manual  page  menu_opts(3x)  to  see  how to change the default). Both
+   types always have a current item.
+
+   From  a  single-valued  menu you can read the selected value simply by
+   looking  at  the  current  item. From a multi-valued menu, you get the
+   selected  set  by  looping through the items applying the item_value()
+   predicate  function.  Your  menu-processing  code can use the function
+   set_item_value() to flag the items in the select set.
+
+   Menu   items   can  be  made  unselectable  using  set_item_opts()  or
+   item_opts_off()  with  the  O_SELECTABLE  argument.  This  is the only
+   option  so  far  defined for menus, but it is good practice to code as
+   though other option bits might be on.
+
+  Menu Display
+
+   The  menu  library  calculates a minimum display size for your window,
+   based on the following variables:
+     * The number and maximum length of the menu items
+     * Whether the O_ROWMAJOR option is enabled
+     * Whether display of descriptions is enabled
+     * Whatever menu format may have been set by the programmer
+     * The  length of the menu mark string used for highlighting selected
+       items
+
+   The  function  set_menu_format() allows you to set the maximum size of
+   the viewport or menu page that will be used to display menu items. You
+   can retrieve any format associated with a menu with menu_format(). The
+   default format is rows=16, columns=1.
+
+   The actual menu page may be smaller than the format size. This depends
+   on  the item number and size and whether O_ROWMAJOR is on. This option
+   (on  by  default) causes menu items to be displayed in a "raster-scan"
+   pattern, so that if more than one item will fit horizontally the first
+   couple  of  items  are side-by-side in the top row. The alternative is
+   column-major  display,  which  tries to put the first several items in
+   the first column.
+
+   As  mentioned above, a menu format not large enough to allow all items
+   to  fit  on-screen  will  result  in a menu display that is vertically
+   scrollable.
+
+   You  can  scroll  it  with  requests to the menu driver, which will be
+   described in the section on menu input handling.
+
+   Each  menu  has a mark string used to visually tag selected items; see
+   the menu_mark(3x) manual page for details. The mark string length also
+   influences the menu page size.
+
+   The  function  scale_menu()  returns the minimum display size that the
+   menu  code  computes  from  all  these  factors.  There are other menu
+   display  attributes  including  a  select  attribute, an attribute for
+   selectable  items,  an  attribute  for  unselectable  items, and a pad
+   character used to separate item name text from description text. These
+   have  reasonable  defaults which the library allows you to change (see
+   the menu_attribs(3x) manual page.
+
+  Menu Windows
+
+   Each  menu has, as mentioned previously, a pair of associated windows.
+   Both these windows are painted when the menu is posted and erased when
+   the menu is unposted.
+
+   The  outer  or  frame  window  is  not  otherwise  touched by the menu
+   routines. It exists so the programmer can associate a title, a border,
+   or  perhaps  help text with the menu and have it properly refreshed or
+   erased at post/unpost time. The inner window or subwindow is where the
+   current menu page is displayed.
+
+   By  default,  both  windows  are  stdscr.  You  can  set them with the
+   functions in menu_win(3x).
+
+   When  you  call post_menu(), you write the menu to its subwindow. When
+   you  call  unpost_menu(), you erase the subwindow, However, neither of
+   these  actually  modifies  the  screen. To do that, call wrefresh() or
+   some equivalent.
+
+  Processing Menu Input
+
+   The  main  loop of your menu-processing code should call menu_driver()
+   repeatedly.  The first argument of this routine is a menu pointer; the
+   second  is  a  menu  command  code. You should write an input-fetching
+   routine that maps input characters to menu command codes, and pass its
+   output  to  menu_driver(). The menu command codes are fully documented
+   in menu_driver(3x).
+
+   The  simplest  group of command codes is REQ_NEXT_ITEM, REQ_PREV_ITEM,
+   REQ_FIRST_ITEM,     REQ_LAST_ITEM,     REQ_UP_ITEM,     REQ_DOWN_ITEM,
+   REQ_LEFT_ITEM,  REQ_RIGHT_ITEM.  These  change  the currently selected
+   item.  These  requests may cause scrolling of the menu page if it only
+   partially displayed.
+
+   There  are  explicit  requests  for  scrolling  which  also change the
+   current  item  (because  the  select location does not change, but the
+   item    there   does).   These   are   REQ_SCR_DLINE,   REQ_SCR_ULINE,
+   REQ_SCR_DPAGE, and REQ_SCR_UPAGE.
+
+   The  REQ_TOGGLE_ITEM  selects or deselects the current item. It is for
+   use  in multi-valued menus; if you use it with O_ONEVALUE on, you will
+   get an error return (E_REQUEST_DENIED).
+
+   Each  menu  has  an associated pattern buffer. The menu_driver() logic
+   tries  to  accumulate  printable  ASCII  characters  passed in in that
+   buffer;  when  it  matches a prefix of an item name, that item (or the
+   next  matching  item)  is selected. If appending a character yields no
+   new  match,  that  character  is  deleted from the pattern buffer, and
+   menu_driver() returns E_NO_MATCH.
+
+   Some  requests  change the pattern buffer directly: REQ_CLEAR_PATTERN,
+   REQ_BACK_PATTERN,  REQ_NEXT_MATCH,  REQ_PREV_MATCH. The latter two are
+   useful  when  pattern  buffer  input  matches  more than one item in a
+   multi-valued menu.
+
+   Each  successful  scroll or item navigation request clears the pattern
+   buffer.  It is also possible to set the pattern buffer explicitly with
+   set_menu_pattern().
+
+   Finally,  menu  driver  requests  above  the  constant MAX_COMMAND are
+   considered   application-specific  commands.  The  menu_driver()  code
+   ignores them and returns E_UNKNOWN_COMMAND.
+
+  Miscellaneous Other Features
+
+   Various  menu  options can affect the processing and visual appearance
+   and input processing of menus. See menu_opts(3x) for details.
+
+   It  is possible to change the current item from application code; this
+   is  useful  if  you  want to write your own navigation requests. It is
+   also  possible  to explicitly set the top row of the menu display. See
+   mitem_current(3x).  If  your  application  needs  to  change  the menu
+   subwindow  cursor for any reason, pos_menu_cursor() will restore it to
+   the correct location for continuing menu driver processing.
+
+   It  is  possible  to set hooks to be called at menu initialization and
+   wrapup   time,   and   whenever   the   selected   item  changes.  See
+   menu_hook(3x).
+
+   Each  item, and each menu, has an associated user pointer on which you
+   can hang application data. See mitem_userptr(3x) and menu_userptr(3x).
+
+The Forms Library
+
+   The  form library is a curses extension that supports easy programming
+   of on-screen forms for data entry and program control.
+
+   The  form  library  first  appeared  in  AT&T  System  V.  The version
+   documented here is the form code distributed with ncurses.
+
+  Compiling With the form Library
+
+   Your form-using modules must import the form library declarations with
+          #include <form.h>
+
+   and  must  be linked explicitly with the forms library using an -lform
+   argument.  Note  that  they  must  also  link the ncurses library with
+   -lncurses. Many linkers are two-pass and will accept either order, but
+   it is still good practice to put -lform first and -lncurses second.
+
+  Overview of Forms
+
+   A  form  is  a  collection of fields; each field may be either a label
+   (explanatory  text)  or  a  data-entry  location.  Long  forms  may be
+   segmented into pages; each entry to a new page clears the screen.
+
+   To  make forms, you create groups of fields and connect them with form
+   frame objects; the form library makes this relatively simple.
+
+   Once  defined,  a form can be posted, that is written to an associated
+   window.  Actually,  each form has two associated windows; a containing
+   window  in  which the programmer can scribble titles or borders, and a
+   subwindow in which the form fields proper are displayed.
+
+   As  the  form  user  fills out the posted form, navigation and editing
+   keys  support  movement between fields, editing keys support modifying
+   field,  and plain text adds to or changes data in a current field. The
+   form  library  allows you (the forms designer) to bind each navigation
+   and  editing  key  to any keystroke accepted by curses Fields may have
+   validation  conditions on them, so that they check input data for type
+   and  value.  The form library supplies a rich set of pre-defined field
+   types, and makes it relatively easy to define new ones.
+
+   Once its transaction is completed (or aborted), a form may be unposted
+   (that  is,  undisplayed),  and  finally  freed  to  make  the  storage
+   associated with it and its items available for re-use.
+
+   The general flow of control of a form program looks like this:
+    1. Initialize curses.
+    2. Create the form fields, using new_field().
+    3. Create the form using new_form().
+    4. Post the form using post_form().
+    5. Refresh the screen.
+    6. Process user requests via an input loop.
+    7. Unpost the form using unpost_form().
+    8. Free the form, using free_form().
+    9. Free the fields using free_field().
+   10. Terminate curses.
+
+   Note  that  this  looks  much  like  a  menu program; the form library
+   handles  tasks  which  are in many ways similar, and its interface was
+   obviously  designed  to  resemble  that  of  the menu library wherever
+   possible.
+
+   In  forms  programs,  however, the "process user requests" is somewhat
+   more   complicated   than  for  menus.  Besides  menu-like  navigation
+   operations, the menu driver loop has to support field editing and data
+   validation.
+
+  Creating and Freeing Fields and Forms
+
+   The basic function for creating fields is new_field():
+FIELD *new_field(int height, int width,   /* new field size */
+                 int top, int left,       /* upper left corner */
+                 int offscreen,           /* number of offscreen rows */
+                 int nbuf);               /* number of working buffers */
+
+   Menu  items  always  occupy  a  single  row, but forms fields may have
+   multiple  rows.  So  new_field()  requires  you to specify a width and
+   height  (the  first  two  arguments,  which  mist both be greater than
+   zero).
+
+   You must also specify the location of the field's upper left corner on
+   the  screen  (the  third  and  fourth arguments, which must be zero or
+   greater).  Note  that  these  coordinates  are  relative  to  the form
+   subwindow,  which will coincide with stdscr by default but need not be
+   stdscr if you have done an explicit set_form_win() call.
+
+   The  fifth argument allows you to specify a number of off-screen rows.
+   If  this  is zero, the entire field will always be displayed. If it is
+   nonzero,  the  form  will  be  scrollable,  with  only one screen-full
+   (initially  the  top  part) displayed at any given time. If you make a
+   field  dynamic and grow it so it will no longer fit on the screen, the
+   form  will  become  scrollable  even  if  the  offscreen  argument was
+   initially zero.
+
+   The  forms library allocates one working buffer per field; the size of
+   each buffer is ((height + offscreen)*width + 1, one character for each
+   position in the field plus a NUL terminator. The sixth argument is the
+   number  of  additional  data  buffers  to allocate for the field; your
+   application can use them for its own purposes.
+FIELD *dup_field(FIELD *field,            /* field to copy */
+                 int top, int left);      /* location of new copy */
+
+   The  function  dup_field()  duplicates  an  existing  field  at  a new
+   location.  Size  and  buffering information are copied; some attribute
+   flags  and  status  bits  are  not  (see  the  form_field_new(3X)  for
+   details).
+FIELD *link_field(FIELD *field,           /* field to copy */
+                  int top, int left);     /* location of new copy */
+
+   The  function  link_field() also duplicates an existing field at a new
+   location.  The difference from dup_field() is that it arranges for the
+   new field's buffer to be shared with the old one.
+
+   Besides  the obvious use in making a field editable from two different
+   form pages, linked fields give you a way to hack in dynamic labels. If
+   you  declare  several fields linked to an original, and then make them
+   inactive,  changes  from  the original will still be propagated to the
+   linked fields.
+
+   As  with duplicated fields, linked fields have attribute bits separate
+   from the original.
+
+   As  you  might  guess,  all these field-allocations return NULL if the
+   field  allocation  is  not  possible  due to an out-of-memory error or
+   out-of-bounds arguments.
+
+   To connect fields to a form, use
+FORM *new_form(FIELD **fields);
+
+   This  function  expects  to  see  a  NULL-terminated  array  of  field
+   pointers.  Said fields are connected to a newly-allocated form object;
+   its address is returned (or else NULL if the allocation fails).
+
+   Note  that  new_field()  does  not copy the pointer array into private
+   storage;  if you modify the contents of the pointer array during forms
+   processing,  all manner of bizarre things might happen. Also note that
+   any given field may only be connected to one form.
+
+   The  functions  free_field() and free_form are available to free field
+   and  form objects. It is an error to attempt to free a field connected
+   to a form, but not vice-versa; thus, you will generally free your form
+   objects first.
+
+  Fetching and Changing Field Attributes
+
+   Each  form  field  has  a  number  of  location  and  size  attributes
+   associated  with  it. There are other field attributes used to control
+   display and editing of the field. Some (for example, the O_STATIC bit)
+   involve  sufficient  complications  to be covered in sections of their
+   own later on. We cover the functions used to get and set several basic
+   attributes here.
+
+   When a field is created, the attributes not specified by the new_field
+   function  are  copied  from  an  invisible  system  default  field. In
+   attribute-setting  and -fetching functions, the argument NULL is taken
+   to mean this field. Changes to it persist as defaults until your forms
+   application terminates.
+
+    Fetching Size and Location Data
+
+   You can retrieve field sizes and locations through:
+int field_info(FIELD *field,              /* field from which to fetch */
+               int *height, *int width,   /* field size */
+               int *top, int *left,       /* upper left corner */
+               int *offscreen,            /* number of offscreen rows */
+               int *nbuf);                /* number of working buffers */
+
+   This  function is a sort of inverse of new_field(); instead of setting
+   size  and  location attributes of a new field, it fetches them from an
+   existing one.
+
+    Changing the Field Location
+
+   It is possible to move a field's location on the screen:
+int move_field(FIELD *field,              /* field to alter */
+               int top, int left);        /* new upper-left corner */
+
+   You can, of course. query the current location through field_info().
+
+    The Justification Attribute
+
+   One-line  fields  may be unjustified, justified right, justified left,
+   or centered. Here is how you manipulate this attribute:
+int set_field_just(FIELD *field,          /* field to alter */
+                   int justmode);         /* mode to set */
+
+int field_just(FIELD *field);             /* fetch mode of field */
+
+   The   mode   values  accepted  and  returned  by  this  functions  are
+   preprocessor  macros NO_JUSTIFICATION, JUSTIFY_RIGHT, JUSTIFY_LEFT, or
+   JUSTIFY_CENTER.
+
+    Field Display Attributes
+
+   For  each  field,  you  can  set  a  foreground  attribute for entered
+   characters,  a  background  attribute  for the entire field, and a pad
+   character  for the unfilled portion of the field. You can also control
+   pagination of the form.
+
+   This  group of four field attributes controls the visual appearance of
+   the  field on the screen, without affecting in any way the data in the
+   field buffer.
+int set_field_fore(FIELD *field,          /* field to alter */
+                   chtype attr);          /* attribute to set */
+
+chtype field_fore(FIELD *field);          /* field to query */
+
+int set_field_back(FIELD *field,          /* field to alter */
+                   chtype attr);          /* attribute to set */
+
+chtype field_back(FIELD *field);          /* field to query */
+
+int set_field_pad(FIELD *field,           /* field to alter */
+                 int pad);                /* pad character to set */
+
+chtype field_pad(FIELD *field);
+
+int set_new_page(FIELD *field,            /* field to alter */
+                 int flag);               /* TRUE to force new page */
+
+chtype new_page(FIELD *field);            /* field to query */
+
+   The attributes set and returned by the first four functions are normal
+   curses(3x)  display  attribute  values  (A_STANDOUT, A_BOLD, A_REVERSE
+   etc).  The page bit of a field controls whether it is displayed at the
+   start of a new form screen.
+
+    Field Option Bits
+
+   There  is  also a large collection of field option bits you can set to
+   control  various  aspects of forms processing. You can manipulate them
+   with these functions:
+int set_field_opts(FIELD *field,          /* field to alter */
+                   int attr);             /* attribute to set */
+
+int field_opts_on(FIELD *field,           /* field to alter */
+                  int attr);              /* attributes to turn on */
+
+int field_opts_off(FIELD *field,          /* field to alter */
+                   int attr);             /* attributes to turn off */
+
+int field_opts(FIELD *field);             /* field to query */
+
+   By default, all options are on. Here are the available option bits:
+
+   O_VISIBLE
+          Controls  whether  the  field  is visible on the screen. Can be
+          used  during form processing to hide or pop up fields depending
+          on the value of parent fields.
+
+   O_ACTIVE
+          Controls  whether  the  field is active during forms processing
+          (i.e.  visited  by  form  navigation keys). Can be used to make
+          labels  or  derived  fields with buffer values alterable by the
+          forms application, not the user.
+
+   O_PUBLIC
+          Controls  whether data is displayed during field entry. If this
+          option  is  turned  off on a field, the library will accept and
+          edit  data  in that field, but it will not be displayed and the
+          visible  field  cursor  will  not  move.  You  can turn off the
+          O_PUBLIC bit to define password fields.
+
+   O_EDIT
+          Controls  whether  the  field's data can be modified. When this
+          option  is off, all editing requests except REQ_PREV_CHOICE and
+          REQ_NEXT_CHOICE  will fail. Such read-only fields may be useful
+          for help messages.
+
+   O_WRAP
+          Controls word-wrapping in multi-line fields. Normally, when any
+          character  of  a  (blank-separated) word reaches the end of the
+          current  line,  the  entire  word  is  wrapped to the next line
+          (assuming there is one). When this option is off, the word will
+          be split across the line break.
+
+   O_BLANK
+          Controls  field  blanking.  When  this option is on, entering a
+          character  at  the first field position erases the entire field
+          (except for the just-entered character).
+
+   O_AUTOSKIP
+          Controls  automatic  skip  to  next  field when this one fills.
+          Normally,  when  the  forms user tries to type more data into a
+          field  than will fit, the editing location jumps to next field.
+          When this option is off, the user's cursor will hang at the end
+          of  the  field.  This  option is ignored in dynamic fields that
+          have not reached their size limit.
+
+   O_NULLOK
+          Controls   whether  validation  is  applied  to  blank  fields.
+          Normally,  it  is not; the user can leave a field blank without
+          invoking  the usual validation check on exit. If this option is
+          off on a field, exit from it will invoke a validation check.
+
+   O_PASSOK
+          Controls whether validation occurs on every exit, or only after
+          the  field  is  modified.  Normally the latter is true. Setting
+          O_PASSOK  may be useful if your field's validation function may
+          change during forms processing.
+
+   O_STATIC
+          Controls  whether the field is fixed to its initial dimensions.
+          If  you  turn  this  off,  the  field  becomes dynamic and will
+          stretch to fit entered data.
+
+   A  field's  options  cannot  be  changed  while the field is currently
+   selected.  However,  options  may be changed on posted fields that are
+   not current.
+
+   The option values are bit-masks and can be composed with logical-or in
+   the obvious way.
+
+  Field Status
+
+   Every field has a status flag, which is set to FALSE when the field is
+   created  and  TRUE when the value in field buffer 0 changes. This flag
+   can be queried and set directly:
+int set_field_status(FIELD *field,      /* field to alter */
+                   int status);         /* mode to set */
+
+int field_status(FIELD *field);         /* fetch mode of field */
+
+   Setting  this  flag under program control can be useful if you use the
+   same form repeatedly, looking for modified fields each time.
+
+   Calling  field_status()  on  a  field not currently selected for input
+   will return a correct value. Calling field_status() on a field that is
+   currently  selected for input may not necessarily give a correct field
+   status value, because entered data is not necessarily copied to buffer
+   zero  before the exit validation check. To guarantee that the returned
+   status  value  reflects reality, call field_status() either (1) in the
+   field's  exit validation check routine, (2) from the field's or form's
+   initialization   or   termination   hooks,   or   (3)   just  after  a
+   REQ_VALIDATION request has been processed by the forms driver.
+
+  Field User Pointer
+
+   Each  field  structure contains one character pointer slot that is not
+   used  by  the forms library. It is intended to be used by applications
+   to store private per-field data. You can manipulate it with:
+int set_field_userptr(FIELD *field,       /* field to alter */
+                   char *userptr);        /* mode to set */
+
+char *field_userptr(FIELD *field);        /* fetch mode of field */
+
+   (Properly,  this  user  pointer field ought to have (void *) type. The
+   (char *) type is retained for System V compatibility.)
+
+   It  is  valid  to  set  the  user pointer of the default field (with a
+   set_field_userptr()  call  passed  a  NULL  field pointer.) When a new
+   field  is  created,  the  default-field  user  pointer  is  copied  to
+   initialize the new field's user pointer.
+
+  Variable-Sized Fields
+
+   Normally,  a  field  is fixed at the size specified for it at creation
+   time.  If,  however, you turn off its O_STATIC bit, it becomes dynamic
+   and  will  automatically  resize  itself  to accommodate data as it is
+   entered.  If the field has extra buffers associated with it, they will
+   grow right along with the main input buffer.
+
+   A  one-line  dynamic  field  will have a fixed height (1) but variable
+   width, scrolling horizontally to display data within the field area as
+   originally  dimensioned  and  located. A multi-line dynamic field will
+   have  a  fixed  width, but variable height (number of rows), scrolling
+   vertically  to  display  data  within  the  field  area  as originally
+   dimensioned and located.
+
+   Normally,  a dynamic field is allowed to grow without limit. But it is
+   possible  to set an upper limit on the size of a dynamic field. You do
+   it with this function:
+int set_max_field(FIELD *field,     /* field to alter (may not be NULL) */
+                   int max_size);   /* upper limit on field size */
+
+   If the field is one-line, max_size is taken to be a column size limit;
+   if  it  is multi-line, it is taken to be a line size limit. To disable
+   any  limit,  use  an argument of zero. The growth limit can be changed
+   whether or not the O_STATIC bit is on, but has no effect until it is.
+
+   The following properties of a field change when it becomes dynamic:
+     * If  there  is  no  growth limit, there is no final position of the
+       field; therefore O_AUTOSKIP and O_NL_OVERLOAD are ignored.
+     * Field justification will be ignored (though whatever justification
+       is set up will be retained internally and can be queried).
+     * The  dup_field() and link_field() calls copy dynamic-buffer sizes.
+       If  the  O_STATIC  option  is set on one of a collection of links,
+       buffer  resizing  will occur only when the field is edited through
+       that link.
+     * The  call  field_info()  will retrieve the original static size of
+       the  field;  use  dynamic_field_info()  to  get the actual dynamic
+       size.
+
+  Field Validation
+
+   By  default,  a  field will accept any data that will fit in its input
+   buffer.  However,  it  is  possible  to  attach a validation type to a
+   field.  If  you  do  this,  any  attempt  to  leave the field while it
+   contains  data that does not match the validation type will fail. Some
+   validation  types also have a character-validity check for each time a
+   character is entered in the field.
+
+   A   field's   validation   check   (if   any)   is   not  called  when
+   set_field_buffer()  modifies the input buffer, nor when that buffer is
+   changed through a linked field.
+
+   The  form library provides a rich set of pre-defined validation types,
+   and  gives  you  the capability to define custom ones of your own. You
+   can  examine and change field validation attributes with the following
+   functions:
+int set_field_type(FIELD *field,          /* field to alter */
+                   FIELDTYPE *ftype,      /* type to associate */
+                   ...);                  /* additional arguments*/
+
+FIELDTYPE *field_type(FIELD *field);      /* field to query */
+
+   The  validation  type  of  a  field  is considered an attribute of the
+   field.  As  with  other field attributes, Also, doing set_field_type()
+   with  a  NULL  field  default  will  change  the  system  default  for
+   validation of newly-created fields.
+
+   Here are the pre-defined validation types:
+
+    TYPE_ALPHA
+
+   This  field  type  accepts  alphabetic  data; no blanks, no digits, no
+   special  characters  (this  is checked at character-entry time). It is
+   set up with:
+int set_field_type(FIELD *field,          /* field to alter */
+                   TYPE_ALPHA,            /* type to associate */
+                   int width);            /* maximum width of field */
+
+   The  width  argument  sets a minimum width of data. Typically you will
+   want  to  set this to the field width; if it is greater than the field
+   width,  the validation check will always fail. A minimum width of zero
+   makes field completion optional.
+
+    TYPE_ALNUM
+
+   This  field  type  accepts  alphabetic  data and digits; no blanks, no
+   special  characters  (this  is checked at character-entry time). It is
+   set up with:
+int set_field_type(FIELD *field,          /* field to alter */
+                   TYPE_ALNUM,            /* type to associate */
+                   int width);            /* maximum width of field */
+
+   The  width  argument sets a minimum width of data. As with TYPE_ALPHA,
+   typically  you  will  want  to  set  this to the field width; if it is
+   greater than the field width, the validation check will always fail. A
+   minimum width of zero makes field completion optional.
+
+    TYPE_ENUM
+
+   This  type  allows  you  to  restrict  a  field's values to be among a
+   specified  set  of  string  values (for example, the two-letter postal
+   codes for U.S. states). It is set up with:
+int set_field_type(FIELD *field,          /* field to alter */
+                   TYPE_ENUM,             /* type to associate */
+                   char **valuelist;      /* list of possible values */
+                   int checkcase;         /* case-sensitive? */
+                   int checkunique);      /* must specify uniquely? */
+
+   The  valuelist parameter must point at a NULL-terminated list of valid
+   strings.  The  checkcase  argument, if true, makes comparison with the
+   string case-sensitive.
+
+   When  the user exits a TYPE_ENUM field, the validation procedure tries
+   to  complete  the  data  in the buffer to a valid entry. If a complete
+   choice  string has been entered, it is of course valid. But it is also
+   possible to enter a prefix of a valid string and have it completed for
+   you.
+
+   By  default,  if  you enter such a prefix and it matches more than one
+   value  in  the  string list, the prefix will be completed to the first
+   matching value. But the checkunique argument, if true, requires prefix
+   matches to be unique in order to be valid.
+
+   The   REQ_NEXT_CHOICE   and  REQ_PREV_CHOICE  input  requests  can  be
+   particularly useful with these fields.
+
+    TYPE_INTEGER
+
+   This field type accepts an integer. It is set up as follows:
+int set_field_type(FIELD *field,          /* field to alter */
+                   TYPE_INTEGER,          /* type to associate */
+                   int padding,           /* # places to zero-pad to */
+                   int vmin, int vmax);   /* valid range */
+
+   Valid  characters consist of an optional leading minus and digits. The
+   range check is performed on exit. If the range maximum is less than or
+   equal to the minimum, the range is ignored.
+
+   If the value passes its range check, it is padded with as many leading
+   zero digits as necessary to meet the padding argument.
+
+   A TYPE_INTEGER value buffer can conveniently be interpreted with the C
+   library function atoi(3).
+
+    TYPE_NUMERIC
+
+   This field type accepts a decimal number. It is set up as follows:
+int set_field_type(FIELD *field,              /* field to alter */
+                   TYPE_NUMERIC,              /* type to associate */
+                   int padding,               /* # places of precision */
+                   double vmin, double vmax); /* valid range */
+
+   Valid  characters  consist  of  an  optional leading minus and digits.
+   possibly  including a decimal point. If your system supports locale's,
+   the  decimal  point  character  used  must  be the one defined by your
+   locale.  The range check is performed on exit. If the range maximum is
+   less than or equal to the minimum, the range is ignored.
+
+   If  the  value  passes  its  range  check,  it  is padded with as many
+   trailing zero digits as necessary to meet the padding argument.
+
+   A TYPE_NUMERIC value buffer can conveniently be interpreted with the C
+   library function atof(3).
+
+    TYPE_REGEXP
+
+   This  field type accepts data matching a regular expression. It is set
+   up as follows:
+int set_field_type(FIELD *field,          /* field to alter */
+                   TYPE_REGEXP,           /* type to associate */
+                   char *regexp);         /* expression to match */
+
+   The  syntax  for  regular expressions is that of regcomp(3). The check
+   for regular-expression match is performed on exit.
+
+  Direct Field Buffer Manipulation
+
+   The chief attribute of a field is its buffer contents. When a form has
+   been  completed,  your  application usually needs to know the state of
+   each field buffer. You can find this out with:
+char *field_buffer(FIELD *field,          /* field to query */
+                   int bufindex);         /* number of buffer to query */
+
+   Normally,  the state of the zero-numbered buffer for each field is set
+   by the user's editing actions on that field. It is sometimes useful to
+   be  able  to set the value of the zero-numbered (or some other) buffer
+   from your application:
+int set_field_buffer(FIELD *field,        /* field to alter */
+                   int bufindex,          /* number of buffer to alter */
+                   char *value);          /* string value to set */
+
+   If  the  field  is  not  large  enough  and  cannot  be  resized  to a
+   sufficiently large size to contain the specified value, the value will
+   be truncated to fit.
+
+   Calling  field_buffer() with a null field pointer will raise an error.
+   Calling  field_buffer()  on  a  field not currently selected for input
+   will return a correct value. Calling field_buffer() on a field that is
+   currently  selected for input may not necessarily give a correct field
+   buffer value, because entered data is not necessarily copied to buffer
+   zero  before the exit validation check. To guarantee that the returned
+   buffer  value  reflects  on-screen reality, call field_buffer() either
+   (1) in the field's exit validation check routine, (2) from the field's
+   or  form's  initialization  or  termination hooks, or (3) just after a
+   REQ_VALIDATION request has been processed by the forms driver.
+
+  Attributes of Forms
+
+   As  with  field  attributes,  form attributes inherit a default from a
+   system default form structure. These defaults can be queried or set by
+   of these functions using a form-pointer argument of NULL.
+
+   The principal attribute of a form is its field list. You can query and
+   change this list with:
+int set_form_fields(FORM *form,           /* form to alter */
+                    FIELD **fields);      /* fields to connect */
+
+char *form_fields(FORM *form);            /* fetch fields of form */
+
+int field_count(FORM *form);              /* count connect fields */
+
+   The  second  argument  of  set_form_fields()  may be a NULL-terminated
+   field pointer array like the one required by new_form(). In that case,
+   the  old  fields  of  the  form  are  disconnected  but not freed (and
+   eligible  to  be  connected  to  other forms), then the new fields are
+   connected.
+
+   It  may  also  be  null, in which case the old fields are disconnected
+   (and not freed) but no new ones are connected.
+
+   The   field_count()  function  simply  counts  the  number  of  fields
+   connected  to a given from. It returns -1 if the form-pointer argument
+   is NULL.
+
+  Control of Form Display
+
+   In  the  overview section, you saw that to display a form you normally
+   start  by  defining  its size (and fields), posting it, and refreshing
+   the  screen.  There  is  an  hidden  step before posting, which is the
+   association  of  the  form  with  a  frame window (actually, a pair of
+   windows)  within  which  it  will  be displayed. By default, the forms
+   library associates every form with the full-screen window stdscr.
+
+   By making this step explicit, you can associate a form with a declared
+   frame window on your screen display. This can be useful if you want to
+   adapt  the  form  display  to different screen sizes, dynamically tile
+   forms  on  the  screen,  or  use a form as part of an interface layout
+   managed by panels.
+
+   The  two  windows associated with each form have the same functions as
+   their  analogues  in  the menu library. Both these windows are painted
+   when the form is posted and erased when the form is unposted.
+
+   The  outer  or  frame  window  is  not  otherwise  touched by the form
+   routines. It exists so the programmer can associate a title, a border,
+   or  perhaps  help text with the form and have it properly refreshed or
+   erased at post/unpost time. The inner window or subwindow is where the
+   current form page is actually displayed.
+
+   In order to declare your own frame window for a form, you will need to
+   know  the  size  of  the  form's  bounding rectangle. You can get this
+   information with:
+int scale_form(FORM *form,                /* form to query */
+               int *rows,                 /* form rows */
+               int *cols);                /* form cols */
+
+   The form dimensions are passed back in the locations pointed to by the
+   arguments.  Once  you have this information, you can use it to declare
+   of windows, then use one of these functions:
+int set_form_win(FORM *form,              /* form to alter */
+                 WINDOW *win);            /* frame window to connect */
+
+WINDOW *form_win(FORM *form);             /* fetch frame window of form */
+
+int set_form_sub(FORM *form,              /* form to alter */
+                 WINDOW *win);            /* form subwindow to connect */
+
+WINDOW *form_sub(FORM *form);             /* fetch form subwindow of form */
+
+   Note  that curses operations, including refresh(), on the form, should
+   be done on the frame window, not the form subwindow.
+
+   It  is  possible  to  check  from  your  application  whether all of a
+   scrollable  field is actually displayed within the menu subwindow. Use
+   these functions:
+int data_ahead(FORM *form);               /* form to be queried */
+
+int data_behind(FORM *form);              /* form to be queried */
+
+   The  function  data_ahead()  returns  TRUE if (a) the current field is
+   one-line  and  has  undisplayed data off to the right, (b) the current
+   field is multi-line and there is data off-screen below it.
+
+   The function data_behind() returns TRUE if the first (upper left hand)
+   character position is off-screen (not being displayed).
+
+   Finally,  there  is  a function to restore the form window's cursor to
+   the value expected by the forms driver:
+int pos_form_cursor(FORM *)               /* form to be queried */
+
+   If your application changes the form window cursor, call this function
+   before   handing  control  back  to  the  forms  driver  in  order  to
+   re-synchronize it.
+
+  Input Processing in the Forms Driver
+
+   The function form_driver() handles virtualized input requests for form
+   navigation, editing, and validation requests, just as menu_driver does
+   for menus (see the section on menu input handling).
+int form_driver(FORM *form,               /* form to pass input to */
+                int request);             /* form request code */
+
+   Your  input  virtualization  function  needs  to  take  input and then
+   convert  it  to  either an alphanumeric character (which is treated as
+   data  to  be  entered  in  the  currently-selected  field), or a forms
+   processing request.
+
+   The   forms   driver  provides  hooks  (through  input-validation  and
+   field-termination  functions)  with  which  your  application code can
+   check that the input taken by the driver matched what was expected.
+
+    Page Navigation Requests
+
+   These  requests  cause  page-level  moves through the form, triggering
+   display of a new form screen.
+
+   REQ_NEXT_PAGE
+          Move to the next form page.
+
+   REQ_PREV_PAGE
+          Move to the previous form page.
+
+   REQ_FIRST_PAGE
+          Move to the first form page.
+
+   REQ_LAST_PAGE
+          Move to the last form page.
+
+   These  requests  treat the list as cyclic; that is, REQ_NEXT_PAGE from
+   the last page goes to the first, and REQ_PREV_PAGE from the first page
+   goes to the last.
+
+    Inter-Field Navigation Requests
+
+   These requests handle navigation between fields on the same page.
+
+   REQ_NEXT_FIELD
+          Move to next field.
+
+   REQ_PREV_FIELD
+          Move to previous field.
+
+   REQ_FIRST_FIELD
+          Move to the first field.
+
+   REQ_LAST_FIELD
+          Move to the last field.
+
+   REQ_SNEXT_FIELD
+          Move to sorted next field.
+
+   REQ_SPREV_FIELD
+          Move to sorted previous field.
+
+   REQ_SFIRST_FIELD
+          Move to the sorted first field.
+
+   REQ_SLAST_FIELD
+          Move to the sorted last field.
+
+   REQ_LEFT_FIELD
+          Move left to field.
+
+   REQ_RIGHT_FIELD
+          Move right to field.
+
+   REQ_UP_FIELD
+          Move up to field.
+
+   REQ_DOWN_FIELD
+          Move down to field.
+
+   These  requests treat the list of fields on a page as cyclic; that is,
+   REQ_NEXT_FIELD   from   the   last   field  goes  to  the  first,  and
+   REQ_PREV_FIELD from the first field goes to the last. The order of the
+   fields for these (and the REQ_FIRST_FIELD and REQ_LAST_FIELD requests)
+   is simply the order of the field pointers in the form array (as set up
+   by new_form() or set_form_fields()
+
+   It  is also possible to traverse the fields as if they had been sorted
+   in  screen-position  order,  so  the  sequence  goes left-to-right and
+   top-to-bottom.   To   do   this,   use   the   second  group  of  four
+   sorted-movement requests.
+
+   Finally, it is possible to move between fields using visual directions
+   up,  down, right, and left. To accomplish this, use the third group of
+   four requests. Note, however, that the position of a form for purposes
+   of these requests is its upper-left corner.
+
+   For   example,  suppose  you  have  a  multi-line  field  B,  and  two
+   single-line fields A and C on the same line with B, with A to the left
+   of  B  and  C  to the right of B. A REQ_MOVE_RIGHT from A will go to B
+   only  if  A, B, and C all share the same first line; otherwise it will
+   skip over B to C.
+
+    Intra-Field Navigation Requests
+
+   These  requests drive movement of the edit cursor within the currently
+   selected field.
+
+   REQ_NEXT_CHAR
+          Move to next character.
+
+   REQ_PREV_CHAR
+          Move to previous character.
+
+   REQ_NEXT_LINE
+          Move to next line.
+
+   REQ_PREV_LINE
+          Move to previous line.
+
+   REQ_NEXT_WORD
+          Move to next word.
+
+   REQ_PREV_WORD
+          Move to previous word.
+
+   REQ_BEG_FIELD
+          Move to beginning of field.
+
+   REQ_END_FIELD
+          Move to end of field.
+
+   REQ_BEG_LINE
+          Move to beginning of line.
+
+   REQ_END_LINE
+          Move to end of line.
+
+   REQ_LEFT_CHAR
+          Move left in field.
+
+   REQ_RIGHT_CHAR
+          Move right in field.
+
+   REQ_UP_CHAR
+          Move up in field.
+
+   REQ_DOWN_CHAR
+          Move down in field.
+
+   Each  word  is  separated  from  the  previous  and next characters by
+   whitespace. The commands to move to beginning and end of line or field
+   look for the first or last non-pad character in their ranges.
+
+    Scrolling Requests
+
+   Fields  that  are dynamic and have grown and fields explicitly created
+   with   offscreen   rows   are   scrollable.   One-line  fields  scroll
+   horizontally;  multi-line  fields scroll vertically. Most scrolling is
+   triggered by editing and intra-field movement (the library scrolls the
+   field  to  keep  the  cursor  visible).  It  is possible to explicitly
+   request scrolling with the following requests:
+
+   REQ_SCR_FLINE
+          Scroll vertically forward a line.
+
+   REQ_SCR_BLINE
+          Scroll vertically backward a line.
+
+   REQ_SCR_FPAGE
+          Scroll vertically forward a page.
+
+   REQ_SCR_BPAGE
+          Scroll vertically backward a page.
+
+   REQ_SCR_FHPAGE
+          Scroll vertically forward half a page.
+
+   REQ_SCR_BHPAGE
+          Scroll vertically backward half a page.
+
+   REQ_SCR_FCHAR
+          Scroll horizontally forward a character.
+
+   REQ_SCR_BCHAR
+          Scroll horizontally backward a character.
+
+   REQ_SCR_HFLINE
+          Scroll horizontally one field width forward.
+
+   REQ_SCR_HBLINE
+          Scroll horizontally one field width backward.
+
+   REQ_SCR_HFHALF
+          Scroll horizontally one half field width forward.
+
+   REQ_SCR_HBHALF
+          Scroll horizontally one half field width backward.
+
+   For scrolling purposes, a page of a field is the height of its visible
+   part.
+
+    Editing Requests
+
+   When  you pass the forms driver an ASCII character, it is treated as a
+   request  to add the character to the field's data buffer. Whether this
+   is  an  insertion  or  a  replacement depends on the field's edit mode
+   (insertion is the default.
+
+   The following requests support editing the field and changing the edit
+   mode:
+
+   REQ_INS_MODE
+          Set insertion mode.
+
+   REQ_OVL_MODE
+          Set overlay mode.
+
+   REQ_NEW_LINE
+          New line request (see below for explanation).
+
+   REQ_INS_CHAR
+          Insert space at character location.
+
+   REQ_INS_LINE
+          Insert blank line at character location.
+
+   REQ_DEL_CHAR
+          Delete character at cursor.
+
+   REQ_DEL_PREV
+          Delete previous word at cursor.
+
+   REQ_DEL_LINE
+          Delete line at cursor.
+
+   REQ_DEL_WORD
+          Delete word at cursor.
+
+   REQ_CLR_EOL
+          Clear to end of line.
+
+   REQ_CLR_EOF
+          Clear to end of field.
+
+   REQ_CLEAR_FIELD
+          Clear entire field.
+
+   The   behavior  of  the  REQ_NEW_LINE  and  REQ_DEL_PREV  requests  is
+   complicated  and  partly  controlled  by  a pair of forms options. The
+   special  cases  are triggered when the cursor is at the beginning of a
+   field, or on the last line of the field.
+
+   First, we consider REQ_NEW_LINE:
+
+   The  normal  behavior  of  REQ_NEW_LINE in insert mode is to break the
+   current line at the position of the edit cursor, inserting the portion
+   of  the  current  line  after  the  cursor as a new line following the
+   current  and  moving the cursor to the beginning of that new line (you
+   may think of this as inserting a newline in the field buffer).
+
+   The  normal  behavior  of REQ_NEW_LINE in overlay mode is to clear the
+   current  line from the position of the edit cursor to end of line. The
+   cursor is then moved to the beginning of the next line.
+
+   However, REQ_NEW_LINE at the beginning of a field, or on the last line
+   of  a  field,  instead  does a REQ_NEXT_FIELD. O_NL_OVERLOAD option is
+   off, this special action is disabled.
+
+   Now, let us consider REQ_DEL_PREV:
+
+   The  normal  behavior  of  REQ_DEL_PREV  is  to  delete  the  previous
+   character.  If  insert mode is on, and the cursor is at the start of a
+   line,  and  the  text  on  that  line will fit on the previous one, it
+   instead  appends  the contents of the current line to the previous one
+   and  deletes  the  current  line  (you may think of this as deleting a
+   newline from the field buffer).
+
+   However,  REQ_DEL_PREV  at the beginning of a field is instead treated
+   as a REQ_PREV_FIELD.
+
+   If  the  O_BS_OVERLOAD  option is off, this special action is disabled
+   and the forms driver just returns E_REQUEST_DENIED.
+
+   See  Form  Options for discussion of how to set and clear the overload
+   options.
+
+    Order Requests
+
+   If the type of your field is ordered, and has associated functions for
+   getting  the  next and previous values of the type from a given value,
+   there are requests that can fetch that value into the field buffer:
+
+   REQ_NEXT_CHOICE
+          Place the successor value of the current value in the buffer.
+
+   REQ_PREV_CHOICE
+          Place the predecessor value of the current value in the buffer.
+
+   Of the built-in field types, only TYPE_ENUM has built-in successor and
+   predecessor  functions.  When you define a field type of your own (see
+   Custom   Validation   Types),  you  can  associate  our  own  ordering
+   functions.
+
+    Application Commands
+
+   Form  requests  are  represented  as  integers  above the curses value
+   greater   than  KEY_MAX  and  less  than  or  equal  to  the  constant
+   MAX_COMMAND.  If  your  input-virtualization  routine  returns a value
+   above MAX_COMMAND, the forms driver will ignore it.
+
+  Field Change Hooks
+
+   It  is  possible  to  set  function  hooks to be executed whenever the
+   current  field  or  form  changes. Here are the functions that support
+   this:
+typedef void    (*HOOK)();       /* pointer to function returning void */
+
+int set_form_init(FORM *form,    /* form to alter */
+                  HOOK hook);    /* initialization hook */
+
+HOOK form_init(FORM *form);      /* form to query */
+
+int set_form_term(FORM *form,    /* form to alter */
+                  HOOK hook);    /* termination hook */
+
+HOOK form_term(FORM *form);      /* form to query */
+
+int set_field_init(FORM *form,   /* form to alter */
+                  HOOK hook);    /* initialization hook */
+
+HOOK field_init(FORM *form);     /* form to query */
+
+int set_field_term(FORM *form,   /* form to alter */
+                  HOOK hook);    /* termination hook */
+
+HOOK field_term(FORM *form);     /* form to query */
+
+   These functions allow you to either set or query four different hooks.
+   In  each  of  the  set  functions,  the  second argument should be the
+   address  of a hook function. These functions differ only in the timing
+   of the hook call.
+
+   form_init
+          This  hook  is called when the form is posted; also, just after
+          each page change operation.
+
+   field_init
+          This  hook  is called when the form is posted; also, just after
+          each field change
+
+   field_term
+          This  hook is called just after field validation; that is, just
+          before the field is altered. It is also called when the form is
+          unposted.
+
+   form_term
+          This  hook  is  called  when  the  form is unposted; also, just
+          before each page change operation.
+
+   Calls to these hooks may be triggered
+    1. When user editing requests are processed by the forms driver
+    2. When the current page is changed by set_current_field() call
+    3. When the current field is changed by a set_form_page() call
+
+   See Field Change Commands for discussion of the latter two cases.
+
+   You  can  set  a default hook for all fields by passing one of the set
+   functions a NULL first argument.
+
+   You  can  disable  any of these hooks by (re)setting them to NULL, the
+   default value.
+
+  Field Change Commands
+
+   Normally,  navigation  through  the  form will be driven by the user's
+   input  requests.  But  sometimes  it  is useful to be able to move the
+   focus  for  editing  and viewing under control of your application, or
+   ask  which  field it currently is in. The following functions help you
+   accomplish this:
+int set_current_field(FORM *form,         /* form to alter */
+                      FIELD *field);      /* field to shift to */
+
+FIELD *current_field(FORM *form);         /* form to query */
+
+int field_index(FORM *form,               /* form to query */
+                FIELD *field);            /* field to get index of */
+
+   The function field_index() returns the index of the given field in the
+   given   form's   field  array  (the  array  passed  to  new_form()  or
+   set_form_fields()).
+
+   The  initial  current field of a form is the first active field on the
+   first page. The function set_form_fields() resets this.
+
+   It is also possible to move around by pages.
+int set_form_page(FORM *form,             /* form to alter */
+                  int page);              /* page to go to (0-origin) */
+
+int form_page(FORM *form);                /* return form's current page */
+
+   The   initial  page  of  a  newly-created  form  is  0.  The  function
+   set_form_fields() resets this.
+
+  Form Options
+
+   Like  fields,  forms may have control option bits. They can be changed
+   or queried with these functions:
+int set_form_opts(FORM *form,             /* form to alter */
+                  int attr);              /* attribute to set */
+
+int form_opts_on(FORM *form,              /* form to alter */
+                 int attr);               /* attributes to turn on */
+
+int form_opts_off(FORM *form,             /* form to alter */
+                  int attr);              /* attributes to turn off */
+
+int form_opts(FORM *form);                /* form to query */
+
+   By default, all options are on. Here are the available option bits:
+
+   O_NL_OVERLOAD
+          Enable  overloading  of  REQ_NEW_LINE  as  described in Editing
+          Requests. The value of this option is ignored on dynamic fields
+          that  have  not  reached  their  size limit; these have no last
+          line,  so  the  circumstances  for  triggering a REQ_NEXT_FIELD
+          never arise.
+
+   O_BS_OVERLOAD
+          Enable  overloading  of  REQ_DEL_PREV  as  described in Editing
+          Requests.
+
+   The option values are bit-masks and can be composed with logical-or in
+   the obvious way.
+
+  Custom Validation Types
+
+   The  form library gives you the capability to define custom validation
+   types  of  your  own.  Further,  the  optional additional arguments of
+   set_field_type effectively allow you to parameterize validation types.
+   Most  of the complications in the validation-type interface have to do
+   with the handling of the additional arguments within custom validation
+   functions.
+
+    Union Types
+
+   The  simplest  way  to create a custom data type is to compose it from
+   two preexisting ones:
+FIELD *link_fieldtype(FIELDTYPE *type1,
+                      FIELDTYPE *type2);
+
+   This  function creates a field type that will accept any of the values
+   legal  for  either  of  its  argument field types (which may be either
+   predefined  or  programmer-defined).  If a set_field_type() call later
+   requires  arguments,  the new composite type expects all arguments for
+   the  first  type,  than  all arguments for the second. Order functions
+   (see  Order Requests) associated with the component types will work on
+   the  composite;  what it does is check the validation function for the
+   first  type,  then  for  the  second,  to  figure what type the buffer
+   contents should be treated as.
+
+    New Field Types
+
+   To  create  a field type from scratch, you need to specify one or both
+   of the following things:
+     * A  character-validation function, to check each character as it is
+       entered.
+     * A field-validation function to be applied on exit from the field.
+
+   Here is how you do that:
+typedef int     (*HOOK)();       /* pointer to function returning int */
+
+FIELDTYPE *new_fieldtype(HOOK f_validate, /* field validator */
+                         HOOK c_validate) /* character validator */
+
+int free_fieldtype(FIELDTYPE *ftype);     /* type to free */
+
+   At least one of the arguments of new_fieldtype() must be non-NULL. The
+   forms  driver  will  automatically  call  the  new  type's  validation
+   functions at appropriate points in processing a field of the new type.
+
+   The  function  free_fieldtype()  deallocates  the  argument fieldtype,
+   freeing all storage associated with it.
+
+   Normally,  a field validator is called when the user attempts to leave
+   the  field.  Its  first argument is a field pointer, from which it can
+   get  to  field buffer 0 and test it. If the function returns TRUE, the
+   operation  succeeds; if it returns FALSE, the edit cursor stays in the
+   field.
+
+   A  character  validator  gets  the  character  passed  in  as  a first
+   argument.  It  too should return TRUE if the character is valid, FALSE
+   otherwise.
+
+    Validation Function Arguments
+
+   Your  field-  and  character-  validation  functions  will be passed a
+   second  argument  as  well.  This  second argument is the address of a
+   structure  (which  we  will  call  a  pile)  built  from  any  of  the
+   field-type-specific  arguments  passed to set_field_type(). If no such
+   arguments  are  defined for the field type, this pile pointer argument
+   will be NULL.
+
+   In order to arrange for such arguments to be passed to your validation
+   functions,  you  must  associate  a  small  set  of storage-management
+   functions with the type. The forms driver will use these to synthesize
+   a  pile from the trailing arguments of each set_field_type() argument,
+   and a pointer to the pile will be passed to the validation functions.
+
+   Here is how you make the association:
+typedef char    *(*PTRHOOK)();    /* pointer to function returning (char *) */
+typedef void    (*VOIDHOOK)();    /* pointer to function returning void */
+
+int set_fieldtype_arg(FIELDTYPE *type,    /* type to alter */
+                      PTRHOOK make_str,   /* make structure from args */
+                      PTRHOOK copy_str,   /* make copy of structure */
+                      VOIDHOOK free_str); /* free structure storage */
+
+   Here is how the storage-management hooks are used:
+
+   make_str
+          This  function  is  called  by  set_field_type().  It  gets one
+          argument,  a  va_list  of the type-specific arguments passed to
+          set_field_type().  It is expected to return a pile pointer to a
+          data structure that encapsulates those arguments.
+
+   copy_str
+          This function is called by form library functions that allocate
+          new  field  instances.  It  is expected to take a pile pointer,
+          copy  the  pile to allocated storage, and return the address of
+          the pile copy.
+
+   free_str
+          This   function  is  called  by  field-  and  type-deallocation
+          routines  in the library. It takes a pile pointer argument, and
+          is expected to free the storage of that pile.
+
+   The  make_str  and  copy_str  functions  may  return  NULL  to  signal
+   allocation  failure.  The  library  routines  will that call them will
+   return  error  indication  when  this  happens.  Thus, your validation
+   functions  should  never  see  a  NULL file pointer and need not check
+   specially for it.
+
+    Order Functions For Custom Types
+
+   Some  custom  field  types are simply ordered in the same well-defined
+   way  that  TYPE_ENUM  is.  For  such  types,  it is possible to define
+   successor and predecessor functions to support the REQ_NEXT_CHOICE and
+   REQ_PREV_CHOICE requests. Here is how:
+typedef int     (*INTHOOK)();     /* pointer to function returning int */
+
+int set_fieldtype_arg(FIELDTYPE *type,    /* type to alter */
+                      INTHOOK succ,       /* get successor value */
+                      INTHOOK pred);      /* get predecessor value */
+
+   The  successor  and  predecessor  arguments  will  each  be passed two
+   arguments;  a field pointer, and a pile pointer (as for the validation
+   functions).  They  are  expected to use the function field_buffer() to
+   read  the current value, and set_field_buffer() on buffer 0 to set the
+   next  or  previous  value.  Either  hook  may  return TRUE to indicate
+   success  (a legal next or previous value was set) or FALSE to indicate
+   failure.
+
+    Avoiding Problems
+
+   The  interface  for  defining  custom types is complicated and tricky.
+   Rather  than attempting to create a custom type entirely from scratch,
+   you  should start by studying the library source code for whichever of
+   the pre-defined types seems to be closest to what you want.
+
+   Use  that code as a model, and evolve it towards what you really want.
+   You  will avoid many problems and annoyances that way. The code in the
+   ncurses  library  has  been  specifically  exempted  from  the package
+   copyright to support this.
+
+   If  your  custom  type  defines  order  functions,  have  do something
+   intuitive  with  a  blank  field.  A  useful convention is to make the
+   successor   of  a  blank  field  the  types  minimum  value,  and  its
+   predecessor the maximum.
diff --git a/form/Makefile.in b/form/Makefile.in
new file mode 100644
index 0000000..a950a3e
--- /dev/null
+++ b/form/Makefile.in
@@ -0,0 +1,210 @@
+# $Id: Makefile.in,v 1.72 2021/07/03 15:45:33 tom Exp $
+##############################################################################
+# Copyright 2020,2021 Thomas E. Dickey                                       #
+# Copyright 1998-2015,2018 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey 1996-on
+#
+# Makefile for form source code.
+#
+# This makes the following:
+#	libraries (normal/debug/profile/shared)
+#
+# The variable 'srcdir' refers to the source-distribution, and can be set with
+# the configure script by "--srcdir=DIR".
+#
+# The rules are organized to produce the libraries for the configured models,
+
+# turn off _all_ suffix rules; we'll generate our own
+.SUFFIXES:
+
+SHELL		= @SHELL@
+VPATH		= @srcdir@
+THIS		= Makefile
+
+x		= @EXEEXT@
+o		= .@OBJEXT@
+
+MODEL		= @DFT_LWR_MODEL@
+DESTDIR		= @DESTDIR@
+top_srcdir	= @top_srcdir@
+srcdir		= @srcdir@
+prefix		= @prefix@
+exec_prefix	= @exec_prefix@
+bindir		= @bindir@
+libdir		= @libdir@
+includedir	= @includedir@
+includesubdir	= @includesubdir@
+
+INCLUDEDIR	= $(DESTDIR)$(includedir)$(includesubdir)
+
+PACKAGE		= @PACKAGE@
+
+LIBTOOL		= @LIBTOOL@
+LIBTOOL_OPTS	= @LIBTOOL_OPTS@ @EXPORT_SYMS@
+LIBTOOL_CLEAN	= @LIB_CLEAN@
+LIBTOOL_COMPILE	= @LIB_COMPILE@
+LIBTOOL_LINK	= @LIB_LINK@
+LIBTOOL_INSTALL	= @LIB_INSTALL@
+LIBTOOL_UNINSTALL = @LIB_UNINSTALL@
+LT_UNDEF	= @LT_UNDEF@
+
+INSTALL		= @INSTALL@
+INSTALL_LIB	= @INSTALL@ @INSTALL_LIB@
+INSTALL_PROG	= @INSTALL_PROGRAM@ @INSTALL_OPT_S@
+INSTALL_DATA	= @INSTALL_DATA@
+
+AR		= @AR@
+ARFLAGS		= @ARFLAGS@
+AWK		= @AWK@
+LD		= @LD@
+LN_S		= @LN_S@
+
+CTAGS		= @CTAGS@
+ETAGS		= @ETAGS@
+
+CC		= @CC@
+CPP		= @CPP@
+CFLAGS		= @CFLAGS@ @EXTRA_CFLAGS@
+
+INCDIR		= $(top_srcdir)/include
+BASE_DIR 	= $(top_srcdir)/ncurses
+CPPFLAGS	= -I$(BASE_DIR) -DHAVE_CONFIG_H -DBUILDING_FORM @CPPFLAGS@
+
+CCFLAGS		= $(CPPFLAGS) $(CFLAGS)
+
+CFLAGS_LIBTOOL	= $(CCFLAGS)
+CFLAGS_NORMAL	= $(CCFLAGS) -DNCURSES_STATIC
+CFLAGS_DEBUG	= $(CCFLAGS) -DNCURSES_STATIC @CC_G_OPT@ -DTRACE
+CFLAGS_PROFILE	= $(CCFLAGS) -DNCURSES_STATIC -pg
+CFLAGS_SHARED	= $(CCFLAGS) @CC_SHARED_OPTS@
+
+CFLAGS_DEFAULT	= $(CFLAGS_@DFT_UPR_MODEL@)
+
+LINK		= $(LIBTOOL_LINK)
+LDFLAGS		= @LDFLAGS@ @LD_MODEL@ @LIBS@
+
+SHLIB_DIRS	= -L../lib
+SHLIB_LIST	= $(SHLIB_DIRS) -lncurses@USE_LIB_SUFFIX@ @SHLIB_LIST@
+
+RPATH_LIST	= @RPATH_LIST@
+RESULTING_SYMS	= @RESULTING_SYMS@
+VERSIONED_SYMS	= @VERSIONED_SYMS@
+MK_SHARED_LIB	= @MK_SHARED_LIB@
+
+NCURSES_MAJOR	= @NCURSES_MAJOR@
+NCURSES_MINOR	= @NCURSES_MINOR@
+REL_VERSION	= @cf_cv_rel_version@
+ABI_VERSION	= @cf_cv_abi_version@
+
+RANLIB		= @LIB_PREP@
+
+LIBRARIES	= @Libs_To_Make@
+
+LINT		= @LINT@
+LINT_OPTS	= @LINT_OPTS@
+LINT_LIBS	= -lform -lncurses @LIBS@
+
+AUTO_SRC	= \
+		../include/form.h
+
+################################################################################
+
+@MAKE_PHONY@.PHONY :	all
+@MAKE_PHONY@.PHONY :	clean
+@MAKE_PHONY@.PHONY :	distclean
+@MAKE_PHONY@.PHONY :	install
+@MAKE_PHONY@.PHONY :	install.libs
+@MAKE_PHONY@.PHONY :	libs
+@MAKE_PHONY@.PHONY :	mostlyclean
+@MAKE_PHONY@.PHONY :	realclean
+@MAKE_PHONY@.PHONY :	sources
+@MAKE_PHONY@.PHONY :	uninstall
+@MAKE_PHONY@.PHONY :	uninstall.libs
+
+all \
+libs \
+install ::	$(AUTO_SRC) $(LIBRARIES)
+
+sources :	$(AUTO_SRC)
+
+$(DESTDIR)$(bindir) \
+$(DESTDIR)$(libdir) :
+	mkdir -p $@
+
+# make copies to simplify include-paths while still keeping form's include
+# file in this directory.
+../include/form.h : $(srcdir)/form.h
+	-rm -f $@
+	cp $(srcdir)/form.h $@
+
+HEADER_DEPS = \
+	../include/curses.h \
+	../include/eti.h \
+	../include/mf_common.h \
+	../include/ncurses_cfg.h \
+	../include/ncurses_def.h \
+	../include/ncurses_dll.h \
+	../include/term.h \
+	../include/unctrl.h \
+	$(BASE_DIR)/curses.priv.h \
+	$(BASE_DIR)/new_pair.h \
+	$(INCDIR)/nc_alloc.h \
+	$(INCDIR)/nc_panel.h \
+	$(INCDIR)/nc_string.h \
+	$(INCDIR)/nc_termios.h \
+	$(INCDIR)/nc_tparm.h \
+	$(INCDIR)/term_entry.h \
+	$(srcdir)/form.h \
+	$(srcdir)/form.priv.h
+
+tags:
+	$(CTAGS) *.[ch]
+
+@MAKE_UPPER_TAGS@TAGS:
+@MAKE_UPPER_TAGS@	$(ETAGS) *.[ch]
+
+mostlyclean ::
+	-rm -f core tags TAGS *~ *.bak *.i *.ln *.atac trace
+
+clean :: mostlyclean
+	-rm -f $(AUTO_SRC)
+
+distclean :: clean
+	-rm -f Makefile
+	-rm -rf .libs *.dSYM
+
+realclean :: distclean
+
+../include/mf_common.h \
+../include/eti.h :
+	( cd ../menu && $(MAKE) $@ )
+
+###############################################################################
+# The remainder of this file is automatically generated during configuration
+###############################################################################
diff --git a/form/READ.ME b/form/READ.ME
new file mode 100644
index 0000000..7c6ad97
--- /dev/null
+++ b/form/READ.ME
@@ -0,0 +1,43 @@
+-------------------------------------------------------------------------------
+-- Copyright 2020,2021 Thomas E. Dickey                                      --
+-- Copyright 1998-2003,2006 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: READ.ME,v 0.9 2021/06/17 21:20:30 tom Exp $
+-------------------------------------------------------------------------------
+
+This is a clone of the form library that is available with typical
+System V curses implementations (ETI).
+
+It is modelled after the documentation that comes for this library with
+a 386 based SVR4 implementation (ESIX).
+
+The development environment was and is an ELF based Linux system.
+
+For things that still need doing, see the TO-DO file in the top-level
+directory.
+
+Juergen Pfeifer
diff --git a/form/f_trace.c b/form/f_trace.c
new file mode 100644
index 0000000..c8df81a
--- /dev/null
+++ b/form/f_trace.c
@@ -0,0 +1,72 @@
+/****************************************************************************
+ * Copyright 2018,2020 Thomas E. Dickey                                     *
+ * Copyright 2004-2010,2016 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Thomas E. Dickey                                              *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: f_trace.c,v 1.6 2020/05/24 01:40:20 anonymous.maarten Exp $")
+
+FORM_EXPORT(FIELD **)
+_nc_retrace_field_ptr(FIELD **code)
+{
+  T((T_RETURN("%p"), (void *)code));
+  return code;
+}
+
+FORM_EXPORT(FIELD *)
+_nc_retrace_field(FIELD *code)
+{
+  T((T_RETURN("%p"), (void *)code));
+  return code;
+}
+
+FORM_EXPORT(FIELDTYPE *)
+_nc_retrace_field_type(FIELDTYPE *code)
+{
+  T((T_RETURN("%p"), (void *)code));
+  return code;
+}
+
+FORM_EXPORT(FORM *)
+_nc_retrace_form(FORM *code)
+{
+  T((T_RETURN("%p"), (void *)code));
+  return code;
+}
+
+FORM_EXPORT(Form_Hook)
+_nc_retrace_form_hook(Form_Hook code)
+{
+  TR_FUNC_BFR(1);
+  T((T_RETURN("%s"), TR_FUNC_ARG(0, code)));
+  return code;
+}
diff --git a/form/fld_arg.c b/form/fld_arg.c
new file mode 100644
index 0000000..2f6c477
--- /dev/null
+++ b/form/fld_arg.c
@@ -0,0 +1,104 @@
+/****************************************************************************
+ * Copyright 2018,2020 Thomas E. Dickey                                     *
+ * Copyright 1998-2012,2016 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fld_arg.c,v 1.18 2020/12/11 22:05:24 tom Exp $")
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int set_fieldtype_arg(
+|                            FIELDTYPE *typ,
+|                            void * (* const make_arg)(va_list *),
+|                            void * (* const copy_arg)(const void *),
+|                            void   (* const free_arg)(void *) )
+|
+|   Description   :  Connects to the type additional arguments necessary
+|                    for a set_field_type call. The various function pointer
+|                    arguments are:
+|                       make_arg : allocates a structure for the field
+|                                  specific parameters.
+|                       copy_arg : duplicate the structure created by
+|                                  make_arg
+|                       free_arg : Release the memory allocated by make_arg
+|                                  or copy_arg
+|
+|                    At least make_arg must be non-NULL.
+|                    You may pass NULL for copy_arg and free_arg if your
+|                    make_arg function doesn't allocate memory and your
+|                    arg fits into the storage for a (void*).
+|
+|   Return Values :  E_OK           - success
+|                    E_BAD_ARGUMENT - invalid argument
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+set_fieldtype_arg(FIELDTYPE *typ,
+		  void *(*const make_arg)(va_list *),
+		  void *(*const copy_arg)(const void *),
+		  void (*const free_arg) (void *))
+{
+  TR_FUNC_BFR(3);
+
+  T((T_CALLED("set_fieldtype_arg(%p,%s,%s,%s)"),
+     (void *)typ,
+     TR_FUNC_ARG(0, make_arg),
+     TR_FUNC_ARG(1, copy_arg),
+     TR_FUNC_ARG(2, free_arg)));
+
+  if (typ != 0 && make_arg != (void *)0)
+    {
+      SetStatus(typ, _HAS_ARGS);
+      typ->makearg = make_arg;
+      typ->copyarg = copy_arg;
+      typ->freearg = free_arg;
+      RETURN(E_OK);
+    }
+  RETURN(E_BAD_ARGUMENT);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  void *field_arg(const FIELD *field)
+|
+|   Description   :  Retrieve pointer to the field's argument structure.
+|
+|   Return Values :  Pointer to structure or NULL if none is defined.
++--------------------------------------------------------------------------*/
+FORM_EXPORT(void *)
+field_arg(const FIELD *field)
+{
+  T((T_CALLED("field_arg(%p)"), (const void *)field));
+  returnVoidPtr(Normalize_Field(field)->arg);
+}
+
+/* fld_arg.c ends here */
diff --git a/form/fld_attr.c b/form/fld_attr.c
new file mode 100644
index 0000000..4ce6b1c
--- /dev/null
+++ b/form/fld_attr.c
@@ -0,0 +1,120 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2010,2016 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fld_attr.c,v 1.15 2020/12/11 22:05:24 tom Exp $")
+
+/*----------------------------------------------------------------------------
+  Field-Attribute manipulation routines
+  --------------------------------------------------------------------------*/
+/* "Template" macro to generate a function to set a field's attribute */
+#define GEN_FIELD_ATTR_SET_FCT( name ) \
+FORM_IMPEXP int NCURSES_API set_field_ ## name (FIELD * field, chtype attr)\
+{\
+   int res = E_BAD_ARGUMENT;\
+   T((T_CALLED("set_field_" #name "(%p,%s)"), (void *)field, _traceattr(attr)));\
+   if ( attr==A_NORMAL || ((attr & A_ATTRIBUTES)==attr) )\
+     {\
+       Normalize_Field( field );\
+       if (field != 0) \
+	 { \
+	 if ((field -> name) != attr)\
+	   {\
+	     field -> name = attr;\
+	     res = _nc_Synchronize_Attributes( field );\
+	   }\
+	 else\
+	   {\
+	     res = E_OK;\
+	   }\
+	 }\
+     }\
+   RETURN(res);\
+}
+
+/* "Template" macro to generate a function to get a field's attribute */
+#define GEN_FIELD_ATTR_GET_FCT( name ) \
+FORM_IMPEXP chtype NCURSES_API field_ ## name (const FIELD * field)\
+{\
+   T((T_CALLED("field_" #name "(%p)"), (const void *) field));\
+   returnAttr( A_ATTRIBUTES & (Normalize_Field( field ) -> name) );\
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int set_field_fore(FIELD *field, chtype attr)
+|
+|   Description   :  Sets the foreground of the field used to display the
+|                    field contents.
+|
+|   Return Values :  E_OK             - success
+|                    E_BAD_ARGUMENT   - invalid attributes
+|                    E_SYSTEM_ERROR   - system error
++--------------------------------------------------------------------------*/
+GEN_FIELD_ATTR_SET_FCT(fore)
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  chtype field_fore(const FIELD *)
+|
+|   Description   :  Retrieve field's foreground attribute
+|
+|   Return Values :  The foreground attribute
++--------------------------------------------------------------------------*/
+GEN_FIELD_ATTR_GET_FCT(fore)
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int set_field_back(FIELD *field, chtype attr)
+|
+|   Description   :  Sets the background of the field used to display the
+|                    field's extend.
+|
+|   Return Values :  E_OK             - success
+|                    E_BAD_ARGUMENT   - invalid attributes
+|                    E_SYSTEM_ERROR   - system error
++--------------------------------------------------------------------------*/
+GEN_FIELD_ATTR_SET_FCT(back)
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  chtype field_back(const
+|
+|   Description   :  Retrieve field's background attribute
+|
+|   Return Values :  The background attribute
++--------------------------------------------------------------------------*/
+GEN_FIELD_ATTR_GET_FCT(back)
+
+/* fld_attr.c ends here */
diff --git a/form/fld_current.c b/form/fld_current.c
new file mode 100644
index 0000000..264007e
--- /dev/null
+++ b/form/fld_current.c
@@ -0,0 +1,164 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2010,2016 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fld_current.c,v 1.16 2020/05/24 01:40:20 anonymous.maarten Exp $")
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int set_current_field(FORM  * form,FIELD * field)
+|
+|   Description   :  Set the current field of the form to the specified one.
+|
+|   Return Values :  E_OK              - success
+|                    E_BAD_ARGUMENT    - invalid form or field pointer
+|                    E_REQUEST_DENIED  - field not selectable
+|                    E_BAD_STATE       - called from a hook routine
+|                    E_INVALID_FIELD   - current field can't be left
+|                    E_SYSTEM_ERROR    - system error
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+set_current_field(FORM *form, FIELD *field)
+{
+  int err = E_OK;
+
+  T((T_CALLED("set_current_field(%p,%p)"), (void *)form, (void *)field));
+  if (form == 0 || field == 0)
+    {
+      RETURN(E_BAD_ARGUMENT);
+    }
+  else if ((form != field->form) || Field_Is_Not_Selectable(field))
+    {
+      RETURN(E_REQUEST_DENIED);
+    }
+  else if ((form->status & _POSTED) == 0)
+    {
+      form->current = field;
+      form->curpage = field->page;
+    }
+  else
+    {
+      if ((form->status & _IN_DRIVER) != 0)
+	{
+	  err = E_BAD_STATE;
+	}
+      else
+	{
+	  if (form->current != field)
+	    {
+	      if (form->current && !_nc_Internal_Validation(form))
+		{
+		  err = E_INVALID_FIELD;
+		}
+	      else
+		{
+		  Call_Hook(form, fieldterm);
+		  if (field->page != form->curpage)
+		    {
+		      Call_Hook(form, formterm);
+		      err = _nc_Set_Form_Page(form, (int)field->page, field);
+		      Call_Hook(form, forminit);
+		    }
+		  else
+		    {
+		      err = _nc_Set_Current_Field(form, field);
+		    }
+		  Call_Hook(form, fieldinit);
+		  (void)_nc_Refresh_Current_Field(form);
+		}
+	    }
+	}
+    }
+  RETURN(err);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int unfocus_current_field(FORM * form)
+|
+|   Description   :  Removes focus from the current field.
+|
+|   Return Values :  E_OK              - success
+|                    E_BAD_ARGUMENT    - invalid form pointer
+|                    E_REQUEST_DENIED  - there is no current field to unfocus
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+unfocus_current_field(FORM *const form)
+{
+  T((T_CALLED("unfocus_current_field(%p)"), (const void *)form));
+  if (form == 0)
+    {
+      RETURN(E_BAD_ARGUMENT);
+    }
+  else if (form->current == 0)
+    {
+      RETURN(E_REQUEST_DENIED);
+    }
+  _nc_Unset_Current_Field(form);
+  RETURN(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  FIELD *current_field(const FORM * form)
+|
+|   Description   :  Return the current field.
+|
+|   Return Values :  Pointer to the current field.
++--------------------------------------------------------------------------*/
+FORM_EXPORT(FIELD *)
+current_field(const FORM *form)
+{
+  T((T_CALLED("current_field(%p)"), (const void *)form));
+  returnField(Normalize_Form(form)->current);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int field_index(const FIELD * field)
+|
+|   Description   :  Return the index of the field in the field-array of
+|                    the form.
+|
+|   Return Values :  >= 0   : field index
+|                    -1     : fieldpointer invalid or field not connected
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+field_index(const FIELD *field)
+{
+  T((T_CALLED("field_index(%p)"), (const void *)field));
+  returnCode((field != 0 && field->form != 0) ? (int)field->index : -1);
+}
+
+/* fld_current.c ends here */
diff --git a/form/fld_def.c b/form/fld_def.c
new file mode 100644
index 0000000..51bdc64
--- /dev/null
+++ b/form/fld_def.c
@@ -0,0 +1,399 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2012,2014 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fld_def.c,v 1.44 2021/03/27 23:49:53 tom Exp $")
+
+/* this can't be readonly */
+static FIELD default_field =
+{
+  0,				/* status  */
+  0,				/* rows    */
+  0,				/* cols    */
+  0,				/* frow    */
+  0,				/* fcol    */
+  0,				/* drows   */
+  0,				/* dcols   */
+  0,				/* maxgrow */
+  0,				/* nrow    */
+  0,				/* nbuf    */
+  NO_JUSTIFICATION,		/* just    */
+  0,				/* page    */
+  0,				/* index   */
+  (int)' ',			/* pad     */
+  A_NORMAL,			/* fore    */
+  A_NORMAL,			/* back    */
+  STD_FIELD_OPTS,		/* opts    */
+  (FIELD *)0,			/* snext   */
+  (FIELD *)0,			/* sprev   */
+  (FIELD *)0,			/* link    */
+  (FORM *)0,			/* form    */
+  (FIELDTYPE *)0,		/* type    */
+  (char *)0,			/* arg     */
+  (FIELD_CELL *)0,		/* buf     */
+  (char *)0			/* usrptr  */
+  NCURSES_FIELD_EXTENSION
+};
+
+FORM_EXPORT_VAR(FIELD *) _nc_Default_Field = &default_field;
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  TypeArgument *_nc_Make_Argument(
+|                              const FIELDTYPE *typ,
+|                              va_list *ap,
+|                              int *err )
+|
+|   Description   :  Create an argument structure for the specified type.
+|                    Use the type-dependent argument list to construct
+|                    it.
+|
+|   Return Values :  Pointer to argument structure. Maybe NULL.
+|                    In case of an error in *err an error counter is increased.
++--------------------------------------------------------------------------*/
+FORM_EXPORT(TypeArgument *)
+_nc_Make_Argument(const FIELDTYPE *typ, va_list *ap, int *err)
+{
+  TypeArgument *res = (TypeArgument *)0;
+
+  if (typ != 0 && (typ->status & _HAS_ARGS) != 0)
+    {
+      assert(err != 0 && ap != (va_list *)0);
+      if ((typ->status & _LINKED_TYPE) != 0)
+	{
+	  TypeArgument *p = typeMalloc(TypeArgument, 1);
+
+	  if (p != 0)
+	    {
+	      p->left = _nc_Make_Argument(typ->left, ap, err);
+	      p->right = _nc_Make_Argument(typ->right, ap, err);
+	      return p;
+	    }
+	  else
+	    {
+	      *err += 1;
+	    }
+	}
+      else
+	{
+	  assert(typ->makearg != (void *)0);
+	  if (!(res = (TypeArgument *)typ->makearg(ap)))
+	    {
+	      *err += 1;
+	    }
+	}
+    }
+  return res;
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  TypeArgument *_nc_Copy_Argument(const FIELDTYPE *typ,
+|                                                    const TypeArgument *argp,
+|                                                    int *err )
+|
+|   Description   :  Create a copy of an argument structure for the specified
+|                    type.
+|
+|   Return Values :  Pointer to argument structure. Maybe NULL.
+|                    In case of an error in *err an error counter is increased.
++--------------------------------------------------------------------------*/
+FORM_EXPORT(TypeArgument *)
+_nc_Copy_Argument(const FIELDTYPE *typ, const TypeArgument *argp, int *err)
+{
+  TypeArgument *res = (TypeArgument *)0;
+
+  if (typ != 0 && (typ->status & _HAS_ARGS) != 0)
+    {
+      assert(err != 0 && argp != 0);
+      if ((typ->status & _LINKED_TYPE) != 0)
+	{
+	  TypeArgument *p = typeMalloc(TypeArgument, 1);
+
+	  if (p != 0)
+	    {
+	      p->left = _nc_Copy_Argument(typ, argp->left, err);
+	      p->right = _nc_Copy_Argument(typ, argp->right, err);
+	      return p;
+	    }
+	  *err += 1;
+	}
+      else
+	{
+	  if (typ->copyarg != (void *)0)
+	    {
+	      if (!(res = (TypeArgument *)(typ->copyarg((const void *)argp))))
+		{
+		  *err += 1;
+		}
+	    }
+	  else
+	    {
+	      res = (TypeArgument *)argp;
+	    }
+	}
+    }
+  return res;
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  void _nc_Free_Argument(const FIELDTYPE *typ,
+|                                           TypeArgument * argp )
+|
+|   Description   :  Release memory associated with the argument structure
+|                    for the given fieldtype.
+|
+|   Return Values :  -
++--------------------------------------------------------------------------*/
+FORM_EXPORT(void)
+_nc_Free_Argument(const FIELDTYPE *typ, TypeArgument *argp)
+{
+  if (typ != 0 && (typ->status & _HAS_ARGS) != 0)
+    {
+      if ((typ->status & _LINKED_TYPE) != 0)
+	{
+	  if (argp != 0)
+	    {
+	      _nc_Free_Argument(typ->left, argp->left);
+	      _nc_Free_Argument(typ->right, argp->right);
+	      free(argp);
+	    }
+	}
+      else
+	{
+	  if (typ->freearg != (void *)0)
+	    {
+	      typ->freearg((void *)argp);
+	    }
+	}
+    }
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  bool _nc_Copy_Type( FIELD *dst, FIELD const *src )
+|
+|   Description   :  Copy argument structure of field src to field dst
+|
+|   Return Values :  TRUE       - copy worked
+|                    FALSE      - error occurred
++--------------------------------------------------------------------------*/
+FORM_EXPORT(bool)
+_nc_Copy_Type(FIELD *dst, FIELD const *src)
+{
+  int err = 0;
+
+  assert(dst != 0 && src != 0);
+
+  dst->type = src->type;
+  dst->arg = (void *)_nc_Copy_Argument(src->type, (TypeArgument *)(src->arg), &err);
+
+  if (err != 0)
+    {
+      _nc_Free_Argument(dst->type, (TypeArgument *)(dst->arg));
+      dst->type = (FIELDTYPE *)0;
+      dst->arg = (void *)0;
+      return FALSE;
+    }
+  else
+    {
+      if (dst->type != 0)
+	{
+	  dst->type->ref++;
+	}
+      return TRUE;
+    }
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  void _nc_Free_Type( FIELD *field )
+|
+|   Description   :  Release Argument structure for this field
+|
+|   Return Values :  -
++--------------------------------------------------------------------------*/
+FORM_EXPORT(void)
+_nc_Free_Type(FIELD *field)
+{
+  assert(field != 0);
+  if (field->type != 0)
+    {
+      field->type->ref--;
+      _nc_Free_Argument(field->type, (TypeArgument *)(field->arg));
+    }
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  FIELD *new_field( int rows, int cols,
+|                                      int frow, int fcol,
+|                                      int nrow, int nbuf )
+|
+|   Description   :  Create a new field with this many 'rows' and 'cols',
+|                    starting at 'frow/fcol' in the subwindow of the form.
+|                    Allocate 'nrow' off-screen rows and 'nbuf' additional
+|                    buffers. If an error occurs, errno is set to
+|
+|                    E_BAD_ARGUMENT - invalid argument
+|                    E_SYSTEM_ERROR - system error
+|
+|   Return Values :  Pointer to the new field or NULL if failure.
++--------------------------------------------------------------------------*/
+FORM_EXPORT(FIELD *)
+new_field(int rows, int cols, int frow, int fcol, int nrow, int nbuf)
+{
+  static const FIELD_CELL blank = BLANK;
+  static const FIELD_CELL zeros = ZEROS;
+
+  FIELD *New_Field = (FIELD *)0;
+  int err = E_BAD_ARGUMENT;
+
+  T((T_CALLED("new_field(%d,%d,%d,%d,%d,%d)"), rows, cols, frow, fcol, nrow, nbuf));
+  if (rows > 0 &&
+      cols > 0 &&
+      frow >= 0 &&
+      fcol >= 0 &&
+      nrow >= 0 &&
+      nbuf >= 0 &&
+      ((err = E_SYSTEM_ERROR) != 0) &&	/* trick: this resets the default error */
+      (New_Field = typeMalloc(FIELD, 1)) != 0)
+    {
+      T((T_CREATE("field %p"), (void *)New_Field));
+      *New_Field = default_field;
+      New_Field->rows = (short)rows;
+      New_Field->cols = (short)cols;
+      New_Field->drows = rows + nrow;
+      New_Field->dcols = cols;
+      New_Field->frow = (short)frow;
+      New_Field->fcol = (short)fcol;
+      New_Field->nrow = nrow;
+      New_Field->nbuf = (short)nbuf;
+      New_Field->link = New_Field;
+
+#if USE_WIDEC_SUPPORT
+      New_Field->working = newpad(1, Buffer_Length(New_Field) + 1);
+      New_Field->expanded = typeCalloc(char *, 1 + (unsigned)nbuf);
+#endif
+
+      if (_nc_Copy_Type(New_Field, &default_field))
+	{
+	  size_t len;
+
+	  len = Total_Buffer_Size(New_Field);
+	  if ((New_Field->buf = (FIELD_CELL *)malloc(len)))
+	    {
+	      /* Prefill buffers with blanks and insert terminating zeroes
+	         between buffers */
+	      int i, j;
+	      int cells = Buffer_Length(New_Field);
+
+	      for (i = 0; i <= New_Field->nbuf; i++)
+		{
+		  FIELD_CELL *buffer = &(New_Field->buf[(cells + 1) * i]);
+
+		  for (j = 0; j < cells; ++j)
+		    {
+		      buffer[j] = blank;
+		    }
+		  buffer[j] = zeros;
+		}
+	      returnField(New_Field);
+	    }
+	}
+    }
+
+  if (New_Field)
+    free_field(New_Field);
+
+  SET_ERROR(err);
+  returnField((FIELD *)0);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int free_field( FIELD *field )
+|
+|   Description   :  Frees the storage allocated for the field.
+|
+|   Return Values :  E_OK           - success
+|                    E_BAD_ARGUMENT - invalid field pointer
+|                    E_CONNECTED    - field is connected
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+free_field(FIELD *field)
+{
+  T((T_CALLED("free_field(%p)"), (void *)field));
+  if (!field)
+    {
+      RETURN(E_BAD_ARGUMENT);
+    }
+  else if (field->form != 0)
+    {
+      RETURN(E_CONNECTED);
+    }
+  else if (field == field->link)
+    {
+      if (field->buf != 0)
+	free(field->buf);
+    }
+  else
+    {
+      FIELD *f;
+
+      for (f = field; f->link != field; f = f->link)
+	{
+	}
+      f->link = field->link;
+    }
+  _nc_Free_Type(field);
+#if USE_WIDEC_SUPPORT
+  if (field->expanded != 0)
+    {
+      int n;
+
+      for (n = 0; n <= field->nbuf; ++n)
+	{
+	  FreeIfNeeded(field->expanded[n]);
+	}
+      free(field->expanded);
+      (void)delwin(field->working);
+    }
+#endif
+  free(field);
+  RETURN(E_OK);
+}
+
+/* fld_def.c ends here */
diff --git a/form/fld_dup.c b/form/fld_dup.c
new file mode 100644
index 0000000..e195df9
--- /dev/null
+++ b/form/fld_dup.c
@@ -0,0 +1,101 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2010,2012 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fld_dup.c,v 1.18 2020/05/24 01:40:20 anonymous.maarten Exp $")
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  FIELD *dup_field(FIELD *field, int frow, int fcol)
+|
+|   Description   :  Duplicates the field at the specified position. All
+|                    field attributes and the buffers are copied.
+|                    If an error occurs, errno is set to
+|
+|                    E_BAD_ARGUMENT - invalid argument
+|                    E_SYSTEM_ERROR - system error
+|
+|   Return Values :  Pointer to the new field or NULL if failure
++--------------------------------------------------------------------------*/
+FORM_EXPORT(FIELD *)
+dup_field(FIELD *field, int frow, int fcol)
+{
+  FIELD *New_Field = (FIELD *)0;
+  int err = E_BAD_ARGUMENT;
+
+  T((T_CALLED("dup_field(%p,%d,%d)"), (void *)field, frow, fcol));
+  if (field && (frow >= 0) && (fcol >= 0) &&
+      ((err = E_SYSTEM_ERROR) != 0) &&	/* trick : this resets the default error */
+      (New_Field = typeMalloc(FIELD, 1)))
+    {
+      T((T_CREATE("field %p"), (void *)New_Field));
+      *New_Field = *_nc_Default_Field;
+      New_Field->frow = (short)frow;
+      New_Field->fcol = (short)fcol;
+      New_Field->link = New_Field;
+      New_Field->rows = field->rows;
+      New_Field->cols = field->cols;
+      New_Field->nrow = field->nrow;
+      New_Field->drows = field->drows;
+      New_Field->dcols = field->dcols;
+      New_Field->maxgrow = field->maxgrow;
+      New_Field->nbuf = field->nbuf;
+      New_Field->just = field->just;
+      New_Field->fore = field->fore;
+      New_Field->back = field->back;
+      New_Field->pad = field->pad;
+      New_Field->opts = field->opts;
+      New_Field->usrptr = field->usrptr;
+
+      if (_nc_Copy_Type(New_Field, field))
+	{
+	  size_t len;
+
+	  len = Total_Buffer_Size(New_Field);
+	  if ((New_Field->buf = (FIELD_CELL *)malloc(len * 20)))
+	    {
+	      memcpy(New_Field->buf, field->buf, len);
+	      returnField(New_Field);
+	    }
+	}
+    }
+
+  if (New_Field)
+    free_field(New_Field);
+
+  SET_ERROR(err);
+  returnField((FIELD *)0);
+}
+
+/* fld_dup.c ends here */
diff --git a/form/fld_ftchoice.c b/form/fld_ftchoice.c
new file mode 100644
index 0000000..dfaca14
--- /dev/null
+++ b/form/fld_ftchoice.c
@@ -0,0 +1,76 @@
+/****************************************************************************
+ * Copyright 2018-2020,2021 Thomas E. Dickey                                *
+ * Copyright 1998-2012,2016 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fld_ftchoice.c,v 1.18 2021/06/17 21:26:02 tom Exp $")
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int set_fieldtype_choice(
+|                          FIELDTYPE *typ,
+|                          bool (* const next_choice)(FIELD *,const void *),
+|                          bool (* const prev_choice)(FIELD *,const void *))
+|
+|   Description   :  Define implementation of enumeration requests.
+|
+|   Return Values :  E_OK           - success
+|                    E_BAD_ARGUMENT - invalid arguments
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+set_fieldtype_choice(FIELDTYPE *typ,
+		     bool (*const next_choice) (FIELD *, const void *),
+		     bool (*const prev_choice) (FIELD *, const void *))
+{
+  TR_FUNC_BFR(2);
+
+  T((T_CALLED("set_fieldtype_choice(%p,%s,%s)"),
+     (void *)typ,
+     TR_FUNC_ARG(0, next_choice),
+     TR_FUNC_ARG(1, prev_choice)));
+
+  if (!typ || !next_choice || !prev_choice)
+    RETURN(E_BAD_ARGUMENT);
+
+  SetStatus(typ, _HAS_CHOICE);
+#if NCURSES_INTEROP_FUNCS
+  typ->enum_next.onext = next_choice;
+  typ->enum_prev.oprev = prev_choice;
+#else
+  typ->next = next_choice;
+  typ->prev = prev_choice;
+#endif
+  RETURN(E_OK);
+}
+
+/* fld_ftchoice.c ends here */
diff --git a/form/fld_ftlink.c b/form/fld_ftlink.c
new file mode 100644
index 0000000..ed16920
--- /dev/null
+++ b/form/fld_ftlink.c
@@ -0,0 +1,88 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2010,2012 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fld_ftlink.c,v 1.18 2021/06/17 21:20:30 tom Exp $")
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  FIELDTYPE *link_fieldtype(
+|                                FIELDTYPE *type1,
+|                                FIELDTYPE *type2)
+|
+|   Description   :  Create a new fieldtype built from the two given types.
+|                    They are connected by an logical 'OR'.
+|                    If an error occurs, errno is set to
+|                       E_BAD_ARGUMENT  - invalid arguments
+|                       E_SYSTEM_ERROR  - system error (no memory)
+|
+|   Return Values :  Fieldtype pointer or NULL if error occurred.
++--------------------------------------------------------------------------*/
+FORM_EXPORT(FIELDTYPE *)
+link_fieldtype(FIELDTYPE *type1, FIELDTYPE *type2)
+{
+  FIELDTYPE *nftyp = (FIELDTYPE *)0;
+
+  T((T_CALLED("link_fieldtype(%p,%p)"), (void *)type1, (void *)type2));
+  if (type1 && type2)
+    {
+      nftyp = typeMalloc(FIELDTYPE, 1);
+
+      if (nftyp)
+	{
+	  T((T_CREATE("fieldtype %p"), (void *)nftyp));
+	  *nftyp = *_nc_Default_FieldType;
+	  SetStatus(nftyp, _LINKED_TYPE);
+	  if ((type1->status & _HAS_ARGS) || (type2->status & _HAS_ARGS))
+	    SetStatus(nftyp, _HAS_ARGS);
+	  if ((type1->status & _HAS_CHOICE) || (type2->status & _HAS_CHOICE))
+	    SetStatus(nftyp, _HAS_CHOICE);
+	  nftyp->left = type1;
+	  nftyp->right = type2;
+	  type1->ref++;
+	  type2->ref++;
+	}
+      else
+	{
+	  SET_ERROR(E_SYSTEM_ERROR);
+	}
+    }
+  else
+    {
+      SET_ERROR(E_BAD_ARGUMENT);
+    }
+  returnFieldType(nftyp);
+}
+
+/* fld_ftlink.c ends here */
diff --git a/form/fld_info.c b/form/fld_info.c
new file mode 100644
index 0000000..bc8399d
--- /dev/null
+++ b/form/fld_info.c
@@ -0,0 +1,114 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2004,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fld_info.c,v 1.16 2021/06/17 21:20:30 tom Exp $")
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int field_info(const FIELD *field,
+|                                   int *rows, int *cols,
+|                                   int *frow, int *fcol,
+|                                   int *nrow, int *nbuf)
+|
+|   Description   :  Retrieve information about the field's creation parameters.
+|
+|   Return Values :  E_OK           - success
+|                    E_BAD_ARGUMENT - invalid field pointer
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+field_info(const FIELD *field,
+	   int *rows, int *cols,
+	   int *frow, int *fcol,
+	   int *nrow, int *nbuf)
+{
+  T((T_CALLED("field_info(%p,%p,%p,%p,%p,%p,%p)"),
+     (const void *)field,
+     (void *)rows, (void *)cols,
+     (void *)frow, (void *)fcol,
+     (void *)nrow, (void *)nbuf));
+
+  if (!field)
+    RETURN(E_BAD_ARGUMENT);
+
+  if (rows)
+    *rows = field->rows;
+  if (cols)
+    *cols = field->cols;
+  if (frow)
+    *frow = field->frow;
+  if (fcol)
+    *fcol = field->fcol;
+  if (nrow)
+    *nrow = field->nrow;
+  if (nbuf)
+    *nbuf = field->nbuf;
+  RETURN(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int dynamic_field_info(const FIELD *field,
+|                                           int *drows, int *dcols,
+|                                           int *maxgrow)
+|
+|   Description   :  Retrieve information about a dynamic field's current
+|                    dynamic parameters.
+|
+|   Return Values :  E_OK           - success
+|                    E_BAD_ARGUMENT - invalid argument
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+dynamic_field_info(const FIELD *field, int *drows, int *dcols, int *maxgrow)
+{
+  T((T_CALLED("dynamic_field_info(%p,%p,%p,%p)"),
+     (const void *)field,
+     (void *)drows,
+     (void *)dcols,
+     (void *)maxgrow));
+
+  if (!field)
+    RETURN(E_BAD_ARGUMENT);
+
+  if (drows)
+    *drows = field->drows;
+  if (dcols)
+    *dcols = field->dcols;
+  if (maxgrow)
+    *maxgrow = field->maxgrow;
+
+  RETURN(E_OK);
+}
+
+/* fld_info.c ends here */
diff --git a/form/fld_just.c b/form/fld_just.c
new file mode 100644
index 0000000..62253bc
--- /dev/null
+++ b/form/fld_just.c
@@ -0,0 +1,87 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2010,2012 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fld_just.c,v 1.17 2021/06/17 21:20:30 tom Exp $")
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int set_field_just(FIELD *field, int just)
+|
+|   Description   :  Set the field's type of justification.
+|
+|   Return Values :  E_OK            - success
+|                    E_BAD_ARGUMENT  - one of the arguments was incorrect
+|                    E_SYSTEM_ERROR  - system error
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+set_field_just(FIELD *field, int just)
+{
+  int res = E_BAD_ARGUMENT;
+
+  T((T_CALLED("set_field_just(%p,%d)"), (void *)field, just));
+
+  if ((just == NO_JUSTIFICATION) ||
+      (just == JUSTIFY_LEFT) ||
+      (just == JUSTIFY_CENTER) ||
+      (just == JUSTIFY_RIGHT))
+    {
+      Normalize_Field(field);
+      if (field->just != just)
+	{
+	  field->just = (short)just;
+	  res = _nc_Synchronize_Attributes(field);
+	}
+      else
+	res = E_OK;
+    }
+  RETURN(res);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int field_just( const FIELD *field )
+|
+|   Description   :  Retrieve the field's type of justification
+|
+|   Return Values :  The justification type.
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+field_just(const FIELD *field)
+{
+  T((T_CALLED("field_just(%p)"), (const void *)field));
+  returnCode(Normalize_Field(field)->just);
+}
+
+/* fld_just.c ends here */
diff --git a/form/fld_link.c b/form/fld_link.c
new file mode 100644
index 0000000..c060458
--- /dev/null
+++ b/form/fld_link.c
@@ -0,0 +1,97 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2010,2012 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fld_link.c,v 1.17 2021/06/17 21:20:30 tom Exp $")
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  FIELD *link_field(FIELD *field, int frow, int fcol)
+|
+|   Description   :  Duplicates the field at the specified position. The
+|                    new field shares its buffers with the original one,
+|                    the attributes are independent.
+|                    If an error occurs, errno is set to
+|
+|                    E_BAD_ARGUMENT - invalid argument
+|                    E_SYSTEM_ERROR - system error
+|
+|   Return Values :  Pointer to the new field or NULL if failure
++--------------------------------------------------------------------------*/
+FORM_EXPORT(FIELD *)
+link_field(FIELD *field, int frow, int fcol)
+{
+  FIELD *New_Field = (FIELD *)0;
+  int err = E_BAD_ARGUMENT;
+
+  T((T_CALLED("link_field(%p,%d,%d)"), (void *)field, frow, fcol));
+  if (field && (frow >= 0) && (fcol >= 0) &&
+      ((err = E_SYSTEM_ERROR) != 0) &&	/* trick: this resets the default error */
+      (New_Field = typeMalloc(FIELD, 1)))
+    {
+      T((T_CREATE("field %p"), (void *)New_Field));
+      *New_Field = *_nc_Default_Field;
+      New_Field->frow = (short)frow;
+      New_Field->fcol = (short)fcol;
+
+      New_Field->link = field->link;
+      field->link = New_Field;
+
+      New_Field->buf = field->buf;
+      New_Field->rows = field->rows;
+      New_Field->cols = field->cols;
+      New_Field->nrow = field->nrow;
+      New_Field->nbuf = field->nbuf;
+      New_Field->drows = field->drows;
+      New_Field->dcols = field->dcols;
+      New_Field->maxgrow = field->maxgrow;
+      New_Field->just = field->just;
+      New_Field->fore = field->fore;
+      New_Field->back = field->back;
+      New_Field->pad = field->pad;
+      New_Field->opts = field->opts;
+      New_Field->usrptr = field->usrptr;
+
+      if (_nc_Copy_Type(New_Field, field))
+	returnField(New_Field);
+    }
+
+  if (New_Field)
+    free_field(New_Field);
+
+  SET_ERROR(err);
+  returnField((FIELD *)0);
+}
+
+/* fld_link.c ends here */
diff --git a/form/fld_max.c b/form/fld_max.c
new file mode 100644
index 0000000..325541a
--- /dev/null
+++ b/form/fld_max.c
@@ -0,0 +1,83 @@
+/****************************************************************************
+ * Copyright 2019-2020,2021 Thomas E. Dickey                                *
+ * Copyright 1998-2012,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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fld_max.c,v 1.18 2021/06/17 21:26:02 tom Exp $")
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int set_max_field(FIELD *field, int maxgrow)
+|
+|   Description   :  Set the maximum growth for a dynamic field. If maxgrow=0
+|                    the field may grow to any possible size.
+|
+|   Return Values :  E_OK           - success
+|                    E_BAD_ARGUMENT - invalid argument
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+set_max_field(FIELD *field, int maxgrow)
+{
+  T((T_CALLED("set_max_field(%p,%d)"), (void *)field, maxgrow));
+
+  if (!field || (maxgrow < 0))
+    RETURN(E_BAD_ARGUMENT);
+  else
+    {
+      bool single_line_field = Single_Line_Field(field);
+
+      if (maxgrow > 0)
+	{
+	  if (((single_line_field && (maxgrow < field->dcols)) ||
+	       (!single_line_field && (maxgrow < field->drows))) &&
+	      !Field_Has_Option(field, O_INPUT_LIMIT))
+	    RETURN(E_BAD_ARGUMENT);
+	}
+      field->maxgrow = maxgrow;
+      /* shrink */
+      if (maxgrow > 0 && Field_Has_Option(field, O_INPUT_LIMIT) &&
+	  field->dcols > maxgrow)
+	field->dcols = maxgrow;
+      ClrStatus(field, _MAY_GROW);
+      if (!((unsigned)field->opts & O_STATIC))
+	{
+	  if ((maxgrow == 0) ||
+	      (single_line_field && (field->dcols < maxgrow)) ||
+	      (!single_line_field && (field->drows < maxgrow)))
+	    SetStatus(field, _MAY_GROW);
+	}
+    }
+  RETURN(E_OK);
+}
+
+/* fld_max.c ends here */
diff --git a/form/fld_move.c b/form/fld_move.c
new file mode 100644
index 0000000..0d9ac4a
--- /dev/null
+++ b/form/fld_move.c
@@ -0,0 +1,65 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2010,2012 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fld_move.c,v 1.16 2021/06/17 21:20:30 tom Exp $")
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int move_field(FIELD *field,int frow, int fcol)
+|
+|   Description   :  Moves the disconnected field to the new location in
+|                    the form's subwindow.
+|
+|   Return Values :  E_OK            - success
+|                    E_BAD_ARGUMENT  - invalid argument passed
+|                    E_CONNECTED     - field is connected
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+move_field(FIELD *field, int frow, int fcol)
+{
+  T((T_CALLED("move_field(%p,%d,%d)"), (void *)field, frow, fcol));
+
+  if (!field || (frow < 0) || (fcol < 0))
+    RETURN(E_BAD_ARGUMENT);
+
+  if (field->form)
+    RETURN(E_CONNECTED);
+
+  field->frow = (short)frow;
+  field->fcol = (short)fcol;
+  RETURN(E_OK);
+}
+
+/* fld_move.c ends here */
diff --git a/form/fld_newftyp.c b/form/fld_newftyp.c
new file mode 100644
index 0000000..c5848d5
--- /dev/null
+++ b/form/fld_newftyp.c
@@ -0,0 +1,149 @@
+/****************************************************************************
+ * Copyright 2018,2020 Thomas E. Dickey                                     *
+ * Copyright 1998-2010,2016 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fld_newftyp.c,v 1.23 2020/05/24 01:40:20 anonymous.maarten Exp $")
+
+static FIELDTYPE default_fieldtype =
+{
+  0,				/* status                                      */
+  0L,				/* reference count                             */
+  (FIELDTYPE *)0,		/* pointer to left  operand                    */
+  (FIELDTYPE *)0,		/* pointer to right operand                    */
+  NULL,				/* makearg function                            */
+  NULL,				/* copyarg function                            */
+  NULL,				/* freearg function                            */
+  INIT_FT_FUNC(NULL),		/* field validation function                   */
+  INIT_FT_FUNC(NULL),		/* Character check function                    */
+  INIT_FT_FUNC(NULL),		/* enumerate next function                     */
+  INIT_FT_FUNC(NULL),		/* enumerate previous function                 */
+#if NCURSES_INTEROP_FUNCS
+  NULL				/* generic callback alternative to makearg     */
+#endif
+};
+
+FORM_EXPORT_VAR(FIELDTYPE *)
+  _nc_Default_FieldType = &default_fieldtype;
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  FIELDTYPE *new_fieldtype(
+|                       bool (* const field_check)(FIELD *,const void *),
+|                       bool (* const char_check) (int, const void *) )
+|
+|   Description   :  Create a new fieldtype. The application programmer must
+|                    write a field_check and a char_check function and give
+|                    them as input to this call.
+|                    If an error occurs, errno is set to
+|                       E_BAD_ARGUMENT  - invalid arguments
+|                       E_SYSTEM_ERROR  - system error (no memory)
+|
+|   Return Values :  Fieldtype pointer or NULL if error occurred
++--------------------------------------------------------------------------*/
+FORM_EXPORT(FIELDTYPE *)
+new_fieldtype(bool (*const field_check) (FIELD *, const void *),
+	      bool (*const char_check) (int, const void *))
+{
+  FIELDTYPE *nftyp = (FIELDTYPE *)0;
+
+  TR_FUNC_BFR(2);
+
+  T((T_CALLED("new_fieldtype(%s,%s)"),
+     TR_FUNC_ARG(0, field_check),
+     TR_FUNC_ARG(1, char_check)));
+
+  if ((field_check) || (char_check))
+    {
+      nftyp = typeMalloc(FIELDTYPE, 1);
+
+      if (nftyp)
+	{
+	  T((T_CREATE("fieldtype %p"), (void *)nftyp));
+	  *nftyp = default_fieldtype;
+#if NCURSES_INTEROP_FUNCS
+	  nftyp->fieldcheck.ofcheck = field_check;
+	  nftyp->charcheck.occheck = char_check;
+#else
+	  nftyp->fcheck = field_check;
+	  nftyp->ccheck = char_check;
+#endif
+	}
+      else
+	{
+	  SET_ERROR(E_SYSTEM_ERROR);
+	}
+    }
+  else
+    {
+      SET_ERROR(E_BAD_ARGUMENT);
+    }
+  returnFieldType(nftyp);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int free_fieldtype(FIELDTYPE *typ)
+|
+|   Description   :  Release the memory associated with this fieldtype.
+|
+|   Return Values :  E_OK            - success
+|                    E_CONNECTED     - there are fields referencing the type
+|                    E_BAD_ARGUMENT  - invalid fieldtype pointer
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+free_fieldtype(FIELDTYPE *typ)
+{
+  T((T_CALLED("free_fieldtype(%p)"), (void *)typ));
+
+  if (!typ)
+    RETURN(E_BAD_ARGUMENT);
+
+  if (typ->ref != 0)
+    RETURN(E_CONNECTED);
+
+  if (typ->status & _RESIDENT)
+    RETURN(E_CONNECTED);
+
+  if (typ->status & _LINKED_TYPE)
+    {
+      if (typ->left)
+	typ->left->ref--;
+      if (typ->right)
+	typ->right->ref--;
+    }
+  free(typ);
+  RETURN(E_OK);
+}
+
+/* fld_newftyp.c ends here */
diff --git a/form/fld_opts.c b/form/fld_opts.c
new file mode 100644
index 0000000..ab4d559
--- /dev/null
+++ b/form/fld_opts.c
@@ -0,0 +1,139 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2004,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fld_opts.c,v 1.16 2021/06/17 21:20:30 tom Exp $")
+
+/*----------------------------------------------------------------------------
+  Field-Options manipulation routines
+  --------------------------------------------------------------------------*/
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int set_field_opts(FIELD *field, Field_Options opts)
+|
+|   Description   :  Turns on the named options for this field and turns
+|                    off all the remaining options.
+|
+|   Return Values :  E_OK            - success
+|                    E_CURRENT       - the field is the current field
+|                    E_BAD_ARGUMENT  - invalid options
+|                    E_SYSTEM_ERROR  - system error
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+set_field_opts(FIELD *field, Field_Options opts)
+{
+  int res = E_BAD_ARGUMENT;
+
+  T((T_CALLED("set_field_opts(%p,%d)"), (void *)field, opts));
+
+  opts &= ALL_FIELD_OPTS;
+  if (!(opts & ~ALL_FIELD_OPTS))
+    res = _nc_Synchronize_Options(Normalize_Field(field), opts);
+  RETURN(res);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  Field_Options field_opts(const FIELD *field)
+|
+|   Description   :  Retrieve the field's options.
+|
+|   Return Values :  The options.
++--------------------------------------------------------------------------*/
+FORM_EXPORT(Field_Options)
+field_opts(const FIELD *field)
+{
+  T((T_CALLED("field_opts(%p)"), (const void *)field));
+
+  returnCode(ALL_FIELD_OPTS & Normalize_Field(field)->opts);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int field_opts_on(FIELD *field, Field_Options opts)
+|
+|   Description   :  Turns on the named options for this field and all the
+|                    remaining options are unchanged.
+|
+|   Return Values :  E_OK            - success
+|                    E_CURRENT       - the field is the current field
+|                    E_BAD_ARGUMENT  - invalid options
+|                    E_SYSTEM_ERROR  - system error
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+field_opts_on(FIELD *field, Field_Options opts)
+{
+  int res = E_BAD_ARGUMENT;
+
+  T((T_CALLED("field_opts_on(%p,%d)"), (void *)field, opts));
+
+  opts &= ALL_FIELD_OPTS;
+  if (!(opts & ~ALL_FIELD_OPTS))
+    {
+      Normalize_Field(field);
+      res = _nc_Synchronize_Options(field, field->opts | opts);
+    }
+  RETURN(res);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int field_opts_off(FIELD *field, Field_Options opts)
+|
+|   Description   :  Turns off the named options for this field and all the
+|                    remaining options are unchanged.
+|
+|   Return Values :  E_OK            - success
+|                    E_CURRENT       - the field is the current field
+|                    E_BAD_ARGUMENT  - invalid options
+|                    E_SYSTEM_ERROR  - system error
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+field_opts_off(FIELD *field, Field_Options opts)
+{
+  int res = E_BAD_ARGUMENT;
+
+  T((T_CALLED("field_opts_off(%p,%d)"), (void *)field, opts));
+
+  opts &= ALL_FIELD_OPTS;
+  if (!(opts & ~ALL_FIELD_OPTS))
+    {
+      Normalize_Field(field);
+      res = _nc_Synchronize_Options(field, field->opts & ~opts);
+    }
+  RETURN(res);
+}
+
+/* fld_opts.c ends here */
diff --git a/form/fld_pad.c b/form/fld_pad.c
new file mode 100644
index 0000000..fdd803f
--- /dev/null
+++ b/form/fld_pad.c
@@ -0,0 +1,86 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2004,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fld_pad.c,v 1.14 2021/06/17 21:20:30 tom Exp $")
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int set_field_pad(FIELD *field, int ch)
+|
+|   Description   :  Set the pad character used to fill the field. This must
+|                    be a printable character.
+|
+|   Return Values :  E_OK           - success
+|                    E_BAD_ARGUMENT - invalid field pointer or pad character
+|                    E_SYSTEM_ERROR - system error
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+set_field_pad(FIELD *field, int ch)
+{
+  int res = E_BAD_ARGUMENT;
+
+  T((T_CALLED("set_field_pad(%p,%d)"), (void *)field, ch));
+
+  Normalize_Field(field);
+  if (isprint(UChar(ch)))
+    {
+      if (field->pad != ch)
+	{
+	  field->pad = ch;
+	  res = _nc_Synchronize_Attributes(field);
+	}
+      else
+	res = E_OK;
+    }
+  RETURN(res);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int field_pad(const FIELD *field)
+|
+|   Description   :  Retrieve the field's pad character.
+|
+|   Return Values :  The pad character.
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+field_pad(const FIELD *field)
+{
+  T((T_CALLED("field_pad(%p)"), (const void *)field));
+
+  returnCode(Normalize_Field(field)->pad);
+}
+
+/* fld_pad.c ends here */
diff --git a/form/fld_page.c b/form/fld_page.c
new file mode 100644
index 0000000..6972d31
--- /dev/null
+++ b/form/fld_page.c
@@ -0,0 +1,83 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2010,2012 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fld_page.c,v 1.16 2021/06/17 21:20:30 tom Exp $")
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int set_new_page(FIELD *field, bool new_page_flag)
+|
+|   Description   :  Marks the field as the beginning of a new page of
+|                    the form.
+|
+|   Return Values :  E_OK         - success
+|                    E_CONNECTED  - field is connected
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+set_new_page(FIELD *field, bool new_page_flag)
+{
+  T((T_CALLED("set_new_page(%p,%d)"), (void *)field, new_page_flag));
+
+  Normalize_Field(field);
+  if (field->form)
+    RETURN(E_CONNECTED);
+
+  if (new_page_flag)
+    SetStatus(field, _NEWPAGE);
+  else
+    ClrStatus(field, _NEWPAGE);
+
+  RETURN(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  bool new_page(const FIELD *field)
+|
+|   Description   :  Retrieve the information whether or not the field starts
+|                    a new page on the form.
+|
+|   Return Values :  TRUE  - field starts a new page
+|                    FALSE - field doesn't start a new page
++--------------------------------------------------------------------------*/
+FORM_EXPORT(bool)
+new_page(const FIELD *field)
+{
+  T((T_CALLED("new_page(%p)"), (const void *)field));
+
+  returnBool((Normalize_Field(field)->status & _NEWPAGE) ? TRUE : FALSE);
+}
+
+/* fld_page.c ends here */
diff --git a/form/fld_stat.c b/form/fld_stat.c
new file mode 100644
index 0000000..62d782e
--- /dev/null
+++ b/form/fld_stat.c
@@ -0,0 +1,80 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2010,2012 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fld_stat.c,v 1.18 2021/06/17 21:20:30 tom Exp $")
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int set_field_status(FIELD *field, bool status)
+|
+|   Description   :  Set or clear the 'changed' indication flag for that
+|                    field's primary buffer.
+|
+|   Return Values :  E_OK            - success
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+set_field_status(FIELD *field, bool status)
+{
+  T((T_CALLED("set_field_status(%p,%d)"), (void *)field, status));
+
+  Normalize_Field(field);
+
+  if (status)
+    SetStatus(field, _CHANGED);
+  else
+    ClrStatus(field, _CHANGED);
+
+  RETURN(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  bool field_status(const FIELD *field)
+|
+|   Description   :  Retrieve the value of the 'changed' indication flag
+|                    for that field's primary buffer.
+|
+|   Return Values :  TRUE  - buffer has been changed
+|                    FALSE - buffer has not been changed
++--------------------------------------------------------------------------*/
+FORM_EXPORT(bool)
+field_status(const FIELD *field)
+{
+  T((T_CALLED("field_status(%p)"), (const void *)field));
+
+  returnBool((Normalize_Field(field)->status & _CHANGED) ? TRUE : FALSE);
+}
+
+/* fld_stat.c ends here */
diff --git a/form/fld_type.c b/form/fld_type.c
new file mode 100644
index 0000000..c557e05
--- /dev/null
+++ b/form/fld_type.c
@@ -0,0 +1,98 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2004,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fld_type.c,v 1.20 2021/06/17 21:20:30 tom Exp $")
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int set_field_type(FIELD *field, FIELDTYPE *type,...)
+|
+|   Description   :  Associate the specified fieldtype with the field.
+|                    Certain field types take additional arguments. Look
+|                    at the spec of the field types !
+|
+|   Return Values :  E_OK           - success
+|                    E_SYSTEM_ERROR - system error
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+set_field_type(FIELD *field, FIELDTYPE *type, ...)
+{
+  va_list ap;
+  int res = E_SYSTEM_ERROR;
+  int err = 0;
+
+  T((T_CALLED("set_field_type(%p,%p)"), (void *)field, (void *)type));
+
+  va_start(ap, type);
+
+  Normalize_Field(field);
+  _nc_Free_Type(field);
+
+  field->type = type;
+  field->arg = (void *)_nc_Make_Argument(field->type, &ap, &err);
+
+  if (err)
+    {
+      _nc_Free_Argument(field->type, (TypeArgument *)(field->arg));
+      field->type = (FIELDTYPE *)0;
+      field->arg = (void *)0;
+    }
+  else
+    {
+      res = E_OK;
+      if (field->type)
+	field->type->ref++;
+    }
+
+  va_end(ap);
+  RETURN(res);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  FIELDTYPE *field_type(const FIELD *field)
+|
+|   Description   :  Retrieve the associated fieldtype for this field.
+|
+|   Return Values :  Pointer to fieldtype of NULL if none is defined.
++--------------------------------------------------------------------------*/
+FORM_EXPORT(FIELDTYPE *)
+field_type(const FIELD *field)
+{
+  T((T_CALLED("field_type(%p)"), (const void *)field));
+  returnFieldType(Normalize_Field(field)->type);
+}
+
+/* fld_type.c ends here */
diff --git a/form/fld_user.c b/form/fld_user.c
new file mode 100644
index 0000000..1b13e62
--- /dev/null
+++ b/form/fld_user.c
@@ -0,0 +1,73 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2004,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fld_user.c,v 1.20 2021/06/17 21:20:30 tom Exp $")
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int set_field_userptr(FIELD *field, void *usrptr)
+|
+|   Description   :  Set the pointer that is reserved in any field to store
+|                    application relevant information.
+|
+|   Return Values :  E_OK         - on success
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+set_field_userptr(FIELD *field, void *usrptr)
+{
+  T((T_CALLED("set_field_userptr(%p,%p)"), (void *)field, (void *)usrptr));
+
+  Normalize_Field(field)->usrptr = usrptr;
+  RETURN(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  void *field_userptr(const FIELD *field)
+|
+|   Description   :  Return the pointer that is reserved in any field to
+|                    store application relevant information.
+|
+|   Return Values :  Value of pointer. If no such pointer has been set,
+|                    NULL is returned
++--------------------------------------------------------------------------*/
+FORM_EXPORT(void *)
+field_userptr(const FIELD *field)
+{
+  T((T_CALLED("field_userptr(%p)"), (const void *)field));
+  returnVoidPtr(Normalize_Field(field)->usrptr);
+}
+
+/* fld_user.c ends here */
diff --git a/form/form.h b/form/form.h
new file mode 100644
index 0000000..3b62e39
--- /dev/null
+++ b/form/form.h
@@ -0,0 +1,460 @@
+/****************************************************************************
+ * Copyright 2018-2019-2020,2021 Thomas E. Dickey                           *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+/* $Id: form.h,v 0.32 2021/06/17 21:26:02 tom Exp $ */
+
+#ifndef FORM_H
+#define FORM_H
+/* *INDENT-OFF*/
+
+#include <curses.h>
+#include <eti.h>
+
+#ifdef __cplusplus
+  extern "C" {
+#endif
+
+#if defined(BUILDING_FORM)
+# define FORM_IMPEXP NCURSES_EXPORT_GENERAL_EXPORT
+#else
+# define FORM_IMPEXP NCURSES_EXPORT_GENERAL_IMPORT
+#endif
+
+#define FORM_WRAPPED_VAR(type,name) extern FORM_IMPEXP type NCURSES_PUBLIC_VAR(name)(void)
+
+#define FORM_EXPORT(type) FORM_IMPEXP type NCURSES_API
+#define FORM_EXPORT_VAR(type) FORM_IMPEXP type
+
+#ifndef FORM_PRIV_H
+typedef void *FIELD_CELL;
+#endif
+
+#ifndef NCURSES_FIELD_INTERNALS
+#define NCURSES_FIELD_INTERNALS /* nothing */
+#endif
+
+typedef int Form_Options;
+typedef int Field_Options;
+
+	/**********
+	*  _PAGE  *
+	**********/
+
+typedef struct pagenode
+#if !NCURSES_OPAQUE_FORM
+{
+  short pmin;		/* index of first field on page			*/
+  short pmax;		/* index of last field on page			*/
+  short smin;		/* index of top leftmost field on page		*/
+  short smax;		/* index of bottom rightmost field on page	*/
+}
+#endif /* !NCURSES_OPAQUE_FORM */
+_PAGE;
+
+	/**********
+	*  FIELD  *
+	**********/
+
+typedef struct fieldnode
+#if 1			/* not yet: !NCURSES_OPAQUE_FORM */
+{
+  unsigned short	status;		/* flags			*/
+  short			rows;		/* size in rows			*/
+  short			cols;		/* size in cols			*/
+  short			frow;		/* first row			*/
+  short			fcol;		/* first col			*/
+  int			drows;		/* dynamic rows			*/
+  int			dcols;		/* dynamic cols			*/
+  int			maxgrow;	/* maximum field growth		*/
+  int			nrow;		/* off-screen rows		*/
+  short			nbuf;		/* additional buffers		*/
+  short			just;		/* justification		*/
+  short			page;		/* page on form			*/
+  short			index;		/* into form -> field		*/
+  int			pad;		/* pad character		*/
+  chtype		fore;		/* foreground attribute		*/
+  chtype		back;		/* background attribute		*/
+  Field_Options		opts;		/* options			*/
+  struct fieldnode *	snext;		/* sorted order pointer		*/
+  struct fieldnode *	sprev;		/* sorted order pointer		*/
+  struct fieldnode *	link;		/* linked field chain		*/
+  struct formnode *	form;		/* containing form		*/
+  struct typenode *	type;		/* field type			*/
+  void *		arg;		/* argument for type		*/
+  FIELD_CELL *		buf;		/* field buffers		*/
+  void *		usrptr;		/* user pointer			*/
+  /*
+   * The wide-character configuration requires extra information.  Because
+   * there are existing applications that manipulate the members of FIELD
+   * directly, we cannot make the struct opaque, except by changing the ABI.
+   * Offsets of members up to this point are the same in the narrow- and
+   * wide-character configuration.  But note that the type of buf depends on
+   * the configuration, and is made opaque for that reason.
+   */
+  NCURSES_FIELD_INTERNALS
+}
+#endif /* NCURSES_OPAQUE_FORM */
+FIELD;
+
+
+	/*********
+	*  FORM  *
+	*********/
+
+typedef struct formnode
+#if 1			/* not yet: !NCURSES_OPAQUE_FORM */
+{
+  unsigned short	status;	  	/* flags			*/
+  short			rows;		/* size in rows			*/
+  short			cols;		/* size in cols			*/
+  int			currow;		/* current row in field window	*/
+  int			curcol;		/* current col in field window	*/
+  int			toprow;		/* in scrollable field window	*/
+  int			begincol;	/* in horiz. scrollable field	*/
+  short			maxfield;	/* number of fields		*/
+  short			maxpage;	/* number of pages		*/
+  short			curpage;	/* index into page		*/
+  Form_Options		opts;		/* options			*/
+  WINDOW *		win;		/* window			*/
+  WINDOW *		sub;		/* subwindow			*/
+  WINDOW *		w;		/* window for current field	*/
+  FIELD **		field;		/* field [maxfield]		*/
+  FIELD *		current;	/* current field		*/
+  _PAGE *		page;		/* page [maxpage]		*/
+  void *		usrptr;		/* user pointer			*/
+
+  void			(*forminit)(struct formnode *);
+  void			(*formterm)(struct formnode *);
+  void			(*fieldinit)(struct formnode *);
+  void			(*fieldterm)(struct formnode *);
+
+}
+#endif /* !NCURSES_OPAQUE_FORM */
+FORM;
+
+
+	/**************
+	*  FIELDTYPE  *
+	**************/
+
+typedef struct typenode
+#if !NCURSES_OPAQUE_FORM
+{
+  unsigned short	status;			/* flags		    */
+  long			ref;			/* reference count	    */
+  struct typenode *	left;			/* ptr to operand for |     */
+  struct typenode *	right;			/* ptr to operand for |     */
+
+  void* (*makearg)(va_list *);			/* make fieldtype arg	    */
+  void* (*copyarg)(const void *);		/* copy fieldtype arg 	    */
+  void	(*freearg)(void *);			/* free fieldtype arg	    */
+
+#if NCURSES_INTEROP_FUNCS
+  union {
+    bool (*ofcheck)(FIELD *,const void *);	/* field validation	    */
+    bool (*gfcheck)(FORM*,FIELD *,const void*);	/* generic field validation */
+  } fieldcheck;
+  union {
+    bool (*occheck)(int,const void *);		/* character validation     */
+    bool (*gccheck)(int,FORM*,
+		    FIELD*,const void*);        /* generic char validation  */
+  } charcheck;
+  union {
+    bool (*onext)(FIELD *,const void *);        /* enumerate next value     */
+    bool (*gnext)(FORM*,FIELD*,const void*);    /* generic enumerate next   */
+  } enum_next;
+  union {
+    bool (*oprev)(FIELD *,const void *);	/* enumerate prev value     */
+    bool (*gprev)(FORM*,FIELD*,const void*);    /* generic enumerate prev   */
+  } enum_prev;
+  void* (*genericarg)(void*);                   /* Alternate Arg method     */
+#else
+  bool	(*fcheck)(FIELD *,const void *);	/* field validation	*/
+  bool	(*ccheck)(int,const void *);		/* character validation */
+
+  bool	(*next)(FIELD *,const void *);		/* enumerate next value */
+  bool	(*prev)(FIELD *,const void *);		/* enumerate prev value */
+#endif
+}
+#endif /* !NCURSES_OPAQUE_FORM */
+FIELDTYPE;
+
+typedef void (*Form_Hook)(FORM *);
+
+	/***************************
+	*  miscellaneous #defines  *
+	***************************/
+
+/* field justification */
+#define NO_JUSTIFICATION	(0)
+#define JUSTIFY_LEFT		(1)
+#define JUSTIFY_CENTER		(2)
+#define JUSTIFY_RIGHT		(3)
+
+/* field options */
+#define O_VISIBLE		(0x0001U)
+#define O_ACTIVE		(0x0002U)
+#define O_PUBLIC		(0x0004U)
+#define O_EDIT			(0x0008U)
+#define O_WRAP			(0x0010U)
+#define O_BLANK			(0x0020U)
+#define O_AUTOSKIP		(0x0040U)
+#define O_NULLOK		(0x0080U)
+#define O_PASSOK		(0x0100U)
+#define O_STATIC		(0x0200U)
+#define O_DYNAMIC_JUSTIFY	(0x0400U)	/* ncurses extension	*/
+#define O_NO_LEFT_STRIP		(0x0800U)	/* ncurses extension	*/
+#define O_EDGE_INSERT_STAY      (0x1000U)	/* ncurses extension	*/
+#define O_INPUT_LIMIT           (0x2000U)	/* ncurses extension	*/
+
+/* form options */
+#define O_NL_OVERLOAD		(0x0001U)
+#define O_BS_OVERLOAD		(0x0002U)
+
+/* form driver commands */
+#define REQ_NEXT_PAGE	 (KEY_MAX + 1)	/* move to next page		*/
+#define REQ_PREV_PAGE	 (KEY_MAX + 2)	/* move to previous page	*/
+#define REQ_FIRST_PAGE	 (KEY_MAX + 3)	/* move to first page		*/
+#define REQ_LAST_PAGE	 (KEY_MAX + 4)	/* move to last page		*/
+
+#define REQ_NEXT_FIELD	 (KEY_MAX + 5)	/* move to next field		*/
+#define REQ_PREV_FIELD	 (KEY_MAX + 6)	/* move to previous field	*/
+#define REQ_FIRST_FIELD	 (KEY_MAX + 7)	/* move to first field		*/
+#define REQ_LAST_FIELD	 (KEY_MAX + 8)	/* move to last field		*/
+#define REQ_SNEXT_FIELD	 (KEY_MAX + 9)	/* move to sorted next field	*/
+#define REQ_SPREV_FIELD	 (KEY_MAX + 10)	/* move to sorted prev field	*/
+#define REQ_SFIRST_FIELD (KEY_MAX + 11)	/* move to sorted first field	*/
+#define REQ_SLAST_FIELD	 (KEY_MAX + 12)	/* move to sorted last field	*/
+#define REQ_LEFT_FIELD	 (KEY_MAX + 13)	/* move to left to field	*/
+#define REQ_RIGHT_FIELD	 (KEY_MAX + 14)	/* move to right to field	*/
+#define REQ_UP_FIELD	 (KEY_MAX + 15)	/* move to up to field		*/
+#define REQ_DOWN_FIELD	 (KEY_MAX + 16)	/* move to down to field	*/
+
+#define REQ_NEXT_CHAR	 (KEY_MAX + 17)	/* move to next char in field	*/
+#define REQ_PREV_CHAR	 (KEY_MAX + 18)	/* move to prev char in field	*/
+#define REQ_NEXT_LINE	 (KEY_MAX + 19)	/* move to next line in field	*/
+#define REQ_PREV_LINE	 (KEY_MAX + 20)	/* move to prev line in field	*/
+#define REQ_NEXT_WORD	 (KEY_MAX + 21)	/* move to next word in field	*/
+#define REQ_PREV_WORD	 (KEY_MAX + 22)	/* move to prev word in field	*/
+#define REQ_BEG_FIELD	 (KEY_MAX + 23)	/* move to first char in field	*/
+#define REQ_END_FIELD	 (KEY_MAX + 24)	/* move after last char in fld	*/
+#define REQ_BEG_LINE	 (KEY_MAX + 25)	/* move to beginning of line	*/
+#define REQ_END_LINE	 (KEY_MAX + 26)	/* move after last char in line	*/
+#define REQ_LEFT_CHAR	 (KEY_MAX + 27)	/* move left in field		*/
+#define REQ_RIGHT_CHAR	 (KEY_MAX + 28)	/* move right in field		*/
+#define REQ_UP_CHAR	 (KEY_MAX + 29)	/* move up in field		*/
+#define REQ_DOWN_CHAR	 (KEY_MAX + 30)	/* move down in field		*/
+
+#define REQ_NEW_LINE	 (KEY_MAX + 31)	/* insert/overlay new line	*/
+#define REQ_INS_CHAR	 (KEY_MAX + 32)	/* insert blank char at cursor	*/
+#define REQ_INS_LINE	 (KEY_MAX + 33)	/* insert blank line at cursor	*/
+#define REQ_DEL_CHAR	 (KEY_MAX + 34)	/* delete char at cursor	*/
+#define REQ_DEL_PREV	 (KEY_MAX + 35)	/* delete char before cursor	*/
+#define REQ_DEL_LINE	 (KEY_MAX + 36)	/* delete line at cursor	*/
+#define REQ_DEL_WORD	 (KEY_MAX + 37)	/* delete word at cursor	*/
+#define REQ_CLR_EOL	 (KEY_MAX + 38)	/* clear to end of line		*/
+#define REQ_CLR_EOF	 (KEY_MAX + 39)	/* clear to end of field	*/
+#define REQ_CLR_FIELD	 (KEY_MAX + 40)	/* clear entire field		*/
+#define REQ_OVL_MODE	 (KEY_MAX + 41)	/* begin overlay mode		*/
+#define REQ_INS_MODE	 (KEY_MAX + 42)	/* begin insert mode		*/
+#define REQ_SCR_FLINE	 (KEY_MAX + 43)	/* scroll field forward a line	*/
+#define REQ_SCR_BLINE	 (KEY_MAX + 44)	/* scroll field backward a line	*/
+#define REQ_SCR_FPAGE	 (KEY_MAX + 45)	/* scroll field forward a page	*/
+#define REQ_SCR_BPAGE	 (KEY_MAX + 46)	/* scroll field backward a page	*/
+#define REQ_SCR_FHPAGE	 (KEY_MAX + 47) /* scroll field forward	 half page */
+#define REQ_SCR_BHPAGE	 (KEY_MAX + 48) /* scroll field backward half page */
+#define REQ_SCR_FCHAR	 (KEY_MAX + 49) /* horizontal scroll char	*/
+#define REQ_SCR_BCHAR	 (KEY_MAX + 50) /* horizontal scroll char	*/
+#define REQ_SCR_HFLINE	 (KEY_MAX + 51) /* horizontal scroll line	*/
+#define REQ_SCR_HBLINE	 (KEY_MAX + 52) /* horizontal scroll line	*/
+#define REQ_SCR_HFHALF	 (KEY_MAX + 53) /* horizontal scroll half line	*/
+#define REQ_SCR_HBHALF	 (KEY_MAX + 54) /* horizontal scroll half line	*/
+
+#define REQ_VALIDATION	 (KEY_MAX + 55)	/* validate field		*/
+#define REQ_NEXT_CHOICE	 (KEY_MAX + 56)	/* display next field choice	*/
+#define REQ_PREV_CHOICE	 (KEY_MAX + 57)	/* display prev field choice	*/
+
+#define MIN_FORM_COMMAND (KEY_MAX + 1)	/* used by form_driver		*/
+#define MAX_FORM_COMMAND (KEY_MAX + 57)	/* used by form_driver		*/
+
+#if defined(MAX_COMMAND)
+#  if (MAX_FORM_COMMAND > MAX_COMMAND)
+#    error Something is wrong -- MAX_FORM_COMMAND is greater than MAX_COMMAND
+#  elif (MAX_COMMAND != (KEY_MAX + 128))
+#    error Something is wrong -- MAX_COMMAND is already inconsistently defined.
+#  endif
+#else
+#  define MAX_COMMAND (KEY_MAX + 128)
+#endif
+
+	/*************************
+	*  standard field types  *
+	*************************/
+extern FORM_EXPORT_VAR(FIELDTYPE *) TYPE_ALPHA;
+extern FORM_EXPORT_VAR(FIELDTYPE *) TYPE_ALNUM;
+extern FORM_EXPORT_VAR(FIELDTYPE *) TYPE_ENUM;
+extern FORM_EXPORT_VAR(FIELDTYPE *) TYPE_INTEGER;
+extern FORM_EXPORT_VAR(FIELDTYPE *) TYPE_NUMERIC;
+extern FORM_EXPORT_VAR(FIELDTYPE *) TYPE_REGEXP;
+
+	/************************************
+	*  built-in additional field types  *
+	*  They are not defined in SVr4     *
+	************************************/
+extern FORM_EXPORT_VAR(FIELDTYPE *) TYPE_IPV4;      /* Internet IP Version 4 address */
+
+	/***********************
+	*  FIELDTYPE routines  *
+	***********************/
+extern FORM_EXPORT(FIELDTYPE *) new_fieldtype (
+		    bool (* const field_check)(FIELD *,const void *),
+		    bool (* const char_check)(int,const void *));
+extern FORM_EXPORT(FIELDTYPE *) link_fieldtype(
+		    FIELDTYPE *, FIELDTYPE *);
+
+extern FORM_EXPORT(int)	free_fieldtype (FIELDTYPE *);
+extern FORM_EXPORT(int)	set_fieldtype_arg (FIELDTYPE *,
+		    void * (* const make_arg)(va_list *),
+		    void * (* const copy_arg)(const void *),
+		    void (* const free_arg)(void *));
+extern FORM_EXPORT(int)	 set_fieldtype_choice (FIELDTYPE *,
+		    bool (* const next_choice)(FIELD *,const void *),
+	      	    bool (* const prev_choice)(FIELD *,const void *));
+
+	/*******************
+	*  FIELD routines  *
+	*******************/
+extern FORM_EXPORT(FIELD *)	new_field (int,int,int,int,int,int);
+extern FORM_EXPORT(FIELD *)	dup_field (FIELD *,int,int);
+extern FORM_EXPORT(FIELD *)	link_field (FIELD *,int,int);
+
+extern FORM_EXPORT(int)	free_field (FIELD *);
+extern FORM_EXPORT(int)	field_info (const FIELD *,int *,int *,int *,int *,int *,int *);
+extern FORM_EXPORT(int)	dynamic_field_info (const FIELD *,int *,int *,int *);
+extern FORM_EXPORT(int)	set_max_field ( FIELD *,int);
+extern FORM_EXPORT(int)	move_field (FIELD *,int,int);
+extern FORM_EXPORT(int)	set_field_type (FIELD *,FIELDTYPE *,...);
+extern FORM_EXPORT(int)	set_new_page (FIELD *,bool);
+extern FORM_EXPORT(int)	set_field_just (FIELD *,int);
+extern FORM_EXPORT(int)	field_just (const FIELD *);
+extern FORM_EXPORT(int)	set_field_fore (FIELD *,chtype);
+extern FORM_EXPORT(int)	set_field_back (FIELD *,chtype);
+extern FORM_EXPORT(int)	set_field_pad (FIELD *,int);
+extern FORM_EXPORT(int)	field_pad (const FIELD *);
+extern FORM_EXPORT(int)	set_field_buffer (FIELD *,int,const char *);
+extern FORM_EXPORT(int)	set_field_status (FIELD *,bool);
+extern FORM_EXPORT(int)	set_field_userptr (FIELD *, void *);
+extern FORM_EXPORT(int)	set_field_opts (FIELD *,Field_Options);
+extern FORM_EXPORT(int)	field_opts_on (FIELD *,Field_Options);
+extern FORM_EXPORT(int)	field_opts_off (FIELD *,Field_Options);
+
+extern FORM_EXPORT(chtype)	field_fore (const FIELD *);
+extern FORM_EXPORT(chtype)	field_back (const FIELD *);
+
+extern FORM_EXPORT(bool)	new_page (const FIELD *);
+extern FORM_EXPORT(bool)	field_status (const FIELD *);
+
+extern FORM_EXPORT(void *)	field_arg (const FIELD *);
+
+extern FORM_EXPORT(void *)	field_userptr (const FIELD *);
+
+extern FORM_EXPORT(FIELDTYPE *)	field_type (const FIELD *);
+
+extern FORM_EXPORT(char *)	field_buffer (const FIELD *,int);
+
+extern FORM_EXPORT(Field_Options)	field_opts (const FIELD *);
+
+	/******************
+	*  FORM routines  *
+	******************/
+
+extern FORM_EXPORT(FORM *)	new_form (FIELD **);
+
+extern FORM_EXPORT(FIELD **)	form_fields (const FORM *);
+extern FORM_EXPORT(FIELD *)	current_field (const FORM *);
+
+extern FORM_EXPORT(WINDOW *)	form_win (const FORM *);
+extern FORM_EXPORT(WINDOW *)	form_sub (const FORM *);
+
+extern FORM_EXPORT(Form_Hook)	form_init (const FORM *);
+extern FORM_EXPORT(Form_Hook)	form_term (const FORM *);
+extern FORM_EXPORT(Form_Hook)	field_init (const FORM *);
+extern FORM_EXPORT(Form_Hook)	field_term (const FORM *);
+
+extern FORM_EXPORT(int)	free_form (FORM *);
+extern FORM_EXPORT(int)	set_form_fields (FORM *,FIELD **);
+extern FORM_EXPORT(int)	field_count (const FORM *);
+extern FORM_EXPORT(int)	set_form_win (FORM *,WINDOW *);
+extern FORM_EXPORT(int)	set_form_sub (FORM *,WINDOW *);
+extern FORM_EXPORT(int)	set_current_field (FORM *,FIELD *);
+extern FORM_EXPORT(int)	unfocus_current_field (FORM *);
+extern FORM_EXPORT(int)	field_index (const FIELD *);
+extern FORM_EXPORT(int)	set_form_page (FORM *,int);
+extern FORM_EXPORT(int)	form_page (const FORM *);
+extern FORM_EXPORT(int)	scale_form (const FORM *,int *,int *);
+extern FORM_EXPORT(int)	set_form_init (FORM *,Form_Hook);
+extern FORM_EXPORT(int)	set_form_term (FORM *,Form_Hook);
+extern FORM_EXPORT(int)	set_field_init (FORM *,Form_Hook);
+extern FORM_EXPORT(int)	set_field_term (FORM *,Form_Hook);
+extern FORM_EXPORT(int)	post_form (FORM *);
+extern FORM_EXPORT(int)	unpost_form (FORM *);
+extern FORM_EXPORT(int)	pos_form_cursor (FORM *);
+extern FORM_EXPORT(int)	form_driver (FORM *,int);
+# if NCURSES_WIDECHAR
+extern FORM_EXPORT(int)	form_driver_w (FORM *,int,wchar_t);
+# endif
+extern FORM_EXPORT(int)	set_form_userptr (FORM *,void *);
+extern FORM_EXPORT(int)	set_form_opts (FORM *,Form_Options);
+extern FORM_EXPORT(int)	form_opts_on (FORM *,Form_Options);
+extern FORM_EXPORT(int)	form_opts_off (FORM *,Form_Options);
+extern FORM_EXPORT(int)	form_request_by_name (const char *);
+
+extern FORM_EXPORT(const char *)	form_request_name (int);
+
+extern FORM_EXPORT(void *)	form_userptr (const FORM *);
+
+extern FORM_EXPORT(Form_Options)	form_opts (const FORM *);
+
+extern FORM_EXPORT(bool)	data_ahead (const FORM *);
+extern FORM_EXPORT(bool)	data_behind (const FORM *);
+
+#if NCURSES_SP_FUNCS
+extern FORM_EXPORT(FORM *)	NCURSES_SP_NAME(new_form) (SCREEN*, FIELD **);
+#endif
+
+#ifdef __cplusplus
+  }
+#endif
+/* *INDENT-ON*/
+
+#endif /* FORM_H */
diff --git a/form/form.priv.h b/form/form.priv.h
new file mode 100644
index 0000000..4cf3071
--- /dev/null
+++ b/form/form.priv.h
@@ -0,0 +1,312 @@
+/****************************************************************************
+ * Copyright 2018-2020,2021 Thomas E. Dickey                                *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+/* $Id: form.priv.h,v 0.48 2021/06/17 21:30:22 tom Exp $ */
+
+#ifndef FORM_PRIV_H
+#define FORM_PRIV_H 1
+/* *INDENT-OFF*/
+#include "curses.priv.h"
+
+#define NCURSES_OPAQUE_FORM  0
+
+#include "mf_common.h"
+
+#if USE_WIDEC_SUPPORT
+#if HAVE_WCTYPE_H
+#include <wctype.h>
+#endif
+
+#ifndef MB_LEN_MAX
+#define MB_LEN_MAX 8 /* should be >= MB_CUR_MAX, but that may be a function */
+#endif
+
+#define FIELD_CELL NCURSES_CH_T
+
+#define NCURSES_FIELD_INTERNALS char** expanded; WINDOW *working;
+#define NCURSES_FIELD_EXTENSION , (char **)0, (WINDOW *)0
+
+#else
+
+#define FIELD_CELL char
+
+#define NCURSES_FIELD_EXTENSION /* nothing */
+
+#endif
+
+#include "form.h"
+
+	/***********************
+	*   Default objects    *
+	***********************/
+extern FORM_EXPORT_VAR(FORM *)      _nc_Default_Form;
+extern FORM_EXPORT_VAR(FIELD *)     _nc_Default_Field;
+extern FORM_EXPORT_VAR(FIELDTYPE *) _nc_Default_FieldType;
+
+/* form  status values */
+#define _OVLMODE         (0x04U) /* Form is in overlay mode                */
+#define _WINDOW_MODIFIED (0x10U) /* Current field window has been modified */
+#define _FCHECK_REQUIRED (0x20U) /* Current field needs validation         */
+
+/* field status values */
+#define _CHANGED         (0x01U) /* Field has been changed                 */
+#define _NEWTOP          (0x02U) /* Vertical scrolling occurred            */
+#define _NEWPAGE         (0x04U) /* field begins new page of form          */
+#define _MAY_GROW        (0x08U) /* dynamic field may still grow           */
+
+/* fieldtype status values */
+#define _LINKED_TYPE     (0x01U) /* Type is a linked type                  */
+#define _HAS_ARGS        (0x02U) /* Type has arguments                     */
+#define _HAS_CHOICE      (0x04U) /* Type has choice methods                */
+#define _RESIDENT        (0x08U) /* Type is built-in                       */
+#define _GENERIC         (0x10U) /* A generic field type                   */
+
+/* This are the field options required to be a selectable field in field
+   navigation requests */
+#define O_SELECTABLE (O_ACTIVE | O_VISIBLE)
+
+/* If form is NULL replace form argument by default-form */
+#define Normalize_Form(form) \
+  ((form) = (form != 0) ? (form) : _nc_Default_Form)
+
+/* If field is NULL replace field argument by default-field */
+#define Normalize_Field(field) \
+  ((field) = (field != 0) ? (field) : _nc_Default_Field)
+
+#if NCURSES_SP_FUNCS
+#define Get_Form_Screen(form) \
+  ((form)->win ? _nc_screen_of((form->win)):CURRENT_SCREEN)
+#else
+#define Get_Form_Screen(form) CURRENT_SCREEN
+#endif
+
+/* Retrieve form's window */
+#define Get_Form_Window(form) \
+  ((form)->sub \
+   ? (form)->sub \
+   : ((form)->win \
+      ? (form)->win \
+      : StdScreen(Get_Form_Screen(form))))
+
+/* Calculate the size for a single buffer for this field */
+#define Buffer_Length(field) ((field)->drows * (field)->dcols)
+
+/* Calculate the total size of all buffers for this field */
+#define Total_Buffer_Size(field) \
+   ( (size_t)(Buffer_Length(field) + 1) * (size_t)(1+(field)->nbuf) * sizeof(FIELD_CELL) )
+
+/* Logic to determine whether or not a field is single lined */
+#define Single_Line_Field(field) \
+   (((field)->rows + (field)->nrow) == 1)
+
+#define Field_Has_Option(f,o)      ((((unsigned)(f)->opts) & o) != 0)
+
+/* Logic to determine whether or not a field is selectable */
+#define Field_Is_Selectable(f)     (((unsigned)((f)->opts) & O_SELECTABLE)==O_SELECTABLE)
+#define Field_Is_Not_Selectable(f) (((unsigned)((f)->opts) & O_SELECTABLE)!=O_SELECTABLE)
+
+typedef struct typearg
+  {
+    struct typearg *left;
+    struct typearg *right;
+  }
+TypeArgument;
+
+/* This is a dummy request code (normally invalid) to be used internally
+   with the form_driver() routine to position to the first active field
+   on the form
+*/
+#define FIRST_ACTIVE_MAGIC (-291056)
+
+#define ALL_FORM_OPTS  (                \
+			O_NL_OVERLOAD  |\
+			O_BS_OVERLOAD   )
+
+#define STD_FIELD_OPTS (Field_Options)( \
+			O_VISIBLE |\
+			O_ACTIVE  |\
+			O_PUBLIC  |\
+			O_EDIT    |\
+			O_WRAP    |\
+			O_BLANK   |\
+			O_AUTOSKIP|\
+			O_NULLOK  |\
+			O_PASSOK  |\
+			O_STATIC)
+
+#define ALL_FIELD_OPTS (Field_Options)( \
+			STD_FIELD_OPTS |\
+			O_DYNAMIC_JUSTIFY |\
+			O_NO_LEFT_STRIP |\
+			O_EDGE_INSERT_STAY |\
+			O_INPUT_LIMIT)
+
+#define C_BLANK ' '
+#define is_blank(c) ((c)==C_BLANK)
+
+#define C_ZEROS '\0'
+
+extern FORM_EXPORT(TypeArgument *) _nc_Make_Argument (const FIELDTYPE*, va_list*, int*);
+extern FORM_EXPORT(TypeArgument *) _nc_Copy_Argument (const FIELDTYPE*, const TypeArgument*, int*);
+extern FORM_EXPORT(void) _nc_Free_Argument (const FIELDTYPE*, TypeArgument*);
+extern FORM_EXPORT(bool) _nc_Copy_Type (FIELD*, FIELD const *);
+extern FORM_EXPORT(void) _nc_Free_Type (FIELD *);
+
+extern FORM_EXPORT(int) _nc_Synchronize_Attributes (FIELD*);
+extern FORM_EXPORT(int) _nc_Synchronize_Options (FIELD*, Field_Options);
+extern FORM_EXPORT(int) _nc_Set_Form_Page (FORM*, int, FIELD*);
+extern FORM_EXPORT(int) _nc_Refresh_Current_Field (FORM*);
+extern FORM_EXPORT(FIELD *) _nc_First_Active_Field (FORM*);
+extern FORM_EXPORT(bool) _nc_Internal_Validation (FORM*);
+extern FORM_EXPORT(int) _nc_Set_Current_Field (FORM*, FIELD*);
+extern FORM_EXPORT(int) _nc_Position_Form_Cursor (FORM*);
+extern FORM_EXPORT(void) _nc_Unset_Current_Field(FORM *form);
+
+#if NCURSES_INTEROP_FUNCS
+extern FORM_EXPORT(FIELDTYPE *) _nc_TYPE_INTEGER(void);
+extern FORM_EXPORT(FIELDTYPE *) _nc_TYPE_ALNUM(void);
+extern FORM_EXPORT(FIELDTYPE *) _nc_TYPE_ALPHA(void);
+extern FORM_EXPORT(FIELDTYPE *) _nc_TYPE_ENUM(void);
+extern FORM_EXPORT(FIELDTYPE *) _nc_TYPE_NUMERIC(void);
+extern FORM_EXPORT(FIELDTYPE *) _nc_TYPE_REGEXP(void);
+extern FORM_EXPORT(FIELDTYPE *) _nc_TYPE_IPV4(void);
+
+extern FORM_EXPORT(FIELDTYPE *)
+_nc_generic_fieldtype(bool (*const field_check) (FORM*,
+						 FIELD *,
+						 const void *),
+		      bool (*const char_check)  (int,
+						 FORM*,
+						 FIELD*,
+						 const void *),
+		      bool (*const next)(FORM*,FIELD*,const void*),
+		      bool (*const prev)(FORM*,FIELD*,const void*),
+		      void (*freecallback)(void*));
+extern FORM_EXPORT(int) _nc_set_generic_fieldtype(FIELD*, FIELDTYPE*, int (*)(void**));
+extern FORM_EXPORT(WINDOW*) _nc_form_cursor(const FORM* , int* , int* );
+
+#define INIT_FT_FUNC(func) {func}
+#else
+#define INIT_FT_FUNC(func) func
+#endif
+
+extern FORM_EXPORT(void) _nc_get_fieldbuffer(FORM*, FIELD*, FIELD_CELL*);
+
+#if USE_WIDEC_SUPPORT
+extern FORM_EXPORT(wchar_t *) _nc_Widen_String(char *, int *);
+#endif
+
+#ifdef TRACE
+
+#define returnField(code)	TRACE_RETURN1(code,field)
+#define returnFieldPtr(code)	TRACE_RETURN1(code,field_ptr)
+#define returnForm(code)	TRACE_RETURN1(code,form)
+#define returnFieldType(code)	TRACE_RETURN1(code,field_type)
+#define returnFormHook(code)	TRACE_RETURN1(code,form_hook)
+
+extern FORM_EXPORT(FIELD **)	    _nc_retrace_field_ptr (FIELD **);
+extern FORM_EXPORT(FIELD *)	    _nc_retrace_field (FIELD *);
+extern FORM_EXPORT(FIELDTYPE *)  _nc_retrace_field_type (FIELDTYPE *);
+extern FORM_EXPORT(FORM *)       _nc_retrace_form (FORM *);
+extern FORM_EXPORT(Form_Hook)    _nc_retrace_form_hook (Form_Hook);
+
+#else /* !TRACE */
+
+#define returnFieldPtr(code)	return code
+#define returnFieldType(code)	return code
+#define returnField(code)	return code
+#define returnForm(code)	return code
+#define returnFormHook(code)	return code
+
+#endif /* TRACE/!TRACE */
+
+/*
+ * Use Check_CTYPE_Field() to simplify FIELDTYPE's that use only the ccheck()
+ * function.
+ */
+#if USE_WIDEC_SUPPORT
+#define Check_CTYPE_Field(result, buffer, width, ccheck) \
+  while (*buffer && *buffer == ' ') \
+    buffer++; \
+  if (*buffer) \
+    { \
+      bool blank = FALSE; \
+      int len; \
+      int n; \
+      wchar_t *list = _nc_Widen_String((char *)buffer, &len); \
+      if (list != 0) \
+	{ \
+	  result = TRUE; \
+	  for (n = 0; n < len; ++n) \
+	    { \
+	      if (blank) \
+		{ \
+		  if (list[n] != ' ') \
+		    { \
+		      result = FALSE; \
+		      break; \
+		    } \
+		} \
+	      else if (list[n] == ' ') \
+		{ \
+		  blank = TRUE; \
+		  result = (n + 1 >= width); \
+		} \
+	      else if (!ccheck(list[n], NULL)) \
+		{ \
+		  result = FALSE; \
+		  break; \
+		} \
+	    } \
+	  free(list); \
+	} \
+    }
+#else
+#define Check_CTYPE_Field(result, buffer, width, ccheck) \
+  while (*buffer && *buffer == ' ') \
+    buffer++; \
+  if (*buffer) \
+    { \
+      unsigned char *s = buffer; \
+      int l = -1; \
+      while (*buffer && ccheck(*buffer, NULL)) \
+	buffer++; \
+      l = (int)(buffer - s); \
+      while (*buffer && *buffer == ' ') \
+	buffer++; \
+      result = ((*buffer || (l < width)) ? FALSE : TRUE); \
+    }
+#endif
+/* *INDENT-ON*/
+
+#endif /* FORM_PRIV_H */
diff --git a/form/frm_cursor.c b/form/frm_cursor.c
new file mode 100644
index 0000000..a54b483
--- /dev/null
+++ b/form/frm_cursor.c
@@ -0,0 +1,71 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2004,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: frm_cursor.c,v 1.13 2021/06/17 21:20:30 tom Exp $")
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int pos_form_cursor(FORM * form)
+|
+|   Description   :  Moves the form window cursor to the location required
+|                    by the form driver to resume form processing. This may
+|                    be needed after the application calls a curses library
+|                    I/O routine that modifies the cursor position.
+|
+|   Return Values :  E_OK                      - Success
+|                    E_SYSTEM_ERROR            - System error.
+|                    E_BAD_ARGUMENT            - Invalid form pointer
+|                    E_NOT_POSTED              - Form is not posted
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+pos_form_cursor(FORM *form)
+{
+  int res;
+
+  T((T_CALLED("pos_form_cursor(%p)"), (void *)form));
+
+  if (!form)
+    res = E_BAD_ARGUMENT;
+  else
+    {
+      if (!(form->status & _POSTED))
+	res = E_NOT_POSTED;
+      else
+	res = _nc_Position_Form_Cursor(form);
+    }
+  RETURN(res);
+}
+
+/* frm_cursor.c ends here */
diff --git a/form/frm_data.c b/form/frm_data.c
new file mode 100644
index 0000000..940c32d
--- /dev/null
+++ b/form/frm_data.c
@@ -0,0 +1,193 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2010,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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: frm_data.c,v 1.21 2021/06/17 21:11:08 tom Exp $")
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  bool data_behind(const FORM *form)
+|
+|   Description   :  Check for off-screen data behind. This is nearly trivial
+|                    because the beginning of a field is fixed.
+|
+|   Return Values :  TRUE   - there are off-screen data behind
+|                    FALSE  - there are no off-screen data behind
++--------------------------------------------------------------------------*/
+FORM_EXPORT(bool)
+data_behind(const FORM *form)
+{
+  bool result = FALSE;
+
+  T((T_CALLED("data_behind(%p)"), (const void *)form));
+
+  if (form && (form->status & _POSTED) && form->current)
+    {
+      FIELD *field;
+
+      field = form->current;
+      if (!Single_Line_Field(field))
+	{
+	  result = (form->toprow == 0) ? FALSE : TRUE;
+	}
+      else
+	{
+	  result = (form->begincol == 0) ? FALSE : TRUE;
+	}
+    }
+  returnBool(result);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static char * Only_Padding(
+|                                    WINDOW *w,
+|                                    int len,
+|                                    int pad)
+|
+|   Description   :  Test if 'length' cells starting at the current position
+|                    contain a padding character.
+|
+|   Return Values :  true if only padding cells are found
++--------------------------------------------------------------------------*/
+NCURSES_INLINE static bool
+Only_Padding(WINDOW *w, int len, int pad)
+{
+  bool result = TRUE;
+  int y, x, j;
+  FIELD_CELL cell;
+
+  getyx(w, y, x);
+  for (j = 0; j < len; ++j)
+    {
+      if (wmove(w, y, x + j) != ERR)
+	{
+#if USE_WIDEC_SUPPORT
+	  if (win_wch(w, &cell) != ERR)
+	    {
+	      if ((chtype)CharOf(cell) != ChCharOf(pad)
+		  || cell.chars[1] != 0)
+		{
+		  result = FALSE;
+		  break;
+		}
+	    }
+#else
+	  cell = (FIELD_CELL)winch(w);
+	  if (ChCharOf(cell) != ChCharOf(pad))
+	    {
+	      result = FALSE;
+	      break;
+	    }
+#endif
+	}
+      else
+	{
+	  /* if an error, return true: no non-padding text found */
+	  break;
+	}
+    }
+  /* no need to reset the cursor position; caller does this */
+  return result;
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  bool data_ahead(const FORM *form)
+|
+|   Description   :  Check for off-screen data ahead. This is more difficult
+|                    because a dynamic field has a variable end.
+|
+|   Return Values :  TRUE   - there are off-screen data ahead
+|                    FALSE  - there are no off-screen data ahead
++--------------------------------------------------------------------------*/
+FORM_EXPORT(bool)
+data_ahead(const FORM *form)
+{
+  bool result = FALSE;
+
+  T((T_CALLED("data_ahead(%p)"), (const void *)form));
+
+  if (form && (form->status & _POSTED) && form->current)
+    {
+      FIELD *field;
+      bool cursor_moved = FALSE;
+      int pos;
+
+      field = form->current;
+      assert(form->w);
+
+      if (Single_Line_Field(field))
+	{
+	  pos = form->begincol + field->cols;
+	  while (pos < field->dcols)
+	    {
+	      int check_len = field->dcols - pos;
+
+	      if (check_len >= field->cols)
+		check_len = field->cols;
+	      cursor_moved = TRUE;
+	      wmove(form->w, 0, pos);
+	      if (Only_Padding(form->w, check_len, field->pad))
+		pos += field->cols;
+	      else
+		{
+		  result = TRUE;
+		  break;
+		}
+	    }
+	}
+      else
+	{
+	  pos = form->toprow + field->rows;
+	  while (pos < field->drows)
+	    {
+	      cursor_moved = TRUE;
+	      wmove(form->w, pos, 0);
+	      pos++;
+	      if (!Only_Padding(form->w, field->cols, field->pad))
+		{
+		  result = TRUE;
+		  break;
+		}
+	    }
+	}
+
+      if (cursor_moved)
+	wmove(form->w, form->currow, form->curcol);
+    }
+  returnBool(result);
+}
+
+/* frm_data.c ends here */
diff --git a/form/frm_def.c b/form/frm_def.c
new file mode 100644
index 0000000..a9f21f2
--- /dev/null
+++ b/form/frm_def.c
@@ -0,0 +1,451 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2010,2012 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: frm_def.c,v 1.30 2021/03/27 23:49:58 tom Exp $")
+
+/* this can't be readonly */
+static FORM default_form =
+{
+  0,				/* status     */
+  0,				/* rows       */
+  0,				/* cols       */
+  0,				/* currow     */
+  0,				/* curcol     */
+  0,				/* toprow     */
+  0,				/* begincol   */
+  -1,				/* maxfield   */
+  -1,				/* maxpage    */
+  -1,				/* curpage    */
+  ALL_FORM_OPTS,		/* opts       */
+  (WINDOW *)0,			/* win        */
+  (WINDOW *)0,			/* sub        */
+  (WINDOW *)0,			/* w          */
+  (FIELD **)0,			/* field      */
+  (FIELD *)0,			/* current    */
+  (_PAGE *) 0,			/* page       */
+  (char *)0,			/* usrptr     */
+  NULL,				/* forminit   */
+  NULL,				/* formterm   */
+  NULL,				/* fieldinit  */
+  NULL				/* fieldterm  */
+};
+
+FORM_EXPORT_VAR(FORM *) _nc_Default_Form = &default_form;
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static FIELD *Insert_Field_By_Position(
+|                                     FIELD *new_field,
+|                                     FIELD *head )
+|
+|   Description   :  Insert new_field into sorted fieldlist with head "head"
+|                    and return new head of sorted fieldlist. Sorting
+|                    criteria is (row,column). This is a circular list.
+|
+|   Return Values :  New head of sorted fieldlist
++--------------------------------------------------------------------------*/
+static FIELD *
+Insert_Field_By_Position(FIELD *newfield, FIELD *head)
+{
+  FIELD *current, *newhead;
+
+  assert(newfield);
+
+  if (!head)
+    {				/* empty list is trivial */
+      newhead = newfield->snext = newfield->sprev = newfield;
+    }
+  else
+    {
+      newhead = current = head;
+      while ((current->frow < newfield->frow) ||
+	     ((current->frow == newfield->frow) &&
+	      (current->fcol < newfield->fcol)))
+	{
+	  current = current->snext;
+	  if (current == head)
+	    {			/* We cycled through. Reset head to indicate that */
+	      head = (FIELD *)0;
+	      break;
+	    }
+	}
+      /* we leave the loop with current pointing to the field after newfield */
+      newfield->snext = current;
+      newfield->sprev = current->sprev;
+      newfield->snext->sprev = newfield;
+      newfield->sprev->snext = newfield;
+      if (current == head)
+	newhead = newfield;
+    }
+  return (newhead);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static void Disconnect_Fields(FORM *form)
+|
+|   Description   :  Break association between form and array of fields.
+|
+|   Return Values :  -
++--------------------------------------------------------------------------*/
+static void
+Disconnect_Fields(FORM *form)
+{
+  if (form->field)
+    {
+      FIELD **fields;
+
+      for (fields = form->field; *fields; fields++)
+	{
+	  if (form == (*fields)->form)
+	    (*fields)->form = (FORM *)0;
+	}
+
+      form->rows = form->cols = 0;
+      form->maxfield = form->maxpage = -1;
+      form->field = (FIELD **)0;
+      if (form->page)
+	free(form->page);
+      form->page = (_PAGE *) 0;
+    }
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int Connect_Fields(FORM *form, FIELD **fields)
+|
+|   Description   :  Set association between form and array of fields.
+|
+|   Return Values :  E_OK            - no error
+|                    E_CONNECTED     - a field is already connected
+|                    E_BAD_ARGUMENT  - Invalid form pointer or field array
+|                    E_SYSTEM_ERROR  - not enough memory
++--------------------------------------------------------------------------*/
+static int
+Connect_Fields(FORM *form, FIELD **fields)
+{
+  int field_cnt, j;
+  int page_nr;
+  _PAGE *pg;
+
+  T((T_CALLED("Connect_Fields(%p,%p)"), (void *)form, (void *)fields));
+
+  assert(form);
+
+  form->field = fields;
+  form->maxfield = 0;
+  form->maxpage = 0;
+
+  if (!fields)
+    RETURN(E_OK);
+
+  page_nr = 0;
+  /* store formpointer in fields and count pages */
+  for (field_cnt = 0; fields[field_cnt]; field_cnt++)
+    {
+      if (fields[field_cnt]->form)
+	RETURN(E_CONNECTED);
+      if (field_cnt == 0 ||
+	  (fields[field_cnt]->status & _NEWPAGE))
+	page_nr++;
+      fields[field_cnt]->form = form;
+    }
+  if (field_cnt == 0 || (short)field_cnt < 0)
+    RETURN(E_BAD_ARGUMENT);
+
+  /* allocate page structures */
+  if ((pg = typeMalloc(_PAGE, page_nr)) != (_PAGE *) 0)
+    {
+      T((T_CREATE("_PAGE %p"), (void *)pg));
+      form->page = pg;
+    }
+  else
+    RETURN(E_SYSTEM_ERROR);
+
+  /* Cycle through fields and calculate page boundaries as well as
+     size of the form */
+  for (j = 0; j < field_cnt; j++)
+    {
+      int maximum_row_in_field;
+      int maximum_col_in_field;
+
+      if (j == 0)
+	pg->pmin = (short)j;
+      else
+	{
+	  if (fields[j]->status & _NEWPAGE)
+	    {
+	      pg->pmax = (short)(j - 1);
+	      pg++;
+	      pg->pmin = (short)j;
+	    }
+	}
+
+      maximum_row_in_field = fields[j]->frow + fields[j]->rows;
+      maximum_col_in_field = fields[j]->fcol + fields[j]->cols;
+
+      if (form->rows < maximum_row_in_field)
+	form->rows = (short)maximum_row_in_field;
+      if (form->cols < maximum_col_in_field)
+	form->cols = (short)maximum_col_in_field;
+    }
+
+  pg->pmax = (short)(field_cnt - 1);
+  form->maxfield = (short)field_cnt;
+  form->maxpage = (short)page_nr;
+
+  /* Sort fields on form pages */
+  for (page_nr = 0; page_nr < form->maxpage; page_nr++)
+    {
+      FIELD *fld = (FIELD *)0;
+
+      for (j = form->page[page_nr].pmin; j <= form->page[page_nr].pmax; j++)
+	{
+	  fields[j]->index = (short)j;
+	  fields[j]->page = (short)page_nr;
+	  fld = Insert_Field_By_Position(fields[j], fld);
+	}
+      if (fld)
+	{
+	  form->page[page_nr].smin = fld->index;
+	  form->page[page_nr].smax = fld->sprev->index;
+	}
+      else
+	{
+	  form->page[page_nr].smin = 0;
+	  form->page[page_nr].smax = 0;
+	}
+    }
+  RETURN(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int Associate_Fields(FORM *form, FIELD **fields)
+|
+|   Description   :  Set association between form and array of fields.
+|                    If there are fields, position to first active field.
+|
+|   Return Values :  E_OK            - success
+|                    E_BAD_ARGUMENT  - Invalid form pointer or field array
+|                    E_CONNECTED     - a field is already connected
+|                    E_SYSTEM_ERROR  - not enough memory
++--------------------------------------------------------------------------*/
+NCURSES_INLINE static int
+Associate_Fields(FORM *form, FIELD **fields)
+{
+  int res = Connect_Fields(form, fields);
+
+  if (res == E_OK)
+    {
+      if (form->maxpage > 0)
+	{
+	  form->curpage = 0;
+	  form_driver(form, FIRST_ACTIVE_MAGIC);
+	}
+      else
+	{
+	  form->curpage = -1;
+	  form->current = (FIELD *)0;
+	}
+    }
+  return (res);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  FORM *new_form_sp(SCREEN* sp, FIELD** fields )
+|
+|   Description   :  Create new form with given array of fields.
+|
+|   Return Values :  Pointer to form. NULL if error occurred.
+!                    Set errno:
+|                    E_OK            - success
+|                    E_BAD_ARGUMENT  - Invalid form pointer or field array
+|                    E_CONNECTED     - a field is already connected
+|                    E_SYSTEM_ERROR  - not enough memory
++--------------------------------------------------------------------------*/
+FORM_EXPORT(FORM *)
+NCURSES_SP_NAME(new_form) (NCURSES_SP_DCLx FIELD **fields)
+{
+  int err = E_SYSTEM_ERROR;
+  FORM *form = (FORM *)0;
+
+  T((T_CALLED("new_form(%p,%p)"), (void *)SP_PARM, (void *)fields));
+
+  if (IsValidScreen(SP_PARM))
+    {
+      form = typeMalloc(FORM, 1);
+
+      if (form)
+	{
+	  T((T_CREATE("form %p"), (void *)form));
+	  *form = *_nc_Default_Form;
+	  /* This ensures win and sub are always non-null,
+	     so we can derive always the SCREEN that this form is
+	     running on. */
+	  form->win = StdScreen(SP_PARM);
+	  form->sub = StdScreen(SP_PARM);
+	  if ((err = Associate_Fields(form, fields)) != E_OK)
+	    {
+	      free_form(form);
+	      form = (FORM *)0;
+	    }
+	}
+    }
+
+  if (!form)
+    SET_ERROR(err);
+
+  returnForm(form);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  FORM* new_form(FIELD** fields )
+|
+|   Description   :  Create new form with given array of fields.
+|
+|   Return Values :  Pointer to form. NULL if error occurred.
+!                    Set errno:
+|                    E_OK            - success
+|                    E_BAD_ARGUMENT  - Invalid form pointer or field array
+|                    E_CONNECTED     - a field is already connected
+|                    E_SYSTEM_ERROR  - not enough memory
++--------------------------------------------------------------------------*/
+#if NCURSES_SP_FUNCS
+FORM_EXPORT(FORM *)
+new_form(FIELD **fields)
+{
+  return NCURSES_SP_NAME(new_form) (CURRENT_SCREEN, fields);
+}
+#endif
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int free_form( FORM *form )
+|
+|   Description   :  Release internal memory associated with form.
+|
+|   Return Values :  E_OK           - no error
+|                    E_BAD_ARGUMENT - invalid form pointer
+|                    E_POSTED       - form is posted
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+free_form(FORM *form)
+{
+  T((T_CALLED("free_form(%p)"), (void *)form));
+
+  if (!form)
+    RETURN(E_BAD_ARGUMENT);
+
+  if (form->status & _POSTED)
+    RETURN(E_POSTED);
+
+  Disconnect_Fields(form);
+  if (form->page)
+    free(form->page);
+  free(form);
+
+  RETURN(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int set_form_fields( FORM *form, FIELD **fields )
+|
+|   Description   :  Set a new association of an array of fields to a form
+|
+|   Return Values :  E_OK            - no error
+|                    E_BAD_ARGUMENT  - Invalid form pointer or field array
+|                    E_CONNECTED     - a field is already connected
+|                    E_POSTED        - form is posted
+|                    E_SYSTEM_ERROR  - not enough memory
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+set_form_fields(FORM *form, FIELD **fields)
+{
+  FIELD **old;
+  int res;
+
+  T((T_CALLED("set_form_fields(%p,%p)"), (void *)form, (void *)fields));
+
+  if (!form)
+    RETURN(E_BAD_ARGUMENT);
+
+  if (form->status & _POSTED)
+    RETURN(E_POSTED);
+
+  old = form->field;
+  Disconnect_Fields(form);
+
+  if ((res = Associate_Fields(form, fields)) != E_OK)
+    Connect_Fields(form, old);
+
+  RETURN(res);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  FIELD **form_fields( const FORM *form )
+|
+|   Description   :  Retrieve array of fields
+|
+|   Return Values :  Pointer to field array
++--------------------------------------------------------------------------*/
+FORM_EXPORT(FIELD **)
+form_fields(const FORM *form)
+{
+  T((T_CALLED("form_field(%p)"), (const void *)form));
+  returnFieldPtr(Normalize_Form(form)->field);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int field_count( const FORM *form )
+|
+|   Description   :  Retrieve number of fields
+|
+|   Return Values :  Number of fields, -1 if none are defined
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+field_count(const FORM *form)
+{
+  T((T_CALLED("field_count(%p)"), (const void *)form));
+
+  returnCode(Normalize_Form(form)->maxfield);
+}
+
+/* frm_def.c ends here */
diff --git a/form/frm_driver.c b/form/frm_driver.c
new file mode 100644
index 0000000..75656d6
--- /dev/null
+++ b/form/frm_driver.c
@@ -0,0 +1,5008 @@
+/****************************************************************************
+ * Copyright 2018-2020,2021 Thomas E. Dickey                                *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: frm_driver.c,v 1.135 2021/09/01 23:34:01 tom Exp $")
+
+/*----------------------------------------------------------------------------
+  This is the core module of the form library. It contains the majority
+  of the driver routines as well as the form_driver function.
+
+  Essentially this module is nearly the whole library. This is because
+  all the functions in this module depends on some others in the module,
+  so it makes no sense to split them into separate files because they
+  will always be linked together. The only acceptable concern is turnaround
+  time for this module, but now we have all Pentiums or RISCs, so what!
+
+  The driver routines are grouped into nine generic categories:
+
+   a)   Page Navigation            ( all functions prefixed by PN_ )
+        The current page of the form is left and some new page is
+        entered.
+   b)   Inter-Field Navigation     ( all functions prefixed by FN_ )
+        The current field of the form is left and some new field is
+        entered.
+   c)   Intra-Field Navigation     ( all functions prefixed by IFN_ )
+        The current position in the current field is changed.
+   d)   Vertical Scrolling         ( all functions prefixed by VSC_ )
+        Essentially this is a specialization of Intra-Field navigation.
+        It has to check for a multi-line field.
+   e)   Horizontal Scrolling       ( all functions prefixed by HSC_ )
+        Essentially this is a specialization of Intra-Field navigation.
+        It has to check for a single-line field.
+   f)   Field Editing              ( all functions prefixed by FE_ )
+        The content of the current field is changed
+   g)   Edit Mode requests         ( all functions prefixed by EM_ )
+        Switching between insert and overlay mode
+   h)   Field-Validation requests  ( all functions prefixed by FV_ )
+        Perform verifications of the field.
+   i)   Choice requests            ( all functions prefixed by CR_ )
+        Requests to enumerate possible field values
+  --------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+  Some remarks on the placements of assert() macros :
+  I use them only on "strategic" places, i.e. top level entries where
+  I want to make sure that things are set correctly. Throughout subordinate
+  routines I omit them mostly.
+  --------------------------------------------------------------------------*/
+
+/*
+Some options that may effect compatibility in behavior to SVr4 forms,
+but they are here to allow a more intuitive and user friendly behavior of
+our form implementation. This doesn't affect the API, so we feel it is
+uncritical.
+
+The initial implementation tries to stay very close with the behavior
+of the original SVr4 implementation, although in some areas it is quite
+clear that this isn't the most appropriate way. As far as possible this
+sources will allow you to build a forms lib that behaves quite similar
+to SVr4, but now and in the future we will give you better options.
+Perhaps at some time we will make this configurable at runtime.
+*/
+
+/* Implement a more user-friendly previous/next word behavior */
+#define FRIENDLY_PREV_NEXT_WORD (1)
+/* Fix the wrong behavior for forms with all fields inactive */
+#define FIX_FORM_INACTIVE_BUG (1)
+/* Allow dynamic field growth also when navigating past the end */
+#define GROW_IF_NAVIGATE (1)
+
+#if USE_WIDEC_SUPPORT
+#define myADDNSTR(w, s, n) wide_waddnstr(w, s, n)
+#define myINSNSTR(w, s, n) wide_winsnstr(w, s, n)
+#define myINNSTR(w, s, n)  wide_winnstr(w, s, n)
+#define myWCWIDTH(w, y, x) cell_width(w, y, x)
+#else
+#define myADDNSTR(w, s, n) waddnstr(w, s, n)
+#define myINSNSTR(w, s, n) winsnstr(w, s, n)
+#define myINNSTR(w, s, n)  winnstr(w, s, n)
+#define myWCWIDTH(w, y, x) 1
+#endif
+
+/*----------------------------------------------------------------------------
+  Forward references to some internally used static functions
+  --------------------------------------------------------------------------*/
+static int Inter_Field_Navigation(int (*const fct) (FORM *), FORM *form);
+static int FN_Next_Field(FORM *form);
+static int FN_Previous_Field(FORM *form);
+static int FE_New_Line(FORM *);
+static int FE_Delete_Previous(FORM *);
+
+/*----------------------------------------------------------------------------
+  Macro Definitions.
+
+  Some Remarks on that: I use the convention to use UPPERCASE for constants
+  defined by Macros. If I provide a macro as a kind of inline routine to
+  provide some logic, I use my Upper_Lower case style.
+  --------------------------------------------------------------------------*/
+
+/* Calculate the position of a single row in a field buffer */
+#define Position_Of_Row_In_Buffer(field,row) ((row)*(field)->dcols)
+
+/* Calculate start address for the field's buffer# N */
+#define Address_Of_Nth_Buffer(field,N) \
+  ((field)->buf + (N)*(1+Buffer_Length(field)))
+
+/* Calculate the start address of the row in the field's specified buffer# N */
+#define Address_Of_Row_In_Nth_Buffer(field,N,row) \
+  (Address_Of_Nth_Buffer(field,N) + Position_Of_Row_In_Buffer(field,row))
+
+/* Calculate the start address of the row in the field's primary buffer */
+#define Address_Of_Row_In_Buffer(field,row) \
+  Address_Of_Row_In_Nth_Buffer(field,0,row)
+
+/* Calculate the start address of the row in the form's current field
+   buffer# N */
+#define Address_Of_Current_Row_In_Nth_Buffer(form,N) \
+   Address_Of_Row_In_Nth_Buffer((form)->current,N,(form)->currow)
+
+/* Calculate the start address of the row in the form's current field
+   primary buffer */
+#define Address_Of_Current_Row_In_Buffer(form) \
+   Address_Of_Current_Row_In_Nth_Buffer(form,0)
+
+/* Calculate the address of the cursor in the form's current field
+   primary buffer */
+#define Address_Of_Current_Position_In_Nth_Buffer(form,N) \
+   (Address_Of_Current_Row_In_Nth_Buffer(form,N) + (form)->curcol)
+
+/* Calculate the address of the cursor in the form's current field
+   buffer# N */
+#define Address_Of_Current_Position_In_Buffer(form) \
+  Address_Of_Current_Position_In_Nth_Buffer(form,0)
+
+/* Logic to decide whether or not a field is actually a field with
+   vertical or horizontal scrolling */
+#define Is_Scroll_Field(field)          \
+   (((field)->drows > (field)->rows) || \
+    ((field)->dcols > (field)->cols))
+
+/* Logic to decide whether or not a field needs to have an individual window
+   instead of a derived window because it contains invisible parts.
+   This is true for non-public fields and for scrollable fields. */
+#define Has_Invisible_Parts(field)     \
+  (!(Field_Has_Option(field, O_PUBLIC)) || \
+   Is_Scroll_Field(field))
+
+/* Logic to decide whether or not a field needs justification */
+#define Justification_Allowed(field)        \
+   (((field)->just != NO_JUSTIFICATION)  && \
+    (Single_Line_Field(field))           && \
+    ((Field_Has_Option(field, O_STATIC)  && \
+     ((field)->dcols == (field)->cols))  || \
+    Field_Has_Option(field, O_DYNAMIC_JUSTIFY)))
+
+/* Logic to determine whether or not a dynamic field may still grow */
+#define Growable(field) ((field)->status & _MAY_GROW)
+
+/* Macro to set the attributes for a field's window */
+#define Set_Field_Window_Attributes(field,win) \
+(  wbkgdset((win),(chtype)((chtype)((field)->pad) | (field)->back)), \
+   (void) wattrset((win), (int)(field)->fore) )
+
+/* Logic to decide whether or not a field really appears on the form */
+#define Field_Really_Appears(field)         \
+  ((field->form)                          &&\
+   (field->form->status & _POSTED)        &&\
+   (Field_Has_Option(field, O_VISIBLE))   &&\
+   (field->page == field->form->curpage))
+
+/* Logic to determine whether or not we are on the first position in the
+   current field */
+#define First_Position_In_Current_Field(form) \
+  (((form)->currow==0) && ((form)->curcol==0))
+
+#define Minimum(a,b) (((a)<=(b)) ? (a) : (b))
+#define Maximum(a,b) (((a)>=(b)) ? (a) : (b))
+
+/*----------------------------------------------------------------------------
+  Useful constants
+  --------------------------------------------------------------------------*/
+static FIELD_CELL myBLANK = BLANK;
+static FIELD_CELL myZEROS;
+
+#ifdef TRACE
+static void
+check_pos(FORM *form, int lineno)
+{
+  if (form && form->w)
+    {
+      int y, x;
+
+      getyx(form->w, y, x);
+      if (y != form->currow || x != form->curcol)
+	{
+	  T(("CHECKPOS %s@%d have position %d,%d vs want %d,%d",
+	     __FILE__, lineno,
+	     y, x,
+	     form->currow, form->curcol));
+	}
+    }
+}
+#define CHECKPOS(form) check_pos(form, __LINE__)
+#else
+#define CHECKPOS(form)		/* nothing */
+#endif
+
+/*----------------------------------------------------------------------------
+  Wide-character special functions
+  --------------------------------------------------------------------------*/
+#if USE_WIDEC_SUPPORT
+/* add like waddnstr, but using cchar_t* rather than char*
+ */
+static int
+wide_waddnstr(WINDOW *w, const cchar_t *s, int n)
+{
+  int rc = OK;
+
+  while (n-- > 0)
+    {
+      if ((rc = wadd_wch(w, s)) != OK)
+	break;
+      ++s;
+    }
+  return rc;
+}
+
+/* insert like winsnstr, but using cchar_t* rather than char*
+ *
+ * X/Open Curses has no close equivalent; inserts are done only with wchar_t
+ * strings.
+ */
+static int
+wide_winsnstr(WINDOW *w, const cchar_t *s, int n)
+{
+  int code = ERR;
+
+  while (n-- > 0)
+    {
+      int y, x;
+
+      getyx(w, y, x);
+      if ((code = wins_wch(w, s++)) != OK)
+	break;
+      if ((code = wmove(w, y, x + 1)) != OK)
+	break;
+    }
+  return code;
+}
+
+/* retrieve like winnstr, but using cchar_t*, rather than char*.
+ *
+ * X/Open Curses' closest equivalent, win_wchnstr(), is inconsistent with
+ * winnstr(), since it returns OK rather than the number of items transferred.
+ */
+static int
+wide_winnstr(WINDOW *w, cchar_t *s, int n)
+{
+  int x;
+
+  win_wchnstr(w, s, n);
+  /*
+   * This function is used to extract the text only from the window.
+   * Strip attributes and color from the string so they will not be added
+   * back when copying the string to the window.
+   */
+  for (x = 0; x < n; ++x)
+    {
+      RemAttr(s[x], A_ATTRIBUTES);
+      SetPair(s[x], 0);
+    }
+  return n;
+}
+
+/*
+ * Returns the column of the base of the given cell.
+ */
+static int
+cell_base(WINDOW *win, int y, int x)
+{
+  int result = x;
+
+  while (LEGALYX(win, y, x))
+    {
+      cchar_t *data = &(win->_line[y].text[x]);
+
+      if (isWidecBase(CHDEREF(data)) || !isWidecExt(CHDEREF(data)))
+	{
+	  result = x;
+	  break;
+	}
+      --x;
+    }
+  return result;
+}
+
+/*
+ * Returns the number of columns needed for the given cell in a window.
+ */
+static int
+cell_width(WINDOW *win, int y, int x)
+{
+  int result = 1;
+
+  if (LEGALYX(win, y, x))
+    {
+      cchar_t *data = &(win->_line[y].text[x]);
+
+      if (isWidecExt(CHDEREF(data)))
+	{
+	  /* recur, providing the number of columns to the next character */
+	  result = cell_width(win, y, x - 1);
+	}
+      else
+	{
+	  result = wcwidth(CharOf(CHDEREF(data)));
+	}
+    }
+  return result;
+}
+
+/*
+ * There is no wide-character function such as wdel_wch(), so we must find
+ * all of the cells that comprise a multi-column character and delete them
+ * one-by-one.
+ */
+static void
+delete_char(FORM *form)
+{
+  int cells = cell_width(form->w, form->currow, form->curcol);
+
+  form->curcol = cell_base(form->w, form->currow, form->curcol);
+  wmove(form->w, form->currow, form->curcol);
+  while (cells-- > 0)
+    {
+      wdelch(form->w);
+    }
+}
+#define DeleteChar(form) delete_char(form)
+#else
+#define DeleteChar(form) \
+	  wmove((form)->w, (form)->currow, (form)->curcol), \
+	  wdelch((form)->w)
+#endif
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static char *Get_Start_Of_Data(char * buf, int blen)
+|
+|   Description   :  Return pointer to first non-blank position in buffer.
+|                    If buffer is empty return pointer to buffer itself.
+|
+|   Return Values :  Pointer to first non-blank position in buffer
++--------------------------------------------------------------------------*/
+NCURSES_INLINE static FIELD_CELL *
+Get_Start_Of_Data(FIELD_CELL *buf, int blen)
+{
+  FIELD_CELL *p = buf;
+  FIELD_CELL *end = &buf[blen];
+
+  assert(buf && blen >= 0);
+  while ((p < end) && ISBLANK(*p))
+    p++;
+  return ((p == end) ? buf : p);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static char *After_End_Of_Data(char * buf, int blen)
+|
+|   Description   :  Return pointer after last non-blank position in buffer.
+|                    If buffer is empty, return pointer to buffer itself.
+|
+|   Return Values :  Pointer to position after last non-blank position in
+|                    buffer.
++--------------------------------------------------------------------------*/
+NCURSES_INLINE static FIELD_CELL *
+After_End_Of_Data(FIELD_CELL *buf, int blen)
+{
+  FIELD_CELL *p = &buf[blen];
+
+  assert(buf && blen >= 0);
+  while ((p > buf) && ISBLANK(p[-1]))
+    p--;
+  return (p);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static char *Get_First_Whitespace_Character(
+|                                     char * buf, int   blen)
+|
+|   Description   :  Position to the first whitespace character.
+|
+|   Return Values :  Pointer to first whitespace character in buffer.
++--------------------------------------------------------------------------*/
+NCURSES_INLINE static FIELD_CELL *
+Get_First_Whitespace_Character(FIELD_CELL *buf, int blen)
+{
+  FIELD_CELL *p = buf;
+  FIELD_CELL *end = &p[blen];
+
+  assert(buf && blen >= 0);
+  while ((p < end) && !ISBLANK(*p))
+    p++;
+  return ((p == end) ? buf : p);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static char *After_Last_Whitespace_Character(
+|                                     char * buf, int blen)
+|
+|   Description   :  Get the position after the last whitespace character.
+|
+|   Return Values :  Pointer to position after last whitespace character in
+|                    buffer.
++--------------------------------------------------------------------------*/
+NCURSES_INLINE static FIELD_CELL *
+After_Last_Whitespace_Character(FIELD_CELL *buf, int blen)
+{
+  FIELD_CELL *p = &buf[blen];
+
+  assert(buf && blen >= 0);
+  while ((p > buf) && !ISBLANK(p[-1]))
+    p--;
+  return (p);
+}
+
+/* Set this to 1 to use the div_t version. This is a good idea if your
+   compiler has an intrinsic div() support. Unfortunately GNU-C has it
+   not yet.
+   N.B.: This only works if form->curcol follows immediately form->currow
+         and both are of type int.
+*/
+#define USE_DIV_T (0)
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static void Adjust_Cursor_Position(
+|                                       FORM * form, const char * pos)
+|
+|   Description   :  Set current row and column of the form to values
+|                    corresponding to the buffer position.
+|
+|   Return Values :  -
++--------------------------------------------------------------------------*/
+NCURSES_INLINE static void
+Adjust_Cursor_Position(FORM *form, const FIELD_CELL *pos)
+{
+  FIELD *field;
+  int idx;
+
+  field = form->current;
+  assert(pos >= field->buf && field->dcols > 0);
+  idx = (int)(pos - field->buf);
+#if USE_DIV_T
+  *((div_t *) & (form->currow)) = div(idx, field->dcols);
+#else
+  form->currow = idx / field->dcols;
+  form->curcol = idx - field->cols * form->currow;
+#endif
+  if (field->drows < form->currow)
+    form->currow = 0;
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static void Buffer_To_Window(
+|                                      const FIELD  * field,
+|                                      WINDOW * win)
+|
+|   Description   :  Copy the buffer to the window. If it is a multi-line
+|                    field, the buffer is split to the lines of the
+|                    window without any editing.
+|
+|   Return Values :  -
++--------------------------------------------------------------------------*/
+static void
+Buffer_To_Window(const FIELD *field, WINDOW *win)
+{
+  int width, height;
+  int y, x;
+  int row;
+  FIELD_CELL *pBuffer;
+
+  assert(win && field);
+
+  getyx(win, y, x);
+  width = getmaxx(win);
+  height = getmaxy(win);
+
+  for (row = 0, pBuffer = field->buf;
+       row < height;
+       row++, pBuffer += width)
+    {
+      int len;
+
+      if ((len = (int)(After_End_Of_Data(pBuffer, width) - pBuffer)) > 0)
+	{
+	  wmove(win, row, 0);
+	  myADDNSTR(win, pBuffer, len);
+	}
+    }
+  wmove(win, y, x);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  void _nc_get_fieldbuffer(
+|                                          WINDOW * win,
+|                                          FIELD  * field,
+|                                          FIELD_CELL * buf)
+|
+|   Description   :  Copy the content of the window into the buffer.
+|                    The multiple lines of a window are simply
+|                    concatenated into the buffer. Pad characters in
+|                    the window will be replaced by blanks in the buffer.
+|
+|   Return Values :  -
++--------------------------------------------------------------------------*/
+FORM_EXPORT(void)
+_nc_get_fieldbuffer(FORM *form, FIELD *field, FIELD_CELL *buf)
+{
+  int pad;
+  int len = 0;
+  FIELD_CELL *p;
+  int row, height;
+  WINDOW *win;
+
+  assert(form && field && buf);
+
+  win = form->w;
+  assert(win);
+
+  pad = field->pad;
+  p = buf;
+  height = getmaxy(win);
+
+  for (row = 0; (row < height) && (row < field->drows); row++)
+    {
+      wmove(win, row, 0);
+      len += myINNSTR(win, p + len, field->dcols);
+    }
+  p[len] = myZEROS;
+
+  /* replace visual padding character by blanks in buffer */
+  if (pad != C_BLANK)
+    {
+      int i;
+
+      for (i = 0; i < len; i++, p++)
+	{
+	  if ((unsigned long)CharOf(*p) == ChCharOf(pad)
+#if USE_WIDEC_SUPPORT
+	      && p->chars[1] == 0
+#endif
+	    )
+	    *p = myBLANK;
+	}
+    }
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static void Window_To_Buffer(
+|                                          FORM   * form,
+|                                          FIELD  * field)
+|
+|   Description   :  Copy the content of the window into the buffer.
+|                    The multiple lines of a window are simply
+|                    concatenated into the buffer. Pad characters in
+|                    the window will be replaced by blanks in the buffer.
+|
+|   Return Values :  -
++--------------------------------------------------------------------------*/
+static void
+Window_To_Buffer(FORM *form, FIELD *field)
+{
+  _nc_get_fieldbuffer(form, field, field->buf);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static void Synchronize_Buffer(FORM * form)
+|
+|   Description   :  If there was a change, copy the content of the
+|                    window into the buffer, so the buffer is synchronized
+|                    with the windows content. We have to indicate that the
+|                    buffer needs validation due to the change.
+|
+|   Return Values :  -
++--------------------------------------------------------------------------*/
+NCURSES_INLINE static void
+Synchronize_Buffer(FORM *form)
+{
+  if (form->status & _WINDOW_MODIFIED)
+    {
+      ClrStatus(form, _WINDOW_MODIFIED);
+      SetStatus(form, _FCHECK_REQUIRED);
+      Window_To_Buffer(form, form->current);
+      wmove(form->w, form->currow, form->curcol);
+    }
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static bool Field_Grown( FIELD *field, int amount)
+|
+|   Description   :  This function is called for growable dynamic fields
+|                    only. It has to increase the buffers and to allocate
+|                    a new window for this field.
+|                    This function has the side effect to set a new
+|                    field-buffer pointer, the dcols and drows values
+|                    as well as a new current Window for the field.
+|
+|   Return Values :  TRUE     - field successfully increased
+|                    FALSE    - there was some error
++--------------------------------------------------------------------------*/
+static bool
+Field_Grown(FIELD *field, int amount)
+{
+  bool result = FALSE;
+
+  if (field && Growable(field))
+    {
+      bool single_line_field = Single_Line_Field(field);
+      int old_buflen = Buffer_Length(field);
+      int new_buflen;
+      int old_dcols = field->dcols;
+      int old_drows = field->drows;
+      FIELD_CELL *oldbuf = field->buf;
+      FIELD_CELL *newbuf;
+
+      int growth;
+      FORM *form = field->form;
+      bool need_visual_update = ((form != (FORM *)0) &&
+				 (form->status & _POSTED) &&
+				 (form->current == field));
+
+      if (need_visual_update)
+	Synchronize_Buffer(form);
+
+      if (single_line_field)
+	{
+	  growth = field->cols * amount;
+	  if (field->maxgrow)
+	    growth = Minimum(field->maxgrow - field->dcols, growth);
+	  field->dcols += growth;
+	  if (field->dcols == field->maxgrow)
+	    ClrStatus(field, _MAY_GROW);
+	}
+      else
+	{
+	  growth = (field->rows + field->nrow) * amount;
+	  if (field->maxgrow)
+	    growth = Minimum(field->maxgrow - field->drows, growth);
+	  field->drows += growth;
+	  if (field->drows == field->maxgrow)
+	    ClrStatus(field, _MAY_GROW);
+	}
+      /* drows, dcols changed, so we get really the new buffer length */
+      new_buflen = Buffer_Length(field);
+      newbuf = (FIELD_CELL *)malloc(Total_Buffer_Size(field));
+      if (!newbuf)
+	{
+	  /* restore to previous state */
+	  field->dcols = old_dcols;
+	  field->drows = old_drows;
+	  if ((single_line_field && (field->dcols != field->maxgrow)) ||
+	      (!single_line_field && (field->drows != field->maxgrow)))
+	    SetStatus(field, _MAY_GROW);
+	}
+      else
+	{
+	  /* Copy all the buffers.  This is the reason why we can't just use
+	   * realloc().
+	   */
+	  int i, j;
+
+	  result = TRUE;	/* allow sharing of recovery on failure */
+
+	  T((T_CREATE("fieldcell %p"), (void *)newbuf));
+	  field->buf = newbuf;
+	  for (i = 0; i <= field->nbuf; i++)
+	    {
+	      FIELD_CELL *new_bp = Address_Of_Nth_Buffer(field, i);
+	      FIELD_CELL *old_bp = oldbuf + i * (1 + old_buflen);
+
+	      for (j = 0; j < old_buflen; ++j)
+		new_bp[j] = old_bp[j];
+	      while (j < new_buflen)
+		new_bp[j++] = myBLANK;
+	      new_bp[new_buflen] = myZEROS;
+	    }
+
+#if USE_WIDEC_SUPPORT && NCURSES_EXT_FUNCS
+	  if (wresize(field->working, 1, Buffer_Length(field) + 1) == ERR)
+	    result = FALSE;
+#endif
+
+	  if (need_visual_update && result)
+	    {
+	      WINDOW *new_window = newpad(field->drows, field->dcols);
+
+	      if (new_window != 0)
+		{
+		  assert(form != (FORM *)0);
+		  if (form->w)
+		    delwin(form->w);
+		  form->w = new_window;
+		  Set_Field_Window_Attributes(field, form->w);
+		  werase(form->w);
+		  Buffer_To_Window(field, form->w);
+		  untouchwin(form->w);
+		  wmove(form->w, form->currow, form->curcol);
+		}
+	      else
+		result = FALSE;
+	    }
+
+	  if (result)
+	    {
+	      free(oldbuf);
+	      /* reflect changes in linked fields */
+	      if (field != field->link)
+		{
+		  FIELD *linked_field;
+
+		  for (linked_field = field->link;
+		       linked_field != field;
+		       linked_field = linked_field->link)
+		    {
+		      linked_field->buf = field->buf;
+		      linked_field->drows = field->drows;
+		      linked_field->dcols = field->dcols;
+		    }
+		}
+	    }
+	  else
+	    {
+	      /* restore old state */
+	      field->dcols = old_dcols;
+	      field->drows = old_drows;
+	      field->buf = oldbuf;
+	      if ((single_line_field &&
+		   (field->dcols != field->maxgrow)) ||
+		  (!single_line_field &&
+		   (field->drows != field->maxgrow)))
+		SetStatus(field, _MAY_GROW);
+	      free(newbuf);
+	    }
+	}
+    }
+  return (result);
+}
+
+#ifdef NCURSES_MOUSE_VERSION
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int Field_encloses(FIELD *field, int ry, int rx)
+|
+|   Description   :  Check if the given coordinates lie within the given field.
+|
+|   Return Values :  E_OK              - success
+|                    E_BAD_ARGUMENT    - invalid form pointer
+|                    E_SYSTEM_ERROR    - form has no current field or
+|                                        field-window
++--------------------------------------------------------------------------*/
+static int
+Field_encloses(FIELD *field, int ry, int rx)
+{
+  T((T_CALLED("Field_encloses(%p)"), (void *)field));
+  if (field != 0
+      && field->frow <= ry
+      && (field->frow + field->rows) > ry
+      && field->fcol <= rx
+      && (field->fcol + field->cols) > rx)
+    {
+      RETURN(E_OK);
+    }
+  RETURN(E_INVALID_FIELD);
+}
+#endif
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int _nc_Position_Form_Cursor(FORM * form)
+|
+|   Description   :  Position the cursor in the window for the current
+|                    field to be in sync. with the currow and curcol
+|                    values.
+|
+|   Return Values :  E_OK              - success
+|                    E_BAD_ARGUMENT    - invalid form pointer
+|                    E_SYSTEM_ERROR    - form has no current field or
+|                                        field-window
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+_nc_Position_Form_Cursor(FORM *form)
+{
+  FIELD *field;
+  WINDOW *formwin;
+
+  if (!form)
+    return (E_BAD_ARGUMENT);
+
+  if (!form->w || !form->current)
+    return (E_SYSTEM_ERROR);
+
+  field = form->current;
+  formwin = Get_Form_Window(form);
+
+  wmove(form->w, form->currow, form->curcol);
+  if (Has_Invisible_Parts(field))
+    {
+      /* in this case fieldwin isn't derived from formwin, so we have
+         to move the cursor in formwin by hand... */
+      wmove(formwin,
+	    field->frow + form->currow - form->toprow,
+	    field->fcol + form->curcol - form->begincol);
+      wcursyncup(formwin);
+    }
+  else
+    wcursyncup(form->w);
+  return (E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int _nc_Refresh_Current_Field(FORM * form)
+|
+|   Description   :  Propagate the changes in the field's window to the
+|                    window of the form.
+|
+|   Return Values :  E_OK              - on success
+|                    E_BAD_ARGUMENT    - invalid form pointer
+|                    E_SYSTEM_ERROR    - general error
++--------------------------------------------------------------------------*/
+static bool move_after_insert = TRUE;
+FORM_EXPORT(int)
+_nc_Refresh_Current_Field(FORM *form)
+{
+  WINDOW *formwin;
+  FIELD *field;
+  bool is_public;
+
+  T((T_CALLED("_nc_Refresh_Current_Field(%p)"), (void *)form));
+
+  if (!form)
+    RETURN(E_BAD_ARGUMENT);
+
+  if (!form->w || !form->current)
+    RETURN(E_SYSTEM_ERROR);
+
+  field = form->current;
+  formwin = Get_Form_Window(form);
+
+  is_public = Field_Has_Option(field, O_PUBLIC);
+
+  if (Is_Scroll_Field(field))
+    {
+      /* Again, in this case the fieldwin isn't derived from formwin,
+         so we have to perform a copy operation. */
+      if (Single_Line_Field(field))
+	{
+	  /* horizontal scrolling */
+	  if (form->curcol < form->begincol)
+	    form->begincol = form->curcol;
+	  else
+	    {
+	      if (form->curcol >= (form->begincol + field->cols))
+		form->begincol = form->curcol - field->cols
+		  + (move_after_insert ? 1 : 0);
+	    }
+	  if (is_public)
+	    copywin(form->w,
+		    formwin,
+		    0,
+		    form->begincol,
+		    field->frow,
+		    field->fcol,
+		    field->frow,
+		    field->cols + field->fcol - 1,
+		    0);
+	}
+      else
+	{
+	  /* A multi-line, i.e. vertical scrolling field */
+	  int first_modified_row, first_unmodified_row;
+
+	  if (field->drows > field->rows)
+	    {
+	      int row_after_bottom = form->toprow + field->rows;
+
+	      if (form->currow < form->toprow)
+		{
+		  form->toprow = form->currow;
+		  SetStatus(field, _NEWTOP);
+		}
+	      if (form->currow >= row_after_bottom)
+		{
+		  form->toprow = form->currow - field->rows + 1;
+		  SetStatus(field, _NEWTOP);
+		}
+	      if (field->status & _NEWTOP)
+		{
+		  /* means we have to copy whole range */
+		  first_modified_row = form->toprow;
+		  first_unmodified_row = first_modified_row + field->rows;
+		  ClrStatus(field, _NEWTOP);
+		}
+	      else
+		{
+		  /* we try to optimize : finding the range of touched
+		     lines */
+		  first_modified_row = form->toprow;
+		  while (first_modified_row < row_after_bottom)
+		    {
+		      if (is_linetouched(form->w, first_modified_row))
+			break;
+		      first_modified_row++;
+		    }
+		  first_unmodified_row = first_modified_row;
+		  while (first_unmodified_row < row_after_bottom)
+		    {
+		      if (!is_linetouched(form->w, first_unmodified_row))
+			break;
+		      first_unmodified_row++;
+		    }
+		}
+	    }
+	  else
+	    {
+	      first_modified_row = form->toprow;
+	      first_unmodified_row = first_modified_row + field->rows;
+	    }
+	  if (first_unmodified_row != first_modified_row && is_public)
+	    copywin(form->w,
+		    formwin,
+		    first_modified_row,
+		    0,
+		    field->frow + first_modified_row - form->toprow,
+		    field->fcol,
+		    field->frow + first_unmodified_row - form->toprow - 1,
+		    field->cols + field->fcol - 1,
+		    0);
+	}
+      if (is_public)
+	wsyncup(formwin);
+    }
+  else
+    {
+      /* if the field-window is simply a derived window, i.e. contains no
+       * invisible parts, the whole thing is trivial
+       */
+      if (is_public)
+	wsyncup(form->w);
+    }
+  untouchwin(form->w);
+  returnCode(_nc_Position_Form_Cursor(form));
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static void Perform_Justification(
+|                                        FIELD  * field,
+|                                        WINDOW * win)
+|
+|   Description   :  Output field with requested justification
+|
+|   Return Values :  -
++--------------------------------------------------------------------------*/
+static void
+Perform_Justification(FIELD *field, WINDOW *win)
+{
+  FIELD_CELL *bp;
+  int len;
+
+  bp = (Field_Has_Option(field, O_NO_LEFT_STRIP)
+	? field->buf
+	: Get_Start_Of_Data(field->buf, Buffer_Length(field)));
+  len = (int)(After_End_Of_Data(field->buf, Buffer_Length(field)) - bp);
+
+  if (len > 0)
+    {
+      int col = 0;
+
+      assert(win && (field->drows == 1));
+
+      if (field->cols - len >= 0)
+	switch (field->just)
+	  {
+	  case JUSTIFY_LEFT:
+	    break;
+	  case JUSTIFY_CENTER:
+	    col = (field->cols - len) / 2;
+	    break;
+	  case JUSTIFY_RIGHT:
+	    col = field->cols - len;
+	    break;
+	  default:
+	    break;
+	  }
+
+      wmove(win, 0, col);
+      myADDNSTR(win, bp, len);
+    }
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static void Undo_Justification(
+|                                     FIELD  * field,
+|                                     WINDOW * win)
+|
+|   Description   :  Display field without any justification, i.e.
+|                    left justified
+|
+|   Return Values :  -
++--------------------------------------------------------------------------*/
+static void
+Undo_Justification(FIELD *field, WINDOW *win)
+{
+  FIELD_CELL *bp;
+  int y, x;
+  int len;
+
+  getyx(win, y, x);
+
+  bp = (Field_Has_Option(field, O_NO_LEFT_STRIP)
+	? field->buf
+	: Get_Start_Of_Data(field->buf, Buffer_Length(field)));
+  len = (int)(After_End_Of_Data(field->buf, Buffer_Length(field)) - bp);
+
+  if (len > 0)
+    {
+      assert(win);
+      wmove(win, 0, 0);
+      myADDNSTR(win, bp, len);
+    }
+  wmove(win, y, x);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static bool Check_Char(FORM  *form,
+|                                           FIELD *field,
+|                                           FIELDTYPE * typ,
+|                                           int ch,
+|                                           TypeArgument *argp)
+|
+|   Description   :  Perform a single character check for character ch
+|                    according to the fieldtype instance.
+|
+|   Return Values :  TRUE             - Character is valid
+|                    FALSE            - Character is invalid
++--------------------------------------------------------------------------*/
+static bool
+Check_Char(FORM *form,
+	   FIELD *field,
+	   FIELDTYPE *typ,
+	   int ch,
+	   TypeArgument *argp)
+{
+  if (typ)
+    {
+      if (typ->status & _LINKED_TYPE)
+	{
+	  assert(argp);
+	  return (
+		   Check_Char(form, field, typ->left, ch, argp->left) ||
+		   Check_Char(form, field, typ->right, ch, argp->right));
+	}
+      else
+	{
+#if NCURSES_INTEROP_FUNCS
+	  if (typ->charcheck.occheck)
+	    {
+	      if (typ->status & _GENERIC)
+		return typ->charcheck.gccheck(ch, form, field, (void *)argp);
+	      else
+		return typ->charcheck.occheck(ch, (void *)argp);
+	    }
+#else
+	  if (typ->ccheck)
+	    return typ->ccheck(ch, (void *)argp);
+#endif
+	}
+    }
+  return (!iscntrl(UChar(ch)) ? TRUE : FALSE);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int Display_Or_Erase_Field(
+|                                           FIELD * field,
+|                                           bool bEraseFlag)
+|
+|   Description   :  Create a subwindow for the field and display the
+|                    buffer contents (apply justification if required)
+|                    or simply erase the field.
+|
+|   Return Values :  E_OK           - on success
+|                    E_SYSTEM_ERROR - some error (typical no memory)
++--------------------------------------------------------------------------*/
+static int
+Display_Or_Erase_Field(FIELD *field, bool bEraseFlag)
+{
+  WINDOW *win;
+  WINDOW *fwin;
+
+  if (!field)
+    return E_SYSTEM_ERROR;
+
+  fwin = Get_Form_Window(field->form);
+  win = derwin(fwin,
+	       field->rows, field->cols, field->frow, field->fcol);
+
+  if (!win)
+    return E_SYSTEM_ERROR;
+  else
+    {
+      if (Field_Has_Option(field, O_VISIBLE))
+	{
+	  Set_Field_Window_Attributes(field, win);
+	}
+      else
+	{
+	  (void)wattrset(win, (int)WINDOW_ATTRS(fwin));
+	}
+      werase(win);
+    }
+
+  if (!bEraseFlag)
+    {
+      if (Field_Has_Option(field, O_PUBLIC))
+	{
+	  if (Justification_Allowed(field))
+	    Perform_Justification(field, win);
+	  else
+	    Buffer_To_Window(field, win);
+	}
+      ClrStatus(field, _NEWTOP);
+    }
+  wsyncup(win);
+  delwin(win);
+  return E_OK;
+}
+
+/* Macros to preset the bEraseFlag */
+#define Display_Field(field) Display_Or_Erase_Field(field,FALSE)
+#define Erase_Field(field)   Display_Or_Erase_Field(field,TRUE)
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int Synchronize_Field(FIELD * field)
+|
+|   Description   :  Synchronize the windows content with the value in
+|                    the buffer.
+|
+|   Return Values :  E_OK                - success
+|                    E_BAD_ARGUMENT      - invalid field pointer
+|                    E_SYSTEM_ERROR      - some severe basic error
++--------------------------------------------------------------------------*/
+static int
+Synchronize_Field(FIELD *field)
+{
+  FORM *form;
+  int res = E_OK;
+
+  if (!field)
+    return (E_BAD_ARGUMENT);
+
+  if (((form = field->form) != (FORM *)0)
+      && Field_Really_Appears(field))
+    {
+      if (field == form->current)
+	{
+	  form->currow = form->curcol = form->toprow = form->begincol = 0;
+	  werase(form->w);
+
+	  if ((Field_Has_Option(field, O_PUBLIC)) && Justification_Allowed(field))
+	    Undo_Justification(field, form->w);
+	  else
+	    Buffer_To_Window(field, form->w);
+
+	  SetStatus(field, _NEWTOP);
+	  res = _nc_Refresh_Current_Field(form);
+	}
+      else
+	res = Display_Field(field);
+    }
+  SetStatus(field, _CHANGED);
+  return (res);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int Synchronize_Linked_Fields(FIELD * field)
+|
+|   Description   :  Propagate the Synchronize_Field function to all linked
+|                    fields. The first error that occurs in the sequence
+|                    of updates is the return value.
+|
+|   Return Values :  E_OK                - success
+|                    E_BAD_ARGUMENT      - invalid field pointer
+|                    E_SYSTEM_ERROR      - some severe basic error
++--------------------------------------------------------------------------*/
+static int
+Synchronize_Linked_Fields(FIELD *field)
+{
+  FIELD *linked_field;
+  int res = E_OK;
+
+  if (!field)
+    return (E_BAD_ARGUMENT);
+
+  if (!field->link)
+    return (E_SYSTEM_ERROR);
+
+  for (linked_field = field->link;
+       (linked_field != field) && (linked_field != 0);
+       linked_field = linked_field->link)
+    {
+      int syncres;
+
+      if (((syncres = Synchronize_Field(linked_field)) != E_OK) &&
+	  (res == E_OK))
+	res = syncres;
+    }
+  return (res);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int _nc_Synchronize_Attributes(FIELD * field)
+|
+|   Description   :  If a field's visual attributes have changed, this
+|                    routine is called to propagate those changes to the
+|                    screen.
+|
+|   Return Values :  E_OK             - success
+|                    E_BAD_ARGUMENT   - invalid field pointer
+|                    E_SYSTEM_ERROR   - some severe basic error
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+_nc_Synchronize_Attributes(FIELD *field)
+{
+  FORM *form;
+  int res = E_OK;
+
+  T((T_CALLED("_nc_Synchronize_Attributes(%p)"), (void *)field));
+
+  if (!field)
+    returnCode(E_BAD_ARGUMENT);
+
+  CHECKPOS(field->form);
+  if (((form = field->form) != (FORM *)0)
+      && Field_Really_Appears(field))
+    {
+      if (form->current == field)
+	{
+	  Synchronize_Buffer(form);
+	  Set_Field_Window_Attributes(field, form->w);
+	  werase(form->w);
+	  wmove(form->w, form->currow, form->curcol);
+
+	  if (Field_Has_Option(field, O_PUBLIC))
+	    {
+	      if (Justification_Allowed(field))
+		Undo_Justification(field, form->w);
+	      else
+		Buffer_To_Window(field, form->w);
+	    }
+	  else
+	    {
+	      WINDOW *formwin = Get_Form_Window(form);
+
+	      copywin(form->w, formwin,
+		      0, 0,
+		      field->frow, field->fcol,
+		      field->frow + field->rows - 1,
+		      field->fcol + field->cols - 1, 0);
+	      wsyncup(formwin);
+	      Buffer_To_Window(field, form->w);
+	      SetStatus(field, _NEWTOP);	/* fake refresh to paint all */
+	      _nc_Refresh_Current_Field(form);
+	    }
+	}
+      else
+	{
+	  res = Display_Field(field);
+	}
+    }
+  CHECKPOS(form);
+  returnCode(res);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int _nc_Synchronize_Options(FIELD * field,
+|                                                Field_Options newopts)
+|
+|   Description   :  If a field's options have changed, this routine is
+|                    called to propagate these changes to the screen and
+|                    to really change the behavior of the field.
+|
+|   Return Values :  E_OK                - success
+|                    E_BAD_ARGUMENT      - invalid field pointer
+|                    E_CURRENT           - field is the current one
+|                    E_SYSTEM_ERROR      - some severe basic error
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+_nc_Synchronize_Options(FIELD *field, Field_Options newopts)
+{
+  Field_Options oldopts;
+  Field_Options changed_opts;
+  FORM *form;
+  int res = E_OK;
+
+  T((T_CALLED("_nc_Synchronize_Options(%p,%#x)"), (void *)field, newopts));
+
+  if (!field)
+    returnCode(E_BAD_ARGUMENT);
+
+  oldopts = field->opts;
+  changed_opts = oldopts ^ newopts;
+  field->opts = newopts;
+  form = field->form;
+
+  if (form)
+    {
+      if (form->status & _POSTED)
+	{
+	  if (form->current == field)
+	    {
+	      field->opts = oldopts;
+	      returnCode(E_CURRENT);
+	    }
+	  if (form->curpage == field->page)
+	    {
+	      if ((unsigned)changed_opts & O_VISIBLE)
+		{
+		  if ((unsigned)newopts & O_VISIBLE)
+		    res = Display_Field(field);
+		  else
+		    res = Erase_Field(field);
+		}
+	      else
+		{
+		  if (((unsigned)changed_opts & O_PUBLIC) &&
+		      ((unsigned)newopts & O_VISIBLE))
+		    res = Display_Field(field);
+		}
+	    }
+	}
+    }
+
+  if ((unsigned)changed_opts & O_STATIC)
+    {
+      bool single_line_field = Single_Line_Field(field);
+      int res2 = E_OK;
+
+      if ((unsigned)newopts & O_STATIC)
+	{
+	  /* the field becomes now static */
+	  ClrStatus(field, _MAY_GROW);
+	  /* if actually we have no hidden columns, justification may
+	     occur again */
+	  if (single_line_field &&
+	      (field->cols == field->dcols) &&
+	      (field->just != NO_JUSTIFICATION) &&
+	      Field_Really_Appears(field))
+	    {
+	      res2 = Display_Field(field);
+	    }
+	}
+      else
+	{
+	  /* field is no longer static */
+	  if ((field->maxgrow == 0) ||
+	      (single_line_field && (field->dcols < field->maxgrow)) ||
+	      (!single_line_field && (field->drows < field->maxgrow)))
+	    {
+	      SetStatus(field, _MAY_GROW);
+	      /* a field with justification now changes its behavior,
+	         so we must redisplay it */
+	      if (single_line_field &&
+		  (field->just != NO_JUSTIFICATION) &&
+		  Field_Really_Appears(field))
+		{
+		  res2 = Display_Field(field);
+		}
+	    }
+	}
+      if (res2 != E_OK)
+	res = res2;
+    }
+
+  returnCode(res);
+}
+
+/*
+ * Removes the focus from the current field of the form.
+ */
+void
+_nc_Unset_Current_Field(FORM *form)
+{
+  FIELD *field = form->current;
+
+  _nc_Refresh_Current_Field(form);
+  if (Field_Has_Option(field, O_PUBLIC))
+    {
+      if (field->drows > field->rows)
+	{
+	  if (form->toprow == 0)
+	    ClrStatus(field, _NEWTOP);
+	  else
+	    SetStatus(field, _NEWTOP);
+	}
+      else
+	{
+	  if (Justification_Allowed(field))
+	    {
+	      Window_To_Buffer(form, field);
+	      werase(form->w);
+	      Perform_Justification(field, form->w);
+	      if (Field_Has_Option(field, O_DYNAMIC_JUSTIFY) &&
+		  (form->w->_parent == 0))
+		{
+		  copywin(form->w,
+			  Get_Form_Window(form),
+			  0,
+			  0,
+			  field->frow,
+			  field->fcol,
+			  field->frow,
+			  field->cols + field->fcol - 1,
+			  0);
+		  wsyncup(Get_Form_Window(form));
+		}
+	      else
+		{
+		  wsyncup(form->w);
+		}
+	    }
+	}
+    }
+  delwin(form->w);
+  form->w = (WINDOW *)0;
+  form->current = 0;
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int _nc_Set_Current_Field(FORM  * form,
+|                                              FIELD * newfield)
+|
+|   Description   :  Make the newfield the new current field.
+|
+|   Return Values :  E_OK              - success
+|                    E_BAD_ARGUMENT    - invalid form or field pointer
+|                    E_SYSTEM_ERROR    - some severe basic error
+|                    E_NOT_CONNECTED   - no fields are connected to the form
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+_nc_Set_Current_Field(FORM *form, FIELD *newfield)
+{
+  FIELD *field;
+  WINDOW *new_window;
+
+  T((T_CALLED("_nc_Set_Current_Field(%p,%p)"), (void *)form, (void *)newfield));
+
+  if (!form || !newfield || (newfield->form != form))
+    returnCode(E_BAD_ARGUMENT);
+
+  if ((form->status & _IN_DRIVER))
+    returnCode(E_BAD_STATE);
+
+  if (!(form->field))
+    returnCode(E_NOT_CONNECTED);
+
+  field = form->current;
+
+  if ((field != newfield) ||
+      !(form->status & _POSTED))
+    {
+      if (field && (form->w) &&
+	  (Field_Has_Option(field, O_VISIBLE)) &&
+	  (field->form->curpage == field->page))
+	_nc_Unset_Current_Field(form);
+
+      field = newfield;
+
+      if (Has_Invisible_Parts(field))
+	new_window = newpad(field->drows, field->dcols);
+      else
+	new_window = derwin(Get_Form_Window(form),
+			    field->rows, field->cols, field->frow, field->fcol);
+
+      if (!new_window)
+	returnCode(E_SYSTEM_ERROR);
+
+      form->current = field;
+
+      if (form->w)
+	delwin(form->w);
+      form->w = new_window;
+
+      ClrStatus(form, _WINDOW_MODIFIED);
+      Set_Field_Window_Attributes(field, form->w);
+
+      if (Has_Invisible_Parts(field))
+	{
+	  werase(form->w);
+	  Buffer_To_Window(field, form->w);
+	}
+      else
+	{
+	  if (Justification_Allowed(field))
+	    {
+	      werase(form->w);
+	      Undo_Justification(field, form->w);
+	      wsyncup(form->w);
+	    }
+	}
+
+      untouchwin(form->w);
+    }
+
+  form->currow = form->curcol = form->toprow = form->begincol = 0;
+  returnCode(E_OK);
+}
+
+/*----------------------------------------------------------------------------
+  Intra-Field Navigation routines
+  --------------------------------------------------------------------------*/
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int IFN_Next_Character(FORM * form)
+|
+|   Description   :  Move to the next character in the field. In a multi-line
+|                    field this wraps at the end of the line.
+|
+|   Return Values :  E_OK                - success
+|                    E_REQUEST_DENIED    - at the rightmost position
++--------------------------------------------------------------------------*/
+static int
+IFN_Next_Character(FORM *form)
+{
+  FIELD *field = form->current;
+  int step = myWCWIDTH(form->w, form->currow, form->curcol);
+
+  T((T_CALLED("IFN_Next_Character(%p)"), (void *)form));
+  if ((form->curcol += step) == field->dcols)
+    {
+      if ((++(form->currow)) == field->drows)
+	{
+#if GROW_IF_NAVIGATE
+	  if (!Single_Line_Field(field) && Field_Grown(field, 1))
+	    {
+	      form->curcol = 0;
+	      returnCode(E_OK);
+	    }
+#endif
+	  form->currow--;
+#if GROW_IF_NAVIGATE
+	  if (Single_Line_Field(field) && Field_Grown(field, 1))
+	    returnCode(E_OK);
+#endif
+	  form->curcol -= step;
+	  returnCode(E_REQUEST_DENIED);
+	}
+      form->curcol = 0;
+    }
+  returnCode(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int IFN_Previous_Character(FORM * form)
+|
+|   Description   :  Move to the previous character in the field. In a
+|                    multi-line field this wraps and the beginning of the
+|                    line.
+|
+|   Return Values :  E_OK                - success
+|                    E_REQUEST_DENIED    - at the leftmost position
++--------------------------------------------------------------------------*/
+static int
+IFN_Previous_Character(FORM *form)
+{
+  int amount = myWCWIDTH(form->w, form->currow, form->curcol - 1);
+  int oldcol = form->curcol;
+
+  T((T_CALLED("IFN_Previous_Character(%p)"), (void *)form));
+  if ((form->curcol -= amount) < 0)
+    {
+      if ((--(form->currow)) < 0)
+	{
+	  form->currow++;
+	  form->curcol = oldcol;
+	  returnCode(E_REQUEST_DENIED);
+	}
+      form->curcol = form->current->dcols - 1;
+    }
+  returnCode(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int IFN_Next_Line(FORM * form)
+|
+|   Description   :  Move to the beginning of the next line in the field
+|
+|   Return Values :  E_OK                - success
+|                    E_REQUEST_DENIED    - at the last line
++--------------------------------------------------------------------------*/
+static int
+IFN_Next_Line(FORM *form)
+{
+  FIELD *field = form->current;
+
+  T((T_CALLED("IFN_Next_Line(%p)"), (void *)form));
+  if ((++(form->currow)) == field->drows)
+    {
+#if GROW_IF_NAVIGATE
+      if (!Single_Line_Field(field) && Field_Grown(field, 1))
+	returnCode(E_OK);
+#endif
+      form->currow--;
+      returnCode(E_REQUEST_DENIED);
+    }
+  form->curcol = 0;
+  returnCode(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int IFN_Previous_Line(FORM * form)
+|
+|   Description   :  Move to the beginning of the previous line in the field
+|
+|   Return Values :  E_OK                - success
+|                    E_REQUEST_DENIED    - at the first line
++--------------------------------------------------------------------------*/
+static int
+IFN_Previous_Line(FORM *form)
+{
+  T((T_CALLED("IFN_Previous_Line(%p)"), (void *)form));
+  if ((--(form->currow)) < 0)
+    {
+      form->currow++;
+      returnCode(E_REQUEST_DENIED);
+    }
+  form->curcol = 0;
+  returnCode(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int IFN_Next_Word(FORM * form)
+|
+|   Description   :  Move to the beginning of the next word in the field.
+|
+|   Return Values :  E_OK             - success
+|                    E_REQUEST_DENIED - there is no next word
++--------------------------------------------------------------------------*/
+static int
+IFN_Next_Word(FORM *form)
+{
+  FIELD *field = form->current;
+  FIELD_CELL *bp = Address_Of_Current_Position_In_Buffer(form);
+  FIELD_CELL *s;
+  FIELD_CELL *t;
+
+  T((T_CALLED("IFN_Next_Word(%p)"), (void *)form));
+
+  /* We really need access to the data, so we have to synchronize */
+  Synchronize_Buffer(form);
+
+  /* Go to the first whitespace after the current position (including
+     current position). This is then the starting point to look for the
+     next non-blank data */
+  s = Get_First_Whitespace_Character(bp, Buffer_Length(field) -
+				     (int)(bp - field->buf));
+
+  /* Find the start of the next word */
+  t = Get_Start_Of_Data(s, Buffer_Length(field) -
+			(int)(s - field->buf));
+#if !FRIENDLY_PREV_NEXT_WORD
+  if (s == t)
+    returnCode(E_REQUEST_DENIED);
+  else
+#endif
+    {
+      Adjust_Cursor_Position(form, t);
+      returnCode(E_OK);
+    }
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int IFN_Previous_Word(FORM * form)
+|
+|   Description   :  Move to the beginning of the previous word in the field.
+|
+|   Return Values :  E_OK             - success
+|                    E_REQUEST_DENIED - there is no previous word
++--------------------------------------------------------------------------*/
+static int
+IFN_Previous_Word(FORM *form)
+{
+  FIELD *field = form->current;
+  FIELD_CELL *bp = Address_Of_Current_Position_In_Buffer(form);
+  FIELD_CELL *s;
+  FIELD_CELL *t;
+  bool again = FALSE;
+
+  T((T_CALLED("IFN_Previous_Word(%p)"), (void *)form));
+
+  /* We really need access to the data, so we have to synchronize */
+  Synchronize_Buffer(form);
+
+  s = After_End_Of_Data(field->buf, (int)(bp - field->buf));
+  /* s points now right after the last non-blank in the buffer before bp.
+     If bp was in a word, s equals bp. In this case we must find the last
+     whitespace in the buffer before bp and repeat the game to really find
+     the previous word! */
+  if (s == bp)
+    again = TRUE;
+
+  /* And next call now goes backward to look for the last whitespace
+     before that, pointing right after this, so it points to the begin
+     of the previous word.
+   */
+  t = After_Last_Whitespace_Character(field->buf, (int)(s - field->buf));
+#if !FRIENDLY_PREV_NEXT_WORD
+  if (s == t)
+    returnCode(E_REQUEST_DENIED);
+#endif
+  if (again)
+    {
+      /* and do it again, replacing bp by t */
+      s = After_End_Of_Data(field->buf, (int)(t - field->buf));
+      t = After_Last_Whitespace_Character(field->buf, (int)(s - field->buf));
+#if !FRIENDLY_PREV_NEXT_WORD
+      if (s == t)
+	returnCode(E_REQUEST_DENIED);
+#endif
+    }
+  Adjust_Cursor_Position(form, t);
+  returnCode(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int IFN_Beginning_Of_Field(FORM * form)
+|
+|   Description   :  Place the cursor at the first non-pad character in
+|                    the field.
+|
+|   Return Values :  E_OK             - success
++--------------------------------------------------------------------------*/
+static int
+IFN_Beginning_Of_Field(FORM *form)
+{
+  FIELD *field = form->current;
+
+  T((T_CALLED("IFN_Beginning_Of_Field(%p)"), (void *)form));
+  Synchronize_Buffer(form);
+  Adjust_Cursor_Position(form,
+			 Get_Start_Of_Data(field->buf, Buffer_Length(field)));
+  returnCode(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int IFN_End_Of_Field(FORM * form)
+|
+|   Description   :  Place the cursor after the last non-pad character in
+|                    the field. If the field occupies the last position in
+|                    the buffer, the cursor is positioned on the last
+|                    character.
+|
+|   Return Values :  E_OK              - success
++--------------------------------------------------------------------------*/
+static int
+IFN_End_Of_Field(FORM *form)
+{
+  FIELD *field = form->current;
+  FIELD_CELL *pos;
+
+  T((T_CALLED("IFN_End_Of_Field(%p)"), (void *)form));
+  Synchronize_Buffer(form);
+  pos = After_End_Of_Data(field->buf, Buffer_Length(field));
+  if (pos == (field->buf + Buffer_Length(field)))
+    pos--;
+  Adjust_Cursor_Position(form, pos);
+  returnCode(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int IFN_Beginning_Of_Line(FORM * form)
+|
+|   Description   :  Place the cursor on the first non-pad character in
+|                    the current line of the field.
+|
+|   Return Values :  E_OK         - success
++--------------------------------------------------------------------------*/
+static int
+IFN_Beginning_Of_Line(FORM *form)
+{
+  FIELD *field = form->current;
+
+  T((T_CALLED("IFN_Beginning_Of_Line(%p)"), (void *)form));
+  Synchronize_Buffer(form);
+  Adjust_Cursor_Position(form,
+			 Get_Start_Of_Data(Address_Of_Current_Row_In_Buffer(form),
+					   field->dcols));
+  returnCode(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int IFN_End_Of_Line(FORM * form)
+|
+|   Description   :  Place the cursor after the last non-pad character in the
+|                    current line of the field. If the field occupies the
+|                    last column in the line, the cursor is positioned on the
+|                    last character of the line.
+|
+|   Return Values :  E_OK        - success
++--------------------------------------------------------------------------*/
+static int
+IFN_End_Of_Line(FORM *form)
+{
+  FIELD *field = form->current;
+  FIELD_CELL *pos;
+  FIELD_CELL *bp;
+
+  T((T_CALLED("IFN_End_Of_Line(%p)"), (void *)form));
+  Synchronize_Buffer(form);
+  bp = Address_Of_Current_Row_In_Buffer(form);
+  pos = After_End_Of_Data(bp, field->dcols);
+  if (pos == (bp + field->dcols))
+    pos--;
+  Adjust_Cursor_Position(form, pos);
+  returnCode(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int IFN_Left_Character(FORM * form)
+|
+|   Description   :  Move one character to the left in the current line.
+|                    This doesn't cycle.
+|
+|   Return Values :  E_OK             - success
+|                    E_REQUEST_DENIED - already in first column
++--------------------------------------------------------------------------*/
+static int
+IFN_Left_Character(FORM *form)
+{
+  int amount = myWCWIDTH(form->w, form->currow, form->curcol - 1);
+  int oldcol = form->curcol;
+
+  T((T_CALLED("IFN_Left_Character(%p)"), (void *)form));
+  if ((form->curcol -= amount) < 0)
+    {
+      form->curcol = oldcol;
+      returnCode(E_REQUEST_DENIED);
+    }
+  returnCode(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int IFN_Right_Character(FORM * form)
+|
+|   Description   :  Move one character to the right in the current line.
+|                    This doesn't cycle.
+|
+|   Return Values :  E_OK              - success
+|                    E_REQUEST_DENIED  - already in last column
++--------------------------------------------------------------------------*/
+static int
+IFN_Right_Character(FORM *form)
+{
+  int amount = myWCWIDTH(form->w, form->currow, form->curcol);
+  int oldcol = form->curcol;
+
+  T((T_CALLED("IFN_Right_Character(%p)"), (void *)form));
+  if ((form->curcol += amount) >= form->current->dcols)
+    {
+#if GROW_IF_NAVIGATE
+      FIELD *field = form->current;
+
+      if (Single_Line_Field(field) && Field_Grown(field, 1))
+	returnCode(E_OK);
+#endif
+      form->curcol = oldcol;
+      returnCode(E_REQUEST_DENIED);
+    }
+  returnCode(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int IFN_Up_Character(FORM * form)
+|
+|   Description   :  Move one line up. This doesn't cycle through the lines
+|                    of the field.
+|
+|   Return Values :  E_OK              - success
+|                    E_REQUEST_DENIED  - already in last column
++--------------------------------------------------------------------------*/
+static int
+IFN_Up_Character(FORM *form)
+{
+  T((T_CALLED("IFN_Up_Character(%p)"), (void *)form));
+  if ((--(form->currow)) < 0)
+    {
+      form->currow++;
+      returnCode(E_REQUEST_DENIED);
+    }
+  returnCode(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int IFN_Down_Character(FORM * form)
+|
+|   Description   :  Move one line down. This doesn't cycle through the
+|                    lines of the field.
+|
+|   Return Values :  E_OK              - success
+|                    E_REQUEST_DENIED  - already in last column
++--------------------------------------------------------------------------*/
+static int
+IFN_Down_Character(FORM *form)
+{
+  FIELD *field = form->current;
+
+  T((T_CALLED("IFN_Down_Character(%p)"), (void *)form));
+  if ((++(form->currow)) == field->drows)
+    {
+#if GROW_IF_NAVIGATE
+      if (!Single_Line_Field(field) && Field_Grown(field, 1))
+	returnCode(E_OK);
+#endif
+      --(form->currow);
+      returnCode(E_REQUEST_DENIED);
+    }
+  returnCode(E_OK);
+}
+/*----------------------------------------------------------------------------
+  END of Intra-Field Navigation routines
+  --------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+  Vertical scrolling helper routines
+  --------------------------------------------------------------------------*/
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int VSC_Generic(FORM *form, int nlines)
+|
+|   Description   :  Scroll multi-line field forward (nlines>0) or
+|                    backward (nlines<0) this many lines.
+|
+|   Return Values :  E_OK              - success
+|                    E_REQUEST_DENIED  - can't scroll
++--------------------------------------------------------------------------*/
+static int
+VSC_Generic(FORM *form, int nlines)
+{
+  FIELD *field = form->current;
+  int res = E_REQUEST_DENIED;
+  int rows_to_go = (nlines > 0 ? nlines : -nlines);
+
+  if (nlines > 0)
+    {
+      if ((rows_to_go + form->toprow) > (field->drows - field->rows))
+	rows_to_go = (field->drows - field->rows - form->toprow);
+
+      if (rows_to_go > 0)
+	{
+	  form->currow += rows_to_go;
+	  form->toprow += rows_to_go;
+	  res = E_OK;
+	}
+    }
+  else
+    {
+      if (rows_to_go > form->toprow)
+	rows_to_go = form->toprow;
+
+      if (rows_to_go > 0)
+	{
+	  form->currow -= rows_to_go;
+	  form->toprow -= rows_to_go;
+	  res = E_OK;
+	}
+    }
+  return (res);
+}
+/*----------------------------------------------------------------------------
+  End of Vertical scrolling helper routines
+  --------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+  Vertical scrolling routines
+  --------------------------------------------------------------------------*/
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int Vertical_Scrolling(
+|                                           int (* const fct) (FORM *),
+|                                           FORM * form)
+|
+|   Description   :  Performs the generic vertical scrolling routines.
+|                    This has to check for a multi-line field and to set
+|                    the _NEWTOP flag if scrolling really occurred.
+|
+|   Return Values :  Propagated error code from low-level driver calls
++--------------------------------------------------------------------------*/
+static int
+Vertical_Scrolling(int (*const fct) (FORM *), FORM *form)
+{
+  int res = E_REQUEST_DENIED;
+
+  if (!Single_Line_Field(form->current))
+    {
+      res = fct(form);
+      if (res == E_OK)
+	SetStatus(form->current, _NEWTOP);
+    }
+  return (res);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int VSC_Scroll_Line_Forward(FORM * form)
+|
+|   Description   :  Scroll multi-line field forward a line
+|
+|   Return Values :  E_OK                - success
+|                    E_REQUEST_DENIED    - no data ahead
++--------------------------------------------------------------------------*/
+static int
+VSC_Scroll_Line_Forward(FORM *form)
+{
+  T((T_CALLED("VSC_Scroll_Line_Forward(%p)"), (void *)form));
+  returnCode(VSC_Generic(form, 1));
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int VSC_Scroll_Line_Backward(FORM * form)
+|
+|   Description   :  Scroll multi-line field backward a line
+|
+|   Return Values :  E_OK                - success
+|                    E_REQUEST_DENIED    - no data behind
++--------------------------------------------------------------------------*/
+static int
+VSC_Scroll_Line_Backward(FORM *form)
+{
+  T((T_CALLED("VSC_Scroll_Line_Backward(%p)"), (void *)form));
+  returnCode(VSC_Generic(form, -1));
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int VSC_Scroll_Page_Forward(FORM * form)
+|
+|   Description   :  Scroll a multi-line field forward a page
+|
+|   Return Values :  E_OK              - success
+|                    E_REQUEST_DENIED  - no data ahead
++--------------------------------------------------------------------------*/
+static int
+VSC_Scroll_Page_Forward(FORM *form)
+{
+  T((T_CALLED("VSC_Scroll_Page_Forward(%p)"), (void *)form));
+  returnCode(VSC_Generic(form, form->current->rows));
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int VSC_Scroll_Half_Page_Forward(FORM * form)
+|
+|   Description   :  Scroll a multi-line field forward half a page
+|
+|   Return Values :  E_OK              - success
+|                    E_REQUEST_DENIED  - no data ahead
++--------------------------------------------------------------------------*/
+static int
+VSC_Scroll_Half_Page_Forward(FORM *form)
+{
+  T((T_CALLED("VSC_Scroll_Half_Page_Forward(%p)"), (void *)form));
+  returnCode(VSC_Generic(form, (form->current->rows + 1) / 2));
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int VSC_Scroll_Page_Backward(FORM * form)
+|
+|   Description   :  Scroll a multi-line field backward a page
+|
+|   Return Values :  E_OK              - success
+|                    E_REQUEST_DENIED  - no data behind
++--------------------------------------------------------------------------*/
+static int
+VSC_Scroll_Page_Backward(FORM *form)
+{
+  T((T_CALLED("VSC_Scroll_Page_Backward(%p)"), (void *)form));
+  returnCode(VSC_Generic(form, -(form->current->rows)));
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int VSC_Scroll_Half_Page_Backward(FORM * form)
+|
+|   Description   :  Scroll a multi-line field backward half a page
+|
+|   Return Values :  E_OK              - success
+|                    E_REQUEST_DENIED  - no data behind
++--------------------------------------------------------------------------*/
+static int
+VSC_Scroll_Half_Page_Backward(FORM *form)
+{
+  T((T_CALLED("VSC_Scroll_Half_Page_Backward(%p)"), (void *)form));
+  returnCode(VSC_Generic(form, -((form->current->rows + 1) / 2)));
+}
+/*----------------------------------------------------------------------------
+  End of Vertical scrolling routines
+  --------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+  Horizontal scrolling helper routines
+  --------------------------------------------------------------------------*/
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int HSC_Generic(FORM *form, int ncolumns)
+|
+|   Description   :  Scroll single-line field forward (ncolumns>0) or
+|                    backward (ncolumns<0) this many columns.
+|
+|   Return Values :  E_OK              - success
+|                    E_REQUEST_DENIED  - can't scroll
++--------------------------------------------------------------------------*/
+static int
+HSC_Generic(FORM *form, int ncolumns)
+{
+  FIELD *field = form->current;
+  int res = E_REQUEST_DENIED;
+  int cols_to_go = (ncolumns > 0 ? ncolumns : -ncolumns);
+
+  if (ncolumns > 0)
+    {
+      if ((cols_to_go + form->begincol) > (field->dcols - field->cols))
+	cols_to_go = field->dcols - field->cols - form->begincol;
+
+      if (cols_to_go > 0)
+	{
+	  form->curcol += cols_to_go;
+	  form->begincol += cols_to_go;
+	  res = E_OK;
+	}
+    }
+  else
+    {
+      if (cols_to_go > form->begincol)
+	cols_to_go = form->begincol;
+
+      if (cols_to_go > 0)
+	{
+	  form->curcol -= cols_to_go;
+	  form->begincol -= cols_to_go;
+	  res = E_OK;
+	}
+    }
+  return (res);
+}
+/*----------------------------------------------------------------------------
+  End of Horizontal scrolling helper routines
+  --------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+  Horizontal scrolling routines
+  --------------------------------------------------------------------------*/
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int Horizontal_Scrolling(
+|                                          int (* const fct) (FORM *),
+|                                          FORM * form)
+|
+|   Description   :  Performs the generic horizontal scrolling routines.
+|                    This has to check for a single-line field.
+|
+|   Return Values :  Propagated error code from low-level driver calls
++--------------------------------------------------------------------------*/
+static int
+Horizontal_Scrolling(int (*const fct) (FORM *), FORM *form)
+{
+  if (Single_Line_Field(form->current))
+    return fct(form);
+  else
+    return (E_REQUEST_DENIED);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int HSC_Scroll_Char_Forward(FORM * form)
+|
+|   Description   :  Scroll single-line field forward a character
+|
+|   Return Values :  E_OK                - success
+|                    E_REQUEST_DENIED    - no data ahead
++--------------------------------------------------------------------------*/
+static int
+HSC_Scroll_Char_Forward(FORM *form)
+{
+  T((T_CALLED("HSC_Scroll_Char_Forward(%p)"), (void *)form));
+  returnCode(HSC_Generic(form, 1));
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int HSC_Scroll_Char_Backward(FORM * form)
+|
+|   Description   :  Scroll single-line field backward a character
+|
+|   Return Values :  E_OK                - success
+|                    E_REQUEST_DENIED    - no data behind
++--------------------------------------------------------------------------*/
+static int
+HSC_Scroll_Char_Backward(FORM *form)
+{
+  T((T_CALLED("HSC_Scroll_Char_Backward(%p)"), (void *)form));
+  returnCode(HSC_Generic(form, -1));
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int HSC_Horizontal_Line_Forward(FORM* form)
+|
+|   Description   :  Scroll single-line field forward a line
+|
+|   Return Values :  E_OK                - success
+|                    E_REQUEST_DENIED    - no data ahead
++--------------------------------------------------------------------------*/
+static int
+HSC_Horizontal_Line_Forward(FORM *form)
+{
+  T((T_CALLED("HSC_Horizontal_Line_Forward(%p)"), (void *)form));
+  returnCode(HSC_Generic(form, form->current->cols));
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int HSC_Horizontal_Half_Line_Forward(FORM* form)
+|
+|   Description   :  Scroll single-line field forward half a line
+|
+|   Return Values :  E_OK               - success
+|                    E_REQUEST_DENIED   - no data ahead
++--------------------------------------------------------------------------*/
+static int
+HSC_Horizontal_Half_Line_Forward(FORM *form)
+{
+  T((T_CALLED("HSC_Horizontal_Half_Line_Forward(%p)"), (void *)form));
+  returnCode(HSC_Generic(form, (form->current->cols + 1) / 2));
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int HSC_Horizontal_Line_Backward(FORM* form)
+|
+|   Description   :  Scroll single-line field backward a line
+|
+|   Return Values :  E_OK                - success
+|                    E_REQUEST_DENIED    - no data behind
++--------------------------------------------------------------------------*/
+static int
+HSC_Horizontal_Line_Backward(FORM *form)
+{
+  T((T_CALLED("HSC_Horizontal_Line_Backward(%p)"), (void *)form));
+  returnCode(HSC_Generic(form, -(form->current->cols)));
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int HSC_Horizontal_Half_Line_Backward(FORM* form)
+|
+|   Description   :  Scroll single-line field backward half a line
+|
+|   Return Values :  E_OK                - success
+|                    E_REQUEST_DENIED    - no data behind
++--------------------------------------------------------------------------*/
+static int
+HSC_Horizontal_Half_Line_Backward(FORM *form)
+{
+  T((T_CALLED("HSC_Horizontal_Half_Line_Backward(%p)"), (void *)form));
+  returnCode(HSC_Generic(form, -((form->current->cols + 1) / 2)));
+}
+
+/*----------------------------------------------------------------------------
+  End of Horizontal scrolling routines
+  --------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+  Helper routines for Field Editing
+  --------------------------------------------------------------------------*/
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static bool Is_There_Room_For_A_Line(FORM * form)
+|
+|   Description   :  Check whether or not there is enough room in the
+|                    buffer to enter a whole line.
+|
+|   Return Values :  TRUE   - there is enough space
+|                    FALSE  - there is not enough space
++--------------------------------------------------------------------------*/
+NCURSES_INLINE static bool
+Is_There_Room_For_A_Line(FORM *form)
+{
+  FIELD *field = form->current;
+  FIELD_CELL *begin_of_last_line, *s;
+
+  Synchronize_Buffer(form);
+  begin_of_last_line = Address_Of_Row_In_Buffer(field, (field->drows - 1));
+  s = After_End_Of_Data(begin_of_last_line, field->dcols);
+  return ((s == begin_of_last_line) ? TRUE : FALSE);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static bool Is_There_Room_For_A_Char_In_Line(FORM * form)
+|
+|   Description   :  Checks whether or not there is room for a new character
+|                    in the current line.
+|
+|   Return Values :  TRUE    - there is room
+|                    FALSE   - there is not enough room (line full)
++--------------------------------------------------------------------------*/
+NCURSES_INLINE static bool
+Is_There_Room_For_A_Char_In_Line(FORM *form)
+{
+  int last_char_in_line;
+
+  wmove(form->w, form->currow, form->current->dcols - 1);
+  last_char_in_line = (int)(winch(form->w) & A_CHARTEXT);
+  wmove(form->w, form->currow, form->curcol);
+  return (((last_char_in_line == form->current->pad) ||
+	   is_blank(last_char_in_line)) ? TRUE : FALSE);
+}
+
+#define There_Is_No_Room_For_A_Char_In_Line(f) \
+  !Is_There_Room_For_A_Char_In_Line(f)
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int Insert_String(
+|                                             FORM * form,
+|                                             int row,
+|                                             char *txt,
+|                                             int  len )
+|
+|   Description   :  Insert the 'len' characters beginning at pointer 'txt'
+|                    into the 'row' of the 'form'. The insertion occurs
+|                    on the beginning of the row, all other characters are
+|                    moved to the right. After the text a pad character will
+|                    be inserted to separate the text from the rest. If
+|                    necessary the insertion moves characters on the next
+|                    line to make place for the requested insertion string.
+|
+|   Return Values :  E_OK              - success
+|                    E_REQUEST_DENIED  -
+|                    E_SYSTEM_ERROR    - system error
++--------------------------------------------------------------------------*/
+static int
+Insert_String(FORM *form, int row, FIELD_CELL *txt, int len)
+{
+  FIELD *field = form->current;
+  FIELD_CELL *bp = Address_Of_Row_In_Buffer(field, row);
+  int datalen = (int)(After_End_Of_Data(bp, field->dcols) - bp);
+  int freelen = field->dcols - datalen;
+  int requiredlen = len + 1;
+  int result = E_REQUEST_DENIED;
+
+  if (freelen >= requiredlen)
+    {
+      wmove(form->w, row, 0);
+      myINSNSTR(form->w, txt, len);
+      wmove(form->w, row, len);
+      myINSNSTR(form->w, &myBLANK, 1);
+      result = E_OK;
+    }
+  else
+    {
+      /* we have to move characters on the next line. If we are on the
+         last line this may work, if the field is growable */
+      if ((row == (field->drows - 1)) && Growable(field))
+	{
+	  if (!Field_Grown(field, 1))
+	    return (E_SYSTEM_ERROR);
+	  /* !!!Side-Effect : might be changed due to growth!!! */
+	  bp = Address_Of_Row_In_Buffer(field, row);
+	}
+
+      if (row < (field->drows - 1))
+	{
+	  FIELD_CELL *split;
+
+	  split =
+	    After_Last_Whitespace_Character(bp,
+					    (int)(Get_Start_Of_Data(bp
+								    + field->dcols
+								    - requiredlen,
+								    requiredlen)
+						  - bp));
+	  /* split points now to the first character of the portion of the
+	     line that must be moved to the next line */
+	  datalen = (int)(split - bp);	/* + freelen has to stay on this line   */
+	  freelen = field->dcols - (datalen + freelen);		/* for the next line */
+
+	  if ((result = Insert_String(form, row + 1, split, freelen)) == E_OK)
+	    {
+	      wmove(form->w, row, datalen);
+	      wclrtoeol(form->w);
+	      wmove(form->w, row, 0);
+	      myINSNSTR(form->w, txt, len);
+	      wmove(form->w, row, len);
+	      myINSNSTR(form->w, &myBLANK, 1);
+	      return E_OK;
+	    }
+	}
+    }
+  return (result);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int Wrapping_Not_Necessary_Or_Wrapping_Ok(
+|                                             FORM * form)
+|
+|   Description   :  If a character has been entered into a field, it may
+|                    be that wrapping has to occur. This routine checks
+|                    whether or not wrapping is required and if so, performs
+|                    the wrapping.
+|
+|   Return Values :  E_OK              - no wrapping required or wrapping
+|                                        was successful
+|                    E_REQUEST_DENIED  -
+|                    E_SYSTEM_ERROR    - some system error
++--------------------------------------------------------------------------*/
+static int
+Wrapping_Not_Necessary_Or_Wrapping_Ok(FORM *form)
+{
+  FIELD *field = form->current;
+  int result = E_REQUEST_DENIED;
+  bool Last_Row = ((field->drows - 1) == form->currow);
+
+  if ((Field_Has_Option(field, O_WRAP)) &&	/* wrapping wanted     */
+      (!Single_Line_Field(field)) &&	/* must be multi-line  */
+      (There_Is_No_Room_For_A_Char_In_Line(form)) &&	/* line is full        */
+      (!Last_Row || Growable(field)))	/* there are more lines */
+    {
+      FIELD_CELL *bp;
+      FIELD_CELL *split;
+      int chars_to_be_wrapped;
+      int chars_to_remain_on_line;
+
+      if (Last_Row)
+	{
+	  /* the above logic already ensures, that in this case the field
+	     is growable */
+	  if (!Field_Grown(field, 1))
+	    return E_SYSTEM_ERROR;
+	}
+      bp = Address_Of_Current_Row_In_Buffer(form);
+      Window_To_Buffer(form, field);
+      split = After_Last_Whitespace_Character(bp, field->dcols);
+      /* split points to the first character of the sequence to be brought
+         on the next line */
+      chars_to_remain_on_line = (int)(split - bp);
+      chars_to_be_wrapped = field->dcols - chars_to_remain_on_line;
+      if (chars_to_remain_on_line > 0)
+	{
+	  if ((result = Insert_String(form, form->currow + 1, split,
+				      chars_to_be_wrapped)) == E_OK)
+	    {
+	      wmove(form->w, form->currow, chars_to_remain_on_line);
+	      wclrtoeol(form->w);
+	      if (form->curcol >= chars_to_remain_on_line)
+		{
+		  form->currow++;
+		  form->curcol -= chars_to_remain_on_line;
+		}
+	      return E_OK;
+	    }
+	}
+      else
+	return E_OK;
+      if (result != E_OK)
+	{
+	  DeleteChar(form);
+	  Window_To_Buffer(form, field);
+	  result = E_REQUEST_DENIED;
+	}
+    }
+  else
+    result = E_OK;		/* wrapping was not necessary */
+  return (result);
+}
+
+/*----------------------------------------------------------------------------
+  Field Editing routines
+  --------------------------------------------------------------------------*/
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int Field_Editing(
+|                                    int (* const fct) (FORM *),
+|                                    FORM * form)
+|
+|   Description   :  Generic routine for field editing requests. The driver
+|                    routines are only called for editable fields, the
+|                    _WINDOW_MODIFIED flag is set if editing occurred.
+|                    This is somewhat special due to the overload semantics
+|                    of the NEW_LINE and DEL_PREV requests.
+|
+|   Return Values :  Error code from low level drivers.
++--------------------------------------------------------------------------*/
+static int
+Field_Editing(int (*const fct) (FORM *), FORM *form)
+{
+  int res = E_REQUEST_DENIED;
+
+  /* We have to deal here with the specific case of the overloaded
+     behavior of New_Line and Delete_Previous requests.
+     They may end up in navigational requests if we are on the first
+     character in a field. But navigation is also allowed on non-
+     editable fields.
+   */
+  if ((fct == FE_Delete_Previous) &&
+      ((unsigned)form->opts & O_BS_OVERLOAD) &&
+      First_Position_In_Current_Field(form))
+    {
+      res = Inter_Field_Navigation(FN_Previous_Field, form);
+    }
+  else
+    {
+      if (fct == FE_New_Line)
+	{
+	  if (((unsigned)form->opts & O_NL_OVERLOAD) &&
+	      First_Position_In_Current_Field(form))
+	    {
+	      res = Inter_Field_Navigation(FN_Next_Field, form);
+	    }
+	  else
+	    /* FE_New_Line deals itself with the _WINDOW_MODIFIED flag */
+	    res = fct(form);
+	}
+      else
+	{
+	  /* From now on, everything must be editable */
+	  if ((unsigned)form->current->opts & O_EDIT)
+	    {
+	      res = fct(form);
+	      if (res == E_OK)
+		SetStatus(form, _WINDOW_MODIFIED);
+	    }
+	}
+    }
+  return res;
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int FE_New_Line(FORM * form)
+|
+|   Description   :  Perform a new line request. This is rather complex
+|                    compared to other routines in this code due to the
+|                    rather difficult to understand description in the
+|                    manuals.
+|
+|   Return Values :  E_OK               - success
+|                    E_REQUEST_DENIED   - new line not allowed
+|                    E_SYSTEM_ERROR     - system error
++--------------------------------------------------------------------------*/
+static int
+FE_New_Line(FORM *form)
+{
+  FIELD *field = form->current;
+  FIELD_CELL *bp, *t;
+  bool Last_Row = ((field->drows - 1) == form->currow);
+
+  T((T_CALLED("FE_New_Line(%p)"), (void *)form));
+  if (form->status & _OVLMODE)
+    {
+      if (Last_Row &&
+	  (!(Growable(field) && !Single_Line_Field(field))))
+	{
+	  if (!((unsigned)form->opts & O_NL_OVERLOAD))
+	    returnCode(E_REQUEST_DENIED);
+	  wmove(form->w, form->currow, form->curcol);
+	  wclrtoeol(form->w);
+	  /* we have to set this here, although it is also
+	     handled in the generic routine. The reason is,
+	     that FN_Next_Field may fail, but the form is
+	     definitively changed */
+	  SetStatus(form, _WINDOW_MODIFIED);
+	  returnCode(Inter_Field_Navigation(FN_Next_Field, form));
+	}
+      else
+	{
+	  if (Last_Row && !Field_Grown(field, 1))
+	    {
+	      /* N.B.: due to the logic in the 'if', LastRow==TRUE
+	         means here that the field is growable and not
+	         a single-line field */
+	      returnCode(E_SYSTEM_ERROR);
+	    }
+	  wmove(form->w, form->currow, form->curcol);
+	  wclrtoeol(form->w);
+	  form->currow++;
+	  form->curcol = 0;
+	  SetStatus(form, _WINDOW_MODIFIED);
+	  returnCode(E_OK);
+	}
+    }
+  else
+    {
+      /* Insert Mode */
+      if (Last_Row &&
+	  !(Growable(field) && !Single_Line_Field(field)))
+	{
+	  if (!((unsigned)form->opts & O_NL_OVERLOAD))
+	    returnCode(E_REQUEST_DENIED);
+	  returnCode(Inter_Field_Navigation(FN_Next_Field, form));
+	}
+      else
+	{
+	  bool May_Do_It = !Last_Row && Is_There_Room_For_A_Line(form);
+
+	  if (!(May_Do_It || Growable(field)))
+	    returnCode(E_REQUEST_DENIED);
+	  if (!May_Do_It && !Field_Grown(field, 1))
+	    returnCode(E_SYSTEM_ERROR);
+
+	  bp = Address_Of_Current_Position_In_Buffer(form);
+	  t = After_End_Of_Data(bp, field->dcols - form->curcol);
+	  wmove(form->w, form->currow, form->curcol);
+	  wclrtoeol(form->w);
+	  form->currow++;
+	  form->curcol = 0;
+	  wmove(form->w, form->currow, form->curcol);
+	  winsertln(form->w);
+	  myADDNSTR(form->w, bp, (int)(t - bp));
+	  SetStatus(form, _WINDOW_MODIFIED);
+	  returnCode(E_OK);
+	}
+    }
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int FE_Insert_Character(FORM * form)
+|
+|   Description   :  Insert blank character at the cursor position
+|
+|   Return Values :  E_OK
+|                    E_REQUEST_DENIED
++--------------------------------------------------------------------------*/
+static int
+FE_Insert_Character(FORM *form)
+{
+  FIELD *field = form->current;
+  int result = E_REQUEST_DENIED;
+
+  T((T_CALLED("FE_Insert_Character(%p)"), (void *)form));
+  if (Check_Char(form, field, field->type, (int)C_BLANK,
+		 (TypeArgument *)(field->arg)))
+    {
+      bool There_Is_Room = Is_There_Room_For_A_Char_In_Line(form);
+
+      if (There_Is_Room ||
+	  ((Single_Line_Field(field) && Growable(field))))
+	{
+	  if (!There_Is_Room && !Field_Grown(field, 1))
+	    result = E_SYSTEM_ERROR;
+	  else
+	    {
+	      winsch(form->w, (chtype)C_BLANK);
+	      result = Wrapping_Not_Necessary_Or_Wrapping_Ok(form);
+	    }
+	}
+    }
+  returnCode(result);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int FE_Insert_Line(FORM * form)
+|
+|   Description   :  Insert a blank line at the cursor position
+|
+|   Return Values :  E_OK               - success
+|                    E_REQUEST_DENIED   - line can not be inserted
++--------------------------------------------------------------------------*/
+static int
+FE_Insert_Line(FORM *form)
+{
+  FIELD *field = form->current;
+  int result = E_REQUEST_DENIED;
+
+  T((T_CALLED("FE_Insert_Line(%p)"), (void *)form));
+  if (Check_Char(form, field,
+		 field->type, (int)C_BLANK, (TypeArgument *)(field->arg)))
+    {
+      bool Maybe_Done = (form->currow != (field->drows - 1)) &&
+      Is_There_Room_For_A_Line(form);
+
+      if (!Single_Line_Field(field) &&
+	  (Maybe_Done || Growable(field)))
+	{
+	  if (!Maybe_Done && !Field_Grown(field, 1))
+	    result = E_SYSTEM_ERROR;
+	  else
+	    {
+	      form->curcol = 0;
+	      winsertln(form->w);
+	      result = E_OK;
+	    }
+	}
+    }
+  returnCode(result);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int FE_Delete_Character(FORM * form)
+|
+|   Description   :  Delete character at the cursor position
+|
+|   Return Values :  E_OK    - success
++--------------------------------------------------------------------------*/
+static int
+FE_Delete_Character(FORM *form)
+{
+  T((T_CALLED("FE_Delete_Character(%p)"), (void *)form));
+  DeleteChar(form);
+  returnCode(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int FE_Delete_Previous(FORM * form)
+|
+|   Description   :  Delete character before cursor. Again this is a rather
+|                    difficult piece compared to others due to the overloading
+|                    semantics of backspace.
+|                    N.B.: The case of overloaded BS on first field position
+|                          is already handled in the generic routine.
+|
+|   Return Values :  E_OK                - success
+|                    E_REQUEST_DENIED    - Character can't be deleted
++--------------------------------------------------------------------------*/
+static int
+FE_Delete_Previous(FORM *form)
+{
+  FIELD *field = form->current;
+
+  T((T_CALLED("FE_Delete_Previous(%p)"), (void *)form));
+  if (First_Position_In_Current_Field(form))
+    returnCode(E_REQUEST_DENIED);
+
+  if ((--(form->curcol)) < 0)
+    {
+      FIELD_CELL *this_line, *prev_line, *prev_end, *this_end;
+      int this_row = form->currow;
+
+      form->curcol++;
+      if (form->status & _OVLMODE)
+	returnCode(E_REQUEST_DENIED);
+
+      prev_line = Address_Of_Row_In_Buffer(field, (form->currow - 1));
+      this_line = Address_Of_Row_In_Buffer(field, (form->currow));
+      Synchronize_Buffer(form);
+      prev_end = After_End_Of_Data(prev_line, field->dcols);
+      this_end = After_End_Of_Data(this_line, field->dcols);
+      if ((int)(this_end - this_line) >
+	  (field->cols - (int)(prev_end - prev_line)))
+	returnCode(E_REQUEST_DENIED);
+      wmove(form->w, form->currow, form->curcol);
+      wdeleteln(form->w);
+      Adjust_Cursor_Position(form, prev_end);
+      /*
+       * If we did not really move to the previous line, help the user a
+       * little.  It is however a little inconsistent.  Normally, when
+       * backspacing around the point where text wraps to a new line in a
+       * multi-line form, we absorb one keystroke for the wrapping point.  That
+       * is consistent with SVr4 forms.  However, SVr4 does not allow typing
+       * into the last column of the field, and requires the user to enter a
+       * newline to move to the next line.  Therefore it can consistently eat
+       * that keystroke.  Since ncurses allows the last column, it wraps
+       * automatically (given the proper options).  But we cannot eat the
+       * keystroke to back over the wrapping point, since that would put the
+       * cursor past the end of the form field.  In this case, just delete the
+       * character at the end of the field.
+       */
+      if (form->currow == this_row && this_row > 0)
+	{
+	  form->currow -= 1;
+	  form->curcol = field->dcols - 1;
+	  DeleteChar(form);
+	}
+      else
+	{
+	  wmove(form->w, form->currow, form->curcol);
+	  myADDNSTR(form->w, this_line, (int)(this_end - this_line));
+	}
+    }
+  else
+    {
+      DeleteChar(form);
+    }
+  returnCode(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int FE_Delete_Line(FORM * form)
+|
+|   Description   :  Delete line at cursor position.
+|
+|   Return Values :  E_OK  - success
++--------------------------------------------------------------------------*/
+static int
+FE_Delete_Line(FORM *form)
+{
+  T((T_CALLED("FE_Delete_Line(%p)"), (void *)form));
+  form->curcol = 0;
+  wdeleteln(form->w);
+  returnCode(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int FE_Delete_Word(FORM * form)
+|
+|   Description   :  Delete word at cursor position
+|
+|   Return Values :  E_OK               - success
+|                    E_REQUEST_DENIED   - failure
++--------------------------------------------------------------------------*/
+static int
+FE_Delete_Word(FORM *form)
+{
+  FIELD *field = form->current;
+  FIELD_CELL *bp = Address_Of_Current_Row_In_Buffer(form);
+  FIELD_CELL *ep = bp + field->dcols;
+  FIELD_CELL *cp = bp + form->curcol;
+  FIELD_CELL *s;
+
+  T((T_CALLED("FE_Delete_Word(%p)"), (void *)form));
+  Synchronize_Buffer(form);
+  if (ISBLANK(*cp))
+    returnCode(E_REQUEST_DENIED);	/* not in word */
+
+  /* move cursor to begin of word and erase to end of screen-line */
+  Adjust_Cursor_Position(form,
+			 After_Last_Whitespace_Character(bp, form->curcol));
+  wmove(form->w, form->currow, form->curcol);
+  wclrtoeol(form->w);
+
+  /* skip over word in buffer */
+  s = Get_First_Whitespace_Character(cp, (int)(ep - cp));
+  /* to begin of next word    */
+  s = Get_Start_Of_Data(s, (int)(ep - s));
+  if ((s != cp) && !ISBLANK(*s))
+    {
+      /* copy remaining line to window */
+      myADDNSTR(form->w, s, (int)(s - After_End_Of_Data(s, (int)(ep - s))));
+    }
+  returnCode(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int FE_Clear_To_End_Of_Line(FORM * form)
+|
+|   Description   :  Clear to end of current line.
+|
+|   Return Values :  E_OK   - success
++--------------------------------------------------------------------------*/
+static int
+FE_Clear_To_End_Of_Line(FORM *form)
+{
+  T((T_CALLED("FE_Clear_To_End_Of_Line(%p)"), (void *)form));
+  wmove(form->w, form->currow, form->curcol);
+  wclrtoeol(form->w);
+  returnCode(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int FE_Clear_To_End_Of_Field(FORM * form)
+|
+|   Description   :  Clear to end of field.
+|
+|   Return Values :  E_OK   - success
++--------------------------------------------------------------------------*/
+static int
+FE_Clear_To_End_Of_Field(FORM *form)
+{
+  T((T_CALLED("FE_Clear_To_End_Of_Field(%p)"), (void *)form));
+  wmove(form->w, form->currow, form->curcol);
+  wclrtobot(form->w);
+  returnCode(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int FE_Clear_Field(FORM * form)
+|
+|   Description   :  Clear entire field.
+|
+|   Return Values :  E_OK   - success
++--------------------------------------------------------------------------*/
+static int
+FE_Clear_Field(FORM *form)
+{
+  T((T_CALLED("FE_Clear_Field(%p)"), (void *)form));
+  form->currow = form->curcol = 0;
+  werase(form->w);
+  returnCode(E_OK);
+}
+/*----------------------------------------------------------------------------
+  END of Field Editing routines
+  --------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+  Edit Mode routines
+  --------------------------------------------------------------------------*/
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int EM_Overlay_Mode(FORM * form)
+|
+|   Description   :  Switch to overlay mode.
+|
+|   Return Values :  E_OK   - success
++--------------------------------------------------------------------------*/
+static int
+EM_Overlay_Mode(FORM *form)
+{
+  T((T_CALLED("EM_Overlay_Mode(%p)"), (void *)form));
+  SetStatus(form, _OVLMODE);
+  returnCode(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int EM_Insert_Mode(FORM * form)
+|
+|   Description   :  Switch to insert mode
+|
+|   Return Values :  E_OK   - success
++--------------------------------------------------------------------------*/
+static int
+EM_Insert_Mode(FORM *form)
+{
+  T((T_CALLED("EM_Insert_Mode(%p)"), (void *)form));
+  ClrStatus(form, _OVLMODE);
+  returnCode(E_OK);
+}
+
+/*----------------------------------------------------------------------------
+  END of Edit Mode routines
+  --------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+  Helper routines for Choice Requests
+  --------------------------------------------------------------------------*/
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static bool Next_Choice(FORM * form,
+|                                            FIELDTYPE * typ,
+|                                            FIELD * field,
+|                                            TypeArgument *argp)
+|
+|   Description   :  Get the next field choice. For linked types this is
+|                    done recursively.
+|
+|   Return Values :  TRUE    - next choice successfully retrieved
+|                    FALSE   - couldn't retrieve next choice
++--------------------------------------------------------------------------*/
+static bool
+Next_Choice(FORM *form, FIELDTYPE *typ, FIELD *field, TypeArgument *argp)
+{
+  if (!typ || !(typ->status & _HAS_CHOICE))
+    return FALSE;
+
+  if (typ->status & _LINKED_TYPE)
+    {
+      assert(argp);
+      return (
+	       Next_Choice(form, typ->left, field, argp->left) ||
+	       Next_Choice(form, typ->right, field, argp->right));
+    }
+  else
+    {
+#if NCURSES_INTEROP_FUNCS
+      assert(typ->enum_next.onext);
+      if (typ->status & _GENERIC)
+	return typ->enum_next.gnext(form, field, (void *)argp);
+      else
+	return typ->enum_next.onext(field, (void *)argp);
+#else
+      assert(typ->next);
+      return typ->next(field, (void *)argp);
+#endif
+    }
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static bool Previous_Choice(FORM * form,
+|                                                FIELDTYPE * typ,
+|                                                FIELD * field,
+|                                                TypeArgument *argp)
+|
+|   Description   :  Get the previous field choice. For linked types this
+|                    is done recursively.
+|
+|   Return Values :  TRUE    - previous choice successfully retrieved
+|                    FALSE   - couldn't retrieve previous choice
++--------------------------------------------------------------------------*/
+static bool
+Previous_Choice(FORM *form, FIELDTYPE *typ, FIELD *field, TypeArgument *argp)
+{
+  if (!typ || !(typ->status & _HAS_CHOICE))
+    return FALSE;
+
+  if (typ->status & _LINKED_TYPE)
+    {
+      assert(argp);
+      return (
+	       Previous_Choice(form, typ->left, field, argp->left) ||
+	       Previous_Choice(form, typ->right, field, argp->right));
+    }
+  else
+    {
+#if NCURSES_INTEROP_FUNCS
+      assert(typ->enum_prev.oprev);
+      if (typ->status & _GENERIC)
+	return typ->enum_prev.gprev(form, field, (void *)argp);
+      else
+	return typ->enum_prev.oprev(field, (void *)argp);
+#else
+      assert(typ->prev);
+      return typ->prev(field, (void *)argp);
+#endif
+    }
+}
+/*----------------------------------------------------------------------------
+  End of Helper routines for Choice Requests
+  --------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+  Routines for Choice Requests
+  --------------------------------------------------------------------------*/
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int CR_Next_Choice(FORM * form)
+|
+|   Description   :  Get the next field choice.
+|
+|   Return Values :  E_OK              - success
+|                    E_REQUEST_DENIED  - next choice couldn't be retrieved
++--------------------------------------------------------------------------*/
+static int
+CR_Next_Choice(FORM *form)
+{
+  FIELD *field = form->current;
+
+  T((T_CALLED("CR_Next_Choice(%p)"), (void *)form));
+  Synchronize_Buffer(form);
+  returnCode((Next_Choice(form, field->type, field, (TypeArgument *)(field->arg)))
+	     ? E_OK
+	     : E_REQUEST_DENIED);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int CR_Previous_Choice(FORM * form)
+|
+|   Description   :  Get the previous field choice.
+|
+|   Return Values :  E_OK              - success
+|                    E_REQUEST_DENIED  - prev. choice couldn't be retrieved
++--------------------------------------------------------------------------*/
+static int
+CR_Previous_Choice(FORM *form)
+{
+  FIELD *field = form->current;
+
+  T((T_CALLED("CR_Previous_Choice(%p)"), (void *)form));
+  Synchronize_Buffer(form);
+  returnCode((Previous_Choice(form, field->type, field, (TypeArgument *)(field->arg)))
+	     ? E_OK
+	     : E_REQUEST_DENIED);
+}
+/*----------------------------------------------------------------------------
+  End of Routines for Choice Requests
+  --------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+  Helper routines for Field Validations.
+  --------------------------------------------------------------------------*/
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static bool Check_Field(FORM* form,
+|                                            FIELDTYPE * typ,
+|                                            FIELD * field,
+|                                            TypeArgument * argp)
+|
+|   Description   :  Check the field according to its fieldtype and its
+|                    actual arguments. For linked fieldtypes this is done
+|                    recursively.
+|
+|   Return Values :  TRUE       - field is valid
+|                    FALSE      - field is invalid.
++--------------------------------------------------------------------------*/
+static bool
+Check_Field(FORM *form, FIELDTYPE *typ, FIELD *field, TypeArgument *argp)
+{
+  if (typ)
+    {
+      if (Field_Has_Option(field, O_NULLOK))
+	{
+	  FIELD_CELL *bp = field->buf;
+
+	  assert(bp);
+	  while (ISBLANK(*bp))
+	    {
+	      bp++;
+	    }
+	  if (CharOf(*bp) == 0)
+	    return TRUE;
+	}
+
+      if (typ->status & _LINKED_TYPE)
+	{
+	  assert(argp);
+	  return (
+		   Check_Field(form, typ->left, field, argp->left) ||
+		   Check_Field(form, typ->right, field, argp->right));
+	}
+      else
+	{
+#if NCURSES_INTEROP_FUNCS
+	  if (typ->fieldcheck.ofcheck)
+	    {
+	      if (typ->status & _GENERIC)
+		return typ->fieldcheck.gfcheck(form, field, (void *)argp);
+	      else
+		return typ->fieldcheck.ofcheck(field, (void *)argp);
+	    }
+#else
+	  if (typ->fcheck)
+	    return typ->fcheck(field, (void *)argp);
+#endif
+	}
+    }
+  return TRUE;
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  bool _nc_Internal_Validation(FORM * form )
+|
+|   Description   :  Validate the current field of the form.
+|
+|   Return Values :  TRUE  - field is valid
+|                    FALSE - field is invalid
++--------------------------------------------------------------------------*/
+FORM_EXPORT(bool)
+_nc_Internal_Validation(FORM *form)
+{
+  FIELD *field;
+
+  field = form->current;
+
+  Synchronize_Buffer(form);
+  if ((form->status & _FCHECK_REQUIRED) ||
+      (!(Field_Has_Option(field, O_PASSOK))))
+    {
+      if (!Check_Field(form, field->type, field, (TypeArgument *)(field->arg)))
+	return FALSE;
+      ClrStatus(form, _FCHECK_REQUIRED);
+      SetStatus(field, _CHANGED);
+      Synchronize_Linked_Fields(field);
+    }
+  return TRUE;
+}
+/*----------------------------------------------------------------------------
+  End of Helper routines for Field Validations.
+  --------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+  Routines for Field Validation.
+  --------------------------------------------------------------------------*/
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int FV_Validation(FORM * form)
+|
+|   Description   :  Validate the current field of the form.
+|
+|   Return Values :  E_OK             - field valid
+|                    E_INVALID_FIELD  - field not valid
++--------------------------------------------------------------------------*/
+static int
+FV_Validation(FORM *form)
+{
+  T((T_CALLED("FV_Validation(%p)"), (void *)form));
+  if (_nc_Internal_Validation(form))
+    returnCode(E_OK);
+  else
+    returnCode(E_INVALID_FIELD);
+}
+/*----------------------------------------------------------------------------
+  End of routines for Field Validation.
+  --------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+  Helper routines for Inter-Field Navigation
+  --------------------------------------------------------------------------*/
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static FIELD *Next_Field_On_Page(FIELD * field)
+|
+|   Description   :  Get the next field after the given field on the current
+|                    page. The order of fields is the one defined by the
+|                    field's array. Only visible and active fields are
+|                    counted.
+|
+|   Return Values :  Pointer to the next field.
++--------------------------------------------------------------------------*/
+NCURSES_INLINE static FIELD *
+Next_Field_On_Page(FIELD *field)
+{
+  FORM *form = field->form;
+  FIELD **field_on_page = &form->field[field->index];
+  FIELD **first_on_page = &form->field[form->page[form->curpage].pmin];
+  FIELD **last_on_page = &form->field[form->page[form->curpage].pmax];
+
+  do
+    {
+      field_on_page =
+	(field_on_page == last_on_page) ? first_on_page : field_on_page + 1;
+      if (Field_Is_Selectable(*field_on_page))
+	break;
+    }
+  while (field != (*field_on_page));
+  return (*field_on_page);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  FIELD* _nc_First_Active_Field(FORM * form)
+|
+|   Description   :  Get the first active field on the current page,
+|                    if there are such. If there are none, get the first
+|                    visible field on the page. If there are also none,
+|                    we return the first field on page and hope the best.
+|
+|   Return Values :  Pointer to calculated field.
++--------------------------------------------------------------------------*/
+FORM_EXPORT(FIELD *)
+_nc_First_Active_Field(FORM *form)
+{
+  FIELD **last_on_page = &form->field[form->page[form->curpage].pmax];
+  FIELD *proposed = Next_Field_On_Page(*last_on_page);
+
+  if (proposed == *last_on_page)
+    {
+      /* there might be the special situation, where there is no
+         active and visible field on the current page. We then select
+         the first visible field on this readonly page
+       */
+      if (Field_Is_Not_Selectable(proposed))
+	{
+	  FIELD **field = &form->field[proposed->index];
+	  FIELD **first = &form->field[form->page[form->curpage].pmin];
+
+	  do
+	    {
+	      field = (field == last_on_page) ? first : field + 1;
+	      if (Field_Has_Option(*field, O_VISIBLE))
+		break;
+	    }
+	  while (proposed != (*field));
+
+	  proposed = *field;
+
+	  if ((proposed == *last_on_page) &&
+	      !((unsigned)proposed->opts & O_VISIBLE))
+	    {
+	      /* This means, there is also no visible field on the page.
+	         So we propose the first one and hope the very best...
+	         Some very clever user has designed a readonly and invisible
+	         page on this form.
+	       */
+	      proposed = *first;
+	    }
+	}
+    }
+  return (proposed);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static FIELD *Previous_Field_On_Page(FIELD * field)
+|
+|   Description   :  Get the previous field before the given field on the
+|                    current page. The order of fields is the one defined by
+|                    the field's array. Only visible and active fields are
+|                    counted.
+|
+|   Return Values :  Pointer to the previous field.
++--------------------------------------------------------------------------*/
+NCURSES_INLINE static FIELD *
+Previous_Field_On_Page(FIELD *field)
+{
+  FORM *form = field->form;
+  FIELD **field_on_page = &form->field[field->index];
+  FIELD **first_on_page = &form->field[form->page[form->curpage].pmin];
+  FIELD **last_on_page = &form->field[form->page[form->curpage].pmax];
+
+  do
+    {
+      field_on_page =
+	(field_on_page == first_on_page) ? last_on_page : field_on_page - 1;
+      if (Field_Is_Selectable(*field_on_page))
+	break;
+    }
+  while (field != (*field_on_page));
+
+  return (*field_on_page);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static FIELD *Sorted_Next_Field(FIELD * field)
+|
+|   Description   :  Get the next field after the given field on the current
+|                    page. The order of fields is the one defined by the
+|                    (row,column) geometry, rows are major.
+|
+|   Return Values :  Pointer to the next field.
++--------------------------------------------------------------------------*/
+NCURSES_INLINE static FIELD *
+Sorted_Next_Field(FIELD *field)
+{
+  FIELD *field_on_page = field;
+
+  do
+    {
+      field_on_page = field_on_page->snext;
+      if (Field_Is_Selectable(field_on_page))
+	break;
+    }
+  while (field_on_page != field);
+
+  return (field_on_page);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static FIELD *Sorted_Previous_Field(FIELD * field)
+|
+|   Description   :  Get the previous field before the given field on the
+|                    current page. The order of fields is the one defined
+|                    by the (row,column) geometry, rows are major.
+|
+|   Return Values :  Pointer to the previous field.
++--------------------------------------------------------------------------*/
+NCURSES_INLINE static FIELD *
+Sorted_Previous_Field(FIELD *field)
+{
+  FIELD *field_on_page = field;
+
+  do
+    {
+      field_on_page = field_on_page->sprev;
+      if (Field_Is_Selectable(field_on_page))
+	break;
+    }
+  while (field_on_page != field);
+
+  return (field_on_page);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static FIELD *Left_Neighbor_Field(FIELD * field)
+|
+|   Description   :  Get the left neighbor of the field on the same line
+|                    and the same page. Cycles through the line.
+|
+|   Return Values :  Pointer to left neighbor field.
++--------------------------------------------------------------------------*/
+NCURSES_INLINE static FIELD *
+Left_Neighbor_Field(FIELD *field)
+{
+  FIELD *field_on_page = field;
+
+  /* For a field that has really a left neighbor, the while clause
+     immediately fails and the loop is left, positioned at the right
+     neighbor. Otherwise we cycle backwards through the sorted field list
+     until we enter the same line (from the right end).
+   */
+  do
+    {
+      field_on_page = Sorted_Previous_Field(field_on_page);
+    }
+  while (field_on_page->frow != field->frow);
+
+  return (field_on_page);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static FIELD *Right_Neighbor_Field(FIELD * field)
+|
+|   Description   :  Get the right neighbor of the field on the same line
+|                    and the same page.
+|
+|   Return Values :  Pointer to right neighbor field.
++--------------------------------------------------------------------------*/
+NCURSES_INLINE static FIELD *
+Right_Neighbor_Field(FIELD *field)
+{
+  FIELD *field_on_page = field;
+
+  /* See the comments on Left_Neighbor_Field to understand how it works */
+  do
+    {
+      field_on_page = Sorted_Next_Field(field_on_page);
+    }
+  while (field_on_page->frow != field->frow);
+
+  return (field_on_page);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static FIELD *Upper_Neighbor_Field(FIELD * field)
+|
+|   Description   :  Because of the row-major nature of sorting the fields,
+|                    it is more difficult to define what the upper neighbor
+|                    field really means. We define that it must be on a
+|                    'previous' line (cyclic order!) and is the rightmost
+|                    field lying on the left side of the given field. If
+|                    this set is empty, we take the first field on the line.
+|
+|   Return Values :  Pointer to the upper neighbor field.
++--------------------------------------------------------------------------*/
+static FIELD *
+Upper_Neighbor_Field(FIELD *field)
+{
+  FIELD *field_on_page = field;
+  int frow = field->frow;
+  int fcol = field->fcol;
+
+  /* Walk back to the 'previous' line. The second term in the while clause
+     just guarantees that we stop if we cycled through the line because
+     there might be no 'previous' line if the page has just one line.
+   */
+  do
+    {
+      field_on_page = Sorted_Previous_Field(field_on_page);
+    }
+  while (field_on_page->frow == frow && field_on_page->fcol != fcol);
+
+  if (field_on_page->frow != frow)
+    {
+      /* We really found a 'previous' line. We are positioned at the
+         rightmost field on this line */
+      frow = field_on_page->frow;
+
+      /* We walk to the left as long as we are really right of the
+         field. */
+      while (field_on_page->frow == frow && field_on_page->fcol > fcol)
+	field_on_page = Sorted_Previous_Field(field_on_page);
+
+      /* If we wrapped, just go to the right which is the first field on
+         the row */
+      if (field_on_page->frow != frow)
+	field_on_page = Sorted_Next_Field(field_on_page);
+    }
+
+  return (field_on_page);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static FIELD *Down_Neighbor_Field(FIELD * field)
+|
+|   Description   :  Because of the row-major nature of sorting the fields,
+|                    it is more difficult to define what the down neighbor
+|                    field really means. We define that it must be on a
+|                    'next' line (cyclic order!) and is the leftmost
+|                    field laying on the right side of the given field. If
+|                    this set is empty, we take the last field on the line.
+|
+|   Return Values :  Pointer to the upper neighbor field.
++--------------------------------------------------------------------------*/
+static FIELD *
+Down_Neighbor_Field(FIELD *field)
+{
+  FIELD *field_on_page = field;
+  int frow = field->frow;
+  int fcol = field->fcol;
+
+  /* Walk forward to the 'next' line. The second term in the while clause
+     just guarantees that we stop if we cycled through the line because
+     there might be no 'next' line if the page has just one line.
+   */
+  do
+    {
+      field_on_page = Sorted_Next_Field(field_on_page);
+    }
+  while (field_on_page->frow == frow && field_on_page->fcol != fcol);
+
+  if (field_on_page->frow != frow)
+    {
+      /* We really found a 'next' line. We are positioned at the rightmost
+         field on this line */
+      frow = field_on_page->frow;
+
+      /* We walk to the right as long as we are really left of the
+         field. */
+      while (field_on_page->frow == frow && field_on_page->fcol < fcol)
+	field_on_page = Sorted_Next_Field(field_on_page);
+
+      /* If we wrapped, just go to the left which is the last field on
+         the row */
+      if (field_on_page->frow != frow)
+	field_on_page = Sorted_Previous_Field(field_on_page);
+    }
+
+  return (field_on_page);
+}
+
+/*----------------------------------------------------------------------------
+  Inter-Field Navigation routines
+  --------------------------------------------------------------------------*/
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int Inter_Field_Navigation(
+|                                           int (* const fct) (FORM *),
+|                                           FORM * form)
+|
+|   Description   :  Generic behavior for changing the current field, the
+|                    field is left and a new field is entered. So the field
+|                    must be validated and the field init/term hooks must
+|                    be called.
+|
+|   Return Values :  E_OK                - success
+|                    E_INVALID_FIELD     - field is invalid
+|                    some other          - error from subordinate call
++--------------------------------------------------------------------------*/
+static int
+Inter_Field_Navigation(int (*const fct) (FORM *), FORM *form)
+{
+  int res;
+
+  if (!_nc_Internal_Validation(form))
+    res = E_INVALID_FIELD;
+  else
+    {
+      Call_Hook(form, fieldterm);
+      res = fct(form);
+      Call_Hook(form, fieldinit);
+    }
+  return res;
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int FN_Next_Field(FORM * form)
+|
+|   Description   :  Move to the next field on the current page of the form
+|
+|   Return Values :  E_OK                 - success
+|                    != E_OK              - error from subordinate call
++--------------------------------------------------------------------------*/
+static int
+FN_Next_Field(FORM *form)
+{
+  T((T_CALLED("FN_Next_Field(%p)"), (void *)form));
+  returnCode(_nc_Set_Current_Field(form,
+				   Next_Field_On_Page(form->current)));
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int FN_Previous_Field(FORM * form)
+|
+|   Description   :  Move to the previous field on the current page of the
+|                    form
+|
+|   Return Values :  E_OK                 - success
+|                    != E_OK              - error from subordinate call
++--------------------------------------------------------------------------*/
+static int
+FN_Previous_Field(FORM *form)
+{
+  T((T_CALLED("FN_Previous_Field(%p)"), (void *)form));
+  returnCode(_nc_Set_Current_Field(form,
+				   Previous_Field_On_Page(form->current)));
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int FN_First_Field(FORM * form)
+|
+|   Description   :  Move to the first field on the current page of the form
+|
+|   Return Values :  E_OK                 - success
+|                    != E_OK              - error from subordinate call
++--------------------------------------------------------------------------*/
+static int
+FN_First_Field(FORM *form)
+{
+  T((T_CALLED("FN_First_Field(%p)"), (void *)form));
+  returnCode(_nc_Set_Current_Field(form,
+				   Next_Field_On_Page(form->field[form->page[form->curpage].pmax])));
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int FN_Last_Field(FORM * form)
+|
+|   Description   :  Move to the last field on the current page of the form
+|
+|   Return Values :  E_OK                 - success
+|                    != E_OK              - error from subordinate call
++--------------------------------------------------------------------------*/
+static int
+FN_Last_Field(FORM *form)
+{
+  T((T_CALLED("FN_Last_Field(%p)"), (void *)form));
+  returnCode(
+	      _nc_Set_Current_Field(form,
+				    Previous_Field_On_Page(form->field[form->page[form->curpage].pmin])));
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int FN_Sorted_Next_Field(FORM * form)
+|
+|   Description   :  Move to the sorted next field on the current page
+|                    of the form.
+|
+|   Return Values :  E_OK            - success
+|                    != E_OK         - error from subordinate call
++--------------------------------------------------------------------------*/
+static int
+FN_Sorted_Next_Field(FORM *form)
+{
+  T((T_CALLED("FN_Sorted_Next_Field(%p)"), (void *)form));
+  returnCode(_nc_Set_Current_Field(form,
+				   Sorted_Next_Field(form->current)));
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int FN_Sorted_Previous_Field(FORM * form)
+|
+|   Description   :  Move to the sorted previous field on the current page
+|                    of the form.
+|
+|   Return Values :  E_OK            - success
+|                    != E_OK         - error from subordinate call
++--------------------------------------------------------------------------*/
+static int
+FN_Sorted_Previous_Field(FORM *form)
+{
+  T((T_CALLED("FN_Sorted_Previous_Field(%p)"), (void *)form));
+  returnCode(_nc_Set_Current_Field(form,
+				   Sorted_Previous_Field(form->current)));
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int FN_Sorted_First_Field(FORM * form)
+|
+|   Description   :  Move to the sorted first field on the current page
+|                    of the form.
+|
+|   Return Values :  E_OK            - success
+|                    != E_OK         - error from subordinate call
++--------------------------------------------------------------------------*/
+static int
+FN_Sorted_First_Field(FORM *form)
+{
+  T((T_CALLED("FN_Sorted_First_Field(%p)"), (void *)form));
+  returnCode(_nc_Set_Current_Field(form,
+				   Sorted_Next_Field(form->field[form->page[form->curpage].smax])));
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int FN_Sorted_Last_Field(FORM * form)
+|
+|   Description   :  Move to the sorted last field on the current page
+|                    of the form.
+|
+|   Return Values :  E_OK            - success
+|                    != E_OK         - error from subordinate call
++--------------------------------------------------------------------------*/
+static int
+FN_Sorted_Last_Field(FORM *form)
+{
+  T((T_CALLED("FN_Sorted_Last_Field(%p)"), (void *)form));
+  returnCode(_nc_Set_Current_Field(form,
+				   Sorted_Previous_Field(form->field[form->page[form->curpage].smin])));
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int FN_Left_Field(FORM * form)
+|
+|   Description   :  Get the field on the left of the current field on the
+|                    same line and the same page. Cycles through the line.
+|
+|   Return Values :  E_OK            - success
+|                    != E_OK         - error from subordinate call
++--------------------------------------------------------------------------*/
+static int
+FN_Left_Field(FORM *form)
+{
+  T((T_CALLED("FN_Left_Field(%p)"), (void *)form));
+  returnCode(_nc_Set_Current_Field(form,
+				   Left_Neighbor_Field(form->current)));
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int FN_Right_Field(FORM * form)
+|
+|   Description   :  Get the field on the right of the current field on the
+|                    same line and the same page. Cycles through the line.
+|
+|   Return Values :  E_OK            - success
+|                    != E_OK         - error from subordinate call
++--------------------------------------------------------------------------*/
+static int
+FN_Right_Field(FORM *form)
+{
+  T((T_CALLED("FN_Right_Field(%p)"), (void *)form));
+  returnCode(_nc_Set_Current_Field(form,
+				   Right_Neighbor_Field(form->current)));
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int FN_Up_Field(FORM * form)
+|
+|   Description   :  Get the upper neighbor of the current field. This
+|                    cycles through the page. See the comments of the
+|                    Upper_Neighbor_Field function to understand how
+|                    'upper' is defined.
+|
+|   Return Values :  E_OK            - success
+|                    != E_OK         - error from subordinate call
++--------------------------------------------------------------------------*/
+static int
+FN_Up_Field(FORM *form)
+{
+  T((T_CALLED("FN_Up_Field(%p)"), (void *)form));
+  returnCode(_nc_Set_Current_Field(form,
+				   Upper_Neighbor_Field(form->current)));
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int FN_Down_Field(FORM * form)
+|
+|   Description   :  Get the down neighbor of the current field. This
+|                    cycles through the page. See the comments of the
+|                    Down_Neighbor_Field function to understand how
+|                    'down' is defined.
+|
+|   Return Values :  E_OK            - success
+|                    != E_OK         - error from subordinate call
++--------------------------------------------------------------------------*/
+static int
+FN_Down_Field(FORM *form)
+{
+  T((T_CALLED("FN_Down_Field(%p)"), (void *)form));
+  returnCode(_nc_Set_Current_Field(form,
+				   Down_Neighbor_Field(form->current)));
+}
+/*----------------------------------------------------------------------------
+  END of Field Navigation routines
+  --------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+  Helper routines for Page Navigation
+  --------------------------------------------------------------------------*/
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int _nc_Set_Form_Page(FORM * form,
+|                                          int page,
+|                                          FIELD * field)
+|
+|   Description   :  Make the given page number the current page and make
+|                    the given field the current field on the page. If
+|                    for the field NULL is given, make the first field on
+|                    the page the current field. The routine acts only
+|                    if the requested page is not the current page.
+|
+|   Return Values :  E_OK                - success
+|                    != E_OK             - error from subordinate call
+|                    E_BAD_ARGUMENT      - invalid field pointer
+|                    E_SYSTEM_ERROR      - some severe basic error
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+_nc_Set_Form_Page(FORM *form, int page, FIELD *field)
+{
+  int res = E_OK;
+
+  if ((form->curpage != page))
+    {
+      FIELD *last_field, *field_on_page;
+
+      werase(Get_Form_Window(form));
+      form->curpage = (short)page;
+      last_field = field_on_page = form->field[form->page[page].smin];
+      do
+	{
+	  if ((unsigned)field_on_page->opts & O_VISIBLE)
+	    if ((res = Display_Field(field_on_page)) != E_OK)
+	      return (res);
+	  field_on_page = field_on_page->snext;
+	}
+      while (field_on_page != last_field);
+
+      if (field)
+	res = _nc_Set_Current_Field(form, field);
+      else
+	/* N.B.: we don't encapsulate this by Inter_Field_Navigation(),
+	   because this is already executed in a page navigation
+	   context that contains field navigation
+	 */
+	res = FN_First_Field(form);
+    }
+  return (res);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int Next_Page_Number(const FORM * form)
+|
+|   Description   :  Calculate the page number following the current page
+|                    number. This cycles if the highest page number is
+|                    reached.
+|
+|   Return Values :  The next page number
++--------------------------------------------------------------------------*/
+NCURSES_INLINE static int
+Next_Page_Number(const FORM *form)
+{
+  return (form->curpage + 1) % form->maxpage;
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int Previous_Page_Number(const FORM * form)
+|
+|   Description   :  Calculate the page number before the current page
+|                    number. This cycles if the first page number is
+|                    reached.
+|
+|   Return Values :  The previous page number
++--------------------------------------------------------------------------*/
+NCURSES_INLINE static int
+Previous_Page_Number(const FORM *form)
+{
+  return (form->curpage != 0 ? form->curpage - 1 : form->maxpage - 1);
+}
+
+/*----------------------------------------------------------------------------
+  Page Navigation routines
+  --------------------------------------------------------------------------*/
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int Page_Navigation(
+|                                               int (* const fct) (FORM *),
+|                                               FORM * form)
+|
+|   Description   :  Generic behavior for changing a page. This means
+|                    that the field is left and a new field is entered.
+|                    So the field must be validated and the field init/term
+|                    hooks must be called. Because also the page is changed,
+|                    the form's init/term hooks must be called also.
+|
+|   Return Values :  E_OK                - success
+|                    E_INVALID_FIELD     - field is invalid
+|                    some other          - error from subordinate call
++--------------------------------------------------------------------------*/
+static int
+Page_Navigation(int (*const fct) (FORM *), FORM *form)
+{
+  int res;
+
+  if (!_nc_Internal_Validation(form))
+    res = E_INVALID_FIELD;
+  else
+    {
+      Call_Hook(form, fieldterm);
+      Call_Hook(form, formterm);
+      res = fct(form);
+      Call_Hook(form, forminit);
+      Call_Hook(form, fieldinit);
+    }
+  return res;
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int PN_Next_Page(FORM * form)
+|
+|   Description   :  Move to the next page of the form
+|
+|   Return Values :  E_OK                - success
+|                    != E_OK             - error from subordinate call
++--------------------------------------------------------------------------*/
+static int
+PN_Next_Page(FORM *form)
+{
+  T((T_CALLED("PN_Next_Page(%p)"), (void *)form));
+  returnCode(_nc_Set_Form_Page(form, Next_Page_Number(form), (FIELD *)0));
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int PN_Previous_Page(FORM * form)
+|
+|   Description   :  Move to the previous page of the form
+|
+|   Return Values :  E_OK              - success
+|                    != E_OK           - error from subordinate call
++--------------------------------------------------------------------------*/
+static int
+PN_Previous_Page(FORM *form)
+{
+  T((T_CALLED("PN_Previous_Page(%p)"), (void *)form));
+  returnCode(_nc_Set_Form_Page(form, Previous_Page_Number(form), (FIELD *)0));
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int PN_First_Page(FORM * form)
+|
+|   Description   :  Move to the first page of the form
+|
+|   Return Values :  E_OK              - success
+|                    != E_OK           - error from subordinate call
++--------------------------------------------------------------------------*/
+static int
+PN_First_Page(FORM *form)
+{
+  T((T_CALLED("PN_First_Page(%p)"), (void *)form));
+  returnCode(_nc_Set_Form_Page(form, 0, (FIELD *)0));
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int PN_Last_Page(FORM * form)
+|
+|   Description   :  Move to the last page of the form
+|
+|   Return Values :  E_OK              - success
+|                    != E_OK           - error from subordinate call
++--------------------------------------------------------------------------*/
+static int
+PN_Last_Page(FORM *form)
+{
+  T((T_CALLED("PN_Last_Page(%p)"), (void *)form));
+  returnCode(_nc_Set_Form_Page(form, form->maxpage - 1, (FIELD *)0));
+}
+
+/*----------------------------------------------------------------------------
+  END of Field Navigation routines
+  --------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+  Helper routines for the core form driver.
+  --------------------------------------------------------------------------*/
+
+# if USE_WIDEC_SUPPORT
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int Data_Entry_w(FORM * form, wchar_t c)
+|
+|   Description   :  Enter the wide character c into at the current
+|                    position of the current field of the form.
+|
+|   Return Values :  E_OK              - success
+|                    E_REQUEST_DENIED  - driver could not process the request
+|                    E_SYSTEM_ERROR    -
++--------------------------------------------------------------------------*/
+static int
+Data_Entry_w(FORM *form, wchar_t c)
+{
+  FIELD *field = form->current;
+  int result = E_REQUEST_DENIED;
+
+  T((T_CALLED("Data_Entry(%p,%s)"), (void *)form, _tracechtype((chtype)c)));
+  if ((Field_Has_Option(field, O_EDIT))
+#if FIX_FORM_INACTIVE_BUG
+      && (Field_Has_Option(field, O_ACTIVE))
+#endif
+    )
+    {
+      wchar_t given[2];
+      cchar_t temp_ch;
+
+      given[0] = c;
+      given[1] = 0;
+      setcchar(&temp_ch, given, 0, 0, (void *)0);
+      if ((Field_Has_Option(field, O_BLANK)) &&
+	  First_Position_In_Current_Field(form) &&
+	  !(form->status & _FCHECK_REQUIRED) &&
+	  !(form->status & _WINDOW_MODIFIED))
+	werase(form->w);
+
+      if (form->status & _OVLMODE)
+	{
+	  wadd_wch(form->w, &temp_ch);
+	}
+      else
+	/* no _OVLMODE */
+	{
+	  bool There_Is_Room = Is_There_Room_For_A_Char_In_Line(form);
+
+	  if (!(There_Is_Room ||
+		((Single_Line_Field(field) && Growable(field)))))
+	    RETURN(E_REQUEST_DENIED);
+
+	  if (!There_Is_Room && !Field_Grown(field, 1))
+	    RETURN(E_SYSTEM_ERROR);
+
+	  wins_wch(form->w, &temp_ch);
+	}
+
+      if ((result = Wrapping_Not_Necessary_Or_Wrapping_Ok(form)) == E_OK)
+	{
+	  bool End_Of_Field = (((field->drows - 1) == form->currow) &&
+			       ((field->dcols - 1) == form->curcol));
+
+	  form->status |= _WINDOW_MODIFIED;
+	  if (End_Of_Field && !Growable(field) && (Field_Has_Option(field, O_AUTOSKIP)))
+	    result = Inter_Field_Navigation(FN_Next_Field, form);
+	  else
+	    {
+	      if (End_Of_Field && Growable(field) && !Field_Grown(field, 1))
+		result = E_SYSTEM_ERROR;
+	      else
+		{
+		  /*
+		   * We have just added a byte to the form field.  It may have
+		   * been part of a multibyte character.  If it was, the
+		   * addch_used field is nonzero and we should not try to move
+		   * to a new column.
+		   */
+		  if (WINDOW_EXT(form->w, addch_used) == 0)
+		    IFN_Next_Character(form);
+
+		  result = E_OK;
+		}
+	    }
+	}
+    }
+  RETURN(result);
+}
+# endif
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int Data_Entry(FORM * form,int c)
+|
+|   Description   :  Enter character c into at the current position of the
+|                    current field of the form.
+|
+|   Return Values :  E_OK              - success
+|                    E_REQUEST_DENIED  - driver could not process the request
+|                    E_SYSTEM_ERROR    -
++--------------------------------------------------------------------------*/
+static int
+Data_Entry(FORM *form, int c)
+{
+  FIELD *field = form->current;
+  int result = E_REQUEST_DENIED;
+
+  T((T_CALLED("Data_Entry(%p,%s)"), (void *)form, _tracechtype((chtype)c)));
+  if ((Field_Has_Option(field, O_EDIT))
+#if FIX_FORM_INACTIVE_BUG
+      && (Field_Has_Option(field, O_ACTIVE))
+#endif
+    )
+    {
+      if ((Field_Has_Option(field, O_BLANK)) &&
+	  First_Position_In_Current_Field(form) &&
+	  !(form->status & _FCHECK_REQUIRED) &&
+	  !(form->status & _WINDOW_MODIFIED))
+	werase(form->w);
+
+      if (form->status & _OVLMODE)
+	{
+	  waddch(form->w, (chtype)c);
+	}
+      else
+	/* no _OVLMODE */
+	{
+	  bool There_Is_Room = Is_There_Room_For_A_Char_In_Line(form);
+
+	  if (!(There_Is_Room ||
+		((Single_Line_Field(field) && Growable(field)))))
+	    RETURN(E_REQUEST_DENIED);
+
+	  if (!There_Is_Room && !Field_Grown(field, 1))
+	    RETURN(E_SYSTEM_ERROR);
+
+	  winsch(form->w, (chtype)c);
+	}
+
+      if ((result = Wrapping_Not_Necessary_Or_Wrapping_Ok(form)) == E_OK)
+	{
+	  bool End_Of_Field = (((field->drows - 1) == form->currow) &&
+			       ((field->dcols - 1) == form->curcol));
+
+	  if (Field_Has_Option(field, O_EDGE_INSERT_STAY))
+	    move_after_insert = !!(form->curcol
+				   - form->begincol
+				   - field->cols
+				   + 1);
+
+	  SetStatus(form, _WINDOW_MODIFIED);
+	  if (End_Of_Field && !Growable(field) && (Field_Has_Option(field, O_AUTOSKIP)))
+	    result = Inter_Field_Navigation(FN_Next_Field, form);
+	  else
+	    {
+	      if (End_Of_Field && Growable(field) && !Field_Grown(field, 1))
+		result = E_SYSTEM_ERROR;
+	      else
+		{
+#if USE_WIDEC_SUPPORT
+		  /*
+		   * We have just added a byte to the form field.  It may have
+		   * been part of a multibyte character.  If it was, the
+		   * addch_used field is nonzero and we should not try to move
+		   * to a new column.
+		   */
+		  if (WINDOW_EXT(form->w, addch_used) == 0)
+		    IFN_Next_Character(form);
+#else
+		  IFN_Next_Character(form);
+#endif
+		  result = E_OK;
+		}
+	    }
+	}
+    }
+  RETURN(result);
+}
+
+/* Structure to describe the binding of a request code to a function.
+   The member keycode codes the request value as well as the generic
+   routine to use for the request. The code for the generic routine
+   is coded in the upper 16 Bits while the request code is coded in
+   the lower 16 bits.
+
+   In terms of C++ you might think of a request as a class with a
+   virtual method "perform". The different types of request are
+   derived from this base class and overload (or not) the base class
+   implementation of perform.
+*/
+typedef struct
+{
+  int keycode;			/* must be at least 32 bit: hi:mode, lo: key */
+  int (*cmd) (FORM *);		/* low level driver routine for this key     */
+}
+Binding_Info;
+
+/* You may see this is the class-id of the request type class */
+#define ID_PN    (0x00000000)	/* Page navigation           */
+#define ID_FN    (0x00010000)	/* Inter-Field navigation    */
+#define ID_IFN   (0x00020000)	/* Intra-Field navigation    */
+#define ID_VSC   (0x00030000)	/* Vertical Scrolling        */
+#define ID_HSC   (0x00040000)	/* Horizontal Scrolling      */
+#define ID_FE    (0x00050000)	/* Field Editing             */
+#define ID_EM    (0x00060000)	/* Edit Mode                 */
+#define ID_FV    (0x00070000)	/* Field Validation          */
+#define ID_CH    (0x00080000)	/* Choice                    */
+#define ID_Mask  (0xffff0000)
+#define Key_Mask (0x0000ffff)
+#define ID_Shft  (16)
+
+/* This array holds all the Binding Infos */
+/* *INDENT-OFF* */
+static const Binding_Info bindings[MAX_FORM_COMMAND - MIN_FORM_COMMAND + 1] =
+{
+  { REQ_NEXT_PAGE    |ID_PN  ,PN_Next_Page},
+  { REQ_PREV_PAGE    |ID_PN  ,PN_Previous_Page},
+  { REQ_FIRST_PAGE   |ID_PN  ,PN_First_Page},
+  { REQ_LAST_PAGE    |ID_PN  ,PN_Last_Page},
+
+  { REQ_NEXT_FIELD   |ID_FN  ,FN_Next_Field},
+  { REQ_PREV_FIELD   |ID_FN  ,FN_Previous_Field},
+  { REQ_FIRST_FIELD  |ID_FN  ,FN_First_Field},
+  { REQ_LAST_FIELD   |ID_FN  ,FN_Last_Field},
+  { REQ_SNEXT_FIELD  |ID_FN  ,FN_Sorted_Next_Field},
+  { REQ_SPREV_FIELD  |ID_FN  ,FN_Sorted_Previous_Field},
+  { REQ_SFIRST_FIELD |ID_FN  ,FN_Sorted_First_Field},
+  { REQ_SLAST_FIELD  |ID_FN  ,FN_Sorted_Last_Field},
+  { REQ_LEFT_FIELD   |ID_FN  ,FN_Left_Field},
+  { REQ_RIGHT_FIELD  |ID_FN  ,FN_Right_Field},
+  { REQ_UP_FIELD     |ID_FN  ,FN_Up_Field},
+  { REQ_DOWN_FIELD   |ID_FN  ,FN_Down_Field},
+
+  { REQ_NEXT_CHAR    |ID_IFN ,IFN_Next_Character},
+  { REQ_PREV_CHAR    |ID_IFN ,IFN_Previous_Character},
+  { REQ_NEXT_LINE    |ID_IFN ,IFN_Next_Line},
+  { REQ_PREV_LINE    |ID_IFN ,IFN_Previous_Line},
+  { REQ_NEXT_WORD    |ID_IFN ,IFN_Next_Word},
+  { REQ_PREV_WORD    |ID_IFN ,IFN_Previous_Word},
+  { REQ_BEG_FIELD    |ID_IFN ,IFN_Beginning_Of_Field},
+  { REQ_END_FIELD    |ID_IFN ,IFN_End_Of_Field},
+  { REQ_BEG_LINE     |ID_IFN ,IFN_Beginning_Of_Line},
+  { REQ_END_LINE     |ID_IFN ,IFN_End_Of_Line},
+  { REQ_LEFT_CHAR    |ID_IFN ,IFN_Left_Character},
+  { REQ_RIGHT_CHAR   |ID_IFN ,IFN_Right_Character},
+  { REQ_UP_CHAR      |ID_IFN ,IFN_Up_Character},
+  { REQ_DOWN_CHAR    |ID_IFN ,IFN_Down_Character},
+
+  { REQ_NEW_LINE     |ID_FE  ,FE_New_Line},
+  { REQ_INS_CHAR     |ID_FE  ,FE_Insert_Character},
+  { REQ_INS_LINE     |ID_FE  ,FE_Insert_Line},
+  { REQ_DEL_CHAR     |ID_FE  ,FE_Delete_Character},
+  { REQ_DEL_PREV     |ID_FE  ,FE_Delete_Previous},
+  { REQ_DEL_LINE     |ID_FE  ,FE_Delete_Line},
+  { REQ_DEL_WORD     |ID_FE  ,FE_Delete_Word},
+  { REQ_CLR_EOL      |ID_FE  ,FE_Clear_To_End_Of_Line},
+  { REQ_CLR_EOF      |ID_FE  ,FE_Clear_To_End_Of_Field},
+  { REQ_CLR_FIELD    |ID_FE  ,FE_Clear_Field},
+
+  { REQ_OVL_MODE     |ID_EM  ,EM_Overlay_Mode},
+  { REQ_INS_MODE     |ID_EM  ,EM_Insert_Mode},
+
+  { REQ_SCR_FLINE    |ID_VSC ,VSC_Scroll_Line_Forward},
+  { REQ_SCR_BLINE    |ID_VSC ,VSC_Scroll_Line_Backward},
+  { REQ_SCR_FPAGE    |ID_VSC ,VSC_Scroll_Page_Forward},
+  { REQ_SCR_BPAGE    |ID_VSC ,VSC_Scroll_Page_Backward},
+  { REQ_SCR_FHPAGE   |ID_VSC ,VSC_Scroll_Half_Page_Forward},
+  { REQ_SCR_BHPAGE   |ID_VSC ,VSC_Scroll_Half_Page_Backward},
+
+  { REQ_SCR_FCHAR    |ID_HSC ,HSC_Scroll_Char_Forward},
+  { REQ_SCR_BCHAR    |ID_HSC ,HSC_Scroll_Char_Backward},
+  { REQ_SCR_HFLINE   |ID_HSC ,HSC_Horizontal_Line_Forward},
+  { REQ_SCR_HBLINE   |ID_HSC ,HSC_Horizontal_Line_Backward},
+  { REQ_SCR_HFHALF   |ID_HSC ,HSC_Horizontal_Half_Line_Forward},
+  { REQ_SCR_HBHALF   |ID_HSC ,HSC_Horizontal_Half_Line_Backward},
+
+  { REQ_VALIDATION   |ID_FV  ,FV_Validation},
+
+  { REQ_NEXT_CHOICE  |ID_CH  ,CR_Next_Choice},
+  { REQ_PREV_CHOICE  |ID_CH  ,CR_Previous_Choice}
+};
+/* *INDENT-ON* */
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int form_driver(FORM * form,int  c)
+|
+|   Description   :  This is the workhorse of the forms system. It checks
+|                    to determine whether the character c is a request or
+|                    data. If it is a request, the form driver executes
+|                    the request and returns the result. If it is data
+|                    (printable character), it enters the data into the
+|                    current position in the current field. If it is not
+|                    recognized, the form driver assumes it is an application
+|                    defined command and returns E_UNKNOWN_COMMAND.
+|                    Application defined command should be defined relative
+|                    to MAX_FORM_COMMAND, the maximum value of a request.
+|
+|   Return Values :  E_OK              - success
+|                    E_SYSTEM_ERROR    - system error
+|                    E_BAD_ARGUMENT    - an argument is incorrect
+|                    E_NOT_POSTED      - form is not posted
+|                    E_INVALID_FIELD   - field contents are invalid
+|                    E_BAD_STATE       - called from inside a hook routine
+|                    E_REQUEST_DENIED  - request failed
+|                    E_NOT_CONNECTED   - no fields are connected to the form
+|                    E_UNKNOWN_COMMAND - command not known
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+form_driver(FORM *form, int c)
+{
+  const Binding_Info *BI = (Binding_Info *)0;
+  int res = E_UNKNOWN_COMMAND;
+
+  move_after_insert = TRUE;
+
+  T((T_CALLED("form_driver(%p,%d)"), (void *)form, c));
+
+  if (!form)
+    RETURN(E_BAD_ARGUMENT);
+
+  if (!(form->field) || !(form->current))
+    RETURN(E_NOT_CONNECTED);
+
+  assert(form->page);
+
+  if (c == FIRST_ACTIVE_MAGIC)
+    {
+      form->current = _nc_First_Active_Field(form);
+      RETURN(E_OK);
+    }
+
+  assert(form->current &&
+	 form->current->buf &&
+	 (form->current->form == form)
+    );
+
+  if (form->status & _IN_DRIVER)
+    RETURN(E_BAD_STATE);
+
+  if (!(form->status & _POSTED))
+    RETURN(E_NOT_POSTED);
+
+  if ((c >= MIN_FORM_COMMAND && c <= MAX_FORM_COMMAND) &&
+      ((bindings[c - MIN_FORM_COMMAND].keycode & Key_Mask) == c))
+    {
+      TR(TRACE_CALLS, ("form_request %s", form_request_name(c)));
+      BI = &(bindings[c - MIN_FORM_COMMAND]);
+    }
+
+  if (BI)
+    {
+      typedef int (*Generic_Method) (int (*const) (FORM *), FORM *);
+      static const Generic_Method Generic_Methods[] =
+      {
+	Page_Navigation,	/* overloaded to call field&form hooks */
+	Inter_Field_Navigation,	/* overloaded to call field hooks      */
+	NULL,			/* Intra-Field is generic              */
+	Vertical_Scrolling,	/* Overloaded to check multi-line      */
+	Horizontal_Scrolling,	/* Overloaded to check single-line     */
+	Field_Editing,		/* Overloaded to mark modification     */
+	NULL,			/* Edit Mode is generic                */
+	NULL,			/* Field Validation is generic         */
+	NULL			/* Choice Request is generic           */
+      };
+      size_t nMethods = (sizeof(Generic_Methods) / sizeof(Generic_Methods[0]));
+      size_t method = (size_t)((BI->keycode >> ID_Shft) & 0xffff);	/* see ID_Mask */
+
+      if ((method >= nMethods) || !(BI->cmd))
+	res = E_SYSTEM_ERROR;
+      else
+	{
+	  Generic_Method fct = Generic_Methods[method];
+
+	  if (fct)
+	    {
+	      res = fct(BI->cmd, form);
+	    }
+	  else
+	    {
+	      res = (BI->cmd) (form);
+	    }
+	}
+    }
+#ifdef NCURSES_MOUSE_VERSION
+  else if (KEY_MOUSE == c)
+    {
+      MEVENT event;
+      WINDOW *win = form->win ? form->win : StdScreen(Get_Form_Screen(form));
+      WINDOW *sub = form->sub ? form->sub : win;
+
+      getmouse(&event);
+      if ((event.bstate & (BUTTON1_CLICKED |
+			   BUTTON1_DOUBLE_CLICKED |
+			   BUTTON1_TRIPLE_CLICKED))
+	  && wenclose(win, event.y, event.x))
+	{			/* we react only if the click was in the userwin, that means
+				 * inside the form display area or at the decoration window.
+				 */
+	  int ry = event.y, rx = event.x;	/* screen coordinates */
+
+	  res = E_REQUEST_DENIED;
+	  if (mouse_trafo(&ry, &rx, FALSE))
+	    {			/* rx, ry are now "curses" coordinates */
+	      if (ry < sub->_begy)
+		{		/* we clicked above the display region; this is
+				 * interpreted as "scroll up" request
+				 */
+		  if (event.bstate & BUTTON1_CLICKED)
+		    res = form_driver(form, REQ_PREV_FIELD);
+		  else if (event.bstate & BUTTON1_DOUBLE_CLICKED)
+		    res = form_driver(form, REQ_PREV_PAGE);
+		  else if (event.bstate & BUTTON1_TRIPLE_CLICKED)
+		    res = form_driver(form, REQ_FIRST_FIELD);
+		}
+	      else if (ry > sub->_begy + sub->_maxy)
+		{		/* we clicked below the display region; this is
+				 * interpreted as "scroll down" request
+				 */
+		  if (event.bstate & BUTTON1_CLICKED)
+		    res = form_driver(form, REQ_NEXT_FIELD);
+		  else if (event.bstate & BUTTON1_DOUBLE_CLICKED)
+		    res = form_driver(form, REQ_NEXT_PAGE);
+		  else if (event.bstate & BUTTON1_TRIPLE_CLICKED)
+		    res = form_driver(form, REQ_LAST_FIELD);
+		}
+	      else if (wenclose(sub, event.y, event.x))
+		{		/* Inside the area we try to find the hit item */
+		  ry = event.y;
+		  rx = event.x;
+		  if (wmouse_trafo(sub, &ry, &rx, FALSE))
+		    {
+		      int min_field = form->page[form->curpage].pmin;
+		      int max_field = form->page[form->curpage].pmax;
+		      int i;
+
+		      for (i = min_field; i <= max_field; ++i)
+			{
+			  FIELD *field = form->field[i];
+
+			  if (Field_Is_Selectable(field)
+			      && Field_encloses(field, ry, rx) == E_OK)
+			    {
+			      res = _nc_Set_Current_Field(form, field);
+			      if (res == E_OK)
+				res = _nc_Position_Form_Cursor(form);
+			      if (res == E_OK
+				  && (event.bstate & BUTTON1_DOUBLE_CLICKED))
+				res = E_UNKNOWN_COMMAND;
+			      break;
+			    }
+			}
+		    }
+		}
+	    }
+	}
+      else
+	res = E_REQUEST_DENIED;
+    }
+#endif /* NCURSES_MOUSE_VERSION */
+  else if (!(c & (~(int)MAX_REGULAR_CHARACTER)))
+    {
+      /*
+       * If we're using 8-bit characters, iscntrl+isprint cover the whole set.
+       * But with multibyte characters, there is a third possibility, i.e.,
+       * parts of characters that build up into printable characters which are
+       * not considered printable.
+       *
+       * FIXME: the wide-character branch should also use Check_Char().
+       */
+#if USE_WIDEC_SUPPORT
+      if (!iscntrl(UChar(c)))
+#else
+      if (isprint(UChar(c)) &&
+	  Check_Char(form, form->current, form->current->type, c,
+		     (TypeArgument *)(form->current->arg)))
+#endif
+	res = Data_Entry(form, c);
+    }
+  _nc_Refresh_Current_Field(form);
+  RETURN(res);
+}
+
+# if USE_WIDEC_SUPPORT
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int form_driver_w(FORM * form,int type,wchar_t  c)
+|
+|   Description   :  This is the workhorse of the forms system.
+|
+|                    Input is either a key code (request) or a wide char
+|                    returned by e.g. get_wch (). The type must be passed
+|                    as well,so that we are able to determine whether the char
+|                    is a multibyte char or a request.
+
+|                    If it is a request, the form driver executes
+|                    the request and returns the result. If it is data
+|                    (printable character), it enters the data into the
+|                    current position in the current field. If it is not
+|                    recognized, the form driver assumes it is an application
+|                    defined command and returns E_UNKNOWN_COMMAND.
+|                    Application defined command should be defined relative
+|                    to MAX_FORM_COMMAND, the maximum value of a request.
+|
+|   Return Values :  E_OK              - success
+|                    E_SYSTEM_ERROR    - system error
+|                    E_BAD_ARGUMENT    - an argument is incorrect
+|                    E_NOT_POSTED      - form is not posted
+|                    E_INVALID_FIELD   - field contents are invalid
+|                    E_BAD_STATE       - called from inside a hook routine
+|                    E_REQUEST_DENIED  - request failed
+|                    E_NOT_CONNECTED   - no fields are connected to the form
+|                    E_UNKNOWN_COMMAND - command not known
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+form_driver_w(FORM *form, int type, wchar_t c)
+{
+  const Binding_Info *BI = (Binding_Info *)0;
+  int res = E_UNKNOWN_COMMAND;
+
+  T((T_CALLED("form_driver(%p,%d)"), (void *)form, (int)c));
+
+  if (!form)
+    RETURN(E_BAD_ARGUMENT);
+
+  if (!(form->field))
+    RETURN(E_NOT_CONNECTED);
+
+  assert(form->page);
+
+  if (c == (wchar_t)FIRST_ACTIVE_MAGIC)
+    {
+      form->current = _nc_First_Active_Field(form);
+      RETURN(E_OK);
+    }
+
+  assert(form->current &&
+	 form->current->buf &&
+	 (form->current->form == form)
+    );
+
+  if (form->status & _IN_DRIVER)
+    RETURN(E_BAD_STATE);
+
+  if (!(form->status & _POSTED))
+    RETURN(E_NOT_POSTED);
+
+  /* check if this is a keycode or a (wide) char */
+  if (type == KEY_CODE_YES)
+    {
+      if ((c >= MIN_FORM_COMMAND && c <= MAX_FORM_COMMAND) &&
+	  ((bindings[c - MIN_FORM_COMMAND].keycode & Key_Mask) == c))
+	BI = &(bindings[c - MIN_FORM_COMMAND]);
+    }
+
+  if (BI)
+    {
+      typedef int (*Generic_Method) (int (*const) (FORM *), FORM *);
+      static const Generic_Method Generic_Methods[] =
+      {
+	Page_Navigation,	/* overloaded to call field&form hooks */
+	Inter_Field_Navigation,	/* overloaded to call field hooks      */
+	NULL,			/* Intra-Field is generic              */
+	Vertical_Scrolling,	/* Overloaded to check multi-line      */
+	Horizontal_Scrolling,	/* Overloaded to check single-line     */
+	Field_Editing,		/* Overloaded to mark modification     */
+	NULL,			/* Edit Mode is generic                */
+	NULL,			/* Field Validation is generic         */
+	NULL			/* Choice Request is generic           */
+      };
+      size_t nMethods = (sizeof(Generic_Methods) / sizeof(Generic_Methods[0]));
+      size_t method = (size_t)(BI->keycode >> ID_Shft) & 0xffff;	/* see ID_Mask */
+
+      if ((method >= nMethods) || !(BI->cmd))
+	res = E_SYSTEM_ERROR;
+      else
+	{
+	  Generic_Method fct = Generic_Methods[method];
+
+	  if (fct)
+	    res = fct(BI->cmd, form);
+	  else
+	    res = (BI->cmd) (form);
+	}
+    }
+#ifdef NCURSES_MOUSE_VERSION
+  else if (KEY_MOUSE == c)
+    {
+      MEVENT event;
+      WINDOW *win = form->win ? form->win : StdScreen(Get_Form_Screen(form));
+      WINDOW *sub = form->sub ? form->sub : win;
+
+      getmouse(&event);
+      if ((event.bstate & (BUTTON1_CLICKED |
+			   BUTTON1_DOUBLE_CLICKED |
+			   BUTTON1_TRIPLE_CLICKED))
+	  && wenclose(win, event.y, event.x))
+	{			/* we react only if the click was in the userwin, that means
+				   * inside the form display area or at the decoration window.
+				 */
+	  int ry = event.y, rx = event.x;	/* screen coordinates */
+
+	  res = E_REQUEST_DENIED;
+	  if (mouse_trafo(&ry, &rx, FALSE))
+	    {			/* rx, ry are now "curses" coordinates */
+	      if (ry < sub->_begy)
+		{		/* we clicked above the display region; this is
+				   * interpreted as "scroll up" request
+				 */
+		  if (event.bstate & BUTTON1_CLICKED)
+		    res = form_driver(form, REQ_PREV_FIELD);
+		  else if (event.bstate & BUTTON1_DOUBLE_CLICKED)
+		    res = form_driver(form, REQ_PREV_PAGE);
+		  else if (event.bstate & BUTTON1_TRIPLE_CLICKED)
+		    res = form_driver(form, REQ_FIRST_FIELD);
+		}
+	      else if (ry > sub->_begy + sub->_maxy)
+		{		/* we clicked below the display region; this is
+				   * interpreted as "scroll down" request
+				 */
+		  if (event.bstate & BUTTON1_CLICKED)
+		    res = form_driver(form, REQ_NEXT_FIELD);
+		  else if (event.bstate & BUTTON1_DOUBLE_CLICKED)
+		    res = form_driver(form, REQ_NEXT_PAGE);
+		  else if (event.bstate & BUTTON1_TRIPLE_CLICKED)
+		    res = form_driver(form, REQ_LAST_FIELD);
+		}
+	      else if (wenclose(sub, event.y, event.x))
+		{		/* Inside the area we try to find the hit item */
+		  ry = event.y;
+		  rx = event.x;
+		  if (wmouse_trafo(sub, &ry, &rx, FALSE))
+		    {
+		      int min_field = form->page[form->curpage].pmin;
+		      int max_field = form->page[form->curpage].pmax;
+		      int i;
+
+		      for (i = min_field; i <= max_field; ++i)
+			{
+			  FIELD *field = form->field[i];
+
+			  if (Field_Is_Selectable(field)
+			      && Field_encloses(field, ry, rx) == E_OK)
+			    {
+			      res = _nc_Set_Current_Field(form, field);
+			      if (res == E_OK)
+				res = _nc_Position_Form_Cursor(form);
+			      if (res == E_OK
+				  && (event.bstate & BUTTON1_DOUBLE_CLICKED))
+				res = E_UNKNOWN_COMMAND;
+			      break;
+			    }
+			}
+		    }
+		}
+	    }
+	}
+      else
+	res = E_REQUEST_DENIED;
+    }
+#endif /* NCURSES_MOUSE_VERSION */
+  else if (type == OK)
+    {
+      res = Data_Entry_w(form, c);
+    }
+
+  _nc_Refresh_Current_Field(form);
+  RETURN(res);
+}
+# endif	/* USE_WIDEC_SUPPORT */
+
+/*----------------------------------------------------------------------------
+  Field-Buffer manipulation routines.
+  The effects of setting a buffer are tightly coupled to the core of the form
+  driver logic. This is especially true in the case of growable fields.
+  So I don't separate this into a separate module.
+  --------------------------------------------------------------------------*/
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int set_field_buffer(FIELD *field,
+|                                         int buffer, char *value)
+|
+|   Description   :  Set the given buffer of the field to the given value.
+|                    Buffer 0 stores the displayed content of the field.
+|                    For dynamic fields this may grow the fieldbuffers if
+|                    the length of the value exceeds the current buffer
+|                    length. For buffer 0 only printable values are allowed.
+|                    For static fields, the value must not be zero terminated.
+|                    It is copied up to the length of the buffer.
+|
+|   Return Values :  E_OK            - success
+|                    E_BAD_ARGUMENT  - invalid argument
+|                    E_SYSTEM_ERROR  - system error
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+set_field_buffer(FIELD *field, int buffer, const char *value)
+{
+  FIELD_CELL *p;
+  int res = E_OK;
+  int i;
+  int len;
+
+#if USE_WIDEC_SUPPORT
+  FIELD_CELL *widevalue = 0;
+#endif
+
+  T((T_CALLED("set_field_buffer(%p,%d,%s)"), (void *)field, buffer, _nc_visbuf(value)));
+
+  if (!field || !value || ((buffer < 0) || (buffer > field->nbuf)))
+    RETURN(E_BAD_ARGUMENT);
+
+  len = Buffer_Length(field);
+
+  if (Growable(field))
+    {
+      /* for a growable field we must assume zero terminated strings, because
+         somehow we have to detect the length of what should be copied.
+       */
+      int vlen = (int)strlen(value);
+
+      if (vlen > len)
+	{
+	  if (!Field_Grown(field,
+			   (int)(1 + (vlen - len) / ((field->rows + field->nrow)
+						     * field->cols))))
+	    RETURN(E_SYSTEM_ERROR);
+
+#if !USE_WIDEC_SUPPORT
+	  len = vlen;
+#endif
+	}
+    }
+
+  p = Address_Of_Nth_Buffer(field, buffer);
+
+#if USE_WIDEC_SUPPORT
+  /*
+   * Use addstr's logic for converting a string to an array of cchar_t's.
+   * There should be a better way, but this handles nonspacing characters
+   * and other special cases that we really do not want to handle here.
+   */
+#if NCURSES_EXT_FUNCS
+  if (wresize(field->working, 1, Buffer_Length(field) + 1) == ERR)
+#endif
+    {
+      delwin(field->working);
+      field->working = newpad(1, Buffer_Length(field) + 1);
+    }
+  len = Buffer_Length(field);
+  wclear(field->working);
+  (void)mvwaddstr(field->working, 0, 0, value);
+
+  if ((widevalue = typeCalloc(FIELD_CELL, len + 1)) == 0)
+    {
+      RETURN(E_SYSTEM_ERROR);
+    }
+  else
+    {
+      for (i = 0; i < field->drows; ++i)
+	{
+	  (void)mvwin_wchnstr(field->working, 0, (int)i * field->dcols,
+			      widevalue + ((int)i * field->dcols),
+			      field->dcols);
+	}
+      for (i = 0; i < len; ++i)
+	{
+	  if (CharEq(myZEROS, widevalue[i]))
+	    {
+	      while (i < len)
+		p[i++] = myBLANK;
+	      break;
+	    }
+	  p[i] = widevalue[i];
+	}
+      free(widevalue);
+    }
+#else
+  for (i = 0; i < len; ++i)
+    {
+      if (value[i] == '\0')
+	{
+	  while (i < len)
+	    p[i++] = myBLANK;
+	  break;
+	}
+      p[i] = value[i];
+    }
+#endif
+
+  if (buffer == 0)
+    {
+      int syncres;
+
+      if (((syncres = Synchronize_Field(field)) != E_OK) &&
+	  (res == E_OK))
+	res = syncres;
+      if (((syncres = Synchronize_Linked_Fields(field)) != E_OK) &&
+	  (res == E_OK))
+	res = syncres;
+    }
+  RETURN(res);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  char *field_buffer(const FIELD *field,int buffer)
+|
+|   Description   :  Return the address of the buffer for the field.
+|
+|   Return Values :  Pointer to buffer or NULL if arguments were invalid.
++--------------------------------------------------------------------------*/
+FORM_EXPORT(char *)
+field_buffer(const FIELD *field, int buffer)
+{
+  char *result = 0;
+
+  T((T_CALLED("field_buffer(%p,%d)"), (const void *)field, buffer));
+
+  if (field && (buffer >= 0) && (buffer <= field->nbuf))
+    {
+#if USE_WIDEC_SUPPORT
+      FIELD_CELL *data = Address_Of_Nth_Buffer(field, buffer);
+      size_t need = 0;
+      int size = Buffer_Length(field);
+      int n;
+
+      /* determine the number of bytes needed to store the expanded string */
+      for (n = 0; n < size; ++n)
+	{
+	  if (!isWidecExt(data[n]) && data[n].chars[0] != L'\0')
+	    {
+	      mbstate_t state;
+	      size_t next;
+
+	      init_mb(state);
+	      next = _nc_wcrtomb(0, data[n].chars[0], &state);
+	      if (next > 0)
+		need += next;
+	    }
+	}
+
+      /* allocate a place to store the expanded string */
+      if (field->expanded[buffer] != 0)
+	free(field->expanded[buffer]);
+      field->expanded[buffer] = typeMalloc(char, need + 1);
+
+      /*
+       * Expand the multibyte data.
+       *
+       * It may also be multi-column data.  In that case, the data for a row
+       * may be null-padded to align to the dcols/drows layout (or it may
+       * contain embedded wide-character extensions).  Change the null-padding
+       * to blanks as needed.
+       */
+      if ((result = field->expanded[buffer]) != 0)
+	{
+	  wclear(field->working);
+	  wmove(field->working, 0, 0);
+	  for (n = 0; n < size; ++n)
+	    {
+	      if (!isWidecExt(data[n]) && data[n].chars[0] != L'\0')
+		wadd_wch(field->working, &data[n]);
+	    }
+	  wmove(field->working, 0, 0);
+	  winnstr(field->working, result, (int)need);
+	}
+#else
+      result = Address_Of_Nth_Buffer(field, buffer);
+#endif
+    }
+  returnPtr(result);
+}
+
+#if USE_WIDEC_SUPPORT
+
+/*---------------------------------------------------------------------------
+| Convert a multibyte string to a wide-character string.  The result must be
+| freed by the caller.
++--------------------------------------------------------------------------*/
+FORM_EXPORT(wchar_t *)
+_nc_Widen_String(char *source, int *lengthp)
+{
+  wchar_t *result = 0;
+  wchar_t wch;
+  size_t given = strlen(source);
+  size_t tries;
+  int pass;
+  int status;
+
+#ifndef state_unused
+  mbstate_t state;
+#endif
+
+  for (pass = 0; pass < 2; ++pass)
+    {
+      unsigned need = 0;
+      size_t passed = 0;
+
+      while (passed < given)
+	{
+	  bool found = FALSE;
+
+	  for (tries = 1, status = 0; tries <= (given - passed); ++tries)
+	    {
+	      int save = source[passed + tries];
+
+	      source[passed + tries] = 0;
+	      reset_mbytes(state);
+	      status = check_mbytes(wch, source + passed, tries, state);
+	      source[passed + tries] = (char)save;
+
+	      if (status > 0)
+		{
+		  found = TRUE;
+		  break;
+		}
+	    }
+	  if (found)
+	    {
+	      if (pass)
+		{
+		  result[need] = wch;
+		}
+	      passed += (size_t)status;
+	      ++need;
+	    }
+	  else
+	    {
+	      if (pass)
+		{
+		  result[need] = (wchar_t)source[passed];
+		}
+	      ++need;
+	      ++passed;
+	    }
+	}
+
+      if (!pass)
+	{
+	  if (!need)
+	    break;
+	  result = typeCalloc(wchar_t, need);
+
+	  *lengthp = (int)need;
+	  if (result == 0)
+	    break;
+	}
+    }
+
+  return result;
+}
+#endif
+
+/* frm_driver.c ends here */
diff --git a/form/frm_hook.c b/form/frm_hook.c
new file mode 100644
index 0000000..39d4d22
--- /dev/null
+++ b/form/frm_hook.c
@@ -0,0 +1,144 @@
+/****************************************************************************
+ * Copyright 2018,2020 Thomas E. Dickey                                     *
+ * Copyright 1998-2012,2016 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: frm_hook.c,v 1.20 2020/05/24 01:40:20 anonymous.maarten Exp $")
+
+/* "Template" macro to generate function to set application specific hook */
+#define GEN_HOOK_SET_FUNCTION( typ, name ) \
+FORM_IMPEXP int NCURSES_API set_ ## typ ## _ ## name (FORM *form, Form_Hook func)\
+{\
+   TR_FUNC_BFR(1); \
+   T((T_CALLED("set_" #typ"_"#name"(%p,%s)"), (void *) form, TR_FUNC_ARG(0, func)));\
+   (Normalize_Form( form ) -> typ ## name) = func ;\
+   RETURN(E_OK);\
+}
+
+/* "Template" macro to generate function to get application specific hook */
+#define GEN_HOOK_GET_FUNCTION( typ, name ) \
+FORM_IMPEXP Form_Hook NCURSES_API typ ## _ ## name ( const FORM *form )\
+{\
+   T((T_CALLED(#typ "_" #name "(%p)"), (const void *) form));\
+   returnFormHook( Normalize_Form( form ) -> typ ## name );\
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int set_field_init(FORM *form, Form_Hook f)
+|
+|   Description   :  Assigns an application defined initialization function
+|                    to be called when the form is posted and just after
+|                    the current field changes.
+|
+|   Return Values :  E_OK      - success
++--------------------------------------------------------------------------*/
+GEN_HOOK_SET_FUNCTION(field, init)
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  Form_Hook field_init(const FORM *form)
+|
+|   Description   :  Retrieve field initialization routine address.
+|
+|   Return Values :  The address or NULL if no hook defined.
++--------------------------------------------------------------------------*/
+GEN_HOOK_GET_FUNCTION(field, init)
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int set_field_term(FORM *form, Form_Hook f)
+|
+|   Description   :  Assigns an application defined finalization function
+|                    to be called when the form is unposted and just before
+|                    the current field changes.
+|
+|   Return Values :  E_OK      - success
++--------------------------------------------------------------------------*/
+GEN_HOOK_SET_FUNCTION(field, term)
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  Form_Hook field_term(const FORM *form)
+|
+|   Description   :  Retrieve field finalization routine address.
+|
+|   Return Values :  The address or NULL if no hook defined.
++--------------------------------------------------------------------------*/
+GEN_HOOK_GET_FUNCTION(field, term)
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int set_form_init(FORM *form, Form_Hook f)
+|
+|   Description   :  Assigns an application defined initialization function
+|                    to be called when the form is posted and just after
+|                    a page change.
+|
+|   Return Values :  E_OK       - success
++--------------------------------------------------------------------------*/
+GEN_HOOK_SET_FUNCTION(form, init)
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  Form_Hook form_init(const FORM *form)
+|
+|   Description   :  Retrieve form initialization routine address.
+|
+|   Return Values :  The address or NULL if no hook defined.
++--------------------------------------------------------------------------*/
+GEN_HOOK_GET_FUNCTION(form, init)
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int set_form_term(FORM *form, Form_Hook f)
+|
+|   Description   :  Assigns an application defined finalization function
+|                    to be called when the form is unposted and just before
+|                    a page change.
+|
+|   Return Values :  E_OK       - success
++--------------------------------------------------------------------------*/
+GEN_HOOK_SET_FUNCTION(form, term)
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  Form_Hook form_term(const FORM *form)
+|
+|   Description   :  Retrieve form finalization routine address.
+|
+|   Return Values :  The address or NULL if no hook defined.
++--------------------------------------------------------------------------*/
+GEN_HOOK_GET_FUNCTION(form, term)
+
+/* frm_hook.c ends here */
diff --git a/form/frm_opts.c b/form/frm_opts.c
new file mode 100644
index 0000000..62e2beb
--- /dev/null
+++ b/form/frm_opts.c
@@ -0,0 +1,128 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2012,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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: frm_opts.c,v 1.21 2021/06/17 21:20:30 tom Exp $")
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int set_form_opts(FORM *form, Form_Options opts)
+|
+|   Description   :  Turns on the named options and turns off all the
+|                    remaining options for that form.
+|
+|   Return Values :  E_OK              - success
+|                    E_BAD_ARGUMENT    - invalid options
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+set_form_opts(FORM *form, Form_Options opts)
+{
+  T((T_CALLED("set_form_opts(%p,%d)"), (void *)form, opts));
+
+  opts &= (Form_Options)ALL_FORM_OPTS;
+  if ((unsigned)opts & ~ALL_FORM_OPTS)
+    RETURN(E_BAD_ARGUMENT);
+  else
+    {
+      Normalize_Form(form)->opts = opts;
+      RETURN(E_OK);
+    }
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  Form_Options form_opts(const FORM *)
+|
+|   Description   :  Retrieves the current form options.
+|
+|   Return Values :  The option flags.
++--------------------------------------------------------------------------*/
+FORM_EXPORT(Form_Options)
+form_opts(const FORM *form)
+{
+  T((T_CALLED("form_opts(%p)"), (const void *)form));
+  returnCode((Form_Options)((unsigned)Normalize_Form(form)->opts & ALL_FORM_OPTS));
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int form_opts_on(FORM *form, Form_Options opts)
+|
+|   Description   :  Turns on the named options; no other options are
+|                    changed.
+|
+|   Return Values :  E_OK            - success
+|                    E_BAD_ARGUMENT  - invalid options
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+form_opts_on(FORM *form, Form_Options opts)
+{
+  T((T_CALLED("form_opts_on(%p,%d)"), (void *)form, opts));
+
+  opts &= (Form_Options)ALL_FORM_OPTS;
+  if ((unsigned)opts & ~ALL_FORM_OPTS)
+    RETURN(E_BAD_ARGUMENT);
+  else
+    {
+      Normalize_Form(form)->opts |= opts;
+      RETURN(E_OK);
+    }
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int form_opts_off(FORM *form, Form_Options opts)
+|
+|   Description   :  Turns off the named options; no other options are
+|                    changed.
+|
+|   Return Values :  E_OK            - success
+|                    E_BAD_ARGUMENT  - invalid options
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+form_opts_off(FORM *form, Form_Options opts)
+{
+  T((T_CALLED("form_opts_off(%p,%d)"), (void *)form, opts));
+
+  opts &= (Form_Options)ALL_FORM_OPTS;
+  if ((unsigned)opts & ~ALL_FORM_OPTS)
+    RETURN(E_BAD_ARGUMENT);
+  else
+    {
+      Normalize_Form(form)->opts &= ~opts;
+      RETURN(E_OK);
+    }
+}
+
+/* frm_opts.c ends here */
diff --git a/form/frm_page.c b/form/frm_page.c
new file mode 100644
index 0000000..ee8dd38
--- /dev/null
+++ b/form/frm_page.c
@@ -0,0 +1,107 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2010,2012 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: frm_page.c,v 1.15 2021/06/17 21:20:30 tom Exp $")
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int set_form_page(FORM * form,int  page)
+|
+|   Description   :  Set the page number of the form.
+|
+|   Return Values :  E_OK              - success
+|                    E_BAD_ARGUMENT    - invalid form pointer or page number
+|                    E_BAD_STATE       - called from a hook routine
+|                    E_INVALID_FIELD   - current field can't be left
+|                    E_SYSTEM_ERROR    - system error
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+set_form_page(FORM *form, int page)
+{
+  int err = E_OK;
+
+  T((T_CALLED("set_form_page(%p,%d)"), (void *)form, page));
+
+  if (!form || (page < 0) || (page >= form->maxpage))
+    RETURN(E_BAD_ARGUMENT);
+
+  if (!(form->status & _POSTED))
+    {
+      form->curpage = (short)page;
+      form->current = _nc_First_Active_Field(form);
+    }
+  else
+    {
+      if (form->status & _IN_DRIVER)
+	err = E_BAD_STATE;
+      else
+	{
+	  if (form->curpage != page)
+	    {
+	      if (!_nc_Internal_Validation(form))
+		err = E_INVALID_FIELD;
+	      else
+		{
+		  Call_Hook(form, fieldterm);
+		  Call_Hook(form, formterm);
+		  err = _nc_Set_Form_Page(form, page, (FIELD *)0);
+		  Call_Hook(form, forminit);
+		  Call_Hook(form, fieldinit);
+		  _nc_Refresh_Current_Field(form);
+		}
+	    }
+	}
+    }
+  RETURN(err);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int form_page(const FORM * form)
+|
+|   Description   :  Return the current page of the form.
+|
+|   Return Values :  >= 0  : current page number
+|                    -1    : invalid form pointer
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+form_page(const FORM *form)
+{
+  T((T_CALLED("form_page(%p)"), (const void *)form));
+
+  returnCode(Normalize_Form(form)->curpage);
+}
+
+/* frm_page.c ends here */
diff --git a/form/frm_post.c b/form/frm_post.c
new file mode 100644
index 0000000..ab88089
--- /dev/null
+++ b/form/frm_post.c
@@ -0,0 +1,125 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2010,2012 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: frm_post.c,v 1.14 2020/05/24 01:40:20 anonymous.maarten Exp $")
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int post_form(FORM * form)
+|
+|   Description   :  Writes the form into its associated subwindow.
+|
+|   Return Values :  E_OK              - success
+|                    E_BAD_ARGUMENT    - invalid form pointer
+|                    E_POSTED          - form already posted
+|                    E_NOT_CONNECTED   - no fields connected to form
+|                    E_NO_ROOM         - form doesn't fit into subwindow
+|                    E_SYSTEM_ERROR    - system error
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+post_form(FORM *form)
+{
+  WINDOW *formwin;
+  int err;
+  int page;
+
+  T((T_CALLED("post_form(%p)"), (void *)form));
+
+  if (!form)
+    RETURN(E_BAD_ARGUMENT);
+
+  if (form->status & _POSTED)
+    RETURN(E_POSTED);
+
+  if (!(form->field))
+    RETURN(E_NOT_CONNECTED);
+
+  formwin = Get_Form_Window(form);
+  if ((form->cols > getmaxx(formwin)) || (form->rows > getmaxy(formwin)))
+    RETURN(E_NO_ROOM);
+
+  /* reset form->curpage to an invalid value. This forces Set_Form_Page
+     to do the page initialization which is required by post_form.
+   */
+  page = form->curpage;
+  form->curpage = -1;
+  if ((err = _nc_Set_Form_Page(form, page, form->current)) != E_OK)
+    RETURN(err);
+
+  SetStatus(form, _POSTED);
+
+  Call_Hook(form, forminit);
+  Call_Hook(form, fieldinit);
+
+  _nc_Refresh_Current_Field(form);
+  RETURN(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int unpost_form(FORM * form)
+|
+|   Description   :  Erase form from its associated subwindow.
+|
+|   Return Values :  E_OK            - success
+|                    E_BAD_ARGUMENT  - invalid form pointer
+|                    E_NOT_POSTED    - form isn't posted
+|                    E_BAD_STATE     - called from a hook routine
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+unpost_form(FORM *form)
+{
+  T((T_CALLED("unpost_form(%p)"), (void *)form));
+
+  if (!form)
+    RETURN(E_BAD_ARGUMENT);
+
+  if (!(form->status & _POSTED))
+    RETURN(E_NOT_POSTED);
+
+  if (form->status & _IN_DRIVER)
+    RETURN(E_BAD_STATE);
+
+  Call_Hook(form, fieldterm);
+  Call_Hook(form, formterm);
+
+  werase(Get_Form_Window(form));
+  delwin(form->w);
+  form->w = (WINDOW *)0;
+  ClrStatus(form, _POSTED);
+  RETURN(E_OK);
+}
+
+/* frm_post.c ends here */
diff --git a/form/frm_req_name.c b/form/frm_req_name.c
new file mode 100644
index 0000000..8b76a8e
--- /dev/null
+++ b/form/frm_req_name.c
@@ -0,0 +1,179 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2012,2015 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+/***************************************************************************
+* Module form_request_name                                                 *
+* Routines to handle external names of menu requests                       *
+***************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: frm_req_name.c,v 1.23 2021/06/17 21:11:08 tom Exp $")
+
+#define DATA(s) { s }
+
+static const char request_names[MAX_FORM_COMMAND - MIN_FORM_COMMAND + 1][13] =
+{
+  DATA("NEXT_PAGE"),
+  DATA("PREV_PAGE"),
+  DATA("FIRST_PAGE"),
+  DATA("LAST_PAGE"),
+
+  DATA("NEXT_FIELD"),
+  DATA("PREV_FIELD"),
+  DATA("FIRST_FIELD"),
+  DATA("LAST_FIELD"),
+  DATA("SNEXT_FIELD"),
+  DATA("SPREV_FIELD"),
+  DATA("SFIRST_FIELD"),
+  DATA("SLAST_FIELD"),
+  DATA("LEFT_FIELD"),
+  DATA("RIGHT_FIELD"),
+  DATA("UP_FIELD"),
+  DATA("DOWN_FIELD"),
+
+  DATA("NEXT_CHAR"),
+  DATA("PREV_CHAR"),
+  DATA("NEXT_LINE"),
+  DATA("PREV_LINE"),
+  DATA("NEXT_WORD"),
+  DATA("PREV_WORD"),
+  DATA("BEG_FIELD"),
+  DATA("END_FIELD"),
+  DATA("BEG_LINE"),
+  DATA("END_LINE"),
+  DATA("LEFT_CHAR"),
+  DATA("RIGHT_CHAR"),
+  DATA("UP_CHAR"),
+  DATA("DOWN_CHAR"),
+
+  DATA("NEW_LINE"),
+  DATA("INS_CHAR"),
+  DATA("INS_LINE"),
+  DATA("DEL_CHAR"),
+  DATA("DEL_PREV"),
+  DATA("DEL_LINE"),
+  DATA("DEL_WORD"),
+  DATA("CLR_EOL"),
+  DATA("CLR_EOF"),
+  DATA("CLR_FIELD"),
+  DATA("OVL_MODE"),
+  DATA("INS_MODE"),
+  DATA("SCR_FLINE"),
+  DATA("SCR_BLINE"),
+  DATA("SCR_FPAGE"),
+  DATA("SCR_BPAGE"),
+  DATA("SCR_FHPAGE"),
+  DATA("SCR_BHPAGE"),
+  DATA("SCR_FCHAR"),
+  DATA("SCR_BCHAR"),
+  DATA("SCR_HFLINE"),
+  DATA("SCR_HBLINE"),
+  DATA("SCR_HFHALF"),
+  DATA("SCR_HBHALF"),
+
+  DATA("VALIDATION"),
+  DATA("NEXT_CHOICE"),
+  DATA("PREV_CHOICE")
+};
+
+#undef DATA
+
+#define A_SIZE (sizeof(request_names)/sizeof(request_names[0]))
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  const char * form_request_name (int request);
+|
+|   Description   :  Get the external name of a form request.
+|
+|   Return Values :  Pointer to name      - on success
+|                    NULL                 - on invalid request code
++--------------------------------------------------------------------------*/
+FORM_EXPORT(const char *)
+form_request_name(int request)
+{
+  T((T_CALLED("form_request_name(%d)"), request));
+
+  if ((request < MIN_FORM_COMMAND) || (request > MAX_FORM_COMMAND))
+    {
+      SET_ERROR(E_BAD_ARGUMENT);
+      returnCPtr((const char *)0);
+    }
+  else
+    returnCPtr(request_names[request - MIN_FORM_COMMAND]);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int form_request_by_name (const char *str);
+|
+|   Description   :  Search for a request with this name.
+|
+|   Return Values :  Request Id       - on success
+|                    E_NO_MATCH       - request not found
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+form_request_by_name(const char *str)
+{
+  /* because the table is so small, it doesn't really hurt
+     to run sequentially through it.
+   */
+  size_t i = 0;
+
+  T((T_CALLED("form_request_by_name(%s)"), _nc_visbuf(str)));
+
+  if (str != 0 && (i = strlen(str)) != 0)
+    {
+      char buf[16];		/* longest name is 10 chars */
+
+      if (i > sizeof(buf) - 2)
+	i = sizeof(buf) - 2;
+      memcpy(buf, str, i);
+      buf[i] = '\0';
+
+      for (i = 0; buf[i] != '\0'; ++i)
+	{
+	  buf[i] = (char)toupper(UChar(buf[i]));
+	}
+
+      for (i = 0; i < A_SIZE; i++)
+	{
+	  if (strcmp(request_names[i], buf) == 0)
+	    returnCode(MIN_FORM_COMMAND + (int)i);
+	}
+    }
+  RETURN(E_NO_MATCH);
+}
+
+/* frm_req_name.c ends here */
diff --git a/form/frm_scale.c b/form/frm_scale.c
new file mode 100644
index 0000000..d53798e
--- /dev/null
+++ b/form/frm_scale.c
@@ -0,0 +1,70 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2004,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: frm_scale.c,v 1.13 2021/06/17 21:20:30 tom Exp $")
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int scale_form( const FORM *form, int *rows, int *cols )
+|
+|   Description   :  Retrieve size of form
+|
+|   Return Values :  E_OK              - no error
+|                    E_BAD_ARGUMENT    - invalid form pointer
+|                    E_NOT_CONNECTED   - no fields connected to form
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+scale_form(const FORM *form, int *rows, int *cols)
+{
+  T((T_CALLED("scale_form(%p,%p,%p)"),
+     (const void *)form,
+     (void *)rows,
+     (void *)cols));
+
+  if (!form)
+    RETURN(E_BAD_ARGUMENT);
+
+  if (!(form->field))
+    RETURN(E_NOT_CONNECTED);
+
+  if (rows)
+    *rows = form->rows;
+  if (cols)
+    *cols = form->cols;
+
+  RETURN(E_OK);
+}
+
+/* frm_scale.c ends here */
diff --git a/form/frm_sub.c b/form/frm_sub.c
new file mode 100644
index 0000000..8f1de09
--- /dev/null
+++ b/form/frm_sub.c
@@ -0,0 +1,87 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2009,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995-1997,2009                               *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: frm_sub.c,v 1.15 2021/06/17 21:20:30 tom Exp $")
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int set_form_sub(FORM *form, WINDOW *win)
+|
+|   Description   :  Set the subwindow of the form to win.
+|
+|   Return Values :  E_OK       - success
+|                    E_POSTED   - form is posted
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+set_form_sub(FORM *form, WINDOW *win)
+{
+  T((T_CALLED("set_form_sub(%p,%p)"), (void *)form, (void *)win));
+
+  if (form && (form->status & _POSTED))
+    RETURN(E_POSTED);
+  else
+    {
+#if NCURSES_SP_FUNCS
+      FORM *f = Normalize_Form(form);
+
+      f->sub = win ? win : StdScreen(Get_Form_Screen(f));
+      RETURN(E_OK);
+#else
+      Normalize_Form(form)->sub = win;
+      RETURN(E_OK);
+#endif
+    }
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  WINDOW *form_sub(const FORM *)
+|
+|   Description   :  Retrieve the window of the form.
+|
+|   Return Values :  The pointer to the Subwindow.
++--------------------------------------------------------------------------*/
+FORM_EXPORT(WINDOW *)
+form_sub(const FORM *form)
+{
+  const FORM *f;
+
+  T((T_CALLED("form_sub(%p)"), (const void *)form));
+
+  f = Normalize_Form(form);
+  returnWin(Get_Form_Window(f));
+}
+
+/* frm_sub.c ends here */
diff --git a/form/frm_user.c b/form/frm_user.c
new file mode 100644
index 0000000..a4a2249
--- /dev/null
+++ b/form/frm_user.c
@@ -0,0 +1,73 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2004,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: frm_user.c,v 1.19 2021/06/17 21:20:30 tom Exp $")
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int set_form_userptr(FORM *form, void *usrptr)
+|
+|   Description   :  Set the pointer that is reserved in any form to store
+|                    application relevant information.
+|
+|   Return Values :  E_OK         - on success
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+set_form_userptr(FORM *form, void *usrptr)
+{
+  T((T_CALLED("set_form_userptr(%p,%p)"), (void *)form, (void *)usrptr));
+
+  Normalize_Form(form)->usrptr = usrptr;
+  RETURN(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  void *form_userptr(const FORM *form)
+|
+|   Description   :  Return the pointer that is reserved in any form to
+|                    store application relevant information.
+|
+|   Return Values :  Value of pointer. If no such pointer has been set,
+|                    NULL is returned
++--------------------------------------------------------------------------*/
+FORM_EXPORT(void *)
+form_userptr(const FORM *form)
+{
+  T((T_CALLED("form_userptr(%p)"), (const void *)form));
+  returnVoidPtr(Normalize_Form(form)->usrptr);
+}
+
+/* frm_user.c ends here */
diff --git a/form/frm_win.c b/form/frm_win.c
new file mode 100644
index 0000000..eeea27d
--- /dev/null
+++ b/form/frm_win.c
@@ -0,0 +1,93 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2009,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: frm_win.c,v 1.19 2021/06/17 21:20:30 tom Exp $")
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int set_form_win(FORM *form,WINDOW *win)
+|
+|   Description   :  Set the window of the form to win.
+|
+|   Return Values :  E_OK       - success
+|                    E_POSTED   - form is posted
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+set_form_win(FORM *form, WINDOW *win)
+{
+  T((T_CALLED("set_form_win(%p,%p)"), (void *)form, (void *)win));
+
+  if (form && (form->status & _POSTED))
+    RETURN(E_POSTED);
+  else
+    {
+#if NCURSES_SP_FUNCS
+      FORM *f = Normalize_Form(form);
+
+      f->win = win ? win : StdScreen(Get_Form_Screen(f));
+      RETURN(E_OK);
+#else
+      Normalize_Form(form)->win = win;
+      RETURN(E_OK);
+#endif
+    }
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  WINDOW *form_win(const FORM *)
+|
+|   Description   :  Retrieve the window of the form.
+|
+|   Return Values :  The pointer to the Window or stdscr if there is none.
++--------------------------------------------------------------------------*/
+FORM_EXPORT(WINDOW *)
+form_win(const FORM *form)
+{
+  WINDOW *result;
+  const FORM *f;
+
+  T((T_CALLED("form_win(%p)"), (const void *)form));
+
+  f = Normalize_Form(form);
+#if NCURSES_SP_FUNCS
+  result = (f->win ? f->win : StdScreen(Get_Form_Screen(f)));
+#else
+  result = (f->win ? f->win : stdscr);
+#endif
+  returnWin(result);
+}
+
+/* frm_win.c ends here */
diff --git a/form/fty_alnum.c b/form/fty_alnum.c
new file mode 100644
index 0000000..854dc33
--- /dev/null
+++ b/form/fty_alnum.c
@@ -0,0 +1,203 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2009,2010 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.                                                           *
+ ****************************************************************************/
+
+/***************************************************************************
+*                                                                          *
+*  Author : Juergen Pfeifer                                                *
+*                                                                          *
+***************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fty_alnum.c,v 1.29 2020/12/12 01:15:37 tom Exp $")
+
+#define thisARG alnumARG
+
+typedef struct
+  {
+    int width;
+  }
+thisARG;
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static void *Generic_This_Type(void *arg)
+|
+|   Description   :  Allocate structure for alphanumeric type argument.
+|
+|   Return Values :  Pointer to argument structure or NULL on error
++--------------------------------------------------------------------------*/
+static void *
+Generic_This_Type(void *arg)
+{
+  thisARG *argp = (thisARG *)0;
+
+  if (arg)
+    {
+      argp = typeMalloc(thisARG, 1);
+
+      if (argp)
+	{
+	  T((T_CREATE("thisARG %p"), (void *)argp));
+	  argp->width = *((int *)arg);
+	}
+    }
+  return ((void *)argp);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static void *Make_This_Type(va_list *ap)
+|
+|   Description   :  Allocate structure for alphanumeric type argument.
+|
+|   Return Values :  Pointer to argument structure or NULL on error
++--------------------------------------------------------------------------*/
+static void *
+Make_This_Type(va_list *ap)
+{
+  int w = va_arg(*ap, int);
+
+  return Generic_This_Type((void *)&w);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static void *Copy_ThisType(const void *argp)
+|
+|   Description   :  Copy structure for alphanumeric type argument.
+|
+|   Return Values :  Pointer to argument structure or NULL on error.
++--------------------------------------------------------------------------*/
+static void *
+Copy_This_Type(const void *argp)
+{
+  const thisARG *ap = (const thisARG *)argp;
+  thisARG *result = typeMalloc(thisARG, 1);
+
+  if (result)
+    {
+      T((T_CREATE("thisARG %p"), (void *)result));
+      *result = *ap;
+    }
+
+  return ((void *)result);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static void Free_This_Type(void *argp)
+|
+|   Description   :  Free structure for alphanumeric type argument.
+|
+|   Return Values :  -
++--------------------------------------------------------------------------*/
+static void
+Free_This_Type(void *argp)
+{
+  if (argp)
+    free(argp);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static bool Check_This_Character(
+|                                      int c,
+|                                      const void *argp)
+|
+|   Description   :  Check a character for the alphanumeric type.
+|
+|   Return Values :  TRUE  - character is valid
+|                    FALSE - character is invalid
++--------------------------------------------------------------------------*/
+static bool
+Check_This_Character(int c, const void *argp GCC_UNUSED)
+{
+#if USE_WIDEC_SUPPORT
+  if (iswalnum((wint_t)c))
+    return TRUE;
+#endif
+  return (isalnum(UChar(c)) ? TRUE : FALSE);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static bool Check_This_Field(
+|                                      FIELD *field,
+|                                      const void *argp)
+|
+|   Description   :  Validate buffer content to be a valid alphanumeric value
+|
+|   Return Values :  TRUE  - field is valid
+|                    FALSE - field is invalid
++--------------------------------------------------------------------------*/
+static bool
+Check_This_Field(FIELD *field, const void *argp)
+{
+  int width = ((const thisARG *)argp)->width;
+  unsigned char *bp = (unsigned char *)field_buffer(field, 0);
+  bool result = (width < 0);
+
+  Check_CTYPE_Field(result, bp, width, Check_This_Character);
+  return (result);
+}
+
+static FIELDTYPE typeTHIS =
+{
+  _HAS_ARGS | _RESIDENT,
+  1,				/* this is mutable, so we can't be const */
+  (FIELDTYPE *)0,
+  (FIELDTYPE *)0,
+  Make_This_Type,
+  Copy_This_Type,
+  Free_This_Type,
+  INIT_FT_FUNC(Check_This_Field),
+  INIT_FT_FUNC(Check_This_Character),
+  INIT_FT_FUNC(NULL),
+  INIT_FT_FUNC(NULL),
+#if NCURSES_INTEROP_FUNCS
+  Generic_This_Type
+#endif
+};
+
+FORM_EXPORT_VAR(FIELDTYPE *) TYPE_ALNUM = &typeTHIS;
+
+#if NCURSES_INTEROP_FUNCS
+/* The next routines are to simplify the use of ncurses from
+   programming languages with restrictions on interop with C level
+   constructs (e.g. variable access or va_list + ellipsis constructs)
+*/
+FORM_EXPORT(FIELDTYPE *)
+_nc_TYPE_ALNUM(void)
+{
+  return TYPE_ALNUM;
+}
+#endif
+
+/* fty_alnum.c ends here */
diff --git a/form/fty_alpha.c b/form/fty_alpha.c
new file mode 100644
index 0000000..a37459a
--- /dev/null
+++ b/form/fty_alpha.c
@@ -0,0 +1,203 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2009,2010 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.                                                           *
+ ****************************************************************************/
+
+/***************************************************************************
+*                                                                          *
+*  Author : Juergen Pfeifer                                                *
+*                                                                          *
+***************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fty_alpha.c,v 1.31 2020/12/12 01:15:37 tom Exp $")
+
+#define thisARG alphaARG
+
+typedef struct
+  {
+    int width;
+  }
+thisARG;
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static void *Generic_This_Type(va_list *ap)
+|
+|   Description   :  Allocate structure for alpha type argument.
+|
+|   Return Values :  Pointer to argument structure or NULL on error
++--------------------------------------------------------------------------*/
+static void *
+Generic_This_Type(void *arg)
+{
+  thisARG *argp = (thisARG *)0;
+
+  if (arg)
+    {
+      argp = typeMalloc(thisARG, 1);
+
+      if (argp)
+	{
+	  T((T_CREATE("thisARG %p"), (void *)argp));
+	  argp->width = *((int *)arg);
+	}
+    }
+  return ((void *)argp);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static void *Make_This_Type(va_list *ap)
+|
+|   Description   :  Allocate structure for alpha type argument.
+|
+|   Return Values :  Pointer to argument structure or NULL on error
++--------------------------------------------------------------------------*/
+static void *
+Make_This_Type(va_list *ap)
+{
+  int w = va_arg(*ap, int);
+
+  return Generic_This_Type((void *)&w);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static void *Copy_This_Type(const void * argp)
+|
+|   Description   :  Copy structure for alpha type argument.
+|
+|   Return Values :  Pointer to argument structure or NULL on error.
++--------------------------------------------------------------------------*/
+static void *
+Copy_This_Type(const void *argp)
+{
+  const thisARG *ap = (const thisARG *)argp;
+  thisARG *result = typeMalloc(thisARG, 1);
+
+  if (result)
+    {
+      T((T_CREATE("thisARG %p"), (void *)result));
+      *result = *ap;
+    }
+
+  return ((void *)result);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static void Free_This_Type(void *argp)
+|
+|   Description   :  Free structure for alpha type argument.
+|
+|   Return Values :  -
++--------------------------------------------------------------------------*/
+static void
+Free_This_Type(void *argp)
+{
+  if (argp)
+    free(argp);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static bool Check_This_Character(
+|                                      int c,
+|                                      const void *argp)
+|
+|   Description   :  Check a character for the alpha type.
+|
+|   Return Values :  TRUE  - character is valid
+|                    FALSE - character is invalid
++--------------------------------------------------------------------------*/
+static bool
+Check_This_Character(int c, const void *argp GCC_UNUSED)
+{
+#if USE_WIDEC_SUPPORT
+  if (iswalpha((wint_t)c))
+    return TRUE;
+#endif
+  return (isalpha(UChar(c)) ? TRUE : FALSE);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static bool Check_This_Field(
+|                                      FIELD *field,
+|                                      const void *argp)
+|
+|   Description   :  Validate buffer content to be a valid alpha value
+|
+|   Return Values :  TRUE  - field is valid
+|                    FALSE - field is invalid
++--------------------------------------------------------------------------*/
+static bool
+Check_This_Field(FIELD *field, const void *argp)
+{
+  int width = ((const thisARG *)argp)->width;
+  unsigned char *bp = (unsigned char *)field_buffer(field, 0);
+  bool result = (width < 0);
+
+  Check_CTYPE_Field(result, bp, width, Check_This_Character);
+  return (result);
+}
+
+static FIELDTYPE typeTHIS =
+{
+  _HAS_ARGS | _RESIDENT,
+  1,				/* this is mutable, so we can't be const */
+  (FIELDTYPE *)0,
+  (FIELDTYPE *)0,
+  Make_This_Type,
+  Copy_This_Type,
+  Free_This_Type,
+  INIT_FT_FUNC(Check_This_Field),
+  INIT_FT_FUNC(Check_This_Character),
+  INIT_FT_FUNC(NULL),
+  INIT_FT_FUNC(NULL),
+#if NCURSES_INTEROP_FUNCS
+  Generic_This_Type
+#endif
+};
+
+FORM_EXPORT_VAR(FIELDTYPE *) TYPE_ALPHA = &typeTHIS;
+
+#if NCURSES_INTEROP_FUNCS
+/* The next routines are to simplify the use of ncurses from
+   programming languages with restrictions on interop with C level
+   constructs (e.g. variable access or va_list + ellipsis constructs)
+*/
+FORM_EXPORT(FIELDTYPE *)
+_nc_TYPE_ALPHA(void)
+{
+  return TYPE_ALPHA;
+}
+#endif
+
+/* fty_alpha.c ends here */
diff --git a/form/fty_enum.c b/form/fty_enum.c
new file mode 100644
index 0000000..16ffae1
--- /dev/null
+++ b/form/fty_enum.c
@@ -0,0 +1,444 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2009,2010 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.                                                           *
+ ****************************************************************************/
+
+/***************************************************************************
+*                                                                          *
+*  Author : Juergen Pfeifer                                                *
+*                                                                          *
+***************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fty_enum.c,v 1.33 2021/06/17 21:11:08 tom Exp $")
+
+typedef struct
+  {
+    char **kwds;
+    int count;
+    bool checkcase;
+    bool checkunique;
+  }
+enumARG;
+
+typedef struct
+  {
+    char **kwds;
+    int ccase;
+    int cunique;
+  }
+enumParams;
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static void *Generic_Enum_Type(void * arg)
+|
+|   Description   :  Allocate structure for enumeration type argument.
+|
+|   Return Values :  Pointer to argument structure or NULL on error
++--------------------------------------------------------------------------*/
+static void *
+Generic_Enum_Type(void *arg)
+{
+  enumARG *argp = (enumARG *)0;
+  enumParams *params = (enumParams *)arg;
+
+  if (params)
+    {
+      argp = typeMalloc(enumARG, 1);
+
+      if (argp)
+	{
+	  int cnt = 0;
+	  char **kp = (char **)0;
+	  char **kwds = (char **)0;
+	  int ccase, cunique;
+
+	  T((T_CREATE("enumARG %p"), (void *)argp));
+	  kwds = params->kwds;
+	  ccase = params->ccase;
+	  cunique = params->cunique;
+
+	  argp->checkcase = ccase ? TRUE : FALSE;
+	  argp->checkunique = cunique ? TRUE : FALSE;
+	  argp->kwds = (char **)0;
+
+	  kp = kwds;
+	  while (kp && (*kp++))
+	    cnt++;
+	  argp->count = cnt;
+
+	  if (cnt > 0)
+	    {
+	      char **kptarget;
+
+	      /* We copy the keywords, because we can't rely on the fact
+	         that the caller doesn't relocate or free the memory used
+	         for the keywords (maybe he has GC)
+	       */
+	      argp->kwds = typeMalloc(char *, cnt + 1);
+
+	      kp = kwds;
+	      if ((kptarget = argp->kwds) != 0)
+		{
+		  while (kp && (*kp))
+		    {
+		      (*kptarget++) = strdup(*kp++);
+		    }
+		  *kptarget = (char *)0;
+		}
+	    }
+	}
+    }
+  return (void *)argp;
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static void *Make_Enum_Type( va_list * ap )
+|
+|   Description   :  Allocate structure for enumeration type argument.
+|
+|   Return Values :  Pointer to argument structure or NULL on error
++--------------------------------------------------------------------------*/
+static void *
+Make_Enum_Type(va_list *ap)
+{
+  enumParams params;
+
+  params.kwds = va_arg(*ap, char **);
+  params.ccase = va_arg(*ap, int);
+  params.cunique = va_arg(*ap, int);
+
+  return Generic_Enum_Type((void *)&params);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static void *Copy_Enum_Type( const void * argp )
+|
+|   Description   :  Copy structure for enumeration type argument.
+|
+|   Return Values :  Pointer to argument structure or NULL on error.
++--------------------------------------------------------------------------*/
+static void *
+Copy_Enum_Type(const void *argp)
+{
+  enumARG *result = (enumARG *)0;
+
+  if (argp)
+    {
+      const enumARG *ap = (const enumARG *)argp;
+
+      result = typeMalloc(enumARG, 1);
+
+      if (result)
+	{
+	  T((T_CREATE("enumARG %p"), (void *)result));
+	  *result = *ap;
+
+	  if (ap->count > 0)
+	    {
+	      char **kptarget;
+	      char **kp = ap->kwds;
+	      result->kwds = typeMalloc(char *, 1 + ap->count);
+
+	      if ((kptarget = result->kwds) != 0)
+		{
+		  while (kp && (*kp))
+		    {
+		      (*kptarget++) = strdup(*kp++);
+		    }
+		  *kptarget = (char *)0;
+		}
+	    }
+	}
+    }
+  return (void *)result;
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static void Free_Enum_Type( void * argp )
+|
+|   Description   :  Free structure for enumeration type argument.
+|
+|   Return Values :  -
++--------------------------------------------------------------------------*/
+static void
+Free_Enum_Type(void *argp)
+{
+  if (argp)
+    {
+      const enumARG *ap = (const enumARG *)argp;
+
+      if (ap->kwds && ap->count > 0)
+	{
+	  char **kp = ap->kwds;
+	  int cnt = 0;
+
+	  while (kp && (*kp))
+	    {
+	      free(*kp++);
+	      cnt++;
+	    }
+	  assert(cnt == ap->count);
+	  free(ap->kwds);
+	}
+      free(argp);
+    }
+}
+
+#define SKIP_SPACE(x) while(((*(x))!='\0') && (is_blank(*(x)))) (x)++
+#define NOMATCH 0
+#define PARTIAL 1
+#define EXACT   2
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static int Compare(const unsigned char * s,
+|                                       const unsigned char * buf,
+|                                       bool  ccase )
+|
+|   Description   :  Check whether or not the text in 'buf' matches the
+|                    text in 's', at least partial.
+|
+|   Return Values :  NOMATCH   - buffer doesn't match
+|                    PARTIAL   - buffer matches partially
+|                    EXACT     - buffer matches exactly
++--------------------------------------------------------------------------*/
+static int
+Compare(const unsigned char *s, const unsigned char *buf,
+	bool ccase)
+{
+  SKIP_SPACE(buf);		/* Skip leading spaces in both texts */
+  SKIP_SPACE(s);
+
+  if (*buf == '\0')
+    {
+      return (((*s) != '\0') ? NOMATCH : EXACT);
+    }
+  else
+    {
+      if (ccase)
+	{
+	  while (*s++ == *buf)
+	    {
+	      if (*buf++ == '\0')
+		return EXACT;
+	    }
+	}
+      else
+	{
+	  while (toupper(*s++) == toupper(*buf))
+	    {
+	      if (*buf++ == '\0')
+		return EXACT;
+	    }
+	}
+    }
+  /* At this location buf points to the first character where it no longer
+     matches with s. So if only blanks are following, we have a partial
+     match otherwise there is no match */
+  SKIP_SPACE(buf);
+  if (*buf)
+    return NOMATCH;
+
+  /* If it happens that the reference buffer is at its end, the partial
+     match is actually an exact match. */
+  return ((s[-1] != '\0') ? PARTIAL : EXACT);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static bool Check_Enum_Field(
+|                                      FIELD * field,
+|                                      const void  * argp)
+|
+|   Description   :  Validate buffer content to be a valid enumeration value
+|
+|   Return Values :  TRUE  - field is valid
+|                    FALSE - field is invalid
++--------------------------------------------------------------------------*/
+static bool
+Check_Enum_Field(FIELD *field, const void *argp)
+{
+  char **kwds = ((const enumARG *)argp)->kwds;
+  bool ccase = ((const enumARG *)argp)->checkcase;
+  bool unique = ((const enumARG *)argp)->checkunique;
+  unsigned char *bp = (unsigned char *)field_buffer(field, 0);
+  char *s, *t, *p;
+
+  while (kwds && (s = (*kwds++)))
+    {
+      int res;
+
+      if ((res = Compare((unsigned char *)s, bp, ccase)) != NOMATCH)
+	{
+	  p = t = s;		/* t is at least a partial match */
+	  if ((unique && res != EXACT))
+	    {
+	      while (kwds && (p = *kwds++))
+		{
+		  if ((res = Compare((unsigned char *)p, bp, ccase)) != NOMATCH)
+		    {
+		      if (res == EXACT)
+			{
+			  t = p;
+			  break;
+			}
+		      else
+			t = (char *)0;
+		    }
+		}
+	    }
+	  if (t)
+	    {
+	      set_field_buffer(field, 0, t);
+	      return TRUE;
+	    }
+	  if (!p)
+	    break;
+	}
+    }
+  return FALSE;
+}
+
+static const char *dummy[] =
+{(char *)0};
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static bool Next_Enum(FIELD * field,
+|                                          const void * argp)
+|
+|   Description   :  Check for the next enumeration value
+|
+|   Return Values :  TRUE  - next value found and loaded
+|                    FALSE - no next value loaded
++--------------------------------------------------------------------------*/
+static bool
+Next_Enum(FIELD *field, const void *argp)
+{
+  const enumARG *args = (const enumARG *)argp;
+  char **kwds = args->kwds;
+  bool ccase = args->checkcase;
+  int cnt = args->count;
+  unsigned char *bp = (unsigned char *)field_buffer(field, 0);
+
+  if (kwds)
+    {
+      while (cnt--)
+	{
+	  if (Compare((unsigned char *)(*kwds++), bp, ccase) == EXACT)
+	    break;
+	}
+      if (cnt <= 0)
+	kwds = args->kwds;
+      if ((cnt >= 0) || (Compare((const unsigned char *)dummy, bp, ccase) == EXACT))
+	{
+	  set_field_buffer(field, 0, *kwds);
+	  return TRUE;
+	}
+    }
+  return FALSE;
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static bool Previous_Enum(
+|                                          FIELD * field,
+|                                          const void * argp)
+|
+|   Description   :  Check for the previous enumeration value
+|
+|   Return Values :  TRUE  - previous value found and loaded
+|                    FALSE - no previous value loaded
++--------------------------------------------------------------------------*/
+static bool
+Previous_Enum(FIELD *field, const void *argp)
+{
+  const enumARG *args = (const enumARG *)argp;
+  int cnt = args->count;
+  char **kwds = &args->kwds[cnt - 1];
+  bool ccase = args->checkcase;
+  unsigned char *bp = (unsigned char *)field_buffer(field, 0);
+
+  if (kwds)
+    {
+      while (cnt--)
+	{
+	  if (Compare((unsigned char *)(*kwds--), bp, ccase) == EXACT)
+	    break;
+	}
+
+      if (cnt <= 0)
+	kwds = &args->kwds[args->count - 1];
+
+      if ((cnt >= 0) || (Compare((const unsigned char *)dummy, bp, ccase) == EXACT))
+	{
+	  set_field_buffer(field, 0, *kwds);
+	  return TRUE;
+	}
+    }
+  return FALSE;
+}
+
+static FIELDTYPE typeENUM =
+{
+  _HAS_ARGS | _HAS_CHOICE | _RESIDENT,
+  1,				/* this is mutable, so we can't be const */
+  (FIELDTYPE *)0,
+  (FIELDTYPE *)0,
+  Make_Enum_Type,
+  Copy_Enum_Type,
+  Free_Enum_Type,
+  INIT_FT_FUNC(Check_Enum_Field),
+  INIT_FT_FUNC(NULL),
+  INIT_FT_FUNC(Next_Enum),
+  INIT_FT_FUNC(Previous_Enum),
+#if NCURSES_INTEROP_FUNCS
+  Generic_Enum_Type
+#endif
+};
+
+FORM_EXPORT_VAR(FIELDTYPE *) TYPE_ENUM = &typeENUM;
+
+#if NCURSES_INTEROP_FUNCS
+/* The next routines are to simplify the use of ncurses from
+   programming languages with restrictions on interop with C level
+   constructs (e.g. variable access or va_list + ellipsis constructs)
+*/
+FORM_EXPORT(FIELDTYPE *)
+_nc_TYPE_ENUM(void)
+{
+  return TYPE_ENUM;
+}
+#endif
+
+/* fty_enum.c ends here */
diff --git a/form/fty_generic.c b/form/fty_generic.c
new file mode 100644
index 0000000..301c80a
--- /dev/null
+++ b/form/fty_generic.c
@@ -0,0 +1,305 @@
+/****************************************************************************
+ * Copyright 2018-2020,2021 Thomas E. Dickey                                *
+ * Copyright 2008-2012,2016 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.                                                           *
+ ****************************************************************************/
+
+/***************************************************************************
+*                                                                          *
+*  Author : Juergen Pfeifer                                                *
+*                                                                          *
+***************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fty_generic.c,v 1.15 2021/03/27 23:49:53 tom Exp $")
+
+/*
+ * This is not a full implementation of a field type, but adds some
+ * support for higher level languages with some restrictions to interop
+ * with C language. In particular, the collection of arguments for the
+ * various fieldtypes is not based on the vararg C mechanism, but on a
+ * iterator based callback mechanism that allows the high level language
+ * to provide the arguments as a structure. Most languages have mechanisms
+ * to layout structures so that they can be passed to C.
+ *
+ * The languages can register a new generic fieldtype dynamically and store
+ * a handle (key) to the calling object as an argument. Together with that
+ * it can register a freearg callback, so that the high level language
+ * remains in control of the memory management of the arguments they pass.
+ * The design idea is, that the high-level language - typically a OO
+ * language like C# or Java, uses its own dispatching mechanisms
+ * (polymorphism) to call the proper check routines responsible for the
+ * argument type. So these language implement typically only one generic
+ * fieldtype they register with the forms library using this call.
+ *
+ * For that purpose we have extended the fieldtype structure by a new element
+ * that gets the arguments from a single struct passed by the caller.
+ *
+ */
+#if NCURSES_INTEROP_FUNCS
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static void *Generic_This_Type( void * arg )
+|
+|   Description   :  We interpret the passed arg just as a handle the
+|                    calling language uses to keep track of its allocated
+|                    argument structures. We can simply copy it back.
+|
+|   Return Values :  Pointer to argument structure
++--------------------------------------------------------------------------*/
+static void *
+Generic_This_Type(void *arg)
+{
+  return (arg);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  FIELDTYPE *_nc_generic_fieldtype(
+|                       bool (* const field_check)(FIELD *,const void *),
+|                       bool (* const char_check) (int, const void *),
+|   		        bool (*const next)(FORM*,FIELD*,const void*),
+|		        bool (*const prev)(FORM*,FIELD*,const void*),
+|                       void (*freecallback)(void*))
+|
+|   Description   :  Create a new fieldtype. The application programmer must
+|                    write a field_check and a char_check function and give
+|                    them as input to this call. A callback to allow the
+|                    release of the allocated memory must also be provided.
+|                    For generic field types, we provide some more
+|                    information about the field as parameters.
+|
+|                    If an error occurs, errno is set to
+|                       E_BAD_ARGUMENT  - invalid arguments
+|                       E_SYSTEM_ERROR  - system error (no memory)
+|
+|   Return Values :  Fieldtype pointer or NULL if error occurred
++--------------------------------------------------------------------------*/
+FORM_EXPORT(FIELDTYPE *)
+_nc_generic_fieldtype(bool (*const field_check) (FORM *, FIELD *, const void *),
+		      bool (*const char_check) (int, FORM *, FIELD *, const
+						void *),
+		      bool (*const next) (FORM *, FIELD *, const void *),
+		      bool (*const prev) (FORM *, FIELD *, const void *),
+		      void (*freecallback) (void *))
+{
+  int code = E_SYSTEM_ERROR;
+  FIELDTYPE *res = (FIELDTYPE *)0;
+
+  TR_FUNC_BFR(5);
+
+  T((T_CALLED("_nc_generic_fieldtype(%s,%s,%s,%s,%s)"),
+     TR_FUNC_ARG(0, field_check),
+     TR_FUNC_ARG(1, char_check),
+     TR_FUNC_ARG(2, next),
+     TR_FUNC_ARG(3, prev),
+     TR_FUNC_ARG(4, freecallback)));
+
+  if (field_check || char_check)
+    {
+      res = typeMalloc(FIELDTYPE, 1);
+
+      if (res)
+	{
+	  *res = *_nc_Default_FieldType;
+	  SetStatus(res, (_HAS_ARGS | _GENERIC));
+	  res->fieldcheck.gfcheck = field_check;
+	  res->charcheck.gccheck = char_check;
+	  res->genericarg = Generic_This_Type;
+	  res->freearg = freecallback;
+	  res->enum_next.gnext = next;
+	  res->enum_prev.gprev = prev;
+	  code = E_OK;
+	}
+    }
+  else
+    code = E_BAD_ARGUMENT;
+
+  if (E_OK != code)
+    SET_ERROR(code);
+
+  returnFieldType(res);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static TypeArgument *GenericArgument(
+|                      const FIELDTYPE* typ,
+|                      int (*argiterator)(void**),
+|                      int* err)
+|
+|   Description   :  The iterator callback must browse through all fieldtype
+|                    parameters that have an argument associated with the
+|                    type. The iterator returns 1 if the operation to get
+|                    the next element was successful, 0 otherwise. If the
+|                    iterator could move to the next argument, it fills
+|                    the void* pointer representing the argument into the
+|                    location provided as argument to the iterator.
+|                    The err reference is used to keep track of errors.
+|
+|   Return Values :  Pointer to argument structure
++--------------------------------------------------------------------------*/
+static TypeArgument *
+GenericArgument(const FIELDTYPE *typ,
+		int (*argiterator) (void **), int *err)
+{
+  TypeArgument *res = (TypeArgument *)0;
+
+  if (typ != 0 && (typ->status & _HAS_ARGS) != 0 && err != 0 && argiterator != 0)
+    {
+      if (typ->status & _LINKED_TYPE)
+	{
+	  /* Composite fieldtypes keep track internally of their own memory */
+	  TypeArgument *p = typeMalloc(TypeArgument, 1);
+
+	  if (p)
+	    {
+	      p->left = GenericArgument(typ->left, argiterator, err);
+	      p->right = GenericArgument(typ->right, argiterator, err);
+	      return p;
+	    }
+	  else
+	    *err += 1;
+	}
+      else
+	{
+	  assert(typ->genericarg != (void *)0);
+	  if (typ->genericarg == 0)
+	    *err += 1;
+	  else
+	    {
+	      void *argp;
+	      int valid = argiterator(&argp);
+
+	      if (valid == 0 || argp == 0 ||
+		  !(res = (TypeArgument *)typ->genericarg(argp)))
+		{
+		  *err += 1;
+		}
+	    }
+	}
+    }
+  return res;
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  int _nc_set_generic_fieldtype(
+|                      FIELD* field,
+|                      FIELDTYPE* ftyp,
+|                      int (*argiterator)(void**))
+|
+|   Description   :  Assign the fieldtype to the field and use the iterator
+|                    mechanism to get the arguments when a check is
+|                    performed.
+|
+|   Return Values :  E_OK if all went well
+|                    E_SYSTEM_ERROR if an error occurred
++--------------------------------------------------------------------------*/
+FORM_EXPORT(int)
+_nc_set_generic_fieldtype(FIELD *field,
+			  FIELDTYPE *ftyp,
+			  int (*argiterator) (void **))
+{
+  int code = E_SYSTEM_ERROR;
+  int err = 0;
+
+  if (field)
+    {
+      if (field && field->type)
+	_nc_Free_Type(field);
+
+      field->type = ftyp;
+      if (ftyp)
+	{
+	  if (argiterator)
+	    {
+	      /* The precondition is that the iterator is reset */
+	      field->arg = (void *)GenericArgument(field->type, argiterator, &err);
+
+	      if (err)
+		{
+		  _nc_Free_Argument(field->type, (TypeArgument *)(field->arg));
+		  field->type = (FIELDTYPE *)0;
+		  field->arg = (void *)0;
+		}
+	      else
+		{
+		  code = E_OK;
+		  if (field->type)
+		    field->type->ref++;
+		}
+	    }
+	}
+      else
+	{
+	  field->arg = (void *)0;
+	  code = E_OK;
+	}
+    }
+  return code;
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  WINDOW* _nc_form_cursor(
+|                      FORM* form,
+|                      int *pRow, int *pCol)
+|
+|   Description   :  Get the current position of the form cursor position
+|                    We also return the field window
+|
+|   Return Values :  The field's Window or NULL on error
++--------------------------------------------------------------------------*/
+FORM_EXPORT(WINDOW *)
+_nc_form_cursor(const FORM *form, int *pRow, int *pCol)
+{
+  int code = E_SYSTEM_ERROR;
+  WINDOW *res = (WINDOW *)0;
+
+  if (form != 0 && pRow != 0 && pCol != 0)
+    {
+      *pRow = form->currow;
+      *pCol = form->curcol;
+      res = form->w;
+      code = E_OK;
+    }
+  if (code != E_OK)
+    SET_ERROR(code);
+  return res;
+}
+
+#else
+extern void _nc_fty_generic(void);
+void
+_nc_fty_generic(void)
+{
+}
+#endif
+
+/* fty_generic.c ends here */
diff --git a/form/fty_int.c b/form/fty_int.c
new file mode 100644
index 0000000..c7e3135
--- /dev/null
+++ b/form/fty_int.c
@@ -0,0 +1,298 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2010,2012 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.                                                           *
+ ****************************************************************************/
+
+/***************************************************************************
+*                                                                          *
+*  Author : Juergen Pfeifer                                                *
+*                                                                          *
+***************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fty_int.c,v 1.33 2021/06/17 21:11:08 tom Exp $")
+
+#if USE_WIDEC_SUPPORT
+#define isDigit(c) (iswdigit((wint_t)(c)) || isdigit(UChar(c)))
+#else
+#define isDigit(c) isdigit(UChar(c))
+#endif
+
+#define thisARG integerARG
+
+typedef struct
+  {
+    int precision;
+    long low;
+    long high;
+  }
+thisARG;
+
+typedef struct
+  {
+    int precision;
+    long low;
+    long high;
+  }
+integerPARM;
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static void *Generic_This_Type( void * arg )
+|
+|   Description   :  Allocate structure for integer type argument.
+|
+|   Return Values :  Pointer to argument structure or NULL on error
++--------------------------------------------------------------------------*/
+static void *
+Generic_This_Type(void *arg)
+{
+  thisARG *argp = (thisARG *)0;
+  thisARG *param = (thisARG *)arg;
+
+  if (param)
+    {
+      argp = typeMalloc(thisARG, 1);
+
+      if (argp)
+	{
+	  T((T_CREATE("thisARG %p"), (void *)argp));
+	  *argp = *param;
+	}
+    }
+  return (void *)argp;
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static void *Make_This_Type( va_list * ap )
+|
+|   Description   :  Allocate structure for integer type argument.
+|
+|   Return Values :  Pointer to argument structure or NULL on error
++--------------------------------------------------------------------------*/
+static void *
+Make_This_Type(va_list *ap)
+{
+  thisARG arg;
+
+  arg.precision = va_arg(*ap, int);
+  arg.low = va_arg(*ap, long);
+  arg.high = va_arg(*ap, long);
+
+  return Generic_This_Type((void *)&arg);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static void *Copy_This_Type(const void * argp)
+|
+|   Description   :  Copy structure for integer type argument.
+|
+|   Return Values :  Pointer to argument structure or NULL on error.
++--------------------------------------------------------------------------*/
+static void *
+Copy_This_Type(const void *argp)
+{
+  const thisARG *ap = (const thisARG *)argp;
+  thisARG *result = (thisARG *)0;
+
+  if (argp)
+    {
+      result = typeMalloc(thisARG, 1);
+
+      if (result)
+	{
+	  T((T_CREATE("thisARG %p"), (void *)result));
+	  *result = *ap;
+	}
+    }
+  return (void *)result;
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static void Free_This_Type(void * argp)
+|
+|   Description   :  Free structure for integer type argument.
+|
+|   Return Values :  -
++--------------------------------------------------------------------------*/
+static void
+Free_This_Type(void *argp)
+{
+  if (argp)
+    free(argp);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static bool Check_This_Field(
+|                                                 FIELD * field,
+|                                                 const void * argp)
+|
+|   Description   :  Validate buffer content to be a valid integer value
+|
+|   Return Values :  TRUE  - field is valid
+|                    FALSE - field is invalid
++--------------------------------------------------------------------------*/
+static bool
+Check_This_Field(FIELD *field, const void *argp)
+{
+  const thisARG *argi = (const thisARG *)argp;
+  long low = argi->low;
+  long high = argi->high;
+  int prec = argi->precision;
+  unsigned char *bp = (unsigned char *)field_buffer(field, 0);
+  char *s = (char *)bp;
+  bool result = FALSE;
+
+  while (*bp == ' ')
+    bp++;
+  if (*bp)
+    {
+      if (*bp == '-')
+	bp++;
+#if USE_WIDEC_SUPPORT
+      if (*bp)
+	{
+	  int len;
+	  wchar_t *list = _nc_Widen_String((char *)bp, &len);
+
+	  if (list != 0)
+	    {
+	      bool blank = FALSE;
+	      int n;
+
+	      result = TRUE;
+	      for (n = 0; n < len; ++n)
+		{
+		  if (blank)
+		    {
+		      if (list[n] != ' ')
+			{
+			  result = FALSE;
+			  break;
+			}
+		    }
+		  else if (list[n] == ' ')
+		    {
+		      blank = TRUE;
+		    }
+		  else if (!isDigit(list[n]))
+		    {
+		      result = FALSE;
+		      break;
+		    }
+		}
+	      free(list);
+	    }
+	}
+#else
+      while (*bp)
+	{
+	  if (!isdigit(UChar(*bp)))
+	    break;
+	  bp++;
+	}
+      while (*bp && *bp == ' ')
+	bp++;
+      result = (*bp == '\0');
+#endif
+      if (result)
+	{
+	  long val = atol(s);
+
+	  if (low < high)
+	    {
+	      if (val < low || val > high)
+		result = FALSE;
+	    }
+	  if (result)
+	    {
+	      char buf[100];
+
+	      _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf))
+			  "%.*ld", (prec > 0 ? prec : 0), val);
+	      set_field_buffer(field, 0, buf);
+	    }
+	}
+    }
+  return (result);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static bool Check_This_Character(
+|                                      int c,
+|                                      const void * argp)
+|
+|   Description   :  Check a character for the integer type.
+|
+|   Return Values :  TRUE  - character is valid
+|                    FALSE - character is invalid
++--------------------------------------------------------------------------*/
+static bool
+Check_This_Character(int c, const void *argp GCC_UNUSED)
+{
+  return ((isDigit(UChar(c)) || (c == '-')) ? TRUE : FALSE);
+}
+
+static FIELDTYPE typeTHIS =
+{
+  _HAS_ARGS | _RESIDENT,
+  1,				/* this is mutable, so we can't be const */
+  (FIELDTYPE *)0,
+  (FIELDTYPE *)0,
+  Make_This_Type,
+  Copy_This_Type,
+  Free_This_Type,
+  INIT_FT_FUNC(Check_This_Field),
+  INIT_FT_FUNC(Check_This_Character),
+  INIT_FT_FUNC(NULL),
+  INIT_FT_FUNC(NULL),
+#if NCURSES_INTEROP_FUNCS
+  Generic_This_Type
+#endif
+};
+
+FORM_EXPORT_VAR(FIELDTYPE *) TYPE_INTEGER = &typeTHIS;
+
+#if NCURSES_INTEROP_FUNCS
+/* The next routines are to simplify the use of ncurses from
+   programming languages with restrictions on interop with C level
+   constructs (e.g. variable access or va_list + ellipsis constructs)
+*/
+FORM_EXPORT(FIELDTYPE *)
+_nc_TYPE_INTEGER(void)
+{
+  return TYPE_INTEGER;
+}
+#endif
+
+/* fty_int.c ends here */
diff --git a/form/fty_ipv4.c b/form/fty_ipv4.c
new file mode 100644
index 0000000..108f7b4
--- /dev/null
+++ b/form/fty_ipv4.c
@@ -0,0 +1,121 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2006,2009 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.                                                           *
+ ****************************************************************************/
+
+/***************************************************************************
+*                                                                          *
+*  Author : Per Foreby, perf@efd.lth.se                                    *
+*                                                                          *
+***************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fty_ipv4.c,v 1.16 2021/06/17 21:11:08 tom Exp $")
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static bool Check_IPV4_Field(
+|                                      FIELD * field,
+|                                      const void * argp)
+|
+|   Description   :  Validate buffer content to be a valid IP number (Ver. 4)
+|
+|   Return Values :  TRUE  - field is valid
+|                    FALSE - field is invalid
++--------------------------------------------------------------------------*/
+static bool
+Check_IPV4_Field(FIELD *field, const void *argp GCC_UNUSED)
+{
+  char *bp = field_buffer(field, 0);
+  int num = 0, len;
+  unsigned int d1 = 0, d2 = 0, d3 = 0, d4 = 0;
+
+  if (isdigit(UChar(*bp)))	/* Must start with digit */
+    {
+      num = sscanf(bp, "%u.%u.%u.%u%n", &d1, &d2, &d3, &d4, &len);
+      if (num == 4)
+	{
+	  bp += len;		/* Make bp point to what sscanf() left */
+	  while (isspace(UChar(*bp)))
+	    bp++;		/* Allow trailing whitespace */
+	}
+    }
+  return ((num != 4 || *bp || d1 > 255 || d2 > 255
+	   || d3 > 255 || d4 > 255) ? FALSE : TRUE);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static bool Check_IPV4_Character(
+|                                      int c,
+|                                      const void *argp )
+|
+|   Description   :  Check a character for unsigned type or period.
+|
+|   Return Values :  TRUE  - character is valid
+|                    FALSE - character is invalid
++--------------------------------------------------------------------------*/
+static bool
+Check_IPV4_Character(int c, const void *argp GCC_UNUSED)
+{
+  return ((isdigit(UChar(c)) || (c == '.')) ? TRUE : FALSE);
+}
+
+static FIELDTYPE typeIPV4 =
+{
+  _RESIDENT,
+  1,				/* this is mutable, so we can't be const */
+  (FIELDTYPE *)0,
+  (FIELDTYPE *)0,
+  NULL,
+  NULL,
+  NULL,
+  INIT_FT_FUNC(Check_IPV4_Field),
+  INIT_FT_FUNC(Check_IPV4_Character),
+  INIT_FT_FUNC(NULL),
+  INIT_FT_FUNC(NULL),
+#if NCURSES_INTEROP_FUNCS
+  NULL
+#endif
+};
+
+FORM_EXPORT_VAR(FIELDTYPE *) TYPE_IPV4 = &typeIPV4;
+
+#if NCURSES_INTEROP_FUNCS
+/* The next routines are to simplify the use of ncurses from
+   programming languages with restrictions on interop with C level
+   constructs (e.g. variable access or va_list + ellipsis constructs)
+*/
+FORM_EXPORT(FIELDTYPE *)
+_nc_TYPE_IPV4(void)
+{
+  return TYPE_IPV4;
+}
+#endif
+
+/* fty_ipv4.c ends here */
diff --git a/form/fty_num.c b/form/fty_num.c
new file mode 100644
index 0000000..34cef63
--- /dev/null
+++ b/form/fty_num.c
@@ -0,0 +1,344 @@
+/****************************************************************************
+ * Copyright 2019-2020,2021 Thomas E. Dickey                                *
+ * Copyright 1998-2010,2012 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.                                                           *
+ ****************************************************************************/
+
+/***************************************************************************
+*                                                                          *
+*  Author : Juergen Pfeifer                                                *
+*                                                                          *
+***************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fty_num.c,v 1.37 2021/03/27 23:49:58 tom Exp $")
+
+#if HAVE_LOCALE_H
+#include <locale.h>
+#endif
+
+#if HAVE_LOCALE_H && HAVE_LOCALECONV
+#define isDecimalPoint(c) ((c) == ((L && L->decimal_point) ? *(L->decimal_point) : '.'))
+#else
+#define isDecimalPoint(c) ((c) == '.')
+#endif
+
+#if USE_WIDEC_SUPPORT
+#define isDigit(c) (iswdigit((wint_t)(c)) || isdigit(UChar(c)))
+#else
+#define isDigit(c) isdigit(UChar(c))
+#endif
+
+#define thisARG numericARG
+
+typedef struct
+  {
+    int precision;
+    double low;
+    double high;
+    struct lconv *L;
+  }
+thisARG;
+
+typedef struct
+  {
+    int precision;
+    double low;
+    double high;
+  }
+thisPARM;
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static void *Generic_This_Type(void * arg)
+|
+|   Description   :  Allocate structure for numeric type argument.
+|
+|   Return Values :  Pointer to argument structure or NULL on error
++--------------------------------------------------------------------------*/
+static void *
+Generic_This_Type(void *arg)
+{
+  thisARG *argn = (thisARG *)0;
+  thisPARM *args = (thisPARM *)arg;
+
+  if (args)
+    {
+      argn = typeMalloc(thisARG, 1);
+
+      if (argn)
+	{
+	  T((T_CREATE("thisARG %p"), (void *)argn));
+	  argn->precision = args->precision;
+	  argn->low = args->low;
+	  argn->high = args->high;
+
+#if HAVE_LOCALE_H && HAVE_LOCALECONV
+	  argn->L = localeconv();
+#else
+	  argn->L = NULL;
+#endif
+	}
+    }
+  return (void *)argn;
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static void *Make_This_Type(va_list * ap)
+|
+|   Description   :  Allocate structure for numeric type argument.
+|
+|   Return Values :  Pointer to argument structure or NULL on error
++--------------------------------------------------------------------------*/
+static void *
+Make_This_Type(va_list *ap)
+{
+  thisPARM arg;
+
+  arg.precision = va_arg(*ap, int);
+  arg.low = va_arg(*ap, double);
+  arg.high = va_arg(*ap, double);
+
+  return Generic_This_Type((void *)&arg);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static void *Copy_This_Type(const void * argp)
+|
+|   Description   :  Copy structure for numeric type argument.
+|
+|   Return Values :  Pointer to argument structure or NULL on error.
++--------------------------------------------------------------------------*/
+static void *
+Copy_This_Type(const void *argp)
+{
+  const thisARG *ap = (const thisARG *)argp;
+  thisARG *result = (thisARG *)0;
+
+  if (argp)
+    {
+      result = typeMalloc(thisARG, 1);
+
+      if (result)
+	{
+	  T((T_CREATE("thisARG %p"), (void *)result));
+	  *result = *ap;
+	}
+    }
+  return (void *)result;
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static void Free_This_Type(void * argp)
+|
+|   Description   :  Free structure for numeric type argument.
+|
+|   Return Values :  -
++--------------------------------------------------------------------------*/
+static void
+Free_This_Type(void *argp)
+{
+  if (argp)
+    free(argp);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static bool Check_This_Field(FIELD * field,
+|                                                 const void * argp)
+|
+|   Description   :  Validate buffer content to be a valid numeric value
+|
+|   Return Values :  TRUE  - field is valid
+|                    FALSE - field is invalid
++--------------------------------------------------------------------------*/
+static bool
+Check_This_Field(FIELD *field, const void *argp)
+{
+  const thisARG *argn = (const thisARG *)argp;
+  double low = argn->low;
+  double high = argn->high;
+  int prec = argn->precision;
+  unsigned char *bp = (unsigned char *)field_buffer(field, 0);
+  char *s = (char *)bp;
+  struct lconv *L = argn->L;
+  bool result = FALSE;
+
+  while (*bp == ' ')
+    bp++;
+  if (*bp)
+    {
+      if (*bp == '-' || *bp == '+')
+	bp++;
+#if USE_WIDEC_SUPPORT
+      if (*bp)
+	{
+	  int len;
+	  wchar_t *list = _nc_Widen_String((char *)bp, &len);
+
+	  if (list != 0)
+	    {
+	      bool blank = FALSE;
+	      int state = 0;
+	      int n;
+
+	      result = TRUE;
+	      for (n = 0; n < len; ++n)
+		{
+		  if (blank)
+		    {
+		      if (list[n] != ' ')
+			{
+			  result = FALSE;
+			  break;
+			}
+		    }
+		  else if (list[n] == ' ')
+		    {
+		      blank = TRUE;
+		    }
+		  else if (isDecimalPoint(list[n]))
+		    {
+		      if (++state > 1)
+			{
+			  result = FALSE;
+			  break;
+			}
+		    }
+		  else if (!isDigit(list[n]))
+		    {
+		      result = FALSE;
+		      break;
+		    }
+		}
+	      free(list);
+	    }
+	}
+#else
+      while (*bp)
+	{
+	  if (!isdigit(UChar(*bp)))
+	    break;
+	  bp++;
+	}
+      if (isDecimalPoint(*bp))
+	{
+	  bp++;
+	  while (*bp)
+	    {
+	      if (!isdigit(UChar(*bp)))
+		break;
+	      bp++;
+	    }
+	}
+      while (*bp && *bp == ' ')
+	bp++;
+      result = (*bp == '\0');
+#endif
+      if (result)
+	{
+	  double val = atof(s);
+
+	  if (low < high)
+	    {
+	      if (val < low || val > high)
+		result = FALSE;
+	    }
+	  if (result)
+	    {
+	      char buf[64];
+
+	      _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf))
+			  "%.*f", (prec > 0 ? prec : 0), val);
+	      set_field_buffer(field, 0, buf);
+	    }
+	}
+    }
+  return (result);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static bool Check_This_Character(
+|                                      int c,
+|                                      const void * argp)
+|
+|   Description   :  Check a character for the numeric type.
+|
+|   Return Values :  TRUE  - character is valid
+|                    FALSE - character is invalid
++--------------------------------------------------------------------------*/
+static bool
+Check_This_Character(int c, const void *argp)
+{
+  const thisARG *argn = (const thisARG *)argp;
+  struct lconv *L = argn->L;
+
+  return ((isDigit(c) ||
+	   c == '+' ||
+	   c == '-' ||
+	   isDecimalPoint(c))
+	  ? TRUE
+	  : FALSE);
+}
+
+static FIELDTYPE typeTHIS =
+{
+  _HAS_ARGS | _RESIDENT,
+  1,				/* this is mutable, so we can't be const */
+  (FIELDTYPE *)0,
+  (FIELDTYPE *)0,
+  Make_This_Type,
+  Copy_This_Type,
+  Free_This_Type,
+  INIT_FT_FUNC(Check_This_Field),
+  INIT_FT_FUNC(Check_This_Character),
+  INIT_FT_FUNC(NULL),
+  INIT_FT_FUNC(NULL),
+#if NCURSES_INTEROP_FUNCS
+  Generic_This_Type
+#endif
+};
+
+FORM_EXPORT_VAR(FIELDTYPE *) TYPE_NUMERIC = &typeTHIS;
+
+#if NCURSES_INTEROP_FUNCS
+/* The next routines are to simplify the use of ncurses from
+   programming languages with restrictions on interop with C level
+   constructs (e.g. variable access or va_list + ellipsis constructs)
+*/
+FORM_EXPORT(FIELDTYPE *)
+_nc_TYPE_NUMERIC(void)
+{
+  return TYPE_NUMERIC;
+}
+#endif
+
+/* fty_num.c ends here */
diff --git a/form/fty_regex.c b/form/fty_regex.c
new file mode 100644
index 0000000..62dcab5
--- /dev/null
+++ b/form/fty_regex.c
@@ -0,0 +1,388 @@
+/****************************************************************************
+ * Copyright 2018-2020,2021 Thomas E. Dickey                                *
+ * Copyright 1998-2012,2015 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.                                                           *
+ ****************************************************************************/
+
+/***************************************************************************
+*                                                                          *
+*  Author : Juergen Pfeifer                                                *
+*                                                                          *
+***************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fty_regex.c,v 1.33 2021/08/14 15:01:52 tom Exp $")
+
+#if HAVE_REGEX_H_FUNCS || HAVE_LIB_PCRE2	/* We prefer POSIX regex */
+
+#if HAVE_PCRE2POSIX_H
+#include <pcre2posix.h>
+
+/* pcre2 used to provide its "POSIX" entrypoints using the same names as the
+ * standard ones in the C runtime, but that never worked because the linker
+ * would use the C runtime.  Debian patched the library to fix this symbol
+ * conflict, but overlooked the header file, and Debian's patch was made
+ * obsolete when pcre2 was changed early in 2019 to provide different names.
+ *
+ * Here is a workaround to make the older version of Debian's package work.
+ */
+#if !defined(PCRE2regcomp) && defined(HAVE_PCRE2REGCOMP)
+
+#undef regcomp
+#undef regexec
+#undef regfree
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+  PCRE2POSIX_EXP_DECL int PCRE2regcomp(regex_t *, const char *, int);
+  PCRE2POSIX_EXP_DECL int PCRE2regexec(const regex_t *, const char *, size_t,
+				       regmatch_t *, int);
+  PCRE2POSIX_EXP_DECL void PCRE2regfree(regex_t *);
+#ifdef __cplusplus
+}				/* extern "C" */
+#endif
+#define regcomp(r,s,n)          PCRE2regcomp(r,s,n)
+#define regexec(r,s,n,m,x)      PCRE2regexec(r,s,n,m,x)
+#define regfree(r)              PCRE2regfree(r)
+#endif
+/* end workaround... */
+#elif HAVE_PCREPOSIX_H
+#include <pcreposix.h>
+#else
+#include <regex.h>
+#endif
+
+typedef struct
+  {
+    regex_t *pRegExp;
+    unsigned long *refCount;
+  }
+RegExp_Arg;
+
+#elif HAVE_REGEXP_H_FUNCS | HAVE_REGEXPR_H_FUNCS
+#undef RETURN
+static int reg_errno;
+
+static char *
+RegEx_Init(char *instring)
+{
+  reg_errno = 0;
+  return instring;
+}
+
+static char *
+RegEx_Error(int code)
+{
+  reg_errno = code;
+  return 0;
+}
+
+#define INIT 		register char *sp = RegEx_Init(instring);
+#define GETC()		(*sp++)
+#define PEEKC()		(*sp)
+#define UNGETC(c)	(--sp)
+#define RETURN(c)	return(c)
+#define ERROR(c)	return RegEx_Error(c)
+
+#if HAVE_REGEXP_H_FUNCS
+#include <regexp.h>
+#else
+#include <regexpr.h>
+#endif
+
+typedef struct
+{
+  char *compiled_expression;
+  unsigned long *refCount;
+}
+RegExp_Arg;
+
+/* Maximum Length we allow for a compiled regular expression */
+#define MAX_RX_LEN   (2048)
+#define RX_INCREMENT (256)
+
+#endif
+
+#if HAVE_REGEX_H_FUNCS | HAVE_REGEXP_H_FUNCS | HAVE_REGEXPR_H_FUNCS
+# define MAYBE_UNUSED
+#else
+# define MAYBE_UNUSED GCC_UNUSED
+#endif
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static void *Generic_RegularExpression_Type(void * arg)
+|
+|   Description   :  Allocate structure for regex type argument.
+|
+|   Return Values :  Pointer to argument structure or NULL on error
++--------------------------------------------------------------------------*/
+static void *
+Generic_RegularExpression_Type(void *arg MAYBE_UNUSED)
+{
+#if HAVE_REGEX_H_FUNCS
+  char *rx = (char *)arg;
+  RegExp_Arg *preg = (RegExp_Arg *)0;
+
+  if (rx)
+    {
+      preg = typeCalloc(RegExp_Arg, 1);
+
+      if (preg)
+	{
+	  T((T_CREATE("RegExp_Arg %p"), (void *)preg));
+	  if (((preg->pRegExp = typeMalloc(regex_t, 1)) != 0)
+	      && !regcomp(preg->pRegExp, rx,
+			  (REG_EXTENDED | REG_NOSUB | REG_NEWLINE)))
+	    {
+	      T((T_CREATE("regex_t %p"), (void *)preg->pRegExp));
+	      if ((preg->refCount = typeMalloc(unsigned long, 1)) != 0)
+		 *(preg->refCount) = 1;
+	    }
+	  else
+	    {
+	      if (preg->pRegExp)
+		free(preg->pRegExp);
+	      free(preg);
+	      preg = (RegExp_Arg *)0;
+	    }
+	}
+    }
+  return ((void *)preg);
+#elif HAVE_REGEXP_H_FUNCS | HAVE_REGEXPR_H_FUNCS
+  char *rx = (char *)arg;
+  RegExp_Arg *pArg = (RegExp_Arg *)0;
+
+  if (rx)
+    {
+      pArg = typeMalloc(RegExp_Arg, 1);
+
+      if (pArg)
+	{
+	  int blen = RX_INCREMENT;
+
+	  T((T_CREATE("RegExp_Arg %p"), pArg));
+	  pArg->compiled_expression = NULL;
+	  if ((pArg->refCount = typeMalloc(unsigned long, 1)) != 0)
+	     *(pArg->refCount) = 1;
+
+	  do
+	    {
+	      char *buf = typeMalloc(char, blen);
+
+	      if (buf)
+		{
+#if HAVE_REGEXP_H_FUNCS
+		  char *last_pos = compile(rx, buf, &buf[blen], '\0');
+
+#else /* HAVE_REGEXPR_H_FUNCS */
+		  char *last_pos = compile(rx, buf, &buf[blen]);
+#endif
+		  if (reg_errno)
+		    {
+		      free(buf);
+		      if (reg_errno == 50)
+			blen += RX_INCREMENT;
+		      else
+			{
+			  free(pArg);
+			  pArg = NULL;
+			  break;
+			}
+		    }
+		  else
+		    {
+		      pArg->compiled_expression = buf;
+		      break;
+		    }
+		}
+	    }
+	  while (blen <= MAX_RX_LEN);
+	}
+      if (pArg && !pArg->compiled_expression)
+	{
+	  free(pArg);
+	  pArg = NULL;
+	}
+    }
+  return (void *)pArg;
+#else
+  return 0;
+#endif
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static void *Make_RegularExpression_Type(va_list * ap)
+|
+|   Description   :  Allocate structure for regex type argument.
+|
+|   Return Values :  Pointer to argument structure or NULL on error
++--------------------------------------------------------------------------*/
+static void *
+Make_RegularExpression_Type(va_list *ap)
+{
+  char *rx = va_arg(*ap, char *);
+
+  return Generic_RegularExpression_Type((void *)rx);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static void *Copy_RegularExpression_Type(
+|                                      const void * argp)
+|
+|   Description   :  Copy structure for regex type argument.
+|
+|   Return Values :  Pointer to argument structure or NULL on error.
++--------------------------------------------------------------------------*/
+static void *
+Copy_RegularExpression_Type(const void *argp MAYBE_UNUSED)
+{
+#if (HAVE_REGEX_H_FUNCS | HAVE_REGEXP_H_FUNCS | HAVE_REGEXPR_H_FUNCS)
+  const RegExp_Arg *ap = (const RegExp_Arg *)argp;
+  const RegExp_Arg *result = (const RegExp_Arg *)0;
+
+  if (ap)
+    {
+      *(ap->refCount) += 1;
+      result = ap;
+    }
+  return (void *)result;
+#else
+  return 0;
+#endif
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static void Free_RegularExpression_Type(void * argp)
+|
+|   Description   :  Free structure for regex type argument.
+|
+|   Return Values :  -
++--------------------------------------------------------------------------*/
+static void
+Free_RegularExpression_Type(void *argp MAYBE_UNUSED)
+{
+#if HAVE_REGEX_H_FUNCS | HAVE_REGEXP_H_FUNCS | HAVE_REGEXPR_H_FUNCS
+  RegExp_Arg *ap = (RegExp_Arg *)argp;
+
+  if (ap)
+    {
+      if (--(*(ap->refCount)) == 0)
+	{
+#if HAVE_REGEX_H_FUNCS
+	  if (ap->pRegExp)
+	    {
+	      free(ap->refCount);
+	      regfree(ap->pRegExp);
+	      free(ap->pRegExp);
+	    }
+#elif HAVE_REGEXP_H_FUNCS | HAVE_REGEXPR_H_FUNCS
+	  if (ap->compiled_expression)
+	    {
+	      free(ap->refCount);
+	      free(ap->compiled_expression);
+	    }
+#endif
+	  free(ap);
+	}
+    }
+#endif
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnform
+|   Function      :  static bool Check_RegularExpression_Field(
+|                                      FIELD * field,
+|                                      const void  * argp)
+|
+|   Description   :  Validate buffer content to be a valid regular expression
+|
+|   Return Values :  TRUE  - field is valid
+|                    FALSE - field is invalid
++--------------------------------------------------------------------------*/
+static bool
+Check_RegularExpression_Field(FIELD *field MAYBE_UNUSED,
+			      const void *argp MAYBE_UNUSED)
+{
+  bool match = FALSE;
+
+#if HAVE_REGEX_H_FUNCS
+  const RegExp_Arg *ap = (const RegExp_Arg *)argp;
+
+  if (ap && ap->pRegExp)
+    match = (regexec(ap->pRegExp, field_buffer(field, 0), 0, NULL, 0)
+	     ? FALSE
+	     : TRUE);
+#elif HAVE_REGEXP_H_FUNCS | HAVE_REGEXPR_H_FUNCS
+  RegExp_Arg *ap = (RegExp_Arg *)argp;
+
+  if (ap && ap->compiled_expression)
+    match = (step(field_buffer(field, 0), ap->compiled_expression)
+	     ? TRUE
+	     : FALSE);
+#endif
+  return match;
+}
+
+static FIELDTYPE typeREGEXP =
+{
+  _HAS_ARGS | _RESIDENT,
+  1,				/* this is mutable, so we can't be const */
+  (FIELDTYPE *)0,
+  (FIELDTYPE *)0,
+  Make_RegularExpression_Type,
+  Copy_RegularExpression_Type,
+  Free_RegularExpression_Type,
+  INIT_FT_FUNC(Check_RegularExpression_Field),
+  INIT_FT_FUNC(NULL),
+  INIT_FT_FUNC(NULL),
+  INIT_FT_FUNC(NULL),
+#if NCURSES_INTEROP_FUNCS
+  Generic_RegularExpression_Type
+#endif
+};
+
+FORM_EXPORT_VAR(FIELDTYPE *) TYPE_REGEXP = &typeREGEXP;
+
+#if NCURSES_INTEROP_FUNCS
+/* The next routines are to simplify the use of ncurses from
+   programming languages with restrictions on interop with C level
+   constructs (e.g. variable access or va_list + ellipsis constructs)
+*/
+FORM_EXPORT(FIELDTYPE *)
+_nc_TYPE_REGEXP(void)
+{
+  return TYPE_REGEXP;
+}
+#endif
+
+/* fty_regex.c ends here */
diff --git a/form/headers b/form/headers
new file mode 100644
index 0000000..0969e3f
--- /dev/null
+++ b/form/headers
@@ -0,0 +1,33 @@
+##############################################################################
+# Copyright 2020 Thomas E. Dickey                                            #
+# Copyright 1998,2006 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey <dickey@clark.net> 1996
+#
+$(srcdir)/form.h
+# vile:makemode
diff --git a/form/llib-lform b/form/llib-lform
new file mode 100644
index 0000000..334f8cb
--- /dev/null
+++ b/form/llib-lform
@@ -0,0 +1,847 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2015,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey       1996-on                                  *
+ ****************************************************************************/
+/* LINTLIBRARY */
+
+/* ./f_trace.c */
+
+#include <form.priv.h>
+
+#undef _nc_retrace_field_ptr
+FIELD	**_nc_retrace_field_ptr(
+		FIELD	**code)
+		{ return(*(FIELD ***)0); }
+
+#undef _nc_retrace_field
+FIELD	*_nc_retrace_field(
+		FIELD	*code)
+		{ return(*(FIELD **)0); }
+
+#undef _nc_retrace_field_type
+FIELDTYPE *_nc_retrace_field_type(
+		FIELDTYPE *code)
+		{ return(*(FIELDTYPE **)0); }
+
+#undef _nc_retrace_form
+FORM	*_nc_retrace_form(
+		FORM	*code)
+		{ return(*(FORM **)0); }
+
+#undef _nc_retrace_form_hook
+Form_Hook _nc_retrace_form_hook(
+		Form_Hook code)
+		{ return(*(Form_Hook *)0); }
+
+/* ./fld_arg.c */
+
+#undef set_fieldtype_arg
+int	set_fieldtype_arg(
+		FIELDTYPE *typ,
+		void	*(*const make_arg)(
+		va_list	*p1),
+		void	*(*const copy_arg)(
+		const void *p1),
+		void	(*const free_arg)(
+		void	*p1))
+		{ return(*(int *)0); }
+
+#undef field_arg
+void	*field_arg(
+		const FIELD *field)
+		{ return(*(void **)0); }
+
+/* ./fld_attr.c */
+
+#undef set_field_fore
+int	set_field_fore(
+		FIELD	*field,
+		chtype	attr)
+		{ return(*(int *)0); }
+
+#undef field_fore
+chtype	field_fore(
+		const FIELD *field)
+		{ return(*(chtype *)0); }
+
+#undef set_field_back
+int	set_field_back(
+		FIELD	*field,
+		chtype	attr)
+		{ return(*(int *)0); }
+
+#undef field_back
+chtype	field_back(
+		const FIELD *field)
+		{ return(*(chtype *)0); }
+
+/* ./fld_current.c */
+
+#undef set_current_field
+int	set_current_field(
+		FORM	*form,
+		FIELD	*field)
+		{ return(*(int *)0); }
+
+#undef unfocus_current_field
+int	unfocus_current_field(
+		FORM	*const form)
+		{ return(*(int *)0); }
+
+#undef current_field
+FIELD	*current_field(
+		const FORM *form)
+		{ return(*(FIELD **)0); }
+
+#undef field_index
+int	field_index(
+		const FIELD *field)
+		{ return(*(int *)0); }
+
+/* ./fld_def.c */
+
+#undef _nc_Default_Field
+FIELD	*_nc_Default_Field;
+
+#undef _nc_Make_Argument
+TypeArgument *_nc_Make_Argument(
+		const FIELDTYPE *typ,
+		va_list	*ap,
+		int	*err)
+		{ return(*(TypeArgument **)0); }
+
+#undef _nc_Copy_Argument
+TypeArgument *_nc_Copy_Argument(
+		const FIELDTYPE *typ,
+		const TypeArgument *argp,
+		int	*err)
+		{ return(*(TypeArgument **)0); }
+
+#undef _nc_Free_Argument
+void	_nc_Free_Argument(
+		const FIELDTYPE *typ,
+		TypeArgument *argp)
+		{ /* void */ }
+
+#undef _nc_Copy_Type
+NCURSES_BOOL _nc_Copy_Type(
+		FIELD	*dst,
+		FIELD const *src)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_Free_Type
+void	_nc_Free_Type(
+		FIELD	*field)
+		{ /* void */ }
+
+#undef new_field
+FIELD	*new_field(
+		int	rows,
+		int	cols,
+		int	frow,
+		int	fcol,
+		int	nrow,
+		int	nbuf)
+		{ return(*(FIELD **)0); }
+
+#undef free_field
+int	free_field(
+		FIELD	*field)
+		{ return(*(int *)0); }
+
+/* ./fld_dup.c */
+
+#undef dup_field
+FIELD	*dup_field(
+		FIELD	*field,
+		int	frow,
+		int	fcol)
+		{ return(*(FIELD **)0); }
+
+/* ./fld_ftchoice.c */
+
+#undef set_fieldtype_choice
+int	set_fieldtype_choice(
+		FIELDTYPE *typ,
+		NCURSES_BOOL (*const next_choice)(
+		FIELD	*p1,
+		const void *p2),
+		NCURSES_BOOL (*const prev_choice)(
+		FIELD	*p1,
+		const void *p2))
+		{ return(*(int *)0); }
+
+/* ./fld_ftlink.c */
+
+#undef link_fieldtype
+FIELDTYPE *link_fieldtype(
+		FIELDTYPE *type1,
+		FIELDTYPE *type2)
+		{ return(*(FIELDTYPE **)0); }
+
+/* ./fld_info.c */
+
+#undef field_info
+int	field_info(
+		const FIELD *field,
+		int	*rows,
+		int	*cols,
+		int	*frow,
+		int	*fcol,
+		int	*nrow,
+		int	*nbuf)
+		{ return(*(int *)0); }
+
+#undef dynamic_field_info
+int	dynamic_field_info(
+		const FIELD *field,
+		int	*drows,
+		int	*dcols,
+		int	*maxgrow)
+		{ return(*(int *)0); }
+
+/* ./fld_just.c */
+
+#undef set_field_just
+int	set_field_just(
+		FIELD	*field,
+		int	just)
+		{ return(*(int *)0); }
+
+#undef field_just
+int	field_just(
+		const FIELD *field)
+		{ return(*(int *)0); }
+
+/* ./fld_link.c */
+
+#undef link_field
+FIELD	*link_field(
+		FIELD	*field,
+		int	frow,
+		int	fcol)
+		{ return(*(FIELD **)0); }
+
+/* ./fld_max.c */
+
+#undef set_max_field
+int	set_max_field(
+		FIELD	*field,
+		int	maxgrow)
+		{ return(*(int *)0); }
+
+/* ./fld_move.c */
+
+#undef move_field
+int	move_field(
+		FIELD	*field,
+		int	frow,
+		int	fcol)
+		{ return(*(int *)0); }
+
+/* ./fld_newftyp.c */
+
+#undef _nc_Default_FieldType
+FIELDTYPE *_nc_Default_FieldType;
+
+#undef new_fieldtype
+FIELDTYPE *new_fieldtype(
+		NCURSES_BOOL (*const field_check)(
+		FIELD	*p1,
+		const void *p2),
+		NCURSES_BOOL (*const char_check)(
+		int	p1,
+		const void *p2))
+		{ return(*(FIELDTYPE **)0); }
+
+#undef free_fieldtype
+int	free_fieldtype(
+		FIELDTYPE *typ)
+		{ return(*(int *)0); }
+
+/* ./fld_opts.c */
+
+#undef set_field_opts
+int	set_field_opts(
+		FIELD	*field,
+		Field_Options opts)
+		{ return(*(int *)0); }
+
+#undef field_opts
+Field_Options field_opts(
+		const FIELD *field)
+		{ return(*(Field_Options *)0); }
+
+#undef field_opts_on
+int	field_opts_on(
+		FIELD	*field,
+		Field_Options opts)
+		{ return(*(int *)0); }
+
+#undef field_opts_off
+int	field_opts_off(
+		FIELD	*field,
+		Field_Options opts)
+		{ return(*(int *)0); }
+
+/* ./fld_pad.c */
+
+#undef set_field_pad
+int	set_field_pad(
+		FIELD	*field,
+		int	ch)
+		{ return(*(int *)0); }
+
+#undef field_pad
+int	field_pad(
+		const FIELD *field)
+		{ return(*(int *)0); }
+
+/* ./fld_page.c */
+
+#undef set_new_page
+int	set_new_page(
+		FIELD	*field,
+		NCURSES_BOOL new_page_flag)
+		{ return(*(int *)0); }
+
+#undef new_page
+NCURSES_BOOL new_page(
+		const FIELD *field)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./fld_stat.c */
+
+#undef set_field_status
+int	set_field_status(
+		FIELD	*field,
+		NCURSES_BOOL status)
+		{ return(*(int *)0); }
+
+#undef field_status
+NCURSES_BOOL field_status(
+		const FIELD *field)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./fld_type.c */
+
+#undef set_field_type
+int	set_field_type(
+		FIELD	*field,
+		FIELDTYPE *type,
+		...)
+		{ return(*(int *)0); }
+
+#undef field_type
+FIELDTYPE *field_type(
+		const FIELD *field)
+		{ return(*(FIELDTYPE **)0); }
+
+/* ./fld_user.c */
+
+#undef set_field_userptr
+int	set_field_userptr(
+		FIELD	*field,
+		void	*usrptr)
+		{ return(*(int *)0); }
+
+#undef field_userptr
+void	*field_userptr(
+		const FIELD *field)
+		{ return(*(void **)0); }
+
+/* ./frm_cursor.c */
+
+#undef pos_form_cursor
+int	pos_form_cursor(
+		FORM	*form)
+		{ return(*(int *)0); }
+
+/* ./frm_data.c */
+
+#undef data_behind
+NCURSES_BOOL data_behind(
+		const FORM *form)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef data_ahead
+NCURSES_BOOL data_ahead(
+		const FORM *form)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./frm_def.c */
+
+#undef _nc_Default_Form
+FORM	*_nc_Default_Form;
+
+#undef new_form_sp
+FORM	*new_form_sp(
+		SCREEN	*sp,
+		FIELD	**fields)
+		{ return(*(FORM **)0); }
+
+#undef new_form
+FORM	*new_form(
+		FIELD	**fields)
+		{ return(*(FORM **)0); }
+
+#undef free_form
+int	free_form(
+		FORM	*form)
+		{ return(*(int *)0); }
+
+#undef set_form_fields
+int	set_form_fields(
+		FORM	*form,
+		FIELD	**fields)
+		{ return(*(int *)0); }
+
+#undef form_fields
+FIELD	**form_fields(
+		const FORM *form)
+		{ return(*(FIELD ***)0); }
+
+#undef field_count
+int	field_count(
+		const FORM *form)
+		{ return(*(int *)0); }
+
+/* ./frm_driver.c */
+
+#undef _nc_get_fieldbuffer
+void	_nc_get_fieldbuffer(
+		FORM	*form,
+		FIELD	*field,
+		char	*buf)
+		{ /* void */ }
+
+#undef _nc_Position_Form_Cursor
+int	_nc_Position_Form_Cursor(
+		FORM	*form)
+		{ return(*(int *)0); }
+
+#undef _nc_Refresh_Current_Field
+int	_nc_Refresh_Current_Field(
+		FORM	*form)
+		{ return(*(int *)0); }
+
+#undef _nc_Synchronize_Attributes
+int	_nc_Synchronize_Attributes(
+		FIELD	*field)
+		{ return(*(int *)0); }
+
+#undef _nc_Synchronize_Options
+int	_nc_Synchronize_Options(
+		FIELD	*field,
+		Field_Options newopts)
+		{ return(*(int *)0); }
+
+#undef _nc_Unset_Current_Field
+void	_nc_Unset_Current_Field(
+		FORM	*form)
+		{ /* void */ }
+
+#undef _nc_Set_Current_Field
+int	_nc_Set_Current_Field(
+		FORM	*form,
+		FIELD	*newfield)
+		{ return(*(int *)0); }
+
+#undef _nc_Internal_Validation
+NCURSES_BOOL _nc_Internal_Validation(
+		FORM	*form)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_First_Active_Field
+FIELD	*_nc_First_Active_Field(
+		FORM	*form)
+		{ return(*(FIELD **)0); }
+
+#undef _nc_Set_Form_Page
+int	_nc_Set_Form_Page(
+		FORM	*form,
+		int	page,
+		FIELD	*field)
+		{ return(*(int *)0); }
+
+typedef struct
+{
+  int keycode;
+  int (*cmd) (FORM *);
+}
+Binding_Info;
+
+#undef form_driver
+int	form_driver(
+		FORM	*form,
+		int	c)
+		{ return(*(int *)0); }
+
+#undef set_field_buffer
+int	set_field_buffer(
+		FIELD	*field,
+		int	buffer,
+		const char *value)
+		{ return(*(int *)0); }
+
+#undef field_buffer
+char	*field_buffer(
+		const FIELD *field,
+		int	buffer)
+		{ return(*(char **)0); }
+
+/* ./frm_hook.c */
+
+#undef set_field_init
+int	set_field_init(
+		FORM	*form,
+		Form_Hook func)
+		{ return(*(int *)0); }
+
+#undef field_init
+Form_Hook field_init(
+		const FORM *form)
+		{ return(*(Form_Hook *)0); }
+
+#undef set_field_term
+int	set_field_term(
+		FORM	*form,
+		Form_Hook func)
+		{ return(*(int *)0); }
+
+#undef field_term
+Form_Hook field_term(
+		const FORM *form)
+		{ return(*(Form_Hook *)0); }
+
+#undef set_form_init
+int	set_form_init(
+		FORM	*form,
+		Form_Hook func)
+		{ return(*(int *)0); }
+
+#undef form_init
+Form_Hook form_init(
+		const FORM *form)
+		{ return(*(Form_Hook *)0); }
+
+#undef set_form_term
+int	set_form_term(
+		FORM	*form,
+		Form_Hook func)
+		{ return(*(int *)0); }
+
+#undef form_term
+Form_Hook form_term(
+		const FORM *form)
+		{ return(*(Form_Hook *)0); }
+
+/* ./frm_opts.c */
+
+#undef set_form_opts
+int	set_form_opts(
+		FORM	*form,
+		Form_Options opts)
+		{ return(*(int *)0); }
+
+#undef form_opts
+Form_Options form_opts(
+		const FORM *form)
+		{ return(*(Form_Options *)0); }
+
+#undef form_opts_on
+int	form_opts_on(
+		FORM	*form,
+		Form_Options opts)
+		{ return(*(int *)0); }
+
+#undef form_opts_off
+int	form_opts_off(
+		FORM	*form,
+		Form_Options opts)
+		{ return(*(int *)0); }
+
+/* ./frm_page.c */
+
+#undef set_form_page
+int	set_form_page(
+		FORM	*form,
+		int	page)
+		{ return(*(int *)0); }
+
+#undef form_page
+int	form_page(
+		const FORM *form)
+		{ return(*(int *)0); }
+
+/* ./frm_post.c */
+
+#undef post_form
+int	post_form(
+		FORM	*form)
+		{ return(*(int *)0); }
+
+#undef unpost_form
+int	unpost_form(
+		FORM	*form)
+		{ return(*(int *)0); }
+
+/* ./frm_req_name.c */
+
+#undef form_request_name
+const char *form_request_name(
+		int	request)
+		{ return(*(const char **)0); }
+
+#undef form_request_by_name
+int	form_request_by_name(
+		const char *str)
+		{ return(*(int *)0); }
+
+/* ./frm_scale.c */
+
+#undef scale_form
+int	scale_form(
+		const FORM *form,
+		int	*rows,
+		int	*cols)
+		{ return(*(int *)0); }
+
+/* ./frm_sub.c */
+
+#undef set_form_sub
+int	set_form_sub(
+		FORM	*form,
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+#undef form_sub
+WINDOW	*form_sub(
+		const FORM *form)
+		{ return(*(WINDOW **)0); }
+
+/* ./frm_user.c */
+
+#undef set_form_userptr
+int	set_form_userptr(
+		FORM	*form,
+		void	*usrptr)
+		{ return(*(int *)0); }
+
+#undef form_userptr
+void	*form_userptr(
+		const FORM *form)
+		{ return(*(void **)0); }
+
+/* ./frm_win.c */
+
+#undef set_form_win
+int	set_form_win(
+		FORM	*form,
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+#undef form_win
+WINDOW	*form_win(
+		const FORM *form)
+		{ return(*(WINDOW **)0); }
+
+/* ./fty_alnum.c */
+
+typedef struct
+  {
+    int width;
+  }
+alnumARG;
+
+#undef TYPE_ALNUM
+FIELDTYPE *TYPE_ALNUM;
+
+#undef _nc_TYPE_ALNUM
+FIELDTYPE *_nc_TYPE_ALNUM(void)
+		{ return(*(FIELDTYPE **)0); }
+
+/* ./fty_alpha.c */
+
+typedef struct
+  {
+    int width;
+  }
+alphaARG;
+
+#undef TYPE_ALPHA
+FIELDTYPE *TYPE_ALPHA;
+
+#undef _nc_TYPE_ALPHA
+FIELDTYPE *_nc_TYPE_ALPHA(void)
+		{ return(*(FIELDTYPE **)0); }
+
+/* ./fty_enum.c */
+
+typedef struct
+  {
+    char **kwds;
+    int count;
+    NCURSES_BOOL checkcase;
+    NCURSES_BOOL checkunique;
+  }
+enumARG;
+
+typedef struct
+  {
+    char **kwds;
+    int ccase;
+    int cunique;
+  }
+enumParams;
+
+#undef TYPE_ENUM
+FIELDTYPE *TYPE_ENUM;
+
+#undef _nc_TYPE_ENUM
+FIELDTYPE *_nc_TYPE_ENUM(void)
+		{ return(*(FIELDTYPE **)0); }
+
+/* ./fty_generic.c */
+
+#undef _nc_generic_fieldtype
+FIELDTYPE *_nc_generic_fieldtype(
+		NCURSES_BOOL (*const field_check)(
+		FORM	*p1,
+		FIELD	*p2,
+		const void *p3),
+		NCURSES_BOOL (*const char_check)(
+		int	p1,
+		FORM	*p2,
+		FIELD	*p3,
+		const void *p4),
+		NCURSES_BOOL (*const next)(
+		FORM	*p1,
+		FIELD	*p2,
+		const void *p3),
+		NCURSES_BOOL (*const prev)(
+		FORM	*p1,
+		FIELD	*p2,
+		const void *p3),
+		void	(*freecallback)(
+		void	*p1))
+		{ return(*(FIELDTYPE **)0); }
+
+#undef _nc_set_generic_fieldtype
+int	_nc_set_generic_fieldtype(
+		FIELD	*field,
+		FIELDTYPE *ftyp,
+		int	(*argiterator)(
+		void	**p1))
+		{ return(*(int *)0); }
+
+#undef _nc_form_cursor
+WINDOW	*_nc_form_cursor(
+		const FORM *form,
+		int	*pRow,
+		int	*pCol)
+		{ return(*(WINDOW **)0); }
+
+/* ./fty_int.c */
+
+typedef struct
+  {
+    int precision;
+    long low;
+    long high;
+  }
+integerARG;
+
+typedef struct
+  {
+    int precision;
+    long low;
+    long high;
+  }
+integerPARM;
+
+#undef TYPE_INTEGER
+FIELDTYPE *TYPE_INTEGER;
+
+#undef _nc_TYPE_INTEGER
+FIELDTYPE *_nc_TYPE_INTEGER(void)
+		{ return(*(FIELDTYPE **)0); }
+
+/* ./fty_ipv4.c */
+
+#undef TYPE_IPV4
+FIELDTYPE *TYPE_IPV4;
+
+#undef _nc_TYPE_IPV4
+FIELDTYPE *_nc_TYPE_IPV4(void)
+		{ return(*(FIELDTYPE **)0); }
+
+/* ./fty_num.c */
+
+typedef struct
+  {
+    int precision;
+    double low;
+    double high;
+    struct lconv *L;
+  }
+numericARG;
+
+typedef struct
+  {
+    int precision;
+    double low;
+    double high;
+  }
+thisPARM;
+
+#undef TYPE_NUMERIC
+FIELDTYPE *TYPE_NUMERIC;
+
+#undef _nc_TYPE_NUMERIC
+FIELDTYPE *_nc_TYPE_NUMERIC(void)
+		{ return(*(FIELDTYPE **)0); }
+
+/* ./fty_regex.c */
+
+typedef struct
+  {
+    regex_t *pRegExp;
+    unsigned long *refCount;
+  }
+RegExp_Arg;
+
+#undef TYPE_REGEXP
+FIELDTYPE *TYPE_REGEXP;
+
+#undef _nc_TYPE_REGEXP
+FIELDTYPE *_nc_TYPE_REGEXP(void)
+		{ return(*(FIELDTYPE **)0); }
diff --git a/form/llib-lformt b/form/llib-lformt
new file mode 100644
index 0000000..d91b3f0
--- /dev/null
+++ b/form/llib-lformt
@@ -0,0 +1,847 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 2010-2015,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey       2010-on                                  *
+ ****************************************************************************/
+/* LINTLIBRARY */
+
+/* ./f_trace.c */
+
+#include <form.priv.h>
+
+#undef _nc_retrace_field_ptr
+FIELD	**_nc_retrace_field_ptr(
+		FIELD	**code)
+		{ return(*(FIELD ***)0); }
+
+#undef _nc_retrace_field
+FIELD	*_nc_retrace_field(
+		FIELD	*code)
+		{ return(*(FIELD **)0); }
+
+#undef _nc_retrace_field_type
+FIELDTYPE *_nc_retrace_field_type(
+		FIELDTYPE *code)
+		{ return(*(FIELDTYPE **)0); }
+
+#undef _nc_retrace_form
+FORM	*_nc_retrace_form(
+		FORM	*code)
+		{ return(*(FORM **)0); }
+
+#undef _nc_retrace_form_hook
+Form_Hook _nc_retrace_form_hook(
+		Form_Hook code)
+		{ return(*(Form_Hook *)0); }
+
+/* ./fld_arg.c */
+
+#undef set_fieldtype_arg
+int	set_fieldtype_arg(
+		FIELDTYPE *typ,
+		void	*(*const make_arg)(
+		va_list	*p1),
+		void	*(*const copy_arg)(
+		const void *p1),
+		void	(*const free_arg)(
+		void	*p1))
+		{ return(*(int *)0); }
+
+#undef field_arg
+void	*field_arg(
+		const FIELD *field)
+		{ return(*(void **)0); }
+
+/* ./fld_attr.c */
+
+#undef set_field_fore
+int	set_field_fore(
+		FIELD	*field,
+		chtype	attr)
+		{ return(*(int *)0); }
+
+#undef field_fore
+chtype	field_fore(
+		const FIELD *field)
+		{ return(*(chtype *)0); }
+
+#undef set_field_back
+int	set_field_back(
+		FIELD	*field,
+		chtype	attr)
+		{ return(*(int *)0); }
+
+#undef field_back
+chtype	field_back(
+		const FIELD *field)
+		{ return(*(chtype *)0); }
+
+/* ./fld_current.c */
+
+#undef set_current_field
+int	set_current_field(
+		FORM	*form,
+		FIELD	*field)
+		{ return(*(int *)0); }
+
+#undef unfocus_current_field
+int	unfocus_current_field(
+		FORM	*const form)
+		{ return(*(int *)0); }
+
+#undef current_field
+FIELD	*current_field(
+		const FORM *form)
+		{ return(*(FIELD **)0); }
+
+#undef field_index
+int	field_index(
+		const FIELD *field)
+		{ return(*(int *)0); }
+
+/* ./fld_def.c */
+
+#undef _nc_Default_Field
+FIELD	*_nc_Default_Field;
+
+#undef _nc_Make_Argument
+TypeArgument *_nc_Make_Argument(
+		const FIELDTYPE *typ,
+		va_list	*ap,
+		int	*err)
+		{ return(*(TypeArgument **)0); }
+
+#undef _nc_Copy_Argument
+TypeArgument *_nc_Copy_Argument(
+		const FIELDTYPE *typ,
+		const TypeArgument *argp,
+		int	*err)
+		{ return(*(TypeArgument **)0); }
+
+#undef _nc_Free_Argument
+void	_nc_Free_Argument(
+		const FIELDTYPE *typ,
+		TypeArgument *argp)
+		{ /* void */ }
+
+#undef _nc_Copy_Type
+NCURSES_BOOL _nc_Copy_Type(
+		FIELD	*dst,
+		FIELD const *src)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_Free_Type
+void	_nc_Free_Type(
+		FIELD	*field)
+		{ /* void */ }
+
+#undef new_field
+FIELD	*new_field(
+		int	rows,
+		int	cols,
+		int	frow,
+		int	fcol,
+		int	nrow,
+		int	nbuf)
+		{ return(*(FIELD **)0); }
+
+#undef free_field
+int	free_field(
+		FIELD	*field)
+		{ return(*(int *)0); }
+
+/* ./fld_dup.c */
+
+#undef dup_field
+FIELD	*dup_field(
+		FIELD	*field,
+		int	frow,
+		int	fcol)
+		{ return(*(FIELD **)0); }
+
+/* ./fld_ftchoice.c */
+
+#undef set_fieldtype_choice
+int	set_fieldtype_choice(
+		FIELDTYPE *typ,
+		NCURSES_BOOL (*const next_choice)(
+		FIELD	*p1,
+		const void *p2),
+		NCURSES_BOOL (*const prev_choice)(
+		FIELD	*p1,
+		const void *p2))
+		{ return(*(int *)0); }
+
+/* ./fld_ftlink.c */
+
+#undef link_fieldtype
+FIELDTYPE *link_fieldtype(
+		FIELDTYPE *type1,
+		FIELDTYPE *type2)
+		{ return(*(FIELDTYPE **)0); }
+
+/* ./fld_info.c */
+
+#undef field_info
+int	field_info(
+		const FIELD *field,
+		int	*rows,
+		int	*cols,
+		int	*frow,
+		int	*fcol,
+		int	*nrow,
+		int	*nbuf)
+		{ return(*(int *)0); }
+
+#undef dynamic_field_info
+int	dynamic_field_info(
+		const FIELD *field,
+		int	*drows,
+		int	*dcols,
+		int	*maxgrow)
+		{ return(*(int *)0); }
+
+/* ./fld_just.c */
+
+#undef set_field_just
+int	set_field_just(
+		FIELD	*field,
+		int	just)
+		{ return(*(int *)0); }
+
+#undef field_just
+int	field_just(
+		const FIELD *field)
+		{ return(*(int *)0); }
+
+/* ./fld_link.c */
+
+#undef link_field
+FIELD	*link_field(
+		FIELD	*field,
+		int	frow,
+		int	fcol)
+		{ return(*(FIELD **)0); }
+
+/* ./fld_max.c */
+
+#undef set_max_field
+int	set_max_field(
+		FIELD	*field,
+		int	maxgrow)
+		{ return(*(int *)0); }
+
+/* ./fld_move.c */
+
+#undef move_field
+int	move_field(
+		FIELD	*field,
+		int	frow,
+		int	fcol)
+		{ return(*(int *)0); }
+
+/* ./fld_newftyp.c */
+
+#undef _nc_Default_FieldType
+FIELDTYPE *_nc_Default_FieldType;
+
+#undef new_fieldtype
+FIELDTYPE *new_fieldtype(
+		NCURSES_BOOL (*const field_check)(
+		FIELD	*p1,
+		const void *p2),
+		NCURSES_BOOL (*const char_check)(
+		int	p1,
+		const void *p2))
+		{ return(*(FIELDTYPE **)0); }
+
+#undef free_fieldtype
+int	free_fieldtype(
+		FIELDTYPE *typ)
+		{ return(*(int *)0); }
+
+/* ./fld_opts.c */
+
+#undef set_field_opts
+int	set_field_opts(
+		FIELD	*field,
+		Field_Options opts)
+		{ return(*(int *)0); }
+
+#undef field_opts
+Field_Options field_opts(
+		const FIELD *field)
+		{ return(*(Field_Options *)0); }
+
+#undef field_opts_on
+int	field_opts_on(
+		FIELD	*field,
+		Field_Options opts)
+		{ return(*(int *)0); }
+
+#undef field_opts_off
+int	field_opts_off(
+		FIELD	*field,
+		Field_Options opts)
+		{ return(*(int *)0); }
+
+/* ./fld_pad.c */
+
+#undef set_field_pad
+int	set_field_pad(
+		FIELD	*field,
+		int	ch)
+		{ return(*(int *)0); }
+
+#undef field_pad
+int	field_pad(
+		const FIELD *field)
+		{ return(*(int *)0); }
+
+/* ./fld_page.c */
+
+#undef set_new_page
+int	set_new_page(
+		FIELD	*field,
+		NCURSES_BOOL new_page_flag)
+		{ return(*(int *)0); }
+
+#undef new_page
+NCURSES_BOOL new_page(
+		const FIELD *field)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./fld_stat.c */
+
+#undef set_field_status
+int	set_field_status(
+		FIELD	*field,
+		NCURSES_BOOL status)
+		{ return(*(int *)0); }
+
+#undef field_status
+NCURSES_BOOL field_status(
+		const FIELD *field)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./fld_type.c */
+
+#undef set_field_type
+int	set_field_type(
+		FIELD	*field,
+		FIELDTYPE *type,
+		...)
+		{ return(*(int *)0); }
+
+#undef field_type
+FIELDTYPE *field_type(
+		const FIELD *field)
+		{ return(*(FIELDTYPE **)0); }
+
+/* ./fld_user.c */
+
+#undef set_field_userptr
+int	set_field_userptr(
+		FIELD	*field,
+		void	*usrptr)
+		{ return(*(int *)0); }
+
+#undef field_userptr
+void	*field_userptr(
+		const FIELD *field)
+		{ return(*(void **)0); }
+
+/* ./frm_cursor.c */
+
+#undef pos_form_cursor
+int	pos_form_cursor(
+		FORM	*form)
+		{ return(*(int *)0); }
+
+/* ./frm_data.c */
+
+#undef data_behind
+NCURSES_BOOL data_behind(
+		const FORM *form)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef data_ahead
+NCURSES_BOOL data_ahead(
+		const FORM *form)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./frm_def.c */
+
+#undef _nc_Default_Form
+FORM	*_nc_Default_Form;
+
+#undef new_form_sp
+FORM	*new_form_sp(
+		SCREEN	*sp,
+		FIELD	**fields)
+		{ return(*(FORM **)0); }
+
+#undef new_form
+FORM	*new_form(
+		FIELD	**fields)
+		{ return(*(FORM **)0); }
+
+#undef free_form
+int	free_form(
+		FORM	*form)
+		{ return(*(int *)0); }
+
+#undef set_form_fields
+int	set_form_fields(
+		FORM	*form,
+		FIELD	**fields)
+		{ return(*(int *)0); }
+
+#undef form_fields
+FIELD	**form_fields(
+		const FORM *form)
+		{ return(*(FIELD ***)0); }
+
+#undef field_count
+int	field_count(
+		const FORM *form)
+		{ return(*(int *)0); }
+
+/* ./frm_driver.c */
+
+#undef _nc_get_fieldbuffer
+void	_nc_get_fieldbuffer(
+		FORM	*form,
+		FIELD	*field,
+		char	*buf)
+		{ /* void */ }
+
+#undef _nc_Position_Form_Cursor
+int	_nc_Position_Form_Cursor(
+		FORM	*form)
+		{ return(*(int *)0); }
+
+#undef _nc_Refresh_Current_Field
+int	_nc_Refresh_Current_Field(
+		FORM	*form)
+		{ return(*(int *)0); }
+
+#undef _nc_Synchronize_Attributes
+int	_nc_Synchronize_Attributes(
+		FIELD	*field)
+		{ return(*(int *)0); }
+
+#undef _nc_Synchronize_Options
+int	_nc_Synchronize_Options(
+		FIELD	*field,
+		Field_Options newopts)
+		{ return(*(int *)0); }
+
+#undef _nc_Unset_Current_Field
+void	_nc_Unset_Current_Field(
+		FORM	*form)
+		{ /* void */ }
+
+#undef _nc_Set_Current_Field
+int	_nc_Set_Current_Field(
+		FORM	*form,
+		FIELD	*newfield)
+		{ return(*(int *)0); }
+
+#undef _nc_Internal_Validation
+NCURSES_BOOL _nc_Internal_Validation(
+		FORM	*form)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_First_Active_Field
+FIELD	*_nc_First_Active_Field(
+		FORM	*form)
+		{ return(*(FIELD **)0); }
+
+#undef _nc_Set_Form_Page
+int	_nc_Set_Form_Page(
+		FORM	*form,
+		int	page,
+		FIELD	*field)
+		{ return(*(int *)0); }
+
+typedef struct
+{
+  int keycode;
+  int (*cmd) (FORM *);
+}
+Binding_Info;
+
+#undef form_driver
+int	form_driver(
+		FORM	*form,
+		int	c)
+		{ return(*(int *)0); }
+
+#undef set_field_buffer
+int	set_field_buffer(
+		FIELD	*field,
+		int	buffer,
+		const char *value)
+		{ return(*(int *)0); }
+
+#undef field_buffer
+char	*field_buffer(
+		const FIELD *field,
+		int	buffer)
+		{ return(*(char **)0); }
+
+/* ./frm_hook.c */
+
+#undef set_field_init
+int	set_field_init(
+		FORM	*form,
+		Form_Hook func)
+		{ return(*(int *)0); }
+
+#undef field_init
+Form_Hook field_init(
+		const FORM *form)
+		{ return(*(Form_Hook *)0); }
+
+#undef set_field_term
+int	set_field_term(
+		FORM	*form,
+		Form_Hook func)
+		{ return(*(int *)0); }
+
+#undef field_term
+Form_Hook field_term(
+		const FORM *form)
+		{ return(*(Form_Hook *)0); }
+
+#undef set_form_init
+int	set_form_init(
+		FORM	*form,
+		Form_Hook func)
+		{ return(*(int *)0); }
+
+#undef form_init
+Form_Hook form_init(
+		const FORM *form)
+		{ return(*(Form_Hook *)0); }
+
+#undef set_form_term
+int	set_form_term(
+		FORM	*form,
+		Form_Hook func)
+		{ return(*(int *)0); }
+
+#undef form_term
+Form_Hook form_term(
+		const FORM *form)
+		{ return(*(Form_Hook *)0); }
+
+/* ./frm_opts.c */
+
+#undef set_form_opts
+int	set_form_opts(
+		FORM	*form,
+		Form_Options opts)
+		{ return(*(int *)0); }
+
+#undef form_opts
+Form_Options form_opts(
+		const FORM *form)
+		{ return(*(Form_Options *)0); }
+
+#undef form_opts_on
+int	form_opts_on(
+		FORM	*form,
+		Form_Options opts)
+		{ return(*(int *)0); }
+
+#undef form_opts_off
+int	form_opts_off(
+		FORM	*form,
+		Form_Options opts)
+		{ return(*(int *)0); }
+
+/* ./frm_page.c */
+
+#undef set_form_page
+int	set_form_page(
+		FORM	*form,
+		int	page)
+		{ return(*(int *)0); }
+
+#undef form_page
+int	form_page(
+		const FORM *form)
+		{ return(*(int *)0); }
+
+/* ./frm_post.c */
+
+#undef post_form
+int	post_form(
+		FORM	*form)
+		{ return(*(int *)0); }
+
+#undef unpost_form
+int	unpost_form(
+		FORM	*form)
+		{ return(*(int *)0); }
+
+/* ./frm_req_name.c */
+
+#undef form_request_name
+const char *form_request_name(
+		int	request)
+		{ return(*(const char **)0); }
+
+#undef form_request_by_name
+int	form_request_by_name(
+		const char *str)
+		{ return(*(int *)0); }
+
+/* ./frm_scale.c */
+
+#undef scale_form
+int	scale_form(
+		const FORM *form,
+		int	*rows,
+		int	*cols)
+		{ return(*(int *)0); }
+
+/* ./frm_sub.c */
+
+#undef set_form_sub
+int	set_form_sub(
+		FORM	*form,
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+#undef form_sub
+WINDOW	*form_sub(
+		const FORM *form)
+		{ return(*(WINDOW **)0); }
+
+/* ./frm_user.c */
+
+#undef set_form_userptr
+int	set_form_userptr(
+		FORM	*form,
+		void	*usrptr)
+		{ return(*(int *)0); }
+
+#undef form_userptr
+void	*form_userptr(
+		const FORM *form)
+		{ return(*(void **)0); }
+
+/* ./frm_win.c */
+
+#undef set_form_win
+int	set_form_win(
+		FORM	*form,
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+#undef form_win
+WINDOW	*form_win(
+		const FORM *form)
+		{ return(*(WINDOW **)0); }
+
+/* ./fty_alnum.c */
+
+typedef struct
+  {
+    int width;
+  }
+alnumARG;
+
+#undef TYPE_ALNUM
+FIELDTYPE *TYPE_ALNUM;
+
+#undef _nc_TYPE_ALNUM
+FIELDTYPE *_nc_TYPE_ALNUM(void)
+		{ return(*(FIELDTYPE **)0); }
+
+/* ./fty_alpha.c */
+
+typedef struct
+  {
+    int width;
+  }
+alphaARG;
+
+#undef TYPE_ALPHA
+FIELDTYPE *TYPE_ALPHA;
+
+#undef _nc_TYPE_ALPHA
+FIELDTYPE *_nc_TYPE_ALPHA(void)
+		{ return(*(FIELDTYPE **)0); }
+
+/* ./fty_enum.c */
+
+typedef struct
+  {
+    char **kwds;
+    int count;
+    NCURSES_BOOL checkcase;
+    NCURSES_BOOL checkunique;
+  }
+enumARG;
+
+typedef struct
+  {
+    char **kwds;
+    int ccase;
+    int cunique;
+  }
+enumParams;
+
+#undef TYPE_ENUM
+FIELDTYPE *TYPE_ENUM;
+
+#undef _nc_TYPE_ENUM
+FIELDTYPE *_nc_TYPE_ENUM(void)
+		{ return(*(FIELDTYPE **)0); }
+
+/* ./fty_generic.c */
+
+#undef _nc_generic_fieldtype
+FIELDTYPE *_nc_generic_fieldtype(
+		NCURSES_BOOL (*const field_check)(
+		FORM	*p1,
+		FIELD	*p2,
+		const void *p3),
+		NCURSES_BOOL (*const char_check)(
+		int	p1,
+		FORM	*p2,
+		FIELD	*p3,
+		const void *p4),
+		NCURSES_BOOL (*const next)(
+		FORM	*p1,
+		FIELD	*p2,
+		const void *p3),
+		NCURSES_BOOL (*const prev)(
+		FORM	*p1,
+		FIELD	*p2,
+		const void *p3),
+		void	(*freecallback)(
+		void	*p1))
+		{ return(*(FIELDTYPE **)0); }
+
+#undef _nc_set_generic_fieldtype
+int	_nc_set_generic_fieldtype(
+		FIELD	*field,
+		FIELDTYPE *ftyp,
+		int	(*argiterator)(
+		void	**p1))
+		{ return(*(int *)0); }
+
+#undef _nc_form_cursor
+WINDOW	*_nc_form_cursor(
+		const FORM *form,
+		int	*pRow,
+		int	*pCol)
+		{ return(*(WINDOW **)0); }
+
+/* ./fty_int.c */
+
+typedef struct
+  {
+    int precision;
+    long low;
+    long high;
+  }
+integerARG;
+
+typedef struct
+  {
+    int precision;
+    long low;
+    long high;
+  }
+integerPARM;
+
+#undef TYPE_INTEGER
+FIELDTYPE *TYPE_INTEGER;
+
+#undef _nc_TYPE_INTEGER
+FIELDTYPE *_nc_TYPE_INTEGER(void)
+		{ return(*(FIELDTYPE **)0); }
+
+/* ./fty_ipv4.c */
+
+#undef TYPE_IPV4
+FIELDTYPE *TYPE_IPV4;
+
+#undef _nc_TYPE_IPV4
+FIELDTYPE *_nc_TYPE_IPV4(void)
+		{ return(*(FIELDTYPE **)0); }
+
+/* ./fty_num.c */
+
+typedef struct
+  {
+    int precision;
+    double low;
+    double high;
+    struct lconv *L;
+  }
+numericARG;
+
+typedef struct
+  {
+    int precision;
+    double low;
+    double high;
+  }
+thisPARM;
+
+#undef TYPE_NUMERIC
+FIELDTYPE *TYPE_NUMERIC;
+
+#undef _nc_TYPE_NUMERIC
+FIELDTYPE *_nc_TYPE_NUMERIC(void)
+		{ return(*(FIELDTYPE **)0); }
+
+/* ./fty_regex.c */
+
+typedef struct
+  {
+    regex_t *pRegExp;
+    unsigned long *refCount;
+  }
+RegExp_Arg;
+
+#undef TYPE_REGEXP
+FIELDTYPE *TYPE_REGEXP;
+
+#undef _nc_TYPE_REGEXP
+FIELDTYPE *_nc_TYPE_REGEXP(void)
+		{ return(*(FIELDTYPE **)0); }
diff --git a/form/llib-lformtw b/form/llib-lformtw
new file mode 100644
index 0000000..340bf59
--- /dev/null
+++ b/form/llib-lformtw
@@ -0,0 +1,860 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 2010-2015,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey       2010-on                                  *
+ ****************************************************************************/
+/* LINTLIBRARY */
+
+/* ./f_trace.c */
+
+#include <form.priv.h>
+
+#undef _nc_retrace_field_ptr
+FIELD	**_nc_retrace_field_ptr(
+		FIELD	**code)
+		{ return(*(FIELD ***)0); }
+
+#undef _nc_retrace_field
+FIELD	*_nc_retrace_field(
+		FIELD	*code)
+		{ return(*(FIELD **)0); }
+
+#undef _nc_retrace_field_type
+FIELDTYPE *_nc_retrace_field_type(
+		FIELDTYPE *code)
+		{ return(*(FIELDTYPE **)0); }
+
+#undef _nc_retrace_form
+FORM	*_nc_retrace_form(
+		FORM	*code)
+		{ return(*(FORM **)0); }
+
+#undef _nc_retrace_form_hook
+Form_Hook _nc_retrace_form_hook(
+		Form_Hook code)
+		{ return(*(Form_Hook *)0); }
+
+/* ./fld_arg.c */
+
+#undef set_fieldtype_arg
+int	set_fieldtype_arg(
+		FIELDTYPE *typ,
+		void	*(*const make_arg)(
+		va_list	*p1),
+		void	*(*const copy_arg)(
+		const void *p1),
+		void	(*const free_arg)(
+		void	*p1))
+		{ return(*(int *)0); }
+
+#undef field_arg
+void	*field_arg(
+		const FIELD *field)
+		{ return(*(void **)0); }
+
+/* ./fld_attr.c */
+
+#undef set_field_fore
+int	set_field_fore(
+		FIELD	*field,
+		chtype	attr)
+		{ return(*(int *)0); }
+
+#undef field_fore
+chtype	field_fore(
+		const FIELD *field)
+		{ return(*(chtype *)0); }
+
+#undef set_field_back
+int	set_field_back(
+		FIELD	*field,
+		chtype	attr)
+		{ return(*(int *)0); }
+
+#undef field_back
+chtype	field_back(
+		const FIELD *field)
+		{ return(*(chtype *)0); }
+
+/* ./fld_current.c */
+
+#undef set_current_field
+int	set_current_field(
+		FORM	*form,
+		FIELD	*field)
+		{ return(*(int *)0); }
+
+#undef unfocus_current_field
+int	unfocus_current_field(
+		FORM	*const form)
+		{ return(*(int *)0); }
+
+#undef current_field
+FIELD	*current_field(
+		const FORM *form)
+		{ return(*(FIELD **)0); }
+
+#undef field_index
+int	field_index(
+		const FIELD *field)
+		{ return(*(int *)0); }
+
+/* ./fld_def.c */
+
+#undef _nc_Default_Field
+FIELD	*_nc_Default_Field;
+
+#undef _nc_Make_Argument
+TypeArgument *_nc_Make_Argument(
+		const FIELDTYPE *typ,
+		va_list	*ap,
+		int	*err)
+		{ return(*(TypeArgument **)0); }
+
+#undef _nc_Copy_Argument
+TypeArgument *_nc_Copy_Argument(
+		const FIELDTYPE *typ,
+		const TypeArgument *argp,
+		int	*err)
+		{ return(*(TypeArgument **)0); }
+
+#undef _nc_Free_Argument
+void	_nc_Free_Argument(
+		const FIELDTYPE *typ,
+		TypeArgument *argp)
+		{ /* void */ }
+
+#undef _nc_Copy_Type
+NCURSES_BOOL _nc_Copy_Type(
+		FIELD	*dst,
+		FIELD const *src)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_Free_Type
+void	_nc_Free_Type(
+		FIELD	*field)
+		{ /* void */ }
+
+#undef new_field
+FIELD	*new_field(
+		int	rows,
+		int	cols,
+		int	frow,
+		int	fcol,
+		int	nrow,
+		int	nbuf)
+		{ return(*(FIELD **)0); }
+
+#undef free_field
+int	free_field(
+		FIELD	*field)
+		{ return(*(int *)0); }
+
+/* ./fld_dup.c */
+
+#undef dup_field
+FIELD	*dup_field(
+		FIELD	*field,
+		int	frow,
+		int	fcol)
+		{ return(*(FIELD **)0); }
+
+/* ./fld_ftchoice.c */
+
+#undef set_fieldtype_choice
+int	set_fieldtype_choice(
+		FIELDTYPE *typ,
+		NCURSES_BOOL (*const next_choice)(
+		FIELD	*p1,
+		const void *p2),
+		NCURSES_BOOL (*const prev_choice)(
+		FIELD	*p1,
+		const void *p2))
+		{ return(*(int *)0); }
+
+/* ./fld_ftlink.c */
+
+#undef link_fieldtype
+FIELDTYPE *link_fieldtype(
+		FIELDTYPE *type1,
+		FIELDTYPE *type2)
+		{ return(*(FIELDTYPE **)0); }
+
+/* ./fld_info.c */
+
+#undef field_info
+int	field_info(
+		const FIELD *field,
+		int	*rows,
+		int	*cols,
+		int	*frow,
+		int	*fcol,
+		int	*nrow,
+		int	*nbuf)
+		{ return(*(int *)0); }
+
+#undef dynamic_field_info
+int	dynamic_field_info(
+		const FIELD *field,
+		int	*drows,
+		int	*dcols,
+		int	*maxgrow)
+		{ return(*(int *)0); }
+
+/* ./fld_just.c */
+
+#undef set_field_just
+int	set_field_just(
+		FIELD	*field,
+		int	just)
+		{ return(*(int *)0); }
+
+#undef field_just
+int	field_just(
+		const FIELD *field)
+		{ return(*(int *)0); }
+
+/* ./fld_link.c */
+
+#undef link_field
+FIELD	*link_field(
+		FIELD	*field,
+		int	frow,
+		int	fcol)
+		{ return(*(FIELD **)0); }
+
+/* ./fld_max.c */
+
+#undef set_max_field
+int	set_max_field(
+		FIELD	*field,
+		int	maxgrow)
+		{ return(*(int *)0); }
+
+/* ./fld_move.c */
+
+#undef move_field
+int	move_field(
+		FIELD	*field,
+		int	frow,
+		int	fcol)
+		{ return(*(int *)0); }
+
+/* ./fld_newftyp.c */
+
+#undef _nc_Default_FieldType
+FIELDTYPE *_nc_Default_FieldType;
+
+#undef new_fieldtype
+FIELDTYPE *new_fieldtype(
+		NCURSES_BOOL (*const field_check)(
+		FIELD	*p1,
+		const void *p2),
+		NCURSES_BOOL (*const char_check)(
+		int	p1,
+		const void *p2))
+		{ return(*(FIELDTYPE **)0); }
+
+#undef free_fieldtype
+int	free_fieldtype(
+		FIELDTYPE *typ)
+		{ return(*(int *)0); }
+
+/* ./fld_opts.c */
+
+#undef set_field_opts
+int	set_field_opts(
+		FIELD	*field,
+		Field_Options opts)
+		{ return(*(int *)0); }
+
+#undef field_opts
+Field_Options field_opts(
+		const FIELD *field)
+		{ return(*(Field_Options *)0); }
+
+#undef field_opts_on
+int	field_opts_on(
+		FIELD	*field,
+		Field_Options opts)
+		{ return(*(int *)0); }
+
+#undef field_opts_off
+int	field_opts_off(
+		FIELD	*field,
+		Field_Options opts)
+		{ return(*(int *)0); }
+
+/* ./fld_pad.c */
+
+#undef set_field_pad
+int	set_field_pad(
+		FIELD	*field,
+		int	ch)
+		{ return(*(int *)0); }
+
+#undef field_pad
+int	field_pad(
+		const FIELD *field)
+		{ return(*(int *)0); }
+
+/* ./fld_page.c */
+
+#undef set_new_page
+int	set_new_page(
+		FIELD	*field,
+		NCURSES_BOOL new_page_flag)
+		{ return(*(int *)0); }
+
+#undef new_page
+NCURSES_BOOL new_page(
+		const FIELD *field)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./fld_stat.c */
+
+#undef set_field_status
+int	set_field_status(
+		FIELD	*field,
+		NCURSES_BOOL status)
+		{ return(*(int *)0); }
+
+#undef field_status
+NCURSES_BOOL field_status(
+		const FIELD *field)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./fld_type.c */
+
+#undef set_field_type
+int	set_field_type(
+		FIELD	*field,
+		FIELDTYPE *type,
+		...)
+		{ return(*(int *)0); }
+
+#undef field_type
+FIELDTYPE *field_type(
+		const FIELD *field)
+		{ return(*(FIELDTYPE **)0); }
+
+/* ./fld_user.c */
+
+#undef set_field_userptr
+int	set_field_userptr(
+		FIELD	*field,
+		void	*usrptr)
+		{ return(*(int *)0); }
+
+#undef field_userptr
+void	*field_userptr(
+		const FIELD *field)
+		{ return(*(void **)0); }
+
+/* ./frm_cursor.c */
+
+#undef pos_form_cursor
+int	pos_form_cursor(
+		FORM	*form)
+		{ return(*(int *)0); }
+
+/* ./frm_data.c */
+
+#undef data_behind
+NCURSES_BOOL data_behind(
+		const FORM *form)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef data_ahead
+NCURSES_BOOL data_ahead(
+		const FORM *form)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./frm_def.c */
+
+#undef _nc_Default_Form
+FORM	*_nc_Default_Form;
+
+#undef new_form_sp
+FORM	*new_form_sp(
+		SCREEN	*sp,
+		FIELD	**fields)
+		{ return(*(FORM **)0); }
+
+#undef new_form
+FORM	*new_form(
+		FIELD	**fields)
+		{ return(*(FORM **)0); }
+
+#undef free_form
+int	free_form(
+		FORM	*form)
+		{ return(*(int *)0); }
+
+#undef set_form_fields
+int	set_form_fields(
+		FORM	*form,
+		FIELD	**fields)
+		{ return(*(int *)0); }
+
+#undef form_fields
+FIELD	**form_fields(
+		const FORM *form)
+		{ return(*(FIELD ***)0); }
+
+#undef field_count
+int	field_count(
+		const FORM *form)
+		{ return(*(int *)0); }
+
+/* ./frm_driver.c */
+
+#undef _nc_get_fieldbuffer
+void	_nc_get_fieldbuffer(
+		FORM	*form,
+		FIELD	*field,
+		cchar_t	*buf)
+		{ /* void */ }
+
+#undef _nc_Position_Form_Cursor
+int	_nc_Position_Form_Cursor(
+		FORM	*form)
+		{ return(*(int *)0); }
+
+#undef _nc_Refresh_Current_Field
+int	_nc_Refresh_Current_Field(
+		FORM	*form)
+		{ return(*(int *)0); }
+
+#undef _nc_Synchronize_Attributes
+int	_nc_Synchronize_Attributes(
+		FIELD	*field)
+		{ return(*(int *)0); }
+
+#undef _nc_Synchronize_Options
+int	_nc_Synchronize_Options(
+		FIELD	*field,
+		Field_Options newopts)
+		{ return(*(int *)0); }
+
+#undef _nc_Unset_Current_Field
+void	_nc_Unset_Current_Field(
+		FORM	*form)
+		{ /* void */ }
+
+#undef _nc_Set_Current_Field
+int	_nc_Set_Current_Field(
+		FORM	*form,
+		FIELD	*newfield)
+		{ return(*(int *)0); }
+
+#undef _nc_Internal_Validation
+NCURSES_BOOL _nc_Internal_Validation(
+		FORM	*form)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_First_Active_Field
+FIELD	*_nc_First_Active_Field(
+		FORM	*form)
+		{ return(*(FIELD **)0); }
+
+#undef _nc_Set_Form_Page
+int	_nc_Set_Form_Page(
+		FORM	*form,
+		int	page,
+		FIELD	*field)
+		{ return(*(int *)0); }
+
+typedef struct
+{
+  int keycode;
+  int (*cmd) (FORM *);
+}
+Binding_Info;
+
+#undef form_driver
+int	form_driver(
+		FORM	*form,
+		int	c)
+		{ return(*(int *)0); }
+
+#undef form_driver_w
+int	form_driver_w(
+		FORM	*form,
+		int	type,
+		wchar_t	c)
+		{ return(*(int *)0); }
+
+#undef set_field_buffer
+int	set_field_buffer(
+		FIELD	*field,
+		int	buffer,
+		const char *value)
+		{ return(*(int *)0); }
+
+#undef field_buffer
+char	*field_buffer(
+		const FIELD *field,
+		int	buffer)
+		{ return(*(char **)0); }
+
+#undef _nc_Widen_String
+wchar_t	*_nc_Widen_String(
+		char	*source,
+		int	*lengthp)
+		{ return(*(wchar_t **)0); }
+
+/* ./frm_hook.c */
+
+#undef set_field_init
+int	set_field_init(
+		FORM	*form,
+		Form_Hook func)
+		{ return(*(int *)0); }
+
+#undef field_init
+Form_Hook field_init(
+		const FORM *form)
+		{ return(*(Form_Hook *)0); }
+
+#undef set_field_term
+int	set_field_term(
+		FORM	*form,
+		Form_Hook func)
+		{ return(*(int *)0); }
+
+#undef field_term
+Form_Hook field_term(
+		const FORM *form)
+		{ return(*(Form_Hook *)0); }
+
+#undef set_form_init
+int	set_form_init(
+		FORM	*form,
+		Form_Hook func)
+		{ return(*(int *)0); }
+
+#undef form_init
+Form_Hook form_init(
+		const FORM *form)
+		{ return(*(Form_Hook *)0); }
+
+#undef set_form_term
+int	set_form_term(
+		FORM	*form,
+		Form_Hook func)
+		{ return(*(int *)0); }
+
+#undef form_term
+Form_Hook form_term(
+		const FORM *form)
+		{ return(*(Form_Hook *)0); }
+
+/* ./frm_opts.c */
+
+#undef set_form_opts
+int	set_form_opts(
+		FORM	*form,
+		Form_Options opts)
+		{ return(*(int *)0); }
+
+#undef form_opts
+Form_Options form_opts(
+		const FORM *form)
+		{ return(*(Form_Options *)0); }
+
+#undef form_opts_on
+int	form_opts_on(
+		FORM	*form,
+		Form_Options opts)
+		{ return(*(int *)0); }
+
+#undef form_opts_off
+int	form_opts_off(
+		FORM	*form,
+		Form_Options opts)
+		{ return(*(int *)0); }
+
+/* ./frm_page.c */
+
+#undef set_form_page
+int	set_form_page(
+		FORM	*form,
+		int	page)
+		{ return(*(int *)0); }
+
+#undef form_page
+int	form_page(
+		const FORM *form)
+		{ return(*(int *)0); }
+
+/* ./frm_post.c */
+
+#undef post_form
+int	post_form(
+		FORM	*form)
+		{ return(*(int *)0); }
+
+#undef unpost_form
+int	unpost_form(
+		FORM	*form)
+		{ return(*(int *)0); }
+
+/* ./frm_req_name.c */
+
+#undef form_request_name
+const char *form_request_name(
+		int	request)
+		{ return(*(const char **)0); }
+
+#undef form_request_by_name
+int	form_request_by_name(
+		const char *str)
+		{ return(*(int *)0); }
+
+/* ./frm_scale.c */
+
+#undef scale_form
+int	scale_form(
+		const FORM *form,
+		int	*rows,
+		int	*cols)
+		{ return(*(int *)0); }
+
+/* ./frm_sub.c */
+
+#undef set_form_sub
+int	set_form_sub(
+		FORM	*form,
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+#undef form_sub
+WINDOW	*form_sub(
+		const FORM *form)
+		{ return(*(WINDOW **)0); }
+
+/* ./frm_user.c */
+
+#undef set_form_userptr
+int	set_form_userptr(
+		FORM	*form,
+		void	*usrptr)
+		{ return(*(int *)0); }
+
+#undef form_userptr
+void	*form_userptr(
+		const FORM *form)
+		{ return(*(void **)0); }
+
+/* ./frm_win.c */
+
+#undef set_form_win
+int	set_form_win(
+		FORM	*form,
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+#undef form_win
+WINDOW	*form_win(
+		const FORM *form)
+		{ return(*(WINDOW **)0); }
+
+/* ./fty_alnum.c */
+
+typedef struct
+  {
+    int width;
+  }
+alnumARG;
+
+#undef TYPE_ALNUM
+FIELDTYPE *TYPE_ALNUM;
+
+#undef _nc_TYPE_ALNUM
+FIELDTYPE *_nc_TYPE_ALNUM(void)
+		{ return(*(FIELDTYPE **)0); }
+
+/* ./fty_alpha.c */
+
+typedef struct
+  {
+    int width;
+  }
+alphaARG;
+
+#undef TYPE_ALPHA
+FIELDTYPE *TYPE_ALPHA;
+
+#undef _nc_TYPE_ALPHA
+FIELDTYPE *_nc_TYPE_ALPHA(void)
+		{ return(*(FIELDTYPE **)0); }
+
+/* ./fty_enum.c */
+
+typedef struct
+  {
+    char **kwds;
+    int count;
+    NCURSES_BOOL checkcase;
+    NCURSES_BOOL checkunique;
+  }
+enumARG;
+
+typedef struct
+  {
+    char **kwds;
+    int ccase;
+    int cunique;
+  }
+enumParams;
+
+#undef TYPE_ENUM
+FIELDTYPE *TYPE_ENUM;
+
+#undef _nc_TYPE_ENUM
+FIELDTYPE *_nc_TYPE_ENUM(void)
+		{ return(*(FIELDTYPE **)0); }
+
+/* ./fty_generic.c */
+
+#undef _nc_generic_fieldtype
+FIELDTYPE *_nc_generic_fieldtype(
+		NCURSES_BOOL (*const field_check)(
+		FORM	*p1,
+		FIELD	*p2,
+		const void *p3),
+		NCURSES_BOOL (*const char_check)(
+		int	p1,
+		FORM	*p2,
+		FIELD	*p3,
+		const void *p4),
+		NCURSES_BOOL (*const next)(
+		FORM	*p1,
+		FIELD	*p2,
+		const void *p3),
+		NCURSES_BOOL (*const prev)(
+		FORM	*p1,
+		FIELD	*p2,
+		const void *p3),
+		void	(*freecallback)(
+		void	*p1))
+		{ return(*(FIELDTYPE **)0); }
+
+#undef _nc_set_generic_fieldtype
+int	_nc_set_generic_fieldtype(
+		FIELD	*field,
+		FIELDTYPE *ftyp,
+		int	(*argiterator)(
+		void	**p1))
+		{ return(*(int *)0); }
+
+#undef _nc_form_cursor
+WINDOW	*_nc_form_cursor(
+		const FORM *form,
+		int	*pRow,
+		int	*pCol)
+		{ return(*(WINDOW **)0); }
+
+/* ./fty_int.c */
+
+typedef struct
+  {
+    int precision;
+    long low;
+    long high;
+  }
+integerARG;
+
+typedef struct
+  {
+    int precision;
+    long low;
+    long high;
+  }
+integerPARM;
+
+#undef TYPE_INTEGER
+FIELDTYPE *TYPE_INTEGER;
+
+#undef _nc_TYPE_INTEGER
+FIELDTYPE *_nc_TYPE_INTEGER(void)
+		{ return(*(FIELDTYPE **)0); }
+
+/* ./fty_ipv4.c */
+
+#undef TYPE_IPV4
+FIELDTYPE *TYPE_IPV4;
+
+#undef _nc_TYPE_IPV4
+FIELDTYPE *_nc_TYPE_IPV4(void)
+		{ return(*(FIELDTYPE **)0); }
+
+/* ./fty_num.c */
+
+typedef struct
+  {
+    int precision;
+    double low;
+    double high;
+    struct lconv *L;
+  }
+numericARG;
+
+typedef struct
+  {
+    int precision;
+    double low;
+    double high;
+  }
+thisPARM;
+
+#undef TYPE_NUMERIC
+FIELDTYPE *TYPE_NUMERIC;
+
+#undef _nc_TYPE_NUMERIC
+FIELDTYPE *_nc_TYPE_NUMERIC(void)
+		{ return(*(FIELDTYPE **)0); }
+
+/* ./fty_regex.c */
+
+typedef struct
+  {
+    regex_t *pRegExp;
+    unsigned long *refCount;
+  }
+RegExp_Arg;
+
+#undef TYPE_REGEXP
+FIELDTYPE *TYPE_REGEXP;
+
+#undef _nc_TYPE_REGEXP
+FIELDTYPE *_nc_TYPE_REGEXP(void)
+		{ return(*(FIELDTYPE **)0); }
diff --git a/form/llib-lformw b/form/llib-lformw
new file mode 100644
index 0000000..199e26c
--- /dev/null
+++ b/form/llib-lformw
@@ -0,0 +1,860 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 2002-2015,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey       2002-on                                  *
+ ****************************************************************************/
+/* LINTLIBRARY */
+
+/* ./f_trace.c */
+
+#include <form.priv.h>
+
+#undef _nc_retrace_field_ptr
+FIELD	**_nc_retrace_field_ptr(
+		FIELD	**code)
+		{ return(*(FIELD ***)0); }
+
+#undef _nc_retrace_field
+FIELD	*_nc_retrace_field(
+		FIELD	*code)
+		{ return(*(FIELD **)0); }
+
+#undef _nc_retrace_field_type
+FIELDTYPE *_nc_retrace_field_type(
+		FIELDTYPE *code)
+		{ return(*(FIELDTYPE **)0); }
+
+#undef _nc_retrace_form
+FORM	*_nc_retrace_form(
+		FORM	*code)
+		{ return(*(FORM **)0); }
+
+#undef _nc_retrace_form_hook
+Form_Hook _nc_retrace_form_hook(
+		Form_Hook code)
+		{ return(*(Form_Hook *)0); }
+
+/* ./fld_arg.c */
+
+#undef set_fieldtype_arg
+int	set_fieldtype_arg(
+		FIELDTYPE *typ,
+		void	*(*const make_arg)(
+		va_list	*p1),
+		void	*(*const copy_arg)(
+		const void *p1),
+		void	(*const free_arg)(
+		void	*p1))
+		{ return(*(int *)0); }
+
+#undef field_arg
+void	*field_arg(
+		const FIELD *field)
+		{ return(*(void **)0); }
+
+/* ./fld_attr.c */
+
+#undef set_field_fore
+int	set_field_fore(
+		FIELD	*field,
+		chtype	attr)
+		{ return(*(int *)0); }
+
+#undef field_fore
+chtype	field_fore(
+		const FIELD *field)
+		{ return(*(chtype *)0); }
+
+#undef set_field_back
+int	set_field_back(
+		FIELD	*field,
+		chtype	attr)
+		{ return(*(int *)0); }
+
+#undef field_back
+chtype	field_back(
+		const FIELD *field)
+		{ return(*(chtype *)0); }
+
+/* ./fld_current.c */
+
+#undef set_current_field
+int	set_current_field(
+		FORM	*form,
+		FIELD	*field)
+		{ return(*(int *)0); }
+
+#undef unfocus_current_field
+int	unfocus_current_field(
+		FORM	*const form)
+		{ return(*(int *)0); }
+
+#undef current_field
+FIELD	*current_field(
+		const FORM *form)
+		{ return(*(FIELD **)0); }
+
+#undef field_index
+int	field_index(
+		const FIELD *field)
+		{ return(*(int *)0); }
+
+/* ./fld_def.c */
+
+#undef _nc_Default_Field
+FIELD	*_nc_Default_Field;
+
+#undef _nc_Make_Argument
+TypeArgument *_nc_Make_Argument(
+		const FIELDTYPE *typ,
+		va_list	*ap,
+		int	*err)
+		{ return(*(TypeArgument **)0); }
+
+#undef _nc_Copy_Argument
+TypeArgument *_nc_Copy_Argument(
+		const FIELDTYPE *typ,
+		const TypeArgument *argp,
+		int	*err)
+		{ return(*(TypeArgument **)0); }
+
+#undef _nc_Free_Argument
+void	_nc_Free_Argument(
+		const FIELDTYPE *typ,
+		TypeArgument *argp)
+		{ /* void */ }
+
+#undef _nc_Copy_Type
+NCURSES_BOOL _nc_Copy_Type(
+		FIELD	*dst,
+		FIELD const *src)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_Free_Type
+void	_nc_Free_Type(
+		FIELD	*field)
+		{ /* void */ }
+
+#undef new_field
+FIELD	*new_field(
+		int	rows,
+		int	cols,
+		int	frow,
+		int	fcol,
+		int	nrow,
+		int	nbuf)
+		{ return(*(FIELD **)0); }
+
+#undef free_field
+int	free_field(
+		FIELD	*field)
+		{ return(*(int *)0); }
+
+/* ./fld_dup.c */
+
+#undef dup_field
+FIELD	*dup_field(
+		FIELD	*field,
+		int	frow,
+		int	fcol)
+		{ return(*(FIELD **)0); }
+
+/* ./fld_ftchoice.c */
+
+#undef set_fieldtype_choice
+int	set_fieldtype_choice(
+		FIELDTYPE *typ,
+		NCURSES_BOOL (*const next_choice)(
+		FIELD	*p1,
+		const void *p2),
+		NCURSES_BOOL (*const prev_choice)(
+		FIELD	*p1,
+		const void *p2))
+		{ return(*(int *)0); }
+
+/* ./fld_ftlink.c */
+
+#undef link_fieldtype
+FIELDTYPE *link_fieldtype(
+		FIELDTYPE *type1,
+		FIELDTYPE *type2)
+		{ return(*(FIELDTYPE **)0); }
+
+/* ./fld_info.c */
+
+#undef field_info
+int	field_info(
+		const FIELD *field,
+		int	*rows,
+		int	*cols,
+		int	*frow,
+		int	*fcol,
+		int	*nrow,
+		int	*nbuf)
+		{ return(*(int *)0); }
+
+#undef dynamic_field_info
+int	dynamic_field_info(
+		const FIELD *field,
+		int	*drows,
+		int	*dcols,
+		int	*maxgrow)
+		{ return(*(int *)0); }
+
+/* ./fld_just.c */
+
+#undef set_field_just
+int	set_field_just(
+		FIELD	*field,
+		int	just)
+		{ return(*(int *)0); }
+
+#undef field_just
+int	field_just(
+		const FIELD *field)
+		{ return(*(int *)0); }
+
+/* ./fld_link.c */
+
+#undef link_field
+FIELD	*link_field(
+		FIELD	*field,
+		int	frow,
+		int	fcol)
+		{ return(*(FIELD **)0); }
+
+/* ./fld_max.c */
+
+#undef set_max_field
+int	set_max_field(
+		FIELD	*field,
+		int	maxgrow)
+		{ return(*(int *)0); }
+
+/* ./fld_move.c */
+
+#undef move_field
+int	move_field(
+		FIELD	*field,
+		int	frow,
+		int	fcol)
+		{ return(*(int *)0); }
+
+/* ./fld_newftyp.c */
+
+#undef _nc_Default_FieldType
+FIELDTYPE *_nc_Default_FieldType;
+
+#undef new_fieldtype
+FIELDTYPE *new_fieldtype(
+		NCURSES_BOOL (*const field_check)(
+		FIELD	*p1,
+		const void *p2),
+		NCURSES_BOOL (*const char_check)(
+		int	p1,
+		const void *p2))
+		{ return(*(FIELDTYPE **)0); }
+
+#undef free_fieldtype
+int	free_fieldtype(
+		FIELDTYPE *typ)
+		{ return(*(int *)0); }
+
+/* ./fld_opts.c */
+
+#undef set_field_opts
+int	set_field_opts(
+		FIELD	*field,
+		Field_Options opts)
+		{ return(*(int *)0); }
+
+#undef field_opts
+Field_Options field_opts(
+		const FIELD *field)
+		{ return(*(Field_Options *)0); }
+
+#undef field_opts_on
+int	field_opts_on(
+		FIELD	*field,
+		Field_Options opts)
+		{ return(*(int *)0); }
+
+#undef field_opts_off
+int	field_opts_off(
+		FIELD	*field,
+		Field_Options opts)
+		{ return(*(int *)0); }
+
+/* ./fld_pad.c */
+
+#undef set_field_pad
+int	set_field_pad(
+		FIELD	*field,
+		int	ch)
+		{ return(*(int *)0); }
+
+#undef field_pad
+int	field_pad(
+		const FIELD *field)
+		{ return(*(int *)0); }
+
+/* ./fld_page.c */
+
+#undef set_new_page
+int	set_new_page(
+		FIELD	*field,
+		NCURSES_BOOL new_page_flag)
+		{ return(*(int *)0); }
+
+#undef new_page
+NCURSES_BOOL new_page(
+		const FIELD *field)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./fld_stat.c */
+
+#undef set_field_status
+int	set_field_status(
+		FIELD	*field,
+		NCURSES_BOOL status)
+		{ return(*(int *)0); }
+
+#undef field_status
+NCURSES_BOOL field_status(
+		const FIELD *field)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./fld_type.c */
+
+#undef set_field_type
+int	set_field_type(
+		FIELD	*field,
+		FIELDTYPE *type,
+		...)
+		{ return(*(int *)0); }
+
+#undef field_type
+FIELDTYPE *field_type(
+		const FIELD *field)
+		{ return(*(FIELDTYPE **)0); }
+
+/* ./fld_user.c */
+
+#undef set_field_userptr
+int	set_field_userptr(
+		FIELD	*field,
+		void	*usrptr)
+		{ return(*(int *)0); }
+
+#undef field_userptr
+void	*field_userptr(
+		const FIELD *field)
+		{ return(*(void **)0); }
+
+/* ./frm_cursor.c */
+
+#undef pos_form_cursor
+int	pos_form_cursor(
+		FORM	*form)
+		{ return(*(int *)0); }
+
+/* ./frm_data.c */
+
+#undef data_behind
+NCURSES_BOOL data_behind(
+		const FORM *form)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef data_ahead
+NCURSES_BOOL data_ahead(
+		const FORM *form)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./frm_def.c */
+
+#undef _nc_Default_Form
+FORM	*_nc_Default_Form;
+
+#undef new_form_sp
+FORM	*new_form_sp(
+		SCREEN	*sp,
+		FIELD	**fields)
+		{ return(*(FORM **)0); }
+
+#undef new_form
+FORM	*new_form(
+		FIELD	**fields)
+		{ return(*(FORM **)0); }
+
+#undef free_form
+int	free_form(
+		FORM	*form)
+		{ return(*(int *)0); }
+
+#undef set_form_fields
+int	set_form_fields(
+		FORM	*form,
+		FIELD	**fields)
+		{ return(*(int *)0); }
+
+#undef form_fields
+FIELD	**form_fields(
+		const FORM *form)
+		{ return(*(FIELD ***)0); }
+
+#undef field_count
+int	field_count(
+		const FORM *form)
+		{ return(*(int *)0); }
+
+/* ./frm_driver.c */
+
+#undef _nc_get_fieldbuffer
+void	_nc_get_fieldbuffer(
+		FORM	*form,
+		FIELD	*field,
+		cchar_t	*buf)
+		{ /* void */ }
+
+#undef _nc_Position_Form_Cursor
+int	_nc_Position_Form_Cursor(
+		FORM	*form)
+		{ return(*(int *)0); }
+
+#undef _nc_Refresh_Current_Field
+int	_nc_Refresh_Current_Field(
+		FORM	*form)
+		{ return(*(int *)0); }
+
+#undef _nc_Synchronize_Attributes
+int	_nc_Synchronize_Attributes(
+		FIELD	*field)
+		{ return(*(int *)0); }
+
+#undef _nc_Synchronize_Options
+int	_nc_Synchronize_Options(
+		FIELD	*field,
+		Field_Options newopts)
+		{ return(*(int *)0); }
+
+#undef _nc_Unset_Current_Field
+void	_nc_Unset_Current_Field(
+		FORM	*form)
+		{ /* void */ }
+
+#undef _nc_Set_Current_Field
+int	_nc_Set_Current_Field(
+		FORM	*form,
+		FIELD	*newfield)
+		{ return(*(int *)0); }
+
+#undef _nc_Internal_Validation
+NCURSES_BOOL _nc_Internal_Validation(
+		FORM	*form)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_First_Active_Field
+FIELD	*_nc_First_Active_Field(
+		FORM	*form)
+		{ return(*(FIELD **)0); }
+
+#undef _nc_Set_Form_Page
+int	_nc_Set_Form_Page(
+		FORM	*form,
+		int	page,
+		FIELD	*field)
+		{ return(*(int *)0); }
+
+typedef struct
+{
+  int keycode;
+  int (*cmd) (FORM *);
+}
+Binding_Info;
+
+#undef form_driver
+int	form_driver(
+		FORM	*form,
+		int	c)
+		{ return(*(int *)0); }
+
+#undef form_driver_w
+int	form_driver_w(
+		FORM	*form,
+		int	type,
+		wchar_t	c)
+		{ return(*(int *)0); }
+
+#undef set_field_buffer
+int	set_field_buffer(
+		FIELD	*field,
+		int	buffer,
+		const char *value)
+		{ return(*(int *)0); }
+
+#undef field_buffer
+char	*field_buffer(
+		const FIELD *field,
+		int	buffer)
+		{ return(*(char **)0); }
+
+#undef _nc_Widen_String
+wchar_t	*_nc_Widen_String(
+		char	*source,
+		int	*lengthp)
+		{ return(*(wchar_t **)0); }
+
+/* ./frm_hook.c */
+
+#undef set_field_init
+int	set_field_init(
+		FORM	*form,
+		Form_Hook func)
+		{ return(*(int *)0); }
+
+#undef field_init
+Form_Hook field_init(
+		const FORM *form)
+		{ return(*(Form_Hook *)0); }
+
+#undef set_field_term
+int	set_field_term(
+		FORM	*form,
+		Form_Hook func)
+		{ return(*(int *)0); }
+
+#undef field_term
+Form_Hook field_term(
+		const FORM *form)
+		{ return(*(Form_Hook *)0); }
+
+#undef set_form_init
+int	set_form_init(
+		FORM	*form,
+		Form_Hook func)
+		{ return(*(int *)0); }
+
+#undef form_init
+Form_Hook form_init(
+		const FORM *form)
+		{ return(*(Form_Hook *)0); }
+
+#undef set_form_term
+int	set_form_term(
+		FORM	*form,
+		Form_Hook func)
+		{ return(*(int *)0); }
+
+#undef form_term
+Form_Hook form_term(
+		const FORM *form)
+		{ return(*(Form_Hook *)0); }
+
+/* ./frm_opts.c */
+
+#undef set_form_opts
+int	set_form_opts(
+		FORM	*form,
+		Form_Options opts)
+		{ return(*(int *)0); }
+
+#undef form_opts
+Form_Options form_opts(
+		const FORM *form)
+		{ return(*(Form_Options *)0); }
+
+#undef form_opts_on
+int	form_opts_on(
+		FORM	*form,
+		Form_Options opts)
+		{ return(*(int *)0); }
+
+#undef form_opts_off
+int	form_opts_off(
+		FORM	*form,
+		Form_Options opts)
+		{ return(*(int *)0); }
+
+/* ./frm_page.c */
+
+#undef set_form_page
+int	set_form_page(
+		FORM	*form,
+		int	page)
+		{ return(*(int *)0); }
+
+#undef form_page
+int	form_page(
+		const FORM *form)
+		{ return(*(int *)0); }
+
+/* ./frm_post.c */
+
+#undef post_form
+int	post_form(
+		FORM	*form)
+		{ return(*(int *)0); }
+
+#undef unpost_form
+int	unpost_form(
+		FORM	*form)
+		{ return(*(int *)0); }
+
+/* ./frm_req_name.c */
+
+#undef form_request_name
+const char *form_request_name(
+		int	request)
+		{ return(*(const char **)0); }
+
+#undef form_request_by_name
+int	form_request_by_name(
+		const char *str)
+		{ return(*(int *)0); }
+
+/* ./frm_scale.c */
+
+#undef scale_form
+int	scale_form(
+		const FORM *form,
+		int	*rows,
+		int	*cols)
+		{ return(*(int *)0); }
+
+/* ./frm_sub.c */
+
+#undef set_form_sub
+int	set_form_sub(
+		FORM	*form,
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+#undef form_sub
+WINDOW	*form_sub(
+		const FORM *form)
+		{ return(*(WINDOW **)0); }
+
+/* ./frm_user.c */
+
+#undef set_form_userptr
+int	set_form_userptr(
+		FORM	*form,
+		void	*usrptr)
+		{ return(*(int *)0); }
+
+#undef form_userptr
+void	*form_userptr(
+		const FORM *form)
+		{ return(*(void **)0); }
+
+/* ./frm_win.c */
+
+#undef set_form_win
+int	set_form_win(
+		FORM	*form,
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+#undef form_win
+WINDOW	*form_win(
+		const FORM *form)
+		{ return(*(WINDOW **)0); }
+
+/* ./fty_alnum.c */
+
+typedef struct
+  {
+    int width;
+  }
+alnumARG;
+
+#undef TYPE_ALNUM
+FIELDTYPE *TYPE_ALNUM;
+
+#undef _nc_TYPE_ALNUM
+FIELDTYPE *_nc_TYPE_ALNUM(void)
+		{ return(*(FIELDTYPE **)0); }
+
+/* ./fty_alpha.c */
+
+typedef struct
+  {
+    int width;
+  }
+alphaARG;
+
+#undef TYPE_ALPHA
+FIELDTYPE *TYPE_ALPHA;
+
+#undef _nc_TYPE_ALPHA
+FIELDTYPE *_nc_TYPE_ALPHA(void)
+		{ return(*(FIELDTYPE **)0); }
+
+/* ./fty_enum.c */
+
+typedef struct
+  {
+    char **kwds;
+    int count;
+    NCURSES_BOOL checkcase;
+    NCURSES_BOOL checkunique;
+  }
+enumARG;
+
+typedef struct
+  {
+    char **kwds;
+    int ccase;
+    int cunique;
+  }
+enumParams;
+
+#undef TYPE_ENUM
+FIELDTYPE *TYPE_ENUM;
+
+#undef _nc_TYPE_ENUM
+FIELDTYPE *_nc_TYPE_ENUM(void)
+		{ return(*(FIELDTYPE **)0); }
+
+/* ./fty_generic.c */
+
+#undef _nc_generic_fieldtype
+FIELDTYPE *_nc_generic_fieldtype(
+		NCURSES_BOOL (*const field_check)(
+		FORM	*p1,
+		FIELD	*p2,
+		const void *p3),
+		NCURSES_BOOL (*const char_check)(
+		int	p1,
+		FORM	*p2,
+		FIELD	*p3,
+		const void *p4),
+		NCURSES_BOOL (*const next)(
+		FORM	*p1,
+		FIELD	*p2,
+		const void *p3),
+		NCURSES_BOOL (*const prev)(
+		FORM	*p1,
+		FIELD	*p2,
+		const void *p3),
+		void	(*freecallback)(
+		void	*p1))
+		{ return(*(FIELDTYPE **)0); }
+
+#undef _nc_set_generic_fieldtype
+int	_nc_set_generic_fieldtype(
+		FIELD	*field,
+		FIELDTYPE *ftyp,
+		int	(*argiterator)(
+		void	**p1))
+		{ return(*(int *)0); }
+
+#undef _nc_form_cursor
+WINDOW	*_nc_form_cursor(
+		const FORM *form,
+		int	*pRow,
+		int	*pCol)
+		{ return(*(WINDOW **)0); }
+
+/* ./fty_int.c */
+
+typedef struct
+  {
+    int precision;
+    long low;
+    long high;
+  }
+integerARG;
+
+typedef struct
+  {
+    int precision;
+    long low;
+    long high;
+  }
+integerPARM;
+
+#undef TYPE_INTEGER
+FIELDTYPE *TYPE_INTEGER;
+
+#undef _nc_TYPE_INTEGER
+FIELDTYPE *_nc_TYPE_INTEGER(void)
+		{ return(*(FIELDTYPE **)0); }
+
+/* ./fty_ipv4.c */
+
+#undef TYPE_IPV4
+FIELDTYPE *TYPE_IPV4;
+
+#undef _nc_TYPE_IPV4
+FIELDTYPE *_nc_TYPE_IPV4(void)
+		{ return(*(FIELDTYPE **)0); }
+
+/* ./fty_num.c */
+
+typedef struct
+  {
+    int precision;
+    double low;
+    double high;
+    struct lconv *L;
+  }
+numericARG;
+
+typedef struct
+  {
+    int precision;
+    double low;
+    double high;
+  }
+thisPARM;
+
+#undef TYPE_NUMERIC
+FIELDTYPE *TYPE_NUMERIC;
+
+#undef _nc_TYPE_NUMERIC
+FIELDTYPE *_nc_TYPE_NUMERIC(void)
+		{ return(*(FIELDTYPE **)0); }
+
+/* ./fty_regex.c */
+
+typedef struct
+  {
+    regex_t *pRegExp;
+    unsigned long *refCount;
+  }
+RegExp_Arg;
+
+#undef TYPE_REGEXP
+FIELDTYPE *TYPE_REGEXP;
+
+#undef _nc_TYPE_REGEXP
+FIELDTYPE *_nc_TYPE_REGEXP(void)
+		{ return(*(FIELDTYPE **)0); }
diff --git a/form/modules b/form/modules
new file mode 100644
index 0000000..47a3ddf
--- /dev/null
+++ b/form/modules
@@ -0,0 +1,79 @@
+# $Id: modules,v 1.18 2020/02/02 23:34:34 tom Exp $
+##############################################################################
+# Copyright 2020 Thomas E. Dickey                                            #
+# Copyright 1998-2008,2010 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey	1995-on
+#    and: Juergen Pfeifer       2008
+#
+
+@ base
+# Library objects
+f_trace		lib		$(srcdir)	$(HEADER_DEPS)
+fld_arg		lib		$(srcdir)	$(HEADER_DEPS)
+fld_attr	lib		$(srcdir)	$(HEADER_DEPS)
+fld_current	lib		$(srcdir)	$(HEADER_DEPS)
+fld_def		lib		$(srcdir)	$(HEADER_DEPS)
+fld_dup		lib		$(srcdir)	$(HEADER_DEPS)
+fld_ftchoice	lib		$(srcdir)	$(HEADER_DEPS)
+fld_ftlink	lib		$(srcdir)	$(HEADER_DEPS)
+fld_info	lib		$(srcdir)	$(HEADER_DEPS)
+fld_just	lib		$(srcdir)	$(HEADER_DEPS)
+fld_link	lib		$(srcdir)	$(HEADER_DEPS)
+fld_max		lib		$(srcdir)	$(HEADER_DEPS)
+fld_move	lib		$(srcdir)	$(HEADER_DEPS)
+fld_newftyp	lib		$(srcdir)	$(HEADER_DEPS)
+fld_opts	lib		$(srcdir)	$(HEADER_DEPS)
+fld_pad		lib		$(srcdir)	$(HEADER_DEPS)
+fld_page	lib		$(srcdir)	$(HEADER_DEPS)
+fld_stat	lib		$(srcdir)	$(HEADER_DEPS)
+fld_type	lib		$(srcdir)	$(HEADER_DEPS)
+fld_user	lib		$(srcdir)	$(HEADER_DEPS)
+frm_cursor	lib		$(srcdir)	$(HEADER_DEPS)
+frm_data	lib		$(srcdir)	$(HEADER_DEPS)
+frm_def		lib		$(srcdir)	$(HEADER_DEPS)
+frm_driver	lib		$(srcdir)	$(HEADER_DEPS)
+frm_hook	lib		$(srcdir)	$(HEADER_DEPS)
+frm_opts	lib		$(srcdir)	$(HEADER_DEPS)
+frm_page	lib		$(srcdir)	$(HEADER_DEPS)
+frm_post	lib		$(srcdir)	$(HEADER_DEPS)
+frm_req_name	lib		$(srcdir)	$(HEADER_DEPS)
+frm_scale	lib		$(srcdir)	$(HEADER_DEPS)
+frm_sub		lib		$(srcdir)	$(HEADER_DEPS)
+frm_user	lib		$(srcdir)	$(HEADER_DEPS)
+frm_win		lib		$(srcdir)	$(HEADER_DEPS)
+fty_alnum	lib		$(srcdir)	$(HEADER_DEPS)
+fty_alpha	lib		$(srcdir)	$(HEADER_DEPS)
+fty_enum	lib		$(srcdir)	$(HEADER_DEPS)
+fty_generic	lib		$(srcdir)	$(HEADER_DEPS)
+fty_int		lib		$(srcdir)	$(HEADER_DEPS)
+fty_ipv4	lib		$(srcdir)	$(HEADER_DEPS)
+fty_num		lib		$(srcdir)	$(HEADER_DEPS)
+fty_regex	lib		$(srcdir)	$(HEADER_DEPS)
+
+# vile:makemode
diff --git a/include/Caps b/include/Caps
new file mode 100644
index 0000000..7bc00ea
--- /dev/null
+++ b/include/Caps
@@ -0,0 +1,971 @@
+##############################################################################
+# Copyright 2019-2020,2021 Thomas E. Dickey                                  #
+# Copyright 1998-2015,2016 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.                                                             #
+##############################################################################
+#
+# Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995
+#    and: Eric S. Raymond <esr@snark.thyrsus.com>
+#
+# $Id: Caps,v 1.48 2021/10/08 07:55:48 tom Exp $
+#
+# This is the master termcap/terminfo capability table.
+#
+# This table is used to generate initializers for tables that drive tic,
+# infocmp, and the library compilation code used to support the termcap
+# compatibility hack.  It is also used to generate the tabular portion of the
+# terminfo(5) man page; lines beginning with `#%' are passed through to become
+# the terminfo table.
+#
+# This file has three major sections; a standard-capabilities table, two
+# extension-capability tables, and a section of aliases declarations.
+# The first two have the same format, as follows:
+#
+# FILE FORMAT
+#
+# Column 1: terminfo variable name
+# Column 2: terminfo capability name
+# Column 3: capability type (boolean, numeric, or string)
+# Column 4: termcap capability name
+# Column 5: KEY_xxx name, if any, `-' otherwise
+# Column 6: value for KEY_xxx name, if any, `-' otherwise
+# Column 7: Lead with `Y' if capability should be emitted in termcap
+#           translations, `-' otherwise
+# Column 8: capability description
+#
+# The codes following [Y-] in column 7 describe the versions of termcap which
+# use the given capability.  This information is not used by the curses library
+# proper; rather, it is there to help the terminfo maintainer avoid emitting
+# termcap entry translations that are more than 1023 bytes long (and tank a
+# lot of old termcap-using programs).  The codes read as follows:
+#	B = mentioned in the BSD man page for 4.4BSD curses
+#	C = used by the 4.4BSD curses library
+#	G = mentioned in the documentation for GNU termcap
+#	E = used by GNU Emacs
+#	K = remove this terminfo capability when translating to standard format
+# The important codes are C and E.  A cap with C or E should be preserved in
+# translation if possible.  The problem is that preserving all such caps may
+# lead to some termcap translations being too long.  The termcap maintainer
+# has a bit of a juggling act to do...potential problem cases are marked with
+# an asterisk (*).
+#
+# The aliases section has the following format:
+#
+# Column 1: either `capalias' or `infoalias'
+# Column 2: name to be aliased
+# Column 3: what name it should translate to.  The name IGNORE means it
+#           should be discarded with a warning message.
+# Column 4: name of the extension set (used for compiler warning messages)
+# Column 5: capability description (usually an associated terminfo variable)
+#
+# HANDLING TERMCAP AND TERMINFO EXTENSIONS
+#
+# There are basically five different ways to handle termcap and terminfo
+# extensions:
+#
+# 1. Don't list the capname here, or list it but comment it out (the latter
+# is preferable; someone might want to handle it in the future).  If you do
+# this, the capability will be treated as unknown and raise a warning from
+# the compiler.
+#
+# 2. Alias it.  This is appropriate if the capability has the same meaning
+# as an already-supported one.  The compiler will handle aliasing, emitting
+# an appropriate informational message whenever an alias fires.
+#
+# 3. List it in the standard table.  You almost certainly do *not* want
+# to do this -- the capabilities in that one, and their order, have been
+# carefully chosen to be SVr4-binary-compatible when they're written out
+# as a terminfo object, and breaking this would be bad.  It is up to the ncurses
+# library what to do with the terminfo data after it is read in.
+#
+# 4. List it in the aliases table with an IGNORE target field.  If you
+# do this, the capability will be ignored on input (though the user will
+# get a warning message about it).
+#
+# 5. List it in the extensions table. If you do this, the compiler will
+# silently accept the capability, but the curses library proper will never
+# see it (because it won't be written out as part of the terminfo object
+# format).  It is up to you what you have the compiler do with it.
+#
+# There are two opposite reasons to choose option 5.  One is when you want
+# to eat the capability silently and discard it when doing translations
+# to terminfo with tic -I.  Some very old obsolete BSD caps like :kn: are
+# in this class.  Nothing will ever use them again.
+#
+# More usually, you want the compiler to try to deduce something from the
+# capability value that it can use to translate it into your output format.
+# You'll need to write custom code, probably in postprocess_termcap() or
+# postprocess_terminfo(), to handle the translation.
+#
+# CONTROLLING ENTRY LENGTH
+#
+# Notes on specific elisions made to fit translations within 1023 bytes:
+#
+# Machines with IBM PC-like keyboards want to be able to define the following
+# keys: key_npage, key_ppage, key_home, key_ll (which is used for in termcap-
+# only environments for End or Home-Down), key_dc, and key_ic.  This is also
+# the set of keys the `joe' editor will be upset if it can't see.  So don't
+# trim those out of the set to be translated to termcap, or various users of
+# the termcap file will become irate.
+#
+# It might look tempting to leave those long init strings out of translations.
+# We can't do it (yet); 4.4BSD tput and tset use them.
+#
+# We retain the sgr capability in translation in spite of the fact that neither
+# 4.4BSD nor GNU Emacs uses it, because (a) some entry naming distinctions are
+# hard to understand without it, and (b) the entries in which it is long tend
+# to be older types that don't use up a lot of string space on function keys.
+# The tic(1) translation code will complain and elide it if it makes a critical
+# difference (there is special code in tic to recognize this situation).
+#
+# Yes, BSD tset(1) uses hpa.  We elide hpa/vpa anyway because the motion
+# optimizer in BSD curses didn't use them.  This omission seems to be the
+# single most effective one, it shortened the resolved length of all thirteen
+# problem entries in the 9.9.0 version of the terminfo master below critical.
+#
+# It would be nice to keep f11 and f12 for Emacs use, but a couple of termcap
+# translations go back over critical if we do this.  As 4.4BSD curses fades
+# into history and GNU termcap's application base shrinks towards being GNU
+# Emacs only, we'll probably elide out some BSD-only capabilities in order
+# to buy space for non-essentials Emacs is still using.  Capabilities high
+# on that hit list: rc, sc, uc.
+#
+#############################################################################
+#
+# STANDARD CAPABILITIES
+#
+#%The following is a complete table of the capabilities included in a
+#%terminfo description block and available to terminfo-using code.  In each
+#%line of the table,
+#%
+#%The \fBvariable\fR is the name by which the programmer (at the terminfo level)
+#%accesses the capability.
+#%
+#%The \fBcapname\fR is the short name used in the text of the database,
+#%and is used by a person updating the database.
+#%Whenever possible, capnames are chosen to be the same as or similar to
+#%the ANSI X3.64-1979 standard (now superseded by ECMA-48, which uses
+#%identical or very similar names).  Semantics are also intended to match
+#%those of the specification.
+#%
+#%The termcap code is the old
+#%.B termcap
+#%capability name (some capabilities are new, and have names which termcap
+#%did not originate).
+#%.P
+#%Capability names have no hard length limit, but an informal limit of 5
+#%characters has been adopted to keep them short and to allow the tabs in
+#%the source file
+#%.B Caps
+#%to line up nicely.
+#%
+#%Finally, the description field attempts to convey the semantics of the
+#%capability.  You may find some codes in the description field:
+#%.TP
+#%(P)
+#%indicates that padding may be specified
+#%.TP
+#%#[1-9]
+#%in the description field indicates that the string is passed
+#%through \fBtparm\fP(3X) with parameters as given (#\fIi\fP).
+#%.IP
+#%If no parameters are listed in the description,
+#%passing the string through \fBtparm\fP(3X) may give unexpected results,
+#%e.g., if it contains percent (%%) signs.
+#%.TP
+#%(P*)
+#%indicates that padding may vary in proportion to the number of
+#%lines affected
+#%.TP
+#%(#\d\fIi\fP\u)
+#%indicates the \fIi\fP\uth\d parameter.
+#%
+#%.PP
+#% These are the boolean capabilities:
+#%
+#%.na
+#%.TS H
+#%center expand;
+#%c l l c
+#%c l l c
+#%lw25 lw6 lw2 lw20.
+#%\fBVariable	Cap-	TCap	Description\fR
+#%\fBBooleans	name	Code\fR
+auto_left_margin		bw	bool	bw	-	-	YB-G-	cub1 wraps from column 0 to last column
+auto_right_margin		am	bool	am	-	-	YBCGE	terminal has automatic margins
+no_esc_ctlc			xsb	bool	xb	-	-	YBCG-	beehive (f1=escape, f2=ctrl C)
+ceol_standout_glitch		xhp	bool	xs	-	-	YBCGE	standout not erased by overwriting (hp)
+eat_newline_glitch		xenl	bool	xn	-	-	YBCGE	newline ignored after 80 cols (concept)
+erase_overstrike		eo	bool	eo	-	-	YBCG-	can erase overstrikes with a blank
+generic_type			gn	bool	gn	-	-	YB-G-	generic line type
+hard_copy			hc	bool	hc	-	-	YBCG-	hardcopy terminal
+has_meta_key			km	bool	km	-	-	YB-GE	Has a meta key (i.e., sets 8th-bit)
+has_status_line			hs	bool	hs	-	-	YB-G-	has extra status line
+insert_null_glitch		in	bool	in	-	-	YBCGE	insert mode distinguishes nulls
+memory_above			da	bool	da	-	-	YBCG-	display may be retained above the screen
+memory_below			db	bool	db	-	-	YB-GE	display may be retained below the screen
+move_insert_mode		mir	bool	mi	-	-	YBCGE	safe to move while in insert mode
+move_standout_mode		msgr	bool	ms	-	-	YBCGE	safe to move while in standout mode
+over_strike			os	bool	os	-	-	YBCG-	terminal can overstrike
+status_line_esc_ok		eslok	bool	es	-	-	YB-G-	escape can be used on the status line
+dest_tabs_magic_smso		xt	bool	xt	-	-	YBCGE	tabs destructive, magic so char (t1061)
+tilde_glitch			hz	bool	hz	-	-	YB-GE	cannot print ~'s (Hazeltine)
+transparent_underline		ul	bool	ul	-	-	YBCGE	underline character overstrikes
+xon_xoff			xon	bool	xo	-	-	YB---	terminal uses xon/xoff handshaking
+needs_xon_xoff			nxon	bool	nx	-	-	-----	padding will not work, xon/xoff required
+prtr_silent			mc5i	bool	5i	-	-	-----	printer will not echo on screen
+hard_cursor			chts	bool	HC	-	-	-----	cursor is hard to see
+non_rev_rmcup			nrrmc	bool	NR	-	-	-----	smcup does not reverse rmcup
+no_pad_char			npc	bool	NP	-	-	-----	pad character does not exist
+non_dest_scroll_region		ndscr	bool	ND	-	-	-----	scrolling region is non-destructive
+can_change			ccc	bool	cc	-	-	-----	terminal can re-define existing colors
+back_color_erase		bce	bool	ut	-	-	-----	screen erased with background color
+hue_lightness_saturation	hls	bool	hl	-	-	-----	terminal uses only HLS color notation (Tektronix)
+col_addr_glitch			xhpa	bool	YA	-	-	-----	only positive motion for hpa/mhpa caps
+cr_cancels_micro_mode		crxm	bool	YB	-	-	-----	using cr turns off micro mode
+has_print_wheel			daisy	bool	YC	-	-	-----	printer needs operator to change character set
+row_addr_glitch			xvpa	bool	YD	-	-	-----	only positive motion for vpa/mvpa caps
+semi_auto_right_margin		sam	bool	YE	-	-	-----	printing in last column causes cr
+cpi_changes_res			cpix	bool	YF	-	-	-----	changing character pitch changes resolution
+lpi_changes_res			lpix	bool	YG	-	-	-----	changing line pitch changes resolution
+#%.TE
+#%.ad
+#%
+#%These are the numeric capabilities:
+#%
+#%.na
+#%.TS H
+#%center expand;
+#%c l l c
+#%c l l c
+#%lw25 lw6 lw2 lw20.
+#%\fBVariable	Cap-	TCap	Description\fR
+#%\fBNumeric	name	Code\fR
+columns				cols	num	co	-	-	YBCGE	number of columns in a line
+init_tabs			it	num	it	-	-	YB-G-	tabs initially every # spaces
+lines				lines	num	li	-	-	YBCGE	number of lines on screen or page
+lines_of_memory			lm	num	lm	-	-	YB-G-	lines of memory if > line. 0 means varies
+magic_cookie_glitch		xmc	num	sg	-	-	YBCGE	number of blank characters left by smso or rmso
+padding_baud_rate		pb	num	pb	-	-	YB-GE	lowest baud rate where padding needed
+virtual_terminal		vt	num	vt	-	-	YB---	virtual terminal number (CB/unix)
+width_status_line		wsl	num	ws	-	-	YB-G-	number of columns in status line
+num_labels			nlab	num	Nl	-	-	-----	number of labels on screen
+label_height			lh	num	lh	-	-	-----	rows in each label
+label_width			lw	num	lw	-	-	-----	columns in each label
+max_attributes			ma	num	ma	-	-	YBC--	maximum combined attributes terminal can handle
+maximum_windows			wnum	num	MW	-	-	-----	maximum number of definable windows
+# These came in with SVr4's color support
+max_colors			colors	num	Co	-	-	-----	maximum number of colors on screen
+max_pairs			pairs	num	pa	-	-	-----	maximum number of color-pairs on the screen
+no_color_video			ncv	num	NC	-	-	-----	video attributes that cannot be used with colors
+#%.TE
+#%.ad
+#%
+#%The following numeric capabilities are present in the SVr4.0 term structure,
+#%but are not yet documented in the man page.  They came in with SVr4's
+#%printer support.
+#%
+#%.na
+#%.TS H
+#%center expand;
+#%c l l c
+#%c l l c
+#%lw25 lw6 lw2 lw20.
+#%\fBVariable	Cap-	TCap	Description\fR
+#%\fBNumeric	name	Code\fR
+buffer_capacity			bufsz	num	Ya	-	-	-----	numbers of bytes buffered before printing
+dot_vert_spacing		spinv	num	Yb	-	-	-----	spacing of pins vertically in pins per inch
+dot_horz_spacing		spinh	num	Yc	-	-	-----	spacing of dots horizontally in dots per inch
+max_micro_address		maddr	num	Yd	-	-	-----	maximum value in micro_..._address
+max_micro_jump			mjump	num	Ye	-	-	-----	maximum value in parm_..._micro
+micro_col_size			mcs	num	Yf	-	-	-----	character step size when in micro mode
+micro_line_size			mls	num	Yg	-	-	-----	line step size when in micro mode
+number_of_pins			npins	num	Yh	-	-	-----	numbers of pins in print-head
+output_res_char			orc	num	Yi	-	-	-----	horizontal resolution in units per line
+output_res_line			orl	num	Yj	-	-	-----	vertical resolution in units per line
+output_res_horz_inch		orhi	num	Yk	-	-	-----	horizontal resolution in units per inch
+output_res_vert_inch		orvi	num	Yl	-	-	-----	vertical resolution in units per inch
+print_rate			cps	num	Ym	-	-	-----	print rate in characters per second
+wide_char_size			widcs	num	Yn	-	-	-----	character step size when in double wide mode
+buttons				btns	num	BT	-	-	-----	number of buttons on mouse
+bit_image_entwining		bitwin	num	Yo	-	-	-----	number of passes for each bit-image row
+bit_image_type			bitype	num	Yp	-	-	-----	type of bit-image device
+#%.TE
+#%.ad
+#%
+#%These are the string capabilities:
+#%
+#%.na
+#%.TS H
+#%center expand;
+#%c l l c
+#%c l l c
+#%lw25 lw6 lw2 lw20.
+#%\fBVariable	Cap-	TCap	Description\fR
+#%\fBString	name	Code\fR
+back_tab			cbt	str	bt	-		-	YBCGE	back tab (P)
+bell				bel	str	bl	-		-	YB-GE	audible signal (bell) (P)
+carriage_return			cr	str	cr	-		-	YBCGE	carriage return (P*) (P*)
+change_scroll_region		csr	str	cs	-		-	YBCGE	change region to line #1 to line #2 (P)
+clear_all_tabs			tbc	str	ct	-		-	YB-G-	clear all tab stops (P)
+clear_screen			clear	str	cl	-		-	YBCGE	clear screen and home cursor (P*)
+clr_eol				el	str	ce	-		-	YBCGE	clear to end of line (P)
+clr_eos				ed	str	cd	-		-	YBCGE	clear to end of screen (P*)
+column_address			hpa	str	ch	-		-	-B-GE*	horizontal position #1, absolute (P)
+command_character		cmdch	str	CC	-		-	YB-G-	terminal settable cmd character in prototype !?
+cursor_address			cup	str	cm	-		-	YBCGE	move to row #1 columns #2
+cursor_down			cud1	str	do	-		-	YBCGE	down one line
+cursor_home			home	str	ho	-		-	YBCGE	home cursor (if no cup)
+cursor_invisible		civis	str	vi	-		-	YB-G-	make cursor invisible
+cursor_left			cub1	str	le	-		-	YBCGE	move left one space
+cursor_mem_address		mrcup	str	CM	-		-	YB-G-	memory relative cursor addressing, move to row #1 columns #2
+cursor_normal			cnorm	str	ve	-		-	YBCGE	make cursor appear normal (undo civis/cvvis)
+cursor_right			cuf1	str	nd	-		-	YBCGE	non-destructive space (move right one space)
+cursor_to_ll			ll	str	ll	-		-	YBCGE	last line, first column (if no cup)
+cursor_up			cuu1	str	up	-		-	YBCGE	up one line
+cursor_visible			cvvis	str	vs	-		-	YBCGE	make cursor very visible
+delete_character		dch1	str	dc	-		-	YBCGE	delete character (P*)
+delete_line			dl1	str	dl	-		-	YBCGE	delete line (P*)
+dis_status_line			dsl	str	ds	-		-	YB-G-	disable status line
+down_half_line			hd	str	hd	-		-	YB-G-	half a line down
+enter_alt_charset_mode		smacs	str	as	-		-	YB-G-	start alternate character set (P)
+enter_blink_mode		blink	str	mb	-		-	YB-G-	turn on blinking
+enter_bold_mode			bold	str	md	-		-	YB-G-	turn on bold (extra bright) mode
+enter_ca_mode			smcup	str	ti	-		-	YBCGE	string to start programs using cup
+enter_delete_mode		smdc	str	dm	-		-	YBCGE	enter delete mode
+enter_dim_mode			dim	str	mh	-		-	YB-G-	turn on half-bright mode
+enter_insert_mode		smir	str	im	-		-	YBCGE	enter insert mode
+enter_secure_mode		invis	str	mk	-		-	-B-G-*	turn on blank mode (characters invisible)
+enter_protected_mode		prot	str	mp	-		-	-B-G-*	turn on protected mode
+enter_reverse_mode		rev	str	mr	-		-	YB-G-	turn on reverse video mode
+enter_standout_mode		smso	str	so	-		-	YBCGE	begin standout mode
+enter_underline_mode		smul	str	us	-		-	YBCGE	begin underline mode
+erase_chars			ech	str	ec	-		-	YB-G-	erase #1 characters (P)
+exit_alt_charset_mode		rmacs	str	ae	-		-	YB-G-	end alternate character set (P)
+exit_attribute_mode		sgr0	str	me	-		-	YB-GE	turn off all attributes
+exit_ca_mode			rmcup	str	te	-		-	YBCGE	strings to end programs using cup
+exit_delete_mode		rmdc	str	ed	-		-	YBCGE	end delete mode
+exit_insert_mode		rmir	str	ei	-		-	YBCGE	exit insert mode
+exit_standout_mode		rmso	str	se	-		-	YBCGE	exit standout mode
+exit_underline_mode		rmul	str	ue	-		-	YBCGE	exit underline mode
+flash_screen			flash	str	vb	-		-	YBCGE	visible bell (may not move cursor)
+form_feed			ff	str	ff	-		-	YB-G-	hardcopy terminal page eject (P*)
+from_status_line		fsl	str	fs	-		-	YB-G-	return from status line
+init_1string			is1	str	i1	-		-	YB-G-	initialization string
+init_2string			is2	str	is	-		-	YB-G-	initialization string
+init_3string			is3	str	i3	-		-	YB-G-	initialization string
+init_file			if	str	if	-		-	YB-G-	name of initialization file
+insert_character		ich1	str	ic	-		-	YBCGE	insert character (P)
+insert_line			il1	str	al	-		-	YBCGE	insert line (P*)
+insert_padding			ip	str	ip	-		-	YBCGE	insert padding after inserted character
+key_backspace			kbs	str	kb	KEY_BACKSPACE	0407	YB-G-	backspace key
+key_catab			ktbc	str	ka	KEY_CATAB	0526	-B-G-*	clear-all-tabs key
+key_clear			kclr	str	kC	KEY_CLEAR	0515	-B-G-*	clear-screen or erase key
+key_ctab			kctab	str	kt	KEY_CTAB	0525	-B-G-*	clear-tab key
+key_dc				kdch1	str	kD	KEY_DC		0512	YB-G-	delete-character key
+key_dl				kdl1	str	kL	KEY_DL		0510	-B-G-*	delete-line key
+key_down			kcud1	str	kd	KEY_DOWN	0402	YBCGE	down-arrow key
+key_eic				krmir	str	kM	KEY_EIC		0514	-B-G-*	sent by rmir or smir in insert mode
+key_eol				kel	str	kE	KEY_EOL		0517	-B-G-*	clear-to-end-of-line key
+key_eos				ked	str	kS	KEY_EOS		0516	-B-G-*	clear-to-end-of-screen key
+key_f0				kf0	str	k0	KEY_F(0)	0410	YBCGE	F0 function key
+key_f1				kf1	str	k1	KEY_F(1)	-	YBCGE	F1 function key
+key_f10				kf10	str	k;	KEY_F(10)	-	----E	F10 function key
+key_f2				kf2	str	k2	KEY_F(2)	-	YBCGE	F2 function key
+key_f3				kf3	str	k3	KEY_F(3)	-	YBCGE	F3 function key
+key_f4				kf4	str	k4	KEY_F(4)	-	YBCGE	F4 function key
+key_f5				kf5	str	k5	KEY_F(5)	-	YBCGE	F5 function key
+key_f6				kf6	str	k6	KEY_F(6)	-	YBCGE	F6 function key
+key_f7				kf7	str	k7	KEY_F(7)	-	YBCGE	F7 function key
+key_f8				kf8	str	k8	KEY_F(8)	-	YBCGE	F8 function key
+key_f9				kf9	str	k9	KEY_F(9)	-	YBCGE	F9 function key
+key_home			khome	str	kh	KEY_HOME	0406	YBCGE	home key
+key_ic				kich1	str	kI	KEY_IC		0513	YB-GE	insert-character key
+key_il				kil1	str	kA	KEY_IL		0511	-B-G-*	insert-line key
+key_left			kcub1	str	kl	KEY_LEFT	0404	YBCGE	left-arrow key
+key_ll				kll	str	kH	KEY_LL		0533	YB-G-	lower-left key (home down)
+key_npage			knp	str	kN	KEY_NPAGE	0522	YB-GE	next-page key
+key_ppage			kpp	str	kP	KEY_PPAGE	0523	YB-GE	previous-page key
+key_right			kcuf1	str	kr	KEY_RIGHT	0405	YBCGE	right-arrow key
+key_sf				kind	str	kF	KEY_SF		0520	-B-G-*	scroll-forward key
+key_sr				kri	str	kR	KEY_SR		0521	-B-G-*	scroll-backward key
+key_stab			khts	str	kT	KEY_STAB	0524	-B-G-*	set-tab key
+key_up				kcuu1	str	ku	KEY_UP		0403	YBCGE	up-arrow key
+keypad_local			rmkx	str	ke	-		-	YBCGE	leave 'keyboard_transmit' mode
+keypad_xmit			smkx	str	ks	-		-	YBCGE	enter 'keyboard_transmit' mode
+lab_f0				lf0	str	l0	-		-	-B-G-*	label on function key f0 if not f0
+lab_f1				lf1	str	l1	-		-	-B-G-*	label on function key f1 if not f1
+lab_f10				lf10	str	la	-		-	-----	label on function key f10 if not f10
+lab_f2				lf2	str	l2	-		-	-B-G-*	label on function key f2 if not f2
+lab_f3				lf3	str	l3	-		-	-B-G-*	label on function key f3 if not f3
+lab_f4				lf4	str	l4	-		-	-B-G-*	label on function key f4 if not f4
+lab_f5				lf5	str	l5	-		-	-B-G-*	label on function key f5 if not f5
+lab_f6				lf6	str	l6	-		-	-B-G-*	label on function key f6 if not f6
+lab_f7				lf7	str	l7	-		-	-B-G-*	label on function key f7 if not f7
+lab_f8				lf8	str	l8	-		-	-B-G-*	label on function key f8 if not f8
+lab_f9				lf9	str	l9	-		-	-B-G-*	label on function key f9 if not f9
+meta_off			rmm	str	mo	-		-	YB-G-*	turn off meta mode
+meta_on				smm	str	mm	-		-	YB-G-*	turn on meta mode (8th-bit on)
+newline				nel	str	nw	-		-	YB-G-*	newline (behave like cr followed by lf)
+pad_char			pad	str	pc	-		-	YBCGE	padding char (instead of null)
+parm_dch			dch	str	DC	-		-	YB-GE	delete #1 characters (P*)
+parm_delete_line		dl	str	DL	-		-	YBCGE	delete #1 lines (P*)
+parm_down_cursor		cud	str	DO	-		-	YBCGE	down #1 lines (P*)
+parm_ich			ich	str	IC	-		-	YB-GE	insert #1 characters (P*)
+parm_index			indn	str	SF	-		-	YBCG-	scroll forward #1 lines (P)
+parm_insert_line		il	str	AL	-		-	YBCGE	insert #1 lines (P*)
+parm_left_cursor		cub	str	LE	-		-	YBCGE	move #1 characters to the left (P)
+parm_right_cursor		cuf	str	RI	-		-	YBCGE	move #1 characters to the right (P*)
+parm_rindex			rin	str	SR	-		-	YBCG-	scroll back #1 lines (P)
+parm_up_cursor			cuu	str	UP	-		-	YBCGE	up #1 lines (P*)
+pkey_key			pfkey	str	pk	-		-	-B---	program function key #1 to type string #2
+pkey_local			pfloc	str	pl	-		-	-B---	program function key #1 to execute string #2
+pkey_xmit			pfx	str	px	-		-	-B---	program function key #1 to transmit string #2
+print_screen			mc0	str	ps	-		-	-B-G-*	print contents of screen
+prtr_off			mc4	str	pf	-		-	-B-G-*	turn off printer
+prtr_on				mc5	str	po	-		-	-B-G-*	turn on printer
+repeat_char			rep	str	rp	-		-	YB-GE	repeat char #1 #2 times (P*)
+reset_1string			rs1	str	r1	-		-	-B---	reset string
+reset_2string			rs2	str	r2	-		-	-B---	reset string
+reset_3string			rs3	str	r3	-		-	-B---	reset string
+reset_file			rf	str	rf	-		-	-B---	name of reset file
+restore_cursor			rc	str	rc	-		-	YBCG-	restore cursor to position of last save_cursor
+row_address			vpa	str	cv	-		-	-B-GE*	vertical position #1 absolute (P)
+save_cursor			sc	str	sc	-		-	YBCG-	save current cursor position (P)
+scroll_forward			ind	str	sf	-		-	YBCGE	scroll text up (P)
+scroll_reverse			ri	str	sr	-		-	YBCGE	scroll text down (P)
+set_attributes			sgr	str	sa	-		-	YB-G-	define video attributes #1-#9 (PG9)
+set_tab				hts	str	st	-		-	YB-G-	set a tab in every row, current columns
+set_window			wind	str	wi	-		-	-B-GE	current window is lines #1-#2 cols #3-#4
+tab				ht	str	ta	-		-	YBCGE	tab to next 8-space hardware tab stop
+to_status_line			tsl	str	ts	-		-	YB-G-	move to status line, column #1
+underline_char			uc	str	uc	-		-	YBCG-	underline char and move past it
+up_half_line			hu	str	hu	-		-	YB-G-	half a line up
+init_prog			iprog	str	iP	-		-	-B---	path name of program for initialization
+key_a1				ka1	str	K1	KEY_A1		0534	YB-GE	upper left of keypad
+key_a3				ka3	str	K3	KEY_A3		0535	YB-GE	upper right of keypad
+key_b2				kb2	str	K2	KEY_B2		0536	YB-GE	center of keypad
+key_c1				kc1	str	K4	KEY_C1		0537	YB-GE	lower left of keypad
+key_c3				kc3	str	K5	KEY_C3		0540	YB-GE	lower right of keypad
+prtr_non			mc5p	str	pO	-		-	-B-G-*	turn on printer for #1 bytes
+#
+# SVr1 capabilities stop here.	IBM's version of terminfo is the same as
+# SVr4 up to this point, but has a different set afterwards.
+#
+char_padding			rmp	str	rP	-		-	-----	like ip but when in insert mode
+acs_chars			acsc	str	ac	-		-	-----	graphics charset pairs, based on vt100
+plab_norm			pln	str	pn	-		-	-----	program label #1 to show string #2
+key_btab			kcbt	str	kB	KEY_BTAB	0541	-----	back-tab key
+enter_xon_mode			smxon	str	SX	-		-	-----	turn on xon/xoff handshaking
+exit_xon_mode			rmxon	str	RX	-		-	-----	turn off xon/xoff handshaking
+enter_am_mode			smam	str	SA	-		-	-----	turn on automatic margins
+exit_am_mode			rmam	str	RA	-		-	-----	turn off automatic margins
+xon_character			xonc	str	XN	-		-	-----	XON character
+xoff_character			xoffc	str	XF	-		-	-----	XOFF character
+ena_acs				enacs	str	eA	-		-	-----	enable alternate char set
+label_on			smln	str	LO	-		-	-----	turn on soft labels
+label_off			rmln	str	LF	-		-	-----	turn off soft labels
+key_beg				kbeg	str	@1	KEY_BEG		0542	-----	begin key
+key_cancel			kcan	str	@2	KEY_CANCEL	0543	-----	cancel key
+key_close			kclo	str	@3	KEY_CLOSE	0544	-----	close key
+key_command			kcmd	str	@4	KEY_COMMAND	0545	-----	command key
+key_copy			kcpy	str	@5	KEY_COPY	0546	-----	copy key
+key_create			kcrt	str	@6	KEY_CREATE	0547	-----	create key
+key_end				kend	str	@7	KEY_END		0550	-----	end key
+key_enter			kent	str	@8	KEY_ENTER	0527	-----	enter/send key
+key_exit			kext	str	@9	KEY_EXIT	0551	-----	exit key
+key_find			kfnd	str	@0	KEY_FIND	0552	-----	find key
+key_help			khlp	str	%1	KEY_HELP	0553	-----	help key
+key_mark			kmrk	str	%2	KEY_MARK	0554	-----	mark key
+key_message			kmsg	str	%3	KEY_MESSAGE	0555	-----	message key
+key_move			kmov	str	%4	KEY_MOVE	0556	-----	move key
+key_next			knxt	str	%5	KEY_NEXT	0557	-----	next key
+key_open			kopn	str	%6	KEY_OPEN	0560	-----	open key
+key_options			kopt	str	%7	KEY_OPTIONS	0561	-----	options key
+key_previous			kprv	str	%8	KEY_PREVIOUS	0562	-----	previous key
+key_print			kprt	str	%9	KEY_PRINT	0532	-----	print key
+key_redo			krdo	str	%0	KEY_REDO	0563	-----	redo key
+key_reference			kref	str	&1	KEY_REFERENCE	0564	-----	reference key
+key_refresh			krfr	str	&2	KEY_REFRESH	0565	-----	refresh key
+key_replace			krpl	str	&3	KEY_REPLACE	0566	-----	replace key
+key_restart			krst	str	&4	KEY_RESTART	0567	-----	restart key
+key_resume			kres	str	&5	KEY_RESUME	0570	-----	resume key
+key_save			ksav	str	&6	KEY_SAVE	0571	-----	save key
+key_suspend			kspd	str	&7	KEY_SUSPEND	0627	-----	suspend key
+key_undo			kund	str	&8	KEY_UNDO	0630	-----	undo key
+key_sbeg			kBEG	str	&9	KEY_SBEG	0572	-----	shifted begin key
+key_scancel			kCAN	str	&0	KEY_SCANCEL	0573	-----	shifted cancel key
+key_scommand			kCMD	str	*1	KEY_SCOMMAND	0574	-----	shifted command key
+key_scopy			kCPY	str	*2	KEY_SCOPY	0575	-----	shifted copy key
+key_screate			kCRT	str	*3	KEY_SCREATE	0576	-----	shifted create key
+key_sdc				kDC	str	*4	KEY_SDC		0577	-----	shifted delete-character key
+key_sdl				kDL	str	*5	KEY_SDL		0600	-----	shifted delete-line key
+key_select			kslt	str	*6	KEY_SELECT	0601	-----	select key
+key_send			kEND	str	*7	KEY_SEND	0602	-----	shifted end key
+key_seol			kEOL	str	*8	KEY_SEOL	0603	-----	shifted clear-to-end-of-line key
+key_sexit			kEXT	str	*9	KEY_SEXIT	0604	-----	shifted exit key
+key_sfind			kFND	str	*0	KEY_SFIND	0605	-----	shifted find key
+key_shelp			kHLP	str	#1	KEY_SHELP	0606	-----	shifted help key
+key_shome			kHOM	str	#2	KEY_SHOME	0607	-----	shifted home key
+key_sic				kIC	str	#3	KEY_SIC		0610	-----	shifted insert-character key
+key_sleft			kLFT	str	#4	KEY_SLEFT	0611	-----	shifted left-arrow key
+key_smessage			kMSG	str	%a	KEY_SMESSAGE	0612	-----	shifted message key
+key_smove			kMOV	str	%b	KEY_SMOVE	0613	-----	shifted move key
+key_snext			kNXT	str	%c	KEY_SNEXT	0614	-----	shifted next key
+key_soptions			kOPT	str	%d	KEY_SOPTIONS	0615	-----	shifted options key
+key_sprevious			kPRV	str	%e	KEY_SPREVIOUS	0616	-----	shifted previous key
+key_sprint			kPRT	str	%f	KEY_SPRINT	0617	-----	shifted print key
+key_sredo			kRDO	str	%g	KEY_SREDO	0620	-----	shifted redo key
+key_sreplace			kRPL	str	%h	KEY_SREPLACE	0621	-----	shifted replace key
+key_sright			kRIT	str	%i	KEY_SRIGHT	0622	-----	shifted right-arrow key
+key_srsume			kRES	str	%j	KEY_SRSUME	0623	-----	shifted resume key
+key_ssave			kSAV	str	!1	KEY_SSAVE	0624	-----	shifted save key
+key_ssuspend			kSPD	str	!2	KEY_SSUSPEND	0625	-----	shifted suspend key
+key_sundo			kUND	str	!3	KEY_SUNDO	0626	-----	shifted undo key
+req_for_input			rfi	str	RF	-		-	-----	send next input char (for ptys)
+key_f11				kf11	str	F1	KEY_F(11)	-	----E	F11 function key
+key_f12				kf12	str	F2	KEY_F(12)	-	----E	F12 function key
+key_f13				kf13	str	F3	KEY_F(13)	-	----E	F13 function key
+key_f14				kf14	str	F4	KEY_F(14)	-	----E	F14 function key
+key_f15				kf15	str	F5	KEY_F(15)	-	----E	F15 function key
+key_f16				kf16	str	F6	KEY_F(16)	-	----E	F16 function key
+key_f17				kf17	str	F7	KEY_F(17)	-	----E	F17 function key
+key_f18				kf18	str	F8	KEY_F(18)	-	----E	F18 function key
+key_f19				kf19	str	F9	KEY_F(19)	-	----E	F19 function key
+key_f20				kf20	str	FA	KEY_F(20)	-	----E	F20 function key
+key_f21				kf21	str	FB	KEY_F(21)	-	----E	F21 function key
+key_f22				kf22	str	FC	KEY_F(22)	-	----E	F22 function key
+key_f23				kf23	str	FD	KEY_F(23)	-	----E	F23 function key
+key_f24				kf24	str	FE	KEY_F(24)	-	----E	F24 function key
+key_f25				kf25	str	FF	KEY_F(25)	-	----E	F25 function key
+key_f26				kf26	str	FG	KEY_F(26)	-	----E	F26 function key
+key_f27				kf27	str	FH	KEY_F(27)	-	----E	F27 function key
+key_f28				kf28	str	FI	KEY_F(28)	-	----E	F28 function key
+key_f29				kf29	str	FJ	KEY_F(29)	-	----E	F29 function key
+key_f30				kf30	str	FK	KEY_F(30)	-	----E	F30 function key
+key_f31				kf31	str	FL	KEY_F(31)	-	----E	F31 function key
+key_f32				kf32	str	FM	KEY_F(32)	-	----E	F32 function key
+key_f33				kf33	str	FN	KEY_F(33)	-	----E	F33 function key
+key_f34				kf34	str	FO	KEY_F(34)	-	----E	F34 function key
+key_f35				kf35	str	FP	KEY_F(35)	-	----E	F35 function key
+key_f36				kf36	str	FQ	KEY_F(36)	-	----E	F36 function key
+key_f37				kf37	str	FR	KEY_F(37)	-	----E	F37 function key
+key_f38				kf38	str	FS	KEY_F(38)	-	----E	F38 function key
+key_f39				kf39	str	FT	KEY_F(39)	-	----E	F39 function key
+key_f40				kf40	str	FU	KEY_F(40)	-	----E	F40 function key
+key_f41				kf41	str	FV	KEY_F(41)	-	----E	F41 function key
+key_f42				kf42	str	FW	KEY_F(42)	-	----E	F42 function key
+key_f43				kf43	str	FX	KEY_F(43)	-	----E	F43 function key
+key_f44				kf44	str	FY	KEY_F(44)	-	----E	F44 function key
+key_f45				kf45	str	FZ	KEY_F(45)	-	----E	F45 function key
+key_f46				kf46	str	Fa	KEY_F(46)	-	----E	F46 function key
+key_f47				kf47	str	Fb	KEY_F(47)	-	----E	F47 function key
+key_f48				kf48	str	Fc	KEY_F(48)	-	----E	F48 function key
+key_f49				kf49	str	Fd	KEY_F(49)	-	----E	F49 function key
+key_f50				kf50	str	Fe	KEY_F(50)	-	----E	F50 function key
+key_f51				kf51	str	Ff	KEY_F(51)	-	----E	F51 function key
+key_f52				kf52	str	Fg	KEY_F(52)	-	----E	F52 function key
+key_f53				kf53	str	Fh	KEY_F(53)	-	----E	F53 function key
+key_f54				kf54	str	Fi	KEY_F(54)	-	----E	F54 function key
+key_f55				kf55	str	Fj	KEY_F(55)	-	----E	F55 function key
+key_f56				kf56	str	Fk	KEY_F(56)	-	----E	F56 function key
+key_f57				kf57	str	Fl	KEY_F(57)	-	----E	F57 function key
+key_f58				kf58	str	Fm	KEY_F(58)	-	----E	F58 function key
+key_f59				kf59	str	Fn	KEY_F(59)	-	----E	F59 function key
+key_f60				kf60	str	Fo	KEY_F(60)	-	----E	F60 function key
+key_f61				kf61	str	Fp	KEY_F(61)	-	----E	F61 function key
+key_f62				kf62	str	Fq	KEY_F(62)	-	----E	F62 function key
+key_f63				kf63	str	Fr	KEY_F(63)	-	----E	F63 function key
+clr_bol				el1	str	cb	-		-	-----	Clear to beginning of line
+clear_margins			mgc	str	MC	-		-	-----	clear right and left soft margins
+set_left_margin			smgl	str	ML	-		-	-----	set left soft margin at current column.	 (ML is not in BSD termcap).
+set_right_margin		smgr	str	MR	-		-	-----	set right soft margin at current column
+label_format			fln	str	Lf	-		-	-----	label format
+set_clock			sclk	str	SC	-		-	-----	set clock, #1 hrs #2 mins #3 secs
+display_clock			dclk	str	DK	-		-	-----	display clock
+remove_clock			rmclk	str	RC	-		-	-----	remove clock
+create_window			cwin	str	CW	-		-	-----	define a window #1 from #2,#3 to #4,#5
+goto_window			wingo	str	WG	-		-	-----	go to window #1
+hangup				hup	str	HU	-		-	-----	hang-up phone
+dial_phone			dial	str	DI	-		-	-----	dial number #1
+quick_dial			qdial	str	QD	-		-	-----	dial number #1 without checking
+tone				tone	str	TO	-		-	-----	select touch tone dialing
+pulse				pulse	str	PU	-		-	-----	select pulse dialing
+flash_hook			hook	str	fh	-		-	-----	flash switch hook
+fixed_pause			pause	str	PA	-		-	-----	pause for 2-3 seconds
+wait_tone			wait	str	WA	-		-	-----	wait for dial-tone
+user0				u0	str	u0	-		-	-----	User string #0
+user1				u1	str	u1	-		-	-----	User string #1
+user2				u2	str	u2	-		-	-----	User string #2
+user3				u3	str	u3	-		-	-----	User string #3
+user4				u4	str	u4	-		-	-----	User string #4
+user5				u5	str	u5	-		-	-----	User string #5
+user6				u6	str	u6	-		-	-----	User string #6
+user7				u7	str	u7	-		-	-----	User string #7
+user8				u8	str	u8	-		-	-----	User string #8
+user9				u9	str	u9	-		-	-----	User string #9
+#
+# SVr4 added these capabilities to support color
+#
+orig_pair			op	str	op	-		-	-----	Set default pair to its original value
+orig_colors			oc	str	oc	-		-	-----	Set all color pairs to the original ones
+initialize_color		initc	str	Ic	-		-	-----	initialize color #1 to (#2,#3,#4)
+initialize_pair			initp	str	Ip	-		-	-----	Initialize color pair #1 to fg=(#2,#3,#4), bg=(#5,#6,#7)
+set_color_pair			scp	str	sp	-		-	-----	Set current color pair to #1
+set_foreground			setf	str	Sf	-		-	-----	Set foreground color #1
+set_background			setb	str	Sb	-		-	-----	Set background color #1
+#
+# SVr4 added these capabilities to support printers
+#
+change_char_pitch		cpi	str	ZA	-		-	-----	Change number of characters per inch to #1
+change_line_pitch		lpi	str	ZB	-		-	-----	Change number of lines per inch to #1
+change_res_horz			chr	str	ZC	-		-	-----	Change horizontal resolution to #1
+change_res_vert			cvr	str	ZD	-		-	-----	Change vertical resolution to #1
+define_char			defc	str	ZE	-		-	-----	Define a character #1, #2 dots wide, descender #3
+enter_doublewide_mode		swidm	str	ZF	-		-	-----	Enter double-wide mode
+enter_draft_quality		sdrfq	str	ZG	-		-	-----	Enter draft-quality mode
+enter_italics_mode		sitm	str	ZH	-		-	-----	Enter italic mode
+enter_leftward_mode		slm	str	ZI	-		-	-----	Start leftward carriage motion
+enter_micro_mode		smicm	str	ZJ	-		-	-----	Start micro-motion mode
+enter_near_letter_quality	snlq	str	ZK	-		-	-----	Enter NLQ mode
+enter_normal_quality		snrmq	str	ZL	-		-	-----	Enter normal-quality mode
+enter_shadow_mode		sshm	str	ZM	-		-	-----	Enter shadow-print mode
+enter_subscript_mode		ssubm	str	ZN	-		-	-----	Enter subscript mode
+enter_superscript_mode		ssupm	str	ZO	-		-	-----	Enter superscript mode
+enter_upward_mode		sum	str	ZP	-		-	-----	Start upward carriage motion
+exit_doublewide_mode		rwidm	str	ZQ	-		-	-----	End double-wide mode
+exit_italics_mode		ritm	str	ZR	-		-	-----	End italic mode
+exit_leftward_mode		rlm	str	ZS	-		-	-----	End left-motion mode
+exit_micro_mode			rmicm	str	ZT	-		-	-----	End micro-motion mode
+exit_shadow_mode		rshm	str	ZU	-		-	-----	End shadow-print mode
+exit_subscript_mode		rsubm	str	ZV	-		-	-----	End subscript mode
+exit_superscript_mode		rsupm	str	ZW	-		-	-----	End superscript mode
+exit_upward_mode		rum	str	ZX	-		-	-----	End reverse character motion
+micro_column_address		mhpa	str	ZY	-		-	-----	Like column_address in micro mode
+micro_down			mcud1	str	ZZ	-		-	-----	Like cursor_down in micro mode
+micro_left			mcub1	str	Za	-		-	-----	Like cursor_left in micro mode
+micro_right			mcuf1	str	Zb	-		-	-----	Like cursor_right in micro mode
+micro_row_address		mvpa	str	Zc	-		-	-----	Like row_address #1 in micro mode
+micro_up			mcuu1	str	Zd	-		-	-----	Like cursor_up in micro mode
+order_of_pins			porder	str	Ze	-		-	-----	Match software bits to print-head pins
+parm_down_micro			mcud	str	Zf	-		-	-----	Like parm_down_cursor in micro mode
+parm_left_micro			mcub	str	Zg	-		-	-----	Like parm_left_cursor in micro mode
+parm_right_micro		mcuf	str	Zh	-		-	-----	Like parm_right_cursor in micro mode
+parm_up_micro			mcuu	str	Zi	-		-	-----	Like parm_up_cursor in micro mode
+select_char_set			scs	str	Zj	-		-	-----	Select character set, #1
+set_bottom_margin		smgb	str	Zk	-		-	-----	Set bottom margin at current line
+set_bottom_margin_parm		smgbp	str	Zl	-		-	-----	Set bottom margin at line #1 or (if smgtp is not given) #2 lines from bottom
+set_left_margin_parm		smglp	str	Zm	-		-	-----	Set left (right) margin at column #1
+set_right_margin_parm		smgrp	str	Zn	-		-	-----	Set right margin at column #1
+set_top_margin			smgt	str	Zo	-		-	-----	Set top margin at current line
+set_top_margin_parm		smgtp	str	Zp	-		-	-----	Set top (bottom) margin at row #1
+start_bit_image			sbim	str	Zq	-		-	-----	Start printing bit image graphics
+start_char_set_def		scsd	str	Zr	-		-	-----	Start character set definition #1, with #2 characters in the set
+stop_bit_image			rbim	str	Zs	-		-	-----	Stop printing bit image graphics
+stop_char_set_def		rcsd	str	Zt	-		-	-----	End definition of character set #1
+subscript_characters		subcs	str	Zu	-		-	-----	List of subscriptable characters
+superscript_characters		supcs	str	Zv	-		-	-----	List of superscriptable characters
+these_cause_cr			docr	str	Zw	-		-	-----	Printing any of these characters causes CR
+zero_motion			zerom	str	Zx	-		-	-----	No motion for subsequent character
+#%.TE
+#%.ad
+#%
+#%The following string capabilities are present in the SVr4.0 term structure,
+#%but were originally not documented in the man page.
+#%
+#%.na
+#%.TS H
+#%center expand;
+#%c l l c
+#%c l l c
+#%lw25 lw6 lw2 lw18.
+#%\fBVariable	Cap-	TCap	Description\fR
+#%\fBString	name	Code\fR
+char_set_names			csnm	str	Zy	-		-	-----	Produce #1'th item from list of character set names
+key_mouse			kmous	str	Km	KEY_MOUSE	0631	-----	Mouse event has occurred
+mouse_info			minfo	str	Mi	-		-	-----	Mouse status information
+req_mouse_pos			reqmp	str	RQ	-		-	-----	Request mouse position
+get_mouse			getm	str	Gm	-		-	-----	Curses should get button events, parameter #1 not documented.
+set_a_foreground		setaf	str	AF	-		-	-----	Set foreground color to #1, using ANSI escape
+set_a_background		setab	str	AB	-		-	-----	Set background color to #1, using ANSI escape
+pkey_plab			pfxl	str	xl	-		-	-----	Program function key #1 to type string #2 and show string #3
+device_type			devt	str	dv	-		-	-----	Indicate language/codeset support
+code_set_init			csin	str	ci	-		-	-----	Init sequence for multiple codesets
+set0_des_seq			s0ds	str	s0	-		-	-----	Shift to codeset 0 (EUC set 0, ASCII)
+set1_des_seq			s1ds	str	s1	-		-	-----	Shift to codeset 1
+set2_des_seq			s2ds	str	s2	-		-	-----	Shift to codeset 2
+set3_des_seq			s3ds	str	s3	-		-	-----	Shift to codeset 3
+set_lr_margin			smglr	str	ML	-		-	-----	Set both left and right margins to #1, #2.  (ML is not in BSD termcap).
+set_tb_margin			smgtb	str	MT	-		-	-----	Sets both top and bottom margins to #1, #2
+bit_image_repeat		birep	str	Xy	-		-	-----	Repeat bit image cell #1 #2 times
+bit_image_newline		binel	str	Zz	-		-	-----	Move to next row of the bit image
+bit_image_carriage_return	bicr	str	Yv	-		-	-----	Move to beginning of same row
+color_names			colornm	str	Yw	-		-	-----	Give name for color #1
+define_bit_image_region		defbi	str	Yx	-		-	-----	Define rectangular bit image region
+end_bit_image_region		endbi	str	Yy	-		-	-----	End a bit-image region
+set_color_band		setcolor	str	Yz	-		-	-----	Change to ribbon color #1
+set_page_length			slines	str	YZ	-		-	-----	Set page length to #1 lines
+#
+# SVr4 added these capabilities for direct PC-clone support
+#
+display_pc_char			dispc	str	S1	-		-	-----	Display PC character #1
+enter_pc_charset_mode		smpch	str	S2	-		-	-----	Enter PC character display mode
+exit_pc_charset_mode		rmpch	str	S3	-		-	-----	Exit PC character display mode
+enter_scancode_mode		smsc	str	S4	-		-	-----	Enter PC scancode mode
+exit_scancode_mode		rmsc	str	S5	-		-	-----	Exit PC scancode mode
+pc_term_options			pctrm	str	S6	-		-	-----	PC terminal options
+scancode_escape			scesc	str	S7	-		-	-----	Escape for scancode emulation
+alt_scancode_esc		scesa	str	S8	-		-	-----	Alternate escape for scancode emulation
+#%.TE
+#%.ad
+#%
+#%.in .8i
+#%The XSI Curses standard added these hardcopy capabilities.
+#%They were used in some post-4.1 versions of System V curses,
+#%e.g., Solaris 2.5 and IRIX 6.x.
+#%Except for \fBYI\fP, the \fBncurses\fR termcap names for them are invented.
+#%According to the XSI Curses standard, they have no termcap names.
+#%If your compiled terminfo entries use these,
+#%they may not be binary-compatible with System V terminfo
+#%entries after SVr4.1; beware!
+#%
+#%.na
+#%.TS H
+#%center expand;
+#%c l l c
+#%c l l c
+#%lw25 lw6 lw2 lw20.
+#%\fBVariable	Cap-	TCap	Description\fR
+#%\fBString	name	Code\fR
+enter_horizontal_hl_mode	ehhlm	str	Xh	-		-	-----	Enter horizontal highlight mode
+enter_left_hl_mode		elhlm	str	Xl	-		-	-----	Enter left highlight mode
+enter_low_hl_mode		elohlm	str	Xo	-		-	-----	Enter low highlight mode
+enter_right_hl_mode		erhlm	str	Xr	-		-	-----	Enter right highlight mode
+enter_top_hl_mode		ethlm	str	Xt	-		-	-----	Enter top highlight mode
+enter_vertical_hl_mode		evhlm	str	Xv	-		-	-----	Enter vertical highlight mode
+set_a_attributes		sgr1	str	sA	-		-	-----	Define second set of video attributes #1-#6
+set_pglen_inch			slength	str	YI	-		-	-----	Set page length to #1 hundredth of an inch (some implementations use sL for termcap).
+#%.TE
+#%.ad
+#
+# The magic token below tells the tic compiler-generator code that all the caps
+# past it should be ignored (not written out) when dumping terminfo objects. It
+# also tells the man page table generator not to pass through following lines
+# This means we can have obsolete capabilities and pseudo-capabilities that are
+# recognized for termcap or terminfo compilation, but not output.
+#
+# %%-STOP-HERE-%%
+#
+# Don't move this casually!  In fact, don't move it at all unless you're
+# either doing it to add System V or XPG4 extensions, or have decided you
+# don't care about SVr4 binary compatibility.
+#
+#############################################################################
+#
+# TERMCAP EXTENSION CAPABILITIES
+#
+# The capabilities below are either obsolete or extensions on certain systems.
+# They are not used by SVR4 terminfo.  Some are used by captoinfo to translate
+# termcap sources; the rest are listed for completeness, and in case somebody
+# cares about them enough to hack in code that will translate them into
+# terminfo capabilities.
+#
+# The first part of the list is from Ross Ridge's `mytinfo' package
+# (comp.sources.unix, volume 26); the variable names and terminfo names (as
+# well as the termcap codes) match his list.
+#
+# This group of codes is not marked obsolete in 4.4BSD, but have no direct
+# terminfo equivalents.  The rs capability is specially translated to terminfo
+# r2, and vice versa, if an entry does not already have an r2.  Similarly,
+# i2 is translated to r3 if there is no r3 (because SV terminfo maps is to i2).
+# The ug capability is thrown away, but assumed to be whatever sg is if the
+# latter is nonzero and we're dumping in termcap format.
+#
+termcap_init2			OTi2	str	i2	-		-	YB---	secondary initialization string
+termcap_reset			OTrs	str	rs	-		-	YB-G-	terminal reset string
+magic_cookie_glitch_ul		OTug	num	ug	-		-	YBCGE	number of blanks left by ul
+#
+# Obsolete termcap capabilities.  Some are used for termcap translation.  The
+# code uses the 'OT' prefix we put on obsolete capabilities to suppress
+# printing them in terminfo source dumps of compiled entries.
+#
+backspaces_with_bs		OTbs	bool	bs	-		-	YBCGE	uses ^H to move left
+crt_no_scrolling		OTns	bool	ns	-		-	YBCG-	crt cannot scroll
+no_correctly_working_cr		OTnc	bool	nc	-		-	YBCG-	no way to go to start of line
+carriage_return_delay		OTdC	num	dC	-		-	YB-G-	pad needed for CR
+new_line_delay			OTdN	num	dN	-		-	YB-G-	pad needed for LF
+linefeed_if_not_lf		OTnl	str	nl	-		-	YBCGE	use to move down
+backspace_if_not_bs		OTbc	str	bc	-		-	YBCGE	move left, if not ^H
+#
+# GNU termcap library extensions.  The GNU termcap file distributed with
+# Emacs no longer uses these, but MT showed up in pre-9.0 versions of the
+# BSD termcap file.  The name clash with terminfo MT is resolved by type
+# info; MT is converted to km.
+#
+gnu_has_meta_key		OTMT	bool	MT	-		-	----E	has meta key
+# gnu_tab_width			OTtw	num	tw	-		-	----E	tab width in spaces
+#
+# GNU termcap *does* include the following extended capability,  Only the
+# now-obsolete Ann Arbor terminals used it.
+#
+# gnu_change_scroll_region	OTcS	str	cS	-		-	---GE	alternate set scrolling region
+#
+# The following comments describe capnames so ancient that I believe no
+# software uses them any longer.  Some of these have to go because they
+# clash with terminfo names in ways that cannot be resolved by type
+# information.
+#
+# These mytinfo codes are not used in the 4.4BSD curses code.  They are
+# marked obsolete in the 4.4BSD manual pages.
+#
+# There is one conflict with terminfo; ma is in both.  This conflict is
+# resolved by type information.
+#
+# The `ko' capability is translated by special code.  It should contain a
+# comma-separated list of capabilities for which there are corresponding keys.
+# The `kn' code is accepted but ignored.
+#
+# The `ma' capability was a 4.0BSD feature used by vi version 2.
+# It consists of pairs of characters corresponding to kl, kr, ku, kd, and kh.
+# Besides being obsolete, that interpretation conflicts with max_attributes.
+#
+# Here is a description of memory_lock_above and memory_unlock:
+# "You can 'freeze' data on the screen by turning on Memory Lock in a line of
+# text.  All lines above the cursor's current line become locked in place on
+# the screen.  Then enter data normally.  When the screen fills up, any
+# further data entered forces the first line of unfrozen line text to scroll
+# under the frozen data.  Lines scrolled off the screen are inserted into
+# memory immediately preceding the first frozen line." (from the HP 700/96
+# User's manual).  VT100/ANSI memory lock set is \E[>2h, reset is \E[>2l.
+#
+# Applications that use terminfo are supposed to behave as though xr is
+# always true.
+#
+linefeed_is_newline		OTNL	bool	NL	-		-	YB---	move down with \n
+# even_parity			OTEP	bool	EP	-		-	-B---	terminal requires even parity
+# odd_parity			OTOP	bool	OP	-		-	-B---	terminal requires odd parity
+# half_duplex			OTHD	bool	HD	-		-	-B---	terminal is half-duplex
+# lower_case_only		OTLC	bool	LC	-		-	-B---	terminal has only lower case
+# upper_case_only		OTUC	bool	UC	-		-	-B---	terminal has only upper case
+backspace_delay			OTdB	num	dB	-		-	YB-G-	padding required for ^H
+# form_feed_delay		OTdF	num	dF	-		-	-B-G-	padding required for ^L
+horizontal_tab_delay		OTdT	num	dT	-		-	YB-G-	padding required for ^I
+# vertical_tab_delay		OTdV	num	dV	-		-	-B---	padding required for ^V
+number_of_function_keys		OTkn	num	kn	-		-	-B-G-	count of function keys
+other_non_function_keys		OTko	str	ko	-		-	-B-G-	list of self-mapped keycaps
+arrow_key_map			OTma	str	ma	-		-	YBC--	map motion-keys for vi version 2
+# memory_lock_above		OTml	str	ml	-		-	-B---	lock visible screen memory above the current line
+# memory_unlock			OTmu	str	mu	-		-	-B---	unlock visible screen memory above the current line
+has_hardware_tabs		OTpt	bool	pt	-		-	YB---	has 8-char tabs invoked with ^I
+return_does_clr_eol		OTxr	bool	xr	-		-	YB---	return clears the line
+# tek_4025_insert_line		OTxx	bool	xx	-		-	-BC--	Tektronix 4025 insert-line glitch
+#
+# mytinfo described this as a termcap capability, but it is not listed in the
+# 4.4BSD man pages, and not found in the 4.4BSD termcap file.  The ncurses
+# package, like System V, behaves as though it is always true.
+#
+# rind_only_at_top		OTxq	bool	xq	-		-	-----	reverse index only works from top line
+#
+# University of Waterloo termcap extensions (as described in mytinfo).
+# The `xl' termcap file clashes with a terminfo name; this ambiguity cannot
+# be resolved by a type check.  The descriptions are guesses from what was
+# in the mytinfo tables.
+#
+# key_interrupt_char		OTki	str	ki	-		-	-----	string set by interrupt key (?)
+# key_kill_char			OTkk	str	kk	-		-	-----	string set by kill key (?)
+# key_suspend_char		OTkz	str	kz	-		-	-----	string set by suspend key (?)
+# initialization_messy		OTxc	bool	xc	-		-	-----	initialization leaves garbage on the screen (?)
+# ind_at_bottom_does_cr		OTxl	bool	xl	-		-	-----	index does a carriage return
+#
+# Nonstandard capabilities unique to Ross Ridge's `mytinfo' package.
+# SR clashes with a terminfo name; this ambiguity cannot be resolved by a type
+# check.
+#
+# scroll_left			OTsl1	str	Sl	-		-	-----	scroll screen leftward
+# scroll_right			OTsr1	str	Sr	-		-	-----	scroll screen rightward
+# parm_scroll_left		OTsl	str	SL	-		-	-----	scroll screen leftward #1 characters
+# parm_scroll_right		OTsr	str	SR	-		-	-----	scroll screen rightward #1 characters
+#
+# The mytinfo capabilities end here.
+#
+# XENIX extensions:
+#
+# Xenix defined its own set of forms-drawing capabilities:
+#
+# cap	IBM ASCII	description             ACS         	ASCII
+# ---	-----------	--------------------    -------------	------
+# G1	191 \277 M-?	single upper right   	ACS_URCORNER
+# G2	218 \332 M-Z	single upper left	ACS_ULCORNER
+# G3	192 \300 M-@	single lower left	ACS_LLCORNER
+# G4	217 \331 M-Y	single lower right	ACS_LRCORNER
+# G5	187 \273 M-;	double upper right
+# G6	201 \311 M-I	double upper left
+# G7	200 \310 M-H	double lower left
+# G8	188 \274 M-<	double lower right
+# GC	197 \305 M-E	single intersection	ACS_PLUS	_ _
+# GD	194 \302 M-B	single down-tick	ACS_TTEE	 |
+# GH	196 \304 M-D	single horizontal line	ACS_HLINE
+# GL	180 \264 M-4	single left tick	ACS_RTEE	-|
+# GR	195 \303 M-C	single right tick	ACS_LTEE	|-
+# GU	193 \301 M-A	single up tick		ACS_BTEE	_|_
+# GV	179 \263 M-3	single vertical line	ACS_VLINE
+# Gc	206 \316 M-N	double intersection
+# Gd	203 \313 M-K	double down tick
+# Gh	205 \315 M-M	double horizontal line
+# Gl	204 \204 M-L	double left tick
+# Gr	185 \271 M-9	double right tick
+# Gu	202 \312 M-J	double up tick
+# Gv	186 \272 M-:	double vertical line
+#
+# The compiler will translate the single-line caps and discard the others
+# (via IGNORE aliases further down).  We don't want to do normal pad
+# translation on these, they're often single-character printable ASCII
+# strings that happen to be numerics.  There's awk code in parametrized.sh
+# that detects the acs_ prefix and uses it to suppress pad translation.
+# These terminfo names are invented.
+#
+acs_ulcorner			OTG2	str	G2	-		-	-----	single upper left
+acs_llcorner			OTG3	str	G3	-		-	-----	single lower left
+acs_urcorner			OTG1	str	G1	-		-	-----	single upper right
+acs_lrcorner			OTG4	str	G4	-		-	-----	single lower right
+acs_ltee			OTGR	str	GR	-		-	-----	tee pointing right
+acs_rtee			OTGL	str	GL	-		-	-----	tee pointing left
+acs_btee			OTGU	str	GU	-		-	-----	tee pointing up
+acs_ttee			OTGD	str	GD	-		-	-----	tee pointing down
+acs_hline			OTGH	str	GH	-		-	-----	single horizontal line
+acs_vline			OTGV	str	GV	-		-	-----	single vertical line
+acs_plus			OTGC	str	GC	-		-	-----	single intersection
+#
+#############################################################################
+#
+# TERMINFO EXTENSION CAPABILITIES
+#
+# (see Caps-ncurses for the complete set of comments)
+#
+memory_lock			meml	str	ml	-		-	----K	lock memory above cursor
+memory_unlock			memu	str	mu	-		-	----K	unlock memory
+box_chars_1			box1	str	bx	-		-	----K	box characters primary set
+#############################################################################
diff --git a/include/Caps-ncurses b/include/Caps-ncurses
new file mode 100644
index 0000000..e39ce0e
--- /dev/null
+++ b/include/Caps-ncurses
@@ -0,0 +1,463 @@
+##############################################################################
+# Copyright 2019-2021,2022 Thomas E. Dickey                                  #
+#                                                                            #
+# 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey
+#
+# $Id: Caps-ncurses,v 1.12 2022/07/03 19:53:44 tom Exp $
+#
+#############################################################################
+#
+# TERMINFO EXTENSION CAPABILITIES
+#
+# This section is all comments (selected lines are copied/uncommented into
+# specific "Caps" files).  The section describes what capabilities need to be
+# squeezed out to get down to the XSI Curses standard set.  They are flagged
+# with K.
+#
+# HP extensions
+#
+# These extensions follow ptr_non (replacing everything after it) in HP
+# terminfo files.  Except for memory_lock and memory_unlock, they are
+# functionally identical to SVr4 extensions, but they make the binary format
+# different.  Grrr....
+#
+#memory_lock			meml	str	ml	-		-	----K	lock memory above cursor
+#memory_unlock			memu	str	mu	-		-	----K	unlock memory
+#plab_norm			pln	str	pn	-		-	-----	program label #1 to show string #2
+#label_on			smln	str	LO	-		-	-----	turn on soft labels
+#label_off			rmln	str	LF	-		-	-----	turn off soft labels
+#key_f11			kf11	str	F1	-		-	-----	F11 function key
+#key_f12			kf12	str	F2	-		-	-----	F12 function key
+#key_f13			kf13	str	F3	-		-	-----	F13 function key
+#key_f14			kf14	str	F4	-		-	-----	F14 function key
+#key_f15			kf15	str	F5	-		-	-----	F15 function key
+#key_f16			kf16	str	F6	-		-	-----	F16 function key
+#key_f17			kf17	str	F7	-		-	-----	F17 function key
+#key_f18			kf18	str	F8	-		-	-----	F18 function key
+#key_f19			kf19	str	F9	-		-	-----	F19 function key
+#key_f20			kf20	str	FA	-		-	-----	F20 function key
+#key_f21			kf21	str	FB	-		-	-----	F21 function key
+#key_f22			kf22	str	FC	-		-	-----	F22 function key
+#key_f23			kf23	str	FD	-		-	-----	F23 function key
+#key_f24			kf24	str	FE	-		-	-----	F24 function key
+#key_f25			kf25	str	FF	-		-	-----	F25 function key
+#key_f26			kf26	str	FG	-		-	-----	F26 function key
+#key_f27			kf27	str	FH	-		-	-----	F27 function key
+#key_f28			kf28	str	FI	-		-	-----	F28 function key
+#key_f29			kf29	str	FJ	-		-	-----	F29 function key
+#key_f30			kf30	str	FK	-		-	-----	F30 function key
+#key_f31			kf31	str	FL	-		-	-----	F31 function key
+#key_f32			kf32	str	FM	-		-	-----	F32 function key
+#key_f33			kf33	str	FN	-		-	-----	F33 function key
+#key_f34			kf34	str	FO	-		-	-----	F34 function key
+#key_f35			kf35	str	FP	-		-	-----	F35 function key
+#key_f36			kf36	str	FQ	-		-	-----	F36 function key
+#key_f37			kf37	str	FR	-		-	-----	F37 function key
+#key_f38			kf38	str	FS	-		-	-----	F38 function key
+#key_f39			kf39	str	FT	-		-	-----	F39 function key
+#key_f40			kf40	str	FU	-		-	-----	F40 function key
+#key_f41			kf41	str	FV	-		-	-----	F41 function key
+#key_f42			kf42	str	FW	-		-	-----	F42 function key
+#key_f43			kf43	str	FX	-		-	-----	F43 function key
+#key_f44			kf44	str	FY	-		-	-----	F44 function key
+#key_f45			kf45	str	FZ	-		-	-----	F45 function key
+#key_f46			kf46	str	Fa	-		-	-----	F46 function key
+#key_f47			kf47	str	Fb	-		-	-----	F47 function key
+#key_f48			kf48	str	Fc	-		-	-----	F48 function key
+#key_f49			kf49	str	Fd	-		-	-----	F49 function key
+#key_f50			kf50	str	Fe	-		-	-----	F50 function key
+#key_f51			kf51	str	Ff	-		-	-----	F51 function key
+#key_f52			kf52	str	Fg	-		-	-----	F52 function key
+#key_f53			kf53	str	Fh	-		-	-----	F53 function key
+#key_f54			kf54	str	Fi	-		-	-----	F54 function key
+#key_f55			kf55	str	Fj	-		-	-----	F55 function key
+#key_f56			kf56	str	Fk	-		-	-----	F56 function key
+#key_f57			kf57	str	Fl	-		-	-----	F57 function key
+#key_f58			kf58	str	Fm	-		-	-----	F58 function key
+#key_f59			kf59	str	Fn	-		-	-----	F59 function key
+#key_f60			kf60	str	Fo	-		-	-----	F60 function key
+#key_f61			kf61	str	Fp	-		-	-----	F61 function key
+#key_f62			kf62	str	Fq	-		-	-----	F62 function key
+#key_f63			kf63	str	Fr	-		-	-----	F63 function key
+#
+# IBM extensions
+#
+# These extensions follow ptr_non (replacing everything after it) in IBM
+# terminfo files.
+#
+# The places in the box[12] capabilities correspond to acsc characters, here is
+# the mapping:
+#
+#	box1[0]  = ACS_ULCORNER
+#	box1[1]  = ACS_HLINE
+#	box1[2]  = ACS_URCORNER
+#	box1[3]  = ACS_VLINE
+#	box1[4]  = ACS_LRCORNER
+#	box1[5]  = ACS_LLCORNER
+#	box1[6]  = ACS_TTEE
+#	box1[7]  = ACS_RTEE
+#	box1[8]  = ACS_BTEE
+#	box1[9]  = ACS_LTEE
+#	box1[10] = ACS_PLUS
+#
+# The box2 characters are the double-line versions of these forms graphics.
+#
+#box_chars_1			box1	str	bx	-		-	----K	box characters primary set
+#box_chars_2			box2	str	by	-		-	----K	box characters secondary set
+#box_attr_1			batt1	str	Bx	-		-	----K	attributes for box1
+#box_attr_2			batt2	str	By	-		-	----K	attributes for box2
+#color_bg_0			colb0	str	d0	-		-	----K	background color 0
+#color_bg_1			colb1	str	d1	-		-	----K	background color 1
+#color_bg_2			colb2	str	d2	-		-	----K	background color 2
+#color_bg_3			colb3	str	d3	-		-	----K	background color 3
+#color_bg_4			colb4	str	d4	-		-	----K	background color 4
+#color_bg_5			colb5	str	d5	-		-	----K	background color 5
+#color_bg_6			colb6	str	d6	-		-	----K	background color 6
+#color_bg_7			colb7	str	d7	-		-	----K	background color 7
+#color_fg_0			colf0	str	c0	-		-	----K	foreground color 0
+#color_fg_1			colf1	str	c1	-		-	----K	foreground color 1
+#color_fg_2			colf2	str	c2	-		-	----K	foreground color 2
+#color_fg_3			colf3	str	c3	-		-	----K	foreground color 3
+#color_fg_4			colf4	str	c4	-		-	----K	foreground color 4
+#color_fg_5			colf5	str	c5	-		-	----K	foreground color 5
+#color_fg_6			colf6	str	c6	-		-	----K	foreground color 6
+#color_fg_7			colf7	str	c7	-		-	----K	foreground color 7
+#font_0				font0	str	f0	-		-	-----	select font 0
+#font_1				font1	str	f1	-		-	-----	select font 1
+#font_2				font2	str	f2	-		-	-----	select font 2
+#font_3				font3	str	f3	-		-	-----	select font 3
+#font_4				font4	str	f4	-		-	----K	select font 4
+#font_5				font5	str	f5	-		-	----K	select font 5
+#font_6				font6	str	f6	-		-	----K	select font 6
+#font_7				font7	str	f7	-		-	----K	select font 7
+#key_back_tab			kbtab	str	k0	-		-	-----	backtab key
+#key_do				kdo	str	ki	-		-	----K	do request key
+#key_command			kcmd	str	kd	-		-	----K	command-request key
+#key_command_pane		kcpn	str	kW	-		-	----K	command-pane key
+#key_end			kend	str	kw	-		-	-----	end key
+#key_help			khlp	str	kq	-		-	-----	help key
+#key_newline			knl	str	nl	-		-	----K	newline key
+#key_next_pane			knpn	str	kv	-		-	----K	next-pane key
+#key_prev_cmd			kppn	str	kp	-		-	----K	previous-command key
+#key_prev_pane			kppn	str	kV	-		-	----K	previous-pane key
+#key_quit			kquit	str	kQ	-		-	----K	quit key
+#key_select			ksel	str	kU	-		-	-----	select key
+#key_scroll_left		kscl	str	kz	-		-	----K	scroll left
+#key_scroll_right		kscr	str	kZ	-		-	----K	scroll right
+#key_tab			ktab	str	ko	-		-	----K	tab key
+#key_smap_in1			kmpf1	str	Kv	-		-	----K	special mapped key 1 input
+#key_smap_out1			kmpt1	str	KV	-		-	----K	special mapped key 1 output
+#key_smap_in2			kmpf2	str	Kw	-		-	----K	special mapped key 2 input
+#key_smap_out2			kmpt2	str	KW	-		-	----K	special mapped key 2 output
+#key_smap_in3			kmpf3	str	Kx	-		-	----K	special mapped key 3 input
+#key_smap_out3			kmpt3	str	KX	-		-	----K	special mapped key 3 output
+#key_smap_in4			kmpf4	str	Ky	-		-	----K	special mapped key 4 input
+#key_smap_out4			kmpt4	str	KY	-		-	----K	special mapped key 4 output
+#key_smap_in5			kmpf5	str	Kz	-		-	----K	special mapped key 5 input
+#key_smap_out5			kmpt5	str	KZ	-		-	----K	special mapped key 5 output
+#appl_defined_str		apstr	str	za	-		-	----K	application-defined string
+# The key_smap_in[6789] and key_smap_out[6789] capabilities aren't described in
+# the IBM manual pages, so the cap name strings are guesses.  The terminfo
+# names are almost certainly right, the termcap ones almost certainly wrong.
+#key_smap_in6			kmpf6	str	k!	-		-	----K	special mapped key 6 input
+#key_smap_out6			kmpt6	str	K@	-		-	----K	special mapped key 6 output
+#key_smap_in7			kmpf7	str	k#	-		-	----K	special mapped key 7 input
+#key_smap_out7			kmpt7	str	K$	-		-	----K	special mapped key 7 output
+#key_smap_in8			kmpf8	str	k%	-		-	----K	special mapped key 8 input
+#key_smap_out8			kmpt8	str	K^	-		-	----K	special mapped key 8 output
+#key_smap_in9			kmpf9	str	k&	-		-	----K	special mapped key 9 input
+#key_smap_out9			kmpt9	str	K*	-		-	----K	special mapped key 9 output
+# Undocumented capabilities end here
+#key_sf1			ksf1	str	S1	-		-	----K	special function key 1
+#key_sf2			ksf2	str	S2	-		-	----K	special function key 2
+#key_sf3			ksf3	str	S3	-		-	----K	special function key 3
+#key_sf4			ksf4	str	S4	-		-	----K	special function key 4
+#key_sf5			ksf5	str	S5	-		-	----K	special function key 5
+#key_sf6			ksf6	str	S6	-		-	----K	special function key 6
+#key_sf7			ksf7	str	S7	-		-	----K	special function key 7
+#key_sf8			ksf8	str	S8	-		-	----K	special function key 8
+#key_sf9			ksf9	str	S9	-		-	----K	special function key 9
+#key_sf10			ksf10	str	SA	-		-	----K	special function key 10
+# AIX version 3 documents different codes for F11, F12 and does not mention
+# F13-F64.  AIX version 4 uses the same naming for F0-F63 as above.
+#key_f11			kf11	str	k<	-		-	-----	function key 11
+#key_f12			kf12	str	k>	-		-	-----	function key 12
+# Undocumented capabilities end here.
+#key_action			kact	str	kJ	-		-	----K	sent by action key
+# The IBM docs say these capabilities are for table-drawing, and are
+# valid only for aixterm descriptions.
+#enter_topline_mode		topl	str	tp	-		-	----K	start top-line mode
+#enter_bottom_mode		btml	str	bm	-		-	----K	start bottom-line mode
+#enter_rvert_mode		rvert	str	rv	-		-	----K	start right-vertical mode
+#enter_lvert_mode		lvert	str	lv	-		-	----K	start left-vertical mode
+#
+#############################################################################
+#
+# ALIAS DECLARATIONS
+#
+# Here we set up aliases for translating extensions into standard terminfo.
+#
+#---------------------------------- Termcap aliases -------------------------
+#
+# BSD aliases:
+#
+# This is a common error in many termcap files.  We'll get notified during
+# translation when this (or any other alias) fires.
+#
+capalias	sb	sr	BSD	scroll text down
+#
+# AT&T extensions:
+#
+# The old AT&T 5410, 5420, 5425, pc6300plus, 610, and s4 entries used a set of
+# nonstandard capabilities.  Its signature is the KM capability, used to name
+# some sort of keymap file.  EE, BO, CI, CV, XS, DS, FL and FE are in this
+# set.  Comments in the original, and a little cross-checking with other AT&T
+# documentation, seem to establish the following mappings:
+#
+capalias	BO	mr	AT&T	enter_reverse_mode
+capalias	CI	vi	AT&T	cursor_invisible
+capalias	CV	ve	AT&T	cursor_normal
+capalias	DS	mh	AT&T	enter_dim_mode
+#capalias	EE	me	AT&T	exit_attribute_mode
+capalias	FE	LF	AT&T	label_on
+capalias	FL	LO	AT&T	label_off
+capalias	XS	mk	AT&T	enter_secure_mode
+#
+# We comment out EE because the conflicting XENIX EE is more common in
+# old entries.
+#
+# XENIX extensions:
+#
+# These are the ones we know how to translate directly:
+#
+capalias	EE	mh	XENIX	exit_attribute_mode
+capalias	GE	ae	XENIX	exit_alt_charset_mode
+capalias	GS	as	XENIX	enter_alt_charset_mode
+capalias	CF	vi	XENIX	cursor_invis
+capalias	CO	ve	XENIX	cursor_normal
+capalias	EN	@7	XENIX	key_end
+capalias	HM	kh	XENIX	key_home
+capalias	LD	kL	XENIX	key_dl
+capalias	PD	kN	XENIX	key_npage
+capalias	PN	po	XENIX	prtr_off
+capalias	PS	pf	XENIX	prtr_on
+capalias	PU	kP	XENIX	key_ppage
+capalias	RT	@8	XENIX	kent
+capalias	UP	ku	XENIX	kcuu1
+capalias	G6	IGNORE	XENIX	double-ACS_ULCORNER
+capalias	G7	IGNORE	XENIX	double-ACS_LLCORNER
+capalias	G5	IGNORE	XENIX	double-ACS_URCORNER
+capalias	G8	IGNORE	XENIX	double-ACS_LRCORNER
+capalias	Gr	IGNORE	XENIX	double-ACS_LTEE
+capalias	Gr	IGNORE	XENIX	double-ACS_RTEE
+capalias	Gu	IGNORE	XENIX	double-ACS_BTEE
+capalias	Gd	IGNORE	XENIX	double ACS_TTEE
+capalias	Gh	IGNORE	XENIX	double-ACS_HLINE
+capalias	Gv	IGNORE	XENIX	double-ACS_VLINE
+capalias	Gc	IGNORE	XENIX	double-ACS_PLUS
+capalias	GG	IGNORE	XENIX	acs-glitch
+#
+# IBM extensions:
+#
+capalias	kq	%1	IBM	key_help
+#
+# Iris extensions:
+#
+capalias	HS	mh	IRIS	enter_dim_mode
+#
+# Tektronix extensions:
+#
+capalias	KA	k;	Tek	key_f10
+capalias	KB	F1	Tek	key_f11
+capalias	KC	F2	Tek	key_f12
+capalias	KD	F3	Tek	key_f13
+capalias	KE	F4	Tek	key_f14
+capalias	KF	F5	Tek	key_f15
+capalias	BC	Sb	Tek	set_background
+capalias	FC	Sf	Tek	set_foreground
+#
+# There are also the following:
+#
+#	XENIX	XENIX variable name	name clash with terminfo?
+#	-----	-------------------	-------------------------
+#	CL	key_char_left
+#	CR	key_char_right
+#	CW	key_change_window
+#	HP	??
+#	LF	key_linefeed 		label_off
+#	NU	key_next_unlocked_cell
+#	PL	??
+#	PR	??
+#	RC	key_recalc		remove_clock
+#	RF	key_toggle_ref		req_for_input
+#	WL	key_word_left
+#	WR	key_word_right
+#
+# If you know what any of the question-marked ones mean, please tell us.
+#
+#--------------------------------- Terminfo aliases ------------------------
+#
+# IBM extensions:
+#
+infoalias	font0	s0ds	IBM	set0_des_seq
+infoalias	font1	s1ds	IBM	set1_des_seq
+infoalias	font2	s2ds	IBM	set2_des_seq
+infoalias	font3	s3ds	IBM	set3_des_seq
+infoalias	kbtab	kcbt	IBM	key_backtab
+infoalias	ksel	kslt	IBM	key_select
+#
+# Some others are identical to SVr4/XPG4 capabilities, in particular:
+# kcmd, kend, khlp, and kf11...kf63.
+#
+#############################################################################
+# This is a table of ncurses user-definable capabilities which applications
+# developers may have used.  ncurses may use the table to check consistency of
+# types/parameters.  Applications may have defined others (such as screen's
+# LP and NF), but where a standard capability is available, those alternatives
+# are not listed here.
+#
+used_by ncurses
+userdef	CO 	num	n	number of indexed colors overlaying RGB space
+userdef	E3	str	-	clears the terminal's scrollback buffer.
+userdef	NQ	bool	-	terminal does not support query/response
+userdef	RGB	bool	-	use direct colors with 1/3 of color-pair bits per color.
+userdef	RGB	num	n	use direct colors with given number of bits per color.
+userdef	RGB	str	-	use direct colors with given bit-layout.
+userdef	TS	str	-	like "tsl", but uses no parameter.
+userdef	U8	num	n	terminal does/does not support VT100 SI/SO when processing UTF-8 encoding.
+userdef	XM	str	n	initialize alternate xterm mouse mode
+userdef	grbom	str	-	disable real bold (not intensity bright) mode.
+userdef	gsbom	str	-	enable real bold (not intensity bright) mode.
+userdef	xm	str	-	mouse response, no parameters
+userdef	xm	str	n	mouse response, p1 = y-ordinate
+userdef	xm	str	nn	mouse response, p2 = x-ordinate
+userdef	xm	str	nnn	mouse response, p3 = button
+userdef	xm	str	nnns	mouse response, p4 = state, e.g., pressed or released
+userdef	xm	str	nnnsn	mouse response, p5 = y-ordinate starting region
+userdef	xm	str	nnnsnn	mouse response, p6 = x-ordinate starting region
+userdef	xm	str	nnnsnnn	mouse response, p7 = y-ordinate ending region
+userdef	xm	str	nnnsnnnn mouse response, p8 = x-ordinate ending region
+#
+used_by mintty
+userdef Rmol	str	-	remove overline-mode
+userdef Smol	str	-	set overline-mode
+userdef blink2	str	-	turn on rapid blinking
+userdef norm	str	-	turn off bold and half-bright mode
+userdef opaq	str	-	turn off blank mode
+userdef	setal	str	n	set underline-color
+userdef smul2	str	-	begin double underline mode
+#
+used_by screen
+userdef	AN	bool	-	turn on autonuke.
+userdef	AX	bool	-	understands ANSI set default fg/bg color (\E[39m / \E[49m).
+userdef	C0	str	-	use the string as a conversion table for font '0', like acsc.
+userdef	C8	bool	-	terminal shows bold as high-intensity colors.
+userdef	CE	str	-	switch cursor-keys back to normal mode.
+userdef	CS	str	-	switch cursor-keys to application mode.
+userdef	E0	str	-	switch charset 'G0' back to standard charset. Default is '\E(B'.
+userdef	G0	bool	-	terminal can deal with ISO 2022 font selection sequences.
+userdef	KJ	str	s	set the encoding of the terminal.
+userdef	OL	num	n	set the screen program's output buffer limit.
+userdef	S0	str	s	switch charset 'G0' to the specified charset. Default is '\E(%.'.
+userdef	TF	bool	-	add missing capabilities to screen's termcap/info entry. (Set by default).
+userdef	WS	str	nn	resize display. This capability has the desired width and height as arguments. SunView(tm) example: '\E[8;%d;%dt'.
+userdef	XC	str	s	describe a translation of characters to strings depending on the current font.
+userdef	XT	bool	-	terminal understands special xterm sequences (OSC, mouse tracking).
+userdef	Z0	str	-	change width to 132 columns.
+userdef	Z1	str	-	change width to 80 columns.
+#
+used_by tmux
+userdef	Cr	str	-	restore the default cursor color.
+userdef	Cs	str	s	set the cursor color.
+userdef	Csr	str	n	change the cursor style, overriding Ss.
+userdef	Ms	str	ss	store the current buffer in the host terminal's selection (clipboard).
+userdef	Se	str	-	reset the cursor style to the terminal initial state.
+userdef	Smulx	str	n	modify the appearance of underlines in VTE.
+userdef	Ss	str	n	change the cursor style.
+userdef	rmxx	str	-	reset ECMA-48 strikeout/crossed-out attributes.
+userdef	smxx	str	-	set ECMA-48 strikeout/crossed-out attributes.
+#
+used_by xterm
+userdef	csl	str	-	clear status line
+userdef	kDC3	str	-	alt delete-character
+userdef	kDC4	str	-	shift+alt delete-character
+userdef	kDC5	str	-	control delete-character
+userdef	kDC6	str	-	shift+control delete-character
+userdef	kDC7	str	-	alt+control delete-character
+userdef	kDN	str	-	shift down-cursor
+userdef	kDN3	str	-	alt down-cursor
+userdef	kDN4	str	-	shift+alt down-cursor
+userdef	kDN5	str	-	control down-cursor
+userdef	kDN6	str	-	shift+control down-cursor
+userdef	kDN7	str	-	alt+control down-cursor
+userdef	kEND3	str	-	alt end
+userdef	kEND4	str	-	shift+alt end
+userdef	kEND5	str	-	control end
+userdef	kEND6	str	-	shift+control end
+userdef	kEND7	str	-	alt+control end
+userdef	kHOM3	str	-	alt home
+userdef	kHOM4	str	-	shift+alt home
+userdef	kHOM5	str	-	control home
+userdef	kHOM6	str	-	shift+control home
+userdef	kHOM7	str	-	alt+control home
+userdef	kIC3	str	-	alt insert-character
+userdef	kIC4	str	-	shift+alt insert-character
+userdef	kIC5	str	-	control insert-character
+userdef	kIC6	str	-	shift+control insert-character
+userdef	kIC7	str	-	alt+control insert-character
+userdef	kLFT3	str	-	alt left-cursor
+userdef	kLFT4	str	-	shift+alt left-cursor
+userdef	kLFT5	str	-	control left-cursor
+userdef	kLFT6	str	-	shift+control left-cursor
+userdef	kLFT7	str	-	alt+control left-cursor
+userdef	kNXT3	str	-	alt next
+userdef	kNXT4	str	-	shift+alt next
+userdef	kNXT5	str	-	control next
+userdef	kNXT6	str	-	shift+control next
+userdef	kNXT7	str	-	alt+control next
+userdef	kPRV3	str	-	alt previous
+userdef	kPRV4	str	-	shift+alt previous
+userdef	kPRV5	str	-	control previous
+userdef	kPRV6	str	-	shift+control previous
+userdef	kPRV7	str	-	alt+control previous
+userdef	kRIT3	str	-	alt right-cursor
+userdef	kRIT4	str	-	shift+alt right-cursor
+userdef	kRIT5	str	-	control right-cursor
+userdef	kRIT6	str	-	shift+control right-cursor
+userdef	kRIT7	str	-	alt+control right-cursor
+userdef	kUP	str	-	shift up-cursor
+userdef	kUP3	str	-	alt up-cursor
+userdef	kUP4	str	-	shift+alt up-cursor
+userdef	kUP5	str	-	control up-cursor
+userdef	kUP6	str	-	shift+control up-cursor
+userdef	kUP7	str	-	alt+control up-cursor
+userdef	ka2	str	-	vt220-keypad extensions
+userdef	kb1	str	-	vt220-keypad extensions
+userdef	kb3	str	-	vt220-keypad extensions
+userdef	kc2	str	-	vt220-keypad extensions
+#############################################################################
diff --git a/include/Caps.aix4 b/include/Caps.aix4
new file mode 100644
index 0000000..ee9f2cf
--- /dev/null
+++ b/include/Caps.aix4
@@ -0,0 +1,1073 @@
+##############################################################################
+# Copyright 2019-2020,2021 Thomas E. Dickey                                  #
+# Copyright 2001-2015,2016 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.                                                             #
+##############################################################################
+#
+# Author: Thomas Dickey
+#
+# $Id: Caps.aix4,v 1.20 2021/10/08 07:55:48 tom Exp $
+#
+# This is an adaptation of ncurses' termcap/terminfo capability table, which
+# is designed to align with AIX 4.x's terminfo.
+#
+# This table is used to generate initializers for tables that drive tic,
+# infocmp, and the library compilation code used to support the termcap
+# compatibility hack.  It is also used to generate the tabular portion of the
+# terminfo(5) man page; lines beginning with `#%' are passed through to become
+# the terminfo table.
+#
+# This file has three major sections; a standard-capabilities table, two
+# extension-capability tables, and a section of aliases declarations.
+# The first two have the same format, as follows:
+#
+# FILE FORMAT
+#
+# Column 1: terminfo variable name
+# Column 2: terminfo capability name
+# Column 3: capability type (boolean, numeric, or string)
+# Column 4: termcap capability name
+# Column 5: KEY_xxx name, if any, `-' otherwise
+# Column 6: value for KEY_xxx name, if any, `-' otherwise
+# Column 7: Lead with `Y' if capability should be emitted in termcap
+#           translations, `-' otherwise
+# Column 8: capability description
+#
+# The codes following [Y-] in column 7 describe the versions of termcap which
+# use the given capability.  This information is not used by the curses library
+# proper; rather, it is there to help the terminfo maintainer avoid emitting
+# termcap entry translations that are more than 1023 bytes long (and tank a
+# lot of old termcap-using programs).  The codes read as follows:
+#	B = mentioned in the BSD man page for 4.4BSD curses
+#	C = used by the 4.4BSD curses library
+#	G = mentioned in the documentation for GNU termcap
+#	E = used by GNU Emacs
+#	K = remove this terminfo capability when translating to standard format
+# The important codes are C and E.  A cap with C or E should be preserved in
+# translation if possible.  The problem is that preserving all such caps may
+# lead to some termcap translations being too long.  The termcap maintainer
+# has a bit of a juggling act to do...potential problem cases are marked with
+# an asterisk (*).
+#
+# The aliases section has the following format:
+#
+# Column 1: either `capalias' or `infoalias'
+# Column 2: name to be aliased
+# Column 3: what name it should translate to.  The name IGNORE means it
+#           should be discarded with a warning message.
+# Column 4: name of the extension set (used for compiler warning messages)
+# Column 5: capability description (usually an associated terminfo variable)
+#
+# HANDLING TERMCAP AND TERMINFO EXTENSIONS
+#
+# There are basically five different ways to handle termcap and terminfo
+# extensions:
+#
+# 1. Don't list the capname here, or list it but comment it out (the latter
+# is preferable; someone might want to handle it in the future).  If you do
+# this, the capability will be treated as unknown and raise a warning from
+# the compiler.
+#
+# 2. Alias it.  This is appropriate if the capability has the same meaning
+# as an already-supported one.  The compiler will handle aliasing, emitting
+# an appropriate informational message whenever an alias fires.
+#
+# 3. List it in the standard table.  You almost certainly do *not* want
+# to do this -- the capabilities in that one, and their order, have been
+# carefully chosen to be SVr4-binary-compatible when they're written out
+# as a terminfo object, and breaking this would be bad.  It is up to the ncurses
+# library what to do with the terminfo data after it is read in.
+#
+# 4. List it in the aliases table with an IGNORE target field.  If you
+# do this, the capability will be ignored on input (though the user will
+# get a warning message about it).
+#
+# 5. List it in the extensions table. If you do this, the compiler will
+# silently accept the capability, but the curses library proper will never
+# see it (because it won't be written out as part of the terminfo object
+# format).  It is up to you what you have the compiler do with it.
+#
+# There are two opposite reasons to choose option 5.  One is when you want
+# to eat the capability silently and discard it when doing translations
+# to terminfo with tic -I.  Some very old obsolete BSD caps like :kn: are
+# in this class.  Nothing will ever use them again.
+#
+# More usually, you want the compiler to try to deduce something from the
+# capability value that it can use to translate it into your output format.
+# You'll need to write custom code, probably in postprocess_termcap() or
+# postprocess_terminfo(), to handle the translation.
+#
+# CONTROLLING ENTRY LENGTH
+#
+# Notes on specific elisions made to fit translations within 1023 bytes:
+#
+# Machines with IBM PC-like keyboards want to be able to define the following
+# keys: key_npage, key_ppage, key_home, key_ll (which is used for in termcap-
+# only environments for End or Home-Down), key_dc, and key_ic.  This is also
+# the set of keys the `joe' editor will be upset if it can't see.  So don't
+# trim those out of the set to be translated to termcap, or various users of
+# the termcap file will become irate.
+#
+# It might look tempting to leave those long init strings out of translations.
+# We can't do it (yet); 4.4BSD tput and tset use them.
+#
+# We retain the sgr capability in translation in spite of the fact that neither
+# 4.4BSD nor GNU Emacs uses it, because (a) some entry naming distinctions are
+# hard to understand without it, and (b) the entries in which it is long tend
+# to be older types that don't use up a lot of string space on function keys.
+# The tic(1) translation code will complain and elide it if it makes a critical
+# difference (there is special code in tic to recognize this situation).
+#
+# Yes, BSD tset(1) uses hpa.  We elide hpa/vpa anyway because the motion
+# optimizer in BSD curses didn't use them.  This omission seems to be the
+# single most effective one, it shortened the resolved length of all thirteen
+# problem entries in the 9.9.0 version of the terminfo master below critical.
+#
+# It would be nice to keep f11 and f12 for Emacs use, but a couple of termcap
+# translations go back over critical if we do this.  As 4.4BSD curses fades
+# into history and GNU termcap's application base shrinks towards being GNU
+# Emacs only, we'll probably elide out some BSD-only capabilities in order
+# to buy space for non-essentials Emacs is still using.  Capabilities high
+# on that hit list: rc, sc, uc.
+#
+#############################################################################
+#
+# STANDARD CAPABILITIES
+#
+#%The following is a complete table of the capabilities included in a
+#%terminfo description block and available to terminfo-using code.  In each
+#%line of the table,
+#%
+#%The \fBvariable\fR is the name by which the programmer (at the terminfo level)
+#%accesses the capability.
+#%
+#%The \fBcapname\fR is the short name used in the text of the database,
+#%and is used by a person updating the database.
+#%Whenever possible, capnames are chosen to be the same as or similar to
+#%the ANSI X3.64-1979 standard (now superseded by ECMA-48, which uses
+#%identical or very similar names).  Semantics are also intended to match
+#%those of the specification.
+#%
+#%The termcap code is the old
+#%.B termcap
+#%capability name (some capabilities are new, and have names which termcap
+#%did not originate).
+#%.P
+#%Capability names have no hard length limit, but an informal limit of 5
+#%characters has been adopted to keep them short and to allow the tabs in
+#%the source file
+#%.B Caps
+#%to line up nicely.
+#%
+#%Finally, the description field attempts to convey the semantics of the
+#%capability.  You may find some codes in the description field:
+#%.TP
+#%(P)
+#%indicates that padding may be specified
+#%.TP
+#%#[1-9]
+#%in the description field indicates that the string is passed
+#%through \fBtparm\fP(3X) with parameters as given (#\fIi\fP).
+#%.IP
+#%If no parameters are listed in the description,
+#%passing the string through \fBtparm\fP(3X) may give unexpected results,
+#%e.g., if it contains percent (%%) signs.
+#%.TP
+#%(P*)
+#%indicates that padding may vary in proportion to the number of
+#%lines affected
+#%.TP
+#%(#\d\fIi\fP\u)
+#%indicates the \fIi\fP\uth\d parameter.
+#%
+#%.PP
+#% These are the boolean capabilities:
+#%
+#%.na
+#%.TS H
+#%center expand;
+#%c l l c
+#%c l l c
+#%lw25 lw6 lw2 lw20.
+#%\fBVariable	Cap-	TCap	Description\fR
+#%\fBBooleans	name	Code\fR
+auto_left_margin		bw	bool	bw	-	-	YB-G-	cub1 wraps from column 0 to last column
+auto_right_margin		am	bool	am	-	-	YBCGE	terminal has automatic margins
+no_esc_ctlc			xsb	bool	xb	-	-	YBCG-	beehive (f1=escape, f2=ctrl C)
+ceol_standout_glitch		xhp	bool	xs	-	-	YBCGE	standout not erased by overwriting (hp)
+eat_newline_glitch		xenl	bool	xn	-	-	YBCGE	newline ignored after 80 cols (concept)
+erase_overstrike		eo	bool	eo	-	-	YBCG-	can erase overstrikes with a blank
+generic_type			gn	bool	gn	-	-	YB-G-	generic line type
+hard_copy			hc	bool	hc	-	-	YBCG-	hardcopy terminal
+has_meta_key			km	bool	km	-	-	YB-GE	Has a meta key (i.e., sets 8th-bit)
+has_status_line			hs	bool	hs	-	-	YB-G-	has extra status line
+insert_null_glitch		in	bool	in	-	-	YBCGE	insert mode distinguishes nulls
+memory_above			da	bool	da	-	-	YBCG-	display may be retained above the screen
+memory_below			db	bool	db	-	-	YB-GE	display may be retained below the screen
+move_insert_mode		mir	bool	mi	-	-	YBCGE	safe to move while in insert mode
+move_standout_mode		msgr	bool	ms	-	-	YBCGE	safe to move while in standout mode
+over_strike			os	bool	os	-	-	YBCG-	terminal can overstrike
+status_line_esc_ok		eslok	bool	es	-	-	YB-G-	escape can be used on the status line
+dest_tabs_magic_smso		xt	bool	xt	-	-	YBCGE	tabs destructive, magic so char (t1061)
+tilde_glitch			hz	bool	hz	-	-	YB-GE	cannot print ~'s (Hazeltine)
+transparent_underline		ul	bool	ul	-	-	YBCGE	underline character overstrikes
+xon_xoff			xon	bool	xo	-	-	YB---	terminal uses xon/xoff handshaking
+needs_xon_xoff			nxon	bool	nx	-	-	-----	padding will not work, xon/xoff required
+prtr_silent			mc5i	bool	5i	-	-	-----	printer will not echo on screen
+hard_cursor			chts	bool	HC	-	-	-----	cursor is hard to see
+non_rev_rmcup			nrrmc	bool	NR	-	-	-----	smcup does not reverse rmcup
+no_pad_char			npc	bool	NP	-	-	-----	pad character does not exist
+non_dest_scroll_region		ndscr	bool	ND	-	-	-----	scrolling region is non-destructive
+can_change			ccc	bool	cc	-	-	-----	terminal can re-define existing colors
+back_color_erase		bce	bool	ut	-	-	-----	screen erased with background color
+hue_lightness_saturation	hls	bool	hl	-	-	-----	terminal uses only HLS color notation (Tektronix)
+col_addr_glitch			xhpa	bool	YA	-	-	-----	only positive motion for hpa/mhpa caps
+cr_cancels_micro_mode		crxm	bool	YB	-	-	-----	using cr turns off micro mode
+has_print_wheel			daisy	bool	YC	-	-	-----	printer needs operator to change character set
+row_addr_glitch			xvpa	bool	YD	-	-	-----	only positive motion for vpa/mvpa caps
+semi_auto_right_margin		sam	bool	YE	-	-	-----	printing in last column causes cr
+cpi_changes_res			cpix	bool	YF	-	-	-----	changing character pitch changes resolution
+lpi_changes_res			lpix	bool	YG	-	-	-----	changing line pitch changes resolution
+#%.TE
+#%.ad
+#%
+#%These are the numeric capabilities:
+#%
+#%.na
+#%.TS H
+#%center expand;
+#%c l l c
+#%c l l c
+#%lw25 lw6 lw2 lw20.
+#%\fBVariable	Cap-	TCap	Description\fR
+#%\fBNumeric	name	Code\fR
+columns				cols	num	co	-	-	YBCGE	number of columns in a line
+init_tabs			it	num	it	-	-	YB-G-	tabs initially every # spaces
+lines				lines	num	li	-	-	YBCGE	number of lines on screen or page
+lines_of_memory			lm	num	lm	-	-	YB-G-	lines of memory if > line. 0 means varies
+magic_cookie_glitch		xmc	num	sg	-	-	YBCGE	number of blank characters left by smso or rmso
+padding_baud_rate		pb	num	pb	-	-	YB-GE	lowest baud rate where padding needed
+virtual_terminal		vt	num	vt	-	-	YB---	virtual terminal number (CB/unix)
+width_status_line		wsl	num	ws	-	-	YB-G-	number of columns in status line
+num_labels			nlab	num	Nl	-	-	-----	number of labels on screen
+label_height			lh	num	lh	-	-	-----	rows in each label
+label_width			lw	num	lw	-	-	-----	columns in each label
+max_attributes			ma	num	ma	-	-	YBC--	maximum combined attributes terminal can handle
+maximum_windows			wnum	num	MW	-	-	-----	maximum number of definable windows
+# These came in with SVr4's color support
+max_colors			colors	num	Co	-	-	-----	maximum number of colors on screen
+max_pairs			pairs	num	pa	-	-	-----	maximum number of color-pairs on the screen
+no_color_video			ncv	num	NC	-	-	-----	video attributes that cannot be used with colors
+#%.TE
+#%.ad
+#%
+#%The following numeric capabilities are present in the SVr4.0 term structure,
+#%but are not yet documented in the man page.  They came in with SVr4's
+#%printer support.
+#%
+#%.na
+#%.TS H
+#%center expand;
+#%c l l c
+#%c l l c
+#%lw25 lw6 lw2 lw20.
+#%\fBVariable	Cap-	TCap	Description\fR
+#%\fBNumeric	name	Code\fR
+buffer_capacity			bufsz	num	Ya	-	-	-----	numbers of bytes buffered before printing
+dot_vert_spacing		spinv	num	Yb	-	-	-----	spacing of pins vertically in pins per inch
+dot_horz_spacing		spinh	num	Yc	-	-	-----	spacing of dots horizontally in dots per inch
+max_micro_address		maddr	num	Yd	-	-	-----	maximum value in micro_..._address
+max_micro_jump			mjump	num	Ye	-	-	-----	maximum value in parm_..._micro
+micro_col_size			mcs	num	Yf	-	-	-----	character step size when in micro mode
+micro_line_size			mls	num	Yg	-	-	-----	line step size when in micro mode
+number_of_pins			npins	num	Yh	-	-	-----	numbers of pins in print-head
+output_res_char			orc	num	Yi	-	-	-----	horizontal resolution in units per line
+output_res_line			orl	num	Yj	-	-	-----	vertical resolution in units per line
+output_res_horz_inch		orhi	num	Yk	-	-	-----	horizontal resolution in units per inch
+output_res_vert_inch		orvi	num	Yl	-	-	-----	vertical resolution in units per inch
+print_rate			cps	num	Ym	-	-	-----	print rate in characters per second
+wide_char_size			widcs	num	Yn	-	-	-----	character step size when in double wide mode
+buttons				btns	num	BT	-	-	-----	number of buttons on mouse
+bit_image_entwining		bitwin	num	Yo	-	-	-----	number of passes for each bit-image row
+bit_image_type			bitype	num	Yp	-	-	-----	type of bit-image device
+#%.TE
+#%.ad
+#%
+#%These are the string capabilities:
+#%
+#%.na
+#%.TS H
+#%center expand;
+#%c l l c
+#%c l l c
+#%lw25 lw6 lw2 lw20.
+#%\fBVariable	Cap-	TCap	Description\fR
+#%\fBString	name	Code\fR
+back_tab			cbt	str	bt	-		-	YBCGE	back tab (P)
+bell				bel	str	bl	-		-	YB-GE	audible signal (bell) (P)
+carriage_return			cr	str	cr	-		-	YBCGE	carriage return (P*) (P*)
+change_scroll_region		csr	str	cs	-		-	YBCGE	change region to line #1 to line #2 (P)
+clear_all_tabs			tbc	str	ct	-		-	YB-G-	clear all tab stops (P)
+clear_screen			clear	str	cl	-		-	YBCGE	clear screen and home cursor (P*)
+clr_eol				el	str	ce	-		-	YBCGE	clear to end of line (P)
+clr_eos				ed	str	cd	-		-	YBCGE	clear to end of screen (P*)
+column_address			hpa	str	ch	-		-	-B-GE*	horizontal position #1, absolute (P)
+command_character		cmdch	str	CC	-		-	YB-G-	terminal settable cmd character in prototype !?
+cursor_address			cup	str	cm	-		-	YBCGE	move to row #1 columns #2
+cursor_down			cud1	str	do	-		-	YBCGE	down one line
+cursor_home			home	str	ho	-		-	YBCGE	home cursor (if no cup)
+cursor_invisible		civis	str	vi	-		-	YB-G-	make cursor invisible
+cursor_left			cub1	str	le	-		-	YBCGE	move left one space
+cursor_mem_address		mrcup	str	CM	-		-	YB-G-	memory relative cursor addressing, move to row #1 columns #2
+cursor_normal			cnorm	str	ve	-		-	YBCGE	make cursor appear normal (undo civis/cvvis)
+cursor_right			cuf1	str	nd	-		-	YBCGE	non-destructive space (move right one space)
+cursor_to_ll			ll	str	ll	-		-	YBCGE	last line, first column (if no cup)
+cursor_up			cuu1	str	up	-		-	YBCGE	up one line
+cursor_visible			cvvis	str	vs	-		-	YBCGE	make cursor very visible
+delete_character		dch1	str	dc	-		-	YBCGE	delete character (P*)
+delete_line			dl1	str	dl	-		-	YBCGE	delete line (P*)
+dis_status_line			dsl	str	ds	-		-	YB-G-	disable status line
+down_half_line			hd	str	hd	-		-	YB-G-	half a line down
+enter_alt_charset_mode		smacs	str	as	-		-	YB-G-	start alternate character set (P)
+enter_blink_mode		blink	str	mb	-		-	YB-G-	turn on blinking
+enter_bold_mode			bold	str	md	-		-	YB-G-	turn on bold (extra bright) mode
+enter_ca_mode			smcup	str	ti	-		-	YBCGE	string to start programs using cup
+enter_delete_mode		smdc	str	dm	-		-	YBCGE	enter delete mode
+enter_dim_mode			dim	str	mh	-		-	YB-G-	turn on half-bright mode
+enter_insert_mode		smir	str	im	-		-	YBCGE	enter insert mode
+enter_secure_mode		invis	str	mk	-		-	-B-G-*	turn on blank mode (characters invisible)
+enter_protected_mode		prot	str	mp	-		-	-B-G-*	turn on protected mode
+enter_reverse_mode		rev	str	mr	-		-	YB-G-	turn on reverse video mode
+enter_standout_mode		smso	str	so	-		-	YBCGE	begin standout mode
+enter_underline_mode		smul	str	us	-		-	YBCGE	begin underline mode
+erase_chars			ech	str	ec	-		-	YB-G-	erase #1 characters (P)
+exit_alt_charset_mode		rmacs	str	ae	-		-	YB-G-	end alternate character set (P)
+exit_attribute_mode		sgr0	str	me	-		-	YB-GE	turn off all attributes
+exit_ca_mode			rmcup	str	te	-		-	YBCGE	strings to end programs using cup
+exit_delete_mode		rmdc	str	ed	-		-	YBCGE	end delete mode
+exit_insert_mode		rmir	str	ei	-		-	YBCGE	exit insert mode
+exit_standout_mode		rmso	str	se	-		-	YBCGE	exit standout mode
+exit_underline_mode		rmul	str	ue	-		-	YBCGE	exit underline mode
+flash_screen			flash	str	vb	-		-	YBCGE	visible bell (may not move cursor)
+form_feed			ff	str	ff	-		-	YB-G-	hardcopy terminal page eject (P*)
+from_status_line		fsl	str	fs	-		-	YB-G-	return from status line
+init_1string			is1	str	i1	-		-	YB-G-	initialization string
+init_2string			is2	str	is	-		-	YB-G-	initialization string
+init_3string			is3	str	i3	-		-	YB-G-	initialization string
+init_file			if	str	if	-		-	YB-G-	name of initialization file
+insert_character		ich1	str	ic	-		-	YBCGE	insert character (P)
+insert_line			il1	str	al	-		-	YBCGE	insert line (P*)
+insert_padding			ip	str	ip	-		-	YBCGE	insert padding after inserted character
+key_backspace			kbs	str	kb	KEY_BACKSPACE	0407	YB-G-	backspace key
+key_catab			ktbc	str	ka	KEY_CATAB	0526	-B-G-*	clear-all-tabs key
+key_clear			kclr	str	kC	KEY_CLEAR	0515	-B-G-*	clear-screen or erase key
+key_ctab			kctab	str	kt	KEY_CTAB	0525	-B-G-*	clear-tab key
+key_dc				kdch1	str	kD	KEY_DC		0512	YB-G-	delete-character key
+key_dl				kdl1	str	kL	KEY_DL		0510	-B-G-*	delete-line key
+key_down			kcud1	str	kd	KEY_DOWN	0402	YBCGE	down-arrow key
+key_eic				krmir	str	kM	KEY_EIC		0514	-B-G-*	sent by rmir or smir in insert mode
+key_eol				kel	str	kE	KEY_EOL		0517	-B-G-*	clear-to-end-of-line key
+key_eos				ked	str	kS	KEY_EOS		0516	-B-G-*	clear-to-end-of-screen key
+key_f0				kf0	str	k0	KEY_F(0)	0410	YBCGE	F0 function key
+key_f1				kf1	str	k1	KEY_F(1)	-	YBCGE	F1 function key
+key_f10				kf10	str	k;	KEY_F(10)	-	----E	F10 function key
+key_f2				kf2	str	k2	KEY_F(2)	-	YBCGE	F2 function key
+key_f3				kf3	str	k3	KEY_F(3)	-	YBCGE	F3 function key
+key_f4				kf4	str	k4	KEY_F(4)	-	YBCGE	F4 function key
+key_f5				kf5	str	k5	KEY_F(5)	-	YBCGE	F5 function key
+key_f6				kf6	str	k6	KEY_F(6)	-	YBCGE	F6 function key
+key_f7				kf7	str	k7	KEY_F(7)	-	YBCGE	F7 function key
+key_f8				kf8	str	k8	KEY_F(8)	-	YBCGE	F8 function key
+key_f9				kf9	str	k9	KEY_F(9)	-	YBCGE	F9 function key
+key_home			khome	str	kh	KEY_HOME	0406	YBCGE	home key
+key_ic				kich1	str	kI	KEY_IC		0513	YB-GE	insert-character key
+key_il				kil1	str	kA	KEY_IL		0511	-B-G-*	insert-line key
+key_left			kcub1	str	kl	KEY_LEFT	0404	YBCGE	left-arrow key
+key_ll				kll	str	kH	KEY_LL		0533	YB-G-	lower-left key (home down)
+key_npage			knp	str	kN	KEY_NPAGE	0522	YB-GE	next-page key
+key_ppage			kpp	str	kP	KEY_PPAGE	0523	YB-GE	previous-page key
+key_right			kcuf1	str	kr	KEY_RIGHT	0405	YBCGE	right-arrow key
+key_sf				kind	str	kF	KEY_SF		0520	-B-G-*	scroll-forward key
+key_sr				kri	str	kR	KEY_SR		0521	-B-G-*	scroll-backward key
+key_stab			khts	str	kT	KEY_STAB	0524	-B-G-*	set-tab key
+key_up				kcuu1	str	ku	KEY_UP		0403	YBCGE	up-arrow key
+keypad_local			rmkx	str	ke	-		-	YBCGE	leave 'keyboard_transmit' mode
+keypad_xmit			smkx	str	ks	-		-	YBCGE	enter 'keyboard_transmit' mode
+lab_f0				lf0	str	l0	-		-	-B-G-*	label on function key f0 if not f0
+lab_f1				lf1	str	l1	-		-	-B-G-*	label on function key f1 if not f1
+lab_f10				lf10	str	la	-		-	-----	label on function key f10 if not f10
+lab_f2				lf2	str	l2	-		-	-B-G-*	label on function key f2 if not f2
+lab_f3				lf3	str	l3	-		-	-B-G-*	label on function key f3 if not f3
+lab_f4				lf4	str	l4	-		-	-B-G-*	label on function key f4 if not f4
+lab_f5				lf5	str	l5	-		-	-B-G-*	label on function key f5 if not f5
+lab_f6				lf6	str	l6	-		-	-B-G-*	label on function key f6 if not f6
+lab_f7				lf7	str	l7	-		-	-B-G-*	label on function key f7 if not f7
+lab_f8				lf8	str	l8	-		-	-B-G-*	label on function key f8 if not f8
+lab_f9				lf9	str	l9	-		-	-B-G-*	label on function key f9 if not f9
+meta_off			rmm	str	mo	-		-	YB-G-*	turn off meta mode
+meta_on				smm	str	mm	-		-	YB-G-*	turn on meta mode (8th-bit on)
+newline				nel	str	nw	-		-	YB-G-*	newline (behave like cr followed by lf)
+pad_char			pad	str	pc	-		-	YBCGE	padding char (instead of null)
+parm_dch			dch	str	DC	-		-	YB-GE	delete #1 characters (P*)
+parm_delete_line		dl	str	DL	-		-	YBCGE	delete #1 lines (P*)
+parm_down_cursor		cud	str	DO	-		-	YBCGE	down #1 lines (P*)
+parm_ich			ich	str	IC	-		-	YB-GE	insert #1 characters (P*)
+parm_index			indn	str	SF	-		-	YBCG-	scroll forward #1 lines (P)
+parm_insert_line		il	str	AL	-		-	YBCGE	insert #1 lines (P*)
+parm_left_cursor		cub	str	LE	-		-	YBCGE	move #1 characters to the left (P)
+parm_right_cursor		cuf	str	RI	-		-	YBCGE	move #1 characters to the right (P*)
+parm_rindex			rin	str	SR	-		-	YBCG-	scroll back #1 lines (P)
+parm_up_cursor			cuu	str	UP	-		-	YBCGE	up #1 lines (P*)
+pkey_key			pfkey	str	pk	-		-	-B---	program function key #1 to type string #2
+pkey_local			pfloc	str	pl	-		-	-B---	program function key #1 to execute string #2
+pkey_xmit			pfx	str	px	-		-	-B---	program function key #1 to transmit string #2
+print_screen			mc0	str	ps	-		-	-B-G-*	print contents of screen
+prtr_off			mc4	str	pf	-		-	-B-G-*	turn off printer
+prtr_on				mc5	str	po	-		-	-B-G-*	turn on printer
+repeat_char			rep	str	rp	-		-	YB-GE	repeat char #1 #2 times (P*)
+reset_1string			rs1	str	r1	-		-	-B---	reset string
+reset_2string			rs2	str	r2	-		-	-B---	reset string
+reset_3string			rs3	str	r3	-		-	-B---	reset string
+reset_file			rf	str	rf	-		-	-B---	name of reset file
+restore_cursor			rc	str	rc	-		-	YBCG-	restore cursor to position of last save_cursor
+row_address			vpa	str	cv	-		-	-B-GE*	vertical position #1 absolute (P)
+save_cursor			sc	str	sc	-		-	YBCG-	save current cursor position (P)
+scroll_forward			ind	str	sf	-		-	YBCGE	scroll text up (P)
+scroll_reverse			ri	str	sr	-		-	YBCGE	scroll text down (P)
+set_attributes			sgr	str	sa	-		-	YB-G-	define video attributes #1-#9 (PG9)
+set_tab				hts	str	st	-		-	YB-G-	set a tab in every row, current columns
+set_window			wind	str	wi	-		-	-B-GE	current window is lines #1-#2 cols #3-#4
+tab				ht	str	ta	-		-	YBCGE	tab to next 8-space hardware tab stop
+to_status_line			tsl	str	ts	-		-	YB-G-	move to status line, column #1
+underline_char			uc	str	uc	-		-	YBCG-	underline char and move past it
+up_half_line			hu	str	hu	-		-	YB-G-	half a line up
+init_prog			iprog	str	iP	-		-	-B---	path name of program for initialization
+key_a1				ka1	str	K1	KEY_A1		0534	YB-GE	upper left of keypad
+key_a3				ka3	str	K3	KEY_A3		0535	YB-GE	upper right of keypad
+key_b2				kb2	str	K2	KEY_B2		0536	YB-GE	center of keypad
+key_c1				kc1	str	K4	KEY_C1		0537	YB-GE	lower left of keypad
+key_c3				kc3	str	K5	KEY_C3		0540	YB-GE	lower right of keypad
+prtr_non			mc5p	str	pO	-		-	-B-G-*	turn on printer for #1 bytes
+#
+# IBM extensions
+#
+# These extensions follow ptr_non (replacing everything after it) in IBM
+# terminfo files.
+#
+# The places in the box[12] capabilities correspond to acsc characters, here is
+# the mapping:
+#
+#	box1[0]  = ACS_ULCORNER
+#	box1[1]  = ACS_HLINE
+#	box1[2]  = ACS_URCORNER
+#	box1[3]  = ACS_VLINE
+#	box1[4]  = ACS_LRCORNER
+#	box1[5]  = ACS_LLCORNER
+#	box1[6]  = ACS_TTEE
+#	box1[7]  = ACS_RTEE
+#	box1[8]  = ACS_BTEE
+#	box1[9]  = ACS_LTEE
+#	box1[10] = ACS_PLUS
+#
+# The box2 characters are the double-line versions of these forms graphics.
+#
+box_chars_1			box1	str	bx	-		-	----K	box characters primary set
+box_chars_2			box2	str	by	-		-	----K	box characters secondary set
+box_attr_1			batt1	str	Bx	-		-	----K	attributes for box1
+box_attr_2			batt2	str	By	-		-	----K	attributes for box2
+color_bg_0			colb0	str	d0	-		-	----K	background color 0
+color_bg_1			colb1	str	d1	-		-	----K	background color 1
+color_bg_2			colb2	str	d2	-		-	----K	background color 2
+color_bg_3			colb3	str	d3	-		-	----K	background color 3
+color_bg_4			colb4	str	d4	-		-	----K	background color 4
+color_bg_5			colb5	str	d5	-		-	----K	background color 5
+color_bg_6			colb6	str	d6	-		-	----K	background color 6
+color_bg_7			colb7	str	d7	-		-	----K	background color 7
+color_fg_0			colf0	str	c0	-		-	----K	foreground color 0
+color_fg_1			colf1	str	c1	-		-	----K	foreground color 1
+color_fg_2			colf2	str	c2	-		-	----K	foreground color 2
+color_fg_3			colf3	str	c3	-		-	----K	foreground color 3
+color_fg_4			colf4	str	c4	-		-	----K	foreground color 4
+color_fg_5			colf5	str	c5	-		-	----K	foreground color 5
+color_fg_6			colf6	str	c6	-		-	----K	foreground color 6
+color_fg_7			colf7	str	c7	-		-	----K	foreground color 7
+font_0				font0	str	f0	-		-	----K	select font 0
+font_1				font1	str	f1	-		-	----K	select font 1
+font_2				font2	str	f2	-		-	----K	select font 2
+font_3				font3	str	f3	-		-	----K	select font 3
+font_4				font4	str	f4	-		-	----K	select font 4
+font_5				font5	str	f5	-		-	----K	select font 5
+font_6				font6	str	f6	-		-	----K	select font 6
+font_7				font7	str	f7	-		-	----K	select font 7
+key_back_tab			kbtab	str	kO	-		-	----K	backtab key
+key_do				kdo	str	ki	-		-	----K	do request key
+key_command			kcmd	str	@4	-		-	----K	command-request key
+key_command_pane		kcpn	str	kW	-		-	----K	command-pane key
+key_end				kend	str	@7	KEY_END		0550	-----	end key
+key_help			khlp	str	%1	-		-	-----	help key
+key_newline			knl	str	kn	-		-	----K	newline key
+key_next_pane			knpn	str	kv	-		-	----K	next-pane key
+key_prev_cmd			kpcmd	str	kp	-		-	----K	previous-command key
+key_prev_pane			kppn	str	kV	-		-	----K	previous-pane key
+key_quit			kquit	str	kQ	-		-	----K	quit key
+key_select_aix			ksel	str	kU	-		-	-----	select key
+key_scroll_left			kscl	str	kz	-		-	----K	scroll left
+key_scroll_right		kscr	str	kZ	-		-	----K	scroll right
+key_tab				ktab	str	ko	-		-	----K	tab key
+key_smap_in1			kmpf1	str	Kv	-		-	----K	special mapped key 1 input
+key_smap_out1			kmpt1	str	KV	-		-	----K	special mapped key 1 output
+key_smap_in2			kmpf2	str	Kw	-		-	----K	special mapped key 2 input
+key_smap_out2			kmpt2	str	KW	-		-	----K	special mapped key 2 output
+key_smap_in3			kmpf3	str	Kx	-		-	----K	special mapped key 3 input
+key_smap_out3			kmpt3	str	KX	-		-	----K	special mapped key 3 output
+key_smap_in4			kmpf4	str	Ky	-		-	----K	special mapped key 4 input
+key_smap_out4			kmpt4	str	KY	-		-	----K	special mapped key 4 output
+key_smap_in5			kmpf5	str	Kz	-		-	----K	special mapped key 5 input
+key_smap_out5			kmpt5	str	KZ	-		-	----K	special mapped key 5 output
+appl_defined_str		apstr	str	za	-		-	----K	application-defined string
+key_smap_in6			kmpf6	str	Kr	-		-	----K	special mapped key 6 input
+key_smap_out6			kmpt6	str	KR	-		-	----K	special mapped key 6 output
+key_smap_in7			kmpf7	str	Ks	-		-	----K	special mapped key 7 input
+key_smap_out7			kmpt7	str	KS	-		-	----K	special mapped key 7 output
+key_smap_in8			kmpf8	str	Kt	-		-	----K	special mapped key 8 input
+key_smap_out8			kmpt8	str	KT	-		-	----K	special mapped key 8 output
+key_smap_in9			kmpf9	str	Ku	-		-	----K	special mapped key 9 input
+key_smap_out9			kmpt9	str	KU	-		-	----K	special mapped key 9 output
+key_sf1				ksf1	str	S1	-		-	----K	special function key 1
+key_sf2				ksf2	str	S2	-		-	----K	special function key 2
+key_sf3				ksf3	str	S3	-		-	----K	special function key 3
+key_sf4				ksf4	str	S4	-		-	----K	special function key 4
+key_sf5				ksf5	str	S5	-		-	----K	special function key 5
+key_sf6				ksf6	str	S6	-		-	----K	special function key 6
+key_sf7				ksf7	str	S7	-		-	----K	special function key 7
+key_sf8				ksf8	str	S8	-		-	----K	special function key 8
+key_sf9				ksf9	str	S9	-		-	----K	special function key 9
+key_sf10			ksf10	str	S0	-		-	----K	special function key 10
+key_f11				kf11	str	F1	KEY_F(11)	-	----E	F11 function key
+key_f12				kf12	str	F2	KEY_F(12)	-	----E	F12 function key
+key_f13				kf13	str	F3	KEY_F(13)	-	----E	F13 function key
+key_f14				kf14	str	F4	KEY_F(14)	-	----E	F14 function key
+key_f15				kf15	str	F5	KEY_F(15)	-	----E	F15 function key
+key_f16				kf16	str	F6	KEY_F(16)	-	----E	F16 function key
+key_f17				kf17	str	F7	KEY_F(17)	-	----E	F17 function key
+key_f18				kf18	str	F8	KEY_F(18)	-	----E	F18 function key
+key_f19				kf19	str	F9	KEY_F(19)	-	----E	F19 function key
+key_f20				kf20	str	FA	KEY_F(20)	-	----E	F20 function key
+key_f21				kf21	str	FB	KEY_F(21)	-	----E	F21 function key
+key_f22				kf22	str	FC	KEY_F(22)	-	----E	F22 function key
+key_f23				kf23	str	FD	KEY_F(23)	-	----E	F23 function key
+key_f24				kf24	str	FE	KEY_F(24)	-	----E	F24 function key
+key_f25				kf25	str	FF	KEY_F(25)	-	----E	F25 function key
+key_f26				kf26	str	FG	KEY_F(26)	-	----E	F26 function key
+key_f27				kf27	str	FH	KEY_F(27)	-	----E	F27 function key
+key_f28				kf28	str	FI	KEY_F(28)	-	----E	F28 function key
+key_f29				kf29	str	FJ	KEY_F(29)	-	----E	F29 function key
+key_f30				kf30	str	FK	KEY_F(30)	-	----E	F30 function key
+key_f31				kf31	str	FL	KEY_F(31)	-	----E	F31 function key
+key_f32				kf32	str	FM	KEY_F(32)	-	----E	F32 function key
+key_f33				kf33	str	FN	KEY_F(33)	-	----E	F33 function key
+key_f34				kf34	str	FO	KEY_F(34)	-	----E	F34 function key
+key_f35				kf35	str	FP	KEY_F(35)	-	----E	F35 function key
+key_f36				kf36	str	FQ	KEY_F(36)	-	----E	F36 function key
+key_f37				kf37	str	FR	KEY_F(37)	-	----E	F37 function key
+key_f38				kf38	str	FS	KEY_F(38)	-	----E	F38 function key
+key_f39				kf39	str	FT	KEY_F(39)	-	----E	F39 function key
+key_f40				kf40	str	FU	KEY_F(40)	-	----E	F40 function key
+key_f41				kf41	str	FV	KEY_F(41)	-	----E	F41 function key
+key_f42				kf42	str	FW	KEY_F(42)	-	----E	F42 function key
+key_f43				kf43	str	FX	KEY_F(43)	-	----E	F43 function key
+key_f44				kf44	str	FY	KEY_F(44)	-	----E	F44 function key
+key_f45				kf45	str	FZ	KEY_F(45)	-	----E	F45 function key
+key_f46				kf46	str	Fa	KEY_F(46)	-	----E	F46 function key
+key_f47				kf47	str	Fb	KEY_F(47)	-	----E	F47 function key
+key_f48				kf48	str	Fc	KEY_F(48)	-	----E	F48 function key
+key_f49				kf49	str	Fd	KEY_F(49)	-	----E	F49 function key
+key_f50				kf50	str	Fe	KEY_F(50)	-	----E	F50 function key
+key_f51				kf51	str	Ff	KEY_F(51)	-	----E	F51 function key
+key_f52				kf52	str	Fg	KEY_F(52)	-	----E	F52 function key
+key_f53				kf53	str	Fh	KEY_F(53)	-	----E	F53 function key
+key_f54				kf54	str	Fi	KEY_F(54)	-	----E	F54 function key
+key_f55				kf55	str	Fj	KEY_F(55)	-	----E	F55 function key
+key_f56				kf56	str	Fk	KEY_F(56)	-	----E	F56 function key
+key_f57				kf57	str	Fl	KEY_F(57)	-	----E	F57 function key
+key_f58				kf58	str	Fm	KEY_F(58)	-	----E	F58 function key
+key_f59				kf59	str	Fn	KEY_F(59)	-	----E	F59 function key
+key_f60				kf60	str	Fo	KEY_F(60)	-	----E	F60 function key
+key_f61				kf61	str	Fp	KEY_F(61)	-	----E	F61 function key
+key_f62				kf62	str	Fq	KEY_F(62)	-	----E	F62 function key
+key_f63				kf63	str	Fr	KEY_F(63)	-	----E	F63 function key
+key_action			kact	str	kJ	-		-	----K	sent by action key
+
+# The IBM docs say these capabilities are for table-drawing, and are
+# valid only for aixterm descriptions.
+enter_topline_mode		topl	str	tp	-		-	----K	start top-line mode
+enter_bottom_mode		btml	str	bm	-		-	----K	start bottom-line mode
+enter_rvert_mode		rvert	str	rv	-		-	----K	start right-vertical mode
+enter_lvert_mode		lvert	str	lv	-		-	----K	start left-vertical mode
+#
+# SVr4 capabilities resume here.  Note that key_end is in the IBM-extensions.
+#
+char_padding			rmp	str	rP	-		-	-----	like ip but when in insert mode
+acs_chars			acsc	str	ac	-		-	-----	graphics charset pairs, based on vt100
+plab_norm			pln	str	pn	-		-	-----	program label #1 to show string #2
+key_btab			kcbt	str	kB	KEY_BTAB	0541	-----	back-tab key
+enter_xon_mode			smxon	str	SX	-		-	-----	turn on xon/xoff handshaking
+exit_xon_mode			rmxon	str	RX	-		-	-----	turn off xon/xoff handshaking
+enter_am_mode			smam	str	SA	-		-	-----	turn on automatic margins
+exit_am_mode			rmam	str	RA	-		-	-----	turn off automatic margins
+xon_character			xonc	str	XN	-		-	-----	XON character
+xoff_character			xoffc	str	XF	-		-	-----	XOFF character
+ena_acs				enacs	str	eA	-		-	-----	enable alternate char set
+label_on			smln	str	LO	-		-	-----	turn on soft labels
+label_off			rmln	str	LF	-		-	-----	turn off soft labels
+key_beg				kbeg	str	@1	KEY_BEG		0542	-----	begin key
+key_cancel			kcan	str	@2	KEY_CANCEL	0543	-----	cancel key
+key_close			kclo	str	@3	KEY_CLOSE	0544	-----	close key
+#key_command			kcmd	str	@4	KEY_COMMAND	0545	-----	command key
+key_copy			kcpy	str	@5	KEY_COPY	0546	-----	copy key
+key_create			kcrt	str	@6	KEY_CREATE	0547	-----	create key
+#key_end			kend	str	@7	KEY_END		0550	-----	end key
+key_enter			kent	str	@8	KEY_ENTER	0527	-----	enter/send key
+key_exit			kext	str	@9	KEY_EXIT	0551	-----	exit key
+key_find			kfnd	str	@0	KEY_FIND	0552	-----	find key
+#key_help			khlp	str	%1	KEY_HELP	0553	-----	help key
+key_mark			kmrk	str	%2	KEY_MARK	0554	-----	mark key
+key_message			kmsg	str	%3	KEY_MESSAGE	0555	-----	message key
+key_move			kmov	str	%4	KEY_MOVE	0556	-----	move key
+key_next			knxt	str	%5	KEY_NEXT	0557	-----	next key
+key_open			kopn	str	%6	KEY_OPEN	0560	-----	open key
+key_options			kopt	str	%7	KEY_OPTIONS	0561	-----	options key
+key_previous			kprv	str	%8	KEY_PREVIOUS	0562	-----	previous key
+key_print			kprt	str	%9	KEY_PRINT	0532	-----	print key
+key_redo			krdo	str	%0	KEY_REDO	0563	-----	redo key
+key_reference			kref	str	&1	KEY_REFERENCE	0564	-----	reference key
+key_refresh			krfr	str	&2	KEY_REFRESH	0565	-----	refresh key
+key_replace			krpl	str	&3	KEY_REPLACE	0566	-----	replace key
+key_restart			krst	str	&4	KEY_RESTART	0567	-----	restart key
+key_resume			kres	str	&5	KEY_RESUME	0570	-----	resume key
+key_save			ksav	str	&6	KEY_SAVE	0571	-----	save key
+key_suspend			kspd	str	&7	KEY_SUSPEND	0627	-----	suspend key
+key_undo			kund	str	&8	KEY_UNDO	0630	-----	undo key
+key_sbeg			kBEG	str	&9	KEY_SBEG	0572	-----	shifted begin key
+key_scancel			kCAN	str	&0	KEY_SCANCEL	0573	-----	shifted cancel key
+key_scommand			kCMD	str	*1	KEY_SCOMMAND	0574	-----	shifted command key
+key_scopy			kCPY	str	*2	KEY_SCOPY	0575	-----	shifted copy key
+key_screate			kCRT	str	*3	KEY_SCREATE	0576	-----	shifted create key
+key_sdc				kDC	str	*4	KEY_SDC		0577	-----	shifted delete-character key
+key_sdl				kDL	str	*5	KEY_SDL		0600	-----	shifted delete-line key
+key_select			kslt	str	*6	KEY_SELECT	0601	-----	select key
+key_send			kEND	str	*7	KEY_SEND	0602	-----	shifted end key
+key_seol			kEOL	str	*8	KEY_SEOL	0603	-----	shifted clear-to-end-of-line key
+key_sexit			kEXT	str	*9	KEY_SEXIT	0604	-----	shifted exit key
+key_sfind			kFND	str	*0	KEY_SFIND	0605	-----	shifted find key
+key_shelp			kHLP	str	#1	KEY_SHELP	0606	-----	shifted help key
+key_shome			kHOM	str	#2	KEY_SHOME	0607	-----	shifted home key
+key_sic				kIC	str	#3	KEY_SIC		0610	-----	shifted insert-character key
+key_sleft			kLFT	str	#4	KEY_SLEFT	0611	-----	shifted left-arrow key
+key_smessage			kMSG	str	%a	KEY_SMESSAGE	0612	-----	shifted message key
+key_smove			kMOV	str	%b	KEY_SMOVE	0613	-----	shifted move key
+key_snext			kNXT	str	%c	KEY_SNEXT	0614	-----	shifted next key
+key_soptions			kOPT	str	%d	KEY_SOPTIONS	0615	-----	shifted options key
+key_sprevious			kPRV	str	%e	KEY_SPREVIOUS	0616	-----	shifted previous key
+key_sprint			kPRT	str	%f	KEY_SPRINT	0617	-----	shifted print key
+key_sredo			kRDO	str	%g	KEY_SREDO	0620	-----	shifted redo key
+key_sreplace			kRPL	str	%h	KEY_SREPLACE	0621	-----	shifted replace key
+key_sright			kRIT	str	%i	KEY_SRIGHT	0622	-----	shifted right-arrow key
+key_srsume			kRES	str	%j	KEY_SRSUME	0623	-----	shifted resume key
+key_ssave			kSAV	str	!1	KEY_SSAVE	0624	-----	shifted save key
+key_ssuspend			kSPD	str	!2	KEY_SSUSPEND	0625	-----	shifted suspend key
+key_sundo			kUND	str	!3	KEY_SUNDO	0626	-----	shifted undo key
+req_for_input			rfi	str	RF	-		-	-----	send next input char (for ptys)
+clr_bol				el1	str	cb	-		-	-----	Clear to beginning of line
+clear_margins			mgc	str	MC	-		-	-----	clear right and left soft margins
+set_left_margin			smgl	str	ML	-		-	-----	set left soft margin at current column.	 (ML is not in BSD termcap).
+set_right_margin		smgr	str	MR	-		-	-----	set right soft margin at current column
+label_format			fln	str	Lf	-		-	-----	label format
+set_clock			sclk	str	SC	-		-	-----	set clock, #1 hrs #2 mins #3 secs
+display_clock			dclk	str	DK	-		-	-----	display clock
+remove_clock			rmclk	str	RC	-		-	-----	remove clock
+create_window			cwin	str	CW	-		-	-----	define a window #1 from #2,#3 to #4,#5
+goto_window			wingo	str	WG	-		-	-----	go to window #1
+hangup				hup	str	HU	-		-	-----	hang-up phone
+dial_phone			dial	str	DI	-		-	-----	dial number #1
+quick_dial			qdial	str	QD	-		-	-----	dial number #1 without checking
+tone				tone	str	TO	-		-	-----	select touch tone dialing
+pulse				pulse	str	PU	-		-	-----	select pulse dialing
+flash_hook			hook	str	fh	-		-	-----	flash switch hook
+fixed_pause			pause	str	PA	-		-	-----	pause for 2-3 seconds
+wait_tone			wait	str	WA	-		-	-----	wait for dial-tone
+user0				u0	str	u0	-		-	-----	User string #0
+user1				u1	str	u1	-		-	-----	User string #1
+user2				u2	str	u2	-		-	-----	User string #2
+user3				u3	str	u3	-		-	-----	User string #3
+user4				u4	str	u4	-		-	-----	User string #4
+user5				u5	str	u5	-		-	-----	User string #5
+user6				u6	str	u6	-		-	-----	User string #6
+user7				u7	str	u7	-		-	-----	User string #7
+user8				u8	str	u8	-		-	-----	User string #8
+user9				u9	str	u9	-		-	-----	User string #9
+#
+# SVr4 added these capabilities to support color
+#
+orig_pair			op	str	op	-		-	-----	Set default pair to its original value
+orig_colors			oc	str	oc	-		-	-----	Set all color pairs to the original ones
+initialize_color		initc	str	Ic	-		-	-----	initialize color #1 to (#2,#3,#4)
+initialize_pair			initp	str	Ip	-		-	-----	Initialize color pair #1 to fg=(#2,#3,#4), bg=(#5,#6,#7)
+set_color_pair			scp	str	sp	-		-	-----	Set current color pair to #1
+set_foreground			setf	str	Sf	-		-	-----	Set foreground color #1
+set_background			setb	str	Sb	-		-	-----	Set background color #1
+#
+# SVr4 added these capabilities to support printers
+#
+change_char_pitch		cpi	str	ZA	-		-	-----	Change number of characters per inch to #1
+change_line_pitch		lpi	str	ZB	-		-	-----	Change number of lines per inch to #1
+change_res_horz			chr	str	ZC	-		-	-----	Change horizontal resolution to #1
+change_res_vert			cvr	str	ZD	-		-	-----	Change vertical resolution to #1
+define_char			defc	str	ZE	-		-	-----	Define a character #1, #2 dots wide, descender #3
+enter_doublewide_mode		swidm	str	ZF	-		-	-----	Enter double-wide mode
+enter_draft_quality		sdrfq	str	ZG	-		-	-----	Enter draft-quality mode
+enter_italics_mode		sitm	str	ZH	-		-	-----	Enter italic mode
+enter_leftward_mode		slm	str	ZI	-		-	-----	Start leftward carriage motion
+enter_micro_mode		smicm	str	ZJ	-		-	-----	Start micro-motion mode
+enter_near_letter_quality	snlq	str	ZK	-		-	-----	Enter NLQ mode
+enter_normal_quality		snrmq	str	ZL	-		-	-----	Enter normal-quality mode
+enter_shadow_mode		sshm	str	ZM	-		-	-----	Enter shadow-print mode
+enter_subscript_mode		ssubm	str	ZN	-		-	-----	Enter subscript mode
+enter_superscript_mode		ssupm	str	ZO	-		-	-----	Enter superscript mode
+enter_upward_mode		sum	str	ZP	-		-	-----	Start upward carriage motion
+exit_doublewide_mode		rwidm	str	ZQ	-		-	-----	End double-wide mode
+exit_italics_mode		ritm	str	ZR	-		-	-----	End italic mode
+exit_leftward_mode		rlm	str	ZS	-		-	-----	End left-motion mode
+exit_micro_mode			rmicm	str	ZT	-		-	-----	End micro-motion mode
+exit_shadow_mode		rshm	str	ZU	-		-	-----	End shadow-print mode
+exit_subscript_mode		rsubm	str	ZV	-		-	-----	End subscript mode
+exit_superscript_mode		rsupm	str	ZW	-		-	-----	End superscript mode
+exit_upward_mode		rum	str	ZX	-		-	-----	End reverse character motion
+micro_column_address		mhpa	str	ZY	-		-	-----	Like column_address in micro mode
+micro_down			mcud1	str	ZZ	-		-	-----	Like cursor_down in micro mode
+micro_left			mcub1	str	Za	-		-	-----	Like cursor_left in micro mode
+micro_right			mcuf1	str	Zb	-		-	-----	Like cursor_right in micro mode
+micro_row_address		mvpa	str	Zc	-		-	-----	Like row_address #1 in micro mode
+micro_up			mcuu1	str	Zd	-		-	-----	Like cursor_up in micro mode
+order_of_pins			porder	str	Ze	-		-	-----	Match software bits to print-head pins
+parm_down_micro			mcud	str	Zf	-		-	-----	Like parm_down_cursor in micro mode
+parm_left_micro			mcub	str	Zg	-		-	-----	Like parm_left_cursor in micro mode
+parm_right_micro		mcuf	str	Zh	-		-	-----	Like parm_right_cursor in micro mode
+parm_up_micro			mcuu	str	Zi	-		-	-----	Like parm_up_cursor in micro mode
+select_char_set			scs	str	Zj	-		-	-----	Select character set, #1
+set_bottom_margin		smgb	str	Zk	-		-	-----	Set bottom margin at current line
+set_bottom_margin_parm		smgbp	str	Zl	-		-	-----	Set bottom margin at line #1 or (if smgtp is not given) #2 lines from bottom
+set_left_margin_parm		smglp	str	Zm	-		-	-----	Set left (right) margin at column #1
+set_right_margin_parm		smgrp	str	Zn	-		-	-----	Set right margin at column #1
+set_top_margin			smgt	str	Zo	-		-	-----	Set top margin at current line
+set_top_margin_parm		smgtp	str	Zp	-		-	-----	Set top (bottom) margin at row #1
+start_bit_image			sbim	str	Zq	-		-	-----	Start printing bit image graphics
+start_char_set_def		scsd	str	Zr	-		-	-----	Start character set definition #1, with #2 characters in the set
+stop_bit_image			rbim	str	Zs	-		-	-----	Stop printing bit image graphics
+stop_char_set_def		rcsd	str	Zt	-		-	-----	End definition of character set #1
+subscript_characters		subcs	str	Zu	-		-	-----	List of subscriptable characters
+superscript_characters		supcs	str	Zv	-		-	-----	List of superscriptable characters
+these_cause_cr			docr	str	Zw	-		-	-----	Printing any of these characters causes CR
+zero_motion			zerom	str	Zx	-		-	-----	No motion for subsequent character
+#%.TE
+#%.ad
+#%
+#%The following string capabilities are present in the SVr4.0 term structure,
+#%but were originally not documented in the man page.
+#%
+#%.na
+#%.TS H
+#%center expand;
+#%c l l c
+#%c l l c
+#%lw25 lw6 lw2 lw18.
+#%\fBVariable	Cap-	TCap	Description\fR
+#%\fBString	name	Code\fR
+char_set_names			csnm	str	Zy	-		-	-----	Produce #1'th item from list of character set names
+key_mouse			kmous	str	Km	KEY_MOUSE	0631	-----	Mouse event has occurred
+mouse_info			minfo	str	Mi	-		-	-----	Mouse status information
+req_mouse_pos			reqmp	str	RQ	-		-	-----	Request mouse position
+get_mouse			getm	str	Gm	-		-	-----	Curses should get button events, parameter #1 not documented.
+set_a_foreground		setaf	str	AF	-		-	-----	Set foreground color to #1, using ANSI escape
+set_a_background		setab	str	AB	-		-	-----	Set background color to #1, using ANSI escape
+pkey_plab			pfxl	str	xl	-		-	-----	Program function key #1 to type string #2 and show string #3
+device_type			devt	str	dv	-		-	-----	Indicate language/codeset support
+code_set_init			csin	str	ci	-		-	-----	Init sequence for multiple codesets
+set0_des_seq			s0ds	str	s0	-		-	-----	Shift to codeset 0 (EUC set 0, ASCII)
+set1_des_seq			s1ds	str	s1	-		-	-----	Shift to codeset 1
+set2_des_seq			s2ds	str	s2	-		-	-----	Shift to codeset 2
+set3_des_seq			s3ds	str	s3	-		-	-----	Shift to codeset 3
+set_lr_margin			smglr	str	ML	-		-	-----	Set both left and right margins to #1, #2.  (ML is not in BSD termcap).
+set_tb_margin			smgtb	str	MT	-		-	-----	Sets both top and bottom margins to #1, #2
+bit_image_repeat		birep	str	Xy	-		-	-----	Repeat bit image cell #1 #2 times
+bit_image_newline		binel	str	Zz	-		-	-----	Move to next row of the bit image
+bit_image_carriage_return	bicr	str	Yv	-		-	-----	Move to beginning of same row
+color_names			colornm	str	Yw	-		-	-----	Give name for color #1
+define_bit_image_region		defbi	str	Yx	-		-	-----	Define rectangular bit image region
+end_bit_image_region		endbi	str	Yy	-		-	-----	End a bit-image region
+set_color_band		setcolor	str	Yz	-		-	-----	Change to ribbon color #1
+set_page_length			slines	str	YZ	-		-	-----	Set page length to #1 lines
+#
+# SVr4 added these capabilities for direct PC-clone support
+#
+display_pc_char			dispc	str	S1	-		-	-----	Display PC character #1
+enter_pc_charset_mode		smpch	str	S2	-		-	-----	Enter PC character display mode
+exit_pc_charset_mode		rmpch	str	S3	-		-	-----	Exit PC character display mode
+enter_scancode_mode		smsc	str	S4	-		-	-----	Enter PC scancode mode
+exit_scancode_mode		rmsc	str	S5	-		-	-----	Exit PC scancode mode
+pc_term_options			pctrm	str	S6	-		-	-----	PC terminal options
+scancode_escape			scesc	str	S7	-		-	-----	Escape for scancode emulation
+alt_scancode_esc		scesa	str	S8	-		-	-----	Alternate escape for scancode emulation
+#%.TE
+#%.ad
+#%
+#%.in .8i
+#%The XSI Curses standard added these hardcopy capabilities.
+#%They were used in some post-4.1 versions of System V curses,
+#%e.g., Solaris 2.5 and IRIX 6.x.
+#%Except for \fBYI\fP, the \fBncurses\fR termcap names for them are invented.
+#%According to the XSI Curses standard, they have no termcap names.
+#%If your compiled terminfo entries use these,
+#%they may not be binary-compatible with System V terminfo
+#%entries after SVr4.1; beware!
+#%
+#%.na
+#%.TS H
+#%center expand;
+#%c l l c
+#%c l l c
+#%lw25 lw6 lw2 lw20.
+#%\fBVariable	Cap-	TCap	Description\fR
+#%\fBString	name	Code\fR
+#enter_horizontal_hl_mode	ehhlm	str	Xh	-		-	-----	Enter horizontal highlight mode
+#enter_left_hl_mode		elhlm	str	Xl	-		-	-----	Enter left highlight mode
+#enter_low_hl_mode		elohlm	str	Xo	-		-	-----	Enter low highlight mode
+#enter_right_hl_mode		erhlm	str	Xr	-		-	-----	Enter right highlight mode
+#enter_top_hl_mode		ethlm	str	Xt	-		-	-----	Enter top highlight mode
+#enter_vertical_hl_mode		evhlm	str	Xv	-		-	-----	Enter vertical highlight mode
+#set_a_attributes		sgr1	str	sA	-		-	-----	Define second set of video attributes #1-#6
+set_pglen_inch			slength	str	YI	-		-	-----	Set page length to #1 hundredth of an inch (some implementations use sL for termcap).
+#%.TE
+#%.ad
+#
+# The magic token below tells the tic compiler-generator code that all the caps
+# past it should be ignored (not written out) when dumping terminfo objects. It
+# also tells the man page table generator not to pass through following lines
+# This means we can have obsolete capabilities and pseudo-capabilities that are
+# recognized for termcap or terminfo compilation, but not output.
+#
+# %%-STOP-HERE-%%
+#
+# Don't move this casually!  In fact, don't move it at all unless you're
+# either doing it to add System V or XPG4 extensions, or have decided you
+# don't care about SVr4 binary compatibility.
+#
+#############################################################################
+#
+# TERMCAP EXTENSION CAPABILITIES
+#
+# The capabilities below are either obsolete or extensions on certain systems.
+# They are not used by SVR4 terminfo.  Some are used by captoinfo to translate
+# termcap sources; the rest are listed for completeness, and in case somebody
+# cares about them enough to hack in code that will translate them into
+# terminfo capabilities.
+#
+# The first part of the list is from Ross Ridge's `mytinfo' package
+# (comp.sources.unix, volume 26); the variable names and terminfo names (as
+# well as the termcap codes) match his list.
+#
+# This group of codes is not marked obsolete in 4.4BSD, but have no direct
+# terminfo equivalents.  The rs capability is specially translated to terminfo
+# r2, and vice versa, if an entry does not already have an r2.  Similarly,
+# i2 is translated to r3 if there is no r3 (because SV terminfo maps is to i2).
+# The ug capability is thrown away, but assumed to be whatever sg is if the
+# latter is nonzero and we're dumping in termcap format.
+#
+termcap_init2			OTi2	str	i2	-		-	YB---	secondary initialization string
+termcap_reset			OTrs	str	rs	-		-	YB-G-	terminal reset string
+magic_cookie_glitch_ul		OTug	num	ug	-		-	YBCGE	number of blanks left by ul
+#
+# Obsolete termcap capabilities.  Some are used for termcap translation.  The
+# code uses the 'OT' prefix we put on obsolete capabilities to suppress
+# printing them in terminfo source dumps of compiled entries.
+#
+backspaces_with_bs		OTbs	bool	bs	-		-	YBCGE	uses ^H to move left
+crt_no_scrolling		OTns	bool	ns	-		-	YBCG-	crt cannot scroll
+no_correctly_working_cr		OTnc	bool	nc	-		-	YBCG-	no way to go to start of line
+carriage_return_delay		OTdC	num	dC	-		-	YB-G-	pad needed for CR
+new_line_delay			OTdN	num	dN	-		-	YB-G-	pad needed for LF
+linefeed_if_not_lf		OTnl	str	nl	-		-	YBCGE	use to move down
+backspace_if_not_bs		OTbc	str	bc	-		-	YBCGE	move left, if not ^H
+#
+# GNU termcap library extensions.  The GNU termcap file distributed with
+# Emacs no longer uses these, but MT showed up in pre-9.0 versions of the
+# BSD termcap file.  The name clash with terminfo MT is resolved by type
+# info; MT is converted to km.
+#
+gnu_has_meta_key		OTMT	bool	MT	-		-	----E	has meta key
+# gnu_tab_width			OTtw	num	tw	-		-	----E	tab width in spaces
+#
+# GNU termcap *does* include the following extended capability,  Only the
+# now-obsolete Ann Arbor terminals used it.
+#
+# gnu_change_scroll_region	OTcS	str	cS	-		-	---GE	alternate set scrolling region
+#
+# The following comments describe capnames so ancient that I believe no
+# software uses them any longer.  Some of these have to go because they
+# clash with terminfo names in ways that cannot be resolved by type
+# information.
+#
+# These mytinfo codes are not used in the 4.4BSD curses code.  They are
+# marked obsolete in the 4.4BSD manual pages.
+#
+# There is one conflict with terminfo; ma is in both.  This conflict is
+# resolved by type information.
+#
+# The `ko' capability is translated by special code.  It should contain a
+# comma-separated list of capabilities for which there are corresponding keys.
+# The `kn' code is accepted but ignored.
+#
+# The `ma' capability was a 4.0BSD feature used by vi version 2.
+# It consists of pairs of characters corresponding to kl, kr, ku, kd, and kh.
+# Besides being obsolete, that interpretation conflicts with max_attributes.
+#
+# Here is a description of memory_lock_above and memory_unlock:
+# "You can 'freeze' data on the screen by turning on Memory Lock in a line of
+# text.  All lines above the cursor's current line become locked in place on
+# the screen.  Then enter data normally.  When the screen fills up, any
+# further data entered forces the first line of unfrozen line text to scroll
+# under the frozen data.  Lines scrolled off the screen are inserted into
+# memory immediately preceding the first frozen line." (from the HP 700/96
+# User's manual).  VT100/ANSI memory lock set is \E[>2h, reset is \E[>2l.
+#
+# Applications that use terminfo are supposed to behave as though xr is
+# always true.
+#
+linefeed_is_newline		OTNL	bool	NL	-		-	YB---	move down with \n
+# even_parity			OTEP	bool	EP	-		-	-B---	terminal requires even parity
+# odd_parity			OTOP	bool	OP	-		-	-B---	terminal requires odd parity
+# half_duplex			OTHD	bool	HD	-		-	-B---	terminal is half-duplex
+# lower_case_only		OTLC	bool	LC	-		-	-B---	terminal has only lower case
+# upper_case_only		OTUC	bool	UC	-		-	-B---	terminal has only upper case
+backspace_delay			OTdB	num	dB	-		-	YB-G-	padding required for ^H
+# form_feed_delay		OTdF	num	dF	-		-	-B-G-	padding required for ^L
+horizontal_tab_delay		OTdT	num	dT	-		-	YB-G-	padding required for ^I
+# vertical_tab_delay		OTdV	num	dV	-		-	-B---	padding required for ^V
+number_of_function_keys		OTkn	num	kn	-		-	-B-G-	count of function keys
+other_non_function_keys		OTko	str	ko	-		-	-B-G-	list of self-mapped keycaps
+arrow_key_map			OTma	str	ma	-		-	YBC--	map motion-keys for vi version 2
+# memory_lock_above		OTml	str	ml	-		-	-B---	lock visible screen memory above the current line
+# memory_unlock			OTmu	str	mu	-		-	-B---	unlock visible screen memory above the current line
+has_hardware_tabs		OTpt	bool	pt	-		-	YB---	has 8-char tabs invoked with ^I
+return_does_clr_eol		OTxr	bool	xr	-		-	YB---	return clears the line
+# tek_4025_insert_line		OTxx	bool	xx	-		-	-BC--	Tektronix 4025 insert-line glitch
+#
+# mytinfo described this as a termcap capability, but it is not listed in the
+# 4.4BSD man pages, and not found in the 4.4BSD termcap file.  The ncurses
+# package, like System V, behaves as though it is always true.
+#
+# rind_only_at_top		OTxq	bool	xq	-		-	-----	reverse index only works from top line
+#
+# University of Waterloo termcap extensions (as described in mytinfo).
+# The `xl' termcap file clashes with a terminfo name; this ambiguity cannot
+# be resolved by a type check.  The descriptions are guesses from what was
+# in the mytinfo tables.
+#
+# key_interrupt_char		OTki	str	ki	-		-	-----	string set by interrupt key (?)
+# key_kill_char			OTkk	str	kk	-		-	-----	string set by kill key (?)
+# key_suspend_char		OTkz	str	kz	-		-	-----	string set by suspend key (?)
+# initialization_messy		OTxc	bool	xc	-		-	-----	initialization leaves garbage on the screen (?)
+# ind_at_bottom_does_cr		OTxl	bool	xl	-		-	-----	index does a carriage return
+#
+# Nonstandard capabilities unique to Ross Ridge's `mytinfo' package.
+# SR clashes with a terminfo name; this ambiguity cannot be resolved by a type
+# check.
+#
+# scroll_left			OTsl1	str	Sl	-		-	-----	scroll screen leftward
+# scroll_right			OTsr1	str	Sr	-		-	-----	scroll screen rightward
+# parm_scroll_left		OTsl	str	SL	-		-	-----	scroll screen leftward #1 characters
+# parm_scroll_right		OTsr	str	SR	-		-	-----	scroll screen rightward #1 characters
+#
+# The mytinfo capabilities end here.
+#
+# XENIX extensions:
+#
+# Xenix defined its own set of forms-drawing capabilities:
+#
+# cap	IBM ASCII	description             ACS         	ASCII
+# ---	-----------	--------------------    -------------	------
+# G1	191 \277 M-?	single upper right   	ACS_URCORNER
+# G2	218 \332 M-Z	single upper left	ACS_ULCORNER
+# G3	192 \300 M-@	single lower left	ACS_LLCORNER
+# G4	217 \331 M-Y	single lower right	ACS_LRCORNER
+# G5	187 \273 M-;	double upper right
+# G6	201 \311 M-I	double upper left
+# G7	200 \310 M-H	double lower left
+# G8	188 \274 M-<	double lower right
+# GC	197 \305 M-E	single intersection	ACS_PLUS	_ _
+# GD	194 \302 M-B	single down-tick	ACS_TTEE	 |
+# GH	196 \304 M-D	single horizontal line	ACS_HLINE
+# GL	180 \264 M-4	single left tick	ACS_RTEE	-|
+# GR	195 \303 M-C	single right tick	ACS_LTEE	|-
+# GU	193 \301 M-A	single up tick		ACS_BTEE	_|_
+# GV	179 \263 M-3	single vertical line	ACS_VLINE
+# Gc	206 \316 M-N	double intersection
+# Gd	203 \313 M-K	double down tick
+# Gh	205 \315 M-M	double horizontal line
+# Gl	204 \204 M-L	double left tick
+# Gr	185 \271 M-9	double right tick
+# Gu	202 \312 M-J	double up tick
+# Gv	186 \272 M-:	double vertical line
+#
+# The compiler will translate the single-line caps and discard the others
+# (via IGNORE aliases further down).  We don't want to do normal pad
+# translation on these, they're often single-character printable ASCII
+# strings that happen to be numerics.  There's awk code in parametrized.sh
+# that detects the acs_ prefix and uses it to suppress pad translation.
+# These terminfo names are invented.
+#
+acs_ulcorner			OTG2	str	G2	-		-	-----	single upper left
+acs_llcorner			OTG3	str	G3	-		-	-----	single lower left
+acs_urcorner			OTG1	str	G1	-		-	-----	single upper right
+acs_lrcorner			OTG4	str	G4	-		-	-----	single lower right
+acs_ltee			OTGR	str	GR	-		-	-----	tee pointing right
+acs_rtee			OTGL	str	GL	-		-	-----	tee pointing left
+acs_btee			OTGU	str	GU	-		-	-----	tee pointing up
+acs_ttee			OTGD	str	GD	-		-	-----	tee pointing down
+acs_hline			OTGH	str	GH	-		-	-----	single horizontal line
+acs_vline			OTGV	str	GV	-		-	-----	single vertical line
+acs_plus			OTGC	str	GC	-		-	-----	single intersection
+#
+#############################################################################
+#
+# TERMINFO EXTENSION CAPABILITIES
+#
+# (see Caps-ncurses for the complete set of comments)
+#
+memory_lock			meml	str	ml	-		-	----K	lock memory above cursor
+memory_unlock			memu	str	mu	-		-	----K	unlock memory
+#
+#############################################################################
diff --git a/include/Caps.hpux11 b/include/Caps.hpux11
new file mode 100644
index 0000000..3c0444f
--- /dev/null
+++ b/include/Caps.hpux11
@@ -0,0 +1,986 @@
+##############################################################################
+# Copyright 2019-2020,2021 Thomas E. Dickey                                  #
+# Copyright 2002-2015,2016 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.                                                             #
+##############################################################################
+#
+# Author: Thomas Dickey
+#
+# $Id: Caps.hpux11,v 1.18 2021/10/08 07:55:48 tom Exp $
+#
+# This is an adaptation of ncurses' termcap/terminfo capability table, which
+# is designed to align with HPUX 11.x's terminfo.
+#
+# This table is used to generate initializers for tables that drive tic,
+# infocmp, and the library compilation code used to support the termcap
+# compatibility hack.  It is also used to generate the tabular portion of the
+# terminfo(5) man page; lines beginning with `#%' are passed through to become
+# the terminfo table.
+#
+# This file has three major sections; a standard-capabilities table, two
+# extension-capability tables, and a section of aliases declarations.
+# The first two have the same format, as follows:
+#
+# FILE FORMAT
+#
+# Column 1: terminfo variable name
+# Column 2: terminfo capability name
+# Column 3: capability type (boolean, numeric, or string)
+# Column 4: termcap capability name
+# Column 5: KEY_xxx name, if any, `-' otherwise
+# Column 6: value for KEY_xxx name, if any, `-' otherwise
+# Column 7: Lead with `Y' if capability should be emitted in termcap
+#           translations, `-' otherwise
+# Column 8: capability description
+#
+# The codes following [Y-] in column 7 describe the versions of termcap which
+# use the given capability.  This information is not used by the curses library
+# proper; rather, it is there to help the terminfo maintainer avoid emitting
+# termcap entry translations that are more than 1023 bytes long (and tank a
+# lot of old termcap-using programs).  The codes read as follows:
+#	B = mentioned in the BSD man page for 4.4BSD curses
+#	C = used by the 4.4BSD curses library
+#	G = mentioned in the documentation for GNU termcap
+#	E = used by GNU Emacs
+#	K = remove this terminfo capability when translating to standard format
+# The important codes are C and E.  A cap with C or E should be preserved in
+# translation if possible.  The problem is that preserving all such caps may
+# lead to some termcap translations being too long.  The termcap maintainer
+# has a bit of a juggling act to do...potential problem cases are marked with
+# an asterisk (*).
+#
+# The aliases section has the following format:
+#
+# Column 1: either `capalias' or `infoalias'
+# Column 2: name to be aliased
+# Column 3: what name it should translate to.  The name IGNORE means it
+#           should be discarded with a warning message.
+# Column 4: name of the extension set (used for compiler warning messages)
+# Column 5: capability description (usually an associated terminfo variable)
+#
+# HANDLING TERMCAP AND TERMINFO EXTENSIONS
+#
+# There are basically five different ways to handle termcap and terminfo
+# extensions:
+#
+# 1. Don't list the capname here, or list it but comment it out (the latter
+# is preferable; someone might want to handle it in the future).  If you do
+# this, the capability will be treated as unknown and raise a warning from
+# the compiler.
+#
+# 2. Alias it.  This is appropriate if the capability has the same meaning
+# as an already-supported one.  The compiler will handle aliasing, emitting
+# an appropriate informational message whenever an alias fires.
+#
+# 3. List it in the standard table.  You almost certainly do *not* want
+# to do this -- the capabilities in that one, and their order, have been
+# carefully chosen to be SVr4-binary-compatible when they're written out
+# as a terminfo object, and breaking this would be bad.  It is up to the ncurses
+# library what to do with the terminfo data after it is read in.
+#
+# 4. List it in the aliases table with an IGNORE target field.  If you
+# do this, the capability will be ignored on input (though the user will
+# get a warning message about it).
+#
+# 5. List it in the extensions table. If you do this, the compiler will
+# silently accept the capability, but the curses library proper will never
+# see it (because it won't be written out as part of the terminfo object
+# format).  It is up to you what you have the compiler do with it.
+#
+# There are two opposite reasons to choose option 5.  One is when you want
+# to eat the capability silently and discard it when doing translations
+# to terminfo with tic -I.  Some very old obsolete BSD caps like :kn: are
+# in this class.  Nothing will ever use them again.
+#
+# More usually, you want the compiler to try to deduce something from the
+# capability value that it can use to translate it into your output format.
+# You'll need to write custom code, probably in postprocess_termcap() or
+# postprocess_terminfo(), to handle the translation.
+#
+# CONTROLLING ENTRY LENGTH
+#
+# Notes on specific elisions made to fit translations within 1023 bytes:
+#
+# Machines with IBM PC-like keyboards want to be able to define the following
+# keys: key_npage, key_ppage, key_home, key_ll (which is used for in termcap-
+# only environments for End or Home-Down), key_dc, and key_ic.  This is also
+# the set of keys the `joe' editor will be upset if it can't see.  So don't
+# trim those out of the set to be translated to termcap, or various users of
+# the termcap file will become irate.
+#
+# It might look tempting to leave those long init strings out of translations.
+# We can't do it (yet); 4.4BSD tput and tset use them.
+#
+# We retain the sgr capability in translation in spite of the fact that neither
+# 4.4BSD nor GNU Emacs uses it, because (a) some entry naming distinctions are
+# hard to understand without it, and (b) the entries in which it is long tend
+# to be older types that don't use up a lot of string space on function keys.
+# The tic(1) translation code will complain and elide it if it makes a critical
+# difference (there is special code in tic to recognize this situation).
+#
+# Yes, BSD tset(1) uses hpa.  We elide hpa/vpa anyway because the motion
+# optimizer in BSD curses didn't use them.  This omission seems to be the
+# single most effective one, it shortened the resolved length of all thirteen
+# problem entries in the 9.9.0 version of the terminfo master below critical.
+#
+# It would be nice to keep f11 and f12 for Emacs use, but a couple of termcap
+# translations go back over critical if we do this.  As 4.4BSD curses fades
+# into history and GNU termcap's application base shrinks towards being GNU
+# Emacs only, we'll probably elide out some BSD-only capabilities in order
+# to buy space for non-essentials Emacs is still using.  Capabilities high
+# on that hit list: rc, sc, uc.
+#
+#############################################################################
+#
+# STANDARD CAPABILITIES
+#
+#%The following is a complete table of the capabilities included in a
+#%terminfo description block and available to terminfo-using code.  In each
+#%line of the table,
+#%
+#%The \fBvariable\fR is the name by which the programmer (at the terminfo level)
+#%accesses the capability.
+#%
+#%The \fBcapname\fR is the short name used in the text of the database,
+#%and is used by a person updating the database.
+#%Whenever possible, capnames are chosen to be the same as or similar to
+#%the ANSI X3.64-1979 standard (now superseded by ECMA-48, which uses
+#%identical or very similar names).  Semantics are also intended to match
+#%those of the specification.
+#%
+#%The termcap code is the old
+#%.B termcap
+#%capability name (some capabilities are new, and have names which termcap
+#%did not originate).
+#%.P
+#%Capability names have no hard length limit, but an informal limit of 5
+#%characters has been adopted to keep them short and to allow the tabs in
+#%the source file
+#%.B Caps
+#%to line up nicely.
+#%
+#%Finally, the description field attempts to convey the semantics of the
+#%capability.  You may find some codes in the description field:
+#%.TP
+#%(P)
+#%indicates that padding may be specified
+#%.TP
+#%#[1-9]
+#%in the description field indicates that the string is passed
+#%through \fBtparm\fP(3X) with parameters as given (#\fIi\fP).
+#%.IP
+#%If no parameters are listed in the description,
+#%passing the string through \fBtparm\fP(3X) may give unexpected results,
+#%e.g., if it contains percent (%%) signs.
+#%.TP
+#%(P*)
+#%indicates that padding may vary in proportion to the number of
+#%lines affected
+#%.TP
+#%(#\d\fIi\fP\u)
+#%indicates the \fIi\fP\uth\d parameter.
+#%
+#%.PP
+#% These are the boolean capabilities:
+#%
+#%.na
+#%.TS H
+#%center expand;
+#%c l l c
+#%c l l c
+#%lw25 lw6 lw2 lw20.
+#%\fBVariable	Cap-	TCap	Description\fR
+#%\fBBooleans	name	Code\fR
+auto_left_margin		bw	bool	bw	-	-	YB-G-	cub1 wraps from column 0 to last column
+auto_right_margin		am	bool	am	-	-	YBCGE	terminal has automatic margins
+no_esc_ctlc			xsb	bool	xb	-	-	YBCG-	beehive (f1=escape, f2=ctrl C)
+ceol_standout_glitch		xhp	bool	xs	-	-	YBCGE	standout not erased by overwriting (hp)
+eat_newline_glitch		xenl	bool	xn	-	-	YBCGE	newline ignored after 80 cols (concept)
+erase_overstrike		eo	bool	eo	-	-	YBCG-	can erase overstrikes with a blank
+generic_type			gn	bool	gn	-	-	YB-G-	generic line type
+hard_copy			hc	bool	hc	-	-	YBCG-	hardcopy terminal
+has_meta_key			km	bool	km	-	-	YB-GE	Has a meta key (i.e., sets 8th-bit)
+has_status_line			hs	bool	hs	-	-	YB-G-	has extra status line
+insert_null_glitch		in	bool	in	-	-	YBCGE	insert mode distinguishes nulls
+memory_above			da	bool	da	-	-	YBCG-	display may be retained above the screen
+memory_below			db	bool	db	-	-	YB-GE	display may be retained below the screen
+move_insert_mode		mir	bool	mi	-	-	YBCGE	safe to move while in insert mode
+move_standout_mode		msgr	bool	ms	-	-	YBCGE	safe to move while in standout mode
+over_strike			os	bool	os	-	-	YBCG-	terminal can overstrike
+status_line_esc_ok		eslok	bool	es	-	-	YB-G-	escape can be used on the status line
+dest_tabs_magic_smso		xt	bool	xt	-	-	YBCGE	tabs destructive, magic so char (t1061)
+tilde_glitch			hz	bool	hz	-	-	YB-GE	cannot print ~'s (Hazeltine)
+transparent_underline		ul	bool	ul	-	-	YBCGE	underline character overstrikes
+xon_xoff			xon	bool	xo	-	-	YB---	terminal uses xon/xoff handshaking
+# end booleans for HPUX 9, 10 (non-color curses)
+needs_xon_xoff			nxon	bool	nx	-	-	-----	padding will not work, xon/xoff required
+prtr_silent			mc5i	bool	5i	-	-	-----	printer will not echo on screen
+hard_cursor			chts	bool	HC	-	-	-----	cursor is hard to see
+non_rev_rmcup			nrrmc	bool	NR	-	-	-----	smcup does not reverse rmcup
+no_pad_char			npc	bool	NP	-	-	-----	pad character does not exist
+non_dest_scroll_region		ndscr	bool	ND	-	-	-----	scrolling region is non-destructive
+can_change			ccc	bool	cc	-	-	-----	terminal can re-define existing colors
+back_color_erase		bce	bool	ut	-	-	-----	screen erased with background color
+hue_lightness_saturation	hls	bool	hl	-	-	-----	terminal uses only HLS color notation (Tektronix)
+col_addr_glitch			xhpa	bool	YA	-	-	-----	only positive motion for hpa/mhpa caps
+cr_cancels_micro_mode		crxm	bool	YB	-	-	-----	using cr turns off micro mode
+has_print_wheel			daisy	bool	YC	-	-	-----	printer needs operator to change character set
+row_addr_glitch			xvpa	bool	YD	-	-	-----	only positive motion for vpa/mvpa caps
+semi_auto_right_margin		sam	bool	YE	-	-	-----	printing in last column causes cr
+cpi_changes_res			cpix	bool	YF	-	-	-----	changing character pitch changes resolution
+lpi_changes_res			lpix	bool	YG	-	-	-----	changing line pitch changes resolution
+#%.TE
+#%.ad
+#%
+#%These are the numeric capabilities:
+#%
+#%.na
+#%.TS H
+#%center expand;
+#%c l l c
+#%c l l c
+#%lw25 lw6 lw2 lw20.
+#%\fBVariable	Cap-	TCap	Description\fR
+#%\fBNumeric	name	Code\fR
+columns				cols	num	co	-	-	YBCGE	number of columns in a line
+init_tabs			it	num	it	-	-	YB-G-	tabs initially every # spaces
+lines				lines	num	li	-	-	YBCGE	number of lines on screen or page
+lines_of_memory			lm	num	lm	-	-	YB-G-	lines of memory if > line. 0 means varies
+magic_cookie_glitch		xmc	num	sg	-	-	YBCGE	number of blank characters left by smso or rmso
+padding_baud_rate		pb	num	pb	-	-	YB-GE	lowest baud rate where padding needed
+virtual_terminal		vt	num	vt	-	-	YB---	virtual terminal number (CB/unix)
+width_status_line		wsl	num	ws	-	-	YB-G-	number of columns in status line
+# end numbers for HPUX 9, 10 (non-color curses)
+num_labels			nlab	num	Nl	-	-	-----	number of labels on screen
+label_height			lh	num	lh	-	-	-----	rows in each label
+label_width			lw	num	lw	-	-	-----	columns in each label
+max_attributes			ma	num	ma	-	-	YBC--	maximum combined attributes terminal can handle
+maximum_windows			wnum	num	MW	-	-	-----	maximum number of definable windows
+# These came in with SVr4's color support
+max_colors			colors	num	Co	-	-	-----	maximum number of colors on screen
+max_pairs			pairs	num	pa	-	-	-----	maximum number of color-pairs on the screen
+no_color_video			ncv	num	NC	-	-	-----	video attributes that cannot be used with colors
+#%.TE
+#%.ad
+#%
+#%The following numeric capabilities are present in the SVr4.0 term structure,
+#%but are not yet documented in the man page.  They came in with SVr4's
+#%printer support.
+#%
+#%.na
+#%.TS H
+#%center expand;
+#%c l l c
+#%c l l c
+#%lw25 lw6 lw2 lw20.
+#%\fBVariable	Cap-	TCap	Description\fR
+#%\fBNumeric	name	Code\fR
+buffer_capacity			bufsz	num	Ya	-	-	-----	numbers of bytes buffered before printing
+dot_vert_spacing		spinv	num	Yb	-	-	-----	spacing of pins vertically in pins per inch
+dot_horz_spacing		spinh	num	Yc	-	-	-----	spacing of dots horizontally in dots per inch
+max_micro_address		maddr	num	Yd	-	-	-----	maximum value in micro_..._address
+max_micro_jump			mjump	num	Ye	-	-	-----	maximum value in parm_..._micro
+micro_char_size			mcs	num	Yf	-	-	-----	character step size when in micro mode
+micro_line_size			mls	num	Yg	-	-	-----	line step size when in micro mode
+number_of_pins			npins	num	Yh	-	-	-----	numbers of pins in print-head
+output_res_char			orc	num	Yi	-	-	-----	horizontal resolution in units per line
+output_res_line			orl	num	Yj	-	-	-----	vertical resolution in units per line
+output_res_horz_inch		orhi	num	Yk	-	-	-----	horizontal resolution in units per inch
+output_res_vert_inch		orvi	num	Yl	-	-	-----	vertical resolution in units per inch
+print_rate			cps	num	Ym	-	-	-----	print rate in characters per second
+wide_char_size			widcs	num	Yn	-	-	-----	character step size when in double wide mode
+buttons				btns	num	BT	-	-	-----	number of buttons on mouse
+bit_image_entwining		bitwin	num	Yo	-	-	-----	number of passes for each bit-image row
+bit_image_type			bitype	num	Yp	-	-	-----	type of bit-image device
+#%.TE
+#%.ad
+#%
+#%These are the string capabilities:
+#%
+#%.na
+#%.TS H
+#%center expand;
+#%c l l c
+#%c l l c
+#%lw25 lw6 lw2 lw20.
+#%\fBVariable	Cap-	TCap	Description\fR
+#%\fBString	name	Code\fR
+back_tab			cbt	str	bt	-		-	YBCGE	back tab (P)
+bell				bel	str	bl	-		-	YB-GE	audible signal (bell) (P)
+carriage_return			cr	str	cr	-		-	YBCGE	carriage return (P*) (P*)
+change_scroll_region		csr	str	cs	-		-	YBCGE	change region to line #1 to line #2 (P)
+clear_all_tabs			tbc	str	ct	-		-	YB-G-	clear all tab stops (P)
+clear_screen			clear	str	cl	-		-	YBCGE	clear screen and home cursor (P*)
+clr_eol				el	str	ce	-		-	YBCGE	clear to end of line (P)
+clr_eos				ed	str	cd	-		-	YBCGE	clear to end of screen (P*)
+column_address			hpa	str	ch	-		-	-B-GE*	horizontal position #1, absolute (P)
+command_character		cmdch	str	CC	-		-	YB-G-	terminal settable cmd character in prototype !?
+cursor_address			cup	str	cm	-		-	YBCGE	move to row #1 columns #2
+cursor_down			cud1	str	do	-		-	YBCGE	down one line
+cursor_home			home	str	ho	-		-	YBCGE	home cursor (if no cup)
+cursor_invisible		civis	str	vi	-		-	YB-G-	make cursor invisible
+cursor_left			cub1	str	le	-		-	YBCGE	move left one space
+cursor_mem_address		mrcup	str	CM	-		-	YB-G-	memory relative cursor addressing, move to row #1 columns #2
+cursor_normal			cnorm	str	ve	-		-	YBCGE	make cursor appear normal (undo civis/cvvis)
+cursor_right			cuf1	str	nd	-		-	YBCGE	non-destructive space (move right one space)
+cursor_to_ll			ll	str	ll	-		-	YBCGE	last line, first column (if no cup)
+cursor_up			cuu1	str	up	-		-	YBCGE	up one line
+cursor_visible			cvvis	str	vs	-		-	YBCGE	make cursor very visible
+delete_character		dch1	str	dc	-		-	YBCGE	delete character (P*)
+delete_line			dl1	str	dl	-		-	YBCGE	delete line (P*)
+dis_status_line			dsl	str	ds	-		-	YB-G-	disable status line
+down_half_line			hd	str	hd	-		-	YB-G-	half a line down
+enter_alt_charset_mode		smacs	str	as	-		-	YB-G-	start alternate character set (P)
+enter_blink_mode		blink	str	mb	-		-	YB-G-	turn on blinking
+enter_bold_mode			bold	str	md	-		-	YB-G-	turn on bold (extra bright) mode
+enter_ca_mode			smcup	str	ti	-		-	YBCGE	string to start programs using cup
+enter_delete_mode		smdc	str	dm	-		-	YBCGE	enter delete mode
+enter_dim_mode			dim	str	mh	-		-	YB-G-	turn on half-bright mode
+enter_insert_mode		smir	str	im	-		-	YBCGE	enter insert mode
+enter_secure_mode		invis	str	mk	-		-	-B-G-*	turn on blank mode (characters invisible)
+enter_protected_mode		prot	str	mp	-		-	-B-G-*	turn on protected mode
+enter_reverse_mode		rev	str	mr	-		-	YB-G-	turn on reverse video mode
+enter_standout_mode		smso	str	so	-		-	YBCGE	begin standout mode
+enter_underline_mode		smul	str	us	-		-	YBCGE	begin underline mode
+erase_chars			ech	str	ec	-		-	YB-G-	erase #1 characters (P)
+exit_alt_charset_mode		rmacs	str	ae	-		-	YB-G-	end alternate character set (P)
+exit_attribute_mode		sgr0	str	me	-		-	YB-GE	turn off all attributes
+exit_ca_mode			rmcup	str	te	-		-	YBCGE	strings to end programs using cup
+exit_delete_mode		rmdc	str	ed	-		-	YBCGE	end delete mode
+exit_insert_mode		rmir	str	ei	-		-	YBCGE	exit insert mode
+exit_standout_mode		rmso	str	se	-		-	YBCGE	exit standout mode
+exit_underline_mode		rmul	str	ue	-		-	YBCGE	exit underline mode
+flash_screen			flash	str	vb	-		-	YBCGE	visible bell (may not move cursor)
+form_feed			ff	str	ff	-		-	YB-G-	hardcopy terminal page eject (P*)
+from_status_line		fsl	str	fs	-		-	YB-G-	return from status line
+init_1string			is1	str	i1	-		-	YB-G-	initialization string
+init_2string			is2	str	is	-		-	YB-G-	initialization string
+init_3string			is3	str	i3	-		-	YB-G-	initialization string
+init_file			if	str	if	-		-	YB-G-	name of initialization file
+insert_character		ich1	str	ic	-		-	YBCGE	insert character (P)
+insert_line			il1	str	al	-		-	YBCGE	insert line (P*)
+insert_padding			ip	str	ip	-		-	YBCGE	insert padding after inserted character
+key_backspace			kbs	str	kb	KEY_BACKSPACE	0407	YB-G-	backspace key
+key_catab			ktbc	str	ka	KEY_CATAB	0526	-B-G-*	clear-all-tabs key
+key_clear			kclr	str	kC	KEY_CLEAR	0515	-B-G-*	clear-screen or erase key
+key_ctab			kctab	str	kt	KEY_CTAB	0525	-B-G-*	clear-tab key
+key_dc				kdch1	str	kD	KEY_DC		0512	YB-G-	delete-character key
+key_dl				kdl1	str	kL	KEY_DL		0510	-B-G-*	delete-line key
+key_down			kcud1	str	kd	KEY_DOWN	0402	YBCGE	down-arrow key
+key_eic				krmir	str	kM	KEY_EIC		0514	-B-G-*	sent by rmir or smir in insert mode
+key_eol				kel	str	kE	KEY_EOL		0517	-B-G-*	clear-to-end-of-line key
+key_eos				ked	str	kS	KEY_EOS		0516	-B-G-*	clear-to-end-of-screen key
+key_f0				kf0	str	k0	KEY_F(0)	0410	YBCGE	F0 function key
+key_f1				kf1	str	k1	KEY_F(1)	-	YBCGE	F1 function key
+key_f10				kf10	str	k;	KEY_F(10)	-	----E	F10 function key
+key_f2				kf2	str	k2	KEY_F(2)	-	YBCGE	F2 function key
+key_f3				kf3	str	k3	KEY_F(3)	-	YBCGE	F3 function key
+key_f4				kf4	str	k4	KEY_F(4)	-	YBCGE	F4 function key
+key_f5				kf5	str	k5	KEY_F(5)	-	YBCGE	F5 function key
+key_f6				kf6	str	k6	KEY_F(6)	-	YBCGE	F6 function key
+key_f7				kf7	str	k7	KEY_F(7)	-	YBCGE	F7 function key
+key_f8				kf8	str	k8	KEY_F(8)	-	YBCGE	F8 function key
+key_f9				kf9	str	k9	KEY_F(9)	-	YBCGE	F9 function key
+key_home			khome	str	kh	KEY_HOME	0406	YBCGE	home key
+key_ic				kich1	str	kI	KEY_IC		0513	YB-GE	insert-character key
+key_il				kil1	str	kA	KEY_IL		0511	-B-G-*	insert-line key
+key_left			kcub1	str	kl	KEY_LEFT	0404	YBCGE	left-arrow key
+key_ll				kll	str	kH	KEY_LL		0533	YB-G-	lower-left key (home down)
+key_npage			knp	str	kN	KEY_NPAGE	0522	YB-GE	next-page key
+key_ppage			kpp	str	kP	KEY_PPAGE	0523	YB-GE	previous-page key
+key_right			kcuf1	str	kr	KEY_RIGHT	0405	YBCGE	right-arrow key
+key_sf				kind	str	kF	KEY_SF		0520	-B-G-*	scroll-forward key
+key_sr				kri	str	kR	KEY_SR		0521	-B-G-*	scroll-backward key
+key_stab			khts	str	kT	KEY_STAB	0524	-B-G-*	set-tab key
+key_up				kcuu1	str	ku	KEY_UP		0403	YBCGE	up-arrow key
+keypad_local			rmkx	str	ke	-		-	YBCGE	leave 'keyboard_transmit' mode
+keypad_xmit			smkx	str	ks	-		-	YBCGE	enter 'keyboard_transmit' mode
+lab_f0				lf0	str	l0	-		-	-B-G-*	label on function key f0 if not f0
+lab_f1				lf1	str	l1	-		-	-B-G-*	label on function key f1 if not f1
+lab_f10				lf10	str	la	-		-	-----	label on function key f10 if not f10
+lab_f2				lf2	str	l2	-		-	-B-G-*	label on function key f2 if not f2
+lab_f3				lf3	str	l3	-		-	-B-G-*	label on function key f3 if not f3
+lab_f4				lf4	str	l4	-		-	-B-G-*	label on function key f4 if not f4
+lab_f5				lf5	str	l5	-		-	-B-G-*	label on function key f5 if not f5
+lab_f6				lf6	str	l6	-		-	-B-G-*	label on function key f6 if not f6
+lab_f7				lf7	str	l7	-		-	-B-G-*	label on function key f7 if not f7
+lab_f8				lf8	str	l8	-		-	-B-G-*	label on function key f8 if not f8
+lab_f9				lf9	str	l9	-		-	-B-G-*	label on function key f9 if not f9
+meta_off			rmm	str	mo	-		-	YB-G-*	turn off meta mode
+meta_on				smm	str	mm	-		-	YB-G-*	turn on meta mode (8th-bit on)
+newline				nel	str	nw	-		-	YB-G-*	newline (behave like cr followed by lf)
+pad_char			pad	str	pc	-		-	YBCGE	padding char (instead of null)
+parm_dch			dch	str	DC	-		-	YB-GE	delete #1 characters (P*)
+parm_delete_line		dl	str	DL	-		-	YBCGE	delete #1 lines (P*)
+parm_down_cursor		cud	str	DO	-		-	YBCGE	down #1 lines (P*)
+parm_ich			ich	str	IC	-		-	YB-GE	insert #1 characters (P*)
+parm_index			indn	str	SF	-		-	YBCG-	scroll forward #1 lines (P)
+parm_insert_line		il	str	AL	-		-	YBCGE	insert #1 lines (P*)
+parm_left_cursor		cub	str	LE	-		-	YBCGE	move #1 characters to the left (P)
+parm_right_cursor		cuf	str	RI	-		-	YBCGE	move #1 characters to the right (P*)
+parm_rindex			rin	str	SR	-		-	YBCG-	scroll back #1 lines (P)
+parm_up_cursor			cuu	str	UP	-		-	YBCGE	up #1 lines (P*)
+pkey_key			pfkey	str	pk	-		-	-B---	program function key #1 to type string #2
+pkey_local			pfloc	str	pl	-		-	-B---	program function key #1 to execute string #2
+pkey_xmit			pfx	str	px	-		-	-B---	program function key #1 to transmit string #2
+print_screen			mc0	str	ps	-		-	-B-G-*	print contents of screen
+prtr_off			mc4	str	pf	-		-	-B-G-*	turn off printer
+prtr_on				mc5	str	po	-		-	-B-G-*	turn on printer
+repeat_char			rep	str	rp	-		-	YB-GE	repeat char #1 #2 times (P*)
+reset_1string			rs1	str	r1	-		-	-B---	reset string
+reset_2string			rs2	str	r2	-		-	-B---	reset string
+reset_3string			rs3	str	r3	-		-	-B---	reset string
+reset_file			rf	str	rf	-		-	-B---	name of reset file
+restore_cursor			rc	str	rc	-		-	YBCG-	restore cursor to position of last save_cursor
+row_address			vpa	str	cv	-		-	-B-GE*	vertical position #1 absolute (P)
+save_cursor			sc	str	sc	-		-	YBCG-	save current cursor position (P)
+scroll_forward			ind	str	sf	-		-	YBCGE	scroll text up (P)
+scroll_reverse			ri	str	sr	-		-	YBCGE	scroll text down (P)
+set_attributes			sgr	str	sa	-		-	YB-G-	define video attributes #1-#9 (PG9)
+set_tab				hts	str	st	-		-	YB-G-	set a tab in every row, current columns
+set_window			wind	str	wi	-		-	-B-GE	current window is lines #1-#2 cols #3-#4
+tab				ht	str	ta	-		-	YBCGE	tab to next 8-space hardware tab stop
+to_status_line			tsl	str	ts	-		-	YB-G-	move to status line, column #1
+underline_char			uc	str	uc	-		-	YBCG-	underline char and move past it
+up_half_line			hu	str	hu	-		-	YB-G-	half a line up
+init_prog			iprog	str	iP	-		-	-B---	path name of program for initialization
+key_a1				ka1	str	K1	KEY_A1		0534	YB-GE	upper left of keypad
+key_a3				ka3	str	K3	KEY_A3		0535	YB-GE	upper right of keypad
+key_b2				kb2	str	K2	KEY_B2		0536	YB-GE	center of keypad
+key_c1				kc1	str	K4	KEY_C1		0537	YB-GE	lower left of keypad
+key_c3				kc3	str	K5	KEY_C3		0540	YB-GE	lower right of keypad
+prtr_non			mc5p	str	pO	-		-	-B-G-*	turn on printer for #1 bytes
+#
+# SVr1 capabilities stop here.	IBM's version of terminfo is the same as
+# SVr4 up to this point, but has a different set afterwards.
+#
+# HPUX defines these if __HP_CURSES_COMPAT is defined:
+memory_lock			meml	str	ml	-		-	----K	lock memory above cursor
+memory_unlock			memu	str	mu	-		-	----K	unlock memory
+#
+#
+plab_norm			pln	str	pn	-		-	-----	program label #1 to show string #2
+label_on			smln	str	LO	-		-	-----	turn on soft labels
+label_off			rmln	str	LF	-		-	-----	turn off soft labels
+key_f11				kf11	str	F1	KEY_F(11)	-	----E	F11 function key
+key_f12				kf12	str	F2	KEY_F(12)	-	----E	F12 function key
+key_f13				kf13	str	F3	KEY_F(13)	-	----E	F13 function key
+key_f14				kf14	str	F4	KEY_F(14)	-	----E	F14 function key
+key_f15				kf15	str	F5	KEY_F(15)	-	----E	F15 function key
+key_f16				kf16	str	F6	KEY_F(16)	-	----E	F16 function key
+key_f17				kf17	str	F7	KEY_F(17)	-	----E	F17 function key
+key_f18				kf18	str	F8	KEY_F(18)	-	----E	F18 function key
+key_f19				kf19	str	F9	KEY_F(19)	-	----E	F19 function key
+key_f20				kf20	str	FA	KEY_F(20)	-	----E	F20 function key
+key_f21				kf21	str	FB	KEY_F(21)	-	----E	F21 function key
+key_f22				kf22	str	FC	KEY_F(22)	-	----E	F22 function key
+key_f23				kf23	str	FD	KEY_F(23)	-	----E	F23 function key
+key_f24				kf24	str	FE	KEY_F(24)	-	----E	F24 function key
+key_f25				kf25	str	FF	KEY_F(25)	-	----E	F25 function key
+key_f26				kf26	str	FG	KEY_F(26)	-	----E	F26 function key
+key_f27				kf27	str	FH	KEY_F(27)	-	----E	F27 function key
+key_f28				kf28	str	FI	KEY_F(28)	-	----E	F28 function key
+key_f29				kf29	str	FJ	KEY_F(29)	-	----E	F29 function key
+key_f30				kf30	str	FK	KEY_F(30)	-	----E	F30 function key
+key_f31				kf31	str	FL	KEY_F(31)	-	----E	F31 function key
+key_f32				kf32	str	FM	KEY_F(32)	-	----E	F32 function key
+key_f33				kf33	str	FN	KEY_F(33)	-	----E	F33 function key
+key_f34				kf34	str	FO	KEY_F(34)	-	----E	F34 function key
+key_f35				kf35	str	FP	KEY_F(35)	-	----E	F35 function key
+key_f36				kf36	str	FQ	KEY_F(36)	-	----E	F36 function key
+key_f37				kf37	str	FR	KEY_F(37)	-	----E	F37 function key
+key_f38				kf38	str	FS	KEY_F(38)	-	----E	F38 function key
+key_f39				kf39	str	FT	KEY_F(39)	-	----E	F39 function key
+key_f40				kf40	str	FU	KEY_F(40)	-	----E	F40 function key
+key_f41				kf41	str	FV	KEY_F(41)	-	----E	F41 function key
+key_f42				kf42	str	FW	KEY_F(42)	-	----E	F42 function key
+key_f43				kf43	str	FX	KEY_F(43)	-	----E	F43 function key
+key_f44				kf44	str	FY	KEY_F(44)	-	----E	F44 function key
+key_f45				kf45	str	FZ	KEY_F(45)	-	----E	F45 function key
+key_f46				kf46	str	Fa	KEY_F(46)	-	----E	F46 function key
+key_f47				kf47	str	Fb	KEY_F(47)	-	----E	F47 function key
+key_f48				kf48	str	Fc	KEY_F(48)	-	----E	F48 function key
+key_f49				kf49	str	Fd	KEY_F(49)	-	----E	F49 function key
+key_f50				kf50	str	Fe	KEY_F(50)	-	----E	F50 function key
+key_f51				kf51	str	Ff	KEY_F(51)	-	----E	F51 function key
+key_f52				kf52	str	Fg	KEY_F(52)	-	----E	F52 function key
+key_f53				kf53	str	Fh	KEY_F(53)	-	----E	F53 function key
+key_f54				kf54	str	Fi	KEY_F(54)	-	----E	F54 function key
+key_f55				kf55	str	Fj	KEY_F(55)	-	----E	F55 function key
+key_f56				kf56	str	Fk	KEY_F(56)	-	----E	F56 function key
+key_f57				kf57	str	Fl	KEY_F(57)	-	----E	F57 function key
+key_f58				kf58	str	Fm	KEY_F(58)	-	----E	F58 function key
+key_f59				kf59	str	Fn	KEY_F(59)	-	----E	F59 function key
+key_f60				kf60	str	Fo	KEY_F(60)	-	----E	F60 function key
+key_f61				kf61	str	Fp	KEY_F(61)	-	----E	F61 function key
+key_f62				kf62	str	Fq	KEY_F(62)	-	----E	F62 function key
+key_f63				kf63	str	Fr	KEY_F(63)	-	----E	F63 function key
+# end of strings in HPUX 9
+char_padding			rmp	str	rP	-		-	-----	like ip but when in insert mode
+acs_chars			acsc	str	ac	-		-	-----	graphics charset pairs, based on vt100
+key_btab			kcbt	str	kB	KEY_BTAB	0541	-----	back-tab key
+enter_xon_mode			smxon	str	SX	-		-	-----	turn on xon/xoff handshaking
+exit_xon_mode			rmxon	str	RX	-		-	-----	turn off xon/xoff handshaking
+enter_am_mode			smam	str	SA	-		-	-----	turn on automatic margins
+exit_am_mode			rmam	str	RA	-		-	-----	turn off automatic margins
+xon_character			xonc	str	XN	-		-	-----	XON character
+xoff_character			xoffc	str	XF	-		-	-----	XOFF character
+ena_acs				enacs	str	eA	-		-	-----	enable alternate char set
+key_beg				kbeg	str	@1	KEY_BEG		0542	-----	begin key
+key_cancel			kcan	str	@2	KEY_CANCEL	0543	-----	cancel key
+key_close			kclo	str	@3	KEY_CLOSE	0544	-----	close key
+key_command			kcmd	str	@4	KEY_COMMAND	0545	-----	command key
+key_copy			kcpy	str	@5	KEY_COPY	0546	-----	copy key
+key_create			kcrt	str	@6	KEY_CREATE	0547	-----	create key
+key_end				kend	str	@7	KEY_END		0550	-----	end key
+key_enter			kent	str	@8	KEY_ENTER	0527	-----	enter/send key
+key_exit			kext	str	@9	KEY_EXIT	0551	-----	exit key
+key_find			kfnd	str	@0	KEY_FIND	0552	-----	find key
+key_help			khlp	str	%1	KEY_HELP	0553	-----	help key
+key_mark			kmrk	str	%2	KEY_MARK	0554	-----	mark key
+key_message			kmsg	str	%3	KEY_MESSAGE	0555	-----	message key
+key_move			kmov	str	%4	KEY_MOVE	0556	-----	move key
+key_next			knxt	str	%5	KEY_NEXT	0557	-----	next key
+key_open			kopn	str	%6	KEY_OPEN	0560	-----	open key
+key_options			kopt	str	%7	KEY_OPTIONS	0561	-----	options key
+key_previous			kprv	str	%8	KEY_PREVIOUS	0562	-----	previous key
+key_print			kprt	str	%9	KEY_PRINT	0532	-----	print key
+key_redo			krdo	str	%0	KEY_REDO	0563	-----	redo key
+key_reference			kref	str	&1	KEY_REFERENCE	0564	-----	reference key
+key_refresh			krfr	str	&2	KEY_REFRESH	0565	-----	refresh key
+key_replace			krpl	str	&3	KEY_REPLACE	0566	-----	replace key
+key_restart			krst	str	&4	KEY_RESTART	0567	-----	restart key
+key_resume			kres	str	&5	KEY_RESUME	0570	-----	resume key
+key_save			ksav	str	&6	KEY_SAVE	0571	-----	save key
+key_suspend			kspd	str	&7	KEY_SUSPEND	0627	-----	suspend key
+key_undo			kund	str	&8	KEY_UNDO	0630	-----	undo key
+key_sbeg			kBEG	str	&9	KEY_SBEG	0572	-----	shifted begin key
+key_scancel			kCAN	str	&0	KEY_SCANCEL	0573	-----	shifted cancel key
+key_scommand			kCMD	str	*1	KEY_SCOMMAND	0574	-----	shifted command key
+key_scopy			kCPY	str	*2	KEY_SCOPY	0575	-----	shifted copy key
+key_screate			kCRT	str	*3	KEY_SCREATE	0576	-----	shifted create key
+key_sdc				kDC	str	*4	KEY_SDC		0577	-----	shifted delete-character key
+key_sdl				kDL	str	*5	KEY_SDL		0600	-----	shifted delete-line key
+key_select			kslt	str	*6	KEY_SELECT	0601	-----	select key
+key_send			kEND	str	*7	KEY_SEND	0602	-----	shifted end key
+key_seol			kEOL	str	*8	KEY_SEOL	0603	-----	shifted clear-to-end-of-line key
+key_sexit			kEXT	str	*9	KEY_SEXIT	0604	-----	shifted exit key
+key_sfind			kFND	str	*0	KEY_SFIND	0605	-----	shifted find key
+key_shelp			kHLP	str	#1	KEY_SHELP	0606	-----	shifted help key
+key_shome			kHOM	str	#2	KEY_SHOME	0607	-----	shifted home key
+key_sic				kIC	str	#3	KEY_SIC		0610	-----	shifted insert-character key
+key_sleft			kLFT	str	#4	KEY_SLEFT	0611	-----	shifted left-arrow key
+key_smessage			kMSG	str	%a	KEY_SMESSAGE	0612	-----	shifted message key
+key_smove			kMOV	str	%b	KEY_SMOVE	0613	-----	shifted move key
+key_snext			kNXT	str	%c	KEY_SNEXT	0614	-----	shifted next key
+key_soptions			kOPT	str	%d	KEY_SOPTIONS	0615	-----	shifted options key
+key_sprevious			kPRV	str	%e	KEY_SPREVIOUS	0616	-----	shifted previous key
+key_sprint			kPRT	str	%f	KEY_SPRINT	0617	-----	shifted print key
+key_sredo			kRDO	str	%g	KEY_SREDO	0620	-----	shifted redo key
+key_sreplace			kRPL	str	%h	KEY_SREPLACE	0621	-----	shifted replace key
+key_sright			kRIT	str	%i	KEY_SRIGHT	0622	-----	shifted right-arrow key
+key_srsume			kRES	str	%j	KEY_SRSUME	0623	-----	shifted resume key
+key_ssave			kSAV	str	!1	KEY_SSAVE	0624	-----	shifted save key
+key_ssuspend			kSPD	str	!2	KEY_SSUSPEND	0625	-----	shifted suspend key
+key_sundo			kUND	str	!3	KEY_SUNDO	0626	-----	shifted undo key
+req_for_input			rfi	str	RF	-		-	-----	send next input char (for ptys)
+clr_bol				el1	str	cb	-		-	-----	Clear to beginning of line
+clear_margins			mgc	str	MC	-		-	-----	clear right and left soft margins
+set_left_margin			smgl	str	ML	-		-	-----	set left soft margin at current column.	 (ML is not in BSD termcap).
+set_right_margin		smgr	str	MR	-		-	-----	set right soft margin at current column
+label_format			fln	str	Lf	-		-	-----	label format
+set_clock			sclk	str	SC	-		-	-----	set clock, #1 hrs #2 mins #3 secs
+display_clock			dclk	str	DK	-		-	-----	display clock
+remove_clock			rmclk	str	RC	-		-	-----	remove clock
+create_window			cwin	str	CW	-		-	-----	define a window #1 from #2,#3 to #4,#5
+goto_window			wingo	str	WG	-		-	-----	go to window #1
+hangup				hup	str	HU	-		-	-----	hang-up phone
+dial_phone			dial	str	DI	-		-	-----	dial number #1
+quick_dial			qdial	str	QD	-		-	-----	dial number #1 without checking
+tone				tone	str	TO	-		-	-----	select touch tone dialing
+pulse				pulse	str	PU	-		-	-----	select pulse dialing
+flash_hook			hook	str	fh	-		-	-----	flash switch hook
+fixed_pause			pause	str	PA	-		-	-----	pause for 2-3 seconds
+wait_tone			wait	str	WA	-		-	-----	wait for dial-tone
+user0				u0	str	u0	-		-	-----	User string #0
+user1				u1	str	u1	-		-	-----	User string #1
+user2				u2	str	u2	-		-	-----	User string #2
+user3				u3	str	u3	-		-	-----	User string #3
+user4				u4	str	u4	-		-	-----	User string #4
+user5				u5	str	u5	-		-	-----	User string #5
+user6				u6	str	u6	-		-	-----	User string #6
+user7				u7	str	u7	-		-	-----	User string #7
+user8				u8	str	u8	-		-	-----	User string #8
+user9				u9	str	u9	-		-	-----	User string #9
+#
+# SVr4 added these capabilities to support color
+#
+orig_pair			op	str	op	-		-	-----	Set default pair to its original value
+orig_colors			oc	str	oc	-		-	-----	Set all color pairs to the original ones
+initialize_color		initc	str	Ic	-		-	-----	initialize color #1 to (#2,#3,#4)
+initialize_pair			initp	str	Ip	-		-	-----	Initialize color pair #1 to fg=(#2,#3,#4), bg=(#5,#6,#7)
+set_color_pair			scp	str	sp	-		-	-----	Set current color pair to #1
+set_foreground			setf	str	Sf	-		-	-----	Set foreground color #1
+set_background			setb	str	Sb	-		-	-----	Set background color #1
+#
+# SVr4 added these capabilities to support printers
+#
+change_char_pitch		cpi	str	ZA	-		-	-----	Change number of characters per inch to #1
+change_line_pitch		lpi	str	ZB	-		-	-----	Change number of lines per inch to #1
+change_res_horz			chr	str	ZC	-		-	-----	Change horizontal resolution to #1
+change_res_vert			cvr	str	ZD	-		-	-----	Change vertical resolution to #1
+define_char			defc	str	ZE	-		-	-----	Define a character #1, #2 dots wide, descender #3
+enter_doublewide_mode		swidm	str	ZF	-		-	-----	Enter double-wide mode
+enter_draft_quality		sdrfq	str	ZG	-		-	-----	Enter draft-quality mode
+enter_italics_mode		sitm	str	ZH	-		-	-----	Enter italic mode
+enter_leftward_mode		slm	str	ZI	-		-	-----	Start leftward carriage motion
+enter_micro_mode		smicm	str	ZJ	-		-	-----	Start micro-motion mode
+enter_near_letter_quality	snlq	str	ZK	-		-	-----	Enter NLQ mode
+enter_normal_quality		snrmq	str	ZL	-		-	-----	Enter normal-quality mode
+enter_shadow_mode		sshm	str	ZM	-		-	-----	Enter shadow-print mode
+enter_subscript_mode		ssubm	str	ZN	-		-	-----	Enter subscript mode
+enter_superscript_mode		ssupm	str	ZO	-		-	-----	Enter superscript mode
+enter_upward_mode		sum	str	ZP	-		-	-----	Start upward carriage motion
+exit_doublewide_mode		rwidm	str	ZQ	-		-	-----	End double-wide mode
+exit_italics_mode		ritm	str	ZR	-		-	-----	End italic mode
+exit_leftward_mode		rlm	str	ZS	-		-	-----	End left-motion mode
+exit_micro_mode			rmicm	str	ZT	-		-	-----	End micro-motion mode
+exit_shadow_mode		rshm	str	ZU	-		-	-----	End shadow-print mode
+exit_subscript_mode		rsubm	str	ZV	-		-	-----	End subscript mode
+exit_superscript_mode		rsupm	str	ZW	-		-	-----	End superscript mode
+exit_upward_mode		rum	str	ZX	-		-	-----	End reverse character motion
+micro_column_address		mhpa	str	ZY	-		-	-----	Like column_address in micro mode
+micro_down			mcud1	str	ZZ	-		-	-----	Like cursor_down in micro mode
+micro_left			mcub1	str	Za	-		-	-----	Like cursor_left in micro mode
+micro_right			mcuf1	str	Zb	-		-	-----	Like cursor_right in micro mode
+micro_row_address		mvpa	str	Zc	-		-	-----	Like row_address #1 in micro mode
+micro_up			mcuu1	str	Zd	-		-	-----	Like cursor_up in micro mode
+order_of_pins			porder	str	Ze	-		-	-----	Match software bits to print-head pins
+parm_down_micro			mcud	str	Zf	-		-	-----	Like parm_down_cursor in micro mode
+parm_left_micro			mcub	str	Zg	-		-	-----	Like parm_left_cursor in micro mode
+parm_right_micro		mcuf	str	Zh	-		-	-----	Like parm_right_cursor in micro mode
+parm_up_micro			mcuu	str	Zi	-		-	-----	Like parm_up_cursor in micro mode
+select_char_set			scs	str	Zj	-		-	-----	Select character set, #1
+set_bottom_margin		smgb	str	Zk	-		-	-----	Set bottom margin at current line
+set_bottom_margin_parm		smgbp	str	Zl	-		-	-----	Set bottom margin at line #1 or (if smgtp is not given) #2 lines from bottom
+set_left_margin_parm		smglp	str	Zm	-		-	-----	Set left (right) margin at column #1
+set_right_margin_parm		smgrp	str	Zn	-		-	-----	Set right margin at column #1
+set_top_margin			smgt	str	Zo	-		-	-----	Set top margin at current line
+set_top_margin_parm		smgtp	str	Zp	-		-	-----	Set top (bottom) margin at row #1
+start_bit_image			sbim	str	Zq	-		-	-----	Start printing bit image graphics
+start_char_set_def		scsd	str	Zr	-		-	-----	Start character set definition #1, with #2 characters in the set
+stop_bit_image			rbim	str	Zs	-		-	-----	Stop printing bit image graphics
+stop_char_set_def		rcsd	str	Zt	-		-	-----	End definition of character set #1
+subscript_characters		subcs	str	Zu	-		-	-----	List of subscriptable characters
+superscript_characters		supcs	str	Zv	-		-	-----	List of superscriptable characters
+these_cause_cr			docr	str	Zw	-		-	-----	Printing any of these characters causes CR
+zero_motion			zerom	str	Zx	-		-	-----	No motion for subsequent character
+#%.TE
+#%.ad
+#%
+#%The following string capabilities are present in the SVr4.0 term structure,
+#%but were originally not documented in the man page.
+#%
+#%.na
+#%.TS H
+#%center expand;
+#%c l l c
+#%c l l c
+#%lw25 lw6 lw2 lw18.
+#%\fBVariable	Cap-	TCap	Description\fR
+#%\fBString	name	Code\fR
+char_set_names			csnm	str	Zy	-		-	-----	Produce #1'th item from list of character set names
+key_mouse			kmous	str	Km	KEY_MOUSE	0631	-----	Mouse event has occurred
+mouse_info			minfo	str	Mi	-		-	-----	Mouse status information
+req_mouse_pos			reqmp	str	RQ	-		-	-----	Request mouse position
+get_mouse			getm	str	Gm	-		-	-----	Curses should get button events, parameter #1 not documented.
+set_a_foreground		setaf	str	AF	-		-	-----	Set foreground color to #1, using ANSI escape
+set_a_background		setab	str	AB	-		-	-----	Set background color to #1, using ANSI escape
+pkey_plab			pfxl	str	xl	-		-	-----	Program function key #1 to type string #2 and show string #3
+device_type			devt	str	dv	-		-	-----	Indicate language/codeset support
+code_set_init			csin	str	ci	-		-	-----	Init sequence for multiple codesets
+set0_des_seq			s0ds	str	s0	-		-	-----	Shift to codeset 0 (EUC set 0, ASCII)
+set1_des_seq			s1ds	str	s1	-		-	-----	Shift to codeset 1
+set2_des_seq			s2ds	str	s2	-		-	-----	Shift to codeset 2
+set3_des_seq			s3ds	str	s3	-		-	-----	Shift to codeset 3
+set_lr_margin			smglr	str	ML	-		-	-----	Set both left and right margins to #1, #2.  (ML is not in BSD termcap).
+set_tb_margin			smgtb	str	MT	-		-	-----	Sets both top and bottom margins to #1, #2
+bit_image_repeat		birep	str	Xy	-		-	-----	Repeat bit image cell #1 #2 times
+bit_image_newline		binel	str	Zz	-		-	-----	Move to next row of the bit image
+bit_image_carriage_return	bicr	str	Yv	-		-	-----	Move to beginning of same row
+color_names			colornm	str	Yw	-		-	-----	Give name for color #1
+define_bit_image_region		defbi	str	Yx	-		-	-----	Define rectangular bit image region
+end_bit_image_region		endbi	str	Yy	-		-	-----	End a bit-image region
+set_color_band		setcolor	str	Yz	-		-	-----	Change to ribbon color #1
+set_page_length			slines	str	YZ	-		-	-----	Set page length to #1 lines
+#
+# SVr4 added these capabilities for direct PC-clone support
+#
+display_pc_char			dispc	str	S1	-		-	-----	Display PC character #1
+enter_pc_charset_mode		smpch	str	S2	-		-	-----	Enter PC character display mode
+exit_pc_charset_mode		rmpch	str	S3	-		-	-----	Exit PC character display mode
+enter_scancode_mode		smsc	str	S4	-		-	-----	Enter PC scancode mode
+exit_scancode_mode		rmsc	str	S5	-		-	-----	Exit PC scancode mode
+pc_term_options			pctrm	str	S6	-		-	-----	PC terminal options
+scancode_escape			scesc	str	S7	-		-	-----	Escape for scancode emulation
+alt_scancode_esc		scesa	str	S8	-		-	-----	Alternate escape for scancode emulation
+#%.TE
+#%.ad
+#%
+#%.in .8i
+#%The XSI Curses standard added these hardcopy capabilities.
+#%They were used in some post-4.1 versions of System V curses,
+#%e.g., Solaris 2.5 and IRIX 6.x.
+#%Except for \fBYI\fP, the \fBncurses\fR termcap names for them are invented.
+#%According to the XSI Curses standard, they have no termcap names.
+#%If your compiled terminfo entries use these,
+#%they may not be binary-compatible with System V terminfo
+#%entries after SVr4.1; beware!
+#%
+#%AIX and Solaris do not provide termcap names for these; HPUX does.
+#%
+#%.na
+#%.TS H
+#%center expand;
+#%c l l c
+#%c l l c
+#%lw25 lw6 lw2 lw20.
+#%\fBVariable	Cap-	TCap	Description\fR
+#%\fBString	name	Code\fR
+set_pglen_inch			slength	str	YI	-		-	-----	Set page length to #1 hundredth of an inch (some implementations use sL for termcap).
+enter_horizontal_hl_mode	ehhlm	str	Q1	-		-	-----	Enter horizontal highlight mode
+enter_left_hl_mode		elhlm	str	Q2	-		-	-----	Enter left highlight mode
+enter_low_hl_mode		elohlm	str	Q3	-		-	-----	Enter low highlight mode
+enter_right_hl_mode		erhlm	str	Q4	-		-	-----	Enter right highlight mode
+enter_top_hl_mode		ethlm	str	Q5	-		-	-----	Enter top highlight mode
+enter_vertical_hl_mode		evhlm	str	Q6	-		-	-----	Enter vertical highlight mode
+set_a_attributes		sgr1	str	Q7	-		-	-----	Define second set of video attributes #1-#6
+exit_horizontal_hl_mode 	rmhhlm	str	Q8	-		-	----K	Exit horizontal highlight mode
+exit_left_hl_mode 		rmlhlm	str	Q9	-		-	----K	Exit left highlight mode
+exit_low_hl_mode 		rmlohlm	str	Qa	-		-	----K	Exit low highlight mode
+exit_right_hl_mode 		rmrhlm	str	Qb	-		-	----K	Exit right highlight mode
+exit_top_hl_mode 		rmthlm	str	Qc	-		-	----K	Exit top highlight mode
+exit_vertical_hl_mode 		rmvhlm	str	Qd	-		-	----K	Exit vertical highlight mode
+#%.TE
+#%.ad
+#
+# The magic token below tells the tic compiler-generator code that all the caps
+# past it should be ignored (not written out) when dumping terminfo objects. It
+# also tells the man page table generator not to pass through following lines
+# This means we can have obsolete capabilities and pseudo-capabilities that are
+# recognized for termcap or terminfo compilation, but not output.
+#
+# %%-STOP-HERE-%%
+#
+# Don't move this casually!  In fact, don't move it at all unless you're
+# either doing it to add System V or XPG4 extensions, or have decided you
+# don't care about SVr4 binary compatibility.
+#
+#############################################################################
+#
+# TERMCAP EXTENSION CAPABILITIES
+#
+# The capabilities below are either obsolete or extensions on certain systems.
+# They are not used by SVR4 terminfo.  Some are used by captoinfo to translate
+# termcap sources; the rest are listed for completeness, and in case somebody
+# cares about them enough to hack in code that will translate them into
+# terminfo capabilities.
+#
+# The first part of the list is from Ross Ridge's `mytinfo' package
+# (comp.sources.unix, volume 26); the variable names and terminfo names (as
+# well as the termcap codes) match his list.
+#
+# This group of codes is not marked obsolete in 4.4BSD, but have no direct
+# terminfo equivalents.  The rs capability is specially translated to terminfo
+# r2, and vice versa, if an entry does not already have an r2.  Similarly,
+# i2 is translated to r3 if there is no r3 (because SV terminfo maps is to i2).
+# The ug capability is thrown away, but assumed to be whatever sg is if the
+# latter is nonzero and we're dumping in termcap format.
+#
+termcap_init2			OTi2	str	i2	-		-	YB---	secondary initialization string
+termcap_reset			OTrs	str	rs	-		-	YB-G-	terminal reset string
+magic_cookie_glitch_ul		OTug	num	ug	-		-	YBCGE	number of blanks left by ul
+#
+# Obsolete termcap capabilities.  Some are used for termcap translation.  The
+# code uses the 'OT' prefix we put on obsolete capabilities to suppress
+# printing them in terminfo source dumps of compiled entries.
+#
+backspaces_with_bs		OTbs	bool	bs	-		-	YBCGE	uses ^H to move left
+crt_no_scrolling		OTns	bool	ns	-		-	YBCG-	crt cannot scroll
+no_correctly_working_cr		OTnc	bool	nc	-		-	YBCG-	no way to go to start of line
+carriage_return_delay		OTdC	num	dC	-		-	YB-G-	pad needed for CR
+new_line_delay			OTdN	num	dN	-		-	YB-G-	pad needed for LF
+linefeed_if_not_lf		OTnl	str	nl	-		-	YBCGE	use to move down
+backspace_if_not_bs		OTbc	str	bc	-		-	YBCGE	move left, if not ^H
+#
+# GNU termcap library extensions.  The GNU termcap file distributed with
+# Emacs no longer uses these, but MT showed up in pre-9.0 versions of the
+# BSD termcap file.  The name clash with terminfo MT is resolved by type
+# info; MT is converted to km.
+#
+gnu_has_meta_key		OTMT	bool	MT	-		-	----E	has meta key
+# gnu_tab_width			OTtw	num	tw	-		-	----E	tab width in spaces
+#
+# GNU termcap *does* include the following extended capability,  Only the
+# now-obsolete Ann Arbor terminals used it.
+#
+# gnu_change_scroll_region	OTcS	str	cS	-		-	---GE	alternate set scrolling region
+#
+# The following comments describe capnames so ancient that I believe no
+# software uses them any longer.  Some of these have to go because they
+# clash with terminfo names in ways that cannot be resolved by type
+# information.
+#
+# These mytinfo codes are not used in the 4.4BSD curses code.  They are
+# marked obsolete in the 4.4BSD manual pages.
+#
+# There is one conflict with terminfo; ma is in both.  This conflict is
+# resolved by type information.
+#
+# The `ko' capability is translated by special code.  It should contain a
+# comma-separated list of capabilities for which there are corresponding keys.
+# The `kn' code is accepted but ignored.
+#
+# The `ma' capability was a 4.0BSD feature used by vi version 2.
+# It consists of pairs of characters corresponding to kl, kr, ku, kd, and kh.
+# Besides being obsolete, that interpretation conflicts with max_attributes.
+#
+# Here is a description of memory_lock_above and memory_unlock:
+# "You can 'freeze' data on the screen by turning on Memory Lock in a line of
+# text.  All lines above the cursor's current line become locked in place on
+# the screen.  Then enter data normally.  When the screen fills up, any
+# further data entered forces the first line of unfrozen line text to scroll
+# under the frozen data.  Lines scrolled off the screen are inserted into
+# memory immediately preceding the first frozen line." (from the HP 700/96
+# User's manual).  VT100/ANSI memory lock set is \E[>2h, reset is \E[>2l.
+#
+# Applications that use terminfo are supposed to behave as though xr is
+# always true.
+#
+linefeed_is_newline		OTNL	bool	NL	-		-	YB---	move down with \n
+# even_parity			OTEP	bool	EP	-		-	-B---	terminal requires even parity
+# odd_parity			OTOP	bool	OP	-		-	-B---	terminal requires odd parity
+# half_duplex			OTHD	bool	HD	-		-	-B---	terminal is half-duplex
+# lower_case_only		OTLC	bool	LC	-		-	-B---	terminal has only lower case
+# upper_case_only		OTUC	bool	UC	-		-	-B---	terminal has only upper case
+backspace_delay			OTdB	num	dB	-		-	YB-G-	padding required for ^H
+# form_feed_delay		OTdF	num	dF	-		-	-B-G-	padding required for ^L
+horizontal_tab_delay		OTdT	num	dT	-		-	YB-G-	padding required for ^I
+# vertical_tab_delay		OTdV	num	dV	-		-	-B---	padding required for ^V
+number_of_function_keys		OTkn	num	kn	-		-	-B-G-	count of function keys
+other_non_function_keys		OTko	str	ko	-		-	-B-G-	list of self-mapped keycaps
+arrow_key_map			OTma	str	ma	-		-	YBC--	map motion-keys for vi version 2
+# memory_lock_above		OTml	str	ml	-		-	-B---	lock visible screen memory above the current line
+# memory_unlock			OTmu	str	mu	-		-	-B---	unlock visible screen memory above the current line
+has_hardware_tabs		OTpt	bool	pt	-		-	YB---	has 8-char tabs invoked with ^I
+return_does_clr_eol		OTxr	bool	xr	-		-	YB---	return clears the line
+# tek_4025_insert_line		OTxx	bool	xx	-		-	-BC--	Tektronix 4025 insert-line glitch
+#
+# mytinfo described this as a termcap capability, but it is not listed in the
+# 4.4BSD man pages, and not found in the 4.4BSD termcap file.  The ncurses
+# package, like System V, behaves as though it is always true.
+#
+# rind_only_at_top		OTxq	bool	xq	-		-	-----	reverse index only works from top line
+#
+# University of Waterloo termcap extensions (as described in mytinfo).
+# The `xl' termcap file clashes with a terminfo name; this ambiguity cannot
+# be resolved by a type check.  The descriptions are guesses from what was
+# in the mytinfo tables.
+#
+# key_interrupt_char		OTki	str	ki	-		-	-----	string set by interrupt key (?)
+# key_kill_char			OTkk	str	kk	-		-	-----	string set by kill key (?)
+# key_suspend_char		OTkz	str	kz	-		-	-----	string set by suspend key (?)
+# initialization_messy		OTxc	bool	xc	-		-	-----	initialization leaves garbage on the screen (?)
+# ind_at_bottom_does_cr		OTxl	bool	xl	-		-	-----	index does a carriage return
+#
+# Nonstandard capabilities unique to Ross Ridge's `mytinfo' package.
+# SR clashes with a terminfo name; this ambiguity cannot be resolved by a type
+# check.
+#
+# scroll_left			OTsl1	str	Sl	-		-	-----	scroll screen leftward
+# scroll_right			OTsr1	str	Sr	-		-	-----	scroll screen rightward
+# parm_scroll_left		OTsl	str	SL	-		-	-----	scroll screen leftward #1 characters
+# parm_scroll_right		OTsr	str	SR	-		-	-----	scroll screen rightward #1 characters
+#
+# The mytinfo capabilities end here.
+#
+# XENIX extensions:
+#
+# Xenix defined its own set of forms-drawing capabilities:
+#
+# cap	IBM ASCII	description             ACS         	ASCII
+# ---	-----------	--------------------    -------------	------
+# G1	191 \277 M-?	single upper right   	ACS_URCORNER
+# G2	218 \332 M-Z	single upper left	ACS_ULCORNER
+# G3	192 \300 M-@	single lower left	ACS_LLCORNER
+# G4	217 \331 M-Y	single lower right	ACS_LRCORNER
+# G5	187 \273 M-;	double upper right
+# G6	201 \311 M-I	double upper left
+# G7	200 \310 M-H	double lower left
+# G8	188 \274 M-<	double lower right
+# GC	197 \305 M-E	single intersection	ACS_PLUS	_ _
+# GD	194 \302 M-B	single down-tick	ACS_TTEE	 |
+# GH	196 \304 M-D	single horizontal line	ACS_HLINE
+# GL	180 \264 M-4	single left tick	ACS_RTEE	-|
+# GR	195 \303 M-C	single right tick	ACS_LTEE	|-
+# GU	193 \301 M-A	single up tick		ACS_BTEE	_|_
+# GV	179 \263 M-3	single vertical line	ACS_VLINE
+# Gc	206 \316 M-N	double intersection
+# Gd	203 \313 M-K	double down tick
+# Gh	205 \315 M-M	double horizontal line
+# Gl	204 \204 M-L	double left tick
+# Gr	185 \271 M-9	double right tick
+# Gu	202 \312 M-J	double up tick
+# Gv	186 \272 M-:	double vertical line
+#
+# The compiler will translate the single-line caps and discard the others
+# (via IGNORE aliases further down).  We don't want to do normal pad
+# translation on these, they're often single-character printable ASCII
+# strings that happen to be numerics.  There's awk code in parametrized.sh
+# that detects the acs_ prefix and uses it to suppress pad translation.
+# These terminfo names are invented.
+#
+acs_ulcorner			OTG2	str	G2	-		-	-----	single upper left
+acs_llcorner			OTG3	str	G3	-		-	-----	single lower left
+acs_urcorner			OTG1	str	G1	-		-	-----	single upper right
+acs_lrcorner			OTG4	str	G4	-		-	-----	single lower right
+acs_ltee			OTGR	str	GR	-		-	-----	tee pointing right
+acs_rtee			OTGL	str	GL	-		-	-----	tee pointing left
+acs_btee			OTGU	str	GU	-		-	-----	tee pointing up
+acs_ttee			OTGD	str	GD	-		-	-----	tee pointing down
+acs_hline			OTGH	str	GH	-		-	-----	single horizontal line
+acs_vline			OTGV	str	GV	-		-	-----	single vertical line
+acs_plus			OTGC	str	GC	-		-	-----	single intersection
+#
+#############################################################################
+#
+# TERMINFO EXTENSION CAPABILITIES
+#
+# (see Caps-ncurses for the complete set of comments)
+#
+box_chars_1			box1	str	bx	-		-	----K	box characters primary set
+#
+#############################################################################
diff --git a/include/Caps.keys b/include/Caps.keys
new file mode 100644
index 0000000..09d7a47
--- /dev/null
+++ b/include/Caps.keys
@@ -0,0 +1,1062 @@
+##############################################################################
+# Copyright 2019-2020,2021 Thomas E. Dickey                                  #
+# Copyright 2001-2015,2016 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.                                                             #
+##############################################################################
+#
+# Author: Thomas Dickey
+#    and: Ilya Zakharevich
+#
+# $Id: Caps.keys,v 1.17 2021/10/08 07:55:48 tom Exp $
+#
+# This is an adaptation of ncurses' termcap/terminfo capability table, which
+# is illustrates an experimental extension to describe alt-, shift- and
+# control-modifiers applied to function and normal keys, as done on IBM pc's.
+#
+# This table is used to generate initializers for tables that drive tic,
+# infocmp, and the library compilation code used to support the termcap
+# compatibility hack.  It is also used to generate the tabular portion of the
+# terminfo(5) man page; lines beginning with `#%' are passed through to become
+# the terminfo table.
+#
+# This file has three major sections; a standard-capabilities table, two
+# extension-capability tables, and a section of aliases declarations.
+# The first two have the same format, as follows:
+#
+# FILE FORMAT
+#
+# Column 1: terminfo variable name
+# Column 2: terminfo capability name
+# Column 3: capability type (boolean, numeric, or string)
+# Column 4: termcap capability name
+# Column 5: KEY_xxx name, if any, `-' otherwise
+# Column 6: value for KEY_xxx name, if any, `-' otherwise
+# Column 7: Lead with `Y' if capability should be emitted in termcap
+#           translations, `-' otherwise
+# Column 8: capability description
+#
+# The codes following [Y-] in column 7 describe the versions of termcap which
+# use the given capability.  This information is not used by the curses library
+# proper; rather, it is there to help the terminfo maintainer avoid emitting
+# termcap entry translations that are more than 1023 bytes long (and tank a
+# lot of old termcap-using programs).  The codes read as follows:
+#	B = mentioned in the BSD man page for 4.4BSD curses
+#	C = used by the 4.4BSD curses library
+#	G = mentioned in the documentation for GNU termcap
+#	E = used by GNU Emacs
+#	K = remove this terminfo capability when translating to standard format
+# The important codes are C and E.  A cap with C or E should be preserved in
+# translation if possible.  The problem is that preserving all such caps may
+# lead to some termcap translations being too long.  The termcap maintainer
+# has a bit of a juggling act to do...potential problem cases are marked with
+# an asterisk (*).
+#
+# The aliases section has the following format:
+#
+# Column 1: either `capalias' or `infoalias'
+# Column 2: name to be aliased
+# Column 3: what name it should translate to.  The name IGNORE means it
+#           should be discarded with a warning message.
+# Column 4: name of the extension set (used for compiler warning messages)
+# Column 5: capability description (usually an associated terminfo variable)
+#
+# HANDLING TERMCAP AND TERMINFO EXTENSIONS
+#
+# There are basically five different ways to handle termcap and terminfo
+# extensions:
+#
+# 1. Don't list the capname here, or list it but comment it out (the latter
+# is preferable; someone might want to handle it in the future).  If you do
+# this, the capability will be treated as unknown and raise a warning from
+# the compiler.
+#
+# 2. Alias it.  This is appropriate if the capability has the same meaning
+# as an already-supported one.  The compiler will handle aliasing, emitting
+# an appropriate informational message whenever an alias fires.
+#
+# 3. List it in the standard table.  You almost certainly do *not* want
+# to do this -- the capabilities in that one, and their order, have been
+# carefully chosen to be SVr4-binary-compatible when they're written out
+# as a terminfo object, and breaking this would be bad.  It is up to the ncurses
+# library what to do with the terminfo data after it is read in.
+#
+# 4. List it in the aliases table with an IGNORE target field.  If you
+# do this, the capability will be ignored on input (though the user will
+# get a warning message about it).
+#
+# 5. List it in the extensions table. If you do this, the compiler will
+# silently accept the capability, but the curses library proper will never
+# see it (because it won't be written out as part of the terminfo object
+# format).  It is up to you what you have the compiler do with it.
+#
+# There are two opposite reasons to choose option 5.  One is when you want
+# to eat the capability silently and discard it when doing translations
+# to terminfo with tic -I.  Some very old obsolete BSD caps like :kn: are
+# in this class.  Nothing will ever use them again.
+#
+# More usually, you want the compiler to try to deduce something from the
+# capability value that it can use to translate it into your output format.
+# You'll need to write custom code, probably in postprocess_termcap() or
+# postprocess_terminfo(), to handle the translation.
+#
+# CONTROLLING ENTRY LENGTH
+#
+# Notes on specific elisions made to fit translations within 1023 bytes:
+#
+# Machines with IBM PC-like keyboards want to be able to define the following
+# keys: key_npage, key_ppage, key_home, key_ll (which is used for in termcap-
+# only environments for End or Home-Down), key_dc, and key_ic.  This is also
+# the set of keys the `joe' editor will be upset if it can't see.  So don't
+# trim those out of the set to be translated to termcap, or various users of
+# the termcap file will become irate.
+#
+# It might look tempting to leave those long init strings out of translations.
+# We can't do it (yet); 4.4BSD tput and tset use them.
+#
+# We retain the sgr capability in translation in spite of the fact that neither
+# 4.4BSD nor GNU Emacs uses it, because (a) some entry naming distinctions are
+# hard to understand without it, and (b) the entries in which it is long tend
+# to be older types that don't use up a lot of string space on function keys.
+# The tic(1) translation code will complain and elide it if it makes a critical
+# difference (there is special code in tic to recognize this situation).
+#
+# Yes, BSD tset(1) uses hpa.  We elide hpa/vpa anyway because the motion
+# optimizer in BSD curses didn't use them.  This omission seems to be the
+# single most effective one, it shortened the resolved length of all thirteen
+# problem entries in the 9.9.0 version of the terminfo master below critical.
+#
+# It would be nice to keep f11 and f12 for Emacs use, but a couple of termcap
+# translations go back over critical if we do this.  As 4.4BSD curses fades
+# into history and GNU termcap's application base shrinks towards being GNU
+# Emacs only, we'll probably elide out some BSD-only capabilities in order
+# to buy space for non-essentials Emacs is still using.  Capabilities high
+# on that hit list: rc, sc, uc.
+#
+#############################################################################
+#
+# STANDARD CAPABILITIES
+#
+#%The following is a complete table of the capabilities included in a
+#%terminfo description block and available to terminfo-using code.  In each
+#%line of the table,
+#%
+#%The \fBvariable\fR is the name by which the programmer (at the terminfo level)
+#%accesses the capability.
+#%
+#%The \fBcapname\fR is the short name used in the text of the database,
+#%and is used by a person updating the database.
+#%Whenever possible, capnames are chosen to be the same as or similar to
+#%the ANSI X3.64-1979 standard (now superseded by ECMA-48, which uses
+#%identical or very similar names).  Semantics are also intended to match
+#%those of the specification.
+#%
+#%The termcap code is the old
+#%.B termcap
+#%capability name (some capabilities are new, and have names which termcap
+#%did not originate).
+#%.P
+#%Capability names have no hard length limit, but an informal limit of 5
+#%characters has been adopted to keep them short and to allow the tabs in
+#%the source file
+#%.B Caps
+#%to line up nicely.
+#%
+#%Finally, the description field attempts to convey the semantics of the
+#%capability.  You may find some codes in the description field:
+#%.TP
+#%(P)
+#%indicates that padding may be specified
+#%.TP
+#%#[1-9]
+#%in the description field indicates that the string is passed
+#%through \fBtparm\fP(3X) with parameters as given (#\fIi\fP).
+#%.IP
+#%If no parameters are listed in the description,
+#%passing the string through \fBtparm\fP(3X) may give unexpected results,
+#%e.g., if it contains percent (%%) signs.
+#%.TP
+#%(P*)
+#%indicates that padding may vary in proportion to the number of
+#%lines affected
+#%.TP
+#%(#\d\fIi\fP\u)
+#%indicates the \fIi\fP\uth\d parameter.
+#%
+#%.PP
+#% These are the boolean capabilities:
+#%
+#%.na
+#%.TS H
+#%center expand;
+#%c l l c
+#%c l l c
+#%lw25 lw6 lw2 lw20.
+#%\fBVariable	Cap-	TCap	Description\fR
+#%\fBBooleans	name	Code\fR
+auto_left_margin		bw	bool	bw	-	-	YB-G-	cub1 wraps from column 0 to last column
+auto_right_margin		am	bool	am	-	-	YBCGE	terminal has automatic margins
+no_esc_ctlc			xsb	bool	xb	-	-	YBCG-	beehive (f1=escape, f2=ctrl C)
+ceol_standout_glitch		xhp	bool	xs	-	-	YBCGE	standout not erased by overwriting (hp)
+eat_newline_glitch		xenl	bool	xn	-	-	YBCGE	newline ignored after 80 cols (concept)
+erase_overstrike		eo	bool	eo	-	-	YBCG-	can erase overstrikes with a blank
+generic_type			gn	bool	gn	-	-	YB-G-	generic line type
+hard_copy			hc	bool	hc	-	-	YBCG-	hardcopy terminal
+has_meta_key			km	bool	km	-	-	YB-GE	Has a meta key (i.e., sets 8th-bit)
+has_status_line			hs	bool	hs	-	-	YB-G-	has extra status line
+insert_null_glitch		in	bool	in	-	-	YBCGE	insert mode distinguishes nulls
+memory_above			da	bool	da	-	-	YBCG-	display may be retained above the screen
+memory_below			db	bool	db	-	-	YB-GE	display may be retained below the screen
+move_insert_mode		mir	bool	mi	-	-	YBCGE	safe to move while in insert mode
+move_standout_mode		msgr	bool	ms	-	-	YBCGE	safe to move while in standout mode
+over_strike			os	bool	os	-	-	YBCG-	terminal can overstrike
+status_line_esc_ok		eslok	bool	es	-	-	YB-G-	escape can be used on the status line
+dest_tabs_magic_smso		xt	bool	xt	-	-	YBCGE	tabs destructive, magic so char (t1061)
+tilde_glitch			hz	bool	hz	-	-	YB-GE	cannot print ~'s (Hazeltine)
+transparent_underline		ul	bool	ul	-	-	YBCGE	underline character overstrikes
+xon_xoff			xon	bool	xo	-	-	YB---	terminal uses xon/xoff handshaking
+needs_xon_xoff			nxon	bool	nx	-	-	-----	padding will not work, xon/xoff required
+prtr_silent			mc5i	bool	5i	-	-	-----	printer will not echo on screen
+hard_cursor			chts	bool	HC	-	-	-----	cursor is hard to see
+non_rev_rmcup			nrrmc	bool	NR	-	-	-----	smcup does not reverse rmcup
+no_pad_char			npc	bool	NP	-	-	-----	pad character does not exist
+non_dest_scroll_region		ndscr	bool	ND	-	-	-----	scrolling region is non-destructive
+can_change			ccc	bool	cc	-	-	-----	terminal can re-define existing colors
+back_color_erase		bce	bool	ut	-	-	-----	screen erased with background color
+hue_lightness_saturation	hls	bool	hl	-	-	-----	terminal uses only HLS color notation (Tektronix)
+col_addr_glitch			xhpa	bool	YA	-	-	-----	only positive motion for hpa/mhpa caps
+cr_cancels_micro_mode		crxm	bool	YB	-	-	-----	using cr turns off micro mode
+has_print_wheel			daisy	bool	YC	-	-	-----	printer needs operator to change character set
+row_addr_glitch			xvpa	bool	YD	-	-	-----	only positive motion for vpa/mvpa caps
+semi_auto_right_margin		sam	bool	YE	-	-	-----	printing in last column causes cr
+cpi_changes_res			cpix	bool	YF	-	-	-----	changing character pitch changes resolution
+lpi_changes_res			lpix	bool	YG	-	-	-----	changing line pitch changes resolution
+#%.TE
+#%.ad
+#%
+#%These are the numeric capabilities:
+#%
+#%.na
+#%.TS H
+#%center expand;
+#%c l l c
+#%c l l c
+#%lw25 lw6 lw2 lw20.
+#%\fBVariable	Cap-	TCap	Description\fR
+#%\fBNumeric	name	Code\fR
+columns				cols	num	co	-	-	YBCGE	number of columns in a line
+init_tabs			it	num	it	-	-	YB-G-	tabs initially every # spaces
+lines				lines	num	li	-	-	YBCGE	number of lines on screen or page
+lines_of_memory			lm	num	lm	-	-	YB-G-	lines of memory if > line. 0 means varies
+magic_cookie_glitch		xmc	num	sg	-	-	YBCGE	number of blank characters left by smso or rmso
+padding_baud_rate		pb	num	pb	-	-	YB-GE	lowest baud rate where padding needed
+virtual_terminal		vt	num	vt	-	-	YB---	virtual terminal number (CB/unix)
+width_status_line		wsl	num	ws	-	-	YB-G-	number of columns in status line
+num_labels			nlab	num	Nl	-	-	-----	number of labels on screen
+label_height			lh	num	lh	-	-	-----	rows in each label
+label_width			lw	num	lw	-	-	-----	columns in each label
+max_attributes			ma	num	ma	-	-	YBC--	maximum combined attributes terminal can handle
+maximum_windows			wnum	num	MW	-	-	-----	maximum number of definable windows
+# These came in with SVr4's color support
+max_colors			colors	num	Co	-	-	-----	maximum number of colors on screen
+max_pairs			pairs	num	pa	-	-	-----	maximum number of color-pairs on the screen
+no_color_video			ncv	num	NC	-	-	-----	video attributes that cannot be used with colors
+#%.TE
+#%.ad
+#%
+#%The following numeric capabilities are present in the SVr4.0 term structure,
+#%but are not yet documented in the man page.  They came in with SVr4's
+#%printer support.
+#%
+#%.na
+#%.TS H
+#%center expand;
+#%c l l c
+#%c l l c
+#%lw25 lw6 lw2 lw20.
+#%\fBVariable	Cap-	TCap	Description\fR
+#%\fBNumeric	name	Code\fR
+buffer_capacity			bufsz	num	Ya	-	-	-----	numbers of bytes buffered before printing
+dot_vert_spacing		spinv	num	Yb	-	-	-----	spacing of pins vertically in pins per inch
+dot_horz_spacing		spinh	num	Yc	-	-	-----	spacing of dots horizontally in dots per inch
+max_micro_address		maddr	num	Yd	-	-	-----	maximum value in micro_..._address
+max_micro_jump			mjump	num	Ye	-	-	-----	maximum value in parm_..._micro
+micro_col_size			mcs	num	Yf	-	-	-----	character step size when in micro mode
+micro_line_size			mls	num	Yg	-	-	-----	line step size when in micro mode
+number_of_pins			npins	num	Yh	-	-	-----	numbers of pins in print-head
+output_res_char			orc	num	Yi	-	-	-----	horizontal resolution in units per line
+output_res_line			orl	num	Yj	-	-	-----	vertical resolution in units per line
+output_res_horz_inch		orhi	num	Yk	-	-	-----	horizontal resolution in units per inch
+output_res_vert_inch		orvi	num	Yl	-	-	-----	vertical resolution in units per inch
+print_rate			cps	num	Ym	-	-	-----	print rate in characters per second
+wide_char_size			widcs	num	Yn	-	-	-----	character step size when in double wide mode
+buttons				btns	num	BT	-	-	-----	number of buttons on mouse
+bit_image_entwining		bitwin	num	Yo	-	-	-----	number of passes for each bit-image row
+bit_image_type			bitype	num	Yp	-	-	-----	type of bit-image device
+#%.TE
+#%.ad
+#%
+#%These are the string capabilities:
+#%
+#%.na
+#%.TS H
+#%center expand;
+#%c l l c
+#%c l l c
+#%lw25 lw6 lw2 lw20.
+#%\fBVariable	Cap-	TCap	Description\fR
+#%\fBString	name	Code\fR
+back_tab			cbt	str	bt	-		-	YBCGE	back tab (P)
+bell				bel	str	bl	-		-	YB-GE	audible signal (bell) (P)
+carriage_return			cr	str	cr	-		-	YBCGE	carriage return (P*) (P*)
+change_scroll_region		csr	str	cs	-		-	YBCGE	change region to line #1 to line #2 (P)
+clear_all_tabs			tbc	str	ct	-		-	YB-G-	clear all tab stops (P)
+clear_screen			clear	str	cl	-		-	YBCGE	clear screen and home cursor (P*)
+clr_eol				el	str	ce	-		-	YBCGE	clear to end of line (P)
+clr_eos				ed	str	cd	-		-	YBCGE	clear to end of screen (P*)
+column_address			hpa	str	ch	-		-	-B-GE*	horizontal position #1, absolute (P)
+command_character		cmdch	str	CC	-		-	YB-G-	terminal settable cmd character in prototype !?
+cursor_address			cup	str	cm	-		-	YBCGE	move to row #1 columns #2
+cursor_down			cud1	str	do	-		-	YBCGE	down one line
+cursor_home			home	str	ho	-		-	YBCGE	home cursor (if no cup)
+cursor_invisible		civis	str	vi	-		-	YB-G-	make cursor invisible
+cursor_left			cub1	str	le	-		-	YBCGE	move left one space
+cursor_mem_address		mrcup	str	CM	-		-	YB-G-	memory relative cursor addressing, move to row #1 columns #2
+cursor_normal			cnorm	str	ve	-		-	YBCGE	make cursor appear normal (undo civis/cvvis)
+cursor_right			cuf1	str	nd	-		-	YBCGE	non-destructive space (move right one space)
+cursor_to_ll			ll	str	ll	-		-	YBCGE	last line, first column (if no cup)
+cursor_up			cuu1	str	up	-		-	YBCGE	up one line
+cursor_visible			cvvis	str	vs	-		-	YBCGE	make cursor very visible
+delete_character		dch1	str	dc	-		-	YBCGE	delete character (P*)
+delete_line			dl1	str	dl	-		-	YBCGE	delete line (P*)
+dis_status_line			dsl	str	ds	-		-	YB-G-	disable status line
+down_half_line			hd	str	hd	-		-	YB-G-	half a line down
+enter_alt_charset_mode		smacs	str	as	-		-	YB-G-	start alternate character set (P)
+enter_blink_mode		blink	str	mb	-		-	YB-G-	turn on blinking
+enter_bold_mode			bold	str	md	-		-	YB-G-	turn on bold (extra bright) mode
+enter_ca_mode			smcup	str	ti	-		-	YBCGE	string to start programs using cup
+enter_delete_mode		smdc	str	dm	-		-	YBCGE	enter delete mode
+enter_dim_mode			dim	str	mh	-		-	YB-G-	turn on half-bright mode
+enter_insert_mode		smir	str	im	-		-	YBCGE	enter insert mode
+enter_secure_mode		invis	str	mk	-		-	-B-G-*	turn on blank mode (characters invisible)
+enter_protected_mode		prot	str	mp	-		-	-B-G-*	turn on protected mode
+enter_reverse_mode		rev	str	mr	-		-	YB-G-	turn on reverse video mode
+enter_standout_mode		smso	str	so	-		-	YBCGE	begin standout mode
+enter_underline_mode		smul	str	us	-		-	YBCGE	begin underline mode
+erase_chars			ech	str	ec	-		-	YB-G-	erase #1 characters (P)
+exit_alt_charset_mode		rmacs	str	ae	-		-	YB-G-	end alternate character set (P)
+exit_attribute_mode		sgr0	str	me	-		-	YB-GE	turn off all attributes
+exit_ca_mode			rmcup	str	te	-		-	YBCGE	strings to end programs using cup
+exit_delete_mode		rmdc	str	ed	-		-	YBCGE	end delete mode
+exit_insert_mode		rmir	str	ei	-		-	YBCGE	exit insert mode
+exit_standout_mode		rmso	str	se	-		-	YBCGE	exit standout mode
+exit_underline_mode		rmul	str	ue	-		-	YBCGE	exit underline mode
+flash_screen			flash	str	vb	-		-	YBCGE	visible bell (may not move cursor)
+form_feed			ff	str	ff	-		-	YB-G-	hardcopy terminal page eject (P*)
+from_status_line		fsl	str	fs	-		-	YB-G-	return from status line
+init_1string			is1	str	i1	-		-	YB-G-	initialization string
+init_2string			is2	str	is	-		-	YB-G-	initialization string
+init_3string			is3	str	i3	-		-	YB-G-	initialization string
+init_file			if	str	if	-		-	YB-G-	name of initialization file
+insert_character		ich1	str	ic	-		-	YBCGE	insert character (P)
+insert_line			il1	str	al	-		-	YBCGE	insert line (P*)
+insert_padding			ip	str	ip	-		-	YBCGE	insert padding after inserted character
+key_backspace			kbs	str	kb	KEY_BACKSPACE	0407	YB-G-	backspace key
+key_catab			ktbc	str	ka	KEY_CATAB	0526	-B-G-*	clear-all-tabs key
+key_clear			kclr	str	kC	KEY_CLEAR	0515	-B-G-*	clear-screen or erase key
+key_ctab			kctab	str	kt	KEY_CTAB	0525	-B-G-*	clear-tab key
+key_dc				kdch1	str	kD	KEY_DC		0512	YB-G-	delete-character key
+key_dl				kdl1	str	kL	KEY_DL		0510	-B-G-*	delete-line key
+key_down			kcud1	str	kd	KEY_DOWN	0402	YBCGE	down-arrow key
+key_eic				krmir	str	kM	KEY_EIC		0514	-B-G-*	sent by rmir or smir in insert mode
+key_eol				kel	str	kE	KEY_EOL		0517	-B-G-*	clear-to-end-of-line key
+key_eos				ked	str	kS	KEY_EOS		0516	-B-G-*	clear-to-end-of-screen key
+key_f0				kf0	str	k0	KEY_F(0)	0410	YBCGE	F0 function key
+key_f1				kf1	str	k1	KEY_F(1)	-	YBCGE	F1 function key
+key_f10				kf10	str	k;	KEY_F(10)	-	----E	F10 function key
+key_f2				kf2	str	k2	KEY_F(2)	-	YBCGE	F2 function key
+key_f3				kf3	str	k3	KEY_F(3)	-	YBCGE	F3 function key
+key_f4				kf4	str	k4	KEY_F(4)	-	YBCGE	F4 function key
+key_f5				kf5	str	k5	KEY_F(5)	-	YBCGE	F5 function key
+key_f6				kf6	str	k6	KEY_F(6)	-	YBCGE	F6 function key
+key_f7				kf7	str	k7	KEY_F(7)	-	YBCGE	F7 function key
+key_f8				kf8	str	k8	KEY_F(8)	-	YBCGE	F8 function key
+key_f9				kf9	str	k9	KEY_F(9)	-	YBCGE	F9 function key
+key_home			khome	str	kh	KEY_HOME	0406	YBCGE	home key
+key_ic				kich1	str	kI	KEY_IC		0513	YB-GE	insert-character key
+key_il				kil1	str	kA	KEY_IL		0511	-B-G-*	insert-line key
+key_left			kcub1	str	kl	KEY_LEFT	0404	YBCGE	left-arrow key
+key_ll				kll	str	kH	KEY_LL		0533	YB-G-	lower-left key (home down)
+key_npage			knp	str	kN	KEY_NPAGE	0522	YB-GE	next-page key
+key_ppage			kpp	str	kP	KEY_PPAGE	0523	YB-GE	previous-page key
+key_right			kcuf1	str	kr	KEY_RIGHT	0405	YBCGE	right-arrow key
+key_sf				kind	str	kF	KEY_SF		0520	-B-G-*	scroll-forward key
+key_sr				kri	str	kR	KEY_SR		0521	-B-G-*	scroll-backward key
+key_stab			khts	str	kT	KEY_STAB	0524	-B-G-*	set-tab key
+key_up				kcuu1	str	ku	KEY_UP		0403	YBCGE	up-arrow key
+keypad_local			rmkx	str	ke	-		-	YBCGE	leave 'keyboard_transmit' mode
+keypad_xmit			smkx	str	ks	-		-	YBCGE	enter 'keyboard_transmit' mode
+lab_f0				lf0	str	l0	-		-	-B-G-*	label on function key f0 if not f0
+lab_f1				lf1	str	l1	-		-	-B-G-*	label on function key f1 if not f1
+lab_f10				lf10	str	la	-		-	-----	label on function key f10 if not f10
+lab_f2				lf2	str	l2	-		-	-B-G-*	label on function key f2 if not f2
+lab_f3				lf3	str	l3	-		-	-B-G-*	label on function key f3 if not f3
+lab_f4				lf4	str	l4	-		-	-B-G-*	label on function key f4 if not f4
+lab_f5				lf5	str	l5	-		-	-B-G-*	label on function key f5 if not f5
+lab_f6				lf6	str	l6	-		-	-B-G-*	label on function key f6 if not f6
+lab_f7				lf7	str	l7	-		-	-B-G-*	label on function key f7 if not f7
+lab_f8				lf8	str	l8	-		-	-B-G-*	label on function key f8 if not f8
+lab_f9				lf9	str	l9	-		-	-B-G-*	label on function key f9 if not f9
+meta_off			rmm	str	mo	-		-	YB-G-*	turn off meta mode
+meta_on				smm	str	mm	-		-	YB-G-*	turn on meta mode (8th-bit on)
+newline				nel	str	nw	-		-	YB-G-*	newline (behave like cr followed by lf)
+pad_char			pad	str	pc	-		-	YBCGE	padding char (instead of null)
+parm_dch			dch	str	DC	-		-	YB-GE	delete #1 characters (P*)
+parm_delete_line		dl	str	DL	-		-	YBCGE	delete #1 lines (P*)
+parm_down_cursor		cud	str	DO	-		-	YBCGE	down #1 lines (P*)
+parm_ich			ich	str	IC	-		-	YB-GE	insert #1 characters (P*)
+parm_index			indn	str	SF	-		-	YBCG-	scroll forward #1 lines (P)
+parm_insert_line		il	str	AL	-		-	YBCGE	insert #1 lines (P*)
+parm_left_cursor		cub	str	LE	-		-	YBCGE	move #1 characters to the left (P)
+parm_right_cursor		cuf	str	RI	-		-	YBCGE	move #1 characters to the right (P*)
+parm_rindex			rin	str	SR	-		-	YBCG-	scroll back #1 lines (P)
+parm_up_cursor			cuu	str	UP	-		-	YBCGE	up #1 lines (P*)
+pkey_key			pfkey	str	pk	-		-	-B---	program function key #1 to type string #2
+pkey_local			pfloc	str	pl	-		-	-B---	program function key #1 to execute string #2
+pkey_xmit			pfx	str	px	-		-	-B---	program function key #1 to transmit string #2
+print_screen			mc0	str	ps	-		-	-B-G-*	print contents of screen
+prtr_off			mc4	str	pf	-		-	-B-G-*	turn off printer
+prtr_on				mc5	str	po	-		-	-B-G-*	turn on printer
+repeat_char			rep	str	rp	-		-	YB-GE	repeat char #1 #2 times (P*)
+reset_1string			rs1	str	r1	-		-	-B---	reset string
+reset_2string			rs2	str	r2	-		-	-B---	reset string
+reset_3string			rs3	str	r3	-		-	-B---	reset string
+reset_file			rf	str	rf	-		-	-B---	name of reset file
+restore_cursor			rc	str	rc	-		-	YBCG-	restore cursor to position of last save_cursor
+row_address			vpa	str	cv	-		-	-B-GE*	vertical position #1 absolute (P)
+save_cursor			sc	str	sc	-		-	YBCG-	save current cursor position (P)
+scroll_forward			ind	str	sf	-		-	YBCGE	scroll text up (P)
+scroll_reverse			ri	str	sr	-		-	YBCGE	scroll text down (P)
+set_attributes			sgr	str	sa	-		-	YB-G-	define video attributes #1-#9 (PG9)
+set_tab				hts	str	st	-		-	YB-G-	set a tab in every row, current columns
+set_window			wind	str	wi	-		-	-B-GE	current window is lines #1-#2 cols #3-#4
+tab				ht	str	ta	-		-	YBCGE	tab to next 8-space hardware tab stop
+to_status_line			tsl	str	ts	-		-	YB-G-	move to status line, column #1
+underline_char			uc	str	uc	-		-	YBCG-	underline char and move past it
+up_half_line			hu	str	hu	-		-	YB-G-	half a line up
+init_prog			iprog	str	iP	-		-	-B---	path name of program for initialization
+key_a1				ka1	str	K1	KEY_A1		0534	YB-GE	upper left of keypad
+key_a3				ka3	str	K3	KEY_A3		0535	YB-GE	upper right of keypad
+key_b2				kb2	str	K2	KEY_B2		0536	YB-GE	center of keypad
+key_c1				kc1	str	K4	KEY_C1		0537	YB-GE	lower left of keypad
+key_c3				kc3	str	K5	KEY_C3		0540	YB-GE	lower right of keypad
+prtr_non			mc5p	str	pO	-		-	-B-G-*	turn on printer for #1 bytes
+#
+# SVr1 capabilities stop here.	IBM's version of terminfo is the same as
+# SVr4 up to this point, but has a different set afterwards.
+#
+char_padding			rmp	str	rP	-		-	-----	like ip but when in insert mode
+acs_chars			acsc	str	ac	-		-	-----	graphics charset pairs, based on vt100
+plab_norm			pln	str	pn	-		-	-----	program label #1 to show string #2
+key_btab			kcbt	str	kB	KEY_BTAB	0541	-----	back-tab key
+enter_xon_mode			smxon	str	SX	-		-	-----	turn on xon/xoff handshaking
+exit_xon_mode			rmxon	str	RX	-		-	-----	turn off xon/xoff handshaking
+enter_am_mode			smam	str	SA	-		-	-----	turn on automatic margins
+exit_am_mode			rmam	str	RA	-		-	-----	turn off automatic margins
+xon_character			xonc	str	XN	-		-	-----	XON character
+xoff_character			xoffc	str	XF	-		-	-----	XOFF character
+ena_acs				enacs	str	eA	-		-	-----	enable alternate char set
+label_on			smln	str	LO	-		-	-----	turn on soft labels
+label_off			rmln	str	LF	-		-	-----	turn off soft labels
+key_beg				kbeg	str	@1	KEY_BEG		0542	-----	begin key
+key_cancel			kcan	str	@2	KEY_CANCEL	0543	-----	cancel key
+key_close			kclo	str	@3	KEY_CLOSE	0544	-----	close key
+key_command			kcmd	str	@4	KEY_COMMAND	0545	-----	command key
+key_copy			kcpy	str	@5	KEY_COPY	0546	-----	copy key
+key_create			kcrt	str	@6	KEY_CREATE	0547	-----	create key
+key_end				kend	str	@7	KEY_END		0550	-----	end key
+key_enter			kent	str	@8	KEY_ENTER	0527	-----	enter/send key
+key_exit			kext	str	@9	KEY_EXIT	0551	-----	exit key
+key_find			kfnd	str	@0	KEY_FIND	0552	-----	find key
+key_help			khlp	str	%1	KEY_HELP	0553	-----	help key
+key_mark			kmrk	str	%2	KEY_MARK	0554	-----	mark key
+key_message			kmsg	str	%3	KEY_MESSAGE	0555	-----	message key
+key_move			kmov	str	%4	KEY_MOVE	0556	-----	move key
+key_next			knxt	str	%5	KEY_NEXT	0557	-----	next key
+key_open			kopn	str	%6	KEY_OPEN	0560	-----	open key
+key_options			kopt	str	%7	KEY_OPTIONS	0561	-----	options key
+key_previous			kprv	str	%8	KEY_PREVIOUS	0562	-----	previous key
+key_print			kprt	str	%9	KEY_PRINT	0532	-----	print key
+key_redo			krdo	str	%0	KEY_REDO	0563	-----	redo key
+key_reference			kref	str	&1	KEY_REFERENCE	0564	-----	reference key
+key_refresh			krfr	str	&2	KEY_REFRESH	0565	-----	refresh key
+key_replace			krpl	str	&3	KEY_REPLACE	0566	-----	replace key
+key_restart			krst	str	&4	KEY_RESTART	0567	-----	restart key
+key_resume			kres	str	&5	KEY_RESUME	0570	-----	resume key
+key_save			ksav	str	&6	KEY_SAVE	0571	-----	save key
+key_suspend			kspd	str	&7	KEY_SUSPEND	0627	-----	suspend key
+key_undo			kund	str	&8	KEY_UNDO	0630	-----	undo key
+key_sbeg			kBEG	str	&9	KEY_SBEG	0572	-----	shifted begin key
+key_scancel			kCAN	str	&0	KEY_SCANCEL	0573	-----	shifted cancel key
+key_scommand			kCMD	str	*1	KEY_SCOMMAND	0574	-----	shifted command key
+key_scopy			kCPY	str	*2	KEY_SCOPY	0575	-----	shifted copy key
+key_screate			kCRT	str	*3	KEY_SCREATE	0576	-----	shifted create key
+key_sdc				kDC	str	*4	KEY_SDC		0577	-----	shifted delete-character key
+key_sdl				kDL	str	*5	KEY_SDL		0600	-----	shifted delete-line key
+key_select			kslt	str	*6	KEY_SELECT	0601	-----	select key
+key_send			kEND	str	*7	KEY_SEND	0602	-----	shifted end key
+key_seol			kEOL	str	*8	KEY_SEOL	0603	-----	shifted clear-to-end-of-line key
+key_sexit			kEXT	str	*9	KEY_SEXIT	0604	-----	shifted exit key
+key_sfind			kFND	str	*0	KEY_SFIND	0605	-----	shifted find key
+key_shelp			kHLP	str	#1	KEY_SHELP	0606	-----	shifted help key
+key_shome			kHOM	str	#2	KEY_SHOME	0607	-----	shifted home key
+key_sic				kIC	str	#3	KEY_SIC		0610	-----	shifted insert-character key
+key_sleft			kLFT	str	#4	KEY_SLEFT	0611	-----	shifted left-arrow key
+key_smessage			kMSG	str	%a	KEY_SMESSAGE	0612	-----	shifted message key
+key_smove			kMOV	str	%b	KEY_SMOVE	0613	-----	shifted move key
+key_snext			kNXT	str	%c	KEY_SNEXT	0614	-----	shifted next key
+key_soptions			kOPT	str	%d	KEY_SOPTIONS	0615	-----	shifted options key
+key_sprevious			kPRV	str	%e	KEY_SPREVIOUS	0616	-----	shifted previous key
+key_sprint			kPRT	str	%f	KEY_SPRINT	0617	-----	shifted print key
+key_sredo			kRDO	str	%g	KEY_SREDO	0620	-----	shifted redo key
+key_sreplace			kRPL	str	%h	KEY_SREPLACE	0621	-----	shifted replace key
+key_sright			kRIT	str	%i	KEY_SRIGHT	0622	-----	shifted right-arrow key
+key_srsume			kRES	str	%j	KEY_SRSUME	0623	-----	shifted resume key
+key_ssave			kSAV	str	!1	KEY_SSAVE	0624	-----	shifted save key
+key_ssuspend			kSPD	str	!2	KEY_SSUSPEND	0625	-----	shifted suspend key
+key_sundo			kUND	str	!3	KEY_SUNDO	0626	-----	shifted undo key
+req_for_input			rfi	str	RF	-		-	-----	send next input char (for ptys)
+key_f11				kf11	str	F1	KEY_F(11)	-	----E	F11 function key
+key_f12				kf12	str	F2	KEY_F(12)	-	----E	F12 function key
+key_f13				kf13	str	F3	KEY_F(13)	-	----E	F13 function key
+key_f14				kf14	str	F4	KEY_F(14)	-	----E	F14 function key
+key_f15				kf15	str	F5	KEY_F(15)	-	----E	F15 function key
+key_f16				kf16	str	F6	KEY_F(16)	-	----E	F16 function key
+key_f17				kf17	str	F7	KEY_F(17)	-	----E	F17 function key
+key_f18				kf18	str	F8	KEY_F(18)	-	----E	F18 function key
+key_f19				kf19	str	F9	KEY_F(19)	-	----E	F19 function key
+key_f20				kf20	str	FA	KEY_F(20)	-	----E	F20 function key
+key_f21				kf21	str	FB	KEY_F(21)	-	----E	F21 function key
+key_f22				kf22	str	FC	KEY_F(22)	-	----E	F22 function key
+key_f23				kf23	str	FD	KEY_F(23)	-	----E	F23 function key
+key_f24				kf24	str	FE	KEY_F(24)	-	----E	F24 function key
+key_f25				kf25	str	FF	KEY_F(25)	-	----E	F25 function key
+key_f26				kf26	str	FG	KEY_F(26)	-	----E	F26 function key
+key_f27				kf27	str	FH	KEY_F(27)	-	----E	F27 function key
+key_f28				kf28	str	FI	KEY_F(28)	-	----E	F28 function key
+key_f29				kf29	str	FJ	KEY_F(29)	-	----E	F29 function key
+key_f30				kf30	str	FK	KEY_F(30)	-	----E	F30 function key
+key_f31				kf31	str	FL	KEY_F(31)	-	----E	F31 function key
+key_f32				kf32	str	FM	KEY_F(32)	-	----E	F32 function key
+key_f33				kf33	str	FN	KEY_F(33)	-	----E	F33 function key
+key_f34				kf34	str	FO	KEY_F(34)	-	----E	F34 function key
+key_f35				kf35	str	FP	KEY_F(35)	-	----E	F35 function key
+key_f36				kf36	str	FQ	KEY_F(36)	-	----E	F36 function key
+key_f37				kf37	str	FR	KEY_F(37)	-	----E	F37 function key
+key_f38				kf38	str	FS	KEY_F(38)	-	----E	F38 function key
+key_f39				kf39	str	FT	KEY_F(39)	-	----E	F39 function key
+key_f40				kf40	str	FU	KEY_F(40)	-	----E	F40 function key
+key_f41				kf41	str	FV	KEY_F(41)	-	----E	F41 function key
+key_f42				kf42	str	FW	KEY_F(42)	-	----E	F42 function key
+key_f43				kf43	str	FX	KEY_F(43)	-	----E	F43 function key
+key_f44				kf44	str	FY	KEY_F(44)	-	----E	F44 function key
+key_f45				kf45	str	FZ	KEY_F(45)	-	----E	F45 function key
+key_f46				kf46	str	Fa	KEY_F(46)	-	----E	F46 function key
+key_f47				kf47	str	Fb	KEY_F(47)	-	----E	F47 function key
+key_f48				kf48	str	Fc	KEY_F(48)	-	----E	F48 function key
+key_f49				kf49	str	Fd	KEY_F(49)	-	----E	F49 function key
+key_f50				kf50	str	Fe	KEY_F(50)	-	----E	F50 function key
+key_f51				kf51	str	Ff	KEY_F(51)	-	----E	F51 function key
+key_f52				kf52	str	Fg	KEY_F(52)	-	----E	F52 function key
+key_f53				kf53	str	Fh	KEY_F(53)	-	----E	F53 function key
+key_f54				kf54	str	Fi	KEY_F(54)	-	----E	F54 function key
+key_f55				kf55	str	Fj	KEY_F(55)	-	----E	F55 function key
+key_f56				kf56	str	Fk	KEY_F(56)	-	----E	F56 function key
+key_f57				kf57	str	Fl	KEY_F(57)	-	----E	F57 function key
+key_f58				kf58	str	Fm	KEY_F(58)	-	----E	F58 function key
+key_f59				kf59	str	Fn	KEY_F(59)	-	----E	F59 function key
+key_f60				kf60	str	Fo	KEY_F(60)	-	----E	F60 function key
+key_f61				kf61	str	Fp	KEY_F(61)	-	----E	F61 function key
+key_f62				kf62	str	Fq	KEY_F(62)	-	----E	F62 function key
+key_f63				kf63	str	Fr	KEY_F(63)	-	----E	F63 function key
+clr_bol				el1	str	cb	-		-	-----	Clear to beginning of line
+clear_margins			mgc	str	MC	-		-	-----	clear right and left soft margins
+set_left_margin			smgl	str	ML	-		-	-----	set left soft margin at current column.	 (ML is not in BSD termcap).
+set_right_margin		smgr	str	MR	-		-	-----	set right soft margin at current column
+label_format			fln	str	Lf	-		-	-----	label format
+set_clock			sclk	str	SC	-		-	-----	set clock, #1 hrs #2 mins #3 secs
+display_clock			dclk	str	DK	-		-	-----	display clock
+remove_clock			rmclk	str	RC	-		-	-----	remove clock
+create_window			cwin	str	CW	-		-	-----	define a window #1 from #2,#3 to #4,#5
+goto_window			wingo	str	WG	-		-	-----	go to window #1
+hangup				hup	str	HU	-		-	-----	hang-up phone
+dial_phone			dial	str	DI	-		-	-----	dial number #1
+quick_dial			qdial	str	QD	-		-	-----	dial number #1 without checking
+tone				tone	str	TO	-		-	-----	select touch tone dialing
+pulse				pulse	str	PU	-		-	-----	select pulse dialing
+flash_hook			hook	str	fh	-		-	-----	flash switch hook
+fixed_pause			pause	str	PA	-		-	-----	pause for 2-3 seconds
+wait_tone			wait	str	WA	-		-	-----	wait for dial-tone
+user0				u0	str	u0	-		-	-----	User string #0
+user1				u1	str	u1	-		-	-----	User string #1
+user2				u2	str	u2	-		-	-----	User string #2
+user3				u3	str	u3	-		-	-----	User string #3
+user4				u4	str	u4	-		-	-----	User string #4
+user5				u5	str	u5	-		-	-----	User string #5
+user6				u6	str	u6	-		-	-----	User string #6
+user7				u7	str	u7	-		-	-----	User string #7
+user8				u8	str	u8	-		-	-----	User string #8
+user9				u9	str	u9	-		-	-----	User string #9
+#
+# NCurses extensions for keys accessible on most PC consoles
+#
+key_sup				kUP	str	!5	KEY_SUP		+	-----	shifted up-arrow key
+key_sdown			kDOWN	str	!6	KEY_SDOWN	+	-----	shifted down-arrow key
+key_sbackspace			kBS	str	!7	KEY_SBACKSPACE	+	-----	shifted backspace key
+key_c_delete			kcdelete str	!8	KEY_C_DELETE	+	-----	control- delete-character key
+key_c_end			kcend	str	!9	KEY_C_END	+	-----	control- end key
+key_c_home			kchom	str	!0	KEY_C_HOME	+	-----	control- home key
+key_c_insert			kcinsert str	!_	KEY_C_INSERT	+	-----	control- insert-character key
+key_c_left			kclft	str	%k	KEY_C_LEFT	+	-----	control- left-arrow key
+key_c_next			kcnxt	str	%l	KEY_C_NEXT	+	-----	control- next key
+key_c_previous			kcprv	str	%m	KEY_C_PREVIOUS	+	-----	control- previous key
+key_c_print			kcprt	str	%n	KEY_C_PRINT	+	-----	control- print key
+key_c_right			kcrit	str	%o	KEY_C_RIGHT	+	-----	control- right-arrow key
+key_c_backspace			kcbs	str	%p	KEY_C_BACKSPACE	+	-----	control- backspace key
+key_c_up			kcup	str	%q	KEY_C_UP	+	-----	control- up-arrow key
+key_c_down			kcdown	str	%r	KEY_C_DOWN	+	-----	control- down-arrow key
+key_a_delete			kadelete str	%s	KEY_A_DELETE	+	-----	alt- delete-character key
+key_a_end			kaend	str	%t	KEY_A_END	+	-----	alt- end key
+key_a_home			kahom	str	%u	KEY_A_HOME	+	-----	alt- home key
+key_a_insert			kainsert str	%v	KEY_A_INSERT	+	-----	alt- insert-character key
+key_a_left			kalft	str	%w	KEY_A_LEFT	+	-----	alt- left-arrow key
+key_a_next			kanxt	str	%x	KEY_A_NEXT	+	-----	alt- next key
+key_a_previous			kaprv	str	%y	KEY_A_PREVIOUS	+	-----	alt- previous key
+key_a_print			kaprt	str	%z	KEY_A_PRINT	+	-----	alt- print key
+key_a_right			karit	str	%!	KEY_A_RIGHT	+	-----	alt- right-arrow key
+key_a_backspace			kabs	str	%@	KEY_A_BACKSPACE	+	-----	alt- backspace key
+key_a_up			kaup	str	%#	KEY_A_UP	+	-----	alt- up-arrow key
+key_a_down			kadown	str	%$	KEY_A_DOWN	+	-----	alt- down-arrow key
+key_a_a				kaa	str	$a	KEY_A_A		+	-----	alt- a key
+key_a_b				kab	str	$b	KEY_A_B		+	-----	alt- b key
+key_a_c				kac	str	$c	KEY_A_C		+	-----	alt- c key
+key_a_d				kad	str	$d	KEY_A_D		+	-----	alt- d key
+key_a_e				kae	str	$e	KEY_A_E		+	-----	alt- e key
+key_a_f				kaf	str	$f	KEY_A_F		+	-----	alt- f key
+key_a_g				kag	str	$g	KEY_A_G		+	-----	alt- g key
+key_a_h				kah	str	$h	KEY_A_H		+	-----	alt- h key
+key_a_i				kai	str	$i	KEY_A_I		+	-----	alt- i key
+key_a_j				kaj	str	$j	KEY_A_J		+	-----	alt- j key
+key_a_k				kak	str	$k	KEY_A_K		+	-----	alt- k key
+key_a_l				kal	str	$l	KEY_A_L		+	-----	alt- l key
+key_a_m				kam	str	$m	KEY_A_M		+	-----	alt- m key
+key_a_n				kan	str	$n	KEY_A_N		+	-----	alt- n key
+key_a_o				kao	str	$o	KEY_A_O		+	-----	alt- o key
+key_a_p				kap	str	$p	KEY_A_P		+	-----	alt- p key
+key_a_q				kaq	str	$q	KEY_A_Q		+	-----	alt- q key
+key_a_r				kar	str	$r	KEY_A_R		+	-----	alt- r key
+key_a_s				kas	str	$s	KEY_A_S		+	-----	alt- s key
+key_a_t				kat	str	$t	KEY_A_T		+	-----	alt- t key
+key_a_u				kau	str	$u	KEY_A_U		+	-----	alt- u key
+key_a_v				kav	str	$v	KEY_A_V		+	-----	alt- v key
+key_a_w				kaw	str	$w	KEY_A_W		+	-----	alt- w key
+key_a_x				kax	str	$x	KEY_A_X		+	-----	alt- x key
+key_a_y				kay	str	$y	KEY_A_Y		+	-----	alt- y key
+key_a_z				kaz	str	$z	KEY_A_Z		+	-----	alt- z key
+key_a_0				ka_0	str	$0	KEY_A_0		+	-----	alt- 0 key
+key_a_1				ka_1	str	$1	KEY_A_1		+	-----	alt- 1 key
+key_a_2				ka_2	str	$2	KEY_A_2		+	-----	alt- 2 key
+key_a_3				ka_3	str	$3	KEY_A_3		+	-----	alt- 3 key
+key_a_4				ka_4	str	$4	KEY_A_4		+	-----	alt- 4 key
+key_a_5				ka_5	str	$5	KEY_A_5		+	-----	alt- 5 key
+key_a_6				ka_6	str	$6	KEY_A_6		+	-----	alt- 6 key
+key_a_7				ka_7	str	$7	KEY_A_7		+	-----	alt- 7 key
+key_a_8				ka_8	str	$8	KEY_A_8		+	-----	alt- 8 key
+key_a_9				ka_9	str	$9	KEY_A_9		+	-----	alt- 9 key
+key_a_backtick			ka_bt	str	$`	KEY_A_BACKTICK	+	-----	alt- ` key
+key_a_under			ka_und	str	$_	KEY_A_UNDER	+	-----	alt- _ key
+key_a_equals			ka_eq	str	$=	KEY_A_EQUALS	+	-----	alt- = key
+key_a_bar			ka_bsl	str	$|	KEY_A_BAR	+	-----	alt- | key
+key_a_lbracker			ka_lbr	str	$[	KEY_A_LBRACKER	+	-----	alt- [ key
+key_a_rbracker			ka_rbr	str	$]	KEY_A_RBRACKER	+	-----	alt- ] key
+key_a_semi			ka_semi str	$;	KEY_A_SEMI	+	-----	alt- ; key
+key_a_tick			ka_tick str	$'	KEY_A_TICK	+	-----	alt- ' key
+key_a_comma			ka_com	str	$,	KEY_A_COMMA	+	-----	alt- , key
+key_a_dot			ka_dot	str	$.	KEY_A_DOT	+	-----	alt- . key
+key_a_question			ka_sla	str	$?	KEY_A_QUESTION	+	-----	alt- ? key
+key_a_divide			ka_div	str	$/	KEY_A_DIVIDE	+	-----	alt- keypad / key
+key_a_multiply			ka_mul	str	$*	KEY_A_MULTIPLY	+	-----	alt- keypad * key
+key_a_add			ka_add	str	$+	KEY_A_ADD	+	-----	alt- keypad + key
+key_a_subtract			ka_sub	str	$-	KEY_A_SUBTRACT	+	-----	alt- keypad - key
+key_a_kenter			ka_kent str	$<	KEY_A_KENTER	+	-----	alt- keypad enter key
+key_a_enter			ka_ent	str	$>	KEY_A_ENTER	+	-----	alt- enter key
+key_c_at			kcat	str	%%	KEY_C_AT	+	-----	control- @ key
+key_c_divide			kcdiv	str	%/	KEY_C_DIVIDE	+	-----	control- keypad / key
+key_c_multiply			kcmul	str	%*	KEY_C_MULTIPLY	+	-----	control- keypad * key
+key_c_add			kcadd	str	%+	KEY_C_ADD	+	-----	control- keypad + key
+key_c_subtract			kcsub	str	%-	KEY_C_SUBTRACT	+	-----	control- keypad - key
+#
+# SVr4 added these capabilities to support color
+#
+orig_pair			op	str	op	-		-	-----	Set default pair to its original value
+orig_colors			oc	str	oc	-		-	-----	Set all color pairs to the original ones
+initialize_color		initc	str	Ic	-		-	-----	initialize color #1 to (#2,#3,#4)
+initialize_pair			initp	str	Ip	-		-	-----	Initialize color pair #1 to fg=(#2,#3,#4), bg=(#5,#6,#7)
+set_color_pair			scp	str	sp	-		-	-----	Set current color pair to #1
+set_foreground			setf	str	Sf	-		-	-----	Set foreground color #1
+set_background			setb	str	Sb	-		-	-----	Set background color #1
+#
+# SVr4 added these capabilities to support printers
+#
+change_char_pitch		cpi	str	ZA	-		-	-----	Change number of characters per inch to #1
+change_line_pitch		lpi	str	ZB	-		-	-----	Change number of lines per inch to #1
+change_res_horz			chr	str	ZC	-		-	-----	Change horizontal resolution to #1
+change_res_vert			cvr	str	ZD	-		-	-----	Change vertical resolution to #1
+define_char			defc	str	ZE	-		-	-----	Define a character #1, #2 dots wide, descender #3
+enter_doublewide_mode		swidm	str	ZF	-		-	-----	Enter double-wide mode
+enter_draft_quality		sdrfq	str	ZG	-		-	-----	Enter draft-quality mode
+enter_italics_mode		sitm	str	ZH	-		-	-----	Enter italic mode
+enter_leftward_mode		slm	str	ZI	-		-	-----	Start leftward carriage motion
+enter_micro_mode		smicm	str	ZJ	-		-	-----	Start micro-motion mode
+enter_near_letter_quality	snlq	str	ZK	-		-	-----	Enter NLQ mode
+enter_normal_quality		snrmq	str	ZL	-		-	-----	Enter normal-quality mode
+enter_shadow_mode		sshm	str	ZM	-		-	-----	Enter shadow-print mode
+enter_subscript_mode		ssubm	str	ZN	-		-	-----	Enter subscript mode
+enter_superscript_mode		ssupm	str	ZO	-		-	-----	Enter superscript mode
+enter_upward_mode		sum	str	ZP	-		-	-----	Start upward carriage motion
+exit_doublewide_mode		rwidm	str	ZQ	-		-	-----	End double-wide mode
+exit_italics_mode		ritm	str	ZR	-		-	-----	End italic mode
+exit_leftward_mode		rlm	str	ZS	-		-	-----	End left-motion mode
+exit_micro_mode			rmicm	str	ZT	-		-	-----	End micro-motion mode
+exit_shadow_mode		rshm	str	ZU	-		-	-----	End shadow-print mode
+exit_subscript_mode		rsubm	str	ZV	-		-	-----	End subscript mode
+exit_superscript_mode		rsupm	str	ZW	-		-	-----	End superscript mode
+exit_upward_mode		rum	str	ZX	-		-	-----	End reverse character motion
+micro_column_address		mhpa	str	ZY	-		-	-----	Like column_address in micro mode
+micro_down			mcud1	str	ZZ	-		-	-----	Like cursor_down in micro mode
+micro_left			mcub1	str	Za	-		-	-----	Like cursor_left in micro mode
+micro_right			mcuf1	str	Zb	-		-	-----	Like cursor_right in micro mode
+micro_row_address		mvpa	str	Zc	-		-	-----	Like row_address #1 in micro mode
+micro_up			mcuu1	str	Zd	-		-	-----	Like cursor_up in micro mode
+order_of_pins			porder	str	Ze	-		-	-----	Match software bits to print-head pins
+parm_down_micro			mcud	str	Zf	-		-	-----	Like parm_down_cursor in micro mode
+parm_left_micro			mcub	str	Zg	-		-	-----	Like parm_left_cursor in micro mode
+parm_right_micro		mcuf	str	Zh	-		-	-----	Like parm_right_cursor in micro mode
+parm_up_micro			mcuu	str	Zi	-		-	-----	Like parm_up_cursor in micro mode
+select_char_set			scs	str	Zj	-		-	-----	Select character set, #1
+set_bottom_margin		smgb	str	Zk	-		-	-----	Set bottom margin at current line
+set_bottom_margin_parm		smgbp	str	Zl	-		-	-----	Set bottom margin at line #1 or (if smgtp is not given) #2 lines from bottom
+set_left_margin_parm		smglp	str	Zm	-		-	-----	Set left (right) margin at column #1
+set_right_margin_parm		smgrp	str	Zn	-		-	-----	Set right margin at column #1
+set_top_margin			smgt	str	Zo	-		-	-----	Set top margin at current line
+set_top_margin_parm		smgtp	str	Zp	-		-	-----	Set top (bottom) margin at row #1
+start_bit_image			sbim	str	Zq	-		-	-----	Start printing bit image graphics
+start_char_set_def		scsd	str	Zr	-		-	-----	Start character set definition #1, with #2 characters in the set
+stop_bit_image			rbim	str	Zs	-		-	-----	Stop printing bit image graphics
+stop_char_set_def		rcsd	str	Zt	-		-	-----	End definition of character set #1
+subscript_characters		subcs	str	Zu	-		-	-----	List of subscriptable characters
+superscript_characters		supcs	str	Zv	-		-	-----	List of superscriptable characters
+these_cause_cr			docr	str	Zw	-		-	-----	Printing any of these characters causes CR
+zero_motion			zerom	str	Zx	-		-	-----	No motion for subsequent character
+#%.TE
+#%.ad
+#%
+#%The following string capabilities are present in the SVr4.0 term structure,
+#%but were originally not documented in the man page.
+#%
+#%.na
+#%.TS H
+#%center expand;
+#%c l l c
+#%c l l c
+#%lw25 lw6 lw2 lw18.
+#%\fBVariable	Cap-	TCap	Description\fR
+#%\fBString	name	Code\fR
+char_set_names			csnm	str	Zy	-		-	-----	Produce #1'th item from list of character set names
+key_mouse			kmous	str	Km	KEY_MOUSE	0631	-----	Mouse event has occurred
+mouse_info			minfo	str	Mi	-		-	-----	Mouse status information
+req_mouse_pos			reqmp	str	RQ	-		-	-----	Request mouse position
+get_mouse			getm	str	Gm	-		-	-----	Curses should get button events, parameter #1 not documented.
+set_a_foreground		setaf	str	AF	-		-	-----	Set foreground color to #1, using ANSI escape
+set_a_background		setab	str	AB	-		-	-----	Set background color to #1, using ANSI escape
+pkey_plab			pfxl	str	xl	-		-	-----	Program function key #1 to type string #2 and show string #3
+device_type			devt	str	dv	-		-	-----	Indicate language/codeset support
+code_set_init			csin	str	ci	-		-	-----	Init sequence for multiple codesets
+set0_des_seq			s0ds	str	s0	-		-	-----	Shift to codeset 0 (EUC set 0, ASCII)
+set1_des_seq			s1ds	str	s1	-		-	-----	Shift to codeset 1
+set2_des_seq			s2ds	str	s2	-		-	-----	Shift to codeset 2
+set3_des_seq			s3ds	str	s3	-		-	-----	Shift to codeset 3
+set_lr_margin			smglr	str	ML	-		-	-----	Set both left and right margins to #1, #2.  (ML is not in BSD termcap).
+set_tb_margin			smgtb	str	MT	-		-	-----	Sets both top and bottom margins to #1, #2
+bit_image_repeat		birep	str	Xy	-		-	-----	Repeat bit image cell #1 #2 times
+bit_image_newline		binel	str	Zz	-		-	-----	Move to next row of the bit image
+bit_image_carriage_return	bicr	str	Yv	-		-	-----	Move to beginning of same row
+color_names			colornm	str	Yw	-		-	-----	Give name for color #1
+define_bit_image_region		defbi	str	Yx	-		-	-----	Define rectangular bit image region
+end_bit_image_region		endbi	str	Yy	-		-	-----	End a bit-image region
+set_color_band		setcolor	str	Yz	-		-	-----	Change to ribbon color #1
+set_page_length			slines	str	YZ	-		-	-----	Set page length to #1 lines
+#
+# SVr4 added these capabilities for direct PC-clone support
+#
+display_pc_char			dispc	str	S1	-		-	-----	Display PC character #1
+enter_pc_charset_mode		smpch	str	S2	-		-	-----	Enter PC character display mode
+exit_pc_charset_mode		rmpch	str	S3	-		-	-----	Exit PC character display mode
+enter_scancode_mode		smsc	str	S4	-		-	-----	Enter PC scancode mode
+exit_scancode_mode		rmsc	str	S5	-		-	-----	Exit PC scancode mode
+pc_term_options			pctrm	str	S6	-		-	-----	PC terminal options
+scancode_escape			scesc	str	S7	-		-	-----	Escape for scancode emulation
+alt_scancode_esc		scesa	str	S8	-		-	-----	Alternate escape for scancode emulation
+#%.TE
+#%.ad
+#%
+#%.in .8i
+#%The XSI Curses standard added these hardcopy capabilities.
+#%They were used in some post-4.1 versions of System V curses,
+#%e.g., Solaris 2.5 and IRIX 6.x.
+#%Except for \fBYI\fP, the \fBncurses\fR termcap names for them are invented.
+#%According to the XSI Curses standard, they have no termcap names.
+#%If your compiled terminfo entries use these,
+#%they may not be binary-compatible with System V terminfo
+#%entries after SVr4.1; beware!
+#%
+#%.na
+#%.TS H
+#%center expand;
+#%c l l c
+#%c l l c
+#%lw25 lw6 lw2 lw20.
+#%\fBVariable	Cap-	TCap	Description\fR
+#%\fBString	name	Code\fR
+enter_horizontal_hl_mode	ehhlm	str	Xh	-		-	-----	Enter horizontal highlight mode
+enter_left_hl_mode		elhlm	str	Xl	-		-	-----	Enter left highlight mode
+enter_low_hl_mode		elohlm	str	Xo	-		-	-----	Enter low highlight mode
+enter_right_hl_mode		erhlm	str	Xr	-		-	-----	Enter right highlight mode
+enter_top_hl_mode		ethlm	str	Xt	-		-	-----	Enter top highlight mode
+enter_vertical_hl_mode		evhlm	str	Xv	-		-	-----	Enter vertical highlight mode
+set_a_attributes		sgr1	str	sA	-		-	-----	Define second set of video attributes #1-#6
+set_pglen_inch			slength	str	YI	-		-	-----	Set page length to #1 hundredth of an inch (some implementations use sL for termcap).
+#%.TE
+#%.ad
+#
+# The magic token below tells the tic compiler-generator code that all the caps
+# past it should be ignored (not written out) when dumping terminfo objects. It
+# also tells the man page table generator not to pass through following lines
+# This means we can have obsolete capabilities and pseudo-capabilities that are
+# recognized for termcap or terminfo compilation, but not output.
+#
+# %%-STOP-HERE-%%
+#
+# Don't move this casually!  In fact, don't move it at all unless you're
+# either doing it to add System V or XPG4 extensions, or have decided you
+# don't care about SVr4 binary compatibility.
+#
+#############################################################################
+#
+# TERMCAP EXTENSION CAPABILITIES
+#
+# The capabilities below are either obsolete or extensions on certain systems.
+# They are not used by SVR4 terminfo.  Some are used by captoinfo to translate
+# termcap sources; the rest are listed for completeness, and in case somebody
+# cares about them enough to hack in code that will translate them into
+# terminfo capabilities.
+#
+# The first part of the list is from Ross Ridge's `mytinfo' package
+# (comp.sources.unix, volume 26); the variable names and terminfo names (as
+# well as the termcap codes) match his list.
+#
+# This group of codes is not marked obsolete in 4.4BSD, but have no direct
+# terminfo equivalents.  The rs capability is specially translated to terminfo
+# r2, and vice versa, if an entry does not already have an r2.  Similarly,
+# i2 is translated to r3 if there is no r3 (because SV terminfo maps is to i2).
+# The ug capability is thrown away, but assumed to be whatever sg is if the
+# latter is nonzero and we're dumping in termcap format.
+#
+termcap_init2			OTi2	str	i2	-		-	YB---	secondary initialization string
+termcap_reset			OTrs	str	rs	-		-	YB-G-	terminal reset string
+magic_cookie_glitch_ul		OTug	num	ug	-		-	YBCGE	number of blanks left by ul
+#
+# Obsolete termcap capabilities.  Some are used for termcap translation.  The
+# code uses the 'OT' prefix we put on obsolete capabilities to suppress
+# printing them in terminfo source dumps of compiled entries.
+#
+backspaces_with_bs		OTbs	bool	bs	-		-	YBCGE	uses ^H to move left
+crt_no_scrolling		OTns	bool	ns	-		-	YBCG-	crt cannot scroll
+no_correctly_working_cr		OTnc	bool	nc	-		-	YBCG-	no way to go to start of line
+carriage_return_delay		OTdC	num	dC	-		-	YB-G-	pad needed for CR
+new_line_delay			OTdN	num	dN	-		-	YB-G-	pad needed for LF
+linefeed_if_not_lf		OTnl	str	nl	-		-	YBCGE	use to move down
+backspace_if_not_bs		OTbc	str	bc	-		-	YBCGE	move left, if not ^H
+#
+# GNU termcap library extensions.  The GNU termcap file distributed with
+# Emacs no longer uses these, but MT showed up in pre-9.0 versions of the
+# BSD termcap file.  The name clash with terminfo MT is resolved by type
+# info; MT is converted to km.
+#
+gnu_has_meta_key		OTMT	bool	MT	-		-	----E	has meta key
+# gnu_tab_width			OTtw	num	tw	-		-	----E	tab width in spaces
+#
+# GNU termcap *does* include the following extended capability,  Only the
+# now-obsolete Ann Arbor terminals used it.
+#
+# gnu_change_scroll_region	OTcS	str	cS	-		-	---GE	alternate set scrolling region
+#
+# The following comments describe capnames so ancient that I believe no
+# software uses them any longer.  Some of these have to go because they
+# clash with terminfo names in ways that cannot be resolved by type
+# information.
+#
+# These mytinfo codes are not used in the 4.4BSD curses code.  They are
+# marked obsolete in the 4.4BSD manual pages.
+#
+# There is one conflict with terminfo; ma is in both.  This conflict is
+# resolved by type information.
+#
+# The `ko' capability is translated by special code.  It should contain a
+# comma-separated list of capabilities for which there are corresponding keys.
+# The `kn' code is accepted but ignored.
+#
+# The `ma' capability was a 4.0BSD feature used by vi version 2.
+# It consists of pairs of characters corresponding to kl, kr, ku, kd, and kh.
+# Besides being obsolete, that interpretation conflicts with max_attributes.
+#
+# Here is a description of memory_lock_above and memory_unlock:
+# "You can 'freeze' data on the screen by turning on Memory Lock in a line of
+# text.  All lines above the cursor's current line become locked in place on
+# the screen.  Then enter data normally.  When the screen fills up, any
+# further data entered forces the first line of unfrozen line text to scroll
+# under the frozen data.  Lines scrolled off the screen are inserted into
+# memory immediately preceding the first frozen line." (from the HP 700/96
+# User's manual).  VT100/ANSI memory lock set is \E[>2h, reset is \E[>2l.
+#
+# Applications that use terminfo are supposed to behave as though xr is
+# always true.
+#
+linefeed_is_newline		OTNL	bool	NL	-		-	YB---	move down with \n
+# even_parity			OTEP	bool	EP	-		-	-B---	terminal requires even parity
+# odd_parity			OTOP	bool	OP	-		-	-B---	terminal requires odd parity
+# half_duplex			OTHD	bool	HD	-		-	-B---	terminal is half-duplex
+# lower_case_only		OTLC	bool	LC	-		-	-B---	terminal has only lower case
+# upper_case_only		OTUC	bool	UC	-		-	-B---	terminal has only upper case
+backspace_delay			OTdB	num	dB	-		-	YB-G-	padding required for ^H
+# form_feed_delay		OTdF	num	dF	-		-	-B-G-	padding required for ^L
+horizontal_tab_delay		OTdT	num	dT	-		-	YB-G-	padding required for ^I
+# vertical_tab_delay		OTdV	num	dV	-		-	-B---	padding required for ^V
+number_of_function_keys		OTkn	num	kn	-		-	-B-G-	count of function keys
+other_non_function_keys		OTko	str	ko	-		-	-B-G-	list of self-mapped keycaps
+arrow_key_map			OTma	str	ma	-		-	YBC--	map motion-keys for vi version 2
+# memory_lock_above		OTml	str	ml	-		-	-B---	lock visible screen memory above the current line
+# memory_unlock			OTmu	str	mu	-		-	-B---	unlock visible screen memory above the current line
+has_hardware_tabs		OTpt	bool	pt	-		-	YB---	has 8-char tabs invoked with ^I
+return_does_clr_eol		OTxr	bool	xr	-		-	YB---	return clears the line
+# tek_4025_insert_line		OTxx	bool	xx	-		-	-BC--	Tektronix 4025 insert-line glitch
+#
+# mytinfo described this as a termcap capability, but it is not listed in the
+# 4.4BSD man pages, and not found in the 4.4BSD termcap file.  The ncurses
+# package, like System V, behaves as though it is always true.
+#
+# rind_only_at_top		OTxq	bool	xq	-		-	-----	reverse index only works from top line
+#
+# University of Waterloo termcap extensions (as described in mytinfo).
+# The `xl' termcap file clashes with a terminfo name; this ambiguity cannot
+# be resolved by a type check.  The descriptions are guesses from what was
+# in the mytinfo tables.
+#
+# key_interrupt_char		OTki	str	ki	-		-	-----	string set by interrupt key (?)
+# key_kill_char			OTkk	str	kk	-		-	-----	string set by kill key (?)
+# key_suspend_char		OTkz	str	kz	-		-	-----	string set by suspend key (?)
+# initialization_messy		OTxc	bool	xc	-		-	-----	initialization leaves garbage on the screen (?)
+# ind_at_bottom_does_cr		OTxl	bool	xl	-		-	-----	index does a carriage return
+#
+# Nonstandard capabilities unique to Ross Ridge's `mytinfo' package.
+# SR clashes with a terminfo name; this ambiguity cannot be resolved by a type
+# check.
+#
+# scroll_left			OTsl1	str	Sl	-		-	-----	scroll screen leftward
+# scroll_right			OTsr1	str	Sr	-		-	-----	scroll screen rightward
+# parm_scroll_left		OTsl	str	SL	-		-	-----	scroll screen leftward #1 characters
+# parm_scroll_right		OTsr	str	SR	-		-	-----	scroll screen rightward #1 characters
+#
+# The mytinfo capabilities end here.
+#
+# XENIX extensions:
+#
+# Xenix defined its own set of forms-drawing capabilities:
+#
+# cap	IBM ASCII	description             ACS         	ASCII
+# ---	-----------	--------------------    -------------	------
+# G1	191 \277 M-?	single upper right   	ACS_URCORNER
+# G2	218 \332 M-Z	single upper left	ACS_ULCORNER
+# G3	192 \300 M-@	single lower left	ACS_LLCORNER
+# G4	217 \331 M-Y	single lower right	ACS_LRCORNER
+# G5	187 \273 M-;	double upper right
+# G6	201 \311 M-I	double upper left
+# G7	200 \310 M-H	double lower left
+# G8	188 \274 M-<	double lower right
+# GC	197 \305 M-E	single intersection	ACS_PLUS	_ _
+# GD	194 \302 M-B	single down-tick	ACS_TTEE	 |
+# GH	196 \304 M-D	single horizontal line	ACS_HLINE
+# GL	180 \264 M-4	single left tick	ACS_RTEE	-|
+# GR	195 \303 M-C	single right tick	ACS_LTEE	|-
+# GU	193 \301 M-A	single up tick		ACS_BTEE	_|_
+# GV	179 \263 M-3	single vertical line	ACS_VLINE
+# Gc	206 \316 M-N	double intersection
+# Gd	203 \313 M-K	double down tick
+# Gh	205 \315 M-M	double horizontal line
+# Gl	204 \204 M-L	double left tick
+# Gr	185 \271 M-9	double right tick
+# Gu	202 \312 M-J	double up tick
+# Gv	186 \272 M-:	double vertical line
+#
+# The compiler will translate the single-line caps and discard the others
+# (via IGNORE aliases further down).  We don't want to do normal pad
+# translation on these, they're often single-character printable ASCII
+# strings that happen to be numerics.  There's awk code in parametrized.sh
+# that detects the acs_ prefix and uses it to suppress pad translation.
+# These terminfo names are invented.
+#
+acs_ulcorner			OTG2	str	G2	-		-	-----	single upper left
+acs_llcorner			OTG3	str	G3	-		-	-----	single lower left
+acs_urcorner			OTG1	str	G1	-		-	-----	single upper right
+acs_lrcorner			OTG4	str	G4	-		-	-----	single lower right
+acs_ltee			OTGR	str	GR	-		-	-----	tee pointing right
+acs_rtee			OTGL	str	GL	-		-	-----	tee pointing left
+acs_btee			OTGU	str	GU	-		-	-----	tee pointing up
+acs_ttee			OTGD	str	GD	-		-	-----	tee pointing down
+acs_hline			OTGH	str	GH	-		-	-----	single horizontal line
+acs_vline			OTGV	str	GV	-		-	-----	single vertical line
+acs_plus			OTGC	str	GC	-		-	-----	single intersection
+#
+#############################################################################
+#
+# TERMINFO EXTENSION CAPABILITIES
+#
+# (see Caps-ncurses for the complete set of comments)
+#
+memory_lock			meml	str	ml	-		-	----K	lock memory above cursor
+memory_unlock			memu	str	mu	-		-	----K	unlock memory
+box_chars_1			box1	str	bx	-		-	----K	box characters primary set
+#
+#############################################################################
diff --git a/include/Caps.osf1r5 b/include/Caps.osf1r5
new file mode 100644
index 0000000..beb71c3
--- /dev/null
+++ b/include/Caps.osf1r5
@@ -0,0 +1,979 @@
+##############################################################################
+# Copyright 2019-2020,2021 Thomas E. Dickey                                  #
+# Copyright 2002-2015,2016 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.                                                             #
+##############################################################################
+#
+# Author: Thomas Dickey
+#
+# $Id: Caps.osf1r5,v 1.16 2021/10/08 07:55:48 tom Exp $
+#
+# This is an adaptation of ncurses' termcap/terminfo capability table, which
+# is designed to align with OSF/1 version 5 (Tru64) terminfo.
+#
+# This table is used to generate initializers for tables that drive tic,
+# infocmp, and the library compilation code used to support the termcap
+# compatibility hack.  It is also used to generate the tabular portion of the
+# terminfo(5) man page; lines beginning with `#%' are passed through to become
+# the terminfo table.
+#
+# This file has three major sections; a standard-capabilities table, two
+# extension-capability tables, and a section of aliases declarations.
+# The first two have the same format, as follows:
+#
+# FILE FORMAT
+#
+# Column 1: terminfo variable name
+# Column 2: terminfo capability name
+# Column 3: capability type (boolean, numeric, or string)
+# Column 4: termcap capability name
+# Column 5: KEY_xxx name, if any, `-' otherwise
+# Column 6: value for KEY_xxx name, if any, `-' otherwise
+# Column 7: Lead with `Y' if capability should be emitted in termcap
+#           translations, `-' otherwise
+# Column 8: capability description
+#
+# The codes following [Y-] in column 7 describe the versions of termcap which
+# use the given capability.  This information is not used by the curses library
+# proper; rather, it is there to help the terminfo maintainer avoid emitting
+# termcap entry translations that are more than 1023 bytes long (and tank a
+# lot of old termcap-using programs).  The codes read as follows:
+#	B = mentioned in the BSD man page for 4.4BSD curses
+#	C = used by the 4.4BSD curses library
+#	G = mentioned in the documentation for GNU termcap
+#	E = used by GNU Emacs
+#	K = remove this terminfo capability when translating to standard format
+# The important codes are C and E.  A cap with C or E should be preserved in
+# translation if possible.  The problem is that preserving all such caps may
+# lead to some termcap translations being too long.  The termcap maintainer
+# has a bit of a juggling act to do...potential problem cases are marked with
+# an asterisk (*).
+#
+# The aliases section has the following format:
+#
+# Column 1: either `capalias' or `infoalias'
+# Column 2: name to be aliased
+# Column 3: what name it should translate to.  The name IGNORE means it
+#           should be discarded with a warning message.
+# Column 4: name of the extension set (used for compiler warning messages)
+# Column 5: capability description (usually an associated terminfo variable)
+#
+# HANDLING TERMCAP AND TERMINFO EXTENSIONS
+#
+# There are basically five different ways to handle termcap and terminfo
+# extensions:
+#
+# 1. Don't list the capname here, or list it but comment it out (the latter
+# is preferable; someone might want to handle it in the future).  If you do
+# this, the capability will be treated as unknown and raise a warning from
+# the compiler.
+#
+# 2. Alias it.  This is appropriate if the capability has the same meaning
+# as an already-supported one.  The compiler will handle aliasing, emitting
+# an appropriate informational message whenever an alias fires.
+#
+# 3. List it in the standard table.  You almost certainly do *not* want
+# to do this -- the capabilities in that one, and their order, have been
+# carefully chosen to be SVr4-binary-compatible when they're written out
+# as a terminfo object, and breaking this would be bad.  It is up to the ncurses
+# library what to do with the terminfo data after it is read in.
+#
+# 4. List it in the aliases table with an IGNORE target field.  If you
+# do this, the capability will be ignored on input (though the user will
+# get a warning message about it).
+#
+# 5. List it in the extensions table. If you do this, the compiler will
+# silently accept the capability, but the curses library proper will never
+# see it (because it won't be written out as part of the terminfo object
+# format).  It is up to you what you have the compiler do with it.
+#
+# There are two opposite reasons to choose option 5.  One is when you want
+# to eat the capability silently and discard it when doing translations
+# to terminfo with tic -I.  Some very old obsolete BSD caps like :kn: are
+# in this class.  Nothing will ever use them again.
+#
+# More usually, you want the compiler to try to deduce something from the
+# capability value that it can use to translate it into your output format.
+# You'll need to write custom code, probably in postprocess_termcap() or
+# postprocess_terminfo(), to handle the translation.
+#
+# CONTROLLING ENTRY LENGTH
+#
+# Notes on specific elisions made to fit translations within 1023 bytes:
+#
+# Machines with IBM PC-like keyboards want to be able to define the following
+# keys: key_npage, key_ppage, key_home, key_ll (which is used for in termcap-
+# only environments for End or Home-Down), key_dc, and key_ic.  This is also
+# the set of keys the `joe' editor will be upset if it can't see.  So don't
+# trim those out of the set to be translated to termcap, or various users of
+# the termcap file will become irate.
+#
+# It might look tempting to leave those long init strings out of translations.
+# We can't do it (yet); 4.4BSD tput and tset use them.
+#
+# We retain the sgr capability in translation in spite of the fact that neither
+# 4.4BSD nor GNU Emacs uses it, because (a) some entry naming distinctions are
+# hard to understand without it, and (b) the entries in which it is long tend
+# to be older types that don't use up a lot of string space on function keys.
+# The tic(1) translation code will complain and elide it if it makes a critical
+# difference (there is special code in tic to recognize this situation).
+#
+# Yes, BSD tset(1) uses hpa.  We elide hpa/vpa anyway because the motion
+# optimizer in BSD curses didn't use them.  This omission seems to be the
+# single most effective one, it shortened the resolved length of all thirteen
+# problem entries in the 9.9.0 version of the terminfo master below critical.
+#
+# It would be nice to keep f11 and f12 for Emacs use, but a couple of termcap
+# translations go back over critical if we do this.  As 4.4BSD curses fades
+# into history and GNU termcap's application base shrinks towards being GNU
+# Emacs only, we'll probably elide out some BSD-only capabilities in order
+# to buy space for non-essentials Emacs is still using.  Capabilities high
+# on that hit list: rc, sc, uc.
+#
+#############################################################################
+#
+# STANDARD CAPABILITIES
+#
+#%The following is a complete table of the capabilities included in a
+#%terminfo description block and available to terminfo-using code.  In each
+#%line of the table,
+#%
+#%The \fBvariable\fR is the name by which the programmer (at the terminfo level)
+#%accesses the capability.
+#%
+#%The \fBcapname\fR is the short name used in the text of the database,
+#%and is used by a person updating the database.
+#%Whenever possible, capnames are chosen to be the same as or similar to
+#%the ANSI X3.64-1979 standard (now superseded by ECMA-48, which uses
+#%identical or very similar names).  Semantics are also intended to match
+#%those of the specification.
+#%
+#%The termcap code is the old
+#%.B termcap
+#%capability name (some capabilities are new, and have names which termcap
+#%did not originate).
+#%.P
+#%Capability names have no hard length limit, but an informal limit of 5
+#%characters has been adopted to keep them short and to allow the tabs in
+#%the source file
+#%.B Caps
+#%to line up nicely.
+#%
+#%Finally, the description field attempts to convey the semantics of the
+#%capability.  You may find some codes in the description field:
+#%.TP
+#%(P)
+#%indicates that padding may be specified
+#%.TP
+#%#[1-9]
+#%in the description field indicates that the string is passed
+#%through \fBtparm\fP(3X) with parameters as given (#\fIi\fP).
+#%.IP
+#%If no parameters are listed in the description,
+#%passing the string through \fBtparm\fP(3X) may give unexpected results,
+#%e.g., if it contains percent (%%) signs.
+#%.TP
+#%(P*)
+#%indicates that padding may vary in proportion to the number of
+#%lines affected
+#%.TP
+#%(#\d\fIi\fP\u)
+#%indicates the \fIi\fP\uth\d parameter.
+#%
+#%.PP
+#% These are the boolean capabilities:
+#%
+#%.na
+#%.TS H
+#%center expand;
+#%c l l c
+#%c l l c
+#%lw25 lw6 lw2 lw20.
+#%\fBVariable	Cap-	TCap	Description\fR
+#%\fBBooleans	name	Code\fR
+auto_left_margin		bw	bool	bw	-	-	YB-G-	cub1 wraps from column 0 to last column
+auto_right_margin		am	bool	am	-	-	YBCGE	terminal has automatic margins
+no_esc_ctlc			xsb	bool	xb	-	-	YBCG-	beehive (f1=escape, f2=ctrl C)
+ceol_standout_glitch		xhp	bool	xs	-	-	YBCGE	standout not erased by overwriting (hp)
+eat_newline_glitch		xenl	bool	xn	-	-	YBCGE	newline ignored after 80 cols (concept)
+erase_overstrike		eo	bool	eo	-	-	YBCG-	can erase overstrikes with a blank
+generic_type			gn	bool	gn	-	-	YB-G-	generic line type
+hard_copy			hc	bool	hc	-	-	YBCG-	hardcopy terminal
+has_meta_key			km	bool	km	-	-	YB-GE	Has a meta key (i.e., sets 8th-bit)
+has_status_line			hs	bool	hs	-	-	YB-G-	has extra status line
+insert_null_glitch		in	bool	in	-	-	YBCGE	insert mode distinguishes nulls
+memory_above			da	bool	da	-	-	YBCG-	display may be retained above the screen
+memory_below			db	bool	db	-	-	YB-GE	display may be retained below the screen
+move_insert_mode		mir	bool	mi	-	-	YBCGE	safe to move while in insert mode
+move_standout_mode		msgr	bool	ms	-	-	YBCGE	safe to move while in standout mode
+over_strike			os	bool	os	-	-	YBCG-	terminal can overstrike
+status_line_esc_ok		eslok	bool	es	-	-	YB-G-	escape can be used on the status line
+dest_tabs_magic_smso		xt	bool	xt	-	-	YBCGE	tabs destructive, magic so char (t1061)
+tilde_glitch			hz	bool	hz	-	-	YB-GE	cannot print ~'s (Hazeltine)
+transparent_underline		ul	bool	ul	-	-	YBCGE	underline character overstrikes
+xon_xoff			xon	bool	xo	-	-	YB---	terminal uses xon/xoff handshaking
+back_color_erase		bce	bool	ut	-	-	-----	screen erased with background color
+can_change			ccc	bool	cc	-	-	-----	terminal can re-define existing colors
+col_addr_glitch			xhpa	bool	YA	-	-	-----	only positive motion for hpa/mhpa caps
+cpi_changes_res			cpix	bool	YF	-	-	-----	changing character pitch changes resolution
+cr_cancels_micro_mode		crxm	bool	YB	-	-	-----	using cr turns off micro mode
+hard_cursor			chts	bool	HC	-	-	-----	cursor is hard to see
+has_print_wheel			daisy	bool	YC	-	-	-----	printer needs operator to change character set
+hue_lightness_saturation	hls	bool	hl	-	-	-----	terminal uses only HLS color notation (Tektronix)
+lpi_changes_res			lpix	bool	YG	-	-	-----	changing line pitch changes resolution
+needs_xon_xoff			nxon	bool	nx	-	-	-----	padding will not work, xon/xoff required
+non_dest_scroll_region		ndscr	bool	ND	-	-	-----	scrolling region is non-destructive
+non_rev_rmcup			nrrmc	bool	NR	-	-	-----	smcup does not reverse rmcup
+no_pad_char			npc	bool	NP	-	-	-----	pad character does not exist
+prtr_silent			mc5i	bool	5i	-	-	-----	printer will not echo on screen
+row_addr_glitch			xvpa	bool	YD	-	-	-----	only positive motion for vpa/mvpa caps
+semi_auto_right_margin		sam	bool	YE	-	-	-----	printing in last column causes cr
+#%.TE
+#%.ad
+#%
+#%These are the numeric capabilities:
+#%
+#%.na
+#%.TS H
+#%center expand;
+#%c l l c
+#%c l l c
+#%lw25 lw6 lw2 lw20.
+#%\fBVariable	Cap-	TCap	Description\fR
+#%\fBNumeric	name	Code\fR
+columns				cols	num	co	-	-	YBCGE	number of columns in a line
+init_tabs			it	num	it	-	-	YB-G-	tabs initially every # spaces
+lines				lines	num	li	-	-	YBCGE	number of lines on screen or page
+lines_of_memory			lm	num	lm	-	-	YB-G-	lines of memory if > line. 0 means varies
+magic_cookie_glitch		xmc	num	sg	-	-	YBCGE	number of blank characters left by smso or rmso
+padding_baud_rate		pb	num	pb	-	-	YB-GE	lowest baud rate where padding needed
+virtual_terminal		vt	num	vt	-	-	YB---	virtual terminal number (CB/unix)
+width_status_line		wsl	num	ws	-	-	YB-G-	number of columns in status line
+bit_image_entwining		bitwin	num	Yo	-	-	-----	number of passes for each bit-image row
+bit_image_type			bitype	num	Yp	-	-	-----	type of bit-image device
+buffer_capacity			bufsz	num	Ya	-	-	-----	numbers of bytes buffered before printing
+buttons				btns	num	BT	-	-	-----	number of buttons on mouse
+dot_vert_spacing		spinv	num	Yb	-	-	-----	spacing of pins vertically in pins per inch
+dot_horz_spacing		spinh	num	Yc	-	-	-----	spacing of dots horizontally in dots per inch
+label_height			lh	num	lh	-	-	-----	rows in each label
+label_width			lw	num	lw	-	-	-----	columns in each label
+max_attributes			ma	num	ma	-	-	YBC--	maximum combined attributes terminal can handle
+max_colors			colors	num	Co	-	-	-----	maximum number of colors on screen
+max_micro_address		maddr	num	Yd	-	-	-----	maximum value in micro_..._address
+max_micro_jump			mjump	num	Ye	-	-	-----	maximum value in parm_..._micro
+max_pairs			pairs	num	pa	-	-	-----	maximum number of color-pairs on the screen
+maximum_windows			wnum	num	MW	-	-	-----	maximum number of definable windows
+micro_col_size			mcs	num	Yf	-	-	-----	character step size when in micro mode
+micro_line_size			mls	num	Yg	-	-	-----	line step size when in micro mode
+no_color_video			ncv	num	NC	-	-	-----	video attributes that can not be used with colors
+number_of_pins			npins	num	Yh	-	-	-----	numbers of pins in print-head
+num_labels			nlab	num	Nl	-	-	-----	number of labels on screen
+output_res_char			orc	num	Yi	-	-	-----	horizontal resolution in units per line
+output_res_line			orl	num	Yj	-	-	-----	vertical resolution in units per line
+output_res_horz_inch		orhi	num	Yk	-	-	-----	horizontal resolution in units per inch
+output_res_vert_inch		orvi	num	Yl	-	-	-----	vertical resolution in units per inch
+print_rate			cps	num	Ym	-	-	-----	print rate in characters per second
+wide_char_size			widcs	num	Yn	-	-	-----	character step size when in double wide mode
+#%.TE
+#%.ad
+#%
+#%These are the string capabilities:
+#%
+#%.na
+#%.TS H
+#%center expand;
+#%c l l c
+#%c l l c
+#%lw25 lw6 lw2 lw20.
+#%\fBVariable	Cap-	TCap	Description\fR
+#%\fBString	name	Code\fR
+back_tab			cbt	str	bt	-		-	YBCGE	back tab (P)
+bell				bel	str	bl	-		-	YB-GE	audible signal (bell) (P)
+carriage_return			cr	str	cr	-		-	YBCGE	carriage return (P*) (P*)
+change_scroll_region		csr	str	cs	-		-	YBCGE	change region to line #1 to line #2 (P)
+clear_all_tabs			tbc	str	ct	-		-	YB-G-	clear all tab stops (P)
+clear_screen			clear	str	cl	-		-	YBCGE	clear screen and home cursor (P*)
+clr_eol				el	str	ce	-		-	YBCGE	clear to end of line (P)
+clr_eos				ed	str	cd	-		-	YBCGE	clear to end of screen (P*)
+column_address			hpa	str	ch	-		-	-B-GE*	horizontal position #1, absolute (P)
+command_character		cmdch	str	CC	-		-	YB-G-	terminal settable cmd character in prototype !?
+cursor_address			cup	str	cm	-		-	YBCGE	move to row #1 columns #2
+cursor_down			cud1	str	do	-		-	YBCGE	down one line
+cursor_home			home	str	ho	-		-	YBCGE	home cursor (if no cup)
+cursor_invisible		civis	str	vi	-		-	YB-G-	make cursor invisible
+cursor_left			cub1	str	le	-		-	YBCGE	move left one space
+cursor_mem_address		mrcup	str	CM	-		-	YB-G-	memory relative cursor addressing, move to row #1 columns #2
+cursor_normal			cnorm	str	ve	-		-	YBCGE	make cursor appear normal (undo civis/cvvis)
+cursor_right			cuf1	str	nd	-		-	YBCGE	non-destructive space (move right one space)
+cursor_to_ll			ll	str	ll	-		-	YBCGE	last line, first column (if no cup)
+cursor_up			cuu1	str	up	-		-	YBCGE	up one line
+cursor_visible			cvvis	str	vs	-		-	YBCGE	make cursor very visible
+delete_character		dch1	str	dc	-		-	YBCGE	delete character (P*)
+delete_line			dl1	str	dl	-		-	YBCGE	delete line (P*)
+dis_status_line			dsl	str	ds	-		-	YB-G-	disable status line
+down_half_line			hd	str	hd	-		-	YB-G-	half a line down
+enter_alt_charset_mode		smacs	str	as	-		-	YB-G-	start alternate character set (P)
+enter_blink_mode		blink	str	mb	-		-	YB-G-	turn on blinking
+enter_bold_mode			bold	str	md	-		-	YB-G-	turn on bold (extra bright) mode
+enter_ca_mode			smcup	str	ti	-		-	YBCGE	string to start programs using cup
+enter_delete_mode		smdc	str	dm	-		-	YBCGE	enter delete mode
+enter_dim_mode			dim	str	mh	-		-	YB-G-	turn on half-bright mode
+enter_insert_mode		smir	str	im	-		-	YBCGE	enter insert mode
+enter_secure_mode		invis	str	mk	-		-	-B-G-*	turn on blank mode (characters invisible)
+enter_protected_mode		prot	str	mp	-		-	-B-G-*	turn on protected mode
+enter_reverse_mode		rev	str	mr	-		-	YB-G-	turn on reverse video mode
+enter_standout_mode		smso	str	so	-		-	YBCGE	begin standout mode
+enter_underline_mode		smul	str	us	-		-	YBCGE	begin underline mode
+erase_chars			ech	str	ec	-		-	YB-G-	erase #1 characters (P)
+exit_alt_charset_mode		rmacs	str	ae	-		-	YB-G-	end alternate character set (P)
+exit_attribute_mode		sgr0	str	me	-		-	YB-GE	turn off all attributes
+exit_ca_mode			rmcup	str	te	-		-	YBCGE	strings to end programs using cup
+exit_delete_mode		rmdc	str	ed	-		-	YBCGE	end delete mode
+exit_insert_mode		rmir	str	ei	-		-	YBCGE	exit insert mode
+exit_standout_mode		rmso	str	se	-		-	YBCGE	exit standout mode
+exit_underline_mode		rmul	str	ue	-		-	YBCGE	exit underline mode
+flash_screen			flash	str	vb	-		-	YBCGE	visible bell (may not move cursor)
+form_feed			ff	str	ff	-		-	YB-G-	hardcopy terminal page eject (P*)
+from_status_line		fsl	str	fs	-		-	YB-G-	return from status line
+init_1string			is1	str	i1	-		-	YB-G-	initialization string
+init_2string			is2	str	is	-		-	YB-G-	initialization string
+init_3string			is3	str	i3	-		-	YB-G-	initialization string
+init_file			if	str	if	-		-	YB-G-	name of initialization file
+insert_character		ich1	str	ic	-		-	YBCGE	insert character (P)
+insert_line			il1	str	al	-		-	YBCGE	insert line (P*)
+insert_padding			ip	str	ip	-		-	YBCGE	insert padding after inserted character
+key_backspace			kbs	str	kb	KEY_BACKSPACE	0407	YB-G-	backspace key
+key_catab			ktbc	str	ka	KEY_CATAB	0526	-B-G-*	clear-all-tabs key
+key_clear			kclr	str	kC	KEY_CLEAR	0515	-B-G-*	clear-screen or erase key
+key_ctab			kctab	str	kt	KEY_CTAB	0525	-B-G-*	clear-tab key
+key_dc				kdch1	str	kD	KEY_DC		0512	YB-G-	delete-character key
+key_dl				kdl1	str	kL	KEY_DL		0510	-B-G-*	delete-line key
+key_down			kcud1	str	kd	KEY_DOWN	0402	YBCGE	down-arrow key
+key_eic				krmir	str	kM	KEY_EIC		0514	-B-G-*	sent by rmir or smir in insert mode
+key_eol				kel	str	kE	KEY_EOL		0517	-B-G-*	clear-to-end-of-line key
+key_eos				ked	str	kS	KEY_EOS		0516	-B-G-*	clear-to-end-of-screen key
+key_f0				kf0	str	k0	KEY_F(0)	0410	YBCGE	F0 function key
+key_f1				kf1	str	k1	KEY_F(1)	-	YBCGE	F1 function key
+key_f10				kf10	str	k;	KEY_F(10)	-	----E	F10 function key
+key_f2				kf2	str	k2	KEY_F(2)	-	YBCGE	F2 function key
+key_f3				kf3	str	k3	KEY_F(3)	-	YBCGE	F3 function key
+key_f4				kf4	str	k4	KEY_F(4)	-	YBCGE	F4 function key
+key_f5				kf5	str	k5	KEY_F(5)	-	YBCGE	F5 function key
+key_f6				kf6	str	k6	KEY_F(6)	-	YBCGE	F6 function key
+key_f7				kf7	str	k7	KEY_F(7)	-	YBCGE	F7 function key
+key_f8				kf8	str	k8	KEY_F(8)	-	YBCGE	F8 function key
+key_f9				kf9	str	k9	KEY_F(9)	-	YBCGE	F9 function key
+key_home			khome	str	kh	KEY_HOME	0406	YBCGE	home key
+key_ic				kich1	str	kI	KEY_IC		0513	YB-GE	insert-character key
+key_il				kil1	str	kA	KEY_IL		0511	-B-G-*	insert-line key
+key_left			kcub1	str	kl	KEY_LEFT	0404	YBCGE	left-arrow key
+key_ll				kll	str	kH	KEY_LL		0533	YB-G-	lower-left key (home down)
+key_npage			knp	str	kN	KEY_NPAGE	0522	YB-GE	next-page key
+key_ppage			kpp	str	kP	KEY_PPAGE	0523	YB-GE	previous-page key
+key_right			kcuf1	str	kr	KEY_RIGHT	0405	YBCGE	right-arrow key
+key_sf				kind	str	kF	KEY_SF		0520	-B-G-*	scroll-forward key
+key_sr				kri	str	kR	KEY_SR		0521	-B-G-*	scroll-backward key
+key_stab			khts	str	kT	KEY_STAB	0524	-B-G-*	set-tab key
+key_up				kcuu1	str	ku	KEY_UP		0403	YBCGE	up-arrow key
+keypad_local			rmkx	str	ke	-		-	YBCGE	leave 'keyboard_transmit' mode
+keypad_xmit			smkx	str	ks	-		-	YBCGE	enter 'keyboard_transmit' mode
+lab_f0				lf0	str	l0	-		-	-B-G-*	label on function key f0 if not f0
+lab_f1				lf1	str	l1	-		-	-B-G-*	label on function key f1 if not f1
+lab_f10				lf10	str	la	-		-	-----	label on function key f10 if not f10
+lab_f2				lf2	str	l2	-		-	-B-G-*	label on function key f2 if not f2
+lab_f3				lf3	str	l3	-		-	-B-G-*	label on function key f3 if not f3
+lab_f4				lf4	str	l4	-		-	-B-G-*	label on function key f4 if not f4
+lab_f5				lf5	str	l5	-		-	-B-G-*	label on function key f5 if not f5
+lab_f6				lf6	str	l6	-		-	-B-G-*	label on function key f6 if not f6
+lab_f7				lf7	str	l7	-		-	-B-G-*	label on function key f7 if not f7
+lab_f8				lf8	str	l8	-		-	-B-G-*	label on function key f8 if not f8
+lab_f9				lf9	str	l9	-		-	-B-G-*	label on function key f9 if not f9
+meta_off			rmm	str	mo	-		-	YB-G-*	turn off meta mode
+meta_on				smm	str	mm	-		-	YB-G-*	turn on meta mode (8th-bit on)
+newline				nel	str	nw	-		-	YB-G-*	newline (behave like cr followed by lf)
+pad_char			pad	str	pc	-		-	YBCGE	padding char (instead of null)
+parm_dch			dch	str	DC	-		-	YB-GE	delete #1 characters (P*)
+parm_delete_line		dl	str	DL	-		-	YBCGE	delete #1 lines (P*)
+parm_down_cursor		cud	str	DO	-		-	YBCGE	down #1 lines (P*)
+parm_ich			ich	str	IC	-		-	YB-GE	insert #1 characters (P*)
+parm_index			indn	str	SF	-		-	YBCG-	scroll forward #1 lines (P)
+parm_insert_line		il	str	AL	-		-	YBCGE	insert #1 lines (P*)
+parm_left_cursor		cub	str	LE	-		-	YBCGE	move #1 characters to the left (P)
+parm_right_cursor		cuf	str	RI	-		-	YBCGE	move #1 characters to the right (P*)
+parm_rindex			rin	str	SR	-		-	YBCG-	scroll back #1 lines (P)
+parm_up_cursor			cuu	str	UP	-		-	YBCGE	up #1 lines (P*)
+pkey_key			pfkey	str	pk	-		-	-B---	program function key #1 to type string #2
+pkey_local			pfloc	str	pl	-		-	-B---	program function key #1 to execute string #2
+pkey_xmit			pfx	str	px	-		-	-B---	program function key #1 to transmit string #2
+print_screen			mc0	str	ps	-		-	-B-G-*	print contents of screen
+prtr_off			mc4	str	pf	-		-	-B-G-*	turn off printer
+prtr_on				mc5	str	po	-		-	-B-G-*	turn on printer
+repeat_char			rep	str	rp	-		-	YB-GE	repeat char #1 #2 times (P*)
+reset_1string			rs1	str	r1	-		-	-B---	reset string
+reset_2string			rs2	str	r2	-		-	-B---	reset string
+reset_3string			rs3	str	r3	-		-	-B---	reset string
+reset_file			rf	str	rf	-		-	-B---	name of reset file
+restore_cursor			rc	str	rc	-		-	YBCG-	restore cursor to position of last save_cursor
+row_address			vpa	str	cv	-		-	-B-GE*	vertical position #1 absolute (P)
+save_cursor			sc	str	sc	-		-	YBCG-	save current cursor position (P)
+scroll_forward			ind	str	sf	-		-	YBCGE	scroll text up (P)
+scroll_reverse			ri	str	sr	-		-	YBCGE	scroll text down (P)
+set_attributes			sgr	str	sa	-		-	YB-G-	define video attributes #1-#9 (PG9)
+set_tab				hts	str	st	-		-	YB-G-	set a tab in every row, current columns
+set_window			wind	str	wi	-		-	-B-GE	current window is lines #1-#2 cols #3-#4
+tab				ht	str	ta	-		-	YBCGE	tab to next 8-space hardware tab stop
+to_status_line			tsl	str	ts	-		-	YB-G-	move to status line, column #1
+underline_char			uc	str	uc	-		-	YBCG-	underline char and move past it
+up_half_line			hu	str	hu	-		-	YB-G-	half a line up
+init_prog			iprog	str	iP	-		-	-B---	path name of program for initialization
+key_a1				ka1	str	K1	KEY_A1		0534	YB-GE	upper left of keypad
+key_a3				ka3	str	K3	KEY_A3		0535	YB-GE	upper right of keypad
+key_b2				kb2	str	K2	KEY_B2		0536	YB-GE	center of keypad
+key_c1				kc1	str	K4	KEY_C1		0537	YB-GE	lower left of keypad
+key_c3				kc3	str	K5	KEY_C3		0540	YB-GE	lower right of keypad
+prtr_non			mc5p	str	pO	-		-	-B-G-*	turn on printer for #1 bytes
+#
+# SVr1 capabilities stop here.	IBM's version of terminfo is the same as
+# SVr4 up to this point, but has a different set afterwards.
+#
+# OSF1 differences start here, based on IBM version:
+#
+box_chars_1			box1	str	bx	-		-	----K	box characters primary set
+box_chars_2			box2	str	by	-		-	----K	box characters secondary set
+box_attr_1			batt1	str	Bx	-		-	----K	attributes for box1
+box_attr_2			batt2	str	By	-		-	----K	attributes for box2
+color_bg_0			colb0	str	d0	-		-	----K	background color 0
+color_bg_1			colb1	str	d1	-		-	----K	background color 1
+color_bg_2			colb2	str	d2	-		-	----K	background color 2
+color_bg_3			colb3	str	d3	-		-	----K	background color 3
+color_bg_4			colb4	str	d4	-		-	----K	background color 4
+color_bg_5			colb5	str	d5	-		-	----K	background color 5
+color_bg_6			colb6	str	d6	-		-	----K	background color 6
+color_bg_7			colb7	str	d7	-		-	----K	background color 7
+color_fg_0			colf0	str	c0	-		-	----K	foreground color 0
+color_fg_1			colf1	str	c1	-		-	----K	foreground color 1
+color_fg_2			colf2	str	c2	-		-	----K	foreground color 2
+color_fg_3			colf3	str	c3	-		-	----K	foreground color 3
+color_fg_4			colf4	str	c4	-		-	----K	foreground color 4
+color_fg_5			colf5	str	c5	-		-	----K	foreground color 5
+color_fg_6			colf6	str	c6	-		-	----K	foreground color 6
+color_fg_7			colf7	str	c7	-		-	----K	foreground color 7
+font_0				font0	str	f0	-		-	-----	select font 0
+font_1				font1	str	f1	-		-	-----	select font 1
+font_2				font2	str	f2	-		-	-----	select font 2
+font_3				font3	str	f3	-		-	-----	select font 3
+font_4				font4	str	f4	-		-	----K	select font 4
+font_5				font5	str	f5	-		-	----K	select font 5
+font_6				font6	str	f6	-		-	----K	select font 6
+font_7				font7	str	f7	-		-	----K	select font 7
+key_back_tab			kbtab	str	k0	-		-	-----	backtab key
+key_do				kdo	str	ki	-		-	----K	do request key
+key_command			kcmd	str	kc	KEY_COMMAND	0545	-----	command key
+key_command_pane		kcpn	str	kW	-		-	----K	command-pane key
+key_end				kend	str	@7	KEY_END		0550	-----	end key
+key_help			khlp	str	%1	KEY_HELP	0553	-----	help key
+key_newline			knl	str	nl	-		-	----K	newline key
+key_next_pane			knpn	str	kv	-		-	----K	next-pane key
+key_prev_cmd			kppn	str	kp	-		-	----K	previous-command key
+key_prev_pane			kppn	str	kV	-		-	----K	previous-pane key
+key_quit			kquit	str	kQ	-		-	----K	quit key
+key_select			kslt	str	*6	KEY_SELECT	0601	-----	select key
+key_scroll_left			kscl	str	kz	-		-	----K	scroll left
+key_scroll_right		kscr	str	kZ	-		-	----K	scroll right
+key_tab				ktab	str	ko	-		-	----K	tab key
+key_smap_in1			kmpf1	str	Kv	-		-	----K	special mapped key 1 input
+key_smap_out1			kmpt1	str	KV	-		-	----K	special mapped key 1 output
+key_smap_in2			kmpf2	str	Kw	-		-	----K	special mapped key 2 input
+key_smap_out2			kmpt2	str	KW	-		-	----K	special mapped key 2 output
+key_smap_in3			kmpf3	str	Kx	-		-	----K	special mapped key 3 input
+key_smap_out3			kmpt3	str	KX	-		-	----K	special mapped key 3 output
+key_smap_in4			kmpf4	str	Ky	-		-	----K	special mapped key 4 input
+key_smap_out4			kmpt4	str	KY	-		-	----K	special mapped key 4 output
+key_smap_in5			kmpf5	str	Kz	-		-	----K	special mapped key 5 input
+key_smap_out5			kmpt5	str	KZ	-		-	----K	special mapped key 5 output
+appl_defined_str		apstr	str	za	-		-	----K	application-defined string
+# The key_smap_in[6789] and key_smap_out[6789] capabilities are described in
+# the Tru64 manual pages.
+key_smap_in6			kmpf6	str	Kr	-		-	----K	special mapped key 6 input
+key_smap_out6			kmpt6	str	KR	-		-	----K	special mapped key 6 output
+key_smap_in7			kmpf7	str	Ks	-		-	----K	special mapped key 7 input
+key_smap_out7			kmpt7	str	KS	-		-	----K	special mapped key 7 output
+key_smap_in8			kmpf8	str	Kt	-		-	----K	special mapped key 8 input
+key_smap_out8			kmpt8	str	KT	-		-	----K	special mapped key 8 output
+key_smap_in9			kmpf9	str	Ku	-		-	----K	special mapped key 9 input
+key_smap_out9			kmpt9	str	KU	-		-	----K	special mapped key 9 output
+key_sf1				ksf1	str	S1	-		-	----K	special function key 1
+key_sf2				ksf2	str	S2	-		-	----K	special function key 2
+key_sf3				ksf3	str	S3	-		-	----K	special function key 3
+key_sf4				ksf4	str	S4	-		-	----K	special function key 4
+key_sf5				ksf5	str	S5	-		-	----K	special function key 5
+key_sf6				ksf6	str	S6	-		-	----K	special function key 6
+key_sf7				ksf7	str	S7	-		-	----K	special function key 7
+key_sf8				ksf8	str	S8	-		-	----K	special function key 8
+key_sf9				ksf9	str	S9	-		-	----K	special function key 9
+key_sf10			ksf10	str	SA	-		-	----K	special function key 10
+#
+key_f11				kf11	str	F1	KEY_F(11)	-	----E	F11 function key
+key_f12				kf12	str	F2	KEY_F(12)	-	----E	F12 function key
+key_f13				kf13	str	F3	KEY_F(13)	-	----E	F13 function key
+key_f14				kf14	str	F4	KEY_F(14)	-	----E	F14 function key
+key_f15				kf15	str	F5	KEY_F(15)	-	----E	F15 function key
+key_f16				kf16	str	F6	KEY_F(16)	-	----E	F16 function key
+key_f17				kf17	str	F7	KEY_F(17)	-	----E	F17 function key
+key_f18				kf18	str	F8	KEY_F(18)	-	----E	F18 function key
+key_f19				kf19	str	F9	KEY_F(19)	-	----E	F19 function key
+key_f20				kf20	str	FA	KEY_F(20)	-	----E	F20 function key
+key_f21				kf21	str	FB	KEY_F(21)	-	----E	F21 function key
+key_f22				kf22	str	FC	KEY_F(22)	-	----E	F22 function key
+key_f23				kf23	str	FD	KEY_F(23)	-	----E	F23 function key
+key_f24				kf24	str	FE	KEY_F(24)	-	----E	F24 function key
+key_f25				kf25	str	FF	KEY_F(25)	-	----E	F25 function key
+key_f26				kf26	str	FG	KEY_F(26)	-	----E	F26 function key
+key_f27				kf27	str	FH	KEY_F(27)	-	----E	F27 function key
+key_f28				kf28	str	FI	KEY_F(28)	-	----E	F28 function key
+key_f29				kf29	str	FJ	KEY_F(29)	-	----E	F29 function key
+key_f30				kf30	str	FK	KEY_F(30)	-	----E	F30 function key
+key_f31				kf31	str	FL	KEY_F(31)	-	----E	F31 function key
+key_f32				kf32	str	FM	KEY_F(32)	-	----E	F32 function key
+key_f33				kf33	str	FN	KEY_F(33)	-	----E	F33 function key
+key_f34				kf34	str	FO	KEY_F(34)	-	----E	F34 function key
+key_f35				kf35	str	FP	KEY_F(35)	-	----E	F35 function key
+key_f36				kf36	str	FQ	KEY_F(36)	-	----E	F36 function key
+key_action			kact	str	kJ	KEY_ACTION	0541	----K	sent by action key
+acs_chars			acsc	str	ac	-		-	-----	graphics charset pairs, based on vt100
+alt_scancode_esc		scesa	str	S8	-		-	-----	Alternate escape for scancode emulation
+bit_image_repeat		birep	str	Xy	-		-	-----	Repeat bit image cell #1 #2 times
+bit_image_newline		binel	str	Zz	-		-	-----	Move to next row of the bit image
+bit_image_carriage_return	bicr	str	Yv	-		-	-----	Move to beginning of same row
+change_char_pitch		cpi	str	ZA	-		-	-----	Change number of characters per inch to #1
+change_line_pitch		lpi	str	ZB	-		-	-----	Change number of lines per inch to #1
+change_res_horz			chr	str	ZC	-		-	-----	Change horizontal resolution to #1
+change_res_vert			cvr	str	ZD	-		-	-----	Change vertical resolution to #1
+char_padding			rmp	str	rP	-		-	-----	like ip but when in insert mode
+char_set_names			csnm	str	Zy	-		-	-----	Produce #1'th item from list of character set names
+clear_margins			mgc	str	MC	-		-	-----	clear right and left soft margins
+clr_bol				el1	str	cb	-		-	-----	Clear to beginning of line
+code_set_init			csin	str	ci	-		-	-----	Init sequence for multiple codesets
+color_names			colornm	str	Yw	-		-	-----	Give name for color #1
+create_window			cwin	str	CW	-		-	-----	define a window #1 from #2,#3 to #4,#5
+define_bit_image_region		defbi	str	Yx	-		-	-----	Define rectangular bit image region
+define_char			defc	str	ZE	-		-	-----	Define a character #1, #2 dots wide, descender #3
+device_type			devt	str	dv	-		-	-----	Indicate language/codeset support
+dial_phone			dial	str	DI	-		-	-----	dial number #1
+display_clock			dclk	str	DK	-		-	-----	display clock
+display_pc_char			dispc	str	S1	-		-	-----	Display PC character #1
+ena_acs				enacs	str	eA	-		-	-----	enable alternate char set
+end_bit_image_region		endbi	str	Yy	-		-	-----	End a bit-image region
+enter_am_mode			smam	str	SA	-		-	-----	turn on automatic margins
+enter_doublewide_mode		swidm	str	ZF	-		-	-----	Enter double-wide mode
+enter_draft_quality		sdrfq	str	ZG	-		-	-----	Enter draft-quality mode
+enter_italics_mode		sitm	str	ZH	-		-	-----	Enter italic mode
+enter_leftward_mode		slm	str	ZI	-		-	-----	Start leftward carriage motion
+enter_micro_mode		smicm	str	ZJ	-		-	-----	Start micro-motion mode
+enter_near_letter_quality	snlq	str	ZK	-		-	-----	Enter NLQ mode
+enter_normal_quality		snrmq	str	ZL	-		-	-----	Enter normal-quality mode
+enter_pc_charset_mode		smpch	str	S2	-		-	-----	Enter PC character display mode
+enter_scancode_mode		smsc	str	S4	-		-	-----	Enter PC scancode mode
+enter_shadow_mode		sshm	str	ZM	-		-	-----	Enter shadow-print mode
+enter_subscript_mode		ssubm	str	ZN	-		-	-----	Enter subscript mode
+enter_superscript_mode		ssupm	str	ZO	-		-	-----	Enter superscript mode
+enter_upward_mode		sum	str	ZP	-		-	-----	Start upward carriage motion
+enter_xon_mode			smxon	str	SX	-		-	-----	turn on xon/xoff handshaking
+exit_am_mode			rmam	str	RA	-		-	-----	turn off automatic margins
+exit_doublewide_mode		rwidm	str	ZQ	-		-	-----	End double-wide mode
+exit_italics_mode		ritm	str	ZR	-		-	-----	End italic mode
+exit_leftward_mode		rlm	str	ZS	-		-	-----	End left-motion mode
+exit_micro_mode			rmicm	str	ZT	-		-	-----	End micro-motion mode
+exit_pc_charset_mode		rmpch	str	S3	-		-	-----	Exit PC character display mode
+exit_scancode_mode		rmsc	str	S5	-		-	-----	Exit PC scancode mode
+exit_shadow_mode		rshm	str	ZU	-		-	-----	End shadow-print mode
+exit_subscript_mode		rsubm	str	ZV	-		-	-----	End subscript mode
+exit_superscript_mode		rsupm	str	ZW	-		-	-----	End superscript mode
+exit_upward_mode		rum	str	ZX	-		-	-----	End reverse character motion
+exit_xon_mode			rmxon	str	RX	-		-	-----	turn off xon/xoff handshaking
+fixed_pause			pause	str	PA	-		-	-----	pause for 2-3 seconds
+flash_hook			hook	str	fh	-		-	-----	flash switch hook
+get_mouse			getm	str	Gm	-		-	-----	Curses should get button events, parameter #1 not documented.
+goto_window			wingo	str	WG	-		-	-----	go to window #1
+hangup				hup	str	HU	-		-	-----	hang-up phone
+initialize_color		initc	str	Ic	-		-	-----	initialize color #1 to (#2,#3,#4)
+initialize_pair			initp	str	Ip	-		-	-----	Initialize color pair #1 to fg=(#2,#3,#4), bg=(#5,#6,#7)
+key_beg				kbeg	str	@1	KEY_BEG		0542	-----	begin key
+key_btab			kcbt	str	kB	KEY_BTAB	0632	-----	back-tab key
+key_cancel			kcan	str	@2	KEY_CANCEL	0543	-----	cancel key
+key_close			kclo	str	@3	KEY_CLOSE	0544	-----	close key
+key_copy			kcpy	str	@5	KEY_COPY	0546	-----	copy key
+key_create			kcrt	str	@6	KEY_CREATE	0547	-----	create key
+key_enter			kent	str	@8	KEY_ENTER	0527	-----	enter/send key
+key_exit			kext	str	@9	KEY_EXIT	0551	-----	exit key
+key_f37				kf37	str	FR	KEY_F(37)	-	----E	F37 function key
+key_f38				kf38	str	FS	KEY_F(38)	-	----E	F38 function key
+key_f39				kf39	str	FT	KEY_F(39)	-	----E	F39 function key
+key_f40				kf40	str	FU	KEY_F(40)	-	----E	F40 function key
+key_f41				kf41	str	FV	KEY_F(41)	-	----E	F41 function key
+key_f42				kf42	str	FW	KEY_F(42)	-	----E	F42 function key
+key_f43				kf43	str	FX	KEY_F(43)	-	----E	F43 function key
+key_f44				kf44	str	FY	KEY_F(44)	-	----E	F44 function key
+key_f45				kf45	str	FZ	KEY_F(45)	-	----E	F45 function key
+key_f46				kf46	str	Fa	KEY_F(46)	-	----E	F46 function key
+key_f47				kf47	str	Fb	KEY_F(47)	-	----E	F47 function key
+key_f48				kf48	str	Fc	KEY_F(48)	-	----E	F48 function key
+key_f49				kf49	str	Fd	KEY_F(49)	-	----E	F49 function key
+key_f50				kf50	str	Fe	KEY_F(50)	-	----E	F50 function key
+key_f51				kf51	str	Ff	KEY_F(51)	-	----E	F51 function key
+key_f52				kf52	str	Fg	KEY_F(52)	-	----E	F52 function key
+key_f53				kf53	str	Fh	KEY_F(53)	-	----E	F53 function key
+key_f54				kf54	str	Fi	KEY_F(54)	-	----E	F54 function key
+key_f55				kf55	str	Fj	KEY_F(55)	-	----E	F55 function key
+key_f56				kf56	str	Fk	KEY_F(56)	-	----E	F56 function key
+key_f57				kf57	str	Fl	KEY_F(57)	-	----E	F57 function key
+key_f58				kf58	str	Fm	KEY_F(58)	-	----E	F58 function key
+key_f59				kf59	str	Fn	KEY_F(59)	-	----E	F59 function key
+key_f60				kf60	str	Fo	KEY_F(60)	-	----E	F60 function key
+key_f61				kf61	str	Fp	KEY_F(61)	-	----E	F61 function key
+key_f62				kf62	str	Fq	KEY_F(62)	-	----E	F62 function key
+key_f63				kf63	str	Fr	KEY_F(63)	-	----E	F63 function key
+key_find			kfnd	str	@0	KEY_FIND	0552	-----	find key
+key_mark			kmrk	str	%2	KEY_MARK	0554	-----	mark key
+key_message			kmsg	str	%3	KEY_MESSAGE	0555	-----	message key
+key_mouse			kmous	str	Km	KEY_MOUSE	0631	-----	Mouse event has occurred
+key_move			kmov	str	%4	KEY_MOVE	0556	-----	move key
+key_next			knxt	str	%5	KEY_NEXT	0557	-----	next key
+key_open			kopn	str	%6	KEY_OPEN	0560	-----	open key
+key_options			kopt	str	%7	KEY_OPTIONS	0561	-----	options key
+key_previous			kprv	str	%8	KEY_PREVIOUS	0562	-----	previous key
+key_print			kprt	str	%9	KEY_PRINT	0532	-----	print key
+key_redo			krdo	str	%0	KEY_REDO	0563	-----	redo key
+key_reference			kref	str	&1	KEY_REFERENCE	0564	-----	reference key
+key_refresh			krfr	str	&2	KEY_REFRESH	0565	-----	refresh key
+key_replace			krpl	str	&3	KEY_REPLACE	0566	-----	replace key
+key_restart			krst	str	&4	KEY_RESTART	0567	-----	restart key
+key_resume			kres	str	&5	KEY_RESUME	0570	-----	resume key
+key_save			ksav	str	&6	KEY_SAVE	0571	-----	save key
+key_sbeg			kBEG	str	&9	KEY_SBEG	0572	-----	shifted begin key
+key_scancel			kCAN	str	&0	KEY_SCANCEL	0573	-----	shifted cancel key
+key_scommand			kCMD	str	*1	KEY_SCOMMAND	0574	-----	shifted command key
+key_scopy			kCPY	str	*2	KEY_SCOPY	0575	-----	shifted copy key
+key_screate			kCRT	str	*3	KEY_SCREATE	0576	-----	shifted create key
+key_sdc				kDC	str	*4	KEY_SDC		0577	-----	shifted delete-character key
+key_sdl				kDL	str	*5	KEY_SDL		0600	-----	shifted delete-line key
+key_send			kEND	str	*7	KEY_SEND	0602	-----	shifted end key
+key_seol			kEOL	str	*8	KEY_SEOL	0603	-----	shifted clear-to-end-of-line key
+key_sexit			kEXT	str	*9	KEY_SEXIT	0604	-----	shifted exit key
+key_sfind			kFND	str	*0	KEY_SFIND	0605	-----	shifted find key
+key_shelp			kHLP	str	#1	KEY_SHELP	0606	-----	shifted help key
+key_shome			kHOM	str	#2	KEY_SHOME	0607	-----	shifted home key
+key_sic				kIC	str	#3	KEY_SIC		0610	-----	shifted insert-character key
+key_sleft			kLFT	str	#4	KEY_SLEFT	0611	-----	shifted left-arrow key
+key_smessage			kMSG	str	%a	KEY_SMESSAGE	0612	-----	shifted message key
+key_smove			kMOV	str	%b	KEY_SMOVE	0613	-----	shifted move key
+key_snext			kNXT	str	%c	KEY_SNEXT	0614	-----	shifted next key
+key_soptions			kOPT	str	%d	KEY_SOPTIONS	0615	-----	shifted options key
+key_sprevious			kPRV	str	%e	KEY_SPREVIOUS	0616	-----	shifted previous key
+key_sprint			kPRT	str	%f	KEY_SPRINT	0617	-----	shifted print key
+key_sredo			kRDO	str	%g	KEY_SREDO	0620	-----	shifted redo key
+key_sreplace			kRPL	str	%h	KEY_SREPLACE	0621	-----	shifted replace key
+key_sright			kRIT	str	%i	KEY_SRIGHT	0622	-----	shifted right-arrow key
+key_srsume			kRES	str	%j	KEY_SRSUME	0623	-----	shifted resume key
+key_ssave			kSAV	str	!1	KEY_SSAVE	0624	-----	shifted save key
+key_ssuspend			kSPD	str	!2	KEY_SSUSPEND	0625	-----	shifted suspend key
+key_sundo			kUND	str	!3	KEY_SUNDO	0626	-----	shifted undo key
+key_suspend			kspd	str	&7	KEY_SUSPEND	0627	-----	suspend key
+key_undo			kund	str	&8	KEY_UNDO	0630	-----	undo key
+label_format			fln	str	Lf	-		-	-----	label format
+label_off			rmln	str	LF	-		-	-----	turn off soft labels
+label_on			smln	str	LO	-		-	-----	turn on soft labels
+micro_column_address		mhpa	str	ZY	-		-	-----	Like column_address in micro mode
+micro_down			mcud1	str	ZZ	-		-	-----	Like cursor_down in micro mode
+micro_left			mcub1	str	Za	-		-	-----	Like cursor_left in micro mode
+micro_right			mcuf1	str	Zb	-		-	-----	Like cursor_right in micro mode
+micro_row_address		mvpa	str	Zc	-		-	-----	Like row_address #1 in micro mode
+micro_up			mcuu1	str	Zd	-		-	-----	Like cursor_up in micro mode
+mouse_info			minfo	str	Mi	-		-	-----	Mouse status information
+order_of_pins			porder	str	Ze	-		-	-----	Match software bits to print-head pins
+orig_colors			oc	str	oc	-		-	-----	Set all color pairs to the original ones
+orig_pair			op	str	op	-		-	-----	Set default pair to its original value
+parm_down_micro			mcud	str	Zf	-		-	-----	Like parm_down_cursor in micro mode
+parm_left_micro			mcub	str	Zg	-		-	-----	Like parm_left_cursor in micro mode
+parm_right_micro		mcuf	str	Zh	-		-	-----	Like parm_right_cursor in micro mode
+parm_up_micro			mcuu	str	Zi	-		-	-----	Like parm_up_cursor in micro mode
+pc_term_options			pctrm	str	S6	-		-	-----	PC terminal options
+pkey_plab			pfxl	str	xl	-		-	-----	Program function key #1 to type string #2 and show string #3
+plab_norm			pln	str	pn	-		-	-----	program label #1 to show string #2
+pulse				pulse	str	PU	-		-	-----	select pulse dialing
+quick_dial			qdial	str	QD	-		-	-----	dial number #1 without checking
+req_for_input			rfi	str	RF	-		-	-----	send next input char (for ptys)
+req_mouse_pos			reqmp	str	RQ	-		-	-----	Request mouse position
+remove_clock			rmclk	str	RC	-		-	-----	remove clock
+scancode_escape			scesc	str	S7	-		-	-----	Escape for scancode emulation
+select_char_set			scs	str	Zj	-		-	-----	Select character set, #1
+set0_des_seq			s0ds	str	s0	-		-	-----	Shift to codeset 0 (EUC set 0, ASCII)
+set1_des_seq			s1ds	str	s1	-		-	-----	Shift to codeset 1
+set2_des_seq			s2ds	str	s2	-		-	-----	Shift to codeset 2
+set3_des_seq			s3ds	str	s3	-		-	-----	Shift to codeset 3
+set_a_background		setab	str	AB	-		-	-----	Set background color to #1, using ANSI escape
+set_a_foreground		setaf	str	AF	-		-	-----	Set foreground color to #1, using ANSI escape
+set_background			setb	str	Sb	-		-	-----	Set background color #1
+set_bottom_margin		smgb	str	Zk	-		-	-----	Set bottom margin at current line
+set_bottom_margin_parm		smgbp	str	Zl	-		-	-----	Set bottom margin at line #1 or (if smgtp is not given) #2 lines from bottom
+set_clock			sclk	str	SC	-		-	-----	set clock, #1 hrs #2 mins #3 secs
+set_color_band		setcolor	str	Yz	-		-	-----	Change to ribbon color #1
+set_color_pair			scp	str	sp	-		-	-----	Set current color pair to #1
+set_foreground			setf	str	Sf	-		-	-----	Set foreground color #1
+set_left_margin			smgl	str	ML	-		-	-----	set left soft margin at current column.	 (ML is not in BSD termcap).
+set_left_margin_parm		smglp	str	Zm	-		-	-----	Set left (right) margin at column #1
+set_lr_margin			smglr	str	ML	-		-	-----	Set both left and right margins to #1, #2.  (ML is not in BSD termcap).
+set_page_length			slines	str	YZ	-		-	-----	Set page length to #1 lines
+set_right_margin		smgr	str	MR	-		-	-----	set right soft margin at current column
+set_right_margin_parm		smgrp	str	Zn	-		-	-----	Set right margin at column #1
+set_tb_margin			smgtb	str	MT	-		-	-----	Sets both top and bottom margins to #1, #2
+set_top_margin			smgt	str	Zo	-		-	-----	Set top margin at current line
+set_top_margin_parm		smgtp	str	Zp	-		-	-----	Set top (bottom) margin at row #1
+start_bit_image			sbim	str	Zq	-		-	-----	Start printing bit image graphics
+start_char_set_def		scsd	str	Zr	-		-	-----	Start character set definition #1, with #2 characters in the set
+stop_bit_image			rbim	str	Zs	-		-	-----	Stop printing bit image graphics
+stop_char_set_def		rcsd	str	Zt	-		-	-----	End definition of character set #1
+subscript_characters		subcs	str	Zu	-		-	-----	List of subscriptable characters
+superscript_characters		supcs	str	Zv	-		-	-----	List of superscriptable characters
+these_cause_cr			docr	str	Zw	-		-	-----	Printing any of these characters causes CR
+tone				tone	str	TO	-		-	-----	select touch tone dialing
+user0				u0	str	u0	-		-	-----	User string #0
+user1				u1	str	u1	-		-	-----	User string #1
+user2				u2	str	u2	-		-	-----	User string #2
+user3				u3	str	u3	-		-	-----	User string #3
+user4				u4	str	u4	-		-	-----	User string #4
+user5				u5	str	u5	-		-	-----	User string #5
+user6				u6	str	u6	-		-	-----	User string #6
+user7				u7	str	u7	-		-	-----	User string #7
+user8				u8	str	u8	-		-	-----	User string #8
+user9				u9	str	u9	-		-	-----	User string #9
+wait_tone			wait	str	WA	-		-	-----	wait for dial-tone
+xoff_character			xoffc	str	XF	-		-	-----	XOFF character
+xon_character			xonc	str	XN	-		-	-----	XON character
+zero_motion			zerom	str	Zx	-		-	-----	No motion for subsequent character
+set_pglen_inch			slength	str	YI	-		-	-----	Set page length to #1 hundredth of an inch (some implementations use sL for termcap).
+enter_horizontal_hl_mode	ehhlm	str	Xh	-		-	-----	Enter horizontal highlight mode
+enter_left_hl_mode		elhlm	str	Xl	-		-	-----	Enter left highlight mode
+enter_low_hl_mode		elohlm	str	Xo	-		-	-----	Enter low highlight mode
+enter_right_hl_mode		erhlm	str	Xr	-		-	-----	Enter right highlight mode
+enter_top_hl_mode		ethlm	str	Xt	-		-	-----	Enter top highlight mode
+enter_vertical_hl_mode		evhlm	str	Xv	-		-	-----	Enter vertical highlight mode
+set_a_attributes		sgr1	str	sA	-		-	-----	Define second set of video attributes #1-#6
+#
+#
+#
+# %%-STOP-HERE-%%
+#
+# Don't move this casually!  In fact, don't move it at all unless you're
+# either doing it to add System V or XPG4 extensions, or have decided you
+# don't care about SVr4 binary compatibility.
+#
+#############################################################################
+#
+# TERMCAP EXTENSION CAPABILITIES
+#
+# The capabilities below are either obsolete or extensions on certain systems.
+# They are not used by SVR4 terminfo.  Some are used by captoinfo to translate
+# termcap sources; the rest are listed for completeness, and in case somebody
+# cares about them enough to hack in code that will translate them into
+# terminfo capabilities.
+#
+# The first part of the list is from Ross Ridge's `mytinfo' package
+# (comp.sources.unix, volume 26); the variable names and terminfo names (as
+# well as the termcap codes) match his list.
+#
+# This group of codes is not marked obsolete in 4.4BSD, but have no direct
+# terminfo equivalents.  The rs capability is specially translated to terminfo
+# r2, and vice versa, if an entry does not already have an r2.  Similarly,
+# i2 is translated to r3 if there is no r3 (because SV terminfo maps is to i2).
+# The ug capability is thrown away, but assumed to be whatever sg is if the
+# latter is nonzero and we're dumping in termcap format.
+#
+termcap_init2			OTi2	str	i2	-		-	YB---	secondary initialization string
+termcap_reset			OTrs	str	rs	-		-	YB-G-	terminal reset string
+magic_cookie_glitch_ul		OTug	num	ug	-		-	YBCGE	number of blanks left by ul
+#
+# Obsolete termcap capabilities.  Some are used for termcap translation.  The
+# code uses the 'OT' prefix we put on obsolete capabilities to suppress
+# printing them in terminfo source dumps of compiled entries.
+#
+backspaces_with_bs		OTbs	bool	bs	-		-	YBCGE	uses ^H to move left
+crt_no_scrolling		OTns	bool	ns	-		-	YBCG-	crt cannot scroll
+no_correctly_working_cr		OTnc	bool	nc	-		-	YBCG-	no way to go to start of line
+carriage_return_delay		OTdC	num	dC	-		-	YB-G-	pad needed for CR
+new_line_delay			OTdN	num	dN	-		-	YB-G-	pad needed for LF
+linefeed_if_not_lf		OTnl	str	nl	-		-	YBCGE	use to move down
+backspace_if_not_bs		OTbc	str	bc	-		-	YBCGE	move left, if not ^H
+#
+# GNU termcap library extensions.  The GNU termcap file distributed with
+# Emacs no longer uses these, but MT showed up in pre-9.0 versions of the
+# BSD termcap file.  The name clash with terminfo MT is resolved by type
+# info; MT is converted to km.
+#
+gnu_has_meta_key		OTMT	bool	MT	-		-	----E	has meta key
+# gnu_tab_width			OTtw	num	tw	-		-	----E	tab width in spaces
+#
+# GNU termcap *does* include the following extended capability,  Only the
+# now-obsolete Ann Arbor terminals used it.
+#
+# gnu_change_scroll_region	OTcS	str	cS	-		-	---GE	alternate set scrolling region
+#
+# The following comments describe capnames so ancient that I believe no
+# software uses them any longer.  Some of these have to go because they
+# clash with terminfo names in ways that cannot be resolved by type
+# information.
+#
+# These mytinfo codes are not used in the 4.4BSD curses code.  They are
+# marked obsolete in the 4.4BSD manual pages.
+#
+# There is one conflict with terminfo; ma is in both.  This conflict is
+# resolved by type information.
+#
+# The `ko' capability is translated by special code.  It should contain a
+# comma-separated list of capabilities for which there are corresponding keys.
+# The `kn' code is accepted but ignored.
+#
+# The `ma' capability was a 4.0BSD feature used by vi version 2.
+# It consists of pairs of characters corresponding to kl, kr, ku, kd, and kh.
+# Besides being obsolete, that interpretation conflicts with max_attributes.
+#
+# Here is a description of memory_lock_above and memory_unlock:
+# "You can 'freeze' data on the screen by turning on Memory Lock in a line of
+# text.  All lines above the cursor's current line become locked in place on
+# the screen.  Then enter data normally.  When the screen fills up, any
+# further data entered forces the first line of unfrozen line text to scroll
+# under the frozen data.  Lines scrolled off the screen are inserted into
+# memory immediately preceding the first frozen line." (from the HP 700/96
+# User's manual).  VT100/ANSI memory lock set is \E[>2h, reset is \E[>2l.
+#
+# Applications that use terminfo are supposed to behave as though xr is
+# always true.
+#
+linefeed_is_newline		OTNL	bool	NL	-		-	YB---	move down with \n
+# even_parity			OTEP	bool	EP	-		-	-B---	terminal requires even parity
+# odd_parity			OTOP	bool	OP	-		-	-B---	terminal requires odd parity
+# half_duplex			OTHD	bool	HD	-		-	-B---	terminal is half-duplex
+# lower_case_only		OTLC	bool	LC	-		-	-B---	terminal has only lower case
+# upper_case_only		OTUC	bool	UC	-		-	-B---	terminal has only upper case
+backspace_delay			OTdB	num	dB	-		-	YB-G-	padding required for ^H
+# form_feed_delay		OTdF	num	dF	-		-	-B-G-	padding required for ^L
+horizontal_tab_delay		OTdT	num	dT	-		-	YB-G-	padding required for ^I
+# vertical_tab_delay		OTdV	num	dV	-		-	-B---	padding required for ^V
+number_of_function_keys		OTkn	num	kn	-		-	-B-G-	count of function keys
+other_non_function_keys		OTko	str	ko	-		-	-B-G-	list of self-mapped keycaps
+arrow_key_map			OTma	str	ma	-		-	YBC--	map motion-keys for vi version 2
+# memory_lock_above		OTml	str	ml	-		-	-B---	lock visible screen memory above the current line
+# memory_unlock			OTmu	str	mu	-		-	-B---	unlock visible screen memory above the current line
+has_hardware_tabs		OTpt	bool	pt	-		-	YB---	has 8-char tabs invoked with ^I
+return_does_clr_eol		OTxr	bool	xr	-		-	YB---	return clears the line
+# tek_4025_insert_line		OTxx	bool	xx	-		-	-BC--	Tektronix 4025 insert-line glitch
+#
+# mytinfo described this as a termcap capability, but it is not listed in the
+# 4.4BSD man pages, and not found in the 4.4BSD termcap file.  The ncurses
+# package, like System V, behaves as though it is always true.
+#
+# rind_only_at_top		OTxq	bool	xq	-		-	-----	reverse index only works from top line
+#
+# University of Waterloo termcap extensions (as described in mytinfo).
+# The `xl' termcap file clashes with a terminfo name; this ambiguity cannot
+# be resolved by a type check.  The descriptions are guesses from what was
+# in the mytinfo tables.
+#
+# key_interrupt_char		OTki	str	ki	-		-	-----	string set by interrupt key (?)
+# key_kill_char			OTkk	str	kk	-		-	-----	string set by kill key (?)
+# key_suspend_char		OTkz	str	kz	-		-	-----	string set by suspend key (?)
+# initialization_messy		OTxc	bool	xc	-		-	-----	initialization leaves garbage on the screen (?)
+# ind_at_bottom_does_cr		OTxl	bool	xl	-		-	-----	index does a carriage return
+#
+# Nonstandard capabilities unique to Ross Ridge's `mytinfo' package.
+# SR clashes with a terminfo name; this ambiguity cannot be resolved by a type
+# check.
+#
+# scroll_left			OTsl1	str	Sl	-		-	-----	scroll screen leftward
+# scroll_right			OTsr1	str	Sr	-		-	-----	scroll screen rightward
+# parm_scroll_left		OTsl	str	SL	-		-	-----	scroll screen leftward #1 characters
+# parm_scroll_right		OTsr	str	SR	-		-	-----	scroll screen rightward #1 characters
+#
+# The mytinfo capabilities end here.
+#
+# XENIX extensions:
+#
+# Xenix defined its own set of forms-drawing capabilities:
+#
+# cap	IBM ASCII	description             ACS         	ASCII
+# ---	-----------	--------------------    -------------	------
+# G1	191 \277 M-?	single upper right   	ACS_URCORNER
+# G2	218 \332 M-Z	single upper left	ACS_ULCORNER
+# G3	192 \300 M-@	single lower left	ACS_LLCORNER
+# G4	217 \331 M-Y	single lower right	ACS_LRCORNER
+# G5	187 \273 M-;	double upper right
+# G6	201 \311 M-I	double upper left
+# G7	200 \310 M-H	double lower left
+# G8	188 \274 M-<	double lower right
+# GC	197 \305 M-E	single intersection	ACS_PLUS	_ _
+# GD	194 \302 M-B	single down-tick	ACS_TTEE	 |
+# GH	196 \304 M-D	single horizontal line	ACS_HLINE
+# GL	180 \264 M-4	single left tick	ACS_RTEE	-|
+# GR	195 \303 M-C	single right tick	ACS_LTEE	|-
+# GU	193 \301 M-A	single up tick		ACS_BTEE	_|_
+# GV	179 \263 M-3	single vertical line	ACS_VLINE
+# Gc	206 \316 M-N	double intersection
+# Gd	203 \313 M-K	double down tick
+# Gh	205 \315 M-M	double horizontal line
+# Gl	204 \204 M-L	double left tick
+# Gr	185 \271 M-9	double right tick
+# Gu	202 \312 M-J	double up tick
+# Gv	186 \272 M-:	double vertical line
+#
+# The compiler will translate the single-line caps and discard the others
+# (via IGNORE aliases further down).  We don't want to do normal pad
+# translation on these, they're often single-character printable ASCII
+# strings that happen to be numerics.  There's awk code in parametrized.sh
+# that detects the acs_ prefix and uses it to suppress pad translation.
+# These terminfo names are invented.
+#
+acs_ulcorner			OTG2	str	G2	-		-	-----	single upper left
+acs_llcorner			OTG3	str	G3	-		-	-----	single lower left
+acs_urcorner			OTG1	str	G1	-		-	-----	single upper right
+acs_lrcorner			OTG4	str	G4	-		-	-----	single lower right
+acs_ltee			OTGR	str	GR	-		-	-----	tee pointing right
+acs_rtee			OTGL	str	GL	-		-	-----	tee pointing left
+acs_btee			OTGU	str	GU	-		-	-----	tee pointing up
+acs_ttee			OTGD	str	GD	-		-	-----	tee pointing down
+acs_hline			OTGH	str	GH	-		-	-----	single horizontal line
+acs_vline			OTGV	str	GV	-		-	-----	single vertical line
+acs_plus			OTGC	str	GC	-		-	-----	single intersection
+#
+#############################################################################
+#
+# TERMINFO EXTENSION CAPABILITIES
+#
+# (see Caps-ncurses for the complete set of comments)
+#
+memory_lock			meml	str	ml	-		-	----K	lock memory above cursor
+memory_unlock			memu	str	mu	-		-	----K	unlock memory
+#
+#############################################################################
diff --git a/include/Caps.uwin b/include/Caps.uwin
new file mode 100644
index 0000000..af47de9
--- /dev/null
+++ b/include/Caps.uwin
@@ -0,0 +1,796 @@
+##############################################################################
+# Copyright 2019-2020,2021 Thomas E. Dickey                                  #
+# Copyright 2001-2015,2016 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.                                                             #
+##############################################################################
+#
+# Author: Thomas Dickey
+#
+# $Id: Caps.uwin,v 1.15 2021/10/08 07:55:48 tom Exp $
+#
+# This is an adaptation of ncurses' termcap/terminfo capability table, which
+# is designed to align with U/Win's terminfo.
+#
+# This table is used to generate initializers for tables that drive tic,
+# infocmp, and the library compilation code used to support the termcap
+# compatibility hack.  It is also used to generate the tabular portion of the
+# terminfo(5) man page; lines beginning with `#%' are passed through to become
+# the terminfo table.
+#
+# This file has three major sections; a standard-capabilities table, two
+# extension-capability tables, and a section of aliases declarations.
+# The first two have the same format, as follows:
+#
+# FILE FORMAT
+#
+# Column 1: terminfo variable name
+# Column 2: terminfo capability name
+# Column 3: capability type (boolean, numeric, or string)
+# Column 4: termcap capability name
+# Column 5: KEY_xxx name, if any, `-' otherwise
+# Column 6: value for KEY_xxx name, if any, `-' otherwise
+# Column 7: Lead with `Y' if capability should be emitted in termcap
+#           translations, `-' otherwise
+# Column 8: capability description
+#
+# The codes following [Y-] in column 7 describe the versions of termcap which
+# use the given capability.  This information is not used by the curses library
+# proper; rather, it is there to help the terminfo maintainer avoid emitting
+# termcap entry translations that are more than 1023 bytes long (and tank a
+# lot of old termcap-using programs).  The codes read as follows:
+#	B = mentioned in the BSD man page for 4.4BSD curses
+#	C = used by the 4.4BSD curses library
+#	G = mentioned in the documentation for GNU termcap
+#	E = used by GNU Emacs
+#	K = remove this terminfo capability when translating to standard format
+# The important codes are C and E.  A cap with C or E should be preserved in
+# translation if possible.  The problem is that preserving all such caps may
+# lead to some termcap translations being too long.  The termcap maintainer
+# has a bit of a juggling act to do...potential problem cases are marked with
+# an asterisk (*).
+#
+# The aliases section has the following format:
+#
+# Column 1: either `capalias' or `infoalias'
+# Column 2: name to be aliased
+# Column 3: what name it should translate to.  The name IGNORE means it
+#           should be discarded with a warning message.
+# Column 4: name of the extension set (used for compiler warning messages)
+# Column 5: capability description (usually an associated terminfo variable)
+#
+# HANDLING TERMCAP AND TERMINFO EXTENSIONS
+#
+# There are basically five different ways to handle termcap and terminfo
+# extensions:
+#
+# 1. Don't list the capname here, or list it but comment it out (the latter
+# is preferable; someone might want to handle it in the future).  If you do
+# this, the capability will be treated as unknown and raise a warning from
+# the compiler.
+#
+# 2. Alias it.  This is appropriate if the capability has the same meaning
+# as an already-supported one.  The compiler will handle aliasing, emitting
+# an appropriate informational message whenever an alias fires.
+#
+# 3. List it in the standard table.  You almost certainly do *not* want
+# to do this -- the capabilities in that one, and their order, have been
+# carefully chosen to be SVr4-binary-compatible when they're written out
+# as a terminfo object, and breaking this would be bad.  It is up to the ncurses
+# library what to do with the terminfo data after it is read in.
+#
+# 4. List it in the aliases table with an IGNORE target field.  If you
+# do this, the capability will be ignored on input (though the user will
+# get a warning message about it).
+#
+# 5. List it in the extensions table. If you do this, the compiler will
+# silently accept the capability, but the curses library proper will never
+# see it (because it won't be written out as part of the terminfo object
+# format).  It is up to you what you have the compiler do with it.
+#
+# There are two opposite reasons to choose option 5.  One is when you want
+# to eat the capability silently and discard it when doing translations
+# to terminfo with tic -I.  Some very old obsolete BSD caps like :kn: are
+# in this class.  Nothing will ever use them again.
+#
+# More usually, you want the compiler to try to deduce something from the
+# capability value that it can use to translate it into your output format.
+# You'll need to write custom code, probably in postprocess_termcap() or
+# postprocess_terminfo(), to handle the translation.
+#
+# CONTROLLING ENTRY LENGTH
+#
+# Notes on specific elisions made to fit translations within 1023 bytes:
+#
+# Machines with IBM PC-like keyboards want to be able to define the following
+# keys: key_npage, key_ppage, key_home, key_ll (which is used for in termcap-
+# only environments for End or Home-Down), key_dc, and key_ic.  This is also
+# the set of keys the `joe' editor will be upset if it can't see.  So don't
+# trim those out of the set to be translated to termcap, or various users of
+# the termcap file will become irate.
+#
+# It might look tempting to leave those long init strings out of translations.
+# We can't do it (yet); 4.4BSD tput and tset use them.
+#
+# We retain the sgr capability in translation in spite of the fact that neither
+# 4.4BSD nor GNU Emacs uses it, because (a) some entry naming distinctions are
+# hard to understand without it, and (b) the entries in which it is long tend
+# to be older types that don't use up a lot of string space on function keys.
+# The tic(1) translation code will complain and elide it if it makes a critical
+# difference (there is special code in tic to recognize this situation).
+#
+# Yes, BSD tset(1) uses hpa.  We elide hpa/vpa anyway because the motion
+# optimizer in BSD curses didn't use them.  This omission seems to be the
+# single most effective one, it shortened the resolved length of all thirteen
+# problem entries in the 9.9.0 version of the terminfo master below critical.
+#
+# It would be nice to keep f11 and f12 for Emacs use, but a couple of termcap
+# translations go back over critical if we do this.  As 4.4BSD curses fades
+# into history and GNU termcap's application base shrinks towards being GNU
+# Emacs only, we'll probably elide out some BSD-only capabilities in order
+# to buy space for non-essentials Emacs is still using.  Capabilities high
+# on that hit list: rc, sc, uc.
+#
+#############################################################################
+#
+# STANDARD CAPABILITIES
+#
+#%The following is a complete table of the capabilities included in a
+#%terminfo description block and available to terminfo-using code.  In each
+#%line of the table,
+#%
+#%The \fBvariable\fR is the name by which the programmer (at the terminfo level)
+#%accesses the capability.
+#%
+#%The \fBcapname\fR is the short name used in the text of the database,
+#%and is used by a person updating the database.
+#%Whenever possible, capnames are chosen to be the same as or similar to
+#%the ANSI X3.64-1979 standard (now superseded by ECMA-48, which uses
+#%identical or very similar names).  Semantics are also intended to match
+#%those of the specification.
+#%
+#%The termcap code is the old
+#%.B termcap
+#%capability name (some capabilities are new, and have names which termcap
+#%did not originate).
+#%.P
+#%Capability names have no hard length limit, but an informal limit of 5
+#%characters has been adopted to keep them short and to allow the tabs in
+#%the source file
+#%.B Caps
+#%to line up nicely.
+#%
+#%Finally, the description field attempts to convey the semantics of the
+#%capability.  You may find some codes in the description field:
+#%.TP
+#%(P)
+#%indicates that padding may be specified
+#%.TP
+#%#[1-9]
+#%in the description field indicates that the string is passed
+#%through \fBtparm\fP(3X) with parameters as given (#\fIi\fP).
+#%.IP
+#%If no parameters are listed in the description,
+#%passing the string through \fBtparm\fP(3X) may give unexpected results,
+#%e.g., if it contains percent (%%) signs.
+#%.TP
+#%(P*)
+#%indicates that padding may vary in proportion to the number of
+#%lines affected
+#%.TP
+#%(#\d\fIi\fP\u)
+#%indicates the \fIi\fP\uth\d parameter.
+#%
+#%.PP
+#% These are the boolean capabilities:
+#%
+#%.na
+#%.TS H
+#%center expand;
+#%c l l c
+#%c l l c
+#%lw25 lw6 lw2 lw20.
+#%\fBVariable	Cap-	TCap	Description\fR
+#%\fBBooleans	name	Code\fR
+auto_left_margin		bw	bool	bw	-	-	YB-G-	cub1 wraps from column 0 to last column
+auto_right_margin		am	bool	am	-	-	YBCGE	terminal has automatic margins
+no_esc_ctlc			xsb	bool	xb	-	-	YBCG-	beehive (f1=escape, f2=ctrl C)
+ceol_standout_glitch		xhp	bool	xs	-	-	YBCGE	standout not erased by overwriting (hp)
+eat_newline_glitch		xenl	bool	xn	-	-	YBCGE	newline ignored after 80 cols (concept)
+erase_overstrike		eo	bool	eo	-	-	YBCG-	can erase overstrikes with a blank
+generic_type			gn	bool	gn	-	-	YB-G-	generic line type
+hard_copy			hc	bool	hc	-	-	YBCG-	hardcopy terminal
+has_meta_key			km	bool	km	-	-	YB-GE	Has a meta key (i.e., sets 8th-bit)
+has_status_line			hs	bool	hs	-	-	YB-G-	has extra status line
+insert_null_glitch		in	bool	in	-	-	YBCGE	insert mode distinguishes nulls
+memory_above			da	bool	da	-	-	YBCG-	display may be retained above the screen
+memory_below			db	bool	db	-	-	YB-GE	display may be retained below the screen
+move_insert_mode		mir	bool	mi	-	-	YBCGE	safe to move while in insert mode
+move_standout_mode		msgr	bool	ms	-	-	YBCGE	safe to move while in standout mode
+over_strike			os	bool	os	-	-	YBCG-	terminal can overstrike
+status_line_esc_ok		eslok	bool	es	-	-	YB-G-	escape can be used on the status line
+dest_tabs_magic_smso		xt	bool	xt	-	-	YBCGE	tabs destructive, magic so char (t1061)
+tilde_glitch			hz	bool	hz	-	-	YB-GE	cannot print ~'s (Hazeltine)
+transparent_underline		ul	bool	ul	-	-	YBCGE	underline character overstrikes
+xon_xoff			xon	bool	xo	-	-	YB---	terminal uses xon/xoff handshaking
+needs_xon_xoff			nxon	bool	nx	-	-	-----	padding will not work, xon/xoff required
+prtr_silent			mc5i	bool	5i	-	-	-----	printer will not echo on screen
+hard_cursor			chts	bool	HC	-	-	-----	cursor is hard to see
+non_rev_rmcup			nrrmc	bool	NR	-	-	-----	smcup does not reverse rmcup
+no_pad_char			npc	bool	NP	-	-	-----	pad character does not exist
+non_dest_scroll_region		ndscr	bool	ND	-	-	-----	scrolling region is non-destructive
+back_color_erase		bce	bool	ut	-	-	-----	screen erased with background color
+can_change			ccc	bool	cc	-	-	-----	terminal can re-define existing colors
+hue_lightness_saturation	hls	bool	hl	-	-	-----	terminal uses only HLS color notation (Tektronix)
+#%.TE
+#%.ad
+#%
+#%These are the numeric capabilities:
+#%
+#%.na
+#%.TS H
+#%center expand;
+#%c l l c
+#%c l l c
+#%lw25 lw6 lw2 lw20.
+#%\fBVariable	Cap-	TCap	Description\fR
+#%\fBNumeric	name	Code\fR
+columns				cols	num	co	-	-	YBCGE	number of columns in a line
+init_tabs			it	num	it	-	-	YB-G-	tabs initially every # spaces
+lines				lines	num	li	-	-	YBCGE	number of lines on screen or page
+lines_of_memory			lm	num	lm	-	-	YB-G-	lines of memory if > line. 0 means varies
+magic_cookie_glitch		xmc	num	sg	-	-	YBCGE	number of blank characters left by smso or rmso
+padding_baud_rate		pb	num	pb	-	-	YB-GE	lowest baud rate where padding needed
+virtual_terminal		vt	num	vt	-	-	YB---	virtual terminal number (CB/unix)
+width_status_line		wsl	num	ws	-	-	YB-G-	number of columns in status line
+num_labels			nlab	num	Nl	-	-	-----	number of labels on screen
+label_height			lh	num	lh	-	-	-----	rows in each label
+label_width			lw	num	lw	-	-	-----	columns in each label
+buttons				btns	num	BT	-	-	-----	number of buttons on mouse
+#max_attributes			ma	num	ma	-	-	YBC--	maximum combined attributes terminal can handle
+#maximum_windows		wnum	num	MW	-	-	-----	maximum number of defineable windows
+# These came in with SVr4's color support
+max_colors			colors	num	Co	-	-	-----	maximum number of colors on screen
+max_pairs			pairs	num	pa	-	-	-----	maximum number of color-pairs on the screen
+no_color_video			ncv	num	NC	-	-	-----	video attributes that cannot be used with colors
+#%.TE
+#%.ad
+#%
+#%The following numeric capabilities are present in the SVr4.0 term structure,
+#%but are not yet documented in the man page.  They came in with SVr4's
+#%printer support.
+#%
+#%.na
+#%
+#%These are the string capabilities:
+#%
+#%.na
+#%.TS H
+#%center expand;
+#%c l l c
+#%c l l c
+#%lw25 lw6 lw2 lw20.
+#%\fBVariable	Cap-	TCap	Description\fR
+#%\fBString	name	Code\fR
+back_tab			cbt	str	bt	-		-	YBCGE	back tab (P)
+bell				bel	str	bl	-		-	YB-GE	audible signal (bell) (P)
+carriage_return			cr	str	cr	-		-	YBCGE	carriage return (P*) (P*)
+change_scroll_region		csr	str	cs	-		-	YBCGE	change region to line #1 to line #2 (P)
+clear_all_tabs			tbc	str	ct	-		-	YB-G-	clear all tab stops (P)
+clear_screen			clear	str	cl	-		-	YBCGE	clear screen and home cursor (P*)
+clr_eol				el	str	ce	-		-	YBCGE	clear to end of line (P)
+clr_eos				ed	str	cd	-		-	YBCGE	clear to end of screen (P*)
+column_address			hpa	str	ch	-		-	-B-GE*	horizontal position #1, absolute (P)
+command_character		cmdch	str	CC	-		-	YB-G-	terminal settable cmd character in prototype !?
+cursor_address			cup	str	cm	-		-	YBCGE	move to row #1 columns #2
+cursor_down			cud1	str	do	-		-	YBCGE	down one line
+cursor_home			home	str	ho	-		-	YBCGE	home cursor (if no cup)
+cursor_invisible		civis	str	vi	-		-	YB-G-	make cursor invisible
+cursor_left			cub1	str	le	-		-	YBCGE	move left one space
+cursor_mem_address		mrcup	str	CM	-		-	YB-G-	memory relative cursor addressing, move to row #1 columns #2
+cursor_normal			cnorm	str	ve	-		-	YBCGE	make cursor appear normal (undo civis/cvvis)
+cursor_right			cuf1	str	nd	-		-	YBCGE	non-destructive space (move right one space)
+cursor_to_ll			ll	str	ll	-		-	YBCGE	last line, first column (if no cup)
+cursor_up			cuu1	str	up	-		-	YBCGE	up one line
+cursor_visible			cvvis	str	vs	-		-	YBCGE	make cursor very visible
+delete_character		dch1	str	dc	-		-	YBCGE	delete character (P*)
+delete_line			dl1	str	dl	-		-	YBCGE	delete line (P*)
+dis_status_line			dsl	str	ds	-		-	YB-G-	disable status line
+down_half_line			hd	str	hd	-		-	YB-G-	half a line down
+enter_alt_charset_mode		smacs	str	as	-		-	YB-G-	start alternate character set (P)
+enter_blink_mode		blink	str	mb	-		-	YB-G-	turn on blinking
+enter_bold_mode			bold	str	md	-		-	YB-G-	turn on bold (extra bright) mode
+enter_ca_mode			smcup	str	ti	-		-	YBCGE	string to start programs using cup
+enter_delete_mode		smdc	str	dm	-		-	YBCGE	enter delete mode
+enter_dim_mode			dim	str	mh	-		-	YB-G-	turn on half-bright mode
+enter_insert_mode		smir	str	im	-		-	YBCGE	enter insert mode
+enter_secure_mode		invis	str	mk	-		-	-B-G-*	turn on blank mode (characters invisible)
+enter_protected_mode		prot	str	mp	-		-	-B-G-*	turn on protected mode
+enter_reverse_mode		rev	str	mr	-		-	YB-G-	turn on reverse video mode
+enter_standout_mode		smso	str	so	-		-	YBCGE	begin standout mode
+enter_underline_mode		smul	str	us	-		-	YBCGE	begin underline mode
+erase_chars			ech	str	ec	-		-	YB-G-	erase #1 characters (P)
+exit_alt_charset_mode		rmacs	str	ae	-		-	YB-G-	end alternate character set (P)
+exit_attribute_mode		sgr0	str	me	-		-	YB-GE	turn off all attributes
+exit_ca_mode			rmcup	str	te	-		-	YBCGE	strings to end programs using cup
+exit_delete_mode		rmdc	str	ed	-		-	YBCGE	end delete mode
+exit_insert_mode		rmir	str	ei	-		-	YBCGE	exit insert mode
+exit_standout_mode		rmso	str	se	-		-	YBCGE	exit standout mode
+exit_underline_mode		rmul	str	ue	-		-	YBCGE	exit underline mode
+flash_screen			flash	str	vb	-		-	YBCGE	visible bell (may not move cursor)
+form_feed			ff	str	ff	-		-	YB-G-	hardcopy terminal page eject (P*)
+from_status_line		fsl	str	fs	-		-	YB-G-	return from status line
+init_1string			is1	str	i1	-		-	YB-G-	initialization string
+init_2string			is2	str	is	-		-	YB-G-	initialization string
+init_3string			is3	str	i3	-		-	YB-G-	initialization string
+init_file			if	str	if	-		-	YB-G-	name of initialization file
+insert_character		ich1	str	ic	-		-	YBCGE	insert character (P)
+insert_line			il1	str	al	-		-	YBCGE	insert line (P*)
+insert_padding			ip	str	ip	-		-	YBCGE	insert padding after inserted character
+key_backspace			kbs	str	kb	KEY_BACKSPACE	0407	YB-G-	backspace key
+key_catab			ktbc	str	ka	KEY_CATAB	0526	-B-G-*	clear-all-tabs key
+key_clear			kclr	str	kC	KEY_CLEAR	0515	-B-G-*	clear-screen or erase key
+key_ctab			kctab	str	kt	KEY_CTAB	0525	-B-G-*	clear-tab key
+key_dc				kdch1	str	kD	KEY_DC		0512	YB-G-	delete-character key
+key_dl				kdl1	str	kL	KEY_DL		0510	-B-G-*	delete-line key
+key_down			kcud1	str	kd	KEY_DOWN	0402	YBCGE	down-arrow key
+key_eic				krmir	str	kM	KEY_EIC		0514	-B-G-*	sent by rmir or smir in insert mode
+key_eol				kel	str	kE	KEY_EOL		0517	-B-G-*	clear-to-end-of-line key
+key_eos				ked	str	kS	KEY_EOS		0516	-B-G-*	clear-to-end-of-screen key
+key_f0				kf0	str	k0	KEY_F(0)	0410	YBCGE	F0 function key
+key_f1				kf1	str	k1	KEY_F(1)	-	YBCGE	F1 function key
+key_f10				kf10	str	k;	KEY_F(10)	-	----E	F10 function key
+key_f2				kf2	str	k2	KEY_F(2)	-	YBCGE	F2 function key
+key_f3				kf3	str	k3	KEY_F(3)	-	YBCGE	F3 function key
+key_f4				kf4	str	k4	KEY_F(4)	-	YBCGE	F4 function key
+key_f5				kf5	str	k5	KEY_F(5)	-	YBCGE	F5 function key
+key_f6				kf6	str	k6	KEY_F(6)	-	YBCGE	F6 function key
+key_f7				kf7	str	k7	KEY_F(7)	-	YBCGE	F7 function key
+key_f8				kf8	str	k8	KEY_F(8)	-	YBCGE	F8 function key
+key_f9				kf9	str	k9	KEY_F(9)	-	YBCGE	F9 function key
+key_home			khome	str	kh	KEY_HOME	0406	YBCGE	home key
+key_ic				kich1	str	kI	KEY_IC		0513	YB-GE	insert-character key
+key_il				kil1	str	kA	KEY_IL		0511	-B-G-*	insert-line key
+key_left			kcub1	str	kl	KEY_LEFT	0404	YBCGE	left-arrow key
+key_ll				kll	str	kH	KEY_LL		0533	YB-G-	lower-left key (home down)
+key_npage			knp	str	kN	KEY_NPAGE	0522	YB-GE	next-page key
+key_ppage			kpp	str	kP	KEY_PPAGE	0523	YB-GE	previous-page key
+key_right			kcuf1	str	kr	KEY_RIGHT	0405	YBCGE	right-arrow key
+key_sf				kind	str	kF	KEY_SF		0520	-B-G-*	scroll-forward key
+key_sr				kri	str	kR	KEY_SR		0521	-B-G-*	scroll-backward key
+key_stab			khts	str	kT	KEY_STAB	0524	-B-G-*	set-tab key
+key_up				kcuu1	str	ku	KEY_UP		0403	YBCGE	up-arrow key
+keypad_local			rmkx	str	ke	-		-	YBCGE	leave 'keyboard_transmit' mode
+keypad_xmit			smkx	str	ks	-		-	YBCGE	enter 'keyboard_transmit' mode
+lab_f0				lf0	str	l0	-		-	-B-G-*	label on function key f0 if not f0
+lab_f1				lf1	str	l1	-		-	-B-G-*	label on function key f1 if not f1
+lab_f10				lf10	str	la	-		-	-----	label on function key f10 if not f10
+lab_f2				lf2	str	l2	-		-	-B-G-*	label on function key f2 if not f2
+lab_f3				lf3	str	l3	-		-	-B-G-*	label on function key f3 if not f3
+lab_f4				lf4	str	l4	-		-	-B-G-*	label on function key f4 if not f4
+lab_f5				lf5	str	l5	-		-	-B-G-*	label on function key f5 if not f5
+lab_f6				lf6	str	l6	-		-	-B-G-*	label on function key f6 if not f6
+lab_f7				lf7	str	l7	-		-	-B-G-*	label on function key f7 if not f7
+lab_f8				lf8	str	l8	-		-	-B-G-*	label on function key f8 if not f8
+lab_f9				lf9	str	l9	-		-	-B-G-*	label on function key f9 if not f9
+meta_off			rmm	str	mo	-		-	YB-G-*	turn off meta mode
+meta_on				smm	str	mm	-		-	YB-G-*	turn on meta mode (8th-bit on)
+newline				nel	str	nw	-		-	YB-G-*	newline (behave like cr followed by lf)
+pad_char			pad	str	pc	-		-	YBCGE	padding char (instead of null)
+parm_dch			dch	str	DC	-		-	YB-GE	delete #1 characters (P*)
+parm_delete_line		dl	str	DL	-		-	YBCGE	delete #1 lines (P*)
+parm_down_cursor		cud	str	DO	-		-	YBCGE	down #1 lines (P*)
+parm_ich			ich	str	IC	-		-	YB-GE	insert #1 characters (P*)
+parm_index			indn	str	SF	-		-	YBCG-	scroll forward #1 lines (P)
+parm_insert_line		il	str	AL	-		-	YBCGE	insert #1 lines (P*)
+parm_left_cursor		cub	str	LE	-		-	YBCGE	move #1 characters to the left (P)
+parm_right_cursor		cuf	str	RI	-		-	YBCGE	move #1 characters to the right (P*)
+parm_rindex			rin	str	SR	-		-	YBCG-	scroll back #1 lines (P)
+parm_up_cursor			cuu	str	UP	-		-	YBCGE	up #1 lines (P*)
+pkey_key			pfkey	str	pk	-		-	-B---	program function key #1 to type string #2
+pkey_local			pfloc	str	pl	-		-	-B---	program function key #1 to execute string #2
+pkey_xmit			pfx	str	px	-		-	-B---	program function key #1 to transmit string #2
+print_screen			mc0	str	ps	-		-	-B-G-*	print contents of screen
+prtr_off			mc4	str	pf	-		-	-B-G-*	turn off printer
+prtr_on				mc5	str	po	-		-	-B-G-*	turn on printer
+repeat_char			rep	str	rp	-		-	YB-GE	repeat char #1 #2 times (P*)
+reset_1string			rs1	str	r1	-		-	-B---	reset string
+reset_2string			rs2	str	r2	-		-	-B---	reset string
+reset_3string			rs3	str	r3	-		-	-B---	reset string
+reset_file			rf	str	rf	-		-	-B---	name of reset file
+restore_cursor			rc	str	rc	-		-	YBCG-	restore cursor to position of last save_cursor
+row_address			vpa	str	cv	-		-	-B-GE*	vertical position #1 absolute (P)
+save_cursor			sc	str	sc	-		-	YBCG-	save current cursor position (P)
+scroll_forward			ind	str	sf	-		-	YBCGE	scroll text up (P)
+scroll_reverse			ri	str	sr	-		-	YBCGE	scroll text down (P)
+set_attributes			sgr	str	sa	-		-	YB-G-	define video attributes #1-#9 (PG9)
+set_tab				hts	str	st	-		-	YB-G-	set a tab in every row, current columns
+set_window			wind	str	wi	-		-	-B-GE	current window is lines #1-#2 cols #3-#4
+tab				ht	str	ta	-		-	YBCGE	tab to next 8-space hardware tab stop
+to_status_line			tsl	str	ts	-		-	YB-G-	move to status line, column #1
+underline_char			uc	str	uc	-		-	YBCG-	underline char and move past it
+up_half_line			hu	str	hu	-		-	YB-G-	half a line up
+init_prog			iprog	str	iP	-		-	-B---	path name of program for initialization
+key_a1				ka1	str	K1	KEY_A1		0534	YB-GE	upper left of keypad
+key_a3				ka3	str	K3	KEY_A3		0535	YB-GE	upper right of keypad
+key_b2				kb2	str	K2	KEY_B2		0536	YB-GE	center of keypad
+key_c1				kc1	str	K4	KEY_C1		0537	YB-GE	lower left of keypad
+key_c3				kc3	str	K5	KEY_C3		0540	YB-GE	lower right of keypad
+prtr_non			mc5p	str	pO	-		-	-B-G-*	turn on printer for #1 bytes
+#
+# SVr1 capabilities stop here.	IBM's version of terminfo is the same as
+# SVr4 up to this point, but has a different set afterwards.
+#
+char_padding			rmp	str	rP	-		-	-----	like ip but when in insert mode
+acs_chars			acsc	str	ac	-		-	-----	graphics charset pairs, based on vt100
+plab_norm			pln	str	pn	-		-	-----	program label #1 to show string #2
+key_btab			kcbt	str	kB	KEY_BTAB	0541	-----	back-tab key
+enter_xon_mode			smxon	str	SX	-		-	-----	turn on xon/xoff handshaking
+exit_xon_mode			rmxon	str	RX	-		-	-----	turn off xon/xoff handshaking
+enter_am_mode			smam	str	SA	-		-	-----	turn on automatic margins
+exit_am_mode			rmam	str	RA	-		-	-----	turn off automatic margins
+xon_character			xonc	str	XN	-		-	-----	XON character
+xoff_character			xoffc	str	XF	-		-	-----	XOFF character
+ena_acs				enacs	str	eA	-		-	-----	enable alternate char set
+label_on			smln	str	LO	-		-	-----	turn on soft labels
+label_off			rmln	str	LF	-		-	-----	turn off soft labels
+key_beg				kbeg	str	@1	KEY_BEG		0542	-----	begin key
+key_cancel			kcan	str	@2	KEY_CANCEL	0543	-----	cancel key
+key_close			kclo	str	@3	KEY_CLOSE	0544	-----	close key
+key_command			kcmd	str	@4	KEY_COMMAND	0545	-----	command key
+key_copy			kcpy	str	@5	KEY_COPY	0546	-----	copy key
+key_create			kcrt	str	@6	KEY_CREATE	0547	-----	create key
+key_end				kend	str	@7	KEY_END		0550	-----	end key
+key_enter			kent	str	@8	KEY_ENTER	0527	-----	enter/send key
+key_exit			kext	str	@9	KEY_EXIT	0551	-----	exit key
+key_find			kfnd	str	@0	KEY_FIND	0552	-----	find key
+key_help			khlp	str	%1	KEY_HELP	0553	-----	help key
+key_mark			kmrk	str	%2	KEY_MARK	0554	-----	mark key
+key_message			kmsg	str	%3	KEY_MESSAGE	0555	-----	message key
+key_move			kmov	str	%4	KEY_MOVE	0556	-----	move key
+key_next			knxt	str	%5	KEY_NEXT	0557	-----	next key
+key_open			kopn	str	%6	KEY_OPEN	0560	-----	open key
+key_options			kopt	str	%7	KEY_OPTIONS	0561	-----	options key
+key_previous			kprv	str	%8	KEY_PREVIOUS	0562	-----	previous key
+key_print			kprt	str	%9	KEY_PRINT	0532	-----	print key
+key_redo			krdo	str	%0	KEY_REDO	0563	-----	redo key
+key_reference			kref	str	&1	KEY_REFERENCE	0564	-----	reference key
+key_refresh			krfr	str	&2	KEY_REFRESH	0565	-----	refresh key
+key_replace			krpl	str	&3	KEY_REPLACE	0566	-----	replace key
+key_restart			krst	str	&4	KEY_RESTART	0567	-----	restart key
+key_resume			kres	str	&5	KEY_RESUME	0570	-----	resume key
+key_save			ksav	str	&6	KEY_SAVE	0571	-----	save key
+key_suspend			kspd	str	&7	KEY_SUSPEND	0627	-----	suspend key
+key_undo			kund	str	&8	KEY_UNDO	0630	-----	undo key
+key_sbeg			kBEG	str	&9	KEY_SBEG	0572	-----	shifted begin key
+key_scancel			kCAN	str	&0	KEY_SCANCEL	0573	-----	shifted cancel key
+key_scommand			kCMD	str	*1	KEY_SCOMMAND	0574	-----	shifted command key
+key_scopy			kCPY	str	*2	KEY_SCOPY	0575	-----	shifted copy key
+key_screate			kCRT	str	*3	KEY_SCREATE	0576	-----	shifted create key
+key_sdc				kDC	str	*4	KEY_SDC		0577	-----	shifted delete-character key
+key_sdl				kDL	str	*5	KEY_SDL		0600	-----	shifted delete-line key
+key_select			kslt	str	*6	KEY_SELECT	0601	-----	select key
+key_send			kEND	str	*7	KEY_SEND	0602	-----	shifted end key
+key_seol			kEOL	str	*8	KEY_SEOL	0603	-----	shifted clear-to-end-of-line key
+key_sexit			kEXT	str	*9	KEY_SEXIT	0604	-----	shifted exit key
+key_sfind			kFND	str	*0	KEY_SFIND	0605	-----	shifted find key
+key_shelp			kHLP	str	#1	KEY_SHELP	0606	-----	shifted help key
+key_shome			kHOM	str	#2	KEY_SHOME	0607	-----	shifted home key
+key_sic				kIC	str	#3	KEY_SIC		0610	-----	shifted insert-character key
+key_sleft			kLFT	str	#4	KEY_SLEFT	0611	-----	shifted left-arrow key
+key_smessage			kMSG	str	%a	KEY_SMESSAGE	0612	-----	shifted message key
+key_smove			kMOV	str	%b	KEY_SMOVE	0613	-----	shifted move key
+key_snext			kNXT	str	%c	KEY_SNEXT	0614	-----	shifted next key
+key_soptions			kOPT	str	%d	KEY_SOPTIONS	0615	-----	shifted options key
+key_sprevious			kPRV	str	%e	KEY_SPREVIOUS	0616	-----	shifted previous key
+key_sprint			kPRT	str	%f	KEY_SPRINT	0617	-----	shifted print key
+key_sredo			kRDO	str	%g	KEY_SREDO	0620	-----	shifted redo key
+key_sreplace			kRPL	str	%h	KEY_SREPLACE	0621	-----	shifted replace key
+key_sright			kRIT	str	%i	KEY_SRIGHT	0622	-----	shifted right-arrow key
+key_srsume			kRES	str	%j	KEY_SRSUME	0623	-----	shifted resume key
+key_ssave			kSAV	str	!1	KEY_SSAVE	0624	-----	shifted save key
+key_ssuspend			kSPD	str	!2	KEY_SSUSPEND	0625	-----	shifted suspend key
+key_sundo			kUND	str	!3	KEY_SUNDO	0626	-----	shifted undo key
+req_for_input			rfi	str	RF	-		-	-----	send next input char (for ptys)
+key_f11				kf11	str	F1	KEY_F(11)	-	----E	F11 function key
+key_f12				kf12	str	F2	KEY_F(12)	-	----E	F12 function key
+key_f13				kf13	str	F3	KEY_F(13)	-	----E	F13 function key
+key_f14				kf14	str	F4	KEY_F(14)	-	----E	F14 function key
+key_f15				kf15	str	F5	KEY_F(15)	-	----E	F15 function key
+key_f16				kf16	str	F6	KEY_F(16)	-	----E	F16 function key
+key_f17				kf17	str	F7	KEY_F(17)	-	----E	F17 function key
+key_f18				kf18	str	F8	KEY_F(18)	-	----E	F18 function key
+key_f19				kf19	str	F9	KEY_F(19)	-	----E	F19 function key
+key_f20				kf20	str	FA	KEY_F(20)	-	----E	F20 function key
+key_f21				kf21	str	FB	KEY_F(21)	-	----E	F21 function key
+key_f22				kf22	str	FC	KEY_F(22)	-	----E	F22 function key
+key_f23				kf23	str	FD	KEY_F(23)	-	----E	F23 function key
+key_f24				kf24	str	FE	KEY_F(24)	-	----E	F24 function key
+key_f25				kf25	str	FF	KEY_F(25)	-	----E	F25 function key
+key_f26				kf26	str	FG	KEY_F(26)	-	----E	F26 function key
+key_f27				kf27	str	FH	KEY_F(27)	-	----E	F27 function key
+key_f28				kf28	str	FI	KEY_F(28)	-	----E	F28 function key
+key_f29				kf29	str	FJ	KEY_F(29)	-	----E	F29 function key
+key_f30				kf30	str	FK	KEY_F(30)	-	----E	F30 function key
+key_f31				kf31	str	FL	KEY_F(31)	-	----E	F31 function key
+key_f32				kf32	str	FM	KEY_F(32)	-	----E	F32 function key
+key_f33				kf33	str	FN	KEY_F(33)	-	----E	F33 function key
+key_f34				kf34	str	FO	KEY_F(34)	-	----E	F34 function key
+key_f35				kf35	str	FP	KEY_F(35)	-	----E	F35 function key
+key_f36				kf36	str	FQ	KEY_F(36)	-	----E	F36 function key
+key_f37				kf37	str	FR	KEY_F(37)	-	----E	F37 function key
+key_f38				kf38	str	FS	KEY_F(38)	-	----E	F38 function key
+key_f39				kf39	str	FT	KEY_F(39)	-	----E	F39 function key
+key_f40				kf40	str	FU	KEY_F(40)	-	----E	F40 function key
+key_f41				kf41	str	FV	KEY_F(41)	-	----E	F41 function key
+key_f42				kf42	str	FW	KEY_F(42)	-	----E	F42 function key
+key_f43				kf43	str	FX	KEY_F(43)	-	----E	F43 function key
+key_f44				kf44	str	FY	KEY_F(44)	-	----E	F44 function key
+key_f45				kf45	str	FZ	KEY_F(45)	-	----E	F45 function key
+key_f46				kf46	str	Fa	KEY_F(46)	-	----E	F46 function key
+key_f47				kf47	str	Fb	KEY_F(47)	-	----E	F47 function key
+key_f48				kf48	str	Fc	KEY_F(48)	-	----E	F48 function key
+key_f49				kf49	str	Fd	KEY_F(49)	-	----E	F49 function key
+key_f50				kf50	str	Fe	KEY_F(50)	-	----E	F50 function key
+key_f51				kf51	str	Ff	KEY_F(51)	-	----E	F51 function key
+key_f52				kf52	str	Fg	KEY_F(52)	-	----E	F52 function key
+key_f53				kf53	str	Fh	KEY_F(53)	-	----E	F53 function key
+key_f54				kf54	str	Fi	KEY_F(54)	-	----E	F54 function key
+key_f55				kf55	str	Fj	KEY_F(55)	-	----E	F55 function key
+key_f56				kf56	str	Fk	KEY_F(56)	-	----E	F56 function key
+key_f57				kf57	str	Fl	KEY_F(57)	-	----E	F57 function key
+key_f58				kf58	str	Fm	KEY_F(58)	-	----E	F58 function key
+key_f59				kf59	str	Fn	KEY_F(59)	-	----E	F59 function key
+key_f60				kf60	str	Fo	KEY_F(60)	-	----E	F60 function key
+key_f61				kf61	str	Fp	KEY_F(61)	-	----E	F61 function key
+key_f62				kf62	str	Fq	KEY_F(62)	-	----E	F62 function key
+key_f63				kf63	str	Fr	KEY_F(63)	-	----E	F63 function key
+clr_bol				el1	str	cb	-		-	-----	Clear to beginning of line
+clear_margins			mgc	str	MC	-		-	-----	clear right and left soft margins
+set_left_margin			smgl	str	ML	-		-	-----	set left soft margin at current column.	 (ML is not in BSD termcap).
+set_right_margin		smgr	str	MR	-		-	-----	set right soft margin at current column
+device_type			devt	str	dv	-		-	-----	Indicate language/codeset support
+code_set_init			csin	str	ci	-		-	-----	Init sequence for multiple codesets
+set0_des_seq			s0ds	str	s0	-		-	-----	Shift to codeset 0 (EUC set 0, ASCII)
+set1_des_seq			s1ds	str	s1	-		-	-----	Shift to codeset 1
+set2_des_seq			s2ds	str	s2	-		-	-----	Shift to codeset 2
+set3_des_seq			s3ds	str	s3	-		-	-----	Shift to codeset 3
+key_mouse			kmous	str	Km	KEY_MOUSE	0631	-----	Mouse event has occurred
+mouse_info			minfo	str	Mi	-		-	-----	Mouse status information
+req_mouse_pos			reqmp	str	RQ	-		-	-----	Request mouse position
+get_mouse			getm	str	Gm	-		-	-----	Curses should get button events, parameter #1 not documented.
+release_mouse			relm	str	Rm	-		-	-----	Curses should release the mouse */
+color_names			colornm	str	Yw	-		-	-----	Give name for color #1
+initialize_color		initc	str	Ic	-		-	-----	initialize color #1 to (#2,#3,#4)
+initialize_pair			initp	str	Ip	-		-	-----	Initialize color pair #1 to fg=(#2,#3,#4), bg=(#5,#6,#7)
+orig_colors			oc	str	oc	-		-	-----	Set all color pairs to the original ones
+orig_pair			op	str	op	-		-	-----	Set default pair to its original value
+set_a_background		setab	str	AB	-		-	-----	Set background color to #1, using ANSI escape
+set_a_foreground		setaf	str	AF	-		-	-----	Set foreground color to #1, using ANSI escape
+set_background			setb	str	Sb	-		-	-----	Set background color #1
+set_color_pair			scp	str	sp	-		-	-----	Set current color pair to #1
+set_foreground			setf	str	Sf	-		-	-----	Set foreground color #1
+#%.TE
+#%.ad
+#%
+# The magic token below tells the tic compiler-generator code that all the caps
+# past it should be ignored (not written out) when dumping terminfo objects. It
+# also tells the man page table generator not to pass through following lines
+# This means we can have obsolete capabilities and pseudo-capabilities that are
+# recognized for termcap or terminfo compilation, but not output.
+#
+# %%-STOP-HERE-%%
+#
+# Don't move this casually!  In fact, don't move it at all unless you're
+# either doing it to add System V or XPG4 extensions, or have decided you
+# don't care about SVr4 binary compatibility.
+#
+#############################################################################
+#
+# TERMCAP EXTENSION CAPABILITIES
+#
+# The capabilities below are either obsolete or extensions on certain systems.
+# They are not used by SVR4 terminfo.  Some are used by captoinfo to translate
+# termcap sources; the rest are listed for completeness, and in case somebody
+# cares about them enough to hack in code that will translate them into
+# terminfo capabilities.
+#
+# The first part of the list is from Ross Ridge's `mytinfo' package
+# (comp.sources.unix, volume 26); the variable names and terminfo names (as
+# well as the termcap codes) match his list.
+#
+# This group of codes is not marked obsolete in 4.4BSD, but have no direct
+# terminfo equivalents.  The rs capability is specially translated to terminfo
+# r2, and vice versa, if an entry does not already have an r2.  Similarly,
+# i2 is translated to r3 if there is no r3 (because SV terminfo maps is to i2).
+# The ug capability is thrown away, but assumed to be whatever sg is if the
+# latter is nonzero and we're dumping in termcap format.
+#
+termcap_init2			OTi2	str	i2	-		-	YB---	secondary initialization string
+termcap_reset			OTrs	str	rs	-		-	YB-G-	terminal reset string
+magic_cookie_glitch_ul		OTug	num	ug	-		-	YBCGE	number of blanks left by ul
+#
+# Obsolete termcap capabilities.  Some are used for termcap translation.  The
+# code uses the 'OT' prefix we put on obsolete capabilities to suppress
+# printing them in terminfo source dumps of compiled entries.
+#
+backspaces_with_bs		OTbs	bool	bs	-		-	YBCGE	uses ^H to move left
+crt_no_scrolling		OTns	bool	ns	-		-	YBCG-	crt cannot scroll
+no_correctly_working_cr		OTnc	bool	nc	-		-	YBCG-	no way to go to start of line
+carriage_return_delay		OTdC	num	dC	-		-	YB-G-	pad needed for CR
+new_line_delay			OTdN	num	dN	-		-	YB-G-	pad needed for LF
+linefeed_if_not_lf		OTnl	str	nl	-		-	YBCGE	use to move down
+backspace_if_not_bs		OTbc	str	bc	-		-	YBCGE	move left, if not ^H
+#
+# GNU termcap library extensions.  The GNU termcap file distributed with
+# Emacs no longer uses these, but MT showed up in pre-9.0 versions of the
+# BSD termcap file.  The name clash with terminfo MT is resolved by type
+# info; MT is converted to km.
+#
+gnu_has_meta_key		OTMT	bool	MT	-		-	----E	has meta key
+# gnu_tab_width			OTtw	num	tw	-		-	----E	tab width in spaces
+#
+# GNU termcap *does* include the following extended capability,  Only the
+# now-obsolete Ann Arbor terminals used it.
+#
+# gnu_change_scroll_region	OTcS	str	cS	-		-	---GE	alternate set scrolling region
+#
+# The following comments describe capnames so ancient that I believe no
+# software uses them any longer.  Some of these have to go because they
+# clash with terminfo names in ways that cannot be resolved by type
+# information.
+#
+# These mytinfo codes are not used in the 4.4BSD curses code.  They are
+# marked obsolete in the 4.4BSD manual pages.
+#
+# There is one conflict with terminfo; ma is in both.  This conflict is
+# resolved by type information.
+#
+# The `ko' capability is translated by special code.  It should contain a
+# comma-separated list of capabilities for which there are corresponding keys.
+# The `kn' code is accepted but ignored.
+#
+# The `ma' capability was a 4.0BSD feature used by vi version 2.
+# It consists of pairs of characters corresponding to kl, kr, ku, kd, and kh.
+# Besides being obsolete, that interpretation conflicts with max_attributes.
+#
+# Here is a description of memory_lock_above and memory_unlock:
+# "You can 'freeze' data on the screen by turning on Memory Lock in a line of
+# text.  All lines above the cursor's current line become locked in place on
+# the screen.  Then enter data normally.  When the screen fills up, any
+# further data entered forces the first line of unfrozen line text to scroll
+# under the frozen data.  Lines scrolled off the screen are inserted into
+# memory immediately preceding the first frozen line." (from the HP 700/96
+# User's manual).  VT100/ANSI memory lock set is \E[>2h, reset is \E[>2l.
+#
+# Applications that use terminfo are supposed to behave as though xr is
+# always true.
+#
+linefeed_is_newline		OTNL	bool	NL	-		-	YB---	move down with \n
+# even_parity			OTEP	bool	EP	-		-	-B---	terminal requires even parity
+# odd_parity			OTOP	bool	OP	-		-	-B---	terminal requires odd parity
+# half_duplex			OTHD	bool	HD	-		-	-B---	terminal is half-duplex
+# lower_case_only		OTLC	bool	LC	-		-	-B---	terminal has only lower case
+# upper_case_only		OTUC	bool	UC	-		-	-B---	terminal has only upper case
+backspace_delay			OTdB	num	dB	-		-	YB-G-	padding required for ^H
+# form_feed_delay		OTdF	num	dF	-		-	-B-G-	padding required for ^L
+horizontal_tab_delay		OTdT	num	dT	-		-	YB-G-	padding required for ^I
+# vertical_tab_delay		OTdV	num	dV	-		-	-B---	padding required for ^V
+number_of_function_keys		OTkn	num	kn	-		-	-B-G-	count of function keys
+other_non_function_keys		OTko	str	ko	-		-	-B-G-	list of self-mapped keycaps
+arrow_key_map			OTma	str	ma	-		-	YBC--	map motion-keys for vi version 2
+# memory_lock_above		OTml	str	ml	-		-	-B---	lock visible screen memory above the current line
+# memory_unlock			OTmu	str	mu	-		-	-B---	unlock visible screen memory above the current line
+has_hardware_tabs		OTpt	bool	pt	-		-	YB---	has 8-char tabs invoked with ^I
+return_does_clr_eol		OTxr	bool	xr	-		-	YB---	return clears the line
+# tek_4025_insert_line		OTxx	bool	xx	-		-	-BC--	Tektronix 4025 insert-line glitch
+#
+# mytinfo described this as a termcap capability, but it is not listed in the
+# 4.4BSD man pages, and not found in the 4.4BSD termcap file.  The ncurses
+# package, like System V, behaves as though it is always true.
+#
+# rind_only_at_top		OTxq	bool	xq	-		-	-----	reverse index only works from top line
+#
+# University of Waterloo termcap extensions (as described in mytinfo).
+# The `xl' termcap file clashes with a terminfo name; this ambiguity cannot
+# be resolved by a type check.  The descriptions are guesses from what was
+# in the mytinfo tables.
+#
+# key_interrupt_char		OTki	str	ki	-		-	-----	string set by interrupt key (?)
+# key_kill_char			OTkk	str	kk	-		-	-----	string set by kill key (?)
+# key_suspend_char		OTkz	str	kz	-		-	-----	string set by suspend key (?)
+# initialization_messy		OTxc	bool	xc	-		-	-----	initialization leaves garbage on the screen (?)
+# ind_at_bottom_does_cr		OTxl	bool	xl	-		-	-----	index does a carriage return
+#
+# Nonstandard capabilities unique to Ross Ridge's `mytinfo' package.
+# SR clashes with a terminfo name; this ambiguity cannot be resolved by a type
+# check.
+#
+# scroll_left			OTsl1	str	Sl	-		-	-----	scroll screen leftward
+# scroll_right			OTsr1	str	Sr	-		-	-----	scroll screen rightward
+# parm_scroll_left		OTsl	str	SL	-		-	-----	scroll screen leftward #1 characters
+# parm_scroll_right		OTsr	str	SR	-		-	-----	scroll screen rightward #1 characters
+#
+# The mytinfo capabilities end here.
+#
+# XENIX extensions:
+#
+# Xenix defined its own set of forms-drawing capabilities:
+#
+# cap	IBM ASCII	description             ACS         	ASCII
+# ---	-----------	--------------------    -------------	------
+# G1	191 \277 M-?	single upper right   	ACS_URCORNER
+# G2	218 \332 M-Z	single upper left	ACS_ULCORNER
+# G3	192 \300 M-@	single lower left	ACS_LLCORNER
+# G4	217 \331 M-Y	single lower right	ACS_LRCORNER
+# G5	187 \273 M-;	double upper right
+# G6	201 \311 M-I	double upper left
+# G7	200 \310 M-H	double lower left
+# G8	188 \274 M-<	double lower right
+# GC	197 \305 M-E	single intersection	ACS_PLUS	_ _
+# GD	194 \302 M-B	single down-tick	ACS_TTEE	 |
+# GH	196 \304 M-D	single horizontal line	ACS_HLINE
+# GL	180 \264 M-4	single left tick	ACS_RTEE	-|
+# GR	195 \303 M-C	single right tick	ACS_LTEE	|-
+# GU	193 \301 M-A	single up tick		ACS_BTEE	_|_
+# GV	179 \263 M-3	single vertical line	ACS_VLINE
+# Gc	206 \316 M-N	double intersection
+# Gd	203 \313 M-K	double down tick
+# Gh	205 \315 M-M	double horizontal line
+# Gl	204 \204 M-L	double left tick
+# Gr	185 \271 M-9	double right tick
+# Gu	202 \312 M-J	double up tick
+# Gv	186 \272 M-:	double vertical line
+#
+# The compiler will translate the single-line caps and discard the others
+# (via IGNORE aliases further down).  We don't want to do normal pad
+# translation on these, they're often single-character printable ASCII
+# strings that happen to be numerics.  There's awk code in parametrized.sh
+# that detects the acs_ prefix and uses it to suppress pad translation.
+# These terminfo names are invented.
+#
+acs_ulcorner			OTG2	str	G2	-		-	-----	single upper left
+acs_llcorner			OTG3	str	G3	-		-	-----	single lower left
+acs_urcorner			OTG1	str	G1	-		-	-----	single upper right
+acs_lrcorner			OTG4	str	G4	-		-	-----	single lower right
+acs_ltee			OTGR	str	GR	-		-	-----	tee pointing right
+acs_rtee			OTGL	str	GL	-		-	-----	tee pointing left
+acs_btee			OTGU	str	GU	-		-	-----	tee pointing up
+acs_ttee			OTGD	str	GD	-		-	-----	tee pointing down
+acs_hline			OTGH	str	GH	-		-	-----	single horizontal line
+acs_vline			OTGV	str	GV	-		-	-----	single vertical line
+acs_plus			OTGC	str	GC	-		-	-----	single intersection
+#
+#############################################################################
+#
+# TERMINFO EXTENSION CAPABILITIES
+#
+# (see Caps-ncurses for the complete set of comments)
+#
+memory_lock			meml	str	ml	-		-	----K	lock memory above cursor
+memory_unlock			memu	str	mu	-		-	----K	unlock memory
+box_chars_1			box1	str	bx	-		-	----K	box characters primary set
+#
+#############################################################################
diff --git a/include/MKhashsize.sh b/include/MKhashsize.sh
new file mode 100755
index 0000000..8a534d4
--- /dev/null
+++ b/include/MKhashsize.sh
@@ -0,0 +1,43 @@
+#!/bin/sh
+##############################################################################
+# Copyright 2019,2020 Thomas E. Dickey                                       #
+# Copyright 1998,2006 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: MKhashsize.sh,v 1.9 2020/02/02 23:34:34 tom Exp $
+#
+# MKhashsize.sh --- generate size include for hash functions
+#
+echo "/*"
+echo " * hashsize.h -- hash and token table constants"
+echo " */"
+
+test $# = 0 && set Caps
+TABSIZE=`cat "$@" | grep -v '^[ #]' | grep -v "^$" | grep -v "^capalias"| grep -v "^infoalias" | grep -v "^userdef" | grep -v "^used_by" | wc -l`
+
+echo ""
+echo "#define CAPTABSIZE	${TABSIZE}"
+echo "#define HASHTABSIZE	(${TABSIZE} * 2)"
diff --git a/include/MKkey_defs.sh b/include/MKkey_defs.sh
new file mode 100755
index 0000000..3605700
--- /dev/null
+++ b/include/MKkey_defs.sh
@@ -0,0 +1,197 @@
+#! /bin/sh
+# $Id: MKkey_defs.sh,v 1.23 2022/07/16 16:54:02 tom Exp $
+##############################################################################
+# Copyright 2019-2020,2022 Thomas E. Dickey                                  #
+# Copyright 2001-2013,2017 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.                                                             #
+##############################################################################
+#
+# MKkey_defs.sh -- generate function-key definitions for curses.h
+#
+# Author: Thomas E. Dickey 2001
+#
+# Extract function-key definitions from the Caps file
+#
+: "${AWK-awk}"
+
+test $# = 0 && set Caps
+
+data=data$$
+pass1=pass1_$$
+pass2=pass2_$$
+pass3=pass3_$$
+pass4=pass4_$$
+trap 'rm -f $data pass[1234]_$$; exit 1' 1 2 3 15
+trap 'rm -f $data pass[1234]_$$' 0
+
+# change repeated tabs (used for readability) to single tabs (needed to make
+# awk see the right field alignment of the corresponding columns):
+if sort -k 6 "$@" >$data 2>/dev/null
+then
+	# POSIX
+	sed -e 's/[	][	]*/	/g' "$@" |sort -n -k 6 >$data
+elif sort -n +5 "$@" >$data 2>/dev/null
+then
+	# SunOS (and SVr4, marked as obsolete but still recognized)
+	sed -e 's/[	][	]*/	/g' "$@" |sort -n +5 >$data
+else
+	echo "Your sort utility is broken.  Please install one that works." >&2
+	exit 1
+fi
+
+# add keys that we generate automatically:
+cat >>$data <<EOF
+key_resize	kr1	str	R1	KEY_RESIZE	+	NCURSES_EXT_FUNCS 	Terminal resize event
+EOF
+
+THIS=./`basename "$0"`
+
+cat <<EOF
+/*
+ * These definitions were generated by $THIS $*
+ */
+EOF
+
+# KEY_RESET
+maxkey=345
+
+for pass in 1 2 3 4
+do
+
+output=pass${pass}_$$
+
+${AWK-awk} >$output <$data '
+function print_cols(text,cols) {
+	printf "%s", text
+	len = length(text);
+	while (len < cols) {
+		printf "	"
+		len += 8;
+	}
+}
+function decode(keycode) {
+	result = 0;
+	if (substr(keycode, 1, 2) == "0x") {
+		digits="0123456789abcdef";
+	} else if (substr(keycode, 1, 1) == "0") {
+		digits="01234567";
+	} else {
+		digits="0123456789";
+	}
+	while (length(keycode) != 0) {
+		digit=substr(keycode, 1, 1);
+		keycode=substr(keycode, 2);
+		result = result * length(digits) + index(digits, digit) - 1;
+	}
+	return result;
+}
+
+BEGIN	{
+	maxkey='$maxkey';
+	pass='$pass';
+	key_max=1;
+	bits=1;
+	while (key_max < maxkey) {
+		bits = bits + 1;
+		key_max = (key_max * 2) + 1;
+	}
+	octal_fmt = sprintf ("%%0%do", (bits + 2) / 3 + 1);
+}
+
+/^$/		{next;}
+/^#/		{next;}
+/^capalias/	{next;}
+/^infoalias/	{next;}
+/^used_by/	{next;}
+/^userdef/	{next;}
+
+$5 != "-" && $6 != "-" {
+		if ($6 == "+") {
+			if (pass == 1 || pass == 2)
+				next;
+			thiskey=maxkey + 1;
+		} else {
+			if (pass == 3)
+				next;
+			thiskey=decode($6);
+		}
+		if (thiskey > maxkey)
+			maxkey = thiskey;
+		if (pass == 2 || pass == 3) {
+			showkey=sprintf(octal_fmt, thiskey);
+			ifdef = 0;
+			if (index($7,"NCURSES_") == 1) {
+				ifdef = 1;
+				printf "\n";
+				printf "#ifdef %s\n", $7;
+			}
+			if ($5 == "KEY_F(0)" ) {
+				printf "#define "
+				print_cols("KEY_F0", 16);
+				print_cols(showkey, 16);
+				print "/* Function keys.  Space for 64 */";
+				printf "#define "
+				print_cols("KEY_F(n)", 16);
+				print_cols("(KEY_F0+(n))", 16);
+				print "/* Value of function key n */"
+			} else {
+				printf "#define "
+				print_cols($5, 16);
+				print_cols(showkey, 16);
+				printf "/*"
+				for (i = 8; i <= NF; i++)
+					printf " %s", $i
+				print " */"
+			}
+			if (ifdef != 0) {
+				printf "#endif\n";
+			}
+		}
+	}
+END	{
+		if (pass == 1) {
+			print maxkey;
+		} else if (pass == 4) {
+			print "";
+			printf "#define ";
+			print_cols("KEY_MAX", 16);
+			result = sprintf (octal_fmt, key_max);
+			print_cols(result, 16);
+			printf "/* Maximum key value is ";
+			printf octal_fmt, maxkey;
+			print " */";
+		}
+	}
+'
+if test $pass = 1 ; then
+	maxkey=`cat $pass1`
+fi
+
+done
+
+cat $pass2
+cat $pass3
+cat $pass4
diff --git a/include/MKncurses_def.sh b/include/MKncurses_def.sh
new file mode 100755
index 0000000..22d80c2
--- /dev/null
+++ b/include/MKncurses_def.sh
@@ -0,0 +1,81 @@
+#! /bin/sh
+# $Id: MKncurses_def.sh,v 1.5 2022/07/16 17:03:59 tom Exp $
+##############################################################################
+# Copyright 2020,2022 Thomas E. Dickey                                       #
+# Copyright 2000,2003 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.                                                             #
+##############################################################################
+#
+# MKncurses_def.sh -- generate fallback definitions for ncurses_cfg.h
+#
+# Author: Thomas E. Dickey 2000
+#
+# Given the choice between constructs such as
+#
+#	#if defined(foo) && foo
+#	#if foo
+#
+# we chose the latter.  It is guaranteed by the language standard, and there
+# appear to be no broken compilers that do not honor that detail.  But some
+# people want to use gcc's -Wundef option (corresponding to one of the less
+# useful features in Watcom's compiler) to check for misspellings.  So we
+# generate a set of fallback definitions to quiet the warnings without making
+# the code ugly.
+#
+DEFS="${1-ncurses_defs}"
+cat <<EOF
+/*
+ * This file is generated by $0
+ */
+
+#ifndef NC_DEFINE_H
+#define NC_DEFINE_H 1
+
+EOF
+
+"${AWK-awk}" <"$DEFS" '
+!/^[@#]/ {
+	if ( NF == 1 )
+	{
+		print "#ifndef", $1
+		print "#define", $1, "0"
+		print "#endif"
+		print ""
+	} else if ( NF != 0 ) {
+		print "#ifndef", $1
+		printf "#define"
+		for (n = 1; n <= NF; n++) {
+			printf " %s", $n
+		}
+		print ""
+		print "#endif"
+		print ""
+	}
+}
+END	{
+print "#endif /* NC_DEFINE_H */"
+	}
+'
diff --git a/include/MKparametrized.sh b/include/MKparametrized.sh
new file mode 100755
index 0000000..5d0cae1
--- /dev/null
+++ b/include/MKparametrized.sh
@@ -0,0 +1,75 @@
+#!/bin/sh
+##############################################################################
+# Copyright 2019,2020 Thomas E. Dickey                                       #
+# Copyright 1998-2014,2017 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: MKparametrized.sh,v 1.10 2020/02/02 23:34:34 tom Exp $
+#
+# MKparametrized.sh -- generate indirection vectors for various sort methods
+#
+# The output of this script is C source for an array specifying whether
+# termcap strings should undergo parameter and padding translation.
+#
+[ $# = 0 ] && set - Caps
+
+cat <<EOF
+#ifndef PARAMETRIZED_H
+#define PARAMETRIZED_H 1
+/*
+ * parametrized.h --- is a termcap capability parametrized?
+ *
+ * Note: this file is generated using MKparametrized.sh, do not edit by hand.
+ * A value of -1 in the table means suppress both pad and % translations.
+ * A value of 0 in the table means do pad but not % translations.
+ * A value of 1 in the table means do both pad and % translations.
+ */
+
+static short const parametrized[] = {
+EOF
+
+# We detect whether % translations should be done by looking for #[0-9] in the
+# description field.  We presently suppress padding translation only for the
+# XENIX acs_* capabilities.  Maybe someday we'll dedicate a flag field for
+# this, that would be cleaner....
+
+cat "$@" | ${AWK-awk} '
+
+/^#/ { next ; }
+/^capalias/ { next ; }
+/^infoalias/ { next ; }
+/^used_by/ { next ; }
+/^userdef/ { next ; }
+
+$3 != "str"		{next;}
+$1 ~ /^acs_/		{print "-1,\t/* ", $2, " */"; count++; next;}
+$1 ~ /^label_format/	{print "-1,\t/* ", $2, " */"; count++; next;}
+$0 ~ /#[0-9]/		{print "1,\t/* ", $2, " */"; count++; next;}
+			{print "0,\t/* ", $2, " */"; count++;}
+END			{printf("} /* %d entries */;\n\n", count);}
+'
+
+echo "#endif /* PARAMETRIZED_H */"
diff --git a/include/MKterm.h.awk.in b/include/MKterm.h.awk.in
new file mode 100644
index 0000000..e79840d
--- /dev/null
+++ b/include/MKterm.h.awk.in
@@ -0,0 +1,416 @@
+# vile:awkmode
+function declare_termtype(number,suffix) {
+	printf "typedef struct termtype%s {	/* in-core form of terminfo data */\n", suffix;
+	print  "    char  *term_names;		/* str_table offset of term names */"
+	print  "    char  *str_table;		/* pointer to string table */"
+	print  "    NCURSES_SBOOL  *Booleans;	/* array of boolean values */"
+	printf "    %-5s *Numbers;		/* array of integer values */\n", number;
+	print  "    char  **Strings;		/* array of string offsets */"
+	print  ""
+	print  "#if NCURSES_XNAMES"
+	print  "    char  *ext_str_table;	/* pointer to extended string table */"
+	print  "    char  **ext_Names;		/* corresponding names */"
+	print  ""
+	print  "    unsigned short num_Booleans;/* count total Booleans */";
+	print  "    unsigned short num_Numbers;	/* count total Numbers */";
+	print  "    unsigned short num_Strings;	/* count total Strings */";
+	print  ""
+	print  "    unsigned short ext_Booleans;/* count extensions to Booleans */";
+	print  "    unsigned short ext_Numbers;	/* count extensions to Numbers */";
+	print  "    unsigned short ext_Strings;	/* count extensions to Strings */";
+	print  "#endif /* NCURSES_XNAMES */"
+	print  ""
+	printf "} TERMTYPE%s;\n", suffix;
+}
+BEGIN {
+	lcurl = "{";
+	rcurl = "}";
+	print  "/****************************************************************************"
+	print  " * Copyright 2018-2020,2021 Thomas E. Dickey                                *"
+	print  " * Copyright 1998-2013,2017 Free Software Foundation, Inc.                  *"
+	print  " *                                                                          *"
+	print  " * Permission is hereby granted, free of charge, to any person obtaining a  *"
+	print  " * copy of this software and associated documentation files (the            *"
+	print  " * \"Software\"), to deal in the Software without restriction, including      *"
+	print  " * without limitation the rights to use, copy, modify, merge, publish,      *"
+	print  " * distribute, distribute with modifications, sublicense, and/or sell       *"
+	print  " * copies of the Software, and to permit persons to whom the Software is    *"
+	print  " * furnished to do so, subject to the following conditions:                 *"
+	print  " *                                                                          *"
+	print  " * The above copyright notice and this permission notice shall be included  *"
+	print  " * in all copies or substantial portions of the Software.                   *"
+	print  " *                                                                          *"
+	print  " * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *"
+	print  " * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *"
+	print  " * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *"
+	print  " * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *"
+	print  " * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *"
+	print  " * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *"
+	print  " * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *"
+	print  " *                                                                          *"
+	print  " * Except as contained in this notice, the name(s) of the above copyright   *"
+	print  " * holders shall not be used in advertising or otherwise to promote the     *"
+	print  " * sale, use or other dealings in this Software without prior written       *"
+	print  " * authorization.                                                           *"
+	print  " ****************************************************************************/"
+	print  ""
+	print  "/****************************************************************************/"
+	print  "/* Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995                */"
+	print  "/*    and: Eric S. Raymond <esr@snark.thyrsus.com>                          */"
+	print  "/*    and: Thomas E. Dickey                        1995-on                  */"
+	print  "/****************************************************************************/"
+	print  ""
+	print  "/* $Id: MKterm.h.awk.in,v 1.82 2021/09/24 17:02:46 tom Exp $ */"
+	print  ""
+	print  "/*"
+	print  "**	term.h -- Definition of struct term"
+	print  "*/"
+	print  ""
+	print  "#ifndef NCURSES_TERM_H_incl"
+	print  "#define NCURSES_TERM_H_incl 1"
+	print  ""
+	print  "#undef  NCURSES_VERSION"
+	print  "#define NCURSES_VERSION \"@NCURSES_MAJOR@.@NCURSES_MINOR@\""
+	print  ""
+	print  "#include <ncurses_dll.h>"
+	print  ""
+	print  "#ifdef __cplusplus"
+	printf "extern \"C\" %s\n", lcurl;
+	print  "#endif"
+	print  ""
+	print  "/* Make this file self-contained by providing defaults for the HAVE_TERMIO[S]_H"
+	print  " * definition (based on the system for which this was configured)."
+	print  " */"
+	print  ""
+	print  "#ifndef __NCURSES_H"
+	print  ""
+	print  "typedef struct screen  SCREEN;"
+	print  ""
+	print  "#if @NCURSES_SP_FUNCS@"
+	print  "#undef  NCURSES_SP_FUNCS"
+	print  "#define NCURSES_SP_FUNCS @NCURSES_PATCH@"
+	print  "#undef  NCURSES_SP_NAME"
+	print  "#define NCURSES_SP_NAME(name) name##_sp"
+	print  ""
+	print  "/* Define the sp-funcs helper function */"
+	print  "#undef  NCURSES_SP_OUTC"
+	print  "#define NCURSES_SP_OUTC NCURSES_SP_NAME(NCURSES_OUTC)"
+	print  "typedef int (*NCURSES_SP_OUTC)(SCREEN*, int);"
+	print  "#endif"
+	print  ""
+	print  "#endif /* __NCURSES_H */"
+	print  ""
+	print  "#undef  NCURSES_CONST"
+	print  "#define NCURSES_CONST @NCURSES_CONST@"
+	print  ""
+	print  "#undef  NCURSES_SBOOL"
+	print  "#define NCURSES_SBOOL @NCURSES_SBOOL@"
+	print  ""
+	print  "#undef  NCURSES_USE_DATABASE"
+	print  "#define NCURSES_USE_DATABASE @NCURSES_USE_DATABASE@"
+	print  ""
+	print  "#undef  NCURSES_USE_TERMCAP"
+	print  "#define NCURSES_USE_TERMCAP @NCURSES_USE_TERMCAP@"
+	print  ""
+	print  "#undef  NCURSES_XNAMES"
+	print  "#define NCURSES_XNAMES @NCURSES_XNAMES@"
+	print  ""
+	print  "/* We will use these symbols to hide differences between"
+	print  " * termios/termio/sgttyb interfaces."
+	print  " */"
+	print  "#undef  TTY"
+	print  "#undef  SET_TTY"
+	print  "#undef  GET_TTY"
+	print  ""
+	print  "/* Assume POSIX termio if we have the header and function */"
+	print  "/* #if HAVE_TERMIOS_H && HAVE_TCGETATTR */"
+	print  "#if @HAVE_TERMIOS_H@ && @HAVE_TCGETATTR@"
+	print  ""
+	print  "#undef  TERMIOS"
+	print  "#define TERMIOS 1"
+	print  ""
+	print  "#include <termios.h>"
+	print  "#define TTY struct termios"
+	print  ""
+	print  "#else /* !HAVE_TERMIOS_H */"
+	print  ""
+	print  "/* #if HAVE_TERMIO_H */"
+	print  "#if @HAVE_TERMIO_H@"
+	print  ""
+	print  "#undef  TERMIOS"
+	print  "#define TERMIOS 1"
+	print  ""
+	print  "#include <termio.h>"
+	print  "#define TTY struct termio"
+	print  ""
+	print  "#else /* !HAVE_TERMIO_H */"
+	print  ""
+	print  "#if (defined(_WIN32) || defined(_WIN64))"
+	print  "#if @EXP_WIN32_DRIVER@"
+	print  "#include <win32_curses.h>"
+	print  "#define TTY struct winconmode"
+	print  "#else"
+	print  "#include <ncurses_mingw.h>"
+	print  "#define TTY struct termios"
+	print  "#endif"
+	print  "#else"
+	print  "#undef TERMIOS"
+	print  "#include <sgtty.h>"
+	print  "#include <sys/ioctl.h>"
+	print  "#define TTY struct sgttyb"
+	print  "#endif /* MINGW32 */"
+	print  "#endif /* HAVE_TERMIO_H */"
+	print  ""
+	print  "#endif /* HAVE_TERMIOS_H */"
+	print  ""
+	print  "#ifdef TERMIOS"
+	print  "#define GET_TTY(fd, buf) tcgetattr(fd, buf)"
+	print  "#define SET_TTY(fd, buf) tcsetattr(fd, TCSADRAIN, buf)"
+	print  "#elif @EXP_WIN32_DRIVER@ && (defined(_WIN32) || defined(_WIN64))"
+	print  "#define GET_TTY(fd, buf) _nc_console_getmode(_nc_console_fd2handle(fd),buf)"
+	print  "#define SET_TTY(fd, buf) _nc_console_setmode(_nc_console_fd2handle(fd),buf)"
+	print  "#else"
+	print  "#define GET_TTY(fd, buf) gtty(fd, buf)"
+	print  "#define SET_TTY(fd, buf) stty(fd, buf)"
+	print  "#endif"
+	print  ""
+	print  "#ifndef	GCC_NORETURN"
+	print  "#define	GCC_NORETURN /* nothing */"
+	print  "#endif"
+	print  ""
+	print  "#define NAMESIZE 256"
+	print  ""
+	print  "/* The cast works because TERMTYPE is the first data in TERMINAL */"
+	print  "#define CUR ((TERMTYPE *)(cur_term))->"
+	print  ""
+}
+
+$2 == "%%-STOP-HERE-%%" {
+	print  ""
+	printf "#define BOOLWRITE %d\n", BoolCount
+	printf "#define NUMWRITE  %d\n", NumberCount
+	printf "#define STRWRITE  %d\n", StringCount
+	print  ""
+	print  "/* older synonyms for some capabilities */"
+	print  "#define beehive_glitch	no_esc_ctlc"
+	print  "#define teleray_glitch	dest_tabs_magic_smso"
+	print  ""
+	print  "/* HPUX-11 uses this name rather than the standard one */"
+	print  "#ifndef micro_char_size"
+	print  "#define micro_char_size micro_col_size"
+	print  "#endif"
+	print  ""
+	print  "#ifdef __INTERNAL_CAPS_VISIBLE"
+}
+
+/^#/ { next; }
+
+/^used_by/ { next ; }
+/^userdef/ { next ; }
+
+$1 == "acs_chars" {
+	acsindex = StringCount;
+}
+
+$3 == "bool" {
+	printf "#define %-30s CUR Booleans[%d]\n", $1, BoolCount++
+}
+
+$3 == "num" {
+	printf "#define %-30s CUR Numbers[%d]\n", $1, NumberCount++
+}
+
+$3 == "str" {
+	printf "#define %-30s CUR Strings[%d]\n", $1, StringCount++
+}
+
+END {
+	print  "#endif /* __INTERNAL_CAPS_VISIBLE */"
+	print  ""
+	print  ""
+	print  "/*"
+	print  " * Predefined terminfo array sizes"
+	print  " */"
+	printf "#define BOOLCOUNT %d\n", BoolCount
+	printf "#define NUMCOUNT  %d\n", NumberCount
+	printf "#define STRCOUNT  %d\n", StringCount
+	print  ""
+	print  "/* used by code for comparing entries */"
+	print  "#define acs_chars_index	", acsindex
+	print  ""
+	declare_termtype("short","");
+	print  ""
+	print  "/*"
+	print  " * The only reason these structures are visible is for read-only use."
+	print  " * Programs which modify the data are not, never were, portable across"
+	print  " * curses implementations."
+	print  " *"
+	print  " * The first field in TERMINAL is used in macros."
+	print  " * The remaining fields are private."
+	print  " */"
+	print  "#ifdef NCURSES_INTERNALS"
+	print  ""
+	print  "#undef TERMINAL"
+	print  "#define TERMINAL struct term"
+	print  "TERMINAL;"
+	print  ""
+	if (@NCURSES_EXT_COLORS@) {
+	declare_termtype("int","2");
+	} else {
+	print  "#undef TERMTYPE2"
+	print  "#define TERMTYPE2 TERMTYPE"
+	}
+	print  "#else"
+	print  ""
+	print  "typedef struct term {		/* describe an actual terminal */"
+	print  "    TERMTYPE	type;		/* terminal type description */"
+	print  "} TERMINAL;"
+	print  ""
+	print  "#endif /* NCURSES_INTERNALS */"
+	print  ""
+	print  ""
+	print  "#if @BROKEN_LINKER@ && !@cf_cv_enable_reentrant@"
+	print  "extern NCURSES_EXPORT_VAR(TERMINAL *) cur_term;"
+	print  "#elif @cf_cv_enable_reentrant@"
+	print  "NCURSES_WRAPPED_VAR(TERMINAL *, cur_term);"
+	print  "#define cur_term   NCURSES_PUBLIC_VAR(cur_term())"
+	print  "#else"
+	print  "extern NCURSES_EXPORT_VAR(TERMINAL *) cur_term;"
+	print  "#endif"
+	print  ""
+	print  "#if @BROKEN_LINKER@ || @cf_cv_enable_reentrant@"
+	print  "NCURSES_WRAPPED_VAR(NCURSES_CONST char * const *, boolnames);"
+	print  "NCURSES_WRAPPED_VAR(NCURSES_CONST char * const *, boolcodes);"
+	print  "NCURSES_WRAPPED_VAR(NCURSES_CONST char * const *, boolfnames);"
+	print  "NCURSES_WRAPPED_VAR(NCURSES_CONST char * const *, numnames);"
+	print  "NCURSES_WRAPPED_VAR(NCURSES_CONST char * const *, numcodes);"
+	print  "NCURSES_WRAPPED_VAR(NCURSES_CONST char * const *, numfnames);"
+	print  "NCURSES_WRAPPED_VAR(NCURSES_CONST char * const *, strnames);"
+	print  "NCURSES_WRAPPED_VAR(NCURSES_CONST char * const *, strcodes);"
+	print  "NCURSES_WRAPPED_VAR(NCURSES_CONST char * const *, strfnames);"
+	print  ""
+	print  "#define boolnames  NCURSES_PUBLIC_VAR(boolnames())"
+	print  "#define boolcodes  NCURSES_PUBLIC_VAR(boolcodes())"
+	print  "#define boolfnames NCURSES_PUBLIC_VAR(boolfnames())"
+	print  "#define numnames   NCURSES_PUBLIC_VAR(numnames())"
+	print  "#define numcodes   NCURSES_PUBLIC_VAR(numcodes())"
+	print  "#define numfnames  NCURSES_PUBLIC_VAR(numfnames())"
+	print  "#define strnames   NCURSES_PUBLIC_VAR(strnames())"
+	print  "#define strcodes   NCURSES_PUBLIC_VAR(strcodes())"
+	print  "#define strfnames  NCURSES_PUBLIC_VAR(strfnames())"
+	print  ""
+	print  "#else"
+	print  ""
+	print  "extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) boolnames[];"
+	print  "extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) boolcodes[];"
+	print  "extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) boolfnames[];"
+	print  "extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) numnames[];"
+	print  "extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) numcodes[];"
+	print  "extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) numfnames[];"
+	print  "extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) strnames[];"
+	print  "extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) strcodes[];"
+	print  "extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) strfnames[];"
+	print  ""
+	print  "#endif"
+	print  ""
+	print  "/*"
+	print  " * These entrypoints are used only by the ncurses utilities such as tic."
+	print  " */"
+	print  "#ifdef NCURSES_INTERNALS"
+	print  ""
+	print  "extern NCURSES_EXPORT(int) _nc_set_tty_mode (TTY *buf);"
+	print  "extern NCURSES_EXPORT(int) _nc_read_entry2 (const char * const, char * const, TERMTYPE2 *const);"
+	print  "extern NCURSES_EXPORT(int) _nc_read_file_entry (const char *const, TERMTYPE2 *);"
+	print  "extern NCURSES_EXPORT(int) _nc_read_termtype (TERMTYPE2 *, char *, int);"
+	print  "extern NCURSES_EXPORT(char *) _nc_first_name (const char *const);"
+	print  "extern NCURSES_EXPORT(int) _nc_name_match (const char *const, const char *const, const char *const);"
+	print  "extern NCURSES_EXPORT(char *) _nc_tiparm(int, const char *, ...);"
+	print  ""
+	print  "#endif /* NCURSES_INTERNALS */"
+	print  ""
+	print  ""
+	print  "/*"
+	print  " * These entrypoints are used by tack 1.07."
+	print  " */"
+	print  "extern NCURSES_EXPORT(const TERMTYPE *) _nc_fallback (const char *);"
+	print  "extern NCURSES_EXPORT(int) _nc_read_entry (const char * const, char * const, TERMTYPE *const);"
+	print  ""
+	print  "/*"
+	print  " * Normal entry points"
+	print  " */"
+	print  "extern NCURSES_EXPORT(TERMINAL *) set_curterm (TERMINAL *);"
+	print  "extern NCURSES_EXPORT(int) del_curterm (TERMINAL *);"
+	print  ""
+	print  "/* miscellaneous entry points */"
+	print  "extern NCURSES_EXPORT(int) restartterm (NCURSES_CONST char *, int, int *);"
+	print  "extern NCURSES_EXPORT(int) setupterm (const char *,int,int *);"
+	print  ""
+	print  "/* terminfo entry points, also declared in curses.h */"
+	print  "#if !defined(__NCURSES_H)"
+	print  "extern NCURSES_EXPORT(char *) tigetstr (const char *);"
+	print  "extern NCURSES_EXPORT_VAR(char) ttytype[];"
+	print  "extern NCURSES_EXPORT(int) putp (const char *);"
+	print  "extern NCURSES_EXPORT(int) tigetflag (const char *);"
+	print  "extern NCURSES_EXPORT(int) tigetnum (const char *);"
+	print  ""
+	print  "#if @NCURSES_TPARM_VARARGS@ /* NCURSES_TPARM_VARARGS */"
+	print  "extern NCURSES_EXPORT(char *) tparm (const char *, ...);	/* special */"
+	print  "#else"
+	print  "extern NCURSES_EXPORT(char *) tparm (const char *, long,long,long,long,long,long,long,long,long);	/* special */"
+	print  "#endif"
+	print  ""
+	print  "extern NCURSES_EXPORT(char *) tiparm (const char *, ...);		/* special */"
+	print  ""
+	print  "#endif /* __NCURSES_H */"
+	print  ""
+	print  "/* termcap database emulation (XPG4 uses const only for 2nd param of tgetent) */"
+	print  "#if !defined(NCURSES_TERMCAP_H_incl)"
+	print  "extern NCURSES_EXPORT(char *) tgetstr (const char *, char **);"
+	print  "extern NCURSES_EXPORT(char *) tgoto (const char *, int, int);"
+	print  "extern NCURSES_EXPORT(int) tgetent (char *, const char *);"
+	print  "extern NCURSES_EXPORT(int) tgetflag (const char *);"
+	print  "extern NCURSES_EXPORT(int) tgetnum (const char *);"
+	print  "extern NCURSES_EXPORT(int) tputs (const char *, int, int (*)(int));"
+	print  "#endif /* NCURSES_TERMCAP_H_incl */"
+	print  ""
+	print  "/*"
+	print  " * Include curses.h before term.h to enable these extensions."
+	print  " */"
+	print  "#if defined(NCURSES_SP_FUNCS) && (NCURSES_SP_FUNCS != 0)"
+	print  ""
+	print  "extern NCURSES_EXPORT(char *)  NCURSES_SP_NAME(tigetstr) (SCREEN*, const char *);"
+	print  "extern NCURSES_EXPORT(int)     NCURSES_SP_NAME(putp) (SCREEN*, const char *);"
+	print  "extern NCURSES_EXPORT(int)     NCURSES_SP_NAME(tigetflag) (SCREEN*, const char *);"
+	print  "extern NCURSES_EXPORT(int)     NCURSES_SP_NAME(tigetnum) (SCREEN*, const char *);"
+	print  ""
+	print  "#if @NCURSES_TPARM_VARARGS@ /* NCURSES_TPARM_VARARGS */"
+	print  "extern NCURSES_EXPORT(char *)  NCURSES_SP_NAME(tparm) (SCREEN*, const char *, ...);	/* special */"
+	print  "#else"
+	print  "extern NCURSES_EXPORT(char *)  NCURSES_SP_NAME(tparm) (SCREEN*, const char *, long,long,long,long,long,long,long,long,long);	/* special */"
+	print  "#endif"
+	print  ""
+	print  "/* termcap database emulation (XPG4 uses const only for 2nd param of tgetent) */"
+	print  "extern NCURSES_EXPORT(char *)  NCURSES_SP_NAME(tgetstr) (SCREEN*, const char *, char **);"
+	print  "extern NCURSES_EXPORT(char *)  NCURSES_SP_NAME(tgoto) (SCREEN*, const char *, int, int);"
+	print  "extern NCURSES_EXPORT(int)     NCURSES_SP_NAME(tgetent) (SCREEN*, char *, const char *);"
+	print  "extern NCURSES_EXPORT(int)     NCURSES_SP_NAME(tgetflag) (SCREEN*, const char *);"
+	print  "extern NCURSES_EXPORT(int)     NCURSES_SP_NAME(tgetnum) (SCREEN*, const char *);"
+	print  "extern NCURSES_EXPORT(int)     NCURSES_SP_NAME(tputs) (SCREEN*, const char *, int, NCURSES_SP_OUTC);"
+	print  ""
+	print  "extern NCURSES_EXPORT(TERMINAL *) NCURSES_SP_NAME(set_curterm) (SCREEN*, TERMINAL *);"
+	print  "extern NCURSES_EXPORT(int)     NCURSES_SP_NAME(del_curterm) (SCREEN*, TERMINAL *);"
+	print  ""
+	print  "extern NCURSES_EXPORT(int)     NCURSES_SP_NAME(restartterm) (SCREEN*, NCURSES_CONST char *, int, int *);"
+	print  "#endif /* NCURSES_SP_FUNCS */"
+	print  ""
+	print  "/*"
+	print  " * Debugging features."
+	print  " */"
+	print  "extern GCC_NORETURN NCURSES_EXPORT(void)    exit_terminfo(int);"
+	print  ""
+	print  "#ifdef __cplusplus"
+	printf "%s\n", rcurl;
+	print  "#endif"
+	print  ""
+	print  "#endif /* NCURSES_TERM_H_incl */"
+}
diff --git a/include/Makefile.in b/include/Makefile.in
new file mode 100644
index 0000000..351383b
--- /dev/null
+++ b/include/Makefile.in
@@ -0,0 +1,177 @@
+# $Id: Makefile.in,v 1.53 2021/07/03 18:56:51 tom Exp $
+##############################################################################
+# Copyright 2019-2020,2021 Thomas E. Dickey                                  #
+# Copyright 1998-2013,2015 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey 1996-on
+#
+# Makefile for ncurses source code.
+#
+# This makes/installs ncurses include-files
+#
+# The variable 'srcdir' refers to the source-distribution, and can be set with
+# the configure script by "--srcdir=DIR".
+
+# turn off _all_ suffix rules; we'll generate our own
+.SUFFIXES:
+
+SHELL		= @SHELL@
+VPATH		= @srcdir@
+THIS		= Makefile
+
+DESTDIR		= @DESTDIR@
+srcdir		= @srcdir@
+prefix		= @prefix@
+exec_prefix	= @exec_prefix@
+includedir	= @includedir@
+includesubdir	= @includesubdir@
+
+INCLUDEDIR	= $(DESTDIR)$(includedir)$(includesubdir)
+
+INSTALL		= @INSTALL@
+INSTALL_DATA	= @INSTALL_DATA@
+
+AWK		= @AWK@
+LN_S		= @LN_S@
+
+CC		= @CC@
+CFLAGS		= @CFLAGS@ @EXTRA_CFLAGS@
+CPPFLAGS	= -DHAVE_CONFIG_H -I. @CPPFLAGS@
+
+CTAGS		= @CTAGS@
+ETAGS		= @ETAGS@
+
+VERSION		= @cf_cv_rel_version@
+
+# The "Caps" file specifies the terminfo database format, as well as the list
+# of function keys.
+TERMINFO_CAPS	= $(srcdir)/@TERMINFO_CAPS@
+CAPLIST	=	$(TERMINFO_CAPS) \
+		$(srcdir)/Caps-ncurses
+
+# These files are generated by the configure script
+CONFIG_SRC = \
+	MKterm.h.awk \
+	curses.head \
+	ncurses_dll.h \
+	termcap.h \
+	unctrl.h
+
+# These files are generated by this makefile
+AUTO_SRC = \
+	curses.h \
+	hashsize.h \
+	ncurses_def.h \
+	parametrized.h \
+	config.h \
+	term.h
+
+################################################################################
+
+@MAKE_PHONY@.PHONY :	all
+@MAKE_PHONY@.PHONY :	check
+@MAKE_PHONY@.PHONY :	clean
+@MAKE_PHONY@.PHONY :	depend
+@MAKE_PHONY@.PHONY :	distclean
+@MAKE_PHONY@.PHONY :	install
+@MAKE_PHONY@.PHONY :	install.libs
+@MAKE_PHONY@.PHONY :	libs
+@MAKE_PHONY@.PHONY :	mostlyclean
+@MAKE_PHONY@.PHONY :	realclean
+@MAKE_PHONY@.PHONY :	sources
+@MAKE_PHONY@.PHONY :	uninstall
+@MAKE_PHONY@.PHONY :	uninstall.libs
+
+all \
+libs \
+depend \
+sources \
+install ::	$(AUTO_SRC)
+
+curses.h :	$(CAPLIST) \
+		curses.head \
+		$(srcdir)/curses.tail \
+		$(srcdir)/MKkey_defs.sh
+	cat curses.head >$@
+	AWK=$(AWK) $(SHELL) $(srcdir)/MKkey_defs.sh $(CAPLIST) >>$@
+	$(SHELL) -c 'if test "@NCURSES_WGETCH_EVENTS@" = "1" ; then cat $(srcdir)/curses.events >>$@ ; fi'
+	$(SHELL) -c 'if test "@NCURSES_CH_T@" = "cchar_t" ; then cat $(srcdir)/curses.wide >>$@ ; fi'
+	cat $(srcdir)/curses.tail >>$@
+
+term.h: 	$(CAPLIST) \
+		MKterm.h.awk
+	$(AWK) -f MKterm.h.awk $(CAPLIST) > $@
+	$(SHELL) $(srcdir)/edit_cfg.sh ../include/ncurses_cfg.h $@
+
+hashsize.h:	$(CAPLIST) \
+		$(srcdir)/MKhashsize.sh
+	$(SHELL) $(srcdir)/MKhashsize.sh $(CAPLIST) >$@
+
+ncurses_def.h: $(srcdir)/ncurses_defs $(srcdir)/MKncurses_def.sh
+	AWK=$(AWK) $(SHELL) $(srcdir)/MKncurses_def.sh $(srcdir)/ncurses_defs >$@
+
+parametrized.h: $(CAPLIST) \
+		$(srcdir)/MKparametrized.sh
+	AWK=$(AWK) $(SHELL) $(srcdir)/MKparametrized.sh $(CAPLIST) >$@
+
+# This is required by pthread.h on MinGW
+config.h:
+	touch $@
+
+tags:
+	$(CTAGS) *.[ch]
+
+@MAKE_UPPER_TAGS@TAGS:
+@MAKE_UPPER_TAGS@	$(ETAGS) *.[ch]
+
+mostlyclean ::
+	-rm -f core tags TAGS *~ *.bak *.i *.ln *.atac trace
+
+clean :: mostlyclean
+	-rm -f $(AUTO_SRC)
+	-rm -rf *.dSYM
+
+distclean :: clean
+	-rm -f Makefile $(CONFIG_SRC) config.h
+
+realclean :: distclean
+
+# Verify that each header-file can be compiled without including another.
+check:
+	@$(SHELL) -c "for header in *.h;\
+		do \
+			echo \"** testing \$${header}\" ; \
+			echo \"#include <\$${header}>\" >headers.c; \
+			echo \"int main(void) { return 0; }\" >>headers.c; \
+			$(CC) -c $(CFLAGS) $(CPPFLAGS) headers.c; \
+		done"
+	-@rm -f headers.*
+
+###############################################################################
+# The remainder of this file is automatically generated during configuration
+###############################################################################
diff --git a/include/capdefaults.c b/include/capdefaults.c
new file mode 100644
index 0000000..0bdda14
--- /dev/null
+++ b/include/capdefaults.c
@@ -0,0 +1,87 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2000,2008 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ ****************************************************************************/
+
+/* $Id: capdefaults.c,v 1.16 2021/09/04 10:52:55 tom Exp $ */
+
+    /*
+     * Compute obsolete capabilities.  The reason this is an include file is
+     * that the two places where it is needed require the macros to generate
+     * offsets to different structures.  See the file Caps for explanations of
+     * these conversions.
+     *
+     * Note:  This code is the functional inverse of the first part of
+     * postprocess_termcap().
+     */
+{
+    char *strp;
+    short capval;
+
+#define EXTRACT_DELAY(str) \
+    	(short) (strp = strchr(str, '*'), strp ? atoi(strp+1) : 0)
+
+    /* current (4.4BSD) capabilities marked obsolete */
+    if (VALID_STRING(carriage_return)
+	&& (capval = EXTRACT_DELAY(carriage_return)))
+	carriage_return_delay = capval;
+    if (VALID_STRING(newline) && (capval = EXTRACT_DELAY(newline)))
+	new_line_delay = capval;
+
+    /* current (4.4BSD) capabilities not obsolete */
+    if (!VALID_STRING(termcap_init2) && VALID_STRING(init_3string)) {
+	termcap_init2 = init_3string;
+	init_3string = ABSENT_STRING;
+    }
+    if (!VALID_STRING(termcap_reset)
+     && VALID_STRING(reset_2string)
+     && !VALID_STRING(reset_1string)
+     && !VALID_STRING(reset_3string)) {
+	termcap_reset = reset_2string;
+	reset_2string = ABSENT_STRING;
+    }
+    if (magic_cookie_glitch_ul == ABSENT_NUMERIC
+	&& magic_cookie_glitch != ABSENT_NUMERIC
+	&& VALID_STRING(enter_underline_mode))
+	magic_cookie_glitch_ul = magic_cookie_glitch;
+
+    /* totally obsolete capabilities */
+    linefeed_is_newline = (char) (VALID_STRING(newline)
+				  && (strcmp("\n", newline) == 0));
+    if (VALID_STRING(cursor_left)
+	&& (capval = EXTRACT_DELAY(cursor_left)))
+	backspace_delay = capval;
+    if (VALID_STRING(tab) && (capval = EXTRACT_DELAY(tab)))
+	horizontal_tab_delay = capval;
+#undef EXTRACT_DELAY
+}
diff --git a/include/curses.events b/include/curses.events
new file mode 100644
index 0000000..25a2583
--- /dev/null
+++ b/include/curses.events
@@ -0,0 +1,55 @@
+/* $Id*/
+/*
+ * vile:cmode:
+ * This file is part of ncurses, designed to be appended after curses.h.in
+ * (see that file for the relevant copyright).
+ */
+
+/*
+ * This is an extension to support events...
+ */
+#ifdef NCURSES_WGETCH_EVENTS
+#if !defined(__BEOS__) || defined(__HAIKU__)
+   /* Fix _nc_timed_wait() on BEOS... */
+#  define NCURSES_EVENT_VERSION	1
+#endif	/* !defined(__BEOS__) */
+
+/*
+ * Bits to set in _nc_event.data.flags
+ */
+#  define _NC_EVENT_TIMEOUT_MSEC	1
+#  define _NC_EVENT_FILE		2
+#  define _NC_EVENT_FILE_READABLE	2
+#  if 0					/* Not supported yet... */
+#    define _NC_EVENT_FILE_WRITABLE	4
+#    define _NC_EVENT_FILE_EXCEPTION	8
+#  endif
+
+typedef struct
+{
+    int type;
+    union
+    {
+	long timeout_msec;	/* _NC_EVENT_TIMEOUT_MSEC */
+	struct
+	{
+	    unsigned int flags;
+	    int fd;
+	    unsigned int result;
+	} fev;				/* _NC_EVENT_FILE */
+    } data;
+} _nc_event;
+
+typedef struct
+{
+    int count;
+    int result_flags;	/* _NC_EVENT_TIMEOUT_MSEC or _NC_EVENT_FILE_READABLE */
+    _nc_event *events[1];
+} _nc_eventlist;
+
+extern NCURSES_EXPORT(int) wgetch_events (WINDOW *, _nc_eventlist *) GCC_DEPRECATED(experimental option); /* experimental */
+extern NCURSES_EXPORT(int) wgetnstr_events (WINDOW *,char *,int,_nc_eventlist *) GCC_DEPRECATED(experimental option); /* experimental */
+
+#define KEY_EVENT	0633		/* We were interrupted by an event */
+
+#endif /* NCURSES_WGETCH_EVENTS */
diff --git a/include/curses.h.in b/include/curses.h.in
new file mode 100644
index 0000000..6acf2d0
--- /dev/null
+++ b/include/curses.h.in
@@ -0,0 +1,1506 @@
+/****************************************************************************
+ * Copyright 2018-2020,2021 Thomas E. Dickey                                *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ ****************************************************************************/
+
+/* $Id: curses.h.in,v 1.277 2021/09/24 16:07:37 tom Exp $ */
+
+#ifndef __NCURSES_H
+#define __NCURSES_H
+
+/*
+ The symbols beginning NCURSES_ or USE_ are configuration choices.
+ A few of the former can be overridden by applications at compile-time.
+ Most of the others correspond to configure-script options (or checks
+ by the configure-script for features of the system on which it is built).
+
+ These symbols can be overridden by applications at compile-time:
+ NCURSES_NOMACROS suppresses macro definitions in favor of functions
+ NCURSES_WATTR_MACROS suppresses wattr_* macro definitions
+ NCURSES_WIDECHAR is an alternative for declaring wide-character functions.
+
+ These symbols are used only when building ncurses:
+ NCURSES_ATTR_T
+ NCURSES_FIELD_INTERNALS
+ NCURSES_INTERNALS
+
+ These symbols are set by the configure script:
+ NCURSES_ENABLE_STDBOOL_H
+ NCURSES_EXPANDED
+ NCURSES_EXT_COLORS
+ NCURSES_EXT_FUNCS
+ NCURSES_EXT_PUTWIN
+ NCURSES_NO_PADDING
+ NCURSES_OSPEED_COMPAT
+ NCURSES_PATHSEP
+ NCURSES_REENTRANT
+ */
+
+#define CURSES 1
+#define CURSES_H 1
+
+/* These are defined only in curses.h, and are used for conditional compiles */
+#define NCURSES_VERSION_MAJOR @NCURSES_MAJOR@
+#define NCURSES_VERSION_MINOR @NCURSES_MINOR@
+#define NCURSES_VERSION_PATCH @NCURSES_PATCH@
+
+/* This is defined in more than one ncurses header, for identification */
+#undef  NCURSES_VERSION
+#define NCURSES_VERSION "@NCURSES_MAJOR@.@NCURSES_MINOR@"
+
+/*
+ * Identify the mouse encoding version.
+ */
+#define NCURSES_MOUSE_VERSION @NCURSES_MOUSE_VERSION@
+
+/*
+ * Definitions to facilitate DLL's.
+ */
+#include <ncurses_dll.h>
+
+/*
+ * Extra headers.
+ */
+#if @HAVE_STDINT_H@
+#include <stdint.h>
+#endif
+
+#ifdef __cplusplus
+#else
+#if @HAVE_STDNORETURN_H@
+#include <stdnoreturn.h>
+#undef GCC_NORETURN
+#define GCC_NORETURN _Noreturn
+#endif
+#endif
+
+/*
+ * User-definable tweak to disable the include of <stdbool.h>.
+ */
+#ifndef NCURSES_ENABLE_STDBOOL_H
+#define NCURSES_ENABLE_STDBOOL_H @cf_cv_header_stdbool_h@
+#endif
+
+/*
+ * NCURSES_ATTR_T is used to quiet compiler warnings when building ncurses
+ * configured using --disable-macros.
+ */
+#ifndef NCURSES_ATTR_T
+#define NCURSES_ATTR_T int
+#endif
+
+/*
+ * Expands to 'const' if ncurses is configured using --enable-const.  Note that
+ * doing so makes it incompatible with other implementations of X/Open Curses.
+ */
+#undef  NCURSES_CONST
+#define NCURSES_CONST @NCURSES_CONST@
+
+#undef NCURSES_INLINE
+#define NCURSES_INLINE @NCURSES_INLINE@
+
+/*
+ * The standard type used for color values, and for color-pairs.  The latter
+ * allows the curses library to enumerate the combinations of foreground and
+ * background colors used by an application, and is normally the product of the
+ * total foreground and background colors.
+ *
+ * X/Open uses "short" for both of these types, ultimately because they are
+ * numbers from the SVr4 terminal database, which uses 16-bit signed values.
+ */
+#undef	NCURSES_COLOR_T
+#define	NCURSES_COLOR_T short
+
+#undef	NCURSES_PAIRS_T
+#define	NCURSES_PAIRS_T short
+
+/*
+ * Definitions used to make WINDOW and similar structs opaque.
+ */
+#ifndef NCURSES_INTERNALS
+#define NCURSES_OPAQUE       @NCURSES_OPAQUE@
+#define NCURSES_OPAQUE_FORM  @NCURSES_OPAQUE_FORM@
+#define NCURSES_OPAQUE_MENU  @NCURSES_OPAQUE_MENU@
+#define NCURSES_OPAQUE_PANEL @NCURSES_OPAQUE_PANEL@
+#endif
+
+/*
+ * Definition used to optionally suppress wattr* macros to help with the
+ * transition from ncurses5 to ncurses6 by allowing the header files to
+ * be shared across development packages for ncursesw in both ABIs.
+ */
+#ifndef NCURSES_WATTR_MACROS
+#define NCURSES_WATTR_MACROS @NCURSES_WATTR_MACROS@
+#endif
+
+/*
+ * The reentrant code relies on the opaque setting, but adds features.
+ */
+#ifndef NCURSES_REENTRANT
+#define NCURSES_REENTRANT @cf_cv_enable_reentrant@
+#endif
+
+/*
+ * In certain environments, we must work around linker problems for data
+ */
+#undef NCURSES_BROKEN_LINKER
+#if @BROKEN_LINKER@
+#define NCURSES_BROKEN_LINKER 1
+#endif
+
+/*
+ * Control whether bindings for interop support are added.
+ */
+#undef	NCURSES_INTEROP_FUNCS
+#define	NCURSES_INTEROP_FUNCS @NCURSES_INTEROP_FUNCS@
+
+/*
+ * The internal type used for window dimensions.
+ */
+#undef	NCURSES_SIZE_T
+#define	NCURSES_SIZE_T @NCURSES_SIZE_T@
+
+/*
+ * Control whether tparm() supports varargs or fixed-parameter list.
+ */
+#undef NCURSES_TPARM_VARARGS
+#define NCURSES_TPARM_VARARGS @NCURSES_TPARM_VARARGS@
+
+/*
+ * Control type used for tparm's arguments.  While X/Open equates long and
+ * char* values, this is not always workable for 64-bit platforms.
+ */
+#undef NCURSES_TPARM_ARG
+#define NCURSES_TPARM_ARG @NCURSES_TPARM_ARG@
+
+/*
+ * Control whether ncurses uses wcwidth() for checking width of line-drawing
+ * characters.
+ */
+#undef NCURSES_WCWIDTH_GRAPHICS
+#define NCURSES_WCWIDTH_GRAPHICS @NCURSES_WCWIDTH_GRAPHICS@
+
+/*
+ * NCURSES_CH_T is used in building the library, but not used otherwise in
+ * this header file, since that would make the normal/wide-character versions
+ * of the header incompatible.
+ */
+#undef	NCURSES_CH_T
+#define NCURSES_CH_T @NCURSES_CH_T@
+
+#if @cf_cv_enable_lp64@ && defined(_LP64)
+typedef unsigned chtype;
+typedef unsigned mmask_t;
+#else
+typedef @cf_cv_typeof_chtype@ chtype;
+typedef @cf_cv_typeof_mmask_t@ mmask_t;
+#endif
+
+/*
+ * We need FILE, etc.  Include this before checking any feature symbols.
+ */
+#include <stdio.h>
+
+/*
+ * With XPG4, you must define _XOPEN_SOURCE_EXTENDED, it is redundant (or
+ * conflicting) when _XOPEN_SOURCE is 500 or greater.  If NCURSES_WIDECHAR is
+ * not already defined, e.g., if the platform relies upon nonstandard feature
+ * test macros, define it at this point if the standard feature test macros
+ * indicate that it should be defined.
+ */
+#ifndef NCURSES_WIDECHAR
+#if defined(_XOPEN_SOURCE_EXTENDED) || (defined(_XOPEN_SOURCE) && (_XOPEN_SOURCE - 0 >= 500))
+#define NCURSES_WIDECHAR 1
+#else
+#define NCURSES_WIDECHAR 0
+#endif
+#endif /* NCURSES_WIDECHAR */
+
+#include <stdarg.h>	/* we need va_list */
+#if NCURSES_WIDECHAR
+#include <stddef.h>	/* we want wchar_t */
+#endif
+
+/* X/Open and SVr4 specify that curses implements 'bool'.  However, C++ may also
+ * implement it.  If so, we must use the C++ compiler's type to avoid conflict
+ * with other interfaces.
+ *
+ * A further complication is that <stdbool.h> may declare 'bool' to be a
+ * different type, such as an enum which is not necessarily compatible with
+ * C++.  If we have <stdbool.h>, make 'bool' a macro, so users may #undef it.
+ * Otherwise, let it remain a typedef to avoid conflicts with other #define's.
+ * In either case, make a typedef for NCURSES_BOOL which can be used if needed
+ * from either C or C++.
+ */
+
+#undef TRUE
+#define TRUE    1
+
+#undef FALSE
+#define FALSE   0
+
+typedef @cf_cv_type_of_bool@ NCURSES_BOOL;
+
+#if @USE_CXX_BOOL@	/* __cplusplus, etc. */
+
+/* use the C++ compiler's bool type */
+#define NCURSES_BOOL bool
+
+#else			/* c89, c99, etc. */
+
+#if NCURSES_ENABLE_STDBOOL_H
+#include <stdbool.h>
+/* use whatever the C compiler decides bool really is */
+#define NCURSES_BOOL bool
+#else
+/* there is no predefined bool - use our own */
+#undef bool
+#define bool NCURSES_BOOL
+#endif
+
+#endif /* !__cplusplus, etc. */
+
+#ifdef __cplusplus
+extern "C" {
+#define NCURSES_CAST(type,value) static_cast<type>(value)
+#else
+#define NCURSES_CAST(type,value) (type)(value)
+#endif
+
+#define NCURSES_OK_ADDR(p) (0 != NCURSES_CAST(const void *, (p)))
+
+/*
+ * X/Open attributes.  In the ncurses implementation, they are identical to the
+ * A_ attributes.
+ */
+#define WA_ATTRIBUTES	A_ATTRIBUTES
+#define WA_NORMAL	A_NORMAL
+#define WA_STANDOUT	A_STANDOUT
+#define WA_UNDERLINE	A_UNDERLINE
+#define WA_REVERSE	A_REVERSE
+#define WA_BLINK	A_BLINK
+#define WA_DIM		A_DIM
+#define WA_BOLD		A_BOLD
+#define WA_ALTCHARSET	A_ALTCHARSET
+#define WA_INVIS	A_INVIS
+#define WA_PROTECT	A_PROTECT
+#define WA_HORIZONTAL	A_HORIZONTAL
+#define WA_LEFT		A_LEFT
+#define WA_LOW		A_LOW
+#define WA_RIGHT	A_RIGHT
+#define WA_TOP		A_TOP
+#define WA_VERTICAL	A_VERTICAL
+
+#if @NCURSES_EXT_FUNCS@
+#define WA_ITALIC	A_ITALIC	/* ncurses extension */
+#endif
+
+/* colors */
+#define COLOR_BLACK	0
+#define COLOR_RED	1
+#define COLOR_GREEN	2
+#define COLOR_YELLOW	3
+#define COLOR_BLUE	4
+#define COLOR_MAGENTA	5
+#define COLOR_CYAN	6
+#define COLOR_WHITE	7
+
+/* line graphics */
+
+#if @BROKEN_LINKER@ || NCURSES_REENTRANT
+NCURSES_WRAPPED_VAR(chtype*, acs_map);
+#define acs_map NCURSES_PUBLIC_VAR(acs_map())
+#else
+extern NCURSES_EXPORT_VAR(chtype) acs_map[];
+#endif
+
+#define NCURSES_ACS(c)	(acs_map[NCURSES_CAST(unsigned char,(c))])
+
+/* VT100 symbols begin here */
+#define ACS_ULCORNER	NCURSES_ACS('l') /* upper left corner */
+#define ACS_LLCORNER	NCURSES_ACS('m') /* lower left corner */
+#define ACS_URCORNER	NCURSES_ACS('k') /* upper right corner */
+#define ACS_LRCORNER	NCURSES_ACS('j') /* lower right corner */
+#define ACS_LTEE	NCURSES_ACS('t') /* tee pointing right */
+#define ACS_RTEE	NCURSES_ACS('u') /* tee pointing left */
+#define ACS_BTEE	NCURSES_ACS('v') /* tee pointing up */
+#define ACS_TTEE	NCURSES_ACS('w') /* tee pointing down */
+#define ACS_HLINE	NCURSES_ACS('q') /* horizontal line */
+#define ACS_VLINE	NCURSES_ACS('x') /* vertical line */
+#define ACS_PLUS	NCURSES_ACS('n') /* large plus or crossover */
+#define ACS_S1		NCURSES_ACS('o') /* scan line 1 */
+#define ACS_S9		NCURSES_ACS('s') /* scan line 9 */
+#define ACS_DIAMOND	NCURSES_ACS('`') /* diamond */
+#define ACS_CKBOARD	NCURSES_ACS('a') /* checker board (stipple) */
+#define ACS_DEGREE	NCURSES_ACS('f') /* degree symbol */
+#define ACS_PLMINUS	NCURSES_ACS('g') /* plus/minus */
+#define ACS_BULLET	NCURSES_ACS('~') /* bullet */
+/* Teletype 5410v1 symbols begin here */
+#define ACS_LARROW	NCURSES_ACS(',') /* arrow pointing left */
+#define ACS_RARROW	NCURSES_ACS('+') /* arrow pointing right */
+#define ACS_DARROW	NCURSES_ACS('.') /* arrow pointing down */
+#define ACS_UARROW	NCURSES_ACS('-') /* arrow pointing up */
+#define ACS_BOARD	NCURSES_ACS('h') /* board of squares */
+#define ACS_LANTERN	NCURSES_ACS('i') /* lantern symbol */
+#define ACS_BLOCK	NCURSES_ACS('0') /* solid square block */
+/*
+ * These aren't documented, but a lot of System Vs have them anyway
+ * (you can spot pprryyzz{{||}} in a lot of AT&T terminfo strings).
+ * The ACS_names may not match AT&T's, our source didn't know them.
+ */
+#define ACS_S3		NCURSES_ACS('p') /* scan line 3 */
+#define ACS_S7		NCURSES_ACS('r') /* scan line 7 */
+#define ACS_LEQUAL	NCURSES_ACS('y') /* less/equal */
+#define ACS_GEQUAL	NCURSES_ACS('z') /* greater/equal */
+#define ACS_PI		NCURSES_ACS('{') /* Pi */
+#define ACS_NEQUAL	NCURSES_ACS('|') /* not equal */
+#define ACS_STERLING	NCURSES_ACS('}') /* UK pound sign */
+
+/*
+ * Line drawing ACS names are of the form ACS_trbl, where t is the top, r
+ * is the right, b is the bottom, and l is the left.  t, r, b, and l might
+ * be B (blank), S (single), D (double), or T (thick).  The subset defined
+ * here only uses B and S.
+ */
+#define ACS_BSSB	ACS_ULCORNER
+#define ACS_SSBB	ACS_LLCORNER
+#define ACS_BBSS	ACS_URCORNER
+#define ACS_SBBS	ACS_LRCORNER
+#define ACS_SBSS	ACS_RTEE
+#define ACS_SSSB	ACS_LTEE
+#define ACS_SSBS	ACS_BTEE
+#define ACS_BSSS	ACS_TTEE
+#define ACS_BSBS	ACS_HLINE
+#define ACS_SBSB	ACS_VLINE
+#define ACS_SSSS	ACS_PLUS
+
+#undef	ERR
+#define ERR     (-1)
+
+#undef	OK
+#define OK      (0)
+
+/* values for the _flags member */
+#define _SUBWIN         0x01	/* is this a sub-window? */
+#define _ENDLINE        0x02	/* is the window flush right? */
+#define _FULLWIN        0x04	/* is the window full-screen? */
+#define _SCROLLWIN      0x08	/* bottom edge is at screen bottom? */
+#define _ISPAD	        0x10	/* is this window a pad? */
+#define _HASMOVED       0x20	/* has cursor moved since last refresh? */
+#define _WRAPPED        0x40	/* cursor was just wrappped */
+
+/*
+ * this value is used in the firstchar and lastchar fields to mark
+ * unchanged lines
+ */
+#define _NOCHANGE       -1
+
+/*
+ * this value is used in the oldindex field to mark lines created by insertions
+ * and scrolls.
+ */
+#define _NEWINDEX	-1
+
+#ifdef NCURSES_INTERNALS
+#undef SCREEN
+#define SCREEN struct screen
+SCREEN;
+#else
+typedef struct screen  SCREEN;
+#endif
+
+typedef struct _win_st WINDOW;
+
+typedef	chtype	attr_t;		/* ...must be at least as wide as chtype */
+
+#if NCURSES_WIDECHAR
+
+#if @NCURSES_LIBUTF8@
+#ifdef mblen			/* libutf8.h defines it w/o undefining first */
+#undef mblen
+#endif
+#include <libutf8.h>
+#endif
+
+#if @NEED_WCHAR_H@
+#include <wchar.h>		/* ...to get mbstate_t, etc. */
+#endif
+
+#if @NCURSES_WCHAR_T@
+typedef unsigned short wchar_t@NCURSES_OK_WCHAR_T@;
+#endif
+
+#if @NCURSES_WINT_T@
+typedef unsigned int wint_t@NCURSES_OK_WCHAR_T@;
+#endif
+
+/*
+ * cchar_t stores an array of CCHARW_MAX wide characters.  The first is
+ * normally a spacing character.  The others are non-spacing.  If those
+ * (spacing and nonspacing) do not fill the array, a null L'\0' follows.
+ * Otherwise, a null is assumed to follow when extracting via getcchar().
+ */
+#define CCHARW_MAX	@NCURSES_CCHARW_MAX@
+typedef struct
+{
+    attr_t	attr;
+    wchar_t	chars[CCHARW_MAX];
+#if @NCURSES_EXT_COLORS@
+#undef NCURSES_EXT_COLORS
+#define NCURSES_EXT_COLORS @NCURSES_PATCH@
+    int		ext_color;	/* color pair, must be more than 16-bits */
+#endif
+}
+cchar_t;
+
+#endif /* NCURSES_WIDECHAR */
+
+#if !NCURSES_OPAQUE
+struct ldat;
+
+struct _win_st
+{
+	NCURSES_SIZE_T _cury, _curx; /* current cursor position */
+
+	/* window location and size */
+	NCURSES_SIZE_T _maxy, _maxx; /* maximums of x and y, NOT window size */
+	NCURSES_SIZE_T _begy, _begx; /* screen coords of upper-left-hand corner */
+
+	short   _flags;		/* window state flags */
+
+	/* attribute tracking */
+	attr_t  _attrs;		/* current attribute for non-space character */
+	chtype  _bkgd;		/* current background char/attribute pair */
+
+	/* option values set by user */
+	bool	_notimeout;	/* no time out on function-key entry? */
+	bool	_clear;		/* consider all data in the window invalid? */
+	bool	_leaveok;	/* OK to not reset cursor on exit? */
+	bool	_scroll;	/* OK to scroll this window? */
+	bool	_idlok;		/* OK to use insert/delete line? */
+	bool	_idcok;		/* OK to use insert/delete char? */
+	bool	_immed;		/* window in immed mode? (not yet used) */
+	bool	_sync;		/* window in sync mode? */
+	bool	_use_keypad;	/* process function keys into KEY_ symbols? */
+	int	_delay;		/* 0 = nodelay, <0 = blocking, >0 = delay */
+
+	struct ldat *_line;	/* the actual line data */
+
+	/* global screen state */
+	NCURSES_SIZE_T _regtop;	/* top line of scrolling region */
+	NCURSES_SIZE_T _regbottom; /* bottom line of scrolling region */
+
+	/* these are used only if this is a sub-window */
+	int	_parx;		/* x coordinate of this window in parent */
+	int	_pary;		/* y coordinate of this window in parent */
+	WINDOW	*_parent;	/* pointer to parent if a sub-window */
+
+	/* these are used only if this is a pad */
+	struct pdat
+	{
+	    NCURSES_SIZE_T _pad_y,      _pad_x;
+	    NCURSES_SIZE_T _pad_top,    _pad_left;
+	    NCURSES_SIZE_T _pad_bottom, _pad_right;
+	} _pad;
+
+	NCURSES_SIZE_T _yoffset; /* real begy is _begy + _yoffset */
+
+#if NCURSES_WIDECHAR
+	cchar_t  _bkgrnd;	/* current background char/attribute pair */
+#if @NCURSES_EXT_COLORS@
+	int	_color;		/* current color-pair for non-space character */
+#endif
+#endif
+};
+#endif /* NCURSES_OPAQUE */
+
+/*
+ * GCC (and some other compilers) define '__attribute__'; we're using this
+ * macro to alert the compiler to flag inconsistencies in printf/scanf-like
+ * function calls.  Just in case '__attribute__' isn't defined, make a dummy.
+ * Old versions of G++ do not accept it anyway, at least not consistently with
+ * GCC.
+ */
+#if !(defined(__GNUC__) || defined(__GNUG__) || defined(__attribute__))
+#define __attribute__(p) /* nothing */
+#endif
+
+/*
+ * We cannot define these in ncurses_cfg.h, since they require parameters to be
+ * passed (that is non-portable).
+ */
+#ifndef GCC_PRINTFLIKE
+#ifndef printf
+#define GCC_PRINTFLIKE(fmt,var) __attribute__((format(printf,fmt,var)))
+#else
+#define GCC_PRINTFLIKE(fmt,var) /*nothing*/
+#endif
+#endif
+
+#ifndef GCC_SCANFLIKE
+#ifndef scanf
+#define GCC_SCANFLIKE(fmt,var)  __attribute__((format(scanf,fmt,var)))
+#else
+#define GCC_SCANFLIKE(fmt,var)  /*nothing*/
+#endif
+#endif
+
+#ifndef	GCC_NORETURN
+#define	GCC_NORETURN /* nothing */
+#endif
+
+#ifndef	GCC_UNUSED
+#define	GCC_UNUSED /* nothing */
+#endif
+
+#undef  GCC_DEPRECATED
+#if (__GNUC__ - 0 > 3 || (__GNUC__ - 0 == 3 && __GNUC_MINOR__ - 0 >= 2)) && !defined(NCURSES_INTERNALS)
+#define GCC_DEPRECATED(msg) __attribute__((deprecated))
+#else
+#define GCC_DEPRECATED(msg) /* nothing */
+#endif
+
+/*
+ * Curses uses a helper function.  Define our type for this to simplify
+ * extending it for the sp-funcs feature.
+ */
+typedef int (*NCURSES_OUTC)(int);
+
+/*
+ * Function prototypes.  This is the complete X/Open Curses list of required
+ * functions.  Those marked `generated' will have sources generated from the
+ * macro definitions later in this file, in order to satisfy XPG4.2
+ * requirements.
+ */
+
+extern NCURSES_EXPORT(int) addch (const chtype);			/* generated */
+extern NCURSES_EXPORT(int) addchnstr (const chtype *, int);		/* generated */
+extern NCURSES_EXPORT(int) addchstr (const chtype *);			/* generated */
+extern NCURSES_EXPORT(int) addnstr (const char *, int);			/* generated */
+extern NCURSES_EXPORT(int) addstr (const char *);			/* generated */
+extern NCURSES_EXPORT(int) attroff (NCURSES_ATTR_T);			/* generated */
+extern NCURSES_EXPORT(int) attron (NCURSES_ATTR_T);			/* generated */
+extern NCURSES_EXPORT(int) attrset (NCURSES_ATTR_T);			/* generated */
+extern NCURSES_EXPORT(int) attr_get (attr_t *, NCURSES_PAIRS_T *, void *);	/* generated */
+extern NCURSES_EXPORT(int) attr_off (attr_t, void *);			/* generated */
+extern NCURSES_EXPORT(int) attr_on (attr_t, void *);			/* generated */
+extern NCURSES_EXPORT(int) attr_set (attr_t, NCURSES_PAIRS_T, void *);		/* generated */
+extern NCURSES_EXPORT(int) baudrate (void);				/* implemented */
+extern NCURSES_EXPORT(int) beep  (void);				/* implemented */
+extern NCURSES_EXPORT(int) bkgd (chtype);				/* generated */
+extern NCURSES_EXPORT(void) bkgdset (chtype);				/* generated */
+extern NCURSES_EXPORT(int) border (chtype,chtype,chtype,chtype,chtype,chtype,chtype,chtype);	/* generated */
+extern NCURSES_EXPORT(int) box (WINDOW *, chtype, chtype);		/* generated */
+extern NCURSES_EXPORT(bool) can_change_color (void);			/* implemented */
+extern NCURSES_EXPORT(int) cbreak (void);				/* implemented */
+extern NCURSES_EXPORT(int) chgat (int, attr_t, NCURSES_PAIRS_T, const void *);	/* generated */
+extern NCURSES_EXPORT(int) clear (void);				/* generated */
+extern NCURSES_EXPORT(int) clearok (WINDOW *,bool);			/* implemented */
+extern NCURSES_EXPORT(int) clrtobot (void);				/* generated */
+extern NCURSES_EXPORT(int) clrtoeol (void);				/* generated */
+extern NCURSES_EXPORT(int) color_content (NCURSES_COLOR_T,NCURSES_COLOR_T*,NCURSES_COLOR_T*,NCURSES_COLOR_T*);	/* implemented */
+extern NCURSES_EXPORT(int) color_set (NCURSES_PAIRS_T,void*);			/* generated */
+extern NCURSES_EXPORT(int) COLOR_PAIR (int);				/* generated */
+extern NCURSES_EXPORT(int) copywin (const WINDOW*,WINDOW*,int,int,int,int,int,int,int);	/* implemented */
+extern NCURSES_EXPORT(int) curs_set (int);				/* implemented */
+extern NCURSES_EXPORT(int) def_prog_mode (void);			/* implemented */
+extern NCURSES_EXPORT(int) def_shell_mode (void);			/* implemented */
+extern NCURSES_EXPORT(int) delay_output (int);				/* implemented */
+extern NCURSES_EXPORT(int) delch (void);				/* generated */
+extern NCURSES_EXPORT(void) delscreen (SCREEN *);			/* implemented */
+extern NCURSES_EXPORT(int) delwin (WINDOW *);				/* implemented */
+extern NCURSES_EXPORT(int) deleteln (void);				/* generated */
+extern NCURSES_EXPORT(WINDOW *) derwin (WINDOW *,int,int,int,int);	/* implemented */
+extern NCURSES_EXPORT(int) doupdate (void);				/* implemented */
+extern NCURSES_EXPORT(WINDOW *) dupwin (WINDOW *);			/* implemented */
+extern NCURSES_EXPORT(int) echo (void);					/* implemented */
+extern NCURSES_EXPORT(int) echochar (const chtype);			/* generated */
+extern NCURSES_EXPORT(int) erase (void);				/* generated */
+extern NCURSES_EXPORT(int) endwin (void);				/* implemented */
+extern NCURSES_EXPORT(char) erasechar (void);				/* implemented */
+extern NCURSES_EXPORT(void) filter (void);				/* implemented */
+extern NCURSES_EXPORT(int) flash (void);				/* implemented */
+extern NCURSES_EXPORT(int) flushinp (void);				/* implemented */
+extern NCURSES_EXPORT(chtype) getbkgd (WINDOW *);			/* generated */
+extern NCURSES_EXPORT(int) getch (void);				/* generated */
+extern NCURSES_EXPORT(int) getnstr (char *, int);			/* generated */
+extern NCURSES_EXPORT(int) getstr (char *);				/* generated */
+extern NCURSES_EXPORT(WINDOW *) getwin (FILE *);			/* implemented */
+extern NCURSES_EXPORT(int) halfdelay (int);				/* implemented */
+extern NCURSES_EXPORT(bool) has_colors (void);				/* implemented */
+extern NCURSES_EXPORT(bool) has_ic (void);				/* implemented */
+extern NCURSES_EXPORT(bool) has_il (void);				/* implemented */
+extern NCURSES_EXPORT(int) hline (chtype, int);				/* generated */
+extern NCURSES_EXPORT(void) idcok (WINDOW *, bool);			/* implemented */
+extern NCURSES_EXPORT(int) idlok (WINDOW *, bool);			/* implemented */
+extern NCURSES_EXPORT(void) immedok (WINDOW *, bool);			/* implemented */
+extern NCURSES_EXPORT(chtype) inch (void);				/* generated */
+extern NCURSES_EXPORT(int) inchnstr (chtype *, int);			/* generated */
+extern NCURSES_EXPORT(int) inchstr (chtype *);				/* generated */
+extern NCURSES_EXPORT(WINDOW *) initscr (void);				/* implemented */
+extern NCURSES_EXPORT(int) init_color (NCURSES_COLOR_T,NCURSES_COLOR_T,NCURSES_COLOR_T,NCURSES_COLOR_T);	/* implemented */
+extern NCURSES_EXPORT(int) init_pair (NCURSES_PAIRS_T,NCURSES_COLOR_T,NCURSES_COLOR_T);		/* implemented */
+extern NCURSES_EXPORT(int) innstr (char *, int);			/* generated */
+extern NCURSES_EXPORT(int) insch (chtype);				/* generated */
+extern NCURSES_EXPORT(int) insdelln (int);				/* generated */
+extern NCURSES_EXPORT(int) insertln (void);				/* generated */
+extern NCURSES_EXPORT(int) insnstr (const char *, int);			/* generated */
+extern NCURSES_EXPORT(int) insstr (const char *);			/* generated */
+extern NCURSES_EXPORT(int) instr (char *);				/* generated */
+extern NCURSES_EXPORT(int) intrflush (WINDOW *,bool);			/* implemented */
+extern NCURSES_EXPORT(bool) isendwin (void);				/* implemented */
+extern NCURSES_EXPORT(bool) is_linetouched (WINDOW *,int);		/* implemented */
+extern NCURSES_EXPORT(bool) is_wintouched (WINDOW *);			/* implemented */
+extern NCURSES_EXPORT(NCURSES_CONST char *) keyname (int);		/* implemented */
+extern NCURSES_EXPORT(int) keypad (WINDOW *,bool);			/* implemented */
+extern NCURSES_EXPORT(char) killchar (void);				/* implemented */
+extern NCURSES_EXPORT(int) leaveok (WINDOW *,bool);			/* implemented */
+extern NCURSES_EXPORT(char *) longname (void);				/* implemented */
+extern NCURSES_EXPORT(int) meta (WINDOW *,bool);			/* implemented */
+extern NCURSES_EXPORT(int) move (int, int);				/* generated */
+extern NCURSES_EXPORT(int) mvaddch (int, int, const chtype);		/* generated */
+extern NCURSES_EXPORT(int) mvaddchnstr (int, int, const chtype *, int);	/* generated */
+extern NCURSES_EXPORT(int) mvaddchstr (int, int, const chtype *);	/* generated */
+extern NCURSES_EXPORT(int) mvaddnstr (int, int, const char *, int);	/* generated */
+extern NCURSES_EXPORT(int) mvaddstr (int, int, const char *);		/* generated */
+extern NCURSES_EXPORT(int) mvchgat (int, int, int, attr_t, NCURSES_PAIRS_T, const void *);	/* generated */
+extern NCURSES_EXPORT(int) mvcur (int,int,int,int);			/* implemented */
+extern NCURSES_EXPORT(int) mvdelch (int, int);				/* generated */
+extern NCURSES_EXPORT(int) mvderwin (WINDOW *, int, int);		/* implemented */
+extern NCURSES_EXPORT(int) mvgetch (int, int);				/* generated */
+extern NCURSES_EXPORT(int) mvgetnstr (int, int, char *, int);		/* generated */
+extern NCURSES_EXPORT(int) mvgetstr (int, int, char *);			/* generated */
+extern NCURSES_EXPORT(int) mvhline (int, int, chtype, int);		/* generated */
+extern NCURSES_EXPORT(chtype) mvinch (int, int);			/* generated */
+extern NCURSES_EXPORT(int) mvinchnstr (int, int, chtype *, int);	/* generated */
+extern NCURSES_EXPORT(int) mvinchstr (int, int, chtype *);		/* generated */
+extern NCURSES_EXPORT(int) mvinnstr (int, int, char *, int);		/* generated */
+extern NCURSES_EXPORT(int) mvinsch (int, int, chtype);			/* generated */
+extern NCURSES_EXPORT(int) mvinsnstr (int, int, const char *, int);	/* generated */
+extern NCURSES_EXPORT(int) mvinsstr (int, int, const char *);		/* generated */
+extern NCURSES_EXPORT(int) mvinstr (int, int, char *);			/* generated */
+extern NCURSES_EXPORT(int) mvprintw (int,int, const char *,...)		/* implemented */
+		GCC_PRINTFLIKE(3,4);
+extern NCURSES_EXPORT(int) mvscanw (int,int, const char *,...)		/* implemented */
+		GCC_SCANFLIKE(3,4);
+extern NCURSES_EXPORT(int) mvvline (int, int, chtype, int);		/* generated */
+extern NCURSES_EXPORT(int) mvwaddch (WINDOW *, int, int, const chtype);	/* generated */
+extern NCURSES_EXPORT(int) mvwaddchnstr (WINDOW *, int, int, const chtype *, int);/* generated */
+extern NCURSES_EXPORT(int) mvwaddchstr (WINDOW *, int, int, const chtype *);	/* generated */
+extern NCURSES_EXPORT(int) mvwaddnstr (WINDOW *, int, int, const char *, int);	/* generated */
+extern NCURSES_EXPORT(int) mvwaddstr (WINDOW *, int, int, const char *);	/* generated */
+extern NCURSES_EXPORT(int) mvwchgat (WINDOW *, int, int, int, attr_t, NCURSES_PAIRS_T, const void *);/* generated */
+extern NCURSES_EXPORT(int) mvwdelch (WINDOW *, int, int);		/* generated */
+extern NCURSES_EXPORT(int) mvwgetch (WINDOW *, int, int);		/* generated */
+extern NCURSES_EXPORT(int) mvwgetnstr (WINDOW *, int, int, char *, int);	/* generated */
+extern NCURSES_EXPORT(int) mvwgetstr (WINDOW *, int, int, char *);	/* generated */
+extern NCURSES_EXPORT(int) mvwhline (WINDOW *, int, int, chtype, int);	/* generated */
+extern NCURSES_EXPORT(int) mvwin (WINDOW *,int,int);			/* implemented */
+extern NCURSES_EXPORT(chtype) mvwinch (WINDOW *, int, int);			/* generated */
+extern NCURSES_EXPORT(int) mvwinchnstr (WINDOW *, int, int, chtype *, int);	/* generated */
+extern NCURSES_EXPORT(int) mvwinchstr (WINDOW *, int, int, chtype *);		/* generated */
+extern NCURSES_EXPORT(int) mvwinnstr (WINDOW *, int, int, char *, int);		/* generated */
+extern NCURSES_EXPORT(int) mvwinsch (WINDOW *, int, int, chtype);		/* generated */
+extern NCURSES_EXPORT(int) mvwinsnstr (WINDOW *, int, int, const char *, int);	/* generated */
+extern NCURSES_EXPORT(int) mvwinsstr (WINDOW *, int, int, const char *);	/* generated */
+extern NCURSES_EXPORT(int) mvwinstr (WINDOW *, int, int, char *);		/* generated */
+extern NCURSES_EXPORT(int) mvwprintw (WINDOW*,int,int, const char *,...)	/* implemented */
+		GCC_PRINTFLIKE(4,5);
+extern NCURSES_EXPORT(int) mvwscanw (WINDOW *,int,int, const char *,...)	/* implemented */
+		GCC_SCANFLIKE(4,5);
+extern NCURSES_EXPORT(int) mvwvline (WINDOW *,int, int, chtype, int);	/* generated */
+extern NCURSES_EXPORT(int) napms (int);					/* implemented */
+extern NCURSES_EXPORT(WINDOW *) newpad (int,int);			/* implemented */
+extern NCURSES_EXPORT(SCREEN *) newterm (const char *,FILE *,FILE *);	/* implemented */
+extern NCURSES_EXPORT(WINDOW *) newwin (int,int,int,int);		/* implemented */
+extern NCURSES_EXPORT(int) nl (void);					/* implemented */
+extern NCURSES_EXPORT(int) nocbreak (void);				/* implemented */
+extern NCURSES_EXPORT(int) nodelay (WINDOW *,bool);			/* implemented */
+extern NCURSES_EXPORT(int) noecho (void);				/* implemented */
+extern NCURSES_EXPORT(int) nonl (void);					/* implemented */
+extern NCURSES_EXPORT(void) noqiflush (void);				/* implemented */
+extern NCURSES_EXPORT(int) noraw (void);				/* implemented */
+extern NCURSES_EXPORT(int) notimeout (WINDOW *,bool);			/* implemented */
+extern NCURSES_EXPORT(int) overlay (const WINDOW*,WINDOW *);		/* implemented */
+extern NCURSES_EXPORT(int) overwrite (const WINDOW*,WINDOW *);		/* implemented */
+extern NCURSES_EXPORT(int) pair_content (NCURSES_PAIRS_T,NCURSES_COLOR_T*,NCURSES_COLOR_T*);		/* implemented */
+extern NCURSES_EXPORT(int) PAIR_NUMBER (int);				/* generated */
+extern NCURSES_EXPORT(int) pechochar (WINDOW *, const chtype);		/* implemented */
+extern NCURSES_EXPORT(int) pnoutrefresh (WINDOW*,int,int,int,int,int,int);/* implemented */
+extern NCURSES_EXPORT(int) prefresh (WINDOW *,int,int,int,int,int,int);	/* implemented */
+extern NCURSES_EXPORT(int) printw (const char *,...)			/* implemented */
+		GCC_PRINTFLIKE(1,2);
+extern NCURSES_EXPORT(int) putwin (WINDOW *, FILE *);			/* implemented */
+extern NCURSES_EXPORT(void) qiflush (void);				/* implemented */
+extern NCURSES_EXPORT(int) raw (void);					/* implemented */
+extern NCURSES_EXPORT(int) redrawwin (WINDOW *);			/* generated */
+extern NCURSES_EXPORT(int) refresh (void);				/* generated */
+extern NCURSES_EXPORT(int) resetty (void);				/* implemented */
+extern NCURSES_EXPORT(int) reset_prog_mode (void);			/* implemented */
+extern NCURSES_EXPORT(int) reset_shell_mode (void);			/* implemented */
+extern NCURSES_EXPORT(int) ripoffline (int, int (*)(WINDOW *, int));	/* implemented */
+extern NCURSES_EXPORT(int) savetty (void);				/* implemented */
+extern NCURSES_EXPORT(int) scanw (const char *,...)			/* implemented */
+		GCC_SCANFLIKE(1,2);
+extern NCURSES_EXPORT(int) scr_dump (const char *);			/* implemented */
+extern NCURSES_EXPORT(int) scr_init (const char *);			/* implemented */
+extern NCURSES_EXPORT(int) scrl (int);					/* generated */
+extern NCURSES_EXPORT(int) scroll (WINDOW *);				/* generated */
+extern NCURSES_EXPORT(int) scrollok (WINDOW *,bool);			/* implemented */
+extern NCURSES_EXPORT(int) scr_restore (const char *);			/* implemented */
+extern NCURSES_EXPORT(int) scr_set (const char *);			/* implemented */
+extern NCURSES_EXPORT(int) setscrreg (int,int);				/* generated */
+extern NCURSES_EXPORT(SCREEN *) set_term (SCREEN *);			/* implemented */
+extern NCURSES_EXPORT(int) slk_attroff (const chtype);			/* implemented */
+extern NCURSES_EXPORT(int) slk_attr_off (const attr_t, void *);		/* generated:WIDEC */
+extern NCURSES_EXPORT(int) slk_attron (const chtype);			/* implemented */
+extern NCURSES_EXPORT(int) slk_attr_on (attr_t,void*);			/* generated:WIDEC */
+extern NCURSES_EXPORT(int) slk_attrset (const chtype);			/* implemented */
+extern NCURSES_EXPORT(attr_t) slk_attr (void);				/* implemented */
+extern NCURSES_EXPORT(int) slk_attr_set (const attr_t,NCURSES_PAIRS_T,void*);	/* implemented */
+extern NCURSES_EXPORT(int) slk_clear (void);				/* implemented */
+extern NCURSES_EXPORT(int) slk_color (NCURSES_PAIRS_T);				/* implemented */
+extern NCURSES_EXPORT(int) slk_init (int);				/* implemented */
+extern NCURSES_EXPORT(char *) slk_label (int);				/* implemented */
+extern NCURSES_EXPORT(int) slk_noutrefresh (void);			/* implemented */
+extern NCURSES_EXPORT(int) slk_refresh (void);				/* implemented */
+extern NCURSES_EXPORT(int) slk_restore (void);				/* implemented */
+extern NCURSES_EXPORT(int) slk_set (int,const char *,int);		/* implemented */
+extern NCURSES_EXPORT(int) slk_touch (void);				/* implemented */
+extern NCURSES_EXPORT(int) standout (void);				/* generated */
+extern NCURSES_EXPORT(int) standend (void);				/* generated */
+extern NCURSES_EXPORT(int) start_color (void);				/* implemented */
+extern NCURSES_EXPORT(WINDOW *) subpad (WINDOW *, int, int, int, int);	/* implemented */
+extern NCURSES_EXPORT(WINDOW *) subwin (WINDOW *, int, int, int, int);	/* implemented */
+extern NCURSES_EXPORT(int) syncok (WINDOW *, bool);			/* implemented */
+extern NCURSES_EXPORT(chtype) termattrs (void);				/* implemented */
+extern NCURSES_EXPORT(char *) termname (void);				/* implemented */
+extern NCURSES_EXPORT(void) timeout (int);				/* generated */
+extern NCURSES_EXPORT(int) touchline (WINDOW *, int, int);		/* generated */
+extern NCURSES_EXPORT(int) touchwin (WINDOW *);				/* generated */
+extern NCURSES_EXPORT(int) typeahead (int);				/* implemented */
+extern NCURSES_EXPORT(int) ungetch (int);				/* implemented */
+extern NCURSES_EXPORT(int) untouchwin (WINDOW *);			/* generated */
+extern NCURSES_EXPORT(void) use_env (bool);				/* implemented */
+extern NCURSES_EXPORT(void) use_tioctl (bool);				/* implemented */
+extern NCURSES_EXPORT(int) vidattr (chtype);				/* implemented */
+extern NCURSES_EXPORT(int) vidputs (chtype, NCURSES_OUTC);		/* implemented */
+extern NCURSES_EXPORT(int) vline (chtype, int);				/* generated */
+extern NCURSES_EXPORT(int) vwprintw (WINDOW *, const char *, va_list) GCC_DEPRECATED(use vw_printw)	/* implemented */
+		GCC_PRINTFLIKE(2,0);
+extern NCURSES_EXPORT(int) vw_printw (WINDOW *, const char *, va_list)	/* implemented */
+		GCC_PRINTFLIKE(2,0);	
+extern NCURSES_EXPORT(int) vwscanw (WINDOW *, const char *, va_list) GCC_DEPRECATED(use vw_scanw)	/* implemented */
+		GCC_SCANFLIKE(2,0);
+extern NCURSES_EXPORT(int) vw_scanw (WINDOW *, const char *, va_list)	/* implemented */
+		GCC_SCANFLIKE(2,0);
+extern NCURSES_EXPORT(int) waddch (WINDOW *, const chtype);		/* implemented */
+extern NCURSES_EXPORT(int) waddchnstr (WINDOW *,const chtype *,int);	/* implemented */
+extern NCURSES_EXPORT(int) waddchstr (WINDOW *,const chtype *);		/* generated */
+extern NCURSES_EXPORT(int) waddnstr (WINDOW *,const char *,int);	/* implemented */
+extern NCURSES_EXPORT(int) waddstr (WINDOW *,const char *);		/* generated */
+extern NCURSES_EXPORT(int) wattron (WINDOW *, int);			/* generated */
+extern NCURSES_EXPORT(int) wattroff (WINDOW *, int);			/* generated */
+extern NCURSES_EXPORT(int) wattrset (WINDOW *, int);			/* generated */
+extern NCURSES_EXPORT(int) wattr_get (WINDOW *, attr_t *, NCURSES_PAIRS_T *, void *);	/* generated */
+extern NCURSES_EXPORT(int) wattr_on (WINDOW *, attr_t, void *);		/* implemented */
+extern NCURSES_EXPORT(int) wattr_off (WINDOW *, attr_t, void *);	/* implemented */
+extern NCURSES_EXPORT(int) wattr_set (WINDOW *, attr_t, NCURSES_PAIRS_T, void *);	/* generated */
+extern NCURSES_EXPORT(int) wbkgd (WINDOW *, chtype);			/* implemented */
+extern NCURSES_EXPORT(void) wbkgdset (WINDOW *,chtype);			/* implemented */
+extern NCURSES_EXPORT(int) wborder (WINDOW *,chtype,chtype,chtype,chtype,chtype,chtype,chtype,chtype);	/* implemented */
+extern NCURSES_EXPORT(int) wchgat (WINDOW *, int, attr_t, NCURSES_PAIRS_T, const void *);/* implemented */
+extern NCURSES_EXPORT(int) wclear (WINDOW *);				/* implemented */
+extern NCURSES_EXPORT(int) wclrtobot (WINDOW *);			/* implemented */
+extern NCURSES_EXPORT(int) wclrtoeol (WINDOW *);			/* implemented */
+extern NCURSES_EXPORT(int) wcolor_set (WINDOW*,NCURSES_PAIRS_T,void*);		/* implemented */
+extern NCURSES_EXPORT(void) wcursyncup (WINDOW *);			/* implemented */
+extern NCURSES_EXPORT(int) wdelch (WINDOW *);				/* implemented */
+extern NCURSES_EXPORT(int) wdeleteln (WINDOW *);			/* generated */
+extern NCURSES_EXPORT(int) wechochar (WINDOW *, const chtype);		/* implemented */
+extern NCURSES_EXPORT(int) werase (WINDOW *);				/* implemented */
+extern NCURSES_EXPORT(int) wgetch (WINDOW *);				/* implemented */
+extern NCURSES_EXPORT(int) wgetnstr (WINDOW *,char *,int);		/* implemented */
+extern NCURSES_EXPORT(int) wgetstr (WINDOW *, char *);			/* generated */
+extern NCURSES_EXPORT(int) whline (WINDOW *, chtype, int);		/* implemented */
+extern NCURSES_EXPORT(chtype) winch (WINDOW *);				/* implemented */
+extern NCURSES_EXPORT(int) winchnstr (WINDOW *, chtype *, int);		/* implemented */
+extern NCURSES_EXPORT(int) winchstr (WINDOW *, chtype *);		/* generated */
+extern NCURSES_EXPORT(int) winnstr (WINDOW *, char *, int);		/* implemented */
+extern NCURSES_EXPORT(int) winsch (WINDOW *, chtype);			/* implemented */
+extern NCURSES_EXPORT(int) winsdelln (WINDOW *,int);			/* implemented */
+extern NCURSES_EXPORT(int) winsertln (WINDOW *);			/* generated */
+extern NCURSES_EXPORT(int) winsnstr (WINDOW *, const char *,int);	/* implemented */
+extern NCURSES_EXPORT(int) winsstr (WINDOW *, const char *);		/* generated */
+extern NCURSES_EXPORT(int) winstr (WINDOW *, char *);			/* generated */
+extern NCURSES_EXPORT(int) wmove (WINDOW *,int,int);			/* implemented */
+extern NCURSES_EXPORT(int) wnoutrefresh (WINDOW *);			/* implemented */
+extern NCURSES_EXPORT(int) wprintw (WINDOW *, const char *,...)		/* implemented */
+		GCC_PRINTFLIKE(2,3);
+extern NCURSES_EXPORT(int) wredrawln (WINDOW *,int,int);		/* implemented */
+extern NCURSES_EXPORT(int) wrefresh (WINDOW *);				/* implemented */
+extern NCURSES_EXPORT(int) wscanw (WINDOW *, const char *,...)		/* implemented */
+		GCC_SCANFLIKE(2,3);
+extern NCURSES_EXPORT(int) wscrl (WINDOW *,int);			/* implemented */
+extern NCURSES_EXPORT(int) wsetscrreg (WINDOW *,int,int);		/* implemented */
+extern NCURSES_EXPORT(int) wstandout (WINDOW *);			/* generated */
+extern NCURSES_EXPORT(int) wstandend (WINDOW *);			/* generated */
+extern NCURSES_EXPORT(void) wsyncdown (WINDOW *);			/* implemented */
+extern NCURSES_EXPORT(void) wsyncup (WINDOW *);				/* implemented */
+extern NCURSES_EXPORT(void) wtimeout (WINDOW *,int);			/* implemented */
+extern NCURSES_EXPORT(int) wtouchln (WINDOW *,int,int,int);		/* implemented */
+extern NCURSES_EXPORT(int) wvline (WINDOW *,chtype,int);		/* implemented */
+
+/*
+ * These are also declared in <term.h>:
+ */
+extern NCURSES_EXPORT(int) tigetflag (const char *);			/* implemented */
+extern NCURSES_EXPORT(int) tigetnum (const char *);			/* implemented */
+extern NCURSES_EXPORT(char *) tigetstr (const char *);			/* implemented */
+extern NCURSES_EXPORT(int) putp (const char *);				/* implemented */
+
+#if NCURSES_TPARM_VARARGS
+extern NCURSES_EXPORT(char *) tparm (const char *, ...);		/* special */
+#else
+extern NCURSES_EXPORT(char *) tparm (const char *, NCURSES_TPARM_ARG,NCURSES_TPARM_ARG,NCURSES_TPARM_ARG,NCURSES_TPARM_ARG,NCURSES_TPARM_ARG,NCURSES_TPARM_ARG,NCURSES_TPARM_ARG,NCURSES_TPARM_ARG,NCURSES_TPARM_ARG);	/* special */
+#endif
+
+extern NCURSES_EXPORT(char *) tiparm (const char *, ...);		/* special */
+
+/*
+ * These functions are not in X/Open, but we use them in macro definitions:
+ */
+extern NCURSES_EXPORT(int) getattrs (const WINDOW *);			/* generated */
+extern NCURSES_EXPORT(int) getcurx (const WINDOW *);			/* generated */
+extern NCURSES_EXPORT(int) getcury (const WINDOW *);			/* generated */
+extern NCURSES_EXPORT(int) getbegx (const WINDOW *);			/* generated */
+extern NCURSES_EXPORT(int) getbegy (const WINDOW *);			/* generated */
+extern NCURSES_EXPORT(int) getmaxx (const WINDOW *);			/* generated */
+extern NCURSES_EXPORT(int) getmaxy (const WINDOW *);			/* generated */
+extern NCURSES_EXPORT(int) getparx (const WINDOW *);			/* generated */
+extern NCURSES_EXPORT(int) getpary (const WINDOW *);			/* generated */
+
+/*
+ * vid_attr() was implemented originally based on a draft of X/Open curses.
+ */
+#if !NCURSES_WIDECHAR
+#define vid_attr(a,pair,opts) vidattr(a)
+#endif
+
+/*
+ * These functions are extensions - not in X/Open Curses.
+ */
+#if @NCURSES_EXT_FUNCS@
+#undef  NCURSES_EXT_FUNCS
+#define NCURSES_EXT_FUNCS @NCURSES_PATCH@
+typedef int (*NCURSES_WINDOW_CB)(WINDOW *, void *);
+typedef int (*NCURSES_SCREEN_CB)(SCREEN *, void *);
+extern NCURSES_EXPORT(bool) is_term_resized (int, int);
+extern NCURSES_EXPORT(char *) keybound (int, int);
+extern NCURSES_EXPORT(const char *) curses_version (void);
+extern NCURSES_EXPORT(int) alloc_pair (int, int);
+extern NCURSES_EXPORT(int) assume_default_colors (int, int);
+extern NCURSES_EXPORT(int) define_key (const char *, int);
+extern NCURSES_EXPORT(int) extended_color_content(int, int *, int *, int *);
+extern NCURSES_EXPORT(int) extended_pair_content(int, int *, int *);
+extern NCURSES_EXPORT(int) extended_slk_color(int);
+extern NCURSES_EXPORT(int) find_pair (int, int);
+extern NCURSES_EXPORT(int) free_pair (int);
+extern NCURSES_EXPORT(int) get_escdelay (void);
+extern NCURSES_EXPORT(int) init_extended_color(int, int, int, int);
+extern NCURSES_EXPORT(int) init_extended_pair(int, int, int);
+extern NCURSES_EXPORT(int) key_defined (const char *);
+extern NCURSES_EXPORT(int) keyok (int, bool);
+extern NCURSES_EXPORT(void) reset_color_pairs (void);
+extern NCURSES_EXPORT(int) resize_term (int, int);
+extern NCURSES_EXPORT(int) resizeterm (int, int);
+extern NCURSES_EXPORT(int) set_escdelay (int);
+extern NCURSES_EXPORT(int) set_tabsize (int);
+extern NCURSES_EXPORT(int) use_default_colors (void);
+extern NCURSES_EXPORT(int) use_extended_names (bool);
+extern NCURSES_EXPORT(int) use_legacy_coding (int);
+extern NCURSES_EXPORT(int) use_screen (SCREEN *, NCURSES_SCREEN_CB, void *);
+extern NCURSES_EXPORT(int) use_window (WINDOW *, NCURSES_WINDOW_CB, void *);
+extern NCURSES_EXPORT(int) wresize (WINDOW *, int, int);
+extern NCURSES_EXPORT(void) nofilter(void);
+
+/*
+ * These extensions provide access to information stored in the WINDOW even
+ * when NCURSES_OPAQUE is set:
+ */
+extern NCURSES_EXPORT(WINDOW *) wgetparent (const WINDOW *);	/* @GENERATED_EXT_FUNCS@ */
+extern NCURSES_EXPORT(bool) is_cleared (const WINDOW *);	/* @GENERATED_EXT_FUNCS@ */
+extern NCURSES_EXPORT(bool) is_idcok (const WINDOW *);		/* @GENERATED_EXT_FUNCS@ */
+extern NCURSES_EXPORT(bool) is_idlok (const WINDOW *);		/* @GENERATED_EXT_FUNCS@ */
+extern NCURSES_EXPORT(bool) is_immedok (const WINDOW *);	/* @GENERATED_EXT_FUNCS@ */
+extern NCURSES_EXPORT(bool) is_keypad (const WINDOW *);		/* @GENERATED_EXT_FUNCS@ */
+extern NCURSES_EXPORT(bool) is_leaveok (const WINDOW *);	/* @GENERATED_EXT_FUNCS@ */
+extern NCURSES_EXPORT(bool) is_nodelay (const WINDOW *);	/* @GENERATED_EXT_FUNCS@ */
+extern NCURSES_EXPORT(bool) is_notimeout (const WINDOW *);	/* @GENERATED_EXT_FUNCS@ */
+extern NCURSES_EXPORT(bool) is_pad (const WINDOW *);		/* @GENERATED_EXT_FUNCS@ */
+extern NCURSES_EXPORT(bool) is_scrollok (const WINDOW *);	/* @GENERATED_EXT_FUNCS@ */
+extern NCURSES_EXPORT(bool) is_subwin (const WINDOW *);		/* @GENERATED_EXT_FUNCS@ */
+extern NCURSES_EXPORT(bool) is_syncok (const WINDOW *);		/* @GENERATED_EXT_FUNCS@ */
+extern NCURSES_EXPORT(int) wgetdelay (const WINDOW *);		/* @GENERATED_EXT_FUNCS@ */
+extern NCURSES_EXPORT(int) wgetscrreg (const WINDOW *, int *, int *); /* @GENERATED_EXT_FUNCS@ */
+
+#else
+#define curses_version() NCURSES_VERSION
+#endif
+
+/*
+ * Extra extension-functions, which pass a SCREEN pointer rather than using
+ * a global variable SP.
+ */
+#if @NCURSES_SP_FUNCS@
+#undef  NCURSES_SP_FUNCS
+#define NCURSES_SP_FUNCS @NCURSES_PATCH@
+#define NCURSES_SP_NAME(name) name##_sp
+
+/* Define the sp-funcs helper function */
+#define NCURSES_SP_OUTC NCURSES_SP_NAME(NCURSES_OUTC)
+typedef int (*NCURSES_SP_OUTC)(SCREEN*, int);
+
+extern NCURSES_EXPORT(SCREEN *) new_prescr (void); /* implemented:SP_FUNC */
+
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(baudrate) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(beep) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(bool) NCURSES_SP_NAME(can_change_color) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(cbreak) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(curs_set) (SCREEN*, int); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(color_content) (SCREEN*, NCURSES_PAIRS_T, NCURSES_COLOR_T*, NCURSES_COLOR_T*, NCURSES_COLOR_T*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(def_prog_mode) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(def_shell_mode) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(delay_output) (SCREEN*, int); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(doupdate) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(echo) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(endwin) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(char) NCURSES_SP_NAME(erasechar) (SCREEN*);/* implemented:SP_FUNC */
+extern NCURSES_EXPORT(void) NCURSES_SP_NAME(filter) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(flash) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(flushinp) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(WINDOW *) NCURSES_SP_NAME(getwin) (SCREEN*, FILE *);			/* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(halfdelay) (SCREEN*, int); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(bool) NCURSES_SP_NAME(has_colors) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(bool) NCURSES_SP_NAME(has_ic) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(bool) NCURSES_SP_NAME(has_il) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(init_color) (SCREEN*, NCURSES_COLOR_T, NCURSES_COLOR_T, NCURSES_COLOR_T, NCURSES_COLOR_T); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(init_pair) (SCREEN*, NCURSES_PAIRS_T, NCURSES_COLOR_T, NCURSES_COLOR_T); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(intrflush) (SCREEN*, WINDOW*, bool);	/* implemented:SP_FUNC */
+extern NCURSES_EXPORT(bool) NCURSES_SP_NAME(isendwin) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(NCURSES_CONST char *) NCURSES_SP_NAME(keyname) (SCREEN*, int); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(char) NCURSES_SP_NAME(killchar) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(char *) NCURSES_SP_NAME(longname) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(mvcur) (SCREEN*, int, int, int, int); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(napms) (SCREEN*, int); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(WINDOW *) NCURSES_SP_NAME(newpad) (SCREEN*, int, int); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(SCREEN *) NCURSES_SP_NAME(newterm) (SCREEN*, const char *, FILE *, FILE *); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(WINDOW *) NCURSES_SP_NAME(newwin) (SCREEN*, int, int, int, int); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(nl) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(nocbreak) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(noecho) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(nonl) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(void) NCURSES_SP_NAME(noqiflush) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(noraw) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(pair_content) (SCREEN*, NCURSES_PAIRS_T, NCURSES_COLOR_T*, NCURSES_COLOR_T*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(void) NCURSES_SP_NAME(qiflush) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(raw) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(reset_prog_mode) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(reset_shell_mode) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(resetty) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(ripoffline) (SCREEN*, int, int (*)(WINDOW *, int));	/* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(savetty) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(scr_init) (SCREEN*, const char *); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(scr_restore) (SCREEN*, const char *); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(scr_set) (SCREEN*, const char *); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(slk_attroff) (SCREEN*, const chtype); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(slk_attron) (SCREEN*, const chtype); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(slk_attrset) (SCREEN*, const chtype); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(attr_t) NCURSES_SP_NAME(slk_attr) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(slk_attr_set) (SCREEN*, const attr_t, NCURSES_PAIRS_T, void*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(slk_clear) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(slk_color) (SCREEN*, NCURSES_PAIRS_T); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(slk_init) (SCREEN*, int); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(char *) NCURSES_SP_NAME(slk_label) (SCREEN*, int); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(slk_noutrefresh) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(slk_refresh) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(slk_restore) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(slk_set) (SCREEN*, int, const char *, int); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(slk_touch) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(start_color) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(chtype) NCURSES_SP_NAME(termattrs) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(char *) NCURSES_SP_NAME(termname) (SCREEN*); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(typeahead) (SCREEN*, int); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(ungetch) (SCREEN*, int); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(void) NCURSES_SP_NAME(use_env) (SCREEN*, bool); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(void) NCURSES_SP_NAME(use_tioctl) (SCREEN*, bool); /* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(vidattr) (SCREEN*, chtype);	/* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(vidputs) (SCREEN*, chtype, NCURSES_SP_OUTC); /* implemented:SP_FUNC */
+#if @NCURSES_EXT_FUNCS@
+extern NCURSES_EXPORT(char *) NCURSES_SP_NAME(keybound) (SCREEN*, int, int);	/* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(alloc_pair) (SCREEN*, int, int); /* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(assume_default_colors) (SCREEN*, int, int);	/* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(define_key) (SCREEN*, const char *, int);	/* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(extended_color_content) (SCREEN*, int, int *, int *, int *);	/* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(extended_pair_content) (SCREEN*, int, int *, int *);	/* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(extended_slk_color) (SCREEN*, int);	/* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(get_escdelay) (SCREEN*);	/* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(find_pair) (SCREEN*, int, int); /* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(free_pair) (SCREEN*, int); /* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(init_extended_color) (SCREEN*, int, int, int, int);	/* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(init_extended_pair) (SCREEN*, int, int, int);	/* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(bool) NCURSES_SP_NAME(is_term_resized) (SCREEN*, int, int);	/* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(key_defined) (SCREEN*, const char *);	/* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(keyok) (SCREEN*, int, bool);	/* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(void) NCURSES_SP_NAME(nofilter) (SCREEN*); /* implemented */	/* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(void) NCURSES_SP_NAME(reset_color_pairs) (SCREEN*); /* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(resize_term) (SCREEN*, int, int);	/* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(resizeterm) (SCREEN*, int, int);	/* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(set_escdelay) (SCREEN*, int);	/* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(set_tabsize) (SCREEN*, int);	/* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(use_default_colors) (SCREEN*);	/* implemented:EXT_SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(use_legacy_coding) (SCREEN*, int);	/* implemented:EXT_SP_FUNC */
+#endif
+#else
+#undef  NCURSES_SP_FUNCS
+#define NCURSES_SP_FUNCS 0
+#define NCURSES_SP_NAME(name) name
+#define NCURSES_SP_OUTC NCURSES_OUTC
+#endif
+
+/* attributes */
+
+#define NCURSES_ATTR_SHIFT       8
+#define NCURSES_BITS(mask,shift) (NCURSES_CAST(chtype,(mask)) << ((shift) + NCURSES_ATTR_SHIFT))
+
+#define A_NORMAL	(@cf_cv_1UL@ - @cf_cv_1UL@)
+#define A_ATTRIBUTES	NCURSES_BITS(~(@cf_cv_1UL@ - @cf_cv_1UL@),0)
+#define A_CHARTEXT	(NCURSES_BITS(@cf_cv_1UL@,0) - @cf_cv_1UL@)
+#define A_COLOR		NCURSES_BITS(((@cf_cv_1UL@) << 8) - @cf_cv_1UL@,0)
+#define A_STANDOUT	NCURSES_BITS(@cf_cv_1UL@,8)
+#define A_UNDERLINE	NCURSES_BITS(@cf_cv_1UL@,9)
+#define A_REVERSE	NCURSES_BITS(@cf_cv_1UL@,10)
+#define A_BLINK		NCURSES_BITS(@cf_cv_1UL@,11)
+#define A_DIM		NCURSES_BITS(@cf_cv_1UL@,12)
+#define A_BOLD		NCURSES_BITS(@cf_cv_1UL@,13)
+#define A_ALTCHARSET	NCURSES_BITS(@cf_cv_1UL@,14)
+#define A_INVIS		NCURSES_BITS(@cf_cv_1UL@,15)
+#define A_PROTECT	NCURSES_BITS(@cf_cv_1UL@,16)
+#define A_HORIZONTAL	NCURSES_BITS(@cf_cv_1UL@,17)
+#define A_LEFT		NCURSES_BITS(@cf_cv_1UL@,18)
+#define A_LOW		NCURSES_BITS(@cf_cv_1UL@,19)
+#define A_RIGHT		NCURSES_BITS(@cf_cv_1UL@,20)
+#define A_TOP		NCURSES_BITS(@cf_cv_1UL@,21)
+#define A_VERTICAL	NCURSES_BITS(@cf_cv_1UL@,22)
+
+#if @NCURSES_EXT_FUNCS@
+#define A_ITALIC	NCURSES_BITS(@cf_cv_1UL@,23)	/* ncurses extension */
+#endif
+
+/*
+ * Most of the pseudo functions are macros that either provide compatibility
+ * with older versions of curses, or provide inline functionality to improve
+ * performance.
+ */
+
+/*
+ * These pseudo functions are always implemented as macros:
+ */
+
+#define getyx(win,y,x)		(y = getcury(win), x = getcurx(win))
+#define getbegyx(win,y,x)	(y = getbegy(win), x = getbegx(win))
+#define getmaxyx(win,y,x)	(y = getmaxy(win), x = getmaxx(win))
+#define getparyx(win,y,x)	(y = getpary(win), x = getparx(win))
+
+#define getsyx(y,x) do { if (newscr) { \
+			     if (is_leaveok(newscr)) \
+				(y) = (x) = -1; \
+			     else \
+				 getyx(newscr,(y), (x)); \
+			} \
+		    } while(0)
+
+#define setsyx(y,x) do { if (newscr) { \
+			    if ((y) == -1 && (x) == -1) \
+				leaveok(newscr, TRUE); \
+			    else { \
+				leaveok(newscr, FALSE); \
+				wmove(newscr, (y), (x)); \
+			    } \
+			} \
+		    } while(0)
+
+#ifndef NCURSES_NOMACROS
+
+/*
+ * These miscellaneous pseudo functions are provided for compatibility:
+ */
+
+#define wgetstr(w, s)		wgetnstr(w, s, -1)
+#define getnstr(s, n)		wgetnstr(stdscr, s, (n))
+
+#define setterm(term)		setupterm(term, 1, (int *)0)
+
+#define fixterm()		reset_prog_mode()
+#define resetterm()		reset_shell_mode()
+#define saveterm()		def_prog_mode()
+#define crmode()		cbreak()
+#define nocrmode()		nocbreak()
+#define gettmode()
+
+/* It seems older SYSV curses versions define these */
+#if !NCURSES_OPAQUE
+#define getattrs(win)		NCURSES_CAST(int, NCURSES_OK_ADDR(win) ? (win)->_attrs : A_NORMAL)
+#define getcurx(win)		(NCURSES_OK_ADDR(win) ? (win)->_curx : ERR)
+#define getcury(win)		(NCURSES_OK_ADDR(win) ? (win)->_cury : ERR)
+#define getbegx(win)		(NCURSES_OK_ADDR(win) ? (win)->_begx : ERR)
+#define getbegy(win)		(NCURSES_OK_ADDR(win) ? (win)->_begy : ERR)
+#define getmaxx(win)		(NCURSES_OK_ADDR(win) ? ((win)->_maxx + 1) : ERR)
+#define getmaxy(win)		(NCURSES_OK_ADDR(win) ? ((win)->_maxy + 1) : ERR)
+#define getparx(win)		(NCURSES_OK_ADDR(win) ? (win)->_parx : ERR)
+#define getpary(win)		(NCURSES_OK_ADDR(win) ? (win)->_pary : ERR)
+#endif /* NCURSES_OPAQUE */
+
+#define wstandout(win)		(wattrset(win,A_STANDOUT))
+#define wstandend(win)		(wattrset(win,A_NORMAL))
+
+#define wattron(win,at)		wattr_on(win, NCURSES_CAST(attr_t, at), NULL)
+#define wattroff(win,at)	wattr_off(win, NCURSES_CAST(attr_t, at), NULL)
+
+#if !NCURSES_OPAQUE
+#if NCURSES_WATTR_MACROS
+#if NCURSES_WIDECHAR && @NCURSES_EXT_COLORS@
+#define wattrset(win,at) \
+	(NCURSES_OK_ADDR(win) \
+	  ? ((win)->_color = NCURSES_CAST(int, PAIR_NUMBER(at)), \
+	     (win)->_attrs = NCURSES_CAST(attr_t, at), \
+	     OK) \
+	  : ERR)
+#else
+#define wattrset(win,at) \
+	(NCURSES_OK_ADDR(win) \
+	  ? ((win)->_attrs = NCURSES_CAST(attr_t, at), \
+	     OK) \
+	  : ERR)
+#endif
+#endif /* NCURSES_WATTR_MACROS */
+#endif /* NCURSES_OPAQUE */
+
+#define scroll(win)		wscrl(win,1)
+
+#define touchwin(win)		wtouchln((win), 0, getmaxy(win), 1)
+#define touchline(win, s, c)	wtouchln((win), s, c, 1)
+#define untouchwin(win)		wtouchln((win), 0, getmaxy(win), 0)
+
+#define box(win, v, h)		wborder(win, v, v, h, h, 0, 0, 0, 0)
+#define border(ls, rs, ts, bs, tl, tr, bl, br)	wborder(stdscr, ls, rs, ts, bs, tl, tr, bl, br)
+#define hline(ch, n)		whline(stdscr, ch, (n))
+#define vline(ch, n)		wvline(stdscr, ch, (n))
+
+#define winstr(w, s)		winnstr(w, s, -1)
+#define winchstr(w, s)		winchnstr(w, s, -1)
+#define winsstr(w, s)		winsnstr(w, s, -1)
+
+#if !NCURSES_OPAQUE
+#define redrawwin(win)		wredrawln(win, 0, (NCURSES_OK_ADDR(win) ? (win)->_maxy+1 : -1))
+#endif /* NCURSES_OPAQUE */
+
+#define waddstr(win,str)	waddnstr(win,str,-1)
+#define waddchstr(win,str)	waddchnstr(win,str,-1)
+
+/*
+ * These apply to the first 256 color pairs.
+ */
+#define COLOR_PAIR(n)	(NCURSES_BITS((n), 0) & A_COLOR)
+#define PAIR_NUMBER(a)	(NCURSES_CAST(int,((NCURSES_CAST(unsigned long,(a)) & A_COLOR) >> NCURSES_ATTR_SHIFT)))
+
+/*
+ * pseudo functions for standard screen
+ */
+
+#define addch(ch)		waddch(stdscr,(ch))
+#define addchnstr(str,n)	waddchnstr(stdscr,(str),(n))
+#define addchstr(str)		waddchstr(stdscr,(str))
+#define addnstr(str,n)		waddnstr(stdscr,(str),(n))
+#define addstr(str)		waddnstr(stdscr,(str),-1)
+#define attr_get(ap,cp,o)	wattr_get(stdscr,(ap),(cp),(o))
+#define attr_off(a,o)		wattr_off(stdscr,(a),(o))
+#define attr_on(a,o)		wattr_on(stdscr,(a),(o))
+#define attr_set(a,c,o)		wattr_set(stdscr,(a),(c),(o))
+#define attroff(at)		wattroff(stdscr,(at))
+#define attron(at)		wattron(stdscr,(at))
+#define attrset(at)		wattrset(stdscr,(at))
+#define bkgd(ch)		wbkgd(stdscr,(ch))
+#define bkgdset(ch)		wbkgdset(stdscr,(ch))
+#define chgat(n,a,c,o)		wchgat(stdscr,(n),(a),(c),(o))
+#define clear()			wclear(stdscr)
+#define clrtobot()		wclrtobot(stdscr)
+#define clrtoeol()		wclrtoeol(stdscr)
+#define color_set(c,o)		wcolor_set(stdscr,(c),(o))
+#define delch()			wdelch(stdscr)
+#define deleteln()		winsdelln(stdscr,-1)
+#define echochar(c)		wechochar(stdscr,(c))
+#define erase()			werase(stdscr)
+#define getch()			wgetch(stdscr)
+#define getstr(str)		wgetstr(stdscr,(str))
+#define inch()			winch(stdscr)
+#define inchnstr(s,n)		winchnstr(stdscr,(s),(n))
+#define inchstr(s)		winchstr(stdscr,(s))
+#define innstr(s,n)		winnstr(stdscr,(s),(n))
+#define insch(c)		winsch(stdscr,(c))
+#define insdelln(n)		winsdelln(stdscr,(n))
+#define insertln()		winsdelln(stdscr,1)
+#define insnstr(s,n)		winsnstr(stdscr,(s),(n))
+#define insstr(s)		winsstr(stdscr,(s))
+#define instr(s)		winstr(stdscr,(s))
+#define move(y,x)		wmove(stdscr,(y),(x))
+#define refresh()		wrefresh(stdscr)
+#define scrl(n)			wscrl(stdscr,(n))
+#define setscrreg(t,b)		wsetscrreg(stdscr,(t),(b))
+#define standend()		wstandend(stdscr)
+#define standout()		wstandout(stdscr)
+#define timeout(delay)		wtimeout(stdscr,(delay))
+#define wdeleteln(win)		winsdelln(win,-1)
+#define winsertln(win)		winsdelln(win,1)
+
+/*
+ * mv functions
+ */
+
+#define mvwaddch(win,y,x,ch)		(wmove((win),(y),(x)) == ERR ? ERR : waddch((win),(ch)))
+#define mvwaddchnstr(win,y,x,str,n)	(wmove((win),(y),(x)) == ERR ? ERR : waddchnstr((win),(str),(n)))
+#define mvwaddchstr(win,y,x,str)	(wmove((win),(y),(x)) == ERR ? ERR : waddchnstr((win),(str),-1))
+#define mvwaddnstr(win,y,x,str,n)	(wmove((win),(y),(x)) == ERR ? ERR : waddnstr((win),(str),(n)))
+#define mvwaddstr(win,y,x,str)		(wmove((win),(y),(x)) == ERR ? ERR : waddnstr((win),(str),-1))
+#define mvwchgat(win,y,x,n,a,c,o)	(wmove((win),(y),(x)) == ERR ? ERR : wchgat((win),(n),(a),(c),(o)))
+#define mvwdelch(win,y,x)		(wmove((win),(y),(x)) == ERR ? ERR : wdelch(win))
+#define mvwgetch(win,y,x)		(wmove((win),(y),(x)) == ERR ? ERR : wgetch(win))
+#define mvwgetnstr(win,y,x,str,n)	(wmove((win),(y),(x)) == ERR ? ERR : wgetnstr((win),(str),(n)))
+#define mvwgetstr(win,y,x,str)		(wmove((win),(y),(x)) == ERR ? ERR : wgetstr((win),(str)))
+#define mvwhline(win,y,x,c,n)		(wmove((win),(y),(x)) == ERR ? ERR : whline((win),(c),(n)))
+#define mvwinch(win,y,x)		(wmove((win),(y),(x)) == ERR ? NCURSES_CAST(chtype, ERR) : winch(win))
+#define mvwinchnstr(win,y,x,s,n)	(wmove((win),(y),(x)) == ERR ? ERR : winchnstr((win),(s),(n)))
+#define mvwinchstr(win,y,x,s)		(wmove((win),(y),(x)) == ERR ? ERR : winchstr((win),(s)))
+#define mvwinnstr(win,y,x,s,n)		(wmove((win),(y),(x)) == ERR ? ERR : winnstr((win),(s),(n)))
+#define mvwinsch(win,y,x,c)		(wmove((win),(y),(x)) == ERR ? ERR : winsch((win),(c)))
+#define mvwinsnstr(win,y,x,s,n)		(wmove((win),(y),(x)) == ERR ? ERR : winsnstr((win),(s),(n)))
+#define mvwinsstr(win,y,x,s)		(wmove((win),(y),(x)) == ERR ? ERR : winsstr((win),(s)))
+#define mvwinstr(win,y,x,s)		(wmove((win),(y),(x)) == ERR ? ERR : winstr((win),(s)))
+#define mvwvline(win,y,x,c,n)		(wmove((win),(y),(x)) == ERR ? ERR : wvline((win),(c),(n)))
+
+#define mvaddch(y,x,ch)			mvwaddch(stdscr,(y),(x),(ch))
+#define mvaddchnstr(y,x,str,n)		mvwaddchnstr(stdscr,(y),(x),(str),(n))
+#define mvaddchstr(y,x,str)		mvwaddchstr(stdscr,(y),(x),(str))
+#define mvaddnstr(y,x,str,n)		mvwaddnstr(stdscr,(y),(x),(str),(n))
+#define mvaddstr(y,x,str)		mvwaddstr(stdscr,(y),(x),(str))
+#define mvchgat(y,x,n,a,c,o)		mvwchgat(stdscr,(y),(x),(n),(a),(c),(o))
+#define mvdelch(y,x)			mvwdelch(stdscr,(y),(x))
+#define mvgetch(y,x)			mvwgetch(stdscr,(y),(x))
+#define mvgetnstr(y,x,str,n)		mvwgetnstr(stdscr,(y),(x),(str),(n))
+#define mvgetstr(y,x,str)		mvwgetstr(stdscr,(y),(x),(str))
+#define mvhline(y,x,c,n)		mvwhline(stdscr,(y),(x),(c),(n))
+#define mvinch(y,x)			mvwinch(stdscr,(y),(x))
+#define mvinchnstr(y,x,s,n)		mvwinchnstr(stdscr,(y),(x),(s),(n))
+#define mvinchstr(y,x,s)		mvwinchstr(stdscr,(y),(x),(s))
+#define mvinnstr(y,x,s,n)		mvwinnstr(stdscr,(y),(x),(s),(n))
+#define mvinsch(y,x,c)			mvwinsch(stdscr,(y),(x),(c))
+#define mvinsnstr(y,x,s,n)		mvwinsnstr(stdscr,(y),(x),(s),(n))
+#define mvinsstr(y,x,s)			mvwinsstr(stdscr,(y),(x),(s))
+#define mvinstr(y,x,s)			mvwinstr(stdscr,(y),(x),(s))
+#define mvvline(y,x,c,n)		mvwvline(stdscr,(y),(x),(c),(n))
+
+/*
+ * Some wide-character functions can be implemented without the extensions.
+ */
+#if !NCURSES_OPAQUE
+#define getbkgd(win)                    (NCURSES_OK_ADDR(win) ? ((win)->_bkgd) : 0)
+#endif /* NCURSES_OPAQUE */
+
+#define slk_attr_off(a,v)		((v) ? ERR : slk_attroff(a))
+#define slk_attr_on(a,v)		((v) ? ERR : slk_attron(a))
+
+#if !NCURSES_OPAQUE
+#if NCURSES_WATTR_MACROS
+#if NCURSES_WIDECHAR && @NCURSES_EXT_COLORS@
+#define wattr_set(win,a,p,opts) \
+	(NCURSES_OK_ADDR(win) \
+	 ? ((void)((win)->_attrs = ((a) & ~A_COLOR), \
+		   (win)->_color = (opts) ? *(int *)(opts) : (p)), \
+	    OK) \
+	 : ERR)
+#define wattr_get(win,a,p,opts) \
+	(NCURSES_OK_ADDR(win) \
+	 ? ((void)(NCURSES_OK_ADDR(a) \
+		   ? (*(a) = (win)->_attrs) \
+		   : OK), \
+	    (void)(NCURSES_OK_ADDR(p) \
+		   ? (*(p) = (NCURSES_PAIRS_T) (win)->_color) \
+		   : OK), \
+	    (void)(NCURSES_OK_ADDR(opts) \
+		   ? (*(int *)(opts) = (win)->_color) \
+		   : OK), \
+	    OK) \
+	 : ERR)
+#else /* !(NCURSES_WIDECHAR && NCURSES_EXE_COLORS) */
+#define wattr_set(win,a,p,opts) \
+	 (NCURSES_OK_ADDR(win) \
+	  ? ((void)((win)->_attrs = (((a) & ~A_COLOR) | \
+				     (attr_t)COLOR_PAIR(p))), \
+	     OK) \
+	  : ERR)
+#define wattr_get(win,a,p,opts) \
+	(NCURSES_OK_ADDR(win) \
+	 ? ((void)(NCURSES_OK_ADDR(a) \
+		   ? (*(a) = (win)->_attrs) \
+		   : OK), \
+	    (void)(NCURSES_OK_ADDR(p) \
+		   ? (*(p) = (NCURSES_PAIRS_T) PAIR_NUMBER((win)->_attrs)) \
+		   : OK), \
+	    OK) \
+	 : ERR)
+#endif /* (NCURSES_WIDECHAR && NCURSES_EXE_COLORS) */
+#endif /* NCURSES_WATTR_MACROS */
+#endif /* NCURSES_OPAQUE */
+
+/*
+ * X/Open curses deprecates SVr4 vwprintw/vwscanw, which are supposed to use
+ * varargs.h.  It adds new calls vw_printw/vw_scanw, which are supposed to
+ * use POSIX stdarg.h.  The ncurses versions of vwprintw/vwscanw already
+ * use stdarg.h, so...
+ */
+/* define vw_printw		vwprintw */
+/* define vw_scanw		vwscanw */
+
+/*
+ * Export fallback function for use in C++ binding.
+ */
+#if !@HAVE_VSSCANF@
+#define vsscanf(a,b,c) _nc_vsscanf(a,b,c)
+NCURSES_EXPORT(int) vsscanf(const char *, const char *, va_list);
+#endif
+
+/*
+ * These macros are extensions - not in X/Open Curses.
+ */
+#if @NCURSES_EXT_FUNCS@
+#if !NCURSES_OPAQUE
+#define is_cleared(win)		(NCURSES_OK_ADDR(win) ? (win)->_clear : FALSE)
+#define is_idcok(win)		(NCURSES_OK_ADDR(win) ? (win)->_idcok : FALSE)
+#define is_idlok(win)		(NCURSES_OK_ADDR(win) ? (win)->_idlok : FALSE)
+#define is_immedok(win)		(NCURSES_OK_ADDR(win) ? (win)->_immed : FALSE)
+#define is_keypad(win)		(NCURSES_OK_ADDR(win) ? (win)->_use_keypad : FALSE)
+#define is_leaveok(win)		(NCURSES_OK_ADDR(win) ? (win)->_leaveok : FALSE)
+#define is_nodelay(win)		(NCURSES_OK_ADDR(win) ? ((win)->_delay == 0) : FALSE)
+#define is_notimeout(win)	(NCURSES_OK_ADDR(win) ? (win)->_notimeout : FALSE)
+#define is_pad(win)		(NCURSES_OK_ADDR(win) ? ((win)->_flags & _ISPAD) != 0 : FALSE)
+#define is_scrollok(win)	(NCURSES_OK_ADDR(win) ? (win)->_scroll : FALSE)
+#define is_subwin(win)		(NCURSES_OK_ADDR(win) ? ((win)->_flags & _SUBWIN) != 0 : FALSE)
+#define is_syncok(win)		(NCURSES_OK_ADDR(win) ? (win)->_sync : FALSE)
+#define wgetdelay(win)		(NCURSES_OK_ADDR(win) ? (win)->_delay : 0)
+#define wgetparent(win)		(NCURSES_OK_ADDR(win) ? (win)->_parent : 0)
+#define wgetscrreg(win,t,b)	(NCURSES_OK_ADDR(win) ? (*(t) = (win)->_regtop, *(b) = (win)->_regbottom, OK) : ERR)
+#endif
+#endif
+
+/*
+ * X/Open says this returns a bool; SVr4 also checked for out-of-range line.
+ * The macro provides compatibility:
+ */
+#define is_linetouched(w,l) ((!(w) || ((l) > getmaxy(w)) || ((l) < 0)) ? ERR : (is_linetouched)((w),(l)))
+
+#endif /* NCURSES_NOMACROS */
+
+/*
+ * Public variables.
+ *
+ * Notes:
+ *	a. ESCDELAY was an undocumented feature under AIX curses.
+ *	   It gives the ESC expire time in milliseconds.
+ *	b. ttytype is needed for backward compatibility
+ */
+#if NCURSES_REENTRANT
+
+NCURSES_WRAPPED_VAR(WINDOW *, curscr);
+NCURSES_WRAPPED_VAR(WINDOW *, newscr);
+NCURSES_WRAPPED_VAR(WINDOW *, stdscr);
+NCURSES_WRAPPED_VAR(char *, ttytype);
+NCURSES_WRAPPED_VAR(int, COLORS);
+NCURSES_WRAPPED_VAR(int, COLOR_PAIRS);
+NCURSES_WRAPPED_VAR(int, COLS);
+NCURSES_WRAPPED_VAR(int, ESCDELAY);
+NCURSES_WRAPPED_VAR(int, LINES);
+NCURSES_WRAPPED_VAR(int, TABSIZE);
+
+#define curscr      NCURSES_PUBLIC_VAR(curscr())
+#define newscr      NCURSES_PUBLIC_VAR(newscr())
+#define stdscr      NCURSES_PUBLIC_VAR(stdscr())
+#define ttytype     NCURSES_PUBLIC_VAR(ttytype())
+#define COLORS      NCURSES_PUBLIC_VAR(COLORS())
+#define COLOR_PAIRS NCURSES_PUBLIC_VAR(COLOR_PAIRS())
+#define COLS        NCURSES_PUBLIC_VAR(COLS())
+#define ESCDELAY    NCURSES_PUBLIC_VAR(ESCDELAY())
+#define LINES       NCURSES_PUBLIC_VAR(LINES())
+#define TABSIZE     NCURSES_PUBLIC_VAR(TABSIZE())
+
+#else
+
+extern NCURSES_EXPORT_VAR(WINDOW *) curscr;
+extern NCURSES_EXPORT_VAR(WINDOW *) newscr;
+extern NCURSES_EXPORT_VAR(WINDOW *) stdscr;
+extern NCURSES_EXPORT_VAR(char) ttytype[];
+extern NCURSES_EXPORT_VAR(int) COLORS;
+extern NCURSES_EXPORT_VAR(int) COLOR_PAIRS;
+extern NCURSES_EXPORT_VAR(int) COLS;
+extern NCURSES_EXPORT_VAR(int) ESCDELAY;
+extern NCURSES_EXPORT_VAR(int) LINES;
+extern NCURSES_EXPORT_VAR(int) TABSIZE;
+
+#endif
+
+/*
+ * Pseudo-character tokens outside ASCII range.  The curses wgetch() function
+ * will return any given one of these only if the corresponding k- capability
+ * is defined in your terminal's terminfo entry.
+ *
+ * Some keys (KEY_A1, etc) are arranged like this:
+ *	a1     up    a3
+ *	left   b2    right
+ *	c1     down  c3
+ *
+ * A few key codes do not depend upon the terminfo entry.
+ */
+#define KEY_CODE_YES	0400		/* A wchar_t contains a key code */
+#define KEY_MIN		0401		/* Minimum curses key */
+#define KEY_BREAK	0401		/* Break key (unreliable) */
+#define KEY_SRESET	0530		/* Soft (partial) reset (unreliable) */
+#define KEY_RESET	0531		/* Reset or hard reset (unreliable) */
diff --git a/include/curses.tail b/include/curses.tail
new file mode 100644
index 0000000..1151449
--- /dev/null
+++ b/include/curses.tail
@@ -0,0 +1,197 @@
+/* $Id: curses.tail,v 1.26 2021/03/20 15:49:25 tom Exp $ */
+/*
+ * vile:cmode:
+ * This file is part of ncurses, designed to be appended after curses.h.in
+ * (see that file for the relevant copyright).
+ */
+
+/* mouse interface */
+
+#if NCURSES_MOUSE_VERSION > 1
+#define NCURSES_MOUSE_MASK(b,m) ((m) << (((b) - 1) * 5))
+#else
+#define NCURSES_MOUSE_MASK(b,m) ((m) << (((b) - 1) * 6))
+#endif
+
+#define	NCURSES_BUTTON_RELEASED	001L
+#define	NCURSES_BUTTON_PRESSED	002L
+#define	NCURSES_BUTTON_CLICKED	004L
+#define	NCURSES_DOUBLE_CLICKED	010L
+#define	NCURSES_TRIPLE_CLICKED	020L
+#define	NCURSES_RESERVED_EVENT	040L
+
+/* event masks */
+#define	BUTTON1_RELEASED	NCURSES_MOUSE_MASK(1, NCURSES_BUTTON_RELEASED)
+#define	BUTTON1_PRESSED		NCURSES_MOUSE_MASK(1, NCURSES_BUTTON_PRESSED)
+#define	BUTTON1_CLICKED		NCURSES_MOUSE_MASK(1, NCURSES_BUTTON_CLICKED)
+#define	BUTTON1_DOUBLE_CLICKED	NCURSES_MOUSE_MASK(1, NCURSES_DOUBLE_CLICKED)
+#define	BUTTON1_TRIPLE_CLICKED	NCURSES_MOUSE_MASK(1, NCURSES_TRIPLE_CLICKED)
+
+#define	BUTTON2_RELEASED	NCURSES_MOUSE_MASK(2, NCURSES_BUTTON_RELEASED)
+#define	BUTTON2_PRESSED		NCURSES_MOUSE_MASK(2, NCURSES_BUTTON_PRESSED)
+#define	BUTTON2_CLICKED		NCURSES_MOUSE_MASK(2, NCURSES_BUTTON_CLICKED)
+#define	BUTTON2_DOUBLE_CLICKED	NCURSES_MOUSE_MASK(2, NCURSES_DOUBLE_CLICKED)
+#define	BUTTON2_TRIPLE_CLICKED	NCURSES_MOUSE_MASK(2, NCURSES_TRIPLE_CLICKED)
+
+#define	BUTTON3_RELEASED	NCURSES_MOUSE_MASK(3, NCURSES_BUTTON_RELEASED)
+#define	BUTTON3_PRESSED		NCURSES_MOUSE_MASK(3, NCURSES_BUTTON_PRESSED)
+#define	BUTTON3_CLICKED		NCURSES_MOUSE_MASK(3, NCURSES_BUTTON_CLICKED)
+#define	BUTTON3_DOUBLE_CLICKED	NCURSES_MOUSE_MASK(3, NCURSES_DOUBLE_CLICKED)
+#define	BUTTON3_TRIPLE_CLICKED	NCURSES_MOUSE_MASK(3, NCURSES_TRIPLE_CLICKED)
+
+#define	BUTTON4_RELEASED	NCURSES_MOUSE_MASK(4, NCURSES_BUTTON_RELEASED)
+#define	BUTTON4_PRESSED		NCURSES_MOUSE_MASK(4, NCURSES_BUTTON_PRESSED)
+#define	BUTTON4_CLICKED		NCURSES_MOUSE_MASK(4, NCURSES_BUTTON_CLICKED)
+#define	BUTTON4_DOUBLE_CLICKED	NCURSES_MOUSE_MASK(4, NCURSES_DOUBLE_CLICKED)
+#define	BUTTON4_TRIPLE_CLICKED	NCURSES_MOUSE_MASK(4, NCURSES_TRIPLE_CLICKED)
+
+/*
+ * In 32 bits the version-1 scheme does not provide enough space for a 5th
+ * button, unless we choose to change the ABI by omitting the reserved-events.
+ */
+#if NCURSES_MOUSE_VERSION > 1
+
+#define	BUTTON5_RELEASED	NCURSES_MOUSE_MASK(5, NCURSES_BUTTON_RELEASED)
+#define	BUTTON5_PRESSED		NCURSES_MOUSE_MASK(5, NCURSES_BUTTON_PRESSED)
+#define	BUTTON5_CLICKED		NCURSES_MOUSE_MASK(5, NCURSES_BUTTON_CLICKED)
+#define	BUTTON5_DOUBLE_CLICKED	NCURSES_MOUSE_MASK(5, NCURSES_DOUBLE_CLICKED)
+#define	BUTTON5_TRIPLE_CLICKED	NCURSES_MOUSE_MASK(5, NCURSES_TRIPLE_CLICKED)
+
+#define	BUTTON_CTRL		NCURSES_MOUSE_MASK(6, 0001L)
+#define	BUTTON_SHIFT		NCURSES_MOUSE_MASK(6, 0002L)
+#define	BUTTON_ALT		NCURSES_MOUSE_MASK(6, 0004L)
+#define	REPORT_MOUSE_POSITION	NCURSES_MOUSE_MASK(6, 0010L)
+
+#else
+
+#define	BUTTON1_RESERVED_EVENT	NCURSES_MOUSE_MASK(1, NCURSES_RESERVED_EVENT)
+#define	BUTTON2_RESERVED_EVENT	NCURSES_MOUSE_MASK(2, NCURSES_RESERVED_EVENT)
+#define	BUTTON3_RESERVED_EVENT	NCURSES_MOUSE_MASK(3, NCURSES_RESERVED_EVENT)
+#define	BUTTON4_RESERVED_EVENT	NCURSES_MOUSE_MASK(4, NCURSES_RESERVED_EVENT)
+
+#define	BUTTON_CTRL		NCURSES_MOUSE_MASK(5, 0001L)
+#define	BUTTON_SHIFT		NCURSES_MOUSE_MASK(5, 0002L)
+#define	BUTTON_ALT		NCURSES_MOUSE_MASK(5, 0004L)
+#define	REPORT_MOUSE_POSITION	NCURSES_MOUSE_MASK(5, 0010L)
+
+#endif
+
+#define	ALL_MOUSE_EVENTS	(REPORT_MOUSE_POSITION - 1)
+
+/* macros to extract single event-bits from masks */
+#define	BUTTON_RELEASE(e, x)		((e) & NCURSES_MOUSE_MASK(x, 001))
+#define	BUTTON_PRESS(e, x)		((e) & NCURSES_MOUSE_MASK(x, 002))
+#define	BUTTON_CLICK(e, x)		((e) & NCURSES_MOUSE_MASK(x, 004))
+#define	BUTTON_DOUBLE_CLICK(e, x)	((e) & NCURSES_MOUSE_MASK(x, 010))
+#define	BUTTON_TRIPLE_CLICK(e, x)	((e) & NCURSES_MOUSE_MASK(x, 020))
+#define	BUTTON_RESERVED_EVENT(e, x)	((e) & NCURSES_MOUSE_MASK(x, 040))
+
+typedef struct
+{
+    short id;		/* ID to distinguish multiple devices */
+    int x, y, z;	/* event coordinates (character-cell) */
+    mmask_t bstate;	/* button state bits */
+}
+MEVENT;
+
+extern NCURSES_EXPORT(bool)    has_mouse(void);
+extern NCURSES_EXPORT(int)     getmouse (MEVENT *);
+extern NCURSES_EXPORT(int)     ungetmouse (MEVENT *);
+extern NCURSES_EXPORT(mmask_t) mousemask (mmask_t, mmask_t *);
+extern NCURSES_EXPORT(bool)    wenclose (const WINDOW *, int, int);
+extern NCURSES_EXPORT(int)     mouseinterval (int);
+extern NCURSES_EXPORT(bool)    wmouse_trafo (const WINDOW*, int*, int*, bool);
+extern NCURSES_EXPORT(bool)    mouse_trafo (int*, int*, bool);              /* generated */
+
+#if NCURSES_SP_FUNCS
+extern NCURSES_EXPORT(bool)    NCURSES_SP_NAME(has_mouse) (SCREEN*);
+extern NCURSES_EXPORT(int)     NCURSES_SP_NAME(getmouse) (SCREEN*, MEVENT *);
+extern NCURSES_EXPORT(int)     NCURSES_SP_NAME(ungetmouse) (SCREEN*,MEVENT *);
+extern NCURSES_EXPORT(mmask_t) NCURSES_SP_NAME(mousemask) (SCREEN*, mmask_t, mmask_t *);
+extern NCURSES_EXPORT(int)     NCURSES_SP_NAME(mouseinterval) (SCREEN*, int);
+#endif
+
+#ifndef NCURSES_NOMACROS
+#define mouse_trafo(y,x,to_screen) wmouse_trafo(stdscr,y,x,to_screen)
+#endif
+
+/* other non-XSI functions */
+
+extern NCURSES_EXPORT(int) mcprint (char *, int);	/* direct data to printer */
+extern NCURSES_EXPORT(int) has_key (int);		/* do we have given key? */
+
+#if NCURSES_SP_FUNCS
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(has_key) (SCREEN*, int);    /* do we have given key? */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(mcprint) (SCREEN*, char *, int);	/* direct data to printer */
+#endif
+
+/* Debugging : use with libncurses_g.a */
+
+extern NCURSES_EXPORT(void) _tracef (const char *, ...) GCC_PRINTFLIKE(1,2);
+extern NCURSES_EXPORT(char *) _traceattr (attr_t);
+extern NCURSES_EXPORT(char *) _traceattr2 (int, chtype);
+extern NCURSES_EXPORT(char *) _tracechar (int);
+extern NCURSES_EXPORT(char *) _tracechtype (chtype);
+extern NCURSES_EXPORT(char *) _tracechtype2 (int, chtype);
+#if NCURSES_WIDECHAR
+#define _tracech_t		_tracecchar_t
+extern NCURSES_EXPORT(char *) _tracecchar_t (const cchar_t *);
+#define _tracech_t2		_tracecchar_t2
+extern NCURSES_EXPORT(char *) _tracecchar_t2 (int, const cchar_t *);
+#else
+#define _tracech_t		_tracechtype
+#define _tracech_t2		_tracechtype2
+#endif
+extern NCURSES_EXPORT(void) trace (const unsigned) GCC_DEPRECATED("use curses_trace");
+extern NCURSES_EXPORT(unsigned) curses_trace (const unsigned);
+
+/* trace masks */
+#define TRACE_DISABLE	0x0000	/* turn off tracing */
+#define TRACE_TIMES	0x0001	/* trace user and system times of updates */
+#define TRACE_TPUTS	0x0002	/* trace tputs calls */
+#define TRACE_UPDATE	0x0004	/* trace update actions, old & new screens */
+#define TRACE_MOVE	0x0008	/* trace cursor moves and scrolls */
+#define TRACE_CHARPUT	0x0010	/* trace all character outputs */
+#define TRACE_ORDINARY	0x001F	/* trace all update actions */
+#define TRACE_CALLS	0x0020	/* trace all curses calls */
+#define TRACE_VIRTPUT	0x0040	/* trace virtual character puts */
+#define TRACE_IEVENT	0x0080	/* trace low-level input processing */
+#define TRACE_BITS	0x0100	/* trace state of TTY control bits */
+#define TRACE_ICALLS	0x0200	/* trace internal/nested calls */
+#define TRACE_CCALLS	0x0400	/* trace per-character calls */
+#define TRACE_DATABASE	0x0800	/* trace read/write of terminfo/termcap data */
+#define TRACE_ATTRS	0x1000	/* trace attribute updates */
+
+#define TRACE_SHIFT	13	/* number of bits in the trace masks */
+#define TRACE_MAXIMUM	((1 << TRACE_SHIFT) - 1) /* maximum trace level */
+
+#if defined(TRACE) || defined(NCURSES_TEST)
+extern NCURSES_EXPORT_VAR(int) _nc_optimize_enable;		/* enable optimizations */
+extern NCURSES_EXPORT(const char *) _nc_visbuf (const char *);
+#define OPTIMIZE_MVCUR		0x01	/* cursor movement optimization */
+#define OPTIMIZE_HASHMAP	0x02	/* diff hashing to detect scrolls */
+#define OPTIMIZE_SCROLL		0x04	/* scroll optimization */
+#define OPTIMIZE_ALL		0xff	/* enable all optimizations (dflt) */
+#endif
+
+extern GCC_NORETURN NCURSES_EXPORT(void) exit_curses (int);
+
+#include <unctrl.h>
+
+#ifdef __cplusplus
+
+#ifndef NCURSES_NOMACROS
+
+/* these names conflict with STL */
+#undef box
+#undef clear
+#undef erase
+#undef move
+#undef refresh
+
+#endif /* NCURSES_NOMACROS */
+
+}
+#endif
+
+#endif /* __NCURSES_H */
diff --git a/include/curses.wide b/include/curses.wide
new file mode 100644
index 0000000..33adb07
--- /dev/null
+++ b/include/curses.wide
@@ -0,0 +1,314 @@
+/* $Id: curses.wide,v 1.51 2021/05/22 20:28:29 tom Exp $ */
+/*
+ * vile:cmode:
+ * This file is part of ncurses, designed to be appended after curses.h.in
+ * (see that file for the relevant copyright).
+ */
+#define _XOPEN_CURSES 1
+
+#if NCURSES_WIDECHAR
+
+extern NCURSES_EXPORT_VAR(cchar_t *) _nc_wacs;
+
+#define NCURSES_WACS(c)	(&_nc_wacs[NCURSES_CAST(unsigned char,(c))])
+
+#define WACS_BSSB	NCURSES_WACS('l')
+#define WACS_SSBB	NCURSES_WACS('m')
+#define WACS_BBSS	NCURSES_WACS('k')
+#define WACS_SBBS	NCURSES_WACS('j')
+#define WACS_SBSS	NCURSES_WACS('u')
+#define WACS_SSSB	NCURSES_WACS('t')
+#define WACS_SSBS	NCURSES_WACS('v')
+#define WACS_BSSS	NCURSES_WACS('w')
+#define WACS_BSBS	NCURSES_WACS('q')
+#define WACS_SBSB	NCURSES_WACS('x')
+#define WACS_SSSS	NCURSES_WACS('n')
+
+#define WACS_ULCORNER	WACS_BSSB
+#define WACS_LLCORNER	WACS_SSBB
+#define WACS_URCORNER	WACS_BBSS
+#define WACS_LRCORNER	WACS_SBBS
+#define WACS_RTEE	WACS_SBSS
+#define WACS_LTEE	WACS_SSSB
+#define WACS_BTEE	WACS_SSBS
+#define WACS_TTEE	WACS_BSSS
+#define WACS_HLINE	WACS_BSBS
+#define WACS_VLINE	WACS_SBSB
+#define WACS_PLUS	WACS_SSSS
+
+#define WACS_S1		NCURSES_WACS('o') /* scan line 1 */
+#define WACS_S9 	NCURSES_WACS('s') /* scan line 9 */
+#define WACS_DIAMOND	NCURSES_WACS('`') /* diamond */
+#define WACS_CKBOARD	NCURSES_WACS('a') /* checker board */
+#define WACS_DEGREE	NCURSES_WACS('f') /* degree symbol */
+#define WACS_PLMINUS	NCURSES_WACS('g') /* plus/minus */
+#define WACS_BULLET	NCURSES_WACS('~') /* bullet */
+
+	/* Teletype 5410v1 symbols */
+#define WACS_LARROW	NCURSES_WACS(',') /* arrow left */
+#define WACS_RARROW	NCURSES_WACS('+') /* arrow right */
+#define WACS_DARROW	NCURSES_WACS('.') /* arrow down */
+#define WACS_UARROW	NCURSES_WACS('-') /* arrow up */
+#define WACS_BOARD	NCURSES_WACS('h') /* board of squares */
+#define WACS_LANTERN	NCURSES_WACS('i') /* lantern symbol */
+#define WACS_BLOCK	NCURSES_WACS('0') /* solid square block */
+
+	/* ncurses extensions */
+#define WACS_S3		NCURSES_WACS('p') /* scan line 3 */
+#define WACS_S7		NCURSES_WACS('r') /* scan line 7 */
+#define WACS_LEQUAL	NCURSES_WACS('y') /* less/equal */
+#define WACS_GEQUAL	NCURSES_WACS('z') /* greater/equal */
+#define WACS_PI		NCURSES_WACS('{') /* Pi */
+#define WACS_NEQUAL	NCURSES_WACS('|') /* not equal */
+#define WACS_STERLING	NCURSES_WACS('}') /* UK pound sign */
+
+	/* double lines */
+#define WACS_BDDB	NCURSES_WACS('C')
+#define WACS_DDBB	NCURSES_WACS('D')
+#define WACS_BBDD	NCURSES_WACS('B')
+#define WACS_DBBD	NCURSES_WACS('A')
+#define WACS_DBDD	NCURSES_WACS('G')
+#define WACS_DDDB	NCURSES_WACS('F')
+#define WACS_DDBD	NCURSES_WACS('H')
+#define WACS_BDDD	NCURSES_WACS('I')
+#define WACS_BDBD	NCURSES_WACS('R')
+#define WACS_DBDB	NCURSES_WACS('Y')
+#define WACS_DDDD	NCURSES_WACS('E')
+
+#define WACS_D_ULCORNER	WACS_BDDB
+#define WACS_D_LLCORNER	WACS_DDBB
+#define WACS_D_URCORNER	WACS_BBDD
+#define WACS_D_LRCORNER	WACS_DBBD
+#define WACS_D_RTEE	WACS_DBDD
+#define WACS_D_LTEE	WACS_DDDB
+#define WACS_D_BTEE	WACS_DDBD
+#define WACS_D_TTEE	WACS_BDDD
+#define WACS_D_HLINE	WACS_BDBD
+#define WACS_D_VLINE	WACS_DBDB
+#define WACS_D_PLUS	WACS_DDDD
+
+	/* thick lines */
+#define WACS_BTTB	NCURSES_WACS('L')
+#define WACS_TTBB	NCURSES_WACS('M')
+#define WACS_BBTT	NCURSES_WACS('K')
+#define WACS_TBBT	NCURSES_WACS('J')
+#define WACS_TBTT	NCURSES_WACS('U')
+#define WACS_TTTB	NCURSES_WACS('T')
+#define WACS_TTBT	NCURSES_WACS('V')
+#define WACS_BTTT	NCURSES_WACS('W')
+#define WACS_BTBT	NCURSES_WACS('Q')
+#define WACS_TBTB	NCURSES_WACS('X')
+#define WACS_TTTT	NCURSES_WACS('N')
+
+#define WACS_T_ULCORNER	WACS_BTTB
+#define WACS_T_LLCORNER	WACS_TTBB
+#define WACS_T_URCORNER	WACS_BBTT
+#define WACS_T_LRCORNER	WACS_TBBT
+#define WACS_T_RTEE	WACS_TBTT
+#define WACS_T_LTEE	WACS_TTTB
+#define WACS_T_BTEE	WACS_TTBT
+#define WACS_T_TTEE	WACS_BTTT
+#define WACS_T_HLINE	WACS_BTBT
+#define WACS_T_VLINE	WACS_TBTB
+#define WACS_T_PLUS	WACS_TTTT
+
+/*
+ * Function prototypes for wide-character operations.
+ *
+ * "generated" comments should include ":WIDEC" to make the corresponding
+ * functions ifdef'd in lib_gen.c
+ *
+ * "implemented" comments do not need this marker.
+ */
+
+extern NCURSES_EXPORT(int) add_wch (const cchar_t *);			/* generated:WIDEC */
+extern NCURSES_EXPORT(int) add_wchnstr (const cchar_t *, int);		/* generated:WIDEC */
+extern NCURSES_EXPORT(int) add_wchstr (const cchar_t *);		/* generated:WIDEC */
+extern NCURSES_EXPORT(int) addnwstr (const wchar_t *, int);		/* generated:WIDEC */
+extern NCURSES_EXPORT(int) addwstr (const wchar_t *);			/* generated:WIDEC */
+extern NCURSES_EXPORT(int) bkgrnd (const cchar_t *);			/* generated:WIDEC */
+extern NCURSES_EXPORT(void) bkgrndset (const cchar_t *);		/* generated:WIDEC */
+extern NCURSES_EXPORT(int) border_set (const cchar_t*,const cchar_t*,const cchar_t*,const cchar_t*,const cchar_t*,const cchar_t*,const cchar_t*,const cchar_t*); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) box_set (WINDOW *, const cchar_t *, const cchar_t *);	/* generated:WIDEC */
+extern NCURSES_EXPORT(int) echo_wchar (const cchar_t *);		/* generated:WIDEC */
+extern NCURSES_EXPORT(int) erasewchar (wchar_t*);			/* implemented */
+extern NCURSES_EXPORT(int) get_wch (wint_t *);				/* generated:WIDEC */
+extern NCURSES_EXPORT(int) get_wstr (wint_t *);				/* generated:WIDEC */
+extern NCURSES_EXPORT(int) getbkgrnd (cchar_t *);			/* generated:WIDEC */
+extern NCURSES_EXPORT(int) getcchar (const cchar_t *, wchar_t*, attr_t*, NCURSES_PAIRS_T*, void*);	/* implemented */
+extern NCURSES_EXPORT(int) getn_wstr (wint_t *, int);			/* generated:WIDEC */
+extern NCURSES_EXPORT(int) hline_set (const cchar_t *, int);		/* generated:WIDEC */
+extern NCURSES_EXPORT(int) in_wch (cchar_t *);				/* generated:WIDEC */
+extern NCURSES_EXPORT(int) in_wchnstr (cchar_t *, int);			/* generated:WIDEC */
+extern NCURSES_EXPORT(int) in_wchstr (cchar_t *);			/* generated:WIDEC */
+extern NCURSES_EXPORT(int) innwstr (wchar_t *, int);			/* generated:WIDEC */
+extern NCURSES_EXPORT(int) ins_nwstr (const wchar_t *, int);		/* generated:WIDEC */
+extern NCURSES_EXPORT(int) ins_wch (const cchar_t *);			/* generated:WIDEC */
+extern NCURSES_EXPORT(int) ins_wstr (const wchar_t *);			/* generated:WIDEC */
+extern NCURSES_EXPORT(int) inwstr (wchar_t *);				/* generated:WIDEC */
+extern NCURSES_EXPORT(NCURSES_CONST char*) key_name (wchar_t);		/* implemented */
+extern NCURSES_EXPORT(int) killwchar (wchar_t *);			/* implemented */
+extern NCURSES_EXPORT(int) mvadd_wch (int, int, const cchar_t *);	/* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvadd_wchnstr (int, int, const cchar_t *, int);/* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvadd_wchstr (int, int, const cchar_t *);	/* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvaddnwstr (int, int, const wchar_t *, int);	/* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvaddwstr (int, int, const wchar_t *);	/* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvget_wch (int, int, wint_t *);		/* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvget_wstr (int, int, wint_t *);		/* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvgetn_wstr (int, int, wint_t *, int);	/* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvhline_set (int, int, const cchar_t *, int);	/* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvin_wch (int, int, cchar_t *);		/* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvin_wchnstr (int, int, cchar_t *, int);	/* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvin_wchstr (int, int, cchar_t *);		/* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvinnwstr (int, int, wchar_t *, int);	/* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvins_nwstr (int, int, const wchar_t *, int);	/* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvins_wch (int, int, const cchar_t *);	/* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvins_wstr (int, int, const wchar_t *);	/* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvinwstr (int, int, wchar_t *);		/* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvvline_set (int, int, const cchar_t *, int);	/* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvwadd_wch (WINDOW *, int, int, const cchar_t *);	/* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvwadd_wchnstr (WINDOW *, int, int, const cchar_t *, int); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvwadd_wchstr (WINDOW *, int, int, const cchar_t *);	/* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvwaddnwstr (WINDOW *, int, int, const wchar_t *, int);/* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvwaddwstr (WINDOW *, int, int, const wchar_t *);	/* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvwget_wch (WINDOW *, int, int, wint_t *);	/* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvwget_wstr (WINDOW *, int, int, wint_t *);	/* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvwgetn_wstr (WINDOW *, int, int, wint_t *, int);/* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvwhline_set (WINDOW *, int, int, const cchar_t *, int);/* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvwin_wch (WINDOW *, int, int, cchar_t *);	/* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvwin_wchnstr (WINDOW *, int,int, cchar_t *,int);	/* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvwin_wchstr (WINDOW *, int, int, cchar_t *);	/* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvwinnwstr (WINDOW *, int, int, wchar_t *, int);	/* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvwins_nwstr (WINDOW *, int,int, const wchar_t *,int); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvwins_wch (WINDOW *, int, int, const cchar_t *);	/* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvwins_wstr (WINDOW *, int, int, const wchar_t *);	/* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvwinwstr (WINDOW *, int, int, wchar_t *);		/* generated:WIDEC */
+extern NCURSES_EXPORT(int) mvwvline_set (WINDOW *, int,int, const cchar_t *,int); /* generated:WIDEC */
+extern NCURSES_EXPORT(int) pecho_wchar (WINDOW *, const cchar_t *);	/* implemented */
+extern NCURSES_EXPORT(int) setcchar (cchar_t *, const wchar_t *, const attr_t, NCURSES_PAIRS_T, const void *);	/* implemented */
+extern NCURSES_EXPORT(int) slk_wset (int, const wchar_t *, int);	/* implemented */
+extern NCURSES_EXPORT(attr_t) term_attrs (void);			/* implemented */
+extern NCURSES_EXPORT(int) unget_wch (const wchar_t);			/* implemented */
+extern NCURSES_EXPORT(int) vid_attr (attr_t, NCURSES_PAIRS_T, void *);		/* implemented */
+extern NCURSES_EXPORT(int) vid_puts (attr_t, NCURSES_PAIRS_T, void *, NCURSES_OUTC); /* implemented */
+extern NCURSES_EXPORT(int) vline_set (const cchar_t *, int);		/* generated:WIDEC */
+extern NCURSES_EXPORT(int) wadd_wch (WINDOW *,const cchar_t *);		/* implemented */
+extern NCURSES_EXPORT(int) wadd_wchnstr (WINDOW *,const cchar_t *,int);	/* implemented */
+extern NCURSES_EXPORT(int) wadd_wchstr (WINDOW *,const cchar_t *);	/* generated:WIDEC */
+extern NCURSES_EXPORT(int) waddnwstr (WINDOW *,const wchar_t *,int);	/* implemented */
+extern NCURSES_EXPORT(int) waddwstr (WINDOW *,const wchar_t *);		/* generated:WIDEC */
+extern NCURSES_EXPORT(int) wbkgrnd (WINDOW *,const cchar_t *);		/* implemented */
+extern NCURSES_EXPORT(void) wbkgrndset (WINDOW *,const cchar_t *);	/* implemented */
+extern NCURSES_EXPORT(int) wborder_set (WINDOW *,const cchar_t*,const cchar_t*,const cchar_t*,const cchar_t*,const cchar_t*,const cchar_t*,const cchar_t*,const cchar_t*);	/* implemented */
+extern NCURSES_EXPORT(int) wecho_wchar (WINDOW *, const cchar_t *);	/* implemented */
+extern NCURSES_EXPORT(int) wget_wch (WINDOW *, wint_t *);		/* implemented */
+extern NCURSES_EXPORT(int) wget_wstr (WINDOW *, wint_t *);		/* generated:WIDEC */
+extern NCURSES_EXPORT(int) wgetbkgrnd (WINDOW *, cchar_t *);		/* generated:WIDEC */
+extern NCURSES_EXPORT(int) wgetn_wstr (WINDOW *, wint_t *, int);	/* implemented */
+extern NCURSES_EXPORT(int) whline_set (WINDOW *, const cchar_t *, int);	/* implemented */
+extern NCURSES_EXPORT(int) win_wch (WINDOW *, cchar_t *);		/* implemented */
+extern NCURSES_EXPORT(int) win_wchnstr (WINDOW *, cchar_t *, int);	/* implemented */
+extern NCURSES_EXPORT(int) win_wchstr (WINDOW *, cchar_t *);		/* generated:WIDEC */
+extern NCURSES_EXPORT(int) winnwstr (WINDOW *, wchar_t *, int);		/* implemented */
+extern NCURSES_EXPORT(int) wins_nwstr (WINDOW *, const wchar_t *, int);	/* implemented */
+extern NCURSES_EXPORT(int) wins_wch (WINDOW *, const cchar_t *);	/* implemented */
+extern NCURSES_EXPORT(int) wins_wstr (WINDOW *, const wchar_t *);	/* generated:WIDEC */
+extern NCURSES_EXPORT(int) winwstr (WINDOW *, wchar_t *);		/* implemented */
+extern NCURSES_EXPORT(wchar_t*) wunctrl (cchar_t *);			/* implemented */
+extern NCURSES_EXPORT(int) wvline_set (WINDOW *, const cchar_t *, int);	/* implemented */
+
+#if NCURSES_SP_FUNCS
+extern NCURSES_EXPORT(attr_t) NCURSES_SP_NAME(term_attrs) (SCREEN*);		/* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(erasewchar) (SCREEN*, wchar_t *);	/* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(killwchar) (SCREEN*, wchar_t *);	/* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(unget_wch) (SCREEN*, const wchar_t);	/* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(vid_attr) (SCREEN*, attr_t, NCURSES_PAIRS_T, void *);	/* implemented:SP_FUNC */
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(vid_puts) (SCREEN*, attr_t, NCURSES_PAIRS_T, void *, NCURSES_SP_OUTC);	/* implemented:SP_FUNC */
+extern NCURSES_EXPORT(wchar_t*) NCURSES_SP_NAME(wunctrl) (SCREEN*, cchar_t *);	/* implemented:SP_FUNC */
+#endif
+
+#ifndef NCURSES_NOMACROS
+
+/*
+ * XSI curses macros for XPG4 conformance.
+ */
+#define add_wch(c)			wadd_wch(stdscr,(c))
+#define add_wchnstr(str,n)		wadd_wchnstr(stdscr,(str),(n))
+#define add_wchstr(str)			wadd_wchstr(stdscr,(str))
+#define addnwstr(wstr,n)		waddnwstr(stdscr,(wstr),(n))
+#define addwstr(wstr)			waddwstr(stdscr,(wstr))
+#define bkgrnd(c)			wbkgrnd(stdscr,(c))
+#define bkgrndset(c)			wbkgrndset(stdscr,(c))
+#define border_set(l,r,t,b,tl,tr,bl,br) wborder_set(stdscr,(l),(r),(t),(b),tl,tr,bl,br)
+#define box_set(w,v,h)			wborder_set((w),(v),(v),(h),(h),0,0,0,0)
+#define echo_wchar(c)			wecho_wchar(stdscr,(c))
+#define get_wch(c)			wget_wch(stdscr,(c))
+#define get_wstr(t)			wget_wstr(stdscr,(t))
+#define getbkgrnd(wch)			wgetbkgrnd(stdscr,(wch))
+#define getn_wstr(t,n)			wgetn_wstr(stdscr,(t),(n))
+#define hline_set(c,n)			whline_set(stdscr,(c),(n))
+#define in_wch(c)			win_wch(stdscr,(c))
+#define in_wchnstr(c,n)			win_wchnstr(stdscr,(c),(n))
+#define in_wchstr(c)			win_wchstr(stdscr,(c))
+#define innwstr(c,n)			winnwstr(stdscr,(c),(n))
+#define ins_nwstr(t,n)			wins_nwstr(stdscr,(t),(n))
+#define ins_wch(c)			wins_wch(stdscr,(c))
+#define ins_wstr(t)			wins_wstr(stdscr,(t))
+#define inwstr(c)			winwstr(stdscr,(c))
+#define vline_set(c,n)			wvline_set(stdscr,(c),(n))
+#define wadd_wchstr(win,str)		wadd_wchnstr((win),(str),-1)
+#define waddwstr(win,wstr)		waddnwstr((win),(wstr),-1)
+#define wget_wstr(w,t)			wgetn_wstr((w),(t),-1)
+#define win_wchstr(w,c)			win_wchnstr((w),(c),-1)
+#define wins_wstr(w,t)			wins_nwstr((w),(t),-1)
+
+#if !NCURSES_OPAQUE
+#define wgetbkgrnd(win,wch)		(NCURSES_OK_ADDR(wch) ? ((win) ? (*(wch) = (win)->_bkgrnd) : *(wch), OK) : ERR)
+#endif
+
+#define mvadd_wch(y,x,c)		mvwadd_wch(stdscr,(y),(x),(c))
+#define mvadd_wchnstr(y,x,s,n)		mvwadd_wchnstr(stdscr,(y),(x),(s),(n))
+#define mvadd_wchstr(y,x,s)		mvwadd_wchstr(stdscr,(y),(x),(s))
+#define mvaddnwstr(y,x,wstr,n)		mvwaddnwstr(stdscr,(y),(x),(wstr),(n))
+#define mvaddwstr(y,x,wstr)		mvwaddwstr(stdscr,(y),(x),(wstr))
+#define mvget_wch(y,x,c)		mvwget_wch(stdscr,(y),(x),(c))
+#define mvget_wstr(y,x,t)		mvwget_wstr(stdscr,(y),(x),(t))
+#define mvgetn_wstr(y,x,t,n)		mvwgetn_wstr(stdscr,(y),(x),(t),(n))
+#define mvhline_set(y,x,c,n)		mvwhline_set(stdscr,(y),(x),(c),(n))
+#define mvin_wch(y,x,c)			mvwin_wch(stdscr,(y),(x),(c))
+#define mvin_wchnstr(y,x,c,n)		mvwin_wchnstr(stdscr,(y),(x),(c),(n))
+#define mvin_wchstr(y,x,c)		mvwin_wchstr(stdscr,(y),(x),(c))
+#define mvinnwstr(y,x,c,n)		mvwinnwstr(stdscr,(y),(x),(c),(n))
+#define mvins_nwstr(y,x,t,n)		mvwins_nwstr(stdscr,(y),(x),(t),(n))
+#define mvins_wch(y,x,c)		mvwins_wch(stdscr,(y),(x),(c))
+#define mvins_wstr(y,x,t)		mvwins_wstr(stdscr,(y),(x),(t))
+#define mvinwstr(y,x,c)			mvwinwstr(stdscr,(y),(x),(c))
+#define mvvline_set(y,x,c,n)		mvwvline_set(stdscr,(y),(x),(c),(n))
+
+#define mvwadd_wch(win,y,x,c)		(wmove(win,(y),(x)) == ERR ? ERR : wadd_wch((win),(c)))
+#define mvwadd_wchnstr(win,y,x,s,n)	(wmove(win,(y),(x)) == ERR ? ERR : wadd_wchnstr((win),(s),(n)))
+#define mvwadd_wchstr(win,y,x,s)	(wmove(win,(y),(x)) == ERR ? ERR : wadd_wchstr((win),(s)))
+#define mvwaddnwstr(win,y,x,wstr,n)	(wmove(win,(y),(x)) == ERR ? ERR : waddnwstr((win),(wstr),(n)))
+#define mvwaddwstr(win,y,x,wstr)	(wmove(win,(y),(x)) == ERR ? ERR : waddwstr((win),(wstr)))
+#define mvwget_wch(win,y,x,c)		(wmove(win,(y),(x)) == ERR ? ERR : wget_wch((win),(c)))
+#define mvwget_wstr(win,y,x,t)		(wmove(win,(y),(x)) == ERR ? ERR : wget_wstr((win),(t)))
+#define mvwgetn_wstr(win,y,x,t,n)	(wmove(win,(y),(x)) == ERR ? ERR : wgetn_wstr((win),(t),(n)))
+#define mvwhline_set(win,y,x,c,n)	(wmove(win,(y),(x)) == ERR ? ERR : whline_set((win),(c),(n)))
+#define mvwin_wch(win,y,x,c)		(wmove(win,(y),(x)) == ERR ? ERR : win_wch((win),(c)))
+#define mvwin_wchnstr(win,y,x,c,n)	(wmove(win,(y),(x)) == ERR ? ERR : win_wchnstr((win),(c),(n)))
+#define mvwin_wchstr(win,y,x,c)		(wmove(win,(y),(x)) == ERR ? ERR : win_wchstr((win),(c)))
+#define mvwinnwstr(win,y,x,c,n)		(wmove(win,(y),(x)) == ERR ? ERR : winnwstr((win),(c),(n)))
+#define mvwins_nwstr(win,y,x,t,n)	(wmove(win,(y),(x)) == ERR ? ERR : wins_nwstr((win),(t),(n)))
+#define mvwins_wch(win,y,x,c)		(wmove(win,(y),(x)) == ERR ? ERR : wins_wch((win),(c)))
+#define mvwins_wstr(win,y,x,t)		(wmove(win,(y),(x)) == ERR ? ERR : wins_wstr((win),(t)))
+#define mvwinwstr(win,y,x,c)		(wmove(win,(y),(x)) == ERR ? ERR : winwstr((win),(c)))
+#define mvwvline_set(win,y,x,c,n)	(wmove(win,(y),(x)) == ERR ? ERR : wvline_set((win),(c),(n)))
+
+#endif /* NCURSES_NOMACROS */
+
+#if defined(TRACE) || defined(NCURSES_TEST)
+extern NCURSES_EXPORT(const char *) _nc_viswbuf(const wchar_t *);
+extern NCURSES_EXPORT(const char *) _nc_viswibuf(const wint_t *);
+#endif
+
+#endif /* NCURSES_WIDECHAR */
diff --git a/include/edit_cfg.sh b/include/edit_cfg.sh
new file mode 100755
index 0000000..559b157
--- /dev/null
+++ b/include/edit_cfg.sh
@@ -0,0 +1,69 @@
+#!/bin/sh
+# $Id: edit_cfg.sh,v 1.16 2022/07/16 18:02:32 tom Exp $
+##############################################################################
+# Copyright 2020,2022 Thomas E. Dickey                                       #
+# Copyright 1998-2001,2017 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey <dickey@clark.net> 1996,1997,2000
+#
+# Edit the default value of the term.h file based on the autoconf-generated
+# values:
+#
+#	$1 = ncurses_cfg.h
+#	$2 = term.h
+#
+BAK=save$$
+TMP=edit$$
+trap "rm -f $BAK $TMP; exit 1" 1 2 3 15
+trap "rm -f $BAK $TMP" 0
+for name in \
+	HAVE_TCGETATTR \
+	HAVE_TERMIOS_H \
+	HAVE_TERMIO_H \
+	BROKEN_LINKER
+do
+	mv "$2" "$BAK"
+	if ( grep "[ 	]${name}[ 	]" "$1" >$TMP 2>&1 )
+	then
+		value=1
+	else
+		value=0
+	fi
+	echo '** edit: '$name $value
+	sed \
+		-e "s@#define ${name}.*\$@#define $name $value@" \
+		-e "s@#if $name\$@#if $value /* $name */@" \
+		-e "s@#if !$name\$@#if $value /* !$name */@" \
+		"$BAK" >"$2"
+	if (cmp -s "$2" "$BAK")
+	then
+		mv "$BAK" "$2"
+	else
+		rm -f "$BAK"
+	fi
+done
diff --git a/include/hashed_db.h b/include/hashed_db.h
new file mode 100644
index 0000000..584fd96
--- /dev/null
+++ b/include/hashed_db.h
@@ -0,0 +1,72 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 2006-2014,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                        2006                    *
+ ****************************************************************************/
+
+/*
+ * $Id: hashed_db.h,v 1.9 2020/02/02 23:34:34 tom Exp $
+ */
+
+#ifndef HASHED_DB_H
+#define HASHED_DB_H 1
+
+#include <ncurses_cfg.h>
+
+#include <curses.h>
+
+#if USE_HASHED_DB
+
+#define DB_DBM_HSEARCH 0	/* quiet gcc -Wundef with db6 */
+
+#include <db.h>
+
+#ifndef DBM_SUFFIX
+#define DBM_SUFFIX ".db"
+#endif
+
+#ifdef DB_VERSION_MAJOR
+#define HASHED_DB_API DB_VERSION_MAJOR
+#else
+#define HASHED_DB_API 1		/* e.g., db 1.8.5 */
+#endif
+
+extern NCURSES_EXPORT(DB *) _nc_db_open(const char * /* path */, bool /* modify */);
+extern NCURSES_EXPORT(bool) _nc_db_have_data(DBT * /* key */, DBT * /* data */, char ** /* buffer */, int * /* size */);
+extern NCURSES_EXPORT(bool) _nc_db_have_index(DBT * /* key */, DBT * /* data */, char ** /* buffer */, int * /* size */);
+extern NCURSES_EXPORT(int) _nc_db_close(DB * /* db */);
+extern NCURSES_EXPORT(int) _nc_db_first(DB * /* db */, DBT * /* key */, DBT * /* data */);
+extern NCURSES_EXPORT(int) _nc_db_next(DB * /* db */, DBT * /* key */, DBT * /* data */);
+extern NCURSES_EXPORT(int) _nc_db_get(DB * /* db */, DBT * /* key */, DBT * /* data */);
+extern NCURSES_EXPORT(int) _nc_db_put(DB * /* db */, DBT * /* key */, DBT * /* data */);
+
+#endif
+
+#endif /* HASHED_DB_H */
diff --git a/include/headers b/include/headers
new file mode 100644
index 0000000..32e33fd
--- /dev/null
+++ b/include/headers
@@ -0,0 +1,55 @@
+# $Id: headers,v 1.15 2020/08/29 18:51:13 tom Exp $
+##############################################################################
+# Copyright 2020 Thomas E. Dickey                                            #
+# Copyright 1998-2012,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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey	1996-on
+#
+curses.h
+unctrl.h
+ncurses_dll.h
+
+# Support for termcap (and tic, etc.), which can be a separate library
+@ termlib
+term.h
+termcap.h
+
+# Headers used only for tic, other programs using internal interfaces
+@ ticlib
+$(srcdir)/tic.h
+$(srcdir)/term_entry.h
+$(srcdir)/nc_tparm.h
+
+# Porting
+@ port_win32con
+$(srcdir)/ncurses_mingw.h
+$(srcdir)/nc_mingw.h
+@ port_win32
+$(srcdir)/win32_curses.h
+
+# vile:makemode
diff --git a/include/nc_access.h b/include/nc_access.h
new file mode 100644
index 0000000..2e893aa
--- /dev/null
+++ b/include/nc_access.h
@@ -0,0 +1,80 @@
+/****************************************************************************
+ * Copyright 2021 Thomas E. Dickey                                          *
+ *                                                                          *
+ * 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: nc_access.h,v 1.2 2021/07/10 22:07:06 tom Exp $ */
+
+#ifndef NC_ACCESS_included
+#define NC_ACCESS_included 1
+/* *INDENT-OFF* */
+
+#include <ncurses_cfg.h>
+#include <curses.h>
+#include <sys/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Turn off this symbol to limit access to environment variables when root.
+ */
+#ifdef USE_ROOT_ENVIRON
+
+#define use_terminfo_vars() 1
+
+#else
+
+#define use_terminfo_vars() _nc_env_access()
+extern NCURSES_EXPORT(int) _nc_env_access (void);
+
+#endif
+
+/*
+ * Turn off this symbol to limit access to files when running setuid.
+ */
+#ifdef USE_ROOT_ACCESS
+
+#define safe_fopen(name,mode) fopen(name,mode)
+#define safe_open3(name,flags,mode) open(name,flags,mode)
+
+#else
+
+#define safe_fopen(name,mode) fopen(name,mode)
+#define safe_open3(name,flags,mode) open(name,flags,mode)
+extern NCURSES_EXPORT(FILE *) _nc_safe_fopen (const char *, const char *);
+extern NCURSES_EXPORT(int) _nc_safe_open3 (const char *, int, mode_t);
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+/* *INDENT-ON* */
+
+#endif /* NC_ACCESS_included */
diff --git a/include/nc_alloc.h b/include/nc_alloc.h
new file mode 100644
index 0000000..cfea2be
--- /dev/null
+++ b/include/nc_alloc.h
@@ -0,0 +1,127 @@
+/****************************************************************************
+ * Copyright 2019-2020,2021 Thomas E. Dickey                                *
+ * Copyright 1998-2013,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                    1996-on                     *
+ ****************************************************************************/
+/* $Id: nc_alloc.h,v 1.30 2021/11/20 23:33:38 tom Exp $ */
+
+#ifndef NC_ALLOC_included
+#define NC_ALLOC_included 1
+/* *INDENT-OFF* */
+
+#include <ncurses_cfg.h>
+#include <curses.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if defined(HAVE_LIBDMALLOC) && HAVE_LIBDMALLOC
+#include <string.h>
+#undef strndup		/* workaround for #define in GLIBC 2.7 */
+#include <dmalloc.h>    /* Gray Watson's library */
+#else
+#undef  HAVE_LIBDMALLOC
+#define HAVE_LIBDMALLOC 0
+#endif
+
+#if defined(HAVE_LIBDBMALLOC) && HAVE_LIBDBMALLOC
+#include <dbmalloc.h>   /* Conor Cahill's library */
+#else
+#undef  HAVE_LIBDBMALLOC
+#define HAVE_LIBDBMALLOC 0
+#endif
+
+#if defined(HAVE_LIBMPATROL) && HAVE_LIBMPATROL
+#include <mpatrol.h>    /* Memory-Patrol library */
+#else
+#undef  HAVE_LIBMPATROL
+#define HAVE_LIBMPATROL 0
+#endif
+
+#ifndef NO_LEAKS
+#define NO_LEAKS 0
+#endif
+
+#if HAVE_LIBDBMALLOC || HAVE_LIBDMALLOC || NO_LEAKS
+#define HAVE_NC_FREEALL 1
+struct termtype;
+extern GCC_NORETURN  NCURSES_EXPORT(void) _nc_free_tinfo(int) GCC_DEPRECATED("use exit_terminfo");
+
+#ifdef NCURSES_INTERNALS
+extern GCC_NORETURN NCURSES_EXPORT(void) _nc_free_tic(int);
+extern void _nc_leaks_dump_entry(void);
+extern NCURSES_EXPORT(void) _nc_leaks_tic(void);
+
+#if NCURSES_SP_FUNCS
+extern GCC_NORETURN NCURSES_EXPORT(void) NCURSES_SP_NAME(_nc_free_and_exit)(SCREEN*, int);
+#endif
+extern GCC_NORETURN NCURSES_EXPORT(void) _nc_free_and_exit(int);
+
+#else /* !NCURSES_INTERNALS */
+extern GCC_NORETURN NCURSES_EXPORT(void) _nc_free_and_exit(int) GCC_DEPRECATED("use exit_curses");
+#endif
+
+#define ExitProgram(code) exit_curses(code)
+
+#else
+extern GCC_NORETURN NCURSES_EXPORT(void) _nc_free_and_exit(int) GCC_DEPRECATED("use exit_curses");
+#endif /* NO_LEAKS, etc */
+
+#ifndef HAVE_NC_FREEALL
+#define HAVE_NC_FREEALL 0
+#endif
+
+#ifndef ExitProgram
+#define ExitProgram(code) exit(code)
+#endif
+
+/* doalloc.c */
+extern NCURSES_EXPORT(void *) _nc_doalloc(void *, size_t);
+#if !HAVE_STRDUP
+#undef strdup
+#define strdup _nc_strdup
+extern NCURSES_EXPORT(char *) _nc_strdup(const char *);
+#endif
+
+/* entries.c */
+extern NCURSES_EXPORT(void) _nc_leaks_tinfo(void);
+
+#define typeMalloc(type,elts) (type *)malloc((size_t)(elts)*sizeof(type))
+#define typeCalloc(type,elts) (type *)calloc((size_t)(elts),sizeof(type))
+#define typeRealloc(type,elts,ptr) (type *)_nc_doalloc(ptr, (size_t)(elts)*sizeof(type))
+
+#ifdef __cplusplus
+}
+#endif
+
+/* *INDENT-ON* */
+
+#endif /* NC_ALLOC_included */
diff --git a/include/nc_mingw.h b/include/nc_mingw.h
new file mode 100644
index 0000000..6729b29
--- /dev/null
+++ b/include/nc_mingw.h
@@ -0,0 +1,89 @@
+/****************************************************************************
+ * Copyright 2018-2019,2020 Thomas E. Dickey                                *
+ * Copyright 2008-2010,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Author: Thomas Dickey, 2008-on                                           *
+ ****************************************************************************/
+
+/* $Id: nc_mingw.h,v 1.9 2020/07/11 22:13:19 tom Exp $ */
+
+#ifndef NC_MINGW_H
+#define NC_MINGW_H 1
+
+#ifdef _WIN32
+
+#ifdef WINVER
+#  if WINVER < 0x0501
+#    error WINVER must at least be 0x0501
+#  endif
+#else
+#  define WINVER 0x0501
+#endif
+#include <windows.h>
+
+#undef sleep
+#define sleep(n) Sleep((n) * 1000)
+
+#undef gettimeofday
+#define gettimeofday(tv,tz) _nc_gettimeofday(tv,tz)
+
+#if HAVE_SYS_TIME_H
+#include <sys/time.h>		/* for struct timeval */
+#endif
+
+#ifdef _MSC_VER
+#include <winsock2.h>		/* for struct timeval */
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <ncurses_dll.h>
+
+NCURSES_EXPORT(int) _nc_gettimeofday(struct timeval *, void *);
+
+#undef HAVE_GETTIMEOFDAY
+#define HAVE_GETTIMEOFDAY 1
+
+#define SIGHUP  1
+#define SIGKILL 9
+#define getlogin() "username"
+
+#undef wcwidth
+#define wcwidth(ucs) _nc_wcwidth((wchar_t)(ucs))
+NCURSES_EXPORT(int) _nc_wcwidth(wchar_t);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _WIN32 */
+
+#endif /* NC_MINGW_H */
diff --git a/include/nc_panel.h b/include/nc_panel.h
new file mode 100644
index 0000000..60eb811
--- /dev/null
+++ b/include/nc_panel.h
@@ -0,0 +1,80 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2009,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Juergen Pfeifer                        1997                     *
+ *     and: Thomas E. Dickey                                                *
+ ****************************************************************************/
+
+/*
+ * $Id: nc_panel.h,v 1.10 2020/02/02 23:34:34 tom Exp $
+ *
+ *	nc_panel.h
+ *
+ *	Headerfile to provide an interface for the panel layer into
+ *      the SCREEN structure of the ncurses core.
+ */
+
+#ifndef NC_PANEL_H
+#define NC_PANEL_H 1
+
+#include <ncurses_cfg.h>
+#include <curses.h>
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+  struct panel;			/* Forward Declaration */
+
+  struct panelhook
+    {
+      struct panel *top_panel;
+      struct panel *bottom_panel;
+      struct panel *stdscr_pseudo_panel;
+#if NO_LEAKS
+      int (*destroy) (struct panel *);
+#endif
+    };
+
+  struct screen;		/* Forward declaration */
+/* Retrieve the panelhook of the specified screen */
+  extern NCURSES_EXPORT(struct panelhook *)
+    _nc_panelhook (void);
+#if NCURSES_SP_FUNCS
+  extern NCURSES_EXPORT(struct panelhook *)
+    NCURSES_SP_NAME(_nc_panelhook) (SCREEN *);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif				/* NC_PANEL_H */
diff --git a/include/nc_string.h b/include/nc_string.h
new file mode 100644
index 0000000..546aa06
--- /dev/null
+++ b/include/nc_string.h
@@ -0,0 +1,90 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 2012-2013,2016 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                        2012                    *
+ ****************************************************************************/
+
+#ifndef STRING_HACKS_H
+#define STRING_HACKS_H 1
+
+#include <ncurses_cfg.h>
+
+#if HAVE_BSD_STRING_H
+#include <bsd/string.h>
+#endif
+
+/*
+ * $Id: nc_string.h,v 1.9 2021/04/25 00:10:43 tom Exp $
+ *
+ * String-hacks.  Use these macros to stifle warnings on (presumably) correct
+ * uses of strcat, strcpy and sprintf.
+ *
+ * By the way -
+ * A fundamental limitation of the interfaces (and frequent issue in bug
+ * reports using these functions) is that sizes are passed as unsigned values
+ * (with associated sign-extension problems), limiting their effectiveness
+ * when checking for buffer overflow.
+ */
+
+#ifdef __cplusplus
+#define NCURSES_VOID		/* nothing */
+#else
+#define NCURSES_VOID (void)
+#endif
+
+#if USE_STRING_HACKS && HAVE_STRLCAT
+#define _nc_STRCAT(d,s,n)	NCURSES_VOID strlcat((d),(s),NCURSES_CAST(size_t,n))
+#define _nc_STRNCAT(d,s,m,n)	NCURSES_VOID strlcat((d),(s),NCURSES_CAST(size_t,m))
+#else
+#define _nc_STRCAT(d,s,n)	NCURSES_VOID strcat((d),(s))
+#define _nc_STRNCAT(d,s,m,n)	NCURSES_VOID strncat((d),(s),(n))
+#endif
+
+#if USE_STRING_HACKS && HAVE_STRLCPY
+#define _nc_STRCPY(d,s,n)	NCURSES_VOID strlcpy((d),(s),NCURSES_CAST(size_t,n))
+#define _nc_STRNCPY(d,s,n)	NCURSES_VOID strlcpy((d),(s),NCURSES_CAST(size_t,n))
+#else
+#define _nc_STRCPY(d,s,n)	NCURSES_VOID strcpy((d),(s))
+#define _nc_STRNCPY(d,s,n)	NCURSES_VOID strncpy((d),(s),(n))
+#endif
+
+#if USE_STRING_HACKS && HAVE_SNPRINTF
+#ifdef __cplusplus
+#define _nc_SPRINTF             NCURSES_VOID snprintf
+#else
+#define _nc_SPRINTF             NCURSES_VOID (snprintf)
+#endif
+#define _nc_SLIMIT(n)           NCURSES_CAST(size_t,n),
+#else
+#define _nc_SPRINTF             NCURSES_VOID sprintf
+#define _nc_SLIMIT(n)		/* nothing */
+#endif
+
+#endif /* STRING_HACKS_H */
diff --git a/include/nc_termios.h b/include/nc_termios.h
new file mode 100644
index 0000000..13cc0af
--- /dev/null
+++ b/include/nc_termios.h
@@ -0,0 +1,168 @@
+/****************************************************************************
+ * Copyright 2018,2020 Thomas E. Dickey                                     *
+ * Copyright 2011-2014,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                        2011                    *
+ ****************************************************************************/
+
+/* $Id: nc_termios.h,v 1.8 2020/08/29 20:53:19 tom Exp $ */
+
+#ifndef NC_TERMIOS_included
+#define NC_TERMIOS_included 1
+
+#include <ncurses_cfg.h>
+
+#if HAVE_TERMIOS_H && HAVE_TCGETATTR
+
+#else /* !HAVE_TERMIOS_H */
+
+#if HAVE_TERMIO_H
+
+/* Add definitions to make termio look like termios.
+ * But ifdef it, since there are some implementations
+ * that try to do this for us in a fake <termio.h>.
+ */
+#ifndef TCSADRAIN
+#define TCSADRAIN TCSETAW
+#endif
+#ifndef TCSAFLUSH
+#define TCSAFLUSH TCSETAF
+#endif
+#ifndef tcsetattr
+#define tcsetattr(fd, cmd, arg) ioctl(fd, cmd, arg)
+#endif
+#ifndef tcgetattr
+#define tcgetattr(fd, arg) ioctl(fd, TCGETA, arg)
+#endif
+#ifndef cfgetospeed
+#define cfgetospeed(t) ((t)->c_cflag & CBAUD)
+#endif
+#ifndef TCIFLUSH
+#define TCIFLUSH 0
+#endif
+#ifndef tcflush
+#define tcflush(fd, arg) ioctl(fd, TCFLSH, arg)
+#endif
+
+#if defined(EXP_WIN32_DRIVER)
+#undef TERMIOS
+#endif
+
+#else /* !HAVE_TERMIO_H */
+
+#if defined(_WIN32) && !defined(EXP_WIN32_DRIVER)
+
+/* lflag bits */
+#define ISIG	0x0001
+#define ICANON	0x0002
+#define ECHO	0x0004
+#define ECHOE	0x0008
+#define ECHOK	0x0010
+#define ECHONL	0x0020
+#define NOFLSH	0x0040
+#define IEXTEN	0x0100
+
+#define VEOF	     4
+#define VERASE	     5
+#define VINTR	     6
+#define VKILL	     7
+#define VMIN	     9
+#define VQUIT	    10
+#define VTIME	    16
+
+/* iflag bits */
+#define IGNBRK	0x00001
+#define BRKINT	0x00002
+#define IGNPAR	0x00004
+#define INPCK	0x00010
+#define ISTRIP	0x00020
+#define INLCR	0x00040
+#define IGNCR	0x00080
+#define ICRNL	0x00100
+#define IXON	0x00400
+#define IXOFF	0x01000
+#define PARMRK	0x10000
+
+/* oflag bits */
+#define OPOST	0x00001
+
+/* cflag bits */
+#define CBAUD	 0x0100f
+#define B0	 0x00000
+#define B50	 0x00001
+#define B75	 0x00002
+#define B110	 0x00003
+#define B134	 0x00004
+#define B150	 0x00005
+#define B200	 0x00006
+#define B300	 0x00007
+#define B600	 0x00008
+#define B1200	 0x00009
+#define B1800	 0x0000a
+#define B2400	 0x0000b
+#define B4800	 0x0000c
+#define B9600	 0x0000d
+
+#define CSIZE	 0x00030
+#define CS8	 0x00030
+#define CSTOPB	 0x00040
+#define CREAD	 0x00080
+#define PARENB	 0x00100
+#define PARODD	 0x00200
+#define HUPCL	 0x00400
+#define CLOCAL	 0x00800
+
+#define TCIFLUSH	0
+#define TCSADRAIN	3
+
+#ifndef cfgetospeed
+#define cfgetospeed(t) ((t)->c_cflag & CBAUD)
+#endif
+
+#ifndef tcsetattr
+#define tcsetattr(fd, opt, arg) _nc_mingw_tcsetattr(fd, opt, arg)
+#endif
+
+#ifndef tcgetattr
+#define tcgetattr(fd, arg) _nc_mingw_tcgetattr(fd, arg)
+#endif
+
+#ifndef tcflush
+#define tcflush(fd, queue) _nc_mingw_tcflush(fd, queue)
+#endif
+
+#undef  ttyname
+#define ttyname(fd) NULL
+
+#endif /* _WIN32 */
+#endif /* HAVE_TERMIO_H */
+
+#endif /* HAVE_TERMIOS_H */
+
+#endif /* NC_TERMIOS_included */
diff --git a/include/nc_tparm.h b/include/nc_tparm.h
new file mode 100644
index 0000000..943d947
--- /dev/null
+++ b/include/nc_tparm.h
@@ -0,0 +1,92 @@
+/****************************************************************************
+ * Copyright 2018,2020 Thomas E. Dickey                                     *
+ * Copyright 2006-2012,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                        2006                    *
+ ****************************************************************************/
+
+/* $Id: nc_tparm.h,v 1.11 2020/05/27 23:33:31 tom Exp $ */
+
+#ifndef NC_TPARM_included
+#define NC_TPARM_included 1
+
+#include <ncurses_cfg.h>
+#include <curses.h>
+
+/*
+ * Cast parameters past the formatting-string for tparm() to match the
+ * assumption of the varargs code.
+ */
+#ifndef TPARM_ARG
+#ifdef NCURSES_TPARM_ARG
+#define TPARM_ARG NCURSES_TPARM_ARG
+#else
+#define TPARM_ARG long
+#endif
+#endif /* TPARAM_ARG */
+
+#define TPARM_N(n) (TPARM_ARG)(n)
+
+#define TPARM_9(a,b,c,d,e,f,g,h,i,j) tparm(a,TPARM_N(b),TPARM_N(c),TPARM_N(d),TPARM_N(e),TPARM_N(f),TPARM_N(g),TPARM_N(h),TPARM_N(i),TPARM_N(j))
+
+#if NCURSES_TPARM_VARARGS
+#define TPARM_8(a,b,c,d,e,f,g,h,i) tparm(a,TPARM_N(b),TPARM_N(c),TPARM_N(d),TPARM_N(e),TPARM_N(f),TPARM_N(g),TPARM_N(h),TPARM_N(i))
+#define TPARM_7(a,b,c,d,e,f,g,h) tparm(a,TPARM_N(b),TPARM_N(c),TPARM_N(d),TPARM_N(e),TPARM_N(f),TPARM_N(g),TPARM_N(h))
+#define TPARM_6(a,b,c,d,e,f,g) tparm(a,TPARM_N(b),TPARM_N(c),TPARM_N(d),TPARM_N(e),TPARM_N(f),TPARM_N(g))
+#define TPARM_5(a,b,c,d,e,f) tparm(a,TPARM_N(b),TPARM_N(c),TPARM_N(d),TPARM_N(e),TPARM_N(f))
+#define TPARM_4(a,b,c,d,e) tparm(a,TPARM_N(b),TPARM_N(c),TPARM_N(d),TPARM_N(e))
+#define TPARM_3(a,b,c,d) tparm(a,TPARM_N(b),TPARM_N(c),TPARM_N(d))
+#define TPARM_2(a,b,c) tparm(a,TPARM_N(b),TPARM_N(c))
+#define TPARM_1(a,b) tparm(a,TPARM_N(b))
+#define TPARM_0(a) tparm(a)
+#else
+#define TPARM_8(a,b,c,d,e,f,g,h,i) TPARM_9(a,b,c,d,e,f,g,h,i,0)
+#define TPARM_7(a,b,c,d,e,f,g,h) TPARM_8(a,b,c,d,e,f,g,h,0)
+#define TPARM_6(a,b,c,d,e,f,g) TPARM_7(a,b,c,d,e,f,g,0)
+#define TPARM_5(a,b,c,d,e,f) TPARM_6(a,b,c,d,e,f,0)
+#define TPARM_4(a,b,c,d,e) TPARM_5(a,b,c,d,e,0)
+#define TPARM_3(a,b,c,d) TPARM_4(a,b,c,d,0)
+#define TPARM_2(a,b,c) TPARM_3(a,b,c,0)
+#define TPARM_1(a,b) TPARM_2(a,b,0)
+#define TPARM_0(a) TPARM_1(a,0)
+#endif
+
+#ifdef NCURSES_INTERNALS
+#define TIPARM_1(s,a) _nc_tiparm(1,s,a)
+#define TIPARM_2(s,a,b) _nc_tiparm(2,s,a,b)
+#define TIPARM_3(s,a,b,c) _nc_tiparm(3,s,a,b,c)
+#define TIPARM_4(s,a,b,c,d) _nc_tiparm(4,s,a,b,c,d)
+#define TIPARM_5(s,a,b,c,d,e) _nc_tiparm(5,s,a,b,c,d,e)
+#define TIPARM_6(s,a,b,c,d,e,f) _nc_tiparm(6,s,a,b,c,d,e,f)
+#define TIPARM_7(s,a,b,c,d,e,f,g) _nc_tiparm(7,s,a,b,c,d,e,f,g)
+#define TIPARM_8(s,a,b,c,d,e,f,g,h) _nc_tiparm(8,s,a,b,c,d,e,f,g,h)
+#define TIPARM_9(s,a,b,c,d,e,f,g,h,i) _nc_tiparm(9,s,a,b,c,d,e,f,g,h,i)
+#endif
+
+#endif /* NC_TPARM_included */
diff --git a/include/nc_win32.h b/include/nc_win32.h
new file mode 100644
index 0000000..790e8df
--- /dev/null
+++ b/include/nc_win32.h
@@ -0,0 +1,183 @@
+/****************************************************************************
+ * Copyright 2018-2019,2020 Thomas E. Dickey                                *
+ * Copyright 2008-2010,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Author: Thomas Dickey, 2008-on                                           *
+ ****************************************************************************/
+
+/* $Id: nc_win32.h,v 1.9 2020/09/13 00:17:30 tom Exp $ */
+
+#ifndef NC_WIN32_H
+#define NC_WIN32_H 1
+
+#if defined(_WIN32) || defined(_WIN64)
+
+#ifndef _NC_WINDOWS
+#define _NC_WINDOWS
+#endif
+
+#ifdef TERMIOS
+#error TERMIOS must not be defined on Windows
+#endif
+
+/* We no longer support WindowsXP.
+   Minimum requirement is Windows Vista or Server2008,
+   aka Windows NT 6.0
+*/
+#ifdef WINVER
+#  if WINVER < 0x0600
+#    error WINVER must at least be 0x0600
+#  endif
+#else
+#  define WINVER 0x0600
+#endif
+
+#undef _NC_CHECK_MINTTY
+#if WINVER >= 0x0600
+#define _NC_CHECK_MINTTY
+#endif
+
+#include <windows.h>
+
+#if HAVE_SYS_TIME_H
+#include <sys/time.h>		/* for struct timeval */
+#endif
+
+#ifdef _NC_MSC
+#include <winsock2.h>		/* for struct timeval */
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <ncurses_dll.h>
+
+#undef HAVE_GETTIMEOFDAY
+#define HAVE_GETTIMEOFDAY 1
+extern NCURSES_EXPORT(int) _nc_gettimeofday(struct timeval *, void *);
+
+#undef wcwidth
+#define wcwidth(ucs)  _nc_wcwidth((wchar_t)(ucs))
+extern NCURSES_EXPORT(int)    _nc_wcwidth(wchar_t);
+
+#ifdef EVENTLIST_2nd /* test.priv.h just needs the preceding */
+
+extern NCURSES_EXPORT(void)   _nc_console_size(int* Lines, int* Cols);
+extern NCURSES_EXPORT(HANDLE) _nc_console_handle(int fd);
+extern NCURSES_EXPORT(int)    _nc_console_isatty(int fd);
+extern NCURSES_EXPORT(int)    _nc_console_test(int fd);
+extern NCURSES_EXPORT(int)    _nc_console_read(SCREEN *sp,HANDLE hdl,int *buf);
+extern NCURSES_EXPORT(int)    _nc_console_twait(SCREEN *, HANDLE,int,int,int * EVENTLIST_2nd(_nc_eventlist * evl));
+extern NCURSES_EXPORT(WORD)   _nc_console_MapColor(bool fore, int color);
+extern NCURSES_EXPORT(void)   _nc_console_selectActiveHandle(void);
+extern NCURSES_EXPORT(bool)   _nc_console_get_SBI(void);
+extern NCURSES_EXPORT(void)   _nc_console_set_scrollback(bool normal, CONSOLE_SCREEN_BUFFER_INFO * info);
+extern NCURSES_EXPORT(int)    _nc_console_testmouse(SCREEN *,HANDLE,int EVENTLIST_2nd(_nc_eventlist*));
+extern NCURSES_EXPORT(int)    _nc_console_keyok(int keycode,int flag);
+extern NCURSES_EXPORT(bool)   _nc_console_keyExist(int keycode);
+extern NCURSES_EXPORT(bool)   _nc_console_checkinit(bool initFlag, bool assumeTermInfo);
+extern NCURSES_EXPORT(int)    _nc_console_vt_supported(void);
+
+#ifdef _NC_CHECK_MINTTY
+extern NCURSES_EXPORT(int)    _nc_console_checkmintty(int fd, LPHANDLE pMinTTY);
+#endif
+
+#undef VALID_TERM_ENV
+#define MS_TERMINAL "ms-terminal"
+#define VALID_TERM_ENV(term_env, no_terminal) \
+	(term_env = (NonEmpty(term_env) \
+		      ? term_env \
+		      : (_nc_console_vt_supported() \
+		         ? MS_TERMINAL \
+		         : no_terminal)), \
+	 NonEmpty(term_env))
+
+  /*
+   * Various Console mode definitions
+   */
+
+  /* Flags to enable virtual Terminal processing */
+#define VT_FLAG_OUT ENABLE_VIRTUAL_TERMINAL_PROCESSING
+#define VT_FLAG_IN  ENABLE_VIRTUAL_TERMINAL_INPUT
+
+  /* Default flags for input/output modes */
+#define CONMODE_IN_DEFAULT (ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT | ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT)
+#define CONMODE_OUT_DEFAULT (ENABLE_PROCESSED_OUTPUT | DISABLE_NEWLINE_AUTO_RETURN | ENABLE_LVB_GRID_WORLDWIDE)
+
+  /* Flags to reset from RAW/CBREAK */
+#define CONMODE_NORAW    (ENABLE_PROCESSED_INPUT|ENABLE_LINE_INPUT)
+#define CONMODE_NOCBREAK (ENABLE_LINE_INPUT)
+
+
+#if defined(USE_TERM_DRIVER) && defined(USE_WIN32CON_DRIVER)
+extern NCURSES_EXPORT_VAR(TERM_DRIVER) _nc_WIN_DRIVER;
+#endif
+
+#define CON_NUMPAIRS 64
+typedef struct {
+    BOOL initialized;
+    BOOL buffered;
+    BOOL window_only;
+    BOOL progMode;
+    BOOL isMinTTY;
+    BOOL isTermInfoConsole;
+    HANDLE out;
+    HANDLE inp;
+    HANDLE hdl;
+    HANDLE lastOut;
+    int numButtons;
+    LPDWORD ansi_map;
+    LPDWORD map;
+    LPDWORD rmap;
+    WORD pairs[CON_NUMPAIRS];
+    COORD origin;
+    CHAR_INFO *save_screen;
+    COORD save_size;
+    SMALL_RECT save_region;
+    CONSOLE_SCREEN_BUFFER_INFO SBI;
+    CONSOLE_SCREEN_BUFFER_INFO save_SBI;
+    CONSOLE_CURSOR_INFO save_CI;
+    TTY originalMode;
+} ConsoleInfo;
+
+extern NCURSES_EXPORT_VAR(ConsoleInfo) _nc_CONSOLE;
+#define WINCONSOLE _nc_CONSOLE
+
+#define TypeAlloca(type,count)(type*) _alloca(sizeof(type)*(size_t)(count))
+
+#endif /* EVENTLIST_2nd */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _WIN32 || _WIN64 */
+
+#endif /* NC_WIN32_H */
diff --git a/include/ncurses_cfg.hin b/include/ncurses_cfg.hin
new file mode 100644
index 0000000..8d9ed81
--- /dev/null
+++ b/include/ncurses_cfg.hin
@@ -0,0 +1,74 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey      1997-on                                   *
+ ****************************************************************************/
+/*
+ * $Id: ncurses_cfg.hin,v 1.13 2020/03/08 12:37:59 tom Exp $
+ *
+ * Both ncurses_cfg.h and ncurses_def.h are internal header-files used when
+ * building ncurses.
+ *
+ * This is a template-file used to generate the "ncurses_cfg.h" file.
+ *
+ * Rather than list every definition, the configuration script substitutes the
+ * definitions that it finds using 'sed'.  You need a patch (original date
+ * 971222) to autoconf 2.12 or 2.13 to do this.
+ *
+ * See:
+ *	https://invisible-island.net/autoconf/
+ *	ftp://ftp.invisible-island.net/autoconf/
+ */
+#ifndef NC_CONFIG_H
+#define NC_CONFIG_H
+@DEFS@
+
+#include <ncurses_def.h>
+
+	/* The C compiler may not treat these properly but C++ has to */
+#ifdef __cplusplus
+#undef const
+#undef inline
+#endif
+
+	/* On HP-UX, the C compiler doesn't grok mbstate_t without
+	   -D_XOPEN_SOURCE=500. However, this causes problems on
+	   IRIX. So, we #define mbstate_t to int in configure.in
+	   only for the C compiler if needed. */
+#ifndef __cplusplus
+#ifdef NEED_MBSTATE_T_DEF
+#define mbstate_t int
+#endif
+#endif
+
+/*
+ * vile:cmode
+ */
+#endif /* NC_CONFIG_H */
diff --git a/include/ncurses_defs b/include/ncurses_defs
new file mode 100644
index 0000000..16e7301
--- /dev/null
+++ b/include/ncurses_defs
@@ -0,0 +1,269 @@
+# $Id: ncurses_defs,v 1.102 2022/08/20 16:36:11 tom Exp $
+##############################################################################
+# Copyright 2018-2021,2022 Thomas E. Dickey                                  #
+# Copyright 2000-2016,2017 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.                                                             #
+##############################################################################
+#
+# See "MKncurses_def.sh" for an explanation.
+#
+# (hint: don't try to define NDEBUG ;-)
+
+BROKEN_LINKER
+BSD_TPUTS
+CGETENT_CONST	/* nothing */
+CPP_HAS_PARAM_INIT
+CURSES_ACS_ARRAY	acs_map
+CURSES_WACS_ARRAY	_nc_wacs
+DECL_ERRNO
+ETIP_NEEDS_MATH_H
+GCC_NORETURN	/* nothing */
+GCC_UNUSED	/* nothing */
+HAVE_ALLOC_PAIR
+HAVE_ASSUME_DEFAULT_COLORS
+HAVE_BIG_CORE
+HAVE_BSD_CGETENT
+HAVE_BSD_SIGNAL_H
+HAVE_BSD_STRING_H
+HAVE_BTOWC
+HAVE_BUILTIN_H
+HAVE_CHGAT	1
+HAVE_COLOR_CONTENT	1
+HAVE_COLOR_SET	1
+HAVE_CONSISTENT_GETENV
+HAVE_COPYWIN	1
+HAVE_CURSCR	1
+HAVE_CURSES_DATA_TABSIZE	1
+HAVE_CURSES_DATA_TTYTYPE	1
+HAVE_CURSES_TRACE	1
+HAVE_DELSCREEN	1
+HAVE_DERWIN	1
+HAVE_DIRENT_H
+HAVE_DUPWIN	1
+HAVE_ERRNO
+HAVE_EXIT_CURSES	1
+HAVE_EXIT_TERMINFO	1
+HAVE_FCNTL_H
+HAVE_FILTER	1
+HAVE_FORM_H
+HAVE_FPATHCONF
+HAVE_GETBEGX	1
+HAVE_GETCURX	1
+HAVE_GETCWD
+HAVE_GETEGID
+HAVE_GETEUID
+HAVE_GETMAXX	1
+HAVE_GETNSTR
+HAVE_GETOPT_H
+HAVE_GETPARX	1
+HAVE_GETTIMEOFDAY
+HAVE_GETTTYNAM
+HAVE_GETWIN	1
+HAVE_GPM_H
+HAVE_GPP_BUILTIN_H
+HAVE_GXX_BUILTIN_H
+HAVE_HALFDELAY	1
+HAVE_HAS_KEY
+HAVE_INIT_EXTENDED_COLOR
+HAVE_INTTYPES_H
+HAVE_IOSTREAM
+HAVE_ISASCII
+HAVE_ISSETUGID
+HAVE_LANGINFO_CODESET
+HAVE_LIBC_H
+HAVE_LIBDBMALLOC
+HAVE_LIBDMALLOC
+HAVE_LIBFORM
+HAVE_LIBGPM
+HAVE_LIBMENU
+HAVE_LIBMPATROL
+HAVE_LIBPANEL
+HAVE_LIB_PCRE2
+HAVE_LIMITS_H
+HAVE_LINK
+HAVE_LOCALECONV
+HAVE_LOCALE_H
+HAVE_LONG_FILE_NAMES
+HAVE_MATH_FUNCS
+HAVE_MATH_H
+HAVE_MBLEN
+HAVE_MBRLEN
+HAVE_MBRTOWC
+HAVE_MBSRTOWCS
+HAVE_MBSTOWCS
+HAVE_MBTOWC
+HAVE_MENU_H
+HAVE_MKSTEMP
+HAVE_MVDERWIN	1
+HAVE_MVVLINE	1
+HAVE_MVWIN	1
+HAVE_MVWVLINE	1
+HAVE_NANOSLEEP
+HAVE_NC_ALLOC_H
+HAVE_NEWPAD	1
+HAVE_PANEL_H
+HAVE_PATH_TTYS
+HAVE_PCRE2POSIX_H
+HAVE_PCREPOSIX_H
+HAVE_POLL
+HAVE_POLL_H
+HAVE_PURIFY
+HAVE_PUTENV
+HAVE_PUTWC
+HAVE_PUTWIN	1
+HAVE_REGEXPR_H_FUNCS
+HAVE_REGEXP_H_FUNCS
+HAVE_REGEX_H_FUNCS
+HAVE_REMOVE
+HAVE_RESET_COLOR_PAIRS
+HAVE_RESIZETERM
+HAVE_RESIZE_TERM
+HAVE_RESTARTTERM	1
+HAVE_RIPOFFLINE	1
+HAVE_SCR_DUMP 1
+HAVE_SELECT
+HAVE_SETBUF
+HAVE_SETBUFFER
+HAVE_SETFSUID
+HAVE_SETENV
+HAVE_SETUPTERM	1
+HAVE_SETVBUF
+HAVE_SGTTY_H
+HAVE_SIGACTION
+HAVE_SIGVEC
+HAVE_SIZECHANGE
+HAVE_SLK_COLOR
+HAVE_SLK_INIT	1
+HAVE_SNPRINTF
+HAVE_STDINT_H
+HAVE_STRDUP
+HAVE_STRLCAT
+HAVE_STRLCPY
+HAVE_STRSTR
+HAVE_SYMLINK
+HAVE_SYSCONF
+HAVE_SYS_BSDTYPES_H
+HAVE_SYS_IOCTL_H
+HAVE_SYS_PARAM_H
+HAVE_SYS_POLL_H
+HAVE_SYS_SELECT_H
+HAVE_SYS_TERMIO_H
+HAVE_SYS_TIMES_H
+HAVE_SYS_TIME_H
+HAVE_SYS_TIME_SELECT
+HAVE_TCGETATTR
+HAVE_TCGETPGRP
+HAVE_TELL
+HAVE_TERMATTRS	1
+HAVE_TERMCAP_H	1
+HAVE_TERMIOS_H
+HAVE_TERMIO_H
+HAVE_TERMNAME	1
+HAVE_TERM_ENTRY_H	1
+HAVE_TERM_H	1
+HAVE_TGETENT	1
+HAVE_TIGETNUM	1
+HAVE_TIGETSTR	1
+HAVE_TIMES
+HAVE_TPUTS_SP
+HAVE_TSEARCH
+HAVE_TYPEAHEAD	1
+HAVE_TYPEINFO
+HAVE_TYPE_ATTR_T
+HAVE_TYPE_SIGACTION
+HAVE_UNCTRL_H	1
+HAVE_UNGET_WCH	1
+HAVE_UNISTD_H
+HAVE_UNLINK
+HAVE_USE_DEFAULT_COLORS
+HAVE_USE_ENV	1
+HAVE_USE_EXTENDED_NAMES
+HAVE_USE_SCREEN
+HAVE_USE_WINDOW
+HAVE_VFSCANF
+HAVE_VIDPUTS	1
+HAVE_VID_PUTS	1
+HAVE_VSNPRINTF
+HAVE_VSSCANF
+HAVE_VW_PRINTW	1
+HAVE_WCHGAT	1
+HAVE_WCSRTOMBS
+HAVE_WCSTOMBS
+HAVE_WCTOB
+HAVE_WCTOMB
+HAVE_WCTYPE_H
+HAVE_WMEMCHR
+HAVE_WINSDELLN	1
+HAVE_WINSSTR	1
+HAVE_WORKING_POLL
+HAVE_WRESIZE
+HAVE_WSYNCDOWN	1
+HAVE__DOSCAN
+HAVE__TRACEF
+MIXEDCASE_FILENAMES
+NCURSES_CHAR_EQ
+NCURSES_EXPANDED
+NCURSES_EXT_COLORS
+NCURSES_EXT_FUNCS
+NCURSES_EXT_PUTWIN
+NCURSES_NO_PADDING
+NCURSES_OSPEED_COMPAT
+NCURSES_PATHSEP	':'
+NCURSES_WIDECHAR
+NEED_PTEM_H
+NO_LEAKS
+PURE_TERMINFO
+STDC_HEADERS
+SVR4_ACTION
+SVR4_TERMIO
+SYSTEM_NAME	"unknown"
+TERMINFO	"none"
+TERMPATH	"none"
+TIME_WITH_SYS_TIME
+TYPEOF_CHTYPE
+USE_COLORFGBG
+USE_FOPEN_BIN_R
+USE_GETCAP
+USE_GETCAP_CACHE
+USE_HARD_TABS
+USE_HASHED_DB
+USE_HASHMAP
+USE_HOME_TERMINFO
+USE_LINKS
+USE_MY_MEMMOVE
+USE_OK_BCOPY
+USE_PTHREADS_EINTR
+USE_RCS_IDS
+USE_REENTRANT
+USE_SAFE_SPRINTF
+USE_SCROLL_HINTS
+USE_SIGWINCH
+USE_STRING_HACKS
+USE_SYMLINKS
+USE_SYSMOUSE
+USE_WEAK_SYMBOLS
+USE_WIDEC_SUPPORT
+USE_XMC_SUPPORT
diff --git a/include/ncurses_dll.h.in b/include/ncurses_dll.h.in
new file mode 100644
index 0000000..437c54d
--- /dev/null
+++ b/include/ncurses_dll.h.in
@@ -0,0 +1,99 @@
+/****************************************************************************
+ * Copyright 2018,2020 Thomas E. Dickey                                     *
+ * Copyright 2009,2014 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: ncurses_dll.h.in,v 1.17 2020/09/05 17:58:47 juergen Exp $ */
+
+#ifndef NCURSES_DLL_H_incl
+#define NCURSES_DLL_H_incl 1
+
+/*
+ * MinGW gcc (unlike MSYS2 and Cygwin) should define _WIN32 and possibly _WIN64.
+ */
+#if defined(__MINGW64__)
+
+#ifndef _WIN64
+#define _WIN64 1
+#endif
+
+#elif defined(__MINGW32__)
+
+#ifndef _WIN32
+#define _WIN32 1
+#endif
+
+/* 2014-08-02 workaround for broken MinGW compiler.
+ * Oddly, only TRACE is mapped to trace - the other -D's are okay.
+ * suggest TDM as an alternative.
+ */
+#if (__GNUC__ == 4) && (__GNUC_MINOR__ == 8)
+
+#ifdef trace
+#undef trace
+#define TRACE
+#endif
+
+#endif	/* broken compiler */
+
+#endif	/* MingW */
+
+/*
+ * For reentrant code, we map the various global variables into SCREEN by
+ * using functions to access them.
+ */
+#define NCURSES_PUBLIC_VAR(name) @NCURSES_WRAP_PREFIX@##name
+
+#if defined(BUILDING_NCURSES)
+# define NCURSES_IMPEXP NCURSES_EXPORT_GENERAL_EXPORT
+#else
+# define NCURSES_IMPEXP NCURSES_EXPORT_GENERAL_IMPORT
+#endif
+
+#define NCURSES_WRAPPED_VAR(type,name) extern NCURSES_IMPEXP type NCURSES_PUBLIC_VAR(name)(void)
+
+#define NCURSES_EXPORT(type) NCURSES_IMPEXP type NCURSES_API
+#define NCURSES_EXPORT_VAR(type) NCURSES_IMPEXP type
+
+/*
+ * These symbols hide dllimport/dllexport, for compilers which care about it.
+ */
+#if defined(__CYGWIN__) || (defined(_WIN32) || defined(_WIN64))
+# if defined(NCURSES_STATIC)	/* "static" here only implies "not-a-DLL" */
+#   define NCURSES_EXPORT_GENERAL_IMPORT
+#   define NCURSES_EXPORT_GENERAL_EXPORT
+# else
+#   define NCURSES_EXPORT_GENERAL_IMPORT __declspec(dllimport)
+#   define NCURSES_EXPORT_GENERAL_EXPORT __declspec(dllexport)
+# endif
+# define NCURSES_API __cdecl
+#else
+# define NCURSES_EXPORT_GENERAL_IMPORT
+# define NCURSES_EXPORT_GENERAL_EXPORT
+# define NCURSES_API /* FIXME: __attribute__ ((cdecl)) is only available on x86 */
+#endif
+
+#endif /* NCURSES_DLL_H_incl */
diff --git a/include/ncurses_mingw.h b/include/ncurses_mingw.h
new file mode 100644
index 0000000..8b11272
--- /dev/null
+++ b/include/ncurses_mingw.h
@@ -0,0 +1,82 @@
+/****************************************************************************
+ * Copyright 2018-2020,2021 Thomas E. Dickey                                *
+ * Copyright 2008-2014,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Author: Juergen Pfeifer, 2008-on                                         *
+ ****************************************************************************/
+
+/* $Id: ncurses_mingw.h,v 1.7 2021/06/17 21:26:02 tom Exp $ */
+
+/*
+ * This is a placeholder up to now and describes what needs to be implemented
+ * to support I/O to external terminals with ncurses on the Windows OS.
+ */
+
+#ifdef _WIN32
+#ifndef _NC_MINGWH
+#define _NC_MINGWH
+
+#define USE_CONSOLE_DRIVER 1
+
+#undef  TERMIOS
+#define TERMIOS 1
+
+typedef unsigned char cc_t;
+typedef unsigned int  tcflag_t;
+typedef unsigned int  speed_t;
+typedef unsigned short otcflag_t;
+typedef unsigned char ospeed_t;
+
+#define NCCS 18
+struct termios
+{
+  tcflag_t	c_iflag;
+  tcflag_t	c_oflag;
+  tcflag_t	c_cflag;
+  tcflag_t	c_lflag;
+  char		c_line;
+  cc_t		c_cc[NCCS];
+  speed_t	c_ispeed;
+  speed_t	c_ospeed;
+};
+
+extern NCURSES_EXPORT(int)  _nc_mingw_tcsetattr(
+    int fd,
+    int optional_actions,
+    const struct termios* arg);
+extern NCURSES_EXPORT(int)  _nc_mingw_tcgetattr(
+    int fd,
+    struct termios* arg);
+extern NCURSES_EXPORT(int)  _nc_mingw_tcflush(
+    int fd,
+    int queue);
+extern NCURSES_EXPORT(void) _nc_set_term_driver(void* term);
+
+#endif /* _NC_MINGWH */
+#endif /* _WIN32 */
diff --git a/include/term_entry.h b/include/term_entry.h
new file mode 100644
index 0000000..7425a76
--- /dev/null
+++ b/include/term_entry.h
@@ -0,0 +1,239 @@
+/****************************************************************************
+ * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2015,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1998-on                 *
+ ****************************************************************************/
+
+/* $Id: term_entry.h,v 1.63 2022/09/24 15:04:59 tom Exp $ */
+
+/*
+ *	term_entry.h -- interface to entry-manipulation code
+ */
+
+#ifndef NCURSES_TERM_ENTRY_H_incl
+#define NCURSES_TERM_ENTRY_H_incl 1
+/* *INDENT-OFF* */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <curses.h>
+#include <term.h>
+
+/*
+ * These macros may be used by programs that know about TERMTYPE:
+ */
+#if NCURSES_XNAMES
+#define NUM_BOOLEANS(tp) (tp)->num_Booleans
+#define NUM_NUMBERS(tp)  (tp)->num_Numbers
+#define NUM_STRINGS(tp)  (tp)->num_Strings
+#define EXT_NAMES(tp,i,limit,index,table) (i >= limit) ? tp->ext_Names[index] : table[i]
+#else
+#define NUM_BOOLEANS(tp) BOOLCOUNT
+#define NUM_NUMBERS(tp)  NUMCOUNT
+#define NUM_STRINGS(tp)  STRCOUNT
+#define EXT_NAMES(tp,i,limit,index,table) table[i]
+#endif
+
+#define NUM_EXT_NAMES(tp) (unsigned) ((tp)->ext_Booleans + (tp)->ext_Numbers + (tp)->ext_Strings)
+
+#define for_each_boolean(n,tp) for(n = 0; n < NUM_BOOLEANS(tp); n++)
+#define for_each_number(n,tp)  for(n = 0; n < NUM_NUMBERS(tp);  n++)
+#define for_each_string(n,tp)  for(n = 0; n < NUM_STRINGS(tp);  n++)
+
+#if NCURSES_XNAMES
+#define for_each_ext_boolean(n,tp) for(n = BOOLCOUNT; (int) n < (int) NUM_BOOLEANS(tp); n++)
+#define for_each_ext_number(n,tp)  for(n = NUMCOUNT; (int) n < (int) NUM_NUMBERS(tp);  n++)
+#define for_each_ext_string(n,tp)  for(n = STRCOUNT; (int) n < (int) NUM_STRINGS(tp);  n++)
+#endif
+
+#define ExtBoolname(tp,i,names) EXT_NAMES(tp, i, BOOLCOUNT, (i - (tp->num_Booleans - tp->ext_Booleans)), names)
+#define ExtNumname(tp,i,names)  EXT_NAMES(tp, i, NUMCOUNT, (i - (tp->num_Numbers - tp->ext_Numbers)) + tp->ext_Booleans, names)
+#define ExtStrname(tp,i,names)  EXT_NAMES(tp, i, STRCOUNT, (i - (tp->num_Strings - tp->ext_Strings)) + (tp->ext_Numbers + tp->ext_Booleans), names)
+
+/*
+ * The remaining type-definitions and macros are used only internally by the
+ * ncurses utilities.
+ */
+#ifdef NCURSES_INTERNALS
+
+/*
+ * see db_iterator.c - this enumeration lists the places searched for a
+ * terminal description and defines the order in which they are searched.
+ */
+typedef enum {
+	dbdTIC = 0,		/* special, used by tic when writing entry */
+#if NCURSES_USE_DATABASE
+	dbdEnvOnce,		/* the $TERMINFO environment variable */
+	dbdHome,		/* $HOME/.terminfo */
+	dbdEnvList,		/* the $TERMINFO_DIRS environment variable */
+	dbdCfgList,		/* the compiled-in TERMINFO_DIRS value */
+	dbdCfgOnce,		/* the compiled-in TERMINFO value */
+#endif
+#if NCURSES_USE_TERMCAP
+	dbdEnvOnce2,		/* the $TERMCAP environment variable */
+	dbdEnvList2,		/* the $TERMPATH environment variable */
+	dbdCfgList2,		/* the compiled-in TERMPATH */
+#endif
+	dbdLAST
+} DBDIRS;
+
+#define MAX_USES	32
+#define MAX_CROSSLINKS	16
+
+typedef struct entry ENTRY;
+
+typedef struct {
+	char *name;
+	ENTRY *link;
+	long line;
+} ENTRY_USES;
+
+struct entry {
+	TERMTYPE2 tterm;
+	unsigned nuses;
+	ENTRY_USES uses[MAX_USES];
+	int ncrosslinks;
+	ENTRY *crosslinks[MAX_CROSSLINKS];
+	long cstart;
+	long cend;
+	long startline;
+	ENTRY *next;
+	ENTRY *last;
+};
+
+extern NCURSES_EXPORT_VAR(ENTRY *) _nc_head;
+extern NCURSES_EXPORT_VAR(ENTRY *) _nc_tail;
+#define for_entry_list(qp)	for (qp = _nc_head; qp; qp = qp->next)
+#define for_entry_list2(qp,q0)	for (qp = q0; qp; qp = qp->next)
+
+#define MAX_LINE	132
+
+#define NULLHOOK        (bool(*)(ENTRY *))0
+
+/*
+ * Note that WANTED and PRESENT are not simple inverses!  If a capability
+ * has been explicitly cancelled, it is not considered WANTED.
+ */
+#define WANTED(s)	((s) == ABSENT_STRING)
+#define PRESENT(s)	(((s) != ABSENT_STRING) && ((s) != CANCELLED_STRING))
+
+#define ANDMISSING(p,q) \
+		{ \
+		if (PRESENT(p) && !PRESENT(q)) \
+			_nc_warning(#p " but no " #q); \
+		}
+
+#define PAIRED(p,q) \
+		{ \
+		if (PRESENT(q) && !PRESENT(p)) \
+			_nc_warning(#q " but no " #p); \
+		if (PRESENT(p) && !PRESENT(q)) \
+			_nc_warning(#p " but no " #q); \
+		}
+
+/*
+ * These entrypoints are used only by the ncurses utilities such as tic.
+ */
+
+/* alloc_entry.c: elementary allocation code */
+extern NCURSES_EXPORT(ENTRY *) _nc_copy_entry (ENTRY *oldp);
+extern NCURSES_EXPORT(char *) _nc_save_str (const char *const);
+extern NCURSES_EXPORT(void) _nc_init_entry (ENTRY *const);
+extern NCURSES_EXPORT(void) _nc_merge_entry (ENTRY *const, ENTRY *const);
+extern NCURSES_EXPORT(void) _nc_wrap_entry (ENTRY *const, bool);
+
+/* alloc_ttype.c: elementary allocation code */
+extern NCURSES_EXPORT(void) _nc_align_termtype (TERMTYPE2 *, TERMTYPE2 *);
+
+/* free_ttype.c: elementary allocation code */
+extern NCURSES_EXPORT(void) _nc_free_termtype1 (TERMTYPE *);
+extern NCURSES_EXPORT(void) _nc_free_termtype2 (TERMTYPE2 *);
+
+/* lib_termcap.c: trim sgr0 string for termcap users */
+extern NCURSES_EXPORT(char *) _nc_trim_sgr0 (TERMTYPE2 *);
+
+/* parse_entry.c: entry-parsing code */
+#if NCURSES_XNAMES
+extern NCURSES_EXPORT_VAR(bool) _nc_user_definable;
+extern NCURSES_EXPORT_VAR(bool) _nc_disable_period;
+#endif
+extern NCURSES_EXPORT(int) _nc_parse_entry (ENTRY *, int, bool);
+extern NCURSES_EXPORT(int) _nc_capcmp (const char *, const char *);
+
+/* write_entry.c: writing an entry to the file system */
+extern NCURSES_EXPORT(void) _nc_set_writedir (const char *);
+extern NCURSES_EXPORT(void) _nc_write_entry (TERMTYPE2 *const);
+extern NCURSES_EXPORT(int) _nc_write_object (TERMTYPE2 *, char *, unsigned *, unsigned);
+
+/* comp_parse.c: entry list handling */
+extern NCURSES_EXPORT(void) _nc_read_entry_source (FILE*, char*, int, bool, bool (*)(ENTRY*));
+extern NCURSES_EXPORT(bool) _nc_entry_match (char *, char *);
+extern NCURSES_EXPORT(int) _nc_resolve_uses (bool); /* obs 20040705 */
+extern NCURSES_EXPORT(int) _nc_resolve_uses2 (bool, bool);
+extern NCURSES_EXPORT(void) _nc_free_entries (ENTRY *);
+extern NCURSES_IMPEXP void (NCURSES_API *_nc_check_termtype)(TERMTYPE *); /* obs 20040705 */
+extern NCURSES_IMPEXP void (NCURSES_API *_nc_check_termtype2)(TERMTYPE2 *, bool);
+
+/* trace_xnames.c */
+extern NCURSES_EXPORT(void) _nc_trace_xnames (TERMTYPE *);
+
+#endif /* NCURSES_INTERNALS */
+
+/*
+ * These entrypoints were used by tack before 1.08.
+ */
+
+#undef  NCURSES_TACK_1_08
+#ifdef  NCURSES_INTERNALS
+#define NCURSES_TACK_1_08 /* nothing */
+#else
+#define NCURSES_TACK_1_08 GCC_DEPRECATED("upgrade to tack 1.08")
+#endif
+
+/* alloc_ttype.c: elementary allocation code */
+extern NCURSES_EXPORT(void) _nc_copy_termtype (TERMTYPE *, const TERMTYPE *) NCURSES_TACK_1_08;
+
+/* lib_acs.c */
+extern NCURSES_EXPORT(void) _nc_init_acs (void) NCURSES_TACK_1_08;	/* corresponds to traditional 'init_acs()' */
+
+/* free_ttype.c: elementary allocation code */
+extern NCURSES_EXPORT(void) _nc_free_termtype (TERMTYPE *) NCURSES_TACK_1_08;
+
+#ifdef __cplusplus
+}
+#endif
+
+/* *INDENT-ON* */
+
+#endif /* NCURSES_TERM_ENTRY_H_incl */
diff --git a/include/termcap.h.in b/include/termcap.h.in
new file mode 100644
index 0000000..7b7c703
--- /dev/null
+++ b/include/termcap.h.in
@@ -0,0 +1,73 @@
+/****************************************************************************
+ * Copyright 2018-2020,2021 Thomas E. Dickey                                *
+ * Copyright 1998-2000,2001 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ ****************************************************************************/
+
+/* $Id: termcap.h.in,v 1.20 2021/06/17 21:26:02 tom Exp $ */
+
+#ifndef NCURSES_TERMCAP_H_incl
+#define NCURSES_TERMCAP_H_incl	1
+
+#undef  NCURSES_VERSION
+#define NCURSES_VERSION "@NCURSES_MAJOR@.@NCURSES_MINOR@"
+
+#include <ncurses_dll.h>
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+#include <sys/types.h>
+
+#undef  NCURSES_OSPEED
+#define NCURSES_OSPEED @NCURSES_OSPEED@
+
+extern NCURSES_EXPORT_VAR(char) PC;
+extern NCURSES_EXPORT_VAR(char *) UP;
+extern NCURSES_EXPORT_VAR(char *) BC;
+extern NCURSES_EXPORT_VAR(NCURSES_OSPEED) ospeed;
+
+#if !defined(NCURSES_TERM_H_incl)
+extern NCURSES_EXPORT(char *) tgetstr (const char *, char **);
+extern NCURSES_EXPORT(char *) tgoto (const char *, int, int);
+extern NCURSES_EXPORT(int) tgetent (char *, const char *);
+extern NCURSES_EXPORT(int) tgetflag (const char *);
+extern NCURSES_EXPORT(int) tgetnum (const char *);
+extern NCURSES_EXPORT(int) tputs (const char *, int, int (*)(int));
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* NCURSES_TERMCAP_H_incl */
diff --git a/include/tic.h b/include/tic.h
new file mode 100644
index 0000000..302c06d
--- /dev/null
+++ b/include/tic.h
@@ -0,0 +1,396 @@
+/****************************************************************************
+ * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2012,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey 1996 on                                        *
+ ****************************************************************************/
+
+/*
+ * $Id: tic.h,v 1.86 2022/09/17 16:01:45 tom Exp $
+ *	tic.h - Global variables and structures for the terminfo compiler.
+ */
+
+#ifndef __TIC_H
+#define __TIC_H
+/* *INDENT-OFF* */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <ncurses_cfg.h>
+
+#include <curses.h>	/* for the _tracef() prototype, ERR/OK, bool defs */
+
+/*
+** The format of SVr2 compiled terminfo files is as follows:
+**
+**		Header (12 bytes), containing information given below
+**		Names Section, containing the names of the terminal
+**		Boolean Section, containing the values of all of the
+**				boolean capabilities
+**				A null byte may be inserted here to make
+**				sure that the Number Section begins on an
+**				even word boundary.
+**		Number Section, containing the values of all of the numeric
+**				capabilities, each as a short integer
+**		String Section, containing short integer offsets into the
+**				String Table, one per string capability
+**		String Table, containing the actual characters of the string
+**				capabilities.
+**
+** In the SVr2 format, "short" means signed 16-bit numbers, which is sometimes
+** inconvenient.  The numbers are signed, to provide for absent and canceled
+** values.  ncurses6.1 introduced an extension to this compiled format, by
+** making the Number Section a list of signed 32-bit integers.
+**
+**	NOTE that all short integers in the file are stored using VAX/PDP-style
+**	byte-order, i.e., least-significant byte first.
+**
+**	There is no structure definition here because it would only confuse
+**	matters.  Terminfo format is a raw byte layout, not a structure
+**	dump.  If you happen to be on a little-endian machine with 16-bit
+**	shorts that requires no padding between short members in a struct,
+**	then there is a natural C structure that captures the header, but
+**	not very helpfully.
+*/
+
+#define MAGIC		0432	/* first two bytes of a compiled entry */
+#define MAGIC2		01036	/* first two bytes of a compiled 32-bit entry */
+
+#undef  BYTE
+#define BYTE(p,n)	(unsigned char)((p)[n])
+
+#define IS_NEG1(p)	((BYTE(p,0) == 0377) && (BYTE(p,1) == 0377))
+#define IS_NEG2(p)	((BYTE(p,0) == 0376) && (BYTE(p,1) == 0377))
+#define LOW_MSB(p)	(BYTE(p,0) + 256*BYTE(p,1))
+
+#define IS_TIC_MAGIC(p)	(LOW_MSB(p) == MAGIC || LOW_MSB(p) == MAGIC2)
+
+#define quick_prefix(s) (!strncmp((s), "b64:", (size_t)4) || !strncmp((s), "hex:", (size_t)4))
+
+/*
+ * The "maximum" here is misleading; XSI guarantees minimum values, which a
+ * given implementation may exceed.
+ */
+#define MAX_NAME_SIZE	512	/* maximum legal name field size (XSI:127) */
+#define MAX_ENTRY_SIZE1	4096	/* maximum legal entry size (SVr2) */
+#define MAX_ENTRY_SIZE2	32768	/* maximum legal entry size (ncurses6.1) */
+
+#if NCURSES_EXT_COLORS && HAVE_INIT_EXTENDED_COLOR
+#define MAX_ENTRY_SIZE MAX_ENTRY_SIZE2
+#else
+#define MAX_ENTRY_SIZE MAX_ENTRY_SIZE1
+#endif
+
+/*
+ * The maximum size of individual name or alias is guaranteed in XSI to be at
+ * least 14, since that corresponds to the older filename lengths.  Newer
+ * systems allow longer aliases, though not many terminal descriptions are
+ * written to use them.  The MAX_ALIAS symbol is used for warnings.
+ */
+#if HAVE_LONG_FILE_NAMES
+#define MAX_ALIAS	32	/* smaller than POSIX minimum for PATH_MAX */
+#else
+#define MAX_ALIAS	14	/* SVr3 filename length */
+#endif
+
+/* location of user's personal info directory */
+#define PRIVATE_INFO	"%s/.terminfo"	/* plug getenv("HOME") into %s */
+
+/*
+ * Some traces are designed to be used via tic's verbose option (and similar in
+ * infocmp and toe) rather than the 'trace()' function.  So we use the bits
+ * above the normal trace() parameter as a debug-level.
+ */
+
+#define MAX_DEBUG_LEVEL 15
+#define DEBUG_LEVEL(n)	((n) << TRACE_SHIFT)
+
+#define set_trace_level(n) \
+	_nc_tracing &= TRACE_MAXIMUM, \
+	_nc_tracing |= DEBUG_LEVEL(n)
+
+#ifdef TRACE
+#define DEBUG(n, a)	if (_nc_tracing >= DEBUG_LEVEL(n)) _tracef a
+#else
+#define DEBUG(n, a)	/*nothing*/
+#endif
+
+/*
+ * These are the types of tokens returned by the scanner.  The first
+ * three are also used in the hash table of capability names.  The scanner
+ * returns one of these values after loading the specifics into the global
+ * structure curr_token.
+ */
+
+#define BOOLEAN 0		/* Boolean capability */
+#define NUMBER 1		/* Numeric capability */
+#define STRING 2		/* String-valued capability */
+#define CANCEL 3		/* Capability to be cancelled in following tc's */
+#define NAMES  4		/* The names for a terminal type */
+#define UNDEF  5		/* Undefined */
+
+#define NO_PUSHBACK	-1	/* used in pushtype to indicate no pushback */
+
+/*
+ * The global structure in which the specific parts of a
+ * scanned token are returned.
+ */
+
+struct token
+{
+	char	*tk_name;	/* name of capability */
+	int	tk_valnumber;	/* value of capability (if a number) */
+	char	*tk_valstring;	/* value of capability (if a string) */
+};
+
+/*
+ * Offsets to string capabilities, with the corresponding functionkey codes.
+ */
+struct tinfo_fkeys {
+	unsigned offset;
+	chtype code;
+	};
+
+typedef short HashValue;
+
+/*
+ * The file comp_captab.c contains an array of these structures, one per
+ * possible capability.  These are indexed by a hash table array of pointers to
+ * the same structures for use by the parser.
+ */
+struct name_table_entry
+{
+	const char *nte_name;	/* name to hash on */
+	int	nte_type;	/* BOOLEAN, NUMBER or STRING */
+	HashValue nte_index;	/* index of associated variable in its array */
+	HashValue nte_link;	/* index in table of next hash, or -1 */
+};
+
+/*
+ * Use this structure to hide differences between terminfo and termcap tables.
+ */
+typedef struct {
+	unsigned table_size;
+	const HashValue *table_data;
+	HashValue (*hash_of)(const char *);
+	int (*compare_names)(const char *, const char *);
+} HashData;
+
+struct alias
+{
+	const char	*from;
+	const char	*to;
+	const char	*source;
+};
+
+#define NOTFOUND	((struct name_table_entry *) 0)
+
+/*
+ * The file comp_userdefs.c contains an array of these structures, one per
+ * possible capability.  These are indexed by a hash table array of pointers to
+ * the same structures for use by the parser.
+ */
+struct user_table_entry
+{
+	const char *ute_name;	/* name to hash on */
+	int	ute_type;	/* mask (BOOLEAN, NUMBER, STRING) */
+	unsigned ute_argc;	/* number of parameters */
+	unsigned ute_args;	/* bit-mask for string parameters */
+	HashValue ute_index;	/* index of associated variable in its array */
+	HashValue ute_link;	/* index in table of next hash, or -1 */
+};
+
+/*
+ * The casts are required for correct sign-propagation with systems such as
+ * AIX, IRIX64, Solaris which default to unsigned characters.  The C standard
+ * leaves this detail unspecified.
+ */
+
+/* out-of-band values for representing absent capabilities */
+#define ABSENT_BOOLEAN		((signed char)-1)	/* 255 */
+#define ABSENT_NUMERIC		(-1)
+#define ABSENT_STRING		(char *)0
+
+/* out-of-band values for representing cancels */
+#define CANCELLED_BOOLEAN	((signed char)-2)	/* 254 */
+#define CANCELLED_NUMERIC	(-2)
+#define CANCELLED_STRING	(char *)(-1)
+
+#define VALID_BOOLEAN(s) ((unsigned char)(s) <= 1) /* reject "-1" */
+#define VALID_NUMERIC(s) ((s) >= 0)
+#define VALID_STRING(s)  ((s) != CANCELLED_STRING && (s) != ABSENT_STRING)
+
+/* termcap entries longer than this may break old binaries */
+#define MAX_TERMCAP_LENGTH	1023
+
+/* this is a documented limitation of terminfo */
+#define MAX_TERMINFO_LENGTH	4096
+
+#ifndef TERMINFO
+#define TERMINFO "/usr/share/terminfo"
+#endif
+
+#ifdef NCURSES_TERM_ENTRY_H_incl
+
+/*
+ * These entrypoints are used only by the ncurses utilities such as tic.
+ */
+#ifdef NCURSES_INTERNALS
+/* access.c */
+extern NCURSES_EXPORT(unsigned) _nc_pathlast (const char *);
+extern NCURSES_EXPORT(bool) _nc_is_abs_path (const char *);
+extern NCURSES_EXPORT(bool) _nc_is_dir_path (const char *);
+extern NCURSES_EXPORT(bool) _nc_is_file_path (const char *);
+extern NCURSES_EXPORT(char *) _nc_basename (char *);
+extern NCURSES_EXPORT(char *) _nc_rootname (char *);
+
+/* comp_captab.c */
+extern NCURSES_EXPORT(const struct name_table_entry *) _nc_get_table (bool);
+extern NCURSES_EXPORT(const HashData *) _nc_get_hash_info (bool);
+extern NCURSES_EXPORT(const struct alias *) _nc_get_alias_table (bool);
+
+/* comp_hash.c: name lookup */
+extern NCURSES_EXPORT(struct name_table_entry const *) _nc_find_type_entry
+	(const char *, int, bool);
+extern NCURSES_EXPORT(struct user_table_entry const *) _nc_find_user_entry
+	(const char *);
+
+/* comp_scan.c: lexical analysis */
+extern NCURSES_EXPORT(int)  _nc_get_token (bool);
+extern NCURSES_EXPORT(void) _nc_panic_mode (char);
+extern NCURSES_EXPORT(void) _nc_push_token (int);
+extern NCURSES_EXPORT_VAR(int) _nc_curr_col;
+extern NCURSES_EXPORT_VAR(int) _nc_curr_line;
+extern NCURSES_EXPORT_VAR(int) _nc_syntax;
+extern NCURSES_EXPORT_VAR(int) _nc_strict_bsd;
+extern NCURSES_EXPORT_VAR(long) _nc_comment_end;
+extern NCURSES_EXPORT_VAR(long) _nc_comment_start;
+extern NCURSES_EXPORT_VAR(long) _nc_curr_file_pos;
+extern NCURSES_EXPORT_VAR(long) _nc_start_line;
+#define SYN_TERMINFO	0
+#define SYN_TERMCAP	1
+
+/* comp_error.c: warning & abort messages */
+extern NCURSES_EXPORT(const char *) _nc_get_source (void);
+extern GCC_NORETURN NCURSES_EXPORT(void) _nc_err_abort (const char *const,...) GCC_PRINTFLIKE(1,2);
+extern NCURSES_EXPORT(void) _nc_get_type (char *name);
+extern NCURSES_EXPORT(void) _nc_set_source (const char *const);
+extern NCURSES_EXPORT(void) _nc_set_type (const char *const);
+extern GCC_NORETURN NCURSES_EXPORT(void) _nc_syserr_abort (const char *const,...) GCC_PRINTFLIKE(1,2);
+extern NCURSES_EXPORT(void) _nc_warning (const char *const,...) GCC_PRINTFLIKE(1,2);
+extern NCURSES_EXPORT_VAR(bool) _nc_suppress_warnings;
+
+/* comp_scan.c */
+extern NCURSES_EXPORT_VAR(struct token)	_nc_curr_token;
+
+/* comp_userdefs.c */
+NCURSES_EXPORT(const struct user_table_entry *) _nc_get_userdefs_table (void);
+NCURSES_EXPORT(const HashData *) _nc_get_hash_user (void);
+
+/* captoinfo.c: capability conversion */
+extern NCURSES_EXPORT(char *) _nc_captoinfo (const char *, const char *, int const);
+extern NCURSES_EXPORT(char *) _nc_infotocap (const char *, const char *, int const);
+
+/* home_terminfo.c */
+extern NCURSES_EXPORT(char *) _nc_home_terminfo (void);
+
+/* init_keytry.c */
+#if	BROKEN_LINKER
+#define	_nc_tinfo_fkeys	_nc_tinfo_fkeysf()
+extern NCURSES_EXPORT(const struct tinfo_fkeys *) _nc_tinfo_fkeysf (void);
+#else
+extern NCURSES_EXPORT_VAR(const struct tinfo_fkeys) _nc_tinfo_fkeys[];
+#endif
+
+/* lib_tparm.c */
+#define NUM_PARM 9
+
+extern NCURSES_EXPORT_VAR(int) _nc_tparm_err;
+
+extern NCURSES_EXPORT(int) _nc_tparm_analyze(TERMINAL *, const char *, char **, int *);
+extern NCURSES_EXPORT(void) _nc_reset_tparm(TERMINAL *);
+
+/* lib_trace.c */
+extern NCURSES_EXPORT_VAR(unsigned) _nc_tracing;
+extern NCURSES_EXPORT(const char *) _nc_visbuf (const char *);
+extern NCURSES_EXPORT(const char *) _nc_visbuf2 (int, const char *);
+
+/* lib_tputs.c */
+extern NCURSES_EXPORT_VAR(int) _nc_nulls_sent;	/* Add one for every null sent */
+
+/* comp_main.c: compiler main */
+extern const char * _nc_progname;
+
+/* db_iterator.c */
+extern NCURSES_EXPORT(const char *) _nc_next_db(DBDIRS *, int *);
+extern NCURSES_EXPORT(const char *) _nc_tic_dir (const char *);
+extern NCURSES_EXPORT(void) _nc_first_db(DBDIRS *, int *);
+extern NCURSES_EXPORT(void) _nc_last_db(void);
+
+/* write_entry.c */
+extern NCURSES_EXPORT(int) _nc_tic_written (void);
+
+#endif /* NCURSES_INTERNALS */
+
+/*
+ * These entrypoints were used by tack before 1.08.
+ */
+
+#undef  NCURSES_TACK_1_08
+#ifdef  NCURSES_INTERNALS
+#define NCURSES_TACK_1_08 /* nothing */
+#else
+#define NCURSES_TACK_1_08 GCC_DEPRECATED("upgrade to tack 1.08")
+#endif
+
+/* comp_hash.c: name lookup */
+extern NCURSES_EXPORT(struct name_table_entry const *) _nc_find_entry
+	(const char *, const HashValue *) NCURSES_TACK_1_08;
+extern NCURSES_EXPORT(const HashValue *) _nc_get_hash_table (bool) NCURSES_TACK_1_08;
+
+/* comp_scan.c: lexical analysis */
+extern NCURSES_EXPORT(void) _nc_reset_input (FILE *, char *) NCURSES_TACK_1_08;
+
+/* comp_expand.c: expand string into readable form */
+extern NCURSES_EXPORT(char *) _nc_tic_expand (const char *, bool, int) NCURSES_TACK_1_08;
+
+/* comp_scan.c: decode string from readable form */
+extern NCURSES_EXPORT(int) _nc_trans_string (char *, char *) NCURSES_TACK_1_08;
+
+#endif /* NCURSES_TERM_ENTRY_H_incl */
+
+#ifdef __cplusplus
+}
+#endif
+
+/* *INDENT-ON* */
+#endif /* __TIC_H */
diff --git a/include/unctrl.h.in b/include/unctrl.h.in
new file mode 100644
index 0000000..f76f443
--- /dev/null
+++ b/include/unctrl.h.in
@@ -0,0 +1,68 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2001,2009 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ ****************************************************************************/
+
+/*
+ * unctrl.h
+ *
+ * Display a printable version of a control character.
+ * Control characters are displayed in caret notation (^x), DELETE is displayed
+ * as ^?. Printable characters are displayed as is.
+ */
+
+/* $Id: unctrl.h.in,v 1.12 2020/02/02 23:34:34 tom Exp $ */
+
+#ifndef NCURSES_UNCTRL_H_incl
+#define NCURSES_UNCTRL_H_incl	1
+
+#undef  NCURSES_VERSION
+#define NCURSES_VERSION "@NCURSES_MAJOR@.@NCURSES_MINOR@"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <curses.h>
+
+#undef unctrl
+NCURSES_EXPORT(NCURSES_CONST char *) unctrl (chtype);
+
+#if @NCURSES_SP_FUNCS@
+NCURSES_EXPORT(NCURSES_CONST char *) NCURSES_SP_NAME(unctrl) (SCREEN*, chtype);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* NCURSES_UNCTRL_H_incl */
diff --git a/include/win32_curses.h b/include/win32_curses.h
new file mode 100644
index 0000000..0c807a0
--- /dev/null
+++ b/include/win32_curses.h
@@ -0,0 +1,75 @@
+/****************************************************************************
+ * Copyright 2018-2020,2021 Thomas E. Dickey                                *
+ * Copyright 2008-2014,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Author: Juergen Pfeifer, 2008-on                                         *
+ ****************************************************************************/
+
+/* $Id: win32_curses.h,v 1.3 2021/06/17 21:26:02 tom Exp $ */
+
+/*
+ * This is the interface we use on Windows to mimic the control of the settings
+ * of what acts like the classic TTY - the Windows Console.
+ */
+
+#if (defined(_WIN32) || defined(_WIN64))
+#ifndef _NC_WIN32_CURSES_H
+#define _NC_WIN32_CURSES_H 1
+
+struct winconmode
+{
+  unsigned long dwFlagIn;
+  unsigned long dwFlagOut;
+};
+
+extern NCURSES_EXPORT(void*) _nc_console_fd2handle(int fd);
+extern NCURSES_EXPORT(int)   _nc_console_setmode(void* handle, const struct winconmode* arg);
+extern NCURSES_EXPORT(int)   _nc_console_getmode(void* handle, struct winconmode* arg);
+extern NCURSES_EXPORT(int)   _nc_console_flush(void* handle);
+
+/*
+  A few definitions of Unix functions we need to emulate
+*/
+#define SIGHUP  1
+#define SIGKILL 9
+
+#undef  getlogin
+#define getlogin() getenv("USERNAME")
+
+#undef  ttyname
+#define ttyname(fd) NULL
+
+#undef sleep
+#define sleep(n) Sleep((n) * 1000)
+
+#undef gettimeofday
+#define gettimeofday(tv,tz) _nc_gettimeofday(tv,tz)
+
+#endif /* _NC_WIN32_CURSES_H */
+#endif /* _WIN32||_WIN64 */
diff --git a/install-sh b/install-sh
new file mode 100755
index 0000000..ec298b5
--- /dev/null
+++ b/install-sh
@@ -0,0 +1,541 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2020-11-14.01; # UTC
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# 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, 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
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# 'make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+
+tab='	'
+nl='
+'
+IFS=" $tab$nl"
+
+# Set DOITPROG to "echo" to test this script.
+
+doit=${DOITPROG-}
+doit_exec=${doit:-exec}
+
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
+
+posix_mkdir=
+
+# Desired mode of installed file.
+mode=0755
+
+# Create dirs (including intermediate dirs) using mode 755.
+# This is like GNU 'install' as of coreutils 8.32 (2020).
+mkdir_umask=22
+
+backupsuffix=
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
+rmcmd="$rmprog -f"
+stripcmd=
+
+src=
+dst=
+dir_arg=
+dst_arg=
+
+copy_on_change=false
+is_target_a_directory=possibly
+
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+   or: $0 [OPTION]... SRCFILES... DIRECTORY
+   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+   or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+     --help     display this help and exit.
+     --version  display version info and exit.
+
+  -c            (ignored)
+  -C            install only if different (preserve data modification time)
+  -d            create directories instead of installing files.
+  -g GROUP      $chgrpprog installed files to GROUP.
+  -m MODE       $chmodprog installed files to MODE.
+  -o USER       $chownprog installed files to USER.
+  -p            pass -p to $cpprog.
+  -s            $stripprog installed files.
+  -S SUFFIX     attempt to back up existing files, with suffix SUFFIX.
+  -t DIRECTORY  install into DIRECTORY.
+  -T            report an error if DSTFILE is a directory.
+
+Environment variables override the default commands:
+  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+  RMPROG STRIPPROG
+
+By default, rm is invoked with -f; when overridden with RMPROG,
+it's up to you to specify -f if you want it.
+
+If -S is not specified, no backups are attempted.
+
+Email bug reports to bug-automake@gnu.org.
+Automake home page: https://www.gnu.org/software/automake/
+"
+
+while test $# -ne 0; do
+  case $1 in
+    -c) ;;
+
+    -C) copy_on_change=true;;
+
+    -d) dir_arg=true;;
+
+    -g) chgrpcmd="$chgrpprog $2"
+        shift;;
+
+    --help) echo "$usage"; exit $?;;
+
+    -m) mode=$2
+        case $mode in
+          *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
+            echo "$0: invalid mode: $mode" >&2
+            exit 1;;
+        esac
+        shift;;
+
+    -o) chowncmd="$chownprog $2"
+        shift;;
+
+    -p) cpprog="$cpprog -p";;
+
+    -s) stripcmd=$stripprog;;
+
+    -S) backupsuffix="$2"
+        shift;;
+
+    -t)
+        is_target_a_directory=always
+        dst_arg=$2
+        # Protect names problematic for 'test' and other utilities.
+        case $dst_arg in
+          -* | [=\(\)!]) dst_arg=./$dst_arg;;
+        esac
+        shift;;
+
+    -T) is_target_a_directory=never;;
+
+    --version) echo "$0 $scriptversion"; exit $?;;
+
+    --) shift
+        break;;
+
+    -*) echo "$0: invalid option: $1" >&2
+        exit 1;;
+
+    *)  break;;
+  esac
+  shift
+done
+
+# We allow the use of options -d and -T together, by making -d
+# take the precedence; this is for compatibility with GNU install.
+
+if test -n "$dir_arg"; then
+  if test -n "$dst_arg"; then
+    echo "$0: target directory not allowed when installing a directory." >&2
+    exit 1
+  fi
+fi
+
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+  # When -d is used, all remaining arguments are directories to create.
+  # When -t is used, the destination is already specified.
+  # Otherwise, the last argument is the destination.  Remove it from $@.
+  for arg
+  do
+    if test -n "$dst_arg"; then
+      # $@ is not empty: it contains at least $arg.
+      set fnord "$@" "$dst_arg"
+      shift # fnord
+    fi
+    shift # arg
+    dst_arg=$arg
+    # Protect names problematic for 'test' and other utilities.
+    case $dst_arg in
+      -* | [=\(\)!]) dst_arg=./$dst_arg;;
+    esac
+  done
+fi
+
+if test $# -eq 0; then
+  if test -z "$dir_arg"; then
+    echo "$0: no input file specified." >&2
+    exit 1
+  fi
+  # It's OK to call 'install-sh -d' without argument.
+  # This can happen when creating conditional directories.
+  exit 0
+fi
+
+if test -z "$dir_arg"; then
+  if test $# -gt 1 || test "$is_target_a_directory" = always; then
+    if test ! -d "$dst_arg"; then
+      echo "$0: $dst_arg: Is not a directory." >&2
+      exit 1
+    fi
+  fi
+fi
+
+if test -z "$dir_arg"; then
+  do_exit='(exit $ret); exit $ret'
+  trap "ret=129; $do_exit" 1
+  trap "ret=130; $do_exit" 2
+  trap "ret=141; $do_exit" 13
+  trap "ret=143; $do_exit" 15
+
+  # Set umask so as not to create temps with too-generous modes.
+  # However, 'strip' requires both read and write access to temps.
+  case $mode in
+    # Optimize common cases.
+    *644) cp_umask=133;;
+    *755) cp_umask=22;;
+
+    *[0-7])
+      if test -z "$stripcmd"; then
+        u_plus_rw=
+      else
+        u_plus_rw='% 200'
+      fi
+      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+    *)
+      if test -z "$stripcmd"; then
+        u_plus_rw=
+      else
+        u_plus_rw=,u+rw
+      fi
+      cp_umask=$mode$u_plus_rw;;
+  esac
+fi
+
+for src
+do
+  # Protect names problematic for 'test' and other utilities.
+  case $src in
+    -* | [=\(\)!]) src=./$src;;
+  esac
+
+  if test -n "$dir_arg"; then
+    dst=$src
+    dstdir=$dst
+    test -d "$dstdir"
+    dstdir_status=$?
+    # Don't chown directories that already exist.
+    if test $dstdir_status = 0; then
+      chowncmd=""
+    fi
+  else
+
+    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+    # might cause directories to be created, which would be especially bad
+    # if $src (and thus $dsttmp) contains '*'.
+    if test ! -f "$src" && test ! -d "$src"; then
+      echo "$0: $src does not exist." >&2
+      exit 1
+    fi
+
+    if test -z "$dst_arg"; then
+      echo "$0: no destination specified." >&2
+      exit 1
+    fi
+    dst=$dst_arg
+
+    # If destination is a directory, append the input filename.
+    if test -d "$dst"; then
+      if test "$is_target_a_directory" = never; then
+        echo "$0: $dst_arg: Is a directory" >&2
+        exit 1
+      fi
+      dstdir=$dst
+      dstbase=`basename "$src"`
+      case $dst in
+	*/) dst=$dst$dstbase;;
+	*)  dst=$dst/$dstbase;;
+      esac
+      dstdir_status=0
+    else
+      dstdir=`dirname "$dst"`
+      test -d "$dstdir"
+      dstdir_status=$?
+    fi
+  fi
+
+  case $dstdir in
+    */) dstdirslash=$dstdir;;
+    *)  dstdirslash=$dstdir/;;
+  esac
+
+  obsolete_mkdir_used=false
+
+  if test $dstdir_status != 0; then
+    case $posix_mkdir in
+      '')
+        # With -d, create the new directory with the user-specified mode.
+        # Otherwise, rely on $mkdir_umask.
+        if test -n "$dir_arg"; then
+          mkdir_mode=-m$mode
+        else
+          mkdir_mode=
+        fi
+
+        posix_mkdir=false
+	# The $RANDOM variable is not portable (e.g., dash).  Use it
+	# here however when possible just to lower collision chance.
+	tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+
+	trap '
+	  ret=$?
+	  rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null
+	  exit $ret
+	' 0
+
+	# Because "mkdir -p" follows existing symlinks and we likely work
+	# directly in world-writeable /tmp, make sure that the '$tmpdir'
+	# directory is successfully created first before we actually test
+	# 'mkdir -p'.
+	if (umask $mkdir_umask &&
+	    $mkdirprog $mkdir_mode "$tmpdir" &&
+	    exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
+	then
+	  if test -z "$dir_arg" || {
+	       # Check for POSIX incompatibilities with -m.
+	       # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+	       # other-writable bit of parent directory when it shouldn't.
+	       # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+	       test_tmpdir="$tmpdir/a"
+	       ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
+	       case $ls_ld_tmpdir in
+		 d????-?r-*) different_mode=700;;
+		 d????-?--*) different_mode=755;;
+		 *) false;;
+	       esac &&
+	       $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
+		 ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
+		 test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+	       }
+	     }
+	  then posix_mkdir=:
+	  fi
+	  rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
+	else
+	  # Remove any dirs left behind by ancient mkdir implementations.
+	  rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
+	fi
+	trap '' 0;;
+    esac
+
+    if
+      $posix_mkdir && (
+        umask $mkdir_umask &&
+        $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+      )
+    then :
+    else
+
+      # mkdir does not conform to POSIX,
+      # or it failed possibly due to a race condition.  Create the
+      # directory the slow way, step by step, checking for races as we go.
+
+      case $dstdir in
+        /*) prefix='/';;
+        [-=\(\)!]*) prefix='./';;
+        *)  prefix='';;
+      esac
+
+      oIFS=$IFS
+      IFS=/
+      set -f
+      set fnord $dstdir
+      shift
+      set +f
+      IFS=$oIFS
+
+      prefixes=
+
+      for d
+      do
+        test X"$d" = X && continue
+
+        prefix=$prefix$d
+        if test -d "$prefix"; then
+          prefixes=
+        else
+          if $posix_mkdir; then
+            (umask $mkdir_umask &&
+             $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+            # Don't fail if two instances are running concurrently.
+            test -d "$prefix" || exit 1
+          else
+            case $prefix in
+              *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+              *) qprefix=$prefix;;
+            esac
+            prefixes="$prefixes '$qprefix'"
+          fi
+        fi
+        prefix=$prefix/
+      done
+
+      if test -n "$prefixes"; then
+        # Don't fail if two instances are running concurrently.
+        (umask $mkdir_umask &&
+         eval "\$doit_exec \$mkdirprog $prefixes") ||
+          test -d "$dstdir" || exit 1
+        obsolete_mkdir_used=true
+      fi
+    fi
+  fi
+
+  if test -n "$dir_arg"; then
+    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
+  else
+
+    # Make a couple of temp file names in the proper directory.
+    dsttmp=${dstdirslash}_inst.$$_
+    rmtmp=${dstdirslash}_rm.$$_
+
+    # Trap to clean up those temp files at exit.
+    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+    # Copy the file name to the temp name.
+    (umask $cp_umask &&
+     { test -z "$stripcmd" || {
+	 # Create $dsttmp read-write so that cp doesn't create it read-only,
+	 # which would cause strip to fail.
+	 if test -z "$doit"; then
+	   : >"$dsttmp" # No need to fork-exec 'touch'.
+	 else
+	   $doit touch "$dsttmp"
+	 fi
+       }
+     } &&
+     $doit_exec $cpprog "$src" "$dsttmp") &&
+
+    # and set any options; do chmod last to preserve setuid bits.
+    #
+    # If any of these fail, we abort the whole thing.  If we want to
+    # ignore errors from any of these, just make sure not to ignore
+    # errors from the above "$doit $cpprog $src $dsttmp" command.
+    #
+    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+    # If -C, don't bother to copy if it wouldn't change the file.
+    if $copy_on_change &&
+       old=`LC_ALL=C ls -dlL "$dst"     2>/dev/null` &&
+       new=`LC_ALL=C ls -dlL "$dsttmp"  2>/dev/null` &&
+       set -f &&
+       set X $old && old=:$2:$4:$5:$6 &&
+       set X $new && new=:$2:$4:$5:$6 &&
+       set +f &&
+       test "$old" = "$new" &&
+       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+    then
+      rm -f "$dsttmp"
+    else
+      # If $backupsuffix is set, and the file being installed
+      # already exists, attempt a backup.  Don't worry if it fails,
+      # e.g., if mv doesn't support -f.
+      if test -n "$backupsuffix" && test -f "$dst"; then
+        $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null
+      fi
+
+      # Rename the file to the real destination.
+      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+      # The rename failed, perhaps because mv can't rename something else
+      # to itself, or perhaps because mv is so ancient that it does not
+      # support -f.
+      {
+        # Now remove or move aside any old file at destination location.
+        # We try this two ways since rm can't unlink itself on some
+        # systems and the destination file might be busy for other
+        # reasons.  In this case, the final cleanup might fail but the new
+        # file should still install successfully.
+        {
+          test ! -f "$dst" ||
+          $doit $rmcmd "$dst" 2>/dev/null ||
+          { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+            { $doit $rmcmd "$rmtmp" 2>/dev/null; :; }
+          } ||
+          { echo "$0: cannot unlink or rename $dst" >&2
+            (exit 1); exit 1
+          }
+        } &&
+
+        # Now rename the file to the real destination.
+        $doit $mvcmd "$dsttmp" "$dst"
+      }
+    fi || exit 1
+
+    trap '' 0
+  fi
+done
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/man/MKada_config.in b/man/MKada_config.in
new file mode 100644
index 0000000..4552c5d
--- /dev/null
+++ b/man/MKada_config.in
@@ -0,0 +1,124 @@
+.\"***************************************************************************
+.\" Copyright 2019-2020,2021 Thomas E. Dickey                                *
+.\" Copyright 2010-2014,2016 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: MKada_config.in,v 1.14 2021/12/25 17:39:16 tom Exp $
+.ds C adacurses@USE_CFG_SUFFIX@\-config
+.TH ADACURSES "1" "" "" "User Commands"
+.SH NAME
+adacurses@USE_CFG_SUFFIX@\-config \- helper script for @ADA_LIBNAME@ libraries
+.SH SYNOPSIS
+.B \*C
+[\fIoptions\fP]
+.SH DESCRIPTION
+This is a shell script which simplifies configuring an application to use
+the @ADA_LIBNAME@ library binding to ncurses.
+.SH OPTIONS
+.TP
+\fB\-\-cflags\fP
+echos the gnat (Ada compiler) flags needed to compile with @ADA_LIBNAME@.
+.TP
+\fB\-\-libs\fP
+echos the gnat libraries needed to link with @ADA_LIBNAME@.
+.TP
+\fB\-\-version\fP
+echos the release+patchdate version of the ncurses libraries used
+to configure and build @ADA_LIBNAME@.
+.TP
+\fB\-\-help\fP
+prints a list of the \fB\*C\fP script's options.
+.PP
+If no options are given, \fB\*C\fP prints the combination
+of
+\fB\-\-cflags\fP and
+\fB\-\-libs\fP
+that \fBgnatmake\fP expects (see example).
+.SH EXAMPLE
+.PP
+For example, supposing that you want to compile the "Hello World!"
+program for @ADA_LIBNAME@.
+Make a file named "hello.adb":
+.RS
+.nf
+.ft CW
+with Terminal_Interface.Curses; use Terminal_Interface.Curses;
+
+procedure Hello is
+
+   Visibility : Cursor_Visibility := Invisible;
+   done : Boolean := False;
+   c : Key_Code;
+
+begin
+
+   Init_Screen;
+   Set_Echo_Mode (False);
+
+   Set_Cursor_Visibility (Visibility);
+   Set_Timeout_Mode (Standard_Window, Non_Blocking, 0);
+
+   Move_Cursor (Line => Lines / 2, Column => (Columns - 12) / 2);
+   Add (Str => "Hello World!");
+
+   while not done loop
+
+      c := Get_Keystroke (Standard_Window);
+      case c is
+      when Character'Pos ('q') => done := True;
+      when others => null;
+      end case;
+
+      Nap_Milli_Seconds (50);
+   end loop;
+
+   End_Windows;
+
+end Hello;
+.fi
+.RE
+.PP
+Then, using
+.RS
+.ft CW
+gnatmake `adacurses-config --cflags` hello -largs `adacurses-config --libs`
+.ft
+.RE
+.PP
+or (simpler):
+.RS
+.ft CW
+gnatmake hello `adacurses-config`
+.ft
+.RE
+.PP
+you will compile and link the program.
+.SH "SEE ALSO"
+\fBcurses\fP(3X)
+.PP
+This describes \fBncurses\fP
+version @NCURSES_MAJOR@.@NCURSES_MINOR@ (patch @NCURSES_PATCH@).
diff --git a/man/MKncu_config.in b/man/MKncu_config.in
new file mode 100644
index 0000000..6abeb4b
--- /dev/null
+++ b/man/MKncu_config.in
@@ -0,0 +1,99 @@
+.\"***************************************************************************
+.\" Copyright 2020,2021 Thomas E. Dickey                                     *
+.\" Copyright 2010 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: MKncu_config.in,v 1.6 2021/12/25 17:39:16 tom Exp $
+.TH @LIB_NAME@@DFT_ARG_SUFFIX@@cf_cv_abi_version@-config 1 ""
+.SH NAME
+@LIB_NAME@@DFT_ARG_SUFFIX@@cf_cv_abi_version@-config \- helper script for ncurses libraries
+.SH SYNOPSIS
+.B @LIB_NAME@@DFT_ARG_SUFFIX@@cf_cv_abi_version@-config
+[\fIoptions\fP]
+.SH DESCRIPTION
+This is a shell script which simplifies configuring applications against
+a particular set of ncurses libraries.
+.SH OPTIONS
+.TP
+\fB\-\-prefix\fP
+echos the package\-prefix of ncurses
+.TP
+\fB\-\-exec\-prefix\fP
+echos the executable\-prefix of ncurses
+.TP
+\fB\-\-cflags\fP
+echos the C compiler flags needed to compile with ncurses
+.TP
+\fB\-\-libs\fP
+echos the libraries needed to link with ncurses
+.TP
+\fB\-\-version\fP
+echos the release+patchdate version of ncurses
+.TP
+\fB\-\-abi\-version\fP
+echos the ABI version of ncurses
+.TP
+\fB\-\-mouse\-version\fP
+echos the mouse\-interface version of ncurses
+.TP
+\fB\-\-bindir\fP
+echos the directory containing ncurses programs
+.TP
+\fB\-\-datadir\fP
+echos the directory containing ncurses data
+.TP
+\fB\-\-includedir\fP
+echos the directory containing ncurses header files
+.TP
+\fB\-\-libdir\fP
+echos the directory containing ncurses libraries
+.TP
+\fB\-\-mandir\fP
+echos the directory containing ncurses manpages
+.TP
+\fB\-\-terminfo\fP
+echos the $TERMINFO terminfo database path, e.g.,
+.RS
+@TERMINFO@
+.RE
+.TP
+\fB\-\-terminfo\-dirs\fP
+echos the $TERMINFO_DIRS directory list, e.g.,
+.RS
+@TERMINFO_DIRS@
+.RE
+.TP
+\fB\-\-termpath\fP
+echos the $TERMPATH termcap list, if support for termcap is configured.
+.TP
+\fB\-\-help\fP
+prints this message
+.SH "SEE ALSO"
+\fBcurses\fP(3X)
+.PP
+This describes \fBncurses\fP
+version @NCURSES_MAJOR@.@NCURSES_MINOR@ (patch @NCURSES_PATCH@).
diff --git a/man/MKterminfo.sh b/man/MKterminfo.sh
new file mode 100755
index 0000000..323c525
--- /dev/null
+++ b/man/MKterminfo.sh
@@ -0,0 +1,121 @@
+#!/bin/sh
+# $Id: MKterminfo.sh,v 1.19 2022/07/16 17:55:20 tom Exp $
+#
+# MKterminfo.sh -- generate terminfo.5 from Caps tabular data
+#
+#***************************************************************************
+# Copyright 2018-2020,2022 Thomas E. Dickey                                *
+# Copyright 1998-2003,2017 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.                                                           *
+#***************************************************************************
+#
+# This script takes terminfo.head and terminfo.tail and splices in between
+# them a table derived from the Caps data file.  Besides avoiding having
+# the docs fall out of sync with the table, this also lets us set up tbl
+# commands for better formatting of the table.
+#
+# NOTE: The s in this script really are control characters.  It translates
+#  to \n because I couldn't get used to inserting linefeeds directly.  There
+# had better be no s in the table source text.
+#
+# keep the order independent of locale:
+if test "${LANGUAGE+set}"    = set; then LANGUAGE=C;    export LANGUAGE;    fi
+if test "${LANG+set}"        = set; then LANG=C;        export LANG;        fi
+if test "${LC_ALL+set}"      = set; then LC_ALL=C;      export LC_ALL;      fi
+if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+if test "${LC_CTYPE+set}"    = set; then LC_CTYPE=C;    export LC_CTYPE;    fi
+if test "${LC_COLLATE+set}"  = set; then LC_COLLATE=C;  export LC_COLLATE;  fi
+
+#
+head="$1"
+shift 1
+caps=
+while test $# -gt 1
+do
+	caps="$caps $1"
+	shift 1
+done
+tail="$1"
+cat <<EOF
+'\\" t
+.\\" DO NOT EDIT THIS FILE BY HAND!
+.\\" It is generated from terminfo.head, $caps, and terminfo.tail.
+.\\"
+.\\" Note: this must be run through tbl before nroff.
+.\\" The magic cookie on the first line triggers this under some man programs.
+EOF
+cat "$head"
+
+temp=temp$$
+sorted=sorted$$
+unsorted=unsorted$$
+trap 'code=$?; rm -f $sorted $temp $unsorted; exit $code' EXIT HUP INT QUIT TERM
+rm -f $sorted $temp $unsorted
+
+cat $caps | sed -n "\
+/%%-STOP-HERE-%%/q
+/^#%center/s, expand,,
+/^#%lw25/s, lw6 , lw7 ,
+/^#%/s/#%//p
+/^#/d
+s/[	][	]*/	/g
+s/$/T}/
+s/	[A-Z0-9_()\-][A-Z0-9_()\-]*	[0-9\-][0-9\-]*	[Y\-][B\-][C\-][G\-][EK\-]\**	/	T{/
+s/	bool	/	/p
+s/	num	/	/p
+s/	str	/	/p
+" |sed -e 's/^$/../' | tr "\134" "\006" >$unsorted
+
+rm -f $sorted
+rm -f $temp
+saved=no
+while true
+do
+	data=
+	read data
+	test -z "$data" && break
+	case "$data" in #(vi
+	**) #(vi
+		echo "$data" >>$temp
+		saved=yes
+		;;
+	*)
+		if test $saved = yes ; then
+			saved=no
+			sort $temp >>$sorted
+			rm -f $temp
+		fi
+		echo "$data" >>$sorted
+		;;
+	esac
+done <$unsorted
+test $saved = yes && sort $temp >>$sorted
+
+sed -e 's/^\.\.$//' $sorted | tr "\005\006" "\012\134"
+
+sed	-e '/^center expand;/s, expand,,' \
+	-e '/^\.TS/,/^\\/s, lw[1-9][0-9]*\., l.,' \
+	"$tail"
diff --git a/man/Makefile.in b/man/Makefile.in
new file mode 100644
index 0000000..9d08a7e
--- /dev/null
+++ b/man/Makefile.in
@@ -0,0 +1,106 @@
+# $Id: Makefile.in,v 1.54 2022/10/22 16:36:40 tom Exp $
+##############################################################################
+# Copyright 2019-2021,2022 Thomas E. Dickey                                  #
+# Copyright 1998-2013,2015 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey 1996,1997
+#
+# Makefile for ncurses manual pages.
+#
+# NOTE: When you add or rename a man page, make sure you update both
+# the top-level MANIFEST and any man/*.renames files!
+
+SHELL		= @SHELL@
+VPATH		= @srcdir@
+
+DESTDIR		= @DESTDIR@
+srcdir		= @srcdir@
+prefix		= @prefix@
+exec_prefix	= @exec_prefix@
+datarootdir	= @datarootdir@
+datadir		= @datadir@
+mandir		= @mandir@
+includesubdir	= @includesubdir@
+
+INCLUDEDIR	= $(DESTDIR)$(includedir)$(includesubdir)
+
+INSTALL		= @INSTALL@
+INSTALL_DATA	= @INSTALL_DATA@
+
+################################################################################
+
+@MAKE_PHONY@.PHONY :	all
+@MAKE_PHONY@.PHONY :	clean
+@MAKE_PHONY@.PHONY :	depend
+@MAKE_PHONY@.PHONY :	distclean
+@MAKE_PHONY@.PHONY :	install
+@MAKE_PHONY@.PHONY :	install.man
+@MAKE_PHONY@.PHONY :	libs
+@MAKE_PHONY@.PHONY :	mostlyclean
+@MAKE_PHONY@.PHONY :	realclean
+@MAKE_PHONY@.PHONY :	sources
+@MAKE_PHONY@.PHONY :	uninstall
+@MAKE_PHONY@.PHONY :	uninstall.man
+
+all \
+sources :	terminfo.5
+depend :
+tags :
+
+$(DESTDIR)$(mandir) :
+	mkdir -p $@
+
+EDITARGS = $(DESTDIR)$(mandir) $(srcdir) terminfo.5 *-config.1 $(srcdir)/*.[0-9]*
+
+install install.man : terminfo.5 $(DESTDIR)$(mandir)
+	$(SHELL) ../edit_man.sh normal installing $(EDITARGS)
+
+uninstall uninstall.man :
+	-$(SHELL) ../edit_man.sh normal removing $(EDITARGS)
+
+# We compose terminfo.5 from the real sources...
+CAPLIST	= \
+	$(srcdir)/../include/@TERMINFO_CAPS@ \
+	$(srcdir)/../include/Caps-ncurses
+terminfo.5: $(srcdir)/terminfo.head \
+		$(CAPLIST) \
+		$(srcdir)/terminfo.tail \
+		Makefile $(srcdir)/MKterminfo.sh
+	$(SHELL) $(srcdir)/MKterminfo.sh $(srcdir)/terminfo.head $(CAPLIST) $(srcdir)/terminfo.tail >terminfo.5
+
+mostlyclean :
+	-rm -f core tags TAGS *~ *.bak *.ln *.atac trace
+
+clean:	mostlyclean
+	rm -f terminfo.5
+
+../edit_man.sed : make_sed.sh
+	$(SHELL) $(srcdir)/make_sed.sh @MANPAGE_RENAMES@ >../edit_man.sed
+
+distclean realclean: clean
+	-rm -f Makefile *-config.1 ../edit_man.* ../man_alias.* man_db.renames
diff --git a/man/captoinfo.1m b/man/captoinfo.1m
new file mode 100644
index 0000000..ddf6034
--- /dev/null
+++ b/man/captoinfo.1m
@@ -0,0 +1,207 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2016 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: captoinfo.1m,v 1.33 2022/02/12 20:07:29 tom Exp $
+.TH @CAPTOINFO@ 1M ""
+.ds n 5
+.ds d @TERMINFO@
+.SH NAME
+\fB@CAPTOINFO@\fP \- convert a \fItermcap\fP description into a \fIterminfo\fP description
+.SH SYNOPSIS
+\fB@CAPTOINFO@\fR [\fB\-v\fIn\fR \fIwidth\fR]  [\fB\-V\fR] [\fB\-1\fR] [\fB\-w\fR \fIwidth\fR] \fIfile\fR ...
+.SH DESCRIPTION
+\fB@CAPTOINFO@\fP looks in each given text
+\fIfile\fP for \fBtermcap\fP descriptions.
+For each
+one found, an equivalent \fBterminfo\fP description is written to standard
+output.
+Termcap \fBtc\fP capabilities are translated directly to terminfo
+\fBuse\fP capabilities.
+.PP
+If no \fIfile\fP is given, then the environment variable \fBTERMCAP\fP is used
+for the filename or entry.
+If \fBTERMCAP\fP is a full pathname to a file, only
+the terminal whose name is specified in the environment variable \fBTERM\fP is
+extracted from that file.
+If the environment variable \fBTERMCAP\fP is not
+set, then the file \fB\*d\fP is read.
+.TP 5
+\fB\-v\fP
+print out tracing information on standard error as the program runs.
+.TP 5
+\fB\-V\fP
+print out the version of the program in use on standard error and exit.
+.TP 5
+\fB\-1\fP
+cause the fields to print out one to a line.
+Otherwise, the fields
+will be printed several to a line to a maximum width of 60
+characters.
+.TP 5
+\fB\-w\fP
+change the output to \fIwidth\fP characters.
+.SH FILES
+.TP 20
+\*d
+Compiled terminal description database.
+.SH TRANSLATIONS FROM NONSTANDARD CAPABILITIES
+.PP
+Some obsolete nonstandard capabilities will automatically be translated
+into standard (SVr4/XSI Curses) terminfo capabilities by \fB@CAPTOINFO@\fP.
+Whenever one of these automatic translations is done, the program
+will issue an notification to stderr, inviting the user to check that
+it has not mistakenly translated a completely unknown and random
+capability and/or syntax error.
+.PP
+.TS H
+c c c c
+c c c c
+l l l l.
+Nonstd	Std	From	Terminfo
+name	name		capability
+_
+BO	mr	AT&T	enter_reverse_mode
+CI	vi	AT&T	cursor_invisible
+CV	ve	AT&T	cursor_normal
+DS	mh	AT&T	enter_dim_mode
+EE	me	AT&T	exit_attribute_mode
+FE	LF	AT&T	label_on
+FL	LO	AT&T	label_off
+XS	mk	AT&T	enter_secure_mode
+EN	@7	XENIX	key_end
+GE	ae	XENIX	exit_alt_charset_mode
+GS	as	XENIX	enter_alt_charset_mode
+HM	kh	XENIX	key_home
+LD	kL	XENIX	key_dl
+PD	kN	XENIX	key_npage
+PN	po	XENIX	prtr_off
+PS	pf	XENIX	prtr_on
+PU	kP	XENIX	key_ppage
+RT	@8	XENIX	kent
+UP	ku	XENIX	kcuu1
+KA	k;	Tek	key_f10
+KB	F1	Tek	key_f11
+KC	F2	Tek	key_f12
+KD	F3	Tek	key_f13
+KE	F4	Tek	key_f14
+KF	F5	Tek	key_f15
+BC	Sb	Tek	set_background
+FC	Sf	Tek	set_foreground
+HS	mh	Iris	enter_dim_mode
+.TE
+.PP
+XENIX termcap also used to have a set of extension capabilities
+for forms drawing, designed to take advantage of the IBM PC
+high-half graphics.
+They were as follows:
+.PP
+.TS H
+c c
+l l.
+Cap	Graphic
+_
+G2	upper left
+G3	lower left
+G1	upper right
+G4	lower right
+GR	pointing right
+GL	pointing left
+GU	pointing up
+GD	pointing down
+GH	horizontal line
+GV	vertical line
+GC	intersection
+G6	upper left
+G7	lower left
+G5	upper right
+G8	lower right
+Gr	tee pointing right
+Gr	tee pointing left
+Gu	tee pointing up
+Gd	tee pointing down
+Gh	horizontal line
+Gv	vertical line
+Gc	intersection
+GG	acs magic cookie count
+.TE
+.PP
+If the single-line capabilities occur in an entry, they will automatically
+be composed into an \fBacsc\fP string.
+The double-line capabilities and
+\fBGG\fP are discarded with a warning message.
+.PP
+IBM's AIX has a terminfo facility descended from SVr1 terminfo but incompatible
+with the SVr4 format.
+The following AIX extensions are automatically
+translated:
+.TS
+c c
+l l.
+IBM	XSI
+_
+ksel	kslt
+kbtab	kcbt
+font0	s0ds
+font1	s1ds
+font2	s2ds
+font3	s3ds
+.TE
+.PP
+Additionally, the AIX \fIbox1\fP capability will be automatically translated to
+an \fBacsc\fP string.
+.PP
+Hewlett-Packard's terminfo library supports two nonstandard terminfo
+capabilities \fBmeml\fP (memory lock) and \fBmemu\fP (memory unlock).
+These will be discarded with a warning message.
+.SH NOTES
+This utility is actually a link to \fB@TIC@\fP(1M), running in \fI\-I\fP mode.
+You can use other \fB@TIC@\fP options such as \fB\-f\fP and  \fB\-x\fP.
+.PP
+The verbose option is not identical to SVr4's.
+Under SVr4, instead of following
+the \fB\-v\fP with a trace level n, you repeat it n times.
+.SH PORTABILITY
+X/Open Curses, Issue 7 (2009) describes \fBtic\fP briefly,
+but omits this program.
+SVr4 systems provide \fBcaptoinfo\fP as a separate application from \fBtic\fP.
+.PP
+NetBSD does not provide this application.
+.SH SEE ALSO
+\fB@INFOCMP@\fP(1M),
+\fBcurses\fP(3X),
+\fBterminfo\fP(\*n)
+.PP
+This describes \fBncurses\fP
+version @NCURSES_MAJOR@.@NCURSES_MINOR@ (patch @NCURSES_PATCH@).
+.SH AUTHOR
+Eric S. Raymond <esr@snark.thyrsus.com>
+and
+.br
+Thomas E. Dickey <dickey@invisible-island.net>
diff --git a/man/clear.1 b/man/clear.1
new file mode 100644
index 0000000..3ee012a
--- /dev/null
+++ b/man/clear.1
@@ -0,0 +1,163 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2016,2017 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: clear.1,v 1.27 2022/02/12 20:07:29 tom Exp $
+.TH @CLEAR@ 1 ""
+.\" these would be fallbacks for DS/DE,
+.\" but groff changed the meaning of the macros.
+.de NS
+.ie n  .sp
+.el    .sp .5
+.ie n  .in +4
+.el    .in +2
+.nf
+.ft C			\" Courier
+..
+.de NE
+.fi
+.ft R
+.ie n  .in -4
+.el    .in -2
+..
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.ds n 5
+.SH NAME
+\fB@CLEAR@\fP \- clear the terminal screen
+.SH SYNOPSIS
+\fB@CLEAR@\fR [\fB\-T\fItype\fR] [\fB\-V\fR] [\fB\-x\fR]
+.br
+.SH DESCRIPTION
+\fB@CLEAR@\fP clears your terminal's screen if this is possible,
+including the terminal's scrollback buffer
+(if the extended \*(``E3\*('' capability is defined).
+\fB@CLEAR@\fP looks in the environment for the terminal type
+given by the environment variable \fBTERM\fP,
+and then in the
+\fBterminfo\fP database to determine how to clear the screen.
+.PP
+\fB@CLEAR@\fP writes to the standard output.
+You can redirect the standard output to a file (which prevents
+\fB@CLEAR@\fP from actually clearing the screen),
+and later \fBcat\fP the file to the screen, clearing it at that point.
+.SH OPTIONS
+.PP
+.TP 5
+.B \-T \fItype\fP
+indicates the \fItype\fP of terminal.
+Normally this option is
+unnecessary, because the default is taken from the environment
+variable \fBTERM\fP.
+If \fB\-T\fP is specified, then the shell
+variables \fBLINES\fP and \fBCOLUMNS\fP will also be ignored.
+.TP
+.B \-V
+reports the version of ncurses which was used in this program, and exits.
+The options are as follows:
+.TP
+.B \-x
+do not attempt to clear the terminal's scrollback buffer
+using the extended \*(``E3\*('' capability.
+.SH HISTORY
+A \fBclear\fP command appeared in 2.79BSD dated February 24, 1979.
+Later that was provided in Unix 8th edition (1985).
+.PP
+AT&T adapted a different BSD program (\fBtset\fP) to make
+a new command (\fBtput\fP),
+and used this to replace the \fBclear\fP command with a shell script
+which calls \fBtput clear\fP, e.g.,
+.NS
+/usr/bin/tput ${1:+-T$1} clear 2> /dev/null
+exit
+.NE
+.PP
+In 1989, when Keith Bostic revised the BSD \fBtput\fP command
+to make it similar to the AT&T \fBtput\fP,
+he added a shell script for the \fBclear\fP command:
+.NS
+exec tput clear
+.NE
+.PP
+The remainder of the script in each case is a copyright notice.
+.PP
+The ncurses \fBclear\fP command began in 1995 by adapting the original
+BSD \fBclear\fP command (with terminfo, of course).
+.PP
+The \fBE3\fP extension came later:
+.bP
+In June 1999, \fBxterm\fP provided an extension to the standard control
+sequence for clearing the screen.
+Rather than clearing just the visible part of the screen using
+.NS
+printf '\\033[2J'
+.NE
+.IP
+one could clear the \fIscrollback\fP using
+.NS
+printf '\\033[\fB3\fPJ'
+.NE
+.IP
+This is documented in \fIXTerm Control Sequences\fP as a feature originating
+with \fBxterm\fP.
+.bP
+A few other terminal developers adopted the feature, e.g., PuTTY in 2006.
+.bP
+In April 2011, a Red Hat developer submitted a patch to the Linux
+kernel, modifying its console driver to do the same thing.
+The Linux change, part of the 3.0 release, did not mention \fBxterm\fP,
+although it was cited in the Red Hat bug report (#683733)
+which led to the change.
+.bP
+Again, a few other terminal developers adopted the feature.
+But the
+next relevant step was a change to the \fBclear\fP program in 2013
+to incorporate this extension.
+.bP
+In 2013, the \fBE3\fP extension was overlooked in \fB@TPUT@\fP with
+the \*(``clear\*('' parameter.
+That was addressed in 2016 by reorganizing \fB@TPUT@\fP to share
+its logic with \fB@CLEAR@\fP and \fB@TSET@\fP.
+.SH PORTABILITY
+Neither IEEE Std 1003.1/The Open  Group  Base  Specifications  Issue  7
+(POSIX.1-2008) nor X/Open Curses Issue 7 documents @TSET@ or @RESET@.
+.PP
+The latter documents \fBtput\fP, which could be used to replace this utility
+either via a shell script or by an alias (such as a symbolic link) to
+run \fB@TPUT@\fP as \fB@CLEAR@\fP.
+.SH SEE ALSO
+\fB@TPUT@\fP(1), \fBterminfo\fP(\*n), \fBxterm\fP(1).
+.PP
+This describes \fBncurses\fP
+version @NCURSES_MAJOR@.@NCURSES_MINOR@ (patch @NCURSES_PATCH@).
diff --git a/man/curs_add_wch.3x b/man/curs_add_wch.3x
new file mode 100644
index 0000000..ed84ece
--- /dev/null
+++ b/man/curs_add_wch.3x
@@ -0,0 +1,334 @@
+.\"***************************************************************************
+.\" Copyright 2019-2020,2021 Thomas E. Dickey                                *
+.\" Copyright 2001-2015,2017 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_add_wch.3x,v 1.31 2021/12/25 21:37:49 tom Exp $
+.TH curs_add_wch 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.SH NAME
+\fBadd_wch\fP,
+\fBwadd_wch\fP,
+\fBmvadd_wch\fP,
+\fBmvwadd_wch\fP,
+\fBecho_wchar\fP,
+\fBwecho_wchar\fP \- add a complex character and rendition to a \fBcurses\fP window, then advance the cursor
+.SH SYNOPSIS
+.PP
+\fB#include <curses.h>\fP
+.sp
+.B "int add_wch( const cchar_t *\fIwch\fB );"
+.br
+.B "int wadd_wch( WINDOW *\fIwin\fP, const cchar_t *\fIwch\fB );"
+.br
+.B "int mvadd_wch( int \fIy\fP, int \fIx\fP, const cchar_t *\fIwch\fB );"
+.br
+.B "int mvwadd_wch( WINDOW *\fIwin\fP, int \fIy\fP, int \fIx\fP, const cchar_t *\fIwch\fB );"
+.sp
+.B "int echo_wchar( const cchar_t *\fIwch\fB );"
+.br
+.B "int wecho_wchar( WINDOW *\fIwin\fP, const cchar_t *\fIwch\fB );"
+.br
+.SH DESCRIPTION
+.SS add_wch
+.PP
+The
+\fBadd_wch\fP,
+\fBwadd_wch\fP,
+\fBmvadd_wch\fP, and
+\fBmvwadd_wch\fP
+functions put the complex character \fIwch\fP into the given
+window at its current position,
+which is then advanced.
+These functions perform
+wrapping and special-character processing as follows:
+.bP
+If \fIwch\fP refers to a spacing character,
+then any previous character at that location is removed.
+A new character specified by \fIwch\fP is
+placed at that location with rendition specified by \fIwch\fP.
+The cursor then advances to
+the next spacing character on the screen.
+.bP
+If \fIwch\fP refers to a non-spacing character,
+all previous characters at that location are preserved.
+The non-spacing characters of \fIwch\fP
+are added to the spacing complex character,
+and the rendition specified by \fIwch\fP is ignored.
+.bP
+If the character part of \fIwch\fP is
+a tab, newline, backspace or other control character,
+the window is updated and the cursor moves as if \fBaddch\fP were called.
+.SS echo_wchar
+.PP
+The \fBecho_wchar\fP
+function is functionally equivalent to a call to
+\fBadd_wch\fP
+followed by a call to
+\fBrefresh\fP(3X).
+Similarly, the
+\fBwecho_wchar\fP
+is functionally equivalent to a call to
+\fBwadd_wch\fP
+followed by a call to
+\fBwrefresh\fP.
+The knowledge
+that only a single character is being output is taken into consideration and,
+for non-control characters, a considerable performance gain might be seen
+by using the *\fBecho\fP* functions instead of their equivalents.
+.SS Line Graphics
+Like \fBaddch\fP(3X),
+\fBaddch_wch\fP accepts symbols which make it simple to draw lines and other
+frequently used special characters.
+These symbols correspond to the same VT100 line-drawing set as
+\fBaddch\fP(3X).
+.PP
+.TS
+l l l l l
+l l l l l
+_ _ _ _ _
+lw(1.5i) lw5 lw5 lw5 lw20.
+\fBACS\fP	\fBUnicode\fP	\fBASCII\fP	\fBacsc\fP	\fBGlyph\fP
+\fBName\fP	\fBDefault\fP	\fBDefault\fP	\fBchar\fP	\fBName\fP
+WACS_BLOCK	0x25ae 	#	0	solid square block
+WACS_BOARD	0x2592 	#	h	board of squares
+WACS_BTEE	0x2534 	+	v	bottom tee
+WACS_BULLET	0x00b7 	o	~	bullet
+WACS_CKBOARD	0x2592 	:	a	checker board (stipple)
+WACS_DARROW	0x2193 	v	.	arrow pointing down
+WACS_DEGREE	0x00b0 	'	f	degree symbol
+WACS_DIAMOND	0x25c6 	+	`	diamond
+WACS_GEQUAL	0x2265 	>	>	greater-than-or-equal-to
+WACS_HLINE	0x2500 	\-	q	horizontal line
+WACS_LANTERN	0x2603 	#	i	lantern symbol
+WACS_LARROW	0x2190 	<	,	arrow pointing left
+WACS_LEQUAL	0x2264 	<	y	less-than-or-equal-to
+WACS_LLCORNER	0x2514 	+	m	lower left-hand corner
+WACS_LRCORNER	0x2518 	+	j	lower right-hand corner
+WACS_LTEE	0x2524 	+	t	left tee
+WACS_NEQUAL	0x2260 	!	|	not-equal
+WACS_PI	0x03c0 	*	{	greek pi
+WACS_PLMINUS	0x00b1 	#	g	plus/minus
+WACS_PLUS	0x253c 	+	n	plus
+WACS_RARROW	0x2192 	>	+	arrow pointing right
+WACS_RTEE	0x251c 	+	u	right tee
+WACS_S1	0x23ba 	\-	o	scan line 1
+WACS_S3	0x23bb 	\-	p	scan line 3
+WACS_S7	0x23bc 	\-	r	scan line 7
+WACS_S9	0x23bd 	\&_	s	scan line 9
+WACS_STERLING	0x00a3 	f	}	pound-sterling symbol
+WACS_TTEE	0x252c 	+	w	top tee
+WACS_UARROW	0x2191  	^	\-	arrow pointing up
+WACS_ULCORNER	0x250c 	+	l	upper left-hand corner
+WACS_URCORNER	0x2510 	+	k	upper right-hand corner
+WACS_VLINE	0x2502 	|	x	vertical line
+.TE
+.PP
+The wide-character configuration of ncurses also defines symbols
+for thick lines (\fBacsc\fP \*(``J\*('' to \*(``V\*(''):
+.TS
+l l l l l
+l l l l l
+_ _ _ _ _
+lw(1.5i) lw5 lw5 lw5 lw20.
+\fBACS\fP	\fBUnicode\fP	\fBASCII\fP	\fBacsc\fP	\fBGlyph\fP
+\fBName\fP	\fBDefault\fP	\fBDefault\fP	\fBchar\fP	\fBName\fP
+WACS_T_BTEE	0x253b	+	V	thick tee pointing up
+WACS_T_HLINE	0x2501	-	Q	thick horizontal line
+WACS_T_LLCORNER	0x2517	+	M	thick lower left corner
+WACS_T_LRCORNER	0x251b	+	J	thick lower right corner
+WACS_T_LTEE	0x252b	+	T	thick tee pointing right
+WACS_T_PLUS	0x254b	+	N	thick large plus
+WACS_T_RTEE	0x2523	+	U	thick tee pointing left
+WACS_T_TTEE	0x2533	+	W	thick tee pointing down
+WACS_T_ULCORNER	0x250f	+	L	thick upper left corner
+WACS_T_URCORNER	0x2513	+	K	thick upper right corner
+WACS_T_VLINE	0x2503	|	X	thick vertical line
+.TE
+.PP
+and for double-lines (\fBacsc\fP \*(``A\*('' to \*(``I\*(''):
+.PP
+.TS
+l l l l l
+l l l l l
+_ _ _ _ _
+lw(1.5i) lw5 lw5 lw5 lw20.
+\fBACS\fP	\fBUnicode\fP	\fBASCII\fP	\fBacsc\fP	\fBGlyph\fP
+\fBName\fP	\fBDefault\fP	\fBDefault\fP	\fBchar\fP	\fBName\fP
+WACS_D_BTEE	0x2569	+	H	double tee pointing up
+WACS_D_HLINE	0x2550	-	R	double horizontal line
+WACS_D_LLCORNER	0x255a	+	D	double lower left corner
+WACS_D_LRCORNER	0x255d	+	A	double lower right corner
+WACS_D_LTEE	0x2560	+	F	double tee pointing right
+WACS_D_PLUS	0x256c	+	E	double large plus
+WACS_D_RTEE	0x2563	+	G	double tee pointing left
+WACS_D_TTEE	0x2566	+	I	double tee pointing down
+WACS_D_ULCORNER	0x2554	+	C	double upper left corner
+WACS_D_URCORNER	0x2557	+	B	double upper right corner
+WACS_D_VLINE	0x2551	|	Y	double vertical line
+.TE
+.PP
+Unicode's descriptions for these characters differs slightly from ncurses,
+by introducing the term \*(``light\*('' (along with less important details).
+Here are its descriptions for the normal, thick, and double horizontal lines:
+.bP
+U+2500 BOX DRAWINGS LIGHT HORIZONTAL
+.bP
+U+2501 BOX DRAWINGS HEAVY HORIZONTAL
+.bP
+U+2550 BOX DRAWINGS DOUBLE HORIZONTAL
+.SH RETURN VALUE
+.PP
+All routines return the integer \fBERR\fP upon failure and \fBOK\fP on success.
+.PP
+X/Open does not define any error conditions.
+This implementation returns an error
+.bP
+if the window pointer is null or
+.bP
+if it is not possible to add a complete character in the window.
+.PP
+The latter may be due to different causes:
+.bP
+If \fBscrollok\fP is not enabled,
+writing a character at the lower right margin succeeds.
+However, an error is returned because
+it is not possible to wrap to a new line
+.bP
+If an error is detected when converting a multibyte character to a sequence
+of bytes,
+or if it is not possible to add all of the resulting bytes in the window,
+an error is returned.
+.PP
+Functions with a \*(``mv\*('' prefix first perform a cursor movement using
+\fBwmove\fP, and return an error if the position is outside the window,
+or if the window pointer is null.
+.SH NOTES
+.PP
+Note that
+\fBadd_wch\fP,
+\fBmvadd_wch\fP,
+\fBmvwadd_wch\fP, and
+\fBecho_wchar\fP
+may be macros.
+.SH PORTABILITY
+.PP
+All of these functions are described in the XSI Curses standard, Issue 4.
+The defaults specified for line-drawing characters apply in the POSIX locale.
+.PP
+X/Open Curses makes it clear that the WACS_ symbols should be defined as
+a pointer to \fBcchar_t\fP data, e.g., in the discussion of \fBborder_set\fP.
+A few implementations are problematic:
+.bP
+NetBSD curses defines the symbols as a \fBwchar_t\fP within a \fBcchar_t\fP.
+.bP
+HPUX curses equates some of the \fBACS_\fP symbols
+to the analogous \fBWACS_\fP symbols as if the \fBACS_\fP symbols were
+wide characters.
+The misdefined symbols are the arrows
+and other symbols which are not used for line-drawing.
+.PP
+X/Open Curses does not define symbols for thick- or double-lines.
+SVr4 curses implementations defined their line-drawing symbols in
+terms of intermediate symbols.
+This implementation extends those symbols, providing new definitions
+which are not in the SVr4 implementations.
+.PP
+Not all Unicode-capable terminals provide support for VT100-style
+alternate character sets (i.e., the \fBacsc\fP capability),
+with their corresponding line-drawing characters.
+X/Open Curses did not address the aspect of integrating Unicode with
+line-drawing characters.
+Existing implementations of Unix curses (AIX, HPUX, Solaris)
+use only the \fBacsc\fP character-mapping to provide this feature.
+As a result, those implementations can only use single-byte line-drawing
+characters.
+Ncurses 5.3 (2002) provided a table of Unicode values to solve these problems.
+NetBSD curses incorporated that table in 2010.
+.PP
+In this implementation, the Unicode values are used instead of the
+terminal description's \fBacsc\fP mapping as discussed in ncurses(3X)
+for the environment variable \fBNCURSES_NO_UTF8_ACS\fP.
+In contrast, for the same cases, the line-drawing characters
+described in \fBcurs_addch\fP(3X) will use only the ASCII default values.
+.PP
+Having Unicode available does not solve all of the problems with
+line-drawing for curses:
+.bP
+The closest Unicode equivalents to the
+VT100 graphics \fIS1\fP, \fIS3\fP, \fIS7\fP and \fIS9\fP
+frequently are not displayed at
+the regular intervals which the terminal used.
+.bP
+The \fIlantern\fP is a special case.
+It originated with the AT&T 4410 terminal in the early 1980s.
+There is no accessible documentation depicting the lantern symbol
+on the AT&T terminal.
+.IP
+Lacking documentation, most readers assume that a \fIstorm lantern\fP
+was intended.
+But there are several possibilities, all with problems.
+.IP
+Unicode 6.0 (2010) does provide two lantern symbols: U+1F383 and U+1F3EE.
+Those were not available in 2002, and are irrelevant since
+they lie outside the BMP and as a result are not generally available
+in terminals.
+They are not storm lanterns, in any case.
+.IP
+Most \fIstorm lanterns\fP have a tapering glass chimney
+(to guard against tipping);
+some have a wire grid protecting the chimney.
+.IP
+For the tapering appearance, \[u2603] U+2603 was adequate.
+In use on a terminal, no one can tell what the image represents.
+Unicode calls it a snowman.
+.IP
+Others have suggested these alternatives:
+\[sc] U+00A7 (section mark),
+\[u0398] U+0398 (theta),
+\[u03A6] U+03A6 (phi),
+\[u03B4] U+03B4 (delta),
+\[u2327] U+2327 (x in a rectangle),
+\[u256C] U+256C (forms double vertical and horizontal), and
+\[u2612] U+2612 (ballot box with x).
+.SH SEE ALSO
+.na
+.PP
+\fBcurses\fP(3X),
+\fBcurs_addch\fP(3X),
+\fBcurs_attr\fP(3X),
+\fBcurs_clear\fP(3X),
+\fBcurs_outopts\fP(3X),
+\fBcurs_refresh\fP(3X),
+\fBputwc\fP(3)
diff --git a/man/curs_add_wchstr.3x b/man/curs_add_wchstr.3x
new file mode 100644
index 0000000..1a16254
--- /dev/null
+++ b/man/curs_add_wchstr.3x
@@ -0,0 +1,123 @@
+.\"***************************************************************************
+.\" Copyright 2019-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 2002-2012,2017 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_add_wchstr.3x,v 1.19 2022/02/12 20:07:29 tom Exp $
+.TH curs_add_wchstr 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.na
+.hy 0
+.SH NAME
+\fBadd_wchstr\fP,
+\fBadd_wchnstr\fP,
+\fBwadd_wchstr\fP,
+\fBwadd_wchnstr\fP,
+\fBmvadd_wchstr\fP,
+\fBmvadd_wchnstr\fP,
+\fBmvwadd_wchstr\fP,
+\fBmvwadd_wchnstr\fP \- add an array of complex characters (and attributes) to a curses window
+.ad
+.hy
+.SH SYNOPSIS
+.nf
+\fB#include <curses.h>\fP
+.PP
+\fBint add_wchstr(const cchar_t *\fIwchstr\fB);\fR
+.br
+\fBint add_wchnstr(const cchar_t *\fIwchstr\fB, int \fIn\fB);\fR
+.br
+\fBint wadd_wchstr(WINDOW *\fR \fIwin\fB, const cchar_t *\fIwchstr\fB);\fR
+.br
+\fBint wadd_wchnstr(WINDOW *\fR \fIwin\fB, const cchar_t *\fIwchstr\fB, int \fIn\fB);\fR
+.sp
+\fBint mvadd_wchstr(int \fIy\fB, int \fIx\fB, const cchar_t *\fIwchstr\fB);\fR
+.br
+\fBint mvadd_wchnstr(int \fIy\fB, int \fIx\fB, const cchar_t *\fIwchstr\fB, int \fIn\fB);\fR
+.br
+\fBint mvwadd_wchstr(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB, const cchar_t *\fIwchstr\fB);\fR
+.br
+\fBint mvwadd_wchnstr(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB, const cchar_t *\fIwchstr\fB, int \fIn\fB);\fR
+.fi
+.SH DESCRIPTION
+These functions copy the (null-terminated)
+array of complex characters \fIwchstr\fP
+into the window image structure
+starting at the current cursor position.
+The four functions with \fIn\fP as the last
+argument copy at most \fIn\fP elements,
+but no more than will fit on the line.
+If \fBn\fP=\fB\-1\fP then the whole array is copied,
+to the maximum number of characters that will fit on the line.
+.PP
+The window cursor is \fInot\fP advanced.
+These functions work faster than \fBwaddnstr\fP.
+On the other hand:
+.bP
+they do not perform checking
+(such as for the newline, backspace, or carriage return characters),
+.bP
+they do not advance the current cursor position,
+.bP
+they do not expand other control characters to ^-escapes, and
+.bP
+they truncate the string if it crosses the right margin,
+rather than wrapping it around to the new line.
+.PP
+These functions end successfully
+on encountering a null \fBcchar_t\fP, or
+when they have filled the current line.
+If a complex character cannot completely fit at the end of the current line,
+the remaining columns are filled with the background character and rendition.
+.SH RETURN VALUE
+All functions return the integer \fBERR\fP upon failure and \fBOK\fP on success.
+.PP
+X/Open does not define any error conditions.
+This implementation returns an error
+if the window pointer is null.
+.PP
+Functions with a \*(``mv\*('' prefix first perform a cursor movement using
+\fBwmove\fP, and return an error if the position is outside the window,
+or if the window pointer is null.
+.SH NOTES
+All functions except \fBwadd_wchnstr\fP may be macros.
+.SH PORTABILITY
+These entry points are described in the XSI Curses standard, Issue 4.
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBcurs_addwstr\fP(3X).
+.PP
+Comparable functions in the narrow-character (ncurses) library are
+described in
+\fBcurs_addchstr\fP(3X).
diff --git a/man/curs_addch.3x b/man/curs_addch.3x
new file mode 100644
index 0000000..fe591f9
--- /dev/null
+++ b/man/curs_addch.3x
@@ -0,0 +1,314 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2015,2017 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_addch.3x,v 1.59 2022/02/12 20:07:29 tom Exp $
+.TH curs_addch 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.SH NAME
+\fBaddch\fP,
+\fBwaddch\fP,
+\fBmvaddch\fP,
+\fBmvwaddch\fP,
+\fBechochar\fP,
+\fBwechochar\fP \- add a character (with attributes) to a \fBcurses\fP window, then advance the cursor
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.PP
+\fBint addch(const chtype \fIch\fB);\fR
+.br
+\fBint waddch(WINDOW *\fIwin\fB, const chtype \fIch\fB);\fR
+.br
+\fBint mvaddch(int \fIy\fB, int \fIx\fB, const chtype \fIch\fB);\fR
+.br
+\fBint mvwaddch(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB, const chtype \fIch\fB);\fR
+.sp
+\fBint echochar(const chtype \fIch\fB);\fR
+.br
+\fBint wechochar(WINDOW *\fIwin\fB, const chtype \fIch\fB);\fR
+.br
+.SH DESCRIPTION
+.SS Adding characters
+The \fBaddch\fP, \fBwaddch\fP, \fBmvaddch\fP and \fBmvwaddch\fP routines put
+the character \fIch\fP into the given window at its current window position,
+which is then advanced.
+They are analogous to \fBputchar\fP(3) in \fBstdio\fP(3).
+If the advance is at the right margin:
+.bP
+The cursor automatically wraps to the beginning of the next line.
+.bP
+At the bottom of the current scrolling region,
+and if \fBscrollok\fP is enabled,
+the scrolling region is scrolled up one line.
+.bP
+If \fBscrollok\fP is not enabled,
+writing a character at the lower right margin succeeds.
+However, an error is returned because
+it is not possible to wrap to a new line
+.PP
+If \fIch\fP is a tab, newline, carriage return or backspace,
+the cursor is moved appropriately within the window:
+.bP
+Backspace moves the cursor one character left; at the left
+edge of a window it does nothing.
+.bP
+Carriage return moves the cursor to the window left margin on the current line.
+.bP
+Newline does a \fBclrtoeol\fP,
+then moves the cursor to the window left margin on the next line,
+scrolling the window if on the last line.
+.bP
+Tabs are considered to be at every eighth column.
+The tab interval may be altered by setting the \fBTABSIZE\fP variable.
+.PP
+If \fIch\fP is any other nonprintable character,
+it is drawn in printable form,
+i.e., the \fB^\fIX\fR notation used by \fBunctrl\fR(3X).
+Calling \fBwinch\fP after adding a
+nonprintable character does not return the character itself,
+but instead returns the printable representation of the character.
+.PP
+Video attributes can be combined with a character argument passed to
+\fBaddch\fP or related functions by logical-ORing them into the character.
+(Thus, text, including attributes, can be copied from one place to another
+using \fBinch\fP(3X) and \fBaddch\fP.)  See the \fBcurs_attr\fP(3X) page for
+values of predefined video attribute constants that can be usefully OR'ed
+into characters.
+.SS Echoing characters
+.PP
+The \fBechochar\fP and \fBwechochar\fP routines are equivalent to a call to
+\fBaddch\fP followed by a call to \fBrefresh\fP(3X), or a call to \fBwaddch\fP
+followed by a call to \fBwrefresh\fP.
+The knowledge that only a single
+character is being output is used and, for non-control characters, a
+considerable performance gain may be seen by using these routines instead of
+their equivalents.
+.SS Line Graphics
+The following variables may be used to add line drawing characters to the
+screen with routines of the \fBaddch\fP family.
+The default character listed
+below is used if the \fBacsc\fP capability does not define a terminal-specific
+replacement for it,
+or if the terminal and locale configuration requires Unicode but the
+library is unable to use Unicode.
+.PP
+The names are taken from VT100 nomenclature.
+.PP
+.TS
+l l l l
+l l l l
+_ _ _ _
+l l l l.
+\fBACS\fP	\fBACS\fP	\fBacsc\fP	\fBGlyph\fP
+\fBName\fP	\fBDefault\fP	\fBchar\fP	\fBName\fP
+ACS_BLOCK	#	0	solid square block
+ACS_BOARD	#	h	board of squares
+ACS_BTEE	+	v	bottom tee
+ACS_BULLET	o	~	bullet
+ACS_CKBOARD	:	a	checker board (stipple)
+ACS_DARROW	v	.	arrow pointing down
+ACS_DEGREE	'	f	degree symbol
+ACS_DIAMOND	+	`	diamond
+ACS_GEQUAL	>	>	greater-than-or-equal-to
+ACS_HLINE	\-	q	horizontal line
+ACS_LANTERN	#	i	lantern symbol
+ACS_LARROW	<	,	arrow pointing left
+ACS_LEQUAL	<	y	less-than-or-equal-to
+ACS_LLCORNER	+	m	lower left-hand corner
+ACS_LRCORNER	+	j	lower right-hand corner
+ACS_LTEE	+	t	left tee
+ACS_NEQUAL	!	|	not-equal
+ACS_PI	*	{	greek pi
+ACS_PLMINUS	#	g	plus/minus
+ACS_PLUS	+	n	plus
+ACS_RARROW	>	+	arrow pointing right
+ACS_RTEE	+	u	right tee
+ACS_S1	\-	o	scan line 1
+ACS_S3	\-	p	scan line 3
+ACS_S7	\-	r	scan line 7
+ACS_S9	\&_	s	scan line 9
+ACS_STERLING	f	}	pound-sterling symbol
+ACS_TTEE	+	w	top tee
+ACS_UARROW	^	\-	arrow pointing up
+ACS_ULCORNER	+	l	upper left-hand corner
+ACS_URCORNER	+	k	upper right-hand corner
+ACS_VLINE	|	x	vertical line
+.TE
+.SH RETURN VALUE
+All routines return the integer \fBERR\fP upon failure and \fBOK\fP on success
+(the SVr4 manuals specify only
+\*(``an integer value other than \fBERR\fP\*('') upon successful completion,
+unless otherwise noted in the preceding routine descriptions.
+.PP
+Functions with a \*(``mv\*('' prefix first perform a cursor movement using
+\fBwmove\fP, and return an error if the position is outside the window,
+or if the window pointer is null.
+.PP
+If it is not possible to add a complete character,
+an error is returned:
+.bP
+If \fBscrollok\fP is not enabled,
+writing a character at the lower right margin succeeds.
+However, an error is returned because
+it is not possible to wrap to a new line
+.bP
+If an error is detected when converting a multibyte character to a sequence
+of bytes,
+or if it is not possible to add all of the resulting bytes in the window,
+an error is returned.
+.SH NOTES
+Note that \fBaddch\fP, \fBmvaddch\fP, \fBmvwaddch\fP, and
+\fBechochar\fP may be macros.
+.SH PORTABILITY
+All these functions are described in the XSI Curses standard, Issue 4.
+The defaults specified for forms-drawing characters apply in the POSIX locale.
+.SS ACS Symbols
+.LP
+X/Open Curses states that the \fBACS_\fP definitions are \fBchar\fP constants.
+For the wide-character implementation (see \fBcurs_add_wch\fP),
+there are analogous \fBWACS_\fP definitions which are \fBcchar_t\fP constants.
+Some implementations are problematic:
+.bP
+Some implementations define the ACS symbols to a constant
+(such as Solaris), while others define those to entries in an array.
+.IP
+This implementation uses an array \fBacs_map\fP, as done in SVr4 curses.
+NetBSD also uses an array, actually named \fB_acs_char\fP, with a \fB#define\fP
+for compatibility.
+.bP
+HPUX curses equates some of the \fBACS_\fP symbols
+to the analogous \fBWACS_\fP symbols as if the \fBACS_\fP symbols were
+wide characters.
+The misdefined symbols are the arrows
+and other symbols which are not used for line-drawing.
+.bP
+X/Open Curses (issues 2 through 7) has a typographical error
+for the ACS_LANTERN symbol, equating its \*(``VT100+ Character\*(''
+to \fBI\fP (capital I), while the header files for SVr4 curses
+and the various implementations use \fBi\fP (lowercase).
+.IP
+None of the terminal descriptions on Unix platforms use uppercase-I,
+except for Solaris (i.e., \fBscreen\fP's terminal description,
+apparently based on the X/Open documentation around 1995).
+On the other hand, the terminal description \fIgs6300\fP
+(AT&T PC6300 with EMOTS Terminal Emulator) uses lowercase-i.
+.LP
+Some ACS symbols
+(ACS_S3,
+ACS_S7,
+ACS_LEQUAL,
+ACS_GEQUAL,
+ACS_PI,
+ACS_NEQUAL,
+ACS_STERLING)
+were not documented in
+any publicly released System V.
+However, many publicly available terminfos
+include \fBacsc\fP strings in which their key characters (pryz{|}) are
+embedded, and a second-hand list of their character descriptions has come
+to light.
+The ACS-prefixed names for them were invented for \fBncurses\fP(3X).
+.LP
+The \fIdisplayed\fP values for the \fBACS_\fP and \fBWACS_\fP constants
+depend on
+.bP
+the library configuration, i.e., \fBncurses\fP versus \fBncursesw\fP,
+where the latter is capable of displaying Unicode while the former is not, and
+.bP
+whether the \fIlocale\fP uses UTF-8 encoding.
+.LP
+In certain cases, the terminal is unable to display line-drawing characters
+except by using UTF-8 (see the discussion of \fBNCURSES_NO_UTF8_ACS\fP in
+ncurses(3X)).
+.SS Character Set
+X/Open Curses assumes that the parameter passed to \fBwaddch\fP contains
+a single character.
+As discussed in \fBcurs_attr\fP(3X), that character may have been
+more than eight bits in an SVr3 or SVr4 implementation,
+but in the X/Open Curses model, the details are not given.
+The important distinction between SVr4 curses and X/Open Curses is
+that the non-character information (attributes and color) was
+separated from the character information which is packed in a \fBchtype\fP
+to pass to \fBwaddch\fP.
+.PP
+In this implementation, \fBchtype\fP holds an eight-bit character.
+But ncurses allows multibyte characters to be passed in a succession
+of calls to \fBwaddch\fP.
+The other implementations do not do this;
+a call to \fBwaddch\fP passes exactly one character
+which may be rendered as one or more cells on the screen
+depending on whether it is printable.
+.PP
+Depending on the locale settings,
+ncurses will inspect the byte passed in each call to \fBwaddch\fP,
+and check if the latest call will continue a multibyte sequence.
+When a character is \fIcomplete\fP,
+ncurses displays the character and moves to the next position in the screen.
+.PP
+If the calling application interrupts the succession of bytes in
+a multibyte character by moving the current location (e.g., using \fBwmove\fP),
+ncurses discards the partially built character,
+starting over again.
+.PP
+For portability to other implementations,
+do not rely upon this behavior:
+.bP
+check if a character can be represented as a single byte in the current locale
+before attempting call \fBwaddch\fP, and
+.bP
+call \fBwadd_wch\fP for characters which cannot be handled by \fBwaddch\fP.
+.SS TABSIZE
+.LP
+The \fBTABSIZE\fP variable is implemented in SVr4 and other versions of curses,
+but is not part of X/Open curses
+(see \fBcurs_variables\fP(3X) for more details).
+.LP
+If \fIch\fP is a carriage return,
+the cursor is moved to the beginning of the current row of the window.
+This is true of other implementations, but is not documented.
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBcurs_attr\fP(3X),
+\fBcurs_clear\fP(3X),
+\fBcurs_inch\fP(3X),
+\fBcurs_outopts\fP(3X),
+\fBcurs_refresh\fP(3X),
+\fBcurs_variables\fP(3X),
+\fBputc\fP(3).
+.PP
+Comparable functions in the wide-character (ncursesw) library are
+described in
+\fBcurs_add_wch\fP(3X).
diff --git a/man/curs_addchstr.3x b/man/curs_addchstr.3x
new file mode 100644
index 0000000..aba4c13
--- /dev/null
+++ b/man/curs_addchstr.3x
@@ -0,0 +1,117 @@
+.\"***************************************************************************
+.\" Copyright 2019-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2012,2017 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_addchstr.3x,v 1.25 2022/02/12 20:07:29 tom Exp $
+.TH curs_addchstr 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.na
+.hy 0
+.SH NAME
+\fBaddchstr\fP,
+\fBaddchnstr\fP,
+\fBwaddchstr\fP,
+\fBwaddchnstr\fP,
+\fBmvaddchstr\fP,
+\fBmvaddchnstr\fP,
+\fBmvwaddchstr\fP,
+\fBmvwaddchnstr\fP \- add a string of characters (and attributes) to a \fBcurses\fP window
+.ad
+.hy
+.SH SYNOPSIS
+.nf
+\fB#include <curses.h>\fP
+.PP
+\fBint addchstr(const chtype *\fIchstr\fB);\fR
+.br
+\fBint addchnstr(const chtype *\fIchstr\fB, int \fIn\fB);\fR
+.br
+\fBint waddchstr(WINDOW *\fIwin\fB, const chtype *\fIchstr\fB);\fR
+.br
+\fBint waddchnstr(WINDOW *\fIwin\fB, const chtype *\fIchstr\fB, int \fIn\fB);\fR
+.sp
+\fBint mvaddchstr(int \fIy\fB, int \fIx\fB, const chtype *\fIchstr\fB);\fR
+.br
+\fBint mvaddchnstr(int \fIy\fB, int \fIx\fB, const chtype *\fIchstr\fB, int \fIn\fB);\fR
+.br
+\fBint mvwaddchstr(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB, const chtype *\fIchstr\fB);\fR
+.br
+\fBint mvwaddchnstr(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB, const chtype *\fIchstr\fB, int \fIn\fB);\fR
+.fi
+.SH DESCRIPTION
+These functions copy the (null-terminated)
+\fIchstr\fP array
+into the window image structure
+starting at the current cursor position.
+The four functions with \fIn\fP as the last
+argument copy at most \fIn\fP elements,
+but no more than will fit on the line.
+If \fBn\fP=\fB\-1\fP then the whole array is copied,
+to the maximum number of characters that will fit on the line.
+.PP
+The window cursor is \fInot\fP advanced.
+These functions work faster than \fBwaddnstr\fP.
+On the other hand:
+.bP
+they do not perform checking
+(such as for the newline, backspace, or carriage return characters),
+.bP
+they do not advance the current cursor position,
+.bP
+they do not expand other control characters to ^-escapes, and
+.bP
+they truncate the string if it crosses the right margin,
+rather than wrapping it around to the new line.
+.SH RETURN VALUE
+All functions return the integer \fBERR\fP upon failure and \fBOK\fP on success.
+.PP
+X/Open does not define any error conditions.
+This implementation returns an error
+if the window pointer is null.
+.PP
+Functions with a \*(``mv\*('' prefix first perform a cursor movement using
+\fBwmove\fP, and return an error if the position is outside the window,
+or if the window pointer is null.
+.SH NOTES
+All functions except \fBwaddchnstr\fP may be macros.
+.SH PORTABILITY
+These entry points are described in the XSI Curses standard, Issue 4.
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBcurs_addstr\fP(3X).
+.PP
+Comparable functions in the wide-character (ncursesw) library are
+described in
+\fBcurs_add_wchstr\fP(3X).
diff --git a/man/curs_addstr.3x b/man/curs_addstr.3x
new file mode 100644
index 0000000..6820ce0
--- /dev/null
+++ b/man/curs_addstr.3x
@@ -0,0 +1,119 @@
+.\"***************************************************************************
+.\" Copyright 2019-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2012,2017 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_addstr.3x,v 1.26 2022/02/12 20:07:29 tom Exp $
+.TH curs_addstr 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.na
+.hy 0
+.SH NAME
+\fBaddstr\fP,
+\fBaddnstr\fP,
+\fBwaddstr\fP,
+\fBwaddnstr\fP,
+\fBmvaddstr\fP,
+\fBmvaddnstr\fP,
+\fBmvwaddstr\fP,
+\fBmvwaddnstr\fP \- add a string of characters to a \fBcurses\fP window and advance cursor
+.ad
+.hy
+.SH SYNOPSIS
+.nf
+\fB#include <curses.h>\fP
+.PP
+\fBint addstr(const char *\fIstr\fB);\fR
+.br
+\fBint addnstr(const char *\fIstr\fB, int \fIn\fB);\fR
+.br
+\fBint waddstr(WINDOW *\fIwin\fB, const char *\fIstr\fB);\fR
+.br
+\fBint waddnstr(WINDOW *\fIwin\fB, const char *\fIstr\fB, int \fIn\fB);\fR
+.sp
+\fBint mvaddstr(int \fIy\fB, int \fIx\fB, const char *\fIstr\fB);\fR
+.br
+\fBint mvaddnstr(int \fIy\fB, int \fIx\fB, const char *\fIstr\fB, int \fIn\fB);\fR
+.br
+\fBint mvwaddstr(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB, const char *\fIstr\fB);\fR
+.br
+\fBint mvwaddnstr(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB, const char *\fIstr, int \fIn\fB);\fR
+.fi
+.SH DESCRIPTION
+These functions write the (null-terminated) character string
+\fIstr\fP on the given window.
+It is similar to calling \fBwaddch\fP once for each byte in the string.
+.PP
+The \fImv\fP functions perform cursor movement once, before writing any
+characters.
+Thereafter, the cursor is advanced as a side-effect of writing to the window.
+.PP
+The four functions with \fIn\fP as the last argument
+write at most \fIn\fP bytes,
+or until a terminating null is reached.
+If \fIn\fP is \-1, then the entire string will be added.
+.SH RETURN VALUE
+All functions return the integer \fBERR\fP upon failure and \fBOK\fP on success.
+.PP
+X/Open does not define any error conditions.
+This implementation returns an error
+.bP
+if the window pointer is null or
+.bP
+if the string pointer is null or
+.bP
+if the corresponding calls to \fBwaddch\fP return an error.
+.PP
+Functions with a \*(``mv\*('' prefix first perform a cursor movement using
+\fBwmove\fP, and return an error if the position is outside the window,
+or if the window pointer is null.
+If an error is returned by the \fBwmove\fP,
+no characters are added to the window.
+.PP
+If an error is returned by \fBwaddch\fP
+(e.g.,
+because the window is not large enough,
+or an illegal byte sequence was detected)
+only part of the string may be added.
+Aside from that,
+there is a special case in \fBwaddch\fP where an error may be
+returned after successfully writing a character to the lower-right corner
+of a window when \fBscrollok\fP is disabled.
+.SH NOTES
+All of these functions except \fBwaddnstr\fP may be macros.
+.SH PORTABILITY
+These functions are described in the XSI Curses standard, Issue 4.
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBcurs_addch\fP(3X).
diff --git a/man/curs_addwstr.3x b/man/curs_addwstr.3x
new file mode 100644
index 0000000..7c3e041
--- /dev/null
+++ b/man/curs_addwstr.3x
@@ -0,0 +1,109 @@
+.\"***************************************************************************
+.\" Copyright 2019-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 2002-2012,2017 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_addwstr.3x,v 1.18 2022/02/12 20:07:29 tom Exp $
+.TH curs_addwstr 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.na
+.hy 0
+.SH NAME
+\fBaddwstr\fP,
+\fBaddnwstr\fP,
+\fBwaddwstr\fP,
+\fBwaddnwstr\fP,
+\fBmvaddwstr\fP,
+\fBmvaddnwstr\fP,
+\fBmvwaddwstr\fP,
+\fBmvwaddnwstr\fP \- add a string of wide characters to a \fBcurses\fP window and advance cursor
+.ad
+.hy
+.SH SYNOPSIS
+.nf
+\fB#include <curses.h>\fP
+.PP
+\fBint addwstr(const wchar_t *\fIwstr\fB);\fR
+.br
+\fBint addnwstr(const wchar_t *\fIwstr\fB, int \fIn\fB);\fR
+.br
+\fBint waddwstr(WINDOW *\fIwin\fB, const wchar_t *\fIwstr\fB);\fR
+.br
+\fBint waddnwstr(WINDOW *\fIwin\fB, const wchar_t *\fIwstr\fB, int \fIn\fB);\fR
+.sp
+\fBint mvaddwstr(int \fIy\fB, int \fIx\fB, const wchar_t *\fIwstr\fB);\fR
+.br
+\fBint mvaddnwstr(int \fIy\fB, int \fIx\fB, const wchar_t *\fIwstr\fB, int \fIn\fB);\fR
+.br
+\fBint mvwaddwstr(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB, const wchar_t *\fIwstr\fB);\fR
+.br
+\fBint mvwaddnwstr(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB, const wchar_t *\fIwstr\fB, int \fIn\fB);\fR
+.fi
+.SH DESCRIPTION
+These functions write the characters of the
+(null-terminated) \fBwchar_t\fP character string
+\fIwstr\fP on the given window.
+It is similar to constructing a \fBcchar_t\fP for each wchar_t in the string,
+then calling \fBwadd_wch\fP for the resulting \fBcchar_t\fP.
+.PP
+The \fImv\fP functions perform cursor movement once, before writing any
+characters.
+Thereafter, the cursor is advanced as a side-effect of writing to the window.
+.PP
+The four functions with \fIn\fP as the last argument
+write at most \fIn\fP \fBwchar_t\fP characters,
+or until a terminating null is reached.
+If \fIn\fP is \-1, then the entire string will be added.
+.SH RETURN VALUE
+All functions return the integer \fBERR\fP upon failure and \fBOK\fP on success.
+.PP
+X/Open does not define any error conditions.
+This implementation returns an error
+.bP
+if the window pointer is null or
+.bP
+if the string pointer is null or
+.bP
+if the corresponding calls to \fBwadd_wch\fP return an error.
+.PP
+Functions with a \*(``mv\*('' prefix first perform a cursor movement using
+\fBwmove\fP, and return an error if the position is outside the window,
+or if the window pointer is null.
+.SH NOTES
+All of these functions except \fBwaddnwstr\fP may be macros.
+.SH PORTABILITY
+These functions are described in the XSI Curses standard, Issue 4.
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBcurs_add_wch\fP(3X)
diff --git a/man/curs_attr.3x b/man/curs_attr.3x
new file mode 100644
index 0000000..ac448b4
--- /dev/null
+++ b/man/curs_attr.3x
@@ -0,0 +1,618 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2016,2017 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_attr.3x,v 1.72 2022/04/16 19:18:32 tom Exp $
+.TH curs_attr 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de NS
+.ie n  .sp
+.el    .sp .5
+.ie n  .in +4
+.el    .in +2
+.nf
+.ft C			\" Courier
+..
+.de NE
+.fi
+.ft R
+.ie n  .in -4
+.el    .in -2
+..
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.na
+.hy 0
+.\" ---------------------------------------------------------------------------
+.SH NAME
+.\" attr_get
+\fBattr_get\fP,
+\fBwattr_get\fP,
+\fBattr_set\fP,
+\fBwattr_set\fP,
+.\" .br
+\fBattr_off\fP,
+\fBwattr_off\fP,
+\fBattr_on\fP,
+\fBwattr_on\fP,
+.\" .br
+\fBattroff\fP,
+\fBwattroff\fP,
+\fBattron\fP,
+\fBwattron\fP,
+\fBattrset\fP,
+\fBwattrset\fP,
+.\" .br
+\fBchgat\fP,
+\fBwchgat\fP,
+\fBmvchgat\fP,
+\fBmvwchgat\fP,
+.\" .br
+\fBcolor_set\fP,
+\fBwcolor_set\fP,
+.\" .br
+\fBstandend\fP,
+\fBwstandend\fP,
+\fBstandout\fP,
+\fBwstandout\fP \- \fBcurses\fP character and window attribute control routines
+.ad
+.hy
+.\" ---------------------------------------------------------------------------
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBint attr_get(attr_t *\fIattrs\fB, short *\fIpair\fB, void *\fIopts\fB);\fR
+.br
+\fBint wattr_get(WINDOW *\fIwin\fB, attr_t *\fIattrs\fB, short *\fIpair\fB,\fR \fBvoid *\fIopts\fB);\fR
+.br
+\fBint attr_set(attr_t \fIattrs\fB, short \fIpair\fB, void *\fIopts\fB);\fR
+.br
+\fBint wattr_set(WINDOW *\fIwin\fB, attr_t \fIattrs\fB, short \fIpair\fB, void *\fIopts\fB);\fR
+.sp
+\fBint attr_off(attr_t \fIattrs\fB, void *\fIopts\fB);\fR
+.br
+\fBint wattr_off(WINDOW *\fIwin\fB, attr_t \fIattrs\fB, void *\fIopts\fB);\fR
+.br
+\fBint attr_on(attr_t \fIattrs\fB, void *\fIopts\fB);\fR
+.br
+\fBint wattr_on(WINDOW *\fIwin\fB, attr_t \fIattrs\fB, void *\fIopts\fB);\fR
+.sp
+\fBint attroff(int \fIattrs);\fR
+.br
+\fBint wattroff(WINDOW *\fIwin\fB, int \fIattrs\fB);\fR
+.br
+\fBint attron(int \fIattrs\fB);\fR
+.br
+\fBint wattron(WINDOW *\fIwin\fB, int \fIattrs\fB);\fR
+.br
+\fBint attrset(int \fIattrs\fB);\fR
+.br
+\fBint wattrset(WINDOW *\fIwin\fB, int \fIattrs\fB);\fR
+.sp
+\fBint chgat(int \fIn\fB, attr_t \fIattr\fB, short \fIpair\fB,\fR \fBconst void *\fIopts\fB);\fR
+.br
+\fBint wchgat(WINDOW *\fIwin\fB,\fR
+      \fBint \fIn\fB, attr_t \fIattr\fB,\fR \fBshort \fIpair\fB, const void *\fIopts\fB);\fR
+.br
+\fBint mvchgat(int \fIy\fB, int \fIx\fB,\fR
+      \fBint \fIn\fB, attr_t \fIattr\fB,\fR \fBshort \fIpair\fB, const void *\fIopts\fB);\fR
+.br
+\fBint mvwchgat(WINDOW *\fIwin, int \fIy, int \fIx\fB,\fR
+      \fBint \fIn,\fR \fBattr_t \fIattr\fB, short \fIpair\fB, const void *\fIopts\fB);\fR
+.sp
+\fBint color_set(short \fIpair\fB, void* \fIopts\fB);\fR
+.br
+\fBint wcolor_set(WINDOW *\fIwin\fB, short \fIpair\fB,\fR \fBvoid* \fIopts);\fR
+.sp
+\fBint standend(void);\fP
+.br
+\fBint wstandend(WINDOW *\fIwin\fB);\fR
+.br
+\fBint standout(void);\fP
+.br
+\fBint wstandout(WINDOW *\fIwin\fB);\fR
+.\" ---------------------------------------------------------------------------
+.SH DESCRIPTION
+.PP
+These routines manipulate the current attributes of the named window,
+which then apply to all characters that are written into
+the window with \fBwaddch\fP, \fBwaddstr\fP and \fBwprintw\fP.
+Attributes are
+a property of the character, and move with the character through any scrolling
+and insert/delete line/character operations.
+To the extent possible, they are
+displayed as appropriate modifications to the graphic rendition of characters
+put on the screen.
+.PP
+These routines do not affect the attributes used
+when erasing portions of the window.
+See \fBcurs_bkgd\fP(3X) for functions which modify the attributes used for
+erasing and clearing.
+.PP
+Routines which do not have a \fBWINDOW*\fP parameter apply to \fBstdscr\fP.
+For example,
+\fBattr_set\fP is the \fBstdscr\fP variant of \fBwattr_set\fP.
+.\" ---------------------------------------------------------------------------
+.SS Window attributes
+.PP
+There are two sets of functions:
+.bP
+functions for manipulating the window attributes and color:
+\fBwattr_set\fP and \fBwattr_get\fP.
+.bP
+functions for manipulating only the window attributes (not color):
+\fBwattr_on\fP and \fBwattr_off\fP.
+.PP
+The \fBwattr_set\fP function sets the current attributes
+of the given window to \fIattrs\fP, with color specified by \fIpair\fP.
+.PP
+Use \fBwattr_get\fP to retrieve attributes for the given window.
+.PP
+Use \fBattr_on\fP and \fBwattr_on\fP to turn on window attributes, i.e.,
+values OR'd together in \fIattr\fP,
+without affecting other attributes.
+Use \fBattr_off\fP and \fBwattr_off\fP to turn off window attributes,
+again values OR'd together in \fIattr\fP,
+without affecting other attributes.
+.\" ---------------------------------------------------------------------------
+.SS Legacy window attributes
+The X/Open window attribute routines which \fIset\fP or \fIget\fP,
+turn \fIon\fP or \fIoff\fP
+are extensions of older routines
+which assume that color pairs are OR'd into the attribute parameter.
+These newer routines use similar names, because
+X/Open simply added an underscore (\fB_\fP) for the newer names.
+.PP
+The \fBint\fP datatype used in the legacy routines is treated as if
+it is the same size as \fBchtype\fP (used by \fBaddch\fP(3X)).
+It holds the common video attributes (such as bold, reverse),
+as well as a few bits for color.
+Those bits correspond to the \fBA_COLOR\fP symbol.
+The \fBCOLOR_PAIR\fP macro provides a value which can be OR'd into
+the attribute parameter.
+For example,
+as long as that value fits into the \fBA_COLOR\fP mask,
+then these calls produce similar results:
+.NS
+attrset(A_BOLD | COLOR_PAIR(\fIpair\fP));
+attr_set(A_BOLD, \fIpair\fP, NULL);
+.NE
+.PP
+However, if the value does not fit, then the \fBCOLOR_PAIR\fP macro
+uses only the bits that fit.
+For example, because in ncurses \fBA_COLOR\fP has eight (8) bits,
+then \fBCOLOR_PAIR(\fI259\fB)\fR is 4
+(i.e., 259 is 4 more than the limit 255).
+.PP
+The \fBPAIR_NUMBER\fP macro extracts a pair number from an \fBint\fP
+(or \fBchtype\fP).
+For example, the \fIinput\fP and \fIoutput\fP values in these statements
+would be the same:
+.NS
+int value = A_BOLD | COLOR_PAIR(\fIinput\fP);
+int \fIoutput\fP = PAIR_NUMBER(value);
+.NE
+.PP
+The \fBattrset\fP routine is a legacy feature predating SVr4 curses
+but kept in X/Open Curses for the same reason that SVr4 curses kept it:
+compatibility.
+.PP
+The remaining \fBattr\fP* functions operate exactly like the corresponding
+\fBattr_\fP* functions, except that they take arguments of type \fBint\fP
+rather than \fBattr_t\fP.
+.PP
+There is no corresponding \fBattrget\fP function as such in X/Open Curses,
+although ncurses provides \fBgetattrs\fP (see curs_legacy(3X)).
+.\" ---------------------------------------------------------------------------
+.SS Change character rendition
+.PP
+The routine \fBchgat\fP changes the attributes of a given number of characters
+starting at the current cursor location of \fBstdscr\fP.
+It does not update
+the cursor and does not perform wrapping.
+A character count of \-1 or greater
+than the remaining window width means to change attributes all the way to the
+end of the current line.
+The \fBwchgat\fP function generalizes this to any window;
+the \fBmvwchgat\fP function does a cursor move before acting.
+.PP
+In these functions,
+the color \fIpair\fP argument is a color-pair index
+(as in the first argument of \fBinit_pair\fP, see \fBcurs_color\fP(3X)).
+.\" ---------------------------------------------------------------------------
+.SS Change window color
+The routine \fBcolor_set\fP sets the current color of the given window to the
+foreground/background combination described by the color \fIpair\fP parameter.
+.\" ---------------------------------------------------------------------------
+.SS Standout
+.PP
+The routine \fBstandout\fP is
+the same as \fBattron(A_STANDOUT)\fP.
+The routine \fBstandend\fP is the same
+as \fBattrset(A_NORMAL)\fP or \fBattrset(0)\fP, that is, it turns off all
+attributes.
+.PP
+X/Open does not mark these \*(``restricted\*('', because
+.bP
+they have well established legacy use, and
+.bP
+there is no ambiguity about the way the attributes
+might be combined with a color pair.
+.\" ---------------------------------------------------------------------------
+.SH VIDEO ATTRIBUTES
+The following video attributes, defined in \fB<curses.h>\fP, can be passed to
+the routines \fBattron\fP, \fBattroff\fP, and \fBattrset\fP, or OR'd with the
+characters passed to \fBaddch\fP (see \fBcurs_addch\fP(3X)).
+.PP
+.RS
+.TS
+l l
+_ _ _
+l l .
+\fBName\fP	\fBDescription\fP
+\fBA_NORMAL\fP	Normal display (no highlight)
+\fBA_STANDOUT\fP	Best highlighting mode of the terminal.
+\fBA_UNDERLINE\fP	Underlining
+\fBA_REVERSE\fP	Reverse video
+\fBA_BLINK\fP	Blinking
+\fBA_DIM\fP	Half bright
+\fBA_BOLD\fP	Extra bright or bold
+\fBA_PROTECT\fP	Protected mode
+\fBA_INVIS\fP	Invisible or blank mode
+\fBA_ALTCHARSET\fP	Alternate character set
+\fBA_ITALIC\fP	Italics (non-X/Open extension)
+\fBA_CHARTEXT\fP	Bit-mask to extract a character
+\fBA_COLOR\fP	Bit-mask to extract a color (legacy routines)
+.TE
+.RE
+.PP
+These video attributes are supported by \fBattr_on\fP and related functions
+(which also support the attributes recognized by \fBattron\fP, etc.):
+.RS
+.TS
+l l
+_ _ _
+l l .
+\fBName\fP	\fBDescription\fP
+\fBWA_HORIZONTAL\fP	Horizontal highlight
+\fBWA_LEFT\fP	Left highlight
+\fBWA_LOW\fP	Low highlight
+\fBWA_RIGHT\fP	Right highlight
+\fBWA_TOP\fP	Top highlight
+\fBWA_VERTICAL\fP	Vertical highlight
+.TE
+.RE
+.PP
+The return values of many of these routines are not meaningful (they are
+implemented as macro-expanded assignments and simply return their argument).
+The SVr4 manual page claims (falsely) that these routines always return \fB1\fP.
+.\" ---------------------------------------------------------------------------
+.SH NOTES
+These functions may be macros:
+.sp
+.RS
+\fBattroff\fP, \fBwattroff\fP, \fBattron\fP, \fBwattron\fP,
+\fBattrset\fP, \fBwattrset\fP, \fBstandend\fP and \fBstandout\fP.
+.RE
+.PP
+Color pair values can only be OR'd with attributes if the pair
+number is less than 256.
+The alternate functions such as \fBcolor_set\fP can pass a color pair
+value directly.
+However, ncurses ABI 4 and 5 simply OR this value
+within the alternate functions.
+You must use ncurses ABI 6 to support more than 256 color pairs.
+.\" ---------------------------------------------------------------------------
+.SH HISTORY
+X/Open Curses is largely based on SVr4 curses,
+adding support for \*(``wide-characters\*('' (not specific to Unicode).
+Some of the X/Open differences from SVr4 curses address the way
+video attributes can be applied to wide-characters.
+But aside from that, \fBattrset\fP and \fBattr_set\fP are similar.
+SVr4 curses provided the basic features for manipulating video attributes.
+However, earlier versions of curses provided a part of these features.
+.PP
+As seen in 2.8BSD, curses assumed 7-bit characters,
+using the eighth bit of a byte to represent the \fIstandout\fP
+feature (often implemented as bold and/or reverse video).
+The BSD curses library provided functions \fBstandout\fP and \fBstandend\fP
+which were carried along into X/Open Curses due to their pervasive use
+in legacy applications.
+.PP
+Some terminals in the 1980s could support a variety of video attributes,
+although the BSD curses library could do nothing with those.
+System V (1983) provided an improved curses library.
+It defined the \fBA_\fP symbols for use by applications to manipulate the
+other attributes.
+There are few useful references for the chronology.
+.PP
+Goodheart's book
+\fIUNIX Curses Explained\fP (1991) describes SVr3 (1987),
+commenting on several functions:
+.bP
+the \fBattron\fP, \fBattroff\fP, \fBattrset\fP functions
+(and most of the functions found in SVr4 but not in BSD curses) were
+introduced by System V,
+.bP
+the alternate character set feature with \fBA_ALTCHARSET\fP was
+added in SVr2 and improved in SVr3 (by adding \fBacs_map[]\fP),
+.bP
+\fBstart_color\fP and related color-functions were introduced by System V.3.2,
+.bP
+pads, soft-keys were added in SVr3, and
+.PP
+Goodheart did not mention the background character or the \fBcchar_t\fP type.
+Those are respectively SVr4 and X/Open features.
+He did mention the \fBA_\fP constants, but did not indicate their values.
+Those were not the same in different systems,
+even for those marked as System V.
+.PP
+Different Unix systems used different sizes for the bit-fields in \fBchtype\fP
+for \fIcharacters\fP and \fIcolors\fP, and took into account the different
+integer sizes (32-bit versus 64-bit).
+.PP
+This table showing the number of bits for \fBA_COLOR\fP
+and \fBA_CHARTEXT\fP
+was gleaned from the curses header files for
+various operating systems and architectures.
+The inferred architecture and notes reflect
+the format and size of the defined constants
+as well as clues such as the alternate character set implementation.
+A 32-bit library can be used on a 64-bit system,
+but not necessarily the reverse.
+.RS
+.TS
+l l l l l l
+_ _ _ _ _ _
+l l l l l l .
+\fBYear\fP	\fBSystem\fP	\fBArch\fP	\fBColor\fP	\fBChar\fP	\fBNotes\fP
+1992	Solaris 5.2	32	6	17	SVr4 curses
+1992	HPUX 9	32	no	8	SVr2 curses
+1992	AIX 3.2	32	no	23	SVr2 curses
+1994	OSF/1 r3	32	no	23	SVr2 curses
+1995	HP-UX 10.00	32	6	16	SVr3 \*(``curses_colr\*(''
+1995	HP-UX 10.00	32	6	8	SVr4, X/Open curses
+1995	Solaris 5.4	32/64	7	16	X/Open curses
+1996	AIX 4.2	32	7	16	X/Open curses
+1996	OSF/1 r4	32	6	16	X/Open curses
+1997	HP-UX 11.00	32	6	8	X/Open curses
+2000	U/Win	32/64	7/31	16	uses \fBchtype\fP
+.TE
+.RE
+.PP
+Notes:
+.RS 3
+.PP
+Regarding HP-UX,
+.bP
+HP-UX 10.20 (1996) added support for 64-bit PA-RISC processors in 1996.
+.bP
+HP-UX 10.30 (1997) marked \*(``curses_colr\*('' obsolete.
+That version of curses was dropped with HP-UX 11.30 in 2006.
+.PP
+Regarding OSF/1 (and Tru64),
+.bP
+These used 64-bit hardware.
+Like ncurses, the OSF/1 curses interface is not customized for 32-bit
+and 64-bit versions.
+.bP
+Unlike other systems which evolved from AT&T code,
+OSF/1 provided a new implementation for X/Open curses.
+.PP
+Regarding Solaris,
+.bP
+The initial release of Solaris was in 1992.
+.bP
+The \fIxpg4\fP (X/Open) curses was developed by MKS from 1990 to 1995.
+Sun's copyright began in 1996.
+.bP
+Sun updated the X/Open curses interface
+after 64-bit support was introduced in 1997,
+but did not modify the SVr4 curses interface.
+.PP
+Regarding U/Win,
+.bP
+Development of the curses library began in 1991, stopped in 2000.
+.bP
+Color support was added in 1998.
+.bP
+The library uses only \fBchtype\fP (no \fBcchar_t\fP).
+.RE
+.PP
+Once X/Open curses was adopted in the mid-1990s, the constraint of
+a 32-bit interface with many colors and wide-characters for \fBchtype\fP
+became a moot point.
+The \fBcchar_t\fP structure (whose size and
+members are not specified in X/Open Curses) could be extended as needed.
+.PP
+Other interfaces are rarely used now:
+.bP
+BSD curses was improved slightly in 1993/1994 using Keith Bostic's
+modification to make the library 8-bit clean for \fBnvi\fP(1).
+He moved \fIstandout\fP attribute to a structure member.
+.IP
+The resulting 4.4BSD curses was replaced by ncurses over the next ten years.
+.bP
+U/Win is rarely used now.
+.\" ---------------------------------------------------------------------------
+.SH EXTENSIONS
+.PP
+This implementation provides the \fBA_ITALIC\fP attribute for terminals
+which have the \fBenter_italics_mode\fP (\fBsitm\fP)
+and \fBexit_italics_mode\fP (\fBritm\fP) capabilities.
+Italics are not mentioned in X/Open Curses.
+Unlike the other video attributes, \fBA_ITALIC\fP is unrelated
+to the \fBset_attributes\fP capabilities.
+This implementation makes the assumption that
+\fBexit_attribute_mode\fP may also reset italics.
+.PP
+Each of the functions added by XSI Curses has a parameter \fIopts\fP,
+which X/Open Curses still (after more than twenty years) documents
+as reserved for future use, saying that it should be \fBNULL\fP.
+This implementation uses that parameter in ABI 6 for the functions which
+have a color-pair parameter to support \fIextended color pairs\fP:
+.bP
+For functions which modify the color, e.g.,
+\fBwattr_set\fP and \fBwattr_on\fP,
+if \fIopts\fP is set it is treated as a pointer to \fBint\fP,
+and used to set the color pair instead of the \fBshort\fP \fIpair\fP parameter.
+.bP
+For functions which retrieve the color, e.g.,
+\fBwattr_get\fP,
+if \fIopts\fP is set it is treated as a pointer to \fBint\fP,
+and used to retrieve the color pair as an \fBint\fP value,
+in addition to
+retrieving it via the standard pointer to \fBshort\fP parameter.
+.bP
+For functions which turn attributes off, e.g.,
+\fBwattr_off\fP,
+the \fIopts\fP parameter is ignored except
+except to check that it is \fBNULL\fP.
+.\" ---------------------------------------------------------------------------
+.SH PORTABILITY
+These functions are supported in the XSI Curses standard, Issue 4.
+The standard defined the dedicated type for highlights,
+\fBattr_t\fP, which was not defined in SVr4 curses.
+The functions taking \fBattr_t\fP arguments were not supported under SVr4.
+.PP
+Very old versions of this library did not force an update of the screen
+when changing the attributes.
+Use \fBtouchwin\fP to force the screen to match the updated attributes.
+.PP
+The XSI Curses standard states that whether the traditional functions
+\fBattron\fP/\fBattroff\fP/\fBattrset\fP can manipulate attributes other than
+\fBA_BLINK\fP, \fBA_BOLD\fP, \fBA_DIM\fP, \fBA_REVERSE\fP, \fBA_STANDOUT\fP, or
+\fBA_UNDERLINE\fP is \*(``unspecified\*(''.
+Under this implementation as well as
+SVr4 curses, these functions correctly manipulate all other highlights
+(specifically, \fBA_ALTCHARSET\fP, \fBA_PROTECT\fP, and \fBA_INVIS\fP).
+.PP
+XSI Curses added these entry points:
+.sp
+.RS
+\fBattr_get\fP, \fBattr_on\fP,
+\fBattr_off\fP, \fBattr_set\fP, \fBwattr_on\fP, \fBwattr_off\fP,
+\fBwattr_get\fP, \fBwattr_set\fP
+.RE
+.PP
+The new functions are intended to work with
+a new series of highlight macros prefixed with \fBWA_\fP.
+The older macros have direct counterparts in the newer set of names:
+.PP
+.RS
+.ne 9
+.TS
+l l
+_ _ _
+l l .
+\fBName\fP	\fBDescription\fP
+\fBWA_NORMAL\fP	Normal display (no highlight)
+\fBWA_STANDOUT\fP	Best highlighting mode of the terminal.
+\fBWA_UNDERLINE\fP	Underlining
+\fBWA_REVERSE\fP	Reverse video
+\fBWA_BLINK\fP	Blinking
+\fBWA_DIM\fP	Half bright
+\fBWA_BOLD\fP	Extra bright or bold
+\fBWA_ALTCHARSET\fP	Alternate character set
+.TE
+.RE
+.PP
+XSI curses does not assign values to these symbols,
+nor does it state whether or not they are related to the
+similarly-named A_NORMAL, etc.:
+.bP
+The XSI curses standard specifies that each pair of corresponding \fBA_\fP
+and \fBWA_\fP-using functions operates on the same current-highlight
+information.
+.bP
+However, in some implementations, those symbols have unrelated values.
+.IP
+For example, the Solaris \fIxpg4\fP (X/Open) curses declares
+\fBattr_t\fP to be an unsigned short integer (16-bits),
+while \fBchtype\fP is a unsigned integer (32-bits).
+The \fBWA_\fP symbols in this case are different from the \fBA_\fP symbols
+because they are used for a smaller datatype which does not
+represent \fBA_CHARTEXT\fP or \fBA_COLOR\fP.
+.IP
+In this implementation (as in many others), the values happen to be
+the same because it simplifies copying information between
+\fBchtype\fP and \fBcchar_t\fP variables.
+.bP
+Because ncurses's \fBattr_t\fP can hold a color pair
+(in the \fBA_COLOR\fP field),
+a call to
+\fBwattr_on\fP,
+\fBwattr_off\fP, or
+\fBwattr_set\fP
+may alter the window's color.
+If the color pair information in the attribute parameter is zero,
+no change is made to the window's color.
+.IP
+This is consistent with SVr4 curses;
+X/Open Curses does not specify this.
+.PP
+The XSI standard extended conformance level adds new highlights
+\fBA_HORIZONTAL\fP, \fBA_LEFT\fP, \fBA_LOW\fP, \fBA_RIGHT\fP, \fBA_TOP\fP,
+\fBA_VERTICAL\fP (and corresponding \fBWA_\fP macros for each).
+As of August 2013,
+no known terminal provides these highlights
+(i.e., via the \fBsgr1\fP capability).
+.\" ---------------------------------------------------------------------------
+.SH RETURN VALUE
+All routines return the integer \fBOK\fP on success, or \fBERR\fP on failure.
+.PP
+X/Open does not define any error conditions.
+.PP
+This implementation
+.bP
+returns an error if the window pointer is null.
+.bP
+returns an error if the color pair parameter
+for \fBwcolor_set\fP is outside the range 0..COLOR_PAIRS\-1.
+.bP
+does not return an error if either of the parameters of \fBwattr_get\fP
+used for retrieving attribute or color-pair values is \fBNULL\fP.
+.PP
+Functions with a \*(``mv\*('' prefix first perform a cursor movement using
+\fBwmove\fP, and return an error if the position is outside the window,
+or if the window pointer is null.
+.\" ---------------------------------------------------------------------------
+.SH SEE ALSO
+.na
+\fBcurses\fP(3X),
+\fBcurs_addch\fP(3X),
+\fBcurs_addstr\fP(3X),
+\fBcurs_bkgd\fP(3X),
+\fBcurs_printw\fP(3X),
+\fBcurs_variables\fP(3X)
diff --git a/man/curs_beep.3x b/man/curs_beep.3x
new file mode 100644
index 0000000..4368045
--- /dev/null
+++ b/man/curs_beep.3x
@@ -0,0 +1,61 @@
+.\"***************************************************************************
+.\" Copyright 2018-2020,2021 Thomas E. Dickey                                *
+.\" Copyright 1998-2005,2010 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_beep.3x,v 1.16 2021/12/25 21:41:58 tom Exp $
+.TH curs_beep 3X ""
+.SH NAME
+\fBbeep\fP, \fBflash\fP \- \fBcurses\fP bell and screen flash routines
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.PP
+\fBint beep(void);\fP
+.br
+\fBint flash(void);\fP
+.br
+.SH DESCRIPTION
+The \fBbeep\fP and \fBflash\fP routines are used to alert the terminal user.
+The routine \fBbeep\fP sounds an audible alarm on the terminal, if possible;
+otherwise it flashes the screen (visible bell).
+The routine \fBflash\fP
+flashes the screen, and if that is not possible, sounds the alert.
+If neither
+alert is possible, nothing happens.
+Nearly all terminals have an audible alert
+(bell or beep), but only some can flash the screen.
+.SH RETURN VALUE
+These routines return \fBOK\fP if they succeed in beeping or flashing,
+\fBERR\fP otherwise.
+.SH EXTENSIONS
+SVr4's beep and flash routines always returned \fBOK\fP, so it was not
+possible to tell when the beep or flash failed.
+.SH PORTABILITY
+These functions are described in the XSI Curses standard, Issue 4.
+Like SVr4, it specifies that they always return \fBOK\fP.
+.SH SEE ALSO
+\fBcurses\fP(3X)
diff --git a/man/curs_bkgd.3x b/man/curs_bkgd.3x
new file mode 100644
index 0000000..f9199ce
--- /dev/null
+++ b/man/curs_bkgd.3x
@@ -0,0 +1,169 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2015,2017 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_bkgd.3x,v 1.35 2022/06/25 21:55:45 tom Exp $
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.TH curs_bkgd 3X ""
+.SH NAME
+\fBbkgdset\fP, \fBwbkgdset\fP,
+\fBbkgd\fP, \fBwbkgd\fP,
+\fBgetbkgd\fP \- \fBcurses\fP window background manipulation routines
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.PP
+\fBvoid bkgdset(chtype \fIch\fB);\fR
+.br
+\fBvoid wbkgdset(WINDOW *\fIwin, chtype \fIch\fB);\fR
+.sp
+\fBint bkgd(chtype \fIch\fB);\fR
+.br
+\fBint wbkgd(WINDOW *\fIwin\fB, chtype \fIch\fB);\fR
+.sp
+\fBchtype getbkgd(WINDOW *\fIwin\fB);\fR
+.br
+.SH DESCRIPTION
+.SS bkgdset
+The \fBbkgdset\fP and \fBwbkgdset\fP routines
+set the \fIbackground\fP for a window.
+A window's background is a \fBchtype\fP consisting of
+any combination of attributes (i.e., rendition) and a character:
+.bP
+The attribute part of the background is combined (OR'ed) with all non-blank
+characters that are written into the window with \fBwaddch\fP.
+.bP
+Both the character and attribute parts of the background are combined with
+blank characters that are written into the window.
+.PP
+The background becomes a property of each
+character and moves with the character through any scrolling and
+insert/delete line/character operations.
+.PP
+To the extent possible on a particular terminal,
+the attribute part of the background is displayed
+as the graphic rendition of the character put on the screen.
+.SS bkgd
+.PP
+The \fBbkgd\fP and \fBwbkgd\fP functions
+set the background property of the current or specified window
+and then apply this setting to every character position in that window.
+According to X/Open Curses, it should do this:
+.PP
+.bP
+The rendition of every character on the screen is changed to
+the new background rendition.
+.bP
+Wherever the former background character
+appears, it is changed to the new background character.
+.PP
+Neither X/Open Curses nor the SVr4 manual pages give details about
+the way the rendition of characters on the screen is updated when
+\fBbkgd\fP or \fBwbkgd\fP is used to change the background character.
+.PP
+This implementation, like SVr4 curses, does not store the background
+and window attribute contributions to each cell separately.
+It updates the rendition by comparing the character, non-color attributes and
+colors contained in the background.
+For each cell in the window, whether or not it is blank:
+.bP
+The library first compares the \fIcharacter\fP,
+and if it matches the current character part of the background,
+it replaces that with the new background character.
+.IP
+When \fBbkgdset\fP is used to set the background character,
+that does not update each cell in the window.
+A subsequent call to \fBbkgd\fP will only modify the \fIcharacter\fP in
+cells which match the current background character.
+.bP
+The library then checks if the cell uses color,
+i.e., its color pair value is nonzero.
+If not, it simply replaces the attributes and color pair in the
+cell with those from the new background character.
+.bP
+If the cell uses color,
+and that matches the color in the current background,
+the library removes attributes
+which may have come from the current background
+and adds attributes from the new background.
+It finishes by setting the cell
+to use the color from the new background.
+.bP
+If the cell uses color,
+and that does not match the color in the current background,
+the library updates only the non-color attributes,
+first removing those which may have come from the current background,
+and then adding attributes from the new background.
+.PP
+If the background's character value is zero (0), a space is assumed.
+.PP
+If the terminal does not support color,
+or if color has not been started with \fBstart_color\fP,
+the new background character's color attribute will be ignored.
+.SS getbkgd
+.PP
+The \fBgetbkgd\fP function returns the given window's current background
+character/attribute pair.
+.SH RETURN VALUE
+.PP
+These functions are described in the XSI Curses standard, Issue 4.
+It specifies that \fBbkgd\fP and \fBwbkgd\fP return \fBERR\fP on failure,
+but gives no failure conditions.
+.PP
+The routines \fBbkgd\fP and \fBwbkgd\fP return the integer \fBOK\fP,
+unless the library has not been initialized.
+.PP
+In contrast,
+the SVr4.0 manual says \fBbkgd\fP and \fBwbkgd\fP may return \fBOK\fP
+"or a non-negative integer if \fBimmedok\fP is set",
+which refers to the return value from \fBwrefresh\fP
+(used to implement the immediate repainting).
+The SVr4 curses \fBwrefresh\fP returns the number of characters
+written to the screen during the refresh.
+This implementation does not do that.
+.SH NOTES
+.PP
+Note that \fBbkgdset\fP and \fBbkgd\fP may be macros.
+.PP
+X/Open Curses mentions that the character part of the background must
+be a single-byte value.
+This implementation, like SVr4, checks to ensure that,
+and will reuse the old background character if the check fails.
+.SH PORTABILITY
+.PP
+These functions are described in the XSI Curses standard, Issue 4
+(X/Open Curses).
+.SH SEE ALSO
+.na
+.PP
+\fBcurses\fP(3X),
+\fBcurs_addch\fP(3X),
+\fBcurs_attr\fP(3X),
+\fBcurs_outopts\fP(3X)
diff --git a/man/curs_bkgrnd.3x b/man/curs_bkgrnd.3x
new file mode 100644
index 0000000..e64f994
--- /dev/null
+++ b/man/curs_bkgrnd.3x
@@ -0,0 +1,124 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 2002-2015,2017 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_bkgrnd.3x,v 1.16 2022/06/25 21:57:59 tom Exp $
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.TH curs_bkgrnd 3X ""
+.SH NAME
+\fBbkgrnd\fP,
+\fBwbkgrnd\fP,
+\fBbkgrndset\fP,
+\fBwbkgrndset\fP,
+\fBgetbkgrnd\fP,
+\fBwgetbkgrnd\fP \- \fBcurses\fP window complex background manipulation routines
+.SH SYNOPSIS
+.PP
+.B #include <curses.h>
+.sp
+\fBint bkgrnd(\fB const cchar_t *\fIwch\fB);\fR
+.br
+\fBint wbkgrnd(\fB WINDOW *\fIwin\fB, const cchar_t *\fIwch\fB);\fR
+.sp
+\fBvoid bkgrndset(const cchar_t *\fIwch\fR \fB);\fR
+.br
+\fBvoid wbkgrndset(WINDOW *\fIwin\fB, const cchar_t *\fIwch\fB);\fR
+.sp
+\fBint getbkgrnd(cchar_t *\fIwch\fB);\fR
+.br
+\fBint wgetbkgrnd(WINDOW *\fIwin\fB, cchar_t *\fIwch\fB);\fR
+.br
+.SH DESCRIPTION
+.SS bkgrndset
+.PP
+The \fBbkgrndset\fP and \fBwbkgrndset\fP routines manipulate the
+background of the named window.
+The window background is a \fBcchar_t\fP consisting of
+any combination of attributes (i.e., rendition) and a complex character.
+.bP
+The attribute part of the background is combined (OR'ed) with all non-blank
+characters that are written into the window with \fBwaddch\fP.
+.bP
+Both
+the character and attribute parts of the background are combined with
+the blank characters.
+.PP
+The background becomes a property of the
+character and moves with the character through any scrolling and
+insert/delete line/character operations.
+.PP
+To the extent possible on a
+particular terminal, the attribute part of the background is displayed
+as the graphic rendition of the character put on the screen.
+.SS bkgrnd
+.PP
+The \fBbkgrnd\fP and \fBwbkgrnd\fP functions
+set the background property of the current or specified window
+and then apply this setting to every character position in that window:
+.bP
+The rendition of every character on the screen is changed to
+the new background rendition.
+.bP
+Wherever the former background character
+appears, it is changed to the new background character.
+.SS getbkgrnd
+.PP
+The \fBgetbkgrnd\fP function returns the given window's current background
+character/attribute pair via the \fBwch\fP pointer.
+If the given window pointer is null,
+the character is not updated (but no error returned).
+.SH NOTES
+Note that
+\fBbkgrnd\fP,
+\fBbkgrndset\fP, and
+\fBgetbkgrnd\fP
+may be macros.
+.PP
+X/Open Curses does not provide details on how the rendition is changed.
+This implementation follows the approach used in SVr4 curses,
+which is explained in the manual page for \fBwbkgd\fP.
+.SH RETURN VALUE
+.PP
+The \fBbkgrndset\fP and \fBwbkgrndset\fP routines do not return a value.
+.PP
+Upon successful completion, the other functions return \fBOK\fP.
+Otherwise, they return \fBERR\fP:
+.bP
+A null window pointer is treated as an error.
+.bP
+A null character pointer is treated as an error.
+.SH PORTABILITY
+.PP
+These functions are described in the XSI Curses standard, Issue 4
+(X/Open Curses).
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBcurs_bkgd\fP(3X)
diff --git a/man/curs_border.3x b/man/curs_border.3x
new file mode 100644
index 0000000..72683b0
--- /dev/null
+++ b/man/curs_border.3x
@@ -0,0 +1,163 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2007,2010 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_border.3x,v 1.30 2022/02/12 20:06:41 tom Exp $
+.TH curs_border 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.na
+.hy 0
+.SH NAME
+\fBborder\fP,
+\fBwborder\fP,
+\fBbox\fP,
+\fBhline\fP,
+\fBwhline\fP,
+\fBvline\fP,
+\fBwvline\fP,
+\fBmvhline\fP,
+\fBmvwhline\fP,
+\fBmvvline\fP,
+\fBmvwvline\fP \- create \fBcurses\fP borders, horizontal and vertical lines
+.ad
+.hy
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBint border(chtype \fIls\fB, chtype \fIrs\fB, chtype \fIts\fB, chtype \fIbs\fB,\fR
+           \fBchtype \fItl\fB, chtype \fItr\fB, chtype \fIbl\fB, chtype \fIbr\fB);\fR
+.br
+\fBint wborder(WINDOW *\fIwin\fB, chtype \fIls\fB, chtype \fIrs\fB,\fR
+            \fBchtype \fIts\fB, chtype \fIbs\fB, chtype \fItl\fB, chtype \fItr\fB,\fR
+            \fBchtype \fIbl\fB, chtype \fIbr\fB);\fR
+.sp
+\fBint box(WINDOW *\fIwin\fB, chtype \fIverch\fB, chtype \fIhorch\fB);\fR
+.sp
+\fBint hline(chtype \fIch\fB, int \fIn\fB);\fR
+.br
+\fBint whline(WINDOW *\fIwin\fB, chtype \fIch\fB, int \fIn\fB);\fR
+.br
+\fBint vline(chtype \fIch\fB, int \fIn\fB);\fR
+.br
+\fBint wvline(WINDOW *\fIwin\fB, chtype \fIch\fB, int \fIn\fB);\fR
+.sp
+\fBint mvhline(int \fIy\fB, int \fIx\fB, chtype \fIch\fB, int \fIn\fB);\fR
+.br
+\fBint mvwhline(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB, chtype \fIch\fB, int \fIn\fB);\fR
+.br
+\fBint mvvline(int \fIy\fB, int \fIx\fB, chtype \fIch\fB, int \fIn\fB);\fR
+.br
+\fBint mvwvline(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB, chtype \fIch\fB, int \fIn\fB);\fR
+.br
+.SH DESCRIPTION
+The \fBborder\fP, \fBwborder\fP and \fBbox\fP routines
+draw a box around the edges of a window.
+Other than the window, each argument is a character with attributes:
+.sp
+.RS
+\fIls\fP \- left side,
+.br
+\fIrs\fP \- right side,
+.br
+\fIts\fP \- top side,
+.br
+\fIbs\fP \- bottom side,
+.br
+\fItl\fP \- top left-hand corner,
+.br
+\fItr\fP \- top right-hand corner,
+.br
+\fIbl\fP \- bottom left-hand corner, and
+.br
+\fIbr\fP \- bottom right-hand corner.
+.RE
+.PP
+If any of these arguments is zero, then the corresponding
+default values (defined in \fBcurses.h\fP) are used instead:
+.sp
+.RS
+\fBACS_VLINE\fP,
+.br
+\fBACS_VLINE\fP,
+.br
+\fBACS_HLINE\fP,
+.br
+\fBACS_HLINE\fP,
+.br
+\fBACS_ULCORNER\fP,
+.br
+\fBACS_URCORNER\fP,
+.br
+\fBACS_LLCORNER\fP,
+.br
+\fBACS_LRCORNER\fP.
+.RE
+.PP
+\fBbox(\fIwin\fB, \fIverch\fB, \fIhorch\fB)\fR is a shorthand
+for the following call: \fBwborder(\fIwin\fB,\fR \fIverch\fB,\fR
+\fIverch\fB,\fR \fIhorch\fB,\fR \fIhorch\fB, 0, 0, 0, 0)\fR.
+.PP
+The \fBhline\fP and \fBwhline\fP functions draw a horizontal (left to right)
+line using \fIch\fP starting at the current cursor position in the window.
+The
+current cursor position is not changed.
+The line is at most \fIn\fP characters
+long, or as many as fit into the window.
+.PP
+The \fBvline\fP and \fBwvline\fP functions draw a vertical (top to bottom) line
+using \fIch\fP starting at the current cursor position in the window.
+The
+current cursor position is not changed.
+The line is at most \fIn\fP characters
+long, or as many as fit into the window.
+.SH RETURN VALUE
+All routines return the integer \fBOK\fP.
+The SVr4.0 manual says "or a
+non-negative integer if \fBimmedok\fP is set", but this appears to be an error.
+.PP
+X/Open does not define any error conditions.
+This implementation returns an error
+if the window pointer is null.
+.PP
+Functions with a \*(``mv\*('' prefix first perform a cursor movement using
+\fBwmove\fP, and return an error if the position is outside the window,
+or if the window pointer is null.
+.SH NOTES
+The borders generated by these functions are \fIinside\fP borders (this
+is also true of SVr4 curses, though the fact is not documented).
+.PP
+Note that \fBborder\fP and \fBbox\fP may be macros.
+.SH PORTABILITY
+These functions are described in the XSI Curses standard, Issue 4.
+The standard specifies that they return \fBERR\fP on failure,
+but specifies no error conditions.
+.SH SEE ALSO
+\fBcurses\fP(3X), \fBcurs_outopts\fP(3X).
diff --git a/man/curs_border_set.3x b/man/curs_border_set.3x
new file mode 100644
index 0000000..9d79b25
--- /dev/null
+++ b/man/curs_border_set.3x
@@ -0,0 +1,211 @@
+.\"***************************************************************************
+.\" Copyright 2019-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 2002-2011,2012 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_border_set.3x,v 1.16 2022/02/12 20:06:41 tom Exp $
+.TH curs_border_set 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.na
+.hy 0
+.SH NAME
+\fBborder_set\fP,
+\fBwborder_set\fP,
+\fBbox_set\fP,
+\fBhline_set\fP,
+\fBwhline_set\fP,
+\fBmvhline_set\fP,
+\fBmvwhline_set\fP,
+\fBvline_set\fP,
+\fBwvline_set\fP,
+\fBmvvline_set\fP,
+\fBmvwvline_set\fP \- create \fBcurses\fP borders or lines using complex characters and renditions
+.ad
+.hy
+.SH SYNOPSIS
+.PP
+\fB#include <curses.h>\fP
+.sp
+\fBint border_set(\fP
+   \fBconst cchar_t *\fIls\fR, \fBconst cchar_t *\fIrs\fR,
+   \fBconst cchar_t *\fIts\fR, \fBconst cchar_t *\fIbs\fR,
+   \fBconst cchar_t *\fItl\fR, \fBconst cchar_t *\fItr\fR,
+   \fBconst cchar_t *\fIbl\fR, \fBconst cchar_t *\fIbr\fR
+\fB);\fP
+.br
+\fBint wborder_set(\fP
+   \fBWINDOW *win\fP,
+   \fBconst cchar_t *\fIls\fR, \fBconst cchar_t *\fIrs\fR,
+   \fBconst cchar_t *\fIts\fR, \fBconst cchar_t *\fIbs\fR,
+   \fBconst cchar_t *\fItl\fR, \fBconst cchar_t *\fItr\fR,
+   \fBconst cchar_t *\fIbl\fR, \fBconst cchar_t *\fIbr\fB);\fR
+.br
+\fBint box_set(\fP
+   \fBWINDOW *win\fP,
+   \fBconst cchar_t *\fIverch\fR,
+   \fBconst cchar_t *\fIhorch\fB);\fR
+.br
+\fBint hline_set(\fP
+   \fBconst cchar_t *\fIwch\fR, \fBint \fIn\fB);\fR
+.br
+\fBint whline_set(\fP
+   \fBWINDOW *\fIwin\fR,
+   \fBconst cchar_t *\fIwch\fR, \fBint \fIn\fB);\fR
+.br
+\fBint mvhline_set(\fP
+   \fBint \fIy\fR, \fBint \fIx\fR,
+   \fBconst cchar_t *\fIwch\fR, \fBint \fIn\fB);\fR
+.br
+\fBint mvwhline_set(\fP
+   \fBWINDOW *\fIwin\fR,
+   \fBint \fIy\fR, \fBint \fIx\fR,
+   \fBconst cchar_t *\fIwch\fR, \fBint \fIn\fB);\fR
+.br
+\fBint vline_set(\fP
+   \fBconst cchar_t *\fIwch\fR, \fBint \fIn\fB);\fR
+.br
+\fBint wvline_set(\fP
+   \fBWINDOW *\fIwin\fR,
+   \fBconst cchar_t *\fIwch\fR, \fBint \fIn\fB);\fR
+.br
+\fBint mvvline_set(\fP
+   \fBint \fIy\fR, \fBint \fIx\fR,
+   \fBconst cchar_t *\fIwch\fR, \fBint \fIn\fB);\fR
+.br
+\fBint mvwvline_set(\fP
+   \fBWINDOW *\fIwin\fR,
+   \fBint \fIy\fR, \fBint \fIx\fR,
+   \fBconst cchar_t *\fIwch\fR, \fBint \fIn\fB);\fR
+.br
+.SH DESCRIPTION
+.PP
+The
+\fBborder_set\fP
+and
+\fBwborder_set\fP
+functions draw a border around the edges of the current or specified window.
+These functions do not change the cursor position, and do not wrap.
+.PP
+Other than the window, each argument is a complex character with attributes:
+.RS
+\fIls\fP \- left side,
+.br
+\fIrs\fP \- right side,
+.br
+\fIts\fP \- top side,
+.br
+\fIbs\fP \- bottom side,
+.br
+\fItl\fP \- top left-hand corner,
+.br
+\fItr\fP \- top right-hand corner,
+.br
+\fIbl\fP \- bottom left-hand corner, and
+.br
+\fIbr\fP \- bottom right-hand corner.
+.RE
+.PP
+If any of these arguments is zero, then the corresponding
+default values (defined in \fBcurses.h\fP) are used instead:
+.RS
+\fBWACS_VLINE\fP,
+.br
+\fBWACS_VLINE\fP,
+.br
+\fBWACS_HLINE\fP,
+.br
+\fBWACS_HLINE\fP,
+.br
+\fBWACS_ULCORNER\fP,
+.br
+\fBWACS_URCORNER\fP,
+.br
+\fBWACS_LLCORNER\fP, and
+.br
+\fBWACS_LRCORNER\fP.
+.RE
+.PP
+\fBbox_set(\fIwin\fR, \fIverch\fB, \fIhorch\fB);\fR
+is a shorthand for the following call:
+.PP
+\fBwborder_set(\fIwin\fB, \fIverch\fB, \fIverch\fB,\fR
+    \fIhorch\fB, \fIhorch\fB, NULL, NULL, NULL, NULL);\fR
+.PP
+The
+\fB*line_set\fP
+functions use
+\fIwch\fP
+to draw a line starting at the current cursor position in the window.
+The line is at most \fIn\fP characters long or as many as fit into the window.
+The current cursor position is not changed.
+.PP
+The
+\fBhline_set\fP,
+\fBmvhline_set\fP,
+\fBmvwhline_set\fP, and
+\fBwhline_set\fP
+functions draw a line proceeding toward the last column of the same line.
+.PP
+The
+\fBvline_set\fP,
+\fBmvvline_set\fP,
+\fBmvwvline_set\fP, and
+\fBwvline_set\fP
+functions draw a line proceeding toward the last line of the window.
+.br
+.SH NOTES
+.PP
+Note that
+\fBborder_set\fP,
+\fBhline_set\fP,
+\fBmvhline_set\fP,
+\fBmvvline_set\fP,
+\fBmvwhline_set\fP,
+\fBmvwvline_set\fP, and
+\fBvline_set\fP
+may be macros.
+.br
+.SH RETURN VALUE
+.PP
+Upon successful completion, these functions return
+\fBOK\fP.
+Otherwise, they return
+\fBERR\fP.
+.PP
+Functions using a window parameter return an error if it is null.
+.PP
+Functions with a \*(``mv\*('' prefix first perform a cursor movement using
+\fBwmove\fP, and return an error if the position is outside the window,
+or if the window pointer is null.
+.SH SEE ALSO
+\fBncurses\fP(3X),
+\fBcurs_add_wch\fP(3X),
+\fBcurs_border\fP(3X),
+\fBcurs_outopts\fP(3X)
diff --git a/man/curs_clear.3x b/man/curs_clear.3x
new file mode 100644
index 0000000..36ff278
--- /dev/null
+++ b/man/curs_clear.3x
@@ -0,0 +1,138 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2016 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_clear.3x,v 1.27 2022/11/26 16:23:47 tom Exp $
+.TH curs_clear 3X ""
+.na
+.hy 0
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.SH NAME
+\fBerase\fP,
+\fBwerase\fP,
+\fBclear\fP,
+\fBwclear\fP,
+\fBclrtobot\fP,
+\fBwclrtobot\fP,
+\fBclrtoeol\fP,
+\fBwclrtoeol\fP \- clear all or part of a \fBcurses\fP window
+.ad
+.hy
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBint erase(void);\fP
+.br
+\fBint werase(WINDOW *\fIwin\fB);\fR
+.sp
+\fBint clear(void);\fP
+.br
+\fBint wclear(WINDOW *\fIwin\fB);\fR
+.sp
+\fBint clrtobot(void);\fP
+.br
+\fBint wclrtobot(WINDOW *\fIwin\fB);\fR
+.sp
+\fBint clrtoeol(void);\fP
+.br
+\fBint wclrtoeol(WINDOW *\fIwin\fB);\fR
+.br
+.SH DESCRIPTION
+.SS erase/werase
+The \fBerase\fP and \fBwerase\fP routines copy blanks to every
+position in the window, clearing the screen.
+.PP
+Blanks created by erasure have the current background rendition (as set
+by \fBwbkgdset\fP(3X)) merged into them.
+.SS clear/wclear
+.PP
+The \fBclear\fP and \fBwclear\fP routines are like \fBerase\fP and
+\fBwerase\fP, but they also call \fBclearok\fP(3X), so that the screen is
+cleared completely on the next call to \fBwrefresh\fP for that window
+and repainted from scratch.
+.SS clrtobot/wclrtobot
+.PP
+The \fBclrtobot\fP and \fBwclrtobot\fP routines erase from the cursor to the
+end of screen.
+That is, they erase all lines below the cursor in the window.
+Also, the current line to the right of the cursor, inclusive, is erased.
+.SS clrtoeol/wclrtoeol
+.PP
+The \fBclrtoeol\fP and \fBwclrtoeol\fP routines erase the current line
+to the right of the cursor, inclusive, to the end of the current line.
+.SH RETURN VALUE
+All routines return the integer \fBOK\fP on success and \fBERR\fP on failure.
+.PP
+X/Open defines no error conditions.
+In this implementation,
+.bP
+functions using a window pointer parameter return an error if it is null
+.bP
+\fBwclrtoeol\fP returns an error
+if the cursor position is about to wrap.
+.SH NOTES
+Note that \fBerase\fP, \fBwerase\fP, \fBclear\fP, \fBwclear\fP,
+\fBclrtobot\fP, and \fBclrtoeol\fP may be macros.
+.SH PORTABILITY
+These functions are described in the XSI Curses standard, Issue 4.
+The
+standard specifies that they return \fBERR\fP on failure, but specifies no
+error conditions.
+.PP
+The SVr4.0 manual says that these functions could
+return "a non-negative integer if \fBimmedok\fP(3X) is set",
+referring to the return-value of \fBwrefresh\fP.
+In that implementation, \fBwrefresh\fP would return a count of
+the number of characters written to the terminal.
+.PP
+Some historic curses implementations had, as an undocumented feature, the
+ability to do the equivalent of \fBclearok(..., 1)\fP by saying
+\fBtouchwin(stdscr)\fP or \fBclear(stdscr)\fP.
+This will not work under
+ncurses.
+.PP
+This implementation, and others such as Solaris,
+sets the current position to 0,0 after erasing
+via \fBwerase\fP and \fBwclear\fP.
+That fact is not documented in other implementations,
+and may not be true of implementations
+which were not derived from SVr4 source.
+.PP
+Not obvious from the description,
+most implementations clear the screen after \fBwclear\fP
+even for a subwindow or derived window.
+If you do not want to clear the screen during the next \fBwrefresh\fP,
+use \fBwerase\fP instead.
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBcurs_outopts\fP(3X),
+\fBcurs_refresh\fP(3X),
+\fBcurs_variables\fP(3X)
diff --git a/man/curs_color.3x b/man/curs_color.3x
new file mode 100644
index 0000000..46d50cc
--- /dev/null
+++ b/man/curs_color.3x
@@ -0,0 +1,550 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2016,2017 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_color.3x,v 1.68 2022/02/12 20:06:41 tom Exp $
+.TH curs_color 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.ds n 5
+.na
+.hy 0
+.SH NAME
+\fBstart_color\fP,
+\fBhas_colors\fP,
+\fBcan_change_color\fP,
+\fBinit_pair\fP,
+\fBinit_color\fP,
+\fBinit_extended_pair\fP,
+\fBinit_extended_color\fP,
+\fBcolor_content\fP,
+\fBpair_content\fP,
+\fBextended_color_content\fP,
+\fBextended_pair_content\fP,
+\fBreset_color_pairs\fP,
+\fBCOLOR_PAIR\fP,
+\fBPAIR_NUMBER\fP \- \fBcurses\fP color manipulation routines
+.ad
+.hy
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBint start_color(void);\fP
+.sp
+\fBbool has_colors(void);\fP
+.br
+\fBbool can_change_color(void);\fP
+.sp
+\fBint init_pair(short \fIpair\fB, short \fIf\fB, short \fIb\fB);\fR
+.br
+\fBint init_color(short \fIcolor\fB, short \fIr\fB, short \fIg\fB, short \fIb\fB);\fR
+.br
+/* extensions */
+.br
+\fBint init_extended_pair(int \fIpair\fB, int \fIf\fB, int \fIb\fB);\fR
+.br
+\fBint init_extended_color(int \fIcolor\fB, int \fIr\fB, int \fIg\fB, int \fIb\fB);\fR
+.sp
+\fBint color_content(short \fIcolor\fB, short *\fIr\fB, short *\fIg\fB, short *\fIb\fB);\fR
+.br
+\fBint pair_content(short \fIpair\fB, short *\fIf\fB, short *\fIb\fB);\fR
+.br
+/* extensions */
+.br
+\fBint extended_color_content(int \fIcolor\fB, int *\fIr\fB, int *\fIg\fB, int *\fIb\fB);\fR
+.br
+\fBint extended_pair_content(int \fIpair\fB, int *\fIf\fB, int *\fIb\fB);\fR
+.sp
+/* extensions */
+.br
+\fBvoid reset_color_pairs(void);\fP
+.sp
+\fBint COLOR_PAIR(int \fIn\fB);\fR
+.br
+\fBPAIR_NUMBER(\fIattrs\fB);\fR
+.br
+.SH DESCRIPTION
+.SS Overview
+\fBcurses\fP supports color attributes on terminals with that capability.
+To use these routines \fBstart_color\fP must be called, usually right after
+\fBinitscr\fP.
+Colors are always used in pairs (referred to as color-pairs).
+A color-pair consists of a foreground color (for characters) and a background
+color (for the blank field on which the characters are displayed).
+A programmer initializes a color-pair with the routine \fBinit_pair\fP.
+After it has been initialized, \fBCOLOR_PAIR\fP(\fIn\fP)
+can be used to convert the pair to a video attribute.
+.PP
+If a terminal is capable of redefining colors, the programmer can use the
+routine \fBinit_color\fP to change the definition of a color.
+The routines \fBhas_colors\fP and \fBcan_change_color\fP
+return \fBTRUE\fP or \fBFALSE\fP,
+depending on whether the terminal has color capabilities and whether the
+programmer can change the colors.
+The routine \fBcolor_content\fP allows a
+programmer to extract the amounts of red, green, and blue components in an
+initialized color.
+The routine \fBpair_content\fP allows a programmer to find
+out how a given color-pair is currently defined.
+.SS Color Rendering
+The \fBcurses\fP library combines these inputs to produce the
+actual foreground and background colors shown on the screen:
+.bP
+per-character video attributes (e.g., via \fBwaddch\fP),
+.bP
+the window attribute (e.g., by \fBwattrset\fP), and
+.bP
+the background character (e.g., \fBwbkgdset\fP).
+.PP
+Per-character and window attributes are usually set by a parameter containing
+video attributes including a color pair value.
+Some functions such as \fBwattr_set\fP use a separate parameter which
+is the color pair number.
+.PP
+The background character is a special case: it includes a character value,
+just as if it were passed to \fBwaddch\fP.
+.PP
+The \fBcurses\fP library does the actual work of combining these color
+pairs in an internal function called from \fBwaddch\fP:
+.bP
+If the parameter passed to \fBwaddch\fP is \fIblank\fP,
+and it uses the special color pair 0,
+.RS
+.bP
+\fBcurses\fP next checks the window attribute.
+.bP
+If the window attribute does not use color pair 0,
+\fBcurses\fP uses the color pair from the window attribute.
+.bP
+Otherwise, \fBcurses\fP uses the background character.
+.RE
+.bP
+If the parameter passed to \fBwaddch\fP is \fInot blank\fP,
+or it does not use the special color pair 0,
+\fBcurses\fP prefers the color pair from the parameter,
+if it is nonzero.
+Otherwise, it tries the window attribute next, and finally the
+background character.
+.PP
+Some \fBcurses\fP functions such as \fBwprintw\fP call \fBwaddch\fP.
+Those do not combine its parameter with a color pair.
+Consequently those calls use only the window attribute or
+the background character.
+.SH CONSTANTS
+.PP
+In \fB<curses.h>\fP the following macros are defined.
+These are the standard colors (ISO-6429).
+\fBcurses\fP also assumes that \fBCOLOR_BLACK\fP is the default
+background color for all terminals.
+.PP
+.nf
+      \fBCOLOR_BLACK\fP
+      \fBCOLOR_RED\fP
+      \fBCOLOR_GREEN\fP
+      \fBCOLOR_YELLOW\fP
+      \fBCOLOR_BLUE\fP
+      \fBCOLOR_MAGENTA\fP
+      \fBCOLOR_CYAN\fP
+      \fBCOLOR_WHITE\fP
+.fi
+.PP
+Some terminals support more than the eight (8) \*(``ANSI\*('' colors.
+There are no standard names for those additional colors.
+.SH VARIABLES
+.SS COLORS
+is initialized by \fBstart_color\fP to the maximum number of colors
+the terminal can support.
+.SS COLOR_PAIRS
+is initialized by \fBstart_color\fP to the maximum number of color pairs
+the terminal can support.
+.SH FUNCTIONS
+.SS start_color
+The \fBstart_color\fP routine requires no arguments.
+It must be called if the programmer wants to use colors, and before any other
+color manipulation routine is called.
+It is good practice to call this routine right after \fBinitscr\fP.
+\fBstart_color\fP does this:
+.bP
+It initializes two global variables, \fBCOLORS\fP and
+\fBCOLOR_PAIRS\fP (respectively defining the maximum number of colors
+and color-pairs the terminal can support).
+.bP
+It initializes the special color pair \fB0\fP to the default foreground
+and background colors.
+No other color pairs are initialized.
+.bP
+It restores the colors on the terminal to the values
+they had when the terminal was just turned on.
+.bP
+If the terminal supports the \fBinitc\fP (\fBinitialize_color\fP) capability,
+\fBstart_color\fP
+initializes its internal table representing the
+red, green, and blue components of the color palette.
+.IP
+The components depend on whether the terminal uses
+CGA (aka \*(``ANSI\*('') or
+HLS (i.e., the \fBhls\fP (\fBhue_lightness_saturation\fP) capability is set).
+The table is initialized first for eight basic colors
+(black, red, green, yellow, blue, magenta, cyan, and white),
+using weights that depend upon the CGA/HLS choice.
+For \*(``ANSI\*('' colors the weights are \fB680\fP or \fB0\fP
+depending on whether the corresponding
+red, green, or blue component is used or not.
+That permits using \fB1000\fP to represent bold/bright colors.
+After the initial eight colors
+(if the terminal supports more than eight colors)
+the components are initialized using the same pattern,
+but with weights of \fB1000\fP.
+SVr4 uses a similar scheme, but uses \fB1000\fP
+for the components of the initial eight colors.
+.IP
+\fBstart_color\fP does not attempt to set the terminal's color palette
+to match its built-in table.
+An application may use \fBinit_color\fP to alter the internal table
+along with the terminal's color.
+.PP
+These limits apply to color values and color pairs.
+Values outside these limits are not legal, and may result in a runtime error:
+.bP
+\fBCOLORS\fP corresponds to the terminal database's \fBmax_colors\fP capability,
+(see \fBterminfo\fP(\*n)).
+.bP
+color values are expected to be in the range \fB0\fP to \fBCOLORS\-1\fP,
+inclusive (including \fB0\fP and \fBCOLORS\-1\fP).
+.bP
+a special color value \fB\-1\fP is used in certain extended functions
+to denote the \fIdefault color\fP (see \fBuse_default_colors\fP(3X)).
+.bP
+\fBCOLOR_PAIRS\fP corresponds to
+the terminal database's \fBmax_pairs\fP capability,
+(see \fBterminfo\fP(\*n)).
+.bP
+legal color pair values are in the range \fB1\fP to \fBCOLOR_PAIRS\-1\fP,
+inclusive.
+.bP
+color pair \fB0\fP is special; it denotes \*(``no color\*(''.
+.IP
+Color pair \fB0\fP is assumed to be white on black,
+but is actually whatever the terminal implements before color is initialized.
+It cannot be modified by the application.
+.SS has_colors
+.PP
+The \fBhas_colors\fP routine requires no arguments.
+It returns \fBTRUE\fP if
+the terminal can manipulate colors; otherwise, it returns \fBFALSE\fP.
+This routine facilitates writing terminal-independent programs.
+For example, a programmer can use it to decide
+whether to use color or some other video attribute.
+.SS can_change_color
+.PP
+The \fBcan_change_color\fP routine requires no arguments.
+It returns \fBTRUE\fP if the terminal supports colors
+and can change their definitions;
+other, it returns \fBFALSE\fP.
+This routine facilitates writing terminal-independent programs.
+.SS init_pair
+.PP
+The \fBinit_pair\fP routine changes the definition of a color-pair.
+It takes three arguments:
+the number of the color-pair to be changed, the foreground
+color number, and the background color number.
+For portable applications:
+.bP
+The first argument must be a legal color pair value.
+If default colors are used (see \fBuse_default_colors\fP(3X))
+the upper limit is adjusted to allow for extra pairs which use
+a default color in foreground and/or background.
+.bP
+The second and third arguments must be legal color values.
+.PP
+If the color-pair was previously initialized,
+the screen is refreshed and all occurrences of that color-pair
+are changed to the new definition.
+.PP
+As an extension, ncurses allows you to set color pair \fB0\fP via
+the \fBassume_default_colors\fP(3X) routine, or to specify the use of
+default colors (color number \fB\-1\fP) if you first invoke the
+\fBuse_default_colors\fP(3X) routine.
+.SS init_extended_pair
+.PP
+Because \fBinit_pair\fP uses signed \fBshort\fPs for its parameters,
+that limits color-pairs and color-values
+to 32767 on modern hardware.
+The extension \fBinit_extended_pair\fP uses \fBint\fPs
+for the color-pair and color-value,
+allowing a larger number of colors to be supported.
+.SS init_color
+.PP
+The \fBinit_color\fP routine changes the definition of a color.
+It takes four arguments:
+the number of the color to be changed followed by three RGB values
+(for the amounts of red, green, and blue components).
+.bP
+The first argument must be a legal color value;
+default colors are not allowed here.
+(See the section \fBColors\fP for the default color index.)
+.bP
+Each of the last three arguments
+must be a value in the range \fB0\fP through \fB1000\fP.
+.PP
+When \fBinit_color\fP is used, all
+occurrences of that color on the screen immediately change to the new
+definition.
+.SS init_extended_color
+.PP
+Because \fBinit_color\fP uses signed \fBshort\fPs for its parameters,
+that limits color-values and their red, green, and blue components
+to 32767 on modern hardware.
+The extension \fBinit_extended_color\fP uses \fBint\fPs
+for the color value and
+for setting the red, green, and blue components,
+allowing a larger number of colors to be supported.
+.SS color_content
+.PP
+The \fBcolor_content\fP routine gives programmers a way to find the intensity
+of the red, green, and blue (RGB) components in a color.
+It requires four arguments: the color number, and three addresses
+of \fBshort\fRs for storing
+the information about the amounts of red, green, and blue components in the
+given color.
+.bP
+The first argument must be a legal color value, i.e.,
+\fB0\fP through \fBCOLORS\-1\fP, inclusive.
+.bP
+The values that are stored at the addresses pointed to by the
+last three arguments are in the range
+\fB0\fP (no component) through \fB1000\fP
+(maximum amount of component), inclusive.
+.SS extended_color_content
+.PP
+Because \fBcolor_content\fP uses signed \fBshort\fPs for its parameters,
+that limits color-values and their red, green, and blue components
+to 32767 on modern hardware.
+The extension \fBextended_color_content\fP uses \fBint\fPs
+for the color value and
+for returning the red, green, and blue components,
+allowing a larger number of colors to be supported.
+.SS pair_content
+.PP
+The \fBpair_content\fP routine allows programmers to find out what colors a
+given color-pair consists of.
+It requires three arguments: the color-pair
+number, and two addresses of \fBshort\fRs for storing the foreground and the
+background color numbers.
+.bP
+The first argument must be a legal color value,
+i.e., in the range \fB1\fP through \fBCOLOR_PAIRS\-1\fP, inclusive.
+.bP
+The values that are stored at the addresses pointed
+to by the second and third arguments are in the
+range \fB0\fP through \fBCOLORS\fP, inclusive.
+.SS extended_pair_content
+.PP
+Because \fBpair_content\fP uses signed \fBshort\fPs for its parameters,
+that limits color-pair and color-values to 32767 on modern hardware.
+The extension \fBextended_pair_content\fP uses \fBint\fPs
+for the color pair and
+for returning the foreground and background colors,
+allowing a larger number of colors to be supported.
+.SS reset_color_pairs
+.PP
+The extension \fBreset_color_pairs\fP tells ncurses to discard all
+of the color-pair information which was set with \fBinit_pair\fP.
+It also touches the current- and standard-screens, allowing an application to
+switch color palettes rapidly.
+.SS PAIR_NUMBER
+.PP
+\fBPAIR_NUMBER(\fIattrs\fR) extracts the color
+value from its \fIattrs\fP parameter and returns it as a color pair number.
+.SS COLOR_PAIR
+Its inverse \fBCOLOR_PAIR(\fIn\fB)\fR converts a color pair number
+to an attribute.
+Attributes can hold color pairs in the range 0 to 255.
+If you need a color pair larger than that, you must use functions
+such as \fBattr_set\fP (which pass the color pair as a separate parameter)
+rather than the legacy functions such as \fBattrset\fP.
+.SH RETURN VALUE
+The routines \fBcan_change_color\fP and \fBhas_colors\fP return \fBTRUE\fP
+or \fBFALSE\fP.
+.PP
+All other routines return the integer \fBERR\fP upon failure and an \fBOK\fP
+(SVr4 specifies only \*(``an integer value
+other than \fBERR\fP\*('') upon successful completion.
+.PP
+X/Open defines no error conditions.
+SVr4 does document some error conditions which apply in general:
+.bP
+This implementation will return \fBERR\fP on attempts to
+use color values outside the range \fB0\fP to \fBCOLORS\fP\-1
+(except for the default colors extension),
+or use color pairs outside the range \fB0\fP to \fBCOLOR_PAIRS\-1\fP.
+.IP
+Color values used in \fBinit_color\fP must be
+in the range \fB0\fP to \fB1000\fP.
+.IP
+An error is returned from all functions
+if the terminal has not been initialized.
+.IP
+An error is returned from secondary functions such as \fBinit_pair\fP
+if \fBstart_color\fP was not called.
+.bP
+SVr4 does much the same, except that
+it returns \fBERR\fP from \fBpair_content\fP if the pair was not initialized
+using \fBinit_pairs\fP
+and
+it returns \fBERR\fP from \fBcolor_content\fP
+if the terminal does not support changing colors.
+.IP
+This implementation does not return \fBERR\fP for either case.
+.PP
+Specific functions make additional checks:
+.RS 3
+.TP 5
+\fBinit_color\fP
+returns an error if the terminal does not support
+this feature, e.g., if the \fBinitialize_color\fP capability is absent
+from the terminal description.
+.TP 5
+\fBstart_color\fP
+returns an error if the color table cannot be allocated.
+.RE
+.SH NOTES
+In the \fBncurses\fP implementation, there is a separate color activation flag,
+color palette, color pairs table,
+and associated \fBCOLORS\fP and \fBCOLOR_PAIRS\fP counts
+for each screen; the \fBstart_color\fP function only affects the current
+screen.
+The SVr4/XSI interface is not really designed with this in mind, and
+historical implementations may use a single shared color palette.
+.PP
+Setting an implicit background color via a color pair affects only
+character cells that a character write operation explicitly touches.
+To change
+the background color used when parts of a window are blanked by erasing or
+scrolling operations, see \fBcurs_bkgd\fP(3X).
+.PP
+Several caveats apply on older x86 machines
+(e.g., i386, i486) with VGA-compatible graphics:
+.bP
+COLOR_YELLOW is actually brown.
+To get yellow, use COLOR_YELLOW combined with the \fBA_BOLD\fP attribute.
+.bP
+The A_BLINK attribute should in theory cause the background to go bright.
+This often fails to work, and even some cards for which it mostly works
+(such as the
+Paradise and compatibles) do the wrong thing when you try to set a bright
+\*(``yellow\*('' background (you get a blinking yellow foreground instead).
+.bP
+Color RGB values are not settable.
+.SH HISTORY
+.PP
+SVr3.2 introduced color support to curses in 1987.
+.PP
+SVr4 made internal changes,
+e.g., moving the storage for the color state
+from \fBSP\fP (the \fBSCREEN\fP structure)
+to \fBcur_term\fP (the \fBTERMINAL\fP structure),
+but provided the same set of library functions.
+.PP
+SVr4 curses limits the number of color pairs to 64,
+reserving color pair zero (0) as the terminal's initial uncolored state.
+This limit arises because the color pair information is a bitfield
+in the \fBchtype\fP data type (denoted by \fBA_COLOR\fP).
+.PP
+Other implementations of curses had different limits:
+.bP
+PCCurses (1987-1990) provided for only eight (8) colors.
+.bP
+PDCurses (1992-present) inherited the 8-color limitation from PCCurses,
+but changed this to 256 in version 2.5 (2001),
+along with changing \fBchtype\fP from 16-bits to 32-bits.
+.bP
+X/Open Curses (1992-present)
+added a new structure \fBcchar_t\fP to store the character,
+attributes and color-pair values, allowing increased range of color-pairs.
+Both color-pairs and color-values used a signed \fBshort\fP,
+limiting values to 15 bits.
+.bP
+ncurses (1992-present) uses eight bits for \fBA_COLOR\fP in \fBchtype\fP values.
+.IP
+Version 5.3 provided a wide-character interface (2002),
+but left color-pairs as part of the attributes-field.
+.IP
+Since version 6 (2015),
+ncurses uses a separate \fBint\fP for color-pairs in the \fBcchar_t\fP values.
+When those color-pair values fit in 8 bits,
+ncurses allows color-pairs to be manipulated
+via the functions using \fBchtype\fP values.
+.bP
+NetBSD curses used 6 bits from
+2000 (when colors were first supported) until 2004.
+At that point, NetBSD changed to use 10 bits.
+As of 2021, that size is unchanged.
+Like ncurses before version 6,
+the NetBSD color-pair information is stored in
+the attributes field of \fBcchar_t\fP, limiting the number of color-pairs
+by the size of the bitfield.
+.SH PORTABILITY
+This implementation satisfies XSI Curses's minimum maximums
+for \fBCOLORS\fP and \fBCOLOR_PAIRS\fP.
+.PP
+The \fBinit_pair\fP routine accepts negative values of foreground
+and background color to support the \fBuse_default_colors\fP(3X) extension,
+but only if that routine has been first invoked.
+.PP
+The assumption that \fBCOLOR_BLACK\fP is the default
+background color for all terminals can be modified using the
+\fBassume_default_colors\fP(3X) extension.
+.PP
+This implementation checks the pointers,
+e.g., for the values returned by
+\fBcolor_content\fP and \fBpair_content\fP,
+and will treat those as optional parameters when null.
+.PP
+X/Open Curses does not specify a limit for the number of colors and
+color pairs which a terminal can support.
+However, in its use of \fBshort\fP for the parameters,
+it carries over SVr4's implementation detail for the compiled
+terminfo database, which uses signed 16-bit numbers.
+This implementation provides extended versions of those functions
+which use \fBshort\fP parameters,
+allowing applications to use larger color- and pair-numbers.
+.PP
+The \fBreset_color_pairs\fP function is an extension of ncurses.
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBcurs_initscr\fP(3X),
+\fBcurs_attr\fP(3X),
+\fBcurs_variables\fP(3X),
+\fBdefault_colors\fP(3X)
diff --git a/man/curs_delch.3x b/man/curs_delch.3x
new file mode 100644
index 0000000..4062f9e
--- /dev/null
+++ b/man/curs_delch.3x
@@ -0,0 +1,76 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2006,2010 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_delch.3x,v 1.18 2022/02/12 20:06:41 tom Exp $
+.TH curs_delch 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.SH NAME
+\fBdelch\fP,
+\fBwdelch\fP,
+\fBmvdelch\fP,
+\fBmvwdelch\fP \- delete character under the cursor in a \fBcurses\fP window
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBint delch(void);\fP
+.br
+\fBint wdelch(WINDOW *\fIwin\fB);\fR
+.br
+\fBint mvdelch(int \fIy\fB, int \fIx\fB);\fR
+.br
+\fBint mvwdelch(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB);\fR
+.br
+.SH DESCRIPTION
+These routines delete the character under the cursor; all characters to the
+right of the cursor on the same line are moved to the left one position and the
+last character on the line is filled with a blank.
+The cursor position does
+not change (after moving to \fIy\fP, \fIx\fP, if specified).
+(This does not
+imply use of the hardware delete character feature.)
+.SH RETURN VALUE
+All routines return the integer \fBERR\fP upon failure and an \fBOK\fP (SVr4
+specifies only "an integer value other than \fBERR\fP") upon successful
+completion.
+.PP
+Functions with a \*(``mv\*('' prefix first perform a cursor movement using
+\fBwmove\fP, and return an error if the position is outside the window,
+or if the window pointer is null.
+.SH NOTES
+Note that \fBdelch\fP, \fBmvdelch\fP, and \fBmvwdelch\fP may be macros.
+.SH PORTABILITY
+These functions are described in the XSI Curses standard, Issue 4.
+The
+standard specifies that they return \fBERR\fP on failure, but specifies no
+error conditions.
+.SH SEE ALSO
+\fBcurses\fP(3X)
diff --git a/man/curs_deleteln.3x b/man/curs_deleteln.3x
new file mode 100644
index 0000000..c720e05
--- /dev/null
+++ b/man/curs_deleteln.3x
@@ -0,0 +1,93 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2007,2010 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_deleteln.3x,v 1.20 2022/02/12 20:06:41 tom Exp $
+.TH curs_deleteln 3X ""
+.SH NAME
+\fBdeleteln\fP,
+\fBwdeleteln\fP,
+\fBinsdelln\fP,
+\fBwinsdelln\fP,
+\fBinsertln\fP,
+\fBwinsertln\fP \- delete and insert lines in a \fBcurses\fP window
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBint deleteln(void);\fP
+.br
+\fBint wdeleteln(WINDOW *\fIwin\fB);\fR
+.sp
+\fBint insdelln(int \fIn\fB);\fR
+.br
+\fBint winsdelln(WINDOW *\fIwin\fB, int \fIn\fB);\fR
+.sp
+\fBint insertln(void);\fP
+.br
+\fBint winsertln(WINDOW *\fIwin\fB);\fR
+.br
+.SH DESCRIPTION
+The \fBdeleteln\fP and \fBwdeleteln\fP routines delete the line under the
+cursor in the window; all lines below the current line are moved up one line.
+The bottom line of the window is cleared.
+The cursor position does not change.
+.PP
+The \fBinsdelln\fP and \fBwinsdelln\fP routines, for positive \fIn\fP, insert
+\fIn\fP lines into the specified window above the current line.
+The \fIn\fP
+bottom lines are lost.
+For negative \fIn\fP, delete \fIn\fP lines (starting
+with the one under the cursor), and move the remaining lines up.
+The bottom
+\fIn\fP lines are cleared.
+The current cursor position remains the same.
+.PP
+The \fBinsertln\fP and \fBwinsertln\fP routines insert a blank line above the
+current line and the bottom line is lost.
+.SH RETURN VALUE
+All routines return the integer \fBERR\fP upon failure and an \fBOK\fP (SVr4
+specifies only "an integer value other than \fBERR\fP") upon successful
+completion.
+.PP
+X/Open defines no error conditions.
+In this implementation,
+if the window parameter is null, an error is returned.
+.SH PORTABILITY
+These functions are described in the XSI Curses standard, Issue 4.
+The
+standard specifies that they return \fBERR\fP on failure, but specifies no
+error conditions.
+.SH NOTES
+Note that all but \fBwinsdelln\fP may be macros.
+.PP
+These routines do not require a hardware line delete or insert feature in the
+terminal.
+In fact, they will not use hardware line delete/insert unless
+\fBidlok(..., TRUE)\fP has been set on the current window.
+.SH SEE ALSO
+\fBcurses\fP(3X)
diff --git a/man/curs_extend.3x b/man/curs_extend.3x
new file mode 100644
index 0000000..53b8963
--- /dev/null
+++ b/man/curs_extend.3x
@@ -0,0 +1,97 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1999-2010,2016 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.                                                           *
+.\"***************************************************************************
+.\"
+.\" Author: Thomas E. Dickey 1999-on
+.\"
+.\" $Id: curs_extend.3x,v 1.28 2022/02/12 20:07:29 tom Exp $
+.TH curs_extend 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.SH NAME
+\fBcurses_version\fP,
+\fBuse_extended_names\fP \- miscellaneous curses extensions
+.
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBconst char * curses_version(void);\fP
+.br
+\fBint use_extended_names(bool \fIenable\fB);\fR
+.SH DESCRIPTION
+These functions are extensions to the curses library
+which do not fit easily into other categories.
+.SS curses_version
+.PP
+Use \fBcurses_version\fP
+to get the version number, including patch level of the library,
+prefixed by \*(``ncurses\*('', e.g.,
+.RS
+.sp
+.B ncurses 5.0.19991023
+.RE
+.SS use_extended_names
+.PP
+The \fBuse_extended_names\fP
+function controls whether the calling application
+is able to use user-defined or nonstandard names
+which may be compiled into the terminfo
+description, i.e., via the terminfo or termcap interfaces.
+Normally these names are available for use, since the essential decision
+is made by using the \fB\-x\fP option of \fB@TIC@\fP to compile
+extended terminal definitions.
+However you can disable this feature
+to ensure compatibility with other implementations of curses.
+.SH RETURN VALUE
+.PP
+\fBcurses_version\fP returns a pointer to static memory; you should not free
+this in your application.
+.PP
+\fBuse_extended_names\fP returns the previous state, allowing you to
+save this and restore it.
+.SH PORTABILITY
+These routines are specific to ncurses.
+They were not supported on
+Version 7, BSD or System V implementations.
+It is recommended that
+any code depending on them be conditioned using NCURSES_VERSION.
+.SH SEE ALSO
+\fBcurs_getch\fP(3X),
+\fBcurs_mouse\fP(3X),
+\fBcurs_print\fP(3X),
+\fBcurs_util\fP(3X),
+\fBdefault_colors\fP(3X),
+\fBdefine_key\fP(3X),
+\fBkeybound\fP(3X),
+\fBkeyok\fP(3X),
+\fBresizeterm\fP(3X),
+\fBwresize\fP(3X).
+.SH AUTHOR
+Thomas Dickey.
diff --git a/man/curs_get_wch.3x b/man/curs_get_wch.3x
new file mode 100644
index 0000000..8a31a90
--- /dev/null
+++ b/man/curs_get_wch.3x
@@ -0,0 +1,194 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 2002-2016,2017 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_get_wch.3x,v 1.17 2022/02/12 20:07:29 tom Exp $
+.TH curs_get_wch 3X ""
+.na
+.hy 0
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.SH NAME
+\fBget_wch\fP,
+\fBwget_wch\fP,
+\fBmvget_wch\fP,
+\fBmvwget_wch\fP,
+\fBunget_wch\fP \- get (or push back) a wide character from curses terminal keyboard
+.ad
+.hy
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBint get_wch(wint_t *\fIwch\fB);\fR
+.br
+\fBint wget_wch(WINDOW *\fIwin\fB, wint_t *\fIwch\fB);\fR
+.br
+\fBint mvget_wch(int \fIy\fB, int \fIx\fB, wint_t *\fIwch\fB);\fR
+.br
+\fBint mvwget_wch(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB, wint_t *\fIwch\fB);\fR
+.sp
+\fBint unget_wch(const wchar_t \fIwch\fB);\fR
+.SH DESCRIPTION
+.SS wget_wch
+The
+\fBget_wch\fP,
+\fBwget_wch\fP,
+\fBmvget_wch\fP, and
+\fBmvwget_wch\fP
+functions read a character
+from the terminal associated with the current or specified window.
+In no-delay mode,
+if no input is waiting, the value \fBERR\fP is returned.
+In delay mode,
+the program waits until the system passes text through to the program.
+Depending on the setting of \fBcbreak\fP,
+this is after one character (cbreak mode),
+or after the first newline (nocbreak mode).
+In half-delay mode,
+the program waits until the user types a character or the specified
+timeout interval has elapsed.
+.PP
+Unless \fBnoecho\fP has been set,
+these routines echo the character into the designated window.
+.PP
+If the window is not a pad and has been moved or modified since the
+last call to \fBwrefresh\fP,
+\fBwrefresh\fP will be called before another character is read.
+.PP
+If \fBkeypad\fP is enabled,
+these functions respond to
+the pressing of a function key by setting the object pointed to by
+\fIwch\fP
+to the keycode assigned to the function key,
+and returning \fBKEY_CODE_YES\fP.
+If a character (such as escape) that could be the
+beginning of a function key is received, curses sets a timer.
+If the remainder
+of the sequence does arrive within the designated time, curses passes through
+the character; otherwise, curses returns the function key value.
+For this
+reason, many terminals experience a delay between the time a user presses
+the escape key and the time the escape is returned to the program.
+.PP
+The keycodes returned by these functions are the same as those
+returned by \fBwgetch\fP:
+.bP
+The predefined function
+keys are listed in \fB<curses.h>\fP as macros with values outside the range
+of 8-bit characters.
+Their names begin with \fBKEY_\fP.
+.bP
+Other (user-defined) function keys
+which may be defined using \fBdefine_key\fP(3X) have no names,
+but also are expected to have values outside the range of 8-bit characters.
+.SS unget_wch
+The
+\fBunget_wch\fP
+function pushes the wide character
+\fIwch\fP
+back onto the head of the input queue, so the wide character
+is returned by the next call to
+\fBget_wch\fP.
+The pushback of
+one character is guaranteed.
+If the program calls
+\fBunget_wch\fP
+too many times without an intervening call to
+\fBget_wch\fP,
+the operation may fail.
+.PP
+Unlike \fBungetch\fP and \fBwgetch\fP,
+\fBunget_wch\fP cannot distinguish special characters
+returned by \fBwget_wch\fP from ordinary characters.
+An application can push special keys
+which it may read via \fBwget_wch\fP
+by checking for the \fBKEY_CODE_YES\fP result,
+and using \fBungetch\fP for those special keys.
+.SH NOTES
+The header file
+\fB<curses.h>\fP
+automatically
+includes the header file
+\fB<stdio.h>\fP.
+.PP
+Applications should not define the escape key by itself as a single-character
+function.
+.PP
+When using
+\fBget_wch\fP,
+\fBwget_wch\fP,
+\fBmvget_wch\fP, or
+\fBmvwget_wch\fP, applications should
+not use
+\fBnocbreak\fP
+mode and
+\fBecho\fP
+mode
+at the same time.
+Depending on the state of the tty driver when each character
+is typed, the program may produce undesirable results.
+.PP
+All functions except \fBwget_wch\fP and \fBunget_wch\fP
+may be macros.
+.SH RETURN VALUE
+When
+\fBget_wch\fP,
+\fBwget_wch\fP,
+\fBmvget_wch\fP, and
+\fBmvwget_wch\fP
+functions successfully
+report the pressing of a function key, they return
+\fBKEY_CODE_YES\fP.
+When they successfully report a wide character, they return
+\fBOK\fP.
+Otherwise, they return
+\fBERR\fP.
+.PP
+Upon successful completion,
+\fBunget_wch\fP
+returns
+\fBOK\fP.
+Otherwise, the function returns
+\fBERR\fP.
+.PP
+Functions with a \*(``mv\*('' prefix first perform a cursor movement using
+\fBwmove\fP, and return an error if the position is outside the window,
+or if the window pointer is null.
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBcurs_getch\fP(3X),
+\fBcurs_ins_wch\fP(3X),
+\fBcurs_inopts\fP(3X),
+\fBcurs_move\fP(3X),
+\fBcurs_refresh\fP(3X)
diff --git a/man/curs_get_wstr.3x b/man/curs_get_wstr.3x
new file mode 100644
index 0000000..2c49920
--- /dev/null
+++ b/man/curs_get_wstr.3x
@@ -0,0 +1,219 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 2002-2012,2017 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_get_wstr.3x,v 1.26 2022/02/12 20:07:29 tom Exp $
+.TH curs_get_wstr 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.na
+.hy 0
+.SH NAME
+\fBget_wstr\fP,
+\fBgetn_wstr\fP,
+\fBwget_wstr\fP,
+\fBwgetn_wstr\fP,
+\fBmvget_wstr\fP,
+\fBmvgetn_wstr\fP,
+\fBmvwget_wstr\fP,
+\fBmvwgetn_wstr\fP \- get an array of wide characters from a curses terminal keyboard
+.ad
+.hy
+.SH SYNOPSIS
+.nf
+\fB#include <curses.h>\fP
+.sp
+\fBint get_wstr(wint_t *\fIwstr\fB);\fR
+.br
+\fBint getn_wstr(wint_t *\fIwstr\fB, int \fIn\fB);\fR
+.br
+\fBint wget_wstr(WINDOW *\fIwin\fB, wint_t *\fIwstr\fB);\fR
+.br
+\fBint wgetn_wstr(WINDOW *\fIwin\fB, wint_t *\fIwstr\fB, int \fIn\fB);\fR
+.sp
+\fBint mvget_wstr(int \fIy\fB, int \fIx\fB, wint_t *\fIwstr\fB);\fR
+.br
+\fBint mvgetn_wstr(int \fIy\fB, int \fIx\fB, wint_t *\fIwstr\fB, int \fIn\fB);\fR
+.br
+\fBint mvwget_wstr(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB, wint_t *\fIwstr\fB);\fR
+.br
+\fBint mvwgetn_wstr(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB, wint_t *\fIwstr\fB, int \fIn\fB);\fR
+.fi
+.SH DESCRIPTION
+The effect of
+\fBget_wstr\fP
+is as though a series of calls
+to
+\fBget_wch\fP(3X)
+were made, until a newline, other end-of-line,
+or end-of-file condition is processed.
+An end-of-file condition is represented by \fBWEOF\fP,
+as defined in \fB<wchar.h>\fP.
+The newline and end-of-line conditions are represented
+by the \fB\\n\fP \fBwchar_t\fP value.
+In all instances, the end of the string is terminated by a null \fBwchar_t\fP.
+The routine places resulting values in the area pointed to by \fIwstr\fP.
+.PP
+The user's erase and kill characters are interpreted.
+If keypad
+mode is on for the window, \fBKEY_LEFT\fP and \fBKEY_BACKSPACE\fP
+are both considered equivalent to the user's kill character.
+.PP
+Characters input are echoed only if \fBecho\fP is currently on.
+In that case,
+backspace is echoed as deletion of the previous character (typically a left
+motion).
+.PP
+The effect of
+\fBwget_wstr\fP
+is as though a series of
+calls to
+\fBwget_wch\fP
+were made.
+.PP
+The effect of
+\fBmvget_wstr\fP
+is as though a call to
+\fBmove\fP
+and then a series of calls to
+\fBget_wch\fP
+were
+made.
+.PP
+The effect of
+\fBmvwget_wstr\fP
+is as though a call to
+\fBwmove\fP
+and then a series of calls to
+\fBwget_wch\fP
+were made.
+.PP
+The
+\fBgetn_wstr\fP,
+\fBmvgetn_wstr\fP,
+\fBmvwgetn_wstr\fP, and
+\fBwgetn_wstr\fP
+functions are identical
+to the
+\fBget_wstr\fP,
+\fBmvget_wstr\fP,
+\fBmvwget_wstr\fP, and
+\fBwget_wstr\fP
+functions, respectively,
+except that the
+\fB*n_*\fP
+versions read at most
+\fIn\fP
+characters, letting the application prevent overflow of the
+input buffer.
+.SH NOTES
+Using
+\fBget_wstr\fP,
+\fBmvget_wstr\fP,
+\fBmvwget_wstr\fP, or
+\fBwget_wstr\fP
+to read a line that
+overflows the array pointed to by
+\fBwstr\fP
+causes undefined
+results.
+The use of
+\fBgetn_wstr\fP,
+\fBmvgetn_wstr\fP,
+\fBmvwgetn_wstr\fP, or
+\fBwgetn_wstr\fP, respectively, is recommended.
+.PP
+These functions cannot return \fBKEY_\fP values because there
+is no way to distinguish a \fBKEY_\fP value from a valid \fBwchar_t\fP value.
+.PP
+All of these routines except \fBwgetn_wstr\fP may be macros.
+.SH RETURN VALUE
+All of these functions return \fBOK\fP upon successful completion.
+Otherwise, they return \fBERR\fP.
+.PP
+Functions using a window parameter return an error if it is null.
+.RS
+.TP 5
+\fBwgetn_wstr\fP
+returns an error if the associated call to \fBwget_wch\fP failed.
+.RE
+.PP
+Functions with a \*(``mv\*('' prefix first perform a cursor movement using
+\fBwmove\fP, and return an error if the position is outside the window,
+or if the window pointer is null.
+.SH PORTABILITY
+These functions are described in The Single Unix Specification, Version 2.
+No error conditions are defined.
+This implementation returns \fBERR\fP if the window pointer is null,
+or if the lower-level \fBwget_wch\fP call returns an \fBERR\fP.
+In the latter case,
+an \fBERR\fP return without other data is treated as an end-of-file condition,
+and the returned array contains a \fBWEOF\fP followed by a null \fBwchar_t\fP.
+.PP
+X/Open curses documented these functions to pass an array of \fBwchar_t\fP
+in 1997, but that was an error because of this part of the description:
+.RS
+.PP
+The effect of \fBget_wstr\fP is as though a series of calls to
+\fBget_wch\fP were made, until a newline character, end-of-line character, or
+end-of-file character is processed.
+.RE
+.PP
+The latter function \fIget_wch\fP can return a negative value,
+while \fBwchar_t\fP is a unsigned type.
+All of the vendors implement this using \fBwint_t\fP, following the standard.
+.PP
+X/Open Curses, Issue 7 (2009) is unclear regarding whether
+the terminating \fInull \fBwchar_t\fR
+value is counted in the length parameter \fIn\fP.
+X/Open Curses, Issue 7 revised the corresponding description
+of \fBwgetnstr\fP to address this issue.
+The unrevised description of \fBwget_nwstr\fP can be interpreted either way.
+This implementation counts the terminator in the length.
+.PP
+X/Open Curses does not specify what happens if the length \fIn\fP is negative.
+.bP
+For analogy with \fBwgetnstr\fP,
+ncurses 6.2 uses a limit (based on \fBLINE_MAX\fP).
+.bP
+Some other implementations (such as Solaris xcurses) do the same,
+while others (PDCurses) do not allow this.
+.bP
+NetBSD 7 curses imitates ncurses 6.1 in this regard,
+treating a \fB\-1\fP as an indefinite number of characters.
+.SH SEE ALSO
+Functions:
+\fBcurses\fP(3X),
+\fBcurs_get_wch\fP(3X),
+\fBcurs_getstr\fP(3X).
diff --git a/man/curs_getcchar.3x b/man/curs_getcchar.3x
new file mode 100644
index 0000000..46d3611
--- /dev/null
+++ b/man/curs_getcchar.3x
@@ -0,0 +1,202 @@
+.\"***************************************************************************
+.\" Copyright 2019-2020,2021 Thomas E. Dickey                                *
+.\" Copyright 2001-2015,2017 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_getcchar.3x,v 1.27 2021/12/25 20:35:03 tom Exp $
+.TH curs_getcchar 3X ""
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.SH NAME
+\fBgetcchar\fP,
+\fBsetcchar\fP \- Get a wide character string and rendition from a \fBcchar_t\fP or set a \fBcchar_t\fP from a wide-character string
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBint getcchar(\fP
+.br
+.B "        const cchar_t *\fIwcval\fP,"
+.br
+.B "        wchar_t *\fIwch\fP,"
+.br
+.B "        attr_t *\fIattrs\fP,"
+.br
+.B "        short *\fIcolor_pair\fP,"
+.br
+.B "        void *\fIopts\fP );"
+.sp
+.B "int setcchar("
+.br
+.B "        cchar_t *\fIwcval\fP,"
+.br
+.B "        const wchar_t *\fIwch\fP,"
+.br
+.B "        const attr_t \fIattrs\fP,"
+.br
+.B "        short \fIcolor_pair\fP,"
+.br
+.B "        const void *\fIopts\fP );"
+.SH DESCRIPTION
+.SS getcchar
+.PP
+The \fBgetcchar\fP function gets a wide-character string
+and rendition from a \fBcchar_t\fP argument.
+When \fIwch\fP is not a null pointer,
+the \fBgetcchar\fP function does the following:
+.bP
+Extracts information from a \fBcchar_t\fP value \fIwcval\fP
+.bP
+Stores the character attributes in the location pointed to by \fIattrs\fP
+.bP
+Stores the color-pair in the location pointed to by \fIcolor_pair\fP
+.bP
+Stores the wide-character string,
+characters referenced by \fIwcval\fP, into the array pointed to by \fIwch\fP.
+.PP
+When
+\fIwch\fP
+is a null pointer, the
+\fBgetcchar\fP
+function does the following:
+.bP
+Obtains the number of wide characters pointed to by \fIwcval\fP
+.bP
+Does not change the data referenced by
+\fIattrs\fP
+or
+\fIcolor_pair\fP
+.SS setcchar
+.PP
+The \fBsetcchar\fP function initializes the location pointed to by \fIwcval\fP
+by using:
+.bP
+The character attributes in
+\fIattrs\fP
+.bP
+The color pair in
+\fIcolor_pair\fP
+.bP
+The wide-character string pointed to by \fIwch\fP.
+The string must be L'\\0' terminated,
+contain at most one spacing character,
+which must be the first.
+.IP
+Up to \fBCCHARW_MAX\fP\-1 nonspacing characters may follow.
+Additional nonspacing characters are ignored.
+.IP
+The string may contain a single control character instead.
+In that case, no nonspacing characters are allowed.
+.SH EXTENSIONS
+.PP
+X/Open Curses documents the \fIopts\fP argument as reserved for future use,
+saying that it must be null.
+This implementation
+uses that parameter in ABI 6 for the functions which have a color-pair
+parameter to support extended color pairs:
+.bP
+For  functions  which modify the color, e.g., \fBsetcchar\fP,
+if \fIopts\fP is set it is treated as a pointer to \fBint\fP,
+and used to  set  the  color pair instead of the \fBshort\fP pair parameter.
+.bP
+For functions which retrieve the color, e.g., \fBgetcchar\fP,
+if \fIopts\fP is set it is treated as a pointer to \fBint\fP,
+and  used  to  retrieve  the color pair as an \fBint\fP value,
+in addition retrieving it via the standard pointer to \fBshort\fP parameter.
+.SH NOTES
+.PP
+The \fIwcval\fP argument may be a value generated by a call to
+\fBsetcchar\fP or by a function that has a \fBcchar_t\fP output argument.
+If \fIwcval\fP is constructed by any other means, the effect is unspecified.
+.SH RETURN VALUE
+.PP
+When \fIwch\fP is a null pointer,
+\fBgetcchar\fP returns the number of wide characters referenced by
+\fIwcval\fP,
+including one for a trailing null.
+.PP
+When \fIwch\fP is not a null pointer,
+\fBgetcchar\fP returns \fBOK\fP upon successful completion,
+and \fBERR\fP otherwise.
+.PP
+Upon successful completion, \fBsetcchar\fP returns \fBOK\fP.
+Otherwise, it returns \fBERR\fP.
+.SH PORTABILITY
+The \fBCCHARW_MAX\fP symbol is specific to ncurses.
+X/Open Curses does not provide details for the layout of the \fBcchar_t\fP
+structure.
+It tells what data are stored in it:
+.bP
+a spacing character (\fBwchar_t\fP, i.e., 32-bits).
+.bP
+non-spacing characters (again, \fBwchar_t\fP's).
+.bP
+attributes (at least 16 bits, inferred from the various ACS- and WACS-flags).
+.bP
+color pair (at least 16 bits, inferred from the \fBunsigned short\fP type).
+.PP
+The non-spacing characters are optional,
+in the sense that zero or more may be stored in a \fBcchar_t\fP.
+XOpen/Curses specifies a limit:
+.RS 4
+.PP
+Implementations may limit the number of non-spacing characters that can be
+associated with a spacing character, provided any limit is at least 5.
+.RE
+.PP
+The Unix implementations at the time follow that limit:
+.bP
+AIX\ 4 and OSF1\ 4 use the same declaration with an array of 5 non-spacing
+characters \fIz\fP and a single spacing character \fIc\fP.
+.bP
+HP-UX\ 10 uses an opaque structure with 28 bytes,
+which is large enough for the 6 \fBwchar_t\fP values.
+.bP
+Solaris \fIxpg4\fP curses uses a single array of 6 \fBwchar_t\fP values.
+.PP
+This implementation's \fBcchar_t\fP was defined in 1995
+using \fB5\fP for the total of spacing and non-spacing characters
+(\fBCCHARW_MAX\fP).
+That was probably due to a misreading of the AIX\ 4 header files,
+because the X/Open Curses document was not generally available at that time.
+Later (in 2002), this detail was overlooked when beginning to implement
+the functions using the structure.
+.PP
+In practice, even four non-spacing characters may seem enough.
+X/Open Curses documents possible uses for non-spacing characters,
+including using them for ligatures between characters
+(a feature apparently not supported by any curses implementation).
+Unicode does not limit the (analogous) number of combining characters,
+so some applications may be affected.
+.SH SEE ALSO
+.PP
+Functions:
+\fBcurs_attr\fP(3X),
+\fBcurs_color\fP(3X),
+\fBcurses\fP(3X),
+\fBwcwidth\fP(3).
diff --git a/man/curs_getch.3x b/man/curs_getch.3x
new file mode 100644
index 0000000..7894f87
--- /dev/null
+++ b/man/curs_getch.3x
@@ -0,0 +1,418 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2016,2017 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_getch.3x,v 1.63 2022/02/12 20:07:45 tom Exp $
+.TH curs_getch 3X ""
+.na
+.hy 0
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.SH NAME
+\fBgetch\fP,
+\fBwgetch\fP,
+\fBmvgetch\fP,
+\fBmvwgetch\fP,
+\fBungetch\fP,
+\fBhas_key\fP \- get (or push back) characters from \fBcurses\fP terminal keyboard
+.ad
+.hy
+.SH SYNOPSIS
+.B #include <curses.h>
+.PP
+.B int getch(void);
+.br
+.B int wgetch(WINDOW *\fIwin\fB);
+.sp
+.B int mvgetch(int \fIy\fB, int \fIx\fB);
+.br
+.B int mvwgetch(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB);
+.sp
+.B int ungetch(int \fIch\fB);
+.sp
+/* extension */
+.br
+.B int has_key(int \fIch\fB);
+.br
+.SH DESCRIPTION
+.SS Reading characters
+The \fBgetch\fP, \fBwgetch\fP, \fBmvgetch\fP and \fBmvwgetch\fP, routines read
+a character from the window.
+In no-delay mode, if no input is waiting, the value \fBERR\fP is returned.
+In delay mode, the program waits until the system
+passes text through to the program.
+Depending on the setting of \fBcbreak\fP,
+this is after one character (cbreak mode),
+or after the first newline (nocbreak mode).
+In half-delay mode,
+the program waits until a character is typed or the
+specified timeout has been reached.
+.PP
+If \fBecho\fP is enabled, and the window is not a pad,
+then the character will also be echoed into the
+designated window according to the following rules:
+.bP
+If the character is the current erase character, left arrow, or backspace,
+the cursor is moved one space to the left and that screen position is erased
+as if \fBdelch\fP had been called.
+.bP
+If the character value is any other \fBKEY_\fP define, the user is alerted
+with a \fBbeep\fP call.
+.bP
+If the character is a carriage-return,
+and if \fBnl\fP is enabled,
+it is translated to a line-feed after echoing.
+.bP
+Otherwise the character is simply output to the screen.
+.PP
+If the window is not a pad, and it has been moved or modified since the last
+call to \fBwrefresh\fP, \fBwrefresh\fP will be called before another character
+is read.
+.SS Keypad mode
+.PP
+If \fBkeypad\fP is \fBTRUE\fP, and a function key is pressed, the token for
+that function key is returned instead of the raw characters:
+.bP
+The predefined function
+keys are listed in \fB<curses.h>\fP as macros with values outside the range
+of 8-bit characters.
+Their names begin with \fBKEY_\fP.
+.bP
+Other (user-defined) function keys which may be defined
+using \fBdefine_key\fP(3X)
+have no names, but also are expected to have values outside the range of
+8-bit characters.
+.PP
+Thus, a variable
+intended to hold the return value of a function key must be of short size or
+larger.
+.PP
+When a character that could be the beginning of a function key is received
+(which, on modern terminals, means an escape character),
+\fBcurses\fP sets a timer.
+If the remainder of the sequence does not come in within the designated
+time, the character is passed through;
+otherwise, the function key value is returned.
+For this reason, many terminals experience a delay between the time
+a user presses the escape key and the escape is returned to the program.
+.PP
+In \fBncurses\fP, the timer normally expires after
+the value in \fBESCDELAY\fP (see \fBcurs_variables\fP(3X)).
+If \fBnotimeout\fP is \fBTRUE\fP, the timer does not expire;
+it is an infinite (or very large) value.
+Because function keys usually begin with an escape character,
+the terminal may appear to hang in notimeout mode after pressing the escape key
+until another key is pressed.
+.SS Ungetting characters
+.PP
+The \fBungetch\fP routine places \fIch\fP back onto the input queue to be
+returned by the next call to \fBwgetch\fP.
+There is just one input queue for all windows.
+.PP
+.SS Predefined key-codes
+The following special keys are defined in \fB<curses.h>\fP.
+.bP
+Except for the special case \fBKEY_RESIZE\fP,
+it is necessary to enable \fBkeypad\fP for \fBgetch\fP to return these codes.
+.bP
+Not all of these are necessarily supported on any particular terminal.
+.bP
+The naming convention may seem obscure, with some apparent
+misspellings (such as \*(``RSUME\*('' for \*(``resume\*('').
+The names correspond to the long terminfo capability names for the keys,
+and were defined long ago, in the 1980s.
+.PP
+.TS
+center tab(/) ;
+l l .
+\fBName\fP/\fBKey\fP \fBname\fP
+_
+KEY_BREAK/Break key
+KEY_DOWN/The four arrow keys ...
+KEY_UP
+KEY_LEFT
+KEY_RIGHT
+KEY_HOME/Home key (upward+left arrow)
+KEY_BACKSPACE/Backspace
+KEY_F0/T{
+Function keys; space for 64 keys is reserved.
+T}
+KEY_F(\fIn\fP)/T{
+For 0 \(<= \fIn\fP \(<= 63
+T}
+KEY_DL/Delete line
+KEY_IL/Insert line
+KEY_DC/Delete character
+KEY_IC/Insert char or enter insert mode
+KEY_EIC/Exit insert char mode
+KEY_CLEAR/Clear screen
+KEY_EOS/Clear to end of screen
+KEY_EOL/Clear to end of line
+KEY_SF/Scroll 1 line forward
+KEY_SR/Scroll 1 line backward (reverse)
+KEY_NPAGE/Next page
+KEY_PPAGE/Previous page
+KEY_STAB/Set tab
+KEY_CTAB/Clear tab
+KEY_CATAB/Clear all tabs
+KEY_ENTER/Enter or send
+KEY_SRESET/Soft (partial) reset
+KEY_RESET/Reset or hard reset
+KEY_PRINT/Print or copy
+KEY_LL/Home down or bottom (lower left)
+KEY_A1/Upper left of keypad
+KEY_A3/Upper right of keypad
+KEY_B2/Center of keypad
+KEY_C1/Lower left of keypad
+KEY_C3/Lower right of keypad
+KEY_BTAB/Back tab key
+KEY_BEG/Beg(inning) key
+KEY_CANCEL/Cancel key
+KEY_CLOSE/Close key
+KEY_COMMAND/Cmd (command) key
+KEY_COPY/Copy key
+KEY_CREATE/Create key
+KEY_END/End key
+KEY_EXIT/Exit key
+KEY_FIND/Find key
+KEY_HELP/Help key
+KEY_MARK/Mark key
+KEY_MESSAGE/Message key
+KEY_MOUSE/Mouse event occurred
+KEY_MOVE/Move key
+KEY_NEXT/Next object key
+KEY_OPEN/Open key
+KEY_OPTIONS/Options key
+KEY_PREVIOUS/Previous object key
+KEY_REDO/Redo key
+KEY_REFERENCE/Ref(erence) key
+KEY_REFRESH/Refresh key
+KEY_REPLACE/Replace key
+KEY_RESIZE/Screen resized
+KEY_RESTART/Restart key
+KEY_RESUME/Resume key
+KEY_SAVE/Save key
+KEY_SBEG/Shifted beginning key
+KEY_SCANCEL/Shifted cancel key
+KEY_SCOMMAND/Shifted command key
+KEY_SCOPY/Shifted copy key
+KEY_SCREATE/Shifted create key
+KEY_SDC/Shifted delete char key
+KEY_SDL/Shifted delete line key
+KEY_SELECT/Select key
+KEY_SEND/Shifted end key
+KEY_SEOL/Shifted clear line key
+KEY_SEXIT/Shifted exit key
+KEY_SFIND/Shifted find key
+KEY_SHELP/Shifted help key
+KEY_SHOME/Shifted home key
+KEY_SIC/Shifted insert key
+KEY_SLEFT/Shifted left arrow key
+KEY_SMESSAGE/Shifted message key
+KEY_SMOVE/Shifted move key
+KEY_SNEXT/Shifted next key
+KEY_SOPTIONS/Shifted options key
+KEY_SPREVIOUS/Shifted prev key
+KEY_SPRINT/Shifted print key
+KEY_SREDO/Shifted redo key
+KEY_SREPLACE/Shifted replace key
+KEY_SRIGHT/Shifted right arrow key
+KEY_SRSUME/Shifted resume key
+KEY_SSAVE/Shifted save key
+KEY_SSUSPEND/Shifted suspend key
+KEY_SUNDO/Shifted undo key
+KEY_SUSPEND/Suspend key
+KEY_UNDO/Undo key
+.TE
+.PP
+Keypad is arranged like this:
+.br
+.TS
+center allbox tab(/) ;
+c c c .
+\fBA1\fP/\fBup\fP/\fBA3\fP
+\fBleft\fP/\fBB2\fP/\fBright\fP
+\fBC1\fP/\fBdown\fP/\fBC3\fP
+.TE
+.sp
+A few of these predefined values do \fInot\fP correspond to a real key:
+.bP
+.B KEY_RESIZE
+is returned when the \fBSIGWINCH\fP signal has been detected
+(see \fBinitscr\fP(3X) and \fBresizeterm\fP(3X)).
+This code is returned whether or not \fBkeypad\fP has been enabled.
+.bP
+.B KEY_MOUSE
+is returned for mouse-events (see \fBcurs_mouse\fP(3X)).
+This code relies upon whether or not \fBkeypad\fP(3X) has been enabled,
+because (e.g., with \fBxterm\fP(1) mouse prototocol) ncurses must
+read escape sequences,
+just like a function key.
+.SS Testing key-codes
+.PP
+The \fBhas_key\fP routine takes a key-code value from the above list, and
+returns \fBTRUE\fP or \fBFALSE\fP according to whether
+the current terminal type recognizes a key with that value.
+.PP
+The library also supports these extensions:
+.RS 3
+.TP 5
+.B define_key
+defines a key-code for a given string (see \fBdefine_key\fP(3X)).
+.TP 5
+.B key_defined
+checks if there is a key-code defined for a given
+string (see \fBkey_defined\fP(3X)).
+.RE
+.PP
+.SH RETURN VALUE
+All routines return the integer \fBERR\fP upon failure and an integer value
+other than \fBERR\fP (\fBOK\fP in the case of \fBungetch\fP) upon successful
+completion.
+.RS 3
+.TP 5
+\fBungetch\fP
+returns \fBERR\fP
+if there is no more room in the FIFO.
+.TP
+\fBwgetch\fP
+returns \fBERR\fP
+if the window pointer is null, or
+if its timeout expires without having any data, or
+if the execution was interrupted by a signal (\fBerrno\fP will be set to
+\fBEINTR\fP).
+.RE
+.PP
+Functions with a \*(``mv\*('' prefix first perform a cursor movement using
+\fBwmove\fP, and return an error if the position is outside the window,
+or if the window pointer is null.
+.SH NOTES
+Use of the escape key by a programmer for a single character function is
+discouraged, as it will cause a delay of up to one second while the
+keypad code looks for a following function-key sequence.
+.PP
+Some keys may be the same as commonly used control
+keys, e.g.,
+\fBKEY_ENTER\fP versus control/M,
+\fBKEY_BACKSPACE\fP versus control/H.
+Some curses implementations may differ according to whether they
+treat these control keys specially (and ignore the terminfo), or
+use the terminfo definitions.
+\fBNcurses\fP uses the terminfo definition.
+If it says that \fBKEY_ENTER\fP is control/M,
+\fBgetch\fP will return \fBKEY_ENTER\fP
+when you press control/M.
+.PP
+Generally, \fBKEY_ENTER\fP denotes the character(s) sent by the \fIEnter\fP
+key on the numeric keypad:
+.bP
+the terminal description lists the most useful keys,
+.bP
+the \fIEnter\fP key on the regular keyboard is already handled by
+the standard ASCII characters for carriage-return and line-feed,
+.bP
+depending on whether \fBnl\fP or \fBnonl\fP was called,
+pressing \*(``Enter\*('' on the regular keyboard
+may return either a carriage-return or line-feed, and finally
+.bP
+\*(``Enter or send\*('' is the standard description for this key.
+.PP
+When using \fBgetch\fP, \fBwgetch\fP, \fBmvgetch\fP, or
+\fBmvwgetch\fP, nocbreak mode (\fBnocbreak\fP) and echo mode
+(\fBecho\fP) should not be used at the same time.
+Depending on the
+state of the tty driver when each character is typed, the program may
+produce undesirable results.
+.PP
+Note that \fBgetch\fP, \fBmvgetch\fP, and \fBmvwgetch\fP may be macros.
+.PP
+Historically, the set of keypad macros was largely defined by the extremely
+function-key-rich keyboard of the AT&T 7300, aka 3B1, aka Safari 4.
+Modern
+personal computers usually have only a small subset of these.
+IBM PC-style
+consoles typically support little more than \fBKEY_UP\fP, \fBKEY_DOWN\fP,
+\fBKEY_LEFT\fP, \fBKEY_RIGHT\fP, \fBKEY_HOME\fP, \fBKEY_END\fP,
+\fBKEY_NPAGE\fP, \fBKEY_PPAGE\fP, and function keys 1 through 12.
+The Ins key
+is usually mapped to \fBKEY_IC\fP.
+.SH PORTABILITY
+The *get* functions are described in the XSI Curses standard, Issue 4.
+They
+read single-byte characters only.
+The standard specifies that they return
+\fBERR\fP on failure, but specifies no error conditions.
+.PP
+The echo behavior of these functions on input of \fBKEY_\fP or backspace
+characters was not specified in the SVr4 documentation.
+This description is
+adopted from the XSI Curses standard.
+.PP
+The behavior of \fBgetch\fP and friends in the presence of handled signals is
+unspecified in the SVr4 and XSI Curses documentation.
+Under historical curses
+implementations, it varied depending on whether the operating system's
+implementation of handled signal receipt interrupts a \fBread\fP(2) call in
+progress or not, and also (in some implementations) depending on whether an
+input timeout or non-blocking mode has been set.
+.PP
+\fBKEY_MOUSE\fP is mentioned in XSI Curses, along with a few related
+terminfo capabilities, but no higher-level functions use the feature.
+The implementation in ncurses is an extension.
+.PP
+\fBKEY_RESIZE\fP is an extension first implemented for ncurses.
+NetBSD curses later added this extension.
+.PP
+Programmers concerned about portability should be prepared for either of two
+cases: (a) signal receipt does not interrupt \fBgetch\fP; (b) signal receipt
+interrupts \fBgetch\fP and causes it to return \fBERR\fP with \fBerrno\fP set to
+\fBEINTR\fP.
+.PP
+The \fBhas_key\fP function is unique to \fBncurses\fP.
+We recommend that
+any code using it be conditionalized on the \fBNCURSES_VERSION\fP feature macro.
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBcurs_inopts\fP(3X),
+\fBcurs_mouse\fP(3X),
+\fBcurs_move\fP(3X),
+\fBcurs_outopts\fP(3X),
+\fBcurs_refresh\fP(3X),
+\fBcurs_variables\fP(3X),
+\fBresizeterm\fP(3X).
+.PP
+Comparable functions in the wide-character (ncursesw) library are
+described in
+\fBcurs_get_wch\fP(3X).
diff --git a/man/curs_getstr.3x b/man/curs_getstr.3x
new file mode 100644
index 0000000..80a1c1a
--- /dev/null
+++ b/man/curs_getstr.3x
@@ -0,0 +1,246 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2017 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_getstr.3x,v 1.36 2022/02/12 20:07:29 tom Exp $
+.TH curs_getstr 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.na
+.hy 0
+.SH NAME
+\fBgetstr\fP,
+\fBgetnstr\fP,
+\fBwgetstr\fP,
+\fBwgetnstr\fP,
+\fBmvgetstr\fP,
+\fBmvgetnstr\fP,
+\fBmvwgetstr\fP,
+\fBmvwgetnstr\fP \- accept character strings from \fBcurses\fP terminal keyboard
+.ad
+.hy
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBint getstr(char *\fIstr\fB);\fR
+.br
+\fBint getnstr(char *\fIstr\fB, int \fIn\fB);\fR
+.br
+\fBint wgetstr(WINDOW *\fIwin\fB, char *\fIstr\fB);\fR
+.br
+\fBint wgetnstr(WINDOW *\fIwin\fB, char *\fIstr\fB, int \fIn\fB);\fR
+.sp
+\fBint mvgetstr(int \fIy\fB, int \fIx\fB, char *\fIstr\fB);\fR
+.br
+\fBint mvwgetstr(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB, char *\fIstr\fB);\fR
+.br
+\fBint mvgetnstr(int \fIy\fB, int \fIx\fB, char *\fIstr\fB, int \fIn\fB);\fR
+.br
+\fBint mvwgetnstr(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB, char *\fIstr\fB, int \fIn\fB);\fR
+.br
+.SH DESCRIPTION
+The function \fBgetstr\fP is equivalent to a series of calls to \fBgetch\fP,
+until a newline or carriage return is received (the terminating character is
+not included in the returned string).
+.\" X/Open says also until EOf
+.\" X/Open says then an EOS is added to the result
+.\" X/Open doesn't mention n<0
+The resulting value is placed in the
+area pointed to by the character pointer \fIstr\fP,
+followed by a NUL.
+.PP
+The \fBgetnstr\fP function reads
+from the \fIstdscr\fP default window.
+The other functions, such as \fBwgetnstr\fP,
+read from the window given as a parameter.
+.PP
+\fBgetnstr\fP reads at most \fIn\fP characters, thus preventing a possible
+overflow of the input buffer.
+Any attempt to enter more characters (other
+than the terminating newline or carriage return) causes a beep.
+Function
+keys also cause a beep and are ignored.
+.PP
+The user's \fIerase\fP and \fIkill\fP characters are interpreted:
+.bP
+The \fIerase\fP character (e.g., \fB^H\fP) erases the character
+at the end of the buffer, moving the cursor to the left.
+.IP
+If \fIkeypad\fP mode is on for the window,
+\fBKEY_LEFT\fP and \fBKEY_BACKSPACE\fP
+are both considered equivalent to the user's erase character.
+.bP
+The \fIkill\fP character (e.g., \fB^U\fP) erases the entire buffer,
+leaving the cursor at the beginning of the buffer.
+.PP
+Characters input are echoed only if \fBecho\fP is currently on.
+In that case,
+backspace is echoed as deletion of the previous character (typically a left
+motion).
+.SH RETURN VALUE
+All routines return the integer \fBERR\fP upon failure and an \fBOK\fP (SVr4
+specifies only \*(``an integer value other than \fBERR\fP\*('') upon successful
+completion.
+.PP
+X/Open defines no error conditions.
+.PP
+In this implementation,
+these functions return an error
+if the window pointer is null, or
+if its timeout expires without having any data.
+.PP
+This implementation provides an extension as well.
+If a \fBSIGWINCH\fP interrupts the function, it will return \fBKEY_RESIZE\fP
+rather than \fBOK\fP or \fBERR\fP.
+.PP
+Functions with a \*(``mv\*('' prefix first perform a cursor movement using
+\fBwmove\fP, and return an error if the position is outside the window,
+or if the window pointer is null.
+.SH NOTES
+Note that \fBgetstr\fP, \fBmvgetstr\fP, and \fBmvwgetstr\fP may be macros.
+.SH PORTABILITY
+These functions are described in the XSI Curses standard, Issue 4.
+They read single-byte characters only.
+The standard does not define any error conditions.
+This implementation returns \fBERR\fP if the window pointer is null,
+or if the lower-level \fBwgetch\fP(3X) call returns an \fBERR\fP.
+.PP
+SVr3 and early SVr4 curses implementations did not reject function keys;
+the SVr4.0 documentation claimed that \*(``special keys\*(''
+(such as function keys,
+\*(``home\*('' key,
+\*(``clear\*('' key,
+\fIetc\fP.) are \*(``interpreted\*('',
+without giving details.
+It lied.
+In fact, the \*(``character\*('' value appended to the
+string by those implementations was predictable but not useful
+(being, in fact, the low-order eight bits of the key's KEY_ value).
+.PP
+The functions \fBgetnstr\fP, \fBmvgetnstr\fP, and \fBmvwgetnstr\fP were
+present but not documented in SVr4.
+.PP
+X/Open Curses, Issue 5 (2007) stated that these functions
+\*(``read at most \fIn\fP bytes\*(''
+but did not state whether the terminating NUL is counted in that limit.
+X/Open Curses, Issue 7 (2009) changed that to say they
+\*(``read at most \fIn\fP\-1 bytes\*(''
+to allow for the terminating NUL.
+As of 2018, some implementations do, some do not count it:
+.bP
+ncurses 6.1 and PDCurses do not count the NUL in the given limit, while
+.bP
+Solaris SVr4 and NetBSD curses count the NUL as part of the limit.
+.bP
+Solaris xcurses provides both:
+its wide-character \fBwget_nstr\fP reserves a NUL,
+but its \fBwgetnstr\fP does not count the NUL consistently.
+.PP
+In SVr4 curses,
+a negative value of \fIn\fP tells \fBwgetnstr\fP to assume that the
+caller's buffer is large enough to hold the result,
+i.e., to act like \fBwgetstr\fP.
+X/Open Curses does not mention this
+(or anything related to negative or zero values of \fIn\fP),
+however most implementations
+use the feature, with different limits:
+.bP
+Solaris SVr4 curses and PDCurses limit the result to 255 bytes.
+Other Unix systems than Solaris are likely to use the same limit.
+.bP
+Solaris xcurses limits the result to \fBLINE_MAX\fP bytes.
+.bP
+NetBSD 7 assumes no particular limit for the result from \fBwgetstr\fP.
+However, it limits the \fBwgetnstr\fP parameter \fIn\fP to ensure
+that it is greater than zero.
+.IP
+A comment in NetBSD's source code states that this is specified in SUSv2.
+.bP
+ncurses (before 6.2) assumes no particular limit for the result
+from \fBwgetstr\fP, and treats the \fIn\fP parameter of \fBwgetnstr\fP
+like SVr4 curses.
+.bP
+ncurses 6.2 uses \fBLINE_MAX\fP,
+or a larger (system-dependent) value
+which the \fBsysconf\fP function may provide.
+If neither \fBLINE_MAX\fP or \fBsysconf\fP is available,
+ncurses uses the POSIX value for \fBLINE_MAX\fP (a 2048 byte limit).
+In either case, it reserves a byte for the terminating NUL.
+.PP
+Although \fBgetnstr\fP is equivalent to a series of calls to \fBgetch\fP,
+it also makes changes to the curses modes to allow simple editing of
+the input buffer:
+.bP
+\fBgetnstr\fP saves the current value of the \fBnl\fP, \fBecho\fP,
+\fBraw\fP and \fBcbreak\fP modes, and sets
+\fBnl\fP,
+\fBnoecho\fP,
+\fBnoraw\fP, and
+\fBcbreak\fP.
+.IP
+\fBgetnstr\fP handles the echoing of characters,
+rather than relying on the caller to set an appropriate mode.
+.bP
+It also obtains the \fIerase\fP and \fIkill\fP characters
+from \fBerasechar\fP and \fBkillchar\fP, respectively.
+.bP
+On return, \fBgetnstr\fP restores the modes to their previous values.
+.PP
+Other implementations differ in their treatment of special characters:
+.bP
+While they may set the \fIecho\fP mode,
+other implementations do not modify the \fIraw\fP mode,
+They may take the \fIcbreak\fP
+mode set by the caller into account when deciding whether to handle
+echoing within \fBgetnstr\fP or as a side-effect of the \fBgetch\fP calls.
+.bP
+The original ncurses (as \fIpcurses\fP in 1986) set \fBnoraw\fP and \fBcbreak\fP
+when accepting input for \fBgetnstr\fP.
+That may have been done to make function- and cursor-keys work;
+it is not necessary with ncurses.
+.IP
+Since 1995, ncurses has provided signal handlers for INTR and QUIT
+(e.g., \fB^C\fP or \fB^\\\fP).
+With the \fBnoraw\fP and \fBcbreak\fP settings,
+those may catch a signal and stop the program,
+where other implementations allow one to enter those characters in the buffer.
+.bP
+Starting in 2021 (ncurses 6.3), \fBgetnstr\fP sets \fBraw\fP,
+rather than \fBnoraw\fP and \fBcbreak\fP for better compatibility with
+SVr4-curses, e.g., allowing one to enter a \fB^C\fP into the buffer.
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBcurs_getch\fP(3X),
+\fBcurs_termattrs\fP(3X),
+\fBcurs_variables\fP(3X).
diff --git a/man/curs_getyx.3x b/man/curs_getyx.3x
new file mode 100644
index 0000000..94ceeb3
--- /dev/null
+++ b/man/curs_getyx.3x
@@ -0,0 +1,101 @@
+.\"***************************************************************************
+.\" Copyright 2020-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2007,2010 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_getyx.3x,v 1.23 2022/02/12 20:07:29 tom Exp $
+.TH curs_getyx 3X ""
+.SH NAME
+\fBgetyx\fP,
+\fBgetparyx\fP,
+\fBgetbegyx\fP,
+\fBgetmaxyx\fP \- get \fBcurses\fP cursor and window coordinates
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBvoid getyx(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB);\fR
+.br
+\fBvoid getparyx(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB);\fR
+.br
+\fBvoid getbegyx(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB);\fR
+.br
+\fBvoid getmaxyx(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB);\fR
+.br
+.SH DESCRIPTION
+The \fBgetyx\fP macro places the current cursor position of the given window in
+the two integer variables \fIy\fP and \fIx\fP.
+.PP
+If \fIwin\fP is a subwindow, the \fBgetparyx\fP macro places the beginning
+coordinates of the subwindow relative to the parent window into two integer
+variables \fIy\fP and \fIx\fP.
+Otherwise, \fB\-1\fP is placed into \fIy\fP and \fIx\fP.
+.PP
+Like \fBgetyx\fP, the \fBgetbegyx\fP and \fBgetmaxyx\fP macros store
+the current beginning coordinates and size of the specified window.
+.SH RETURN VALUE
+The return values of these macros are undefined (i.e.,
+they should not be used as the right-hand side of assignment statements).
+.SH NOTES
+All of these interfaces are macros.
+A "\fB&\fP" is not necessary before the variables \fIy\fP and \fIx\fP.
+.SH PORTABILITY
+The
+\fBgetyx\fP,
+\fBgetparyx\fP,
+\fBgetbegyx\fP and
+\fBgetmaxyx\fP
+macros are described in the XSI Curses standard, Issue 4.
+.PP
+This implementation also provides functions
+\fBgetbegx\fP,
+\fBgetbegy\fP,
+\fBgetcurx\fP,
+\fBgetcury\fP,
+\fBgetmaxx\fP,
+\fBgetmaxy\fP,
+\fBgetparx\fP and
+\fBgetpary\fP
+for compatibility with older versions of curses.
+.PP
+Although X/Open Curses does not address this,
+many implementations provide members of the WINDOW structure
+containing values corresponding to these macros.
+For best portability, do not rely on using the data in WINDOW,
+since some implementations make WINDOW opaque (do not allow
+direct use of its members).
+.PP
+Besides the problem of opaque structures,
+the data stored in like-named members may not have like-values in
+different implementations.
+For example, the WINDOW._maxx and WINDOW._maxy values in ncurses
+have (at least since release 1.8.1) differed by one from some
+other implementations.
+The difference is hidden by means of the macro \fBgetmaxyx\fP.
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBcurs_legacy\fP(3X),
+\fBcurs_opaque\fP(3X)
diff --git a/man/curs_in_wch.3x b/man/curs_in_wch.3x
new file mode 100644
index 0000000..ba24985
--- /dev/null
+++ b/man/curs_in_wch.3x
@@ -0,0 +1,71 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 2002-2010,2017 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_in_wch.3x,v 1.13 2022/02/12 20:07:29 tom Exp $
+.TH curs_in_wch 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.SH NAME
+\fBin_wch\fP,
+\fBmvin_wch\fP,
+\fBmvwin_wch\fP,
+\fBwin_wch\fP \- extract a complex character and rendition from a window
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBint in_wch(cchar_t *\fIwcval\fB);\fR
+.br
+\fBint win_wch(WINDOW *\fIwin\fB, cchar_t *\fIwcval\fB);\fR
+.sp
+\fBint mvin_wch(int \fIy\fB, int \fIx\fB, cchar_t *\fIwcval\fB);\fR
+.br
+\fBint mvwin_wch(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB, cchar_t *\fIwcval\fB);\fR
+.SH DESCRIPTION
+These functions extract the complex character and rendition from
+the current position in the named window into the \fBcchar_t\fP object
+referenced by wcval.
+.SH RETURN VALUE
+No errors are defined in the XSI Curses standard.
+This implementation checks for null pointers, returns \fBERR\fP in that case.
+Also, the \fImv\fP routines check for error moving the cursor,
+returning \fBERR\fP in that case.
+Otherwise they return \fBOK\fP.
+.PP
+Functions with a \*(``mv\*('' prefix first perform a cursor movement using
+\fBwmove\fP, and return an error if the position is outside the window,
+or if the window pointer is null.
+.SH NOTES
+Note that all of these routines may be macros.
+.SH PORTABILITY
+These functions are described in the XSI Curses standard, Issue 4.
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBcurs_inch\fP(3X).
diff --git a/man/curs_in_wchstr.3x b/man/curs_in_wchstr.3x
new file mode 100644
index 0000000..4bcec94
--- /dev/null
+++ b/man/curs_in_wchstr.3x
@@ -0,0 +1,126 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 2002-2012,2017 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_in_wchstr.3x,v 1.17 2022/02/12 20:07:29 tom Exp $
+.TH curs_in_wchstr 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.na
+.hy 0
+.SH NAME
+\fBin_wchstr\fP,
+\fBin_wchnstr\fP,
+\fBwin_wchstr\fP,
+\fBwin_wchnstr\fP,
+\fBmvin_wchstr\fP,
+\fBmvin_wchnstr\fP,
+\fBmvwin_wchstr\fP,
+\fBmvwin_wchnstr\fP \- get an array of complex characters and renditions from a curses window
+.ad
+.hy
+.SH SYNOPSIS
+.nf
+\fB#include <curses.h>\fP
+.sp
+\fBint in_wchstr(cchar_t *\fIwchstr\fB);\fR
+.br
+\fBint in_wchnstr(cchar_t *\fIwchstr\fB, int \fIn\fB);\fR
+.br
+\fBint win_wchstr(WINDOW *\fIwin\fB, cchar_t *\fIwchstr\fB);\fR
+.br
+\fBint win_wchnstr(WINDOW *\fIwin\fB, cchar_t *\fIwchstr\fB, int \fIn\fB);\fR
+.sp
+\fBint mvin_wchstr(int \fIy\fB, int \fIx\fB, cchar_t *\fIwchstr\fB);\fR
+.br
+\fBint mvin_wchnstr(int \fIy\fB, int \fIx\fB, cchar_t *\fIwchstr\fB, int \fIn\fB);\fR
+.br
+\fBint mvwin_wchstr(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB, cchar_t *\fIwchstr\fB);\fR
+.br
+\fBint mvwin_wchnstr(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB, cchar_t *\fIwchstr\fR, int \fIn\fB);\fR
+.fi
+.SH DESCRIPTION
+These functions return an array of complex characters in \fIwchstr\fP,
+starting at the current cursor position in the named window.
+Attributes (rendition) are stored with the characters.
+.PP
+The
+\fBin_wchnstr\fP,
+\fBmvin_wchnstr\fP,
+\fBmvwin_wchnstr\fP
+and
+\fBwin_wchnstr\fP
+fill the array
+with at most
+\fIn\fP
+\fBcchar_t\fP
+elements.
+.br
+.SH NOTES
+Note that all routines except
+\fBwin_wchnstr\fP
+may be
+macros.
+.PP
+Reading a line that overflows the array pointed to by
+\fIwchstr\fP
+with
+\fBin_wchstr\fP,
+\fBmvin_wchstr\fP,
+\fBmvwin_wchstr\fP
+or
+\fBwin_wchstr\fP
+causes undefined results.
+Therefore, the use of
+\fBin_wchnstr\fP,
+\fBmvin_wchnstr\fP,
+\fBmvwin_wchnstr\fP, or
+\fBwin_wchnstr\fP
+is recommended.
+.SH RETURN VALUE
+Upon successful completion, these functions return
+\fBOK\fP.
+Otherwise, they return
+\fBERR\fP.
+.PP
+Functions with a \*(``mv\*('' prefix first perform a cursor movement using
+\fBwmove\fP, and return an error if the position is outside the window,
+or if the window pointer is null.
+.SH PORTABILITY
+The XSI Curses defines no error conditions.
+This implementation checks for null pointers,
+returning \fBERR\fP in that case.
+.SH SEE ALSO
+Functions:
+\fBcurses\fP(3X),
+\fBcurs_in_wch\fP(3X),
+\fBcurs_instr\fP(3X),
+\fBcurs_inwstr\fP(3X)
+\fBcurs_inchstr\fP(3X)
diff --git a/man/curs_inch.3x b/man/curs_inch.3x
new file mode 100644
index 0000000..90992fe
--- /dev/null
+++ b/man/curs_inch.3x
@@ -0,0 +1,119 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2017 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_inch.3x,v 1.28 2022/02/12 20:07:29 tom Exp $
+.TH curs_inch 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.SH NAME
+\fBinch\fP,
+\fBwinch\fP,
+\fBmvinch\fP,
+\fBmvwinch\fP \- get a character and attributes from a \fBcurses\fP window
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBchtype inch(void);\fP
+.br
+\fBchtype winch(WINDOW *\fIwin\fB);\fR
+.sp
+\fBchtype mvinch(int \fIy\fB, int \fIx\fB);\fR
+.br
+\fBchtype mvwinch(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB);\fR
+.br
+.SH DESCRIPTION
+These routines return the character, of type \fBchtype\fP, at the current
+position in the named window.
+If any attributes are set for that position,
+their values are OR'ed into the value returned.
+Constants defined in
+\fB<curses.h>\fP can be used with the \fB&\fP (logical AND) operator to
+extract the character or attributes alone.
+.
+.SS Attributes
+The following bit-masks may be AND-ed with characters returned by \fBwinch\fP.
+.
+.TS
+l l .
+\fBA_CHARTEXT\fP	Bit-mask to extract character
+\fBA_ATTRIBUTES\fP	Bit-mask to extract attributes
+\fBA_COLOR\fP	Bit-mask to extract color-pair field information
+.TE
+.SH RETURN VALUE
+Functions with a \*(``mv\*('' prefix first perform a cursor movement using
+\fBwmove\fP, and return an error if the position is outside the window,
+or if the window pointer is null.
+.PP
+The \fBwinch\fP function does not return an error if the window contains
+characters larger than 8-bits (255).
+Only the low-order 8 bits of the character are used by \fBwinch\fP.
+.SH NOTES
+Note that all of these routines may be macros.
+.SH PORTABILITY
+These functions are described in the XSI Curses standard, Issue 4.
+.PP
+Very old systems (before standardization) provide a different function
+with the same name:
+.bP
+The \fBwinch\fP function was part of the original BSD curses library,
+which stored a 7-bit character combined with the \fIstandout\fP attribute.
+.IP
+In BSD curses, \fBwinch\fP returned only the character (as an integer)
+with the \fIstandout\fP attribute removed.
+.bP
+System V curses added support for several video attributes which
+could be combined with characters in the window.
+.IP
+Reflecting this improvement, the function was altered to return the
+character combined with all video attributes in a \fBchtype\fP value.
+.PP
+X/Open Curses does not specify
+the size and layout of attributes, color and character values in
+\fBchtype\fP; it is implementation-dependent.
+This implementation uses 8 bits for character values.
+An application using more bits, e.g., a Unicode value,
+should use the wide-character equivalents to these functions.
+.SH SEE ALSO
+.TP 5
+\fBcurses\fP(3X)
+gives an overview of the WINDOW and \fBchtype\fP data types.
+.TP 5
+\fBcurs_attr\fP(3X)
+goes into more detail, pointing out portability problems and
+constraints on the use of \fBchtype\fP for returning window information.
+.TP 5
+\fBcurs_in_wch\fP(3X)
+describes comparable functions for the wide-character (ncursesw) library.
diff --git a/man/curs_inchstr.3x b/man/curs_inchstr.3x
new file mode 100644
index 0000000..2ffa4e3
--- /dev/null
+++ b/man/curs_inchstr.3x
@@ -0,0 +1,114 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2017 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_inchstr.3x,v 1.24 2022/02/12 20:07:29 tom Exp $
+.TH curs_inchstr 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.na
+.hy 0
+.SH NAME
+\fBinchstr\fP,
+\fBinchnstr\fP,
+\fBwinchstr\fP,
+\fBwinchnstr\fP,
+\fBmvinchstr\fP,
+\fBmvinchnstr\fP,
+\fBmvwinchstr\fP,
+\fBmvwinchnstr\fP \- get a string of characters (and attributes) from a \fBcurses\fP window
+.ad
+.hy
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBint inchstr(chtype *\fIchstr\fB);\fR
+.br
+\fBint inchnstr(chtype *\fIchstr\fB, int \fIn\fB);\fR
+.br
+\fBint winchstr(WINDOW *\fIwin\fB, chtype *\fIchstr\fB);\fR
+.br
+\fBint winchnstr(WINDOW *\fIwin\fB, chtype *\fIchstr\fB, int \fIn\fB);\fR
+.sp
+\fBint mvinchstr(int \fIy\fB, int \fIx\fB, chtype *\fIchstr\fB);\fR
+.br
+\fBint mvinchnstr(int \fIy\fB, int \fIx\fB, chtype *\fIchstr\fB, int \fIn\fB);\fR
+.br
+\fBint mvwinchstr(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB, chtype *\fIchstr\fB);\fR
+.br
+\fBint mvwinchnstr(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB, chtype *\fIchstr\fB, int \fIn\fB);\fR
+.br
+.SH DESCRIPTION
+These routines return a NULL-terminated array of \fBchtype\fP quantities,
+starting at the current cursor position in the named window and ending at the
+right margin of the window.
+The four functions with \fIn\fP as
+the last argument, return a leading substring at most \fIn\fP characters long
+(exclusive of the trailing (chtype)0).
+Constants defined in \fB<curses.h>\fP can be used with the \fB&\fP (logical
+AND) operator to extract the character or the attribute alone from any position
+in the \fIchstr\fP [see \fBcurs_inch\fP(3X)].
+.SH RETURN VALUE
+All routines return the integer \fBERR\fP upon failure and an integer value
+other than \fBERR\fP upon successful completion (the number of characters
+retrieved, exclusive of the trailing 0).
+.PP
+X/Open Curses defines no error conditions.
+In this implementation:
+.bP
+If the \fIwin\fP parameter is null, an error is returned,
+.bP
+If the \fIchstr\fP parameter is null, an error is returned,
+.PP
+Functions with a \*(``mv\*('' prefix first perform a cursor movement using
+\fBwmove\fP, and return an error if the position is outside the window,
+or if the window pointer is null.
+.SH NOTES
+Note that all routines except \fBwinchnstr\fP may be macros.
+SVr4 does not
+document whether the result string is zero-terminated; it does not document
+whether a length limit argument includes any trailing 0; and it does not
+document the meaning of the return value.
+.SH PORTABILITY
+These functions are described in the XSI Curses standard, Issue 4.
+It is no
+more specific than the SVr4 documentation on the trailing 0.
+It does specify
+that the successful return of the functions is \fBOK\fP.
+.SH SEE ALSO
+\fBcurses\fP(3X), \fBcurs_inch\fP(3X).
+.PP
+Comparable functions in the wide-character (ncursesw) library are
+described in
+\fBcurs_in_wchstr\fP(3X).
diff --git a/man/curs_initscr.3x b/man/curs_initscr.3x
new file mode 100644
index 0000000..5e17ead
--- /dev/null
+++ b/man/curs_initscr.3x
@@ -0,0 +1,289 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2016,2017 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_initscr.3x,v 1.39 2022/07/24 15:46:49 tom Exp $
+.TH curs_initscr 3X ""
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.na
+.hy 0
+.SH NAME
+\fBinitscr\fP,
+\fBnewterm\fP,
+\fBendwin\fP,
+\fBisendwin\fP,
+\fBset_term\fP,
+\fBdelscreen\fP \- \fBcurses\fP screen initialization and manipulation routines
+.ad
+.hy
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBWINDOW *initscr(void);\fP
+.br
+\fBint endwin(void);\fP
+.sp
+\fBbool isendwin(void);\fP
+.sp
+\fBSCREEN *newterm(const char *\fItype\fB, FILE *\fIoutfd\fB, FILE *\fIinfd\fB);\fR
+.br
+\fBSCREEN *set_term(SCREEN *\fInew\fB);\fR
+.br
+\fBvoid delscreen(SCREEN* \fIsp\fB);\fR
+.br
+.SH DESCRIPTION
+.SS initscr
+\fBinitscr\fP is normally the first \fBcurses\fP routine to call when
+initializing a program.
+A few special routines sometimes need to be called before it;
+these are \fBslk_init\fP(3X), \fBfilter\fP, \fBripoffline\fP,
+\fBuse_env\fP.
+For multiple-terminal applications,
+\fBnewterm\fP may be called before \fBinitscr\fP.
+.PP
+The initscr code determines the terminal type and initializes all \fBcurses\fP
+data structures.
+\fBinitscr\fP also causes the first call to \fBrefresh\fP(3X)
+to clear the screen.
+If errors occur, \fBinitscr\fP writes an appropriate error
+message to standard error and exits;
+otherwise, a pointer is returned to \fBstdscr\fP.
+.SS newterm
+.PP
+A program that outputs to more than one terminal should use the \fBnewterm\fP
+routine for each terminal instead of \fBinitscr\fP.
+A program that needs to inspect capabilities,
+so it can continue to run in a line-oriented mode if the
+terminal cannot support a screen-oriented program, would also use
+\fBnewterm\fP.
+The routine \fBnewterm\fP should be called once for each terminal.
+It returns a variable of type \fBSCREEN *\fP which should be saved
+as a reference to that terminal.
+\fBnewterm\fP's arguments are
+.bP
+the \fItype\fP of the terminal to be used in place of \fB$TERM\fP,
+.bP
+a file pointer for output to the terminal, and
+.bP
+another file pointer for input from the terminal
+.PP
+If the \fItype\fP parameter is \fBNULL\fP, \fB$TERM\fP will be used.
+.SS endwin
+.PP
+The program must also call
+\fBendwin\fP for each terminal being used before exiting from \fBcurses\fP.
+If \fBnewterm\fP is called more than once for the same terminal, the first
+terminal referred to must be the last one for which \fBendwin\fP is called.
+.PP
+A program should always call \fBendwin\fP before exiting or escaping from
+\fBcurses\fP mode temporarily.
+This routine
+.bP
+resets colors to correspond with the default color pair 0,
+.bP
+moves the cursor to the lower left-hand corner of the screen,
+.bP
+clears the remainder of the line so that it uses the default colors,
+.bP
+sets the cursor to normal visibility (see \fBcurs_set\fP(3X)),
+.bP
+stops cursor-addressing mode using the \fIexit_ca_mode\fP terminal capability,
+.bP
+restores tty modes (see \fBreset_shell_mode\fP(3X)).
+.PP
+Calling \fBrefresh\fP(3X) or \fBdoupdate\fP(3X) after a
+temporary escape causes the program to resume visual mode.
+.SS isendwin
+.PP
+The \fBisendwin\fP routine returns \fBTRUE\fP if \fBendwin\fP has been
+called without any subsequent calls to \fBwrefresh\fP,
+and \fBFALSE\fP otherwise.
+.SS set_term
+.PP
+The \fBset_term\fP routine is used to switch between different terminals.
+The screen reference \fInew\fP becomes the new current terminal.
+The previous terminal is returned by the routine.
+This is the only routine which manipulates \fBSCREEN\fP pointers;
+all other routines affect only the current terminal.
+.SS delscreen
+.PP
+The \fBdelscreen\fP routine frees storage associated with the
+\fBSCREEN\fP data structure.
+The \fBendwin\fP routine does not do
+this, so \fBdelscreen\fP should be called after \fBendwin\fP if a
+particular \fBSCREEN\fP is no longer needed.
+.SH RETURN VALUE
+\fBendwin\fP returns the integer \fBERR\fP upon failure and \fBOK\fP
+upon successful completion.
+.PP
+Routines that return pointers always return \fBNULL\fP on error.
+.PP
+X/Open defines no error conditions.
+In this implementation
+.bP
+\fBendwin\fP returns an error if the terminal was not initialized.
+.bP
+\fBnewterm\fP
+returns an error if it cannot allocate the data structures for the screen,
+or for the top-level windows within the screen,
+i.e.,
+\fBcurscr\fP, \fBnewscr\fP, or \fBstdscr\fP.
+.bP
+\fBset_term\fP
+returns no error.
+.SH PORTABILITY
+These functions were described in the XSI Curses standard, Issue 4.
+As of 2015, the current document is X/Open Curses, Issue 7.
+.SS Differences
+X/Open specifies that portable applications must not
+call \fBinitscr\fP more than once:
+.bP
+The portable way to use \fBinitscr\fP is once only,
+using \fBrefresh\fP (see curs_refresh(3X))
+to restore the screen after \fBendwin\fP.
+.bP
+This implementation allows using \fBinitscr\fP after \fBendwin\fP.
+.PP
+Old versions of curses, e.g., BSD 4.4, would return a null pointer
+from \fBinitscr\fP when an error is detected, rather than exiting.
+It is safe but redundant to check the return value of \fBinitscr\fP
+in XSI Curses.
+.PP
+Calling \fBendwin\fP does not dispose of the memory allocated in \fBinitscr\fP
+or \fBnewterm\fP.
+Deleting a \fBSCREEN\fP provides a way to do this:
+.bP
+X/Open Curses does not say what happens to \fBWINDOW\fPs when \fBdelscreen\fP
+\*(``frees storage associated with the \fBSCREEN\fP\*(''
+nor does the SVr4 documentation help,
+adding that it should be called after \fBendwin\fP if a \fBSCREEN\fP
+is no longer needed.
+.bP
+However, \fBWINDOW\fPs are implicitly associated with a \fBSCREEN\fP.
+so that it is reasonable to expect \fBdelscreen\fP to deal with these.
+.bP
+SVr4 curses deletes the standard \fBWINDOW\fP structures
+\fBstdscr\fP and \fBcurscr\fP as well as a work area \fBnewscr\fP.
+SVr4 curses ignores other windows.
+.bP
+Since version 4.0 (1996), ncurses has maintained a list of all windows
+for each screen,
+using that information to delete those windows when \fBdelscreen\fP is called.
+.bP
+NetBSD copied this feature of ncurses in 2001.
+PDCurses follows the SVr4 model,
+deleting only the standard \fBWINDOW\fP structures.
+.SS Unset TERM Variable
+.PP
+If the TERM variable is missing or empty, \fBinitscr\fP uses the
+value \*(``unknown\*('',
+which normally corresponds to a terminal entry with the \fIgeneric\fP
+(\fIgn\fP) capability.
+Generic entries are detected by \fBsetupterm\fP
+(see curs_terminfo(3X)) and cannot be used for full-screen operation.
+Other implementations may handle a missing/empty TERM variable differently.
+.SS Signal Handlers
+.PP
+Quoting from X/Open Curses, section 3.1.1:
+.RS 5
+.hy 0
+.PP
+.I Curses implementations may provide for special handling of the
+.I \fBSIGINT\fP,
+.I \fBSIGQUIT\fP and
+.I \fBSIGTSTP\fP signals
+.I if their disposition is \fBSIG_DFL\fP at the time
+\fBinitscr\fI is called \fR...
+.PP
+.I Any special handling for these signals may remain in effect for the
+.I life of the process or until the process changes the disposition of
+.I the signal.
+.PP
+.I None of the Curses functions are required to be safe
+.I with respect to signals \fP...
+.RE
+.hy
+.PP
+This implementation establishes signal handlers during initialization,
+e.g., \fBinitscr\fP or \fBnewterm\fP.
+Applications which must handle these signals should set up the corresponding
+handlers \fIafter\fP initializing the library:
+.TP 5
+.B SIGINT
+The handler \fIattempts\fP to cleanup the screen on exit.
+Although it \fIusually\fP works as expected, there are limitations:
+.RS 5
+.bP
+Walking the \fBSCREEN\fP list is unsafe, since all list management
+is done without any signal blocking.
+.bP
+On systems which have \fBREENTRANT\fP turned on, \fBset_term\fP uses
+functions which could deadlock or misbehave in other ways.
+.bP
+\fBendwin\fP calls other functions, many of which use stdio or
+other library functions which are clearly unsafe.
+.RE
+.TP 5
+.B SIGTERM
+This uses the same handler as \fBSIGINT\fP, with the same limitations.
+It is not mentioned in X/Open Curses, but is more suitable for this
+purpose than \fBSIGQUIT\fP (which is used in debugging).
+.TP 5
+.B SIGTSTP
+This handles the \fIstop\fP signal, used in job control.
+When resuming the process, this implementation discards pending
+input with \fBflushinput\fP (see curs_util(3X)), and repaints the screen
+assuming that it has been completely altered.
+It also updates the saved terminal modes with \fBdef_shell_mode\fP
+(see \fBcurs_kernel\fP(3X)).
+.TP 5
+.B SIGWINCH
+This handles the window-size changes which were ignored in
+the standardization efforts.
+The handler sets a (signal-safe) variable
+which is later tested in \fBwgetch\fP (see curs_getch(3X)).
+If \fBkeypad\fP has been enabled for the corresponding window,
+\fBwgetch\fP returns the key symbol \fBKEY_RESIZE\fP.
+At the same time, \fBwgetch\fP calls \fBresizeterm\fP to adjust the
+standard screen \fBstdscr\fP,
+and update other data such as \fBLINES\fP and \fBCOLS\fP.
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBcurs_kernel\fP(3X),
+\fBcurs_refresh\fP(3X),
+\fBcurs_slk\fP(3X),
+\fBcurs_terminfo\fP(3X),
+\fBcurs_util\fP(3X),
+\fBcurs_variables\fP(3X).
diff --git a/man/curs_inopts.3x b/man/curs_inopts.3x
new file mode 100644
index 0000000..e0ba270
--- /dev/null
+++ b/man/curs_inopts.3x
@@ -0,0 +1,380 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2016,2017 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_inopts.3x,v 1.36 2022/02/12 20:07:29 tom Exp $
+.TH curs_inopts 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.na
+.hy 0
+.SH NAME
+\fBcbreak\fP,
+\fBnocbreak\fP,
+\fBecho\fP,
+\fBnoecho\fP,
+\fBhalfdelay\fP,
+\fBintrflush\fP,
+\fBkeypad\fP,
+\fBmeta\fP,
+\fBnl\fP,
+\fBnonl\fP,
+\fBnodelay\fP,
+\fBnotimeout\fP,
+\fBraw\fP,
+\fBnoraw\fP,
+\fBqiflush\fP,
+\fBnoqiflush\fP,
+\fBtimeout\fP,
+\fBwtimeout\fP,
+\fBtypeahead\fP \- \fBcurses\fP input options
+.ad
+.hy
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.PP
+\fBint cbreak(void);\fP
+.br
+\fBint nocbreak(void);\fP
+.sp
+\fBint echo(void);\fP
+.br
+\fBint noecho(void);\fP
+.sp
+\fBint intrflush(WINDOW *\fIwin\fB, bool \fIbf\fB);\fR
+.br
+\fBint keypad(WINDOW *\fIwin\fB, bool \fIbf\fB);\fR
+.br
+\fBint meta(WINDOW *\fIwin\fB, bool \fIbf\fB);\fR
+.br
+\fBint nodelay(WINDOW *\fIwin\fB, bool \fIbf\fB);\fR
+.br
+\fBint notimeout(WINDOW *\fIwin\fB, bool \fIbf\fB);\fR
+.sp
+\fBint nl(void);\fP
+.br
+\fBint nonl(void);\fP
+.sp
+\fBint raw(void);\fP
+.br
+\fBint noraw(void);\fP
+.sp
+\fBvoid qiflush(void);\fP
+.br
+\fBvoid noqiflush(void);\fP
+.sp
+\fBint halfdelay(int \fItenths\fB);\fR
+.br
+\fBvoid timeout(int \fIdelay\fB);\fR
+.br
+\fBvoid wtimeout(WINDOW *\fIwin\fB, int \fIdelay\fB);\fR
+.sp
+\fBint typeahead(int \fIfd\fB);\fR
+.br
+.SH DESCRIPTION
+The \fBncurses\fP library provides several functions which let an application
+change the way input from the terminal is handled.
+Some are global, applying to all windows.
+Others apply only to a specific window.
+Window-specific settings are not automatically applied to new or derived
+windows.
+An application must apply these to each window, if the same behavior
+is needed.
+.\"
+.SS cbreak/nocbreak
+Normally, the tty driver buffers typed characters until a newline or carriage
+return is typed.
+The \fBcbreak\fP routine disables line buffering and
+erase/kill character-processing (interrupt and flow control characters are
+unaffected), making characters typed by the user immediately available to the
+program.
+The \fBnocbreak\fP routine returns the terminal to normal (cooked)
+mode.
+.PP
+Initially the terminal may or may not be in \fBcbreak\fP mode, as the mode is
+inherited; therefore, a program should call \fBcbreak\fP or \fBnocbreak\fP
+explicitly.
+Most interactive programs using \fBcurses\fP set the \fBcbreak\fP
+mode.
+Note that \fBcbreak\fP overrides \fBraw\fP.
+[See \fBcurs_getch\fP(3X) for a
+discussion of how these routines interact with \fBecho\fP and \fBnoecho\fP.]
+.\"
+.SS echo/noecho
+.PP
+The \fBecho\fP and \fBnoecho\fP routines control whether characters typed by
+the user are echoed by \fBgetch\fP(3X) as they are typed.
+Echoing by the tty
+driver is always disabled, but initially \fBgetch\fP is in echo mode, so
+characters typed are echoed.
+Authors of most interactive programs prefer to do
+their own echoing in a controlled area of the screen, or not to echo at all, so
+they disable echoing by calling \fBnoecho\fP.
+[See \fBcurs_getch\fP(3X) for a
+discussion of how these routines interact with \fBcbreak\fP and
+\fBnocbreak\fP.]
+.\"
+.SS halfdelay
+.PP
+The \fBhalfdelay\fP routine is used for half-delay mode, which is similar to
+\fBcbreak\fP mode in that characters typed by the user are immediately
+available to the program.
+However, after blocking for \fItenths\fP tenths of
+seconds, \fBERR\fP is returned if nothing has been typed.
+The value of \fItenths\fP
+must be a number between 1 and 255.
+Use \fBnocbreak\fP to leave half-delay
+mode.
+.\"
+.SS intrflush
+.PP
+If the \fBintrflush\fP option is enabled (\fIbf\fP is \fBTRUE\fP), and an
+interrupt key is pressed on the keyboard (interrupt, break, quit), all output in
+the tty driver queue will be flushed, giving the effect of faster response to
+the interrupt, but causing \fBcurses\fP to have the wrong idea of what is on
+the screen.
+Disabling the option (\fIbf\fP is \fBFALSE\fP) prevents the
+flush.
+The default for the option is inherited from the tty driver settings.
+The window argument is ignored.
+.\"
+.SS keypad
+.PP
+The \fBkeypad\fP option enables the keypad of the user's terminal.
+If
+enabled (\fIbf\fP is \fBTRUE\fP), the user can press a function key
+(such as an arrow key) and \fBwgetch\fP(3X) returns a single value
+representing the function key, as in \fBKEY_LEFT\fP.
+If disabled
+(\fIbf\fP is \fBFALSE\fP), \fBcurses\fP does not treat function keys
+specially and the program has to interpret the escape sequences
+itself.
+If the keypad in the terminal can be turned on (made to
+transmit) and off (made to work locally), turning on this option
+causes the terminal keypad to be turned on when \fBwgetch\fP(3X) is
+called.
+The default value for keypad is \fBFALSE\fP.
+.\"
+.SS meta
+.PP
+Initially, whether the terminal returns 7 or 8 significant bits on
+input depends on the control mode of the tty driver [see \fBtermios\fP(3)].
+To force 8 bits to be returned, invoke \fBmeta\fP(\fIwin\fP,
+\fBTRUE\fP); this is equivalent, under POSIX, to setting the CS8 flag
+on the terminal.
+To force 7 bits to be returned, invoke
+\fBmeta\fP(\fIwin\fP, \fBFALSE\fP); this is equivalent, under POSIX,
+to setting the CS7 flag on the terminal.
+The window argument,
+\fIwin\fP, is always ignored.
+If the terminfo capabilities \fBsmm\fP
+(meta_on) and \fBrmm\fP (meta_off) are defined for the terminal,
+\fBsmm\fP is sent to the terminal when \fBmeta\fP(\fIwin\fP,
+\fBTRUE\fP) is called and \fBrmm\fP is sent when \fBmeta\fP(\fIwin\fP,
+\fBFALSE\fP) is called.
+.\"
+.SS nl/nonl
+.PP
+The \fBnl\fP and \fBnonl\fP routines control whether the underlying display
+device translates the return key into newline on input.
+.\"
+.SS nodelay
+.PP
+The \fBnodelay\fP option causes \fBgetch\fP to be a non-blocking call.
+If no input is ready, \fBgetch\fP returns \fBERR\fP.
+If disabled
+(\fIbf\fP is \fBFALSE\fP), \fBgetch\fP waits until a key is pressed.
+.SS notimeout
+.PP
+When interpreting an escape sequence, \fBwgetch\fP(3X) sets a timer
+while waiting for the next character.
+If \fBnotimeout(\fIwin\fR,
+\fBTRUE\fP) is called, then \fBwgetch\fP does not set a timer.
+The
+purpose of the timeout is to differentiate between sequences received
+from a function key and those typed by a user.
+.\"
+.SS raw/noraw
+.PP
+The \fBraw\fP and \fBnoraw\fP routines place the terminal into or out of raw
+mode.
+Raw mode is similar to \fBcbreak\fP mode, in that characters typed are
+immediately passed through to the user program.
+The differences are that in
+raw mode, the interrupt, quit, suspend, and flow control characters are all
+passed through uninterpreted, instead of generating a signal.
+The behavior of
+the BREAK key depends on other bits in the tty driver that are not set by
+\fBcurses\fP.
+.\"
+.SS qiflush/noqiflush
+.PP
+When the \fBnoqiflush\fP routine is used, normal flush of input and
+output queues associated with the \fBINTR\fP, \fBQUIT\fP and
+\fBSUSP\fP characters will not be done [see \fBtermios\fP(3)].
+When
+\fBqiflush\fP is called, the queues will be flushed when these control
+characters are read.
+You may want to call \fBnoqiflush\fP in a signal
+handler if you want output to continue as though the interrupt
+had not occurred, after the handler exits.
+.\"
+.SS timeout/wtimeout
+.PP
+The \fBtimeout\fP and \fBwtimeout\fP routines set blocking or
+non-blocking read for a given window.
+If \fIdelay\fP is negative,
+blocking read is used (i.e., waits indefinitely for
+input).
+If \fIdelay\fP is zero, then non-blocking read is used
+(i.e., read returns \fBERR\fP if no input is waiting).
+If
+\fIdelay\fP is positive, then read blocks for \fIdelay\fP
+milliseconds, and returns \fBERR\fP if there is still no input.
+Hence, these routines provide the same functionality as \fBnodelay\fP,
+plus the additional capability of being able to block for only
+\fIdelay\fP milliseconds (where \fIdelay\fP is positive).
+.\"
+.SS typeahead
+.PP
+The \fBcurses\fP library does \*(``line-breakout optimization\*(''
+by looking for typeahead periodically while updating the screen.
+If input is found, and it is coming from a tty,
+the current update is postponed until
+\fBrefresh\fP(3X) or \fBdoupdate\fP is called again.
+This allows faster response to commands typed in advance.
+Normally, the input FILE
+pointer passed to \fBnewterm\fP, or \fBstdin\fP in the case that
+\fBinitscr\fP was used, will be used to do this typeahead checking.
+The \fBtypeahead\fP routine specifies that the file descriptor
+\fIfd\fP is to be used to check for typeahead instead.
+If \fIfd\fP is
+\-1, then no typeahead checking is done.
+.\"
+.SH RETURN VALUE
+All routines that return an integer return \fBERR\fP upon failure and \fBOK\fP
+(SVr4 specifies only \*(``an integer value other than \fBERR\fP\*('')
+upon successful completion,
+unless otherwise noted in the preceding routine descriptions.
+.PP
+X/Open does not define any error conditions.
+In this implementation,
+functions with a window parameter will return an error if it is null.
+Any function will also return an error if the terminal was not initialized.
+Also,
+.RS
+.TP 5
+\fBhalfdelay\fP
+returns an error
+if its parameter is outside the range 1..255.
+.RE
+.SH PORTABILITY
+These functions are described in the XSI Curses standard, Issue 4.
+.PP
+The ncurses library obeys the XPG4 standard and the historical practice of the
+AT&T curses implementations, in that the echo bit is cleared when curses
+initializes the terminal state.
+BSD curses differed from this slightly; it
+left the echo bit on at initialization, but the BSD \fBraw\fP call turned it
+off as a side-effect.
+For best portability, set \fBecho \fPor \fBnoecho\fP explicitly
+just after initialization, even if your program remains in cooked mode.
+.PP
+The XSI Curses standard is ambiguous on the question of whether \fBraw\fP
+should disable the CRLF translations controlled by \fBnl\fP and \fBnonl\fP.
+BSD curses did turn off these translations; AT&T curses (at least as late as
+SVr1) did not.
+We chose to do so, on the theory that a programmer requesting
+raw input wants a clean (ideally 8-bit clean) connection that the operating
+system will not alter.
+.PP
+When \fBkeypad\fP is first enabled,
+ncurses loads the key-definitions for the current terminal description.
+If the terminal description includes extended string capabilities,
+e.g., from using the \fB\-x\fP option of \fB@TIC@\fP,
+then ncurses also defines keys for the capabilities whose names
+begin with \*(``k\*(''.
+The corresponding keycodes are generated and (depending on previous
+loads of terminal descriptions) may differ from one execution of a
+program to the next.
+The generated keycodes are recognized by the \fBkeyname\fP function
+(which will then return a name beginning with \*(``k\*('' denoting the
+terminfo capability name rather than \*(``K\*('', used for curses key-names).
+On the other hand, an application can use \fBdefine_key\fP to establish
+a specific keycode for a given string.
+This makes it possible for an application to check for an extended
+capability's presence with \fBtigetstr\fP,
+and reassign the keycode to match its own needs.
+.PP
+Low-level applications can use \fBtigetstr\fP to obtain the definition
+of any particular string capability.
+Higher-level applications which use the curses \fBwgetch\fP
+and similar functions to return keycodes rely upon the order in which
+the strings are loaded.
+If more than one key definition has the same string value,
+then \fBwgetch\fP can return only one keycode.
+Most curses implementations (including ncurses)
+load key definitions in the order
+defined by the array of string capability names.
+The last key to be loaded determines the keycode which will be returned.
+In ncurses, you may also have extended capabilities interpreted as
+key definitions.
+These are loaded after the predefined keys,
+and if a capability's value is the same as a previously-loaded
+key definition,
+the later definition is the one used.
+.SH NOTES
+Note that
+\fBecho\fP,
+\fBnoecho\fP,
+\fBhalfdelay\fP,
+\fBintrflush\fP,
+\fBmeta\fP,
+\fBnl\fP,
+\fBnonl\fP,
+\fBnodelay\fP,
+\fBnotimeout\fP,
+\fBnoqiflush\fP,
+\fBqiflush\fP,
+\fBtimeout\fP, and
+\fBwtimeout\fP may be macros.
+.PP
+The \fBnoraw\fP and \fBnocbreak\fP calls follow historical practice in that
+they attempt to restore to normal (\*(``cooked\*('') mode
+from raw and cbreak modes respectively.
+Mixing raw/noraw and cbreak/nocbreak calls leads to tty driver
+control states that are hard to predict or understand; it is not recommended.
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBcurs_getch\fP(3X),
+\fBcurs_initscr\fP(3X),
+\fBcurs_util\fP(3X),
+\fBdefine_key\fP(3X),
+\fBtermios\fP(3)
diff --git a/man/curs_ins_wch.3x b/man/curs_ins_wch.3x
new file mode 100644
index 0000000..1acd493
--- /dev/null
+++ b/man/curs_ins_wch.3x
@@ -0,0 +1,68 @@
+.\"***************************************************************************
+.\" Copyright 2019-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 2002-2010,2017 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_ins_wch.3x,v 1.13 2022/02/12 20:05:11 tom Exp $
+.TH curs_ins_wch 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.SH NAME
+\fBins_wch\fP,
+\fBmvins_wch\fP,
+\fBmvwins_wch\fP,
+\fBwins_wch\fP \- insert a complex character and rendition into a window
+.SH SYNOPSIS
+#include <curses.h>
+.sp
+\fBint ins_wch(const cchar_t *\fIwch\fB);\fR
+.br
+\fBint wins_wch(WINDOW *\fIwin\fB, const cchar_t *\fIwch\fB);\fR
+.sp
+\fBint mvins_wch(int \fIy\fB, int \fIx\fB, const cchar_t *\fIwch\fB);\fR
+.br
+\fBint mvwins_wch(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB, const cchar_t *\fIwch\fB);\fR
+.SH DESCRIPTION
+These routines, insert the complex character \fIwch\fP with rendition
+before the character under the cursor.
+All characters to the right of the cursor are moved one space to the right,
+with the possibility of the rightmost character on the line being lost.
+The insertion operation does not change the cursor position.
+.SH RETURN VALUE
+If successful, these functions return \fBOK\fP.
+If not, they return \fBERR\fP.
+.PP
+Functions with a \*(``mv\*('' prefix first perform a cursor movement using
+\fBwmove\fP, and return an error if the position is outside the window,
+or if the window pointer is null.
+.SH ERRORS
+No errors are defined.
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBcurs_insch\fP(3X).
diff --git a/man/curs_ins_wstr.3x b/man/curs_ins_wstr.3x
new file mode 100644
index 0000000..5719971
--- /dev/null
+++ b/man/curs_ins_wstr.3x
@@ -0,0 +1,111 @@
+.\"***************************************************************************
+.\" Copyright 2019-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 2002-2012,2017 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_ins_wstr.3x,v 1.14 2022/02/12 20:05:11 tom Exp $
+.TH curs_ins_wstr 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.na
+.hy 0
+.SH NAME
+\fBins_wstr\fP,
+\fBins_nwstr\fP,
+\fBwins_wstr\fP,
+\fBwins_nwstr\fP,
+\fBmvins_wstr\fP,
+\fBmvins_nwstr\fP,
+\fBmvwins_wstr\fP,
+\fBmvwins_nwstr\fP \- insert a wide-character string into a curses window
+.ad
+.hy
+.SH SYNOPSIS
+.nf
+\fB#include <curses.h>\fP
+.sp
+\fBint ins_wstr(const wchar_t *\fIwstr);\fR
+.br
+\fBint ins_nwstr(const wchar_t *\fIwstr\fB, int \fIn\fB);\fR
+.br
+\fBint wins_wstr(WINDOW *\fIwin\fB, const wchar_t *\fIwstr\fB);\fR
+.br
+\fBint wins_nwstr(WINDOW *\fIwin\fB, const wchar_t *\fIwstr\fB, int \fIn\fB);\fR
+.sp
+\fBint mvins_wstr(int \fIy\fB, int \fIx\fB, const wchar_t *\fIwstr\fB);\fR
+.br
+\fBint mvins_nwstr(int \fIy\fB, int \fIx\fB, const wchar_t *\fIwstr\fB, int \fIn\fB);\fR
+.br
+\fBint mvwins_wstr(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB, const wchar_t *\fIwstr\fB);\fR
+.br
+\fBint mvwins_nwstr(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB, const wchar_t *\fIwstr\fB, int \fIn\fB);\fR
+.fi
+.SH DESCRIPTION
+These routines insert a \fBwchar_t\fP character string
+(as many characters as will fit on the line)
+before the character under the cursor.
+All characters to the right of the cursor are shifted right,
+with the possibility of the rightmost characters on the line being lost.
+No wrapping is performed.
+The cursor position does not change
+(after moving to \fIy\fP, \fIx\fP, if specified).
+The four routines with \fIn\fP as the last argument
+insert a leading substring of at most \fIn\fP \fBwchar_t\fP characters.
+If \fIn\fP is less than 1, the entire string is inserted.
+.PP
+If a character in \fIwstr\fP is a tab, newline, carriage return or
+backspace, the cursor is moved appropriately within the window.
+A newline also does a \fBclrtoeol\fP before moving.
+Tabs are considered to be at every eighth column.
+If a character in \fIwstr\fP is another control character,
+it is drawn in the \fB^\fIX\fR notation.
+Calling \fBwin_wch\fP after adding a control character
+(and moving to it, if necessary)
+does not return the control character,
+but instead returns a character in the ^-representation
+of the control character.
+.SH NOTES
+Note that all but wins_nwstr may be macros.
+.PP
+If the first character in the string is a nonspacing character, these
+functions will fail.
+XSI does not define what will happen if a nonspacing character follows
+a control character.
+.SH RETURN VALUE
+Upon successful completion, these functions return \fBOK\fP.
+Otherwise, they return \fBERR\fP.
+.PP
+Functions with a \*(``mv\*('' prefix first perform a cursor movement using
+\fBwmove\fP, and return an error if the position is outside the window,
+or if the window pointer is null.
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBcurs_insstr\fP(3X),
+\fBcurs_in_wch\fP(3X),
+\fBcurs_ins_wch\fP(3X).
diff --git a/man/curs_insch.3x b/man/curs_insch.3x
new file mode 100644
index 0000000..7534c93
--- /dev/null
+++ b/man/curs_insch.3x
@@ -0,0 +1,79 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2017 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_insch.3x,v 1.22 2022/02/12 20:05:11 tom Exp $
+.TH curs_insch 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.SH NAME
+\fBinsch\fP,
+\fBwinsch\fP,
+\fBmvinsch\fP,
+\fBmvwinsch\fP \- insert a character before cursor in a \fBcurses\fP window
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBint insch(chtype \fIch\fB);\fR
+.br
+\fBint winsch(WINDOW *\fIwin\fB, chtype \fIch\fB);\fR
+.sp
+\fBint mvinsch(int \fIy\fB, int \fIx\fB, chtype \fIch\fB);\fR
+.br
+\fBint mvwinsch(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB, chtype \fIch\fB);\fR
+.br
+.SH DESCRIPTION
+These routines insert the character \fIch\fP before the character under the
+cursor.
+All characters to the right of the cursor are moved one space to the
+right, with the possibility of the rightmost character on the line being lost.
+The insertion operation does not change the cursor position.
+.SH RETURN VALUE
+All routines that return an integer return \fBERR\fP upon failure and \fBOK\fP
+(SVr4 specifies only "an integer value other than \fBERR\fP")
+upon successful completion,
+unless otherwise noted in the preceding routine descriptions.
+.PP
+Functions with a \*(``mv\*('' prefix first perform a cursor movement using
+\fBwmove\fP, and return an error if the position is outside the window,
+or if the window pointer is null.
+.SH NOTES
+These routines do not necessarily imply use of a hardware insert character
+feature.
+.PP
+Note that \fBinsch\fP, \fBmvinsch\fP, and \fBmvwinsch\fP may be macros.
+.SH PORTABILITY
+These functions are described in the XSI Curses standard, Issue 4.
+.SH SEE ALSO
+\fBcurses\fP(3X).
+.PP
+Comparable functions in the wide-character (ncursesw) library are
+described in
+\fBcurs_ins_wch\fP(3X).
diff --git a/man/curs_insstr.3x b/man/curs_insstr.3x
new file mode 100644
index 0000000..44bc6fd
--- /dev/null
+++ b/man/curs_insstr.3x
@@ -0,0 +1,105 @@
+.\"***************************************************************************
+.\" Copyright 2019-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2017 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_insstr.3x,v 1.29 2022/02/12 20:05:11 tom Exp $
+.TH curs_insstr 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.SH NAME
+\fBinsstr\fP,
+\fBinsnstr\fP,
+\fBwinsstr\fP,
+\fBwinsnstr\fP,
+\fBmvinsstr\fP,
+\fBmvinsnstr\fP,
+\fBmvwinsstr\fP,
+\fBmvwinsnstr\fP \- insert string before cursor in a \fBcurses\fP window
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.br
+\fBint insstr(const char *\fIstr\fB);\fR
+.br
+\fBint insnstr(const char *\fIstr\fB, int \fIn\fB);\fR
+.br
+\fBint winsstr(WINDOW *\fIwin\fB, const char *\fIstr\fB);\fR
+.br
+\fBint winsnstr(WINDOW *\fIwin\fB, const char *\fIstr\fB, int \fIn\fB);\fR
+.sp
+\fBint mvinsstr(int \fIy\fB, int \fIx\fB, const char *\fIstr\fB);\fR
+.br
+\fBint mvinsnstr(int \fIy\fB, int \fIx\fB, const char *\fIstr\fB, int \fIn\fB);\fR
+.br
+\fBint mvwinsstr(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB, const char *\fIstr\fB);\fR
+.br
+\fBint mvwinsnstr(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB, const char *\fIstr\fB, int \fIn\fB);\fR
+.br
+.SH DESCRIPTION
+These routines insert a character string
+(as many characters as will fit on the line)
+before the character under the cursor.
+All characters to the right of the cursor are shifted right
+with the possibility of the rightmost characters on the line being lost.
+The cursor position does not change
+(after moving to \fIy\fP, \fIx\fP, if specified).
+The functions with \fIn\fP as the last argument
+insert a leading substring of at most \fIn\fP characters.
+If \fIn\fP<=0, then the entire string is inserted.
+.PP
+Special characters are handled as in \fBaddch\fP.
+.SH RETURN VALUE
+All routines that return an integer return \fBERR\fP upon failure and \fBOK\fP
+(SVr4 specifies only "an integer value other than \fBERR\fP")
+upon successful completion,
+unless otherwise noted in the preceding routine descriptions.
+.PP
+X/Open defines no error conditions.
+In this implementation,
+if the window parameter is null or the str parameter is null,
+an error is returned.
+.PP
+Functions with a \*(``mv\*('' prefix first perform a cursor movement using
+\fBwmove\fP, and return an error if the position is outside the window,
+or if the window pointer is null.
+.SH NOTES
+Note that all but \fBwinsnstr\fP may be macros.
+.SH PORTABILITY
+These functions are described in the XSI Curses standard, Issue 4, which adds
+const qualifiers to the arguments.
+.LP
+The Single Unix Specification, Version 2 states that
+\fBinsnstr\fP and \fBwinsnstr\fP perform wrapping.
+This is probably an error, since it makes this group of functions inconsistent.
+Also, no implementation of curses documents this inconsistency.
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBcurs_util\fP(3X),
+\fBcurs_clear\fP(3X),
+\fBcurs_inch\fP(3X).
diff --git a/man/curs_instr.3x b/man/curs_instr.3x
new file mode 100644
index 0000000..4ab3e54
--- /dev/null
+++ b/man/curs_instr.3x
@@ -0,0 +1,99 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2017 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_instr.3x,v 1.25 2022/02/12 20:05:11 tom Exp $
+.TH curs_instr 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.SH NAME
+\fBinstr\fP,
+\fBinnstr\fP,
+\fBwinstr\fP,
+\fBwinnstr\fP,
+\fBmvinstr\fP,
+\fBmvinnstr\fP,
+\fBmvwinstr\fP,
+\fBmvwinnstr\fP \- get a string of characters from a \fBcurses\fP window
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBint instr(char *\fIstr\fB);\fR
+.br
+\fBint innstr(char *\fIstr\fB, int \fIn\fB);\fR
+.br
+\fBint winstr(WINDOW *\fIwin\fB, char *\fIstr\fB);\fR
+.br
+\fBint winnstr(WINDOW *\fIwin\fB, char *\fIstr\fB, int \fIn\fB);\fR
+.sp
+\fBint mvinstr(int \fIy\fB, int \fIx\fB, char *\fIstr\fB);\fR
+.br
+\fBint mvinnstr(int \fIy\fB, int \fIx\fB, char *\fIstr\fB, int \fIn\fB);\fR
+.br
+\fBint mvwinstr(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB, char *\fIstr\fB);\fR
+.br
+\fBint mvwinnstr(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB, char *\fIstr\fB, int \fIn\fB);\fR
+.br
+.SH DESCRIPTION
+These routines return a string of characters in \fIstr\fP, extracted starting
+at the current cursor position in the named window.
+Attributes are stripped from the characters.
+The four
+functions with \fIn\fP as the last argument return a leading substring at most
+\fIn\fP characters long (exclusive of the trailing NUL).
+.SH RETURN VALUE
+All of the functions return \fBERR\fP upon failure,
+or the number of characters actually read into the string.
+.PP
+X/Open Curses defines no error conditions.
+In this implementation:
+.bP
+If the \fIwin\fP parameter is null, an error is returned,
+.bP
+If the \fIchstr\fP parameter is null, an error is returned,
+.PP
+Functions with a \*(``mv\*('' prefix first perform a cursor movement using
+\fBwmove\fP, and return an error if the position is outside the window,
+or if the window pointer is null.
+.SH NOTES
+Note that all routines except \fBwinnstr\fP may be macros.
+.SH PORTABILITY
+SVr4 does not
+document whether a length limit includes or excludes the trailing NUL.
+.PP
+The ncurses library extends the XSI description by allowing a negative
+value for \fIn\fP.
+In this case, the functions return the string ending at the right margin.
+.SH SEE ALSO
+\fBcurses\fP(3X).
diff --git a/man/curs_inwstr.3x b/man/curs_inwstr.3x
new file mode 100644
index 0000000..3b02fee
--- /dev/null
+++ b/man/curs_inwstr.3x
@@ -0,0 +1,106 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 2002-2012,2017 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_inwstr.3x,v 1.17 2022/02/12 20:05:11 tom Exp $
+.TH curs_inwstr 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.SH NAME
+\fBinwstr\fP,
+\fBinnwstr\fP,
+\fBwinwstr\fP,
+\fBwinnwstr\fP,
+\fBmvinwstr\fP,
+\fBmvinnwstr\fP,
+\fBmvwinwstr\fP,
+\fBmvwinnwstr\fP \- get a string of \fBwchar_t\fP characters from a curses window
+.SH SYNOPSIS
+.nf
+\fB#include <curses.h> \fP
+.sp
+\fBint inwstr(\fBwchar_t *\fIwstr\fB);\fR
+.br
+\fBint innwstr(\fBwchar_t *\fIwstr\fB, int \fIn\fB);\fR
+.br
+\fBint winwstr(\fBWINDOW *\fIwin\fB, wchar_t *\fIwstr\fB);\fR
+.br
+\fBint winnwstr(\fBWINDOW *\fIwin\fB, wchar_t *\fIwstr\fB, int \fIn\fB);\fR
+.sp
+\fBint mvinwstr(\fBint \fIy\fB, int \fIx\fB, wchar_t *\fIwstr\fB);\fR
+.br
+\fBint mvinnwstr(\fBint \fIy\fB, int \fIx\fB, wchar_t *\fIwstr\fB, int \fIn\fB);\fR
+.br
+\fBint mvwinwstr(\fBWINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB, wchar_t *\fIwstr\fB);\fR
+.br
+\fBint mvwinnwstr(\fBWINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB, wchar_t *\fIwstr\fB, int \fIn\fB);\fR
+.fi
+.SH DESCRIPTION
+.PP
+These routines return a string of \fBwchar_t\fP wide characters in \fIwstr\fP,
+extracted starting at the current cursor position in the named window.
+.PP
+The four functions with \fIn\fP as the last argument return
+a leading substring at most \fIn\fP characters long
+(exclusive of the trailing NUL).
+Transfer stops at the end of the current line, or when \fIn\fP characters have
+been stored at the location referenced by \fIwstr\fP.
+.PP
+If the size \fIn\fP is not large enough to store a complete complex character,
+an error is generated.
+.SH NOTES
+.PP
+All routines except
+\fBwinnwstr\fP
+may be macros.
+.PP
+Each cell in the window holds a complex character (i.e., base-
+and combining-characters) together with attributes and color.
+These functions store only the wide characters,
+ignoring attributes and color.
+Use \fBin_wchstr\fP to return the complex characters from a window.
+.SH RETURN VALUE
+All routines return
+\fBERR\fP
+upon failure.
+Upon
+successful completion, the *\fBinwstr\fP
+routines return
+\fBOK\fP, and the *\fBinnwstr\fP
+routines return the
+number of characters read into the string.
+.PP
+Functions with a \*(``mv\*('' prefix first perform a cursor movement using
+\fBwmove\fP, and return an error if the position is outside the window,
+or if the window pointer is null.
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBcurs_instr\fP(3X),
+\fBcurs_in_wchstr\fP(3X)
diff --git a/man/curs_kernel.3x b/man/curs_kernel.3x
new file mode 100644
index 0000000..73dec7b
--- /dev/null
+++ b/man/curs_kernel.3x
@@ -0,0 +1,231 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2016,2017 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_kernel.3x,v 1.32 2022/02/12 20:05:11 tom Exp $
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.TH curs_kernel 3X ""
+.na
+.hy 0
+.SH NAME
+\fBdef_prog_mode\fP,
+\fBdef_shell_mode\fP,
+\fBreset_prog_mode\fP,
+\fBreset_shell_mode\fP,
+\fBresetty\fP,
+\fBsavetty\fP,
+\fBgetsyx\fP,
+\fBsetsyx\fP,
+\fBripoffline\fP,
+\fBcurs_set\fP,
+\fBnapms\fP \- low-level \fBcurses\fP routines
+.ad
+.hy
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBint def_prog_mode(void);\fP
+.br
+\fBint def_shell_mode(void);\fP
+.sp
+\fBint reset_prog_mode(void);\fP
+.br
+\fBint reset_shell_mode(void);\fP
+.sp
+\fBint resetty(void);\fP
+.br
+\fBint savetty(void);\fP
+.sp
+\fBvoid getsyx(int \fIy\fB, int \fIx\fB);\fR
+.br
+\fBvoid setsyx(int \fIy\fB, int \fIx\fB);\fR
+.sp
+\fBint ripoffline(int \fIline\fB, int (*\fIinit\fB)(WINDOW *, int));\fR
+.br
+\fBint curs_set(int \fIvisibility\fB);\fR
+.br
+\fBint napms(int \fIms\fB);\fR
+.br
+.SH DESCRIPTION
+The following routines give low-level access
+to various \fBcurses\fP capabilities.
+These routines typically are used inside library routines.
+.SS def_prog_mode, def_shell_mode
+.PP
+The \fBdef_prog_mode\fP and \fBdef_shell_mode\fP routines save the
+current terminal modes as the \*(``program\*('' (in \fBcurses\fP) or \*(``shell\*(''
+(not in \fBcurses\fP) state for use by the \fBreset_prog_mode\fP and
+\fBreset_shell_mode\fP routines.
+This is done automatically by \fBinitscr\fP.
+There is one such save area for each screen context
+allocated by \fBnewterm\fP.
+.SS reset_prog_mode, reset_shell_mode
+.PP
+The \fBreset_prog_mode\fP and \fBreset_shell_mode\fP routines restore
+the terminal to \*(``program\*('' (in \fBcurses\fP) or \*(``shell\*('' (out of
+\fBcurses\fP) state.
+These are done automatically by \fBendwin\fP(3X) and,
+after an \fBendwin\fP, by \fBdoupdate\fP,
+so they normally are not called.
+.SS resetty, savetty
+.PP
+The \fBresetty\fP and \fBsavetty\fP routines save and restore the
+state of the terminal modes.
+\fBsavetty\fP saves the current state in
+a buffer and \fBresetty\fP restores the state to what it was at the
+last call to \fBsavetty\fP.
+.SS getsyx
+.PP
+The \fBgetsyx\fP routine returns the current coordinates
+of the \fIvirtual screen\fP cursor in \fIy\fP and \fIx\fP.
+If \fBleaveok\fP is currently \fBTRUE\fP, then
+\fB\-1\fP,\fB\-1\fP is returned.
+If lines have been removed from the top of the
+screen, using \fBripoffline\fP, \fIy\fP and \fIx\fP include these lines;
+therefore, \fIy\fP and \fIx\fP should be used only as arguments for
+\fBsetsyx\fP.
+.PP
+Few applications will use this feature,
+most use \fBgetyx\fP instead.
+.SS setsyx
+.PP
+The \fBsetsyx\fP routine sets
+the \fIvirtual screen\fP cursor to \fIy\fP, \fIx\fP.
+If \fIy\fP and \fIx\fP are both \fB\-1\fP, then
+\fBleaveok\fP is set.
+The two routines \fBgetsyx\fP and \fBsetsyx\fP
+are designed to be used by a library routine, which manipulates
+\fBcurses\fP windows but does not want to change the current position
+of the program's cursor.
+The library routine would call \fBgetsyx\fP
+at the beginning, do its manipulation of its own windows, do a
+\fBwnoutrefresh\fP on its windows, call \fBsetsyx\fP, and then call
+\fBdoupdate\fP.
+.PP
+Few applications will use this feature,
+most use \fBwmove\fP instead.
+.SS ripoffline
+.PP
+The \fBripoffline\fP routine provides access to the same facility that
+\fBslk_init\fP [see \fBcurs_slk\fP(3X)] uses to reduce the size of the
+screen.
+\fBripoffline\fP must be called before \fBinitscr\fP or
+\fBnewterm\fP is called, to prepare these initial actions:
+.bP
+If \fIline\fP is positive, a line is removed from the top of \fBstdscr\fP.
+.bP
+if \fIline\fP is negative, a line is removed from the bottom.
+.PP
+When the resulting initialization is done inside \fBinitscr\fP, the
+routine \fBinit\fP (supplied by the user) is called with two
+arguments:
+.bP
+a window pointer to the one-line window that has been
+allocated and
+.bP
+an integer with the number of columns in the window.
+.PP
+Inside this initialization routine, the integer variables \fBLINES\fP
+and \fBCOLS\fP (defined in \fB<curses.h>\fP) are not guaranteed to be
+accurate and \fBwrefresh\fP or \fBdoupdate\fP must not be called.
+It is allowable to call \fBwnoutrefresh\fP during the initialization routine.
+.PP
+\fBripoffline\fP can be called up to five times before calling \fBinitscr\fP or
+\fBnewterm\fP.
+.SS curs_set
+.PP
+The \fBcurs_set\fP routine sets the cursor state to invisible,
+normal, or very visible for \fBvisibility\fP equal to \fB0\fP,
+\fB1\fP, or \fB2\fP respectively.
+If the terminal supports the \fIvisibility\fP requested,
+the previous \fIcursor\fP state is returned;
+otherwise, \fBERR\fP is returned.
+.SS napms
+.PP
+The \fBnapms\fP routine is used to sleep for \fIms\fP milliseconds.
+.SH RETURN VALUE
+Except for \fBcurs_set\fP, these routines always return \fBOK\fP.
+.PP
+\fBcurs_set\fP
+returns the previous cursor state, or \fBERR\fP if the
+requested \fIvisibility\fP is not supported.
+.PP
+X/Open defines no error conditions.
+In this implementation
+.TP 5
+.na
+.hy 0
+\fBdef_prog_mode\fP, \fBdef_shell_mode\fP, \fBreset_prog_mode\fP, \fBreset_shell_mode\fP
+.hy
+.ad
+return an error
+if the terminal was not initialized, or
+if the I/O call to obtain the terminal settings fails.
+.TP 5
+\fBripoffline\fP
+returns an error if the maximum number of ripped-off lines
+exceeds the maximum (NRIPS = 5).
+.SH NOTES
+Note that \fBgetsyx\fP is a macro, so \fB&\fP is not necessary before
+the variables \fIy\fP and \fIx\fP.
+.PP
+Older SVr4 man pages warn that the return value
+of \fBcurs_set\fP \*(``is currently incorrect\*(''.
+This implementation gets it right, but it may be unwise to count
+on the correctness of the return value anywhere else.
+.PP
+Both ncurses and SVr4 will call \fBcurs_set\fP in \fBendwin\fP
+if \fBcurs_set\fP
+has been called to make the cursor other than normal, i.e., either
+invisible or very visible.
+There is no way for ncurses to determine the initial cursor state to
+restore that.
+.SH PORTABILITY
+The \fIvirtual screen\fP functions \fBsetsyx\fP and \fBgetsyx\fP
+are not described in the XSI Curses standard, Issue 4.
+All other functions are as described in XSI Curses.
+.PP
+The SVr4 documentation describes \fBsetsyx\fP and \fBgetsyx\fP
+as having return type int.
+This is misleading, as they are macros with no documented semantics
+for the return value.
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBcurs_initscr\fP(3X),
+\fBcurs_outopts\fP(3X),
+\fBcurs_refresh\fP(3X),
+\fBcurs_scr_dump\fP(3X),
+\fBcurs_slk\fP(3X),
+\fBcurs_variables\fP(3X).
diff --git a/man/curs_legacy.3x b/man/curs_legacy.3x
new file mode 100644
index 0000000..02e2c82
--- /dev/null
+++ b/man/curs_legacy.3x
@@ -0,0 +1,108 @@
+.\"***************************************************************************
+.\" Copyright 2019-2020,2022 Thomas E. Dickey                                *
+.\" Copyright 2007-2015,2017 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_legacy.3x,v 1.13 2022/02/12 20:05:11 tom Exp $
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.TH curs_legacy 3X ""
+.SH NAME
+curs_legacy \- get \fBcurses\fP cursor and window coordinates, attributes
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBint getattrs(const WINDOW *\fIwin\fB);\fR
+.sp
+\fBint getbegx(const WINDOW *\fIwin\fB);\fR
+.br
+\fBint getbegy(const WINDOW *\fIwin\fB);\fR
+.sp
+\fBint getcurx(const WINDOW *\fIwin\fB);\fR
+.br
+\fBint getcury(const WINDOW *\fIwin\fB);\fR
+.sp
+\fBint getmaxx(const WINDOW *\fIwin\fB);\fR
+.br
+\fBint getmaxy(const WINDOW *\fIwin\fB);\fR
+.sp
+\fBint getparx(const WINDOW *\fIwin\fB);\fR
+.br
+\fBint getpary(const WINDOW *\fIwin\fB);\fR
+.br
+.SH DESCRIPTION
+These legacy functions are simpler to use than the X/Open Curses functions:
+.bP
+The \fBgetattrs\fP function returns the same attribute data as \fBwattr_get\fP.
+.IP
+However, \fBgetattrs\fP returns an integer (actually a \fBchtype\fP),
+while \fBwattr_get\fP returns the current color pair in a separate parameter.
+In the wide-character library configuration,
+color pairs may not fit into a \fBchtype\fP,
+so \fBwattr_get\fP is the only way to obtain the color information.
+.IP
+Because \fBgetattrs\fP returns the attributes in a single parameter,
+it would not be possible for an application to distinguish that from
+\fBERR\fP (a \fI-1\fP).
+If the window parameter is null, \fBgetattrs\fP returns \fBA_NORMAL\fP (zero).
+.bP
+The \fBgetbegy\fP and \fBgetbegx\fP functions return the same
+data as \fBgetbegyx\fP.
+.bP
+The \fBgetcury\fP and \fBgetcurx\fP functions return the same
+data as \fBgetyx\fP.
+.bP
+The \fBgetmaxy\fP and \fBgetmaxx\fP functions return the same
+data as \fBgetmaxyx\fP.
+.bP
+The \fBgetpary\fP and \fBgetparx\fP functions return the same
+data as \fBgetparyx\fP.
+.SH RETURN VALUE
+Except as noted,
+these functions return an integer,
+or \fBERR\fP if the window parameter is null.
+.SH NOTES
+All of these interfaces are provided as macros and functions.
+The macros are suppressed (and only the functions provided)
+when \fBNCURSES_OPAQUE\fP is defined.
+The standard forms such as \fBgetyx\fP must be implemented as macros,
+and (in this implementation) are defined in terms of the functions
+described here,
+to avoid reliance on internal details of the WINDOW structure.
+.SH PORTABILITY
+These functions were supported on Version 7, BSD or System V implementations.
+None of those implementations checked the window parameter.
+.PP
+The \fBgetattrs\fP function and macro are defined to return a (signed) integer
+for compatibility with those implementations
+although an unsigned type would have been more appropriate.
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBcurs_getyx\fP(3X),
+\fBcurs_opaque\fP(3X)
diff --git a/man/curs_memleaks.3x b/man/curs_memleaks.3x
new file mode 100644
index 0000000..cea4165
--- /dev/null
+++ b/man/curs_memleaks.3x
@@ -0,0 +1,127 @@
+.\"***************************************************************************
+.\" Copyright 2019-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 2008-2010,2017 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_memleaks.3x,v 1.15 2022/06/04 23:33:48 tom Exp $
+.TH curs_memleaks 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.na
+.hy 0
+.SH NAME
+\fBexit_curses\fP,
+\fBexit_terminfo\fP \- \fBcurses\fP memory-leak checking
+.ad
+.hy
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.br
+\fBvoid exit_curses(int \fIcode\fB);\fR
+.sp
+\fB#include <term.h>\fP
+.br
+\fBvoid exit_terminfo(int \fIcode\fB);\fR
+.sp
+/* deprecated (intentionally not declared in curses.h or term.h) */
+.br
+\fBvoid _nc_freeall(void);\fP
+.br
+\fBvoid _nc_free_and_exit(int \fIcode\fB);\fR
+.br
+\fBvoid _nc_free_tinfo(int \fIcode\fB);\fR
+.SH DESCRIPTION
+These functions are used to simplify analysis of memory leaks in the ncurses
+library.
+.PP
+Any implementation of curses must not free the memory associated with
+a screen, since (even after calling \fBendwin\fP(3X)), it must be available
+for use in the next call to \fBrefresh\fP(3X).
+There are also chunks of memory held for performance reasons.
+That makes it hard to analyze curses applications for memory leaks.
+When using the specially configured debugging version of the ncurses library,
+applications can call functions which free those chunks of memory,
+simplifying the process of memory-leak checking.
+.PP
+Some of the functions are named with a \*(``_nc_\*('' prefix
+because they are not intended for use in the non-debugging library:
+.TP 5
+\fB_nc_freeall\fP
+This frees (almost) all of the memory allocated by ncurses.
+.TP 5
+\fB_nc_free_and_exit\fP
+This frees the memory allocated by ncurses (like \fB_nc_freeall\fP),
+and exits the program.
+It is preferred over \fB_nc_freeall\fP since some of that memory
+may be required to keep the application running.
+Simply exiting (with the given exit-code) is safer.
+.TP 5
+\fB_nc_free_tinfo\fP
+Use this function if only the low-level terminfo functions (and
+corresponding library) are used.
+Like \fB_nc_free_and_exit\fP, it exits the program after freeing memory.
+.PP
+The functions prefixed \*(``_nc\*('' are normally not available;
+they must be configured into the library
+at build time using the \fB\-\-disable-leaks\fP option.
+That compiles-in code that frees memory that normally would not be freed.
+.PP
+The \fBexit_curses\fP and \fBexit_terminfo\fP functions
+call \fB_nc_free_and_exit\fP and \fB_nc_free_tinfo\fP if
+the library is configured to support memory-leak checking.
+If the library is not configured to support memory-leak checking,
+they simply call \fBexit\fP.
+.SH RETURN VALUE
+These functions do not return a value.
+.SH PORTABILITY
+These functions are not part of X/Open Curses;
+nor do other implementations of curses provide a similar feature.
+.PP
+In any implementation of X/Open Curses, an application can free part
+of the memory allocated by curses:
+.bP
+The portable part of \fBexit_curses\fP can be freed using \fBdelscreen\fP,
+passing the \fBSCREEN*\fP pointer returned by \fBnewterm\fP.
+.IP
+In some implementations, there is a global variable \fBsp\fP
+which could be used, e.g., if the screen were only initialized
+using \fBinitscr\fP.
+.bP
+The portable part of \fBexit_terminfo\fP can be freed using \fBdel_curterm\fP.
+.IP
+In this case, there is a global variable \fBcur_term\fP which can be
+used as parameter.
+.SH SEE ALSO
+\fBcurs_initscr\fP(3X),
+\fBcurs_terminfo\fP(3X).
+\fBcurses\fP(3X).
diff --git a/man/curs_mouse.3x b/man/curs_mouse.3x
new file mode 100644
index 0000000..25d6920
--- /dev/null
+++ b/man/curs_mouse.3x
@@ -0,0 +1,425 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2022,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2015,2017 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_mouse.3x,v 1.59 2022/02/12 20:05:11 tom Exp $
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de NS
+.ie n  .sp
+.el    .sp .5
+.ie n  .in +4
+.el    .in +2
+.nf
+.ft C			\" Courier
+..
+.de NE
+.fi
+.ft R
+.ie n  .in -4
+.el    .in -2
+..
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.TH curs_mouse 3X ""
+.na
+.hy 0
+.SH NAME
+\fBhas_mouse\fP,
+\fBgetmouse\fP, \fBungetmouse\fP,
+\fBmousemask\fP, \fBwenclose\fP,
+\fBmouse_trafo\fP, \fBwmouse_trafo\fP,
+\fBmouseinterval\fP \- mouse interface through curses
+.ad
+.hy
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.PP
+\fBtypedef unsigned long mmask_t;\fP
+.PP
+.nf
+\fBtypedef struct {\fP
+\fB    short id;         \fI/* ID to distinguish multiple devices */\fR
+\fB    int x, y, z;      \fI/* event coordinates */\fR
+\fB    mmask_t bstate;   \fI/* button state bits */\fR
+\fB} MEVENT;\fP
+.fi
+.PP
+\fBbool has_mouse(void);\fP
+.sp
+\fBint getmouse(MEVENT *\fIevent\fB);\fR
+.br
+\fBint ungetmouse(MEVENT *\fIevent\fB);\fR
+.sp
+\fBmmask_t mousemask(mmask_t \fInewmask\fB, mmask_t *\fIoldmask\fB);\fR
+.sp
+\fBbool wenclose(const WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB);\fR
+.sp
+\fBbool mouse_trafo(int* \fIpY\fB, int* \fIpX\fB, bool \fIto_screen\fB);\fR
+.br
+\fBbool wmouse_trafo(const WINDOW* \fIwin\fB,\fR
+                  \fBint* \fIpY\fB, int* \fIpX\fB, bool \fIto_screen\fB);\fR
+.sp
+\fBint mouseinterval(int \fIerval\fB);\fR
+.br
+.SH DESCRIPTION
+These functions provide an interface to mouse events from
+\fBncurses\fP(3X).
+Mouse events are represented by \fBKEY_MOUSE\fP
+pseudo-key values in the \fBwgetch\fP(3X) input stream.
+.SS mousemask
+.PP
+To make mouse events visible, use the \fBmousemask\fP function.
+This sets the mouse events to be reported.
+By default, no mouse events are reported.
+.bP
+The function returns an updated copy of \fInewmask\fP
+to indicate which of the specified mouse events can be reported.
+.IP
+If the screen has not been initialized,
+or if the terminal does not support mouse-events,
+this function returns 0.
+.bP
+If \fIoldmask\fP is non-NULL,
+this function fills the indicated location with the previous value of the
+current screen's mouse event mask.
+.PP
+As a side effect, setting a zero mousemask may turn off the mouse pointer;
+setting a nonzero mask may turn it on.
+Whether this happens is device-dependent.
+.SS Mouse events
+.PP
+Here are the mouse event type masks which may be defined:
+.PP
+.TS
+l l
+_ _
+l l.
+\fBName\fP	\fBDescription\fP
+BUTTON1_PRESSED	mouse button 1 down
+BUTTON1_RELEASED	mouse button 1 up
+BUTTON1_CLICKED	mouse button 1 clicked
+BUTTON1_DOUBLE_CLICKED	mouse button 1 double clicked
+BUTTON1_TRIPLE_CLICKED	mouse button 1 triple clicked
+_
+BUTTON2_PRESSED	mouse button 2 down
+BUTTON2_RELEASED	mouse button 2 up
+BUTTON2_CLICKED	mouse button 2 clicked
+BUTTON2_DOUBLE_CLICKED	mouse button 2 double clicked
+BUTTON2_TRIPLE_CLICKED	mouse button 2 triple clicked
+_
+BUTTON3_PRESSED	mouse button 3 down
+BUTTON3_RELEASED	mouse button 3 up
+BUTTON3_CLICKED	mouse button 3 clicked
+BUTTON3_DOUBLE_CLICKED	mouse button 3 double clicked
+BUTTON3_TRIPLE_CLICKED	mouse button 3 triple clicked
+_
+BUTTON4_PRESSED	mouse button 4 down
+BUTTON4_RELEASED	mouse button 4 up
+BUTTON4_CLICKED	mouse button 4 clicked
+BUTTON4_DOUBLE_CLICKED	mouse button 4 double clicked
+BUTTON4_TRIPLE_CLICKED	mouse button 4 triple clicked
+_
+BUTTON5_PRESSED	mouse button 5 down
+BUTTON5_RELEASED	mouse button 5 up
+BUTTON5_CLICKED	mouse button 5 clicked
+BUTTON5_DOUBLE_CLICKED	mouse button 5 double clicked
+BUTTON5_TRIPLE_CLICKED	mouse button 5 triple clicked
+_
+BUTTON_SHIFT	shift was down during button state change
+BUTTON_CTRL	control was down during button state change
+BUTTON_ALT	alt was down during button state change
+ALL_MOUSE_EVENTS	report all button state changes
+REPORT_MOUSE_POSITION	report mouse movement
+_
+.TE
+.SS getmouse
+.PP
+Once a class of mouse events has been made visible in a window,
+calling the \fBwgetch\fP function on that window may return
+\fBKEY_MOUSE\fP as an indicator that a mouse event has been queued.
+To read the event data and pop the event off the queue, call
+\fBgetmouse\fP.
+This function will return \fBOK\fP if a mouse event
+is actually visible in the given window, \fBERR\fP otherwise.
+When \fBgetmouse\fP returns \fBOK\fP, the data deposited as y and
+x in the event structure coordinates will be screen-relative character-cell
+coordinates.
+The returned state mask will have exactly one bit set to
+indicate the event type.
+The corresponding data in the queue is marked invalid.
+A subsequent call to \fBgetmouse\fP will retrieve the next older
+item from the queue.
+.SS ungetmouse
+.PP
+The \fBungetmouse\fP function behaves analogously to \fBungetch\fP.
+It pushes
+a \fBKEY_MOUSE\fP event onto the input queue, and associates with that event
+the given state data and screen-relative character-cell coordinates.
+.SS wenclose
+.PP
+The \fBwenclose\fP function tests whether a given pair of screen-relative
+character-cell coordinates is enclosed by a given window, returning \fBTRUE\fP
+if it is and \fBFALSE\fP otherwise.
+It is useful for determining what subset of
+the screen windows enclose the location of a mouse event.
+.SS wmouse_trafo
+.PP
+The \fBwmouse_trafo\fP function transforms a given pair of coordinates
+from stdscr-relative coordinates
+to coordinates relative to the given window or vice versa.
+The resulting stdscr-relative coordinates are not always identical
+to window-relative coordinates due to the mechanism to reserve lines on top
+or bottom of the screen for other purposes
+(see the \fBripoffline\fP and \fBslk_init\fP(3X) calls, for example).
+.bP
+If the parameter \fIto_screen\fP is \fBTRUE\fP, the pointers
+\fIpY, pX\fP must reference the coordinates of a location
+inside the window \fIwin\fP.
+They are converted to window-relative coordinates and returned
+through the pointers.
+If the conversion was successful, the function returns \fBTRUE\fP.
+.bP
+If one of the parameters was NULL or the location is
+not inside the window, \fBFALSE\fP is returned.
+.bP
+If \fIto_screen\fP is
+\fBFALSE\fP, the pointers \fIpY, pX\fP must reference window-relative
+coordinates.
+They are converted to stdscr-relative coordinates if the
+window \fIwin\fP encloses this point.
+In this case the function returns \fBTRUE\fP.
+.bP
+If one of the parameters is NULL or the point is not inside the
+window, \fBFALSE\fP is returned.
+The referenced coordinates
+are only replaced by the converted coordinates if the transformation was
+successful.
+.SS mouse_trafo
+.PP
+The \fBmouse_trafo\fP function performs the same translation
+as \fBwmouse_trafo\fP,
+using stdscr for \fIwin\fP.
+.SS mouseinterval
+.PP
+The \fBmouseinterval\fP function sets the maximum time (in thousands of a
+second) that can elapse between press and release events for them to
+be recognized as a click.
+Use \fBmouseinterval(0)\fP to disable click resolution.
+This function returns the previous interval value.
+Use \fBmouseinterval(\-1)\fP to obtain the interval without altering it.
+The default is one sixth of a second.
+.SS has_mouse
+.PP
+The \fBhas_mouse\fP function returns \fBTRUE\fP if the mouse driver has been
+successfully initialized.
+.PP
+Note that mouse events will be ignored when input is in cooked mode, and will
+cause an error beep when cooked mode is being simulated in a window by a
+function such as \fBgetstr\fP that expects a linefeed for input-loop
+termination.
+.SH RETURN VALUE
+\fBgetmouse\fP and \fBungetmouse\fP
+return the integer \fBERR\fP upon failure or \fBOK\fP
+upon successful completion:
+.RS 3
+.TP 5
+\fBgetmouse\fP
+returns an error.
+.bP
+If no mouse driver was initialized, or
+if the mask parameter is zero,
+.bP
+It returns an error if a mouse event was detected which did not match the
+current \fImousemask\fP.
+.bP
+It also returns an error if no more events remain in the queue.
+.TP 5
+\fBungetmouse\fP
+returns an error if the FIFO is full.
+.RE
+.PP
+\fBmousemask\fP
+returns the mask of reportable events.
+.PP
+\fBmouseinterval\fP
+returns the previous interval value, unless
+the terminal was not initialized.
+In that case, it returns the maximum interval value (166).
+.PP
+\fBwenclose\fP and \fBwmouse_trafo\fP
+are boolean functions returning \fBTRUE\fP or \fBFALSE\fP depending
+on their test result.
+.SH PORTABILITY
+These calls were designed for \fBncurses\fP(3X), and are not found in SVr4
+curses, 4.4BSD curses, or any other previous version of curses.
+.PP
+SVr4 curses had support for the mouse in a variant of \fBxterm\fP(1).
+It is mentioned in a few places, but with no supporting documentation:
+.bP
+the \*(``libcurses\*('' manual page lists functions for this feature
+which are prototyped in \fBcurses.h\fP:
+.NS
+extern int mouse_set(long int);
+extern int mouse_on(long int);
+extern int mouse_off(long int);
+extern int request_mouse_pos(void);
+extern int map_button(unsigned long);
+extern void wmouse_position(WINDOW *, int *, int *);
+extern unsigned long getmouse(void), getbmap(void);
+.NE
+.bP
+the \*(``terminfo\*('' manual page lists capabilities for the feature
+.NS
+buttons           btns    BT       Number of buttons on the mouse
+get_mouse         getm    Gm       Curses should get button events
+key_mouse         kmous   Km       0631, Mouse event has occurred
+mouse_info        minfo   Mi       Mouse status information
+req_mouse_pos     reqmp   RQ       Request mouse position report
+.NE
+.bP
+the interface made assumptions (as does ncurses) about the escape sequences
+sent to and received from the terminal.
+.IP
+For instance
+the SVr4 curses library used the \fBget_mouse\fP capability to tell the
+terminal which mouse button events it should send,
+passing the mouse-button bit-mask to the terminal.
+Also, it could ask the terminal
+where the mouse was using the \fBreq_mouse_pos\fP capability.
+.IP
+Those features required a terminal which had been modified to work with curses.
+They were not part of the X Consortium's xterm.
+.PP
+When developing the xterm mouse support for ncurses in September 1995,
+Eric Raymond was uninterested in using the same interface due to its
+lack of documentation.
+Later, in 1998, Mark Hesseling provided support in
+PDCurses 2.3 using the SVr4 interface.
+PDCurses, however, does not use video terminals,
+making it unnecessary to be concerned about compatibility with the
+escape sequences.
+.PP
+The feature macro \fBNCURSES_MOUSE_VERSION\fP is provided so the preprocessor
+can be used to test whether these features are present.
+If the interface is changed, the value of \fBNCURSES_MOUSE_VERSION\fP will be
+incremented.
+These values for \fBNCURSES_MOUSE_VERSION\fP may be
+specified when configuring ncurses:
+.RS 3
+.TP 3
+1
+has definitions for reserved events.
+The mask uses 28 bits.
+.TP 3
+2
+adds definitions for button 5,
+removes the definitions for reserved events.
+The mask uses 29 bits.
+.RE
+.PP
+The order of the \fBMEVENT\fP structure members is not guaranteed.
+Additional fields may be added to the structure in the future.
+.PP
+Under \fBncurses\fP(3X), these calls are implemented using either
+xterm's built-in mouse-tracking API or
+platform-specific drivers including
+.RS 3
+.bP
+Alessandro Rubini's gpm server
+.bP
+FreeBSD sysmouse
+.bP
+OS/2 EMX
+.RE
+.PP
+If you are using an unsupported configuration,
+mouse events will not be visible to
+\fBncurses\fP(3X) (and the \fBmousemask\fP function will always
+return \fB0\fP).
+.PP
+If the terminfo entry contains a \fBXM\fP string,
+this is used in the xterm mouse driver to control the
+way the terminal is initialized for mouse operation.
+The default, if \fBXM\fP is not found,
+corresponds to private mode 1000 of xterm:
+.PP
+.RS 3
+\\E[?1000%?%p1%{1}%=%th%el%;
+.RE
+.PP
+The mouse driver also recognizes a newer xterm private mode 1006, e.g.,
+.PP
+.RS 3
+\\E[?1006;1000%?%p1%{1}%=%th%el%;
+.RE
+.PP
+The \fIz\fP member in the event structure is not presently used.
+It is intended
+for use with touch screens (which may be pressure-sensitive) or with
+3D-mice/trackballs/power gloves.
+.PP
+The \fBALL_MOUSE_EVENTS\fP class does not include \fBREPORT_MOUSE_POSITION\fP.
+They are distinct.
+For example, in xterm,
+wheel/scrolling mice send position reports as a sequence of
+presses of buttons 4 or 5 without matching button-releases.
+.SH BUGS
+Mouse events under xterm will not in fact be ignored during cooked mode,
+if they have been enabled by \fBmousemask\fP.
+Instead, the xterm mouse
+report sequence will appear in the string read.
+.PP
+Mouse events under xterm will not be detected correctly in a window with
+its keypad bit off, since they are interpreted as a variety of function key.
+Your terminfo description should have \fBkmous\fP set to \*(``\\E[M\*(''
+(the beginning of the response from xterm for mouse clicks).
+Other values for \fBkmous\fP are permitted,
+but under the same assumption,
+i.e., it is the beginning of the response.
+.PP
+Because there are no standard terminal responses that would serve to identify
+terminals which support the xterm mouse protocol, \fBncurses\fP assumes that
+if \fBkmous\fP is defined in the terminal description,
+or if the terminal description's primary name or aliases
+contain the string \*(``xterm\*('',
+then the terminal may send mouse events.
+The \fBkmous\fP capability is checked first,
+allowing the use of newer xterm mouse protocols
+such as xterm's private mode 1006.
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBcurs_inopts\fP(3X),
+\fBcurs_kernel\fP(3X),
+\fBcurs_slk\fP(3X),
+\fBcurs_variables\fP(3X).
diff --git a/man/curs_move.3x b/man/curs_move.3x
new file mode 100644
index 0000000..0591762
--- /dev/null
+++ b/man/curs_move.3x
@@ -0,0 +1,66 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2017 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_move.3x,v 1.22 2022/02/12 20:05:11 tom Exp $
+.TH curs_move 3X ""
+.na
+.hy 0
+.SH NAME
+\fBmove\fP,
+\fBwmove\fP \- move \fBcurses\fP window cursor
+.ad
+.hy
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBint move(int \fIy\fB, int \fIx\fB);\fR
+.br
+\fBint wmove(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB);\fR
+.br
+.SH DESCRIPTION
+These routines move the cursor associated with the window to line \fIy\fP and
+column \fIx\fP.
+This routine does not move the physical cursor of the terminal
+until \fBrefresh\fP(3X) is called.
+The position specified is relative to the upper
+left-hand corner of the window, which is (0,0).
+.SH RETURN VALUE
+These routines return \fBERR\fP upon failure and \fBOK\fP (SVr4
+specifies only "an integer value other than \fBERR\fP") upon successful
+completion.
+.PP
+Specifically, they return an error
+if the window pointer is null, or
+if the position is outside the window.
+.SH NOTES
+Note that \fBmove\fP may be a macro.
+.SH PORTABILITY
+These functions are described in the XSI Curses standard, Issue 4.
+.SH SEE ALSO
+\fBcurses\fP(3X), \fBcurs_refresh\fP(3X)
diff --git a/man/curs_opaque.3x b/man/curs_opaque.3x
new file mode 100644
index 0000000..948d32d
--- /dev/null
+++ b/man/curs_opaque.3x
@@ -0,0 +1,155 @@
+.\"***************************************************************************
+.\" Copyright 2020-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 2007-2014,2015 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_opaque.3x,v 1.18 2022/02/12 20:05:11 tom Exp $
+.TH curs_opaque 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.na
+.hy 0
+.SH NAME
+\fBis_cleared\fP,
+\fBis_idlok\fP,
+\fBis_idcok\fP,
+\fBis_immedok\fP,
+\fBis_keypad\fP,
+\fBis_leaveok\fP,
+\fBis_nodelay\fP,
+\fBis_notimeout\fP,
+\fBis_pad\fP,
+\fBis_scrollok\fP,
+\fBis_subwin\fP,
+\fBis_syncok\fP,
+\fBwgetdelay\fP,
+\fBwgetparent\fP,
+\fBwgetscrreg\fP \- \fBcurses\fP window properties
+.ad
+.hy
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBbool is_cleared(const WINDOW *\fIwin\fB);\fR
+.br
+\fBbool is_idcok(const WINDOW *\fIwin\fB);\fR
+.br
+\fBbool is_idlok(const WINDOW *\fIwin\fB);\fR
+.br
+\fBbool is_immedok(const WINDOW *\fIwin\fB);\fR
+.br
+\fBbool is_keypad(const WINDOW *\fIwin\fB);\fR
+.br
+\fBbool is_leaveok(const WINDOW *\fIwin\fB);\fR
+.br
+\fBbool is_nodelay(const WINDOW *\fIwin\fB);\fR
+.br
+\fBbool is_notimeout(const WINDOW *\fIwin\fB);\fR
+.br
+\fBbool is_pad(const WINDOW *\fIwin\fB);\fR
+.br
+\fBbool is_scrollok(const WINDOW *\fIwin\fB);\fR
+.br
+\fBbool is_subwin(const WINDOW *\fIwin\fB);\fR
+.br
+\fBbool is_syncok(const WINDOW *\fIwin\fB);\fR
+.br
+\fBWINDOW * wgetparent(const WINDOW *\fIwin\fB);\fR
+.br
+\fBint wgetdelay(const WINDOW *\fIwin\fB);\fR
+.br
+\fBint wgetscrreg(const WINDOW *\fIwin\fB, int *\fItop\fB, int *\fIbottom\fB);\fR
+.br
+.SH DESCRIPTION
+This implementation provides functions which return properties
+set in the WINDOW structure, allowing it to be \*(``opaque\*('' if
+the symbol \fBNCURSES_OPAQUE\fP is defined:
+.TP 5
+\fBis_cleared\fP
+returns the value set in \fBclearok\fP
+.TP 5
+\fBis_idcok\fP
+returns the value set in \fBidcok\fP
+.TP 5
+\fBis_idlok\fP
+returns the value set in \fBidlok\fP
+.TP 5
+\fBis_immedok\fP
+returns the value set in \fBimmedok\fP
+.TP 5
+\fBis_keypad\fP
+returns the value set in \fBkeypad\fP
+.TP 5
+\fBis_leaveok\fP
+returns the value set in \fBleaveok\fP
+.TP 5
+\fBis_nodelay\fP
+returns the value set in \fBnodelay\fP
+.TP 5
+\fBis_notimeout\fP
+returns the value set in \fBnotimeout\fP
+.TP 5
+\fBis_pad\fP
+returns \fBTRUE\fP if the window is a pad
+i.e., created by \fBnewpad\fP
+.TP 5
+\fBis_scrollok\fP
+returns the value set in \fBscrollok\fP
+.TP 5
+\fBis_subwin\fP
+returns \fBTRUE\fP if the window is a subwindow,
+i.e., created by \fBsubwin\fP or \fBderwin\fP
+.TP 5
+\fBis_syncok\fP
+returns the value set in \fBsyncok\fP
+.TP 5
+\fBwgetdelay\fP
+returns the delay timeout as set in \fBwtimeout\fP.
+.TP 5
+\fBwgetparent\fP
+returns the parent WINDOW pointer for subwindows,
+or NULL for windows having no parent.
+.TP 5
+\fBwgetscrreg\fP
+returns the top and bottom rows for the scrolling margin
+as set in \fBwsetscrreg\fP.
+.SH RETURN VALUE
+These functions all return \fBTRUE\fP or \fBFALSE\fP, except as noted.
+.SH NOTES
+Both a macro and a function are provided for each name.
+.SH PORTABILITY
+These routines are specific to ncurses.
+They were not supported on Version 7, BSD or System V implementations.
+It is recommended that any code depending on ncurses extensions
+be conditioned using NCURSES_VERSION.
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBcurs_inopts\fP(3X),
+\fBcurs_outopts\fP(3X),
+\fBcurs_window\fP(3X)
diff --git a/man/curs_outopts.3x b/man/curs_outopts.3x
new file mode 100644
index 0000000..4f90611
--- /dev/null
+++ b/man/curs_outopts.3x
@@ -0,0 +1,223 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2016,2017 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_outopts.3x,v 1.36 2022/02/12 20:05:11 tom Exp $
+.TH curs_outopts 3X ""
+.na
+.hy 0
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.SH NAME
+\fBclearok\fP,
+\fBidlok\fP,
+\fBidcok\fP,
+\fBimmedok\fP,
+\fBleaveok\fP,
+\fBsetscrreg\fP,
+\fBwsetscrreg\fP,
+\fBscrollok\fP \- \fBcurses\fP output options
+.ad
+.hy
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBint clearok(WINDOW *\fIwin\fB, bool \fIbf\fB);\fR
+.br
+\fBint idlok(WINDOW *\fIwin\fB, bool \fIbf\fB);\fR
+.br
+\fBvoid idcok(WINDOW *\fIwin\fB, bool \fIbf\fB);\fR
+.br
+\fBvoid immedok(WINDOW *\fIwin\fB, bool \fIbf\fB);\fR
+.br
+\fBint leaveok(WINDOW *\fIwin\fB, bool \fIbf\fB);\fR
+.br
+\fBint scrollok(WINDOW *\fIwin\fB, bool \fIbf\fB);\fR
+.sp
+\fBint setscrreg(int \fItop\fB, int \fIbot\fB);\fR
+.br
+\fBint wsetscrreg(WINDOW *\fIwin\fB, int \fItop\fB, int \fIbot\fB);\fR
+.br
+.SH DESCRIPTION
+.PP
+These routines set options that change the style of output within
+\fBcurses\fP.
+All options are initially \fBFALSE\fP, unless otherwise stated.
+It is not necessary to turn these options off before calling \fBendwin\fP(3X).
+.SS clearok
+.PP
+If \fBclearok\fP is called with \fBTRUE\fP as argument, the next
+call to \fBwrefresh\fP with this window will clear the screen completely and
+redraw the entire screen from scratch.
+This is useful when the contents of the
+screen are uncertain, or in some cases for a more pleasing visual effect.
+If
+the \fIwin\fP argument to \fBclearok\fP is the global variable \fBcurscr\fP,
+the next call to \fBwrefresh\fP with any window causes the screen to be cleared
+and repainted from scratch.
+.SS idlok
+.PP
+If \fBidlok\fP is called with \fBTRUE\fP as second argument, \fBcurses\fP
+considers using the hardware insert/delete line feature of terminals so
+equipped.
+Calling \fBidlok\fP with \fBFALSE\fP as second argument disables use
+of line insertion and deletion.
+This option should be enabled only if the
+application needs insert/delete line, for example, for a screen editor.
+It is
+disabled by default because insert/delete line tends to be visually annoying
+when used in applications where it is not really needed.
+If insert/delete line
+cannot be used, \fBcurses\fP redraws the changed portions of all lines.
+.SS idcok
+.PP
+If \fBidcok\fP is called with \fBFALSE\fP as second argument, \fBcurses\fP
+no longer considers using the hardware insert/delete character feature of
+terminals so equipped.
+Use of character insert/delete is enabled by default.
+Calling \fBidcok\fP with \fBTRUE\fP as second argument re-enables use
+of character insertion and deletion.
+.SS immedok
+.PP
+If \fBimmedok\fP is called with \fBTRUE as argument\fP, any change
+in the window image, such as the ones caused by \fBwaddch, wclrtobot, wscrl\fP,
+etc., automatically cause a call to \fBwrefresh\fP.
+However, it may
+degrade performance considerably, due to repeated calls to \fBwrefresh\fP.
+It is disabled by default.
+.SS leaveok
+.PP
+Normally, the hardware cursor is left at the location of the window cursor
+being refreshed.
+The \fBleaveok\fP option allows the cursor to be left
+wherever the update happens to leave it.
+It is useful for applications where
+the cursor is not used, since it reduces the need for cursor motions.
+.SS scrollok
+.PP
+The \fBscrollok\fP option controls what happens when the cursor of a window is
+moved off the edge of the window or scrolling region, either as a result of a
+newline action on the bottom line, or typing the last character of the last
+line.
+If disabled, (\fIbf\fP is \fBFALSE\fP), the cursor is left on the bottom
+line.
+If enabled, (\fIbf\fP is \fBTRUE\fP), the window is scrolled up one line
+(Note that to get the physical scrolling effect on the terminal, it is
+also necessary to call \fBidlok\fP).
+.SS  setscrreg/wsetscrreg
+.PP
+The \fBsetscrreg\fP and \fBwsetscrreg\fP routines allow the application
+programmer to set a software scrolling region in a window.
+The \fItop\fP and
+\fIbot\fP parameters
+are the line numbers of the top and bottom margin of the scrolling
+region.
+(Line 0 is the top line of the window.)  If this option and
+\fBscrollok\fP are enabled, an attempt to move off the bottom margin line
+causes all lines in the scrolling region to scroll one line in the direction
+of the first line.
+Only the text of the window is scrolled.
+(Note that this
+has nothing to do with the use of a physical scrolling region capability in the
+terminal, like that in the VT100.
+If \fBidlok\fP is enabled and the terminal
+has either a scrolling region or insert/delete line capability, they will
+probably be used by the output routines.)
+.SH RETURN VALUE
+The functions \fBsetscrreg\fP and \fBwsetscrreg\fP return \fBOK\fP upon success
+and \fBERR\fP upon failure.
+All other routines that return an integer always
+return \fBOK\fP.
+.PP
+X/Open Curses does not define any error conditions.
+.PP
+In this implementation,
+.bP
+those functions that have a window pointer
+will return an error if the window pointer is null
+.bP
+\fBwsetscrreg\fP
+returns an error if the scrolling region limits extend outside the window.
+.RE
+.PP
+X/Open does not define any error conditions.
+This implementation returns an error
+if the window pointer is null.
+.SH PORTABILITY
+These functions are described in the XSI Curses standard, Issue 4.
+.PP
+From the outset, ncurses used \fBnl\fP/\fBnonl\fP to control the conversion
+of newlines to carriage return/line-feed on output as well as input.
+XSI Curses documents only the use of these functions for input.
+This difference arose from converting the \fIpcurses\fP source
+(which used \fBioctl\fP calls with the \fBsgttyb\fP structure)
+to termios (i.e., the POSIX terminal interface).
+In the former, both input and output were controlled via a single
+option \fBCRMOD\fP,
+while the latter separates these features.
+Because that conversion interferes with output optimization,
+\fBnl\fP/\fBnonl\fP were amended after ncurses 6.2
+to eliminate their effect on output.
+.PP
+Some historic curses implementations had, as an undocumented feature, the
+ability to do the equivalent of \fBclearok(..., 1)\fP by saying
+\fBtouchwin(stdscr)\fP or \fBclear(stdscr)\fP.
+This will not work under ncurses.
+.PP
+Earlier System V curses implementations specified that with \fBscrollok\fP
+enabled, any window modification triggering a scroll also forced a physical
+refresh.
+XSI Curses does not require this, and \fBncurses\fP avoids doing
+it to perform better vertical-motion optimization at \fBwrefresh\fP
+time.
+.PP
+The XSI Curses standard does not mention that the cursor should be
+made invisible as a side-effect of \fBleaveok\fP.
+SVr4 curses documentation does this, but the code does not.
+Use \fBcurs_set\fP to make the cursor invisible.
+.SH NOTES
+Note that
+\fBclearok\fP,
+\fBleaveok\fP,
+\fBscrollok\fP,
+\fBidcok\fP, and
+\fBsetscrreg\fP may be macros.
+.PP
+The \fBimmedok\fP routine is useful for windows that are used as terminal
+emulators.
+.SH SEE ALSO
+.na
+\fBcurses\fP(3X),
+\fBcurs_addch\fP(3X),
+\fBcurs_clear\fP(3X),
+\fBcurs_initscr\fP(3X),
+\fBcurs_scroll\fP(3X),
+\fBcurs_refresh\fP(3X),
+\fBcurs_variables\fP(3X).
diff --git a/man/curs_overlay.3x b/man/curs_overlay.3x
new file mode 100644
index 0000000..9c6561e
--- /dev/null
+++ b/man/curs_overlay.3x
@@ -0,0 +1,88 @@
+.\"***************************************************************************
+.\" Copyright 2020-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2013,2015 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_overlay.3x,v 1.22 2022/02/12 20:05:11 tom Exp $
+.TH curs_overlay 3X ""
+.na
+.hy 0
+.SH NAME
+\fBoverlay\fP,
+\fBoverwrite\fP,
+\fBcopywin\fP \- overlay and manipulate overlapped \fBcurses\fP windows
+.ad
+.hy
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBint overlay(const WINDOW *\fIsrcwin\fB, WINDOW *\fIdstwin\fB);\fR
+.br
+\fBint overwrite(const WINDOW *\fIsrcwin\fB, WINDOW *\fIdstwin\fB);\fR
+.br
+\fBint copywin(const WINDOW *\fIsrcwin\fB, WINDOW *\fIdstwin\fB, int \fIsminrow\fB,\fR
+      \fBint \fIsmincol\fB, int \fIdminrow\fB, int \fIdmincol\fB, int \fIdmaxrow\fB,\fR
+      \fBint \fIdmaxcol\fB, int \fIoverlay\fB);\fR
+.SH DESCRIPTION
+.SS overlay, overwrite
+The \fBoverlay\fP and \fBoverwrite\fP routines overlay \fIsrcwin\fP on
+top of \fIdstwin\fP.
+\fIscrwin\fP and \fIdstwin\fP are not required
+to be the same size; only text where the two windows overlap is copied.
+The difference is that \fBoverlay\fP is non-destructive
+(blanks are not copied) whereas \fBoverwrite\fP is destructive.
+.SS copywin
+.PP
+The \fBcopywin\fP routine provides a finer granularity of control over the
+\fBoverlay\fP and \fBoverwrite\fP routines.
+As in the \fBprefresh\fP routine,
+a rectangle is specified in the destination window, (\fIdminrow\fP,
+\fIdmincol\fP) and (\fIdmaxrow\fP, \fIdmaxcol\fP), and the upper-left-corner
+coordinates of the source window, (\fIsminrow\fP, \fIsmincol\fP).
+If the argument \fIoverlay\fP is \fBtrue\fP,
+then copying is non-destructive,
+as in \fBoverlay\fP.
+.SH RETURN VALUE
+Routines that return an integer return \fBERR\fP upon failure, and \fBOK\fP
+(SVr4 only specifies "an integer value other than \fBERR\fP") upon successful
+completion.
+.PP
+X/Open defines no error conditions.
+In this implementation,
+\fBcopywin\fP,
+\fBoverlay\fP and \fBoverwrite\fP return an error
+if either of the window pointers are null, or
+if some part of the window would be placed off-screen.
+.SH NOTES
+Note that \fBoverlay\fP and \fBoverwrite\fP may be macros.
+.SH PORTABILITY
+The XSI Curses standard, Issue 4 describes these functions (adding the const
+qualifiers).
+It further specifies their behavior in the presence of characters
+with multibyte renditions (not yet supported in this implementation).
+.SH SEE ALSO
+\fBcurses\fP(3X), \fBcurs_pad\fP(3X), \fBcurs_refresh\fP(3X)
diff --git a/man/curs_pad.3x b/man/curs_pad.3x
new file mode 100644
index 0000000..da25f3b
--- /dev/null
+++ b/man/curs_pad.3x
@@ -0,0 +1,242 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2015,2017 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_pad.3x,v 1.29 2022/02/12 20:05:11 tom Exp $
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.TH curs_pad 3X ""
+.na
+.hy 0
+.SH NAME
+\fBnewpad\fP,
+\fBsubpad\fP,
+\fBprefresh\fP,
+\fBpnoutrefresh\fP,
+\fBpechochar\fP,
+\fBpecho_wchar\fP \- create and display \fBcurses\fP pads
+.ad
+.hy
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBWINDOW *newpad(int \fInlines\fB, int \fIncols\fB);\fR
+.br
+\fBWINDOW *subpad(WINDOW *\fIorig\fB, int \fInlines\fB, int \fIncols\fB,\fR
+      \fBint \fIbegin_y\fB, int \fIbegin_x\fB);\fR
+.br
+\fBint prefresh(WINDOW *\fIpad\fB, int \fIpminrow\fB, int \fIpmincol\fB,\fR
+      \fBint \fIsminrow\fB, int \fIsmincol\fB, int \fIsmaxrow\fB, int \fIsmaxcol\fB);\fR
+.br
+\fBint pnoutrefresh(WINDOW *\fIpad\fB, int \fIpminrow\fB, int \fIpmincol\fB,\fR
+      \fBint \fIsminrow\fB, int \fIsmincol\fB, int \fIsmaxrow\fB, int \fIsmaxcol\fB);\fR
+.br
+\fBint pechochar(WINDOW *\fIpad\fB, chtype \fIch\fB);\fR
+.br
+\fBint pecho_wchar(WINDOW *\fIpad\fB, const cchar_t *\fIwch\fB);\fR
+.SH DESCRIPTION
+.SS newpad
+The \fBnewpad\fP routine creates and returns a pointer to a new pad data
+structure with the given number of lines, \fInlines\fP, and columns,
+\fIncols\fP.
+A pad is like a window, except that it is not restricted by the
+screen size, and is not necessarily associated with a particular part of the
+screen.
+Pads can be used when a large window is needed, and only a part of the
+window will be on the screen at one time.
+Automatic refreshes of pads
+(e.g., from scrolling or echoing of input) do not occur.
+.PP
+It is not
+legal to call \fBwrefresh\fP with a \fIpad\fP as an argument; the routines
+\fBprefresh\fP or \fBpnoutrefresh\fP should be called instead.
+Note that these
+routines require additional parameters to specify the part of the pad to be
+displayed and the location on the screen to be used for the display.
+.SS subpad
+.PP
+The \fBsubpad\fP routine creates and returns a pointer to a subwindow within a
+pad with the given number of lines, \fInlines\fP, and columns, \fIncols\fP.
+Unlike \fBsubwin\fP, which uses screen coordinates, the window is at position
+(\fIbegin\fR_\fIx\fB,\fR \fIbegin\fR_\fIy\fR) on the pad.
+The window is
+made in the middle of the window \fIorig\fP, so that changes made to one window
+affect both windows.
+During the use of this routine, it will often be
+necessary to call \fBtouchwin\fP or \fBtouchline\fP on \fIorig\fP before
+calling \fBprefresh\fP.
+.SS prefresh, pnoutrefresh
+.PP
+The \fBprefresh\fP and \fBpnoutrefresh\fP routines are analogous to
+\fBwrefresh\fP and \fBwnoutrefresh\fP except that they relate to pads instead
+of windows.
+The additional parameters are needed to indicate what part of the
+pad and screen are involved.
+.bP
+The \fIpminrow\fP and \fIpmincol\fP parameters specify the upper
+left-hand corner of the rectangle to be displayed in the pad.
+.bP
+The \fIsminrow\fP,
+\fIsmincol\fP, \fIsmaxrow\fP, and \fIsmaxcol\fP
+parameters specify the edges of the
+rectangle to be displayed on the screen.
+.PP
+The lower right-hand corner of the
+rectangle to be displayed in the pad is calculated from the screen coordinates,
+since the rectangles must be the same size.
+Both rectangles must be entirely
+contained within their respective structures.
+Negative values of
+\fIpminrow\fP, \fIpmincol\fP, \fIsminrow\fP, or \fIsmincol\fP are treated as if
+they were zero.
+.SS pechochar
+.PP
+The \fBpechochar\fP routine is functionally equivalent to a call to \fBaddch\fP
+followed by a call to \fBrefresh\fP(3X),
+a call to \fBwaddch\fP followed by a call
+to \fBwrefresh\fP, or a call to \fBwaddch\fP followed by a call to
+\fBprefresh\fP.
+The knowledge that only a single character is being output is
+taken into consideration and, for non-control characters, a considerable
+performance gain might be seen by using these routines instead of their
+equivalents.
+In the case of \fBpechochar\fP, the last location of the pad on
+the screen is reused for the arguments to \fBprefresh\fP.
+.SS pecho_wchar
+.PP
+The \fBpecho_wchar\fP function is the analogous wide-character
+form of \fBpechochar\fP.
+It outputs one character to a pad and immediately refreshes the pad.
+It does this by a call to \fBwadd_wch\fP followed by a call to \fBprefresh\fP.
+.SH RETURN VALUE
+Routines that return an integer return \fBERR\fP upon failure and \fBOK\fP
+(SVr4 only specifies "an integer value other than \fBERR\fP") upon successful
+completion.
+.PP
+Routines that return pointers return \fBNULL\fP on error, and set \fBerrno\fP
+to \fBENOMEM\fP.
+.PP
+X/Open does not define any error conditions.
+In this implementation
+.RS 3
+.TP 5
+\fBprefresh\fP and \fBpnoutrefresh\fP
+return an error
+if the window pointer is null, or
+if the window is not really a pad or
+if the area to refresh extends off-screen or
+if the minimum coordinates are greater than the maximum.
+.TP 5
+\fBpechochar\fP
+returns an error
+if the window is not really a pad, and the associated call
+to \fBwechochar\fP returns an error.
+.TP 5
+\fBpecho_wchar\fP
+returns an error
+if the window is not really a pad, and the associated call
+to \fBwecho_wchar\fP returns an error.
+.RE
+.SH NOTES
+Note that \fBpechochar\fP may be a macro.
+.SH PORTABILITY
+BSD curses has no \fIpad\fP feature.
+.PP
+SVr2 curses (1986) provided the \fBnewpad\fP and related functions,
+documenting them in a single line each.
+SVr3 (1987) provided more extensive documentation.
+.PP
+The documentation does not explain the term \fIpad\fP.
+However, the Apollo \fIAegis\fP workstation operating system
+supported a graphical \fIpad\fP feature:
+.bP
+These graphical pads could be much larger than the computer's display.
+.bP
+The read-only output from a command could be scrolled back to inspect,
+and select text from the pad.
+.PP
+The two uses may be related.
+.PP
+The XSI Curses standard, Issue 4 describes these functions,
+without significant change from the SVr3 documentation.
+It describes no error conditions.
+The behavior of \fBsubpad\fP if the parent window is not
+a pad is undocumented,
+and is not checked by the vendor Unix implementations:
+.bP
+SVr4 curses sets a flag in the \fBWINDOW\fP structure in \fBnewpad\fP
+which tells if the window is a \fIpad\fP.
+.IP
+However, it uses this information only in
+\fBwaddch\fP (to decide if it should call \fBwrefresh\fP) and
+\fBwscrl\fP (to avoid scrolling a pad),
+and does not check in \fBwrefresh\fP to ensure that the pad
+is refreshed properly.
+.bP
+Solaris X/Open Curses checks if a window is a pad in \fBwnoutrefresh\fP,
+returning \fBERR\fP in that case.
+.IP
+However, it only sets the flag for subwindows if the parent window is a pad.
+Its \fBnewpad\fP function does not set this information.
+Consequently, the check will never fail.
+.IP
+It makes no comparable check in \fBpnoutrefresh\fP,
+though interestingly enough, a comment in the source code
+states that the lack of a check was an MKS extension.
+.bP
+NetBSD 7 curses
+sets a flag in the \fBWINDOW\fP structure for \fBnewpad\fP and \fBsubpad\fP,
+using this to help with the distinction between \fBwnoutrefresh\fP
+and \fBpnoutrefresh\fP.
+.IP
+It does not check for the case where a subwindow is created in
+a pad using \fBsubwin\fP or \fBderwin\fP.
+.IP
+The \fBdupwin\fP function returns a regular window when duplicating a pad.
+Likewise, \fBgetwin\fP always returns a window, even if the saved
+data was from a pad.
+.PP
+This implementation
+.bP
+sets a flag in the \fBWINDOW\fP structure for \fBnewpad\fP and \fBsubpad\fP,
+.bP
+allows a \fBsubwin\fP or \fBderwin\fP call to succeed having a pad parent by
+forcing the subwindow to be a pad,
+.bP
+checks in both \fBwnoutrefresh\fP and \fBpnoutrefresh\fP to ensure
+that pads and windows are handled distinctly, and
+.bP
+ensures that \fBdupwin\fP and \fBgetwin\fP treat
+pads versus windows consistently.
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBcurs_refresh\fP(3X),
+\fBcurs_touch\fP(3X),
+\fBcurs_addch\fP(3X).
diff --git a/man/curs_print.3x b/man/curs_print.3x
new file mode 100644
index 0000000..31c7dc4
--- /dev/null
+++ b/man/curs_print.3x
@@ -0,0 +1,72 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2017 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_print.3x,v 1.19 2022/02/12 20:05:11 tom Exp $
+.TH curs_print 3X ""
+.SH NAME
+\fBmcprint\fP \- ship binary data to printer
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBint mcprint(char *\fIdata\fB, int \fIlen\fB);\fR
+.SH DESCRIPTION
+This function uses the \fBmc5p\fP or \fBmc4\fP and \fBmc5\fP capabilities,
+if they are present, to ship given data to a printer attached to the terminal.
+.PP
+Note that the \fBmcprint\fP code has no way to do flow control with the printer
+or to know how much buffering it has.
+Your application is responsible for
+keeping the rate of writes to the printer below its continuous throughput rate
+(typically about half of its nominal cps rating).
+Dot-matrix printers and
+6-page-per-minute lasers can typically handle 80cps, so a good conservative
+rule of thumb is to sleep for a second after shipping each 80-character line.
+.
+.SH RETURN VALUE
+The \fBmcprint\fP function returns \fBERR\fP if the write operation aborted
+for some reason.
+In this case, \fBerrno\fP will contain either an error associated
+with \fBwrite\fP(2) or one of the following:
+.TP 5
+ENODEV
+Capabilities for printer redirection do not exist.
+.TP 5
+ENOMEM
+Couldn't allocate sufficient memory to buffer the printer write.
+.PP
+When \fBmcprint\fP succeeds, it returns the number of characters actually
+sent to the printer.
+.SH PORTABILITY
+The \fBmcprint\fP call was designed for \fBncurses\fP(3X), and is not found
+in SVr4 curses, 4.4BSD curses, or any other previous version of curses.
+.SH BUGS
+Padding in the \fBmc5p\fP, \fBmc4\fP and \fBmc5\fP capabilities will not be
+interpreted.
+.SH SEE ALSO
+\fBcurses\fP(3X)
diff --git a/man/curs_printw.3x b/man/curs_printw.3x
new file mode 100644
index 0000000..ee9ea8a
--- /dev/null
+++ b/man/curs_printw.3x
@@ -0,0 +1,154 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2017 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_printw.3x,v 1.32 2022/02/12 20:05:11 tom Exp $
+.TH curs_printw 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.na
+.hy 0
+.SH NAME
+\fBprintw\fP,
+\fBwprintw\fP,
+\fBmvprintw\fP,
+\fBmvwprintw\fP,
+\fBvwprintw\fP, \fBvw_printw\fP \- print formatted output in \fBcurses\fP windows
+.ad
+.hy
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBint printw(const char *\fIfmt\fB, ...);\fR
+.br
+\fBint wprintw(WINDOW *\fIwin\fB, const char *\fIfmt\fB, ...);\fR
+.br
+\fBint mvprintw(int \fIy\fB, int \fIx\fB, const char *\fIfmt\fB, ...);\fR
+.br
+\fBint mvwprintw(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB, const char *\fIfmt\fB, ...);\fR
+.br
+\fBint vw_printw(WINDOW *\fIwin\fB, const char *\fIfmt\fB, va_list \fIvarglist\fB);\fR
+.sp
+/* obsolete */
+.br
+\fBint vwprintw(WINDOW *\fIwin\fB, const char *\fIfmt\fB, va_list \fIvarglist\fB);\fR
+.SH DESCRIPTION
+The \fBprintw\fP, \fBwprintw\fP, \fBmvprintw\fP and \fBmvwprintw\fP
+routines are analogous to \fBprintf\fP [see \fBprintf\fP(3)].
+In
+effect, the string that would be output by \fBprintf\fP is output
+instead as though \fBwaddstr\fP were used on the given window.
+.PP
+The \fBvwprintw\fP and \fBvw_printw\fP routines are analogous
+to \fBvprintf\fP [see \fBprintf\fP(3)]
+and perform a \fBwprintw\fP using a variable argument list.
+The third argument is a \fBva_list\fP, a pointer to a
+list of arguments, as defined in \fB<stdarg.h>\fP.
+.SH RETURN VALUE
+Routines that return an integer return \fBERR\fP upon failure and \fBOK\fP
+(SVr4 only specifies "an integer value other than \fBERR\fP") upon successful
+completion.
+.PP
+X/Open defines no error conditions.
+In this implementation,
+an error may be returned if it cannot allocate enough memory for the
+buffer used to format the results.
+It will return an error if the window pointer is null.
+.PP
+Functions with a \*(``mv\*('' prefix first perform a cursor movement using
+\fBwmove\fP, and return an error if the position is outside the window,
+or if the window pointer is null.
+.SH HISTORY
+While \fBprintw\fP was implemented in 4BSD,
+it was unused until 4.2BSD (which used it in games).
+That early version of curses was before the ANSI C standard.
+It did not use <varargs.h>, though that was available.
+In 1991 (a couple of years after SVr4 was generally available,
+and after the C standard was published),
+other developers updated the library,
+using <stdarg.h> internally in 4.4BSD curses.
+Even with this improvement,
+BSD curses did not use function prototypes (or even declare
+functions) in the <curses.h> header until 1992.
+.PP
+SVr2 documented
+\fBprintw\fP,
+\fBwprintw\fP
+tersely as \*(``printf on \fIstdscr\fP\*('' and
+tersely as \*(``printf on \fIwin\fP\*('', respectively.
+.PP
+SVr3 added
+\fBmvprintw\fP, and
+\fBmvwprintw\fP, with a three-line summary saying that they were analogous
+to \fBprintf\fP(3),
+explaining that the string which would be output from \fBprintf\fP(3) would
+instead be output using \fBwaddstr\fP on the given window.
+SVr3 also added \fBvwprintw\fP, saying that the third parameter
+is a \fBva_list\fP, defined in <varargs.h>,
+and referring the reader to the manual pages for \fIvarargs\fP and
+\fBvprintf\fP for detailed descriptions.
+.PP
+SVr4 added no new variations of \fBprintw\fP,
+but provided for using <varargs.h> or <stdarg.h> to define the \fBva_list\fP
+type.
+.PP
+X/Open Curses added \fBvw_printw\fP to replace \fBvwprintw\fP,
+stating that its \fBva_list\fP definition requires <stdarg.h>.
+.SH PORTABILITY
+In this implementation, \fBvw_printw\fP and \fBvwprintw\fP are equivalent,
+to support legacy applications.
+However, the latter (\fBvwprintw\fP) is obsolete:
+.bP
+The XSI Curses standard, Issue 4 described these functions.
+The function
+\fBvwprintw\fP is marked TO BE WITHDRAWN, and is to be replaced by a function
+\fBvw_printw\fP using the \fB<stdarg.h>\fP interface.
+.bP
+The Single Unix Specification, Version 2 states that
+\fBvw_printw\fP  is preferred to \fBvwprintw\fP since the latter requires
+including \fB<varargs.h>\fP, which
+cannot be used in the same file as \fB<stdarg.h>\fP.
+This implementation uses \fB<stdarg.h>\fP for both,
+because that header is included in \fB<curses.h\fP>.
+.bP
+X/Open Curses, Issue 5 (December 2007) marked \fBvwprintw\fP (along with
+\fBvwscanw\fP and the termcap interface) as withdrawn.
+.SH SEE ALSO
+.na
+\fBcurses\fP(3X),
+\fBcurs_addstr\fP(3X),
+\fBcurs_scanw\fP(3X),
+\fBcurs_termcap\fP(3X),
+\fBprintf\fP(3),
+\fBvprintf\fP(3).
diff --git a/man/curs_refresh.3x b/man/curs_refresh.3x
new file mode 100644
index 0000000..32e0893
--- /dev/null
+++ b/man/curs_refresh.3x
@@ -0,0 +1,163 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2016 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_refresh.3x,v 1.25 2022/02/12 20:05:11 tom Exp $
+.TH curs_refresh 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.na
+.hy 0
+.SH NAME
+\fBdoupdate\fP,
+\fBredrawwin\fP,
+\fBrefresh\fP,
+\fBwnoutrefresh\fP,
+\fBwredrawln\fP,
+\fBwrefresh\fP \- refresh \fBcurses\fP windows and lines
+.ad
+.hy
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBint refresh(void);\fP
+.br
+\fBint wrefresh(WINDOW *\fIwin\fB);\fR
+.br
+\fBint wnoutrefresh(WINDOW *\fIwin\fB);\fR
+.br
+\fBint doupdate(void);\fP
+.sp
+\fBint redrawwin(WINDOW *\fIwin\fB);\fR
+.br
+\fBint wredrawln(WINDOW *\fIwin\fB, int \fIbeg_line\fB, int \fInum_lines\fB);\fR
+.br
+.SH DESCRIPTION
+.SS refresh/wrefresh
+The \fBrefresh\fP and \fBwrefresh\fP routines (or \fBwnoutrefresh\fP and
+\fBdoupdate\fP) must be called to get actual output to the terminal,
+as other routines merely manipulate data structures.
+The routine \fBwrefresh\fP copies
+the named window to the \fIphysical screen\fP,
+taking into account what is already there to do optimizations.
+The \fBrefresh\fP routine is the
+same, using \fBstdscr\fP as the default window.
+Unless \fBleaveok\fP has been
+enabled, the physical cursor of the terminal is left at the location of the
+cursor for that window.
+.SS wnoutrefresh/doupdate
+.PP
+The \fBwnoutrefresh\fP and \fBdoupdate\fP routines allow multiple updates with
+more efficiency than \fBwrefresh\fP alone.
+In addition to all the window
+structures, \fBcurses\fP keeps two data structures representing the terminal
+screen:
+.bP
+a \fIphysical screen\fP, describing what is actually on the screen, and
+.bP
+a \fIvirtual screen\fP, describing what the programmer wants to have on the screen.
+.PP
+The routine \fBwrefresh\fP works by
+.bP
+first calling \fBwnoutrefresh\fP,
+which copies the named window to the \fIvirtual screen\fP, and
+.bP
+then calling \fBdoupdate\fP, which compares
+the \fIvirtual screen\fP to the \fIphysical screen\fP
+and does the actual update.
+.PP
+If the programmer wishes to output several windows at once, a series
+of calls to \fBwrefresh\fP results in alternating calls to \fBwnoutrefresh\fP
+and \fBdoupdate\fP, causing several bursts of output to the screen.
+By first
+calling \fBwnoutrefresh\fP for each window, it is then possible to call
+\fBdoupdate\fP once, resulting in only one burst of output, with fewer total
+characters transmitted and less CPU time used.
+.PP
+If the \fIwin\fP argument to
+\fBwrefresh\fP is the \fIphysical screen\fP
+(i.e., the global variable \fBcurscr\fP),
+the screen is immediately cleared and repainted from scratch.
+.PP
+The phrase \*(``copies the named window
+to the virtual screen\*('' above is ambiguous.
+What actually happens is that all \fItouched\fP (changed) lines in the window
+are copied to the virtual screen.
+This affects programs that use overlapping
+windows; it means that if two windows overlap, you can refresh them in either
+order and the overlap region will be modified only when it is explicitly
+changed.
+(But see the section on \fBPORTABILITY\fP below for a warning about
+exploiting this behavior.)
+.SS wredrawln/redrawwin
+.PP
+The \fBwredrawln\fP routine indicates to \fBcurses\fP that some screen lines
+are corrupted and should be thrown away before anything is written over them.
+It touches the indicated lines (marking them changed).
+The routine \fBredrawwin\fP touches the entire window.
+.SH RETURN VALUE
+Routines that return an integer return \fBERR\fP upon failure, and \fBOK\fP
+(SVr4 only specifies "an integer value other than \fBERR\fP") upon successful
+completion.
+.PP
+X/Open does not define any error conditions.
+In this implementation
+.RS 3
+.TP 5
+\fBwnoutrefresh\fP
+returns an error
+if the window pointer is null, or
+if the window is really a pad.
+.TP 5
+\fBwredrawln\fP
+returns an error
+if the associated call to \fBtouchln\fP returns an error.
+.RE
+.SH NOTES
+Note that \fBrefresh\fP and \fBredrawwin\fP may be macros.
+.SH PORTABILITY
+The XSI Curses standard, Issue 4 describes these functions.
+.PP
+Whether \fBwnoutrefresh\fP copies to the virtual screen the entire contents
+of a window or just its changed portions has never been well-documented in
+historic curses versions (including SVr4).
+It might be unwise to rely on
+either behavior in programs that might have to be linked with other curses
+implementations.
+Instead, you can do an explicit \fBtouchwin\fP before the
+\fBwnoutrefresh\fP call to guarantee an entire-contents copy anywhere.
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBcurs_outopts\fP(3X)
+\fBcurs_variables\fP(3X).
diff --git a/man/curs_scanw.3x b/man/curs_scanw.3x
new file mode 100644
index 0000000..ca78012
--- /dev/null
+++ b/man/curs_scanw.3x
@@ -0,0 +1,169 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2017 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_scanw.3x,v 1.32 2022/02/12 20:05:11 tom Exp $
+.TH curs_scanw 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.SH NAME
+\fBscanw\fP,
+\fBwscanw\fP,
+\fBmvscanw\fP,
+\fBmvwscanw\fP,
+\fBvwscanw\fP, \fBvw_scanw\fP \- convert formatted input from a \fBcurses\fP window
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBint scanw(const char *\fIfmt\fB, ...);\fR
+.br
+\fBint wscanw(WINDOW *\fIwin\fB, const char *\fIfmt\fB, ...);\fR
+.br
+\fBint mvscanw(int \fIy\fB, int \fIx\fB, const char *\fIfmt\fB, ...);\fR
+.br
+\fBint mvwscanw(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB, const char *\fIfmt\fB, ...);\fR
+.sp
+\fBint vw_scanw(WINDOW *\fIwin\fB, const char *\fIfmt\fB, va_list \fIvarglist\fB);\fR
+.sp
+/* obsolete */
+.br
+\fBint vwscanw(WINDOW *\fIwin\fB, const char *\fIfmt\fB, va_list \fIvarglist\fB);\fR
+.SH DESCRIPTION
+The \fBscanw\fP, \fBwscanw\fP and \fBmvscanw\fP routines are analogous to
+\fBscanf\fP [see \fBscanf\fP(3)].
+The effect of these routines is as though
+\fBwgetstr\fP were called on the window, and the resulting line used as input
+for \fBsscanf\fP(3).
+Fields which do not map to a variable in the \fIfmt\fP
+field are lost.
+.PP
+The \fBvwscanw\fP and \fBvw_scanw\fP routines are analogous to \fBvscanf\fP(3).
+They perform a \fBwscanw\fP using a variable argument list.
+The third argument is a \fBva_list\fP,
+a pointer to a list of arguments, as defined in \fB<stdarg.h>\fP.
+.SH RETURN VALUE
+\fBvwscanw\fP returns \fBERR\fP on failure and an integer equal to the
+number of fields scanned on success.
+.PP
+Applications may use the return value from the \fBscanw\fP, \fBwscanw\fP,
+\fBmvscanw\fP and \fBmvwscanw\fP routines to determine the number of fields
+which were mapped in the call.
+.PP
+Functions with a \*(``mv\*('' prefix first perform a cursor movement using
+\fBwmove\fP, and return an error if the position is outside the window,
+or if the window pointer is null.
+.SH HISTORY
+While \fBscanw\fP was implemented in 4BSD,
+none of the BSD releases used it until 4.4BSD (in a game).
+That early version of curses was before the ANSI C standard.
+It did not use <varargs.h>, though that was available.
+In 1991 (a couple of years after SVr4 was generally available,
+and after the C standard was published),
+other developers updated the library,
+using <stdarg.h> internally in 4.4BSD curses.
+Even with this improvement,
+BSD curses did not use function prototypes (or even declare
+functions) in the <curses.h> header until 1992.
+.PP
+SVr2 documented
+\fBscanw\fP,
+\fBwscanw\fP
+tersely as \*(``scanf through \fIstdscr\fP\*('' and
+tersely as \*(``scanf through \fIwin\fP\*('', respectively.
+.PP
+SVr3 added
+\fBmvscanw\fP, and
+\fBmvwscanw\fP, with a three-line summary saying that they were analogous
+to \fBscanf\fP(3),
+explaining that the string which would be output from \fBscanf\fP(3) would
+instead be output using \fBwaddstr\fP on the given window.
+SVr3 also added \fBvwscanw\fP, saying that the third parameter
+is a \fBva_list\fP, defined in <varargs.h>,
+and referring the reader to the manual pages for \fIvarargs\fP and
+\fBvprintf\fP for detailed descriptions.
+(Because the SVr3 documentation does not mention \fBvscanf\fP,
+that reference to \fBvprintf\fP may not be an error).
+.PP
+SVr4 added no new variations of \fBscanw\fP,
+but provided for using <varargs.h> or <stdarg.h> to define the \fBva_list\fP
+type.
+.PP
+X/Open Curses added \fBvw_scanw\fP to replace \fBvwscanw\fP,
+stating that its \fBva_list\fP definition requires <stdarg.h>.
+.SH PORTABILITY
+In this implementation, \fBvw_scanw\fP and \fBvwscanw\fP are equivalent,
+to support legacy applications.
+However, the latter (\fBvwscanw\fP) is obsolete:
+.bP
+The XSI Curses standard, Issue 4 described these functions,
+noting that the function
+\fBvwscanw\fP is marked TO BE WITHDRAWN, and is to be replaced by a function
+\fBvw_scanw\fP using the \fB<stdarg.h>\fP interface.
+.bP
+The Single Unix Specification, Version 2 states that
+\fBvw_scanw\fP  is preferred to \fBvwscanw\fP since the latter requires
+including \fB<varargs.h>\fP, which
+cannot be used in the same file as \fB<stdarg.h>\fP.
+This implementation uses \fB<stdarg.h>\fP for both, because that header
+is included in \fB<curses.h\fP>.
+.bP
+X/Open Curses, Issue 5 (December 2007) marked \fBvwscanw\fP (along with
+\fBvwprintw\fP and the termcap interface) as withdrawn.
+.LP
+Both XSI and The Single Unix Specification, Version 2 state that these
+functions return \fBERR\fP or \fBOK\fP.
+.bP
+Since the underlying \fBscanf\fP(3) can return the number of items scanned,
+and the SVr4 code was documented to use this feature,
+this is probably an editing error which was introduced in XSI,
+rather than being done intentionally.
+.bP
+This implementation returns the number of items scanned,
+for compatibility with SVr4 curses.
+As of 2018, NetBSD curses also returns the number of items scanned.
+Both ncurses and NetBSD curses call \fBvsscanf\fP to scan the string,
+which returns \fBEOF\fP on error.
+.bP
+Portable applications should only test if the return value is \fBERR\fP,
+since the \fBOK\fP value (zero) is likely to be misleading.
+.IP
+One possible way to get useful results would be to use a "%n" conversion
+at the end of the format string to ensure that something was processed.
+.SH SEE ALSO
+.na
+\fBcurses\fP(3X),
+\fBcurs_getstr\fP(3X),
+\fBcurs_printw\fP(3X),
+\fBcurs_termcap\fP(3X),
+\fBscanf\fP(3).
diff --git a/man/curs_scr_dump.3x b/man/curs_scr_dump.3x
new file mode 100644
index 0000000..7829fad
--- /dev/null
+++ b/man/curs_scr_dump.3x
@@ -0,0 +1,120 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2017 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_scr_dump.3x,v 1.20 2022/02/12 20:05:11 tom Exp $
+.TH curs_scr_dump 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.na
+.hy 0
+.SH NAME
+\fBscr_dump\fP,
+\fBscr_restore\fP,
+\fBscr_init\fP,
+\fBscr_set\fP \- read (write) a \fBcurses\fP screen from (to) a file
+.ad
+.hy
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBint scr_dump(const char *\fIfilename\fB);\fR
+.br
+\fBint scr_restore(const char *\fIfilename\fB);\fR
+.br
+\fBint scr_init(const char *\fIfilename\fB);\fR
+.br
+\fBint scr_set(const char *\fIfilename\fB);\fR
+.br
+.SH DESCRIPTION
+.SS scr_dump
+.PP
+The \fBscr_dump\fP routine dumps the current contents
+of the \fIvirtual screen\fP
+to the file \fIfilename\fP.
+.SS scr_restore
+.PP
+The \fBscr_restore\fP routine sets the \fIvirtual screen\fP to the contents
+of \fIfilename\fP, which must have been written using \fBscr_dump\fP.
+The next call to \fBdoupdate\fP restores
+the \fIphysical screen\fP to the way it looked in the dump file.
+.SS scr_init
+.PP
+The \fBscr_init\fP routine reads in the contents of \fIfilename\fP and uses
+them to initialize the \fBcurses\fP data structures about what the terminal
+currently has on its screen.
+If the data is determined to be valid,
+\fBcurses\fP bases its next update of the screen on this information rather
+than clearing the screen and starting from scratch.
+\fBscr_init\fP is used
+after \fBinitscr\fP(3X) or a \fBsystem\fP(3) call to share
+the screen with another process which has done a \fBscr_dump\fP after its
+\fBendwin\fP(3X) call.
+The data is declared invalid
+.bP
+if the terminfo capabilities \fBrmcup\fP and \fBnrrmc\fP exist, also
+.bP
+if the terminal has been written to since the preceding \fBscr_dump\fP call.
+.SS scr_set
+.PP
+The \fBscr_set\fP routine is a combination of \fBscr_restore\fP and
+\fBscr_init\fP.  It tells the program that the information in \fIfilename\fP is
+what is currently on the screen, and also what the program wants on the screen.
+This can be thought of as a screen inheritance function.
+.PP
+To read (write) a window from (to) a file, use the \fBgetwin\fP and
+\fBputwin\fP routines [see \fBcurs_util\fP(3X)].
+.SH RETURN VALUE
+All routines return the integer \fBERR\fP upon failure and \fBOK\fP
+upon success.
+.PP
+X/Open defines no error conditions.
+In this implementation,
+each will return an error if the file cannot be opened.
+.SH NOTES
+Note that \fBscr_init\fP, \fBscr_set\fP, and \fBscr_restore\fP may be macros.
+.SH PORTABILITY
+The XSI Curses standard, Issue 4, describes these functions (adding the const
+qualifiers).
+.PP
+The SVr4 docs merely say under \fBscr_init\fP that the dump data is also
+considered invalid "if the time-stamp of the tty is old" but do not define
+\*(``old\*(''.
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBcurs_initscr\fP(3X),
+\fBcurs_refresh\fP(3X),
+\fBcurs_util\fP(3X),
+\fBscr_dump\fP(5),
+\fBsystem\fP(3)
diff --git a/man/curs_scroll.3x b/man/curs_scroll.3x
new file mode 100644
index 0000000..9a99adf
--- /dev/null
+++ b/man/curs_scroll.3x
@@ -0,0 +1,95 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2006,2010 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_scroll.3x,v 1.22 2022/02/12 20:05:11 tom Exp $
+.TH curs_scroll 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.na
+.hy 0
+.SH NAME
+\fBscroll\fP,
+\fBscrl\fP,
+\fBwscrl\fP \- scroll a \fBcurses\fP window
+.ad
+.hy
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBint scroll(WINDOW *\fIwin\fB);\fR
+.sp
+\fBint scrl(int \fIn\fB);\fR
+.br
+\fBint wscrl(WINDOW *\fIwin\fB, int \fIn\fB);\fR
+.br
+.SH DESCRIPTION
+The \fBscroll\fP routine scrolls the window up one line.
+This involves moving
+the lines in the window data structure.
+As an optimization, if the scrolling
+region of the window is the entire screen,
+the \fIphysical screen\fP may be scrolled at the same time.
+.PP
+For positive \fIn\fP, the \fBscrl\fP and \fBwscrl\fP routines scroll the
+window up \fIn\fP lines (line \fIi\fP+\fIn\fP becomes \fIi\fP); otherwise
+scroll the window down \fIn\fP lines.
+This involves moving the lines in the
+window character image structure.
+The current cursor position is not changed.
+.PP
+For these functions to work, scrolling must be enabled via \fBscrollok\fP.
+.SH RETURN VALUE
+These routines return \fBERR\fP upon failure, and \fBOK\fP (SVr4 only specifies
+"an integer value other than \fBERR\fP") upon successful completion.
+.PP
+X/Open defines no error conditions.
+.PP
+This implementation returns an error
+if the window pointer is null, or
+if scrolling is not enabled in the window, e.g., with \fBscrollok\fP.
+.SH NOTES
+Note that \fBscrl\fP and \fBscroll\fP may be macros.
+.PP
+The SVr4 documentation says that the optimization of physically scrolling
+immediately if the scroll region is the entire screen \*(``is\*('' performed, not
+\*(``may be\*('' performed.
+This implementation deliberately does not guarantee
+that this will occur, to leave open the possibility of smarter
+optimization of multiple scroll actions on the next update.
+.PP
+Neither the SVr4 nor the XSI documentation specify whether the current
+attribute or
+current color-pair of blanks generated by the scroll function is zeroed.
+Under this implementation it is.
+.SH PORTABILITY
+The XSI Curses standard, Issue 4 describes these functions.
+.SH SEE ALSO
+\fBcurses\fP(3X), \fBcurs_outopts\fP(3X)
diff --git a/man/curs_slk.3x b/man/curs_slk.3x
new file mode 100644
index 0000000..0816785
--- /dev/null
+++ b/man/curs_slk.3x
@@ -0,0 +1,358 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2016,2017 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_slk.3x,v 1.44 2022/10/29 22:44:14 tom Exp $
+.TH curs_slk 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.na
+.hy 0
+.SH NAME
+\fBslk_init\fP,
+\fBslk_set\fP,
+\fBslk_wset\fP,
+\fBslk_refresh\fP,
+\fBslk_noutrefresh\fP,
+\fBslk_label\fP,
+\fBslk_clear\fP,
+\fBslk_restore\fP,
+\fBslk_touch\fP,
+\fBslk_attron\fP,
+\fBslk_attrset\fP,
+\fBslk_attroff\fP,
+\fBslk_attr_on\fP,
+\fBslk_attr_set\fP,
+\fBslk_attr_off\fP,
+\fBslk_attr\fP,
+\fBslk_color\fP,
+\fBextended_slk_color\fP \- \fBcurses\fP soft label routines
+.ad
+.hy
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBint slk_init(int \fIfmt\fB);\fR
+.sp
+\fBint slk_set(int \fIlabnum\fB, const char *\fIlabel\fB, int \fIfmt\fB);\fR
+.br
+\fBint slk_wset(int \fIlabnum\fB, const wchar_t *\fIlabel\fB, int \fIfmt\fB);\fR
+.sp
+\fBchar *slk_label(int \fIlabnum\fB);\fR
+.sp
+\fBint slk_refresh(void);\fP
+.br
+\fBint slk_noutrefresh(void);\fP
+.br
+\fBint slk_clear(void);\fP
+.br
+\fBint slk_restore(void);\fP
+.br
+\fBint slk_touch(void);\fP
+.sp
+\fBint slk_attron(const chtype \fIattrs\fB);\fR
+.br
+\fBint slk_attroff(const chtype \fIattrs\fB);\fR
+.br
+\fBint slk_attrset(const chtype \fIattrs\fB);\fR
+.br
+\fBint slk_attr_on(attr_t \fIattrs\fB, void* \fIopts\fB);\fR
+.br
+\fBint slk_attr_off(const attr_t \fIattrs\fB, void * \fIopts\fB);\fR
+.br
+\fBint slk_attr_set(const attr_t \fIattrs\fB, short \fIpair\fB, void* \fIopts\fB);\fR
+.br
+/* extension */
+.br
+\fBattr_t slk_attr(void);\fP
+.sp
+\fBint slk_color(short \fIpair\fB);\fR
+.br
+/* extension */
+.br
+\fBint extended_slk_color(int \fIpair\fB);\fR
+.SH DESCRIPTION
+The slk* functions manipulate the set of soft function-key labels that exist on
+many terminals.
+For those terminals that do not have soft labels,
+\fBcurses\fP takes over the bottom line of \fBstdscr\fP, reducing the size of
+\fBstdscr\fP and the variable \fBLINES\fP.
+\fBcurses\fP standardizes on eight
+labels of up to eight characters each.
+In addition to this, the ncurses
+implementation supports a mode where it simulates 12 labels of up to five
+characters each.
+This is useful for PC-like enduser devices.
+ncurses simulates this mode by taking over up to two lines at
+the bottom of the screen;
+it does not try to use any hardware support for this
+mode.
+.SS Initialization
+.PP
+The \fBslk_init\fP routine must be called before \fBinitscr\fP or \fBnewterm\fP
+is called.
+If \fBinitscr\fP eventually uses a line from \fBstdscr\fP to
+emulate the soft labels,
+then \fIfmt\fP determines how the labels are arranged on the screen:
+.RS 3
+.TP 3
+.B 0
+indicates a 3\-2\-3 arrangement of
+the labels.
+.TP 3
+.B 1
+indicates a 4\-4 arrangement
+.TP 3
+.B 2
+indicates the PC-like 4\-4\-4 mode.
+.TP 3
+.B 3
+is again the PC-like 4\-4\-4 mode,
+but in addition an index line is generated, helping the user to
+identify the key numbers easily.
+.RE
+.SS Labels
+.PP
+The \fBslk_set\fP routine
+(and the \fBslk_wset\fP routine for the wide-character library)
+has three parameters:
+.RS 3
+.TP 5
+.I labnum
+is the label number, from \fB1\fP to \fB8\fP
+(12 if \fIfmt\fP in \fBslk_init\fP is \fB2\fP or \fB3\fP);
+.TP
+.I label
+is be the string to put on the label,
+up to eight
+(five if \fIfmt\fP in \fBslk_init\fP is \fB2\fP or \fB3\fP)
+characters in length.
+A null string or a null pointer sets up a blank label.
+.TP
+.I fmt
+is either
+\fB0\fP, \fB1\fP, or \fB2\fP, indicating whether the label is to be
+left-justified, centered, or right-justified, respectively, within the
+label.
+.RE
+.PP
+The \fBslk_label\fP routine returns the current label for label number
+\fIlabnum\fP, with leading and trailing blanks stripped.
+.SS Screen updates
+.PP
+The \fBslk_refresh\fP and \fBslk_noutrefresh\fP routines correspond to
+the \fBwrefresh\fP and \fBwnoutrefresh\fP routines.
+.PP
+The \fBslk_clear\fP routine clears the soft labels from the screen.
+.PP
+The \fBslk_restore\fP routine restores the soft labels to the screen
+after a \fBslk_clear\fP has been performed.
+.PP
+The \fBslk_touch\fP routine forces all the soft labels to be output
+the next time a \fBslk_noutrefresh\fP is performed.
+.SS Video attributes
+.PP
+The
+\fBslk_attron\fP, \fBslk_attrset\fP, \fBslk_attroff\fP and \fBslk_attr\fP
+routines correspond to
+\fBattron\fP, \fBattrset\fP, \fBattroff\fP and \fBattr_get\fP, respectively.
+They have an effect only if soft labels are simulated on the bottom line of
+the screen.
+The default highlight for soft keys is A_STANDOUT (as in
+System V curses, which does not document this fact).
+.SS Colors
+.PP
+The \fBslk_color\fP routine corresponds to \fBcolor_set\fP.
+It has an effect only
+if soft labels are simulated on the bottom line of the screen.
+.PP
+Because \fBslk_color\fP accepts only \fBshort\fP (signed 16-bit integer) values,
+this implementation provides
+\fBextended_slk_color\fP which accepts an integer value, e.g., 32-bits.
+.
+.SH RETURN VALUE
+These routines return \fBERR\fP upon failure
+and \fBOK\fP (SVr4 specifies only "an integer value other than \fBERR\fP")
+upon successful completion.
+.PP
+X/Open defines no error conditions.
+In this implementation
+.RS 3
+.TP 5
+\fBslk_attr\fP
+returns the attribute used for the soft keys.
+.TP 5
+.na
+.hy 0
+\fBslk_attroff\fP, \fBslk_attron\fP, \fBslk_clear\fP, \fBslk_noutrefresh\fP, \fBslk_refresh\fP, \fBslk_touch\fP
+.ad
+.hy
+return an error
+if the terminal or the softkeys were not initialized.
+.TP 5
+\fBslk_attrset\fP
+returns an error
+if the terminal or the softkeys were not initialized.
+.TP 5
+\fBslk_attr_set\fP
+returns an error
+if the terminal or the softkeys were not initialized, or
+the color pair is outside the range 0..COLOR_PAIRS\-1.
+.TP 5
+\fBslk_color\fP
+returns an error
+if the terminal or the softkeys were not initialized, or
+the color pair is outside the range 0..COLOR_PAIRS\-1.
+.TP 5
+\fBslk_init\fP
+returns an error
+if the format parameter is outside the range 0..3.
+.TP 5
+\fBslk_label\fP
+returns \fBNULL\fP on error.
+.TP 5
+\fBslk_set\fP
+returns an error
+if the terminal or the softkeys were not initialized, or
+the \fIlabnum\fP parameter is outside the range of label counts, or
+if the format parameter is outside the range 0..2, or if
+memory for the labels cannot be allocated.
+.RE
+.SH HISTORY
+SVr3 introduced these functions:
+  slk_clear
+  slk_init
+  slk_label
+  slk_noutrefresh
+  slk_refresh
+  slk_restore
+  slk_set
+  slk_touch
+.PP
+SVr4 added these functions:
+  slk_attroff
+  slk_attron
+  slk_attrset
+  slk_start
+.PP
+X/Open Curses added these:
+  slk_attr_off
+  slk_attr_on
+  slk_attr_set
+  slk_color
+  slk_wset
+.SH EXTENSIONS
+.PP
+X/Open Curses documents the \fIopts\fP argument as reserved for future use,
+saying that it must be null.
+This implementation
+uses that parameter in ABI 6 for the functions which have a color-pair
+parameter to support extended color pairs.
+.PP
+For  functions  which modify the color, e.g., \fBslk_attr_set\fP,
+if \fIopts\fP is set it is treated as a pointer to \fBint\fP,
+and used to  set  the  color pair instead of the \fBshort\fP pair parameter.
+.SH NOTES
+Most applications would use \fBslk_noutrefresh\fP because a
+\fBwrefresh\fP is likely to follow soon.
+.SH PORTABILITY
+The XSI Curses standard, Issue 4, described the soft-key functions,
+with some differences from SVr4 curses:
+.bP
+It added functions like the SVr4
+attribute-manipulation functions \fBslk_attron\fP,
+\fBslk_attroff\fP, \fBslk_attrset\fP,
+but which use \fBattr_t\fP parameters (rather than \fBchtype\fP),
+along with a reserved \fIopts\fP parameter.
+.IP
+Two of these new functions (unlike the SVr4 functions) have no provision
+for color: \fBslk_attr_on\fP and \fBslk_attr_off\fP.
+.IP
+The third function (\fBslk_attr_set\fP) has a color-pair parameter.
+.bP
+It added \fBconst\fP qualifiers to parameters (unnecessarily), and
+.bP
+It added \fBslk_color\fP.
+.PP
+Although \fBslk_start\fP is declared in the curses header file,
+it was not documented by SVr4 other than its presence in a list
+of libtermlib.so.1 symbols.
+Reading the source code (i.e., Illumos):
+.bP
+\fBslk_start\fP has two parameters:
+.RS
+.bP
+\fIng\fP (number of groups) and
+.bP
+\fIgp\fP (group pointer).
+.RE
+.bP
+Soft-key groups are an array of \fIng\fP integers.
+.bP
+In SVr4, \fBslk_init\fP calls \fBslk_start\fP passing a null for \fIgp\fP. 
+For this case, \fBslk_start\fP uses the number of groups \fIng\fP
+(3 for the 3-2-3 layout, 2 for the 4-4 layout) which \fBslk_init\fP provided.
+.IP
+If \fIng\fP is neither 2 or 3,
+\fBslk_start\fP checks the terminfo \fIfln\fP (label_format) capability,
+interpreting that as a comma-separated list of numbers,
+e.g., \*(``3,2,3\*('' for the 3-2-3 layout.
+.IP
+Finally, if there is no \fIfln\fP capability, \fBslk_start\fP returns ERR.
+.bP
+If \fBslk_start\fP is given a non-null \fIgp\fP,
+it copies the \fIng\fP elements of the group of soft-keys, up to 16.
+.IP
+If there are more than 16 elements, \fBslk_start\fP returns an error.
+.bP
+The format codes \fB2\fP and \fB3\fP for \fBslk_init\fP
+were added by ncurses in 1996.
+PDCurses 2.4 added this feature in 2001.
+.PP
+The function \fBslk_attr\fP was added by ncurses in 1996.
+.PP
+X/Open Curses does not specify a limit for the number of colors and
+color pairs which a terminal can support.
+However, in its use of \fBshort\fP for the parameters,
+it carries over SVr4's implementation detail for the compiled
+terminfo database, which uses signed 16-bit numbers.
+This implementation provides extended versions of those functions
+which use \fBint\fP parameters,
+allowing applications to use larger color- and pair-numbers.
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBcurs_attr\fP(3X),
+\fBcurs_initscr\fP(3X),
+\fBcurs_refresh\fP(3X),
+\fBcurs_variables\fP(3X).
diff --git a/man/curs_sp_funcs.3x b/man/curs_sp_funcs.3x
new file mode 100644
index 0000000..9bfc457
--- /dev/null
+++ b/man/curs_sp_funcs.3x
@@ -0,0 +1,392 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 2010-2015,2017 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_sp_funcs.3x,v 1.27 2022/02/12 20:05:11 tom Exp $
+.TH curs_sp_funcs 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.na
+.hy 0
+.SH NAME
+curs_sp_funcs \- \fBcurses\fP screen-pointer extension
+.ad
+.hy
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.nf
+.sp
+\fBint alloc_pair_sp(SCREEN* \fIsp\fB, int \fIfg\fB, int \fIbg\fB);\fR
+.br
+\fBint assume_default_colors_sp(SCREEN* \fIsp\fB, int \fIfg\fB, int \fIbg\fB);\fR
+.br
+\fBint baudrate_sp(SCREEN* \fIsp\fB);\fR
+.br
+\fBint beep_sp(SCREEN* \fIsp\fB);\fR
+.br
+\fBbool can_change_color_sp(SCREEN* \fIsp\fB);\fR
+.br
+\fBint cbreak_sp(SCREEN* \fIsp\fB);\fR
+.br
+\fBint color_content_sp(SCREEN* \fIsp\fB, short \fIcolor\fB, short* \fIr\fB, short* \fIg\fB, short* \fIb\fB);\fR
+.br
+\fBint curs_set_sp(SCREEN* \fIsp\fB, int \fIvisibility\fR);\fR
+.br
+\fBint def_prog_mode_sp(SCREEN* \fIsp\fB);\fR
+.br
+\fBint def_shell_mode_sp(SCREEN* \fIsp\fB);\fR
+.sp
+\fBint define_key_sp(SCREEN* \fIsp\fB, const char * \fIdefinition\fB, int \fIkeycode\fB);\fR
+.br
+\fBint delay_output_sp(SCREEN* \fIsp\fB, int \fIms\fB);\fR
+.br
+\fBint doupdate_sp(SCREEN* \fIsp\fB);\fR
+.br
+\fBint echo_sp(SCREEN* \fIsp\fB);\fR
+.br
+\fBint endwin_sp(SCREEN* \fIsp\fB);\fR
+.br
+\fBchar erasechar_sp(SCREEN* \fIsp\fB);\fR
+.br
+\fBint erasewchar_sp(SCREEN* \fIsp\fB, wchar_t *\fIch\fB);\fR
+.br
+\fBint extended_color_content_sp(SCREEN * \fIsp\fB, int \fIcolor\fB, int * \fIr\fB, int * \fIg\fB, int * \fIb\fB);\fR
+.br
+\fBint extended_pair_content_sp(SCREEN* \fIsp\fB, int \fIpair\fB, int * \fIfg\fB, int * \fIbg\fB);\fR
+.br
+\fBint extended_slk_color_sp(SCREEN* \fIsp\fB, int \fIpair\fB);\fR
+.sp
+\fBvoid filter_sp(SCREEN* \fIsp\fB);\fR
+.br
+\fBint find_pair_sp(SCREEN* \fIsp\fB, int \fIfg\fB, int \fIbg\fB);\fR
+.br
+\fBint flash_sp(SCREEN* \fIsp\fB);\fR
+.br
+\fBint flushinp_sp(SCREEN* \fIsp\fB);\fR
+.br
+\fBint free_pair_sp(SCREEN* \fIsp\fB, int \fIpair\fB);\fR
+.br
+\fBint get_escdelay_sp(SCREEN* \fIsp\fB);\fR
+.br
+\fBint getmouse_sp(SCREEN* \fIsp\fB, MEVENT* \fBevent\fB);\fR
+.br
+\fBWINDOW* getwin_sp(SCREEN* \fIsp\fB, FILE* \fIfilep\fB);\fR
+.br
+\fBint halfdelay_sp(SCREEN* \fIsp\fB, int \fItenths\fB);\fR
+.br
+\fBbool has_colors_sp(SCREEN* \fIsp\fB);\fR
+.sp
+\fBbool has_ic_sp(SCREEN* \fIsp\fB);\fR
+.br
+\fBbool has_il_sp(SCREEN* \fIsp\fB);\fR
+.br
+\fBint has_key_sp(SCREEN* \fIsp\fB, int \fIch\fB);\fR
+.br
+\fBbool has_mouse_sp(SCREEN* \fIsp\fB);\fR
+.br
+\fBint init_color_sp(SCREEN* \fIsp\fB, short \fIcolor\fB, short \fIr\fB, short \fIg\fB, short \fIb\fB);\fR
+.br
+\fBint init_extended_color_sp(SCREEN* \fIsp\fB, int \fIcolor\fB, int \fIr\fB, int \fIg\fB, int \fIb\fB);\fR
+.br
+\fBint init_extended_pair_sp(SCREEN* \fIsp\fB, int \fIpair\fB, int \fIfg\fB, int \fIbg\fB);\fR
+.br
+\fBint init_pair_sp(SCREEN* \fIsp\fB, short \fIpair\fB, short \fIfg\fB, short \fIbg\fB);\fR
+.br
+\fBint intrflush_sp(SCREEN* \fIsp\fB, WINDOW* \fIwin\fB, bool \fIbf\fB);\fR
+.br
+\fBbool is_term_resized_sp(SCREEN* \fIsp\fB, int \fIlines\fB, int \fIcolumns\fB);\fR
+.sp
+\fBbool isendwin_sp(SCREEN* \fIsp\fB);\fR
+.br
+\fBint key_defined_sp(SCREEN* \fIsp\fB, const char *\fIdefinition\fB);\fR
+.br
+\fBchar* keybound_sp(SCREEN* \fIsp\fB, int \fIkeycode\fB, int \fIcount\fB);\fR
+.br
+\fBNCURSES_CONST char * keyname_sp(SCREEN* \fIsp\fB, int \fIc\fB);\fR
+.br
+\fBint keyok_sp(SCREEN* \fIsp\fB, int \fIkeycode\fB, bool \fIenable\fB);\fR
+.br
+\fBchar killchar_sp(SCREEN* \fIsp\fB);\fR
+.br
+\fBint killwchar_sp(SCREEN* \fIsp\fB, wchar_t *\fIch\fB);\fR
+.br
+\fBchar* longname_sp(SCREEN* \fIsp\fB);\fR
+.br
+\fBint mcprint_sp(SCREEN* \fIsp\fB, char *\fIdata\fB, int \fIlen\fB);\fR
+.br
+\fBint mouseinterval_sp(SCREEN* \fIsp\fB, int \fIerval\fB);\fR
+.sp
+\fBmmask_t mousemask_sp(SCREEN* \fIsp\fB, mmask_t \fInewmask\fB, mmask_t *\fIoldmask\fB);\fR
+.br
+\fBint mvcur_sp(SCREEN* \fIsp\fB, int \fIoldrow\fB, int \fIoldcol\fB, int \fInewrow\fB, int \fInewcol\fB);\fR
+.br
+\fBint napms_sp(SCREEN* \fIsp\fB, int \fIms\fB);\fR
+.br
+\fBWINDOW* newpad_sp(SCREEN* \fIsp\fB, int \fInrows\fB, int \fIncols\fB);\fR
+.br
+\fBSCREEN* new_prescr(void);\fP
+.br
+\fBSCREEN* newterm_sp(SCREEN* \fIsp\fB, const char *\fItype\fB, FILE *\fIoutfd\fB, FILE *\fIinfd\fB);\fR
+.br
+\fBWINDOW* newwin_sp(SCREEN* \fIsp\fB, int \fInlines\fB, int \fIncols\fB, int \fIbegin_y\fB, int \fIbegin_x\fB);\fR
+.br
+\fBint nl_sp(SCREEN* \fIsp\fB);\fR
+.br
+\fBint nocbreak_sp(SCREEN* \fIsp\fB);\fR
+.br
+\fBint noecho_sp(SCREEN* \fIsp\fB);\fR
+.sp
+\fBvoid nofilter_sp(SCREEN* \fIsp\fB);\fR
+.br
+\fBint nonl_sp(SCREEN* \fIsp\fB);\fR
+.br
+\fBvoid noqiflush_sp(SCREEN* \fIsp\fB);\fR
+.br
+\fBint noraw_sp(SCREEN* \fIsp\fB);\fR
+.br
+\fBint pair_content_sp(SCREEN* \fIsp\fB, short \fIpair\fB, short* \fIfg\fB, short* \fIbg\fB);\fR
+.br
+\fBvoid qiflush_sp(SCREEN* \fIsp\fB);\fR
+.br
+\fBint raw_sp(SCREEN* \fIsp\fB);\fR
+.br
+\fBint reset_prog_mode_sp(SCREEN* \fIsp\fB);\fR
+.br
+\fBvoid reset_color_pairs_sp(SCREEN* \fIsp\fB);\fR
+.br
+\fBint reset_shell_mode_sp(SCREEN* \fIsp\fB);\fR
+.sp
+\fBint resetty_sp(SCREEN* \fIsp\fB);\fR
+.br
+\fBint resize_term_sp(SCREEN* \fIsp\fB, int \fIlines\fB, int \fIcolumns\fB);\fR
+.br
+\fBint resizeterm_sp(SCREEN* \fIsp\fB, int \fIlines\fB, int \fIcolumns\fB);\fR
+.br
+\fBint ripoffline_sp(SCREEN* \fIsp\fB, int \fIline\fB, int (*\fIinit\fB)(WINDOW* \fIwin\fB, int \fIfmt\fB));\fR
+.br
+\fBint savetty_sp(SCREEN* \fIsp\fB);\fR
+.br
+\fBint scr_init_sp(SCREEN* \fIsp\fB, const char *\fIfilename\fB);\fR
+.br
+\fBint scr_restore_sp(SCREEN* \fIsp\fB, const char *\fIfilename\fB);\fR
+.br
+\fBint scr_set_sp(SCREEN* \fIsp\fB, const char *\fIfilename\fB);\fR
+.br
+\fBint set_escdelay_sp(SCREEN* \fIsp\fB, int \fIms\fB);\fR
+.br
+\fBint set_tabsize_sp(SCREEN* \fIsp\fB, int \fIcols\fB);\fR
+.sp
+\fBint slk_attr_set_sp(SCREEN* \fIsp\fB, const attr_t \fIattrs\fB, short \fIpair\fB, void*\fIopts\fB);\fR
+.br
+\fBint slk_attrset_sp(SCREEN* \fIsp\fB, const chtype \fIa\fB);\fR
+.br
+\fBint slk_attroff_sp(SCREEN* \fIsp\fB, const chtype \fIa\fB);\fR
+.br
+\fBint slk_attron_sp(SCREEN* \fIsp\fB, const chtype \fIa\fB);\fR
+.br
+\fBattr_t slk_attr_sp(SCREEN* \fIsp\fB);\fR
+.br
+\fBint slk_clear_sp(SCREEN* \fIsp\fB);\fR
+.br
+\fBint slk_color_sp(SCREEN* \fIsp\fB, short \fIpair\fB);\fR
+.br
+\fBint slk_init_sp(SCREEN* \fIsp\fB, int \fIfmt\fB);\fR
+.br
+\fBchar* slk_label_sp(SCREEN* \fIsp\fB, int \fIlabnum\fB);\fR
+.br
+\fBint slk_noutrefresh_sp(SCREEN* \fIsp\fB);\fR
+.sp
+\fBint slk_refresh_sp(SCREEN* \fIsp\fB);\fR
+.br
+\fBint slk_restore_sp(SCREEN* \fIsp\fB);\fR
+.br
+\fBint slk_set_sp(SCREEN* \fIsp\fB, int \fIlabnum\fB, const char * \fIlabel\fB, int \fIfmt\fB);\fR
+.br
+\fBint slk_touch_sp(SCREEN* \fIsp\fB);\fR
+.br
+\fBint start_color_sp(SCREEN* \fIsp\fB);\fR
+.br
+\fBattr_t term_attrs_sp(SCREEN* \fIsp\fB);\fR
+.br
+\fBchtype termattrs_sp(SCREEN* \fIsp\fB);\fR
+.br
+\fBchar* termname_sp(SCREEN* \fIsp\fB);\fR
+.br
+\fBint typeahead_sp(SCREEN* \fIsp\fB, int \fIfd\fB);\fR
+.br
+\fBint unget_wch_sp(SCREEN* \fIsp\fB, const wchar_t \fIwch\fB);\fR
+.sp
+\fBint ungetch_sp(SCREEN* \fIsp\fB, int \fIch\fB);\fR
+.br
+\fBint ungetmouse_sp(SCREEN* \fIsp\fB,MEVENT * \fBevent\fB);\fR
+.br
+\fBint use_default_colors_sp(SCREEN* \fIsp\fB);\fR
+.br
+\fBvoid use_env_sp(SCREEN* \fIsp\fB, bool \fIbf\fB);\fR
+.br
+\fBint use_legacy_coding_sp(SCREEN* \fIsp\fB, int \fIlevel\fB);\fR
+.br
+\fBvoid use_tioctl_sp(SCREEN *\fIsp\fB, bool \fIbf\fB);\fR
+.br
+\fBint vid_attr_sp(SCREEN* \fIsp\fB, attr_t \fIattrs\fB, short \fIpair\fB, void * \fIopts\fB);\fR
+.br
+\fBint vid_puts_sp(SCREEN* \fIsp\fB, attr_t \fIattrs\fB, short \fIpair\fB, void * \fIopts\fB, NCURSES_SP_OUTC \fIputc\fB);\fR
+.br
+\fBint vidattr_sp(SCREEN* \fIsp\fB, chtype \fIattrs\fB);\fR
+.br
+\fBint vidputs_sp(SCREEN* \fIsp\fB, chtype \fIattrs\fB, NCURSES_SP_OUTC \fIputc\fB);\fR
+.br
+\fBwchar_t* wunctrl_sp(SCREEN* \fIsp\fB, cchar_t *\fIch\fB);\fR
+.sp
+\fB#include <form.h>\fP
+.sp
+\fBFORM* new_form_sp(SCREEN* \fIsp\fB, FIELD **\fIfields\fB);\fR
+.sp
+\fB#include <menu.h>\fP
+.sp
+\fBMENU* new_menu_sp(SCREEN* \fIsp\fB, ITEM **\fIitems\fB);\fR
+.sp
+\fB#include <panel.h>\fP
+.sp
+\fBPANEL* ceiling_panel(SCREEN* \fIsp\fB);\fR
+.br
+\fBPANEL* ground_panel(SCREEN* \fIsp\fB);\fR
+.br
+\fBvoid update_panels_sp(SCREEN* \fIsp\fB);\fR
+.sp
+\fB#include <term.h>\fP
+.sp
+\fBint del_curterm_sp(SCREEN* \fIsp\fB, TERMINAL *\fIoterm\fB);\fR
+.br
+\fBint putp_sp(SCREEN* \fIsp\fB, const char *\fIstr\fB);\fR
+.br
+\fBint restartterm_sp(SCREEN* \fIsp\fB, NCURSES_CONST char*\fIterm\fB, int \fIfiledes\fB, int *\fIerrret\fB);\fR
+.br
+\fBTERMINAL* set_curterm_sp(SCREEN* \fIsp\fB, TERMINAL*\fInterm\fB);\fR
+.br
+\fBint tgetent_sp(SCREEN* \fIsp\fB, char *\fIbp\fB, const char *\fIname\fB);\fR
+.br
+\fBint tgetflag_sp(SCREEN* \fIsp\fB, const char *\fIcapname\fB);\fR
+.br
+\fBint tgetnum_sp(SCREEN* \fIsp\fB, const char *\fIcapname\fB);\fR
+.br
+\fBchar* tgetstr_sp(SCREEN* \fIsp\fB, const char *\fIcapname\fB, char **\fIarea\fB);\fR
+.br
+\fBchar* tgoto_sp(SCREEN* \fIsp\fB, const char *\fIcapname\fB, int \fIcol\fB, int \fIrow\fB);\fR
+.br
+\fBint tigetflag_sp(SCREEN* \fIsp\fB, const char *\fIcapname\fB);\fR
+.br
+\fBint tigetnum_sp(SCREEN* \fIsp\fB, const char *\fIcapname\fB);\fR
+.br
+\fBchar* tigetstr_sp(SCREEN* \fIsp\fB, const char *\fIcapname\fB);\fR
+.br
+\fR/* may instead use 9 long parameters */\fP
+.br
+\fBchar* tparm_sp(SCREEN* \fIsp\fB, const char *\fIstr\fB, ...);\fR
+.br
+\fBint tputs_sp(SCREEN* \fIsp\fB, const char *\fIstr\fB, int \fIaffcnt\fB, NCURSES_SP_OUTC \fIputc\fB);\fR
+.sp
+\fB#include <unctrl.h>\fP
+.sp
+\fBNCURSES_CONST char* unctrl_sp(SCREEN* \fIsp\fB, chtype \fIc\fB);\fR
+.ad
+.br
+.SH DESCRIPTION
+This implementation can be configured to provide a set of functions which
+improve the ability to manage multiple screens.
+This feature can be added to any of the configurations supported by ncurses;
+it adds new entrypoints
+without changing the meaning of any of the existing ones.
+.PP
+.\" ***************************************************************************
+.SS IMPROVED FUNCTIONS
+Most of the functions are new versions of existing functions.
+A parameter is added at the front of the parameter list.
+It is a SCREEN pointer.
+.PP
+The existing functions all use the current screen,
+which is a static variable.
+The extended functions use the specified screen,
+thereby reducing the number of variables which must be modified
+to update multiple screens.
+.\" ***************************************************************************
+.SS NEW FUNCTIONS
+Here are the new functions:
+.TP 5
+ceiling_panel
+this returns a pointer to the topmost panel in the given screen.
+.TP 5
+ground_panel
+this returns a pointer to the lowest panel in the given screen.
+.TP 5
+new_prescr
+when creating a new screen, the library uses static variables which
+have been preset, e.g., by \fBuse_env\fP(3X), \fBfilter\fP(3X), etc.
+With the screen-pointer extension,
+there are situations where it must create a current screen before
+the unextended library does.
+The \fBnew_prescr\fP function is used internally to handle these cases.
+It is also provided as an entrypoint to allow applications to customize
+the library initialization.
+.\" ***************************************************************************
+.SH NOTES
+This extension introduces some new names:
+.TP 5
+NCURSES_SP_FUNCS
+This is set to the library patch-level number.
+In the unextended library, this is zero (0),
+to make it useful for checking if the extension is provided.
+.TP 5
+NCURSES_SP_NAME
+The new functions are named using the macro \fINCURSES_SP_NAME\fP,
+which hides the actual implementation.
+Currently this adds a \*(``_sp\*('' suffix to the name of the unextended function.
+This manual page indexes the extensions showing the full name.
+However the proper usage of these functions uses the macro,
+to provide for the possibility of changing the naming convention
+for specific library configurations.
+.TP 5
+NCURSES_SP_OUTC
+This is a new function-pointer type to use in the screen-pointer functions
+where an \fINCURSES_OUTC\fP is used in the unextended library.
+.TP 5
+NCURSES_OUTC
+This is a function-pointer type used for the cases where a function passes
+characters to the output stream, e.g., \fBvidputs\fP(3X).
+.PP
+.SH PORTABILITY
+These routines are specific to ncurses.
+They were not supported on Version 7, BSD or System V implementations.
+It is recommended that any code depending on ncurses extensions
+be conditioned using \fINCURSES_SP_FUNCS\fP.
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBcurs_opaque\fP(3X),
+\fBcurs_threads\fP(3X).
diff --git a/man/curs_termattrs.3x b/man/curs_termattrs.3x
new file mode 100644
index 0000000..017dbe4
--- /dev/null
+++ b/man/curs_termattrs.3x
@@ -0,0 +1,141 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2015 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_termattrs.3x,v 1.19 2022/02/12 20:05:11 tom Exp $
+.TH curs_termattrs 3X ""
+.SH NAME
+\fBbaudrate\fP,
+\fBerasechar\fP,
+\fBerasewchar\fP,
+\fBhas_ic\fP,
+\fBhas_il\fP,
+\fBkillchar\fP,
+\fBkillwchar\fP,
+\fBlongname\fP,
+\fBterm_attrs\fP,
+\fBtermattrs\fP,
+\fBtermname\fP \- \fBcurses\fP environment query routines
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.PP
+\fBint baudrate(void);\fP
+.br
+\fBchar erasechar(void);\fP
+.br
+\fBint erasewchar(wchar_t *\fIch\fB);\fR
+.br
+\fBbool has_ic(void);\fP
+.br
+\fBbool has_il(void);\fP
+.br
+\fBchar killchar(void);\fP
+.br
+\fBint killwchar(wchar_t *\fIch\fB);\fR
+.br
+\fBchar *longname(void);\fP
+.br
+\fBattr_t term_attrs(void);\fP
+.br
+\fBchtype termattrs(void);\fP
+.br
+\fBchar *termname(void);\fP
+.br
+.SH DESCRIPTION
+.SS baudrate
+The \fBbaudrate\fP routine returns the output speed of the terminal.
+The
+number returned is in bits per second, for example \fB9600\fP, and is an
+integer.
+.SS erasechar, erasewchar
+.PP
+The \fBerasechar\fP routine returns the user's current erase character.
+.PP
+The \fBerasewchar\fP routine stores the current erase character
+in the location referenced by \fIch\fP.
+If no erase character has been defined, the routine fails
+and the location referenced by \fIch\fP is not changed.
+.SS has_is, has_il
+.PP
+The \fBhas_ic\fP routine is true if the terminal has insert- and delete-
+character capabilities.
+.PP
+The \fBhas_il\fP routine is true if the terminal has insert- and delete-line
+capabilities, or can simulate them using scrolling regions.
+This might
+be used to determine if it would be appropriate to turn on physical
+scrolling using \fBscrollok\fP.
+.SS killchar, killwchar
+.PP
+The \fBkillchar\fP routine returns the user's current line kill character.
+.PP
+The \fBkillwchar\fP routine stores the current line-kill character
+in the location referenced by \fIch\fP.
+If no line-kill character has been defined,
+the routine fails and the location referenced by \fIch\fP is not changed.
+.SS longname
+.PP
+The \fBlongname\fP routine returns a pointer to a static area
+containing a verbose description of the current terminal.
+The maximum
+length of a verbose description is 128 characters.
+It is defined only
+after the call to \fBinitscr\fP or \fBnewterm\fP.  The area is
+overwritten by each call to \fBnewterm\fP and is not restored by
+\fBset_term\fP, so the value should be saved between calls to
+\fBnewterm\fP if \fBlongname\fP is going to be used with multiple
+terminals.
+.SS termattrs, term_attrs
+.PP
+If a given terminal does not support a video attribute that an
+application program is trying to use, \fBcurses\fP may substitute a
+different video attribute for it.
+The \fBtermattrs\fP and \fBterm_attrs\fP functions
+return a logical \fBOR\fP of all video attributes supported by the
+terminal using \fBA_\fP and \fBWA_\fP constants respectively.
+This information is useful when a \fBcurses\fP program
+needs complete control over the appearance of the screen.
+.SS termname
+.PP
+The \fBtermname\fP routine returns the terminal name used by \fBsetupterm\fP.
+.SH RETURN VALUE
+\fBlongname\fP and \fBtermname\fP return \fBNULL\fP on error.
+.PP
+Routines that return an integer return \fBERR\fP upon failure and \fBOK\fP
+(SVr4 only specifies "an integer value other than \fBERR\fP") upon successful
+completion.
+.SH NOTES
+Note that \fBtermattrs\fP may be a macro.
+.SH PORTABILITY
+The XSI Curses standard, Issue 4 describes these functions.
+It changes the
+return type of \fBtermattrs\fP to the new type \fBattr_t\fP.
+Most versions of curses truncate the result returned by \fBtermname\fP to
+14 characters.
+.SH SEE ALSO
+\fBcurses\fP(3X), \fBcurs_initscr\fP(3X), \fBcurs_outopts\fP(3X)
diff --git a/man/curs_termcap.3x b/man/curs_termcap.3x
new file mode 100644
index 0000000..e073d94
--- /dev/null
+++ b/man/curs_termcap.3x
@@ -0,0 +1,373 @@
+.\"***************************************************************************
+.\" Copyright 2018-2022,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2017,2018 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_termcap.3x,v 1.56 2022/02/12 20:05:11 tom Exp $
+.TH curs_termcap 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.na
+.hy 0
+.ds n 5
+.SH NAME
+\fBPC\fP,
+\fBUP\fP,
+\fBBC\fP,
+\fBospeed\fP,
+\fBtgetent\fP,
+\fBtgetflag\fP,
+\fBtgetnum\fP,
+\fBtgetstr\fP,
+\fBtgoto\fP,
+\fBtputs\fP \- \fBcurses\fP emulation of termcap
+.ad
+.hy
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.br
+\fB#include <term.h>\fP
+.sp
+\fBextern char PC;\fP
+.br
+\fBextern char * UP;\fP
+.br
+\fBextern char * BC;\fP
+.br
+\fBextern @NCURSES_OSPEED@ ospeed;\fP
+.sp
+\fBint tgetent(char *\fIbp\fB, const char *\fIname\fB);\fR
+.br
+\fBint tgetflag(const char *\fIid\fB);\fR
+.br
+\fBint tgetnum(const char *\fIid\fB);\fR
+.br
+\fBchar *tgetstr(const char *\fIid\fB, char **\fIarea\fB);\fR
+.br
+\fBchar *tgoto(const char *\fIcap\fB, int \fIcol\fB, int \fIrow\fB);\fR
+.br
+\fBint tputs(const char *\fIstr\fB, int \fIaffcnt\fB, int (*\fIputc\fB)(int));\fR
+.br
+.SH DESCRIPTION
+These routines are included as a conversion aid for programs that use
+the \fItermcap\fP library.
+Their parameters are the same, but the
+routines are emulated using the \fIterminfo\fP database.
+Thus, they
+can only be used to query the capabilities of entries for which a
+terminfo entry has been compiled.
+.SS Initialization
+.PP
+The \fBtgetent\fP routine loads the entry for \fIname\fP.
+It returns:
+.RS 3
+.TP 3
+1
+on success,
+.TP 3
+0
+if there is no such entry
+(or that it is a generic type, having too little information for curses
+applications to run), and
+.TP 3
+\-1
+if the terminfo database could not be found.
+.RE
+.PP
+This differs from the \fItermcap\fP library in two ways:
+.RS 3
+.bP
+The emulation ignores the buffer pointer \fIbp\fP.
+The \fItermcap\fP library would store a copy of the terminal
+description in the area referenced by this pointer.
+However, ncurses stores its terminal descriptions in compiled
+binary form, which is not the same thing.
+.bP
+There is a difference in return codes.
+The \fItermcap\fP library does not check if the terminal
+description is marked with the \fIgeneric\fP capability,
+or if the terminal description has cursor-addressing.
+.RE
+.SS Capability Values
+.PP
+The \fBtgetflag\fP routine gets the boolean entry for \fIid\fP,
+or zero if it is not available.
+.PP
+The \fBtgetnum\fP routine gets the numeric entry for \fIid\fP,
+or \-1 if it is not available.
+.PP
+The \fBtgetstr\fP routine returns the string entry for \fIid\fP,
+or zero if it is not available.
+Use \fBtputs\fP to output the returned string.
+The \fIarea\fP parameter is used as follows:
+.RS 3
+.bP
+It is assumed to be the address of a pointer to a buffer managed by the
+calling application.
+.bP
+However, ncurses checks to ensure that \fBarea\fP is not NULL,
+and also that the resulting buffer pointer is not NULL.
+If either check fails, the \fIarea\fP parameter is ignored.
+.bP
+If the checks succeed, ncurses also copies the return value to
+the buffer pointed to by \fIarea\fP,
+and the \fIarea\fP value will be updated to point past the null ending
+this value.
+.bP
+The return value itself is an address in the terminal description which
+is loaded into memory.
+.RE
+.PP
+Only the first two characters of the \fBid\fP parameter of
+\fBtgetflag\fP,
+\fBtgetnum\fP and
+\fBtgetstr\fP are compared in lookups.
+.SS Formatting Capabilities
+.PP
+The \fBtgoto\fP routine expands the given capability using the parameters.
+.bP
+Because the capability may have padding characters,
+the output of \fBtgoto\fP should be passed to \fBtputs\fP
+rather than some other output function such as \fBprintf\fP(3).
+.bP
+While \fBtgoto\fP is assumed to be used for the two-parameter
+cursor positioning capability,
+termcap applications also use it for single-parameter capabilities.
+.IP
+Doing this shows a quirk in \fBtgoto\fP: most hardware
+terminals use cursor addressing with \fIrow\fP first,
+but the original developers of the termcap interface chose to
+put the \fIcolumn\fP parameter first.
+The \fBtgoto\fP function swaps the order of parameters.
+It does this also for calls requiring only a single parameter.
+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).
+.IP
+However, \fBtparm\fP is not a \fItermcap\fP feature,
+and portable \fItermcap\fP applications should not rely upon its availability.
+.PP
+The \fBtputs\fP routine is described on the \fBcurs_terminfo\fP(3X) manual
+page.
+It can retrieve capabilities by either termcap or terminfo name.
+.SS Global Variables
+.PP
+The variables
+\fBPC\fP,
+\fBUP\fP and
+\fBBC\fP
+are set by \fBtgetent\fP to the terminfo entry's data for
+\fBpad_char\fP,
+\fBcursor_up\fP and
+\fBbackspace_if_not_bs\fP,
+respectively.
+\fBUP\fP is not used by ncurses.
+\fBPC\fP is used in the \fBtdelay_output\fP function.
+\fBBC\fP is used in the \fBtgoto\fP emulation.
+The variable \fBospeed\fP is set by ncurses in a system-specific coding
+to reflect the terminal speed.
+.SS Releasing Memory
+The termcap functions provide no means for freeing memory,
+because legacy termcap implementations used only the buffer
+areas provided by the caller via \fBtgetent\fP and \fBtgetstr\fP.
+Those buffers are unused in terminfo.
+.PP
+On the other hand, terminfo allocates memory.
+It uses \fBsetupterm\fP to retrieve the data used by \fBtgetent\fP
+and the functions which return capability values such as \fBtgetstr\fP.
+One could use
+.sp
+	\fBdel_curterm(cur_term);\fP
+.sp
+.PP
+to free this memory, but there is an additional complication with ncurses.
+It uses a fixed-size \fIpool\fP of storage locations,
+one per setting of the \fBTERM\fP variable when \fBtgetent\fP is called.
+The \fBscreen\fP(1) program relies upon this arrangement,
+to improve its performance.
+.PP
+An application which uses only the low-level termcap functions could
+free the memory using \fBdel_curterm\fP,
+because the pool is freed using other functions
+(see \fBcurs_memleaks\fP(3X)).
+.
+.SH RETURN VALUE
+Except where explicitly noted,
+routines that return an integer return \fBERR\fP upon failure and \fBOK\fP
+(SVr4 only specifies "an integer value other than \fBERR\fP") upon successful
+completion.
+.PP
+Routines that return pointers return \fBNULL\fP on 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
+not-quite-compatible termcap notation.
+This will not cause problems if all
+you do with it is call \fBtgoto\fP or \fBtparm\fP, which both expand
+terminfo-style strings as terminfo.
+(The \fBtgoto\fP function, if configured to support 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).
+.PP
+Because terminfo conventions for representing padding in string capabilities
+differ from termcap's,
+users can be surprised:
+.bP
+\fBtputs("50")\fP in a terminfo system will put out a literal \*(``50\*(''
+rather than busy-waiting for 50 milliseconds.
+.bP
+However, if ncurses is configured to support termcap,
+it may also have been configured to support the BSD-style padding.
+.IP
+In that case, \fBtputs\fP inspects strings passed to it,
+looking for digits at the beginning of the string.
+.IP
+\fBtputs("50")\fP in a termcap system may wait for 50 milliseconds
+rather than put out a literal \*(``50\*(''
+.PP
+Note that termcap has nothing analogous to terminfo's \fBsgr\fP string.
+One consequence of this is that termcap applications assume \fBme\fP
+(terminfo \fBsgr0\fP) does not reset the alternate character set.
+This implementation checks for, and modifies the data shown to the
+termcap interface to accommodate termcap's limitation in this respect.
+.SH PORTABILITY
+.SS Standards
+These functions are provided for supporting legacy applications,
+and should not be used in new programs:
+.bP
+The XSI Curses standard, Issue 4 describes these functions.
+However, they
+are marked TO BE WITHDRAWN and may be removed in future versions.
+.bP
+X/Open Curses, Issue 5 (December 2007) marked the termcap interface
+(along with \fBvwprintw\fP and \fBvwscanw\fP) as withdrawn.
+.PP
+Neither the XSI Curses standard nor the SVr4 man pages documented the return
+values of \fBtgetent\fP correctly, though all three were in fact returned ever
+since SVr1.
+In particular, an omission in the XSI Curses documentation has been
+misinterpreted to mean that \fBtgetent\fP returns \fBOK\fP or \fBERR\fP.
+Because the purpose of these functions is to provide compatibility with
+the \fItermcap\fP library, that is a defect in XCurses, Issue 4, Version 2
+rather than in ncurses.
+.SS Compatibility with BSD Termcap
+.PP
+External variables are provided for support of certain termcap applications.
+However, termcap applications' use of those variables is poorly documented,
+e.g., not distinguishing between input and output.
+In particular, some applications are reported to declare and/or
+modify \fBospeed\fP.
+.PP
+The comment that only the first two characters of the \fBid\fP 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 \fBtgetstr\fP, \fBtgetnum\fP and \fBtgetflag\fP.
+Some applications assume that the termcap interface does not require
+the trailing NUL for the parameter name.
+Taking into account these issues:
+.bP
+As a special case,
+\fBtgetflag\fP matched against a single-character identifier
+provided that was at the end of the terminal description.
+You should not rely upon this behavior in portable programs.
+This implementation disallows matches against single-character capability names.
+.bP
+This implementation disallows matches by the termcap interface against
+extended capability names which are longer than two characters.
+.PP
+The BSD termcap function \fBtgetent\fP returns the text of a termcap
+entry in 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.
+.SS Other Compatibility
+This library includes a termcap.h header,
+for compatibility with other implementations.
+But the header is rarely used because the other implementations
+are not strictly compatible.
+.PP
+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 were two different termcap.h header files in the BSD
+sources:
+.bP
+One was used internally by the \fBjove\fP editor in 2BSD through 4.4BSD.
+It defined global symbols for the termcap variables which it used.
+.bP
+The other appeared in 4.4BSD Lite Release 2 (mid-1993)
+as part of \fIlibedit\fP (also known as the \fIeditline\fP library).
+The CSRG source history shows that this was added in mid-1992.
+The \fIlibedit\fP header file was used internally,
+as a convenience for compiling the \fIeditline\fP library.
+It declared function prototypes, but no global variables.
+.PP
+The header file from \fIlibedit\fP was added to NetBSD's termcap
+library in mid-1994.
+.PP
+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 \fBconst\fP for the function prototypes in the header
+where one would expect the parameters to be read-only.
+This was a difference versus the original BSD termcap.
+The prototype for \fBtputs\fP also differed,
+but in that instance, it was \fIlibedit\fP which differed from BSD termcap.
+.PP
+A copy of GNU termcap 1.3 was bundled with \fIbash\fP in mid-1993,
+to support the \fBreadline\fP(3) library.
+.PP
+A termcap.h file was provided in ncurses 1.8.1 (November 1993).
+That reflected influence by \fBemacs\fP(1) (rather than \fBjove\fP(1))
+and GNU termcap:
+.bP
+it provided declarations for a few global symbols used by \fBemacs\fP
+.bP
+it provided function prototypes (using \fBconst\fP).
+.bP
+a prototype for \fBtparam\fP (a GNU termcap feature) was provided.
+.PP
+Later (in mid-1996) the \fBtparam\fP 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
+termcap library interfaces.
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBputc\fP(3),
+\fBterm_variables\fP(3X),
+\fBterminfo\fP(\*n).
+.sp
+https://invisible-island.net/ncurses/tctest.html
diff --git a/man/curs_terminfo.3x b/man/curs_terminfo.3x
new file mode 100644
index 0000000..00ae134
--- /dev/null
+++ b/man/curs_terminfo.3x
@@ -0,0 +1,710 @@
+.\"***************************************************************************
+.\" Copyright 2018-2022,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2016,2017 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.82 2022/06/04 22:47:05 tom Exp $
+.TH curs_terminfo 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de bP
+.ie n  .IP \(bu 4
+.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
+.SH SYNOPSIS
+.nf
+\fB#include <curses.h>\fP
+\fB#include <term.h>\fP
+.sp
+\fBTERMINAL *cur_term;\fP
+.sp
+\fBconst char * const boolnames[];\fP
+\fBconst char * const boolcodes[];\fP
+\fBconst char * const boolfnames[];\fP
+\fBconst char * const numnames[];\fP
+\fBconst char * const numcodes[];\fP
+\fBconst char * const numfnames[];\fP
+\fBconst char * const strnames[];\fP
+\fBconst char * const strcodes[];\fP
+\fBconst char * const strfnames[];\fP
+.sp
+\fBint setupterm(const char *\fIterm\fB, int \fIfiledes\fB, int *\fIerrret\fB);\fR
+.br
+\fBTERMINAL *set_curterm(TERMINAL *\fInterm\fB);\fR
+.br
+\fBint del_curterm(TERMINAL *\fIoterm\fB);\fR
+.br
+\fBint restartterm(const char *\fIterm\fB, int \fIfiledes\fB, int *\fIerrret\fB);\fR
+.sp
+\fBchar *tparm(const char *\fIstr\fB, ...);\fR
+.br
+\fBint tputs(const char *\fIstr\fB, int \fIaffcnt\fB, int (*\fIputc\fB)(int));\fR
+.br
+\fBint putp(const char *\fIstr\fB);\fR
+.sp
+\fBint vidputs(chtype \fIattrs\fB, int (*\fIputc\fB)(int));\fR
+.br
+\fBint vidattr(chtype \fIattrs\fB);\fR
+.br
+\fBint vid_puts(attr_t \fIattrs\fB, short \fIpair\fB, void *\fIopts\fB, int (*\fIputc\fB)(int));\fR
+.br
+\fBint vid_attr(attr_t \fIattrs\fB, short \fIpair\fB, void *\fIopts\fB);\fR
+.sp
+\fBint mvcur(int \fIoldrow\fB, int \fIoldcol\fB, int \fInewrow\fR, int \fInewcol\fB);\fR
+.sp
+\fBint tigetflag(const char *\fIcapname\fB);\fR
+.br
+\fBint tigetnum(const char *\fIcapname\fB);\fR
+.br
+\fBchar *tigetstr(const char *\fIcapname\fB);\fR
+.sp
+\fBchar *tiparm(const char *\fIstr\fB, ...);\fR
+.br
+.fi
+.SH DESCRIPTION
+These low-level routines must be called by programs that have to deal
+directly with the \fBterminfo\fP database to handle certain terminal
+capabilities, such as programming function keys.
+For all other
+functionality, \fBcurses\fP routines are more suitable and their use is
+recommended.
+.PP
+None of these functions use (or are aware of) multibyte character strings
+such as UTF-8:
+.bP
+capability names use the POSIX portable character set
+.bP
+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
+low-level set of terminal-dependent variables
+[listed in \fBterminfo\fP(\*n)].
+.PP
+Applications can use the
+terminal capabilities either directly (via header definitions),
+or by special functions.
+The header files \fBcurses.h\fP and \fBterm.h\fP should be included (in this
+order) to get the definitions for these strings, numbers, and flags.
+.PP
+The \fBterminfo\fP variables
+\fBlines\fP and \fBcolumns\fP are initialized by \fBsetupterm\fP as
+follows:
+.bP
+If \fBuse_env(FALSE)\fP has been called, values for
+\fBlines\fP and \fBcolumns\fP specified in \fBterminfo\fP are used.
+.bP
+Otherwise, if the environment variables \fBLINES\fP and \fBCOLUMNS\fP
+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
+values for \fBlines\fP and \fBcolumns\fP specified in the
+\fBterminfo\fP database are used.
+.PP
+Parameterized strings should be passed through \fBtparm\fP to instantiate them.
+All \fBterminfo\fP strings
+(including the output of \fBtparm\fP)
+should be printed
+with \fBtputs\fP or \fBputp\fP.
+Call \fBreset_shell_mode\fP to restore the
+tty modes before exiting [see \fBcurs_kernel\fP(3X)].
+.PP
+Programs which use
+cursor addressing should
+.bP
+output \fBenter_ca_mode\fP upon startup and
+.bP
+output \fBexit_ca_mode\fP before exiting.
+.PP
+Programs which execute shell subprocesses should
+.bP
+call \fBreset_shell_mode\fP and
+output \fBexit_ca_mode\fP before the shell
+is called and
+.bP
+output \fBenter_ca_mode\fP and
+call \fBreset_prog_mode\fP after returning from the shell.
+.PP
+The \fBsetupterm\fP routine reads in the \fBterminfo\fP database,
+initializing the \fBterminfo\fP structures, but does not set up the
+output virtualization structures used by \fBcurses\fP.
+These are its parameters:
+.RS 3
+.TP 5
+\fIterm\fP
+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.
+.TP 5
+\fIerrret\fP
+points to an optional location where an error status can be returned to
+the caller.
+If \fIerrret\fP is not null,
+then \fBsetupterm\fP returns \fBOK\fP or
+\fBERR\fP and stores a status value in the integer pointed to by
+\fIerrret\fP.
+A return value of \fBOK\fP combined with status of \fB1\fP in \fIerrret\fP
+is normal.
+.IP
+If \fBERR\fP is returned, examine \fIerrret\fP:
+.RS
+.TP 5
+.B 1
+means that the terminal is hardcopy, cannot be used for curses applications.
+.IP
+\fBsetupterm\fP determines if the entry is a hardcopy type by
+checking the \fBhc\fP (\fBhardcopy\fP) capability.
+.TP 5
+.B 0
+means that the terminal could not be found,
+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.
+.TP 5
+.B \-1
+means that the \fBterminfo\fP database could not be found.
+.RE
+.IP
+If \fIerrret\fP is
+null, \fBsetupterm\fP prints an error message upon finding an error
+and exits.
+Thus, the simplest call is:
+.sp
+      \fBsetupterm((char *)0, 1, (int *)0);\fP,
+.sp
+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,
+or decides that the terminal is unsuitable (hardcopy or generic),
+it discards this information,
+making it not available to applications.
+.PP
+If \fBsetupterm\fP 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,
+\fBsetupterm\fP allocates new storage for each set of terminal capabilities.
+.PP
+The \fBset_curterm\fP routine sets \fBcur_term\fP to
+\fInterm\fP, and makes all of the \fBterminfo\fP boolean, numeric, and
+string variables use the values from \fInterm\fP.
+It returns the old value of \fBcur_term\fP.
+.PP
+The \fBdel_curterm\fP routine frees the space pointed to by
+\fIoterm\fP and makes it available for further use.
+If \fIoterm\fP is
+the same as \fBcur_term\fP, references to any of the \fBterminfo\fP
+boolean, numeric, and string variables thereafter may refer to invalid
+memory locations until another \fBsetupterm\fP has been called.
+.PP
+The \fBrestartterm\fP routine is similar to \fBsetupterm\fP and \fBinitscr\fP,
+except that it is called after restoring memory to a previous state (for
+example, when reloading a game saved as a core image dump).
+\fBrestartterm\fP 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, \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.
+Application developers should keep in mind these quirks of the interface:
+.bP
+Although \fBtparm\fP's actual parameters may be integers or strings,
+the prototype expects \fBlong\fP (integer) values.
+.bP
+Aside from the \fBset_attributes\fP (\fBsgr\fP) capability,
+most terminal capabilities require no more than one or two parameters.
+.bP
+Padding information is ignored by \fBtparm\fP;
+it is interpreted by \fBtputs\fP.
+.bP
+The capability string is null-terminated.
+Use \*(``\\200\*('' where an ASCII NUL is needed in the output.
+.PP
+\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.
+.\" ***************************************************************************
+.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)
+to the string
+\fIstr\fP and outputs it:
+.bP
+The \fIstr\fP parameter must be a terminfo string
+variable or the return value from
+\fBtparm\fP, \fBtiparm\fP, \fBtgetstr\fP, or \fBtgoto\fP.
+.IP
+The \fBtgetstr\fP and \fBtgoto\fP functions are part of the \fItermcap\fP
+interface,
+which happens to share this function name with the \fIterminfo\fP interface.
+.bP
+\fIaffcnt\fP is the number of lines affected, or 1 if
+not applicable.
+.bP
+\fIputc\fP is a \fBputchar\fP-like routine to which
+the characters are passed, one at a time.
+.PP
+The \fBputp\fR routine calls \fBtputs(\fIstr\fB, 1, putchar)\fR.
+The output of \fBputp\fP always goes to \fBstdout\fP, rather than
+the \fIfiledes\fP specified in \fBsetupterm\fP.
+.PP
+The \fBvidputs\fP routine displays the string on the terminal in the
+video attribute mode \fIattrs\fP, which is any combination of the
+attributes listed in \fBcurses\fP(3X).
+The characters are passed to
+the \fBputchar\fP-like routine \fIputc\fP.
+.PP
+The \fBvidattr\fP routine is like the \fBvidputs\fP routine, except
+that it outputs through \fBputchar\fP.
+.PP
+The \fBvid_attr\fP and \fBvid_puts\fP routines correspond
+to vidattr and vidputs, respectively.
+They use a set of arguments for representing the video attributes plus color,
+i.e.,
+.bP
+\fIattrs\fP of type \fBattr_t\fP for the attributes and
+.bP
+\fIpair\fP of type \fBshort\fP for the color-pair number.
+.PP
+The \fBvid_attr\fP and \fBvid_puts\fP routines
+are designed to use the attribute constants with the \fBWA_\fP prefix.
+.PP
+X/Open Curses reserves the \fIopts\fP argument for future use,
+saying that applications must provide a null pointer for that argument.
+As an extension,
+this implementation allows \fIopts\fP to be used as a pointer to \fBint\fP,
+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).
+.PP
+While \fBputp\fP and \fBmvcur\fP are low-level functions which
+do not use the high-level curses state,
+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.
+The \fIcapname\fP for each capability is given in the table column entitled
+\fIcapname\fP code in the capabilities section of \fBterminfo\fP(\*n).
+.PP
+These routines return special values to denote errors.
+.PP
+The \fBtigetflag\fP routine returns
+.TP
+\fB\-1\fP
+if \fIcapname\fP is not a boolean capability,
+or
+.TP
+\fB0\fP
+if it is canceled or absent from the terminal description.
+.PP
+The \fBtigetnum\fP routine returns
+.TP
+\fB\-2\fP
+if \fIcapname\fP is not a numeric capability, or
+.TP
+\fB\-1\fP
+if it is canceled or absent from the terminal description.
+.PP
+The \fBtigetstr\fP routine returns
+.TP
+\fB(char *)\-1\fP
+if \fIcapname\fP is not a string capability,
+or
+.TP
+\fB0\fP
+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\*(''),
+.bP
+the \fBtermcap\fP names (\*(``names\*(''), and
+.bP
+the long terminfo names (\*(``fnames\*('')
+.PP
+for each of the predefined \fBterminfo\fP variables:
+.sp
+.RS
+\fBconst char *boolnames[]\fP, \fB*boolcodes[]\fP, \fB*boolfnames[]\fP
+.br
+\fBconst char *numnames[]\fP, \fB*numcodes[]\fP, \fB*numfnames[]\fP
+.br
+\fBconst char *strnames[]\fP, \fB*strcodes[]\fP, \fB*strfnames[]\fP
+.RE
+.\" ***************************************************************************
+.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.
+If an application calls
+.sp
+	\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: 
+.bP
+the \*(``static\*('' terminfo variables [a-z].
+Before ncurses 6.3, those were shared by all screens.
+With ncurses 6.3, those are allocated per screen.
+See \fBterminfo\fP(\*n) for details.
+.bP
+to improve performance, ncurses 6.3 caches the result of analyzing terminfo
+strings for their parameter types.
+That is stored as a binary tree referenced from the \fBTERMINAL\fP structure.
+.PP
+The higher-level \fBinitscr\fP and \fBnewterm\fP functions use \fBsetupterm\fP.
+Normally they do not free this memory, but it is possible to do that using
+the \fBdelscreen\fP(3X) function.
+.\" ***************************************************************************
+.SH RETURN VALUE
+Routines that return an integer return \fBERR\fP upon failure and \fBOK\fP
+(SVr4 only specifies \*(``an integer value other than \fBERR\fP\*('')
+upon successful completion,
+unless otherwise noted in the preceding routine descriptions.
+.PP
+Routines that return pointers always return \fBNULL\fP on error.
+.PP
+X/Open defines no error conditions.
+In this implementation
+.RS 3
+.TP 5
+\fBdel_curterm\fP
+returns an error
+if its terminal parameter is null.
+.TP 5
+\fBputp\fP
+calls \fBtputs\fP, returning the same error-codes.
+.TP 5
+\fBrestartterm\fP
+returns an error
+if the associated call to \fBsetupterm\fP returns an error.
+.TP 5
+\fBsetupterm\fP
+returns an error
+if it cannot allocate enough memory, or
+create the initial windows (stdscr, curscr, newscr).
+Other error conditions are documented above.
+.TP 5
+\fBtputs\fP
+returns an error if the string parameter is null.
+It does not detect I/O errors:
+X/Open states that \fBtputs\fP ignores the return value
+of the output function \fIputc\fP.
+.RE
+.\" ***************************************************************************
+.SS Compatibility macros
+This implementation provides a few macros for compatibility with systems
+before SVr4 (see \fIHISTORY\fP).
+Those include
+\fBcrmode\fP,
+\fBfixterm\fP,
+\fBgettmode\fP,
+\fBnocrmode\fP,
+\fBresetterm\fP,
+\fBsaveterm\fP, and
+\fBsetterm\fP.
+.PP
+In SVr4, those are found in \fB<curses.h>\fP,
+but except for \fBsetterm\fP, are likewise macros.
+The one function, \fBsetterm\fP, is mentioned in the manual page.
+The manual page notes that the \fBsetterm\fP routine
+was replaced by \fBsetupterm\fP, stating that the call:
+.sp
+      \fBsetupterm(\fIterm\fB, 1, (int *)0)\fR
+.sp
+provides the same functionality as \fBsetterm(\fIterm\fB)\fR,
+and is not recommended for new programs.
+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:
+.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
+putp	T{
+utility function that uses \fBtputs\fP to send characters via \fBputchar\fP.
+T}
+resetterm	set tty modes to \*(``out of curses\*('' state
+resetty	reset tty flags to stored value
+saveterm	save current modes as \*(``in curses\*('' state
+savetty	store current tty flags
+setterm	establish terminal with given type
+setupterm	establish terminal with given type
+tparm	instantiate a string expression with parameters
+tputs	apply padding information to a string
+vidattr	like \fBvidputs\fP, but outputs through \fBputchar\fP
+vidputs	T{
+output a string to put terminal in a specified video attribute mode
+T}
+.TE
+.PP
+The programming manual also mentioned
+functions provided for termcap compatibility
+(commenting that they \*(``may go away at a later date\*(''):
+.TS
+l l
+_ _
+l l.
+\fBFunction\fP	\fBDescription\fP
+tgetent	look up termcap entry for given \fIname\fP
+tgetflag	get boolean entry for given \fIid\fP
+tgetnum	get numeric entry for given \fIid\fP
+tgetstr	get string entry for given \fIid\fP
+tgoto	apply parameters to given capability
+tputs	T{
+apply padding to capability, calling a function to put characters
+T}
+.TE
+.PP
+Early terminfo programs obtained capability values from the
+\fBTERMINAL\fP structure initialized by \fBsetupterm\fP.
+.PP
+SVr3 extended terminfo by adding functions to retrieve capability values
+(like the termcap interface),
+and reusing tgoto and tputs:
+.TS
+l l
+_ _
+l l.
+\fBFunction\fP	\fBDescription\fP
+tigetflag	get boolean entry for given \fIid\fP
+tigetnum	get numeric entry for given \fIid\fP
+tigetstr	get string entry for given \fIid\fP
+.TE
+.PP
+SVr3 also replaced several of the SVr2 terminfo functions
+which had no counterpart in the termcap interface,
+documenting them as obsolete:
+.TS
+l l
+_ _
+l l.
+\fBFunction\fP	\fBReplaced by\fP
+crmode	cbreak
+fixterm	reset_prog_mode
+gettmode	N/A
+nocrmode	nocbreak
+resetterm	reset_shell_mode
+saveterm	def_prog_mode
+setterm	setupterm
+.TE
+.PP
+SVr3 kept the \fBmvcur\fP, \fBvidattr\fP and \fBvidputs\fP functions,
+along with \fBputp\fP, \fBtparm\fP and \fBtputs\fP.
+The latter were needed to support padding,
+and handling functions such as \fBvidattr\fP
+(which used more than the two parameters supported by \fBtgoto\fP).
+.PP
+SVr3 introduced the functions for switching between terminal
+descriptions, e.g., \fBset_curterm\fP.
+Some of that was incremental improvements to the SVr2 library:
+.bP
+The \fBTERMINAL\fP type definition was introduced in SVr3.01,
+for the \fBterm\fP structure provided in SVr2.
+.bP
+The various global variables such as \fBboolnames\fP were mentioned
+in the programming manual at this point,
+though the variables were provided in SVr2.
+.PP
+SVr4 added the \fBvid_attr\fP and \fBvid_puts\fP functions.
+.PP
+There are other low-level functions declared in the curses header files
+on Unix systems,
+but none were documented.
+The functions marked \*(``obsolete\*('' remained in use
+by the Unix \fBvi\fP(1) editor.
+.SH PORTABILITY
+.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
+Other implementions may not declare the capability name arrays.
+Some provide them without declaring them.
+X/Open does not specify them.
+.PP
+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.
+In addition to the limitation that the terminal was left in block-buffered
+mode on exit (like System V curses),
+it was problematic because \fBncurses\fP
+did not allow a reliable way to cleanup on receiving SIGTSTP.
+.PP
+The current version (ncurses6)
+uses output buffers managed directly by \fBncurses\fP.
+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 \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.
+.bP
+X/Open Curses uses \fBconst\fP less effectively than a later design might,
+in some cases applying it needlessly to values are already constant,
+and in most cases overlooking parameters which normally would use \fBconst\fP.
+Using constant parameters for functions which do not use \fBconst\fP
+may prevent the program from compiling.
+On the other hand, \fIwritable strings\fP are an obsolescent feature.
+.IP
+As an extension, this implementation can be configured to change the
+function prototypes to use the \fBconst\fP keyword.
+The ncurses ABI 6 enables this feature by default.
+.bP
+X/Open Curses prototypes \fBtparm\fP with a fixed number of parameters,
+rather than a variable argument list.
+.IP
+This implementation uses a variable argument list, but can be
+configured to use the fixed-parameter list.
+Portable applications should provide 9 parameters after the format;
+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
+.PP
+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\*(''.
+.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.
+.PP
+In System V Release 4, the third argument of \fBtputs\fP has the type
+\fBint (*putc)(char)\fP.
+.PP
+At least one implementation of X/Open Curses (Solaris) returns a value
+other than \fBOK\fP/\fBERR\fP from \fBtputs\fP.
+That returns the length of the string, and does no error-checking.
+.PP
+X/Open notes that after calling \fBmvcur\fP, the curses state may not match the
+actual terminal state, and that an application should touch and refresh
+the window before resuming normal curses calls.
+Both \fBncurses\fP and System V Release 4 curses implement \fBmvcur\fP using
+the SCREEN data allocated in either \fBinitscr\fP or \fBnewterm\fP.
+So though it is documented as a terminfo function,
+\fBmvcur\fP is really a curses function which is not well specified.
+.PP
+X/Open states that the old location must be given for \fBmvcur\fP.
+This implementation allows the caller to use \-1's for the old ordinates.
+In that case, the old location is unknown.
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBcurs_initscr\fP(3X),
+\fBcurs_kernel\fP(3X),
+\fBcurs_memleaks\fP(3X),
+\fBcurs_termcap\fP(3X),
+\fBcurs_variables\fP(3X),
+\fBterm_variables\fP(3X),
+\fBputc\fP(3),
+\fBterminfo\fP(\*n)
diff --git a/man/curs_threads.3x b/man/curs_threads.3x
new file mode 100644
index 0000000..58ace20
--- /dev/null
+++ b/man/curs_threads.3x
@@ -0,0 +1,603 @@
+.\"***************************************************************************
+.\" Copyright 2021,2022 Thomas E. Dickey                                     *
+.\" Copyright 2008-2015,2017 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_threads.3x,v 1.31 2022/02/12 20:05:11 tom Exp $
+.TH curs_threads 3X ""
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.na
+.hy 0
+.SH NAME
+\fBcurs_threads\fP \- \fBcurses\fP thread support
+.ad
+.hy
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBtypedef int (*NCURSES_WINDOW_CB)(WINDOW *, void *);\fP
+.br
+\fBtypedef int (*NCURSES_SCREEN_CB)(SCREEN *, void *);\fP
+.sp
+\fBint get_escdelay(void);\fP
+.br
+\fBint set_escdelay(int \fIms\fB);\fR
+.br
+\fBint set_tabsize(int \fIcols\fB);\fR
+.sp
+\fBint use_screen(SCREEN *\fIscr\fB, NCURSES_SCREEN_CB \fIfunc\fB, void *\fIdata\fB);\fR
+.br
+\fBint use_window(WINDOW *\fIwin\fB, NCURSES_WINDOW_CB \fIfunc\fB, void *\fIdata\fB);\fR
+.br
+.SH DESCRIPTION
+This implementation can be configured to provide rudimentary support
+for multi-threaded applications.
+This makes a different set of libraries, e.g., \fBlibncursest\fP since
+the binary interfaces are different.
+.PP
+Rather than modify the interfaces to pass a thread specifier to
+each function, it adds a few functions which can be used in any
+configuration which hide the mutex's needed to prevent concurrent
+use of the global variables when configured for threading.
+.PP
+In addition to forcing access to members of the \fBWINDOW\fP structure
+to be via functions (see \fBcurs_opaque\fP(3X)),
+it makes functions of the common global variables,
+e.g.,
+COLORS,
+COLOR_PAIRS,
+COLS,
+ESCDELAY,
+LINES,
+TABSIZE
+curscr,
+newscr and
+ttytype.
+Those variables are maintained as read-only values, stored in the \fBSCREEN\fP
+structure.
+.PP
+Even this is not enough to make a thread-safe application using curses.
+A multi-threaded application would be expected to have threads updating
+separate windows (within the same device),
+or updating on separate screens (on different devices).
+Also, a few of the global variables are considered writable by some
+applications.
+The functions described here address these special situations.
+.PP
+The ESCDELAY and TABSIZE global variables are modified by some applications.
+To modify them in any configuration,
+use the \fBset_escdelay\fP or \fBset_tabsize\fP functions.
+Other global variables are not modifiable.
+.PP
+The \fBget_escdelay\fP function returns the value for ESCDELAY.
+.PP
+The \fBuse_window\fP and \fBuse_screen\fP functions provide coarse
+granularity mutexes for their respective \fBWINDOW\fP and \fBSCREEN\fP
+parameters, and call a user-supplied function,
+passing it a \fIdata\fP parameter,
+and returning the value from the user-supplied function to the application.
+.\" ***************************************************************************
+.SS USAGE
+All of the ncurses library functions assume that the locale is not
+altered during operation.
+In addition,
+they use data which is maintained within a hierarchy of scopes.
+.RS 3
+.bP
+global data, e.g., used in the low-level terminfo or termcap interfaces.
+.bP
+terminal data, e.g., associated with a call to \fBset_curterm\fP.
+The terminal data are initialized when screens are created.
+.bP
+screen data, e.g., associated with a call to \fBnewterm\fP or \fBinitscr\fP.
+.bP
+window data, e.g., associated with a call to \fBnewwin\fP or \fBsubwin\fP.
+Windows are associated with screens.
+Pads are not necessarily associated with a particular screen.
+.IP
+Most curses applications operate on one or more windows within a single screen.
+.bP
+reentrant, i.e., it uses only the data passed as parameters.
+.RE
+.PP
+This table lists the scope of data used for each symbol in the
+ncurses library when it is configured to support threading:
+.TS
+center tab(/);
+l l
+l l .
+Symbol/Scope
+=
+BC/global
+COLORS/screen (readonly)
+COLOR_PAIR/reentrant
+COLOR_PAIRS/screen (readonly)
+COLS/screen (readonly)
+ESCDELAY/screen (readonly, see \fBset_escdelay\fP)
+LINES/screen (readonly)
+PAIR_NUMBER/reentrant
+PC/global
+SP/global
+TABSIZE/screen (readonly)
+UP/global
+acs_map/screen (readonly)
+add_wch/window (stdscr)
+add_wchnstr/window (stdscr)
+add_wchstr/window (stdscr)
+addch/window (stdscr)
+addchnstr/window (stdscr)
+addchstr/window (stdscr)
+addnstr/window (stdscr)
+addnwstr/window (stdscr)
+addstr/window (stdscr)
+addwstr/window (stdscr)
+assume_default_colors/screen
+attr_get/window (stdscr)
+attr_off/window (stdscr)
+attr_on/window (stdscr)
+attr_set/window (stdscr)
+attroff/window (stdscr)
+attron/window (stdscr)
+attrset/window (stdscr)
+baudrate/screen
+beep/screen
+bkgd/window (stdscr)
+bkgdset/window (stdscr)
+bkgrnd/window (stdscr)
+bkgrndset/window (stdscr)
+boolcodes/global (readonly)
+boolfnames/global (readonly)
+boolnames/global (readonly)
+border/window (stdscr)
+border_set/window (stdscr)
+box/window (stdscr)
+box_set/window (stdscr)
+can_change_color/terminal
+cbreak/screen
+chgat/window (stdscr)
+clear/window (stdscr)
+clearok/window
+clrtobot/window (stdscr)
+clrtoeol/window (stdscr)
+color_content/screen
+color_set/window (stdscr)
+copywin/window locks(source, target)
+cur_term/terminal
+curs_set/screen
+curscr/screen (readonly)
+curses_version/global (readonly)
+def_prog_mode/terminal
+def_shell_mode/terminal
+define_key/screen
+del_curterm/screen
+delay_output/screen
+delch/window (stdscr)
+deleteln/window (stdscr)
+delscreen/global locks(screenlist, screen)
+delwin/global locks(windowlist)
+derwin/screen
+doupdate/screen
+dupwin/screen locks(window)
+echo/screen
+echo_wchar/window (stdscr)
+echochar/window (stdscr)
+endwin/screen
+erase/window (stdscr)
+erasechar/window (stdscr)
+erasewchar/window (stdscr)
+filter/global
+flash/terminal
+flushinp/screen
+get_wch/screen (input-operation)
+get_wstr/screen (input-operation)
+getattrs/window
+getbegx/window
+getbegy/window
+getbkgd/window
+getbkgrnd/window
+getcchar/reentrant
+getch/screen (input-operation)
+getcurx/window
+getcury/window
+getmaxx/window
+getmaxy/window
+getmouse/screen (input-operation)
+getn_wstr/screen (input-operation)
+getnstr/screen (input-operation)
+getparx/window
+getpary/window
+getstr/screen (input-operation)
+getwin/screen (input-operation)
+halfdelay/screen
+has_colors/terminal
+has_ic/terminal
+has_il/terminal
+has_key/screen
+hline/window (stdscr)
+hline_set/window (stdscr)
+idcok/window
+idlok/window
+immedok/window
+in_wch/window (stdscr)
+in_wchnstr/window (stdscr)
+in_wchstr/window (stdscr)
+inch/window (stdscr)
+inchnstr/window (stdscr)
+inchstr/window (stdscr)
+init_color/screen
+init_pair/screen
+initscr/global locks(screenlist)
+innstr/window (stdscr)
+innwstr/window (stdscr)
+ins_nwstr/window (stdscr)
+ins_wch/window (stdscr)
+ins_wstr/window (stdscr)
+insch/window (stdscr)
+insdelln/window (stdscr)
+insertln/window (stdscr)
+insnstr/window (stdscr)
+insstr/window (stdscr)
+instr/window (stdscr)
+intrflush/terminal
+inwstr/window (stdscr)
+is_cleared/window
+is_idcok/window
+is_idlok/window
+is_immedok/window
+is_keypad/window
+is_leaveok/window
+is_linetouched/window
+is_nodelay/window
+is_notimeout/window
+is_scrollok/window
+is_syncok/window
+is_term_resized/terminal
+is_wintouched/window
+isendwin/screen
+key_defined/screen
+key_name/global (static data)
+keybound/screen
+keyname/global (static data)
+keyok/screen
+keypad/window
+killchar/terminal
+killwchar/terminal
+leaveok/window
+longname/screen
+mcprint/terminal
+meta/screen
+mouse_trafo/window (stdscr)
+mouseinterval/screen
+mousemask/screen
+move/window (stdscr)
+mvadd_wch/window (stdscr)
+mvadd_wchnstr/window (stdscr)
+mvadd_wchstr/window (stdscr)
+mvaddch/window (stdscr)
+mvaddchnstr/window (stdscr)
+mvaddchstr/window (stdscr)
+mvaddnstr/window (stdscr)
+mvaddnwstr/window (stdscr)
+mvaddstr/window (stdscr)
+mvaddwstr/window (stdscr)
+mvchgat/window (stdscr)
+mvcur/screen
+mvdelch/window (stdscr)
+mvderwin/window (stdscr)
+mvget_wch/screen (input-operation)
+mvget_wstr/screen (input-operation)
+mvgetch/screen (input-operation)
+mvgetn_wstr/screen (input-operation)
+mvgetnstr/screen (input-operation)
+mvgetstr/screen (input-operation)
+mvhline/window (stdscr)
+mvhline_set/window (stdscr)
+mvin_wch/window (stdscr)
+mvin_wchnstr/window (stdscr)
+mvin_wchstr/window (stdscr)
+mvinch/window (stdscr)
+mvinchnstr/window (stdscr)
+mvinchstr/window (stdscr)
+mvinnstr/window (stdscr)
+mvinnwstr/window (stdscr)
+mvins_nwstr/window (stdscr)
+mvins_wch/window (stdscr)
+mvins_wstr/window (stdscr)
+mvinsch/window (stdscr)
+mvinsnstr/window (stdscr)
+mvinsstr/window (stdscr)
+mvinstr/window (stdscr)
+mvinwstr/window (stdscr)
+mvprintw/window (stdscr)
+mvscanw/screen
+mvvline/window (stdscr)
+mvvline_set/window (stdscr)
+mvwadd_wch/window
+mvwadd_wchnstr/window
+mvwadd_wchstr/window
+mvwaddch/window
+mvwaddchnstr/window
+mvwaddchstr/window
+mvwaddnstr/window
+mvwaddnwstr/window
+mvwaddstr/window
+mvwaddwstr/window
+mvwchgat/window
+mvwdelch/window
+mvwget_wch/screen (input-operation)
+mvwget_wstr/screen (input-operation)
+mvwgetch/screen (input-operation)
+mvwgetn_wstr/screen (input-operation)
+mvwgetnstr/screen (input-operation)
+mvwgetstr/screen (input-operation)
+mvwhline/window
+mvwhline_set/window
+mvwin/window
+mvwin_wch/window
+mvwin_wchnstr/window
+mvwin_wchstr/window
+mvwinch/window
+mvwinchnstr/window
+mvwinchstr/window
+mvwinnstr/window
+mvwinnwstr/window
+mvwins_nwstr/window
+mvwins_wch/window
+mvwins_wstr/window
+mvwinsch/window
+mvwinsnstr/window
+mvwinsstr/window
+mvwinstr/window
+mvwinwstr/window
+mvwprintw/window
+mvwscanw/screen
+mvwvline/window
+mvwvline_set/window
+napms/reentrant
+newpad/global locks(windowlist)
+newscr/screen (readonly)
+newterm/global locks(screenlist)
+newwin/global locks(windowlist)
+nl/screen
+nocbreak/screen
+nodelay/window
+noecho/screen
+nofilter/global
+nonl/screen
+noqiflush/terminal
+noraw/screen
+notimeout/window
+numcodes/global (readonly)
+numfnames/global (readonly)
+numnames/global (readonly)
+ospeed/global
+overlay/window locks(source, target)
+overwrite/window locks(source, target)
+pair_content/screen
+pecho_wchar/screen
+pechochar/screen
+pnoutrefresh/screen
+prefresh/screen
+printw/window
+putp/global
+putwin/window
+qiflush/terminal
+raw/screen
+redrawwin/window
+refresh/screen
+reset_prog_mode/screen
+reset_shell_mode/screen
+resetty/terminal
+resize_term/screen locks(windowlist)
+resizeterm/screen
+restartterm/screen
+ripoffline/global (static data)
+savetty/terminal
+scanw/screen
+scr_dump/screen
+scr_init/screen
+scr_restore/screen
+scr_set/screen
+scrl/window (stdscr)
+scroll/window
+scrollok/window
+set_curterm/screen
+set_escdelay/screen
+set_tabsize/screen
+set_term/global locks(screenlist, screen)
+setcchar/reentrant
+setscrreg/window (stdscr)
+setupterm/global
+slk_attr/screen
+slk_attr_off/screen
+slk_attr_on/screen
+slk_attr_set/screen
+slk_attroff/screen
+slk_attron/screen
+slk_attrset/screen
+slk_clear/screen
+slk_color/screen
+slk_init/screen
+slk_label/screen
+slk_noutrefresh/screen
+slk_refresh/screen
+slk_restore/screen
+slk_set/screen
+slk_touch/screen
+slk_wset/screen
+standend/window
+standout/window
+start_color/screen
+stdscr/screen (readonly)
+strcodes/global (readonly)
+strfnames/global (readonly)
+strnames/global (readonly)
+subpad/window
+subwin/window
+syncok/window
+term_attrs/screen
+termattrs/screen
+termname/terminal
+tgetent/global
+tgetflag/global
+tgetnum/global
+tgetstr/global
+tgoto/global
+tigetflag/terminal
+tigetnum/terminal
+tigetstr/terminal
+timeout/window (stdscr)
+touchline/window
+touchwin/window
+tparm/global (static data)
+tputs/screen
+trace/global (static data)
+ttytype/screen (readonly)
+typeahead/screen
+unctrl/screen
+unget_wch/screen (input-operation)
+ungetch/screen (input-operation)
+ungetmouse/screen (input-operation)
+untouchwin/window
+use_default_colors/screen
+use_env/global (static data)
+use_extended_names/global (static data)
+use_legacy_coding/screen
+use_screen/global locks(screenlist, screen)
+use_window/global locks(windowlist, window)
+vid_attr/screen
+vid_puts/screen
+vidattr/screen
+vidputs/screen
+vline/window (stdscr)
+vline_set/window (stdscr)
+vw_printw/window
+vw_scanw/screen
+vwprintw/window
+vwscanw/screen
+wadd_wch/window
+wadd_wchnstr/window
+wadd_wchstr/window
+waddch/window
+waddchnstr/window
+waddchstr/window
+waddnstr/window
+waddnwstr/window
+waddstr/window
+waddwstr/window
+wattr_get/window
+wattr_off/window
+wattr_on/window
+wattr_set/window
+wattroff/window
+wattron/window
+wattrset/window
+wbkgd/window
+wbkgdset/window
+wbkgrnd/window
+wbkgrndset/window
+wborder/window
+wborder_set/window
+wchgat/window
+wclear/window
+wclrtobot/window
+wclrtoeol/window
+wcolor_set/window
+wcursyncup/screen (affects window plus parents)
+wdelch/window
+wdeleteln/window
+wecho_wchar/window
+wechochar/window
+wenclose/window
+werase/window
+wget_wch/screen (input-operation)
+wget_wstr/screen (input-operation)
+wgetbkgrnd/window
+wgetch/screen (input-operation)
+wgetdelay/window
+wgetn_wstr/screen (input-operation)
+wgetnstr/screen (input-operation)
+wgetparent/window
+wgetscrreg/window
+wgetstr/screen (input-operation)
+whline/window
+whline_set/window
+win_wch/window
+win_wchnstr/window
+win_wchstr/window
+winch/window
+winchnstr/window
+winchstr/window
+winnstr/window
+winnwstr/window
+wins_nwstr/window
+wins_wch/window
+wins_wstr/window
+winsch/window
+winsdelln/window
+winsertln/window
+winsnstr/window
+winsstr/window
+winstr/window
+winwstr/window
+wmouse_trafo/window
+wmove/window
+wnoutrefresh/screen
+wprintw/window
+wredrawln/window
+wrefresh/screen
+wresize/window locks(windowlist)
+wscanw/screen
+wscrl/window
+wsetscrreg/window
+wstandend/window
+wstandout/window
+wsyncdown/screen (affects window plus parents)
+wsyncup/screen (affects window plus parents)
+wtimeout/window
+wtouchln/window
+wunctrl/global (static data)
+wvline/window
+wvline_set/window
+.TE
+.\" ***************************************************************************
+.SH RETURN VALUE
+These functions all return \fBTRUE\fP or \fBFALSE\fP, except as noted.
+.SH NOTES
+Both a macro and a function are provided for each name.
+.SH PORTABILITY
+These routines are specific to ncurses.
+They were not supported on Version 7, BSD or System V implementations.
+It is recommended that any code depending on ncurses extensions
+be conditioned using NCURSES_VERSION.
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBcurs_opaque\fP(3X),
+\fBcurs_variables\fP(3X).
diff --git a/man/curs_touch.3x b/man/curs_touch.3x
new file mode 100644
index 0000000..7b979b2
--- /dev/null
+++ b/man/curs_touch.3x
@@ -0,0 +1,129 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2015,2017 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_touch.3x,v 1.26 2022/02/12 20:05:11 tom Exp $
+.TH curs_touch 3X ""
+.na
+.hy 0
+.SH NAME
+\fBtouchwin\fP,
+\fBtouchline\fP,
+\fBuntouchwin\fP,
+\fBwtouchln\fP,
+\fBis_linetouched\fP,
+\fBis_wintouched\fP \- \fBcurses\fP refresh control routines
+.ad
+.hy
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBint touchline(WINDOW *\fIwin\fB, int \fIstart\fB, int \fIcount\fB);\fR
+.sp
+\fBint touchwin(WINDOW *\fIwin\fB);\fR
+.br
+\fBint wtouchln(WINDOW *\fIwin\fB, int \fIy\fB, int \fIn\fB, int \fIchanged\fB);\fR
+.sp
+\fBint untouchwin(WINDOW *\fIwin\fB);\fR
+.sp
+\fBbool is_linetouched(WINDOW *\fIwin\fB, int \fIline\fB);\fR
+.br
+\fBbool is_wintouched(WINDOW *\fIwin\fB);\fR
+.br
+.SH DESCRIPTION
+The \fBtouchwin\fP and \fBtouchline\fP routines throw away all
+optimization information about which parts of the window have been
+touched, by pretending that the entire window has been drawn on.
+This
+is sometimes necessary when using overlapping windows, since a change
+to one window affects the other window, but the records of which lines
+have been changed in the other window do not reflect the change.
+The
+routine \fBtouchline\fP only pretends that \fIcount\fP lines have been
+changed, beginning with line \fIstart\fP.
+.PP
+The \fBuntouchwin\fP routine marks all lines in the window as unchanged since
+the last call to \fBwrefresh\fP.
+.PP
+The \fBwtouchln\fP routine makes \fIn\fP lines in the window, starting
+at line \fIy\fR, look as if they have (\fIchanged\fB=1\fR) or have
+not (\fIchanged\fB=0\fR) been changed since the last call to
+\fBwrefresh\fP.
+.PP
+The \fBis_linetouched\fP and \fBis_wintouched\fP routines return
+\fBTRUE\fP if the specified line/window was modified since the last
+call to \fBwrefresh\fP; otherwise they return \fBFALSE\fP.  In
+addition, \fBis_linetouched\fP returns \fBERR\fP if \fIline\fP is not
+valid for the given window.
+.SH RETURN VALUE
+All routines return the integer \fBERR\fP upon failure and an integer value
+other than \fBERR\fP upon successful completion, unless otherwise noted in the
+preceding routine descriptions.
+.PP
+X/Open does not define any error conditions.
+In this implementation
+.RS 3
+.TP 5
+\fBis_linetouched\fP
+returns an error
+if the window pointer is null, or
+if the line number is outside the window.
+.IP
+The constant \fBERR\fP is distinct from \fBTRUE\fP and \fBFALSE\fP,
+which are the normal return values of this function.
+Because the function returns a \fBbool\fP,
+returning \fBERR\fP (which is neither \fBTRUE\fP nor \fBFALSE\fP)
+may not be supported by the compiler.
+.IP
+To provide error-checking and also match the X/Open function prototype,
+the \fBERR\fP is provided by a macro named \fBis_linetouched\fP.
+The actual function returns \fBFALSE\fP when it detects an error.
+.TP 5
+\fBwtouchln\fP
+returns an error
+if the window pointer is null, or
+if the line number is outside the window.
+.RE
+.SH PORTABILITY
+.PP
+These functions were introduced by SVr4.
+The Solaris curses header file,
+for instance, defines both an actual function and macro for each.
+The macros give the same result as the actual functions.
+SVr4 curses does not check the window parameter \fIwin\fP to ensure
+that it is not \fBNULL\fP;
+otherwise this implementation behaves the same as SVr4.
+.PP
+The XSI Curses standard, Issue 4 describes these functions,
+but defines no error conditions.
+.SH NOTES
+All of these routines except \fBwtouchln\fP may be macros.
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBcurs_refresh\fP(3X),
+\fBcurs_variables\fP(3X).
diff --git a/man/curs_trace.3x b/man/curs_trace.3x
new file mode 100644
index 0000000..02e6739
--- /dev/null
+++ b/man/curs_trace.3x
@@ -0,0 +1,290 @@
+.\"***************************************************************************
+.\" Copyright 2019-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 2000-2016,2017 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_trace.3x,v 1.25 2022/02/12 20:06:41 tom Exp $
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.TH curs_trace 3X ""
+.na
+.hy 0
+.SH NAME
+\fBcurses_trace\fP,
+\fBtrace\fP,
+\fB_tracef\fP,
+\fB_traceattr\fP,
+\fB_traceattr2\fP,
+\fB_tracecchar_t\fP,
+\fB_tracecchar_t2\fP,
+\fB_tracechar\fP,
+\fB_tracechtype\fP,
+\fB_tracechtype2\fP,
+\fB_nc_tracebits\fP,
+\fB_tracedump\fP,
+\fB_tracemouse\fP \- \fBcurses\fP debugging routines
+.ad
+.hy
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBunsigned curses_trace(const unsigned \fIparam\fB);\fR
+.sp
+\fBvoid _tracef(const char *\fIformat\fB, ...);\fR
+.sp
+\fBchar *_traceattr(attr_t \fIattr\fB);\fR
+.br
+\fBchar *_traceattr2(int \fIbuffer\fB, chtype \fIch\fB);\fR
+.br
+\fBchar *_tracecchar_t(const cchar_t *\fIstring\fB);\fR
+.br
+\fBchar *_tracecchar_t2(int \fIbuffer\fB, const cchar_t *\fIstring\fB);\fR
+.br
+\fBchar *_tracechar(int \fIch\fB);\fR
+.br
+\fBchar *_tracechtype(chtype \fIch\fB);\fR
+.br
+\fBchar *_tracechtype2(int \fIbuffer\fB, chtype \fIch\fB);\fR
+.sp
+\fBvoid _tracedump(const char *\fIlabel\fB, WINDOW *\fIwin\fB);\fR
+.br
+\fBchar *_nc_tracebits(void);\fP
+.br
+\fBchar *_tracemouse(const MEVENT *\fIevent\fB);\fR
+.sp
+/* deprecated */
+.br
+\fBvoid trace(const unsigned int \fIparam\fB);\fR
+.SH DESCRIPTION
+The \fIcurses trace\fP routines are used for debugging the ncurses libraries,
+as well as applications which use the ncurses libraries.
+Some limitations apply:
+.bP
+Aside from \fBcurses_trace\fP,
+the other functions are normally available only with the debugging library
+e.g., \fBlibncurses_g.a\fP.
+.IP
+All of the trace functions may be compiled into any model (shared, static,
+profile) by defining the symbol \fBTRACE\fP.
+.bP
+Additionally, the functions which use \fBcchar_t\fP
+are only available with the wide-character configuration of the libraries.
+.SS Functions
+The principal parts of this interface are
+.bP
+\fBcurses_trace\fP, which selectively enables different tracing features, and
+.bP
+\fB_tracef\fP, which writes formatted data to the \fItrace\fP file.
+.IP
+The other functions either return a pointer to a string-area
+(allocated by the corresponding function), or return no value
+(such as \fB_tracedump\fP,
+which implements the screen dump for \fBTRACE_UPDATE\fP).
+The caller should not free these strings,
+since the allocation is reused on successive calls.
+To work around the problem of a single string-area per function,
+some use a buffer-number parameter, telling the library to allocate
+additional string-areas.
+.PP
+The \fBcurses_trace\fP function is always available,
+whether or not the other trace functions are available:
+.bP
+If tracing is available,
+calling \fBcurses_trace\fP with a nonzero parameter
+updates the trace mask,
+and returns the previous trace mask.
+.IP
+When the trace mask is nonzero,
+ncurses creates the file \*(``trace\*('' in the current directory for output.
+If the file already exists, no tracing is done.
+.bP
+If tracing is not available, \fBcurses_trace\fP returns zero (0).
+.SS Trace Parameter
+The trace parameter is formed by OR'ing
+values from the list of \fBTRACE_\fIxxx\fR definitions in \fB<curses.h>\fR.
+These include:
+.TP 5
+.B TRACE_DISABLE
+turn off tracing by passing a zero parameter.
+.IP
+The library flushes the output file,
+but retains an open file-descriptor to the trace file
+so that it can resume tracing later if a nonzero parameter is passed
+to the \fBcurses_trace\fP function.
+.TP 5
+.B TRACE_TIMES
+trace user and system times of updates.
+.TP 5
+.B TRACE_TPUTS
+trace \fBtputs\fP(3X) calls.
+.TP 5
+.B TRACE_UPDATE
+trace update actions, old & new screens.
+.TP 5
+.B TRACE_MOVE
+trace cursor movement and scrolling.
+.TP 5
+.B TRACE_CHARPUT
+trace all character outputs.
+.TP 5
+.B TRACE_ORDINARY
+trace all update actions.
+The old and new screen contents are written to the trace file
+for each refresh.
+.TP 5
+.B TRACE_CALLS
+trace all curses calls.
+The parameters for each call are traced, as well as return values.
+.TP 5
+.B TRACE_VIRTPUT
+trace virtual character puts, i.e., calls to \fBaddch\fP.
+.TP 5
+.B TRACE_IEVENT
+trace low-level input processing, including timeouts.
+.TP 5
+.B TRACE_BITS
+trace state of TTY control bits.
+.TP 5
+.B TRACE_ICALLS
+trace internal/nested calls.
+.TP 5
+.B TRACE_CCALLS
+trace per-character calls.
+.TP 5
+.B TRACE_DATABASE
+trace read/write of terminfo/termcap data.
+.TP 5
+.B TRACE_ATTRS
+trace changes to video attributes and colors.
+.TP 5
+.B TRACE_MAXIMUM
+maximum trace level, enables all of the separate trace features.
+.PP
+Some tracing features are enabled whenever the \fBcurses_trace\fP parameter
+is nonzero.
+Some features overlap.
+The specific names are used as a guideline.
+.SS Initialization
+These functions check the \fBNCURSES_TRACE\fP environment variable,
+to set the tracing feature as if \fBcurses_trace\fP was called:
+.RS 4
+.PP
+.na
+.hy 0
+filter,
+initscr,
+new_prescr,
+newterm,
+nofilter,
+restartterm,
+ripoffline,
+setupterm,
+slk_init,
+tgetent,
+use_env,
+use_extended_names,
+use_tioctl
+.hy
+.ad
+.RE
+.SS Command-line Utilities
+.PP
+The command-line utilities such as \fBtic\fP(1) provide a verbose option
+which extends the set of messages written using the \fBcurses_trace\fP function.
+Both of these (\fB\-v\fP and \fBcurses_trace\fP)
+use the same variable (\fB_nc_tracing\fP),
+which determines the messages which are written.
+.PP
+Because the command-line utilities may call initialization functions
+such as \fBsetupterm\fP, \fBtgetent\fP or \fBuse_extended_names\fP,
+some of their debugging output may be directed to the \fItrace\fP file
+if the \fBNCURSES_TRACE\fP environment variable is set:
+.bP
+messages produced in the utility are written to the standard error.
+.bP
+messages produced by the underlying library are written to \fItrace\fP.
+.PP
+If ncurses is built without tracing, none of the latter are produced,
+and fewer diagnostics are provided by the command-line utilities.
+.SH RETURN VALUE
+Routines which return a value are designed to be used as parameters
+to the \fB_tracef\fP routine.
+.SH PORTABILITY
+These functions are not part of the XSI interface.
+Some other curses implementations are known to
+have similar features,
+but they are not compatible with ncurses:
+.bP
+SVr4 provided \fBtraceon\fP and \fBtraceoff\fP,
+to control whether debugging information was written
+to the \*(``trace\*('' file.
+While the functions were always available,
+this feature was only enabled
+if \fBDEBUG\fP was defined when building the library.
+.IP
+The SVr4 tracing feature is undocumented.
+.bP
+PDCurses provides \fBtraceon\fP and \fBtraceoff\fP,
+which (like SVr4) are always available,
+and enable tracing
+to the \*(``trace\*('' file
+only when a debug-library is built.
+.IP
+PDCurses has a short description of these functions,
+with a note that they are not present in X/Open Curses,
+ncurses or NetBSD.
+It does not mention SVr4,
+but the functions' inclusion in a header file section
+labeled \*(``Quasi-standard\*('' hints at the origin.
+.bP
+NetBSD does not provide functions for enabling/disabling traces.
+It uses environment variables
+\fBCURSES_TRACE_MASK\fP and
+\fBCURSES_TRACE_FILE\fP to determine what is traced,
+and where the results are written.
+This is available only when a debug-library is built.
+.IP
+The NetBSD tracing feature is undocumented.
+.PP
+A few ncurses functions are not provided when symbol versioning is used:
+.RS 4
+.PP
+_nc_tracebits,
+_tracedump,
+_tracemouse
+.RE
+.PP
+The original \fBtrace\fP routine was deprecated because
+it often conflicted with application names.
+.SH SEE ALSO
+\fBcurses\fP(3X).
diff --git a/man/curs_util.3x b/man/curs_util.3x
new file mode 100644
index 0000000..32b058f
--- /dev/null
+++ b/man/curs_util.3x
@@ -0,0 +1,407 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2015,2017 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_util.3x,v 1.65 2022/02/12 20:06:41 tom Exp $
+.TH curs_util 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.na
+.hy 0
+.SH NAME
+\fBdelay_output\fP,
+\fBfilter\fP,
+\fBflushinp\fP,
+\fBgetwin\fP,
+\fBkey_name\fP,
+\fBkeyname\fP,
+\fBnofilter\fP,
+\fBputwin\fP,
+\fBunctrl\fP,
+\fBuse_env\fP,
+\fBuse_tioctl\fP,
+\fBwunctrl\fP \- miscellaneous \fBcurses\fP utility routines
+.ad
+.hy
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBconst char *unctrl(chtype \fIc\fB);\fR
+.br
+\fBwchar_t *wunctrl(cchar_t *\fIc\fB);\fR
+.sp
+\fBconst char *keyname(int \fIc\fB);\fR
+.br
+\fBconst char *key_name(wchar_t \fIw\fB);\fR
+.sp
+\fBvoid filter(void);\fP
+.br
+\fBvoid nofilter(void);\fP
+.sp
+\fBvoid use_env(bool \fIf\fB);\fR
+.br
+\fBvoid use_tioctl(bool \fIf\fB);\fR
+.sp
+\fBint putwin(WINDOW *\fIwin\fB, FILE *\fIfilep\fB);\fR
+.br
+\fBWINDOW *getwin(FILE *\fIfilep\fB);\fR
+.sp
+\fBint delay_output(int \fIms\fB);\fR
+.br
+\fBint flushinp(void);\fP
+.br
+.SH DESCRIPTION
+.SS unctrl
+.PP
+The \fBunctrl\fP routine returns a character string which is a printable
+representation of the character \fIc\fP, ignoring attributes.
+Control characters are displayed in the \fB^\fIX\fR notation.
+Printing characters are displayed as is.
+The corresponding \fBwunctrl\fP returns a printable representation of
+a wide character.
+.SS keyname/key_name
+.PP
+The \fBkeyname\fP routine returns a character string
+corresponding to the key \fIc\fP:
+.bP
+Printable characters are displayed as themselves,
+e.g., a one-character string containing the key.
+.bP
+Control characters are displayed in the \fB^\fIX\fR notation.
+.bP
+DEL (character 127) is displayed as \fB^?\fP.
+.bP
+Values above 128 are either meta characters
+(if the screen has not been initialized,
+or if \fBmeta\fP(3X) has been called with a \fBTRUE\fP parameter),
+shown in the \fBM\-\fIX\fR notation,
+or are displayed as themselves.
+In the latter case, the values may not be printable;
+this follows the X/Open specification.
+.bP
+Values above 256 may be the names of the names of function keys.
+.bP
+Otherwise (if there is no corresponding name) the function returns null,
+to denote an error.
+X/Open also lists an \*(``UNKNOWN KEY\*('' return value,
+which some implementations return rather than null.
+.LP
+The corresponding \fBkey_name\fP returns a character string corresponding
+to the wide-character value \fIw\fP.
+The two functions do not return the same set of strings;
+the latter returns null where the former would display a meta character.
+.SS filter/nofilter
+.PP
+The \fBfilter\fP routine, if used, must be called before \fBinitscr\fP or
+\fBnewterm\fP are called.
+Calling \fBfilter\fP causes these changes in initialization:
+.bP
+\fBLINES\fP is set to 1;
+.bP
+the capabilities
+\fBclear\fP,
+\fBcud1\fP,
+\fBcud\fP,
+\fBcup\fP,
+\fBcuu1\fP,
+\fBcuu\fP,
+\fBvpa\fP
+are disabled;
+.bP
+the capability \fBed\fP is disabled if \fBbce\fP is set;
+.bP
+and the \fBhome\fP string is set to the value of \fBcr\fP.
+.PP
+The \fBnofilter\fP routine cancels the effect of a preceding \fBfilter\fP
+call.
+That allows the caller to initialize a screen on a different device,
+using a different value of \fB$TERM\fP.
+The limitation arises because the \fBfilter\fP routine modifies the
+in-memory copy of the terminal information.
+.SS use_env
+.PP
+The \fBuse_env\fP routine, if used,
+should be called before \fBinitscr\fP or
+\fBnewterm\fP are called
+(because those compute the screen size).
+It modifies the way \fBncurses\fP treats environment variables
+when determining the screen size.
+.bP
+Normally \fBncurses\fP looks first at the terminal database for the screen size.
+.IP
+If \fBuse_env\fP was called with \fBFALSE\fP for parameter,
+it stops here unless
+\fBuse_tioctl\fP was also called with \fBTRUE\fP for parameter.
+.bP
+Then it asks for the screen size via operating system calls.
+If successful,
+it overrides the values from the terminal database.
+.bP
+Finally (unless \fBuse_env\fP was called with \fBFALSE\fP parameter),
+\fBncurses\fP examines the \fBLINES\fP or \fBCOLUMNS\fP environment variables,
+using a value in those to override the results
+from the operating system or terminal database.
+.IP
+\fBNcurses\fP also updates the screen size in response to \fBSIGWINCH\fP,
+unless overridden by the \fBLINES\fP or \fBCOLUMNS\fP environment variables,
+.SS use_tioctl
+.PP
+The \fBuse_tioctl\fP routine, if used,
+should be called before \fBinitscr\fP or \fBnewterm\fP are called
+(because those compute the screen size).
+After \fBuse_tioctl\fP is called with \fBTRUE\fP as an argument,
+\fBncurses\fP modifies the last step in its computation
+of screen size as follows:
+.bP
+checks if the \fBLINES\fP and \fBCOLUMNS\fP environment variables
+are set to a number greater than zero.
+.bP
+for each, \fBncurses\fP updates the corresponding environment variable
+with the value that it has obtained via operating system call
+or from the terminal database.
+.bP
+\fBncurses\fP re-fetches the value of the environment variables so that
+it is still the environment variables which set the screen size.
+.PP
+The \fBuse_env\fP and \fBuse_tioctl\fP routines combine as
+summarized here:
+.TS
+center tab(/);
+l l l
+_ _ _
+lw7 lw7 lw40.
+\fBuse_env\fP/\fBuse_tioctl\fP/\fBSummary\fP
+TRUE/FALSE/T{
+This is the default behavior.
+\fBncurses\fP uses operating system calls
+unless overridden by $LINES or $COLUMNS environment variables.
+T}
+TRUE/TRUE/T{
+\fBncurses\fP updates $LINES and $COLUMNS based on operating system calls.
+T}
+FALSE/TRUE/T{
+\fBncurses\fP ignores $LINES and $COLUMNS,
+uses operating system calls to obtain size.
+T}
+FALSE/FALSE/T{
+\fBncurses\fP relies on the terminal database to determine size.
+T}
+.TE
+.SS putwin/getwin
+.PP
+The \fBputwin\fP routine writes all data associated
+with window (or pad) \fIwin\fP into
+the file to which \fIfilep\fP points.
+This information can be later retrieved
+using the \fBgetwin\fP function.
+.PP
+The \fBgetwin\fP routine reads window related data stored in the file by
+\fBputwin\fP.
+The routine then creates and initializes a new window using that
+data.
+It returns a pointer to the new window.
+There are a few caveats:
+.bP
+the data written is a copy of the \fBWINDOW\fP structure,
+and its associated character cells.
+The format differs between the wide-character (\fBncursesw\fP) and
+non-wide (\fBncurses\fP) libraries.
+You can transfer data between the two, however.
+.bP
+the retrieved window is always created as a top-level window (or pad),
+rather than a subwindow.
+.bP
+the window's character cells contain the color pair \fIvalue\fP,
+but not the actual color \fInumbers\fP.
+If cells in the retrieved window use color pairs which have not been
+created in the application using \fBinit_pair\fP,
+they will not be colored when the window is refreshed.
+.SS delay_output
+.PP
+The \fBdelay_output\fP routine inserts an \fIms\fP millisecond pause
+in output.
+This routine should not be used extensively because
+padding characters are used rather than a CPU pause.
+If no padding character is specified,
+this uses \fBnapms\fP to perform the delay.
+.SS flushinp
+.PP
+The \fBflushinp\fP routine throws away any typeahead that has been typed by the
+user and has not yet been read by the program.
+.SH RETURN VALUE
+Except for \fBflushinp\fP, routines that return an integer return \fBERR\fP
+upon failure and \fBOK\fP (SVr4 specifies only "an integer value other than
+\fBERR\fP") upon successful completion.
+.PP
+Routines that return pointers return \fBNULL\fP on error.
+.PP
+X/Open does not define any error conditions.
+In this implementation
+.RS 3
+.TP 5
+\fBflushinp\fP
+returns an error if the terminal was not initialized.
+.TP 5
+\fBputwin\fP
+returns an error if the associated \fBfwrite\fP calls return an error.
+.RE
+.SH PORTABILITY
+.SS filter
+.PP
+The SVr4 documentation describes the action of \fBfilter\fP only in the vaguest
+terms.
+The description here is adapted from the XSI Curses standard (which
+erroneously fails to describe the disabling of \fBcuu\fP).
+.SS keyname
+.PP
+The \fBkeyname\fP function may return the names of user-defined
+string capabilities which are defined in the terminfo entry via the \fB\-x\fP
+option of \fB@TIC@\fP.
+This implementation automatically assigns at run-time keycodes to
+user-defined strings which begin with \*(``k\*(''.
+The keycodes start at KEY_MAX, but are not guaranteed to be
+the same value for different runs because user-defined codes are
+merged from all terminal descriptions which have been loaded.
+The \fBuse_extended_names\fP(3X) function controls whether this data is
+loaded when the terminal description is read by the library.
+.SS nofilter/use_tioctl
+.PP
+The \fBnofilter\fP and \fBuse_tioctl\fP routines are specific to \fBncurses\fP.
+They were not supported on Version 7, BSD or System V implementations.
+It is recommended that any code depending on \fBncurses\fP extensions
+be conditioned using NCURSES_VERSION.
+.SS putwin/getwin file-format
+.PP
+The \fBputwin\fP and \fBgetwin\fP functions have several issues with
+portability:
+.bP
+The files written and read by these functions
+use an implementation-specific format.
+Although the format is an obvious target for standardization,
+it has been overlooked.
+.IP
+Interestingly enough, according to the copyright dates in Solaris source,
+the functions (along with \fBscr_init\fP, etc.) originated with
+the University of California, Berkeley (in 1982)
+and were later (in 1988) incorporated into SVr4.
+Oddly, there are no such functions in the 4.3BSD curses sources.
+.bP
+Most implementations simply dump the binary \fBWINDOW\fP structure to the file.
+These include SVr4 curses, NetBSD and PDCurses,
+as well as older \fBncurses\fP versions.
+This implementation
+(as well as the X/Open variant of Solaris curses, dated 1995)
+uses textual dumps.
+.IP
+The implementations which use binary dumps use block-I/O
+(the \fBfwrite\fP and \fBfread\fP functions).
+Those that use textual dumps use buffered-I/O.
+A few applications may happen to write extra data in the file using
+these functions.
+Doing that can run into problems mixing block- and buffered-I/O.
+This implementation reduces the problem on writes by flushing the output.
+However, reading from a file written using mixed schemes may not be successful.
+.SS unctrl/wunctrl
+.PP
+The XSI Curses standard, Issue 4 describes these functions.
+It states that \fBunctrl\fP and \fBwunctrl\fP will return a null pointer if
+unsuccessful, but does not define any error conditions.
+This implementation checks for three cases:
+.bP
+the parameter is a 7-bit US\-ASCII code.
+This is the case that X/Open Curses documented.
+.bP
+the parameter is in the range 128\-159, i.e., a C1 control code.
+If \fBuse_legacy_coding\fP(3X) has been called with a \fB2\fP parameter,
+\fBunctrl\fP returns the parameter, i.e., a one-character string with
+the parameter as the first character.
+Otherwise, it returns \*(``~@\*('', \*(``~A\*('', etc.,
+analogous to \*(``^@\*('', \*(``^A\*('', C0 controls.
+.IP
+X/Open Curses does not document whether \fBunctrl\fP can be called before
+initializing curses.
+This implementation permits that,
+and returns the \*(``~@\*('', etc., values in that case.
+.bP
+parameter values outside the 0 to 255 range.
+\fBunctrl\fP returns a null pointer.
+.PP
+The strings returned by \fBunctrl\fP in this implementation are determined
+at compile time,
+showing C1 controls from the upper-128 codes
+with a \*(``~\*('' prefix rather than \*(``^\*(''.
+Other implementations have different conventions.
+For example, they may show both sets of control characters with \*(``^\*('',
+and strip the parameter to 7 bits.
+Or they may ignore C1 controls and treat all of the upper-128 codes as
+printable.
+This implementation uses 8 bits but does not modify the string to reflect
+locale.
+The \fBuse_legacy_coding\fP(3X) function allows the caller to
+change the output of \fBunctrl\fP.
+.PP
+Likewise, the \fBmeta\fP(3X) function allows the caller to change the
+output of \fBkeyname\fP, i.e.,
+it determines whether to use the \*(``M\-\*('' prefix
+for \*(``meta\*('' keys (codes in the range 128 to 255).
+Both \fBuse_legacy_coding\fP(3X) and \fBmeta\fP(3X) succeed only after
+curses is initialized.
+X/Open Curses does not document the treatment of codes 128 to 159.
+When treating them as \*(``meta\*('' keys
+(or if \fBkeyname\fP is called before initializing curses),
+this implementation returns strings \*(``M\-^@\*('', \*(``M\-^A\*('', etc.
+.PP
+X/Open Curses documents \fBunctrl\fP as declared in \fB<unctrl.h>\fP,
+which \fBncurses\fP does.
+However, \fBncurses\fP' \fB<curses.h>\fP includes \fB<unctrl.h>\fP,
+matching the behavior of SVr4 curses.
+Other implementations may not do that.
+.SS use_env/use_tioctl
+.PP
+If \fBncurses\fP is configured to provide the sp-functions extension,
+the state of \fBuse_env\fP and \fBuse_tioctl\fP may be updated before
+creating each \fIscreen\fP rather than once only
+(\fBcurs_sp_funcs\fP(3X)).
+This feature of \fBuse_env\fP
+is not provided by other implementation of curses.
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBcurs_initscr\fP(3X),
+\fBcurs_inopts\fP(3X),
+\fBcurs_kernel\fP(3X),
+\fBcurs_scr_dump\fP(3X),
+\fBcurs_sp_funcs\fP(3X),
+\fBcurs_variables\fP(3X),
+\fBlegacy_coding\fP(3X).
diff --git a/man/curs_variables.3x b/man/curs_variables.3x
new file mode 100644
index 0000000..ad6a5b8
--- /dev/null
+++ b/man/curs_variables.3x
@@ -0,0 +1,188 @@
+.\"***************************************************************************
+.\" Copyright 2018-2020,2021 Thomas E. Dickey                                *
+.\" Copyright 2010-2015,2017 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_variables.3x,v 1.17 2021/12/25 21:49:32 tom Exp $
+.TH curs_variables 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.ds n 5
+.na
+.hy 0
+.SH NAME
+\fBCOLORS\fP,
+\fBCOLOR_PAIRS\fP,
+\fBCOLS\fP,
+\fBESCDELAY\fP,
+\fBLINES\fP,
+\fBTABSIZE\fP,
+\fBcurscr\fP,
+\fBnewscr\fP,
+\fBstdscr\fP
+\- \fBcurses\fP global variables
+.ad
+.hy
+.SH SYNOPSIS
+.nf
+\fB#include <curses.h>\fP
+.PP
+\fBint COLOR_PAIRS;\fP
+.br
+\fBint COLORS;\fP
+.br
+\fBint COLS;\fP
+.br
+\fBint ESCDELAY;\fP
+.br
+\fBint LINES;\fP
+.br
+\fBint TABSIZE;\fP
+.br
+\fBWINDOW * curscr;\fP
+.br
+\fBWINDOW * newscr;\fP
+.br
+\fBWINDOW * stdscr;\fP
+.fi
+.SH DESCRIPTION
+This page summarizes variables provided by the \fBcurses\fP library.
+A more complete description is given in the \fBcurses\fP(3X) manual page.
+.PP
+Depending on the configuration, these may be actual variables,
+or macros (see \fBcurs_threads\fP(3X) and \fBcurs_opaque\fP(3X))
+which provide read-only access to \fIcurses\fP's state.
+In either case, applications should treat them as read-only to avoid
+confusing the library.
+.SS COLOR_PAIRS
+After initializing curses, this variable contains the number of color pairs
+which the terminal can support.
+Usually the number of color pairs will be the product \fBCOLORS\fP*\fBCOLORS\fP,
+however this is not always true:
+.bP
+a few terminals use HLS colors, which do not follow this rule
+.bP
+terminals supporting a large number of colors are limited by the number
+of color pairs that can be represented in a \fIsigned short\fP value.
+.SS COLORS
+After initializing curses, this variable contains the number of colors
+which the terminal can support.
+.SS COLS
+After initializing curses, this variable contains the width of the screen,
+i.e., the number of columns.
+.SS ESCDELAY
+This variable holds the number of milliseconds to wait after reading an
+escape character,
+to distinguish between an individual escape character entered on the
+keyboard from escape sequences sent by cursor- and function-keys
+(see curses(3X)).
+.SS LINES
+After initializing curses, this variable contains the height of the screen,
+i.e., the number of lines.
+.SS TABSIZE
+This variable holds the number of columns used by the \fIcurses\fP library
+when converting a tab character to spaces as it adds the tab to a window
+(see \fBcurs_addch\fP(3X).
+.SS The Current Screen
+This implementation of curses uses a special window \fBcurscr\fP to
+record its updates to the terminal screen.
+.PP
+This is referred to as the \*(``physical screen\*('' in the
+\fBcurs_refresh\fP(3X) and
+\fBcurs_outopts\fP(3X) manual pages.
+.SS The New Screen
+This implementation of curses uses a special window \fBnewscr\fP to
+hold updates to the terminal screen before applying them to \fBcurscr\fP.
+.PP
+This is referred to as the \*(``virtual screen\*('' in the
+\fBcurs_kernel\fP(3X),
+\fBcurs_refresh\fP(3X) and
+\fBcurs_outopts\fP(3X) manual pages.
+.SS The Standard Screen
+Upon initializing curses,
+a default window called \fBstdscr\fP,
+which is the size of the terminal screen, is created.
+Many curses functions use this window.
+.SH NOTES
+The curses library is initialized using either \fBinitscr\fP(3X),
+or \fBnewterm\fP(3X).
+.PP
+If \fBcurses\fP is configured to use separate curses/terminfo libraries,
+most of these variables reside in the curses library.
+.SH PORTABILITY
+\fBTABSIZE\fP is a feature of SVr4 curses
+which is not documented by X/Open curses.
+.bP
+In SVr4 curses, \fBTABSIZE\fP is initially set from the terminal description's
+\fBinit_tabs\fP capability.
+After that, it can be altered by the applications using SVr4 curses.
+.IP
+SVr4 curses uses the current value of \fBTABSIZE\fP to
+compute the position of tabstops for updating both
+the virtual screen with \fBaddch\fP(3X) as well as
+the physical screen with \fBmvcur\fP(3X).
+.bP
+This implementation uses the current value of \fBTABSIZE\fP only for
+updating the virtual screen.
+It uses the terminal description's \fBit\fP (\fBinit_tabs\fP) capability for
+computing hardware tabs (i.e., tab stops on the physical screen).
+.bP
+Other implementations differ.
+For instance, NetBSD curses allows \fBTABSIZE\fP to be set through
+an environment variable.
+This implementation does not.
+.IP
+NetBSD curses does not support hardware tabs;
+it uses the \fBinit_tabs\fP capability and the \fBTABSIZE\fP variable
+only for updating the virtual screen.
+.PP
+\fBESCDELAY\fP is an extension in AIX curses:
+.bP
+In AIX, the units for \fBESCDELAY\fP are \fIfifths\fP of a millisecond.
+.bP
+The default value for AIX's \fBESCDELAY\fP is 0.1 seconds.
+.bP
+AIX also enforces a limit of 10,000 seconds for \fBESCDELAY\fP;
+this implementation currently has no upper limit.
+.PP
+This implementation has long used \fBESCDELAY\fP with units of milliseconds,
+making it impossible to be completely compatible with AIX.
+Likewise, most users have either decided to override the value,
+or rely upon its default value.
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBcurs_opaque\fP(3X),
+\fBcurs_terminfo\fP(3X),
+\fBcurs_threads\fP(3X),
+\fBterm_variables\fP(3X),
+\fBterminfo\fP(\*n).
diff --git a/man/curs_window.3x b/man/curs_window.3x
new file mode 100644
index 0000000..f37eb5f
--- /dev/null
+++ b/man/curs_window.3x
@@ -0,0 +1,282 @@
+.\"***************************************************************************
+.\" Copyright 2020-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2015,2016 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_window.3x,v 1.28 2022/08/13 23:24:22 tom Exp $
+.TH curs_window 3X ""
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.na
+.hy 0
+.SH NAME
+\fBnewwin\fP,
+\fBdelwin\fP,
+\fBmvwin\fP,
+\fBsubwin\fP,
+\fBderwin\fP,
+\fBmvderwin\fP,
+\fBdupwin\fP,
+\fBwsyncup\fP,
+\fBsyncok\fP,
+\fBwcursyncup\fP,
+\fBwsyncdown\fP \- create \fBcurses\fP windows
+.ad
+.hy
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBWINDOW *newwin(\fP
+      \fBint \fInlines\fB, int \fIncols\fB,\fR
+      \fBint \fIbegin_y\fB, int \fIbegin_x\fB);\fR
+.br
+\fBint delwin(WINDOW *\fIwin\fB);\fR
+.br
+\fBint mvwin(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB);\fR
+.br
+\fBWINDOW *subwin(WINDOW *\fIorig\fB,\fR
+      \fBint \fInlines\fB, int \fIncols\fB,\fR
+      \fBint \fIbegin_y\fB, int \fIbegin_x\fB);\fR
+.br
+\fBWINDOW *derwin(WINDOW *\fIorig\fB,\fR
+      \fBint \fInlines\fB, int \fIncols\fB,\fR
+      \fBint \fIbegin_y\fB, int \fIbegin_x\fB);\fR
+.br
+\fBint mvderwin(WINDOW *\fIwin\fB, int \fIpar_y\fB, int \fIpar_x\fB);\fR
+.br
+\fBWINDOW *dupwin(WINDOW *\fIwin\fB);\fR
+.br
+\fBvoid wsyncup(WINDOW *\fIwin\fB);\fR
+.br
+\fBint syncok(WINDOW *\fIwin\fB, bool \fIbf\fB);\fR
+.br
+\fBvoid wcursyncup(WINDOW *\fIwin\fB);\fR
+.br
+\fBvoid wsyncdown(WINDOW *\fIwin\fB);\fR
+.br
+.SH DESCRIPTION
+.SS newwin
+Calling \fBnewwin\fP creates and returns a pointer to a new window with the
+given number of lines and columns.
+The upper left-hand corner of the window is
+at
+.RS
+line \fIbegin\fR_\fIy\fP,
+.br
+column \fIbegin\fR_\fIx\fP
+.RE
+.PP
+If either
+\fInlines\fP or \fIncols\fP is zero, they default to
+.RS
+\fBLINES \-\fP \fIbegin\fR_\fIy\fP and
+.br
+\fBCOLS \-\fP \fIbegin\fR_\fIx\fP.
+.RE
+.PP
+A new full-screen window is created by calling \fBnewwin(0,0,0,0)\fP.
+.PP
+Regardless of the function used for creating a new window
+(e.g., \fBnewwin\fP, \fBsubwin\fP, \fBderwin\fP, \fBnewpad\fP),
+rather than a duplicate (with \fBdupwin\fP),
+all of the window modes are initialized to the default values.
+These functions set window modes after a window is created:
+.RS
+.na
+.PP
+idcok,
+idlok,
+immedok,
+keypad,
+leaveok,
+nodelay,
+scrollok,
+setscrreg,
+syncok,
+wbkgdset,
+wbkgrndset, and
+wtimeout
+.RE
+.ad
+.SS delwin
+.PP
+Calling \fBdelwin\fP deletes the named window, freeing all memory
+associated with it (it does not actually erase the window's screen
+image).
+Subwindows must be deleted before the main window can be deleted.
+.SS mvwin
+.PP
+Calling \fBmvwin\fP moves the window so that the upper left-hand
+corner is at position (\fIx\fP, \fIy\fP).
+If the move would cause the window to be off the screen,
+it is an error and the window is not moved.
+Moving subwindows is allowed, but should be avoided.
+.SS subwin
+.PP
+Calling \fBsubwin\fP creates and returns a pointer to a new window
+with the given number of lines, \fInlines\fP, and columns, \fIncols\fP.
+The window is at position (\fIbegin\fR_\fIy\fP,
+\fIbegin\fR_\fIx\fP) on the screen.
+The subwindow shares memory with the window \fIorig\fP,
+so that changes made to one window
+will affect both windows.
+When using this routine, it is necessary to call
+\fBtouchwin\fP or \fBtouchline\fP on \fIorig\fP before calling
+\fBwrefresh\fP on the subwindow.
+.SS derwin
+.PP
+Calling \fBderwin\fP is the same as calling \fBsubwin,\fP except that
+\fIbegin\fR_\fIy\fP and \fIbegin\fR_\fIx\fP are relative to the origin
+of the window \fIorig\fP rather than the screen.
+There is no difference between the subwindows and the derived windows.
+.PP
+Calling \fBmvderwin\fP moves a derived window (or subwindow)
+inside its parent window.
+The screen-relative parameters of the window are not changed.
+This routine is used to display different
+parts of the parent window at the same physical position on the
+screen.
+.SS dupwin
+.PP
+Calling \fBdupwin\fP creates an exact duplicate of the window \fIwin\fP.
+.SS wsyncup
+.PP
+Calling \fBwsyncup\fP touches all locations in ancestors of \fIwin\fP that are
+changed in \fIwin\fP.
+If \fBsyncok\fP is called with second argument
+\fBTRUE\fP then \fBwsyncup\fP is called automatically whenever there is a
+change in the window.
+.SS wsyncdown
+.PP
+The \fBwsyncdown\fP routine touches each location in \fIwin\fP that has been
+touched in any of its ancestor windows.
+This routine is called by
+\fBwrefresh\fP, so it should almost never be necessary to call it manually.
+.SS wcursyncup
+.PP
+The routine \fBwcursyncup\fP updates the current cursor position of all the
+ancestors of the window to reflect the current cursor position of the
+window.
+.SH RETURN VALUE
+Routines that return an integer return the integer \fBERR\fP upon failure and
+\fBOK\fP (SVr4 only specifies "an integer value other than \fBERR\fP") upon
+successful completion.
+.PP
+Routines that return pointers return \fBNULL\fP on error.
+.PP
+X/Open defines no error conditions.
+In this implementation
+.TP 5
+\fBdelwin\fP
+returns an error if the window pointer is null, or
+if the window is the parent of another window.
+.TP 5
+\fBderwin\fP
+returns an error if the parent window pointer is null, or
+if any of its ordinates or dimensions is negative, or
+if the resulting window does not fit inside the parent window.
+.TP 5
+\fBdupwin\fP
+returns an error if the window pointer is null.
+.IP
+This implementation also maintains a list of windows,
+and checks that the pointer passed to \fBdelwin\fP is one that
+it created, returning an error if it was not..
+.TP 5
+\fBmvderwin\fP
+returns an error
+if the window pointer is null, or
+if some part of the window would be placed off-screen.
+.TP 5
+\fBmvwin\fP
+returns an error
+if the window pointer is null, or
+if the window is really a pad, or
+if some part of the window would be placed off-screen.
+.TP 5
+\fBnewwin\fP
+will fail if either of its beginning ordinates is negative, or
+if either the number of lines or columns is negative.
+.TP 5
+\fBsyncok\fP
+returns an error
+if the window pointer is null.
+.TP 5
+\fBsubwin\fP
+returns an error if the parent window pointer is null, or
+if any of its ordinates or dimensions is negative, or
+if the resulting window does not fit inside the parent window.
+.PP
+The functions which return a window pointer
+may also fail if there is insufficient memory for its data structures.
+Any of these functions will fail if the screen has not been initialized,
+i.e., with \fBinitscr\fP or \fBnewterm\fP.
+.SH NOTES
+If many small changes are made to the window, the \fBwsyncup\fP option could
+degrade performance.
+.PP
+Note that \fBsyncok\fP may be a macro.
+.SH BUGS
+The subwindow functions (\fBsubwin\fP, \fBderwin\fP, \fBmvderwin\fP,
+\fBwsyncup\fP, \fBwsyncdown\fP, \fBwcursyncup\fP, \fBsyncok\fP) are flaky,
+incompletely implemented, and not well tested.
+.PP
+The System V curses documentation is very unclear about what \fBwsyncup\fP
+and \fBwsyncdown\fP actually do.
+It seems to imply that they are only
+supposed to touch exactly those lines that are affected by ancestor changes.
+The language here, and the behavior of the \fBcurses\fP implementation,
+is patterned on the XPG4 curses standard.
+The weaker XPG4 spec may result in slower updates.
+.SH PORTABILITY
+The XSI Curses standard, Issue 4 describes these functions.
+.PP
+X/Open Curses states regarding \fBdelwin\fP:
+.bP
+It must delete subwindows before deleting their parent.
+.bP
+If \fBdelwin\fP is asked to delete a parent window,
+it can only succeed if the curses library keeps a list of the subwindows.
+SVr4 curses kept a count of the number of subwindows rather than a list.
+It simply returned \fBERR\fP when asked to delete a subwindow.
+Solaris X/Open curses does not even make that check,
+and will delete a parent window which still has subwindows.
+.bP
+Since release 4.0 (1996), ncurses maintains a list of windows for each screen,
+to ensure that a window has no subwindows before allowing deletion.
+.bP
+NetBSD copied this feature of ncurses in 2003.
+.br
+PDCurses follows the scheme used in Solaris X/Open curses.
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBcurs_initscr\fP(3X),
+\fBcurs_refresh\fP(3X),
+\fBcurs_touch\fP(3X),
+\fBcurs_variables\fP(3X)
diff --git a/man/default_colors.3x b/man/default_colors.3x
new file mode 100644
index 0000000..0710a51
--- /dev/null
+++ b/man/default_colors.3x
@@ -0,0 +1,144 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 2000-2011,2016 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.                                                           *
+.\"***************************************************************************
+.\"
+.\" Author: Thomas E. Dickey 1997,1999,2000,2005
+.\"
+.\" $Id: default_colors.3x,v 1.35 2022/02/12 20:03:40 tom Exp $
+.TH default_colors 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.SH NAME
+\fBuse_default_colors\fP,
+\fBassume_default_colors\fP \- use terminal's default colors
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBint use_default_colors(void);\fP
+.br
+\fBint assume_default_colors(int \fIfg\fB, int \fIbg\fB);\fR
+.SH DESCRIPTION
+The \fBuse_default_colors\fP and \fBassume_default_colors\fP
+functions are extensions to the curses library.
+They are used with terminals that support ISO 6429 color, or equivalent.
+These terminals allow the application to reset color to an unspecified
+default value (e.g., with SGR 39 or SGR 49).
+.PP
+Applications that paint a colored background over the whole screen
+do not take advantage of SGR 39 and SGR 49.
+Some applications are designed to work with the default background,
+using colors only for text.
+For example, there are several implementations of the \fBls\fP program
+which use colors to denote different file types or permissions.
+These \*(``color ls\*('' programs do not necessarily modify the background color,
+typically using only the \fBsetaf\fP terminfo capability to set the
+foreground color.
+Full-screen applications that use default colors can achieve similar
+visual effects.
+.PP
+The first function, \fBuse_default_colors\fP
+tells the curses library to assign terminal default
+foreground/background colors to color number \-1.
+So init_pair(x,COLOR_RED,\-1)
+will initialize pair x as red on default background
+and init_pair(x,\-1,COLOR_BLUE) will
+initialize pair x as default foreground on blue.
+.PP
+The other, \fBassume_default_colors\fP
+is a refinement which tells which colors to paint for color pair 0.
+This function recognizes a special color number \-1,
+which denotes the default terminal color.
+.PP
+The following are equivalent:
+.RS
+.br
+.I use_default_colors();
+.br
+.I assume_default_colors(\-1,\-1);
+.RE
+.PP
+These are ncurses extensions.
+For other curses implementations, color
+number \-1 does not mean anything, just as for ncurses before a
+successful call of \fBuse_default_colors\fP or \fBassume_default_colors\fP.
+.PP
+Other curses implementations do not allow an application to modify color pair 0.
+They assume that the background is COLOR_BLACK,
+but do not ensure that the color pair 0 is painted to match the
+assumption.
+If your application does not use either
+.B use_default_colors
+or
+.B assume_default_colors
+ncurses will paint a white foreground (text) with black background
+for color pair 0.
+.SH RETURN VALUE
+These functions return the integer \fBERR\fP upon failure
+and \fBOK\fP on success.
+They will fail if either the terminal does not support
+the \fBorig_pair\fP or \fBorig_colors\fP capability.
+If the \fBinitialize_pair\fP capability is not found, this causes an
+error as well.
+.SH NOTES
+Associated with this extension, the \fBinit_pair\fP function accepts
+negative arguments to specify default foreground or background colors.
+.PP
+The \fBuse_default_colors\fP function was added to support \fBded\fP.
+This is a full-screen application which uses curses to manage only part
+of the screen.
+The bottom portion of the screen, which is of adjustable
+size, is left uncolored to display the results from shell commands.
+The top portion of the screen colors filenames using a scheme like the
+\*(``color ls\*('' programs.
+Attempting to manage the background color of the screen for this application
+would give unsatisfactory results for a variety of reasons.
+This extension was devised after
+noting that color xterm (and similar programs) provides a background color
+which does not necessarily correspond to any of the ANSI colors.
+While a special terminfo entry could be constructed using nine colors,
+there was no mechanism provided within curses to account for the related
+\fBorig_pair\fP and \fBback_color_erase\fP capabilities.
+.PP
+The \fBassume_default_colors\fP function was added to solve
+a different problem: support for applications which would use
+environment variables and other configuration to bypass curses'
+notion of the terminal's default colors, setting specific values.
+.SH PORTABILITY
+These routines are specific to ncurses.
+They were not supported on
+Version 7, BSD or System V implementations.
+It is recommended that
+any code depending on them be conditioned using NCURSES_VERSION.
+.SH SEE ALSO
+\fBded\fP(1),
+\fBcurs_color\fP(3X).
+.SH AUTHOR
+Thomas Dickey (from an analysis of the requirements for color xterm
+for XFree86 3.1.2C, February 1996).
diff --git a/man/define_key.3x b/man/define_key.3x
new file mode 100644
index 0000000..1476bb7
--- /dev/null
+++ b/man/define_key.3x
@@ -0,0 +1,66 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2017 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.                                                           *
+.\"***************************************************************************
+.\"
+.\" Author: Thomas E. Dickey 1997
+.\"
+.\" $Id: define_key.3x,v 1.21 2022/02/12 20:03:40 tom Exp $
+.TH define_key 3X ""
+.SH NAME
+\fBdefine_key\fP \- define a keycode
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBint define_key(const char *\fIdefinition\fB, int \fIkeycode\fB);\fR
+.SH DESCRIPTION
+This is an extension to the curses library.
+It permits an application to define keycodes with their corresponding control
+strings, so that the ncurses library will interpret them just as it would
+the predefined codes in the terminfo database.
+.PP
+If the given string is null, any existing definition for the keycode is
+removed.
+Similarly, if the given keycode is negative or zero, any existing string
+for the given definition is removed.
+.SH RETURN VALUE
+The keycode must be greater than zero, and the string non-null,
+otherwise \fBERR\fP is returned.
+\fBERR\fP may also be returned if there is insufficient memory to allocate the
+data to store the definition.
+If no error is detected, \fBOK\fP is returned.
+.SH PORTABILITY
+These routines are specific to ncurses.
+They were not supported on
+Version 7, BSD or System V implementations.
+It is recommended that
+any code depending on them be conditioned using NCURSES_VERSION.
+.SH SEE ALSO
+\fBkeyok\fP(3X),
+\fBkey_defined\fP(3X).
+.SH AUTHOR
+Thomas Dickey.
diff --git a/man/form.3x b/man/form.3x
new file mode 100644
index 0000000..5808d1e
--- /dev/null
+++ b/man/form.3x
@@ -0,0 +1,244 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2020,2021 Thomas E. Dickey                                *
+.\" Copyright 1998-2016,2017 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: form.3x,v 1.38 2021/12/25 21:49:32 tom Exp $
+.TH form 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.SH NAME
+\fBform\fP \- curses extension for programming forms
+.SH SYNOPSIS
+\fB#include <form.h>\fP
+.br
+.SH DESCRIPTION
+The \fBform\fP library provides terminal-independent facilities for composing
+form screens on character-cell terminals.
+The library includes: field
+routines, which create and modify form fields; and form routines, which group
+fields into forms, display forms on the screen, and handle interaction with the
+user.
+.PP
+The \fBform\fP library uses the \fBcurses\fP libraries.
+To use the \fBform\fP library, link with the options
+\fB\-lform \-lcurses\fP.
+.PP
+Your program should set up the locale, e.g.,
+.sp
+     \fBsetlocale(LC_ALL, "");\fP
+.sp
+so that input/output processing will work.
+.PP
+A curses initialization routine such as \fBinitscr\fP must be called
+before using any of these functions.
+.
+.SS Current Default Values for Field Attributes
+.
+The \fBform\fP library maintains a default value for field attributes.
+You
+can get or set this default by calling the appropriate \fBset_\fP
+or retrieval
+routine with a \fBNULL\fP field pointer.
+Changing this default with a
+\fBset_\fP function affects future field creations, but does not change the
+rendering of fields already created.
+.
+.SS Routine Name Index
+.
+The following table lists each \fBform\fP routine and the name of
+the manual page on which it is described.
+Routines flagged with \*(``*\*(''
+are ncurses-specific, not present in SVr4.
+.
+.TS
+l l
+l l .
+\fBcurses\fP Routine Name	Manual Page Name
+=
+current_field	\fBform_page\fP(3X)
+data_ahead	\fBform_data\fP(3X)
+data_behind	\fBform_data\fP(3X)
+dup_field	\fBform_field_new\fP(3X)
+dynamic_field_info	\fBform_field_info\fP(3X)
+field_arg	\fBform_field_validation\fP(3X)
+field_back	\fBform_field_attributes\fP(3X)
+field_buffer	\fBform_field_buffer\fP(3X)
+field_count	\fBform_field\fP(3X)
+field_fore	\fBform_field_attributes\fP(3X)
+field_index	\fBform_page\fP(3X)
+field_info	\fBform_field_info\fP(3X)
+field_init	\fBform_hook\fP(3X)
+field_just	\fBform_field_just\fP(3X)
+field_opts	\fBform_field_opts\fP(3X)
+field_opts_off	\fBform_field_opts\fP(3X)
+field_opts_on	\fBform_field_opts\fP(3X)
+field_pad	\fBform_field_attributes\fP(3X)
+field_status	\fBform_field_buffer\fP(3X)
+field_term	\fBform_hook\fP(3X)
+field_type	\fBform_field_validation\fP(3X)
+field_userptr	\fBform_field_userptr\fP(3X)
+form_driver	\fBform_driver\fP(3X)
+form_driver_w	\fBform_driver\fP(3X)*
+form_fields	\fBform_field\fP(3X)
+form_init	\fBform_hook\fP(3X)
+form_opts	\fBform_opts\fP(3X)
+form_opts_off	\fBform_opts\fP(3X)
+form_opts_on	\fBform_opts\fP(3X)
+form_page	\fBform_page\fP(3X)
+form_request_by_name	\fBform_requestname\fP(3X)*
+form_request_name	\fBform_requestname\fP(3X)*
+form_sub	\fBform_win\fP(3X)
+form_term	\fBform_hook\fP(3X)
+form_userptr	\fBform_userptr\fP(3X)
+form_win	\fBform_win\fP(3X)
+free_field	\fBform_field_new\fP(3X)
+free_fieldtype	\fBform_fieldtype\fP(3X)
+free_form	\fBform_new\fP(3X)
+link_field	\fBform_field_new\fP(3X)
+link_fieldtype	\fBform_fieldtype\fP(3X)
+move_field	\fBform_field\fP(3X)
+new_field	\fBform_field_new\fP(3X)
+new_fieldtype	\fBform_fieldtype\fP(3X)
+new_form	\fBform_new\fP(3X)
+new_page	\fBform_new_page\fP(3X)
+pos_form_cursor	\fBform_cursor\fP(3X)
+post_form	\fBform_post\fP(3X)
+scale_form	\fBform_win\fP(3X)
+set_current_field	\fBform_page\fP(3X)
+set_field_back	\fBform_field_attributes\fP(3X)
+set_field_buffer	\fBform_field_buffer\fP(3X)
+set_field_fore	\fBform_field_attributes\fP(3X)
+set_field_init	\fBform_hook\fP(3X)
+set_field_just	\fBform_field_just\fP(3X)
+set_field_opts	\fBform_field_opts\fP(3X)
+set_field_pad	\fBform_field_attributes\fP(3X)
+set_field_status	\fBform_field_buffer\fP(3X)
+set_field_term	\fBform_hook\fP(3X)
+set_field_type	\fBform_field_validation\fP(3X)
+set_field_userptr	\fBform_field_userptr\fP(3X)
+set_fieldtype_arg	\fBform_fieldtype\fP(3X)
+set_fieldtype_choice	\fBform_fieldtype\fP(3X)
+set_form_fields	\fBform_field\fP(3X)
+set_form_init	\fBform_hook\fP(3X)
+set_form_opts	\fBform_field_opts\fP(3X)
+set_form_page	\fBform_page\fP(3X)
+set_form_sub	\fBform_win\fP(3X)
+set_form_term	\fBform_hook\fP(3X)
+set_form_userptr	\fBform_userptr\fP(3X)
+set_form_win	\fBform_win\fP(3X)
+set_max_field	\fBform_field_buffer\fP(3X)
+set_new_page	\fBform_new_page\fP(3X)
+unfocus_current_field	\fBform_page\fP(3X)*
+unpost_form	\fBform_post\fP(3X)
+.TE
+.SH RETURN VALUE
+Routines that return pointers return \fBNULL\fP on error,
+and set \fBerrno\fP to the corresponding error-code returned by functions
+returning an integer.
+Routines that return
+an integer return one of the following error codes:
+.TP 5
+.B E_OK
+The routine succeeded.
+.TP 5
+.B E_BAD_ARGUMENT
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+.B E_BAD_STATE
+Routine was called from an initialization or termination function.
+.TP 5
+.B E_CONNECTED
+The field is already connected to a form.
+.TP 5
+.B E_INVALID_FIELD
+Contents of a field are not valid.
+.TP 5
+.B E_NOT_CONNECTED
+No fields are connected to the form.
+.TP 5
+.B E_NOT_POSTED
+The form has not been posted.
+.TP 5
+.B E_NO_ROOM
+Form is too large for its window.
+.TP 5
+.B E_POSTED
+The form is already posted.
+.TP 5
+.B E_REQUEST_DENIED
+The form driver could not process the request.
+.TP 5
+.B E_SYSTEM_ERROR
+System error occurred (see \fBerrno\fP(3)).
+.TP 5
+.B E_UNKNOWN_COMMAND
+The form driver code saw an unknown request code.
+.SH NOTES
+The header file \fB<form.h>\fP automatically includes the header files
+\fB<curses.h>\fP and \fB<eti.h>\fP.
+.PP
+In your library list, libform.a should be before libncurses.a; that is,
+you want to say \*(``\-lform \-lncurses\*('', not the other way around
+(which would give you a link error when using static libraries).
+.SH PORTABILITY
+These routines emulate the System V forms library.
+They were not supported on
+Version 7 or BSD versions.
+.PP
+The menu facility was documented in SVr4.2 in
+\fICharacter User Interface Programming (UNIX SVR4.2)\fP.
+.PP
+It is not part of X/Open Curses.
+.PP
+Aside from ncurses, there are few implementations:
+.bP
+systems based on SVr4 source code, e.g., Solaris.
+.bP
+NetBSD curses.
+.PP
+A few functions in this implementation are extensions added for ncurses,
+but not provided by other implementations, e.g.,
+\fBform_driver_w\fP,
+\fBunfocus_current_field\fP.
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for ncurses by Eric
+S. Raymond.
+.SH SEE ALSO
+\fBcurses\fP(3X) and related pages whose names begin \*(``form_\*('' for detailed
+descriptions of the entry points.
+.PP
+This describes \fBncurses\fP
+version @NCURSES_MAJOR@.@NCURSES_MINOR@ (patch @NCURSES_PATCH@).
diff --git a/man/form_cursor.3x b/man/form_cursor.3x
new file mode 100644
index 0000000..a2af849
--- /dev/null
+++ b/man/form_cursor.3x
@@ -0,0 +1,72 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2015 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: form_cursor.3x,v 1.17 2022/02/12 20:03:40 tom Exp $
+.TH form_cursor 3X ""
+.SH NAME
+\fBpos_form_cursor\fP \- position a form window cursor
+.SH SYNOPSIS
+\fB#include <form.h>\fP
+.sp
+\fBint pos_form_cursor(FORM *\fIform\fB);\fR
+.br
+.SH DESCRIPTION
+The function \fBpos_form_cursor\fP restores the cursor to the position required
+for the forms driver to continue processing requests.
+This is useful after
+\fBcurses\fP routines have been called to do screen-painting in response to a
+form operation.
+.SH RETURN VALUE
+This routine returns one of the following:
+.TP 5
+.B E_OK
+The routine succeeded.
+.TP 5
+.B E_BAD_ARGUMENT
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+.B E_NOT_POSTED
+The form has not been posted.
+.TP 5
+.B E_SYSTEM_ERROR
+System error occurred (see \fBerrno\fP(3)).
+.
+.SH SEE ALSO
+\fBcurses\fP(3X), \fBform\fP(3X).
+.SH NOTES
+The header file \fB<form.h>\fP automatically includes the header file
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines emulate the System V forms library.
+They were not supported on
+Version 7 or BSD versions.
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric S. Raymond.
diff --git a/man/form_data.3x b/man/form_data.3x
new file mode 100644
index 0000000..ac7db7c
--- /dev/null
+++ b/man/form_data.3x
@@ -0,0 +1,62 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2015 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: form_data.3x,v 1.18 2022/02/12 20:03:40 tom Exp $
+.TH form_data 3X ""
+.SH NAME
+\fBdata_ahead\fP,
+\fBdata_behind\fP \- test for off-screen data in given forms
+.SH SYNOPSIS
+\fB#include <form.h>\fP
+.sp
+\fBbool data_ahead(const FORM *\fIform\fB);\fR
+.br
+\fBbool data_behind(const FORM *\fIform\fB);\fR
+.br
+.SH DESCRIPTION
+The function \fBdata_ahead\fP tests whether there is off-screen data
+ahead in the given form.
+It returns TRUE (1) or FALSE (0).
+.PP
+The function \fBdata_behind\fP tests whether there is off-screen data
+behind in the given form.
+It returns TRUE (1) or FALSE (0).
+.SH SEE ALSO
+\fBcurses\fP(3X), \fBform\fP(3X).
+.SH NOTES
+The header file \fB<form.h>\fP automatically includes the header file
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines emulate the System V forms library.
+They were not supported on
+Version 7 or BSD versions.
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric S. Raymond.
diff --git a/man/form_driver.3x b/man/form_driver.3x
new file mode 100644
index 0000000..ff3a013
--- /dev/null
+++ b/man/form_driver.3x
@@ -0,0 +1,271 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2016,2017 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: form_driver.3x,v 1.39 2022/02/12 20:03:40 tom Exp $
+.TH form_driver 3X ""
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.SH NAME
+\fBform_driver\fP,
+\fBform_driver_w\fP \- command-processing loop of the form system
+.SH SYNOPSIS
+\fB#include <form.h>\fP
+.sp
+\fBint form_driver(FORM *\fIform\fB, int \fIc\fB);\fR
+.br
+\fBint form_driver_w(FORM *\fIform\fB, int \fIc\fB, wchar_t \fIwch\fB);\fR
+.br
+.SH DESCRIPTION
+.SS form_driver
+Once a form has been posted (displayed), you should funnel input events to it
+through \fBform_driver\fP.  This routine has three major input cases:
+.bP
+The input is a form navigation request.
+Navigation request codes are constants defined in \fB<form.h>\fP,
+which are distinct from the key- and character codes returned
+by \fBwgetch\fP(3X).
+.bP
+The input is a printable character.
+Printable characters (which must be positive, less than 256) are
+checked according to the program's locale settings.
+.bP
+The input is the KEY_MOUSE special key associated with an mouse event.
+.SS form_driver_w
+.PP
+This extension simplifies the use of the forms library using wide characters.
+The input is either a key code (a request) or a wide character
+returned by \fBget_wch\fP(3X).
+The type must be passed as well,
+to enable the library to determine whether the parameter
+is a wide character or a request.
+.SS Form-driver requests
+.PP
+The form driver requests are as follows:
+.TS
+l l
+_ _
+l l.
+\fBName\fP	\fBDescription\fP
+REQ_BEG_FIELD	Move to the beginning of the field.
+REQ_BEG_LINE	Move to the beginning of the line.
+REQ_CLR_EOF	Clear to end of field from cursor.
+REQ_CLR_EOL	Clear to end of line from cursor.
+REQ_CLR_FIELD	Clear the entire field.
+REQ_DEL_CHAR	Delete character at the cursor.
+REQ_DEL_LINE	Delete line at the cursor.
+REQ_DEL_PREV	Delete character before the cursor.
+REQ_DEL_WORD	Delete blank-delimited word at the cursor.
+REQ_DOWN_CHAR	Move down in the field.
+REQ_DOWN_FIELD	Move down to a field.
+REQ_END_FIELD	Move to the end of the field.
+REQ_END_LINE	Move to the end of the line.
+REQ_FIRST_FIELD	Move to the first field.
+REQ_FIRST_PAGE	Move to the first page.
+REQ_INS_CHAR	Insert a blank at the cursor.
+REQ_INS_LINE	Insert a blank line at the cursor.
+REQ_INS_MODE	Enter insert mode.
+REQ_LAST_FIELD	Move to the last field.
+REQ_LAST_PAGE	Move to the last field.
+REQ_LEFT_CHAR	Move left in the field.
+REQ_LEFT_FIELD	Move left to a field.
+REQ_NEW_LINE	Insert or overlay a new line.
+REQ_NEXT_CHAR	Move to the next char.
+REQ_NEXT_CHOICE	Display next field choice.
+REQ_NEXT_FIELD	Move to the next field.
+REQ_NEXT_LINE	Move to the next line.
+REQ_NEXT_PAGE	Move to the next page.
+REQ_NEXT_PAGE	Move to the next page.
+REQ_NEXT_WORD	Move to the next word.
+REQ_OVL_MODE	Enter overlay mode.
+REQ_PREV_CHAR	Move to the previous char.
+REQ_PREV_CHOICE	Display previous field choice.
+REQ_PREV_FIELD	Move to the previous field.
+REQ_PREV_LINE	Move to the previous line.
+REQ_PREV_PAGE	Move to the previous page.
+REQ_PREV_WORD	Move to the previous word.
+REQ_RIGHT_CHAR	Move right in the field.
+REQ_RIGHT_FIELD	Move right to a field.
+REQ_SCR_BCHAR	Scroll the field backward a character.
+REQ_SCR_BHPAGE	Scroll the field backward half a page.
+REQ_SCR_BLINE	Scroll the field backward a line.
+REQ_SCR_BPAGE	Scroll the field backward a page.
+REQ_SCR_FCHAR	Scroll the field forward a character.
+REQ_SCR_FHPAGE	Scroll the field forward half a page.
+REQ_SCR_FLINE	Scroll the field forward a line.
+REQ_SCR_FPAGE	Scroll the field forward a page.
+REQ_SCR_HBHALF	Horizontal scroll the field backward half a line.
+REQ_SCR_HBLINE	Horizontal scroll the field backward a line.
+REQ_SCR_HFHALF	Horizontal scroll the field forward half a line.
+REQ_SCR_HFLINE	Horizontal scroll the field forward a line.
+REQ_SFIRST_FIELD	Move to the sorted first field.
+REQ_SLAST_FIELD	Move to the sorted last field.
+REQ_SNEXT_FIELD	Move to the sorted next field.
+REQ_SPREV_FIELD	Move to the sorted previous field.
+REQ_UP_CHAR	Move up in the field.
+REQ_UP_FIELD	Move up to a field.
+REQ_VALIDATION	Validate field.
+.TE
+.PP
+If the second argument is a printable character, the driver places it
+in the current position in the current field.
+If it is one of the forms
+requests listed above, that request is executed.
+.SS Field validation
+The form library makes updates to the window associated
+with form fields rather than directly to the field buffers.
+.PP
+The form driver provides low-level control over updates to the form fields.
+The form driver also provides for validating modified fields
+to ensure that the contents
+meet whatever constraints an application may attach using \fBset_field_type\fP.
+.PP
+.PP
+You can validate a field without making any changes to it using
+\fBREQ_VALIDATION\fP.
+The form driver also validates a field in these cases:
+.bP
+a call to \fBset_current_field\fP attempts to move to a different field.
+.bP
+a call to \fBset_current_page\fP attempts to move
+to a different page of the form.
+.bP
+a request attempts to move to a different field.
+.bP
+a request attempts to move to a different page of the form.
+.PP
+In each case, the move fails if the field is invalid.
+.PP
+If the modified field is valid, the form driver copies the modified
+data from the window associated with the field
+to the field buffer.
+.SS Mouse handling
+.PP
+If the second argument is the KEY_MOUSE special key, the associated
+mouse event is translated into one of the above pre-defined requests.
+Currently only clicks in the user window (e.g., inside the form display
+area or the decoration window) are handled.
+.PP
+If you click above the display region of the form:
+.RS 3
+.TP
+a REQ_PREV_FIELD is generated for a single click,
+.TP
+a REQ_PREV_PAGE is generated for a double-click and
+.TP
+a REQ_FIRST_FIELD is generated for a triple-click.
+.RE
+.PP
+If you click below the display region of the form:
+.RS 3
+.TP
+a REQ_NEXT_FIELD is generated for a single click,
+.TP
+a REQ_NEXT_PAGE is generated for a double-click and
+.TP
+a REQ_LAST_FIELD is generated for a triple-click.
+.RE
+.PP
+If you click at an field inside the display area of the form:
+.RS 3
+.bP
+the form cursor is positioned to that field.
+.bP
+If you double-click a field,
+the form cursor is positioned to that field
+and \fBE_UNKNOWN_COMMAND\fP is returned.
+This return value makes sense,
+because a double click usually means that an field-specific action should
+be returned.
+It is exactly the purpose of this return value to signal that an
+application specific command should be executed.
+.bP
+If a translation
+into a request was done, \fBform_driver\fP returns the result of this request.
+.RE
+.PP
+If you clicked outside the user window
+or the mouse event could not be translated
+into a form request an \fBE_REQUEST_DENIED\fP is returned.
+.SS Application-defined commands
+.PP
+If the second argument is neither printable nor one of the above
+pre-defined form requests, the driver assumes it is an application-specific
+command and returns \fBE_UNKNOWN_COMMAND\fP.  Application-defined commands
+should be defined relative to \fBMAX_COMMAND\fP, the maximum value of these
+pre-defined requests.
+.SH RETURN VALUE
+\fBform_driver\fP returns one of the following error codes:
+.TP 5
+.B E_OK
+The routine succeeded.
+.TP 5
+.B E_BAD_ARGUMENT
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+.B E_BAD_STATE
+Routine was called from an initialization or termination function.
+.TP 5
+.B E_NOT_POSTED
+The form has not been posted.
+.TP 5
+.B E_INVALID_FIELD
+Contents of field is invalid.
+.TP 5
+.B E_NOT_CONNECTED
+No fields are connected to the form.
+.TP 5
+.B E_REQUEST_DENIED
+The form driver could not process the request.
+.TP 5
+.B E_SYSTEM_ERROR
+System error occurred (see \fBerrno\fP(3)).
+.TP 5
+.B E_UNKNOWN_COMMAND
+The form driver code saw an unknown request code.
+.
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBform\fP(3X),
+\fBform_fieldtype\fP(3X),
+\fBform_field_buffer\fP(3X),
+\fBform_field_validation\fP(3X),
+\fBform_variables\fP(3X),
+\fBgetch\fP(3X).
+.SH NOTES
+The header file \fB<form.h>\fP automatically includes the header files
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines emulate the System V forms library.
+They were not supported on
+Version 7 or BSD versions.
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric S. Raymond.
diff --git a/man/form_field.3x b/man/form_field.3x
new file mode 100644
index 0000000..c9cfbf2
--- /dev/null
+++ b/man/form_field.3x
@@ -0,0 +1,94 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2012 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: form_field.3x,v 1.20 2022/02/12 20:03:40 tom Exp $
+.TH form_field 3X ""
+.SH NAME
+\fBform_field\fP \- make and break connections between fields and forms
+.SH SYNOPSIS
+\fB#include <form.h>\fP
+.sp
+\fBint set_form_fields(FORM *\fIform\fB, FIELD **\fIfields\fB);\fR
+.br
+\fBFIELD **form_fields(const FORM *\fIform\fB);\fR
+.br
+\fBint field_count(const FORM *\fIform\fB);\fR
+.br
+\fBint move_field(FIELD *\fIfield\fB, int \fIfrow\fB, int \fIfcol\fB);\fR
+.br
+.SH DESCRIPTION
+The function \fBset_form_fields\fP changes the field pointer array of
+the given \fIform\fP.  The array must be terminated by a \fBNULL\fP.
+.PP
+The function \fBform_fields\fP returns the field array of the given form.
+.PP
+The function \fBfield_count\fP returns the count of fields in \fIform\fP.
+.PP
+The function \fBmove_field\fP moves the given field (which must be disconnected)
+to a specified location on the screen.
+.SH RETURN VALUE
+The function \fBform_fields\fP returns a pointer (which may be \fBNULL\fP).
+It does not set \fBerrno\fP.
+.PP
+The function \fBfield_count\fP returns \fBERR\fP if the \fIform\fP parameter
+is \fBNULL\fP.
+.PP
+The functions \fBset_form_fields\fP and \fBmove_field\fP return one of
+the following codes on error:
+.TP 5
+.B E_OK
+The routine succeeded.
+.TP 5
+.B E_BAD_ARGUMENT
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+.B E_CONNECTED
+The field is already connected to a form.
+.TP 5
+.B E_POSTED
+The form is already posted.
+.TP 5
+.B E_SYSTEM_ERROR
+System error occurred (see \fBerrno\fP(3)).
+.SH SEE ALSO
+\fBcurses\fP(3X), \fBform\fP(3X).
+.SH NOTES
+The header file \fB<form.h>\fP automatically includes the header file
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines emulate the System V forms library.
+They were not supported on
+Version 7 or BSD versions.
+.PP
+The SVr4 forms library documentation specifies the \fBfield_count\fP error value
+as \-1 (which is the value of \fBERR\fP).
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric S. Raymond.
diff --git a/man/form_field_attributes.3x b/man/form_field_attributes.3x
new file mode 100644
index 0000000..5a90cf8
--- /dev/null
+++ b/man/form_field_attributes.3x
@@ -0,0 +1,96 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2006,2010 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: form_field_attributes.3x,v 1.21 2022/02/12 20:03:40 tom Exp $
+.TH form_field_attributes 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.SH NAME
+\fBform_field_attributes\fP \- color and attribute control for form fields
+.SH SYNOPSIS
+\fB#include <form.h>\fP
+.sp
+\fBint set_field_fore(FIELD *\fIfield\fB, chtype \fIattr\fB);\fR
+.br
+\fBchtype field_fore(const FIELD *\fIfield\fB);\fR
+.sp
+\fBint set_field_back(FIELD *\fIfield\fB, chtype \fIattr\fB);\fR
+.br
+\fBchtype field_back(const FIELD *\fIfield\fB);\fR
+.sp
+\fBint set_field_pad(FIELD *\fIfield\fB, int \fIpad\fB);\fR
+.br
+\fBint field_pad(const FIELD *\fIfield\fB);\fR
+.br
+.SH DESCRIPTION
+The function \fBset_field_fore\fP sets the foreground attribute of
+\fIfield\fP. This is the highlight used to display the field contents.  The
+function \fBfield_fore\fP returns the foreground attribute.
+The default is
+\fBA_STANDOUT\fP.
+.PP
+The function \fBset_field_back\fP sets the background attribute of
+\fIform\fP. This is the highlight used to display the extent fields in the
+form.
+The function \fBfield_back\fP returns the background attribute.
+The
+default is \fBA_NORMAL\fP.
+.PP
+The function \fBset_field_pad\fP sets the character used to fill the field.
+The function \fBfield_pad\fP returns the given form's pad character.
+The
+default is a blank.
+.SH RETURN VALUE
+These routines return one of the following:
+.TP 5
+.B E_OK
+The routine succeeded.
+.TP 5
+.B E_BAD_ARGUMENT
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+.B E_SYSTEM_ERROR
+System error occurred (see \fBerrno\fP(3)).
+.
+.SH SEE ALSO
+\fBcurses\fP(3X) and related pages whose names begin \*(``form_\*('' for detailed
+descriptions of the entry points.
+.SH NOTES
+The header file \fB<form.h>\fP automatically includes the header file
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines emulate the System V forms library.
+They were not supported on
+Version 7 or BSD versions.
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric S. Raymond.
diff --git a/man/form_field_buffer.3x b/man/form_field_buffer.3x
new file mode 100644
index 0000000..8688b7b
--- /dev/null
+++ b/man/form_field_buffer.3x
@@ -0,0 +1,144 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2017 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: form_field_buffer.3x,v 1.30 2022/02/12 20:03:40 tom Exp $
+.TH form_field_buffer 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.SH NAME
+\fBform_field_buffer\fP \- field buffer control
+.SH SYNOPSIS
+\fB#include <form.h>\fP
+.sp
+\fBint set_field_buffer(FIELD *\fIfield\fB, int \fIbuf\fB, const char *\fIvalue\fB);\fR
+.br
+\fBchar *field_buffer(const FIELD *\fIfield\fB, int \fIbuffer\fB);\fR
+.sp
+\fBint set_field_status(FIELD *\fIfield\fB, bool \fIstatus\fB);\fR
+.br
+\fBbool field_status(const FIELD *\fIfield\fB);\fR
+.sp
+\fBint set_max_field(FIELD *\fIfield\fB, int \fImax\fB);\fR
+.br
+.SH DESCRIPTION
+The function \fBset_field_buffer\fP sets the numbered buffer of the given field
+to contain a given string:
+.RS 3
+.bP
+Buffer 0 is the displayed value of the field.
+.bP
+Other numbered buffers may be allocated by applications through the \fBnbuf\fP
+argument of (see \fBform_field_new\fP(3X))
+but are not manipulated by the forms library.
+.RE
+.PP
+The function \fBfield_buffer\fP returns a pointer to
+the contents of the given numbered buffer:
+.RS 3
+.bP
+The buffer contents always have the same length,
+and are padded with trailing spaces
+as needed to ensure this length is the same.
+.bP
+The buffer may contain leading spaces, depending on how it was set.
+.bP
+The buffer contents are set with \fBset_field_buffer\fP,
+or as a side effect of any editing operations on the corresponding field.
+.bP
+Editing operations are based on the \fIwindow\fP which displays the field,
+rather than a \fIstring\fP.
+The window contains only printable characters, and is filled with blanks.
+If you want the raw data, you must write your
+own routine that copies the value out of the buffer and removes the leading
+and trailing spaces.
+.bP
+Because editing operations change the content of the buffer to
+correspond to the window, you should not rely on using buffers
+for long-term storage of form data.
+.RE
+.PP
+The function \fBset_field_status\fP sets the associated status flag of
+\fIfield\fP; \fBfield_status\fP gets the current value.
+The status flag
+is set to a nonzero value whenever the field changes.
+.PP
+The function \fBset_max_field\fP sets the maximum size for a dynamic field.
+An argument of 0 turns off any maximum size threshold for that field.
+.SH RETURN VALUE
+The \fBfield_buffer\fP function returns NULL on error.
+It sets \fBerrno\fP according to their success:
+.TP 5
+.B E_OK
+The routine succeeded.
+.TP 5
+.B E_BAD_ARGUMENT
+Routine detected an incorrect or out-of-range argument.
+.PP
+The \fBfield_status\fP function returns \fBTRUE\fP or \fBFALSE\fP.
+.PP
+The remaining routines return one of the following:
+.TP 5
+.B E_OK
+The routine succeeded.
+.TP 5
+.B E_SYSTEM_ERROR
+System error occurred (see \fBerrno\fP(3)).
+.TP 5
+.B E_BAD_ARGUMENT
+Routine detected an incorrect or out-of-range argument.
+.SH SEE ALSO
+\fBcurses\fP(3X) and related pages whose names begin \*(``form_\*('' for detailed
+descriptions of the entry points.
+.SH NOTES
+The header file \fB<form.h>\fP automatically includes the header file
+.PP
+When configured for wide characters, \fBfield_buffer\fP returns a pointer
+to temporary storage (allocated and freed by the library).
+The application should not attempt to modify the data.
+It will be freed on the next call to \fBfield_buffer\fP to return the
+same buffer.
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines emulate the System V forms library.
+They were not supported on
+Version 7 or BSD versions.
+.PP
+The \fBset_max_field\fP function checks for an ncurses extension
+\fBO_INPUT_FIELD\fP which allows a dynamic field to shrink if the new
+limit is smaller than the current field size.
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric S. Raymond.
diff --git a/man/form_field_info.3x b/man/form_field_info.3x
new file mode 100644
index 0000000..f5d7777
--- /dev/null
+++ b/man/form_field_info.3x
@@ -0,0 +1,92 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2015 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: form_field_info.3x,v 1.21 2022/02/12 20:03:40 tom Exp $
+.TH form_field_info 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.SH NAME
+\fBdynamic_field_info\fP,
+\fBfield_info\fP \- retrieve field characteristics
+.SH SYNOPSIS
+.nf
+\fB#include <form.h>\fP
+.sp
+\fBint field_info(const FIELD *\fIfield\fB,\fR
+               \fBint *\fIrows\fB, int *\fIcols\fB,\fR
+               \fBint *\fIfrow\fB, int *\fIfcol\fB,\fR
+               \fBint *\fInrow\fB, int *\fInbuf\fB);\fR
+.sp
+\fBint dynamic_field_info(const FIELD *\fIfield\fB,\fR
+                       \fBint *\fIrows\fB, int *\fIcols\fB, int *\fImax\fB);\fR
+.fi
+.SH DESCRIPTION
+The function \fBfield_info\fP returns the sizes and other attributes passed in
+to the field at its creation time.
+The attributes are: height, width, row of
+upper-left corner, column of upper-left corner, number off-screen rows, and
+number of working buffers.
+.PP
+The function \fBdynamic_field_info\fP returns the actual size of the field, and
+its maximum possible size.
+If the field has no size limit, the location
+addressed by the third argument will be set to 0.
+A field can be made dynamic
+by turning off the \fBO_STATIC\fP option with \fBfield_opts_off\fP.
+.SH RETURN VALUE
+These routines return one of the following:
+.TP 5
+.B E_OK
+The routine succeeded.
+.TP 5
+.B E_SYSTEM_ERROR
+System error occurred (see \fBerrno\fP(3)).
+.TP 5
+.B E_BAD_ARGUMENT
+Routine detected an incorrect or out-of-range argument.
+.SH SEE ALSO
+\fBcurses\fP(3X) and related pages whose names begin \*(``form_\*('' for detailed
+descriptions of the entry points.
+.SH NOTES
+The header file \fB<form.h>\fP automatically includes the header file
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines emulate the System V forms library.
+They were not supported on
+Version 7 or BSD versions.
+.PP
+A null (zero pointer) is accepted for any of the return values,
+to ignore that value.
+Not all implementations allow this, e.g., Solaris 2.7 does not.
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric S. Raymond.
diff --git a/man/form_field_just.3x b/man/form_field_just.3x
new file mode 100644
index 0000000..8f5efa6
--- /dev/null
+++ b/man/form_field_just.3x
@@ -0,0 +1,79 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2015 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: form_field_just.3x,v 1.21 2022/02/12 20:03:40 tom Exp $
+.TH form_field_just 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.SH NAME
+\fBset_field_just\fP,
+\fBfield_just\fP \- retrieve field characteristics
+.SH SYNOPSIS
+\fB#include <form.h>\fP
+.sp
+\fBint set_field_just(FIELD *\fIfield\fB, int \fIjustification\fB);\fR
+.br
+\fBint field_just(const FIELD *\fIfield\fB);\fR
+.br
+.SH DESCRIPTION
+The function \fBset_field_just\fP sets the justification attribute of
+a field; \fBfield_just\fP returns a field's justification attribute.
+The attribute may be one of NO_JUSTIFICATION, JUSTIFY_RIGHT,
+JUSTIFY_LEFT, or JUSTIFY_CENTER.
+.
+.SH RETURN VALUE
+The function \fBfield_just\fP returns one of: NO_JUSTIFICATION,
+JUSTIFY_RIGHT, JUSTIFY_LEFT, or JUSTIFY_CENTER.
+.PP
+The function \fBset_field_just\fP returns one of the following:
+.TP 5
+.B E_OK
+The routine succeeded.
+.TP 5
+.B E_SYSTEM_ERROR
+System error occurred (see \fBerrno\fP(3)).
+.TP 5
+.B E_BAD_ARGUMENT
+Routine detected an incorrect or out-of-range argument.
+.SH SEE ALSO
+\fBcurses\fP(3X) and related pages whose names begin \*(``form_\*('' for detailed
+descriptions of the entry points.
+.SH NOTES
+The header file \fB<form.h>\fP automatically includes the header file
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines emulate the System V forms library.
+They were not supported on
+Version 7 or BSD versions.
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric S. Raymond.
diff --git a/man/form_field_new.3x b/man/form_field_new.3x
new file mode 100644
index 0000000..05d6d03
--- /dev/null
+++ b/man/form_field_new.3x
@@ -0,0 +1,108 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2015 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: form_field_new.3x,v 1.27 2022/02/12 20:03:40 tom Exp $
+.TH form_field_new 3X ""
+.SH NAME
+\fBnew_field\fP,
+\fBdup_field\fP,
+\fBlink_field\fP,
+\fBfree_field\fP \- create and destroy form fields
+.SH SYNOPSIS
+\fB#include <form.h>\fP
+.sp
+\fBFIELD *new_field(int \fIheight\fB, int \fIwidth\fB,\fR
+                 \fBint \fItoprow\fB, int \fIleftcol\fB,\fR
+                 \fBint \fIoffscreen\fB, int \fInbuffers\fB);\fR
+.br
+\fBFIELD *dup_field(FIELD *\fIfield\fB, int \fItoprow\fB, int \fIleftcol\fB);\fR
+.br
+\fBFIELD *link_field(FIELD *\fIfield\fB, int \fItoprow\fB, int \fIleftcol\fB);\fR
+.br
+\fBint free_field(FIELD *\fIfield\fB);\fR
+.br
+.SH DESCRIPTION
+The function \fBnew_field\fP allocates a new field and initializes it from the
+parameters given: height, width, row of upper-left corner, column of upper-left
+corner, number off-screen rows, and number of additional working buffers.
+.PP
+The function \fBdup_field\fP duplicates a field at a new location.
+Most
+attributes (including current contents, size, validation type, buffer count,
+growth threshold, justification, foreground, background, pad character,
+options, and user pointer) are copied.
+Field status and the field page bit are
+not copied.
+.PP
+The function \fBlink_field\fP acts like \fBdup_field\fP, but the new field
+shares buffers with its parent.
+Attribute data is separate.
+.PP
+The function \fBfree_field\fP de-allocates storage associated with a field.
+.SH RETURN VALUE
+The functions \fBnew_field\fP, \fBdup_field\fP, \fBlink_field\fP return
+\fBNULL\fP on error.
+They set \fBerrno\fP according to their success:
+.TP 5
+.B E_OK
+The routine succeeded.
+.TP 5
+.B E_BAD_ARGUMENT
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+.B E_SYSTEM_ERROR
+System error occurred, e.g., malloc failure.
+.PP
+The function \fBfree_field\fP returns one of the following:
+.TP 5
+.B E_OK
+The routine succeeded.
+.TP 5
+.B E_BAD_ARGUMENT
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+.B E_CONNECTED
+field is connected.
+.SH SEE ALSO
+\fBcurses\fP(3X), \fBform\fP(3X).
+.SH NOTES
+The header file \fB<form.h>\fP automatically includes the header file
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines emulate the System V forms library.
+They were not supported on
+Version 7 or BSD versions.
+.PP
+It may be unwise to count on the set of attributes copied by
+\fBdup_field\fP being portable; the System V forms library documents are
+not very explicit about what gets copied and what does not.
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric S. Raymond.
diff --git a/man/form_field_opts.3x b/man/form_field_opts.3x
new file mode 100644
index 0000000..e19f6bd
--- /dev/null
+++ b/man/form_field_opts.3x
@@ -0,0 +1,150 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2014,2015 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: form_field_opts.3x,v 1.30 2022/02/12 20:03:40 tom Exp $
+.TH form_field_opts 3X ""
+.SH NAME
+\fBset_field_opts\fP,
+\fBfield_opts_on\fP,
+\fBfield_opts_off\fP,
+\fBfield_opts\fP \- set and get field options
+.SH SYNOPSIS
+\fB#include <form.h>\fP
+.sp
+\fBint set_field_opts(FIELD *\fIfield\fB, Field_Options \fIopts\fB);\fR
+.br
+\fBField_Options field_opts(const FIELD *\fIfield\fB);\fR
+.sp
+\fBint field_opts_on(FIELD *\fIfield\fB, Field_Options \fIopts\fB);\fR
+.br
+\fBint field_opts_off(FIELD *\fIfield\fB, Field_Options \fIopts\fB);\fR
+.br
+.SH DESCRIPTION
+The function \fBset_field_opts\fP sets all the given field's option bits (field
+option bits may be logically-OR'ed together).
+.PP
+The function \fBfield_opts_on\fP turns on the given option bits, and leaves
+others alone.
+.PP
+The function \fBfield_opts_off\fP turns off the given option bits, and leaves
+others alone.
+.PP
+The function \fBfield_opts\fP returns the field's current option bits.
+.PP
+The following standard options are defined (all are on by default):
+.TP 5
+O_ACTIVE
+The field is visited during processing.
+If this option is off, the field will
+not be reachable by navigation keys.
+Please notice that an invisible field
+appears to be inactive also.
+.TP 5
+O_AUTOSKIP
+Skip to the next field when this one fills.
+.TP 5
+O_BLANK
+The field is cleared whenever a character is entered at the first position.
+.TP 5
+O_EDIT
+The field can be edited.
+.TP 5
+O_NULLOK
+Allow a blank field.
+.TP 5
+O_PASSOK
+Validate field only if modified by user.
+.TP 5
+O_PUBLIC
+The field contents are displayed as data is entered.
+.TP 5
+O_STATIC
+Field buffers are fixed to field's original size.
+Turn this option off to create a dynamic field.
+.TP 5
+O_VISIBLE
+The field is displayed.
+If this option is off, display of the field is
+suppressed.
+.TP 5
+O_WRAP
+Words that do not fit on a line are wrapped to the next line.
+Words are
+blank-separated.
+.PP
+These extension options are defined (extensions are off by default):
+.TP 5
+O_DYNAMIC_JUSTIFY
+Permit dynamic fields to be justified, like static fields.
+.TP 5
+O_NO_LEFT_STRIP
+Preserve leading whitespace in the field buffer, which is normally discarded.
+.TP 5
+O_EDGE_INSERT_STAY
+When inserting into a field up to the boundary position,
+optionally delay the scrolling,
+so that the last inserted character remains visible,
+but advance the cursor to reflect the insertion.
+This allows the form library to display the
+inserted character in one-character fields
+as well as allowing the library to maintain consistent state.
+.TP 5
+O_INPUT_FIELD
+The \fBset_max_field\fP function checks for this extension,
+which allows a dynamic field to shrink if the new
+limit is smaller than the current field size.
+.SH RETURN VALUE
+Except for \fBfield_opts\fP, each routine returns one of the following:
+.TP 5
+.B E_OK
+The routine succeeded.
+.TP 5
+.B E_BAD_ARGUMENT
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+.B E_CURRENT
+The field is the current field.
+.TP 5
+.B E_SYSTEM_ERROR
+System error occurred (see \fBerrno\fP(3)).
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBform\fP(3X).
+\fBform_field_just\fP(3X).
+.SH NOTES
+The header file \fB<form.h>\fP automatically includes the header file
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines emulate the System V forms library.
+They were not supported on
+Version 7 or BSD versions.
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric S. Raymond.
diff --git a/man/form_field_userptr.3x b/man/form_field_userptr.3x
new file mode 100644
index 0000000..ae5f751
--- /dev/null
+++ b/man/form_field_userptr.3x
@@ -0,0 +1,66 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2015 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: form_field_userptr.3x,v 1.19 2022/02/12 20:03:40 tom Exp $
+.TH form_field_userptr 3X ""
+.SH NAME
+\fBset_field_userptr\fP,
+\fBfield_userptr\fP \- associate application data with a form field
+.SH SYNOPSIS
+\fB#include <form.h>\fP
+.sp
+\fBint set_field_userptr(FIELD *\fIfield\fB, void *\fIuserptr\fB);\fR
+.br
+\fBvoid *field_userptr(const FIELD *\fIfield\fB);\fR
+.SH DESCRIPTION
+Every form field has a field that can be used to hold application-specific data
+(that is, the form-driver code leaves it alone).
+These functions get and set
+that field.
+.SH RETURN VALUE
+The function \fBfield_userptr\fP returns a pointer (which may be \fBNULL\fP).
+It does not set \fBerrno\fP.
+.PP
+The function \fBset_field_userptr\fP returns \fBE_OK\fP (success).
+.SH SEE ALSO
+\fBcurses\fP(3X), \fBform\fP(3X).
+.SH NOTES
+The header file \fB<form.h>\fP automatically includes the header file
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines emulate the System V forms library.
+They were not supported on
+Version 7 or BSD versions.
+.PP
+The user pointer is a void pointer.
+We chose not to leave it as a char pointer for SVr4 compatibility.
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric S. Raymond.
diff --git a/man/form_field_validation.3x b/man/form_field_validation.3x
new file mode 100644
index 0000000..ec68a90
--- /dev/null
+++ b/man/form_field_validation.3x
@@ -0,0 +1,234 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2017 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: form_field_validation.3x,v 1.36 2022/02/12 20:03:40 tom Exp $
+.TH form_field_validation 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.SH NAME
+\fBform_field_validation\fP \- data type validation for fields
+.SH SYNOPSIS
+\fB#include <form.h>\fP
+.sp
+\fBvoid *field_arg(const FIELD *\fIfield\fB);\fR
+.br
+\fBFIELDTYPE *field_type(const FIELD *\fIfield\fB);\fR
+.br
+\fBint set_field_type(FIELD *\fIfield\fB, FIELDTYPE *\fItype\fB, ...);\fR
+.sp
+/* predefined field types */
+.br
+\fBFIELDTYPE *TYPE_ALNUM;\fP
+.br
+\fBFIELDTYPE *TYPE_ALPHA;\fP
+.br
+\fBFIELDTYPE *TYPE_ENUM;\fP
+.br
+\fBFIELDTYPE *TYPE_INTEGER;\fP
+.br
+\fBFIELDTYPE *TYPE_NUMERIC;\fP
+.br
+\fBFIELDTYPE *TYPE_REGEXP;\fP
+.br
+\fBFIELDTYPE *TYPE_IPV4;\fP
+.br
+.SH DESCRIPTION
+By default, no validation is done on form fields.
+You can associate a form with with a \fIfield type\fP,
+making the form library validate input.
+.SS field_arg
+Returns a pointer to the field's argument block.
+The \fIargument block\fP is an opaque structure containing
+a copy of the arguments provided in a \fBset_field_type\fP call.
+.SS field_type
+Returns a pointer to the \fIfield type\fP associated with the form field,
+i.e., by calling \fBset_field_type\fP.
+.SS set_field_type
+The function \fBset_field_type\fP associates
+a field type with a given form field.
+This is the type checked by validation functions.
+Most field types are configurable,
+via arguments which the caller provides when calling \fBset_field_type\fP.
+.PP
+Several field types are predefined by the form library.
+.SS Predefined types
+.PP
+It is possible to set up new programmer-defined field types.
+Field types are implemented via the \fBFIELDTYPE\fP data
+structure, which contains several pointers to functions.
+.PP
+See the \fBform_fieldtype\fP(3X) manual page,
+which describes functions which can be used to construct
+a field-type dynamically.
+.PP
+The predefined types are as follows:
+.TP 5
+TYPE_ALNUM
+Alphanumeric data.
+Required parameter:
+.RS
+.bP
+a third \fBint\fP argument, a minimum field width.
+.RE
+.TP 5
+TYPE_ALPHA
+Character data.
+Required parameter:
+.RS
+.bP
+a third \fBint\fP argument, a minimum field width.
+.RE
+.TP 5
+TYPE_ENUM
+Accept one of a specified set of strings.
+Required parameters:
+.RS
+.bP
+a third \fB(char **)\fP argument pointing to a string list;
+.bP
+a fourth \fBint\fP flag argument to enable case-sensitivity;
+.bP
+a fifth \fBint\fP flag argument specifying whether a partial
+match must be a unique one.
+If this flag is off, a prefix matches the first
+of any set of more than one list elements with that prefix.
+.RE
+.IP
+The library copies the string list,
+so you may use a list that lives in automatic variables on the stack.
+.TP 5
+TYPE_INTEGER
+Integer data, parsable to an integer by \fBatoi\fP(3).
+Required parameters:
+.RS
+.bP
+a third \fBint\fP argument controlling the precision,
+.bP
+a fourth \fBlong\fP argument constraining minimum value,
+.bP
+a fifth \fBlong\fP constraining maximum value.
+If the maximum value is less than or equal to the minimum value, the range is
+simply ignored.
+.RE
+.IP
+On return, the field buffer is formatted according to the
+\fBprintf\fP format specification \*(``.*ld\*('',
+where the \*(``*\*('' is replaced by the precision argument.
+.IP
+For details of the precision handling see \fBprintf\fP(3).
+.TP 5
+TYPE_NUMERIC
+Numeric data (may have a decimal-point part).
+Required parameters:
+.RS
+.bP
+a third \fBint\fP argument controlling the precision,
+.bP
+a fourth \fBdouble\fP argument constraining minimum value,
+.bP
+and a fifth \fBdouble\fP constraining maximum value.
+If your system supports locales,
+the decimal point character must be the one specified by your locale.
+If the maximum value is less than or equal to the minimum value,
+the range is simply ignored.
+.RE
+.IP
+On return, the field buffer is formatted according to the
+\fBprintf\fP format specification \*(``.*f\*('',
+where the \*(``*\*('' is replaced by the precision argument.
+.IP
+For details of the precision handling see \fBprintf\fP(3).
+.TP 5
+TYPE_REGEXP
+Regular expression data.
+Required parameter:
+.RS
+.bP
+a third argument, a regular expression \fB(char *)\fP string.
+The data is valid if the regular expression matches it.
+.RE
+.IP
+Regular expressions
+are in the format of \fBregcomp\fP and \fBregexec\fP.
+.IP
+The regular expression must match the whole field.
+If you have for example, an eight character wide field,
+a regular expression "^[0\-9]*$" always
+means that you have to fill all eight positions with digits.
+If you want to allow fewer digits,
+you may use for example "^[0\-9]* *$" which is good for
+trailing spaces (up to an empty field),
+or "^ *[0\-9]* *$" which is good for
+leading and trailing spaces around the digits.
+.TP 5
+TYPE_IPV4
+An Internet Protocol Version 4 address.
+Required parameter:
+.RS
+.bP
+none
+.RE
+.IP
+The form library checks whether or not the buffer has the form \fIa.b.c.d\fP,
+where \fIa\fP, \fIb\fP, \fIc\fP, and \fId\fP are numbers in the range 0 to 255.
+Trailing blanks in the buffer are ignored.
+The address itself is not validated.
+.IP
+This is an ncurses extension;
+this field type may not be available in other curses implementations.
+.SH RETURN VALUE
+The functions \fBfield_type\fP and \fBfield_arg\fP return \fBNULL\fP on error.
+The function \fBset_field_type\fP returns one of the following:
+.TP 5
+.B E_OK
+The routine succeeded.
+.TP 5
+.B E_SYSTEM_ERROR
+System error occurred (see \fBerrno\fP(3)).
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBform\fP(3X),
+\fBform_fieldtype\fP(3X),
+\fBform_variables\fP(3X).
+.SH NOTES
+The header file \fB<form.h>\fP automatically includes the header file
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines emulate the System V forms library.
+They were not supported on
+Version 7 or BSD versions.
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric S. Raymond.
diff --git a/man/form_fieldtype.3x b/man/form_fieldtype.3x
new file mode 100644
index 0000000..7a23bb8
--- /dev/null
+++ b/man/form_fieldtype.3x
@@ -0,0 +1,170 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2006,2010 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: form_fieldtype.3x,v 1.31 2022/02/12 20:03:40 tom Exp $
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.TH form_fieldtype 3X ""
+.SH NAME
+\fBform_fieldtype\fP \- define validation-field types
+.SH SYNOPSIS
+\fB#include <form.h>\fP
+.sp
+\fBFIELDTYPE *new_fieldtype(\fP
+    \fBbool (* const \fIfield_check\fB)(FIELD *, const void *),\fR
+    \fBbool (* const \fIchar_check\fB)(int, const void *));\fR
+.br
+\fBint free_fieldtype(FIELDTYPE *\fIfieldtype\fB);\fR
+.sp
+\fBint set_fieldtype_arg(\fP
+    \fBFIELDTYPE *\fIfieldtype\fB,\fR
+    \fBvoid *(* const \fImake_arg\fB)(va_list *),\fR
+    \fBvoid *(* const \fIcopy_arg\fB)(const void *),\fR
+    \fBvoid  (* const \fIfree_arg\fB)(void *));\fR
+.br
+\fBint set_fieldtype_choice(\fP
+    \fBFIELDTYPE *\fIfieldtype\fB,\fR
+    \fBbool (* const \fInext_choice\fB)(FIELD *, const void *),\fR
+    \fBbool (* const \fIprev_choice\fB)(FIELD *, const void *));\fR
+.sp
+\fBFIELDTYPE *link_fieldtype(FIELDTYPE *\fItype1\fB,\fR
+                          \fBFIELDTYPE *\fItype2\fB);\fR
+.SH DESCRIPTION
+.SS new_fieldtype
+The function \fBnew_fieldtype\fP creates a new field type usable for data
+validation.
+Its parameters are function pointers:
+.TP 5
+\fIfield_check\fP
+This function checks the
+validity of an entered data string whenever the user attempts to leave a field.
+It has two arguments:
+.RS
+.bP
+The (FIELD *) argument is passed in so the validation predicate can see the
+field's buffer, sizes and other attributes.
+.bP
+The second argument is an
+argument-block structure, about which more below.
+.RE
+.TP 5
+\fIchar_check\fP
+This function validates input characters as they are entered.
+The form library passes it the character to be checked
+and a pointer to an argument-block structure.
+.SS free_fieldtype
+.PP
+The \fBfree_fieldtype\fP function
+frees the space allocated for a given validation type by \fBnew_fieldtype\fP.
+.SS set_fieldtype_arg
+.PP
+The function \fBset_fieldtype_arg\fP associates
+three storage-management functions with a field type:
+.TP 5
+\fImake_arg\fP
+This function is automatically applied to the
+list of arguments you give \fBset_field_type\fP when attaching validation
+to a field.
+It stores the arguments in an allocated argument-block
+object which is used when validating input.
+.TP 5
+\fIcopy_arg\fP
+This function may be used by applications to copy argument-blocks.
+.TP 5
+\fIfree_arg\fP
+Frees an argument-block structure.
+.PP
+You must supply the \fImake_arg\fP function.
+The other two are optional: you may supply NULL for them.
+In this case, the form library assumes
+that \fImake_arg\fP does not allocate memory but simply loads the
+argument into a single scalar value.
+.SS set_fieldtype_choice
+.PP
+The form driver requests \fBREQ_NEXT_CHOICE\fP and \fBREQ_PREV_CHOICE\fP assume
+that the possible values of a field form an ordered set, and provide the forms
+user with a way to move through the set.
+.PP
+The \fBset_fieldtype_choice\fP
+function allows forms programmers to define successor and predecessor functions
+for the field type.
+These functions take the field pointer and an
+argument-block structure as arguments.
+.SS link_fieldtype
+.PP
+The function \fBlink_fieldtype\fP creates
+a new field type from the two given types.
+They are connected by an logical 'OR'.
+.SH RETURN VALUE
+The pointer-valued routines return NULL on error.
+They set \fBerrno\fP according to their success:
+.TP 5
+.B E_OK
+The routine succeeded.
+.TP 5
+.B E_BAD_ARGUMENT
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+.B E_SYSTEM_ERROR
+System error occurred, e.g., malloc failure.
+.PP
+The integer-valued routines return one of the following codes on
+error:
+.TP 5
+.B E_OK
+The routine succeeded.
+.TP 5
+.B E_BAD_ARGUMENT
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+.B E_CONNECTED
+The field is already connected to a form.
+.TP 5
+.B E_CURRENT
+The field is the current field.
+.TP 5
+.B E_SYSTEM_ERROR
+System error occurred (see \fBerrno\fP(3)).
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBform\fP(3X),
+\fBform_field_validation\fP(3X).
+.SH NOTES
+The header file \fB<form.h>\fP automatically includes the header file
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines emulate the System V forms library.
+They were not supported on
+Version 7 or BSD versions.
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric S. Raymond.
diff --git a/man/form_hook.3x b/man/form_hook.3x
new file mode 100644
index 0000000..b4f17ed
--- /dev/null
+++ b/man/form_hook.3x
@@ -0,0 +1,101 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2007,2010 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: form_hook.3x,v 1.19 2022/02/12 20:03:40 tom Exp $
+.TH form_hook 3X ""
+.SH NAME
+\fBform_hook\fP \- set hooks for automatic invocation by applications
+.SH SYNOPSIS
+\fB#include <form.h>\fP
+.sp
+\fBint set_field_init(FORM *\fIform\fB, Form_Hook \fIfunc\fB);\fR
+.br
+\fBForm_Hook field_init(const FORM *\fIform\fB);\fR
+.sp
+\fBint set_field_term(FORM *\fIform\fB, Form_Hook \fIfunc\fB);\fR
+.br
+\fBForm_Hook field_term(const FORM *\fIform\fB);\fR
+.sp
+\fBint set_form_init(FORM *\fIform\fB, Form_Hook \fIfunc\fB);\fR
+.br
+\fBForm_Hook form_init(const FORM *\fIform\fB);\fR
+.sp
+\fBint set_form_term(FORM *\fIform\fB, Form_Hook \fIfunc\fB);\fR
+.br
+\fBForm_Hook form_term(const FORM *\fIform\fB);\fR
+.br
+.SH DESCRIPTION
+These functions make it possible to set hook functions to be called at various
+points in the automatic processing of input event codes by \fBform_driver\fP.
+.PP
+The function \fBset_field_init\fP sets a hook to be called at form-post time
+and each time the selected field changes (after the change).
+\fBfield_init\fP
+returns the current field init hook, if any (\fBNULL\fP if there is no such
+hook).
+.PP
+The function \fBset_field_term\fP sets a hook to be called at form-unpost time
+and each time the selected field changes (before the change).
+\fBfield_term\fP
+returns the current field term hook, if any (\fBNULL\fP if there is no such
+hook).
+.PP
+The function \fBset_form_init\fP sets a hook to be called at form-post time and
+just after a page change once it is posted.
+\fBform_init\fP returns the
+current form init hook, if any (\fBNULL\fP if there is no such hook).
+.PP
+The function \fBset_form_term\fP sets a hook to be called at form-unpost time
+and just before a page change once it is posted.
+\fBform_init\fP
+returns the current form term hook, if any (\fBNULL\fP if there is no such
+hook).
+.SH RETURN VALUE
+Routines that return pointers return \fBNULL\fP on error.
+Other routines
+return one of the following:
+.TP 5
+.B E_OK
+The routine succeeded.
+.TP 5
+.B E_SYSTEM_ERROR
+System error occurred (see \fBerrno\fP(3)).
+.SH SEE ALSO
+\fBcurses\fP(3X), \fBform\fP(3X).
+.SH NOTES
+The header file \fB<form.h>\fP automatically includes the header file
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines emulate the System V forms library.
+They were not supported on
+Version 7 or BSD versions.
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric S. Raymond.
diff --git a/man/form_new.3x b/man/form_new.3x
new file mode 100644
index 0000000..901d94d
--- /dev/null
+++ b/man/form_new.3x
@@ -0,0 +1,86 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2015 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: form_new.3x,v 1.18 2022/02/12 20:03:40 tom Exp $
+.TH form_new 3X ""
+.SH NAME
+\fBnew_form\fP,
+\fBfree_form\fP \- create and destroy forms
+.SH SYNOPSIS
+\fB#include <form.h>\fP
+.sp
+\fBFORM *new_form(FIELD **\fIfields\fB);\fR
+.br
+\fBint free_form(FORM *\fIform\fB);\fR
+.br
+.SH DESCRIPTION
+The function \fBnew_form\fP creates a new form connected to a specified field
+pointer array (which must be \fBNULL\fP-terminated).
+.PP
+The function \fBfree_form\fP disconnects \fIform\fP from its field array
+and frees the storage allocated for the form.
+.SH RETURN VALUE
+The function \fBnew_form\fP returns \fBNULL\fP on error.
+It sets \fBerrno\fP according to the function's success:
+.TP 5
+.B E_OK
+The routine succeeded.
+.TP 5
+.B E_BAD_ARGUMENT
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+.B E_CONNECTED
+The field is already connected to a form.
+.TP 5
+.B E_SYSTEM_ERROR
+System error occurred, e.g., malloc failure.
+.PP
+The function \fBfree_form\fP returns one of the following:
+.TP 5
+.B E_OK
+The routine succeeded.
+.TP 5
+.B E_BAD_ARGUMENT
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+.B E_POSTED
+The form has already been posted.
+.SH SEE ALSO
+\fBcurses\fP(3X), \fBform\fP(3X).
+.SH NOTES
+The header file \fB<form.h>\fP automatically includes the header file
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines emulate the System V forms library.
+They were not supported on
+Version 7 or BSD versions.
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric S. Raymond.
diff --git a/man/form_new_page.3x b/man/form_new_page.3x
new file mode 100644
index 0000000..fa1660a
--- /dev/null
+++ b/man/form_new_page.3x
@@ -0,0 +1,75 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2015 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: form_new_page.3x,v 1.20 2022/02/12 20:03:40 tom Exp $
+.TH form_new_page 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.SH NAME
+\fBset_new_page\fP,
+\fBnew_page\fP \- form pagination functions
+.SH SYNOPSIS
+\fB#include <form.h>\fP
+.sp
+\fBint set_new_page(FIELD *\fIfield\fB, bool \fInew_page_flag\fB);\fR
+.br
+\fBbool new_page(const FIELD *\fIfield\fB);\fR
+.br
+.SH DESCRIPTION
+The function \fBset_new_page\fP sets or resets a flag marking the given field
+as the beginning of a new page on its form.
+.PP
+The function \fBnew_page\fP is a predicate which tests if a given field marks
+a page beginning on its form.
+.SH RETURN VALUE
+The function \fBnew_page\fP returns \fBTRUE\fP or \fBFALSE\fP.
+.PP
+The function \fBset_new_page\fP returns one of the following:
+.TP 5
+.B E_OK
+The routine succeeded.
+.TP 5
+.B E_CONNECTED
+The given field is already connected to a form.
+.SH SEE ALSO
+\fBcurses\fP(3X) and related pages whose names begin \*(``form_\*('' for detailed
+descriptions of the entry points.
+.SH NOTES
+The header file \fB<form.h>\fP automatically includes the header file
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines emulate the System V forms library.
+They were not supported on
+Version 7 or BSD versions.
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric S. Raymond.
diff --git a/man/form_opts.3x b/man/form_opts.3x
new file mode 100644
index 0000000..75ee62a
--- /dev/null
+++ b/man/form_opts.3x
@@ -0,0 +1,89 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2015 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: form_opts.3x,v 1.20 2022/02/12 20:03:40 tom Exp $
+.TH form_opts 3X ""
+.SH NAME
+\fBset_form_opts\fP,
+\fBform_opts_on\fP,
+\fBform_opts_off\fP,
+\fBform_opts\fP \- set and get form options
+.SH SYNOPSIS
+\fB#include <form.h>\fP
+.sp
+\fBint set_form_opts(FORM *\fIform\fB, Field_Options \fIopts\fB);\fR
+.br
+\fBField_Options form_opts(const FORM *\fIform\fB);\fR
+.sp
+\fBint form_opts_on(FORM *\fIform\fB, Field_Options \fIopts\fB);\fR
+.br
+\fBint form_opts_off(FORM *\fIform\fB, Field_Options \fIopts\fB);\fR
+.br
+.SH DESCRIPTION
+The function \fBset_form_opts\fP sets all the given form's option bits (form
+option bits may be logically-OR'ed together).
+.PP
+The function \fBform_opts_on\fP turns on the given option bits, and leaves
+others alone.
+.PP
+The function \fBform_opts_off\fP turns off the given option bits, and leaves
+others alone.
+.PP
+The function \fBform_opts\fP returns the form's current option bits.
+.PP
+The following options are defined (all are on by default):
+.TP 5
+O_NL_OVERLOAD
+Overload the \fBREQ_NEW_LINE\fP forms driver request so that calling it at the
+end of a field goes to the next field.
+.TP 5
+O_BS_OVERLOAD
+Overload the \fBREQ_DEL_PREV\fP forms driver request so that calling it at the
+beginning of a field goes to the previous field.
+.SH RETURN VALUE
+Except for \fBform_opts\fP, each routine returns one of the following:
+.TP 5
+.B E_OK
+The routine succeeded.
+.TP 5
+.B E_SYSTEM_ERROR
+System error occurred (see \fBerrno\fP(3)).
+.SH SEE ALSO
+\fBcurses\fP(3X), \fBform\fP(3X).
+.SH NOTES
+The header file \fB<form.h>\fP automatically includes the header file
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines emulate the System V forms library.
+They were not supported on
+Version 7 or BSD versions.
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric S. Raymond.
diff --git a/man/form_page.3x b/man/form_page.3x
new file mode 100644
index 0000000..5205859
--- /dev/null
+++ b/man/form_page.3x
@@ -0,0 +1,101 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2016 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: form_page.3x,v 1.22 2022/02/12 20:03:40 tom Exp $
+.TH form_page 3X ""
+.SH NAME
+\fBform_page\fP \- set and get form page number
+.SH SYNOPSIS
+\fB#include <form.h>\fP
+.sp
+\fBint set_current_field(FORM *\fIform\fB, FIELD *\fIfield\fB);\fR
+.br
+\fBFIELD *current_field(const FORM *\fIform\fB);\fR
+.sp
+\fBint unfocus_current_field(FORM *\fIform\fB);\fR
+.sp
+\fBint set_form_page(FORM *\fIform\fB, int \fIn\fB);\fR
+.br
+\fBint form_page(const FORM *\fIform\fB);\fR
+.sp
+\fBint field_index(const FIELD *\fIfield\fB);\fR
+.br
+.SH DESCRIPTION
+The function \fBset_current_field\fP sets the current field of the given
+form; \fBcurrent_field\fP returns the current field of the given form.
+.PP
+The function \fBunfocus_current_field\fP removes the focus from the current
+field of the form.
+In such state, inquiries via \fBcurrent_field\fP shall return a NULL pointer.
+.PP
+The function \fBset_form_page\fP sets the form's page number (goes to page
+\fIn\fP of the form).
+.PP
+The function \fBform_page\fP returns the form's current page number.
+.PP
+The function \fBfield_index\fP returns the index of the field in the
+field array of the form it is connected to.
+It returns \fBERR\fP if
+the argument is the null pointer or the field is not connected.
+.SH RETURN VALUE
+Except for \fBform_page\fP, each routine returns one of the following:
+.TP 5
+.B E_OK
+The routine succeeded.
+.TP 5
+.B E_BAD_ARGUMENT
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+.B E_BAD_STATE
+Routine was called from an initialization or termination function.
+.TP 5
+.B E_INVALID_FIELD
+Contents of a field are not valid.
+.TP 5
+.B E_REQUEST_DENIED
+The form driver could not process the request.
+.TP 5
+.B E_SYSTEM_ERROR
+System error occurred (see \fBerrno\fP(3)).
+.
+.SH SEE ALSO
+\fBcurses\fP(3X), \fBform\fP(3X).
+.SH NOTES
+The header file \fB<form.h>\fP automatically includes the header file
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines emulate the System V forms library.
+They were not supported on
+Version 7 or BSD versions.
+.PP
+The \fBunfocus_current_field\fP function is an ncurses extension.
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric S. Raymond.
diff --git a/man/form_post.3x b/man/form_post.3x
new file mode 100644
index 0000000..689ab97
--- /dev/null
+++ b/man/form_post.3x
@@ -0,0 +1,89 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2015,2017 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: form_post.3x,v 1.19 2022/02/12 20:03:40 tom Exp $
+.TH form_post 3X ""
+.SH NAME
+\fBpost_form\fP,
+\fBunpost_form\fP \- write or erase forms from associated subwindows
+.SH SYNOPSIS
+\fB#include <form.h>\fP
+.sp
+\fBint post_form(FORM *\fIform\fB);\fR
+.br
+\fBint unpost_form(FORM *\fIform\fB);\fR
+.br
+.SH DESCRIPTION
+The function \fBpost_form\fP displays a form to its associated subwindow.
+To trigger physical display of the subwindow,
+use \fBrefresh\fP(3X) or some equivalent
+\fBcurses\fP routine (the implicit \fBdoupdate\fP triggered by an \fBcurses\fP
+input request will do).
+.PP
+The function \fBunpost_form\fP erases form from its associated subwindow.
+.SH RETURN VALUE
+These routines return one of the following:
+.TP 5
+.B E_OK
+The routine succeeded.
+.TP 5
+.B E_BAD_ARGUMENT
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+.B E_BAD_STATE
+Routine was called from an initialization or termination function.
+.TP 5
+.B E_NOT_POSTED
+The form has not been posted.
+.TP 5
+.B E_NOT_CONNECTED
+No items are connected to the form.
+.TP 5
+.B E_NO_ROOM
+Form is too large for its window.
+.TP 5
+.B E_POSTED
+The form has already been posted.
+.TP 5
+.B E_SYSTEM_ERROR
+System error occurred (see \fBerrno\fP(3)).
+.
+.SH SEE ALSO
+\fBcurses\fP(3X), \fBform\fP(3X).
+.SH NOTES
+The header file \fB<form.h>\fP automatically includes the header file
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines emulate the System V forms library.
+They were not supported on
+Version 7 or BSD versions.
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric S. Raymond.
diff --git a/man/form_requestname.3x b/man/form_requestname.3x
new file mode 100644
index 0000000..e26dfd8
--- /dev/null
+++ b/man/form_requestname.3x
@@ -0,0 +1,70 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2015 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: form_requestname.3x,v 1.19 2022/02/12 20:03:40 tom Exp $
+.TH form_requestname 3X ""
+.SH NAME
+\fBform_request_by_name\fP,
+\fBform_request_name\fP \- handle printable form request names
+.SH SYNOPSIS
+\fB#include <form.h>\fP
+.sp
+\fBconst char *form_request_name(int \fIrequest\fB);\fR
+.br
+\fBint form_request_by_name(const char *\fIname\fB);\fR
+.br
+.SH DESCRIPTION
+.SS form_request_name
+The function \fBform_request_name\fP returns the printable name of a form
+request code.
+.SS form_request_name_by_name
+The function \fBform_request_by_name\fP searches in the name-table for a request
+with the given name and returns its request code.
+Otherwise E_NO_MATCH is returned.
+.SH RETURN VALUE
+\fBform_request_name\fP returns \fBNULL\fP on error and sets \fBerrno\fP
+to \fBE_BAD_ARGUMENT\fP.
+.PP
+\fBform_request_by_name\fP returns \fBE_NO_MATCH\fP on error.
+It does not set \fBerrno\fP.
+.SH SEE ALSO
+\fBcurses\fP(3X), \fBform\fP(3X).
+.SH NOTES
+The header file \fB<form.h>\fP automatically includes the header file
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines are specific to ncurses.
+They were not supported on
+Version 7, BSD or System V implementations.
+It is recommended that
+any code depending on them be conditioned using NCURSES_VERSION.
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric S. Raymond.
diff --git a/man/form_userptr.3x b/man/form_userptr.3x
new file mode 100644
index 0000000..47fcc29
--- /dev/null
+++ b/man/form_userptr.3x
@@ -0,0 +1,66 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2015 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: form_userptr.3x,v 1.22 2022/02/12 20:03:40 tom Exp $
+.TH form_userptr 3X ""
+.SH NAME
+\fBset_form_userptr\fP,
+\fBform_userptr\fP \- associate application data with a form item
+.SH SYNOPSIS
+\fB#include <form.h>\fP
+.sp
+\fBint set_form_userptr(FORM *\fIform\fB, void *\fIuserptr\fB);\fR
+.br
+\fBvoid* form_userptr(const FORM *\fIform\fB);\fR
+.br
+.SH DESCRIPTION
+Every form and every form item has a field that can be used to hold
+application-specific data (that is, the form-driver code leaves it alone).
+These functions get and set the form user pointer field.
+.SH RETURN VALUE
+The function \fBform_userptr\fP returns a pointer (which may be \fBNULL\fP).
+It does not set \fBerrno\fP.
+.PP
+The function \fBset_form_userptr\fP returns \fBE_OK\fP (success).
+.SH SEE ALSO
+\fBcurses\fP(3X), \fBform\fP(3X).
+.SH NOTES
+The header file \fB<form.h>\fP automatically includes the header file
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines emulate the System V forms library.
+They were not supported on
+Version 7 or BSD versions.
+.PP
+The user pointer is a void pointer.
+We chose not to leave it as a char pointer for SVr4 compatibility.
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric S. Raymond.
diff --git a/man/form_variables.3x b/man/form_variables.3x
new file mode 100644
index 0000000..5a1712d
--- /dev/null
+++ b/man/form_variables.3x
@@ -0,0 +1,81 @@
+.\"***************************************************************************
+.\" Copyright 2020,2021 Thomas E. Dickey                                     *
+.\" Copyright 2010-2013,2017 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: form_variables.3x,v 1.9 2021/12/25 21:50:36 tom Exp $
+.TH form_variables 3X ""
+.na
+.hy 0
+.SH NAME
+\fBTYPE_ALNUM\fP,
+\fBTYPE_ALPHA\fP,
+\fBTYPE_ENUM\fP,
+\fBTYPE_INTEGER\fP,
+\fBTYPE_IPV4\fP,
+\fBTYPE_NUMERIC\fP,
+\fBTYPE_REGEXP\fP
+\- form system global variables
+.ad
+.hy
+.SH SYNOPSIS
+.nf
+\fB#include <form.h>\fP
+.PP
+\fBFIELDTYPE * TYPE_ALNUM;\fP
+\fBFIELDTYPE * TYPE_ALPHA;\fP
+\fBFIELDTYPE * TYPE_ENUM;\fP
+\fBFIELDTYPE * TYPE_INTEGER;\fP
+\fBFIELDTYPE * TYPE_IPV4;\fP
+\fBFIELDTYPE * TYPE_NUMERIC;\fP
+\fBFIELDTYPE * TYPE_REGEXP;\fP
+.fi
+.SH DESCRIPTION
+These are building blocks for the form library,
+defining fields that can be created using
+the \fBform_fieldtype\fP(3X) functions.
+Each provides functions for field- and character-validation,
+according to the given datatype.
+.SS TYPE_ALNUM
+This holds alphanumeric data.
+.SS TYPE_ALPHA
+This holds alphabetic data.
+.SS TYPE_ENUM
+This holds an enumerated type.
+.SS TYPE_INTEGER
+This holds a decimal integer.
+.SS TYPE_IPV4
+This holds an IPv4 internet address, e.g., "127.0.0.1".
+.SS TYPE_NUMERIC
+This holds a decimal number, with optional sign and decimal point.
+.SS TYPE_REGEXP
+This holds a regular expression.
+.SH PORTABILITY
+The \fBTYPE_IPV4\fP variable is an extension not provided by older
+implementations of the form library.
+.SH SEE ALSO
+\fBform\fP(3X).
diff --git a/man/form_win.3x b/man/form_win.3x
new file mode 100644
index 0000000..49c007f
--- /dev/null
+++ b/man/form_win.3x
@@ -0,0 +1,96 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2006,2010 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: form_win.3x,v 1.21 2022/02/12 20:03:40 tom Exp $
+.TH form_win 3X ""
+.SH NAME
+\fBform_win\fP \- make and break form window and subwindow associations
+.SH SYNOPSIS
+\fB#include <form.h>\fP
+.sp
+\fBint set_form_win(FORM *\fIform\fB, WINDOW *\fIwin\fB);\fR
+.br
+\fBWINDOW *form_win(const FORM *\fIform\fB);\fR
+.sp
+\fBint set_form_sub(FORM *\fIform\fB, WINDOW *\fIsub\fB);\fR
+.br
+\fBWINDOW *form_sub(const FORM *\fIform\fB);\fR
+.sp
+\fBint scale_form(const FORM *\fIform\fB, int *\fIrows\fB, int *\fIcolumns\fB);\fR
+.br
+.SH DESCRIPTION
+Every form has an associated pair of \fBcurses\fP windows.
+The form window
+displays any title and border associated with the window; the form subwindow
+displays the items of the form that are currently available for selection.
+.PP
+The first four functions get and set those windows.
+It is not necessary to set
+either window; by default, the driver code uses \fBstdscr\fP for both.
+.PP
+In the \fBset_\fP functions, window argument of \fBNULL\fP is treated as though
+it were \fBstsdcr\fP.  A form argument of \fBNULL\fP is treated as a request
+to change the system default form window or subwindow.
+.PP
+The function \fBscale_form\fP returns the minimum size required for the
+subwindow of \fIform\fP.
+.SH RETURN VALUE
+Routines that return pointers return \fBNULL\fP on error.
+Routines that return
+an integer return one of the following error codes:
+.TP 5
+.B E_OK
+The routine succeeded.
+.TP 5
+.B E_SYSTEM_ERROR
+System error occurred (see \fBerrno\fP(3)).
+.TP 5
+.B E_BAD_ARGUMENT
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+.B E_POSTED
+The form has already been posted.
+.TP 5
+.B E_NOT_CONNECTED
+No items are connected to the form.
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBcurs_variables\fP(3X),
+\fBform\fP(3X).
+.SH NOTES
+The header file \fB<form.h>\fP automatically includes the header file
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines emulate the System V forms library.
+They were not supported on
+Version 7 or BSD versions.
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric S. Raymond.
diff --git a/man/infocmp.1m b/man/infocmp.1m
new file mode 100644
index 0000000..2b5d98e
--- /dev/null
+++ b/man/infocmp.1m
@@ -0,0 +1,644 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2017,2018 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: infocmp.1m,v 1.81 2022/02/12 20:02:20 tom Exp $
+.TH @INFOCMP@ 1M ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.ds n 5
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.de NS
+.ie n  .sp
+.el    .sp .5
+.ie n  .in +4
+.el    .in +2
+.nf
+.ft C			\" Courier
+..
+.de NE
+.fi
+.ft R
+.ie n  .in -4
+.el    .in -2
+..
+.ds d @TERMINFO@
+.SH NAME
+\fB@INFOCMP@\fP \- compare or print out \fIterminfo\fP descriptions
+.SH SYNOPSIS
+\fB@INFOCMP@\fP [\fB\-\
+1\
+C\
+D\
+E\
+F\
+G\
+I\
+K\
+L\
+T\
+U\
+V\
+W\
+c\
+d\
+e\
+g\
+i\
+l\
+n\
+p\
+q\
+r\
+t\
+u\
+x\
+\fP]
+.br
+      [\fB\-v\fR \fIn\fR] [\fB\-s d\fR| \fBi\fR| \fBl\fR| \fBc\fR] [\fB\-Q\fR \fIn\fR] [\fB\-R \fBsubset\fR]
+.br
+      [\fB\-w\fP\ \fIwidth\fP] [\fB\-A\fP\ \fIdirectory\fP] [\fB\-B\fP\ \fIdirectory\fP]
+.br
+      [\fItermname\fP...]
+.SH DESCRIPTION
+\fB@INFOCMP@\fP can be used to compare a binary \fBterminfo\fP entry with other
+terminfo entries, rewrite a \fBterminfo\fP description to take advantage of the
+\fBuse=\fP terminfo field, or print out a \fBterminfo\fP description from the
+binary file (\fBterm\fP) in a variety of formats.
+In all cases, the boolean
+fields will be printed first, followed by the numeric fields, followed by the
+string fields.
+.SS Default Options
+If no options are specified and zero or one \fItermnames\fP are specified, the
+\fB\-I\fP option will be assumed.
+If more than one \fItermname\fP is specified,
+the \fB\-d\fP option will be assumed.
+.SS Comparison Options [\-d] [\-c] [\-n]
+\fB@INFOCMP@\fP compares the \fBterminfo\fP description of the first terminal
+\fItermname\fP with each of the descriptions given by the entries for the other
+terminal's \fItermnames\fP.
+If a capability is defined for only one of the
+terminals, the value returned depends on the type of the capability:
+.bP
+\fBF\fP for missing boolean variables
+.bP
+\fBNULL\fP for missing integer or string variables
+.PP
+Use the \fB\-q\fP option to show the distinction between
+\fIabsent\fP and \fIcancelled\fP capabilities.
+.PP
+These options produce a list which you can use to compare two
+or more terminal descriptions:
+.TP 5
+\fB\-d\fP
+produces a list of each capability that is \fIdifferent\fP
+between two entries.
+Each item in the list shows \*(``:\*('' after the capability name,
+followed by the capability values, separated by a comma.
+.TP
+\fB\-c\fP
+produces a list of each capability that is \fIcommon\fP between
+two or more entries.
+Missing capabilities are ignored.
+Each item in the list shows \*(``=\*('' after the capability name,
+followed by the capability value.
+.IP
+The \fB\-u\fP option provides a related output,
+showing the first terminal description rewritten to use the second
+as a building block via the \*(``use=\*('' clause.
+.TP
+\fB\-n\fP
+produces a list of each capability that is in \fInone\fP of the given entries.
+Each item in the list shows \*(``!\*('' before the capability name.
+.IP
+Normally only the conventional capabilities are shown.
+Use the \fB\-x\fP option to add the BSD-compatibility
+capabilities (names prefixed with \*(``OT\*('').
+.IP
+If no \fItermnames\fP are given,
+\fB@INFOCMP@\fP uses the environment variable \fBTERM\fP
+for each of the \fItermnames\fP.
+.SS Source Listing Options [\-I] [\-L] [\-C] [\-r]
+The \fB\-I\fP, \fB\-L\fP, and \fB\-C\fP options will produce
+a source listing for each terminal named.
+.
+.TS
+center tab(/) ;
+l l .
+\fB\-I\fP/use the \fBterminfo\fP names
+\fB\-L\fP/use the long C variable name listed in <\fBterm.h\fP>
+\fB\-C\fP/use the \fBtermcap\fP names
+\fB\-r\fP/when using \fB\-C\fP, put out all capabilities in \fBtermcap\fP form
+\fB\-K\fP/modifies the \fB\-C\fP option, improving BSD-compatibility.
+.TE
+.PP
+If no \fItermnames\fP are given, the environment variable \fBTERM\fP will be
+used for the terminal name.
+.PP
+The source produced by the \fB\-C\fP option may be used directly as a
+\fBtermcap\fP entry, but not all parameterized strings can be changed to
+the \fBtermcap\fP format.
+\fB@INFOCMP@\fP will attempt to convert most of the
+parameterized information, and anything not converted will be plainly marked in
+the output and commented out.
+These should be edited by hand.
+.PP
+For best results when converting to \fBtermcap\fP format,
+you should use both \fB\-C\fP and \fB\-r\fP.
+Normally a termcap description is limited to 1023 bytes.
+\fB@INFOCMP@\fP trims away less essential parts to make it fit.
+If you are converting to one of the (rare) termcap implementations
+which accept an unlimited size of termcap,
+you may want to add the \fB\-T\fP option.
+More often however, you must help the termcap implementation,
+and trim excess whitespace (use the \fB\-0\fP option for that).
+.PP
+All padding information for strings will be collected together and placed
+at the beginning of the string where \fBtermcap\fP expects it.
+Mandatory
+padding (padding information with a trailing \*(``/\*('') will become optional.
+.PP
+All \fBtermcap\fP variables no longer supported by \fBterminfo\fP, but which
+are derivable from other \fBterminfo\fP variables, will be output.
+Not all
+\fBterminfo\fP capabilities will be translated; only those variables which were
+part of \fBtermcap\fP will normally be output.
+Specifying the \fB\-r\fP option
+will take off this restriction, allowing all capabilities to be output in
+\fItermcap\fP form.
+Normally you would use both the \fB\-C\fP and \fB\-r\fP options.
+The actual format used incorporates some improvements for escaped characters
+from terminfo format.
+For a stricter BSD-compatible translation, use the \fB\-K\fP option
+rather than \fB\-C\fP.
+.PP
+Note that because padding is collected to the beginning of the capability, not
+all capabilities are output.
+Mandatory padding is not supported.
+Because
+\fBtermcap\fP strings are not as flexible, it is not always possible to convert
+a \fBterminfo\fP string capability into an equivalent \fBtermcap\fP format.
+A subsequent conversion of the \fBtermcap\fP file
+back into \fBterminfo\fP format
+will not necessarily reproduce the original \fBterminfo\fP source.
+.PP
+Some common \fBterminfo\fP parameter sequences, their \fBtermcap\fP
+equivalents, and some terminal types which commonly have such sequences, are:
+.
+.TS
+center tab(/) ;
+l c l
+l l l.
+\fBterminfo/termcap\fP/Representative Terminals
+=
+\fB%p1%c/%.\fP/adm
+\fB%p1%d/%d\fP/hp, ANSI standard, vt100
+\fB%p1%'x'%+%c/%+x\fP/concept
+\fB%i/%i\fPq/ANSI standard, vt100
+\fB%p1%?%'x'%>%t%p1%'y'%+%;/%>xy\fP/concept
+\fB%p2\fP is printed before \fB%p1/%r\fP/hp
+.TE
+.SS Use= Option [\-u]
+The \fB\-u\fP option produces a \fBterminfo\fP source description of the first
+terminal \fItermname\fP which is relative to the sum of the descriptions given
+by the entries for the other terminals \fItermnames\fP.
+It does this by
+analyzing the differences between the first \fItermname\fP and the other
+\fItermnames\fP and producing a description with \fBuse=\fP fields for the
+other terminals.
+In this manner, it is possible to retrofit generic terminfo
+entries into a terminal's description.
+Or, if two similar terminals exist, but
+were coded at different times or by different people so that each description
+is a full description, using \fB@INFOCMP@\fP
+will show what can be done to change
+one description to be relative to the other.
+.PP
+A capability will be printed with an at-sign (@) if it no longer exists in the
+first \fItermname\fP, but one of the other \fItermname\fP entries contains a
+value for it.
+A capability's value will be printed if the value in the first
+\fItermname\fP is not found in any of the other \fItermname\fP entries, or if
+the first of the other \fItermname\fP entries that has this capability gives a
+different value for the capability than that in the first \fItermname\fP.
+.PP
+The order of the other \fItermname\fP entries is significant.
+Since the
+terminfo compiler \fB@TIC@\fP does a left-to-right scan of the capabilities,
+specifying two \fBuse=\fP entries that contain differing entries for the same
+capabilities will produce different results depending on the order that the
+entries are given in.
+\fB@INFOCMP@\fP will flag any such inconsistencies between
+the other \fItermname\fP entries as they are found.
+.PP
+Alternatively, specifying a capability \fIafter\fP a \fBuse=\fP entry that
+contains that capability will cause the second specification to be ignored.
+Using \fB@INFOCMP@\fP to recreate a description can be a useful check to make
+sure that everything was specified correctly in the original source
+description.
+.PP
+Another error that does not cause incorrect compiled files, but will slow down
+the compilation time, is specifying extra \fBuse=\fP fields that are
+superfluous.
+\fB@INFOCMP@\fP will flag any other \fItermname use=\fP fields that
+were not needed.
+.SS Changing Databases [\-A \fIdirectory\fR] [\-B \fIdirectory\fR]
+Like other \fBncurses\fP utilities,
+\fB@INFOCMP@\fP looks for the terminal descriptions in several places.
+You can use the \fBTERMINFO\fP and \fBTERMINFO_DIRS\fP environment variables
+to override the compiled-in default list of places to search
+(see \fBcurses\fP(3X) for details).
+.PP
+You can also use the options \fB\-A\fP
+and \fB\-B\fP to override the list of places to search
+when comparing terminal descriptions:
+.bP
+The \fB\-A\fP option sets the location for the first \fItermname\fP
+.bP
+The \fB\-B\fP option sets the location for the other \fItermnames\fP.
+.PP
+Using these options, it is possible to
+compare descriptions for a terminal with the same name located in two different
+databases.
+For instance,
+you can use this feature for comparing descriptions for the same terminal
+created by different people.
+.SS Other Options
+.TP 5
+\fB\-0\fP
+causes the fields to be printed on one line, without wrapping.
+.TP 5
+\fB\-1\fP
+causes the fields to be printed out one to a line.
+Otherwise,
+the fields will be printed several to a line to a maximum width
+of 60 characters.
+.TP
+\fB\-a\fP
+tells \fB@INFOCMP@\fP to retain commented-out capabilities
+rather than discarding them.
+Capabilities are commented by prefixing them with a period.
+.TP
+\fB\-D\fP
+tells \fB@INFOCMP@\fP to print the database locations that it knows about,
+and exit.
+.TP 5
+\fB\-E\fP
+Dump the capabilities of the given terminal as tables, needed in
+the C initializer for a
+TERMTYPE structure (the terminal capability structure in the \fB<term.h>\fP).
+This option is useful for preparing versions of the curses library hardwired
+for a given terminal type.
+The tables are all declared static, and are named according to the type
+and the name of the corresponding terminal entry.
+.sp
+Before ncurses 5.0, the split between the \fB\-e\fP and \fB\-E\fP
+options was not needed; but support for extended names required making
+the arrays of terminal capabilities separate from the TERMTYPE structure.
+.TP 5
+\fB\-e\fP
+Dump the capabilities of the given terminal as a C initializer for a
+TERMTYPE structure (the terminal capability structure in the \fB<term.h>\fP).
+This option is useful for preparing versions of the curses library hardwired
+for a given terminal type.
+.TP 5
+\fB\-F\fP
+compare terminfo files.
+This assumes that two following arguments are filenames.
+The files are searched for pairwise matches between
+entries, with two entries considered to match if any of their names do.
+The report printed to standard output lists entries with no matches in
+the other file, and entries with more than one match.
+For entries
+with exactly one match it includes a difference report.
+Normally,
+to reduce the volume of the report, use references are
+not resolved before looking for differences, but resolution can be forced
+by also specifying \fB\-r\fP.
+.TP 5
+\fB\-f\fP
+Display complex terminfo strings which contain if/then/else/endif expressions
+indented for readability.
+.TP 5
+\fB\-G\fP
+Display constant literals in decimal form
+rather than their character equivalents.
+.TP 5
+\fB\-g\fP
+Display constant character literals in quoted form
+rather than their decimal equivalents.
+.TP 5
+\fB\-i\fP
+Analyze the initialization (\fBis1\fP, \fBis2\fP, \fBis3\fP), and reset
+(\fBrs1\fP, \fBrs2\fP, \fBrs3\fP), strings in the entry,
+as well as those used for starting/stopping cursor-positioning mode
+(\fBsmcup\fP, \fBrmcup\fP) as well as starting/stopping keymap mode
+(\fBsmkx\fP, \fBrmkx\fP).
+.IP
+For each string, the
+code tries to analyze it into actions in terms of the other capabilities in the
+entry, certain X3.64/ISO 6429/ECMA\-48 capabilities, and certain DEC VT-series
+private modes (the set of recognized special sequences has been selected for
+completeness over the existing terminfo database).
+Each report line consists
+of the capability name, followed by a colon and space, followed by a printable
+expansion of the capability string with sections matching recognized actions
+translated into {}-bracketed descriptions.
+.IP
+Here is a list of the DEC/ANSI
+special sequences recognized:
+.TS
+center tab(/) ;
+l l
+l l.
+Action/Meaning
+=
+RIS/full reset
+SC/save cursor
+RC/restore cursor
+LL/home-down
+RSR/reset scroll region
+=
+DECSTR/soft reset (VT320)
+S7C1T/7-bit controls (VT220)
+=
+ISO DEC G0/enable DEC graphics for G0
+ISO UK G0/enable UK chars for G0
+ISO US G0/enable US chars for G0
+ISO DEC G1/enable DEC graphics for G1
+ISO UK G1/enable UK chars for G1
+ISO US G1/enable US chars for G1
+=
+DECPAM/application keypad mode
+DECPNM/normal keypad mode
+DECANSI/enter ANSI mode
+=
+ECMA[+\-]AM/keyboard action mode
+ECMA[+\-]IRM/insert replace mode
+ECMA[+\-]SRM/send receive mode
+ECMA[+\-]LNM/linefeed mode
+=
+DEC[+\-]CKM/application cursor keys
+DEC[+\-]ANM/set VT52 mode
+DEC[+\-]COLM/132-column mode
+DEC[+\-]SCLM/smooth scroll
+DEC[+\-]SCNM/reverse video mode
+DEC[+\-]OM/origin mode
+DEC[+\-]AWM/wraparound mode
+DEC[+\-]ARM/auto-repeat mode
+.TE
+.sp
+It also recognizes a SGR action corresponding to ANSI/ISO 6429/ECMA Set
+Graphics Rendition, with the values NORMAL, BOLD, UNDERLINE, BLINK, and
+REVERSE.
+All but NORMAL may be prefixed with
+.RS
+.bP
+\*(``+\*('' (turn on) or
+.bP
+\*(``\-\*('' (turn off).
+.RE
+.IP
+An SGR0 designates an empty highlight sequence (equivalent to {SGR:NORMAL}).
+.TP 5
+\fB\-l\fP
+Set output format to terminfo.
+.TP 5
+\fB\-p\fP
+Ignore padding specifications when comparing strings.
+.TP 5
+\fB\-Q\fP \fIn\fP
+Rather than show source in terminfo (text) format,
+print the compiled (binary) format in hexadecimal or base64 form,
+depending on the option's value:
+.RS 8
+.TP 3
+1
+hexadecimal
+.TP 3
+2
+base64
+.TP 3
+3
+hexadecimal and base64
+.RE
+.IP
+For example, this prints the compiled terminfo value as a string
+which could be assigned to the \fBTERMINFO\fP environment variable:
+.NS
+@INFOCMP@ -0 -q -Q2
+.NE
+.TP 5
+\fB\-q\fP
+This makes the output a little shorter:
+.RS
+.bP
+Make the comparison listing shorter by omitting subheadings, and using
+\*(``\-\*('' for absent capabilities, \*(``@\*(''
+for canceled rather than \*(``NULL\*(''.
+.bP
+However, show differences between absent and cancelled capabilities.
+.bP
+Omit the \*(``Reconstructed from\*('' comment for source listings.
+.RE
+.TP 5
+\fB\-R\fIsubset\fR
+Restrict output to a given subset.
+This option is for use with archaic
+versions of terminfo like those on SVr1, Ultrix, or HP-UX that do not support
+the full set of SVR4/XSI Curses terminfo; and variants such as AIX
+that have their own extensions incompatible with SVr4/XSI.
+.RS
+.bP
+Available terminfo
+subsets are \*(``SVr1\*('', \*(``Ultrix\*('', \*(``HP\*('', and \*(``AIX\*('';
+see \fBterminfo\fP(\*n) for details.
+.bP
+You can also choose the subset \*(``BSD\*('' which selects only capabilities
+with termcap equivalents recognized by 4.4BSD.
+The \fB\-C\fP option sets the \*(``BSD\*('' subset as a side-effect.
+.bP
+If you select any other value for \fB\-R\fP,
+it is the same as no subset, i.e., all capabilities are used.
+The \fB\-I\fP option likewise selects no subset as a side-effect.
+.RE
+.TP
+\fB\-s \fI[d|i|l|c]\fR
+The \fB\-s\fP option sorts the fields within each type according to the argument
+below:
+.br
+.RS 5
+.TP 5
+\fBd\fP
+leave fields in the order that they are stored in the \fIterminfo\fP database.
+.TP 5
+\fBi\fP
+sort by \fIterminfo\fP name.
+.TP 5
+\fBl\fP
+sort by the long C variable name.
+.TP 5
+\fBc\fP
+sort by the \fItermcap\fP name.
+.RE
+.IP
+If the \fB\-s\fP option is not given, the fields printed out will be
+sorted alphabetically by the \fBterminfo\fP name within each type,
+except in the case of the \fB\-C\fP or the \fB\-L\fP options, which cause the
+sorting to be done by the \fBtermcap\fP name or the long C variable
+name, respectively.
+.TP 5
+\fB\-T\fP
+eliminates size-restrictions on the generated text.
+This is mainly useful for testing and analysis, since the compiled
+descriptions are limited (e.g., 1023 for termcap, 4096 for terminfo).
+.TP
+\fB\-t\fP
+tells \fB@TIC@\fP to discard commented-out capabilities.
+Normally when translating from terminfo to termcap,
+untranslatable capabilities are commented-out.
+.TP 5
+\fB\-U\fP
+tells \fB@INFOCMP@\fP to not post-process the data
+after parsing the source file.
+This feature helps when comparing the actual contents of two source files,
+since it excludes the inferences that \fB@INFOCMP@\fP makes to fill in missing
+data.
+.TP 5
+\fB\-V\fP
+reports the version of ncurses which was used in this program, and exits.
+.TP 5
+\fB\-v\fP \fIn\fP
+prints out tracing information on standard error as the program runs.
+.IP
+The optional parameter \fIn\fP is a number from 1 to 10, inclusive,
+indicating the desired level of detail of information.
+If ncurses is built without tracing support, the optional parameter is ignored.
+.TP
+\fB\-W\fP
+By itself, the \fB\-w\fP option will not force long strings to be wrapped.
+Use the \fB\-W\fP option to do this.
+.TP 5
+\fB\-w\fP \fIwidth\fP
+changes the output to \fIwidth\fP characters.
+.TP
+\fB\-x\fP
+print information for user-defined capabilities (see \fBuser_caps(\*n)\fP.
+These are extensions to the terminfo repertoire which can be loaded
+using the \fB\-x\fP option of \fB@TIC@\fP.
+.SH FILES
+.TP 20
+\*d
+Compiled terminal description database.
+.SH HISTORY
+Although System V Release 2 provided a terminfo library,
+it had no documented tool for decompiling the terminal descriptions.
+Tony Hansen (AT&T) wrote the first \fBinfocmp\fP in early 1984,
+for System V Release 3.
+.PP
+Eric Raymond used the AT&T documentation in 1995 to provide an equivalent
+\fB@INFOCMP@\fP for ncurses.
+In addition, he added a few new features such as:
+.bP
+the \fB\-e\fP option, to support \fIfallback\fP
+(compiled-in) terminal descriptions
+.bP
+the \fB\-i\fP option, to help with analysis
+.PP
+Later, Thomas Dickey added the \fB\-x\fP (user-defined capabilities)
+option, and the \fB\-E\fP option to support fallback entries with
+user-defined capabilities.
+.PP
+For a complete list, see the \fIEXTENSIONS\fP section.
+.PP
+In 2010, Roy Marples provided an \fBinfocmp\fP program for NetBSD.
+It is less capable than the SVr4 or ncurses versions
+(e.g., it lacks the sorting options documented in X/Open),
+but does include the \fB\-x\fP option adapted from ncurses.
+.SH PORTABILITY
+X/Open Curses, Issue 7 (2009) provides a description of \fBinfocmp\fP.
+It does not mention the options used for converting to termcap format.
+.SH EXTENSIONS
+The
+\fB\-0\fP,
+\fB\-1\fP,
+\fB\-E\fP,
+\fB\-F\fP,
+\fB\-G\fP,
+\fB\-Q\fP,
+\fB\-R\fP,
+\fB\-T\fP,
+\fB\-V\fP,
+\fB\-a\fP,
+\fB\-e\fP,
+\fB\-f\fP,
+\fB\-g\fP,
+\fB\-i\fP,
+\fB\-l\fP,
+\fB\-p\fP,
+\fB\-q\fP and
+\fB\-t\fP
+options are not supported in SVr4 curses.
+.PP
+SVr4 infocmp does not distinguish between absent and cancelled capabilities.
+Also, it shows missing integer capabilities as \fB\-1\fP
+(the internal value used to represent missing integers).
+This implementation shows those as \*(``NULL\*('',
+for consistency with missing strings.
+.PP
+The \fB\-r\fP option's notion of \*(``termcap\*('' capabilities
+is System V Release 4's.
+Actual BSD curses versions will have a more restricted set.
+To see only the
+4.4BSD set, use \fB\-r\fP \fB\-RBSD\fP.
+.SH BUGS
+The \fB\-F\fP option of \fB@INFOCMP@\fP(1M) should be a \fB@TOE@\fP(1M) mode.
+.SH SEE ALSO
+\fB@CAPTOINFO@\fP(1M),
+\fB@INFOTOCAP@\fP(1M),
+\fB@TIC@\fP(1M),
+\fB@TOE@\fP(1M),
+\fBcurses\fP(3X),
+\fBterminfo\fP(\*n).
+\fBuser_caps\fP(\*n).
+.sp
+https://invisible-island.net/ncurses/tctest.html
+.PP
+This describes \fBncurses\fP
+version @NCURSES_MAJOR@.@NCURSES_MINOR@ (patch @NCURSES_PATCH@).
+.SH AUTHOR
+Eric S. Raymond <esr@snark.thyrsus.com>
+and
+.br
+Thomas E. Dickey <dickey@invisible-island.net>
diff --git a/man/infotocap.1m b/man/infotocap.1m
new file mode 100644
index 0000000..6fa0ad5
--- /dev/null
+++ b/man/infotocap.1m
@@ -0,0 +1,81 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1999-2010,2016 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: infotocap.1m,v 1.20 2022/02/12 20:02:20 tom Exp $
+.TH @INFOTOCAP@ 1M ""
+.ds n 5
+.ds d @TERMINFO@
+.SH NAME
+\fB@INFOTOCAP@\fP \- convert a \fIterminfo\fP description into a \fItermcap\fP description
+.SH SYNOPSIS
+\fB@INFOTOCAP@\fR [\fB\-v\fIn\fR \fIwidth\fR]  [\fB\-V\fR] [\fB\-1\fR] [\fB\-w\fR \fIwidth\fR] \fIfile\fR ...
+.SH DESCRIPTION
+\fB@INFOTOCAP@\fP looks in each given text
+\fIfile\fP for \fBterminfo\fP descriptions.
+For each terminfo description found,
+an equivalent \fBtermcap\fP description is written to standard output.
+Terminfo \fBuse\fP capabilities are translated directly to termcap
+\fBtc\fP capabilities.
+.TP 5
+\fB\-v\fP
+print out tracing information on standard error as the program runs.
+.TP 5
+\fB\-V\fP
+print out the version of the program in use on standard error and exit.
+.TP 5
+\fB\-1\fP
+cause the fields to print out one to a line.
+Otherwise, the fields
+will be printed several to a line to a maximum width of 60 characters.
+.TP 5
+\fB\-w\fP
+change the output to \fIwidth\fP characters.
+.SH FILES
+.TP 20
+\*d
+Compiled terminal description database.
+.SH NOTES
+This utility is actually a link to \fB@TIC@\fP, running in \fI\-C\fP mode.
+You can use other \fB@TIC@\fP options such as \fB\-f\fP and  \fB\-x\fP.
+.SH PORTABILITY
+None of X/Open Curses, Issue 7 (2009), SVr4 or NetBSD document this application.
+.SH SEE ALSO
+\fB@INFOCMP@\fP(1M),
+\fB@TIC@\fP(1M),
+\fBcurses\fP(3X),
+\fBterminfo\fP(\*n)
+.PP
+This describes \fBncurses\fP
+version @NCURSES_MAJOR@.@NCURSES_MINOR@ (patch @NCURSES_PATCH@).
+.SH AUTHOR
+Eric S. Raymond <esr@snark.thyrsus.com>
+and
+.br
+Thomas E. Dickey <dickey@invisible-island.net>
diff --git a/man/key_defined.3x b/man/key_defined.3x
new file mode 100644
index 0000000..d190c79
--- /dev/null
+++ b/man/key_defined.3x
@@ -0,0 +1,58 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 2003-2006,2010 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.                                                           *
+.\"***************************************************************************
+.\"
+.\" Author: Thomas E. Dickey 2003
+.\"
+.\" $Id: key_defined.3x,v 1.13 2022/02/12 20:03:40 tom Exp $
+.TH key_defined 3X ""
+.SH NAME
+\fBkey_defined\fP \- check if a keycode is defined
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBint key_defined(const char *\fIdefinition\fB);\fR
+.SH DESCRIPTION
+This is an extension to the curses library.
+It permits an application to determine if a string is currently bound
+to any keycode.
+.SH RETURN VALUE
+If the string is bound to a keycode, its value (greater than zero) is returned.
+If no keycode is bound, zero is returned.
+If the string conflicts with longer strings
+which are bound to keys, \-1 is returned.
+.SH PORTABILITY
+These routines are specific to ncurses.
+They were not supported on
+Version 7, BSD or System V implementations.
+It is recommended that
+any code depending on them be conditioned using NCURSES_VERSION.
+.SH SEE ALSO
+\fBdefine_key\fP(3X).
+.SH AUTHOR
+Thomas Dickey.
diff --git a/man/keybound.3x b/man/keybound.3x
new file mode 100644
index 0000000..a49b967
--- /dev/null
+++ b/man/keybound.3x
@@ -0,0 +1,61 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1999-2008,2010 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.                                                           *
+.\"***************************************************************************
+.\"
+.\" Author: Thomas E. Dickey 1999
+.\"
+.\" $Id: keybound.3x,v 1.14 2022/02/12 20:03:40 tom Exp $
+.TH keybound 3X ""
+.SH NAME
+\fBkeybound\fP \- return definition of keycode
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBchar * keybound(int \fIkeycode\fB, int \fIcount);\fR
+.SH DESCRIPTION
+This is an extension to the curses library.
+It permits an application to determine the string which is defined
+in the terminfo for specific keycodes.
+.SH RETURN VALUE
+The \fIkeycode\fP parameter must be greater than zero, else NULL is returned.
+If it does not correspond to a defined key, then NULL is returned.
+The \fIcount\fP parameter is used to allow the application to iterate
+through multiple definitions, counting from zero.
+When successful,
+the function returns a string which must be freed by the caller.
+.SH PORTABILITY
+These routines are specific to ncurses.
+They were not supported on
+Version 7, BSD or System V implementations.
+It is recommended that
+any code depending on them be conditioned using NCURSES_VERSION.
+.SH SEE ALSO
+\fBdefine_key\fP(3X),
+\fBkeyok\fP(3X).
+.SH AUTHOR
+Thomas Dickey.
diff --git a/man/keyok.3x b/man/keyok.3x
new file mode 100644
index 0000000..d31d5b1
--- /dev/null
+++ b/man/keyok.3x
@@ -0,0 +1,60 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2017 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.                                                           *
+.\"***************************************************************************
+.\"
+.\" Author: Thomas E. Dickey 1997
+.\"
+.\" $Id: keyok.3x,v 1.19 2022/02/12 20:03:40 tom Exp $
+.TH keyok 3X ""
+.SH NAME
+\fBkeyok\fP \- enable or disable a keycode
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBint keyok(int \fIkeycode\fB, bool \fIenable\fB);\fR
+.SH DESCRIPTION
+This is an extension to the curses library.
+It permits an application to disable specific keycodes, rather than
+use the \fBkeypad\fP function to disable all keycodes.
+Keys that have been disabled can be re-enabled.
+.SH RETURN VALUE
+The keycode must be greater than zero, else \fBERR\fP is returned.
+If it does not correspond to a defined key, then \fBERR\fP is returned.
+If the \fIenable\fP parameter is true, then the key must have been disabled,
+and vice versa.
+Otherwise, the function returns \fBOK\fP.
+.SH PORTABILITY
+These routines are specific to ncurses.
+They were not supported on
+Version 7, BSD or System V implementations.
+It is recommended that
+any code depending on them be conditioned using NCURSES_VERSION.
+.SH SEE ALSO
+\fBdefine_key\fP(3X).
+.SH AUTHOR
+Thomas Dickey.
diff --git a/man/legacy_coding.3x b/man/legacy_coding.3x
new file mode 100644
index 0000000..0fbd5c9
--- /dev/null
+++ b/man/legacy_coding.3x
@@ -0,0 +1,75 @@
+.\"***************************************************************************
+.\" Copyright 2020-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 2005-2016,2017 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.                                                           *
+.\"***************************************************************************
+.\"
+.\" Author: Thomas E. Dickey
+.\"
+.\" $Id: legacy_coding.3x,v 1.11 2022/02/12 20:07:56 tom Exp $
+.TH legacy_coding 3X ""
+.SH NAME
+\fBuse_legacy_coding\fP \- override locale-encoding checks
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBint use_legacy_coding(int \fIlevel\fB);\fR
+.SH DESCRIPTION
+The \fBuse_legacy_coding\fP function is an extension to the curses library.
+It allows the caller to change the result of \fBunctrl\fP,
+and suppress related checks within the library that would normally
+cause nonprinting characters to be rendered in visible form.
+This affects only 8-bit characters.
+.PP
+The \fIlevel\fP parameter controls the result:
+.RS
+.TP 5
+0
+the library functions normally,
+rendering nonprinting characters as described in \fBunctrl\fP.
+.TP
+1
+the library ignores \fBisprintf\fP for codes in the range 160-255.
+.TP
+2
+the library ignores \fBisprintf\fP for codes in the range 128-255.
+It also modifies the output of \fBunctrl\fP, showing codes in the
+range 128-159 as is.
+.RE
+.SH RETURN VALUE
+If the screen has not been initialized,
+or the \fIlevel\fP parameter is out of range,
+the function returns \fBERR\fP.
+Otherwise, it returns the previous level: \fB0\fP, \fB1\fP or \fB2\fP.
+.SH PORTABILITY
+This routine is specific to ncurses.
+It was not supported on Version 7, BSD or System V implementations.
+It is recommended that any code depending on ncurses extensions
+be conditioned using NCURSES_VERSION.
+.SH SEE ALSO
+\fBunctrl\fP(3X).
+.SH AUTHOR
+Thomas Dickey (to support lynx's font-switching feature).
diff --git a/man/make_sed.sh b/man/make_sed.sh
new file mode 100755
index 0000000..2a290f0
--- /dev/null
+++ b/man/make_sed.sh
@@ -0,0 +1,93 @@
+#!/bin/sh
+# $Id: make_sed.sh,v 1.16 2022/10/01 13:14:07 tom Exp $
+##############################################################################
+# Copyright 2020-2021,2022 Thomas E. Dickey                                  #
+# Copyright 1998-2005,2017 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey 1997
+#
+# Construct a sed-script to perform renaming within man-pages.  Originally
+# written in much simpler form, this one accounts for the common cases of
+# section-names in man-pages.
+
+if test $# != 1 ; then
+	echo '? expected a single filename'
+	exit 1
+fi
+
+COL=col$$
+INPUT=input$$
+UPPER=upper$$
+SCRIPT=script$$
+RESULT=result$$
+rm -f $UPPER $SCRIPT $RESULT
+trap "rm -f $COL.* $INPUT $UPPER $SCRIPT $RESULT; exit 1" 1 2 3 15
+trap "rm -f $COL.* $INPUT $UPPER $SCRIPT $RESULT" 0
+${FGREP-grep -F} -v \# "$1" | \
+sed	-e 's/[	][	]*/	/g' >$INPUT
+
+for F in 1 2 3 4
+do
+sed	-e 's/\./	/g' $INPUT | \
+cut	-f $F > $COL.$F
+done
+for F in 2 4
+do
+	tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ <$COL.$F >$UPPER
+	mv $UPPER $COL.$F
+done
+paste $COL.* | \
+sed	-e 's/^/s\/\\</' \
+	-e 's/$/\//' >$UPPER
+
+{
+echo "# Do the TH lines"
+sed	-e 's/\//\/TH /' \
+	-e 's/	/ /' \
+	-e 's/	/ ""\/TH /' \
+	-e 's/	/ /' \
+	-e 's/\/$/ ""\//' \
+	$UPPER
+
+echo "# Do the embedded references"
+sed	-e 's/</<fB/' \
+	-e 's/	/\\\\fP(/' \
+	-e 's/	/)\/fB/' \
+	-e 's/	/\\\\fP(/' \
+	-e 's/\/$/)\//' \
+	$UPPER
+
+echo '# Do the \\fBxxx\\fP references in the .NAME section'
+sed	-e 's/\\</^\\\\fB/' \
+	-e 's/	[^	]*	/\\\\f[RP] -\/\\\\fB/' \
+	-e 's/	.*$/\\\\fP -\//' \
+	$UPPER
+} >>$RESULT
+
+# Finally, send the result to standard output
+cat $RESULT
diff --git a/man/man_db.renames.in b/man/man_db.renames.in
new file mode 100644
index 0000000..fb306e0
--- /dev/null
+++ b/man/man_db.renames.in
@@ -0,0 +1,189 @@
+##############################################################################
+# Copyright 2019-2020,2022 Thomas E. Dickey                                  #
+# Copyright 1998-2015,2017 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: man_db.renames.in,v 1.59 2022/10/22 16:41:43 tom Exp $
+# Manual-page renamings for the man_db program
+#
+# Files:
+captoinfo.1m			captoinfo.1
+clear.1				clear.1
+curs_add_wch.3x			add_wch.3ncurses
+curs_add_wchstr.3x		add_wchstr.3ncurses
+curs_addch.3x			addch.3ncurses
+curs_addchstr.3x		addchstr.3ncurses
+curs_addstr.3x			addstr.3ncurses
+curs_addwstr.3x			addwstr.3ncurses
+curs_attr.3x			attr.3ncurses
+curs_beep.3x			beep.3ncurses
+curs_bkgd.3x			bkgd.3ncurses
+curs_bkgrnd.3x			bkgrnd.3ncurses
+curs_border.3x			border.3ncurses
+curs_border_set.3x		border_set.3ncurses
+curs_clear.3x			clear.3ncurses
+curs_color.3x			color.3ncurses
+curs_delch.3x			delch.3ncurses
+curs_deleteln.3x		deleteln.3ncurses
+curs_extend.3x			extensions.3ncurses
+curs_get_wch.3x			get_wch.3ncurses
+curs_get_wstr.3x		get_wstr.3ncurses
+curs_getcchar.3x		getcchar.3ncurses
+curs_getch.3x			getch.3ncurses
+curs_getstr.3x			getstr.3ncurses
+curs_getyx.3x			getyx.3ncurses
+curs_in_wch.3x			in_wch.3ncurses
+curs_in_wchstr.3x		in_wchstr.3ncurses
+curs_inch.3x			inch.3ncurses
+curs_inchstr.3x			inchstr.3ncurses
+curs_initscr.3x			initscr.3ncurses
+curs_inopts.3x			inopts.3ncurses
+curs_ins_wch.3x			ins_wch.3ncurses
+curs_ins_wstr.3x		ins_wstr.3ncurses
+curs_insch.3x			insch.3ncurses
+curs_insstr.3x			insstr.3ncurses
+curs_instr.3x			instr.3ncurses
+curs_inwstr.3x			inwstr.3ncurses
+curs_kernel.3x			kernel.3ncurses
+curs_legacy.3x			legacy.3ncurses
+curs_memleaks.3x		memleaks.3ncurses
+curs_mouse.3x			mouse.3ncurses
+curs_move.3x			move.3ncurses
+curs_opaque.3x			opaque.3ncurses
+curs_outopts.3x			outopts.3ncurses
+curs_overlay.3x			overlay.3ncurses
+curs_pad.3x			pad.3ncurses
+curs_print.3x			print.3ncurses
+curs_printw.3x			printw.3ncurses
+curs_refresh.3x			refresh.3ncurses
+curs_scanw.3x			scanw.3ncurses
+curs_scr_dump.3x		scr_dump.3ncurses
+curs_scroll.3x			scroll.3ncurses
+curs_slk.3x			slk.3ncurses
+curs_sp_funcs.3x		sp_funcs.3ncurses
+curs_termattrs.3x		termattrs.3ncurses
+curs_termcap.3x			termcap.3ncurses
+curs_terminfo.3x		terminfo.3ncurses
+curs_threads.3x			threads.3ncurses
+curs_touch.3x			touch.3ncurses
+curs_trace.3x			trace.3ncurses
+curs_util.3x			util.3ncurses
+curs_variables.3x		curses_variables.3ncurses
+curs_window.3x			window.3ncurses
+curses.3x			ncurses.3ncurses
+default_colors.3x		default_colors.3ncurses
+define_key.3x			define_key.3ncurses
+form.3x				form.3form
+form_cursor.3x			cursor.3form
+form_data.3x			data.3form
+form_driver.3x			driver.3form
+form_field.3x			field.3form
+form_field_attributes.3x	field_attributes.3form
+form_field_buffer.3x		field_buffer.3form
+form_field_info.3x		field_info.3form
+form_field_just.3x		field_just.3form
+form_field_new.3x		field_new.3form
+form_field_opts.3x		field_opts.3form
+form_field_userptr.3x		field_userptr.3form
+form_field_validation.3x	field_validation.3form
+form_fieldtype.3x		fieldtype.3form
+form_hook.3x			hook.3form
+form_new.3x			new.3form
+form_new_page.3x		new_page.3form
+form_opts.3x			opts.3form
+form_page.3x			page.3form
+form_post.3x			post.3form
+form_requestname.3x		requestname.3form
+form_userptr.3x			userptr.3form
+form_variables.3x		form_variables.3form
+form_win.3x			win.3form
+infocmp.1m			infocmp.1
+infotocap.1m			infotocap.1
+key_defined.3x			key_defined.3ncurses
+keybound.3x			keybound.3ncurses
+keyok.3x			keyok.3ncurses
+legacy_coding.3x		legacy_coding.3ncurses
+menu.3x				menu.3menu
+menu_attributes.3x		attributes.3menu
+menu_cursor.3x			cursor.3menu
+menu_driver.3x			driver.3menu
+menu_format.3x			format.3menu
+menu_hook.3x			hook.3menu
+menu_items.3x			items.3menu
+menu_mark.3x			mark.3menu
+menu_new.3x			new.3menu
+menu_opts.3x			opts.3menu
+menu_pattern.3x			pattern.3menu
+menu_post.3x			post.3menu
+menu_requestname.3x		requestname.3menu
+menu_spacing.3x			spacing.3menu
+menu_userptr.3x			userptr.3menu
+menu_win.3x			win.3menu
+mitem_current.3x		menu_current.3menu
+mitem_name.3x			menu_name.3menu
+mitem_new.3x			menu_new.3menu
+mitem_opts.3x			menu_opts.3menu
+mitem_userptr.3x		menu_userptr.3menu
+mitem_value.3x			menu_value.3menu
+mitem_visible.3x		menu_visible.3menu
+ncurses.3x			ncurses.3ncurses
+new_pair.3x			new_pair.3ncurses
+panel.3x			panel.3curses
+printf.3s			printf.3
+putc.3s 			putc.3
+resizeterm.3x			resizeterm.3ncurses
+scanf.3s			scanf.3
+scr_dump.5			scr_dump.5
+system.3s			system.3
+tabs.1				tabs.1
+term.5				term.5
+term.7				term.7
+term_variables.3x		terminfo_variables.3ncurses
+terminfo.5			terminfo.5
+terminfo.\\\*n			terminfo.5
+tic.1m				tic.1
+toe.1m				toe.1
+tput.1				tput.1
+tset.1				tset.1
+user_caps.5			user_caps.5
+wresize.3x			wresize.3ncurses
+#
+# Other:
+tack.1m				tack.1
+#
+getty.1				getty.8
+scanf.3				scanf.3
+ttys.5				ttys.4
+system.3			system.3
+regcomp.3x			regcomp.3
+regexec.3x			regexec.3
+vprintf.3			vprintf.3
+#
+# The following are pages which may be generated depending on configuration:
+adacurses@USE_CFG_SUFFIX@-config.1	adacurses@USE_CFG_SUFFIX@-config.1
+ncurses@USE_CFG_SUFFIX@-config.1	ncurses@USE_CFG_SUFFIX@-config.1
+#
+# vile:cfgmode
diff --git a/man/manhtml.aliases b/man/manhtml.aliases
new file mode 100644
index 0000000..1f85bc5
--- /dev/null
+++ b/man/manhtml.aliases
@@ -0,0 +1,73 @@
+# $Id: manhtml.aliases,v 1.21 2022/11/26 13:57:22 tom Exp $
+#***************************************************************************
+# Copyright 2019-2020,2022 Thomas E. Dickey                                *
+# Copyright 2013,2017 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.                                                           *
+#***************************************************************************
+# Items in this list will be linked to the corresponding manpages by man2html
+addch(3X)		curs_addch(3X)
+assume_default_colors(3X)	default_colors(3X)
+clearok(3X)		curs_outopts(3X)
+curs_set(3X)		curs_kernel(3X)
+delscreen(3X)		curs_initscr(3X)
+doupdate(3X)		curs_refresh(3X)
+endwin(3X)		curs_initscr(3X)
+filter(3X)		curs_util(3X)
+get_wch(3X)		curs_get_wch(3X)
+getcchar(3X)		curs_getcchar(3X)
+getch(3X)		curs_getch(3X)
+immedok(3X)		curs_outopts(3X)
+inch(3X)		curs_inch(3X)
+infocmp(1)		infocmp(1M)
+initscr(3X)		curs_initscr(3X)
+is_scrollok(3X)		curs_opaque(3X)
+keypad(3X)		curs_inopts(3X)
+longname(3X)		curs_termattrs(3X)
+meta(3X)		curs_inopts(3X)
+mvcur(3X)		curs_terminfo(3X)
+mvwin(3X)		curs_window(3X)
+newterm(3X)		curs_initscr(3X)
+refresh(3X)		curs_refresh(3X)
+reset_shell_mode(3X)	curs_kernel(3X)
+restartterm(3X)		curs_terminfo(3X)
+set_term(3X)		curs_initscr(3X)
+setcchar(3X)		curs_getcchar(3X)
+setupterm(3X)		curs_terminfo(3X)
+slk_init(3X)		curs_slk(3X)
+slk_touch(3X)		curs_slk(3X)
+tic(1)			tic(1M)
+tigetstr(3X)		curs_terminfo(3X)
+tparm(3X)		curs_terminfo(3X)
+tputs(3X)		curs_terminfo(3X)
+use_default_colors(3X)	default_colors(3X)
+use_env(3X)		curs_util(3X)
+use_extended_names(3X)	curs_extend(3X)
+use_legacy_coding(3X)	legacy_coding(3X)
+vidputs(3X)		curs_terminfo(3X)
+wbkgdset(3X)		curs_bkgd(3X)
+wgetch(3X)		curs_getch(3X)
+wnoutrefresh(3X)	curs_refresh(3X)
+wrefresh(3X)		curs_refresh(3X)
diff --git a/man/manhtml.externs b/man/manhtml.externs
new file mode 100644
index 0000000..5874b27
--- /dev/null
+++ b/man/manhtml.externs
@@ -0,0 +1,75 @@
+# $Id: manhtml.externs,v 1.15 2021/12/26 00:02:52 tom Exp $
+# Items in this list will not be linked by man2html
+#***************************************************************************
+# Copyright 2019-2020,2021 Thomas E. Dickey                                *
+# Copyright 2013,2017 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.                                                           *
+#***************************************************************************
+ADACURSES(1)
+COLOR_PAIR(1)
+COLOR_PAIR(2)
+COLOR_PAIR(3)
+atoi(3)
+conflict(1)
+cron(1)
+csh(1)
+ded(1)
+emacs(1)
+environ(7)
+errno(3)
+file(1)
+getty(1)
+jove(1)
+lynx(1)
+nvi(1)
+mutt(1)
+od(1)
+printf(3)
+profile(5)
+putc(3)
+putchar(3)
+putwc(3)
+read(2)
+readline(3)
+resize(1)
+scanf(3)
+screen(1)
+setlocale(3)
+sh(1)
+sscanf(3)
+stdio(3)
+stty(1)
+system(3)
+termios(3)
+tmux(1)
+tty(4)
+ttys(5)
+vi(1)
+vprintf(3)
+vscanf(3)
+wcwidth(3)
+write(2)
+xterm(1)
diff --git a/man/manlinks.sed b/man/manlinks.sed
new file mode 100644
index 0000000..09b055f
--- /dev/null
+++ b/man/manlinks.sed
@@ -0,0 +1,107 @@
+# $Id: manlinks.sed,v 1.15 2021/01/05 20:30:00 tom Exp $
+##############################################################################
+# Copyright 2020,2021 Thomas E. Dickey                                       #
+# Copyright 2000-2003,2008 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.                                                             #
+##############################################################################
+# Given a manpage (nroff) as input, writes a list of the names that are
+# listed in the "NAME" section, i.e., the names that we would like to use
+# as aliases for the manpage -T.Dickey
+#
+# eliminate formatting controls that get in the way
+/^'\\"/d
+/\.\\"/d
+/^\.br/d
+/^\.sp/d
+/typedef/d
+s/^\.IX//
+s/\\f.//g
+s/[:,]/ /g
+#
+# ignore C-style comments
+s%/\*.*\*/%%
+#
+# eliminate unnecessary whitespace, convert multiple blanks to single space
+s/^[ 	][ 	]*//
+s/[ 	][ 	]*$//
+s/[ 	][ 	]*/ /g
+/^$/d
+#
+# convert ".SH" into a more manageable form
+s/\.SH[ 	][ 	]*/.SH_(/
+#
+# in ".SH NAME"
+# change "\-" to "-", eliminate text after "-", and split the remaining lines
+# at each space, making a list of names:
+/^\.SH_(NAME/,/^\.SH_(SYNOPSIS/{
+s/\\-.*/ -/
+/ -/{
+s/ -.*//
+s/ /\
+/g
+}
+/^-/{
+d
+}
+s/ /\
+/g
+}
+#
+# in ".SH SYNOPSIS"
+# remove any line that does not contain a '(', since we only want functions.
+# then strip off return-type of each function.
+# finally, remove the parameter list, which begins with a '('.
+/^\.SH_(SYNOPSIS/,/^\.SH_(DESCRIPTION/{
+/^[^(]*$/d
+# reduce
+#	.B "int add_wch( const cchar_t *\fIwch\fB );"
+# to
+#	add_wch( const cchar_t *\fIwch\fB );"
+s/^\([^ (]* [^ (]* [*]*\)//g
+s/^\([^ (]* [*]*\)//g
+# trim blanks in case we have
+#	void (*) (FORM *) field_init(const FORM *form);
+s/) (/)(/g
+# reduce stuff like
+#	void (*)(FORM *) field_init(const FORM *form);
+# to
+#	field_init(const FORM *form);
+s/^\(([^)]*)\)\(([^)]*)\)*[ ]*//g
+# rename marker temporarily
+s/\.SH_(/.SH_/
+# kill lines with ");", and trim off beginning of argument list.
+s/[()].*//
+# rename marker back
+s/\.SH_/.SH_(/
+}
+#
+# delete ".SH DESCRIPTION" and following lines
+/^\.SH_(DESCRIPTION/,${
+d
+}
+#
+# delete any remaining directives
+/^\./d
diff --git a/man/menu.3x b/man/menu.3x
new file mode 100644
index 0000000..ea16bf6
--- /dev/null
+++ b/man/menu.3x
@@ -0,0 +1,213 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2020,2021 Thomas E. Dickey                                *
+.\" Copyright 1998-2014,2017 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: menu.3x,v 1.29 2021/12/25 21:49:32 tom Exp $
+.TH menu 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.SH NAME
+\fBmenu\fP \- curses extension for programming menus
+.SH SYNOPSIS
+\fB#include <menu.h>\fP
+.br
+.SH DESCRIPTION
+The \fBmenu\fP library provides terminal-independent facilities for composing
+menu systems on character-cell terminals.
+The library includes: item routines,
+which create and modify menu items; and menu routines, which group items into
+menus, display menus on the screen, and handle interaction with the user.
+.PP
+The \fBmenu\fP library uses the \fBcurses\fP libraries, and a curses
+initialization routine such as \fBinitscr\fP must be called before using any of
+these functions.
+To use the \fBmenu\fP library, link with the options
+\fB\-lmenu \-lcurses\fP.
+.
+.SS Current Default Values for Item Attributes
+.
+The \fBmenu\fP library maintains a default value for item attributes.
+You can
+get or set this default by calling the appropriate \fBget_\fP or \fBset_\fP
+routine with a \fBNULL\fP item pointer.
+Changing this default with a
+\fBset_\fP function affects future item creations, but does not change the
+rendering of items already created.
+.
+.SS Routine Name Index
+.
+The following table lists each \fBmenu\fP routine and the name of
+the manual page on which it is described.
+.
+.TS
+l l .
+\fBcurses\fP Routine Name	Manual Page Name
+=
+current_item	\fBmitem_current\fP(3X)
+free_item 	\fBmitem_new\fP(3X)
+free_menu 	\fBmenu_new\fP(3X)
+item_count	\fBmenu_items\fP(3X)
+item_description	\fBmitem_name\fP(3X)
+item_index	\fBmitem_current\fP(3X)
+item_init 	\fBmenu_hook\fP(3X)
+item_name 	\fBmitem_name\fP(3X)
+item_opts 	\fBmitem_opts\fP(3X)
+item_opts_off	\fBmitem_opts\fP(3X)
+item_opts_on	\fBmitem_opts\fP(3X)
+item_term 	\fBmenu_hook\fP(3X)
+item_userptr	\fBmitem_userptr\fP(3X)
+item_value	\fBmitem_value\fP(3X)
+item_visible	\fBmitem_visible\fP(3X)
+menu_back 	\fBmenu_attributes\fP(3X)
+menu_driver	\fBmenu_driver\fP(3X)
+menu_fore 	\fBmenu_attributes\fP(3X)
+menu_format	\fBmenu_format\fP(3X)
+menu_grey 	\fBmenu_attributes\fP(3X)
+menu_init 	\fBmenu_hook\fP(3X)
+menu_items	\fBmenu_items\fP(3X)
+menu_mark 	\fBmenu_mark\fP(3X)
+menu_opts 	\fBmenu_opts\fP(3X)
+menu_opts_off	\fBmenu_opts\fP(3X)
+menu_opts_on	\fBmenu_opts\fP(3X)
+menu_pad  	\fBmenu_attributes\fP(3X)
+menu_pattern	\fBmenu_pattern\fP(3X)
+menu_request_by_name	\fBmenu_requestname\fP(3X)
+menu_request_name	\fBmenu_requestname\fP(3X)
+menu_spacing	\fBmenu_spacing\fP(3X)
+menu_sub  	\fBmenu_win\fP(3X)
+menu_term 	\fBmenu_hook\fP(3X)
+menu_userptr	\fBmenu_userptr\fP(3X)
+menu_win  	\fBmenu_win\fP(3X)
+new_item  	\fBmitem_new\fP(3X)
+new_menu  	\fBmenu_new\fP(3X)
+pos_menu_cursor	\fBmenu_cursor\fP(3X)
+post_menu 	\fBmenu_post\fP(3X)
+scale_menu	\fBmenu_win\fP(3X)
+set_current_item	\fBmitem_current\fP(3X)
+set_item_init	\fBmenu_hook\fP(3X)
+set_item_opts	\fBmitem_opts\fP(3X)
+set_item_term	\fBmenu_hook\fP(3X)
+set_item_userptr	\fBmitem_userptr\fP(3X)
+set_item_value	\fBmitem_value\fP(3X)
+set_menu_back	\fBmenu_attributes\fP(3X)
+set_menu_fore	\fBmenu_attributes\fP(3X)
+set_menu_format	\fBmenu_format\fP(3X)
+set_menu_grey	\fBmenu_attributes\fP(3X)
+set_menu_init	\fBmenu_hook\fP(3X)
+set_menu_items	\fBmenu_items\fP(3X)
+set_menu_mark	\fBmenu_mark\fP(3X)
+set_menu_opts	\fBmitem_opts\fP(3X)
+set_menu_pad	\fBmenu_attributes\fP(3X)
+set_menu_pattern	\fBmenu_pattern\fP(3X)
+set_menu_spacing	\fBmenu_spacing\fP(3X)
+set_menu_sub	\fBmenu_win\fP(3X)
+set_menu_term	\fBmenu_hook\fP(3X)
+set_menu_userptr	\fBmenu_userptr\fP(3X)
+set_menu_win	\fBmenu_win\fP(3X)
+set_top_row	\fBmitem_current\fP(3X)
+top_row   	\fBmitem_current\fP(3X)
+unpost_menu	\fBmenu_post\fP(3X)
+.TE
+.SH RETURN VALUE
+Routines that return pointers return \fBNULL\fP on error.
+Routines that return
+an integer return one of the following error codes:
+.TP 5
+.B E_OK
+The routine succeeded.
+.TP 5
+.B E_BAD_ARGUMENT
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+.B E_BAD_STATE
+Routine was called from an initialization or termination function.
+.TP 5
+.B E_NO_MATCH
+Character failed to match.
+.TP 5
+.B E_NO_ROOM
+Menu is too large for its window.
+.TP 5
+.B E_NOT_CONNECTED
+No items are connected to the menu.
+.TP 5
+.B E_NOT_POSTED
+The menu has not been posted.
+.TP 5
+.B E_NOT_SELECTABLE
+The designated item cannot be selected.
+.TP 5
+.B E_POSTED
+The menu is already posted.
+.TP 5
+.B E_REQUEST_DENIED
+The menu driver could not process the request.
+.TP 5
+.B E_SYSTEM_ERROR
+System error occurred (see \fBerrno\fP(3)).
+.TP 5
+.B E_UNKNOWN_COMMAND
+The menu driver code saw an unknown request code.
+.SH NOTES
+The header file \fB<menu.h>\fP automatically includes the header files
+\fB<curses.h>\fP and \fB<eti.h>\fP.
+.PP
+In your library list, libmenu.a should be before libncurses.a; that is,
+you should say \*(``\-lmenu \-lncurses\*('', not the other way around
+(which would give a link-error when using static libraries).
+.SH PORTABILITY
+These routines emulate the System V menu library.
+They were not supported on
+Version 7 or BSD versions.
+.PP
+The menu facility was documented in SVr4.2 in
+\fICharacter User Interface Programming (UNIX SVR4.2)\fP.
+.PP
+It is not part of X/Open Curses.
+.PP
+Aside from ncurses, there are few implementations:
+.bP
+systems based on SVr4 source code, e.g., Solaris.
+.bP
+NetBSD curses.
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for ncurses by Eric S. Raymond.
+.SH SEE ALSO
+\fBcurses\fP(3X) and related pages whose names begin \*(``menu_\*(''
+for detailed descriptions of the entry points.
+.PP
+This describes \fBncurses\fP
+version @NCURSES_MAJOR@.@NCURSES_MINOR@ (patch @NCURSES_PATCH@).
diff --git a/man/menu_attributes.3x b/man/menu_attributes.3x
new file mode 100644
index 0000000..9193c19
--- /dev/null
+++ b/man/menu_attributes.3x
@@ -0,0 +1,113 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2015 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: menu_attributes.3x,v 1.22 2022/02/12 20:05:11 tom Exp $
+.TH menu_attributes 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.SH NAME
+\fBmenu_back\fP,
+\fBmenu_fore\fP,
+\fBmenu_grey\fP,
+\fBmenu_pad\fP,
+\fBset_menu_back\fP,
+\fBset_menu_fore\fP,
+\fBset_menu_grey\fP,
+\fBset_menu_pad\fP \- color and attribute control for menus
+.SH SYNOPSIS
+\fB#include <menu.h>\fP
+.sp
+\fBint set_menu_fore(MENU *\fImenu\fB, chtype \fIattr\fB);\fR
+.br
+\fBchtype menu_fore(const MENU *\fImenu\fB);\fR
+.sp
+\fBint set_menu_back(MENU *\fImenu\fB, chtype \fIattr\fB);\fR
+.br
+\fBchtype menu_back(const MENU *\fImenu\fB);\fR
+.sp
+\fBint set_menu_grey(MENU *\fImenu\fB, chtype \fIattr\fB);\fR
+.br
+\fBchtype menu_grey(const MENU *\fImenu\fB);\fR
+.sp
+\fBint set_menu_pad(MENU *\fImenu\fB, int \fIpad\fB);\fR
+.br
+\fBint menu_pad(const MENU *\fImenu\fB);\fR
+.br
+.SH DESCRIPTION
+The function \fBset_menu_fore\fP sets the foreground attribute of
+\fImenu\fP. This is the highlight used for selected menu items.
+\fBmenu_fore\fP returns the foreground attribute.
+The default
+is \fBA_REVERSE\fP.
+.PP
+The function \fBset_menu_back\fP sets the background attribute of
+\fImenu\fP. This is the highlight used for selectable (but not currently
+selected) menu items.
+The function \fBmenu_back\fP returns the background
+attribute.
+The default is \fBA_NORMAL\fP.
+.PP
+The function \fBset_menu_grey\fP sets the grey attribute of \fImenu\fP. This is
+the highlight used for un-selectable menu items in menus that permit more than
+one selection.
+The function \fBmenu_grey\fP returns the grey attribute.
+The default is \fBA_UNDERLINE\fP.
+.PP
+The function \fBset_menu_pad\fP sets the character used to fill the space
+between the name and description parts of a menu item.
+\fBmenu_pad\fP returns
+the given menu's pad character.
+The default is a blank.
+.SH RETURN VALUE
+These routines return one of the following:
+.TP 5
+.B E_OK
+The routine succeeded.
+.TP 5
+.B E_SYSTEM_ERROR
+System error occurred (see \fBerrno\fP(3)).
+.TP 5
+.B E_BAD_ARGUMENT
+Routine detected an incorrect or out-of-range argument.
+.SH SEE ALSO
+\fBcurses\fP(3X) and related pages whose names begin \*(``menu_\*('' for detailed
+descriptions of the entry points.
+.SH NOTES
+The header file \fB<menu.h>\fP automatically includes the header file
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines emulate the System V menu library.
+They were not supported on
+Version 7 or BSD versions.
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric S. Raymond.
diff --git a/man/menu_cursor.3x b/man/menu_cursor.3x
new file mode 100644
index 0000000..28b2840
--- /dev/null
+++ b/man/menu_cursor.3x
@@ -0,0 +1,70 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2015 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: menu_cursor.3x,v 1.16 2022/02/12 20:05:11 tom Exp $
+.TH menu_cursor 3X ""
+.SH NAME
+\fBpos_menu_cursor\fP \- position a menu's cursor
+.SH SYNOPSIS
+\fB#include <menu.h>\fP
+.sp
+\fBint pos_menu_cursor(const MENU *\fImenu\fB);\fR
+.br
+.SH DESCRIPTION
+The function \fBpos_menu_cursor\fP restores the cursor to the current position
+associated with the menu's selected item.
+This is useful after \fBcurses\fP
+routines have been called to do screen-painting in response to a menu select.
+.SH RETURN VALUE
+This routine returns one of the following:
+.TP 5
+.B E_OK
+The routine succeeded.
+.TP 5
+.B E_SYSTEM_ERROR
+System error occurred (see \fBerrno\fP(3)).
+.TP 5
+.B E_BAD_ARGUMENT
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+.B E_NOT_POSTED
+The menu has not been posted.
+.SH SEE ALSO
+\fBcurses\fP(3X), \fBmenu\fP(3X).
+.SH NOTES
+The header file \fB<menu.h>\fP automatically includes the header file
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines emulate the System V menu library.
+They were not supported on
+Version 7 or BSD versions.
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric S. Raymond.
diff --git a/man/menu_driver.3x b/man/menu_driver.3x
new file mode 100644
index 0000000..706005f
--- /dev/null
+++ b/man/menu_driver.3x
@@ -0,0 +1,208 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2017 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: menu_driver.3x,v 1.31 2022/02/12 20:05:11 tom Exp $
+.TH menu_driver 3X ""
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.SH NAME
+\fBmenu_driver\fP \- command-processing loop of the menu system
+.SH SYNOPSIS
+\fB#include <menu.h>\fP
+.sp
+\fBint menu_driver(MENU *\fImenu\fB, int \fIc\fB);\fR
+.br
+.SH DESCRIPTION
+Once a menu has been posted (displayed), you should funnel input events to it
+through \fBmenu_driver\fP.  This routine has three major input cases:
+.bP
+The input is a form navigation request.
+Navigation request codes are constants defined in \fB<form.h>\fP,
+which are distinct from the key- and character codes
+returned by \fBwgetch\fP(3X).
+.bP
+The input is a printable character.
+Printable characters (which must be positive, less than 256) are
+checked according to the program's locale settings.
+.bP
+The input is the KEY_MOUSE special key associated with an mouse event.
+.PP
+The menu driver requests are as follows:
+.TP 5
+REQ_LEFT_ITEM
+Move left to an item.
+.TP 5
+REQ_RIGHT_ITEM
+Move right to an item.
+.TP 5
+REQ_UP_ITEM
+Move up to an item.
+.TP 5
+REQ_DOWN_ITEM
+Move down to an item.
+.TP 5
+REQ_SCR_ULINE
+Scroll up a line.
+.TP 5
+REQ_SCR_DLINE
+Scroll down a line.
+.TP 5
+REQ_SCR_DPAGE
+Scroll down a page.
+.TP 5
+REQ_SCR_UPAGE
+Scroll up a page.
+.TP 5
+REQ_FIRST_ITEM
+Move to the first item.
+.TP 5
+REQ_LAST_ITEM
+Move to the last item.
+.TP 5
+REQ_NEXT_ITEM
+Move to the next item.
+.TP 5
+REQ_PREV_ITEM
+Move to the previous item.
+.TP 5
+REQ_TOGGLE_ITEM
+Select/deselect an item.
+.TP 5
+REQ_CLEAR_PATTERN
+Clear the menu pattern buffer.
+.TP 5
+REQ_BACK_PATTERN
+Delete the previous character from the pattern buffer.
+.TP 5
+REQ_NEXT_MATCH
+Move to the next item matching the pattern match.
+.TP 5
+REQ_PREV_MATCH
+Move to the previous item matching the pattern match.
+.PP
+If the second argument is a printable character, the code appends
+it to the pattern buffer and attempts to move to the next item matching
+the new pattern.
+If there is no such match, \fBmenu_driver\fP returns
+\fBE_NO_MATCH\fP and deletes the appended character from the buffer.
+.PP
+If the second argument is one of the above pre-defined requests, the
+corresponding action is performed.
+.SS MOUSE HANDLING
+.PP
+If the second argument is the KEY_MOUSE special key, the associated
+mouse event is translated into one of the above pre-defined requests.
+Currently only clicks in the user window (e.g., inside the menu display
+area or the decoration window) are handled.
+.PP
+If you click above the display region of the menu:
+.bP
+a REQ_SCR_ULINE is generated for a single click,
+.bP
+a REQ_SCR_UPAGE is generated for a double-click and
+.bP
+a REQ_FIRST_ITEM is generated for a triple-click.
+.PP
+If you click below the display region of the menu:
+.bP
+a REQ_SCR_DLINE is generated for a single click,
+.bP
+a REQ_SCR_DPAGE is generated for a double-click and
+.bP
+a REQ_LAST_ITEM is generated for a triple-click.
+.PP
+If you click at an item inside the display area of the menu:
+.bP
+the menu cursor is positioned to that item.
+.bP
+If you double-click an item a REQ_TOGGLE_ITEM
+is generated and \fBE_UNKNOWN_COMMAND\fP is returned.
+This return value makes sense,
+because a double click usually means that an item-specific action should
+be returned.
+It is exactly the purpose of this return value to signal that an
+application specific command should be executed.
+.bP
+If a translation
+into a request was done, \fBmenu_driver\fP returns the result of this request.
+.PP
+If you clicked outside the user window
+or the mouse event could not be translated
+into a menu request an \fBE_REQUEST_DENIED\fP is returned.
+.SS APPLICATION-DEFINED COMMANDS
+.PP
+If the second argument is neither printable nor one of the above
+pre-defined menu requests or KEY_MOUSE,
+the drive assumes it is an application-specific
+command and returns \fBE_UNKNOWN_COMMAND\fP.  Application-defined commands
+should be defined relative to \fBMAX_COMMAND\fP, the maximum value of these
+pre-defined requests.
+.SH RETURN VALUE
+\fBmenu_driver\fP return one of the following error codes:
+.TP 5
+.B E_OK
+The routine succeeded.
+.TP 5
+.B E_SYSTEM_ERROR
+System error occurred (see \fBerrno\fP(3)).
+.TP 5
+.B E_BAD_ARGUMENT
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+.B E_BAD_STATE
+Routine was called from an initialization or termination function.
+.TP 5
+.B E_NOT_POSTED
+The menu has not been posted.
+.TP 5
+.B E_UNKNOWN_COMMAND
+The menu driver code saw an unknown request code.
+.TP 5
+.B E_NO_MATCH
+Character failed to match.
+.TP 5
+.B E_REQUEST_DENIED
+The menu driver could not process the request.
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBgetch\fP(3X),
+\fBmenu\fP(3X).
+.SH NOTES
+The header file \fB<menu.h>\fP automatically includes the header files
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines emulate the System V menu library.
+They were not supported on
+Version 7 or BSD versions.
+The support for mouse events is ncurses specific.
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric S. Raymond.
diff --git a/man/menu_format.3x b/man/menu_format.3x
new file mode 100644
index 0000000..7abe94e
--- /dev/null
+++ b/man/menu_format.3x
@@ -0,0 +1,88 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2015,2016 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: menu_format.3x,v 1.21 2022/02/12 20:05:11 tom Exp $
+.TH menu_format 3X ""
+.SH NAME
+\fBset_menu_format\fP,
+\fBmenu_format\fP \- set and get menu sizes
+.SH SYNOPSIS
+\fB#include <menu.h>\fP
+.sp
+\fBint set_menu_format(MENU *\fImenu\fB, int \fIrows\fB, int \fIcols\fB);\fR
+.br
+\fBvoid menu_format(const MENU *\fImenu\fB, int *\fIrows\fB, int *\fIcols\fB);\fR
+.br
+.SH DESCRIPTION
+The function \fBset_menu_format\fP sets the maximum display size of the given
+menu.
+If this size is too small to display all menu items, the menu will be
+made scrollable.
+If this size is larger than the menus subwindow and the
+subwindow is too small to display all menu items, \fBpost_menu\fP will fail.
+.PP
+The default format is 16 rows, 1 column.
+Calling \fBset_menu_format\fP with a
+null menu pointer will change this default.
+A zero row or column argument to
+\fBset_menu_format\fP is interpreted as a request not to change the current
+value.
+.PP
+The function \fBmenu_format\fP returns the maximum-size constraints for the
+given menu into the storage addressed by \fBrows\fP and \fBcols\fP.
+.SH RETURN VALUE
+These routines returns one of the following:
+.TP 5
+.B E_OK
+The routine succeeded.
+.TP 5
+.B E_SYSTEM_ERROR
+System error occurred (see \fBerrno\fP(3)).
+.TP 5
+.B E_BAD_ARGUMENT
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+.B E_POSTED
+The menu is already posted.
+.TP 5
+.B E_NOT_CONNECTED
+No items are connected to the menu.
+.SH SEE ALSO
+\fBcurses\fP(3X), \fBmenu\fP(3X).
+.SH NOTES
+The header file \fB<menu.h>\fP automatically includes the header file
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines emulate the System V menu library.
+They were not supported on
+Version 7 or BSD versions.
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric S. Raymond.
diff --git a/man/menu_hook.3x b/man/menu_hook.3x
new file mode 100644
index 0000000..661e20d
--- /dev/null
+++ b/man/menu_hook.3x
@@ -0,0 +1,102 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2007,2010 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: menu_hook.3x,v 1.18 2022/02/12 20:05:11 tom Exp $
+.TH menu_hook 3X ""
+.SH NAME
+\fBmenu_hook\fP \- set hooks for automatic invocation by applications
+.SH SYNOPSIS
+\fB#include <menu.h>\fP
+.sp
+\fBint set_item_init(MENU *\fImenu\fB, Menu_Hook \fIfunc);\fR
+.br
+\fBMenu_Hook item_init(const MENU *\fImenu);\fR
+.sp
+\fBint set_item_term(MENU *\fImenu\fB, Menu_Hook \fIfunc);\fR
+.br
+\fBMenu_Hook item_term(const MENU *\fImenu);\fR
+.sp
+\fBint set_menu_init(MENU *\fImenu\fB, Menu_Hook \fIfunc);\fR
+.br
+\fBMenu_Hook menu_init(const MENU *\fImenu);\fR
+.sp
+\fBint set_menu_term(MENU *\fImenu\fB, Menu_Hook \fIfunc);\fR
+.br
+\fBMenu_Hook menu_term(const MENU *\fImenu);\fR
+.br
+.SH DESCRIPTION
+These functions make it possible to set hook functions to be called at various
+points in the automatic processing of input event codes by \fBmenu_driver\fP.
+.PP
+The function \fBset_item_init\fP sets a hook to be called at menu-post time and
+each time the selected item changes (after the change).
+\fBitem_init\fP
+returns the current item init hook, if any (\fBNULL\fP if there is no such
+hook).
+.PP
+The function \fBset_item_term\fP sets a hook to be called at menu-unpost time
+and each time the selected item changes (before the change).
+\fBitem_term\fP
+returns the current item term hook, if any (\fBNULL\fP if there is no such
+hook).
+.PP
+The function \fBset_menu_init\fP sets a hook to be called at menu-post time and
+just after the top row on the menu changes once it is posted.
+\fBmenu_init\fP
+returns the current menu init hook, if any (\fBNULL\fP if there is no such
+hook).
+.PP
+The function \fBset_menu_term\fP sets a hook to be called at menu-unpost time
+and just before the top row on the menu changes once it is posted.
+\fBmenu_term\fP returns the current menu term hook, if any (\fBNULL\fP if there
+is no such hook).
+.SH RETURN VALUE
+Routines that return pointers return \fBNULL\fP on error.
+Other routines
+return one of the following:
+.TP 5
+.B E_OK
+The routine succeeded.
+.TP 5
+.B E_SYSTEM_ERROR
+System error occurred (see \fBerrno\fP(3)).
+.SH SEE ALSO
+\fBcurses\fP(3X), \fBmenu\fP(3X).
+.SH NOTES
+The header file \fB<menu.h>\fP automatically includes the header file
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines emulate the System V menu library.
+They were not supported on
+Version 7 or BSD versions.
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric
+S. Raymond.
diff --git a/man/menu_items.3x b/man/menu_items.3x
new file mode 100644
index 0000000..555498e
--- /dev/null
+++ b/man/menu_items.3x
@@ -0,0 +1,91 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2012,2015 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: menu_items.3x,v 1.20 2022/02/12 20:05:11 tom Exp $
+.TH menu_items 3X ""
+.SH NAME
+\fBset_menu_items\fP,
+\fBmenu_items\fP,
+\fBitem_count\fP \- make and break connections between items and menus
+.SH SYNOPSIS
+\fB#include <menu.h>\fP
+.sp
+\fBint set_menu_items(MENU *\fImenu\fB, ITEM **\fIitems\fB);\fR
+.br
+\fBITEM **menu_items(const MENU *\fImenu\fB);\fR
+.br
+\fBint item_count(const MENU *\fImenu\fB);\fR
+.br
+.SH DESCRIPTION
+The function \fBset_menu_items\fP changes the item pointer array of the given
+\fImenu\fP.  The array must be terminated by a \fBNULL\fP.
+.PP
+The function \fBmenu_items\fP returns the item array of the given menu.
+.PP
+The function \fBitem_count\fP returns the count of items in \fImenu\fP.
+.SH RETURN VALUE
+The function \fBmenu_items\fP returns a pointer (which may be \fBNULL\fP).
+It does not set \fBerrno\fP.
+.PP
+The function \fBitem_count\fP returns \fBERR\fP (the general \fBcurses\fP error
+return value) if its \fImenu\fP parameter is \fBNULL\fP.
+.PP
+The function \fBset_menu_items\fP returns one of the following codes on error:
+.TP 5
+.B E_OK
+The routine succeeded.
+.TP 5
+.B E_BAD_ARGUMENT
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+.B E_NOT_CONNECTED
+No items are connected to the menu.
+.TP 5
+.B E_POSTED
+The menu is already posted.
+.TP 5
+.B E_SYSTEM_ERROR
+System error occurred (see \fBerrno\fP(3)).
+.
+.SH SEE ALSO
+\fBcurses\fP(3X), \fBmenu\fP(3X).
+.SH NOTES
+The header file \fB<menu.h>\fP automatically includes the header file
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines emulate the System V menu library.
+They were not supported on
+Version 7 or BSD versions.
+.PP
+The SVr4 menu library documentation specifies the \fBitem_count\fP error value
+as \-1 (which is the value of \fBERR\fP).
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric S. Raymond.
diff --git a/man/menu_mark.3x b/man/menu_mark.3x
new file mode 100644
index 0000000..e693612
--- /dev/null
+++ b/man/menu_mark.3x
@@ -0,0 +1,84 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2015 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: menu_mark.3x,v 1.21 2022/02/12 20:02:20 tom Exp $
+.TH menu_mark 3X ""
+.SH NAME
+\fBset_menu_mark\fP,
+\fBmenu_mark\fP \- get and set the menu mark string
+.SH SYNOPSIS
+\fB#include <menu.h>\fP
+.sp
+\fBint set_menu_mark(MENU *\fImenu\fB, const char *\fImark\fB);\fR
+.br
+\fBconst char *menu_mark(const MENU *\fImenu\fB);\fR
+.br
+.SH DESCRIPTION
+In order to make menu selections visible on older terminals without
+highlighting or color capability, the menu library marks selected items
+in a menu with a prefix string.
+.PP
+The function \fBset_menu_mark\fP sets the mark string for the given menu.
+Calling \fBset_menu_mark\fP with a null menu item will abolish the mark string.
+Note that changing the length of the mark string for a menu while the
+menu is posted is likely to produce unhelpful behavior.
+.PP
+The default string is "\-" (a dash).
+Calling \fBset_menu_mark\fP with
+a non-\fBNULL\fP menu argument will change this default.
+.PP
+The function \fBmenu_mark\fP returns the menu's mark string (or \fBNULL\fP if
+there is none).
+.SH RETURN VALUE
+The function \fBmenu_mark\fP returns a pointer (which may be \fBNULL\fP).
+It does not set \fBerrno\fP.
+.PP
+The function \fBset_menu_mark\fP may return the following error codes:
+.TP 5
+.B E_OK
+The routine succeeded.
+.TP 5
+.B E_BAD_ARGUMENT
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+.B E_SYSTEM_ERROR
+System error occurred (see \fBerrno\fP(3)).
+.SH SEE ALSO
+\fBcurses\fP(3X), \fBmenu\fP(3X).
+.SH NOTES
+The header file \fB<menu.h>\fP automatically includes the header file
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines emulate the System V menu library.
+They were not supported on
+Version 7 or BSD versions.
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric S. Raymond.
diff --git a/man/menu_new.3x b/man/menu_new.3x
new file mode 100644
index 0000000..00e2bc9
--- /dev/null
+++ b/man/menu_new.3x
@@ -0,0 +1,83 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2015 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: menu_new.3x,v 1.21 2022/02/12 20:02:20 tom Exp $
+.TH menu_new 3X ""
+.SH NAME
+\fBnew_menu\fP,
+\fBfree_menu\fP \- create and destroy menus
+.SH SYNOPSIS
+\fB#include <menu.h>\fP
+.sp
+\fBMENU *new_menu(ITEM **\fIitems\fB);\fR
+.br
+\fBint free_menu(MENU *\fImenu\fB);\fR
+.br
+.SH DESCRIPTION
+The function \fBnew_menu\fP creates a new menu connected to a specified item
+pointer array (which must be \fBNULL\fP-terminated).
+.PP
+The function \fBfree_menu\fP disconnects \fImenu\fP from its item array
+and frees the storage allocated for the menu.
+.SH RETURN VALUE
+The function \fBnew_menu\fP returns \fBNULL\fP on error.
+It sets \fBerrno\fP according to the function's failure:
+.TP 5
+.B E_NOT_CONNECTED
+No items are connected to the menu.
+.TP 5
+.B E_SYSTEM_ERROR
+System error occurred, e.g., malloc failure.
+.PP
+The function \fBfree_menu\fP returns one of the following:
+.TP 5
+.B E_OK
+The routine succeeded.
+.TP 5
+.B E_SYSTEM_ERROR
+System error occurred (see \fBerrno\fP(3)).
+.TP 5
+.B E_BAD_ARGUMENT
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+.B E_POSTED
+The menu has already been posted.
+.SH SEE ALSO
+\fBcurses\fP(3X), \fBmenu\fP(3X).
+.SH NOTES
+The header file \fB<menu.h>\fP automatically includes the header file
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines emulate the System V menu library.
+They were not supported on
+Version 7 or BSD versions.
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric S. Raymond.
diff --git a/man/menu_opts.3x b/man/menu_opts.3x
new file mode 100644
index 0000000..ca61f1b
--- /dev/null
+++ b/man/menu_opts.3x
@@ -0,0 +1,109 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2015,2016 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: menu_opts.3x,v 1.21 2022/02/12 20:02:20 tom Exp $
+.TH menu_opts 3X ""
+.SH NAME
+\fBset_menu_opts\fP,
+\fBmenu_opts_on\fP,
+\fBmenu_opts_off\fP,
+\fBmenu_opts\fP \- set and get menu options
+.SH SYNOPSIS
+\fB#include <menu.h>\fP
+.sp
+\fBint set_menu_opts(MENU *\fImenu\fB, Menu_Options \fIopts\fB);\fR
+.br
+\fBMenu_Options menu_opts(const MENU *\fImenu\fB);\fR
+.sp
+\fBint menu_opts_on(MENU *\fImenu\fB, Menu_Options \fIopts\fB);\fR
+.br
+\fBint menu_opts_off(MENU *\fImenu\fB, Menu_Options \fIopts\fB);\fR
+.br
+.SH DESCRIPTION
+The function \fBset_menu_opts\fP sets all the given menu's option bits (menu
+option bits may be logically-OR'ed together).
+.PP
+The function \fBmenu_opts_on\fP turns on the given option bits, and leaves
+others alone.
+.PP
+The function \fBmenu_opts_off\fP turns off the given option bits, and leaves
+others alone.
+.PP
+The function \fBmenu_opts\fP returns the menu's current option bits.
+.PP
+The following options are defined (all are on by default):
+.TP 5
+O_ONEVALUE
+Only one item can be selected for this menu.
+.TP 5
+O_SHOWDESC
+Display the item descriptions when the menu is posted.
+.TP 5
+O_ROWMAJOR
+Display the menu in row-major order.
+.TP 5
+O_IGNORECASE
+Ignore the case when pattern-matching.
+.TP 5
+O_SHOWMATCH
+Move the cursor to within the item name while pattern-matching.
+.TP 5
+O_NONCYCLIC
+Don't wrap around next-item and previous-item,
+requests to the other end of the menu.
+.TP 5
+O_MOUSE_MENU
+If user clicks with the mouse
+and it does not fall on the currently active menu,
+push \fBKEY_MOUSE\fP and the \fBMEVENT\fP data
+back on the queue to allow processing in another part of the calling program.
+.SH RETURN VALUE
+Except for \fBmenu_opts\fP, each routine returns one of the following:
+.TP 5
+.B E_OK
+The routine succeeded.
+.TP 5
+.B E_SYSTEM_ERROR
+System error occurred (see \fBerrno\fP(3)).
+.TP 5
+.B E_POSTED
+The menu is already posted.
+.SH SEE ALSO
+\fBcurses\fP(3X), \fBmenu\fP(3X).
+.SH NOTES
+The header file \fB<menu.h>\fP automatically includes the header file
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines emulate the System V menu library.
+They were not supported on
+Version 7 or BSD versions.
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric S. Raymond.
diff --git a/man/menu_pattern.3x b/man/menu_pattern.3x
new file mode 100644
index 0000000..faaf647
--- /dev/null
+++ b/man/menu_pattern.3x
@@ -0,0 +1,92 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2015 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: menu_pattern.3x,v 1.24 2022/02/12 20:02:20 tom Exp $
+.TH menu_pattern 3X ""
+.SH NAME
+\fBset_menu_pattern\fP,
+\fBmenu_pattern\fP \- set and get a menu's pattern buffer
+.SH SYNOPSIS
+\fB#include <menu.h>\fP
+.sp
+\fBint set_menu_pattern(MENU *\fImenu\fB, const char *\fIpattern\fB);\fR
+.br
+\fBchar *menu_pattern(const MENU *\fImenu\fB);\fR
+.br
+.SH DESCRIPTION
+Every menu has an associated pattern match buffer.
+As input events that are
+printable characters come in, they are appended to this match buffer
+and tested for a match, as described in \fBmenu_driver\fP(3X).
+.PP
+The function \fBset_menu_pattern\fP sets the pattern buffer for the given menu
+and tries to find the first matching item.
+If it succeeds, that item becomes
+current; if not, the current item does not change.
+.PP
+The function \fBmenu_pattern\fP returns the pattern buffer of the given
+\fImenu\fP.
+.SH RETURN VALUE
+The function \fBmenu_pattern\fP returns a pointer,
+which is \fBNULL\fP if the \fImenu\fP parameter is \fBNULL\fP.
+Otherwise, it is a pointer to a string which is empty
+if no pattern has been set.
+It does not set \fBerrno\fP.
+.PP
+The function \fBset_menu_pattern\fP may return the following error codes:
+.TP 5
+.B E_OK
+The routine succeeded.
+.TP 5
+.B E_BAD_ARGUMENT
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+.B E_BAD_STATE
+Routine was called from an initialization or termination function.
+.TP 5
+.B E_NOT_CONNECTED
+No items are connected to menu.
+.TP 5
+.B E_NO_MATCH
+Character failed to match.
+.TP 5
+.B E_SYSTEM_ERROR
+System error occurred (see \fBerrno\fP(3)).
+.SH SEE ALSO
+\fBcurses\fP(3X), \fBmenu\fP(3X).
+.SH NOTES
+The header file \fB<menu.h>\fP automatically includes the header file
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines emulate the System V menu library.
+They were not supported on
+Version 7 or BSD versions.
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric S. Raymond.
diff --git a/man/menu_post.3x b/man/menu_post.3x
new file mode 100644
index 0000000..2d96b55
--- /dev/null
+++ b/man/menu_post.3x
@@ -0,0 +1,91 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2016,2017 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: menu_post.3x,v 1.22 2022/02/12 20:02:20 tom Exp $
+.TH menu_post 3X ""
+.SH NAME
+\fBpost_menu\fP,
+\fBunpost_menu\fP \- write or erase menus from associated subwindows
+.SH SYNOPSIS
+\fB#include <menu.h>\fP
+.sp
+\fBint post_menu(MENU *\fImenu\fB);\fR
+.br
+\fBint unpost_menu(MENU *\fImenu\fB);\fR
+.br
+.SH DESCRIPTION
+The function \fBpost_menu\fP displays a menu to its associated subwindow.
+To
+trigger physical display of the subwindow,
+use \fBrefresh\fP(3X) or some equivalent
+\fBcurses\fP routine (the implicit \fBdoupdate\fP triggered by an \fBcurses\fP
+input request will do).
+\fBpost_menu\fP resets the selection status of all items.
+.PP
+The function \fBunpost_menu\fP erases menu from its associated subwindow.
+.SH RETURN VALUE
+These routines return one of the following:
+.TP 5
+.B E_OK
+The routine succeeded.
+.TP 5
+.B E_SYSTEM_ERROR
+System error occurred (see \fBerrno\fP(3)).
+.TP 5
+.B E_BAD_ARGUMENT
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+.B E_POSTED
+The menu has already been posted.
+.TP 5
+.B E_BAD_STATE
+Routine was called from an initialization or termination function.
+.TP 5
+.B E_NO_ROOM
+Menu is too large for its window.
+You should consider using \fBset_menu_format\fP to solve the problem.
+.TP 5
+.B E_NOT_POSTED
+The menu has not been posted.
+.TP 5
+.B E_NOT_CONNECTED
+No items are connected to the menu.
+.SH SEE ALSO
+\fBcurses\fP(3X), \fBmenu\fP(3X).
+.SH NOTES
+The header file \fB<menu.h>\fP automatically includes the header file
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines emulate the System V menu library.
+They were not supported on
+Version 7 or BSD versions.
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric S. Raymond.
diff --git a/man/menu_requestname.3x b/man/menu_requestname.3x
new file mode 100644
index 0000000..5c46f67
--- /dev/null
+++ b/man/menu_requestname.3x
@@ -0,0 +1,69 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2015 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: menu_requestname.3x,v 1.18 2022/02/12 20:02:20 tom Exp $
+.TH menu_requestname 3X ""
+.SH NAME
+\fBmenu_request_by_name\fP,
+\fBmenu_request_name\fP \- handle printable menu request names
+.SH SYNOPSIS
+\fB#include <menu.h>\fP
+.sp
+\fBconst char *menu_request_name(int \fIrequest\fB);\fR
+.br
+\fBint menu_request_by_name(const char *\fIname\fB);\fR
+.br
+.SH DESCRIPTION
+The function \fBmenu_request_name\fP returns the printable name of a menu
+request code.
+.br
+The function \fBmenu_request_by_name\fP searches in the name-table for a request
+with the given name and returns its request code.
+Otherwise E_NO_MATCH is returned.
+.SH RETURN VALUE
+\fBmenu_request_name\fP returns \fBNULL\fP on error
+and sets \fBerrno\fP to \fBE_BAD_ARGUMENT\fP.
+.br
+\fBmenu_request_by_name\fP returns \fBE_NO_MATCH\fP on error.
+It does not set \fBerrno\fP.
+.SH SEE ALSO
+\fBcurses\fP(3X), \fBmenu\fP(3X).
+.SH NOTES
+The header file \fB<menu.h>\fP automatically includes the header file
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines are specific to ncurses.
+They were not supported on
+Version 7, BSD or System V implementations.
+It is recommended that
+any code depending on them be conditioned using NCURSES_VERSION.
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric S. Raymond.
diff --git a/man/menu_spacing.3x b/man/menu_spacing.3x
new file mode 100644
index 0000000..bc34806
--- /dev/null
+++ b/man/menu_spacing.3x
@@ -0,0 +1,92 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2015 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: menu_spacing.3x,v 1.20 2022/02/12 20:02:20 tom Exp $
+.TH menu_spacing 3X ""
+.SH NAME
+\fBset_menu_spacing\fP,
+\fBmenu_spacing\fP \- set and get spacing between menu items.
+.SH SYNOPSIS
+\fB#include <menu.h>\fP
+.sp
+\fBint set_menu_spacing(MENU *\fImenu\fB,\fR
+                     \fBint \fIspc_description\fB,\fR
+                     \fBint \fIspc_rows\fB,\fR
+                     \fBint \fIspc_columns\fB);\fR
+.br
+\fBint menu_spacing(const MENU *\fImenu\fB,\fR
+                 \fBint* \fIspc_description\fB,\fR
+                 \fBint* \fIspc_rows\fB,\fR
+                 \fBint* \fIspc_columns\fB);\fR
+.br
+.SH DESCRIPTION
+The function \fBset_menu_spacing\fP sets the spacing information for the menu.
+Its parameter \fBspc_description\fP controls the number of spaces
+between an item name and an item description.
+It must not be larger than \fBTABSIZE\fP.
+The menu system puts in the
+middle of this spacing area the pad character.
+The remaining parts are filled with
+spaces.
+The \fBspc_rows\fP parameter controls the number of rows
+that are used for an item.
+It must not be larger than 3.
+The menu system inserts the blank lines between item rows, these lines
+will contain the pad character in the appropriate positions.
+The \fBspc_columns\fP parameter controls
+the number of blanks between columns of items.
+It must not be larger than \fBTABSIZE\fP.
+A value of 0 for all the spacing values resets them to the default,
+which is 1 for all of them.
+.br
+The function \fBmenu_spacing\fP passes back the spacing info for the menu.
+If a
+pointer is NULL, this specific info is simply not returned.
+.SH RETURN VALUE
+Both routines return \fBE_OK\fP on success.
+\fBset_menu_spacing\fP may return
+\fBE_POSTED\fP if the menu is posted, or \fBE_BAD_ARGUMENT\fP if one of the
+spacing values is out of range.
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBcurs_variables\fP(3X),
+\fBmenu\fP(3X).
+.SH NOTES
+The header file \fB<menu.h>\fP automatically includes the header file
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines are specific to ncurses.
+They were not supported on
+Version 7, BSD or System V implementations.
+It is recommended that
+any code depending on them be conditioned using NCURSES_VERSION.
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric S. Raymond.
diff --git a/man/menu_userptr.3x b/man/menu_userptr.3x
new file mode 100644
index 0000000..d0d30bf
--- /dev/null
+++ b/man/menu_userptr.3x
@@ -0,0 +1,66 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2015 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: menu_userptr.3x,v 1.19 2022/02/12 20:02:20 tom Exp $
+.TH menu_userptr 3X ""
+.SH NAME
+\fBset_menu_userptr\fP,
+\fBmenu_userptr\fP \- associate application data with a menu item
+.SH SYNOPSIS
+\fB#include <menu.h>\fP
+.sp
+\fBint set_menu_userptr(MENU *\fImenu\fB, void *\fIuserptr\fB);\fR
+.br
+\fBvoid *menu_userptr(const MENU *\fImenu\fB);\fR
+.br
+.SH DESCRIPTION
+Every menu and every menu item has a field that can be used to hold
+application-specific data (that is, the menu-driver code leaves it alone).
+These functions get and set the menu user pointer field.
+.SH RETURN VALUE
+\fBmenu_userptr\fP returns a pointer (which may be \fBNULL\fP).
+It does not set \fBerrno\fP.
+.PP
+\fBset_menu_userptr\fP returns \fBE_OK\fP (success).
+.SH SEE ALSO
+\fBcurses\fP(3X), \fBmenu\fP(3X).
+.SH NOTES
+The header file \fB<menu.h>\fP automatically includes the header file
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines emulate the System V menu library.
+They were not supported on
+Version 7 or BSD versions.
+.PP
+The user pointer is a void pointer.
+We chose not to leave it as a char pointer for SVr4 compatibility.
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric S. Raymond.
diff --git a/man/menu_win.3x b/man/menu_win.3x
new file mode 100644
index 0000000..7d88e51
--- /dev/null
+++ b/man/menu_win.3x
@@ -0,0 +1,96 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2006,2010 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: menu_win.3x,v 1.18 2022/02/12 20:02:20 tom Exp $
+.TH menu_win 3X ""
+.SH NAME
+\fBmenu_win\fP \- make and break menu window and subwindow associations
+.SH SYNOPSIS
+\fB#include <menu.h>\fP
+.sp
+\fBint set_menu_win(MENU *\fImenu\fB, WINDOW *\fIwin\fB);\fR
+.br
+\fBWINDOW *menu_win(const MENU *\fImenu\fB);\fR
+.sp
+\fBint set_menu_sub(MENU *\fImenu\fB, WINDOW *\fIsub\fB);\fR
+.br
+\fBWINDOW *menu_sub(const MENU *\fImenu\fB);\fR
+.sp
+\fBint scale_menu(const MENU *\fImenu, int *\fIrows\fB, int *\fIcolumns);\fR
+.br
+.SH DESCRIPTION
+Every menu has an associated pair of \fBcurses\fP windows.
+The menu window
+displays any title and border associated with the window; the menu subwindow
+displays the items of the menu that are currently available for selection.
+.PP
+The first four functions get and set those windows.
+It is not necessary to set
+either window; by default, the driver code uses \fBstdscr\fP for both.
+.PP
+In the \fBset_\fP functions, window argument of \fBNULL\fP is treated as though
+it were \fBstsdcr\fP.  A menu argument of \fBNULL\fP is treated as a request
+to change the system default menu window or subwindow.
+.PP
+The function \fBscale_menu\fP returns the minimum size required for the
+subwindow of \fImenu\fP.
+.SH RETURN VALUE
+Routines that return pointers return \fBNULL\fP on error.
+Routines that return
+an integer return one of the following error codes:
+.TP 5
+.B E_OK
+The routine succeeded.
+.TP 5
+.B E_SYSTEM_ERROR
+System error occurred (see \fBerrno\fP(3)).
+.TP 5
+.B E_BAD_ARGUMENT
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+.B E_POSTED
+The menu has already been posted.
+.TP 5
+.B E_NOT_CONNECTED
+No items are connected to the menu.
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBcurs_variables\fP(3X),
+\fBmenu\fP(3X).
+.SH NOTES
+The header file \fB<menu.h>\fP automatically includes the header file
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines emulate the System V menu library.
+They were not supported on
+Version 7 or BSD versions.
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric S. Raymond.
diff --git a/man/mitem_current.3x b/man/mitem_current.3x
new file mode 100644
index 0000000..0464042
--- /dev/null
+++ b/man/mitem_current.3x
@@ -0,0 +1,101 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2006,2010 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: mitem_current.3x,v 1.23 2022/02/12 20:02:20 tom Exp $
+.TH mitem_current 3X ""
+.SH NAME
+\fBmitem_current\fP \- set and get current_menu_item
+.SH SYNOPSIS
+\fB#include <menu.h>\fP
+.sp
+\fBint set_current_item(MENU *\fImenu\fB, ITEM *\fIitem\fB);\fR
+.br
+\fBITEM *current_item(const MENU *\fImenu\fB);\fR
+.sp
+\fBint set_top_row(MENU *\fImenu\fB, int \fIrow\fB);\fR
+.br
+\fBint top_row(const MENU *\fImenu\fB);\fR
+.sp
+\fBint item_index(const ITEM *\fIitem\fB);\fR
+.br
+.SH DESCRIPTION
+The function \fBset_current_item\fP sets the current item (the item on which
+the menu cursor is positioned).
+\fBcurrent_item\fP returns a pointer to the
+current item in the given menu.
+.PP
+The function \fBset_top_row\fP sets the top row of the menu to show the given
+row (the top row is initially 0, and is reset to this value whenever the
+\fBO_ROWMAJOR\fP option is toggled).
+The item leftmost on the given row
+becomes current.
+The function \fBtop_row\fP returns the number of the top menu
+row being displayed.
+.PP
+The function \fBitem_index\fP returns the (zero-origin) index of \fIitem\fP in
+the menu's item pointer list.
+.SH RETURN VALUE
+\fBcurrent_item\fP returns a pointer (which may be \fBNULL\fP).
+It does not set \fBerrno\fP.
+.PP
+\fBtop_row\fP and \fBitem_index\fP return \fBERR\fP (the general \fBcurses\fP
+error value) if their \fImenu\fP parameter is \fBNULL\fP.
+.PP
+\fBset_current_item\fP and \fBset_top_row\fP return one of the following:
+.TP 5
+.B E_OK
+The routine succeeded.
+.TP 5
+.B E_BAD_ARGUMENT
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+.B E_BAD_STATE
+Routine was called from an initialization or termination function.
+.TP 5
+.B E_NOT_CONNECTED
+No items are connected to the menu.
+.TP 5
+.B E_SYSTEM_ERROR
+System error occurred (see \fBerrno\fP(3)).
+.SH SEE ALSO
+\fBcurses\fP(3X), \fBmenu\fP(3X).
+.SH NOTES
+The header file \fB<menu.h>\fP automatically includes the header file
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines emulate the System V menu library.
+They were not supported on
+Version 7 or BSD versions.
+.PP
+The SVr4 menu library documentation specifies the \fBtop_row\fP and
+\fBindex_item\fP error value as \-1 (which is the value of \fBERR\fP).
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric S. Raymond.
diff --git a/man/mitem_name.3x b/man/mitem_name.3x
new file mode 100644
index 0000000..7023b02
--- /dev/null
+++ b/man/mitem_name.3x
@@ -0,0 +1,61 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2015 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: mitem_name.3x,v 1.17 2022/02/12 20:02:20 tom Exp $
+.TH mitem_name 3X ""
+.SH NAME
+\fBitem_name\fP,
+\fBitem_description\fP \- get menu item name and description fields
+.SH SYNOPSIS
+\fB#include <menu.h>\fP
+.sp
+\fBconst char *item_name(const ITEM *\fIitem\fB);\fR
+.br
+\fBconst char *item_description(const ITEM *\fIitem\fB);\fR
+.br
+.SH DESCRIPTION
+The function \fBitem_name\fP returns the name part of the given item.
+.br
+The function \fBitem_description\fP returns the description part of the given
+item.
+.SH RETURN VALUE
+These routines return a pointer (which may be \fBNULL\fP).
+They do not set \fBerrno\fP.
+.SH SEE ALSO
+\fBcurses\fP(3X), \fBmenu\fP(3X).
+.SH NOTES
+The header file \fB<menu.h>\fP automatically includes the header file
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines emulate the System V menu library.
+They were not supported on Version 7 or BSD versions.
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric S. Raymond.
diff --git a/man/mitem_new.3x b/man/mitem_new.3x
new file mode 100644
index 0000000..7a0178a
--- /dev/null
+++ b/man/mitem_new.3x
@@ -0,0 +1,91 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2015 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: mitem_new.3x,v 1.22 2022/02/12 20:02:20 tom Exp $
+.TH mitem_new 3X ""
+.SH NAME
+\fBnew_item\fP,
+\fBfree_item\fP \- create and destroy menu items
+.SH SYNOPSIS
+\fB#include <menu.h>\fP
+.sp
+\fBITEM *new_item(const char *\fIname\fB, const char *\fIdescription\fB);\fR
+.br
+\fBint free_item(ITEM *\fIitem\fB);\fR
+.br
+.SH DESCRIPTION
+The function \fBnew_item\fP allocates a new item and initializes it from the
+\fBname\fP and \fBdescription\fP pointers.
+Please notice that the item stores
+only the pointers to the name and description.
+Those pointers must be valid
+during the lifetime of the item.
+So you should be very careful with names
+or descriptions allocated on the stack of some routines.
+.br
+The function \fBfree_item\fP de-allocates an item.
+Please notice that it
+is the responsibility of the application to release the memory for the
+name or the description of the item.
+.SH RETURN VALUE
+The function \fBnew_item\fP returns \fBNULL\fP on error.
+It sets \fBerrno\fP according to the function's failure:
+.TP 5
+.B E_BAD_ARGUMENT
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+.B E_SYSTEM_ERROR
+System error occurred, e.g., malloc failure.
+.PP
+The function \fBfree_item\fP returns one of the following:
+.TP 5
+.B E_OK
+The routine succeeded.
+.TP 5
+.B E_BAD_ARGUMENT
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+.B E_CONNECTED
+Item is connected to a menu.
+.TP 5
+.B E_SYSTEM_ERROR
+System error occurred (see \fBerrno\fP(3)).
+.SH SEE ALSO
+\fBcurses\fP(3X), \fBmenu\fP(3X).
+.SH NOTES
+The header file \fB<menu.h>\fP automatically includes the header file
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines emulate the System V menu library.
+They were not supported on
+Version 7 or BSD versions.
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric S. Raymond.
diff --git a/man/mitem_opts.3x b/man/mitem_opts.3x
new file mode 100644
index 0000000..716584c
--- /dev/null
+++ b/man/mitem_opts.3x
@@ -0,0 +1,84 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2015 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: mitem_opts.3x,v 1.19 2022/02/12 20:02:20 tom Exp $
+.TH mitem_opts 3X ""
+.SH NAME
+\fBset_item_opts\fP,
+\fBitem_opts_on\fP,
+\fBitem_opts_off\fP,
+\fBitem_opts\fP \- set and get menu item options
+.SH SYNOPSIS
+\fB#include <menu.h>\fP
+.sp
+\fBint set_item_opts(ITEM *\fIitem\fB, Item_Options \fIopts\fB);\fR
+.br
+\fBItem_Options item_opts(const ITEM *\fIitem\fB);\fR
+.sp
+\fBint item_opts_on(ITEM *\fIitem\fB, Item_Options \fIopts\fB);\fR
+.br
+\fBint item_opts_off(ITEM *\fIitem\fB, Item_Options \fIopts\fB);\fR
+.br
+.SH DESCRIPTION
+The function \fBset_item_opts\fP sets all the given item's option bits (menu
+option bits may be logically-OR'ed together).
+.PP
+The function \fBitem_opts_on\fP turns on the given option bits, and leaves
+others alone.
+.PP
+The function \fBitem_opts_off\fP turns off the given option bits, and leaves
+others alone.
+.PP
+The function \fBitem_opts\fP returns the item's current option bits.
+.PP
+There is only one defined option bit mask, \fBO_SELECTABLE\fP.  When this is
+on, the item may be selected during menu processing.
+This option defaults
+to on.
+.SH RETURN VALUE
+Except for \fBitem_opts\fP, each routine returns one of the following:
+.TP 5
+.B E_OK
+The routine succeeded.
+.TP 5
+.B E_SYSTEM_ERROR
+System error occurred (see \fBerrno\fP(3)).
+.SH SEE ALSO
+\fBcurses\fP(3X), \fBmenu\fP(3X).
+.SH NOTES
+The header file \fB<menu.h>\fP automatically includes the header file
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines emulate the System V menu library.
+They were not supported on
+Version 7 or BSD versions.
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric S. Raymond.
diff --git a/man/mitem_userptr.3x b/man/mitem_userptr.3x
new file mode 100644
index 0000000..1d492c5
--- /dev/null
+++ b/man/mitem_userptr.3x
@@ -0,0 +1,68 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2015 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: mitem_userptr.3x,v 1.20 2022/02/12 20:02:20 tom Exp $
+.TH mitem_userptr 3X ""
+.SH NAME
+\fBset_item_userptr\fP,
+\fBitem_userptr\fP \- associate application data with a menu item
+.SH SYNOPSIS
+\fB#include <menu.h>\fP
+.sp
+\fBint set_item_userptr(ITEM *\fIitem\fB, void *\fIuserptr\fB);\fR
+.br
+\fBvoid *item_userptr(const ITEM *\fIitem\fB);\fR
+.br
+.SH DESCRIPTION
+Every menu item has a field that can be used to hold application-specific data
+(that is, the menu-driver code leaves it alone).
+These functions get and set
+that field.
+.SH RETURN VALUE
+The function \fBitem_userptr\fP returns a pointer (possibly \fBNULL\fP).
+It does not set \fBerrno\fP.
+.PP
+The \fBset_item_userptr\fP always returns \fBE_OK\fP (success).
+.
+.SH SEE ALSO
+\fBcurses\fP(3X), \fBmenu\fP(3X).
+.SH NOTES
+The header file \fB<menu.h>\fP automatically includes the header file
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines emulate the System V menu library.
+They were not supported on
+Version 7 or BSD versions.
+.PP
+The user pointer is a void pointer.
+We chose not to leave it as a char pointer for SVr4 compatibility.
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric S. Raymond.
diff --git a/man/mitem_value.3x b/man/mitem_value.3x
new file mode 100644
index 0000000..0677301
--- /dev/null
+++ b/man/mitem_value.3x
@@ -0,0 +1,73 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2015 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: mitem_value.3x,v 1.18 2022/02/12 20:02:20 tom Exp $
+.TH mitem_value 3X ""
+.SH NAME
+\fBset_item_value\fP,
+\fBitem_value\fP \- set and get menu item values
+.SH SYNOPSIS
+\fB#include <menu.h>\fP
+.sp
+\fBint set_item_value(ITEM *\fIitem\fB, bool \fIvalue\fB);\fR
+.br
+\fBbool item_value(const ITEM *\fIitem\fB);\fR
+.br
+.SH DESCRIPTION
+If you turn off the menu option \fBO_ONEVALUE\fP (e.g., with
+\fBset_menu_opts\fP or \fBmenu_opts_off\fP; see \fBmenu_opts\fP(3X)), the menu
+becomes multi-valued; that is, more than one item may simultaneously be
+selected.
+.PP
+In a multi_valued menu, you can used \fBset_item_value\fP to select the
+given menu item (second argument \fBTRUE\fP) or deselect it (second argument
+\fBFALSE\fP).
+.SH RETURN VALUE
+The function \fBset_item_value\fP returns one of the following:
+.TP 5
+.B E_OK
+The routine succeeded.
+.TP 5
+.B E_SYSTEM_ERROR
+System error occurred (see \fBerrno\fP(3)).
+.TP 5
+.B E_REQUEST_DENIED
+The menu driver could not process the request.
+.SH SEE ALSO
+\fBcurses\fP(3X), \fBmenu\fP(3X).
+.SH NOTES
+The header file \fB<menu.h>\fP automatically includes the header file
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines emulate the System V menu library.
+They were not supported on
+Version 7 or BSD versions.
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric S. Raymond.
diff --git a/man/mitem_visible.3x b/man/mitem_visible.3x
new file mode 100644
index 0000000..4fb4e36
--- /dev/null
+++ b/man/mitem_visible.3x
@@ -0,0 +1,55 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998,2010 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: mitem_visible.3x,v 1.13 2022/02/12 20:03:40 tom Exp $
+.TH mitem_visible 3X ""
+.SH NAME
+\fBmitem_visible\fP \- check visibility of a menu item
+.SH SYNOPSIS
+\fB#include <menu.h>\fP
+.sp
+\fBbool item_visible(const ITEM *\fIitem\fB);\fR
+.br
+.SH DESCRIPTION
+A menu item is visible when it is in the portion of a posted menu that
+is mapped onto the screen (if the menu is scrollable, in particular, this
+portion will be smaller than the whole menu).
+.SH SEE ALSO
+\fBcurses\fP(3X), \fBmenu\fP(3X).
+.SH NOTES
+The header file \fB<menu.h>\fP automatically includes the header file
+\fB<curses.h>\fP.
+.SH PORTABILITY
+These routines emulate the System V menu library.
+They were not supported on
+Version 7 or BSD versions.
+.SH AUTHORS
+Juergen Pfeifer.
+Manual pages and adaptation for new curses by Eric S. Raymond.
diff --git a/man/ncurses.3x b/man/ncurses.3x
new file mode 100644
index 0000000..5fc85a9
--- /dev/null
+++ b/man/ncurses.3x
@@ -0,0 +1,1557 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2020,2021 Thomas E. Dickey                                *
+.\" Copyright 1998-2015,2017 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: ncurses.3x,v 1.156 2021/12/25 21:19:26 tom Exp $
+.hy 0
+.TH ncurses 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.de NS
+.ie n  .sp
+.el    .sp .5
+.ie n  .in +4
+.el    .in +2
+.nf
+.ft C			\" Courier
+..
+.de NE
+.fi
+.ft R
+.ie n  .in -4
+.el    .in -2
+..
+.ds n 5
+.ds d @TERMINFO@
+.SH NAME
+\fBncurses\fP \- CRT screen handling and optimization package
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.br
+.SH DESCRIPTION
+The \fBncurses\fP library routines give the user a terminal-independent 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 \fBncurses\fP
+version @NCURSES_MAJOR@.@NCURSES_MINOR@ (patch @NCURSES_PATCH@).
+.PP
+The \fBncurses\fP library emulates the curses library of
+System V Release 4 UNIX,
+and XPG4 (X/Open Portability Guide) curses (also known as XSI curses).
+XSI stands for X/Open System Interfaces Extension.
+The \fBncurses\fP library is freely redistributable in source form.
+Differences from the SVr4
+curses are summarized under the
+\fIEXTENSIONS\fP and \fIPORTABILITY\fP sections below and
+described in detail in the respective
+\fIEXTENSIONS\fP, \fIPORTABILITY\fP and \fIBUGS\fP sections
+of individual man pages.
+.PP
+The \fBncurses\fP library also provides many useful extensions,
+i.e., features which cannot be implemented by a simple add-on library
+but which require access to the internals of the library.
+.PP
+A program using these routines must be linked with the \fB\-lncurses\fP option,
+or (if it has been generated) with the debugging library \fB\-lncurses_g\fP.
+(Your system integrator may also have installed these libraries under
+the names \fB\-lcurses\fP and \fB\-lcurses_g\fP.)
+The ncurses_g library generates trace logs (in a file called \*(``trace\*('' in the
+current directory) that describe curses actions.
+See also the section on \fBALTERNATE CONFIGURATIONS\fP.
+.PP
+The \fBncurses\fP package supports: overall screen, window and pad
+manipulation; output to windows and pads; reading terminal input; control over
+terminal and \fBcurses\fP input and output options; environment query
+routines; color manipulation; use of soft label keys; terminfo capabilities;
+and access to low-level terminal-manipulation routines.
+.SS Initialization
+.PP
+The library uses the locale which the calling program has initialized.
+That is normally done with \fBsetlocale\fP(3):
+.NS
+\fBsetlocale(LC_ALL, "");\fP
+.NE
+.PP
+If the locale is not initialized,
+the library assumes that characters are printable as in ISO\-8859\-1,
+to work with certain legacy programs.
+You should initialize the locale and not rely on specific details of
+the library when the locale has not been setup.
+.PP
+The function \fBinitscr\fP or \fBnewterm\fP
+must be called to initialize the library
+before any of the other routines that deal with windows
+and screens are used.
+The routine \fBendwin\fP(3X) must be called before exiting.
+.PP
+To get character-at-a-time input without echoing (most
+interactive, screen oriented programs want this), the following
+sequence should be used:
+.NS
+\fBinitscr(); cbreak(); noecho();\fP
+.NE
+.PP
+Most programs would additionally use the sequence:
+.NS
+\fBintrflush(stdscr, FALSE);\fP
+\fBkeypad(stdscr, TRUE);\fP
+.NE
+.PP
+Before a \fBcurses\fP program is run, the tab stops of the terminal
+should be set and its initialization strings, if defined, must be output.
+This can be done by executing the \fB@TPUT@ init\fP command
+after the shell environment variable \fBTERM\fP has been exported.
+\fB@TSET@(1)\fP is usually responsible for doing this.
+[See \fBterminfo\fP(\*n) for further details.]
+.SS Datatypes
+.PP
+The \fBncurses\fP library permits manipulation of data structures,
+called \fIwindows\fP, which can be thought of as two-dimensional
+arrays of characters representing all or part of a CRT screen.
+A default window called \fBstdscr\fP, which is the size of the terminal
+screen, is supplied.
+Others may be created with \fBnewwin\fP.
+.PP
+Note that \fBcurses\fP does not handle overlapping windows, that's done by
+the \fBpanel\fP(3X) library.
+This means that you can either use
+\fBstdscr\fP or divide the screen into tiled windows and not using
+\fBstdscr\fP at all.
+Mixing the two will result in unpredictable, and undesired, effects.
+.PP
+Windows are referred to by variables declared as \fBWINDOW *\fP.
+These data structures are manipulated with routines described here and
+elsewhere in the \fBncurses\fP manual pages.
+Among those, the most basic
+routines are \fBmove\fP and \fBaddch\fP.
+More general versions of
+these routines are included with names beginning with \fBw\fP,
+allowing the user to specify a window.
+The routines not beginning
+with \fBw\fP affect \fBstdscr\fP.
+.PP
+After using routines to manipulate a window, \fBrefresh\fP(3X) is called,
+telling \fBcurses\fP to make the user's CRT screen look like
+\fBstdscr\fP.
+The characters in a window are actually of type
+\fBchtype\fP, (character and attribute data) so that other information
+about the character may also be stored with each character.
+.PP
+Special windows called \fIpads\fP may also be manipulated.
+These are windows
+which are not constrained to the size of the screen and whose contents need not
+be completely displayed.
+See \fBcurs_pad\fP(3X) for more information.
+.PP
+In addition to drawing characters on the screen, video attributes and colors
+may be supported, causing the characters to show up in such modes as
+underlined, in reverse video, or in color on terminals that support such
+display enhancements.
+Line drawing characters may be specified to be output.
+On input, \fBcurses\fP is also able to translate arrow and function keys that
+transmit escape sequences into single values.
+The video attributes, line
+drawing characters, and input values use names, defined in \fB<curses.h>\fP,
+such as \fBA_REVERSE\fP, \fBACS_HLINE\fP, and \fBKEY_LEFT\fP.
+.SS Environment variables
+.PP
+If the environment variables \fBLINES\fP and \fBCOLUMNS\fP are set, or if the
+program is executing in a window environment, line and column information in
+the environment will override information read by \fIterminfo\fP.
+This would affect a program running in an AT&T 630 layer,
+for example, where the size of a
+screen is changeable (see \fBENVIRONMENT\fP).
+.PP
+If the environment variable \fBTERMINFO\fP is defined, any program using
+\fBcurses\fP checks for a local terminal definition before checking in the
+standard place.
+For example, if \fBTERM\fP is set to \fBatt4424\fP, then the
+compiled terminal definition is found in
+.NS
+\fB\*d/a/att4424\fP.
+.NE
+.PP
+(The \fBa\fP is copied from the first letter of \fBatt4424\fP to avoid
+creation of huge directories.)  However, if \fBTERMINFO\fP is set to
+\fB$HOME/myterms\fP, \fBcurses\fP first checks
+.NS
+\fB$HOME/myterms/a/att4424\fP,
+.NE
+.PP
+and if that fails, it then checks
+.NS
+\fB\*d/a/att4424\fP.
+.NE
+.PP
+This is useful for developing experimental definitions or when write
+permission in \fB\*d\fP is not available.
+.PP
+The integer variables \fBLINES\fP and \fBCOLS\fP are defined in
+\fB<curses.h>\fP and will be filled in by \fBinitscr\fP with the size of the
+screen.
+The constants \fBTRUE\fP and \fBFALSE\fP have the values \fB1\fP and
+\fB0\fP, respectively.
+.PP
+The \fBcurses\fP routines also define the \fBWINDOW *\fP variable \fBcurscr\fP
+which is used for certain low-level operations like clearing and redrawing a
+screen containing garbage.
+The \fBcurscr\fP can be used in only a few routines.
+.\"
+.SS Routine and Argument Names
+Many \fBcurses\fP routines have two or more versions.
+The routines prefixed with \fIw\fP require a window argument.
+The routines prefixed with \fIp\fP require a pad argument.
+Those without a prefix generally use \fBstdscr\fP.
+.PP
+The routines prefixed with \fBmv\fP require a \fIy\fP and \fIx\fP
+coordinate to move to before performing the appropriate action.
+The \fBmv\fP routines imply a call to \fBmove\fP before the call to the
+other routine.
+The coordinate \fIy\fP always refers to the row (of
+the window), and \fIx\fP always refers to the column.
+The upper left-hand corner is always (0,0), not (1,1).
+.PP
+The routines prefixed with \fBmvw\fP take both a window argument and
+\fIx\fP and \fIy\fP coordinates.
+The window argument is always specified before the coordinates.
+.PP
+In each case, \fIwin\fP is the window affected, and \fIpad\fP is the
+pad affected; \fIwin\fP and \fIpad\fP are always pointers to type
+\fBWINDOW\fP.
+.PP
+Option setting routines require a Boolean flag \fIbf\fP with the value
+\fBTRUE\fP or \fBFALSE\fP; \fIbf\fP is always of type \fBbool\fP.
+Most of the data types used in the library routines,
+such as \fBWINDOW\fP, \fBSCREEN\fP, \fBbool\fP, and \fBchtype\fP
+are defined in \fB<curses.h>\fP.
+Types used for the terminfo routines such as
+\fBTERMINAL\fP are defined in \fB<term.h>\fP.
+.PP
+This manual page describes functions which may appear in any configuration
+of the library.
+There are two common configurations of the library:
+.RS 3
+.TP 5
+.I ncurses
+the \*(``normal\*('' library, which handles 8-bit characters.
+The normal (8-bit) library stores characters combined with attributes
+in \fBchtype\fP data.
+.IP
+Attributes alone (no corresponding character) may be stored in \fBchtype\fP
+or the equivalent \fBattr_t\fP data.
+In either case, the data is stored in something like an integer.
+.IP
+Each cell (row and column) in a \fBWINDOW\fP is stored as a \fBchtype\fP.
+.TP 5
+.I ncursesw
+the so-called \*(``wide\*('' library, which handles multibyte characters
+(see the section on \fBALTERNATE CONFIGURATIONS\fP).
+The \*(``wide\*('' library includes all of the calls
+from the \*(``normal\*('' library.
+It adds about one third more calls using data types which store
+multibyte characters:
+.RS 5
+.TP 5
+.B cchar_t
+corresponds to \fBchtype\fP.
+However it is a structure, because more data is stored than can fit into
+an integer.
+The characters are large enough to require a full integer value \- and there
+may be more than one character per cell.
+The video attributes and color are stored in separate fields of the structure.
+.IP
+Each cell (row and column) in a \fBWINDOW\fP is stored as a \fBcchar_t\fP.
+.IP
+The \fBsetcchar\fP(3X) and \fBgetcchar\fP(3X)
+functions store and retrieve the data from
+a \fBcchar_t\fP structure.
+.TP 5
+.B wchar_t
+stores a \*(``wide\*('' character.
+Like \fBchtype\fP, this may be an integer.
+.TP 5
+.B wint_t
+stores a \fBwchar_t\fP or \fBWEOF\fP \- not the same, though both may have
+the same size.
+.RE
+.IP
+The \*(``wide\*('' library provides new functions which are analogous to
+functions in the \*(``normal\*('' library.
+There is a naming convention which relates many of the normal/wide variants:
+a \*(``_w\*('' is inserted into the name.
+For example, \fBwaddch\fP becomes \fBwadd_wch\fP.
+.RE
+.PP
+.\"
+.SS Routine Name Index
+The following table lists the \fBcurses\fP routines provided in
+the \*(``normal\*('' and \*(``wide\*('' libraries and the names of
+the manual pages on which they are described.
+Routines flagged with \*(``*\*(''
+are ncurses-specific, not described by XPG4 or present in SVr4.
+.PP
+.TS
+center tab(/);
+l l
+l l .
+\fBcurses\fP Routine Name/Manual Page Name
+=
+COLOR_PAIR/\fBcurs_color\fP(3X)
+PAIR_NUMBER/\fBcurs_attr\fP(3X)
+add_wch/\fBcurs_add_wch\fP(3X)
+add_wchnstr/\fBcurs_add_wchstr\fP(3X)
+add_wchstr/\fBcurs_add_wchstr\fP(3X)
+addch/\fBcurs_addch\fP(3X)
+addchnstr/\fBcurs_addchstr\fP(3X)
+addchstr/\fBcurs_addchstr\fP(3X)
+addnstr/\fBcurs_addstr\fP(3X)
+addnwstr/\fBcurs_addwstr\fP(3X)
+addstr/\fBcurs_addstr\fP(3X)
+addwstr/\fBcurs_addwstr\fP(3X)
+alloc_pair/\fBnew_pair\fP(3X)*
+assume_default_colors/\fBdefault_colors\fP(3X)*
+attr_get/\fBcurs_attr\fP(3X)
+attr_off/\fBcurs_attr\fP(3X)
+attr_on/\fBcurs_attr\fP(3X)
+attr_set/\fBcurs_attr\fP(3X)
+attroff/\fBcurs_attr\fP(3X)
+attron/\fBcurs_attr\fP(3X)
+attrset/\fBcurs_attr\fP(3X)
+baudrate/\fBcurs_termattrs\fP(3X)
+beep/\fBcurs_beep\fP(3X)
+bkgd/\fBcurs_bkgd\fP(3X)
+bkgdset/\fBcurs_bkgd\fP(3X)
+bkgrnd/\fBcurs_bkgrnd\fP(3X)
+bkgrndset/\fBcurs_bkgrnd\fP(3X)
+border/\fBcurs_border\fP(3X)
+border_set/\fBcurs_border_set\fP(3X)
+box/\fBcurs_border\fP(3X)
+box_set/\fBcurs_border_set\fP(3X)
+can_change_color/\fBcurs_color\fP(3X)
+cbreak/\fBcurs_inopts\fP(3X)
+chgat/\fBcurs_attr\fP(3X)
+clear/\fBcurs_clear\fP(3X)
+clearok/\fBcurs_outopts\fP(3X)
+clrtobot/\fBcurs_clear\fP(3X)
+clrtoeol/\fBcurs_clear\fP(3X)
+color_content/\fBcurs_color\fP(3X)
+color_set/\fBcurs_attr\fP(3X)
+copywin/\fBcurs_overlay\fP(3X)
+curs_set/\fBcurs_kernel\fP(3X)
+curses_trace/\fBcurs_trace\fP(3X)*
+curses_version/\fBcurs_extend\fP(3X)*
+def_prog_mode/\fBcurs_kernel\fP(3X)
+def_shell_mode/\fBcurs_kernel\fP(3X)
+define_key/\fBdefine_key\fP(3X)*
+del_curterm/\fBcurs_terminfo\fP(3X)
+delay_output/\fBcurs_util\fP(3X)
+delch/\fBcurs_delch\fP(3X)
+deleteln/\fBcurs_deleteln\fP(3X)
+delscreen/\fBcurs_initscr\fP(3X)
+delwin/\fBcurs_window\fP(3X)
+derwin/\fBcurs_window\fP(3X)
+doupdate/\fBcurs_refresh\fP(3X)
+dupwin/\fBcurs_window\fP(3X)
+echo/\fBcurs_inopts\fP(3X)
+echo_wchar/\fBcurs_add_wch\fP(3X)
+echochar/\fBcurs_addch\fP(3X)
+endwin/\fBcurs_initscr\fP(3X)
+erase/\fBcurs_clear\fP(3X)
+erasechar/\fBcurs_termattrs\fP(3X)
+erasewchar/\fBcurs_termattrs\fP(3X)
+exit_curses/\fBcurs_memleaks\fP(3X)*
+exit_terminfo/\fBcurs_memleaks\fP(3X)*
+extended_color_content/\fBcurs_color\fP(3X)*
+extended_pair_content/\fBcurs_color\fP(3X)*
+extended_slk_color/\fBcurs_slk\fP(3X)*
+filter/\fBcurs_util\fP(3X)
+find_pair/\fBnew_pair\fP(3X)*
+flash/\fBcurs_beep\fP(3X)
+flushinp/\fBcurs_util\fP(3X)
+free_pair/\fBnew_pair\fP(3X)*
+get_wch/\fBcurs_get_wch\fP(3X)
+get_wstr/\fBcurs_get_wstr\fP(3X)
+getattrs/\fBcurs_attr\fP(3X)
+getbegx/\fBcurs_legacy\fP(3X)*
+getbegy/\fBcurs_legacy\fP(3X)*
+getbegyx/\fBcurs_getyx\fP(3X)
+getbkgd/\fBcurs_bkgd\fP(3X)
+getbkgrnd/\fBcurs_bkgrnd\fP(3X)
+getcchar/\fBcurs_getcchar\fP(3X)
+getch/\fBcurs_getch\fP(3X)
+getcurx/\fBcurs_legacy\fP(3X)*
+getcury/\fBcurs_legacy\fP(3X)*
+getmaxx/\fBcurs_legacy\fP(3X)*
+getmaxy/\fBcurs_legacy\fP(3X)*
+getmaxyx/\fBcurs_getyx\fP(3X)
+getmouse/\fBcurs_mouse\fP(3X)*
+getn_wstr/\fBcurs_get_wstr\fP(3X)
+getnstr/\fBcurs_getstr\fP(3X)
+getparx/\fBcurs_legacy\fP(3X)*
+getpary/\fBcurs_legacy\fP(3X)*
+getparyx/\fBcurs_getyx\fP(3X)
+getstr/\fBcurs_getstr\fP(3X)
+getsyx/\fBcurs_kernel\fP(3X)
+getwin/\fBcurs_util\fP(3X)
+getyx/\fBcurs_getyx\fP(3X)
+halfdelay/\fBcurs_inopts\fP(3X)
+has_colors/\fBcurs_color\fP(3X)
+has_ic/\fBcurs_termattrs\fP(3X)
+has_il/\fBcurs_termattrs\fP(3X)
+has_key/\fBcurs_getch\fP(3X)*
+has_mouse/\fBcurs_mouse\fP(3X)*
+hline/\fBcurs_border\fP(3X)
+hline_set/\fBcurs_border_set\fP(3X)
+idcok/\fBcurs_outopts\fP(3X)
+idlok/\fBcurs_outopts\fP(3X)
+immedok/\fBcurs_outopts\fP(3X)
+in_wch/\fBcurs_in_wch\fP(3X)
+in_wchnstr/\fBcurs_in_wchstr\fP(3X)
+in_wchstr/\fBcurs_in_wchstr\fP(3X)
+inch/\fBcurs_inch\fP(3X)
+inchnstr/\fBcurs_inchstr\fP(3X)
+inchstr/\fBcurs_inchstr\fP(3X)
+init_color/\fBcurs_color\fP(3X)
+init_extended_color/\fBcurs_color\fP(3X)*
+init_extended_pair/\fBcurs_color\fP(3X)*
+init_pair/\fBcurs_color\fP(3X)
+initscr/\fBcurs_initscr\fP(3X)
+innstr/\fBcurs_instr\fP(3X)
+innwstr/\fBcurs_inwstr\fP(3X)
+ins_nwstr/\fBcurs_ins_wstr\fP(3X)
+ins_wch/\fBcurs_ins_wch\fP(3X)
+ins_wstr/\fBcurs_ins_wstr\fP(3X)
+insch/\fBcurs_insch\fP(3X)
+insdelln/\fBcurs_deleteln\fP(3X)
+insertln/\fBcurs_deleteln\fP(3X)
+insnstr/\fBcurs_insstr\fP(3X)
+insstr/\fBcurs_insstr\fP(3X)
+instr/\fBcurs_instr\fP(3X)
+intrflush/\fBcurs_inopts\fP(3X)
+inwstr/\fBcurs_inwstr\fP(3X)
+is_cleared/\fBcurs_opaque\fP(3X)*
+is_idcok/\fBcurs_opaque\fP(3X)*
+is_idlok/\fBcurs_opaque\fP(3X)*
+is_immedok/\fBcurs_opaque\fP(3X)*
+is_keypad/\fBcurs_opaque\fP(3X)*
+is_leaveok/\fBcurs_opaque\fP(3X)*
+is_linetouched/\fBcurs_touch\fP(3X)
+is_nodelay/\fBcurs_opaque\fP(3X)*
+is_notimeout/\fBcurs_opaque\fP(3X)*
+is_pad/\fBcurs_opaque\fP(3X)*
+is_scrollok/\fBcurs_opaque\fP(3X)*
+is_subwin/\fBcurs_opaque\fP(3X)*
+is_syncok/\fBcurs_opaque\fP(3X)*
+is_term_resized/\fBresizeterm\fP(3X)*
+is_wintouched/\fBcurs_touch\fP(3X)
+isendwin/\fBcurs_initscr\fP(3X)
+key_defined/\fBkey_defined\fP(3X)*
+key_name/\fBcurs_util\fP(3X)
+keybound/\fBkeybound\fP(3X)*
+keyname/\fBcurs_util\fP(3X)
+keyok/\fBkeyok\fP(3X)*
+keypad/\fBcurs_inopts\fP(3X)
+killchar/\fBcurs_termattrs\fP(3X)
+killwchar/\fBcurs_termattrs\fP(3X)
+leaveok/\fBcurs_outopts\fP(3X)
+longname/\fBcurs_termattrs\fP(3X)
+mcprint/\fBcurs_print\fP(3X)*
+meta/\fBcurs_inopts\fP(3X)
+mouse_trafo/\fBcurs_mouse\fP(3X)*
+mouseinterval/\fBcurs_mouse\fP(3X)*
+mousemask/\fBcurs_mouse\fP(3X)*
+move/\fBcurs_move\fP(3X)
+mvadd_wch/\fBcurs_add_wch\fP(3X)
+mvadd_wchnstr/\fBcurs_add_wchstr\fP(3X)
+mvadd_wchstr/\fBcurs_add_wchstr\fP(3X)
+mvaddch/\fBcurs_addch\fP(3X)
+mvaddchnstr/\fBcurs_addchstr\fP(3X)
+mvaddchstr/\fBcurs_addchstr\fP(3X)
+mvaddnstr/\fBcurs_addstr\fP(3X)
+mvaddnwstr/\fBcurs_addwstr\fP(3X)
+mvaddstr/\fBcurs_addstr\fP(3X)
+mvaddwstr/\fBcurs_addwstr\fP(3X)
+mvchgat/\fBcurs_attr\fP(3X)
+mvcur/\fBcurs_terminfo\fP(3X)
+mvdelch/\fBcurs_delch\fP(3X)
+mvderwin/\fBcurs_window\fP(3X)
+mvget_wch/\fBcurs_get_wch\fP(3X)
+mvget_wstr/\fBcurs_get_wstr\fP(3X)
+mvgetch/\fBcurs_getch\fP(3X)
+mvgetn_wstr/\fBcurs_get_wstr\fP(3X)
+mvgetnstr/\fBcurs_getstr\fP(3X)
+mvgetstr/\fBcurs_getstr\fP(3X)
+mvhline/\fBcurs_border\fP(3X)
+mvhline_set/\fBcurs_border_set\fP(3X)
+mvin_wch/\fBcurs_in_wch\fP(3X)
+mvin_wchnstr/\fBcurs_in_wchstr\fP(3X)
+mvin_wchstr/\fBcurs_in_wchstr\fP(3X)
+mvinch/\fBcurs_inch\fP(3X)
+mvinchnstr/\fBcurs_inchstr\fP(3X)
+mvinchstr/\fBcurs_inchstr\fP(3X)
+mvinnstr/\fBcurs_instr\fP(3X)
+mvinnwstr/\fBcurs_inwstr\fP(3X)
+mvins_nwstr/\fBcurs_ins_wstr\fP(3X)
+mvins_wch/\fBcurs_ins_wch\fP(3X)
+mvins_wstr/\fBcurs_ins_wstr\fP(3X)
+mvinsch/\fBcurs_insch\fP(3X)
+mvinsnstr/\fBcurs_insstr\fP(3X)
+mvinsstr/\fBcurs_insstr\fP(3X)
+mvinstr/\fBcurs_instr\fP(3X)
+mvinwstr/\fBcurs_inwstr\fP(3X)
+mvprintw/\fBcurs_printw\fP(3X)
+mvscanw/\fBcurs_scanw\fP(3X)
+mvvline/\fBcurs_border\fP(3X)
+mvvline_set/\fBcurs_border_set\fP(3X)
+mvwadd_wch/\fBcurs_add_wch\fP(3X)
+mvwadd_wchnstr/\fBcurs_add_wchstr\fP(3X)
+mvwadd_wchstr/\fBcurs_add_wchstr\fP(3X)
+mvwaddch/\fBcurs_addch\fP(3X)
+mvwaddchnstr/\fBcurs_addchstr\fP(3X)
+mvwaddchstr/\fBcurs_addchstr\fP(3X)
+mvwaddnstr/\fBcurs_addstr\fP(3X)
+mvwaddnwstr/\fBcurs_addwstr\fP(3X)
+mvwaddstr/\fBcurs_addstr\fP(3X)
+mvwaddwstr/\fBcurs_addwstr\fP(3X)
+mvwchgat/\fBcurs_attr\fP(3X)
+mvwdelch/\fBcurs_delch\fP(3X)
+mvwget_wch/\fBcurs_get_wch\fP(3X)
+mvwget_wstr/\fBcurs_get_wstr\fP(3X)
+mvwgetch/\fBcurs_getch\fP(3X)
+mvwgetn_wstr/\fBcurs_get_wstr\fP(3X)
+mvwgetnstr/\fBcurs_getstr\fP(3X)
+mvwgetstr/\fBcurs_getstr\fP(3X)
+mvwhline/\fBcurs_border\fP(3X)
+mvwhline_set/\fBcurs_border_set\fP(3X)
+mvwin/\fBcurs_window\fP(3X)
+mvwin_wch/\fBcurs_in_wch\fP(3X)
+mvwin_wchnstr/\fBcurs_in_wchstr\fP(3X)
+mvwin_wchstr/\fBcurs_in_wchstr\fP(3X)
+mvwinch/\fBcurs_inch\fP(3X)
+mvwinchnstr/\fBcurs_inchstr\fP(3X)
+mvwinchstr/\fBcurs_inchstr\fP(3X)
+mvwinnstr/\fBcurs_instr\fP(3X)
+mvwinnwstr/\fBcurs_inwstr\fP(3X)
+mvwins_nwstr/\fBcurs_ins_wstr\fP(3X)
+mvwins_wch/\fBcurs_ins_wch\fP(3X)
+mvwins_wstr/\fBcurs_ins_wstr\fP(3X)
+mvwinsch/\fBcurs_insch\fP(3X)
+mvwinsnstr/\fBcurs_insstr\fP(3X)
+mvwinsstr/\fBcurs_insstr\fP(3X)
+mvwinstr/\fBcurs_instr\fP(3X)
+mvwinwstr/\fBcurs_inwstr\fP(3X)
+mvwprintw/\fBcurs_printw\fP(3X)
+mvwscanw/\fBcurs_scanw\fP(3X)
+mvwvline/\fBcurs_border\fP(3X)
+mvwvline_set/\fBcurs_border_set\fP(3X)
+napms/\fBcurs_kernel\fP(3X)
+newpad/\fBcurs_pad\fP(3X)
+newterm/\fBcurs_initscr\fP(3X)
+newwin/\fBcurs_window\fP(3X)
+nl/\fBcurs_inopts\fP(3X)
+nocbreak/\fBcurs_inopts\fP(3X)
+nodelay/\fBcurs_inopts\fP(3X)
+noecho/\fBcurs_inopts\fP(3X)
+nofilter/\fBcurs_util\fP(3X)*
+nonl/\fBcurs_inopts\fP(3X)
+noqiflush/\fBcurs_inopts\fP(3X)
+noraw/\fBcurs_inopts\fP(3X)
+notimeout/\fBcurs_inopts\fP(3X)
+overlay/\fBcurs_overlay\fP(3X)
+overwrite/\fBcurs_overlay\fP(3X)
+pair_content/\fBcurs_color\fP(3X)
+pecho_wchar/\fBcurs_pad\fP(3X)*
+pechochar/\fBcurs_pad\fP(3X)
+pnoutrefresh/\fBcurs_pad\fP(3X)
+prefresh/\fBcurs_pad\fP(3X)
+printw/\fBcurs_printw\fP(3X)
+putp/\fBcurs_terminfo\fP(3X)
+putwin/\fBcurs_util\fP(3X)
+qiflush/\fBcurs_inopts\fP(3X)
+raw/\fBcurs_inopts\fP(3X)
+redrawwin/\fBcurs_refresh\fP(3X)
+refresh/\fBcurs_refresh\fP(3X)
+reset_color_pairs/\fBcurs_color\fP(3X)*
+reset_prog_mode/\fBcurs_kernel\fP(3X)
+reset_shell_mode/\fBcurs_kernel\fP(3X)
+resetty/\fBcurs_kernel\fP(3X)
+resize_term/\fBresizeterm\fP(3X)*
+resizeterm/\fBresizeterm\fP(3X)*
+restartterm/\fBcurs_terminfo\fP(3X)
+ripoffline/\fBcurs_kernel\fP(3X)
+savetty/\fBcurs_kernel\fP(3X)
+scanw/\fBcurs_scanw\fP(3X)
+scr_dump/\fBcurs_scr_dump\fP(3X)
+scr_init/\fBcurs_scr_dump\fP(3X)
+scr_restore/\fBcurs_scr_dump\fP(3X)
+scr_set/\fBcurs_scr_dump\fP(3X)
+scrl/\fBcurs_scroll\fP(3X)
+scroll/\fBcurs_scroll\fP(3X)
+scrollok/\fBcurs_outopts\fP(3X)
+set_curterm/\fBcurs_terminfo\fP(3X)
+set_term/\fBcurs_initscr\fP(3X)
+setcchar/\fBcurs_getcchar\fP(3X)
+setscrreg/\fBcurs_outopts\fP(3X)
+setsyx/\fBcurs_kernel\fP(3X)
+setupterm/\fBcurs_terminfo\fP(3X)
+slk_attr/\fBcurs_slk\fP(3X)*
+slk_attr_off/\fBcurs_slk\fP(3X)
+slk_attr_on/\fBcurs_slk\fP(3X)
+slk_attr_set/\fBcurs_slk\fP(3X)
+slk_attroff/\fBcurs_slk\fP(3X)
+slk_attron/\fBcurs_slk\fP(3X)
+slk_attrset/\fBcurs_slk\fP(3X)
+slk_clear/\fBcurs_slk\fP(3X)
+slk_color/\fBcurs_slk\fP(3X)
+slk_init/\fBcurs_slk\fP(3X)
+slk_label/\fBcurs_slk\fP(3X)
+slk_noutrefresh/\fBcurs_slk\fP(3X)
+slk_refresh/\fBcurs_slk\fP(3X)
+slk_restore/\fBcurs_slk\fP(3X)
+slk_set/\fBcurs_slk\fP(3X)
+slk_touch/\fBcurs_slk\fP(3X)
+slk_wset/\fBcurs_slk\fP(3X)*
+standend/\fBcurs_attr\fP(3X)
+standout/\fBcurs_attr\fP(3X)
+start_color/\fBcurs_color\fP(3X)
+subpad/\fBcurs_pad\fP(3X)
+subwin/\fBcurs_window\fP(3X)
+syncok/\fBcurs_window\fP(3X)
+term_attrs/\fBcurs_termattrs\fP(3X)
+termattrs/\fBcurs_termattrs\fP(3X)
+termname/\fBcurs_termattrs\fP(3X)
+tgetent/\fBcurs_termcap\fP(3X)
+tgetflag/\fBcurs_termcap\fP(3X)
+tgetnum/\fBcurs_termcap\fP(3X)
+tgetstr/\fBcurs_termcap\fP(3X)
+tgoto/\fBcurs_termcap\fP(3X)
+tigetflag/\fBcurs_terminfo\fP(3X)
+tigetnum/\fBcurs_terminfo\fP(3X)
+tigetstr/\fBcurs_terminfo\fP(3X)
+timeout/\fBcurs_inopts\fP(3X)
+tiparm/\fBcurs_terminfo\fP(3X)*
+touchline/\fBcurs_touch\fP(3X)
+touchwin/\fBcurs_touch\fP(3X)
+tparm/\fBcurs_terminfo\fP(3X)
+tputs/\fBcurs_termcap\fP(3X)
+tputs/\fBcurs_terminfo\fP(3X)
+trace/\fBcurs_trace\fP(3X)*
+typeahead/\fBcurs_inopts\fP(3X)
+unctrl/\fBcurs_util\fP(3X)
+unget_wch/\fBcurs_get_wch\fP(3X)
+ungetch/\fBcurs_getch\fP(3X)
+ungetmouse/\fBcurs_mouse\fP(3X)*
+untouchwin/\fBcurs_touch\fP(3X)
+use_default_colors/\fBdefault_colors\fP(3X)*
+use_env/\fBcurs_util\fP(3X)
+use_extended_names/\fBcurs_extend\fP(3X)*
+use_legacy_coding/\fBlegacy_coding\fP(3X)*
+use_tioctl/\fBcurs_util\fP(3X)*
+vid_attr/\fBcurs_terminfo\fP(3X)
+vid_puts/\fBcurs_terminfo\fP(3X)
+vidattr/\fBcurs_terminfo\fP(3X)
+vidputs/\fBcurs_terminfo\fP(3X)
+vline/\fBcurs_border\fP(3X)
+vline_set/\fBcurs_border_set\fP(3X)
+vw_printw/\fBcurs_printw\fP(3X)
+vw_scanw/\fBcurs_scanw\fP(3X)
+vwprintw/\fBcurs_printw\fP(3X)
+vwscanw/\fBcurs_scanw\fP(3X)
+wadd_wch/\fBcurs_add_wch\fP(3X)
+wadd_wchnstr/\fBcurs_add_wchstr\fP(3X)
+wadd_wchstr/\fBcurs_add_wchstr\fP(3X)
+waddch/\fBcurs_addch\fP(3X)
+waddchnstr/\fBcurs_addchstr\fP(3X)
+waddchstr/\fBcurs_addchstr\fP(3X)
+waddnstr/\fBcurs_addstr\fP(3X)
+waddnwstr/\fBcurs_addwstr\fP(3X)
+waddstr/\fBcurs_addstr\fP(3X)
+waddwstr/\fBcurs_addwstr\fP(3X)
+wattr_get/\fBcurs_attr\fP(3X)
+wattr_off/\fBcurs_attr\fP(3X)
+wattr_on/\fBcurs_attr\fP(3X)
+wattr_set/\fBcurs_attr\fP(3X)
+wattroff/\fBcurs_attr\fP(3X)
+wattron/\fBcurs_attr\fP(3X)
+wattrset/\fBcurs_attr\fP(3X)
+wbkgd/\fBcurs_bkgd\fP(3X)
+wbkgdset/\fBcurs_bkgd\fP(3X)
+wbkgrnd/\fBcurs_bkgrnd\fP(3X)
+wbkgrndset/\fBcurs_bkgrnd\fP(3X)
+wborder/\fBcurs_border\fP(3X)
+wborder_set/\fBcurs_border_set\fP(3X)
+wchgat/\fBcurs_attr\fP(3X)
+wclear/\fBcurs_clear\fP(3X)
+wclrtobot/\fBcurs_clear\fP(3X)
+wclrtoeol/\fBcurs_clear\fP(3X)
+wcolor_set/\fBcurs_attr\fP(3X)
+wcursyncup/\fBcurs_window\fP(3X)
+wdelch/\fBcurs_delch\fP(3X)
+wdeleteln/\fBcurs_deleteln\fP(3X)
+wecho_wchar/\fBcurs_add_wch\fP(3X)
+wechochar/\fBcurs_addch\fP(3X)
+wenclose/\fBcurs_mouse\fP(3X)*
+werase/\fBcurs_clear\fP(3X)
+wget_wch/\fBcurs_get_wch\fP(3X)
+wget_wstr/\fBcurs_get_wstr\fP(3X)
+wgetbkgrnd/\fBcurs_bkgrnd\fP(3X)
+wgetch/\fBcurs_getch\fP(3X)
+wgetdelay/\fBcurs_opaque\fP(3X)*
+wgetn_wstr/\fBcurs_get_wstr\fP(3X)
+wgetnstr/\fBcurs_getstr\fP(3X)
+wgetparent/\fBcurs_opaque\fP(3X)*
+wgetscrreg/\fBcurs_opaque\fP(3X)*
+wgetstr/\fBcurs_getstr\fP(3X)
+whline/\fBcurs_border\fP(3X)
+whline_set/\fBcurs_border_set\fP(3X)
+win_wch/\fBcurs_in_wch\fP(3X)
+win_wchnstr/\fBcurs_in_wchstr\fP(3X)
+win_wchstr/\fBcurs_in_wchstr\fP(3X)
+winch/\fBcurs_inch\fP(3X)
+winchnstr/\fBcurs_inchstr\fP(3X)
+winchstr/\fBcurs_inchstr\fP(3X)
+winnstr/\fBcurs_instr\fP(3X)
+winnwstr/\fBcurs_inwstr\fP(3X)
+wins_nwstr/\fBcurs_ins_wstr\fP(3X)
+wins_wch/\fBcurs_ins_wch\fP(3X)
+wins_wstr/\fBcurs_ins_wstr\fP(3X)
+winsch/\fBcurs_insch\fP(3X)
+winsdelln/\fBcurs_deleteln\fP(3X)
+winsertln/\fBcurs_deleteln\fP(3X)
+winsnstr/\fBcurs_insstr\fP(3X)
+winsstr/\fBcurs_insstr\fP(3X)
+winstr/\fBcurs_instr\fP(3X)
+winwstr/\fBcurs_inwstr\fP(3X)
+wmouse_trafo/\fBcurs_mouse\fP(3X)*
+wmove/\fBcurs_move\fP(3X)
+wnoutrefresh/\fBcurs_refresh\fP(3X)
+wprintw/\fBcurs_printw\fP(3X)
+wredrawln/\fBcurs_refresh\fP(3X)
+wrefresh/\fBcurs_refresh\fP(3X)
+wresize/\fBwresize\fP(3X)*
+wscanw/\fBcurs_scanw\fP(3X)
+wscrl/\fBcurs_scroll\fP(3X)
+wsetscrreg/\fBcurs_outopts\fP(3X)
+wstandend/\fBcurs_attr\fP(3X)
+wstandout/\fBcurs_attr\fP(3X)
+wsyncdown/\fBcurs_window\fP(3X)
+wsyncup/\fBcurs_window\fP(3X)
+wtimeout/\fBcurs_inopts\fP(3X)
+wtouchln/\fBcurs_touch\fP(3X)
+wunctrl/\fBcurs_util\fP(3X)
+wvline/\fBcurs_border\fP(3X)
+wvline_set/\fBcurs_border_set\fP(3X)
+.TE
+.PP
+Depending on the configuration,
+additional sets of functions may be available:
+.RS 3
+.TP 5
+\fBcurs_memleaks\fP(3X) - curses memory-leak checking
+.TP 5
+\fBcurs_sp_funcs\fP(3X) - curses screen-pointer extension
+.TP 5
+\fBcurs_threads\fP(3X) - curses thread support
+.TP 5
+\fBcurs_trace\fP(3X) - curses debugging routines
+.RE
+.SH RETURN VALUE
+Routines that return an integer return \fBERR\fP upon failure and an
+integer value other than \fBERR\fP upon successful completion, unless
+otherwise noted in the routine descriptions.
+.PP
+As a general rule, routines check for null pointers passed as parameters,
+and handle this as an error.
+.PP
+All macros return the value of the \fBw\fP version, except \fBsetscrreg\fP,
+\fBwsetscrreg\fP, \fBgetyx\fP, \fBgetbegyx\fP, and \fBgetmaxyx\fP.
+The return values of
+\fBsetscrreg\fP,
+\fBwsetscrreg\fP,
+\fBgetyx\fP,
+\fBgetbegyx\fP, and
+\fBgetmaxyx\fP are undefined (i.e., these should not be used as the
+right-hand side of assignment statements).
+.PP
+Functions with a \*(``mv\*('' prefix first perform a cursor movement using
+\fBwmove\fP, and return an error if the position is outside the window,
+or if the window pointer is null.
+Most \*(``mv\*(''-prefixed functions
+(except variadic functions such as \fBmvprintw\fP)
+are provided both as macros and functions.
+.PP
+Routines that return pointers return \fBNULL\fP on error.
+.SH ENVIRONMENT
+.PP
+The following environment symbols are useful for customizing the
+runtime behavior of the \fBncurses\fP library.
+The most important ones have been already discussed in detail.
+.SS CC command-character
+.PP
+When set, change occurrences of the command_character
+(i.e., the \fBcmdch\fP capability)
+of the loaded terminfo entries to the value of this variable.
+Very few terminfo entries provide this feature.
+.PP
+Because this name is also used in development environments to represent
+the C compiler's name, \fBncurses\fP ignores it if it does not happen to
+be a single character.
+.SS BAUDRATE
+.PP
+The debugging library checks this environment variable when the application
+has redirected output to a file.
+The variable's numeric value is used for the baudrate.
+If no value is found, \fBncurses\fP uses 9600.
+This allows testers to construct repeatable test-cases
+that take into account costs that depend on baudrate.
+.SS COLUMNS
+.PP
+Specify the width of the screen in characters.
+Applications running in a windowing environment usually are able to
+obtain the width of the window in which they are executing.
+If neither the \fBCOLUMNS\fP value nor the terminal's screen size is available,
+\fBncurses\fP uses the size which may be specified in the terminfo database
+(i.e., the \fBcols\fP capability).
+.PP
+It is important that your application use a correct size for the screen.
+This is not always possible because your application may be
+running on a host which does not honor NAWS (Negotiations About Window
+Size), or because you are temporarily running as another user.
+However, setting \fBCOLUMNS\fP and/or \fBLINES\fP overrides the library's
+use of the screen size obtained from the operating system.
+.PP
+Either \fBCOLUMNS\fP or \fBLINES\fP symbols may be specified independently.
+This is mainly useful to circumvent legacy misfeatures of terminal descriptions,
+e.g., xterm which commonly specifies a 65 line screen.
+For best results, \fBlines\fP and \fBcols\fP should not be specified in
+a terminal description for terminals which are run as emulations.
+.PP
+Use the \fBuse_env\fP function to disable all use of external environment
+(but not including system calls) to determine the screen size.
+Use the \fBuse_tioctl\fP function to update \fBCOLUMNS\fP or \fBLINES\fP
+to match the screen size obtained from system calls or the terminal database.
+.SS ESCDELAY
+.PP
+Specifies the total time, in milliseconds, for which ncurses will
+await a character sequence, e.g., a function key.
+The default value, 1000 milliseconds, is enough for most uses.
+However, it is made a variable to accommodate unusual applications.
+.PP
+The most common instance where you may wish to change this value
+is to work with slow hosts, e.g., running on a network.
+If the host cannot read characters rapidly enough, it will have the same
+effect as if the terminal did not send characters rapidly enough.
+The library will still see a timeout.
+.PP
+Note that xterm mouse events are built up from character sequences
+received from the xterm.
+If your application makes heavy use of multiple-clicking, you may
+wish to lengthen this default value because the timeout applies
+to the composed multi-click event as well as the individual clicks.
+.PP
+In addition to the environment variable,
+this implementation provides a global variable with the same name.
+Portable applications should not rely upon the presence of ESCDELAY
+in either form,
+but setting the environment variable rather than the global variable
+does not create problems when compiling an application.
+.SS HOME
+Tells \fBncurses\fP where your home directory is.
+That is where it may read and write auxiliary terminal descriptions:
+.NS
+$HOME/.termcap
+$HOME/.terminfo
+.NE
+.SS LINES
+.PP
+Like COLUMNS, specify the height of the screen in characters.
+See COLUMNS for a detailed description.
+.SS MOUSE_BUTTONS_123
+.PP
+This applies only to the OS/2 EMX port.
+It specifies the order of buttons on the mouse.
+OS/2 numbers a 3-button mouse inconsistently from other
+platforms:
+.NS
+1 = left
+.br
+2 = right
+.br
+3 = middle.
+.NE
+.PP
+This variable lets you customize the mouse.
+The variable must be three numeric digits 1\-3 in any order, e.g., 123 or 321.
+If it is not specified, \fBncurses\fP uses 132.
+.SS NCURSES_ASSUMED_COLORS
+.PP
+Override the compiled-in assumption that the
+terminal's default colors are white-on-black
+(see \fBdefault_colors\fP(3X)).
+You may set the foreground and background color values with this environment
+variable by proving a 2-element list: foreground,background.
+For example, to tell ncurses to not assume anything
+about the colors, set this to "\-1,\-1".
+To make it green-on-black, set it to "2,0".
+Any positive value from zero to the terminfo \fBmax_colors\fP value is allowed.
+.SS NCURSES_CONSOLE2
+This applies only to the MinGW port of ncurses.
+.PP
+The \fBConsole2\fP program's handling of the Microsoft Console API call
+\fBCreateConsoleScreenBuffer\fP is defective.
+Applications which use this will hang.
+However, it is possible to simulate the action of this call by
+mapping coordinates,
+explicitly saving and restoring the original screen contents.
+Setting the environment variable \fBNCGDB\fP has the same effect.
+.SS NCURSES_GPM_TERMS
+.PP
+This applies only to ncurses configured to use the GPM interface.
+.PP
+If present,
+the environment variable is a list of one or more terminal names
+against which the \fBTERM\fP environment variable is matched.
+Setting it to an empty value disables the GPM interface;
+using the built-in support for xterm, etc.
+.PP
+If the environment variable is absent,
+ncurses will attempt to open GPM if \fBTERM\fP contains \*(``linux\*(''.
+.SS NCURSES_NO_HARD_TABS
+.PP
+\fBNcurses\fP may use tabs as part of the cursor movement optimization.
+In some cases,
+your terminal driver may not handle these properly.
+Set this environment variable to disable the feature.
+You can also adjust your \fBstty\fP(1) settings to avoid the problem.
+.SS NCURSES_NO_MAGIC_COOKIE
+.PP
+Some terminals use a magic-cookie feature which requires special handling
+to make highlighting and other video attributes display properly.
+You can suppress the highlighting entirely for these terminals by
+setting this environment variable.
+.SS NCURSES_NO_PADDING
+.PP
+Most of the terminal descriptions in the terminfo database are written
+for real \*(``hardware\*('' terminals.
+Many people use terminal emulators
+which run in a windowing environment and use curses-based applications.
+Terminal emulators can duplicate
+all of the important aspects of a hardware terminal, but they do not
+have the same limitations.
+The chief limitation of a hardware terminal from the standpoint
+of your application is the management of dataflow, i.e., timing.
+Unless a hardware terminal is interfaced into a terminal concentrator
+(which does flow control),
+it (or your application) must manage dataflow, preventing overruns.
+The cheapest solution (no hardware cost)
+is for your program to do this by pausing after
+operations that the terminal does slowly, such as clearing the display.
+.PP
+As a result, many terminal descriptions (including the vt100)
+have delay times embedded.
+You may wish to use these descriptions,
+but not want to pay the performance penalty.
+.PP
+Set the NCURSES_NO_PADDING environment variable to disable all but mandatory
+padding.
+Mandatory padding is used as a part of special control
+sequences such as \fBflash\fP.
+.SS NCURSES_NO_SETBUF
+This setting is obsolete.
+Before changes
+.RS 3
+.bP
+started with 5.9 patch 20120825
+and
+.bP
+continued
+though 5.9 patch 20130126
+.RE
+.PP
+\fBncurses\fP enabled buffered output during terminal initialization.
+This was done (as in SVr4 curses) for performance reasons.
+For testing purposes, both of \fBncurses\fP and certain applications,
+this feature was made optional.
+Setting the NCURSES_NO_SETBUF variable
+disabled output buffering, leaving the output in the original (usually
+line buffered) mode.
+.PP
+In the current implementation,
+ncurses performs its own buffering and does not require this workaround.
+It does not modify the buffering of the standard output.
+.PP
+The reason for the change was to make the behavior for interrupts and
+other signals more robust.
+One drawback is that certain nonconventional programs would mix
+ordinary stdio calls with ncurses calls and (usually) work.
+This is no longer possible since ncurses is not using
+the buffered standard output but its own output (to the same file descriptor).
+As a special case, the low-level calls such as \fBputp\fP still use the
+standard output.
+But high-level curses calls do not.
+.SS NCURSES_NO_UTF8_ACS
+.PP
+During initialization, the \fBncurses\fP library
+checks for special cases where VT100 line-drawing (and the corresponding
+alternate character set capabilities) described in the terminfo are known
+to be missing.
+Specifically, when running in a UTF\-8 locale,
+the Linux console emulator and the GNU screen program ignore these.
+Ncurses checks the \fBTERM\fP environment variable for these.
+For other special cases, you should set this environment variable.
+Doing this tells ncurses to use Unicode values which correspond to
+the VT100 line-drawing glyphs.
+That works for the special cases cited,
+and is likely to work for terminal emulators.
+.PP
+When setting this variable, you should set it to a nonzero value.
+Setting it to zero (or to a nonnumber)
+disables the special check for \*(``linux\*('' and \*(``screen\*(''.
+.PP
+As an alternative to the environment variable,
+ncurses checks for an extended terminfo capability \fBU8\fP.
+This is a numeric capability which can be compiled using \fB@TIC@\ \-x\fP.
+For example
+.RS 3
+.ft CW
+.sp
+.nf
+# linux console, if patched to provide working
+# VT100 shift-in/shift-out, with corresponding font.
+linux-vt100|linux console with VT100 line-graphics,
+        U8#0, use=linux,
+.sp
+# uxterm with vt100Graphics resource set to false
+xterm-utf8|xterm relying on UTF-8 line-graphics,
+        U8#1, use=xterm,
+.fi
+.ft
+.RE
+.PP
+The name \*(``U8\*('' is chosen to be two characters,
+to permit it to be used by applications that use ncurses'
+termcap interface.
+.SS NCURSES_TRACE
+.PP
+During initialization, the \fBncurses\fP debugging library
+checks the NCURSES_TRACE environment variable.
+If it is defined, to a numeric value, \fBncurses\fP calls the \fBtrace\fP
+function, using that value as the argument.
+.PP
+The argument values, which are defined in \fBcurses.h\fP, provide several
+types of information.
+When running with traces enabled, your application will write the
+file \fBtrace\fP to the current directory.
+.PP
+See \fBcurs_trace\fP(3X) for more information.
+.SS TERM
+.PP
+Denotes your terminal type.
+Each terminal type is distinct, though many are similar.
+.PP
+\fBTERM\fP is commonly set by terminal emulators to help
+applications find a workable terminal description.
+Some of those choose a popular approximation, e.g.,
+\*(``ansi\*('', \*(``vt100\*('', \*(``xterm\*('' rather than an exact fit.
+Not infrequently, your application will have problems with that approach,
+e.g., incorrect function-key definitions.
+.PP
+If you set \fBTERM\fP in your environment,
+it has no effect on the operation of the terminal emulator.
+It only affects the way applications work within the terminal.
+Likewise, as a general rule (\fBxterm\fP(1) being a rare exception),
+terminal emulators which allow you to
+specify \fBTERM\fP as a parameter or configuration value do
+not change their behavior to match that setting.
+.SS TERMCAP
+If the \fBncurses\fP library has been configured with \fItermcap\fP
+support, \fBncurses\fP will check for a terminal's description in
+termcap form if it is not available in the terminfo database.
+.PP
+The \fBTERMCAP\fP environment variable contains
+either a terminal description (with newlines stripped out),
+or a file name telling where the information denoted by
+the \fBTERM\fP environment variable exists.
+In either case, setting it directs \fBncurses\fP to ignore
+the usual place for this information, e.g., /etc/termcap.
+.SS TERMINFO
+.PP
+\fBncurses\fP can be configured to read from multiple terminal databases.
+The \fBTERMINFO\fP variable overrides the location for
+the default terminal database.
+Terminal descriptions (in terminal format) are stored in terminal databases:
+.bP
+Normally these are stored in a directory tree,
+using subdirectories named by the first letter of the terminal names therein.
+.IP
+This is the scheme used in System V, which legacy Unix systems use,
+and the \fBTERMINFO\fP variable is used by \fIcurses\fP applications on those
+systems to override the default location of the terminal database.
+.bP
+If \fBncurses\fP is built to use hashed databases,
+then each entry in this list may be the path of a hashed database file, e.g.,
+.NS
+/usr/share/terminfo.db
+.NE
+.IP
+rather than
+.NS
+/usr/share/terminfo/
+.NE
+.IP
+The hashed database uses less disk-space and is a little faster than the
+directory tree.
+However,
+some applications assume the existence of the directory tree,
+reading it directly
+rather than using the terminfo library calls.
+.bP
+If \fBncurses\fP is built with a support for reading termcap files
+directly, then an entry in this list may be the path of a termcap file.
+.bP
+If the \fBTERMINFO\fP variable begins with
+\*(``hex:\*('' or \*(``b64:\*('',
+\fBncurses\fP uses the remainder of that variable as a compiled terminal
+description.
+You might produce the base64 format using \fBinfocmp\fP(1M):
+.NS
+TERMINFO="$(infocmp -0 -Q2 -q)"
+export TERMINFO
+.NE
+.IP
+The compiled description is used if it corresponds to the terminal identified
+by the \fBTERM\fP variable.
+.PP
+Setting \fBTERMINFO\fP is the simplest,
+but not the only way to set location of the default terminal database.
+The complete list of database locations in order follows:
+.RS 3
+.bP
+the last terminal database to which \fBncurses\fP wrote,
+if any, is searched first
+.bP
+the location specified by the TERMINFO environment variable
+.bP
+$HOME/.terminfo
+.bP
+locations listed in the TERMINFO_DIRS environment variable
+.bP
+one or more locations whose names are configured and compiled into the
+ncurses library, i.e.,
+.RS 3
+.bP
+@TERMINFO_DIRS@ (corresponding to the TERMINFO_DIRS variable)
+.bP
+@TERMINFO@ (corresponding to the TERMINFO variable)
+.RE
+.RE
+.PP
+.SS TERMINFO_DIRS
+.PP
+Specifies a list of locations to search for terminal descriptions.
+Each location in the list is a terminal database as described in
+the section on the \fBTERMINFO\fP variable.
+The list is separated by colons (i.e., ":") on Unix, semicolons on OS/2 EMX.
+.PP
+There is no corresponding feature in System V terminfo;
+it is an extension developed for \fBncurses\fP.
+.SS TERMPATH
+.PP
+If \fBTERMCAP\fP does not hold a file name then \fBncurses\fP checks
+the \fBTERMPATH\fP environment variable.
+This is a list of filenames separated by spaces or colons (i.e., ":") on Unix,
+semicolons on OS/2 EMX.
+.PP
+If the \fBTERMPATH\fP environment variable is not set,
+\fBncurses\fP looks in the files
+.NS
+/etc/termcap, /usr/share/misc/termcap and $HOME/.termcap,
+.NE
+.PP
+in that order.
+.PP
+The library may be configured to disregard the following variables when the
+current user is the superuser (root), or if the application uses setuid or
+setgid permissions:
+.NS
+$TERMINFO, $TERMINFO_DIRS, $TERMPATH, as well as $HOME.
+.NE
+.SH ALTERNATE CONFIGURATIONS
+.PP
+Several different configurations are possible,
+depending on the configure script options used when building \fBncurses\fP.
+There are a few main options whose effects are visible to the applications
+developer using \fBncurses\fP:
+.TP 5
+\-\-disable\-overwrite
+The standard include for \fBncurses\fP is as noted in \fBSYNOPSIS\fP:
+.NS
+\fB#include <curses.h>\fP
+.NE
+.IP
+This option is used to avoid filename conflicts when \fBncurses\fP
+is not the main implementation of curses of the computer.
+If \fBncurses\fP is installed disabling overwrite, it puts its headers in
+a subdirectory, e.g.,
+.NS
+\fB#include <ncurses/curses.h>\fP
+.NE
+.IP
+It also omits a symbolic link which would allow you to use \fB\-lcurses\fP
+to build executables.
+.TP 5
+\-\-enable\-widec
+The configure script renames the library and
+(if the \fB\-\-disable\-overwrite\fP option is used)
+puts the header files in a different subdirectory.
+All of the library names have a \*(``w\*('' appended to them,
+i.e., instead of
+.NS
+\fB\-lncurses\fP
+.NE
+.IP
+you link with
+.NS
+\fB\-lncursesw\fP
+.NE
+.IP
+You must also enable the wide-character features in the header file
+when compiling for the wide-character library
+to use the extended (wide-character) functions.
+The symbol which enables these features has changed since XSI Curses, Issue 4:
+.RS
+.bP
+Originally, the wide-character feature required the symbol
+\fB_XOPEN_SOURCE_EXTENDED\fP
+but that was only valid for XPG4 (1996).
+.bP
+Later, that was deemed conflicting with \fB_XOPEN_SOURCE\fP defined to 500.
+.bP
+As of mid-2018,
+none of the features in this implementation require a \fB_XOPEN_SOURCE\fP
+feature greater than 600.
+However, X/Open Curses, Issue 7 (2009) recommends defining it to 700.
+.bP
+Alternatively, you can enable the feature by defining \fBNCURSES_WIDECHAR\fP
+with the caveat that some other header file than \fBcurses.h\fP
+may require a specific value for \fB_XOPEN_SOURCE\fP
+(or a system-specific symbol).
+.RE
+.IP
+The \fBcurses.h\fP file which is installed for the wide-character
+library is designed to be compatible with the normal library's header.
+Only the size of the \fBWINDOW\fP structure differs, and very few
+applications require more than a pointer to \fBWINDOW\fPs.
+.IP
+If the headers are installed allowing overwrite,
+the wide-character library's headers should be installed last,
+to allow applications to be built using either library
+from the same set of headers.
+.TP 5
+\-\-with\-pthread
+The configure script renames the library.
+All of the library names have a \*(``t\*('' appended to them
+(before any \*(``w\*('' added by \fB\-\-enable\-widec\fP).
+.IP
+The global variables such as \fBLINES\fP are replaced by macros to
+allow read-only access.
+At the same time, setter-functions are provided to set these values.
+Some applications (very few) may require changes to work with this convention.
+.TP 5
+\-\-with\-shared
+.TP
+\-\-with\-normal
+.TP
+\-\-with\-debug
+.TP
+\-\-with\-profile
+The shared and normal (static) library names differ by their suffixes,
+e.g., \fBlibncurses.so\fP and \fBlibncurses.a\fP.
+The debug and profiling libraries add a \*(``_g\*(''
+and a \*(``_p\*('' to the root names respectively,
+e.g., \fBlibncurses_g.a\fP and \fBlibncurses_p.a\fP.
+.TP 5
+\-\-with\-termlib
+Low-level functions which do not depend upon whether the library
+supports wide-characters, are provided in the tinfo library.
+.IP
+By doing this, it is possible to share the tinfo library between
+wide/normal configurations as well as reduce the size of the library
+when only low-level functions are needed.
+.IP
+Those functions are described in these pages:
+.RS
+.bP
+\fBcurs_extend\fP(3X) \- miscellaneous curses extensions
+.bP
+\fBcurs_inopts\fP(3X) \- \fBcurses\fP input options
+.bP
+\fBcurs_kernel\fP(3X) \- low-level \fBcurses\fP routines
+.bP
+\fBcurs_termattrs\fP(3X) \- \fBcurses\fP environment query routines
+.bP
+\fBcurs_termcap\fP(3X) \- \fBcurses\fP emulation of termcap
+.bP
+\fBcurs_terminfo\fP(3X) \- \fBcurses\fP interfaces to terminfo database
+.bP
+\fBcurs_util\fP(3X) \- miscellaneous \fBcurses\fP utility routines
+.RE
+.TP 5
+\-\-with\-trace
+The \fBtrace\fP function normally resides in the debug library,
+but it is sometimes useful to configure this in the shared library.
+Configure scripts should check for the function's existence rather
+than assuming it is always in the debug library.
+.SH FILES
+.TP 5
+@DATADIR@/tabset
+directory containing initialization files for the terminal capability database
+@TERMINFO@
+terminal capability database
+.SH SEE ALSO
+\fBterminfo\fP(\*n) and related pages whose names begin
+\*(``curs_\*('' for detailed routine descriptions.
+.br
+\fBcurs_variables\fP(3X)
+.br
+\fBuser_caps\fP(5) for user-defined capabilities
+.SH EXTENSIONS
+The \fBncurses\fP library can be compiled with an option (\fB\-DUSE_GETCAP\fP)
+that falls back to the old-style /etc/termcap file if the terminal setup code
+cannot find a terminfo entry corresponding to \fBTERM\fP.
+Use of this feature
+is not recommended, as it essentially includes an entire termcap compiler in
+the \fBncurses\fP startup code, at significant cost in core and startup cycles.
+.PP
+The \fBncurses\fP library includes facilities for capturing mouse events on
+certain terminals (including xterm).
+See the \fBcurs_mouse\fP(3X)
+manual page for details.
+.PP
+The \fBncurses\fP library includes facilities for responding to window
+resizing events, e.g., when running in an xterm.
+See the \fBresizeterm\fP(3X)
+and \fBwresize\fP(3X) manual pages for details.
+In addition, the library may be configured with a \fBSIGWINCH\fP handler.
+.PP
+The \fBncurses\fP library extends the fixed set of function key capabilities
+of terminals by allowing the application designer to define additional
+key sequences at runtime.
+See the \fBdefine_key\fP(3X)
+\fBkey_defined\fP(3X),
+and \fBkeyok\fP(3X) manual pages for details.
+.PP
+The \fBncurses\fP library can exploit the capabilities of terminals which
+implement the ISO\-6429 SGR 39 and SGR 49 controls, which allow an application
+to reset the terminal to its original foreground and background colors.
+From the users' perspective, the application is able to draw colored
+text on a background whose color is set independently, providing better
+control over color contrasts.
+See the \fBdefault_colors\fP(3X) manual page for details.
+.PP
+The \fBncurses\fP library includes a function for directing application output
+to a printer attached to the terminal device.
+See the \fBcurs_print\fP(3X) manual page for details.
+.SH PORTABILITY
+The \fBncurses\fP library is intended to be BASE-level conformant with XSI
+Curses.
+The EXTENDED XSI Curses functionality
+(including color support) is supported.
+.PP
+A small number of local differences (that is, individual differences between
+the XSI Curses and \fBncurses\fP calls) are described in \fBPORTABILITY\fP
+sections of the library man pages.
+.SS Error checking
+.PP
+In many cases, X/Open Curses is vague about error conditions,
+omitting some of the SVr4 documentation.
+.PP
+Unlike other implementations, this one checks parameters such as pointers
+to WINDOW structures to ensure they are not null.
+The main reason for providing this behavior is to guard against programmer
+error.
+The standard interface does not provide a way for the library
+to tell an application which of several possible errors were detected.
+Relying on this (or some other) extension will adversely affect the
+portability of curses applications.
+.SS Extensions versus portability
+.PP
+Most of the extensions provided by ncurses have not been standardized.
+Some have been incorporated into other implementations, such as
+PDCurses or NetBSD curses.
+Here are a few to consider:
+.bP
+The routine \fBhas_key\fP is not part of XPG4, nor is it present in SVr4.
+See the \fBcurs_getch\fP(3X) manual page for details.
+.bP
+The routine \fBslk_attr\fP is not part of XPG4, nor is it present in SVr4.
+See the \fBcurs_slk\fP(3X) manual page for details.
+.bP
+The routines \fBgetmouse\fP, \fBmousemask\fP, \fBungetmouse\fP,
+\fBmouseinterval\fP, and \fBwenclose\fP relating to mouse interfacing are not
+part of XPG4, nor are they present in SVr4.
+See the \fBcurs_mouse\fP(3X) manual page for details.
+.bP
+The routine \fBmcprint\fP was not present in any previous curses implementation.
+See the \fBcurs_print\fP(3X) manual page for details.
+.bP
+The routine \fBwresize\fP is not part of XPG4, nor is it present in SVr4.
+See the \fBwresize\fP(3X) manual page for details.
+.bP
+The WINDOW structure's internal details can be hidden from application
+programs.
+See \fBcurs_opaque\fP(3X) for the discussion of \fBis_scrollok\fP, etc.
+.bP
+This implementation can be configured to provide rudimentary support
+for multi-threaded applications.
+See \fBcurs_threads\fP(3X) for details.
+.bP
+This implementation can also be configured to provide a set of functions which
+improve the ability to manage multiple screens.
+See \fBcurs_sp_funcs\fP(3X) for details.
+.SS Padding differences
+.PP
+In historic curses versions, delays embedded in the capabilities \fBcr\fP,
+\fBind\fP, \fBcub1\fP, \fBff\fP and \fBtab\fP activated corresponding delay
+bits in the UNIX tty driver.
+In this implementation, all padding is done by sending NUL bytes.
+This method is slightly more expensive, but narrows the interface
+to the UNIX kernel significantly and increases the package's portability
+correspondingly.
+.SS Header files
+The header file \fB<curses.h>\fP automatically includes the header files
+\fB<stdio.h>\fP and \fB<unctrl.h>\fP.
+.PP
+X/Open Curses has more to say,
+but does not finish the story:
+.RS 4
+.PP
+The inclusion of <curses.h> may make visible all symbols
+from the headers <stdio.h>, <term.h>, <termios.h>, and <wchar.h>.
+.RE
+.PP
+Here is a more complete story:
+.bP
+Starting with BSD curses, all implementations have included <stdio.h>.
+.IP
+BSD curses included <curses.h> and <unctrl.h> from an internal header
+"curses.ext" ("ext" was a short name for \fIexterns\fP).
+.IP
+BSD curses used <stdio.h> internally (for \fBprintw\fP and \fBscanw\fP),
+but nothing in <curses.h> itself relied upon <stdio.h>.
+.bP
+SVr2 curses added \fBnewterm\fP(3X), which relies upon <stdio.h>.
+That is, the function prototype uses \fBFILE\fP.
+.IP
+SVr4 curses added \fBputwin\fP and \fBgetwin\fP, which also use <stdio.h>.
+.IP
+X/Open Curses documents all three of these functions.
+.IP
+SVr4 curses and X/Open Curses do not require the developer to
+include <stdio.h> before including <curses.h>.
+Both document curses showing <curses.h> as the only required header.
+.IP
+As a result, standard <curses.h> will always include <stdio.h>.
+.bP
+X/Open Curses is inconsistent with respect to SVr4 regarding <unctrl.h>.
+.IP
+As noted in \fBcurs_util\fP(3X), ncurses includes <unctrl.h> from
+<curses.h> (like SVr4).
+.bP
+X/Open's comments about <term.h> and <termios.h> may refer to HP-UX and AIX:
+.IP
+HP-UX curses includes <term.h> from <curses.h>
+to declare \fBsetupterm\fP in curses.h,
+but ncurses (and Solaris curses) do not.
+.IP
+AIX curses includes <term.h> and <termios.h>.
+Again, ncurses (and Solaris curses) do not.
+.bP
+X/Open says that <curses.h> \fImay\fP include <term.h>,
+but there is no requirement that it do that.
+.IP
+Some programs use functions declared in both <curses.h> and <term.h>,
+and must include both headers in the same module.
+Very old versions of AIX curses required including <curses.h>
+before including <term.h>.
+.IP
+Because ncurses header files include the headers needed to
+define datatypes used in the headers,
+ncurses header files can be included in any order.
+But for portability, you should include <curses.h> before <term.h>.
+.bP
+X/Open Curses says \fI"may make visible"\fP
+because including a header file does not necessarily make all symbols
+in it visible (there are ifdef's to consider).
+.IP
+For instance, in ncurses <wchar.h> \fImay\fP be included if
+the proper symbol is defined, and if ncurses is configured for
+wide-character support.
+If the header is included, its symbols may be made visible.
+That depends on the value used for \fB_XOPEN_SOURCE\fP
+feature test macro.
+.bP
+X/Open Curses documents one required header,
+in a special case: <stdarg.h> before <curses.h> to prototype
+the \fBvw_printw\fP and \fBvw_scanw\fP functions
+(as well as the obsolete
+the \fBvwprintw\fP and \fBvwscanw\fP functions).
+Each of those uses a \fBva_list\fP parameter.
+.IP
+The two obsolete functions were introduced in SVr3.
+The other functions were introduced in X/Open Curses.
+In between, SVr4 curses provided for the possibility that
+an application might include either <varargs.h> or <stdarg.h>.
+Initially, that was done by using \fBvoid*\fP for the \fBva_list\fP
+parameter.
+Later, a special type (defined in <stdio.h>) was introduced,
+to allow for compiler type-checking.
+That special type is always available,
+because <stdio.h> is always included by <curses.h>.
+.IP
+None of the X/Open Curses implementations require an application
+to include <stdarg.h> before <curses.h> because they either
+have allowed for a special type, or (like ncurses) include <stdarg.h>
+directly to provide a portable interface.
+.SH NOTES
+.PP
+If standard output from a \fBncurses\fP program is re-directed to something
+which is not a tty, screen updates will be directed to standard error.
+This was an undocumented feature of AT&T System V Release 3 curses.
+.SH AUTHORS
+Zeyd M. Ben-Halim, Eric S. Raymond, Thomas E. Dickey.
+Based on \fIpcurses\fP by Pavel Curtis.
diff --git a/man/new_pair.3x b/man/new_pair.3x
new file mode 100644
index 0000000..ae20dd4
--- /dev/null
+++ b/man/new_pair.3x
@@ -0,0 +1,166 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 2017 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.                                                           *
+.\"***************************************************************************
+.\"
+.\" Author: Thomas E. Dickey
+.\"
+.\" $Id: new_pair.3x,v 1.19 2022/02/12 20:03:40 tom Exp $
+.TH new_pair 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.de NS
+.ie n  .sp
+.el    .sp .5
+.ie n  .in +4
+.el    .in +2
+.nf
+.ft C			\" Courier
+..
+.de NE
+.fi
+.ft R
+.ie n  .in -4
+.el    .in -2
+..
+.SH NAME
+\fBalloc_pair\fP,
+\fBfind_pair\fP,
+\fBfree_pair\fP \- new curses color-pair functions
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBint alloc_pair(int \fIfg\fB, int \fIbg\fB);\fR
+.br
+\fBint find_pair(int \fIfg\fB, int \fIbg\fB);\fR
+.br
+\fBint free_pair(int \fIpair\fB);\fR
+.SH DESCRIPTION
+These functions are an extension to the curses library.
+They permit an application to dynamically allocate a color pair using
+the foreground/background colors rather than assign a fixed color pair number,
+and return an unused pair to the pool.
+.PP
+The number of colors may be related to the number of possible color
+pairs for a given terminal, or it may not:
+.bP
+While almost all terminals allow setting the color \fIattributes\fP
+independently,
+it is unlikely that your terminal allows you to modify the attributes
+of a given character cell without rewriting it.
+That is, the foreground and background colors are applied as a pair.
+.bP
+Color pairs are the curses library's way of managing a color palette
+on a terminal.
+If the library does not keep track of the \fIcombinations\fP of
+colors which are displayed, it will be inefficient.
+.bP
+For simple terminal emulators
+with only a few dozen color combinations,
+it is convenient to use the maximum number of combinations
+as the limit on color pairs:
+.NS
+\fBCOLORS\fI * \fBCOLORS\fR
+.NE
+.bP
+Terminals which support \fIdefault colors\fP distinct
+from \*(``ANSI colors\*(''
+add to the possible combinations, producing this total:
+.NS
+\fI( \fBCOLORS\fI + 1 ) * ( \fBCOLORS\fI + 1 )\fR
+.NE
+.bP
+An application might use up to a few dozen color pairs to
+implement a predefined color scheme.
+.IP
+Beyond that lies in the realm of programs using the foreground
+and background colors for \*(``ASCII art\*(''
+(or some other non-textual application).
+.IP
+Also beyond those few dozen pairs, the required size for a table
+to represent the combinations grows rapidly with an increasing number of colors.
+.IP
+These functions allow a developer to let the screen library
+manage color pairs.
+.SS alloc_pair
+The \fBalloc_pair\fP function accepts parameters for
+foreground and background color, and
+checks if that color combination is already associated with a color pair.
+.bP
+If the combination already exists,
+\fBalloc_pair\fP returns the existing pair.
+.bP
+If the combination does not exist,
+\fBalloc_pair\fP allocates a new color pair and returns that.
+.bP
+If the table fills up, \fBalloc_pair\fP discards the least-recently
+allocated entry using \fBfree_pair\fP and allocates a new color pair.
+.PP
+All of the color pairs are allocated from a table of possible color pairs.
+The size of the table is determined by the terminfo \fBpairs\fP capability.
+The table is shared with \fBinit_pair\fP;
+in fact \fBalloc_pair\fP calls \fBinit_pair\fP after
+updating the ncurses library's fast index to the colors versus color pairs.
+.SS find_pair
+The \fBfind_pair\fP function accepts parameters for
+foreground and background color, and
+checks if that color combination is already associated with a color pair,
+returning the pair number if it has been allocated.
+Otherwise it returns \-1.
+.SS free_pair
+Marks the given color pair as unused,
+i.e., like color pair 0.
+.SH RETURN VALUE
+.PP
+The \fBalloc_pair\fP function returns a color pair number in the range
+1 through \fBCOLOR_PAIRS\fP\-1, unless it encounters an error updating
+its fast index to the color pair values, preventing it from allocating
+a color pair.
+In that case, it returns \-1.
+.PP
+The \fBfind_pair\fP function returns a color pair number if the
+given color combination has been associated with a color pair,
+or \-1 if not.
+.PP
+Likewise, \fBfree_pair\fP returns \fBOK\fP unless it encounters an
+error updating the fast index or if no such color pair is in use.
+.SH PORTABILITY
+These routines are specific to ncurses.
+They were not supported on
+Version 7, BSD or System V implementations.
+It is recommended that
+any code depending on them be conditioned using NCURSES_VERSION.
+.SH SEE ALSO
+\fBcurs_color\fP(3X).
+.SH AUTHOR
+Thomas Dickey.
diff --git a/man/panel.3x b/man/panel.3x
new file mode 100644
index 0000000..f16931c
--- /dev/null
+++ b/man/panel.3x
@@ -0,0 +1,279 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2016,2017 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: panel.3x,v 1.42 2022/02/12 20:03:40 tom Exp $
+.TH panel 3X ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.SH NAME
+panel \- panel stack extension for curses
+.SH SYNOPSIS
+\fB#include <panel.h>\fP
+.P
+\fBcc [flags] sourcefiles \-lpanel \-lncurses\fP
+.P
+\fBPANEL *new_panel(WINDOW *\fIwin\fB);\fR
+.sp
+\fBint bottom_panel(PANEL *\fIpan\fB);\fR
+.br
+\fBint top_panel(PANEL *\fIpan\fB);\fR
+.br
+\fBint show_panel(PANEL *\fIpan\fB);\fR
+.br
+\fBvoid update_panels(void);\fP
+.br
+\fBint hide_panel(PANEL *\fIpan\fB);\fR
+.sp
+\fBWINDOW *panel_window(const PANEL *\fIpan\fB);\fR
+.br
+\fBint replace_panel(PANEL *\fIpan\fB, WINDOW *\fIwindow\fB);\fR
+.br
+\fBint move_panel(PANEL *\fIpan\fB, int \fIstarty\fB, int \fIstartx\fB);\fR
+.br
+\fBint panel_hidden(const PANEL *\fIpan\fB);\fR
+.sp
+\fBPANEL *panel_above(const PANEL *\fIpan\fB);\fR
+.br
+\fBPANEL *panel_below(const PANEL *\fIpan\fB);\fR
+.sp
+\fBint set_panel_userptr(PANEL *\fIpan\fB, const void *\fIptr\fB);\fR
+.br
+\fBconst void *panel_userptr(const PANEL *\fIpan\fB);\fR
+.sp
+\fBint del_panel(PANEL *\fIpan\fB);\fR
+.sp
+\fR/* ncurses-extensions */\fP
+.br
+\fBPANEL *ground_panel(SCREEN *\fIsp\fB);\fR
+.br
+\fBPANEL *ceiling_panel(SCREEN *\fIsp\fB);\fR
+.br
+.SH DESCRIPTION
+Panels are \fBcurses\fP(3X) windows with the added feature of
+depth.
+Panel functions allow the use of stacked windows and ensure
+the proper portions of each window and the curses \fBstdscr\fP window are
+hidden or displayed when panels are added, moved, modified or removed.
+The set of currently visible panels is the stack of panels.
+The
+\fBstdscr\fP window is beneath all panels, and is not considered part
+of the stack.
+.P
+A window is associated with every panel.
+The panel routines enable
+you to create, move, hide, and show panels, as well as position a
+panel at any desired location in the stack.
+.P
+Panel routines are a functional layer added to \fBcurses\fP(3X), make only
+high-level curses calls, and work anywhere terminfo curses does.
+.SH FUNCTIONS
+.\" ---------
+.SS bottom_panel
+\fBbottom_panel(\fIpan\fB)\fR
+puts panel \fIpan\fP at the bottom of all panels.
+.\" ---------
+.SS ceiling_panel
+\fBceiling_panel(\fIsp\fB)\fR
+acts like \fBpanel_below(NULL)\fP, for the given \fBSCREEN\fP \fIsp\fP.
+.\" ---------
+.SS del_panel
+\fBdel_panel(\fIpan\fB)\fR
+removes the given panel \fIpan\fP from the  stack and deallocates the
+\fBPANEL\fP structure (but not its associated window).
+.\" ---------
+.SS ground_panel
+\fBground_panel(\fIsp\fB)\fR
+acts like \fBpanel_above(NULL)\fP, for the given \fBSCREEN\fP \fIsp\fP.
+.\" ---------
+.SS hide_panel
+\fBhide_panel(\fIpan\fB)\fR
+removes the given panel \fIpan\fP from the panel stack
+and thus hides it from view.
+The \fBPANEL\fP structure is not lost, merely removed from the stack.
+.\" ---------
+.SS move_panel
+\fBmove_panel(\fIpan\fB,\fIstarty\fB,\fIstartx\fB)\fR
+moves the given panel \fIpan\fP's window so that its upper-left corner is at
+\fIstarty\fP, \fIstartx\fP.
+It does not change the position of the panel in the stack.
+Be sure to use this function, not \fBmvwin\fP(3X), to move a panel window.
+.\" ---------
+.SS new_panel
+\fBnew_panel(\fIwin\fB)\fR allocates a \fBPANEL\fR structure,
+associates it with \fIwin\fP, places the panel on the top of the stack
+(causes  it to  be  displayed above any other panel) and returns a
+pointer to the new panel.
+.\" ---------
+.SS panel_above
+\fBpanel_above(\fIpan\fB)\fR
+returns a pointer to the panel above \fIpan\fP.
+If the panel argument is
+\fB(PANEL *)0\fP, it returns a pointer to the bottom panel in the stack.
+.\" ---------
+.SS panel_below
+\fBpanel_below(\fIpan\fB)\fR
+returns a pointer to the panel just below \fIpan\fP.
+If the panel argument
+is \fB(PANEL *)0\fP, it returns a pointer to the top panel in the stack.
+.\" ---------
+.SS panel_hidden
+\fBpanel_hidden(\fIpan\fB)\fR
+returns \fBTRUE\fP if the panel \fIpan\fP is in the panel stack,
+\fBFALSE\fP if it is not.
+If the panel is a null pointer, return \fBERR\fP.
+.\" ---------
+.SS panel_userptr
+\fBpanel_userptr(\fIpan\fB)\fR
+returns the user pointer for a given panel \fIpan\fP.
+.\" ---------
+.SS panel_window
+\fBpanel_window(\fIpan\fB)\fR
+returns a pointer to the window of the given panel \fIpan\fP.
+.\" ---------
+.SS replace_panel
+\fBreplace_panel(\fIpan\fB,\fIwindow\fB)\fR
+replaces the current window of panel \fIpan\fP with \fIwindow\fP
+This is useful, for example if you want to resize a panel.
+In \fBncurses\fP, you can call \fBreplace_panel\fP
+to resize a panel using a window resized with \fBwresize\fP(3X).
+It does not change the position of the panel in the stack.
+.\" ---------
+.SS set_panel_userptr
+\fBset_panel_userptr(\fIpan\fB,\fIptr\fB)\fR
+sets the panel's user pointer.
+.\" ---------
+.SS show_panel
+\fBshow_panel(\fIpan\fB)\fR
+makes a hidden panel visible by placing it on top of the panels in the
+panel stack.
+See \fBCOMPATIBILITY\fP below.
+.\" ---------
+.SS top_panel
+\fBtop_panel(\fIpan\fB)\fR
+puts the given visible panel \fIpan\fP on top of all panels in the stack.
+See \fBCOMPATIBILITY\fP below.
+.\" ---------
+.SS update_panels
+\fBupdate_panels()\fR
+refreshes the \fIvirtual screen\fP to reflect the relations between the
+panels in the stack, but does not call \fBdoupdate\fP(3X) to refresh the
+\fIphysical screen\fP.
+Use this function and not \fBwrefresh\fP(3X) or \fBwnoutrefresh\fP(3X).
+.PP
+\fBupdate_panels\fP may be called more than once before a call to
+\fBdoupdate\fP, but \fBdoupdate\fP is the function responsible for updating
+the \fIphysical screen\fP.
+.SH DIAGNOSTICS
+Each routine that returns a pointer returns \fBNULL\fP if an error
+occurs.
+Each routine that returns an int value returns \fBOK\fP if it
+executes successfully and \fBERR\fP if not.
+.PP
+Except as noted, the \fIpan\fP and \fIwindow\fP parameters must be non-null.
+If those are null, an error is returned.
+.PP
+The \fBmove_panel\fP function uses \fBmvwin\fP(3X),
+and will return an error if \fBmvwin\fP returns an error.
+.SH COMPATIBILITY
+Reasonable care has been taken to  ensure  compatibility
+with  the  native  panel facility introduced in System V (inspection of
+the SVr4 manual pages suggests the programming interface is unchanged).
+The \fBPANEL\fP data structures are merely  similar.
+The  programmer
+is cautioned not to directly use \fBPANEL\fP fields.
+.P
+The functions \fBshow_panel\fP and \fBtop_panel\fP are identical
+in this implementation, and work equally well with displayed or hidden
+panels.
+In the native System V implementation, \fBshow_panel\fP is
+intended for making a hidden panel visible (at the top of the stack)
+and \fBtop_panel\fP is intended for making an already-visible panel
+move to the top of the stack.
+You are cautioned to use the correct
+function to ensure compatibility with native panel libraries.
+.SH NOTE
+In your library list, libpanel.a should be before libncurses.a; that is,
+you should say \*(``\-lpanel \-lncurses\*('', not the other way around
+(which would give a link-error with static libraries).
+.SH PORTABILITY
+.PP
+The panel facility was documented in SVr4.2 in
+\fICharacter User Interface Programming (UNIX SVR4.2)\fP.
+.PP
+It is not part of X/Open Curses.
+.PP
+A few implementations exist:
+.bP
+Systems based on SVr4 source code,
+e.g., Solaris, provide this library.
+.bP
+\fBncurses\fP (since version 0.6 in 1993)
+and \fBPDCurses\fP (since version 2.2 in 1995)
+provide a panel library whose common ancestor
+was a public domain implementation by Warren Tucker
+published in \fIu386mon\fP 2.20 (1990).
+.IP
+According to Tucker, the SystemV panel library
+was first released in SVr3.2 (1988),
+and his implementation helped with a port to SVr3.1 (1987).
+.IP
+Several developers have improved each of these;
+they are no longer the same as Tucker's implementation.
+.bP
+NetBSD 8 (2018)
+has a panel library begun by Valery Ushakov in 2015.
+This is based on the AT&T documentation.
+.SH FILES
+.P
+panel.h
+interface for the panels library
+.P
+libpanel.a
+the panels library itself
+.SH SEE ALSO
+\fBcurses\fP(3X),
+\fBcurs_variables\fP(3X),
+.PP
+This describes \fBncurses\fP
+version @NCURSES_MAJOR@.@NCURSES_MINOR@ (patch @NCURSES_PATCH@).
+.SH AUTHOR
+.PP
+Originally written by Warren Tucker <wht@n4hgf.mt-park.ga.us>,
+primarily to assist in porting \fIu386mon\fP to systems without a native
+panels library.
+.PP
+Repackaged for ncurses by Zeyd ben-Halim.
+.PP
+Juergen Pfeifer and Thomas E. Dickey revised/improved the library.
diff --git a/man/resizeterm.3x b/man/resizeterm.3x
new file mode 100644
index 0000000..37094d8
--- /dev/null
+++ b/man/resizeterm.3x
@@ -0,0 +1,181 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2015,2017 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.                                                           *
+.\"***************************************************************************
+.\"
+.\" Author: Thomas E. Dickey 1996-on
+.\"
+.\" $Id: resizeterm.3x,v 1.32 2022/02/20 00:32:18 tom Exp $
+.TH resizeterm 3X ""
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.SH NAME
+\fBis_term_resized\fP,
+\fBresize_term\fP,
+\fBresizeterm\fP \- change the curses terminal size
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBbool is_term_resized(int \fIlines\fB, int \fIcolumns\fB);\fR
+.br
+\fBint resize_term(int \fIlines\fB, int \fIcolumns\fB);\fR
+.br
+\fBint resizeterm(int \fIlines\fB, int \fIcolumns\fB);\fR
+.SH DESCRIPTION
+.PP
+This is an extension to the curses library.
+It provides callers with a hook into the \fBncurses\fP data to resize windows,
+primarily for use by programs running in an X Window terminal (e.g., xterm)
+when the terminal's screen size is changed by the user:
+.bP
+Curses windows cannot extend outside the screen.
+If the terminal is shrunk, curses windows must be shrunk to fit.
+.bP
+If the terminal is stretched,
+rows and/or columns can be added to existing windows.
+The added cells should match the current attributes of the windows.
+.PP
+If the calling program has not set up a handler for \fBSIGWINCH\fP
+when it initializes \fBncurses\fP
+(e.g., using \fBinitscr\fP(3X) or \fBnewterm\fP(3X)),
+then \fBncurses\fP sets a handler for \fBSIGWINCH\fP which notifies
+the library when a window-size event has occurred.
+The library checks for this notification
+.bP
+when reading input data,
+.bP
+when implicitly resuming program mode
+(e.g., between \fBendwin\fP(3X) and \fBwrefresh\fP(3X)),
+and
+.bP
+when explicitly resuming program mode in \fBrestartterm\fP(3X).
+.PP
+When the library has found that the terminal's window-size has
+changed, it calls \fBresizeterm\fP to update its data structures.
+.PP
+An application which establishes its own \fBSIGWINCH\fP handler
+can call \fBresizeterm\fP, but in that case, the library will not
+see \fBSIGWINCH\fP, and proper layout will rely upon the application.
+.SH FUNCTIONS
+.SS resizeterm
+.PP
+The function \fBresizeterm\fP resizes the standard and current windows
+(i.e., \fBstdscr\fP and \fBcurscr\fP)
+to the specified dimensions, and adjusts other bookkeeping data used by
+the \fBncurses\fP library that record the window dimensions
+such as the \fBLINES\fP and \fBCOLS\fP variables.
+.SS resize_term
+.PP
+Most of the work for \fBresizeterm\fP is
+done by the inner function \fBresize_term\fP.
+The outer function \fBresizeterm\fP adds bookkeeping
+for the \fBSIGWINCH\fP handler,
+as well as repainting the soft-key area (see \fBslk_touch\fP(3X)).
+.PP
+The \fBresize_term\fP function attempts to resize all windows.
+This helps with simple applications.
+However:
+.bP
+It is not possible to automatically resize pads.
+.bP
+Applications which have complicated layouts should check for
+\fBKEY_RESIZE\fP returned from \fBwgetch\fP,
+and adjust their layout, e.g., using \fBwresize\fP and \fBmvwin\fP,
+or by recreating the windows.
+.PP
+When resizing windows, \fBresize_term\fP recursively adjusts subwindows,
+keeping them within the updated parent window's limits.
+If a top-level window happens to extend to the screen's limits,
+then on resizing the window, \fBresize_term\fP will keep the window
+extending to the corresponding limit, regardless of whether the
+screen has shrunk or grown.
+.SS is_term_resized
+.PP
+A support function \fBis_term_resized\fP is provided so that applications
+can check if the \fBresize_term\fP function would modify the window structures.
+It returns \fBTRUE\fP if the windows would be modified,
+and \fBFALSE\fP otherwise.
+.SH RETURN VALUE
+Except as noted, these functions return
+the integer \fBERR\fP upon failure and \fBOK\fP on success.
+They will fail if either of the dimensions are less than or equal to zero,
+or if an error occurs while (re)allocating memory for the windows.
+.SH NOTES
+While these functions are intended to be used to support a signal handler
+(i.e., for \fBSIGWINCH\fP), care should be taken to avoid invoking them in a
+context where \fBmalloc\fP or \fBrealloc\fP may have been interrupted,
+since it uses those functions.
+.PP
+If ncurses is configured to supply its own \fBSIGWINCH\fP handler,
+.bP
+on receipt of a \fBSIGWINCH\fP, the handler sets a flag
+.bP
+which is tested in
+\fBwgetch\fP(3X),
+\fBdoupdate\fP(3X) and
+\fBrestartterm\fP(3X),
+.bP
+in turn, calling the \fBresizeterm\fP function,
+.bP
+which \fBungetch\fP's a \fBKEY_RESIZE\fP which
+will be read on the next call to \fBwgetch\fP.
+.IP
+The \fBKEY_RESIZE\fP alerts an application that the screen size has changed,
+and that it should repaint special features such as pads that cannot
+be done automatically.
+.IP
+Calling \fBresizeterm\fP or \fBresize_term\fP
+directly from a signal handler is unsafe.
+This indirect method is used to provide a safe way to resize the ncurses
+data structures.
+.PP
+If the environment variables \fBLINES\fP or \fBCOLUMNS\fP are set,
+this overrides the library's use of the window size obtained from
+the operating system.
+Thus, even if a \fBSIGWINCH\fP is received,
+no screen size change may be recorded.
+.SH PORTABILITY
+.PP
+It is possible to resize the screen with SVr4 curses,
+by
+.bP
+exiting curses with \fBendwin\fP(3X) and
+.bP
+resuming using \fBrefresh\fP(3X).
+.PP
+Doing that clears the screen and is visually distracting.
+.PP
+This extension of ncurses was introduced in mid-1995.
+It was adopted in NetBSD curses (2001) and PDCurses (2003).
+.SH SEE ALSO
+\fBcurs_getch\fP(3X),
+\fBcurs_variables\fP(3X),
+\fBwresize\fP(3X).
+.SH AUTHOR
+Thomas Dickey (from an equivalent function written in 1988 for BSD curses).
diff --git a/man/scr_dump.5 b/man/scr_dump.5
new file mode 100644
index 0000000..fd2e1a0
--- /dev/null
+++ b/man/scr_dump.5
@@ -0,0 +1,429 @@
+.\"***************************************************************************
+.\" Copyright 2018-2020,2021 Thomas E. Dickey                                *
+.\" Copyright 2017 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: scr_dump.5,v 1.20 2021/12/25 21:13:38 tom Exp $
+.TH scr_dump 5
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de NS
+.ie n  .sp
+.el    .sp .5
+.ie n  .in +4
+.el    .in +2
+.nf
+.ft C			\" Courier
+..
+.de NE
+.fi
+.ft R
+.ie n  .in -4
+.el    .in -2
+..
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.SH NAME
+scr_dump \- format of curses screen-dumps.
+.SH SYNOPSIS
+.B scr_dump
+.SH DESCRIPTION
+.PP
+The curses library provides applications with the ability to write the
+contents of a window to an external file using \fBscr_dump\fP or \fBputwin\fP,
+and read it back using \fBscr_restore\fP or \fBgetwin\fP.
+.PP
+The \fBputwin\fP and \fBgetwin\fP functions do the work;
+while \fBscr_dump\fP and \fBscr_restore\fP conveniently save and restore
+the whole screen, i.e., \fBstdscr\fP.
+.SS ncurses6
+.PP
+A longstanding implementation of screen-dump was
+revised with ncurses6 to remedy problems with the earlier approach:
+.bP
+A \*(``magic number\*('' is written to the beginning of the dump file,
+allowing applications (such as \fBfile\fP(1)) to recognize curses dump files.
+.IP
+Because ncurses6 uses a new format,
+that requires a new magic number
+was unused by other applications.
+This 16-bit number was unused:
+.NS
+0x8888 (octal \*(``\\210\\210\*('')
+.NE
+.IP
+but to be more certain, this 32-bit number was chosen:
+.NS
+0x88888888 (octal \*(``\\210\\210\\210\\210\*('')
+.NE
+.IP
+This is the pattern submitted to the maintainers of the \fBfile\fP program:
+.NS
+#
+# ncurses5 (and before) did not use a magic number,
+# making screen dumps "data".
+#
+# ncurses6 (2015) uses this format, ignoring byte-order
+0    string    \\210\\210\\210\\210ncurses    ncurses6 screen image
+#
+.NE
+.bP
+The screen dumps are written in textual form,
+so that internal data sizes are not directly related to the dump-format, and
+enabling the library to read dumps from either narrow- or wide-character-
+configurations.
+.IP
+The \fInarrow\fP library configuration holds characters and video attributes
+in a 32-bit \fBchtype\fP, while the \fIwide-character\fP library stores
+this information in the \fBcchar_t\fP structure, which is much larger than
+32-bits.
+.bP
+It is possible to read a screen dump into a terminal with a different
+screen-size,
+because the library truncates or fills the screen as necessary.
+.bP
+The ncurses6 \fBgetwin\fP reads the legacy screen dumps from ncurses5.
+.SS ncurses5 (legacy)
+.PP
+The screen-dump feature was added to ncurses in June 1995.
+While there were fixes and improvements in succeeding years,
+the basic scheme was unchanged:
+.bP
+The \fBWINDOW\fP structure was written in binary form.
+.bP
+The \fBWINDOW\fP structure refers to lines of data,
+which were written as an array of binary data following the \fBWINDOW\fP.
+.bP
+When \fBgetwin\fP restored the window,
+it would keep track of offsets into the array of line-data
+and adjust the \fBWINDOW\fP structure which was read back into memory.
+.PP
+This is similar to Unix SystemV,
+but does not write a \*(``magic number\*('' to identify the file format.
+.SH PORTABILITY
+.PP
+There is no standard format for \fBputwin\fP.
+This section gives a brief description of the existing formats.
+.SS X/Open Curses
+.PP
+Refer to \fIX/Open Curses, Issue 7\fP (2009).
+.PP
+X/Open's documentation for \fIenhanced curses\fP says only:
+.RS 3
+.PP
+The \fBgetwin(\ ) \fPfunction reads window-related data
+stored in the file by \fIputwin(\ )\fP.
+The function
+then creates and initializes a new window using that data.
+.PP
+The \fBputwin(\ )\fP function writes all data associated
+with \fIwin\fP into the \fBstdio\fP(3) stream to which \fIfilep\fP
+points, using an \fBunspecified format\fP.
+This information can be retrieved later using \fBgetwin(\ )\fP.
+.RE
+.PP
+In the mid-1990s when the X/Open Curses document was written,
+there were still systems using older, less capable curses libraries
+(aside from the BSD curses library which was not relevant to X/Open
+because it did not meet the criteria for \fIbase curses\fP).
+The document explained the term \*(``enhanced\*('' as follows:
+.RS 3
+.bP
+Shading is used to identify \fIX/Open Enhanced Curses\fP material,
+relating to interfaces included to provide enhanced capabilities
+for applications originally written to be compiled on systems
+based on the UNIX operating system.
+Therefore, the features described may not be present on systems
+that conform to \fBXPG4 or to earlier XPG releases\fP.
+The relevant reference pages may provide additional
+or more specific portability warnings about use of the material.
+.RE
+.PP
+In the foregoing, emphasis was added to \fBunspecified format\fP
+and to \fBXPG4 or to earlier XPG releases\fP,
+for clarity.
+.SS Unix SystemV
+.PP
+Unix SystemV curses identified the file format by writing a
+\*(``magic number\*('' at the beginning of the dump.
+The \fBWINDOW\fP data and the lines of text follow, all in binary form.
+.PP
+The Solaris curses source has these definitions:
+.NS
+/* terminfo magic number */
+#define MAGNUM  0432
+
+/* curses screen dump magic number */
+#define SVR2_DUMP_MAGIC_NUMBER  0433
+#define SVR3_DUMP_MAGIC_NUMBER  0434
+.NE
+.PP
+That is, the feature was likely introduced in SVr2 (1984),
+and improved in SVr3 (1987).
+The Solaris curses source has no magic number for SVr4 (1989).
+Other operating systems (AIX and HPUX) use a magic number which would
+correspond to this definition:
+.NS
+/* curses screen dump magic number */
+#define SVR4_DUMP_MAGIC_NUMBER  0435
+.NE
+.PP
+That octal number in bytes is 001, 035.
+Because most Unix vendors use big-endian hardware,
+the magic number is written with the high-order byte first, e.g.,
+.NS
+\001\035
+.NE
+.PP
+After the magic number, the \fBWINDOW\fP structure and line-data are
+written in binary format.
+While the magic number used by the Unix systems can be seen using \fBod\fP(1),
+none of the Unix systems documents the format used for screen-dumps.
+.PP
+The Unix systems do not use identical formats.
+While collecting information for for this manual page,
+the \fIsavescreen\fP test-program
+produced dumps of different size
+(all on 64-bit hardware, on 40x80 screens):
+.bP
+AIX (51817 bytes)
+.bP
+HPUX (90093 bytes)
+.bP
+Solaris 10 (13273 bytes)
+.bP
+ncurses5 (12888 bytes)
+.SS Solaris
+.PP
+As noted above, Solaris curses has no magic number corresponding
+to SVr4 curses.
+This is odd since Solaris was the first operating system
+to pass the SVr4 guidelines.
+Solaris has two versions of curses:
+.bP
+The default curses library uses the SVr3 magic number.
+.bP
+There is an alternate curses library in \fB/usr/xpg4\fP.
+This uses a textual format with no magic number.
+.IP
+According to the copyright notice, the \fIxpg4\fP Solaris curses library was
+developed by MKS (Mortice Kern Systems) from 1990 to 1995.
+.IP
+Like ncurses6, there is a file-header with parameters.
+Unlike ncurses6, the contents of the window are written piecemeal,
+with coordinates and attributes for each chunk of text rather
+than writing the whole window from top to bottom.
+.SS PDCurses
+.PP
+PDCurses added support for screen dumps in version 2.7 (2005).
+Like Unix SystemV and ncurses5,
+it writes the \fBWINDOW\fP structure in binary,
+but begins the file with its three-byte identifier \*(``PDC\*('',
+followed by a one-byte version,
+e.g.,
+.NS
+	\*(``PDC\\001\*(''
+.NE
+.SS NetBSD
+.PP
+As of April 2017, NetBSD curses does
+not support \fBscr_dump\fP and \fBscr_restore\fP
+(or \fBscr_init\fP, \fBscr_set\fP),
+although it has \fBputwin\fP and \fBgetwin\fP.
+.PP
+Like ncurses5, NetBSD \fBputwin\fP does not identify its dumps with a
+useful magic number.
+It writes
+.bP
+the curses shared library major and minor versions
+as the first two bytes (e.g., 7 and 1),
+.bP
+followed by a binary dump of the \fBWINDOW\fP,
+.bP
+some data for wide-characters referenced by the \fBWINDOW\fP structure, and
+.bP
+finally, lines as done by other implementations.
+.SH EXAMPLE
+.PP
+Given a simple program which writes text to the screen
+(and for the sake of example, limiting the screen-size to 10x20):
+.NS
+#include <curses.h>
+
+int
+main(void)
+{
+    putenv("LINES=10");
+    putenv("COLUMNS=20");
+    initscr();
+    start_color();
+    init_pair(1, COLOR_WHITE, COLOR_BLUE);
+    init_pair(2, COLOR_RED, COLOR_BLACK);
+    bkgd(COLOR_PAIR(1));
+    move(4, 5);
+    attron(A_BOLD);
+    addstr("Hello");
+    move(5, 5);
+    attroff(A_BOLD);
+    attrset(A_REVERSE | COLOR_PAIR(2));
+    addstr("World!");
+    refresh();
+    scr_dump("foo.out");
+    endwin();
+    return 0;
+}
+.NE
+.PP
+When run using ncurses6, the output looks like this:
+.NS
+\\210\\210\\210\\210ncurses 6.0.20170415
+_cury=5
+_curx=11
+_maxy=9
+_maxx=19
+_flags=14
+_attrs=\\{REVERSE|C2}
+flag=_idcok
+_delay=-1
+_regbottom=9
+_bkgrnd=\\{NORMAL|C1}\\s
+rows:
+1:\\{NORMAL|C1}\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s
+2:\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s
+3:\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s
+4:\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s
+5:\\s\\s\\s\\s\\s\\{BOLD}Hello\\{NORMAL}\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s
+6:\\s\\s\\s\\s\\s\\{REVERSE|C2}World!\\{NORMAL|C1}\\s\\s\\s\\s\\s\\s\\s\\s\\s
+7:\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s
+8:\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s
+9:\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s
+10:\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s\\s
+.NE
+.PP
+The first four octal escapes are actually nonprinting characters,
+while the remainder of the file is printable text.
+You may notice:
+.bP
+The actual color pair values are not written to the file.
+.bP
+All characters are shown in printable form; spaces are \*(``\\s\*('' to
+ensure they are not overlooked.
+.bP
+Attributes are written in escaped curly braces, e.g., \*(``\\{BOLD}\*('',
+and may include a color-pair (C1 or C2 in this example).
+.bP
+The parameters in the header are written out only if they are nonzero.
+When reading back, order does not matter.
+.ne 10
+.PP
+Running the same program with Solaris \fIxpg4\fP curses gives this dump:
+.NS
+MAX=10,20
+BEG=0,0
+SCROLL=0,10
+VMIN=1
+VTIME=0
+FLAGS=0x1000
+FG=0,0
+BG=0,0,
+0,0,0,1,
+0,19,0,0,
+1,0,0,1,
+1,19,0,0,
+2,0,0,1,
+2,19,0,0,
+3,0,0,1,
+3,19,0,0,
+4,0,0,1,
+4,5,0x20,0,Hello
+4,10,0,1,
+4,19,0,0,
+5,0,0,1,
+5,5,0x4,2,World!
+5,11,0,1,
+5,19,0,0,
+6,0,0,1,
+6,19,0,0,
+7,0,0,1,
+7,19,0,0,
+8,0,0,1,
+8,19,0,0,
+9,0,0,1,
+9,19,0,0,
+CUR=11,5
+.NE
+.PP
+Solaris \fBgetwin\fP requires that all parameters are present, and
+in the same order.
+The \fIxpg4\fP curses library does not know about the \fBbce\fP
+(back color erase) capability, and does not color the window background.
+.ne 10
+.PP
+On the other hand, the SVr4 curses library does know about the background color.
+However, its screen dumps are in binary.
+Here is the corresponding dump (using \*(``od -t x1\*(''):
+.NS
+0000000 1c 01 c3 d6 f3 58 05 00 0b 00 0a 00 14 00 00 00
+0000020 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00
+0000040 00 00 b8 1a 06 08 cc 1a 06 08 00 00 09 00 10 00
+0000060 00 00 00 80 00 00 20 00 00 00 ff ff ff ff 00 00
+0000100 ff ff ff ff 00 00 00 00 20 80 00 00 20 80 00 00
+0000120 20 80 00 00 20 80 00 00 20 80 00 00 20 80 00 00
+*
+0000620 20 80 00 00 20 80 00 00 20 80 00 00 48 80 00 04
+0000640 65 80 00 04 6c 80 00 04 6c 80 00 04 6f 80 00 04
+0000660 20 80 00 00 20 80 00 00 20 80 00 00 20 80 00 00
+*
+0000740 20 80 00 00 20 80 00 00 20 80 00 00 57 00 81 00
+0000760 6f 00 81 00 72 00 81 00 6c 00 81 00 64 00 81 00
+0001000 21 00 81 00 20 80 00 00 20 80 00 00 20 80 00 00
+0001020 20 80 00 00 20 80 00 00 20 80 00 00 20 80 00 00
+*
+0001540 20 80 00 00 20 80 00 00 00 00 f6 d1 01 00 f6 d1
+0001560 08 00 00 00 40 00 00 00 00 00 00 00 00 00 00 07
+0001600 00 04 00 01 00 01 00 00 00 01 00 00 00 00 00 00
+0001620 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+*
+0002371
+.NE
+.SH SEE ALSO
+.PP
+\fBcurs_scr_dump\fP(3X),
+\fBcurs_util\fP(3X).
+.SH AUTHORS
+.PP
+Thomas E. Dickey
+.br
+extended screen-dump format for ncurses 6.0 (2015)
+.sp
+Eric S. Raymond
+.br
+screen dump feature in ncurses 1.9.2d (1995)
diff --git a/man/tabs.1 b/man/tabs.1
new file mode 100644
index 0000000..84c6b22
--- /dev/null
+++ b/man/tabs.1
@@ -0,0 +1,293 @@
+.\"***************************************************************************
+.\" Copyright 2018-2020,2021 Thomas E. Dickey                                *
+.\" Copyright 2008-2016,2017 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: tabs.1,v 1.35 2021/12/25 19:04:39 tom Exp $
+.TH @TABS@ 1 ""
+.ds n 5
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.de NS
+.ie n  .sp
+.el    .sp .5
+.ie n  .in +4
+.el    .in +2
+.nf
+.ft C			\" Courier
+..
+.de NE
+.fi
+.ft R
+.ie n  .in -4
+.el    .in -2
+..
+.SH NAME
+\fB@TABS@\fP \- set tabs on a terminal
+.SH SYNOPSIS
+\fB@TABS@\fP [\fIoptions\fP]] \fI[tabstop-list]\fP
+.SH DESCRIPTION
+.PP
+The \fB@TABS@\fP program clears and sets tab-stops on the terminal.
+This uses the terminfo \fBclear_all_tabs\fP and \fBset_tab\fP capabilities.
+If either is absent, \fB@TABS@\fP is unable to clear/set tab-stops.
+The terminal should be configured to use hard tabs, e.g.,
+.NS
+stty tab0
+.NE
+.PP
+Like \fB@CLEAR@\fP(1), \fB@TABS@\fP writes to the standard output.
+You can redirect the standard output to a file (which prevents
+\fB@TABS@\fP from actually changing the tabstops),
+and later \fBcat\fP the file to the screen, setting tabstops at that point.
+.PP
+These are hardware tabs, which cannot be queried rapidly by applications
+running in the terminal, if at all.
+Curses and other full-screen applications may use hardware tabs
+in optimizing their output to the terminal.
+If the hardware tabstops differ from the information in the terminal
+database, the result is unpredictable.
+Before running curses programs,
+you should either reset tab-stops to the standard interval
+.NS
+tabs -8
+.NE
+.PP
+or use the \fB@RESET@\fP program,
+since the normal initialization sequences do not ensure that tab-stops
+are reset.
+.SH OPTIONS
+.SS General Options
+.TP 5
+.BI \-T "name"
+Tell \fB@TABS@\fP which terminal type to use.
+If this option is not given, \fB@TABS@\fP will use the \fB$TERM\fP
+environment variable.
+If that is not set, it will use the \fIansi+tabs\fP entry.
+.TP 5
+.B \-d
+The debugging option shows a ruler line, followed by two data lines.
+The first data line shows the expected tab-stops marked with asterisks.
+The second data line shows the actual tab-stops, marked with asterisks.
+.TP 5
+.B \-n
+This option tells \fB@TABS@\fP to check the options and run any debugging
+option, but not to modify the terminal settings.
+.TP
+\fB\-V\fP
+reports the version of ncurses which was used in this program, and exits.
+.PP
+The \fB@TABS@\fP program processes a single list of tab stops.
+The last option to be processed which defines a list is the one that
+determines the list to be processed.
+.SS Implicit Lists
+Use a single number as an option,
+e.g., \*(``\fB\-5\fP\*('' to set tabs at the given
+interval (in this case 1, 6, 11, 16, 21, etc.).
+Tabs are repeated up to the right margin of the screen.
+.PP
+Use \*(``\fB\-0\fP\*('' to clear all tabs.
+.PP
+Use \*(``\fB\-8\fP\*('' to set tabs to the standard interval.
+.SS Explicit Lists
+An explicit list can be defined after the options
+(this does not use a \*(``\-\*('').
+The values in the list must be in increasing numeric order,
+and greater than zero.
+They are separated by a comma or a blank, for example,
+.NS
+tabs 1,6,11,16,21
+.br
+tabs 1 6 11 16 21
+.NE
+.PP
+Use a \*(``+\*('' to treat a number
+as an increment relative to the previous value,
+e.g.,
+.NS
+tabs 1,+5,+5,+5,+5
+.NE
+.PP
+which is equivalent to the 1,6,11,16,21 example.
+.SS Predefined Tab-Stops
+POSIX defines several predefined lists of tab stops.
+.TP 5
+.B \-a
+Assembler, IBM S/370, first format
+.br
+1,10,16,36,72
+.TP 5
+.B \-a2
+Assembler, IBM S/370, second format
+.br
+1,10,16,40,72
+.TP 5
+.B \-c
+COBOL, normal format
+.br
+1,8,12,16,20,55
+.TP 5
+.B \-c2
+COBOL compact format
+.br
+1,6,10,14,49
+.TP 5
+.B \-c3
+COBOL compact format extended
+.br
+1,6,10,14,18,22,26,30,34,38,42,46,50,54,58,62,67
+.TP 5
+.B \-f
+FORTRAN
+.br
+1,7,11,15,19,23
+.TP 5
+.B \-p
+PL/I
+.br
+1,5,9,13,17,21,25,29,33,37,41,45,49,53,57,61
+.TP 5
+.B \-s
+SNOBOL
+.br
+1,10,55
+.TP 5
+.B \-u
+UNIVAC 1100 Assembler
+.br
+1,12,20,44
+.SS Margins
+A few terminals provide the capability for changing their left/right margins.
+The @TABS@ program has an option to use this feature:
+.TP 5
+.BI +m \ margin
+The effect depends on whether the terminal has the margin capabilities:
+.RS
+.bP
+If the terminal provides the capability for setting the left margin,
+@TABS@ uses this, and adjusts the available width for tab-stops.
+.bP
+If the terminal does not provide the margin capabilities,
+@TABS@ imitates the effect, putting the tab stops at the appropriate
+place on each line.
+The terminal's left-margin is not modified.
+.RE
+.IP
+If the \fImargin\fP parameter is omitted, the default is 10.
+Use \fB+m0\fP to reset the left margin,
+i.e., to the left edge of the terminal's display.
+Before setting a left-margin,
+@TABS@ resets the margin to reduce problems which might arise
+on moving the cursor before the current left-margin.
+.PP
+When setting or resetting the left-margin,
+@TABS@ may reset the right-margin.
+.SH PORTABILITY
+.PP
+\fIIEEE Std 1003.1/The Open Group Base Specifications Issue 7\fP (POSIX.1-2008)
+describes a \fBtabs\fP utility.
+However
+.bP
+This standard describes a \fB+m\fP option, to set a terminal's left-margin.
+Very few of the entries in the terminal database provide the
+\fBsmgl\fP (\fBset_left_margin\fP) or
+\fBsmglp\fP (\fBset_left_margin_parm\fP)
+capability needed to support the feature.
+.bP
+There is no counterpart in X/Open Curses Issue 7 for this utility,
+unlike \fB@TPUT@\fP(1).
+.PP
+The \fB\-d\fP (debug) and \fB\-n\fP (no-op) options are extensions not provided
+by other implementations.
+.PP
+A \fBtabs\fP utility appeared in PWB/Unix 1.0 (1977).
+There was a reduced version of the \fBtabs\fP utility
+in Unix 7th edition and in 3BSD (1979).
+The latter supported a single \*(``\-n\*('' option
+(to cause the first tab stop to be set on the left margin).
+That option is not documented by POSIX.
+.PP
+The PWB/Unix \fBtabs\fP utility, which was included in System III (1980),
+used built-in tables rather than the terminal database,
+to support a half-dozen hardcopy terminal (printer) types.
+It also had built-in logic to support the left-margin,
+as well as a feature for copying the tab settings from a file.
+.PP
+Later versions of Unix, e.g., SVr4,
+added support for the terminal database,
+but kept the tables to support the printers.
+In an earlier development effort,
+the tab-stop initialization provided by \fBtset\fP (1982)
+and incorporated into \fBtput\fP uses the terminal database,
+.PP
+The \fB+m\fP option was documented
+in the Base Specifications Issue 5 (Unix98, 1997),
+and omitted in Issue 6 (Unix03, 2004) without documenting the rationale,
+though an introductory comment
+\fI\*(``and optionally adjusts the margin\*(''\fP remains,
+overlooked in the removal.
+The documented \fBtabs\fP utility in Issues 6 and later has no mechanism
+for setting margins.
+The \fB+m\fP option in this implementation differs from the feature
+in SVr4 by using terminal capabilities rather than built-in tables.
+.PP
+POSIX documents no limits on the number of tab stops.
+Documentation for other implementations states that there is a limit on the
+number of tab stops
+(e.g., 20 in PWB/Unix's \fBtabs\fP utility).
+While some terminals may not accept an arbitrary number
+of tab stops, this implementation will attempt to set tab stops up to the
+right margin of the screen, if the given list happens to be that long.
+.PP
+The \fIRationale\fP section of the POSIX documentation goes into some
+detail about the ways the committee considered redesigning the
+\fBtabs\fP and \fBtput\fP utilities,
+without proposing an improved solution.
+It comments that
+.RS 5
+.PP
+no known historical version of tabs supports the capability of setting
+arbitrary tab stops.
+.RE
+.PP
+However, the \fIExplicit Lists\fP described in this manual page
+were implemented in PWB/Unix.
+Those provide the capability of setting abitrary tab stops.
+.SH SEE ALSO
+\fB@INFOCMP@\fP(1M),
+\fB@TSET@\fP(1),
+\fBcurses\fP(3X),
+\fBterminfo\fP(\*n).
+.PP
+This describes \fBncurses\fP
+version @NCURSES_MAJOR@.@NCURSES_MINOR@ (patch @NCURSES_PATCH@).
diff --git a/man/term.5 b/man/term.5
new file mode 100644
index 0000000..b21e90f
--- /dev/null
+++ b/man/term.5
@@ -0,0 +1,417 @@
+.\"***************************************************************************
+.\" Copyright 2018-2020,2021 Thomas E. Dickey                                *
+.\" Copyright 1998-2016,2017 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: term.5,v 1.43 2021/12/25 21:28:59 tom Exp $
+.TH term 5
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de NS
+.ie n  .sp
+.el    .sp .5
+.ie n  .in +4
+.el    .in +2
+.nf
+.ft C			\" Courier
+..
+.de NE
+.fi
+.ft R
+.ie n  .in -4
+.el    .in -2
+..
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.ds n 5
+.ds d @TERMINFO@
+.SH NAME
+term \- format of compiled term file.
+.SH SYNOPSIS
+.B term
+.SH DESCRIPTION
+.SS STORAGE LOCATION
+Compiled terminfo descriptions are placed under the directory \fB\*d\fP.
+Two configurations are supported (when building the \fBncurses\fP libraries):
+.TP 5
+.B directory tree
+A two-level scheme is used to avoid a linear search
+of a huge \s-1UNIX\s+1 system directory: \fB\*d/c/name\fP where
+.I name
+is the name of the terminal, and
+.I c
+is the first character of
+.IR name .
+Thus,
+.I act4
+can be found in the file \fB\*d/a/act4\fP.
+Synonyms for the same terminal are implemented by multiple
+links to the same compiled file.
+.TP 5
+.B hashed database
+Using Berkeley database, two types of records are stored:
+the terminfo data in the same format as stored in a directory tree with
+the terminfo's primary name as a key,
+and records containing only aliases pointing to the primary name.
+.IP
+If built to write hashed databases,
+\fBncurses\fP can still read terminfo databases organized as a directory tree,
+but cannot write entries into the directory tree.
+It can write (or rewrite) entries in the hashed database.
+.IP
+\fBncurses\fP distinguishes the two cases in the TERMINFO and TERMINFO_DIRS
+environment variable by assuming a directory tree for entries that
+correspond to an existing directory,
+and hashed database otherwise.
+.SS LEGACY STORAGE FORMAT
+The format has been chosen so that it will be the same on all hardware.
+An 8 or more bit byte is assumed, but no assumptions about byte ordering
+or sign extension are made.
+.PP
+The compiled file is created with the \fB@TIC@\fP program,
+and read by the routine \fBsetupterm\fP(3X).
+The file is divided into six parts:
+.RS 5
+.TP 3
+a) \fIheader\fP,
+.TP 3
+b) \fIterminal names\fP,
+.TP 3
+c) \fIboolean flags\fP,
+.TP 3
+d) \fInumbers\fP,
+.TP 3
+e) \fIstrings\fP, and
+.TP 3
+f) \fIstring table\fP.
+.RE
+.PP
+The \fIheader\fP section begins the file.
+This section contains six short integers in the format
+described below.
+These integers are
+.RS 5
+.TP 5
+(1) the \fImagic number\fP (octal 0432);
+.TP 5
+(2) the size, in bytes, of the \fIterminal names\fP section;
+.TP 5
+(3) the number of bytes in the \fIboolean flags\fP section;
+.TP 5
+(4) the number of short integers in the \fInumbers\fP section;
+.TP 5
+(5) the number of offsets (short integers) in the \fIstrings\fP section;
+.TP 5
+(6) the size, in bytes, of the \fIstring table\fP.
+.RE
+.PP
+The capabilities in the
+\fIboolean flags\fP,
+\fInumbers\fP, and
+\fIstrings\fP
+sections are in the same order as the file <term.h>.
+.PP
+Short integers are signed, in the range \-32768 to 32767.
+They are stored as two 8-bit bytes.
+The first byte contains the least significant 8 bits of the value,
+and the second byte contains the most significant 8 bits.
+(Thus, the value represented is 256*second+first.)
+This format corresponds to the hardware of the \s-1VAX\s+1
+and \s-1PDP\s+1-11 (that is, little-endian machines).
+Machines where this does not correspond to the hardware must read the
+integers as two bytes and compute the little-endian value.
+.PP
+Numbers in a terminal description,
+whether they are entries in the \fInumbers\fP or \fIstrings\fP table,
+are positive integers.
+Boolean flags are treated as positive one-byte integers.
+In each case, those positive integers represent a terminal capability.
+The terminal compiler @TIC@ uses negative integers to handle the cases where
+a capability is not available:
+.bP
+If a capability is absent from this terminal,
+@TIC@ stores a \-1 in the corresponding table.
+.IP
+The integer value \-1 is represented by two bytes 0377, 0377.
+.br
+Absent boolean values are represented by the byte 0 (false).
+.bP
+If a capability has been canceled from this terminal,
+@TIC@ stores a \-2 in the corresponding table.
+.IP
+The integer value \-2 is represented by two bytes 0377, 0376.
+.br
+The boolean value \-2 is represented by the byte 0376.
+.br
+.bP
+Other negative values are illegal.
+.PP
+The \fIterminal names\fP section comes after the \fIheader\fP.
+It contains the first line of the terminfo description,
+listing the various names for the terminal,
+separated by the \*(``|\*('' character.
+The \fIterminal names\fP section is terminated
+with an \s-1ASCII NUL\s+1 character.
+.PP
+The \fIboolean flags\fP section has one byte for each flag.
+Boolean capabilities are either 1 or 0 (true or false)
+according to whether the terminal supports the given capability or not.
+.PP
+Between the \fIboolean flags\fP section and the \fInumber\fP section,
+a null byte will be inserted, if necessary,
+to ensure that the \fInumber\fP section begins on an even byte
+This is a relic of the PDP\-11's word-addressed architecture,
+originally designed to avoid traps induced
+by addressing a word on an odd byte boundary.
+All short integers are aligned on a short word boundary.
+.PP
+The \fInumbers\fP section is similar to the \fIboolean flags\fP section.
+Each capability takes up two bytes,
+and is stored as a little-endian short integer.
+.PP
+The \fIstrings\fP section is also similar.
+Each capability is stored as a short integer.
+The capability value is an index into the \fIstring table\fP.
+.PP
+The \fIstring table\fP is the last section.
+It contains all of the values of string capabilities referenced in
+the \fIstrings\fP section.
+Each string is null-terminated.
+Special characters in ^X or \ec notation are stored in their
+interpreted form, not the printing representation.
+Padding information $<nn> and parameter information %x are
+stored intact in uninterpreted form.
+.SS EXTENDED STORAGE FORMAT
+The previous section describes the conventional terminfo binary format.
+With some minor variations of the offsets (see PORTABILITY),
+the same binary format is used in all modern UNIX systems.
+Each system uses a predefined set of boolean, number or string capabilities.
+.PP
+The \fBncurses\fP libraries and applications support
+extended terminfo binary format,
+allowing users to define capabilities which are loaded at runtime.
+This
+extension is made possible by using the fact that the other implementations
+stop reading the terminfo data when they have reached the end of the size given
+in the header.
+\fBncurses\fP checks the size,
+and if it exceeds that due to the predefined data,
+continues to parse according to its own scheme.
+.PP
+First, it reads the extended header (5 short integers):
+.RS 5
+.TP 5
+(1)
+count of extended boolean capabilities
+.TP 5
+(2)
+count of extended numeric capabilities
+.TP 5
+(3)
+count of extended string capabilities
+.TP 5
+(4)
+count of the items in extended string table
+.TP 5
+(5)
+size of the extended string table in bytes
+.RE
+.PP
+The count- and size-values for the extended string table
+include the extended capability \fInames\fP as well as
+extended capability \fIvalues\fP.
+.PP
+Using the counts and sizes, \fBncurses\fP allocates arrays and reads data
+for the extended capabilities in the same order as the header information.
+.PP
+The extended string table contains values for string capabilities.
+After the end of these values, it contains the names for each of
+the extended capabilities in order, e.g., booleans, then numbers and
+finally strings.
+.PP
+Applications which manipulate terminal data can use the definitions
+described in \fBterm_variables\fP(3X) which associate the long capability
+names with members of a \fBTERMTYPE\fP structure.
+.
+.SS EXTENDED NUMBER FORMAT
+.PP
+On occasion, 16-bit signed integers are not large enough.
+With \fBncurses\fP 6.1, a new format was introduced by making a few changes
+to the legacy format:
+.bP
+a different magic number (octal 01036)
+.bP
+changing the type for the \fInumber\fP array from signed 16-bit integers
+to signed 32-bit integers.
+.PP
+To maintain compatibility, the library presents the same data structures
+to direct users of the \fBTERMTYPE\fP structure as in previous formats.
+However, that cannot provide callers with the extended numbers.
+The library uses a similar but hidden data structure \fBTERMTYPE2\fP
+to provide data for the terminfo functions.
+.SH PORTABILITY
+.SS setupterm
+.PP
+Note that it is possible for
+.B setupterm
+to expect a different set of capabilities
+than are actually present in the file.
+Either the database may have been updated since
+.B setupterm
+was recompiled
+(resulting in extra unrecognized entries in the file)
+or the program may have been recompiled more recently
+than the database was updated
+(resulting in missing entries).
+The routine
+.B setupterm
+must be prepared for both possibilities \-
+this is why the numbers and sizes are included.
+Also, new capabilities must always be added at the end of the lists
+of boolean, number, and string capabilities.
+.SS Binary format
+.PP
+X/Open Curses does not specify a format for the terminfo database.
+UNIX System V curses used a directory-tree of binary files,
+one per terminal description.
+.PP
+Despite the consistent use of little-endian for numbers and the otherwise
+self-describing format, it is not wise to count on portability of binary
+terminfo entries between commercial UNIX versions.
+The problem is that there
+are at least three versions of terminfo (under HP\-UX, AIX, and OSF/1) which
+diverged from System V terminfo after SVr1, and have added extension
+capabilities to the string table that (in the binary format) collide with
+System V and XSI Curses extensions.
+See \fBterminfo\fP(\*n) for detailed
+discussion of terminfo source compatibility issues.
+.PP
+This implementation is by default compatible with the binary
+terminfo format used by Solaris curses,
+except in a few less-used details
+where it was found that the latter did not match X/Open Curses.
+The format used by the other Unix versions
+can be matched by building ncurses
+with different configuration options.
+.SS Magic codes
+.PP
+The magic number in a binary terminfo file is the first 16-bits (two bytes).
+Besides making it more reliable for the library to check that a file
+is terminfo,
+utilities such as \fBfile\fP(1) also use that to tell what the file-format is.
+System V defined more than one magic number,
+with 0433, 0435 as screen-dumps (see \fBscr_dump\fP(5)).
+This implementation uses 01036 as a continuation of that sequence,
+but with a different high-order byte to avoid confusion.
+.SS The TERMTYPE structure
+.PP
+Direct access to the \fBTERMTYPE\fP structure is provided for legacy
+applications.
+Portable applications should use the \fBtigetflag\fP and related functions
+described in \fBcurs_terminfo\fP(3X) for reading terminal capabilities.
+.SS Mixed-case terminal names
+.PP
+A small number of terminal descriptions use uppercase characters in
+their names.
+If the underlying filesystem ignores the difference between
+uppercase and lowercase,
+\fBncurses\fP represents the \*(``first character\*(''
+of the terminal name used as
+the intermediate level of a directory tree in (two-character) hexadecimal form.
+.SH EXAMPLE
+As an example, here is a description for the Lear-Siegler
+ADM\-3, a popular though rather stupid early terminal:
+.NS
+adm3a|lsi adm3a,
+        am,
+        cols#80, lines#24,
+        bel=^G, clear=\032$<1>, cr=^M, cub1=^H, cud1=^J,
+        cuf1=^L, cup=\\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K,
+        home=^^, ind=^J,
+.NS
+.PP
+and a hexadecimal dump of the compiled terminal description:
+.NS
+.ft CW
+\s-20000  1a 01 10 00 02 00 03 00  82 00 31 00 61 64 6d 33  ........ ..1.adm3
+0010  61 7c 6c 73 69 20 61 64  6d 33 61 00 00 01 50 00  a|lsi ad m3a...P.
+0020  ff ff 18 00 ff ff 00 00  02 00 ff ff ff ff 04 00  ........ ........
+0030  ff ff ff ff ff ff ff ff  0a 00 25 00 27 00 ff ff  ........ ..%.'...
+0040  29 00 ff ff ff ff 2b 00  ff ff 2d 00 ff ff ff ff  ).....+. ..-.....
+0050  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
+0060  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
+0070  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
+0080  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
+0090  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
+00a0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
+00b0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
+00c0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
+00d0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
+00e0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
+00f0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
+0100  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
+0110  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
+0120  ff ff ff ff ff ff 2f 00  07 00 0d 00 1a 24 3c 31  ....../. .....$<1
+0130  3e 00 1b 3d 25 70 31 25  7b 33 32 7d 25 2b 25 63  >..=%p1% {32}%+%c
+0140  25 70 32 25 7b 33 32 7d  25 2b 25 63 00 0a 00 1e  %p2%{32} %+%c....
+0150  00 08 00 0c 00 0b 00 0a  00                       ........ .\s+2
+.ft R
+.NE
+.sp
+.SH LIMITS
+Some limitations:
+.bP
+total compiled entries cannot exceed 4096 bytes in the legacy format.
+.bP
+total compiled entries cannot exceed 32768 bytes in the extended format.
+.bP
+the name field cannot exceed 128 bytes.
+.PP
+Compiled entries are limited to 32768 bytes because offsets into the
+\fIstrings table\fP use two-byte integers.
+The legacy format could have supported 32768-byte entries,
+but was limited a virtual memory page's 4096 bytes.
+.SH FILES
+\*d/*/*	compiled terminal capability database
+.SH SEE ALSO
+\fBcurses\fP(3X), \fBterminfo\fP(\*n).
+.SH AUTHORS
+Thomas E. Dickey
+.br
+extended terminfo format for ncurses 5.0
+.br
+hashed database support for ncurses 5.6
+.br
+extended number support for ncurses 6.1
+.sp
+Eric S. Raymond
+.br
+documented legacy terminfo format, e.g., from \fIpcurses\fP.
diff --git a/man/term.7 b/man/term.7
new file mode 100644
index 0000000..f3a0e75
--- /dev/null
+++ b/man/term.7
@@ -0,0 +1,224 @@
+.\"***************************************************************************
+.\" Copyright 2018-2020,2021 Thomas E. Dickey                                *
+.\" Copyright 1998-2011,2017 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: term.7,v 1.31 2021/12/25 17:39:16 tom Exp $
+.TH term 7
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.ds n 5
+.ds d @TERMINFO@
+.SH NAME
+term \- conventions for naming terminal types
+.SH DESCRIPTION
+.PP
+The environment variable \fBTERM\fP should normally contain the type name of
+the terminal, console or display-device type you are using.
+This information
+is critical for all screen-oriented programs, including your editor and mailer.
+.PP
+A default \fBTERM\fP value will be set on a per-line basis by either
+\fB/etc/inittab\fP (e.g., System\-V-like UNIXes)
+or \fB/etc/ttys\fP (BSD UNIXes).
+This will nearly always suffice for workstation and microcomputer consoles.
+.PP
+If you use a dialup line, the type of device attached to it may vary.
+Older UNIX systems pre-set a very dumb terminal type
+like \*(``dumb\*('' or \*(``dialup\*('' on dialup lines.
+Newer ones may pre-set \*(``vt100\*('', reflecting the prevalence of DEC
+VT100-compatible terminals and personal-computer emulators.
+.PP
+Modern telnets pass your \fBTERM\fP environment variable from the local side to
+the remote one.
+There can be problems if the remote terminfo or termcap entry
+for your type is not compatible with yours, but this situation is rare and
+can almost always be avoided by explicitly exporting \*(``vt100\*(''
+(assuming you are in fact using a VT100-superset console,
+terminal, or terminal emulator).
+.PP
+In any case, you are free to override the system \fBTERM\fP setting to your
+taste in your shell profile.
+The \fB@TSET@\fP(1) utility may be of assistance;
+you can give it a set of rules for deducing or requesting a terminal type based
+on the tty device and baud rate.
+.PP
+Setting your own \fBTERM\fP value may also be useful if you have created a
+custom entry incorporating options (such as visual bell or reverse-video)
+which you wish to override the system default type for your line.
+.PP
+Terminal type descriptions are stored as files of capability data underneath
+\*d.
+To browse a list of all terminal names recognized by the system, do
+.sp
+	@TOE@ | more
+.sp
+from your shell.
+These capability files are in a binary format optimized for
+retrieval speed (unlike the old text-based \fBtermcap\fP format they replace);
+to examine an entry, you must use the \fB@INFOCMP@\fP(1M) command.
+Invoke it as follows:
+.sp
+	@INFOCMP@ \fIentry_name\fP
+.sp
+where \fIentry_name\fP is the name of the type you wish to examine (and the
+name of its capability file the subdirectory of \*d named for its first
+letter).
+This command dumps a capability file in the text format described by
+\fBterminfo\fP(\*n).
+.PP
+The first line of a \fBterminfo\fP(\*n) description gives the names by which
+terminfo knows a terminal,
+separated by \*(``|\*('' (pipe-bar) characters with the last
+name field terminated by a comma.
+The first name field is the type's
+\fIprimary name\fP, and is the one to use when setting \fBTERM\fP.  The last
+name field (if distinct from the first) is actually a description of the
+terminal type (it may contain blanks; the others must be single words).
+Name
+fields between the first and last (if present) are aliases for the terminal,
+usually historical names retained for compatibility.
+.PP
+There are some conventions for how to choose terminal primary names that help
+keep them informative and unique.
+Here is a step-by-step guide to naming
+terminals that also explains how to parse them:
+.PP
+First, choose a root name.
+The root will consist of a lower-case letter
+followed by up to seven lower-case letters or digits.
+You need to avoid using
+punctuation characters in root names, because they are used and interpreted as
+filenames and shell meta-characters (such as !, $, *, ?, etc.) embedded in them
+may cause odd and unhelpful behavior.
+The slash (/), or any other character
+that may be interpreted by anyone's file system (\e, $, [, ]), is especially
+dangerous (terminfo is platform-independent, and choosing names with special
+characters could someday make life difficult for users of a future port).
+The
+dot (.) character is relatively safe as long as there is at most one per root
+name; some historical terminfo names use it.
+.PP
+The root name for a terminal or workstation console type should almost always
+begin with a vendor prefix (such as \fBhp\fP for Hewlett-Packard, \fBwy\fP for
+Wyse, or \fBatt\fP for AT&T terminals), or a common name of the terminal line
+(\fBvt\fP for the VT series of terminals from DEC, or \fBsun\fP for Sun
+Microsystems workstation consoles, or \fBregent\fP for the ADDS Regent series.
+You can list the terminfo tree to see what prefixes are already in common use.
+The root name prefix should be followed when appropriate by a model number;
+thus \fBvt100\fP, \fBhp2621\fP, \fBwy50\fP.
+.PP
+The root name for a PC-Unix console type should be the OS name,
+i.e., \fBlinux\fP, \fBbsdos\fP, \fBfreebsd\fP, \fBnetbsd\fP.  It should
+\fInot\fP be \fBconsole\fP or any other generic that might cause confusion in a
+multi-platform environment!  If a model number follows, it should indicate
+either the OS release level or the console driver release level.
+.PP
+The root name for a terminal emulator (assuming it does not fit one of the
+standard ANSI or vt100 types) should be the program name or a readily
+recognizable abbreviation of it (i.e., \fBversaterm\fP, \fBctrm\fP).
+.PP
+Following the root name, you may add any reasonable number of hyphen-separated
+feature suffixes.
+.TP 5
+2p
+Has two pages of memory.
+Likewise 4p, 8p, etc.
+.TP 5
+mc
+Magic-cookie.
+Some terminals (notably older Wyses) can only support one
+attribute without magic-cookie lossage.
+Their base entry is usually paired
+with another that has this suffix and uses magic cookies to support multiple
+attributes.
+.TP 5
+\-am
+Enable auto-margin (right-margin wraparound).
+.TP 5
+\-m
+Mono mode \- suppress color support.
+.TP 5
+\-na
+No arrow keys \- termcap ignores arrow keys which are actually there on the
+terminal, so the user can use the arrow keys locally.
+.TP 5
+\-nam
+No auto-margin \- suppress am capability.
+.TP 5
+\-nl
+No labels \- suppress soft labels.
+.TP 5
+\-nsl
+No status line \- suppress status line.
+.TP 5
+\-pp
+Has a printer port which is used.
+.TP 5
+\-rv
+Terminal in reverse video mode (black on white).
+.TP 5
+\-s
+Enable status line.
+.TP 5
+\-vb
+Use visible bell (flash) rather than beep.
+.TP 5
+\-w
+Wide; terminal is in 132-column mode.
+.PP
+Conventionally, if your terminal type is a variant intended to specify a
+line height, that suffix should go first.
+So, for a hypothetical FuBarCo
+model 2317 terminal in 30-line mode with reverse video, best form would be
+\fBfubar\-30\-rv\fP (rather than, say, \*(``fubar\-rv\-30\*('').
+.PP
+Terminal types that are written not as standalone entries, but rather as
+components to be plugged into other entries via \fBuse\fP capabilities,
+are distinguished by using embedded plus signs rather than dashes.
+.PP
+Commands which use a terminal type to control display often accept a \-T
+option that accepts a terminal name argument.
+Such programs should fall back
+on the \fBTERM\fP environment variable when no \-T option is specified.
+.SH PORTABILITY
+For maximum compatibility with older System V UNIXes, names and aliases
+should be unique within the first 14 characters.
+.SH FILES
+.TP 5
+\*d/?/*
+compiled terminal capability database
+.TP 5
+/etc/inittab
+tty line initialization (AT&T-like UNIXes)
+.TP 5
+/etc/ttys
+tty line initialization (BSD-like UNIXes)
+.SH SEE ALSO
+\fBcurses\fP(3X), \fBterminfo\fP(\*n), \fBterm\fP(\*n).
diff --git a/man/term_variables.3x b/man/term_variables.3x
new file mode 100644
index 0000000..736c1d3
--- /dev/null
+++ b/man/term_variables.3x
@@ -0,0 +1,194 @@
+.\"***************************************************************************
+.\" Copyright 2019-2020,2021 Thomas E. Dickey                                *
+.\" Copyright 2010-2015,2017 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: term_variables.3x,v 1.15 2021/12/25 22:03:30 tom Exp $
+.TH term_variables 3X ""
+.ds n 5
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.na
+.hy 0
+.SH NAME
+\fBSP\fP,
+\fBacs_map\fP,
+\fBboolcodes\fP,
+\fBboolfnames\fP,
+\fBboolnames\fP,
+\fBcur_term\fP,
+\fBnumcodes\fP,
+\fBnumfnames\fP,
+\fBnumnames\fP,
+\fBstrcodes\fP,
+\fBstrfnames\fP,
+\fBstrnames\fP,
+\fBttytype\fP
+\- \fBcurses\fP terminfo global variables
+.ad
+.hy
+.SH SYNOPSIS
+.nf
+\fB#include <curses.h>\fP
+.br
+\fB#include <term.h>\fP
+.PP
+\fBchtype acs_map[];\fP
+.sp
+\fBSCREEN * SP;\fP
+.sp
+\fBTERMINAL * cur_term;\fP
+.sp
+\fBchar ttytype[];\fP
+.sp
+\fBNCURSES_CONST char * const boolcodes[];\fP
+.br
+\fBNCURSES_CONST char * const boolfnames[];\fP
+.br
+\fBNCURSES_CONST char * const boolnames[];\fP
+.sp
+\fBNCURSES_CONST char * const numcodes[];\fP
+.br
+\fBNCURSES_CONST char * const numfnames[];\fP
+.br
+\fBNCURSES_CONST char * const numnames[];\fP
+.sp
+\fBNCURSES_CONST char * const strcodes[];\fP
+.br
+\fBNCURSES_CONST char * const strfnames[];\fP
+.br
+\fBNCURSES_CONST char * const strnames[];\fP
+.br
+.fi
+.SH DESCRIPTION
+This page summarizes variables provided by the \fBcurses\fP library's
+low-level terminfo interface.
+A more complete description is given in the \fBcurs_terminfo\fP(3X) manual page.
+.PP
+Depending on the configuration, these may be actual variables,
+or macros (see \fBcurs_threads\fP(3X))
+which provide read-only access to \fIcurses\fP's state.
+In either case, applications should treat them as read-only to avoid
+confusing the library.
+.SS Alternate Character Set Mapping
+After initializing the curses or terminfo interfaces,
+the \fBacs_map\fP array holds information used to translate cells
+with the \fBA_ALTCHARSET\fP video attribute into line-drawing characters.
+.PP
+The encoding of the information in this array has changed periodically.
+Application developers need only know that it is used for the \*(``ACS_\*(''
+constants in <curses.h>.
+.PP
+The comparable data for the wide-character library is a private variable.
+.SS Current Terminal Data
+After initializing the curses or terminfo interfaces,
+the \fBcur_term\fP contains data describing the current terminal.
+This variable is also set as a side-effect of \fBset_term\fP(3X)
+and \fBdelscreen\fP(3X).
+.PP
+It is possible to save a value of \fBcur_term\fP for subsequent
+use as a parameter to \fBset_term\fP, for switching between screens.
+Alternatively, one can save the return value from \fBnewterm\fP
+or \fBsetupterm\fP(3X) to reuse in \fBset_term\fP.
+.SS Terminfo Lookup Tables
+The \fB@TIC@\fP(1) and \fB@INFOCMP@\fP(1) programs use lookup tables for
+the long and short names of terminfo capabilities,
+as well as the corresponding names for termcap capabilities.
+These are available to other applications,
+although the hash-tables used by
+the terminfo and termcap functions are not available.
+.PP
+The long terminfo capability names use a \*(``l\*('' (ell) in their names:
+\fBboolfnames\fP,
+\fBnumfnames\fP, and
+\fBstrfnames\fP.
+.PP
+These are the short names for terminfo capabilities:
+\fBboolnames\fP,
+\fBnumnames\fP, and
+\fBstrnames\fP.
+.PP
+These are the corresponding names used for termcap descriptions:
+\fBboolcodes\fP,
+\fBnumcodes\fP, and
+\fBstrcodes\fP.
+.\"
+.SS Terminal Type
+A terminal description begins with one or more terminal names
+separated by \*(``|\*('' (vertical bars).
+On initialization of the curses or terminfo interfaces,
+\fBsetupterm\fP(3X) copies the terminal names to the array \fBttytype\fP.
+.\"
+.SS Terminfo Names
+.PP
+In addition to the variables, \fB<term.h>\fP also defines a symbol for each
+terminfo capability \fIlong name\fP.
+These are in terms of the symbol \fBCUR\fP,
+which is defined
+.PP
+.nf
+.ft CW
+#define CUR ((TERMTYPE *)(cur_term))->
+.fi
+.ft R
+.PP
+These symbols provide a faster method of accessing terminfo capabilities
+than using \fBtigetstr\fP(3X), etc.
+.PP
+The actual definition of \fBCUR\fP depends upon the implementation,
+but each terminfo library provides these long names defined to point
+into the current terminal description loaded into memory.
+.\"
+.SH NOTES
+The low-level terminfo interface is initialized using
+.hy 0
+\fBsetupterm\fP(3X).
+.hy
+The upper-level curses interface uses the low-level terminfo interface,
+internally.
+.\"
+.SH PORTABILITY
+X/Open Curses does not describe any of these except for \fBcur_term\fP.
+(The inclusion of \fBcur_term\fP appears to be an oversight,
+since other comparable low-level information is omitted by X/Open).
+.PP
+Other implementations may have comparable variables.
+Some implementations provide the variables in their libraries,
+but omit them from the header files.
+.PP
+All implementations which provide terminfo interfaces add definitions
+as described in the \fBTerminfo Names\fP section.
+Most, but not all, base the definition upon the \fBcur_term\fP variable.
+.SH SEE ALSO
+.hy 0
+\fBcurses\fP(3X),
+\fBcurs_terminfo\fP(3X),
+\fBcurs_threads\fP(3X),
+\fBterminfo\fP(\*n).
+.hy
diff --git a/man/terminfo.head b/man/terminfo.head
new file mode 100644
index 0000000..a17fa78
--- /dev/null
+++ b/man/terminfo.head
@@ -0,0 +1,227 @@
+.\"***************************************************************************
+.\" Copyright 2018-2020,2021 Thomas E. Dickey                                *
+.\" Copyright 1998-2016,2017 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: terminfo.head,v 1.42 2021/12/25 17:39:16 tom Exp $
+.TH terminfo 5 "" "" "File Formats"
+.ds n 5
+.ds d @TERMINFO@
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.de NS
+.ie n  .sp
+.el    .sp .5
+.ie n  .in +4
+.el    .in +2
+.nf
+.ft C			\" Courier
+..
+.de NE
+.fi
+.ft R
+.ie n  .in -4
+.el    .in -2
+..
+.SH NAME
+terminfo \- terminal capability database
+.SH SYNOPSIS
+\*d/*/*
+.SH DESCRIPTION
+.I Terminfo
+is a database describing terminals,
+used by screen-oriented programs such as
+\fBnvi\fP(1),
+\fBlynx\fP(1),
+\fBmutt\fP(1),
+and other curses applications,
+using high-level calls to libraries such as \fBcurses\fP(3X).
+It is also used via low-level calls by non-curses applications
+which may be screen-oriented (such as \fB@CLEAR@\fP(1))
+or non-screen (such as \fB@TABS@\fP(1)).
+.PP
+.I Terminfo
+describes terminals by giving a set of capabilities which they
+have, by specifying how to perform screen operations, and by
+specifying padding requirements and initialization sequences.
+.PP
+This manual describes \fBncurses\fP
+version @NCURSES_MAJOR@.@NCURSES_MINOR@ (patch @NCURSES_PATCH@).
+.SS Terminfo Entry Syntax
+.PP
+Entries in
+.I terminfo
+consist of a sequence of fields:
+.bP
+Each field ends with a comma \*(``,\*(''
+(embedded commas may be
+escaped with a backslash or written as \*(``\\054\*('').
+.bP
+White space between fields is ignored.
+.bP
+The first field in a \fIterminfo\fP entry begins in the first column.
+.bP
+Newlines and leading whitespace (spaces or tabs)
+may be used for formatting entries for readability.
+These are removed from parsed entries.
+.IP
+The \fB@INFOCMP@\fP \fB\-f\fP and \fB\-W\fP options rely on this to
+format if-then-else expressions,
+or to enforce maximum line-width.
+The resulting formatted terminal description can be read by \fB@TIC@\fP.
+.bP
+The first field for each terminal gives the names which are known for the
+terminal, separated by \*(``|\*('' characters.
+.IP
+The first name given is the most common abbreviation for the terminal
+(its primary name),
+the last name given should be a long name fully identifying the terminal
+(see \fBlongname\fP(3X)),
+and all others are treated as synonyms (aliases) for the primary terminal name.
+.IP
+X/Open Curses advises that all names but the last should be in lower case
+and contain no blanks;
+the last name may well contain upper case and blanks for readability.
+.IP
+This implementation is not so strict;
+it allows mixed case in the primary name and aliases.
+If the last name has no embedded blanks,
+it allows that to be both an alias and a verbose name
+(but will warn about this ambiguity).
+.bP
+Lines beginning with a \*(``#\*('' in the first column are treated as comments.
+.IP
+While comment lines are legal at any point, the output of \fB@CAPTOINFO@\fP
+and \fB@INFOTOCAP@\fP (aliases for \fB@TIC@\fP)
+will move comments so they occur only between entries.
+.PP
+Terminal names (except for the last, verbose entry) should
+be chosen using the following conventions.
+The particular piece of hardware making up the terminal should
+have a root name, thus \*(``hp2621\*(''.
+This name should not contain hyphens.
+Modes that the hardware can be in, or user preferences, should
+be indicated by appending a hyphen and a mode suffix.
+Thus, a vt100 in 132-column mode would be vt100\-w.
+The following suffixes should be used where possible:
+.PP
+.TS
+center ;
+l c l
+l l l.
+\fBSuffix	Meaning	Example\fP
+\-\fInn\fP	Number of lines on the screen	aaa\-60
+\-\fIn\fPp	Number of pages of memory	c100\-4p
+\-am	With automargins (usually the default)	vt100\-am
+\-m	Mono mode; suppress color       	ansi\-m
+\-mc	Magic cookie; spaces when highlighting	wy30\-mc
+\-na	No arrow keys (leave them in local)	c100\-na
+\-nam	Without automatic margins       	vt100\-nam
+\-nl	No status line                  	att4415\-nl
+\-ns	No status line                  	hp2626\-ns
+\-rv	Reverse video                   	c100\-rv
+\-s	Enable status line              	vt100\-s
+\-vb	Use visible bell instead of beep	wy370\-vb
+\-w	Wide mode (> 80 columns, usually 132)	vt100\-w
+.TE
+.PP
+For more on terminal naming conventions, see the \fBterm\fP(7) manual page.
+.SS Terminfo Capabilities Syntax
+.PP
+The terminfo entry consists of several \fIcapabilities\fP,
+i.e., features that the terminal has,
+or methods for exercising the terminal's features.
+.PP
+After the first field (giving the name(s) of the terminal entry),
+there should be one or more \fIcapability\fP fields.
+These are boolean, numeric or string names with corresponding values:
+.bP
+Boolean capabilities are true when present, false when absent.
+There is no explicit value for boolean capabilities.
+.bP
+Numeric capabilities have a \*(``#\*('' following the name,
+then an unsigned decimal integer value.
+.bP
+String capabilities have a \*(``=\*('' following the name,
+then an string of characters making up the capability value.
+.IP
+String capabilities can be split into multiple lines,
+just as the fields comprising a terminal entry can be
+split into multiple lines.
+While blanks between fields are ignored,
+blanks embedded within a string value are retained,
+except for leading blanks on a line.
+.PP
+Any capability can be \fIcanceled\fP,
+i.e., suppressed from the terminal entry,
+by following its name with \*(``@\*(''
+rather than a capability value.
+.SS Similar Terminals
+.PP
+If there are two very similar terminals, one (the variant) can be defined as
+being just like the other (the base) with certain exceptions.
+In the
+definition of the variant, the string capability \fBuse\fP can be given with
+the name of the base terminal:
+.bP
+The capabilities given before
+.B use
+override those in the base type named by
+.BR use .
+.bP
+If there are multiple \fBuse\fP capabilities, they are merged in reverse order.
+That is, the rightmost \fBuse\fP reference is processed first, then the one to
+its left, and so forth.
+.bP
+Capabilities given explicitly in the entry override
+those brought in by \fBuse\fP references.
+.PP
+A capability can be canceled by placing \fBxx@\fP to the left of the
+use reference that imports it, where \fIxx\fP is the capability.
+For example, the entry
+.RS
+.PP
+2621\-nl, smkx@, rmkx@, use=2621,
+.RE
+.PP
+defines a 2621\-nl that does not have the \fBsmkx\fP or \fBrmkx\fP capabilities,
+and hence does not turn on the function key labels when in visual mode.
+This is useful for different modes for a terminal, or for different
+user preferences.
+.PP
+An entry included via \fBuse\fP can contain canceled capabilities,
+which have the same effect as if those cancels were inline in the
+using terminal entry.
+.SS Predefined Capabilities
+.\" Head of terminfo man page ends here
+.ps -1
diff --git a/man/terminfo.tail b/man/terminfo.tail
new file mode 100644
index 0000000..6abfda9
--- /dev/null
+++ b/man/terminfo.tail
@@ -0,0 +1,2085 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2016,2017 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: terminfo.tail,v 1.113 2022/12/10 19:51:10 tom Exp $
+.ps +1
+.SS User-Defined Capabilities
+.
+The preceding section listed the \fIpredefined\fP capabilities.
+They deal with some special features for terminals no longer
+(or possibly never) produced.
+Occasionally there are special features of newer terminals which
+are awkward or impossible to represent by reusing the predefined
+capabilities.
+.PP
+\fBncurses\fP addresses this limitation by allowing user-defined capabilities.
+The \fB@TIC@\fP and \fB@INFOCMP@\fP programs provide
+the \fB\-x\fP option for this purpose.
+When \fB\-x\fP is set,
+\fB@TIC@\fP treats unknown capabilities as user-defined.
+That is, if \fB@TIC@\fP encounters a capability name
+which it does not recognize,
+it infers its type (boolean, number or string) from the syntax
+and makes an extended table entry for that capability.
+The \fBuse_extended_names\fP(3X) function makes this information
+conditionally available to applications.
+The ncurses library provides the data leaving most of the behavior
+to applications:
+.bP
+User-defined capability strings whose name begins
+with \*(``k\*('' are treated as function keys.
+.bP
+The types (boolean, number, string) determined by \fB@TIC@\fP
+can be inferred by successful calls on \fBtigetflag\fP, etc.
+.bP
+If the capability name happens to be two characters,
+the capability is also available through the termcap interface.
+.PP
+While termcap is said to be extensible because it does not use a predefined set
+of capabilities,
+in practice it has been limited to the capabilities defined by
+terminfo implementations.
+As a rule,
+user-defined capabilities intended for use by termcap applications should
+be limited to booleans and numbers to avoid running past the 1023 byte
+limit assumed by termcap implementations and their applications.
+In particular, providing extended sets of function keys (past the 60
+numbered keys and the handful of special named keys) is best done using
+the longer names available using terminfo.
+.
+.SS A Sample Entry
+.
+The following entry, describing an ANSI-standard terminal, is representative
+of what a \fBterminfo\fP entry for a modern terminal typically looks like.
+.PP
+.nf
+.ft CW
+\s-2ansi|ansi/pc-term compatible with color,
+        am, mc5i, mir, msgr,
+        colors#8, cols#80, it#8, lines#24, ncv#3, pairs#64,
+        acsc=+\\020\\,\\021-\\030.^Y0\\333`\\004a\\261f\\370g\\361h\\260
+             j\\331k\\277l\\332m\\300n\\305o~p\\304q\\304r\\304s_t\\303
+             u\\264v\\301w\\302x\\263y\\363z\\362{\\343|\\330}\\234~\\376,
+        bel=^G, blink=\\E[5m, bold=\\E[1m, cbt=\\E[Z, clear=\\E[H\\E[J,
+        cr=^M, cub=\\E[%p1%dD, cub1=\\E[D, cud=\\E[%p1%dB, cud1=\\E[B,
+        cuf=\\E[%p1%dC, cuf1=\\E[C, cup=\\E[%i%p1%d;%p2%dH,
+        cuu=\\E[%p1%dA, cuu1=\\E[A, dch=\\E[%p1%dP, dch1=\\E[P,
+        dl=\\E[%p1%dM, dl1=\\E[M, ech=\\E[%p1%dX, ed=\\E[J, el=\\E[K,
+        el1=\\E[1K, home=\\E[H, hpa=\\E[%i%p1%dG, ht=\\E[I, hts=\\EH,
+        ich=\\E[%p1%d@, il=\\E[%p1%dL, il1=\\E[L, ind=^J,
+        indn=\\E[%p1%dS, invis=\\E[8m, kbs=^H, kcbt=\\E[Z, kcub1=\\E[D,
+        kcud1=\\E[B, kcuf1=\\E[C, kcuu1=\\E[A, khome=\\E[H, kich1=\\E[L,
+        mc4=\\E[4i, mc5=\\E[5i, nel=\\r\\E[S, op=\\E[39;49m,
+        rep=%p1%c\\E[%p2%{1}%-%db, rev=\\E[7m, rin=\\E[%p1%dT,
+        rmacs=\\E[10m, rmpch=\\E[10m, rmso=\\E[m, rmul=\\E[m,
+        s0ds=\\E(B, s1ds=\\E)B, s2ds=\\E*B, s3ds=\\E+B,
+        setab=\\E[4%p1%dm, setaf=\\E[3%p1%dm,
+        sgr=\\E[0;10%?%p1%t;7%;
+                   %?%p2%t;4%;
+                   %?%p3%t;7%;
+                   %?%p4%t;5%;
+                   %?%p6%t;1%;
+                   %?%p7%t;8%;
+                   %?%p9%t;11%;m,
+        sgr0=\\E[0;10m, smacs=\\E[11m, smpch=\\E[11m, smso=\\E[7m,
+        smul=\\E[4m, tbc=\\E[3g, u6=\\E[%i%d;%dR, u7=\\E[6n,
+        u8=\\E[?%[;0123456789]c, u9=\\E[c, vpa=\\E[%i%p1%dd,
+.fi
+.ft R
+.PP
+Entries may continue onto multiple lines by placing white space at
+the beginning of each line except the first.
+Comments may be included on lines beginning with \*(``#\*(''.
+Capabilities in
+.I terminfo
+are of three types:
+.bP
+Boolean capabilities which indicate that the terminal has
+some particular feature,
+.bP
+numeric capabilities giving the size of the terminal
+or the size of particular delays, and
+.bP
+string
+capabilities, which give a sequence which can be used to perform particular
+terminal operations.
+.PP
+.SS Types of Capabilities
+.PP
+All capabilities have names.
+For instance, the fact that
+ANSI-standard terminals have
+.I "automatic margins"
+(i.e., an automatic return and line-feed
+when the end of a line is reached) is indicated by the capability \fBam\fP.
+Hence the description of ansi includes \fBam\fP.
+Numeric capabilities are followed by the character \*(``#\*('' and then a positive value.
+Thus \fBcols\fP, which indicates the number of columns the terminal has,
+gives the value \*(``80\*('' for ansi.
+Values for numeric capabilities may be specified in decimal, octal or hexadecimal,
+using the C programming language conventions (e.g., 255, 0377 and 0xff or 0xFF).
+.PP
+Finally, string valued capabilities, such as \fBel\fP (clear to end of line
+sequence) are given by the two-character code, an \*(``=\*('', and then a string
+ending at the next following \*(``,\*(''.
+.PP
+A number of escape sequences are provided in the string valued capabilities
+for easy encoding of characters there:
+.bP
+Both \fB\eE\fP and \fB\ee\fP
+map to an \s-1ESCAPE\s0 character,
+.bP
+\fB^x\fP maps to a control-x for any appropriate \fIx\fP, and
+.bP
+the sequences
+.RS 6
+.PP
+\fB\en\fP, \fB\el\fP, \fB\er\fP, \fB\et\fP, \fB\eb\fP, \fB\ef\fP, and \fB\es\fP
+.RE
+.IP
+produce
+.RS 6
+.PP
+\fInewline\fP, \fIline-feed\fP, \fIreturn\fP, \fItab\fP, \fIbackspace\fP, \fIform-feed\fP, and \fIspace\fP,
+.RE
+.IP
+respectively.
+.PP
+X/Open Curses does not say what \*(``appropriate \fIx\fP\*('' might be.
+In practice, that is a printable ASCII graphic character.
+The special case \*(``^?\*('' is interpreted as DEL (127).
+In all other cases, the character value is AND'd with 0x1f,
+mapping to ASCII control codes in the range 0 through 31.
+.PP
+Other escapes include
+.bP
+\fB\e^\fP for \fB^\fP,
+.bP
+\fB\e\e\fP for \fB\e\fP,
+.bP
+\fB\e\fP, for comma,
+.bP
+\fB\e:\fP for \fB:\fP,
+.bP
+and \fB\e0\fP for null.
+.IP
+\fB\e0\fP will produce \e200, which does not terminate a string but behaves
+as a null character on most terminals, providing CS7 is specified.
+See \fBstty\fP(1).
+.IP
+The reason for this quirk is to maintain binary compatibility of the
+compiled terminfo files with other implementations,
+e.g., the SVr4 systems, which document this.
+Compiled terminfo files use null-terminated strings, with no lengths.
+Modifying this would require a new binary format,
+which would not work with other implementations.
+.PP
+Finally, characters may be given as three octal digits after a \fB\e\fP.
+.PP
+A delay in milliseconds may appear anywhere in a string capability, enclosed in
+$<..> brackets, as in \fBel\fP=\eEK$<5>,
+and padding characters are supplied by \fBtputs\fP(3X)
+to provide this delay.
+.bP
+The delay must be a number with at most one decimal
+place of precision; it may be followed by suffixes \*(``*\*('' or \*(``/\*('' or both.
+.bP
+A \*(``*\*(''
+indicates that the padding required is proportional to the number of lines
+affected by the operation, and the amount given is the per-affected-unit
+padding required.
+(In the case of insert character, the factor is still the
+number of \fIlines\fP affected.)
+.IP
+Normally, padding is advisory if the device has the \fBxon\fP
+capability; it is used for cost computation but does not trigger delays.
+.bP
+A \*(``/\*(''
+suffix indicates that the padding is mandatory and forces a delay of the given
+number of milliseconds even on devices for which \fBxon\fP is present to
+indicate flow control.
+.PP
+Sometimes individual capabilities must be commented out.
+To do this, put a period before the capability name.
+For example, see the second
+.B ind
+in the example above.
+.br
+.ne 5
+.PP
+.SS Fetching Compiled Descriptions
+.PP
+The \fBncurses\fP library searches for terminal descriptions in several places.
+It uses only the first description found.
+The library has a compiled-in list of places to search
+which can be overridden by environment variables.
+Before starting to search,
+\fBncurses\fP eliminates duplicates in its search list.
+.bP
+If the environment variable TERMINFO is set, it is interpreted as the pathname
+of a directory containing the compiled description you are working on.
+Only that directory is searched.
+.bP
+If TERMINFO is not set,
+\fBncurses\fP will instead look in the directory \fB$HOME/.terminfo\fP
+for a compiled description.
+.bP
+Next, if the environment variable TERMINFO_DIRS is set,
+\fBncurses\fP will interpret the contents of that variable
+as a list of colon-separated directories (or database files) to be searched.
+.IP
+An empty directory name (i.e., if the variable begins or ends
+with a colon, or contains adjacent colons)
+is interpreted as the system location \fI\*d\fP.
+.bP
+Finally, \fBncurses\fP searches these compiled-in locations:
+.RS
+.bP
+a list of directories (@TERMINFO_DIRS@), and
+.bP
+the system terminfo directory, \fI\*d\fP (the compiled-in default).
+.RE
+.SS Preparing Descriptions
+.PP
+We now outline how to prepare descriptions of terminals.
+The most effective way to prepare a terminal description is by imitating
+the description of a similar terminal in
+.I terminfo
+and to build up a description gradually, using partial descriptions
+with
+.I vi
+or some other screen-oriented program to check that they are correct.
+Be aware that a very unusual terminal may expose deficiencies in
+the ability of the
+.I terminfo
+file to describe it
+or bugs in the screen-handling code of the test program.
+.PP
+To get the padding for insert line right (if the terminal manufacturer
+did not document it) a severe test is to edit a large file at 9600 baud,
+delete 16 or so lines from the middle of the screen, then hit the \*(``u\*(''
+key several times quickly.
+If the terminal messes up, more padding is usually needed.
+A similar test can be used for insert character.
+.PP
+.SS Basic Capabilities
+.PP
+The number of columns on each line for the terminal is given by the
+\fBcols\fP numeric capability.
+If the terminal is a \s-1CRT\s0, then the
+number of lines on the screen is given by the \fBlines\fP capability.
+If the terminal wraps around to the beginning of the next line when
+it reaches the right margin, then it should have the \fBam\fP capability.
+If the terminal can clear its screen, leaving the cursor in the home
+position, then this is given by the \fBclear\fP string capability.
+If the terminal overstrikes
+(rather than clearing a position when a character is struck over)
+then it should have the \fBos\fP capability.
+If the terminal is a printing terminal, with no soft copy unit,
+give it both
+.B hc
+and
+.BR os .
+.RB ( os
+applies to storage scope terminals, such as \s-1TEKTRONIX\s+1 4010
+series, as well as hard copy and APL terminals.)
+If there is a code to move the cursor to the left edge of the current
+row, give this as
+.BR cr .
+(Normally this will be carriage return, control/M.)
+If there is a code to produce an audible signal (bell, beep, etc)
+give this as
+.BR bel .
+.PP
+If there is a code to move the cursor one position to the left
+(such as backspace) that capability should be given as
+.BR cub1 .
+Similarly, codes to move to the right, up, and down should be
+given as
+.BR cuf1 ,
+.BR cuu1 ,
+and
+.BR cud1 .
+These local cursor motions should not alter the text they pass over,
+for example, you would not normally use \*(``\fBcuf1\fP=\ \*('' because the
+space would erase the character moved over.
+.PP
+A very important point here is that the local cursor motions encoded
+in
+.I terminfo
+are undefined at the left and top edges of a \s-1CRT\s0 terminal.
+Programs should never attempt to backspace around the left edge,
+unless
+.B bw
+is given,
+and never attempt to go up locally off the top.
+In order to scroll text up, a program will go to the bottom left corner
+of the screen and send the
+.B ind
+(index) string.
+.PP
+To scroll text down, a program goes to the top left corner
+of the screen and sends the
+.B ri
+(reverse index) string.
+The strings
+.B ind
+and
+.B ri
+are undefined when not on their respective corners of the screen.
+.PP
+Parameterized versions of the scrolling sequences are
+.B indn
+and
+.B rin
+which have the same semantics as
+.B ind
+and
+.B ri
+except that they take one parameter, and scroll that many lines.
+They are also undefined except at the appropriate edge of the screen.
+.PP
+The \fBam\fP capability tells whether the cursor sticks at the right
+edge of the screen when text is output, but this does not necessarily
+apply to a
+.B cuf1
+from the last column.
+The only local motion which is defined from the left edge is if
+.B bw
+is given, then a
+.B cub1
+from the left edge will move to the right edge of the previous row.
+If
+.B bw
+is not given, the effect is undefined.
+This is useful for drawing a box around the edge of the screen, for example.
+If the terminal has switch selectable automatic margins,
+the
+.I terminfo
+file usually assumes that this is on; i.e., \fBam\fP.
+If the terminal has a command which moves to the first column of the next
+line, that command can be given as
+.B nel
+(newline).
+It does not matter if the command clears the remainder of the current line,
+so if the terminal has no
+.B cr
+and
+.B lf
+it may still be possible to craft a working
+.B nel
+out of one or both of them.
+.PP
+These capabilities suffice to describe hard-copy and \*(``glass-tty\*('' terminals.
+Thus the model 33 teletype is described as
+.PP
+.DT
+.nf
+.ft CW
+.\".in -2
+\s-133\||\|tty33\||\|tty\||\|model 33 teletype,
+        bel=^G, cols#72, cr=^M, cud1=^J, hc, ind=^J, os,\s+1
+.\".in +2
+.ft R
+.fi
+.PP
+while the Lear Siegler \s-1ADM-3\s0 is described as
+.PP
+.DT
+.nf
+.ft CW
+.\".in -2
+\s-1adm3\||\|3\||\|lsi adm3,
+        am, bel=^G, clear=^Z, cols#80, cr=^M, cub1=^H, cud1=^J,
+        ind=^J, lines#24,\s+1
+.\".in +2
+.ft R
+.fi
+.PP
+.SS Parameterized Strings
+.PP
+Cursor addressing and other strings requiring parameters
+in the terminal are described by a
+parameterized string capability,
+with \fIprintf\fP-like escapes such as \fI%x\fP in it.
+For example, to address the cursor, the
+.B cup
+capability is given, using two parameters:
+the row and column to address to.
+(Rows and columns are numbered from zero and refer to the
+physical screen visible to the user, not to any unseen memory.)
+If the terminal has memory relative cursor addressing,
+that can be indicated by
+.BR mrcup .
+.PP
+The parameter mechanism uses a stack and special \fB%\fP codes
+to manipulate it.
+Typically a sequence will push one of the
+parameters onto the stack and then print it in some format.
+Print (e.g., \*(``%d\*('') is a special case.
+Other operations, including \*(``%t\*('' pop their operand from the stack.
+It is noted that more complex operations are often necessary,
+e.g., in the \fBsgr\fP string.
+.PP
+The \fB%\fP encodings have the following meanings:
+.PP
+.TP 5
+\fB%%\fP
+outputs \*(``%\*(''
+.TP
+\fB%\fP\fI[[\fP:\fI]flags][width[.precision]][\fP\fBdoxXs\fP\fI]\fP
+as in \fBprintf\fP(3), flags are \fI[\-+#]\fP and \fIspace\fP.
+Use a \*(``:\*('' to allow the next character to be a \*(``\-\*('' flag,
+avoiding interpreting \*(``%\-\*('' as an operator.
+.TP
+\f(CW%c\fP
+print \fIpop()\fP like %c in \fBprintf\fP
+.TP
+\fB%s\fP
+print \fIpop()\fP like %s in \fBprintf\fP
+.TP
+\fB%p\fP\fI[1\-9]\fP
+push \fIi\fP'th parameter
+.TP
+\fB%P\fP\fI[a\-z]\fP
+set dynamic variable \fI[a\-z]\fP to \fIpop()\fP
+.TP
+\fB%g\fP\fI[a\-z]\fP
+get dynamic variable \fI[a\-z]\fP and push it
+.TP
+\fB%P\fP\fI[A\-Z]\fP
+set static variable \fI[a\-z]\fP to \fIpop()\fP
+.TP
+\fB%g\fP\fI[A\-Z]\fP
+get static variable \fI[a\-z]\fP and push it
+.IP
+The terms \*(``static\*('' and \*(``dynamic\*('' are misleading.
+Historically, these are simply two different sets of variables,
+whose values are not reset between calls to \fBtparm\fP(3X).
+However, that fact is not documented in other implementations.
+Relying on it will adversely impact portability to other implementations:
+.RS
+.bP
+SVr2 curses supported \fIdynamic\fP variables.
+Those are set only by a \fB%P\fP operator.
+A \fB%g\fP for a given variable without first setting it with \fB%P\fP
+will give unpredictable results, because dynamic variables are
+an uninitialized local array on the stack in the \fBtparm\fP function.
+.bP
+SVr3.2 curses supported \fIstatic\fP variables.
+Those are an array in the \fBTERMINAL\fP
+structure (declared in \fBterm.h\fP),
+and are zeroed automatically when the \fBsetupterm\fP function
+allocates the data.
+.bP
+SVr4 curses made no further improvements
+to the \fIdynamic/static\fP variable feature.
+.bP
+Solaris XPG4 curses does not distinguish between \fIdynamic\fP and
+\fIstatic\fP variables.
+They are the same.
+Like SVr4 curses, XPG4 curses does not initialize these explicitly.
+.bP
+Before version 6.3, ncurses stores both \fIdynamic\fP and \fIstatic\fP
+variables in persistent storage, initialized to zeros.
+.bP
+Beginning with version 6.3, ncurses stores \fIstatic\fP and \fIdynamic\fP
+variables in the same manner as SVr4.
+.RS
+.bP
+Unlike other implementations, ncurses zeros dynamic variables 
+before the first \fB%g\fP or \fB%P\fP operator.
+.bP
+Like SVr2,
+the scope of dynamic variables in ncurses
+is within the current call to
+\fBtparm\fP.
+Use static variables if persistent storage is needed.
+.RE
+.RE
+.TP
+\fB%\(aq\fP\fIc\fP\fB\(aq\fP
+char constant \fIc\fP
+.TP
+\fB%{\fP\fInn\fP\fB}\fP
+integer constant \fInn\fP
+.TP
+\fB%l\fP
+push strlen(pop)
+.TP
+\fB%+\fP, \fB%\-\fP, \fB%*\fP, \fB%/\fP, \fB%m\fP
+arithmetic (%m is \fImod\fP): \fIpush(pop() op pop())\fP
+.TP
+\fB%&\fP, \fB%|\fP, \fB%^\fP
+bit operations (AND, OR and exclusive-OR): \fIpush(pop() op pop())\fP
+.TP
+\fB%=\fP, \fB%>\fP, \fB%<\fP
+logical operations: \fIpush(pop() op pop())\fP
+.TP
+\fB%A\fP, \fB%O\fP
+logical AND and OR operations (for conditionals)
+.TP
+\fB%!\fP, \fB%~\fP
+unary operations (logical and bit complement): \fIpush(op pop())\fP
+.TP
+\fB%i\fP
+add 1 to first two parameters (for ANSI terminals)
+.TP
+\fB%?\fP \fIexpr\fP \fB%t\fP \fIthenpart\fP \fB%e\fP \fIelsepart\fP \fB%;\fP
+This forms an if-then-else.
+The \fB%e\fP \fIelsepart\fP is optional.
+Usually the \fB%?\fP \fIexpr\fP part pushes a value onto the stack,
+and \fB%t\fP pops it from the stack, testing if it is nonzero (true).
+If it is zero (false), control passes to the \fB%e\fP (else) part.
+.IP
+It is possible to form else-if's a la Algol 68:
+.RS
+\fB%?\fP c\d1\u \fB%t\fP b\d1\u \fB%e\fP c\d2\u \fB%t\fP b\d2\u \fB%e\fP c\d3\u \fB%t\fP b\d3\u \fB%e\fP c\d4\u \fB%t\fP b\d4\u \fB%e\fP \fB%;\fP
+.RE
+.IP
+where c\di\u are conditions, b\di\u are bodies.
+.IP
+Use the \fB\-f\fP option of \fB@TIC@\fP or \fB@INFOCMP@\fP to see
+the structure of if-then-else's.
+Some strings, e.g., \fBsgr\fP can be very complicated when written
+on one line.
+The \fB\-f\fP option splits the string into lines with the parts indented.
+.PP
+Binary operations are in postfix form with the operands in the usual order.
+That is, to get x\-5 one would use \*(``%gx%{5}%\-\*(''.
+\fB%P\fP and \fB%g\fP variables are
+persistent across escape-string evaluations.
+.PP
+Consider the HP2645, which, to get to row 3 and column 12, needs
+to be sent \eE&a12c03Y padded for 6 milliseconds.
+Note that the order
+of the rows and columns is inverted here, and that the row and column
+are printed as two digits.
+Thus its \fBcup\fP capability is \*(``cup=6\eE&%p2%2dc%p1%2dY\*(''.
+.PP
+The Microterm \s-1ACT-IV\s0 needs the current row and column sent
+preceded by a \fB^T\fP, with the row and column simply encoded in binary,
+\*(``cup=^T%p1%c%p2%c\*(''.
+Terminals which use \*(``%c\*('' need to be able to
+backspace the cursor (\fBcub1\fP),
+and to move the cursor up one line on the screen (\fBcuu1\fP).
+This is necessary because it is not always safe to transmit \fB\en\fP
+\fB^D\fP and \fB\er\fP, as the system may change or discard them.
+(The library routines dealing with terminfo set tty modes so that
+tabs are never expanded, so \et is safe to send.
+This turns out to be essential for the Ann Arbor 4080.)
+.PP
+A final example is the \s-1LSI ADM\s0-3a, which uses row and column
+offset by a blank character, thus \*(``cup=\eE=%p1%\(aq \(aq%+%c%p2%\(aq \(aq%+%c\*(''.
+After sending \*(``\eE=\*('', this pushes the first parameter, pushes the
+ASCII value for a space (32), adds them (pushing the sum on the stack
+in place of the two previous values) and outputs that value as a character.
+Then the same is done for the second parameter.
+More complex arithmetic is possible using the stack.
+.PP
+.SS Cursor Motions
+.PP
+If the terminal has a fast way to home the cursor
+(to very upper left corner of screen) then this can be given as
+\fBhome\fP; similarly a fast way of getting to the lower left-hand corner
+can be given as \fBll\fP; this may involve going up with \fBcuu1\fP
+from the home position,
+but a program should never do this itself (unless \fBll\fP does) because it
+can make no assumption about the effect of moving up from the home position.
+Note that the home position is the same as addressing to (0,0):
+to the top left corner of the screen, not of memory.
+(Thus, the \eEH sequence on HP terminals cannot be used for
+.BR home .)
+.PP
+If the terminal has row or column absolute cursor addressing,
+these can be given as single parameter capabilities
+.B hpa
+(horizontal position absolute)
+and
+.B vpa
+(vertical position absolute).
+Sometimes these are shorter than the more general two parameter
+sequence (as with the hp2645) and can be used in preference to
+.BR cup .
+If there are parameterized local motions (e.g., move
+.I n
+spaces to the right) these can be given as
+.BR cud ,
+.BR cub ,
+.BR cuf ,
+and
+.B cuu
+with a single parameter indicating how many spaces to move.
+These are primarily useful if the terminal does not have
+.BR cup ,
+such as the \s-1TEKTRONIX\s+1 4025.
+.PP
+If the terminal needs to be in a special mode when running
+a program that uses these capabilities,
+the codes to enter and exit this mode can be given as \fBsmcup\fP and \fBrmcup\fP.
+This arises, for example, from terminals like the Concept with more than
+one page of memory.
+If the terminal has only memory relative cursor addressing and not screen
+relative cursor addressing, a one screen-sized window must be fixed into
+the terminal for cursor addressing to work properly.
+This is also used for the \s-1TEKTRONIX\s+1 4025,
+where
+.B smcup
+sets the command character to be the one used by terminfo.
+If the \fBsmcup\fP sequence will not restore the screen after an
+\fBrmcup\fP sequence is output (to the state prior to outputting
+\fBrmcup\fP), specify \fBnrrmc\fP.
+.PP
+.SS Margins
+SVr4 (and X/Open Curses)
+list several string capabilities for setting margins.
+Two were intended for use with terminals,
+and another six were intended for use with printers.
+.bP
+The two terminal capabilities assume that the terminal may have
+the capability of setting the left and/or right margin at the current
+cursor column position.
+.bP
+The printer capabilities assume that the printer may have
+two types of capability:
+.RS
+.bP
+the ability to set a top and/or bottom margin using the current
+line position, and
+.bP
+parameterized capabilities for setting the top, bottom, left, right margins
+given the number of rows or columns.
+.RE
+.RE
+.PP
+In practice, the categorization into \*(``terminal\*('' and \*(``printer\*(''
+is not suitable:
+.bP
+The AT&T SVr4 terminal database uses \fBsmgl\fP four times,
+for AT&T hardware.
+.IP
+Three of the four are printers.
+They lack the ability to set left/right margins by specifying the column.
+.bP
+Other (non-AT&T) terminals may support margins
+but using different assumptions from AT&T.
+.IP
+For instance, the DEC VT420 supports left/right margins,
+but only using a column parameter.
+As an added complication, the VT420 uses two settings to fully enable
+left/right margins (left/right margin mode, and origin mode).
+The former enables the margins, which causes printed text
+to wrap within margins, but the latter is needed to prevent
+cursor-addressing outside those margins.
+.bP
+Both DEC VT420 left/right margins are set with a single control sequence.
+If either is omitted, the corresponding margin is set to the left or
+right edge of the display (rather than leaving the margin unmodified).
+.PP
+These are the margin-related capabilities:
+.TS
+center;
+l l
+_ _
+lw8 lw18.
+\fBName	Description\fP
+smgl	Set left margin at current column
+smgr	Set right margin at current column
+smgb	Set bottom margin at current line
+smgt	Set top margin at current line
+smgbp	Set bottom margin at line \fIN\fP
+smglp	Set left margin at column \fIN\fP
+smgrp	Set right margin at column \fIN\fP
+smgtp	Set top margin at line \fIN\fP
+smglr	Set both left and right margins to \fIL\fP and \fIR\fP
+smgtb	Set both top and bottom margins to \fIT\fP and \fIB\fP
+.TE
+.PP
+When writing an application that
+uses these string capabilities,
+the pairs should be first checked to see
+if each capability in the pair is set or only one is set:
+.bP
+If both \fBsmglp\fP and \fBsmgrp\fP are set,
+each is used with a single argument, \fIN\fP,
+that gives the column number of the left and right margin, respectively.
+.bP
+If both \fBsmgtp\fP and \fBsmgbp\fP are set,
+each is used to set the top and bottom margin,
+respectively:
+.RS 4
+.bP
+\fBsmgtp\fP is used with a single argument, \fIN\fP,
+the line number of the top margin.
+.bP
+\fBsmgbp\fP is used with two arguments, \fIN\fP and \fIM\fP,
+that give the line number of the bottom margin,
+the first counting from the top of the
+page and the second counting from the bottom.
+This accommodates the two styles of specifying
+the bottom margin in different manufacturers' printers.
+.RE
+.IP
+When designing a terminfo entry for a
+printer that has a settable bottom margin,
+only the first or second argument should be used, depending on the printer.
+When developing an application that uses \fBsmgbp\fP to set the bottom margin,
+both arguments must be given.
+.PP
+Conversely, when only one capability in the pair is set:
+.bP 
+If only one of \fBsmglp\fP and \fBsmgrp\fP is set,
+then it is used with two arguments,
+the column number of the left and right margins, in that order.
+.bP
+Likewise, if only one of \fBsmgtp\fP and \fBsmgbp\fP is set, then it
+is used with two arguments that give the top and bottom margins,
+in that order, counting from the top of the page.
+.IP
+When designing a terminfo entry for a printer that requires setting both
+left and right or top and bottom margins simultaneously,
+only one capability in the pairs
+\fBsmglp\fP and \fBsmgrp\fP or
+\fBsmgtp\fP and \fBsmgbp\fP should be defined,
+leaving the other unset.
+.PP
+Except for very old terminal descriptions, e.g., those developed for SVr4,
+the scheme just described should be considered obsolete.
+An improved set of capabilities was added late in the SVr4 releases
+(\fBsmglr\fP and \fBsmgtb\fP),
+which explicitly use two parameters for setting the left/right or top/bottom
+margins.
+.PP
+When setting margins, the line- and column-values are zero-based.
+.PP
+The \fBmgc\fP string capability should be defined.
+Applications such as \fBtabs\fP(1) rely upon this to reset all margins.
+.\"
+.SS Area Clears
+.PP
+If the terminal can clear from the current position to the end of the
+line, leaving the cursor where it is, this should be given as \fBel\fP.
+If the terminal can clear from the beginning of the line to the current
+position inclusive, leaving
+the cursor where it is, this should be given as \fBel1\fP.
+If the terminal can clear from the current position to the end of the
+display, then this should be given as \fBed\fP.
+\fBEd\fP is only defined from the first column of a line.
+(Thus, it can be simulated by a request to delete a large number of lines,
+if a true
+.B ed
+is not available.)
+.PP
+.\"
+.SS Insert/delete line and vertical motions
+.PP
+If the terminal can open a new blank line before the line where the cursor
+is, this should be given as \fBil1\fP; this is done only from the first
+position of a line.
+The cursor must then appear on the newly blank line.
+If the terminal can delete the line which the cursor is on, then this
+should be given as \fBdl1\fP; this is done only from the first position on
+the line to be deleted.
+Versions of
+.B il1
+and
+.B dl1
+which take a single parameter and insert or delete that many lines can
+be given as
+.B il
+and
+.BR dl .
+.PP
+If the terminal has a settable scrolling region (like the vt100)
+the command to set this can be described with the
+.B csr
+capability, which takes two parameters:
+the top and bottom lines of the scrolling region.
+The cursor position is, alas, undefined after using this command.
+.PP
+It is possible to get the effect of insert or delete line using
+.B csr
+on a properly chosen region; the
+.B sc
+and
+.B rc
+(save and restore cursor) commands may be useful for ensuring that
+your synthesized insert/delete string does not move the cursor.
+(Note that the \fBncurses\fP(3X) library does this synthesis
+automatically, so you need not compose insert/delete strings for
+an entry with \fBcsr\fP).
+.PP
+Yet another way to construct insert and delete might be to use a combination of
+index with the memory-lock feature found on some terminals (like the HP\-700/90
+series, which however also has insert/delete).
+.PP
+Inserting lines at the top or bottom of the screen can also be
+done using
+.B ri
+or
+.B ind
+on many terminals without a true insert/delete line,
+and is often faster even on terminals with those features.
+.PP
+The boolean \fBnon_dest_scroll_region\fP should be set if each scrolling
+window is effectively a view port on a screen-sized canvas.
+To test for
+this capability, create a scrolling region in the middle of the screen,
+write something to the bottom line, move the cursor to the top of the region,
+and do \fBri\fP followed by \fBdl1\fP or \fBind\fP.
+If the data scrolled
+off the bottom of the region by the \fBri\fP re-appears, then scrolling
+is non-destructive.
+System V and XSI Curses expect that \fBind\fP, \fBri\fP,
+\fBindn\fP, and \fBrin\fP will simulate destructive scrolling; their
+documentation cautions you not to define \fBcsr\fP unless this is true.
+This \fBcurses\fP implementation is more liberal and will do explicit erases
+after scrolling if \fBndsrc\fP is defined.
+.PP
+If the terminal has the ability to define a window as part of
+memory, which all commands affect,
+it should be given as the parameterized string
+.BR wind .
+The four parameters are the starting and ending lines in memory
+and the starting and ending columns in memory, in that order.
+.PP
+If the terminal can retain display memory above, then the
+\fBda\fP capability should be given; if display memory can be retained
+below, then \fBdb\fP should be given.
+These indicate
+that deleting a line or scrolling may bring non-blank lines up from below
+or that scrolling back with \fBri\fP may bring down non-blank lines.
+.PP
+.SS Insert/Delete Character
+.PP
+There are two basic kinds of intelligent terminals with respect to
+insert/delete character which can be described using
+.I terminfo.
+The most common insert/delete character operations affect only the characters
+on the current line and shift characters off the end of the line rigidly.
+Other terminals, such as the Concept 100 and the Perkin Elmer Owl, make
+a distinction between typed and untyped blanks on the screen, shifting
+upon an insert or delete only to an untyped blank on the screen which is
+either eliminated, or expanded to two untyped blanks.
+.PP
+You can determine the
+kind of terminal you have by clearing the screen and then typing
+text separated by cursor motions.
+Type \*(``abc\ \ \ \ def\*('' using local
+cursor motions (not spaces) between the \*(``abc\*('' and the \*(``def\*(''.
+Then position the cursor before the \*(``abc\*('' and put the terminal in insert
+mode.
+If typing characters causes the rest of the line to shift
+rigidly and characters to fall off the end, then your terminal does
+not distinguish between blanks and untyped positions.
+If the \*(``abc\*(''
+shifts over to the \*(``def\*('' which then move together around the end of the
+current line and onto the next as you insert, you have the second type of
+terminal, and should give the capability \fBin\fP, which stands for
+\*(``insert null\*(''.
+.PP
+While these are two logically separate attributes (one line versus multi-line
+insert mode, and special treatment of untyped spaces) we have seen no
+terminals whose insert mode cannot be described with the single attribute.
+.PP
+Terminfo can describe both terminals which have an insert mode, and terminals
+which send a simple sequence to open a blank position on the current line.
+Give as \fBsmir\fP the sequence to get into insert mode.
+Give as \fBrmir\fP the sequence to leave insert mode.
+Now give as \fBich1\fP any sequence needed to be sent just before sending
+the character to be inserted.
+Most terminals with a true insert mode
+will not give \fBich1\fP; terminals which send a sequence to open a screen
+position should give it here.
+.PP
+If your terminal has both, insert mode is usually preferable to \fBich1\fP.
+Technically, you should not give both unless the terminal actually requires
+both to be used in combination.
+Accordingly, some non-curses applications get
+confused if both are present; the symptom is doubled characters in an update
+using insert.
+This requirement is now rare; most \fBich\fP sequences do not
+require previous smir, and most smir insert modes do not require \fBich1\fP
+before each character.
+Therefore, the new \fBcurses\fP actually assumes this
+is the case and uses either \fBrmir\fP/\fBsmir\fP or \fBich\fP/\fBich1\fP as
+appropriate (but not both).
+If you have to write an entry to be used under
+new curses for a terminal old enough to need both, include the
+\fBrmir\fP/\fBsmir\fP sequences in \fBich1\fP.
+.PP
+If post insert padding is needed, give this as a number of milliseconds
+in \fBip\fP (a string option).
+Any other sequence which may need to be
+sent after an insert of a single character may also be given in \fBip\fP.
+If your terminal needs both to be placed into an \*(``insert mode\*('' and
+a special code to precede each inserted character, then both
+.BR smir / rmir
+and
+.B ich1
+can be given, and both will be used.
+The
+.B ich
+capability, with one parameter,
+.IR n ,
+will repeat the effects of
+.B ich1
+.I n
+times.
+.PP
+If padding is necessary between characters typed while not
+in insert mode, give this as a number of milliseconds padding in \fBrmp\fP.
+.PP
+It is occasionally necessary to move around while in insert mode
+to delete characters on the same line (e.g., if there is a tab after
+the insertion position).
+If your terminal allows motion while in
+insert mode you can give the capability \fBmir\fP to speed up inserting
+in this case.
+Omitting \fBmir\fP will affect only speed.
+Some terminals
+(notably Datamedia's) must not have \fBmir\fP because of the way their
+insert mode works.
+.PP
+Finally, you can specify
+.B dch1
+to delete a single character,
+.B dch
+with one parameter,
+.IR n ,
+to delete
+.I n characters,
+and delete mode by giving \fBsmdc\fP and \fBrmdc\fP
+to enter and exit delete mode (any mode the terminal needs to be placed
+in for
+.B dch1
+to work).
+.PP
+A command to erase
+.I n
+characters (equivalent to outputting
+.I n
+blanks without moving the cursor)
+can be given as
+.B ech
+with one parameter.
+.PP
+.SS "Highlighting, Underlining, and Visible Bells"
+.PP
+If your terminal has one or more kinds of display attributes,
+these can be represented in a number of different ways.
+You should choose one display form as
+\f2standout mode\fP,
+representing a good, high contrast, easy-on-the-eyes,
+format for highlighting error messages and other attention getters.
+(If you have a choice, reverse video plus half-bright is good,
+or reverse video alone.)
+The sequences to enter and exit standout mode
+are given as \fBsmso\fP and \fBrmso\fP, respectively.
+If the code to change into or out of standout
+mode leaves one or even two blank spaces on the screen,
+as the TVI 912 and Teleray 1061 do,
+then \fBxmc\fP should be given to tell how many spaces are left.
+.PP
+Codes to begin underlining and end underlining can be given as \fBsmul\fP
+and \fBrmul\fP respectively.
+If the terminal has a code to underline the current character and move
+the cursor one space to the right,
+such as the Microterm Mime,
+this can be given as \fBuc\fP.
+.PP
+Other capabilities to enter various highlighting modes include
+.B blink
+(blinking)
+.B bold
+(bold or extra bright)
+.B dim
+(dim or half-bright)
+.B invis
+(blanking or invisible text)
+.B prot
+(protected)
+.B rev
+(reverse video)
+.B sgr0
+(turn off
+.I all
+attribute modes)
+.B smacs
+(enter alternate character set mode)
+and
+.B rmacs
+(exit alternate character set mode).
+Turning on any of these modes singly may or may not turn off other modes.
+.PP
+If there is a sequence to set arbitrary combinations of modes,
+this should be given as
+.B sgr
+(set attributes),
+taking 9 parameters.
+Each parameter is either 0 or nonzero, as the corresponding attribute is on or off.
+The 9 parameters are, in order:
+standout, underline, reverse, blink, dim, bold, blank, protect, alternate
+character set.
+Not all modes need be supported by
+.BR sgr ,
+only those for which corresponding separate attribute commands exist.
+.PP
+For example, the DEC vt220 supports most of the modes:
+.PP
+.TS
+center;
+l l l
+l l l
+lw18 lw14 lw18.
+\fBtparm parameter	attribute	escape sequence\fP
+
+none	none	\\E[0m
+p1	standout	\\E[0;1;7m
+p2	underline	\\E[0;4m
+p3	reverse	\\E[0;7m
+p4	blink	\\E[0;5m
+p5	dim	not available
+p6	bold	\\E[0;1m
+p7	invis	\\E[0;8m
+p8	protect	not used
+p9	altcharset	^O (off) ^N (on)
+.TE
+.PP
+We begin each escape sequence by turning off any existing modes, since
+there is no quick way to determine whether they are active.
+Standout is set up to be the combination of reverse and bold.
+The vt220 terminal has a protect mode,
+though it is not commonly used in sgr
+because it protects characters on the screen from the host's erasures.
+The altcharset mode also is different in that it is either ^O or ^N,
+depending on whether it is off or on.
+If all modes are turned on, the resulting sequence is \\E[0;1;4;5;7;8m^N.
+.PP
+Some sequences are common to different modes.
+For example, ;7 is output when either p1 or p3 is true, that is, if
+either standout or reverse modes are turned on.
+.PP
+Writing out the above sequences, along with their dependencies yields
+.PP
+.ne 11
+.TS
+center;
+l l l
+l l l
+lw18 lw14 lw18.
+\fBsequence	when to output	terminfo translation\fP
+
+.ft CW
+\\E[0	always	\\E[0
+;1	if p1 or p6	%?%p1%p6%|%t;1%;
+;4	if p2	%?%p2%|%t;4%;
+;5	if p4	%?%p4%|%t;5%;
+;7	if p1 or p3	%?%p1%p3%|%t;7%;
+;8	if p7	%?%p7%|%t;8%;
+m	always	m
+^N or ^O	if p9 ^N, else ^O	%?%p9%t^N%e^O%;
+.ft R
+.TE
+.PP
+Putting this all together into the sgr sequence gives:
+.PP
+.ft CW
+.nf
+    sgr=\\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p4%t;5%;
+        %?%p1%p3%|%t;7%;%?%p7%t;8%;m%?%p9%t\\016%e\\017%;,
+.fi
+.ft R
+.PP
+Remember that if you specify sgr, you must also specify sgr0.
+Also, some implementations rely on sgr being given if sgr0 is,
+Not all terminfo entries necessarily have an sgr string, however.
+Many terminfo entries are derived from termcap entries
+which have no sgr string.
+The only drawback to adding an sgr string is that termcap also
+assumes that sgr0 does not exit alternate character set mode.
+.PP
+Terminals with the \*(``magic cookie\*('' glitch
+.RB ( xmc )
+deposit special \*(``cookies\*('' when they receive mode-setting sequences,
+which affect the display algorithm rather than having extra bits for
+each character.
+Some terminals, such as the HP 2621, automatically leave standout
+mode when they move to a new line or the cursor is addressed.
+Programs using standout mode should exit standout mode before
+moving the cursor or sending a newline,
+unless the
+.B msgr
+capability, asserting that it is safe to move in standout mode, is present.
+.PP
+If the terminal has
+a way of flashing the screen to indicate an error quietly (a bell replacement)
+then this can be given as \fBflash\fP; it must not move the cursor.
+.PP
+If the cursor needs to be made more visible than normal when it is
+not on the bottom line (to make, for example, a non-blinking underline into an
+easier to find block or blinking underline)
+give this sequence as
+.BR cvvis .
+If there is a way to make the cursor completely invisible, give that as
+.BR civis .
+The capability
+.B cnorm
+should be given which undoes the effects of both of these modes.
+.PP
+If your terminal correctly generates underlined characters
+(with no special codes needed)
+even though it does not overstrike,
+then you should give the capability \fBul\fP.
+If a character overstriking another leaves both characters on the screen,
+specify the capability \fBos\fP.
+If overstrikes are erasable with a blank,
+then this should be indicated by giving \fBeo\fP.
+.PP
+.SS Keypad and Function Keys
+.PP
+If the terminal has a keypad that transmits codes when the keys are pressed,
+this information can be given.
+Note that it is not possible to handle
+terminals where the keypad only works in local (this applies, for example,
+to the unshifted HP 2621 keys).
+If the keypad can be set to transmit or not transmit,
+give these codes as \fBsmkx\fP and \fBrmkx\fP.
+Otherwise the keypad is assumed to always transmit.
+.PP
+The codes sent by the left arrow, right arrow, up arrow, down arrow,
+and home keys can be given as
+\fBkcub1, kcuf1, kcuu1, kcud1, \fRand\fB khome\fP respectively.
+If there are function keys such as f0, f1, ..., f10, the codes they send
+can be given as \fBkf0, kf1, ..., kf10\fP.
+If these keys have labels other than the default f0 through f10, the labels
+can be given as \fBlf0, lf1, ..., lf10\fP.
+.PP
+The codes transmitted by certain other special keys can be given:
+.bP
+.B kll
+(home down),
+.bP
+.B kbs
+(backspace),
+.bP
+.B ktbc
+(clear all tabs),
+.bP
+.B kctab
+(clear the tab stop in this column),
+.bP
+.B kclr
+(clear screen or erase key),
+.bP
+.B kdch1
+(delete character),
+.bP
+.B kdl1
+(delete line),
+.bP
+.B krmir
+(exit insert mode),
+.bP
+.B kel
+(clear to end of line),
+.bP
+.B ked
+(clear to end of screen),
+.bP
+.B kich1
+(insert character or enter insert mode),
+.bP
+.B kil1
+(insert line),
+.bP
+.B knp
+(next page),
+.bP
+.B kpp
+(previous page),
+.bP
+.B kind
+(scroll forward/down),
+.bP
+.B kri
+(scroll backward/up),
+.bP
+.B khts
+(set a tab stop in this column).
+.PP
+In addition, if the keypad has a 3 by 3 array of keys including the four
+arrow keys, the other five keys can be given as
+.BR ka1 ,
+.BR ka3 ,
+.BR kb2 ,
+.BR kc1 ,
+and
+.BR kc3 .
+These keys are useful when the effects of a 3 by 3 directional pad are needed.
+.PP
+Strings to program function keys can be given as
+.BR pfkey ,
+.BR pfloc ,
+and
+.BR pfx .
+A string to program screen labels should be specified as \fBpln\fP.
+Each of these strings takes two parameters: the function key number to
+program (from 0 to 10) and the string to program it with.
+Function key numbers out of this range may program undefined keys in
+a terminal dependent manner.
+The difference between the capabilities is that
+.B pfkey
+causes pressing the given key to be the same as the user typing the
+given string;
+.B pfloc
+causes the string to be executed by the terminal in local; and
+.B pfx
+causes the string to be transmitted to the computer.
+.PP
+The capabilities \fBnlab\fP, \fBlw\fP and \fBlh\fP
+define the number of programmable
+screen labels and their width and height.
+If there are commands to turn the labels on and off,
+give them in \fBsmln\fP and \fBrmln\fP.
+\fBsmln\fP is normally output after one or more pln
+sequences to make sure that the change becomes visible.
+.PP
+.SS Tabs and Initialization
+.PP
+A few capabilities are used only for tabs:
+.bP
+If the terminal has hardware tabs, the command to advance to the next
+tab stop can be given as
+.B ht
+(usually control/I).
+.bP
+A \*(``back-tab\*('' command which moves leftward to the preceding tab stop can
+be given as
+.BR cbt .
+.IP
+By convention, if the teletype modes indicate that tabs are being
+expanded by the computer rather than being sent to the terminal,
+programs should not use
+.B ht
+or
+.B cbt
+even if they are present, since the user may not have the tab stops
+properly set.
+.bP
+If the terminal has hardware tabs which are initially set every
+.I n
+spaces when the terminal is powered up,
+the numeric parameter
+.B it
+is given, showing the number of spaces the tabs are set to.
+.IP
+The \fBit\fP capability is normally used by the \fB@TSET@\fP
+command to determine whether to set the mode for hardware tab expansion,
+and whether to set the tab stops.
+If the terminal has tab stops that can be saved in non-volatile memory,
+the terminfo description can assume that they are properly set.
+.PP
+Other capabilities
+include
+.bP
+.BR is1 ,
+.BR is2 ,
+and
+.BR is3 ,
+initialization strings for the terminal,
+.bP
+.BR iprog ,
+the path name of a program to be run to initialize the terminal,
+.bP
+and \fBif\fP, the name of a file containing long initialization strings.
+.PP
+These strings are expected to set the terminal into modes consistent
+with the rest of the terminfo description.
+They are normally sent to the terminal, by the
+.I init
+option of the \fB@TPUT@\fP program, each time the user logs in.
+They will be printed in the following order:
+.RS
+.TP
+run the program
+.B iprog
+.TP
+output
+.br
+\fBis1\fP and
+.br
+\fBis2\fP
+.TP
+set the margins using
+\fBmgc\fP or
+.br
+\fBsmglp\fP and \fBsmgrp\fP or
+.br
+\fBsmgl\fP and \fBsmgr\fP
+.TP
+set tabs using
+.B tbc
+and
+.B hts
+.TP
+print the file
+\fBif\fP
+.TP
+and finally output
+\fBis3\fP.
+.RE
+.PP
+Most initialization is done with
+.BR is2 .
+Special terminal modes can be set up without duplicating strings
+by putting the common sequences in
+.B is2
+and special cases in
+.B is1
+and
+.BR is3 .
+.PP
+A set of sequences that does a harder reset from a totally unknown state
+can be given as
+.BR rs1 ,
+.BR rs2 ,
+.B rf
+and
+.BR rs3 ,
+analogous to
+.B is1 ,
+.B is2 ,
+.B if
+and
+.B is3
+respectively.
+These strings are output
+by \fIreset\fP option of \fB@TPUT@\fP,
+or by the \fB@RESET@\fP program
+(an alias of \fB@TSET@\fP),
+which is used when the terminal gets into a wedged state.
+Commands are normally placed in
+.BR rs1 ,
+.B rs2
+.B rs3
+and
+.B rf
+only if they produce annoying effects on the screen and are not
+necessary when logging in.
+For example, the command to set the vt100 into 80-column mode would
+normally be part of
+.BR is2 ,
+but it causes an annoying glitch of the screen and is not normally
+needed since the terminal is usually already in 80-column mode.
+.PP
+The \fB@RESET@\fP program writes strings including
+.BR iprog ,
+etc., in the same order as the
+.I init
+program, using
+.BR rs1 ,
+etc., instead of
+.BR is1 ,
+etc.
+If any of
+.BR rs1 ,
+.BR rs2 ,
+.BR rs3 ,
+or
+.B rf
+reset capability strings are missing,
+the \fB@RESET@\fP program
+falls back upon the corresponding initialization capability string.
+.PP
+If there are commands to set and clear tab stops, they can be given as
+.B tbc
+(clear all tab stops)
+and
+.B hts
+(set a tab stop in the current column of every row).
+If a more complex sequence is needed to set the tabs than can be
+described by this, the sequence can be placed in
+.B is2
+or
+.BR if .
+.PP
+The \fB@TPUT@ reset\fP command uses the same capability strings
+as the \fB@RESET@\fP command,
+although the two programs (\fB@TPUT@\fP and \fB@RESET@\fP)
+provide different command-line options.
+.PP
+In practice, these terminfo capabilities are not often used in
+initialization of tabs
+(though they are required for the \fB@TABS@\fP program):
+.bP
+Almost all hardware terminals (at least those which supported tabs)
+initialized those to every \fIeight\fP columns:
+.IP
+The only exception was the AT&T 2300 series,
+which set tabs to every \fIfive\fP columns.
+.bP
+In particular, developers of the hardware terminals which are commonly used
+as models for modern terminal emulators provided documentation demonstrating
+that \fIeight\fP columns were the standard.
+.bP
+Because of this, the terminal initialization programs
+\fB@TPUT@\fP and \fB@TSET@\fP
+use the
+\fBtbc\fP (\fBclear_all_tabs\fP) and
+\fBhts\fP (\fBset_tab\fP) capabilities directly
+only when the \fBit\fP (\fBinit_tabs\fP) capability
+is set to a value other than \fIeight\fP.
+.SS Delays and Padding
+.PP
+Many older and slower terminals do not support either XON/XOFF or DTR
+handshaking, including hard copy terminals and some very archaic CRTs
+(including, for example, DEC VT100s).
+These may require padding characters
+after certain cursor motions and screen changes.
+.PP
+If the terminal uses xon/xoff handshaking for flow control (that is,
+it automatically emits ^S back to the host when its input buffers are
+close to full), set
+.BR xon .
+This capability suppresses the emission of padding.
+You can also set it
+for memory-mapped console devices effectively that do not have a speed limit.
+Padding information should still be included so that routines can
+make better decisions about relative costs, but actual pad characters will
+not be transmitted.
+.PP
+If \fBpb\fP (padding baud rate) is given, padding is suppressed at baud rates
+below the value of \fBpb\fP.
+If the entry has no padding baud rate, then
+whether padding is emitted or not is completely controlled by \fBxon\fP.
+.PP
+If the terminal requires other than a null (zero) character as a pad,
+then this can be given as \fBpad\fP.
+Only the first character of the
+.B pad
+string is used.
+.PP
+.SS Status Lines
+Some terminals have an extra \*(``status line\*('' which is not normally used by
+software (and thus not counted in the terminal's \fBlines\fP capability).
+.PP
+The simplest case is a status line which is cursor-addressable but not
+part of the main scrolling region on the screen; the Heathkit H19 has
+a status line of this kind, as would a 24-line VT100 with a 23-line
+scrolling region set up on initialization.
+This situation is indicated
+by the \fBhs\fP capability.
+.PP
+Some terminals with status lines need special sequences to access the
+status line.
+These may be expressed as a string with single parameter
+\fBtsl\fP which takes the cursor to a given zero-origin column on the
+status line.
+The capability \fBfsl\fP must return to the main-screen
+cursor positions before the last \fBtsl\fP.
+You may need to embed the
+string values of \fBsc\fP (save cursor) and \fBrc\fP (restore cursor)
+in \fBtsl\fP and \fBfsl\fP to accomplish this.
+.PP
+The status line is normally assumed to be the same width as the width
+of the terminal.
+If this is untrue, you can specify it with the numeric
+capability \fBwsl\fP.
+.PP
+A command to erase or blank the status line may be specified as \fBdsl\fP.
+.PP
+The boolean capability \fBeslok\fP specifies that escape sequences, tabs,
+etc., work ordinarily in the status line.
+.PP
+The \fBncurses\fP implementation does not yet use any of these capabilities.
+They are documented here in case they ever become important.
+.PP
+.SS Line Graphics
+.PP
+Many terminals have alternate character sets useful for forms-drawing.
+Terminfo and \fBcurses\fP have built-in support
+for most of the drawing characters
+supported by the VT100, with some characters from the AT&T 4410v1 added.
+This alternate character set may be specified by the \fBacsc\fP capability.
+.PP
+.TS H
+center expand;
+l l l l l
+l l l l l
+_ _ _ _ _
+lw25 lw10 lw6 lw6 lw6.
+.\".TH
+\fBGlyph	ACS	Ascii	acsc	acsc\fP
+\fBName	Name	Default	Char	Value\fP
+arrow pointing right	ACS_RARROW	>	+	0x2b
+arrow pointing left	ACS_LARROW	<	,	0x2c
+arrow pointing up	ACS_UARROW	^	\-	0x2d
+arrow pointing down	ACS_DARROW	v	.	0x2e
+solid square block	ACS_BLOCK	#	0	0x30
+diamond         	ACS_DIAMOND	+	`	0x60
+checker board (stipple)	ACS_CKBOARD	:	a	0x61
+degree symbol   	ACS_DEGREE	\e	f	0x66
+plus/minus      	ACS_PLMINUS	#	g	0x67
+board of squares	ACS_BOARD	#	h	0x68
+lantern symbol  	ACS_LANTERN	#	i	0x69
+lower right corner	ACS_LRCORNER	+	j	0x6a
+upper right corner	ACS_URCORNER	+	k	0x6b
+upper left corner	ACS_ULCORNER	+	l	0x6c
+lower left corner	ACS_LLCORNER	+	m	0x6d
+large plus or crossover	ACS_PLUS	+	n	0x6e
+scan line 1     	ACS_S1  	~	o	0x6f
+scan line 3     	ACS_S3  	\-	p	0x70
+horizontal line 	ACS_HLINE	\-	q	0x71
+scan line 7     	ACS_S7  	\-	r	0x72
+scan line 9     	ACS_S9  	\&_	s	0x73
+tee pointing right	ACS_LTEE	+	t	0x74
+tee pointing left	ACS_RTEE	+	u	0x75
+tee pointing up 	ACS_BTEE	+	v	0x76
+tee pointing down	ACS_TTEE	+	w	0x77
+vertical line   	ACS_VLINE	|	x	0x78
+less-than-or-equal-to	ACS_LEQUAL	<	y	0x79
+greater-than-or-equal-to	ACS_GEQUAL	>	z	0x7a
+greek pi        	ACS_PI	*	{	0x7b
+not-equal       	ACS_NEQUAL	!	|	0x7c
+UK pound sign        	ACS_STERLING	f	}	0x7d
+bullet          	ACS_BULLET	o	~	0x7e
+.TE
+.PP
+A few notes apply to the table itself:
+.bP
+X/Open Curses incorrectly states that the mapping for \fIlantern\fP is
+uppercase \*(``I\*('' although Unix implementations use the
+lowercase \*(``i\*('' mapping.
+.bP
+The DEC VT100 implemented graphics using the alternate character set
+feature, temporarily switching \fImodes\fP and sending characters
+in the range 0x60 (96) to 0x7e (126)
+(the \fBacsc Value\fP column in the table).
+.bP
+The AT&T terminal added graphics characters outside that range.
+.IP
+Some of the characters within the range do not match the VT100;
+presumably they were used in the AT&T terminal:
+\fIboard of squares\fP replaces the VT100 \fInewline\fP symbol, while
+\fIlantern symbol\fP replaces the VT100 \fIvertical tab\fP symbol.
+The other VT100 symbols for control characters (\fIhorizontal tab\fP,
+\fIcarriage return\fP and \fIline-feed\fP) are not (re)used in curses.
+.PP
+The best way to define a new device's graphics set is to add a column
+to a copy of this table for your terminal, giving the character which
+(when emitted between \fBsmacs\fP/\fBrmacs\fP switches) will be rendered
+as the corresponding graphic.
+Then read off the VT100/your terminal
+character pairs right to left in sequence; these become the ACSC string.
+.PP
+.SS Color Handling
+.PP
+The curses library functions \fBinit_pair\fP and \fBinit_color\fP
+manipulate the \fIcolor pairs\fP and \fIcolor values\fP discussed in this
+section
+(see \fBcurs_color\fP(3X) for details on these and related functions).
+.PP
+Most color terminals are either \*(``Tektronix-like\*('' or \*(``HP-like\*('':
+.bP
+Tektronix-like
+terminals have a predefined set of \fIN\fP colors
+(where \fIN\fP is usually 8),
+and can set
+character-cell foreground and background characters independently, mixing them
+into \fIN\fP\ *\ \fIN\fP color-pairs.
+.bP
+On HP-like terminals, the user must set each color
+pair up separately (foreground and background are not independently settable).
+Up to \fIM\fP color-pairs may be set up from 2*\fIM\fP different colors.
+ANSI-compatible terminals are Tektronix-like.
+.PP
+Some basic color capabilities are independent of the color method.
+The numeric
+capabilities \fBcolors\fP and \fBpairs\fP specify the maximum numbers of colors
+and color-pairs that can be displayed simultaneously.
+The \fBop\fP (original
+pair) string resets foreground and background colors to their default values
+for the terminal.
+The \fBoc\fP string resets all colors or color-pairs to
+their default values for the terminal.
+Some terminals (including many PC
+terminal emulators) erase screen areas with the current background color rather
+than the power-up default background; these should have the boolean capability
+\fBbce\fP.
+.PP
+While the curses library works with \fIcolor pairs\fP
+(reflecting the inability of some devices to set foreground
+and background colors independently),
+there are separate capabilities for setting these features:
+.bP
+To change the current foreground or background color on a Tektronix-type
+terminal, use \fBsetaf\fP (set ANSI foreground) and \fBsetab\fP (set ANSI
+background) or \fBsetf\fP (set foreground) and \fBsetb\fP (set background).
+These take one parameter, the color number.
+The SVr4 documentation describes
+only \fBsetaf\fP/\fBsetab\fP; the XPG4 draft says that "If the terminal
+supports ANSI escape sequences to set background and foreground, they should
+be coded as \fBsetaf\fP and \fBsetab\fP, respectively.
+.bP
+If the terminal
+supports other escape sequences to set background and foreground, they should
+be coded as \fBsetf\fP and \fBsetb\fP, respectively.
+The \fBvidputs\fP and the \fBrefresh\fP(3X) functions
+use the \fBsetaf\fP and \fBsetab\fP capabilities if they are defined.
+.PP
+The \fBsetaf\fP/\fBsetab\fP and \fBsetf\fP/\fBsetb\fP capabilities take a
+single numeric argument each.
+Argument values 0-7 of \fBsetaf\fP/\fBsetab\fP are portably defined as
+follows (the middle column is the symbolic #define available in the header for
+the \fBcurses\fP or \fBncurses\fP libraries).
+The terminal hardware is free to
+map these as it likes, but the RGB values indicate normal locations in color
+space.
+.PP
+.TS H
+center;
+l c c c
+l l n l.
+\fBColor	#define 	Value	RGB\fP
+black	\fBCOLOR_BLACK\fP	0	0, 0, 0
+red	\fBCOLOR_RED\ \fP	1	max,0,0
+green	\fBCOLOR_GREEN\fP	2	0,max,0
+yellow	\fBCOLOR_YELLOW\fP	3	max,max,0
+blue	\fBCOLOR_BLUE\fP	4	0,0,max
+magenta	\fBCOLOR_MAGENTA\fP	5	max,0,max
+cyan	\fBCOLOR_CYAN\fP	6	0,max,max
+white	\fBCOLOR_WHITE\fP	7	max,max,max
+.TE
+.PP
+The argument values of \fBsetf\fP/\fBsetb\fP historically correspond to
+a different mapping, i.e.,
+.TS H
+center;
+l c c c
+l l n l.
+\fBColor	#define 	Value	RGB\fP
+black	\fBCOLOR_BLACK\fP	0	0, 0, 0
+blue	\fBCOLOR_BLUE\fP	1	0,0,max
+green	\fBCOLOR_GREEN\fP	2	0,max,0
+cyan	\fBCOLOR_CYAN\fP	3	0,max,max
+red	\fBCOLOR_RED\ \fP	4	max,0,0
+magenta	\fBCOLOR_MAGENTA\fP	5	max,0,max
+yellow	\fBCOLOR_YELLOW\fP	6	max,max,0
+white	\fBCOLOR_WHITE\fP	7	max,max,max
+.TE
+.PP
+It is important to not confuse the two sets of color capabilities;
+otherwise red/blue will be interchanged on the display.
+.PP
+On an HP-like terminal, use \fBscp\fP with a color-pair number parameter to set
+which color pair is current.
+.PP
+Some terminals allow the \fIcolor values\fP to be modified:
+.bP
+On a Tektronix-like terminal, the capability \fBccc\fP may be present to
+indicate that colors can be modified.
+If so, the \fBinitc\fP capability will
+take a color number (0 to \fBcolors\fP \- 1)and three more parameters which
+describe the color.
+These three parameters default to being interpreted as RGB
+(Red, Green, Blue) values.
+If the boolean capability \fBhls\fP is present,
+they are instead as HLS (Hue, Lightness, Saturation) indices.
+The ranges are
+terminal-dependent.
+.bP
+On an HP-like terminal, \fBinitp\fP may give a capability for changing a
+color-pair value.
+It will take seven parameters; a color-pair number (0 to
+\fBmax_pairs\fP \- 1), and two triples describing first background and then
+foreground colors.
+These parameters must be (Red, Green, Blue) or
+(Hue, Lightness, Saturation) depending on \fBhls\fP.
+.PP
+On some color terminals, colors collide with highlights.
+You can register
+these collisions with the \fBncv\fP capability.
+This is a bit-mask of
+attributes not to be used when colors are enabled.
+The correspondence with the
+attributes understood by \fBcurses\fP is as follows:
+.PP
+.TS
+center;
+l l l l
+lw20 lw2 lw10 lw10.
+\fBAttribute	Bit	Decimal	Set by\fP
+A_STANDOUT	0	1	sgr
+A_UNDERLINE	1	2	sgr
+A_REVERSE	2	4	sgr
+A_BLINK   	3	8	sgr
+A_DIM      	4	16	sgr
+A_BOLD    	5	32	sgr
+A_INVIS   	6	64	sgr
+A_PROTECT	7	128	sgr
+A_ALTCHARSET	8	256	sgr
+A_HORIZONTAL	9	512	sgr1
+A_LEFT	10	1024	sgr1
+A_LOW	11	2048	sgr1
+A_RIGHT	12	4096	sgr1
+A_TOP	13	8192	sgr1
+A_VERTICAL	14	16384	sgr1
+A_ITALIC	15	32768	sitm
+.TE
+.PP
+For example, on many IBM PC consoles, the underline attribute collides with the
+foreground color blue and is not available in color mode.
+These should have
+an \fBncv\fP capability of 2.
+.PP
+SVr4 curses does nothing with \fBncv\fP, ncurses recognizes it and optimizes
+the output in favor of colors.
+.PP
+.SS Miscellaneous
+If the terminal requires other than a null (zero) character as a pad, then this
+can be given as pad.
+Only the first character of the pad string is used.
+If the terminal does not have a pad character, specify npc.
+Note that ncurses implements the termcap-compatible \fBPC\fP variable;
+though the application may set this value to something other than
+a null, ncurses will test \fBnpc\fP first and use napms if the terminal
+has no pad character.
+.PP
+If the terminal can move up or down half a line,
+this can be indicated with
+.B hu
+(half-line up)
+and
+.B hd
+(half-line down).
+This is primarily useful for superscripts and subscripts on hard-copy terminals.
+If a hard-copy terminal can eject to the next page (form feed), give this as
+.B ff
+(usually control/L).
+.PP
+If there is a command to repeat a given character a given number of
+times (to save time transmitting a large number of identical characters)
+this can be indicated with the parameterized string
+.BR rep .
+The first parameter is the character to be repeated and the second
+is the number of times to repeat it.
+Thus, tparm(repeat_char, \(aqx\(aq, 10) is the same as \*(``xxxxxxxxxx\*(''.
+.PP
+If the terminal has a settable command character, such as the \s-1TEKTRONIX\s+1 4025,
+this can be indicated with
+.BR cmdch .
+A prototype command character is chosen which is used in all capabilities.
+This character is given in the
+.B cmdch
+capability to identify it.
+The following convention is supported on some UNIX systems:
+The environment is to be searched for a
+.B CC
+variable, and if found, all
+occurrences of the prototype character are replaced with the character
+in the environment variable.
+.PP
+Terminal descriptions that do not represent a specific kind of known
+terminal, such as
+.IR switch ,
+.IR dialup ,
+.IR patch ,
+and
+.IR network ,
+should include the
+.B gn
+(generic) capability so that programs can complain that they do not know
+how to talk to the terminal.
+(This capability does not apply to
+.I virtual
+terminal descriptions for which the escape sequences are known.)
+.PP
+If the terminal has a \*(``meta key\*('' which acts as a shift key,
+setting the 8th bit of any character transmitted, this fact can
+be indicated with
+.BR km .
+Otherwise, software will assume that the 8th bit is parity and it
+will usually be cleared.
+If strings exist to turn this \*(``meta mode\*('' on and off, they
+can be given as
+.B smm
+and
+.BR rmm .
+.PP
+If the terminal has more lines of memory than will fit on the screen
+at once, the number of lines of memory can be indicated with
+.BR lm .
+A value of
+.BR lm #0
+indicates that the number of lines is not fixed,
+but that there is still more memory than fits on the screen.
+.PP
+If the terminal is one of those supported by the \s-1UNIX\s+1 virtual
+terminal protocol, the terminal number can be given as
+.BR vt .
+.PP
+Media copy
+strings which control an auxiliary printer connected to the terminal
+can be given as
+.BR mc0 :
+print the contents of the screen,
+.BR mc4 :
+turn off the printer, and
+.BR mc5 :
+turn on the printer.
+When the printer is on, all text sent to the terminal will be sent
+to the printer.
+It is undefined whether the text is also displayed on the terminal screen
+when the printer is on.
+A variation
+.B mc5p
+takes one parameter, and leaves the printer on for as many characters
+as the value of the parameter, then turns the printer off.
+The parameter should not exceed 255.
+All text, including
+.BR mc4 ,
+is transparently passed to the printer while an
+.B mc5p
+is in effect.
+.PP
+.SS Glitches and Braindamage
+.PP
+Hazeltine terminals, which do not allow \*(``~\*('' characters to be displayed should
+indicate \fBhz\fP.
+.PP
+Terminals which ignore a line-feed immediately after an \fBam\fP wrap,
+such as the Concept and vt100,
+should indicate \fBxenl\fP.
+.PP
+If
+.B el
+is required to get rid of standout
+(instead of merely writing normal text on top of it),
+\fBxhp\fP should be given.
+.PP
+Teleray terminals, where tabs turn all characters moved over to blanks,
+should indicate \fBxt\fP (destructive tabs).
+Note: the variable indicating this is now \*(``dest_tabs_magic_smso\*(''; in
+older versions, it was teleray_glitch.
+This glitch is also taken to mean that it is not possible to position
+the cursor on top of a \*(``magic cookie\*('',
+that to erase standout mode it is instead necessary to use
+delete and insert line.
+The ncurses implementation ignores this glitch.
+.PP
+The Beehive Superbee, which is unable to correctly transmit the escape
+or control/C characters, has
+.BR xsb ,
+indicating that the f1 key is used for escape and f2 for control/C.
+(Only certain Superbees have this problem, depending on the ROM.)
+Note that in older terminfo versions, this capability was called
+\*(``beehive_glitch\*(''; it is now \*(``no_esc_ctl_c\*(''.
+.PP
+Other specific terminal problems may be corrected by adding more
+capabilities of the form \fBx\fP\fIx\fP.
+.PP
+.SS Pitfalls of Long Entries
+.PP
+Long terminfo entries are unlikely to be a problem; to date, no entry has even
+approached terminfo's 4096-byte string-table maximum.
+Unfortunately, the termcap
+translations are much more strictly limited (to 1023 bytes), thus termcap translations
+of long terminfo entries can cause problems.
+.PP
+The man pages for 4.3BSD and older versions of \fBtgetent\fP instruct the user to
+allocate a 1024-byte buffer for the termcap entry.
+The entry gets null-terminated by
+the termcap library, so that makes the maximum safe length for a termcap entry
+1k\-1 (1023) bytes.
+Depending on what the application and the termcap library
+being used does, and where in the termcap file the terminal type that \fBtgetent\fP
+is searching for is, several bad things can happen.
+.PP
+Some termcap libraries print a warning message or exit if they find an
+entry that's longer than 1023 bytes; others do not; others truncate the
+entries to 1023 bytes.
+Some application programs allocate more than
+the recommended 1K for the termcap entry; others do not.
+.PP
+Each termcap entry has two important sizes associated with it: before
+\*(``tc\*('' expansion, and after \*(``tc\*('' expansion.
+\*(``tc\*('' is the capability that
+tacks on another termcap entry to the end of the current one, to add
+on its capabilities.
+If a termcap entry does not use the \*(``tc\*(''
+capability, then of course the two lengths are the same.
+.PP
+The \*(``before tc expansion\*('' length is the most important one, because it
+affects more than just users of that particular terminal.
+This is the
+length of the entry as it exists in /etc/termcap, minus the
+backslash-newline pairs, which \fBtgetent\fP strips out while reading it.
+Some termcap libraries strip off the final newline, too (GNU termcap does not).
+Now suppose:
+.bP
+a termcap entry before expansion is more than 1023 bytes long,
+.bP
+and the application has only allocated a 1k buffer,
+.bP
+and the termcap library (like the one in BSD/OS 1.1 and GNU) reads
+the whole entry into the buffer, no matter what its length, to see
+if it is the entry it wants,
+.bP
+and \fBtgetent\fP is searching for a terminal type that either is the
+long entry, appears in the termcap file after the long entry, or
+does not appear in the file at all (so that \fBtgetent\fP has to search
+the whole termcap file).
+.PP
+Then \fBtgetent\fP will overwrite memory, perhaps its stack, and probably core dump
+the program.
+Programs like telnet are particularly vulnerable; modern telnets
+pass along values like the terminal type automatically.
+The results are almost
+as undesirable with a termcap library, like SunOS 4.1.3 and Ultrix 4.4, that
+prints warning messages when it reads an overly long termcap entry.
+If a
+termcap library truncates long entries, like OSF/1 3.0, it is immune to dying
+here but will return incorrect data for the terminal.
+.PP
+The \*(``after tc expansion\*('' length will have a similar effect to the
+above, but only for people who actually set TERM to that terminal
+type, since \fBtgetent\fP only does \*(``tc\*('' expansion once it is found the
+terminal type it was looking for, not while searching.
+.PP
+In summary, a termcap entry that is longer than 1023 bytes can cause,
+on various combinations of termcap libraries and applications, a core
+dump, warnings, or incorrect operation.
+If it is too long even before
+\*(``tc\*('' expansion, it will have this effect even for users of some other
+terminal types and users whose TERM variable does not have a termcap
+entry.
+.PP
+When in \-C (translate to termcap) mode, the \fBncurses\fP implementation of
+\fB@TIC@\fP(1M) issues warning messages when the pre-tc length of a termcap
+translation is too long.
+The \-c (check) option also checks resolved (after tc
+expansion) lengths.
+.SS Binary Compatibility
+It is not wise to count on portability of binary terminfo entries between
+commercial UNIX versions.
+The problem is that there are at least two versions
+of terminfo (under HP\-UX and AIX) which diverged from System V terminfo after
+SVr1, and have added extension capabilities to the string table that (in the
+binary format) collide with System V and XSI Curses extensions.
+.SH EXTENSIONS
+.PP
+Searching for terminal descriptions in
+\fB$HOME/.terminfo\fP and TERMINFO_DIRS
+is not supported by older implementations.
+.PP
+Some SVr4 \fBcurses\fP implementations, and all previous to SVr4, do not
+interpret the %A and %O operators in parameter strings.
+.PP
+SVr4/XPG4 do not specify whether \fBmsgr\fP licenses movement while in
+an alternate-character-set mode (such modes may, among other things, map
+CR and NL to characters that do not trigger local motions).
+The \fBncurses\fP implementation ignores \fBmsgr\fP in \fBALTCHARSET\fP
+mode.
+This raises the possibility that an XPG4
+implementation making the opposite interpretation may need terminfo
+entries made for \fBncurses\fP to have \fBmsgr\fP turned off.
+.PP
+The \fBncurses\fP library handles insert-character and insert-character modes
+in a slightly non-standard way to get better update efficiency.
+See
+the \fBInsert/Delete Character\fP subsection above.
+.PP
+The parameter substitutions for \fBset_clock\fP and \fBdisplay_clock\fP are
+not documented in SVr4 or the XSI Curses standard.
+They are deduced from the
+documentation for the AT&T 505 terminal.
+.PP
+Be careful assigning the \fBkmous\fP capability.
+The \fBncurses\fP library wants to interpret it as \fBKEY_MOUSE\fP,
+for use by terminals and emulators like xterm
+that can return mouse-tracking information in the keyboard-input stream.
+.PP
+X/Open Curses does not mention italics.
+Portable applications must assume that numeric capabilities are
+signed 16-bit values.
+This includes the \fIno_color_video\fP (ncv) capability.
+The 32768 mask value used for italics with ncv can be confused with
+an absent or cancelled ncv.
+If italics should work with colors,
+then the ncv value must be specified, even if it is zero.
+.PP
+Different commercial ports of terminfo and curses support different subsets of
+the XSI Curses standard and (in some cases) different extension sets.
+Here
+is a summary, accurate as of October 1995:
+.bP
+\fBSVR4, Solaris, ncurses\fP \-\-
+These support all SVr4 capabilities.
+.bP
+\fBSGI\fP \-\-
+Supports the SVr4 set, adds one undocumented extended string
+capability (\fBset_pglen\fP).
+.bP
+\fBSVr1, Ultrix\fP \-\-
+These support a restricted subset of terminfo capabilities.
+The booleans end with \fBxon_xoff\fP;
+the numerics with \fBwidth_status_line\fP;
+and the strings with \fBprtr_non\fP.
+.bP
+\fBHP/UX\fP \-\-
+Supports the SVr1 subset, plus the SVr[234] numerics \fBnum_labels\fP,
+\fBlabel_height\fP, \fBlabel_width\fP, plus function keys 11 through 63, plus
+\fBplab_norm\fP, \fBlabel_on\fP, and \fBlabel_off\fP, plus some incompatible
+extensions in the string table.
+.bP
+\fBAIX\fP \-\-
+Supports the SVr1 subset, plus function keys 11 through 63, plus a number
+of incompatible string table extensions.
+.bP
+\fBOSF\fP \-\-
+Supports both the SVr4 set and the AIX extensions.
+.SH FILES
+.TP 25
+\*d/?/*
+files containing terminal descriptions
+.SH SEE ALSO
+\fB@INFOCMP@\fP(1M),
+\fB@TABS@\fP(1),
+\fB@TIC@\fP(1M),
+\fBcurses\fP(3X),
+\fBcurs_color\fP(3X),
+\fBcurs_variables\fP(3X),
+\fBprintf\fP(3),
+\fBterm_variables\fP(3X).
+\fBterm\fP(\*n).
+\fBuser_caps\fP(5).
+.SH AUTHORS
+Zeyd M. Ben-Halim, Eric S. Raymond, Thomas E. Dickey.
+Based on \fIpcurses\fP by Pavel Curtis.
diff --git a/man/tic.1m b/man/tic.1m
new file mode 100644
index 0000000..17f576f
--- /dev/null
+++ b/man/tic.1m
@@ -0,0 +1,601 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2016,2017 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: tic.1m,v 1.84 2022/09/17 19:01:24 tom Exp $
+.TH @TIC@ 1M ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.ds n 5
+.ds d @TERMINFO@
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.SH NAME
+\fB@TIC@\fP \- the \fIterminfo\fP entry-description compiler
+.SH SYNOPSIS
+\fB@TIC@\fP
+[\fB\-\
+0\
+1\
+C\
+D\
+G\
+I\
+K\
+L\
+N\
+T\
+U\
+V\
+W\
+a\
+c\
+f\
+g\
+q\
+r\
+s\
+t\
+x\
+\fP]
+[\fB\-e\fP \fInames\fP]
+[\fB\-o\fP \fIdir\fP]
+[\fB\-Q\fP[\fIn\fP]]
+[\fB\-R\fP \fIsubset\fP]
+[\fB\-v\fP[\fIn\fP]]
+[\fB\-w\fP[\fIn\fP]]
+\fIfile\fP
+.br
+.SH DESCRIPTION
+The \fB@TIC@\fP command translates a \fBterminfo\fP file from source
+format into compiled format.
+The compiled format is necessary for use with
+the library routines in \fBncurses\fP(3X).
+.PP
+As described in \fBterm\fP(\*n), the database may be either a directory
+tree (one file per terminal entry) or a hashed database (one record per entry).
+The \fB@TIC@\fP command writes only one type of entry,
+depending on how it was built:
+.bP
+For directory trees, the top-level directory, e.g., /usr/share/terminfo,
+specifies the location of the database.
+.bP
+For hashed databases, a filename is needed.
+If the given file is not found by that name,
+but can be found by adding the suffix ".db",
+then that is used.
+.IP
+The default name for the hashed database is the same as the
+default directory name (only adding a ".db" suffix).
+.PP
+In either case (directory or hashed database),
+\fB@TIC@\fP will create the container if it does not exist.
+For a directory, this would be the \*(``terminfo\*('' leaf,
+versus a "terminfo.db" file.
+.PP
+The results are normally placed in the system terminfo database \fB\*d\fP.
+The compiled terminal description can be placed
+in a different terminfo database.
+There are two ways to achieve this:
+.bP
+First, you may override the system default either by
+using the \fB\-o\fP option,
+or by setting the variable \fBTERMINFO\fP
+in your shell environment to a valid database location.
+.bP
+Secondly, if \fB@TIC@\fP cannot write in \fI\*d\fP
+or the location specified using your TERMINFO variable,
+it looks for the directory \fI$HOME/.terminfo\fP
+(or hashed database \fI$HOME/.terminfo.db)\fP;
+if that location exists, the entry is placed there.
+.PP
+Libraries that read terminfo entries are expected to check in succession
+.bP
+a location specified with the TERMINFO environment variable,
+.bP
+\fI$HOME/.terminfo\fP,
+.bP
+directories listed in the TERMINFO_DIRS environment variable,
+.bP
+a compiled-in list of directories (@TERMINFO_DIRS@), and
+.bP
+the system terminfo database (\fI\*d\fP).
+.SS ALIASES
+.PP
+This is the same program as @INFOTOCAP@ and @CAPTOINFO@;
+usually those are linked to, or copied from this program:
+.bP
+When invoked as @INFOTOCAP@, @TIC@ sets the \fB\-I\fP option.
+.bP
+When invoked as @CAPTOINFO@, @TIC@ sets the \fB\-C\fP option.
+.SS OPTIONS
+.TP
+\fB\-0\fP
+restricts the output to a single line
+.TP
+\fB\-1\fP
+restricts the output to a single column
+.TP
+\fB\-a\fP
+tells \fB@TIC@\fP to retain commented-out capabilities rather than discarding
+them.
+Capabilities are commented by prefixing them with a period.
+This sets the \fB\-x\fP option, because it treats the commented-out
+entries as user-defined names.
+If the source is termcap, accept the 2-character names required by version 6.
+Otherwise these are ignored.
+.TP
+\fB\-C\fP
+Force source translation to termcap format.
+Note: this differs from the \fB\-C\fP
+option of \fB@INFOCMP@\fP(1M) in that it does not merely translate capability
+names, but also translates terminfo strings to termcap format.
+Capabilities
+that are not translatable are left in the entry under their terminfo names
+but commented out with two preceding dots.
+The actual format used incorporates some improvements for escaped characters
+from terminfo format.
+For a stricter BSD-compatible translation, add the \fB\-K\fP option.
+.IP
+If this is combined with \fB\-c\fP, \fB@TIC@\fP makes additional checks
+to report cases where the terminfo values do not have an exact equivalent
+in termcap form.
+For example:
+.RS
+.bP
+\fBsgr\fP usually will not convert, because termcap lacks the ability to
+work with more than two parameters, and because termcap lacks many of
+the arithmetic/logical operators used in terminfo.
+.bP
+capabilities with more than one delay or with delays before the end of
+the string will not convert completely.
+.RE
+.TP
+\fB\-c\fP
+tells \fB@TIC@\fP to only check \fIfile\fP for errors,
+including syntax problems and bad use-links.
+If you specify \fB\-C\fP (\fB\-I\fP) with this option, the code
+will print warnings about entries which, after use resolution, are more than
+1023 (4096) bytes long.
+Due to a fixed buffer length in older termcap libraries,
+as well as buggy checking for the buffer length
+(and a documented limit in terminfo),
+these entries may cause core
+dumps with other implementations.
+.IP
+\fB@TIC@\fP checks string capabilities to ensure that those with parameters
+will be valid expressions.
+It does this check only for the predefined string capabilities;
+those which are defined with the \fB\-x\fP option are ignored.
+.TP
+\fB\-D\fP
+tells \fB@TIC@\fP to print the database locations that it knows about, and exit.
+The first location shown is the one to which it would write compiled
+terminal descriptions.
+If \fB@TIC@\fP is not able to find a writable database location
+according to the rules summarized above,
+it will print a diagnostic and exit with an error rather than
+printing a list of database locations.
+.TP
+\fB\-e \fInames\fR
+Limit writes and translations to the following comma-separated list of
+terminals.
+If any name or alias of a terminal matches one of the names in
+the list, the entry will be written or translated as normal.
+Otherwise no output will be generated for it.
+The option value is interpreted as a file containing the list if it
+contains a '/'.
+(Note: depending on how @TIC@ was compiled,
+this option may require \fB\-I\fP or \fB\-C\fP.)
+.TP
+\fB\-f\fP
+Display complex terminfo strings which contain if/then/else/endif expressions
+indented for readability.
+.TP
+\fB\-G\fP
+Display constant literals in decimal form
+rather than their character equivalents.
+.TP
+\fB\-g\fP
+Display constant character literals in quoted form
+rather than their decimal equivalents.
+.TP
+\fB\-I\fP
+Force source translation to terminfo format.
+.TP
+\fB\-K\fP
+Suppress some longstanding ncurses extensions to termcap format,
+e.g., "\\s" for space.
+.TP
+\fB\-L\fP
+Force source translation to terminfo format
+using the long C variable names listed in <\fBterm.h\fP>
+.TP
+\fB\-N\fP
+Disable smart defaults.
+Normally, when translating from termcap to terminfo, the compiler makes
+a number of assumptions about the defaults of string capabilities
+\fBreset1_string\fP, \fBcarriage_return\fP, \fBcursor_left\fP,
+\fBcursor_down\fP, \fBscroll_forward\fP, \fBtab\fP, \fBnewline\fP,
+\fBkey_backspace\fP, \fBkey_left\fP, and \fBkey_down\fP, then attempts
+to use obsolete termcap capabilities to deduce correct values.
+It also
+normally suppresses output of obsolete termcap capabilities such as \fBbs\fP.
+This option forces a more literal translation that also preserves the
+obsolete capabilities.
+.TP
+\fB\-o\fIdir\fR
+Write compiled entries to given database location.
+Overrides the TERMINFO environment variable.
+.TP
+\fB\-Q\fIn\fR
+Rather than show source in terminfo (text) format,
+print the compiled (binary) format in hexadecimal or base64 form,
+depending on the option's value:
+.RS 8
+.TP 3
+1
+hexadecimal
+.TP 3
+2
+base64
+.TP 3
+3
+hexadecimal and base64
+.RE
+.TP
+\fB\-q\fP
+Suppress comments and blank lines when showing translated source.
+.TP
+\fB\-R\fIsubset\fR
+Restrict output to a given subset.
+This option is for use with archaic
+versions of terminfo like those on SVr1, Ultrix, or HP-UX that do not support
+the full set of SVR4/XSI Curses terminfo; and outright broken ports like AIX 3.x
+that have their own extensions incompatible with SVr4/XSI.
+Available subsets
+are \*(``SVr1\*('', \*(``Ultrix\*('', \*(``HP\*('', \*(``BSD\*('' and \*(``AIX\*('';
+see \fBterminfo\fP(\*n) for details.
+.TP
+\fB\-r\fP
+Force entry resolution (so there are no remaining tc capabilities) even
+when doing translation to termcap format.
+This may be needed if you are
+preparing a termcap file for a termcap library (such as GNU termcap through
+version 1.3 or BSD termcap through 4.3BSD) that does not handle multiple
+tc capabilities per entry.
+.TP
+\fB\-s\fP
+Summarize the compile by showing the database location into which entries
+are written, and the number of entries which are compiled.
+.TP
+\fB\-T\fP
+eliminates size-restrictions on the generated text.
+This is mainly useful for testing and analysis, since the compiled
+descriptions are limited (e.g., 1023 for termcap, 4096 for terminfo).
+.TP
+\fB\-t\fP
+tells \fB@TIC@\fP to discard commented-out capabilities.
+Normally when translating from terminfo to termcap,
+untranslatable capabilities are commented-out.
+.TP 5
+\fB\-U\fP
+tells \fB@TIC@\fP to not post-process the data after parsing the source file.
+Normally, it infers data which is commonly missing in older terminfo data,
+or in termcaps.
+.TP
+\fB\-V\fP
+reports the version of ncurses which was used in this program, and exits.
+.TP
+\fB\-v\fIn\fR
+specifies that (verbose) output be written to standard error trace
+information showing \fB@TIC@\fP's progress.
+.IP
+The optional parameter \fIn\fP is a number from 1 to 9, inclusive,
+indicating the desired level of detail of information.
+.RS
+.bP
+If ncurses is built without tracing support, the optional parameter is ignored.
+.bP
+If \fIn\fP is omitted, the default level is 1.
+.bP
+If \fIn\fP is specified and greater than 1, the level of
+detail is increased, and the output is written (with tracing information)
+to the \*(``trace\*('' file.
+.RE
+.RS
+.PP
+The debug flag levels are as follows:
+.TP 4
+1
+Names of files created and linked
+.TP
+2
+Information related to the \*(``use\*('' facility
+.TP
+3
+Statistics from the hashing algorithm
+.TP
+4
+Details of extended capabilities
+.TP
+5
+(unused)
+.TP
+6
+(unused)
+.TP
+7
+Entries into the string-table
+.TP
+8
+List of tokens encountered by scanner
+.TP
+9
+All values computed in construction of the hash table
+.RE
+.TP
+\fB\-W\fP
+By itself, the \fB\-w\fP option will not force long strings to be wrapped.
+Use the \fB\-W\fP option to do this.
+.IP
+If you specify both \fB\-f\fP and \fB\-W\fP options,
+the latter is ignored when \fB\-f\fP has already split the line.
+.TP
+\fB\-w\fIn\fR
+specifies the width of the output.
+The parameter is optional.
+If it is omitted, it defaults to 60.
+.TP
+\fB\-x\fP
+Treat unknown capabilities as user-defined (see \fBuser_caps(\*n)\fP).
+That is, if you supply a capability name which \fB@TIC@\fP does not recognize,
+it will infer its type (boolean, number or string) from the syntax and
+make an extended table entry for that.
+User-defined capability strings
+whose name begins with \*(``k\*('' are treated as function keys.
+.SS PARAMETERS
+.TP
+\fIfile\fP
+contains one or more \fBterminfo\fP terminal descriptions in source
+format [see \fBterminfo\fP(\*n)].
+Each description in the file
+describes the capabilities of a particular terminal.
+.IP
+If \fIfile\fP is \*(``-\*('', then the data is read from the standard input.
+The \fIfile\fP parameter may also be the path of a character-device.
+.SS PROCESSING
+.PP
+All but one of the capabilities recognized by \fB@TIC@\fP are documented
+in \fBterminfo\fP(\*n).
+The exception is the \fBuse\fP capability.
+.PP
+When a \fBuse\fP=\fIentry\fP\-\fIname\fP field is discovered in a
+terminal entry currently being compiled, \fB@TIC@\fP reads in the binary
+from \fB\*d\fP to complete the entry.
+(Entries created from
+\fIfile\fP will be used first.
+\fB@TIC@\fP duplicates the capabilities in
+\fIentry\fP\-\fIname\fP for the current entry, with the exception of
+those capabilities that explicitly are defined in the current entry.
+.PP
+When an entry, e.g., \fBentry_name_1\fP, contains a
+\fBuse=\fIentry\fR_\fIname\fR_\fI2\fR field, any canceled
+capabilities in \fIentry\fR_\fIname\fR_\fI2\fP must also appear in
+\fBentry_name_1\fP before \fBuse=\fP for these capabilities to be
+canceled in \fBentry_name_1\fP.
+.PP
+Total compiled entries cannot exceed 4096 bytes.
+The name field cannot
+exceed 512 bytes.
+Terminal names exceeding the maximum alias length
+(32 characters on systems with long filenames, 14 characters otherwise)
+will be truncated to the maximum alias length
+and a warning message will be printed.
+.SH HISTORY
+.PP
+System V Release 2 provided a \fBtic\fP utility.
+It accepted a single option: \fB\-v\fP (optionally followed by a number).
+According to Ross Ridge's comment in \fImytinfo\fP,
+this version of \fBtic\fP was
+unable to represent cancelled capabilities.
+.PP
+System V Release 3 provided a different \fBtic\fP utility,
+written by Pavel Curtis,
+(originally named \*(``compile\*('' in \fIpcurses\fP).
+This added an option \fB\-c\fP to check the file for
+errors, with the caveat that errors in \*(``use=\*('' links
+would not be reported.
+System V Release 3 documented a few warning messages which
+did not appear in \fIpcurses\fP.
+While the program itself was changed little as development
+continued with System V Release 4,
+the table of capabilities grew from 180 (\fIpcurses\fP) to 464 (Solaris).
+.PP
+In early development of ncurses (1993),
+Zeyd Ben-Halim used the table from \fImytinfo\fP to
+extend the \fIpcurses\fP table to 469 capabilities
+(456 matched SVr4, 8 were only in SVr4, 13 were not in SVr4).
+Of those 13, 11 were ultimately discarded
+(perhaps to match the draft of X/Open Curses).
+The exceptions were
+\fBmemory_lock_above\fP and
+\fBmemory_unlock\fP (see \fBuser_caps\fP(5)).
+.PP
+Eric Raymond incorporated parts of \fImytinfo\fP into ncurses
+to implement the termcap-to-terminfo source conversion,
+and extended that to begin development of
+the corresponding terminfo-to-termcap source conversion,
+Thomas Dickey completed that development over the course of several years.
+.PP
+In 1999, Thomas Dickey added the \fB\-x\fP option
+to support user-defined capabilities.
+.PP
+In 2010, Roy Marples provided a \fBtic\fP program
+and terminfo library for NetBSD.
+That implementation adapts several features from ncurses,
+including \fB@TIC@\fP's \fB\-x\fP option.
+.PP
+The \fB\-c\fP option tells \fB@TIC@\fP to check for problems in the
+terminfo source file.
+Continued development provides additional checks:
+.bP
+\fIpcurses\fP had 8 warnings
+.bP
+ncurses in 1996 had 16 warnings
+.bP
+Solaris (SVr4) curses has 28 warnings
+.bP
+NetBSD tic in 2019 has 19 warnings.
+.bP
+ncurses in 2019 has 96 warnings
+.PP
+The checking done in ncurses' \fB@TIC@\fP helps with the conversion to
+termcap, as well as pointing out errors and inconsistencies.
+It is also used to ensure consistency with the user-defined capabilities.
+There are 527 distinct capabilities in ncurses' terminal database;
+128 of those are user-defined.
+.SH PORTABILITY
+.PP
+X/Open Curses, Issue 7 (2009) provides a brief description of \fBtic\fP.
+It lists one option: \fB\-c\fP.
+The omission of \fB\-v\fP is unexpected.
+The change history states that the description is derived from True64 UNIX.
+According to its manual pages, that system also supported the \fB\-v\fP option.
+.PP
+Shortly after Issue 7 was released, Tru64 was discontinued.
+As of 2019, the surviving implementations of \fBtic\fP
+are SVr4 (AIX, HP-UX and Solaris),
+ncurses
+and NetBSD curses.
+The SVr4 \fBtic\fP programs all support the \fB\-v\fP option.
+The NetBSD \fBtic\fP program follows X/Open's documentation,
+omitting the \fB\-v\fP option.
+.PP
+The X/Open rationale states that some implementations of \fBtic\fP
+read terminal descriptions from the standard input if the \fIfile\fP
+parameter is omitted.
+None of these implementations do that.
+Further, it comments that some may choose to read from \*(''./terminfo.src\*(''
+but that is obsolescent behavior from SVr2,
+and is not (for example) a documented feature of SVr3.
+.SS COMPATIBILITY
+There is some evidence that historic \fB@TIC@\fP implementations treated
+description fields with no whitespace in them as additional aliases or
+short names.
+This \fB@TIC@\fP does not do that, but it does warn when
+description fields may be treated that way and check them for dangerous
+characters.
+.SS EXTENSIONS
+Unlike the SVr4 \fB@TIC@\fP command, this implementation can actually
+compile termcap sources.
+In fact, entries in terminfo and termcap syntax can
+be mixed in a single source file.
+See \fBterminfo\fP(\*n) for the list of
+termcap names taken to be equivalent to terminfo names.
+.PP
+The SVr4 manual pages are not clear on the resolution rules for \fBuse\fP
+capabilities.
+This implementation of \fB@TIC@\fP will find \fBuse\fP targets anywhere
+in the source file, or anywhere in the file tree rooted at \fBTERMINFO\fP (if
+\fBTERMINFO\fP is defined),
+or in the user's \fI$HOME/.terminfo\fP database
+(if it exists),
+or (finally) anywhere in the system's file tree of
+compiled entries.
+.PP
+The error messages from this \fB@TIC@\fP have the same format as GNU C
+error messages, and can be parsed by GNU Emacs's compile facility.
+.PP
+Aside from \fB\-c\fP and \fB\-v\fP, options are not portable:
+.bP
+Most of @TIC@'s options
+are not supported by SVr4 \fBtic\fP:
+.sp
+.RS
+\fB\-0\fP
+\fB\-1\fP
+\fB\-C\fP
+\fB\-G\fP
+\fB\-I\fP
+\fB\-N\fP
+\fB\-R\fP
+\fB\-T\fP
+\fB\-V\fP
+\fB\-a\fP
+\fB\-e\fP
+\fB\-f\fP
+\fB\-g\fP
+\fB\-o\fP
+\fB\-r\fP
+\fB\-s\fP
+\fB\-t\fP
+\fB\-x\fP
+.RE
+.bP
+The NetBSD \fBtic\fP  supports a few of the ncurses options
+.sp
+.RS
+\fB\-a\fP
+\fB\-o\fP
+\fB\-x\fP
+.RE
+.IP
+and adds \fB\-S\fP
+(a feature which does the same thing
+as @INFOCMP@'s \fB\-e\fP and \fB\-E\fP options).
+.PP
+The SVr4 \fB\-c\fP mode does not report bad \*(``use=\*('' links.
+.PP
+System V does not compile entries to or read entries from your
+\fI$HOME/.terminfo\fP database unless TERMINFO is explicitly set to it.
+.SH FILES
+.TP 5
+\fB\*d/?/*\fP
+Compiled terminal description database.
+.SH SEE ALSO
+\fB@CAPTOINFO@\fP(1M),
+\fB@INFOCMP@\fP(1M),
+\fB@INFOTOCAP@\fP(1M),
+\fB@TOE@\fP(1M),
+\fBcurses\fP(3X),
+\fBterm\fP(\*n).
+\fBterminfo\fP(\*n).
+\fBuser_caps\fP(\*n).
+.PP
+This describes \fBncurses\fP
+version @NCURSES_MAJOR@.@NCURSES_MINOR@ (patch @NCURSES_PATCH@).
+.SH AUTHOR
+Eric S. Raymond <esr@snark.thyrsus.com>
+and
+.br
+Thomas E. Dickey <dickey@invisible-island.net>
diff --git a/man/toe.1m b/man/toe.1m
new file mode 100644
index 0000000..d2c4eb7
--- /dev/null
+++ b/man/toe.1m
@@ -0,0 +1,194 @@
+.\"***************************************************************************
+.\" Copyright 2019-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2015,2017 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: toe.1m,v 1.36 2022/02/12 20:02:20 tom Exp $
+.TH @TOE@ 1M ""
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de NS
+.ie n  .sp
+.el    .sp .5
+.ie n  .in +4
+.el    .in +2
+.nf
+.ft C			\" Courier
+..
+.de NE
+.fi
+.ft R
+.ie n  .in -4
+.el    .in -2
+..
+.ds n 5
+.ds d @TERMINFO@
+.SH NAME
+\fB@TOE@\fP \- table of (terminfo) entries
+.SH SYNOPSIS
+\fB@TOE@\fP [\fB\-v\fP[\fIn\fP]] [\fB\-ahsuUV\fP] \fIfile...\fP
+.br
+.SH DESCRIPTION
+.PP
+With no options,
+\fB@TOE@\fP lists all available terminal types by primary name
+with descriptions.
+File arguments specify the directories to be scanned; if no
+such arguments are given,
+your default terminfo directory is scanned.
+If you also specify the \fB\-h\fP option,
+a directory header will be issued as each
+directory is entered.
+.PP
+There are other options intended for use by terminfo file maintainers:
+.TP
+\fB\-a\fP
+report on all of the terminal databases which ncurses would search,
+rather than only the first one that it finds.
+.IP
+If the \fB\-s\fP is also given, \fB@TOE@\fP
+adds a column to the report,
+showing (like \fBconflict\fP(1)) which entries which
+belong to a given terminal database.
+An "*" marks entries which differ, and "+" marks equivalent entries.
+.IP
+Without the \fB\-s\fP option, \fB@TOE@\fP does not attempt to merge
+duplicates in its report
+.TP
+\fB\-s\fP
+sort the output by the entry names.
+.TP
+\fB\-u\fP \fIfile\fP
+says to write a report to the standard output,
+listing dependencies in the given terminfo/termcap source file.
+The report condenses the \*(``use\*('' relation:
+each line consists of the primary name of a terminal that
+has use capabilities,
+followed by a colon,
+followed by the
+whitespace-separated primary names of all terminals which occur in those use
+capabilities,
+followed by a newline
+.TP
+\fB\-U\fP \fIfile\fP
+says to write a report to the standard output,
+listing reverse dependencies in the given terminfo/termcap source file.
+The report reverses the \*(``use\*('' relation:
+each line consists of the primary name of a
+terminal that occurs in use capabilities,
+followed by a colon,
+followed by the
+whitespace-separated primary names of all terminals which depend on it,
+followed by a newline.
+.TP
+\fB\-v\fIn\fR
+specifies that (verbose) output be written to standard error,
+showing \fB@TOE@\fP's progress.
+.IP
+The optional parameter \fIn\fP is a number from 1 to 10,
+interpreted as for \fB@TIC@\fP(1M).
+If ncurses is built without tracing support, the optional parameter is ignored.
+.TP
+\fB\-V\fP
+reports the version of ncurses which was used in this program,
+and exits.
+.SH EXAMPLES
+.PP
+Without sorting, the \fB\-a\fP option reports all of the names found
+in all of the terminal databases found by the \fBTERMINFO\fP and
+\fBTERMINFO_DIRS\fP environment variables:
+.NS
+MtxOrb162 	16x2 Matrix Orbital LCD display
+MtxOrb204 	20x4 Matrix Orbital LCD display
+MtxOrb    	Generic Matrix Orbital LCD display
+qvt101+   	qume qvt 101 PLUS product
+qvt119+-25	QVT 119 PLUS with 25 data lines
+qansi-g   	QNX ANSI
+qvt103    	qume qvt 103
+qnxw      	QNX4 windows
+qansi-w   	QNX ansi for windows
+qnxm      	QNX4 with mouse events
+qvt203-25-w	QVT 203 PLUS with 25 by 132 columns
+qansi-t   	QNX ansi without console writes
+\&.\ .\ .
+.NE
+.PP
+Use the \fB\-a\fP and \fB\-s\fP options together to show where each terminal
+description was found:
+.NS
+--> /usr/local/ncurses/share/terminfo
+----> /usr/share/terminfo
+*-+-:	9term     	Plan9 terminal emulator for X
+*---:	Eterm     	Eterm with xterm-style color support (X Window System)
+*-*-:	Eterm-256color	Eterm with xterm 256-colors
+*-*-:	Eterm-88color	Eterm with 88 colors
+*-+-:	MtxOrb    	Generic Matrix Orbital LCD display
+*-+-:	MtxOrb162 	16x2 Matrix Orbital LCD display
+*-+-:	MtxOrb204 	20x4 Matrix Orbital LCD display
+*-*-:	NCR260VT300WPP	NCR 2900_260 vt300 wide mode pc+  kybd
+*-+-:	aaa       	ann arbor ambassador/30 lines
+*-+-:	aaa+dec   	ann arbor ambassador in dec vt100 mode
+*-+-:	aaa+rv    	ann arbor ambassador in reverse video
+\&.\ .\ .
+.NE
+.SH FILES
+.TP 5
+\fB\*d/?/*\fP
+Compiled terminal description database.
+.SH HISTORY
+This utility is not provided by other implementations.
+There is no relevant X/Open or POSIX standard for \fB@TOE@\fP.
+.PP
+The program name refers to a developer's pun:
+.bP
+\fBtic\fP,
+.bP
+\fBtac\fP (now \fBtack\fP),
+.bP
+\fBtoe\fP.
+.PP
+It replaced a \fB\-T\fP option which was briefly supported by
+the ncurses \fBinfocmp\fP utility in 1995.
+.PP
+The \fB\-a\fP and \fB\-s\fP options were added to
+\fB@TOE@\fP several years later (2006 and 2011, respectively).
+.SH SEE ALSO
+\fB@CAPTOINFO@\fP(1M),
+\fB@INFOCMP@\fP(1M),
+\fB@INFOTOCAP@\fP(1M),
+\fB@TIC@\fP(1M),
+\fBcurses\fP(3X),
+\fBterminfo\fP(\*n).
+.PP
+This describes \fBncurses\fP
+version @NCURSES_MAJOR@.@NCURSES_MINOR@ (patch @NCURSES_PATCH@).
diff --git a/man/tput.1 b/man/tput.1
new file mode 100644
index 0000000..5d61230
--- /dev/null
+++ b/man/tput.1
@@ -0,0 +1,620 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2016,2017 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: tput.1,v 1.76 2022/02/12 20:02:20 tom Exp $
+.TH @TPUT@ 1 ""
+.ds d @TERMINFO@
+.ds n 1
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.SH NAME
+\fB@TPUT@\fP, \fBreset\fP \- initialize a terminal or query terminfo database
+.SH SYNOPSIS
+\fB@TPUT@\fR [\fB\-T\fItype\fR] \fIcapname\fR [\fIparameters\fR]
+.br
+\fB@TPUT@\fR [\fB\-T\fItype\fR] [\fB\-x\fR] \fBclear\fR
+.br
+\fB@TPUT@\fR [\fB\-T\fItype\fR] \fBinit\fR
+.br
+\fB@TPUT@\fR [\fB\-T\fItype\fR] \fBreset\fR
+.br
+\fB@TPUT@\fR [\fB\-T\fItype\fR] \fBlongname\fR
+.br
+\fB@TPUT@ \-S\fP  \fB<<\fP
+.br
+\fB@TPUT@ \-V\fP
+.br
+.SH DESCRIPTION
+The \fB@TPUT@\fP utility uses the \fBterminfo\fP database to make the
+values of terminal-dependent capabilities and information available to
+the shell (see \fBsh\fP(1)), to initialize or reset the terminal, or
+return the long name of the requested terminal type.
+The result depends upon the capability's type:
+.RS 3
+.TP 5
+string
+\fB@TPUT@\fP writes the string to the standard output.
+No trailing newline is supplied.
+.TP
+integer
+\fB@TPUT@\fP writes the decimal value to the standard output,
+with a trailing newline.
+.TP
+boolean
+\fB@TPUT@\fP simply sets the exit code
+(\fB0\fP for TRUE if the terminal has the capability,
+\fB1\fP for FALSE if it does not),
+and writes nothing to the standard output.
+.RE
+.PP
+Before using a value returned on the standard output,
+the application should test the exit code
+(e.g., \fB$?\fP, see \fBsh\fP(1)) to be sure it is \fB0\fP.
+(See the \fBEXIT CODES\fP and \fBDIAGNOSTICS\fP sections.)
+For a complete list of capabilities
+and the \fIcapname\fP associated with each, see \fBterminfo\fP(5).
+.SS Options
+.TP
+\fB\-S\fP
+allows more than one capability per invocation of \fB@TPUT@\fP.  The
+capabilities must be passed to \fB@TPUT@\fP from the standard input
+instead of from the command line (see example).
+Only one \fIcapname\fP is allowed per line.
+The \fB\-S\fP option changes the
+meaning of the \fB0\fP and \fB1\fP boolean and string exit codes (see the
+EXIT CODES section).
+.IP
+Because some capabilities may use
+\fIstring\fP parameters rather than \fInumbers\fP,
+\fB@TPUT@\fP uses a table and the presence of parameters in its input
+to decide whether to use \fBtparm\fP(3X),
+and how to interpret the parameters.
+.TP
+\fB\-T\fItype\fR
+indicates the \fItype\fP of terminal.
+Normally this option is
+unnecessary, because the default is taken from the environment
+variable \fBTERM\fP.
+If \fB\-T\fP is specified, then the shell
+variables \fBLINES\fP and \fBCOLUMNS\fP will also be ignored.
+.TP
+\fB\-V\fP
+reports the version of ncurses which was used in this program, and exits.
+.TP
+.B \-x
+do not attempt to clear the terminal's scrollback buffer
+using the extended \*(``E3\*('' capability.
+.SS Commands
+A few commands (\fBinit\fP, \fBreset\fP and \fBlongname\fP) are
+special; they are defined by the \fB@TPUT@\fP program.
+The others are the names of \fIcapabilities\fP from the terminal database
+(see \fBterminfo\fP(5) for a list).
+Although \fBinit\fP and \fBreset\fP resemble capability names,
+\fB@TPUT@\fP uses several capabilities to perform these special functions.
+.TP
+\fIcapname\fP
+indicates the capability from the terminal database.
+.IP
+If the capability is a string that takes parameters, the arguments
+following the capability will be used as parameters for the string.
+.IP
+Most parameters are numbers.
+Only a few terminal capabilities require string parameters;
+\fB@TPUT@\fP uses a table to decide which to pass as strings.
+Normally \fB@TPUT@\fP uses \fBtparm\fP(3X) to perform the substitution.
+If no parameters are given for the capability,
+\fB@TPUT@\fP writes the string without performing the substitution.
+.TP
+\fBinit\fP
+If the terminal database is present and an entry for the user's
+terminal exists (see \fB\-T\fItype\fR, above), the following will
+occur:
+.RS
+.TP 5
+(1)
+first, \fB@TPUT@\fP retrieves the current terminal mode settings
+for your terminal.
+It does this by successively testing
+.RS
+.bP
+the standard error,
+.bP
+standard output,
+.bP
+standard input and
+.bP
+ultimately \*(``/dev/tty\*(''
+.RE
+.IP
+to obtain terminal settings.
+Having retrieved these settings, \fB@TPUT@\fP remembers which
+file descriptor to use when updating settings.
+.TP
+(2)
+if the window size cannot be obtained from the operating system,
+but the terminal description (or environment, e.g., \fBLINES\fP
+and \fBCOLUMNS\fP variables specify this),
+update the operating system's notion of the window size.
+.TP
+(3)
+the terminal modes will be updated:
+.RS
+.bP
+any delays (e.g., newline) specified in the entry will
+be set in the tty driver,
+.bP
+tabs expansion will be turned on or off according to
+the specification in the entry, and
+.bP
+if tabs are not expanded,
+standard tabs will be set (every 8 spaces).
+.RE
+.TP
+(4)
+if present, the terminal's initialization strings will be
+output as detailed in the \fBterminfo\fP(5) section on
+.IR "Tabs and Initialization" ,
+.TP
+(5)
+output is flushed.
+.RE
+.IP
+If an entry does not
+contain the information needed for any of these activities,
+that activity will silently be skipped.
+.TP
+\fBreset\fP
+This is similar to \fBinit\fP, with two differences:
+.RS
+.TP 5
+(1)
+before any other initialization,
+the terminal modes will be reset to a \*(``sane\*('' state:
+.RS
+.bP
+set cooked and echo modes,
+.bP
+turn off cbreak and raw modes,
+.bP
+turn on newline translation and
+.bP
+reset any unset special characters to their default values
+.RE
+.TP 5
+(2)
+Instead of putting out \fIinitialization\fP strings, the terminal's
+\fIreset\fP strings will be output if present
+(\fBrs1\fP, \fBrs2\fP, \fBrs3\fP, \fBrf\fP).
+If the \fIreset\fP strings are not present, but \fIinitialization\fP
+strings are, the \fIinitialization\fP strings will be output.
+.RE
+.IP
+Otherwise, \fBreset\fP acts identically to \fBinit\fP.
+.TP
+\fBlongname\fP
+If the terminal database is present and an entry for the
+user's terminal exists (see \fB\-T\fItype\fR above), then the long name
+of the terminal will be put out.
+The long name is the last
+name in the first line of the terminal's description in the
+\fBterminfo\fP database [see \fBterm\fP(5)].
+.SS Aliases
+\fB@TPUT@\fP handles the \fBclear\fP, \fBinit\fP and \fBreset\fP
+commands specially:
+it allows for the possibility that it is invoked by a link with those names.
+.PP
+If \fB@TPUT@\fP is invoked by a link named \fBreset\fP, this has the
+same effect as \fB@TPUT@ reset\fP.
+The \fB@TSET@\fP(\*n) utility also treats a link named \fBreset\fP specially.
+.PP
+Before ncurses 6.1, the two utilities were different from each other:
+.bP
+\fB@TSET@\fP utility reset the terminal modes and special characters
+(not done with \fB@TPUT@\fP).
+.bP
+On the other hand, \fB@TSET@\fP's repertoire of terminal capabilities for
+resetting the terminal was more limited,
+i.e., only \fBreset_1string\fP, \fBreset_2string\fP and \fBreset_file\fP
+in contrast to the tab-stops and margins which are set by this utility.
+.bP
+The \fBreset\fP program is usually an alias for \fB@TSET@\fP,
+because of this difference with resetting terminal modes and special characters.
+.PP
+With the changes made for ncurses 6.1, the \fIreset\fP feature of the
+two programs is (mostly) the same.
+A few differences remain:
+.bP
+The \fB@TSET@\fP program waits one second when resetting,
+in case it happens to be a hardware terminal.
+.bP
+The two programs write the terminal initialization strings
+to different streams (i.e., the standard error for \fB@TSET@\fP and the
+standard output for \fB@TPUT@\fP).
+.IP
+\fBNote:\fP although these programs write to different streams,
+redirecting their output to a file will capture only part of their actions.
+The changes to the terminal modes are not affected by redirecting the output.
+.PP
+If \fB@TPUT@\fP is invoked by a link named \fBinit\fP, this has the
+same effect as \fB@TPUT@ init\fP.
+Again, you are less likely to use that link because another program
+named \fBinit\fP has a more well-established use.
+.SS Terminal Size
+.PP
+Besides the special commands (e.g., \fBclear\fP),
+@TPUT@ treats certain terminfo capabilities specially:
+\fBlines\fP and \fBcols\fP.
+@TPUT@ calls \fBsetupterm\fP(3X) to obtain the terminal size:
+.bP
+first, it gets the size from the terminal database
+(which generally is not provided for terminal emulators
+which do not have a fixed window size)
+.bP
+then it asks the operating system for the terminal's size
+(which generally works, unless connecting via a serial line which
+does not support \fINAWS\fP: negotiations about window size).
+.bP
+finally, it inspects the environment variables \fBLINES\fP and \fBCOLUMNS\fP
+which may override the terminal size.
+.PP
+If the \fB\-T\fP option is given
+@TPUT@ ignores the environment variables by calling \fBuse_tioctl(TRUE)\fP,
+relying upon the operating system (or finally, the terminal database).
+.SH EXAMPLES
+.TP 5
+\fB@TPUT@ init\fP
+Initialize the terminal according to the type of
+terminal in the environmental variable \fBTERM\fP.  This
+command should be included in everyone's .profile after
+the environmental variable \fBTERM\fP has been exported, as
+illustrated on the \fBprofile\fP(5) manual page.
+.TP 5
+\fB@TPUT@ \-T5620 reset\fP
+Reset an AT&T 5620 terminal, overriding the type of
+terminal in the environmental variable \fBTERM\fP.
+.TP 5
+\fB@TPUT@ cup 0 0\fP
+Send the sequence to move the cursor to row \fB0\fP, column \fB0\fP
+(the upper left corner of the screen, usually known as the \*(``home\*(''
+cursor position).
+.TP 5
+\fB@TPUT@ clear\fP
+Echo the clear-screen sequence for the current terminal.
+.TP 5
+\fB@TPUT@ cols\fP
+Print the number of columns for the current terminal.
+.TP 5
+\fB@TPUT@ \-T450 cols\fP
+Print the number of columns for the 450 terminal.
+.TP 5
+\fBbold=`@TPUT@ smso` offbold=`@TPUT@ rmso`\fP
+Set the shell variables \fBbold\fP, to begin stand-out mode
+sequence, and \fBoffbold\fP, to end standout mode sequence,
+for the current terminal.
+This might be followed by a
+prompt: \fBecho "${bold}Please type in your name: ${offbold}\\c"\fP
+.TP 5
+\fB@TPUT@ hc\fP
+Set exit code to indicate if the current terminal is a hard copy terminal.
+.TP 5
+\fB@TPUT@ cup 23 4\fP
+Send the sequence to move the cursor to row 23, column 4.
+.TP 5
+\fB@TPUT@ cup\fP
+Send the terminfo string for cursor-movement, with no parameters substituted.
+.TP 5
+\fB@TPUT@ longname\fP
+Print the long name from the \fBterminfo\fP database for the
+type of terminal specified in the environmental
+variable \fBTERM\fP.
+.PP
+.RS 5
+\fB@TPUT@ \-S <<!\fP
+.br
+\fB> clear\fP
+.br
+\fB> cup 10 10\fP
+.br
+\fB> bold\fP
+.br
+\fB> !\fP
+.RE
+.TP 5
+\&
+This example shows \fB@TPUT@\fP processing several capabilities
+in one invocation.
+It clears the screen,
+moves the cursor to position 10, 10
+and turns on bold (extra bright) mode.
+The list is terminated by an exclamation mark (\fB!\fP) on a line by itself.
+.SH FILES
+.TP
+\fB\*d\fP
+compiled terminal description database
+.TP
+\fB@DATADIR@/tabset/*\fP
+tab settings for some terminals, in a format
+appropriate to be output to the terminal (escape
+sequences that set margins and tabs); for more
+information, see the
+.IR "Tabs and Initialization" ,
+section of \fBterminfo\fP(5)
+.SH EXIT CODES
+If the \fB\-S\fP option is used,
+\fB@TPUT@\fP checks for errors from each line,
+and if any errors are found, will set the exit code to 4 plus the
+number of lines with errors.
+If no errors are found, the exit code is \fB0\fP.
+No indication of which line failed can be given so
+exit code \fB1\fP will never appear.
+Exit codes \fB2\fP, \fB3\fP, and
+\fB4\fP retain their usual interpretation.
+If the \fB\-S\fP option is not used,
+the exit code depends on the type of \fIcapname\fP:
+.RS 3
+.TP
+.I boolean
+a value of \fB0\fP is set for TRUE and \fB1\fP for FALSE.
+.TP
+.I string
+a value of \fB0\fP is set if the
+\fIcapname\fP is defined for this terminal \fItype\fP (the value of
+\fIcapname\fP is returned on standard output);
+a value of \fB1\fP is set if \fIcapname\fP
+is not defined for this terminal \fItype\fP
+(nothing is written to standard output).
+.TP
+.I integer
+a value of \fB0\fP is always set,
+whether or not \fIcapname\fP is defined for this terminal \fItype\fP.
+To determine if \fIcapname\fP is defined for this terminal \fItype\fP,
+the user must test the value written to standard output.
+A value of \fB\-1\fP
+means that \fIcapname\fP is not defined for this terminal \fItype\fP.
+.TP
+.I other
+\fBreset\fP or \fBinit\fP may fail to find their respective files.
+In that case, the exit code is set to 4 + \fBerrno\fP.
+.RE
+.PP
+Any other exit code indicates an error; see the DIAGNOSTICS section.
+.SH DIAGNOSTICS
+\fB@TPUT@\fP prints the following error messages and sets the corresponding exit
+codes.
+.PP
+.ne 15
+.TS
+l l.
+exit code	error message
+=
+\fB0\fP	T{
+(\fIcapname\fP is a numeric variable that is not specified in the
+\fBterminfo\fP(5) database for this terminal type, e.g.
+\fB@TPUT@ \-T450 lines\fP and \fB@TPUT@ \-Thp2621 xmc\fP)
+T}
+\fB1\fP	no error message is printed, see the \fBEXIT CODES\fP section.
+\fB2\fP	usage error
+\fB3\fP	unknown terminal \fItype\fP or no \fBterminfo\fP database
+\fB4\fP	unknown \fBterminfo\fP capability \fIcapname\fP
+\fB>4\fP	error occurred in \-S
+=
+.TE
+.SH HISTORY
+The \fBtput\fP command was begun by Bill Joy in 1980.
+The initial version only cleared the screen.
+.PP
+AT&T System V provided a different \fBtput\fP command:
+.bP
+SVr2 provided a rudimentary \fBtput\fP
+which checked the parameter against each
+predefined capability and returned the corresponding value.
+This version of \fBtput\fP did not use \fBtparm\fP(3X) for
+the capabilities which are parameterized.
+.bP
+SVr3 replaced that, a year later, by a more extensive program
+whose \fBinit\fP and \fBreset\fP subcommands
+(more than half the program) were incorporated from
+the \fBreset\fP feature of BSD \fBtset\fP written by Eric Allman.
+.bP
+SVr4 added color initialization using the \fBorig_colors\fP and
+\fBorig_pair\fP capabilities in the \fBinit\fP subcommand.
+.PP
+Keith Bostic replaced the BSD \fBtput\fP command in 1989
+with a new implementation
+based on the AT&T System V program \fBtput\fP.
+Like the AT&T program, Bostic's version
+accepted some parameters named for \fIterminfo\fP capabilities
+(\fBclear\fP, \fBinit\fP, \fBlongname\fP and \fBreset\fP).
+However (because he had only \fItermcap\fP available),
+it accepted \fItermcap\fP names for other capabilities.
+Also, Bostic's BSD \fBtput\fP did not modify the terminal I/O modes
+as the earlier BSD \fBtset\fP had done.
+.PP
+At the same time, Bostic added a shell script named \*(``clear\*('',
+which used \fBtput\fP to clear the screen.
+.PP
+Both of these appeared in 4.4BSD,
+becoming the \*(``modern\*('' BSD implementation of \fBtput\fP.
+.PP
+This implementation of \fBtput\fP began from a different source than
+AT&T or BSD: Ross Ridge's \fImytinfo\fP package, published on
+\fIcomp.sources.unix\fP in December 1992.
+Ridge's program made more sophisticated use of the terminal capabilities
+than the BSD program.
+Eric Raymond used that \fBtput\fP program
+(and other parts of \fImytinfo\fP) in ncurses in June 1995.
+Using the portions dealing with terminal capabilities
+almost without change,
+Raymond made improvements to the way the command-line parameters
+were handled.
+.SH PORTABILITY
+.PP
+This implementation of \fBtput\fP differs from AT&T \fBtput\fP in
+two important areas:
+.bP
+\fB@TPUT@\fP \fIcapname\fP writes to the standard output.
+That need not be a regular terminal.
+However, the subcommands which manipulate terminal modes
+may not use the standard output.
+.IP
+The AT&T implementation's \fBinit\fP and \fBreset\fP commands
+use the BSD (4.1c) \fBtset\fP source, which manipulates terminal modes.
+It successively tries standard output, standard error, standard input
+before falling back to \*(``/dev/tty\*('' and finally just assumes
+a 1200Bd terminal.
+When updating terminal modes, it ignores errors.
+.IP
+Until changes made after ncurses 6.0,
+\fB@TPUT@\fP did not modify terminal modes.
+\fB@TPUT@\fP now uses a similar scheme,
+using functions shared with \fB@TSET@\fP
+(and ultimately based on the 4.4BSD \fBtset\fP).
+If it is not able to open a terminal, e.g., when running in \fBcron\fP(1),
+\fB@TPUT@\fP will return an error.
+.bP
+AT&T \fBtput\fP guesses the type of its \fIcapname\fP operands by seeing if
+all of the characters are numeric, or not.
+.IP
+Most implementations which provide support for \fIcapname\fP operands
+use the \fBtparm\fP function to expand parameters in it.
+That function expects a mixture of numeric and string parameters,
+requiring \fB@TPUT@\fP to know which type to use.
+.IP
+This implementation uses a table to determine the parameter types for
+the standard \fIcapname\fP operands, and an internal library
+function to analyze nonstandard \fIcapname\fP operands.
+.IP
+Besides providing more reliable operation than AT&T's utility,
+a portability problem is introduced by this analysis:
+An OpenBSD developer adapted the internal library function from ncurses
+to port NetBSD's termcap-based \fBtput\fP to terminfo.
+That had been modified to interpret multiple commands on a line.
+Portable applications should not rely upon this feature;
+ncurses provides it to support applications written
+specifically for OpenBSD.
+.PP
+This implementation (unlike others) can accept both \fItermcap\fP
+and \fIterminfo\fP names for the \fIcapname\fP feature,
+if
+\fItermcap\fP support is compiled in.
+However, the predefined \fItermcap\fP and \fIterminfo\fP names have two
+ambiguities in this case (and the \fIterminfo\fP name is assumed):
+.bP
+The \fItermcap\fP name \fBdl\fP corresponds to
+the \fIterminfo\fP name \fBdl1\fP (delete one line).
+.br
+The \fIterminfo\fP name \fBdl\fP corresponds to
+the \fItermcap\fP name \fBDL\fP (delete a given number of lines).
+.bP
+The \fItermcap\fP name \fBed\fP corresponds to
+the \fIterminfo\fP name \fBrmdc\fP (end delete mode).
+.br
+The \fIterminfo\fP name \fBed\fP corresponds to
+the \fItermcap\fP name \fBcd\fP (clear to end of screen).
+.PP
+The \fBlongname\fP and \fB\-S\fP options, and the parameter-substitution
+features used in the \fBcup\fP example,
+were not supported in BSD curses before 4.3reno (1989) or in
+AT&T/USL curses before SVr4 (1988).
+.PP
+IEEE Std 1003.1/The Open Group  Base Specifications Issue 7 (POSIX.1-2008)
+documents only the operands for \fBclear\fP, \fBinit\fP and \fBreset\fP.
+There are a few interesting observations to make regarding that:
+.bP
+In this implementation, \fBclear\fP is part of the \fIcapname\fP support.
+The others (\fBinit\fP and \fBlongname\fP) do not correspond to terminal
+capabilities.
+.bP
+Other implementations of \fBtput\fP on
+SVr4-based systems such as Solaris, IRIX64 and HPUX
+as well as others such as AIX and Tru64
+provide support for \fIcapname\fP operands.
+.bP
+A few platforms such as FreeBSD recognize termcap names rather
+than terminfo capability names in their respective \fBtput\fP commands.
+Since 2010, NetBSD's \fBtput\fP uses terminfo names.
+Before that, it (like FreeBSD) recognized termcap names.
+.IP
+Beginning in 2021, FreeBSD uses the ncurses \fBtput\fP,
+configured for both terminfo (tested first) and termcap (as a fallback).
+.PP
+Because (apparently) \fIall\fP of the certified Unix systems
+support the full set of capability names, the reasoning for documenting
+only a few may not be apparent.
+.bP
+X/Open Curses Issue 7 documents \fBtput\fP differently, with \fIcapname\fP
+and the other features used in this implementation.
+.bP
+That is, there are two standards for \fBtput\fP:
+POSIX (a subset) and X/Open Curses (the full implementation).
+POSIX documents a subset to avoid the complication of including X/Open Curses
+and the terminal capabilities database.
+.bP
+While it is certainly possible to write a \fBtput\fP program
+without using curses,
+none of the systems which have a curses implementation provide
+a \fBtput\fP utility which does not provide the \fIcapname\fP feature.
+.PP
+X/Open Curses Issue 7 (2009) is the first version to document utilities.
+However that part of X/Open Curses does not follow existing practice
+(i.e., Unix features documented in SVID 3):
+.bP
+It assigns exit code 4 to \*(``invalid operand\*('',
+which may be the same as \fIunknown capability\fP.
+For instance, the source code for Solaris' xcurses uses the term
+\*(``invalid\*('' in this case.
+.bP
+It assigns exit code 255 to a numeric variable that is not specified in
+the terminfo database.
+That likely is a documentation error,
+confusing the \fB\-1\fP written to the standard output for an absent
+or cancelled numeric value versus an (unsigned) exit code.
+.PP
+The various Unix systems (AIX, HPUX, Solaris) use the same exit-codes
+as ncurses.
+.PP
+NetBSD curses documents different exit codes which do not correspond
+to either ncurses or X/Open.
+.SH SEE ALSO
+\fB@CLEAR@\fP(\*n),
+\fBstty\fP(1),
+\fB@TABS@\fP(\*n),
+\fB@TSET@\fP(\*n),
+\fBcurs_termcap\fP(3X),
+\fBterminfo\fP(5).
+.PP
+This describes \fBncurses\fP
+version @NCURSES_MAJOR@.@NCURSES_MINOR@ (patch @NCURSES_PATCH@).
diff --git a/man/tset.1 b/man/tset.1
new file mode 100644
index 0000000..860c087
--- /dev/null
+++ b/man/tset.1
@@ -0,0 +1,438 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2016,2017 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: tset.1,v 1.62 2022/02/12 20:02:20 tom Exp $
+.TH @TSET@ 1 ""
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.SH NAME
+\fB@TSET@\fP, \fB@RESET@\fP \- terminal initialization
+.SH SYNOPSIS
+\fB@TSET@\fP [\fB\-IQVcqrsw\fP] [\fB\-\fP] [\fB\-e\fP \fIch\fP] [\fB\-i\fP \fIch\fP] [\fB\-k\fP \fIch\fP] [\fB\-m\fP \fImapping\fP] [\fIterminal\fP]
+.br
+\fB@RESET@\fP [\fB\-IQVcqrsw\fP] [\fB\-\fP] [\fB\-e\fP \fIch\fP] [\fB\-i\fP \fIch\fP] [\fB\-k\fP \fIch\fP] [\fB\-m\fP \fImapping\fP] [\fIterminal\fP]
+.SH DESCRIPTION
+.SS tset - initialization
+This program initializes terminals.
+.PP
+First, \fB@TSET@\fP retrieves the current terminal mode settings
+for your terminal.
+It does this by successively testing
+.bP
+the standard error,
+.bP
+standard output,
+.bP
+standard input and
+.bP
+ultimately \*(``/dev/tty\*(''
+.PP
+to obtain terminal settings.
+Having retrieved these settings, \fB@TSET@\fP remembers which
+file descriptor to use when updating settings.
+.PP
+Next, \fB@TSET@\fP determines the type of terminal that you are using.
+This determination is done as follows, using the first terminal type found.
+.PP
+1. The \fBterminal\fP argument specified on the command line.
+.PP
+2. The value of the \fBTERM\fP environmental variable.
+.PP
+3. (BSD systems only.) The terminal type associated with the standard
+error output device in the \fI/etc/ttys\fP file.
+(On System\-V-like UNIXes and systems using that convention,
+\fBgetty\fP(1) does this job by setting
+\fBTERM\fP according to the type passed to it by \fI/etc/inittab\fP.)
+.PP
+4. The default terminal type, \*(``unknown\*(''.
+.PP
+If the terminal type was not specified on the command-line, the \fB\-m\fP
+option mappings are then applied (see the section
+.B TERMINAL TYPE MAPPING
+for more information).
+Then, if the terminal type begins with a question mark (\*(``?\*(''), the
+user is prompted for confirmation of the terminal type.
+An empty
+response confirms the type, or, another type can be entered to specify
+a new type.
+Once the terminal type has been determined,
+the terminal description for the terminal is retrieved.
+If no terminal description is found
+for the type, the user is prompted for another terminal type.
+.PP
+Once the terminal description is retrieved,
+.bP
+if the \*(``\fB\-w\fP\*('' option is enabled, \fB@TSET@\fP may update
+the terminal's window size.
+.IP
+If the window size cannot be obtained from the operating system,
+but the terminal description (or environment, e.g., \fBLINES\fP
+and \fBCOLUMNS\fP variables specify this),
+use this to set the operating system's notion of the window size.
+.bP
+if the \*(``\fB\-c\fP\*('' option is enabled,
+the backspace, interrupt and line kill characters
+(among many other things) are set
+.bP
+unless the \*(``\fB\-I\fP\*('' option is enabled,
+the terminal
+and tab \fIinitialization\fP strings are sent to the standard error output,
+and \fB@TSET@\fP waits one second (in case a hardware reset was issued).
+.bP
+Finally, if the erase, interrupt and line kill characters have changed,
+or are not set to their default values, their values are displayed to the
+standard error output.
+.SS reset - reinitialization
+.PP
+When invoked as \fB@RESET@\fP, \fB@TSET@\fP sets the terminal
+modes to \*(``sane\*('' values:
+.bP
+sets cooked and echo modes,
+.bP
+turns off cbreak and raw modes,
+.bP
+turns on newline translation and
+.bP
+resets any unset special characters to their default values
+.PP
+before
+doing the terminal initialization described above.
+Also, rather than using the terminal \fIinitialization\fP strings,
+it uses the terminal \fIreset\fP strings.
+.PP
+The \fB@RESET@\fP command is useful
+after a program dies leaving a terminal in an abnormal state:
+.bP
+you may have to type
+.sp
+    \fI<LF>\fB@RESET@\fI<LF>\fR
+.sp
+(the line-feed character is normally control-J) to get the terminal
+to work, as carriage-return may no longer work in the abnormal state.
+.bP
+Also, the terminal will often not echo the command.
+.SH OPTIONS
+.PP
+The options are as follows:
+.TP 5
+.B \-c
+Set control characters and modes.
+.TP 5
+.BI \-e\  ch
+Set the erase character to \fIch\fP.
+.TP
+.B \-I
+Do not send the terminal or tab initialization strings to the terminal.
+.TP
+.BI \-i\  ch
+Set the interrupt character to \fIch\fP.
+.TP
+.BI \-k\  ch
+Set the line kill character to \fIch\fP.
+.TP
+.BI \-m\  mapping
+Specify a mapping from a port type to a terminal.
+See the section
+.B TERMINAL TYPE MAPPING
+for more information.
+.TP
+.B \-Q
+Do not display any values for the erase, interrupt and line kill characters.
+Normally \fB@TSET@\fP displays the values for control characters which
+differ from the system's default values.
+.TP
+.B \-q
+The terminal type is displayed to the standard output, and the terminal is
+not initialized in any way.
+The option \*(``\-\*('' by itself is equivalent but archaic.
+.TP
+.B \-r
+Print the terminal type to the standard error output.
+.TP
+.B \-s
+Print the sequence of shell commands to initialize the environment variable
+\fBTERM\fP to the standard output.
+See the section
+.B SETTING THE ENVIRONMENT
+for details.
+.TP
+.B \-V
+reports the version of ncurses which was used in this program, and exits.
+.TP
+.B \-w
+Resize the window to match the size deduced via \fBsetupterm\fP(3X).
+Normally this has no effect,
+unless \fBsetupterm\fP is not able to detect the window size.
+.PP
+The arguments for the \fB\-e\fP, \fB\-i\fP, and \fB\-k\fP
+options may either be entered as actual characters
+or by using the \*(``hat\*(''
+notation, i.e., control-h may be specified as \*(``^H\*('' or \*(``^h\*(''.
+.PP
+If neither \fB\-c\fP or \fB\-w\fP is given, both options are assumed.
+.
+.SH SETTING THE ENVIRONMENT
+It is often desirable to enter the terminal type and information about
+the terminal's capabilities into the shell's environment.
+This is done using the \fB\-s\fP option.
+.PP
+When the \fB\-s\fP option is specified, the commands to enter the information
+into the shell's environment are written to the standard output.
+If
+the \fBSHELL\fP environmental variable ends in \*(``csh\*('', the commands
+are for \fBcsh\fP, otherwise, they are for \fBsh\fP(1).
+Note, the \fBcsh\fP commands set and unset the shell variable
+\fBnoglob\fP, leaving it unset.
+The following line in the \fB.login\fP
+or \fB.profile\fP files will initialize the environment correctly:
+.sp
+    eval \`@TSET@ \-s options ... \`
+.
+.SH TERMINAL TYPE MAPPING
+When the terminal is not hardwired into the system (or the current
+system information is incorrect) the terminal type derived from the
+\fI/etc/ttys\fP file or the \fBTERM\fP environmental variable is often
+something generic like \fBnetwork\fP, \fBdialup\fP, or \fBunknown\fP.
+When \fB@TSET@\fP is used in a startup script it is often desirable to
+provide information about the type of terminal used on such ports.
+.PP
+The \fB\-m\fP options maps
+from some set of conditions to a terminal type, that is, to
+tell \fB@TSET@\fP
+\*(``If I'm on this port at a particular speed,
+guess that I'm on that kind of terminal\*(''.
+.PP
+The argument to the \fB\-m\fP option consists of an optional port type, an
+optional operator, an optional baud rate specification, an optional
+colon (\*(``:\*('') character and a terminal type.
+The port type is a
+string (delimited by either the operator or the colon character).
+The operator may be any combination of
+\*(``>\*('',
+\*(``<\*('',
+\*(``@\*('',
+and \*(``!\*('';
+\*(``>\*('' means greater than,
+\*(``<\*('' means less than,
+\*(``@\*('' means equal to and
+\*(``!\*('' inverts the sense of the test.
+The baud rate is specified as a number and is compared with the speed
+of the standard error output (which should be the control terminal).
+The terminal type is a string.
+.PP
+If the terminal type is not specified on the command line, the \fB\-m\fP
+mappings are applied to the terminal type.
+If the port type and baud
+rate match the mapping, the terminal type specified in the mapping
+replaces the current type.
+If more than one mapping is specified, the
+first applicable mapping is used.
+.PP
+For example, consider the following mapping: \fBdialup>9600:vt100\fP.
+The port type is dialup , the operator is >, the baud rate
+specification is 9600, and the terminal type is vt100.
+The result of
+this mapping is to specify that if the terminal type is \fBdialup\fP,
+and the baud rate is greater than 9600 baud, a terminal type of
+\fBvt100\fP will be used.
+.PP
+If no baud rate is specified, the terminal type will match any baud rate.
+If no port type is specified, the terminal type will match any port type.
+For example, \fB\-m dialup:vt100 \-m :?xterm\fP
+will cause any dialup port, regardless of baud rate, to match the terminal
+type vt100, and any non-dialup port type to match the terminal type ?xterm.
+Note, because of the leading question mark, the user will be
+queried on a default port as to whether they are actually using an xterm
+terminal.
+.PP
+No whitespace characters are permitted in the \fB\-m\fP option argument.
+Also, to avoid problems with meta-characters, it is suggested that the
+entire \fB\-m\fP option argument be placed within single quote characters,
+and that \fBcsh\fP users insert a backslash character (\*(``\e\*('') before
+any exclamation marks (\*(``!\*('').
+.SH HISTORY
+.PP
+A \fBreset\fP command appeared in 1BSD (March 1978), written by Kurt Shoens.
+This program set the \fIerase\fP and \fIkill\fP characters
+to \fB^H\fP (backspace) and \fB@\fP respectively.
+Mark Horton improved that in 3BSD (October 1979), adding
+\fIintr\fP, \fIquit\fP, \fIstart\fP/\fIstop\fP and \fIeof\fP characters
+as well as changing the program to avoid modifying any user settings.
+That version of \fBreset\fP did not use the termcap database.
+.PP
+A separate \fBtset\fP command was provided in 1BSD by Eric Allman,
+using the termcap database.
+Allman's comments in the source code indicate
+that he began work in October 1977,
+continuing development over the next few years.
+.PP
+According to comments in the source code,
+the \fBtset\fP program was modified in September 1980,
+to use logic copied from the 3BSD \*(``reset\*(''
+when it was invoked as \fBreset\fP.
+This version appeared in 4.1cBSD, late in 1982.
+.PP
+Other developers (e.g., Keith Bostic and Jim Bloom)
+continued to modify \fBtset\fP until 4.4BSD was released in 1993.
+.PP
+The \fBncurses\fP implementation
+was lightly adapted from the 4.4BSD sources for a terminfo environment by Eric
+S. Raymond <esr@snark.thyrsus.com>.
+.SH COMPATIBILITY
+.PP
+Neither IEEE Std 1003.1/The Open Group Base Specifications Issue 7
+(POSIX.1-2008) nor
+X/Open Curses Issue 7 documents \fB@TSET@\fP or \fB@RESET@\fP.
+.PP
+The AT&T \fBtput\fP utility (AIX, HPUX, Solaris)
+incorporated the terminal-mode manipulation as well as termcap-based features
+such as resetting tabstops from \fBtset\fP in BSD (4.1c),
+presumably with the intention of making \fBtset\fP obsolete.
+However, each of those systems still provides \fBtset\fP.
+In fact, the commonly-used \fBreset\fP utility
+is always an alias for \fBtset\fP.
+.PP
+The \fB@TSET@\fP utility provides for backward-compatibility with BSD
+environments (under most modern UNIXes, \fB/etc/inittab\fP and \fBgetty\fP(1)
+can set \fBTERM\fP appropriately for each dial-up line; this obviates what was
+\fB@TSET@\fP's most important use).
+This implementation behaves like 4.4BSD
+\fBtset\fP, with a few exceptions specified here.
+.PP
+A few options are different
+because the \fBTERMCAP\fP variable
+is no longer supported under terminfo-based \fBncurses\fP:
+.bP
+The \fB\-S\fP option of BSD \fBtset\fP no longer works;
+it prints an error message to the standard error and dies.
+.bP
+The \fB\-s\fP option only sets \fBTERM\fP, not \fBTERMCAP\fP.
+.PP
+There was an undocumented 4.4BSD feature
+that invoking \fBtset\fP via a link named
+\*(``TSET\*('' (or via any other name beginning with an upper-case letter)
+set the terminal to use upper-case only.
+This feature has been omitted.
+.PP
+The \fB\-A\fP, \fB\-E\fP, \fB\-h\fP, \fB\-u\fP and \fB\-v\fP
+options were deleted from the \fB@TSET@\fP
+utility in 4.4BSD.
+None of them were documented in 4.3BSD and all are
+of limited utility at best.
+The \fB\-a\fP, \fB\-d\fP, and \fB\-p\fP options are similarly
+not documented or useful, but were retained as they appear to be in
+widespread use.
+It is strongly recommended that any usage of these
+three options be changed to use the \fB\-m\fP option instead.
+The \fB\-a\fP, \fB\-d\fP, and \fB\-p\fP options
+are therefore omitted from the usage summary above.
+.PP
+Very old systems, e.g., 3BSD, used a different terminal driver which
+was replaced in 4BSD in the early 1980s.
+To accommodate these older systems, the 4BSD \fB@TSET@\fP provided a
+\fB\-n\fP option to specify that the new terminal driver should be used.
+This implementation does not provide that choice.
+.PP
+It is still permissible to specify the \fB\-e\fP, \fB\-i\fP,
+and \fB\-k\fP options without arguments,
+although it is strongly recommended that such usage be fixed to
+explicitly specify the character.
+.PP
+As of 4.4BSD,
+executing \fB@TSET@\fP as \fB@RESET@\fP no longer implies the \fB\-Q\fP option.
+Also, the interaction between the \- option and the \fIterminal\fP
+argument in some historic implementations of \fB@TSET@\fP has been removed.
+.PP
+The \fB\-c\fP and \fB\-w\fP options are not found in earlier implementations.
+However, a different window size-change feature was provided in 4.4BSD.
+.bP
+In 4.4BSD, \fBtset\fP uses the window size from the termcap description
+to set the window size if \fBtset\fP is not able to obtain the window
+size from the operating system.
+.bP
+In ncurses, \fB@TSET@\fP obtains the window size using
+\fBsetupterm\fP, which may be from
+the operating system,
+the \fBLINES\fP and \fBCOLUMNS\fP environment variables or
+the terminal description.
+.PP
+Obtaining the window size from the terminal description is common to
+both implementations, but considered obsolescent.
+Its only practical use is for hardware terminals.
+Generally speaking, a window size would be unset only if there were
+some problem obtaining the value from the operating system
+(and \fBsetupterm\fP would still fail).
+For that reason, the \fBLINES\fP and \fBCOLUMNS\fP environment variables
+may be useful for working around window-size problems.
+Those have the drawback that if the window is resized,
+those variables must be recomputed and reassigned.
+To do this more easily, use the \fBresize\fP(1) program.
+.SH ENVIRONMENT
+The \fB@TSET@\fP command uses these environment variables:
+.TP 5
+SHELL
+tells \fB@TSET@\fP whether to initialize \fBTERM\fP using \fBsh\fP(1) or
+\fBcsh\fP(1) syntax.
+.TP 5
+TERM
+Denotes your terminal type.
+Each terminal type is distinct, though many are similar.
+.TP 5
+TERMCAP
+may denote the location of a termcap database.
+If it is not an absolute pathname, e.g., begins with a \*(``/\*('',
+\fB@TSET@\fP removes the variable from the environment before looking
+for the terminal description.
+.SH FILES
+.TP 5
+/etc/ttys
+system port name to terminal type mapping database (BSD versions only).
+.TP
+@TERMINFO@
+terminal capability database
+.SH SEE ALSO
+.hy 0
+\fBcsh\fP(1),
+\fBsh\fP(1),
+\fBstty\fP(1),
+\fBcurs_terminfo\fP(3X),
+\fBtty\fP(4),
+\fBterminfo\fP(5),
+\fBttys\fP(5),
+\fBenviron\fP(7)
+.hy
+.PP
+This describes \fBncurses\fP
+version @NCURSES_MAJOR@.@NCURSES_MINOR@ (patch @NCURSES_PATCH@).
diff --git a/man/user_caps.5 b/man/user_caps.5
new file mode 100644
index 0000000..b43e218
--- /dev/null
+++ b/man/user_caps.5
@@ -0,0 +1,445 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 2017 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: user_caps.5,v 1.22 2022/07/03 20:01:04 tom Exp $
+.TH user_caps 5
+.ie \n(.g .ds `` \(lq
+.el       .ds `` ``
+.ie \n(.g .ds '' \(rq
+.el       .ds '' ''
+.de NS
+.ie n  .sp
+.el    .sp .5
+.ie n  .in +4
+.el    .in +2
+.nf
+.ft C			\" Courier
+..
+.de NE
+.fi
+.ft R
+.ie n  .in -4
+.el    .in -2
+..
+.de bP
+.ie n  .IP \(bu 4
+.el    .IP \(bu 2
+..
+.SH NAME
+user_caps \- user-defined terminfo capabilities
+.SH SYNOPSIS
+.B @TIC@ -x, @INFOCMP@ -x
+.SH DESCRIPTION
+.SS Background
+.PP
+Before ncurses 5.0,
+terminfo databases used a \fIfixed repertoire\fP of terminal
+capabilities designed for the SVr2 terminal database in 1984,
+and extended in stages through SVr4 (1989),
+and standardized in the Single Unix Specification beginning in 1995.
+.PP
+Most of the \fIextensions\fP in this fixed repertoire were additions
+to the tables of boolean, numeric and string capabilities.
+Rather than change the meaning of an existing capability, a new name was added.
+The terminfo database uses a binary format; binary compatibility was
+ensured by using a header which gave the number of items in the
+tables for each type of capability.
+The standardization was incomplete:
+.bP
+The \fIbinary format\fP itself is not described
+in the X/Open Curses documentation.
+Only the \fIsource format\fP is described.
+.IP
+Library developers rely upon the SVr4 documentation,
+and reverse-engineering the compiled terminfo files to match the binary format.
+.bP
+Lacking a standard for the binary format, most implementations
+copy the SVr2 binary format, which uses 16-bit signed integers,
+and is limited to 4096-byte entries.
+.IP
+The format cannot represent very large numeric capabilities,
+nor can it represent large numbers of special keyboard definitions.
+.bP
+The tables of capability names differ between implementations.
+.IP
+Although they \fImay\fP provide all of the standard capability names,
+the position in the tables differs because some features were added as needed,
+while others were added (out of order) to comply with X/Open Curses.
+.IP
+While ncurses' repertoire of predefined capabilities is closest to Solaris,
+Solaris's terminfo database has a few differences from
+the list published by X/Open Curses.
+For example, ncurses can be configured with tables which match the
+terminal databases for AIX, HP-UX or OSF/1,
+rather than the default Solaris-like configuration.
+.bP
+In SVr4 curses and ncurses,
+the terminal database is defined at compile-time using a text file
+which lists the different terminal capabilities.
+.IP
+In principle, the text-file can be extended,
+but doing this requires recompiling and reinstalling the library.
+The text-file used in ncurses for terminal capabilities includes
+details for various systems past the documented X/Open Curses features.
+For example, ncurses supports these capabilities in each configuration:
+.RS 8
+.TP 5
+memory_lock
+(meml)
+lock memory above cursor
+.TP 5
+memory_unlock
+(memu)
+unlock memory
+.TP 5
+box_chars_1
+(box1)
+box characters primary set
+.RE
+.IP
+The memory lock/unlock capabilities were included because they were used
+in the X11R6 terminal description for \fBxterm\fP(1).
+The \fIbox1\fP capability is used in @TIC@ to help with terminal descriptions
+written for AIX.
+.PP
+During the 1990s, some users were reluctant to use terminfo
+in spite of its performance advantages over termcap:
+.bP
+The fixed repertoire prevented users from adding features
+for unanticipated terminal improvements
+(or required them to reuse existing capabilities as a workaround).
+.bP
+The limitation to 16-bit signed integers was also mentioned.
+Because termcap stores everything as a string,
+it could represent larger numbers.
+.PP
+Although termcap's extensibility was rarely used
+(it was never the \fIspeaker\fP who had actually used the feature),
+the criticism had a point.
+ncurses 5.0 provided a way to detect nonstandard capabilities,
+determine their
+type and optionally store and retrieve them in a way which did not interfere
+with other applications.
+These are referred to as \fIuser-defined capabilities\fP because no
+modifications to the toolset's predefined capability names are needed.
+.PP
+The ncurses utilities \fB@TIC@\fP and \fB@INFOCMP@\fP have a command-line
+option \*(``\-x\*('' to control whether the nonstandard capabilities
+are stored or retrieved.
+A library function \fBuse_extended_names\fP
+is provided for the same purpose.
+.PP
+When compiling a terminal database, if \*(``\-x\*('' is set,
+\fB@TIC@\fP will store a user-defined capability if the capability name is not
+one of the predefined names.
+.PP
+Because ncurses provides a termcap library interface,
+these user-defined capabilities may be visible to termcap applications:
+.bP
+The termcap interface (like all implementations of termcap)
+requires that the capability names are 2-characters.
+.IP
+When the capability is simple enough for use in a termcap application,
+it is provided as a 2-character name.
+.bP
+There are other
+user-defined capabilities which refer to features not usable in termcap,
+e.g., parameterized strings that use more than two parameters
+or use more than the trivial expression support provided by termcap.
+For these, the terminfo database should have only capability names with
+3 or more characters.
+.bP
+Some terminals can send distinct strings for special keys (cursor-,
+keypad- or function-keys) depending on modifier keys (shift, control, etc.).
+While terminfo and termcap have a set of 60 predefined function-key names,
+to which a series of keys can be assigned,
+that is insufficient for more than a dozen keys multiplied by more than
+a couple of modifier combinations.
+The ncurses database uses a convention based on \fBxterm\fP(1) to
+provide extended special-key names.
+.IP
+Fitting that into termcap's limitation of 2-character names
+would be pointless.
+These extended keys are available only with terminfo.
+.SS Recognized capabilities
+.PP
+The ncurses library uses the user-definable capabilities.
+While the terminfo database may have other extensions,
+ncurses makes explicit checks for these:
+.RS 3
+.TP 3
+AX
+\fIboolean\fP, asserts that the terminal interprets SGR 39 and SGR 49
+by resetting the foreground and background color, respectively, to the default.
+.IP
+This is a feature recognized by the \fBscreen\fP program as well.
+.TP 3
+E3
+\fIstring\fP, tells how to clear the terminal's scrollback buffer.
+When present, the \fBclear\fP(1) program sends this before clearing
+the terminal.
+.IP
+The command \*(``\fBtput clear\fP\*('' does the same thing.
+.TP 3
+NQ
+used to suppress a consistency check in @TIC@ for the ncurses capabilities
+in user6 through user9 (u6, u7, u8 and u9)
+which tell how to query the terminal's cursor position
+and its device attributes.
+.TP 3
+RGB
+\fIboolean\fP, \fInumber\fP \fBor\fP \fIstring\fP,
+used to assert that the
+\fBset_a_foreground\fP and
+\fBset_a_background\fP capabilities correspond to \fIdirect colors\fP,
+using an RGB (red/green/blue) convention.
+This capability allows the \fBcolor_content\fP function to
+return appropriate values without requiring the application
+to initialize colors using \fBinit_color\fP.
+.IP
+The capability type determines the values which ncurses sees:
+.RS 3
+.TP 3
+\fIboolean\fP
+implies that the number of bits for red, green and blue are the same.
+Using the maximum number of colors,
+ncurses adds two, divides that sum by three, and assigns the result
+to red, green and blue in that order.
+.IP
+If the number of bits needed for the number of colors is not a multiple
+of three, the blue (and green) components lose in comparison to red.
+.TP 3
+\fInumber\fP
+tells ncurses what result to add to red, green and blue.
+If ncurses runs out of bits,
+blue (and green) lose just as in the \fIboolean\fP case.
+.TP 3
+\fIstring\fP
+explicitly list the number of bits used for red, green and blue components
+as a slash-separated list of decimal integers.
+.RE
+.IP
+Because there are several RGB encodings in use,
+applications which make assumptions about the number of bits per color
+are unlikely to work reliably.
+As a trivial case, for example, one could define \fBRGB#1\fP
+to represent the standard eight ANSI colors, i.e., one bit per color.
+.TP 3
+U8
+\fInumber\fP,
+asserts that ncurses must use Unicode values for line-drawing characters,
+and that it should ignore the alternate character set capabilities
+when the locale uses UTF-8 encoding.
+For more information, see the discussion of
+\fBNCURSES_NO_UTF8_ACS\fP in \fBncurses\fP(3X).
+.IP
+Set this capability to a nonzero value to enable it.
+.TP 3
+XM
+\fIstring\fP,
+override ncurses's built-in string which
+enables/disables \fBxterm\fP(1) mouse mode.
+.IP
+ncurses sends a character sequence to the terminal to initialize mouse mode,
+and when the user clicks the mouse buttons or (in certain modes) moves the
+mouse, handles the characters sent back by the terminal to tell it what
+was done with the mouse.
+.IP
+The mouse protocol is enabled when
+the \fImask\fP passed in the \fBmousemask\fP function is nonzero.
+By default, ncurses handles the responses for the X11 xterm mouse protocol.
+It also knows about the \fISGR 1006\fP xterm mouse protocol,
+but must to be told to look for this specifically.
+It will not be able to guess which mode is used,
+because the responses are enough alike that only confusion would result.
+.IP
+The \fBXM\fP capability has a single parameter.
+If nonzero, the mouse protocol should be enabled.
+If zero, the mouse protocol should be disabled.
+ncurses inspects this capability if it is present,
+to see whether the 1006 protocol is used.
+If so, it expects the responses to use the \fISGR 1006\fP xterm mouse protocol.
+.IP
+The xterm mouse protocol is used by other terminal emulators.
+The terminal database uses building-blocks for the various xterm mouse
+protocols which can be used in customized terminal descriptions.
+.IP
+The terminal database building blocks for this mouse
+feature also have an experimental capability \fIxm\fP.
+The \*(``xm\*('' capability describes the mouse response.
+Currently there is no interpreter which would use this
+information to make the mouse support completely data-driven.
+.IP
+\fIxm\fP shows the format of the mouse responses.
+In this experimental capability, the parameters are
+.RS 5
+.TP 5
+.I p1
+y-ordinate
+.TP 5
+.I p2
+x-ordinate
+.TP 5
+.I p3
+button
+.TP 5
+.I p4
+state, e.g., pressed or released
+.TP 5
+.I p5
+y-ordinate starting region
+.TP 5
+.I p6
+x-ordinate starting region
+.TP 5
+.I p7
+y-ordinate ending region
+.TP 5
+.I p8
+x-ordinate ending region
+.RE
+.IP
+Here are examples from the terminal database for the most commonly used
+xterm mouse protocols:
+.IP
+.nf
+  xterm+x11mouse|X11 xterm mouse protocol,
+          kmous=\\E[M, XM=\\E[?1000%?%p1%{1}%=%th%el%;,
+          xm=\\E[M
+             %?%p4%t%p3%e%{3}%;%'\ '%+%c
+             %p2%'!'%+%c
+             %p1%'!'%+%c,
+
+  xterm+sm+1006|xterm SGR-mouse,
+          kmous=\\E[<, XM=\\E[?1006;1000%?%p1%{1}%=%th%el%;,
+          xm=\\E[<%i%p3%d;
+             %p1%d;
+             %p2%d;
+             %?%p4%tM%em%;,
+.fi
+.
+.SS Extended key-definitions
+.PP
+Several terminals provide the ability to send distinct strings for
+combinations of modified special keys.
+There is no standard for what those keys can send.
+.PP
+Since 1999, \fBxterm\fP(1) has supported
+\fIshift\fP, \fIcontrol\fP, \fIalt\fP, and \fImeta\fP modifiers which produce
+distinct special-key strings.
+In a terminal description, ncurses has no special knowledge of the
+modifiers used.
+Applications can use the \fInaming convention\fP established for \fBxterm\fP
+to find these special keys in the terminal description.
+.PP
+Starting with the curses convention that \fIkey names\fP begin with \*(``k\*(''
+and that shifted special keys are an uppercase name,
+ncurses' terminal database defines these names to which a suffix is added:
+.RS 5
+.TS
+tab(/) ;
+l l .
+\fBName\fP/\fBDescription\fP
+_
+kDC/special form of kdch1 (delete character)
+kDN/special form of kcud1 (cursor down)
+kEND/special form of kend (End)
+kHOM/special form of khome (Home)
+kLFT/special form of kcub1 (cursor-left or cursor-back)
+kNXT/special form of knext (Next, or Page-Down)
+kPRV/special form of kprev (Prev, or Page-Up)
+kRIT/special form of kcuf1 (cursor-right, or cursor-forward)
+kUP/special form of kcuu1 (cursor-up)
+.TE
+.RE
+.PP
+These are the suffixes used to denote the modifiers:
+.RS 5
+.TS
+tab(/) ;
+l l .
+\fBValue\fP/\fBDescription\fP
+_
+2/Shift
+3/Alt
+4/Shift + Alt
+5/Control
+6/Shift + Control
+7/Alt + Control
+8/Shift + Alt + Control
+9/Meta
+10/Meta + Shift
+11/Meta + Alt
+12/Meta + Alt + Shift
+13/Meta + Ctrl
+14/Meta + Ctrl + Shift
+15/Meta + Ctrl + Alt
+16/Meta + Ctrl + Alt + Shift
+.TE
+.RE
+.PP
+None of these are predefined; terminal descriptions can refer to \fInames\fP
+which ncurses will allocate at runtime to \fIkey-codes\fP.
+To use these keys in an ncurses program, an application could do this:
+.bP
+using a list of extended key \fInames\fP,
+ask \fBtigetstr\fP(3X) for their values, and
+.bP
+given the list of values,
+ask \fBkey_defined\fP(3X) for the \fIkey-code\fP which
+would be returned for those keys by \fBwgetch\fP(3X).
+.PP
+.\"
+.SH PORTABILITY
+.PP
+The \*(``\-x\*('' extension feature of \fB@TIC@\fP and \fB@INFOCMP@\fP
+has been adopted in NetBSD curses.
+That implementation stores user-defined capabilities,
+but makes no use of these capabilities itself.
+.\"
+.SH SEE ALSO
+.PP
+\fB@INFOCMP@\fP(1M),
+\fB@TIC@\fP(1M).
+.PP
+The terminal database section
+.I "NCURSES USER-DEFINABLE CAPABILITIES"
+summarizes commonly-used user-defined capabilities
+which are used in the terminal descriptions.
+Some of those features are mentioned in \fBscreen\fP(1) or \fBtmux\fP(1).
+.PP
+.I "XTerm Control Sequences"
+provides further information on the \fBxterm\fP(1) features
+which are used in these extended capabilities.
+.\"
+.SH AUTHORS
+.PP
+Thomas E. Dickey
+.br
+beginning with ncurses 5.0 (1999)
diff --git a/man/wresize.3x b/man/wresize.3x
new file mode 100644
index 0000000..1500913
--- /dev/null
+++ b/man/wresize.3x
@@ -0,0 +1,66 @@
+.\"***************************************************************************
+.\" Copyright 2018-2021,2022 Thomas E. Dickey                                *
+.\" Copyright 1998-2010,2015 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.                                                           *
+.\"***************************************************************************
+.\"
+.\" Author: Thomas E. Dickey 1996
+.\"
+.\" $Id: wresize.3x,v 1.20 2022/02/12 20:07:29 tom Exp $
+.TH wresize 3X ""
+.SH NAME
+\fBwresize\fP \- resize a curses window
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+.sp
+\fBint wresize(WINDOW *\fIwin\fB, int \fIlines\fB, int \fIcolumns\fB);\fR
+.SH DESCRIPTION
+This is an extension to the curses library.
+It reallocates storage for an \fBncurses\fP
+window to adjust its dimensions to the specified values.
+If either dimension is larger than the current values, the
+window's data is filled with blanks that have the current background rendition
+(as set by \fBwbkgdset\fP) merged into them.
+.SH RETURN VALUE
+The function returns the integer \fBERR\fP upon failure and \fBOK\fP on success.
+It will fail if either of the dimensions less than or equal to zero,
+or if an error occurs while (re)allocating memory for the window.
+.SH NOTES
+The only restriction placed on the dimensions is that they be greater than zero.
+The dimensions are not compared to \fBcurses\fP screen dimensions to
+simplify the logic of \fBresizeterm\fP.
+The caller must ensure that the window's dimensions fit within the
+actual screen dimensions.
+.SH PORTABILITY
+.PP
+It is not possible to resize windows with SVr4 curses.
+.PP
+This extension of ncurses was introduced in mid-1995.
+It was adopted in NetBSD curses (2001) and PDCurses (2003).
+.SH SEE ALSO
+\fBresizeterm\fP(3X).
+.SH AUTHOR
+Thomas Dickey (from an equivalent function written in 1988 for BSD curses).
diff --git a/menu/Makefile.in b/menu/Makefile.in
new file mode 100644
index 0000000..b623bf0
--- /dev/null
+++ b/menu/Makefile.in
@@ -0,0 +1,212 @@
+# $Id: Makefile.in,v 1.71 2021/07/03 15:45:33 tom Exp $
+##############################################################################
+# Copyright 2020,2021 Thomas E. Dickey                                       #
+# Copyright 1998-2015,2018 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey 1996-on
+#
+# Makefile for menu source code.
+#
+# This makes the following:
+#	libraries (normal/debug/profile/shared)
+#
+# The variable 'srcdir' refers to the source-distribution, and can be set with
+# the configure script by "--srcdir=DIR".
+#
+# The rules are organized to produce the libraries for the configured models,
+
+# turn off _all_ suffix rules; we'll generate our own
+.SUFFIXES:
+
+SHELL		= @SHELL@
+VPATH		= @srcdir@
+THIS		= Makefile
+
+x		= @EXEEXT@
+o		= .@OBJEXT@
+
+MODEL		= @DFT_LWR_MODEL@
+DESTDIR		= @DESTDIR@
+top_srcdir	= @top_srcdir@
+srcdir		= @srcdir@
+prefix		= @prefix@
+exec_prefix	= @exec_prefix@
+bindir		= @bindir@
+libdir		= @libdir@
+includedir	= @includedir@
+includesubdir	= @includesubdir@
+
+INCLUDEDIR	= $(DESTDIR)$(includedir)$(includesubdir)
+
+PACKAGE		= @PACKAGE@
+
+LIBTOOL		= @LIBTOOL@
+LIBTOOL_OPTS	= @LIBTOOL_OPTS@ @EXPORT_SYMS@
+LIBTOOL_CLEAN	= @LIB_CLEAN@
+LIBTOOL_COMPILE	= @LIB_COMPILE@
+LIBTOOL_LINK	= @LIB_LINK@
+LIBTOOL_INSTALL	= @LIB_INSTALL@
+LIBTOOL_UNINSTALL = @LIB_UNINSTALL@
+LT_UNDEF	= @LT_UNDEF@
+
+INSTALL		= @INSTALL@
+INSTALL_LIB	= @INSTALL@ @INSTALL_LIB@
+INSTALL_PROG	= @INSTALL_PROGRAM@ @INSTALL_OPT_S@
+INSTALL_DATA	= @INSTALL_DATA@
+
+AR		= @AR@
+ARFLAGS		= @ARFLAGS@
+AWK		= @AWK@
+LD		= @LD@
+LN_S		= @LN_S@
+
+CTAGS		= @CTAGS@
+ETAGS		= @ETAGS@
+
+CC		= @CC@
+CPP		= @CPP@
+CFLAGS		= @CFLAGS@ @EXTRA_CFLAGS@
+
+INCDIR		= $(top_srcdir)/include
+BASE_DIR 	= $(top_srcdir)/ncurses
+CPPFLAGS	= -I$(BASE_DIR) -DHAVE_CONFIG_H -DBUILDING_MENU @CPPFLAGS@
+
+CCFLAGS		= $(CPPFLAGS) $(CFLAGS)
+
+CFLAGS_LIBTOOL	= $(CCFLAGS)
+CFLAGS_NORMAL	= $(CCFLAGS) -DNCURSES_STATIC
+CFLAGS_DEBUG	= $(CCFLAGS) -DNCURSES_STATIC @CC_G_OPT@ -DTRACE
+CFLAGS_PROFILE	= $(CCFLAGS) -DNCURSES_STATIC -pg
+CFLAGS_SHARED	= $(CCFLAGS) @CC_SHARED_OPTS@
+
+CFLAGS_DEFAULT	= $(CFLAGS_@DFT_UPR_MODEL@)
+
+LINK		= $(LIBTOOL_LINK)
+LDFLAGS		= @LDFLAGS@ @LD_MODEL@ @LIBS@
+
+SHLIB_DIRS	= -L../lib
+SHLIB_LIST	= $(SHLIB_DIRS) -lncurses@USE_LIB_SUFFIX@ @SHLIB_LIST@
+
+RPATH_LIST	= @RPATH_LIST@
+RESULTING_SYMS	= @RESULTING_SYMS@
+VERSIONED_SYMS	= @VERSIONED_SYMS@
+MK_SHARED_LIB	= @MK_SHARED_LIB@
+
+NCURSES_MAJOR	= @NCURSES_MAJOR@
+NCURSES_MINOR	= @NCURSES_MINOR@
+REL_VERSION	= @cf_cv_rel_version@
+ABI_VERSION	= @cf_cv_abi_version@
+
+RANLIB		= @LIB_PREP@
+
+LIBRARIES	= @Libs_To_Make@
+
+LINT		= @LINT@
+LINT_OPTS	= @LINT_OPTS@
+LINT_LIBS	= -lmenu -lncurses @LIBS@
+
+AUTO_SRC	= \
+		../include/menu.h \
+		../include/eti.h \
+		../include/mf_common.h
+
+################################################################################
+
+@MAKE_PHONY@.PHONY :	all
+@MAKE_PHONY@.PHONY :	clean
+@MAKE_PHONY@.PHONY :	distclean
+@MAKE_PHONY@.PHONY :	install
+@MAKE_PHONY@.PHONY :	install.libs
+@MAKE_PHONY@.PHONY :	libs
+@MAKE_PHONY@.PHONY :	mostlyclean
+@MAKE_PHONY@.PHONY :	realclean
+@MAKE_PHONY@.PHONY :	sources
+@MAKE_PHONY@.PHONY :	uninstall
+@MAKE_PHONY@.PHONY :	uninstall.libs
+
+all \
+libs \
+install ::	$(AUTO_SRC) $(LIBRARIES)
+
+sources :	$(AUTO_SRC)
+
+$(DESTDIR)$(bindir) \
+$(DESTDIR)$(libdir) :
+	mkdir -p $@
+
+# make copies to simplify include-paths while still keeping menu's include
+# file in this directory.
+../include/menu.h : $(srcdir)/menu.h
+	-rm -f $@
+	cp $(srcdir)/menu.h $@
+../include/eti.h : $(srcdir)/eti.h
+	-rm -f $@
+	cp $(srcdir)/eti.h $@
+../include/mf_common.h : $(srcdir)/mf_common.h
+	-rm -f $@
+	cp $(srcdir)/mf_common.h $@
+
+HEADER_DEPS = \
+	../include/curses.h \
+	../include/ncurses_cfg.h \
+	../include/ncurses_def.h \
+	../include/ncurses_dll.h \
+	../include/term.h \
+	../include/unctrl.h \
+	$(BASE_DIR)/curses.priv.h \
+	$(BASE_DIR)/new_pair.h \
+	$(INCDIR)/nc_alloc.h \
+	$(INCDIR)/nc_panel.h \
+	$(INCDIR)/nc_string.h \
+	$(INCDIR)/nc_termios.h \
+	$(INCDIR)/nc_tparm.h \
+	$(INCDIR)/term_entry.h \
+	$(srcdir)/menu.priv.h \
+	$(AUTO_SRC)
+
+tags:
+	$(CTAGS) *.[ch]
+
+@MAKE_UPPER_TAGS@TAGS:
+@MAKE_UPPER_TAGS@	$(ETAGS) *.[ch]
+
+mostlyclean ::
+	-rm -f core tags TAGS *~ *.bak *.i *.ln *.atac trace
+
+clean :: mostlyclean
+	-rm -f $(AUTO_SRC)
+	-rm -rf .libs *.dSYM
+
+distclean :: clean
+	-rm -f Makefile
+
+realclean :: distclean
+
+###############################################################################
+# The remainder of this file is automatically generated during configuration
+###############################################################################
diff --git a/menu/READ.ME b/menu/READ.ME
new file mode 100644
index 0000000..8c78037
--- /dev/null
+++ b/menu/READ.ME
@@ -0,0 +1,43 @@
+-------------------------------------------------------------------------------
+-- Copyright 2020,2021 Thomas E. Dickey                                      --
+-- Copyright 1998-2003,2006 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: READ.ME,v 1.11 2021/06/17 21:20:30 tom Exp $
+-------------------------------------------------------------------------------
+
+This is a clone of the menu library that is available with typical
+System V curses implementations (ETI).
+
+It is modelled after the documentation that comes for this library with
+a 386 based SVR4 implementation (ESIX).
+
+The development environment was and is an ELF based Linux system.
+
+For things that still need doing, see the TO-DO file in the top-level
+directory.
+
+Juergen Pfeifer
diff --git a/menu/eti.h b/menu/eti.h
new file mode 100644
index 0000000..3c3302d
--- /dev/null
+++ b/menu/eti.h
@@ -0,0 +1,55 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2002,2003 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+/* $Id: eti.h,v 1.9 2020/02/02 23:34:34 tom Exp $ */
+
+#ifndef NCURSES_ETI_H_incl
+#define NCURSES_ETI_H_incl 1
+
+#define	E_OK			(0)
+#define	E_SYSTEM_ERROR	 	(-1)
+#define	E_BAD_ARGUMENT	 	(-2)
+#define	E_POSTED	 	(-3)
+#define	E_CONNECTED	 	(-4)
+#define	E_BAD_STATE	 	(-5)
+#define	E_NO_ROOM	 	(-6)
+#define	E_NOT_POSTED		(-7)
+#define	E_UNKNOWN_COMMAND	(-8)
+#define	E_NO_MATCH		(-9)
+#define	E_NOT_SELECTABLE	(-10)
+#define	E_NOT_CONNECTED	        (-11)
+#define	E_REQUEST_DENIED	(-12)
+#define	E_INVALID_FIELD	        (-13)
+#define	E_CURRENT		(-14)
+
+#endif
diff --git a/menu/headers b/menu/headers
new file mode 100644
index 0000000..2f058aa
--- /dev/null
+++ b/menu/headers
@@ -0,0 +1,34 @@
+##############################################################################
+# Copyright 2020 Thomas E. Dickey                                            #
+# Copyright 1998,2006 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey <dickey@clark.net> 1996
+#
+$(srcdir)/eti.h
+$(srcdir)/menu.h
+# vile:makemode
diff --git a/menu/llib-lmenu b/menu/llib-lmenu
new file mode 100644
index 0000000..67f6822
--- /dev/null
+++ b/menu/llib-lmenu
@@ -0,0 +1,552 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2010,2015 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey       1996-on                                  *
+ ****************************************************************************/
+/* LINTLIBRARY */
+
+/* ./m_attribs.c */
+
+#include <menu.priv.h>
+
+#undef set_menu_fore
+int	set_menu_fore(
+		MENU	*menu,
+		chtype	attr)
+		{ return(*(int *)0); }
+
+#undef menu_fore
+chtype	menu_fore(
+		const MENU *menu)
+		{ return(*(chtype *)0); }
+
+#undef set_menu_back
+int	set_menu_back(
+		MENU	*menu,
+		chtype	attr)
+		{ return(*(int *)0); }
+
+#undef menu_back
+chtype	menu_back(
+		const MENU *menu)
+		{ return(*(chtype *)0); }
+
+#undef set_menu_grey
+int	set_menu_grey(
+		MENU	*menu,
+		chtype	attr)
+		{ return(*(int *)0); }
+
+#undef menu_grey
+chtype	menu_grey(
+		const MENU *menu)
+		{ return(*(chtype *)0); }
+
+/* ./m_cursor.c */
+
+#undef _nc_menu_cursor_pos
+int	_nc_menu_cursor_pos(
+		const MENU *menu,
+		const ITEM *item,
+		int	*pY,
+		int	*pX)
+		{ return(*(int *)0); }
+
+#undef pos_menu_cursor
+int	pos_menu_cursor(
+		const MENU *menu)
+		{ return(*(int *)0); }
+
+/* ./m_driver.c */
+
+#undef _nc_Match_Next_Character_In_Item_Name
+int	_nc_Match_Next_Character_In_Item_Name(
+		MENU	*menu,
+		int	ch,
+		ITEM	**item)
+		{ return(*(int *)0); }
+
+#undef menu_driver
+int	menu_driver(
+		MENU	*menu,
+		int	c)
+		{ return(*(int *)0); }
+
+/* ./m_format.c */
+
+#undef set_menu_format
+int	set_menu_format(
+		MENU	*menu,
+		int	rows,
+		int	cols)
+		{ return(*(int *)0); }
+
+#undef menu_format
+void	menu_format(
+		const MENU *menu,
+		int	*rows,
+		int	*cols)
+		{ /* void */ }
+
+/* ./m_global.c */
+
+#undef _nc_Default_Menu
+MENU	_nc_Default_Menu;
+#undef _nc_Default_Item
+ITEM	_nc_Default_Item;
+
+#undef _nc_Connect_Items
+NCURSES_BOOL _nc_Connect_Items(
+		MENU	*menu,
+		ITEM	**items)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_Disconnect_Items
+void	_nc_Disconnect_Items(
+		MENU	*menu)
+		{ /* void */ }
+
+#undef _nc_Calculate_Text_Width
+int	_nc_Calculate_Text_Width(
+		const TEXT *item)
+		{ return(*(int *)0); }
+
+#undef _nc_Calculate_Item_Length_and_Width
+void	_nc_Calculate_Item_Length_and_Width(
+		MENU	*menu)
+		{ /* void */ }
+
+#undef _nc_Link_Items
+void	_nc_Link_Items(
+		MENU	*menu)
+		{ /* void */ }
+
+#undef _nc_Show_Menu
+void	_nc_Show_Menu(
+		const MENU *menu)
+		{ /* void */ }
+
+#undef _nc_New_TopRow_and_CurrentItem
+void	_nc_New_TopRow_and_CurrentItem(
+		MENU	*menu,
+		int	new_toprow,
+		ITEM	*new_current_item)
+		{ /* void */ }
+
+/* ./m_hook.c */
+
+#undef set_menu_init
+int	set_menu_init(
+		MENU	*menu,
+		Menu_Hook func)
+		{ return(*(int *)0); }
+
+#undef menu_init
+Menu_Hook menu_init(
+		const MENU *menu)
+		{ return(*(Menu_Hook *)0); }
+
+#undef set_menu_term
+int	set_menu_term(
+		MENU	*menu,
+		Menu_Hook func)
+		{ return(*(int *)0); }
+
+#undef menu_term
+Menu_Hook menu_term(
+		const MENU *menu)
+		{ return(*(Menu_Hook *)0); }
+
+#undef set_item_init
+int	set_item_init(
+		MENU	*menu,
+		Menu_Hook func)
+		{ return(*(int *)0); }
+
+#undef item_init
+Menu_Hook item_init(
+		const MENU *menu)
+		{ return(*(Menu_Hook *)0); }
+
+#undef set_item_term
+int	set_item_term(
+		MENU	*menu,
+		Menu_Hook func)
+		{ return(*(int *)0); }
+
+#undef item_term
+Menu_Hook item_term(
+		const MENU *menu)
+		{ return(*(Menu_Hook *)0); }
+
+/* ./m_item_cur.c */
+
+#undef set_current_item
+int	set_current_item(
+		MENU	*menu,
+		ITEM	*item)
+		{ return(*(int *)0); }
+
+#undef current_item
+ITEM	*current_item(
+		const MENU *menu)
+		{ return(*(ITEM **)0); }
+
+#undef item_index
+int	item_index(
+		const ITEM *item)
+		{ return(*(int *)0); }
+
+/* ./m_item_nam.c */
+
+#undef item_name
+const char *item_name(
+		const ITEM *item)
+		{ return(*(const char **)0); }
+
+#undef item_description
+const char *item_description(
+		const ITEM *item)
+		{ return(*(const char **)0); }
+
+/* ./m_item_new.c */
+
+#undef new_item
+ITEM	*new_item(
+		const char *name,
+		const char *description)
+		{ return(*(ITEM **)0); }
+
+#undef free_item
+int	free_item(
+		ITEM	*item)
+		{ return(*(int *)0); }
+
+#undef set_menu_mark
+int	set_menu_mark(
+		MENU	*menu,
+		const char *mark)
+		{ return(*(int *)0); }
+
+#undef menu_mark
+const char *menu_mark(
+		const MENU *menu)
+		{ return(*(const char **)0); }
+
+/* ./m_item_opt.c */
+
+#undef set_item_opts
+int	set_item_opts(
+		ITEM	*item,
+		Item_Options opts)
+		{ return(*(int *)0); }
+
+#undef item_opts_off
+int	item_opts_off(
+		ITEM	*item,
+		Item_Options opts)
+		{ return(*(int *)0); }
+
+#undef item_opts_on
+int	item_opts_on(
+		ITEM	*item,
+		Item_Options opts)
+		{ return(*(int *)0); }
+
+#undef item_opts
+Item_Options item_opts(
+		const ITEM *item)
+		{ return(*(Item_Options *)0); }
+
+/* ./m_item_top.c */
+
+#undef set_top_row
+int	set_top_row(
+		MENU	*menu,
+		int	row)
+		{ return(*(int *)0); }
+
+#undef top_row
+int	top_row(
+		const MENU *menu)
+		{ return(*(int *)0); }
+
+/* ./m_item_use.c */
+
+#undef set_item_userptr
+int	set_item_userptr(
+		ITEM	*item,
+		void	*userptr)
+		{ return(*(int *)0); }
+
+#undef item_userptr
+void	*item_userptr(
+		const ITEM *item)
+		{ return(*(void **)0); }
+
+/* ./m_item_val.c */
+
+#undef set_item_value
+int	set_item_value(
+		ITEM	*item,
+		NCURSES_BOOL value)
+		{ return(*(int *)0); }
+
+#undef item_value
+NCURSES_BOOL item_value(
+		const ITEM *item)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./m_item_vis.c */
+
+#undef item_visible
+NCURSES_BOOL item_visible(
+		const ITEM *item)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./m_items.c */
+
+#undef set_menu_items
+int	set_menu_items(
+		MENU	*menu,
+		ITEM	**items)
+		{ return(*(int *)0); }
+
+#undef menu_items
+ITEM	**menu_items(
+		const MENU *menu)
+		{ return(*(ITEM ***)0); }
+
+#undef item_count
+int	item_count(
+		const MENU *menu)
+		{ return(*(int *)0); }
+
+/* ./m_new.c */
+
+#undef new_menu_sp
+MENU	*new_menu_sp(
+		SCREEN	*sp,
+		ITEM	**items)
+		{ return(*(MENU **)0); }
+
+#undef new_menu
+MENU	*new_menu(
+		ITEM	**items)
+		{ return(*(MENU **)0); }
+
+#undef free_menu
+int	free_menu(
+		MENU	*menu)
+		{ return(*(int *)0); }
+
+/* ./m_opts.c */
+
+#undef set_menu_opts
+int	set_menu_opts(
+		MENU	*menu,
+		Menu_Options opts)
+		{ return(*(int *)0); }
+
+#undef menu_opts_off
+int	menu_opts_off(
+		MENU	*menu,
+		Menu_Options opts)
+		{ return(*(int *)0); }
+
+#undef menu_opts_on
+int	menu_opts_on(
+		MENU	*menu,
+		Menu_Options opts)
+		{ return(*(int *)0); }
+
+#undef menu_opts
+Menu_Options menu_opts(
+		const MENU *menu)
+		{ return(*(Menu_Options *)0); }
+
+/* ./m_pad.c */
+
+#undef set_menu_pad
+int	set_menu_pad(
+		MENU	*menu,
+		int	pad)
+		{ return(*(int *)0); }
+
+#undef menu_pad
+int	menu_pad(
+		const MENU *menu)
+		{ return(*(int *)0); }
+
+/* ./m_pattern.c */
+
+#undef menu_pattern
+char	*menu_pattern(
+		const MENU *menu)
+		{ return(*(char **)0); }
+
+#undef set_menu_pattern
+int	set_menu_pattern(
+		MENU	*menu,
+		const char *p)
+		{ return(*(int *)0); }
+
+/* ./m_post.c */
+
+#undef _nc_Post_Item
+void	_nc_Post_Item(
+		const MENU *menu,
+		const ITEM *item)
+		{ /* void */ }
+
+#undef _nc_Draw_Menu
+void	_nc_Draw_Menu(
+		const MENU *menu)
+		{ /* void */ }
+
+#undef post_menu
+int	post_menu(
+		MENU	*menu)
+		{ return(*(int *)0); }
+
+#undef unpost_menu
+int	unpost_menu(
+		MENU	*menu)
+		{ return(*(int *)0); }
+
+/* ./m_req_name.c */
+
+#undef menu_request_name
+const char *menu_request_name(
+		int	request)
+		{ return(*(const char **)0); }
+
+#undef menu_request_by_name
+int	menu_request_by_name(
+		const char *str)
+		{ return(*(int *)0); }
+
+/* ./m_scale.c */
+
+#undef scale_menu
+int	scale_menu(
+		const MENU *menu,
+		int	*rows,
+		int	*cols)
+		{ return(*(int *)0); }
+
+/* ./m_spacing.c */
+
+#undef set_menu_spacing
+int	set_menu_spacing(
+		MENU	*menu,
+		int	s_desc,
+		int	s_row,
+		int	s_col)
+		{ return(*(int *)0); }
+
+#undef menu_spacing
+int	menu_spacing(
+		const MENU *menu,
+		int	*s_desc,
+		int	*s_row,
+		int	*s_col)
+		{ return(*(int *)0); }
+
+/* ./m_sub.c */
+
+#undef set_menu_sub
+int	set_menu_sub(
+		MENU	*menu,
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+#undef menu_sub
+WINDOW	*menu_sub(
+		const MENU *menu)
+		{ return(*(WINDOW **)0); }
+
+/* ./m_trace.c */
+
+#undef _nc_retrace_item
+ITEM	*_nc_retrace_item(
+		ITEM	*code)
+		{ return(*(ITEM **)0); }
+
+#undef _nc_retrace_item_ptr
+ITEM	**_nc_retrace_item_ptr(
+		ITEM	**code)
+		{ return(*(ITEM ***)0); }
+
+#undef _nc_retrace_item_opts
+Item_Options _nc_retrace_item_opts(
+		Item_Options code)
+		{ return(*(Item_Options *)0); }
+
+#undef _nc_retrace_menu
+MENU	*_nc_retrace_menu(
+		MENU	*code)
+		{ return(*(MENU **)0); }
+
+#undef _nc_retrace_menu_hook
+Menu_Hook _nc_retrace_menu_hook(
+		Menu_Hook code)
+		{ return(*(Menu_Hook *)0); }
+
+#undef _nc_retrace_menu_opts
+Menu_Options _nc_retrace_menu_opts(
+		Menu_Options code)
+		{ return(*(Menu_Options *)0); }
+
+/* ./m_userptr.c */
+
+#undef set_menu_userptr
+int	set_menu_userptr(
+		MENU	*menu,
+		void	*userptr)
+		{ return(*(int *)0); }
+
+#undef menu_userptr
+void	*menu_userptr(
+		const MENU *menu)
+		{ return(*(void **)0); }
+
+/* ./m_win.c */
+
+#undef set_menu_win
+int	set_menu_win(
+		MENU	*menu,
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+#undef menu_win
+WINDOW	*menu_win(
+		const MENU *menu)
+		{ return(*(WINDOW **)0); }
diff --git a/menu/llib-lmenut b/menu/llib-lmenut
new file mode 100644
index 0000000..0a0d059
--- /dev/null
+++ b/menu/llib-lmenut
@@ -0,0 +1,552 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 2010,2015 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey       2010-on                                  *
+ ****************************************************************************/
+/* LINTLIBRARY */
+
+/* ./m_attribs.c */
+
+#include <menu.priv.h>
+
+#undef set_menu_fore
+int	set_menu_fore(
+		MENU	*menu,
+		chtype	attr)
+		{ return(*(int *)0); }
+
+#undef menu_fore
+chtype	menu_fore(
+		const MENU *menu)
+		{ return(*(chtype *)0); }
+
+#undef set_menu_back
+int	set_menu_back(
+		MENU	*menu,
+		chtype	attr)
+		{ return(*(int *)0); }
+
+#undef menu_back
+chtype	menu_back(
+		const MENU *menu)
+		{ return(*(chtype *)0); }
+
+#undef set_menu_grey
+int	set_menu_grey(
+		MENU	*menu,
+		chtype	attr)
+		{ return(*(int *)0); }
+
+#undef menu_grey
+chtype	menu_grey(
+		const MENU *menu)
+		{ return(*(chtype *)0); }
+
+/* ./m_cursor.c */
+
+#undef _nc_menu_cursor_pos
+int	_nc_menu_cursor_pos(
+		const MENU *menu,
+		const ITEM *item,
+		int	*pY,
+		int	*pX)
+		{ return(*(int *)0); }
+
+#undef pos_menu_cursor
+int	pos_menu_cursor(
+		const MENU *menu)
+		{ return(*(int *)0); }
+
+/* ./m_driver.c */
+
+#undef _nc_Match_Next_Character_In_Item_Name
+int	_nc_Match_Next_Character_In_Item_Name(
+		MENU	*menu,
+		int	ch,
+		ITEM	**item)
+		{ return(*(int *)0); }
+
+#undef menu_driver
+int	menu_driver(
+		MENU	*menu,
+		int	c)
+		{ return(*(int *)0); }
+
+/* ./m_format.c */
+
+#undef set_menu_format
+int	set_menu_format(
+		MENU	*menu,
+		int	rows,
+		int	cols)
+		{ return(*(int *)0); }
+
+#undef menu_format
+void	menu_format(
+		const MENU *menu,
+		int	*rows,
+		int	*cols)
+		{ /* void */ }
+
+/* ./m_global.c */
+
+#undef _nc_Default_Menu
+MENU	_nc_Default_Menu;
+#undef _nc_Default_Item
+ITEM	_nc_Default_Item;
+
+#undef _nc_Connect_Items
+NCURSES_BOOL _nc_Connect_Items(
+		MENU	*menu,
+		ITEM	**items)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_Disconnect_Items
+void	_nc_Disconnect_Items(
+		MENU	*menu)
+		{ /* void */ }
+
+#undef _nc_Calculate_Text_Width
+int	_nc_Calculate_Text_Width(
+		const TEXT *item)
+		{ return(*(int *)0); }
+
+#undef _nc_Calculate_Item_Length_and_Width
+void	_nc_Calculate_Item_Length_and_Width(
+		MENU	*menu)
+		{ /* void */ }
+
+#undef _nc_Link_Items
+void	_nc_Link_Items(
+		MENU	*menu)
+		{ /* void */ }
+
+#undef _nc_Show_Menu
+void	_nc_Show_Menu(
+		const MENU *menu)
+		{ /* void */ }
+
+#undef _nc_New_TopRow_and_CurrentItem
+void	_nc_New_TopRow_and_CurrentItem(
+		MENU	*menu,
+		int	new_toprow,
+		ITEM	*new_current_item)
+		{ /* void */ }
+
+/* ./m_hook.c */
+
+#undef set_menu_init
+int	set_menu_init(
+		MENU	*menu,
+		Menu_Hook func)
+		{ return(*(int *)0); }
+
+#undef menu_init
+Menu_Hook menu_init(
+		const MENU *menu)
+		{ return(*(Menu_Hook *)0); }
+
+#undef set_menu_term
+int	set_menu_term(
+		MENU	*menu,
+		Menu_Hook func)
+		{ return(*(int *)0); }
+
+#undef menu_term
+Menu_Hook menu_term(
+		const MENU *menu)
+		{ return(*(Menu_Hook *)0); }
+
+#undef set_item_init
+int	set_item_init(
+		MENU	*menu,
+		Menu_Hook func)
+		{ return(*(int *)0); }
+
+#undef item_init
+Menu_Hook item_init(
+		const MENU *menu)
+		{ return(*(Menu_Hook *)0); }
+
+#undef set_item_term
+int	set_item_term(
+		MENU	*menu,
+		Menu_Hook func)
+		{ return(*(int *)0); }
+
+#undef item_term
+Menu_Hook item_term(
+		const MENU *menu)
+		{ return(*(Menu_Hook *)0); }
+
+/* ./m_item_cur.c */
+
+#undef set_current_item
+int	set_current_item(
+		MENU	*menu,
+		ITEM	*item)
+		{ return(*(int *)0); }
+
+#undef current_item
+ITEM	*current_item(
+		const MENU *menu)
+		{ return(*(ITEM **)0); }
+
+#undef item_index
+int	item_index(
+		const ITEM *item)
+		{ return(*(int *)0); }
+
+/* ./m_item_nam.c */
+
+#undef item_name
+const char *item_name(
+		const ITEM *item)
+		{ return(*(const char **)0); }
+
+#undef item_description
+const char *item_description(
+		const ITEM *item)
+		{ return(*(const char **)0); }
+
+/* ./m_item_new.c */
+
+#undef new_item
+ITEM	*new_item(
+		const char *name,
+		const char *description)
+		{ return(*(ITEM **)0); }
+
+#undef free_item
+int	free_item(
+		ITEM	*item)
+		{ return(*(int *)0); }
+
+#undef set_menu_mark
+int	set_menu_mark(
+		MENU	*menu,
+		const char *mark)
+		{ return(*(int *)0); }
+
+#undef menu_mark
+const char *menu_mark(
+		const MENU *menu)
+		{ return(*(const char **)0); }
+
+/* ./m_item_opt.c */
+
+#undef set_item_opts
+int	set_item_opts(
+		ITEM	*item,
+		Item_Options opts)
+		{ return(*(int *)0); }
+
+#undef item_opts_off
+int	item_opts_off(
+		ITEM	*item,
+		Item_Options opts)
+		{ return(*(int *)0); }
+
+#undef item_opts_on
+int	item_opts_on(
+		ITEM	*item,
+		Item_Options opts)
+		{ return(*(int *)0); }
+
+#undef item_opts
+Item_Options item_opts(
+		const ITEM *item)
+		{ return(*(Item_Options *)0); }
+
+/* ./m_item_top.c */
+
+#undef set_top_row
+int	set_top_row(
+		MENU	*menu,
+		int	row)
+		{ return(*(int *)0); }
+
+#undef top_row
+int	top_row(
+		const MENU *menu)
+		{ return(*(int *)0); }
+
+/* ./m_item_use.c */
+
+#undef set_item_userptr
+int	set_item_userptr(
+		ITEM	*item,
+		void	*userptr)
+		{ return(*(int *)0); }
+
+#undef item_userptr
+void	*item_userptr(
+		const ITEM *item)
+		{ return(*(void **)0); }
+
+/* ./m_item_val.c */
+
+#undef set_item_value
+int	set_item_value(
+		ITEM	*item,
+		NCURSES_BOOL value)
+		{ return(*(int *)0); }
+
+#undef item_value
+NCURSES_BOOL item_value(
+		const ITEM *item)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./m_item_vis.c */
+
+#undef item_visible
+NCURSES_BOOL item_visible(
+		const ITEM *item)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./m_items.c */
+
+#undef set_menu_items
+int	set_menu_items(
+		MENU	*menu,
+		ITEM	**items)
+		{ return(*(int *)0); }
+
+#undef menu_items
+ITEM	**menu_items(
+		const MENU *menu)
+		{ return(*(ITEM ***)0); }
+
+#undef item_count
+int	item_count(
+		const MENU *menu)
+		{ return(*(int *)0); }
+
+/* ./m_new.c */
+
+#undef new_menu_sp
+MENU	*new_menu_sp(
+		SCREEN	*sp,
+		ITEM	**items)
+		{ return(*(MENU **)0); }
+
+#undef new_menu
+MENU	*new_menu(
+		ITEM	**items)
+		{ return(*(MENU **)0); }
+
+#undef free_menu
+int	free_menu(
+		MENU	*menu)
+		{ return(*(int *)0); }
+
+/* ./m_opts.c */
+
+#undef set_menu_opts
+int	set_menu_opts(
+		MENU	*menu,
+		Menu_Options opts)
+		{ return(*(int *)0); }
+
+#undef menu_opts_off
+int	menu_opts_off(
+		MENU	*menu,
+		Menu_Options opts)
+		{ return(*(int *)0); }
+
+#undef menu_opts_on
+int	menu_opts_on(
+		MENU	*menu,
+		Menu_Options opts)
+		{ return(*(int *)0); }
+
+#undef menu_opts
+Menu_Options menu_opts(
+		const MENU *menu)
+		{ return(*(Menu_Options *)0); }
+
+/* ./m_pad.c */
+
+#undef set_menu_pad
+int	set_menu_pad(
+		MENU	*menu,
+		int	pad)
+		{ return(*(int *)0); }
+
+#undef menu_pad
+int	menu_pad(
+		const MENU *menu)
+		{ return(*(int *)0); }
+
+/* ./m_pattern.c */
+
+#undef menu_pattern
+char	*menu_pattern(
+		const MENU *menu)
+		{ return(*(char **)0); }
+
+#undef set_menu_pattern
+int	set_menu_pattern(
+		MENU	*menu,
+		const char *p)
+		{ return(*(int *)0); }
+
+/* ./m_post.c */
+
+#undef _nc_Post_Item
+void	_nc_Post_Item(
+		const MENU *menu,
+		const ITEM *item)
+		{ /* void */ }
+
+#undef _nc_Draw_Menu
+void	_nc_Draw_Menu(
+		const MENU *menu)
+		{ /* void */ }
+
+#undef post_menu
+int	post_menu(
+		MENU	*menu)
+		{ return(*(int *)0); }
+
+#undef unpost_menu
+int	unpost_menu(
+		MENU	*menu)
+		{ return(*(int *)0); }
+
+/* ./m_req_name.c */
+
+#undef menu_request_name
+const char *menu_request_name(
+		int	request)
+		{ return(*(const char **)0); }
+
+#undef menu_request_by_name
+int	menu_request_by_name(
+		const char *str)
+		{ return(*(int *)0); }
+
+/* ./m_scale.c */
+
+#undef scale_menu
+int	scale_menu(
+		const MENU *menu,
+		int	*rows,
+		int	*cols)
+		{ return(*(int *)0); }
+
+/* ./m_spacing.c */
+
+#undef set_menu_spacing
+int	set_menu_spacing(
+		MENU	*menu,
+		int	s_desc,
+		int	s_row,
+		int	s_col)
+		{ return(*(int *)0); }
+
+#undef menu_spacing
+int	menu_spacing(
+		const MENU *menu,
+		int	*s_desc,
+		int	*s_row,
+		int	*s_col)
+		{ return(*(int *)0); }
+
+/* ./m_sub.c */
+
+#undef set_menu_sub
+int	set_menu_sub(
+		MENU	*menu,
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+#undef menu_sub
+WINDOW	*menu_sub(
+		const MENU *menu)
+		{ return(*(WINDOW **)0); }
+
+/* ./m_trace.c */
+
+#undef _nc_retrace_item
+ITEM	*_nc_retrace_item(
+		ITEM	*code)
+		{ return(*(ITEM **)0); }
+
+#undef _nc_retrace_item_ptr
+ITEM	**_nc_retrace_item_ptr(
+		ITEM	**code)
+		{ return(*(ITEM ***)0); }
+
+#undef _nc_retrace_item_opts
+Item_Options _nc_retrace_item_opts(
+		Item_Options code)
+		{ return(*(Item_Options *)0); }
+
+#undef _nc_retrace_menu
+MENU	*_nc_retrace_menu(
+		MENU	*code)
+		{ return(*(MENU **)0); }
+
+#undef _nc_retrace_menu_hook
+Menu_Hook _nc_retrace_menu_hook(
+		Menu_Hook code)
+		{ return(*(Menu_Hook *)0); }
+
+#undef _nc_retrace_menu_opts
+Menu_Options _nc_retrace_menu_opts(
+		Menu_Options code)
+		{ return(*(Menu_Options *)0); }
+
+/* ./m_userptr.c */
+
+#undef set_menu_userptr
+int	set_menu_userptr(
+		MENU	*menu,
+		void	*userptr)
+		{ return(*(int *)0); }
+
+#undef menu_userptr
+void	*menu_userptr(
+		const MENU *menu)
+		{ return(*(void **)0); }
+
+/* ./m_win.c */
+
+#undef set_menu_win
+int	set_menu_win(
+		MENU	*menu,
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+#undef menu_win
+WINDOW	*menu_win(
+		const MENU *menu)
+		{ return(*(WINDOW **)0); }
diff --git a/menu/llib-lmenutw b/menu/llib-lmenutw
new file mode 100644
index 0000000..0a0d059
--- /dev/null
+++ b/menu/llib-lmenutw
@@ -0,0 +1,552 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 2010,2015 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey       2010-on                                  *
+ ****************************************************************************/
+/* LINTLIBRARY */
+
+/* ./m_attribs.c */
+
+#include <menu.priv.h>
+
+#undef set_menu_fore
+int	set_menu_fore(
+		MENU	*menu,
+		chtype	attr)
+		{ return(*(int *)0); }
+
+#undef menu_fore
+chtype	menu_fore(
+		const MENU *menu)
+		{ return(*(chtype *)0); }
+
+#undef set_menu_back
+int	set_menu_back(
+		MENU	*menu,
+		chtype	attr)
+		{ return(*(int *)0); }
+
+#undef menu_back
+chtype	menu_back(
+		const MENU *menu)
+		{ return(*(chtype *)0); }
+
+#undef set_menu_grey
+int	set_menu_grey(
+		MENU	*menu,
+		chtype	attr)
+		{ return(*(int *)0); }
+
+#undef menu_grey
+chtype	menu_grey(
+		const MENU *menu)
+		{ return(*(chtype *)0); }
+
+/* ./m_cursor.c */
+
+#undef _nc_menu_cursor_pos
+int	_nc_menu_cursor_pos(
+		const MENU *menu,
+		const ITEM *item,
+		int	*pY,
+		int	*pX)
+		{ return(*(int *)0); }
+
+#undef pos_menu_cursor
+int	pos_menu_cursor(
+		const MENU *menu)
+		{ return(*(int *)0); }
+
+/* ./m_driver.c */
+
+#undef _nc_Match_Next_Character_In_Item_Name
+int	_nc_Match_Next_Character_In_Item_Name(
+		MENU	*menu,
+		int	ch,
+		ITEM	**item)
+		{ return(*(int *)0); }
+
+#undef menu_driver
+int	menu_driver(
+		MENU	*menu,
+		int	c)
+		{ return(*(int *)0); }
+
+/* ./m_format.c */
+
+#undef set_menu_format
+int	set_menu_format(
+		MENU	*menu,
+		int	rows,
+		int	cols)
+		{ return(*(int *)0); }
+
+#undef menu_format
+void	menu_format(
+		const MENU *menu,
+		int	*rows,
+		int	*cols)
+		{ /* void */ }
+
+/* ./m_global.c */
+
+#undef _nc_Default_Menu
+MENU	_nc_Default_Menu;
+#undef _nc_Default_Item
+ITEM	_nc_Default_Item;
+
+#undef _nc_Connect_Items
+NCURSES_BOOL _nc_Connect_Items(
+		MENU	*menu,
+		ITEM	**items)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_Disconnect_Items
+void	_nc_Disconnect_Items(
+		MENU	*menu)
+		{ /* void */ }
+
+#undef _nc_Calculate_Text_Width
+int	_nc_Calculate_Text_Width(
+		const TEXT *item)
+		{ return(*(int *)0); }
+
+#undef _nc_Calculate_Item_Length_and_Width
+void	_nc_Calculate_Item_Length_and_Width(
+		MENU	*menu)
+		{ /* void */ }
+
+#undef _nc_Link_Items
+void	_nc_Link_Items(
+		MENU	*menu)
+		{ /* void */ }
+
+#undef _nc_Show_Menu
+void	_nc_Show_Menu(
+		const MENU *menu)
+		{ /* void */ }
+
+#undef _nc_New_TopRow_and_CurrentItem
+void	_nc_New_TopRow_and_CurrentItem(
+		MENU	*menu,
+		int	new_toprow,
+		ITEM	*new_current_item)
+		{ /* void */ }
+
+/* ./m_hook.c */
+
+#undef set_menu_init
+int	set_menu_init(
+		MENU	*menu,
+		Menu_Hook func)
+		{ return(*(int *)0); }
+
+#undef menu_init
+Menu_Hook menu_init(
+		const MENU *menu)
+		{ return(*(Menu_Hook *)0); }
+
+#undef set_menu_term
+int	set_menu_term(
+		MENU	*menu,
+		Menu_Hook func)
+		{ return(*(int *)0); }
+
+#undef menu_term
+Menu_Hook menu_term(
+		const MENU *menu)
+		{ return(*(Menu_Hook *)0); }
+
+#undef set_item_init
+int	set_item_init(
+		MENU	*menu,
+		Menu_Hook func)
+		{ return(*(int *)0); }
+
+#undef item_init
+Menu_Hook item_init(
+		const MENU *menu)
+		{ return(*(Menu_Hook *)0); }
+
+#undef set_item_term
+int	set_item_term(
+		MENU	*menu,
+		Menu_Hook func)
+		{ return(*(int *)0); }
+
+#undef item_term
+Menu_Hook item_term(
+		const MENU *menu)
+		{ return(*(Menu_Hook *)0); }
+
+/* ./m_item_cur.c */
+
+#undef set_current_item
+int	set_current_item(
+		MENU	*menu,
+		ITEM	*item)
+		{ return(*(int *)0); }
+
+#undef current_item
+ITEM	*current_item(
+		const MENU *menu)
+		{ return(*(ITEM **)0); }
+
+#undef item_index
+int	item_index(
+		const ITEM *item)
+		{ return(*(int *)0); }
+
+/* ./m_item_nam.c */
+
+#undef item_name
+const char *item_name(
+		const ITEM *item)
+		{ return(*(const char **)0); }
+
+#undef item_description
+const char *item_description(
+		const ITEM *item)
+		{ return(*(const char **)0); }
+
+/* ./m_item_new.c */
+
+#undef new_item
+ITEM	*new_item(
+		const char *name,
+		const char *description)
+		{ return(*(ITEM **)0); }
+
+#undef free_item
+int	free_item(
+		ITEM	*item)
+		{ return(*(int *)0); }
+
+#undef set_menu_mark
+int	set_menu_mark(
+		MENU	*menu,
+		const char *mark)
+		{ return(*(int *)0); }
+
+#undef menu_mark
+const char *menu_mark(
+		const MENU *menu)
+		{ return(*(const char **)0); }
+
+/* ./m_item_opt.c */
+
+#undef set_item_opts
+int	set_item_opts(
+		ITEM	*item,
+		Item_Options opts)
+		{ return(*(int *)0); }
+
+#undef item_opts_off
+int	item_opts_off(
+		ITEM	*item,
+		Item_Options opts)
+		{ return(*(int *)0); }
+
+#undef item_opts_on
+int	item_opts_on(
+		ITEM	*item,
+		Item_Options opts)
+		{ return(*(int *)0); }
+
+#undef item_opts
+Item_Options item_opts(
+		const ITEM *item)
+		{ return(*(Item_Options *)0); }
+
+/* ./m_item_top.c */
+
+#undef set_top_row
+int	set_top_row(
+		MENU	*menu,
+		int	row)
+		{ return(*(int *)0); }
+
+#undef top_row
+int	top_row(
+		const MENU *menu)
+		{ return(*(int *)0); }
+
+/* ./m_item_use.c */
+
+#undef set_item_userptr
+int	set_item_userptr(
+		ITEM	*item,
+		void	*userptr)
+		{ return(*(int *)0); }
+
+#undef item_userptr
+void	*item_userptr(
+		const ITEM *item)
+		{ return(*(void **)0); }
+
+/* ./m_item_val.c */
+
+#undef set_item_value
+int	set_item_value(
+		ITEM	*item,
+		NCURSES_BOOL value)
+		{ return(*(int *)0); }
+
+#undef item_value
+NCURSES_BOOL item_value(
+		const ITEM *item)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./m_item_vis.c */
+
+#undef item_visible
+NCURSES_BOOL item_visible(
+		const ITEM *item)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./m_items.c */
+
+#undef set_menu_items
+int	set_menu_items(
+		MENU	*menu,
+		ITEM	**items)
+		{ return(*(int *)0); }
+
+#undef menu_items
+ITEM	**menu_items(
+		const MENU *menu)
+		{ return(*(ITEM ***)0); }
+
+#undef item_count
+int	item_count(
+		const MENU *menu)
+		{ return(*(int *)0); }
+
+/* ./m_new.c */
+
+#undef new_menu_sp
+MENU	*new_menu_sp(
+		SCREEN	*sp,
+		ITEM	**items)
+		{ return(*(MENU **)0); }
+
+#undef new_menu
+MENU	*new_menu(
+		ITEM	**items)
+		{ return(*(MENU **)0); }
+
+#undef free_menu
+int	free_menu(
+		MENU	*menu)
+		{ return(*(int *)0); }
+
+/* ./m_opts.c */
+
+#undef set_menu_opts
+int	set_menu_opts(
+		MENU	*menu,
+		Menu_Options opts)
+		{ return(*(int *)0); }
+
+#undef menu_opts_off
+int	menu_opts_off(
+		MENU	*menu,
+		Menu_Options opts)
+		{ return(*(int *)0); }
+
+#undef menu_opts_on
+int	menu_opts_on(
+		MENU	*menu,
+		Menu_Options opts)
+		{ return(*(int *)0); }
+
+#undef menu_opts
+Menu_Options menu_opts(
+		const MENU *menu)
+		{ return(*(Menu_Options *)0); }
+
+/* ./m_pad.c */
+
+#undef set_menu_pad
+int	set_menu_pad(
+		MENU	*menu,
+		int	pad)
+		{ return(*(int *)0); }
+
+#undef menu_pad
+int	menu_pad(
+		const MENU *menu)
+		{ return(*(int *)0); }
+
+/* ./m_pattern.c */
+
+#undef menu_pattern
+char	*menu_pattern(
+		const MENU *menu)
+		{ return(*(char **)0); }
+
+#undef set_menu_pattern
+int	set_menu_pattern(
+		MENU	*menu,
+		const char *p)
+		{ return(*(int *)0); }
+
+/* ./m_post.c */
+
+#undef _nc_Post_Item
+void	_nc_Post_Item(
+		const MENU *menu,
+		const ITEM *item)
+		{ /* void */ }
+
+#undef _nc_Draw_Menu
+void	_nc_Draw_Menu(
+		const MENU *menu)
+		{ /* void */ }
+
+#undef post_menu
+int	post_menu(
+		MENU	*menu)
+		{ return(*(int *)0); }
+
+#undef unpost_menu
+int	unpost_menu(
+		MENU	*menu)
+		{ return(*(int *)0); }
+
+/* ./m_req_name.c */
+
+#undef menu_request_name
+const char *menu_request_name(
+		int	request)
+		{ return(*(const char **)0); }
+
+#undef menu_request_by_name
+int	menu_request_by_name(
+		const char *str)
+		{ return(*(int *)0); }
+
+/* ./m_scale.c */
+
+#undef scale_menu
+int	scale_menu(
+		const MENU *menu,
+		int	*rows,
+		int	*cols)
+		{ return(*(int *)0); }
+
+/* ./m_spacing.c */
+
+#undef set_menu_spacing
+int	set_menu_spacing(
+		MENU	*menu,
+		int	s_desc,
+		int	s_row,
+		int	s_col)
+		{ return(*(int *)0); }
+
+#undef menu_spacing
+int	menu_spacing(
+		const MENU *menu,
+		int	*s_desc,
+		int	*s_row,
+		int	*s_col)
+		{ return(*(int *)0); }
+
+/* ./m_sub.c */
+
+#undef set_menu_sub
+int	set_menu_sub(
+		MENU	*menu,
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+#undef menu_sub
+WINDOW	*menu_sub(
+		const MENU *menu)
+		{ return(*(WINDOW **)0); }
+
+/* ./m_trace.c */
+
+#undef _nc_retrace_item
+ITEM	*_nc_retrace_item(
+		ITEM	*code)
+		{ return(*(ITEM **)0); }
+
+#undef _nc_retrace_item_ptr
+ITEM	**_nc_retrace_item_ptr(
+		ITEM	**code)
+		{ return(*(ITEM ***)0); }
+
+#undef _nc_retrace_item_opts
+Item_Options _nc_retrace_item_opts(
+		Item_Options code)
+		{ return(*(Item_Options *)0); }
+
+#undef _nc_retrace_menu
+MENU	*_nc_retrace_menu(
+		MENU	*code)
+		{ return(*(MENU **)0); }
+
+#undef _nc_retrace_menu_hook
+Menu_Hook _nc_retrace_menu_hook(
+		Menu_Hook code)
+		{ return(*(Menu_Hook *)0); }
+
+#undef _nc_retrace_menu_opts
+Menu_Options _nc_retrace_menu_opts(
+		Menu_Options code)
+		{ return(*(Menu_Options *)0); }
+
+/* ./m_userptr.c */
+
+#undef set_menu_userptr
+int	set_menu_userptr(
+		MENU	*menu,
+		void	*userptr)
+		{ return(*(int *)0); }
+
+#undef menu_userptr
+void	*menu_userptr(
+		const MENU *menu)
+		{ return(*(void **)0); }
+
+/* ./m_win.c */
+
+#undef set_menu_win
+int	set_menu_win(
+		MENU	*menu,
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+#undef menu_win
+WINDOW	*menu_win(
+		const MENU *menu)
+		{ return(*(WINDOW **)0); }
diff --git a/menu/llib-lmenuw b/menu/llib-lmenuw
new file mode 100644
index 0000000..d5566d4
--- /dev/null
+++ b/menu/llib-lmenuw
@@ -0,0 +1,552 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 2002-2010,2015 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey       2002-on                                  *
+ ****************************************************************************/
+/* LINTLIBRARY */
+
+/* ./m_attribs.c */
+
+#include <menu.priv.h>
+
+#undef set_menu_fore
+int	set_menu_fore(
+		MENU	*menu,
+		chtype	attr)
+		{ return(*(int *)0); }
+
+#undef menu_fore
+chtype	menu_fore(
+		const MENU *menu)
+		{ return(*(chtype *)0); }
+
+#undef set_menu_back
+int	set_menu_back(
+		MENU	*menu,
+		chtype	attr)
+		{ return(*(int *)0); }
+
+#undef menu_back
+chtype	menu_back(
+		const MENU *menu)
+		{ return(*(chtype *)0); }
+
+#undef set_menu_grey
+int	set_menu_grey(
+		MENU	*menu,
+		chtype	attr)
+		{ return(*(int *)0); }
+
+#undef menu_grey
+chtype	menu_grey(
+		const MENU *menu)
+		{ return(*(chtype *)0); }
+
+/* ./m_cursor.c */
+
+#undef _nc_menu_cursor_pos
+int	_nc_menu_cursor_pos(
+		const MENU *menu,
+		const ITEM *item,
+		int	*pY,
+		int	*pX)
+		{ return(*(int *)0); }
+
+#undef pos_menu_cursor
+int	pos_menu_cursor(
+		const MENU *menu)
+		{ return(*(int *)0); }
+
+/* ./m_driver.c */
+
+#undef _nc_Match_Next_Character_In_Item_Name
+int	_nc_Match_Next_Character_In_Item_Name(
+		MENU	*menu,
+		int	ch,
+		ITEM	**item)
+		{ return(*(int *)0); }
+
+#undef menu_driver
+int	menu_driver(
+		MENU	*menu,
+		int	c)
+		{ return(*(int *)0); }
+
+/* ./m_format.c */
+
+#undef set_menu_format
+int	set_menu_format(
+		MENU	*menu,
+		int	rows,
+		int	cols)
+		{ return(*(int *)0); }
+
+#undef menu_format
+void	menu_format(
+		const MENU *menu,
+		int	*rows,
+		int	*cols)
+		{ /* void */ }
+
+/* ./m_global.c */
+
+#undef _nc_Default_Menu
+MENU	_nc_Default_Menu;
+#undef _nc_Default_Item
+ITEM	_nc_Default_Item;
+
+#undef _nc_Connect_Items
+NCURSES_BOOL _nc_Connect_Items(
+		MENU	*menu,
+		ITEM	**items)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_Disconnect_Items
+void	_nc_Disconnect_Items(
+		MENU	*menu)
+		{ /* void */ }
+
+#undef _nc_Calculate_Text_Width
+int	_nc_Calculate_Text_Width(
+		const TEXT *item)
+		{ return(*(int *)0); }
+
+#undef _nc_Calculate_Item_Length_and_Width
+void	_nc_Calculate_Item_Length_and_Width(
+		MENU	*menu)
+		{ /* void */ }
+
+#undef _nc_Link_Items
+void	_nc_Link_Items(
+		MENU	*menu)
+		{ /* void */ }
+
+#undef _nc_Show_Menu
+void	_nc_Show_Menu(
+		const MENU *menu)
+		{ /* void */ }
+
+#undef _nc_New_TopRow_and_CurrentItem
+void	_nc_New_TopRow_and_CurrentItem(
+		MENU	*menu,
+		int	new_toprow,
+		ITEM	*new_current_item)
+		{ /* void */ }
+
+/* ./m_hook.c */
+
+#undef set_menu_init
+int	set_menu_init(
+		MENU	*menu,
+		Menu_Hook func)
+		{ return(*(int *)0); }
+
+#undef menu_init
+Menu_Hook menu_init(
+		const MENU *menu)
+		{ return(*(Menu_Hook *)0); }
+
+#undef set_menu_term
+int	set_menu_term(
+		MENU	*menu,
+		Menu_Hook func)
+		{ return(*(int *)0); }
+
+#undef menu_term
+Menu_Hook menu_term(
+		const MENU *menu)
+		{ return(*(Menu_Hook *)0); }
+
+#undef set_item_init
+int	set_item_init(
+		MENU	*menu,
+		Menu_Hook func)
+		{ return(*(int *)0); }
+
+#undef item_init
+Menu_Hook item_init(
+		const MENU *menu)
+		{ return(*(Menu_Hook *)0); }
+
+#undef set_item_term
+int	set_item_term(
+		MENU	*menu,
+		Menu_Hook func)
+		{ return(*(int *)0); }
+
+#undef item_term
+Menu_Hook item_term(
+		const MENU *menu)
+		{ return(*(Menu_Hook *)0); }
+
+/* ./m_item_cur.c */
+
+#undef set_current_item
+int	set_current_item(
+		MENU	*menu,
+		ITEM	*item)
+		{ return(*(int *)0); }
+
+#undef current_item
+ITEM	*current_item(
+		const MENU *menu)
+		{ return(*(ITEM **)0); }
+
+#undef item_index
+int	item_index(
+		const ITEM *item)
+		{ return(*(int *)0); }
+
+/* ./m_item_nam.c */
+
+#undef item_name
+const char *item_name(
+		const ITEM *item)
+		{ return(*(const char **)0); }
+
+#undef item_description
+const char *item_description(
+		const ITEM *item)
+		{ return(*(const char **)0); }
+
+/* ./m_item_new.c */
+
+#undef new_item
+ITEM	*new_item(
+		const char *name,
+		const char *description)
+		{ return(*(ITEM **)0); }
+
+#undef free_item
+int	free_item(
+		ITEM	*item)
+		{ return(*(int *)0); }
+
+#undef set_menu_mark
+int	set_menu_mark(
+		MENU	*menu,
+		const char *mark)
+		{ return(*(int *)0); }
+
+#undef menu_mark
+const char *menu_mark(
+		const MENU *menu)
+		{ return(*(const char **)0); }
+
+/* ./m_item_opt.c */
+
+#undef set_item_opts
+int	set_item_opts(
+		ITEM	*item,
+		Item_Options opts)
+		{ return(*(int *)0); }
+
+#undef item_opts_off
+int	item_opts_off(
+		ITEM	*item,
+		Item_Options opts)
+		{ return(*(int *)0); }
+
+#undef item_opts_on
+int	item_opts_on(
+		ITEM	*item,
+		Item_Options opts)
+		{ return(*(int *)0); }
+
+#undef item_opts
+Item_Options item_opts(
+		const ITEM *item)
+		{ return(*(Item_Options *)0); }
+
+/* ./m_item_top.c */
+
+#undef set_top_row
+int	set_top_row(
+		MENU	*menu,
+		int	row)
+		{ return(*(int *)0); }
+
+#undef top_row
+int	top_row(
+		const MENU *menu)
+		{ return(*(int *)0); }
+
+/* ./m_item_use.c */
+
+#undef set_item_userptr
+int	set_item_userptr(
+		ITEM	*item,
+		void	*userptr)
+		{ return(*(int *)0); }
+
+#undef item_userptr
+void	*item_userptr(
+		const ITEM *item)
+		{ return(*(void **)0); }
+
+/* ./m_item_val.c */
+
+#undef set_item_value
+int	set_item_value(
+		ITEM	*item,
+		NCURSES_BOOL value)
+		{ return(*(int *)0); }
+
+#undef item_value
+NCURSES_BOOL item_value(
+		const ITEM *item)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./m_item_vis.c */
+
+#undef item_visible
+NCURSES_BOOL item_visible(
+		const ITEM *item)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./m_items.c */
+
+#undef set_menu_items
+int	set_menu_items(
+		MENU	*menu,
+		ITEM	**items)
+		{ return(*(int *)0); }
+
+#undef menu_items
+ITEM	**menu_items(
+		const MENU *menu)
+		{ return(*(ITEM ***)0); }
+
+#undef item_count
+int	item_count(
+		const MENU *menu)
+		{ return(*(int *)0); }
+
+/* ./m_new.c */
+
+#undef new_menu_sp
+MENU	*new_menu_sp(
+		SCREEN	*sp,
+		ITEM	**items)
+		{ return(*(MENU **)0); }
+
+#undef new_menu
+MENU	*new_menu(
+		ITEM	**items)
+		{ return(*(MENU **)0); }
+
+#undef free_menu
+int	free_menu(
+		MENU	*menu)
+		{ return(*(int *)0); }
+
+/* ./m_opts.c */
+
+#undef set_menu_opts
+int	set_menu_opts(
+		MENU	*menu,
+		Menu_Options opts)
+		{ return(*(int *)0); }
+
+#undef menu_opts_off
+int	menu_opts_off(
+		MENU	*menu,
+		Menu_Options opts)
+		{ return(*(int *)0); }
+
+#undef menu_opts_on
+int	menu_opts_on(
+		MENU	*menu,
+		Menu_Options opts)
+		{ return(*(int *)0); }
+
+#undef menu_opts
+Menu_Options menu_opts(
+		const MENU *menu)
+		{ return(*(Menu_Options *)0); }
+
+/* ./m_pad.c */
+
+#undef set_menu_pad
+int	set_menu_pad(
+		MENU	*menu,
+		int	pad)
+		{ return(*(int *)0); }
+
+#undef menu_pad
+int	menu_pad(
+		const MENU *menu)
+		{ return(*(int *)0); }
+
+/* ./m_pattern.c */
+
+#undef menu_pattern
+char	*menu_pattern(
+		const MENU *menu)
+		{ return(*(char **)0); }
+
+#undef set_menu_pattern
+int	set_menu_pattern(
+		MENU	*menu,
+		const char *p)
+		{ return(*(int *)0); }
+
+/* ./m_post.c */
+
+#undef _nc_Post_Item
+void	_nc_Post_Item(
+		const MENU *menu,
+		const ITEM *item)
+		{ /* void */ }
+
+#undef _nc_Draw_Menu
+void	_nc_Draw_Menu(
+		const MENU *menu)
+		{ /* void */ }
+
+#undef post_menu
+int	post_menu(
+		MENU	*menu)
+		{ return(*(int *)0); }
+
+#undef unpost_menu
+int	unpost_menu(
+		MENU	*menu)
+		{ return(*(int *)0); }
+
+/* ./m_req_name.c */
+
+#undef menu_request_name
+const char *menu_request_name(
+		int	request)
+		{ return(*(const char **)0); }
+
+#undef menu_request_by_name
+int	menu_request_by_name(
+		const char *str)
+		{ return(*(int *)0); }
+
+/* ./m_scale.c */
+
+#undef scale_menu
+int	scale_menu(
+		const MENU *menu,
+		int	*rows,
+		int	*cols)
+		{ return(*(int *)0); }
+
+/* ./m_spacing.c */
+
+#undef set_menu_spacing
+int	set_menu_spacing(
+		MENU	*menu,
+		int	s_desc,
+		int	s_row,
+		int	s_col)
+		{ return(*(int *)0); }
+
+#undef menu_spacing
+int	menu_spacing(
+		const MENU *menu,
+		int	*s_desc,
+		int	*s_row,
+		int	*s_col)
+		{ return(*(int *)0); }
+
+/* ./m_sub.c */
+
+#undef set_menu_sub
+int	set_menu_sub(
+		MENU	*menu,
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+#undef menu_sub
+WINDOW	*menu_sub(
+		const MENU *menu)
+		{ return(*(WINDOW **)0); }
+
+/* ./m_trace.c */
+
+#undef _nc_retrace_item
+ITEM	*_nc_retrace_item(
+		ITEM	*code)
+		{ return(*(ITEM **)0); }
+
+#undef _nc_retrace_item_ptr
+ITEM	**_nc_retrace_item_ptr(
+		ITEM	**code)
+		{ return(*(ITEM ***)0); }
+
+#undef _nc_retrace_item_opts
+Item_Options _nc_retrace_item_opts(
+		Item_Options code)
+		{ return(*(Item_Options *)0); }
+
+#undef _nc_retrace_menu
+MENU	*_nc_retrace_menu(
+		MENU	*code)
+		{ return(*(MENU **)0); }
+
+#undef _nc_retrace_menu_hook
+Menu_Hook _nc_retrace_menu_hook(
+		Menu_Hook code)
+		{ return(*(Menu_Hook *)0); }
+
+#undef _nc_retrace_menu_opts
+Menu_Options _nc_retrace_menu_opts(
+		Menu_Options code)
+		{ return(*(Menu_Options *)0); }
+
+/* ./m_userptr.c */
+
+#undef set_menu_userptr
+int	set_menu_userptr(
+		MENU	*menu,
+		void	*userptr)
+		{ return(*(int *)0); }
+
+#undef menu_userptr
+void	*menu_userptr(
+		const MENU *menu)
+		{ return(*(void **)0); }
+
+/* ./m_win.c */
+
+#undef set_menu_win
+int	set_menu_win(
+		MENU	*menu,
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+#undef menu_win
+WINDOW	*menu_win(
+		const MENU *menu)
+		{ return(*(WINDOW **)0); }
diff --git a/menu/m_attribs.c b/menu/m_attribs.c
new file mode 100644
index 0000000..a9275d0
--- /dev/null
+++ b/menu/m_attribs.c
@@ -0,0 +1,145 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2010,2012 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+/***************************************************************************
+* Module m_attribs                                                         *
+* Control menus display attributes                                         *
+***************************************************************************/
+
+#include "menu.priv.h"
+
+MODULE_ID("$Id: m_attribs.c,v 1.20 2021/06/17 21:20:30 tom Exp $")
+
+/* Macro to redraw menu if it is posted and changed */
+#define Refresh_Menu(menu) \
+   if ( (menu) && ((menu)->status & _POSTED) )\
+   {\
+      _nc_Draw_Menu( menu );\
+      _nc_Show_Menu( menu );\
+   }
+
+/* "Template" macro to generate a function to set a menus attribute */
+#define GEN_MENU_ATTR_SET_FCT( name ) \
+MENU_EXPORT(int) NCURSES_API set_menu_ ## name (MENU* menu, chtype attr) \
+{\
+  T((T_CALLED("set_menu_" #name "(%p,%s)"), (void *) menu, _traceattr(attr))); \
+   if (!(attr==A_NORMAL || (attr & A_ATTRIBUTES)==attr))\
+      RETURN(E_BAD_ARGUMENT);\
+   if (menu && ( menu -> name != attr))\
+     {\
+       (menu -> name) = attr;\
+       Refresh_Menu(menu);\
+     }\
+   Normalize_Menu( menu ) -> name = attr;\
+   RETURN(E_OK);\
+}
+
+/* "Template" macro to generate a function to get a menu's attribute */
+#define GEN_MENU_ATTR_GET_FCT( name ) \
+MENU_EXPORT(chtype) NCURSES_API menu_ ## name (const MENU * menu)\
+{\
+   T((T_CALLED("menu_" #name "(%p)"), (const void *) menu));\
+   returnAttr(Normalize_Menu( menu ) -> name);\
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  int set_menu_fore(MENU *menu, chtype attr)
+|
+|   Description   :  Set the attribute for selectable items. In single-
+|                    valued menus this is used to highlight the current
+|                    item ((i.e. where the cursor is), in multi-valued
+|                    menus this is used to highlight the selected items.
+|
+|   Return Values :  E_OK              - success
+|                    E_BAD_ARGUMENT    - an invalid value has been passed
++--------------------------------------------------------------------------*/
+GEN_MENU_ATTR_SET_FCT(fore)
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  chtype menu_fore(const MENU* menu)
+|
+|   Description   :  Return the attribute used for selectable items that
+|                    are current (single-valued menu) or selected (multi-
+|                    valued menu).
+|
+|   Return Values :  Attribute value
++--------------------------------------------------------------------------*/
+GEN_MENU_ATTR_GET_FCT(fore)
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  int set_menu_back(MENU *menu, chtype attr)
+|
+|   Description   :  Set the attribute for selectable but not yet selected
+|                    items.
+|
+|   Return Values :  E_OK             - success
+|                    E_BAD_ARGUMENT   - an invalid value has been passed
++--------------------------------------------------------------------------*/
+GEN_MENU_ATTR_SET_FCT(back)
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  chtype menu_back(const MENU *menu)
+|
+|   Description   :  Return the attribute used for selectable but not yet
+|                    selected items.
+|
+|   Return Values :  Attribute value
++--------------------------------------------------------------------------*/
+GEN_MENU_ATTR_GET_FCT(back)
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  int set_menu_grey(MENU *menu, chtype attr)
+|
+|   Description   :  Set the attribute for unselectable items.
+|
+|   Return Values :  E_OK             - success
+|                    E_BAD_ARGUMENT   - an invalid value has been passed
++--------------------------------------------------------------------------*/
+GEN_MENU_ATTR_SET_FCT(grey)
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  chtype menu_grey(const MENU *menu)
+|
+|   Description   :  Return the attribute used for non-selectable items
+|
+|   Return Values :  Attribute value
++--------------------------------------------------------------------------*/
+GEN_MENU_ATTR_GET_FCT(grey)
+
+/* m_attribs.c ends here */
diff --git a/menu/m_cursor.c b/menu/m_cursor.c
new file mode 100644
index 0000000..b9b301d
--- /dev/null
+++ b/menu/m_cursor.c
@@ -0,0 +1,113 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2009,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+/***************************************************************************
+* Module m_cursor                                                          *
+* Correctly position a menu's cursor                                       *
+***************************************************************************/
+
+#include "menu.priv.h"
+
+MODULE_ID("$Id: m_cursor.c,v 1.26 2021/03/27 23:46:29 tom Exp $")
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  _nc_menu_cursor_pos
+|
+|   Description   :  Return position of logical cursor to current item
+|
+|   Return Values :  E_OK            - success
+|                    E_BAD_ARGUMENT  - invalid menu
+|                    E_NOT_POSTED    - Menu is not posted
++--------------------------------------------------------------------------*/
+MENU_EXPORT(int)
+_nc_menu_cursor_pos(const MENU *menu, const ITEM *item, int *pY, int *pX)
+{
+  if (!menu || !pX || !pY)
+    return (E_BAD_ARGUMENT);
+  else
+    {
+      if ((ITEM *)0 == item)
+	item = menu->curitem;
+      assert(item != (ITEM *)0);
+
+      if (!(menu->status & _POSTED))
+	return (E_NOT_POSTED);
+
+      *pX = item->x * (menu->spc_cols + menu->itemlen);
+      *pY = (item->y - menu->toprow) * menu->spc_rows;
+    }
+  return (E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  pos_menu_cursor
+|
+|   Description   :  Position logical cursor to current item in menu
+|
+|   Return Values :  E_OK            - success
+|                    E_BAD_ARGUMENT  - invalid menu
+|                    E_NOT_POSTED    - Menu is not posted
++--------------------------------------------------------------------------*/
+MENU_EXPORT(int)
+pos_menu_cursor(const MENU *menu)
+{
+  int x = 0, y = 0;
+  int err = _nc_menu_cursor_pos(menu, (ITEM *)0, &y, &x);
+
+  T((T_CALLED("pos_menu_cursor(%p)"), (const void *)menu));
+
+  if (E_OK == err)
+    {
+      WINDOW *win = Get_Menu_UserWin(menu);
+      WINDOW *sub = menu->usersub ? menu->usersub : win;
+
+      assert(win && sub);
+
+      if ((menu->opt & O_SHOWMATCH) && (menu->pindex > 0))
+	x += (menu->pindex + menu->marklen - 1);
+
+      wmove(sub, y, x);
+
+      if (win != sub)
+	{
+	  wcursyncup(sub);
+	  wsyncup(sub);
+	  untouchwin(sub);
+	}
+    }
+  RETURN(err);
+}
+
+/* m_cursor.c ends here */
diff --git a/menu/m_driver.c b/menu/m_driver.c
new file mode 100644
index 0000000..cf2ef2f
--- /dev/null
+++ b/menu/m_driver.c
@@ -0,0 +1,571 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2012,2016 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+/***************************************************************************
+* Module m_driver                                                          *
+* Central dispatching routine                                              *
+***************************************************************************/
+
+#include "menu.priv.h"
+
+MODULE_ID("$Id: m_driver.c,v 1.37 2021/03/27 23:46:29 tom Exp $")
+
+/* Macros */
+
+/* Remove the last character from the match pattern buffer */
+#define Remove_Character_From_Pattern(menu) \
+  (menu)->pattern[--((menu)->pindex)] = '\0'
+
+/* Add a new character to the match pattern buffer */
+#define Add_Character_To_Pattern(menu,ch) \
+  { (menu)->pattern[((menu)->pindex)++] = (char) (ch);\
+    (menu)->pattern[(menu)->pindex] = '\0'; }
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  static bool Is_Sub_String(
+|                           bool IgnoreCaseFlag,
+|                           const char *part,
+|                           const char *string)
+|
+|   Description   :  Checks whether or not part is a substring of string.
+|
+|   Return Values :  TRUE   - if it is a substring
+|                    FALSE  - if it is not a substring
++--------------------------------------------------------------------------*/
+static bool
+Is_Sub_String(
+	       bool IgnoreCaseFlag,
+	       const char *part,
+	       const char *string
+)
+{
+  assert(part && string);
+  if (IgnoreCaseFlag)
+    {
+      while (*string && *part)
+	{
+	  if (toupper(UChar(*string++)) != toupper(UChar(*part)))
+	    break;
+	  part++;
+	}
+    }
+  else
+    {
+      while (*string && *part)
+	if (*part != *string++)
+	  break;
+      part++;
+    }
+  return ((*part) ? FALSE : TRUE);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  int _nc_Match_Next_Character_In_Item_Name(
+|                           MENU *menu,
+|                           int  ch,
+|                           ITEM **item)
+|
+|   Description   :  This internal routine is called for a menu positioned
+|                    at an item with three different classes of characters:
+|                       - a printable character; the character is added to
+|                         the current pattern and the next item matching
+|                         this pattern is searched.
+|                       - NUL; the pattern stays as it is and the next item
+|                         matching the pattern is searched
+|                       - BS; the pattern stays as it is and the previous
+|                         item matching the pattern is searched
+|
+|                       The item parameter contains on call a pointer to
+|                       the item where the search starts. On return - if
+|                       a match was found - it contains a pointer to the
+|                       matching item.
+|
+|   Return Values :  E_OK        - an item matching the pattern was found
+|                    E_NO_MATCH  - nothing found
++--------------------------------------------------------------------------*/
+MENU_EXPORT(int)
+_nc_Match_Next_Character_In_Item_Name
+(MENU *menu, int ch, ITEM **item)
+{
+  bool found = FALSE, passed = FALSE;
+  int idx, last;
+
+  T((T_CALLED("_nc_Match_Next_Character(%p,%d,%p)"),
+     (void *)menu, ch, (void *)item));
+
+  assert(menu && item && *item);
+  idx = (*item)->index;
+
+  if (ch && ch != BS)
+    {
+      /* if we become to long, we need no further checking : there can't be
+         a match ! */
+      if ((menu->pindex + 1) > menu->namelen)
+	RETURN(E_NO_MATCH);
+
+      Add_Character_To_Pattern(menu, ch);
+      /* we artificially position one item back, because in the do...while
+         loop we start with the next item. This means, that with a new
+         pattern search we always start the scan with the actual item. If
+         we do a NEXT_PATTERN or PREV_PATTERN search, we start with the
+         one after or before the actual item. */
+      if (--idx < 0)
+	idx = menu->nitems - 1;
+    }
+
+  last = idx;			/* this closes the cycle */
+
+  do
+    {
+      if (ch == BS)
+	{			/* we have to go backward */
+	  if (--idx < 0)
+	    idx = menu->nitems - 1;
+	}
+      else
+	{			/* otherwise we always go forward */
+	  if (++idx >= menu->nitems)
+	    idx = 0;
+	}
+      if (Is_Sub_String((bool)((menu->opt & O_IGNORECASE) != 0),
+			menu->pattern,
+			menu->items[idx]->name.str)
+	)
+	found = TRUE;
+      else
+	passed = TRUE;
+    }
+  while (!found && (idx != last));
+
+  if (found)
+    {
+      if (!((idx == (*item)->index) && passed))
+	{
+	  *item = menu->items[idx];
+	  RETURN(E_OK);
+	}
+      /* This point is reached, if we fully cycled through the item list
+         and the only match we found is the starting item. With a NEXT_PATTERN
+         or PREV_PATTERN scan this means, that there was no additional match.
+         If we searched with an expanded new pattern, we should never reach
+         this point, because if the expanded pattern matches also the actual
+         item we will find it in the first attempt (passed==FALSE) and we
+         will never cycle through the whole item array.
+       */
+      assert(ch == 0 || ch == BS);
+    }
+  else
+    {
+      if (ch && ch != BS && menu->pindex > 0)
+	{
+	  /* if we had no match with a new pattern, we have to restore it */
+	  Remove_Character_From_Pattern(menu);
+	}
+    }
+  RETURN(E_NO_MATCH);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  int menu_driver(MENU* menu, int c)
+|
+|   Description   :  Central dispatcher for the menu. Translates the logical
+|                    request 'c' into a menu action.
+|
+|   Return Values :  E_OK            - success
+|                    E_BAD_ARGUMENT  - invalid menu pointer
+|                    E_BAD_STATE     - menu is in user hook routine
+|                    E_NOT_POSTED    - menu is not posted
++--------------------------------------------------------------------------*/
+MENU_EXPORT(int)
+menu_driver(MENU *menu, int c)
+{
+#define NAVIGATE(dir) \
+  if (!item->dir)\
+     result = E_REQUEST_DENIED;\
+  else\
+     item = item->dir
+
+  int result = E_OK;
+  ITEM *item;
+  int my_top_row;
+
+  T((T_CALLED("menu_driver(%p,%d)"), (void *)menu, c));
+
+  if (!menu)
+    RETURN(E_BAD_ARGUMENT);
+
+  if (menu->status & _IN_DRIVER)
+    RETURN(E_BAD_STATE);
+  if (!(menu->status & _POSTED))
+    RETURN(E_NOT_POSTED);
+
+  item = menu->curitem;
+
+  my_top_row = menu->toprow;
+  assert(item);
+
+  if ((c > KEY_MAX) && (c <= MAX_MENU_COMMAND))
+    {
+      int rdiff;
+
+      if (!((c == REQ_BACK_PATTERN)
+	    || (c == REQ_NEXT_MATCH) || (c == REQ_PREV_MATCH)))
+	{
+	  assert(menu->pattern);
+	  Reset_Pattern(menu);
+	}
+
+      switch (c)
+	{
+	case REQ_LEFT_ITEM:
+	    /*=================*/
+	  NAVIGATE(left);
+	  break;
+
+	case REQ_RIGHT_ITEM:
+	    /*==================*/
+	  NAVIGATE(right);
+	  break;
+
+	case REQ_UP_ITEM:
+	    /*===============*/
+	  NAVIGATE(up);
+	  break;
+
+	case REQ_DOWN_ITEM:
+	    /*=================*/
+	  NAVIGATE(down);
+	  break;
+
+	case REQ_SCR_ULINE:
+	    /*=================*/
+	  if (my_top_row == 0 || !(item->up))
+	    result = E_REQUEST_DENIED;
+	  else
+	    {
+	      --my_top_row;
+	      item = item->up;
+	    }
+	  break;
+
+	case REQ_SCR_DLINE:
+	    /*=================*/
+	  if ((my_top_row + menu->arows >= menu->rows) || !(item->down))
+	    {
+	      /* only if the menu has less items than rows, we can deny the
+	         request. Otherwise the epilogue of this routine adjusts the
+	         top row if necessary */
+	      result = E_REQUEST_DENIED;
+	    }
+	  else
+	    {
+	      my_top_row++;
+	      item = item->down;
+	    }
+	  break;
+
+	case REQ_SCR_DPAGE:
+	    /*=================*/
+	  rdiff = menu->rows - (menu->arows + my_top_row);
+	  if (rdiff > menu->arows)
+	    rdiff = menu->arows;
+	  if (rdiff <= 0)
+	    result = E_REQUEST_DENIED;
+	  else
+	    {
+	      my_top_row += rdiff;
+	      while (rdiff-- > 0 && item != 0 && item->down != 0)
+		item = item->down;
+	    }
+	  break;
+
+	case REQ_SCR_UPAGE:
+	    /*=================*/
+	  rdiff = (menu->arows < my_top_row) ? menu->arows : my_top_row;
+	  if (rdiff <= 0)
+	    result = E_REQUEST_DENIED;
+	  else
+	    {
+	      my_top_row -= rdiff;
+	      while (rdiff-- > 0 && item != 0 && item->up != 0)
+		item = item->up;
+	    }
+	  break;
+
+	case REQ_FIRST_ITEM:
+	    /*==================*/
+	  item = menu->items[0];
+	  break;
+
+	case REQ_LAST_ITEM:
+	    /*=================*/
+	  item = menu->items[menu->nitems - 1];
+	  break;
+
+	case REQ_NEXT_ITEM:
+	    /*=================*/
+	  if ((item->index + 1) >= menu->nitems)
+	    {
+	      if (menu->opt & O_NONCYCLIC)
+		result = E_REQUEST_DENIED;
+	      else
+		item = menu->items[0];
+	    }
+	  else
+	    item = menu->items[item->index + 1];
+	  break;
+
+	case REQ_PREV_ITEM:
+	    /*=================*/
+	  if (item->index <= 0)
+	    {
+	      if (menu->opt & O_NONCYCLIC)
+		result = E_REQUEST_DENIED;
+	      else
+		item = menu->items[menu->nitems - 1];
+	    }
+	  else
+	    item = menu->items[item->index - 1];
+	  break;
+
+	case REQ_TOGGLE_ITEM:
+	    /*===================*/
+	  if (menu->opt & O_ONEVALUE)
+	    {
+	      result = E_REQUEST_DENIED;
+	    }
+	  else
+	    {
+	      if (menu->curitem->opt & O_SELECTABLE)
+		{
+		  menu->curitem->value = !menu->curitem->value;
+		  Move_And_Post_Item(menu, menu->curitem);
+		  _nc_Show_Menu(menu);
+		}
+	      else
+		result = E_NOT_SELECTABLE;
+	    }
+	  break;
+
+	case REQ_CLEAR_PATTERN:
+	    /*=====================*/
+	  /* already cleared in prologue */
+	  break;
+
+	case REQ_BACK_PATTERN:
+	    /*====================*/
+	  if (menu->pindex > 0)
+	    {
+	      assert(menu->pattern);
+	      Remove_Character_From_Pattern(menu);
+	      pos_menu_cursor(menu);
+	    }
+	  else
+	    result = E_REQUEST_DENIED;
+	  break;
+
+	case REQ_NEXT_MATCH:
+	    /*==================*/
+	  assert(menu->pattern);
+	  if (menu->pattern[0])
+	    result = _nc_Match_Next_Character_In_Item_Name(menu, 0, &item);
+	  else
+	    {
+	      if ((item->index + 1) < menu->nitems)
+		item = menu->items[item->index + 1];
+	      else
+		{
+		  if (menu->opt & O_NONCYCLIC)
+		    result = E_REQUEST_DENIED;
+		  else
+		    item = menu->items[0];
+		}
+	    }
+	  break;
+
+	case REQ_PREV_MATCH:
+	    /*==================*/
+	  assert(menu->pattern);
+	  if (menu->pattern[0])
+	    result = _nc_Match_Next_Character_In_Item_Name(menu, BS, &item);
+	  else
+	    {
+	      if (item->index)
+		item = menu->items[item->index - 1];
+	      else
+		{
+		  if (menu->opt & O_NONCYCLIC)
+		    result = E_REQUEST_DENIED;
+		  else
+		    item = menu->items[menu->nitems - 1];
+		}
+	    }
+	  break;
+
+	default:
+	    /*======*/
+	  result = E_UNKNOWN_COMMAND;
+	  break;
+	}
+    }
+  else
+    {				/* not a command */
+      if (!(c & ~((int)MAX_REGULAR_CHARACTER)) && isprint(UChar(c)))
+	result = _nc_Match_Next_Character_In_Item_Name(menu, c, &item);
+#ifdef NCURSES_MOUSE_VERSION
+      else if (KEY_MOUSE == c)
+	{
+	  MEVENT event;
+	  WINDOW *uwin = Get_Menu_UserWin(menu);
+
+	  getmouse(&event);
+	  if ((event.bstate & (BUTTON1_CLICKED |
+			       BUTTON1_DOUBLE_CLICKED |
+			       BUTTON1_TRIPLE_CLICKED))
+	      && wenclose(uwin, event.y, event.x))
+	    {			/* we react only if the click was in the userwin, that means
+				 * inside the menu display area or at the decoration window.
+				 */
+	      WINDOW *sub = Get_Menu_Window(menu);
+	      int ry = event.y, rx = event.x;	/* screen coordinates */
+
+	      result = E_REQUEST_DENIED;
+	      if (mouse_trafo(&ry, &rx, FALSE))
+		{		/* rx, ry are now "curses" coordinates */
+		  if (ry < sub->_begy)
+		    {		/* we clicked above the display region; this is
+				 * interpreted as "scroll up" request
+				 */
+		      if (event.bstate & BUTTON1_CLICKED)
+			result = menu_driver(menu, REQ_SCR_ULINE);
+		      else if (event.bstate & BUTTON1_DOUBLE_CLICKED)
+			result = menu_driver(menu, REQ_SCR_UPAGE);
+		      else if (event.bstate & BUTTON1_TRIPLE_CLICKED)
+			result = menu_driver(menu, REQ_FIRST_ITEM);
+		      RETURN(result);
+		    }
+		  else if (ry > sub->_begy + sub->_maxy)
+		    {		/* we clicked below the display region; this is
+				 * interpreted as "scroll down" request
+				 */
+		      if (event.bstate & BUTTON1_CLICKED)
+			result = menu_driver(menu, REQ_SCR_DLINE);
+		      else if (event.bstate & BUTTON1_DOUBLE_CLICKED)
+			result = menu_driver(menu, REQ_SCR_DPAGE);
+		      else if (event.bstate & BUTTON1_TRIPLE_CLICKED)
+			result = menu_driver(menu, REQ_LAST_ITEM);
+		      RETURN(result);
+		    }
+		  else if (wenclose(sub, event.y, event.x))
+		    {		/* Inside the area we try to find the hit item */
+		      int x, y;
+
+		      ry = event.y;
+		      rx = event.x;
+		      if (wmouse_trafo(sub, &ry, &rx, FALSE))
+			{
+			  int i;
+
+			  for (i = 0; i < menu->nitems; i++)
+			    {
+			      int err = _nc_menu_cursor_pos(menu,
+							    menu->items[i],
+							    &y, &x);
+
+			      if (E_OK == err)
+				{
+				  if ((ry == y) &&
+				      (rx >= x) &&
+				      (rx < x + menu->itemlen))
+				    {
+				      item = menu->items[i];
+				      result = E_OK;
+				      break;
+				    }
+				}
+			    }
+			  if (E_OK == result)
+			    {	/* We found an item, now we can handle the click.
+				 * A single click just positions the menu cursor
+				 * to the clicked item. A double click toggles
+				 * the item.
+				 */
+			      if (event.bstate & BUTTON1_DOUBLE_CLICKED)
+				{
+				  _nc_New_TopRow_and_CurrentItem(menu,
+								 my_top_row,
+								 item);
+				  menu_driver(menu, REQ_TOGGLE_ITEM);
+				  result = E_UNKNOWN_COMMAND;
+				}
+			    }
+			}
+		    }
+		}
+	    }
+	  else
+	    {
+	      if (menu->opt & O_MOUSE_MENU)
+		ungetmouse(&event);	/* let someone else handle this */
+	      result = E_REQUEST_DENIED;
+	    }
+	}
+#endif /* NCURSES_MOUSE_VERSION */
+      else
+	result = E_UNKNOWN_COMMAND;
+    }
+
+  if (item == 0)
+    {
+      result = E_BAD_STATE;
+    }
+  else if (E_OK == result)
+    {
+      /* Adjust the top row if it turns out that the current item unfortunately
+         doesn't appear in the menu window */
+      if (item->y < my_top_row)
+	my_top_row = item->y;
+      else if (item->y >= (my_top_row + menu->arows))
+	my_top_row = item->y - menu->arows + 1;
+
+      _nc_New_TopRow_and_CurrentItem(menu, my_top_row, item);
+
+    }
+
+  RETURN(result);
+}
+
+/* m_driver.c ends here */
diff --git a/menu/m_format.c b/menu/m_format.c
new file mode 100644
index 0000000..65adfc6
--- /dev/null
+++ b/menu/m_format.c
@@ -0,0 +1,133 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2010,2012 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+/***************************************************************************
+* Module m_format                                                          *
+* Set and get maximum numbers of rows and columns in menus                 *
+***************************************************************************/
+
+#include "menu.priv.h"
+
+MODULE_ID("$Id: m_format.c,v 1.22 2021/03/27 23:46:29 tom Exp $")
+
+#define minimum(a,b) ((a)<(b) ? (a): (b))
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  int set_menu_format(MENU *menu, int rows, int cols)
+|
+|   Description   :  Sets the maximum number of rows and columns of items
+|                    that may be displayed at one time on a menu. If the
+|                    menu contains more items than can be displayed at
+|                    once, the menu will be scrollable.
+|
+|   Return Values :  E_OK                   - success
+|                    E_BAD_ARGUMENT         - invalid values passed
+|                    E_NOT_CONNECTED        - there are no items connected
+|                    E_POSTED               - the menu is already posted
++--------------------------------------------------------------------------*/
+MENU_EXPORT(int)
+set_menu_format(MENU *menu, int rows, int cols)
+{
+
+  T((T_CALLED("set_menu_format(%p,%d,%d)"), (void *)menu, rows, cols));
+
+  if (rows < 0 || cols < 0)
+    RETURN(E_BAD_ARGUMENT);
+
+  if (menu)
+    {
+      int total_rows, total_cols;
+
+      if (menu->status & _POSTED)
+	RETURN(E_POSTED);
+
+      if (!(menu->items))
+	RETURN(E_NOT_CONNECTED);
+
+      if (rows == 0)
+	rows = menu->frows;
+      if (cols == 0)
+	cols = menu->fcols;
+
+      if (menu->pattern)
+	Reset_Pattern(menu);
+
+      menu->frows = (short)rows;
+      menu->fcols = (short)cols;
+
+      assert(rows > 0 && cols > 0);
+      total_rows = (menu->nitems - 1) / cols + 1;
+      total_cols = (menu->opt & O_ROWMAJOR) ?
+	minimum(menu->nitems, cols) :
+	(menu->nitems - 1) / total_rows + 1;
+
+      menu->rows = (short)total_rows;
+      menu->cols = (short)total_cols;
+      menu->arows = (short)minimum(total_rows, rows);
+      menu->toprow = 0;
+      menu->curitem = *(menu->items);
+      assert(menu->curitem);
+      SetStatus(menu, _LINK_NEEDED);
+      _nc_Calculate_Item_Length_and_Width(menu);
+    }
+  else
+    {
+      if (rows > 0)
+	_nc_Default_Menu.frows = (short)rows;
+      if (cols > 0)
+	_nc_Default_Menu.fcols = (short)cols;
+    }
+
+  RETURN(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  void menu_format(const MENU *menu, int *rows, int *cols)
+|
+|   Description   :  Returns the maximum number of rows and columns that may
+|                    be displayed at one time on menu.
+|
+|   Return Values :  -
++--------------------------------------------------------------------------*/
+MENU_EXPORT(void)
+menu_format(const MENU *menu, int *rows, int *cols)
+{
+  if (rows)
+    *rows = Normalize_Menu(menu)->frows;
+  if (cols)
+    *cols = Normalize_Menu(menu)->fcols;
+}
+
+/* m_format.c ends here */
diff --git a/menu/m_global.c b/menu/m_global.c
new file mode 100644
index 0000000..4ec08c5
--- /dev/null
+++ b/menu/m_global.c
@@ -0,0 +1,601 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2012,2014 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+/***************************************************************************
+* Module m_global                                                          *
+* Globally used internal routines and the default menu and item structures *
+***************************************************************************/
+
+#include "menu.priv.h"
+
+MODULE_ID("$Id: m_global.c,v 1.33 2021/03/27 23:46:29 tom Exp $")
+
+static char mark[] = "-";
+/* *INDENT-OFF* */
+MENU_EXPORT_VAR(MENU) _nc_Default_Menu = {
+  16,				  /* Nr. of chars high */
+  1,				  /* Nr. of chars wide */
+  16,				  /* Nr. of items high */
+  1,			          /* Nr. of items wide */
+  16,				  /* Nr. of formatted items high */
+  1,				  /* Nr. of formatted items wide */
+  16,				  /* Nr. of items high (actual) */
+  0,				  /* length of widest name */
+  0,				  /* length of widest description */
+  1,				  /* length of mark */
+  1,				  /* length of one item */
+  1,                              /* Spacing for descriptor */
+  1,                              /* Spacing for columns */
+  1,                              /* Spacing for rows */
+  (char *)0,			  /* buffer used to store match chars */
+  0,				  /* Index into pattern buffer */
+  (WINDOW *)0,			  /* Window containing entire menu */
+  (WINDOW *)0,			  /* Portion of menu displayed */
+  (WINDOW *)0,			  /* User's window */
+  (WINDOW *)0,			  /* User's subwindow */
+  (ITEM **)0,			  /* List of items */
+  0,				  /* Total Nr. of items in menu */
+  (ITEM *)0,			  /* Current item */
+  0,				  /* Top row of menu */
+  (chtype)A_REVERSE,		  /* Attribute for selection */
+  (chtype)A_NORMAL,		  /* Attribute for nonselection */
+  (chtype)A_UNDERLINE,		  /* Attribute for inactive */
+  ' ',  			  /* Pad character */
+  (Menu_Hook)0,			  /* Menu init */
+  (Menu_Hook)0,			  /* Menu term */
+  (Menu_Hook)0,			  /* Item init */
+  (Menu_Hook)0,			  /* Item term */
+  (void *)0,			  /* userptr */
+  mark,				  /* mark */
+  ALL_MENU_OPTS,                  /* options */
+  0			          /* status */
+};
+
+MENU_EXPORT_VAR(ITEM) _nc_Default_Item = {
+  { (char *)0, 0 },		  /* name */
+  { (char *)0, 0 },		  /* description */
+  (MENU *)0,		          /* Pointer to parent menu */
+  (char *)0,			  /* Userpointer */
+  ALL_ITEM_OPTS,		  /* options */
+  0,				  /* Item Nr. */
+  0,				  /* y */
+  0,				  /* x */
+  FALSE,			  /* value */
+  (ITEM *)0,		          /* left */
+  (ITEM *)0,		          /* right */
+  (ITEM *)0,		          /* up */
+  (ITEM *)0		          /* down */
+  };
+/* *INDENT-ON* */
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  static void ComputeMaximum_NameDesc_Lenths(MENU *menu)
+|
+|   Description   :  Calculates the maximum name and description lengths
+|                    of the items connected to the menu
+|
+|   Return Values :  -
++--------------------------------------------------------------------------*/
+NCURSES_INLINE static void
+ComputeMaximum_NameDesc_Lengths(MENU *menu)
+{
+  unsigned MaximumNameLength = 0;
+  unsigned MaximumDescriptionLength = 0;
+  ITEM **items;
+
+  assert(menu && menu->items);
+  for (items = menu->items; *items; items++)
+    {
+      unsigned check = (unsigned)_nc_Calculate_Text_Width(&((*items)->name));
+
+      if (check > MaximumNameLength)
+	MaximumNameLength = check;
+
+      check = (unsigned)_nc_Calculate_Text_Width(&((*items)->description));
+      if (check > MaximumDescriptionLength)
+	MaximumDescriptionLength = check;
+    }
+
+  menu->namelen = (short)MaximumNameLength;
+  menu->desclen = (short)MaximumDescriptionLength;
+  T(("ComputeMaximum_NameDesc_Lengths %d,%d", menu->namelen, menu->desclen));
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  static void ResetConnectionInfo(MENU *, ITEM **)
+|
+|   Description   :  Reset all information in the menu and the items in
+|                    the item array that indicates a connection
+|
+|   Return Values :  -
++--------------------------------------------------------------------------*/
+NCURSES_INLINE static void
+ResetConnectionInfo(MENU *menu, ITEM **items)
+{
+  ITEM **item;
+
+  assert(menu && items);
+  for (item = items; *item; item++)
+    {
+      (*item)->index = 0;
+      (*item)->imenu = (MENU *)0;
+    }
+  if (menu->pattern)
+    free(menu->pattern);
+  menu->pattern = (char *)0;
+  menu->pindex = 0;
+  menu->items = (ITEM **)0;
+  menu->nitems = 0;
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  bool _nc_Connect_Items(MENU *menu, ITEM **items)
+|
+|   Description   :  Connect the items in the item array to the menu.
+|                    Decorate all the items with a number and a backward
+|                    pointer to the menu.
+|
+|   Return Values :  TRUE       - successful connection
+|                    FALSE      - connection failed
++--------------------------------------------------------------------------*/
+MENU_EXPORT(bool)
+_nc_Connect_Items(MENU *menu, ITEM **items)
+{
+  unsigned int ItemCount = 0;
+
+  if (menu && items)
+    {
+      ITEM **item;
+
+      for (item = items; *item; item++)
+	{
+	  if ((*item)->imenu)
+	    {
+	      /* if a item is already connected, reject connection */
+	      break;
+	    }
+	}
+      if (!(*item))
+	/* we reached the end, so there was no connected item */
+	{
+	  for (item = items; *item; item++)
+	    {
+	      if (menu->opt & O_ONEVALUE)
+		{
+		  (*item)->value = FALSE;
+		}
+	      (*item)->index = (short)ItemCount++;
+	      (*item)->imenu = menu;
+	    }
+	}
+    }
+  else
+    return (FALSE);
+
+  if (ItemCount != 0)
+    {
+      menu->items = items;
+      menu->nitems = (short)ItemCount;
+      ComputeMaximum_NameDesc_Lengths(menu);
+      if ((menu->pattern = typeMalloc(char, (unsigned)(1 + menu->namelen))))
+	{
+	  Reset_Pattern(menu);
+	  set_menu_format(menu, menu->frows, menu->fcols);
+	  menu->curitem = *items;
+	  menu->toprow = 0;
+	  return (TRUE);
+	}
+    }
+
+  /* If we fall through to this point, we have to reset all items connection
+     and inform about a reject connection */
+  ResetConnectionInfo(menu, items);
+  return (FALSE);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  void _nc_Disconnect_Items(MENU *menu)
+|
+|   Description   :  Disconnect the menus item array from the menu
+|
+|   Return Values :  -
++--------------------------------------------------------------------------*/
+MENU_EXPORT(void)
+_nc_Disconnect_Items(MENU *menu)
+{
+  if (menu && menu->items)
+    ResetConnectionInfo(menu, menu->items);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  int _nc_Calculate_Text_Width(const TEXT * item)
+|
+|   Description   :  Calculate the number of columns for a TEXT.
+|
+|   Return Values :  the width
++--------------------------------------------------------------------------*/
+MENU_EXPORT(int)
+_nc_Calculate_Text_Width(const TEXT *item /*FIXME: limit length */ )
+{
+#if USE_WIDEC_SUPPORT
+  int result = item->length;
+
+  T((T_CALLED("_nc_menu_text_width(%p)"), (const void *)item));
+  if (result != 0 && item->str != 0)
+    {
+      int count = (int)mbstowcs(0, item->str, 0);
+      wchar_t *temp = 0;
+
+      if (count > 0
+	  && (temp = typeMalloc(wchar_t, 2 + count)) != 0)
+	{
+	  int n;
+
+	  result = 0;
+	  mbstowcs(temp, item->str, (unsigned)count);
+	  for (n = 0; n < count; ++n)
+	    {
+	      int test = wcwidth(temp[n]);
+
+	      if (test <= 0)
+		test = 1;
+	      result += test;
+	    }
+	  free(temp);
+	}
+    }
+  returnCode(result);
+#else
+  return item->length;
+#endif
+}
+
+/*
+ * Calculate the actual width of a menu entry for wide-characters.
+ */
+#if USE_WIDEC_SUPPORT
+static int
+calculate_actual_width(MENU *menu, bool name)
+{
+  int width = 0;
+
+  assert(menu && menu->items);
+
+  if (menu->items != 0)
+    {
+      ITEM **items;
+
+      for (items = menu->items; *items; items++)
+	{
+	  int check = (name
+		       ? _nc_Calculate_Text_Width(&((*items)->name))
+		       : _nc_Calculate_Text_Width(&((*items)->description)));
+
+	  if (check > width)
+	    width = check;
+	}
+    }
+  else
+    {
+      width = (name ? menu->namelen : menu->desclen);
+    }
+
+  T(("calculate_actual_width %s = %d/%d",
+     name ? "name" : "desc",
+     width,
+     name ? menu->namelen : menu->desclen));
+  return width;
+}
+#else
+#define calculate_actual_width(menu, name) (name ? menu->namelen : menu->desclen)
+#endif
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  void _nc_Calculate_Item_Length_and_Width(MENU *menu)
+|
+|   Description   :  Calculate the length of an item and the width of the
+|                    whole menu.
+|
+|   Return Values :  -
++--------------------------------------------------------------------------*/
+MENU_EXPORT(void)
+_nc_Calculate_Item_Length_and_Width(MENU *menu)
+{
+  int l;
+
+  assert(menu);
+
+  menu->height = (short)(1 + menu->spc_rows * (menu->arows - 1));
+
+  l = calculate_actual_width(menu, TRUE);
+  l += menu->marklen;
+
+  if ((menu->opt & O_SHOWDESC) && (menu->desclen > 0))
+    {
+      l += calculate_actual_width(menu, FALSE);
+      l += menu->spc_desc;
+    }
+
+  menu->itemlen = (short)l;
+  l *= menu->cols;
+  l += (menu->cols - 1) * menu->spc_cols;	/* for the padding between the columns */
+  menu->width = (short)l;
+
+  T(("_nc_CalculateItem_Length_and_Width columns %d, item %d, width %d",
+     menu->cols,
+     menu->itemlen,
+     menu->width));
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  void _nc_Link_Item(MENU *menu)
+|
+|   Description   :  Statically calculate for every item its four neighbors.
+|                    This depends on the orientation of the menu. This
+|                    static approach simplifies navigation in the menu a lot.
+|
+|   Return Values :  -
++--------------------------------------------------------------------------*/
+MENU_EXPORT(void)
+_nc_Link_Items(MENU *menu)
+{
+  if (menu && menu->items && *(menu->items))
+    {
+      int i;
+      ITEM *item;
+      int Number_Of_Items = menu->nitems;
+      int col = 0, row = 0;
+      int Last_in_Row;
+      int Last_in_Column;
+      bool cycle = (menu->opt & O_NONCYCLIC) ? FALSE : TRUE;
+
+      ClrStatus(menu, _LINK_NEEDED);
+
+      if (menu->opt & O_ROWMAJOR)
+	{
+	  int Number_Of_Columns = menu->cols;
+
+	  for (i = 0; i < Number_Of_Items; i++)
+	    {
+	      item = menu->items[i];
+
+	      Last_in_Row = row * Number_Of_Columns + (Number_Of_Columns - 1);
+
+	      item->left = (col) ?
+	      /* if we are not in the leftmost column, we can use the
+	         predecessor in the items array */
+		menu->items[i - 1] :
+		(cycle ? menu->items[(Last_in_Row >= Number_Of_Items) ?
+				     Number_Of_Items - 1 :
+				     Last_in_Row] :
+		 (ITEM *)0);
+
+	      item->right = ((col < (Number_Of_Columns - 1)) &&
+			     ((i + 1) < Number_Of_Items)
+		)?
+		menu->items[i + 1] :
+		(cycle ? menu->items[row * Number_Of_Columns] :
+		 (ITEM *)0
+		);
+
+	      Last_in_Column = (menu->rows - 1) * Number_Of_Columns + col;
+
+	      item->up = (row) ? menu->items[i - Number_Of_Columns] :
+		(cycle ? menu->items[(Last_in_Column >= Number_Of_Items) ?
+				     Number_Of_Items - 1 :
+				     Last_in_Column] :
+		 (ITEM *)0);
+
+	      item->down = ((i + Number_Of_Columns) < Number_Of_Items)
+		?
+		menu->items[i + Number_Of_Columns] :
+		(cycle ? menu->items[(row + 1) < menu->rows ?
+				     Number_Of_Items - 1 : col] :
+		 (ITEM *)0);
+	      item->x = (short)col;
+	      item->y = (short)row;
+	      if (++col == Number_Of_Columns)
+		{
+		  row++;
+		  col = 0;
+		}
+	    }
+	}
+      else
+	{
+	  int Number_Of_Rows = menu->rows;
+	  int j;
+
+	  for (j = 0; j < Number_Of_Items; j++)
+	    {
+	      item = menu->items[i = (col * Number_Of_Rows + row)];
+
+	      Last_in_Column = (menu->cols - 1) * Number_Of_Rows + row;
+
+	      item->left = (col) ?
+		menu->items[i - Number_Of_Rows] :
+		(cycle ? (Last_in_Column >= Number_Of_Items) ?
+		 menu->items[Last_in_Column - Number_Of_Rows] :
+		 menu->items[Last_in_Column] :
+		 (ITEM *)0);
+
+	      item->right = ((i + Number_Of_Rows) < Number_Of_Items)
+		?
+		menu->items[i + Number_Of_Rows] :
+		(cycle ? menu->items[row] : (ITEM *)0);
+
+	      Last_in_Row = col * Number_Of_Rows + (Number_Of_Rows - 1);
+
+	      item->up = (row) ?
+		menu->items[i - 1] :
+		(cycle ?
+		 menu->items[(Last_in_Row >= Number_Of_Items) ?
+			     Number_Of_Items - 1 :
+			     Last_in_Row] :
+		 (ITEM *)0);
+
+	      item->down = (row < (Number_Of_Rows - 1))
+		?
+		(menu->items[((i + 1) < Number_Of_Items) ?
+			     i + 1 :
+			     (col - 1) * Number_Of_Rows + row + 1]) :
+		(cycle ?
+		 menu->items[col * Number_Of_Rows] :
+		 (ITEM *)0
+		);
+
+	      item->x = (short)col;
+	      item->y = (short)row;
+	      if ((++row) == Number_Of_Rows)
+		{
+		  col++;
+		  row = 0;
+		}
+	    }
+	}
+    }
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  void _nc_Show_Menu(const MENU* menu)
+|
+|   Description   :  Update the window that is associated with the menu
+|
+|   Return Values :  -
++--------------------------------------------------------------------------*/
+MENU_EXPORT(void)
+_nc_Show_Menu(const MENU *menu)
+{
+  assert(menu);
+  if ((menu->status & _POSTED) && !(menu->status & _IN_DRIVER))
+    {
+      WINDOW *win;
+      int maxy, maxx;
+
+      /* adjust the internal subwindow to start on the current top */
+      assert(menu->sub);
+      mvderwin(menu->sub, menu->spc_rows * menu->toprow, 0);
+      win = Get_Menu_Window(menu);
+
+      maxy = getmaxy(win);
+      maxx = getmaxx(win);
+
+      if (menu->height < maxy)
+	maxy = menu->height;
+      if (menu->width < maxx)
+	maxx = menu->width;
+
+      copywin(menu->sub, win, 0, 0, 0, 0, maxy - 1, maxx - 1, 0);
+      pos_menu_cursor(menu);
+    }
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  void _nc_New_TopRow_and_CurrentItem(
+|                            MENU *menu,
+|                            int new_toprow,
+|                            ITEM *new_current_item)
+|
+|   Description   :  Redisplay the menu so that the given row becomes the
+|                    top row and the given item becomes the new current
+|                    item.
+|
+|   Return Values :  -
++--------------------------------------------------------------------------*/
+MENU_EXPORT(void)
+_nc_New_TopRow_and_CurrentItem(
+				MENU *menu,
+				int new_toprow,
+				ITEM *new_current_item)
+{
+  assert(menu);
+  if (menu->status & _POSTED)
+    {
+      ITEM *cur_item;
+      bool mterm_called = FALSE;
+      bool iterm_called = FALSE;
+
+      if (new_current_item != menu->curitem)
+	{
+	  Call_Hook(menu, itemterm);
+	  iterm_called = TRUE;
+	}
+      if (new_toprow != menu->toprow)
+	{
+	  Call_Hook(menu, menuterm);
+	  mterm_called = TRUE;
+	}
+
+      cur_item = menu->curitem;
+      assert(cur_item);
+      menu->toprow = (short)(((menu->rows - menu->frows) >= 0)
+			     ? min(menu->rows - menu->frows, new_toprow)
+			     : 0);
+      menu->curitem = new_current_item;
+
+      if (mterm_called)
+	{
+	  Call_Hook(menu, menuinit);
+	}
+      if (iterm_called)
+	{
+	  /* this means, move from the old current_item to the new one... */
+	  Move_To_Current_Item(menu, cur_item);
+	  Call_Hook(menu, iteminit);
+	}
+      if (mterm_called || iterm_called)
+	{
+	  _nc_Show_Menu(menu);
+	}
+      else
+	pos_menu_cursor(menu);
+    }
+  else
+    {				/* if we are not posted, this is quite simple */
+      menu->toprow = (short)(((menu->rows - menu->frows) >= 0)
+			     ? min(menu->rows - menu->frows, new_toprow)
+			     : 0);
+      menu->curitem = new_current_item;
+    }
+}
+
+/* m_global.c ends here */
diff --git a/menu/m_hook.c b/menu/m_hook.c
new file mode 100644
index 0000000..c7d9fe9
--- /dev/null
+++ b/menu/m_hook.c
@@ -0,0 +1,153 @@
+/****************************************************************************
+ * Copyright 2018-2020,2021 Thomas E. Dickey                                *
+ * Copyright 1998-2012,2016 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+/***************************************************************************
+* Module m_hook                                                            *
+* Assign application specific routines for automatic invocation by menus   *
+***************************************************************************/
+
+#include "menu.priv.h"
+
+MODULE_ID("$Id: m_hook.c,v 1.21 2021/06/17 21:26:02 tom Exp $")
+
+/* "Template" macro to generate function to set application specific hook */
+#define GEN_HOOK_SET_FUNCTION( typ, name ) \
+MENU_EXPORT(int) NCURSES_API set_ ## typ ## _ ## name (MENU *menu, Menu_Hook func )\
+{\
+   TR_FUNC_BFR(1);\
+   T((T_CALLED("set_" #typ "_" #name "(%p,%s)"), (void *) menu, TR_FUNC_ARG(0, func)));\
+   (Normalize_Menu(menu) -> typ ## name = func );\
+   RETURN(E_OK);\
+}
+
+/* "Template" macro to generate function to get application specific hook */
+#define GEN_HOOK_GET_FUNCTION( typ, name ) \
+MENU_EXPORT(Menu_Hook) NCURSES_API typ ## _ ## name ( const MENU *menu )\
+{\
+   T((T_CALLED(#typ "_" #name "(%p)"), (const void *) menu));\
+   returnMenuHook(Normalize_Menu(menu) -> typ ## name);\
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  int set_menu_init(MENU *menu, void (*f)(MENU *))
+|
+|   Description   :  Set user-exit which is called when menu is posted
+|                    or just after the top row changes.
+|
+|   Return Values :  E_OK               - success
++--------------------------------------------------------------------------*/
+GEN_HOOK_SET_FUNCTION(menu, init)
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  void (*)(MENU *) menu_init(const MENU *menu)
+|
+|   Description   :  Return address of user-exit function which is called
+|                    when a menu is posted or just after the top row
+|                    changes.
+|
+|   Return Values :  Menu init function address or NULL
++--------------------------------------------------------------------------*/
+GEN_HOOK_GET_FUNCTION(menu, init)
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  int set_menu_term (MENU *menu, void (*f)(MENU *))
+|
+|   Description   :  Set user-exit which is called when menu is unposted
+|                    or just before the top row changes.
+|
+|   Return Values :  E_OK               - success
++--------------------------------------------------------------------------*/
+GEN_HOOK_SET_FUNCTION(menu, term)
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  void (*)(MENU *) menu_term(const MENU *menu)
+|
+|   Description   :  Return address of user-exit function which is called
+|                    when a menu is unposted or just before the top row
+|                    changes.
+|
+|   Return Values :  Menu finalization function address or NULL
++--------------------------------------------------------------------------*/
+GEN_HOOK_GET_FUNCTION(menu, term)
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  int set_item_init (MENU *menu, void (*f)(MENU *))
+|
+|   Description   :  Set user-exit which is called when menu is posted
+|                    or just after the current item changes.
+|
+|   Return Values :  E_OK               - success
++--------------------------------------------------------------------------*/
+GEN_HOOK_SET_FUNCTION(item, init)
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  void (*)(MENU *) item_init (const MENU *menu)
+|
+|   Description   :  Return address of user-exit function which is called
+|                    when a menu is posted or just after the current item
+|                    changes.
+|
+|   Return Values :  Item init function address or NULL
++--------------------------------------------------------------------------*/
+GEN_HOOK_GET_FUNCTION(item, init)
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  int set_item_term (MENU *menu, void (*f)(MENU *))
+|
+|   Description   :  Set user-exit which is called when menu is unposted
+|                    or just before the current item changes.
+|
+|   Return Values :  E_OK               - success
++--------------------------------------------------------------------------*/
+GEN_HOOK_SET_FUNCTION(item, term)
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  void (*)(MENU *) item_init (const MENU *menu)
+|
+|   Description   :  Return address of user-exit function which is called
+|                    when a menu is unposted or just before the current item
+|                    changes.
+|
+|   Return Values :  Item finalization function address or NULL
++--------------------------------------------------------------------------*/
+GEN_HOOK_GET_FUNCTION(item, term)
+
+/* m_hook.c ends here */
diff --git a/menu/m_item_cur.c b/menu/m_item_cur.c
new file mode 100644
index 0000000..ed76518
--- /dev/null
+++ b/menu/m_item_cur.c
@@ -0,0 +1,114 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2004,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+/***************************************************************************
+* Module m_item_cur                                                        *
+* Set and get current menus item                                           *
+***************************************************************************/
+
+#include "menu.priv.h"
+
+MODULE_ID("$Id: m_item_cur.c,v 1.22 2021/06/17 21:20:30 tom Exp $")
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  int set_current_item(MENU *menu, const ITEM *item)
+|
+|   Description   :  Make the item the current item
+|
+|   Return Values :  E_OK                - success
++--------------------------------------------------------------------------*/
+MENU_EXPORT(int)
+set_current_item(MENU *menu, ITEM *item)
+{
+  T((T_CALLED("set_current_item(%p,%p)"), (void *)menu, (void *)item));
+
+  if (menu && item && (item->imenu == menu))
+    {
+      if (menu->status & _IN_DRIVER)
+	RETURN(E_BAD_STATE);
+
+      assert(menu->curitem);
+      if (item != menu->curitem)
+	{
+	  if (menu->status & _LINK_NEEDED)
+	    {
+	      /*
+	       * Items are available, but they are not linked together.
+	       * So we have to link here.
+	       */
+	      _nc_Link_Items(menu);
+	    }
+	  assert(menu->pattern);
+	  Reset_Pattern(menu);
+	  /* adjust the window to make item visible and update the menu */
+	  Adjust_Current_Item(menu, menu->toprow, item);
+	}
+    }
+  else
+    RETURN(E_BAD_ARGUMENT);
+
+  RETURN(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  ITEM *current_item(const MENU *menu)
+|
+|   Description   :  Return the menus current item
+|
+|   Return Values :  Item pointer or NULL if failure
++--------------------------------------------------------------------------*/
+MENU_EXPORT(ITEM *)
+current_item(const MENU *menu)
+{
+  T((T_CALLED("current_item(%p)"), (const void *)menu));
+  returnItem((menu && menu->items) ? menu->curitem : (ITEM *)0);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  int item_index(const ITEM *)
+|
+|   Description   :  Return the logical index of this item.
+|
+|   Return Values :  The index or ERR if this is an invalid item pointer
++--------------------------------------------------------------------------*/
+MENU_EXPORT(int)
+item_index(const ITEM *item)
+{
+  T((T_CALLED("item_index(%p)"), (const void *)item));
+  returnCode((item && item->imenu) ? item->index : ERR);
+}
+
+/* m_item_cur.c ends here */
diff --git a/menu/m_item_nam.c b/menu/m_item_nam.c
new file mode 100644
index 0000000..ce74531
--- /dev/null
+++ b/menu/m_item_nam.c
@@ -0,0 +1,73 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2004,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+/***************************************************************************
+* Module m_item_nam                                                        *
+* Get menus item name and description                                      *
+***************************************************************************/
+
+#include "menu.priv.h"
+
+MODULE_ID("$Id: m_item_nam.c,v 1.19 2021/06/17 21:20:30 tom Exp $")
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  char *item_name(const ITEM *item)
+|
+|   Description   :  Return name of menu item
+|
+|   Return Values :  See above; returns NULL if item is invalid
++--------------------------------------------------------------------------*/
+MENU_EXPORT(const char *)
+item_name(const ITEM *item)
+{
+  T((T_CALLED("item_name(%p)"), (const void *)item));
+  returnCPtr((item) ? item->name.str : (char *)0);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  char *item_description(const ITEM *item)
+|
+|   Description   :  Returns description of item
+|
+|   Return Values :  See above; Returns NULL if item is invalid
++--------------------------------------------------------------------------*/
+MENU_EXPORT(const char *)
+item_description(const ITEM *item)
+{
+  T((T_CALLED("item_description(%p)"), (const void *)item));
+  returnCPtr((item) ? item->description.str : (char *)0);
+}
+
+/* m_item_nam.c ends here */
diff --git a/menu/m_item_new.c b/menu/m_item_new.c
new file mode 100644
index 0000000..28b71ca
--- /dev/null
+++ b/menu/m_item_new.c
@@ -0,0 +1,277 @@
+/****************************************************************************
+ * Copyright 2020-2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2010,2012 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+/***************************************************************************
+* Module m_item_new                                                        *
+* Create and destroy menu items                                            *
+* Set and get marker string for menu                                       *
+***************************************************************************/
+
+#include "menu.priv.h"
+
+#if USE_WIDEC_SUPPORT
+#if HAVE_WCTYPE_H
+#include <wctype.h>
+#endif
+#endif
+
+MODULE_ID("$Id: m_item_new.c,v 1.38 2021/06/17 21:26:02 tom Exp $")
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  bool Is_Printable_String(const char *s)
+|
+|   Description   :  Checks whether or not the string contains only printable
+|                    characters.
+|
+|   Return Values :  TRUE     - if string is printable
+|                    FALSE    - if string contains non-printable characters
++--------------------------------------------------------------------------*/
+static bool
+Is_Printable_String(const char *s)
+{
+  int result = TRUE;
+
+#if USE_WIDEC_SUPPORT
+  int count = (int)mbstowcs(0, s, 0);
+  wchar_t *temp = 0;
+
+  assert(s);
+
+  if (count > 0
+      && (temp = typeCalloc(wchar_t, (2 + (unsigned)count))) != 0)
+    {
+      int n;
+
+      mbstowcs(temp, s, (unsigned)count);
+      for (n = 0; n < count; ++n)
+	if (!iswprint((wint_t)temp[n]))
+	  {
+	    result = FALSE;
+	    break;
+	  }
+      free(temp);
+    }
+#else
+  assert(s);
+  while (*s)
+    {
+      if (!isprint(UChar(*s)))
+	{
+	  result = FALSE;
+	  break;
+	}
+      s++;
+    }
+#endif
+  return result;
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  ITEM *new_item(char *name, char *description)
+|
+|   Description   :  Create a new item with name and description. Return
+|                    a pointer to this new item.
+|                    N.B.: an item must(!) have a name.
+|
+|   Return Values :  The item pointer or NULL if creation failed.
++--------------------------------------------------------------------------*/
+MENU_EXPORT(ITEM *)
+new_item(const char *name, const char *description)
+{
+  ITEM *item;
+
+  T((T_CALLED("new_item(\"%s\", \"%s\")"),
+     name ? name : "",
+     description ? description : ""));
+
+  if (!name || (*name == '\0') || !Is_Printable_String(name))
+    {
+      item = (ITEM *)0;
+      SET_ERROR(E_BAD_ARGUMENT);
+    }
+  else
+    {
+      item = typeCalloc(ITEM, 1);
+
+      if (item)
+	{
+	  T((T_CREATE("item %p"), (void *)item));
+	  *item = _nc_Default_Item;	/* hope we have struct assignment */
+
+	  item->name.length = (unsigned short)strlen(name);
+	  item->name.str = name;
+
+	  if (description && (*description != '\0') &&
+	      Is_Printable_String(description))
+	    {
+	      item->description.length = (unsigned short)strlen(description);
+	      item->description.str = description;
+	    }
+	  else
+	    {
+	      item->description.length = 0;
+	      item->description.str = (char *)0;
+	    }
+	}
+      else
+	SET_ERROR(E_SYSTEM_ERROR);
+    }
+  returnItem(item);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  int free_item(ITEM *item)
+|
+|   Description   :  Free the allocated storage for this item.
+|                    N.B.: a connected item can't be freed.
+|
+|   Return Values :  E_OK              - success
+|                    E_BAD_ARGUMENT    - invalid value has been passed
+|                    E_CONNECTED       - item is still connected to a menu
++--------------------------------------------------------------------------*/
+MENU_EXPORT(int)
+free_item(ITEM *item)
+{
+  T((T_CALLED("free_item(%p)"), (void *)item));
+
+  if (!item)
+    RETURN(E_BAD_ARGUMENT);
+
+  if (item->imenu)
+    RETURN(E_CONNECTED);
+
+  free(item);
+
+  RETURN(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  int set_menu_mark( MENU *menu, const char *mark )
+|
+|   Description   :  Set the mark string used to indicate the current
+|                    item (single-valued menu) or the selected items
+|                    (multi-valued menu).
+|                    The mark argument may be NULL, in which case no
+|                    marker is used.
+|                    This might be a little bit tricky, because this may
+|                    affect the geometry of the menu, which we don't allow
+|                    if it is already posted.
+|
+|   Return Values :  E_OK               - success
+|                    E_BAD_ARGUMENT     - an invalid value has been passed
+|                    E_SYSTEM_ERROR     - no memory to store mark
++--------------------------------------------------------------------------*/
+MENU_EXPORT(int)
+set_menu_mark(MENU *menu, const char *mark)
+{
+  short l;
+
+  T((T_CALLED("set_menu_mark(%p,%s)"), (void *)menu, _nc_visbuf(mark)));
+
+  if (mark && (*mark != '\0') && Is_Printable_String(mark))
+    l = (short)strlen(mark);
+  else
+    l = 0;
+
+  if (menu)
+    {
+      char *old_mark = menu->mark;
+      unsigned short old_status = menu->status;
+
+      if (menu->status & _POSTED)
+	{
+	  /* If the menu is already posted, the geometry is fixed. Then
+	     we can only accept a mark with exactly the same length */
+	  if (menu->marklen != l)
+	    RETURN(E_BAD_ARGUMENT);
+	}
+      menu->marklen = l;
+      if (l)
+	{
+	  menu->mark = strdup(mark);
+	  if (menu->mark)
+	    {
+	      if (menu != &_nc_Default_Menu)
+		SetStatus(menu, _MARK_ALLOCATED);
+	    }
+	  else
+	    {
+	      menu->mark = old_mark;
+	      menu->marklen = (short)((old_mark != 0) ? strlen(old_mark) : 0);
+	      RETURN(E_SYSTEM_ERROR);
+	    }
+	}
+      else
+	menu->mark = (char *)0;
+
+      if ((old_status & _MARK_ALLOCATED) && old_mark)
+	free(old_mark);
+
+      if (menu->status & _POSTED)
+	{
+	  _nc_Draw_Menu(menu);
+	  _nc_Show_Menu(menu);
+	}
+      else
+	{
+	  /* Recalculate the geometry */
+	  _nc_Calculate_Item_Length_and_Width(menu);
+	}
+    }
+  else
+    {
+      returnCode(set_menu_mark(&_nc_Default_Menu, mark));
+    }
+  RETURN(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  char *menu_mark(const MENU *menu)
+|
+|   Description   :  Return a pointer to the marker string
+|
+|   Return Values :  The marker string pointer or NULL if no marker defined
++--------------------------------------------------------------------------*/
+MENU_EXPORT(const char *)
+menu_mark(const MENU *menu)
+{
+  T((T_CALLED("menu_mark(%p)"), (const void *)menu));
+  returnPtr(Normalize_Menu(menu)->mark);
+}
+
+/* m_item_new.c */
diff --git a/menu/m_item_opt.c b/menu/m_item_opt.c
new file mode 100644
index 0000000..495e409
--- /dev/null
+++ b/menu/m_item_opt.c
@@ -0,0 +1,160 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2004,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+/***************************************************************************
+* Module m_item_opt                                                        *
+* Menus item option routines                                               *
+***************************************************************************/
+
+#include "menu.priv.h"
+
+MODULE_ID("$Id: m_item_opt.c,v 1.22 2021/06/17 21:20:30 tom Exp $")
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  int set_item_opts(ITEM *item, Item_Options opts)
+|
+|   Description   :  Set the options of the item. If there are relevant
+|                    changes, the item is connected and the menu is posted,
+|                    the menu will be redisplayed.
+|
+|   Return Values :  E_OK            - success
+|                    E_BAD_ARGUMENT  - invalid item options
++--------------------------------------------------------------------------*/
+MENU_EXPORT(int)
+set_item_opts(ITEM *item, Item_Options opts)
+{
+  T((T_CALLED("set_menu_opts(%p,%d)"), (void *)item, opts));
+
+  opts &= ALL_ITEM_OPTS;
+
+  if (opts & ~ALL_ITEM_OPTS)
+    RETURN(E_BAD_ARGUMENT);
+
+  if (item)
+    {
+      if (item->opt != opts)
+	{
+	  MENU *menu = item->imenu;
+
+	  item->opt = opts;
+
+	  if ((!(opts & O_SELECTABLE)) && item->value)
+	    item->value = FALSE;
+
+	  if (menu && (menu->status & _POSTED))
+	    {
+	      Move_And_Post_Item(menu, item);
+	      _nc_Show_Menu(menu);
+	    }
+	}
+    }
+  else
+    _nc_Default_Item.opt = opts;
+
+  RETURN(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  int item_opts_off(ITEM *item, Item_Options opts)
+|
+|   Description   :  Switch of the options for this item.
+|
+|   Return Values :  E_OK            - success
+|                    E_BAD_ARGUMENT  - invalid options
++--------------------------------------------------------------------------*/
+MENU_EXPORT(int)
+item_opts_off(ITEM *item, Item_Options opts)
+{
+  ITEM *citem = item;		/* use a copy because set_item_opts must detect
+
+				   NULL item itself to adjust its behavior */
+
+  T((T_CALLED("item_opts_off(%p,%d)"), (void *)item, opts));
+
+  if (opts & ~ALL_ITEM_OPTS)
+    RETURN(E_BAD_ARGUMENT);
+  else
+    {
+      Normalize_Item(citem);
+      opts = citem->opt & ~(opts & ALL_ITEM_OPTS);
+      returnCode(set_item_opts(item, opts));
+    }
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  int item_opts_on(ITEM *item, Item_Options opts)
+|
+|   Description   :  Switch on the options for this item.
+|
+|   Return Values :  E_OK            - success
+|                    E_BAD_ARGUMENT  - invalid options
++--------------------------------------------------------------------------*/
+MENU_EXPORT(int)
+item_opts_on(ITEM *item, Item_Options opts)
+{
+  ITEM *citem = item;		/* use a copy because set_item_opts must detect
+
+				   NULL item itself to adjust its behavior */
+
+  T((T_CALLED("item_opts_on(%p,%d)"), (void *)item, opts));
+
+  opts &= ALL_ITEM_OPTS;
+  if (opts & ~ALL_ITEM_OPTS)
+    RETURN(E_BAD_ARGUMENT);
+  else
+    {
+      Normalize_Item(citem);
+      opts = citem->opt | opts;
+      returnCode(set_item_opts(item, opts));
+    }
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  Item_Options item_opts(const ITEM *item)
+|
+|   Description   :  Switch of the options for this item.
+|
+|   Return Values :  Items options
++--------------------------------------------------------------------------*/
+MENU_EXPORT(Item_Options)
+item_opts(const ITEM *item)
+{
+  T((T_CALLED("item_opts(%p)"), (const void *)item));
+  returnItemOpts(ALL_ITEM_OPTS & Normalize_Item(item)->opt);
+}
+
+/* m_item_opt.c ends here */
diff --git a/menu/m_item_top.c b/menu/m_item_top.c
new file mode 100644
index 0000000..68303c7
--- /dev/null
+++ b/menu/m_item_top.c
@@ -0,0 +1,108 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2004,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+/***************************************************************************
+* Module m_item_top                                                        *
+* Set and get top menus item                                               *
+***************************************************************************/
+
+#include "menu.priv.h"
+
+MODULE_ID("$Id: m_item_top.c,v 1.16 2021/06/17 21:11:08 tom Exp $")
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  int set_top_row(MENU *menu, int row)
+|
+|   Description   :  Makes the specified row the top row in the menu
+|
+|   Return Values :  E_OK             - success
+|                    E_BAD_ARGUMENT   - not a menu pointer or invalid row
+|                    E_NOT_CONNECTED  - there are no items for the menu
++--------------------------------------------------------------------------*/
+MENU_EXPORT(int)
+set_top_row(MENU *menu, int row)
+{
+  T((T_CALLED("set_top_row(%p,%d)"), (void *)menu, row));
+
+  if (menu)
+    {
+      if (menu->status & _IN_DRIVER)
+	RETURN(E_BAD_STATE);
+      if (menu->items == (ITEM **)0)
+	RETURN(E_NOT_CONNECTED);
+
+      if ((row < 0) || (row > (menu->rows - menu->arows)))
+	RETURN(E_BAD_ARGUMENT);
+    }
+  else
+    RETURN(E_BAD_ARGUMENT);
+
+  if (row != menu->toprow)
+    {
+      ITEM *item;
+
+      if (menu->status & _LINK_NEEDED)
+	_nc_Link_Items(menu);
+
+      item = menu->items[(menu->opt & O_ROWMAJOR) ? (row * menu->cols) : row];
+      assert(menu->pattern);
+      Reset_Pattern(menu);
+      _nc_New_TopRow_and_CurrentItem(menu, row, item);
+    }
+
+  RETURN(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  int top_row(const MENU *)
+|
+|   Description   :  Return the top row of the menu
+|
+|   Return Values :  The row number or ERR if there is no row
++--------------------------------------------------------------------------*/
+MENU_EXPORT(int)
+top_row(const MENU *menu)
+{
+  T((T_CALLED("top_row(%p)"), (const void *)menu));
+  if (menu && menu->items && *(menu->items))
+    {
+      assert((menu->toprow >= 0) && (menu->toprow < menu->rows));
+      returnCode(menu->toprow);
+    }
+  else
+    returnCode(ERR);
+}
+
+/* m_item_top.c ends here */
diff --git a/menu/m_item_use.c b/menu/m_item_use.c
new file mode 100644
index 0000000..52d087e
--- /dev/null
+++ b/menu/m_item_use.c
@@ -0,0 +1,77 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2004,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+/***************************************************************************
+* Module m_item_use                                                        *
+* Associate application data with menu items                               *
+***************************************************************************/
+
+#include "menu.priv.h"
+
+MODULE_ID("$Id: m_item_use.c,v 1.21 2020/12/12 00:38:08 tom Exp $")
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  int set_item_userptr(ITEM *item, void *userptr)
+|
+|   Description   :  Set the pointer that is reserved in any item to store
+|                    application relevant information.
+|
+|   Return Values :  E_OK               - success
++--------------------------------------------------------------------------*/
+MENU_EXPORT(int)
+set_item_userptr(ITEM *item, void *userptr)
+{
+  T((T_CALLED("set_item_userptr(%p,%p)"), (void *)item, (void *)userptr));
+  Normalize_Item(item)->userptr = userptr;
+  RETURN(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  void *item_userptr(const ITEM *item)
+|
+|   Description   :  Return the pointer that is reserved in any item to store
+|                    application relevant information.
+|
+|   Return Values :  Value of the pointer. If no such pointer has been set,
+|                    NULL is returned.
++--------------------------------------------------------------------------*/
+MENU_EXPORT(void *)
+item_userptr(const ITEM *item)
+{
+  T((T_CALLED("item_userptr(%p)"), (const void *)item));
+  returnVoidPtr(Normalize_Item(item)->userptr);
+}
+
+/* m_item_use.c */
diff --git a/menu/m_item_val.c b/menu/m_item_val.c
new file mode 100644
index 0000000..3163f4b
--- /dev/null
+++ b/menu/m_item_val.c
@@ -0,0 +1,103 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2004,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+/***************************************************************************
+* Module m_item_val                                                        *
+* Set and get menus item values                                            *
+***************************************************************************/
+
+#include "menu.priv.h"
+
+MODULE_ID("$Id: m_item_val.c,v 1.20 2021/06/17 21:11:08 tom Exp $")
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  int set_item_value(ITEM *item, int value)
+|
+|   Description   :  Programmatically set the item's selection value. This is
+|                    only allowed if the item is selectable at all and if
+|                    it is not connected to a single-valued menu.
+|                    If the item is connected to a posted menu, the menu
+|                    will be redisplayed.
+|
+|   Return Values :  E_OK              - success
+|                    E_REQUEST_DENIED  - not selectable or single valued menu
++--------------------------------------------------------------------------*/
+MENU_EXPORT(int)
+set_item_value(ITEM *item, bool value)
+{
+  T((T_CALLED("set_item_value(%p,%d)"), (void *)item, value));
+  if (item)
+    {
+      MENU *menu = item->imenu;
+
+      if ((!(item->opt & O_SELECTABLE)) ||
+	  (menu && (menu->opt & O_ONEVALUE)))
+	RETURN(E_REQUEST_DENIED);
+
+      if (item->value ^ value)
+	{
+	  item->value = value ? TRUE : FALSE;
+	  if (menu)
+	    {
+	      if (menu->status & _POSTED)
+		{
+		  Move_And_Post_Item(menu, item);
+		  _nc_Show_Menu(menu);
+		}
+	    }
+	}
+    }
+  else
+    _nc_Default_Item.value = value;
+
+  RETURN(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  bool item_value(const ITEM *item)
+|
+|   Description   :  Return the selection value of the item
+|
+|   Return Values :  TRUE   - if item is selected
+|                    FALSE  - if item is not selected
++--------------------------------------------------------------------------*/
+MENU_EXPORT(bool)
+item_value(const ITEM *item)
+{
+  T((T_CALLED("item_value(%p)"), (const void *)item));
+  returnBool((Normalize_Item(item)->value) ? TRUE : FALSE);
+}
+
+/* m_item_val.c ends here */
diff --git a/menu/m_item_vis.c b/menu/m_item_vis.c
new file mode 100644
index 0000000..9ae4fdb
--- /dev/null
+++ b/menu/m_item_vis.c
@@ -0,0 +1,69 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2004,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+/***************************************************************************
+* Module m_item_vis                                                        *
+* Tell if menu item is visible                                             *
+***************************************************************************/
+
+#include "menu.priv.h"
+
+MODULE_ID("$Id: m_item_vis.c,v 1.20 2021/06/17 21:20:30 tom Exp $")
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  bool item_visible(const ITEM *item)
+|
+|   Description   :  A item is visible if it currently appears in the
+|                    subwindow of a posted menu.
+|
+|   Return Values :  TRUE  if visible
+|                    FALSE if invisible
++--------------------------------------------------------------------------*/
+MENU_EXPORT(bool)
+item_visible(const ITEM *item)
+{
+  MENU *menu;
+
+  T((T_CALLED("item_visible(%p)"), (const void *)item));
+  if (item &&
+      (menu = item->imenu) &&
+      (menu->status & _POSTED) &&
+      ((menu->toprow + menu->arows) > (item->y)) &&
+      (item->y >= menu->toprow))
+    returnBool(TRUE);
+  else
+    returnBool(FALSE);
+}
+
+/* m_item_vis.c ends here */
diff --git a/menu/m_items.c b/menu/m_items.c
new file mode 100644
index 0000000..ecc5e2f
--- /dev/null
+++ b/menu/m_items.c
@@ -0,0 +1,111 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2005,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+/***************************************************************************
+* Module m_items                                                           *
+* Connect and disconnect items to and from menus                           *
+***************************************************************************/
+
+#include "menu.priv.h"
+
+MODULE_ID("$Id: m_items.c,v 1.21 2021/06/17 21:20:30 tom Exp $")
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  int set_menu_items(MENU *menu, ITEM **items)
+|
+|   Description   :  Sets the item pointer array connected to menu.
+|
+|   Return Values :  E_OK           - success
+|                    E_POSTED       - menu is already posted
+|                    E_CONNECTED    - one or more items are already connected
+|                                     to another menu.
+|                    E_BAD_ARGUMENT - An incorrect menu or item array was
+|                                     passed to the function
++--------------------------------------------------------------------------*/
+MENU_EXPORT(int)
+set_menu_items(MENU *menu, ITEM **items)
+{
+  T((T_CALLED("set_menu_items(%p,%p)"), (void *)menu, (void *)items));
+
+  if (!menu || (items && !(*items)))
+    RETURN(E_BAD_ARGUMENT);
+
+  if (menu->status & _POSTED)
+    RETURN(E_POSTED);
+
+  if (menu->items)
+    _nc_Disconnect_Items(menu);
+
+  if (items)
+    {
+      if (!_nc_Connect_Items(menu, items))
+	RETURN(E_CONNECTED);
+    }
+
+  menu->items = items;
+  RETURN(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  ITEM **menu_items(const MENU *menu)
+|
+|   Description   :  Returns a pointer to the item pointer array of the menu
+|
+|   Return Values :  NULL on error
++--------------------------------------------------------------------------*/
+MENU_EXPORT(ITEM **)
+menu_items(const MENU *menu)
+{
+  T((T_CALLED("menu_items(%p)"), (const void *)menu));
+  returnItemPtr(menu ? menu->items : (ITEM **)0);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  int item_count(const MENU *menu)
+|
+|   Description   :  Get the number of items connected to the menu. If the
+|                    menu pointer is NULL we return -1.
+|
+|   Return Values :  Number of items or -1 to indicate error.
++--------------------------------------------------------------------------*/
+MENU_EXPORT(int)
+item_count(const MENU *menu)
+{
+  T((T_CALLED("item_count(%p)"), (const void *)menu));
+  returnCode(menu ? menu->nitems : -1);
+}
+
+/* m_items.c ends here */
diff --git a/menu/m_new.c b/menu/m_new.c
new file mode 100644
index 0000000..be17558
--- /dev/null
+++ b/menu/m_new.c
@@ -0,0 +1,144 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2009,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+/***************************************************************************
+* Module m_new                                                             *
+* Creation and destruction of new menus                                    *
+***************************************************************************/
+
+#include "menu.priv.h"
+
+MODULE_ID("$Id: m_new.c,v 1.27 2021/06/17 21:26:02 tom Exp $")
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  MENU* _nc_new_menu(SCREEN*, ITEM **items)
+|
+|   Description   :  Creates a new menu connected to the item pointer
+|                    array items and returns a pointer to the new menu.
+|                    The new menu is initialized with the values from the
+|                    default menu.
+|
+|   Return Values :  NULL on error
++--------------------------------------------------------------------------*/
+MENU_EXPORT(MENU *)
+NCURSES_SP_NAME(new_menu) (NCURSES_SP_DCLx ITEM **items)
+{
+  int err = E_SYSTEM_ERROR;
+  MENU *menu = typeCalloc(MENU, 1);
+
+  T((T_CALLED("new_menu(%p,%p)"), (void *)SP_PARM, (void *)items));
+  if (menu)
+    {
+      T((T_CREATE("menu %p"), (void *)menu));
+      *menu = _nc_Default_Menu;
+      menu->status = 0;
+      menu->rows = menu->frows;
+      menu->cols = menu->fcols;
+#if NCURSES_SP_FUNCS
+      /* This ensures userwin and usersub are always non-null,
+         so we can derive always the SCREEN that this menu is
+         running on. */
+      menu->userwin = SP_PARM->_stdscr;
+      menu->usersub = SP_PARM->_stdscr;
+#endif
+      if (items && *items)
+	{
+	  if (!_nc_Connect_Items(menu, items))
+	    {
+	      err = E_NOT_CONNECTED;
+	      free(menu);
+	      menu = (MENU *)0;
+	    }
+	  else
+	    err = E_OK;
+	}
+    }
+
+  if (!menu)
+    SET_ERROR(err);
+
+  returnMenu(menu);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  MENU *new_menu(ITEM **items)
+|
+|   Description   :  Creates a new menu connected to the item pointer
+|                    array items and returns a pointer to the new menu.
+|                    The new menu is initialized with the values from the
+|                    default menu.
+|
+|   Return Values :  NULL on error
++--------------------------------------------------------------------------*/
+#if NCURSES_SP_FUNCS
+MENU_EXPORT(MENU *)
+new_menu(ITEM **items)
+{
+  return NCURSES_SP_NAME(new_menu) (CURRENT_SCREEN, items);
+}
+#endif
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  int free_menu(MENU *menu)
+|
+|   Description   :  Disconnects menu from its associated item pointer
+|                    array and frees the storage allocated for the menu.
+|
+|   Return Values :  E_OK               - success
+|                    E_BAD_ARGUMENT     - Invalid menu pointer passed
+|                    E_POSTED           - Menu is already posted
++--------------------------------------------------------------------------*/
+MENU_EXPORT(int)
+free_menu(MENU *menu)
+{
+  T((T_CALLED("free_menu(%p)"), (void *)menu));
+  if (!menu)
+    RETURN(E_BAD_ARGUMENT);
+
+  if (menu->status & _POSTED)
+    RETURN(E_POSTED);
+
+  if (menu->items)
+    _nc_Disconnect_Items(menu);
+
+  if ((menu->status & _MARK_ALLOCATED) && menu->mark)
+    free(menu->mark);
+
+  free(menu);
+  RETURN(E_OK);
+}
+
+/* m_new.c ends here */
diff --git a/menu/m_opts.c b/menu/m_opts.c
new file mode 100644
index 0000000..bbf9459
--- /dev/null
+++ b/menu/m_opts.c
@@ -0,0 +1,184 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2004,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+/***************************************************************************
+* Module m_opts                                                            *
+* Menus option routines                                                    *
+***************************************************************************/
+
+#include "menu.priv.h"
+
+MODULE_ID("$Id: m_opts.c,v 1.23 2020/12/12 00:38:08 tom Exp $")
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  int set_menu_opts(MENU *menu, Menu_Options opts)
+|
+|   Description   :  Set the options for this menu. If the new settings
+|                    end up in a change of the geometry of the menu, it
+|                    will be recalculated. This operation is forbidden if
+|                    the menu is already posted.
+|
+|   Return Values :  E_OK           - success
+|                    E_BAD_ARGUMENT - invalid menu options
+|                    E_POSTED       - menu is already posted
++--------------------------------------------------------------------------*/
+MENU_EXPORT(int)
+set_menu_opts(MENU *menu, Menu_Options opts)
+{
+  T((T_CALLED("set_menu_opts(%p,%d)"), (void *)menu, opts));
+
+  opts &= ALL_MENU_OPTS;
+
+  if (opts & ~ALL_MENU_OPTS)
+    RETURN(E_BAD_ARGUMENT);
+
+  if (menu)
+    {
+      if (menu->status & _POSTED)
+	RETURN(E_POSTED);
+
+      if ((opts & O_ROWMAJOR) != (menu->opt & O_ROWMAJOR))
+	{
+	  /* we need this only if the layout really changed ... */
+	  if (menu->items && menu->items[0])
+	    {
+	      menu->toprow = 0;
+	      menu->curitem = menu->items[0];
+	      assert(menu->curitem);
+	      set_menu_format(menu, menu->frows, menu->fcols);
+	    }
+	}
+
+      menu->opt = opts;
+
+      if (opts & O_ONEVALUE)
+	{
+	  ITEM **item;
+
+	  if (((item = menu->items) != (ITEM **)0))
+	    for (; *item; item++)
+	      (*item)->value = FALSE;
+	}
+
+      if (opts & O_SHOWDESC)	/* this also changes the geometry */
+	_nc_Calculate_Item_Length_and_Width(menu);
+    }
+  else
+    _nc_Default_Menu.opt = opts;
+
+  RETURN(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  int menu_opts_off(MENU *menu, Menu_Options opts)
+|
+|   Description   :  Switch off the options for this menu. If the new settings
+|                    end up in a change of the geometry of the menu, it
+|                    will be recalculated. This operation is forbidden if
+|                    the menu is already posted.
+|
+|   Return Values :  E_OK           - success
+|                    E_BAD_ARGUMENT - invalid options
+|                    E_POSTED       - menu is already posted
++--------------------------------------------------------------------------*/
+MENU_EXPORT(int)
+menu_opts_off(MENU *menu, Menu_Options opts)
+{
+  MENU *cmenu = menu;		/* use a copy because set_menu_opts must detect
+
+				   NULL menu itself to adjust its behavior */
+
+  T((T_CALLED("menu_opts_off(%p,%d)"), (void *)menu, opts));
+
+  opts &= ALL_MENU_OPTS;
+  if (opts & ~ALL_MENU_OPTS)
+    RETURN(E_BAD_ARGUMENT);
+  else
+    {
+      Normalize_Menu(cmenu);
+      opts = cmenu->opt & ~opts;
+      returnCode(set_menu_opts(menu, opts));
+    }
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  int menu_opts_on(MENU *menu, Menu_Options opts)
+|
+|   Description   :  Switch on the options for this menu. If the new settings
+|                    end up in a change of the geometry of the menu, it
+|                    will be recalculated. This operation is forbidden if
+|                    the menu is already posted.
+|
+|   Return Values :  E_OK           - success
+|                    E_BAD_ARGUMENT - invalid menu options
+|                    E_POSTED       - menu is already posted
++--------------------------------------------------------------------------*/
+MENU_EXPORT(int)
+menu_opts_on(MENU *menu, Menu_Options opts)
+{
+  MENU *cmenu = menu;		/* use a copy because set_menu_opts must detect
+
+				   NULL menu itself to adjust its behavior */
+
+  T((T_CALLED("menu_opts_on(%p,%d)"), (void *)menu, opts));
+
+  opts &= ALL_MENU_OPTS;
+  if (opts & ~ALL_MENU_OPTS)
+    RETURN(E_BAD_ARGUMENT);
+  else
+    {
+      Normalize_Menu(cmenu);
+      opts = cmenu->opt | opts;
+      returnCode(set_menu_opts(menu, opts));
+    }
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  Menu_Options menu_opts(const MENU *menu)
+|
+|   Description   :  Return the options for this menu.
+|
+|   Return Values :  Menu options
++--------------------------------------------------------------------------*/
+MENU_EXPORT(Menu_Options)
+menu_opts(const MENU *menu)
+{
+  T((T_CALLED("menu_opts(%p)"), (const void *)menu));
+  returnMenuOpts(ALL_MENU_OPTS & Normalize_Menu(menu)->opt);
+}
+
+/* m_opts.c ends here */
diff --git a/menu/m_pad.c b/menu/m_pad.c
new file mode 100644
index 0000000..008e19a
--- /dev/null
+++ b/menu/m_pad.c
@@ -0,0 +1,96 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2010,2012 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+/***************************************************************************
+* Module m_pad                                                             *
+* Control menus padding character                                          *
+***************************************************************************/
+
+#include "menu.priv.h"
+
+MODULE_ID("$Id: m_pad.c,v 1.17 2021/06/17 21:20:30 tom Exp $")
+
+/* Macro to redraw menu if it is posted and changed */
+#define Refresh_Menu(menu) \
+   if ( (menu) && ((menu)->status & _POSTED) )\
+   {\
+      _nc_Draw_Menu( menu );\
+      _nc_Show_Menu( menu ); \
+   }
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  int set_menu_pad(MENU* menu, int pad)
+|
+|   Description   :  Set the character to be used to separate the item name
+|                    from its description. This must be a printable
+|                    character.
+|
+|   Return Values :  E_OK              - success
+|                    E_BAD_ARGUMENT    - an invalid value has been passed
++--------------------------------------------------------------------------*/
+MENU_EXPORT(int)
+set_menu_pad(MENU *menu, int pad)
+{
+  bool do_refresh = (menu != (MENU *)0);
+
+  T((T_CALLED("set_menu_pad(%p,%d)"), (void *)menu, pad));
+
+  if (!isprint(UChar(pad)))
+    RETURN(E_BAD_ARGUMENT);
+
+  Normalize_Menu(menu);
+  menu->pad = (unsigned char)pad;
+
+  if (do_refresh)
+    Refresh_Menu(menu);
+
+  RETURN(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  int menu_pad(const MENU *menu)
+|
+|   Description   :  Return the value of the padding character
+|
+|   Return Values :  The pad character
++--------------------------------------------------------------------------*/
+MENU_EXPORT(int)
+menu_pad(const MENU *menu)
+{
+  T((T_CALLED("menu_pad(%p)"), (const void *)menu));
+  returnCode(Normalize_Menu(menu)->pad);
+}
+
+/* m_pad.c ends here */
diff --git a/menu/m_pattern.c b/menu/m_pattern.c
new file mode 100644
index 0000000..6fbef23
--- /dev/null
+++ b/menu/m_pattern.c
@@ -0,0 +1,125 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2006,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+/***************************************************************************
+* Module m_pattern                                                         *
+* Pattern matching handling                                                *
+***************************************************************************/
+
+#include "menu.priv.h"
+
+MODULE_ID("$Id: m_pattern.c,v 1.20 2021/06/17 21:20:30 tom Exp $")
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  char *menu_pattern(const MENU *menu)
+|
+|   Description   :  Return the value of the pattern buffer.
+|
+|   Return Values :  NULL          - if there is no pattern buffer allocated
+|                    EmptyString   - if there is a pattern buffer but no
+|                                    pattern is stored
+|                    PatternString - as expected
++--------------------------------------------------------------------------*/
+MENU_EXPORT(char *)
+menu_pattern(const MENU *menu)
+{
+  static char empty[] = "";
+
+  T((T_CALLED("menu_pattern(%p)"), (const void *)menu));
+  returnPtr(menu ? (menu->pattern ? menu->pattern : empty) : 0);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  int set_menu_pattern(MENU *menu, const char *p)
+|
+|   Description   :  Set the match pattern for a menu and position to the
+|                    first item that matches.
+|
+|   Return Values :  E_OK              - success
+|                    E_BAD_ARGUMENT    - invalid menu or pattern pointer
+|                    E_BAD_STATE       - menu in user hook routine
+|                    E_NOT_CONNECTED   - no items connected to menu
+|                    E_NO_MATCH        - no item matches pattern
++--------------------------------------------------------------------------*/
+MENU_EXPORT(int)
+set_menu_pattern(MENU *menu, const char *p)
+{
+  ITEM *matchitem;
+  int matchpos;
+
+  T((T_CALLED("set_menu_pattern(%p,%s)"), (void *)menu, _nc_visbuf(p)));
+
+  if (!menu || !p)
+    RETURN(E_BAD_ARGUMENT);
+
+  if (!(menu->items))
+    RETURN(E_NOT_CONNECTED);
+
+  if (menu->status & _IN_DRIVER)
+    RETURN(E_BAD_STATE);
+
+  Reset_Pattern(menu);
+
+  if (!(*p))
+    {
+      pos_menu_cursor(menu);
+      RETURN(E_OK);
+    }
+
+  if (menu->status & _LINK_NEEDED)
+    _nc_Link_Items(menu);
+
+  matchpos = menu->toprow;
+  matchitem = menu->curitem;
+  assert(matchitem);
+
+  while (*p)
+    {
+      if (!isprint(UChar(*p)) ||
+	  (_nc_Match_Next_Character_In_Item_Name(menu, *p, &matchitem) != E_OK))
+	{
+	  Reset_Pattern(menu);
+	  pos_menu_cursor(menu);
+	  RETURN(E_NO_MATCH);
+	}
+      p++;
+    }
+
+  /* This is reached if there was a match. So we position to the new item */
+  Adjust_Current_Item(menu, matchpos, matchitem);
+  RETURN(E_OK);
+}
+
+/* m_pattern.c ends here */
diff --git a/menu/m_post.c b/menu/m_post.c
new file mode 100644
index 0000000..cb80230
--- /dev/null
+++ b/menu/m_post.c
@@ -0,0 +1,384 @@
+/****************************************************************************
+ * Copyright 2020-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2010,2012 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+/***************************************************************************
+* Module m_post                                                            *
+* Write or erase menus from associated subwindows                          *
+***************************************************************************/
+
+#include "menu.priv.h"
+
+MODULE_ID("$Id: m_post.c,v 1.38 2022/09/24 09:38:44 tom Exp $")
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  void _nc_Post_Item(MENU *menu, ITEM *item)
+|
+|   Description   :  Draw the item in the menus window at the current
+|                    window position
+|
+|   Return Values :  -
++--------------------------------------------------------------------------*/
+MENU_EXPORT(void)
+_nc_Post_Item(const MENU *menu, const ITEM *item)
+{
+  int i;
+  chtype ch;
+  int item_x, item_y;
+  int count = 0;
+  bool isfore = FALSE, isback = FALSE, isgrey = FALSE;
+  int name_len;
+
+  assert(menu->win);
+
+  getyx(menu->win, item_y, item_x);
+
+  /* We need a marker iff
+     - it is a onevalued menu and it is the current item
+     - or it has a selection value
+   */
+  wattron(menu->win, (int)menu->back);
+  if (item->value || (item == menu->curitem))
+    {
+      if (menu->marklen)
+	{
+	  /* In a multi selection menu we use the fore attribute
+	     for a selected marker that is not the current one.
+	     This improves visualization of the menu, because now
+	     always the 'normal' marker denotes the current
+	     item. */
+	  if (!(menu->opt & O_ONEVALUE) && item->value && item != menu->curitem)
+	    {
+	      wattron(menu->win, (int)menu->fore);
+	      isfore = TRUE;
+	    }
+	  waddstr(menu->win, menu->mark);
+	  if (isfore)
+	    {
+	      wattron(menu->win, (int)menu->fore);
+	      isfore = FALSE;
+	    }
+	}
+    }
+  else				/* otherwise we have to wipe out the marker area */
+    for (ch = ' ', i = menu->marklen; i > 0; i--)
+      waddch(menu->win, ch);
+  wattroff(menu->win, (int)menu->back);
+  count += menu->marklen;
+
+  /* First we have to calculate the attribute depending on selectability
+     and selection status
+   */
+  if (!(item->opt & O_SELECTABLE))
+    {
+      wattron(menu->win, (int)menu->grey);
+      isgrey = TRUE;
+    }
+  else
+    {
+      if (item->value || item == menu->curitem)
+	{
+	  wattron(menu->win, (int)menu->fore);
+	  isfore = TRUE;
+	}
+      else
+	{
+	  wattron(menu->win, (int)menu->back);
+	  isback = TRUE;
+	}
+    }
+
+  waddnstr(menu->win, item->name.str, item->name.length);
+  name_len = _nc_Calculate_Text_Width(&(item->name));
+  for (ch = ' ', i = menu->namelen - name_len; i > 0; i--)
+    {
+      waddch(menu->win, ch);
+    }
+  count += menu->namelen;
+
+  /* Show description if required and available */
+  if ((menu->opt & O_SHOWDESC) && menu->desclen > 0)
+    {
+      int m = menu->spc_desc / 2;
+      int cy = -1, cx = -1;
+      int desc_len;
+
+      for (ch = ' ', i = 0; i < menu->spc_desc; i++)
+	{
+	  if (i == m)
+	    {
+	      waddch(menu->win, menu->pad);
+	      getyx(menu->win, cy, cx);
+	    }
+	  else
+	    waddch(menu->win, ch);
+	}
+      if (item->description.length)
+	waddnstr(menu->win, item->description.str, item->description.length);
+      desc_len = _nc_Calculate_Text_Width(&(item->description));
+      for (ch = ' ', i = menu->desclen - desc_len; i > 0; i--)
+	{
+	  waddch(menu->win, ch);
+	}
+      count += menu->desclen + menu->spc_desc;
+
+      if (menu->spc_rows > 1)
+	{
+	  int j, k, ncy, ncx;
+
+	  assert(cx >= 0 && cy >= 0);
+	  getyx(menu->win, ncy, ncx);
+	  if (isgrey)
+	    wattroff(menu->win, (int)menu->grey);
+	  else if (isfore)
+	    wattroff(menu->win, (int)menu->fore);
+	  wattron(menu->win, (int)menu->back);
+	  for (j = 1; j < menu->spc_rows; j++)
+	    {
+	      if ((item_y + j) < getmaxy(menu->win))
+		{
+		  wmove(menu->win, item_y + j, item_x);
+		  for (k = 0; k < count; k++)
+		    waddch(menu->win, ' ');
+		}
+	      if ((cy + j) < getmaxy(menu->win))
+		(void)mvwaddch(menu->win, cy + j, cx - 1, menu->pad);
+	    }
+	  wmove(menu->win, ncy, ncx);
+	  if (!isback)
+	    wattroff(menu->win, (int)menu->back);
+	}
+    }
+
+  /* Remove attributes */
+  if (isfore)
+    wattroff(menu->win, (int)menu->fore);
+  if (isback)
+    wattroff(menu->win, (int)menu->back);
+  if (isgrey)
+    wattroff(menu->win, (int)menu->grey);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  void _nc_Draw_Menu(const MENU *)
+|
+|   Description   :  Display the menu in its windows
+|
+|   Return Values :  -
++--------------------------------------------------------------------------*/
+MENU_EXPORT(void)
+_nc_Draw_Menu(const MENU *menu)
+{
+  ITEM *item = menu->items[0];
+  ITEM *lastvert;
+  ITEM *hitem;
+  chtype s_bkgd;
+
+  assert(item && menu->win);
+
+  s_bkgd = getbkgd(menu->win);
+  wbkgdset(menu->win, menu->back);
+  werase(menu->win);
+  wbkgdset(menu->win, s_bkgd);
+
+  lastvert = (menu->opt & O_NONCYCLIC) ? (ITEM *)0 : item;
+
+  if (item != NULL)
+    {
+      int y = 0;
+
+      do
+	{
+	  ITEM *lasthor;
+
+	  wmove(menu->win, y, 0);
+
+	  hitem = item;
+	  lasthor = (menu->opt & O_NONCYCLIC) ? (ITEM *)0 : hitem;
+
+	  do
+	    {
+	      _nc_Post_Item(menu, hitem);
+
+	      wattron(menu->win, (int)menu->back);
+	      if (((hitem = hitem->right) != lasthor) && hitem)
+		{
+		  int i, j, cy, cx;
+		  chtype ch = ' ';
+
+		  getyx(menu->win, cy, cx);
+		  for (j = 0; j < menu->spc_rows; j++)
+		    {
+		      wmove(menu->win, cy + j, cx);
+		      for (i = 0; i < menu->spc_cols; i++)
+			{
+			  waddch(menu->win, ch);
+			}
+		    }
+		  wmove(menu->win, cy, cx + menu->spc_cols);
+		}
+	    }
+	  while (hitem && (hitem != lasthor));
+	  wattroff(menu->win, (int)menu->back);
+
+	  item = item->down;
+	  y += menu->spc_rows;
+
+	}
+      while (item && (item != lastvert));
+    }
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  int post_menu(MENU* menu)
+|
+|   Description   :  Post a menu to the screen. This makes it visible.
+|
+|   Return Values :  E_OK                - success
+|                    E_BAD_ARGUMENT      - not a valid menu pointer
+|                    E_SYSTEM_ERROR      - error in lower layers
+|                    E_NOT_CONNECTED     - No items connected to menu
+|                    E_BAD_STATE         - Menu in userexit routine
+|                    E_POSTED            - Menu already posted
++--------------------------------------------------------------------------*/
+MENU_EXPORT(int)
+post_menu(MENU *menu)
+{
+  T((T_CALLED("post_menu(%p)"), (void *)menu));
+
+  if (!menu)
+    RETURN(E_BAD_ARGUMENT);
+
+  if (menu->status & _IN_DRIVER)
+    RETURN(E_BAD_STATE);
+
+  if (menu->status & _POSTED)
+    RETURN(E_POSTED);
+
+  if (menu->items && *(menu->items))
+    {
+      int h = 1 + menu->spc_rows * (menu->rows - 1);
+
+      WINDOW *win = Get_Menu_Window(menu);
+      int maxy = getmaxy(win);
+
+      if ((menu->win = newpad(h, menu->width)))
+	{
+	  int y = (maxy >= h) ? h : maxy;
+
+	  if (y >= menu->height)
+	    y = menu->height;
+	  if (!(menu->sub = subpad(menu->win, y, menu->width, 0, 0)))
+	    RETURN(E_SYSTEM_ERROR);
+	}
+      else
+	RETURN(E_SYSTEM_ERROR);
+
+      if (menu->status & _LINK_NEEDED)
+	_nc_Link_Items(menu);
+    }
+  else
+    RETURN(E_NOT_CONNECTED);
+
+  SetStatus(menu, _POSTED);
+
+  if (!(menu->opt & O_ONEVALUE))
+    {
+      ITEM **items;
+
+      for (items = menu->items; *items; items++)
+	{
+	  (*items)->value = FALSE;
+	}
+    }
+
+  _nc_Draw_Menu(menu);
+
+  Call_Hook(menu, menuinit);
+  Call_Hook(menu, iteminit);
+
+  _nc_Show_Menu(menu);
+
+  RETURN(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  int unpost_menu(MENU*)
+|
+|   Description   :  Detach menu from screen
+|
+|   Return Values :  E_OK              - success
+|                    E_BAD_ARGUMENT    - not a valid menu pointer
+|                    E_BAD_STATE       - menu in userexit routine
+|                    E_NOT_POSTED      - menu is not posted
++--------------------------------------------------------------------------*/
+MENU_EXPORT(int)
+unpost_menu(MENU *menu)
+{
+  WINDOW *win;
+
+  T((T_CALLED("unpost_menu(%p)"), (void *)menu));
+
+  if (!menu)
+    RETURN(E_BAD_ARGUMENT);
+
+  if (menu->status & _IN_DRIVER)
+    RETURN(E_BAD_STATE);
+
+  if (!(menu->status & _POSTED))
+    RETURN(E_NOT_POSTED);
+
+  Call_Hook(menu, itemterm);
+  Call_Hook(menu, menuterm);
+
+  win = Get_Menu_Window(menu);
+  werase(win);
+  wsyncup(win);
+
+  assert(menu->sub);
+  delwin(menu->sub);
+  menu->sub = (WINDOW *)0;
+
+  assert(menu->win);
+  delwin(menu->win);
+  menu->win = (WINDOW *)0;
+
+  ClrStatus(menu, _POSTED);
+
+  RETURN(E_OK);
+}
+
+/* m_post.c ends here */
diff --git a/menu/m_req_name.c b/menu/m_req_name.c
new file mode 100644
index 0000000..c72116f
--- /dev/null
+++ b/menu/m_req_name.c
@@ -0,0 +1,132 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2012,2015 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+/***************************************************************************
+* Module m_request_name                                                    *
+* Routines to handle external names of menu requests                       *
+***************************************************************************/
+
+#include "menu.priv.h"
+
+MODULE_ID("$Id: m_req_name.c,v 1.27 2021/06/17 21:11:08 tom Exp $")
+
+#define DATA(s) { s }
+
+static const char request_names[MAX_MENU_COMMAND - MIN_MENU_COMMAND + 1][14] =
+{
+  DATA("LEFT_ITEM"),
+  DATA("RIGHT_ITEM"),
+  DATA("UP_ITEM"),
+  DATA("DOWN_ITEM"),
+  DATA("SCR_ULINE"),
+  DATA("SCR_DLINE"),
+  DATA("SCR_DPAGE"),
+  DATA("SCR_UPAGE"),
+  DATA("FIRST_ITEM"),
+  DATA("LAST_ITEM"),
+  DATA("NEXT_ITEM"),
+  DATA("PREV_ITEM"),
+  DATA("TOGGLE_ITEM"),
+  DATA("CLEAR_PATTERN"),
+  DATA("BACK_PATTERN"),
+  DATA("NEXT_MATCH"),
+  DATA("PREV_MATCH")
+};
+
+#define A_SIZE (sizeof(request_names)/sizeof(request_names[0]))
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  const char * menu_request_name (int request);
+|
+|   Description   :  Get the external name of a menu request.
+|
+|   Return Values :  Pointer to name      - on success
+|                    NULL                 - on invalid request code
++--------------------------------------------------------------------------*/
+MENU_EXPORT(const char *)
+menu_request_name(int request)
+{
+  T((T_CALLED("menu_request_name(%d)"), request));
+  if ((request < MIN_MENU_COMMAND) || (request > MAX_MENU_COMMAND))
+    {
+      SET_ERROR(E_BAD_ARGUMENT);
+      returnCPtr((const char *)0);
+    }
+  else
+    returnCPtr(request_names[request - MIN_MENU_COMMAND]);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  int menu_request_by_name (const char *str);
+|
+|   Description   :  Search for a request with this name.
+|
+|   Return Values :  Request Id       - on success
+|                    E_NO_MATCH       - request not found
++--------------------------------------------------------------------------*/
+MENU_EXPORT(int)
+menu_request_by_name(const char *str)
+{
+  /* because the table is so small, it doesn't really hurt
+     to run sequentially through it.
+   */
+  size_t i = 0;
+
+  T((T_CALLED("menu_request_by_name(%s)"), _nc_visbuf(str)));
+
+  if (str != 0 && (i = strlen(str)) != 0)
+    {
+      char buf[16];
+
+      if (i > sizeof(buf) - 2)
+	i = sizeof(buf) - 2;
+      memcpy(buf, str, i);
+      buf[i] = '\0';
+
+      for (i = 0; buf[i] != '\0'; ++i)
+	{
+	  buf[i] = (char)toupper(UChar(buf[i]));
+	}
+
+      for (i = 0; i < A_SIZE; i++)
+	{
+	  if (strcmp(request_names[i], buf) == 0)
+	    returnCode(MIN_MENU_COMMAND + (int)i);
+	}
+    }
+  RETURN(E_NO_MATCH);
+}
+
+/* m_req_name.c ends here */
diff --git a/menu/m_scale.c b/menu/m_scale.c
new file mode 100644
index 0000000..9e7f81d
--- /dev/null
+++ b/menu/m_scale.c
@@ -0,0 +1,77 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2004,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+/***************************************************************************
+* Module m_scale                                                           *
+* Menu scaling routine                                                     *
+***************************************************************************/
+
+#include "menu.priv.h"
+
+MODULE_ID("$Id: m_scale.c,v 1.14 2021/06/17 21:20:30 tom Exp $")
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  int scale_menu(const MENU *menu)
+|
+|   Description   :  Returns the minimum window size necessary for the
+|                    subwindow of menu.
+|
+|   Return Values :  E_OK                  - success
+|                    E_BAD_ARGUMENT        - invalid menu pointer
+|                    E_NOT_CONNECTED       - no items are connected to menu
++--------------------------------------------------------------------------*/
+MENU_EXPORT(int)
+scale_menu(const MENU *menu, int *rows, int *cols)
+{
+  T((T_CALLED("scale_menu(%p,%p,%p)"),
+     (const void *)menu,
+     (void *)rows,
+     (void *)cols));
+
+  if (!menu)
+    RETURN(E_BAD_ARGUMENT);
+
+  if (menu->items && *(menu->items))
+    {
+      if (rows)
+	*rows = menu->height;
+      if (cols)
+	*cols = menu->width;
+      RETURN(E_OK);
+    }
+  else
+    RETURN(E_NOT_CONNECTED);
+}
+
+/* m_scale.c ends here */
diff --git a/menu/m_spacing.c b/menu/m_spacing.c
new file mode 100644
index 0000000..76f8d5c
--- /dev/null
+++ b/menu/m_spacing.c
@@ -0,0 +1,114 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2010,2012 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+/***************************************************************************
+* Module m_spacing                                                         *
+* Routines to handle spacing between entries                               *
+***************************************************************************/
+
+#include "menu.priv.h"
+
+MODULE_ID("$Id: m_spacing.c,v 1.22 2020/12/12 00:38:14 tom Exp $")
+
+#define MAX_SPC_DESC ((TABSIZE) ? (TABSIZE) : 8)
+#define MAX_SPC_COLS ((TABSIZE) ? (TABSIZE) : 8)
+#define MAX_SPC_ROWS (3)
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  int set_menu_spacing(MENU *menu,int desc, int r, int c);
+|
+|   Description   :  Set the spacing between entries
+|
+|   Return Values :  E_OK                 - on success
++--------------------------------------------------------------------------*/
+MENU_EXPORT(int)
+set_menu_spacing(MENU *menu, int s_desc, int s_row, int s_col)
+{
+  MENU *m;			/* split for ATAC workaround */
+
+  T((T_CALLED("set_menu_spacing(%p,%d,%d,%d)"),
+     (void *)menu, s_desc, s_row, s_col));
+
+  m = Normalize_Menu(menu);
+
+  assert(m);
+  if (m->status & _POSTED)
+    RETURN(E_POSTED);
+
+  if (((s_desc < 0) || (s_desc > MAX_SPC_DESC)) ||
+      ((s_row < 0) || (s_row > MAX_SPC_ROWS)) ||
+      ((s_col < 0) || (s_col > MAX_SPC_COLS)))
+    RETURN(E_BAD_ARGUMENT);
+
+  m->spc_desc = (short)(s_desc ? s_desc : 1);
+  m->spc_rows = (short)(s_row ? s_row : 1);
+  m->spc_cols = (short)(s_col ? s_col : 1);
+  _nc_Calculate_Item_Length_and_Width(m);
+
+  RETURN(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  int menu_spacing (const MENU *,int *,int *,int *);
+|
+|   Description   :  Retrieve info about spacing between the entries
+|
+|   Return Values :  E_OK             - on success
++--------------------------------------------------------------------------*/
+MENU_EXPORT(int)
+menu_spacing(const MENU *menu, int *s_desc, int *s_row, int *s_col)
+{
+  const MENU *m;		/* split for ATAC workaround */
+
+  T((T_CALLED("menu_spacing(%p,%p,%p,%p)"),
+     (const void *)menu,
+     (void *)s_desc,
+     (void *)s_row,
+     (void *)s_col));
+
+  m = Normalize_Menu(menu);
+
+  assert(m);
+  if (s_desc)
+    *s_desc = m->spc_desc;
+  if (s_row)
+    *s_row = m->spc_rows;
+  if (s_col)
+    *s_col = m->spc_cols;
+
+  RETURN(E_OK);
+}
+
+/* m_spacing.c ends here */
diff --git a/menu/m_sub.c b/menu/m_sub.c
new file mode 100644
index 0000000..a055245
--- /dev/null
+++ b/menu/m_sub.c
@@ -0,0 +1,101 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2009,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+/***************************************************************************
+* Module m_sub                                                             *
+* Menus subwindow association routines                                     *
+***************************************************************************/
+
+#include "menu.priv.h"
+
+MODULE_ID("$Id: m_sub.c,v 1.16 2021/06/17 21:20:30 tom Exp $")
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  int set_menu_sub(MENU *menu, WINDOW *win)
+|
+|   Description   :  Sets the subwindow of the menu.
+|
+|   Return Values :  E_OK           - success
+|                    E_POSTED       - menu is already posted
++--------------------------------------------------------------------------*/
+MENU_EXPORT(int)
+set_menu_sub(MENU *menu, WINDOW *win)
+{
+  T((T_CALLED("set_menu_sub(%p,%p)"), (void *)menu, (void *)win));
+
+  if (menu)
+    {
+      if (menu->status & _POSTED)
+	RETURN(E_POSTED);
+      else
+#if NCURSES_SP_FUNCS
+	{
+	  /* We ensure that usersub is never null. So even if a null
+	     WINDOW parameter is passed, we store the SCREENS stdscr.
+	     The only MENU that can have a null usersub is the static
+	     _nc_default_Menu.
+	   */
+	  SCREEN *sp = _nc_screen_of(menu->usersub);
+
+	  menu->usersub = win ? win : sp->_stdscr;
+	  _nc_Calculate_Item_Length_and_Width(menu);
+	}
+#else
+	menu->usersub = win;
+#endif
+    }
+  else
+    _nc_Default_Menu.usersub = win;
+
+  RETURN(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  WINDOW* menu_sub(const MENU *menu)
+|
+|   Description   :  Returns a pointer to the subwindow of the menu
+|
+|   Return Values :  NULL on error, otherwise a pointer to the window
++--------------------------------------------------------------------------*/
+MENU_EXPORT(WINDOW *)
+menu_sub(const MENU *menu)
+{
+  const MENU *m = Normalize_Menu(menu);
+
+  T((T_CALLED("menu_sub(%p)"), (const void *)menu));
+  returnWin(Get_Menu_Window(m));
+}
+
+/* m_sub.c ends here */
diff --git a/menu/m_trace.c b/menu/m_trace.c
new file mode 100644
index 0000000..331236c
--- /dev/null
+++ b/menu/m_trace.c
@@ -0,0 +1,79 @@
+/****************************************************************************
+ * Copyright 2018,2020 Thomas E. Dickey                                     *
+ * Copyright 2004-2010,2016 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Thomas E. Dickey                                              *
+ ****************************************************************************/
+
+#include "menu.priv.h"
+
+MODULE_ID("$Id: m_trace.c,v 1.9 2020/12/12 00:38:14 tom Exp $")
+
+MENU_EXPORT(ITEM *)
+_nc_retrace_item(ITEM *code)
+{
+  T((T_RETURN("%p"), (void *)code));
+  return code;
+}
+
+MENU_EXPORT(ITEM **)
+_nc_retrace_item_ptr(ITEM **code)
+{
+  T((T_RETURN("%p"), (void *)code));
+  return code;
+}
+
+MENU_EXPORT(Item_Options)
+_nc_retrace_item_opts(Item_Options code)
+{
+  T((T_RETURN("%d"), code));
+  return code;
+}
+
+MENU_EXPORT(MENU *)
+_nc_retrace_menu(MENU *code)
+{
+  T((T_RETURN("%p"), (void *)code));
+  return code;
+}
+
+MENU_EXPORT(Menu_Hook)
+_nc_retrace_menu_hook(Menu_Hook code)
+{
+  TR_FUNC_BFR(1);
+  T((T_RETURN("%s"), TR_FUNC_ARG(0, code)));
+  return code;
+}
+
+MENU_EXPORT(Menu_Options)
+_nc_retrace_menu_opts(Menu_Options code)
+{
+  T((T_RETURN("%d"), code));
+  return code;
+}
diff --git a/menu/m_userptr.c b/menu/m_userptr.c
new file mode 100644
index 0000000..72f2d4c
--- /dev/null
+++ b/menu/m_userptr.c
@@ -0,0 +1,77 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2004,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+/***************************************************************************
+* Module m_userptr                                                         *
+* Associate application data with menus                                    *
+***************************************************************************/
+
+#include "menu.priv.h"
+
+MODULE_ID("$Id: m_userptr.c,v 1.21 2020/12/12 00:38:14 tom Exp $")
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  int set_menu_userptr(MENU *menu, void *userptr)
+|
+|   Description   :  Set the pointer that is reserved in any menu to store
+|                    application relevant information.
+|
+|   Return Values :  E_OK         - success
++--------------------------------------------------------------------------*/
+MENU_EXPORT(int)
+set_menu_userptr(MENU *menu, void *userptr)
+{
+  T((T_CALLED("set_menu_userptr(%p,%p)"), (void *)menu, (void *)userptr));
+  Normalize_Menu(menu)->userptr = userptr;
+  RETURN(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  void *menu_userptr(const MENU *menu)
+|
+|   Description   :  Return the pointer that is reserved in any menu to
+|                    store application relevant information.
+|
+|   Return Values :  Value of the pointer. If no such pointer has been set,
+|                    NULL is returned
++--------------------------------------------------------------------------*/
+MENU_EXPORT(void *)
+menu_userptr(const MENU *menu)
+{
+  T((T_CALLED("menu_userptr(%p)"), (const void *)menu));
+  returnVoidPtr(Normalize_Menu(menu)->userptr);
+}
+
+/* m_userptr.c ends here */
diff --git a/menu/m_win.c b/menu/m_win.c
new file mode 100644
index 0000000..4bb64e6
--- /dev/null
+++ b/menu/m_win.c
@@ -0,0 +1,101 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2009,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+/***************************************************************************
+* Module m_win                                                             *
+* Menus window association routines                                        *
+***************************************************************************/
+
+#include "menu.priv.h"
+
+MODULE_ID("$Id: m_win.c,v 1.21 2021/06/17 21:20:30 tom Exp $")
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  int set_menu_win(MENU *menu, WINDOW *win)
+|
+|   Description   :  Sets the window of the menu.
+|
+|   Return Values :  E_OK               - success
+|                    E_POSTED           - menu is already posted
++--------------------------------------------------------------------------*/
+MENU_EXPORT(int)
+set_menu_win(MENU *menu, WINDOW *win)
+{
+  T((T_CALLED("set_menu_win(%p,%p)"), (void *)menu, (void *)win));
+
+  if (menu)
+    {
+      if (menu->status & _POSTED)
+	RETURN(E_POSTED);
+      else
+#if NCURSES_SP_FUNCS
+	{
+	  /* We ensure that userwin is never null. So even if a null
+	     WINDOW parameter is passed, we store the SCREENS stdscr.
+	     The only MENU that can have a null userwin is the static
+	     _nc_default_Menu.
+	   */
+	  SCREEN *sp = _nc_screen_of(menu->userwin);
+
+	  menu->userwin = win ? win : sp->_stdscr;
+	  _nc_Calculate_Item_Length_and_Width(menu);
+	}
+#else
+	menu->userwin = win;
+#endif
+    }
+  else
+    _nc_Default_Menu.userwin = win;
+
+  RETURN(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+|   Facility      :  libnmenu
+|   Function      :  WINDOW* menu_win(const MENU*)
+|
+|   Description   :  Returns pointer to the window of the menu
+|
+|   Return Values :  NULL on error, otherwise pointer to window
++--------------------------------------------------------------------------*/
+MENU_EXPORT(WINDOW *)
+menu_win(const MENU *menu)
+{
+  const MENU *m = Normalize_Menu(menu);
+
+  T((T_CALLED("menu_win(%p)"), (const void *)menu));
+  returnWin(Get_Menu_UserWin(m));
+}
+
+/* m_win.c ends here */
diff --git a/menu/menu.h b/menu/menu.h
new file mode 100644
index 0000000..e5a5372
--- /dev/null
+++ b/menu/menu.h
@@ -0,0 +1,281 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+/* $Id: menu.h,v 1.26 2020/12/12 00:38:02 tom Exp $ */
+
+#ifndef ETI_MENU
+#define ETI_MENU
+
+#ifdef AMIGA
+#define TEXT TEXT_ncurses
+#endif
+
+#include <curses.h>
+#include <eti.h>
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#if defined(BUILDING_MENU)
+# define MENU_IMPEXP NCURSES_EXPORT_GENERAL_EXPORT
+#else
+# define MENU_IMPEXP NCURSES_EXPORT_GENERAL_IMPORT
+#endif
+
+#define MENU_WRAPPED_VAR(type,name) extern MENU_IMPEXP type NCURSES_PUBLIC_VAR(name)(void)
+
+#define MENU_EXPORT(type) MENU_IMPEXP type NCURSES_API
+#define MENU_EXPORT_VAR(type) MENU_IMPEXP type
+
+  typedef int Menu_Options;
+  typedef int Item_Options;
+
+/* Menu options: */
+#define O_ONEVALUE      (0x01)
+#define O_SHOWDESC      (0x02)
+#define O_ROWMAJOR      (0x04)
+#define O_IGNORECASE    (0x08)
+#define O_SHOWMATCH     (0x10)
+#define O_NONCYCLIC     (0x20)
+#define O_MOUSE_MENU    (0x40)
+
+/* Item options: */
+#define O_SELECTABLE    (0x01)
+
+#if !NCURSES_OPAQUE_MENU
+  typedef struct
+    {
+      const char *str;
+      unsigned short length;
+    }
+  TEXT;
+#endif				/* !NCURSES_OPAQUE_MENU */
+
+  struct tagMENU;
+
+  typedef struct tagITEM
+#if !NCURSES_OPAQUE_MENU
+    {
+      TEXT name;		/* name of menu item                         */
+      TEXT description;		/* description of item, optional in display  */
+      struct tagMENU *imenu;	/* Pointer to parent menu                    */
+      void *userptr;		/* Pointer to user defined per item data     */
+      Item_Options opt;		/* Item options                              */
+      short index;		/* Item number if connected to a menu        */
+      short y;			/* y and x location of item in menu          */
+      short x;
+      bool value;		/* Selection value                           */
+
+      struct tagITEM *left;	/* neighbor items                            */
+      struct tagITEM *right;
+      struct tagITEM *up;
+      struct tagITEM *down;
+
+    }
+#endif				/* !NCURSES_OPAQUE_MENU */
+  ITEM;
+
+  typedef void (*Menu_Hook) (struct tagMENU *);
+
+  typedef struct tagMENU
+#if 1				/* not yet: !NCURSES_OPAQUE_MENU   */
+    {
+      short height;		/* Nr. of chars high               */
+      short width;		/* Nr. of chars wide               */
+      short rows;		/* Nr. of items high               */
+      short cols;		/* Nr. of items wide               */
+      short frows;		/* Nr. of formatted items high     */
+      short fcols;		/* Nr. of formatted items wide     */
+      short arows;		/* Nr. of items high (actual)      */
+      short namelen;		/* Max. name length                */
+      short desclen;		/* Max. description length         */
+      short marklen;		/* Length of mark, if any          */
+      short itemlen;		/* Length of one item              */
+      short spc_desc;		/* Spacing for descriptor          */
+      short spc_cols;		/* Spacing for columns             */
+      short spc_rows;		/* Spacing for rows                */
+      char *pattern;		/* Buffer to store match chars     */
+      short pindex;		/* Index into pattern buffer       */
+      WINDOW *win;		/* Window containing menu          */
+      WINDOW *sub;		/* Subwindow for menu display      */
+      WINDOW *userwin;		/* User's window                   */
+      WINDOW *usersub;		/* User's subwindow                */
+      ITEM **items;		/* array of items                  */
+      short nitems;		/* Nr. of items in menu            */
+      ITEM *curitem;		/* Current item                    */
+      short toprow;		/* Top row of menu                 */
+      chtype fore;		/* Selection attribute             */
+      chtype back;		/* Nonselection attribute          */
+      chtype grey;		/* Inactive attribute              */
+      unsigned char pad;	/* Pad character                   */
+
+      Menu_Hook menuinit;	/* User hooks                      */
+      Menu_Hook menuterm;
+      Menu_Hook iteminit;
+      Menu_Hook itemterm;
+
+      void *userptr;		/* Pointer to menus user data      */
+      char *mark;		/* Pointer to marker string        */
+
+      Menu_Options opt;		/* Menu options                    */
+      unsigned short status;	/* Internal state of menu          */
+    }
+#endif				/* !NCURSES_OPAQUE_MENU */
+  MENU;
+
+/* Define keys */
+
+#define REQ_LEFT_ITEM           (KEY_MAX + 1)
+#define REQ_RIGHT_ITEM          (KEY_MAX + 2)
+#define REQ_UP_ITEM             (KEY_MAX + 3)
+#define REQ_DOWN_ITEM           (KEY_MAX + 4)
+#define REQ_SCR_ULINE           (KEY_MAX + 5)
+#define REQ_SCR_DLINE           (KEY_MAX + 6)
+#define REQ_SCR_DPAGE           (KEY_MAX + 7)
+#define REQ_SCR_UPAGE           (KEY_MAX + 8)
+#define REQ_FIRST_ITEM          (KEY_MAX + 9)
+#define REQ_LAST_ITEM           (KEY_MAX + 10)
+#define REQ_NEXT_ITEM           (KEY_MAX + 11)
+#define REQ_PREV_ITEM           (KEY_MAX + 12)
+#define REQ_TOGGLE_ITEM         (KEY_MAX + 13)
+#define REQ_CLEAR_PATTERN       (KEY_MAX + 14)
+#define REQ_BACK_PATTERN        (KEY_MAX + 15)
+#define REQ_NEXT_MATCH          (KEY_MAX + 16)
+#define REQ_PREV_MATCH          (KEY_MAX + 17)
+
+#define MIN_MENU_COMMAND        (KEY_MAX + 1)
+#define MAX_MENU_COMMAND        (KEY_MAX + 17)
+
+/*
+ * Some AT&T code expects MAX_COMMAND to be out-of-band not
+ * just for menu commands but for forms ones as well.
+ */
+#if defined(MAX_COMMAND)
+#  if (MAX_MENU_COMMAND > MAX_COMMAND)
+#    error Something is wrong -- MAX_MENU_COMMAND is greater than MAX_COMMAND
+#  elif (MAX_COMMAND != (KEY_MAX + 128))
+#    error Something is wrong -- MAX_COMMAND is already inconsistently defined.
+#  endif
+#else
+#  define MAX_COMMAND (KEY_MAX + 128)
+#endif
+
+/* --------- prototypes for libmenu functions ----------------------------- */
+
+  extern MENU_EXPORT(ITEM **) menu_items(const MENU *);
+  extern MENU_EXPORT(ITEM *) current_item(const MENU *);
+  extern MENU_EXPORT(ITEM *) new_item(const char *, const char *);
+
+  extern MENU_EXPORT(MENU *) new_menu(ITEM **);
+
+  extern MENU_EXPORT(Item_Options) item_opts(const ITEM *);
+  extern MENU_EXPORT(Menu_Options) menu_opts(const MENU *);
+
+  extern MENU_EXPORT(Menu_Hook) item_init(const MENU *);
+  extern MENU_EXPORT(Menu_Hook) item_term(const MENU *);
+  extern MENU_EXPORT(Menu_Hook) menu_init(const MENU *);
+  extern MENU_EXPORT(Menu_Hook) menu_term(const MENU *);
+
+  extern MENU_EXPORT(WINDOW *) menu_sub(const MENU *);
+  extern MENU_EXPORT(WINDOW *) menu_win(const MENU *);
+
+  extern MENU_EXPORT(const char *) item_description(const ITEM *);
+  extern MENU_EXPORT(const char *) item_name(const ITEM *);
+  extern MENU_EXPORT(const char *) menu_mark(const MENU *);
+  extern MENU_EXPORT(const char *) menu_request_name(int);
+
+  extern MENU_EXPORT(char *) menu_pattern(const MENU *);
+
+  extern MENU_EXPORT(void *) menu_userptr(const MENU *);
+  extern MENU_EXPORT(void *) item_userptr(const ITEM *);
+
+  extern MENU_EXPORT(chtype) menu_back(const MENU *);
+  extern MENU_EXPORT(chtype) menu_fore(const MENU *);
+  extern MENU_EXPORT(chtype) menu_grey(const MENU *);
+
+  extern MENU_EXPORT(int) free_item(ITEM *);
+  extern MENU_EXPORT(int) free_menu(MENU *);
+  extern MENU_EXPORT(int) item_count(const MENU *);
+  extern MENU_EXPORT(int) item_index(const ITEM *);
+  extern MENU_EXPORT(int) item_opts_off(ITEM *, Item_Options);
+  extern MENU_EXPORT(int) item_opts_on(ITEM *, Item_Options);
+  extern MENU_EXPORT(int) menu_driver(MENU *, int);
+  extern MENU_EXPORT(int) menu_opts_off(MENU *, Menu_Options);
+  extern MENU_EXPORT(int) menu_opts_on(MENU *, Menu_Options);
+  extern MENU_EXPORT(int) menu_pad(const MENU *);
+  extern MENU_EXPORT(int) pos_menu_cursor(const MENU *);
+  extern MENU_EXPORT(int) post_menu(MENU *);
+  extern MENU_EXPORT(int) scale_menu(const MENU *, int *, int *);
+  extern MENU_EXPORT(int) set_current_item(MENU *menu, ITEM *item);
+  extern MENU_EXPORT(int) set_item_init(MENU *, Menu_Hook);
+  extern MENU_EXPORT(int) set_item_opts(ITEM *, Item_Options);
+  extern MENU_EXPORT(int) set_item_term(MENU *, Menu_Hook);
+  extern MENU_EXPORT(int) set_item_userptr(ITEM *, void *);
+  extern MENU_EXPORT(int) set_item_value(ITEM *, bool);
+  extern MENU_EXPORT(int) set_menu_back(MENU *, chtype);
+  extern MENU_EXPORT(int) set_menu_fore(MENU *, chtype);
+  extern MENU_EXPORT(int) set_menu_format(MENU *, int, int);
+  extern MENU_EXPORT(int) set_menu_grey(MENU *, chtype);
+  extern MENU_EXPORT(int) set_menu_init(MENU *, Menu_Hook);
+  extern MENU_EXPORT(int) set_menu_items(MENU *, ITEM **);
+  extern MENU_EXPORT(int) set_menu_mark(MENU *, const char *);
+  extern MENU_EXPORT(int) set_menu_opts(MENU *, Menu_Options);
+  extern MENU_EXPORT(int) set_menu_pad(MENU *, int);
+  extern MENU_EXPORT(int) set_menu_pattern(MENU *, const char *);
+  extern MENU_EXPORT(int) set_menu_sub(MENU *, WINDOW *);
+  extern MENU_EXPORT(int) set_menu_term(MENU *, Menu_Hook);
+  extern MENU_EXPORT(int) set_menu_userptr(MENU *, void *);
+  extern MENU_EXPORT(int) set_menu_win(MENU *, WINDOW *);
+  extern MENU_EXPORT(int) set_top_row(MENU *, int);
+  extern MENU_EXPORT(int) top_row(const MENU *);
+  extern MENU_EXPORT(int) unpost_menu(MENU *);
+  extern MENU_EXPORT(int) menu_request_by_name(const char *);
+  extern MENU_EXPORT(int) set_menu_spacing(MENU *, int, int, int);
+  extern MENU_EXPORT(int) menu_spacing(const MENU *, int *, int *, int *);
+
+  extern MENU_EXPORT(bool) item_value(const ITEM *);
+  extern MENU_EXPORT(bool) item_visible(const ITEM *);
+
+  extern MENU_EXPORT(void) menu_format(const MENU *, int *, int *);
+
+#if NCURSES_SP_FUNCS
+  extern MENU_EXPORT(MENU *) NCURSES_SP_NAME(new_menu) (SCREEN *, ITEM **);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif				/* ETI_MENU */
diff --git a/menu/menu.priv.h b/menu/menu.priv.h
new file mode 100644
index 0000000..0bc6147
--- /dev/null
+++ b/menu/menu.priv.h
@@ -0,0 +1,164 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+/* $Id: menu.priv.h,v 1.29 2020/05/24 01:40:20 anonymous.maarten Exp $ */
+
+/***************************************************************************
+* Module menu.priv.h                                                       *
+* Top level private header file for all libnmenu modules                   *
+***************************************************************************/
+
+#ifndef MENU_PRIV_H_incl
+#define MENU_PRIV_H_incl 1
+/* *INDENT-OFF* */
+
+#include "curses.priv.h"
+
+#define NCURSES_OPAQUE_MENU 0
+
+#include "mf_common.h"
+#include "menu.h"
+
+/* Backspace code */
+#define BS (8)
+
+extern MENU_EXPORT_VAR(ITEM) _nc_Default_Item;
+extern MENU_EXPORT_VAR(MENU) _nc_Default_Menu;
+
+/* Normalize item to default if none was given */
+#define Normalize_Item( item ) ((item)=(item)?(item):&_nc_Default_Item)
+
+/* Normalize menu to default if none was given */
+#define Normalize_Menu( menu ) ((menu)=(menu)?(menu):&_nc_Default_Menu)
+
+#define Get_Menu_Screen( menu ) (menu->userwin ? \
+				 _nc_screen_of(menu->userwin) : CURRENT_SCREEN)
+
+/* Get the user defined (framing) window of the menu */
+#define Get_Menu_UserWin(menu) ((menu)->userwin ? \
+    (menu)->userwin : CURRENT_SCREEN->_stdscr)
+
+/* Normalize menu window */
+#define Get_Menu_Window(  menu ) \
+   ((menu)->usersub  ? (menu)->usersub  : Get_Menu_UserWin(menu))
+
+/* menu specific status flags */
+#define _LINK_NEEDED    (0x04)
+#define _MARK_ALLOCATED (0x08)
+
+#define ALL_MENU_OPTS (                 \
+		       O_ONEVALUE     | \
+		       O_SHOWDESC     | \
+		       O_ROWMAJOR     | \
+		       O_IGNORECASE   | \
+		       O_SHOWMATCH    | \
+		       O_NONCYCLIC    | \
+		       O_MOUSE_MENU   )
+
+#define ALL_ITEM_OPTS (O_SELECTABLE)
+
+/* Move to the window position of an item and draw it */
+#define Move_And_Post_Item(menu,item) \
+  {wmove((menu)->win,(menu)->spc_rows*(item)->y,((menu)->itemlen+(menu)->spc_cols)*(item)->x);\
+   _nc_Post_Item((menu),(item));}
+
+#define Move_To_Current_Item(menu,item) \
+  if ( (item) != (menu)->curitem)\
+    {\
+      Move_And_Post_Item(menu,item);\
+      Move_And_Post_Item(menu,(menu)->curitem);\
+    }
+
+/* This macro ensures, that the item becomes visible, if possible with the
+   specified row as the top row of the window. If this is not possible,
+   the top row will be adjusted and the value is stored in the row argument.
+*/
+#define Adjust_Current_Item(menu,row,item) \
+  { if ((item)->y < row) \
+      row = (short) (item)->y; \
+    if ( (item)->y >= (row + (menu)->arows) ) \
+      row = (short) (( (item)->y < ((menu)->rows - row) ) \
+                     ? (item)->y \
+		     : (menu)->rows - (menu)->arows); \
+    _nc_New_TopRow_and_CurrentItem(menu,row,item); }
+
+/* Reset the match pattern buffer */
+#define Reset_Pattern(menu) \
+  { (menu)->pindex = 0; \
+    (menu)->pattern[0] = '\0'; }
+
+#define UChar(c)	((unsigned char)(c))
+
+/* Internal functions. */
+extern MENU_EXPORT(void) _nc_Draw_Menu (const MENU *);
+extern MENU_EXPORT(void) _nc_Show_Menu (const MENU *);
+extern MENU_EXPORT(void) _nc_Calculate_Item_Length_and_Width (MENU *);
+extern MENU_EXPORT(int)  _nc_Calculate_Text_Width(const TEXT *);
+extern MENU_EXPORT(void) _nc_Post_Item (const MENU *, const ITEM *);
+extern MENU_EXPORT(bool) _nc_Connect_Items (MENU *, ITEM **);
+extern MENU_EXPORT(void) _nc_Disconnect_Items (MENU *);
+extern MENU_EXPORT(void) _nc_New_TopRow_and_CurrentItem (MENU *,int, ITEM *);
+extern MENU_EXPORT(void) _nc_Link_Items (MENU *);
+extern MENU_EXPORT(int)  _nc_Match_Next_Character_In_Item_Name (MENU*,int,ITEM**);
+extern MENU_EXPORT(int)  _nc_menu_cursor_pos (const MENU* menu, const ITEM* item,
+				int* pY, int* pX);
+
+#ifdef TRACE
+
+#define returnItem(code)	TRACE_RETURN1(code,item)
+#define returnItemPtr(code)	TRACE_RETURN1(code,item_ptr)
+#define returnItemOpts(code)	TRACE_RETURN1(code,item_opts)
+#define returnMenu(code)	TRACE_RETURN1(code,menu)
+#define returnMenuHook(code)	TRACE_RETURN1(code,menu_hook)
+#define returnMenuOpts(code)	TRACE_RETURN1(code,menu_opts)
+
+extern MENU_EXPORT(ITEM *)	    _nc_retrace_item (ITEM *);
+extern MENU_EXPORT(ITEM **)	    _nc_retrace_item_ptr (ITEM **);
+extern MENU_EXPORT(Item_Options) _nc_retrace_item_opts (Item_Options);
+extern MENU_EXPORT(MENU *)	    _nc_retrace_menu (MENU *);
+extern MENU_EXPORT(Menu_Hook)    _nc_retrace_menu_hook (Menu_Hook);
+extern MENU_EXPORT(Menu_Options) _nc_retrace_menu_opts (Menu_Options);
+
+#else /* !TRACE */
+
+#define returnItem(code)	return code
+#define returnItemPtr(code)	return code
+#define returnItemOpts(code)	return code
+#define returnMenu(code)	return code
+#define returnMenuHook(code)	return code
+#define returnMenuOpts(code)	return code
+
+#endif /* TRACE/!TRACE */
+/* *INDENT-ON* */
+
+#endif /* MENU_PRIV_H_incl */
diff --git a/menu/mf_common.h b/menu/mf_common.h
new file mode 100644
index 0000000..fcbd565
--- /dev/null
+++ b/menu/mf_common.h
@@ -0,0 +1,98 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2005,2012 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Juergen Pfeifer, 1995,1997                                    *
+ ****************************************************************************/
+
+/* $Id: mf_common.h,v 0.25 2020/02/02 23:34:34 tom Exp $ */
+
+/* Common internal header for menu and form library */
+
+#ifndef MF_COMMON_H_incl
+#define MF_COMMON_H_incl 1
+
+#include <ncurses_cfg.h>
+#include <curses.h>
+
+#include <stdlib.h>
+#include <sys/types.h>
+#include <assert.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+
+#if DECL_ERRNO
+extern int errno;
+#endif
+
+/* in case of debug version we ignore the suppression of assertions */
+#ifdef TRACE
+#  ifdef NDEBUG
+#    undef NDEBUG
+#  endif
+#endif
+
+#include <nc_alloc.h>
+
+#if USE_RCS_IDS
+#define MODULE_ID(id) static const char Ident[] = id;
+#else
+#define MODULE_ID(id)		/*nothing */
+#endif
+
+/* Maximum regular 8-bit character code */
+#define MAX_REGULAR_CHARACTER (0xff)
+
+#define SET_ERROR(code) (errno=(code))
+#define GET_ERROR()     (errno)
+
+#ifdef TRACE
+#define RETURN(code)    returnCode( SET_ERROR(code) )
+#else
+#define RETURN(code)    return( SET_ERROR(code) )
+#endif
+
+/* The few common values in the status fields for menus and forms */
+#define _POSTED         (0x01U)	/* menu or form is posted                  */
+#define _IN_DRIVER      (0x02U)	/* menu or form is processing hook routine */
+
+#define SetStatus(target,mask) (target)->status |= (unsigned short) (mask)
+#define ClrStatus(target,mask) (target)->status = (unsigned short) (target->status & (~mask))
+
+/* Call object hook */
+#define Call_Hook( object, handler ) \
+   if ( (object) != 0 && ((object)->handler) != (void *) 0 )\
+   {\
+	SetStatus(object, _IN_DRIVER);\
+	(object)->handler(object);\
+	ClrStatus(object, _IN_DRIVER);\
+   }
+
+#endif /* MF_COMMON_H_incl */
diff --git a/menu/modules b/menu/modules
new file mode 100644
index 0000000..80ffb35
--- /dev/null
+++ b/menu/modules
@@ -0,0 +1,64 @@
+# $Id: modules,v 1.19 2020/02/02 23:34:34 tom Exp $
+##############################################################################
+# Copyright 2020 Thomas E. Dickey                                            #
+# Copyright 1998-2006,2010 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey	1996-on
+#
+
+@ base
+# Library objects
+m_attribs	lib		$(srcdir)	$(HEADER_DEPS)
+m_cursor	lib		$(srcdir)	$(HEADER_DEPS)
+m_driver	lib		$(srcdir)	$(HEADER_DEPS)
+m_format	lib		$(srcdir)	$(HEADER_DEPS)
+m_global	lib		$(srcdir)	$(HEADER_DEPS)
+m_hook		lib		$(srcdir)	$(HEADER_DEPS)
+m_item_cur	lib		$(srcdir)	$(HEADER_DEPS)
+m_item_nam	lib		$(srcdir)	$(HEADER_DEPS)
+m_item_new	lib		$(srcdir)	$(HEADER_DEPS)
+m_item_opt	lib		$(srcdir)	$(HEADER_DEPS)
+m_item_top	lib		$(srcdir)	$(HEADER_DEPS)
+m_item_use	lib		$(srcdir)	$(HEADER_DEPS)
+m_item_val	lib		$(srcdir)	$(HEADER_DEPS)
+m_item_vis	lib		$(srcdir)	$(HEADER_DEPS)
+m_items		lib		$(srcdir)	$(HEADER_DEPS)
+m_new		lib		$(srcdir)	$(HEADER_DEPS)
+m_opts		lib		$(srcdir)	$(HEADER_DEPS)
+m_pad		lib		$(srcdir)	$(HEADER_DEPS)
+m_pattern	lib		$(srcdir)	$(HEADER_DEPS)
+m_post		lib		$(srcdir)	$(HEADER_DEPS)
+m_req_name	lib		$(srcdir)	$(HEADER_DEPS)
+m_scale		lib		$(srcdir)	$(HEADER_DEPS)
+m_spacing	lib		$(srcdir)	$(HEADER_DEPS)
+m_sub		lib		$(srcdir)	$(HEADER_DEPS)
+m_trace		lib		$(srcdir)	$(HEADER_DEPS)
+m_userptr	lib		$(srcdir)	$(HEADER_DEPS)
+m_win		lib		$(srcdir)	$(HEADER_DEPS)
+
+# vile:makemode
diff --git a/misc/Makefile.in b/misc/Makefile.in
new file mode 100644
index 0000000..1539973
--- /dev/null
+++ b/misc/Makefile.in
@@ -0,0 +1,225 @@
+# $Id: Makefile.in,v 1.79 2021/11/06 23:36:12 tom Exp $
+##############################################################################
+# Copyright 2018-2020,2021 Thomas E. Dickey                                  #
+# Copyright 1998-2016,2017 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey 1996-on
+#
+# Makefile for ncurses miscellany directory
+#
+# This makes/installs the terminfo database
+#
+# The variable 'srcdir' refers to the source-distribution, and can be set with
+# the configure script by "--srcdir=DIR".
+#
+# The rules are organized to produce the libraries for the configured models,
+# and the programs with the configured default model.
+
+# turn off _all_ suffix rules; we'll generate our own
+.SUFFIXES :
+
+SHELL		= @SHELL@
+VPATH		= @srcdir@
+THIS		= Makefile
+
+CF_MFLAGS 	= @cf_cv_makeflags@
+@SET_MAKE@
+
+DESTDIR		= @DESTDIR@
+top_srcdir	= @top_srcdir@
+srcdir		= @srcdir@
+prefix		= @prefix@
+exec_prefix	= @exec_prefix@
+bindir		= @bindir@
+libdir		= @libdir@
+datarootdir	= @datarootdir@
+datadir		= @datadir@
+includesubdir	= @includesubdir@
+
+INCLUDEDIR	= $(DESTDIR)$(includedir)$(includesubdir)
+
+tabsetdir	= $(datadir)/tabset
+ticdir		= @TERMINFO@
+ticfile		= $(ticdir).db
+source		= @TERMINFO_SRC@
+
+INSTALL		= @INSTALL@
+INSTALL_PROGRAM	= @INSTALL_PROGRAM@
+INSTALL_SCRIPT	= @INSTALL_SCRIPT@
+INSTALL_DATA	= @INSTALL_DATA@
+
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+
+################################################################################
+
+@MAKE_PHONY@.PHONY :	all
+@MAKE_PHONY@.PHONY :	check
+@MAKE_PHONY@.PHONY :	clean
+@MAKE_PHONY@.PHONY :	depend
+@MAKE_PHONY@.PHONY :	distclean
+@MAKE_PHONY@.PHONY :	install
+@MAKE_PHONY@.PHONY :	install.data
+@MAKE_PHONY@.PHONY :	install.libs
+@MAKE_PHONY@.PHONY :	libs
+@MAKE_PHONY@.PHONY :	mostlyclean
+@MAKE_PHONY@.PHONY :	realclean
+@MAKE_PHONY@.PHONY :	sources
+@MAKE_PHONY@.PHONY :	uninstall
+@MAKE_PHONY@.PHONY :	uninstall.data
+@MAKE_PHONY@.PHONY :	uninstall.libs
+
+all \
+depend \
+sources ::
+
+@MAKE_DATABASE@all \
+@MAKE_DATABASE@sources :: terminfo.tmp
+
+@MAKE_DATABASE@install :: @MISC_INSTALL_DATA@
+
+@MAKE_DATABASE@install.data ::	terminfo.tmp \
+@MAKE_DATABASE@		$(DESTDIR)$(libdir) \
+@MAKE_DATABASE@		$(DESTDIR)$(datadir) \
+@MAKE_DATABASE@		$(DESTDIR)$(tabsetdir)
+@MAKE_DATABASE@	DESTDIR=${DESTDIR} \
+@MAKE_DATABASE@	prefix=${prefix} \
+@MAKE_DATABASE@	exec_prefix=${exec_prefix} \
+@MAKE_DATABASE@	bindir=${bindir} \
+@MAKE_DATABASE@	top_srcdir=${top_srcdir} \
+@MAKE_DATABASE@	srcdir=${srcdir} \
+@MAKE_DATABASE@	datadir=${datadir} \
+@MAKE_DATABASE@	ticdir=${ticdir} \
+@MAKE_DATABASE@	source=terminfo.tmp \
+@MAKE_DATABASE@	cross_compiling=@cross_compiling@ \
+@MAKE_DATABASE@	$(SHELL) ./run_tic.sh
+@MAKE_DATABASE@	@( cd $(srcdir)/tabset && \
+@MAKE_DATABASE@		$(SHELL) -c 'for i in * ; do \
+@MAKE_DATABASE@			if test -f $$i ; then \
+@MAKE_DATABASE@			echo installing $$i; \
+@MAKE_DATABASE@			$(INSTALL_DATA) $$i $(DESTDIR)$(tabsetdir)/$$i; \
+@MAKE_DATABASE@			fi; done' )
+install.data ::
+	@echo "finished $@"
+
+NCURSES_CONFIG	= ncurses@DFT_ARG_SUFFIX@@cf_cv_abi_version@@cf_config_suffix@-config
+
+install \
+install.libs :: $(DESTDIR)$(bindir) ncurses-config
+	$(INSTALL_SCRIPT) ncurses-config $(DESTDIR)$(bindir)/$(NCURSES_CONFIG)
+
+# Make a list of the files that gen-pkgconfig might create:
+@MAKE_PC_FILES@PC_FILES = \
+@MAKE_PC_FILES@	@LIB_NAME@@USE_ARG_SUFFIX@@PC_MODULE_SUFFIX@.pc \
+@MAKE_PC_FILES@	@TINFO_ARG_SUFFIX@@PC_MODULE_SUFFIX@.pc \
+@MAKE_PC_FILES@	@TICS_NAME@@USE_ARG_SUFFIX@@PC_MODULE_SUFFIX@.pc \
+@MAKE_PC_FILES@	@PANEL_NAME@@USE_ARG_SUFFIX@@PC_MODULE_SUFFIX@.pc \
+@MAKE_PC_FILES@	@MENU_NAME@@USE_ARG_SUFFIX@@PC_MODULE_SUFFIX@.pc \
+@MAKE_PC_FILES@	@FORM_NAME@@USE_ARG_SUFFIX@@PC_MODULE_SUFFIX@.pc \
+@MAKE_PC_FILES@	@CXX_NAME@@USE_ARG_SUFFIX@@PC_MODULE_SUFFIX@.pc
+
+# some packagers prefer to be able to construct pc-files on servers where
+# pkg-config is not installed.  Work around that by creating the library
+# directory during this rule:
+@MAKE_PC_FILES@install \
+@MAKE_PC_FILES@install.libs :: pc-files
+@MAKE_PC_FILES@	@$(SHELL) -c 'case "x$(PKG_CONFIG_LIBDIR)" in \
+@MAKE_PC_FILES@		x/*) \
+@MAKE_PC_FILES@			mkdir -p $(DESTDIR)$(PKG_CONFIG_LIBDIR); \
+@MAKE_PC_FILES@			for name in $(PC_FILES); do \
+@MAKE_PC_FILES@				test -f $$name || continue; \
+@MAKE_PC_FILES@				echo installing $$name; \
+@MAKE_PC_FILES@				$(INSTALL_DATA) $$name $(DESTDIR)$(PKG_CONFIG_LIBDIR)/$$name; \
+@MAKE_PC_FILES@			done \
+@MAKE_PC_FILES@			;; \
+@MAKE_PC_FILES@		*) \
+@MAKE_PC_FILES@			echo "...skip actual install: no destination was given" ; \
+@MAKE_PC_FILES@			;; \
+@MAKE_PC_FILES@		esac'
+
+@MAKE_PC_FILES@all \
+@MAKE_PC_FILES@sources :: pc-files
+@MAKE_PC_FILES@pc-files :
+@MAKE_PC_FILES@	$(SHELL) ./gen-pkgconfig
+@MAKE_PC_FILES@	-touch $@
+
+terminfo.tmp : run_tic.sed $(source)
+	echo '** adjusting tabset paths'
+	sed -f run_tic.sed $(source) >terminfo.tmp
+
+run_tic.sed :
+	WHICH_XTERM=@WHICH_XTERM@ \
+	XTERM_KBS=@XTERM_KBS@ \
+	datadir=${datadir} \
+	$(SHELL) $(srcdir)/gen_edit.sh >$@
+
+$(DESTDIR)$(bindir) \
+$(DESTDIR)$(libdir) \
+$(DESTDIR)$(datadir) \
+$(DESTDIR)$(tabsetdir) :
+	mkdir -p $@
+
+uninstall : @MISC_UNINSTALL_DATA@ uninstall.libs
+
+uninstall.data :
+	-test -d $(DESTDIR)$(tabsetdir) && rm -rf $(DESTDIR)$(tabsetdir)
+	-test -d $(DESTDIR)$(ticdir) && rm -rf $(DESTDIR)$(ticdir)
+	-test -f $(DESTDIR)$(ticfile) && rm -f $(DESTDIR)$(ticfile)
+
+uninstall.libs :
+	-rm -f $(DESTDIR)$(bindir)/$(NCURSES_CONFIG)
+@MAKE_PC_FILES@	@$(SHELL) -c 'case x$(DESTDIR)$(PKG_CONFIG_LIBDIR) in \
+@MAKE_PC_FILES@	x/*) \
+@MAKE_PC_FILES@		for name in $(PC_FILES); do \
+@MAKE_PC_FILES@			test -f $$name || continue; \
+@MAKE_PC_FILES@			echo uninstalling $$name; \
+@MAKE_PC_FILES@			rm -f $(DESTDIR)$(PKG_CONFIG_LIBDIR)/$$name; \
+@MAKE_PC_FILES@		done \
+@MAKE_PC_FILES@		;; \
+@MAKE_PC_FILES@	esac'
+
+tags :
+
+@MAKE_UPPER_TAGS@TAGS :
+
+mostlyclean :
+@MAKE_DATABASE@	-rm -f terminfo.tmp
+@MAKE_DATABASE@	-rm -f run_tic.sed
+@MAKE_PC_FILES@	-rm -f pc-files $(PC_FILES)
+	-rm -f core tags TAGS *~ *.bak *.ln *.atac trace
+
+clean :: mostlyclean
+
+distclean : clean
+@MAKE_PC_FILES@	-rm -f gen-pkgconfig
+	-rm -f Makefile run_tic.sh ncurses-config
+
+realclean : distclean
+
+###############################################################################
+# The remainder of this file is automatically generated during configuration
+###############################################################################
diff --git a/misc/chkdef.cmd b/misc/chkdef.cmd
new file mode 100644
index 0000000..a80230d
--- /dev/null
+++ b/misc/chkdef.cmd
@@ -0,0 +1,115 @@
+/****************************************************************************

+ * Copyright 2020 Thomas E. Dickey                                          *

+ * Copyright 1998,2006 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: chkdef.cmd,v 1.4 2020/02/02 23:34:34 tom Exp $

+ *

+ * Author:  Juan Jose Garcia Ripoll <worm@arrakis.es>.

+ * Webpage: http://www.arrakis.es/~worm/

+ *

+ * chkdef.cmd - checks that a .def file has no conflicts and is properly

+ *		formatted.

+ *

+ * returns nonzero if two symbols have the same code or a line has a wrong

+ * format.

+ *

+ * returns 0 otherwise

+ *

+ * the standard output shows conflicts.

+ */

+parse arg def_file

+

+def_file = translate(def_file,'\','/')

+

+call CleanQueue

+

+/*

+ * `cmp' is zero when the file is valid

+ * `codes' associates a name to a code

+ * `names' associates a code to a name

+ */

+cmp    = 0

+codes. = 0

+names. = ''

+

+/*

+ * This sed expression cleans empty lines, comments and special .DEF

+ * commands, such as LIBRARY..., EXPORTS..., etc

+ */

+tidy_up  = '"s/[ 	][ 	]*/ /g;s/;.*//g;/^[ ]*$/d;/^[a-zA-Z]/d;"'

+

+/*

+ * First we find all public symbols from the original DLL. All this

+ * information is pushed into a REXX private list with the RXQUEUE

+ * utility program.

+ */

+'@echo off'

+'type' def_file '| sed' tidy_up '| sort | rxqueue'

+

+do while queued() > 0

+   /*

+    * We retrieve the symbol name (NEW_NAME) and its code (NEW_CODE)

+    */

+   parse pull '"' new_name '"' '@'new_code rest

+   select

+      when (new_code = '') | (new_name = '') then

+         /* The input was not properly formatted */

+         do

+         say 'Error: symbol "'new_name'" has no export code or is empty'

+         cmp = 1

+         end

+      when codes.new_name \= 0 then

+         /* This symbol was already defined */

+         if codes.new_name \= new_code then

+            do

+	    cmp = 2

+ 	    say 'Symbol "'new_name'" multiply defined'

+	    end

+      when names.new_code \= '' then

+         /* This code was already assigned to a symbol */

+         if names.new_code \= new_name then

+            do

+            cmp = 3

+	    say 'Conflict with "'names.new_code'" & "'new_name'" being @'new_code

+            end

+      otherwise

+         do

+         codes.new_name = new_code

+         names.new_code = new_name

+         end

+   end  /* select */

+end

+

+exit cmp

+

+CleanQueue: procedure

+	do while queued() > 0

+	   parse pull foo

+	end

+return

diff --git a/misc/cleantic.cmd b/misc/cleantic.cmd
new file mode 100644
index 0000000..b09ba57
--- /dev/null
+++ b/misc/cleantic.cmd
@@ -0,0 +1,45 @@
+/****************************************************************************

+ * Copyright 2020 Thomas E. Dickey                                          *

+ * Copyright 1998,2006 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: cleantic.cmd,v 1.5 2020/02/02 23:34:34 tom Exp $

+ *

+ * Author:  Juan Jose Garcia Ripoll <worm@arrakis.es>.

+ * Webpage: http://www.arrakis.es/~worm/

+ */

+parse arg dir

+

+pause

+dir = translate(dir,'\','/');

+letters = '0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z'

+

+if dir = '' then

+    dir = '.'

+'echo Cleaning 'dir

+'for %%1 in ('letters') do @if not exist 'dir'\%%1\* (echo Cleaning ...\%%1 & rd %%1 2>NUL)'

diff --git a/misc/cmpdef.cmd b/misc/cmpdef.cmd
new file mode 100644
index 0000000..cd22f2d
--- /dev/null
+++ b/misc/cmpdef.cmd
@@ -0,0 +1,135 @@
+/****************************************************************************

+ * Copyright 2020 Thomas E. Dickey                                          *

+ * Copyright 1998,2006 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: cmpdef.cmd,v 1.4 2020/02/02 23:34:34 tom Exp $

+ *

+ * Author:  Juan Jose Garcia Ripoll <worm@arrakis.es>.

+ * Webpage: http://www.arrakis.es/~worm/

+ *

+ * cmpdef.cmd - compares two .def files, checking whether they have

+ *		the same entries with the same export codes.

+ *

+ * returns 0 if there are no conflicts between the files -- that is,

+ * the newer one can replace the older one.

+ *

+ * returns 1 when either of the files is not properly formatted and

+ * when there are conflicts: two symbols having the same export code.

+ *

+ * the standard output shows a list with newly added symbols, plus

+ * replaced symbols and conflicts.

+ */

+parse arg def_file1 def_file2

+

+def_file1 = translate(def_file1,'\','/')

+def_file2 = translate(def_file2,'\','/')

+

+call CleanQueue

+

+/*

+ * `cmp' is zero when the last file is valid and upward compatible

+ * `numbers' is the stem where symbols are stored

+ */

+cmp      = 0

+names.   = ''

+numbers. = 0

+

+/*

+ * This sed expression cleans empty lines, comments and special .DEF

+ * commands, such as LIBRARY..., EXPORTS..., etc

+ */

+tidy_up  = '"s/[ 	][ 	]*/ /g;s/;.*//g;/^[ ]*$/d;/^[a-zA-Z]/d;"'

+

+/*

+ * First we find all public symbols from the original DLL. All this

+ * information is pushed into a REXX private list with the RXQUEUE

+ * utility program.

+ */

+'@echo off'

+'type' def_file1 '| sed' tidy_up '| sort | rxqueue'

+

+do while queued() > 0

+   /*

+    * We retrieve the symbol name (NAME) and its number (NUMBER)

+    */

+   parse pull '"' name '"' '@'number rest

+   if number = '' || name = '' then

+      do

+      say 'Corrupted file' def_file1

+      say 'Symbol' name 'has no number'

+      exit 1

+      end

+   else

+      do

+      numbers.name = number

+      names.number = name

+      end

+end

+

+/*

+ * Now we find all public symbols from the new DLL, and compare.

+ */

+'type' def_file2 '| sed' tidy_up '| sort | rxqueue'

+

+do while queued() > 0

+   parse pull '"' name '"' '@'number rest

+   if name = '' | number = '' then

+      do

+      say 'Corrupted file' def_file2

+      say 'Symbol' name 'has no number'

+      exit 1

+      end

+   if numbers.name = 0 then

+      do

+      cmp = 1

+      if names.number = '' then

+         say 'New symbol' name 'with code @'number

+      else

+         say 'Conflict old =' names.number ', new =' name 'at @'number

+      end

+   else if numbers.name \= number then

+      do

+      cmp = 1

+      say name 'Symbol' name 'changed from @'numbers.name 'to @'number

+      end

+end /* do */

+

+exit cmp

+

+/*

+ * Cleans the REXX queue by pulling and forgetting every line.

+ * This is needed, at least, when `cmpdef.cmd' starts, because an aborted

+ * REXX program might have left some rubbish in.

+ */

+CleanQueue: procedure

+   do while queued() > 0

+      parse pull foo

+   end

+return

+

diff --git a/misc/csort b/misc/csort
new file mode 100755
index 0000000..c39c295
--- /dev/null
+++ b/misc/csort
@@ -0,0 +1,37 @@
+#!/bin/sh
+# $Id: csort,v 1.4 2021/09/04 15:55:29 tom Exp $
+##############################################################################
+# Copyright 2020,2021 Thomas E. Dickey                                       #
+# Copyright 2002 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.                                                             #
+##############################################################################
+#
+# override anything that might cause 'sort' to do the wrong thing...
+LANG=C;		export LANG
+LANGUAGE=C;	export LANGUAGE
+LC_ALL=C;	export LC_ALL
+LC_CTYPE=C;	export LC_CTYPE
+sort "$@"
diff --git a/misc/emx.src b/misc/emx.src
new file mode 100644
index 0000000..901c7b5
--- /dev/null
+++ b/misc/emx.src
@@ -0,0 +1,886 @@
+##############################################################################
+# Copyright 2020 Thomas E. Dickey                                            #
+# Copyright 1998-2003,2006 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: emx.src,v 1.12 2020/02/02 23:34:34 tom Exp $
+# This is a reformatted copy of the terminfo source for OS/2 EMX from
+# Juan Jose Garcia Ripoll <worm@arrakis.es>.
+# http://www.arrakis.es/~worm/
+#----------------------------------------------------------------------------
+#
+# This section describes terminal classes and maker brands that are still
+# quite common.
+#
+
+#### Specials
+#
+# Special "terminals".  These are used to label tty lines when you don't
+# know what kind of terminal is on it.  The characteristics of an unknown
+# terminal are the lowest common denominator - they look about like a ti 700.
+#
+
+dumb|80-column dumb tty,
+	am,
+	cols#80,
+	bel=^G,
+	cr=^M,
+	cud1=^J,
+	ind=^J,
+unknown|unknown terminal type,
+	gn,
+	use=dumb,
+lpr|printer|line printer,
+	hc,
+	os,
+	cols#132,
+	lines#66,
+	bel=^G,
+	cr=^M,
+	cub1=^H,
+	cud1=^J,
+	ff=^L,
+	ind=^J,
+glasstty|classic glass tty interpreting ASCII control characters,
+	am,
+	cols#80,
+	bel=^G,
+	clear=^L,
+	cr=^M,
+	cub1=^H,
+	cud1=^J,
+	ht=^I,
+	kbs=^H,
+	kcub1=^H,
+	kcud1=^J,
+	nel=^M^J,
+
+#### ANSI.SYS/ISO 6429/ECMA-48 Capabilities
+#
+# See the end-of-file comment for more on these.
+#
+
+# The IBM PC alternate character set.  Plug this into any Intel console entry.
+# We use \E[11m for rmacs rather than \E[12m so the <acsc> string can use the
+# ROM graphics for control characters such as the diamond, up- and down-arrow.
+# This works with the System V, Linux, and BSDI consoles.  It's a safe bet this
+# will work with any Intel console, they all seem to have inherited \E[11m
+# from the ANSI.SYS de-facto standard.
+klone+acs|alternate character set for ansi.sys displays,
+	acsc=+\020\,\021-\030.^Y0\333`\004a\261f\370g\361h\260j\331k\277l\332m\300n\305o~p\304q\304r\304s_t\303u\264v\301w\302x\263y\363z\362{\343|\330}\234~\376,
+	rmacs=\E[10m,
+	smacs=\E[11m,
+
+# Highlight controls corresponding to the ANSI.SYS standard.  Most
+# console drivers for Intel boxes obey these.  Makes the same assumption
+# about \E[11m as klone+acs.  True ANSI/ECMA-48 would have <rmso=\E[27m>,
+# <rmul=\E[24m>, but this isn't a documented feature of ANSI.SYS.
+klone+sgr|attribute control for ansi.sys displays,
+	blink=\E[5m,
+	bold=\E[1m,
+	invis=\E[8m,
+	rev=\E[7m,
+	rmacs=\E[10m,
+	rmpch=\E[10m,
+	rmso=\E[m,
+	rmul=\E[m,
+	sgr=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1%;%?%p7%t;8%;%?%p9%t;11%;m,
+	sgr0=\E[0;10m,
+	smacs=\E[11m,
+	smpch=\E[11m,
+	smso=\E[7m,
+	smul=\E[4m,
+	use=klone+acs,
+
+# Highlight controls corresponding to the ANSI.SYS standard.  *All*
+# console drivers for Intel boxes obey these.  Does not assume \E[11m will
+# work; uses \E[12m instead, which is pretty bulletproof but loses you the ACS
+# diamond and arrow characters under curses.
+klone+sgr-dumb|attribute control for ansi.sys displays (no ESC [ 11 m),
+	blink=\E[5m,
+	bold=\E[1m,
+	invis=\E[8m,
+	rev=\E[7m,
+	rmacs=\E[10m,
+	rmso=\E[m,
+	rmul=\E[m,
+	sgr=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1%;%?%p7%t;8%;%?%p9%t;12%;m,
+	sgr0=\E[0;10m,
+	smacs=\E[12m,
+	smso=\E[7m,
+	smul=\E[4m,
+	use=klone+acs,
+
+# ANSI.SYS color control.
+# The DOS 5 manual asserts that these sequences meet the ISO 6429 standard.
+klone+color|color control for ansi.sys and ISO6429-compatible displays,
+	colors#8,
+	ncv#3,
+	pairs#64,
+	op=\E[37;40m,
+	setab=\E[4%p1%dm,
+	setaf=\E[3%p1%dm,
+
+# This is better than klone+color, it doesn't assume white-on-black as the
+# default color pair,  but many `ANSI' terminals don't grok the <op> cap.
+ecma+color|color control for ECMA-48-compatible terminals,
+	AX,
+	colors#8,
+	ncv#3,
+	pairs#64,
+	op=\E[39;49m,
+	setab=\E[4%p1%dm,
+	setaf=\E[3%p1%dm,
+
+#### ANSI/ECMA-48 terminals and terminal emulators
+#
+# See near the end of this file for details on ANSI conformance.
+# Don't mess with these entries!  Lots of other entries depend on them!
+#
+# This section lists entries in a least-capable to most-capable order.
+# if you're in doubt about what `ANSI' matches yours, try them in that
+# order and back off from the first that breaks.
+
+ansi-mini|any ansi terminal with pessimistic assumptions,
+	am,
+	cols#80,
+	it#8,
+	lines#24,
+	clear=\E[H\E[2J$<50>,
+	cub1=\E[D,
+	cud1=\E[B,
+	cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH,
+	cuu1=\E[A,
+	el=\E[K,
+	home=\E[H,
+	ht=^I,
+
+#
+# ANSI.SYS entries
+#
+# This completely describes the sequences specified in the DOS 2.1 ANSI.SYS
+# documentation (except for the keyboard key reassignment feature, which
+# doesn't fit the <pfkey> model well).  The klone+acs sequences were valid
+# though undocumented.  The <pfkey> capability is untested but should work for
+# keys F1-F10 (%p1 values outside this range will yield unpredictable results).
+# From: Eric S. Raymond <esr@snark.thyrsus.com> Nov 7 1995
+ansi.sys-old|ANSI.SYS under PC-DOS 2.1,
+	am,
+	mir,
+	msgr,
+	xon,
+	cols#80,
+	lines#25,
+	clear=\E[2J,
+	cub1=^H,
+	cud1=\E[B,
+	cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH,
+	cuu1=\E[A,
+	el=\E[k,
+	home=\E[H,
+	is2=\E[m\E[?7h,
+	kcub1=^H,
+	kcud1=^J,
+	kcuf1=^L,
+	kcuu1=^K,
+	khome=^^,
+	pfkey=\E[0;%p1%{58}%+%d;%p2"%s",
+	rc=\E[u,
+	rmam=\E[?7l,
+	sc=\E[s,
+	smam=\E[?7h,
+	u6=\E[%i%d;%dR,
+	u7=\E[6n,
+	use=klone+color,
+	use=klone+acs,
+	use=klone+sgr,
+ansi.sys|ANSI.SYS 3.1 and later versions,
+	el=\E[K,
+	use=ansi.sys-old,
+
+### EMX termcap.dat compatibility modes
+#
+# Keypad:	Home=\0G	Up=\0H	PrPag=\0I
+#		ka1,kh		kcuu1		kpp,ka3
+#
+#		Left=\0K	5=\0L		Right=\0M
+#		kcub1		kb2		kcuf1
+#
+#		End=\0O		Down=\0P	NxPag=\0Q
+#		kc1,kend	kcud1		kc3,knp
+#
+#		Ins=\0R		Del=\0S
+#		kich1		kdch1
+#
+# On keyboard with 12 function keys,
+#	shifted f-keys: F13-F24
+#	control f-keys: F25-F36
+#	alt f-keys:     F37-F48
+# The shift/control/alt keys do not modify each other, but alt overrides both,
+# and control overrides shift.
+#
+# Also (possibly only EMX, so we don't put it in ansi.sys, etc): set the
+# no_color_video to inform the application that standout(1), underline(2)
+# reverse(4) and invisible(64) don't work with color.
+emx-base|DOS special keys,
+	bce,
+	bw,
+	it#8,
+	ncv#71,
+	bel=^G,
+	ka1=\0G,
+	ka3=\0I,
+	kb2=\0L,
+	kbs=^H,
+	kc1=\0O,
+	kc3=\0Q,
+	kcbt=\0^O,
+	kcub1=\0K,
+	kcud1=\0P,
+	kcuf1=\0M,
+	kcuu1=\0H,
+	kdch1=\0S,
+	kend=\0O,
+	kf1=\0;,
+	kf10=\0D,
+	kf11=\0\205,
+	kf12=\0\206,
+	kf13=\0T,
+	kf14=\0U,
+	kf15=\0V,
+	kf16=\0W,
+	kf17=\0X,
+	kf18=\0Y,
+	kf19=\0Z,
+	kf2=\0<,
+	kf20=\0[,
+	kf21=\0\\,
+	kf22=\0],
+	kf23=\0\207,
+	kf24=\0\210,
+	kf25=\0\^,
+	kf26=\0_,
+	kf27=\0`,
+	kf28=\0a,
+	kf29=\0b,
+	kf3=\0=,
+	kf30=\0c,
+	kf31=\0d,
+	kf32=\0e,
+	kf33=\0f,
+	kf34=\0g,
+	kf35=\0\211,
+	kf36=\0\212,
+	kf37=\0h,
+	kf38=\0i,
+	kf39=\0j,
+	kf4=\0>,
+	kf40=\0k,
+	kf41=\0l,
+	kf42=\0m,
+	kf43=\0n,
+	kf44=\0o,
+	kf45=\0p,
+	kf46=\0q,
+	kf47=\0\213,
+	kf48=\0\214,
+	kf5=\0?,
+	kf6=\0@,
+	kf7=\0A,
+	kf8=\0B,
+	kf9=\0C,
+	khome=\0G,
+	kich1=\0R,
+	knp=\0Q,
+	kpp=\0I,
+	use=ansi.sys,
+#
+# To properly translate termcap.dat -> terminfo.src remember these
+# equivalences:
+#	ti	<->	smcup	string to start programs using cup(termcap)
+#	te	<->	rmcup	string to end programs using cup
+#	so	<->	smso	begin standout mode
+#	se	<->	rmso	exit standout mode
+#	us	<->	smul	begin underline mode
+#	ue	<->	rmul	exit underline mode
+#	mb	<->	blink	turn on blinking
+#	md	<->	bold	turn on extra bright (bold) mode
+#	mr	<->	rev	turn on reverse video mode
+#	me	<->	sgr0	turn off all attributes
+#
+# On my terminal, \E[4m looks dim.
+ansi-emx|ANSI.SYS color,
+	blink=\E[5m,
+	bold=\E[1m,
+	kmous=\E[M,
+	rev=\E[7m,
+	rmcup=\E[0m,
+	rmso=\E[0m,
+	rmul@,
+	sgr0=\E[0m,
+	smcup=\E[0;37;40m,
+	smso=\E[7m,
+	smul@,
+	use=emx-base,
+window|ANSI.SYS window,
+	blink=\E[5m,
+	bold=\E[1;37;47m,
+	rev=\E[1;37;47m,
+	rmcup=\E[0m,
+	rmso=\E[0;37;40m,
+	rmul=\E[0;37;40m,
+	sgr0=\E[0;37;40m,
+	smcup=\E[0;37;40m,
+	smso=\E[1;37;47m,
+	smul=\E[1;31;47m,
+	use=emx-base,
+os2|OS/2-emx ANSI.SYS,
+	cub=\E[%p1%dD,
+	cub1=\E[D,
+	cud=\E[%p1%dB,
+	cud1=\E[B,
+	cuf=\E[%p1%dC,
+	cuf1=\E[C,
+	cuu=\E[%p1%dA,
+	cuu1=\E[A,
+	rc=\E[u,
+	sc=\E[s,
+	use=ansi-emx,
+	use=mono,
+mono|ANSI.SYS mono,
+	blink=\E[5m,
+	bold=\E[1m,
+	rev=\E[7m,
+	rmcup=\E[0m,
+	rmso=\E[m,
+	rmul=\E[m,
+	sgr0=\E[m,
+	smcup=\E[0m,
+	smso=\E[1m,
+	smul=\E[4m,
+	use=emx-base,
+# same as mono, but use reverse video for standout (nice for Emacs)
+rmono|ANSI.SYS reverse mono,
+	smso=\E[7m,
+	use=mono,
+# same as mono, but use a readable color for underlining
+mono2|ANSI.SYS mono2,
+	rmul=\E[0m,
+	smul=\E[1;31;40m,
+	use=mono,
+# nice colors for Emacs (white on blue, mode line white on cyan)
+ansi-color-2-emx|ANSI.SYS color 2,
+	rmcup=\E[0m,
+	rmso=\E[0;37;44m,
+	rmul=\E[0m,
+	sgr0=\E[0;37;44m,
+	smcup=\E[0;37;44m,
+	smso=\E[1;37;46m,
+	smul=\E[1;31;40m,
+	use=ansi-emx,
+# nice colors for Emacs (white on black, mode line black on cyan)
+ansi-color-3-emx|ANSI.SYS color 3,
+	rmcup=\E[0m,
+	rmso=\E[0m,
+	rmul=\E[0m,
+	sgr0=\E[0m,
+	smcup=\E[0m,
+	smso=\E[30;46m,
+	smul=\E[1;31;40m,
+	use=ansi-emx,
+
+#### X terminal emulators
+#
+# X10/6.6	11/7/86, minus alternate screen, plus (csr)
+# (xterm: ":MT:" changed to ":km:"; added <smam>/<rmam> based on init string;
+# removed (hs, eslok, tsl=\E[?E\E[?%i%dT, fsl=\E[?F, dsl=\E[?E)
+# as these seem not to work -- esr)
+x10term|vs100-x10|xterm terminal emulator (X10 window system),
+	am,
+	km,
+	mir,
+	msgr,
+	xenl,
+	xon,
+	cols#80,
+	it#8,
+	lines#65,
+	bold=\E[1m,
+	clear=\E[H\E[2J,
+	csr=\E[%i%p1%d;%p2%dr,
+	cub1=^H,
+	cud1=^J,
+	cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH,
+	cuu1=\E[A,
+	dch=\E[%p1%dP,
+	dch1=\E[P,
+	dl=\E[%p1%dM,
+	dl1=\E[M,
+	ed=\E[J,
+	el=\E[K,
+	home=\E[H,
+	ht=^I,
+	il=\E[%p1%dL,
+	il1=\E[L,
+	ind=^J,
+	is2=\E\E[m\E[?7h\E[?1;4l,
+	kbs=^H,
+	kcub1=\EOD,
+	kcud1=\EOB,
+	kcuf1=\EOC,
+	kcuu1=\EOA,
+	kf1=\EOP,
+	kf2=\EOQ,
+	kf3=\EOR,
+	kf4=\EOS,
+	rev=\E[7m,
+	ri=\EM,
+	rmam=\E[?7l,
+	rmir=\E[4l,
+	rmkx=\E[?1l\E>,
+	rmso=\E[m,
+	rmul=\E[m,
+	sgr0=\E[m,
+	smam=\E[?7h,
+	smir=\E[4h,
+	smkx=\E[?1h\E=,
+	smso=\E[7m,
+	smul=\E[4m,
+# X11R6 xterm.  This is known good for the XFree86 version under Linux.
+# It is *way* more featureful than the stock X consortium entry (has acsc,
+# for starters).  The <kmous> key is actually the \E[M prefix returned by
+# xterm's internal mouse-tracking facility; ncurses will interpret the
+# following three bytes of mouse status information.
+# From: Eric S. Raymond <esr@snark.thyrsus.com> 14 Dec 1995
+xterm-r6|xterm terminal emulator (X11R6 Window System),
+	am,
+	km,
+	mir,
+	msgr,
+	xenl,
+	xon,
+	cols#80,
+	it#8,
+	lines#65,
+	acsc=++\,\,--..00II``aaffgghhjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G,
+	bold=\E[1m,
+	clear=\E[H\E[2J,
+	cr=^M,
+	csr=\E[%i%p1%d;%p2%dr,
+	cub=\E[%p1%dD,
+	cub1=^H,
+	cud=\E[%p1%dB,
+	cud1=^J,
+	cuf=\E[%p1%dC,
+	cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH,
+	cuu=\E[%p1%dA,
+	cuu1=\E[A,
+	dch=\E[%p1%dP,
+	dch1=\E[P,
+	dl=\E[%p1%dM,
+	dl1=\E[M,
+	ed=\E[J,
+	el=\E[K,
+	enacs=\E(B\E)0,
+	home=\E[H,
+	ht=^I,
+	ich=\E[%p1%d@,
+	ich1=\E[@,
+	il=\E[%p1%dL,
+	il1=\E[L,
+	ind=^J,
+	is2=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l,
+	kbs=^H,
+	kcub1=\EOD,
+	kcud1=\EOB,
+	kcuf1=\EOC,
+	kcuu1=\EOA,
+	kend=\EOe,
+	kent=\EOM,
+	kf1=\E[11~,
+	kf10=\E[21~,
+	kf11=\E[23~,
+	kf12=\E[24~,
+	kf13=\E[25~,
+	kf14=\E[26~,
+	kf15=\E[28~,
+	kf16=\E[29~,
+	kf17=\E[31~,
+	kf18=\E[32~,
+	kf19=\E[33~,
+	kf2=\E[12~,
+	kf20=\E[34~,
+	kf3=\E[13~,
+	kf4=\E[14~,
+	kf5=\E[15~,
+	kf6=\E[17~,
+	kf7=\E[18~,
+	kf8=\E[19~,
+	kf9=\E[20~,
+	kfnd=\E[1~,
+	khome=\EO\0,
+	kich1=\E[2~,
+	kmous=\E[M,
+	knp=\E[6~,
+	kpp=\E[5~,
+	rc=\E8,
+	rev=\E[7m,
+	ri=\EM,
+	rmacs=^O,
+	rmam=\E[?7l,
+	rmcup=\E[2J\E[?47l\E8,
+	rmir=\E[4l,
+	rmkx=\E[?1l\E>,
+	rmso=\E[m,
+	rmul=\E[m,
+	rs1=^O,
+	rs2=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l\E<,
+	sc=\E7,
+	sgr0=\E[m,
+	smacs=^N,
+	smam=\E[?7h,
+	smcup=\E7\E[?47h,
+	smir=\E[4h,
+	smkx=\E[?1h\E=,
+	smso=\E[7m,
+	smul=\E[4m,
+	tbc=\E[3k,
+	u6=\E[%i%d;%dR,
+	u7=\E[6n,
+	u8=\E[?1;2c,
+	u9=\E[c,
+xterm-bold|xterm terminal emulator (X11R6 Window System) standout w/bold,
+	smso=\E[1m,
+	use=xterm,
+xterms|vs100s|xterm terminal emulator (small screen 24x80),
+	cols#80,
+	lines#24,
+	use=xterm,
+# (kterm: this had extension capabilities ":KJ:TY=ascii:" -- esr)
+kterm|kterm kanji terminal emulator (X window system),
+	eslok,
+	hs,
+	csr=\E[%i%p1%d;%p2%dr,
+	dsl=\E[?H,
+	fsl=\E[?F,
+	rc=\E8,
+	sc=\E7,
+	tsl=\E[?E\E[?%i%dT,
+	use=xterm,
+	use=ecma+color,
+
+# See the note on ICH/ICH1 VERSUS RMIR/SMIR near the end of file
+xterm-nic|xterm with ich/ich1 suppressed for non-curses programs,
+	ich@,
+	ich1@,
+	use=xterm,
+
+# Should work with the color xterm on the X11R6 contrib tape.
+# Assumes the xterm attribute default is black on white.
+# From: Eric S. Raymond <esr@snark.thyrsus.com> March 4 1996
+xterm-color|xterm with color support,
+	op=\E[30;47m,
+	use=xterm,
+	use=klone+color,
+
+# From: Thomas Dickey <dickey@clark.net> 13 Dec 1995
+rxvt|rxvt terminal emulator,
+	kend=\EOw,
+	khome=\E[H,
+	kmous@,
+	use=xterm,
+	use=klone+color,
+
+# From: David J. MacKenzie <djm@va.pubnix.com> 20 Apr 1995
+# Here's a termcap entry I've been using for xterm_color, which comes
+# with BSD/OS 2.0, and the X11R6 contrib tape too I think.  Besides the
+# color stuff, I also have a status line defined as the window manager
+# title bar. [I have translated it to terminfo -- ESR]
+xterm-pcolor|xterm with color used for highlights and status line,
+	hs,
+	wsl#40,
+	bold=\E[1m\E[43m,
+	dsl=\E]0;\007,
+	fsl=^G,
+	rev=\E[7m\E[34m,
+	smso=\E[7m\E[31m,
+	smul=\E[4m\E[42m,
+	tsl=\E]0;,
+	use=xterm,
+
+# HP ships this, except for the pb#9600 which was merged in from BSD termcap.
+hpterm|X-hpterm|hp X11 terminal emulator,
+	am,
+	da,
+	db,
+	mir,
+	xhp,
+	cols#80,
+	lh#2,
+	lines#24,
+	lm#0,
+	lw#8,
+	nlab#8,
+	pb#9600,
+	xmc#0,
+	bel=^G,
+	bold=\E&dB,
+	cbt=\Ei,
+	clear=\E&a0y0C\EJ,
+	cr=^M,
+	cub1=^H,
+	cud1=\EB,
+	cuf1=\EC,
+	cup=\E&a%p1%dy%p2%dC,
+	cuu1=\EA,
+	dch1=\EP,
+	dim=\E&dH,
+	dl1=\EM,
+	ed=\EJ$<1>,
+	el=\EK,
+	hpa=\E&a%p1%dC,
+	ht=^I,
+	hts=\E1,
+	il1=\EL,
+	ind=^J,
+	kbs=^H,
+	kclr=\EJ,
+	kctab=\E2,
+	kcub1=\ED,
+	kcud1=\EB,
+	kcuf1=\EC,
+	kcuu1=\EA,
+	kdch1=\EP,
+	kdl1=\EM,
+	ked=\EJ,
+	kel=\EK,
+	kf1=\Ep,
+	kf2=\Eq,
+	kf3=\Er,
+	kf4=\Es,
+	kf5=\Et,
+	kf6=\Eu,
+	kf7=\Ev,
+	kf8=\Ew,
+	khome=\Eh,
+	khts=\E1,
+	kich1=\EQ,
+	kil1=\EL,
+	kind=\ES,
+	kll=\EF,
+	knp=\EU,
+	kpp=\EV,
+	kri=\ET,
+	krmir=\ER,
+	ktbc=\E3,
+	meml=\El,
+	memu=\Em,
+	pfkey=\E&f%p1%dk%p2%l%dL%p2%s,
+	pfloc=\E&f1a%p1%dk%p2%l%dL%p2%s,
+	pfx=\E&f2a%p1%dk%p2%l%dL%p2%s,
+	pln=\E&f%p1%dk%p2%l%dd0L%p2%s,
+	rev=\E&dB,
+	ri=\ET,
+	rmacs=^O,
+	rmir=\ER,
+	rmkx=\E&s0A,
+	rmln=\E&j@,
+	rmso=\E&d@,
+	rmul=\E&d@,
+	sgr=\E&d%?%p7%t%'s'%c%;%p1%p3%|%p6%|%{2}%*%p2%{4}%*%+%p4%+%p5%{8}%*%+%'@'%+%c%?%p9%t%'\016'%c%e%'\017'%c%;,
+	sgr0=\E&d@,
+	smacs=^N,
+	smir=\EQ,
+	smkx=\E&s1A,
+	smln=\E&jB,
+	smso=\E&dJ,
+	smul=\E&dD,
+	tbc=\E3,
+	vpa=\E&a%p1%dY,
+
+# This entry describes an xterm with Sun-style function keys enabled
+# via the X resource setting "xterm*sunFunctionKeys:true"
+# To understand <kf11>/<kf12> note that L1,L2 and F11,F12 are the same.
+# The <kf13>...<kf20> keys are L3-L10.  We don't set <kf16=\E[197z>
+# because we want it to be seen as <kcpy>.
+# The <kf31>...<kf45> keys are R1-R15.  We treat some of these in accordance
+# with their Sun keyboard labels instead.
+# From: Simon J. Gerraty <sjg@zen.void.oz.au> 10 Jan 1996
+xterm-sun|xterm with sunFunctionKeys true,
+	kb2=\E[218z,
+	kcpy=\E[197z,
+	kend=\E[220z,
+	kf1=\E[224z,
+	kf10=\E[233z,
+	kf11=\E[192z,
+	kf12=\E[193z,
+	kf13=\E[194z,
+	kf14=\E[195z,
+	kf15=\E[196z,
+	kf17=\E[198z,
+	kf18=\E[199z,
+	kf19=\E[200z,
+	kf2=\E[225z,
+	kf20=\E[201z,
+	kf3=\E[226z,
+	kf31=\E[208z,
+	kf32=\E[209z,
+	kf33=\E[210z,
+	kf34=\E[211z,
+	kf35=\E[212z,
+	kf36=\E[213z,
+	kf38=\E[215z,
+	kf4=\E[227z,
+	kf40=\E[217z,
+	kf42=\E[219z,
+	kf44=\E[221z,
+	kf5=\E[228z,
+	kf6=\E[229z,
+	kf7=\E[230z,
+	kf8=\E[231z,
+	kf9=\E[232z,
+	kfnd=\E[200z,
+	khlp=\E[196z,
+	khome=\E[214z,
+	kich1=\E[2z,
+	knp=\E[222z,
+	kpp=\E[216z,
+	kund=\E[195z,
+	use=xterm,
+xterms-sun|small (80x24) xterm with sunFunctionKeys true,
+	cols#80,
+	lines#24,
+	use=xterm-sun,
+
+# This is for the extensible terminal emulator on the X11R6 contrib tape.
+emu|emu native mode,
+	mir,
+	msgr,
+	xon,
+	colors#15,
+	cols#80,
+	it#8,
+	lines#24,
+	pairs#64,
+	vt#200,
+	acsc=61a\202f\260g2j\213k\214l\215m\216n\217o\220q\222s\224t\225u\226v\227w\230x\231~\244,
+	bel=^G,
+	blink=\ES\EW,
+	bold=\ES\EU,
+	civis=\EZ,
+	clear=\EP\EE0;0;,
+	cnorm=\Ea,
+	cr=^M,
+	csr=\Ek%p1%d;%p2%d;,
+	cub=\Eq-%p1%d;,
+	cub1=^H,
+	cud=\Ep%p1%d;,
+	cud1=\EB,
+	cuf=\Eq%p1%d;,
+	cuf1=\ED,
+	cup=\EE%p1%d;%p2%d;,
+	cuu=\Ep-%p1%d;,
+	cuu1=\EA,
+	dch=\EI%p1%d;,
+	dch1=\EI1;,
+	dl=\ER%p1%d;,
+	dl1=\ER1;,
+	ech=\Ej%p1%d;,
+	ed=\EN,
+	el=\EK,
+	el1=\EL,
+	enacs=\0,
+	home=\EE0;0;,
+	ht=^I,
+	hts=\Eh,
+	il=\EQ%p1%d;,
+	il1=\EQ1;,
+	ind=\EG,
+	is2=\ES\Er0;\Es0;,
+	kbs=^H,
+	kcub1=\EC,
+	kcud1=\EB,
+	kcuf1=\ED,
+	kcuu1=\EA,
+	kdch1=\177,
+	kent=^M,
+	kf0=\EF00,
+	kf1=\EF01,
+	kf10=\EF10,
+	kf11=\EF11,
+	kf12=\EF12,
+	kf13=\EF13,
+	kf14=\EF14,
+	kf15=\EF15,
+	kf16=\EF16,
+	kf17=\EF17,
+	kf18=\EF18,
+	kf19=\EF19,
+	kf2=\EF02,
+	kf20=\EF20,
+	kf3=\EF03,
+	kf4=\EF04,
+	kf5=\EF05,
+	kf6=\EF06,
+	kf7=\EF07,
+	kf8=\EF08,
+	kf9=\EF09,
+	kfnd=\Efind,
+	kich1=\Eins,
+	knp=\Enext,
+	kpp=\Eprior,
+	kslt=\Esel,
+	oc=\Es0;\Er0;,
+	rev=\ES\ET,
+	ri=\EF,
+	rmacs=\0,
+	rmir=\EX,
+	rmso=\ES,
+	rmul=\ES,
+	rs2=\ES\Es0;\Er0;,
+	setab=\Es%i%p1%d;,
+	setaf=\Er%i%p1%d;,
+	sgr0=\ES,
+	smacs=\0,
+	smir=\EY,
+	smso=\ES\ET,
+	smul=\ES\EV,
+	tbc=\Ej,
+###############################################################################
+# Aliases which conflict with terminfo.src
+ansi|ANSI.SYS color,
+	use=ansi-emx,
+ansi-color-2|ANSI.SYS color 2,
+	use=ansi-color-2-emx,
+ansi-color-3|ANSI.SYS color 3,
+	use=ansi-color-3-emx,
+xterm|vs100|xterm terminal emulator (X11R6 Window System),
+	use=xterm-r6,
diff --git a/misc/form.def b/misc/form.def
new file mode 100644
index 0000000..ea43b59
--- /dev/null
+++ b/misc/form.def
@@ -0,0 +1,101 @@
+LIBRARY form5 INITINSTANCE TERMINSTANCE

+DESCRIPTION "NCurses-5-1-20000704, module form"

+CODE LOADONCALL

+DATA LOADONCALL NONSHARED MULTIPLE

+EXPORTS

+	"TYPE_ALNUM"	@2	NONAME

+	"TYPE_ALPHA"	@1	NONAME

+	"TYPE_ENUM"	@3	NONAME

+	"TYPE_INTEGER"	@4	NONAME

+	"TYPE_IPV4"	@7	NONAME

+	"TYPE_NUMERIC"	@5	NONAME

+	"TYPE_REGEXP"	@6	NONAME

+	"_nc_Copy_Argument"	@8	NONAME

+	"_nc_Copy_Type"	@9	NONAME

+	"_nc_Default_Field"	@11	NONAME

+	"_nc_Default_FieldType"	@12	NONAME

+	"_nc_Default_Form"	@10	NONAME

+	"_nc_First_Active_Field"	@13	NONAME

+	"_nc_Free_Argument"	@14	NONAME

+	"_nc_Free_Type"	@15	NONAME

+	"_nc_Internal_Validation"	@16	NONAME

+	"_nc_Make_Argument"	@17	NONAME

+	"_nc_Position_Form_Cursor"	@18	NONAME

+	"_nc_Refresh_Current_Field"	@19	NONAME

+	"_nc_Set_Current_Field"	@25	NONAME

+	"_nc_Set_Form_Page"	@26	NONAME

+	"_nc_Synchronize_Attributes"	@27	NONAME

+	"_nc_Synchronize_Options"	@28	NONAME

+	"current_field"	@102	NONAME

+	"data_ahead"	@133	NONAME

+	"data_behind"	@134	NONAME

+	"dup_field"	@31	NONAME

+	"dynamic_field_info"	@35	NONAME

+	"field_arg"	@56	NONAME

+	"field_back"	@53	NONAME

+	"field_buffer"	@59	NONAME

+	"field_count"	@111	NONAME

+	"field_fore"	@52	NONAME

+	"field_index"	@115	NONAME

+	"field_info"	@34	NONAME

+	"field_init"	@107	NONAME

+	"field_just"	@41	NONAME

+	"field_opts"	@60	NONAME

+	"field_opts_off"	@51	NONAME

+	"field_opts_on"	@50	NONAME

+	"field_pad"	@45	NONAME

+	"field_status"	@55	NONAME

+	"field_term"	@108	NONAME

+	"field_type"	@58	NONAME

+	"field_userptr"	@57	NONAME

+	"form_driver"	@126	NONAME

+	"form_fields"	@101	NONAME

+	"form_init"	@105	NONAME

+	"form_opts"	@132	NONAME

+	"form_opts_off"	@130	NONAME

+	"form_opts_on"	@129	NONAME

+	"form_page"	@117	NONAME

+	"form_request_by_name"	@29	NONAME

+	"form_request_name"	@61	NONAME

+	"form_sub"	@104	NONAME

+	"form_term"	@106	NONAME

+	"form_userptr"	@131	NONAME

+	"form_win"	@103	NONAME

+	"free_field"	@33	NONAME

+	"free_fieldtype"	@22	NONAME

+	"free_form"	@109	NONAME

+	"link_field"	@32	NONAME

+	"link_fieldtype"	@21	NONAME

+	"move_field"	@37	NONAME

+	"new_field"	@30	NONAME

+	"new_fieldtype"	@20	NONAME

+	"new_form"	@100	NONAME

+	"new_page"	@54	NONAME

+	"pos_form_cursor"	@125	NONAME

+	"post_form"	@123	NONAME

+	"scale_form"	@118	NONAME

+	"set_current_field"	@114	NONAME

+	"set_field_back"	@43	NONAME

+	"set_field_buffer"	@46	NONAME

+	"set_field_fore"	@42	NONAME

+	"set_field_init"	@121	NONAME

+	"set_field_just"	@40	NONAME

+	"set_field_opts"	@49	NONAME

+	"set_field_pad"	@44	NONAME

+	"set_field_status"	@47	NONAME

+	"set_field_term"	@122	NONAME

+	"set_field_type"	@38	NONAME

+	"set_field_userptr"	@48	NONAME

+	"set_fieldtype_arg"	@23	NONAME

+	"set_fieldtype_choice"	@24	NONAME

+	"set_form_fields"	@110	NONAME

+	"set_form_init"	@119	NONAME

+	"set_form_opts"	@128	NONAME

+	"set_form_page"	@116	NONAME

+	"set_form_sub"	@113	NONAME

+	"set_form_term"	@120	NONAME

+	"set_form_userptr"	@127	NONAME

+	"set_form_win"	@112	NONAME

+	"set_max_field"	@36	NONAME

+	"set_new_page"	@39	NONAME

+	"unpost_form"	@124	NONAME

diff --git a/misc/form.ref b/misc/form.ref
new file mode 100644
index 0000000..18e65a6
--- /dev/null
+++ b/misc/form.ref
@@ -0,0 +1,106 @@
+LIBRARY FORM2 INITINSTANCE

+DESCRIPTION 'NCurses 1.9.9e-1 for OS/2 - forms library'

+EXPORTS

+;

+; SHARED VARIABLES

+;

+	"TYPE_ALPHA"		@1	;NONAME

+	"TYPE_ALNUM"		@2	;NONAME

+	"TYPE_ENUM"		@3	;NONAME

+	"TYPE_INTEGER"		@4	;NONAME

+	"TYPE_NUMERIC"		@5	;NONAME

+	"TYPE_REGEXP"		@6	;NONAME

+

+	"_nc_Default_Form"	@10	;NONAME

+	"_nc_Default_Field"	@11	;NONAME

+

+;

+; FIELD FUNCTIONS

+;

+	"new_fieldtype"		@20	;NONAME

+	"link_fieldtype"	@21	;NONAME

+

+	"free_fieldtype"	@22	;NONAME

+	"set_fieldtype_arg"	@23	;NONAME

+	"set_fieldtype_choice"	@24	;NONAME

+

+	"new_field"		@30	;NONAME

+	"dup_field"		@31	;NONAME

+	"link_field"		@32	;NONAME

+

+	"free_field"		@33	;NONAME

+	"field_info"		@34	;NONAME

+	"dynamic_field_info"	@35	;NONAME

+	"set_max_field"		@36	;NONAME

+	"move_field"		@37	;NONAME

+	"set_field_type"	@38	;NONAME

+	"set_new_page"		@39	;NONAME

+	"set_field_just"	@40	;NONAME

+	"field_just"		@41	;NONAME

+	"set_field_fore"	@42	;NONAME

+	"set_field_back"	@43	;NONAME

+	"set_field_pad"		@44	;NONAME

+	"field_pad"		@45	;NONAME

+	"set_field_buffer"	@46	;NONAME

+	"set_field_status"	@47	;NONAME

+	"set_field_userptr"	@48	;NONAME

+	"set_field_opts"	@49	;NONAME

+	"field_opts_on"		@50	;NONAME

+	"field_opts_off"	@51	;NONAME

+

+	"field_fore"		@52	;NONAME

+	"field_back"		@53	;NONAME

+

+	"new_page"		@54	;NONAME

+	"field_status"		@55	;NONAME

+	"field_arg"		@56	;NONAME

+	"field_userptr"		@57	;NONAME

+	"field_type"		@58	;NONAME

+	"field_buffer"		@59	;NONAME

+	"field_opts"		@60	;NONAME

+

+;

+; FORM FUNCTIONS

+;

+	"new_form"		@100	;NONAME

+

+	"form_fields"		@101	;NONAME

+	"current_field"		@102	;NONAME

+

+	"form_win"		@103	;NONAME

+	"form_sub"		@104	;NONAME

+

+	"form_init"		@105	;NONAME

+	"form_term"		@106	;NONAME

+	"field_init"		@107	;NONAME

+	"field_term"		@108	;NONAME

+

+	"free_form"		@109	;NONAME

+	"set_form_fields" @110	;NONAME

+	"field_count"		@111	;NONAME

+	"set_form_win"		@112	;NONAME

+	"set_form_sub"		@113	;NONAME

+	"set_current_field"	@114	;NONAME

+	"field_index"		@115	;NONAME

+	"set_form_page"		@116	;NONAME

+	"form_page"		@117	;NONAME

+	"scale_form"		@118	;NONAME

+	"set_form_init"		@119	;NONAME

+	"set_form_term"		@120	;NONAME

+	"set_field_init"	@121	;NONAME

+	"set_field_term"	@122	;NONAME

+	"post_form"		@123	;NONAME

+	"unpost_form"		@124	;NONAME

+	"pos_form_cursor" 	@125	;NONAME

+	"form_driver"		@126	;NONAME

+	"set_form_userptr"	@127	;NONAME

+	"set_form_opts"		@128	;NONAME

+	"form_opts_on"		@129	;NONAME

+	"form_opts_off"		@130	;NONAME

+

+	"form_userptr"		@131	;NONAME

+

+	"form_opts"		@132	;NONAME

+

+	"data_ahead"		@133	;NONAME

+	"data_behind"		@134	;NONAME

diff --git a/misc/gen-pkgconfig.in b/misc/gen-pkgconfig.in
new file mode 100644
index 0000000..89a5cd4
--- /dev/null
+++ b/misc/gen-pkgconfig.in
@@ -0,0 +1,251 @@
+#!@SHELL@
+# $Id: gen-pkgconfig.in,v 1.56 2022/10/08 16:45:20 tom Exp $
+##############################################################################
+# Copyright 2018-2021,2022 Thomas E. Dickey                                  #
+# Copyright 2009-2015,2018 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey
+#
+# The complete configure script for ncurses is the ncurses5-config (or similar
+# name, depending on the flavor, e.g., ncursesw5-config, ncurses6-config, etc).
+# That provides more information than pkg-config, and is the portable and
+# recommended solution.
+#
+# For each library, generate a ".pc" file which depends on the base ncurses
+# library, except that the tinfo library does not depend on ncurses.
+LIB_NAME=@LIB_NAME@
+TINFO_NAME=@TINFO_NAME@
+PANEL_NAME=@PANEL_NAME@
+MENU_NAME=@MENU_NAME@
+FORM_NAME=@FORM_NAME@
+CXX_NAME=@CXX_NAME@
+
+DFT_DEP_SUFFIX=@DFT_DEP_SUFFIX@
+TINFO_ARG_SUFFIX=@TINFO_ARG_SUFFIX@
+CXX_LIB_SUFFIX=@CXX_LIB_SUFFIX@
+
+suffix=@PC_MODULE_SUFFIX@
+prefix="@prefix@"
+exec_prefix="@exec_prefix@"
+includedir="@includedir@@includesubdir@"
+libdir="@libdir@"
+
+RPATH_LIST=@RPATH_LIST@
+PRIVATE_LIBS="@PRIVATE_LIBS@"
+
+show_prefix='@prefix@'
+show_exec_prefix='@exec_prefix@'
+show_includedir='@includedir@@includesubdir@'
+show_libdir='@libdir@'
+
+MAIN_LIBRARY="${LIB_NAME}@USE_ARG_SUFFIX@"
+SUB_LIBRARY="${TINFO_ARG_SUFFIX}"
+
+CXX_LIBRARY="${CXX_NAME}@USE_ARG_SUFFIX@"
+FORM_LIBRARY="${FORM_NAME}@USE_ARG_SUFFIX@"
+MENU_LIBRARY="${MENU_NAME}@USE_ARG_SUFFIX@"
+PANEL_LIBRARY="${PANEL_NAME}@USE_ARG_SUFFIX@"
+
+CFLAGS="@PKG_CFLAGS@"
+if [ "$includedir" != "/usr/include" ]; then
+	includetop=`echo "$includedir" | sed -e 's,/include/[^/]*$,/include,'`
+	[ "$includetop" = "/usr/include" ] && includetop="$includedir"
+	CFLAGS="$CFLAGS -I\${includedir}"
+	if [ "x$includetop" != "x$includedir" ]
+	then
+		CFLAGS="$CFLAGS -I${includetop}"
+	fi
+fi
+
+lib_flags=
+for opt in -L$libdir @EXTRA_PKG_LDFLAGS@ @LIBS@
+do
+	case $opt in
+	-l*) # LIBS is handled specially below
+		continue
+		;;
+	-specs*) # ignore linker specs-files which were used to build library
+		continue
+		;;
+	-Wl,-z,*) # ignore flags used to manipulate shared image
+		continue
+		;;
+	-Wl,--dynamic-linker*) # ignore ELF interpreter
+		continue
+		;;
+	-Wl,--as-needed|-Wl,--build-id=*|-Wl,-dT,*|-Wl,-T,*)
+		continue
+		;;
+	-L*)
+		lib_check=`echo "x$opt" | sed -e 's/^.-L//'`
+		# on a new/nonstandard install, $libdir may not yet exist at this point
+		if [ "$libdir" != "$lib_check" ]
+		then
+			[ -d "$lib_check" ] || continue
+		fi
+		case "$lib_check" in
+		@LD_SEARCHPATH@) # skip standard libdir
+			if [ "$lib_check" = "$libdir" ]
+			then
+				lib_first=yes
+				IFS_save="$IFS"
+				IFS='|'
+				LIBDIRS="@LD_SEARCHPATH@"
+				for lib_check in $LIBDIRS
+				do
+					if [ -d "$lib_check" ]
+					then
+						if [ "$lib_check" != "$libdir" ]
+						then
+							lib_first=no
+						fi
+						break
+					fi
+				done
+				IFS="$IFS_save"
+				[ $lib_first = yes ] && continue
+				found=no
+				for check in $lib_flags
+				do
+					if [ "x$check" = "x$opt" ]
+					then
+						found=yes
+						break
+					fi
+				done
+				[ $found = yes ] && continue
+				:
+			else
+				continue
+			fi
+			;;
+		*)
+			found=no
+			for check in $lib_flags
+			do
+				if [ "x$check" = "x$opt" ]
+				then
+					found=yes
+					break
+				fi
+			done
+			[ $found = yes ] && continue
+			;;
+		esac
+		;;
+	esac
+	lib_flags="$lib_flags $opt"
+done
+
+# Check if we should specify the tinfo library explicitly so that terminfo
+# functions or curses variables (which also reside in tinfo) can be linked
+# using the -lncurses option.
+NEED_TINFO=no
+if [ "x@TINFO_LIBS@" != "x" ] && \
+   [ "x$TINFO_ARG_SUFFIX" != "x$MAIN_LIBRARY" ]
+then
+	NEED_TINFO=yes
+fi
+
+# The "URL" feature came in pkg-config 0.17
+USEURL=""
+CFGVER=`${PKG_CONFIG:-pkg-config} --version 2>/dev/null |head -n 1 | awk -F. '/0.[0-9][0-9]/{print $2;}'`
+# A missing version should simply fail, but some packagers insist on building
+# packages on machines which do not actually have the tools they depend on at
+# runtime.
+[ -z "$CFGVER" ] && CFGVER=30
+[ $CFGVER -ge 17 ] || USEURL="#"
+
+for name in @PC_MODULES_TO_MAKE@
+do
+	name="${name}"
+	case $name in
+	form*)		name="$FORM_LIBRARY" 	;;
+	menu*)		name="$MENU_LIBRARY" 	;;
+	panel*)		name="$PANEL_LIBRARY"	;;
+	ncurses++*)	name="$CXX_LIBRARY"		;;
+	esac
+	LIBS="-l$name"
+
+	desc="ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@"
+	reqs=
+
+	if [ $name = $MAIN_LIBRARY ]; then
+		desc="$desc library"
+		[ $NEED_TINFO = yes ] && LIBS="$LIBS -l$TINFO_ARG_SUFFIX"
+		[ -n "@LIBS@" ] && LIBS="$LIBS @LIBS@"
+	elif [ $name = $SUB_LIBRARY ]; then
+		desc="$desc terminal interface library"
+	elif expr $name : ".*${CXX_NAME}.*" >/dev/null ; then
+		reqs="$PANEL_LIBRARY${suffix}, $MENU_LIBRARY${suffix}, $FORM_LIBRARY${suffix}, $MAIN_LIBRARY${suffix}"
+		desc="$desc add-on library"
+	else
+		reqs="$MAIN_LIBRARY${suffix}"
+		desc="$desc add-on library"
+	fi
+
+	if [ $name != $SUB_LIBRARY ] && \
+	   [ $SUB_LIBRARY != $MAIN_LIBRARY ] && \
+	   [ $name != $TINFO_NAME ] && \
+	   [ $NEED_TINFO != yes ] ; then
+		[ -n "$reqs" ] && reqs="$reqs, "
+		reqs="${reqs}${SUB_LIBRARY}${suffix}"
+	fi
+
+	if [ $name = $MAIN_LIBRARY ]
+	then
+		main_libs="$PRIVATE_LIBS"
+	else
+		main_libs=
+	fi
+
+	echo "** creating ${name}${suffix}.pc"
+	cat >${name}${suffix}.pc <<EOF
+# pkg-config file generated by `basename "$0"`
+# vile:makemode
+
+prefix=$show_prefix
+exec_prefix=$show_exec_prefix
+libdir=$show_libdir
+includedir=$show_includedir
+abi_version=@cf_cv_abi_version@
+major_version=@NCURSES_MAJOR@
+version=@NCURSES_MAJOR@.@NCURSES_MINOR@.@NCURSES_PATCH@
+
+Name: ${name}${suffix}
+Description: $desc
+Version: \${version}
+${USEURL}URL: https://invisible-island.net/ncurses
+Requires.private: $reqs
+Libs: $lib_flags $LIBS
+Libs.private: @LIBS@ $main_libs
+Cflags: $CFLAGS
+EOF
+
+done
+# vile:shmode ts=4 sw=4
diff --git a/misc/gen_edit.sh b/misc/gen_edit.sh
new file mode 100755
index 0000000..0c41611
--- /dev/null
+++ b/misc/gen_edit.sh
@@ -0,0 +1,119 @@
+#!/bin/sh
+##############################################################################
+# Copyright 2020,2021 Thomas E. Dickey                                       #
+# Copyright 2004-2011,2012 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey
+#
+# $Id: gen_edit.sh,v 1.7 2021/09/04 15:55:29 tom Exp $
+# Generate a sed-script for converting the terminfo.src to the form which will
+# be installed.
+#
+# Assumes:
+#	The leaf directory names (lib, tabset, terminfo)
+#
+
+linux_dft=linux2.2
+
+: "${datadir=/usr/share}"
+: "${WHICH_LINUX=$linux_dft}"
+: "${WHICH_XTERM=xterm-new}"
+: "${XTERM_KBS=BS}"
+
+# If we're not installing into /usr/share/, we'll have to adjust the location
+# of the tabset files in terminfo.src (which are in a parallel directory).
+TABSET=${datadir}/tabset
+if test "x$TABSET" != "x/usr/share/tabset" ; then
+cat <<EOF
+s%/usr/share/tabset%$TABSET%g
+EOF
+fi
+
+if test "$WHICH_XTERM" != "xterm-new" ; then
+echo "** using $WHICH_XTERM terminal description for XTerm entry" >&2
+cat <<EOF
+/^# This is xterm for ncurses/,/^$/{
+	s/use=xterm-new,/use=$WHICH_XTERM,/
+}
+EOF
+fi
+
+if test "$XTERM_KBS" != "BS" ; then
+echo "** using DEL for XTerm backspace-key" >&2
+cat <<EOF
+/^xterm+kbs|fragment for backspace key/,/^#/{
+	s/kbs=^H,/kbs=^?,/
+}
+EOF
+fi
+
+# Work around incompatibities built into Linux console.  The 2.6 series added
+# a patch to fixup the SI/SO behavior, which is closer to vt100, but the older
+# kernels do not recognize those controls.  All of the kernels recognize the
+# older flavor of rmacs/smacs, but beginning in the late 1990s, changes made
+# as part of implementing UTF-8 prevent using those for line-drawing when the
+# console is in UTF-8 mode.  Taking into account the fact that it took about
+# ten years to provide (and distribute) the 2.6 series' change for SI/SO, the
+# default remains "linux2.2".
+case x$WHICH_LINUX in #(vi
+xauto)
+	system=`uname -s 2>/dev/null`
+	if test "x$system" = xLinux
+	then
+		case x`uname -r` in
+		x1.*)
+			WHICH_LINUX=linux-c
+			;;
+		x2.[0-4]*)
+			WHICH_LINUX=linux2.2
+			;;
+		*)
+			WHICH_LINUX=linux3.0
+			;;
+		esac
+	else
+		WHICH_LINUX=$linux_dft
+	fi
+	;;
+xlinux*)
+	# allow specific setting
+	;;
+*)
+	WHICH_LINUX=$linux_dft
+	;;
+esac
+
+if test $WHICH_LINUX != $linux_dft
+then
+echo "** using $WHICH_LINUX terminal description for Linux console" >&2
+cat <<EOF
+/^# This is Linux console for ncurses/,/^$/{
+	s/use=$linux_dft,/use=$WHICH_LINUX,/
+}
+EOF
+fi
diff --git a/misc/magic b/misc/magic
new file mode 100644
index 0000000..0fab004
--- /dev/null
+++ b/misc/magic
@@ -0,0 +1,91 @@
+# $Id: magic,v 1.3 2020/02/02 23:34:34 tom Exp $
+##############################################################################
+# Copyright 2020 Thomas E. Dickey                                            #
+# Copyright 2015,2018 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.                                                             #
+##############################################################################
+# for reference, from file 5.30:
+#------------------------------------------------------------------------------
+# @File: terminfo,v 1.7 2016/03/17 21:02:29 christos Exp @
+# terminfo:  file(1) magic for terminfo
+#
+# URL: https://invisible-island.net/ncurses/man/term.5.html
+# URL: https://invisible-island.net/ncurses/man/scr_dump.5.html
+#
+# Workaround for Targa image type by Joerg Jenderek
+# GRR: line below too general as it catches also
+# Targa image type 1 with 26 long identification field
+# and HELP.DSK
+0	string		\032\001
+# 5th character of terminal name list, but not Targa image pixel size (15 16 24 32)
+>16	ubyte		>32
+# namelist, if more than 1 separated by "|" like "st|stterm| simpleterm 0.4.1"
+>>12	regex		\^[a-zA-Z0-9][a-zA-Z0-9.][^|]*	Compiled terminfo entry "%-s"
+!:mime	application/x-terminfo
+# no extension
+#!:ext
+#
+#------------------------------------------------------------------------------
+# The following was added for ncurses6 development:
+#------------------------------------------------------------------------------
+#
+0	string		\036\002
+# imitate the legacy compiled-format, to get the entry-name printed
+>16	ubyte		>32
+# namelist, if more than 1 separated by "|" like "st|stterm| simpleterm 0.4.1"
+>>12	regex		\^[a-zA-Z0-9][a-zA-Z0-9.][^|]*	Compiled 32-bit terminfo entry "%-s"
+!:mime	application/x-terminfo2
+#
+# While the compiled terminfo uses little-endian format irregardless of
+# platform, SystemV screen dumps do not.  They came later, and that detail was
+# overlooked.
+#
+# AIX and HPUX use the SVr4 big-endian format
+# Solaris uses the SVr3 formats (sparc and x86 differ endian-ness)
+0	beshort		0433 		SVr2 curses screen image, big-endian
+0	beshort		0434		SVr3 curses screen image, big-endian
+0	beshort		0435		SVr4 curses screen image, big-endian
+#
+0	leshort		0433		SVr2 curses screen image, little-endian
+0	leshort		0434		SVr3 curses screen image, little-endian
+0	leshort		0435		SVr4 curses screen image, little-endian
+#
+# Rather than SVr4, Solaris "xcurses" writes this header:
+0	regex		\^MAX=[0-9]+,[0-9]+$
+>1	regex		\^BEG=[0-9]+,[0-9]+$
+>2	regex		\^SCROLL=[0-9]+,[0-9]+$
+>3	regex		\^VMIN=[0-9]+$
+>4	regex		\^VTIME=[0-9]+$
+>5	regex		\^FLAGS=0x[[:xdigit:]]+$
+>6	regex		\^FG=[0-9],[0-9]+$
+>7	regex		\^BG=[0-9]+,[0-9]+,	Solaris xcurses screen image
+#
+# ncurses5 (and before) did not use a magic number, making screen dumps "data".
+# ncurses6 (2015) uses this format, ignoring byte-order
+0	string	\210\210\210\210ncurses	ncurses6 screen image
+#
+# PDCurses added this in 2005
+0	string		PDC\001		PDCurses screen image
diff --git a/misc/makedef.cmd b/misc/makedef.cmd
new file mode 100644
index 0000000..129ca83
--- /dev/null
+++ b/misc/makedef.cmd
@@ -0,0 +1,180 @@
+/****************************************************************************

+ * Copyright 2020,2021 Thomas E. Dickey                                     *

+ * Copyright 1998,2006 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: makedef.cmd,v 1.7 2021/09/04 10:52:55 tom Exp $

+ *

+ * Author:  Juan Jose Garcia Ripoll <worm@arrakis.es>.

+ * Webpage: http://www.arrakis.es/~worm/

+ *

+ * makedef.cmd - update a DLL export list using a newly created library file

+ *		 in a.out format, plus an old .DEF file.

+ *

+ * standard output gets a sorted list with all entrypoints with entrycodes.

+ * This list, plus a few .def sentences (LIBRARY, DESCRIPTION and EXPORT)

+ * is used to build a new .def file.

+ *

+ * `_nc_*' symbols are ignored.

+ *

+ * returns 1 when the old def_file is corrupted -- that is, export items are

+ * not properly formatted.

+ *

+ * returns 0 if everything went OK.

+ */

+

+parse arg lib_file def_file

+

+lib_file = translate(lib_file,'\','/')

+def_file = translate(def_file,'\','/')

+

+call CleanQueue

+

+/*

+ * `codes' is the stem that links a code to every symbol

+ * `names' is the stem where symbols are stored sequentially

+ * `last' is the index of the last symbol defined

+ */

+last   = 0

+used.  = 0

+codes. = 0

+names. = ''

+

+tmp_name = 'foo.tmp'

+

+/*

+ * This sed expression cleans empty lines, comments and special .DEF

+ * commands, such as LIBRARY..., EXPORTS..., etc

+ */

+tidy_up  = '"/^[A-Z]/d;s/[ 	][ 	]*/ /g;s/;.*$//g;s/^[ ]*//g;/^[ ]*$/d"'

+

+/*

+ * First we find all public symbols (functions and variables). Next we

+ * concatenate this list with the old one, sorting it and wiping out

+ * all unused data (comments, DLL directives, blanks, etc). All this

+ * information is pushed into a REXX private list with the RXQUEUE

+ * utility program.

+ */

+'@echo off'

+'emxexp -u' lib_file '>' tmp_name

+'cat' tmp_name def_file '| sed' tidy_up '| sort > foo2.tmp'

+'type foo2.tmp | rxqueue'

+'del' tmp_name '1>NUL'

+

+/*

+ * This loop runs over the queue items

+ */

+do while queued() > 0

+   /*

+    * We retrieve the symbol name (NEW_NAME) and its number (NEW_NUMBER)

+    * When the line comes from `emximp's output, there's no number, so

+    * we assign it the special value 0.

+    */

+   parse pull new_symbol '@'new_code rest

+   if Left(new_symbol,1) = '"' then

+      parse var new_symbol '"' new_name '"' rest

+   else

+      do

+      echo 'Symbol 'new_symbol' was not quoted'

+      new_name = new_symbol

+      end

+

+   if new_code = '' then

+      new_code = 0

+   /*

+    * Here, one would place all smart checks that would kill unused symbols.

+    * However, export tables are not that big, so why bothering?

+   if Left(new_name,4) = '_nc_' then

+      iterate

+    */

+   /*

+    * The algorithm:

+    *	IF (this is the 2nd time the symbol appears) THEN

+    *		(this symbol comes from a .DEF file)

+    *		it has a valid code that we store

+    *		we mark that code as used

+    *   ELIF (it has no number) THEN

+    *		(it is a new symbol)

+    *		we increase the counter of defined symbols

+    *		we assign it the special number 0

+    *		(later on it'll be assigned an unused export code)

+    *   ELSE

+    *		this symbol was in the old DLL and it is no longer

+    *		here, so we skip it.

+    */

+   select

+      when new_name = '' then

+         'echo Warning: empty symbol found 1>&2'

+      when names.last = new_name then

+         do

+         codes.last = new_code

+         used.new_code = 1

+         end

+      when new_code = 0 then

+         do

+         last = last + 1

+         names.last = new_name

+         codes.last = 0

+         end

+   otherwise

+      'echo Warning: symbol "'new_name'" has disappeared 1>&2'

+   end /* select */

+end /* do while queued() */

+

+/*

+ * Finally we scan the stem, writing out all symbols with export codes.

+ * Those that did not have a valid one (just 0) are assigned a new one.

+ */

+new_code = 1

+inx = 1

+do while inx <= last

+   if codes.inx = 0 then

+      do

+      do while used.new_code \= 0

+         new_code = new_code + 1

+      end

+      codes.inx = new_code

+      used.new_code = 1

+      end

+   say '	"'names.inx'"	@'codes.inx'	NONAME'

+   inx = inx + 1

+end

+'del foo2.tmp 1>NUL'

+exit 0

+

+/*

+ * Cleans the REXX queue by pulling and forgetting every line.

+ * This is needed, at least, when `makedef.cmd' starts, because an aborted

+ * REXX program might have left some rubbish in.

+ */

+CleanQueue: procedure

+   do while queued() > 0

+      parse pull foo

+   end

+return

+

diff --git a/misc/makellib b/misc/makellib
new file mode 100755
index 0000000..fb3d3b7
--- /dev/null
+++ b/misc/makellib
@@ -0,0 +1,168 @@
+#!/bin/sh
+##############################################################################
+# Copyright 2020,2021 Thomas E. Dickey                                       #
+# Copyright 1998,2000 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey 1996,1997,2000
+#
+# $Id: makellib,v 1.11 2021/09/04 15:49:38 tom Exp $
+# System-dependent wrapper for 'lint' that creates a lint-library via the
+# following method (XXX is the name of the library):
+#	a.  If the file llib-lXXX doesn't exist, create it using the make-rule
+#	b.  Process llib-lXXX with the system's lint utility, making
+#	    llib-lXXX.ln
+#	c.  Install llib-lXXX.ln in the lib directory.
+#
+# Using the intermediate file llib-lXXX bypasses a weakness of lint (passing
+# through warning messages from the original source-files).
+#
+# There are two drawbacks to this approach:
+#	a.  On a few systems, you'll have to manually-edit the llib-lXXX file
+#	    to get a usable lint-library (not all C-preprocessors work well).
+#	b.  The system's lint utility won't recognize -lXXX as a lint-library
+#	    (Use tdlint as a wrapper; it is designed for this).
+#
+# Parameters:
+#	$1 = library name
+#	$* = C-preprocessor options
+#
+ARCH=`uname -s`
+if test "x$ARCH" = "xSunOS" ; then
+	case `uname -r` in
+	5.*)	ARCH=Solaris
+		;;
+	esac
+fi
+#
+DST="$HOME/lib/$ARCH/lint"
+OPT=""
+LLIB=""
+llib=""
+#
+while test $# != 0
+do
+	case $1 in
+	-L*)
+		DST="$DST `echo "$1"|sed -e 's/^-L//'`"
+		;;
+	-*)
+		OPT="$OPT $1"
+		;;
+	*)
+		if test -z "$LLIB"
+		then
+			LLIB=$1
+		else
+			llib=llib-l$1
+		fi
+		;;
+	esac
+	shift
+done
+
+if test -z "$LLIB"
+then
+	echo '? no library name specified'
+	exit 1
+elif test -z "$llib"
+then
+	llib="llib-l$LLIB"
+fi
+
+if test ! -f "$llib" ; then
+	if ( make "$llib" )
+	then
+		:
+	else
+		exit 1
+	fi
+fi
+
+rm -f "$llib.ln" "$llib.c"
+TARGET=$LLIB
+
+case "$ARCH" in
+AIX)
+	CREATE="-uvxo$LLIB -Nn4000"
+	TARGET=$llib.c
+	ln "$llib" "$TARGET"
+	;;
+Solaris)
+	CREATE="-C$llib"
+	TARGET=$llib.c
+	ln "$llib" "$TARGET"
+	;;
+FreeBSD)
+	CREATE="-g -z -C$LLIB"
+	TARGET=$llib.c
+	ln "$llib" "$TARGET"
+	;;
+CLIX)
+	CREATE="-DLINTLIBRARY -vxo$LLIB"
+	TARGET=$llib.c
+	ln "$llib" "$TARGET"
+	;;
+IRIX*)
+	CREATE="-DLINTLIBRARY -vxyo$LLIB"
+	TARGET=$llib.c
+	ln "$llib" "$TARGET"
+	;;
+UNIX_SV)
+	CREATE="-DLINTLIBRARY -vxyo$LLIB"
+	TARGET=$llib.c
+	ln "$llib" "$TARGET"
+	;;
+*)
+	echo "Sorry.  I do not know how to build a lint-library for $ARCH"
+	exit 1
+esac
+
+echo OPT    "$OPT"
+echo TARGET "$TARGET"
+echo LIBNAME "$llib"
+if ( lint "$CREATE" "$OPT" "$TARGET" )
+then
+	if test -f "$llib.ln"
+	then
+		for p in $HOME/lib $HOME/lib/$ARCH $HOME/lib/$ARCH/lint
+		do
+			if test ! -d "$p"
+			then
+				mkdir "$p"
+			fi
+		done
+		for p in $DST
+		do
+			cp "$llib.ln" "$p/"
+		done
+		rm -f "$llib.ln"
+	fi
+fi
+if test "x$TARGET" = "x$llib.c" ; then
+	rm -f "$TARGET"
+fi
diff --git a/misc/menu.def b/misc/menu.def
new file mode 100644
index 0000000..01f973c
--- /dev/null
+++ b/misc/menu.def
@@ -0,0 +1,81 @@
+LIBRARY menu5 INITINSTANCE TERMINSTANCE

+DESCRIPTION "NCurses-5-1-20000704, module menu"

+CODE LOADONCALL

+DATA LOADONCALL NONSHARED MULTIPLE

+EXPORTS

+	"_nc_Calculate_Item_Length_and_Width"	@11	NONAME

+	"_nc_Connect_Items"	@38	NONAME

+	"_nc_Default_Item"	@63	NONAME

+	"_nc_Default_Menu"	@64	NONAME

+	"_nc_Disconnect_Items"	@65	NONAME

+	"_nc_Draw_Menu"	@66	NONAME

+	"_nc_Link_Items"	@67	NONAME

+	"_nc_Match_Next_Character_In_Item_Name"	@68	NONAME

+	"_nc_New_TopRow_and_CurrentItem"	@69	NONAME

+	"_nc_Post_Item"	@70	NONAME

+	"_nc_Show_Menu"	@71	NONAME

+	"_nc_menu_cursor_pos"	@72	NONAME

+	"current_item"	@2	NONAME

+	"free_item"	@23	NONAME

+	"free_menu"	@24	NONAME

+	"item_count"	@25	NONAME

+	"item_description"	@14	NONAME

+	"item_index"	@26	NONAME

+	"item_init"	@7	NONAME

+	"item_name"	@15	NONAME

+	"item_opts"	@5	NONAME

+	"item_opts_off"	@27	NONAME

+	"item_opts_on"	@28	NONAME

+	"item_term"	@8	NONAME

+	"item_userptr"	@18	NONAME

+	"item_value"	@60	NONAME

+	"item_visible"	@61	NONAME

+	"menu_back"	@20	NONAME

+	"menu_driver"	@29	NONAME

+	"menu_fore"	@21	NONAME

+	"menu_format"	@62	NONAME

+	"menu_grey"	@22	NONAME

+	"menu_init"	@9	NONAME

+	"menu_items"	@1	NONAME

+	"menu_mark"	@16	NONAME

+	"menu_opts"	@6	NONAME

+	"menu_opts_off"	@30	NONAME

+	"menu_opts_on"	@31	NONAME

+	"menu_pad"	@32	NONAME

+	"menu_pattern"	@17	NONAME

+	"menu_request_by_name"	@73	NONAME

+	"menu_request_name"	@74	NONAME

+	"menu_spacing"	@75	NONAME

+	"menu_sub"	@12	NONAME

+	"menu_term"	@10	NONAME

+	"menu_userptr"	@19	NONAME

+	"menu_win"	@13	NONAME

+	"new_item"	@3	NONAME

+	"new_menu"	@4	NONAME

+	"pos_menu_cursor"	@33	NONAME

+	"post_menu"	@34	NONAME

+	"scale_menu"	@35	NONAME

+	"set_current_item"	@36	NONAME

+	"set_item_init"	@37	NONAME

+	"set_item_opts"	@39	NONAME

+	"set_item_term"	@40	NONAME

+	"set_item_userptr"	@41	NONAME

+	"set_item_value"	@42	NONAME

+	"set_menu_back"	@43	NONAME

+	"set_menu_fore"	@44	NONAME

+	"set_menu_format"	@45	NONAME

+	"set_menu_grey"	@46	NONAME

+	"set_menu_init"	@47	NONAME

+	"set_menu_items"	@48	NONAME

+	"set_menu_mark"	@49	NONAME

+	"set_menu_opts"	@50	NONAME

+	"set_menu_pad"	@51	NONAME

+	"set_menu_pattern"	@52	NONAME

+	"set_menu_spacing"	@76	NONAME

+	"set_menu_sub"	@53	NONAME

+	"set_menu_term"	@54	NONAME

+	"set_menu_userptr"	@55	NONAME

+	"set_menu_win"	@56	NONAME

+	"set_top_row"	@57	NONAME

+	"top_row"	@58	NONAME

+	"unpost_menu"	@59	NONAME

diff --git a/misc/menu.ref b/misc/menu.ref
new file mode 100644
index 0000000..cee964f
--- /dev/null
+++ b/misc/menu.ref
@@ -0,0 +1,73 @@
+LIBRARY MENU2 INITINSTANCE

+DESCRIPTION 'NCurses 1.9.9e-1 for OS/2 - menu library'

+EXPORTS

+	"menu_items"		@1	;NONAME

+	"current_item"		@2	;NONAME

+	"new_item"		@3	;NONAME

+

+	"new_menu"		@4	;NONAME

+

+	"item_opts"		@5	;NONAME

+	"menu_opts"		@6	;NONAME

+

+	"item_init"		@7	;NONAME

+	"item_term"		@8	;NONAME

+	"menu_init"		@9	;NONAME

+	"menu_term"		@10	;NONAME

+

+	"menu_sub"		@12	;NONAME

+	"menu_win"		@13	;NONAME

+

+	"item_description"	@14	;NONAME

+	"item_name"		@15	;NONAME

+	"menu_mark"		@16	;NONAME

+	"menu_pattern"		@17	;NONAME

+

+	"item_userptr"		@18	;NONAME

+	"menu_userptr"		@19	;NONAME

+

+	"menu_back"		@20	;NONAME

+	"menu_fore"		@21	;NONAME

+	"menu_grey"		@22	;NONAME

+

+	"free_item"		@23	;NONAME

+	"free_menu"		@24	;NONAME

+	"item_count"		@25	;NONAME

+	"item_index"		@26	;NONAME

+	"item_opts_off"		@27	;NONAME

+	"item_opts_on"		@28	;NONAME

+	"menu_driver"		@29	;NONAME

+	"menu_opts_off"		@30	;NONAME

+	"menu_opts_on"		@31	;NONAME

+	"menu_pad"		@32	;NONAME

+	"pos_menu_cursor" 	@33	;NONAME

+	"post_menu"		@34	;NONAME

+	"scale_menu"		@35	;NONAME

+	"set_current_item"	@36	;NONAME

+	"set_item_init"		@37	;NONAME

+	"set_item_opts"		@39	;NONAME

+	"set_item_term"		@40	;NONAME

+	"set_item_userptr"	@41	;NONAME

+	"set_item_value"	@42	;NONAME

+	"set_menu_back"		@43	;NONAME

+	"set_menu_fore"		@44	;NONAME

+	"set_menu_format" 	@45	;NONAME

+	"set_menu_grey"		@46	;NONAME

+	"set_menu_init"		@47	;NONAME

+	"set_menu_items"	@48	;NONAME

+	"set_menu_mark"		@49	;NONAME

+	"set_menu_opts"		@50	;NONAME

+	"set_menu_pad"		@51	;NONAME

+	"set_menu_pattern"	@52	;NONAME

+	"set_menu_sub"		@53	;NONAME

+	"set_menu_term"		@54	;NONAME

+	"set_menu_userptr"	@55	;NONAME

+	"set_menu_win"		@56	;NONAME

+	"set_top_row"		@57	;NONAME

+	"top_row" 		@58	;NONAME

+	"unpost_menu"		@59	;NONAME

+

+	"item_value"		@60	;NONAME

+	"item_visible"		@61	;NONAME

+

+	"menu_format"		@62	;NONAME

diff --git a/misc/ncu2openbsd b/misc/ncu2openbsd
new file mode 100755
index 0000000..b066a10
--- /dev/null
+++ b/misc/ncu2openbsd
@@ -0,0 +1,1286 @@
+#!/usr/bin/env perl
+# $Id: ncu2openbsd,v 1.65 2021/10/03 18:52:22 tom Exp $
+# -----------------------------------------------------------------------------
+# Copyright 2021 by Thomas E. Dickey
+#
+#                         All Rights Reserved
+#
+# 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, 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 LISTED COPYRIGHT HOLDER(S) 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.
+# -----------------------------------------------------------------------------
+# https://invisible-island.net/ncurses/ncurses-openbsd.html
+#
+# Update the OpenBSD source-tree given an ncurses tarball or build-tree.
+
+use strict;
+use warnings;
+
+use Getopt::Std;
+use Cwd;
+use Cwd 'abs_path';
+use File::Path qw/ remove_tree /;
+use File::Temp qw/ tempdir /;
+
+$| = 1;
+
+our ( $opt_d, $opt_n, $opt_r, $opt_t, $opt_v, $opt_x );
+our $source_dir;
+our $target_dir;
+our $update_dir;
+our $backup_dir;
+
+our $tempdir = tempdir( CLEANUP => 1 );
+my $current = getcwd;
+my $working = $current;
+
+our $generated_by = "generated by: ncu2openbsd";
+
+our %setup_dir = qw(
+  lib/libcurses         ncurses
+  lib/libform           form
+  lib/libmenu           menu
+  lib/libpanel          panel
+  usr.bin/infocmp       progs
+  usr.bin/tabs          progs
+  usr.bin/tic           progs
+  usr.bin/toe           progs
+  usr.bin/tput          progs
+  usr.bin/tset          progs
+  share/termtypes       misc
+);
+
+our %generated = qw(
+  codes.c 1
+  comp_captab.c         1
+  comp_userdefs.c       1
+  expanded.c            1
+  fallback.c            1
+  init_keytry.h         1
+  keys.list             1
+  lib_gen.c             1
+  lib_keyname.c         1
+  make_hash             1
+  make_keys             1
+  names.c               1
+  termsort.c            1
+  unctrl.c              1
+);
+
+our %definitions = qw(
+  CAPTOINFO             captoinfo
+  DATADIR               /usr/share
+  INFOCMP               infocmp
+  INFOTOCAP             infotocap
+  NCURSES_MAJOR         5
+  NCURSES_MINOR         7
+  NCURSES_OSPEED        int
+  NCURSES_PATCH         20081102
+  TERMINFO              /usr/share/terminfo
+  TIC                   tic
+  TOE                   toe
+  TPUT                  tput
+  TSET                  tset
+);
+
+sub patchdate() {
+    return $definitions{"NCURSES_PATCH"};
+}
+
+sub failed($) {
+    chdir $current;
+    printf STDERR "? %s\n", $_[0];
+    exit;
+}
+
+sub verbose($) {
+    my $text = shift;
+    printf "%s\n", $text if ($opt_v);
+}
+
+sub read_file($) {
+    my $name = shift;
+    open( my $fp, $name ) || &failed("cannot open $name");
+    my (@input) = <$fp>;
+    chomp @input;
+    close($fp);
+    return @input;
+}
+
+sub read_dir($) {
+    my $path = shift;
+    my @result;
+    if ( opendir( my $dh, $path ) ) {
+        my @data = sort readdir($dh);
+        closedir $dh;
+        for my $d ( 0 .. $#data ) {
+            next if ( $data[$d] =~ /^\.(\.)?$/ );
+            next if ( -l $path . "/" . $data[$d] );
+            $result[ $#result + 1 ] = $data[$d];
+        }
+    }
+    return @result;
+}
+
+sub rename_dir($$) {
+    my $src = shift;
+    my $dst = shift;
+    printf "%% mv %s -> %s\n", $src, $dst if ($opt_v);
+    rename $src, $dst unless ($opt_n);
+}
+
+sub check_sourcedir($) {
+    my $path = shift;
+    &failed("not a directory: $path") unless ( -d $path );
+    my $full = abs_path($path);
+    chdir $full;
+    &failed("not an ncurses source-tree: $path")
+      unless ( -f "NEWS" and -f "dist.mk" );
+    $source_dir = $full;
+}
+
+sub unpack($) {
+    my $path    = shift;
+    my $full    = abs_path($path);
+    my $command = "";
+    if ( $path =~ /\.tgz$/ or $path =~ /\.tar\.gz$/ ) {
+        $command = "tar xzf %s";
+    }
+    elsif ( $path =~ /\.zip$/ ) {
+        $command = "unzip -q %s";
+    }
+    else {
+        &failed("not a gzip'd tarball or zip-file: $path");
+    }
+    chdir $tempdir;
+    system( sprintf( $command, $full ) );
+
+    # there should be exactly one subdirectory -- the source-tree
+    my @data = &read_dir(".");
+    &failed("found no subdirectories of $path") if ( $#data < 0 );
+    &failed( "too many subdirectories: " . $data[0] . " vs " . $data[1] )
+      if ( $#data > 0 );
+    &check_sourcedir( $data[0] );
+}
+
+sub remove_dir($) {
+    my $tree = shift;
+    if ( -d $tree ) {
+        printf "%% rm -rf %s\n", $tree if ($opt_v);
+        remove_tree( $tree, $opt_v ? 1 : 0, 1 ) unless ($opt_n);
+    }
+}
+
+sub copy_CVS($) {
+    my $leaf    = shift;
+    my $src     = $target_dir . $leaf . "/CVS";
+    my $dst     = $update_dir . $leaf . "/CVS";
+    my $verbose = $opt_v ? "v" : "";
+    if ( -d $src and !-d $dst ) {
+        my $mid = $update_dir . $leaf;
+        mkdir $mid unless ( -d $mid );
+        mkdir $dst unless ( -d $dst );
+        system("cp -a$verbose $src/* $dst/");
+    }
+}
+
+sub is_tic_code($) {
+    my $item   = shift;
+    my $result = 0;
+    $result = 1
+      if (
+        $item =~ /^(capconvert
+                   |tic
+                   |dump
+                   |progs
+                   |termsort
+                   |transform
+                   |MKtermsort)/x
+      );
+    return $result;
+}
+
+sub is_ident($$) {
+    my $name = shift;
+    my $text = shift;
+    my $code = 0;
+    $code = 1 if ( $text =~ /\$$name:.*\$/ );
+    return $code;
+}
+
+# We "could", filter out differences with ident's using the diff -I option,
+# but in practice, that is cumbersome.
+sub munge_ident($) {
+    my $target = shift;
+    my $source = $target;
+    $source =~ s/\.update\b//;
+    &failed("bug at $source") if ( $source eq $target );
+    return unless ( -f $source );
+    my @source = &read_file($source);
+    my @target = &read_file($target);
+    my $old_id = "";
+    my $gap_id = 0;
+    my $new_id = "";
+    my $skipit = -1;
+
+    for my $n ( 0 .. $#source ) {
+        if ( &is_ident( "OpenBSD", $source[$n] ) ) {
+            $old_id = $source[$n];
+            $skipit = $n + 1;
+        }
+        elsif ( &is_ident( "Id", $source[$n] ) ) {
+            $new_id = $source[$n];
+            last;
+        }
+        elsif ( $n == $skipit ) {
+            $source[$n] =~ s/\s+$//;
+            if ( $source[$n] eq "" ) {
+                $gap_id = $source[$n];
+            }
+            elsif ( $source[$n] eq '.\"' ) {
+                $gap_id = $source[$n];
+            }
+        }
+    }
+    if ( $old_id ne "" ) {
+        my @update;
+        my $tables = &uses_tables($target);
+        $update[ $#update + 1 ] = $target[0] if ($tables);
+        $update[ $#update + 1 ] = $old_id;
+        $update[ $#update + 1 ] = $gap_id unless ( $gap_id eq 0 );
+        for my $n ( $tables .. $#target ) {
+            if ( &is_ident( "Id", $target[$n] ) ) {
+                $update[ $#update + 1 ] = $new_id;
+            }
+            else {
+                $update[ $#update + 1 ] = $target[$n];
+            }
+        }
+        system("chmod u+w $target");
+        if ( open my $fp, ">", $target ) {
+            for my $n ( 0 .. $#update ) {
+                printf $fp "%s\n", $update[$n];
+            }
+            close $fp;
+            system("chmod u-w $target");
+        }
+    }
+}
+
+# ncurses manual pages provide for renaming the utilities, normally as part of
+# the scripts provided in its sources.  OpenBSD developers do not use those.
+sub munge_docs($) {
+    my $path = shift;
+    my @data = &read_file($path);
+    my $done = 0;
+    for my $n ( 0 .. $#data ) {
+        my $text = $data[$n];
+        $text =~ s/\b1M\b/1/g;
+        $text =~ s/\b3X\b/3/g;
+        $text =~ s/\bcurs_(term(info|cap)\s*3\b)/$1/g;
+        $text =~ s/(\\fB)curs_(term(info|cap)\\f[RP]\(3\))/$1$2/g;
+        my $left = "";
+        while ( $text =~ /@[[:alnum:]_]+@/ ) {
+            my $next = index( $text, "@" );
+            last if ( $next < 0 );
+            $left .= substr( $text, 0, $next++ );
+            $text = substr( $text, $next );
+            $next = index( $text, "@" );
+            last if ( $next < 0 );
+            my $word = substr( $text, 0, $next );
+            if ( $word =~ /^[[:alnum:]_]+/ ) {
+
+                if ( $definitions{$word} ) {
+                    $word = $definitions{$word};
+                }
+                else {
+                    $word = "?";
+                }
+                $left .= $word;
+                $text = substr( $text, $next + 1 );
+            }
+            else {
+                &failed("unexpected definition @$word@");
+            }
+        }
+        $text = $left . $text;
+        if ( $text ne $data[$n] ) {
+            $done++;
+            $data[$n] = $text;
+        }
+    }
+    if ($done) {
+        system("chmod u+w $path");
+        if ( open my $fp, ">", $path ) {
+            for my $n ( 0 .. $#data ) {
+                printf $fp "%s\n", $data[$n];
+            }
+            close $fp;
+            system("chmod u-w $path");
+        }
+    }
+}
+
+sub copy_file($$) {
+    my $src     = shift;
+    my $dst     = shift;
+    my $verbose = $opt_v ? "v" : "";
+    if ( -d $dst ) {
+        my $leaf = $src;
+        $leaf =~ s,^.*/,,;
+        $dst .= "/" . $leaf;
+    }
+    system("chmod u+w $dst") if ( -f $dst );
+    system("cp -a$verbose $src $dst");
+    &munge_ident($dst);
+}
+
+sub copy_code($) {
+    my $src = shift;
+    my $dst = shift;
+    &copy_CVS( substr( $dst, length($update_dir) ) );
+    printf ".. copying files for $dst\n";
+    my @data = &read_dir($src);
+    printf ".. %d entries\n", $#data + 1;
+    my $verbose = $opt_v ? "v" : "";
+    for my $d ( 0 .. $#data ) {
+        my $item     = $data[$d];
+        my $src_item = $src . "/" . $item;
+        next if ( -d $src_item );
+        next if ( -l $src_item );
+        next if ( $item =~ /^\.(\.)?$/ );
+        next if ( $item =~ /\.(bak|in|log|status)$/ );
+        next if ( $item =~ /^llib-/ );
+        next if ( $item =~ /^modules/ );
+        next if ( $item =~ /^[fm]_trace\.c/ and not $opt_t );
+        next
+          if ( $item =~ /^Makefile/ and index( $update_dir, "/share/" ) < 0 );
+        next if ( $item =~ /^README/ );
+        next if ( $item eq "headers" );
+        next if ( $generated{$item} );
+        next if ( $item eq "link_test.c" );
+
+        if ( index( $dst, "/usr.bin/" ) >= 0 ) {
+            next if ( $item =~ /^(clear)/ );    # OpenBSD uses "tput clear"
+            my $prog = $dst;
+            $prog =~ s%^.*/%%;
+            $prog =~ s/(update|backup)//;
+            $prog .= "c";
+            if ( $dst =~ /infocmp/ ) {
+                next if ( $item ne $prog );
+            }
+            elsif ( $dst =~ /tabs/ ) {
+                next if ( $item ne $prog );
+            }
+            elsif ( $dst =~ /tic/ ) {
+                next if ( &is_tic_code($item) == 0 );
+            }
+            elsif ( $dst =~ /toe/ ) {
+                next if ( $item ne $prog );
+            }
+            elsif ( $dst =~ /tput/ ) {
+                next if ( $item ne $prog );
+            }
+            elsif ( $dst =~ /tset/ ) {
+                next if ( $item ne $prog );
+            }
+            else {
+                next;
+            }
+        }
+        system( sprintf( "cp -a$verbose %s %s/%s", $src_item, $dst, $item ) );
+        &munge_ident("$dst/$item");
+    }
+}
+
+# Checking if nroff supports tables is a long-obsolete issue, and is not really
+# necessary, except to match OpenBSD's source-tree.
+sub uses_tables($) {
+    my $docs = shift;
+    my @docs = &read_file($docs);
+    my $code = 0;
+    for my $n ( 0 .. $#docs ) {
+        if ( $docs[$n] =~ /^[.']\\"\s+t\b.*/ ) {
+            $code = 1;
+            last;
+        }
+        elsif ( $docs[$n] =~ /^\./ ) {
+            last;
+        }
+    }
+    return $code;
+}
+
+sub copy_1doc($$) {
+    my $docs = shift;
+    my $src  = "$source_dir/man/$docs";
+    my $dst  = "$update_dir/$docs";
+    $src .= "m" if ( -f "${src}m" );
+    $dst =~ s/x$//;
+    if ( $dst =~ /\.3/ ) {
+        $dst =~ s/\bncurses/curses/ if ( $dst =~ /ncurses\./ );
+        $dst =~ s/\bcurs_//         if ( $dst =~ /_term(cap|info)\./ );
+    }
+    &copy_file( $src, $dst );
+    &munge_docs($dst);
+}
+
+sub copy_docs($) {
+    my $docs = shift;
+    if ( index( $update_dir, "/usr.bin/" ) >= 0 ) {
+        &copy_1doc( $docs . ".1" );
+        if ( $docs eq "tic" ) {
+            &copy_1doc("captoinfo.1");
+            &copy_1doc("infotocap.1");
+        }
+    }
+    else {
+        my @docs = &read_dir("$source_dir/man");
+        if ( $docs eq "curses" ) {
+            for my $n ( 0 .. $#docs ) {
+                next if ( $docs[$n] eq "Makefile" );
+                next if ( $docs[$n] eq "make_sed.sh" );
+                next if ( $docs[$n] eq "man_db.renames" );
+                next if ( $docs[$n] eq "manlinks.sed" );
+                next if ( $docs[$n] =~ /\.(1|head|tail|in)/ );
+                next if ( $docs[$n] =~ /^(form|menu|mitem|panel)/ );
+                &copy_1doc( $docs[$n] );
+            }
+        }
+        elsif ( $docs eq "form" ) {
+            for my $n ( 0 .. $#docs ) {
+                next unless ( $docs[$n] =~ /^form/ );
+                &copy_1doc( $docs[$n] );
+            }
+        }
+        elsif ( $docs eq "menu" ) {
+            for my $n ( 0 .. $#docs ) {
+                next unless ( $docs[$n] =~ /^(menu|mitem)/ );
+                &copy_1doc( $docs[$n] );
+            }
+        }
+        elsif ( $docs eq "panel" ) {
+            for my $n ( 0 .. $#docs ) {
+                next unless ( $docs[$n] =~ /^panel/ );
+                &copy_1doc( $docs[$n] );
+            }
+        }
+    }
+}
+
+sub setup_dir($) {
+    my $dst = shift;
+    &failed("no definition for $dst")
+      unless ( defined $setup_dir{$dst} or $opt_r );
+    $target_dir = sprintf( "%s/%s", $opt_d, $dst );
+    $update_dir = $target_dir . ".update";
+    $backup_dir = $target_dir . ".backup";
+    my $result = 0;
+    if ($opt_r) {
+        &remove_dir($update_dir);
+        if ( $target_dir =~ /\/(tabs|toe)$/ ) {
+            &remove_dir($target_dir);
+        }
+        elsif ( -d $backup_dir ) {
+            &remove_dir($target_dir);
+            &rename_dir( $backup_dir, $target_dir );
+        }
+    }
+    else {
+        &remove_dir($update_dir);
+        mkdir $update_dir;
+
+        # reuse the shared-library version, assuming ABI=5 would involve at
+        # most a minor-version bump.
+        &copy_file( "$target_dir/shlib_version", $update_dir )
+          if ( $dst =~ /^lib\// );
+        &copy_code( $source_dir . "/" . $setup_dir{$dst}, $update_dir )
+          unless ( $setup_dir{$dst} eq "misc" );
+        $result = 1;
+    }
+    return $result;
+}
+
+sub do_build($) {
+    my $command = shift;
+    printf "%% %s\n", $command if ($opt_v);
+    system($command);
+}
+
+sub finish_dir() {
+    printf "** $target_dir\n";
+    system("diff -Naurb $target_dir $update_dir | diffstat -n 30")
+      if ( -d $target_dir );
+    if ($opt_n) {
+        &do_build("cd $update_dir && make -n") if ($opt_x);
+    }
+    else {
+        if ( -d $backup_dir ) {
+            printf STDERR "? backup directory exists: %s\n", $backup_dir;
+        }
+        else {
+            &rename_dir( $target_dir, $backup_dir );
+            &rename_dir( $update_dir, $target_dir );
+        }
+        &do_build("cd $target_dir && make") if ($opt_x);
+    }
+}
+
+################################################################################
+
+sub only_c_files($) {
+    my @data = @{ $_[0] };
+    my %data;
+    for my $n ( 0 .. $#data ) {
+        my $text = $data[$n];
+        $data{$text}++ if ( $text =~ /\.c$/ );
+    }
+    return sort keys %data;
+}
+
+sub makefile_list($$$) {
+    my @data = @{ $_[0] };
+    my $name = $_[1];
+    my $skip = $_[2];
+    my %data;
+    my $state = 0;
+    for my $n ( 0 .. $#data ) {
+        my $text = $data[$n];
+        $text =~ s/^\s+//;
+        next if ( index( $text, $skip ) == 0 );
+        $text =~ s/\s+=/=/;
+        $text =~ s/=\s+/=/;
+        $text =~ s/\s*\\//;
+        $state = 1 if ( $text =~ /^${name}=/ );
+        next unless ( $state == 1 );
+
+        if ( index( $text, "(trace)" ) >= 0 and not $opt_t ) {
+            next unless ( $text =~ /\b(lib_trace|visbuf)\.c$/ );
+        }
+        if ( not $opt_t ) {
+            next if ( $text =~ /\b[fm]_trace\.c$/ );
+        }
+        $text =~ s/^.*=//;
+        $text =~ s/\$o/.o/g;
+        $text =~ s/^.*\///;
+        next           if ( $text eq "link_test.c" );
+        next           if ( $text eq "mf_common.h" );
+        next           if ( $text eq "transform.h" );
+        $data{$text}++ if ( $text ne "" );
+        last           if ( $data[$n] !~ /\\$/ );
+    }
+    return sort keys %data;
+}
+
+sub manpage_list($) {
+    my $path = shift;
+    my @data = &read_dir($path);
+    my %data;
+    for my $n ( 0 .. $#data ) {
+        my $text = $data[$n];
+        $data{$text}++ if ( $text =~ /\.\d$/ );
+    }
+    return sort keys %data;
+}
+
+sub columns_of($) {
+    my $string = shift;
+    my $result = 0;
+    for my $n ( 0 .. length($string) - 1 ) {
+        my $c = substr( $string, $n, 1 );
+        if ( $c eq "\t" ) {
+            $result |= 7;
+            $result++;
+        }
+        elsif ( $c eq "\n" ) {
+            $result = 0;
+        }
+        else {
+            ++$result;
+        }
+    }
+    return $result;
+}
+
+sub format_list($$) {
+    my $name = $_[0];
+    my @data = @{ $_[1] };
+    my $keep = ( defined $_[2] ) ? 1 : 0;
+    my $base;
+    my $fill;
+    if ( length($name) >= 9 ) {
+        $fill = " ";
+        $base = length($name) + 1;
+    }
+    else {
+        $base = 9;
+        $fill = "\t";
+    }
+    my $result = sprintf( "%s%s", $name, $fill );
+    if ( $keep == 0 ) {
+        my %data;
+        for my $n ( 0 .. $#data ) {
+            $data{ $data[$n] } = 1 if ( defined $data[$n] );
+        }
+        @data = sort keys %data;
+    }
+    for my $n ( 0 .. $#data ) {
+        my $data = $data[$n];
+        my $col  = &columns_of($result);
+        my $add  = 1 + length($data);
+        if ( ( $col + $add ) > 76 ) {
+            $result .= " " if ( $col > $base );
+            $base = 9;
+            $fill = "\t";
+            $result .= "\\\n" . $fill . $data;
+        }
+        else {
+            $result .= " " if ( $col > $base );
+            $result .= $data;
+        }
+    }
+    return $result;
+}
+
+################################################################################
+
+sub compare_makefiles($) {
+    if ($opt_v) {
+        my $newfile = shift;
+        my $bakfile =
+          ( -d $backup_dir ? $backup_dir : $target_dir ) . "/Makefile";
+        system("diff -u $bakfile $newfile") if ( -f $bakfile );
+    }
+}
+
+# The curses makefile has to build build-time utilities and generate source.
+sub gen_1st_makefile() {
+    my $libname = "curses";
+    my $oldfile = "$source_dir/n$libname/Makefile";
+    my @oldfile = &read_file($oldfile);
+
+    my $newfile = "$update_dir/Makefile";
+    open( my $fp, ">", $newfile ) || &failed("cannot open $newfile");
+    my @subdirs = (
+        '${.CURDIR}/base', '${.CURDIR}/tinfo',
+        '${.CURDIR}/tty',  '${.CURDIR}/widechar'
+    );
+    $subdirs[ $#subdirs + 1 ] = '${.CURDIR}/trace' if ($opt_t);
+    printf $fp <<EOF;
+# $generated_by
+
+LIB=	$libname
+
+# Uncomment this to enable tracing in libcurses
+#CURSESTRACE=-DTRACE
+
+# This is used to compile terminal info directly into the library
+FALLBACK_LIST=
+
+# XXX - should be defined elsewhere
+AWK?=	/usr/bin/awk
+
+# Search in subdirs
+EOF
+    printf $fp "%s\n", &format_list( ".PATH:", \@subdirs );
+
+    my @autosrc = &makefile_list( \@oldfile, "AUTO_SRC", "?" );
+    my @auto_cc = &only_c_files( \@autosrc );
+    printf $fp "%s\n", &format_list( "SRCS=", \@auto_cc );
+
+    my @sources = &makefile_list( \@oldfile, "C_SRC", "./" );
+    printf $fp "%s\n", &format_list( "SRCS+=", \@sources );
+
+    printf $fp <<EOF;
+
+HOSTCFLAGS?=	\${CFLAGS}
+HOSTLDFLAGS?=	\${LDFLAGS}
+HOSTCFLAGS+=	-I. -I\${.CURDIR} \${CURSESTRACE}
+CFLAGS+=	-I. -I\${.CURDIR} \${CURSESTRACE} -D_XOPEN_SOURCE_EXTENDED -DNDEBUG
+
+EOF
+    my @manpages = &manpage_list($update_dir);
+    printf $fp "%s\n", &format_list( "MAN=", \@manpages );
+
+    $autosrc[ $#autosrc++ ] = "make_hash";
+    $autosrc[ $#autosrc++ ] = "make_keys";
+    printf $fp "%s\n", &format_list( "GENERATED=", \@autosrc );
+    printf $fp <<EOF;
+
+CAPLIST	= \${.CURDIR}/Caps
+USE_BIG_STRINGS	= 1
+
+CLEANFILES+= \${GENERATED}
+
+BUILDFIRST = \${GENERATED}
+
+includes:
+	\@cmp -s \${DESTDIR}/usr/include/ncurses.h \${.CURDIR}/curses.h || \\
+	  \${INSTALL} \${INSTALL_COPY} -m 444 -o \$(BINOWN) -g \$(BINGRP) \\
+	  \${.CURDIR}/curses.h \${DESTDIR}/usr/include/ncurses.h
+	\@cd \${.CURDIR}; for i in ncurses_dll.h unctrl.h term.h termcap.h; do \\
+	  cmp -s \$\$i \${DESTDIR}/usr/include/\$\$i || \\
+	  \${INSTALL} \${INSTALL_COPY} -m 444 -o \$(BINOWN) -g \$(BINGRP) \$\$i \\
+	  \${DESTDIR}/usr/include; done
+
+keys.list: \${.CURDIR}/tinfo/MKkeys_list.sh
+	sh \${.CURDIR}/tinfo/MKkeys_list.sh \${.CURDIR}/Caps | sort > \${.TARGET}
+
+fallback.c: \${.CURDIR}/tinfo/MKfallback.sh
+	sh \${.CURDIR}/tinfo/MKfallback.sh /usr/share/terminfo \${.CURDIR}/../../share/termtypes/termtypes.master \$(FALLBACK_LIST) > \${.TARGET}
+
+lib_gen.c: \${.CURDIR}/base/MKlib_gen.sh
+	sh \${.CURDIR}/base/MKlib_gen.sh "\${CC} -E -P -I\${.CURDIR}" \\
+		"\${AWK}" generated < \${.CURDIR}/curses.h > lib_gen.c
+
+init_keytry.h: make_keys keys.list
+	./make_keys keys.list > \${.TARGET}
+
+make_keys: \${.CURDIR}/tinfo/make_keys.c \${.CURDIR}/curses.priv.h names.c
+	\${HOSTCC} \${LDSTATIC} \${HOSTCFLAGS} \${HOSTLDFLAGS} \\
+		-o \${.TARGET} \${.CURDIR}/tinfo/make_keys.c \${LDADD}
+EOF
+
+    if ( &patchdate >= 20090808 ) {
+        printf $fp <<EOF;
+make_hash:	\${.CURDIR}/tinfo/make_hash.c \\
+		\${.CURDIR}/curses.priv.h \\
+		\${.CURDIR}/hashsize.h
+	\${HOSTCC} \${LDSTATIC} \${HOSTCFLAGS} -DMAIN_PROGRAM \${HOSTLDFLAGS} \\
+		-o \${.TARGET} \${.CURDIR}/tinfo/make_hash.c \${LDADD}
+EOF
+    }
+    else {
+        printf $fp <<EOF;
+make_hash: \${.CURDIR}/tinfo/comp_hash.c \\
+		\${.CURDIR}/curses.priv.h \\
+		\${.CURDIR}/hashsize.h
+	\${HOSTCC} \${LDSTATIC} \${HOSTCFLAGS} -DMAIN_PROGRAM \${HOSTLDFLAGS} \\
+		-o \${.TARGET} \${.CURDIR}/tinfo/comp_hash.c \${LDADD}
+EOF
+    }
+
+    if ( &patchdate >= 20190309 ) {
+        printf $fp <<EOF;
+CAPLIST += \${.CURDIR}/Caps-ncurses
+
+comp_userdefs.c: make_hash \\
+		\${.CURDIR}/hashsize.h \\
+		\${.CURDIR}/tinfo/MKuserdefs.sh
+	sh \${.CURDIR}/tinfo/MKuserdefs.sh \${AWK} \${USE_BIG_STRINGS} \${CAPLIST} > \${.TARGET}
+EOF
+    }
+    printf $fp <<EOF;
+
+expanded.c: \${.CURDIR}/term.h \${.CURDIR}/curses.priv.h \\
+		\${.CURDIR}/ncurses_cfg.h \${.CURDIR}/tty/MKexpanded.sh
+	sh \${.CURDIR}/tty/MKexpanded.sh "\${CC} -E -P" \${CPPFLAGS} > \${.TARGET}
+
+comp_captab.c: make_hash
+	sh \${.CURDIR}/tinfo/MKcaptab.sh \${AWK} \${USE_BIG_STRINGS} \\
+		\${.CURDIR}/tinfo/MKcaptab.awk \${CAPLIST} > \${.TARGET}
+
+lib_keyname.c: keys.list \${.CURDIR}/base/MKkeyname.awk
+	\${AWK} -f \${.CURDIR}/base/MKkeyname.awk \\
+		bigstrings=\${USE_BIG_STRINGS} \\
+		keys.list > \${.TARGET}
+
+names.c: \${.CURDIR}/tinfo/MKnames.awk
+	\${AWK} -f \${.CURDIR}/tinfo/MKnames.awk \\
+		bigstrings=\${USE_BIG_STRINGS} \\
+		\${CAPLIST} > \${.TARGET}
+codes.c: \${.CURDIR}/tinfo/MKcodes.awk
+	\${AWK} -f \${.CURDIR}/tinfo/MKcodes.awk \\
+		bigstrings=\${USE_BIG_STRINGS} \\
+		\${CAPLIST} > \${.TARGET}
+
+unctrl.c: \${.CURDIR}/base/MKunctrl.awk
+	echo | \${AWK} -f \${.CURDIR}/base/MKunctrl.awk bigstrings=1 > \${.TARGET}
+
+.include <bsd.own.mk>
+
+# Link libtermlib, libtermcap to libcurses so we don't break people's Makefiles
+afterinstall:
+	-cd \${DESTDIR}\${LIBDIR}; \\
+	for i in \${_LIBS}; do \\
+	    ln -f \$\$i `echo \$\$i | sed 's/curses/termlib/'`; \\
+	    ln -f \$\$i `echo \$\$i | sed 's/curses/termcap/'`; \\
+	    ln -f \$\$i `echo \$\$i | sed 's/curses/ncurses/'`; \\
+	    ln -f \$\$i `echo \$\$i | sed 's/curses/ncursesw/'`; \\
+	done
+
+.include <bsd.lib.mk>
+EOF
+    close $fp;
+    &compare_makefiles($newfile);
+}
+
+sub gen_lib_makefile($) {
+    my $libname = shift;
+    my $oldfile = "$source_dir/$libname/Makefile";
+    my @oldfile = &read_file($oldfile);
+
+    # in ncurses, header-files are quasi-generated, because the original
+    # header file for form/menu/panel lives in the source-directory, but is
+    # copied to the include-directory with "make sources".
+    my @headers = &makefile_list( \@oldfile, "AUTO_SRC", "?" );
+
+    # The C source is more straightforward.
+    my @sources = &makefile_list( \@oldfile, "C_SRC", "?" );
+    my $newfile = "$update_dir/Makefile";
+    open( my $fp, ">", $newfile ) || &failed("cannot open $newfile");
+    printf $fp <<EOF;
+# $generated_by
+
+LIB=	$libname
+EOF
+
+    printf $fp "%s\n", &format_list( "SRCS=", \@sources );
+    printf $fp "%s\n", &format_list( "HDRS=", \@headers );
+    my $includes = '-I${.CURDIR}/../libcurses';
+    $includes .= ' -I${.CURDIR}/../libmenu' if ( $libname eq "form" );
+    printf $fp <<EOF;
+CFLAGS+=$includes -D_XOPEN_SOURCE_EXTENDED -DNDEBUG
+EOF
+    my @manpages = &manpage_list($update_dir);
+    printf $fp "%s\n", &format_list( "MAN=", \@manpages );
+    printf $fp <<EOF;
+
+includes:
+	\@cd \$\{.CURDIR}; for i in \$\{HDRS}; do \\
+	  cmp -s \$\$i \${DESTDIR}/usr/include/\$\$i || \\
+	  \${INSTALL} \${INSTALL_COPY} -m 444 -o \$(BINOWN) -g \$(BINGRP) \$\$i \\
+	  \${DESTDIR}/usr/include; done
+
+.include <bsd.own.mk>
+
+afterinstall:
+	-cd \${DESTDIR}\${LIBDIR}; \\
+	for i in \${_LIBS}; do \\
+	    ln -f \$\$i `echo \$\$i | sed 's/${libname}/${libname}w/'`; \\
+	done
+
+.include <bsd.lib.mk>
+EOF
+    close $fp;
+    &compare_makefiles($newfile);
+}
+
+sub gen_bin_makefile($) {
+    my $binname = shift;
+    my $oldfile = "$source_dir/progs/Makefile";
+    my @oldfile = &read_file($oldfile);
+    my $newfile = "$update_dir/Makefile";
+
+    open( my $fp, ">", $newfile ) || &failed("cannot open $newfile");
+    my @sources = ("$binname.c");
+    my @links   = ();
+    my @autosrc = &makefile_list( \@oldfile, "AUTO_SRC", "?" );
+
+    my $tput_ver       = 0;
+    my $use_dump_entry = 0;
+    my $use_termsort   = 0;
+    my $use_tparm_type = 0;
+    my $use_transform  = 0;
+
+    $use_dump_entry = 1 if ( $binname eq "infocmp" or $binname eq "tic" );
+    $use_termsort   = 1 if ( $use_dump_entry       or $binname eq "tput" );
+
+    if ( &patchdate >= 20090314 ) {
+        $use_transform = 1 if ( $binname =~ /^(tic|tput|tset)/ );
+    }
+    if ( &patchdate >= 20140521 ) {
+        $use_tparm_type = 1 if ( $binname =~ /^(tic|tput)$/ );
+    }
+    if ( &patchdate >= 20160806 ) {
+        $tput_ver = &patchdate;
+    }
+
+    $sources[ ++$#sources ] = "dump_entry.c" if ($use_dump_entry);
+    $sources[ ++$#sources ] = "tparm_type.c" if ($use_tparm_type);
+    $sources[ ++$#sources ] = "transform.c"  if ($use_transform);
+
+    $autosrc[ ++$#autosrc ] = "termsort.c" if ($use_termsort);
+
+    # transform.h also is generated, but OpenBSD checked-in a copy
+
+    if ( $binname eq "tic" ) {
+        $links[ ++$#links ] = "captoinfo";
+        $links[ ++$#links ] = "infotocap";
+    }
+    elsif ( $binname eq "tabs" ) {
+        $sources[ ++$#sources ] = "tty_settings.c" if ( $tput_ver >= 20161224 );
+    }
+    elsif ( $binname eq "tput" ) {
+        $sources[ ++$#sources ] = "clear_cmd.c"    if ( $tput_ver >= 20161022 );
+        $sources[ ++$#sources ] = "reset_cmd.c"    if ( $tput_ver >= 20160806 );
+        $sources[ ++$#sources ] = "tty_settings.c" if ( $tput_ver >= 20161224 );
+        $links[ ++$#links ]     = "clear";
+    }
+    elsif ( $binname eq "tset" ) {
+        $sources[ ++$#sources ] = "reset_cmd.c"    if ( $tput_ver >= 20160806 );
+        $sources[ ++$#sources ] = "tty_settings.c" if ( $tput_ver >= 20161224 );
+        $links[ ++$#links ]     = "reset";
+    }
+
+    printf $fp <<EOF;
+# $generated_by
+
+PROG=	$binname
+EOF
+    printf $fp "%s\n", &format_list( "SRCS=", \@sources );
+    printf $fp <<EOF;
+CURSES=	\${.CURDIR}/../../lib/libcurses
+DPADD=	\${LIBCURSES}
+LDADD=	-L\${CURSES} -lcurses\t# in-tree link to add _nc_strict_bsd, etc
+EOF
+    if ( $#links >= 0 ) {
+        my @bin_links;
+        for my $n ( 0 .. $#links ) {
+            $bin_links[ ++$#bin_links ] = '${BINDIR}/' . $binname;
+            $bin_links[ ++$#bin_links ] = '${BINDIR}/' . $links[$n];
+        }
+        printf $fp "%s\n", &format_list( "LINKS=", \@bin_links, 1 );
+    }
+    my $ticfix = '${.CURDIR}/';
+    if ( $binname eq "tic" ) {
+        printf $fp <<EOF;
+CFLAGS+= -I\${CURSES} -I\${.CURDIR} -I.
+EOF
+    }
+    else {
+        $ticfix = '${TIC}/';
+        printf $fp <<EOF;
+TIC= \${.CURDIR}/../tic
+CFLAGS+= -I\${CURSES} -I\${TIC} -I\${.CURDIR} -I.
+.PATH:  \${TIC}
+EOF
+    }
+    printf $fp "%s\n", &format_list( "CLEANFILES+=", \@autosrc );
+    if ($use_dump_entry) {
+        printf $fp <<EOF;
+
+dump_entry.o: termsort.c
+EOF
+    }
+    if ($use_termsort) {
+        printf $fp <<EOF;
+
+termsort.c: ${ticfix}MKtermsort.sh
+	sh ${ticfix}MKtermsort.sh awk \${CURSES}/Caps > \${.TARGET}
+EOF
+    }
+    printf $fp <<EOF;
+
+.include <bsd.prog.mk>
+EOF
+    close $fp;
+
+    &compare_makefiles($newfile);
+}
+
+################################################################################
+
+sub setup_lib_libcurses() {
+    if ( &setup_dir("lib/libcurses") ) {
+        &copy_code( "$source_dir/ncurses/base",     "$update_dir/base" );
+        &copy_code( "$source_dir/ncurses/tinfo",    "$update_dir/tinfo" );
+        &copy_code( "$source_dir/ncurses/tty",      "$update_dir/tty" );
+        &copy_code( "$source_dir/ncurses/widechar", "$update_dir/widechar" );
+        &copy_file( "$source_dir/include/Caps",           $update_dir );
+        &copy_file( "$source_dir/include/capdefaults.c",  $update_dir );
+        &copy_file( "$source_dir/include/curses.h",       $update_dir );
+        &copy_file( "$source_dir/include/hashed_db.h",    $update_dir );
+        &copy_file( "$source_dir/include/hashsize.h",     $update_dir );
+        &copy_file( "$source_dir/include/nc_alloc.h",     $update_dir );
+        &copy_file( "$source_dir/include/nc_panel.h",     $update_dir );
+        &copy_file( "$source_dir/include/nc_tparm.h",     $update_dir );
+        &copy_file( "$source_dir/include/ncurses_cfg.h",  $update_dir );
+        &copy_file( "$source_dir/include/ncurses_def.h",  $update_dir );
+        &copy_file( "$source_dir/include/ncurses_dll.h",  $update_dir );
+        &copy_file( "$source_dir/include/parametrized.h", $update_dir );
+        &copy_file( "$source_dir/include/term.h",         $update_dir );
+        &copy_file( "$source_dir/include/termcap.h",      $update_dir );
+        &copy_file( "$source_dir/include/term_entry.h",   $update_dir );
+        &copy_file( "$source_dir/include/tic.h",          $update_dir );
+        &copy_file( "$source_dir/include/unctrl.h",       $update_dir );
+        &copy_file( "$source_dir/man/terminfo.5",         $update_dir );
+        &copy_docs("curses");
+
+        &verbose(".. work around a bug in /bin/sh in OpenBSD");
+        system( "sed -i"
+              . " -e 's,^shift,test \$# != 0 \\&\\& shift,'"
+              . " $update_dir/tinfo/MKfallback.sh" );
+
+        # OpenBSD dropped support for sys/ttydev.h, without mentioning the
+        # system version.  Just trim it.
+        &verbose(".. work around mishandled sys/ttydef.h");
+        system( "sed -i"
+              . " -e '/__FreeBSD_version/s,|| defined(__OpenBSD__),,'"
+              . " $update_dir/tinfo/lib_baudrate.c" );
+
+        if ($opt_t) {
+            &copy_code( "$source_dir/ncurses/trace", "$update_dir/trace" );
+        }
+        else {
+            &copy_file( "$source_dir/ncurses/trace/lib_trace.c", $update_dir );
+            &copy_file( "$source_dir/ncurses/trace/visbuf.c",    $update_dir );
+        }
+        &copy_file( "$source_dir/include/nc_termios.h", $update_dir )
+          if ( &patchdate >= 20110625 );
+        &copy_file( "$source_dir/include/nc_string.h", $update_dir )
+          if ( &patchdate >= 20120222 );
+        &copy_file( "$source_dir/include/nc_access.h", $update_dir )
+          if ( &patchdate >= 20210626 );
+        &copy_file( "$source_dir/include/Caps-ncurses", $update_dir )
+          if ( &patchdate >= 20190302 );
+        &gen_1st_makefile;
+        &finish_dir;
+    }
+}
+
+sub setup_lib_libform() {
+    if ( &setup_dir("lib/libform") ) {
+        &copy_docs("form");
+        &gen_lib_makefile("form");
+        &finish_dir;
+    }
+}
+
+sub setup_lib_libmenu() {
+    if ( &setup_dir("lib/libmenu") ) {
+        &copy_docs("menu");
+        &gen_lib_makefile("menu");
+        &finish_dir;
+    }
+}
+
+sub setup_lib_libpanel() {
+    if ( &setup_dir("lib/libpanel") ) {
+        &copy_docs("panel");
+        &gen_lib_makefile("panel");
+        &finish_dir;
+    }
+}
+
+sub setup_bin_infocmp() {
+    if ( &setup_dir("usr.bin/infocmp") ) {
+        &copy_docs("infocmp");
+        &gen_bin_makefile("infocmp");
+        &finish_dir;
+    }
+}
+
+sub setup_bin_tabs() {
+    if ( &setup_dir("usr.bin/tabs") ) {
+        &copy_docs("tabs");
+        &gen_bin_makefile("tabs");
+        &finish_dir;
+    }
+}
+
+sub setup_bin_tic() {
+    if ( &setup_dir("usr.bin/tic") ) {
+        if ( &patchdate >= 20140521 ) {
+            &copy_file( "$source_dir/progs/tparm_type.c", $update_dir );
+            &copy_file( "$source_dir/progs/tparm_type.h", $update_dir );
+        }
+
+        # shared files for tput/tset
+        if ( &patchdate >= 20160806 ) {
+            &copy_file( "$source_dir/progs/reset_cmd.c", $update_dir );
+            &copy_file( "$source_dir/progs/reset_cmd.h", $update_dir );
+        }
+        if ( &patchdate >= 20161022 ) {
+            &copy_file( "$source_dir/progs/clear_cmd.c", $update_dir );
+            &copy_file( "$source_dir/progs/clear_cmd.h", $update_dir );
+        }
+        if ( &patchdate >= 20161224 ) {
+            &copy_file( "$source_dir/progs/tty_settings.c", $update_dir );
+            &copy_file( "$source_dir/progs/tty_settings.h", $update_dir );
+        }
+        &copy_docs("tic");
+        &gen_bin_makefile("tic");
+        &finish_dir;
+    }
+}
+
+sub setup_bin_toe() {
+    if ( &setup_dir("usr.bin/toe") ) {
+        &copy_docs("toe");
+        &gen_bin_makefile("toe");
+        &finish_dir;
+    }
+}
+
+sub setup_bin_tput() {
+    if ( &setup_dir("usr.bin/tput") ) {
+        &copy_docs("tput");
+        &gen_bin_makefile("tput");
+        &finish_dir;
+    }
+}
+
+sub setup_bin_tset() {
+    if ( &setup_dir("usr.bin/tset") ) {
+        &copy_docs("tset");
+        &gen_bin_makefile("tset");
+        &finish_dir;
+    }
+}
+
+sub setup_terminfo() {
+    if ( &setup_dir("share/termtypes") ) {
+        &copy_code( $target_dir, $update_dir );
+        &copy_file( "$source_dir/misc/terminfo.src",
+            "$update_dir/termtypes.master" );
+
+        # build the terminfo database using the in-tree tic.
+        # This is always best practice, but for ncurses 6.2 in particular is
+        # required.
+        my $prog = abs_path("$target_dir/../../usr.bin/tic");
+        my $libs = abs_path("$target_dir/../../lib/libcurses");
+        if ( defined $prog and defined $libs ) {
+            $prog .= "/tic";
+            &verbose(".. changing makefile to use in-tree tic");
+            system( "sed -i -E "
+                  . "-e 's,(TIC=).*,\\1\t$prog,' "
+                  . "-e 's,(\\\${TIC}),LD_LIBRARY_PATH=$libs \\1,' "
+                  . "$update_dir/Makefile" );
+        }
+        &finish_dir;
+    }
+}
+
+sub configure_tree() {
+    return if ( -f "ncurses/Makefile" );
+    my @search = ( "/usr/share/terminfo", "/usr/local/share/terminfo" );
+    my @prefix = ("./configure");
+    $prefix[ ++$#prefix ] = "--with-abi-version=5"
+      if ( &patchdate >= 20150502 );
+    my @options = (
+        "--with-ospeed=int",    #
+        "--with-shared",        #
+        "--without-normal",     #
+        "--without-debug",      #
+        "--with-terminfo-dirs=" . join( ':', @search ),    #
+        "--without-ada",                                   #
+        "--disable-hard-tabs",                             #
+        "--enable-const",                                  #
+        "--enable-getcap",                                 #
+        "--enable-bsdpad",                                 #
+        "--enable-signed-char",                            #
+        "--enable-termcap",                                #
+        "--enable-widec"
+    );
+    $options[ ++$#options ] = "--with-trace" if ($opt_t);
+    $options[ ++$#options ] = "--enable-string-hacks"
+      if ( &patchdate >= 20120225 );
+    system( join( ' ', @prefix ) . ' ' . join( ' ', @options ) );
+    &failed("problem with configuring") unless ( -f "ncurses/Makefile" );
+
+    system("make sources");
+
+    # OpenBSD developers edit the generated file and do not regen it when
+    # doing upgrades.  This script reflects those edits.
+    system( "sed -i" . " -E"
+          . " -e '/TYPEOF_CHTYPE/s,int,long,'"
+          . " -e '/USE_TERMCAP/d'"
+          . " -e '/HAVE_LIB(FORM|MENU|PANEL)/s,^(.*)\$,/* \\1 */,'"
+          . " -e 's/TERMPATH.*/PURE_TERMINFO 0/'"
+          . " -e '/SYSTEM_NAME/s,\[0-9.\]+,,'"
+          . " include/ncurses_cfg.h" );
+}
+
+sub get_definitions() {
+    my @data = &read_file("dist.mk");
+    for my $n ( 0 .. $#data ) {
+        my $text = $data[$n];
+        $text =~ s/^\s*//;
+        next unless ( $text =~ /^NCURSES.*=/ );
+        $text =~ s/\s*=\s+/=/;
+        my $name = $text;
+        $name =~ s/=.*//;
+        my $value = $text;
+        $value =~ s/^[^=]*=//;
+        $value =~ s/\s.*//;
+        $definitions{$name} = $value;
+    }
+}
+
+sub setup_all_dirs() {
+    printf "** %s all build-directories\n", $opt_r ? "removing" : "setting up";
+    &get_definitions;
+    &configure_tree unless ($opt_r);
+    &setup_lib_libcurses;
+    &setup_lib_libmenu;
+    &setup_lib_libform;    # build after libmenu, for mf_common.h
+    &setup_lib_libpanel;
+    &setup_bin_tic;        # do this first, for shared headers
+    &setup_bin_infocmp;
+    &setup_bin_tabs if ( -f "$source_dir/progs/tabs.c" );
+    &setup_bin_toe;
+    &setup_bin_tput;
+    &setup_bin_tset;
+    &setup_terminfo;
+}
+
+sub usage() {
+    print <<EOF;
+Usage: ncu2openbsd [options] [sourcetree]
+
+Options:
+  -d DST   specify destination (default: /usr/src)
+  -n       no-op, do not update destination
+  -r       remove update, restore sources from ".orig"
+  -t       enable ncurses trace
+  -v       verbose
+  -x       build each directory after setting up
+EOF
+    exit;
+}
+
+$Getopt::Std::STANDARD_HELP_VERSION = 1;
+&getopts('d:nrtvx') || &usage();
+$opt_d = "/usr/src" unless ($opt_d);
+&usage() unless ( $#ARGV <= 0 );
+
+if ( $#ARGV == 0 ) {
+    if ( -f $ARGV[0] ) {
+        printf "** unpacking sources: %s\n", $ARGV[0];
+        &unpack( $ARGV[0] );
+    }
+    else {
+        &check_sourcedir( $ARGV[0] );
+    }
+}
+else {
+    &check_sourcedir(".");
+}
+
+&setup_all_dirs;
+
+# move out of temp-directory to allow cleanup.
+chdir $current;
+
+1;
diff --git a/misc/ncurses-config.in b/misc/ncurses-config.in
new file mode 100644
index 0000000..c9f1cf8
--- /dev/null
+++ b/misc/ncurses-config.in
@@ -0,0 +1,331 @@
+#!@SHELL@
+# $Id: ncurses-config.in,v 1.52 2022/07/26 21:36:28 tom Exp $
+##############################################################################
+# Copyright 2018-2021,2022 Thomas E. Dickey                                  #
+# Copyright 2006-2015,2017 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey, 2006-on
+
+LANG=C;		export LANG
+LANGUAGE=C;	export LANGUAGE
+LC_ALL=C;	export LC_ALL
+LC_CTYPE=C;	export LC_CTYPE
+
+prefix="@prefix@"
+exec_prefix="@exec_prefix@"
+
+bindir="@bindir@"
+includedir="@includedir@"
+libdir="@libdir@"
+datarootdir="@datarootdir@"
+datadir="@datadir@"
+mandir="@mandir@"
+
+THIS="@LIB_NAME@@USE_LIB_SUFFIX@"
+TINFO_LIB="@TINFO_ARG_SUFFIX@"
+RPATH_LIST="@RPATH_LIST@"
+
+includesubdir="@includedir@/${THIS}"
+
+# Ensure that RPATH_LIST contains only absolute pathnames, if it is nonempty.
+# We cannot filter it out within the build-process since the variable is used
+# in some special cases of installation using a relative path.
+if [ -n "$RPATH_LIST" ]
+then
+	save_IFS="$IFS"
+	IFS='@PATH_SEPARATOR@'
+	filtered=
+	for item in $RPATH_LIST
+	do
+		case "$item" in
+		./*|../*|*/..|*/../*)
+			;;
+		*)
+			[ -n "$filtered" ] && filtered="${filtered}@PATH_SEPARATOR@"
+			filtered="${filtered}${item}"
+			;;
+		esac
+	done
+	IFS="$save_IFS"
+	# if the result is empty, there is little we can do to fix it
+	RPATH_LIST="$filtered"
+fi
+
+# with --disable-overwrite, we installed into a subdirectory, but transformed
+# the headers to include like this:
+#	<ncurses@LIB_SUFFIX@/curses.h>
+if [ x@WITH_OVERWRITE@ = xno ]; then
+	case $includedir in
+	$prefix/include/ncurses@LIB_SUFFIX@@EXTRA_SUFFIX@)
+		includedir=`echo "$includedir" | sed -e 's,/[^/]*$,,'`
+		;;
+	esac
+fi
+
+LIBS="@LIBS@"
+if [ "@TINFO_NAME@" = "@LIB_NAME@" ]; then
+	LIBS="-l${THIS} $LIBS"
+else
+	LIBS="-l${THIS} -l${TINFO_LIB} $LIBS"
+fi
+
+# Ignore -L options which do not correspond to an actual directory, or which
+# are standard library directories (i.e., the linker is supposed to search
+# those directories).
+#
+# There is no portable way to find the list of standard library directories.
+# Require a POSIX shell anyway, to keep this simple.
+lib_flags=
+for opt in -L$libdir @EXTRA_PKG_LDFLAGS@ $LIBS
+do
+	case $opt in
+	-specs*) # ignore linker specs-files which were used to build library
+		continue
+		;;
+	-Wl,-z,*) # ignore flags used to manipulate shared image
+		continue
+		;;
+	-Wl,--dynamic-linker*) # ignore ELF interpreter
+		continue
+		;;
+	-Wl,--as-needed|-Wl,--build-id=*|-Wl,-dT,*|-Wl,-T,*)
+		continue
+		;;
+	-L*)
+		lib_check=`echo "x$opt" | sed -e 's/^.-L//'`
+		[ -d "$lib_check" ] || continue
+		case "$lib_check" in
+		@LD_SEARCHPATH@) # skip standard libdir
+			if [ "$lib_check" = "$libdir" ]
+			then
+				lib_first=yes
+				IFS_save="$IFS"
+				IFS='|'
+				LIBDIRS="@LD_SEARCHPATH@"
+				for lib_check in $LIBDIRS
+				do
+					if [ -d "$lib_check" ]
+					then
+						if [ "$lib_check" != "$libdir" ]
+						then
+							lib_first=no
+						fi
+						break
+					fi
+				done
+				IFS="$IFS_save"
+				[ $lib_first = yes ] && continue
+				found=no
+				for check in $lib_flags
+				do
+					if [ "x$check" = "x$opt" ]
+					then
+						found=yes
+						break
+					fi
+				done
+				[ $found = yes ] && continue
+				:
+			else
+				continue
+			fi
+			;;
+		*)
+			found=no
+			for check in $lib_flags
+			do
+				if [ "x$check" = "x$opt" ]
+				then
+					found=yes
+					break
+				fi
+			done
+			[ $found = yes ] && continue
+			;;
+		esac
+		;;
+	esac
+	lib_flags="$lib_flags $opt"
+done
+
+[ $# = 0 ] && exec @SHELL@ "$0" --error
+
+while [ $# -gt 0 ]; do
+	case "$1" in
+	# basic configuration
+	--prefix)
+		echo "$prefix"
+		;;
+	--exec-prefix)
+		echo "$exec_prefix"
+		;;
+	# compile/link
+	--cflags)
+		INCS="@PKG_CFLAGS@"
+		if [ "x@WITH_OVERWRITE@" = xno ]; then
+			INCS="$INCS -I${includesubdir}"
+		fi
+		if [ "${includedir}" != /usr/include ]; then
+			INCS="$INCS -I${includedir}"
+		fi
+		sed -e 's,^[ ]*,,' -e 's, [ ]*, ,g' -e 's,[ ]*$,,' <<-ENDECHO
+			$INCS
+ENDECHO
+		;;
+	--libs)
+		OPTS=
+		for opt in $lib_flags
+		do
+			[ -n "$OPTS" ] && OPTS="$OPTS "
+			OPTS="${OPTS}${opt}"
+		done
+		printf '%s\n' "$OPTS"
+		;;
+	--libs-only-L)
+		OPTS=
+		for opt in $lib_flags
+		do
+			case "x$opt" in
+			x-L*)
+				[ -n "$OPTS" ] && OPTS="$OPTS "
+				OPTS="${OPTS}${opt}"
+				;;
+			esac
+		done
+		printf '%s\n' "$OPTS"
+		;;
+	--libs-only-l)
+		OPTS=
+		for opt in $lib_flags
+		do
+			case "x$opt" in
+			x-l*)
+				[ -n "$OPTS" ] && OPTS="$OPTS "
+				OPTS="${OPTS}${opt}"
+				;;
+			esac
+		done
+		printf '%s\n' "$OPTS"
+		;;
+	--libs-only-other)
+		OPTS=
+		for opt in $lib_flags
+		do
+			case "x$opt" in
+			x-[lL]*)
+				;;
+			*)
+				[ -n "$OPTS" ] && OPTS="$OPTS "
+				OPTS="${OPTS}${opt}"
+				;;
+			esac
+		done
+		printf '%s\n' "$OPTS"
+		;;
+	# identification
+	--version)
+		echo "@NCURSES_MAJOR@.@NCURSES_MINOR@.@NCURSES_PATCH@"
+		;;
+	--abi-version)
+		echo "@cf_cv_abi_version@"
+		;;
+	--mouse-version)
+		echo "@NCURSES_MOUSE_VERSION@"
+		;;
+	# locations
+	--bindir)
+		echo "${bindir}"
+		;;
+	--datadir)
+		echo "${datadir}"
+		;;
+	--includedir)
+		INCS=
+		if [ "x@WITH_OVERWRITE@" = xno ]; then
+			INCS="${includesubdir}"
+		elif [ "${includedir}" != /usr/include ]; then
+			INCS="${includedir}"
+		fi
+		echo "$INCS"
+		;;
+	--libdir)
+		echo "${libdir}"
+		;;
+	--mandir)
+		echo "${mandir}"
+		;;
+	--terminfo)
+		echo "@TERMINFO@"
+		;;
+	--terminfo-dirs)
+		echo "@TERMINFO_DIRS@"
+		;;
+	--termpath)
+		echo "@TERMPATH@"
+		;;
+	# general info
+	--help)
+		cat <<ENDHELP
+Usage: `basename "$0"` [options]
+
+Options:
+  --prefix           echos the package-prefix of ${THIS}
+  --exec-prefix      echos the executable-prefix of ${THIS}
+
+  --cflags           echos the C compiler flags needed to compile with ${THIS}
+  --libs             echos the libraries needed to link with ${THIS}
+
+  --libs-only-L      echos -L linker options (search path) for ${THIS}
+  --libs-only-l      echos -l linker options (libraries) for ${THIS}
+  --libs-only-other  echos linker options other than -L/-l
+
+  --version          echos the release+patchdate version of ${THIS}
+  --abi-version      echos the ABI version of ${THIS}
+  --mouse-version    echos the mouse-interface version of ${THIS}
+
+  --bindir           echos the directory containing ${THIS} programs
+  --datadir          echos the directory containing ${THIS} data
+  --includedir       echos the directory containing ${THIS} header files
+  --libdir           echos the directory containing ${THIS} libraries
+  --mandir           echos the directory containing ${THIS} manpages
+  --terminfo         echos the \$TERMINFO terminfo database path
+  --terminfo-dirs    echos the \$TERMINFO_DIRS directory list
+  --termpath         echos the \$TERMPATH termcap list
+
+  --help             prints this message
+ENDHELP
+		;;
+	--error|*)
+		@SHELL@ "$0" --help 1>&2
+		exit 1
+		;;
+	esac
+	shift
+done
+# vi:ts=4 sw=4
+# vile:shmode
diff --git a/misc/ncurses.def b/misc/ncurses.def
new file mode 100644
index 0000000..fa50456
--- /dev/null
+++ b/misc/ncurses.def
@@ -0,0 +1,447 @@
+LIBRARY ncurses5 INITINSTANCE TERMINSTANCE

+DESCRIPTION "NCurses-5-1-20000704, module ncurses"

+CODE LOADONCALL

+DATA LOADONCALL NONSHARED MULTIPLE

+EXPORTS

+	"BC"	@662	NONAME

+	"COLORS"	@503	NONAME

+	"COLOR_PAIR"	@36	NONAME

+	"COLOR_PAIRS"	@504	NONAME

+	"COLS"	@511	NONAME

+	"ESCDELAY"	@513	NONAME

+	"LINES"	@510	NONAME

+	"PAIR_NUMBER"	@209	NONAME

+	"PC"	@660	NONAME

+	"SP"	@1003	NONAME

+	"TABSIZE"	@512	NONAME

+	"UP"	@661	NONAME

+	"_nc_access"	@6	NONAME

+	"_nc_add_to_try"	@7	NONAME

+	"_nc_align_termtype"	@8	NONAME

+	"_nc_background"	@9	NONAME

+	"_nc_baudrate"	@10	NONAME

+	"_nc_cap_hash_table"	@805	NONAME

+	"_nc_capalias_table"	@806	NONAME

+	"_nc_capcmp"	@707	NONAME

+	"_nc_captoinfo"	@829	NONAME

+	"_nc_check_termtype"	@15	NONAME

+	"_nc_comment_end"	@819	NONAME

+	"_nc_comment_start"	@818	NONAME

+	"_nc_copy_entry"	@16	NONAME

+	"_nc_copy_termtype"	@22	NONAME

+	"_nc_curr_col"	@816	NONAME

+	"_nc_curr_file_pos"	@817	NONAME

+	"_nc_curr_line"	@815	NONAME

+	"_nc_curr_token"	@803	NONAME

+	"_nc_disable_period"	@23	NONAME

+	"_nc_do_color"	@1037	NONAME

+	"_nc_doalloc"	@25	NONAME

+	"_nc_entry_match"	@710	NONAME

+	"_nc_err_abort"	@826	NONAME

+	"_nc_expand_try"	@27	NONAME

+	"_nc_expanded"	@51	NONAME

+	"_nc_fallback"	@625	NONAME

+	"_nc_find_entry"	@809	NONAME

+	"_nc_find_type_entry"	@810	NONAME

+	"_nc_first_name"	@622	NONAME

+	"_nc_flush"	@54	NONAME

+	"_nc_free_entries"	@712	NONAME

+	"_nc_free_termtype"	@58	NONAME

+	"_nc_freeall"	@59	NONAME

+	"_nc_freewin"	@60	NONAME

+	"_nc_get_hash_table"	@63	NONAME

+	"_nc_get_table"	@808	NONAME

+	"_nc_get_token"	@811	NONAME

+	"_nc_get_tty_mode"	@65	NONAME

+	"_nc_get_type"	@823	NONAME

+	"_nc_getenv_num"	@67	NONAME

+	"_nc_has_mouse"	@73	NONAME

+	"_nc_hash_map"	@84	NONAME

+	"_nc_head"	@700	NONAME

+	"_nc_home_terminfo"	@91	NONAME

+	"_nc_info_hash_table"	@804	NONAME

+	"_nc_infoalias_table"	@807	NONAME

+	"_nc_infotocap"	@830	NONAME

+	"_nc_init_acs"	@92	NONAME

+	"_nc_init_entry"	@702	NONAME

+	"_nc_init_keytry"	@93	NONAME

+	"_nc_keep_tic_dir"	@95	NONAME

+	"_nc_key_names"	@96	NONAME

+	"_nc_keypad"	@1024	NONAME

+	"_nc_make_oldhash"	@97	NONAME

+	"_nc_makenew"	@1025	NONAME

+	"_nc_memmove"	@98	NONAME

+	"_nc_merge_entry"	@704	NONAME

+	"_nc_msec_cost"	@103	NONAME

+	"_nc_mvcur_init"	@1014	NONAME

+	"_nc_mvcur_resume"	@106	NONAME

+	"_nc_mvcur_wrap"	@1015	NONAME

+	"_nc_name_match"	@623	NONAME

+	"_nc_nulls_sent"	@116	NONAME

+	"_nc_oldnums"	@117	NONAME

+	"_nc_ospeed"	@118	NONAME

+	"_nc_outch"	@1026	NONAME

+	"_nc_outstr"	@1033	NONAME

+	"_nc_panelhook"	@119	NONAME

+	"_nc_panic_mode"	@814	NONAME

+	"_nc_parse_entry"	@706	NONAME

+	"_nc_printf_string"	@120	NONAME

+	"_nc_push_token"	@812	NONAME

+	"_nc_read_entry"	@620	NONAME

+	"_nc_read_entry_source"	@709	NONAME

+	"_nc_read_file_entry"	@621	NONAME

+	"_nc_read_termcap"	@127	NONAME

+	"_nc_remove_key"	@129	NONAME

+	"_nc_remove_string"	@130	NONAME

+	"_nc_render"	@1027	NONAME

+	"_nc_reset_input"	@813	NONAME

+	"_nc_resolve_uses"	@711	NONAME

+	"_nc_ripoffline"	@132	NONAME

+	"_nc_save_str"	@703	NONAME

+	"_nc_screen_chain"	@137	NONAME

+	"_nc_screen_init"	@142	NONAME

+	"_nc_screen_resume"	@143	NONAME

+	"_nc_screen_wrap"	@144	NONAME

+	"_nc_scroll_oldhash"	@145	NONAME

+	"_nc_scroll_optimize"	@1029	NONAME

+	"_nc_scroll_window"	@1030	NONAME

+	"_nc_scrolln"	@146	NONAME

+	"_nc_set_buffer"	@147	NONAME

+	"_nc_set_source"	@822	NONAME

+	"_nc_set_tty_mode"	@148	NONAME

+	"_nc_set_type"	@824	NONAME

+	"_nc_set_writedir"	@152	NONAME

+	"_nc_setupscreen"	@1031	NONAME

+	"_nc_sigaction"	@158	NONAME

+	"_nc_signal_handler"	@1034	NONAME

+	"_nc_slk_format"	@159	NONAME

+	"_nc_slk_initialize"	@160	NONAME

+	"_nc_start_line"	@821	NONAME

+	"_nc_suppress_warnings"	@828	NONAME

+	"_nc_synchook"	@1035	NONAME

+	"_nc_syntax"	@820	NONAME

+	"_nc_syserr_abort"	@825	NONAME

+	"_nc_tail"	@701	NONAME

+	"_nc_tic_dir"	@161	NONAME

+	"_nc_tic_expand"	@162	NONAME

+	"_nc_tic_written"	@167	NONAME

+	"_nc_timed_wait"	@1036	NONAME

+	"_nc_tinfo_fkeys"	@169	NONAME

+	"_nc_tracing"	@1010	NONAME

+	"_nc_trans_string"	@170	NONAME

+	"_nc_user_definable"	@172	NONAME

+	"_nc_visbuf"	@1012	NONAME

+	"_nc_visbuf2"	@178	NONAME

+	"_nc_vsscanf"	@183	NONAME

+	"_nc_waddch_nosync"	@1028	NONAME

+	"_nc_warning"	@827	NONAME

+	"_nc_wrap_entry"	@705	NONAME

+	"_nc_write_entry"	@708	NONAME

+	"acs_map"	@506	NONAME

+	"addch"	@1	NONAME

+	"addchnstr"	@2	NONAME

+	"addchstr"	@3	NONAME

+	"addnstr"	@4	NONAME

+	"addstr"	@5	NONAME

+	"assume_default_colors"	@184	NONAME

+	"attr_get"	@14	NONAME

+	"attr_off"	@185	NONAME

+	"attr_on"	@186	NONAME

+	"attr_set"	@17	NONAME

+	"attroff"	@11	NONAME

+	"attron"	@12	NONAME

+	"attrset"	@13	NONAME

+	"baudrate"	@18	NONAME

+	"beep"	@19	NONAME

+	"bkgd"	@20	NONAME

+	"bkgdset"	@21	NONAME

+	"boolcodes"	@601	NONAME

+	"boolfnames"	@602	NONAME

+	"boolnames"	@600	NONAME

+	"border"	@24	NONAME

+	"box"	@26	NONAME

+	"can_change_color"	@28	NONAME

+	"cbreak"	@29	NONAME

+	"chgat"	@30	NONAME

+	"clear"	@31	NONAME

+	"clearok"	@32	NONAME

+	"clrtobot"	@33	NONAME

+	"clrtoeol"	@34	NONAME

+	"color_content"	@35	NONAME

+	"color_set"	@187	NONAME

+	"copywin"	@37	NONAME

+	"cur_term"	@515	NONAME

+	"curs_set"	@38	NONAME

+	"curscr"	@501	NONAME

+	"curses_version"	@188	NONAME

+	"def_prog_mode"	@39	NONAME

+	"def_shell_mode"	@40	NONAME

+	"define_key"	@189	NONAME

+	"del_curterm"	@641	NONAME

+	"delay_output"	@41	NONAME

+	"delch"	@42	NONAME

+	"deleteln"	@45	NONAME

+	"delscreen"	@43	NONAME

+	"delwin"	@44	NONAME

+	"derwin"	@46	NONAME

+	"doupdate"	@47	NONAME

+	"dupwin"	@48	NONAME

+	"echo"	@49	NONAME

+	"echochar"	@50	NONAME

+	"endwin"	@52	NONAME

+	"erase"	@193	NONAME

+	"erasechar"	@53	NONAME

+	"filter"	@55	NONAME

+	"flash"	@56	NONAME

+	"flushinp"	@57	NONAME

+	"getbkgd"	@211	NONAME

+	"getch"	@61	NONAME

+	"getmouse"	@356	NONAME

+	"getnstr"	@62	NONAME

+	"getstr"	@64	NONAME

+	"getwin"	@66	NONAME

+	"halfdelay"	@68	NONAME

+	"has_colors"	@69	NONAME

+	"has_ic"	@70	NONAME

+	"has_il"	@71	NONAME

+	"has_key"	@234	NONAME

+	"hline"	@72	NONAME

+	"idcok"	@74	NONAME

+	"idlok"	@75	NONAME

+	"immedok"	@76	NONAME

+	"inch"	@77	NONAME

+	"inchnstr"	@78	NONAME

+	"inchstr"	@79	NONAME

+	"init_color"	@81	NONAME

+	"init_pair"	@82	NONAME

+	"initscr"	@80	NONAME

+	"innstr"	@83	NONAME

+	"insch"	@85	NONAME

+	"insdelln"	@86	NONAME

+	"insertln"	@87	NONAME

+	"insnstr"	@88	NONAME

+	"insstr"	@89	NONAME

+	"instr"	@90	NONAME

+	"intrflush"	@94	NONAME

+	"is_linetouched"	@100	NONAME

+	"is_wintouched"	@101	NONAME

+	"isendwin"	@99	NONAME

+	"keybound"	@238	NONAME

+	"keyname"	@102	NONAME

+	"keyok"	@240	NONAME

+	"keypad"	@104	NONAME

+	"killchar"	@105	NONAME

+	"leaveok"	@107	NONAME

+	"longname"	@108	NONAME

+	"mcprint"	@242	NONAME

+	"meta"	@109	NONAME

+	"mouse_trafo"	@251	NONAME

+	"mouseinterval"	@360	NONAME

+	"mousemask"	@358	NONAME

+	"move"	@110	NONAME

+	"mvaddch"	@111	NONAME

+	"mvaddchnstr"	@112	NONAME

+	"mvaddchstr"	@113	NONAME

+	"mvaddnstr"	@114	NONAME

+	"mvaddstr"	@115	NONAME

+	"mvchgat"	@121	NONAME

+	"mvcur"	@122	NONAME

+	"mvdelch"	@123	NONAME

+	"mvderwin"	@124	NONAME

+	"mvgetch"	@125	NONAME

+	"mvgetnstr"	@126	NONAME

+	"mvgetstr"	@128	NONAME

+	"mvhline"	@131	NONAME

+	"mvinch"	@133	NONAME

+	"mvinchnstr"	@134	NONAME

+	"mvinchstr"	@135	NONAME

+	"mvinnstr"	@136	NONAME

+	"mvinsch"	@138	NONAME

+	"mvinsnstr"	@139	NONAME

+	"mvinsstr"	@140	NONAME

+	"mvinstr"	@141	NONAME

+	"mvprintw"	@149	NONAME

+	"mvscanw"	@150	NONAME

+	"mvvline"	@151	NONAME

+	"mvwaddch"	@153	NONAME

+	"mvwaddchnstr"	@154	NONAME

+	"mvwaddchstr"	@155	NONAME

+	"mvwaddnstr"	@156	NONAME

+	"mvwaddstr"	@157	NONAME

+	"mvwchgat"	@163	NONAME

+	"mvwdelch"	@164	NONAME

+	"mvwgetch"	@165	NONAME

+	"mvwgetnstr"	@166	NONAME

+	"mvwgetstr"	@168	NONAME

+	"mvwhline"	@171	NONAME

+	"mvwin"	@173	NONAME

+	"mvwinch"	@174	NONAME

+	"mvwinchnstr"	@175	NONAME

+	"mvwinchstr"	@176	NONAME

+	"mvwinnstr"	@177	NONAME

+	"mvwinsch"	@179	NONAME

+	"mvwinsnstr"	@180	NONAME

+	"mvwinsstr"	@181	NONAME

+	"mvwinstr"	@182	NONAME

+	"mvwprintw"	@190	NONAME

+	"mvwscanw"	@191	NONAME

+	"mvwvline"	@192	NONAME

+	"napms"	@194	NONAME

+	"newpad"	@195	NONAME

+	"newscr"	@502	NONAME

+	"newterm"	@196	NONAME

+	"newwin"	@197	NONAME

+	"nl"	@198	NONAME

+	"nocbreak"	@199	NONAME

+	"nodelay"	@200	NONAME

+	"noecho"	@201	NONAME

+	"nonl"	@202	NONAME

+	"noqiflush"	@203	NONAME

+	"noraw"	@204	NONAME

+	"notimeout"	@205	NONAME

+	"numcodes"	@604	NONAME

+	"numfnames"	@605	NONAME

+	"numnames"	@603	NONAME

+	"ospeed"	@663	NONAME

+	"overlay"	@206	NONAME

+	"overwrite"	@207	NONAME

+	"pair_content"	@208	NONAME

+	"pechochar"	@210	NONAME

+	"pnoutrefresh"	@212	NONAME

+	"prefresh"	@213	NONAME

+	"printw"	@214	NONAME

+	"putp"	@215	NONAME

+	"putwin"	@216	NONAME

+	"qiflush"	@217	NONAME

+	"raw"	@218	NONAME

+	"redrawwin"	@219	NONAME

+	"refresh"	@220	NONAME

+	"reset_prog_mode"	@222	NONAME

+	"reset_shell_mode"	@223	NONAME

+	"resetty"	@221	NONAME

+	"resizeterm"	@263	NONAME

+	"restartterm"	@643	NONAME

+	"ripoffline"	@224	NONAME

+	"savetty"	@225	NONAME

+	"scanw"	@226	NONAME

+	"scr_dump"	@227	NONAME

+	"scr_init"	@228	NONAME

+	"scr_restore"	@232	NONAME

+	"scr_set"	@233	NONAME

+	"scrl"	@229	NONAME

+	"scroll"	@230	NONAME

+	"scrollok"	@231	NONAME

+	"set_curterm"	@640	NONAME

+	"set_term"	@236	NONAME

+	"setscrreg"	@235	NONAME

+	"setupterm"	@644	NONAME

+	"slk_attr"	@266	NONAME

+	"slk_attr_set"	@270	NONAME

+	"slk_attroff"	@237	NONAME

+	"slk_attron"	@239	NONAME

+	"slk_attrset"	@241	NONAME

+	"slk_clear"	@243	NONAME

+	"slk_color"	@272	NONAME

+	"slk_init"	@244	NONAME

+	"slk_label"	@245	NONAME

+	"slk_noutrefresh"	@246	NONAME

+	"slk_refresh"	@247	NONAME

+	"slk_restore"	@248	NONAME

+	"slk_set"	@249	NONAME

+	"slk_touch"	@250	NONAME

+	"standend"	@253	NONAME

+	"standout"	@252	NONAME

+	"start_color"	@254	NONAME

+	"stdscr"	@500	NONAME

+	"strcodes"	@608	NONAME

+	"strfnames"	@609	NONAME

+	"strnames"	@606	NONAME

+	"subpad"	@255	NONAME

+	"subwin"	@256	NONAME

+	"syncok"	@257	NONAME

+	"termattrs"	@258	NONAME

+	"termname"	@259	NONAME

+	"tgetent"	@645	NONAME

+	"tgetflag"	@646	NONAME

+	"tgetnum"	@647	NONAME

+	"tgetstr"	@648	NONAME

+	"tgoto"	@649	NONAME

+	"tigetflag"	@260	NONAME

+	"tigetnum"	@261	NONAME

+	"tigetstr"	@262	NONAME

+	"timeout"	@274	NONAME

+	"tparm"	@653	NONAME

+	"tputs"	@655	NONAME

+	"ttytype"	@514	NONAME

+	"typeahead"	@264	NONAME

+	"unctrl"	@361	NONAME

+	"ungetch"	@265	NONAME

+	"ungetmouse"	@357	NONAME

+	"untouchwin"	@267	NONAME

+	"use_default_colors"	@276	NONAME

+	"use_env"	@268	NONAME

+	"use_extended_names"	@278	NONAME

+	"vidattr"	@269	NONAME

+	"vidputs"	@271	NONAME

+	"vline"	@273	NONAME

+	"vw_printw"	@284	NONAME

+	"vw_scanw"	@285	NONAME

+	"vwprintw"	@275	NONAME

+	"vwscanw"	@277	NONAME

+	"waddch"	@279	NONAME

+	"waddchnstr"	@280	NONAME

+	"waddchstr"	@281	NONAME

+	"waddnstr"	@282	NONAME

+	"waddstr"	@283	NONAME

+	"wattr_get"	@291	NONAME

+	"wattr_off"	@293	NONAME

+	"wattr_on"	@292	NONAME

+	"wattr_set"	@286	NONAME

+	"wattroff"	@289	NONAME

+	"wattron"	@288	NONAME

+	"wattrset"	@290	NONAME

+	"wbkgd"	@295	NONAME

+	"wbkgdset"	@296	NONAME

+	"wborder"	@299	NONAME

+	"wchgat"	@301	NONAME

+	"wclear"	@302	NONAME

+	"wclrtobot"	@303	NONAME

+	"wclrtoeol"	@304	NONAME

+	"wcolor_set"	@287	NONAME

+	"wcursyncup"	@305	NONAME

+	"wdelch"	@306	NONAME

+	"wdeleteln"	@307	NONAME

+	"wechochar"	@308	NONAME

+	"wenclose"	@359	NONAME

+	"werase"	@310	NONAME

+	"wgetch"	@312	NONAME

+	"wgetnstr"	@313	NONAME

+	"wgetstr"	@315	NONAME

+	"whline"	@318	NONAME

+	"winch"	@320	NONAME

+	"winchnstr"	@321	NONAME

+	"winchstr"	@322	NONAME

+	"winnstr"	@323	NONAME

+	"winsch"	@325	NONAME

+	"winsdelln"	@326	NONAME

+	"winsertln"	@327	NONAME

+	"winsnstr"	@328	NONAME

+	"winsstr"	@329	NONAME

+	"winstr"	@330	NONAME

+	"wmouse_trafo"	@294	NONAME

+	"wmove"	@338	NONAME

+	"wnoutrefresh"	@339	NONAME

+	"wprintw"	@340	NONAME

+	"wredrawln"	@341	NONAME

+	"wrefresh"	@342	NONAME

+	"wresize"	@343	NONAME

+	"wscanw"	@344	NONAME

+	"wscrl"	@345	NONAME

+	"wsetscrreg"	@346	NONAME

+	"wstandend"	@348	NONAME

+	"wstandout"	@347	NONAME

+	"wsyncdown"	@349	NONAME

+	"wsyncup"	@350	NONAME

+	"wtimeout"	@351	NONAME

+	"wtouchln"	@352	NONAME

+	"wvline"	@354	NONAME

diff --git a/misc/ncurses.ref b/misc/ncurses.ref
new file mode 100644
index 0000000..cf4de7d
--- /dev/null
+++ b/misc/ncurses.ref
@@ -0,0 +1,572 @@
+LIBRARY ncurses2 INITINSTANCE

+DESCRIPTION 'NCurses 1.9.9e-1 for OS/2 - base library'

+EXPORTS

+;************

+;* curses.h *

+;************

+

+	"stdscr"			@500	NONAME ; variable

+	"curscr"			@501	NONAME ; variable

+	"newscr"			@502	NONAME ; variable

+	"COLORS"			@503	NONAME ; variable

+	"COLOR_PAIRS"			@504	NONAME ; variable

+	"color_pairs"			@505	NONAME ; variable

+	"acs_map"	 		@506	NONAME ; variable

+	"LINES"				@510	NONAME ; variable

+	"COLS"				@511	NONAME ; variable

+	"TABSIZE"			@512	NONAME ; variable

+	"ESCDELAY"			@513	NONAME ; variable

+	"ttytype"			@514	NONAME ; variable

+	"cur_term"			@515	NONAME ; variable

+

+	"addch"   			@1	NONAME ; generated

+	"addchnstr"       		@2	NONAME ; generated

+	"addchstr"			@3	NONAME ; generated

+	"addnstr" 			@4	NONAME ; generated

+	"addstr"  			@5	NONAME ; generated

+;	"addnwstr"			@6	NONAME ; missing

+;	"addwstr" 			@7	NONAME ; missing

+;	"add_wch" 			@8	NONAME ; missing

+;	"add_wchnstr"     		@9	NONAME ; missing

+;	"add_wchstr"      		@10	NONAME ; missing

+	"attroff" 			@11	NONAME ; generated

+	"attron"  			@12	NONAME ; generated

+	"attrset" 			@13	NONAME ; generated

+	"attr_get"			@14	NONAME ; generated

+;	"attr_off"			@15	NONAME ; implemented << NO!!

+;	"attr_on" 			@16	NONAME ; implemented << NO!!

+	"attr_set"			@17	NONAME ; generated

+	"baudrate"			@18	NONAME ; implemented

+	"beep"    			@19	NONAME ; implemented

+	"bkgd"    			@20	NONAME ; generated

+	"bkgdset" 			@21	NONAME ; generated

+;	"bkgrndset"       		@22	NONAME ; missing

+;	"bkgrnd"  			@23	NONAME ; missing

+	"border"  			@24	NONAME ; generated

+;	"border_set"      		@25	NONAME ; missing

+	"box"     			@26	NONAME ; generated

+;	"box_set" 			@27	NONAME ; missing

+	"can_change_color"		@28	NONAME ; implemented

+	"cbreak"  			@29	NONAME ; implemented

+	"chgat"   			@30	NONAME ; generated

+	"clear"   			@31	NONAME ; generated

+	"clearok" 			@32	NONAME ; implemented

+	"clrtobot"			@33	NONAME ; generated

+	"clrtoeol"			@34	NONAME ; generated

+	"color_content"   		@35	NONAME ; implemented

+	"COLOR_PAIR"      		@36	NONAME ; generated

+	"copywin" 			@37	NONAME ; implemented

+	"curs_set"			@38	NONAME ; implemented

+	"def_prog_mode"   		@39	NONAME ; implemented

+	"def_shell_mode"  		@40	NONAME ; implemented

+	"delay_output"    		@41	NONAME ; implemented

+	"delch"   			@42	NONAME ; generated

+	"delscreen"       		@43	NONAME ; implemented

+	"delwin"  			@44	NONAME ; implemented

+	"deleteln"			@45	NONAME ; generated

+	"derwin"  			@46	NONAME ; implemented

+	"doupdate"			@47	NONAME ; implemented

+	"dupwin"  			@48	NONAME ; implemented

+	"echo"    			@49	NONAME ; implemented

+	"echochar"			@50	NONAME ; generated

+;	"echo_wchar"      		@51	NONAME ; missing

+	"endwin"  			@52	NONAME ; implemented

+	"erasechar"       		@53	NONAME ; implemented

+;	"erase_wchar"     		@54	NONAME ; missing

+	"filter"  			@55	NONAME ; implemented

+	"flash"   			@56	NONAME ; implemented

+	"flushinp"			@57	NONAME ; implemented

+;	"getbkgd" 			@58	NONAME ; missing

+;	"getbkgrnd"       		@59	NONAME ; missing

+;	"getcchar"			@60	NONAME ; missing

+	"getch"   			@61	NONAME ; generated

+	"getnstr" 			@62	NONAME ; generated

+;	"getn_wstr"       		@63	NONAME ; missing

+	"getstr"  			@64	NONAME ; generated

+;	"get_wch" 			@65	NONAME ; missing

+	"getwin"  			@66	NONAME ; not in XPG4

+;	"get_wstr"			@67	NONAME ; missing

+	"halfdelay"       		@68	NONAME ; implemented

+	"has_colors"      		@69	NONAME ; implemented

+	"has_ic"  			@70	NONAME ; implemented

+	"has_il"  			@71	NONAME ; implemented

+	"hline"   			@72	NONAME ; generated

+;	"hline_set"       		@73	NONAME ; missing

+	"idcok"   			@74	NONAME ; implemented

+	"idlok"   			@75	NONAME ; implemented

+	"immedok" 			@76	NONAME ; implemented

+	"inch"    			@77	NONAME ; generated

+	"inchnstr"			@78	NONAME ; generated

+	"inchstr" 			@79	NONAME ; generated

+	"initscr" 			@80	NONAME ; implemented

+	"init_color"      		@81	NONAME ; implemented

+	"init_pair"       		@82	NONAME ; implemented

+	"innstr"  			@83	NONAME ; generated

+;	"innwstr" 			@84	NONAME ; missing

+	"insch"   			@85	NONAME ; generated

+	"insdelln"			@86	NONAME ; generated

+	"insertln"			@87	NONAME ; generated

+	"insnstr" 			@88	NONAME ; generated

+	"insstr"  			@89	NONAME ; generated

+	"instr"   			@90	NONAME ; generated

+;	"ins_nwstr"       		@91	NONAME ; missing

+;	"ins_wch" 			@92	NONAME ; missing

+;	"ins_wstr"			@93	NONAME ; missing

+	"intrflush"       		@94	NONAME ; implemented

+;	"inwstr"  			@95	NONAME ; missing

+;	"in_wch"  			@96	NONAME ; missing

+;	"in_wchstr"       		@97	NONAME ; missing

+;	"in_wchntr"       		@98	NONAME ; missing

+	"isendwin"			@99	NONAME ; implemented

+	"is_linetouched"  		@100	NONAME ; implemented

+	"is_wintouched"   		@101	NONAME ; implemented

+	"keyname" 			@102	NONAME ; implemented

+;	"key_name"			@103	NONAME ; missing

+	"keypad"  			@104	NONAME ; implemented

+	"killchar"			@105	NONAME ; implemented

+;	"killwchar"       		@106	NONAME ; missing

+	"leaveok" 			@107	NONAME ; implemented

+	"longname"			@108	NONAME ; implemented

+	"meta"    			@109	NONAME ; implemented

+	"move"    			@110	NONAME ; generated

+	"mvaddch" 			@111	NONAME ; generated

+	"mvaddchnstr"     		@112	NONAME ; generated

+	"mvaddchstr"      		@113	NONAME ; generated

+	"mvaddnstr"       		@114	NONAME ; generated

+	"mvaddstr"			@115	NONAME ; generated

+;	"mvaddnwstr"      		@116	NONAME ; missing

+;	"mvaddwstr"       		@117	NONAME ; missing

+;	"mvadd_wch"       		@118	NONAME ; missing

+;	"mvadd_wchnstr"   		@119	NONAME ; missing

+;	"mvadd_wchstr"    		@120	NONAME ; missing

+	"mvchgat" 			@121	NONAME ; generated

+	"mvcur"   			@122	NONAME ; implemented

+	"mvdelch" 			@123	NONAME ; generated

+	"mvderwin"			@124	NONAME ; implemented

+	"mvgetch" 			@125	NONAME ; generated

+	"mvgetnstr"       		@126	NONAME ; generated

+;	"mvgetn_wstr"     		@127	NONAME ; missing

+	"mvgetstr"			@128	NONAME ; generated

+;	"mvget_wch"       		@129	NONAME ; missing

+;	"mvget_wstr"      		@130	NONAME ; missing

+	"mvhline" 			@131	NONAME ; generated

+;	"mvhline_set"     		@132	NONAME ; missing

+	"mvinch"  			@133	NONAME ; generated

+	"mvinchnstr"      		@134	NONAME ; generated

+	"mvinchstr"       		@135	NONAME ; generated

+	"mvinnstr"			@136	NONAME ; generated

+;	"mvinnwstr"       		@137	NONAME ; missing

+	"mvinsch" 			@138	NONAME ; generated

+	"mvinsnstr"       		@139	NONAME ; generated

+	"mvinsstr"			@140	NONAME ; generated

+	"mvinstr" 			@141	NONAME ; generated

+;	"mvins_nwstr"     		@142	NONAME ; missing

+;	"mvins_wch"       		@143	NONAME ; missing

+;	"mvins_wstr"      		@144	NONAME ; missing

+;	"mvinwstr"			@145	NONAME ; missing

+;	"mvin_wch"			@146	NONAME ; missing

+;	"mvin_wchstr"     		@147	NONAME ; missing

+;	"mvin_wchntr"     		@148	NONAME ; missing

+	"mvprintw"			@149	NONAME ; implemented

+	"mvscanw" 			@150	NONAME ; implemented

+	"mvvline" 			@151	NONAME ; generated

+;	"mvvline_set"     		@152	NONAME ; missing

+	"mvwaddch"			@153	NONAME ; generated

+	"mvwaddchnstr"    		@154	NONAME ; generated

+	"mvwaddchstr"     		@155	NONAME ; generated

+	"mvwaddnstr"      		@156	NONAME ; generated

+	"mvwaddstr"       		@157	NONAME ; generated

+;	"mvwaddnwstr"     		@158	NONAME ; missing

+;	"mvwaddwstr"      		@159	NONAME ; missing

+;	"mvwadd_wch"      		@160	NONAME ; missing

+;	"mvwadd_wchnstr"  		@161	NONAME ; missing

+;	"mvwadd_wchstr"   		@162	NONAME ; missing

+	"mvwchgat"			@163	NONAME ; generated

+	"mvwdelch"			@164	NONAME ; generated

+	"mvwgetch"			@165	NONAME ; generated

+	"mvwgetnstr"      		@166	NONAME ; generated

+;	"mvwgetn_wstr"    		@167	NONAME ; missing

+	"mvwgetstr"       		@168	NONAME ; generated

+;	"mvwget_wch"      		@169	NONAME ; missing

+;	"mvwget_wstr"     		@170	NONAME ; missing

+	"mvwhline"			@171	NONAME ; generated

+;	"mvwhline_set"    		@172	NONAME ; missing

+	"mvwin"   			@173	NONAME ; implemented

+	"mvwinch" 			@174	NONAME ; generated

+	"mvwinchnstr"     		@175	NONAME ; generated

+	"mvwinchstr"      		@176	NONAME ; generated

+	"mvwinnstr"       		@177	NONAME ; generated

+;	"mvwinnwstr"      		@178	NONAME ; missing

+	"mvwinsch"			@179	NONAME ; generated

+	"mvwinsnstr"      		@180	NONAME ; generated

+	"mvwinsstr"       		@181	NONAME ; generated

+	"mvwinstr"			@182	NONAME ; generated

+;	"mvwins_nwstr"    		@183	NONAME ; missing

+;	"mvwins_wch"      		@184	NONAME ; missing

+;	"mvwins_wstr"     		@185	NONAME ; missing

+;	"mvwinwstr"       		@186	NONAME ; missing

+;	"mvwin_wch"       		@187	NONAME ; missing

+;	"mvwin_wchnstr"   		@188	NONAME ; missing

+;	"mvwin_wchstr"    		@189	NONAME ; missing

+	"mvwprintw"       		@190	NONAME ; implemented

+	"mvwscanw"			@191	NONAME ; implemented

+	"mvwvline"			@192	NONAME ; generated

+;	"mvwvline_set"    		@193	NONAME ; missing

+	"napms"   			@194	NONAME ; implemented

+	"newpad"  			@195	NONAME ; implemented

+	"newterm" 			@196	NONAME ; implemented

+	"newwin"  			@197	NONAME ; implemented

+	"nl"      			@198	NONAME ; implemented

+	"nocbreak"			@199	NONAME ; implemented

+	"nodelay" 			@200	NONAME ; implemented

+	"noecho"  			@201	NONAME ; implemented

+	"nonl"    			@202	NONAME ; implemented

+	"noqiflush"       		@203	NONAME ; implemented

+	"noraw"   			@204	NONAME ; implemented

+	"notimeout"       		@205	NONAME ; implemented

+	"overlay" 			@206	NONAME ; implemented

+	"overwrite"       		@207	NONAME ; implemented

+	"pair_content"    		@208	NONAME ; implemented

+	"PAIR_NUMBER"     		@209	NONAME ; generated

+	"pechochar"       		@210	NONAME ; implemented

+;	"pecho_wchar"     		@211	NONAME ; missing

+	"pnoutrefresh"    		@212	NONAME ; implemented

+	"prefresh"			@213	NONAME ; implemented

+	"printw"  			@214	NONAME ; implemented

+	"putp"    			@215	NONAME ; implemented

+	"putwin"  			@216	NONAME ; implemented

+	"qiflush" 			@217	NONAME ; implemented

+	"raw"     			@218	NONAME ; implemented

+	"redrawwin"       		@219	NONAME ; generated

+	"refresh" 			@220	NONAME ; generated

+	"resetty" 			@221	NONAME ; implemented

+	"reset_prog_mode" 		@222	NONAME ; implemented

+	"reset_shell_mode"		@223	NONAME ; implemented

+	"ripoffline"      		@224	NONAME ; implemented

+	"savetty" 			@225	NONAME ; implemented

+	"scanw"   			@226	NONAME ; implemented

+	"scr_dump"			@227	NONAME ; implemented

+	"scr_init"			@228	NONAME ; implemented

+	"scrl"    			@229	NONAME ; generated

+	"scroll"  			@230	NONAME ; generated

+	"scrollok"			@231	NONAME ; implemented

+	"scr_restore"     		@232	NONAME ; implemented

+	"scr_set" 			@233	NONAME ; implemented

+;	"setcchar"			@234	NONAME ; missing

+	"setscrreg"       		@235	NONAME ; generated

+	"set_term"			@236	NONAME ; implemented

+	"slk_attroff"     		@237	NONAME ; implemented

+;	"slk_attr_off"    		@238	NONAME ; missing

+	"slk_attron"      		@239	NONAME ; implemented

+;	"slk_attr_on"     		@240	NONAME ; missing

+	"slk_attrset"     		@241	NONAME ; implemented

+;	"slk_attr_set"    		@242	NONAME ; missing

+	"slk_clear"       		@243	NONAME ; implemented

+	"slk_init"			@244	NONAME ; implemented

+	"slk_label"       		@245	NONAME ; implemented

+	"slk_noutrefresh" 		@246	NONAME ; implemented

+	"slk_refresh"     		@247	NONAME ; implemented

+	"slk_restore"     		@248	NONAME ; implemented

+	"slk_set" 			@249	NONAME ; implemented

+	"slk_touch"       		@250	NONAME ; implemented

+;	"slk_wset"			@251	NONAME ; missing

+	"standout"			@252	NONAME ; generated

+	"standend"			@253	NONAME ; generated

+	"start_color"     		@254	NONAME ; implemented

+	"subpad"  			@255	NONAME ; implemented

+	"subwin"  			@256	NONAME ; implemented

+	"syncok"  			@257	NONAME ; implemented

+	"termattrs"       		@258	NONAME ; implemented

+	"termname"			@259	NONAME ; implemented

+	"tigetflag"       		@260	NONAME ; implemented

+	"tigetnum"			@261	NONAME ; implemented

+	"tigetstr"			@262	NONAME ; implemented

+;	"timeout" 			@263	NONAME ; implemented << NO!!

+	"typeahead"       		@264	NONAME ; implemented

+	"ungetch" 			@265	NONAME ; implemented

+;	"unget_wch"       		@266	NONAME ; missing

+	"untouchwin"      		@267	NONAME ; generated

+	"use_env" 			@268	NONAME ; implemented

+	"vidattr" 			@269	NONAME ; implemented

+;	"vid_attr"			@270	NONAME ; missing

+	"vidputs" 			@271	NONAME ; implemented

+;	"vid_puts"			@272	NONAME ; missing

+	"vline"   			@273	NONAME ; generated

+;	"vline_set"       		@274	NONAME ; missing

+	"vwprintw"			@275	NONAME ; implemented

+;	"vw_printw"       		@276	NONAME ; implemented << NO!!

+	"vwscanw" 			@277	NONAME ; implemented

+;	"vw_scanw"			@278	NONAME ; implemented << NO!!

+	"waddch"  			@279	NONAME ; implemented

+	"waddchnstr"      		@280	NONAME ; implemented

+	"waddchstr"       		@281	NONAME ; generated

+	"waddnstr"			@282	NONAME ; implemented

+	"waddstr" 			@283	NONAME ; generated

+;	"waddwstr"			@284	NONAME ; missing

+;	"wadd_wch"			@285	NONAME ; missing

+;	"wadd_wchnstr"    		@286	NONAME ; missing

+;	"wadd_wchstr"     		@287	NONAME ; missing

+	"wattron" 			@288	NONAME ; generated

+	"wattroff"			@289	NONAME ; generated

+	"wattrset"			@290	NONAME ; generated

+	"wattr_get"       		@291	NONAME ; generated

+	"wattr_on"			@292	NONAME ; implemented

+	"wattr_off"       		@293	NONAME ; implemented

+;	"wattr_set"       		@294	NONAME ; implemented << NO!!

+	"wbkgd"   			@295	NONAME ; implemented

+	"wbkgdset"			@296	NONAME ; generated

+;	"wbkgrndset"      		@297	NONAME ; missing

+;	"wbkgrnd" 			@298	NONAME ; missing

+	"wborder" 			@299	NONAME ; implemented

+;	"wborder_set"     		@300	NONAME ; missing

+	"wchgat"  			@301	NONAME ; implemented

+	"wclear"  			@302	NONAME ; implemented

+	"wclrtobot"       		@303	NONAME ; implemented

+	"wclrtoeol"       		@304	NONAME ; implemented

+	"wcursyncup"      		@305	NONAME ; implemented

+	"wdelch"  			@306	NONAME ; implemented

+	"wdeleteln"       		@307	NONAME ; generated

+	"wechochar"       		@308	NONAME ; implemented

+;	"wecho_wchar"     		@309	NONAME ; missing

+	"werase"  			@310	NONAME ; implemented

+;	"wgetbkgrnd"      		@311	NONAME ; missing

+	"wgetch"  			@312	NONAME ; implemented

+	"wgetnstr"			@313	NONAME ; implemented

+;	"wgetn_wstr"      		@314	NONAME ; missing

+	"wgetstr" 			@315	NONAME ; generated

+;	"wget_wch"			@316	NONAME ; missing

+;	"wget_wstr"       		@317	NONAME ; missing

+	"whline"  			@318	NONAME ; implemented

+;	"whline_set"      		@319	NONAME ; missing

+	"winch"   			@320	NONAME ; generated

+	"winchnstr"       		@321	NONAME ; implemented

+	"winchstr"			@322	NONAME ; generated

+	"winnstr" 			@323	NONAME ; implemented

+;	"winnwstr"			@324	NONAME ; missing

+	"winsch"  			@325	NONAME ; implemented

+	"winsdelln"       		@326	NONAME ; implemented

+	"winsertln"       		@327	NONAME ; generated

+	"winsnstr"			@328	NONAME ; implemented

+	"winsstr" 			@329	NONAME ; generated

+	"winstr"  			@330	NONAME ; generated

+;	"wins_nwstr"      		@331	NONAME ; missing

+;	"wins_wch"			@332	NONAME ; missing

+;	"wins_wstr"       		@333	NONAME ; missing

+;	"winwstr" 			@334	NONAME ; missing

+;	"win_wch" 			@335	NONAME ; missing

+;	"win_wchnstr"     		@336	NONAME ; missing

+;	"win_wchstr"      		@337	NONAME ; missing

+	"wmove"   			@338	NONAME ; implemented

+	"wnoutrefresh"    		@339	NONAME ; implemented

+	"wprintw" 			@340	NONAME ; implemented

+	"wredrawln"       		@341	NONAME ; implemented

+	"wrefresh"			@342	NONAME ; implemented

+	"wresize" 			@343	NONAME ; implemented

+	"wscanw"  			@344	NONAME ; implemented

+	"wscrl"   			@345	NONAME ; implemented

+	"wsetscrreg"      		@346	NONAME ; implemented

+	"wstandout"       		@347	NONAME ; generated

+	"wstandend"       		@348	NONAME ; generated

+	"wsyncdown"       		@349	NONAME ; implemented

+	"wsyncup" 			@350	NONAME ; implemented

+	"wtimeout"			@351	NONAME ; implemented

+	"wtouchln"			@352	NONAME ; implemented

+;	"wunctrl" 			@353	NONAME ; missing

+	"wvline"  			@354	NONAME ; implemented

+;	"wvline_set"      		@355	NONAME ; missing

+

+	"getmouse"			@356	NONAME

+	"ungetmouse"			@357	NONAME

+	"mousemask"			@358	NONAME

+	"wenclose"			@359	NONAME

+	"mouseinterval"			@360	NONAME

+

+; from unctrl.h

+	"unctrl"			@361	NONAME

+

+; publics for tracing

+	"_tracef"			@400	NONAME

+	"_tracedump"			@401	NONAME

+	"_traceattr"			@402	NONAME

+	"_tracechar"			@403	NONAME

+	"_tracemouse"			@404	NONAME

+	"trace"				@405	NONAME

+

+;**********

+;* term.h *

+;**********

+	"boolnames"			@600	NONAME ; variable

+	"boolcodes"			@601	NONAME ; variable

+	"boolfnames"			@602	NONAME ; variable

+	"numnames"			@603	NONAME ; variable

+	"numcodes"			@604	NONAME ; variable

+	"numfnames"			@605	NONAME ; variable

+	"strnames"			@606	NONAME ; variable

+	"strcodes"			@608	NONAME ; variable

+	"strfnames"			@609	NONAME ; variable

+

+; internals

+	"_nc_read_entry"		@620	NONAME

+	"_nc_read_file_entry"		@621	NONAME

+	"_nc_first_name"		@622	NONAME

+	"_nc_name_match"		@623	NONAME

+	"_nc_read_termcap_entry"	@624	NONAME

+	"_nc_fallback"			@625	NONAME

+

+; entry points

+	"set_curterm"			@640	NONAME

+	"del_curterm"			@641	NONAME

+

+; entry points

+;	"putp"				@642	NONAME	; already defined

+	"restartterm"			@643	NONAME

+	"setupterm"			@644	NONAME

+	"tgetent"			@645	NONAME

+	"tgetflag"			@646	NONAME

+	"tgetnum"			@647	NONAME

+	"tgetstr"			@648	NONAME

+	"tgoto"				@649	NONAME

+;	"tigetflag"			@650	NONAME	; already defined

+;	"tigetnum"			@651	NONAME	; already defined

+;	"tigetstr"			@652	NONAME	; already defined

+	"tparm"				@653	NONAME

+	"tparam"			@654	NONAME

+	"tputs"				@655	NONAME

+

+;*************

+;* termcap.h *

+;*************

+; the functions are already defined in term.h

+	"PC"				@660	NONAME

+	"UP"				@661	NONAME

+	"BC"				@662	NONAME

+	"ospeed"			@663	NONAME

+

+;****************

+;* term_entry.h *

+;****************

+	"_nc_head"			@700	NONAME

+	"_nc_tail"			@701	NONAME

+

+; alloc_entry.c: elementary allocation code

+	"_nc_init_entry"		@702	NONAME

+	"_nc_save_str"			@703	NONAME

+	"_nc_merge_entry"		@704	NONAME

+	"_nc_wrap_entry"		@705	NONAME

+

+; parse_entry.c: entry-parsing code

+	"_nc_parse_entry"		@706	NONAME

+	"_nc_capcmp"			@707	NONAME

+

+; write_entry.c: writing an entry to the file system

+	"_nc_write_entry"		@708	NONAME

+

+; comp_parse.c: entry list handling

+	"_nc_read_entry_source"		@709	NONAME

+	"_nc_entry_match"		@710	NONAME

+	"_nc_resolve_uses"		@711	NONAME

+	"_nc_free_entries"		@712	NONAME

+

+;*********

+;* tic.h *

+;*********

+;	"_nc_tracing"			@800	NONAME	; defined below

+;	"_nc_tracef"			@801	NONAME	; missing

+;	"_nc_visbuf"			@802	NONAME	; defined below

+

+	"_nc_curr_token"		@803	NONAME

+

+	"_nc_info_hash_table"		@804	NONAME

+	"_nc_cap_hash_table"		@805	NONAME

+

+	"_nc_capalias_table"		@806	NONAME

+	"_nc_infoalias_table"		@807	NONAME

+	"_nc_get_table"			@808	NONAME

+

+; comp_hash.c: name lookup

+	"_nc_find_entry"		@809	NONAME

+	"_nc_find_type_entry"		@810	NONAME

+

+; comp_scan.c: lexical analysis

+	"_nc_get_token"			@811	NONAME

+	"_nc_push_token"		@812	NONAME

+	"_nc_reset_input"		@813	NONAME

+	"_nc_panic_mode"		@814	NONAME

+	"_nc_curr_line"			@815	NONAME

+	"_nc_curr_col"			@816	NONAME

+	"_nc_curr_file_pos"		@817	NONAME

+	"_nc_comment_start"		@818	NONAME

+	"_nc_comment_end"		@819	NONAME

+	"_nc_syntax"			@820	NONAME

+	"_nc_start_line"		@821	NONAME

+

+; comp_error.c: warning & abort messages

+	"_nc_set_source"		@822	NONAME

+	"_nc_get_type"			@823	NONAME

+	"_nc_set_type"			@824	NONAME

+	"_nc_syserr_abort"		@825	NONAME

+	"_nc_err_abort"			@826	NONAME

+	"_nc_warning"			@827	NONAME

+	"_nc_suppress_warnings"		@828	NONAME

+

+; captoinfo.c: capability conversion

+	"_nc_captoinfo"			@829	NONAME

+	"_nc_infotocap"			@830	NONAME

+

+; comp_main.c: compiler main

+;	"_nc_progname"			@831	NONAME	; no need to export it

+

+

+; *****************

+; NCurses internals -- just for progs/*.exe and the library itself.

+; *****************

+

+; For broken linkers

+;	"_nc_screen"			@1000	NONAME

+;	"_nc_alloc_screen"		@1001	NONAME

+;	"_nc_set_screen"		@1002	NONAME

+

+; For not so broken linkers

+	"SP"				@1003	NONAME

+

+; Who knows what this is for

+	"_slk_init"			@1004	NONAME

+	"slk_initialize"		@1005	NONAME

+

+; Tracing -- all functions used internally

+	"_nc_tracing"			@1010	NONAME

+	"_nc_tputs_trace"		@1011	NONAME

+	"_nc_visbuf"			@1012	NONAME

+

+; lib_acs.c

+	"init_acs"			@1013	NONAME

+

+; lib_mvcur.c

+	"_nc_mvcur_init"		@1014	NONAME

+	"_nc_mvcur_wrap"		@1015	NONAME

+	"_nc_mvcur_scrolln"		@1016	NONAME

+

+; lib_mouse.c

+	"_nc_mouse_init"		@1017	NONAME

+	"_nc_mouse_event"		@1018	NONAME

+	"_nc_mouse_inline"        	@1019	NONAME

+	"_nc_mouse_parse"		@1020	NONAME

+	"_nc_mouse_wrap"		@1021	NONAME

+	"_nc_mouse_resume"	        @1022	NONAME

+	"_nc_max_click_interval"	@1023	NONAME

+

+; elsewhere ...

+	"_nc_keypad" 			@1024	NONAME

+	"_nc_makenew"			@1025	NONAME

+	"_nc_outch"			@1026	NONAME

+	"_nc_render"			@1027	NONAME

+	"_nc_waddch_nosync"		@1028	NONAME

+	"_nc_scroll_optimize"		@1029	NONAME

+	"_nc_scroll_window"		@1030	NONAME

+	"_nc_setupscreen"		@1031	NONAME

+	"_nc_backspace"			@1032	NONAME

+	"_nc_outstr"			@1033	NONAME

+	"_nc_signal_handler"		@1034	NONAME

+	"_nc_synchook"			@1035	NONAME

+	"_nc_timed_wait"		@1036	NONAME

+	"_nc_do_color"			@1037	NONAME

diff --git a/misc/ncurses.supp b/misc/ncurses.supp
new file mode 100644
index 0000000..29511ea
--- /dev/null
+++ b/misc/ncurses.supp
@@ -0,0 +1,206 @@
+# $Id: ncurses.supp,v 1.8 2020/02/02 23:34:34 tom Exp $
+##############################################################################
+# Copyright 2020 Thomas E. Dickey                                            #
+# Copyright 2008 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.                                                             #
+##############################################################################
+#
+# This is a warning-suppression file for valgrind and ncurses.
+#
+# ncurses can also be configured using the --disable-leaks option, which
+# allows an application to call _nc_freeall() or _nc_free_and_exit(), to
+# free all of ncurses' "permanent" memory.
+#
+# Some of these leaks can be freed if the application does its own cleanup,
+# for example:
+#	delscreen(SP);
+#	del_curterm(cur_term);
+# However, few applications do this.
+
+{
+   ncurses_leak__nc_add_to_try
+   Memcheck:Leak
+   fun:*alloc
+   fun:_nc_add_to_try
+}
+
+{
+   ncurses_leak__nc_home_terminfo
+   Memcheck:Leak
+   fun:malloc
+   fun:_nc_home_terminfo
+}
+
+{
+   ncurses_leak__nc_init_wacs
+   Memcheck:Leak
+   fun:calloc
+   fun:_nc_init_wacs
+}
+
+{
+   ncurses_leak__nc_keyname
+   Memcheck:Leak
+   fun:calloc
+   fun:_nc_keyname
+}
+
+{
+   ncurses_leak__nc_keyname_2
+   Memcheck:Leak
+   fun:malloc
+   fun:strdup
+   fun:_nc_keyname
+}
+
+{
+   ncurses_leak__nc_printf_string
+   Memcheck:Leak
+   fun:malloc
+   fun:_nc_doalloc
+   fun:_nc_printf_string
+}
+
+{
+   ncurses_leak__nc_read_termtype
+   Memcheck:Leak
+   fun:*alloc
+   fun:_nc_read_termtype
+   fun:_nc_read_file_entry
+}
+
+{
+   ncurses_leak__nc_read_termtype_2
+   Memcheck:Leak
+   fun:*alloc
+   fun:_nc_doalloc
+   fun:_nc_read_termtype
+   fun:_nc_read_file_entry
+}
+
+{
+   ncurses_leak__nc_scroll_optimize
+   Memcheck:Leak
+   fun:*alloc
+   fun:_nc_hash_map
+   fun:_nc_scroll_optimize
+}
+
+{
+   ncurses_leak__nc_scroll_optimize_2
+   Memcheck:Leak
+   fun:*alloc
+   fun:_nc_doalloc
+   fun:_nc_scroll_optimize
+}
+
+{
+   ncurses_leak__nc_setupscreen
+   Memcheck:Leak
+   fun:calloc
+   fun:_nc_setupscreen
+   fun:newterm
+}
+
+{
+   ncurses_leak__nc_setupscreen_2
+   Memcheck:Leak
+   fun:calloc
+   fun:newwin
+   fun:_nc_setupscreen
+}
+
+{
+   ncurses_leak__nc_setupterm_1
+   Memcheck:Leak
+   fun:malloc
+   fun:strdup
+   fun:_nc_setupterm
+}
+
+{
+   ncurses_leak__nc_setupterm
+   Memcheck:Leak
+   fun:calloc
+   fun:_nc_setupterm
+}
+
+{
+   ncurses_leak__nc_setupscreen_3
+   Memcheck:Leak
+   fun:calloc
+   fun:_nc_makenew
+   fun:newwin
+   fun:_nc_setupscreen
+}
+
+{
+   ncurses_leak__nc_set_buffer
+   Memcheck:Leak
+   fun:malloc
+   fun:_nc_set_buffer
+}
+
+{
+   ncurses_leak__nc_tparm_analyze
+   Memcheck:Leak
+   fun:*alloc
+   fun:_nc_doalloc
+   fun:_nc_tparm_analyze
+}
+
+{
+   ncurses_leak__nc_trace_alloc
+   Memcheck:Leak
+   fun:*alloc
+   fun:_nc_doalloc
+   fun:_nc_trace_alloc
+}
+
+{
+   ncurses_leak_start_color
+   Memcheck:Leak
+   fun:calloc
+   fun:start_color
+}
+
+{
+   ncurses_leak_tparm
+   Memcheck:Leak
+   fun:realloc
+   fun:_nc_doalloc
+   fun:tparm
+}
+
+{
+   ncurses_leak_tparam_internal
+   Memcheck:Leak
+   fun:realloc
+   fun:_nc_doalloc
+   fun:get_space
+   fun:save_number
+   fun:tparam_internal
+}
diff --git a/misc/panel.def b/misc/panel.def
new file mode 100644
index 0000000..30ce1d6
--- /dev/null
+++ b/misc/panel.def
@@ -0,0 +1,20 @@
+LIBRARY panel5 INITINSTANCE TERMINSTANCE

+DESCRIPTION "NCurses-5-1-20000704, module panel"

+CODE LOADONCALL

+DATA LOADONCALL NONSHARED MULTIPLE

+EXPORTS

+	"bottom_panel"	@7	NONAME

+	"del_panel"	@5	NONAME

+	"hide_panel"	@3	NONAME

+	"move_panel"	@13	NONAME

+	"new_panel"	@8	NONAME

+	"panel_above"	@9	NONAME

+	"panel_below"	@10	NONAME

+	"panel_hidden"	@15	NONAME

+	"panel_userptr"	@12	NONAME

+	"panel_window"	@1	NONAME

+	"replace_panel"	@14	NONAME

+	"set_panel_userptr"	@11	NONAME

+	"show_panel"	@4	NONAME

+	"top_panel"	@6	NONAME

+	"update_panels"	@2	NONAME

diff --git a/misc/panel.ref b/misc/panel.ref
new file mode 100644
index 0000000..e84045a
--- /dev/null
+++ b/misc/panel.ref
@@ -0,0 +1,18 @@
+LIBRARY panel2 INITINSTANCE

+DESCRIPTION 'NCurses 1.9.9e-1 for OS/2 - panel library'

+EXPORTS

+	"panel_window"		@1

+	"update_panels"		@2

+	"hide_panel"		@3

+	"show_panel"		@4

+	"del_panel"		@5

+	"top_panel"		@6

+	"bottom_panel"		@7

+	"new_panel"		@8

+	"panel_above"		@9

+	"panel_below"		@10

+	"set_panel_userptr"	@11

+	"panel_userptr"		@12

+	"move_panel"		@13

+	"replace_panel"		@14

+	"panel_hidden"		@15

diff --git a/misc/run_tic.in b/misc/run_tic.in
new file mode 100644
index 0000000..bd11c4c
--- /dev/null
+++ b/misc/run_tic.in
@@ -0,0 +1,210 @@
+#!@SHELL@
+# $Id: run_tic.in,v 1.40 2022/07/16 19:37:03 tom Exp $
+##############################################################################
+# Copyright 2019-2020,2022 Thomas E. Dickey                                  #
+# Copyright 2000-2012,2017 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey 1996-on
+#
+# This script is used to install terminfo.src using tic.  We use a script
+# because the path checking is too awkward to do in a makefile.
+#
+# Assumes:
+#	The leaf directory names (lib, tabset, terminfo)
+#
+echo "** Building terminfo database, please wait..."
+#
+# The script is designed to be run from the misc/Makefile as
+#	make install.data
+
+: "${suffix:=@EXEEXT@}"
+: "${DESTDIR:=@DESTDIR@}"
+: "${prefix:=@prefix@}"
+: "${exec_prefix:=@exec_prefix@}"
+: "${bindir:=@bindir@}"
+: "${top_srcdir:=@top_srcdir@}"
+: "${srcdir:=@srcdir@}"
+: "${datarootdir:=@datarootdir@}"
+: "${datadir:=@datadir@}"
+: "${TIC_PATH:=@TIC@}"
+: "${ticdir:=@TERMINFO@}"
+: "${source:=@TERMINFO_SRC@}"
+: "${cross_compiling:=no}"
+: "${ext_funcs:=@NCURSES_EXT_FUNCS@}"
+
+test -z "${DESTDIR}" && DESTDIR=
+
+# Allow tic to run either from the install-path, or from the build-directory.
+# Do not do this if we appear to be cross-compiling.  In that case, we rely
+# on the host's copy of tic to compile the terminfo database.
+if test "x$cross_compiling" = "xno"
+then
+	if test -f ../progs/tic$suffix
+	then
+		case "$PATH" in
+		\@PATH_SEPARATOR@*)
+			PATH="../progs@PATH_SEPARATOR@../lib@PATH_SEPARATOR@${DESTDIR}$bindir$PATH"
+			;;
+		*)
+			PATH="../progs@PATH_SEPARATOR@../lib@PATH_SEPARATOR@${DESTDIR}$bindir@PATH_SEPARATOR@$PATH"
+			;;
+		esac
+		export PATH
+		if test @DFT_LWR_MODEL@ = shared
+		then
+			SHLIB="sh $srcdir/shlib"
+			TIC_PATH="$SHLIB tic"
+		else
+			TIC_PATH="tic"
+		fi
+	elif test "$TIC_PATH" = unknown
+	then
+		echo "? no tic program found"
+		exit 1
+	fi
+else
+	# Cross-compiling, so don't set PATH or run shlib.
+	SHLIB=
+	# reset $suffix, since it applies to the target, not the build platform.
+	suffix=
+fi
+
+
+# set another env var that doesn't get reset when `shlib' runs, so `shlib' uses
+# the PATH we just set.
+SHLIB_PATH=$PATH
+export SHLIB_PATH
+
+# set a variable to simplify environment update in shlib
+SHLIB_HOST=@host_os@
+export SHLIB_HOST
+
+# don't use user's TERMINFO variable
+unset TERMINFO_DIRS
+TERMINFO="${DESTDIR}$ticdir" ; export TERMINFO
+umask 022
+
+# Construct the name of the old (obsolete) pathname, e.g., /usr/lib/terminfo.
+TICDIR=`echo "$TERMINFO" | sed -e 's%/share/\([^/]*\)$%/lib/\1%'`
+
+# Parent directory may not exist, which would confuse the install for hashed
+# database.  Fix.
+PARENT=`echo "$TERMINFO" | sed -e 's%/[^/]*$%%'`
+if test -n "$PARENT"
+then
+	mkdir -p "$PARENT"
+fi
+
+# Remove the old terminfo stuff; we don't care if it existed before, and it
+# would generate a lot of confusing error messages if we tried to overwrite it.
+# We explicitly remove its contents rather than the directory itself, in case
+# the directory is actually a symbolic link.
+if test -d "$TERMINFO"
+then
+	( cd "$TERMINFO" && rm -fr ./? 2>/dev/null )
+elif test -f "$TERMINFO.db"
+then
+	( rm -f "$TERMINFO.db" 2>/dev/null )
+fi
+
+if test "$ext_funcs" = 1 ; then
+cat <<EOF
+Running $TIC_PATH to install $TERMINFO ...
+
+	You may see messages regarding extended capabilities, e.g., AX.
+	These are extended terminal capabilities which are compiled
+	using
+		tic -x
+	If you have ncurses 4.2 applications, you should read the INSTALL
+	document, and install the terminfo without the -x option.
+
+EOF
+$TIC_PATH -V
+if ( $TIC_PATH -x -s -o "$TERMINFO" $source )
+then
+	echo "** built new $TERMINFO"
+else
+	echo "? tic could not build $TERMINFO"
+	exit 1
+fi
+else
+cat <<EOF
+Running $TIC_PATH to install $TERMINFO ...
+
+	You may see messages regarding unknown capabilities, e.g., AX.
+	These are extended terminal capabilities which may be compiled
+	using
+		tic -x
+	If you have ncurses 4.2 applications, you should read the INSTALL
+	document, and install the terminfo without the -x option.
+
+EOF
+$TIC_PATH -V
+if ( $TIC_PATH -s -o "$TERMINFO" $source )
+then
+	echo "** built new $TERMINFO"
+else
+	echo "? tic could not build $TERMINFO"
+	exit 1
+fi
+fi
+
+# Make a symbolic link to provide compatibility with applications that expect
+# to find terminfo under /usr/lib.  That is, we'll _try_ to do that.  Not
+# all systems support symbolic links, and those that do provide a variety
+# of options for 'test'.
+if test "$TICDIR" != "$TERMINFO" ; then
+	( rm -f "$TICDIR" 2>/dev/null )
+	if ( cd "$TICDIR" 2>/dev/null )
+	then
+		cd "$TICDIR" || exit
+		TICDIR=`pwd`
+		if test "$TICDIR " != "$TERMINFO "; then
+			# Well, we tried.  Some systems lie to us, so the
+			# installer will have to double-check.
+			echo "Verify if $TICDIR and $TERMINFO are the same."
+			echo "The new terminfo is in $TERMINFO; the other should be a link to it."
+			echo "Otherwise, remove $TICDIR and link it to $TERMINFO."
+		fi
+	else
+		cd ${DESTDIR}$prefix || exit
+		# Construct a symbolic link that only assumes $ticdir has the
+		# same $prefix as the other installed directories.
+		RELATIVE=`echo $ticdir|sed -e 's%^'$prefix'/%%'`
+		if test "$RELATIVE" != "$ticdir" ; then
+			RELATIVE=../`echo $ticdir|sed -e 's%^'$prefix'/%%' -e 's%^/%%'`
+		fi
+		if ( @LN_S@ "$RELATIVE" "$TICDIR" )
+		then
+			echo "** sym-linked $TICDIR for compatibility"
+		else
+			echo "** could not sym-link $TICDIR for compatibility"
+		fi
+	fi
+fi
+# vile:shmode
diff --git a/misc/shlib b/misc/shlib
new file mode 100755
index 0000000..7b93d17
--- /dev/null
+++ b/misc/shlib
@@ -0,0 +1,142 @@
+#!/bin/sh
+##############################################################################
+# Copyright 2020,2021 Thomas E. Dickey                                       #
+# Copyright 1998-2005,2007 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey <dickey@clark.net> 1996
+#
+# $Id: shlib,v 1.14 2021/09/04 15:55:29 tom Exp $
+# Use this script as a wrapper when running executables linked to shared
+# libraries on systems that use the $LD_LIBRARY_PATH variable and don't embed
+# the soname's path within the linked executable (such as IRIX), e.g,
+#
+#	shlib knight
+#
+# Setting LD_LIBRARY_PATH, overrides/supplements the loader's normal search
+# path, and works on most systems.  The drawback is that then the environment
+# variable has to be set to run the programs within this directory tree.
+#
+# For Linux (and other systems using the GNU loader), we can use the rpath
+# directive, which embeds the pathname of the library within the executable.
+# Using the Linux loader's rpath directive introduces a constraint, since
+# it's embedded into the binary, and means that the binary cannot be moved
+# around (though it'll work if the $exec_prefix convention that puts the bin
+# and lib directories under the same parent is followed).
+#
+# Using the actual soname (e.g., ../lib/libncurses.so) alone, is a more
+# flexible solution; you can link without having to set the environment
+# variable, and on some systems (IRIX) you can even run the resulting binaries
+# without setting LD_LIBRARY_PATH.
+#
+# Using a conventional link, with -L and -l options on Linux results in a
+# statically linked executable, which we don't want at all.
+#
+# Special cases:
+#
+#	BeOS R4.5 uses $LIBRARY_PATH rather than $LD_LIBRARY_PATH.
+#	Cygwin uses $PATH
+#	Mac OS X uses $DYLD_LIBRARY_PATH
+#
+# Other cases not handled by this script:
+#
+#	AIX uses $LIBPATH
+#	IRIX64 may use $LD_LIBRARY64_PATH or $LD_LIBRARYN32_PATH
+#	Solaris may use $LD_LIBRARY_PATH_64
+#
+CDPATH=
+#
+# Make sure that we use the PATH that was set in run_tic.sh
+if test -n "$SHLIB_PATH" ; then
+	PATH=$SHLIB_PATH
+	export PATH
+fi
+
+# Find the lib-directory for this build tree
+q=""
+for p in lib ../lib ../../lib ../../../lib
+do
+	if test -d $p; then
+		q=`cd $p || exit; pwd`
+		break
+	elif test -f configure && test ! -d ../$p ; then
+		break
+	fi
+done
+
+# Set the environment variable.
+if test -n "$q" ; then
+	system=
+	if test -n "$SHLIB_HOST" ; then
+		system="$SHLIB_HOST"
+	elif test -n "$PATHEXT" ; then
+		system=cygwin
+	elif test -n "$LIBRARY_PATH" ; then
+		system=beos
+	elif test -n "$DYLD_LIBRARY_PATH" ; then
+		system=darwin
+	elif test -n "$LD_LIBRARY_PATH"; then
+		system=unix
+	else
+		for r in "$q"/*.*
+		do
+			if test -f "$r"
+			then
+				case $r in
+				*.dll)
+					system=cygwin
+					;;
+				*.dylib)
+					system=darwin
+					;;
+				esac
+			fi
+			test -n "$system" && break
+		done
+	fi
+
+	case .$system in
+	.cygwin*)
+		variable=PATH
+		;;
+	.beos*)
+		variable=LIBRARY_PATH
+		;;
+	.darwin*)
+		variable=DYLD_LIBRARY_PATH
+		;;
+	*)
+		variable=LD_LIBRARY_PATH
+		;;
+	esac
+
+	eval 'test -z "$'$variable'" && '$variable'=":"'
+	eval $variable'="$q:$'$variable'"'
+	eval 'export '$variable
+fi
+
+eval "$*"
diff --git a/misc/tabset/std b/misc/tabset/std
new file mode 100644
index 0000000..e93f737
--- /dev/null
+++ b/misc/tabset/std
Binary files differ
diff --git a/misc/tabset/stdcrt b/misc/tabset/stdcrt
new file mode 100644
index 0000000..66ba12f
--- /dev/null
+++ b/misc/tabset/stdcrt
Binary files differ
diff --git a/misc/tabset/vt100 b/misc/tabset/vt100
new file mode 100644
index 0000000..8828d19
--- /dev/null
+++ b/misc/tabset/vt100
@@ -0,0 +1,3 @@
+

+
+H        H        H        H        H        H        H        H        H        H        H        H        H        H        H        H
diff --git a/misc/tabset/vt300 b/misc/tabset/vt300
new file mode 100644
index 0000000..b1f9ce1
--- /dev/null
+++ b/misc/tabset/vt300
@@ -0,0 +1,3 @@
+
+
+P2$t9/17/25/33/41/49/57/65/73/81/89/97/105/113/121/129\
diff --git a/misc/tdlint b/misc/tdlint
new file mode 100755
index 0000000..8ff5a40
--- /dev/null
+++ b/misc/tdlint
@@ -0,0 +1,114 @@
+#!/bin/sh
+##############################################################################
+# Copyright 2020,2021 Thomas E. Dickey                                       #
+# Copyright 1998,2000 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey <dickey@clark.net> 1996
+#
+# $Id: tdlint,v 1.8 2021/09/04 15:55:29 tom Exp $
+#
+# Lint-script that allows user's own lint libraries, in addition to the ones
+# installed in the system.
+#
+OPT=""
+DIRS=""
+LIBS=""
+FILES=""
+ARCH=`uname -s`
+if test -z "$ARCH" ; then
+	echo '? uname not found'
+	exit 1
+else
+	case $ARCH in
+	AIX)	set - "$@" -Nn4000
+		;;
+	IRIX)	set - "$@" -n -lc
+		;;
+	FreeBSD) set - "$@" -g -p -u -v -z
+		;;
+	SunOS)
+		case `uname -r` in
+		5.*)	ARCH=Solaris
+			set - "$@" -n -lc
+			;;
+		esac
+		;;
+	esac
+fi
+# LIBDIR=$HOME/lib/$ARCH/lint ;export LIBDIR
+for p in $HOME/lib/$ARCH/lint /usr/lib/lint /usr/lib
+do
+	if [ -d "$p" ]
+	then
+		DIRS="$DIRS $p"
+	fi
+done
+#
+while [ $# != 0 ]
+do
+	case $1 in
+	-D*\"*)	;;
+	-L*)
+		DIRS="`echo "$1"|sed -e 's/^-L//'` $DIRS"
+		;;
+	-l*)
+		lib="llib-l`echo "$1" | sed -e 's/^-l//'`.ln"
+		found=no
+		for p in $DIRS
+		do
+			printf "testing %s" "$p/$lib"
+			if [ -f "$p/$lib" ]
+			then
+				LIBS="$LIBS $p/$lib"
+				echo " (ok)"
+				found=yes
+				break
+			fi
+			echo
+		done
+		if [ $found = no ]
+		then
+			echo "ignored library $1"
+		fi
+		;;
+	-n)	if [ -z "$OPT" ]
+		then
+			OPT="-I."
+		fi
+		OPT="$OPT $1"
+		;;
+	-*)	OPT="$OPT $1"
+		;;
+	*)
+		FILES="$FILES $1"
+		;;
+	esac
+	shift
+done
+#
+exec lint $OPT $FILES $LIBS
diff --git a/misc/terminfo.src b/misc/terminfo.src
new file mode 100644
index 0000000..ef78948
--- /dev/null
+++ b/misc/terminfo.src
@@ -0,0 +1,27720 @@
+######## TERMINAL TYPE DESCRIPTIONS SOURCE FILE
+#
+# This version of terminfo.src is distributed with ncurses and is maintained
+# by Thomas E. Dickey (TD).
+#
+# Report bugs and new terminal descriptions to
+#	bug-ncurses@gnu.org
+#
+#	$Revision: 1.1041 $
+#	$Date: 2022/12/29 20:11:56 $
+#
+# 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
+# stopped updates several years ago); we have decided to not change the header
+# unless there is also a change in content.
+#
+# To further muddy the waters, it is noted that changes to this file as part of
+# maintenance of ncurses (since 1996) are generally conceded to be copyright
+# under the ncurses MIT-style license.  That was the effect of the agreement
+# which the principal authors of ncurses made in 1998.  However, since much of
+# the file itself is of unknown authorship (and the disclaimer below makes it
+# obvious that Raymond cannot or will not convey rights over those parts),
+# there is no explicit copyright notice on the file itself.
+#
+# It would also be a nuisance to split the file into unknown/known authorship
+# and move pieces as they are maintained, since many of the maintenance changes
+# have been small corrections to Raymond's translations to/from termcap format,
+# correcting the data but not the accompanying annotations.
+#
+# In any case, note that almost half of this file is not data but annotations
+# which reflect creative effort.  Furthermore, the structure of entries to
+# reuse common chunks also is creative (and subject to copyright).  Finally,
+# some portions of the data are derivative work under a compatible MIT-style
+# license from xterm.
+#
+#------------------------------------------------------------------------------
+# https://invisible-island.net/ncurses/ncurses.faq.html#terminfo_copying
+# https://invisible-island.net/personal/copyrights.html#removing_notes
+#------------------------------------------------------------------------------
+#
+#	Version 10.2.1
+#	terminfo syntax
+#
+#	Eric S. Raymond		(current maintainer)
+#	John Kunze, Berkeley
+#	Craig Leres, Berkeley
+#
+# Please e-mail changes to terminfo@thyrsus.com; the old termcap@berkeley.edu
+# address is no longer valid.  The latest version can always be found at
+# <http://www.tuxedo.org/terminfo>.
+#
+# PURPOSE OF THIS FILE:
+#
+# This file describes the capabilities of various character-cell terminals,
+# as needed by software such as screen-oriented editors.
+#
+# Other terminfo and termcap files exist, supported by various OS vendors
+# or as relics of various older versions of UNIX.  This one is the longest
+# and most comprehensive one in existence.  It subsumes not only the entirety
+# of the historical 4.4BSD, GNU, System V and SCO termcap files and the BRL
+# termcap file, but also large numbers of vendor-maintained termcap and
+# terminfo entries more complete and carefully tested than those in historical
+# termcap/terminfo versions.
+#
+# Pointers to related resources (including the ncurses distribution) may
+# be found at <http://www.tuxedo.org/terminfo>.
+#
+# INTERNATIONALIZATION:
+#
+# This file uses only the US-ASCII character set (no ISO8859 characters).
+#
+# This file assumes a US-ASCII character set. If you need to fix this, start
+# by global-replacing \E(B and \E)B with the appropriate ISO 6429 enablers
+# for your character set.  \E(A and \E)A enables the British character set
+# with the pound sign at position 2/3.
+#
+# In a Japanese-processing environment using EUC/Japanese or Shift-JIS,
+# C1 characters are considered the first-byte set of the Japanese encodings,
+# so \E)0 should be avoided in <enacs> and initialization strings.
+#
+# FILE FORMAT:
+#
+# The version you are looking at may be in any of three formats: master
+# (terminfo with OT capabilities), stock terminfo, or termcap.  You can tell
+# which by the format given in the header above.
+#
+# The master format is accepted and generated by the terminfo tools in the
+# ncurses suite; it differs from stock (System V-compatible) terminfo only
+# in that it admits a group of capabilities (prefixed `OT') equivalent to
+# various obsolete termcap capabilities.  You can, thus, convert from master
+# to stock terminfo simply by filtering with `sed "/OT[^,]*,/s///"'; but if
+# you have ncurses `tic -I' is nicer (among other things, it automatically
+# outputs entries in a canonical form).
+#
+# The termcap version is generated automatically from the master version
+# using tic -C.  This filtering leaves in the OT capabilities under their
+# original termcap names.  All translated entries fit within the 1023-byte
+# string-table limit of archaic termcap libraries except where explicitly
+# noted below.  Note that the termcap translation assumes that your termcap
+# library can handle multiple tc capabilities in an entry. 4.4BSD has this
+# capability.  Older versions of GNU termcap, through 1.3, do not.
+#
+# For details on these formats, see terminfo(5) in the ncurses distribution,
+# and termcap(5) in the 4.4BSD Unix Programmer's Manual.  Be aware that 4.4BSD
+# curses has been declared obsolete by the caretakers of the 4.4BSD sources
+# as of June 1995; they are encouraging everyone to migrate to ncurses.
+#
+# Note: unlike some other distributed terminfo files (Novell Unix & SCO's),
+# no entry in this file has embedded comments.  This is so source translation
+# to termcap only has to carry over leading comments.  Also, no name field
+# contains embedded whitespace (such whitespace confuses rdist).
+#
+# Further note: older versions of this file were often installed with an editor
+# script (reorder) that moved the most common terminal types to the front of
+# the file.  This should no longer be necessary, as the file is now ordered
+# roughly by type frequency with ANSI/VT100 and other common types up front.
+#
+# Some information has been merged in from terminfo files distributed by
+# USL and SCO (see COPYRIGHTS AND OTHER DELUSIONS below).  Much information
+# comes from vendors who maintain official terminfos for their hardware
+# (notably DEC and Wyse).
+#
+# A detailed change history is included at the end of this file.
+#
+# FILE ORGANIZATION:
+#
+# Comments in this file begin with # - they cannot appear in the middle
+# of a terminfo/termcap entry (this feature had to be sacrificed in order
+# to allow standard terminfo and termcap syntax to be generated cleanly from
+# the master format).  Individual capabilities are commented out by
+# placing a period between the colon and the capability name.
+#
+# The file is divided up into major sections (headed by lines beginning with
+# the string "########") and minor sections (beginning with "####"); do
+#
+#	grep "^####" <file> | more
+#
+# to see a listing of section headings.  The intent of the divisions is
+# (a) to make it easier to find things, and (b) to order the database so
+# that important and frequently-encountered terminal types are near the
+# front (so that you'll get reasonable search efficiency from a linear
+# search of the termcap form even if you don't use reorder).  Minor sections
+# usually correspond to manufacturers or standard terminal classes.
+# Parenthesized words following manufacturer names are type prefixes or
+# product line names used by that manufacturers.
+#
+# HOW TO READ THE ENTRIES:
+#
+# The first name in an entry is the canonical name for the model or
+# type, last entry is a verbose description.  Others are mnemonic synonyms for
+# the terminal.
+#
+# Terminal names look like <manufacturer> <model> - <modes/options>
+# The part to the left of the dash, if a dash is present, describes the
+# particular hardware of the terminal.  The part to the right may be used
+# for flags indicating special ROMs, extra memory, particular terminal modes,
+# or user preferences.
+#
+# All names should be in lower case, for consistency in typing.
+#
+# The following are conventionally used suffixes:
+#	-2p	Has two pages of memory.  Likewise 4p, 8p, etc.
+#	-am	Enable auto-margin.
+#	-m	Monochrome.  Suppress color support
+#	-mc	Magic-cookie.  Some terminals (notably older Wyses) can
+#		only support one attribute without magic-cookie lossage.
+#		Their base entry is usually paired with another that
+#		uses magic cookies to support multiple attributes.
+#	-nam	No auto-margin - suppress <am> capability
+#	-nl	No labels - suppress soft labels
+#	-ns	No status line - suppress status line
+#	-rv	Terminal in reverse video mode (black on white)
+#	-s	Enable status line.
+#	-vb	Use visible bell (<flash>) rather than <bel>.
+#	-w	Wide - in 132 column mode.
+# If a name has multiple suffixes and one is a line height, that one should
+# go first.  Thus `aaa-30-s-rv' is recommended over `aaa-s-rv-30'.
+#
+# Entries with embedded plus signs are designed to be included through use/tc
+# capabilities, not used as standalone entries.
+#
+# To avoid search clashes, some older all-numeric names for terminals have
+# been removed (i.e., "33" for the Model 33 Teletype, "2621" for the HP2621).
+# All primary names of terminals now have alphanumeric prefixes.
+#
+# Comments marked "esr" are mostly results of applying the termcap-compiler
+# code packaged with ncurses and contemplating the resulting error messages.
+# In many cases, these indicated obvious fixes to syntax garbled by the
+# composers.  In a few cases, I was able to deduce corrected forms for garbled
+# capabilities by looking at context.  All the information in the original
+# entries is preserved in the comments.
+#
+# In the comments, terminfo capability names are bracketed with <> (angle
+# brackets).  Termcap capability names are bracketed with :: (colons).
+#
+# INTERPRETATION OF USER CAPABILITIES
+#
+# The System V Release 4 and XPG4 terminfo format defines ten string
+# capabilities for use by applications, <u0>...<u9>.   In this file, we use
+# certain of these capabilities to describe functions which are not covered
+# by terminfo.  The mapping is as follows:
+#
+#	u9	terminal enquire string (equiv. to ANSI/ECMA-48 DA)
+#	u8	terminal answerback description
+#	u7	cursor position request (equiv. to VT100/ANSI/ECMA-48 DSR 6)
+#	u6	cursor position report (equiv. to ANSI/ECMA-48 CPR)
+#
+# The terminal enquire string <u9> should elicit an answerback response
+# from the terminal.  Common values for <u9> will be ^E (on older ASCII
+# terminals) or \E[c (on newer VT100/ANSI/ECMA-48-compatible terminals).
+#
+# The cursor position request (<u7>) string should elicit a cursor position
+# report.  A typical value (for VT100 terminals) is \E[6n.
+#
+# The terminal answerback description (u8) must consist of an expected
+# answerback string.  The string may contain the following scanf(3)-like
+# escapes:
+#
+#	%c	Accept any character
+#	%[...]	Accept any number of characters in the given set
+#
+# The cursor position report (<u6>) string must contain two scanf(3)-style
+# %d format elements.  The first of these must correspond to the Y coordinate
+# and the second to the %d.  If the string contains the sequence %i, it is
+# taken as an instruction to decrement each value after reading it (this is
+# the inverse sense from the cup string).  The typical CPR value is
+# \E[%i%d;%dR (on VT100/ANSI/ECMA-48-compatible terminals).
+#
+# These capabilities are used by tack(1m), the terminfo action checker
+# (distributed with ncurses 5.0).
+#
+# TABSET FILES
+#
+# All the entries in this file have been edited to assume that the tabset
+# files directory is /usr/share/tabset, in conformance with the File Hierarchy
+# Standard for Linux and open-source BSD systems.  Some vendors (notably Sun)
+# use /usr/lib/tabset or (more recently) /usr/share/lib/tabset.
+#
+# No curses package we know of actually uses these files.  If their location
+# is an issue, you will have to hand-patch the file locations before compiling
+# this file.
+#
+# REQUEST FOR CONTACT INFORMATION AND HISTORICAL MATERIAL
+#
+# As the ANSI/ECMA-48 standard and variants take firmer hold, and as
+# character-cell terminals are increasingly replaced by X displays, much of
+# this file is becoming a historical document (this is part of the reason for
+# the new organization, which puts ANSI types, xterm, Unix consoles,
+# and vt100 up front in confidence that this will catch 95% of new hardware).
+#
+# For the terminal types still alive, I'd like to have manufacturer's
+# contact data (Internet address and/or snail-mail + phone).
+#
+# I'm also interested in enriching the comments so that the latter portions of
+# the file do in fact become a potted history of VDT technology as seen by
+# UNIX hackers.  Ideally, I'd like the headers for each manufacturer to
+# include its live/dead/out-of-the-business status, and for as many
+# terminal types as possible to be tagged with information like years
+# of heaviest use, popularity, and interesting features.
+#
+# I'm especially interested in identifying the obscure entries listed under
+# `Miscellaneous obsolete terminals, manufacturers unknown' before the tribal
+# wisdom about them gets lost.  If you know a lot about obscure old terminals,
+# please go to the terminfo resource page, grab the UFO file (ufo.ti), and
+# eyeball it for things you can identify and describe.
+#
+# If you have been around long enough to contribute, please read the file
+# with this in mind and send me your annotations.
+#
+# COPYRIGHTS AND OTHER DELUSIONS
+#
+# The BSD ancestor of this file had a standard Regents of the University of
+# California copyright with dates from 1980 to 1993.
+#
+# Some information has been merged in from a terminfo file SCO distributes.
+# It has an obnoxious boilerplate copyright which I'm ignoring because they
+# took so much of the content from the ancestral BSD versions of this file
+# and didn't attribute it, thereby violating the BSD Regents' copyright.
+#
+# Not that anyone should care.  However many valid functions copyrights may
+# serve, putting one on a termcap/terminfo file with hundreds of anonymous
+# contributors makes about as much sense as copyrighting a wall-full of
+# graffiti -- it's legally dubious, ethically bogus, and patently ridiculous.
+#
+# This file deliberately has no copyright.  It belongs to no one and everyone.
+# If you claim you own it, you will merely succeed in looking like a fool.
+# Use it as you like.  Use it at your own risk.  Copy and redistribute freely.
+# There are no guarantees anywhere.  Svaha!
+#
+
+######## ANSI, UNIX CONSOLE, AND SPECIAL TYPES
+#
+# This section describes terminal classes and brands that are still
+# quite common.
+#
+
+#### Specials
+#
+# Special "terminals".  These are used to label tty lines when you don't
+# know what kind of terminal is on it.  The characteristics of an unknown
+# terminal are the lowest common denominator - they look about like a ti 700.
+#
+
+dumb|80-column dumb tty,
+	am,
+	cols#80,
+	bel=^G, cr=\r, cud1=\n, ind=\n,
+unknown|unknown terminal type,
+	gn, use=dumb,
+lpr|printer|line printer,
+	OTbs, hc, os,
+	cols#132, lines#66,
+	bel=^G, cr=\r, cub1=^H, cud1=\n, ff=^L, ind=\n,
+glasstty|classic glass tty interpreting ASCII control characters,
+	OTbs, am,
+	cols#80,
+	bel=^G, clear=^L, cr=\r, cub1=^H, cud1=\n, ht=^I, kcub1=^H,
+	kcud1=\n, nel=\r\n, .kbs=^H,
+
+vanilla|dumb tty,
+	OTbs,
+	bel=^G, cr=\r, cud1=\n, ind=\n,
+
+# This is almost the same as "dumb", but with no prespecified width.
+# DEL and ^C are hardcoded to act as kill characters.
+# ^D acts as a line break (just like newline).
+# It also interprets
+#      \033];xxx\007
+# for compatibility with xterm -TD
+9term|Plan9 terminal emulator for X,
+	am,
+	OTnl=\n, bel=^G, cud1=\n,
+
+#### ANSI.SYS/ISO 6429/ECMA-48 Capabilities
+#
+# See the end-of-file comment for more on these.
+#
+
+# ANSI capabilities are broken up into pieces, so that a terminal
+# implementing some ANSI subset can use many of them.
+ansi+local1|ANSI normal-mode cursor-keys,
+	cub1=\E[D, cud1=\E[B, cuf1=\E[C, cuu1=\E[A,
+ansi+local|ANSI normal-mode parameterized cursor-keys,
+	cub=\E[%p1%dD, cud=\E[%p1%dB, cuf=\E[%p1%dC,
+	cuu=\E[%p1%dA, use=ansi+local1,
+ansi+tabs|ANSI tab-stops,
+	cbt=\E[Z, ht=^I, hts=\EH, tbc=\E[3g,
+ansi+inittabs|ANSI initial tab-stops,
+	it#8, use=ansi+tabs,
+ansi+erase|ANSI clear screen/line,
+	clear=\E[H\E[J, ed=\E[J, el=\E[K,
+ansi+rca|ANSI relative cursor-addressing (1-based),
+	hpa=\E[%p1%{1}%+%dG, vpa=\E[%p1%{1}%+%dd,
+ansi+rca2|ANSI relative cursor-addressing,
+	hpa=\E[%i%p1%dG, vpa=\E[%i%p1%dd,
+ansi+cup|ANSI absolute cursor-addressing,
+	cup=\E[%i%p1%d;%p2%dH, home=\E[H,
+ansi+rep|ANSI repeat-character,
+	rep=%p1%c\E[%p2%{1}%-%db,
+ansi+idl1|ANSI insert/delete one line,
+	dl1=\E[M, il1=\E[L,
+ansi+idl|ANSI insert/delete lines,
+	dl=\E[%p1%dM, il=\E[%p1%dL, use=ansi+idl1,
+ansi+idc1|ANSI insert/delete one character,
+	dch1=\E[P, ich1=\E[@, rmir=\E[4l, smir=\E[4h,
+ansi+idc|ANSI insert/delete characters,
+	dch=\E[%p1%dP, ich=\E[%p1%d@, use=ansi+idc1,
+ansi+arrows|ANSI normal-mode home and cursor-keys,
+	kbs=^H, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A,
+	khome=\E[H,
+ansi+sgr|ANSI graphic renditions,
+	blink=\E[5m, invis=\E[8m, rev=\E[7m,
+	sgr=\E[0%?%p3%t;7%;%?%p4%t;5%;%?%p7%t;8%;m,
+	sgr0=\E[0m,
+ansi+sgrso|ANSI standout only,
+	rmso=\E[m, smso=\E[7m,
+ansi+sgrul|ANSI underline only,
+	rmul=\E[m, smul=\E[4m,
+ansi+sgrbold|ANSI graphic renditions; assuming terminal has bold; not dim,
+	bold=\E[1m,
+	sgr=\E[%?%p1%t7;%;%?%p2%t4;%;%?%p3%t7;%;%?%p4%t5;%;%?%p6%t1;
+	    %;%?%p7%t8;%;m,
+	use=ansi+sgr, use=ansi+sgrso, use=ansi+sgrul,
+ansi+sgrdim|ANSI graphic renditions; assuming terminal has dim; not bold,
+	dim=\E[2m,
+	sgr=\E[%?%p1%t7;%;%?%p2%t4;%;%?%p3%t7;%;%?%p4%t5;%;%?%p5%t2;
+	    %;%?%p7%t8;%;m,
+	use=ansi+sgr, use=ansi+sgrso, use=ansi+sgrul,
+
+# ECMA-48 does not specify scroll-regions, but most people consider it to be
+# "ANSI" because it is widely-supported.  See ecma+index for the standard form.
+ansi+csr|ANSI scroll-region plus cursor save & restore,
+	csr=\E[%i%p1%d;%p2%dr, rc=\E8, sc=\E7,
+
+# The normal (ANSI) flavor of "media copy" building block asserts that
+# characters sent to the printer do not echo on the screen. DEC terminals
+# can also be put into autoprinter mode, where each line is sent to the
+# printer as you move off that line, e.g., by a carriage return.
+ansi+pp|ANSI printer port,
+	mc5i,
+	mc0=\E[i, mc4=\E[4i, mc5=\E[5i,
+dec+pp|DEC autoprinter mode,
+	mc0=\E[i, mc4=\E[?4i, mc5=\E[?5i,
+
+# The IBM PC alternate character set.  Plug this into any Intel console entry.
+# We use \E[11m for rmacs rather than \E[12m so the <acsc> string can use the
+# ROM graphics for control characters such as the diamond, up- and down-arrow.
+# This works with the System V, Linux, and BSDI consoles.  It's a safe bet this
+# will work with any Intel console, they all seem to have inherited \E[11m
+# from the ANSI.SYS de-facto standard.
+klone+acs|alternate character set for ansi.sys displays,
+	acsc=+\020\,\021-\030.^Y0\333`\004a\261f\370g\361h\260j
+	     \331k\277l\332m\300n\305o~p\304q\304r\304s_t\303u\264v
+	     \301w\302x\263y\363z\362{\343|\330}\234~\376,
+	rmacs=\E[10m, smacs=\E[11m,
+
+# Highlight controls corresponding to the ANSI.SYS standard.  Most
+# console drivers for Intel boxes obey these.  Makes the same assumption
+# about \E[11m as klone+acs.  True ANSI/ECMA-48 would have <rmso=\E[27m>,
+# <rmul=\E[24m>, but this isn't a documented feature of ANSI.SYS.
+klone+sgr|attribute control for ansi.sys displays,
+	blink=\E[5m, bold=\E[1m, rev=\E[7m, rmpch=\E[10m,
+	rmso=\E[m, rmul=\E[m,
+	sgr=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6
+	    %t;1%;%?%p9%t;11%;m,
+	sgr0=\E[0;10m, smpch=\E[11m, smso=\E[7m, smul=\E[4m,
+	use=klone+acs,
+
+# Most Intel boxes do not treat "invis" (invisible) text.
+klone+sgr8|attribute control for ansi.sys displays with invis,
+	invis=\E[8m,
+	sgr=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6
+	    %t;1%;%?%p7%t;8%;%?%p9%t;11%;m,
+	use=klone+sgr,
+
+# Highlight controls corresponding to the ANSI.SYS standard.  *All*
+# console drivers for Intel boxes obey these.  Does not assume \E[11m will
+# work; uses \E[12m instead, which is pretty bulletproof but loses you the ACS
+# diamond and arrow characters under curses.
+klone+sgr-dumb|attribute control for ansi.sys displays (no ESC [ 11 m),
+	blink=\E[5m, bold=\E[1m, invis=\E[8m, rev=\E[7m, rmso=\E[m,
+	rmul=\E[m,
+	sgr=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6
+	    %t;1%;%?%p7%t;8%;%?%p9%t;12%;m,
+	sgr0=\E[0;10m, smacs=\E[12m, smso=\E[7m, smul=\E[4m,
+	use=klone+acs,
+
+# KOI8-R (RFC1489) acs (alternate character set)
+# From: Qing Long <qinglong@Bolizm.ihep.su>, 24 Feb 1996.
+klone+koi8acs|alternate character set for ansi.sys displays with KOI8 charset,
+	acsc=+\020\,\021-\036.^_0\215`\004a\237f\234g\232h\222i
+	     \220j\205k\203l\202m\204n\212o\213p\216q\0r\217s\214t
+	     \206u\207v\210w\211x\201y\230z\231{\267|\274}L~
+	     \225,
+	rmacs=\E[10m, smacs=\E[11m,
+
+# ANSI.SYS color control.  The setab/setaf caps depend on the coincidence
+# between SVr4/XPG4's color numbers and ANSI.SYS attributes.  Here are longer
+# but equivalent strings that don't rely on that coincidence:
+# setb=\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,
+# setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,
+# The DOS 5 manual asserts that these sequences meet the ISO 6429 standard.
+# They match a subset of ECMA-48.
+klone+color|color control for ansi.sys and ISO6429-compatible displays,
+	colors#8, ncv#3, pairs#64,
+	op=\E[37;40m, setab=\E[4%p1%dm, setaf=\E[3%p1%dm,
+
+# This is better than klone+color, it doesn't assume white-on-black as the
+# default color pair,  but many `ANSI' terminals don't grok the <op> cap.
+ecma+color|color control for ECMA-48-compatible terminals,
+	AX,
+	colors#8, ncv#3, pairs#64,
+	op=\E[39;49m, setab=\E[4%p1%dm, setaf=\E[3%p1%dm,
+
+ecma+italics|ECMA-48 italics,
+	ritm=\E[23m, sitm=\E[3m,
+
+# Attribute control for ECMA-48-compatible terminals
+ecma+sgr|attribute capabilities for true ECMA-48 terminals,
+	rmso=\E[27m, rmul=\E[24m, use=klone+sgr8,
+
+ecma+strikeout|ECMA-48 strikeout/crossed-out,
+	rmxx=\E[29m, smxx=\E[9m,
+
+# ECMA-48 does not include the VT100 indexing and scroll-margins.  It has its
+# own variation.
+ecma+index|ECMA-48 scroll up/down,
+	indn=\E[%p1%dS, rin=\E[%p1%dT,
+
+# For comparison, here are all the capabilities implied by the Intel
+# Binary Compatibility Standard (level 2) that fit within terminfo.
+# For more detail on this rather pathetic standard, see the comments
+# near the end of this file.
+ibcs2|Intel Binary Compatibility Standard prescriptions,
+	cbt=\E[Z, clear=\Ec, cub=\E[%p1%dD, cub1=\E[1D,
+	cud=\E[%p1%dB, cud1=\E[1B, cuf=\E[%p1%dC, cuf1=\E[1C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[1A,
+	dch=\E[%p1%dP, dispc=\E=%p1%dg, ech=\E[%p1%dX,
+	hpa=\E[%i%p1%dG, hts=\EH, ich=\E[%p1%d@, ich1=\E[@,
+	il=\E[%p1%dL, rc=\E7, rmam=\E[?7l, sc=\E7, smam=\E[?7h,
+	tbc=\E[g, vpa=\E[%i%p1%dd, use=ecma+index,
+
+#### ANSI/ECMA-48 terminals and terminal emulators
+#
+# See near the end of this file for details on ANSI conformance.
+# Don't mess with these entries!  Lots of other entries depend on them!
+#
+# This section lists entries in a least-capable to most-capable order.
+# if you're in doubt about what `ANSI' matches yours, try them in that
+# order and back off from the first that breaks.
+
+# ansi-mr is for ANSI terminals with ONLY relative cursor addressing
+# and more than one page of memory.  It uses local motions instead of
+# direct cursor addressing, and makes almost no assumptions. It does
+# assume auto margins, no padding and/or xon/xoff, and a 24x80 screen.
+ansi-mr|mem rel cup ANSI,
+	am, xon,
+	cols#80, lines#24, use=vanilla, use=ansi+erase,
+	use=ansi+local1,
+
+# ansi-mini is a bare minimum ANSI terminal. This should work on anything, but
+# beware of screen size problems and memory relative cursor addressing.
+ansi-mini|any ANSI terminal with pessimistic assumptions,
+	am, xon,
+	cols#80, lines#24, use=vanilla, use=ansi+cup,
+	use=ansi+erase,
+
+# ansi-mtabs adds relative addressing and minimal tab support
+ansi-mtabs|any ANSI terminal with pessimistic assumptions (relative addressing),
+	it#8,
+	ht=^I, use=ansi-mini, use=ansi+local1,
+
+# ANSI X3.64 from emory!mlhhh (Hugh Hansard) via BRL
+#
+# The following is an entry for the full ANSI 3.64 (1977).  It lacks
+# padding, but most terminals using the standard are "fast" enough
+# not to require any -- even at 9600 bps.  If you encounter problems,
+# try including the padding specifications.
+#
+# Note: the :as: and :ae: specifications are not implemented here, for
+# the available termcap documentation does not make clear WHICH alternate
+# character set to specify.  ANSI 3.64 seems to make allowances for several.
+# Please make the appropriate adjustments to fit your needs -- that is
+# if you will be using alternate character sets.
+#
+# There are very few terminals running the full ANSI 3.64 standard,
+# so I could only test this entry on one verified terminal (Visual 102).
+# I would appreciate the results on other terminals sent to me.
+#
+# Please report comments, changes, and problems to:
+#
+# U.S. MAIL:   Hugh Hansard
+#              Box: 22830
+#              Emory University
+#              Atlanta, GA. 30322.
+#
+# USENET {akgua,msdc,sb1,sb6,gatech}!emory!mlhhh.
+#
+# (Added vt100 <rc>,<sc> to quiet a tic warning --esr)
+ansi77|ANSI 3.64 standard 1977 version,
+	OTbs, am, mir,
+	cols#80, it#8, lines#24,
+	bel=^G, clear=\E[;H\E[2J, cr=\r, csr=\E[%i%p1%d;%p2%dr,
+	cub1=^H, cud1=\E[B, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH,
+	cuu1=\E[A, dch1=\E[P, dl1=\E[M$<5*/>, ed=\E[J, el=\E[K,
+	home=\E[H, ht=^I, il1=\E[L$<5*/>, ind=\ED, kbs=^H,
+	kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kf1=\EOP,
+	kf2=\EOR, kf4=\EOS, khome=\E[H, nel=\r\ED, rc=\E8, ri=\EM,
+	rmir=\E[4l, rmso=\E[m, rmul=\E[m, sc=\E7, smir=\E[4h,
+	smso=\E[7m, smul=\E[4m,
+
+# Procomm and some other ANSI emulations don't recognize all of the ANSI-
+# standard capabilities.  This entry deletes <cuu>, <cuf>, <cud>, <cub>, and
+# <vpa>/<hpa> capabilities, forcing curses to use repetitions of <cuu1>,
+# <cuf1>, <cud1> and <cub1>.  Also deleted <ich> and <ich1>, as QModem up to
+# 5.03 doesn't recognize these.  Finally, we delete <rep> and <ri>, which seem
+# to confuse many emulators.  On the other hand, we can count on these programs
+# doing <rmacs>/<smacs>/<sgr>. Older versions of this entry featured
+# <invis=\E[9m>, but <invis=\E[8m> now seems to be more common under
+# ANSI.SYS influence.
+# From: Eric S. Raymond <esr@snark.thyrsus.com> Oct 30 1995
+pcansi-m|pcansi-mono|ibm-pc terminal programs claiming to be ANSI (mono mode),
+	OTbs, am, mir, msgr,
+	cols#80, it#8, lines#24,
+	bel=^G, cbt=\E[Z, clear=\E[H\E[J, cr=\r, cub1=\E[D,
+	cud1=\E[B, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A,
+	dch1=\E[P, dl1=\E[M, ed=\E[J, el=\E[K, home=\E[H, ht=^I,
+	hts=\EH, il1=\E[L, ind=\n, kbs=^H, kcub1=\E[D, kcud1=\E[B,
+	kcuf1=\E[C, kcuu1=\E[A, khome=\E[H, tbc=\E[3g,
+	use=klone+sgr-dumb,
+pcansi-25-m|pcansi25m|ibm-pc terminal programs with 25 lines (mono mode),
+	lines#25, use=pcansi-m,
+pcansi-33-m|pcansi33m|ibm-pc terminal programs with 33 lines (mono mode),
+	lines#33, use=pcansi-m,
+pcansi-43-m|ansi43m|ibm-pc terminal programs with 43 lines (mono mode),
+	lines#43, use=pcansi-m,
+# The color versions.  All PC emulators do color...
+pcansi|ibm-pc terminal programs claiming to be ANSI,
+	use=klone+color, use=pcansi-m,
+pcansi-25|pcansi25|ibm-pc terminal programs with 25 lines,
+	lines#25, use=pcansi,
+pcansi-33|pcansi33|ibm-pc terminal programs with 33 lines,
+	lines#33, use=pcansi,
+pcansi-43|pcansi43|ibm-pc terminal programs with 43 lines,
+	lines#43, use=pcansi,
+
+# ansi-m -- full ANSI X3.64 with ANSI.SYS-compatible attributes, no color.
+# If you want pound signs rather than dollars, replace `B' with `A'
+# in the <s0ds>, <s1ds>, <s2ds>, and <s3ds> capabilities.
+# From: Eric S. Raymond <esr@snark.thyrsus.com> Nov 6 1995
+ansi-m|ansi-mono|ANSI X3.64-1979 terminal with ANSI.SYS compatible attributes,
+	mc5i,
+	cub=\E[%p1%dD, cud=\E[%p1%dB, cuf=\E[%p1%dC,
+	cuu=\E[%p1%dA, dch=\E[%p1%dP, dl=\E[%p1%dM,
+	ech=\E[%p1%dX, el1=\E[1K, hpa=\E[%i%p1%dG, ht=\E[I,
+	ich=\E[%p1%d@, il=\E[%p1%dL, kbs=^H, kcbt=\E[Z, kcub1=\E[D,
+	kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kich1=\E[L, mc4=\E[4i,
+	mc5=\E[5i, nel=\r\E[S, rep=%p1%c\E[%p2%{1}%-%db,
+	s0ds=\E(B, s1ds=\E)B, s2ds=\E*B, s3ds=\E+B, tbc=\E[3g,
+	vpa=\E[%i%p1%dd, use=ecma+index, use=pcansi-m,
+
+# ECMA-48 addresses three of the four capabilities here:
+#
+# u6 -
+#	8.3.14 CPR - ACTIVE POSITION REPORT
+#	Notation: (Pn1;Pn2) Representation: CSI Pn1;Pn2 05/02
+#	Parameter default values: Pn1 = 1; Pn2 = 1
+#
+# u7
+#	8.3.35 DSR - DEVICE ST A TUS REPORT
+#	Notation: (Ps) Representation: CSI Ps 06/14
+#	Parameter default value: Ps = 0
+#	DSR is used either to report the status of the sending device or to
+#	request a status report from the receiving device, depending on the
+#	parameter values:
+#	6 a report of the active presentation position or of the active data
+#	  position in the form of ACTIVE POSITION REPORT (CPR) is requested
+#
+# u9 -
+#	8.3.24 DA - DEVICE ATTRIBUTES
+#	Notation: (Ps) Representation: CSI Ps 06/03
+#	Parameter default value: Ps = 0
+#	With a parameter value not equal to 0, DA is used to identify the
+#	device which sends the DA.  The parameter value is a device type
+#	identification code according to a register which is to be established. 
+#	If the parameter value is 0, DA is used to request an identifying DA
+#	from a device.
+#
+# DEC (and most "ANSI") terminals reply with a private-mode ("?") sequence,
+# but that register "which is to be" in ECMA-48 was never established.
+# For terminals that support DA1, a more specific u8 capability is preferred,
+# except for those (such as xterm) which can be configured to return different
+# responses.
+ansi+cpr|ncurses extension for ANSI CPR,
+	u6=\E[%i%d;%dR, u7=\E[6n,
+ansi+enq|ncurses extension for ANSI ENQ,
+	u8=\E[?%[;0123456789]c, u9=\E[c, use=ansi+cpr,
+# DEC terminals provided DECID, subsumed into DA1:
+decid+cpr|ncurses extension for DECID,
+	u8=\E[?%[;0123456789]c, u9=\EZ, use=ansi+cpr,
+
+# ansi -- this terminfo expresses the largest subset of X3.64 that will fit in
+# standard terminfo.  Assumes ANSI.SYS-compatible attributes and color.
+# From: Eric S. Raymond <esr@snark.thyrsus.com> Nov 6 1995
+ansi|ansi/pc-term compatible with color,
+	use=ansi+enq, use=ecma+color, use=klone+sgr8, use=ansi-m,
+
+# ansi-generic is a vanilla ANSI terminal. This is assumed to implement
+# all the normal ANSI stuff with no extensions. It assumes
+# insert/delete line/char is there, so it won't work with
+# VT100 clones. It assumes video attributes for bold, blink,
+# underline, and reverse, which won't matter much if the terminal
+# can't do some of those. Padding is assumed to be zero, which
+# shouldn't hurt since xon/xoff is assumed.
+ansi-generic|ansiterm|generic ANSI standard terminal,
+	am, xon,
+	cols#80, lines#24, use=vanilla, use=ansi+csr, use=ansi+cup,
+	use=ansi+rca, use=ansi+erase, use=ansi+tabs,
+	use=ansi+local, use=ansi+idc, use=ansi+idl, use=ansi+rep,
+	use=ansi+sgrbold, use=ansi+arrows,
+
+#### DOS ANSI.SYS variants
+#
+# This completely describes the sequences specified in the DOS 2.1 ANSI.SYS
+# documentation (except for the keyboard key reassignment feature, which
+# doesn't fit the <pfkey> model well).  The klone+acs sequences were valid
+# though undocumented.  The <pfkey> capability is untested but should work for
+# keys F1-F10 (%p1 values outside this range will yield unpredictable results).
+# From: Eric S. Raymond <esr@snark.thyrsus.com> Nov 7 1995
+#
+# DOS 2.0 (January 1983) documented these features in
+# Chapter 13, "Using Extended Screen and Keyboard Control" -TD
+ansi.sys-old|ANSI.SYS under PC-DOS 2.0,
+	OTbs, am, mir, msgr, xon,
+	cols#80, lines#25,
+	clear=\E[2J, cub1=^H, cud1=\E[B, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, el=\E[k, home=\E[H,
+	is2=\E[m\E[?7h, kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K,
+	khome=^^, pfkey=\E[0;%p1%{58}%+%d;%p2"%s"p, rc=\E[u,
+	rmam=\E[?7l, sc=\E[s, smam=\E[?7h, use=ansi+cpr,
+	use=klone+color, use=klone+sgr8,
+
+# Keypad:	Home=\0G	Up=\0H	PrPag=\0I
+#		ka1,kh		kcuu1		kpp,ka3
+#
+#		Left=\0K	5=\0L		Right=\0M
+#		kcub1		kb2		kcuf1
+#
+#		End=\0O		Down=\0P	NxPag=\0Q
+#		kc1,kend	kcud1		kc3,knp
+#
+#		Ins=\0R		Del=\0S
+#		kich1		kdch1
+#
+# On keyboard with 12 function keys,
+#	shifted f-keys: F13-F24
+#	control f-keys: F25-F36
+#	alt f-keys:     F37-F48
+# The shift/control/alt keys do not modify each other, but alt overrides both,
+# and control overrides shift.
+#
+# <pfkey> capability for F1-F48 -TD
+ansi.sys|ANSI.SYS 3.1 and later versions,
+	el=\E[K, ka1=\0G, ka3=\0I, kb2=\0L, kbs=^H, kc1=\0O, kc3=\0Q,
+	kcbt=\0^O, kcub1=\0K, kcud1=\0P, kcuf1=\0M, kcuu1=\0H,
+	kdch1=\0S, kend=\0O, kf1=\0;, kf10=\0D, kf11=\0\205,
+	kf12=\0\206, kf13=\0T, kf14=\0U, kf15=\0V, kf16=\0W,
+	kf17=\0X, kf18=\0Y, kf19=\0Z, kf2=\0<, kf20=\0[, kf21=\0\\,
+	kf22=\0], kf23=\0\207, kf24=\0\210, kf25=\0\^, kf26=\0_,
+	kf27=\0`, kf28=\0a, kf29=\0b, kf3=\0=, kf30=\0c, kf31=\0d,
+	kf32=\0e, kf33=\0f, kf34=\0g, kf35=\0\211, kf36=\0\212,
+	kf37=\0h, kf38=\0i, kf39=\0j, kf4=\0>, kf40=\0k, kf41=\0l,
+	kf42=\0m, kf43=\0n, kf44=\0o, kf45=\0p, kf46=\0q,
+	kf47=\0\213, kf48=\0\214, kf5=\0?, kf6=\0@, kf7=\0A, kf8=\0B,
+	kf9=\0C, khome=\0G, kich1=\0R, knp=\0Q, kpp=\0I,
+	pfkey=\E[0;%?%p1%{11}%<%t%':'%e%p1%{13}%<%t%'z'%e%p1%{23}%<
+	      %t%'G'%e%p1%{25}%<%t%'p'%e%p1%'#'%<%t%'E'%e%p1%'%'%<%t
+	      %'f'%e%p1%'/'%<%t%'C'%e%{92}%;%p1%+%d;%p2"%s"p,
+	use=ansi.sys-old,
+
+#
+# Define IBM PC keypad keys for vi as per MS-Kermit while using ANSI.SYS.
+# This should only be used when the terminal emulator cannot redefine the keys.
+# Since redefining keys with ansi.sys also affects PC-DOS programs, the key
+# definitions must be restored.  If the terminal emulator is quit while in vi
+# or others using <smkx>/<rmkx>, the keypad will not be defined as per PC-DOS.
+# The PgUp and PgDn are prefixed with ESC so that tn3270 can be used on Unix
+# (^U and ^D are already defined for tn3270).  The ESC is safe for vi but it
+# does "beep".  ESC ESC i is used for Ins to avoid tn3270 ESC i for coltab.
+# Note that <kcub1> is always BS, because PC-dos can tolerate this change.
+# Caution: vi is limited to 256 string bytes, longer crashes or weirds out vi.
+# Consequently the End keypad key could not be set (it is relatively safe and
+# actually useful because it sends ^@ O, which beeps and opens a line above).
+ansi.sysk|ansisysk|PC-DOS 3.1 ANSI.SYS with keypad redefined for vi,
+	is2=U2\sPC-DOS\s3.1\sANSI.SYS\swith\skeypad\sredefined\sfor
+	    \svi\s9-29-86\n\E[;75;8p,
+	rmkx=\E[;71;0;71p\E[;72;0;72p\E[;73;0;73p\E[;77;0;77p\E[;80;
+	     0;80p\E[;81;0;81p\E[;82;0;82p\E[;83;0;83p,
+	smkx=\E[;71;30p\E[;72;11p\E[;73;27;21p\E[;77;12p\E[;80;10p
+	     \E[;81;27;4p\E[;82;27;27;105p\E[;83;127p,
+	use=ansi.sys,
+#
+# Adds ins/del line/character, hence vi reverse scrolls/inserts/deletes nicer.
+nansi.sys|nansisys|PC-DOS Public Domain NANSI.SYS,
+	dch1=\E[1P, dl1=\E[1M, ich1=\E[1@, il1=\E[1L,
+	is2=U3 PC-DOS Public Domain NANSI.SYS 9-23-86\n,
+	use=ansi.sys,
+#
+# See ansi.sysk and nansi.sys above.
+nansi.sysk|nansisysk|PC-DOS Public Domain NANSI.SYS with keypad redefined for vi,
+	dch1=\E[1P, dl1=\E[1M, ich1=\E[1@, il1=\E[1L,
+	is2=U4\sPC-DOS\sPublic\sDomain\sNANSI.SYS\swith\skeypad
+	    \sredefined\sfor\svi\s9-29-86\n\E[;75;8p,
+	use=ansi.sysk,
+
+#### Atari ST terminals
+
+# From Guido Flohr <gufl0000@stud.uni-sb.de>.
+#
+tw52|tw52-color|Toswin window manager with color,
+	bce,
+	colors#16, pairs#0x100,
+	oc=\Eb?\Ec0, op=\Eb?\Ec0,
+	setab=\Ec%?%p1%{0}%=%t?%e%p1%{7}%=%t0%e%p1%{15}%=%t7%e%p1
+	      %{48}%+%c,
+	setaf=\Eb%?%p1%{0}%=%t?%e%p1%{7}%=%t0%e%p1%{15}%=%t7%e%p1
+	      %{48}%+%c,
+	setb=\Ec%?%p1%{0}%=%t?%e%p1%{7}%=%t0%e%p1%{15}%=%t7%e%p1
+	     %{48}%+%c,
+	setf=\Eb%?%p1%{0}%=%t?%e%p1%{7}%=%t0%e%p1%{15}%=%t7%e%p1
+	     %{48}%+%c,
+	use=tw52-m,
+tw52-m|Toswin window manager monochrome,
+	ul,
+	ma#999,
+	bold=\Eya, dch1=\Ea, dim=\EyB,
+	is2=\Ev\Eq\Ez_\Ee\Ei\Eb?\Ec0, rev=\EyP, rmso=\EzQ,
+	rmul=\EzH, rs2=\Ev\Eq\Ez_\Ee\Ei\Eb?\Ec0, sgr0=\Ez_,
+	smso=\EyQ, smul=\EyH, use=at-m,
+tt52|Atari TT medium and high resolution,
+	lines#30, use=at-color,
+st52-color|at-color|atari-color|atari_st-color|Atari ST with color,
+	bce,
+	colors#16, pairs#0x100,
+	is2=\Ev\Eq\Ee\Eb1\Ec0, rs2=\Ev\Eq\Ee\Eb1\Ec0,
+	setab=\Ec%?%p1%{0}%=%t1%e%p1%{1}%=%t2%e%p1%{2}%=%t3%e%p1%{3}
+	      %=%t>%e%p1%{4}%=%t4%e%p1%{5}%=%t7%e%p1%{6}%=%t5%e%p1
+	      %{7}%=%t0%e%p1%{8}%=%t8%e%p1%{9}%=%t9%e%p1%{10}%=%t:%e
+	      %p1%{11}%=%t;%e%p1%{12}%=%t<%e%p1%{13}%=%t=%e%p1%{14}
+	      %=%t6%e?,
+	setaf=\Eb%?%p1%{0}%=%t1%e%p1%{1}%=%t2%e%p1%{2}%=%t3%e%p1%{3}
+	      %=%t>%e%p1%{4}%=%t4%e%p1%{5}%=%t7%e%p1%{6}%=%t5%e%p1
+	      %{7}%=%t0%e%p1%{8}%=%t8%e%p1%{9}%=%t9%e%p1%{10}%=%t:%e
+	      %p1%{11}%=%t;%e%p1%{12}%=%t<%e%p1%{13}%=%t=%e%p1%{14}
+	      %=%t6%e?,
+	setb=\Ec%?%p1%{0}%=%t1%e%p1%{1}%=%t2%e%p1%{2}%=%t3%e%p1%{3}
+	     %=%t>%e%p1%{4}%=%t4%e%p1%{5}%=%t7%e%p1%{6}%=%t5%e%p1
+	     %{7}%=%t0%e%p1%{8}%=%t8%e%p1%{9}%=%t9%e%p1%{10}%=%t:%e
+	     %p1%{11}%=%t;%e%p1%{12}%=%t<%e%p1%{13}%=%t=%e%p1%{14}%=
+	     %t6%e?,
+	setf=\Eb%?%p1%{0}%=%t1%e%p1%{1}%=%t2%e%p1%{2}%=%t3%e%p1%{3}
+	     %=%t>%e%p1%{4}%=%t4%e%p1%{5}%=%t7%e%p1%{6}%=%t5%e%p1
+	     %{7}%=%t0%e%p1%{8}%=%t8%e%p1%{9}%=%t9%e%p1%{10}%=%t:%e
+	     %p1%{11}%=%t;%e%p1%{12}%=%t<%e%p1%{13}%=%t=%e%p1%{14}%=
+	     %t6%e?,
+	use=st52,
+st52|st52-m|at|at-m|atari|atari-m|atari_st|atarist-m|Atari ST,
+	am, eo, mir, npc,
+	cols#80, it#8, lines#24,
+	bel=^G, civis=\Ef, clear=\EE, cnorm=\Ee, cr=\r, cub1=\ED,
+	cud1=\EB, cuf1=\EC, cup=\EY%p1%{32}%+%c%p2%{32}%+%c,
+	cuu1=\EA, dl1=\EM, ed=\EJ, el=\EK, el1=\Eo, home=\EH, ht=^I,
+	il1=\EL, ind=\n, is2=\Ev\Eq\Ee, kLFT=\Ed, kRIT=\Ec, kbs=^H,
+	kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, kdch1=^?,
+	kf1=\EP, kf10=\EY, kf11=\Ep, kf12=\Eq, kf13=\Er, kf14=\Es,
+	kf15=\Et, kf16=\Eu, kf17=\Ev, kf18=\Ew, kf19=\Ex, kf2=\EQ,
+	kf20=\Ey, kf3=\ER, kf4=\ES, kf5=\ET, kf6=\EU, kf7=\EV, kf8=\EW,
+	kf9=\EX, khlp=\EH, khome=\EE, kich1=\EI, knp=\Eb, kpp=\Ea,
+	kund=\EK, nel=\r\n, rc=\Ek, rev=\Ep, ri=\EI, rmso=\Eq,
+	rs2=\Ev\Eq\Ee, sc=\Ej, sgr0=\Eq, smso=\Ep,
+tw100|Toswin VT100 window manager,
+	eo, mir, msgr, xon,
+	colors#8, cols#80, it#8, lines#24, pairs#64, vt#3,
+	acsc=++\,\,--..00II``aaffgghhjjkkllmmnnooppqqrrssttuuvvwwxxy
+	     yzz{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[1m, civis=\Ef,
+	clear=\E[2J\E[H, cnorm=\Ee, cr=\r, csr=\E[%i%p1%d;%p2%dr,
+	cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=\EB,
+	cuf=\E[%p1%dC, cuf1=\EC, cup=\E[%i%p1%d;%p2%dH,
+	cuu=\E[%p1%dA, cuu1=\EA, dch1=\Ea, dim=\E[2m, dl=\E[%p1%dM,
+	dl1=\E[M, ed=\E[J, el=\E[K, el1=\E[1K, home=\E[H, ht=^I,
+	hts=\EH, ich=\E[%p1%d@, il1=\EL, ind=\n, is2=\E<\E)0, kbs=^H,
+	kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kdch1=^?,
+	kf1=\EOP, kf10=\EOY, kf11=\Ep, kf12=\Eq, kf13=\Er, kf14=\Es,
+	kf15=\Et, kf16=\Eu, kf17=\Ev, kf18=\Ew, kf19=\Ex, kf2=\EOQ,
+	kf20=\Ey, kf3=\EOR, kf4=\EOS, kf5=\EOT, kf6=\EOU, kf7=\EOV,
+	kf8=\EOW, kf9=\EOX, khlp=\EH, khome=\E\EE, kich1=\EI,
+	knp=\Eb, kpp=\E\Ea, kund=\EK, ll=\E[24H, nel=\EE,
+	oc=\E[30;47m, op=\E[30;47m, rc=\E8, rev=\E[7m, ri=\EM,
+	rmacs=^O, rmcup=\E[?7h, rmir=\Ei, rmkx=\E[?1l\E>,
+	rmso=\E[m, rmul=\E[m,
+	rs1=\E<\E[20l\E[?3;6;9l\E[r\Eq\E(B\017\E)0\E>,
+	sc=\E7,
+	setb=\E[4%p1%'0'%+%Pa%?%ga%'0'%=%t0%e%ga%'1'%=%t4%e%ga%'2'%=
+	     %t2%e%ga%'3'%=%t6%e%ga%'4'%=%t1%e%ga%'5'%=%t5%e%ga%'6'
+	     %=%t3%e7%;m,
+	setf=\E[3%p1%'0'%+%Pa%?%ga%'0'%=%t0%e%ga%'1'%=%t4%e%ga%'2'%=
+	     %t2%e%ga%'3'%=%t6%e%ga%'4'%=%t1%e%ga%'5'%=%t5%e%ga%'6'
+	     %=%t3%e7%;m,
+	sgr0=\E[m, smacs=^N, smcup=\E[?7l, smir=\Eh,
+	smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m, tbc=\E[3g,
+# The entries for stv52 and stv52pc probably need a revision.
+stv52|MiNT virtual console,
+	am, msgr,
+	cols#80, it#8, lines#30,
+	bel=^G, blink=\Er, bold=\EyA, civis=\Ef, clear=\EE,
+	cnorm=\E. \Ee, cr=\r, cub1=^H, cud1=\EB, cuf1=\EC,
+	cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, cvvis=\E.",
+	dim=\Em, dl1=\EM, ed=\EJ, el=\EK, home=\EH, ht=^I, il1=\EL,
+	ind=\n$<2*/>, kbs=^H, kcub1=\ED, kcud1=\EB, kcuf1=\EC,
+	kcuu1=\EA, kdch1=^?, kf1=\EP, kf10=\EY, kf11=\Ep, kf12=\Eq,
+	kf13=\Er, kf14=\Es, kf15=\Et, kf16=\Eu, kf17=\Ev, kf18=\Ew,
+	kf19=\Ex, kf2=\EQ, kf20=\Ey, kf3=\ER, kf4=\ES, kf5=\ET,
+	kf6=\EU, kf7=\EV, kf8=\EW, kf9=\EX, khlp=\EH, khome=\EE,
+	kich1=\EI, knp=\Eb, kpp=\Ea, kund=\EK, nel=\r\n$<2*/>,
+	op=\Eb@\EcO, rev=\Ep, ri=\EI$<2*/>, rmcup=\Ev\E. \Ee\Ez_,
+	rmso=\Eq, rmul=\EzH, rs1=\Ez_\Eb@\EcA, sgr0=\Ez_,
+	smcup=\Ev\Ee\Ez_, smso=\Ep, smul=\EyH,
+stv52pc|MiNT virtual console with PC charset,
+	am, msgr,
+	cols#80, it#8, lines#30,
+	acsc=+\257\,\256-\^.v0\333I\374`\177a\260f\370g\361h\261j
+	     \331k\277l\332m\300n\305o\377p-q\304r-s_t+u+v+w+x\263y
+	     \363z\362{\343|\366}\234~\371,
+	bel=^G, blink=\Er, bold=\EyA, civis=\Ef, clear=\EE,
+	cnorm=\E. \Ee, cr=\r, cub1=^H, cud1=\EB, cuf1=\EC,
+	cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, cvvis=\E.",
+	dim=\Em, dl1=\EM, ed=\EJ, el=\EK, home=\EH, ht=^I, il1=\EL,
+	ind=\n$<2*/>, kbs=^H, kcub1=\ED, kcud1=\EB, kcuf1=\EC,
+	kcuu1=\EA, kdch1=^?, kf1=\EP, kf10=\EY, kf11=\Ep, kf12=\Eq,
+	kf13=\Er, kf14=\Es, kf15=\Et, kf16=\Eu, kf17=\Ev, kf18=\Ew,
+	kf19=\Ex, kf2=\EQ, kf20=\Ey, kf3=\ER, kf4=\ES, kf5=\ET,
+	kf6=\EU, kf7=\EV, kf8=\EW, kf9=\EX, khlp=\EH, khome=\EE,
+	kich1=\EI, knp=\Eb, kpp=\Ea, kund=\EK, nel=\r\n$<2*/>,
+	rev=\Ep, ri=\EI$<2*/>, rmcup=\Ev\E. \Ee\Ez_, rmso=\Eq,
+	rmul=\EzH, rs1=\Ez_\Eb@\EcA, sgr0=\Ez_, smcup=\Ev\Ee\Ez_,
+	smso=\Ep, smul=\EyH,
+
+# From: Simson L. Garfinkel <simsong@media-lab.mit.edu>
+atari-old|Atari st,
+	OTbs, am,
+	cols#80, it#8, lines#25,
+	clear=\EH\EJ, cub1=\ED, cud1=\EB, cuf1=\EC,
+	cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, dl1=\EM,
+	ed=\EJ, el=\EK, ht=^I, il1=\EL, kcub1=\ED, kcud1=\EB,
+	kcuf1=\EC, kcuu1=\EA, ri=\EI, rmso=\Eq, sgr0=\Eq, smso=\Ep,
+# UniTerm terminal program for the Atari ST:  49-line VT220 emulation mode
+# From: Paul M. Aoki <aoki@ucbvax.berkeley.edu>
+uniterm|uniterm49|UniTerm VT220 emulator with 49 lines,
+	lines#49,
+	is2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h\E[1;49r\E[49;1H, use=vt220-base,
+# MiNT VT52 emulation. 80 columns, 25 rows.
+# MiNT is Now TOS, the operating system which comes with all Ataris now
+# (mainly Atari Falcon). This termcap is for the VT52 emulation you get
+# under tcsh/zsh/bash/sh/ksh/ash/csh when you run MiNT in `console' mode
+# From: Per Persson <pp@gnu.ai.mit.edu>, 27 Feb 1996
+st52-old|Atari ST with VT52 emulation,
+	am, km,
+	cols#80, lines#25,
+	bel=^G, civis=\Ef, clear=\EH\EJ, cnorm=\Ee, cr=\r, cub1=\ED,
+	cud1=\EB, cuf1=\EC, cup=\EY%p1%{32}%+%c%p2%{32}%+%c,
+	cuu1=\EA, dl1=\EM, ed=\EJ, el=\EK, home=\EH, ht=^I, il1=\EL,
+	ind=\n, ka1=\E#7, ka3=\E#5, kb2=\E#9, kbs=^H, kc1=\E#1,
+	kc3=\E#3, kclr=\E#7, kcub1=\E#K, kcud1=\E#P, kcuf1=\E#M,
+	kcuu1=\E#H, kf0=\E#D, kf1=\E#;, kf2=\E#<, kf3=\E#=, kf4=\E#>,
+	kf5=\E#?, kf6=\E#@, kf7=\E#A, kf8=\E#B, kf9=\E#C, khome=\E#G,
+	kil1=\E#R, kind=\E#2, kri=\E#8, lf0=f10, nel=\r\n, rc=\Ek,
+	ri=\EI, rmcup=, rmso=\Eq, rs1=\Ez_\Eb@\EcA, sc=\Ej, sgr0=\Eq,
+	smcup=\Ee, smso=\Ep,
+
+#### BeOS
+#
+# BeOS entry for Terminal program Seems to be almost ANSI
+beterm|BeOS Terminal,
+	am, eo, mir, msgr, xenl, xon,
+	colors#8, cols#80, it#8, lines#25, ncv#5, pairs#64,
+	bel=^G, bold=\E[1m, clear=\E[H\E[J, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M,
+	ech=\E[%p1%dX, ed=\E[J, el=\E[K, el1=\E[1K, home=\E[H,
+	hpa=\E[%i%p1%dG, ht=^I, hts=\EH, ich=\E[%p1%d@, ich1=\E[@,
+	il=\E[%p1%dL, il1=\E[L, ind=\n, kbs=^H, kcub1=\E[D,
+	kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kf1=\E[11~,
+	kf10=\E[20~, kf11=\E[21~, kf12=\E[22~, kf2=\E[12~,
+	kf3=\E[13~, kf4=\E[14~, kf5=\E[15~, kf6=\E[16~, kf7=\E[17~,
+	kf8=\E[18~, kf9=\E[19~, kspd=^Z, nel=\r\n, op=\E[m, rc=\E8,
+	rev=\E[7m, ri=\EM, rmir=\E[4l, rmkx=\E[?4l, rmso=\E[m,
+	rmul=\E[24m, rs1=\Ec, sc=\E7, setab=\E[4%p1%dm,
+	setaf=\E[3%p1%dm, setb=\E[%p1%{40}%+%cm,
+	setf=\E[%p1%{30}%+%cm, sgr0=\E[0;10m, smir=\E[4h,
+	smkx=\E[?4h, smso=\E[7m, smul=\E[4m,
+	u6=\E[%i%p1%d;%p2%dR, u7=\E[6n, vpa=\E[%i%p1%dd,
+	use=vt220+pcedit,
+
+#### Linux consoles
+#
+
+# release 1.2.13: 1995/03
+#
+# This entry is good for the 1.2.13 or later version of the Linux console.
+#
+# ***************************************************************************
+# *                                                                         *
+# *                           WARNING:                                      *
+# * Linuxes come with a default keyboard mapping kcbt=^I.  This entry, in   *
+# * response to user requests, assumes kcbt=\E[Z, the ANSI/ECMA reverse-tab *
+# * character. Here are the keymap replacement lines that will set this up: *
+# *                                                                         *
+#	keycode  15 = Tab             Tab
+#		alt     keycode  15 = Meta_Tab
+#		shift	keycode  15 = F26
+#	string F26 ="\033[Z"
+# *                                                                         *
+# * This has to use a key slot which is unfortunate (any unused one will    *
+# * do, F26 is the higher-numbered one).  The change ought to be built      *
+# * into the kernel tables.                                                 *
+# *                                                                         *
+# ***************************************************************************
+#
+# All linux kernels since 1.2.13 (at least) set the screen size
+# themselves; this entry assumes that capability.
+#
+linux-basic|Linux console (basic),
+	am, bce, eo, mir, msgr, xenl, xon,
+	it#8, ncv#18, U8#1,
+	acsc=+\020\,\021-\030.^Y0\333`\004a\261f\370g\361h\260i
+	     \316j\331k\277l\332m\300n\305o~p\304q\304r\304s_t\303u
+	     \264v\301w\302x\263y\363z\362{\343|\330}\234~\376,
+	bel=^G, clear=\E[H\E[J, cr=\r, csr=\E[%i%p1%d;%p2%dr,
+	cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=\n,
+	cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH,
+	cuu=\E[%p1%dA, cuu1=\E[A, dch=\E[%p1%dP, dch1=\E[P,
+	dim=\E[2m, dl=\E[%p1%dM, dl1=\E[M, ech=\E[%p1%dX, ed=\E[J,
+	el=\E[K, el1=\E[1K, flash=\E[?5h$<200/>\E[?5l, home=\E[H,
+	hpa=\E[%i%p1%dG, ht=^I, hts=\EH, ich=\E[%p1%d@, ich1=\E[@,
+	il=\E[%p1%dL, il1=\E[L, ind=\n, kb2=\E[G, kbs=^?, kcbt=\E[Z,
+	kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kf1=\E[[A,
+	kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf2=\E[[B,
+	kf3=\E[[C, kf4=\E[[D, kf5=\E[[E, kf6=\E[17~, kf7=\E[18~,
+	kf8=\E[19~, kf9=\E[20~, kmous=\E[M, kspd=^Z, nel=\r\n,
+	rc=\E8, rev=\E[7m, ri=\EM, rmam=\E[?7l, rmir=\E[4l,
+	rmso=\E[27m, rmul=\E[24m, rs1=\Ec\E]R, sc=\E7,
+	sgr=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5
+	    %t;2%;%?%p6%t;1%;%?%p9%t;11%;m,
+	smam=\E[?7h, smir=\E[4h, smul=\E[4m, tbc=\E[3g,
+	vpa=\E[%i%p1%dd, use=vt220+pcedit, use=vt102+enq,
+	use=klone+sgr, use=ecma+color, use=linux+sfkeys,
+
+linux+decid|ncurses extension for Linux console DECID,
+	u8=\E[?6c, use=decid+cpr,
+
+linux+sfkeys|shifted function-keys for Linux console,
+	kf13=\E[25~, kf14=\E[26~, kf15=\E[28~, kf16=\E[29~,
+	kf17=\E[31~, kf18=\E[32~, kf19=\E[33~, kf20=\E[34~,
+
+linux-m|Linux console no color,
+	colors@, pairs@,
+	setab@, setaf@, setb@, setf@, use=linux,
+
+# release 1.3: 1995/06
+#
+# The 1.3.x kernels add color-change capabilities; if yours doesn't have this
+# and it matters, turn off <ccc>.  The %02x escape used to implement this is
+# not supposedly back-portable to older SV curses (although it has worked fine
+# on Solaris for several years) and not supported in ncurses versions before
+# 1.9.9.
+linux-c-nc|Linux console with color-change,
+	ccc,
+	initc=\E]P%p1%x%p2%{255}%*%{1000}%/%02x%p3%{255}%*%{1000}%/
+	      %02x%p4%{255}%*%{1000}%/%02x,
+	oc=\E]R, use=linux-basic,
+# From: Dennis Henriksen <opus@osrl.dk>, 9 July 1996
+linux-c|Linux console 1.3.6+ for older ncurses,
+	ccc,
+	initc=\E]P%?%p1%{9}%>%t%p1%{10}%-%'a'%+%c%e%p1%d%;%p2%{255}
+	      %*%{1000}%/%Pr%gr%{16}%/%Px%?%gx%{9}%>%t%gx%{10}%-%'a'
+	      %+%c%e%gx%d%;%gr%{15}%&%Px%?%gx%{9}%>%t%gx%{10}%-%'a'
+	      %+%c%e%gx%d%;%p3%{255}%*%{1000}%/%Pr%gr%{16}%/%Px%?%gx
+	      %{9}%>%t%gx%{10}%-%'a'%+%c%e%gx%d%;%gr%{15}%&%Px%?%gx
+	      %{9}%>%t%gx%{10}%-%'a'%+%c%e%gx%d%;%p4%{255}%*%{1000}
+	      %/%Pr%gr%{16}%/%Px%?%gx%{9}%>%t%gx%{10}%-%'a'%+%c%e%gx
+	      %d%;%gr%{15}%&%Px%?%gx%{9}%>%t%gx%{10}%-%'a'%+%c%e%gx
+	      %d%;,
+	oc=\E]R, use=linux-basic,
+
+# release 2.2: 1999/01
+#
+# The 2.2.x kernels add a private mode that sets the cursor type; use that to
+# get a block cursor for cvvis.
+# reported by Frank Heckenbach <frank@g-n-u.de>.
+linux2.2|Linux 2.2.x console,
+	civis=\E[?25l\E[?1c, cnorm=\E[?25h\E[?0c,
+	cvvis=\E[?25h\E[?8c, use=linux-c-nc,
+
+# release 2.6: 2003/12 - 2004/12
+#
+# Linux 2.6.x has a fix for SI/SO to work with UTF-8 encoding added here:
+#	http://lkml.iu.edu/hypermail/linux/kernel/0602.2/0738.html
+# Although the kernel has mappings for these, they were not in the default
+# font (tested with Debian and Fedora):
+#	'`' diamond
+#	'~' scan line 1
+#	'p' scan line 3
+#	'r' scan line 7
+#	'_' scan line 9
+#
+# The fix for SI/SO is part of a configurable (i.e., "optional") kernel feature
+# misleadingly called CONFIG_CONSOLE_TRANSLATIONS.  Disabling that not only
+# omits the line-drawing using SI/SO, but also part/all of the Unicode feature:
+#
+#    https://cateee.net/lkddb/web-lkddb/CONSOLE_TRANSLATIONS.html
+#	"This enables support for font mapping and Unicode translation on virtual consoles."
+#
+# This mailing list thread in July 2008 illustrates:
+#
+#    https://marc.info/?t=121734656700005&r=1&w=4
+#	"commit a29ccf6f823a84d89e1c7aaaf221cf7282022024 break console on slackware 12.1"
+#
+# The change which made it configurable was to reduce the size for use in
+# embedded systems.  Some background is found in
+#
+#    https://lwn.net/Articles/284767/
+#	"An interview with the new embedded maintainers"
+linux2.6|Linux 2.6.x console,
+	acsc=++\,\,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxy
+	     yzz{{||}}~~,
+	enacs=\E)0, rmacs=^O,
+	sgr=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5
+	    %t;2%;%?%p6%t;1%;m%?%p9%t\016%e\017%;,
+	sgr0=\E[m\017, smacs=^N, use=linux2.2,
+
+# The 3.0 kernel adds support for clearing scrollback buffer (capability E3).
+# It is the same as xterm's erase-saved-lines feature.
+#
+# Linux 3.0 was released in July 2011.  The keyboard utilities (kbd) are
+# used for configuring its keyboard mappings.
+#
+# kbd 1.14 was released before that (January 2008), but due to its placement
+# late in the Linux 2.6.x series had no immediate effect for most users.  That
+# provided a default mapping for shift-tab to the (misnamed) Meta_Tab, i.e.,
+# the same as Alt-Tab.
+#
+# The suggested mapping for the conventional \E[Z is provided in this entry as
+# an extended key to lessen user surprise -TD
+linux3.0|Linux 3.0 kernels,
+	kcbt=\E^I, E3=\E[3J, kcbt2=\E[Z, use=linux2.6,
+
+# This is Linux console for ncurses.
+linux|Linux console,
+	use=linux3.0,
+
+# Subject: linux 2.6.26 vt back_color_erase
+# Changes to the Linux console driver broke bce model as reported in
+#	https://bugzilla.novell.com/show_bug.cgi?id=418613
+# apparently from
+#	http://lkml.org/lkml/2008/4/26/305
+#	http://lkml.org/lkml/2008/10/3/66
+linux2.6.26|Linux console w/o bce,
+	bce@, use=linux2.6,
+
+# See the note on ICH/ICH1 VERSUS RMIR/SMIR near the end of file
+linux-nic|Linux with ich/ich1 suppressed for non-curses programs,
+	ich@, ich1@, use=linux,
+
+# This assumes you have used setfont(8) to load one of the Linux koi8-r fonts.
+# acsc entry from Pavel Roskin" <pavel@absolute.spb.su>, 29 Sep 1997.
+linux-koi8|Linux with koi8 alternate character set,
+	acsc=+\020\,\021-\030.^Y0\215`\004a\221f\234g\237h\220i
+	     \276j\205k\203l\202m\204n\212o~p\0q\0r\0s_t\206u\207v
+	     \211w\210x\201y\230z\231{\267|\274~\224,
+	use=linux, use=klone+koi8acs,
+
+# Another entry for KOI8-r with Qing Long's acsc.
+# (which one better complies with the standard?)
+linux-koi8r|Linux with koi8-r alternate character set,
+	use=linux, use=klone+koi8acs,
+
+# Entry for the latin1 and latin2 fonts
+linux-lat|Linux with latin1 or latin2 alternate character set,
+	acsc=+\020\,\021-\030.^Y0\333`\004a\013f\370g\361h\260i
+	     \316j\211k\214l\206m\203n\305o~p\304q\212r\304s_t\207u
+	     \215v\301w\302x\205y\363z\362{\343|\330}\234~\376,
+	use=linux,
+
+# This uses graphics from VT codeset instead of from cp437.
+# reason: cp437 (aka "straight to font") is not functional under luit.
+# from: Andrey V Lukyanov <land@long.yar.ru>.
+linux-vt|Linux console using VT codes for graphics,
+	acsc=++\,\,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxy
+	     yzz~~,
+	rmacs=\E(K, rmpch@, sgr@, sgr0=\E[0m\E(K\017, smacs=\E(0,
+	smpch@, use=linux,
+
+# release: 0.3.9b 1997/01 to 2000/05
+#
+# This is based on the Linux console (relies on the console to perform some
+# of the functionality), but does not recognize as many control sequences.
+# The program comes bundled with an old (circa 1998) copy of the Linux
+# console terminfo.  It recognizes some non-ANSI/VT100 sequences such as
+#	\E*	move cursor to home, as as \E[H
+#	\E,X	same as \E(X
+#	\EE	move cursor to beginning of row
+#	\E[y,xf	same as \E[y,xH
+#
+# Note: The status-line support is buggy (dsl does not work).
+kon|kon2|Kanji ON Linux console,
+	am, bce, ccc, eo, eslok, hs, mir, msgr, xenl, xon,
+	colors#8, it#8, ncv#18, pairs#64,
+	acsc=+\020\,\021-\030.^Y0\333`\004a\261f\370g\361h\260j
+	     \331k\277l\332m\300n\305o~p\304q\304r\304s_t\303u\264v
+	     \301w\302x\263y\363z\362{\343|\330}\234~\376,
+	bel=^G, blink=\E[5m, bold=\E[1m, civis=\E[?25l,
+	clear=\E[H\E[J, cnorm=\E[?25h, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m, dl=\E[%p1%dM,
+	dl1=\E[M, dsl=\E[?H\E[?E, ed=\E[J, el=\E[K, el1=\E[1K,
+	fsl=\E[?F, home=\E[H, hpa=\E[%i%p1%dG, ht=^I, hts=\EH,
+	ich=\E[%p1%d@, ich1=\E[@, il=\E[%p1%dL, il1=\E[L, ind=\n,
+	initc=\E]P%p1%x%p2%02x%p3%02x%p4%02x, invis=\E[8m,
+	kb2=\E[G, kbs=^?, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C,
+	kcuu1=\E[A, kdch1=\E[3~, kend=\E[4~, kf1=\E[[A,
+	kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\E[25~,
+	kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, kf17=\E[31~,
+	kf18=\E[32~, kf19=\E[33~, kf2=\E[[B, kf20=\E[34~,
+	kf3=\E[[C, kf4=\E[[D, kf5=\E[[E, kf6=\E[17~, kf7=\E[18~,
+	kf8=\E[19~, kf9=\E[20~, khome=\E[1~, kich1=\E[2~,
+	knp=\E[6~, kpp=\E[5~, kspd=^Z, nel=\r\n, op=\E[37;40m,
+	rc=\E8, rev=\E[7m, ri=\EM, rmacs=\E[10m, rmir=\E[4l,
+	rmpch=\E[10m, rmso=\E[27m, rmul=\E[24m, rs1=\Ec, sc=\E7,
+	setab=\E[4%p1%dm, setaf=\E[3%p1%dm,
+	sgr=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5
+	    %t;2%;%?%p6%t;1%;%?%p7%t;8%;%?%p9%t;11%;m,
+	sgr0=\E[0;10m, smacs=\E[11m, smir=\E[4h, smpch=\E[11m,
+	smso=\E[7m, smul=\E[4m, tbc=\E[3g, tsl=\E[?T, u8=\E[?6c,
+	vpa=\E[%i%p1%dd, use=ansi+enq,
+
+# release: 0.4.7 2005/05
+#
+jfbterm|japanese framebuffer terminal,
+	acsc=++\,\,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxy
+	     yzz{{||}}~~,
+	sgr0=\E[0m, use=kon,
+
+# FbTerm
+# Another variant.  There are two parts (src, src/lib) with the latter
+# comprising the escape-sequence parsing.  The copyright notice on that
+# says it is based on GTerm by Timothy Miller.
+#
+# The original developer "dragchan" has left, but as of March 2017 there is
+# (still dead) code from May 2015 here:
+#	https://github.com/izmntuk/fbterm
+#
+# The acsc string may be incorrect.
+#
+# Not used here, the program recognizes escapes for italic, underline and
+# dim, rendering those as green, cyan and gray respectively.
+fbterm|FbTerm for Linux with framebuffer,
+	colors#0x100, pairs#0x10000,
+	acsc=+\020\,\021-\030.^Y0\333`\004a\261f\370g\361h\260i
+	     \316j\331k\277l\332m\300n\305o~p\304q\304r\304s_t\303u
+	     \264v\301w\302x\263y\363z\362{\343|\330}\234~\376,
+	initc=\E[3;%p1%d;%p2%d;%p3%d;%p4%d}, rmacs=\E[10m,
+	setab=\E[2;%p1%d}, setaf=\E[1;%p1%d},
+	sgr=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5
+	    %t;2%;%?%p6%t;1%;%?%p9%t;11%;m,
+	sgr0=\E[0;10m, smacs=\E[11m, use=linux,
+
+# 16-color linux console entry; this works with a 256-character
+# console font but bright background colors turn into dim ones when
+# you use a 512-character console font. This uses bold for bright
+# foreground colors and blink for bright background colors.
+#
+# Interestingly, the original version of this entry in 2009 used a documented
+# (but nonstandard) SGR 21, which was supported in the Linux console since 1992
+# as an equivalent for SGR 22.  Long after (early 2018), someone modified the
+# console driver to make it ignore SGR 21 because the ECMA-48 standard
+# suggested a different use for that particular code:
+#
+# https://github.com/torvalds/linux/commit/65d9982d7e523a1a8e7c9af012da0d166f72fc56#diff-7da3c215d12c9f6b88e1a37d38b116f0
+#
+# Two years later, someone (unfamiliar with ECMA-48 this time) documented it:
+#
+# https://git.kernel.org/pub/scm/docs/man-pages/man-pages.git/commit/man4/console_codes.4?id=a133a6bc03d751a424fe0a4adea2198757599615
+#
+# For background, refer to the report on bug-ncurses:
+#
+# https://lists.gnu.org/archive/html/bug-ncurses/2019-10/msg00059.html
+linux-16color|Linux console with 16 colors,
+	colors#16, ncv#42, pairs#0x100,
+	setab=\E[4%p1%{8}%m%d%?%p1%{7}%>%t;5%e;25%;m,
+	setaf=\E[3%p1%{8}%m%d%?%p1%{7}%>%t;1%e;22%;m,
+	use=linux,
+
+# bterm (bogl 0.1.18)
+# Implementation is in bogl-term.c
+# Key capabilities from linux terminfo entry
+#
+# Notes:
+# bterm only supports acs using wide-characters, has case for these: qjxamlkut
+# bterm does not support sgr, since it only processes one parameter -TD
+bterm|bogl virtual terminal,
+	am, bce,
+	colors#8, cols#80, lines#24, pairs#64,
+	acsc=aajjkkllmmqqttuuxx, bold=\E[1m, clear=\E[H\E[2J,
+	cr=\r, cub1=^H, cud1=\n, cup=\E[%i%p1%d;%p2%dH, ed=\E[J,
+	el=\E[K, home=\E[H, ind=\n, kb2=\E[G, kbs=^?, kcbt=\E[Z,
+	kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kf1=\E[[A,
+	kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\E[25~,
+	kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, kf17=\E[31~,
+	kf18=\E[32~, kf19=\E[33~, kf2=\E[[B, kf20=\E[34~,
+	kf3=\E[[C, kf4=\E[[D, kf5=\E[[E, kf6=\E[17~, kf7=\E[18~,
+	kf8=\E[19~, kf9=\E[20~, kmous=\E[M, kspd=^Z, nel=\r\n,
+	op=\E[49m\E[39m, rev=\E[7m, ri=\EM, rmacs=^O, rmso=\E[27m,
+	rmul=\E[24m, setab=\E[4%p1%dm, setaf=\E[3%p1%dm,
+	sgr0=\E[0m, smacs=^N, smso=\E[7m, smul=\E[4m,
+	use=vt220+pcedit, use=vt220+cvis,
+
+#### Mach
+#
+
+# From: Matthew Vernon <mcv21@pick.sel.cam.ac.uk>
+mach|Mach console,
+	am, km, NQ,
+	cols#80, it#8, lines#25,
+	bel=^G, blink=\E[5m, bold=\E[1m, clear=\Ec, cr=\r,
+	cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=\n,
+	cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH,
+	cuu=\E[%p1%dA, cuu1=\E[A, dl=\E[%p1%dM, dl1=\E[M, ed=\E[J,
+	el=\E[K, home=\E[H, ht=^I, il=\E[%p1%dL, il1=\E[L, ind=\n,
+	kbs=^?, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A,
+	kdch1=\E[9, kend=\E[Y, kf1=\EOP, kf10=\EOY, kf2=\EOQ,
+	kf3=\EOR, kf4=\EOS, kf5=\EOT, kf6=\EOU, kf7=\EOV, kf8=\EOW,
+	kf9=\EOX, khome=\E[H, kich1=\E[@, kll=\E[F, knp=\E[U,
+	kpp=\E[V, rev=\E[7m, rmso=\E[0m, rmul=\E[24m, sgr0=\E[0m,
+	smso=\E[7m, smul=\E[4m,
+mach-bold|Mach console with bold instead of underline,
+	rmul=\E[0m, smul=\E[1m, use=mach,
+mach-color|Mach console with ANSI color,
+	colors#8, pairs#64,
+	dim=\E[2m, invis=\E[8m, op=\E[37;40m, rmso=\E[27m,
+	setab=\E[4%p1%dm, setaf=\E[3%p1%dm, use=mach,
+
+# From: Samuel Thibault
+# Source: git://git.sv.gnu.org/hurd/gnumach.git
+# Files: i386/i386at/kd.c
+#
+# Added nel, hpa, sgr and removed rmacs, smacs based on source -TD
+mach-gnu|GNU Mach,
+	acsc=+>\,<-\^.v0\333`+a\261f\370g\361h\260i#j\331k\277l
+	     \332m\300n\305o~p\304q\304r\304s_t\303u\264v\301w\302x
+	     \263y\363z\362{\343|\330}\234~\376,
+	dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m, ech=\E[%p1%dX,
+	el1=\E[1K, hpa=\E[%i%p1%dG, ich=\E[%p1%d@, ich1=\E[@,
+	invis=\E[8m, nel=\EE,
+	sgr=\E[0%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5%t;
+	    2%;%?%p6%t;1%;%?%p7%t;8%;m,
+	use=ecma+index, use=mach,
+
+mach-gnu-color|GNU Mach console with ANSI color,
+	colors#8, pairs#64,
+	op=\E[37;40m, rmso=\E[27m, setab=\E[4%p1%dm,
+	setaf=\E[3%p1%dm, use=mach-gnu,
+
+# From: Marcus Brinkmann
+# http://git.savannah.gnu.org/cgit/hurd/hurd.git/log/console/
+#
+# Comments in the original are summarized here:
+#
+# hurd uses 8-bit characters (km).
+#
+# Although it doesn't do XON/XOFF, we don't want padding characters (xon).
+#
+# Regarding compatibility to vt100:  hurd doesn't specify <xenl>, as we don't
+# have the eat_newline_glitch.  It doesn't support setting or removing tab
+# stops (hts/tbc).
+#
+# hurd uses ^H instead of \E[D for cub1, as only ^H implements <bw> and it is
+# one byte instead three.
+#
+# <ich1> is not included because hurd has insert mode.
+#
+# hurd doesn't use ^J for scrolling, because this could put things into the
+# scrollback buffer.
+#
+# gsbom/grbom are used to enable/disable real bold (not intensity bright) mode.
+# This is a GNU extension.
+#
+# The original has commented-out ncv, but is restored here.
+#
+# Reading the source, RIS resets cnorm, but not xmous.
+hurd|The GNU Hurd console server,
+	am, bce, bw, eo, km, mir, msgr, xenl, xon, NQ,
+	colors#8, it#8, ncv#18, pairs#64,
+	acsc=++\,\,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxy
+	     yzz{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, clear=\Ec, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\E[B, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	cvvis=\E[34l, dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m,
+	dl=\E[%p1%dM, dl1=\E[M, ech=\E[%p1%dX, ed=\E[J, el=\E[K,
+	el1=\E[1K, flash=\Eg, home=\E[H, hpa=\E[%i%p1%dG, ht=^I,
+	ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[L, ind=\E[S,
+	invis=\E[8m, kb2=\E[G, kbs=^?, kcbt=\E[Z, kcub1=\EOD,
+	kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kf1=\EOP, kf10=\E[21~,
+	kf11=\E[23~, kf12=\E[24~, kf13=\E[25~, kf14=\E[26~,
+	kf15=\E[28~, kf16=\E[29~, kf17=\E[31~, kf18=\E[32~,
+	kf19=\E[33~, kf2=\EOQ, kf20=\E[34~, kf3=\EOR, kf4=\EOS,
+	kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~,
+	kich1=\E[2~, kmous=\E[M, kspd=^Z, nel=\r\n, op=\E[39;49m,
+	rc=\E8, rev=\E[7m, ri=\E[T, rmacs=\E[10m, rmir=\E[4l,
+	rmso=\E[27m, rmul=\E[24m, rs1=\EM\E[?1000l, sc=\E7,
+	setab=\E[4%p1%dm, setaf=\E[3%p1%dm,
+	sgr=\E[0%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5%t;
+	    2%;%?%p6%t;1%;%?%p7%t;8%;%?%p9%t;11%;m,
+	sgr0=\E[0m, smacs=\E[11m, smir=\E[4h, smso=\E[7m,
+	smul=\E[4m, vpa=\E[%i%p1%dd, grbom=\E[>1l, gsbom=\E[>1h,
+	use=vt220+pcedit, use=ecma+index, use=ecma+italics,
+	use=vt220+cvis,
+
+#### QNX
+#
+
+# QNX 4.0 Console
+# Michael's original version of this entry had <am@>, <smcup=\Ei>,
+# <rmcup=\Eh\ER>; this was so terminfo applications could write the lower
+# right corner without triggering a scroll.  The ncurses terminfo library can
+# handle this case with the <ich1> capability, and prefers <am> for better
+# optimization.  Bug: The <op> capability resets attributes.
+# From: Michael Hunter <mphunter@qnx.com> 30 Jul 1996
+# (removed: <sgr=%?%p1%t\E<%;%p2%t\E[%;%p3%t\E(%;%p4%t\E{%;%p6%t\E<%;,>)
+qnx|qnx4|QNX console,
+	daisy, km, mir, msgr, xhpa, xt,
+	colors#8, cols#80, it#4, lines#25, ncv#3, pairs#8,
+	acsc=O\333a\261j\331k\277l\332m\300n\305o\337q\304s\334t
+	     \303u\264v\301w\302x\263,
+	bel=^G, blink=\E{, bold=\E<, civis=\Ey0, clear=\EH\EJ,
+	cnorm=\Ey1, cr=\r, cub1=^H, cud1=\n, cuf1=\EC,
+	cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, cvvis=\Ey2,
+	dch1=\Ef, dl1=\EF, ed=\EJ, el=\EK, home=\EH, ht=^I, ich1=\Ee,
+	il1=\EE, ind=\n, kBEG=\377\356, kCAN=\377\263,
+	kCMD=\377\267, kCPY=\377\363, kCRT=\377\364,
+	kDL=\377\366, kEND=\377\301, kEOL=\377\311,
+	kEXT=\377\367, kFND=\377\370, kHLP=\377\371,
+	kHOM=\377\260, kIC=\377\340, kLFT=\377\264,
+	kMOV=\377\306, kMSG=\377\304, kNXT=\377\272,
+	kOPT=\377\372, kPRT=\377\275, kPRV=\377\262,
+	kRDO=\377\315, kRES=\377\374, kRIT=\377\266,
+	kRPL=\377\373, kSAV=\377\307, kSPD=\377\303,
+	kUND=\377\337, kbeg=\377\300, kcan=\377\243, kcbt=\377\0,
+	kclo=\377\343, kclr=\377\341, kcmd=\377\245,
+	kcpy=\377\265, kcrt=\377\305, kctab=\377\237,
+	kcub1=\377\244, kcud1=\377\251, kcuf1=\377\246,
+	kcuu1=\377\241, kdch1=\377\254, kdl1=\377\274,
+	ked=\377\314, kel=\377\310, kend=\377\250, kent=\377\320,
+	kext=\377\270, kf1=\377\201, kf10=\377\212,
+	kf11=\377\256, kf12=\377\257, kf13=\377\213,
+	kf14=\377\214, kf15=\377\215, kf16=\377\216,
+	kf17=\377\217, kf18=\377\220, kf19=\377\221,
+	kf2=\377\202, kf20=\377\222, kf21=\377\223,
+	kf22=\377\224, kf23=\377\333, kf24=\377\334,
+	kf25=\377\225, kf26=\377\226, kf27=\377\227,
+	kf28=\377\230, kf29=\377\231, kf3=\377\203,
+	kf30=\377\232, kf31=\377\233, kf32=\377\234,
+	kf33=\377\235, kf34=\377\236, kf35=\377\276,
+	kf36=\377\277, kf37=\377\321, kf38=\377\322,
+	kf39=\377\323, kf4=\377\204, kf40=\377\324,
+	kf41=\377\325, kf42=\377\326, kf43=\377\327,
+	kf44=\377\330, kf45=\377\331, kf46=\377\332,
+	kf47=\377\316, kf48=\377\317, kf5=\377\205, kf6=\377\206,
+	kf7=\377\207, kf8=\377\210, kf9=\377\211, kfnd=\377\346,
+	khlp=\377\350, khome=\377\240, khts=\377\342,
+	kich1=\377\253, kil1=\377\273, kind=\377\261,
+	kmov=\377\351, kmrk=\377\355, kmsg=\377\345,
+	knp=\377\252, knxt=\377\312, kopn=\377\357,
+	kopt=\377\353, kpp=\377\242, kprt=\377\255,
+	kprv=\377\302, krdo=\377\336, kref=\377\354,
+	kres=\377\360, krfr=\377\347, kri=\377\271,
+	krmir=\377\313, krpl=\377\362, krst=\377\352,
+	ksav=\377\361, kslt=\377\247, kspd=\377\335,
+	ktbc=\377\344, kund=\377\365, mvpa=\E!%p1%02d, op=\ER,
+	rep=\Eg%p2%{32}%+%c%p1%c, rev=\E(, ri=\EI, rmcup=\Eh\ER,
+	rmso=\E), rmul=\E], rs1=\ER, setb=\E@%p1%Pb%gb%gf%d%d,
+	setf=\E@%p1%Pf%gb%gf%d%d, sgr0=\E}\E]\E>\E), smcup=\Ei,
+	smso=\E(, smul=\E[,
+#
+#
+qnxt|qnxt4|QNX4 terminal,
+	crxm, use=qnx4,
+#
+qnxm|QNX4 with mouse events,
+	maddr#1,
+	chr=\E/, cvr=\E", is1=\E/0t, mcub=\E/>1h, mcub1=\E/>7h,
+	mcud=\E/>1h, mcud1=\E/>1l\E/>9h, mcuf=\E/>1h\E/>9l,
+	mcuf1=\E/>7l, mcuu=\E/>6h, mcuu1=\E/>6l, rmicm=\E/>2l,
+	smicm=\E/>2h, use=qnx4,
+#
+qnxw|QNX4 windows,
+	xvpa, use=qnxm,
+#
+#	Monochrome QNX4 terminal or console. Setting this terminal type will
+#	allow an application running on a color console to behave as if it
+#	were a monochrome terminal. Output will be through stdout instead of
+#	console writes because the term routines will recognize that the
+#	terminal name starts with 'qnxt'.
+#
+qnxtmono|Monochrome QNX4 terminal or console,
+	colors@, pairs@,
+	scp@, use=qnx4,
+
+# From: Federico Bianchi <bianchi@pc-arte2.arte.unipi.it>, 1 Jul 1998
+# (esr: commented out <scp> and <rmcup> to avoid warnings.)
+# (TD: derive from original qnx4 entry)
+qnxt2|QNX 2.15 serial terminal,
+	am,
+	civis@, cnorm@, cvvis@, dch1@, ich1@, kRES@, kRPL@, kUND@, kspd@,
+	rep@, rmcup@, rmso=\E>, setb@, setf@, smcup@, smso=\E<, use=qnx4,
+
+# QNX ANSI terminal definition
+qansi-g|QNX ANSI,
+	am, eslok, hs, xon,
+	colors#8, cols#80, it#8, lines#25, ncv#19, pairs#64, wsl#80,
+	acsc=Oa``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, clear=\E[2J\E[H,
+	cr=\r, csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=\E[D,
+	cud=\E[%p1%dB, cud1=\E[B, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH$<5>, cuu=\E[%p1%dA, cuu1=\E[A,
+	cvvis=\E[?12;25h, dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m,
+	dl=\E[%p1%dM, dl1=\E[1M, dsl=\E[r, ech=\E[%p1%dX, ed=\E[J,
+	el=\E[K, el1=\E[1K\E[X, flash=\E[?5h$<200>\E[?5l,
+	fsl=\E[?6h\E8, home=\E[H, hpa=\E[%i%p1%dG, ht=^I, hts=\EH,
+	ich=\E[%p1%d@, ich1=\E[1@, il=\E[%p1%dL, il1=\E[1L,
+	ind=\E[S, invis=\E[9m,
+	is2=\E>\E[?1l\E[?7h\E[0;10;39;49m, is3=\E(B\E)0,
+	kBEG=\ENn, kCAN=\E[s, kCMD=\E[t, kCPY=\ENs, kCRT=\ENt,
+	kDL=\ENv, kEXT=\ENw, kFND=\ENx, kHLP=\ENy, kHOM=\E[h,
+	kLFT=\E[d, kNXT=\E[u, kOPT=\ENz, kPRV=\E[v, kRIT=\E[c,
+	kbs=^H, kcan=\E[S, kcbt=\E[Z, kclo=\ENc, kclr=\ENa,
+	kcmd=\E[G, kcpy=\E[g, kctab=\E[z, kcub1=\E[D, kcud1=\E[B,
+	kcuf1=\E[C, kcuu1=\E[A, kdch1=\E[P, kdl1=\E[p, kend=\E[Y,
+	kext=\E[y, kf1=\EOP, kf10=\EOY, kf11=\EOZ, kf12=\EOA,
+	kf13=\EOp, kf14=\EOq, kf15=\EOr, kf16=\EOs, kf17=\EOt,
+	kf18=\EOu, kf19=\EOv, kf2=\EOQ, kf20=\EOw, kf21=\EOx,
+	kf22=\EOy, kf23=\EOz, kf24=\EOa, kf25=\E[1~, kf26=\E[2~,
+	kf27=\E[3~, kf28=\E[4~, kf29=\E[5~, kf3=\EOR, kf30=\E[6~,
+	kf31=\E[7~, kf32=\E[8~, kf33=\E[9~, kf34=\E[10~,
+	kf35=\E[11~, kf36=\E[12~, kf37=\E[17~, kf38=\E[18~,
+	kf39=\E[19~, kf4=\EOS, kf40=\E[20~, kf41=\E[21~,
+	kf42=\E[22~, kf43=\E[23~, kf44=\E[24~, kf45=\E[25~,
+	kf46=\E[26~, kf47=\E[27~, kf48=\E[28~, kf5=\EOT, kf6=\EOU,
+	kf7=\EOV, kf8=\EOW, kf9=\EOX, kfnd=\ENf, khlp=\ENh,
+	khome=\E[H, khts=\ENb, kich1=\E[@, kil1=\E[`, kind=\E[a,
+	kmov=\ENi, kmrk=\ENm, kmsg=\ENe, knp=\E[U, kopn=\ENo,
+	kopt=\ENk, kpp=\E[V, kref=\ENl, kres=\ENp, krfr=\ENg,
+	kri=\E[b, krpl=\ENr, krst=\ENj, ksav=\ENq, kslt=\E[T,
+	ktbc=\ENd, kund=\ENu, ll=\E[99H, nel=\EE, op=\E[39;49m,
+	rev=\E[7m, ri=\E[T, rmacs=^O, rmam=\E[?7l, rmso=\E[27m,
+	rmul=\E[24m, rs1=\017\E[?7h\E[0;39;49m$<2>\E>\E[?1l,
+	rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h,
+	setb=\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}
+	     %=%t3%e%p1%d%;m,
+	setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}
+	     %=%t3%e%p1%d%;m,
+	sgr=\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;%?%p4%t;5%;%?%p3%p1
+	    %|%t;7%;%?%p7%t;9%;m%?%p9%t\016%e\017%;,
+	sgr0=\E[m\017, smacs=^N, smam=\E[?7h, smso=\E[7m,
+	smul=\E[4m, tbc=\E[3g,
+	tsl=\E7\E1;24r\E[?6l\E[25;%i%p1%dH, use=decid+cpr,
+	use=ansi+rep, use=att610+cvis0, use=ecma+index,
+#
+qansi|QNX ANSI with console writes,
+	daisy, xhpa, use=qansi-g,
+#
+qansi-t|QNX ANSI without console writes,
+	crxm, use=qansi,
+#
+qansi-m|QNX ANSI with mouse,
+	maddr#1,
+	chr=\E[, cvr=\E], is1=\E[0t, mcub=\E[>1h, mcub1=\E[>7h,
+	mcud=\E[>1h, mcud1=\E[>1l\E[>9h, mcuf=\E[>1h\E[>9l,
+	mcuf1=\E[>7l, mcuu=\E[>6h, mcuu1=\E[>6l, rmicm=\E[>2l,
+	smicm=\E[>2h, use=qansi,
+#
+qansi-w|QNX ANSI for windows,
+	xvpa, use=qansi-m,
+
+#### SCO consoles
+
+# SCO console and SOS-Syscons console for 386bsd
+# (scoansi: had unknown capabilities
+#	:Gc=N:Gd=K:Gh=M:Gl=L:Gu=J:Gv=\072:\
+#	:GC=E:GD=B:GH=D:GL=\64:GU=A:GV=\63:GR=C:
+#	:G1=?:G2=Z:G3=@:G4=Y:G5=;:G6=I:G7=H:G8=<:\
+#	:CW=\E[M:NU=\E[N:RF=\E[O:RC=\E[P:\
+#	:WL=\E[S:WR=\E[T:CL=\E[U:CR=\E[V:\
+# I renamed GS/GE/HM/EN/PU/PD/RT and added klone+sgr-dumb, based
+# on the <smacs>=\E[12m  -- esr)
+#
+# klone+sgr-dumb is an error since the acsc does not match -TD
+#
+# In this description based on SCO's keyboard(HW) manpage list of default
+# function key values:
+#	F13-F24 are shifted F1-F12
+#	F25-F36 are control F1-F12
+#	F37-F48 are shift+control F1-F12
+#
+# hpa/vpa work in the console, but not in scoterm:
+#	hpa=\E[%p1%dG,
+#	vpa=\E[%p1%dd,
+#
+# SCO's terminfo uses
+#	kLFT=\E[d,
+#	kRIT=\E[c,
+# which do not work (console or scoterm).
+#
+# Console documents only 3 attributes can be set with SGR (so we don't use sgr).
+scoansi-old|SCO Extended ANSI standard crt (5.0.5),
+	OTbs, am, bce, eo, xon, NQ,
+	colors#8, cols#80, it#8, lines#25, pairs#64,
+	acsc=+/\,.-\230.\2310[5566778899::;;<<==>>FFGGHHIIJJKKLLMMNN
+	     OOPPQQRRSSTTUUVVWWXX`\204a0fxgqh2jYk?lZm@nEqDtCu4vAwBx3
+	     yszr{c}\034~\207,
+	bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z,
+	civis=\E[=14;12C, clear=\E[H\E[2J, cnorm=\E[=10;12C,
+	cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=\E[B,
+	cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH,
+	cuu=\E[%p1%dA, cuu1=\E[A, cvvis=\E[=0;12C, dch=\E[%p1%dP,
+	dch1=\E[P, dispc=\E[=%p1%dg, dl=\E[%p1%dM, dl1=\E[M,
+	ed=\E[m\E[J, el=\E[m\E[K, el1=\E[1K, home=\E[H, ht=^I,
+	hts=\EH, ich=\E[%p1%d@, ich1=\E[@, il=\E[%p1%dL, il1=\E[L,
+	ind=\E[S, invis=\E[8m, kbeg=\E[E, kbs=^H, kcbt=\E[Z,
+	kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kdch1=^?,
+	kend=\E[F, kf1=\E[M, kf10=\E[V, kf11=\E[W, kf12=\E[X,
+	kf13=\E[Y, kf15=\E[a, kf16=\E[b, kf17=\E[c, kf18=\E[d,
+	kf19=\E[e, kf2=\E[N, kf20=\E[f, kf21=\E[g, kf22=\E[h,
+	kf23=\E[i, kf24=\E[j, kf25=\E[k, kf26=\E[l, kf27=\E[m,
+	kf28=\E[n, kf29=\E[o, kf3=\E[O, kf30=\E[p, kf31=\E[q,
+	kf32=\E[r, kf33=\E[s, kf34=\E[t, kf35=\E[u, kf36=\E[v,
+	kf37=\E[w, kf38=\E[x, kf39=\E[y, kf4=\E[P, kf40=\E[z,
+	kf41=\E[@, kf42=\E[[, kf43=\E[\\, kf44=\E[], kf45=\E[\^,
+	kf46=\E[_, kf47=\E[`, kf48=\E[{, kf5=\E[Q, kf6=\E[R,
+	kf7=\E[S, kf8=\E[T, kf9=\E[U, khome=\E[H, kich1=\E[L,
+	knp=\E[G, kpp=\E[I, op=\E[0;37;40m, rc=\E8, rev=\E[7m,
+	ri=\E[T, rmacs=\E[10m, rmam=\E[?7l, rmso=\E[m, rmul=\E[m,
+	sc=\E7, setab=\E[4%p1%dm, setaf=\E[3%p1%dm,
+	sgr0=\E[0;10m, smacs=\E[12m, smam=\E[?7h, smso=\E[7m,
+	smul=\E[4m, use=ecma+index,
+scoansi-new|SCO Extended ANSI standard crt (5.0.6),
+	km,
+	civis=\E[=0c, cnorm=\E[=1c, csr=\E[%i%p1%d;%p2%dr,
+	cvvis=\E[=2c, mgc=\E[=r, oc=\E[51m, op=\E[50m,
+	rep=\E[%p1%d;%p2%db, rmm=\E[=11L,
+	sgr=\E[0%?%p1%p3%|%t;7%;%?%p2%t;4%;%?%p4%t;5%;%?%p6%t;1%;%?
+	    %p7%t;8%;%?%p9%t;12%e;10%;m,
+	smgb=\E[=1;0m, smgbp=\E[=1;%i%p1%dm,
+	smglp=\E[=2;%i%p1%dm, smgr=\E[=3;0m,
+	smgrp=\E[=3;%i%p1%dm, smgt=\E[=0;0m,
+	smgtp=\E[=0;%i%p1%dm, smm=\E[=10L,
+	wind=\E[%i%p1%d;%p2%d;%i%p3%d;%p4%dr,
+	use=scoansi-old,
+# make this easy to change...
+scoansi|SCO Extended ANSI standard crt,
+	use=scoansi-old,
+
+#### SGI consoles
+
+# Sent by Stefan Stapelberg <stefan@rent-a-guru.de>, 24 Feb 1997, this is
+# from SGI's terminfo database.  SGI's entry shows F9-F12 with the codes
+# for the application keypad mode.  We have added iris-ansi-ap rather than
+# change the original to keypad mode.
+#
+# (iris-ansi: added rmam/smam based on init string -- esr)
+#
+# This entry, and those derived from it, is used in xwsh (also known as
+# winterm).  Some capabilities that do not fit into the terminfo model
+# include the shift- and control-functionkeys:
+#
+# F1-F12 generate different codes when shift or control modifiers are used.
+# For example:
+#	F1		\E[001q
+#	shift F1	\E[013q
+#	control-F1	\E[025q
+#
+# In application keypad mode, F9-F12 generate codes like vt100 PF1-PF4, i.e.,
+# \EOP to \EOS.  The shifted and control modifiers still do the same thing.
+#
+# The cursor keys also have different codes:
+#	control-up	\E[162q
+#	control-down	\E[165q
+#	control-left	\E[159q
+#	control-right	\E[168q
+#
+#	shift-up	\E[161q
+#	shift-down	\E[164q
+#	shift-left	\E[158q
+#	shift-right	\E[167q
+#
+#	control-tab	\[072q
+#
+iris-ansi|iris-ansi-net|IRIS emulating 40 line ANSI terminal (almost VT100),
+	am,
+	cols#80, it#8, lines#40,
+	bel=^G, bold=\E[1m, clear=\E[H\E[2J,
+	cnorm=\E[9/y\E[12/y\E[=6l, cr=\r, cub=\E[%p1%dD,
+	cub1=\E[D, cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC,
+	cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA,
+	cuu1=\E[A, cvvis=\E[10/y\E[=1h\E[=2l\E[=6h,
+	dl=\E[%p1%dM, dl1=\E[M, ed=\E[J, el=\E[K, el1=\E[1K,
+	home=\E[H, ht=^I, hts=\EH, il=\E[%p1%dL, il1=\E[L, ind=\ED,
+	is2=\E[?1l\E>\E[?7h\E[100g\E[0m\E7\E[r\E8, kDC=\E[P,
+	kEND=\E[147q, kHOM=\E[143q, kLFT=\E[158q, kPRT=\E[210q,
+	kRIT=\E[167q, kSPD=\E[218q, kbs=^H, kcbt=\E[Z, kcub1=\E[D,
+	kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kdch1=^?, kend=\E[146q,
+	kent=\r, kf1=\E[001q, kf10=\E[010q, kf11=\E[011q,
+	kf12=\E[012q, kf2=\E[002q, kf3=\E[003q, kf4=\E[004q,
+	kf5=\E[005q, kf6=\E[006q, kf7=\E[007q, kf8=\E[008q,
+	kf9=\E[009q, khome=\E[H, kich1=\E[139q, knp=\E[154q,
+	kpp=\E[150q, kprt=\E[209q, krmir=\E[146q, kspd=\E[217q,
+	nel=\EE, pfkey=\EP101;%p1%d.y%p2%s\E\\, rc=\E8,
+	rev=\E[7m, ri=\EM, rmam=\E[?7l, rmso=\E[m, rmul=\E[m, sc=\E7,
+	sgr0=\E[m, smam=\E[?7h, smso=\E[1;7m, smul=\E[4m,
+	tbc=\E[3g,
+iris-ansi-ap|IRIS ANSI in application-keypad mode,
+	is2=\E[?1l\E=\E[?7h, kent=\EOM, kf10=\E[010q,
+	kf11=\E[011q, kf12=\E[012q, kf9=\E[009q, use=iris-ansi,
+
+# From the man-page, this is a quasi-vt100 emulator that runs on SGI's IRIX
+# (T.Dickey 98/1/24)
+iris-color|xwsh|IRIX ANSI with color,
+	ncv#33,
+	csr=\E[%i%p1%d;%p2%dr, dch=\E[%p1%dP, dim=\E[2m,
+	ech=\E[%p1%dX, ich=\E[%p1%d@, rc=\E8, rmul=\E[24m, rs1=\Ec,
+	rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, sc=\E7,
+	use=ecma+italics, use=vt100+enq, use=klone+color,
+	use=iris-ansi-ap,
+
+#### OpenBSD consoles
+#
+# From: Alexei Malinin <Alexei.Malinin@mail.ru>; October, 2011.
+#
+# The following terminal descriptions for the  AMD/Intel PC console
+# were prepared  based on information contained in  the OpenBSD-4.9
+# termtypes.master and wscons(4) & vga(4) manuals (2010, November).
+#
+# Added bce based on testing with tack -TD
+# Added several capabilities to pccon+base, reading wsemul_vt100_subr.c -TD
+# Changed kbs to DEL and removed keys that duplicate stty settings -TD
+#
+# Notes from testing with vttest:
+#	fails wrapping test
+#	no 8-bit controls
+#	identifies as vt200 with selective erase, but does not implement DECSCA
+#	no vt52 mode
+#	also lacks these:
+#		ESC # 8	  DEC Screen Alignment Test (DECALN).
+#		CSI ? 5 h Reverse Video (DECSCNM).
+#
+pccon+keys|OpenBSD PC keyboard keys,
+	kbs=^?, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A,
+	kdch1=\E[3~, kend=\E[8~, kent=\r, kf1=\E[11~, kf10=\E[21~,
+	kf11=\E[23~, kf12=\E[24~, kf13=\E[25~, kf14=\E[26~,
+	kf15=\E[28~, kf16=\E[29~, kf17=\E[31~, kf18=\E[32~,
+	kf19=\E[33~, kf2=\E[12~, kf20=\E[34~, kf21=\E[35~,
+	kf22=\E[36~, kf23=\E[37~, kf24=\E[38~, kf3=\E[13~,
+	kf4=\E[14~, kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~,
+	kf9=\E[20~, khome=\E[7~, kich1=\E[2~, knp=\E[6~, kpp=\E[5~,
+	krfr=^R,
+pccon+sgr+acs0|sgr and simple ASCII pseudographics for OpenBSD PC console,
+	acsc=+>\,<-\^.v0#`+a:f\\h#i#j+k+l+m+n+o~p-q-r-s_t+u+v+w+x|y#
+	     z#{*|!}#~o,
+	bold=\E[1m, rev=\E[7m, rmso=\E[27m,
+	sgr=\E[0%?%p1%p3%|%t;7%;%?%p6%t;1%;%?%p2%t;4%;m,
+	sgr0=\E[m, smso=\E[7m,
+pccon+sgr+acs|sgr and default ASCII pseudographics for OpenBSD PC console,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bold=\E[1m, enacs=\E)0, rev=\E[7m, rmacs=\E(B, rmso=\E[27m,
+	sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;m%?%p9%t\E(0%e
+	    \E(B%;,
+	sgr0=\E[m\E(B, smacs=\E(0, smso=\E[7m,
+# underline renders as color
+pccon+colors|ANSI colors for OpenBSD PC console,
+	bce,
+	colors#8, ncv#2, pairs#64,
+	op=\E[49;39m, setab=\E[4%p1%dm, setaf=\E[3%p1%dm,
+# OpenBSD uses wscons,
+# + which does not implement DECSCNM or anything comparable, so it does not
+#   support flash.
+# + it renders underline using color.
+pccon+base|base capabilities for OpenBSD PC console,
+	am, km, mc5i, msgr, npc, nxon, xenl, xon,
+	cols#80, it#8, lines#24,
+	bel=^G, clear=\E[H\E[J, cr=\r, csr=\E[%i%p1%d;%p2%dr,
+	cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=\n,
+	cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH,
+	cuu=\E[%p1%dA, cuu1=\E[A, dch=\E[%p1%dP, dch1=\E[P,
+	dl=\E[%p1%dM, dl1=\E[M, ech=\E[%p1%dX, ed=\E[J, el=\E[K,
+	el1=\E[1K, home=\E[H, ht=^I, hts=\EH, ich=\E[%p1%d@,
+	il=\E[%p1%dL, il1=\E[L, ind=\ED, nel=\EE, rc=\E8, ri=\EM,
+	rmam=\E[?7l, rmul=\E[24m, rs2=\Ec, sc=\E7, smam=\E[?7h,
+	smul=\E[4m, tbc=\E[3g, use=ansi+cpr,
+pccon0-m|OpenBSD PC console without colors & with simple ASCII pseudographics,
+	use=pccon+sgr+acs0, use=pccon+base, use=pccon+keys,
+pccon0|OpenBSD PC console with simple ASCII pseudographics,
+	use=pccon0-m, use=pccon+colors,
+pccon-m|OpenBSD PC console without colors,
+	use=pccon+base, use=pccon+sgr+acs, use=pccon+keys,
+	use=ansi+enq, use=vt220+cvis,
+pccon|OpenBSD PC console,
+	use=pccon-m, use=pccon+colors,
+
+#### NetBSD consoles
+#
+# pcvt termcap database entries (corresponding to release 3.31)
+# Author's last edit-date: [Fri Sep 15 20:29:10 1995]
+#
+# (For the terminfo master file, I translated these into terminfo syntax.
+# Then I dropped all the pseudo-HP entries. we don't want and can't use
+# the :Xs: flag. Then I split :is: into a size-independent <is1> and a
+# size-dependent <is2>.  Finally, I added <rmam>/<smam> -- esr)
+
+# NOTE: <ich1> has been taken out of this entry. for reference, it should
+# be <ich1=\E[@>.  For discussion, see ICH/ICH1 VERSUS RMIR/SMIR below.
+# (esr: added <civis> and <cnorm> to resolve NetBSD Problem Report #4583)
+pcvtXX|pcvt VT200 emulator (DEC VT220),
+	am, km, mir, msgr, xenl,
+	it#8, vt#3,
+	acsc=++\,\,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxy
+	     yzz~~,
+	bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[J, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\E[B, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M, ed=\E[J,
+	el=\E[K, el1=\E[1K, home=\E[H, ht=^I, hts=\EH, ich=\E[%p1%d@,
+	il=\E[%p1%dL, il1=\E[L, ind=\ED,
+	is1=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, kbs=^?,
+	kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
+	kdch1=\E[3~, kf1=\E[17~, kf2=\E[18~, kf3=\E[19~,
+	kf4=\E[20~, kf5=\E[21~, kf6=\E[23~, kf7=\E[24~, kf8=\E[25~,
+	khome=\E[1~, kich1=\E[2~, kll=\E[4~, knp=\E[6~, kpp=\E[5~,
+	nel=\EE, rc=\E8, rev=\E[7m, rf=/usr/share/tabset/vt100,
+	ri=\EM, rmacs=\E(B, rmam=\E[?7l, rmir=\E[4l,
+	rmkx=\E[?1l\E>, rmso=\E[27m, rmul=\E[24m,
+	rs1=\Ec\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, sc=\E7,
+	sgr0=\E[m, smacs=\E(0, smam=\E[?7h, smir=\E[4h,
+	smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m, tbc=\E[3g,
+	use=decid+cpr, use=ecma+index, use=vt220+cvis,
+
+#	NetBSD/FreeBSD VT220 terminal emulator console (pc keyboard & monitor)
+#	termcap entries for pure VT220-Emulation and 25, 28, 35, 40, 43 and
+#	50 lines entries; 80 columns
+pcvt25|DEC VT220 emulation with 25 lines,
+	cols#80, lines#25,
+	is2=\E[1;25r\E[25;1H, use=pcvtXX,
+pcvt28|DEC VT220 emulation with 28 lines,
+	cols#80, lines#28,
+	is2=\E[1;28r\E[28;1H, use=pcvtXX,
+pcvt35|DEC VT220 emulation with 35 lines,
+	cols#80, lines#35,
+	is2=\E[1;35r\E[35;1H, use=pcvtXX,
+pcvt40|DEC VT220 emulation with 40 lines,
+	cols#80, lines#40,
+	is2=\E[1;40r\E[40;1H, use=pcvtXX,
+pcvt43|DEC VT220 emulation with 43 lines,
+	cols#80, lines#43,
+	is2=\E[1;43r\E[43;1H, use=pcvtXX,
+pcvt50|DEC VT220 emulation with 50 lines,
+	cols#80, lines#50,
+	is2=\E[1;50r\E[50;1H, use=pcvtXX,
+
+#	NetBSD/FreeBSD VT220 terminal emulator console (pc keyboard & monitor)
+#	termcap entries for pure VT220-Emulation and 25, 28, 35, 40, 43 and
+#	50 lines entries; 132 columns
+pcvt25w|DEC VT220 emulation with 25 lines and 132 cols,
+	cols#132, lines#25,
+	is2=\E[1;25r\E[25;1H, use=pcvtXX,
+pcvt28w|DEC VT220 emulation with 28 lines and 132 cols,
+	cols#132, lines#28,
+	is2=\E[1;28r\E[28;1H, use=pcvtXX,
+pcvt35w|DEC VT220 emulation with 35 lines and 132 cols,
+	cols#132, lines#35,
+	is2=\E[1;35r\E[35;1H, use=pcvtXX,
+pcvt40w|DEC VT220 emulation with 40 lines and 132 cols,
+	cols#132, lines#40,
+	is2=\E[1;40r\E[40;1H, use=pcvtXX,
+pcvt43w|DEC VT220 emulation with 43 lines and 132 cols,
+	cols#132, lines#43,
+	is2=\E[1;43r\E[43;1H, use=pcvtXX,
+pcvt50w|DEC VT220 emulation with 50 lines and 132 cols,
+	cols#132, lines#50,
+	is2=\E[1;50r\E[50;1H, use=pcvtXX,
+
+#	OpenBSD implements a color variation
+pcvt25-color|DEC VT220 emulation with 25 lines and color,
+	cols#80, lines#25,
+	is2=\E[1;25r\E[25;1H, kf1=\EOP, kf10=\E[29~, kf11=\E[23~,
+	kf12=\E[24~, kf13=\E[25~, kf14=\E[26~, kf15=\E[28~,
+	kf16=\E[29~, kf17=\E[31~, kf18=\E[32~, kf19=\E[33~,
+	kf2=\EOQ, kf20=\E[34~, kf3=\EOR, kf4=\EOS, kf5=\E[17~,
+	kf6=\E[18~, kf7=\E[19~, kf8=\E[20~, kf9=\E[21~, use=pcvtXX,
+	use=ecma+color,
+
+# Terminfo entries to enable the use of the ncurses library in colour on a
+# NetBSD-arm32 console (only tested on a RiscPC).
+# Created by Dave Millen <dmill@globalnet.co.uk> 22.07.98
+# modified codes for setf/setb to setaf/setab, then to klone+color, corrected
+# typo in invis - TD
+arm100|arm100-am|Arm(RiscPC) ncurses compatible (for 640x480),
+	am, bce, msgr, xenl, xon,
+	cols#80, it#8, lines#30,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\E[5m$<2>, bold=\E[1m$<2>,
+	clear=\E[H\E[J$<50>, cr=\r, csr=\E[%i%p1%d;%p2%dr,
+	cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=\n,
+	cuf=\E[%p1%dC, cuf1=\E[C$<2>,
+	cup=\E[%i%p1%d;%p2%dH$<5>, cuu=\E[%p1%dA,
+	cuu1=\E[A$<2>, ed=\E[J$<50>, el=\E[K$<3>, el1=\E[1K$<3>,
+	enacs=\E(B\E)0, home=\E[H, ht=^I, hts=\EH, ind=\n,
+	invis=\E[8m$<2>, ka1=\E[q, ka3=\E[s, kb2=\E[r, kbs=^H,
+	kc1=\E[p, kc3=\E[n, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C,
+	kcuu1=\E[A, kent=\E[M, kf0=\E[y, kf1=\E[P, kf10=\E[x,
+	kf2=\E[Q, kf3=\E[R, kf4=\E[S, kf5=\E[t, kf6=\E[u, kf7=\E[v,
+	kf8=\E[l, kf9=\E[w, rc=\E8, rev=\E[7m$<2>, ri=\EM$<5>,
+	rmacs=^O, rmam=\E[?7l, rmkx=\E[?1l\E>, rmso=\E[m$<2>,
+	rmul=\E[m$<2>, rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h,
+	sc=\E7,
+	sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5
+	    %;%?%p7%t;8%;m%?%p9%t\016%e\017%;$<2>,
+	sgr0=\E[m\017$<2>, smacs=^N, smam=\E[?7h, smkx=\E[?1h\E=,
+	smso=\E[7m$<2>, smul=\E[4m$<2>, tbc=\E[3g, use=ecma+sgr,
+	use=klone+color,
+
+arm100-w|arm100-wam|Arm(RiscPC) ncurses compatible (for 1024x768),
+	cols#132, lines#50, use=arm100,
+
+# NetBSD/x68k console VT200 emulator. This port runs on a 68K machine
+# manufactured by Sharp for the Japanese market.
+# From Minoura Makoto <minoura@netlaputa.or.jp>, 12 May 1996
+x68k|x68k-ite|NetBSD/x68k ITE,
+	cols#96, lines#32,
+	kclr=\E[9~, khlp=\E[28~, use=vt220-base,
+
+# <tv@pobox.com>:
+# Entry for the DNARD OpenFirmware console, close to ANSI but not quite.
+#
+# (still unfinished, but good enough so far.)
+ofcons|DNARD OpenFirmware console,
+	bw,
+	cols#80, lines#30,
+	bel=^G, blink=\2335m, bold=\2331m, clear=^L, cr=\r,
+	cub=\233%p1%dD, cub1=\233D, cud=\233%p1%dB, cud1=\233B,
+	cuf=\233%p1%dC, cuf1=\233C, cup=\233%i%p1%d;%p2%dH,
+	cuu=\233%p1%dA, cuu1=\233A, dch=\233%p1%dP, dch1=\233P,
+	dim=\2332m, dl=\233%p1%dM, dl1=\233M, ed=\233J, el=\233K,
+	flash=^G, ht=^I, ich=\233%p1%d@, ich1=\233@, il=\233%p1%dL,
+	il1=\233L, ind=\n, invis=\2338m, kbs=^H, kcub1=\233D,
+	kcud1=\233B, kcuf1=\233C, kcuu1=\233A, kdch1=\233P,
+	kf1=\2330P, kf10=\2330M, kf2=\2330Q, kf3=\2330W,
+	kf4=\2330x, kf5=\2330t, kf6=\2330u, kf7=\2330q, kf8=\2330r,
+	kf9=\2330p, knp=\233/, kpp=\233?, nel=\r\n, rev=\2337m,
+	rmso=\2330m, rmul=\2330m,
+	sgr=\2330%?%p6%t;1%;%?%p2%t;4%;%?%p4%t;5%;%?%p5%t2%;%?%p7%t8
+	    %;%?%p1%p3%|%t;7%;m,
+	sgr0=\2330m, smso=\2337m, smul=\2334m,
+
+# NetBSD "wscons" emulator in VT220 mode.
+# This entry is based on the NetBSD termcap entry, correcting the ncv value.
+# The emulator renders underlined text in red.  Colors are otherwise usable.
+#
+# Testing the emulator and reading the source code (NetBSD 2.0), it appears
+# that "vt220" is inaccurate.  There are a few VT220-features, but most of the
+# VT220 screens in vttest do not work with this emulator.  For instance, it
+# identifies itself (primary DA response) as a VT220 with selective erase.  But
+# the selective erase feature does not work.  The secondary response is copied
+# from Kermit's emulation of VT220, does not correspond to actual VT220.  At
+# the level of detail in a termcap, it is a passable emulator, since ECH does
+# work.  Don't use it on a VMS system -TD
+wsvt25|NetBSD wscons in 25 line DEC VT220 mode,
+	bce, msgr,
+	colors#8, cols#80, it#8, lines#25, ncv#2, pairs#64,
+	is2=\E[r\E[25;1H, kdch1=\E[3~, kend=\E[8~, kf1=\E[11~,
+	kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf2=\E[12~,
+	kf3=\E[13~, kf4=\E[14~, kf5=\E[15~, kf6=\E[17~, kf7=\E[18~,
+	kf8=\E[19~, kf9=\E[20~, khome=\E[7~, op=\E[m, rs1=\Ec,
+	setab=\E[4%p1%dm, setaf=\E[3%p1%dm, use=vt220,
+
+wsvt25m|NetBSD wscons in 25 line DEC VT220 mode with Meta,
+	km, use=wsvt25,
+
+# NetBSD 6.x still uses wscons, with minor changes (2014/02/22) -TD
+#
+# TERM is by default vt100 for the console, wsvt25 for other ttys.
+# Initial testing set TERM=xterm, based on comments by developers, found too
+# many differences to continue in that path.  However, test-results may be
+# useful to people curious about compatibility with xterm.
+#
+# Testing with tack:
+# -----------------
+# Failed: cbt, bel, flash, cvvis, smul (color), blink, invis
+# There is color-bleeding in the color-pairs screen.
+# Attributes do not work with color
+# Failed: vpa/hpa
+# Failed: kf1-kf4, kf13-kf48, khome, kend
+#	(effectively xterm-r6 for function-keys)
+# None of the function or cursor key-modifiers are encoded.
+# Console hangs in the smm/rmm test if TERM=xterm, does not show test
+#
+# Testing with vttest:
+# -------------------
+# Identifies as VT220 with selective erase
+#	(however, selective erase refers to DECSCA, SPA)
+# Does not implement VT52
+# Uses spaces to simulate double-size characters
+# Does not support 8-bit controls
+# Does not support VT220 reports
+# Does not support send/receive mode
+# Supports ECH (like rxvt)
+# Does not support DECSCA
+# Does not support any of the ISO-6429 cursor-movement
+# Does not support any of the ISO-6429 miscellaneous tests
+#	(SL/SR also leave unexpected char on screen too)
+# Background does not change in menu 11.6.9 (SGR 22-27)
+# None of the xterm special features tests work
+netbsd6|NetBSD wscons in 25 line DEC VT100 mode,
+	kbs=^?, use=wsvt25,
+
+# `rasterconsole' provided by 4.4BSD, NetBSD and OpenBSD on SPARC, and
+# DECstation/pmax.
+rcons|BSD rasterconsole,
+	use=sun-il,
+# Color version of above. Color currently only provided by NetBSD.
+rcons-color|BSD rasterconsole with ANSI color,
+	bce,
+	colors#8, pairs#64,
+	op=\E[m, setab=\E[4%p1%dm, setaf=\E[3%p1%dm, use=rcons,
+
+# mgterm -- MGL/MGL2, MobileGear Graphic Library
+# for PocketBSD,PocketLinux,NetBSD/{hpcmips,mac68k}
+# -- the setf/setb are probably incorrect, more likely setaf/setab -TD
+# -- compare with cons25w
+mgterm|MGL/MGL2 MobileGear Graphic Library,
+	OTbs, OTpt, am, bce, bw, eo, km, msgr, npc,
+	colors#8, cols#80, it#8, lines#18, pairs#64,
+	bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, clear=\E[H\E[J,
+	cr=\r, csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\E[B, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	dch=\E[%p1%dP, dch1=\E[P, dim=\E[30;1m, dl=\E[%p1%dM,
+	dl1=\E[M, ech=\E[%p1%dX, ed=\E[J, el=\E[K, el1=\E[1K,
+	home=\E[H, hpa=\E[%i%p1%d`, ht=^I, ich=\E[%p1%d@,
+	ich1=\E[@, il=\E[%p1%dL, il1=\E[L, ind=\E[S, kb2=\E[E,
+	kbs=^H, kcbt=\E[Z, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C,
+	kcuu1=\E[A, kdch1=^?, kend=\E[F, kf1=\E[M, kf10=\E[V,
+	kf11=\E[W, kf12=\E[X, kf2=\E[N, kf3=\E[O, kf4=\E[P, kf5=\E[Q,
+	kf6=\E[R, kf7=\E[S, kf8=\E[T, kf9=\E[U, khome=\E[H,
+	kich1=\E[L, knp=\E[G, kpp=\E[I, nel=\E[E, op=\E[x, rc=\E8,
+	rev=\E[7m, ri=\E[T, rmso=\E[m, rs2=\E[x\E[m\Ec, sc=\E7,
+	setb=\E[4%p1%dm, setf=\E[3%p1%dm, sgr0=\E[m, smso=\E[7m,
+	vpa=\E[%i%p1%dd, use=ecma+index,
+
+#### FreeBSD console entries
+
+# Originally from termcap:
+#
+# From: Andrey Chernov <ache@astral.msk.su> 29 Mar 1996
+# Andrey Chernov maintains the FreeBSD termcap distributions.
+#
+# Note: Users of FreeBSD 2.1.0 and older versions must either upgrade
+# or comment out the :cb: capability in the console entry.
+#
+# Alexander Lukyanov reports:
+# I have seen FreeBSD-2.1.5R... The old el1 bug changed, but it is still there.
+# Now el1 clears not only to the line beginning, but also a large chunk
+# of previous line. But there is another bug - ech does not work at all.
+
+# syscons, sc - the console driver
+#
+# for syscons
+# common entry without semigraphics
+# Bug: The <op> capability resets attributes.
+# Bug? The ech and el1 attributes appear to move the cursor in some cases; for
+# instance el1 does if the cursor is moved to the right margin first.  Removed
+# by T.Dickey 97/5/3 (ech=\E[%p1%dX, el1=\E[1K)
+#
+# Setting colors turns off reverse; we cannot guarantee order, so use ncv.
+# Note that this disables standout with color.
+#
+# The emulator sends different strings based on shift- and control-keys,
+# like scoansi:
+#	F13-F24 are shifted F1-F12
+#	F25-F36 are control F1-F12
+#	F37-F48 are shift+control F1-F12
+cons25w|ansiw|ansi80x25-raw|FreeBSD console (25-line raw mode),
+	am, bce, bw, eo, msgr, npc,
+	colors#8, cols#80, it#8, lines#25, ncv#21, pairs#64,
+	bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, clear=\E[H\E[J,
+	cnorm=\E[=0C, cr=\r, cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB,
+	cud1=\E[B, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	cvvis=\E[=1C, dch=\E[%p1%dP, dch1=\E[P, dim=\E[30;1m,
+	dl=\E[%p1%dM, dl1=\E[M, ech=\E[%p1%dX, ed=\E[J, el=\E[K,
+	home=\E[H, hpa=\E[%i%p1%d`, ht=^I, ich=\E[%p1%d@,
+	ich1=\E[@, il=\E[%p1%dL, il1=\E[L, ind=\E[S, kb2=\E[E,
+	kbs=^H, kcbt=\E[Z, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C,
+	kcuu1=\E[A, kdch1=^?, kend=\E[F, kf1=\E[M, kf10=\E[V,
+	kf11=\E[W, kf12=\E[X, kf13=\E[Y, kf14=\E[Z, kf15=\E[a,
+	kf16=\E[b, kf17=\E[c, kf18=\E[d, kf19=\E[e, kf2=\E[N,
+	kf20=\E[f, kf21=\E[g, kf22=\E[h, kf23=\E[i, kf24=\E[j,
+	kf25=\E[k, kf26=\E[l, kf27=\E[m, kf28=\E[n, kf29=\E[o,
+	kf3=\E[O, kf30=\E[p, kf31=\E[q, kf32=\E[r, kf33=\E[s,
+	kf34=\E[t, kf35=\E[u, kf36=\E[v, kf37=\E[w, kf38=\E[x,
+	kf39=\E[y, kf4=\E[P, kf40=\E[z, kf41=\E[@, kf42=\E[[,
+	kf43=\E[\\, kf44=\E[], kf45=\E[\^, kf46=\E[_, kf47=\E[`,
+	kf48=\E[{, kf5=\E[Q, kf6=\E[R, kf7=\E[S, kf8=\E[T, kf9=\E[U,
+	khome=\E[H, kich1=\E[L, knp=\E[G, kpp=\E[I, nel=\E[E,
+	op=\E[x, rc=\E8, rev=\E[7m, ri=\E[T, rmso=\E[m,
+	rs2=\E[x\E[m\Ec, sc=\E7, setab=\E[4%p1%dm,
+	setaf=\E[3%p1%dm,
+	sgr=\E[0%?%p1%t;2;7%;%?%p3%t;7%;%?%p4%t;5%;%?%p5%t;30;1%;%?
+	    %p6%t;1%;m,
+	sgr0=\E[m, smso=\E[7m, vpa=\E[%i%p1%dd, use=ecma+index,
+cons25|ansis|ansi80x25|FreeBSD console (25-line ANSI mode),
+	acsc=-\030.^Y0\333`\004a\260f\370g\361h\261i\025j\331k\277l
+	     \332m\300n\305q\304t\303u\264v\301w\302x\263y\363z\362~
+	     \371,
+	use=cons25w,
+cons25-debian|FreeBSD console with debian backspace (25-line ANSI mode),
+	kbs=^?, kdch1=\E[3~, use=cons25,
+cons25-m|ansis-mono|ansi80x25-mono|FreeBSD console (25-line mono ANSI mode),
+	colors@, pairs@,
+	bold@, dim@, op@, rmul=\E[m, setab@, setaf@,
+	sgr=\E[0%?%p1%t;2;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;m,
+	smul=\E[4m, use=cons25,
+cons30|ansi80x30|FreeBSD console (30-line ANSI mode),
+	lines#30, use=cons25,
+cons30-m|ansi80x30-mono|FreeBSD console (30-line mono ANSI mode),
+	lines#30, use=cons25-m,
+cons43|ansi80x43|FreeBSD console (43-line ANSI mode),
+	lines#43, use=cons25,
+cons43-m|ansi80x43-mono|FreeBSD console (43-line mono ANSI mode),
+	lines#43, use=cons25-m,
+cons50|ansil|ansi80x50|FreeBSD console (50-line ANSI mode),
+	lines#50, use=cons25,
+cons50-m|ansil-mono|ansi80x50-mono|FreeBSD console (50-line mono ANSI mode),
+	lines#50, use=cons25-m,
+cons60|ansi80x60|FreeBSD console (60-line ANSI mode),
+	lines#60, use=cons25,
+cons60-m|ansi80x60-mono|FreeBSD console (60-line mono ANSI mode),
+	lines#60, use=cons25-m,
+cons25r|pc3r|ibmpc3r|cons25-koi8-r|FreeBSD console w/koi8-r cyrillic,
+	acsc=-\030.^Y0\215`\004a\220f\234h\221i\025j\205k\203l\202m
+	     \204n\212q\0t\206u\207v\211w\210x\201y\230z\231~
+	     \225,
+	use=cons25w,
+cons25r-m|pc3r-m|ibmpc3r-mono|cons25-koi8r-m|FreeBSD console w/koi8-r cyrillic (mono),
+	colors@, pairs@,
+	op@, rmul=\E[m, setab@, setaf@,
+	sgr=\E[0%?%p1%t;2;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5
+	    %t;30;1%;%?%p6%t;1%;m,
+	smul=\E[4m, use=cons25r,
+cons50r|cons50-koi8r|FreeBSD console w/koi8-r cyrillic (50 lines),
+	lines#50, use=cons25r,
+cons50r-m|cons50-koi8r-m|FreeBSD console w/koi8-r cyrillic (50-line mono),
+	lines#50, use=cons25r-m,
+cons60r|cons60-koi8r|FreeBSD console w/koi8-r cyrillic (60 lines),
+	lines#60, use=cons25r,
+cons60r-m|cons60-koi8r-m|FreeBSD console w/koi8-r cyrillic (60-line mono),
+	lines#60, use=cons25r-m,
+# ISO 8859-1 FreeBSD console
+cons25l1|cons25-iso8859|FreeBSD console w/iso 8859-1 chars,
+	acsc=+\253\,\273-\030.\031`\201a\202f\207g\210i\247j\213k
+	     \214l\215m\216n\217o\220p\221q\222r\223s\224t\225u
+	     \226v\227w\230x\231y\232z\233~\237,
+	use=cons25w,
+cons25l1-m|cons25-iso-m|FreeBSD console w/iso 8859-1 chars (mono),
+	colors@, pairs@,
+	bold@, dim@, op@, rmul=\E[m, setab@, setaf@,
+	sgr=\E[0%?%p1%t;2;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;m,
+	smul=\E[4m, use=cons25l1,
+cons50l1|cons50-iso8859|FreeBSD console w/iso 8859-1 chars (50 lines),
+	lines#50, use=cons25l1,
+cons50l1-m|cons50-iso-m|FreeBSD console w/iso 8859-1 chars (50-line mono),
+	lines#50, use=cons25l1-m,
+cons60l1|cons60-iso|FreeBSD console w/iso 8859-1 chars (60 lines),
+	lines#60, use=cons25l1,
+cons60l1-m|cons60-iso-m|FreeBSD console w/iso 8859-1 chars (60-line mono),
+	lines#60, use=cons25l1-m,
+
+# vt - virtual terminal console driver
+#
+# Starting with FreeBSD 8, an alternative configuration for syscons is provided,
+# which is intended to be xterm-compatible.  See for example
+#	http://svnweb.freebsd.org/base/stable/8/sys/dev/syscons/
+# in particular scterm-teken.c
+#
+# Some of the documentation refers to this as "vt"; its proper name is "teken".
+#
+# The sc(4) manual page states that it is possible to switch between the two
+# by editing /boot/loader.conf, adding
+#	kern.vty=sc
+# Doing that does not change the default TERM variable.  That is hard-coded in
+# /etc/ttys, rather than deriving it from the kernel state.
+#
+# For FreeBSD 12 and 13:
+# ---------------------
+# In newer releases, it is no longer possible to boot into a configuration that
+# works with syscons.  According to efi(4),
+# "The vt(4) system console is automatically selected when booting via UEFI."
+# See FreeBSD #264226.
+#
+# FreeBSD 13 supports 64-bit machines which boot with UEFI:
+#	https://www.freebsd.org/platforms/
+# The i386 platform does not use UEFI (and modifying the loader configuration
+# does load sysconf); however because no updates (fixes) are available, most
+# developers will regard that as unsupported.
+#
+# With FreeBSD 13, even when syscons is loaded (e.g., with the i386 platform),
+# its function-keys are not configured.  Using
+#	vidcontrol -T cons25
+# repairs this.
+#
+# When teken is loaded, vidcontrol can switch at runtime between the
+# teken/cons25 function keys:
+#	vidcontrol -T cons25
+#	vidcontrol -T xterm
+# However due to a limitation in the implementation, only the first 12 function
+# keys are available.  The real syscons supports 48 function keys (using the
+# shift and control modifiers), while xterm supports more than twice as many.
+#
+# vidcontrol does not change the emulation. As a result, the quarter (17/73) of
+# non-function key capabilities which differ between syscons and teken are
+# unsupported in the UEFI-based configurations.
+#
+# tack:
+#	VT100 line-drawing does not work (UTF-8 equivalents do).
+#	Shift/control modifiers have no effect on special keys.
+#	Meta does not work.
+# vttest:
+#	supports REP (repeat).
+#	still does not support left/right margins
+#	SU/SD work, but not SL/SR
+#	alternate screen does not work
+#	ENQ/DA1 is unimplemented (the terminal does not identify itself)
+#	CPR, XCPR are unimplemented (i.e., vttest and resize are broken)
+#	implements X11 (original) xterm-mouse.
+# ncurses:
+#	UTF-8 line-drawing works, including some double/thick lines
+#
+# For FreeBSD 9 and 10:
+# --------------------
+# The /etc/ttys entries for console and other ttys are all configured to set
+# TERM=xterm.
+#
+# Testing with tack:
+# There is no VT100 line-drawing (uses +'s and -'s)
+# Shifted f1-f12 give cons25 codes, rather than xterm function-keys
+#
+# Testing with vttest:
+# Menu 2 diamonds don't work, blink ditto, light background ditto
+# The terminal identifies itself as VT100 with AVO
+# There is no VT52 support
+# There is no doublesize character support
+# The terminal supports ECH (like rxvt)
+# The terminal does not support send/receive mode
+# The terminal supports all of the ISO-6429 cursor-movement
+# The terminal supports some of the ISO-6429 miscellaneous tests
+#	(SL/SR also leave unexpected char on screen too)
+#
+# Considering cons25 as a base, the line-drawing mostly works, but is missing
+# the cells which happen to have ASCII control-character values:
+#	-    ^X    arrow pointing up
+#	.    ^Y    arrow pointing down
+#	i    ^Y    lantern
+#	`    ^D    diamond
+#
+# Those are removed from this entry's acsc string to avoid confusion.
+# The resulting description provides correct line-drawing and function-keys -TD
+teken-2018|teken as of 2018,
+	bw@, mir, xenl, NQ,
+	acsc=0\333a\260f\370g\361h\261j\331k\277l\332m\300n\305q
+	     \304t\303u\264v\301w\302x\263y\363z\362~\371,
+	cvvis@, hpa=\E[%i%p1%dG, hts=\EH, kcub1=\E[D, kcud1=\E[B,
+	kcuf1=\E[C, kcuu1=\E[A, kdch1=\E[3~, kend=\E[F, kent=\r,
+	kf1=\EOP, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf2=\EOQ,
+	kf3=\EOR, kf4=\EOS, kf5=\E[15~, kf6=\E[17~, kf7=\E[18~,
+	kf8=\E[19~, kf9=\E[20~, khome=\E[H, kich1=\E[2~, knp=\E[6~,
+	kpp=\E[5~, rmir=\E[4l, smir=\E[4h, tbc=\E[3g,
+	vpa=\E[%i%p1%dd, use=vt220+cvis, use=cons25,
+
+teken-2022|teken as of 2022,
+	am, bce, eo, mir, msgr, npc, NQ,
+	colors#8, cols#80, it#8, lines#25, ncv#21, pairs#64, U8#1,
+	bold=\E[1m, cr=\r, cub1=^H, dim=\E[30;1m, ech=\E[%p1%dX,
+	ind=\E[S, kbs=^H, kent=\r, nel=\E[E, op=\E[x, rev=\E[7m,
+	ri=\E[T, rmso=\E[27m, rs2=\E[x\E[m\Ec, setab=\E[4%p1%dm,
+	setaf=\E[3%p1%dm,
+	sgr=\E[0%?%p1%t;2;7%;%?%p3%t;7%;%?%p5%t;30;1%;%?%p6%t;1%;m,
+	sgr0=\E[m, use=vt220+cvis, use=ecma+index,
+	use=ansi+arrows, use=ansi+csr, use=ansi+cup,
+	use=ansi+erase, use=ansi+idc, use=ansi+idl,
+	use=ansi+local, use=ansi+rca2, use=ansi+sgrso,
+	use=ansi+tabs,
+
+teken-vt+fkeys|teken's xterm special keys,
+	kdch1=\E[3~, kend=\E[F, kf1=\EOP, kf10=\E[21~, kf11=\E[23~,
+	kf12=\E[24~, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf5=\E[15~,
+	kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, khome=\E[H,
+	kich1=\E[2~, knp=\E[6~, kpp=\E[5~,
+
+teken-sc+fkeys|teken's syscons special keys,
+	kdch1=^?, kend=\E[F, kf1=\E[M, kf10=\E[V, kf11=\E[W,
+	kf12=\E[X, kf2=\E[N, kf3=\E[O, kf4=\E[P, kf5=\E[Q, kf6=\E[R,
+	kf7=\E[S, kf8=\E[T, kf9=\E[U, khome=\E[H, kich1=\E[L,
+	knp=\E[G, kpp=\E[I,
+
+teken-sc|teken imitating syscons,
+	use=teken-sc+fkeys, use=teken-2022,
+
+teken|teken-vt|teken imitating xterm,
+	xenl, use=teken-vt+fkeys, use=xterm+x11mouse,
+	use=teken-2022,
+
+teken-16color|teken using 16 colors,
+	use=ibm+16color, use=teken,
+
+#### 386BSD and BSD/OS Consoles
+#
+
+# This was the original 386BSD console entry (I think).
+# Some places it's named oldpc3|oldibmpc3.
+# From: Alex R.N. Wetmore <aw2t@andrew.cmu.edu>
+origpc3|origibmpc3|IBM PC 386BSD console,
+	OTbs, am, bw, eo, xon,
+	cols#80, lines#25,
+	acsc=j\331k\277l\332m\300n\305q\304t\303u\264v\301w\302x
+	     \263,
+	bold=\E[7m, clear=\Ec, cub1=^H, cud1=\E[B, cuf1=\E[C,
+	cup=\E[%i%p1%2d;%p2%2dH, cuu1=\E[A, ed=\E[J, el=\E[K,
+	home=\E[H, ind=\E[S, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C,
+	kcuu1=\E[A, khome=\E[Y, ri=\E[T, rmso=\E[1;0x\E[2;7x,
+	rmul=\E[1;0x\E[2;7x, sgr0=\E[m\E[1;0x\E[2;7x,
+	smso=\E[1;7x\E[2;0x, smul=\E[1;7x\E[2;0x,
+
+# description of BSD/386 console emulator in version 1.0 (supplied by BSDI)
+oldpc3|oldibmpc3|old IBM PC BSD/386 console,
+	OTbs, km,
+	lines#25,
+	bel=^G, bold=\E[=15F, cr=\r, cud1=\n, dim=\E[=8F, dl1=\E[M,
+	ht=^I, il1=\E[L, ind=\n, kbs=^H, kcub1=\E[D, kcud1=\E[B,
+	kcuf1=\E[C, kcuu1=\E[A, khome=\E[H, kich1=\E[L, kll=\E[F,
+	knp=\E[G, kpp=\E[I, nel=\r\n, sgr0=\E[=R,
+
+# Description of BSD/OS console emulator in version 1.1, 2.0, 2.1
+# Note, the emulator supports many of the additional console features
+# listed in the iBCS2 (e.g. character-set selection) though not all
+# are described here.  This entry really ought to be upgraded.
+# Also note, the console will also work with fewer lines after doing
+# "stty rows NN", e.g. to use 24 lines.
+# (Color support from Kevin Rosenberg <kevin@cyberport.com>, 2 May 1996)
+# Bug: The <op> capability resets attributes.
+bsdos-pc|IBM PC BSD/OS console,
+	sgr=\E[0;10%?%p1%t;7%;%?%p2%t;1%;%?%p3%t;7%;%?%p4%t;5%;%?%p6
+	    %t;1%;%?%p7%t;8%;%?%p9%t;11%;m,
+	use=bsdos-pc-nobold,
+
+bsdos-pc-nobold|BSD/OS PC console w/o bold,
+	use=klone+color, use=bsdos-pc-m,
+
+bsdos-pc-m|bsdos-pc-mono|BSD/OS PC console mono,
+	OTbs, am, eo, km, xon,
+	cols#80, it#8, lines#25,
+	bel=^G, clear=\Ec, cr=\r, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	dl=\E[%p1%dM, dl1=\E[M, ed=\E[J, el=\E[K, home=\E[H, ht=^I,
+	il=\E[%p1%dL, il1=\E[L, ind=\n, kbs=^H, kcub1=\E[D,
+	kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, khome=\E[H, kich1=\E[L,
+	kll=\E[F, knp=\E[G, kpp=\E[I, nel=\r\n, rc=\E8, sc=\E7,
+	sgr=\E[0;10%?%p1%t;7%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1%;%?%p7
+	    %t;8%;%?%p9%t;11%;m%?%p5%t\E[=8F%;,
+	use=klone+sgr8,
+
+# Old names for BSD/OS PC console used in releases before 4.1.
+pc3|BSD/OS on the PC console,
+	use=bsdos-pc-nobold,
+ibmpc3|pc3-bold|BSD/OS on the PC console with bold instead of underline,
+	use=bsdos-pc,
+
+# BSD/OS on the SPARC
+bsdos-sparc|Sun SPARC BSD/OS console,
+	use=sun,
+
+# BSD/OS on the PowerPC
+bsdos-ppc|PowerPC BSD/OS console,
+	use=bsdos-pc,
+
+
+#### DEC VT52
+# (<acsc>/<rmacs>/<smacs> capabilities aren't in DEC's official entry -- esr)
+#
+# Actually (TD pointed this out at the time the acsc string was added):
+# VT52 shouldn't define full acsc since most of the cells don't match.
+# see VT100 manual page A-31.  This is the list that does match:
+#	f degree
+#	g plus/minus
+#	h right-arrow
+#	k down-arrow
+#	m scan-1
+#	o scan-3
+#	q scan-5
+#	s scan-7
+# The line-drawing happens to work in several terminal emulators, but should
+# not be used as a guide to the capabilities of the VT52.  Note in particular
+# that VT52 does not support line-drawing characters (the scan-X values refer
+# to a crude plotting feature) -TD
+vt52|DEC VT52,
+	OTbs,
+	it#8, lines#24,
+	acsc=+h.k0affggolpnqprrss, home=\EH, kbs=^H, nel=\r\n,
+	ri=\EI, rmacs=\EG, rmkx=\E>, smacs=\EF, smkx=\E=, u8=\E/[KL],
+	use=vt50h,
+
+# This is more likely the "vt52" that you would see in emulation, i.e., no
+# keypad, no graphics.
+vt52-basic|VT52 for emulators,
+	cols#80, it#8, lines#24,
+	bel=^G, clear=\EH\EJ, cr=\r, cub1=\ED, cud1=\EB, cuf1=\EC,
+	cup=\EY%p1%' '%+%c%p2%' '%+%c, cuu1=\EA, ed=\EJ, el=\EK,
+	home=\EH, ht=^I, ind=\n, kbs=^H, kcub1=\ED, kcud1=\EB,
+	kcuf1=\EC, kcuu1=\EA, nel=\r\n, ri=\EI,
+
+#### DEC VT100 and compatibles
+#
+# DEC terminals from the VT100 forward are collected here. Older DEC terminals
+# and micro consoles can be found in the `obsolete' section.  More details on
+# the relationship between the VT100 and ANSI X3.64/ISO 6429/ECMA-48 may be
+# found near the end of this file.
+#
+# Except where noted, these entries are DEC's official terminfos.
+# Contact Bill Hedberg <hedberg@hannah.enet.dec.com> of Terminal Support
+# Engineering for more information.  Updated terminfos and termcaps
+# are kept available at ftp://gatekeeper.dec.com/pub/DEC/termcaps.
+#
+# In October 1995 DEC sold its terminals business, including the VT and Dorio
+# line and trademark, to SunRiver Data Systems.  SunRiver has since changed
+# its name to Boundless Technologies; see http://www.boundless.com.
+#
+
+# NOTE:  Any VT100 emulation, whether in hardware or software, almost
+# certainly includes what DEC called the `Level 1 editing extension' codes;
+# only the very oldest VT100s lacked these and there probably aren't any of
+# those left alive.  To capture these, use one of the VT102 entries.
+#
+# Note that the <xenl> glitch in vt100 is not quite the same as on the Concept,
+# since the cursor is left in a different position while in the
+# weird state (concept at beginning of next line, vt100 at end
+# of this line) so all versions of vi before 3.7 don't handle
+# <xenl> right on vt100. The correct way to handle <xenl> is when
+# you output the char in column 80, immediately output CR LF
+# and then assume you are in column 1 of the next line. If <xenl>
+# is on, am should be on too.
+#
+# I assume you have smooth scroll off or are at a slow enough baud
+# rate that it doesn't matter (1200? or less). Also this assumes
+# that you set auto-nl to "on", if you set it off use vt100-nam
+# below.
+#
+# The padding requirements listed here are guesses. It is strongly
+# recommended that xon/xoff be enabled, as this is assumed here.
+#
+# The vt100 uses <rs2> and <rf> rather than <is2>/<tbc>/<hts> because the
+# tab settings are in non-volatile memory and don't need to be
+# reset upon login. Also setting the number of columns glitches
+# the screen annoyingly. You can type "reset" to get them set.
+#
+# The VT100 series terminals have cursor ("arrows") keys which can operate
+# in two different modes: Cursor Mode and Application Mode.  Cursor Mode
+# is the reset state, and is assumed to be the normal state.  Application
+# Mode is the "set" state.  In Cursor Mode, the cursor keys transmit
+# "Esc [ {code}" sequences, conforming to ANSI standards.  In Application
+# Mode, the cursor keys transmit "Esc O <code>" sequences.  Application Mode
+# was provided primarily as an aid to the porting of VT52 applications.  It is
+# assumed that the cursor keys are normally in Cursor Mode, and expected that
+# applications such as vi will always transmit the <smkx> string.  Therefore,
+# the definitions for the cursor keys are made to match what the terminal
+# transmits after the <smkx> string is transmitted.  If the <smkx> string
+# is a null string or is not defined, then cursor keys are assumed to be in
+# "Cursor Mode", and the cursor keys definitions should match that assumption,
+# else the application may fail.  It is also expected that applications will
+# always transmit the <rmkx> string to the terminal before they exit.
+#
+# The VT100 series terminals have an auxiliary keypad, commonly referred to as
+# the "Numeric Keypad", because it is a cluster of numeric and function keys.
+# The Numeric Keypad which can operate in two different modes: Numeric Mode and
+# Application Mode.  Numeric Mode is the reset state, and is assumed to be
+# the normal state.  Application Mode is the "set" state.  In Numeric Mode,
+# the numeric and punctuation keys transmit ASCII 7-bit characters, and the
+# Enter key transmits the same as the Return key (Note: the Return key
+# can be configured to send either LF (\015) or CR LF).  In Application Mode,
+# all the keypad keys transmit "Esc O {code}" sequences.  The PF1 - PF4 keys
+# always send the same "Esc O {code}" sequences.  It is assumed that the keypad
+# is normally in Numeric Mode.  If an application requires that the keypad be
+# in Application Mode then it is expected that the user, or the application,
+# will set the TERM environment variable to point to a terminfo entry which has
+# defined the <smkx> string to include the codes that switch the keypad into
+# Application Mode, and the terminfo entry will also define function key
+# fields to match the Application Mode control codes.  If the <smkx> string
+# is a null string or is not defined, then the keypad is assumed to be in
+# Numeric Mode.  If the <smkx> string switches the keypad into Application
+# Mode, it is expected that the <rmkx> string will contain the control codes
+# necessary to reset the keypad to "Normal" mode, and it is also expected that
+# applications which transmit the <smkx> string will also always transmit the
+# <rmkx> string to the terminal before they exit.
+#
+# Here's a diagram of the VT100 keypad keys with their bindings.
+# The top line is the name of the key (some DEC keyboards have the keys
+# labelled somewhat differently, like GOLD instead of PF1, but this is
+# the most "official" name).  The second line is the escape sequence it
+# generates in Application Keypad mode (where "$" means the ESC
+# character).  The third line contains two items, first the mapping of
+# the key in terminfo, and then in termcap.
+#   _______________________________________
+#  |   PF1   |   PF2   |   PF3   |   PF4   |
+#  |   $OP   |   $OQ   |   $OR   |   $OS   |
+#  |_kf1__k1_|_kf2__k2_|_kf3__k3_|_kf4__k4_|
+#  |    7         8         9         -    |
+#  |   $Ow   |   $Ox   |   $Oy   |   $Om   |
+#  |_kf9__k9_|_kf10_k;_|_kf0__k0_|_________|
+#  |    4    |    5    |    6    |    ,    |
+#  |   $Ot   |   $Ou   |   $Ov   |   $Ol   |
+#  |_kf5__k5_|_kf6__k6_|_kf7__k7_|_kf8__k8_|
+#  |    1    |    2    |    3    |         |
+#  |   $Oq   |   $Or   |   $Os   |  enter  |
+#  |_ka1__K1_|_kb2__K2_|_ka3__K3_|  $OM    |
+#  |         0         |   .     |         |
+#  |        $Op        |  $On    |         |
+#  |___kc1_______K4____|_kc3__K5_|_kent_@8_|
+#
+# Note however, that the arrangement of the 5-key ka1-kc3 do not follow the
+# terminfo guidelines.  That is a compromise used to assign the remaining
+# keys on the keypad to kf5-kf0, used on older systems with legacy termcap
+# support:
+vt100+keypad|DEC VT100 numeric keypad no fkeys,
+	ka1=\EOq, ka3=\EOs, kb2=\EOr, kc1=\EOp, kc3=\EOn,
+vt100+pfkeys|DEC VT100 numeric keypad (kf1-kf4),
+	kent=\EOM, kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS,
+	use=vt100+keypad,
+vt100+fnkeys|DEC VT100 numeric keypad (kf0-kf10),
+	kf0=\EOy, kf10=\EOx, kf5=\EOt, kf6=\EOu, kf7=\EOv, kf8=\EOl,
+	kf9=\EOw, use=vt100+pfkeys,
+#
+# A better adaptation to modern keyboards such as the PC's, which have a dozen
+# function keys and the keypad 2,4,6,8 keys are labeled with arrows keys, is to
+# use the 5-key arrangement to model the arrow keys as suggested in the
+# terminfo guidelines:
+#   _______________________________________
+#  |   PF1   |   PF2   |   PF3   |   PF4   |
+#  |   $OP   |   $OQ   |   $OR   |   $OS   |
+#  |_kf1__k1_|_kf2__k2_|_kf3__k3_|_kf4__k4_|
+#  |    7         8         9         -    |
+#  |   $Ow   |   $Ox   |   $Oy   |   $Om   |
+#  |_ka1__K1_|_________|_ka3__K3_|_________|
+#  |    4    |    5    |    6    |    ,    |
+#  |   $Ot   |   $Ou   |   $Ov   |   $Ol   |
+#  |_________|_kb2__K2_|_________|_________|
+#  |    1    |    2    |    3    |         |
+#  |   $Oq   |   $Or   |   $Os   |  enter  |
+#  |_kc1__K4_|_________|_kc3__K5_|  $OM    |
+#  |         0         |   .     |         |
+#  |        $Op        |  $On    |         |
+#  |___________________|_________|_kent_@8_|
+#
+vt220+keypad|DEC VT220 numeric keypad,
+	ka1=\EOw, ka3=\EOy, kb2=\EOu, kc1=\EOq, kc3=\EOs, kent=\EOM,
+	kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, ka2=\EOx, kb1=\EOt,
+	kb3=\EOv, kc2=\EOr,
+#
+vt100+enq|ncurses extension for VT100-style ENQ,
+	u8=\E[?1;2c, use=ansi+enq,
+vt102+enq|ncurses extension for VT102-style ENQ,
+	u8=\E[?6c, use=ansi+enq,
+#
+# And here, for those of you with orphaned VT100s lacking documentation, is
+# a description of the soft switches invoked when you do `Set Up'.
+#
+#  Scroll 0-Jump               Shifted 3   0-#
+#  |      1-Smooth             |           1-British pound sign
+#  | Autorepeat 0-Off          | Wrap Around 0-Off
+#  | |          1-On           | |           1-On
+#  | | Screen 0-Dark Bkg       | | New Line 0-Off
+#  | | |      1-Light Bkg      | | |        1-On
+#  | | | Cursor 0-Underline    | | | Interlace 0-Off
+#  | | | |      1-Block        | | | |         1-On
+#  | | | |                     | | | |
+#  1 1 0 1       1 1 1 1       0 1 0 0       0 0 1 0       <--Standard Settings
+#                | | | |                     | | | |
+#                | | | Auto XON/XOFF 0-Off   | | | Power 0-60 Hz
+#                | | |               1-On    | | |       1-50 Hz
+#                | | ANSI/VT52 0-VT52        | | Bits Per Char. 0-7 Bits
+#                | |           1-ANSI        | |                1-8 Bits
+#                | Keyclick 0-Off            | Parity 0-Off
+#                |          1-On             |        1-On
+#                Margin Bell 0-Off           Parity Sense 0-Odd
+#                            1-On                         1-Even
+#
+# The following SET-UP modes are assumed for normal operation:
+#	ANSI_MODE	AUTO_XON/XOFF_ON	NEWLINE_OFF	80_COLUMNS
+#	WRAP_AROUND_ON  JUMP_SCROLL_OFF
+# Other SET-UP modes may be set for operator convenience or communication
+# requirements; I recommend
+#	AUTOREPEAT_ON	BLOCK_CURSOR	MARGIN_BELL_OFF    SHIFTED_3_#
+# Unless you have a graphics add-on such as Digital Engineering's VT640
+# (and even then, whenever it can be arranged!) you should set
+#	INTERLACE_OFF
+#
+# (vt100: I added <rmam>/<smam> based on the init string, also <OTbs>. -- esr)
+vt100|vt100-am|DEC VT100 (w/advanced video),
+	OTbs, mc5i, xenl, xon,
+	vt#3,
+	csr=\E[%i%p1%d;%p2%dr, kcub1=\EOD, kcud1=\EOB,
+	kcuf1=\EOC, kcuu1=\EOA, lf1=pf1, lf2=pf2, lf3=pf3, lf4=pf4,
+	mc0=\E[0i, mc4=\E[4i, mc5=\E[5i, rc=\E8, rmam=\E[?7l,
+	rmkx=\E[?1l\E>, rs2=\E<\E>\E[?3;4;5l\E[?7;8h\E[r,
+	sc=\E7,
+	sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5
+	    %;m%?%p9%t\016%e\017%;$<2>,
+	smam=\E[?7h, smkx=\E[?1h\E=, smso=\E[7m$<2>,
+	use=decid+cpr, use=vt100+4bsd, use=vt100+fnkeys,
+vt100+4bsd|DEC VT100 from 4.0BSD,
+	am, msgr,
+	cols#80, it#8, lines#24,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\E[5m$<2>, bold=\E[1m$<2>,
+	clear=\E[H\E[J$<50>, cr=\r, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C$<2>,
+	cup=\E[%i%p1%d;%p2%dH$<5>, cuu=\E[%p1%dA,
+	cuu1=\E[A$<2>, ed=\E[J$<50>, el=\E[K$<3>, el1=\E[1K$<3>,
+	enacs=\E(B\E)0, home=\E[H, ht=^I, hts=\EH, ind=\n, kbs=^H,
+	kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A,
+	rev=\E[7m$<2>, ri=\EM$<5>, rmacs=^O, rmso=\E[m$<2>,
+	rmul=\E[m$<2>, rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h,
+	sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5
+	    %;m%?%p9%t\016%e\017%;$<2>,
+	sgr0=\E[m\017$<2>, smacs=^N, smso=\E[1;7m$<2>,
+	smul=\E[4m$<2>, tbc=\E[3g,
+vt100nam|vt100-nam|VT100 no automargins,
+	am@, xenl@,
+	rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7l\E[?8h, use=vt100-am,
+vt100-vb|DEC VT100 (w/advanced video) & no beep,
+	bel@, flash=\E[?5h$<100/>\E[?5l, use=vt100,
+
+# Ordinary VT100 in 132 column ("wide") mode.
+vt100-w|vt100-w-am|DEC VT100 132 cols (w/advanced video),
+	cols#132, lines#24,
+	rs2=\E>\E[?3h\E[?4l\E[?5l\E[?8h, use=vt100-am,
+vt100-w-nam|vt100-nam-w|DEC VT100 132 cols (w/advanced video no automargin),
+	cols#132, lines#14, vt@,
+	rs2=\E>\E[?3h\E[?4l\E[?5l\E[?8h, use=vt100-nam,
+
+# VT100 with no advanced video.
+vt100-nav|VT100 without advanced video option,
+	xmc#1,
+	blink@, bold@, rev@, rmso=\E[m, rmul@, sgr@, sgr0@, smso=\E[7m,
+	smul@, use=vt100,
+vt100-nav-w|vt100-w-nav|DEC VT100 132 cols 14 lines (no advanced video option),
+	cols#132, lines#14, use=vt100-nav,
+
+# VT100 with one of the 24 lines used as a status line.
+# We put the status line on the top.
+vt100-s|vt100-s-top|vt100-top-s|VT100 for use with top sysline,
+	eslok, hs,
+	lines#23,
+	clear=\E[2;1H\E[J$<50>, csr=\E[%i%i%p1%d;%p2%dr,
+	cup=\E[%i%p1%{1}%+%d;%p2%dH$<5>, dsl=\E7\E[1;24r\E8,
+	fsl=\E8, home=\E[2;1H, is2=\E7\E[2;24r\E8,
+	tsl=\E7\E[1;%p1%dH\E[1K, use=vt100-am,
+
+# Status line at bottom.
+# Clearing the screen will clobber status line.
+vt100-s-bot|vt100-bot-s|VT100 for use with bottom sysline,
+	eslok, hs,
+	lines#23,
+	dsl=\E7\E[1;24r\E8, fsl=\E8, is2=\E[1;23r\E[23;1H,
+	tsl=\E7\E[24;%p1%dH\E[1K, use=vt100-am,
+
+# Most of the `vt100' emulators out there actually emulate a VT102
+# This entry (or vt102-nsgr) is probably the right thing to use for
+# these.
+vt102|DEC VT102,
+	dch1=\E[P, dl1=\E[M, il1=\E[L, rmir=\E[4l, smir=\E[4h,
+	use=vt100,
+vt102-w|DEC VT102 in wide mode,
+	cols#132,
+	rs3=\E[?3h, use=vt102,
+
+# Many brain-dead PC comm programs that pretend to be `vt100-compatible'
+# fail to interpret the ^O and ^N escapes properly.  Symptom: the <sgr0>
+# string in the canonical vt100 entry above leaves the screen littered
+# with little  snowflake or star characters (IBM PC ROM character \017 = ^O)
+# after highlight turnoffs.  This entry should fix that, and even leave
+# ACS support working, at the cost of making multiple-highlight changes
+# slightly more expensive.
+# From: Eric S. Raymond <esr@snark.thyrsus.com> July 22 1995
+vt102-nsgr|VT102 no sgr (use if you see snowflakes after highlight changes),
+	sgr@, sgr0=\E[m, use=vt102,
+
+# VT125 Graphics CRT.  Clear screen also erases graphics
+# Some VT125's came configured with VT102 support.
+vt125|VT125 graphics terminal,
+	mir,
+	clear=\E[H\E[2J\EPpS(E)\E\\$<50>, use=vt100,
+
+# This isn't a DEC entry, it came from University of Wisconsin.
+# (vt131: I added <rmam>/<smam> based on the init string, also <OTbs> -- esr)
+vt131|DEC VT131,
+	OTbs, am, xenl,
+	cols#80, it#8, lines#24, vt#3,
+	bel=^G, blink=\E[5m$<2/>, bold=\E[1m$<2/>,
+	clear=\E[;H\E[2J$<50/>, cr=\r, csr=\E[%i%p1%d;%p2%dr,
+	cub1=^H, cud1=\n, cuf1=\E[C$<2/>,
+	cup=\E[%i%p1%d;%p2%dH$<5/>, cuu1=\E[A$<2/>,
+	ed=\E[J$<50/>, el=\E[K$<3/>, home=\E[H, ht=^I,
+	is2=\E[1;24r\E[24;1H, kbs=^H, kcub1=\EOD, kcud1=\EOB,
+	kcuf1=\EOC, kcuu1=\EOA, kf1=\EOP, kf2=\EOQ, kf3=\EOR,
+	kf4=\EOS, nel=\r\n, rc=\E8, rev=\E[7m$<2/>, ri=\EM$<5/>,
+	rmam=\E[?7h, rmkx=\E[?1l\E>, rmso=\E[m$<2/>,
+	rmul=\E[m$<2/>,
+	rs1=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, sc=\E7,
+	sgr0=\E[m$<2/>, smam=\E[?7h, smkx=\E[?1h\E=,
+	smso=\E[7m$<2/>, smul=\E[4m$<2/>,
+
+# vt132 - like vt100 but slower and has ins/del line and such.
+# I'm told that <smir>/<rmir> are backwards in the terminal from the
+# manual and from the ANSI standard, this describes the actual
+# terminal. I've never actually used a vt132 myself, so this
+# is untested.
+#
+vt132|DEC VT132,
+	xenl,
+	dch1=\E[P$<7>, dl1=\E[M$<99>, il1=\E[L$<99>, ind=\n$<30>,
+	ip=$<7>, rmir=\E[4h, smir=\E[4l, use=vt100,
+
+# This vt220 description maps F5--F9 to the second block of function keys
+# at the top of the keyboard.  The "DO" key is used as F10 to avoid conflict
+# with the key marked (ESC) on the vt220.  See vt220d for an alternate mapping.
+# PF1--PF4 are used as F1--F4.
+#
+# added msgr -TD
+vt220-old|vt200-old|DEC VT220 in VT100 emulation mode,
+	OTbs, OTpt, am, mir, msgr, xenl, xon,
+	cols#80, lines#24, vt#3,
+	OTnl=\n,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\E[5m$<2>, bold=\E[1m$<2>,
+	clear=\E[H\E[2J$<50>, cr=\r, csr=\E[%i%p1%d;%p2%dr,
+	cub1=^H, cud1=\E[B, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH$<10>, cuu1=\E[A, dch1=\E[P,
+	dl1=\E[M, ed=\E[J$<50>, el=\E[K$<3>, home=\E[H, ht=^I,
+	if=/usr/share/tabset/vt100, il1=\E[L, ind=\ED$<20/>,
+	is2=\E[1;24r\E[24;1H, kbs=^H, kcub1=\E[D, kcud1=\E[B,
+	kcuf1=\E[C, kcuu1=\E[A, kf1=\EOP, kf10=\E[29~, kf2=\EOQ,
+	kf3=\EOR, kf4=\EOS, kf5=\E[17~, kf6=\E[18~, kf7=\E[19~,
+	kf8=\E[20~, kf9=\E[21~, kich1=\E[2~, rc=\E8, rev=\E[7m$<2>,
+	rf=/usr/share/tabset/vt100, ri=\EM$<14/>,
+	rmacs=\E(B$<4>, rmam=\E[?7l, rmir=\E[4l, rmso=\E[27m,
+	rmul=\E[24m, rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h,
+	sc=\E7,
+	sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p4%t;5%;%?%p1%p3%|%t;7%;m%?
+	    %p9%t\E(0%e\E(B%;$<2>,
+	sgr0=\E[m$<2>, smacs=\E(0$<2>, smam=\E[?7h, smir=\E[4h,
+	smso=\E[7m, smul=\E[4m, use=vt220+pcedit, use=vt220+cvis,
+
+# Here's a picture of the Sun/PC editing keypad:
+#	+--------+--------+--------+
+#	| Insert | Home   | PageUp |
+#	+--------+--------+--------+
+#	| Delete | End    | PageDn |
+#	+--------+--------+--------+
+#
+# VT220 emulators such as xterm, using PC-keyboards use a different layout than
+# the VT220 keyboard:
+#	VT220		PC
+#	-----		--
+#	Prev		PageUp
+#	Next		PageDn
+#	Insert		Insert
+#	Remove		Delete
+#	Find		Home
+#	Select		End
+vt220+pcedit|editing-keypad for VT220 using PC keyboard,
+	kdch1=\E[3~, kend=\E[4~, khome=\E[1~, kich1=\E[2~,
+	knp=\E[6~, kpp=\E[5~,
+vt220+vtedit|editing-keypad for VT220 using DEC keyboard,
+	kdch1=\E[3~, kfnd=\E[1~, kich1=\E[2~, knp=\E[6~, kpp=\E[5~,
+	kslt=\E[4~,
+
+# A much better description of the VT200/220; used to be vt220-8
+# changed rmacs/smacs from shift-in/shift-out to vt200-old's explicit G0/G1
+# designation to accommodate bug in pcvt -TD
+#
+# Here's a picture of the VT220 editing keypad:
+#	+--------+--------+--------+
+#	| Find   | Insert | Remove |
+#	+--------+--------+--------+
+#	| Select | Prev   | Next   |
+#	+--------+--------+--------+
+#
+# Still, this is a "base" entry.  Software emulators commonly leave out the
+# DECTCEM feature -TD
+vt220-base|DEC VT220 as emulated,
+	OTbs, am, mir, msgr, xenl, xon,
+	cols#80, it#8, lines#24, vt#3,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[J, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M,
+	ech=\E[%p1%dX, ed=\E[J, el=\E[K, el1=\E[1K, enacs=\E)0,
+	flash=\E[?5h$<200/>\E[?5l, home=\E[H, ht=^I, hts=\EH,
+	ich=\E[%p1%d@, if=/usr/share/tabset/vt100,
+	il=\E[%p1%dL, il1=\E[L, ind=\ED,
+	is2=\E[?7h\E[>\E[?1l\E F\E[?4l, kbs=^H, kcub1=\E[D,
+	kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kdch1=\E[3~, kf1=\EOP,
+	kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\E[25~,
+	kf14=\E[26~, kf17=\E[31~, kf18=\E[32~, kf19=\E[33~,
+	kf2=\EOQ, kf20=\E[34~, kf3=\EOR, kf4=\EOS, kf6=\E[17~,
+	kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, khlp=\E[28~,
+	krdo=\E[29~, lf1=pf1, lf2=pf2, lf3=pf3, lf4=pf4, nel=\EE,
+	rc=\E8, rev=\E[7m, ri=\EM, rmacs=\E(B$<4>, rmam=\E[?7l,
+	rmir=\E[4l, rmso=\E[27m, rmul=\E[24m, rs1=\E[?3l, sc=\E7,
+	sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p4%t;5%;%?%p1%p3%|%t;7%;m%?
+	    %p9%t\E(0%e\E(B%;$<2>,
+	sgr0=\E[m\E(B, smacs=\E(0$<2>, smam=\E[?7h, smir=\E[4h,
+	smso=\E[7m, smul=\E[4m, tbc=\E[3g, use=vt220+vtedit,
+	use=ansi+pp, use=ansi+enq,
+vt220|vt200|DEC VT220,
+	use=vt220+cvis, use=vt220-base,
+vt220-w|vt200-w|DEC VT220 in wide mode,
+	cols#132,
+	rs3=\E[?3h, use=vt220,
+vt220-8bit|vt220-8|vt200-8bit|vt200-8|DEC VT220/200 in 8-bit mode,
+	OTbs, am, mc5i, mir, msgr, xenl, xon,
+	cols#80, it#8, lines#24, vt#3,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\2335m, bold=\2331m, clear=\233H\233J, cr=\r,
+	csr=\233%i%p1%d;%p2%dr, cub=\233%p1%dD, cub1=^H,
+	cud=\233%p1%dB, cud1=\n, cuf=\233%p1%dC, cuf1=\233C,
+	cup=\233%i%p1%d;%p2%dH, cuu=\233%p1%dA, cuu1=\233A,
+	dch=\233%p1%dP, dch1=\233P, dl=\233%p1%dM, dl1=\233M,
+	ech=\233%p1%dX, ed=\233J, el=\233K, el1=\2331K, enacs=\E)0,
+	flash=\233?5h$<200/>\233?5l, home=\233H, ht=^I, hts=\EH,
+	ich=\233%p1%d@, if=/usr/share/tabset/vt100,
+	il=\233%p1%dL, il1=\233L, ind=\ED,
+	is2=\233?7h\233>\233?1l\E F\233?4l, kbs=^H,
+	kcub1=\233D, kcud1=\233B, kcuf1=\233C, kcuu1=\233A,
+	kdch1=\2333~, kf1=\EOP, kf10=\23321~, kf11=\23323~,
+	kf12=\23324~, kf13=\23325~, kf14=\23326~, kf17=\23331~,
+	kf18=\23332~, kf19=\23333~, kf2=\EOQ, kf20=\23334~,
+	kf3=\EOR, kf4=\EOS, kf6=\23317~, kf7=\23318~, kf8=\23319~,
+	kf9=\23320~, kfnd=\2331~, khlp=\23328~, khome=\233H,
+	kich1=\2332~, knp=\2336~, kpp=\2335~, krdo=\23329~,
+	kslt=\2334~, lf1=pf1, lf2=pf2, lf3=pf3, lf4=pf4, mc0=\233i,
+	mc4=\2334i, mc5=\2335i, nel=\EE, rc=\E8, rev=\2337m, ri=\EM,
+	rmacs=\E(B, rmam=\233?7l, rmir=\2334l, rmso=\23327m,
+	rmul=\23324m, rs1=\233?3l, sc=\E7,
+	sgr=\2330%?%p6%t;1%;%?%p2%t;4%;%?%p4%t;5%;%?%p1%p3%|%t;7%;m
+	    %?%p9%t\E(0%e\E(B%;$<2>,
+	sgr0=\2330m\E(B, smacs=\E(0, smam=\233?7h, smir=\2334h,
+	smso=\2337m, smul=\2334m, tbc=\2333g, use=vt220+cvis8,
+
+# vt220d:
+# This VT220 description regards F6--F10 as the second block of function keys
+# at the top of the keyboard.  This mapping follows the description given
+# in the VT220 Programmer Reference Manual and agrees with the labeling
+# on some terminals that emulate the VT220.  There is no support for an F5.
+# See vt220 for an alternate mapping.
+#
+vt220d|DEC VT220 in VT100 mode with DEC function key labeling,
+	kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\E[25~,
+	kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, kf17=\E[31~,
+	kf18=\E[32~, kf19=\E[33~, kf20=\E[34~, kf5@, kf6=\E[17~,
+	kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, use=vt220-old,
+
+vt220-nam|v200-nam|VT220 in VT100 mode with no auto margins,
+	am@,
+	rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7l\E[?8h, use=vt220,
+
+# vt220 termcap written Tue Oct 25 20:41:10 1988 by Alex Latzko
+# (not an official DEC entry!)
+# The problem with real VT220 terminals is they don't send escapes when in
+# in VT220 mode.  This can be gotten around two ways.  1> don't send
+# escapes or 2> put the VT220 into VT100 mode and use all the nifty
+# features of VT100 advanced video which it then has.
+#
+# This entry takes the view of putting a VT220 into VT100 mode so
+# you can use the escape key in emacs and everything else which needs it.
+#
+# You probably don't want to use this on a VMS machine since VMS will think
+# it has a VT220 and will get fouled up coming out of emacs
+#
+# From: Alexander Latzko <latzko@marsenius.rutgers.edu>, 30 Dec 1996
+# (Added vt100 <rc>,<sc> to quiet a tic warning -- esr)
+# added msgr -TD
+vt200-js|vt220-js|DEC VT200 series with jump scroll,
+	am, msgr,
+	cols#80,
+	bel=^G, clear=\E[H\E[J, cr=\r, csr=\E[%i%p1%d;%p2%dr,
+	cub1=^H, cud1=\n, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH,
+	cuu1=\E[A, dch1=\E[P, dl1=\E[M, ed=\E[J, el=\E[K, home=\E[H,
+	ht=^I, il1=\E[L, ind=\ED,
+	is2=\E[61"p\E[H\E[?3l\E[?4l\E[?1h\E[?5l\E[?6l\E[?7h\E[?8h\E[
+	    ?25h\E>\E[m,
+	kbs=^H, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
+	kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, nel=\r\ED, rc=\E8,
+	rf=/usr/share/tabset/vt100, ri=\EM, rmdc=, rmir=\E[4l,
+	rmkx=\E[?1l\E>, rmso=\E[27m$<5/>, rmul=\E[24m,
+	rs1=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, sc=\E7, smdc=,
+	smir=\E[4h, smkx=\E[?1h\E=, smso=\E[7m$<5/>, smul=\E[4m,
+	use=vt220+cvis,
+
+# This was DEC's VT320.  Use the purpose-built one below instead
+#vt320|DEC VT320 in VT100 emulation mode,
+#	use=vt220,
+
+# Use v320n for SCO's LYRIX.  Otherwise, use Adam Thompson's vt320-nam.
+#
+vt320nam|v320n|DEC VT320 in VT100 emul. mode with NO AUTO WRAP mode,
+	am@,
+	rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7l\E[?8h,
+	use=vt220-base,
+
+# These entries are not DEC's official ones, they were purpose-built for the
+# VT320.  Here are the designer's notes:
+# <kel> is end on a PC kbd.  Actually 'select' on a VT.  Mapped to
+# 'Erase to End of Field'... since nothing seems to use 'end' anyways...
+# khome is Home on a PC kbd.  Actually 'FIND' on a VT.
+# Things that use <knxt> usually use tab anyways... and things that don't use
+# tab usually use <knxt> instead...
+# kprv is same as tab - Backtab is useless...
+# I left out <sgr> because of its RIDICULOUS complexity,
+# and the resulting fact that it causes the termcap translation of the entry
+# to SMASH the 1k-barrier...
+# From: Adam Thompson <athompso@pangea.ca> Sept 10 1995
+# (vt320: uncommented <fsl> --esr)
+vt320|vt300|DEC VT320 7 bit terminal,
+	am, mir, msgr, xenl,
+	cols#80, lines#24, wsl#80,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[2J, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M,
+	ech=\E[%p1%dX, ed=\E[J, el=\E[K, el1=\E[1K, home=\E[H, ht=^I,
+	hts=\EH, ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[L, ind=\ED,
+	is2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h\E[1;24r\E[24;1H,
+	kbs=^?, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
+	kdch1=\E[3~, kel=\E[4~, kf10=\E[21~, kf11=\E[23~,
+	kf12=\E[24~, kf13=\E[25~, kf14=\E[26~, kf15=\E[28~,
+	kf16=\E[29~, kf17=\E[31~, kf18=\E[32~, kf19=\E[33~,
+	kf20=\E[34~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~,
+	kf9=\E[20~, khome=\E[1~, kich1=\E[2~, knp=\E[6~, knxt=^I,
+	kpp=\E[5~, kprv=\E[Z, kslt=\E[4~, nel=\EE, rc=\E8, rev=\E[7m,
+	rf=/usr/share/tabset/vt300, ri=\EM, rmacs=\E(B,
+	rmam=\E[?7l, rmir=\E[4l, rmkx=\E[?1l\E>, rmso=\E[m,
+	rmul=\E[m,
+	rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h\E[1;24r\E[24;1H,
+	sc=\E7,
+	sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p4%t;5%;%?%p1%p3%|%t;7%;m%?
+	    %p9%t\E(0%e\E(B%;$<2>,
+	sgr0=\E[m\E(B, smacs=\E(0, smam=\E[?7h, smir=\E[4h,
+	smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m, tbc=\E[3g,
+	use=dec+pp, use=vt220+cvis, use=vt220+keypad, use=dec+sl,
+	use=ansi+enq,
+vt320-nam|vt300-nam|DEC VT320 7 bit terminal with no am to make SAS happy,
+	am@,
+	is2=\E>\E[?3l\E[?4l\E[?5l\E[?7l\E[?8h\E[1;24r\E[24;1H,
+	rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7l\E[?8h\E[1;24r\E[24;1H, use=vt320,
+# We have to init 132-col mode, not 80-col mode.
+vt320-w|vt300-w|DEC VT320 wide 7 bit terminal,
+	cols#132, wsl#132,
+	is2=\E>\E[?3h\E[?4l\E[?5l\E[?7h\E[?8h\E[1;24r\E[24;1H,
+	rs2=\E>\E[?3h\E[?4l\E[?5l\E[?7h\E[?8h\E[1;24r\E[24;1H, use=vt320,
+vt320-w-nam|vt300-w-nam|DEC VT320 wide 7 bit terminal with no am,
+	am@,
+	is2=\E>\E[?3h\E[?4l\E[?5l\E[?7l\E[?8h\E[1;24r\E[24;1H,
+	rs2=\E>\E[?3h\E[?4l\E[?5l\E[?7l\E[?8h\E[1;24r\E[24;1H, use=vt320-w,
+
+# VT330 and VT340 -- These are ReGIS and SIXEL graphics terminals
+#   which are pretty much a superset of the VT320.  They have the
+#   host writable status line, yet another different DRCS matrix size,
+#   and such, but they add the DEC Technical character set, Multiple text
+#   pages, selectable length pages, and the like.  The difference between
+#   the VT330 and VT340 is that the former has only 2 planes and a monochrome
+#   monitor, the latter has 4 planes and a color monitor.  These terminals
+#   support VT131 and ANSI block mode, but as with much of these things,
+#   termcap/terminfo doesn't deal with these features.
+#
+# Note that this entry is are set up in what was the standard way for GNU
+# Emacs v18 terminal modes to deal with the cursor keys in that the arrow
+# keys were switched into application mode at the same time the numeric pad
+# is switched into application mode.  This changes the definitions of the
+# arrow keys.  Emacs v19 is smarter and mines its keys directly out of
+# your termcap or terminfo entry,
+#
+# From: Daniel Glasser <dag@persoft.persoft.com>, 13 Oct 1993
+# (vt340: string capability "sb=\E[M" corrected to "sr";
+# also, added <rmam>/<smam> based on the init string -- esr)
+vt340|dec-vt340|vt330|dec-vt330|DEC VT340 graphics terminal with 24 line page,
+	am, eslok, hs, mir, msgr, xenl, xon,
+	cols#80, it#8, lines#24, vt#3,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	blink=\E[5m, bold=\E[1m, clear=\E[H\E[J, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M,
+	dsl=\E[2$~\r\E[1$}\E[K\E[$}, ed=\E[J, el=\E[K,
+	flash=\E[?5h$<200/>\E[?5l, fsl=\E[$}, home=\E[H, ht=^I,
+	hts=\EH, ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[L, ind=\ED,
+	is2=\E<\E\sF\E>\E[?1h\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h\E[1;24r
+	    \E[24;1H,
+	kbs=^H, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
+	kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf6=\E[17~,
+	kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, lf1=pf1, lf2=pf2,
+	lf3=pf3, lf4=pf4, nel=\r\ED, rc=\E8, rev=\E[7m,
+	rf=/usr/share/tabset/vt300, ri=\EM, rmacs=\E(B,
+	rmam=\E[?7l, rmir=\E[4l, rmkx=\E[?1l\E>, rmso=\E[27m,
+	rmul=\E[24m, rs1=\E[?3l, sc=\E7,
+	sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p4%t;5%;%?%p1%p3%|%t;7%;m%?
+	    %p9%t\E(0%e\E(B%;$<2>,
+	sgr0=\E[m\E(B, smacs=\E(0, smam=\E[?7h, smir=\E[4h,
+	smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m, tbc=\E[3g,
+	tsl=\E[2$~\E[1$}\E[1;%dH, use=vt220+cvis,
+
+# Left/right margins are supported in xterm since patch #279 (2012/05/10)
+vt420+lrmm|VT420 left/right margins,
+	mgc=\E[?69l, smglp=\E[?69h\E[%i%p1%ds,
+	smglr=\E[?69h\E[%i%p1%d;%p2%ds,
+	smgrp=\E[?69h\E[%i;%p1%ds,
+
+# DEC doesn't supply a VT400 description, so we add Daniel Glasser's
+# (originally written with VT420 as its primary name, and usable for it).
+#
+# VT400/420 -- This terminal is a superset of the VT320.  It adds the multiple
+#    text pages and long text pages with selectable length of the VT340, along
+#    with left and right margins, rectangular area text copy, fill, and erase
+#    operations, selected region character attribute change operations,
+#    page memory and rectangle checksums, insert/delete column, reception
+#    macros, and other features too numerous to remember right now.  TERMCAP
+#    can only take advantage of a few of these added features.
+#
+# Note that this entry is set up in what was the standard way for GNU
+# Emacs v18 terminal modes to deal with the cursor keys in that the arrow
+# keys were switched into application mode at the same time the numeric pad
+# is switched into application mode.  This changes the definitions of the
+# arrow keys.  Emacs v19 is smarter and mines its keys directly out of
+# your termcap entry,
+#
+# From: Daniel Glasser <dag@persoft.persoft.com>, 13 Oct 1993
+# (vt400: string capability ":sb=\E[M:" corrected to ":sr=\E[M:";
+# also, added <rmam>/<smam> based on the init string -- esr)
+vt400|vt400-24|dec-vt400|DEC VT400 24x80 column autowrap,
+	am, eslok, mir, msgr, xenl, xon,
+	cols#80, it#8, lines#24, vt#3,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	blink=\E[5m, bold=\E[1m, clear=\E[H\E[J$<10/>, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M,
+	dsl=\E[2$~\r\E[1$}\E[K\E[$}, ed=\E[J$<10/>,
+	el=\E[K$<4/>, flash=\E[?5h$<200/>\E[?5l, fsl=\E[$},
+	home=\E[H, ht=^I, hts=\EH, ich=\E[%p1%d@, ich1=\E[@,
+	il=\E[%p1%dL, il1=\E[L, ind=\ED,
+	is2=\E<\E\sF\E>\E[?1h\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h\E[1;24r
+	    \E[24;1H,
+	kbs=^H, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
+	kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf6=\E[17~,
+	kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, lf1=pf1, lf2=pf2,
+	lf3=pf3, lf4=pf4, nel=\r\ED, rc=\E8, rev=\E[7m,
+	rf=/usr/share/tabset/vt300, ri=\EM, rmacs=\E(B,
+	rmam=\E[?7l, rmir=\E[4l, rmkx=\E[?1l\E>, rmso=\E[27m,
+	rmul=\E[24m, rs1=\E<\E[?3l\E[!p\E[?7h, sc=\E7,
+	sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p4%t;5%;%?%p1%p3%|%t;7%;m%?
+	    %p9%t\E(0%e\E(B%;$<2>,
+	sgr0=\E[m\E(B, smacs=\E(0, smam=\E[?7h, smir=\E[4h,
+	smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m, tbc=\E[3g,
+	tsl=\E[2$~\E[1$}\E[1;%dH, use=dec+sl, use=vt220+cvis,
+
+# (vt420: I removed <kf0>, it collided with <kf10>.  I also restored
+# a missing <sc> -- esr)
+# add msgr and other capabilities from vt220 -TD
+vt420|DEC VT420,
+	am, mir, msgr, xenl, xon,
+	cols#80, it#8, lines#24, vt#3,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\E[5m$<2>, bold=\E[1m$<2>,
+	clear=\E[H\E[2J$<50>, cr=\r, csr=\E[%i%p1%d;%p2%dr,
+	cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=\n,
+	cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH$<10>,
+	cuu=\E[%p1%dA, cuu1=\E[A, dch=\E[%p1%dP, dch1=\E[P,
+	dl=\E[%p1%dM, dl1=\E[M, ech=\E[%p1%dX, ed=\E[J$<50>,
+	el=\E[K$<3>, el1=\E[1K, enacs=\E)0,
+	flash=\E[?5h$<200/>\E[?5l, home=\E[H, ht=^I, hts=\EH,
+	ich=\E[%p1%d@, if=/usr/share/tabset/vt300,
+	il=\E[%p1%dL, il1=\E[L, ind=\ED, is2=\E[1;24r\E[24;1H,
+	is3=\E[?67h\E[64;1"p, kbs=^H, kcub1=\E[D, kcud1=\E[B,
+	kcuf1=\E[C, kcuu1=\E[A, kf1=\EOP, kf10=\E[29~, kf2=\EOQ,
+	kf3=\EOR, kf4=\EOS, kf5=\E[17~, kf6=\E[18~, kf7=\E[19~,
+	kf8=\E[20~, kf9=\E[21~, nel=\EE, rc=\E8, rev=\E[7m$<2>,
+	rf=/usr/share/tabset/vt300, ri=\EM, rmacs=\E(B$<4>,
+	rmam=\E[?7l, rmir=\E[4l, rmkx=\E>,
+	rmsc=\E[?0;0r\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h,
+	rmso=\E[27m, rmul=\E[24m, rs3=\E[?67h\E[64;1"p, sc=\E7,
+	sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p4%t;5%;%?%p1%p3%|%t;7%;m%?
+	    %p9%t\E(0%e\E(B%;$<2>,
+	sgr0=\E[m\E(B$<2>, smacs=\E(0$<2>, smam=\E[?7h,
+	smir=\E[4h, smkx=\E=, smso=\E[7m, smul=\E[4m, tbc=\E[3g,
+	use=vt220+vtedit, use=ansi+pp, use=dec+sl, use=ansi+enq,
+	use=vt220+cvis, use=vt420+lrmm,
+
+# DEC VT220 and up support DECUDK (user-defined keys).  DECUDK (i.e., pfx)
+# takes two parameters, the key and the string.  Translating the key is
+# straightforward (keys 1-5 are not defined on real terminals, though some
+# emulators define these):
+#
+#               if (key < 16) then  value = key;
+#               else if (key < 21) then value = key + 1;
+#               else if (key < 25) then value = key + 2;
+#               else if (key < 27) then value = key + 3;
+#               else if (key < 30) then value = key + 4;
+#               else value = key + 5;
+#
+# The string must be the hexadecimal equivalent, e.g., "5052494E" for "PRINT".
+# There's no provision in terminfo for emitting a string in this format, so the
+# application has to know it.
+#
+vt420pc|DEC VT420 w/PC keyboard,
+	kdch1=^?, kend=\E[4~, kf1=\E[11~, kf10=\E[21~, kf11=\E[23~,
+	kf12=\E[24~, kf13=\E[11;2~, kf14=\E[12;2~, kf15=\E[13;2~,
+	kf16=\E[14;2~, kf17=\E[15;2~, kf18=\E[17;2~,
+	kf19=\E[18;2~, kf2=\E[12~, kf20=\E[19;2~, kf21=\E[20;2~,
+	kf22=\E[21;2~, kf23=\E[23;2~, kf24=\E[24;2~, kf25=\E[23~,
+	kf26=\E[24~, kf27=\E[25~, kf28=\E[26~, kf29=\E[28~,
+	kf3=\E[13~, kf30=\E[29~, kf31=\E[31~, kf32=\E[32~,
+	kf33=\E[33~, kf34=\E[34~, kf35=\E[35~, kf36=\E[36~,
+	kf37=\E[23;2~, kf38=\E[24;2~, kf39=\E[25;2~, kf4=\E[14~,
+	kf40=\E[26;2~, kf41=\E[28;2~, kf42=\E[29;2~,
+	kf43=\E[31;2~, kf44=\E[32;2~, kf45=\E[33;2~,
+	kf46=\E[34;2~, kf47=\E[35;2~, kf48=\E[36;2~, kf5=\E[15~,
+	kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, khome=\E[H,
+	pctrm=USR_TERM:vt420pcdos:,
+	pfx=\EP1;1|%?%{16}%p1%>%t%{0}%e%{21}%p1%>%t%{1}%e%{25}%p1%>
+	    %t%{2}%e%{27}%p1%>%t%{3}%e%{30}%p1%>%t%{4}%e%{5}%;%p1%+
+	    %d/%p2%s\E\\,
+	use=vt420,
+
+vt420pcdos|DEC VT420 w/PC for DOS Merge,
+	lines#25,
+	dispc=%?%p1%{19}%=%t\E\023\021%e%p1%{32}%<%t\E%p1%c%e%p1
+	      %{127}%=%t\E\177%e%p1%c%;,
+	pctrm@,
+	rmsc=\E[?0;0r\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, sgr@,
+	sgr0=\E[m, smsc=\E[?1;2r\E[34h, use=vt420pc,
+
+vt420f|DEC VT420 with VT kbd; VT400 mode; F1-F5 used as Fkeys,
+	kdch1=^?, kf1=\E[11~, kf10=\E[21~, kf11=\E[23~,
+	kf12=\E[24~, kf13=\E[25~, kf14=\E[26~, kf15=\E[28~,
+	kf16=\E[29~, kf17=\E[31~, kf18=\E[32~, kf19=\E[33~,
+	kf2=\E[12~, kf20=\E[34~, kf3=\E[13~, kf4=\E[14~,
+	kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~,
+	khome=\E[H, lf1=\EOP, lf2=\EOQ, lf3=\EOR, lf4=\EOS,
+	use=vt420,
+
+vt510|DEC VT510,
+	use=vt420,
+vt510pc|DEC VT510 w/PC keyboard,
+	use=vt420pc,
+vt510pcdos|DEC VT510 w/PC for DOS Merge,
+	use=vt420pcdos,
+
+# VT520/VT525
+#
+# The VT520 is a monochrome text terminal capable of managing up to
+# four independent sessions in the terminal.  It has multiple ANSI
+# emulations (VT520, VT420, VT320, VT220, VT100, VT PCTerm, SCO Console)
+# and ASCII emulations (WY160/60, PCTerm, 50/50+, 150/120, TVI 950,
+# 925 910+, ADDS A2).  This terminfo data is for the ANSI emulations only.
+#
+# Terminal Set-Up is entered by pressing [F3], [Caps Lock]/[F3] or
+# [Alt]/[Print Screen] depending upon which keyboard and which
+# terminal mode is being used.  If Set-Up has been disabled or
+# assigned to an unknown key, Set-Up may be entered by pressing
+# [F3] as the first key after power up, regardless of keyboard type.
+vt520|DEC VT520,
+	use=ansi+rca, use=vt420, use=ansi+tabs,
+
+vt525|DEC VT525,
+	use=vt520,
+
+# I just got a brand new Boundless VT520 with that company's "ANSI 2011"
+# Keyboard, which replaces the old LK41R-AA keyboard.
+#
+# In trying to get the function keys to work, I had to cobble my own
+# terminfo.src entry, since the existing vt520 entry doesn't include most of
+# the function keys.  If I blend the entries for "vt420f" and "vt220+keypad"
+# I seem to get them all -Mike Gran
+vt520ansi|Boundless VT520 ANSI,
+	use=ansi+rca, use=vt420f, use=vt220+keypad,
+	use=ansi+tabs,
+
+#### VT100 emulations
+
+# John Hawkinson <jhawk@MIT.EDU> tells us that the EWAN telnet for Windows
+# (the best Windows telnet as of September 1995) presents the name `dec-vt100'
+# to telnetd.   Michael Deutschmann <ldeutsch@mail.netshop.net> informs us
+# that this works best with a stock vt100 entry.
+dec-vt100|EWAN telnet's vt100 emulation,
+	use=vt100,
+
+# From: Adrian Garside <94ajg2@eng.cam.ac.uk>, 19 Nov 1996
+dec-vt220|DOS tnvt200 terminal emulator,
+	am@, use=vt220,
+
+# Zstem340 is an (IMHO) excellent VT emulator for PC's.  I recommend it to
+# anyone who needs PC VT340 emulation. (or anything below that level, for
+# that matter -- DEC's ALL-in-1 seems happy with it, as does INFOPLUS's
+# RDBM systems, it includes ReGIS and Sixel support!  I'm impressed...
+# I can send the address if requested.
+# (z340: changed garbled \E[5?l to \E[?5l, DEC smooth scroll off -- esr)
+# From: Adam Thompson <athompso@pangea.ca> Sept 10 1995
+z340|ZSTEM VT340 terminal emulator 132col 42line,
+	lines#42,
+	is2=\E>\E[?3h\E[?4l\E[?5l\E[?7h\E[?8h\E[1;42r\E[42;1H,
+	rs2=\E>\E[?3h\E[?4l\E[?5l\E[?7h\E[?8h\E[1;42r\E[42;1H, use=vt320-w,
+z340-nam|ZSTEM VT340 terminal emulator 132col 42line (no automatic margins),
+	am@,
+	is2=\E>\E[?3h\E[?4l\E[?5l\E[?7l\E[?8h\E[1;42r\E[42;1H,
+	rs2=\E>\E[?3h\E[?4l\E[?5l\E[?7l\E[?8h\E[1;42r\E[42;1H, use=z340,
+
+# expect-5.44.1.15/example/tkterm
+# a minimal subset of a VT100 (compare with "news-unk).
+#
+# The missing "=" in smkx is not a typo (here), but an error in tkterm.
+tt|tkterm|Don Libes' tk text widget terminal emulator,
+	clear=\E[H\E[J, cr=\r, cub1=^H, cud1=\n, cuf1=\E[C,
+	cup=\E[%p1%d;%p2%dH, cuu1=\E[A, ind=\n, kf1=\EOP, kf2=\EOQ,
+	kf3=\EOR, kf4=\EOS, kf5=\EOT, kf6=\EOU, kf7=\EOV, kf8=\EOW,
+	kf9=\EOX, rmkx=\E[?1l\E>, rmso=\E[m, smkx=\E[?1h\E,
+	smso=\E[7m,
+
+######## APPLE
+
+#### Terminal.app
+
+# nsterm*|Apple_Terminal - AppKit Terminal.app
+#
+# Terminal.app is a Terminal emulator bundled with NeXT's NeXTSTEP and
+# OPENSTEP/Mach operating systems, and with Apple's Rhapsody, Mac OS X
+# Server and Mac OS X operating systems. There is also a
+# "terminal.app" in GNUstep, but I believe it to be an unrelated
+# codebase and I have not attempted to describe it here.
+#
+# For NeXTSTEP, OPENSTEP/Mach, Rhapsody and Mac OS X Server 1.0, you
+# are pretty much on your own. Use "nsterm-7-m" and hope for the best.
+# You might also try "nsterm-7" and "nsterm-old" if you suspect your
+# version supports color.
+#
+# To determine the version of Terminal.app you're using by running:
+#
+#     echo "$TERM_PROGRAM" "$TERM_PROGRAM_VERSION"
+#
+# For Apple_Terminal v309+, use "nsterm-256color" (or "nsterm-bce")
+#
+# For Apple_Terminal v200+, use "nsterm-16color" (a.k.a. "nsterm")
+#
+# For Apple_Terminal v71+/v100+, use "nsterm-bce".
+#
+# For Apple_Terminal v51+, use "nsterm-7-c" or "nsterm-7-c-s".
+#
+# For Apple_Terminal v41+, use "nsterm-old", or "nsterm-s".
+#
+# For all earlier versions (Apple_Terminal), try "nsterm-7-m"
+# (monochrome) or "nsterm-7" (color); "nsterm-7-m-s" and "nsterm-7-s"
+# might work too, but really you're on your own here since these
+# systems are very obsolete and I can't test them. I do welcome
+# patches, though :).
+
+# Other Terminals:
+#
+# For GNUstep_Terminal, you're probably best off using "linux" or
+# writing your own terminfo.
+
+# For MacTelnet, you're on your own. It's a different codebase, and
+# seems to be somewhere between "vt102", "ncsa" and "xterm-color".
+
+# For iTerm.app, see "iterm".
+
+#
+# The AppKit Terminal.app descriptions all have names beginning with
+# "nsterm". Note that the statusline (-s) versions use the window
+# titlebar as a phony status line, and may produce warnings during
+# compilation as a result ("tsl uses 0 parameters, expected 1".)
+# Ignore these warnings, or even ignore these entries entirely. Apps
+# which need to position the cursor or do other fancy stuff inside the
+# status line won't work with these entries. They're primarily useful
+# for programs like Pine which provide simple notifications in the
+# status line. Please note that non-ASCII characters don't work right
+# in the status line, since Terminal.app incorrectly interprets their
+# Unicode codepoints as MacRoman codepoints (in earlier Mac OS X
+# versions) or only accepts status lines consisting entirely of
+# characters from the first 256 Unicode positions (including C1 but
+# not C0 or DEL.)
+#
+# The Mythology* of AppKit Terminal.app:
+#
+# In the days of NeXTSTEP 0.x and 1.x there were two incompatible
+# bundled terminal emulators, Shell and Terminal. Scott Hess wrote a
+# shareware replacement for Terminal called "Stuart" which NeXT bought
+# and used as the basis for the Terminal.app in NeXTSTEP 2+,
+# OPENSTEP/Mach, Apple Rhapsody, Mac OS X Server 1.0, and Mac OS X. I
+# don't know the TERM_PROGRAM and TERM_PROGRAM_VERSION settings or
+# capabilities for the early versions, but I believe that the
+# TERM_PROGRAM_VERSION may have been reset at some point.
+#
+# The early versions were tailored to the NeXT character set. Sometime
+# after the Apple acquisition the encoding was switched to MacRoman
+# (initially with serious altcharset bugs due to incomplete conversion
+# of the old NeXT code,) and then later to UTF-8. Also sometime during
+# or just prior to the early days of Mac OS X, the Terminal grew ANSI
+# 8-color support (initially buggy when combined with attributes, but
+# that was later fixed.) More recently, around Mac OS X version 10.3
+# or so (Terminal.app v100+) xterm-like 16-color support was added. In
+# some versions (for instance 133-1 which shipped with Mac OS X
+# version 10.4) this suffered from the <bce> bug, but that seems to
+# have been fixed in Mac OS X version 10.5 (Terminal.app v240.2+).
+#
+# In the early days of Mac OS X the terminal was fairly buggy and
+# would routinely crash under load. Many of these bugs seem to have
+# been fixed around Mac OS X version 10.3 (Terminal.app v100+) but
+# some may still remain. This change seems to correspond to
+# Terminal.app reporting "xterm-color" as $TERM rather than "vt100" as
+# it did previously.
+#
+# * This may correspond with what actually happened, but I don't
+#   know. It is based on guesswork, hearsay, private correspondence,
+#   my faulty memory, and the following online sources and references:
+#
+# [1] "Three Scotts and a Duane" by Simson L. Garfinkel
+# http://www.nextcomputers.org/NeXTfiles/Articles/NeXTWORLD/93.8/93.8.Dec.Community1.html
+#
+# [2] NeXTSTEP entry from Wikipedia, the free encyclopedia
+# https://secure.wikimedia.org/wikipedia/en/wiki/Nextstep
+#
+# * Renamed the AppKit Terminal.app entry from "Apple_Terminal" to
+#   "nsterm" to comply with the name length and case conventions and
+#   limitations of various software packages [notably Solaris terminfo
+#   and UNIX.] A single Apple_Terminal alias is retained for
+#   backwards-compatibility.
+#
+# * Added function key support (F1-F4). These only work in Terminal.app
+#   version 51, hopefully the capabilities won't cause problems for people
+#   using version 41.
+#
+# * Added "full color" (-c) entries which support the 16-color mode in
+#   version 51.
+#
+# * By default, version 51 uses UTF-8 encoding with broken altcharset
+#   support, so "ASCII" (-7) entries without altcharset support were
+#   added.
+
+# nsterm - AppKit Terminal.app
+#
+# Apple's Mac OS X includes a Terminal.app derived from the old NeXT
+# Terminal.app. It is a partial VT100 emulation with some xterm-like
+# extensions. This terminfo was written to describe versions 41
+# (shipped with Mac OS X version 10.0) and 51 (shipped with Mac OS X
+# version 10.1) of Terminal.app.
+#
+# Terminal.app runs under the Mac OS X Quartz windowing system (and
+# other AppKit-supported windowing systems.)  On the Mac OS X machine I
+# use, the executable for Terminal.app is:
+# /Applications/Utilities/Terminal.app/Contents/MacOS/Terminal
+#
+# If you're looking for a description of the full-screen system
+# console which runs under Apple's Darwin operating system on PowerPC
+# platforms, see the "xnuppc" entry instead.
+#
+# There were no function keys in version 41. In version 51, there are
+# four working function keys (F1, F2, F3 and F4.) The function keys
+# are included in all of these entries.
+#
+# It does not support mouse pointer position reporting. Under some
+# circumstances the cursor can be positioned using option-click; this
+# works by comparing the cursor position and the selected position,
+# and simulating enough cursor-key presses to move the cursor to the
+# selected position. This technique fails in all but the simplest
+# applications.
+#
+# It provides partial ANSI color support (background colors interacted
+# badly with bold in version 41, though, as reflected in :ncv:.) The
+# monochrome (-m) entries are useful if you've disabled color support
+# or use a monochrome monitor. The full color (-c) entries are useful
+# in version 51, which doesn't exhibit the background color bug. They
+# also enable an xterm-compatible 16-color mode.
+#
+# The configurable titlebar is set using xterm-compatible sequences;
+# it is used as a status bar in the statusline (-s) entries. Its width
+# depends on font sizes and window sizes, but 50 characters seems to
+# be the default for an 80x24 window.
+#
+# The MacRoman character encoding is used for some of the alternate
+# characters in the "MacRoman" entries; the "ASCII" (-7) entries
+# disable alternate character set support entirely, and the "VT100"
+# (-acs) entries rely instead on Terminal.app's own buggy VT100
+# graphics emulation, which seems to think the character encoding is
+# the old NeXT charset instead of MacRoman. The "ASCII" (-7) entries
+# are useful in Terminal.app version 51, which supports UTF-8 and
+# other ASCII-compatible character encodings but does not correctly
+# implement VT100 graphics; once VT100 graphics are correctly
+# implemented in Terminal.app, the "VT100" (-acs) entries should be
+# usable in any ASCII-compatible character encoding [except perhaps
+# in UTF-8, where some experts argue for disallowing alternate
+# characters entirely.]
+#
+# Terminal.app reports "vt100" as the terminal type, but exports
+# several environment variables which may aid detection in a shell
+# profile (i.e. .profile or .login):
+#
+# TERM=vt100
+# TERM_PROGRAM=Apple_Terminal
+# TERM_PROGRAM_VERSION=41      # in Terminal.app version 41
+# TERM_PROGRAM_VERSION=51      # in Terminal.app version 51
+#
+# For example, the following Bourne shell script would detect the
+# correct terminal type:
+#
+# if [ :"$TERM" = :"vt100" -a :"$TERM_PROGRAM" = :"Apple_Terminal" ]
+# then
+#     export TERM
+#     if [ :"$TERM_PROGRAM_VERSION" = :41 ]
+#     then
+#         TERM="nsterm-old"
+#     else
+#         TERM="nsterm-c-7"
+#     fi
+# fi
+#
+# In a C shell derivative, this would be accomplished by:
+#
+# if ( $?TERM && $?TERM_PROGRAM && $?TERM_PROGRAM_VERSION) then
+#     if ( :"$TERM" == :"vt100" && :"$TERM_PROGRAM" == :"Apple_Terminal" ) then
+#          if ( :"$TERM_PROGRAM_VERSION" == :41 ) then
+#              setenv TERM "nsterm-old"
+#          else
+#              setenv TERM "nsterm-c-7"
+#          endif
+#     endif
+# endif
+
+# The '+' entries are building blocks
+nsterm+7|AppKit Terminal.app v41+ basic capabilities w/ASCII charset,
+	am, bw, msgr, xenl, xon,
+	cols#80, it#8, lines#24,
+	bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[J, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	dim=\E[2m, dl=\E[%p1%dM, dl1=\E[M, ed=\E[J, el=\E[K,
+	el1=\E[1K, home=\E[H, ht=^I, hts=\EH, il=\E[%p1%dL, il1=\E[L,
+	ind=\n, invis=\E[8m, kbs=^?, kcub1=\EOD, kcud1=\EOB,
+	kcuf1=\EOC, kcuu1=\EOA, kent=\EOM, rc=\E8, rev=\E[7m, ri=\EM,
+	rmam=\E[?7l, rmkx=\E[?1l\E>, rmso=\E[m, rmul=\E[m,
+	rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, sc=\E7,
+	sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?
+	    %p5%t;2%;%?%p7%t;8%;m,
+	sgr0=\E[m, smam=\E[?7h, smkx=\E[?1h\E=, smso=\E[7m,
+	smul=\E[4m, tbc=\E[3g, use=vt100+enq, use=vt100+pfkeys,
+
+nsterm+acs|AppKit Terminal.app v41+ basic capabilities w/VT100 alternate-charset,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	enacs=\E(B\E)0, rmacs=^O,
+	sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?
+	    %p5%t;2%;%?%p7%t;8%;m%?%p9%t\016%e\017%;,
+	sgr0=\E[m\017, smacs=^N, use=nsterm+7,
+
+nsterm+mac|AppKit Terminal.app v41+ basic capabilities w/MacRoman alternate-charset,
+	acsc=+\335\,\334-\366.\3770#`\327a:f\241g\261h#i
+	     \360jjkkllmmnno\370p\370q\321rrssttuuvvwwxxy\262z\263{
+	     \271|\255}\243~\245,
+	enacs=\E(B\E)0, rmacs=^O,
+	sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?
+	    %p5%t;2%;%?%p7%t;8%;m%?%p9%t\016%e\017%;,
+	sgr0=\E[m\017, smacs=^N, use=nsterm+7,
+
+# compare with xterm+sl-twm
+nsterm+s|AppKit Terminal.app v41+ status-line (window titlebar) support,
+	wsl#50, use=xterm+sl-twm,
+
+nsterm+c|AppKit Terminal.app v51+ full color support (including 16 colors),
+	op=\E[0m, use=ibm+16color,
+
+nsterm+c41|AppKit Terminal.app v41 color support,
+	colors#8, ncv#37, pairs#64,
+	op=\E[0m, setab=\E[4%p1%dm, setaf=\E[3%p1%dm,
+
+# These are different combinations of the building blocks
+
+# ASCII charset (-7)
+nsterm-m-7|nsterm-7-m|AppKit Terminal.app v41+ w/ASCII charset (monochrome),
+	use=nsterm+7,
+
+nsterm-m-s-7|nsterm-7-m-s|AppKit Terminal.app v41+ w/ASCII charset (monochrome w/statusline),
+	use=nsterm+s, use=nsterm+7,
+
+nsterm-7|AppKit Terminal.app v41+ w/ASCII charset (color),
+	use=nsterm+c41, use=nsterm+7,
+
+nsterm-7-c|nsterm-c-7|AppKit Terminal.app v51+ w/ASCII charset (full color),
+	use=nsterm+c, use=nsterm+7,
+
+nsterm-s-7|nsterm-7-s|AppKit Terminal.app v41+ w/ASCII charset (color w/statusline),
+	use=nsterm+s, use=nsterm+c41, use=nsterm+7,
+
+nsterm-c-s-7|nsterm-7-c-s|AppKit Terminal.app v51+ w/ASCII charset (full color w/statusline),
+	use=nsterm+s, use=nsterm+c, use=nsterm+7,
+
+# VT100 alternate-charset (-acs)
+nsterm-m-acs|nsterm-acs-m|AppKit Terminal.app v41+ w/VT100 alternate-charset (monochrome),
+	use=nsterm+acs,
+
+nsterm-m-s-acs|nsterm-acs-m-s|AppKit Terminal.app v41+ w/VT100 alternate-charset (monochrome w/statusline),
+	use=nsterm+s, use=nsterm+acs,
+
+nsterm-acs|AppKit Terminal.app v41+ w/VT100 alternate-charset (color),
+	use=nsterm+c41, use=nsterm+acs,
+
+nsterm-c-acs|nsterm-acs-c|AppKit Terminal.app v51+ w/VT100 alternate-charset (full color),
+	use=nsterm+c, use=nsterm+acs,
+
+nsterm-s-acs|nsterm-acs-s|AppKit Terminal.app v41+ w/VT100 alternate-charset (color w/statusline),
+	use=nsterm+s, use=nsterm+c41, use=nsterm+acs,
+
+nsterm-c-s-acs|nsterm-acs-c-s|AppKit Terminal.app v51+ w/VT100 alternate-charset (full color w/statusline),
+	use=nsterm+s, use=nsterm+c, use=nsterm+acs,
+
+# MacRoman charset
+nsterm-m|AppKit Terminal.app v41+ w/MacRoman charset (monochrome),
+	use=nsterm+mac,
+
+nsterm-m-s|AppKit Terminal.app v41+ w/MacRoman charset (monochrome w/statusline),
+	use=nsterm+s, use=nsterm+mac,
+
+nsterm-old|AppKit Terminal.app v41+ w/MacRoman charset (color),
+	use=nsterm+c41, use=nsterm+mac,
+
+nsterm-c|AppKit Terminal.app v51+ w/MacRoman charset (full color),
+	use=nsterm+c, use=nsterm+mac,
+
+nsterm-s|AppKit Terminal.app v41+ w/MacRoman charset (color w/statusline),
+	use=nsterm+s, use=nsterm+c41, use=nsterm+mac,
+
+nsterm-c-s|AppKit Terminal.app v51+ w/MacRoman charset (full color w/statusline),
+	use=nsterm+s, use=nsterm+c, use=nsterm+mac,
+
+# In Mac OS X version 10.5 the format of the preferences has changed
+# and a new, more complex technique is needed, e.g.,
+#
+#       python -c 'import sys,objc;NSUserDefaults=objc.lookUpClass(
+#       "NSUserDefaults");ud=NSUserDefaults.alloc();
+#       ud.init();prefs=ud.persistentDomainForName_(
+#       "com.apple.Terminal");prefs["Window Settings"][
+#       prefs["Default Window Settings"]]["TerminalType"
+#       ]=sys.argv[1];ud.setPersistentDomain_forName_(prefs,
+#       "com.apple.Terminal")' nsterm-16color
+#
+# and it is still not settable from the preferences dialog. This is
+# tracked under rdar://problem/7365108 and rdar://problem/7365134
+# in Apple's bug reporter.
+#
+# In OS X 10.5 (Leopard) the TERM which can be set in the preferences dialog
+# defaults to xterm-color.  Alternative selections are ansi, dtterm, rxvt,
+# vt52, vt100, vt102 and xterm.
+nsterm-16color|AppKit Terminal.app v240.2+ with Mac OS X version 10.5,
+	bw@, mir, npc,
+	dch=\E[%p1%dP, dch1=\E[P, flash=\E[?5h$<200/>\E[?5l,
+	hpa=\E[%i%p1%dG, ich=\E[%p1%d@, ich1=\E[@, kdch1=\E[3~,
+	kend=\E[F, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~,
+	kf13=\E[25~, kf14=\E[26~, kf15=\E[28~, kf16=\E[29~,
+	kf17=\E[31~, kf18=\E[22~, kf19=\E[33~, kf20=\E[34~,
+	kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~,
+	khome=\E[H, knp=\E[6~, kpp=\E[5~, rmir=\E[4l, smir=\E[4h,
+	vpa=\E[%i%p1%dd, kLFT5=\E[5D, kRIT5=\E[5C,
+	use=xterm+alt47, use=nsterm-c-s-acs, use=vt220+cvis,
+
+# The versions of Terminal.app in Mac OS X version 10.3.x seem to have
+# the background color erase feature. The newer version 240.2 in Mac OS X
+# version 10.5 does not.
+#
+# This entry is based on newsgroup comments by Alain Bench, Christian Ebert,
+# and D P Schreber comparing to nsterm-c-s-acs.
+#
+# In Mac OS X version 10.4 and earlier, D P Schreber notes that $TERM
+# can be set in Terminal.app, e.g.,
+#
+#	defaults write com.apple.Terminal TermCapString nsterm-bce
+#
+# and that it is not set in Terminal's preferences dialog.
+#
+# Modified for OS X 10.8, omitting bw based on testing with tack -TD
+#
+# Notes:
+# * The terminal description matches the default settings.
+# * The keyboard is configurable via a dialog.
+# * By default khome, kend, knext and kprev are honored only with a
+#   shift-modifier.
+# * There are bindings for control left/right arrow (but not up/down).
+#   Added those to nsterm-16color, which is the version used for OS X 10.6
+# * "Allow VT100 application keypage mode" is by default disabled.
+#   There is no way to press keypad-comma unless application mode is enabled
+#   and used.
+# * 132-column mode stopped working during vttest's tests.  Consider it broken.
+# * CHT, REP, SU, SD are buggy.
+# * ECH works (also in Leopard), but is not used here for compatibility.
+# * The terminal preferences dialog replaces xterm-color by xterm-16color and
+#   xterm-256color.  However, it adds "nsterm", so it is possible to use the
+#   nsterm entry from this file to override the MacPorts (20110404) or
+#   system (20081102) copy of this file.
+# + In OS X 10.8 (Mountain Lion) the TERM which can be set in the preferences
+#   dialog defaults to xterm-256color.  Alternative selections are ansi,
+#   dtterm, rxvt, vt52, vt100, vt102, xterm and xterm-16color.  However,
+#   the menu says "Declare terminal as" without promising to actually emulate
+#   the corresponding terminals.  Indeed, changing TERM does not affect the
+#   emulation itself.  This means that
+#   + the function-keys do not match for dtterm for kf1-kf4 as well as
+#     khome/kend
+#   + the color model is the same for each setting of TERM (does not match
+#     ansi or dtterm).
+#   + the shift/control/meta key modifiers from rxvt and xterm variants are not
+#     recognised except for a few special cases, i.e., kRIT5 and kLFT5.
+#   + the VT52 emulation does not give a usable shell because screen-clearing
+#     does not work as expected.
+#   + selecting "xterm" or "xterm-16color" sets TERM to "xterm-256color".
+# + OSX 10.9 (Yosemite) added more extended keys in the default configuration
+#   as well as unmasking F10 (which had been used in the window manager). Those
+#   keys are listed in this entry.
+nsterm-bce|AppKit Terminal.app v71+/v100.1.8+ with Mac OS X version 10.3/10.4 (bce),
+	bce, use=nsterm-16color,
+
+# This is tested with OS X 10.8 (Mountain Lion), 2012/08/11
+#	TERM_PROGRAM_VERSION=309
+# Earlier reports state that these differences also apply to OS X 10.7 (Lion),
+#	TERM_PROGRAM_VERSION=303
+nsterm-build309|Terminal.app in OS X 10.8,
+	use=xterm+256setaf, use=nsterm-bce,
+
+# removed bogus kDC7 -TD
+nsterm-build326|Terminal.app in OS X 10.9,
+	kDC=\E[3;2~, kLFT=\E[1;2D, kRIT=\E[1;2C, kcbt=\E[Z,
+	kf18=\E[32~, kDC5=\E[3;5~, kLFT3=\Eb, kLFT5=\E[1;5D,
+	kRIT3=\Ef, kRIT5=\E[1;5C, use=nsterm-build309,
+
+# actually "343.7"
+nsterm-build343|Terminal.app in OS X 10.10,
+	kend=\EOF, khome=\EOH, use=nsterm-build326,
+
+# reviewed Terminal.app in El Capitan (version 2.6 build 361) -TD
+# Using vttest:
+# + no VT52 mode for cursor keys, though VT52 screen works in vttest
+# + f1-f4 map to pf1-pf4
+# + no VT220 support aside from DECTCEM and ECH
+# + there are no protected areas.  Forget about anything above VT220.
+# + in ECMA-48 cursor movement, VPR and HPR fail.  Others work.
+# + vttest color 11.6.4 and 11.6.5 (bce for ED/EL and ECH/indexing) are bce
+# + but bce fails for 11.6.7.2 (test repeat).
+# + SD (11.6.7.3) also fails, but SL/SR/SU work.
+# + 11.6.6 (test insert/delete char/line with bce) has several failures.
+# + normal (not X10 or Highlight tracking) mouse now works.
+# + mouse any-event works
+# + mouse button-event works
+# + in alternate screen:
+#   mode 47/48 work
+#   mode 1047 fails to restore cursor position (do not use)
+#   mode 1049 fails to restore screen contents (do not use)
+# + dtterm window-modify operations work (some messages are not printed)
+# + dtterm window-report gives size of window in characters/pixels as
+#   well as state of window.
+# Using tack:
+# + there is no difference between cnorm/cvvis
+# + has dim/invis/blink (no protect of course)
+# + most function keys with shift/control modifiers give beep
+#   (user can configure, but out-of-the-box is what I record)
+# + shift-F5 is \E[25~ through shift-F12 is \E[34~ (skips \E[30~ between
+#   F8 and F9).
+# + kLFT5/kRIT5 work, but not up/down with control-modifier
+# + kLFT/kRIT work, but not up/down with shift-modifier
+# + there are a few predefined bindings with Alt, but no clear pattern.
+# + uses alt-key as UTF-8 "meta" something like xterm altSendsEscape
+# Using ncurses test-program with xterm-new:
+# + no italics
+# Using xterm's scripts:
+# + palette for 256-colors is hardcoded.
+# + no support for "dynamic colors"
+# + no support for tcap-query.
+nsterm-build361|Terminal.app in OS X 10.11,
+	XT,
+	kmous=\E[M, use=nsterm-build343,
+
+# reviewed Terminal.app in High Sierra (version 2.8 build 400) -TD
+# Comparing with build361, little has changed, except that italics work.
+# Direct-color is not supported, by the way.
+#
+# Improved rmso/rmul -TD
+nsterm-build400|Terminal.app in OS X 10.13,
+	rmso=\E[27m, rmul=\E[24m, use=xterm+sm+1006,
+	use=ecma+italics, use=nsterm-build361,
+
+nsterm-build440|Terminal.app in MacOS 11.6.8,
+	use=xterm+alt1049, use=nsterm-build400,
+
+# This is an alias which should always point to the "current" version
+nsterm|nsterm-256color|Apple_Terminal|AppKit Terminal.app,
+	use=nsterm-build440,
+
+#### iTerm, iTerm2
+
+# iTerm 0.10
+#
+# iTerm.app from http://iterm.sourceforge.net/ is an alternative (and more
+# featureful) terminal emulator for Mac OS X.  It is similar enough in
+# capabilities to nsterm-16color that I have derived this description from that
+# one, but as far as I know they share no code.  Many of the features are
+# user-configurable, but I attempt only to describe the default configuration
+# (B. Sittler).
+#
+# According to its documentation, iTerm uses terminfo to obtain function key
+# definitions.  For example, if it is started with TERM=xterm, it uses key
+# definitions from that terminal description from the local OSX machine.  Those
+# $TERM settings may be augmented using the bookmark and profile dialogs.
+# However, the behavior seen with tack does not agree with either the terminfo
+# description or the function keys in its "xterm" profile.
+#
+# NOTES:
+# with vttest:
+#	reports primary DA as VT100 with AVO: \E[?1;2c
+#	reports secondary DA as "\E[>0;95;c"
+#	supports blink and underline
+#	displays bold text as red
+#	recognizes all dtterm controls for modifying/querying window
+#	resizing via escape sequence is very slow
+#	supports X11R5 mouse (no X10) and XFree86 mouse (button- and event-tracking)
+#	supports X11R5 alternate screen and XFree86 1049 (no 1047/1048)
+#	supports CHA, VPA, VPR, but no other ECMA-48 cursor movement such as HPA
+# with tack:
+#	.
+# with ncurses test-program:
+#	ncurses 'k' has problem in second screen; light background does not fill
+# with xterm scripts
+#	can display/alter xterm-256color cube
+#	can display/alter xterm-88color cube
+iTerm.app|iterm|iTerm.app terminal emulator for Mac OS X,
+	am, bce, hs, mir, msgr, npc, xenl, xon,
+	cols#80, it#8, lines#24, wsl#50,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[J, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M, ed=\E[J,
+	el=\E[K, el1=\E[1K, enacs=\E(B\E)0,
+	flash=\E[?5h$<200/>\E[?5l, home=\E[H, hpa=\E[%i%p1%dG,
+	ht=^I, hts=\EH, ich=\E[%p1%d@, ich1=\E[@, il=\E[%p1%dL,
+	il1=\E[L, ind=\n, kLFT=\E[1;2D, kRIT=\E[1;2C, kbs=^?,
+	kcbt=\E[Z, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
+	kdch1=\E[3~, kend=\EOF, kent=\EOM, kf1=\EOP, kf10=\E[21~,
+	kf11=\E[23~, kf12=\E[24~, kf2=\EOQ, kf3=\EOR, kf4=\EOS,
+	kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~,
+	khome=\EOH, knp=\E[6~, kpp=\E[5~, op=\E[0m, rc=\E8,
+	rev=\E[7m, ri=\EM, rmacs=^O, rmam=\E[?7l, rmir=\E[4l,
+	rmkx=\E[?1l\E>, rmso=\E[m, rmul=\E[m,
+	rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, sc=\E7,
+	sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?
+	    %p9%t\016%e\017%;,
+	sgr0=\E[m\017, smacs=^N, smam=\E[?7h, smir=\E[4h,
+	smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m, tbc=\E[3g,
+	vpa=\E[%i%p1%dd, kEND5=\E[1;5F, kHOM5=\E[1;5H,
+	use=xterm+alt47, use=ansi+enq, use=xterm+sl-twm,
+	use=vt100+keypad, use=xterm+x11mouse,
+	use=xterm+256setaf, use=vt220+cvis,
+
+# iTerm2 3.0.15
+#
+# https://iterm2.com/
+# https://github.com/gnachman/iTerm2
+# ~/Library/Preferences/com.googlecode.iterm2.plist
+# "iTerm" stalled in 2009.  A different set of developers began "iTerm2".
+#
+# NOTES:
+# with vttest:
+#	reports primary DA as VT100 with AVO: \E[?1;2c
+#	reports secondary DA as "\E[>0;95;0c"
+#	numeric keypad application mode does not work
+#	by default, dtterm window-modifications are ignored
+#	by default, dtterm window-reports return, but icon as "L", window as "l"
+#	supports SD/SU, no REP, SL, SR
+#	supports CBT, CHA, VPA, CNL, CPL, VPR (no HPA, CHT, HPR)
+#	no improvement to XFree86 1047/1048 modes
+# with tack:
+#	in meta-mode, imitates xterm, sending UTF-8
+#	special-key modifiers based on xterm use incompatible default for alt/meta
+# with ncurses test-program:
+#	no italics
+#	no improvement to ncurses 'k'
+# with xterm scripts:
+#	acolors.sh works
+#
+# Italic text did not work initially, apparently because upgrading did not
+# add/change that preference (set in Preferences, Profiles, Text).  A new
+# install of iTerm 3.0.15 provides italics by default (blinking text is an
+# option in the preferences dialog).
+#
+# 2018/01/21: found xterm+sm+1006 did not work with version 3.1.5
+# 2018/05/19: xterm+sm+1006 seems to work with 3.1.6beta -TD
+iTerm2.app|iterm2|terminal emulator for Mac OS X,
+	blink=\E[5m, cbt=\E[Z, dim=\E[2m, kEND=\E[1;2F,
+	kHOM=\E[1;2H, ka1@, ka3@, kb2@, kc1@, kc3@, kent@, kf13=\E[1;2P,
+	kf14=\E[1;2Q, kf15=\E[1;2R, kf16=\E[1;2S, kf17=\E[15;2~,
+	kf18=\E[17;2~, kf19=\E[18;2~, kf2=\EOQ, kf20=\E[19;2~,
+	kf21=\E[20;2~, kf22=\E[21;2~, kf23=\E[23;2~,
+	kf24=\E[24;2~, kind=\E[1;2B, kri=\E[1;2A, nel=\EE,
+	op=\E[39;49m, rmso=\E[27m, rmul=\E[24m,
+	rs2=\E[!p\E[?3;4l\E[4l\E>\E[?1000l,
+	sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?
+	    %p5%t;2%;m%?%p9%t\016%e\017%;,
+	kDN3=\E\E[B, kDN4=\E[1;10B, kDN5=\E[1;5B, kDN6=\E[1;6B,
+	kEND3=\E[1;9F, kEND4=\E[1;10F, kEND6=\E[1;6F,
+	kEND7=\E[1;13F, kEND8=\E[1;14F, kHOM3=\E[1;9H,
+	kHOM4=\E[1;10H, kHOM6=\E[1;6H, kHOM7=\E[1;13H,
+	kHOM8=\E[1;14H, kLFT3=\E\E[D, kLFT4=\E[1;10D,
+	kLFT5=\E[1;5D, kLFT6=\E[1;6D, kNXT3=\E\E[6~,
+	kPRV3=\E\E[5~, kRIT3=\E\E[C, kRIT4=\E[1;10C,
+	kRIT5=\E[1;5C, kRIT6=\E[1;6C, kUP3=\E\E[A, kUP4=\E[1;10A,
+	kUP5=\E[1;5A, kUP6=\E[1;6A, use=ecma+index,
+	use=xterm+alt+title, use=ecma+italics, use=iterm,
+	use=bracketed+paste,
+
+# xnuppc - Darwin PowerPC Console (a.k.a. "darwin")
+#
+# On PowerPC platforms, Apple's Darwin operating system uses a
+# full-screen system console derived from a NetBSD framebuffer
+# console. It is an ANSI-style terminal, and is not really VT-100
+# compatible.
+#
+# Under Mac OS X, this is the system console driver used while in
+# single-user mode [reachable by holding down Command-S during the
+# boot process] and when logged in using console mode [reachable by
+# typing ">console" at the graphical login prompt.]
+#
+# If you're looking for a description of the Terminal.app terminal
+# emulator which runs under the Mac OS X Quartz windowing system (and
+# other AppKit-supported windowing systems,) see the "nsterm"
+# entry instead.
+#
+# NOTE: Under Mac OS X version 10.1, the default login window does not
+# prompt for user name, instead requiring an icon to be selected from
+# a list of known users. Since the special ">console" login is not in
+# this list, you must make one of two changes in the Login Window
+# panel of the Login section of System Prefs to make the special
+# ">console" login accessible. The first option is to enable 'Show
+# "Other User" in list for network users', which will add a special
+# "Other..." icon to the graphical login panel. Selecting "Other..."
+# will present the regular graphical login prompt. The second option
+# is to change the 'Display Login Window as:' setting to 'Name and
+# password entry fields', which replaces the login panel with a
+# graphical login prompt.
+#
+# There are no function keys, at least not in Darwin 1.3.
+#
+# It has no mouse support.
+#
+# It has full ANSI color support, and color combines correctly with
+# all three supported attributes: bold, inverse-video and underline.
+# However, bold colored text is almost unreadable (bolding is
+# accomplished using shifting and or-ing, and looks smeared) so bold
+# has been excluded from the list of color-compatible attributes
+# [using (ncv)]. The monochrome entry (-m) is useful if you use a
+# monochrome monitor.
+#
+# There is one serious bug with this terminal emulation's color
+# support: repositioning the cursor onto a cell with non-matching
+# colors obliterates that cell's contents, replacing it with a blank
+# and displaying a colored cursor in the "current" colors. There is
+# no complete workaround at present [other than using the monochrome
+# (-m) entries,] but removing the (msgr) capability seemed to help.
+#
+# The "standout" chosen was simple reverse-video, although a colorful
+# standout might be more aesthetically pleasing. Similarly, the bold
+# chosen is the terminal's own smeared bold, although a simple
+# color-change might be more readable. The color-bold (-b) entries
+# uses magenta colored text for bolding instead. The fancy color (-f
+# and -f2) entries use color for bold, standout and underlined text
+# (underlined text is still underlined, though.)
+#
+# Apparently the terminal emulator does support a VT-100-style
+# alternate character set, but all the alternate character set
+# positions have been left blank in the font. For this reason, no
+# alternate character set capabilities have been included in this
+# description. The console driver appears to be ASCII-only, so (enacs)
+# has been excluded [although the VT-100 sequence does work.]
+#
+# The default Mac OS X and Darwin installation reports "vt100" as the
+# terminal type, and exports no helpful environment variables. To fix
+# this, change the "console" entry in /etc/ttys from "vt100" to
+# "xnuppc-WxH", where W and H are the character dimensions of your
+# console (see below.)
+#
+# The font used by the terminal emulator is apparently one originally
+# drawn by Ka-Ping Yee, and uses 8x16-pixel characters. This
+# file includes descriptions for the following geometries:
+#
+#     Pixels        Characters   Entry Name (append -m for monochrome)
+#    -------------------------------------------------------------------
+#     640x400       80x25        xnuppc-80x25
+#     640x480       80x30        xnuppc-80x30
+#     720x480       90x30        xnuppc-90x30
+#     800x600       100x37       xnuppc-100x37
+#     896x600       112x37       xnuppc-112x37
+#     1024x640      128x40       xnuppc-128x40
+#     1024x768      128x48       xnuppc-128x48
+#     1152x768      144x48       xnuppc-144x48
+#     1280x1024     160x64       xnuppc-160x64
+#     1600x1024     200x64       xnuppc-200x64
+#     1600x1200     200x75       xnuppc-200x75
+#     2048x1536     256x96       xnuppc-256x96
+#
+# The basic "xnuppc" entry includes no size information, and the
+# emulator includes no reporting capability, so you'll be at the mercy
+# of the TTY device (which reports incorrectly on my hardware.) The
+# color-bold entries do not include size information.
+
+# The '+' entries are building blocks
+xnuppc+basic|Darwin PowerPC console basic capabilities,
+	am, bce, mir, xenl, NQ,
+	it#8,
+	bold=\E[1m, clear=\E[H\E[J, cr=\r, csr=\E[%i%p1%d;%p2%dr,
+	cub=\E[%p1%dD, cub1=\E[D, cud=\E[%p1%dB, cud1=\E[B,
+	cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH,
+	cuu=\E[%p1%dA, cuu1=\E[A, dsl=\E]2;\007, ed=\E[J, el=\E[K,
+	el1=\E[1K, home=\E[H, ht=^I, hts=\EH, ind=\n, kbs=^?,
+	kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, rc=\E8,
+	rev=\E[7m, ri=\EM, rmam=\E[?7l, rmkx=\E[?1l\E>, rmso=\E[m,
+	rmul=\E[m, rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h,
+	sc=\E7,
+	sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;m,
+	sgr0=\E[m, smam=\E[?7h, smkx=\E[?1h\E=, smso=\E[7m,
+	smul=\E[4m, tbc=\E[3g, use=vt100+keypad,
+
+xnuppc+c|Darwin PowerPC console ANSI color support,
+	colors#8, ncv#32, pairs#64,
+	op=\E[37;40m, setab=\E[4%p1%dm, setaf=\E[3%p1%dm,
+
+xnuppc+b|Darwin PowerPC console color-bold support,
+	ncv#32,
+	bold=\E[35m,
+	sgr=\E[0%?%p6%t;35%;%?%p2%t;4%;%?%p1%p3%|%t;7%;m,
+	use=xnuppc+basic,
+
+xnuppc+f|Darwin PowerPC console fancy color support,
+	ncv#35,
+	sgr=\E[0%?%p6%t;35%;%?%p2%t;36;4%;%?%p1%t;33;44%;%?%p3%t;7%;
+	    m,
+	smso=\E[33;44m, smul=\E[36;4m, use=xnuppc+b,
+
+xnuppc+f2|Darwin PowerPC console alternate fancy color support,
+	ncv#35,
+	bold=\E[33m,
+	sgr=\E[0%?%p6%t;33%;%?%p2%t;34%;%?%p1%t;31;47%;%?%p3%t;7%;m,
+	smso=\E[31;47m, smul=\E[34m, use=xnuppc+basic,
+
+# Building blocks for specific screen sizes
+xnuppc+80x25|Darwin PowerPC console 80x25 support (640x400 pixels),
+	cols#80, lines#25,
+
+xnuppc+80x30|Darwin PowerPC console 80x30 support (640x480 pixels),
+	cols#80, lines#30,
+
+xnuppc+90x30|Darwin PowerPC console 90x30 support (720x480 pixels),
+	cols#90, lines#30,
+
+xnuppc+100x37|Darwin PowerPC console 100x37 support (800x600 pixels),
+	cols#100, lines#37,
+
+xnuppc+112x37|Darwin PowerPC console 112x37 support (896x600 pixels),
+	cols#112, lines#37,
+
+xnuppc+128x40|Darwin PowerPC console 128x40 support (1024x640 pixels),
+	cols#128, lines#40,
+
+xnuppc+128x48|Darwin PowerPC console 128x48 support (1024x768 pixels),
+	cols#128, lines#48,
+
+xnuppc+144x48|Darwin PowerPC console 144x48 support (1152x768 pixels),
+	cols#144, lines#48,
+
+xnuppc+160x64|Darwin PowerPC console 160x64 support (1280x1024 pixels),
+	cols#160, lines#64,
+
+xnuppc+200x64|Darwin PowerPC console 200x64 support (1600x1024 pixels),
+	cols#200, lines#64,
+
+xnuppc+200x75|Darwin PowerPC console 200x75 support (1600x1200 pixels),
+	cols#200, lines#75,
+
+xnuppc+256x96|Darwin PowerPC console 256x96 support (2048x1536 pixels),
+	cols#0x100, lines#96,
+
+# These are different combinations of the building blocks
+
+xnuppc-m|darwin-m|Darwin PowerPC console (monochrome),
+	use=xnuppc+basic,
+
+xnuppc|darwin|Darwin PowerPC console (color),
+	use=xnuppc+c, use=xnuppc+basic,
+
+xnuppc-m-b|darwin-m-b|Darwin PowerPC console (monochrome w/color-bold),
+	use=xnuppc+b,
+
+xnuppc-b|darwin-b|Darwin PowerPC console (color w/color-bold),
+	use=xnuppc+b, use=xnuppc+c,
+
+xnuppc-m-f|darwin-m-f|Darwin PowerPC console (fancy monochrome),
+	use=xnuppc+f,
+
+xnuppc-f|darwin-f|Darwin PowerPC console (fancy color),
+	use=xnuppc+f, use=xnuppc+c,
+
+xnuppc-m-f2|darwin-m-f2|Darwin PowerPC console (alternate fancy monochrome),
+	use=xnuppc+f2,
+
+xnuppc-f2|darwin-f2|Darwin PowerPC console (alternate fancy color),
+	use=xnuppc+f2, use=xnuppc+c,
+
+# Combinations for specific screen sizes
+xnuppc-80x25-m|darwin-80x25-m|Darwin PowerPC console (monochrome) 80x25,
+	use=xnuppc+80x25, use=xnuppc+basic,
+
+xnuppc-80x25|darwin-80x25|Darwin PowerPC console (color) 80x25,
+	use=xnuppc+c, use=xnuppc+80x25, use=xnuppc+basic,
+
+xnuppc-80x30-m|darwin-80x30-m|Darwin PowerPC console (monochrome) 80x30,
+	use=xnuppc+80x30, use=xnuppc+basic,
+
+xnuppc-80x30|darwin-80x30|Darwin PowerPC console (color) 80x30,
+	use=xnuppc+c, use=xnuppc+80x30, use=xnuppc+basic,
+
+xnuppc-90x30-m|darwin-90x30-m|Darwin PowerPC console (monochrome) 90x30,
+	use=xnuppc+90x30, use=xnuppc+basic,
+
+xnuppc-90x30|darwin-90x30|Darwin PowerPC console (color) 90x30,
+	use=xnuppc+c, use=xnuppc+90x30, use=xnuppc+basic,
+
+xnuppc-100x37-m|darwin-100x37-m|Darwin PowerPC console (monochrome) 100x37,
+	use=xnuppc+100x37, use=xnuppc+basic,
+
+xnuppc-100x37|darwin-100x37|Darwin PowerPC console (color) 100x37,
+	use=xnuppc+c, use=xnuppc+100x37, use=xnuppc+basic,
+
+xnuppc-112x37-m|darwin-112x37-m|Darwin PowerPC console (monochrome) 112x37,
+	use=xnuppc+112x37, use=xnuppc+basic,
+
+xnuppc-112x37|darwin-112x37|Darwin PowerPC console (color) 112x37,
+	use=xnuppc+c, use=xnuppc+112x37, use=xnuppc+basic,
+
+xnuppc-128x40-m|darwin-128x40-m|Darwin PowerPC console (monochrome) 128x40,
+	use=xnuppc+128x40, use=xnuppc+basic,
+
+xnuppc-128x40|darwin-128x40|Darwin PowerPC console (color) 128x40,
+	use=xnuppc+c, use=xnuppc+128x40, use=xnuppc+basic,
+
+xnuppc-128x48-m|darwin-128x48-m|Darwin PowerPC console (monochrome) 128x48,
+	use=xnuppc+128x48, use=xnuppc+basic,
+
+xnuppc-128x48|darwin-128x48|Darwin PowerPC console (color) 128x48,
+	use=xnuppc+c, use=xnuppc+128x48, use=xnuppc+basic,
+
+xnuppc-144x48-m|darwin-144x48-m|Darwin PowerPC console (monochrome) 144x48,
+	use=xnuppc+144x48, use=xnuppc+basic,
+
+xnuppc-144x48|darwin-144x48|Darwin PowerPC console (color) 144x48,
+	use=xnuppc+c, use=xnuppc+144x48, use=xnuppc+basic,
+
+xnuppc-160x64-m|darwin-160x64-m|Darwin PowerPC console (monochrome) 160x64,
+	use=xnuppc+160x64, use=xnuppc+basic,
+
+xnuppc-160x64|darwin-160x64|Darwin PowerPC console (color) 160x64,
+	use=xnuppc+c, use=xnuppc+160x64, use=xnuppc+basic,
+
+xnuppc-200x64-m|darwin-200x64-m|Darwin PowerPC console (monochrome) 200x64,
+	use=xnuppc+200x64, use=xnuppc+basic,
+
+xnuppc-200x64|darwin-200x64|Darwin PowerPC console (color) 200x64,
+	use=xnuppc+c, use=xnuppc+200x64, use=xnuppc+basic,
+
+xnuppc-200x75-m|darwin-200x75-m|Darwin PowerPC console (monochrome) 200x75,
+	use=xnuppc+200x75, use=xnuppc+basic,
+
+xnuppc-200x75|darwin-200x75|Darwin PowerPC console (color) 200x75,
+	use=xnuppc+c, use=xnuppc+200x75, use=xnuppc+basic,
+
+xnuppc-256x96-m|darwin-256x96-m|Darwin PowerPC console (monochrome) 256x96,
+	use=xnuppc+256x96, use=xnuppc+basic,
+
+xnuppc-256x96|darwin-256x96|Darwin PowerPC console (color) 256x96,
+	use=xnuppc+c, use=xnuppc+256x96, use=xnuppc+basic,
+
+######## DOS/WINDOWS
+# CRT is shareware.  It implements some xterm features, including mouse.
+crt|crt-vt220|CRT 2.3 emulating VT220,
+	bce, msgr,
+	ncv@,
+	hts=\EH, use=vt100+enq, use=vt220-base, use=ecma+color,
+
+# SecureCRT 8.7.3.2279
+# 8.7.3 was released 2020/08/11
+# (eval 2021/02/05)
+# VanDyke Software, Inc.
+#
+# Advertised features:
+#	Xterm 24-bit color
+#	Xterm 256-color
+#	Double-size characters
+#	Xterm extensions for mouse support and changing title bar
+#	Emulates VT100, VT102, VT220, VT320, Linux console, SCO ANSI,
+#	TN3270, TVI910, TVI925, Wyse 50/60, and ANSI.
+# Changes:
+#	Added ANSI sc/rc and REP in 2019/12/17
+#	Added TVI910/ TVI925 in 2019/11/20	
+#
+# Default:
+#	Emulate "Xterm", using "ANSI with 256color"
+#	TERM=xterm-256color
+#
+# vttest:
+#	DA1 \E[?62;1;2;6;7;8;9c (vt220 with DRCS and NRCS)
+#	DA2 \E[>1;136;0c
+#	double-sized characters do not work
+#	Menu-1 fails (window resizes to 132-columns, but does not repaint)
+#	NRCS fails (tried French, but none of the replacements worked)
+#	VT100 line-drawing works, except the C/R, etc., are an hline.
+#	VT52 works except for S8C1T bug.
+#	RIS hangs the terminal.
+#	Local SRM does not echo.
+#	Some of the VT320/VT220 status reports work, not locator or DECXCPR
+#	DECUDK works if I press shift.
+#	Fails CHT, CNL, CPL
+#	Does not honor bce with ECH
+#	ERM/SPA does not work
+#	REP has 11 +'s except for final 2 +'s, like PuTTY.
+#	Fails SL/SR
+#	DECRPM does not respond.
+#	dtterm modify/report operations do not work
+#	Alternate screen works.
+#	Mouse:
+#		highlight tracking does not work.
+#		any event tracking does not work, but
+#		button event tracking does work.
+#		DEC locator does not work.
+#		SGR coordinates does not work.
+# ncurses:
+#	reset6 does reset to 80-columns
+#	ncurses RGB edit does not work.
+#	direct colors don't work, probably needs semicolons.
+# tack:
+#	blink works, but not dim or invis
+#	no italics or crossed-out
+# scripts:
+#	256color handles "-r" option (but test/ncurses menu d does not alter)
+#	dynamic colors queries do not work, though it seems some can be set.
+#	resize.pl gets no reply, resize.sh needs fix for no reply.
+scrt|securecrt|SecureCRT emulating xterm-256color,
+	bce@, km@, npc,
+	bel@, cvvis@, kcbt=\E[Z, kent=\EOM, use=vt220+pcedit,
+	use=xterm+256setaf, use=ecma+index, use=ansi+rep,
+	use=xterm+keypad, use=xterm+pcfkeys, use=xterm-basic,
+
+# Absolute Telnet
+# (eval 2021/02/20)
+# 11.24 was released 2020/08/13
+# Celestial Software
+#
+# Advertised features:
+#	Emacs compatibility mode (Meta Keys can be enabled for left/right ALT)
+#	Double-size characters
+#	Xterm extensions for mouse support
+#	Emulates VT52, VT100, VT220, VT320, ansi, xterm, qnx, scoansi,
+#	ANSIBBS, WYSE60, TeleVideo 950.
+#
+# Default:
+#	TERM=xterm
+#
+# vttest:
+#	DA1: \E[?62;1;2;6;7;8;9;15;22c (VT200 with DRCS, UDK, NRCS) 
+#	DA2: \E[>1;10;0c 
+#	However:
+#	+ NRCS tests do not work
+#	+ DECUDK test fails
+#	+ VT100 double-sized characters work
+#	menu-1 autowrap does not work
+#	supports blinking text
+#	VT220 DECSCA last screen (ignoring ECH, etc), leaves fill on top/left
+#	VT220 device status reports fail, except operating status
+#	8-bit controls work
+#	xterm alternate screen recognized, but cursor restored incorrectly
+#	xterm mouse (normal, any event, button event) works
+#	xterm highlight-mouse does not work properly, confused with any-event
+#	does not recognize SGR-mouse mode
+#	supports xterm window-modifiny/reporting controls
+#	supports ECMA-48 cursor movement except HPR
+#	supports REP and SD, but not ECMA-48 SL, SR, SU
+# tack:
+#	italics and crossed-out do not work
+#	supports xterm-style modified function-keys, using X11R6 F1-F4.
+#	does not support modified cursor-keys or editing-keys
+#	uses VT220-style Home/End
+#	if alt-keys are enabled,
+#		meta-mode sends escape rather than shifting, in 7-bit mode
+#		meta-mode does the expected shifting in 8-bit mode
+# scripts:
+#	supports 256-colors, including changing palette (ncurses menu d works)
+#	supports UTF-8, but honors VT100 line-drawing
+absolute|Absolute Telnet emulating xterm,
+	kcbt=\E[Z, use=ecma+index, use=ansi+rep,
+	use=vt220+pcedit, use=xterm+keypad, use=xterm+app,
+	use=xterm+pcf0, use=xterm+256color, use=xterm+x11mouse,
+	use=xterm-basic,
+
+#### PuTTY
+# PuTTY 0.74 (27 June 2020)
+# http://www.chiark.greenend.org.uk/~sgtatham/putty/
+#
+# PuTTY 0.73 (September 2019)
+# Testing with tack:
+#	does not implement italics
+#	does not implement cross-out text
+#	its settings dialog allows some of the VT100 line-drawing tests to pass
+#	(not the padding test, though)
+# Testing with vttest:
+#	xterm mouse modes are incomplete: X10, highlight, any-event, and focus in/out modes are not implemented.
+#	does not implement protected areas
+#	does not implement SL/SR
+#
+# PuTTY 0.71 (March 2019) provided a workable "rep" capability.  It also
+# changed longstanding keypad assignments, so that these no longer apply:
+#	kLFT=\E[D, kRIT=\E[C, kb2=\E[G,
+#
+# PuTTY recognized xterm's 1006 mouse mode in late 2015; subsequent release was
+# in 2017 (0.70) -TD
+#
+# Comparing with 0.51, vttest is much better (only a few problems with the
+# cursor position reports and wrapping).
+#
+# PuTTY 0.51 (14 December 2000)
+#
+# This emulates VT100 + VT52 (plus a few VT220 features:  ech, SRM, DECTCEM, as
+# well as SCO and Atari, color palettes from Linux console).  Reading the code,
+# it is intended to be VT102 plus selected features.  By default, it sets $TERM
+# to xterm, which is incorrect, since several features are misimplemented:
+#
+#	Alt+key always sends ESC+key, so 'km' capability is removed.
+#
+#	Control responses, wrapping and tabs are buggy, failing a couple of
+#	screens in vttest.
+#
+#	xterm mouse support is not implemented (unreleased version may).
+#
+# Several features such as backspace/delete are optional; this entry documents
+# the default behavior.  None of the combinations of keyboard settings match
+# those used for xterm -TD
+#
+# PuTTY recognizes xterm's 1049 mode for switching to/from alternate screen,
+# but implements it incorrectly as mentioned here:
+#	http://stackoverflow.com/questions/24613237/terminal-retains-bg-color-after-closing-vim-using-color-scheme-and-putty-256co/37869114#37869114
+putty|PuTTY terminal emulator,
+	am, bce, bw, ccc, mir, msgr, xenl, xon, XT,
+	colors#8, it#8, ncv#22, pairs#64, U8#1,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[J, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\ED, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\EM,
+	dch=\E[%p1%dP, dch1=\E[P,
+	dispc=%?%p1%{8}%=%t\E%%G\342\227\230\E%%@%e%p1%{10}%=%t\E%%G
+	      \342\227\231\E%%@%e%p1%{12}%=%t\E%%G\342\231\0\E%%@%e
+	      %p1%{13}%=%t\E%%G\342\231\252\E%%@%e%p1%{14}%=%t\E%%G
+	      \342\231\253\E%%@%e%p1%{15}%=%t\E%%G\342\230\274\E%%@
+	      %e%p1%{27}%=%t\E%%G\342\206\220\E%%@%e%p1%{155}%=%t\E
+	      %%G\340\202\242\E%%@%e%p1%c%;,
+	dl=\E[%p1%dM, dl1=\E[M, ech=\E[%p1%dX, ed=\E[J, el=\E[K,
+	el1=\E[1K, enacs=\E(B\E)0, flash=\E[?5h$<100/>\E[?5l,
+	home=\E[H, hpa=\E[%i%p1%dG, il=\E[%p1%dL, il1=\E[L, ind=\n,
+	initc=\E]P%p1%x%p2%{255}%*%{1000}%/%02x%p3%{255}%*%{1000}%/
+	      %02x%p4%{255}%*%{1000}%/%02x,
+	is2=\E7\E[r\E[m\E[?7h\E[?1;4;6l\E[4l\E8\E>\E]R,
+	kbs=^?, kcbt=\E[Z, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC,
+	kcuu1=\EOA, kind=\E[B, kri=\E[A, kspd=^Z, nel=\r\n, oc=\E]R,
+	op=\E[39;49m, rc=\E8, rev=\E[7m, ri=\EM, rmacs=^O,
+	rmam=\E[?7l, rmir=\E[4l, rmkx=\E[?1l\E>, rmpch=\E[10m,
+	rmso=\E[27m, rmul=\E[24m,
+	rs2=\E<\E["p\E[50;6"p\Ec\E[?3l\E]R\E[?1000l,
+	s0ds=\E[10m, s1ds=\E[11m, s2ds=\E[12m, sc=\E7,
+	setab=\E[4%p1%dm, setaf=\E[3%p1%dm,
+	sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5
+	    %;m%?%p9%t\016%e\017%;,
+	sgr0=\E[m\017, smacs=^N, smam=\E[?7h, smir=\E[4h,
+	smkx=\E[?1h\E=, smpch=\E[11m, smso=\E[7m, smul=\E[4m,
+	vpa=\E[%i%p1%dd, E3=\E[3J, use=vt220+pcedit,
+	use=ansi+tabs, use=ansi+rep, use=ecma+index,
+	use=xterm+alt1049, use=xterm+sm+1006, use=putty+fnkeys,
+	use=vt102+enq, use=xterm+sl, use=vt100+fnkeys,
+	use=putty+keypad, use=vt220+cvis, use=bracketed+paste,
+putty+keypad|PuTTY numeric keypad,
+	kp1=\EOq, kp2=\EOr, kp3=\EOs, kp4=\EOt, kp5=\EOu, kp6=\EOv,
+	kp7=\EOw, kp8=\EOx, kp9=\EOy, kpADD=\EOl, kpDIV=\EOQ,
+	kpDOT=\EOn, kpMUL=\EOR, kpNUM=\EOP, kpSUB=\EOS, kpZRO=\EOp,
+
+vt100-putty|Reset PuTTY to pure VT100,
+	rs2=\E<\E["p\Ec\E[?3l\E]R\E[40"p\E[61"p\E[50;1;2"p,
+	use=vt100,
+putty-256color|PuTTY 0.58 with xterm 256-colors,
+	use=xterm+256setaf, use=putty,
+putty-noapp|putty with cursor keys in normal mode,
+	kLFT=\EOD, kRIT=\EOC, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C,
+	kcuu1=\E[A, kind=\EOB, kri=\EOA, rmkx=\E>, smkx=\E=,
+	use=putty,
+
+# One of the keyboard selections is "VT100+".
+# pterm (the X11 port) uses shifted F1-F10 as F11-F20
+putty-vt100|VT100+ keyboard layout,
+	use=putty+fnkeys+vt100, use=putty,
+
+putty-sco|putty with SCO function keys,
+	use=putty+fnkeys+sco, use=putty,
+
+# PuTTY has more than one section in its Keyboard configuration:
+# a) backspace/delete, which we ignore since that choice largely depends on
+#    whether one matches Unix and BSD or Linux.
+# b) home/end keys, also ignored because the "rxvt" setting sends keys which
+#    are unrelated to rxvt's actual settings.
+# c) function keys and keypad - this is the interesting part.  None of the
+#    selections match any of their respective namesakes, but they are shown
+#    here to help users who expect that the selections do what is implied.
+#
+# This is the default setting for PuTTY
+putty+fnkeys|fn-keys for PuTTY,
+	use=putty+fnkeys+esc,
+
+putty+fnkeys+esc|ESC[n~ fn-keys for PuTTY,
+	kf1=\E[11~, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~,
+	kf13=\E[25~, kf14=\E[26~, kf15=\E[28~, kf16=\E[29~,
+	kf17=\E[31~, kf18=\E[32~, kf19=\E[33~, kf2=\E[12~,
+	kf20=\E[34~, kf3=\E[13~, kf4=\E[14~, kf5=\E[15~,
+	kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~,
+
+putty+fnkeys+linux|Linux fn-keys for PuTTY,
+	kf1=\E[[A, kf2=\E[[B, kf3=\E[[C, kf4=\E[[D, kf5=\E[[E,
+	use=putty+fnkeys+esc,
+
+putty+fnkeys+xterm|Xterm R6 fn-keys for PuTTY,
+	kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS,
+	use=putty+fnkeys+esc,
+
+putty+fnkeys+vt400|VT400 fn-keys for PuTTY,
+	use=putty+fnkeys+esc,
+
+# Shifted F1 is F11.  F13-F20 inherit from the defaults, and the last distinct
+# key is F20.
+putty+fnkeys+vt100|VT100+ fn-keys for PuTTY,
+	kf1=\EOP, kf10=\EOY, kf11=\EOZ, kf12=\EO[, kf2=\EOQ,
+	kf3=\EOR, kf4=\EOS, kf5=\EOT, kf6=\EOU, kf7=\EOV, kf8=\EOW,
+	kf9=\EOX, use=putty+fnkeys+esc,
+
+# Unlike xterm-sco, this leaves kmous ambiguous with kf1.
+#
+# Use modifiers to obtain function keys past 12:
+# F1-F12 - normal
+# F13-F24 - shift
+# F25-F36 - control/alt
+# F37-F48 - control/shift
+#
+putty+fnkeys+sco|SCO fn-keys for PuTTY,
+	kbeg=\E[E, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A,
+	kdch1=^?, kend=\E[F, kf1=\E[M, kf10=\E[V, kf11=\E[W,
+	kf12=\E[X, kf13=\E[Y, kf14=\E[Z, kf15=\E[a, kf16=\E[b,
+	kf17=\E[c, kf18=\E[d, kf19=\E[e, kf2=\E[N, kf20=\E[f,
+	kf21=\E[g, kf22=\E[h, kf23=\E[i, kf24=\E[j, kf25=\E[k,
+	kf26=\E[l, kf27=\E[m, kf28=\E[n, kf29=\E[o, kf3=\E[O,
+	kf30=\E[p, kf31=\E[q, kf32=\E[r, kf33=\E[s, kf34=\E[t,
+	kf35=\E[u, kf36=\E[v, kf37=\E[w, kf38=\E[x, kf39=\E[y,
+	kf4=\E[P, kf40=\E[z, kf41=\E[@, kf42=\E[[, kf43=\E[\\,
+	kf44=\E[], kf45=\E[\^, kf46=\E[_, kf47=\E[`, kf48=\E[{,
+	kf5=\E[Q, kf6=\E[R, kf7=\E[S, kf8=\E[T, kf9=\E[U, khome=\E[H,
+	kich1=\E[L, knp=\E[G, kpp=\E[I,
+
+#### mintty
+# https://github.com/mintty/mintty
+#
+# Originally a fork (and reduction) of PuTTY, this has grown from 15ksloc in
+# 2013 to 41ksloc in 2020.  That is still smaller than PuTTY (160ksloc), but
+# larger than rxvt (31ksloc) and slightly smaller than rxvt-unicode (42ksloc).
+#
+# Version 3.0 responds to DA as a VT400, however it does not implement the
+# application keypad.  The assignment of cursor-keys versus modifiers differs
+# from xterm (alt-left and alt-right send modifier 7, i.e., alt+control).
+#
+# Thomas Wolff suggested these extensions:
+#	blink2   turn on rapid blinking
+#	blink0   turn off blinking
+#	norm     turn off bold and half-bright mode
+#	opaq     turn off blank mode
+#	smul2    begin double underline mode
+#	smol     begin overline mode
+#	rmol     exit overline mode
+#	Font0    use default font
+#	Font1    use alternative font 1
+#	...
+#	Font10   use alternative font 10
+#	setal    set (under)line color
+#	ol       set default (under)line color
+#	overs    overstrike (print characters over each other)
+#
+# but see vte-2018 (use Smol/Rmol rather than smol/rmol).
+mintty|Cygwin Terminal,
+	setal=\E[5%p1%dm, use=xterm+256color,
+	use=mintty+common,
+mintty-direct|Cygwin Terminal direct-color,
+	use=kitty+setal, use=xterm+direct, use=mintty+common,
+mintty+common|shared capabilities for mintty,
+	km@, npc,
+	kcbt=\E[Z, kent=\EOM, rmm@, rmpch=\E[10m,
+	rs1=\Ec\E]104\007, rshm=\E[22m, rsubm=\E[75m,
+	rsupm=\E[75m, smm@, smpch=\E[11m, sshm=\E[1:2m,
+	ssubm=\E[74m, ssupm=\E[73m, Rmol=\E[55m, Smol=\E[53m,
+	Smulx=\E[4:%p1%dm, blink2=\E[6m, norm=\E[22m,
+	opaq=\E[28m, smul2=\E[21m, use=ansi+rep,
+	use=ecma+strikeout, use=ecma+index, use=vt420+lrmm,
+	use=xterm+sm+1006, use=xterm+pcfkeys, use=xterm+tmux,
+	use=ecma+italics, use=xterm-basic, use=bracketed+paste,
+# 2019-06-09: These capabilities are commented-out for compatibility with
+# existing releases 5.9-6.1, and may be considered for inclusion after the
+# release of ncurses 6.2:
+#	Font0=\E[10m,
+#	Font1=\E[11m,
+#	Font2=\E[12m,
+#	Font3=\E[13m,
+#	Font4=\E[14m,
+#	Font5=\E[15m,
+#	Font6=\E[16m,
+#	Font7=\E[17m,
+#	Font8=\E[18m,
+#	Font9=\E[19m,
+#	Font10=\E[20m,
+#	blink0=\E[25m,
+#	ol=\E[59m,
+#	overs=\E[8\:7m,
+
+#### TeraTerm
+
+# This entry is for Tera Term Pro version 2.3, for MS-Windows 95/NT written by
+# T. Teranishi dated Mar 10, 1998.  It is a free software terminal emulator
+# (communication program) which supports:
+#
+#	- Serial port connections.
+#	- TCP/IP (telnet) connections.
+#	- VT100 emulation, and selected VT200/300 emulation.
+#	- TEK4010 emulation.
+#	- File transfer protocols (Kermit, XMODEM, ZMODEM, B-PLUS and
+#	  Quick-VAN).
+#	- Scripts using the "Tera Term Language".
+#	- Japanese and Russian character sets.
+#
+# The program does not come with terminfo or termcap entries.  However, the
+# emulation (testing with vttest and ncurses) is reasonably close to VT100 (no
+# VT52 or doublesize character support; blinking is done with color).  Besides
+# the HPA, VPA extensions it also implements CPL and CNL.
+#
+# All of the function keys can be remapped.  This description shows the default
+# mapping, as installed.  Both VT100 PF1-PF4 keys and quasi-vt220 F1-F4 keys
+# are supported.  F13-F20 are obtained by shifting F3-F10.  The editing keypad
+# is laid out like VT220, rather than the face codes on the PC keyboard, i.e,
+#	kfnd	Insert
+#	kslt	Delete
+#	kich1	Home
+#	kdch1	PageUp
+#	kpp	End
+#	knp	PageDown
+#
+# ANSI colors are implemented, but cannot be combined with video attributes
+# except for reverse.
+#
+# No fonts are supplied with the program, so the acsc string is chosen to
+# correspond with the default Microsoft terminal font.
+#
+# Tera Term recognizes some xterm sequences, including those for setting and
+# retrieving the window title, and for setting the window size (i.e., using
+# "resize -s"), though it does not pass SIGWINCH to the application if the
+# user resizes the window with the mouse.
+teraterm2.3|Tera Term Pro 2.3,
+	km,
+	ncv#43, vt@,
+	acsc=+\020\,\021-\030.^Y0\333`\004a\261f\370g\361h\260i
+	     \316j\331k\277l\332m\300n\305o~p\304q\304r\304s_t\303u
+	     \264v\301w\302x\263y\363z\362{\343|\330}\234~\376,
+	blink=\E[5m, bold=\E[1m, clear=\E[H\E[J, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, dch=\E[%p1%dP,
+	dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M, ech=\E[%p1%dX, ed=\E[J,
+	el=\E[K, el1=\E[1K, flash=\E[?5h$<200/>\E[?5l,
+	hpa=\E[%i%p1%dG, il=\E[%p1%dL, il1=\E[L, kf1=\E[11~,
+	kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\E[25~,
+	kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, kf17=\E[31~,
+	kf18=\E[32~, kf19=\E[33~, kf2=\E[12~, kf20=\E[34~,
+	kf3=\E[13~, kf4=\E[14~, kf5=\E[15~, kf6=\E[17~, kf7=\E[18~,
+	kf8=\E[19~, kf9=\E[20~, op=\E[100m, rev=\E[7m, ri=\EM,
+	rmso=\E[27m, rmul=\E[24m, sgr0=\E[0m\017, smso=\E[7m,
+	smul=\E[4m, vpa=\E[%i%p1%dd, use=vt220+vtedit,
+	use=vt100+enq, use=klone+color, use=vt100,
+	use=vt220+cvis,
+
+# Version 4.59 has regular VT100 line-drawing (so it is no longer necessary
+# to choose a Windows OEM font).
+#
+# Testing with tack:
+#	- it does not have xenl (suppress that)
+#	- underline seems to work with color (modify ncv).
+# Testing with vttest:
+#	- wrapping differs from VT100 (menu 1).
+#	- it recognizes xterm's X10 and normal mouse tracking, but none of the
+#	  other flavors.
+#	- it recognizes the dtterm window controls for reporting size in
+#	  characters and pixels.
+#	- it passes SIGWINCH.
+teraterm4.59|Tera Term Pro 4.59,
+	bce, xenl@,
+	ncv#41,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	kmous=\E[M, use=teraterm2.3,
+
+# Version 4.97
+#
+# Testing with tack:
+#	- no bell (flash works)
+#	- bold is yellow, blink is red.
+#	- default keyboard sends ^? for Delete, can be configured for kdch1
+#	- no meta mode
+# Testing with vttest:
+#	+ autowrap has problems...
+#	+ color-tests for bce feature match xterm's behavior
+#	+ handles most of xterm's mouse-controls other than highlight-tracking.
+#	  xterm's SGR 1006 works.
+#	+ partial support for DEC locator-events
+#	+ implements ECMA-48 SD/SU, but not REP, SL/SR.
+#	+ has a "Tek" window, but does not work with vttest's examples
+#	+ supports the dtterm window modify/report controls
+#	+ responds to DECRQM and DECRQSS controls, but not consistent with DSR
+#	  e.g., for VT220
+#	+ VT220 screen-display tests are ok
+#	+ no VT52 support
+# Other tests:
+#	+ recognizes xterm's original direct-colors sequences, but result is
+#	  poor.
+#	+ no UTF-8 apparent when UTF-8 is set, with font Lucida Control
+teraterm4.97|Tera Term Pro 4.97,
+	XT, use=ecma+color, use=xterm+sm+1006, use=teraterm4.59,
+teraterm-256color|TeraTerm with xterm 256-colors,
+	use=xterm+256setaf, use=teraterm,
+
+teraterm|Tera Term,
+	use=teraterm4.97,
+
+#### Command prompt
+
+# Tested with WinNT 4.0, the telnet application assumes the screensize is
+# 25x80.  This entry uses the 'Terminal' font, to get line-drawing characters.
+#
+# Other notes:
+# a) Fails tack's cup (cursor-addressing) test, though cup works well enough
+#    for casual (occasional) use.  Also fails several of the vttest screens,
+#    but that is not unusual for VT100 "emulators".
+# b) Does not implement VT100 keypad
+# c) Recognizes a subset of VT52 controls.
+ms-vt100|MS telnet imitating DEC VT100,
+	lines#25,
+	acsc=+\020\,\021-\030.^Y0\333`\004a\261f\370g\361h\260i
+	     \316j\331k\277l\332m\300n\305o~p\304q\304r\304s_t\303u
+	     \264v\301w\302x\263y\363z\362{\343|\330}\234~\376,
+	ka1@, ka3@, kb2@, kc1@, kc3@, kent@, kf0@, kf1@, kf10@, kf2@, kf3@, kf4@,
+	kf5@, kf6@, kf7@, kf8@, kf9@, tbc@, use=vt102+enq, use=vt100,
+
+# Tested with Windows 2000, the telnet application runs in a console window,
+# also using 'Terminal' font.
+#
+# Other notes:
+# a) This version has no function keys or numeric keypad.  Unlike the older
+#    version, the numeric keypad is entirely ignored.
+# b) The program sets $TERM to "ansi", which of course is inaccurate.
+ms-vt100-color|vtnt|windows 2000 ANSI (sic),
+	bce,
+	dch=\E[%p1%dP, ich=\E[%p1%d@, use=ecma+color,
+	use=ms-vt100,
+
+# Based on comments from Federico Bianchi:
+#
+#	vt100+ is basically a VT102-noSGR with ANSI.SYS colors and a different
+#	scheme for PF keys.
+#
+# and PuTTY wishlist:
+#
+#	The modifiers are represented as the codes listed above, prefixed to
+#	the normal sequences.  If the modifier is pressed alone, its sequence
+#	is transmitted twice in succession.  If multiple modifiers apply,
+#	they're transmitted in the order shift, control, alt.
+#
+#	Shift	\E^S
+#	Alt	\E^A,
+#	Ctrl	\E^C,
+ms-vt100+|vt100+|windows XP VT100+ (sic),
+	kdch1=\E-, kend=\Ek, kf1=\E1, kf10=\E0, kf11=\E!, kf12=\E@,
+	kf13=\E\023\E1, kf14=\E\023\E2, kf15=\E\023\E3,
+	kf16=\E\023\E4, kf17=\E\023\E5, kf18=\E\023\E6,
+	kf19=\E\023\E7, kf2=\E2, kf20=\E\023\E8, kf21=\E\023\E9,
+	kf22=\E\023\E0, kf23=\E\023\E!, kf24=\E\023\E@,
+	kf25=\E\003\E1, kf26=\E\003\E2, kf27=\E\003\E3,
+	kf28=\E\003\E4, kf29=\E\003\E5, kf3=\E3, kf30=\E\003\E6,
+	kf31=\E\003\E7, kf32=\E\003\E8, kf33=\E\003\E9,
+	kf34=\E\003\E0, kf35=\E\003\E!, kf36=\E\003\E@,
+	kf37=\E\001\E1, kf38=\E\001\E2, kf39=\E\001\E3, kf4=\E4,
+	kf40=\E\001\E4, kf41=\E\001\E5, kf42=\E\001\E6,
+	kf43=\E\001\E7, kf44=\E\001\E8, kf45=\E\001\E9,
+	kf46=\E\001\E0, kf47=\E\001\E!, kf48=\E\001\E@, kf5=\E5,
+	kf6=\E6, kf7=\E7, kf8=\E8, kf9=\E9, khome=\Eh, kich1=\E+,
+	knp=\E/, kpp=\E?, use=ms-vt100-color,
+
+ms-vt-utf8|vt-utf8|UTF-8 flavor of VT100+,
+	use=ms-vt100+,
+
+# Windows Terminal (Preview)
+# https://github.com/microsoft/terminal
+#
+# Windows 10 21H1
+# Version 1.9.1942.0
+#
+# This has longstanding issues with CR/LF mapping, e.g.,
+# - first reported by Juergen Pfeifer August 13, 2020, with workaround
+# - Windows Terminal #8303 "Updates to ms-terminal terminal type in terminfo to
+#   1.4 from 0.2"
+# - Windows Terminal #6733 "Midnight Commander (mc) output is screwed when
+#   using the 'ms-terminal' as $TERM"
+#
+# still seen in testing during May-July 2021.  As a workaround, this terminal
+# description sets cud1 to an escape sequence rather than just \r.
+#
+# Using TERM=xterm-256color shows a number of problems.
+# A few are seen only in the WSL2 environment.
+#
+# tack:
+# - flash does not work.
+# - video attribute blink does not work.
+# - video attribute invis does not work in WSL2.
+# - italics sitm/ritm do not work in WSL2.
+# - crossed-out smxx/rmxx do not work in WSL2.
+# - reloading colors via initp interchanges red/blue.
+# - does not implement OSC 104, which is used for resetting colors in xterm.
+# - does not support numeric keypad application mode.
+# - control-modifier (without alt/shift) does not work for special keys.
+# - meta-key sends escape character rather than acting as a meta key.
+#
+# vttest:
+# - identifies itself as a VT100.
+# - cursor movement (menu 1) does not work properly, e.g., for wrapping.
+# - does not support 8-bit controls.
+# - does not support VT420 rectangles.
+# - does not support VT420 left/right margins.
+# - ECMA-48 cursor-movement works.
+# - does not support X10 mouse, or mouse highlight tracking.
+# - SGR mouse mode 1006 works.
+# - any-event mouse mode shows no focus-in/focus-out events.
+# - alternate screen 47/48 modes do not work, nor do 1047/1048.
+# - alternate screen 1049 mode works.
+# - none of the window report/modify operations work.
+# - none of the DECRPM/DECRQM reporting operations work.
+#
+# xterm:
+# - 256colors2.pl -r, -i and -q options work.
+# - dynamic colors do not work.
+# - paste64.pl does not work, i.e., bracketed-paste.
+# - tcapquery.pl does not work.
+#
+# Windows 10 1903
+# Version 0.2.1831.0
+#
+# The task manager shows this as "OpenConsole.exe", which differs
+# from the "Windows Command Processor" used for the command-prompt.
+#
+# The settings dialog does not work (unless the end user expects to open
+# profiles.json in Visual Studio).  There is no documentation, of course.
+#
+# Testing via an ssh connection, using openssh:
+# - the program sets TERM to cygwin if the tab is set to PowerShell,
+#   and to xterm-256color if "Legacy".  However, in the latter, more tests
+#   fail in vttest, which does not pay attention to TERM.
+# vttest:
+# - menu 1 (tests for cursor movement) misbehaves like command-prompt
+# - primary DA says this is a vanilla VT100
+# - does not flush response to primary DA, leaving a ^M on the end when
+#   the PowerShell tab is used.  Both the "Legacy" tab and the command-prompt
+#   work properly in this test.
+# - in the generic VT100 tests, there are problems with character sets
+#   (diamond shows as a double-width character, DEL as two replacement-chars).
+# - outside of the generic VT100 tests, the program does poorly because most
+#   of the features are missing.
+# - ECH does not work properly
+# - a few generic xterm features are supported (set window title), but
+#   others are missing (such as the mouse).
+# - the cursor visible/invisible works in the PowerShell tab, not in "Legacy"
+# tack:
+# - blink, dim, bold, invis, protect do not work
+# - bce works (but per vttest, with ED, EL, not ECH)
+# - does not support keypad application mode
+# - implements most of the xterm modified keys; sometimes modifiers are ignored
+#   or simply incorrect
+# - sends escape+key rather than implementing meta mode
+# other:
+# - color palette can be altered, but OSC 104 for resetting does not work
+# - crashed with a script used for testing NRCS.
+# - does not recognize either xterm+direct or xterm+indirect escapes.
+ms-terminal|Windows10 terminal,
+	npc,
+	cud1=\E[B, kcbt=\E[Z, rmkx=\E[?1l, rmm@, smkx=\E[?1h, smm@,
+	Cr@, Ms@, use=xterm+256color, use=xterm+pcfkeys,
+	use=ansi+rep, use=xterm+sm+1006, use=ecma+index,
+	use=ecma+italics, use=ecma+strikeout, use=xterm-basic,
+	use=xterm+tmux,
+
+#### Visual Studio
+# Visual Studio Code 1.45.0 uses xterm.js 12.8.1 (see https://xtermjs.org/).
+#
+# vttest:
+# - fixes menu 1 problem with wrapping
+# - supports DECALN
+# - fixes menu 8 problem with delete-character
+# - REP, SL/SL work
+# - keypad application mode still does not work; PF1-PF4 are not assigned.
+# - DECRQM/DECRPM do not work
+# - xterm mouse features:
+#   - SGR coordinates work; the other modes do not (see vscode #96058)
+#   - focus-events are not sent
+#   - mouse highlight tracking does not send button event
+# tack/other:
+# - little or no change since previous review
+#
+# Visual Studio Code 1.35.1 uses xterm.js (see https://xtermjs.org/).
+# https://code.visualstudio.com/docs/editor/integrated-terminal
+#
+# This sets TERM to xterm-256color, which is a little more successful than
+# Windows Terminal.
+#
+# vttest:
+# - menu 1 (cursor movement) has problems with wrapping
+# - claims to be a VT100 with AVO, but copies xterm #276's secondary response
+# - menu 8 (insert/delete char/line) has problem with delete-character
+# - like Windows Terminal, fails the ECH test: neither supports DECALN
+#   However, the bce test with ECH works.
+# - does not support keypad application mode
+# - supports most xterm mode controls (except DEC Locator Events)
+# - REP, SL/SL do not work, but SD/SU work.
+# - the alternate-screen tests fail because it does not support DECALN
+# - window modify/report is not supported
+# - supports some VT320 presentation reports
+# tack:
+# - does not support blinking text
+# - implements most of the xterm modified keys, with some exceptions:
+#   - pageup/pagedown do not send escapes
+#   - alt cursor left/right send escape-b and escape-f
+# - sends UTF-8 like xterm for meta mode
+# other:
+# - mouse mode is not reset by reset-sequence
+# - supports italics and dim, but not cross-out or double-underline
+# - color-palette cannot be changed
+vscode|xterm.js|Visual Studio Code terminal using xterm.js,
+	npc,
+	kcbt=\E[Z, rmkx=\E[?1l, smkx=\E[?1h, use=xterm+256setaf,
+	use=ecma+index, use=xterm+sm+1006, use=xterm+pcfkeys,
+	use=ecma+italics, use=xterm-basic, use=bracketed+paste,
+vscode-direct|Visual Studio Code with direct-colors,
+	use=xterm+indirect, use=vscode,
+
+######## X TERMINAL EMULATORS
+#### XTERM
+#
+# You can add the following line to your .Xdefaults to change the terminal type
+# set by the xterms you start up to my-xterm:
+#
+# *termName:  my-xterm
+#
+# System administrators can change the default entry for xterm instances
+# by adding a similar line to /usr/X11/lib/X11/app-defaults/XTerm.  In either
+# case, xterm will detect and reject an invalid terminal type, falling back
+# to the default of xterm.
+#
+
+# X10/6.6	11/7/86, minus alternate screen, plus (csr)
+# (xterm: ":MT:" changed to ":km:"; added <smam>/<rmam> based on init string;
+# removed (hs, eslok, tsl=\E[?E\E[?%i%dT, fsl=\E[?F, dsl=\E[?E)
+# as these seem not to work -- esr)
+x10term|vs100-x10|xterm terminal emulator (X10 window system),
+	OTbs, am, km, mir, msgr, xenl, xon,
+	cols#80, it#8, lines#65,
+	bold=\E[1m, clear=\E[H\E[2J, csr=\E[%i%p1%d;%p2%dr,
+	cub1=^H, cud1=\n, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH,
+	cuu1=\E[A, dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM,
+	dl1=\E[M, ed=\E[J, el=\E[K, home=\E[H, ht=^I, il=\E[%p1%dL,
+	il1=\E[L, ind=\n, is2=\E\E[m\E[?7h\E[?1;4l, kbs=^H,
+	kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kf1=\EOP,
+	kf2=\EOQ, kf3=\EOR, kf4=\EOS, rev=\E[7m, ri=\EM, rmam=\E[?7l,
+	rmir=\E[4l, rmkx=\E[?1l\E>, rmso=\E[m, rmul=\E[m,
+	sgr0=\E[m, smam=\E[?7h, smir=\E[4h, smkx=\E[?1h\E=,
+	smso=\E[7m, smul=\E[4m,
+# csl is extension which clears the status line
+x10term+sl|status-line for X10 xterm,
+	eslok, hs,
+	dsl=\E[?H, fsl=\E[?F, tsl=\E[?E\E[?%i%p1%dT, csl=\E[?E,
+
+# Compatible with the R5 xterm
+# (from the XFree86 3.2 distribution, <blink=@> removed)
+# added khome/kend, rmir/smir, rmul/smul, hts based on the R5 xterm code - TD
+# corrected typos in rs2 string - TD
+# added u6-u9 -TD
+xterm-r5|xterm R5 version,
+	OTbs, am, km, msgr, xenl,
+	cols#80, it#8, lines#24,
+	bel=^G, bold=\E[1m, clear=\E[H\E[2J, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M, ed=\E[J,
+	el=\E[K, home=\E[H, ht=^I, hts=\EH, ich=\E[%p1%d@, ich1=\E[@,
+	il=\E[%p1%dL, il1=\E[L, ind=\n, kcub1=\EOD, kcud1=\EOB,
+	kcuf1=\EOC, kcuu1=\EOA, kdl1=\E[31~, kel=\E[8~, kf0=\EOq,
+	kf1=\E[11~, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~,
+	kf2=\E[12~, kf3=\E[13~, kf4=\E[14~, kf5=\E[15~, kf6=\E[17~,
+	kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, khome=\E[1~,
+	kil1=\E[30~, kmous=\E[M, rc=\E8, rev=\E[7m, ri=\EM,
+	rmir=\E[4l, rmkx=\E[?1l\E>, rmso=\E[m, rmul=\E[m,
+	rs2=\E>\E[?1;3;4;5;6l\E[4l\E[?7h\E[m\E[r\E[2J\E[H,
+	sc=\E7,
+	sgr=\E[%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1
+	    %;m,
+	sgr0=\E[m, smir=\E[4h, smkx=\E[?1h\E=, smso=\E[7m,
+	smul=\E[4m, tbc=\E[3g, use=vt220+pcedit, use=vt100+enq,
+	use=xterm+kbs,
+
+# Compatible with the R6 xterm
+# (from XFree86 3.2 distribution, <acsc> and <it> added, <blink@> removed)
+# added khome/kend, hts based on the R6 xterm code - TD
+# (khome/kend do not actually work in X11R5 or X11R6, but many people use this
+# for compatibility with other emulators).
+xterm-r6|xterm X11R6 version,
+	OTbs, am, km, mir, msgr, xenl,
+	cols#80, it#8, lines#24,
+	acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, bold=\E[1m, clear=\E[H\E[2J, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M, ed=\E[J,
+	el=\E[K, enacs=\E)0, home=\E[H, ht=^I, hts=\EH, il=\E[%p1%dL,
+	il1=\E[L, ind=\n,
+	is2=\E[m\E[?7h\E[4l\E>\E7\E[r\E[?1;3;4;6l\E8,
+	kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kf1=\E[11~,
+	kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\E[25~,
+	kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, kf17=\E[31~,
+	kf18=\E[32~, kf19=\E[33~, kf2=\E[12~, kf20=\E[34~,
+	kf3=\E[13~, kf4=\E[14~, kf5=\E[15~, kf6=\E[17~, kf7=\E[18~,
+	kf8=\E[19~, kf9=\E[20~, kmous=\E[M, meml=\El, memu=\Em,
+	rc=\E8, rev=\E[7m, ri=\EM, rmacs=^O, rmir=\E[4l,
+	rmkx=\E[?1l\E>, rmso=\E[m, rmul=\E[m,
+	rs2=\E[m\E[?7h\E[4l\E>\E7\E[r\E[?1;3;4;6l\E8, sc=\E7,
+	sgr0=\E[m, smacs=^N, smir=\E[4h, smkx=\E[?1h\E=,
+	smso=\E[7m, smul=\E[4m, tbc=\E[3g, use=xterm+alt47,
+	use=vt220+vtedit, use=xterm+kbs, use=vt100+enq,
+xterm-old|antique xterm version,
+	use=xterm-r6,
+# The monochrome version began as a copy of "xtermm" (from Solaris), and was
+# initially part of the xterm sources (in XFree86).  But "xterm" continued to
+# grow, while "xterm-mono" had none of the newer features.  Additionally,
+# inheriting from "xtermm" runs into several problems, including different
+# function keys as well as the fact that the mouse support is not compatible.
+# This entry restores the original intent, intentionally not an alias to
+# simplify maintenance -TD
+xterm-mono|monochrome xterm,
+	use=xterm-r6,
+# This is the base xterm entry for the xterm supplied with XFree86 3.2 & up.
+# The name has been changed and some aliases have been removed.
+xterm-xf86-v32|xterm terminal emulator (XFree86 3.2 Window System),
+	OTbs, am, bce, km, mir, msgr, xenl, XT,
+	cols#80, it#8, lines#24, ncv@,
+	acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, bold=\E[1m, cbt=\E[Z, clear=\E[H\E[2J, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M,
+	ech=\E[%p1%dX, ed=\E[J, el=\E[K, el1=\E[1K, enacs=\E(B\E)0,
+	flash=\E[?5h$<100/>\E[?5l, home=\E[H, hpa=\E[%i%p1%dG,
+	ht=^I, hts=\EH, ich=\E[%p1%d@, ich1=\E[@, il=\E[%p1%dL,
+	il1=\E[L, ind=\n,
+	is2=\E7\E[r\E[m\E[?7h\E[?1;3;4;6l\E[4l\E8\E>,
+	kbeg=\EOE, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
+	kdch1=^?, kend=\EOF, kf1=\E[11~, kf10=\E[21~, kf11=\E[23~,
+	kf12=\E[24~, kf13=\E[25~, kf14=\E[26~, kf15=\E[28~,
+	kf16=\E[29~, kf17=\E[31~, kf18=\E[32~, kf19=\E[33~,
+	kf2=\E[12~, kf20=\E[34~, kf3=\E[13~, kf4=\E[14~,
+	kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~,
+	kfnd=\E[1~, khome=\EOH, kich1=\E[2~, kmous=\E[M, knp=\E[6~,
+	kpp=\E[5~, kslt=\E[4~, meml=\El, memu=\Em, rc=\E8, rev=\E[7m,
+	ri=\EM, rmacs=^O, rmam=\E[?7l, rmir=\E[4l, rmkx=\E[?1l\E>,
+	rmso=\E[27m, rmul=\E[24m, rs1=^O,
+	rs2=\E7\E[r\E8\E[m\E[?7h\E[?1;3;4;6l\E[4l\E>, sc=\E7,
+	setb=\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}
+	     %=%t3%e%p1%d%;m,
+	setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}
+	     %=%t3%e%p1%d%;m,
+	sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5
+	    %;m%?%p9%t\016%e\017%;,
+	sgr0=\E[m\017, smacs=^N, smam=\E[?7h, smir=\E[4h,
+	smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m, tbc=\E[3g,
+	vpa=\E[%i%p1%dd, use=xterm+alt47, use=xterm+kbs,
+	use=vt100+enq, use=ecma+color, use=vt220+cvis,
+	use=vt220+keypad,
+
+# This is the stock xterm entry supplied with XFree86 3.3, which uses VT100
+# codes for F1-F4 except while in VT220 mode.
+xterm-xf86-v33|xterm terminal emulator (XFree86 3.3 Window System),
+	kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, use=xterm-xf86-v32,
+
+# This version was released in XFree86 3.3.3 (November 1998).
+# Besides providing printer support, it exploits a new feature that allows
+# xterm to use terminfo-based descriptions with the titeInhibit resource.
+# -- the distribution contained incorrect khome/kend values -TD
+xterm-xf86-v333|xterm terminal emulator (XFree86 3.3.3 Window System),
+	blink=\E[5m, ich1@, invis=\E[8m,
+	is2=\E[!p\E[?3;4l\E[4l\E>, kdch1=\E[3~, kfnd@, kslt@,
+	rmcup=\E[?1047l\E[?1048l, rs1=\Ec,
+	rs2=\E[!p\E[?3;4l\E[4l\E>,
+	sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5
+	    %;%?%p7%t;8%;m%?%p9%t\016%e\017%;,
+	smcup=\E[?1048h\E[?1047h, use=ansi+pp,
+	use=xterm-xf86-v33,
+
+# This version was released in XFree86 4.0.
+xterm-xf86-v40|xterm terminal emulator (XFree86 4.0 Window System),
+	npc,
+	kDC=\E[3;5~, kEND=\EO5F, kHOM=\EO5H, kIC=\E[2;5~,
+	kLFT=\EO5D, kNXT=\E[6;5~, kPRV=\E[5;5~, kRIT=\EO5C, ka1@,
+	ka3@, kb2=\EOE, kc1@, kc3@, kcbt=\E[Z, kdch1=\E[3~, kend=\EOF,
+	kf13=\EO2P, kf14=\EO2Q, kf15=\EO2R, kf16=\EO2S,
+	kf17=\E[15;2~, kf18=\E[17;2~, kf19=\E[18;2~,
+	kf20=\E[19;2~, kf21=\E[20;2~, kf22=\E[21;2~,
+	kf23=\E[23;2~, kf24=\E[24;2~, kf25=\EO5P, kf26=\EO5Q,
+	kf27=\EO5R, kf28=\EO5S, kf29=\E[15;5~, kf30=\E[17;5~,
+	kf31=\E[18;5~, kf32=\E[19;5~, kf33=\E[20;5~,
+	kf34=\E[21;5~, kf35=\E[23;5~, kf36=\E[24;5~, kf37=\EO6P,
+	kf38=\EO6Q, kf39=\EO6R, kf40=\EO6S, kf41=\E[15;6~,
+	kf42=\E[17;6~, kf43=\E[18;6~, kf44=\E[19;6~,
+	kf45=\E[20;6~, kf46=\E[21;6~, kf47=\E[23;6~,
+	kf48=\E[24;6~, khome=\EOH,
+	sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?
+	    %p9%t\016%e\017%;,
+	use=xterm+alt1049, use=xterm-xf86-v333,
+
+# This version was released in XFree86 4.3.
+xterm-xf86-v43|xterm terminal emulator (XFree86 4.3 Window System),
+	kDC=\E[3;2~, kEND=\E[1;2F, kHOM=\E[1;2H, kIC=\E[2;2~,
+	kLFT=\E[1;2D, kNXT=\E[6;2~, kPRV=\E[5;2~, kRIT=\E[1;2C,
+	kbeg@,
+	sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?
+	    %p7%t;8%;m%?%p9%t\016%e\017%;,
+	use=xterm-xf86-v40,
+
+# Controlling the cursor-visibility is not a "new" feature, but was generally
+# neglected in terminal emulators until the mid-1990s.  These would work for
+# the hardware terminals, or for more recent emulators, e.g., xterm.
+vt220+cvis|DECTCEM VT220 cursor-visibility,
+	civis=\E[?25l, cnorm=\E[?25h,
+vt220+cvis8|8-bit DECTCEM VT220 cursor-visibility,
+	civis=\233?25l, cnorm=\233?25h,
+# The first block is for terminals which did not support blinking cursor.
+att610+cvis0|AT&T 610 cursor-visibility,
+	civis=\E[?25l, cnorm=\E[?12l\E[?25h,
+att610+cvis|AT&T 610 cursor-visibility with blink,
+	civis=\E[?25l, cnorm=\E[?12l\E[?25h, cvvis=\E[?12;25h,
+
+# This version was released in XFree86 4.4.
+xterm-xf86-v44|xterm terminal emulator (XFree86 4.4 Window System),
+	use=att610+cvis, use=ecma+index, use=xterm-xf86-v43,
+
+xterm-xfree86|xterm terminal emulator (XFree86),
+	use=xterm-xf86-v44,
+
+xterm+nofkeys|building block for xterm fkey-variants,
+	npc,
+	kcbt=\E[Z, kent=\EOM, nel=\EE, use=ecma+index,
+	use=ansi+rep, use=ecma+strikeout, use=vt420+lrmm,
+	use=xterm+sm+1006, use=xterm+tmux, use=ecma+italics,
+	use=xterm+keypad, use=xterm-basic,
+
+xterm-p370|xterm patch #370,
+	npc,
+	kcbt=\E[Z, kent=\EOM, nel=\EE, use=ecma+index,
+	use=ansi+rep, use=ecma+strikeout, use=xterm+pcfkeys,
+	use=xterm+nofkeys, use=bracketed+paste,
+
+xterm-p371|xterm patch #371,
+	use=dec+sl, use=xterm-p370,
+
+# This version reflects the current xterm features.
+xterm-new|modern xterm terminal emulator,
+	use=xterm-p370,
+
+# This fragment is for people who cannot agree on what the backspace key
+# should send.
+xterm+kbs|fragment for backspace key,
+	kbs=^H,
+#
+# This fragment describes as much of XFree86 xterm's "pc-style" function
+# keys as will fit into terminfo's 60 function keys.
+# From ctlseqs.ms:
+#    Code     Modifiers
+#  ---------------------------------
+#     2       Shift
+#     3       Alt
+#     4       Shift + Alt
+#     5       Control
+#     6       Shift + Control
+#     7       Alt + Control
+#     8       Shift + Alt + Control
+#  ---------------------------------
+# The meta key may also be used as a modifier in this scheme, adding another
+# bit to the parameter.
+xterm+pcfkeys|xterm fragment for PC-style fkeys,
+	use=xterm+app, use=xterm+pcf2, use=xterm+pcc2,
+	use=xterm+pce2,
+
+# The xterm ctrlFKeys resource defaults to 10, so without the "pc-style"
+# feature, e.g., setting the modifyCursorKeys and modifyFunctionKeys resources
+# to -1 to disable them, one gets 42 function-keys on a 12-function-key
+# keyboard, e.g.,
+# kf1                   = \E[11~
+# kf11 shift f1         = \E[23~
+# kf21 control f1       = \E[42~
+# kf31 shift control f1 = \E[52~
+xterm+nopcfkeys|fragment without PC-style fkeys,
+	kf1=\E[11~, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~,
+	kf13=\E[25~, kf14=\E[26~, kf15=\E[28~, kf16=\E[29~,
+	kf17=\E[31~, kf18=\E[32~, kf19=\E[33~, kf2=\E[12~,
+	kf20=\E[34~, kf21=\E[42~, kf22=\E[43~, kf23=\E[44~,
+	kf24=\E[45~, kf25=\E[46~, kf26=\E[47~, kf27=\E[48~,
+	kf28=\E[49~, kf29=\E[50~, kf3=\E[13~, kf30=\E[51~,
+	kf31=\E[52~, kf32=\E[53~, kf33=\E[54~, kf34=\E[55~,
+	kf35=\E[56~, kf36=\E[57~, kf37=\E[58~, kf38=\E[59~,
+	kf39=\E[60~, kf4=\E[14~, kf40=\E[61~, kf41=\E[62~,
+	kf42=\E[63~, kf5=\E[15~, kf6=\E[17~, kf7=\E[18~,
+	kf8=\E[19~, kf9=\E[20~,
+
+xterm+noapp|fragment with cursor keys in normal mode,
+	kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kend=\E[F,
+	khome=\E[H,
+
+xterm+app|fragment with cursor keys in application mode,
+	kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kend=\EOF,
+	khome=\EOH,
+#
+# The "PC-style" modifier scheme was introduced in xterm patch #94 (1999/3/27)
+# and revised in xterm patch #167 (2002/8/24).  Some other terminal emulators
+# copied the earlier scheme, as noted in the "use=" clauses in this file.
+#
+# The original assignments from patch #94 for cursor-keys had some technical
+# issues:
+#
+#	A parameter for a function-key to represent a modifier is just more
+#	bits.  But for a cursor-key it may change the behavior of the
+#	application.  For instance, emacs decodes the first parameter of a
+#	cursor-key as a repeat count.
+#
+#	A parameterized string should (really) not begin with SS3 (\EO).
+#	Rather, CSI (\E[) should be used.
+#
+# For these reasons, the original assignments were deprecated.  For
+# compatibility reasons, they are still available as a setting of xterm's
+# modifyCursorKeys resource.  These fragments list the modified cursor-keys
+# that might apply to xterm+pcfkeys with different values of that resource.
+#
+# These entries will have warnings when checking with tic because the kri/kind
+# capabilities duplicate the kUP/kDN extensions.  This is intentional, though
+# not part of the original plan.  The changes for xterm patch #206 (2005/11/3)
+# show that kri/kind were seen much later as part of a set including kLFT/kRIT:
+#
+#   * modify  xterm-new  terminfo  entry to use capabilities for shifted
+#     scroll forward/reverse as shifted cursor up/down.
+#
+# In the 1980s when terminfo was defined, the developers made more of
+# a distinction between shifted up/down versus shifted left/right since most
+# terminals can index (scroll up/down), while few can scroll left/right.
+xterm+pcc3|fragment with modifyCursorKeys:3,
+	kLFT=\E[>1;2D, kRIT=\E[>1;2C, kind=\E[>1;2B,
+	kri=\E[>1;2A, kDN=\E[>1;2B, kDN3=\E[>1;3B, kDN4=\E[>1;4B,
+	kDN5=\E[>1;5B, kDN6=\E[>1;6B, kDN7=\E[>1;7B,
+	kLFT3=\E[>1;3D, kLFT4=\E[>1;4D, kLFT5=\E[>1;5D,
+	kLFT6=\E[>1;6D, kLFT7=\E[>1;7D, kRIT3=\E[>1;3C,
+	kRIT4=\E[>1;4C, kRIT5=\E[>1;5C, kRIT6=\E[>1;6C,
+	kRIT7=\E[>1;7C, kUP=\E[>1;2A, kUP3=\E[>1;3A,
+	kUP4=\E[>1;4A, kUP5=\E[>1;5A, kUP6=\E[>1;6A,
+	kUP7=\E[>1;7A,
+
+xterm+pcc2|fragment with modifyCursorKeys:2,
+	kLFT=\E[1;2D, kRIT=\E[1;2C, kind=\E[1;2B, kri=\E[1;2A,
+	kDN=\E[1;2B, kDN3=\E[1;3B, kDN4=\E[1;4B, kDN5=\E[1;5B,
+	kDN6=\E[1;6B, kDN7=\E[1;7B, kLFT3=\E[1;3D, kLFT4=\E[1;4D,
+	kLFT5=\E[1;5D, kLFT6=\E[1;6D, kLFT7=\E[1;7D,
+	kRIT3=\E[1;3C, kRIT4=\E[1;4C, kRIT5=\E[1;5C,
+	kRIT6=\E[1;6C, kRIT7=\E[1;7C, kUP=\E[1;2A, kUP3=\E[1;3A,
+	kUP4=\E[1;4A, kUP5=\E[1;5A, kUP6=\E[1;6A, kUP7=\E[1;7A,
+
+xterm+pcc1|fragment with modifyCursorKeys:1,
+	kLFT=\E[2D, kRIT=\E[2C, kind=\E[2B, kri=\E[2A, kDN=\E[2B,
+	kDN3=\E[3B, kDN4=\E[4B, kDN5=\E[5B, kDN6=\E[6B, kDN7=\E[7B,
+	kLFT3=\E[3D, kLFT4=\E[4D, kLFT5=\E[5D, kLFT6=\E[6D,
+	kLFT7=\E[7D, kRIT3=\E[3C, kRIT4=\E[4C, kRIT5=\E[5C,
+	kRIT6=\E[6C, kRIT7=\E[7C, kUP=\E[2A, kUP3=\E[3A,
+	kUP4=\E[4A, kUP5=\E[5A, kUP6=\E[6A, kUP7=\E[7A,
+
+xterm+pcc0|fragment with modifyCursorKeys:0,
+	kLFT=\EO2D, kRIT=\EO2C, kind=\EO2B, kri=\EO2A, kDN=\EO2B,
+	kDN3=\EO3B, kDN4=\EO4B, kDN5=\EO5B, kDN6=\EO6B, kDN7=\EO7B,
+	kLFT3=\EO3D, kLFT4=\EO4D, kLFT5=\EO5D, kLFT6=\EO6D,
+	kLFT7=\EO7D, kRIT3=\EO3C, kRIT4=\EO4C, kRIT5=\EO5C,
+	kRIT6=\EO6C, kRIT7=\EO7C, kUP=\EO2A, kUP3=\EO3A,
+	kUP4=\EO4A, kUP5=\EO5A, kUP6=\EO6A, kUP7=\EO7A,
+
+#
+# Here are corresponding fragments from xterm patch #216:
+#
+xterm+pcf0|fragment with modifyFunctionKeys:0,
+	kf1=\EOP, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~,
+	kf13=\EO2P, kf14=\EO2Q, kf15=\EO2R, kf16=\EO2S,
+	kf17=\E[15;2~, kf18=\E[17;2~, kf19=\E[18;2~, kf2=\EOQ,
+	kf20=\E[19;2~, kf21=\E[20;2~, kf22=\E[21;2~,
+	kf23=\E[23;2~, kf24=\E[24;2~, kf25=\EO5P, kf26=\EO5Q,
+	kf27=\EO5R, kf28=\EO5S, kf29=\E[15;5~, kf3=\EOR,
+	kf30=\E[17;5~, kf31=\E[18;5~, kf32=\E[19;5~,
+	kf33=\E[20;5~, kf34=\E[21;5~, kf35=\E[23;5~,
+	kf36=\E[24;5~, kf37=\EO6P, kf38=\EO6Q, kf39=\EO6R,
+	kf4=\EOS, kf40=\EO6S, kf41=\E[15;6~, kf42=\E[17;6~,
+	kf43=\E[18;6~, kf44=\E[19;6~, kf45=\E[20;6~,
+	kf46=\E[21;6~, kf47=\E[23;6~, kf48=\E[24;6~, kf49=\EO3P,
+	kf5=\E[15~, kf50=\EO3Q, kf51=\EO3R, kf52=\EO3S,
+	kf53=\E[15;3~, kf54=\E[17;3~, kf55=\E[18;3~,
+	kf56=\E[19;3~, kf57=\E[20;3~, kf58=\E[21;3~,
+	kf59=\E[23;3~, kf6=\E[17~, kf60=\E[24;3~, kf61=\EO4P,
+	kf62=\EO4Q, kf63=\EO4R, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~,
+#
+xterm+pcf2|fragment with modifyFunctionKeys:2,
+	kf1=\EOP, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~,
+	kf13=\E[1;2P, kf14=\E[1;2Q, kf15=\E[1;2R, kf16=\E[1;2S,
+	kf17=\E[15;2~, kf18=\E[17;2~, kf19=\E[18;2~, kf2=\EOQ,
+	kf20=\E[19;2~, kf21=\E[20;2~, kf22=\E[21;2~,
+	kf23=\E[23;2~, kf24=\E[24;2~, kf25=\E[1;5P, kf26=\E[1;5Q,
+	kf27=\E[1;5R, kf28=\E[1;5S, kf29=\E[15;5~, kf3=\EOR,
+	kf30=\E[17;5~, kf31=\E[18;5~, kf32=\E[19;5~,
+	kf33=\E[20;5~, kf34=\E[21;5~, kf35=\E[23;5~,
+	kf36=\E[24;5~, kf37=\E[1;6P, kf38=\E[1;6Q, kf39=\E[1;6R,
+	kf4=\EOS, kf40=\E[1;6S, kf41=\E[15;6~, kf42=\E[17;6~,
+	kf43=\E[18;6~, kf44=\E[19;6~, kf45=\E[20;6~,
+	kf46=\E[21;6~, kf47=\E[23;6~, kf48=\E[24;6~,
+	kf49=\E[1;3P, kf5=\E[15~, kf50=\E[1;3Q, kf51=\E[1;3R,
+	kf52=\E[1;3S, kf53=\E[15;3~, kf54=\E[17;3~,
+	kf55=\E[18;3~, kf56=\E[19;3~, kf57=\E[20;3~,
+	kf58=\E[21;3~, kf59=\E[23;3~, kf6=\E[17~, kf60=\E[24;3~,
+	kf61=\E[1;4P, kf62=\E[1;4Q, kf63=\E[1;4R, kf7=\E[18~,
+	kf8=\E[19~, kf9=\E[20~,
+#
+# Chunks from xterm #230:
+xterm+pce2|fragment with modifyCursorKeys:2 editing-keys,
+	kDC=\E[3;2~, kEND=\E[1;2F, kHOM=\E[1;2H, kIC=\E[2;2~,
+	kNXT=\E[6;2~, kPRV=\E[5;2~, kich1=\E[2~, knp=\E[6~,
+	kpp=\E[5~, kDC3=\E[3;3~, kDC4=\E[3;4~, kDC5=\E[3;5~,
+	kDC6=\E[3;6~, kDC7=\E[3;7~, kEND3=\E[1;3F, kEND4=\E[1;4F,
+	kEND5=\E[1;5F, kEND6=\E[1;6F, kEND7=\E[1;7F,
+	kHOM3=\E[1;3H, kHOM4=\E[1;4H, kHOM5=\E[1;5H,
+	kHOM6=\E[1;6H, kHOM7=\E[1;7H, kIC3=\E[2;3~, kIC4=\E[2;4~,
+	kIC5=\E[2;5~, kIC6=\E[2;6~, kIC7=\E[2;7~, kNXT3=\E[6;3~,
+	kNXT4=\E[6;4~, kNXT5=\E[6;5~, kNXT6=\E[6;6~,
+	kNXT7=\E[6;7~, kPRV3=\E[5;3~, kPRV4=\E[5;4~,
+	kPRV5=\E[5;5~, kPRV6=\E[5;6~, kPRV7=\E[5;7~,
+	use=xterm+edit,
+
+xterm+edit|fragment for 6-key editing-keypad,
+	kdch1=\E[3~, kich1=\E[2~, knp=\E[6~, kpp=\E[5~,
+	use=xterm+pc+edit,
+
+xterm+pc+edit|fragment for pc-style editing keypad,
+	kend=\E[4~, khome=\E[1~,
+
+xterm+vt+edit|fragment for VT220-style editing keypad,
+	kfnd=\E[1~, kslt=\E[4~,
+
+# These variations for alternate-screen and title-stacking were introduced by
+# xterm patch #331:
+xterm+noalt|xterm without altscreen,
+	rmcup@, smcup@,
+
+xterm+alt47|X11R4 alternate-screen,
+	rmcup=\E[2J\E[?47l\E8, smcup=\E7\E[?47h,
+
+xterm+alt1049|xterm 90 feature,
+	rmcup=\E[?1049l, smcup=\E[?1049h,
+
+xterm+titlestack|xterm 251 feature,
+	rmcup=\E[23;0;0t, smcup=\E[22;0;0t,
+
+xterm+alt+title|xterm 90 and 251 features combined,
+	rmcup=\E[?1049l\E[23;0;0t, smcup=\E[?1049h\E[22;0;0t,
+
+# https://invisible-island.net/xterm/xterm.faq.html#xterm_keypad
+#
+# Xterm's emulation of the VT100 numeric keypad on a PC-keyboard runs into the
+# problem that the keypad layout is different, and that the natural choice for
+# PF1 is NumLock (which happens to be reserved for other use).  To work around
+# that, PF1-PF4 are emulated via F1-F4, which leaves the "/", "*" and "+" not
+# directly related to VT100.
+#
+# With the VT220 keypad block that uses the 1-9 keys as suggested in
+# terminfo(5), the other keys can be handled with user-defined capabilities:
+#
+#   _______________________________________
+#  | NumLock |    /    |    *    |    -    |
+#  |         |   $Oo   |   $Oj   |   $OS   |
+#  |_________|__kpDIV__|__kpMUL__|__kpSUB__|
+#  |    7         8         9    |    +    |
+#  |   $Ow   |   $Ox   |   $Oy   |   $Ok   |
+#  |_ka1__K1_|_________|_ka3__K3_|  kpADD  |
+#  |    4    |    5    |    6    |         |
+#  |   $Ot   |   $Ou   |   $Ov   |         |
+#  |_________|_kb2__K2_|_________|_________|
+#  |    1    |    2    |    3    |         |
+#  |   $Oq   |   $Or   |   $Os   |         |
+#  |_kc1__K4_|_________|_kc3__K5_|  enter  |
+#  |         0         |    .    |   $OM   |
+#  |        $Op        |   $On   |         |
+#  |_______kpZRO_______|__kpDOT__|_kent_@8_|
+#
+# ka2, kb1, kb3 and kc2 are extensions, as are the mixed-case names.
+# There are no termcap equivalents for these extensions.
+#
+# kpCMA (comma) is used here for the VT100 keypad, which xterm emulates with
+# shifted-keypad-plus, though normally that invokes a font-size change.
+#
+# Old versions of xterm, e.g., xterm-xfree86, documented \EOE as kb2, which
+# does not fit into this layout.  The extension kp5 fits, but is not visible
+# to termcap applications.  As an alternative, kbeg (which does have a termcap
+# equivalent) is provided.
+#
+xterm+keypad|xterm emulating VT100/VT220 numeric keypad,
+	kbeg=\EOE, kp5=\EOE, kpADD=\EOk, kpCMA=\EOl, kpDIV=\EOo,
+	kpDOT=\EOn, kpMUL=\EOj, kpSUB=\EOm, kpZRO=\EOp,
+	use=vt220+keypad,
+#
+# Those chunks use the new-style (the xterm oldFunctionKeys resource is false).
+# Alternatively, the same scheme with old-style function keys as in xterm-r6
+# is shown here (because that is used in mrxvt and mlterm):
+xterm+r6f2|xterm with oldFunctionKeys and modifyFunctionKeys:2,
+	kf1=\E[11~, kf13=\E[11;2~, kf14=\E[12;2~, kf15=\E[13;2~,
+	kf16=\E[14;2~, kf2=\E[12~, kf25=\E[11;5~, kf26=\E[12;5~,
+	kf27=\E[13;5~, kf28=\E[14;5~, kf3=\E[13~, kf37=\E[11;6~,
+	kf38=\E[12;6~, kf39=\E[13;6~, kf4=\E[14~, kf40=\E[14;6~,
+	kf49=\E[11;3~, kf50=\E[12;3~, kf51=\E[13;3~,
+	kf52=\E[14;3~, kf61=\E[11;4~, kf62=\E[12;4~,
+	kf63=\E[13;4~, use=xterm+pcf2,
+#
+xterm+acs|ISO-2022 alternate character-switching for xterm,
+	acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	enacs@, rmacs=\E(B, smacs=\E(0,
+
+# This chunk is used for building the VT220/Sun/PC keyboard variants.
+xterm-basic|modern xterm terminal emulator - common,
+	OTbs, am, bce, mir, msgr, xenl, AX, XT,
+	colors#8, cols#80, it#8, lines#24, pairs#64,
+	acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, clear=\E[H\E[2J,
+	cr=\r, csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m, dl=\E[%p1%dM,
+	dl1=\E[M, ech=\E[%p1%dX, ed=\E[J, el=\E[K, el1=\E[1K,
+	flash=\E[?5h$<100/>\E[?5l, home=\E[H, hpa=\E[%i%p1%dG,
+	ht=^I, hts=\EH, ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[L,
+	ind=\n, invis=\E[8m, is2=\E[!p\E[?3;4l\E[4l\E>,
+	kmous=\E[M, meml=\El, memu=\Em, op=\E[39;49m, rc=\E8,
+	rev=\E[7m, ri=\EM, rmacs=\E(B, rmam=\E[?7l, rmir=\E[4l,
+	rmkx=\E[?1l\E>, rmso=\E[27m, rmul=\E[24m, rs1=\Ec,
+	rs2=\E[!p\E[?3;4l\E[4l\E>, sc=\E7, setab=\E[4%p1%dm,
+	setaf=\E[3%p1%dm,
+	setb=\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}
+	     %=%t3%e%p1%d%;m,
+	setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}
+	     %=%t3%e%p1%d%;m,
+	sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;
+	    %?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m,
+	sgr0=\E(B\E[m, smacs=\E(0, smam=\E[?7h, smir=\E[4h,
+	smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m, tbc=\E[3g,
+	vpa=\E[%i%p1%dd, E3=\E[3J, use=ansi+pp, use=xterm+kbs,
+	use=xterm+alt+title, use=ansi+enq, use=att610+cvis,
+	use=xterm+meta,
+
+xterm+meta|meta mode for xterm,
+	km,
+	rmm=\E[?1034l, smm=\E[?1034h,
+
+# From: David J. MacKenzie <djm@va.pubnix.com>, 14 Nov 1997
+# In retrospect, something like xterm-r6 was intended here -TD
+xterm-xi|xterm on XI Graphics Accelerated X under BSD/OS 3.1,
+	rmso=\E[m, rmul=\E[m, use=xterm-xf86-v33,
+
+#### XTERM Colors
+
+# 16-colors is one of the variants of XFree86 3.3 xterm, updated for 4.0
+# (T.Dickey)
+#
+# If configured to support 88- or 256-colors (which is fairly common in 2009),
+# xterm also recognizes the control sequences for initc -TD
+xterm-16color|xterm with 16 colors like aixterm,
+	ccc,
+	initc=\E]4;%p1%d;rgb:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*
+	      %{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E\\,
+	use=xterm+osc104, use=ibm+16color, use=xterm-new,
+
+# 256-colors is a compile-time feature of XFree86 xterm beginning with
+# xterm patch #111 (1999/7/10) -TD
+xterm+256color|original xterm 256-color feature,
+	ccc,
+	colors#0x100, pairs#0x10000,
+	initc=\E]4;%p1%d;rgb:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*
+	      %{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E\\,
+	oc=\E]104\007,
+	setab=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;
+	      5;%p1%d%;m,
+	setaf=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5
+	      ;%p1%d%;m,
+	setb@, setf@,
+
+# The semicolon separator used in xterm+256color does not follow the ECMA-48
+# standard.  Since patch #282 (in 2012), xterm has supported both the legacy
+# subparameter separator (semicolon) and the standard (colon).
+#
+# The xterm FAQ gives some of the history:
+#	https://invisible-island.net/xterm/xterm.faq.html#color_by_number
+xterm+256color2|xterm 256-color feature,
+	setab=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48:
+	      5:%p1%d%;m,
+	setaf=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38:5
+	      :%p1%d%;m,
+	use=xterm+256color,
+
+# xterm OSC 104 resets the color palette.  Using it as part of xterm+256color
+# has the drawback that some of the xterm-alikes which use that building block
+# require a different approach to rs1 -TD
+xterm+osc104|reset color palette,
+	oc=\E]104\007, rs1=\Ec\E]104\007,
+
+# palette is hardcoded...
+xterm+256setaf|xterm 256-color (set-only),
+	ccc@,
+	colors#0x100, pairs#0x10000,
+	initc@, op=\E[39;49m,
+	setab=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;
+	      5;%p1%d%;m,
+	setaf=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5
+	      ;%p1%d%;m,
+	setb@, setf@,
+
+# 88-colors is a compile-time feature of XFree86 xterm beginning with
+# xterm patch #115 (1999/9/18) -TD
+#
+# Note that the escape sequences used are the same as for 256-colors - xterm
+# has a different table of default color resource values.  If built for
+# 256-colors, it can still handle an 88-color palette by using the initc
+# capability.
+#
+# At this time (2007/7/14), except for rxvt 2.7.x, none of the other terminals
+# which support the xterm+256color feature support the associated initc
+# capability.  So it is cancelled in the entries which use this and/or the
+# xterm+256color block.
+#
+# The default color palette for the 256- and 88-colors are different.  A
+# given executable will have one palette (perhaps compiled-in).  If the program
+# supports xterm's control sequence, it can be programmed using initc.
+xterm+88color|original xterm 88-color feature,
+	colors#88, pairs#7744, use=xterm+256color,
+
+xterm+88color2|xterm 88-color feature,
+	colors#88, pairs#7744, use=xterm+256color2,
+
+# These variants of XFree86 3.9.16 xterm are built as a configure option.
+xterm-256color|xterm with 256 colors,
+	use=xterm+osc104, use=xterm+256color, use=xterm-new,
+xterm-88color|xterm with 88 colors,
+	use=xterm+osc104, use=xterm+88color,
+	use=xterm-256color,
+
+# Emacs 26.1 and later support direct color mode in terminals, using a
+# combination of user-defined capabilities and ncurses-dependent function
+# calls.  We will not include that here.
+#
+# Here is a first revision, which (disregarding the reuse of colors 1-7 which
+# is of interest only to the numerically illiterate), is compatible with other
+# terminal descriptions written for curses.  It relies upon the extended range
+# for numeric capabilities provided in ncurses 6.1:
+xterm+direct2|xterm with direct-color indexing (old building-block),
+	RGB,
+	colors#0x1000000, pairs#0x10000, CO#8,
+	initc@, op=\E[39;49m,
+	setab=\E[%?%p1%{8}%<%t4%p1%d%e48:2:%p1%{65536}%/%d:%p1%{256}
+	      %/%{255}%&%d:%p1%{255}%&%d%;m,
+	setaf=\E[%?%p1%{8}%<%t3%p1%d%e38:2:%p1%{65536}%/%d:%p1%{256}
+	      %/%{255}%&%d:%p1%{255}%&%d%;m,
+	setb@, setf@,
+xterm-direct2|xterm with direct-color indexing (old),
+	use=xterm+direct2, use=xterm+titlestack, use=xterm,
+
+# That in turn had a problem: in the original patch submitted for KDE konsole
+# in 2006, the submitter and the developer alike overlooked a "color space
+# identifier" parameter.  This version provides for that parameter:
+xterm+direct|xterm with direct-color indexing (building-block),
+	RGB,
+	colors#0x1000000, pairs#0x10000, CO#8,
+	initc@, op=\E[39;49m,
+	setab=\E[%?%p1%{8}%<%t4%p1%d%e48:2::%p1%{65536}%/%d:%p1
+	      %{256}%/%{255}%&%d:%p1%{255}%&%d%;m,
+	setaf=\E[%?%p1%{8}%<%t3%p1%d%e38:2::%p1%{65536}%/%d:%p1
+	      %{256}%/%{255}%&%d:%p1%{255}%&%d%;m,
+	setb@, setf@,
+xterm-direct|xterm with direct-color indexing,
+	use=xterm+direct, use=xterm,
+
+# Here are corresponding flavors for terminals which could use the feature:
+iterm2-direct|iTerm2 with direct-color indexing,
+	use=xterm+direct, use=iterm2,
+mlterm-direct|mlterm with direct-color indexing,
+	use=xterm+direct, use=mlterm,
+
+# Meanwhile, in KDE #107487, the patch submitter and the developer both saw
+# that xterm's original implementation should have used colons for the
+# subparameter separators, but chose not to correct this in konsole.  As of
+# late 2017, konsole still accepts only the nonstandard semicolon delimiters.
+xterm+indirect|xterm with direct-color indexing (old legacy building-block),
+	RGB,
+	colors#0x1000000, pairs#0x10000,
+	initc@, op=\E[39;49m,
+	setab=\E[%?%p1%{8}%<%t4%p1%d%e48;2;%p1%{65536}%/%d;%p1%{256}
+	      %/%{255}%&%d;%p1%{255}%&%d%;m,
+	setaf=\E[%?%p1%{8}%<%t3%p1%d%e38;2;%p1%{65536}%/%d;%p1%{256}
+	      %/%{255}%&%d;%p1%{255}%&%d%;m,
+	setb@, setf@,
+konsole-direct|konsole with direct-color indexing,
+	use=xterm+indirect, use=konsole,
+st-direct|simpleterm with direct-color indexing,
+	use=xterm+indirect, use=st,
+vte-direct|VTE with direct-color indexing,
+	use=xterm+indirect, use=vte,
+# reportedly in Apple's Mohave (fall 2018), but untested -TD
+nsterm-direct|nsterm with direct-color indexing,
+	use=xterm+indirect, use=nsterm,
+
+# As for others (commenting at the time of release for ncurses 6.1):
+# + Apple's Terminal.app does not recognize either form of the direct-color
+#   sequences.
+# + Cygwin's mintty recognizes xterm's original implementation, does okay with
+#   the colors.  Like vte, it is a subset of xterm, although different
+#   omissions/reservations of modified-keys are seen in testing.
+# + PuTTY 0.70 seems to recognize xterm's original implementation but does
+#   nothing useful with the colors.
+# + Teraterm 4.97, like PuTTY (no good).
+# + terminology 0.91 recognizes xterm's original implementation, but does
+#   nothing useful with it.
+
+# Reviewing after ncurses 6.2:
+# + Apple's Terminal.app is unchanged, has no support for direct color:
+#	Catalina 10.15.5 Terminal.app 2.10 (433)
+#	Mohave 10.14.6 - Terminal.app 2.9.5 (421.2)
+# + Cygwin's mintty 3.1.7 works with colon/semicolon
+# + PuTTY 0.73 works with semicolon
+# + Teraterm 4.105 works with semicolon
+# + terminology 1.7.0 works with colon/semicolon.
+
+# Other variants are possible, e.g., by using more of xterm's indexed color
+# palette, though the intrusion of indexed colors on the direct-color space
+# would be more noticeable.
+
+xterm+direct16|xterm with direct-color indexing (16-color building-block),
+	CO#16,
+	setab=\E[%?%p1%{8}%<%t4%p1%d%e%?%p1%{16}%<%t%p1%{92}%+%d%e48
+	      :2::%p1%{65536}%/%d:%p1%{256}%/%{255}%&%d:%p1%{255}%&
+	      %d%;%;m,
+	setaf=\E[%?%p1%{8}%<%t3%p1%d%e%?%p1%{16}%<%t%p1%'R'%+%d%e38:
+	      2::%p1%{65536}%/%d:%p1%{256}%/%{255}%&%d:%p1%{255}%&%d
+	      %;%;m,
+	setb@, setf@, use=xterm+direct,
+
+xterm-direct16|xterm with direct-colors and 16 indexed colors,
+	use=xterm+direct16, use=xterm,
+
+xterm+direct256|xterm with direct-color indexing (256-color building-block),
+	CO#0x100,
+	setab=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e%?
+	      %p1%{256}%<%t48;5;%p1%d%e48:2::%p1%{65536}%/%d:%p1
+	      %{256}%/%{255}%&%d:%p1%{255}%&%d%;%;m,
+	setaf=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e%?
+	      %p1%{256}%<%t38;5;%p1%d%e38:2::%p1%{65536}%/%d:%p1
+	      %{256}%/%{255}%&%d:%p1%{255}%&%d%;%;m,
+	setb@, setf@, use=xterm+direct,
+
+xterm-direct256|xterm with direct-colors and 256 indexed colors,
+	use=xterm+direct256, use=xterm,
+
+#### XTERM Features
+
+# This chunk is based on suggestions by Ailin Nemui and Nicholas Marriott, who
+# asked for some of xterm's advanced features to be added to its terminfo
+# entry.  It defines extended capabilities not found in standard terminfo or
+# termcap.  These are useful in tmux, for instance, hence the name.
+#
+# One caveat in adding extended capabilities in ncurses is that if the names
+# are longer than two characters, then they will not be visible through the
+# termcap interface.
+#
+# Ms modifies the selection/clipboard.  Its parameters are
+#	p1 = the storage unit (clipboard, selection or cut buffer)
+#	p2 = the base64-encoded clipboard content.
+#
+# Ss is used to set the cursor style as described by the DECSCUSR
+#	function to a block or underline.
+# Se resets the cursor style to the terminal power-on default.
+#
+# Cs and Cr set and reset the cursor colour.
+xterm+tmux|advanced xterm features used in tmux (cursor style 2),
+	Cr=\E]112\007, Cs=\E]12;%p1%s\007,
+	Ms=\E]52;%p1%s;%p2%s\007, Se=\E[2 q, Ss=\E[%p1%d q,
+xterm+tmux2|advanced xterm features used in tmux,
+	Cr=\E]112\E\\, Cs=\E]12;%p1%s\E\\,
+	Ms=\E]52;%p1%s;%p2%s\E\\, Se=\E[ q, Ss=\E[%p1%d q,
+
+# This is another variant, for XFree86 4.0 xterm (T.Dickey)
+# This is an 8-bit version of xterm, which emulates DEC VT220 with ANSI color.
+# To use it, your decTerminalID resource must be set to 200 or above.
+#
+#	HTS	\E H	\210
+#	RI	\E M	\215
+#	SS3	\E O	\217
+#	CSI	\E [	\233
+#
+xterm-8bit|xterm terminal emulator 8-bit controls (X Window System),
+	OTbs, am, bce, km, mc5i, mir, msgr, npc, xenl, AX,
+	colors#8, cols#80, it#8, lines#24, pairs#64,
+	acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\2335m, bold=\2331m, cbt=\233Z,
+	civis=\233?25l, clear=\233H\2332J,
+	cnorm=\233?25l\233?25h, cr=\r, csr=\233%i%p1%d;%p2%dr,
+	cub=\233%p1%dD, cub1=^H, cud=\233%p1%dB, cud1=\n,
+	cuf=\233%p1%dC, cuf1=\233C, cup=\233%i%p1%d;%p2%dH,
+	cuu=\233%p1%dA, cuu1=\233A, cvvis=\233?12;25h,
+	dch=\233%p1%dP, dch1=\233P, dl=\233%p1%dM, dl1=\233M,
+	ech=\233%p1%dX, ed=\233J, el=\233K, el1=\2331K,
+	flash=\233?5h$<100/>\233?5l, home=\233H,
+	hpa=\233%i%p1%dG, ht=^I, hts=\210, ich=\233%p1%d@,
+	il=\233%p1%dL, il1=\233L, ind=\n, invis=\2338m,
+	is2=\E[62"p\E\sG\233m\233?7h\E>\E7\233?1;3;4;6l\2334l\233r
+	    \E8,
+	ka1=\217w, ka3=\217u, kb2=\217y, kbeg=\217E, kc1=\217q,
+	kc3=\217s, kcbt=\233Z, kcub1=\217D, kcud1=\217B,
+	kcuf1=\217C, kcuu1=\217A, kdch1=\2333~, kend=\2334~,
+	kent=\217M, kf1=\23311~, kf10=\23321~, kf11=\23323~,
+	kf12=\23324~, kf13=\23325~, kf14=\23326~, kf15=\23328~,
+	kf16=\23329~, kf17=\23331~, kf18=\23332~, kf19=\23333~,
+	kf2=\23312~, kf20=\23334~, kf3=\23313~, kf4=\23314~,
+	kf5=\23315~, kf6=\23317~, kf7=\23318~, kf8=\23319~,
+	kf9=\23320~, khome=\2331~, kich1=\2332~, kmous=\233M,
+	knp=\2336~, kpp=\2335~, mc0=\233i, mc4=\2334i, mc5=\2335i,
+	meml=\El, memu=\Em, op=\23339;49m, rc=\E8, rev=\2337m,
+	ri=\215, rmacs=\E(B, rmam=\233?7l, rmcup=\233?1049l,
+	rmir=\2334l, rmkx=\233?1l\E>, rmso=\23327m, rmul=\23324m,
+	rs1=\Ec,
+	rs2=\E[62"p\E\sG\233m\233?7h\E>\E7\233?1;3;4;6l\2334l\233r
+	    \E8,
+	sc=\E7, setab=\2334%p1%dm, setaf=\2333%p1%dm,
+	setb=\2334%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1
+	     %{6}%=%t3%e%p1%d%;m,
+	setf=\2333%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1
+	     %{6}%=%t3%e%p1%d%;m,
+	sgr=\2330%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?
+	    %p7%t;8%;m%?%p9%t\E(0%e\E(B%;,
+	sgr0=\2330m\E(B, smacs=\E(0, smam=\233?7h,
+	smcup=\233?1049h, smir=\2334h, smkx=\233?1h\E=,
+	smso=\2337m, smul=\2334m, tbc=\2333g, u6=\233[%i%d;%dR,
+	u8=\233[?%[;0123456789]c, vpa=\233%i%p1%dd,
+	use=ansi+enq, use=xterm+kbs,
+
+# Note: normally xterm supports modified function-keys as described in
+#	XTerm - "Other" modified keys
+#	https://invisible-island.net/xterm/modified-keys.html
+#
+# However, xterm-hp, xterm-sco and xterm-sun assume no modifiers.  Here is
+# a simple script which demonstrates these descriptions:
+#	#!/bin/sh
+#	export TERM=xterm-$1
+#	xterm \
+#		-kt $1 \
+#		-fs 16 -fa mono \
+#		-title $TERM \
+#		-tn $TERM \
+#		-xrm '*modifyCursorKeys:-1' \
+#		-xrm '*modifyFunctionKeys:-1' \
+#		-e tack
+# e.g., "foo sun" if the script is named "foo" -TD
+xterm-hp|xterm with hpterm function keys,
+	kclr=\EJ, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA,
+	kdch1=\EP, kend=\EF, khome=\Eh, kich1=\EQ, knp=\ES, kpp=\ET,
+	use=hp+pfk-cr, use=xterm+nofkeys, use=xterm+nopcfkeys,
+
+xterm-sco|xterm with SCO function keys,
+	kbeg=\E[E, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A,
+	kdch1=^?, kend=\E[F, kf1=\E[M, kf10=\E[V, kf11=\E[W,
+	kf12=\E[X, kf13=\E[Y, kf14=\E[Z, kf15=\E[a, kf16=\E[b,
+	kf17=\E[c, kf18=\E[d, kf19=\E[e, kf2=\E[N, kf20=\E[f,
+	kf21=\E[g, kf22=\E[h, kf23=\E[i, kf24=\E[j, kf25=\E[k,
+	kf26=\E[l, kf27=\E[m, kf28=\E[n, kf29=\E[o, kf3=\E[O,
+	kf30=\E[p, kf31=\E[q, kf32=\E[r, kf33=\E[s, kf34=\E[t,
+	kf35=\E[u, kf36=\E[v, kf37=\E[w, kf38=\E[x, kf39=\E[y,
+	kf4=\E[P, kf40=\E[z, kf41=\E[@, kf42=\E[[, kf43=\E[\\,
+	kf44=\E[], kf45=\E[\^, kf46=\E[_, kf47=\E[`, kf48=\E[{,
+	kf5=\E[Q, kf6=\E[R, kf7=\E[S, kf8=\E[T, kf9=\E[U, khome=\E[H,
+	kich1=\E[L, kmous=\E[>M, knp=\E[G, kpp=\E[I,
+	use=xterm+nofkeys,
+
+# The xterm-new description has all of the features, but is not completely
+# compatible with VT220.  If you are using a Sun or PC keyboard, set the
+# sunKeyboard resource to true:
+#	+ maps the editing keypad
+#	+ interprets control-function-key as a second array of keys, so a
+#	  12-fkey keyboard can support VT220's 20-fkeys.
+#	+ maps numeric keypad "+" to ",".
+#	+ uses DEC-style control sequences for the application keypad.
+#
+xterm-vt220|xterm emulating VT220,
+	npc,
+	kcbt=\E[Z, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
+	kend=\E[4~, kent=\EOM, kf10=\E[21~, kf11=\E[23~,
+	kf12=\E[24~, kf13=\E[25~, kf14=\E[26~, kf15=\E[28~,
+	kf16=\E[29~, kf17=\E[31~, kf18=\E[32~, kf19=\E[33~,
+	kf20=\E[34~, kf5=\E[15~, kf6=\E[17~, kf7=\E[18~,
+	kf8=\E[19~, kf9=\E[20~, khome=\E[1~, kich1=\E[2~,
+	kmous=\E[M, knp=\E[6~, kpp=\E[5~, nel=\EE, use=xterm+app,
+	use=xterm+edit, use=vt220+keypad, use=ecma+italics,
+	use=ecma+index, use=ansi+rep, use=ecma+strikeout,
+	use=xterm+sm+1006, use=xterm+tmux, use=xterm+keypad,
+	use=xterm-basic,
+
+xterm-vt52|xterm emulating DEC VT52,
+	cols#80, it#8, lines#24,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, clear=\EH\EJ, cr=\r, cub1=\ED, cud1=\EB, cuf1=\EC,
+	cup=\EY%p1%' '%+%c%p2%' '%+%c, cuu1=\EA, ed=\EJ, el=\EK,
+	home=\EH, ht=^I, ind=\n, kcub1=\ED, kcud1=\EB, kcuf1=\EC,
+	kcuu1=\EA, nel=\r\n, ri=\EI, rmacs=\EG, smacs=\EF,
+	use=xterm+kbs, use=vt52+keypad,
+
+xterm-noapp|xterm with cursor keys in normal mode,
+	rmcup@, rmkx=\E>, smcup@, smkx=\E=, use=xterm+noapp,
+	use=xterm,
+
+xterm-24|vs100|xterms|xterm terminal emulator 24-line (X Window System),
+	lines#24, use=xterm-old,
+
+# This is xterm for ncurses.
+xterm|xterm terminal emulator (X Window System),
+	use=xterm-new,
+
+# This entry assumes that xterm's handling of VT100 SI/SO is disabled by
+# setting the vt100Graphics resource to false.
+xterm-utf8|xterm with no VT100 line-drawing in UTF-8 mode,
+	U8#1, use=xterm,
+
+# These building-blocks allow access to the X titlebar and icon name as a
+# status line.  There are a few problems in using them in entries:
+#
+# a) tsl should have a parameter to denote the column on which to transfer to
+#    the status line.
+# b) the "0" code for xterm updates both icon-title and window title.  Some
+#    window managers such as twm (and possibly window managers descended from
+#    it such as tvtwm, ctwm, and vtwm) track windows by icon-name. Thus, you
+#    don't want to mess with icon-name when using those window managers.
+# c) fsl ends the escape sequence begun by tsl.  Printable characters between
+#    those (probably) will appear in the window title.  Nonprintable characters
+#    may cause the escape sequence to end with an error.
+# d) the BEL (^G or \007) used in the original title-as-statusline came from 
+#    David J. MacKenzie's "pseudo-color" entry in 20 Apr 1995.  At that time
+#    xterm used BEL as the string-terminator rather than ST (\E\\).  Either
+#    BEL or ST has worked since xterm patch #28 in 1996, but most uses of
+#    this feature have been embedded in shell scripts.
+#
+# But that issue regarding the parameter for tsl means that applications may
+# not rely on it.  The SVr4 documentation says tsl will "move to status line,
+# column #1".  At the point in time when ESR added DJM's "pseudo-color" entry
+# with the split-up escape sequence for tsl/fsl, there were 65 entries using
+# tsl:
+#    32 used a parameter, matching the documentation (including x10term).
+#    21 used a parameterless control, exiting from the status line on ^M.
+#     6 used parameterless controls for tsl and fsl
+#     6 used a split-up escape sequence, e.g., the same approach.
+#
+# The extension "TS" is preferable, because it does not accept a parameter.
+# However, if you are using a non-extended terminfo, "TS" is not visible.
+xterm+sl|access X title line and icon name,
+	hs,
+	dsl=\E]0;\007, fsl=^G, tsl=\E]0;, TS=\E]0;,
+xterm+sl-twm|access X title line (pacify twm-descended window managers),
+	hs,
+	dsl=\E]2;\007, fsl=^G, tsl=\E]2;, TS=\E]2;,
+xterm+sl-alt|alternate access X title line,
+	hs,
+	dsl=\E]2;\E\\, fsl=\E\\, tsl=\E]2;, TS=\E]2;,
+
+# In contrast, this block can be used for a DEC VT320 and up.  There are two
+# controls used.
+#
+# DECSASD (select active status display)
+#	\E[0$}	Main display
+#	\E[1$}	Status line
+#
+# DECSSDT (select status line type)
+#	\E[0$~	No status line
+#	\E[1$~	Indicator status line
+#	\E[2$~	Host-writable status line
+#
+# The building block assumes that the terminal always shows something at the
+# status line (either the indicator, or status line).  That is because if no
+# status line is used, then the terminal makes that line part of the user
+# window, changing its size without notice.
+#
+# Because there is no "esl" (enable status line) capability, the "tsl"
+# capability ensures that the status line is host-writable.  A DEC terminal
+# will clear the status line when changing from indicator to host-writable
+# mode.
+#
+# Once on the status line, the row part of cursor addressing is ignored.  Since
+# tsl expects a parameter (to specify the column), the shortest addressing that
+# can be used for this purpose is HPA, e.g., \E[5d to go to column 5.
+#
+dec+sl|DEC VTxx status line,
+	eslok, hs,
+	dsl=\E[0$~, fsl=\E[0$}, tsl=\E[2$~\E[1$}\E[%i%p1%d`,
+
+#
+# The following xterm variants don't depend on your base version
+#
+# xterm with bold instead of underline
+xterm-bold|xterm terminal emulator (X11R6 Window System) standout w/bold,
+	sgr=%?%p9%t\016%e\017%;B\E[0%?%p6%t;1%;%?%p2%t;1%;%?%p1%p3%|
+	    %t;7%;m,
+	smso=\E[7m, smul=\E[1m, use=xterm-old,
+
+# See the note on ICH/ICH1 VERSUS RMIR/SMIR near the end of file
+xterm-nic|xterm with ich/ich1 suppressed for non-curses programs,
+	ich@, ich1@, use=xterm,
+# From: Mark Sheppard <kimble@mistral.co.uk>, 4 May 1996
+xterm1|xterm terminal emulator ignoring the alternate screen buffer,
+	rmcup@, smcup@, use=xterm,
+
+# https://invisible-island.net/xterm/xterm-paste64.html
+#
+# Bracketed paste was introduced by xterm patch #203 in May 2005, as part of a
+# larger feature for manipulating the clipboard selection.  Few terminals aside
+# from xterm fully implement the clipboard feature, but several copy this
+# detail.  The names for the extended capabilities here were introduced by vim
+# in January 2017.
+bracketed+paste|xterm bracketed paste,
+	BD=\E[?2004l, BE=\E[?2004h, PE=\E[201~, PS=\E[200~,
+
+#### XTERM Mouse
+# The xterm mouse protocol is used by other terminal emulators.
+# In this section, two extended capabilities are used to illustrate the mouse
+# protocol: XM and xm.  The "XM" capability is recognized by ncurses to allow
+# enabling/disabling other mouse protocols.  The "xm" capability describes the
+# mouse response; currently there is no interpreter which would use this
+# information to make the mouse support completely data-driven.
+
+# Here is the "original" xterm mouse protocol.
+#
+# First seen in X10.3, February 1986, this likely dates from 1985 based on the
+# copyright dates in the sources.  A comment in charproc.c notes "MIT bogus
+# sequence", referring to the fact that it does not correspond to a "real"
+# terminal.  The mouse responses for the X10 protocol are sent only for
+# button-presses.
+xterm+x10mouse|X10 xterm mouse protocol,
+	kmous=\E[M, XM=\E[?9%?%p1%{1}%=%th%el%;,
+	xm=\E[M%p3%' '%+%c%p2%'!'%+%c%p1%'!'%+%c,
+xterm-x10mouse|X10 xterm mouse,
+	use=xterm+x10mouse, use=xterm,
+
+# Here is the conventional xterm mouse protocol, introduced with X11R1 in
+# September 1987.
+#
+# The mouse responses for the X11 protocol covered button releases, as well as
+# modifiers:
+#  shift    4
+#  alt/meta 8 (technically the "mod1" mask, because X11 has no such keys)
+#  control 16
+#
+# The modifiers are not reflected in this description because as used in xterm
+# they are normally inaccessible because the translations resources assign
+# shift and control to other features.  However, they are important because
+# they take up space in the first byte of the response.  The other bits of this
+# byte are used to encode the button number for both presses and releases.
+# In the X11 protocol, any button-release is encoded with "3" (the lowest 2
+# bits in the byte).  Later work on XFree86 xterm used the remaining 3 bits to
+# provide additional features, e.g., wheel mouse.
+#
+# X11R1's xterm also supported an "emacs" mouse protocol, with final character
+# "t" or "T", which was activated by double-clicking.  The "t" response was
+# used when the starting/ending positions were the same.
+#
+# X11R3 (February 1988) added the highlight/tracking mode.
+#
+# X11R4 (December 1989) added the control sequences document, listing the
+# control sequences for the X10/X11 protocols without descriptions.  It also
+# mentioned the "emacs" ("T") response.  Comments in button.c referred to the
+# X11 protocol as "DEC VT200 compatible", although DEC offered no such terminal.
+#
+# X11R5 (November 1993) gave a description of the mouse protocol.
+#
+# X11R6 (January 1995) moved the control sequences document out of the xterm
+# source-directory to xc/doc/specs/xterm, polishing the formatting but adding
+# no new information.
+xterm+x11mouse|X11 xterm mouse protocol,
+	kmous=\E[M, XM=\E[?1000%?%p1%{1}%=%th%el%;,
+	xm=\E[M%?%p4%t%p3%e%{3}%;%'\s'%+%c%p2%'!'%+%c%p1%'!'%+%c,
+xterm-x11mouse|X11 mouse,
+	use=xterm+x11mouse, use=xterm,
+
+# Here is a suggested description of the xterm highlighting protocol.
+# A more complicated example could be constructed to account for the "t"
+# response.
+xterm+x11hilite|X11 xterm mouse protocol with highlight,
+	kmous=\E[M, XM=\E[?1001%?%p1%{1}%=%th%el%;,
+	xm=\E[%p6%'!'%+%p5%'!'%+%c%p8%'!'%+%c%p7%'!'%+%c%p2%'!'%+%c
+	   %p1%'!'%+%cT,
+xterm-x11hilite|X11 mouse with highlight,
+	use=xterm+x11mouse, use=xterm,
+
+# The preceding were the sources from X Consortium.  Other sources (or patches)
+# were available.  Starting in mid-1995, XFree86 developers collected some of
+# those changes and began improvements, e.g., to support color.  This was, by
+# the way, around the same time that rxvt developers began implementing color,
+# though dates (and attributions) are not well documented.  I became interested
+# in xterm in late 1995, and involved in early 1996.  To complete the picture,
+# CDE's dtterm was introduced around the same time, with no mouse protocol -TD
+
+# xterm patch #83 (1998/10/7), added Jason Bacon's changes to provide an
+# "any-event" mouse mode.
+#
+# These building blocks incorporate later features as well:
+# xterm patch #224 (2007/2/11 added private mode 1004, for enabling/disabling
+# focus in/out event reporting.
+# xterm patch #277 (2012/01/07 added private mode 1006
+
+xterm+sm+1002|xterm any-button mouse,
+	kmous=\E[<, XM=\E[?1006;1004;1002%?%p1%{1}%=%th%el%;,
+	xm=\E[<%i%p3%d;%p1%d;%p2%d;%?%p4%tM%em%;,
+	use=xterm+focus,
+xterm-1002|example of xterm any-button mouse,
+	use=xterm+sm+1002, use=xterm,
+
+xterm+sm+1003|xterm any-event mouse,
+	XM=\E[?1006;1004;1003%?%p1%{1}%=%th%el%;,
+	use=xterm+sm+1002,
+xterm-1003|example of xterm any-event mouse,
+	use=xterm+sm+1003, use=xterm,
+
+xterm+focus|xterm focus-in/out event "keys",
+	kxIN=\E[I, kxOUT=\E[O,
+
+# xterm patch #116 (1999/9/25) added Stephen P Wall's changes to support DEC
+# locator mode.
+
+# xterm patch #120 (1999/10/28) added my change to support wheel mouse, by
+# dropping support for the X11 mouse protocol's shift-modifier and using
+# available bits in the first byte of the response to encode buttons 4 and 5.
+# xterm patch #126 (2000/2/8) amended that change to avoid conflicting with
+# older configurations which might have used the obsolete modifiers.
+
+# xterm patch #262 (2010/8/30) added Ryan Johnson's changes to provide a mode
+# where the coordinates in the mouse response would be encoded in UTF-8,
+# thereby extending the range of coordinates past 222=(255-33).  This is the
+# "1005" mouse mode.
+xterm+sm+1005|xterm UTF-8 mouse (building block),
+	kmous=\E[M, XM=\E[?1005;1000%?%p1%{1}%=%th%el%;,
+	xm=\E[M%?%p4%t3%e%p3%'\s'%+%c%;%p2%'!'%+%u%p1%'!'%+%u,
+xterm-1005|xterm UTF-8 mouse,
+	use=xterm+sm+1005, use=xterm,
+
+# xterm patch #277 (2012/1/7) provides a mode where the mouse response uses
+# SGR-style parameters.
+#
+# Someone stated that the 1005 mouse mode would not be handled properly in luit.
+# (By the way, this is a problem with the X11 protocol).  A more plausible
+# criticism is that the responses provided by the 1005 mode are not distinct
+# from the non-1005 responses.
+#
+# As an alternative (and fixing the longstanding limitation of X11 mouse
+# protocol regarding button-releases), I provided the 1006 mode, referring
+# to it as "SGR 1006" since the replies resemble the SGR control string:
+xterm+sm+1006|xterm SGR-mouse (building block),
+	kmous=\E[<, XM=\E[?1006;1000%?%p1%{1}%=%th%el%;,
+	xm=\E[<%i%p3%d;%p1%d;%p2%d;%?%p4%tM%em%;,
+xterm-1006|xterm SGR-mouse,
+	use=xterm+sm+1006, use=xterm,
+
+#### KTERM
+# (kterm: this had extension capabilities ":KJ:TY=ascii:" -- esr)
+# (kterm should not invoke DEC Graphics as the alternate character set
+#  -- Kenji Rikitake)
+# (proper setting of enacs, smacs, rmacs makes kterm to use DEC Graphics
+#  -- MATSUMOTO Shoji)
+# kterm implements acsc via built-in table of X Drawable's
+kterm|kterm kanji terminal emulator (X window system),
+	XT,
+	ncv@,
+	acsc=``aajjkkllmmnnooppqqrrssttuuvvwwxx~~,
+	csr=\E[%i%p1%d;%p2%dr, enacs=, kmous=\E[M, rc=\E8,
+	rmacs=\E(B, rmam=\E[?7l, sc=\E7,
+	sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;m%?%p9%t\E(0%e
+	    \E(B%;,
+	sgr0=\E[m\E(B, smacs=\E(0, smam=\E[?7h, use=x10term+sl,
+	use=xterm-r6, use=ecma+color,
+kterm-color|kterm-co|kterm with ANSI colors,
+	ncv@, use=kterm, use=ecma+color,
+
+#### Other XTERM
+
+# These (xtermc and xtermm) are distributed with Solaris.  They refer to a
+# variant of xterm which is apparently no longer supported, but are interesting
+# because they illustrate SVr4 curses mouse controls - T.Dickey
+xtermm|xterm terminal emulator (monochrome),
+	OTbs, am, km, mir, msgr, xenl,
+	btns#3, cols#80, it#8, lines#24,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink@, bold=\E[1m, clear=\E[H\E[2J, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=\E[D,
+	cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M, ed=\E[J,
+	el=\E[K, el1=\E[1K$<3>, enacs=\E(B\E)0, getm=\E[%p1%dY,
+	home=\E[H, ht=^I, hts=\EH, ich=\E[%p1%d@, ich1=\E[@,
+	il=\E[%p1%dL, il1=\E[L, ind=\n, kbs=^H, kcub1=\EOD,
+	kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kend=\E[Y, kf0=\EOy,
+	kf10=\EOY, kf11=\EOZ, kf12=\EOA, kf5=\EOT, kf6=\EOU,
+	kf7=\EOV, kf8=\EOW, kf9=\EOX, khome=\E[H, kmous=\E[^_,
+	knp=\E[U, kpp=\E[V, rc=\E8, reqmp=\E[492Z, rev=\E[7m, ri=\EM,
+	rmacs=^O, rmcup=\E@0\E[?4r, rmso=\E[m,
+	rs1=\E>\E[1;3;4;5;6l\E[?7h\E[m\E[r\E[2J\E[H,
+	rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, sc=\E7,
+	sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5
+	    %;m%?%p9%t\016%e\017%;,
+	sgr0=\E[m\017, smacs=^N, smcup=\E@0\E[?4s\E[?4h\E@1,
+	smso=\E[7m, tbc=\E[3g, use=decid+cpr, use=vt100+fnkeys,
+
+xtermc|xterm terminal emulator (color),
+	colors#8, ncv#7, pairs#64,
+	op=\E[100m, setab=\E[4%p1%dm, setaf=\E[3%p1%dm,
+	setb=\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}
+	     %=%t3%e%p1%d%;m,
+	setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}
+	     %=%t3%e%p1%d%;m,
+	use=xtermm,
+
+# From: David J. MacKenzie <djm@va.pubnix.com> 20 Apr 1995
+# Here's a termcap entry I've been using for xterm_color, which comes
+# with BSD/OS 2.0, and the X11R6 contrib tape too I think.  Besides the
+# color stuff, I also have a status line defined as the window manager
+# title bar. [I have translated it to terminfo -- ESR]
+xterm-pcolor|xterm with color used for highlights and status line,
+	wsl#40,
+	bold=\E[1;43m, rev=\E[7;34m,
+	sgr=%?%p9%t\016%e\017%;\E[0%?%p6%t;1;43%;%?%p2%t;4;42%;%?%p1
+	    %t;7;31%;%?%p3%t;7;34%;m,
+	smso=\E[7;31m, smul=\E[4;42m, use=xterm+sl, use=xterm-r6,
+
+# This describes the capabilities of color_xterm, an xterm variant from
+# before ECMA-48 color support was folded into the main-line xterm release.
+# This entry is straight from color_xterm's maintainer.
+# From: Jacob Mandelson <jlm@ugcs.caltech.edu>, 09 Nov 1996
+# The README's with the distribution also say that it supports SGR 21, 24, 25
+# and 27, but they are not present in the terminfo or termcap.
+color_xterm|cx|cx100|color_xterm color terminal emulator for X,
+	OTbs, am, km, mir, msgr, xenl, XT,
+	cols#80, it#8, lines#65, ncv@,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, bold=\E[1m, clear=\E[H\E[2J, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M, ed=\E[J,
+	el=\E[K, el1=\E[1K, enacs=\E(B\E)0, home=\E[H, ht=^I,
+	ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[L, ind=\n,
+	is1=\E[r\E[m\E[?7h\E[?4;6l\E[4l, kbs=^H, kcub1=\EOD,
+	kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kend=\E[8~, kf1=\E[11~,
+	kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf2=\E[12~,
+	kf3=\E[13~, kf4=\E[14~, kf5=\E[15~, kf6=\E[17~, kf7=\E[18~,
+	kf8=\E[19~, kf9=\E[20~, khome=\E[7~, kich1=\E[2~,
+	kmous=\E[M, knp=\E[6~, kpp=\E[5~, rc=\E8, rev=\E[7m, ri=\EM,
+	rmacs=^O, rmam=\E[?7l, rmcup=\E>\E[?41;1r, rmir=\E[4l,
+	rmso=\E[27m, rmul=\E[24m,
+	rs1=\E(B\017\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l\E<,
+	sc=\E7,
+	sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5
+	    %;m%?%p9%t\016%e\017%;,
+	sgr0=\E[0m\017, smacs=^N, smam=\E[?7h,
+	smcup=\E[?1;41s\E[?1;41h\E=, smir=\E[4h, smso=\E[7m,
+	smul=\E[4m, use=decid+cpr, use=ecma+color,
+	use=vt220+keypad,
+
+# The IRAF source has a terminfo using "xterm-r5", but line-drawing does not
+# work in that case.  This entry uses xterm+acs, to work around that problem.
+#
+# Home/end keys do not work, due to a bug in the X Consortium xterm on which
+# this is based:
+#
+#	https://invisible-island.net/xterm/xterm.faq.html#bug_xterm_r6
+#
+# Comparing to the X11R5 source, xgterm has dynamic and ANSI colors (probably
+# not bce).  It interchanges mouse buttons 2/3 for menus.
+#
+# It also has a few features found in later versions of xterm:
+# - vi-button and dired-button,
+# - i18n stuff like X11R6.
+# - colorBD, colorUL
+# - scrollBarRight
+#
+# Debian provides a package for xgterm (and iraf).  Although the source for
+# xgterm implements the control-sequences for ANSI color, the packaged xgterm
+# does nothing with those, even after installing the app-defaults file which
+# was overlooked by the Debian packager.
+xgterm|graphic terminal for IRAF,
+	use=xterm+acs, use=xterm-r5, use=xterm+keypad,
+
+# The 'nxterm' distributed with Redhat Linux 5.2 is a slight rehack of
+# xterm-sb_right-ansi-3d, which implements ANSI colors, but does not support
+# SGR 39 or 49.  SGR 0 does reset colors (along with everything else).  This
+# description is "compatible" with color_xterm, rxvt and XFree86 xterm, except
+# that each of those implements the home, end, delete keys differently.
+#
+# Redhat Linux 6.x distributes XFree86 xterm as "nxterm", which uses bce
+# colors; note that this is not compatible with the 5.2 version.
+# csw (2002-05-15): make xterm-color primary instead of nxterm, to
+#   match XFree86's xterm.terminfo usage and prevent circular links
+xterm-color|nxterm|generic color xterm,
+	ncv@,
+	op=\E[m, use=xterm-r6, use=klone+color,
+
+# This entry describes an xterm with Sun-style function keys enabled
+# via the X resource setting "xterm*sunFunctionKeys:true"
+# To understand <kf11>/<kf12> note that L1,L2 and F11,F12 are the same.
+# The <kf13>...<kf20> keys are L3-L10.  We don't set <kf16=\E[197z>
+# because we want it to be seen as <kcpy>.
+# The <kf31>...<kf45> keys are R1-R15.  We treat some of these in accordance
+# with their Sun keyboard labels instead.
+# From: Simon J. Gerraty <sjg@zen.void.oz.au> 10 Jan 1996
+xterm-sun|xterm with sunFunctionKeys true,
+	kb2=\E[218z, kcpy=\E[197z, kcub1=\EOD, kcud1=\EOB,
+	kcuf1=\EOC, kcuu1=\EOA, kdch1=\E[3z, kend=\E[220z,
+	kent=\EOM, kf1=\E[224z, kf10=\E[233z, kf11=\E[192z,
+	kf12=\E[193z, kf13=\E[194z, kf14=\E[195z, kf15=\E[196z,
+	kf17=\E[198z, kf18=\E[199z, kf19=\E[200z, kf2=\E[225z,
+	kf20=\E[201z, kf3=\E[226z, kf31=\E[208z, kf32=\E[209z,
+	kf33=\E[210z, kf34=\E[211z, kf35=\E[212z, kf36=\E[213z,
+	kf38=\E[215z, kf4=\E[227z, kf40=\E[217z, kf42=\E[219z,
+	kf44=\E[221z, kf45=\E[222z, kf46=\E[234z, kf47=\E[235z,
+	kf5=\E[228z, kf6=\E[229z, kf7=\E[230z, kf8=\E[231z,
+	kf9=\E[232z, kfnd=\E[200z, khlp=\E[196z, khome=\E[214z,
+	kich1=\E[2z, knp=\E[222z, kpp=\E[216z, kund=\E[195z,
+	use=xterm+nofkeys, use=xterm+nopcfkeys,
+xterms-sun|small (80x24) xterm with sunFunctionKeys true,
+	cols#80, lines#24, use=xterm-sun,
+
+#### GNOME (VTE)
+# this describes the alpha-version of GNOME terminal shipped with Redhat 6.0
+gnome-rh62|GNOME terminal,
+	bce,
+	kdch1=^?, kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS,
+	use=xterm-color,
+
+# GNOME Terminal 1.4.0.4 (Redhat 7.2)
+#
+# This implements a subset of VT102 with a random selection of features from
+# other terminals such as color and function-keys.
+#
+# shift-f1 to shift-f10 are f11 to f20
+#
+# NumLock changes the application keypad to approximate VT100 keypad, except
+# that there is no escape sequence matching comma (,).
+#
+# Other defects observed:
+#	vt100 LNM mode is not implemented.
+#	vt100 80/132 column mode is not implemented.
+#	vt100 DECALN is not implemented.
+#	vt100 DECSCNM mode is not implemented, so flash does not work.
+#	vt100 TBC (tab reset) is not implemented.
+#	xterm alternate screen controls do not restore cursor position properly
+#	it hangs in tack after running function-keys test.
+gnome-rh72|GNOME Terminal in RedHat 7,
+	bce, km@,
+	kdch1=\E[3~, kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS,
+	rmam=\E[?7l,
+	sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;m%?%p9%t\016%e
+	    \017%;,
+	sgr0=\E[0m\017, smam=\E[?7h, tbc@, use=vt220+cvis,
+	use=xterm-color,
+
+# GNOME Terminal 2.0.1 (Redhat 8.0)
+#
+# Documentation now claims it implements VT220 (which is demonstrably false).
+# However, it does implement ECH, which is a VT220 feature.  And there are
+# workable VT100 LNM, DECALN, DECSNM modes, making it possible to display
+# more of its bugs using vttest.
+#
+# However, note that bce and msgr are broken in this release.  Tabs (tbc and
+# hts) are broken as well.  Sometimes flash (as in xterm-new) works.
+#
+# kf1 and kf10 are not tested since they're assigned (hardcoded?) to menu
+# operations.  Shift-tab generates a distinct sequence so it can be argued
+# that it implements kcbt.
+gnome-rh80|GNOME Terminal in RedHat 8,
+	bce@, msgr@,
+	ech=\E[%p1%dX, flash=\E[?5h$<100/>\E[?5l, kbs=^?,
+	kcbt=\E^I, op=\E[39;49m, use=gnome-rh72,
+
+# GNOME Terminal 2.2.1 (Redhat 9.0)
+#
+# bce and msgr are repaired.
+gnome-rh90|GNOME Terminal in RedHat 9,
+	bce, msgr, XT,
+	hpa=\E[%i%p1%dG, kDC=\E[3;2~, kLFT=\EO2D, kRIT=\EO2C,
+	kb2=\E[E, kcbt=\E[Z, kend=\EOF, khome=\EOH, tbc=\E[3g,
+	vpa=\E[%i%p1%dd, use=xterm+pcf0, use=xterm+pcfkeys,
+	use=gnome-rh80,
+
+# GNOME Terminal 2.14.2 (Fedora Core 5)
+# Ed Catmur notes that gnome-terminal has recognized soft-reset since May 2002.
+gnome-fc5|GNOME Terminal in Fedora Core 5,
+	rs1=\Ec,
+	rs2=\E7\E[r\E8\E[m\E[?7h\E[!p\E[?1;3;4;6l\E[4l\E>\E[?1000l
+	    \E[?25h,
+	use=ansi+enq, use=xterm+pcc0, use=gnome-rh90,
+
+# GNOME Terminal 2.18.1 (2007 snapshot)
+#
+# For any "recent" version of gnome-terminal, it is futile to attempt to
+# support modifiers on cursor- and keypad keys because the program usually
+# is hardcoded to set $TERM to "xterm", and on startup, it builds a subset
+# of the keys (which more/less correspond to the termcap values), and will
+# interpret those according to the $TERM value, but others not in the
+# terminfo according to some constantly changing set of hacker guidelines -TD
+vte-2007|VTE in GNOME Terminal snapshot 2.18.1,
+	use=xterm+pcc2, use=vt220+cvis, use=gnome-fc5,
+gnome-2007|GNOME Terminal snapshot 2.18.1,
+	use=vte-2007,
+
+# GNOME Terminal 2.22.3 (2008 snapshot)
+#
+# In vttest, it claims to be a VT220 with national replacement character-sets,
+# but aside from the identifier string, implements only a small fraction of
+# VT220's behavior, which will make it less usable on a VMS system (unclear
+# what the intent of the developer is, since the NRC feature exposed in vttest
+# by this change does not work).
+vte-2008|VTE in GNOME Terminal snapshot 2.22.3,
+	use=vte+pcfkeys, use=vte-2007,
+gnome-2008|GNOME Terminal snapshot 2.22.3,
+	use=vte-2008,
+
+# GNOME Terminal 3.6.0 (2012)
+# VTE 0.34.1 was marked in git 2012-10-15 (three days after patch was applied
+# in ncurses).  It inherited from gnome-fc5, which broke the modified forms
+# of f1-f4 -TD
+#
+# Testing with tack shows that flash does not/has not worked -TD
+vte-2012|VTE 0.34.1,
+	ncv#16,
+	dim=\E[2m, flash@, invis=\E[8m, rmso=\E[27m, rmul=\E[24m,
+	sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p5%t;2%;%?%p7%t;8%;%?%p1%p3
+	    %|%t;7%;m%?%p9%t\016%e\017%;,
+	use=ecma+italics, use=vte-2008,
+# Version 3.6.1 sets TERM to xterm-256color (still hardcoded), which has
+# 61 differences from a correct entry for gnome terminal.
+gnome-2012|GNOME Terminal 3.6.0,
+	use=vte-2012,
+
+# Before 2008, GNOME terminal could automatically use the contents of the
+# "xterm" terminfo to supply key information which is not built into the
+# program.  With 2.22.3, this list was built into the program (which addressed
+# the inadvertent use of random terminfo data, though using a set of values
+# which did not correspond to any that xterm produced - still not solving the
+# problem that GNOME terminal hardcoded the $TERM variable as "xterm").
+#
+#	terminfo	modifier	code	keys
+#	kf13-kf24	shift		2	F1 to F12
+#	kf25-kf36	control		5	F1 to F12
+#	kf37-kf48	shift/control	6	F1 to F12
+#	kf49-kf60	alt		3	F1 to F12
+#	kf61-kf63	shift-alt	4	F1 to F3
+#
+# The parameters with \EO (SS3) are technically an error, since SS3 should have
+# no parameters.  This appears to be rote copying based on xterm+pcc0.
+vte+pcfkeys|VTE's variation on xterm+pcfkeys (building block),
+	kf1=\EOP, kf13=\EO1;2P, kf14=\EO1;2Q, kf15=\EO1;2R,
+	kf16=\EO1;2S, kf2=\EOQ, kf25=\EO1;5P, kf26=\EO1;5Q,
+	kf27=\EO1;5R, kf28=\EO1;5S, kf3=\EOR, kf37=\EO1;6P,
+	kf38=\EO1;6Q, kf39=\EO1;6R, kf4=\EOS, kf40=\EO1;6S,
+	kf49=\EO1;3P, kf50=\EO1;3Q, kf51=\EO1;3R, kf52=\EO1;3S,
+	kf61=\EO1;4P, kf62=\EO1;4Q, kf63=\EO1;4R,
+	use=xterm+pcfkeys,
+gnome+pcfkeys|GHOME Terminal's variation on xterm+pcfkeys (building block),
+	use=vte+pcfkeys,
+
+# deprecated - use "vte" for newer versions
+gnome|GNOME Terminal,
+	use=vte-2012,
+gnome-256color|GNOME Terminal with xterm 256-colors,
+	use=xterm+256color, use=gnome,
+
+# relevant changes were made in January 2014, and later.
+#
+# Originally VTE was promoted as a library able to emulate any terminal by
+# reading its terminal description.  In practice, that never got beyond the
+# ability to read definitions of special keys (function-, editing-, cursor).
+#
+# Before 2014, VTE had a termcap reader (originally pointing to a private copy
+# of a termcap file derived from xterm).  That was incomplete because it did
+# not have any of the modifier-key information used for xterm's function-,
+# editing-, and cursor-keys.  Having its own reader was unnecessary since
+# ncurses provides that information; used since xterm patch #225 in 2007.
+#
+# During April/May 2014, a few bug reports (e.g., gnome #169295, gnome #728900,
+# gnome #730137) dealt with attempts to recast that termcap reader as library
+# calls, then attempting to adapt a chunk of code from ncurses (src/vteti.c),
+# abandoning that and finally constructing a table to match xterm's default
+# behavior, e.g., for "xterm+pcfkeys".
+vte-2014|VTE 0.35.1,
+	ncv@,
+	cbt=\E[Z, el1=\E[1K, flash=\E[?5h$<100/>\E[?5l,
+	ich=\E[%p1%d@, kent=\EOM, use=ecma+index,
+	use=xterm+sm+1006, use=xterm+pcfkeys, use=vte-2012,
+	use=bracketed+paste,
+
+# As of January 2018, this was the  most recent release,
+# e.g., with gnome-terminal 3.26.2
+vte-2017|VTE 0.50.2,
+	use=ecma+strikeout, use=vte-2014,
+
+# VTE 0.51.2 and gnome-terminal 3.28.2 copied a feature from KovId's TTY
+# late in 2017 for changing the appearance of underlines, which was
+# incorporated into Debian and Fedora testing-packages in February and March
+# 2018, respectively. Overline (Smol/Rmol) has been supported since December
+# 2017.
+vte-2018|VTE 0.51.2,
+	AX,
+	blink=\E[5m, enacs=\E(B\E)0, nel=\EE,
+	rep=%p1%c\E[%p2%{1}%-%db,
+	sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p4%t;5%;%?%p5%t;2%;%?%p7%t;
+	    8%;%?%p1%p3%|%t;7%;m%?%p9%t\016%e\017%;,
+	Rmol=\E[55m, Se=\E[1 q, Smol=\E[53m, Smulx=\E[4:%p1%dm,
+	use=xterm+alt+title, use=xterm+tmux, use=kitty+setal,
+	use=vte-2017,
+
+# Summarizing as of March 2022, these terminfo-capabilities of xterm are
+# absent from VTE:
+# - DEC application keypad mode
+# - DEC-compatible status-line
+# - DEC left/right margin support
+# - DEC printer controls
+# - AT&T cursor-blinking
+# - meta mode, as documented in terminfo(5)
+# - xterm's extension to clear scrollback
+vte|VTE aka GNOME Terminal,
+	use=vte-2018,
+
+vte-256color|VTE with xterm 256-colors,
+	use=xterm+256color, use=vte,
+
+# XFCE Terminal 0.2.5.4beta2
+#
+# This is based on some of the same source code, e.g., the VTE library, as
+# gnome-terminal, but has fewer features, fails more screens in vttest.
+# Since most of the terminfo-related behavior is due to the VTE library,
+# the terminfo is the same as gnome-terminal.
+xfce|Xfce Terminal,
+	use=vte-2008,
+
+# HTERM
+#
+# https://hterm.org
+#
+# A terminal written in JavaScript, which can provide xterm-like terminal
+# emulation in a browser such as Google Chrome, or in Chome OS.
+#
+# https://chromium.googlesource.com/apps/libapps/+/master/nassh/doc/FAQ.md
+#
+# Tested with Secure Shell App version 0.39 in Chrome 89.0.4389.90, found that
+# the numeric keypad escapes are missing -TD
+hterm|Chromium hterm,
+	npc,
+	U8#1,
+	kcbt=\E[Z, kent=\EOM, nel=\EE, use=xterm+osc104,
+	use=ecma+index, use=ansi+rep, use=ecma+strikeout,
+	use=vt420+lrmm, use=xterm+sm+1006, use=xterm+tmux,
+	use=ecma+italics, use=xterm+pcfkeys, use=xterm-basic,
+	use=bracketed+paste,
+hterm-256color|Chromium hterm with xterm 256-colors,
+	use=xterm+256color2, use=hterm,
+
+# TERMITE
+#
+# https://github.com/thestinger/termite
+#
+# A review requires install of Arch Linux since Fedora and Debian don't have
+# this program.  It uses "vte3-ng" (a conflicting package), which is here:
+#	https://github.com/thestinger/vte-ng
+# which (based on the default branch setting) seems to be a fork of vte
+# 0.48.2, and is noted as such in Arch:
+#	https://aur.archlinux.org/packages/vte3-ng/
+# It won't be merged:
+#	https://bugzilla.gnome.org/show_bug.cgi?id=679658#c10
+#	https://bugzilla.gnome.org/show_bug.cgi?id=78291
+# but perhaps made obsolete.
+#
+# The entry as given was mislabeled "xterm-termite" (it is not xterm), and
+# was mostly cut/paste from xterm-256color, but since VTE does not actually
+# implement several of the features in that terminal description, this one is
+# trimmed to eliminate those.  Also, since it is a slightly older version of
+# VTE, it lacks a few more features (again, trimmed).
+termite|VTE-based terminal,
+	am, ccc, km, mir, msgr, npc, xenl,
+	cols#80, it#8, lines#24, ncv@,
+	acsc=++\,\,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxy
+	     yzz{{||}}~~,
+	bel=^G, bold=\E[1m, cbt=\E[Z, clear=\E[H\E[2J, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	dch=\E[%p1%dP, ech=\E[%p1%dX, ed=\E[J, el=\E[K, el1=\E[1K,
+	flash=\E[?5h$<100/>\E[?5l, home=\E[H, hpa=\E[%i%p1%dG,
+	ht=^I, hts=\EH, ind=\n, invis=\E[8m,
+	is2=\E[!p\E[?3;4l\E[4l\E>, kb2=\EOE, kbs=^?, kcbt=\E[Z,
+	kent=\EOM, kmous=\E[M, rc=\E8, rev=\E[7m, ri=\EM, rmacs=\E(B,
+	rmam=\E[?7l, rmkx=\E[?1l\E>, rmso=\E[27m, rmul=\E[24m,
+	rs1=\Ec, rs2=\E[!p\E[?3;4l\E[4l\E>, sc=\E7,
+	sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|
+	    %t;7%;%?%p7%t;8%;m,
+	sgr0=\E(B\E[m, smacs=\E(0, smam=\E[?7h, smkx=\E[?1h\E=,
+	smso=\E[7m, smul=\E[4m, tbc=\E[3g, vpa=\E[%i%p1%dd,
+	use=xterm+alt1049, use=ecma+index, use=ansi+idc,
+	use=ansi+idl, use=ansi+enq, use=ecma+italics,
+	use=xterm+256color, use=ecma+color, use=vt220+cvis,
+	use=xterm+pcfkeys, use=xterm+sl-twm,
+
+#### Other GNOME
+# Multi-GNOME-Terminal 1.6.2
+#
+# This does not use VTE, and does have different behavior (compare xfce and
+# gnome).
+mgt|Multi GNOME Terminal,
+	use=ecma+index, use=xterm-xf86-v333,
+
+#### KDE
+# This is kvt 0-18.7, shipped with Redhat 6.0 (though whether it supports bce
+# or not is debatable).
+kvt|KDE terminal,
+	bce, km@,
+	kdch1=^?, kend=\E[F, khome=\E[H, use=xterm-color,
+
+# Konsole 1.0.1 (2001/11/25)
+# (formerly known as kvt)
+#
+# This program hardcodes $TERM to 'xterm', which is not accurate.  However, to
+# simplify this entry (and point out why konsole isn't xterm), we base this on
+# xterm-r6.  The default keyboard appears to be 'linux'.
+#
+# Notes:
+# a) konsole implements several features from XFree86 xterm, though none of
+#    that is documented - except of course in its source code - apparently
+#    because its implementors are unaccustomed to reading documentation - as
+#    evidenced by the sparse and poorly edited documentation distributed with
+#    konsole.  Some features such as the 1049 private mode are recognized but
+#    incorrectly implemented as a duplicate of the 47 private mode.
+# b) even with the "vt100 (historical)" keyboard setting, the numeric keypad
+#    sends PC-style escapes rather than VT100.
+# c) fails vttest menu 3 (Test of character sets) because it does not properly
+#    parse some control sequences.  Also fails vttest Primary Device Attributes
+#    by sending a bogus code (in the source it says it's supposed to be a
+#    VT220, which is doubly incorrect because it does not implement VT220
+#    control sequences except for a few special cases).  Treat it as a
+#    mildly-broken VT102.
+#
+# Update for konsole 1.3.2:
+#    The 1049 private mode works (but see the other xterm screens in vttest).
+#    Primary Device Attributes now returns the code for a VT100 with advanced
+#    video option.  Perhaps that's intended to be a "mildly-broken Vt102".
+#
+# Updated for konsole 1.6.4:
+#    add konsole-solaris
+#
+# Updated for konsole 1.6.6:
+#    add control-key modifiers for function-keys, etc.
+#
+# Updated for konsole 2.3 (October 2008):
+#    vttest menu 1 shows that both konsole and gnome terminal do wrapping
+#    different from xterm (and VT100's).  They have the same behavior in
+#    this detail, but it is unclear which copies the other.
+#
+# Deferred update for konsole 2.10 (late 2012):
+#    add SGR 1006 mouse
+#
+# Updated for konsole 2.12.4 (late 2013):
+#    add sitm/ritm
+#
+# Updated for konsole 16.07 (mid 2016):
+#    add dim, invis, strikeout
+#    (also overline, which is too rarely used to provide as an extension)
+#
+# Updated for konsole 17.12.0 (late 2017):
+#
+# Re-enable "bel", since it is latent in the source-code even though KDE config
+# often hides the feature (2020/5/30)
+konsole-base|KDE console window (common),
+	bce, km@, npc, XT,
+	ncv@,
+	blink=\E[5m, dim=\E[2m, ech=\E[%p1%dX,
+	flash=\E[?5h$<100/>\E[?5l, hpa=\E[%i%p1%dG,
+	invis=\E[8m, kbs=^?, kdch1=\E[3~, kend=\E[4~, kf1@, kf10@,
+	kf11@, kf12@, kf13@, kf14@, kf15@, kf16@, kf17@, kf18@, kf19@, kf2@,
+	kf20@, kf3@, kf4@, kf5@, kf6@, kf7@, kf8@, kf9@, kfnd@, khome=\E[1~,
+	kslt@, rmam=\E[?7l, rmso=\E[27m, rmul=\E[24m, rs1=\Ec,
+	rs2=\E7\E[r\E8\E[m\E[?7h\E[?1;3;4;6l\E[4l\E>\E[?1000l\E[?25h,
+	sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?
+	    %p5%t;2%;%?%p7%t;8%;m%?%p9%t\016%e\017%;,
+	sgr0=\E[0m\017, smam=\E[?7h, vpa=\E[%i%p1%dd,
+	use=ecma+index, use=xterm+sm+1006, use=ecma+strikeout,
+	use=ecma+italics, use=ecma+color, use=xterm-r6,
+	use=vt220+cvis, use=bracketed+paste,
+
+# The keytab feature was introduced in 0.9.12 (February 2000) with "linux" and
+# "vt100" key-table files along with a compiled-in default key-table.
+#
+# The main difference between the two keytabs was that the developer equated
+# "vt100" with xterm, and noticed that the Linux console's F1-F5 differed from
+# that.  For the same reason, the home/end keys differ.  A VT100 had none of
+# that.  The otherwise identical keytabs have definitions to model the VT52
+# cursor-keys and the VT100 cursor-keys with application versus normal modes.
+#
+# An "x11r5" keytab (displayed in the menu as "X11 R5") was added in January
+# 2001, and shortly after retitled to "XFree 3.x.x".  Both it and "vt100" were
+# dropped from the install in June 2008.
+#
+# The default keytab added in January 2000 was originally titled "X11 R6",
+# and likewise retitled to "XFree 4".
+#
+# A "solaris" keytab was added in Febrary 2005, copying the "vt100" keytab
+# and changing backspace to ^H, removing that keytab's attempt to model the
+# VT100 keypad and VT52 (KDE #20459).
+#
+# The developers made changes to the default and linux keytabs.  Comparing
+# the original and 2018 versions using diffstat:
+#	default: 119 added, 147 deleted, 28 unchanged
+#	linux:   47 added, 28 deleted, 104 unchanged
+#
+# Most of the change for the default keytab was to make konsole act more like
+# xterm.  That was a feature named AnyMod which came in May 2005 for KDE #92749
+# (see also Redhat #122815).  Later, in June 2007 the compiled-in keytab was
+# made an external file (like "linux" and "solaris"), and some further
+# refinement made.  But there are still flaws in the scheme.
+#
+# Essentially AnyMod maps the xterm "PC-style" modifier codes such as 2 for
+# Shift into a placeholder in the table entries.  That works well if all of the
+# modified keys are modified in the same way.  But xterm does not do that.  The
+# first 4 function keys are used in xterm to support the VT100 PF1-PF4 keypad
+# keys.  For example, F2 sends \EOQ in both terminals because of this feature.
+# But a shifted F2 (F14=F2+12) differs like this, in infocmp's listing:
+#	kf14: '\E[1;2Q', '\EO2Q'.
+#
+# In effect, a quarter of konsole's function-keys are different from xterm.
+#
+# It is not a simple blunder:
+# a) xterm patch #121 (November 1999), providing the first version of the
+#    PC-style modifiers would send \EO2Q
+# b) xterm patch #216 (July 2006) amended this and other details, provided
+#    better documentation for the modifiers and made the behavior configurable,
+#    e.g., using the modifyFunctionKeys resource.  The reason why it sends
+#    \E[1;2Q is that \E[O2Q is not a legal ECMA-48 control sequence.  The
+#    changelog points this out as "avoid sending SS3 with parameters".
+# c) That came after AnyMod was introduced, but still early enough that one
+#    might expect konsole's developers to followup.  Twelve years later that
+#    has yet to happen.
+#
+# As of 2018, konsole still provides 3 keyboard profiles ("XFree 4", "linux",
+# "solaris").
+konsole-linux|KDE console window with Linux keyboard,
+	kf1=\E[[A, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13@,
+	kf14@, kf15@, kf16@, kf17@, kf18@, kf19@, kf2=\E[[B, kf20@,
+	kf3=\E[[C, kf4=\E[[D, kf5=\E[[E, kf6=\E[17~, kf7=\E[18~,
+	kf8=\E[19~, kf9=\E[20~, use=konsole-base,
+konsole-solaris|KDE console window with Solaris keyboard,
+	kbs=^H, kend=\E[4~, khome=\E[1~, use=konsole-vt100,
+
+# Obsolete: x11r5.keymap
+# KDE's "XFree86 3.x.x" keyboard was obviously based on reading the xterm
+# terminfo at the time rather than testing the code.
+konsole-xf3x|KDE console window with keyboard for XFree86 3.x xterm,
+	kend=\E[4~, khome=\E[1~, use=konsole-vt100,
+
+# The value for kbs (see konsole-vt100) reflects local customization rather
+# than the settings used for XFree86 xterm.
+konsole-xf4x|KDE console window with keyboard for XFree86 4.x xterm,
+	kend=\EOF, khome=\EOH, use=konsole+pcfkeys,
+	use=konsole-vt100,
+
+konsole+pcfkeys|konsole subset of xterm+pcfkeys,
+	kcbt=\E[Z, use=xterm+pcc2, use=xterm+pcf0,
+	use=xterm+pce2,
+
+# Obsolete: vt100.keymap
+# KDE's "vt100" keyboard has no relationship to any terminal that DEC made, but
+# it is still useful for deriving the other entries, since the developer
+# provided function-keys based on xterm.
+konsole-vt100|KDE console window with VT100 (sic) keyboard,
+	kbs=^?, kdch1=\E[3~, kend=\E[F, kf1=\E[11~, kf10=\E[21~,
+	kf11=\E[23~, kf12=\E[24~, kf13@, kf14@, kf15@, kf16@, kf17@,
+	kf18@, kf19@, kf2=\E[12~, kf20@, kf3=\E[13~, kf4=\E[14~,
+	kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~,
+	khome=\E[H, use=konsole-base,
+
+# Obsolete: vt420pc.keytab was added in June 2000, dropped from the install in
+# September 2008 and removed in June 2016.  The developer who removed it stated
+# that it was never installed.
+konsole-vt420pc|KDE console window with VT420 PC keyboard,
+	kbs=^H, kdch1=^?, use=konsole-vt100,
+
+# make a default entry for konsole
+konsole|KDE console window,
+	use=konsole-xf4x,
+
+# These were written for ncurses:
+konsole-16color|klone of xterm-16color,
+	ncv#32, use=ibm+16color, use=konsole,
+konsole-256color|KDE console window with xterm 256-colors,
+	use=xterm+256setaf, use=konsole,
+
+#### MLTERM
+# https://github.com/arakiken/mlterm
+
+mlterm|multi lingual terminal emulator,
+	use=mlterm3,
+
+# Tested mlterm 3.9.0 (2020/09/19):
+# ncurses:
+# - has blinking text
+# - has italics
+# - has invisible-text
+# tack:
+# - has crossed-out text
+# - does not support palette reset with OSC 104
+# - testing the function-keys is difficult because the terminal is
+#   preconfigured to set many of the modified keys to special functions, e.g.,
+#   - shift-F1 and shift-F2 are bound to a split-screen feature
+#   - control-F1 and control-F2 is bound to a new-terminal feature
+# vttest:
+# - primary response says it is a VT340 (ReGIS and Sixel).
+# - has partial support for double-size characters.
+# - character-set tests do not work.
+# - DEC locator works.
+# - 1006-mouse works.
+# - focus-events do not work reliably.
+# - numeric keypad escapes do not work.
+# - back-color erase works
+# other:
+# - title-stack works.
+# - doesn't respond to 8-bit controls.
+# - 256-color palette initializing works.
+# - DECSTR soft-reset is documented.
+#
+# Tested mlterm 3.3.8 (2018/01/21):
+# found xterm+sm+1006 did not work with version 3.3.8
+# soft-reset DECSTR is in sources since 2017/09/19.
+#
+# Tested mlterm 3.2.2 (2014/03/22):
+# mlterm 3.x made further changes, but they were not reflected in the included
+# mlterm.ti (which was dropped in 2015).  This entry has been based on testing
+# with ncurses, tack and vttest -TD
+mlterm3|multi lingual terminal emulator 3.x,
+	bce, AX,
+	blink=\E[5m, flash=\E[?5h$<100/>\E[?5l, invis=\E[8m,
+	is2=\E[!p\E[?3;4l\E>, rs2=\E[!p\E[?3;4l\E>,
+	sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p4%t;5%;%?%p1%p3%|%t;7%;%?
+	    %p7%t;8%;m%?%p9%t\E(0%e\E(B%;,
+	use=ansi+enq, use=ansi+rep, use=ecma+italics,
+	use=ecma+strikeout, use=xterm+app, use=xterm+pcf2,
+	use=xterm+pcc2, use=xterm+pce2, use=xterm+meta,
+	use=xterm+alt+title, use=xterm+sm+1006,
+	use=vt100+pfkeys, use=bracketed+paste, use=mlterm2,
+
+# This is mlterm 2.9.3's mlterm.ti, with some additions/corrections -TD
+#
+# It is nominally a VT102 emulator, with features borrowed from rxvt and
+# xterm.
+#
+# The function keys are numbered based on shift/control/alt modifiers, except
+# that the control-modifier itself is used to spawn a new copy of mlterm (the
+# "-P" option).  So control/F1 to control/F12 may not be usable, depending on
+# how it is configured.
+#
+#				kf1 to kf12	\E[11~   to \E[24~
+#	shift			kf1 to kf12	\E[11;2~ to \E[24;2~
+#	alt			kf1 to kf12	\E[11;3~ to \E[24;3~
+#	shift/alt		kf1 to kf12	\E[11;4~ to \E[24;4~
+#	control			kf1 to kf12	\E[11;5~ to \E[24;5~ (maybe)
+#	control/shift		kf1 to kf12	\E[11;6~ to \E[24;6~
+#	control/alt		kf1 to kf12	\E[11;7~ to \E[24;7~
+#	control/shift/alt	kf1 to kf12	\E[11;8~ to \E[24;8~
+#
+mlterm2|multi lingual terminal emulator 2.x,
+	am, eslok, km, mc5i, mir, msgr, npc, xenl, XT,
+	colors#8, cols#80, it#8, lines#24, pairs#64,
+	acsc=00``aaffgghhjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, bold=\E[1m, cbt=\E[Z, clear=\E[H\E[2J, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M,
+	ech=\E[%p1%dX, ed=\E[J, el=\E[K, el1=\E[1K, enacs=,
+	home=\E[H, hpa=\E[%i%p1%dG, ht=^I, hts=\EH, ich=\E[%p1%d@,
+	il=\E[%p1%dL, il1=\E[L, ind=\n,
+	is2=\E7\E[r\E[m\E[?7h\E[?1;3;4;6l\E[4l\E8\E>, kbs=^?,
+	kcbt=\E[Z, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
+	kend=\EOF, kent=\EOM, khome=\EOH, kind=\EO1;2B, kmous=\E[M,
+	kri=\EO1;2A, mc0=\E[i, nel=\EE, op=\E[39;49m, rc=\E8,
+	rev=\E[7m, ri=\EM, rmacs=\E(B, rmam=\E[?7l, rmir=\E[4l,
+	rmkx=\E[?1l\E>, rmso=\E[27m, rmul=\E[24m, rs1=\Ec,
+	rs2=\E7\E[r\E8\E[m\E[?7h\E[?1;3;4;6l\E[4l\E>\E[?1000l,
+	sc=\E7, setab=\E[4%p1%dm, setaf=\E[3%p1%dm,
+	sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;m%?%p9%t\E(0%e
+	    \E(B%;,
+	sgr0=\E[m\E(B, smacs=\E(0, smam=\E[?7h, smir=\E[4h,
+	smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m, tbc=\E[3g,
+	u8=\E[?1;2c, vpa=\E[%i%p1%dd, use=ansi+enq,
+	use=vt220+vtedit, use=xterm+alt1049, use=ecma+index,
+	use=mlterm+pcfkeys, use=vt220+cvis, use=xterm+r6f2,
+
+# The insert/delete/home/end keys do not respond to modifiers because mlterm
+# looks in its termcap to decide which string to send.  If it used terminfo
+# (when available), it could use the extended names introduced for xterm.
+mlterm+pcfkeys|mlterm fragment for PC-style fkeys,
+	kLFT=\EO1;2D, kNXT=\E[6;2~, kPRV=\E[5;2~, kRIT=\EO1;2C,
+	kDN=\EO1;2B, kDN3=\EO1;3B, kDN4=\EO1;4B, kDN5=\EO1;5B,
+	kDN6=\EO1;6B, kDN7=\EO1;7B, kIC5=\E[2;5~, kIC6=\E[2;6~,
+	kLFT3=\EO1;3D, kLFT4=\EO1;4D, kLFT5=\EO1;5D,
+	kLFT6=\EO1;6D, kLFT7=\EO1;7D, kNXT5=\E[6;5~,
+	kNXT6=\E[6;6~, kPRV5=\E[5;5~, kPRV6=\E[5;6~,
+	kRIT3=\EO1;3C, kRIT4=\EO1;4C, kRIT5=\EO1;5C,
+	kRIT6=\EO1;6C, kRIT7=\EO1;7C, kUP=\EO1;2A, kUP3=\EO1;3A,
+	kUP4=\EO1;4A, kUP5=\EO1;5A, kUP6=\EO1;6A, kUP7=\EO1;7A,
+
+mlterm-256color|mlterm 3.0 with xterm 256-colors,
+	use=xterm+256color, use=mlterm,
+
+#### RXVT
+# From: Thomas Dickey <dickey@clark.net> 04 Oct 1997
+# Updated: Oezguer Kesim <kesim@math.fu-berlin.de> 02 Nov 1997
+# Notes:
+# rxvt 2.21b uses
+#	smacs=\E(B\E)U^N, rmacs=\E(B\E)0^O,
+# but some applications don't work with that.
+# It also has an AIX extension
+#	box2=lqkxjmwuvtn,
+# and
+#	ech=\E[%p1%dX,
+# but the latter does not work correctly.
+#
+# The distributed terminfo says it implements hpa and vpa, but they are not
+# implemented correctly, using relative rather than absolute positioning.
+#
+# rxvt is normally configured to look for "xterm" or "xterm-color" as $TERM.
+# Since rxvt is not really compatible with xterm, it should be configured as
+# "rxvt" or "rxvt-color".
+#
+# removed dch/dch1 because they are inconsistent with bce/ech -TD
+# remove km as per tack test -TD
+rxvt-basic|rxvt terminal base (X Window System),
+	OTbs, am, bce, eo, mir, msgr, xenl, xon, XT,
+	cols#80, it#8, lines#24,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[2J, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	dl=\E[%p1%dM, dl1=\E[M, ed=\E[J, el=\E[K, el1=\E[1K,
+	enacs=\E(B\E)0, flash=\E[?5h$<100/>\E[?5l, home=\E[H,
+	ht=^I, hts=\EH, ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[L,
+	ind=\n, is1=\E[?47l\E=\E[?1l,
+	is2=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l, kbs=^H,
+	kcbt=\E[Z, kmous=\E[M, rc=\E8, rev=\E[7m, ri=\EM, rmacs=^O,
+	rmir=\E[4l, rmkx=\E>, rmso=\E[27m, rmul=\E[24m,
+	rs1=\E>\E[1;3;4;5;6l\E[?7h\E[m\E[r\E[2J\E[H,
+	rs2=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l\E>\E[?1000l\E[?
+	    25h,
+	s0ds=\E(B, s1ds=\E(0, sc=\E7,
+	sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?
+	    %p9%t\016%e\017%;,
+	sgr0=\E[0m\017, smacs=^N, smir=\E[4h, smkx=\E=, smso=\E[7m,
+	smul=\E[4m, tbc=\E[3g, use=xterm+alt47, use=vt100+enq,
+	use=rxvt+pcfkeys, use=vt220+cvis, use=vt220+keypad,
+# Key Codes from rxvt reference:
+#
+# Note: Shift + F1-F10 generates F11-F20
+#
+# For the keypad, use Shift to temporarily override Application-Keypad
+# setting use Num_Lock to toggle Application-Keypad setting if Num_Lock
+# is off, escape sequences toggle Application-Keypad setting.
+# Also note that values of Home, End, Delete may have been compiled
+# differently on your system.
+#
+#                   Normal       Shift        Control      Ctrl+Shift
+#  Tab              ^I           ESC [ Z      ^I           ESC [ Z
+#  BackSpace        ^H           ^?           ^?           ^?
+#  Find             ESC [ 1 ~    ESC [ 1 $    ESC [ 1 ^    ESC [ 1 @
+#  Insert           ESC [ 2 ~    paste        ESC [ 2 ^    ESC [ 2 @
+#  Execute          ESC [ 3 ~    ESC [ 3 $    ESC [ 3 ^    ESC [ 3 @
+#  Select           ESC [ 4 ~    ESC [ 4 $    ESC [ 4 ^    ESC [ 4 @
+#  Prior            ESC [ 5 ~    scroll-up    ESC [ 5 ^    ESC [ 5 @
+#  Next             ESC [ 6 ~    scroll-down  ESC [ 6 ^    ESC [ 6 @
+#  Home             ESC [ 7 ~    ESC [ 7 $    ESC [ 7 ^    ESC [ 7 @
+#  End              ESC [ 8 ~    ESC [ 8 $    ESC [ 8 ^    ESC [ 8 @
+#  Delete           ESC [ 3 ~    ESC [ 3 $    ESC [ 3 ^    ESC [ 3 @
+#  F1               ESC [ 11 ~   ESC [ 23 ~   ESC [ 11 ^   ESC [ 23 ^
+#  F2               ESC [ 12 ~   ESC [ 24 ~   ESC [ 12 ^   ESC [ 24 ^
+#  F3               ESC [ 13 ~   ESC [ 25 ~   ESC [ 13 ^   ESC [ 25 ^
+#  F4               ESC [ 14 ~   ESC [ 26 ~   ESC [ 14 ^   ESC [ 26 ^
+#  F5               ESC [ 15 ~   ESC [ 28 ~   ESC [ 15 ^   ESC [ 28 ^
+#  F6               ESC [ 17 ~   ESC [ 29 ~   ESC [ 17 ^   ESC [ 29 ^
+#  F7               ESC [ 18 ~   ESC [ 31 ~   ESC [ 18 ^   ESC [ 31 ^
+#  F8               ESC [ 19 ~   ESC [ 32 ~   ESC [ 19 ^   ESC [ 32 ^
+#  F9               ESC [ 20 ~   ESC [ 33 ~   ESC [ 20 ^   ESC [ 33 ^
+#  F10              ESC [ 21 ~   ESC [ 34 ~   ESC [ 21 ^   ESC [ 34 ^
+#  F11              ESC [ 23 ~   ESC [ 23 $   ESC [ 23 ^   ESC [ 23 @
+#  F12              ESC [ 24 ~   ESC [ 24 $   ESC [ 24 ^   ESC [ 24 @
+#  F13              ESC [ 25 ~   ESC [ 25 $   ESC [ 25 ^   ESC [ 25 @
+#  F14              ESC [ 26 ~   ESC [ 26 $   ESC [ 26 ^   ESC [ 26 @
+#  F15 (Help)       ESC [ 28 ~   ESC [ 28 $   ESC [ 28 ^   ESC [ 28 @
+#  F16 (Menu)       ESC [ 29 ~   ESC [ 29 $   ESC [ 29 ^   ESC [ 29 @
+#  F17              ESC [ 31 ~   ESC [ 31 $   ESC [ 31 ^   ESC [ 31 @
+#  F18              ESC [ 32 ~   ESC [ 32 $   ESC [ 32 ^   ESC [ 32 @
+#  F19              ESC [ 33 ~   ESC [ 33 $   ESC [ 33 ^   ESC [ 33 @
+#  F20              ESC [ 34 ~   ESC [ 34 $   ESC [ 34 ^   ESC [ 34 @
+#
+#                                                          Application
+#  Up               ESC [ A      ESC [ a      ESC O a      ESC O A
+#  Down             ESC [ B      ESC [ b      ESC O b      ESC O B
+#  Right            ESC [ C      ESC [ c      ESC O c      ESC O C
+#  Left             ESC [ D      ESC [ d      ESC O d      ESC O D
+#  KP_Enter         ^M                                     ESC O M
+#  KP_F1            ESC O P                                ESC O P
+#  KP_F2            ESC O Q                                ESC O Q
+#  KP_F3            ESC O R                                ESC O R
+#  KP_F4            ESC O S                                ESC O S
+#  XK_KP_Multiply   *                                      ESC O j
+#  XK_KP_Add        +                                      ESC O k
+#  XK_KP_Separator  ,                                      ESC O l
+#  XK_KP_Subtract   -                                      ESC O m
+#  XK_KP_Decimal    .                                      ESC O n
+#  XK_KP_Divide     /                                      ESC O o
+#  XK_KP_0          0                                      ESC O p
+#  XK_KP_1          1                                      ESC O q
+#  XK_KP_2          2                                      ESC O r
+#  XK_KP_3          3                                      ESC O s
+#  XK_KP_4          4                                      ESC O t
+#  XK_KP_5          5                                      ESC O u
+#  XK_KP_6          6                                      ESC O v
+#  XK_KP_7          7                                      ESC O w
+#  XK_KP_8          8                                      ESC O x
+#  XK_KP_9          9                                      ESC O y
+#
+# The source-code for rxvt actually defines mappings for F21-F35, using
+# "ESC [ 35 ~" to "ESC [  49 ~".  Keyboards with more than 12 function keys
+# are rare, so this entry uses the shift- and control-modifiers as in
+# xterm+pcfkeys to define keys past F12.
+#
+# kIC is normally not used, since rxvt performs a paste for that (shifted
+# insert), unless private mode 35 is set.
+#
+# kDN, kDN5, kDN6, etc are extensions based on the names from xterm+pcfkeys -TD
+# Removed kDN6, etc (control+shift) since rxvt does not implement this -TD
+rxvt+pcfkeys|rxvt fragment for PC-style fkeys,
+	kDC=\E[3$, kEND=\E[8$, kHOM=\E[7$, kIC=\E[2$, kLFT=\E[d,
+	kNXT=\E[6$, kPRV=\E[5$, kRIT=\E[c, kcub1=\E[D, kcud1=\E[B,
+	kcuf1=\E[C, kcuu1=\E[A, kel=\E[8\^, kend=\E[8~, kf1=\E[11~,
+	kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\E[25~,
+	kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, kf17=\E[31~,
+	kf18=\E[32~, kf19=\E[33~, kf2=\E[12~, kf20=\E[34~,
+	kf21=\E[23$, kf22=\E[24$, kf23=\E[11\^, kf24=\E[12\^,
+	kf25=\E[13\^, kf26=\E[14\^, kf27=\E[15\^, kf28=\E[17\^,
+	kf29=\E[18\^, kf3=\E[13~, kf30=\E[19\^, kf31=\E[20\^,
+	kf32=\E[21\^, kf33=\E[23\^, kf34=\E[24\^, kf35=\E[25\^,
+	kf36=\E[26\^, kf37=\E[28\^, kf38=\E[29\^, kf39=\E[31\^,
+	kf4=\E[14~, kf40=\E[32\^, kf41=\E[33\^, kf42=\E[34\^,
+	kf43=\E[23@, kf44=\E[24@, kf5=\E[15~, kf6=\E[17~,
+	kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, khome=\E[7~, kind=\E[a,
+	kri=\E[b, kDC5=\E[3\^, kDC6=\E[3@, kDN=\E[b, kDN5=\EOb,
+	kEND5=\E[8\^, kEND6=\E[8@, kHOM5=\E[7\^, kHOM6=\E[7@,
+	kIC5=\E[2\^, kIC6=\E[2@, kLFT5=\EOd, kNXT5=\E[6\^,
+	kNXT6=\E[6@, kPRV5=\E[5\^, kPRV6=\E[5@, kRIT5=\EOc,
+	kUP=\E[a, kUP5=\EOa, use=vt220+vtedit,
+
+# rxvt was originally "xvt", first announced in April 1993:
+#	http://www.krsaborio.net/linux-desktops/research/1993/0416.html
+#------------------------------------------------------------------------------
+# Article: 567 of comp.os.linux.announce
+# Path: pavo.csi.cam.ac.uk!warwick!uknet!pipex!uunet!zaphod.mps.ohio-state.edu!
+# caen!batcomputer!theory.TC.Cornell.EDU!mdw
+# From: nation@rocket.sanders.com (Robert Nation)
+# Newsgroups: comp.os.linux.announce
+# Subject: xvt upload
+# Date: 16 Apr 1993 18:13:07 GMT
+# Organization: Cornell Theory Center
+# Lines: 13
+# Approved: linux-announce@tc.cornell.edu (Matt Welsh)
+# Message-ID: <1qmsvj$pvj@fitz.TC.Cornell.EDU>
+# NNTP-Posting-Host: theory.tc.cornell.edu
+# Keywords: xvt, xterm, Xwindows
+# Originator: mdw@theory.TC.Cornell.EDU
+#
+# Rxvt has been uploaded to /pub/Linux/Incoming/rxvt.tar.z and
+# rxvt.README on sunsite.unc.edu.
+#
+# Xvt is an xterm replacement which uses a little less memory, and is
+# suitable for use on machines with small memories. Tek4010 support
+# is removed.
+#
+# Modifications were made by Rob Nation (nation@rocket.sanders.lockheed.com)
+# to make it a little more compact, and to add and remove certain features.
+#
+#
+# --
+# Send submissions for comp.os.linux.announce to: linux-announce@tc.cornell.edu
+#------------------------------------------------------------------------------
+#
+# Though its change-log does not mention this, John Davis has stated that he
+# was the author of the changes to use the bce ("new color model") which was
+# incorporated into rxvt 2.11 (June 15, 1995).  The change-log does not give
+# dates, nor give developer's names.  Initial color support was added for rxvt
+# "2.0", which was sometime in 1994.
+#
+# rxvt had usable color support with 2.16 (April 2, 1996), with some help by my
+# work on vttest, as well as bug reports to Mark Olesen.  For instance, the fix
+# mentioned here
+#	https://web.archive.org/web/20141016124430/http://web.archiveorange.com/archive/v/6ETvLb5wHtbbzCaS4S9J
+# was from one of my bug-reports -TD
+#
+# While the color model both for xterm and rxvt was based on Linux console,
+# Olesen (or possibly Davis) diverged in one respect from Linux's bce color
+# behavior: inserting/deleting characters does not fill the newly empty cell
+# with the default background color.
+rxvt|rxvt-color|rxvt terminal emulator (X Window System),
+	ncv@,
+	hpa=\E[%i%p1%dG, kf0=\E[21~, sgr0=\E[m\017,
+	vpa=\E[%i%p1%dd, use=rxvt-basic, use=ecma+color,
+rxvt-256color|rxvt 2.7.9 with xterm 256-colors,
+	use=xterm+256color, use=rxvt,
+rxvt-88color|rxvt 2.7.9 with xterm 88-colors,
+	use=xterm+88color, use=rxvt,
+rxvt-xpm|rxvt terminal emulator (X Window System with xpm),
+	use=rxvt,
+rxvt-cygwin|rxvt terminal emulator (X Window System) on cygwin,
+	acsc=+\257\,\256-\^0\333`\004a\261f\370g\361h\260j\331k
+	     \277l\332m\300n\305o~p\304q\304r\304s_t\303u\264v\301w
+	     \302x\263y\363z\362{\343|\330}\234~\376,
+	use=rxvt,
+rxvt-cygwin-native|rxvt terminal emulator (native MS Window System port) on cygwin,
+	acsc=+\257\,\256-\^0\333`\004a\261f\370g\361h\260j\331k
+	     \277l\332m\300n\305o~p\304q\304r\304s_t\303u\264v\301w
+	     \302x\263y\363z\362{\343|\330~\376,
+	use=rxvt-cygwin,
+
+# This variant is supposed to work with rxvt 2.7.7 when compiled with
+# NO_BRIGHTCOLOR defined.  rxvt needs more work...
+rxvt-16color|rxvt with 16 colors like aixterm,
+	ncv#32, use=ibm+16color, use=rxvt,
+
+#### MRXVT
+# mrxvt 0.5.4
+#
+# mrxvt is based on rxvt 2.7.11, but has by default XTERM_FKEYS defined, which
+# makes its function-keys different from other flavors of rxvt -TD
+#
+# Testing with tack:
+# +	made custom description (below) to work, though it sets TERM=xterm.
+#
+# Testing with vttest:
+# +	While "based on" rxvt, some of the basic functionality is broken.  The
+#	window collapses to a single line when running several of the screens
+#	in vttest, e.g., the tests for cursor movement, screen features,
+#	double-sized characters.
+# +	The VT52 test works properly, but this is an exception.  Due to the
+#	other bug(s) most of vttest is untestable.
+# +	the color test using ECH shows a gap in the bce model, like rxvt.
+#
+# Testing with xterm "vttest" scripts:
+# +	resize.pl does not work because mrxvt does implement CSI 18 t
+#	(not in rxvt, but not documented by mrxvt) but not CSI 19 t.
+# +	none of the "dynamic colors" (OSC colors) scripts work.
+mrxvt|multitabbed rxvt,
+	XT,
+	kEND=\E[8;2~, kHOM=\E[7;2~, kcub1=\E[D, kcud1=\E[B,
+	kcuf1=\E[C, kcuu1=\E[A, kend=\E[8~, khome=\E[7~,
+	kEND3=\E[8;3~, kEND4=\E[8;4~, kEND5=\E[8;5~,
+	kEND6=\E[8;6~, kEND7=\E[8;7~, kHOM3=\E[7;3~,
+	kHOM4=\E[7;4~, kHOM5=\E[7;5~, kHOM6=\E[7;6~,
+	kHOM7=\E[7;7~, use=xterm+r6f2, use=xterm+pcfkeys,
+	use=rxvt,
+
+mrxvt-256color|multitabbed rxvt with 256 colors,
+	use=xterm+256color, use=mrxvt,
+
+#### ETERM
+# From: Michael Jennings <mej@valinux.com>
+#
+# Eterm 0.9.3
+#
+# removed kf0 which conflicts with kf10 -TD
+# remove cvvis which conflicts with cnorm -TD
+# Eterm does not implement control/shift cursor keys such as kDN6, or kPRV/kNXT
+# but does otherwise follow the rxvt+pcfkeys model -TD
+# remove nonworking flash -TD
+# remove km as per tack test -TD
+Eterm|Eterm-color|Eterm with xterm-style color support (X Window System),
+	am, bce, bw, eo, mc5i, mir, msgr, xenl, xon, XT,
+	btns#5, cols#80, it#8, lines#24, lm#0, ncv@,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[2J, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\E[B, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M,
+	ech=\E[%p1%dX, ed=\E[J, el=\E[K, el1=\E[1K, enacs=\E)0,
+	home=\E[H, hpa=\E[%i%p1%dG, ht=^I, hts=\EH, ich=\E[%p1%d@,
+	il=\E[%p1%dL, il1=\E[L, ind=\n, is1=\E[?47l\E>\E[?1l,
+	is2=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l, kNXT@,
+	kPRV@, ka1=\E[7~, ka3=\E[5~, kb2=\EOu, kbeg=\EOu, kbs=^H,
+	kc1=\E[8~, kc3=\E[6~, kent=\EOM, khlp=\E[28~, kmous=\E[M,
+	mc4=\E[4i, mc5=\E[5i, rc=\E8, rev=\E[7m, ri=\EM, rmacs=^O,
+	rmam=\E[?7l, rmir=\E[4l, rmkx=, rmso=\E[27m, rmul=\E[24m,
+	rs1=\E>\E[1;3;4;5;6l\E[?7h\E[m\E[r\E[2J\E[H,
+	rs2=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l\E>\E[?1000l\E[?
+	    25h,
+	sc=\E7,
+	sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5
+	    %;m%?%p9%t\016%e\017%;,
+	sgr0=\E[m\017, smacs=^N, smam=\E[?7h, smir=\E[4h, smkx=,
+	smso=\E[7m, smul=\E[4m, tbc=\E[3g, vpa=\E[%i%p1%dd,
+	use=xterm+alt47, use=vt100+enq, use=rxvt+pcfkeys,
+	use=ecma+color, use=vt220+cvis,
+
+Eterm-256color|Eterm with xterm 256-colors,
+	use=xterm+256color, use=Eterm,
+
+Eterm-88color|Eterm with 88 colors,
+	use=xterm+88color, use=Eterm,
+
+#### ATERM
+# Based on rxvt 2.4.8, it has a few differences in key bindings
+aterm|AfterStep terminal,
+	XT,
+	kbs=^?, kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, use=rxvt,
+
+#### XITERM
+# xiterm  0.5-5.2
+# This is not based on xterm's source...
+# vttest shows several problems with keyboard, cursor-movements.
+# see also https://invisible-island.net/xterm/xterm.faq.html#bug_xiterm
+xiterm|internationalized terminal emulator for X,
+	km@,
+	kbs=^?, kdch1=\E[3~, use=klone+color, use=xterm-r6,
+
+
+#### HPTERM
+# HP ships this (HPUX 9 and 10), except for the pb#9600 which was merged in
+# from BSD termcap.  (hpterm:  added empty <acsc>, we have no idea what ACS
+# chars look like --esr)
+hpterm|X-hpterm|HP X11 terminal emulator (old),
+	am, da, db, mir, xhp, xon,
+	cols#80, lh#2, lines#24, lm#0, lw#8, nlab#8, pb#9600, xmc#0,
+	acsc=, bel=^G, bold=\E&dB, cbt=\Ei, clear=\E&a0y0C\EJ, cr=\r,
+	cub1=^H, cud1=\EB, cuf1=\EC, cup=\E&a%p1%dy%p2%dC,
+	cuu1=\EA, dch1=\EP, dim=\E&dH, dl1=\EM, ed=\EJ$<1>, el=\EK,
+	hpa=\E&a%p1%dC, ht=^I, hts=\E1, il1=\EL, ind=\n, kbs=^H,
+	kclr=\EJ, kctab=\E2, kdch1=\EP, kdl1=\EM, ked=\EJ, kel=\EK,
+	khts=\E1, kich1=\EQ, kil1=\EL, knp=\EU, kpp=\EV, krmir=\ER,
+	ktbc=\E3, meml=\El, memu=\Em,
+	pfkey=\E&f%p1%dk%p2%l%dL%p2%s,
+	pfloc=\E&f1a%p1%dk%p2%l%dL%p2%s,
+	pfx=\E&f2a%p1%dk%p2%l%dL%p2%s,
+	pln=\E&f%p1%dk%p2%l%dd0L%p2%s, rev=\E&dB, ri=\ET,
+	rmacs=^O, rmir=\ER, rmkx=\E&s0A, rmln=\E&j@, rmso=\E&d@,
+	rmul=\E&d@,
+	sgr=\E&d%?%p7%t%{115}%c%;%p1%p3%|%p6%|%{2}%*%p2%{4}%*%+%p4%+
+	    %p5%{8}%*%+%{64}%+%c%?%p9%t%'\016'%c%e%'\017'%c%;,
+	sgr0=\E&d@\017, smacs=^N, smir=\EQ, smkx=\E&s1A,
+	smln=\E&jB, smso=\E&dJ, smul=\E&dD, tbc=\E3,
+	vpa=\E&a%p1%dY, use=hp+pfk-cr, use=hp+arrows,
+# HPUX 11 provides a color version.
+hpterm-color|HP X11 terminal emulator with color,
+	ccc,
+	colors#64, pairs#8,
+	home=\E&a0y0C,
+	initp=\E&v%p2%da%p3%db%p4%dc%p5%dx%p6%dy%p7%dz%p1%dI,
+	op=\E&v0S, scp=\E&v%p1%dS, use=hpterm,
+
+# http://bitsavers.trailing-edge.com/pdf/hp/9000_hpux/1986/97089-90081_198611_Facilities_for_Series_200_300_and_500.pdf
+# http://bitsavers.trailing-edge.com/pdf/hp/9000_hpux/1987/97089-90081_198709_Facilities_for_Series_200_300_and_500_HP-UX_Concepts_and_Tutorials.pdf
+#
+# This article does not cover the HP 46020A keyboard that is used by the Model
+# 217 and 237 computers.  For information on this keyboard read the article,
+# "The Series 300 ITE as System Console" found in the manual, HP-UX Concepts
+# and Tutorials, Vol.  7. 
+#
+# Possibly:
+# http://bitsavers.trailing-edge.com/pdf/hp/9000_hpux/1986/97089-90042_198608_HP-UX_Concepts_and_Tutorials.pdf
+#
+# HP300_Series_ITE.pdf
+#
+# This version, which came from Martin Trusler, was tested with lynx using
+# ncurses 5.4
+hpterm-color2|X-hpterm-color2|HP X11 terminal emulator with color (new),
+	OTbs, am, ccc, da, db, km, mir, xhp,
+	colors#8, cols#80, it#8, lh#2, lines#24, lm#0, lw#8, nlab#8,
+	pairs#8, xmc#0,
+	acsc=+>\,<-\^.v0\374``a\374f\372g\376h\374j+k+l+m+n+o-q-s-t+
+	     u+v+w+x|y<z>{*|!}\273~\362,
+	bel=^G, bold=\E&dD, cbt=\Ei, clear=\EH\EJ, cr=\r, cub1=^H,
+	cud1=\EB, cuf1=\EC, cup=\E&a%p1%dy%p2%dC, cuu1=\EA,
+	dch1=\EP, dim=\E&dH, dl1=\EM, ed=\EJ$<1>, el=\EK,
+	home=\E&a0y0C, hpa=\E&a%p1%dC, ht=^I, hts=\E1, il1=\EL,
+	ind=\ES,
+	initp=\E&v0m%?%p2%{1000}%=%t1%e.%p2%d%;a%?%p3%{1000}%=%t1%e.
+	      %p3%d%;b%?%p4%{1000}%=%t1%e.%p4%d%;c%?%p5%{1000}%=%t1
+	      %e.%p5%d%;x%?%p6%{1000}%=%t1%e.%p6%d%;y%?%p7%{1000}%=
+	      %t1%e.%p7%d%;z%p1%dI,
+	is1=\EH\EJ, kbs=^H, kctab=\E2, kdch1=\EP, kdl1=\EM, ked=\EJ,
+	kel=\EK, khts=\E1, kich1=\EQ, kil1=\EL, knp=\EU, kpp=\EV,
+	krmir=\ER, ktbc=\E3, meml=\El, memu=\Em,
+	oc=\E&v0m1a1b1c0I\E&v1a1I\E&v1b2I\E&v1a1b3I\E&v1c4I\E&v1a1c5
+	   I\E&v1b1c6I\E&v1x1y7I,
+	op=\E&v0S, pfkey=\E&f%p1%dk%p2%l%dL%p2%s,
+	pfloc=\E&f1a%p1%dk%p2%l%dL%p2%s,
+	pfx=\E&f2a%p1%dk%p2%l%dL%p2%s,
+	pln=\E&f%p1%dk%p2%l%dd0L%p2%s, rev=\E&dB, ri=\ET,
+	rmacs=^O, rmam=\E&s1C, rmcup=\E&s0A, rmir=\ER, rmkx=\E&s0A,
+	rmln=\E&j@, rmm=\E&k0I, rmso=\E&d@, rmul=\E&d@, rs1=\EE,
+	scp=\E&v%p1%dS,
+	sgr=\E&d%p1%p3%|%{2}%*%p2%p6%|%{4}%*%+%p5%{8}%*%+%{64}%+%c%?
+	    %p9%t%'\016'%c%e%'\017'%c%;,
+	sgr0=\E&d@\017, smacs=^N, smam=\E&s0C, smcup=\E&s1A,
+	smir=\EQ, smkx=\E&s1A, smln=\E&jB, smm=\E&k1I, smso=\E&dB,
+	smul=\E&dD, tbc=\E3, vpa=\E&a%p1%dY, use=hp+pfk-cr,
+	use=hp+arrows,
+#### EMU
+# This is for the extensible terminal emulator on the X11R6 contrib tape.
+# It corresponds to emu's internal emulation:
+#	emu -term emu
+# emu's default sets TERM to "xterm", but that doesn't work well -TD
+# fixes: remove bogus rmacs/smacs, change oc to op, add bce, am -TD
+# fixes: add civis, cnorm, sgr -TD
+emu|emu native mode,
+	am, bce, mir, msgr, xon,
+	colors#15, cols#80, it#8, lines#24, pairs#64, vt#200,
+	acsc=61a\202f\260g2j\213k\214l\215m\216n\217o\220q\222s
+	     \224t\225u\226v\227w\230x\231~\244,
+	bel=^G, blink=\EW, bold=\EU, civis=\EZ, clear=\EP\EE0;0;,
+	cnorm=\Ea, cr=\r, csr=\Ek%p1%d;%p2%d;, cub=\Eq-%p1%d;,
+	cub1=^H, cud=\Ep%p1%d;, cud1=\EB, cuf=\Eq%p1%d;, cuf1=\EC,
+	cup=\EE%p1%d;%p2%d;, cuu=\Ep-%p1%d;, cuu1=\EA,
+	dch=\EI%p1%d;, dch1=\EI1;, dl=\ER%p1%d;, dl1=\ER1;,
+	ech=\Ej%p1%d;, ed=\EN, el=\EK, el1=\EL, home=\EE0;0;, ht=^I,
+	hts=\Eh, il=\EQ%p1%d;, il1=\EQ1;, ind=\EG,
+	is2=\ES\Er0;\Es0;, kbs=^H, kcub1=\EC, kcud1=\EB, kcuf1=\ED,
+	kcuu1=\EA, kdch1=^?, kent=\r, kf0=\EF00, kf1=\EF01,
+	kf10=\EF10, kf11=\EF11, kf12=\EF12, kf13=\EF13, kf14=\EF14,
+	kf15=\EF15, kf16=\EF16, kf17=\EF17, kf18=\EF18, kf19=\EF19,
+	kf2=\EF02, kf20=\EF20, kf3=\EF03, kf4=\EF04, kf5=\EF05,
+	kf6=\EF06, kf7=\EF07, kf8=\EF08, kf9=\EF09, kfnd=\Efind,
+	kich1=\Eins, knp=\Enext, kpp=\Eprior, kslt=\Esel,
+	op=\Es0;\Er0;, rev=\ET, ri=\EF, rmir=\EX, rmso=\ES, rmul=\ES,
+	rs2=\ES\Es0;\Er0;, setab=\Es%i%p1%d;,
+	setaf=\Er%i%p1%d;,
+	sgr=\ES%?%p1%t\ET%;%?%p2%t\EV%;%?%p3%t\ET%;%?%p4%t\EW%;%?%p6
+	    %t\EU%;,
+	sgr0=\ES, smir=\EY, smso=\ET, smul=\EV, tbc=\Ej,
+
+# VT220 terminfo entry for the Emu emulation, corresponds to
+#	emu -term vt220
+# with NumLock set (to make the keypad transmit kf0-kf9).
+# fixes: add am, xenl, corrected sgr0 -TD
+emu-220|Emu-220 (vt200-7bit mode),
+	am, xenl, xon,
+	cols#80, it#8, lines#24, vt#200,
+	acsc=aaffggjjkkllmmnnooqqssttuuvvwwxx~~, bel=^G,
+	blink=\E[0;5m, bold=\E[0;1m, clear=\E[2J\E[H, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=\E[1D,
+	cud=\E[%p1%dB, cud1=\E[1B, cuf=\E[%p1%dC, cuf1=\E[1C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[1A,
+	dch=\E[%p1%dP, dch1=\E[1P, dl=\E[%p1%dM, dl1=\E[1M,
+	ed=\E[0J, el=\E[0K, el1=\E[1K, enacs=\E)0, home=\E[H, ht=^I,
+	hts=\EH, if=/usr/share/tabset/vt300, il=\E[%p1%dL,
+	il1=\E[1L, ind=\ED, is2=\E>\E[?1l\E[?3l\E[4l\E[?7h,
+	kbs=^H, kcmd=\E[29~, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C,
+	kcuu1=\E[A, kent=\EOM, kf0=\EOp, kf1=\EOq, kf10=\EOl,
+	kf11=\EOm, kf12=\EOn, kf13=\EOP, kf14=\EOQ, kf15=\EOR,
+	kf16=\EOS, kf2=\EOr, kf26=\E[17~, kf27=\E[18~, kf28=\E[19~,
+	kf29=\E[20~, kf3=\EOs, kf30=\E[21~, kf34=\E[26~,
+	kf37=\E[31~, kf38=\E[32~, kf39=\E[33~, kf4=\EOt,
+	kf40=\E[34~, kf5=\EOu, kf6=\EOv, kf7=\EOw, kf8=\EOx,
+	kf9=\EOy, khlp=\E[28~, rc=\E8, rev=\E[0;7m, ri=\EM, rmacs=^O,
+	rmcup=\E>, rmkx=\E>, rmso=\E[m, rmul=\E[m,
+	rs2=\E[4l\E[34l\E[?1l\E[?3l\E[?5l\E[?7h, sc=\E7,
+	sgr=\E[0%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5%t;
+	    2%;%?%p6%t;1%;%?%p7%t;8%;m%?%p9%t\016%e\017%;,
+	sgr0=\E[m\017, smacs=^N, smcup=\E[?1l\E=, smkx=\E=,
+	smso=\E[0;7m, smul=\E[0;4m, tbc=\E[3g, use=vt220+vtedit,
+	use=vt220+cvis,
+
+#### MVTERM
+# A commercial product, Reportedly a version of Xterm with an OPEN LOOK UI,
+# print interface, ANSI X3.64 colour escape sequences, etc.  Newsgroup postings
+# indicate that it emulates more than one terminal, but incompletely.
+#
+# This is adapted from a FreeBSD bug-report by Daniel Rudy <dcrudy@pacbell.net>
+# It is based on vt102's entry, with some subtle differences, but also
+#	has status line
+#	supports ANSI colors (except for 'op' string)
+#	apparently implements alternate screen like xterm
+#	does not use padding, of course.
+mvterm|vv100|SwitchTerm aka mvTERM,
+	am, km, mir, msgr, xenl, xon,
+	colors#8, cols#80, it#8, lines#24, pairs#64,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[2J, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M, ed=\E[J,
+	el=\E[K, el1=\E[1K$<3>, enacs=\E(B\E)0, home=\E[H, ht=^I,
+	hts=\EH, ich=\E[%p1%d@, ich1=\E[@, il=\E[%p1%dL, il1=\E[L,
+	ind=\n, kbs=^H, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC,
+	kcuu1=\EOA, kf0=\EOy, kf10=\EOx, kf5=\EOt, kf6=\EOu,
+	kf7=\EOv, kf8=\EOl, kf9=\EOw, op=\E[100m, rc=\E8, rev=\E[7m,
+	ri=\EM, rmacs=^O, rmkx=\E[?1l\E>, rmso=\E[m, rmul=\E[m,
+	rs2=\E>\E[1;3;4;5;6l\E[?7h\E[100m\E[m\E[r\E[2J\E[H,
+	sc=\E7, setab=\E[4%p1%dm, setaf=\E[3%p1%dm,
+	sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5
+	    %;m%?%p9%t\016%e\017%;,
+	sgr0=\E[m\017, smacs=^N, smkx=\E[?1h\E=, smso=\E[7m,
+	smul=\E[4m, tbc=\E[3g, use=xterm+alt47, use=vt100+fnkeys,
+	use=x10term+sl,
+
+#### MTERM
+#
+# This application is available by email from <mouse@Rodents.Montreal.QC.CA>.
+#
+# "mterm -type ansi" sets $TERM to "ansi"
+mterm-ansi|ANSI emulation,
+	am, bw, mir, msgr,
+	it#8,
+	acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[J, cr=\r,
+	cub=\E[%p1%dD, cub1=\E[D, cud=\E[%p1%dB, cud1=\E[B,
+	cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH,
+	cuu=\E[%p1%dA, cuu1=\E[A, dch=\E[%p1%dP, dch1=\E[P,
+	dim=\E[2m, dl=\E[%p1%dM, dl1=\E[M, ech=\E[%p1%dX, ed=\E[J,
+	el=\E[K, home=\E[H, hpa=\E[%i%p1%d`, ht=^I, ich1=,
+	il=\E[%p1%dL, il1=\E[L, ind=\E[S, invis=\E[8m,
+	is2=\E)0\017, kbs=^H, nel=\EE, rev=\E[7m, ri=\E[T, rmacs=^O,
+	rmir=\E[4l, rmso=\E[27m, rmul=\E[24m,
+	sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?
+	    %p5%t;2%;%?%p7%t;8%;m%?%p9%t\016%e\017%;,
+	sgr0=\E[m\017, smacs=^N, smir=\E[4h, smso=\E[7m,
+	smul=\E[4m, vpa=\E[%i%p1%dd, use=ecma+index,
+# mterm normally sets $TERM to "mterm"
+mterm|mouse-sun|Der Mouse term,
+	am, bw, mir,
+	it#8,
+	bel=^G, clear=^L, cr=\r, cub1=^H, cud1=^N, cuf1=^S,
+	cup=\006%p1%d.%p2%d., cuu1=^X, dch1=^Y, dl1=^K, ed=^B, el=^C,
+	home=^P, ht=^I, il1=^A, ind=^U, kbs=^H, ll=^R, nel=\r^U, ri=^W,
+	rmir=^O, rmso=^T, smir=^Q, smso=^V,
+# "mterm -type decansi" sets $TERM to "decansi"
+#
+# note: kdch1, kfnd, kslt are in the source code, but do not work -TD
+decansi|ANSI emulation with DEC compatibility hacks,
+	am, mir, msgr, xenl,
+	colors#8, it#8, pairs#64,
+	acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[J, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=\E[D,
+	cud=\E[%p1%dB, cud1=\E[B, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m, dl=\E[%p1%dM,
+	dl1=\E[M, ech=\E[%p1%dX, ed=\E[J, el=\E[K, enacs=\E(B\E)0,
+	home=\E[H, hpa=\E[%i%p1%d`, ht=^I, ich1=, il=\E[%p1%dL,
+	il1=\E[L, ind=\E[S, invis=\E[8m, is2=\E)0\E[r\017, kbs=^H,
+	kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kf1=\E[11~,
+	kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\E[25~,
+	kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, kf17=\E[31~,
+	kf18=\E[32~, kf19=\E[33~, kf2=\E[12~, kf20=\E[34~,
+	kf3=\E[13~, kf4=\E[14~, kf5=\E[15~, kf6=\E[17~, kf7=\E[18~,
+	kf8=\E[19~, kf9=\E[20~, nel=\EE, op=\E[0m, rc=\E8, rev=\E[7m,
+	ri=\E[T, rmacs=^O, rmam=\E[?7l, rmir=\E[4l, rmkx=\E[?1l\E>,
+	rmso=\E[27m, rmul=\E[24m, sc=\E7, setab=\E[4%p1%dm,
+	setaf=\E[3%p1%dm,
+	sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?
+	    %p5%t;2%;%?%p7%t;8%;m%?%p9%t\016%e\017%;,
+	sgr0=\E[m\017, smacs=^N, smam=\E[?7h, smir=\E[4h,
+	smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m, vpa=\E[%i%p1%dd,
+	use=ansi+cpr, use=vt220+vtedit, use=ecma+index,
+	use=vt220+cvis,
+
+#### VWM
+# http://vwm.sourceforge.net/
+#
+# VWM 2.0.2 (2009-05-01)
+# vwmterm is a terminal emulator written for the VWM console window manager.
+# This version is obsolete, replaced by libvterm in 2.1.0 (2009-10-23).
+vwmterm|VWM terminal,
+	am, bce, ccc, mir, msgr, npc, xenl, xon,
+	colors#8, pairs#64,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[J, cr=\r,
+	cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=\E[B,
+	cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH,
+	cuu=\E[%p1%dA, cuu1=\E[A, cvvis=\E[?25h, dim=\E[2m,
+	ed=\E[J, el=\E[K, home=\E[H, il1=\E[L, ind=\n, invis=\E[8m,
+	kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A,
+	kdch1=\E[3~, kend=\E[4~, kf1=\E[[A, kf10=\E[21~,
+	kf11=\E[22~, kf12=\E[23~, kf2=\E[[B, kf3=\E[[C, kf4=\E[[D,
+	kf5=\E[[E, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~,
+	khome=\E[1~, knp=\E[6~, kpp=\E[5~, rev=\E[7m, rmacs=\E[10m,
+	rmam=\E[?7l, rs1=\E[H\E[J\E[m\Ec, setab=\E[4%p1%dm,
+	setaf=\E[3%p1%dm,
+	sgr=\E[0;10%?%p1%t;3%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5
+	    %t;2%;%?%p6%t;1%;%?%p7%t;8%;%?%p9%t;11%;m,
+	sgr0=\E[0;10m, smacs=\E[11m, smam=\E[?7h, smso=\E[3m,
+	smul=\E[4m, use=vt220+cvis, use=xterm+alt1049,
+
+#### MGR
+#
+# MGR is a Bell Labs window system lighter-weight than X.
+# These entries describe MGR's xterm-equivalent.
+# They are courtesy of Vincent Broman <broman@nosc.mil> 14 Jan 1997
+#
+
+mgr|Bellcore MGR (non X) window system terminal emulation,
+	am, km, xon,
+	bel=^G, bold=\E2n, civis=\E9h, clear=^L, cnorm=\Eh, cr=\r,
+	csr=\E%p1%d;%p2%dt, cub1=^H, cud1=\Ef, cuf1=\Er,
+	cup=\E%p2%d;%p1%dM, cuu1=\Eu, cvvis=\E0h,
+	dch=\E%p1%dE$<5>, dch1=\EE, dl=\E%p1%dd$<3*>,
+	dl1=\Ed$<3>, ed=\EC, el=\Ec, hd=\E1;2f, ht=^I, hu=\E1;2u,
+	ich=\E%p1%dA$<5>, ich1=\EA, il=\E%p1%da$<3*>,
+	il1=\Ea$<3>, ind=\n, kbs=^H, kcub1=\E[D, kcud1=\E[B,
+	kcuf1=\E[C, kcuu1=\E[A, nel=\r\n, rev=\E1n, rmam=\E5S,
+	rmso=\E0n, rmul=\E0n, sgr0=\E0n, smam=\E5s, smso=\E1n,
+	smul=\E4n,
+mgr-sun|Mgr window with Sun keyboard,
+	ka1=\E[214z, ka3=\E[216z, kb2=\E[218z, kc1=\E[220z,
+	kc3=\E[222z, kcpy=\E[197z, kend=\E[220z, kent=\E[250z,
+	kf1=\E[224z, kf10=\E[233z, kf11=\E[234z, kf12=\E[235z,
+	kf2=\E[225z, kf3=\E[226z, kf4=\E[227z, kf5=\E[228z,
+	kf6=\E[229z, kf7=\E[230z, kf8=\E[231z, kf9=\E[232z,
+	kfnd=\E[200z, khlp=\E[207z, khome=\E[214z, knp=\E[222z,
+	kopn=\E[198z, kpp=\E[216z, kund=\E[195z, use=mgr,
+mgr-linux|Mgr window with Linux keyboard,
+	ka1=\E[H, ka3=\E[5~, kb2=\E[G, kc1=\E[Y, kc3=\E[6~,
+	kdch1=\E[3~, kend=\E[4~, kf0=\E[[J, kf1=\E[[A, kf10=\E[21~,
+	kf11=\E[23~, kf12=\E[24~, kf2=\E[[B, kf3=\E[[C, kf4=\E[[D,
+	kf5=\E[[E, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~,
+	khome=\E[1~, knp=\E[6~, kpp=\E[5~, use=mgr,
+
+#### SIMPLETERM
+# st.suckless.org
+
+st|stterm|aka simpleterm,
+	use=st-0.8,
+
+# Reviewed 0.8.2:
+# In tack,
+#	there is some problem turning off line-drawing
+#	shift+control function-keys do nothing; shift+control cursor keys work
+#	the padding tests make the terminal non-functional.
+# In vttest,
+#	SD/SU work
+#	SL/SR/REP do not work
+#	ECMA-48 cursor movement works, e.g., CHA, CBT, etc.
+#
+# This entry discards the ccc/initc capabilities from st-0.7 because they
+# belong in st-256color.
+st-0.8|simpleterm 0.8,
+	dim=\E[2m, kcbt@, kent@, oc=\E]104\007,
+	sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|
+	    %t;7%;%?%p4%t;5%;%?%p5%t;2%;%?%p7%t;8%;m,
+	Ms=\E]52;%p1%s;%p2%s\007, kDN3=\E[1;3B, kDN5=\E[1;5B,
+	kLFT3=\E[1;3D, kLFT5=\E[1;5D, kNXT3=\E[6;3~,
+	kNXT5=\E[6;5~, kPRV3=\E[5;3~, kPRV5=\E[5;5~,
+	kRIT3=\E[1;3C, kRIT5=\E[1;5C, kUP3=\E[1;3A, kUP5=\E[1;5A,
+	use=ecma+strikeout, use=st-0.6,
+
+# Reviewed 0.7:
+#	dim is intermittent, sometimes works, sometimes does not
+#	italics may show up with yellow color
+#	has control cursor-keys, alt cursor-keys, still no combinations
+#	has control pageup/down
+# tmux extensions, see TERMINFO EXTENSIONS in tmux(1)
+#	Se and Ss are implemented in the source-code, but the terminfo
+#	provided with the source is incorrect, since Se/Ss are mis-coded
+#	as booleans rather than strings.
+st-0.7|simpleterm 0.7,
+	ccc,
+	dim=\E[2m,
+	initc=\E]4;%p1%d;rgb:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*
+	      %{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E\\,
+	kcbt@, kent@, oc=\E]104\007,
+	sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|
+	    %t;7%;%?%p4%t;5%;%?%p5%t;2%;%?%p7%t;8%;m,
+	Ms=\E]52;%p1%s;%p2%s\007, kDN3=\E[1;3B, kDN5=\E[1;5B,
+	kLFT3=\E[1;3D, kLFT5=\E[1;5D, kNXT3=\E[6;3~,
+	kNXT5=\E[6;5~, kPRV3=\E[5;3~, kPRV5=\E[5;5~,
+	kRIT3=\E[1;3C, kRIT5=\E[1;5C, kUP3=\E[1;3A, kUP5=\E[1;5A,
+	use=ecma+strikeout, use=st-0.6,
+
+# st-0.4.1
+#
+# This version uses a table which supports a single modifier (a subset of
+# xterm's keys, using the same scheme).  Because it supports only a single
+# modifier in this table, function keys f36-f48 are normally unavailable
+# because they are assigned to modifier-4.
+#
+# The program assigns TERM to match the program name (the upstream source says
+# "st", but Debian renames it to "stterm").
+#
+# The source includes two entries which are not useful here:
+#	st-meta| simpleterm with meta key,
+#	st-meta-256color| simpleterm with meta key and 256 colors,
+# because st's notion of "meta" does not correspond to the terminfo definition.
+# Rather, it acts like xterm - when the meta feature is disabled.
+#
+# Removed invis -TD
+# Added eo, removed ul -TD
+#
+# Reviewed st 0.5:
+# implements control-modifier, but not control-shift for special keys
+# implements alt-modifier, but not alt-shift for special keys
+#
+# Reviewed st 0.6:
+#	http://git.suckless.org/st/log/st.info
+# Tmux unofficial extensions, see TERMINFO EXTENSIONS in tmux(1)
+# still has no function keys past kf36 (no combinations of modifiers)
+# no application keypad mode, e.g, kent.
+st-0.6|simpleterm 0.6,
+	am, bce, hs, mir, msgr, npc, xenl, XT,
+	colors#8, cols#80, it#8, lines#24, pairs#64,
+	acsc=+C\,D-A.B0E``aaffgghFiGjjkkllmmnnooppqqrrssttuuvvwwxxyy
+	     zz{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, clear=\E[H\E[2J,
+	cr=\r, csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m, dl=\E[%p1%dM,
+	dl1=\E[M, ech=\E[%p1%dX, ed=\E[J, el=\E[K, el1=\E[1K,
+	enacs=\E)0, flash=\E[?5h$<100/>\E[?5l, fsl=^G, home=\E[H,
+	hpa=\E[%i%p1%dG, ht=^I, hts=\EH, ich=\E[%p1%d@,
+	il=\E[%p1%dL, il1=\E[L, ind=\n, invis=\E[8m,
+	is2=\E[4l\E>\E[?1034l, kDC=\E[3;2~, kEND=\E[1;2F,
+	kHOM=\E[1;2H, kIC=\E[2;2~, kLFT=\E[1;2D, kNXT=\E[6;2~,
+	kPRV=\E[5;2~, kRIT=\E[1;2C, ka1=\E[1~, ka3=\E[5~, kb2=\EOu,
+	kbs=^?, kc1=\E[4~, kc3=\E[6~, kcbt=\E[Z, kclr=\E[3;5~,
+	kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
+	kdl1=\E[3;2~, ked=\E[1;5F, kel=\E[1;2F, kent=\EOM,
+	kf1=\EOP, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~,
+	kf13=\E[1;2P, kf14=\E[1;2Q, kf15=\E[1;2R, kf16=\E[1;2S,
+	kf17=\E[15;2~, kf18=\E[17;2~, kf19=\E[18;2~, kf2=\EOQ,
+	kf20=\E[19;2~, kf21=\E[20;2~, kf22=\E[21;2~,
+	kf23=\E[23;2~, kf24=\E[24;2~, kf25=\E[1;5P, kf26=\E[1;5Q,
+	kf27=\E[1;5R, kf28=\E[1;5S, kf29=\E[15;5~, kf3=\EOR,
+	kf30=\E[17;5~, kf31=\E[18;5~, kf32=\E[19;5~,
+	kf33=\E[20;5~, kf34=\E[21;5~, kf35=\E[23;5~,
+	kf36=\E[24;5~, kf37=\E[1;6P, kf38=\E[1;6Q, kf39=\E[1;6R,
+	kf4=\EOS, kf40=\E[1;6S, kf41=\E[15;6~, kf42=\E[17;6~,
+	kf43=\E[18;6~, kf44=\E[19;6~, kf45=\E[20;6~,
+	kf46=\E[21;6~, kf47=\E[23;6~, kf48=\E[24;6~,
+	kf49=\E[1;3P, kf5=\E[15~, kf50=\E[1;3Q, kf51=\E[1;3R,
+	kf52=\E[1;3S, kf53=\E[15;3~, kf54=\E[17;3~,
+	kf55=\E[18;3~, kf56=\E[19;3~, kf57=\E[20;3~,
+	kf58=\E[21;3~, kf59=\E[23;3~, kf6=\E[17~, kf60=\E[24;3~,
+	kf61=\E[1;4P, kf62=\E[1;4Q, kf63=\E[1;4R, kf7=\E[18~,
+	kf8=\E[19~, kf9=\E[20~, khome=\E[1~, kil1=\E[2;5~,
+	kind=\E[1;2B, kmous=\E[M, kri=\E[1;2A, krmir=\E[2;2~,
+	mc0=\E[i, mc4=\E[4i, mc5=\E[5i, op=\E[39;49m, rc=\E8,
+	rev=\E[7m, ri=\EM, rmacs=\E(B, rmir=\E[4l, rmkx=\E[?1l\E>,
+	rmso=\E[27m, rmul=\E[24m, rs1=\Ec, rs2=\E[4l\E>\E[?1034l,
+	sc=\E7, setab=\E[4%p1%dm, setaf=\E[3%p1%dm,
+	setb=\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}
+	     %=%t3%e%p1%d%;m,
+	setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}
+	     %=%t3%e%p1%d%;m,
+	sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|
+	    %t;7%;%?%p4%t;5%;%?%p5%t;2%;%?%p7%t;8%;m,
+	sgr0=\E[0m, smacs=\E(0, smir=\E[4h, smkx=\E[?1h\E=,
+	smso=\E[7m, smul=\E[4m, tbc=\E[3g, u8=\E[?1;2c,
+	vpa=\E[%i%p1%dd, Se=\E[2 q, Ss=\E[%p1%d q, use=ansi+enq,
+	use=vt220+pcedit, use=ecma+index, use=xterm+alt1049,
+	use=vt220+cvis, use=xterm+sl, use=ecma+italics,
+	use=ecma+strikeout, use=bracketed+paste,
+#
+# st-0.1.1
+#
+# Note:  the original terminfo description uses leading blank to persuade
+# ncurses to use "st" as its name.  Proper fix for that is to use "st" as an
+# alias.
+#
+# Reading the code shows it should work for aixterm 16-colors
+# - added st-16color
+#
+# Using tack:
+# - set eo (erase-overstrike)
+# - set xenl
+# - tbc doesn't work
+# - hts works
+# - cbt doesn't work
+# - shifted cursor-keys send sequences like rxvt
+# - sgr referred to unimplemented "invis" mode.
+# Fixes: add eo and xenl per tack, remove nonworking cbt, hts and tbc, invis
+simpleterm|old-st|simpleterm 0.1.1,
+	am, eo, mir, msgr, ul, xenl,
+	colors#8, cols#80, it#8, lines#24, ncv#3, pairs#64,
+	acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, bold=\E[1m, clear=\E[H\E[2J, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub1=^H, cud=\E[%p1%dB, cud1=\n,
+	cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH,
+	cuu=\E[%p1%dA, cuu1=\E[A, dch1=\E[P, dl=\E[%p1%dM,
+	dl1=\E[M, ed=\E[J, el=\E[K, home=\E[H, hpa=\E[%i%p1%dG,
+	ht=^I, ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[L, ind=\n, kbs=^?,
+	kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A,
+	kdch1=\E[3~, kend=\E[4~, kf1=\EOP, kf10=\E[21~,
+	kf11=\E[23~, kf12=\E[24~, kf2=\EOQ, kf3=\EOR, kf4=\EOS,
+	kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~,
+	khome=\E[1~, knp=\E[6~, kpp=\E[5~, op=\E[37;40m, rc=\E8,
+	rev=\E[7m, rmacs=\E(B, rmso=\E[m, rmul=\E[m, sc=\E7,
+	setab=\E[4%p1%dm, setaf=\E[3%p1%dm,
+	sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|
+	    %t;7%;m,
+	sgr0=\E[0m, smacs=\E(0, smso=\E[7m, smul=\E[4m,
+	use=vt220+cvis, use=ecma+index,
+st-16color|stterm-16color|simpleterm with 16-colors,
+	use=ibm+16color, use=st,
+# Tested with st 0.8.2
+# The issue with the titlebar is fixed, though st is very slow.
+# In st 0.7, 256 colors "works", but when running xterm's test-scripts, some
+# garbage is shown in the titlebar.
+#
+# terminal wants to use TERM=stterm-256color, but that is longer than 14
+# characters, making the choice nonportable.
+st-256color|stterm-256color|simpleterm with 256 colors,
+	use=xterm+256color, use=st,
+
+#### TERMINATOR
+# https://github.com/software-jessies-org/jessies/wiki/Terminator
+#
+# Tested using the Debian package org.jessies.terminator 6.104.3256 on 64-bit
+# Debian/current -TD (2011/8/20)
+#
+# There were some packaging problems:
+# a) using Java, the program starts off using 50Mb, and climbs from there,
+#    up to 114Mb after testing (no scrollback).
+# b) it insists on reinstalling its terminal description in $HOME/.terminfo
+#    (two copies, just in case the host happens to be Mac OS X).
+#    I deleted this after testing with tack.
+#
+# Issues/features found with tack:
+# a) tbc does not work (implying that hts also is broken).
+#    Comparing with the tabs utility shows a problem with the last tabstop on
+#    a line.
+# b) has xterm-style shifted function-key strings
+#    meta also is used, but control is ignored.
+# c) has xterm-style modifiers for cursor keys (shift, control, shift+control,
+#    meta)
+# d) some combinations of shift/control send xterm-style sequences for
+#    insert/delete/home/end.
+# e) numeric keypad sends only numbers (compare with vttest).
+# f) meta mode (km) is not implemented.
+#
+# Issues found with ncurses test-program:
+# a) bce is inconsistently implemented
+# b) widths of Unicode values above 256 do not always agree with wcwidth.
+#
+# Checked with vttest, found low degree of compatibility there.
+#
+# Checked with xterm's scripts, found that the 256-color palette is fixed.
+#
+# Fixes:
+# a) add sgr string
+# b) corrected sgr0 to reset alternate character set
+# c) modified smacs/rmacs to use SCS rather than SI/SO
+# d) removed bce
+# e) removed km
+#
+# Revisiting in May 2019, the Debian package was no longer available, and a
+# developer-provided ".deb" does not work.  However, a usable Windows ".msi"
+# (which relies upon Cygwin) can be tested.  The developers provide a terminfo,
+# but some of the features it lists do not work reliably (bce, italics, invis).
+#
+# tack:
+#	tbc fails
+#	invis attribute fails
+#	key-definitions could be expanded, with some work:
+#	+ supports xterm-style cursor key-modifiers for shift
+#	+ supports xterm-style function key-modifiers for shift,control,alt
+#	+ supports xterm-style editing key-modifiers for shift,control,alt
+#	(kbs=^?)
+# ncurses test-program:
+#	"C" menu shows that bce implementation is incomplete
+#	italics did not work
+#	dim worked once in tack, but not in ncurses test-program
+#	"F" thick-line characters do not display
+# vttest:
+#	terminal does not respond to 80/132-column switching
+#	wrapping at the right margin is erratic
+#	there are several problems in the cursor-movements and screen-features
+#	no VT52, no double-sized characters
+#	Device attributes response says it is a vanilla VT100
+#	does not respond to xterm mouse controls
+#	alternate screen tests do not fill the screen, return wrong position
+#	window modify/report operations do not work
+#	miscellaneous ISO-6429 tests, e.g., REP, do not work
+#	CBT, CHT, HPR, CNL,CPL, VPR do not work
+#
+# removed the cancel for "hs", removed cbt, invis, corrected sgr -TD
+# use xterm+256setaf, etc -TD
+terminator|Terminator no line wrap,
+	bce, eo, mir, msgr, xenl, xon,
+	cols#80, it#8, lines#24, lm#0,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bold=\E[1m, clear=\E[H\E[2J, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m, dl=\E[%p1%dM,
+	dl1=\E[M, ed=\E[J, el=\E[K, el1=\E[1K, enacs=\E(B\E)0,
+	flash=^G, home=\E[H, hpa=\E[%i%p1%dG, ht=^I, hts=\EH,
+	il=\E[%p1%dL, il1=\E[L, ind=\n, is1=\E[?47l\E=\E[?1l,
+	is2=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l, kbs=^?,
+	kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kf1=\EOP,
+	kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\E[25~,
+	kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, kf2=\EOQ, kf3=\EOR,
+	kf4=\EOS, kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~,
+	kf9=\E[20~, rc=\E8, rev=\E[7m, ri=\EM, rmacs=\E(B,
+	rmir=\E[4l, rmso=\E[27m, rmul=\E[24m, rs1=\Ec,
+	rs2=\E[!p\E[?3;4l\E[4l\E>, s0ds=\E(B, s1ds=\E(0, sc=\E7,
+	sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p5%t;2%;%?%p1%p3%|%t;7
+	    %;m%?%p9%t\E(0%e\E(B%;,
+	sgr0=\E[m\E(B, smacs=\E(0, smir=\E[4h, smso=\E[7m,
+	smul=\E[4m, tbc=\E[3g, tsl=\E]2;, vpa=\E[%i%p1%dd,
+	use=ansi+enq, use=vt220+pcedit, use=ecma+italics,
+	use=ecma+index, use=xterm+256setaf, use=xterm+sl-twm,
+	use=xterm+alt1049, use=vt220+cvis, use=bracketed+paste,
+
+#### TERMINOLOGY
+# https://www.enlightenment.org/about-terminology
+# https://github.com/borisfaure/terminology
+#
+# 2014/10/14:
+# Tested terminology-0.3.0, 0.6.1, using tack and vttest.  This is not a VT100
+# emulator, nor is it compatible with xterm, but it uses a few features from
+# both -TD
+#
+# General comments:
+#	cursor does not fill on focus
+#	there are pervasive problems with clearing/erasing parts of the screen
+#	resizing the window causes it to stop listening to the keyboard
+# tack -
+#	doesn't understand VT100 CPR needed for resize
+#	no CBT
+#	no cvvis
+#	has invis
+#	no blink
+#	uses bce model for colors, but (see below) fails the vttest screens
+#	has partial support for 256color feature.
+#	tack function-keys (a subset of xterm+pcf0), and
+#	tack cursor-keys (a subset of xterm+pce2):
+#			ctrl+shift (ignored)
+#		2	shift
+#			shift-alt modifier -> shift (2)
+#		3	alt
+#		4
+#		5	ctrl
+#	tack modifiers did not work for fkeys in 0.3.0; subset works in 0.6.1
+#	ctrl + khome/kend works - none of the other modifiers do
+# vttest -
+#	spits lots of messages from termptyesc.c especially in vttest.
+#	no 132-column mode
+#	fails menu 1, 2 (definitely not VT100-compatible)
+#	primary (claims VT420 with several options, apparently none work) and
+#	secondary report says (perhaps... VT420): \E[>41;285;0c
+#	CHA, HPR, VPA, CNL, CPL work
+#	BCE with ED/EL - fail
+#	BCE with ECH/indexing - fail
+#	SD/SU work
+#	unlike teken, background light/dark works
+#	can set title
+#	X10 and Normal mouse work
+#	Any-event mouse works
+#	Mouse button-event works
+#
+# This description uses xterm+pcf0, which is misleading because the program
+# does not handle combinations of modifiers - but listing them all would
+# involve more effort than its developers spent -TD
+terminology-0.6.1|EFL-based terminal emulator (0.6.1),
+	mc5i@,
+	blink@, ed@, el@, el1@, invis=\E[8m, kLFT=\E[1;2D,
+	kRIT=\E[1;2C, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~,
+	kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~,
+	kind=\E[1;2B, kri=\E[1;2A,
+	sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p7%t;8
+	    %;m%?%p9%t\016%e\017%;$<2>,
+	vpa=\E[%i%p1%dd, kDC3=\E[3;3~, kDC4=\E[3;4~,
+	kDC5=\E[3;5~, kDC6=\E[3;6~, kDC7=\E[3;7~, kDN=\E[1;2B,
+	kDN3=\E[1;3B, kDN4=\E[1;4B, kDN5=\E[1;5B, kDN6=\E[1;6B,
+	kDN7=\E[1;7B, kEND5=\E[1;5F, kHOM5=\E[1;5H,
+	kLFT3=\E[1;3D, kLFT4=\E[1;4D, kLFT5=\E[1;5D,
+	kLFT6=\E[1;6D, kLFT7=\E[1;7D, kRIT3=\E[1;3C,
+	kRIT4=\E[1;4C, kRIT5=\E[1;5C, kRIT6=\E[1;6C,
+	kRIT7=\E[1;7C, kUP=\E[1;2A, use=ansi+enq, use=xterm+pcf0,
+	use=vt100, use=xterm+256setaf,
+
+# 2017-11-11:
+# Tested terminology 1.0.0
+#
+# tack -
+#	Shifted cursor-keys send nothing, but xterm modifiers for control+shift
+#	and control+alt were added like xterm+pcc2
+#	Editing keys have some features from xterm+pce2
+#	Changed from xterm+pcf0 to xterm+pcf2
+#
+# vttest -
+#	REP, SL, SR fail
+#
+# Aside from the partial fixes for function/cursor/editing keys, no improvement
+# in other tests versus 0.6.1
+terminology-1.0.0|EFL-based terminal emulator (1.0.0),
+	dim=\E[2m, flash=\E[?5h$<100/>\E[?5l, kend=\E[OF,
+	khome=\E[OH, rmacs=\E(B,
+	sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;
+	    %?%p1%p3%|%t;7%;%?%p7%t;8%;m$<2>,
+	sgr0=\E(B\E[m, smacs=\E(0, use=ecma+italics,
+	use=vt220+cvis, use=xterm+x11mouse, use=xterm+pce2,
+	use=xterm+pcf2, use=xterm+pcc2, use=bracketed+paste,
+	use=terminology-0.6.1,
+
+# 2020/12/26:
+# Tested terminology 1.8.1 using tack and vttest.
+# tack -
+#	flash does not work
+#	italics and crossed-out text work
+#	no meta mode
+# vttest -
+#	DA1 says this is a VT420 with with 132 columns, NRCS, horizontal scrolling
+#	DA2 says this is a VT510, version 33.7
+#	NRCS does not work, program hangs in the locking shift test.
+#	some of the VT420 rectangle operations work
+#	left/right margins do not work
+#	most of DECSCUSR works
+#	most problems with bce are fixed.
+terminology-1.8.1|EFL-based terminal emulator (1.8.1),
+	km@,
+	cvvis@, flash@, initc@, kcbt=\E[Z, rmm@, smm@, Ms@,
+	use=ecma+index, use=xterm+256setaf, use=ansi+rep,
+	use=ecma+strikeout, use=xterm+sm+1006,
+	use=xterm+pcfkeys, use=xterm+tmux, use=vt220+cvis,
+	use=ecma+italics, use=xterm-basic,
+
+terminology|EFL-based terminal emulator,
+	use=terminology-1.8.1,
+
+######## OPENGL CLIENTS
+
+#### Alacritty
+# https://github.com/jwilm/alacritty
+# Version 0.6.0 (2020/11/25)
+# Version 0.4.0 (2019/11/25)
+# Version 0.3.3 (2019/08/03)
+# Version 0.2.1 (2018/10/03)
+# Project started in 2016/02, uses Rust and OpenGL, and in contrast to (most X
+# terminal programs) is not designed to run with a remote server.
+#
+# Packaged in Arch Linux -
+# vttest:
+#	initial screensize 24x80
+#	no DECCOLM (does not switch between 80/132 columns)
+#	otherwise, passes wrapping test
+#	no DECSCNM
+#	identifies as a VT102
+#	numeric keypad does not send expected codes (seen in 0.4.0)
+#	passes bce test
+#	vt220:
+#		ECH works in 0.3.3 (0.2.1 left text on right margin)
+#		no SRM, DECSCA
+#	vt320:
+#		fails DECXCPR
+#		does not implement any of the DECRQM/DECRPM controls
+#		does not implement any of the DECRQSS controls
+#	vt420:
+#		no DECLRMM
+#		no DECBI, DECFI
+#	other:
+#		fails CHT, otherwise ECMA-48 cursor movement ok
+#		fails ERM/SPA, SL, SR, passes REP, SD, SU
+#	xterm:
+#		no X10 mouse
+#		has normal and highlight mouse
+#		has any-event and button-event mouse
+#		+ does support SGR-mouse
+#		+ does not correctly support focus in/out events (seen in 0.4.0)
+#		cursor-position wrong after alternate-screen (fixed in 0.4.0)
+#		none of the dtterm controls work
+# tack:
+#	bell and flash do not work
+#	blink does not work
+#	italics and crossed-out work (latter did not work in 0.2.1)
+#	function-keys work up (tested combinations which window manager allows)
+#	treats meta as escape-prefix
+#
+# The program sources include "alacritty" and "alacritty-direct", which are
+# copied from "xterm-256color" and "xterm-direct" (but using semicolon for
+# subparameter delimiter).  Refactored here to use ncurses building blocks -TD
+alacritty|alacritty terminal emulator,
+	rs1=\Ec\E]104\007, use=xterm+256color,
+	use=alacritty+common,
+
+alacritty-direct|alacritty with direct color indexing,
+	use=xterm+indirect, use=alacritty+common,
+
+# cancel km, since it is not actually meta mode -TD
+# added ecma+strikeout in 0.3.3 -TD
+# added xterm+sl-twm in 0.3.3 -TD
+alacritty+common|base fragment for alacritty,
+	km@, npc,
+	kb2=\EOE, kbs=^?, kcbt=\E[Z, kent=\EOM, Se=\E[0 q,
+	Smulx=\E[4:%p1%dm, use=ecma+index, use=xterm+sm+1006,
+	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,
+
+#### Kitty
+# https://github.com/kovidgoyal/kitty
+# Project started in 2016/10 (see alacritty), but is a Python script rather
+# than Rust, using OpenGL.  The same caveats regarding remote connections
+# apply.  This is not an X terminal, though (like alacritty), it copies
+# features from xterm.
+#
+# Regarding the name "kitty", that is a pun, reflected in the description.
+# But see
+#	http://www.9bis.net/kitty/
+#	https://github.com/kovidgoyal/kitty/issues/9
+#	https://github.com/kovidgoyal/kitty/issues/1025
+# and
+#	http://lists.gnu.org/archive/html/bug-ncurses/2018-09/msg00005.html
+#	https://github.com/kovidgoyal/kitty/issues/879
+#
+# Version 0.21.2 (June 28, 2021)
+# changes since 0.19.1
+# Notes:
+#	Repeatable tests with tack and vttest assume a standard screensize --
+#	measured in characters.  However, kitty uses pixel-measurements and
+#	does not readily use characters.
+#	Resizing with twm shows only pixel-based hint rather than characters
+#	manual page states that it is possible to override initial window size,
+#	but configuration file has no effect on initial window size.
+#	The same problem with XFCE4, but editing the cached json file works
+#	for setting the window size (the "c" suffix for cells does not):
+#		{"window-size": [720, 440]}
+#	though the values depend upon the font in use.
+# vttest
+# tack
+#	flash works
+#	invisible text still does not work
+#	function/special key modifiers finally work
+#
+# Version 0.19.1 (October 6, 2020)
+# changes since 0.13.3:
+# vttest
+#	ISO-6429
+#		REP works, though using unspecified behavior
+#	xterm
+#		xterm's SGR-mouse mode is recognized.
+#		does recognize original alternate-screen
+#		bug: mouse focus in/out does not work.
+#		bug: X10 mouse mode responds like any-event
+#		bug: highlight-tracking does not work; terminal hangs.
+#
+# tack
+#	rs1 adds an empty string for resetting title- and other OSC-strings.
+#	italics work
+#
+# Version 0.13.3 (January 19, 2019)
+# Notes:
+#	initial screensize 71x22
+#	does not respond to "resize -s"
+#	resizing with window manager gives no clues
+# vttest
+#	does not switch between 80/132 columns
+#	fails wrapping test, copying vte/rxvt
+#	no reverse-background, no blink
+#	claims to be VT200:
+#		primary \E[?62;c
+#		secondary \E[>1;4000;12c
+#	however -
+#		no GR in the locking-shifts screen
+#		no NRCS or ISO-2022, anyway
+#	no VT52
+#	VT220:
+#		has DECTCEM, ECH, but no SRM and DECSCA
+#		has operating condition report, none of the others
+#	VT320:
+#		has SU/SD
+#		DECRQSS ok for DECSTBM, SGR, none of the others
+#		no status-line
+#	VT420:
+#		DECXCPR device status works, none of the others
+#		no left/right margins
+#		has DECCARA, but not DECERA, DECFRA, DECRARA, DECSERA
+#		inside of DECCARA is uncolored
+#		line-drawing with DECCARA does not work
+#		aside from left/right margins, editing sequences look ok
+#		no DECFI, DECBI
+#	color:
+#		fails ECH test for bce
+#	ISO-6429
+#		fails REP, SL, SL, but other cursor-movement ok
+#	xterm:
+#		does not recognize original alternate-screen
+#		cursor-position wrong after alternate-screen
+#		has normal mouse, any-event, any-button, but
+#			no X10 mouse
+#			no mouse-highlight tracking
+#			no DEC locator
+#		dtterm - only supports report-size chars/pixels
+#		recognizes tcap-query
+# tack:
+#	flash doesn't work
+#	italics do not work
+#	bce should be set (but see vttest)
+#*	developer's terminfo stopped at kf25, but the program continues,
+#	copying xterm for the rest of the control+fkey sequence
+#	(but only one modifier is supported, like iTerm2).
+#*	it omitted shifted pageup/down
+#*	control+editing keys work
+#	In contrast to function-keys, some additional modifier combinations
+#	act like xterm for the editing/cursor-keys, e.g., alt+shift.  While
+#	the implementation is incomplete, the building-blocks are consistent
+#	with what has been implemented -TD
+#	DECKPAM does not work -TD
+#*	ka1, ka3, kc1, kc3 were bogus (removed)
+#*	meta sends escape (removed kmm) -TD
+#*	cvvis does not make cursor "more visible" -TD
+kitty|KovId's TTY,
+	use=xterm+256color, use=kitty+common,
+kitty-direct|KovId's TTY using direct colors,
+	oc=\E]104\007, use=xterm+direct2, use=kitty+common,
+kitty+common|KovId's TTY common properties,
+	am, mc5i, mir, msgr, npc, xenl,
+	cols#80, it#8, lines#24,
+	acsc=++\,\,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxy
+	     yzz{{||}}~~,
+	bel=^G, bold=\E[1m, cbt=\E[Z, clear=\E[H\E[2J, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m, dl=\E[%p1%dM,
+	dl1=\E[M, ech=\E[%p1%dX, ed=\E[J, el=\E[K, el1=\E[1K,
+	flash=\E[?5h$<100/>\E[?5l, home=\E[H, hpa=\E[%i%p1%dG,
+	ht=^I, hts=\EH, ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[L,
+	ind=\n, kBEG=\E[1;2E, kbeg=\EOE, kbs=^?, kcbt=\E[Z,
+	kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
+	kdch1=\E[3~, kend=\EOF, kf1=\EOP, kf10=\E[21~, kf11=\E[23~,
+	kf12=\E[24~, kf13=\E[1;2P, kf14=\E[1;2Q, kf15=\E[1;2R,
+	kf16=\E[1;2S, kf17=\E[15;2~, kf18=\E[17;2~,
+	kf19=\E[18;2~, kf2=\EOQ, kf20=\E[19;2~, kf21=\E[20;2~,
+	kf22=\E[21;2~, kf23=\E[23;2~, kf24=\E[24;2~,
+	kf25=\E[1;5P, kf26=\E[1;5Q, kf27=\E[1;5R, kf28=\E[1;5S,
+	kf29=\E[15;5~, kf3=\EOR, kf30=\E[17;5~, kf31=\E[18;5~,
+	kf32=\E[19;5~, kf33=\E[20;5~, kf34=\E[21;5~,
+	kf35=\E[23;5~, kf36=\E[24;5~, kf4=\EOS, kf5=\E[15~,
+	kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, khome=\EOH,
+	kich1=\E[2~, kind=\E[1;2B, knp=\E[6~, kpp=\E[5~,
+	kri=\E[1;2A, op=\E[39;49m, rc=\E8, rev=\E[7m, ri=\EM,
+	rmacs=\E(B, rmam=\E[?7l, rmir=\E[4l, rmkx=\E[?1l,
+	rmso=\E[27m, rmul=\E[24m, rs1=\E]\E\\\Ec, sc=\E7,
+	sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;
+	    %?%p1%p3%|%t;7%;m,
+	sgr0=\E(B\E[m, smacs=\E(0, smam=\E[?7h, smir=\E[4h,
+	smkx=\E[?1h, smso=\E[7m, smul=\E[4m, tbc=\E[3g,
+	vpa=\E[%i%p1%dd, Smulx=\E[4:%p1%dm, use=ansi+enq,
+	use=ansi+rep, use=xterm+sm+1006, use=ecma+index,
+	use=xterm+pcfkeys, use=xterm+sl-twm,
+	use=ecma+strikeout, use=ecma+italics,
+	use=xterm+alt1049, use=att610+cvis, use=xterm+tmux,
+	use=bracketed+paste,
+
+kitty+setal|set underline colors (nonstandard),
+	setal=\E[58:2::%p1%{65536}%/%d:%p1%{256}%/%{255}%&%d:%p1
+	      %{255}%&%dm,
+
+######## WAYLAND CLIENTS
+
+#### Foot
+# https://codeberg.org/dnkl/foot/
+# Version 1.8.2
+#
+# This identifies as a VT220 with 4=sixel and 22=color, however:
+# tack:
+#	bell does not work
+#	status-line does not work because foot does not set the window title
+#	sends escape when meta key is used, whether or not smm/rmm enabled
+# vttest:
+#	wrap-test fails
+#	no application-mode for numeric keypad (unless private mode 1035 is set)
+#	no NRCS
+#	no VT52
+#	no SRM
+#	protected areas do not work
+#	SU/SD work, SL/SR do not
+#	DECRPM responds, but not the corresponding ANSI reports.
+#	otherwise few reports, except cursor-position and mouse and some dtterm
+#	VT520 cursor-movement works, except for left/right margins
+#	supports xterm/DECSCUSR, though default case in vttest does not blink
+#		Send: <27> [ 0 <32> q 
+#		Text: The cursor should be a blinking rectangle
+#	partial support for xterm mouse any-event mode and button-event mode:
+#	+ does not report focus-in/focus-out
+#	+ does not report buttons 6/7
+#	alternate-screen works
+foot|foot terminal emulator,
+	oc=\E]104\E\\, use=xterm+256color2, use=foot+base,
+
+foot-direct|foot with direct color indexing,
+	use=xterm+direct, use=foot+base,
+
+foot+base|foot base fragment,
+	am, bce, bw, hs, mir, msgr, npc, xenl, AX, XT,
+	cols#80, it#8, lines#24,
+	acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[2J, cr=\r,
+	cub1=^H, cud1=\n, dim=\E[2m, ech=\E[%p1%dX, ed=\E[J, el=\E[K,
+	el1=\E[1K, flash=\E]555\E\\, ind=\n, invis=\E[8m,
+	is2=\E[!p\E[?3;4l\E[4l\E>, kbs=^?, kcbt=\E[Z,
+	oc=\E]104\E\\, op=\E[39;49m, rev=\E[7m, ri=\EM, rmacs=\E(B,
+	rmam=\E[?7l, rmkx=\E[?1l\E>, rmso=\E[27m, rmul=\E[24m,
+	rs1=\Ec, rs2=\E[!p\E[?3;4l\E[4l\E>,
+	sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;
+	    %?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m,
+	sgr0=\E(B\E[m, smacs=\E(0, smam=\E[?7h, smkx=\E[?1h\E=,
+	smso=\E[7m, smul=\E[4m, E3=\E[3J, use=att610+cvis,
+	use=ansi+csr, use=ansi+cup, use=ansi+enq, use=ansi+local,
+	use=ansi+idc, use=ansi+idl, use=ansi+rca2, use=ansi+rep,
+	use=ansi+tabs, use=ecma+index, use=ecma+italics,
+	use=ecma+strikeout, use=xterm+alt+title,
+	use=xterm+pcfkeys, use=xterm+sm+1006, use=xterm+tmux2,
+	use=xterm+sl-alt, use=bracketed+paste,
+
+######## WEB CLIENTS
+
+#### DomTerm
+# https://domterm.org
+#
+# Quoting its webpage:
+#	The domterm command runs a server that manages sessions (usually shell
+#	processes).  The user interface and terminal emulation is handled by a
+#	JavaScript library that can run in a regular web browser or an embedded
+#	browser such as Electron, using Web Sockets to talk to the server.
+#
+# it can connect to, and display in, a web browser, or as a standalone Qt
+# application.  Either way, it displays in the current desktop session.
+#
+# Testing current code (2019/07/06) with Fedora 30:
+# tack
+#	no flash
+#	no beep
+#	no dim
+#	no blink
+#	no invis
+#	no italics
+#	ok smxx/rmxx
+#	bce screen shows diagonal lines...
+#	kf6 sends nothing
+#	kf11 toggles maximize
+#	cursor-key application mode works
+#	numeric keypad application does not work; keys always send face-codes
+#	sends utf-8 for meta, like xterm
+# vttest
+#	has problems with menu #1 (wrapping)
+#	DA = VT200 with 132 columns, color
+#	DA2 = 990, 100300 ("\E[>990;100300;0c")
+#	no VT52, no double-size characters
+#	vt220 ECH test works, SRM, DECSCA do not
+#	S7C1T/S8C1t does not work
+#	DECUDK does not work
+#	CNL does not work; the other ECMA-48 cursor-movement tests work
+#	REP sort-of works (does not match xterm)
+#	SD/SU work, but not SL/SR
+#	window reporting: works for size in chars/pixels, but not other tests
+#	X10 mouse clicks work -- but return 4 rather than 1 for codes
+#	any-event mouse mode acts like any-button mode
+#	implements SGR mouse-mode
+# other:
+#	does not implement initc
+#	does accept either colons or semicolon in 38/48 SGR.
+domterm|DomTerm web client,
+	npc,
+	bel@, blink@, dim@, invis@, kcbt=\E[Z, ritm@, rmkx=\E[?1l,
+	sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|
+	    %t;7%;m,
+	sitm@, smkx=\E[?1h, use=xterm+256setaf, use=ecma+index,
+	use=xterm+sm+1006, use=xterm+pcfkeys, use=xterm-basic,
+	use=bracketed+paste,
+
+######## UNIX VIRTUAL TERMINALS, VIRTUAL CONSOLES, AND TELNET CLIENTS
+#
+
+# Columbus UNIX virtual terminal. This terminal also appears in
+# UNIX 4.0 and successors as line discipline 1 (?), but is
+# undocumented and does not really work quite right.
+cbunix|cb unix virtual terminal,
+	OTbs, am, da, db,
+	cols#80, lines#24, lm#0,
+	bel=^G, clear=\EL, cr=\r, cub1=^H, cud1=\n, cuf1=\EC,
+	cup=\EG%p2%c%p1%c, cuu1=\EA, dch1=\EM, dl1=\EN, ed=\EL,
+	el=\EK, ich1=\EO, il1=\EP, ind=\n, kcub1=\ED, kcud1=\EB,
+	kcuf1=\EC, kcuu1=\EA, khome=\EE, rmso=\Eb^D, rmul=\Eb^A,
+	smso=\Ea^D, smul=\Ea^A,
+# (vremote: removed obsolete ":nl@:" -- esr)
+vremote|virtual remote terminal,
+	am@,
+	cols#79, use=cbunix,
+
+pty|4bsd pseudo teletype,
+	cup=\EG%p1%{32}%+%c%p2%{32}%+%c, rmso=\Eb$, rmul=\Eb!,
+	smso=\Ea$, smul=\Ea!, use=cbunix,
+
+#### Emacs
+
+# https://www.emacswiki.org/emacs/AnsiTerm
+# https://github.com/emacs-mirror/emacs/blob/master/lisp/term.el
+#
+# The codes supported by the term.el terminal emulation in GNU Emacs 19.30
+eterm|GNU Emacs term.el terminal emulation,
+	am, mir, xenl,
+	cols#80, lines#24,
+	bel=^G, bold=\E[1m, clear=\E[H\E[J, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M, ed=\E[J,
+	el=\E[K, el1=\E[1K, home=\E[H, ht=^I, ich=\E[%p1%d@,
+	il=\E[%p1%dL, il1=\E[L, ind=\n, rev=\E[7m, rmir=\E[4l,
+	rmso=\E[m, rmul=\E[m, sgr0=\E[m, smir=\E[4h, smso=\E[7m,
+	smul=\E[4m, use=xterm+alt47, use=ansi+cpr,
+
+# The codes supported by the term.el terminal emulation in GNU Emacs 22.2
+eterm-color|Emacs term.el terminal emulator term-protocol-version 0.96,
+	msgr,
+	colors#8, pairs#64,
+	blink=\E[5m, il=\E[%p1%dL, il1=\E[L, ind=\n, invis=\E[8m,
+	kbs=^?, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
+	op=\E[39;49m, rc=\E8, ri=\EM, rmso=\E[27m, rmul=\E[24m,
+	rs1=\Ec, sc=\E7, setab=\E[%p1%'('%+%dm,
+	setaf=\E[%p1%{30}%+%dm,
+	sgr=\E[0%?%p1%p3%|%t;7%;%?%p2%t;4%;%?%p4%t;5%;%?%p6%t;1%;%?
+	    %p7%t;8%;m,
+	sgr0=\E[m, use=vt220+pcedit, use=eterm,
+
+# shell.el can "do" color, though not nearly as well.
+#
+# seen here:
+# http://unix.stackexchange.com/questions/237943/changing-colors-used-by-ls-does-not-work-in-emacs-shell-mode
+#
+# and
+# https://lists.gnu.org/archive/html/bug-gnu-emacs/2012-08/msg00481.html
+# https://github.com/emacs-mirror/emacs/blob/master/lisp/shell.el
+# https://github.com/emacs-mirror/emacs/blob/master/lisp/ansi-color.el
+#
+# however, as tested with Emacs 24.5.1, the result is buggy, losing overlays
+# frequently.  The contemporaneous term.el aka ansi-term does not "support"
+# italics but does not lose the color information -TD 2017/01/28.
+dumb-emacs-ansi|Emacs dumb terminal with ANSI color codes,
+	am, hc,
+	colors#8, it#8, ncv#13, pairs#64,
+	bold=\E[1m, cud1=\n, ht=^I, ind=\n, op=\E[39;49m,
+	rmul=\E[24m, setab=\E[4%p1%dm, setaf=\E[3%p1%dm,
+	sgr0=\E[m, smul=\E[4m, use=ecma+italics,
+
+#### Screen
+
+# Entries for use by the `screen' program by Juergen Weigert,
+# Michael Schroeder, Oliver Laumann.  The screen and
+# screen-w entries came with version 3.7.1.  The screen2 and screen3 entries
+# come from University of Wisconsin and may be older.
+# (screen: added <cnorm> on ANSI model -- esr)
+#
+# 'screen' defines extensions to termcap.  Some are used in its terminal
+# description:
+#      G0   (bool)  Terminal can deal with ISO 2022  font  selection sequences.
+#      AX   (bool)  Does  understand ANSI set default fg/bg color
+#                   (\E[39m / \E[49m).
+#      S0   (str)   Switch charset 'G0' to the specified charset.
+#      E0   (str)   Switch charset 'G0' back to standard charset.
+#
+# Initially tested with screen 3.09.08
+#
+# According to its manual page
+#
+#      Screen is a full-screen window manager that multiplexes a physical
+#      terminal between several processes (typically interactive shells).  Each
+#      virtual terminal provides the functions of a DEC VT100 terminal and, in
+#      addition, several control functions from the ISO 6429 (ECMA 48, ANSI
+#      X3.64) and ISO 2022 standards (e.g.  insert/delete line and support for
+#      multiple character sets).
+#
+# However, there is a design error in its support for video highlights.  The
+# program uses a table (rendlist) which equates the SGR codes to terminal
+# capabilities.  That, and color-decoding are hardcoded in screen; its behavior
+# is modified only by the presence or absence of the corresponding capabilities.
+# Not by their values.
+#
+# If screen sets the TERMCAP variable, it uses hardcoded strings which
+# correspond to the rendlist table.
+#
+# The table gives this information:
+#
+#	SGR	capability
+#	---	---------
+#	1	bold
+#	2	dim
+#	3	standout
+#	4	underline
+#	5	blink
+#	-	(unused 6)
+#	7	reverse
+#	-	(unused 8-21)
+#	22	reset bold, standout and dim
+#	23	reset standout
+#	24	reset underline
+#	25	reset blink
+#	-	(unused 26)
+#	27	reset reverse
+#
+# ECMA-48 differs from this: 3 and 23 set and reset italics, respectively.
+# ECMA-48 does not define "standout" - that is a termcap/terminfo abstraction.
+# Without some redesign of screen, it is not possible to extend the set of
+# capabilities.  Substitution would be possible, e.g., sending italics in
+# place of underline.
+#
+# Because screen uses hard-coded parsing, it does not check if two capabilities
+# use the same value.  For example, changing standout to be the same as any of
+# the other capabilities will confuse screen.  Curses applications which use
+# sgr are not impacted (because that usually resets all capabilities before
+# setting any), but termcap applications do not use sgr -TD
+#
+# The "screen" entry should use ecma+index rather than just indn, but tmux
+# defaults to using "screen".  For background, screen supported ecma+index
+# since 1994 (i.e., screen 3.0.5), stating that it was an obscure code used by
+# the (Siemens Nixdorf) 97801 terminal.  It was not shown in the termcap or
+# terminfo entries (which list about 60% of the control sequences).
+screen-base|VT 100/ANSI X3.64 virtual terminal (base),
+	OTbs, OTpt, am, km, mir, msgr, xenl, G0,
+	colors#8, cols#80, it#8, lines#24, ncv@, pairs#64, U8#1,
+	acsc=++\,\,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxy
+	     yzz{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, civis=\E[?25l,
+	clear=\E[H\E[J, cnorm=\E[34h\E[?25h, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\EM,
+	cvvis=\E[34l, dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m,
+	dl=\E[%p1%dM, dl1=\E[M, ed=\E[J, el=\E[K, el1=\E[1K,
+	enacs=\E(B\E)0, flash=\Eg, home=\E[H, hpa=\E[%i%p1%dG,
+	ht=^I, hts=\EH, ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[L,
+	ind=\n, indn=\E[%p1%dS, is2=\E)0, kbs=^H, kcbt=\E[Z,
+	kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kf1=\EOP,
+	kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf2=\EOQ, kf3=\EOR,
+	kf4=\EOS, kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~,
+	kf9=\E[20~, kmous=\E[M, nel=\EE, rc=\E8, rev=\E[7m, ri=\EM,
+	rmacs=^O, rmir=\E[4l, rmkx=\E[?1l\E>, rmso=\E[23m,
+	rmul=\E[24m, rs2=\Ec\E[?1000l\E[?25h, sc=\E7,
+	sgr=\E[0%?%p6%t;1%;%?%p1%t;3%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;
+	    5%;%?%p5%t;2%;m%?%p9%t\016%e\017%;,
+	sgr0=\E[m\017, smacs=^N, smir=\E[4h, smkx=\E[?1h\E=,
+	smso=\E[3m, smul=\E[4m, tbc=\E[3g, vpa=\E[%i%p1%dd,
+	E0=\E(B, S0=\E(%p1%c, use=vt220+pcedit,
+	use=xterm+alt1049, use=ecma+color, use=vt100+enq,
+
+screen|VT 100/ANSI X3.64 virtual terminal,
+	use=screen4,
+
+no+brackets|cancel bracketed paste,
+	BD@, BE@, PE@, PS@,
+
+# The bce and status-line entries are from screen 3.9.13 (and require some
+# changes to .screenrc).
+screen-bce|VT 100/ANSI X3.64 virtual terminal with bce,
+	bce,
+	ech@, use=screen,
+screen-s|VT 100/ANSI X3.64 virtual terminal with hardstatus line,
+	dsl=\E_\E\\, fsl=\E\\, tsl=\E_, use=screen,
+
+# ======================================================================
+# Entries for GNU Screen with 16 colors.
+# Those variations permit to benefit from 16 colors palette, and from
+# bold font and blink attribute separated from bright colors. But they
+# are less portable than the generic "screen" 8 color entries: Their
+# usage makes real sense only if the terminals you attach and reattach
+# do all support 16 color palette.
+
+screen-16color|GNU Screen with 16 colors,
+	use=ibm+16color, use=screen,
+
+screen-16color-s|GNU Screen with 16 colors and status line,
+	use=ibm+16color, use=screen-s,
+
+screen-16color-bce|GNU Screen with 16 colors and BCE,
+	use=ibm+16color, use=screen-bce,
+
+screen-16color-bce-s|GNU Screen with 16 colors using BCE and status line,
+	bce, use=ibm+16color, use=screen-s,
+
+# ======================================================================
+# Entries for GNU Screen 4.02 with --enable-colors256.
+
+screen-256color|GNU Screen with 256 colors,
+	use=xterm+256setaf, use=screen,
+
+screen-256color-s|GNU Screen with 256 colors and status line,
+	use=xterm+256setaf, use=screen-s,
+
+screen-256color-bce|GNU Screen with 256 colors and BCE,
+	bce, use=xterm+256setaf, use=screen-bce,
+
+screen-256color-bce-s|GNU Screen with 256 colors using BCE and status line,
+	bce, use=xterm+256setaf, use=screen-s,
+
+screen.xterm-256color|GNU Screen with xterm using 256 colors,
+	use=xterm+256setaf, use=screen.xterm-new,
+
+screen.konsole-256color|GNU Screen with konsole using 256 colors,
+	use=xterm+256setaf, use=screen.konsole,
+
+screen.vte-256color|GNU Screen with vte using 256 colors,
+	use=xterm+256setaf, use=screen.vte,
+
+screen.putty-256color|GNU Screen with putty using 256 colors,
+	use=xterm+256setaf, use=screen.putty,
+
+screen.mlterm-256color|GNU Screen with mlterm using 256 colors,
+	use=xterm+256setaf, use=screen.mlterm,
+
+# ======================================================================
+
+# Read the fine manpage:
+#       When  screen  tries  to  figure  out  a  terminal name for
+#       itself, it first looks for an entry named "screen.<term>",
+#       where  <term>  is the contents of your $TERM variable.  If
+#       no such entry exists, screen tries "screen" (or "screen-w"
+#       if the terminal is wide (132 cols or more)).  If even this
+#       entry cannot be found, "vt100" is used as a substitute.
+#
+# Notwithstanding the manpage, screen uses its own notion of the termcap
+# and some keys from "screen.<term>" are ignored.  Here is an entry which
+# covers those (tested with screen 4.00.02) -TD
+screen+fkeys|function-keys according to screen,
+	kend=\E[4~, kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kfnd@,
+	khome=\E[1~, kslt@,
+
+# See explanation before "screen" entry.  Cancel italics so that applications
+# do not assume screen supports the feature.  Add this tweak to entries which
+# extend screen for terminals which do support italics.
+screen+italics|screen cannot support italics,
+	ritm@, sitm@,
+#
+# Here are a few customized entries which are useful -TD
+#
+# Notes:
+# (a)	screen does not support invis.
+# (b)	screen's implementation of bw is incorrect according to tack.
+# (c)	screen appears to hardcode the strings for khome/kend, making it
+#	necessary to override the "use=" clause's values (screen+fkeys).
+# (d)	screen sets $TERMCAP to a termcap-formatted copy of the 'screen' entry,
+#	which is NOT the same as the terminfo screen.<term>.
+# (e)	when screen finds one of these customized entries, it sets $TERM to
+#	match.  Hence, no "screen.xterm" entry is provided, since that would
+#	create heartburn for people running remote xterm's.
+# (f)   screen does not support rep.
+# (g)	the xterm-new compatibility does not include bracketed paste.
+#
+#	xterm (-xfree86 or -r6) does not normally support kIC, kNXT and kPRV
+#	since the default translations override the built-in keycode
+#	translation.  They are suppressed here to show what is tested by tack.
+screen.xterm-xfree86|screen.xterm-new|screen customized for modern xterm,
+	bce@, bw, npc,
+	invis@, kIC@, kNXT@, kPRV@, kcbt=\E[Z, kent=\EOM, meml@, memu@,
+	nel=\EE, rep@,
+	sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|
+	    %t;7%;%?%p4%t;5%;%?%p5%t;2%;m,
+	E3@, use=screen+italics, use=screen+fkeys,
+	use=xterm+x11mouse, use=ecma+index, use=ansi+rep,
+	use=ecma+strikeout, use=xterm+pcfkeys,
+	use=xterm+nofkeys,
+
+# Don't use this, because not everyone has "screen.xterm-new":
+#:screen.xterm|screen for modern xterm,
+#:	use=screen.xterm-new,
+
+# xterm-r6 does not really support khome/kend unless it is propped up by
+# the translations resource.
+screen.xterm-r6|screen customized for X11R6 xterm,
+	bw, use=xterm+x11mouse, use=screen+fkeys, use=xterm-r6,
+# Color applications running in screen and TeraTerm do not play well together
+# on Solaris because Sun's curses implementation gets confused.
+screen.teraterm|disable ncv in teraterm,
+	ncv#127,
+	acsc=+\020\,\021-\030.^Y0\333`\004a\261f\370g\361h\260i
+	     \316j\331k\277l\332m\300n\305o~p\304q\304r\304s_t\303u
+	     \264v\301w\302x\263y\363z\362{\343|\330}\234~\376,
+	use=screen+fkeys, use=xterm+x11mouse, use=screen,
+# Other terminals
+screen.rxvt|screen in rxvt,
+	bw, XT,
+	cvvis@, flash@, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC,
+	kcuu1=\EOA, use=screen+fkeys, use=vt100+enq,
+	use=rxvt+pcfkeys, use=xterm+x11mouse, use=vt220+keypad,
+	use=screen,
+screen.Eterm|screen in Eterm,
+	use=xterm+x11mouse, use=screen+fkeys, use=Eterm,
+screen.mrxvt|screen in mrxvt,
+	use=xterm+x11mouse, use=screen+fkeys, use=mrxvt,
+screen.vte|screen in any VTE-based terminal,
+	use=xterm+x11mouse, use=screen+italics,
+	use=screen+fkeys, use=no+brackets, use=vte,
+screen.gnome|screen in GNOME Terminal,
+	use=xterm+x11mouse, use=screen+italics,
+	use=screen+fkeys, use=no+brackets, use=gnome,
+screen.konsole|screen in KDE console window,
+	use=xterm+x11mouse, use=screen+italics,
+	use=screen+fkeys, use=no+brackets, use=konsole,
+# fix the backspace key
+screen.linux|screen.linux-s|screen in Linux console,
+	bw,
+	kbs=^?, kcbt@, use=linux+sfkeys, use=xterm+x11mouse,
+	use=screen+fkeys, use=screen,
+screen.mlterm|screen in mlterm,
+	use=xterm+x11mouse, use=screen+fkeys, use=no+brackets,
+	use=mlterm,
+screen.putty|screen in putty,
+	use=xterm+x11mouse, use=screen+fkeys, use=no+brackets,
+	use=putty,
+
+# The default "screen" entry is reasonably portable, but not optimal for the
+# most widely-used terminal emulators.  The "bce" capability is supported in
+# screen since 3.9.13, and when used, will require fewer characters to be sent
+# to the terminal for updates.
+#
+# If you are using only terminals which support bce, then you can use this
+# feature in your screen configuration.
+#
+# Adding these lines to your ".screenrc" file will allow using these customized
+# entries:
+#	term screen-bce
+#	bce on
+#	defbce on
+screen-bce.xterm-new|screen optimized for modern xterm,
+	bce,
+	ech@, use=screen+italics, use=screen.xterm-new,
+screen-bce.rxvt|screen optimized for rxvt,
+	bce,
+	ech@, use=screen.rxvt,
+screen-bce.Eterm|screen optimized for Eterm,
+	bce,
+	ech@, use=screen.Eterm,
+screen-bce.mrxvt|screen optimized for mrxvt,
+	bce,
+	ech@, use=screen.mrxvt,
+screen-bce.gnome|screen optimized for GNOME-Terminal,
+	bce,
+	ech@, use=screen+italics, use=screen.gnome,
+screen-bce.konsole|screen optimized for KDE console window,
+	bce,
+	ech@, use=screen+italics, use=screen.konsole,
+screen-bce.linux|screen optimized for Linux console,
+	bce,
+	ech@, use=screen.linux,
+
+screen-w|VT 100/ANSI X3.64 virtual terminal with 132 cols,
+	cols#132, use=screen,
+
+screen2|VT 100/ANSI X3.64 virtual terminal (old 2.x),
+	cols#80, it#8, lines#24,
+	cbt=\E[Z, clear=\E[2J\E[H, cr=\r, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\E[B, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M, ed=\E[J,
+	el=\E[K, ht=^I, hts=\EH, ich=\E[%p1%d@, ich1=, il=\E[%p1%dL,
+	il1=\E[L, ind=\n, kbs=^H, kcub1=\ED, kcud1=\EB, kcuf1=\EC,
+	kcuu1=\EA, kf0=\E~, kf1=\ES, kf2=\ET, kf3=\EU, kf4=\EV,
+	kf5=\EW, kf6=\EP, kf7=\EQ, kf8=\ER, kf9=\E0I, khome=\EH,
+	nel=\r\n, rc=\E8, ri=\EM, rmir=\E[4l, rmso=\E[23m,
+	rmul=\E[24m, rs1=\Ec, sc=\E7, sgr0=\E[m, smir=\E[4h,
+	smso=\E[3m, smul=\E[4m, tbc=\E[3g,
+# (screen3: removed unknown ":xv:LP:G0:" -- esr)
+screen3|VT 100/ANSI X3.64 virtual terminal (old 3.x),
+	km, mir, msgr,
+	cols#80, it#8, lines#24,
+	bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, clear=\E[H\E[J,
+	cr=\r, csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\EM,
+	dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M, ed=\E[J,
+	el=\E[K, home=\E[H, ht=^I, hts=\EH, ich=\E[%p1%d@,
+	il=\E[%p1%dL, il1=\E[L, ind=\n, is2=\E)0, kbs=^H, kcub1=\EOD,
+	kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kf1=\EOP, kf2=\EOQ,
+	kf3=\EOR, kf4=\EOS, nel=\EE, rc=\E8, rev=\E[7m, ri=\EM,
+	rmir=\E[4l, rmkx=\E>, rmso=\E[23m, rmul=\E[24m, rs1=\Ec,
+	sc=\E7, sgr0=\E[m, smir=\E[4h, smkx=\E=, smso=\E[3m,
+	smul=\E[4m, tbc=\E[3g,
+
+# screen 4.0 was released 2003-07-21, and as of March 2019, its terminfo file
+# was last updated in 2009 to include 256-color support.  The most recent
+# release is 4.6.2 (October 2017).
+screen4|VT 100/ANSI X3.64 virtual terminal (4.x),
+	use=ecma+index, use=screen-base,
+
+# As of December 2022, screen 5.0 has not been released.
+#
+# However,
+#
+#	https://savannah.gnu.org/bugs/?36676
+#
+# mentions a change to implement italics which should be in a version 5,
+# (implemented 2016-11-05, but merged 2017-07-09).  That does away with the
+# longstanding use of SGR 3 for standout, and interprets it as italics.
+#
+# The same development branch has some support for direct-colors, but none
+# of this has been documented.
+screen5|VT 100/ANSI X3.64 virtual terminal (someday),
+	rmso=\E[27m,
+	sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?
+	    %p5%t;2%;m%?%p9%t\016%e\017%;,
+	smso=\E[7m, use=ecma+italics, use=ecma+index,
+	use=screen-base,
+
+#### Tmux
+
+# tmux is mostly compatible with screen, but has support for italics, and some
+# of the xterm cursor bits.
+#
+# However, unlike screen, tmux has no provision for using derived terminal
+# descriptions.  When screen starts, it looks for a suitable "inner" terminal
+# such as "screen.$TERM" to correspond to the outer terminal's quirks.  The
+# various entries such as screen.xterm-new provide a way to more closely
+# match the terminal.
+tmux|tmux terminal multiplexer,
+	invis=\E[8m, kbs=^?, rmso=\E[27m,
+	sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?
+	    %p5%t;2%;%?%p7%t;8%;m%?%p9%t\016%e\017%;,
+	smso=\E[7m, E3=\E[3J, Smulx=\E[4:%p1%dm,
+	use=ecma+italics, use=ecma+strikeout, use=xterm+edit,
+	use=xterm+pcfkeys, use=xterm+sl, use=xterm+tmux,
+	use=screen, use=bracketed+paste,
+
+tmux-256color|tmux with 256 colors,
+	use=xterm+256setaf, use=tmux,
+
+tmux-direct|tmux with direct-color indexing,
+	use=kitty+setal, use=xterm+direct, use=tmux,
+
+#### Mosh
+# https://mosh.org/
+# mosh 1.3.2
+#
+# mosh's DA1 identifies it as a VT220, but sets $TERM to "xterm" or
+# "xterm-256color" (hard-coded), which in its pretense that it is xterm, is
+# several years out of date.
+#
+# There is little documentation; the existing manpages amount to a quarter of
+# the length of mosh.org's heavily promotional website.  This entry is based
+# on testing, and reading the source-code.  For the latter, analysis is aided
+# by the developer's extensive use of hard-coded strings.
+#
+# The website has an example "Tricky unicode", which shows a shell command
+# with a typo (i.e., assuming that a byte in octal uses 4 digits) and suggests
+# that mosh and OS X Terminal "gets it right".
+#
+# The example as shown would not work.  Correcting the typo, xterm gives the
+# result expected by the mosh developer.
+#
+# The other examples follow in a similar vein.
+#
+# It does not support these xterm features:
+#	use=ansi+rep (xterm patch #36, 1997)
+#	use=ecma+strikeout (xterm patch #305, 2014)
+#	use=vt420+lrmm (xterm patch #279, 2012)
+#	titlestack in smcup/rmcup has no effect (xterm patch #251, 2009)
+#	does not support "dim" (xterm patch #305, 2014)
+# In tack
+#	rmkx/smkx has no effect on numeric keypad
+#	acs stuff has no effect, is included here for ease of comparison
+#
+# Unlike screen and tmux, mosh has only limited awareness of a terminal
+# description.  It assumes that the underlying terminal is xterm, and would
+# not work well with terminals using other key-definitions, such as urxvt.
+mosh|mobile shell,
+	U8#1,
+	sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|
+	    %t;7%;%?%p4%t;5%;%?%p7%t;8%;m,
+	sgr0=\E(B\E[m, use=ansi+enq, use=xterm+meta,
+	use=ecma+italics, use=ecma+index, use=xterm+acs,
+	use=xterm+sm+1006, use=xterm+pcfkeys,
+	use=xterm-xfree86, use=bracketed+paste,
+
+mosh-256color|mosh using 256-colors,
+	use=xterm+256color, use=mosh,
+
+#### Dvtm
+
+# dvtwm 0.15
+# http://www.brain-dump.org/projects/dvtm/
+#
+# + This uses ncurses to manage the display, including support for italics and
+#   default-colors.
+# + However, default-colors are incomplete: do not set bce.
+# + It does not implement flash (since no \e[?5h)
+# + Do not set XT: dvtm knows about OSC 0 and 2, but not 1.
+#   Oddly enough, if $TERM contains "linux", it attempts to set the title.
+# + Some of the program is cut/paste from rxvt-unicode, e.g., the ACS table.
+# + The built-in table of function-keys (based on rxvt) is incomplete (ends
+#   with kf22).
+# + It also omits the shifted cursor- and editing-keypad keys.
+#   However, it is confused by xterm's shifted cursor- and editing-keypad keys
+#   (and passes those through without interpretation)
+#   and may simply pass-through rxvt's, making it appear to work.
+#   In other cases such as kf23 and up, no pass-through is done.
+# + Most of the mode-settings in the initialization/reset strings are not
+#   implemented; dvtm copies its description from rxvt.
+dvtm|dynamic virtual terminal manager,
+	am, eo, mir, msgr, xenl, AX,
+	colors#8, cols#80, it#8, lines#24, ncv@, pairs#64,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[2J, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	dl=\E[%p1%dM, dl1=\E[M, ed=\E[J, el=\E[K, el1=\E[1K,
+	enacs=\E(B\E)0, home=\E[H, hpa=\E[%i%p1%dG, ht=^I, hts=\EH,
+	ich=\E[%p1%d@, ich1=\E[@, il=\E[%p1%dL, il1=\E[L, ind=\n,
+	is1=\E[?47l\E=\E[?1l,
+	is2=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l,
+	kDC=\E[3$, kEND=\E[8$, kHOM=\E[7$, kIC=\E[2$, kLFT=\E[d,
+	kNXT=\E[6$, kPRV=\E[5$, kRIT=\E[c, ka1=\EOw, ka3=\EOy,
+	kb2=\EOu, kbs=^?, kc1=\EOq, kc3=\EOs, kcbt=\E[Z, kcub1=\E[D,
+	kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kel=\E[8\^, kend=\E[8~,
+	kent=\EOM, kf0=\E[21~, kf1=\E[11~, kf10=\E[21~,
+	kf11=\E[23~, kf12=\E[24~, kf13=\E[25~, kf14=\E[26~,
+	kf15=\E[28~, kf16=\E[29~, kf17=\E[31~, kf18=\E[32~,
+	kf19=\E[33~, kf2=\E[12~, kf20=\E[34~, kf21=\E[23$,
+	kf22=\E[24$, kf3=\E[13~, kf4=\E[14~, kf5=\E[15~,
+	kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~,
+	khome=\E[7~, kind=\E[a, kmous=\E[M, kri=\E[b, op=\E[39;49m,
+	rc=\E8, rev=\E[7m, ri=\EM, rmacs=^O, rmir=\E[4l, rmso=\E[27m,
+	rmul=\E[24m,
+	rs1=\E>\E[1;3;4;5;6l\E[?7h\E[m\E[r\E[2J\E[H,
+	rs2=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l\E>\E[?1000l\E[?
+	    25h,
+	s0ds=\E(B, s1ds=\E(0, sc=\E7, setab=\E[4%p1%dm,
+	setaf=\E[3%p1%dm,
+	sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?
+	    %p9%t\016%e\017%;,
+	sgr0=\E[m\017, smacs=^N, smir=\E[4h, smso=\E[7m,
+	smul=\E[4m, tbc=\E[3g, vpa=\E[%i%p1%dd, use=xterm+alt47,
+	use=vt220+vtedit, use=vt220+cvis, use=ecma+italics,
+
+dvtm-256color|dynamic virtual terminal manager with 256 colors,
+	colors#0x100, pairs#0x10000,
+	setab=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;
+	      5;%p1%d%;m,
+	setaf=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5
+	      ;%p1%d%;m,
+	use=dvtm,
+
+#### NCSA Telnet
+
+# Francesco Potorti <F.Potorti@cnuce.cnr.it>:
+# NCSA telnet is one of the most used telnet clients for the Macintosh.  It has
+# been maintained until recently by the National Center for Supercomputer
+# Applications, and it is feature rich, stable and free.  It can be downloaded
+# from www.ncsa.edu.  This terminfo description file is based on xterm-vt220,
+# xterm+sl, and the docs at NCSA.  It works well.
+#
+# NCSA Telnet 2.6 for Macintosh in VT220 8-bit emulation mode
+# The terminal options should be set as follows:
+#         Xterm sequences ON
+#         use VT wrap mode ON
+#         use Emacs arrow keys OFF
+#         CTRL-COMND is Emacs meta ON
+#         8 bit mode ON
+#         answerback string: "ncsa-vt220-8"
+#         setup keys: all disabled
+#
+# Application mode is not used.
+#
+# Other special mappings:
+#	Apple		VT220
+#	HELP		Find
+#	HOME		Insert here
+#	PAGEUP		Remove
+#	DEL		Select
+#	END		Prev Screen
+#	PAGEDOWN	Next Screen
+#
+# Though it supports ANSI color, NCSA Telnet uses color to represent blinking
+# text.
+#
+# The status-line manipulation is a mapping of the xterm-compatible control
+# sequences for setting the window-title.  So you must use tsl and fsl in
+# pairs, since the latter ends the string that is loaded to the window-title.
+ncsa-m|ncsa-vt220-8|NCSA Telnet 2.6 for Macintosh in VT220-8 mode,
+	am, km, mir, msgr, xenl,
+	acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[2J, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M, ed=\E[J,
+	el=\E[K, el1=\E[1K, enacs=\E)0,
+	flash=\E[?5h$<100/>\E[?5l, home=\E[H, ht=^I, hts=\EH,
+	ich=\E[%p1%d@, if=/usr/share/tabset/vt100,
+	il=\E[%p1%dL, il1=\E[L, ind=\n$<150*>,
+	is2=\E7\E[r\E[m\E[?7h\E[?1;4;6l\E[4l\E8\E>, kbs=^H,
+	kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A,
+	kdch1=\E[4~, kend=\E[5~, kf1=\E[17~, kf10=\E[28~,
+	kf11=\E[29~, kf12=\E[31~, kf13=\E[32~, kf14=\E[33~,
+	kf15=\E[34~, kf2=\E[18, kf3=\E[19~, kf4=\E[20~, kf5=\E[21~,
+	kf6=\E[23~, kf7=\E[24~, kf8=\E[25~, kf9=\E[26~, khlp=\E[1~,
+	khome=\E[2~, knp=\E[6~, kpp=\E[3~, mc4=\E[4i, mc5=\E[5i,
+	rc=\E8, rev=\E[7m, rf=/usr/share/tabset/vt100, ri=\EM,
+	rmacs=\E(B, rmam=\E[?7l, rmcup=\E[2J\E8, rmir=\E[4l,
+	rmso=\E[27m, rmul=\E[24m,
+	rs2=\E7\E[r\E8\E[m\E[?7h\E[?1;4;6l\E[4l\E>, sc=\E7,
+	sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p4%t;5%;%?%p1%p3%|%t;7%;m%?
+	    %p9%t\E(0%e\E(B%;,
+	sgr0=\E[m\E(B, smacs=\E(0, smam=\E[?7h, smcup=\E7,
+	smir=\E[4h, smso=\E[7m, smul=\E[4m, tbc=\E[3g,
+	u8=\E[?62;1;6c, use=vt220+cvis, use=xterm+sl,
+	use=ansi+enq,
+ncsa|NCSA Telnet 2.7 for Macintosh in VT220-8 mode (color),
+	use=ncsa-m, use=klone+color,
+ncsa-ns|NCSA Telnet 2.7 for Macintosh in VT220-8 mode (color w/o status line),
+	hs@,
+	dsl@, fsl@, tsl@, use=ncsa,
+ncsa-m-ns|NCSA Telnet 2.6 for Macintosh in VT220-8 mode (no status line),
+	hs@,
+	dsl@, fsl@, tsl@, use=ncsa-m,
+# alternate -TD:
+# The documented function-key mapping refers to the Apple Extended Keyboard
+# (e.g., NCSA Telnet's F1 corresponds to a VT220 F6).  We use the VT220-style
+# codes, however, since the numeric keypad (VT100) PF1-PF4 are available on
+# some keyboards and many applications require these as F1-F4.
+#
+ncsa-vt220|NCSA Telnet using VT220-compatible function keys,
+	kf1=\EOP, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~,
+	kf13=\E[25~, kf14=\E[26~, kf15=\E[28~, kf16=\E[29~,
+	kf17=\E[31~, kf18=\E[32~, kf19=\E[33~, kf2=\EOQ,
+	kf20=\E[34~, kf3=\EOR, kf4=\EOS, kf6=\E[17~, kf7=\E[18~,
+	kf8=\E[19~, kf9=\E[20~, use=ncsa,
+
+#### Pilot Pro Palm-Top
+#
+# Termcap for Top Gun Telnet and SSH on the Palm Pilot.
+# https://web.archive.org/web/20051103015726/http://www.ai/~iang/TGssh/
+pilot|tgtelnet|Top Gun Telnet on the Palm Pilot Professional,
+	OTbs, am, xenl,
+	cols#39, lines#16,
+	bel=^G, clear=\Ec, cr=\r, cub1=^H, cud1=\n,
+	cup=\Em%p1%{32}%+%c%p2%{32}%+%c, home=\Em\s\s, ht=^I,
+	ind=\n, kbs=^H, kcub1=^H, kcud1=\n, knp=^L, kpp=^K, nel=\Em~\s,
+	rmso=\EB, smso=\Eb,
+
+# From: Federico Bianchi <bianchi@www.arte.unipi.it>
+# These entries are for the Embeddable Linux Kernel System (ELKS)
+# project - an heavily stripped down Linux to be run on 16 bit
+# boxes or, eventually, to be used in embedded systems - and have been
+# adapted from the stock ELKS termcap. The project itself looks stalled,
+# and the latest improvements I know of date back to March 2000.
+#
+# To cope with the ELKS dumb console I added an "elks-glasstty" entry;
+# as an added bonus, this deals with all the capabilities common to
+# both VT52 and ANSI (or, eventually, "special") modes.
+
+elks-glasstty|ELKS glass-TTY capabilities,
+	OTbs, am,
+	cols#80, it#8, lines#25,
+	bel=^G, cr=\r, ht=^I, ind=\n, kbs=^H, kcub1=^H, kcud1=\n,
+	nel=\r\n,
+
+elks-vt52|ELKS VT52 console,
+	clear=\EH\EJ, cub1=\ED, cud1=\EB, cuf1=\EC,
+	cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, el=\EK,
+	home=\EH, use=elks-glasstty,
+
+elks-ansi|ELKS ANSI console,
+	clear=\E[H\E[2J, cub1=\E[D, cud1=\E[B, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, el=\E[K, home=\E[H,
+	rmso=\E[m, smso=\E[7m, use=elks-glasstty,
+
+# As a matter of fact, ELKS 0.0.83 on PCs defaults to ANSI emulation
+# instead of VT52, but the "elks" entry still refers to the latter.
+
+elks|default ELKS console,
+	use=elks-vt52,
+
+# Project SIBO (for Psion 3 palmtops) console is identical to the ELKS
+# one but in screen size
+
+sibo|ELKS SIBO console,
+	cols#61, it#8, lines#20, use=elks-vt52,
+
+######## COMMERCIAL WORKSTATION CONSOLES
+#
+
+#### Alpha consoles
+#
+
+# This is from the OSF/1 Release 1.0 termcap file
+pccons|pcconsole|ANSI (mostly) Alpha PC console terminal emulation,
+	am, xon,
+	cols#80, lines#25,
+	bel=^G, clear=\E[H\E[2J, cr=\r, cub1=^H, cud1=\n, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, dch1=\E[P, dl1=\E[M,
+	el=\E[K, home=\E[H, ht=^I, ich1=\E[@, il1=\E[L, kbs=^H,
+	kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, khome=\E[H,
+	nel=\r\n, rev=\E[7m, rmso=\E[m, sgr0=\E[m, smso=\E[7m,
+
+#### Sun consoles
+#
+
+# :is1: resets scrolling region in case a previous user had used "tset VT100"
+oldsun|Sun Microsystems Workstation console,
+	OTbs, am, km, mir, msgr,
+	cols#80, it#8, lines#34,
+	bel=^G, clear=^L, cr=\r, cub1=^H, cud1=\E[B, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, dch=\E[%p1%dP,
+	dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M, ed=\E[J, el=\E[K, ht=^I,
+	ich=\E[%p1%d@, ich1=\E[@, il=\E[%p1%dL, il1=\E[L, ind=\n,
+	is1=\E[1r, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A,
+	kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, khome=\E[H,
+	rmso=\E[m, sgr0=\E[m, smso=\E[7m,
+# From: Alexander Lukyanov <lav@video.yars.free.net>, 14 Nov 1995
+# <lines> capability later corrected by J.T. Conklin <jtc@cygnus.com>
+# SGR 1, 4 aren't supported - removed bold/underline (T.Dickey 17 Jan 1998)
+sun-il|Sun Microsystems console with working insert-line,
+	am, km, msgr,
+	cols#80, lines#34,
+	bel=^G, clear=^L, cr=\r, cub1=^H, cud1=\n, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, dch=\E[%p1%dP,
+	dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M, ed=\E[J, el=\E[K, ht=^I,
+	ich=\E[%p1%d@, ich1=\E[@, il=\E[%p1%dL, il1=\E[L, ind=\n,
+	kb2=\E[218z, kbs=^H, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C,
+	kcuu1=\E[A, kdch1=^?, kend=\E[220z, kf1=\E[224z,
+	kf10=\E[233z, kf11=\E[234z, kf12=\E[235z, kf2=\E[225z,
+	kf3=\E[226z, kf4=\E[227z, kf5=\E[228z, kf6=\E[229z,
+	kf7=\E[230z, kf8=\E[231z, kf9=\E[232z, khome=\E[214z,
+	kich1=\E[247z, knp=\E[222z, kopt=\E[194z, kpp=\E[216z,
+	kres=\E[193z, kund=\E[195z, rev=\E[7m, rmso=\E[m, rmul@,
+	rs2=\E[s, sgr=\E[0%?%p1%p3%|%t;7%;m, sgr0=\E[m,
+	smso=\E[7m, u8=\E[1t, u9=\E[11t,
+# On some versions of CGSIX framebuffer firmware (SparcStation 5), <il1>/<il>
+# flake out on the last line.  Unfortunately, without them the terminal has no
+# way to scroll.
+sun-cgsix|sun-ss5|Sun SparcStation 5 console,
+	il@, il1@, use=sun-il,
+# If you are using an SS5, change the sun definition to use sun-ss5.
+sun|sun1|sun2|Sun Microsystems Inc. workstation console,
+	use=sun-il,
+
+sun+sl|Sun Workstation window status line,
+	hs,
+	dsl=\E]l\E\\, fsl=\E\\, tsl=\E]l,
+
+# From: <john@ucbrenoir>  Tue Sep 24 13:14:44 1985
+sun-s|Sun Microsystems Workstation window with status line,
+	use=sun+sl, use=sun,
+sun-e-s|sun-s-e|Sun Microsystems Workstation with status hacked for emacs,
+	use=sun+sl, use=sun-e,
+sun-48|Sun 48-line window,
+	cols#80, lines#48, use=sun,
+sun-34|Sun 34-line window,
+	cols#80, lines#34, use=sun,
+sun-24|Sun 24-line window,
+	cols#80, lines#24, use=sun,
+sun-17|Sun 17-line window,
+	cols#80, lines#17, use=sun,
+sun-12|Sun 12-line window,
+	cols#80, lines#12, use=sun,
+sun-1|Sun 1-line window for sysline,
+	eslok, hs,
+	cols#80, lines#1,
+	dsl=^L, fsl=\E[K, tsl=\r, use=sun,
+sun-e|sun-nic|sune|Sun Microsystems Workstation without insert character,
+	ich1@, rmir@, smir@, use=sun,
+sun-c|sun-cmd|Sun Microsystems Workstation console with scrollable history,
+	lines#35,
+	rmcup=\E[>4h, smcup=\E[>4l, use=sun,
+sun-type4|Sun Workstation console with type 4 keyboard,
+	kcub1=\E[217z, kcud1=\E[221z, kcuf1=\E[219z,
+	kcuu1=\E[215z, use=sun-il,
+
+# Most of the current references to sun-color are from users wondering why this
+# is the default on install.  Details from reading the wscons manpage, adding
+# cub, etc., here (rather than in the base sun-il entry) since it is not clear
+# when those were added -TD (2005-05-28)
+#
+# According to wscons manpage, color is supported only on IA systems.
+# Sun's terminfo entry documents bold and smul/rmul capabilities, but wscons
+# does not list these.  It also sets ncv#3, however that corresponds to
+# underline and standout.
+#
+# Since the documentation and terminfo do not agree, see also current code at
+# https://web.archive.org/web/20091231042744/http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/uts/common/io/tem_safe.c
+#
+# That (actually a different driver which "supports" sun-color) also supports
+# these features:
+#	vpa=\E[%i%p1%dd
+#	hpa=\E[%i%p1%d`
+#	cbt=\E[Z
+#	dim=\E[2m
+#	blink=\E[5m
+# It supports bold, but not underline -TD (2009-09-19)
+sun-color|Sun Microsystems Workstation console with color support (IA systems),
+	colors#8, ncv#3, pairs#64,
+	bold=\E[1m, cub=\E[%p1%dD, cud=\E[%p1%dB, cuf=\E[%p1%dC,
+	cuu=\E[%p1%dA, home=\E[H, op=\E[0m, rs2=\E[s,
+	setab=\E[4%p1%dm, setaf=\E[3%p1%dm,
+	setb=\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}
+	     %=%t3%e%p1%d%;m,
+	setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}
+	     %=%t3%e%p1%d%;m,
+	sgr=\E[0%?%p6%t;1%;%?%p1%p3%|%t;7%;m, sgr0=\E[m,
+	smso=\E[7m, use=sun,
+
+#### Iris consoles
+#
+
+# (wsiris: this had extension capabilities
+#	:HS=\E7F2:HE=\E7F7:\
+#	:CT#2:CZ=*Bblack,red,green,yellow,blue,magenta,cyan,*Fwhite:
+# See the note on Iris extensions near the end of this file.
+# Finally, removed suboptimal <clear>=\EH\EJ and added <cud1> &
+# <flash> from BRL -- esr)
+wsiris|iris40|IRIS emulating a 40 line Visual 50 (approximately),
+	OTbs, OTnc, OTpt, am,
+	OTkn#3, cols#80, it#8, lines#40,
+	OTnl=\EB, bel=^G, clear=\Ev, cnorm=\E>, cub1=^H, cud1=\EB,
+	cuf1=\EC, cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA,
+	cvvis=\E;, dim=\E7F2, dl1=\EM, ed=\EJ, el=\EK,
+	flash=\E7F4\E7B1\013\E7F7\E7B0, home=\EH, ht=^I, il1=\EL,
+	ind=\n, is2=\E7B0\E7F7\E7C2\E7R3, kcub1=\ED, kcud1=\EB,
+	kcuf1=\EC, kcuu1=\EA, kf0=\E0, kf1=\E1, kf2=\E2, kf3=\E3,
+	kf4=\E4, kf5=\E5, kf6=\E6, kf7=\E7, kf8=\E8, kf9=\E9, ri=\EI,
+	rmso=\E0@, rmul=\E7R3\E0@, sgr0=\E7F7, smso=\E9P,
+	smul=\E7R2\E9P,
+
+#### NeWS consoles
+#
+# Console terminal windows under the NeWS (Sun's Display Postscript windowing
+# environment).   Note: these have nothing to do with Sony's News workstation
+# line.
+#
+
+# Entry for NeWS's psterm from Eric Messick & Hugh Daniel
+# (psterm: unknown ":sl=\EOl:el=\ENl:" removed -- esr)
+psterm|psterm-basic|NeWS psterm-80x34,
+	OTbs, am, hs, km, ul,
+	cols#80, it#8, lines#34,
+	blink=\EOb, bold=\EOd, clear=^L, csr=\EE%p1%d;%p2%d;,
+	cub1=\ET, cud1=\EP, cuf1=\EV, cup=\E%p1%d;%p2%d;, cuu1=\EY,
+	dch1=\EF, dl1=\EK, ed=\EB, el=\EC, flash=\EZ, fsl=\ENl,
+	home=\ER, ht=^I, il1=\EA, ind=\EW, is1=\EN*, kcub1=\E[D,
+	kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, ll=\EU, rc=^\, rev=\EOr,
+	ri=\EX, rmcup=\ENt, rmir=\ENi, rmso=\ENo, rmul=\ENu, sc=^],
+	sgr0=\EN*, smcup=\EOt, smir=\EOi, smso=\EOo, smul=\EOu,
+	tsl=\EOl,
+psterm-96x48|NeWS psterm 96x48,
+	cols#96, lines#48, use=psterm,
+psterm-90x28|NeWS psterm 90x28,
+	cols#90, lines#28, use=psterm,
+psterm-80x24|NeWS psterm 80x24,
+	cols#80, lines#24, use=psterm,
+# This is a faster termcap for psterm.  Warning:  if you use this termcap,
+# some control characters you type will do strange things to the screen.
+# (psterm-fast: unknown ":sl=^Ol:el=^Nl:" -- esr)
+psterm-fast|NeWS psterm fast version (flaky ctrl chars),
+	OTbs, am, hs, km, ul,
+	cols#80, it#8, lines#34,
+	blink=^Ob, bold=^Od, clear=^L, csr=\005%p1%d;%p2%d;,
+	cub1=^T, cud1=^P, cuf1=^V, cup=\004%p1%d;%p2%d;, cuu1=^Y,
+	dch1=^F, dl1=^K, ed=^B, el=^C, flash=^Z, fsl=^Nl, home=^R, ht=^I,
+	il1=^A, ind=^W, is1=^N*, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C,
+	kcuu1=\E[A, ll=^U, rc=^\, rev=^Or, ri=^X, rmcup=^Nt, rmir=^Ni,
+	rmso=^No, rmul=^Nu, sc=^], sgr0=^N*, smcup=^Ot, smir=^Oi,
+	smso=^Oo, smul=^Ou, tsl=^Ol,
+
+#### NeXT consoles
+#
+# Use `glasstty' for the Workspace application
+#
+
+# From: Dave Wetzel <dave@turbocat.snafu.de> 22 Dec 1995
+next|NeXT console,
+	am, xt,
+	cols#80, it#8, lines#24,
+	bel=^G, clear=^L, cr=\r, cub1=^H, cud1=\n, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, el=\E[K, home=\E[H,
+	ht=^I, ind=\n, kbs=^H, kcub1=^H, kcud1=\n, nel=\r\n,
+	rmso=\E[4;1m, sgr0=\E[m, smso=\E[4;2m,
+nextshell|NeXT Shell application,
+	am,
+	cols#80,
+	bel=^G, cr=\r, cub1=^H, cud1=\n, ht=^I, kbs=^H, kcub1=^H,
+	kcud1=\n, nel=\r\n,
+
+#### Sony NEWS workstations
+#
+
+# (news-unk: this had :KB=news: -- esr)
+news-unk|Sony NEWS VT100 emulator common entry,
+	OTbs, OTpt, am, xenl,
+	cols#80,
+	OTnl=\n, bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[2J,
+	cr=\r, csr=\E[%i%p1%d;%p2%dr, cub1=^H, cud1=\n, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, dl=\E[%p1%dM, dl1=\E[M,
+	ed=\E[J, el=\E[K, home=\E[H, ht=^I,
+	if=/usr/share/tabset/vt100, il=\E[%p1%dL, il1=\E[L,
+	is2=\E[?7h\E[?1h\E[?3l\E7\E8, kbs=^H, kcub1=\EOD,
+	kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kf0=\EOY, kf1=\EOP,
+	kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf5=\EOT, kf6=\EOU, kf7=\EOV,
+	kf8=\EOW, kf9=\EOX, rc=\E8, rev=\E[7m, ri=\EM,
+	rmkx=\E[?1l\E>, rmso=\E[m, rmul=\E[m,
+	rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h\E[r, sc=\E7,
+	sgr0=\E[m, smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m,
+#
+# (news-29: this had :TY=ascii: --esr)
+news-29|Sony NEWS VT100 emulator with 29 lines,
+	lines#29, use=news-unk,
+# (news-29-euc: this had :TY=euc: --esr)
+news-29-euc|Sony NEWS VT100 emulator with 29 lines and EUC,
+	use=news-29,
+# (news-29-sjis: this had :TY=sjis: --esr)
+news-29-sjis|Sony NEWS VT100 emulator with 29 lines and SJIS,
+	use=news-29,
+#
+# (news-33: this had :TY=ascii: --esr)
+news-33|Sony NEWS VT100 with 33 lines,
+	lines#33, use=news-unk,
+# (news-33-euc: this had :TY=euc: --esr)
+news-33-euc|Sony NEWS VT100 with 33 lines and EUC,
+	use=news-33,
+# (news-33-sjis: this had :TY=sjis: --esr)
+news-33-sjis|Sony NEWS VT100 with 33 lines and SJIS,
+	use=news-33,
+#
+# (news-42: this had :TY=ascii: --esr)
+news-42|Sony NEWS VT100 with 42 lines,
+	lines#42, use=news-unk,
+# (news-42-euc: this had :TY=euc: --esr)
+news-42-euc|Sony NEWS VT100 with 42 lines and EUC,
+	use=news-42,
+# (news-42-sjis: this had :TY=sjis: --esr)
+news-42-sjis|Sony NEWS VT100 with 42 lines and SJIS,
+	use=news-42,
+#
+#	NEWS-OS old termcap entry
+#
+# (news-old-unk: this had :KB=news:TY=sjis: --esr)
+news-old-unk|old Sony NEWS VT100 emulator common entry,
+	OTbs, OTpt, am, xenl,
+	cols#80, vt#3,
+	OTnl=\n, bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[;H\E[2J,
+	cr=\r, csr=\E[%i%p1%d;%p2%dr, cub1=^H, cud1=\n, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, ed=\E[J, el=\E[K,
+	home=\E[H, ht=^I, if=/usr/share/tabset/vt100, kbs=^H,
+	kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kf1=\EOP,
+	kf2=\EOQ, kf3=\EOR, kf4=\EOS, rc=\E8, rev=\E[7m, ri=\EM,
+	rmkx=\E[?1l\E>, rmso=\E[m, rmul=\E[m,
+	rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, sc=\E7,
+	sgr0=\E[m, smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m,
+#
+# (nwp512: this had :DE=^H:, which I think means <OTbs> --esr)
+nwp512|news|nwp514|news40|vt100-bm|nwp512-o|nwp514-o|news-o|news40-o|vt100-bm-o|old Sony VT100 emulator 40 lines,
+	OTbs,
+	lines#40,
+	is2=\E7\E[r\E8\EE\EE\EE\EM\EM\EM\E[?7h\E[?1l\E[?3l\E7\E[1;40
+	    r\E8,
+	use=news-old-unk,
+#
+# (nwp512-a: this had :TY=ascii: and the alias vt100-bm --esr)
+nwp512-a|nwp514-a|news-a|news42|news40-a|old Sony VT100 emulator 42 line,
+	lines#42,
+	is2=\E[?7h\E[?1l\E[?3l\E7\E[1;42r\E8,
+	use=news-old-unk,
+#
+# (nwp513: this had :DE=^H: and the alias vt100-bm --esr)
+nwp513|nwp518|nwe501|newscbm|news31|nwp513-o|nwp518-o|nwe501-o|nwp251-o|newscbm-o|news31-o|old Sony VT100 emulator 31 lines,
+	OTbs,
+	lines#31,
+	is2=\E7\E[r\E8\EE\EE\EE\EM\EM\EM\E[?7h\E[?1l\E[?3l\E7\E[1;31
+	    r\E8,
+	use=news-old-unk,
+#
+# (nwp513-a: this had :TY=ascii: and :DE=^H:, which I interpret as <OTbs>; --esr)
+# also the alias vt100-bm.
+nwp513-a|nwp518-a|nwe501-a|nwp251-a|newscbm-a|news31-a|newscbm33|news33|old Sony VT100 emulator 33 lines,
+	OTbs,
+	lines#33,
+	is2=\E7\E[r\E8\EE\EE\EE\EM\EM\EM\E[?7h\E[?1l\E[?3l\E7\E[1;33
+	    r\E8,
+	use=news-old-unk,
+#
+# (news28: this had :DE=^H:, I think that's <OTbs>, and :KB=nws1200: --esr)
+news28|old Sony VT100 emulator 28 lines,
+	OTbs,
+	lines#28,
+	is2=\E7\E[r\E8\EE\EE\EE\EM\EM\EM\E[?7h\E[?1l\E[?3l\E7\E[1;28
+	    r\E8,
+	use=news-old-unk,
+#
+# (news29: this had :TY=ascii:KB=nws1200:\ --esr)
+news29|news28-a|old Sony VT100 emulator 29 lines,
+	lines#29,
+	is2=\E7\E[r\E8\EE\EE\EE\EM\EM\EM\E[?7h\E[?1l\E[?3l\E7\E[1;29
+	    r\E8,
+	use=news-old-unk,
+#
+# (news511: this had :TY=sjis: --esr)
+nwp511|nwp-511|nwp-511 VT100,
+	OTbs, OTpt, am, xenl,
+	cols#80, lines#24,
+	clear=\E[;H\E[2J$<20/>, cub1=\E[D, cud1=\E[B, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A$<2/>, dl1=\E[M,
+	ed=\E[J$<30/>, el=\E[K$<3/>,
+	flash=\E[?5h\0\0\0\0\0\0\0\0\0\0\0\0\0\E[?5l,
+	il1=\E[L, is2=\E[?5l\E[?1l\E>\E[?7h\E[?8h, kcub1=\E[D,
+	kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kf1=\EOP, kf2=\EOQ,
+	kf3=\EOR, kf4=\EOS, kf5=\EOT, kf6=\E#W, khome=\E[H,
+	ri=\EM$<5/>, rmso=\E[m$<2/>, rmul=\E[m$<2/>,
+	rs2=\E7\E[r\E8\E[?5l\E[?1l\E>\E[?7h\E[?8h,
+	smso=\E[7m$<2/>, smul=\E[4m$<2/>,
+# (news517: this had :TY=sjis:. --esr)
+nwp517|nwp-517|nwp-517 VT200 80 cols 30 rows,
+	eslok, hs,
+	cols#80, lines#30,
+	OTi2=\E[2$~\n, dsl=\E[1$~, fsl=\E[0$},
+	is2=\E7\E[r\E8\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h,
+	tsl=\E[1$}\E[;%df, use=vt220-base,
+# (news517-w: this had :TY=sjis:. --esr)
+nwp517-w|nwp-517-w|nwp-517 VT200 132 cols 50 rows,
+	eslok, hs,
+	cols#132, lines#50,
+	OTi2=\E[2$~\n, dsl=\E[1$~, fsl=\E[0$},
+	is2=\E7\E[r\E8\E>\E[?3h\E[?4l\E[?5l\E[?7h\E[?8h,
+	rs2=\E>\E[?3h\E[?4l\E[?5l\E[?7h\E[?8h,
+	tsl=\E[1$}\E[;%df, use=vt220-base,
+
+#### Common Desktop Environment
+#
+
+# This ships with Sun's CDE in Solaris 2.5
+# Corrected Sun Aug 9 1998 by Alexander V. Lukyanov <lav@video.yars.free.net>
+dtterm|CDE desktop terminal,
+	am, mir, msgr, xenl, xon,
+	cols#80, it#8, lines#24, lm#0, ncv@,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[J, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m, dl=\E[%p1%dM,
+	dl1=\E[M, ech=\E[%p1%dX, ed=\E[J, el=\E[K, el1=\E[1K,
+	enacs=\E(B\E)0, flash=\E[?5h$<200>\E[?5l, home=\E[H,
+	ht=^I, hts=\EH, ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[L,
+	ind=\ED, invis=\E[8m, is2=\E F\E>\E[?1l\E[?7h\E[?45l,
+	kbs=^H, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A,
+	kf1=\E[11~, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~,
+	kf13=\E[25~, kf14=\E[26~, kf15=\E[28~, kf16=\E[29~,
+	kf17=\E[31~, kf18=\E[32~, kf19=\E[33~, kf2=\E[12~,
+	kf20=\E[34~, kf3=\E[13~, kf4=\E[14~, kf5=\E[15~,
+	kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~,
+	khlp=\E[28~, nel=\EE, rc=\E8, rev=\E[7m, ri=\EM, rmacs=^O,
+	rmam=\E[?7l, rmir=\E[4l, rmso=\E[22;27m, rmul=\E[24m,
+	sc=\E7,
+	sgr=\E[0%?%p1%t;2;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5
+	    %t;2%;%?%p6%t;1%;%?%p7%t;8%;m%?%p9%t\016%e\017%;,
+	sgr0=\E[m\017, smacs=^N, smam=\E[?7h, smir=\E[4h,
+	smso=\E[2;7m, smul=\E[4m, tbc=\E[3g, use=decid+cpr,
+	use=vt220+vtedit, use=vt220+cvis, use=ecma+color,
+
+######## Non-Unix Consoles
+#
+
+#### EMX termcap.dat compatibility modes
+#
+# Also (possibly only EMX, so we don't put it in ansi.sys, etc): set the
+# no_color_video to inform the application that standout(1), underline(2)
+# reverse(4) and invisible(64) don't work with color.
+emx-base|DOS special keys,
+	bce, bw,
+	it#8, ncv#71,
+	bel=^G, use=ansi.sys,
+
+# Except for the "-emx" suffixes, these are as distributed with EMX 0.9b,
+# a Unix-style environment used on OS/2.  (Note that the suffix makes some
+# names longer than 14 characters, the nominal maximum).
+#
+# Removed: rmacs=\E[10m, smacs=\E[11m, because OS/2 does not implement acs.
+ansi-emx|ANSI.SYS color,
+	am, bce, eo, mir, msgr, xon,
+	colors#8, cols#80, it#8, lines#25, pairs#64,
+	bel=^G, blink=\E[5m, bold=\E[1m,
+	clear=\E[1;33;44m\E[H\E[J, cr=\r, cub1=^H, cud1=\n,
+	cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A,
+	dch=\E[%p1%dp, ed=\E[J, el=\E[K,
+	flash=\E[?5h$<100/>\E[?5l, home=\E[H, ht=^I, hts=\EH,
+	ich=\E[%p1%d@, ich1=\E[@, ind=\n, kb2=\E[G, kbs=^H, kf0=\0D,
+	kll=\0O, kspd=^Z, nel=\r\n, rev=\E[5;37;41m, rmir=\E[4l,
+	rmpch=\E[10m, rmso=\E[0;44m\E[1;33m,
+	rmul=\E[0;44m\E[1;33m, rs1=\Ec, setab=\E[4%p1%dm,
+	setaf=\E[3%p1%dm, sgr0=\E[0m\E[1;33;44m, smir=\E[4h,
+	smpch=\E[11m, smso=\E[0;31;47m, smul=\E[1;31;44m,
+	tbc=\E[3g, u8=\E[?6c, u9=\E[c, use=vt220+cvis,
+	use=emx-base,
+# nice colors for Emacs (white on blue, mode line white on cyan)
+ansi-color-2-emx|ANSI.SYS color 2,
+	clear=\E[0;37;44m\E[H\E[J, rev=\E[1;37;46m,
+	rmso=\E[0;37;44m, rmul=\E[0;37;44m, rs1=\Ec,
+	setaf=\E[3%p1%dm, sgr0=\E[0;37;44m, smso=\E[1;37;46m,
+	smul=\E[1;36;44m, use=ansi-emx,
+# nice colors for Emacs (white on black, mode line black on cyan)
+ansi-color-3-emx|ANSI.SYS color 3,
+	clear=\E[0;37;40m\E[H\E[J, rev=\E[1;37;46m,
+	rmso=\E[0;37;40m, rmul=\E[0;37;40m, rs1=\Ec,
+	setaf=\E[3%p1%dm, sgr0=\E[0;10m, smso=\E[1;37;46m,
+	smul=\E[0;36;40m, use=ansi-emx,
+mono-emx|stupid monochrome ANSI terminal with only one kind of emphasis,
+	am,
+	cols#80, it#8, lines#24,
+	clear=\E[H\E[2J$<50>, cub1=\E[D, cud1=\E[B, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, el=\E[K, home=\E[H,
+	ht=^I, kb2=\E[G, kbs=^H, kcub1=\0K, kcud1=\0P, kcuf1=\0M,
+	kcuu1=\0H, kf0=\0D, kf1=\0;, kf2=\0<, kf3=\0=, kf4=\0>,
+	kf5=\0?, kf6=\0@, kf7=\0A, kf8=\0B, kf9=\0C, khome=\0G,
+	kich1=\0R, kll=\0O, knp=\0Q, kpp=\0I, nel=\r\n, rev=\E[7m,
+	sgr0=\E[0m,
+
+#### Cygwin
+
+# Use this for cygwin32 (tested with beta 19.1)
+# underline is colored bright magenta
+# shifted kf1-kf12 are kf11-kf22
+cygwinB19|ANSI emulation for cygwin32,
+	kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kf1=\E[[A,
+	kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\E[25~,
+	kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, kf17=\E[31~,
+	kf18=\E[32~, kf19=\E[33~, kf2=\E[[B, kf20=\E[34~,
+	kf3=\E[[C, kf4=\E[[D, kf5=\E[[E, kf6=\E[17~, kf7=\E[18~,
+	kf8=\E[19~, kf9=\E[20~, rmam@, smam@, use=vt220+pcedit,
+	use=ansi.sys,
+
+# Use this for cygwin (tested with version 1.1.0).
+# I've combined pcansi and linux.  Some values of course were different and
+# I've indicated which of these were and which I used.
+# Cheers, earnie_boyd@yahoo.com
+# several changes based on running with tack and comparing with older entry -TD
+# more changes from csw:
+#   add    cbt   [backtab]
+#   remove eo    [erase overstrike with blank]
+#   change clear was \E[H\E[J  now \E[2J  (faster?)
+#   remove cols
+#   remove lines
+#   remove ncv#3 [colors collide with highlights, bitmask] not applicable
+#                to MSDOS box?
+#   add    cub   [cursor back param]
+#   add    cuf   [cursor forward param]
+#   add    cuu   [cursor up param]
+#   add    cud   [cursor down param]
+#   add    hs    [has status line]
+#   add    fsl   [return from status line]
+#   add    tsl   [go to status line]
+#   add    smacs [Start alt charset] (not sure if this works)
+#   add    rmacs [End alt charset]   (ditto)
+#   add    smcup [enter_ca_mode] (save console; thanks Corinna)
+#   add    rmcup [exit_ca_mode]  (restore console; thanks Corinna)
+#   add    kb2   [center of keypad]
+#   add    u8    [user string 8] \E[?6c
+#   add    el    [clear to end of line] \E[K
+# Notes:
+#   cnorm [make cursor normal] not implemented
+#   flash [flash] not implemented
+#   blink [blink] not implemented very usefully in cygwin? \E[5m
+#   dim   [dim] not implemented very usefully in cygwin? \E[2m
+#   cub1  [cursor back 1] typically \E[D, but ^H is faster?
+#   kNXT  [shifted next key] not implemented
+#   kPRV  [shifted prev key] not implemented
+#   khome [home key] really is \E[1~ NOT \E[H
+#   tbc   [clear tab stops] not implemented
+#   xenl  [newline ignored after 80 cols] messes up last line? Ehud Karni
+#   smpch [Start PC charset] is \E[11m, same as smacs
+#   rmpch [End PC charset] is \E[10m, same as rmacs
+#   mir   [move in insert mode] fails in tack?
+#   bce   [back color erase] causes problems with change background color?
+#   cvvis [make cursor very visible] causes a stackdump when testing with
+#         testcurs using the output option? \E[?25h\E[?8c
+#   civis [make cursor invisible] causes everything to stackdump? \E[?25l\E[?1c
+#   ech   [erase characters param] broken \E[%p1%dX
+#   kcbt  [back-tab key] not implemented in cygwin?  \E[Z
+#
+# 2005/11/12 -TD
+#	Remove cbt since it does not work in current cygwin
+#	Add 'mir' and 'in' flags based on tack
+cygwin|ANSI emulation for Cygwin,
+	am, hs, mir, msgr, xon,
+	colors#8, it#8, pairs#64,
+	acsc=+\020\,\021-\030.^Y0\333`\004a\261f\370g\361h\260j
+	     \331k\277l\332m\300n\305o~p\304q\304r\304s_t\303u\264v
+	     \301w\302x\263y\363z\362{\343|\330}\234~\376,
+	bel=^G, bold=\E[1m, clear=\E[H\E[J, cr=\r, cub=\E[%p1%dD,
+	cub1=^H, cud=\E[%p1%dB, cud1=\E[B, cuf=\E[%p1%dC,
+	cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA,
+	cuu1=\E[A, dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM,
+	dl1=\E[M, ed=\E[J, el=\E[K, el1=\E[1K, fsl=^G, home=\E[H,
+	hpa=\E[%i%p1%dG, ht=^I, ich=\E[%p1%d@, ich1=\E[@,
+	il=\E[%p1%dL, il1=\E[L, ind=\n, invis=\E[8m, kb2=\E[G,
+	kbs=^H, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A,
+	kf1=\E[[A, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~,
+	kf13=\E[25~, kf14=\E[26~, kf15=\E[28~, kf16=\E[29~,
+	kf17=\E[31~, kf18=\E[32~, kf19=\E[33~, kf2=\E[[B,
+	kf20=\E[34~, kf3=\E[[C, kf4=\E[[D, kf5=\E[[E, kf6=\E[17~,
+	kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, kspd=^Z, nel=\r\n,
+	op=\E[39;49m, rc=\E8, rev=\E[7m, ri=\EM, rmacs=\E[10m,
+	rmir=\E[4l, rmpch=\E[10m, rmso=\E[27m, rmul=\E[24m,
+	rs1=\Ec\E]R, sc=\E7, setab=\E[4%p1%dm, setaf=\E[3%p1%dm,
+	sgr=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p6%t;1%;%?%p7
+	    %t;8%;%?%p9%t;11%;m,
+	sgr0=\E[0;10m, smacs=\E[11m, smir=\E[4h, smpch=\E[11m,
+	smso=\E[7m, smul=\E[4m, tsl=\E];, vpa=\E[%i%p1%dd,
+	use=xterm+alt47, use=vt220+pcedit, use=vt102+enq,
+
+# I've supplied this so that you can help test new values and add other
+# features.  Cheers, earnie_boyd@yahoo.com.
+#
+# Some features are from pcansi.  The op value is from linux.  Function-keys
+# are from linux.  These have been tested not to cause problems.  xenl was in
+# this list, but DOES cause problems so it has been removed
+cygwinDBG|Debug Version for Cygwin,
+	am, eo, mir, msgr, xon,
+	colors#8, cols#80, it#8, lines#24, ncv#3, pairs#64,
+	acsc=+\020\,\021-\030.^Y0\333`\004a\261f\370g\361h\260j
+	     \331k\277l\332m\300n\305o~p\304q\304r\304s_t\303u\264v
+	     \301w\302x\263y\363z\362{\343|\330}\234~\376,
+	bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, clear=\E[H\E[J,
+	cr=\r, cub=\E[%p1%dD, cub1=\E[D, cud=\E[%p1%dB, cud1=\E[B,
+	cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH,
+	cuu=\E[%p1%dA, cuu1=\E[A, dch=\E[%p1%dP, dch1=\E[P,
+	dim=\E[2m, dl=\E[%p1%dM, dl1=\E[M, ed=\E[J, el=\E[K,
+	el1=\E[1K, flash=\E[?5h$<200/>\E[?5l, home=\E[H,
+	hpa=\E[%i%p1%dG, ht=^I, hts=\EH, ich=\E[%p1%d@, ich1=\E[@,
+	il=\E[%p1%dL, il1=\E[L, ind=\n, invis=\E[8m, kNXT=\E[6$,
+	kPRV=\E[5$, kb2=\E[G, kbs=^H, kcbt=\E[Z, kcub1=\E[D,
+	kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kf1=\E[[A, kf10=\E[21~,
+	kf11=\E[23~, kf12=\E[24~, kf13=\E[25~, kf14=\E[26~,
+	kf15=\E[28~, kf16=\E[29~, kf17=\E[31~, kf18=\E[32~,
+	kf19=\E[33~, kf2=\E[[B, kf20=\E[34~, kf3=\E[[C, kf4=\E[[D,
+	kf5=\E[[E, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~,
+	kspd=^Z, nel=\r\n, op=\E[39;49m, rc=\E8, rev=\E[7m, ri=\EM,
+	rmacs=\E[10m, rmir=\E[4l, rmso=\E[m, rmul=\E[m,
+	rs1=\Ec\E]R, sc=\E7, setab=\E[4%p1%dm, setaf=\E[3%p1%dm,
+	sgr=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5
+	    %t;2%;%?%p6%t;1%;%?%p7%t;8%;%?%p9%t;12%;m,
+	sgr0=\E[0;10m, smacs=\E[11m, smir=\E[4h, smso=\E[7m,
+	smul=\E[4m, tbc=\E[3g, vpa=\E[%i%p1%dd, use=vt220+pcedit,
+	use=vt220+cvis, use=vt102+enq,
+
+#### DJGPP
+
+# Key definitions:
+# The encodings for unshifted arrow keys, F1-F12, Home, Insert, etc.  match the
+# encodings used by other x86 environments.  All others are invented for DJGPP.
+# Oddly enough, while several combinations of modifiers are tabulated, there is
+# none for shifted cursor keys.
+#
+#	F1			\E[[A
+#	F2			\E[[B
+#	F3			\E[[C
+#	F4			\E[[D
+#	F5			\E[[E
+#	F6			\E[17~
+#	F7			\E[18~
+#	F8			\E[19~
+#	F9			\E[20~
+#	F10			\E[21~
+#	F11			\E[23~
+#	F12			\E[24~
+#
+#	Delete			\E[3~
+#	Down Arrow		\E[B
+#	End			\E[4~
+#	Home			\E[1~
+#	Insert			\E[2~
+#	Left Arrow		\E[D
+#	Page Down		\E[6~
+#	Page Up			\E[5~
+#	Right Arrow		\E[C
+#	Up Arrow		\E[A
+#
+#	Shift-F1		\E[25~
+#	Shift-F2		\E[26~
+#	Shift-F3		\E[27~
+#	Shift-F4		\E[28~
+#	Shift-F5		\E[29~
+#	Shift-F6		\E[30~
+#	Shift-F7		\E[31~
+#	Shift-F8		\E[32~
+#	Shift-F9		\E[33~
+#	Shift-F10		\E[34~
+#	Shift-F11		\E[35~
+#	Shift-F12		\E[36~
+#
+#	Ctrl-F1			\E[47~
+#	Ctrl-F2			\E[48~
+#	Ctrl-F3			\E[49~
+#	Ctrl-F4			\E[50~
+#	Ctrl-F5			\E[51~
+#	Ctrl-F6			\E[52~
+#	Ctrl-F7			\E[53~
+#	Ctrl-F8			\E[54~
+#	Ctrl-F9			\E[55~
+#	Ctrl-F10		\E[56~
+#	Ctrl-F11		\E[57~
+#	Ctrl-F12		\E[58~
+#
+#	Ctrl-Delete		\E[43~
+#	Ctrl-Down Arrow		\E[38~
+#	Ctrl-End		\E[44~
+#	Ctrl-Home		\E[41~
+#	Ctrl-Insert		\E[42~
+#	Ctrl-Left Arrow		\E[39~
+#	Ctrl-Page Down		\E[46~
+#	Ctrl-Page Up		\E[45~
+#	Ctrl-Right Arrow	\E[40~
+#	Ctrl-Up Arrow		\E[37~
+#
+#	Alt-F1			\E[59~
+#	Alt-F2			\E[60~
+#	Alt-F3			\E[61~
+#	Alt-F4			\E[62~
+#	Alt-F5			\E[63~
+#	Alt-F6			\E[64~
+#	Alt-F7			\E[65~
+#	Alt-F8			\E[66~
+#	Alt-F9			\E[67~
+#	Alt-F10			\E[68~
+#	Alt-F11			\E[79~
+#	Alt-F12			\E[80~
+#
+#	Alt-Delete		\E[65~
+#	Alt-Down Arrow		\E[60~
+#	Alt-End			\E[66~
+#	Alt-Home		\E[41~
+#	Alt-Insert		\E[64~
+#	Alt-Left Arrow		\E[61~
+#	Alt-Page Down		\E[68~
+#	Alt-Page Up		\E[67~
+#	Alt-Right Arrow		\E[62~
+#	Alt-Up Arrow		\E[59~
+#
+# Also:
+#	Alt-A			\E[82~
+#	Alt-B			\E[82~
+#	Alt-C			\E[83~
+#	Alt-D			\E[84~
+#	Alt-E			\E[85~
+#	Alt-F			\E[86~
+#	Alt-G			\E[87~
+#	Alt-H			\E[88~
+#	Alt-I			\E[89~
+#	Alt-J			\E[90~
+#	Alt-K			\E[91~
+#	Alt-L			\E[92~
+#	Alt-M			\E[93~
+#	Alt-N			\E[94~
+#	Alt-O			\E[95~
+#	Alt-P			\E[96~
+#	Alt-Q			\E[97~
+#	Alt-R			\E[98~
+#	Alt-S			\E[99~
+#	Alt-T			\E[100~
+#	Alt-U			\E[101~
+#	Alt-V			\E[102~
+#	Alt-W			\E[103~
+#	Alt-X			\E[104~
+#	Alt-Y			\E[105~
+#	Alt-Z			\E[106~
+djgpp|ANSI emulation for DJGPP alpha,
+	am, bce, msgr, xhp, xon, xt,
+	colors#8, it#8, pairs#64,
+	acsc=+\020\,\021-\030.^Y0\333`\004a\261f\370g\361h\260j
+	     \331k\277l\332m\300n\305o~p\304q\304r\304s_t\303u\264v
+	     \301w\302x\263y\363z\362{\343|\330}\234~\376,
+	bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, civis=\E[1v,
+	clear=\E[H\E[J, cnorm=\E[v, cr=\r, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\E[B, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	cvvis=\E[2v, dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM,
+	dl1=\E[M, ech=\E[%p1%dX, ed=\E[J, el=\E[K, el1=\E[1K,
+	home=\E[H, hpa=\E[%i%p1%dG, ht=^I, ich=\E[%p1%d@,
+	ich1=\E[@, il=\E[%p1%dL, il1=\E[L, ind=\E[S, invis=\E[8m,
+	kbs=^H, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A,
+	kf1=\E[[A, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~,
+	kf2=\E[[B, kf3=\E[[C, kf4=\E[[D, kf5=\E[[E, kf6=\E[17~,
+	kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, nel=\r\n, op=\E[37;40m,
+	rev=\E[7m, ri=\E[T, rmso=\E[m, setab=\E[4%p1%dm,
+	setaf=\E[3%p1%dm,
+	sgr=\E[0%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%e;25%;%?
+	    %p6%t;1%;%?%p7%t;8%;m,
+	sgr0=\E[m, smso=\E[7m, smul=\E[4m, vpa=\E[%i%p1%dd,
+	use=vt220+pcedit, use=ecma+index,
+
+djgpp203|entry for DJGPP 2.03,
+	OTbs, am,
+	cols#80, it#8, lines#25,
+	bel=^G, cr=\r, cub1=^H, cud1=\n, ht=^I, ind=\n, kbs=^H, kcub1=^H,
+	kcud1=\n, nel=\r\n,
+
+djgpp204|entry for DJGPP 2.04,
+	OTbs, am, AX,
+	colors#8, cols#80, it#8, lines#25, ncv#3, pairs#64,
+	bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, civis=\E[1v,
+	clear=\E[H\E[2J, cnorm=\E[v, cr=\r, cub=\E[%p1%dD,
+	cub1=\E[D, cud=\E[%p1%dB, cud1=\E[B, cuf=\E[%p1%dC,
+	cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA,
+	cuu1=\E[A, cvvis=\E[2v, dch=\E[%p1%dP, dch1=\E[P,
+	dl=\E[%p1%dM, dl1=\E[M, ech=\E[%p1%dX, ed=\E[J, el=\E[K,
+	home=\E[H, ht=^I, ich=\E[%p1%d@, ich1=\E[@, il=\E[%p1%dL,
+	il1=\E[L, ind=\E[S, invis=\E[8m, kbs=^H, kcub1=\E[D,
+	kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kf0=\E[21~, kf1=\E[[A,
+	kf10=\E[21~, kf2=\E[[B, kf3=\E[[C, kf4=\E[[D, kf5=\E[[E,
+	kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, kll=\E[4~,
+	nel=\r\n, rev=\E[7m, ri=\E[T, rmso=\E[m, setab=\E[4%p1%dm,
+	setaf=\E[3%p1%dm, sgr0=\E[m, smso=\E[7m, smul=\E[4m,
+	use=vt220+pcedit, use=ecma+index,
+
+#### U/Win
+
+# This is tested using U/Win's telnet.  Scrolling is omitted because it is
+# buggy.  Another odd bug appears when displaying "~" in alternate character
+# set (the emulator spits out error messages).  Compare with att6386 -TD
+uwin|U/Win 3.2 console,
+	am, eo, in, msgr, xenl, xon,
+	colors#8, it#8, ncv#58, pairs#64,
+	acsc=+\020\,\021-\030.^Y0\333`\004a\261f\370g\361h\260i
+	     \316j\331k\277l\332m\300n\305o~p\304q\304r\304s_t\303u
+	     \264v\301w\302x\263y\363z\362{\343|\330}\234~\376,
+	bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[J, cr=\r,
+	cub1=^H, cud1=\n, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH,
+	cuu1=\E[A, dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m,
+	ech=\E[%p1%dX, ed=\E[J, el=\E[K, el1=\E[1K, home=\E[H, ht=^I,
+	hts=\EH, ich=\E[%p1%d@, ich1=\E[@, kbs=^H, kcub1=\E[D,
+	kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kdch1=^?, kend=\E[Y,
+	kf1=\EOP, kf10=\EOY, kf11=\EOZ, kf12=\EOA, kf2=\EOQ,
+	kf3=\EOR, kf4=\EOS, kf5=\EOT, kf6=\EOU, kf7=\EOV, kf8=\EOW,
+	kf9=\EOX, khome=\E[H, kich1=\E[@, nel=\r\n, op=\E[39;49m,
+	rc=\E8, rev=\E[7m, rmacs=\E[10m, rmir=\E[4l, rmpch=\E[10m,
+	rmso=\E[27m, rmul=\E[m, rs1=\Ec\E]R, sc=\E7,
+	setab=\E[4%p1%dm, setaf=\E[3%p1%dm, sgr0=\E[0;10m,
+	smacs=\E[11m, smir=\E[4h, smpch=\E[11m, smso=\E[7m,
+	smul=\E[4m, tbc=\E[3g, use=ansi+cpr, use=vt220+cvis,
+
+#### Microsoft (miscellaneous)
+
+# This entry fits the Windows NT console when the _POSIX_TERM environment
+# variable is set to 'on'.  While the Windows NT POSIX console is seldom used,
+# the Telnet client supplied with both the Windows for WorkGroup 3.11 TCP/IP
+# stack and the Win32 (i.e., Windows 95 and Windows NT 3.1 or later) operating
+# systems is not, and (surprise!) they match very well.
+#
+# See:  MS Knowledge Base item Q108581, dated 13-MAY-1997, titled "Setting Up
+# VI POSIX Editor for Windows NT 3.1".  True to Microsoft form, not only
+# are the installation instructions a pile of mind-numbing bureaucratese,
+# but the termcap entry is actually broken and unusable as given; the :do:
+# capability is misspelled "d".
+#
+# To use this, you need to a bunch of environment variables:
+#
+# SET _POSIX_TERM=on
+# SET TERM=ansi
+# SET TERMCAP=location of termcap file in POSIX file format
+# which is case-sensitive.
+# e.g. SET TERMCAP=//D/RESKIT35/posix/termcap
+# SET TMP=//C/TEMP
+#
+# Important note: setting the TMP environment variable in POSIX style renders
+# it incompatible with a lot of other applications, including Visual C++. So
+# you should have a separate command window just for vi. All the other
+# variables may be permanently set in the Control Panel\System applet.
+#
+# You can find out more about the restrictions of this facility at
+# <https://jeffpar.github.io/kbarchive/kb/108/Q108581/>
+#
+# From: Federico Bianchi <bianchi@magna.cisid.unipi.it>, 15 Jan 1997
+ansi-nt|psx_ansi|Microsoft Windows NT console POSIX ANSI mode,
+	am, bw, msgr,
+	cols#80, it#8, lines#25,
+	bel=^G, clear=\E[2J, cr=\r, cub1=^H, cud1=\n, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, ed=\E[J, el=\E[K,
+	home=\E[H, ht=^I, ind=\E[S, kbs=^H, kcub1=\E[D, kcud1=\E[V,
+	kcuf1=\E[C, kcuu1=\E[A, nel=\r\E[S, rc=\E[u, rev=\E[7m,
+	ri=\E[T, rmso=\E[m, sc=\E[s, sgr0=\E[0m, smso=\E[7m,
+# From: jew@venus.sunquest.com
+# Date: 19 Feb 93 23:41:07 GMT
+# Here's  a  combination of  ansi and  vt100 termcap
+# entries   that  works  nearly   perfectly  for  me
+# (Gateway 2000 Handbook and Microsoft Works 3.0):
+pcmw|PC running Microsoft Works,
+	am, xenl,
+	cols#80, it#8, lines#24, vt#3,
+	bel=^G, blink=\E[5m$<2/>, bold=\E[1m$<2/>,
+	clear=\E[;H\E[2J$<50/>, cr=\r, cub1=^H, cud1=\n,
+	cuf1=\E[C$<2/>, cup=\E[%i%p1%d;%p2%dH$<5/>,
+	cuu1=\E[A$<2/>, ed=\E[J$<50/>, el=\E[K$<3/>, home=\E[H,
+	ht=^I, hts=\EH$<2/>, ind=\ED$<5/>, is2=\E[1;24r\E[24;1H,
+	kbs=^H, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
+	kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, nel=\r\ED$<5/>,
+	rc=\E8, rev=\E[7m$<2/>, rf=/usr/share/tabset/vt100,
+	ri=\EM$<5/>, rmso=\E[m$<2/>, rmul=\E[m$<2/>,
+	rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, sc=\E7,
+	sgr0=\E[m$<2/>, smso=\E[7m$<2/>, smul=\E[4m$<2/>,
+	tbc=\E[3g$<2/>,
+
+# From: Federico Bianchi
+# This is the entry for the OpenNT terminal.
+# The ntconsole name is for backward compatibility.
+# This is for OpenNT 2.0 and later.
+# Later OpenNT was renamed to Interix.
+#
+# Presently it is distributed by Microsoft as Services For Unix (SFU).
+# The 3.5 beta contained ncurses 4.2 (that is header files and executables,
+# the documentation dated from 1.9.9e) -TD
+#
+# For a US keyboard, with 12 function-kecbt=\E[Z, ys,
+#	kf1-kf12 are unmodifiedcbt=\E[Z, cbt=\E[Z,
+#	kf13-kf24 use the shift-key
+#	kf25-kf36 use the left alt-key
+#	kf37-kf38 use the control-key
+#	kf49-kf60 use the shift- and control-keys
+# The shifted cursor keys send the sequences originally used for kf61-kf64:
+#	down=\EF+	(kf61)
+#	up=\EF-		(kf62)
+#	left=\EF^	(unassigned)
+#	right=\EF$	(kf64)
+
+interix|opennt|opennt-25|ntconsole|ntconsole-25|OpenNT-term compatible with color,
+	am, bce, msgr,
+	cols#80, it#8, lines#25,
+	acsc=+\020\,\021-\030.^Y0\333`\004a\261f\370g\361h\260j
+	     \331k\277l\332m\300n\305o~p\304q\304r\304s_t\303u\264v
+	     \301w\302x\263y\363z\362{\343|\330}\234~\376,
+	bel=^G, bold=\E[1m, clear=\E[2J, cr=\r, cub=\E[%p1%dD,
+	cub1=\E[D, cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC,
+	cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA,
+	cuu1=\E[A, dl=\E[%p1%dM, dl1=\E[M, ed=\E[J, el=\E[K,
+	home=\E[H, ht=^I, il=\E[%p1%dL, il1=\E[L, ind=\E[S,
+	kLFT=\EF\^, kRIT=\EF$, kbs=^H, kcbt=\E[Z, kcub1=\E[D,
+	kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kdch1=^?, kend=\E[U,
+	kf0=\EFA, kf1=\EF1, kf10=\EFA, kf11=\EFB, kf12=\EFC,
+	kf13=\EFD, kf14=\EFE, kf15=\EFF, kf16=\EFG, kf17=\EFH,
+	kf18=\EFI, kf19=\EFJ, kf2=\EF2, kf20=\EFK, kf21=\EFL,
+	kf22=\EFM, kf23=\EFN, kf24=\EFO, kf25=\EFP, kf26=\EFQ,
+	kf27=\EFR, kf28=\EFS, kf29=\EFT, kf3=\EF3, kf30=\EFU,
+	kf31=\EFV, kf32=\EFW, kf33=\EFX, kf34=\EFY, kf35=\EFZ,
+	kf36=\EFa, kf37=\EFb, kf38=\EFc, kf39=\EFd, kf4=\EF4,
+	kf40=\EFe, kf41=\EFf, kf42=\EFg, kf43=\EFh, kf44=\EFi,
+	kf45=\EFj, kf46=\EFk, kf47=\EFm, kf48=\EFn, kf49=\EFo,
+	kf5=\EF5, kf50=\EFp, kf51=\EFq, kf52=\EFr, kf53=\EFs,
+	kf54=\EFt, kf55=\EFu, kf56=\EFv, kf57=\EFw, kf58=\EFx,
+	kf59=\EFy, kf6=\EF6, kf60=\EFz, kf7=\EF7, kf8=\EF8, kf9=\EF9,
+	khome=\E[H, kich1=\E[L, kind=\EF+, kll=\E[U, knp=\E[T,
+	kpp=\E[S, kri=\EF-, ll=\E[U, nel=\r\n, op=\E[m, rc=\E[u,
+	rev=\E[7m, ri=\E[T, rmcup=\E[2b\E[u\r\E[K, rmso=\E[m,
+	rmul=\E[m, rs1=\Ec, sc=\E[s, sgr0=\E[0m, smcup=\E[s\E[1b,
+	smso=\E[7m, smul=\E[4m, use=ecma+index, use=klone+color,
+
+opennt-35|ntconsole-35|OpenNT-term35 compatible with color,
+	lines#35, use=opennt,
+
+opennt-50|ntconsole-50|OpenNT-term50 compatible with color,
+	lines#50, use=opennt,
+
+opennt-60|ntconsole-60|OpenNT-term60 compatible with color,
+	lines#60, use=opennt,
+
+opennt-100|ntconsole-100|OpenNT-term100 compatible with color,
+	lines#100, use=opennt,
+
+# OpenNT wide terminals
+opennt-w|opennt-25-w|ntconsole-w|ntconsole-25-w|OpenNT-term-w compat with color,
+	cols#125, use=opennt,
+
+opennt-35-w|ntconsole-35-w|OpenNT-term35-w compatible with color,
+	lines#35, use=opennt-w,
+
+opennt-50-w|ntconsole-50-w|OpenNT-term50-w compatible with color,
+	lines#50, use=opennt-w,
+
+opennt-60-w|ntconsole-60-w|OpenNT-term60-w compatible with color,
+	lines#60, use=opennt-w,
+
+opennt-w-vt|opennt-25-w-vt|ntconsole-w-vt|ntconsole-25-w-vt|OpenNT-term-w-vt compat with color,
+	cols#132, use=opennt,
+
+# OpenNT terminals with no smcup/rmcup (names match termcap entries)
+interix-nti|opennt-nti|opennt-25-nti|ntconsole-25-nti|OpenNT-nti compatible with color,
+	rmcup@, smcup@, use=opennt,
+
+opennt-35-nti|ntconsole-35-nti|OpenNT-term35-nti compatible with color,
+	lines#35, use=opennt-nti,
+
+opennt-50-nti|ntconsole-50-nti|OpenNT-term50-nti compatible with color,
+	lines#50, use=opennt-nti,
+
+opennt-60-nti|ntconsole-60-nti|OpenNT-term60-nti compatible with color,
+	lines#60, use=opennt-nti,
+
+opennt-100-nti|ntconsole-100-nti|OpenNT-term100-nti compatible with color,
+	lines#100, use=opennt-nti,
+
+######## COMMON TERMINAL TYPES
+#
+# This section describes terminal classes and maker brands that are still
+# quite common, but have proprietary command sets not blessed by ANSI.
+#
+
+#### Altos
+#
+# Altos made a moderately successful line of UNIX boxes.  In 1990 they were
+# bought out by Acer, a major Taiwanese manufacturer of PC-clones.
+# Acer has a web site at http://www.acer.com.
+#
+# Altos descriptions from Ted Mittelstaedt <tedm@agora.rain.com> 4 Sep 1993
+# His comments suggest they were shipped with the system.
+#
+
+# (altos2: had extension capabilities
+#	:c0=^A`\r:c1=^Aa\r:c2=^Ab\r:c3=^Ac\r:\
+#	:c4=^Ad\r:c5=^Ae\r:c6=^Af\r:c7=^Ag\r:\
+#	:c8=^Ah\r:c9=^Ai\r:cA=^Aj\r:cB=^Ak\r:\
+#	:cC=^Al\r:cD=^Am\r:cE=^An\r:cF=^Ao\r:
+#	:XU=^Aq\r:XD=^Ar\r:XR=^As\r:XL=^At\r:\
+#	:YU=^AQ\r:YD=^AR\r:YR=^AS\r:YL=^AT\r:\
+#	:HL=^AP\r:SP=\E[i:\
+#	:IS=\E[@:DE=\E[P:IL=\E[L:NS=\E[S:PS=\E[T:\
+#	:LO=\E[0q:LC=\E[5q:LL=\E[6q:\
+# Comparison with the k* capabilities makes it obvious that the c* things are
+# shift keys.  I have renamed them to keys 32 and up accordingly.  Also,
+# :sr: was given as a boolean-- esr)
+altos2|alt2|altos-2|Altos II,
+	cols#80, it#8, lines#24, xmc#0,
+	clear=\E[H\E[2J, cr=\r, cub1=^H, cud1=\E[1B, cuf1=\E[1C,
+	cup=\E[%i%p1%d;%p2%dH, cuu1=\E[1A, dch1=\E[P, dl1=\E[M,
+	ed=\E[J, el=\E[K, home=\E[H, ht=^I, ich1=\E[@,
+	if=/usr/share/tabset/vt100, il1=\E[L, ind=\n,
+	is2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, kDL=^Am\r,
+	kEOL=^An\r, kbs=^H, kcbt=^AK\r, kclr=^AL\r, kcub1=\E[D,
+	kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kdch1=^AM\r, kel=^AN\r,
+	kf0=^AI\r, kf1=^A@\r, kf2=^AA\r, kf3=^AB\r, kf32=^A`\r,
+	kf33=^Aa\r, kf34=^Ab\r, kf35=^Ac\r, kf36=^Ad\r, kf37=^Ae\r,
+	kf38=^Af\r, kf39=^Ag\r, kf4=^AC\r, kf40=^Ah\r, kf41=^Ai\r,
+	kf42=^Aj\r, kf43=^Ak\r, kf5=^AD\r, kf6=^AE\r, kf7=^AF\r,
+	kf8=^AG\r, kf9=^AH\r, khome=\E[f, kil1=^AJ\r, kind=^AO\r,
+	nel=\r\n, rmam=\E[?7l, rmso=\E[m, rmul=\E[m, sgr0=\E[m,
+	smam=\E[?7h, smso=\E[7m, smul=\E[4m,
+# (altos3: had extension capabilities
+#	:c0=^A`\r:c1=^Aa\r:c2=^Ab\r:c3=^Ac\r:\
+#	:c4=^Ad\r:c5=^Ae\r:c6=^Af\r:c7=^Ag\r:\
+#	:c8=^Ah\r:c9=^Ai\r:cA=^Aj\r:cB=^Ak\r:\
+#	:cC=^Al\r:cD=^Am\r:cE=^An\r:cF=^Ao\r:
+#	:XU=^Aq\r:XD=^Ar\r:XR=^As\r:XL=^At\r:\
+#	:HL=^AP\r:SP=\E[i:\
+#	:IS=\E[@:DE=\E[P:IL=\E[L:NS=\E[S:PS=\E[T:
+altos3|altos5|alt3|alt5|altos-3|altos-5|Altos III or V,
+	blink=\E[5p, ri=\EM, sgr0=\E[p, use=altos2,
+altos4|alt4|altos-4|Altos IV,
+	use=wy50,
+# (altos7: had extension capabilities:
+#	:GG#0:GI=\EH8:GF=\EH7:\
+#	:c0=^A`\r:c1=^Aa\r:c2=^Ab\r:c3=^Ac\r:\
+#	:c4=^Ad\r:c5=^Ae\r:c6=^Af\r:c7=^Ag\r:\
+#	:c8=^Ah\r:c9=^Ai\r:cA=^Aj\r:cB=^Ak\r:\
+#	:cC=^Al\r:cD=^Am\r:cE=^An\r:cF=^Ao\r:
+# Comparison with the k* capabilities makes it obvious that the c* things are
+# shift keys.  I have renamed them to keys 32 and up accordingly.  I have
+# also made this entry relative to adm12 in order to give it an <sgr>. The
+# <invis> imported by use=adm+sgr may work, let me know. -- esr)
+altos7|alt7|Altos VII,
+	am, mir,
+	cols#80, lines#24, xmc#0,
+	acsc=j5k3l2m1n8q:t4u9v=w0x6, blink=\EG2, bold=\EGt,
+	clear=\E+^^, cr=\r, cub1=^H, cud1=\n, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW,
+	dim=\EGp, dl1=\ER, ed=\EY, el=\ET, home=^^, ht=^I, il1=\EE,
+	ind=\n, invis=\EG1,
+	is2=\E`:\Ee(\EO\Ee6\Ec41\E~4\Ec21\Eu\E~2, kDL=^Am\r,
+	kEOL=^An\r, kbs=^H, kcbt=^AK\r, kclr=^AL\r, kcub1=^H,
+	kcud1=\n, kcuf1=^L, kcuu1=^K, kdch1=^AM\r, kel=^AN\r,
+	kf0=^AI\r, kf1=^A@\r, kf2=^AA\r, kf3=^AB\r, kf32=^A`\r,
+	kf33=^Aa\r, kf34=^Ab\r, kf35=^Ac\r, kf36=^Ad\r, kf37=^Ae\r,
+	kf38=^Af\r, kf39=^Ag\r, kf4=^AC\r, kf40=^Ah\r, kf41=^Ai\r,
+	kf42=^Aj\r, kf43=^Ak\r, kf5=^AD\r, kf6=^AE\r, kf7=^AF\r,
+	kf8=^AG\r, kf9=^AH\r, khome=^^, kil1=^AJ\r, kind=^AO\r,
+	knp=\EK, kpp=\EJ, mc4=\EJ, mc5=\Ed#, nel=\r\n, ri=\Ej,
+	rmir=\Er, smir=\Eq, use=adm+sgr,
+altos7pc|alt7pc|Altos PC VII,
+	kend=\ET, use=altos7,
+
+#### Hewlett-Packard (hp)
+#
+#	Hewlett-Packard
+#	8000 Foothills Blvd
+#	Roseville, CA 95747
+#	Vox: 1-(916)-785-4363	(Technical response line for VDTs)
+#	     1-(800)-633-3600	(General customer support)
+#
+#
+# As of March 1998, HP no longer has any terminals in production.
+# The 700 series (22, 32, 41, 44, 92, 94, 96, 98) is still being
+# supported (they still have parts). So are the 2392a and 2394a.
+# See the WORKSTATION CONSOLES section for the 700s.
+#
+
+# Generic HP terminal - this should (hopefully) work on any HP terminal.
+hpgeneric|hp|Hewlett-Packard generic terminal,
+	OTbs, OTpt, am, da, db, mir, xhp,
+	cols#80, lines#24, lm#0, vt#6,
+	bel=^G, clear=\EH\EJ, cr=\r, cub1=^H, cud1=\n, cuf1=\EC,
+	cup=\E&a%p2%dc%p1%dY$<6>, cuu1=\EA, dch1=\EP, dl1=\EM,
+	ed=\EJ, el=\EK, hpa=\E&a%p1%dC, ht=^I, hts=\E1, il1=\EL,
+	ind=\n, kbs=^H, kcbt=\Ei, rmir=\ER, rmso=\E&d@, rmul=\E&d@,
+	sgr0=\E&d@, smir=\EQ, smso=\E&dJ, smul=\E&dD, tbc=\E3,
+	vpa=\E&a%p1%dY,
+
+hp110|Hewlett-Packard model 110 portable,
+	lines#16, use=hpgeneric,
+
+hp+pfk+cr|HP function keys with CR,
+	kf1=\Ep\r, kf2=\Eq\r, kf3=\Er\r, kf4=\Es\r, kf5=\Et\r,
+	kf6=\Eu\r, kf7=\Ev\r, kf8=\Ew\r,
+
+hp+pfk-cr|HP function keys w/o CR,
+	kf1=\Ep, kf2=\Eq, kf3=\Er, kf4=\Es, kf5=\Et, kf6=\Eu, kf7=\Ev,
+	kf8=\Ew,
+
+# The hp2621s use the same keys for the arrows and function keys,
+# but not separate escape sequences. These definitions allow the
+# user to use those keys as arrow keys rather than as function
+# keys.
+hp+pfk+arrows|HP alternate arrow definitions,
+	kcub1=\Eu\r, kcud1=\Ew\r, kcuf1=\Ev\r, kcuu1=\Et\r, kf1@,
+	kf2@, kf3@, kf4@, kf5@, kf6@, kf7@, kf8@, khome=\Ep\r, kind=\Er\r,
+	kll=\Eq\r, kri=\Es\r,
+
+hp+arrows|HP arrow definitions,
+	kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, khome=\Eh,
+	kind=\ES, kll=\EF, kri=\ET,
+
+# Generic stuff from the HP 262x series
+#
+hp262x|HP 262x terminals,
+	xhp,
+	blink=\E&dA, dch1=\EP$<2>, ed=\EJ, ht=\011$<2>, ind=\ES,
+	invis=\E&dS, ip=$<2>, kcub1=\ED, kcud1=\EB, kcuf1=\EC,
+	kcuu1=\EA, kdch1=\EP, kdl1=\EM, ked=\EJ, kel=\EK, khome=\Eh,
+	kich1=\EQ, kil1=\EL, kind=\ES, knp=\EU, kpp=\EV, kri=\ET,
+	krmir=\ER, rev=\E&dB, rmkx=\E&s0A, rmso=\E&d@, rmul=\E&d@,
+	sgr=\E&d%{64}%?%p1%t%{66}%|%;%?%p2%t%{68}%|%;%?%p3%t%{66}%|
+	    %;%?%p4%t%{65}%|%;%c,
+	sgr0=\E&d@, smkx=\E&s1A, smso=\E&dB, smul=\E&dD,
+
+# Note: no <home> on HPs since that homes to top of memory, not screen.
+# Due to severe 2621 braindamage, the only way to get the arrow keys to
+# transmit anything at all is to turn on the function key labels
+# with <smkx>, and even then the user has to hold down shift!
+# The default 2621 turns off the labels except when it has to to
+# enable the function keys. If your installation prefers labels
+# on all the time, or off all the time (at the "expense" of the
+# function keys), use 2621-nl or 2621-wl.
+#
+# Note: there are newer ROMs for 2621's that allow you to set
+# strap A so the regular arrow keys xmit \EA, etc, as with the
+# 2645. However, even with this strap set, the terminal stops
+# xmitting if you reset it, until you unset and reset the strap!
+# Since there is no way to set/unset the strap with an escape
+# sequence, we don't use it in the default.
+# If you like, you can use 2621-ba (brain-damaged arrow keys).
+hp2621-ba|HP 2621 w/new rom and strap A set,
+	rmkx@, smkx@, use=hp+arrows, use=hp2621,
+
+# hp2621 with function labels. Most of the time they are off,
+# but inside vi, the function key labels appear. You have to
+# hold down shift to get them to xmit.
+hp2621|hp2621a|hp2621A|2621|2621a|2621A|hp2621-wl|2621-wl|HP 2621 w/labels,
+	is2=\E&jA\r, rmkx=\E&jA, use=hp2621-fl,
+hp2621-fl|HP 2621,
+	xhp@, xon,
+	pb#19200,
+	cbt=\Ei, cup=\E&a%p2%dc%p1%dY, dch1=\EP$<2>, ht=\011$<2>,
+	ip=$<2>, is2=\E&j@\r, rmkx=\E&j@, rmso=\E&d@, rmul=\E&d@,
+	sgr0=\E&d@, smkx=\E&jB, smso=\E&dD, smul=\E&dD,
+	use=hp+pfk+cr, use=hpgeneric,
+
+# To use hp2621p printer, setenv TERM=2621p, PRINTER=2612p
+hp2621p|HP 2621 with printer,
+	mc4=\E&p13C, mc5=\E&p11C, use=hp2621,
+
+hp2621p-a|HP 2621p with fn as arrows,
+	use=hp+pfk+arrows, use=hp2621p,
+
+# hp2621 with k45 keyboard
+hp2621-k45|hp2621k45|k45|HP 2621 with 45 keyboard,
+	kbs=^H, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA,
+	khome=\Eh, rmkx=\E&s0A, smkx=\E&s1A, use=hp2621,
+
+# 2621 using all 48 lines of memory, only 24 visible at any time.
+hp2621-48|HP 48 line 2621,
+	lines#48,
+	cup=\E&a%p2%dc%p1%dR, home=\EH, vpa=\E&a%p1%dR,
+	use=hp2621,
+
+# 2621 with no labels ever. Also prevents vi delays on escape.
+hp2621-nl|HP 2621 with no labels,
+	kcub1@, kcud1@, kcuf1@, kcuu1@, khome@, rmkx@, smkx@,
+	use=hp2621-fl,
+
+# Needed for UCB ARPAVAX console, since lsi-11 expands tabs
+# (wrong).
+#
+hp2621-nt|HP 2621 w/no tabs,
+	ht@, use=hp2621,
+
+# Hp 2624 B with 4 or 10 pages of memory.
+#
+# Some assumptions are made with this entry. These settings are
+# NOT set up by the initialization strings.
+#
+# Port Configuration
+#	RecvPace=Xon/Xoff
+#	XmitPace=Xon/Xoff
+#	StripNulDel=Yes
+#
+# Terminal Configuration
+#	InhHndShk=Yes
+#	InhDC2=Yes
+#	XmitFnctn(A)=No
+#	InhEolWrp=No
+#
+# Note: the 2624 DOES have a true <home>, believe it or not!
+#
+# The 2624 has an "error line" to which messages can be sent.
+# This is CLOSE to what is expected for a "status line". However,
+# after a message is sent to the "error line", the next carriage
+# return is EATEN and the "error line" is turned back off again!
+# So I guess we can't define <hs>, <eslok>, <wsl>, <dsl>, <fsl>, <tsl>.
+#
+# This entry supports emacs (and any other program that uses raw
+# mode) at 4800 baud and less. I couldn't get the padding right
+# for 9600.
+#
+# (hp2624: replaced NUL sequences in flash with mandatory pauses -- esr)
+hp2624|hp2624a|hp2624b|hp2624b-4p|Hewlett Packard 2624 B,
+	da, db,
+	lm#96,
+	flash=\E&w13F$<66/>\E&w12F$<66/>\E&w13F$<66/>\E&w12F, use=hp+labels, use=scrhp,
+
+# This hp2626 entry does not use any of the fancy windowing stuff
+# of the 2626.
+#
+# Indeed, terminfo does not yet handle such stuff. Since changing
+# any window clears memory, it is probably not possible to use
+# this for screen opt.
+#
+# ed is incredibly slow most of the time - I am guessing at the
+# exact padding. Since the terminal uses xoff/xon this is intended
+# only for cost computation, so that the terminal will prefer el
+# or even dl1 which is probably faster!
+#
+# \ED\EJ\EC hack for ed from Ed Bradford - apparently ed is only
+# extra slow on the last line of the window.
+#
+# The padding probably should be changed.
+#
+hp2626|hp2626a|hp2626p|HP 2626,
+	da, db,
+	lm#0, pb#19200,
+	ed=\ED\EJ$<500>\EC, indn=\E&r%p1%dD, ip=$<4>,
+	is2=\E&j@\r, rin=\E&r%p1%dU, use=hp+pfk-cr,
+	use=hp+labels, use=scrhp,
+
+# This entry is for sysline. It allocates a 23 line window with
+# a 115 line workspace for regular use, and a 1 line window for
+# the status line.
+#
+# This assumes port 2 is being used.
+# Turn off horizontal line, Create ws #1 with 115 lines,
+# Create ws #2 with 1 line, Create window #1 lines 1-23,
+# Create window #2 lines 24-24, Attach cursor to workspace #1.
+# Note that this clears the tabs so it must be done by tset before
+# it sets the tabs.
+#
+hp2626-s|HP 2626 using only 23 lines,
+	eslok, hs,
+	lines#23,
+	fsl=\E&d@\E&w7f2p1I\E&w4f1I,
+	is1=\E&q3t0{0H\s\E&w0f115n1I\s\E&w0f1n2I\s\E&w2f1i0d0u22l0S
+	    \s\E&w2f2i0d23u23l0S\s\E&w7f2p1I\s\r,
+	tsl=\E&w7f2p2I\E&w4f2I\r\EK\E&a%p1%dC, use=hp2626,
+# Force terminal back to 24 lines after being 23.
+hp2626-ns|HP 2626 using all 24 lines,
+	is1=\E&q3t0{0H\s\E&w0f118n1I\s\E&w0f1n2I\s\E&w2f1i0d0u23l0S
+	    \s\E&w3f2I\s\E&w7f2p1I\s\r,
+	use=hp2626,
+# Various entries useful for small windows on 2626.
+hp2626-12|Hewlett-Packard 2626 12 lines,
+	lines#12, use=hp2626,
+hp2626-12x40|Hewlett-Packard 2626 12 lines 40 columns,
+	cols#40, lines#12, use=hp2626,
+hp2626-x40|Hewlett-Packard 2626 40 columns,
+	cols#40, use=hp2626,
+hp2626-12-s|Hewlett-Packard 2626 11 lines plus status,
+	lines#11, use=hp2626-s,
+
+#
+# hp2627 color tubes from University of Wisconsin
+#
+hp2627a-rev|HP 2627 with reverse video colors,
+	cr=\r, cud1=\n, ht=^I, ind=\n,
+	is2=\E&v0m1a0b0c1x1y1z1i0a0b1c1x1y1z0i0S\E&j@\r\E3
+	    \r,
+	kbs=^H, kcub1=^H, kcud1=\n, nel=\r\n, rmul=\E&v0S\E&d@,
+	smul=\E&dD\E&v1S, use=hp2621-nl,
+hp2627a|HP 2627 color terminal with no labels,
+	cr=\r, cud1=\n, ht=^I, ind=\n,
+	is2=\E&v0m1a1b0c1i0a1b1c2i1a0b0c0i0S\E&j@\r\E3\r,
+	kbs=^H, kcub1=^H, kcud1=\n, nel=\r\n, rmso=\E&v0S,
+	rmul=\E&v0S\E&d@, smso=\E&v2S, smul=\E&dD\E&v1S,
+	use=hp2621-nl,
+hp2627c|HP 2627 color (cyan) terminal with no labels,
+	cr=\r, cud1=\n, ht=^I, ind=\n,
+	is2=\E&v0m1a0b0c2i1a1b0c1i0a1b1c0i0S\E&j@\r\E3\r,
+	kbs=^H, kcub1=^H, kcud1=\n, nel=\r\n, use=hp2627a,
+
+# hp2640a doesn't have the Y cursor addressing feature, and C is
+# memory relative instead of screen relative, as we need.
+#
+hp2640a|HP 2640a,
+	cup@, rmkx@, smkx@, use=hp2645,
+
+hp2640b|hp2644a|HP 264x series,
+	rmkx@, smkx@, use=hp2645,
+
+# (hp2641a: removed unknown :gu: -- esr)
+hp2641a|hp2645a|hp2647a|HP 264?A series BRL entry,
+	am, da, db, mir, xhp,
+	cols#80, lines#24,
+	bel=^G, clear=\EH\EJ, cr=\r, cub1=^H, cud1=\n, cuf1=\EC,
+	cup=\E&a%p2%2dc%p1%2dY, cuu1=\EA, dch1=\EP, dl1=\EM,
+	ed=\EJ, el=\EK, hpa=\E&a%p1%2dC, ht=^I,
+	if=/usr/share/tabset/std, il1=\EL, ind=\n,
+	is2=\EE$<500/>, kbs=^H, kcub1=^H, kcud1=\n, nel=\r\n,
+	rmir=\ER, rmso=\E&d@, smir=\EQ, smso=\E&dB,
+	vpa=\E&a%p1%2dY,
+
+# This terminal should be used at 4800 baud or less. It needs padding for
+# plain characters at 9600, I guessed at an appropriate cr delay.  It really
+# wants ^E/^F handshaking, but that doesn't work well even if you write
+# software to support it.
+hp2645|hp45|HP 2645 series,
+	pb#9600,
+	blink=\E&dA, cr=\r$<20>, dim=\E&dH, kctab=\E2, kcub1=\ED,
+	kcud1=\EB, kcuf1=\EC, kcuu1=\EA, kdch1=\EP, kdl1=\EM,
+	ked=\EJ, kel=\EK, khome=\Eh, khts=\E1, kich1=\EQ, kil1=\EL,
+	kind=\ES, knp=\EU, kpp=\EV, kri=\ET, krmir=\ER, rev=\E&dB,
+	rmkx=\E&s0A,
+	sgr=\E&d%{64}%?%p1%t%{66}%|%;%?%p2%t%{68}%|%;%?%p3%t%{66}%|
+	    %;%?%p4%t%{65}%|%;%?%p5%t%{72}%|%;%?%p6%t%{66}%|%;%c,
+	sgr0=\E&d@, smkx=\E&s1A, smul=\E&dD, use=hpgeneric,
+# You should use this terminal at 4800 baud or less.
+hp2648|hp2648a|HP 2648a graphics terminal,
+	clear=\EH\EJ$<50>, cup=\E&a%p2%dc%p1%dY$<20>,
+	dch1=\EP$<7>, ip=$<5>, use=hp2645,
+
+# The HP 150 terminal is a fairly vanilla HP terminal, with the
+# clreol standout problem. It also has graphics capabilities and
+# a touch screen, which we don't describe here.
+hp150|Hewlett Packard Model 150,
+	OTbs, use=hp2622,
+
+# HP 2382a terminals, "the little ones." They don't have any
+# alternate character set support and sending out ^N/^O will
+# leave the screen blank.
+hp2382a|hp2382|Hewlett Packard 2382a,
+	da, db,
+	lh#1, lm#48,
+	acsc@,
+	pln=\E&f0a%p1%dk%p2%l%Pa%?%ga%t%ga%d%e1%;d0L%?%ga%!%t\s%;%p2
+	    %s,
+	rmacs@,
+	sgr=\E&d%{0}%Pa%?%p4%t%{1}%ga%+%Pa%;%?%p1%p3%|%p6%|%t%{2}%ga
+	    %+%Pa%;%?%p2%p6%|%t%{4}%ga%+%Pa%;%?%p1%p5%|%t%{8}%ga%+
+	    %Pa%;%?%p7%t%?%ga%ts%ga%{64}%+%e%{83}%;%e%?%ga%t%ga%{64}
+	    %+%e%{64}%;%;%c,
+	sgr0=\E&d@, smacs@, use=hp+labels, use=scrhp,
+
+hp2621-a|hp2621a-a|hp2621 with fn as arrows,
+	use=hp+pfk+arrows, use=hp2621-fl,
+
+# newer hewlett packard terminals
+
+newhpkeyboard|generic entry for HP extended keyboard,
+	kbs=^H, kcbt=\Ei, kclr=\EJ, kcub1=\ED, kcud1=\EB, kcuf1=\EC,
+	kcuu1=\EA, kdch1=\EP, kdl1=\EM, ked=\EJ, kel=\EK, khome=\Eh,
+	kich1=\EQ, kil1=\EL, kind=\ET, kll=\EF, knp=\EU, kpp=\EV,
+	kri=\ES, krmir=\ER, rmkx=\E&s0A, smkx=\E&s1A,
+	use=hp+pfk-cr,
+
+newhp|generic entry for new Hewlett Packard terminals,
+	am, bw, mir, xhp, xon,
+	cols#80, lines#24, pb#4800,
+	acsc=2[3@4>5I9(:'JSKWLQMAO#P$Q;R!S"T1U2V4W3X:Y+Z*dHjGkTlRmFn
+	     /q\,t5u6v8w7x.,
+	bel=^G, blink=\E&dA, bold=\E&dF, cbt=\Ei, cr=\r, cub1=^H,
+	cud1=\n, cuf1=\EC, cuu1=\EA, dch1=\EP$<2>, dim=\E&dH,
+	dl1=\EM, ed=\EJ, el=\EK, ht=\011$<2>, hts=\E1, il1=\EL, ind=\n,
+	invis=\E&dS, ip=$<2>, is1=\E&jB$<8>, nel=\r\n,
+	pfkey=\E&f0a%p1%dk0d%p2%l%dL%p2%s,
+	pfloc=\E&f1a%p1%dk0d%p2%l%dL%p2%s,
+	pfx=\E&f2a%p1%dk0d%p2%l%dL%p2%s, rev=\E&dB, ri=\ET,
+	rmacs=^O, rmir=\ER, rmso=\E&d@, rmul=\E&d@, rs1=\Eg,
+	sgr=\E&d%{0}%Pa%?%p4%t%{1}%ga%+%Pa%;%?%p1%p3%|%p6%|%t%{2}%ga
+	    %+%Pa%;%?%p2%p6%|%t%{4}%ga%+%Pa%;%?%p1%p5%|%t%{8}%ga%+
+	    %Pa%;%?%p7%t%?%ga%ts%ga%{64}%+%e%{83}%;%e%?%ga%t%ga%{64}
+	    %+%e%{64}%;%;%c%?%p9%t\016%e\017%;,
+	sgr0=\E&d@\017, smacs=^N, smir=\EQ, smso=\E&dJ, smul=\E&dD,
+	tbc=\E3, use=newhpkeyboard,
+
+memhp|memory relative addressing for new HP ttys,
+	vt#6,
+	clear=\EH\EJ$<40>, cub=\E&a-%p1%dC, cud=\E&a+%p1%dR,
+	cuf=\E&a+%p1%dC, cup=\E&a%p1%dr%p2%dC, cuu=\E&a-%p1%dR,
+	home=\EH, hpa=\E&a%p1%dC, ll=\E&a23R\r,
+	mrcup=\E&a%p1%dr%p2%dC, vpa=\E&a%p1%dR, use=newhp,
+
+scrhp|screen relative addressing for new HP ttys,
+	clear=\E&a0c0Y\EJ$<40>, cub=\E&a-%p1%dC,
+	cud=\E&a+%p1%dR, cuf=\E&a+%p1%dC,
+	cup=\E&a%p1%dy%p2%dC$<10>, cuu=\E&a-%p1%dR,
+	home=\E&a0y0C, hpa=\E&a%p1%dC, ll=\E&a0y0C\EA,
+	mrcup=\E&a%p1%dr%p2%dC, vpa=\E&a%p1%dY, use=newhp,
+
+# (hp+labels: added label values from a BRL termcap -- esr)
+hp+labels|"standard" label info for new HP ttys,
+	lh#2, lw#8, nlab#8,
+	lf0=f1, lf1=f2, lf2=f3, lf3=f4, lf4=f5, lf5=f6, lf6=f7, lf7=f8,
+	pln=\E&f2a%p1%dk%p2%l%Pa%?%ga%t%ga%d%e1%;d0L%?%ga%!%t\s%;%p2
+	    %s,
+	rmln=\E&j@, smln=\E&jB,
+
+hp+printer|"standard" printer info for HP ttys,
+	ff=\E&p4u0C, mc0=\EH\E&p4dF, mc4=\E&p13C, mc5=\E&p11C,
+
+
+# The new hp2621b is kind of a cross between the old 2621 and the
+# new 262x series of machines. It has dip-switched options.
+# The firmware has a bug in it such that if you give it a null
+# length label, the following character is eaten!
+hp2621b|HP 2621b with old style keyboard,
+	lh#1, lm#48, lw#8, nlab#8,
+	kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, khome=\Eh,
+	kind=\ET, kll=\EF, kri=\ES,
+	pln=\E&f0a%p1%dk%p2%l%Pa%?%ga%t%ga%d%e1%;d3L%?%ga%!%t%{32}%c
+	    %;%p2%s\E%{111}%p1%+%c\r,
+	smln=\E&jB, use=hp2621,
+
+hp2621b-p|HP 2621b with printer,
+	use=hp+printer, use=hp2621b,
+
+# hp2621b - new 2621b with new extended keyboard
+# these are closer to the new 26xx series than the other 2621b
+hp2621b-kx|HP 2621b with extended keyboard,
+	use=newhpkeyboard, use=hp2621b,
+
+hp2621b-kx-p|HP 2621b with new keyboard & printer,
+	use=hp+printer, use=hp2621b-kx,
+
+# Some assumptions are made in the following entries.
+# These settings are NOT set up by the initialization strings.
+#
+#    Port Configuration
+# RecvPace=Xon/Xoff	XmitPace=Xon/Xoff	StripNulDel=Yes
+#
+#    Terminal Configuration
+# InhHndShk(G)=Yes	InhDC2(H)=Yes
+# XmitFnctn(A)=No		InhEolWrp=No
+#
+#
+# Hp 2622a & hp2623a display and graphics terminals
+#
+hp2622|hp2622a|HP 2622,
+	da, db,
+	lm#0, pb#19200,
+	is2=\E&dj@\r, use=hp+pfk-cr, use=hp+labels, use=scrhp,
+
+# The 2623 is a 2622 with extra graphics hardware.
+hp2623|hp2623a|HP 2623,
+	use=hp2622,
+
+hp2624b-p|hp2624b-4p-p|Hewlett Packard 2624 B with printer,
+	use=hp+printer, use=hp2624,
+
+# The hewlett packard B can have an optional extra 6 pages of memory.
+hp2624-10p|hp2624a-10p|hp2624b-10p|Hewlett Packard 2624 B w/ 10 pages of memory,
+	lm#240, use=hp2624,
+
+hp2624b-10p-p|Hewlett Packard 2624 B w/ extra memory & printer,
+	lm#240, use=hp2624b-p,
+
+# Color manipulations for HP terminals
+hp+color|HP with colors,
+	ccc,
+	colors#16, ncv#17, pairs#7,
+	initp=\E&v%?%p2%{1000}%=%t1%e.%p2%d%;a%?%p3%{1000}%=%t1%e.
+	      %p3%d%;b%?%p4%{1000}%=%t1%e.%p4%d%;c%?%p5%{1000}%=%t1
+	      %e.%p5%d%;x%?%p6%{1000}%=%t1%e.%p6%d%;y%?%p7%{1000}%=
+	      %t1%e.%p7%d%;z%p1%dI,
+	oc=\E&v0m1a1b1c0I\E&v1a1I\E&v1b2I\E&v1a1b3I\E&v1c4I\E&v1a1c5
+	   I\E&v1b1c6I\E&v1x1y7I,
+	op=\E&v0S, scp=\E&v%p1%dS,
+
+# <is2> sets the screen to be 80 columns wide
+hp2397a|hp2397|Hewlett Packard 2397A color terminal,
+	is2=\E&w6f80X, use=memhp, use=hp+labels, use=hp+color,
+
+#  HP 700/44 Setup parameters:
+# Terminal Mode		HP-PCterm
+# Inhibit Auto Wrap	NO
+# Status Line		Host Writable
+# PC Character Set	YES
+# Twenty-Five Line Mode	YES
+# XON/XOFF		@128 or 64 (sc)
+# Keycode Mode		NO   or YES (sc)
+# Backspace Key		BS or BS/DEL
+#
+# <is2>		sets pcterm; autowrap; 25 lines; pc char set; prog DEL key;
+# \E\\? does not turn off keycode mode
+# <smsc>	sets alternate start/stop; keycode on
+hpansi|hp700|Hewlett Packard 700/44 in HP-PCterm mode,
+	am, eo, xenl, xon,
+	cols#80, lines#25,
+	acsc=j\331k\277l\332m\300n\305q\304t\303u\264v\301w\302x
+	     \263,
+	bel=^G, cbt=\E[Z, clear=\E[2J\E[H, cr=\r, cub1=\E[D,
+	cud1=\E[B, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A,
+	dch1=\E[P, dl1=\E[M, ed=\E[J, el=\E[K, home=\E[H, ht=^I,
+	ich1=\E[@, il1=\E[L, ind=\n,
+	is2=\E[44"p\E[?7h\E[>10h\E[>12h\EP1;1|3/7F\E\\,
+	kbs=^H, kcbt=\E[Z, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C,
+	kcuu1=\E[A, kend=\E[4~, kf1=\E[17~, kf10=\E[28~,
+	kf2=\E[18~, kf3=\E[19~, kf4=\E[20~, kf5=\E[21~, kf6=\E[23~,
+	kf7=\E[24~, kf8=\E[25~, kf9=\E[26~, khome=\E[1~, knp=\E[6~,
+	kpp=\E[5~, rmam=\E[?7l,
+	rmsc=\E[>11l\EP1**x0/11;1/13\E[m\E\\, rmso=\E[m,
+	rmul=\E[m, sgr0=\E[m, smam=\E[?7h,
+	smsc=\E[>11h\EPO**x0/65;1/67\E\\$<250>, smso=\E[7m,
+	smul=\E[4m, xoffc=g, xonc=e, use=vt220+cvis,
+#
+# (hp2392: copied <rmir> here from hpex -- esr)
+hp2392|239x series,
+	cols#80,
+	cbt=\Ei, cup=\E&a%p1%dy%p2%dC, kf1=\Ep\r, kf2=\Eq\r,
+	kf3=\Er\r, kf4=\Es\r, kf5=\Et\r, kf6=\Eu\r, kf7=\Ev\r,
+	kf8=\Ew\r, khome=\Eh, kind=\EU, knp=\Eu, kpp=\Ev, kri=\EV,
+	rmir=\ER, rmul=\E&d@, smir=\EQ, smul=\E&dD, vpa=\E&a%p1%dY,
+	use=hpsub,
+
+hpsub|HP terminals -- capability subset,
+	am, da, db, mir, xhp, xon,
+	lines#24,
+	bel=^G, clear=\EH\EJ, cr=\r, cub1=^H, cud1=\EB, cuf1=\EC,
+	cuu1=\EA, dch1=\EP, dl1=\EM, ed=\EJ, el=\EK, hpa=\E&a%p1%dC,
+	ht=^I, if=/usr/share/tabset/stdcrt, il1=\EL, ind=\n,
+	is2=\E&s1A\E<\E&k0\\, kbs=^H, kcub1=\ED, kcud1=\EB,
+	kcuf1=\EC, kcuu1=\EA, khome=\Eh, rmkx=\E&s0A, rmso=\E&d@,
+	sgr0=\E&d@, smkx=\E&s1A, smso=\E&dB,
+
+# hpex:
+#	May be used for most 24 x 80 hp terminals,
+# but has no padding added, so may allow runover in some terminals at high
+# baud rates.  Will not work for hp2640a or hp2640b terminals, hp98x6 and
+# hp98x5 terminal emulators or hp98x6 consoles.
+#	Adds xy-cursor addressing, vertical cursor addressing, home,
+# last line, and underline capabilities.
+#
+# (hpex: removed memory-lock capabilities ":ml=\El:mu=\Em:",
+# moved <rmir> here from hpsub -- esr)
+hpex|HP extended capabilities,
+	cr=\r, cud1=\n, cup=\E&a%p1%dy%p2%dC, ht=^I, ind=\n, kbs=^H,
+	kcub1=^H, kcud1=\n, nel=\r\n, rmir=\ER, rmul=\E&d@, smir=\EQ,
+	smul=\E&dD, vpa=\E&a%p1%dY, use=hpsub,
+
+# From: Ville Sulko <Ville.Sulko@bip.atk.tpo.fi>, 05 Aug 1996
+hp2|hpex2|Hewlett-Packard extended capabilities newer version,
+	am, da, db, mir, xhp,
+	cols#80, lh#2, lines#24, lm#0, lw#8, nlab#8, xmc#0,
+	bel=^G, clear=\E&a0y0C\EJ, cr=\r, cub1=^H, cud1=\EB,
+	cuf1=\EC, cup=\E&a%p1%dy%p2%dC, cuu1=\EA, dch1=\EP,
+	dl1=\EM, ed=\EJ, el=\EK, hpa=\E&a%p1%dC, ht=^I, hts=\E1,
+	il1=\EL, ind=\n, kbs=^H, kclr=\EJ, kctab=\E2, kdch1=\EP,
+	kdl1=\EM, ked=\EJ, kel=\EK, khts=\E1, kich1=\EQ, kil1=\EL,
+	knp=\EU, kpp=\EV, krmir=\ER, ktbc=\E3, meml=\El, memu=\Em,
+	pfkey=\E&f%p1%dk%p2%l%dL%p2%s,
+	pfloc=\E&f1a%p1%dk%p2%l%dL%p2%s,
+	pfx=\E&f2a%p1%dk%p2%l%dL%p2%s,
+	pln=\E&f%p1%dk%p2%l%dd0L%p2%s, rmir=\ER, rmkx=\E&s0A,
+	rmln=\E&j@, rmso=\E&d@, rmul=\E&d@,
+	sgr=\E&d%?%p7%t%{115}%c%;%p1%p3%|%p6%|%{2}%*%p2%{4}%*%+%p4%+
+	    %p5%{8}%*%+%{64}%+%c%?%p9%t%'\016'%c%e%'\017'%c%;,
+	sgr0=\E&d@\017, smir=\EQ, smkx=\E&s1A, smln=\E&jB,
+	smso=\E&dB, smul=\E&dD, tbc=\E3, vpa=\E&a%p1%dY,
+	use=hp+pfk-cr, use=hp+arrows,
+
+# HP 236 console
+# From: <ddavis@ic.berkeley.edu>
+hp236|hp236 internal terminal emulator,
+	OTbs, am,
+	cols#80, lines#24,
+	clear=\EF, cnorm=\EDE, cub1=^H,
+	cup=\EE%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, cvvis=\EDB,
+	dch1=\EJ, dl1=\EH, el=\EK, ich1=\EI, il1=\EG, rmso=\ECI,
+	sgr0=\ECI, smso=\EBI,
+
+# This works on a hp300 console running Utah 4.3 BSD
+# From: Craig Leres <leres@okeeffe.berkeley.edu>
+hp300h|HP Catseye console,
+	OTbs, am, da, db, mir, xhp,
+	cols#128, lines#51, lm#0, xmc#0,
+	bel=^G, cbt=\Ei, clear=\E&a0y0C\EJ, cr=\r, cub1=^H, cud1=\EB,
+	cuf1=\EC, cup=\E&a%p1%dy%p2%dC, cuu1=\EA, dch1=\EP,
+	dl1=\EM, ed=\EJ, el=\EK, hpa=\E&a%p1%dC, ht=^I,
+	if=/usr/share/tabset/stdcrt, il1=\EL, ind=\n, kbs=^H,
+	kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, khome=\Eh,
+	rmir=\ER, rmkx=\E&s0A, rmso=\E&d@, rmul=\E&d@, sgr0=\E&d@,
+	smir=\EQ, smkx=\E&s1A, smso=\E&dB, smul=\E&dD, tbc=\E3,
+	vpa=\E&a%p1%dY,
+# From: Greg Couch <gregc@ernie.berkeley.edu>
+hp9837|hp98720|hp98721|HP 9000/300 workstations,
+	OTbs, am, da, db, mir, xhp,
+	cols#128, it#8, lines#46, lm#0,
+	bel=^G, cbt=\Ei, clear=\E&a0y0C\EJ, cub1=^H, cud1=\EB,
+	cuf1=\EC, cup=\E&a%p1%dy%p2%dC, cuu1=\EA, dch1=\EP,
+	dl1=\EM, ed=\EJ, el=\EK, hpa=\E&a%p1%dC, ht=^I, hts=\E1,
+	il1=\EL, ind=\n, is2=\E&v0m1b0i&j@, kbs=^H, kcub1=\ED,
+	kcud1=\EB, kcuf1=\EC, kcuu1=\EA, kdch1=\EP, kdl1=\EM,
+	ked=\EJ, kel=\EK, khome=\Eh, kich1=\EQ, kil1=\EL, knp=\EU,
+	kpp=\EV, rmir=\ER, rmkx=\E&s0A, rmso=\E&v0S, rmul=\E&d@,
+	sgr0=\E&d@, smir=\EQ, smkx=\E&s1A, smso=\E&v5S, smul=\E&dD,
+	tbc=\E3, vpa=\E&a%p1%dY,
+# HP 9845 desktop computer from BRL
+# (hp9845: removed unknown capability :gu: -- esr)
+hp9845|HP 9845,
+	OTbs, am, da, db, eo, mir, xhp,
+	cols#80, lines#21,
+	OTbc=\ED, clear=\EH\EJ, cub1=\ED, cud1=\EB, cuf1=\EC,
+	cup=\E&a%p2%2dc%p1%2dY, cuu1=\EA, dch1=\EP, dl1=\EM,
+	ed=\EJ, el=\EK, if=/usr/share/tabset/std, il1=\EL,
+	rmir=\ER, rmso=\E&d@, smir=\EQ, smso=\E&dB,
+# From: Charles A. Finnell of MITRE <finnell@mitre.org>, developed 07SEP90
+# (hp98550: replaced /usr/share/tabset/9837 with std because <it#8>,<hts=\E1>;
+# added empty <acsc> to avoid warnings re <smacs>/<rmacs> --esr)
+hp98550|hp98550a|HP 9000 Series 300 color console,
+	OTbs, am, da, db, mir, xhp,
+	cols#128, it#8, lines#49, lm#0,
+	acsc=, bel=^G, blink=\E&dA, bold=\E&dJ, cbt=\Ei, civis=\E*dR,
+	clear=\EH\EJ, cnorm=\E*dQ, cr=\r, cub1=^H, cud1=\n, cuf1=\EC,
+	cup=\E&a%p1%dy%p2%dC, cuu1=\EA, dch1=\EP, dim=\E&dH,
+	dl1=\EM, ed=\EJ, el=\EK, hpa=\E&a%p1%dC, ht=^I, hts=\E1,
+	if=/usr/share/tabset/std, il1=\EL, ind=\n, invis=\E&ds,
+	kbs=^H, kclr=\EJ, kctab=\E2, kdch1=\EP, kdl1=\EM, ked=\EJ,
+	kel=\EK, khts=\E1, kich1=\EQ, kil1=\EL, kll=\EF, knp=\EU,
+	kpp=\EV, krmir=\ER, ktbc=\E3, rev=\E&dJ, rmacs=^O, rmir=\ER,
+	rmkx=\E&s0A, rmso=\E&d@, rmul=\E&d@, sgr0=\E&d@, smacs=^N,
+	smir=\EQ, smkx=\E&s1A, smso=\E&dJ, smul=\E&dD, tbc=\E3,
+	vpa=\E&a%p1%dY, use=hp+pfk-cr, use=hp+arrows,
+
+# From: Martin Trusler
+hp98550-color|hp98550a-color|HP 9000 Series 300 color console (Trusler),
+	OTbs, am, ccc, da, db, km, mir, xhp,
+	colors#8, cols#128, it#8, lh#2, lines#49, lm#0, lw#8, nlab#8,
+	pairs#8, xmc#0,
+	acsc=+>\,<-\^.v0\374``a\374f\372g\376h\374j+k+l+m+n+o-q-s-t+
+	     u+v+w+x|y<z>{*|!}\273~\362,
+	bel=^G, bold=\E&dD, cbt=\Ei, clear=\EH\EJ, cr=\r, cub1=^H,
+	cud1=\EB, cuf1=\EC, cup=\E&a%p1%dy%p2%dC, cuu1=\EA,
+	dch1=\EP, dl1=\EM, ed=\EJ, el=\EK, home=\E&a0y0C,
+	hpa=\E&a%p1%dC, ht=^I, hts=\E1, il1=\EL, ind=\ES,
+	initp=\E&v0m%?%p2%{1000}%=%t1%e.%p2%d%;a%?%p3%{1000}%=%t1%e.
+	      %p3%d%;b%?%p4%{1000}%=%t1%e.%p4%d%;c%?%p5%{1000}%=%t1
+	      %e.%p5%d%;x%?%p6%{1000}%=%t1%e.%p6%d%;y%?%p7%{1000}%=
+	      %t1%e.%p7%d%;z%p1%dI,
+	is1=\EH\EJ, kbs=^H, kctab=\E2, kdch1=\EP, kdl1=\EM, ked=\EJ,
+	kel=\EK, khts=\E1, kich1=\EQ, kil1=\EL, kll=\EF, knp=\EU,
+	kpp=\EV, krmir=\ER, ktbc=\E3, meml=\El, memu=\Em,
+	oc=\E&v0m1a1b1c0I\E&v1a1I\E&v1b2I\E&v1a1b3I\E&v1c4I\E&v1a1c5
+	   I\E&v1b1c6I\E&v1x1y7I,
+	op=\E&v0S, pfkey=\E&f%p1%dk%p2%l%dL%p2%s,
+	pfloc=\E&f1a%p1%dk%p2%l%dL%p2%s,
+	pfx=\E&f2a%p1%dk%p2%l%dL%p2%s,
+	pln=\E&f%p1%dk%p2%l%dd0L%p2%s, rev=\E&dB, ri=\ET,
+	rmacs=^O, rmam=\E&s1C, rmcup=\E&s0A, rmir=\ER, rmkx=\E&s0A,
+	rmln=\E&j@, rmm=\E&k0I, rmso=\E&d@, rmul=\E&d@, rs1=\EE,
+	scp=\E&v%p1%dS,
+	sgr=\E&d%p1%p3%|%{2}%*%p2%p6%|%{4}%*%+%{64}%+%c%?%p9%t%'
+	    \016'%c%e%'\017'%c%;,
+	sgr0=\E&d@\017, smacs=^N, smam=\E&s0C, smcup=\E&s1A,
+	smir=\EQ, smkx=\E&s1A, smln=\E&jB, smm=\E&k1I, smso=\E&dB,
+	smul=\E&dD, tbc=\E3, u6=\Ea%dc%dR\r, u7=\Ea,
+	u8=\E%[0123456789/], u9=\E*s1\^, vpa=\E&a%p1%dY,
+	use=hp+pfk-cr, use=hp+arrows,
+
+# From: Victor Duchovni <vic@fine.princeton.edu>
+# (hp700-wy: removed obsolete ":nl=^J:";
+# replaced /usr/share/tabset/hp700-wy with std because <it#8>,<hts=\E1> -- esr)
+hp700-wy|HP 700/41 emulating Wyse30,
+	OTbs, am, bw, mir, msgr,
+	cols#80, it#8, lines#24, xmc#1,
+	cbt=\EI, clear=^Z, cr=\r, cub1=^H, cud1=^V, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW,
+	dl1=\ER, ed=\EY, el=\ET$<10/>, home=^^, ht=^I, hts=\E1,
+	if=/usr/share/tabset/stdcrt, il1=\EE$<0.7*/>,
+	is1=\E~"\EC\Er\E(\EG0\003\E`9\E`1, kbs=^?, kcbt=\EI,
+	kclr=^Z, kcub1=^H, kcud1=^V, kcuf1=^L, kcuu1=^K, ked=\EY,
+	kel=\ET, khome=^^, khts=\EI, kich1=\Eq, krmir=\Er, ll=^^^K,
+	ri=\Ej, rmir=\Er, rmso=\EG0$<10/>, rmul=\EG0$<10/>,
+	sgr0=\EG0$<10/>, smir=\Eq, smso=\EG4$<10/>,
+	smul=\EG8$<10/>, tbc=\E0, vpa=\E[%p1%{32}%+%c,
+hp70092|hp70092a|hp70092A|HP 700/92,
+	am, da, db, xhp,
+	cols#80, lh#2, lines#24, lm#0, lw#8, nlab#8,
+	acsc=0cjgktlrmfn/q\,t5u6v8w7x., bel=^G, blink=\E&dA,
+	bold=\E&dB, cbt=\Ei, clear=\E&a0y0C\EJ, cr=\r, cub1=^H,
+	cud1=\EB, cuf1=\EC, cup=\E&a%p1%dy%p2%dC, cuu1=\EA,
+	dch1=\EP, dim=\E&dH, dl1=\EM, el=\EK, hpa=\E&a%p1%dC, ht=^I,
+	hts=\E1, il1=\EL, kbs=^H, kclr=\EJ, kctab=\E2, kdch1=\EP,
+	kdl1=\EM, ked=\EJ, kel=\EK, khts=\E1, kich1=\EQ, kil1=\EL,
+	kll=\EF, knp=\EU, kpp=\EV, krmir=\ER, ktbc=\E3, rev=\E&dB,
+	ri=\ET, rmacs=^O, rmir=\ER, rmkx=\E&s0A, rmln=\E&j@,
+	rmso=\E&d@, rmul=\E&d@, sgr0=\E&d@, smacs=^N, smir=\EQ,
+	smkx=\E&s1A, smln=\E&jB, smso=\E&dJ, smul=\E&dD, tbc=\E3,
+	vpa=\E&a%p1%dY, use=hp+pfk-cr, use=hp+arrows,
+
+bobcat|sbobcat|HP 9000 model 300 console,
+	am, da, db, mir, xhp,
+	cols#128, it#8, lines#47, xmc#0,
+	cbt=\Ei, clear=\EH\EJ, cr=\r, cub1=^H, cud1=\EB, cuf1=\EC,
+	cup=\E&a%p1%dy%p2%dC$<6/>, cuu1=\EA, dch1=\EP,
+	dl1=\EM$<10*/>, ed=\EJ, el=\EK, hpa=\E&a%p1%dC$<6/>, ht=^I,
+	il1=\EL$<10*/>, ind=\n, kbs=^H, kcub1=\ED, kcud1=\EB,
+	kcuf1=\EC, kcuu1=\EA, khome=\Eh, nel=\r\n, rmir=\ER,
+	rmkx=\E&s0A, rmso=\E&d@, rmul=\E&d@, sgr0=\E&d@, smir=\EQ,
+	smkx=\E&s1A, smso=\E&dB, smul=\E&dD, vpa=\E&a%p1%dY$<6/>,
+gator-t|HP 9000 model 237 emulating extra-tall AAA,
+	lines#94, use=gator,
+gator|HP 9000 model 237 emulating AAA,
+	bw, km, mir, ul,
+	cols#128, it#8, lines#47,
+	bel=^G, cbt=\E[Z, clear=\E[H\E[J, cr=\r, cub1=^H, cud1=\n,
+	cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, cuu1=\EM,
+	dch=\E[%p1%dP$<4/>, dch1=\E[P, dl=\E[%p1%dM$<1*/>,
+	dl1=\E[M, ed=\E[J, el=\E[K, home=\E[H, hpa=\E[%i%p1%d`,
+	ht=^I, ich=\E[%p1%d@$<4/>, ich1=\E[@, il=\E[%p1%dL$<1*/>,
+	il1=\E[L, kbs=^H, kcub1=^H, kcud1=\n, nel=\r\n,
+	rep=%p1%c\E[%p2%db$<1*/>, rev=\E[7m, rmso=\E[m,
+	rmul=\E[m, sgr0=\E[m, smso=\E[7m, smul=\E[4m,
+gator-52|HP 9000 model 237 emulating VT52,
+	cols#128, lines#47, use=vt52-basic,
+gator-52t|HP 9000 model 237 emulating extra-tall VT52,
+	lines#94, use=gator-52,
+
+#### Honeywell-Bull
+#
+# From: Michael Haardt <michael@gandalf.moria> 11 Jan 93
+#
+
+# Honeywell Bull terminal.  Its cursor and function keys send single
+# control characters and it has standout/underline glitch.  Most programs
+# do not like these features/bugs.  Visual bell is realized by flashing the
+# "keyboard locked" LED.
+dku7003-dumb|Honeywell Bull DKU 7003 dumb mode,
+	cols#80, lines#25,
+	clear=^]^_, cr=\r, cub1=^Y, cud1=^K, cuf1=^X,
+	cup=\E[%i%p1%d;%p2%dH, cuu1=^Z, ed=^_, el=\E[K,
+	flash=\E[2h\E[2l, home=^], ht=^I, ind=\n, kbs=^H, kcub1=^Y,
+	kcud1=^K, kcuf1=^X, kcuu1=^Z, khome=^], nel=\r\n,
+dku7003|Honeywell Bull DKU 7003 all features described,
+	msgr,
+	xmc#1,
+	blink=\E[5m, bold=\E[7m, dim=\E[2m, rev=\E[7m, rmso=\E[m,
+	rmul=\E[m, sgr0=\E[m, smso=\E[7m, smul=\E[4m,
+	use=dku7003-dumb,
+
+#### Lear-Siegler (LSI adm)
+#
+# These guys are long since out of the terminals business, but
+# in 1995 many current terminals still have an adm type as one of their
+# emulations (usually their stupidest, and usually labeled adm3, though
+# these `adm3' emulations normally have adm3a+ capabilities).
+#
+# WARNING: Some early ADM terminals (including the ADM3 and ADM5) had a
+# `diagnostic feature' that sending them a ^G while pin 22 (`Ring Indicator')
+# was being held to ground would trigger a send of the top line on the screen.
+# A quick fix might be to drop back to a cheesy 4-wire cable with pin 22
+# hanging in the air. (Thanks to Eric Fischer, <eric@fudge.uchicago.edu>,
+# for clearing up this point.)
+
+adm1a|adm1|LSI adm1a,
+	am,
+	cols#80, lines#24,
+	bel=^G, clear=\E;$<1>, cr=\r, cub1=^H, cud1=\n, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, home=^^,
+	ind=\n,
+adm2|LSI adm2,
+	OTbs, am,
+	cols#80, lines#24,
+	bel=^G, clear=\E;, cr=\r, cub1=^H, cud1=\n, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW,
+	dl1=\ER, ed=\EY, el=\ET, home=^^, ich1=\EQ, il1=\EE, ind=\n,
+	kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K, khome=^^,
+# (adm3: removed obsolete ":ma=^K^P:" -- esr)
+adm3|LSI adm3,
+	OTbs, am,
+	cols#80, lines#24,
+	bel=^G, clear=^Z, cr=\r, cub1=^H, cud1=\n, ind=\n,
+# The following ADM-3A switch settings are assumed for normal operation:
+#	SPACE		U/L_DISP	CLR_SCRN	24_LINE
+#	CUR_CTL		LC_EN		AUTO_NL		FDX
+# Other switches may be set for operator convenience or communication
+# requirements.  I recommend
+#	DISABLE_KB_LOCK	LOCAL_OFF	103		202_OFF
+#	ETX_OFF		EOT_OFF
+# Most of these terminals required an option ROM to support lower case display.
+# Open the case and look at the motherboard; if you see an open 24-pin DIP
+# socket, you may be out of luck.
+#
+# (adm3a: some capabilities merged in from BRl entry -- esr)
+adm3a|LSI adm3a,
+	OTbs, am,
+	cols#80, lines#24,
+	OTma=^K^P, OTnl=\n, bel=^G, clear=\032$<1/>, cr=\r, cub1=^H,
+	cud1=\n, cuf1=^L, cup=\E=%p1%{32}%+%c%p2%{32}%+%c,
+	cuu1=^K, home=^^, ind=\n, kcub1=^H, kcud1=\n, kcuf1=^L,
+	kcuu1=^K, rs2=^N,
+adm3a+|adm3a plus,
+	kbs=^H, use=adm3a,
+# (adm5: removed obsolete ":ma=^Hh^Jj^Kk^Ll^^H:" & duplicate ":do=^J:" -- esr)
+adm5|LSI adm5,
+	xmc#1,
+	bel=^G, cr=\r, cud1=\n, ed=\EY, el=\ET, kbs=^H, khome=^^,
+	rmso=\EG, smso=\EG, use=adm3a+,
+# A lot of terminals other than adm11s use these.  Wherever you see
+# use=adm+sgr with some of its capabilities disabled, try the
+# disabled ones.  They may well work but not have been documented or
+# expressed in the using entry.  We'd like to cook up an <sgr> but the
+# <rmacs>/<smacs> sequences of the using entries vary too much.
+adm+sgr|adm style highlight capabilities,
+	invis=\EG1, rev=\EG4, rmso=\EG0, rmul=\EG0, sgr0=\EG0,
+	smso=\EG4, smul=\EG8,
+# LSI ADM-11 from George William Hartwig, Jr. <geo@BRL-TGR.ARPA> via BRL
+# Status line additions from Stephen J. Muir <stephen%comp.lancs.ac.uk@ucl-cs>
+# <khome> from <stephen%comp.lancs.ac.uk@ucl-cs.arpa>.  <clear> could also
+# be ^Z, according to his entry.
+# (adm11: <smul>=\EG4 was obviously erroneous because it also said
+# <rev>=\EG4.  Looking at other ADMs confirms this -- esr)
+adm11|LSI ADM-11,
+	OTbs, am, hs,
+	OTkn#8, cols#80, lines#24,
+	OTnl=\n, bel=^G, blink=\EG2, clear=\E*, cr=\r, cub1=^H,
+	cud1=\n, cuf1=^L, cup=\E=%p1%{32}%+%c%p2%{32}%+%c,
+	cuu1=^K, dsl=\Eh, ed=\EY, el=\ET, fsl=\E(\r, home=^^, ht=^I,
+	kbs=^H, kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K, kf1=^A@\r,
+	kf2=^AA\r, kf3=^AB\r, kf4=^AC\r, kf5=^AD\r, kf6=^AE\r,
+	kf7=^AF\r, kf8=^AG\r, khome=^^, nel=\r\n, tsl=\EF\E),
+	use=adm+sgr,
+# From: Andrew Scott Beals <bandy@lll-crg.ARPA>
+# Corrected by Olaf Siebert <rhialto@polder.ubc.kun.nl>, 11 May 1995
+# Supervisor mode info by Ari Wuolle, <awuolle@delta.hut.fi>, 27 Aug 1996
+# (adm12: removed obsolete ":kn:ma=j^Jk^P^K^Pl ^R^L^L :".  This formerly had
+# <is2>=\Eq but that looked wrong; this <is2> is from Dave Yost <esquire!yost>
+# via BRL.  That entry asserted <xmc#1>, but I've left that out because
+# neither earlier nor later ADMSs have it -- esr)
+#
+# You will need to get into the supervisor setup before you can set
+# baudrate etc. for your ADM-12+. Press Shift-Ctrl-Setup and you should
+# see a lot more setup options.
+#
+# While in supervisor setup you can also use following codes:
+#
+# Ctrl-P Personality character selections (configure for example what
+#        arrow keys send, if I recall correctly)
+# Ctrl-T tabs 1-80   use left&right to move and up to set and
+# Ctrl-V tabs 81-158 down to clear tab. Shift-Ctrl-M sets right margin at cursor
+# Ctrl-B Binary setup (probably not needed. I think that everything can
+#        be set using normal setup)
+# Ctrl-A Answerback mode (enter answerback message)
+# Ctrl-U User friendly mode (normal setup)
+# Ctrl-D Defaults entire setup and function keys from EPROM tables
+# Ctrl-S Save both setup and functions keys. Takes from 6 to 10 seconds.
+# Ctrl-R Reads both setup and functions keys from NVM.
+# Shift-Ctrl-X Unlock keyboard and cancel received X-OFF status
+#
+# ADM-12+ supports hardware handshaking, but it is DTR/CTS as opposed to
+# RTS/CTS used nowadays with virtually every modem and computer. 19200
+# bps works fine with hardware flow control.
+#
+# The following null-modem cable should fix this and enable you to use
+# RTS/CTS handshaking (which Linux supports, use CRTSCTS setting). Also
+# set ADM-12+ for DTR handshaking from supervisor setup.
+#
+# PC Serial   ADM-12+
+#  --------   -------
+#         2 - 3
+#         3 - 2
+#         4 - 5
+#         5 - 20
+#       6,8 - 4
+#         7 - 7
+#        20 - 6,8
+#
+adm12|LSI adm12,
+	OTbs, OTpt, am, mir,
+	OTug#1, cols#80, it#8, lines#24,
+	bel=^G, clear=^Z, cr=\r, cub1=^H, cud1=\n, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW,
+	dl1=\ER, ed=\EY, el=\ET, home=^^, hts=\E1, ich1=\EQ, il1=\EE,
+	is2=\E0\s\s\s\s\s\s\s\s\E1\s\s\s\s\s\s\s\s\E1\s\s\s\s\s\s\s
+	    \s\E1\s\s\s\s\s\s\s\s\E1\s\s\s\s\s\s\s\s\E1\s\s\s\s\s\s
+	    \s\s\E1\s\s\s\s\s\s\s\s\E1\s\s\s\s\s\s\s\s\E1,
+	kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K, kf0=^A0\r, kf1=^A1\r,
+	kf2=^A2\r, kf3=^A3\r, kf4=^A4\r, kf5=^A5\r, kf6=^A6\r,
+	kf7=^A7\r, kf8=^A8\r, kf9=^A9\r, rmir=\Er, smir=\Eq, tbc=\E0,
+	use=adm+sgr,
+# (adm20: removed obsolete ":kn#7:" -- esr)
+adm20|Lear Siegler adm20,
+	OTbs, am,
+	cols#80, it#8, lines#24,
+	bel=^G, cbt=\EI, clear=^Z, cr=\r, cub1=^H, cuf1=^L,
+	cup=\E=%i%p2%{31}%+%c%p1%{31}%+%c, cuu1=^K, dch1=\EW,
+	dl1=\ER, ed=\EY, el=\ET, home=^^, ht=^I, ich1=\EQ, il1=\EE,
+	kf1=^A, kf2=^B, kf3=^W, kf4=^D, kf5=^E, kf6=^X, kf7=^Z, rmso=\E(,
+	sgr0=\E(, smso=\E),
+adm21|Lear Siegler adm21,
+	xmc#1,
+	bel=^G, cr=\r, cud1=\n, dch1=\EW, dl1=\ER$<30*>, ed=\EY,
+	el=\ET, ich1=\EQ, il1=\EE$<30*>, ind=\n, invis@, kbs=^H,
+	kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K, khome=^^,
+	use=adm+sgr, use=adm3a,
+# (adm22: ":em=:" was an obvious typo for ":ei=:"; also,
+# removed obsolete ":kn#7:ma=j^Jk^P^K^Pl ^R^L^L :";
+# removed bogus-looking \200 from before <cup>. -- esr)
+adm22|LSI adm22,
+	OTbs, am,
+	cols#80, lines#24,
+	bel=^G, cbt=\EI, clear=\E+, cr=\r, cub1=^H, cud1=\n, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW,
+	dl1=\ER, ed=\Ey, el=\Et, home=^^, ht=\Ei, ich1=\EQ, il1=\EE,
+	is2=\E%\014\014\014\016\003\0\003\002\003\002\0\0\0\0\0\0\0
+	    \0\0\0\0,
+	kbs=^H, kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K, kf1=^A@\r,
+	kf2=^AA\r, kf3=^AB\r, kf4=^AC\r, kf5=^AD\r, kf6=^AE\r,
+	kf7=^AF\r, khome=^^, lf1=F1, lf2=F2, lf3=F3, lf4=F4, lf5=F5,
+	lf6=F6, lf7=F7, rmso=\E(, sgr0=\E(, smso=\E),
+# ADM 31 DIP Switches
+#
+# This information comes from two versions of the manual for the
+# Lear-Siegler ADM 31.
+#
+# Main board:
+#                  rear of case
+#   +-||||-------------------------------------+
+#   + S1S2                              ||S    +
+#   +                                   ||3    +
+#   +                                          +
+#   +                                ||S       +
+#   +                                ||4       +
+#   +                                          +
+#   +                                          +
+#   +                                          +
+#   +                                          +
+#   +                                          +
+# +-+                                          +-+
+# +                                              +
+# +                               S5 S6 S7       +
+# +                               == == ==       +
+# +----------------------------------------------+
+#            front of case (keyboard)
+#
+#  S1 - Data Rate - Modem
+#  S2 - Data Rate - Printer
+# ------------------------
+# Data Rate   Setting
+# -------------------
+# 50          0 0 0 0
+# 75          1 0 0 0
+# 110         0 1 0 0
+# 134.5       1 1 0 0
+# 150         0 0 1 0
+# 300         1 0 1 0
+# 600         0 1 1 0
+# 1200        1 1 1 0
+# 1800        0 0 0 1
+# 2000        1 0 0 1
+# 2400        0 1 0 1
+# 3600        1 1 0 1
+# 4800        0 0 1 1
+# 7200        1 0 1 1
+# 9600        0 1 1 1
+# x           1 1 1 1
+#
+# S3 - Interface/Printer/Attributes
+# ---------------------------------
+# Printer Busy Control
+# sw1   sw2   sw3
+# ---------------
+# off   off   off   Busy not active, CD disabled
+# off   off   on    Busy not active, CD enabled
+# off   on    off   Busy active on J5-20, CD disabled
+# on    off   off   Busy active on J5-19, CD disabled - Factory Set.
+# on    off   on    Busy active on J5-19, CD enabled
+#
+# sw4   Used in conjunction with S4 for comm interface control - Fact 0
+#
+# sw5   Secondary Channel Control (Hardware implementation only) - Fact 0
+#
+# sw6   ON enables printer BUSY active LOW - Factory Setting
+#       OFF enables printer BUSY active HIGH - If set to this, ADM31 senses
+#
+# sw7   ON - steady cursor - Factory Setting
+#       OFF - blinking cursor
+#
+# sw8   ON causes selected attribute character to be displayed
+#       OFF causes SPACE to be displayed instead - Factory Setting
+#
+# S4 - Interface
+# --------------
+# Modem Interface
+# S3    S4    S4    S4    S4
+# sw4   sw1   sw2   sw3   sw4
+# ---------------------------
+# OFF   ON    OFF   ON    OFF   Enable RS-232C interface, Direct Connect and
+#                               Current Loop disabled - Factory Setting
+# ON    ON    OFF   ON    OFF   Enable Current Loop interface, Direct Connect
+#                               disabled
+# OFF   OFF   ON    OFF   ON    Enable Direct Connect interface, RS-232C and
+#                               Current Loop Disabled
+#
+# sw5   ON disables dot stretching mode - Factory Setting
+#       OFF enables dot stretching mode
+# sw6   ON enables blanking function
+#       OFF enables underline function - Factory Setting
+# sw7   ON causes NULLS to be displayed as NULLS
+#       OFF causes NULLS to be displayed as SPACES - Factory Setting
+#
+# S5 - Word Structure
+# -------------------
+# sw1   ON enables BREAK key - Factory Setting
+#       OFF disables BREAK key
+# sw2   ON selects 50Hz monitor refresh rate
+#       OFF selects 60Hz monitor refresh rate - Factory Setting
+#
+# Modem Port Selection
+# sw3   sw4   sw5
+# ---------------
+# ON    ON    ON    Selects 7 DATA bits, even parity, 2 STOP bits
+# OFF   ON    ON    Selects 7 DATA bits, odd  parity, 2 STOP bits
+# ON    OFF   ON    Selects 7 DATA bits, even parity, 1 STOP bit - Factory Set.
+# OFF   OFF   ON    Selects 7 DATA bits, odd  parity, 1 STOP bit
+# ON    ON    OFF   Selects 8 DATA bits, no   parity, 2 STOP bits
+# OFF   ON    OFF   Selects 8 DATA bits, no   parity, 1 STOP bit
+# ON    OFF   OFF   Selects 8 DATA bits, even parity, 1 STOP bit
+# OFF   OFF   OFF   Selects 8 DATA bits, odd  parity, 1 STOP bit
+#
+# sw6   ON  sends bit 8 a 1 (mark)
+#       OFF sends bit 8 as 0 (space) - Factory Setting
+# sw7   ON  selects Block Mode
+#       OFF selects Conversation Mode - Factory Setting
+# sw8   ON  selects Full Duplex operation
+#       OFF selects Half Duplex operation - Factory Setting
+#
+# S6 - Printer
+# ------------
+# sw1, sw2, sw6, sw7   Reserved - Factory 0
+#
+# Printer Port Selection
+# same as Modem above, bit 8 (when 8 DATA bits) is always = 0
+#
+# sw8   ON   enables Printer Port
+#       OFF disables Printer Port - Factory Setting
+#
+# S7 - Polling Address
+# --------------------
+# sw1-7 Establish ASCII character which designates terminal polling address
+#       ON  = logic 0
+#       OFF = logic 1 - Factory Setting
+# sw8   ON   enables Polling Option
+#       OFF disables Polling Option - Factory Setting
+#
+#
+# On some older adm31s, S4 does not exist, and S5-sw6 is not defined.
+#
+# This adm31 entry uses underline as the standout mode.
+# If the adm31 gives you trouble with standout mode, check the DIP switch in
+# position 6, bank @c11, 25% from back end of the circuit board.  Should be
+# OFF.  If there is no such switch, you have an old adm31 and must use oadm31.
+# (adm31: removed obsolete ":ma=j^Jk^P^K^Pl ^R^L^L :" -- esr)
+adm31|LSI adm31 with sw6 set for underline mode,
+	OTbs, am, mir,
+	cols#80, lines#24,
+	bel=^G, clear=\E*, cr=\r, cub1=^H, cud1=\n, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW,
+	dl1=\ER, ed=\EY, el=\ET, home=^^, il1=\EE, ind=\n, is2=\Eu\E0,
+	kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K, kf0=^A0\r, kf1=^A1\r,
+	kf2=^A2\r, kf3=^A3\r, kf4=^A4\r, kf5=^A5\r, kf6=^A6\r,
+	kf7=^A7\r, kf8=^A8\r, kf9=^A9\r, rmir=\Er, rmso=\EG0,
+	rmul=\EG0, sgr0=\EG0, smir=\Eq, smso=\EG1, smul=\EG1,
+adm31-old|o31|old adm31,
+	rmul@, smso=\EG4, smul@, use=adm31,
+# LSI ADM-36 from Col. George L. Sicherman <gloria!colonel> via BRL
+adm36|LSI ADM36,
+	OTbs, OTpt,
+	OTkn#4,
+	if=/usr/share/tabset/vt100,
+	is2=\E<\E>\E[6;?2;?7;?8h\E[4;20;?1;?3;?4;?5;?6;?18;?19l, use=vt100+4bsd,
+# (adm42: removed obsolete ":ma=^K^P:" -- esr)
+adm42|LSI adm42,
+	OTbs, am,
+	cols#80, lines#24,
+	bel=^G, cbt=\EI, clear=\E;, cr=\r, cub1=^H, cud1=\n, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K,
+	cvvis=\EC\E3 \E3(, dch1=\EW, dl1=\ER, ed=\EY, el=\ET, ht=^I,
+	il1=\EE$<270>, ind=\n, invis@, ip=$<6*>, kcub1=^H, kcud1=\n,
+	kcuf1=^L, kcuu1=^K, khome=^^, pad=^?, rmir=\Er, rmul@,
+	smir=\Eq, smul@, use=adm+sgr,
+# The following termcap for the Lear Siegler ADM-42 leaves the
+# "system line" at the bottom of the screen blank (for those who
+# find it distracting otherwise)
+adm42-ns|LSI adm-42 with no system line,
+	cbt=\EI\EF \011, clear=\E;\EF \011,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c$<6>\EF \011,
+	dch1=\EW\EF \011, dl1=\ER\EF \011, ed=\EY\EF \011,
+	el=\ET\EF \011, il1=\EE\EF \011, rmir=\Er\EF \011,
+	smir=\Eq\EF \011, use=adm42,
+# ADM 1178 terminal -- rather like an ADM-42.  Manual is dated March 1 1985.
+# The insert mode of this terminal is commented out because it's broken for our
+# purposes in that it will shift the position of every character on the page,
+# not just the cursor line!
+# From: Michael Driscoll <fenris@lightspeed.net> 10 July 1996
+adm1178|1178|LSI adm1178,
+	am,
+	cols#80, lines#24, xmc#1,
+	bel=^G, bold=\E(, cbt=\EI, clear=\E+, cr=\r, cub1=^H, cud1=\n,
+	cuf1=^L, cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K,
+	cvvis=\EC\E3 \E3(, dch1=\EW, dl1=\ER, ed=\EY, el=\ET,
+	home=^^, ht=^I, il1=\EE, ind=\n, ip=$<6*/>, kbs=^H, kcub1=^H,
+	kcud1=\n, nel=\r\n, pad=^?, rev=\EG4, rmso=\EG0, rmul=\EG0,
+	sgr0=\E), smso=\EG4, smul=\EG1,
+
+#### Prime
+#
+# Yes, Prime made terminals.  These entries were posted by Kevin J. Cummings
+# <cummings@primerd.prime.com> on 14 Dec 1992 and lightly edited by esr.
+# Prime merged with ComputerVision in the late 1980s; you can reach them at:
+#
+#	ComputerVision Services
+#	500 Old Connecticut Path
+#	Framingham, Mass.
+#
+
+# Standout mode is dim reverse-video.
+pt100|pt200|wren|fenix|Prime pt100/pt200,
+	am, bw, mir, msgr,
+	cols#80, it#8, lines#24,
+	cbt=\E[Z, clear=\E?, cr=\r, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\ED, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E0%p1%{33}%+%c%p2%{33}%+%c, cuu=\E[%p1%dA,
+	cuu1=\EM, dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m, dl1=\E[M,
+	ed=\E[J\E[r, el=\E[K\E[t, flash=\E$$<200/>\E$P,
+	home=\E$B, ht=^I, il1=\E[L\E[t, ind=\n, kbs=^H, kcub1=\E[D,
+	kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, khome=\E$A, nel=\r\n,
+	rmcup=, rmir=\E[4l, rmkx=\E[>13l, rmso=\E[m, rmul=\E[m,
+	sgr0=\E[m,
+	smcup=\E[>1l\E[>2l\E[>16l\E[4l\E[>9l\E[20l\E[>3l\E[>7h\E[>12
+	      l\E[1Q,
+	smir=\E[4h, smkx=\E[>13h, smso=\E[2;7m, smul=\E[4m,
+pt100w|pt200w|wrenw|fenixw|Prime pt100/pt200 in 132-column mode,
+	cols#132,
+	cup=\E[%i%p1%d;%p2%dH, use=pt100,
+pt250|Prime PT250,
+	rmso@, smso@, use=pt100,
+pt250w|Prime PT250 in 132-column mode,
+	rmso@, smso@, use=pt100w,
+
+#### Qume (qvt)
+#
+#	Qume, Inc.
+#	3475-A North 1st Street
+#	San Jose CA 95134
+#	Vox: (800)-457-4447
+#	Fax: (408)-473-1510
+#	Net: josed@techsupp.wyse.com (Jose D'Oliveira)
+#
+# Qume was bought by Wyse, but still (as of early 1995) has its own support
+# group and production division.
+#
+# Discontinued Qume models:
+#
+# The qvt101 and qvt102 listed here are long obsolete; so is the qvt101+
+# built to replace them, and a qvt119+ which was a 101+ with available wide
+# mode (132 columns).  There was a qvt103 which added VT100/VT131 emulations
+# and an ANSI-compatible qvt203 that replaced it.  Qume started producing
+# ANSI-compatible terminals with the qvt323 and qvt61.
+#
+# Current Qume models (as of February 1995):
+#
+# All current Qume terminals have ANSI-compatible operation modes.
+# Qume is still producing the qvt62, which features emulations for other
+# popular lines such as ADDS, and dual-host capabilities.  The qvt82 is
+# designed for use as a SCO ANSI terminal.  The qvt70 is a color terminal
+# with many emulations including Wyse370, Wyse 325, etc.  Their newest
+# model is the qvt520, which is VT420-compatible.
+#
+# There are some ancient printing Qume terminals under `Daisy Wheel Printers'
+#
+# If you inherit a Qume without docs, try Ctrl-Shift-Setup to enter its
+# setup mode.  Shift-s should be a configuration save to NVRAM.
+
+qvt101|qvt108|Qume qvt 101 and QVT 108,
+	xmc#1, use=qvt101+,
+
+# This used to have <cvvis=\E.2> but no <cnorm> or <civis>.  The BSD termcap
+# file had <cvvis=\EM4 \200\200\200>.  I've done the safe thing and yanked
+# both. The <rev> is from BSD, which also claimed bold=\E( and dim=\E).
+# What seems to be going on here is that this entry was designed so that
+# the normal highlight is bold and standout is dim plus something else
+# (reverse-video maybe?  But then, are there two <rev> sequences?)
+#
+# Added kdch1, kil1, kdl1 based on screenshot -TD:
+#	http://www.vintagecomputer.net/qume/qvt-108/qume_qvt-108_keyboard.jpg
+qvt101+|qvt101p|Qume qvt 101 PLUS product,
+	am, bw, hs, ul,
+	cols#80, lines#24, xmc#0,
+	bel=^G, cbt=\EI, clear=^Z, cnorm=\E.4, cr=\r, cub1=^H, cud1=\n,
+	cuf1=^L, cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K,
+	dch1=\EW, dl1=\ER, dsl=\Eg\Ef\r, ed=\EY, el=\ET,
+	flash=\Eb$<200>\Ed, fsl=\r, home=^^, ht=^I, hts=\E1,
+	ich1=\EQ, il1=\EE, ind=\n, invis@, kbs=^H, kcbt=\EI, kcub1=^H,
+	kcud1=\n, kcuf1=^L, kcuu1=^K, kdch1=\EW, kdl1=\ER, ked=\EY,
+	kel=\ET, kf1=^A@\r, kf10=^AI\r, kf2=^AA\r, kf3=^AB\r,
+	kf4=^AC\r, kf5=^AD\r, kf6=^AE\r, kf7=^AF\r, kf8=^AG\r,
+	kf9=^AH\r, khome=^^, kich1=\EQ, kil1=\EE, mc4=\EA, mc5=\E@,
+	rmso=\E(, smso=\E0P\E), tbc=\E3, tsl=\Eg\Ef, use=adm+sgr,
+qvt102|Qume qvt 102,
+	cnorm=\E., use=qvt101,
+# (qvt103: added <rmam>/<smam> based on init string -- esr)
+qvt103|Qume qvt 103,
+	am, xenl, xon,
+	cols#80, it#8, lines#24, vt#3,
+	bel=^G, blink=\E[5m$<2>, bold=\E[1m$<2>,
+	clear=\E[H\E[2J$<50>, cr=\r, csr=\E[%i%p1%d;%p2%dr,
+	cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=\n,
+	cuf=\E[%p1%dC, cuf1=\E[C$<2>,
+	cup=\E[%i%p1%d;%p2%dH$<5>, cuu=\E[%p1%dA,
+	cuu1=\E[A$<2>, ed=\E[J$<50>, el=\E[K$<3>, home=\E[H, ht=^I,
+	hts=\EH, ind=\n, kbs=^H, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC,
+	kcuu1=\EOA, kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, rc=\E8,
+	rev=\E[7m$<2>, ri=\EM$<5>, rmam=\E[?7l, rmkx=\E[?1l\E>,
+	rmso=\E[m$<2>, rmul=\E[m$<2>,
+	rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, sc=\E7,
+	sgr=\E[%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1
+	    %;m$<2>,
+	sgr0=\E[m$<2>, smam=\E[?7h, smkx=\E[?1h\E=,
+	smso=\E[7m$<2>, smul=\E[4m$<2>, tbc=\E[3g,
+qvt103-w|Qume qvt103 132 cols,
+	cols#132, lines#24,
+	rs2=\E>\E[?3h\E[?4l\E[?5l\E[?8h, use=qvt103,
+qvt119+|qvt119p|qvt119|Qume qvt 119 and 119PLUS terminals,
+	am, hs, mir, msgr,
+	cols#80, lines#24, xmc#0,
+	bel=^G, cbt=\EI, clear=\E*1, cnorm=\E.4, cr=\r, cub1=^H,
+	cud1=\n, cuf1=^L, cup=\E=%p1%{32}%+%c%p2%{32}%+%c,
+	cuu1=^K, cvvis=\E.2, dch1=\EW, dl1=\ER, dsl=\Eg\Ef\r, ed=\Ey,
+	el=\Et, flash=\En0$<200>\En1, fsl=\r, home=^^, ht=^I,
+	hts=\E1, il1=\EE, ind=\n, is2=\EDF\EC\EG0\Er\E(\E%EX,
+	kbs=^H, kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K, kf0=^AI\r,
+	kf1=^A@\r, kf2=^AA\r, kf3=^AB\r, kf4=^AC\r, kf5=^AD\r,
+	kf6=^AE\r, kf7=^AF\r, kf8=^AG\r, kf9=^AH\r, khome=^^,
+	mc4=\EA, mc5=\E@, ri=\EJ, rmir=\Er, smir=\Eq, smul=\EG8,
+	tbc=\E3, tsl=\Eg\Ef, use=adm+sgr,
+qvt119+-25|qvt119p-25|QVT 119 PLUS with 25 data lines,
+	lines#25, use=qvt119+,
+qvt119+-w|qvt119p-w|qvt119-w|QVT 119 and 119 PLUS in 132 column mode,
+	cols#132,
+	is2=\EDF\EC\EG0\Er\E(\E%\EX\En4, use=qvt119+,
+qvt119+-25-w|qvt119p-25-w|qvt119-25-w|QVT 119 and 119 PLUS 132 by 25,
+	lines#25, use=qvt119+,
+qvt203|qvt203+|Qume qvt 203 Plus,
+	dch1=\E[P$<7>, dl1=\E[M$<99>, il1=\E[L$<99>, ind=\n$<30>,
+	ip=$<7>, kf0=\E[29~, kf1=\E[17~, kf2=\E[18~, kf3=\E[19~,
+	kf4=\E[20~, kf5=\E[21~, kf6=\E[23~, kf7=\E[24~, kf8=\E[25~,
+	kf9=\E[28~, rmir=\E[4l, smir=\E[4h, use=qvt103,
+qvt203-w|qvt203-w-am|Qume qvt 203 PLUS in 132 cols (w/advanced video),
+	cols#132, lines#24,
+	rs2=\E>\E[?3h\E[?4l\E[?5l\E[?8h, use=qvt203,
+#
+#	Since a command is present for enabling 25 data lines,
+#	a specific terminfo entry may be generated for the 203.
+#	If one is desired for the QVT 119 PLUS then 25 lines must
+#	be selected in the status line (setup line 9).
+#
+qvt203-25|QVT 203 PLUS with 25 by 80 column mode,
+	cols#80, lines#25,
+	is2=\E[=40h\E[?3l, use=qvt203,
+qvt203-25-w|QVT 203 PLUS with 25 by 132 columns,
+	cols#132, lines#25,
+	rs2=\E[?3h\E[=40h, use=qvt203,
+
+#### TeleVideo (tvi)
+#
+#	TeleVideo
+#	550 East Brokaw Road
+#	PO Box 49048    95161
+#	San Jose CA 95112
+#	Vox: (408)-954-8333
+#	Fax: (408)-954-0623
+#
+#
+# These require incredible amounts of padding.
+#
+# All of these terminals (912 to 970 and the tvipt) are discontinued.  Newer
+# TeleVideo terminals are ANSI and PC-ANSI compatible.
+
+tvi803|TeleVideo 803,
+	clear=\E*$<10>, use=tvi950,
+
+# Vanilla tvi910 -- W. Gish <cswarren@violet> 10/29/86
+# Switch settings are:
+#
+# S1  1 2 3 4
+#     D D D D  9600
+#     D D D U    50
+#     D D U D    75
+#     D D U U   110
+#     D U D D   135
+#     D U D U   150
+#     D U U D   300
+#     D U U U   600
+#     U D D D  1200
+#     U D D U  1800
+#     U D U D  2400
+#     U D U U  3600
+#     U U D D  4800
+#     U U D U  7200
+#     U U U D  9600
+#     U U U U 19200
+#
+# S1  5 6 7 8
+#     U D X D  7N1 (data bits, parity, stop bits) (X means ignored)
+#     U D X U  7N2
+#     U U D D  7O1
+#     U U D U  7O2
+#     U U U D  7E1
+#     U U U U  7E2
+#     D D X D  8N1
+#     D D X U  8N2
+#     D U D D  8O1
+#     D U U U  8E2
+#
+# S1  9  Autowrap
+#     U  on
+#     D  off
+#
+# S1 10  CR/LF
+#     U  do CR/LF when CR received
+#     D  do CR when CR received
+#
+# S2  1  Mode
+#     U  block
+#     D  conversational
+#
+# S2  2  Duplex
+#     U  half
+#     D  full
+#
+# S2  3  Hertz
+#     U  50
+#     D  60
+#
+# S2  4  Edit mode
+#     U  local
+#     D  duplex
+#
+# S2  5  Cursor type
+#     U  underline
+#     D  block
+#
+# S2  6  Cursor down key
+#     U  send ^J
+#     D  send ^V
+#
+# S2  7  Screen colour
+#     U  green on black
+#     D  black on green
+#
+# S2  8  DSR status (pin 6)
+#     U  disconnected
+#     D  connected
+#
+# S2  9  DCD status (pin 8)
+#     U  disconnected
+#     D  duplex
+#
+# S2 10  DTR status (pin 20)
+#     U  disconnected
+#     D  duplex
+# (tvi910: removed obsolete ":ma=^Kk^Ll^R^L:"; added <khome>, <cub1>, <cud1>,
+# <ind>, <hpa>, <vpa>, <am>, <msgr> from SCO entry -- esr)
+tvi910|TeleVideo model 910,
+	OTbs, am, msgr,
+	cols#80, it#8, lines#24, xmc#1,
+	bel=^G, cbt=\EI, clear=^Z, cr=\r, cub1=^H, cud1=\n, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, ed=\EY, el=\ET,
+	home=\E=^A^A, hpa=\E]%p1%{32}%+%c, ht=^I,
+	if=/usr/share/tabset/stdcrt, ind=\n, invis@, kbs=^H,
+	kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K, kf0=^AI\r, kf1=^A@\r,
+	kf2=^AA\r, kf3=^AB\r, kf4=^AC\r, kf5=^AD\r, kf6=^AE\r,
+	kf7=^AF\r, kf8=^AG\r, kf9=^AH\r, khome=^^,
+	vpa=\E[%p1%{32}%+%c, use=adm+sgr,
+# From: Alan R. Rogers <rogers%albany@csnet-relay>
+# as subsequently hacked over by someone at SCO
+# (tvi910+: removed obsolete ":ma=^K^P^L :" -- esr)
+#
+# Here are the 910+'s DIP switches (U = up, D = down, X = don't care):
+#
+# S1  1 2 3 4:
+#     D D D D  9600     D D D U    50     D D U D    75     D D U U   110
+#     D U D D   135     D U D U   150     D U U D   300     D U U U   600
+#     U D D D  1200     U D D U  1800     U D U D  2400     U D U U  3600
+#     U U D D  4800     U U D U  7200     U U U D  9600     U U U U 19200
+#
+# S1  5 6 7 8:
+#     U D X D  7N1     U D X U  7N2     U U D D  7O1     U U D U  7O2
+#     U U U D  7E1     U U U U  7E2     D D X D  8N1     D D X U  8N2
+#     D U D D  8O1     D U U U  8E2
+#
+# S1  9  Autowrap            (U = on, D = off)
+# S1 10  CR/LF               (U = CR/LF on CR received, D = CR on CR received)
+# S2  1  Mode                (U = block, D = conversational)
+# S2  2  Duplex              (U =  half, D = full)
+# S2  3  Hertz               (U = 50, D = 60)
+# S2  4  Edit mode           (U = local, D = duplex)
+# S2  5  Cursor type         (U = underline, D = block)
+# S2  6  Cursor down key     (U = send ^J, D = send ^V)
+# S2  7  Screen colour       (U = green on black, D = black on green)
+# S2  8  DSR status (pin 6)  (U = disconnected, D = connected)
+# S2  9  DCD status (pin 8)  (U = disconnected, D = connected)
+# S2 10  DTR status (pin 20) (U = disconnected, D = connected)
+#
+tvi910+|TeleVideo 910+,
+	dch1=\EW, dl1=\ER$<33*>, home=^^, ich1=\EQ, il1=\EE$<33*>,
+	kf0=^A@\r, kf1=^AA\r, kf2=^AB\r, kf3=^AC\r, kf4=^AD\r,
+	kf5=^AE\r, kf6=^AF\r, kf7=^AG\r, kf8=^AH\r, kf9=^AI\r,
+	ll=\E=7\s, use=tvi910,
+
+# (tvi912: removed obsolete ":ma=^K^P^L :", added  <flash> and
+# <khome> from BRL entry -- esr)
+tvi912|tvi914|tvi920|TeleVideo 912/914/920 (old),
+	OTbs, OTpt, am, msgr,
+	cols#80, it#8, lines#24, xmc#1,
+	bel=^G, clear=^Z, cr=\r, cub1=^H, cud1=\n, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW,
+	dl1=\ER$<33*>, ed=\Ey, el=\ET, flash=\Eb$<50/>\Ed, home=^^,
+	ht=^I, hts=\E1, ich1=\EQ, if=/usr/share/tabset/stdcrt,
+	il1=\EE$<33*>, ind=\n, kbs=^H, kcub1=^H, kcud1=\n, kcuf1=^L,
+	kcuu1=^K, kf0=^AI\r, kf1=^A@\r, kf2=^AA\r, kf3=^AB\r,
+	kf4=^AC\r, kf5=^AD\r, kf6=^AE\r, kf7=^AF\r, kf8=^AG\r,
+	kf9=^AH\r, khome=^^, rmso=\Ek, rmul=\Em, smso=\Ej, smul=\El,
+	tbc=\E3,
+# We got some new tvi912c terminals that act really weird on the regular
+# termcap, so one of our gurus worked this up. Seems that cursor
+# addressing is broken.
+tvi912cc|tvi912 at Cowell College,
+	cup@, use=tvi912c,
+
+# tvi{912,920}[bc] - TeleVideo TVI-912B/TVI-920B and TVI-912C/TVI-920C
+# From: Benjamin C. W. Sittler
+#
+# Someone has put a scanned copy of the manual online at:
+#     http://vt100.net/televideo/912b-om/
+#     (https://vt100.net/manx/details/6,5484)
+#
+# These terminals were produced ca. 1979, and had a 12" monochrome
+# screen, supported 75-9600 baud (no handshaking), monochrome, 7-bit
+# ASCII, and were generally similar to adm3a but with attributes
+# (including some with magic cookies), fancy half-duplex mode, and
+# different bugs.
+#
+# Some operations require truly incredible amounts of padding. The
+# insert_line (<il1>) and delete_line (<dl1>) operations in particular
+# are so slow as to be nearly unusable.
+#
+# There may or may not have been a separate, earlier series of 912/920
+# terminals (without the "B" and "C" suffix); I have never seen one,
+# and the manual only describes the "B" and "C" series. The 912 and 920
+# are quite distinct from the 914 and 924, which were much nicer non-
+# magic-cookie terminals similar to the 950.
+#
+# This is a new description for the following TeleVideo terminals,
+# distinguished chiefly by their keyboards:
+#
+#   TVI-912B - very odd layout, no function keys (84 keys)
+#   TVI-920B - typewriter layout, no function keys (103 keys)
+#   TVI-912C - very odd layout, function keys F1-F11 (82 keys)
+#   TVI-920C - typewriter layout, function keys F1-F11 (101 keys)
+#
+# To choose a setting for the TERM variable, start with the model:
+#
+#    Model  || base name
+# ----------||-----------
+#  TVI-912B || tvi912b
+#  TVI-912C || tvi912c
+#  TVI-920B || tvi920b
+#  TVI-920C || tvi920c
+#
+# Then add a suffix from the following table describing installed options
+# and how you'd like to use the terminal:
+#
+#   Use Video | Second | Visual |  Magic  |  Page || feature
+#  Attributes |  Page  |  Bell  | Cookies | Print || suffix
+# ------------|--------|--------|---------|-------||---------
+#      No     |   No   |  N/A   |   N/A   |   No  || -unk
+#      No     |   No   |  N/A   |   N/A   |  Yes  || -p
+#      No     |  Yes   |   No   |   N/A   |   No  || -2p-unk
+#      No     |  Yes   |   No   |   N/A   |  Yes  || -2p-p
+#      No     |  Yes   |  Yes   |   N/A   |   No  || -vb-unk
+#      No     |  Yes   |  Yes   |   N/A   |  Yes  || -vb-p
+#     Yes     |   No   |  N/A   |    No   |  N/A  ||
+#     Yes     |   No   |  N/A   |   Yes   |  N/A  || -mc
+#     Yes     |  Yes   |   No   |    No   |  N/A  || -2p
+#     Yes     |  Yes   |   No   |   Yes   |  N/A  || -2p-mc
+#     Yes     |  Yes   |  Yes   |    No   |  N/A  || -vb
+#     Yes     |  Yes   |  Yes   |   Yes   |  N/A  || -vb-mc
+#
+# So e.g. a model 920 C with second page memory option, visual bell
+# and no magic cookies would be tvi920c-vb; a model 912 B without the
+# second page memory option and using magic cookies would be
+# tvi912b-mc
+#
+# PADDING
+#
+# At 9600 baud, the terminal is prone to overflow its input buffer
+# during complex operations (insert/delete
+# character/line/screen/page), and it does not signal this over the
+# RS232 cable. The typical symptom of an overrun is that the terminal
+# starts beeping, and output becomes garbled.
+#
+# The padding delays in this terminfo were derived using tack(1)
+# running on a Linux box connected to a TVI-920C with a later-model
+# (A49C1-style) ROM running at 9600 baud, so your mileage may
+# vary. The numbers below seem to give the terminal enough time so
+# that it doesn't overflow its input buffer and start losing
+# characters.
+#
+# KEYS
+#
+# If you want to use the FUNCT key on a tvi912[bc], use the
+# corresponding tvi920[bc] terminfo with FUNCT + ... equivalents from
+# the following table (these also work on the 920 series):
+#
+# Unshifted Function Keys:
+#
+#  Key | capname|| Equivalent
+# -----|--------||------------
+#   F1 |  <kf1> || FUNCT + @
+#   F2 |  <kf2> || FUNCT + A
+#   F3 |  <kf3> || FUNCT + B
+#   F4 |  <kf4> || FUNCT + C
+#   F5 |  <kf5> || FUNCT + D
+#   F6 |  <kf6> || FUNCT + E
+#   F7 |  <kf7> || FUNCT + F
+#   F8 |  <kf8> || FUNCT + G
+#   F9 |  <kf9> || FUNCT + H
+#  F10 | <kf10> || FUNCT + I
+#  F11 | <kf11> || FUNCT + J
+#
+# Shifted Function Keys:
+#
+#  SHIFT + Key | capname|| Equivalent
+# -------------|--------||------------
+#   SHIFT + F1 | <kf12> || FUNCT + `
+#   SHIFT + F2 | <kf13> || FUNCT + a
+#   SHIFT + F3 | <kf14> || FUNCT + b
+#   SHIFT + F4 | <kf15> || FUNCT + c
+#   SHIFT + F5 | <kf16> || FUNCT + d
+#   SHIFT + F6 | <kf17> || FUNCT + e
+#   SHIFT + F7 | <kf18> || FUNCT + f
+#   SHIFT + F8 | <kf19> || FUNCT + g
+#   SHIFT + F9 | <kf20> || FUNCT + h
+#  SHIFT + F10 | <kf21> || FUNCT + i
+#  SHIFT + F11 | <kf22> || FUNCT + j
+#
+# PORTS AND SWITCH SETTINGS
+#
+# Here are the switch settings for the TVI-912B/TVI-920B and
+# TVI-912C/TVI-920C:
+#
+# S1 (Line), and S3 (Printer) baud rates -- put one, and only one, switch down:
+# 2: 9600	3: 4800		4: 2400		5: 1200
+# 6:  600	7:  300		8:  150		9:   75
+# 10: 110
+#
+# S2 UART/Terminal options:
+#		Up			Down
+# 1:		Not used		Not allowed
+# 2:	Alternate character set	  Standard character set
+# 3:	    Full duplex		    Half duplex
+# 4:	    50 Hz refresh	    60 Hz refresh
+# 5:	      No parity		     Send parity
+# 6:	     2 stop bits	     1 stop bit
+# 7:	     8 data bits	     7 data bits
+# 8:		Not used		Not allowed on Rev E or lower
+# 9:	     Even parity	     Odd parity
+# 10:	    Steady cursor	    Blinking cursor
+#	(On Rev E or lower, use W25 instead of switch 10.)
+#
+# S5 UART/Terminal options:
+#		Open			Closed
+# 1:	P3-6 Not connected	DSR received on P3-6
+# 2:	P3-8 Not connected	DCD received on P3-8
+#
+# 3 Open, 4 Open:		P3-20 Not connected
+# 3 Open, 4 Closed:	DTR on when terminal is on
+# 3 Closed, 4 Open:	DTR is connected to RTS
+# 3 Closed, 4 Closed:	Not allowed
+#
+# 5 Closed:	HDX printer (hardware control) Rev. K with extension port off,
+#		all data transmitted out of the modem port (P3) will also be
+#		transmitted out of the printer port (P4).
+#
+# 6 Open, 7 Open:		Not allowed
+# 6 Open, 7 Closed:	20ma current loop input
+# 6 Closed, 7 Open:	RS232 input
+# 6 Closed, 7 Closed:	Not allowed
+#
+# Jumper options:
+# If the jumper is installed, the effect will occur (the next time the terminal
+# is switched on).
+#
+# S4/W31:	Enables automatic LF upon receipt of CR from
+#		remote or keyboard.
+# S4/W32:	Enables transmission of EOT at the end of Send.  If not
+#		installed, a carriage return is sent.
+# S4/W33:	Disables automatic carriage return in column 80.
+# S4/W34:	Selects Page Print Mode as initial condition.  If not
+#		installed, Extension Mode is selected.
+#
+# NON-STANDARD CAPABILITIES
+#
+# Sending <u9> or <u7> returns a cursor position report in the format
+# YX\r, where Y and X are as in <cup>. This format is described in
+# <u8> and <u6>, but it's not clear how one should write an
+# appropriate scanf string, since we need to subtract %' ' from the
+# character after reading it. The <u9> capability is used by tack(1)
+# to synchronize during padding tests, and seems to work for that
+# purpose.
+#
+# This description also includes the obsolete termcap capabilities
+# has_hardware_tabs (<OTpt>) and backspaces_with_bs (<OTbs>).
+#
+# FEATURES NOT YET DESCRIBED IN THIS TERMINFO
+#
+# The FUNCT modifier actually works with every normal key by sending
+# ^AX\r, where X is the sequence normally sent by that key. This is a
+# sort of meta key not currently describable in terminfo.
+#
+# There are quite a few other keys (especially on the 920 models,) but
+# they are for the most part only useful in block mode.
+#
+# These terminals have lots of forms manipulation features, mainly
+# useful in block mode, including "clear X to nulls" (vs. "clear X to
+# spaces"; nulls are sentinels for "send X" operations); "send X"
+# operations for uploading all or part of the screen; and block-mode
+# editing keys (they don't send escape sequences, but manipulate video
+# memory directly). Block mode is used for local editing, and protect
+# mode (in conjunction with the "write protect" attribute,
+# a.k.a. half-intensity outside of protect mode) is used to control
+# which parts of the screen are edited/sent/printed (by <mc0>).
+#
+# There are at least two major families of ROM, "early" and
+# A49B1/A49C1; the major difference seems to be that the latter ROMs
+# support a few extra escape sequences for manipulating the off-screen
+# memory page, and for sending whole pages back to the host (mainly
+# useful in block mode.) The descriptions in this file don't use any
+# of those sequences: set cursor position including page (\E-PYX,
+# where P is \s for page 0 and ! for page 1 [actually only the LSB of
+# P is taken into account, so e.g. 0 and 1 work too,] and Y and X are
+# as in <cup>); read cursor position (\E/), which is analogous to <u9>
+# and returns PYX\r, where P is \s for page 0 or ! for page 1, and YX
+# are as in <cup>, and some "send page" features mainly useful for
+# forms manipulation.
+#
+# The keyboard enable (\E") and disable (\E#) sequences are unused,
+# except that a terminal reset (<is2>) enables the keyboard.
+#
+# Auto-flip mode (\Ev) is likely faster than the scrolling mode (\Ew)
+# enabled in <is2>, but auto-flip is very jarring so we don't use it.
+#
+# BUGS
+#
+# At least up to the A49B1 and A49C1 ROMs, there are no \Eb and \Ed
+# sequences (I infer that in some TeleVideo terminal they may invert
+# and uninvert the display) so the <flash> sequence given here is a
+# cheesy page-flip instead.
+#
+# The back_tab (<cbt>) sequence (\EI) doesn't work according to
+# tack(1), so it is not included in the descriptions below.
+#
+# It's not clear whether auto_left_margin (<bw>) flag should be set
+# for these terminals; tack says yes, so it is set here, but this
+# differs from other descriptions I've seen.
+#
+# Extension print mode (<mc5>) echoes all characters to the printer
+# port [in addition to displaying them] except for the page print mode
+# sequence (<mc4>); this is a slight violation of the terminfo
+# definition for <mc5> but I don't expect it to cause problems.  We
+# reset to page print mode in <rs1> since it may have been enabled
+# accidentally.
+#
+# The descriptions with plus signs (+) are building blocks.
+
+tvi912b-unk|tvi912c-unk|TeleVideo TVI-912B or TVI-912C (no attributes),
+	OTbs, OTpt, am, bw,
+	cols#80, it#8, lines#24,
+	bel=^G, clear=\032$<50>, cr=\r, cub1=^H, cud1=\n, cuf1=^L,
+	cup=\E=%p1%' '%+%c%p2%' '%+%c, cuu1=^K, dch1=\EW$<30>,
+	dl1=\ER$<1*>$<100>, ed=\Ey$<2*>$<10>, el=\ET$<15>,
+	home=^^, ht=^I, hts=\E1, ich1=\EQ$<30>,
+	if=/usr/share/tabset/stdcrt, il1=\EE$<1*>$<100>,
+	ind=\n$<10>, is2=\Ew\EA\E'\E"\E(, kcub1=^H, kcud1=\n,
+	kcuf1=^L, kcuu1=^K, kdch1=^?, kent=\r, khome=^^, mc4=\EA,
+	mc5=\E@, rs1=\Ek\010\Em\010\Eq\032, tbc=\E3, u6=%c%c\r,
+	u7=\E?, u8=%c%c\r, u9=\E?,
+
+# This isn't included in the basic capabilities because it is
+# typically unusable in combination with the full range of video
+# attributes, since the magic cookie attributes turn into ASCII
+# control characters, and the half-intensity ("protected") attribute
+# converts all affected characters to spaces.
+
+tvi912b+printer|TeleVideo TVI-912B/TVI-920B and TVI-912C/TVI-920C page print support,
+	mc0=\EP,
+
+# This uses half-intensity mode (<dim>) for standout (<smso>), and
+# exposes no other attributes (half-intensity is the only attribute
+# that does not generate a magic cookie.)
+
+tvi912b+dim|TeleVideo TVI-912B/TVI-920B and TVI-912C/TVI-920C half-intensity attribute support,
+	msgr,
+	dim=\E), rmso=\E(, sgr=\E%?%p1%p5%|%t)%e(%;, sgr0=\E(,
+	smso=\E),
+
+# Full magic-cookie attribute support, with half-intensity reverse
+# video for standout. Note that we add a space in the <dim> sequence
+# to give a consistent magic-cookie count. Also note that <sgr> uses
+# backspacing (in the TVI-supported order) to apply all requested
+# attributes with only a single magic cookie.
+
+tvi912b+mc|TeleVideo TVI-912B/TVI-920B and TVI-912C/TVI-920C full magic-cookie attribute support,
+	xmc#1,
+	blink=\E\^, dim=\E)\s, invis=\E_, rev=\Ej, rmso=\E(\Ek,
+	rmul=\Em,
+	sgr=\E%?%p1%p5%|%t)%e(%;\s\010\E%?%p1%p3%|%tj%ek%;\010\E%?
+	    %p2%tl%em%;\010\E%?%p7%t_%e%?%p4%t\^%eq%;%;,
+	sgr0=\E(\Ek\010\Em\010\Eq, smso=\E)\Ej, smul=\El,
+
+# This uses the second page memory option to save & restore screen
+# contents. If your terminal is missing the option, this description
+# should still work, but that has not been tested.
+
+tvi912b+2p|TeleVideo TVI-912B/TVI-920B and TVI-912C/TVI-920C second page memory option support,
+	flash=\EK$<100>\EK, rmcup=\032$<50>\EK\E=7\s,
+	smcup=\EK\032$<50>\E(\Ek\010\Em\010\Eq\032$<50>,
+
+# This simulates flashing by briefly toggling to the other page
+# (kludge!)
+
+tvi912b+vb|TeleVideo TVI-912B/TVI-920B and TVI-912C/TVI-920C second page memory option "visible bell" support,
+	bel=\EK$<100>\EK, use=tvi912b+2p,
+
+# Function keys (<kf12> .. <kf22> are shifted <kf1> .. <kf11>)
+
+tvi920b+fn|TeleVideo TVI-920B and TVI-920C function key support,
+	kf1=^A@\r, kf10=^AI\r, kf11=^AJ\r, kf12=^A`\r, kf13=^Aa\r,
+	kf14=^Ab\r, kf15=^Ac\r, kf16=^Ad\r, kf17=^Ae\r, kf18=^Af\r,
+	kf19=^Ag\r, kf2=^AA\r, kf20=^Ah\r, kf21=^Ai\r, kf22=^Aj\r,
+	kf3=^AB\r, kf4=^AC\r, kf5=^AD\r, kf6=^AE\r, kf7=^AF\r,
+	kf8=^AG\r, kf9=^AH\r,
+
+# Combinations of the basic building blocks
+
+tvi912b-2p-unk|tvi912c-2p-unk|tvi912b-unk-2p|tvi912c-unk-2p|TeleVideo TVI-912B or TVI-912C (second page memory option; no attributes),
+	use=tvi912b+2p, use=tvi912b-unk,
+
+tvi912b-vb-unk|tvi912c-vb-unk|tvi912b-unk-vb|tvi912c-unk-vb|TeleVideo TVI-912B or TVI-912C (second page memory option "visible bell"; no attributes),
+	use=tvi912b+vb, use=tvi912b-unk,
+
+tvi912b-p|tvi912c-p|TeleVideo TVI-912B or TVI-912C (no attributes; page print),
+	use=tvi912b+printer, use=tvi912b-unk,
+
+tvi912b-2p-p|tvi912c-2p-p|tvi912b-p-2p|tvi912c-p-2p|TeleVideo TVI-912B or TVI-912C (second page memory option; no attributes; page print),
+	use=tvi912b+2p, use=tvi912b+printer, use=tvi912b-unk,
+
+tvi912b-vb-p|tvi912c-vb-p|tvi912b-p-vb|tvi912c-p-vb|TeleVideo TVI-912B or TVI-912C (second page memory option "visible bell"; no attributes; page print),
+	use=tvi912b+vb, use=tvi912b+printer, use=tvi912b-unk,
+
+tvi912b-2p|tvi912c-2p|TeleVideo TVI-912B or TVI-912C (second page memory option; half-intensity attribute),
+	use=tvi912b+2p, use=tvi912b+dim, use=tvi912b-unk,
+
+tvi912b-2p-mc|tvi912c-2p-mc|tvi912b-mc-2p|tvi912c-mc-2p|TeleVideo TVI-912B or TVI-912C (second page memory option; magic cookies),
+	use=tvi912b+2p, use=tvi912b+mc, use=tvi912b-unk,
+
+tvi912b-vb|tvi912c-vb|TeleVideo TVI-912B or TVI-912C (second page memory option "visible bell"; half-intensity attribute),
+	use=tvi912b+vb, use=tvi912b+dim, use=tvi912b-unk,
+
+tvi912b-vb-mc|tvi912c-vb-mc|tvi912b-mc-vb|tvi912c-mc-vb|TeleVideo TVI-912B or TVI-912C (second page memory option "visible bell"; magic cookies),
+	use=tvi912b+vb, use=tvi912b+mc, use=tvi912b-unk,
+
+tvi912b|tvi912c|TeleVideo TVI-912B or TVI-912C (half-intensity attribute),
+	use=tvi912b+dim, use=tvi912b-unk,
+
+tvi912b-mc|tvi912c-mc|TeleVideo TVI-912B or TVI-912C (magic cookies),
+	use=tvi912b+mc, use=tvi912b-unk,
+
+tvi920b-unk|tvi920c-unk|TeleVideo TVI-920B or TVI-920C (no attributes),
+	use=tvi920b+fn, use=tvi912b-unk,
+
+tvi920b-2p-unk|tvi920c-2p-unk|tvi920b-unk-2p|tvi920c-unk-2p|TeleVideo TVI-920B or TVI-920C (second page memory option; no attributes),
+	use=tvi920b+fn, use=tvi912b+2p, use=tvi912b-unk,
+
+tvi920b-vb-unk|tvi920c-vb-unk|tvi920b-unk-vb|tvi920c-unk-vb|TeleVideo TVI-920B or TVI-920C (second page memory option "visible bell"; no attributes),
+	use=tvi920b+fn, use=tvi912b+vb, use=tvi912b-unk,
+
+tvi920b-p|tvi920c-p|TeleVideo TVI-920B or TVI-920C (no attributes; page print),
+	use=tvi920b+fn, use=tvi912b+printer, use=tvi912b-unk,
+
+tvi920b-2p-p|tvi920c-2p-p|tvi920b-p-2p|tvi920c-p-2p|TeleVideo TVI-920B or TVI-920C (second page memory option; no attributes; page print),
+	use=tvi920b+fn, use=tvi912b+2p, use=tvi912b+printer,
+	use=tvi912b-unk,
+
+tvi920b-vb-p|tvi920c-vb-p|tvi920b-p-vb|tvi920c-p-vb|TeleVideo TVI-920B or TVI-920C (second page memory option "visible bell"; no attributes; page print),
+	use=tvi920b+fn, use=tvi912b+vb, use=tvi912b+printer,
+	use=tvi912b-unk,
+
+tvi920b-2p|tvi920c-2p|TeleVideo TVI-920B or TVI-920C (second page memory option; half-intensity attribute),
+	use=tvi920b+fn, use=tvi912b+2p, use=tvi912b+dim,
+	use=tvi912b-unk,
+
+tvi920b-2p-mc|tvi920c-2p-mc|tvi920b-mc-2p|tvi920c-mc-2p|TeleVideo TVI-920B or TVI-920C (second page memory option; magic cookies),
+	use=tvi920b+fn, use=tvi912b+2p, use=tvi912b+mc,
+	use=tvi912b-unk,
+
+tvi920b-vb|tvi920c-vb|TeleVideo TVI-920B or TVI-920C (second page memory option "visible bell"; half-intensity attribute),
+	use=tvi920b+fn, use=tvi912b+vb, use=tvi912b+dim,
+	use=tvi912b-unk,
+
+tvi920b-vb-mc|tvi920c-vb-mc|tvi920b-mc-vb|tvi920c-mc-vb|TeleVideo TVI-920B or TVI-920C (second page memory option "visible bell"; magic cookies),
+	use=tvi920b+fn, use=tvi912b+vb, use=tvi912b+mc,
+	use=tvi912b-unk,
+
+tvi920b|tvi920c|TeleVideo TVI-920B or TVI-920C (half-intensity attribute),
+	use=tvi920b+fn, use=tvi912b+dim, use=tvi912b-unk,
+
+tvi920b-mc|tvi920c-mc|TeleVideo TVI-920B or TVI-920C (magic cookies),
+	use=tvi920b+fn, use=tvi912b+mc, use=tvi912b-unk,
+
+# TeleVideo 921 and variants
+# From: Tim Theisen <tim@cs.wisc.edu> 22 Sept 1995
+# (tvi921: removed :ko=bt: before translation, I see no backtab cap;
+# also added empty <acsc> to suppress tic warning -- esr)
+tvi921|TeleVideo model 921 with sysline same as page & real vi function,
+	OTbs, OTpt, am, hs, xenl, xhp,
+	cols#80, lines#24, xmc#0,
+	acsc=, clear=^Z, cnorm=\E.3, cr=\r, cub1=^H, cud1=^V, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c$<3/>, cuu1=^K,
+	cvvis=\E.2, dch1=\EW, dl1=\ER$<1*/>, dsl=\Ef\r\Eg, ed=\EY,
+	el=\ET, fsl=\Eg, home=^^, ht=^I, ich1=\EQ,
+	if=/usr/share/tabset/stdcrt, il1=\EE, ind=\n, invis@,
+	is2=\El\E"\EF1\E.3\017\EA\E<, kbs=^H, kclr=^Z, kcub1=^H,
+	kcud1=^V, kcuf1=^L, kcuu1=^K, kdch1=\EW, kdl1=\ER$<1*/>,
+	ked=\EY, kel=\ET, kich1=\EQ, kil1=\EE, nel=\r\n, rmacs=\E%%,
+	rmir=, smacs=\E$, smir=, tsl=\Ef\EG0, use=adm+sgr,
+# without the beeper
+# (tvi92B: removed :ko=bt: before translation, I see no backtab cap;
+# also added empty <acsc> to suppress tic warning -- esr)
+tvi92B|TeleVideo model 921 with sysline same as page & real vi function & no beeper,
+	am, hs, xenl, xhp,
+	cols#80, lines#24, xmc#0,
+	acsc=, clear=^Z, cnorm=\E.3, cr=\r, cub1=^H, cud1=^V, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c$<3/>, cuu1=^K,
+	cvvis=\E.2, dch1=\EW, dl1=\ER$<1*/>, dsl=\Ef\r\Eg, ed=\EY,
+	el=\ET, flash=\Eb$<200/>\Ed, fsl=\Eg, home=^^, ht=^I,
+	ich1=\EQ, if=/usr/share/tabset/stdcrt, il1=\EE, ind=\n,
+	invis@, is2=\El\E"\EF1\E.3\017\EA\E<, kbs=^H, kclr=^Z,
+	kcub1=^H, kcud1=^V, kcuf1=^L, kcuu1=^K, kdch1=\EW,
+	kdl1=\ER$<1*/>, ked=\EY, kel=\ET, kich1=\EQ, kil1=\EE,
+	nel=\r\n, rmacs=\E%%, smacs=\E$, tsl=\Ef\EG0, use=adm+sgr,
+# (tvi92D: removed :ko=bt: before translation, I see no backtab cap -- esr)
+tvi92D|tvi92B with DTR instead of XON/XOFF & better padding,
+	dl1=\ER$<2*/>, il1=\EE$<2*/>,
+	is2=\El\E"\EF1\E.3\016\EA\E<, kdl1=\ER$<2*/>,
+	kil1=\EE$<2*/>, use=tvi92B,
+
+# (tvi924: This used to have <dsl=\Es0>, <fsl=\031>.  I put the new strings
+# in from a BSD termcap file because it looks like they do something the
+# old ones skip -- esr)
+tvi924|TeleVideo tvi924,
+	am, bw, hs, in, mir, msgr, xenl, xon,
+	cols#80, it#8, lines#24, wsl#80, xmc#0,
+	bel=^G, blink=\EG2, cbt=\EI, civis=\E.0, clear=\E*0,
+	cnorm=\E.3, cr=\r, csr=\E_%p1%{32}%+%c%p2%{32}%+%c,
+	cub1=^H, cud1=^V, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, cvvis=\E.1,
+	dch1=\EW, dl1=\ER, dsl=\Es0\Ef\031, ed=\Ey, el=\Et,
+	flash=\Eb$<200>\Ed, fsl=\031\Es1, home=^^, ht=^I, hts=\E1,
+	ich1=\EQ, if=/usr/share/tabset/stdcrt, il1=\EE, ind=\n,
+	invis@, is1=\017\E%\E'\E(\EDF\EC\EG0\EN0\Es0\Ev0,
+	kbs=^H, kclr=\E*0, kcub1=^H, kcud1=^V, kcuf1=^L, kcuu1=^K,
+	kdch1=\EW, kdl1=\ER, ked=\Ey, kel=\Et, kf0=^A@\r, kf1=^AA\r,
+	kf10=^AJ\r, kf11=^AK\r, kf12=^AL\r, kf13=^AM\r, kf14=^AN\r,
+	kf15=^AO\r, kf2=^AB\r, kf3=^AC\r, kf4=^AD\r, kf5=^AE\r,
+	kf6=^AF\r, kf7=^AG\r, kf8=^AH\r, kf9=^AI\r, khome=^^,
+	kich1=\EQ, kil1=\EE, lf0=F1, lf1=F2, lf10=F11, lf2=F3, lf3=F4,
+	lf4=F5, lf5=F6, lf6=F7, lf7=F8, lf8=F9, lf9=F10,
+	pfkey=\E|%p1%{49}%+%c%p2%s\031, ri=\Ej, tbc=\E3, tsl=\Ef,
+	use=adm+sgr,
+
+# TVI925 DIP switches.  In each of these, D = Down and U = Up,
+#
+# Here are the settings for the external (baud) switches (S1):
+#
+#             Position		Baud
+# 7	8	9	10		[Printer]
+# 1	2	3	4		[Main RS232]
+# -----------------------------------------------------
+# D	D	D	D	9600
+# D	D	D	U	  50
+# D	D	U	D	  75
+# D	D	U	U	 110
+# D	U	D	D	 135
+# D	U	D	U	 150
+# D	U	U	D	 300
+# D	U	U	U	 600
+# U	D	D	D	1200
+# U	D	D	U	1800
+# U	D	U	D	2400
+# U	D	U	U	3600
+# U	U	D	D	4800
+# U	U	D	U	7200
+# U	U	U	D	9600
+# U	U	U	U	19200
+#
+#
+# Settings for word length and stop-bits (S1)
+#
+#  Position	Description
+# 5	6
+# ---------------------------
+# U	-	7-bit word
+# D	-	8-bit word
+# -	U	2 stop bits
+# -	D	1 stop bit
+#
+#
+# S2 (external) settings
+#
+# Position	Up	Dn	Description
+# --------------------------------------------
+# 1		X		Local edit
+#			X	Duplex edit (transmit editing keys)
+# --------------------------------------------
+# 2		X		912/920 emulation
+#			X	925
+# --------------------------------------------
+# 3			X
+# 4			X	No parity
+# 5			X
+# --------------------------------------------
+# 3			X
+# 4			X	Odd parity
+# 5		X
+# --------------------------------------------
+# 3			X
+# 4		X		Even parity
+# 5		X
+# --------------------------------------------
+# 3		X
+# 4			X	Mark parity
+# 5		X
+# --------------------------------------------
+# 3		X
+# 4		X		Space parity
+# 5		X
+# --------------------------------------------
+# 6		X		White on black display
+#			X	Black on white display
+# --------------------------------------------
+# 7			X	Half Duplex
+# 8			X
+# --------------------------------------------
+# 7		X		Full Duplex
+# 8			X
+# --------------------------------------------
+# 7			X	Block mode
+# 8		X
+# --------------------------------------------
+# 9			X	50 Hz
+#		X		60 Hz
+# --------------------------------------------
+# 10		X		CR/LF (Auto LF)
+#			X	CR only
+#
+# S3 (internal switch) settings:
+#
+# Position	Up	Dn	Description
+# --------------------------------------------
+# 1		X		Keyclick off
+#			X	Keyclick on
+# --------------------------------------------
+# 2			X	English
+# 3			X
+# --------------------------------------------
+# 2			X	German
+# 3		X
+# --------------------------------------------
+# 2		X		French
+# 3			X
+# --------------------------------------------
+# 2		X		Spanish
+# 3		X
+# --------------------------------------------
+# 4			X	Blinking block cursor
+# 5			X
+# --------------------------------------------
+# 4			X	Blinking underline cursor
+# 5		X
+# --------------------------------------------
+# 4		X		Steady block cursor
+# 5			X
+# --------------------------------------------
+# 4		X		Steady underline cursor
+# 5		X
+# --------------------------------------------
+# 6		X		Screen blanking timer (ON)
+#			X	Screen blanking timer (OFF)
+# --------------------------------------------
+# 7		X		Page attributes
+#			X	Line attributes
+# --------------------------------------------
+# 8		X		DCD disconnected
+#			X	DCD connected
+# --------------------------------------------
+# 9		X		DSR disconnected
+#			X	DSR connected
+# --------------------------------------------
+# 10		X		DTR Disconnected
+#			X	DTR connected
+# --------------------------------------------
+#
+# (tvi925: BSD has <clear=\E*>.  I got <is2> and <ri> from there -- esr)
+tvi925|TeleVideo 925,
+	OTbs, am, bw, hs, ul,
+	cols#80, lines#24, xmc#1,
+	bel=^G, cbt=\EI, clear=^Z, cnorm=\E.4, cr=\r, cub1=^H, cud1=^V,
+	cuf1=^L, cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K,
+	cvvis=\E.2, dch1=\EW, dl1=\ER, dsl=\Eh, ed=\EY, el=\ET,
+	flash=\Eb$<200>\Ed, fsl=\r\Eg, home=^^, ht=^I, hts=\E1,
+	ich1=\EQ, il1=\EE, ind=\n, invis@, is2=\El\E", kbs=^H, kclr=^Z,
+	kcub1=^H, kcud1=^V, kcuf1=^L, kcuu1=^K, kdch1=\EW, kdl1=\ER,
+	ked=\EY, kel=\ET, kf0=^AI\r, kf1=^A@\r, kf2=^AA\r, kf3=^AB\r,
+	kf4=^AC\r, kf5=^AD\r, kf6=^AE\r, kf7=^AF\r, kf8=^AG\r,
+	kf9=^AH\r, khome=^^, kich1=\EQ, kil1=\EE, ri=\Ej, tbc=\E3,
+	tsl=\Eh\Ef, use=adm+sgr,
+# TeleVideo 925 from Mitch Bradley <sun!wmb> via BRL
+# to avoid "magic cookie" standout glitch:
+tvi925-hi|TeleVideo Model 925 with half intensity standout mode,
+	xmc@,
+	kbs=^H, kcub1=^H, kcud1=\n, rmso=\E(, smso=\E), use=tvi925,
+
+# From: Todd Litwin <litwin@litwin.jpl.nasa.gov> 28 May 1993
+# Originally Tim Curry, Univ. of Central Fla., <duke!ucf-cs!tim> 5/21/82
+# for additional capabilities,
+# The following tvi descriptions from B:pjphar and virus!mike
+# is for all 950s.  It sets the following attributes:
+# full duplex (\EDF)		write protect off (\E()
+# conversation mode (\EC)	graphics mode off (\E%)
+# white on black (\Ed)		auto page flip off (\Ew)
+# turn off status line (\Eg)	clear status line (\Ef\r)
+# normal video (\E0)		monitor mode off (\EX or \Eu)
+# edit mode (\Er)		load blank char to space (\Ee\040)
+# line edit mode (\EO)		enable buffer control (^O)
+# protect mode off (\E\047)	duplex edit keys (\El)
+# program unshifted send key to send line all (\E016)
+# program shifted send key to send line unprotected (\E004)
+# set the following to nulls:
+#	field delimiter (\Ex0\200\200)
+#	line delimiter (\Ex1\200\200)
+#	start-protected field delimiter (\Ex2\200\200)
+#	end-protected field delimiter (\Ex3\200\200)
+# set end of text delimiter to carriage return/null (\Ex4\r\200)
+#
+#                     TVI 950 Switch Setting Reference Charts
+#
+#                                     TABLE 1:
+#
+#      S1     1     2     3     4     5     6     7     8     9    10
+#          +-----------------------+-----+-----+-----------------------+
+#          | Computer Baud Rate    |Data |Stop | Printer Baud Rate     |
+#          |                       |Bits |Bits |                       |
+#   +------+-----------------------+-----+-----+-----------------------+
+#   |  Up  |        See            |  7  |  2  |        See            |
+#   +------+-----------------------+-----+-----+-----------------------+
+#   | Down |      TABLE 2          |  8  |  1  |      TABLE 2          |
+#   +------+-----------------------+-----+-----+-----------------------+
+#
+#
+#      S2     1     2     3     4     5     6     7     8     9    10
+#          +-----+-----+-----------------+-----+-----------+-----+-----+
+#          |Edit |Cursr|    Parity       |Video|Transmiss'n| Hz  |Click|
+#   +------+-----+-----+-----------------+-----+-----------+-----+-----+
+#   |  Up  | Dplx|Blink|      See        |GonBk|   See     | 60  | Off |
+#   +------+-----+-----+-----------------+-----+-----------+-----+-----+
+#   | Down |Local|St'dy|    TABLE 3      |BkonG|  CHART    | 50  | On  |
+#   +------+-----+-----+-----------------+-----+-----------+-----+-----+
+#
+#                                    TABLE 2:
+#
+#             +-----------+-----+-----+-----+-----+-----------+
+#             | Display   |  1  |  2  |  3  |  4  |   Baud    |
+#             +-----------+-----+-----+-----+-----+           |
+#             | Printer   |  7  |  8  |  9  | 10  |   Rate    |
+#             +-----------+-----+-----+-----+-----+-----------+
+#                         |  D  |  D  |  D  |  D  |   9600    |
+#                         |  U  |  D  |  D  |  D  |     50    |
+#                         |  D  |  U  |  D  |  D  |     75    |
+#                         |  U  |  U  |  D  |  D  |    110    |
+#                         |  D  |  D  |  U  |  D  |    135    |
+#                         |  U  |  D  |  U  |  D  |    150    |
+#                         |  D  |  U  |  U  |  D  |    300    |
+#                         |  U  |  U  |  U  |  D  |    600    |
+#                         |  D  |  D  |  D  |  U  |   1200    |
+#                         |  U  |  D  |  D  |  U  |   1800    |
+#                         |  D  |  U  |  D  |  U  |   2400    |
+#                         |  U  |  U  |  D  |  U  |   3600    |
+#                         |  D  |  D  |  U  |  U  |   4800    |
+#                         |  U  |  D  |  U  |  U  |   7200    |
+#                         |  D  |  U  |  U  |  U  |   9600    |
+#                         |  U  |  U  |  U  |  U  |  19200    |
+#                         +-----+-----+-----+-----+-----------+
+#
+#                                    TABLE 3:
+#                         +-----+-----+-----+-----------+
+#                         |  3  |  4  |  5  |   Parity  |
+#                         +-----+-----+-----+-----------+
+#                         |  X  |  X  |  D  |    None   |
+#                         |  D  |  D  |  U  |     Odd   |
+#                         |  D  |  U  |  U  |    Even   |
+#                         |  U  |  D  |  U  |    Mark   |
+#                         |  U  |  U  |  U  |   Space   |
+#                         +-----+-----+-----+-----------+
+#                                 X = don't care
+#
+#                                     CHART:
+#                         +-----+-----+-----------------+
+#                         |  7  |  8  | Communication   |
+#                         +-----+-----+-----------------+
+#                         |  D  |  D  |  Half Duplex    |
+#                         |  D  |  U  |  Full Duplex    |
+#                         |  U  |  D  |     Block       |
+#                         |  U  |  U  |     Local       |
+#                         +-----+-----+-----------------+
+#
+# (tvi950: early versions had obsolete ":ma=^Vj^Kk^Hh^Ll^^H:".
+# I also inserted <ich1> and <kich1>; the :ko: string indicated that <ich>
+# should be present and all tvi native modes use the same string for this.
+# Finally, note that BSD has cud1=^V. -- esr)
+#
+# TVI 950 has 11 function-keys -TD
+tvi950|TeleVideo 950,
+	OTbs, am, hs, mir, msgr, xenl, xon,
+	cols#80, it#8, lines#24, xmc#1,
+	acsc=jHkGlFmEnIqKtMuLvOwNxJ, bel=^G, cbt=\EI, clear=\E*,
+	cr=\r, cub1=^H, cud1=\n, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW,
+	dl1=\ER, dsl=\Eg\Ef\r, ed=\Ey, el=\Et, flash=\Eb$<200/>\Ed,
+	fsl=\r, home=^^, ht=^I, hts=\E1, ich1=\EQ, il1=\EE, ind=\n,
+	invis@,
+	is2=\EDF\EC\Ed\EG0\Eg\Er\EO\E'\E(\E%\Ew\EX\Ee\s\017\011\El
+	    \E016\E004\Ex0\0\0\Ex1\0\0\Ex2\0\0\011\Ex3\0\0\Ex4\r\0
+	    \Ef\r,
+	kbs=^H, kcbt=\EI, kclr=\E*, kcub1=^H, kcud1=^V, kcuf1=^L,
+	kcuu1=^K, kdch1=\EW, kdl1=\ER, ked=\Ey, kel=\Et, kf1=^A@\r,
+	kf10=^AI\r, kf11=^AJ\r, kf2=^AA\r, kf3=^AB\r, kf4=^AC\r,
+	kf5=^AD\r, kf6=^AE\r, kf7=^AF\r, kf8=^AG\r, kf9=^AH\r,
+	khome=^^, kich1=\EQ, kil1=\EE, mc4=\Ea, mc5=\E`, ri=\Ej,
+	rmacs=\E%%, rmir=\Er, smacs=\E$, smir=\Eq, tbc=\E3,
+	tsl=\Eg\Ef, kF1=^A`\r, kF10=^Ai\r, kF11=^Aj\r, kF2=^Aa\r,
+	kF3=^Ab\r, kF4=^Ac\r, kF5=^Ad\r, kF6=^Ae\r, kF7=^Af\r,
+	kF8=^Ag\r, kF9=^Ah\r, use=adm+sgr,
+#
+# is for 950 with two pages adds the following:
+#	set 48 line page (\E\\2)
+#	place cursor at page 0, line 24, column 1 (\E-07 )
+#	set local (no send) edit keys (\Ek)
+#
+# two page 950 adds the following:
+#	when entering ex, set 24 line page (\E\\1)
+#	when exiting ex, reset 48 line page (\E\\2)
+#			 place cursor at 0,24,1 (\E-07 )
+#	set duplex (send) edit keys (\El) when entering vi
+#	set local (no send) edit keys (\Ek) when exiting vi
+#
+tvi950-2p|TeleVideo 950 w/2 pages,
+	is2=\EDF\EC\Ed\EG0\Eg\Er\EO\E'\E(\E%\Ew\EX\Ee\s\017\011\Ek
+	    \E016\E004\Ex0\0\0\Ex1\0\0\Ex2\0\0\011\Ex3\0\0\Ex4\r\0
+	    \E\\2\E-07\s\011,
+	rmcup=\E\\2\E-07\s, rmkx=\Ek, smcup=\E\\1\E-07\s,
+	smkx=\El, use=tvi950,
+#
+# is for 950 with four pages adds the following:
+#	set 96 line page (\E\\3)
+#	place cursor at page 0, line 24, column 1 (\E-07 )
+#
+# four page 950 adds the following:
+#	when entering ex, set 24 line page (\E\\1)
+#	when exiting ex, reset 96 line page (\E\\3)
+#			 place cursor at 0,24,1 (\E-07 )
+#
+tvi950-4p|TeleVideo 950 w/4 pages,
+	is2=\EDF\EC\Ed\EG0\Eg\Er\EO\E'\E(\E%\Ew\EX\Ee\s\017\011\Ek
+	    \E016\E004\Ex0\0\0\Ex1\0\0\Ex2\0\0\011\Ex3\0\0\Ex4\r\0
+	    \E\\3\E-07\s\011,
+	rmcup=\E\\3\E-07\s, rmkx=\Ek, smcup=\E\\1\E-07\s,
+	smkx=\El, use=tvi950,
+#
+# <is2> for reverse video 950 changes the following:
+#	set reverse video (\Ed)
+#
+# set vb accordingly (\Ed ...delay... \Eb)
+#
+tvi950-rv|TeleVideo 950 rev video,
+	flash=\Ed$<200/>\Eb,
+	is2=\EDF\EC\Eb\EG0\Eg\Er\EO\E'\E(\E%\Ew\EX\Ee\s\017\011\El
+	    \E016\E004\Ex0\0\0\Ex1\0\0\Ex2\0\0\011\Ex3\0\0\Ex4\r
+	    \0,
+	use=tvi950,
+
+# tvi950-rv-2p uses the appropriate entries from 950-2p and 950-rv
+tvi950-rv-2p|TeleVideo 950 rev video w/2 pages,
+	flash=\Ed$<200/>\Eb,
+	is2=\EDF\EC\Eb\EG0\Eg\Er\EO\E'\E(\E%\Ew\EX\Ee\s\017\011\Ek
+	    \E016\E004\Ex0\0\0\Ex1\0\0\Ex2\0\0\011\Ex3\0\0\Ex4\r\0
+	    \E\\2\E-07\s,
+	rmcup=\E\\2\E-07\s, rmkx=\Ek, smcup=\E\\1\E-07\s,
+	smkx=\El, use=tvi950,
+
+# tvi950-rv uses the appropriate entries from 950-4p and 950-rv
+tvi950-rv-4p|TeleVideo 950 rev video w/4 pages,
+	flash=\Ed$<200/>\Eb,
+	is2=\EDF\EC\Eb\EG0\Er\EO\E'\E(\E%\Ew\EX\Ee\s\017\011\Ek
+	    \E016\E004\Ex0\0\0\Ex1\0\0\Ex2\0\0\011\Ex3\0\0\Ex4\r\0
+	    \E\\3\E-07\s,
+	rmcup=\E\\3\E-07\s, rmkx=\Ek, smcup=\E\\1\E-07\s,
+	smkx=\El, use=tvi950,
+# From: Andreas Stolcke <stolcke@icsi.berkeley.edu>
+# (tvi955: removed obsolete ":ma:=^Vj^Kk^Hh^Ll^^H";
+# removed incorrect (and overridden) ":do=^J:"; fixed broken continuations in
+# the :rs: string, inserted the <ich> implied by the termcap :ko: string.  Note
+# the :ko: string had :cl: in it, which means that one of the original
+# <clear=\E*>, <kclr=\EY> had to be wrong; set <kclr=\E*> because that's what
+# the 950 has.   Finally, corrected the <kel> string to match the 950 and what
+# ko implies -- esr)
+# If the BSD termcap file was right, <cup=\E=%p1%{32}%+%c%p2%{32}%+%c> would
+# also work.
+tvi955|TeleVideo 955,
+	OTbs, mc5i, msgr@,
+	it#8, xmc@,
+	acsc=0_`RjHkGlFmEnIoPqKsQtMuLvOwNxJ, blink=\EG2,
+	civis=\E.0, cnorm=\E.2, cud1=^V, cup=\E[%i%p1%d;%p2%dH,
+	cvvis=\E.1, dim=\E[=5h, ind@, invis=\EG1,
+	is2=\E[=3l\EF1\Ed\EG0\E[=5l\E%\El, kctab=\E2, khts=\E1,
+	knp=\EK, kpp=\EJ, krmir=\EQ, ktbc=\E3, mc0=\EP, rmacs=\E%,
+	rmam=\E[=7l, rmxon=^N,
+	rs1=\EDF\EC\Eg\Er\EO\E'\E(\Ew\EX\Ee\s\017\E0P\E6\0\E0p\E4\0
+	    \Ef\r,
+	sgr0=\EG0\E[=5l, smacs=\E$, smam=\E[=7h, smxon=^O,
+	use=tvi950,
+tvi955-w|955-w|TeleVideo 955 w/132 cols,
+	cols#132,
+	is2=\E[=3h\EF1\Ed\EG0\E[=5l\E%\El, use=tvi955,
+# use half-intensity as normal mode, full intensity as <bold>
+tvi955-hb|955-hb|TeleVideo 955 half-bright,
+	bold=\E[=5l, dim@, is2=\E[=3l\EF1\Ed\EG0\E[=5h\E%\El,
+	sgr0=\EG0\E[=5h, use=tvi955,
+# From: Humberto Appleton <beto@cs.utexas.edu>, 880521 UT Austin
+# (tvi970: removed ":sg#0:"; removed <rmso>=\E[m, <rmul>=\E[m;
+# added <am>/<csr>/<home>/<hpa>/<vpa>/<smcup>/<rmcup> from BRL.
+# According to BRL we could have <rmkx>=\E>, <smkx>=\E= but I'm not sure what
+# it does to the function keys.  I deduced <rmam>/<smam>.
+# also added empty <acsc> to suppress tic warning,  -- esr)
+tvi970|TeleVideo 970,
+	OTbs, OTpt, am, da, db, mir, msgr,
+	cols#80, it#8, lines#24,
+	acsc=, cbt=\E[Z, clear=\E[H\E[2J, csr=\E[%i%p1%d;%p2%dr,
+	cub1=^H, cud1=\ED, cuf1=\E[C, cup=\E[%i%p1%d;%p2%df,
+	cuu1=\EM, cvvis=\E[1Q, dch1=\E[P, dl1=\E[M, dsl=\Eg\Ef\r,
+	ed=\E[J, el=\E[K, flash=\E[5m$<200/>\E[m, home=\E[H,
+	hpa=\E[%i%p1%dG, ht=^I, il1=\E[L,
+	is2=\E<\E[?21l\E[19h\E[1Q\E[10l\E[7l\E[H\E[2J,
+	kbs=^H, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A,
+	kf1=\E?a, kf2=\E?b, kf3=\E?c, kf4=\E?d, kf5=\E?e, kf6=\E?f,
+	kf7=\E?g, kf8=\E?h, kf9=\E?i, khome=\E[H, ri=\EM, rmacs=\E(B,
+	rmam=\E[?7h, rmcup=, rmir=\E[4l, rmso=\E[m, rmul=\E[m,
+	sgr0=\E[m, smacs=\E(B, smam=\E[?7l,
+	smcup=\E[?20l\E[?7h\E[1Q, smir=\E[4h, smso=\E[7m,
+	smul=\E[4m, vpa=\E[%i%p1%dd,
+tvi970-vb|TeleVideo 970 with visual bell,
+	flash=\E[?5h\0\0\0\0\0\0\0\0\0\0\0\0\0\E[?5l,
+	use=tvi970,
+tvi970-2p|TeleVideo 970 with using 2 pages of memory,
+	rmcup=\E[H\E[J\E[V, smcup=\E[U\E[?20l\E[?7h\E[1Q,
+	use=tvi970,
+# Works with vi and rogue.  NOTE: Esc v sets autowrap on, Esc u sets 80 chars
+# per line (rather than 40), Esc K chooses the normal character set.  Not sure
+# padding is needed, but adapted from the tvi920c termcap.  The <smso> and
+# <smul> strings are klutzy, but at least use no screen space.
+# (tvipt: removed obsolete ":ma=^Kk^Ll^R^L:".  I wish we knew <rmam>,
+# its absence means <smam>=\Ev isn't safe to use. -- esr)
+# From: Gene Rochlin <armsis@amber.berkeley.edu> 9/19/84.
+# The <ed>/<kf0>/<kf1>/<khome>/<mc4>, and <mc5> caps are from BRL, which says:
+# F1 and F2 should be programmed as ^A and ^B; required for UNIFY.
+tvipt|TeleVideo personal terminal,
+	OTbs, am,
+	cols#80, lines#24,
+	cbt=\EI, clear=^Z, cub1=^H, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dl1=\ER$<5*>,
+	ed=\EY, el=\ET, home=^^, if=/usr/share/tabset/stdcrt,
+	il1=\EE$<5*>, is2=\Ev\Eu\EK, kbs=^H, kcub1=^H, kcud1=\n,
+	kcuf1=^L, kcuu1=^K, kf0=^A, kf1=^B, khome=^^, mc4=^T, mc5=^R,
+	rmso=\EF, rmul=\EF, smso=\EG1@A\EH, smul=\EG1B@\EH,
+# From: Nathan Peterson <nathan@sco.com>, 03 Sep 1996
+tvi9065|TeleVideo 9065,
+	am, bw, chts, hs, mc5i, mir, msgr, xenl, xon,
+	cols#80, it#8, lh#1, lines#25, lm#0, lw#9, ma#4, nlab#8, vt#0,
+	wnum#0, wsl#30,
+	acsc='r0_jhkglfmeniopqksqtmulvownxj, bel=^G,
+	blink=\EG2, bold=\EG\,, cbt=\EI, civis=\E.0, clear=^Z,
+	cnorm=\E.3, cr=\r, csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD,
+	cub1=^H, cud=\E[%p1%dB, cud1=^V, cuf=\E[%p1%dC, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu=\E[%p1%dA,
+	cuu1=^K, cvvis=\E.2, dch=\E[%p1%dP, dch1=\EW, dim=\EGp,
+	dl=\E[%p1%dM, dl1=\ER, dsl=\E_30\r, ech=\E[%p1%d@, ed=\EY,
+	el=\ET, flash=\Eb$<15>\Ed, fsl=\r, home=^^, ht=^I, hts=\E1,
+	ich=\E[%p1%d@, if=/usr/share/tabset/stdcrt,
+	il=\E[%p1%dL, il1=\EE, ind=\n, invis=\EG1, ip=$<3>,
+	is1=\E"\E%\E'\E(\EG@\EO\EX\E[=5l\E[=6l\E[=7h\Ed\Er,
+	is2=\EF2\EG0\E\\L, is3=\E<\E[=4l\E[=8h, kHOM=\E\s\s\s,
+	kbs=^H, kcbt=\EI, kcub1=^H, kcud1=^V, kcuf1=^L, kcuu1=^K,
+	kdch1=\EW, kf1=^A@\r, kf10=^AI\r, kf11=^AJ\r, kf12=^AK\r,
+	kf2=^AA\r, kf3=^AB\r, kf4=^AC\r, kf5=^AD\r, kf6=^AE\r,
+	kf7=^AF\r, kf8=^AG\r, kf9=^AH\r, khome=^^, ll=\E[25;1H,
+	mc0=\E[0;0i, mc4=\Ea, mc5=\E`, nel=\r\n,
+	pfkey=\E|%p1%{48}%+%c3%p2%s\031,
+	pfloc=\E|%p1%{48}%+%c2%p2%s\031,
+	pfx=\E|%p1%{48}%+%c1%p2%s\031,
+	pln=\E_%p1%{63}%+%c%p2%s\r, prot=\E&,
+	rep=\E[%p2%db%p1%c, rev=\EG4,
+	rf=/usr/share/tabset/stdcrt, ri=\Ej, rmacs=\E%%,
+	rmam=\E[=7l, rmcup=\E.3\Er\E[1;25r\E[25;0H, rmdc=\0,
+	rmir=\Er, rmln=\E[4;1v, rmso=\EG0, rmul=\EG0, rmxon=^N,
+	rs1=\EC\EDF\E[0;0v\E[8;1v\E[=65l,
+	rs2=\E.b\E[10;20v\E[14;1v\E[3;0v\E[7;0v\E[=11.h\E[=12.h\E[=1
+	    3.h\E[=14.h\E[=15l\E[=20h\E[=60l\E[=61h\E[=9l\E[=10l\E[=
+	    21l\E[=23l\E[=3l\E_40\E_50\En\Ew\Ee\s\Ex0\0\0\Ex1\0\0
+	    \Ex2\0\0\Ex3\0\0\Ex4\0\0\E1,
+	rs3=\E[=19h\E.3\E9\E0O\0\0\0\0\0\E0o\0\0\0\0\0\E0J\177\0\0
+	    \0\0,
+	sgr=\EG0%?%p1%t\EGt%;%?%p2%t\EG8%;%?%p3%t\EG4%;%?%p4%t\EG2%;
+	    %?%p5%t\EGp%;%?%p6%t\EG\,%;%?%p7%t\EG1%;%?%p8%t\E&%;%?
+	    %p9%t\E$%e\E%%%;,
+	sgr0=\EG0\E%, smacs=\E$, smam=\E=7h, smcup=\E.2, smdc=\Er,
+	smir=\Eq, smln=\E[4;2v, smso=\EGt, smul=\EG8, smxon=^O,
+	tbc=\E3, tsl=\E[4;1v\E_30, uc=\EG8\EG0, use=ecma+index,
+
+#### Visual (vi)
+#
+# In September 1993, Visual Technology of Westboro, Massachusetts,
+# merged with White Pine Software of Nashua, New Hampshire.
+#
+# White Pine Software may be contacted at +1 603/886-9050.
+# Or visit White Pine on the World Wide Web at URL http://www.wpine.com.
+#
+
+# Visual 50 from Beau Shekita, BTL-Whippany <whuxlb!ejs>
+# Recently I hacked together the following termcap for Visual
+# Technology's Visual 50 terminal. It's a slight modification of
+# the VT52 termcap.
+# It's intended to run when the Visual 50 is in VT52 emulation mode
+# (I know what you're thinking; if it's emulating a VT52, then why
+# another termcap? Well, it turns out that the Visual 50 can handle
+# <dl1> and db(?) among other things, which the VT52 can't)
+# The termcap works OK for the most part. The only problem is on
+# character inserts. The whole line gets painfully redrawn for each
+# character typed. Any suggestions?
+# Beau's entry is combined with the vi50 entry from University of Wisconsin.
+# Note especially the <il1> function.  <kf4>-<kf6> are really l4-l6 in
+# disguise; <kf7>-<kf9> are really l1-l3.
+vi50|Visual 50,
+	OTbs, OTpt, am, da, db, msgr,
+	cols#80, it#8, lines#24,
+	OTnl=\n, bel=^G, cbt=\Ez$<4/>, clear=\EH\EJ, cr=\r, cub1=^H,
+	cud1=\EB, cuf1=\EC, cup=\EY%p1%{32}%+%c%p2%{32}%+%c,
+	cuu1=\EA, dl1=\EM$<3*/>, ed=\EJ, el=\EK$<16/>, home=\EH,
+	ht=^I, il1=\EL, ind=\n, kbs=^H, kcub1=\ED, kcud1=\EB,
+	kcuf1=\EC, kcuu1=\EA, kf1=\EP, kf2=\EQ, kf3=\ER, kf4=\EV,
+	kf5=\EE, kf6=\E], kf7=\EL, kf8=\Ev, kf9=\EM, khome=\EH,
+	nel=\r\n, ri=\EI, rmso=\ET, rmul=\EW, smso=\EU, smul=\ES,
+# this one was BSD & SCO's vi50
+vi50adm|Visual 50 in adm3a mode,
+	am, msgr,
+	cols#80, it#8, lines#24,
+	bel=^G, clear=^Z, cr=\r, cub1=^H, cud1=\n, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dl1=\EM,
+	ed=\Ek, el=\EK, home=\EH, ht=^I, il1=\EL, ind=\n, kbs=^H,
+	kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, khome=\EH,
+	rmso=\ET, smso=\EU,
+# From: Jeff Siegal <jbs@quiotix.com>
+vi55|Visual 55,
+	OTbs, am, mir, msgr,
+	cols#80, it#8, lines#24,
+	clear=\Ev, csr=\E_%p1%{65}%+%c%p2%{65}%+%c, cub1=^H,
+	cud1=\n, cuf1=\EC, cup=\EY%p1%{32}%+%c%p2%{32}%+%c,
+	cuu1=\EA, dch1=\Ew, dl1=\EM, ed=\EJ, el=\EK, home=\EH, ht=^I,
+	il1=\EL, is2=\Ev\E_AX\Eb\EW\E9P\ET, kbs=^H, kcub1=\ED,
+	kcud1=\EB, kcuf1=\EC, kcuu1=\EA, ri=\EI, rmir=\Eb, rmso=\ET,
+	smir=\Ea, smso=\EU,
+
+# Visual 200 from BRL
+# The following switch settings are assumed for normal operation:
+#	FULL_DUPLEX		SCROLL			CR
+#	AUTO_NEW_LINE_ON	VISUAL_200_EMULATION_MODE
+# Other switches may be set for operator convenience or communication
+# requirements.
+# Character insertion is kludged in order to get around the "beep" misfeature.
+# (This cap is commented out because <smir>/<rmir> is more efficient -- esr)
+# Supposedly "4*" delays should be used for <il1>, <ed>, <clear>, <dch1>,
+# and <dl1> strings, but we seem to get along fine without them.
+vi200|Visual 200,
+	OTbs, OTpt, am, mir, msgr,
+	OTkn#10, cols#80, it#8, lines#24,
+	acsc=+h.kffggjmkllsmenbq`tnuovcwdxa}r, bel=^G, cbt=\Ez,
+	clear=\Ev, cnorm=\Ec, cr=\r, cub1=^H, cud1=\n, cuf1=\EC,
+	cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, cvvis=\Ed,
+	dch1=\EO, dim=\E4, dl1=\EM, ed=\Ey, el=\Ex, home=\EH, ht=^I,
+	hts=\E1, il1=\EL, ind=\n, invis=\Ea, kbs=^H, kclr=\Ev,
+	kctab=\E2, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA,
+	kdch1=\EO, kdl1=\EM, ked=\EJ, kel=\Et, kf0=\E?p, kf1=\E?q,
+	kf2=\E?r, kf3=\E?s, kf4=\E?t, kf5=\E?u, kf6=\E?v, kf7=\E?w,
+	kf8=\E?x, kf9=\E?y, khome=\EH, khts=\E1, kich1=\Ei, kil1=\EL,
+	krmir=\Ej, mc0=\EH\E], mc4=\EX, mc5=\EW, ri=\EI, rmacs=\EG,
+	rmkx=\E>, rmso=\E3, rs1=\E3\Eb\Ej\E\El\EG\Ec\Ek\EX,
+	sgr0=\E3\Eb, smacs=\EF, smkx=\E=, smso=\E4, tbc=\Eg,
+# The older Visuals didn't come with function keys. This entry uses
+# <smkx> and <rmkx> so that the keypad keys can be used as function keys.
+# If your version of vi doesn't support function keys you may want
+# to use vi200-f.
+vi200-f|Visual 200 no function keys,
+	is2=\E3\Eb\Ej\E\\\El\EG\Ed\Ek, kf0=\E?p, kf1=\E?q,
+	kf2=\E?r, kf3=\E?s, kf4=\E?t, kf5=\E?u, kf6=\E?v, kf7=\E?w,
+	kf8=\E?x, kf9=\E?y, rmkx=\E>, rmso@, smkx=\E=, smso@,
+	use=vi200,
+vi200-rv|Visual 200 reverse video,
+	cnorm@, cvvis@, ri@, rmso=\E3, smso=\E4, use=vi200,
+
+# the function keys are programmable but we don't reprogram them to their
+# default values with <is2> because programming them is very verbose. maybe
+# an initialization file should be made for the 300 and they could be stuck
+# in it.
+# (vi300: added <rmam>/<smam> based on init string -- esr)
+vi300|Visual 300 ANSI x3.64,
+	am, bw, mir, xenl,
+	cols#80, lines#24,
+	bel=^G, cbt=\E[Z, clear=\E[H\E[2J, cr=\r, cub1=^H, cud1=\E[B,
+	cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A,
+	dch1=\E[P$<40>, dl1=\E[M, ed=\E[J, el=\E[K, home=\E[H, ht=^I,
+	il1=\E[L, ind=\n,
+	is2=\E[7s\E[2;3;4;20;?5;?6l\E[12;?7h\E[1Q\E[0;1(D\E[8s,
+	kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A,
+	kf1=\E_A\E\\, kf2=\E_B\E\\, kf3=\E_C\E\\, kf4=\E_D\E\\,
+	kf5=\E_E\E\\, kf6=\E_F\E\\, kf7=\E_G\E\\, kf8=\E_H\E\\,
+	kf9=\E_I\E\\, khome=\E[H, ri=\EM, rmam=\E[?7l, rmir=\E[4l,
+	rmso=\E[m, rmul=\E[m, sgr0=\E[m, smam=\E[?7h, smir=\E[4h,
+	smso=\E[1m, smul=\E[4m,
+# some of the vi300s have older firmware that has the command
+# sequence for setting editing extent reversed.
+vi300-old|Visual 300 with old firmware (set edit extent reversed),
+	is2=\E[7s\E[2;3;4;20;?5;?6l\E[12;?7h\E[2Q\E[0;1(D\E[8s, use=vi300,
+
+# Visual 500 prototype entry from University of Wisconsin.
+# The best place to look for the escape sequences is page A1-1 of the
+# Visual 500 manual.  The initialization sequence given here may be
+# overkill, but it does leave out some of the initializations which can
+# be done with the menus in set-up mode.
+# The :xp: line below is so that emacs can understand the padding requirements
+# of this slow terminal.  :xp: is 10 time the padding factor.
+# (vi500: removed unknown :xp#4: termcap;
+# also added empty <acsc> to suppress tic warning -- esr)
+vi500|Visual 500,
+	am, mir, msgr,
+	cols#80, it#8, lines#33,
+	acsc=, cbt=\Ez$<4/>, clear=\Ev$<6*/>, cr=\r,
+	csr=\E(%p1%{32}%+%c%p2%{32}%+%c, cub1=^H, cud1=\EB,
+	cuf1=\EC, cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA,
+	dch1=\EO$<3*/>, dl1=\EM$<3*/>, ed=\Ey$<3*/>,
+	el=\Ex$<16/>, home=\EH, ht=\011$<8/>, il1=\EL\Ex$<3*/>,
+	ind=\n,
+	is2=\E3\E\001\E\007\E\003\Ek\EG\Ed\EX\El\E>\Eb\E\\,
+	kbs=^H, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA,
+	khome=\EH, nel=\r\n, rmacs=^O, rmir=\Ej, rmso=\E^G,
+	rmul=\E^C, smacs=^N, smir=\Ei, smso=\E^H, smul=\E^D,
+
+# The visual 550 is a visual 300 with Tektronix graphics,
+# and with 33 lines. clear screen is modified here to
+# also clear the graphics.
+vi550|Visual 550 ANSI x3.64,
+	lines#33,
+	clear=\030\E[H\E[2J, use=vi300,
+
+vi603|visual603|Visual 603,
+	hs, mir,
+	bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[J,
+	csr=\E[%i%p1%d;%p2%dr, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, dch1=\E[P, dl1=\E[M,
+	dsl=\EP2;1~\E\\, ed=\E[J, el=\E[K, fsl=\E\\, il1=\E[L,
+	ind=\ED, is1=\E>\E[?3l\E[?4l\E[?7h\E[?8h\E[1;24r,
+	rev=\E[7m, ri=\EM, rmir=\E[4l, rmso=\E[27m, rmul=\E[24m,
+	sgr0=\E[m\017$<2>, smir=\E[4h, smso=\E[7m, smul=\E[4m,
+	tsl=\EP2~, use=decid+cpr, use=vt100+4bsd,
+
+#### Wyse (wy)
+#
+#	Wyse Technology
+#	3471 North First Street
+#	San Jose, CA 95134
+#	Vox: (408)-473-1200
+#	Fax: (408) 473-1222
+#	Web: http://www.wyse.com
+#
+# Wyse sales can be reached by phone at 1-800-GET-WYSE.  Tech support is at
+# (800)-800-WYSE (option 5 gets you a human).  There's a Web page at the
+# obvious address, <http://www.wyse.com>.  They keep terminfo entries at
+# https://web.archive.org/web/19970712022641/http://www.wyse.co.uk/support/appnotes/idxappnt.htm
+#
+#
+# Wyse bought out Link Technology, Inc. in 1990 and closed it down in 1995.
+# They now own the Qume and Amdek brands, too.  So these are the people to
+# talk with about all Link, Qume, and Amdek terminals.
+#
+# These entries include a few small fixes.
+# I canceled the bel capacities in the vb entries.
+# I made two trivial syntax fixes in the wyse30 entry.
+# I made some entries relative to adm+sgr.
+#
+#
+# Note: The wyse75, wyse85, and wyse99 have been discontinued.
+
+#	   Although the Wyse 30 can support more than one attribute
+#	it requires magic cookies to do so.  Many applications do not
+#	function well with magic cookies.  The following terminfo uses
+#	the protect mode to support one attribute (dim) without cookies.
+#	If more than one attribute is needed then the wy30-mc terminfo
+#	should be used.
+#
+wy30|wyse30|Wyse 30,
+	am, bw, mc5i, mir, msgr, xon,
+	cols#80, lh#1, lines#24, lw#8, ma#1, nlab#8,
+	acsc=0wa_h[jukslrmqnxqzttuyv]wpxv, bel=^G, cbt=\EI,
+	civis=\E`0, clear=\E+$<80>, cnorm=\E`1, cr=\r, cub1=^H,
+	cud1=\n, cuf1=^L, cup=\E=%p1%{32}%+%c%p2%{32}%+%c,
+	cuu1=^K, dch1=\EW$<10>, dim=\E`7\E), dl1=\ER$<1>,
+	ed=\EY$<80>, el=\ET, flash=\E`8$<100/>\E`9, home=^^,
+	ht=\011$<1>, hts=\E1, il1=\EE$<2>, ind=\n$<2>, ip=$<2>,
+	is2=\E'\E(\E\^3\E`9\016\024, kHOM=\E{, kbs=^H, kcbt=\EI,
+	kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K, kdch1=\EW, kdl1=\ER,
+	ked=\EY, kel=\ET, kent=\E7, kf1=^A@\r, kf2=^AA\r, kf3=^AB\r,
+	kf4=^AC\r, kf5=^AD\r, kf6=^AE\r, kf7=^AF\r, kf8=^AG\r,
+	khome=^^, kich1=\EQ, kil1=\EE, knp=\EK, kpp=\EJ, krpl=\Er,
+	ll=^^^K, mc0=\EP, mc4=^T, mc5=^X, nel=\r\n,
+	pfx=\Ez%p1%{63}%+%c%p2%s\177,
+	pln=\Ez%p1%{47}%+%c%p2%s\r, prot=\E`7\E), ri=\Ej$<3>,
+	rmacs=\EH^C, rmir=\Er, rmln=\EA11, rmso=\E(,
+	sgr=%?%p1%p5%p8%|%|%t\E`7\E)%e\E(%;%?%p9%t\EH\002%e\EH\003%;,
+	sgr0=\E(\EH\003, smacs=\EH^B, smir=\Eq, smln=\EA10,
+	smso=\E`7\E), tbc=\E0, use=wyse+sl,
+#
+#	This terminal description uses the non-hidden attribute mode
+#	(with magic cookie).
+#
+# (wy30-mc: added <smcup> to suppress tic warning --esr)
+wy30-mc|wyse30-mc|Wyse 30 with magic cookies,
+	msgr@,
+	ma@, xmc#1,
+	blink=\EG2, dim=\EGp, prot=\EG0\E), rmacs=\EG0\EH\003,
+	rmcup=\EG0, rmso=\EG0,
+	sgr=\EG%{48}%?%p2%p6%|%t%{8}%|%;%?%p1%p3%|%p6%|%t%{4}%|%;%?
+	    %p4%t%{2}%|%;%?%p1%p5%|%t%{64}%|%;%?%p7%t%{1}%|%;%c%?%p8
+	    %t\E)%e\E(%;%?%p9%t\EH\002%e\EH\003%;,
+	sgr0=\EG0\E(\EH\003, smacs=\EG0\EH\002, smcup=,
+	smso=\EG4, use=wy30, use=adm+sgr,
+#	The mandatory pause used by <flash> does not work with
+#	older versions of terminfo.  If you see this effect then
+#	unset xon and delete the / from the delay.
+#	i.e. change $<100/> to $<100>
+wy30-vb|wyse30-vb|Wyse 30 visible bell,
+	bel@, use=wy30,
+#
+#	   The Wyse 50 can support one attribute (e.g. Dim, Inverse,
+#	Normal) without magic cookies by using the protect mode.
+#	The following description uses this feature, but when more
+#	than one attribute is put on the screen at once, all attributes
+#	will be changed to be the same as the last attribute given.
+#	   The Wyse 50 can support more attributes when used with magic
+#	cookies.  The wy50-mc terminal description uses magic cookies
+#	to correctly handle multiple attributes on a screen.
+#
+wy50|wyse50|Wyse 50,
+	am, bw, mc5i, mir, msgr, xon,
+	cols#80, lh#1, lines#24, lw#8, ma#1, nlab#8,
+	acsc=a;j5k3l2m1n8q:t4u9v=w0x6, bel=^G, cbt=\EI,
+	civis=\E`0, clear=\E+$<20>, cnorm=\E`1, cr=\r, cub1=^H,
+	cud1=\n, cuf1=^L, cup=\E=%p1%{32}%+%c%p2%{32}%+%c,
+	cuu1=^K, dch1=\EW$<1>, dim=\E`7\E), dl1=\ER, ed=\EY$<20>,
+	el=\ET, flash=\E`8$<100/>\E`9, home=^^, ht=^I, hts=\E1,
+	il1=\EE, ind=\n$<2>, ip=$<1>, is1=\E`:\E`9$<30>,
+	is2=\016\024\E'\E(, kHOM=\E{, kbs=^H, kcbt=\EI, kcub1=^H,
+	kcud1=\n, kcuf1=^L, kcuu1=^K, kdch1=\EW, kdl1=\ER, ked=\EY,
+	kel=\ET, kent=\E7, kf1=^A@\r, kf10=^AI\r, kf11=^AJ\r,
+	kf12=^AK\r, kf13=^AL\r, kf14=^AM\r, kf15=^AN\r, kf16=^AO\r,
+	kf2=^AA\r, kf3=^AB\r, kf4=^AC\r, kf5=^AD\r, kf6=^AE\r,
+	kf7=^AF\r, kf8=^AG\r, kf9=^AH\r, khome=^^, kich1=\EQ,
+	kil1=\EE, knp=\EK, kpp=\EJ, kprt=\EP, krpl=\Er, ll=^^^K,
+	mc0=\EP, mc4=^T, mc5=^X, nel=\r\n,
+	pfx=\Ez%p1%{63}%+%c%p2%s\177,
+	pln=\Ez%p1%{47}%+%c%p2%s\r, prot=\E`7\E), rev=\E`6\E),
+	ri=\Ej, rmacs=\EH^C, rmir=\Er, rmln=\EA11, rmso=\E(,
+	sgr=%?%p1%p3%|%t\E`6\E)%e%p5%p8%|%t\E`7\E)%e\E(%;%?%p9%t\EH
+	    \002%e\EH\003%;,
+	sgr0=\E(\EH\003, smacs=\EH^B, smir=\Eq, smln=\EA10,
+	smso=\E`6\E), tbc=\E0, kF1=^A`\r, kF10=^Ai\r, kF11=^Aj\r,
+	kF12=^Ak\r, kF13=^Al\r, kF14=^Am\r, kF15=^An\r, kF16=^Ao\r,
+	kF2=^Aa\r, kF3=^Ab\r, kF4=^Ac\r, kF5=^Ad\r, kF6=^Ae\r,
+	kF7=^Af\r, kF8=^Ag\r, kF9=^Ah\r, use=wyse+sl,
+wyse+sl|status line for Wyse terminals,
+	hs,
+	wsl#45,
+	dsl=\EF\r, fsl=\r, tsl=\EF,
+#
+#	This terminal description uses the non-hidden attribute mode
+#	(with magic cookie).
+#
+#	The mandatory pause used by flash does not work with some
+#	older versions of terminfo.  If you see this effect then
+#	unset <xon> and delete the / from the delay.
+#	i.e. change $<100/> to $<100>
+# (wy50-mc: added <smcup> to suppress tic warning --esr)
+wy50-mc|wyse50-mc|Wyse 50 with magic cookies,
+	msgr@,
+	ma@, xmc#1,
+	blink=\EG2, dim=\EGp, prot=\EG0\E), rev=\EG4,
+	rmacs=\EG0\EH\003, rmcup=\EG0, rmso=\EG0,
+	sgr=\EG%{48}%?%p2%p6%|%t%{8}%|%;%?%p1%p3%|%p6%|%t%{4}%|%;%?
+	    %p4%t%{2}%|%;%?%p1%p5%|%t%{64}%|%;%?%p7%t%{1}%|%;%c%?%p8
+	    %t\E)%e\E(%;%?%p9%t\EH\002%e\EH\003%;,
+	sgr0=\EG0\E(\EH\003, smacs=\EG0\EH\002, smcup=,
+	smso=\EGt, use=wy50, use=adm+sgr,
+wy50-vb|wyse50-vb|Wyse 50 visible bell,
+	bel@, use=wy50,
+wy50-w|wyse50-w|Wyse 50 132-column,
+	cols#132, lw#7, nlab#16, wsl#97,
+	cup=\Ea%i%p1%dR%p2%dC, dch1=\EW$<2>, is1=\E`;\E`9$<30>,
+	use=wy50,
+wy50-wvb|wyse50-wvb|Wyse 50 132-column visible bell,
+	bel@, use=wy50-w,
+
+#
+#	The Wyse 350 is a Wyse 50 with color.
+#	Unfortunately this means that it has magic cookies.
+#	The color attributes are designed to overlap the reverse, dim and
+#	underline attributes.  This is nice for monochrome applications
+#	because you can make underline stuff green (or any other color)
+#	but for true color applications it's not so hot because you cannot
+#	mix color with reverse, dim or underline.
+#	    To further complicate things one of the attributes must be
+#	black (either the foreground or the background).  In reverse video
+#	the background changes color with black letters.  In normal video
+#	the foreground changes colors on a black background.
+#	    This terminfo uses some of the more advanced features of curses
+#	to display both color and blink.  In the final analysis I am not
+#	sure that the wy350 runs better with this terminfo than it does
+#	with the wy50 terminfo (with user adjusted colors).
+#
+#	The mandatory pause used by flash does not work with
+#	older versions of terminfo.  If you see this effect then
+#	unset xon and delete the / from the delay.
+#	i.e. change $<100/> to $<100>
+#
+# Bug: The <op> capability resets attributes.
+wy350|wyse350|Wyse 350,
+	am, bw, mc5i, mir, xon,
+	colors#8, cols#80, lh#1, lines#24, lw#8, ncv#55, nlab#8, pairs#8,
+	xmc#1,
+	acsc=0wa_h[jukslrmqnxqzttuyv]wpxv, bel=^G, blink=\EG2,
+	cbt=\EI, civis=\E`0, clear=\E+$<20>, cnorm=\E`1, cr=\r,
+	cub1=^H, cud1=\n, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW$<1>,
+	dim=\EGp, dl1=\ER, ed=\EY$<20>, el=\ET,
+	flash=\E`8$<100/>\E`9, home=^^, ht=^I, hts=\E1, il1=\EE,
+	ind=\n$<2>, ip=$<1>, is1=\E`:\E`9$<30>,
+	is2=\016\024\E'\E(, is3=\E%?, kHOM=\E{, kbs=^H, kcbt=\EI,
+	kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K, kdch1=\EW, kdl1=\ER,
+	ked=\EY, kel=\ET, kent=\E7, kf1=^A@\r, kf10=^AI\r,
+	kf11=^AJ\r, kf12=^AK\r, kf13=^AL\r, kf14=^AM\r, kf15=^AN\r,
+	kf16=^AO\r, kf2=^AA\r, kf3=^AB\r, kf4=^AC\r, kf5=^AD\r,
+	kf6=^AE\r, kf7=^AF\r, kf8=^AG\r, kf9=^AH\r, khome=^^,
+	kich1=\EQ, kil1=\EE, knp=\EK, kpp=\EJ, kprt=\EP, krpl=\Er,
+	ll=^^^K, mc0=\EP, mc4=^T, mc5=^X, nel=\r\n, oc=\E%?, op=\EG0,
+	pfx=\Ez%p1%{63}%+%c%p2%s\177,
+	pln=\Ez%p1%{47}%+%c%p2%s\r, prot=\EG0\E), ri=\Ej,
+	rmacs=\EG0\EH\003, rmir=\Er, rmln=\EA11, setb=,
+	setf=%?%p1%{0}%=%t%{76}%e%p1%{1}%=%t%{64}%e%p1%{2}%=%t%{8}%e
+	     %p1%{3}%=%t%{72}%e%p1%{4}%=%t%{4}%e%p1%{5}%=%t%{68}%e
+	     %p1%{6}%=%t%{12}%e%p1%{7}%=%t%{0}%;%PC\EG%gC%gA%+%{48}
+	     %+%c,
+	sgr=%{0}%?%p4%t%{2}%|%;%?%p7%t%{1}%|%;%PA\EG%?%gC%t%gC%e%{0}
+	    %?%p1%t%{4}%|%;%?%p2%t%{8}%|%;%?%p3%t%{4}%|%;%?%p5%t
+	    %{64}%|%;%;%gA%+%{48}%+%c%?%p8%t\E)%e\E(%;%?%p9%t\EH
+	    \002%e\EH\003%;,
+	sgr0=\EG0\E(\EH\003%{0}%PA%{0}%PC, smacs=\EG0\EH\002,
+	smir=\Eq, smln=\EA10, tbc=\E0, use=adm+sgr, use=wyse+sl,
+wy350-vb|wyse350-vb|Wyse 350 visible bell,
+	bel@, use=wy350,
+wy350-w|wyse350-w|Wyse 350 132-column,
+	cols#132, lw#7, nlab#16, wsl#97,
+	cup=\Ea%i%p1%dR%p2%dC, dch1=\EW$<2>, is1=\E`;\E`9$<30>,
+	use=wy350,
+wy350-wvb|wyse350-wvb|Wyse 350 132-column visible bell,
+	bel@, use=wy350-w,
+#
+#	This terminfo description is untested.
+#	The wyse100 emulates an adm31, so the adm31 entry should work.
+#
+wy100|Wyse 100,
+	hs, mir,
+	cols#80, lines#24, xmc#1,
+	bel=^G, clear=\E;, cr=\r, cub1=^H, cud1=\n, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW,
+	dl1=\ER, dsl=\EA31, ed=\EY, el=\ET, fsl=\r, il1=\EE, ind=\n,
+	invis@, is2=\Eu\E0, kbs=^H, kcub1=^H, kcud1=\n, kcuf1=^L,
+	kcuu1=^K, kf1=^A@\r, kf2=^AA\r, kf3=^AB\r, kf4=^AC\r,
+	kf5=^AD\r, kf6=^AE\r, kf7=^AF\r, kf8=^AG\r, khome=\E{,
+	rmir=\Er, smir=\Eq, tsl=\EF, use=adm+sgr,
+#
+#	The Wyse 120/150 has most of the features of the Wyse 60.
+#	This terminal does not need padding up to 9600 baud!
+#	<msgr> should be set but the clear screen fails when in
+#	alt-charset mode.  Try \EcE\s\s\E+\s if the screen is really clear
+#	then set <msgr>.
+#
+wy120|wyse120|wy150|wyse150|Wyse 120/150,
+	am, bw, km, mc5i, mir, msgr, xon,
+	cols#80, it#8, lh#1, lines#24, lw#8, nlab#8, pb#9601,
+	acsc=+/\,.0[a2fxgqh1ihjYk?lZm@nEqDtCu4vAwBx3yszr{c~~,
+	bel=^G, blink=\EG2, cbt=\EI, civis=\E`0, clear=\E+$<50>,
+	cnorm=\E`1, cr=\r, cub1=^H, cud1=\n, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW$<7>,
+	dim=\EGp, dl1=\ER$<3>, ed=\EY$<50>, el=\ET$<4>,
+	flash=\E`8$<100/>\E`9, home=^^, ht=\011$<1>, hts=\E1,
+	il1=\EE$<3>, ind=\n$<3>, ip=$<2>, is1=\EcB0\EcC1,
+	is2=\Ed$\EcD\E'\Er\EH\003\Ed/\EO\Ee1\Ed*\E`@\E`9\E`1\016
+	    \024\El,
+	is3=\EwJ\Ew1$<150>, kHOM=\E{, kbs=^H, kcbt=\EI, kcub1=^H,
+	kcud1=\n, kcuf1=^L, kcuu1=^K, kdch1=\EW, kdl1=\ER, ked=\EY,
+	kel=\ET, kent=\E7, kf1=^A@\r, kf10=^AI\r, kf11=^AJ\r,
+	kf12=^AK\r, kf13=^AL\r, kf14=^AM\r, kf15=^AN\r, kf16=^AO\r,
+	kf2=^AA\r, kf3=^AB\r, kf4=^AC\r, kf5=^AD\r, kf6=^AE\r,
+	kf7=^AF\r, kf8=^AG\r, kf9=^AH\r, khome=^^, kich1=\EQ,
+	kil1=\EE, knp=\EK, kpp=\EJ, kprt=\EP, krpl=\Er, ll=^^^K,
+	mc0=\EP, mc4=^T, mc5=\Ed#, nel=\r\n$<3>,
+	pfloc=\EZ2%p1%{63}%+%c%p2%s\177,
+	pfx=\EZ1%p1%{63}%+%c%p2%s\177,
+	pln=\Ez%p1%{47}%+%c%p2%s\r, prot=\E), ri=\Ej$<2>,
+	rmacs=\EcD, rmam=\Ed., rmcup=\Ew1, rmir=\Er, rmln=\EA11,
+	rmxon=\Ec20, rs1=\E~!\E~4$<30>, rs2=\EeF\E`:$<70>,
+	rs3=\EwG\Ee($<100>,
+	sgr=%?%p8%t\E)%e\E(%;%?%p9%t\EcE%e\EcD%;\EG%{48}%?%p2%t%{8}
+	    %|%;%?%p1%p3%|%p6%|%t%{4}%|%;%?%p4%t%{2}%|%;%?%p1%p5%|%t
+	    %{64}%|%;%?%p7%t%{1}%|%;%c,
+	sgr0=\E(\EH\003\EG0\EcD, smacs=\EcE, smam=\Ed/,
+	smcup=\Ew0, smir=\Eq, smln=\EA10, smso=\EGt, smxon=\Ec21,
+	tbc=\E0, use=adm+sgr, use=wyse+sl,
+#
+wy120-w|wyse120-w|wy150-w|wyse150-w|Wyse 120/150 132-column,
+	cols#132, lw#7, nlab#16, wsl#97,
+	cup=\Ea%i%p1%dR%p2%dC, dch1=\EW$<12>, ip=$<4>,
+	rs2=\E`;$<70>, use=wy120,
+#
+wy120-25|wyse120-25|wy150-25|wyse150-25|Wyse 120/150 80-column 25-lines,
+	lh@, lines#25, lw@, nlab@,
+	pln@, rs3=\EwG\Ee)$<100>, use=wy120,
+#
+wy120-25-w|wyse120-25-w|wy150-25-w|wyse150-25-w|Wyse 120/150 132-column 25-lines,
+	lh@, lines#25, lw@, nlab@,
+	pln@, rs3=\EwG\Ee)$<100>, use=wy120-w,
+#
+wy120-vb|wyse120-vb|wy150-vb|wyse150-vb|Wyse 120/150 visible bell,
+	bel@, use=wy120,
+#
+wy120-w-vb|wy120-wvb|wyse120-wvb|wy150-w-vb|wyse150-w-vb|Wyse 120/150 132-column visible bell,
+	bel@, use=wy120-w,
+#
+#	The Wyse 60 is like the Wyse 50 but with more padding.
+#	The reset strings are slow and the pad times very depending
+#	on other parameters such as font loading.  I have tried
+#	to follow the following outline:
+#
+#		<rs1> -> set personality
+#		<rs2> -> set number of columns
+#		<rs3> -> set number of lines
+#		<is1> -> select the proper font
+#		<is2> -> do the initialization
+#		<is3> -> set up display memory (2 pages)
+#
+#	The Wyse 60's that have VT100 emulation are slower than the
+#	older Wyse 60's.  This change happened mid-1987.
+#	The capabilities effected are <dch1> <dl1> <il1> <ind> <ri>
+#
+#	The meta key is only half right.  This terminal will return the
+#	high order bit set when you hit CTRL-function_key
+#
+#	It may be useful to assign two function keys with the
+#	values  \E=(\s  look at old data in page 1
+#	        \E=W,   look at bottom of page 1
+#	where \s is a space ( ).
+#
+#	Note:
+#	   The Wyse 60 runs faster when the XON/XOFF
+#	   handshake is turned off.
+#
+# (wy60: we use \E{ rather than ^^ for home (both are documented) to avoid
+# a bug reported by Robert Dunn, <rcdii@inlink.com> -- esr)
+wy60|wyse60|Wyse 60,
+	am, bw, km, mc5i, mir, msgr,
+	cols#80, lh#1, lines#24, lw#8, nlab#8,
+	acsc=+/\,.0[a2fxgqh1ihjYk?lZm@nEqDtCu4vAwBx3yszr{c~~,
+	bel=^G, blink=\EG2, cbt=\EI, civis=\E`0, clear=\E+$<100>,
+	cnorm=\E`1, cr=\r, cub1=^H, cud1=\n, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K,
+	dch1=\EW$<11>, dclk=\E`b, dim=\EGp, dl1=\ER$<5>,
+	ed=\EY$<100>, el=\ET, flash=\E`8$<100/>\E`9, home=\E{,
+	ht=\011$<1>, hts=\E1, il1=\EE$<4>, ind=\n$<5>, ip=$<3>,
+	is1=\EcB0\EcC1,
+	is2=\Ed$\EcD\E'\Er\EH\003\Ed/\EO\Ee1\Ed*\E`@\E`9\E`1\016
+	    \024\El,
+	is3=\EwJ\Ew1$<150>, kHOM=\E{, kbs=^H, kcbt=\EI, kcub1=^H,
+	kcud1=\n, kcuf1=^L, kcuu1=^K, kdch1=\EW, kdl1=\ER, ked=\EY,
+	kel=\ET, kent=\E7, kf1=^A@\r, kf10=^AI\r, kf11=^AJ\r,
+	kf12=^AK\r, kf13=^AL\r, kf14=^AM\r, kf15=^AN\r, kf16=^AO\r,
+	kf2=^AA\r, kf3=^AB\r, kf4=^AC\r, kf5=^AD\r, kf6=^AE\r,
+	kf7=^AF\r, kf8=^AG\r, kf9=^AH\r, khome=^^, kich1=\EQ,
+	kil1=\EE, knp=\EK, kpp=\EJ, kprt=\EP, krpl=\Er, ll=\E{^K,
+	mc0=\EP, mc4=^T, mc5=\Ed#, nel=\r\n$<3>,
+	pfloc=\EZ2%p1%{63}%+%c%p2%s\177,
+	pfx=\EZ1%p1%{63}%+%c%p2%s\177,
+	pln=\Ez%p1%{47}%+%c%p2%s\r, prot=\E), ri=\Ej$<7>,
+	rmacs=\EcD, rmam=\Ed., rmclk=\E`c, rmcup=\Ew1, rmir=\Er,
+	rmln=\EA11, rmxon=\Ec20, rs1=\E~!\E~4$<150>,
+	rs2=\EeG$<150>, rs3=\EwG\Ee($<200>,
+	sgr=%?%p8%t\E)%e\E(%;%?%p9%t\EcE%e\EcD%;\EG%{48}%?%p2%t%{8}
+	    %|%;%?%p1%p3%|%p6%|%t%{4}%|%;%?%p4%t%{2}%|%;%?%p1%p5%|%t
+	    %{64}%|%;%?%p7%t%{1}%|%;%c,
+	sgr0=\E(\EH\003\EG0\EcD, smacs=\EcE, smam=\Ed/,
+	smcup=\Ew0, smir=\Eq, smln=\EA10, smso=\EGt, smxon=\Ec21,
+	tbc=\E0, kF1=^A`\r, kF10=^Ai\r, kF11=^Aj\r, kF12=^Ak\r,
+	kF13=^Al\r, kF14=^Am\r, kF15=^An\r, kF16=^Ao\r, kF2=^Aa\r,
+	kF3=^Ab\r, kF4=^Ac\r, kF5=^Ad\r, kF6=^Ae\r, kF7=^Af\r,
+	kF8=^Ag\r, kF9=^Ah\r, use=adm+sgr, use=wyse+sl,
+#
+wy60-w|wyse60-w|Wyse 60 132-column,
+	cols#132, lw#7, nlab#16, wsl#97,
+	cup=\Ea%i%p1%dR%p2%dC, dch1=\EW$<16>, ip=$<5>,
+	rs2=\EeF$<150>\E`;$<150>, use=wy60,
+#
+wy60-25|wyse60-25|Wyse 60 80-column 25-lines,
+	lh@, lines#25, lw@, nlab@,
+	pln@, rs3=\EwG\Ee)$<200>, use=wy60,
+wy60-25-w|wyse60-25-w|Wyse 60 132-column 25-lines,
+	lh@, lines#25, lw@, nlab@,
+	pln@, rs3=\EwG\Ee)$<200>, use=wy60-w,
+#
+wy60-42|wyse60-42|Wyse 60 80-column 42-lines,
+	lines#42,
+	clear=\E+$<260>, cup=\E=%p1%{32}%+%c%p2%{32}%+%c$<2>,
+	dch1=\EW$<16>, dl1=\ER$<11>, ed=\Ey$<260>, il1=\EE$<11>,
+	ind=\n$<9>, ip=$<5>, is1=\EcB2\EcC3, nel=\r\n$<6>,
+	ri=\Ej$<10>, rs3=\Ee*$<150>, use=wy60,
+wy60-42-w|wyse60-42-w|Wyse 60 132-column 42-lines,
+	cols#132, lw#7, nlab#16, wsl#97,
+	clear=\E+$<260>, cup=\Ea%i%p1%dR%p2%dC$<2>,
+	dch1=\EW$<19>, ed=\Ey$<260>, home=\036$<2>, ip=$<6>,
+	nel=\r\n$<11>, rs2=\EeF$<150>\E`;$<150>, use=wy60-42,
+#
+wy60-43|wyse60-43|Wyse 60 80-column 43-lines,
+	lh@, lines#43, lw@, nlab@,
+	pln@, rs3=\Ee+$<150>, use=wy60-42,
+wy60-43-w|wyse60-43-w|Wyse 60 132-column 43-lines,
+	lh@, lines#43, lw@, nlab@,
+	pln@, rs3=\Ee+$<150>, use=wy60-42-w,
+#
+wy60-vb|wyse60-vb|Wyse 60 visible bell,
+	bel@, use=wy60,
+wy60-w-vb|wy60-wvb|wyse60-wvb|Wyse 60 132-column visible bell,
+	bel@, use=wy60-w,
+
+#	The Wyse-99GT looks at lot like the Wyse 60 except that it
+#	does not have the 42/43 line mode.  In the Wyse-60 the "lines"
+#	setup parameter controls the number of lines on the screen.
+#	For the Wyse 99GT the "lines" setup parameter controls the
+#	number of lines in a page.  The screen can display 25 lines max.
+#	    The Wyse-99GT also has personalities for the VT220 and
+#	Tektronix 4014.  But this has no bearing on the native mode.
+#
+#	(msgr) should be set but the clear screen fails when in
+#	alt-charset mode.  Try \EcE\s\s\E+\s if the screen is really clear
+#	then set msgr, else use msgr@.
+#
+#	u0 -> enter Tektronix mode
+#	u1 -> exit Tektronix mode
+#
+wy99gt|wyse99gt|Wyse 99gt,
+	msgr@,
+	clear=\E+$<130>, dch1=\EW$<7>, dl1=\ER$<4>, ed=\Ey$<130>,
+	el=\Et$<5>, flash=\E`8$<100/>\E`9, ht=\011$<1>,
+	il1=\EE$<4>, ind=\n$<4>, ip=$<2>, is3=\Ew0$<20>, nel@,
+	ri=\Ej$<3>, rmcup=\Ew0, rs2=\E`:$<150>, smcup=\Ew1,
+	u0=\E~>\E8, u1=\E[42h, use=wy60,
+#
+wy99gt-w|wyse99gt-w|Wyse 99gt 132-column,
+	cols#132, lw#7, nlab#16, wsl#97,
+	clear=\E+$<160>, cup=\Ea%i%p1%dR%p2%dC$<2>,
+	dch1=\EW$<9>, ed=\Ey$<160>, ip=$<4>, rs2=\E`;$<150>,
+	use=wy99gt,
+#
+wy99gt-25|wyse99gt-25|Wyse 99gt 80-column 25-lines,
+	lh@, lines#25, lw@, nlab@,
+	pln@, rs2=\E`:$<150>, rs3=\EwG\Ee)$<200>, use=wy99gt,
+#
+wy99gt-25-w|wyse99gt-25-w|Wyse 99gt 132-column 25-lines,
+	lh@, lines#25, lw@, nlab@,
+	pln@, rs2=\E`;$<150>, use=wy99gt-w,
+#
+wy99gt-vb|wyse99gt-vb|Wyse 99gt visible bell,
+	bel@, use=wy99gt,
+#
+wy99gt-w-vb|wy99gt-wvb|wyse99gt-wvb|Wyse 99gt 132-column visible bell,
+	bel@, use=wy99gt-w,
+
+# Can't set tabs! Other bugs (ANSI mode only):
+# - can't redefine function keys (anyway, key redefinition in ANSI mode
+#   is too much complex to be described);
+# - meta key can't be described (the terminal forgets it when reset);
+# The xon-xoff handshaking can't be disabled while in ANSI personality, so
+# emacs can't work at speed greater than 9600 baud.  No padding is needed at
+# this speed.
+#   dch1 has been commented out because it causes annoying glittering when
+# vi deletes one character at the beginning of a line with tabs in it.
+#   dch makes sysgen(1M) have a horrible behaviour when deleting
+# a screen and makes screen(1) behave badly, so it is disabled too. The nice
+# thing is that vi goes crazy if smir-rmir are present and both dch-dch1 are
+# not, so smir and rmir are commented out as well.
+# From: Francesco Potorti` <F.Potorti@cnuce.cnr.it>, 24 Aug 1998
+wy99-ansi|Wyse WY-99GT in ANSI mode (int'l PC keyboard),
+	am, km, mc5i, mir, msgr, xenl,
+	cols#80, it#8, lines#25, vt#3,
+	acsc=``aaffggjjkkllmmnnooqqssttuuvvwwxx{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, civis=\E[?25l,
+	clear=\E[H\E[J$<200>, cnorm=\E[34h\E[?25h, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD$<1>,
+	cub1=\010$<1>, cud=\E[%p1%dB, cud1=\ED,
+	cuf=\E[%p1%dC$<1>, cuf1=\E[C$<1>,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\EM,
+	cvvis=\E[34l\E[?25h, dim=\E[2m, dl=\E[%p1%dM, dl1=\E[M,
+	ech=\E[%p1%dX, ed=\E[J$<8*>, el=\E[K$<1>, el1=\E[1K$<1>,
+	enacs=\E)0, flash=\E[?5h$<30/>\E[?5l, home=\E[H,
+	hpa=\E[%i%p1%dG, ht=^I, ich=\E[%p1%d@, il=\E[%p1%dL,
+	il1=\E[L, ind=\n$<1>, invis=\E[8m,
+	is2=\E7\E[1r\E8\E[2;3;4;13;20;34;39;36l\E[12;16;34h\E[?1;3;4
+	    ;5;10;18l\E[?7;8;25h\E>\E[?5W\E(B\017\E[4i,
+	kbs=^H, kcbt=\E[z, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC,
+	kcuu1=\EOA, kf1=\EOP, kf10=\E[21~, kf11=\E[23~,
+	kf12=\E[24~, kf17=\E[K, kf18=\E[31~, kf19=\E[32~, kf2=\EOQ,
+	kf20=\E[33~, kf21=\E[34~, kf22=\E[35~, kf23=\E[1~,
+	kf24=\E[2~, kf3=\EOR, kf4=\EOS, kf5=\E[M, kf6=\E[17~,
+	kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, ll=\E[24E, mc0=\E[?19h,
+	mc4=\E[4i, mc5=\E[5i, nel=\EE, prot=\E[1"q, rc=\E8,
+	rev=\E[7m, ri=\EM, rmacs=^O, rmam=\E[?7l, rmir=\E[4l,
+	rmkx=\E[?1l, rmso=\E[27m, rmul=\E[24m,
+	rs2=\E[61"p\E[40h\E[?6l\E[1r\E[2;3;4;13;20;34;39;36l\E[12;16
+	    ;34h\E[?1;3;4;5;10;18l\E[?7;8;25h\E>\E[?5W\E(B\017\E[24E
+	    \E[4i,
+	sc=\E7,
+	sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%O%t;7%;%?%p4%t;5%;%?
+	    %p5%t;2%;%?%p7%t;8%;m\E[%?%p8%t1%;"q%?%p9%t\016%e\017%;,
+	sgr0=\E[m\017\E["q, smacs=^N, smam=\E[?7h, smir=\E[4h,
+	smkx=\E[?1h, smso=\E[7m, smul=\E[4m, vpa=\E[%i%p1%dd,
+
+#   This is the american terminal. Here tabs work fine.
+# From: Francesco Potorti` <F.Potorti@cnuce.cnr.it>, 24 Aug 1998
+wy99a-ansi|Wyse WY-99GT in ANSI mode (US PC keyboard),
+	hts=\EH, is3=\E[?5l, rs3=\E[?5l, tbc=\E[3g, use=wy99-ansi,
+
+# This terminal (firmware version 02) has a lot of bugs:
+# - can't set tabs;
+# - other bugs in ANSI modes (see above).
+# This description disables handshaking when using cup. This is because
+# GNU emacs doesn't like Xon-Xoff handshaking. This means the terminal
+# cannot be used at speeds greater than 9600 baud, because at greater
+# speeds handshaking is needed even for character sending. If you use
+# DTR handshaking, you can use even greater speeds.
+# From: Francesco Potorti` <F.Potorti@cnuce.cnr.it>, 24 Aug 1998
+wy99f|wy99fgt|wy-99fgt|Wyse WY-99GT (int'l PC keyboard),
+	am, bw, km, mc5i, mir, msgr, xon,
+	cols#80, it#8, lines#25,
+	acsc='x+y.w_vi~j(k'l&m%n)o9q*s8t-u.v\,w+x=, bel=^G,
+	blink=\EG2, cbt=\EI, civis=\E`0, clear=\E'\E(\032,
+	cnorm=\E`4\E`1, cr=\r, cub1=^H, cud1=\Ej, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K,
+	cvvis=\E`2\E`1, dch1=\EW, dim=\EGp, dl1=\ER, ed=\EY$<8*>,
+	el=\ET$<8>, enacs=\Ec@1J$<2000>,
+	flash=\E\^1$<30/>\E\^0, home=^^, ht=^I, il1=\EE, ind=\n,
+	invis=\EG3,
+	is2=\Eu\Ee6\EC\EDF\Ec21\Ec31\Ec62\Ec72\Ee;\016\E'\EeL\E`9\E
+	    \^0\E`1\E`4\Ee.\E`:\Ee1\EG0\E(\Ed/\Ee4\Ed*\EO\E`I\Er\Ee"
+	    \EcD\024,
+	ka1=^^, ka3=\EJ, kbs=^H, kc1=\ET, kc3=\EK, kcbt=\EI, kcub1=^H,
+	kcud1=\n, kcuf1=^L, kcuu1=^K, kf1=^A@\r, kf10=^AI\r,
+	kf11=^AJ\r, kf12=^AK\r, kf13=^A`\r, kf14=^Aa\r, kf15=^Ab\r,
+	kf16=^Ac\r, kf17=^Ad\r, kf18=^Ae\r, kf19=^Af\r, kf2=^AA\r,
+	kf20=^Ag\r, kf21=^Ah\r, kf22=^Ai\r, kf23=^Aj\r, kf24=^Ak\r,
+	kf3=^AB\r, kf4=^AC\r, kf5=^AD\r, kf6=^AE\r, kf7=^AF\r,
+	kf8=^AG\r, kf9=^AH\r, kprt=\EP, mc0=\EP, mc4=^T, mc5=\Ed#,
+	nel=^_, prot=\E), rev=\EG4, ri=\Ej, rmacs=\EcD, rmam=\Ed.,
+	rmcup=\Ec21\Ec31, rmir=\Er, rmso=\EG0, rmxon=\Ec20\Ec30,
+	rs2=\Eu\E~4\Ee6\EC\EDF\Ec21\Ec31\Ec62\Ec72\Ee;\016\E'\EeL\E`
+	    9\E\^0\E`1\E`4\Ee.\E`:\Ee)\Ew\EwG\Ew0\Ee1\EG0\E(\Ed/
+	    \Ee4\Ed*\EO\E`I\Er\Ee"\Ec@0B\EcD\024,
+	sgr=\E(\EG%{48}%?%p1%p3%O%t%{4}%+%;%?%p2%t%{8}%+%;%?%p4%t
+	    %{2}%+%;%?%p5%t%{64}%+%;%?%p7%t%{1}%+%;%c%?%p8%t\E)%;%?
+	    %p9%t\EcE%e\EcD%;,
+	sgr0=\E(\EG0, smacs=\EcE, smam=\Ed/, smcup=\Ec20\Ec30,
+	smir=\Eq, smso=\EG4, smxon=\Ec21\Ec31, use=wyse+sl,
+
+# This is the american terminal. Here tabs work.
+# From: Francesco Potorti` <F.Potorti@cnuce.cnr.it>, 24 Aug 1998
+wy99fa|wy99fgta|wy-99fgta|Wyse WY-99GT (US PC keyboard),
+	hts=\E1, tbc=\E0, use=wy99f,
+
+#
+#	The Wyse 160 is combination of the WY-60 and the WY-99gt.
+#	The reset strings are slow and the pad times very depending
+#	on other parameters such as font loading.  I have tried
+#	to follow the following outline:
+#
+#		<rs1> -> set personality
+#		<rs2> -> set number of columns
+#		<rs3> -> set number of lines
+#		<is1> -> select the proper font
+#		<is2> -> do the initialization
+#		<is3> -> set up display memory (2 pages)
+#
+#	The display memory may be used for either text or graphics.
+#	When "Display Memory = Shared" the terminal will have more pages
+#	but garbage may be left on the screen when you switch from
+#	graphics to text.  If "Display Memory = Unshared" then the
+#	text area will be only one page long.
+#
+# (wy160: we use \E{ rather than ^^ for home (both are documented) to avoid
+# a bug reported by Robert Dunn, <rcdii@inlink.com> -- esr)
+wy160|wyse160|Wyse 160,
+	am, bw, km, mc5i, mir, msgr,
+	cols#80, lh#1, lines#24, lw#8, nlab#8, wsl#38,
+	acsc=+/\,.0[a2fxgqh1ihjYk?lZm@nEqDtCu4vAwBx3yszr{c~~,
+	bel=^G, blink=\EG2, cbt=\EI, civis=\E`0, clear=\E+$<30>,
+	cnorm=\E`1, cr=\r, cub1=^H, cud1=\n, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW$<5>,
+	dclk=\E`b, dim=\EGp, dl1=\ER$<1>, ed=\EY$<30>, el=\ET$<5>,
+	flash=\E`8$<100/>\E`9, home=\E{, ht=^I, hts=\E1,
+	il1=\EE$<1>, ind=\n$<1>, ip=$<2>, is1=\EcB0\EcC1,
+	is2=\Ed$\EcD\E'\Er\EH\003\Ed/\EO\Ee1\Ed*\E`@\E`9\E`1\016
+	    \024\El,
+	is3=\Ew0$<100>, kHOM=\E{, kbs=^H, kcbt=\EI, kcub1=^H,
+	kcud1=\n, kcuf1=^L, kcuu1=^K, kdch1=\EW, kdl1=\ER, ked=\EY,
+	kel=\ET, kent=\E7, kf1=^A@\r, kf10=^AI\r, kf11=^AJ\r,
+	kf12=^AK\r, kf13=^AL\r, kf14=^AM\r, kf15=^AN\r, kf16=^AO\r,
+	kf2=^AA\r, kf3=^AB\r, kf4=^AC\r, kf5=^AD\r, kf6=^AE\r,
+	kf7=^AF\r, kf8=^AG\r, kf9=^AH\r, khome=^^, kich1=\EQ,
+	kil1=\EE, knp=\EK, kpp=\EJ, kprt=\EP, krpl=\Er, ll=\E{^K,
+	mc0=\EP, mc4=^T, mc5=\Ed#, nel=\r\n$<1>,
+	pfloc=\EZ2%p1%{63}%+%c%p2%s\177,
+	pfx=\EZ1%p1%{63}%+%c%p2%s\177,
+	pln=\Ez%p1%{47}%+%c%p2%s\r, prot=\E), ri=\Ej$<1>,
+	rmacs=\EcD, rmam=\Ed., rmclk=\E`c, rmcup=\Ew0, rmir=\Er,
+	rmln=\EA11, rmxon=\Ec20, rs1=\E~!\E~4$<70>,
+	rs2=\E`:$<100>, rs3=\EwG\Ee($<140>,
+	sgr=%?%p8%t\E)%e\E(%;%?%p9%t\EcE%e\EcD%;\EG%{48}%?%p2%t%{8}
+	    %|%;%?%p1%p3%|%p6%|%t%{4}%|%;%?%p4%t%{2}%|%;%?%p1%p5%|%t
+	    %{64}%|%;%?%p7%t%{1}%|%;%c,
+	sgr0=\E(\EH\003\EG0\EcD, smacs=\EcE, smam=\Ed/,
+	smcup=\Ew1, smir=\Eq, smln=\EA10, smso=\EGt, smxon=\Ec21,
+	tbc=\E0, use=adm+sgr, use=wyse+sl,
+#
+wy160-w|wyse160-w|Wyse 160 132-column,
+	cols#132, lw#7, nlab#16, wsl#90,
+	cup=\Ea%i%p1%dR%p2%dC, dch1=\EW$<9>,
+	rs2=\EeF$<150>\E`;$<150>, use=wy160,
+#
+wy160-25|wyse160-25|Wyse 160 80-column 25-lines,
+	lh@, lines#25, lw@, nlab@,
+	pln@, rs3=\EwG\Ee)$<200>, use=wy160,
+wy160-25-w|wyse160-25-w|Wyse 160 132-column 25-lines,
+	lh@, lines#25, lw@, nlab@,
+	pln@, rs3=\EwG\Ee)$<200>, use=wy160-w,
+#
+wy160-42|wyse160-42|Wyse 160 80-column 42-lines,
+	lines#42,
+	clear=\E+$<50>, dl1=\ER$<2>, ed=\Ey$<50>, il1=\EE$<2>,
+	ind=\n$<2>, is1=\EcB2\EcC3, nel=\r\n$<2>, ri=\Ej$<2>,
+	rs3=\Ee*$<150>, use=wy160,
+wy160-42-w|wyse160-42-w|Wyse 160 132-column 42-lines,
+	cols#132, lw#7, nlab#16, wsl#90,
+	cup=\Ea%i%p1%dR%p2%dC, dch1=\EW$<8>, ip=$<3>,
+	rs2=\EeF$<150>\E`;$<150>, use=wy160-42,
+#
+wy160-43|wyse160-43|Wyse 160 80-column 43-lines,
+	lh@, lines#43, lw@, nlab@,
+	pln@, rs3=\Ee+$<150>, use=wy160-42,
+wy160-43-w|wyse160-43-w|Wyse 160 132-column 43-lines,
+	lh@, lines#43, lw@, nlab@,
+	pln@, rs3=\Ee+$<150>, use=wy160-42-w,
+#
+wy160-vb|wyse160-vb|Wyse 160 visible bell,
+	bel@, use=wy160,
+wy160-w-vb|wy160-wvb|wyse160-wvb|Wyse 160 132-column visible bell,
+	bel@, use=wy160-w,
+#
+#	The Wyse 75 is a VT100 lookalike without advanced video.
+#
+#	   The Wyse 75 can support one attribute (e.g. Dim, Inverse,
+#	Underline) without magic cookies.  The following description
+#	uses this capability, but when more than one attribute is
+#	put on the screen at once, all attributes will be changed
+#	to be the same as the last attribute given.
+#	   The Wyse 75 can support more attributes when used with magic
+#	cookies.  The wy75-mc terminal description uses magic cookies
+#	to correctly handle multiple attributes on a screen.
+#
+wy75|wyse75|Wyse 75,
+	am, hs, mc5i, mir, msgr, xenl, xon,
+	cols#80, lines#24, ma#1, pb#1201, wsl#78,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, cbt=\E[Z, clear=\E[H\E[J$<30>, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr$<2>, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	dch=\E[%p1%dP$<3*>, dch1=\E[P$<3>, dim=\E[0t\E[2m,
+	dl=\E[%p1%dM$<1*>, dl1=\E[M,
+	dsl=\E[>\,\001\001\E[>-\001\001, ech=\E[%p1%dX,
+	ed=\E[J$<30>, el=\E[K$<3>, el1=\E[1K$<3>, enacs=\E)0,
+	flash=\E[30h\E\,$<250/>\E[30l, fsl=^A, home=\E[H,
+	hpa=\E[%i%p1%dG, ht=^I, hts=\EH, ich=\E[%p1%d@$<1*>,
+	il=\E[%p1%dL$<2*>, il1=\E[L$<2>, ind=\n$<2>, ip=$<1>,
+	is1=\E[2;4;20;30l\E[?1;10l\E[12h\E[?7;8;25h,
+	is2=\E>\E(B\E)0\017, is3=\E[m, kbs=^H, kcub1=\E[D,
+	kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kdl1=\E[M, kel=\E[K,
+	kf1=\E[?5i, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~,
+	kf13=\E[25~, kf14=\E[26~, kf15=\E[28~, kf16=\E[29~,
+	kf17=\E[31~, kf18=\E[32~, kf19=\E[33~, kf2=\E[?3i,
+	kf20=\E[34~, kf21=\E[35~, kf3=\E[2i, kf4=\E[@, kf5=\E[M,
+	kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, kfnd=\E[1~,
+	khlp=\E[28~, khome=\E[H, kich1=\E[@, kil1=\E[L, knp=\E[6~,
+	kpp=\E[5~, kprt=\E[?5i, kslt=\E[4~, mc0=\E[0i, mc4=\E[4i,
+	mc5=\E[5i, rc=\E8, rev=\E[1t\E[7m, ri=\EM$<2>, rmacs=^O,
+	rmam=\E[?7l, rmir=\E[4l, rmkx=\E>, rmso=\E[m, rmul=\E[m,
+	rs1=\E[13l\E[3l\E!p, rs2=\E[35h\E[?3l$<80>, rs3=\E[?5l,
+	sc=\E7,
+	sgr=%?%p5%t\E[0t%;%?%p3%p1%|%t\E[1t%;%?%p2%t\E[2t%;%?%p4%t
+	    \E[3t%;%?%p1%p2%p3%p4%p5%|%|%|%|%t\E[7m%e\E[m%;%?%p9%t
+	    \016%e\017%;,
+	sgr0=\E[m\017, smacs=^N, smam=\E[?7h, smir=\E[4h,
+	smkx=\E[?1l\E[?7h\E=, smso=\E[1t\E[7m, smul=\E[2t\E[4m,
+	tbc=\E[3g, tsl=\E[>\,\001, use=decid+cpr, use=vt220+cvis,
+	use=vt220+keypad,
+#
+#	This terminal description uses the non-hidden attribute mode
+#	(with magic cookie).
+#
+wy75-mc|wyse75-mc|Wyse 75 with magic cookies,
+	msgr@,
+	ma@, xmc#1,
+	blink=\E[2p, dim=\E[1p, invis=\E[4p, is3=\E[m\E[p,
+	rev=\E[16p, rmacs=\E[0p\017, rmso=\E[0p, rmul=\E[0p,
+	sgr=\E[%{0}%?%p2%p6%|%t%{8}%|%;%?%p1%p3%|%p6%|%t%{16}%|%;%?
+	    %p4%t%{2}%|%;%?%p1%p5%|%t%{1}%|%;%?%p7%t%{4}%|%;%dp%?%p9
+	    %t\016%e\017%;,
+	sgr0=\E[0p\017, smacs=\E[0p\016, smso=\E[17p, smul=\E[8p,
+	use=wy75,
+wy75-vb|wyse75-vb|Wyse 75 with visible bell,
+	pb@,
+	bel@, use=wy75,
+wy75-w|wyse75-w|Wyse 75 in 132 column mode,
+	cols#132, wsl#130,
+	rs2=\E[35h\E[?3h$<80>, use=wy75,
+wy75-wvb|wyse75-wvb|Wyse 75 with visible bell 132 columns,
+	pb@,
+	bel@, use=wy75-w,
+#
+#	Wyse 85 emulating a VT220 7 bit mode.
+#		24 line screen with status line.
+#
+#	The VT220 mode permits more function keys but it wipes out
+#	the escape key.  I strongly recommend that <f11> be set to
+#	escape (esc).
+#	The terminal may have to be set for 8 data bits and 2 stop
+#	bits for the arrow keys to work.
+#	The Wyse 85 runs faster with XON/XOFF enabled.  Also the
+#	<dch> and <ich> work best when XON/XOFF is set.  <ich> and
+#	<dch> leave trash on the screen when used without XON/XOFF.
+#
+wy85|wyse85|Wyse 85,
+	am, hs, mc5i, mir, msgr, xenl, xon,
+	cols#80, it#8, lines#24, wsl#80,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z,
+	clear=\E[H\E[J$<110>, cr=\r, csr=\E[%i%p1%d;%p2%dr,
+	cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=\n,
+	cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH$<1>,
+	cuu=\E[%p1%dA, cuu1=\E[A, dch=\E[%p1%dP$<3*>,
+	dch1=\E[P$<3>, dim=\E[2m, dl=\E[%p1%dM$<3*>,
+	dl1=\E[M$<3>, dsl=\E[40l, ech=\E[%p1%dX, ed=\E[J$<110>,
+	el=\E[K$<1>, el1=\E[1K, enacs=\E)0,
+	flash=\E[30h\E\,$<300/>\E[30l, fsl=\E[1;24r\E8,
+	home=\E[H, ht=\011$<1>, hts=\EH, ich=\E[%p1%d@$<4*>,
+	il=\E[%p1%dL$<5*>, il1=\E[L$<5>, ind=\n$<3>, invis=\E[8m,
+	ip=$<3>, is1=\E[62;1"p\E[?5W,
+	is2=\E[2;4;20;30l\E[?1;4;10;16l\E[12h\E[?7;8;25h$<16>,
+	is3=\E>\E(B\E)0\017\E[m, kbs=^H, kcub1=\E[D, kcud1=\E[B,
+	kcuf1=\E[C, kcuu1=\E[A, kf10=\E[21~, kf11=\E[23~,
+	kf12=\E[24~, kf13=\E[25~, kf14=\E[26~, kf15=\E[28~,
+	kf16=\E[29~, kf17=\E[31~, kf18=\E[32~, kf19=\E[33~,
+	kf20=\E[34~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~,
+	kf9=\E[20~, khlp=\E[28~, khome=\E[26~, lf1=PF1, lf2=PF2,
+	lf3=PF3, lf4=PF4, mc0=\E[0i, mc4=\E[4i, mc5=\E[5i, rc=\E8,
+	rev=\E[7m, ri=\EM$<3>, rmacs=^O, rmam=\E[?7l, rmir=\E[4l,
+	rmkx=\E>, rmso=\E[m, rmul=\E[m, rs1=\E[13l\E[3l\E!p,
+	rs2=\E[35h\E[?3l$<70>, rs3=\E[?5l, sc=\E7,
+	sgr=\E[0%?%p2%t;4%;%?%p3%p1%|%t;7%;%?%p4%t;5%;%?%p5%t;2%;%?
+	    %p6%t;1%;%?%p7%t;8%;m%?%p9%t\016%e\017%;,
+	sgr0=\E[m\017, smacs=^N, smam=\E[?7h, smir=\E[4h,
+	smkx=\E[?1l\E=, smso=\E[7m, smul=\E[4m, tbc=\E[3g,
+	tsl=\E[40h\E7\E[25;%i%p1%dH, use=decid+cpr,
+	use=vt220+vtedit, use=vt220+cvis, use=vt220+keypad,
+#
+#	Wyse 85 with visual bell.
+wy85-vb|wyse85-vb|Wyse 85 with visible bell,
+	bel@, flash=\E[30h\E\,$<300/>\E[30l, use=wy85,
+#
+#	Wyse 85 in 132-column mode.
+wy85-w|wyse85-w|Wyse 85 in 132-column mode,
+	cols#132, wsl#132,
+	rs2=\E[35h$<70/>\E[?3h, use=wy85,
+#
+#	Wyse 85 in 132-column mode with visual bell.
+wy85-wvb|wyse85-wvb|Wyse 85 with visible bell 132-columns,
+	bel@, use=wy85-w,
+
+# From: Kevin Turner <kevint@aracnet.com>, 12 Jul 1998
+# This copes with an apparent firmware bug in the wy85.  He writes:
+# "What I did was change leave the terminal cursor keys set to Normal
+# (instead of application), and change \E[ to \233 for all the keys in
+# terminfo. At one point, I found some reference indicating that this
+# terminal bug (not sending \E[) was acknowledged by Wyse (so it's not just
+# me), but I can't find that and the server under my bookmark to "Wyse
+# Technical" isn't responding.  So there's the question of whether the wy85
+# terminfo should reflect the manufacturer's intended behaviour of the terminal
+# or the actual."
+wy85-8bit|wyse85-8bit|Wyse 85 in 8-bit mode,
+	am, hs, mc5i, mir, msgr, xenl, xon,
+	cols#80, it#8, lines#24, wsl#80,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z,
+	clear=\E[H\E[J$<110>, cr=\r, csr=\E[%i%p1%d;%p2%dr,
+	cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=\n,
+	cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH$<1>,
+	cuu=\E[%p1%dA, cuu1=\E[A, dch=\E[%p1%dP$<3*>,
+	dch1=\E[P$<3>, dim=\E[2m, dl=\E[%p1%dM$<3*>,
+	dl1=\E[M$<3>, dsl=\E[40l, ech=\E[%p1%dX, ed=\E[J$<110>,
+	el=\E[K$<1>, el1=\E[1K, enacs=\E)0,
+	flash=\E[30h\E\,$<300/>\E[30l, fsl=\E[1;24r\E8,
+	home=\E[H, ht=\011$<1>, hts=\EH, ich=\E[%p1%d@$<4*>,
+	il=\E[%p1%dL$<5*>, il1=\E[L$<5>, ind=\n$<3>, invis=\E[8m,
+	ip=$<3>, is1=\E[62;1"p\E[?5W,
+	is2=\E[2;4;20;30l\E[?1;4;10;16l\E[12h\E[?7;8;25h$<16>,
+	is3=\E>\E(B\E)0\017\E[m, ka1=\EOw, ka3=\EOy, kb2=\EOu,
+	kbs=^H, kc1=\EOq, kc3=\EOs, kcub1=\233D, kcud1=\233B,
+	kcuf1=\233C, kcuu1=\233A, kdch1=\2333~, kent=\EOM,
+	kf1=\EOP, kf10=\23321~, kf11=\23323~, kf12=\23324~,
+	kf13=\23325~, kf14=\23326~, kf15=\23328~, kf16=\23329~,
+	kf17=\23331~, kf18=\23332~, kf19=\23333~, kf2=\EOQ,
+	kf20=\23334~, kf3=\EOR, kf4=\EOS, kf6=\23317~, kf7=\23318~,
+	kf8=\23319~, kf9=\23320~, kfnd=\2331~, khlp=\23328~,
+	khome=\23326~, kich1=\2332~, knp=\2336~, kpp=\2335~,
+	kslt=\2334~, lf1=PF1, lf2=PF2, lf3=PF3, lf4=PF4, mc0=\E[0i,
+	mc4=\E[4i, mc5=\E[5i, rc=\E8, rev=\E[7m, ri=\EM$<3>,
+	rmacs=^O, rmam=\E[?7l, rmir=\E[4l, rmkx=\E>, rmso=\E[m,
+	rmul=\E[m, rs1=\E[13l\E[3l\E!p, rs2=\E[35h\E[?3l$<70>,
+	rs3=\E[?5l, sc=\E7,
+	sgr=\E[0%?%p2%t;4%;%?%p3%p1%|%t;7%;%?%p4%t;5%;%?%p5%t;2%;%?
+	    %p6%t;1%;%?%p7%t;8%;+m%?%p9%t\016%e\017%;,
+	sgr0=\E[m\017, smacs=^N, smam=\E[?7h, smir=\E[4h,
+	smkx=\E[?1l\E=, smso=\E[7m, smul=\E[4m, tbc=\E[3g,
+	tsl=\E[40h\E7\E[25;%i%p1%dH, use=decid+cpr,
+	use=vt220+cvis,
+#
+#	Wyse 185 emulating a VT320 7 bit mode.
+#
+#	This terminal always displays 25 lines.  These lines may be used
+#	as 24 data lines and a terminal status line (top or bottom) or
+#	25 data lines.  The 48 and 50 line modes change the page size
+#	and not the number of lines on the screen.
+#
+#	The Compose Character key can be used as a meta key if changed
+#	by set-up.
+#
+wy185|wyse185|Wyse 185,
+	am, hs, km, mc5i, mir, msgr, xenl, xon,
+	cols#80, it#8, lines#24, wsl#80,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, civis=\E[?25l,
+	clear=\E[H\E[J$<40>, cnorm=\E[34h\E[?25h, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr$<20>, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	cvvis=\E[?25h\E[34l, dch=\E[%p1%dP$<3>, dch1=\E[P$<3>,
+	dim=\E[2m, dl=\E[%p1%dM$<2*>, dl1=\E[M$<2>,
+	dsl=\E7\E[99;0H\E[K\E8, ech=\E[%p1%dX, ed=\E[J$<40>,
+	el=\E[K, el1=\E[1K, enacs=\E)0,
+	flash=\E[30h\E\,$<100/>\E[30l, fsl=\E[1;24r\E8,
+	home=\E[H, hpa=\E[%i%p1%d`, ht=^I, hts=\EH,
+	ich=\E[%p1%d@$<2>, il=\E[%p1%dL$<3*>, il1=\E[L$<3>,
+	ind=\n$<2>, invis=\E[8m, ip=$<4>, is1=\E[?5W,
+	is2=\E[2;4;20;30l\E[?1;4;10;16l\E[12h\E[?7;8;25h,
+	is3=\E>\E(B\E)0\017\E[m, kbs=^H, kcbt=\E[Z, kcub1=\E[D,
+	kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kf1=\EOP, kf10=\E[21~,
+	kf11=\E[23~, kf12=\E[24~, kf13=\E[25~, kf14=\E[26~,
+	kf15=\E[28~, kf16=\E[29~, kf17=\E[31~, kf18=\E[32~,
+	kf19=\E[33~, kf2=\EOQ, kf20=\E[34~, kf3=\EOR, kf4=\EOS,
+	kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~,
+	khlp=\E[28~, khome=\E[26~, lf1=PF1, lf2=PF2, lf3=PF3,
+	lf4=PF4, mc0=\E[0i, mc4=\E[4i, mc5=\E[5i, rc=\E8, rev=\E[7m,
+	ri=\EM$<2>, rmacs=^O, rmam=\E[?7l, rmcup=\E[ R, rmir=\E[4l,
+	rmkx=\E>, rmso=\E[27m, rmul=\E[24m,
+	rs1=\E[13l\E[3l\E\\\E[63;1"p\E[!p, rs2=\E[35h\E[?3l,
+	rs3=\E[?5l\E[47h\E[40l\E[r, sc=\E7,
+	sgr=\E[0%?%p2%t;4%;%?%p3%p1%|%t;7%;%?%p4%t;5%;%?%p5%t;2%;%?
+	    %p6%t;1%;%?%p7%t;8%;m%?%p9%t\016%e\017%;,
+	sgr0=\E[m\017, smacs=^N, smam=\E[?7h, smcup=\E[ Q,
+	smir=\E[4h, smkx=\E[?1l\E=, smso=\E[7m, smul=\E[4m,
+	tbc=\E[3g, tsl=\E7\E[99;%i%p1%dH, vpa=\E[%i%p1%dd,
+	use=decid+cpr, use=vt220+vtedit, use=vt220+keypad,
+#
+#	Wyse 185 with 24 data lines and top status (terminal status)
+wy185-24|wyse185-24|Wyse 185 with 24 data lines,
+	hs@,
+	dsl@, fsl@, rs3=\E[?5l\E[47h\E[40l\E[1;24r, tsl@,
+	use=wy185,
+#
+#	Wyse 185 with visual bell.
+wy185-vb|wyse185-vb|Wyse 185+flash,
+	bel@, use=wy185,
+#
+#	Wyse 185 in 132-column mode.
+wy185-w|wyse185-w|Wyse 185 in 132-column mode,
+	cols#132, wsl#132,
+	dch=\E[%p1%dP$<7>, dch1=\E[P$<7>, ich=\E[%p1%d@$<7>,
+	ip=$<7>, rs2=\E[35h\E[?3h, use=wy185,
+#
+#	Wyse 185 in 132-column mode with visual bell.
+wy185-wvb|wyse185-wvb|Wyse 185+flash+132 cols,
+	bel@, use=wy185-w,
+
+# wy325 terminfo entries
+# Done by Joe H. Davis        3-9-92
+
+# lines 25  columns 80
+#
+wy325|wyse325|Wyse epc,
+	am, bw, mc5i, mir,
+	cols#80, lh#1, lines#24, lw#8, nlab#8, pb#9601,
+	acsc=+/\,.0[a2fxgqh1ihjYk?lZm@nEqDtCu4vAwBx3yszr{c~~,
+	bel=^G, blink=\EG2, cbt=\EI, civis=\E`0, clear=\E+$<50>,
+	cnorm=\E`1, cr=\r, cub1=^H, cud1=\n, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW$<7>,
+	dim=\EGp, dl1=\ER$<3>, ed=\EY$<50>, el=\ET$<4>,
+	flash=\E`8$<100/>\E`9, home=^^, ht=^I, hts=\E1,
+	il1=\EE$<3>, ind=\n$<3>, ip=$<2>, is1=\EcB0\EcC1,
+	is2=\EcD\E'\Er\EH\003\Ed/\EO\Ee1\Ed*\E`@\E`9\E`1\016\024
+	    \El,
+	is3=\Ew0$<16>, kHOM=\E{, kbs=^H, kcbt=\EI, kcub1=^H,
+	kcud1=\n, kcuf1=^L, kcuu1=^K, kdch1=\EW, kdl1=\ER, ked=\EY,
+	kel=\ET, kent=\E7, kf1=^A@\r, kf10=^AI\r, kf11=^AJ\r,
+	kf12=^AK\r, kf13=^AL\r, kf14=^AM\r, kf15=^AN\r, kf16=^AO\r,
+	kf2=^AA\r, kf3=^AB\r, kf4=^AC\r, kf5=^AD\r, kf6=^AE\r,
+	kf7=^AF\r, kf8=^AG\r, kf9=^AH\r, khome=^^, kich1=\Eq,
+	kil1=\EE, knp=\EK, kpp=\EJ, kprt=\EP, krpl=\Er, ll=^^^K,
+	mc0=\EP, mc4=^T, mc5=\Ed#,
+	pfloc=\EZ2%p1%{63}%+%c%p2%s\177,
+	pfx=\EZ1%p1%{63}%+%c%p2%s\177,
+	pln=\Ez%p1%{47}%+%c%p2%s\r, prot=\E), ri=\Ej$<2>,
+	rmacs=\EcD, rmam=\Ed., rmcup=\Ew0, rmir=\Er, rmln=\EA11,
+	rs1=\E~!\E~4$<30>, rs2=\EeF\E`:$<70>,
+	rs3=\EwG\Ee($<100>,
+	sgr=%?%p8%t\E)%e\E(%;%?%p9%t\EcE%e\EcD%;\EG%{48}%?%p2%t%{8}
+	    %|%;%?%p1%p3%|%p6%|%t%{4}%|%;%?%p4%t%{2}%|%;%?%p1%p5%|%t
+	    %{64}%|%;%?%p7%t%{1}%|%;%c,
+	sgr0=\E(\EH\003\EG0\EcD, smacs=\EcE, smam=\Ed/,
+	smcup=\Ew1, smir=\Eq, smln=\EA10, smso=\EGt, tbc=\E0,
+	use=adm+sgr, use=wyse+sl,
+
+#
+# lines 24  columns 80  vb
+#
+wy325-vb|wyse325-vb|Wyse-325 with visual bell,
+	bel@, use=wy325,
+
+#
+# lines 24  columns 132
+#
+wy325-w|wyse325-w|wy325w-24|Wyse-325 in wide mode,
+	cols#132, lw#7, nlab#16, wsl#97,
+	cup=\Ea%i%p1%dR%p2%dC, dch1=\EW$<12>, ip=$<4>,
+	rs2=\E`;$<70>, use=wy325,
+#
+# lines 25  columns 80
+#
+wy325-25|wyse325-25|wy325-80|wyse-325|Wyse-325 25 lines,
+	lh@, lines#25, lw@, nlab@,
+	pln@, rs3=\EwG\Ee)$<100>, use=wy325,
+#
+# lines 25  columns 132
+#
+wy325-25w|wyse325-25w|Wyse-325 132 columns,
+	lh@, lines#25, lw@, nlab@,
+	pln@, rs3=\EwG\Ee)$<100>, use=wy325-w,
+#
+# lines 25  columns 132  vb
+#
+wy325-w-vb|wy325-wvb|wyse325-wvb|Wyse-325 wide mode reverse video,
+	bel@, use=wy325-w,
+
+#
+# lines 42  columns 80
+#
+wy325-42|wyse325-42|Wyse-325 42 lines,
+	lh@, lines#42, lw@, nlab@,
+	pln@, rs3=\EwG\Ee)$<100>, use=wy325,
+#
+# lines 42  columns 132
+#
+wy325-42w|wyse325-42w|Wyse-325 42 lines wide mode,
+	lh@, lines#42, lw@, nlab@,
+	pln@, rs3=\EwG\Ee)$<100>, use=wy325-w,
+#
+# lines 42  columns 132  vb
+#
+wy325-42w-vb|wy325-42wvb|Wyse-325 42 lines wide mode visual bell,
+	bel@, use=wy325-w,
+#
+# lines 43  columns 80
+#
+wy325-43|wyse325-43|Wyse-325 43 lines,
+	lh@, lines#43, lw@, nlab@,
+	pln@, use=wy325,
+#
+# lines 43  columns 132
+#
+wy325-43w|wyse325-43w|Wyse-325 43 lines wide mode,
+	lh@, lines#43, lw@, nlab@,
+	pln@, rs3=\EwG\Ee)$<100>, use=wy325-w,
+#
+# lines 43  columns 132  vb
+#
+wy325-43w-vb|wy325-43wvb|Wyse-325 43 lines wide mode visual bell,
+	bel@, use=wy325-w,
+
+#	Wyse 370 -- 24 line screen with status line.
+#
+#	The terminal may have to be set for 8 data bits and 2 stop
+#	bits for the arrow keys to work.
+#
+#	If you change keyboards the terminal will send different
+#	escape sequences.
+#	The following definition is for the basic terminal without
+#	function keys.
+#
+#	<u0> -> enter Tektronix 4010/4014 mode
+#	<u1> -> exit  Tektronix 4010/4014 mode
+#	<u2> -> enter ASCII mode (from any ANSI mode)
+#	<u3> -> exit  ASCII mode (goto native ANSI mode)
+#	<u4> -> enter Tek 4207 ANSI mode (from any ANSI mode)
+#	<u5> -> exit  Tek 4207 mode (goto native ANSI mode)
+#
+# Bug: The <op> capability resets attributes.
+wy370-nk|Wyse 370 without function keys,
+	am, ccc, hs, mc5i, mir, msgr, xenl, xon,
+	colors#64, cols#80, it#8, lines#24, ncv#48, pairs#64, wsl#80,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, civis=\E[?25l,
+	clear=\E[H\E[J$<40>, cnorm=\E[34h\E[?25h, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH$<1>, cuu=\E[%p1%dA, cuu1=\E[A,
+	cvvis=\E[?25h\E[34l, dch=\E[%p1%dP$<1*>, dch1=\E[P$<1>,
+	dclk=\E[31h, dim=\E[2m, dl=\E[%p1%dM$<2*>, dl1=\E[M$<2>,
+	dsl=\E[40l, ech=\E[%p1%dX$<.1*>, ed=\E[J$<40>,
+	el=\E[K$<10>, el1=\E[1K$<12>, enacs=\E)0,
+	flash=\E[30h\E\,$<300/>\E[30l, fsl=\E[1;24r\E8,
+	home=\E[H, hpa=\E[%i%p1%d`, ht=\011$<1>, hts=\EH,
+	ich=\E[%p1%d@$<1*>, il=\E[%p1%dL$<2*>, il1=\E[L$<2>,
+	ind=\n$<2>,
+	initc=\E[66;%p1%d;%?%p2%{250}%<%t%{0}%e%p2%{500}%<%t%{16}%e
+	      %p2%{750}%<%t%{32}%e%{48}%;%?%p3%{250}%<%t%{0}%e%p3
+	      %{500}%<%t%{4}%e%p3%{750}%<%t%{8}%e%{12}%;%?%p4%{250}
+	      %<%t%{0}%e%p4%{500}%<%t%{1}%e%p4%{750}%<%t%{2}%e%{3}%;
+	      %{1}%+%+%+%dw,
+	invis=\E[8m, ip=$<1>, is1=\E[90;1"p\E[?5W$<6>,
+	is2=\E[2;4;20;30;40l\E[?1;10;16l\E[12h\E[?7;8;25h,
+	is3=\E>\017\E)0\E(B\E[63;0w\E[m, mc0=\E[0i, mc4=\E[4i,
+	mc5=\E[5i,
+	oc=\E[60w\E[63;0w\E[66;1;4w\E[66;2;13w\E[66;3;16w\E[66;4;49w
+	   \E[66;5;51w\E[66;6;61w\E[66;7;64w,
+	op=\E[m, rc=\E8, rev=\E[7m, ri=\EM$<2>, rmacs=^O,
+	rmam=\E[?7l, rmclk=\E[31l, rmcup=\E[ R, rmir=\E[4l,
+	rmkx=\E>, rmso=\E[27m, rmul=\E[24m,
+	rs1=\E[13l\E[3l\E!p\E[?4i, rs2=\E[35h\E[?3l$<8>,
+	rs3=\E[?5l, sc=\E7, setb=\E[62;%p1%dw, setf=\E[61;%p1%dw,
+	sgr=\E[0%?%p2%t;4%;%?%p3%p1%|%t;7%;%?%p4%t;5%;%?%p5%t;2%;%?
+	    %p6%t;1%;%?%p7%t;8%;m%?%p9%t\016%e\017%;,
+	sgr0=\E[m\017, smacs=^N, smam=\E[?7h, smcup=\E[ Q,
+	smir=\E[4h, smkx=\E[?1l\E=, smso=\E[7m, smul=\E[4m,
+	tbc=\E[3g, tsl=\E[40l\E[40h\E7\E[99;%i%p1%dH,
+	u0=\E[?38h\E8, u1=\E[?38l\E)0, u2=\E[92;52"p, u3=\E~B,
+	u4=\E[92;76"p, u5=\E%!1\E[90;1"p, vpa=\E[%i%p1%dd,
+	use=decid+cpr,
+#
+#	Function key set for the ASCII (wy-50 compatible) keyboard
+#	This is the default 370.
+#
+wy370|wyse370|wy370-101k|Wyse 370 with 101 key keyboard,
+	kbs=^H, kcbt=\E[Z, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C,
+	kcuu1=\E[A, kdch1=\EOQ, kdl1=\EOQ, kent=\EOM, kf1=\E[?4i,
+	kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\E[25~,
+	kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, kf2=\E[?3i,
+	kf3=\E[2i, kf4=\E[@, kf5=\E[M, kf6=\E[17~, kf7=\E[18~,
+	kf8=\E[19~, kf9=\E[20~, khome=\E[H, kich1=\EOP, kil1=\EOP,
+	knp=\E[U, kpp=\E[V, use=wy370-nk,
+#
+#	Function key set for the VT-320 (and wy85) compatible keyboard
+#
+wy370-105k|Wyse 370 with 105 key keyboard,
+	kbs=^H, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A,
+	kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\E[25~,
+	kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, kf17=\E[31~,
+	kf18=\E[32~, kf19=\E[33~, kf20=\E[34~, kf6=\E[17~,
+	kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, kfnd=\E[1~,
+	khlp=\E[28~, khome=\E[26~, lf1=PF1, lf2=PF2, lf3=PF3,
+	lf4=PF4, use=vt220+vtedit, use=wy370-nk,
+	use=vt220+keypad,
+#
+#	Function key set for the PC compatible keyboard
+#
+wy370-EPC|Wyse 370 with 102 key keyboard,
+	kbs=^H, kcbt=\E[Z, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C,
+	kcuu1=\E[A, kend=\E[1~, kent=\EOM, kf1=\EOP, kf10=\E[21~,
+	kf11=\E[23~, kf12=\E[24~, kf2=\EOQ, kf3=\EOR, kf4=\EOS,
+	kf5=\E[M, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~,
+	khome=\E[H, kich1=\E[2~, knp=\E[U, kpp=\E[V, use=wy370-nk,
+#
+#	Wyse 370 with visual bell.
+wy370-vb|Wyse 370 with visible bell,
+	bel@, use=wy370,
+#
+#	Wyse 370 in 132-column mode.
+wy370-w|Wyse 370 in 132-column mode,
+	cols#132, wsl#132,
+	rs2=\E[35h\E[?3h$<70>, use=wy370,
+#
+#	Wyse 370 in 132-column mode with visual bell.
+wy370-wvb|Wyse 370 with visible bell 132-columns,
+	flash=\E[30h\E\,$<300/>\E[30l, use=wy370-w,
+wy370-rv|Wyse 370 reverse video,
+	rs3=\E[32h\E[?5h, use=wy370,
+#
+#	Wyse 99gt Tektronix 4010/4014 emulator,
+#
+wy99gt-tek|Wyse 99gt Tektronix 4010/4014 emulator,
+	am, os,
+	cols#74, lines#35,
+	bel=^G, clear=\E^L, cr=\r, cub1=^H, cud1=\n, cuf1=\s,
+	cup=\035%{3040}%{89}%p1%*%-%Py%p2%{55}%*%Px%gy%{128}%/%{31}
+	    %&%{32}%+%c%gy%{3}%&%{4}%*%gx%{3}%&%+%{96}%+%c%gy%{004}
+	    %/%{31}%&%{96}%+%c%gx%{128}%/%{31}%&%{32}%+%c%gx%{004}%/
+	    %{31}%&%{64}%+%c\037,
+	cuu1=^K, ff=^L,
+	hd=\036HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
+	   \037,
+	home=^]7`x @\037,
+	hu=\036DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
+	   \037,
+	is2=\E8, nel=\r\n, u0=\E~>\E8, u1=\E[42h,
+#
+#	Wyse 160 Tektronix 4010/4014 emulator,
+#
+wy160-tek|Wyse 160 Tektronix 4010/4014 emulator,
+	cup=\035%{3103}%{91}%p1%*%-%Py%p2%{55}%*%Px%gy%{128}%/%{31}
+	    %&%{32}%+%c%gy%{3}%&%{4}%*%gx%{3}%&%+%{96}%+%c%gy%{004}
+	    %/%{31}%&%{96}%+%c%gx%{128}%/%{31}%&%{32}%+%c%gx%{004}%/
+	    %{31}%&%{64}%+%c\037,
+	home=^]8`g @\037, use=wy99gt-tek,
+#
+#	Wyse 370 Tektronix 4010/4014 emulator,
+#
+wy370-tek|Wyse 370 Tektronix 4010/4014 emulator,
+	am, os,
+	cols#80, lines#36,
+	bel=^G, clear=\E^L, cr=\r, cub1=^H, cud1=\n, cuf1=\s,
+	cup=\035%{775}%{108}%p1%*%{5}%/%-%Py%p2%{64}%*%{4}%+%{5}%/
+	    %Px%gy%{32}%/%{31}%&%{32}%+%c%gy%{31}%&%{96}%+%c%gx%{32}
+	    %/%{31}%&%{32}%+%c%gx%{31}%&%{64}%+%c\037,
+	cuu1=^K, ff=^L,
+	hd=\036HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
+	   \037,
+	home=^]8g @\037,
+	hu=\036DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
+	   \037,
+	is2=\E8, kbs=^H, kcub1=^H, kcud1=\n, kcuf1=^I, kcuu1=^K,
+	nel=\r\n, u0=\E[?38h\E8, u1=\E[?38l\E)0,
+
+# Vendor-supplied Wyse entries end here.
+
+#
+#TITLE:  TERMINFO ENTRY WY520
+#DATE:   8/5/93
+# The WY520 terminfo is based on the WY285 entry published on the WYSE
+# BBS with the addition of more function keys and special keys.
+#
+#               rs1 -> set personality
+#               rs2 -> set number of columns
+#               rs3 -> set number of lines
+#               is1 -> select the proper font
+#               is2 -> do the initialization
+#               is3 -> If this string is empty then rs3 gets sent.
+#
+#       Wyse 520 emulating a VT420 7 bit mode with default ANSI keyboard
+#       - The BS key is programmed to generate BS in smcup since
+#         is2 doesn't seem to work.
+#       - Remove and shift/Remove: delete a character
+#       - Insert : enter insert mode
+#       - Find   : delete to end of file
+#       - Select : clear a line
+#       - F11, F12, F13: send default sequences (not ESC, BS, LF)
+#       - F14 : Home key
+#       - Bottom status line (host writable line) is used.
+#       - smkx,rmkx are removed because this would put the numeric
+#         keypad in Dec application mode which doesn't seem to work
+#         with SCO applications.
+#
+wy520|wyse520|Wyse 520,
+	am, hs, km, mc5i, mir, xenl, xon,
+	cols#80, it#8, lines#24, wsl#80,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, civis=\E[?25l,
+	clear=\E[H\E[J$<40>, cnorm=\E[34h\E[?25h, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr$<20>, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	cvvis=\E[?25h\E[34l, dch=\E[%p1%dP$<3>, dch1=\E[P$<30>,
+	dim=\E[2m, dl=\E[%p1%dM$<2*>, dl1=\E[M$<2>, dsl=\E[0$~,
+	ech=\E[%p1%dX, ed=\E[J$<40>, el=\E[K, el1=\E[1K,
+	enacs=\E)0, fsl=\E[0$}, home=\E[H, hpa=\E[%i%p1%d`, ht=^I,
+	hts=\EH, ich=\E[%p1%d@$<2>, il=\E[%p1%dL$<3*>,
+	il1=\E[L$<3>, ind=\n$<2>, invis=\E[8m, ip=$<4>, is1=\E[?5W,
+	is2=\E[2;4;20;30l\E[?1;4;10;16l\E[12h\E[?7;8;25;67h,
+	is3=\E>\E(B\E)0\017\E[m, kbs=^H, kcbt=\E[Z, kcub1=\E[D,
+	kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, ked=\E[1~, kel=\E[4~,
+	kent=\EOM, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~,
+	kf13=\E[25~, kf14=\E[26~, kf15=\E[28~, kf16=\E[29~,
+	kf17=\E[31~, kf18=\E[32~, kf19=\E[33~, kf20=\E[34~,
+	kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~,
+	khlp=\E[28~, khome=\E[26~, lf1=PF1, lf2=PF2, lf3=PF3,
+	lf4=PF4, mc0=\E[0i, mc4=\E[4i, mc5=\E[5i, rc=\E8, rev=\E[7m,
+	ri=\EM$<2>, rmacs=^O, rmam=\E[?7l, rmcup=\E[ R, rmir=\E[4l,
+	rmso=\E[m, rmul=\E[24m,
+	rs1=\E[13l\E[3l\E\\\E[63;1"p\E[!p, rs2=\E[35h\E[?3l,
+	rs3=\E[?5l\E[47h\E[40l\E[r, sc=\E7,
+	sgr=\E[0%?%p2%t;4%;%?%p3%p1%|%t;7%;%?%p4%t;5%;%?%p5%t;2%;%?
+	    %p6%t;1%;%?%p7%t;8%;m%?%p9%t\016%e\017%;,
+	sgr0=\E[m\017, smacs=^N, smam=\E[?7h,
+	smcup=\E[ Q\E[?67;8h, smir=\E[4h, smso=\E[7m, smul=\E[4m,
+	tbc=\E[3g, tsl=\E[2$~\E[1$}\E[%i%p1%d`,
+	vpa=\E[%i%p1%dd, use=decid+cpr, use=vt220+vtedit,
+	use=vt220+keypad,
+#
+#       Wyse 520 with 24 data lines and status (terminal status)
+wy520-24|wyse520-24|Wyse 520 with 24 data lines,
+	hs@,
+	dsl@, fsl@, rs3=\E[?5l\E[47h\E[40l\E[1;24r, tsl@,
+	use=wy520,
+#
+#       Wyse 520 with visual bell.
+wy520-vb|wyse520-vb|Wyse 520 with visible bell,
+	flash=\E[30h\E\,$<100/>\E[30l, use=wy520,
+#
+#       Wyse 520 in 132-column mode.
+wy520-w|wyse520-w|Wyse 520 in 132-column mode,
+	cols#132, wsl#132,
+	dch=\E[%p1%dP$<7>, dch1=\E[P$<7>, ich=\E[%p1%d@$<7>,
+	ip=$<7>, rs2=\E[35h\E[?3h, use=wy520,
+#
+#       Wyse 520 in 132-column mode with visual bell.
+wy520-wvb|wyse520-wvb|Wyse 520 with visible bell 132-columns,
+	flash=\E[30h\E\,$<100/>\E[30l, use=wy520-w,
+#
+#
+#       Wyse 520 emulating a VT420 7 bit mode.
+#       The DEL key is programmed to generate BS in is2.
+#       With EPC keyboard.
+#       - 'End' key will clear till end of line on EPC keyboard
+#       - Shift/End : ignored.
+#       - Insert : enter insert mode.
+#       - Delete : delete a character (have to change interrupt character
+#                  to CTRL-C: stty intr '^c') for it to work since the
+#                  Delete key sends 7FH.
+wy520-epc|wyse520-epc|Wyse 520 with EPC keyboard,
+	kdch1=^?, kel=\E[4~, kend=\E[4~, kf0=\E[21~, kf1=\E[11~,
+	kf2=\E[12~, kf3=\E[13~, kf4=\E[14~, kf5=\E[15~, khome=\E[H,
+	use=wy520,
+#
+#       Wyse 520 with 24 data lines and status (terminal status)
+#       with EPC keyboard.
+wy520-epc-24|wyse520-pc-24|Wyse 520 with 24 data lines and EPC keyboard,
+	hs@,
+	dsl@, fsl@, rs3=\E[?5l\E[47h\E[40l\E[1;24r, tsl@,
+	use=wy520-epc,
+#
+#       Wyse 520 with visual bell.
+wy520-epc-vb|wyse520-pc-vb|Wyse 520 with visible bell and EPC keyboard,
+	flash=\E[30h\E\,$<100/>\E[30l, use=wy520-epc,
+#
+#       Wyse 520 in 132-column mode.
+wy520-epc-w|wyse520-epc-w|Wyse 520 in 132-column mode with EPC keyboard,
+	cols#132, wsl#132,
+	dch=\E[%p1%dP$<7>, dch1=\E[P$<7>, ich=\E[%p1%d@$<7>,
+	ip=$<7>, rs2=\E[35h\E[?3h, use=wy520-epc,
+#
+#       Wyse 520 in 132-column mode with visual bell.
+wy520-epc-wvb|wyse520-p-wvb|Wyse 520 with visible bell 132-columns and EPC keyboard,
+	flash=\E[30h\E\,$<100/>\E[30l, use=wy520-epc-w,
+#
+#       Wyse 520 in 80-column, 36 lines
+wy520-36|wyse520-36|Wyse 520 with 36 data lines,
+	hs@,
+	lines#36,
+	dsl@, fsl@, rs3=\E[?5l\E[36*|\E[36t\E[40l\E[1;36r, tsl@,
+	use=wy520,
+#
+#       Wyse 520 in 80-column, 48 lines
+wy520-48|wyse520-48|Wyse 520 with 48 data lines,
+	hs@,
+	lines#48,
+	dsl@, fsl@, rs3=\E[?5l\E[48*|\E[48t\E[40l\E[1;48r, tsl@,
+	use=wy520,
+#
+#       Wyse 520 in 132-column, 36 lines
+wy520-36w|wyse520-36w|Wyse 520 with 132 columns and 36 data lines,
+	cols#132, wsl#132,
+	rs2=\E[?3h,
+	rs3=\E[?5l\E[36*|\E[36t\E[40l\E[1;36r\E[132$|,
+	use=wy520-36,
+#
+#       Wyse 520 in 132-column, 48 lines
+wy520-48w|wyse520-48w|Wyse 520 with 48 data lines (132 column),
+	cols#132, wsl#132,
+	rs2=\E[?3h,
+	rs3=\E[?5l\E[48*|\E[48t\E[40l\E[1;48r\E[132$|,
+	use=wy520-48,
+#
+#
+#       Wyse 520 in 80-column, 36 lines with EPC keyboard
+wy520-36pc|wyse520-36pc|Wyse 520 with 36 data lines and EPC keyboard,
+	hs@,
+	lines#36,
+	dsl@, fsl@, rs3=\E[?5l\E[36*|\E[36t\E[40l\E[1;36r, tsl@,
+	use=wy520-epc,
+#
+#       Wyse 520 in 80-column, 48 lines with EPC keyboard
+wy520-48pc|wyse520-48pc|Wyse 520 with 48 data lines and EPC keyboard,
+	hs@,
+	lines#48,
+	dsl@, fsl@, rs3=\E[?5l\E[48*|\E[48t\E[40l\E[1;48r, tsl@,
+	use=wy520-epc,
+#
+#       Wyse 520 in 132-column, 36 lines with EPC keyboard
+wy520-36wpc|wyse520-36wpc|Wyse 520 with 36 data lines and EPC keyboard (132 column),
+	cols#132, wsl#132,
+	rs2=\E[?3h,
+	rs3=\E[?5l\E[36*|\E[36t\E[40l\E[1;36r\E[132$|,
+	use=wy520-36pc,
+#
+#       Wyse 520 in 132-column, 48 lines with EPC keyboard
+wy520-48wpc|wyse520-48wpc|Wyse 520 with 48 data lines and EPC keyboard (132 column),
+	cols#132, wsl#132,
+	rs2=\E[?3h,
+	rs3=\E[?5l\E[48*|\E[48t\E[40l\E[1;48r\E[132$|,
+	use=wy520-48pc,
+
+# From: John Gilmore <hoptoad!gnu@lll-crg.arpa>
+# (wyse-vp: removed <if=/usr/share/tabset/wyse-adds>, there's no such
+# file and we don't know what <hts> is -- esr)
+wyse-vp|Wyse 50 in ADDS Viewpoint emulation mode with "enhance" on,
+	OTbs, am,
+	cols#80, it#8, lines#24,
+	bel=^G, clear=^L, cr=\r, cub1=^H, cud1=\n, cuf1=^F,
+	cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=^Z, dch1=\EW,
+	dl1=\El, ed=\Ek, el=\EK, home=^A, ht=^I, il1=\EM, ind=\n,
+	is2=\E`:\E`9\017\Er, kbs=^H, kcub1=^U, kcud1=\n, kcuf1=^F,
+	kcuu1=^Z, khome=^A, ll=^A^Z, nel=\r\n, rmir=\Er, rmso=^O,
+	rmul=^O, rs1=\E`:\E`9\017\Er, sgr0=^O, smir=\Eq, smso=^N,
+	smul=^N,
+
+wy75ap|wyse75ap|wy-75ap|wyse-75ap|Wyse WY-75 Applications and Cursor keypad,
+	is2=\E[1;24r\E[?10;3l\E[?1;25h\E[4l\E[m\E(B\E=,
+	kbs=^H, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
+	khome=\EOH, rmkx=\E[?1l\E>$<10/>, smkx=\E[?1h\E=$<10/>,
+	use=wy75,
+
+# From: Eric Freudenthal <freudent@eric.ultra.nyu.edu>
+wy100q|Wyse 100 for Quotron,
+	OTbs,
+	cols#80, lines#24, xmc#1,
+	cbt=\EI, clear=^Z, cub1=^H, cud1=\n, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW,
+	dl1=\ER, ed=\EY, el=\ET, home=^^, il1=\EE, invis@,
+	is2=\E`:\0\EC\EDF\E0\E'\E(\EA21, kcub1=^H, kcud1=\n,
+	kcuf1=^L, kcuu1=^K, ri=\Ej, rmir=\Er, smir=\Eq, use=adm+sgr,
+
+#### Kermit terminal emulations
+#
+# Obsolete Kermit versions may be listed in the section describing obsolete
+# non-ANSI terminal emulators later in the file.
+#
+
+# KERMIT standard all versions.
+# Straight ascii keyboard. :sr=\EI: not avail. many versions + bug prone in vi.
+# (kermit: removed obsolete ":ma=^Hh^Jj^Kk^Ll^^H:" -- esr)
+# From: greg small <gts@populi.berkeley.edu> 9-25-84
+kermit|standard kermit,
+	OTbs,
+	cols#80, lines#24,
+	clear=\EE, cub1=^H, cud1=\EB, cuf1=\EC,
+	cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, ed=\EJ,
+	el=\EK, home=\EH, is2=K0 Standard Kermit  9-25-84\n,
+	kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K, khome=^^,
+kermit-am|standard kermit plus auto-margin,
+	am,
+	is2=K1 Standard Kermit plus Automatic Margins\n,
+	use=kermit,
+# IBMPC Kermit 1.2.
+# Bugs: <ed>, <el>: do not work except at beginning of line!  <clear> does
+# not work, but fake with :cl=\EH\EJ (since :cd=\EJ: works at beginning of
+# line).
+# From: greg small <gts@populi.berkeley.edu> 8-30-84
+pckermit|pckermit12|UCB IBMPC Kermit 1.2,
+	am,
+	lines#25,
+	clear=\EH\EJ, ed@, el@,
+	is2=K2 UCB IBMPC Kermit 1.2  8-30-84\n, use=kermit,
+# IBMPC Kermit 1.20
+# Cannot use line 25, now acts funny like ANSI special scrolling region.
+# Initialization must escape from that region by cursor position to line 24.
+# Cannot use character insert because 1.20 goes crazy if insert at col 80.
+# Does not use :am: because autowrap is lost when kermit dropped and restarted.
+# From: greg small <gts@populi.berkeley.edu> 12-19-84
+pckermit120|UCB IBMPC Kermit 1.20,
+	it#8, lines#24,
+	cud1=\EB, cvvis=\EO\Eq\EEK3, dch1=\EN, dl1=\EM, ht=^I,
+	il1=\EL,
+	is2=\EO\Eq\EJ\EY7\sK3\sUCB\sIBMPC\sKermit\s1.20\s\s12-19-84
+	    \n,
+	rmir@, rmso=\Eq, smir@, smso=\Ep, use=kermit,
+# MS-DOS Kermit 2.27 for the IBMPC
+# Straight ascii keyboard. :sr=\EI: not avail. many versions + bug prone in vi.
+# Cannot use line 25, now acts funny like ANSI special scrolling region.
+# Initialization must escape from that region by cursor position to line 24.
+# Does not use am: because autowrap is lost when kermit dropped and restarted.
+# Reverse video for standout like H19.
+# (msk227: removed obsolete ":ma=^Hh^Jj^Kk^Ll^^H:" -- esr)
+# From: greg small <gts@populi.berkeley.edu> 3-17-85
+msk227|mskermit227|MS-DOS Kermit 2.27 for the IBMPC,
+	OTbs, am@,
+	cols#80, it#8, lines#24,
+	clear=\EE, cub1=^H, cud1=\EB, cuf1=\EC,
+	cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA,
+	cvvis=\EO\Eq\EG\EwK4, dch1=\EN, dl1=\EM, ed=\EJ, el=\EK,
+	home=\EH, ht=^I, il1=\EL,
+	is2=\EO\Eq\EG\Ew\EJ\EY7\sK4\sMS\sKermit\s2.27\sfor\sthe
+	    \sIBMPC\s3-17-85\n,
+	kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K, khome=^^, rc=\Ek,
+	rmir=\EO, rmso=\Eq, sc=\Ej, smir=\E@, smso=\Ep,
+# MS-DOS Kermit 2.27 with automatic margins
+# From:	greg small <gts@populi.berkeley.edu> 3-17-85
+msk227am|mskermit227am|UCB MS-DOS Kermit 2.27 with automatic margins,
+	am,
+	cvvis=\EO\Eq\EG\EvK5,
+	is2=\EO\Eq\EG\Ev\EJ\EY7\sK5\sMS\sKermit\s2.27\s+automatic
+	    \smargins\s3-17-85\n,
+	use=msk227,
+# MS-DOS Kermit 2.27 UCB 227.14 for the IBM PC
+# Automatic margins now default.  Use ansi <sgr> for highlights.
+# Define function keys.
+# (msk22714: removed obsolete ":kn#10:" -- esr)
+# From: greg small <gts@populi.berkeley.edu> 3-17-85
+msk22714|mskermit22714|UCB MS-DOS Kermit 2.27 UCB 227.14 IBM PC,
+	am,
+	bold=\E[1m, cvvis=\EO\Eq\EG\EvK6,
+	is2=\EO\Eq\EG\Ev\EJ\EY7\sK6\sMS\sKermit\s2.27\sUCB\s227.14
+	    \sIBM\sPC\s3-17-85\n,
+	kf0=\E0, kf1=\E1, kf2=\E2, kf3=\E3, kf4=\E4, kf5=\E5, kf6=\E6,
+	kf7=\E7, kf8=\E8, kf9=\E9, rev=\E[7m, rmso=\E[m, rmul=\E[m,
+	sgr0=\E[m, smso=\E[1m, smul=\E[4m, use=mskermit227,
+# This was designed for a VT320 emulator, but it is probably a good start
+# at support for the VT320 itself.
+# Please send changes with explanations to bug-gnu-emacs@prep.ai.mit.edu.
+# (vt320-k3: I added <rmam>/<smam> based on the init string -- esr)
+vt320-k3|MS-Kermit 3.00's VT320 emulation,
+	am, eslok, hs, km, mir, msgr, xenl,
+	cols#80, it#8, lines#49, pb#9600, vt#3,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[J, cmdch=\E,
+	cr=\r, csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M,
+	dsl=\E[0$~, ech=\E[%p1%dX, ed=\E[J, el=\E[K,
+	flash=\E[?5h$<100/>\E[?5l\E[?5h$<100/>\E[?5l\E[?5h$<100/>\E[
+	      ?5l,
+	fsl=\E[0$}, home=\E[H, hpa=\E[%i%p1%dG, ht=^I, hts=\EH,
+	ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[L, ind=\n,
+	is2=\E>\E F\E[?1h\E[?7h\E[r\E[2$~, kbs=^H, kcub1=\EOD,
+	kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kdl1=\E[3~, kf0=\E[21~,
+	kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf6=\E[17~,
+	kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, kich1=\E[2~, knp=\E[6~,
+	kpp=\E[5~, mc0=\E[0i, mc4=\E[4i, mc5=\E[5i, nel=\r\n, rc=\E8,
+	rev=\E[7m, ri=\EM, rin=\E[%p1%dL, rmacs=\E(B, rmam=\E[?7l,
+	rmir=\E[4l, rmkx=\E[?1l\E>, rmso=\E[27m, rmul=\E[24m,
+	rs1=\E(B\E)B\E>\E\sF\E[4;20l\E[12h\E[?1;5;6;38;42l\E[?7;25h
+	    \E[4i\E[?4i\E[m\E[r\E[2$~,
+	sc=\E7, sgr0=\E[m, smacs=\E(0, smam=\E[?7h, smir=\E[4h,
+	smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m, tbc=\E[3g,
+	tsl=\E[1$}\r\E[K, vpa=\E[%i%p1%dd, use=vt220+cvis,
+
+# From: Joseph Gil <yogi@cs.ubc.ca> 13 Dec 1991
+# ACS capabilities from Philippe De Muyter  <phdm@info.ucl.ac.be> 30 May 1996
+# (I removed a bogus boolean :mo: and added <msgr>, <smam>, <rmam> -- esr)
+vt320-k311|DEC VT320 series as defined by kermit 3.11,
+	am, eslok, hs, mir, msgr, xenl, xon,
+	cols#80, it#8, lines#24, vt#3,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[;H\E[2J, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M,
+	dsl=\E[2$~\r\E[1$}\E[K\E[$}, ed=\E[J, el=\E[K,
+	flash=\E[?5h$<100/>\E[?5l, fsl=\E[$}, home=\E[H, ht=^I,
+	hts=\EH, ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[L$<3/>,
+	ind=\ED,
+	is2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h\E[1;24r\E[24;1H,
+	kbs=^H, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
+	kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf6=\E[17~,
+	kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, lf1=pf1, lf2=pf2,
+	lf3=pf3, lf4=pf4, nel=\r\ED, rc=\E8, rev=\E[7m,
+	rf=/usr/share/tabset/vt100, ri=\EM, rmacs=^O,
+	rmam=\E[?7l, rmir=\E[4l, rmkx=\E[?1l\E>, rmso=\E[27m,
+	rmul=\E[24m, rs1=\E[?3l, sc=\E7, sgr0=\E[m, smacs=^N,
+	smam=\E[?7h, smir=\E[4h, smkx=\E[?1h\E=, smso=\E[7m,
+	smul=\E[4m, tbc=\E[3g, tsl=\E[2$~\E[1$}\E[1;%dH,
+	use=vt220+cvis,
+
+######## NON-ANSI TERMINAL EMULATIONS
+#
+
+#### Avatar
+#
+# These entries attempt to describe Avatar, a terminal emulation used with
+# MS-DOS bulletin-board systems.  It was designed to give ANSI-like
+# capabilities, but with cheaper (shorter) control sequences.  Messy design,
+# excessively dependent on PC idiosyncrasies, but apparently rather popular
+# in the BBS world.
+#
+# No color support.  Avatar doesn't fit either of the Tektronix or HP color
+# models that terminfo knows about.  An Avatar color attribute is the
+# low 7 bits of the IBM-PC display-memory attribute.  Bletch.
+#
+# I wrote these entries while looking at the Avatar spec.  I don't have
+# the facilities to test them.  Let me know if they work, or don't.
+#
+# Avatar escapes not used by these entries (because maybe you're smarter
+# and more motivated than I am and can figure out how to wrap terminfo
+# around some of them, and because they are weird enough to be funny):
+#				level 0:
+# ^L		-- clear window/reset current attribute to default
+# ^V^A%p1%c	-- set current color attribute, parameter decodes as follows:
+#
+#      bit:         6   5   4   3   2   1   0
+#                   |       |   |   |       |
+#                   +---+---+   |   +---+---+
+#                       |       |       |
+#                       |       |  foreground color
+#                       |  foreground intensity
+#                  background color
+#				level 0+:
+# ^V^J%p1%c%p2%c%p3%c%p4%c%p5%c	-- scroll (p2,p3) to (p4,p5) up by p1 lines
+# ^V^K%p1%c%p2%c%p3%c%p4%c%p5%c	-- scroll (p2,p3) to (p4,p5) down by p1 lines
+# ^V^L%p1%c%p2%c%p3%c		-- clear p2 lines and p3 cols w/attr %p1
+# ^V^M%p1%c%p2%c%p3%c%p4%c	-- fill p3 lines & p4 cols w/char p2+attr %p1
+# (^V^L and ^V^M set the current attribute as a side-effect.)
+# ^V ^Y <a> [...] <c>	-- repeat pattern. <a> specifies the number of bytes
+#			   in the pattern, <c> the number of times the pattern
+#			   should be repeated. If either value is 0, no-op.
+#			   The pattern can contain Avatar console codes,
+#			   including other ^V ^Y patterns.
+#				level 1:
+# ^V^O		-- clockwise mode on; turn print direction right each time you
+#		   hit a window edge (yes, really).  Turned off by CR
+# ^V^P		-- no-op
+# ^V^Q%c	-- query the driver
+# ^V^R		-- driver reset
+# ^V^S		-- Sound tone (PC-specific)
+# ^V^T			-- change highlight at current cursor position to %c
+# ^V^U%p1%c%p2%c	-- highlight window <a> with attribute <b>
+# ^V^V%p1%c%p2%c%p3%c%p4%c%p5%c
+#			-- define window
+#
+# From: Eric S. Raymond <esr@snark.thyrsus.com> 1 Nov 1995
+# (The <blink>/<bold>/<rev>/<smacs>/<smul>/<smso> capabilities exist only to
+# tell ncurses that the corresponding highlights exist; it should use <sgr>,
+# which is the only method that will actually work for multiple highlights.)
+#
+# Update by TD - 2004: half of this was inconsistent.  Found documentation
+# and repaired most of the damage.  sgr0 is probably incorrect, but the
+# available documentation gives no clues for a workable string.
+avatar0|avatar terminal emulator level 0,
+	am, bce, msgr,
+	cols#80, it#8, lines#25,
+	blink=^V^B, bold=^V^A^P, cr=\r, cub1=^V^E, cud1=^V^D,
+	cuf1=^V^F, cup=\026\010%p1%c%p2%c, cuu1=^V^C, el=^V^G,
+	ind=\n, invis=^V^A\0, rep=\031%p1%c%p2%c, rev=^V^Ap,
+	rmacs@, rs2=^L,
+	sgr=%?%p1%p2%|%p3%|%p6%|%p7%|%t\026\001%?%p7%t%{128}%e%{0}%?
+	    %p1%t%{112}%|%;%?%p2%t%{1}%|%;%?%p3%t%{112}%|%;%?%p6%t
+	    %{16}%|%;%;%c%;%?%p4%t\026\002%;,
+	sgr0=^V^A^G, smacs@, smso=^V^Ap, smul=^V^A^A,
+	use=klone+acs,
+# From: Eric S. Raymond <esr@snark.thyrsus.com> 1 Nov 1995
+avatar0+|avatar terminal emulator level 0+,
+	dch1=^V^N, rmir=\026\n\0\0\0\0, smir=^V^I, use=avatar0,
+# From: Eric S. Raymond <esr@snark.thyrsus.com> 1 Nov 1995
+avatar|avatar1|avatar terminal emulator level 1,
+	civis=^V'^B, cnorm=^V'^A, cvvis=^V^C, dl1=^V-, il1=^V+,
+	rmam=^V", rmir=^V^P, smam=^V$, use=avatar0+,
+
+#### RBcomm
+#
+# RBComm is a lean and mean terminal emulator written by the Interrupt List
+# maintainer, Ralf Brown. It was fairly popular in the late DOS years (early
+# '90s), especially in the BBS world, and still has some loyal users due to
+# its very small memory footprint and to a cute macro language.
+rbcomm|IBM PC with RBcomm and EMACS keybindings,
+	am, bw, mir, msgr, xenl,
+	cols#80, it#8, lines#25,
+	bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, clear=^L, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub1=^H, cud1=^C, cuf1=^B,
+	cup=\037%p2%{32}%+%c%p1%{32}%+%c, cuu1=^^, dch1=^W,
+	dl=\E[%p1%dM, dl1=^Z, ech=\E[%p1%dX, ed=^F5, el=^P^P, ht=^I,
+	il=\E[%p1%dL, il1=^K, ind=\ED, invis=\E[8m,
+	is2=\017\035\E(B\E)0\E[?7h\E[?3l\E[>8g, kbs=^H,
+	kcub1=^B, kcud1=^N, kcuf1=^F, kcuu1=^P, khome=^A, nel=\r\ED,
+	rc=\E8, rep=\030%p1%c%p2%c, rev=^R, ri=\EM, rmcup=, rmdc=,
+	rmir=^], rmkx=\E>, rmso=^U, rmul=^U,
+	rs1=\017\E(B\E)0\025\E[?3l\E[>8g, sc=\E7, sgr0=\E[m,
+	smcup=, smdc=, smir=^\, smkx=\E=, smso=^R, smul=^T,
+	use=vt220+cvis,
+rbcomm-nam|IBM PC with RBcomm without autowrap,
+	am@,
+	bel=^G, cr=\r, cud1=\n, ht=^I, ind=\n,
+	is2=\017\035\E(B\E)0\E[?7l\E[?3l\E[>8g, kbs=^H,
+	kcub1=^H, kcud1=\n, nel=\r\n, use=rbcomm,
+rbcomm-w|IBM PC with RBcomm in 132 column mode,
+	cols#132,
+	bel=^G, cr=\r, cud1=\n, ht=^I, ind=\n,
+	is2=\017\035\E(B\E)0\E[?7h\E[?3h\E[>8g, kbs=^H,
+	kcub1=^H, kcud1=\n, nel=\r\n, use=rbcomm,
+
+######## LCD DISPLAYS
+#
+
+#### Matrix Orbital
+# from: Eric Z. Ayers  (eric@ale.org)
+#
+# Matrix Orbital 20x4 LCD display
+# Command Character is 0xFE (decimal 254, octal 376)
+#
+# On this device, cursor addressability isn't possible.  The LCD expects:
+#      0xfe G <col> <row>
+#      for cup: %p1 == row and %p2 is column
+#
+# This line:
+#	cup=\376G%p2%c%p1%c
+# LOOKS like it will work, but sometimes only one of the two numbers is sent.
+# See the terminfo (5) manpage commented regarding 'Terminals which use "%c"'.
+#
+# Alas, there is no cursor upline capability on this display.
+#
+# These entries add some 'sanity stuff' to the clear function.  That is, it
+# does a 'clear' and also turns OFF auto scroll, turns ON Auto Line Wrapping,
+# and turns off the cursor blinking and stuff like that.
+#
+# NOTE: calling 'beep' turns on the backlight (bell)
+# NOTE: calling 'flash' turns it on and back off (visual bell)
+#
+MtxOrb|generic Matrix Orbital LCD display,
+	bel=\376B\001, clear=\376X\376C\376R\376K\376T,
+	cnorm=\376K\376T, cub1=\376L, cuf1=\376M,
+	flash=\376B\001$<200>\376F, home=\376H,
+MtxOrb204|20x4 Matrix Orbital LCD display,
+	cols#20, lines#4, use=MtxOrb,
+MtxOrb162|16x2 Matrix Orbital LCD display,
+	cols#16, lines#2, use=MtxOrb,
+# The end
+
+######## OLDER TERMINAL TYPES
+#
+# This section is devoted to older commercial terminal brands that are now
+# discontinued, but known to be still in use or represented by emulations.
+#
+
+#### AT&T (att, tty)
+#
+# This section also includes Teletype-branded VDTs.
+#
+# The AT&T/Teletype terminals group was sold to SunRiver Data Systems (now
+# Boundless Technologies); for details, see the header comment on the ADDS
+# section.
+#
+# These are AT&T's official terminfo entries.  All-caps aliases have been
+# removed.
+#
+att2300|sv80|AT&T 2300 Video Information Terminal 80 column mode,
+	am, eo, mir, msgr, xon,
+	cols#80, it#8, lines#24,
+	bel=^G, clear=\E[H\E[J, cr=\r, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M, ed=\E[J,
+	el=\E[K, el1=\E[1K, home=\E[H, ht=^I, ich=\E[%p1%d@,
+	il=\E[%p1%dL, il1=\E[L, ind=\n, kbs=^H, kcbt=\E[Z, kclr=\E[J,
+	kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kdch1=\E[P,
+	kdl1=\E[M, kf1=\E[1r, kf10=\E[10r, kf11=\E[11r,
+	kf12=\E[12r, kf13=\E[13r, kf14=\E[14r, kf15=\E[15r,
+	kf16=\E[16r, kf2=\E[2r, kf3=\E[3r, kf4=\E[4r, kf5=\E[5r,
+	kf6=\E[6r, kf7=\E[7r, kf8=\E[8r, kf9=\E[9r, khome=\E[H,
+	kich1=\E[@, kil1=\E[L, mc0=\E[0i, mc4=\E[4i, mc5=\E[5i,
+	rev=\E[7m, rmir=\E[4l, rmso=\E[m, sgr0=\E[m, smir=\E[4h,
+	smso=\E[7m, use=ansi+cpr,
+att2350|AT&T 2350 Video Information Terminal 80 column mode,
+	mc0@, mc4@, mc5@, use=att2300,
+
+# Must setup RETURN KEY - CR, REC'VD LF - INDEX.
+# Seems upward compatible with VT100, plus ins/del line/char.
+# On sgr, the protection parameter is ignored.
+# No check is made to make sure that only 3 parameters are output.
+#	standout= reverse + half-intensity = 3 | 5.
+#	bold= reverse + underline = 2 | 3.
+# note that half-bright blinking doesn't look different from normal blinking.
+# NOTE:you must program the function keys first, label second!
+# (att4410: a BSD entry has been seen with the following capabilities:
+# <is2=\E[?6l>, <kf1=\EOc>, <kf2=\EOd>, <kf3=\EOe>, <kf4=\EOg>,
+# <kf6=\EOh>, <kf7=\EOi>, <kf8=\EOj>, -- esr)
+att5410v1|att4410v1|tty5410v1|AT&T 4410/5410 80 columns - version 1,
+	am, hs, mir, msgr, xon,
+	cols#80, it#8, lh#2, lines#24, lw#8, nlab#8, wsl#80,
+	acsc=++\,\,--..00``aaffgghhjjkkllmmnnooppqqrrssttuuvvwwxxyyz
+	     z{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[2;7m, clear=\E[H\E[J, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub1=^H, cud1=\E[B, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, dch1=\E[P, dim=\E[2m,
+	dl1=\E[M, ed=\E[J, el=\E[K, fsl=\E8, home=\E[H, ht=^I,
+	ich1=\E[@, il1=\E[L, ind=\n, invis=\E[8m, is1=\E[?3l\E)0,
+	is3=\E[1;03q\s\s\sf1\s\s\s\s\s\s\s\s\s\s\s\EOP\E[2;03q\s\s
+	    \sf2\s\s\s\s\s\s\s\s\s\s\s\EOQ\E[3;03q\s\s\sf3\s\s\s\s
+	    \s\s\s\s\s\s\s\EOR\E[4;03q\s\s\sf4\s\s\s\s\s\s\s\s\s\s
+	    \s\EOS\E[5;03q\s\s\sf5\s\s\s\s\s\s\s\s\s\s\s\EOT\E[6;03q
+	    \s\s\sf6\s\s\s\s\s\s\s\s\s\s\s\EOU\E[7;03q\s\s\sf7\s\s
+	    \s\s\s\s\s\s\s\s\s\EOV\E[8;03q\s\s\sf8\s\s\s\s\s\s\s\s
+	    \s\s\s\EOW,
+	kbs=^H, kclr=\E[2J, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C,
+	kcuu1=\E[A, kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf5=\EOT,
+	kf6=\EOU, kf7=\EOV, kf8=\EOW, khome=\E[H, kll=\E[24;1H,
+	ll=\E[24H, nel=\r\n,
+	pfx=\E[%p1%1d;%p2%l%2.2dq\s\s\sf%p1%1d\s\s\s\s\s\s\s\s\s\s
+	    \s%p2%s,
+	pln=\E[%p1%d;00q%p2%:-16s, rc=\E8, rev=\E[7m, ri=\EM,
+	rmacs=^O, rmso=\E[m, rmul=\E[m, rs2=\Ec\E[?3l\E[2;0y,
+	sc=\E7,
+	sgr=\E[0%?%p1%p5%|%p6%|%t;2%;%?%p2%t;4%;%?%p4%t;5%;%?%p3%p1
+	    %|%p6%|%t;7%;%?%p7%t;8%;m%?%p9%t\016%e\017%;,
+	sgr0=\E[m\017, smacs=^N, smso=\E[7m, smul=\E[4m,
+	tsl=\E7\E[25;%p1%{1}%+%dH,
+
+att4410v1-w|att5410v1-w|tty5410v1-w|AT&T 4410/5410 132 columns - version 1,
+	cols#132, wsl#132,
+	is1=\E[?3h\E)0, rs2=\Ec\E[?3h\E[2;0y, use=att5410v1,
+
+att4410|att5410|tty5410|AT&T 4410/5410 80 columns - version 2,
+	OTbs,
+	pfx=\E[%p1%d;%p2%l%02dq   f%p1%d           %p2%s,
+	use=att5410v1,
+
+att5410-w|att4410-w|4410-w|tty5410-w|5410-w|AT&T 4410/5410 in 132 column mode,
+	cols#132, wsl#132,
+	is1=\E[?3h\E)0, rs2=\Ec\E[?3h\E[2;0y, use=att4410,
+
+# 5410 in terms of a VT100
+# (v5410: added <rmam>/<smam> based on init string -- esr)
+v5410|att5410 in terms of a VT100,
+	am, mir, msgr, xon,
+	cols#80, it#8, lines#24, vt#3,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\E[5m$<2>, bold=\E[1m$<2>,
+	clear=\E[H\E[J$<50>, cr=\r, csr=\E[%i%p1%d;%p2%dr,
+	cub1=^H, cud1=\n, cuf1=\E[C$<2>,
+	cup=\E[%i%p1%d;%p2%dH$<5>, cuu1=\E[A$<2>, dch1=\E[P,
+	dl1=\E[M, ed=\E[J$<50>, el=\E[K$<3>, el1=\E[1K$<3>,
+	enacs=\E(B\E)0, home=\E[H, ht=^I, hts=\EH, ich1=\E[@,
+	il1=\E[L, ind=\n, kbs=^H, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC,
+	kcuu1=\EOA, rc=\E8, rev=\E[7m$<2>, ri=\EM$<5>, rmacs=^O,
+	rmam=\E[?7l, rmkx=\E[?1l\E>, rmso=\E[m$<2>,
+	rmul=\E[m$<2>, rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h,
+	sc=\E7,
+	sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5
+	    %;m%?%p9%t\016%e\017%;$<2>,
+	sgr0=\E[m\017$<2>, smacs=^N, smam=\E[?7h, smkx=\E[?1h\E=,
+	smso=\E[1;7m$<2>, smul=\E[4m$<2>, tbc=\E[3g,
+	use=decid+cpr, use=vt100+fnkeys,
+
+#
+# Teletype Model 5420 -- A souped up 5410, with multiple windows,
+# even! the 5420 has three modes: scroll, window or page mode
+# this terminfo should work in scroll or window mode, but doesn't
+# take advantage of any of the differences between them.
+#
+# Has memory below (2 lines!)
+# 3 pages of memory (plus some spare)
+# The 5410 sequences for <cup>, <cvvis>, <dch>, <dl>, <ech>, <flash>, <home>,
+# <hpa>, <hts> would work for these, but these work in both scroll and window
+# mode... Unset insert character so insert mode works
+# <is1> sets 80 column mode,
+# <is2> escape sequence:
+# 1) turn off all fonts
+# 2) function keys off, keyboard lock off, control display off,
+#    insert mode off, erasure mode off,
+# 3) full duplex, monitor mode off, send graphics off, nl on lf off
+# 4) reset origin mode
+# 5) set line wraparound
+# 6) exit erasure mode, positional attribute mode, and erasure extent mode
+# 7) clear margins
+# 8) program ENTER to transmit ^J,
+# We use \212 to program the ^J because a bare ^J will get translated by
+# UNIX into a CR/LF. The enter key is needed for AT&T uOMS.
+#     1      2            3              4     5     6    7  8
+# <is3> set screen color to black,
+# No representation in terminfo for the delete word key: kdw1=\Ed
+# Key capabilities assume the power-up send sequence...
+# This <rmcup> is not strictly necessary, but it helps maximize
+# memory usefulness: <rmcup=\Ez>,
+# Alternate sgr0:	<sgr0=\E[m\EW^O>,
+# Alternate sgr:	<sgr=\E[%?%p1%t2;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5%t;2%;%?%p7%t;8%;m%?%p8%t\EV%;%?%p9%t^N%e^O%;>,
+# smkx programs the SYS PF keys to send a set sequence.
+# It also sets up labels f1, f2, ..., f8, and sends edit keys.
+# This string causes them to send the strings <kf1>-<kf8>
+# when pressed in SYS PF mode.
+# (att4415: I added <rmam>/<smam> based on the init string -- esr)
+att4415|tty5420|att5420|AT&T 4415/5420 80 cols,
+	OTbs, db, mir, xon,
+	lh#2, lm#78, lw#8, nlab#8, wsl#55,
+	cbt=\E[Z, clear=\E[x\E[J, cnorm=\E[11;0j, cub=\E[%p1%dD,
+	cud=\E[%p1%dB, cuf=\E[%p1%dC, cup=\E[%i%p1%d;%p2%dx,
+	cuu=\E[%p1%dA, cvvis=\E[11;1j, dch=\E[%p1%dP,
+	dl=\E[%p1%dM, ech=\E[%p1%ds\E[%p1%dD,
+	flash=\E[?5h$<200>\E[?5l, home=\E[x,
+	hpa=\E[%p1%{1}%+%dG, hts=\EH, ich=\E[%p1%d@, ich1@,
+	il=\E[%p1%dL, indn=\E[%p1%dE, is1=\E[?3l$<100>,
+	is2=\E[m\017\E[1;2;3;4;6l\E[12;13;14;20l\E[?6;97;99l\E[?7h
+	    \E[4i\Ex\E[21;1j\212,
+	is3=\E[?5l, kbeg=\Et, kcbt=\E[Z, kdch1=\E[P, kdl1=\E[M,
+	kel=\E[2K, kend=\Ez, kent=\Eent, kf1=\EOc, kf2=\EOd,
+	kf3=\EOe, kf4=\EOf, kf5=\EOg, kf6=\EOh, kf7=\EOi, kf8=\EOj,
+	kich1=\E[4h, kil1=\E[L, kind=\E[T, kll=\Eu, knp=\E[U,
+	kpp=\E[V, kri=\E[S, lf1=F1, lf2=F2, lf3=F3, lf4=F4, lf5=F5,
+	lf6=F6, lf7=F7, lf8=F8, ll=\Ew, mc0=\E[?2i, mc4=\E[?9i,
+	mc5=\E[?4i, mrcup=\E[%i%p1%d;%p2%dt,
+	pfx=\E[%p1%d;%p2%l%02dq   F%p1%d           %p2%s,
+	pln=\E[%p1%d;0;0;0q%p2%:-16.16s, prot=\EV,
+	rin=\E[%p1%dF, rmam=\E[?7l, rmir=\E[4l,
+	rmkx=\E[19;0j\E[21;1j\212, rmln=\E|,
+	sgr=\E[0%?%p1%p5%|%p6%|%t;2%;%?%p2%t;4%;%?%p4%t;5%;%?%p3%p1
+	    %|%p6%|%t;7%;%?%p7%t;8%;m%?%p8%t\EV%;%?%p9%t\016%e\017%;,
+	sgr0=\E[m\017, smam=\E[?7h, smir=\E[4h,
+	smkx=\E[19;1j\E[21;4j\Eent, smln=\E~, tbc=\E[3g,
+	tsl=\E7\E[25;%p1%{8}%+%dH, vpa=\E[%p1%{1}%+%dd,
+	use=att4410,
+
+att4415-w|tty5420-w|att5420-w|AT&T 4415/5420 132 cols,
+	cols#132, lm#54, wsl#97,
+	is1=\E[?3h$<100>, use=att4415,
+
+att4415-rv|tty5420-rv|att5420-rv|AT&T 4415/5420 80 cols/rv,
+	flash=\E[?5l$<200>\E[?5h, is3=\E[?5h, use=att4415,
+
+att4415-w-rv|tty5420-w-rv|att5420-w-rv|AT&T 4415/5420 132 cols/rv,
+	cols#132, lm#54, wsl#97,
+	flash=\E[?5l$<200>\E[?5h, is1=\E[?3h$<100>, is3=\E[?5h,
+	use=att4415,
+
+# Note that this mode permits programming USER PF KEYS and labels
+# However, when you program user pf labels you have to reselect
+# user pf keys to make them appear!
+att4415+nl|tty5420+nl|att5420+nl|generic AT&T 4415/5420 changes for not changing labels,
+	kf1@, kf2@, kf3@, kf4@, kf5@, kf6@, kf7@, kf8@,
+	pfx=\E[%p1%d;%p2%l%02d;0;1q\s\s\sF%p1%d\s\s\s\s\s\s\s\s\s\s
+	    \s%p2%s,
+	pln=\E[%p1%d;0;0;1q%p2%:-16.16s,
+
+att4415-nl|tty5420-nl|att5420-nl|AT&T 4415/5420 without changing labels,
+	kf1@, kf2@, kf3@, kf4@, kf5@, kf6@, kf7@, kf8@, use=att4415+nl,
+	use=att4415,
+
+att4415-rv-nl|tty5420-rv-nl|att5420-rv-nl|AT&T 4415/5420 reverse video without changing labels,
+	kf1@, kf2@, kf3@, kf4@, kf5@, kf6@, kf7@, kf8@, use=att4415+nl,
+	use=att4415-rv,
+
+att4415-w-nl|tty5420-w-nl|att5420-w-nl|AT&T 4415/5420 132 cols without changing labels,
+	kf1@, kf2@, kf3@, kf4@, kf5@, kf6@, kf7@, kf8@, use=att4415+nl,
+	use=att4415-w,
+
+att4415-w-rv-n|tty5420-w-rv-n|att5420-w-rv-n|AT&T 4415/5420 132 cols reverse without changing labels,
+	kf1@, kf2@, kf3@, kf4@, kf5@, kf6@, kf7@, kf8@, use=att4415+nl,
+	use=att4415-w-rv,
+
+att5420_2|AT&T 5420 model 2 80 cols,
+	am, db, hs, mir, msgr, xon,
+	cols#80, it#8, lh#2, lines#24, lm#78, lw#8, nlab#8, wsl#55,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	blink=\E[5m, cbt=\E[1Z, clear=\EH\EJ, cnorm=\E[11;0j,
+	cr=\EG, csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\E[1B, cuf=\E[%p1%dC, cuf1=\E[1C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[1A,
+	cvvis=\E[11;1j, dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m,
+	dl=\E[%p1%dM, dl1=\E[M, ech=\E[%p1%ds\E[%p1%dD, ed=\E[0J,
+	el=\E[0K, el1=\E[1K, flash=\E[?5h$<200>\E[?5l, fsl=\E8,
+	home=\E[H, hpa=\E[%p1%{1}%+%dG, ht=^I, hts=\EH,
+	ich=\E[%p1%d@, ich1=\E[@, il=\E[%p1%dL, il1=\E[L, ind=\n,
+	indn=\E[%p1%dE, invis=\E[8m,
+	is1=\E[0;23r\Ex\Ey\E[2;0j\E[3;3j\E[4;0j\E[5;0j\E[6;0j\E[7;0j
+	    \E[8;0j\E[9;1j\E[10;0j\E[15;0j\E[16;1j\E[19;0j\E[20;1j
+	    \E[29;0j\E[1;24r,
+	kbeg=\Et, kbs=^H, kcbt=\E[Z, kclr=\E[2J, kcub1=\E[D,
+	kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kdch1=\E[P, kdl1=\E[M,
+	kel=\E[2K, kend=\Ez, kent=\n, kf1=\EOc, kf2=\EOd, kf3=\EOe,
+	kf4=\EOf, kf5=\EOg, kf6=\EOh, kf7=\EOi, kf8=\EOj, khome=\E[H,
+	kich1=\E[4h, kil1=\E[L, kind=\E[T, kll=\Eu, knp=\E[U,
+	kpp=\E[V, kri=\E[S, lf1=F1, lf2=F2, lf3=F3, lf4=F4, lf5=F5,
+	lf6=F6, lf7=F7, lf8=F8, ll=\Ew, mc0=\E[?;2i, mc4=\E[4i,
+	mc5=\E[5i, mrcup=\E[%i%p1%d;%p2%dt, nel=\r\n,
+	pfx=\E[%p1%d;%p2%l%02dq\s\s\sF%p1%d\s\s\s\s\s\s\s\s\s\s\s%p2
+	    %s\E~,
+	pln=\E[%p1%d;0;0;0q%p2%:-16.16s\E~, prot=\EV, rc=\E8,
+	rev=\E[7m, ri=\EM, rin=\E[%p1%dF, rmacs=^O, rmkx=\E[19;0j,
+	rmln=\E|, rmso=\E[m, rmul=\E[m, rs2=\Ec\E[?3l\E[2;0y,
+	sc=\E7,
+	sgr=\E[0%?%p1%p5%|%t;2%;%?%p2%p6%|%t;4%;%?%p4%t;5%;%?%p3%p1
+	    %|%p6%|%t;7%;%?%p7%t;8%;m%?%p9%t\016%e\017%;%?%p8%t\EV%;,
+	sgr0=\E[m\017, smacs=^N, smkx=\E[19;1j, smln=\E~,
+	smso=\E[7m, smul=\E[4m, tbc=\E[3g,
+	tsl=\E7\E[25;%p1%{8}%+%dH, vpa=\E[%p1%{1}%+%dd,
+	use=decid+cpr,
+att5420_2-w|AT&T 5420 model 2 in 132 column mode,
+	cols#132,
+	is1=\E[0;23r\Ex\Ey\E[2;0j\E[3;3j\E[4;0j\E[5;1j\E[6;0j\E[7;0j
+	    \E[8;0j\E[9;1j\E[10;0j\E[15;0j\E[16;1j\E[19;0j\E[20;1j
+	    \E[29;0j\E[1;24r,
+	use=att5420_2,
+
+att4418|att5418|AT&T 5418 80 cols,
+	am, xon,
+	cols#80, lines#24,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\E[5m, clear=\E[H\E[2J, cr=\r, cub=\E[%p1%dD,
+	cub1=\E[D, cud=\E[%p1%dB, cud1=\E[B, cuf=\E[%p1%dC,
+	cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA,
+	cuu1=\E[A, dch=\E[%p1%dP, dch1=\E[1P, dim=\E[2m,
+	dl=\E[%p1%dM, dl1=\E[M, ed=\E[0J, el=\E[0K, home=\E[H,
+	ich=\E[%p1%d@, ich1=\E[1@, il=\E[%p1%dL, il1=\E[1L, ind=\n,
+	is1=\E[?3l, is2=\E)0\E?6l\E?5l, kclr=\E[%%, kcub1=\E@,
+	kcud1=\EU, kcuf1=\EA, kcuu1=\ES, kent=\E[, kf1=\E[h,
+	kf10=\E[m, kf11=\E[n, kf12=\E[o, kf13=\E[H, kf14=\E[I,
+	kf15=\E[J, kf18=\E[K, kf19=\E[L, kf2=\E[i, kf20=\E[E,
+	kf21=\E[_, kf22=\E[M, kf23=\E[N, kf24=\E[O, kf3=\E[j,
+	kf6=\E[k, kf7=\E[l, kf8=\E[f, kf9=\E[w, khome=\Ec, rc=\E8,
+	rev=\E[7m, rmacs=^O, rmso=\E[m, rmul=\E[m, sc=\E7,
+	sgr0=\E[m\017, smacs=^N, smso=\E[7m, smul=\E[4m,
+att4418-w|att5418-w|AT&T 5418 132 cols,
+	cols#132,
+	is1=\E[?3h, use=att5418,
+
+att4420|tty4420|Teletype 4420,
+	OTbs, da, db, eo, msgr, ul, xon,
+	cols#80, lines#24, lm#72,
+	bel=^G, clear=\EH\EJ, cr=\EG, cub1=\ED, cud1=\EB, cuf1=\EC,
+	cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, dch1=\EP,
+	dl1=\EM, ed=\EJ, el=\Ez, home=\EH, il1=\EL, ind=\EH\EM\EY7\s,
+	kcbt=\EO, kclr=\EJ, kcub1=^H, kcud1=\EB, kcuf1=\EC,
+	kcuu1=\EA, kdch1=\EP, kdl1=\EM, kf0=\EU, kf3=\E@, khome=\EH,
+	kich1=\E\^, kil1=\EL, kind=\ES, kri=\ET,
+	lf0=segment advance, lf3=cursor tab, rmdc@, rmso=\E~,
+	rmul=\EZ, smdc@, smso=\E}, smul=\E\\,
+
+#  The following is a terminfo entry for the Teletype 4424
+#  asynchronous keyboard-display terminal.  It supports
+#  the vi editor.  The terminal must be set up as follows,
+#
+#	HIGHLIGHT DEFINITION	3-TONE
+#	DISPLAY FUNCTION	GROUP III
+#
+#  The second entry below provides limited (a la adm3a)
+#  operation under GROUP II.
+#
+#  This must be used with DISPLAY FUNCTION GROUP I or III
+#	and HIGHLIGHT DEFINITION 3-TONE
+# The terminal has either bold or blink, depending on options
+#
+# (att4424: commented out <smcup>=\E[1m, we don't need bright locked on -- esr)
+att4424|tty4424|Teletype 4424,
+	OTbs, am, xon,
+	cols#80, lines#24,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\E3, bold=\E3, cbt=\EO, clear=\E[H\E[2J, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\EB, cuf=\E[%p1%dC, cuf1=\EC,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\EA,
+	dch=\E[%p1%dP, dch1=\EP, dim=\EW, dl=\E[%p1%dM, dl1=\EM,
+	ed=\EJ, el=\Ez, home=\E[H, ht=^I, hts=\EH, ich=\E[%p1%d@,
+	ich1=\E\^, il=\E[%p1%dL, il1=\EL, ind=\n, is2=\E[20l\E[?7h,
+	kbs=^H, kclr=\EJ, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C,
+	kcuu1=\E[A, kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS,
+	khome=\E[H, nel=\EE, rev=\E}, ri=\ET, rmacs=\E(B, rmso=\E~,
+	rmul=\EZ,
+	sgr=\EX\E~\EZ\E4\E(B%?%p1%p3%|%t\E}%;%?%p2%t\E\\%;%?%p4%p6%|
+	    %t\E3%;%?%p5%t\EW%;%?%p9%t\E(0%;,
+	sgr0=\EX\E~\EZ\E4\E(B, smacs=\E(0, smso=\E}, smul=\E\\,
+	tbc=\EF,
+
+att4424-1|tty4424-1|Teletype 4424 in display function group I,
+	kclr@, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, khome@,
+	use=att4424,
+
+# This entry is not one of AT&T's official ones, it was translated from the
+# 4.4BSD termcap file.  The highlight strings are different from att4424.
+# I have no idea why this is -- older firmware version, maybe?
+# The following two lines are the comment originally attached to the entry:
+# This entry appears to avoid the top line - I have no idea why.
+# From: jwb Wed Mar 31 13:25:09 1982 remote from ihuxp
+att4424m|tty4424m|Teletype 4424M,
+	am, da, db, mir,
+	cols#80, it#8, lines#23,
+	bel=^G, clear=\E[2;H\E[J, cr=\r, cub1=^H, cud1=\n, cuf1=\E[C,
+	cup=\E[%i%p1%2d;%p2%2dH\E[B, cuu1=\E[A, dch1=\EP,
+	dl1=\EM, el=\E[K, ht=^I, ich1=\E\^, il1=\EL, ind=\n, ip=$<2/>,
+	is2=\E[m\E[2;24r, kbs=^H, kcub1=\E[D, kcud1=\E[B,
+	kcuf1=\E[C, kcuu1=\E[A, kf1=\EOP, kf2=\EOQ, kf3=\EOR,
+	kf4=\EOS, khome=\E[H, nel=\r\n, ri=\ET, rmso=\E[m, rmul=\E[m,
+	sgr0=\E[m, smso=\E[7m, smul=\E[4m,
+
+# The Teletype 5425 is really version 2 of the Teletype 5420. It
+# is quite similar, except for some minor differences. No page
+# mode, for example, so all of the <cup> sequences used above have
+# to change back to what's being used for the 5410. Many of the
+# option settings have changed their numbering as well.
+#
+# This has been tested on a preliminary model.
+#
+# (att5425: added <rmam>/<smam> based on the init string -- esr)
+att5425|tty5425|att4425|AT&T 4425/5425,
+	am, da, db, hs, mir, msgr, xenl, xon,
+	cols#80, it#8, lh#2, lines#24, lm#78, lw#8, nlab#8, wsl#55,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[2;7m, cbt=\E[Z,
+	clear=\E[H\E[J, cnorm=\E[12;0j, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	cvvis=\E[12;1j, dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m,
+	dl=\E[%p1%dM, dl1=\E[M, ech=\E[%p1%ds\E[%p1%dD, ed=\E[J,
+	el=\E[K, el1=\E[1K, enacs=\E(B\E)0,
+	flash=\E[?5h$<200>\E[?5l, fsl=\E8, home=\E[H,
+	hpa=\E[%p1%{1}%+%dG, ht=^I, hts=\EH, ich=\E[%p1%d@,
+	il=\E[%p1%dL, il1=\E[L, ind=\n, indn=\E[%p1%dE,
+	invis=\E[8m, is1=\E<\E[?3l$<100>,
+	is2=\E[m\017\E[1;2;3;4;6l\E[12;13;14;20l\E[?6;97;99l\E[?7h
+	    \E[4i\Ex\E[25;1j\212,
+	is3=\E[?5l, kbeg=\Et, kbs=^H, kcbt=\E[Z, kclr=\E[J,
+	kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kdch1=\E[P,
+	kdl1=\E[M, kel=\E[2K, kend=\Ez, kent=\Eent, kf1=\EOc,
+	kf2=\EOd, kf3=\EOe, kf4=\EOf, kf5=\EOg, kf6=\EOh, kf7=\EOi,
+	kf8=\EOj, khome=\E[H, kich1=\E[4h, kil1=\E[L, kind=\E[T,
+	kri=\E[S, ll=\E[24H, mc0=\E[?2i, mc4=\E[?9i, mc5=\E[?4i,
+	nel=\r\n,
+	pfx=\E[%p1%d;%p2%l%02dq   F%p1%1d           %p2%s,
+	pln=\E[%p1%d;0;0;0q%p2%:-16.16s, prot=\EV, rc=\E8,
+	rev=\E[7m, ri=\EM, rin=\E[%p1%dF, rmacs=^O, rmam=\E[?7l,
+	rmir=\E[4l, rmkx=\E[21;0j\E[25;1j\212, rmln=\E|,
+	rmso=\E[m, rmul=\E[m, rs2=\Ec\E[?3l\E[2;0y, sc=\E7,
+	sgr=\E[0%?%p5%p6%|%t;2%;%?%p2%t;4%;%?%p4%t;5%;%?%p3%p1%|%p6
+	    %|%t;7%;%?%p7%t;8%;m%?%p8%t\EV%;%?%p9%t\016%e\017%;,
+	sgr0=\E[m\017, smacs=^N, smam=\E[?7h, smir=\E[4h,
+	smkx=\E[21;1j\E[25;4j\Eent\E~, smln=\E~, smso=\E[7m,
+	smul=\E[4m, tbc=\E[3g, tsl=\E7\E[25;%p1%{8}%+%dH,
+	vpa=\E[%p1%{1}%+%dd, use=decid+cpr,
+
+att5425-nl|tty5425-nl|att4425-nl|AT&T 4425/5425 80 columns no labels,
+	smkx=\E[21;1j\E[25;4j\Eent, use=att4425,
+
+att5425-w|att4425-w|tty5425-w|Teletype 4425/5425 in 132 column mode,
+	cols#132, lm#54, wsl#97,
+	is1=\E[?3h$<100>, use=tty5425,
+
+# (att4426: his had bogus capabilities: :ri=\EM:, :ri=\E[1U:.
+# I also added <rmam>/<smam> -- esr)
+att4426|tty4426|Teletype 4426S,
+	am, da, db, xon,
+	cols#80, lines#24, lm#48,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, bold=\E[5m, clear=\E[H\E[2J\E[1U\E[H\E[2J\E[1V,
+	cr=\r, cub=\E[%p1%dD, cub1=\E[D, cud=\E[%p1%dB, cud1=\E[B,
+	cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH,
+	cuu=\E[%p1%dA, cuu1=\E[A, dch=\E[%p1%dP, dch1=\EP,
+	dl=\E[%p1%dM, dl1=\E[M, ed=\E[J, el=\E[0K, home=\E[H,
+	hpa=\E[%p1%dG, ht=^I, hts=\E1, ich=\E[%p1%d@, ich1=\E\^,
+	il=\E[%p1%dL, il1=\EL, ind=\n, is1=\Ec\E[?7h,
+	is2=\E[m\E[1;24r, kbs=^H, kcbt=\EO, kclr=\E[2J, kcub1=\ED,
+	kcud1=\EB, kcuf1=\EC, kcuu1=\EA, kf1=\EOP, kf2=\EOQ,
+	kf3=\EOR, kf4=\EOS, kf5=\EOT, kf6=\EOU, kf7=\EOV, kf8=\EOW,
+	khome=\E[H, kll=\E[24;1H, ll=\E[24H, nel=\r\n, rc=\E8,
+	rev=\E[7m, ri=\ET, rmacs=\E(B, rmam=\E[?7l, rmso=\E[m,
+	rmul=\E[m, rs2=\Ec\E[?3l\E[2;0y, sc=\E7, sgr0=\E[m\E(B,
+	smacs=\E(0, smam=\E[?7h, smso=\E[5m, smul=\E[4m, tbc=\E[3g,
+	vpa=\E[%p1%dd, use=ecma+index,
+
+# Terminfo entry for the AT&T 510 A Personal Terminal
+# Function keys 9 - 16 are available only after the
+# screen labeled (soft keys/action blocks) are labeled.  Function key
+# 9 corresponds to the leftmost touch target on the screen,
+# function key 16 corresponds to the rightmost.
+#
+# This entry is based on one done by Ernie Rice at Summit, NJ and
+# changed by Anne Gallup, Skokie, IL, ttrdc!anne
+att510a|bct510a|AT&T 510A Personal Terminal,
+	am, mir, msgr, xenl, xon,
+	cols#80, lh#2, lines#24, lw#7, nlab#8,
+	acsc=+g\,h-f.e`bhrisjjkkllmmnnqqttuuvvwwxx{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[2;7m, cbt=\E[Z,
+	civis=\E[11;0|, clear=\E[H\E[J, cnorm=\E[11;3|, cr=\r,
+	cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=\E[B,
+	cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH,
+	cuu=\E[%p1%dA, cuu1=\E[A, cvvis=\E[11;2|, dch=\E[%p1%dP,
+	dch1=\E[P, dim=\E[2m, dl=\E[%p1%dM, dl1=\E[M, ed=\E[0J,
+	el=\E[0K, el1=\E[1K, enacs=\E(B\E)1, ff=^L, home=\E[H, ht=^I,
+	hts=\EH, il=\E[%p1%dL, il1=\E[L, ind=\n, is1=\E(B\E)1\E[2l,
+	is3=\E[21;1|\212, kLFT=\E[u, kRIT=\E[v, kbs=^H, kcbt=\E[Z,
+	kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kf1=\EOm,
+	kf10=\EOd, kf11=\EOe, kf12=\EOf, kf13=\EOg, kf14=\EOh,
+	kf15=\EOi, kf16=\EOj, kf2=\EOV, kf3=\EOu, kf4=\ENj, kf5=\ENe,
+	kf6=\ENf, kf7=\ENh, kf8=\E[H, kf9=\EOc, kind=\E[S, kri=\E[T,
+	mc0=\E[0i, mc4=\E[?8i, mc5=\E[?4i, nel=\EE,
+	pln=\E[%p1%dp%p2%:-16s, rc=\E8, rev=\E[7m, ri=\EM,
+	rmacs=^O, rmkx=\E[19;0|, rmso=\E[m, rmul=\E[m, sc=\E7,
+	sgr=\E[0%?%p5%p6%|%t;2%;%?%p2%t;4%;%?%p4%t;5%;%?%p3%p1%|%p6
+	    %|%t;7%;m%?%p9%t\016%e\017%;,
+	sgr0=\E[m\017, smacs=^N, smkx=\E[19;1|, smso=\E[7m,
+	smul=\E[4m, tbc=\E[3g, use=ansi+cpr,
+
+# Terminfo entry for the AT&T 510 D Personal Terminal
+# Function keys 9 through 16 are accessed by bringing up the
+# system blocks.
+# Function key 9 corresponds to the leftmost touch target on the screen,
+# function key 16 corresponds to the rightmost.
+#
+# There are problems with soft key labeling.  These are due to
+# strangenesses in the native terminal that are impossible to
+# describe in a terminfo.
+att510d|bct510d|AT&T 510D Personal Terminal,
+	am, da, db, mir, msgr, xenl, xon,
+	cols#80, lh#2, lines#24, lm#48, lw#7, nlab#8,
+	acsc=+g\,h-f.e`bhrisjjkkllmmnnqqttuuvvwwxx{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[2;7m, cbt=\E[Z,
+	clear=\E[H\E[J, cnorm=\E[11;3|, cr=\r, cub=\E[%p1%dD,
+	cub1=^H, cud=\E[%p1%dB, cud1=\E[B, cuf=\E[%p1%dC,
+	cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA,
+	cuu1=\E[A, cvvis=\E[11;2|, dch=\E[%p1%dP, dch1=\E[P,
+	dim=\E[2m, dl=\E[%p1%dM, dl1=\E[M, ed=\E[0J, el=\E[0K,
+	el1=\E[1K, enacs=\E(B\E)1, ff=^L, home=\E[H,
+	hpa=\E[%p1%{1}%+%dG, ht=^I, hts=\EH, ich=\E[%p1%d@,
+	il=\E[%p1%dL, il1=\E[L, ind=\n, invis=\E[8m,
+	is1=\E(B\E)1\E[5;0|, is3=\E[21;1|\212, kLFT=\E[u,
+	kRIT=\E[v, kbs=^H, kcbt=\E[Z, kcub1=\E[D, kcud1=\E[B,
+	kcuf1=\E[C, kcuu1=\E[A, kf1=\EOm, kf10=\EOd, kf11=\EOe,
+	kf12=\EOf, kf13=\EOg, kf14=\EOh, kf15=\EOi, kf16=\EOj,
+	kf2=\EOV, kf3=\EOu, kf4=\ENj, kf5=\ENe, kf6=\ENf, kf7=\ENh,
+	kf8=\E[H, kf9=\EOc, kind=\E[S, kri=\E[T, ll=\E#2, mc0=\E[0i,
+	mc4=\E[?8i, mc5=\E[?4i, mgc=\E:, nel=\EE,
+	pln=\E[%p1%dp%p2%:-16s, rc=\E8, rev=\E[7m, ri=\EM,
+	rmacs=^O, rmir=\E[4l, rmkx=\E[19;0|, rmln=\E<, rmso=\E[m,
+	rmul=\E[m, rmxon=\E[29;1|, rs2=\E[5;0|, sc=\E7,
+	sgr=\E[0%?%p5%p6%|%t;2%;%?%p2%t;4%;%?%p4%t;5%;%?%p3%p1%|%p6
+	    %|%t;7%;%?%p7%t;8%;m%?%p9%t\016%e\017%;,
+	sgr0=\E[m\017, smacs=^N, smgl=\E4, smgr=\E5, smir=\E[4h,
+	smkx=\E[19;1|, smln=\E?, smso=\E[7m, smul=\E[4m,
+	smxon=\E[29;0|, tbc=\E[3g, vpa=\E[%p1%{1}%+%dd,
+	use=ansi+cpr, use=ansi+rep, use=ecma+index,
+
+# (att500: I merged this with the att513 entry, att500 just used att513 -- esr)
+att500|att513|AT&T 513 using page mode,
+	am, chts, mir, msgr, xenl, xon,
+	cols#80, lh#2, lines#24, lw#8, nlab#8,
+	acsc=+g\,h-f.e`bhrisjjkkllmmnnqqttuuvvwwxx{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[2;7m, cbt=\E[Z,
+	clear=\E[H\E[J, cnorm=\E[11;0|, cr=\r,
+	csr=%i\E[%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	cvvis=\E[11;1|, dch=\E[%p1%dP, dch1=\E[P$<1>, dim=\E[2m,
+	dl=\E[%p1%dM, dl1=\E[M, ed=\E[J, el=\E[K, el1=\E[1K,
+	enacs=\E(B\E)1, home=\E[H, hpa=\E[%p1%{1}%+%dG, ht=^I,
+	hts=\EH, ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[L, ind=\n,
+	indn=\E[%p1%dE, invis=\E[8m,
+	is1=\E?\E[3;3|\E[10;0|\E[21;1|\212\E[6;1|\E[1{\E[?99l,
+	kBEG=\ENB, kCAN=\EOW, kCMD=\EOU, kCPY=\END, kCRT=\EON,
+	kDC=\ENF, kDL=\ENE, kEND=\ENN, kEOL=\EOA, kEXT=\EOK,
+	kFND=\EOX, kHLP=\EOM, kHOM=\ENM, kIC=\ENJ, kLFT=\ENK,
+	kMOV=\ENC, kMSG=\EOL, kNXT=\ENH, kOPT=\EOR, kPRT=\EOZ,
+	kPRV=\ENG, kRDO=\EOT, kRES=\EOQ, kRIT=\ENL, kRPL=\EOY,
+	kSAV=\EOO, kSPD=\EOP, kUND=\EOS, kbeg=\E9, kbs=^H, kcan=\EOw,
+	kcbt=\E[Z, kclo=\EOV, kclr=\E[J, kcmd=\EOu, kcpy=\ENd,
+	kcrt=\EOn, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A,
+	kdch1=\ENf, kdl1=\ENe, kel=\EOa, kend=\E0, kent=\Eent,
+	kext=\EOk, kf1=\EOc, kf2=\EOd, kf3=\EOe, kf4=\EOf, kf5=\EOg,
+	kf6=\EOh, kf7=\EOi, kf8=\EOj, kfnd=\EOx, khlp=\EOm,
+	khome=\E[H, kich1=\ENj, kind=\E[S, kmov=\ENc, kmrk=\ENi,
+	kmsg=\EOl, knp=\E[U, knxt=\ENh, kopn=\EOv, kopt=\EOr,
+	kpp=\E[V, kprt=\EOz, kprv=\ENg, krdo=\EOt, kref=\EOb,
+	kres=\EOq, krfr=\ENa, kri=\E[T, krpl=\EOy, krst=\EOB,
+	ksav=\EOo, kslt=\ENI, kspd=\EOp, kund=\EOs, ll=\E#2,
+	mc0=\E[?98l\E[0i, mc4=\E[?98l\E[?8i, mc5=\E[?98l\E[?4i,
+	nel=\EE,
+	pfkey=\E[%p1%d;%p2%l%d;3;0p\s\s\sF%p1%d\s\s\s\s\s\s\s\s\s\s
+	      \s%p2%s,
+	pfloc=\E[%p1%d;%p2%l%d;2;0p\s\s\sF%p1%d\s\s\s\s\s\s\s\s\s\s
+	      \s%p2%s,
+	pfx=\E[%p1%d;%p2%l%d;1;0p   F%p1%d           %p2%s,
+	pln=\E[%p1%dp%p2%:-16s, rc=\E8, rev=\E[7m, ri=\EM,
+	rin=\E[%p1%dF, rmacs=^O, rmir=\E[4l,
+	rmkx=\E[19;0|\E[21;1|\212, rmln=\E<, rmso=\E[m,
+	rmul=\E[m,
+	rs1=\E?\E[3;3|\E[10;0|\E[21;1|\212\E[6;1|\E[1{\E[?99l\E[2;0|
+	    \E[6;1|\E[8;0|\E[19;0|\E[1{\E[?99l,
+	rs2=\E[5;0|, sc=\E7,
+	sgr=\E[0%?%p1%p5%|%p6%|%t;2%;%?%p2%t;4%;%?%p4%t;5%;%?%p3%p1
+	    %|%p6%|%t;7%;%?%p7%t;8%;m%?%p9%t\016%e\017%;,
+	sgr0=\E[m\017, smacs=^N, smir=\E[4h,
+	smkx=\E[19;1|\E[21;4|\Eent, smln=\E?, smso=\E[7m,
+	smul=\E[4m, tbc=\E[3g, vpa=\E[%p1%{1}%+%dd,
+	use=decid+cpr, use=ansi+rep,
+
+# 01-07-88:
+# printer must be set to EMUL ANSI to accept ESC codes
+# <cuu1> stops at top margin
+# <is1> sets cpi 10,lpi 6,form 66,left 1,right 132,top 1,bottom 66,font
+#	and alt font ascii,wrap on,tabs cleared
+# <is2> disables newline on LF,Emphasized off
+# The <u0> capability sets form length
+att5310|att5320|AT&T Model 53210 or 5320 matrix printer,
+	xhpa, xvpa,
+	bufsz#0x2000, cols#132, cps#120, it#8, lines#66, orc#10,
+	orhi#100, orl#12, orvi#72,
+	cpi=%?%p1%{10}%=%t\E[w%e%p1%{12}%=%t\E[2w%e%p1%{5}%=%t\E[5w
+	    %e%p1%{13}%=%p1%{14}%=%O%t\E[3w%e%p1%{16}%=%p1%{17}%=%O
+	    %t\E[4w%e%p1%{6}%=%t\E[6w%e%p1%{7}%=%t\E[7w%e%p1%{8}%=%t
+	    \E[8w%;,
+	cr=\r,
+	csnm=%?%p1%{0}%=%tusascii%e%p1%{1}%=%tenglish%e%p1%{2}%=%tfi
+	     nnish%e%p1%{3}%=%tjapanese%e%p1%{4}%=%tnorwegian%e%p1
+	     %{5}%=%tswedish%e%p1%{6}%=%tgermanic%e%p1%{7}%=%tfrench
+	     %e%p1%{8}%=%tcanadian_french%e%p1%{9}%=%titalian%e%p1
+	     %{10}%=%tspanish%e%p1%{11}%=%tline%e%p1%{12}%=%tsecurit
+	     y%e%p1%{13}%=%tebcdic%e%p1%{14}%=%tapl%e%p1%{15}%=%tmos
+	     aic%;,
+	cud=\E[%p1%de, cud1=\n, cuf=\E[%p1%da, cuf1=\s, cuu1=\EM,
+	ff=^L, hpa=\E[%p1%d`, ht=^I, is1=\Ec, is2=\E[20l\r,
+	lpi=%?%p1%{2}%=%t\E[4z%e%p1%{3}%=%t\E[5z%e%p1%{4}%=%t\E[6z%e
+	    %p1%{6}%=%t\E[z%e%p1%{8}%=%t\E[2z%e%p1%{12}%=%t\E[3z%;,
+	rshm=\E[m,
+	scs=%?%p1%{0}%=%t\E(B%e%p1%{1}%=%t\E(A%e%p1%{2}%=%t\E(C%e%p1
+	    %{3}%=%t\E(D%e%p1%{4}%=%t\E(E%e%p1%{5}%=%t\E(H%e%p1%{6}
+	    %=%t\E(K%e%p1%{7}%=%t\E(R%e%p1%{8}%=%t\E(Q%e%p1%{9}%=%t
+	    \E(Y%e%p1%{10}%=%t\E(Z%e%p1%{11}%=%t\E(0%e%p1%{12}%=%t
+	    \E(1%e%p1%{13}%=%t\E(3%e%p1%{14}%=%t\E(8%e%p1%{15}%=%t
+	    \E(}%;,
+	smgbp=\E[;%p1%dr, smglp=\E[%{1}%p1%+%ds,
+	smgrp=\E[;%{1}%p1%+%ds, smgtp=\E[%p1%dr, sshm=\E[5m,
+	u0=\E[%p1%dt, vpa=\E[%p1%dd,
+
+# Teletype 5620, firmware version 1.1 (8;7;3) or earlier from BRL
+# The following SET-UP modes are assumed for normal operation:
+#	CR_DEF=CR	NL_DEF=INDEX	DUPLEX=FULL
+# Other SET-UP modes may be set for operator convenience or communication
+# requirements.  This termcap description is for the Resident Terminal Mode.
+# No delays specified; use "stty ixon -ixany" to enable DC3/DC1 flow control!
+# The BRL entry also said: UNSAFE :ll=\E[70H:
+att5620-1|tty5620-1|dmd1|Teletype 5620 with old ROMs,
+	am, xon,
+	cols#88, it#8, lines#70, vt#3,
+	bel=^G, clear=\E[H\E[J, cr=\r, cub1=^H, cud1=\n, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, dch=\E[%p1%dP,
+	dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M, ed=\E[J, el=\E[K,
+	home=\E[H, ht=^I, ich=\E[%p1%d@, ich1=\E[@, il=\E[%p1%dL,
+	il1=\E[L, ind=\n, kbs=^H, kclr=\E[2J, kcub1=\E[D, kcud1=\E[B,
+	kcuf1=\E[C, kcuu1=\E[A, khome=\E[H, kll=\E[70;1H, nel=\r\n,
+	rc=\E8, ri=\E[T, rs1=\Ec, sc=\E7, use=ecma+index,
+
+# 5620 terminfo  (2.0 or later ROMS with char attributes)
+# The following SET-UP modes are assumed for normal operation:
+#	DUPLEX=FULL	GEN_FLOW=ON	NEWLINE=INDEX	RETURN=CR
+# Other SET-UP modes may be set for operator convenience or communication
+# requirements.  This termcap description is for Resident Terminal Mode.  No
+# delays are specified; use "stty ixon -ixany" to enable DC3/DC1 flow control!
+# assumptions: <ind> (scroll forward one line) is only done at screen bottom
+# Be aware that older versions of the dmd have a firmware bug that affects
+# parameter defaulting; for this terminal, the 0 in \E[0m is not optional.
+# <msgr> is from an otherwise inferior BRL for this terminal.  That entry
+# also has <ll>=\E[70H commented out and marked unsafe.
+# For more, see the 5620 FAQ maintained by David Breneman <daveb@dgtl.com>.
+att5620|dmd|tty5620|ttydmd|5620|AT&T 5620 terminal 88 columns,
+	OTbs, am, msgr, npc, xon,
+	cols#88, it#8, lines#70,
+	bel=^G, bold=\E[2m, clear=\E[H\E[J, cr=\r, cub1=^H,
+	cud1=\E[B, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A,
+	dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m, dl=\E[%p1%dM,
+	dl1=\E[M, ed=\E[J, el=\E[K, home=\E[H, ht=^I, ich=\E[%p1%d@,
+	ich1=\E[@, il=\E[%p1%dL, il1=\E[L, ind=\E[S, kbs=^H,
+	kclr=\E[2J, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A,
+	khome=\E[H, kll=\E[70;1H, nel=\n,
+	pfx=\E[%p1%d;%p2%l%dq%p2%s, rc=\E8, rev=\E[7m, ri=\E[T,
+	rmso=\E[0m, rmul=\E[0m, rs1=\Ec, sc=\E7, sgr0=\E[0m,
+	smso=\E[7m, smul=\E[4m, use=ecma+index,
+att5620-24|tty5620-24|dmd-24|Teletype dmd 5620 in a 24x80 layer,
+	lines#24, use=att5620,
+att5620-34|tty5620-34|dmd-34|Teletype dmd 5620 in a 34x80 layer,
+	lines#34, use=att5620,
+# 5620 layer running the "S" system's downloaded graphics handler:
+att5620-s|tty5620-s|layer|vitty|AT&T 5620 S layer,
+	OTbs, OTpt, am,
+	cols#80, it#8, lines#72,
+	bel=^G, clear=^L, cr=\r, cub1=^H, cud1=\n,
+	cup=\EY%p2%{32}%+%c%p1%{32}%+%c, cuu1=^K, dl1=\ED,
+	el=\EK, flash=\E^G, ht=^I, il1=\EI, ind=\n, kbs=^H, kclr=\E[2J,
+	kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, khome=\E[H,
+	kll=\E[70;1H,
+
+# Entries for <kf15> thru <kf28> refer to the shifted system pf keys.
+#
+# Entries for <kf29> thru <kf46> refer to the alternate keypad mode
+# keys:  = * / + 7 8 9 - 4 5 6 , 1 2 3 0 . ENTER
+att605|AT&T 605 80 column 102key keyboard,
+	am, eo, xon,
+	cols#80, lines#24, lw#8, nlab#8, wsl#80,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, clear=\E[H\E[J,
+	cr=\r, cub1=^H, cud1=\E[B, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, dch=\E[%p1%dP,
+	dch1=\E[P, dim=\E[2m, dl=\E[%p1%dM, dl1=\E[M, ed=\E[J,
+	el=\E[K, el1=\E[1K, fsl=\E8, ht=^I, ich=\E[%p1%d@, ich1=\E[@,
+	il1=\E[L, ind=\n, invis=\E[8m,
+	is1=\E[8;0|\E[?\E[13;20l\E[?\E[12h, is2=\E[m\017,
+	kLFT=\E[ A, kRIT=\E[ @, kbs=^H, kcbt=\E[Z, kclr=\E[2J,
+	kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kdch1=\E[P,
+	kdl1=\E[M, kend=\E[24;1H, kf1=\EOc, kf10=\ENp, kf11=\ENq,
+	kf12=\ENr, kf13=\ENs, kf14=\ENt, kf15=\EOC, kf16=\EOD,
+	kf17=\EOE, kf18=\EOF, kf19=\EOG, kf2=\EOd, kf20=\EOH,
+	kf21=\EOI, kf22=\EOJ, kf23=\ENO, kf24=\ENP, kf25=\ENQ,
+	kf26=\ENR, kf27=\ENS, kf28=\ENT, kf29=\EOP, kf3=\EOe,
+	kf30=\EOQ, kf31=\EOR, kf32=\EOS, kf33=\EOw, kf34=\EOx,
+	kf35=\EOy, kf36=\EOm, kf37=\EOt, kf38=\EOu, kf39=\EOv,
+	kf4=\EOf, kf40=\EOl, kf41=\EOq, kf42=\EOr, kf43=\EOs,
+	kf44=\EOp, kf45=\EOn, kf46=\EOM, kf5=\EOg, kf6=\EOh,
+	kf7=\EOi, kf8=\EOj, kf9=\ENo, khome=\E[H, kich1=\E[@,
+	kil1=\E[L, kind=\E[S, knp=\E[U, kpp=\E[V, ll=\E[24H,
+	mc4=\E[?4i, mc5=\E[?5i, nel=\EE,
+	pfx=\E[%p1%d;%p2%l%02dq   F%p1%1d           %p2%s,
+	pln=\E[%p1%d;0;0;0q%p2%:-16.16s, rc=\E8, rev=\E[7m,
+	rmacs=^O, rmir=\E[4l, rmln=\E[2p, rmso=\E[m, rmul=\E[m,
+	rs2=\Ec\E[?3l, sc=\E7, sgr0=\E[m\017, smacs=\E)0\016,
+	smir=\E[4h, smln=\E[p, smso=\E[7m, smul=\E[4m,
+	tsl=\E7\E[25;%i%p1%dx, use=ansi+cpr,
+att605-pc|AT&T 605 in pc term mode,
+	acsc=j\331k\277l\332m\300n\305q\304t\303u\264v\301w\302x
+	     \263,
+	cbt=\E[Z, cub1=\E[D, cud1=\E[B, cuf1=\E[C, cuu1=\E[A,
+	dch1=\E[P, dl1=\E[M, ich1=\E[@, il1=\E[L, kcbt=\E[Z,
+	kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kdch1=\E[P,
+	kdl1=\E[M, kend=\E[F, kf1=\E[M, kf10=\E[V, kf2=\E[N,
+	kf3=\E[O, kf4=\E[P, kf5=\E[Q, kf6=\E[R, kf7=\E[S, kf8=\E[T,
+	kf9=\E[U, khome=\E[H, kich1=\E[@, knp=\E[G, kpp=\E[I,
+	rmsc=\E[50;0|$<400>, smsc=\E[?11l\E[50;1|$<250>,
+	xoffc=g, xonc=e, use=att605,
+att605-w|AT&T 605-w 132 column 102 key keyboard,
+	cols#132, wsl#132,
+	is1=\E[8;0|\E[?4;5;13;15l\E[13;20l\E[?3;7h\E[12h\E(B\E)0, use=att605,
+# (att610: I added <rmam>/<smam> based on the init string.  I also
+# added <indn> and <rin> because the BSD file says the att615s have them,
+# and the 615 is like a 610 with a big keyboard, and most of their other
+# smart terminals support the same sequence -- esr)
+att610|AT&T 610; 80 column; 98key keyboard,
+	am, eslok, hs, mir, msgr, xenl, xon,
+	cols#80, it#8, lh#2, lines#24, lw#8, nlab#8, wsl#80,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, clear=\E[H\E[J,
+	cr=\r, csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\E[B, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	cvvis=\E[?12;25h, dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m,
+	dl=\E[%p1%dM, dl1=\E[M, ed=\E[J, el=\E[K, el1=\E[1K,
+	flash=\E[?5h$<200>\E[?5l, fsl=\E8, home=\E[H, ht=^I,
+	ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[L, ind=\ED,
+	invis=\E[8m,
+	is1=\E[8;0|\E[?3;4;5;13;15l\E[13;20l\E[?7h\E[12h\E(B\E)0,
+	is2=\E[m\017, is3=\E(B\E)0, kLFT=\E[ @, kRIT=\E[ A, kbs=^H,
+	kcbt=\E[Z, kclr=\E[2J, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C,
+	kcuu1=\E[A, kf1=\EOc, kf10=\ENp, kf11=\ENq, kf12=\ENr,
+	kf13=\ENs, kf14=\ENt, kf2=\EOd, kf3=\EOe, kf4=\EOf, kf5=\EOg,
+	kf6=\EOh, kf7=\EOi, kf8=\EOj, kf9=\ENo, khome=\E[H,
+	kind=\E[S, kri=\E[T, ll=\E[24H, mc4=\E[?4i, mc5=\E[?5i,
+	nel=\EE,
+	pfx=\E[%p1%d;%p2%l%02dq   F%p1%1d           %p2%s,
+	pln=\E[%p1%d;0;0;0q%p2%:-16.16s, rc=\E8, rev=\E[7m,
+	ri=\EM, rmacs=^O, rmam=\E[?7l, rmir=\E[4l, rmln=\E[2p,
+	rmso=\E[m, rmul=\E[m, rs2=\Ec\E[?3l, sc=\E7,
+	sgr=\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;%?%p4%t;5%;%?%p3%p1
+	    %|%t;7%;%?%p7%t;8%;m%?%p9%t\016%e\017%;,
+	sgr0=\E[m\017, smacs=^N, smam=\E[?7h, smir=\E[4h,
+	smln=\E[p, smso=\E[7m, smul=\E[4m, tsl=\E7\E[25;%i%p1%dx,
+	use=decid+cpr, use=ecma+index, use=att610+cvis,
+att610-w|AT&T 610; 132 column; 98key keyboard,
+	cols#132, wsl#132,
+	is1=\E[8;0|\E[?4;5;13;15l\E[13;20l\E[?3;7h\E[12h,
+	use=att610,
+
+att610-103k|AT&T 610; 80 column; 103key keyboard,
+	kBEG=\ENB, kCAN=\EOW, kCMD=\EOU, kCPY=\END, kCRT=\EON,
+	kDC=\ENF, kDL=\ENE, kEND=\ENN, kEOL=\EOA, kEXT=\EOK,
+	kFND=\EOX, kHLP=\EOM, kMOV=\ENC, kMSG=\EOL, kNXT=\ENH,
+	kOPT=\EOR, kPRT=\EOZ, kPRV=\ENG, kRDO=\EOT, kRES=\EOQ,
+	kRPL=\EOY, kSAV=\EOO, kSPD=\EOP, kUND=\EOS, kbeg=\E9,
+	kcan=\EOw, kclo=\EOV, kcmd=\EOu, kcpy=\ENd, kcrt=\EOn,
+	kdch1=\ENf, kdl1=\ENe, kel=\EOa, kend=\E0, kent=\r,
+	kext=\EOk, kf10@, kf11@, kf12@, kf13@, kf14@, kf9@, kfnd=\EOx,
+	khlp=\EOm, kich1=\ENj, kmov=\ENc, kmrk=\ENi, kmsg=\EOl,
+	knp=\E[U, knxt=\ENh, kopn=\EOv, kopt=\EOr, kpp=\E[V,
+	kprt=\EOz, kprv=\ENg, krdo=\EOt, kref=\EOb, kres=\EOq,
+	krfr=\ENa, krmir=\ENj, krpl=\EOy, krst=\EOB, ksav=\EOo,
+	kslt=\ENI, kspd=\EOp, kund=\EOs, use=att610,
+att610-103k-w|AT&T 610; 132 column; 103key keyboard,
+	cols#132, wsl#132,
+	is1=\E[8;0|\E[?4;5;13;15l\E[13;20l\E[?3;7h\E[12h,
+	use=att610-103k,
+att615|AT&T 615; 80 column; 98key keyboard,
+	kLFT=\E[ A, kRIT=\E[ @, kf15=\EOC, kf16=\EOD, kf17=\EOE,
+	kf18=\EOF, kf19=\EOG, kf20=\EOH, kf21=\EOI, kf22=\EOJ,
+	kf23=\ENO, kf24=\ENP, kf25=\ENQ, kf26=\ENR, kf27=\ENS,
+	kf28=\ENT, kf29=\EOP, kf30=\EOQ, kf31=\EOR, kf32=\EOS,
+	kf33=\EOw, kf34=\EOx, kf35=\EOy, kf36=\EOm, kf37=\EOt,
+	kf38=\EOu, kf39=\EOv, kf40=\EOl, kf41=\EOq, kf42=\EOr,
+	kf43=\EOs, kf44=\EOp, kf45=\EOn, kf46=\EOM, use=att610,
+att615-w|AT&T 615; 132 column; 98key keyboard,
+	kLFT=\E[ A, kRIT=\E[ @, kf15=\EOC, kf16=\EOD, kf17=\EOE,
+	kf18=\EOF, kf19=\EOG, kf20=\EOH, kf21=\EOI, kf22=\EOJ,
+	kf23=\ENO, kf24=\ENP, kf25=\ENQ, kf26=\ENR, kf27=\ENS,
+	kf28=\ENT, kf29=\EOP, kf30=\EOQ, kf31=\EOR, kf32=\EOS,
+	kf33=\EOw, kf34=\EOx, kf35=\EOy, kf36=\EOm, kf37=\EOt,
+	kf38=\EOu, kf39=\EOv, kf40=\EOl, kf41=\EOq, kf42=\EOr,
+	kf43=\EOs, kf44=\EOp, kf45=\EOn, kf46=\EOM, use=att610-w,
+att615-103k|AT&T 615; 80 column; 103key keyboard,
+	kLFT=\E[ A, kRIT=\E[ @, use=att610-103k,
+att615-103k-w|AT&T 615; 132 column; 103key keyboard,
+	kLFT=\E[ A, kRIT=\E[ @, use=att610-103k-w,
+# (att620: I added <rmam>/<smam> based on the init string and
+# <rin>/<indn> from a BSD termcap -- esr)
+att620|AT&T 620; 80 column; 98key keyboard,
+	am, eslok, hs, mir, msgr, xenl, xon,
+	cols#80, it#8, lh#2, lines#24, lw#8, nlab#8, wsl#80,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, clear=\E[H\E[J,
+	cr=\r, csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\E[B, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	cvvis=\E[?12;25h, dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m,
+	dl=\E[%p1%dM, dl1=\E[M, ed=\E[J, el=\E[K, el1=\E[1K,
+	flash=\E[?5h$<200>\E[?5l, fsl=\E8, home=\E[H, ht=^I,
+	ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[L, ind=\ED,
+	invis=\E[8m,
+	is1=\E[8;0|\E[?3;4;5;13;15l\E[13;20l\E[?7h\E[12h,
+	is2=\E[m\017, is3=\E(B\E)0, kLFT=\E[ A, kRIT=\E[ @, kbs=^H,
+	kcbt=\E[Z, kclr=\E[2J, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C,
+	kcuu1=\E[A, kf1=\EOc, kf10=\ENp, kf11=\ENq, kf12=\ENr,
+	kf13=\ENs, kf14=\ENt, kf15=\EOC, kf16=\EOD, kf17=\EOE,
+	kf18=\EOF, kf19=\EOG, kf2=\EOd, kf20=\EOH, kf21=\EOI,
+	kf22=\EOJ, kf23=\ENO, kf24=\ENP, kf25=\ENQ, kf26=\ENR,
+	kf27=\ENS, kf28=\ENT, kf29=\EOP, kf3=\EOe, kf30=\EOQ,
+	kf31=\EOR, kf32=\EOS, kf33=\EOw, kf34=\EOx, kf35=\EOy,
+	kf36=\EOm, kf37=\EOt, kf38=\EOu, kf39=\EOv, kf4=\EOf,
+	kf40=\EOl, kf41=\EOq, kf42=\EOr, kf43=\EOs, kf44=\EOp,
+	kf45=\EOn, kf46=\EOM, kf5=\EOg, kf6=\EOh, kf7=\EOi, kf8=\EOj,
+	kf9=\ENo, khome=\E[H, kind=\E[S, kri=\E[T, ll=\E[24H,
+	mc4=\E[?4i, mc5=\E[?5i, nel=\EE,
+	pfx=\E[%p1%d;%p2%l%02dq   F%p1%1d           %p2%s,
+	pln=\E[%p1%d;0;0;0q%p2%:-16.16s, rc=\E8, rev=\E[7m,
+	ri=\EM, rmacs=\E(B\017, rmam=\E[?7l, rmir=\E[4l,
+	rmln=\E[2p, rmso=\E[m, rmul=\E[m, rs2=\Ec\E[?3l, sc=\E7,
+	sgr=\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;%?%p4%t;5%;%?%p3%p1
+	    %|%t;7%;%?%p7%t;8%;m%?%p9%t\E)0\016%e\E(B\017%;,
+	sgr0=\E[m\E(B\017, smacs=\E)0\016, smam=\E[?7h,
+	smir=\E[4h, smln=\E[p, smso=\E[7m, smul=\E[4m,
+	tsl=\E7\E[25;%i%p1%dx, use=decid+cpr, use=ecma+index,
+	use=att610+cvis,
+att620-w|AT&T 620; 132 column; 98key keyboard,
+	cols#132, wsl#132,
+	is1=\E[8;0|\E[?4;5;13;15l\E[13;20l\E[?3;7h\E[12h,
+	use=att620,
+att620-103k|AT&T 620; 80 column; 103key keyboard,
+	kBEG=\ENB, kCAN=\EOW, kCMD=\EOU, kCPY=\END, kCRT=\EON,
+	kDC=\ENF, kDL=\ENE, kEND=\ENN, kEOL=\EOA, kEXT=\EOK,
+	kFND=\EOX, kHLP=\EOM, kMOV=\ENC, kMSG=\EOL, kNXT=\ENH,
+	kOPT=\EOR, kPRT=\EOZ, kPRV=\ENG, kRDO=\EOT, kRES=\EOQ,
+	kRPL=\EOY, kSAV=\EOO, kSPD=\EOP, kUND=\EOS, kbeg=\E9,
+	kcan=\EOw, kclo=\EOV, kcmd=\EOu, kcpy=\ENd, kcrt=\EOn,
+	kdch1=\ENf, kdl1=\ENe, kel=\EOa, kend=\E0, kent=\r,
+	kext=\EOk, kf10@, kf11@, kf12@, kf13@, kf14@, kf15@, kf16@, kf17@,
+	kf18@, kf19@, kf20@, kf21@, kf22@, kf23@, kf24@, kf25@, kf26@, kf27@,
+	kf28@, kf29@, kf30@, kf31@, kf32@, kf33@, kf34@, kf35@, kf36@, kf37@,
+	kf38@, kf39@, kf40@, kf41@, kf42@, kf43@, kf44@, kf45@, kf46@, kf9@,
+	kfnd=\EOx, khlp=\EOm, kich1=\ENj, kmov=\ENc, kmrk=\ENi,
+	kmsg=\EOl, knp=\E[U, knxt=\ENh, kopn=\EOv, kopt=\EOr,
+	kpp=\E[V, kprt=\EOz, kprv=\ENg, krdo=\EOt, kref=\EOb,
+	kres=\EOq, krfr=\ENa, krmir=\ENj, krpl=\EOy, krst=\EOB,
+	ksav=\EOo, kslt=\ENI, kspd=\EOp, kund=\EOs, use=att620,
+
+att620-103k-w|AT&T 620; 132 column; 103key keyboard,
+	cols#132, wsl#132,
+	is1=\E[8;0|\E[?4;5;13;15l\E[13;20l\E[?3;7h\E[12h,
+	use=att620-103k,
+
+# AT&T (formerly Teletype) 630 Multi-Tasking Graphics terminal
+# The following SETUP modes are assumed for normal operation:
+#	Local_Echo=Off	Gen_Flow=On	Return=CR	Received_Newline=LF
+#	Font_Size=Large		Non-Layers_Window_Cols=80
+#				Non-Layers_Window_Rows=60
+# Other SETUP modes may be set for operator convenience or communication
+# requirements.  Some capabilities assume a printer attached to the Aux EIA
+# port.  This termcap description is for the Fixed Non-Layers Window.  No
+# delays are specified; use "stty ixon -ixany" to enable DC3/DC1 flow control!
+# (att630: added <ich1>, <blink> and <dim> from a BSD termcap file -- esr)
+att630|AT&T 630 windowing terminal,
+	OTbs, am, da, db, mir, msgr, npc, xon,
+	cols#80, it#8, lines#60, lm#0,
+	bel=^G, blink=\E[5m, cbt=\E[Z, clear=\E[H\E[J, cr=\r,
+	cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=\E[B,
+	cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH,
+	cuu=\E[%p1%dA, cuu1=\E[A, dch=\E[%p1%dP, dch1=\E[P,
+	dim=\E[2m, dl=\E[%p1%dM, dl1=\E[M, ed=\E[J, el=\E[K,
+	el1=\E[1K, home=\E[H, ht=^I, ich=\E[%p1%d@, ich1=\E[@,
+	il=\E[%p1%dL, il1=\E[L, ind=\ED, is2=\E[m, kbs=^H, kcbt=\E[Z,
+	kclr=\E[2J, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A,
+	kdch1=\E[P, kdl1=\E[M, kent=\r, kf10=\ENp, kf11=\ENq,
+	kf12=\ENr, kf13=\ENs, kf14=\ENt, kf15=\ENu, kf16=\ENv,
+	kf17=\ENw, kf18=\ENx, kf19=\ENy, kf20=\ENz, kf21=\EN{,
+	kf22=\EN|, kf23=\EN}, kf24=\EN~, kf9=\ENo, khome=\E[H,
+	kich1=\E[@, kil1=\E[L, mc4=\E[?4i, mc5=\E[?5i, nel=\r\n,
+	pfx=\E[%p1%d;%p2%l%dq%p2%s, rc=\E8, rev=\E[7m, ri=\EM,
+	rmir=\E[4l, rmso=\E[m, rmul=\E[m, rs2=\Ec, sc=\E7,
+	sgr=\E[0%?%p5%t;2%;%?%p2%t;4%;%?%p4%t;5%;%?%p1%p3%|%p4%|%t;7
+	    %;m,
+	sgr0=\E[m, smir=\E[4h, smso=\E[7m, smul=\E[4m,
+	use=ansi+cpr, use=ecma+index,
+att630-24|5630-24|5630DMD-24|630MTG-24|AT&T 630 windowing terminal 24 lines,
+	lines#24, use=att630,
+
+# This is the att700 entry for 700 native emulation of the AT&T 700
+# terminal.  Comments are relative to changes from the 605V2 entry and
+# att730 on which the entry is based.  Comments show the terminfo
+# capability name, termcap name, and description.
+#
+# Here is what's going onm in the init string:
+#	ESC [ 50;4|	set 700 native mode (really is 605)
+# x	ESC [ 56;ps|	set lines to 24: ps=0; 40: ps=1 (plus status line)
+#	ESC [ 53;0|	set GenFlow to Xon/Xoff
+#	ESC [ 8 ;0|	set CR on NL
+# x	ESC [ ? 3 l/h	set workspace: 80 col(l); 132 col(h)
+#	ESC [ ? 4 l	jump scroll
+#	ESC [ ? 5 l/h	video: normal (l); reverse (h)
+#	ESC [ ?13 l	Labels on
+#	ESC [ ?15 l	parity check = no
+#	ESC [ 13 l	monitor mode off
+#	ESC [ 20 l	LF on NL (not CRLF on NL)
+#	ESC [ ? 7 h	autowrap on
+#	ESC [ 12 h	local echo off
+#	ESC ( B		GO = ASCII
+#	ESC ) 0		G1 = Special Char & Line Drawing
+#	ESC [ ? 31 l	Set 7 bit controls
+#
+# Note: Most terminals, especially the 600 family use Reverse Video for
+# standout mode.  DEC also uses reverse video.  The VT100 uses bold in addition
+# Assume we should stay with reverse video for 70..  However, the 605V2 exits
+# standout mode with \E[m (all normal attributes).  The 730 entry simply
+# exits reverse video which would leave other current attributes intact.  It
+# was assumed the 730 entry to be more correct so rmso has changed.  The
+# 605V2 has no sequences to turn individual attributes off, thus its setting
+# and the rmso/smso settings from the 730.
+#
+# Note: For the same reason as above in rmso I changed exit under-score mode
+# to specifically turn off underscore, rather than return to all normal
+# attributes
+#
+# Note: The following pkey_xmit is taken from the 605V2 which contained the
+# capability as pfxl.  It was changed here to pfx since pfxl
+# will only compile successfully with Unix 4.0 tic.  Also note that pfx only
+# allows strings to be parameters and label values must be programmed as
+# constant strings.  Supposedly the pfxl of Version 4.0 allows both labels
+# and strings to be parameters.  The 605V2 pfx entry should be examined later
+# in this regard. For reference the 730 pfxl entry is shown here for comparison
+# 730 pfx entry:
+#     pfxl=\E[%?%p1%{25}%<%t%p1%e%p1%{24}%-%;%d;%p2%l%02d%?%p1%{25}%<%tq\s\s\s
+# SYS\s\s\s\s\sF%p1%:-2d\s\s%e;0;3q%;%p2%s,
+#
+# (for 4.0 tic)
+#     pfxl=\E[%p1%d;%p2%l%02dq%?%p1%{9}%<%t   F%p1%1d           %;%p2%s,
+#
+# (for <4.0 tic)
+#     pfx=\E[%p1%d;%p2%l%02dq%?%p1%{9}%<%t   F%p1%1d           %;%p2%s,
+#
+# From the AT&T 705 Multi-tasking terminal user's guide Page 8-8,8-9
+#
+# Port1 Interface
+#
+# modular 10 pin Connector
+# Left side       Right side
+# Pin 1 2 3 4 5 6 7 8 9 10
+#
+#        Key (notch) at bottom
+#
+# Pin    1 DSR
+#        3 DCD
+#        4 DTR
+#        5 Sig Ground
+#        6 RD
+#        7 SD
+#        8 CTS
+#        9 RTS
+#        10 Frame Ground
+#
+# The manual is 189 pages and is loaded with details about the escape codes,
+# etc..... Available from AT&T CIC 800-432-6600...
+# ask for Document number 999-300-660..
+#
+att700|AT&T 700 24x80 column display w/102key keyboard,
+	am, eslok, hs, mir, msgr, xenl, xon,
+	cols#80, it#8, lh#2, lines#24, lw#8, nlab#8, wsl#80,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, clear=\E[H\E[J,
+	cr=\r, csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\E[B, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	cvvis=\E[?12;25h, dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m,
+	dl=\E[%p1%dM, dl1=\E[M, ed=\E[J, el=\E[K, el1=\E[1K,
+	enacs=\E(B\E)0, flash=\E[?5h$<200>\E[?5l, fln=4\,4,
+	fsl=\E8, home=\E[H, ht=^I, hts=\EH, ich=\E[%p1%d@,
+	il=\E[%p1%dL, il1=\E[L, ind=\ED, invis=\E[8m,
+	is2=\E[50;4|\E[53;0|\E[8;0|\E[?4;13;15l\E[13;20l\E[?7h\E[12h
+	    \E(B\E)0\E[?31l\E[0m\017,
+	is3=\E(B\E)0, kLFT=\E[ A, kRIT=\E[ @, kbs=^H, kcbt=\E[Z,
+	kclr=\E[2J, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A,
+	kdch1=\E[P, kdl1=\E[M, kend=\E[24;1H, kf1=\EOc, kf10=\ENp,
+	kf11=\ENq, kf12=\ENr, kf13=\ENs, kf14=\ENt, kf15=\EOC,
+	kf16=\EOD, kf17=\EOE, kf18=\EOF, kf19=\EOG, kf2=\EOd,
+	kf20=\EOH, kf21=\EOI, kf22=\EOJ, kf23=\ENO, kf24=\ENP,
+	kf25=\ENQ, kf26=\ENR, kf27=\ENS, kf28=\ENT, kf29=\EOq,
+	kf3=\EOe, kf30=\EOr, kf31=\EOs, kf32=\EOt, kf33=\EOu,
+	kf34=\EOv, kf35=\EOw, kf36=\EOx, kf37=\EOy, kf38=\EOu,
+	kf39=\EOv, kf4=\EOf, kf40=\EOl, kf41=\EOq, kf42=\EOr,
+	kf43=\EOs, kf44=\EOp, kf45=\EOn, kf46=\EOM, kf5=\EOg,
+	kf6=\EOh, kf7=\EOi, kf8=\EOj, kf9=\ENo, khome=\E[H,
+	kich1=\E[@, kil1=\E[L, knp=\E[U, kpp=\E[V, ll=\E[24H,
+	mc0=\E[i, mc4=\E[?4i, mc5=\E[?5i, nel=\EE,
+	pfx=\E[%p1%d;%p2%l%02dq%?%p1%{9}%<%t\s\s\sF%p1%1d\s\s\s\s\s
+	    \s\s\s\s\s\s%;%p2%s,
+	pln=\E[%p1%d;0;0;0q%p2%:-16.16s, rc=\E8, rev=\E[7m,
+	ri=\EM, rmacs=^O, rmir=\E[4l, rmln=\E[2p, rmso=\E[27m,
+	rmul=\E[24m, rmxon=\E[53;3|, rs1=\Ec\E[?3;5l\E[56;0|,
+	sc=\E7,
+	sgr=\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;%?%p4%t;5%;%?%p3%p1
+	    %|%t;7%;%?%p7%t;8%;m%?%p9%t\016%e\017%;,
+	sgr0=\E[m\017, smacs=^N, smir=\E[4h, smln=\E[p, smso=\E[7m,
+	smul=\E[4m, smxon=\E[53;0|, tbc=\E[3g,
+	tsl=\E7\E[99;%i%p1%dx, use=decid+cpr, use=ansi+rep,
+	use=att610+cvis0,
+
+# This entry was modified 3/13/90 by JWE.
+# fixes include additions of <enacs>, correcting <rep>, and modification
+# of <kHOM>.  (See comments below)
+# att730 has status line of 80 chars
+# These were commented out: <indn=\E[%p1%dS>, <rin=\E[%p1%dT>,
+# the <kf25> and up keys are used for shifted system Fkeys
+# NOTE: JWE 3/13/90 The 98 key keyboard translation for shift/HOME is
+# currently the same as <khome> (unshifted HOME or \E[H).  On the 102, 102+1
+# and 122 key keyboards, the 730's translation is \E[2J.  For consistency
+# <kHOM> has been commented out.  The user can uncomment <kHOM> if using the
+# 102, 102+1, or 122 key keyboards
+#       kHOM=\E[2J,
+# (att730: I added <rmam>/<smam> based on the init string -- esr)
+att730|AT&T 730 windowing terminal,
+	am, da, db, eslok, hs, mir, msgr, npc, xenl, xon,
+	cols#80, it#8, lh#2, lines#60, lm#0, lw#8, nlab#24, wsl#80,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, clear=\E[H\E[J,
+	cr=\r, csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\E[B, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	cvvis=\E[?12;25h, dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m,
+	dl=\E[%p1%dM, dl1=\E[M, ed=\E[J, el=\E[K, el1=\E[1K,
+	enacs=\E(B\E)0, flash=\E[?5h$<200>\E[?5l, fsl=\E8,
+	home=\E[H, ht=^I, ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[L,
+	ind=\ED, invis=\E[8m,
+	is1=\E[8;0|\E[?3;4;5;13;15l\E[13;20l\E[?7h\E[12h\E(B\E)B,
+	is2=\E[m\017, is3=\E(B\E)0, kLFT=\E[ @, kRIT=\E[ A, kbs=^H,
+	kcbt=\E[Z, kclr=\E[2J, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C,
+	kcuu1=\E[A, kf1=\EOc, kf10=\ENp, kf11=\ENq, kf12=\ENr,
+	kf13=\ENs, kf14=\ENt, kf15=\ENu, kf16=\ENv, kf17=\ENw,
+	kf18=\ENx, kf19=\ENy, kf2=\EOd, kf20=\ENz, kf21=\EN{,
+	kf22=\EN|, kf23=\EN}, kf24=\EN~, kf25=\EOC, kf26=\EOD,
+	kf27=\EOE, kf28=\EOF, kf29=\EOG, kf3=\EOe, kf30=\EOH,
+	kf31=\EOI, kf32=\EOJ, kf33=\ENO, kf34=\ENP, kf35=\ENQ,
+	kf36=\ENR, kf37=\ENS, kf38=\ENT, kf39=\EOU, kf4=\EOf,
+	kf40=\EOV, kf41=\EOW, kf42=\EOX, kf43=\EOY, kf44=\EOZ,
+	kf45=\EO[, kf46=\EO\s, kf47=\EO], kf48=\EO\^, kf5=\EOg,
+	kf6=\EOh, kf7=\EOi, kf8=\EOj, kf9=\ENo, khome=\E[H,
+	kich1=\E[@, kil1=\E[L, kind=\E[S, kri=\E[T,
+	mc0=\E[?19h\E[0i, mc4=\E[?4i, mc5=\E[?5i, nel=\EE,
+	pfx=\E[%?%p1%{25}%<%t%p1%e%p1%{24}%-%;%d;%p2%l%02d%?%p1%{25}
+	    %<%tq\s\s\sSYS\s\s\s\s\sF%p1%:-2d\s\s%e;0;3q%;%p2%s,
+	pfxl=\E[%p1%d;%p2%l%02d;0;0q%p3%:-16.16s%p2%s,
+	pln=\E[%p1%d;0;0;0q%p2%:-16.16s, rc=\E8, rev=\E[7m,
+	ri=\EM, rmacs=^O, rmam=\E[?7l, rmir=\E[4l, rmln=\E[?13h,
+	rmso=\E[27m, rmul=\E[24m, rmxon=\E[?21l, rs2=\Ec\E[?3l,
+	sc=\E7,
+	sgr=\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;%?%p4%t;5%;%?%p3%p1
+	    %|%t;7%;%?%p7%t;8%;m%?%p9%t\016%e\017%;,
+	sgr0=\E[m\017, smacs=^N, smam=\E[?7h, smir=\E[4h,
+	smln=\E[?13l, smso=\E[7m, smul=\E[4m, smxon=\E[?21h,
+	swidm=\E#6, tsl=\E7\E[;%i%p1%dx, use=decid+cpr,
+	use=ansi+rep, use=att610+cvis,
+# "MGT" is "Multi-Tasking Graphics Terminal"
+att730-41|730MTG-41|AT&T 730-41 windowing terminal,
+	lines#41, use=att730,
+att730-24|730MTG-24|AT&T 730-24 windowing terminal,
+	lines#24, use=att730,
+att730r|730MTGr|AT&T 730 rev video windowing terminal,
+	flash=\E[?5l$<200>\E[?5h,
+	is1=\E[8;0|\E[?3;4;13;15l\E[?5h\E[13;20l\E[?7h\E[12h\E(B\E)B, use=att730,
+att730r-41|730MTG-41r|AT&T 730r-41 rev video windowing terminal,
+	lines#41, use=att730r,
+att730r-24|730MTGr-24|AT&T 730r-24 rev video windowing terminal,
+	lines#24, use=att730r,
+
+# The following represents the screen layout along with the associated
+# bezel buttons for the 5430/pt505 terminal. The "kf" designations do
+# not appear on the screen but are shown to reference the bezel buttons.
+# The "CMD", "MAIL", and "REDRAW" buttons are shown in their approximate
+# position relative to the screen.
+#
+#
+#
+#      +----------------------------------------------------------------+
+#      |                                                                |
+# XXXX | kf0                                                       kf24 | XXXX
+#      |                                                                |
+#      |                                                                |
+# XXXX | kf1                                                       kf23 | XXXX
+#      |                                                                |
+#      |                                                                |
+# XXXX | kf2                                                       kf22 | XXXX
+#      |                                                                |
+#      |                                                                |
+# XXXX | kf3                                                       kf21 | XXXX
+#      |                                                                |
+#      |                                                                |
+# XXXX | kf4                                                       kf20 | XXXX
+#      |                                                                |
+#      |                                                                |
+# XXXX | kf5                                                       kf19 | XXXX
+#      |                                                                |
+#      |                                                                |
+# XXXX | kf6                                                       kf18 | XXXX
+#      |                                                                |
+#      |                                                                |
+# XXXX |                                                                | XXXX
+#      |                                                                |
+#      |                                                                |
+#      +----------------------------------------------------------------+
+#
+#          XXXX  XXXX  XXXX  XXXX  XXXX  XXXX  XXXX  XXXX  XXXX  XXXX
+#
+# Note: XXXX represents the screen buttons
+#                                                          CMD   REDRAW
+#
+#                                                          MAIL
+#
+# version 1 note:
+#	The character string sent by key 'kf26' may be user programmable
+#       to send either \E[16s, or \E[26s.
+#       The character string sent by key 'krfr' may be user programmable
+#       to send either \E[17s, or \E[27s.
+#
+# Depression of the "CMD" key sends    \E!    (kcmd)
+# Depression of the "MAIL" key sends   \E[26s (kf26)
+# "REDRAW" same as "REFRESH" (krfr)
+#
+# "kf" functions adds carriage return to output string if terminal is in
+# 'new line' mode.
+#
+# The following are functions not covered in the table above:
+#
+#       Set keyboard character (SKC): \EPn1;Pn2w
+#                       Pn1= 0 Back Space key
+#                       Pn1= 1 Break key
+#                       Pn2=   Program char (hex)
+#
+#       Screen Definition (SDF): \E[Pn1;Pn2;Pn3;Pn4;Pn5t
+#                       Pn1=     Window number (1-39)
+#                       Pn2-Pn5= Y;X;Y;X coordinates
+#
+#       Screen Selection (SSL): \E[Pnu
+#                       Pn= Window number
+#
+#       Set Terminal Modes (SM): \E[Pnh
+#                       Pn= 3 Graphics mode
+#                       Pn= > Cursor blink
+#                       Pn= < Enter new line mode
+#                       Pn= = Enter reverse insert/replace mode
+#                       Pn= ? Enter no scroll mode
+#
+#       Reset Terminal Mode (RM): \E[Pnl
+#                       Pn= 3 Exit graphics mode
+#                       Pn= > Exit cursor blink
+#                       Pn= < Exit new line mode
+#                       Pn= = Exit reverse insert/replace mode
+#                       Pn= ? Exit no scroll mode
+#
+#       Screen Status Report (SSR): \E[Pnp
+#                       Pn= 0 Request current window number
+#                       Pn= 1 Request current window dimensions
+#
+#       Device Status Report (DSR): \E[6n    Request cursor position
+#
+#       Call Status Report (CSR): \E[Pnv
+#                       Pn= 0 Call failed
+#                       Pn= 1 Call successful
+#
+#       Transparent Button String (TBS): \E[Pn1;Pn2;Pn3;{string
+#                       Pn1= Button number to be loaded
+#                       Pn2= Character count of "string"
+#                       Pn3= Key mode being loaded:
+#                               0= Unshifted
+#                               1= Shifted
+#                               2= Control
+#                       String= Text string (15 chars max)
+#
+#       Screen Number Report (SNR): \E[Pnp
+#                       Pn= Screen number
+#
+#       Screen Dimension Report (SDR): \E[Pn1;Pn2r
+#                       Pn1= Number of rows available in window
+#                       Pn2= Number of columns available in window
+#
+#       Cursor Position Report (CPR): \E[Pn1;Pn2R
+#                       Pn1= "Y" Position of cursor
+#                       Pn2= "X" Position of cursor
+#
+#       Request Answer Back (RAB): \E[c
+#
+#       Answer Back Response (ABR): \E[?;*;30;VSV
+#                       *=  0 No printer available
+#                       *=  2 Printer available
+#                       V=  Software version number
+#                       SV= Software sub version number
+#	(printer-available field not documented in v1)
+#
+#       Screen Alignment Aid: \En
+#
+#       Bell (lower pitch): \E[x
+#
+#       Dial Phone Number: \EPdstring\
+#                       string= Phone number to be dialed
+#
+#       Set Phone Labels: \EPpstring\
+#                       string= Label for phone buttons
+#
+#       Set Clock: \EPchour;minute;second\
+#
+#       Position Clock: \EPsY;X\
+#                       Y= "Y" coordinate
+#                       X= "X" coordinate
+#
+#       Delete Clock: \Epr\
+#
+#       Programming The Function Buttons: \EPfPn;string\
+#                       Pn= Button number (00-06, 18-24)
+#                                         (kf00-kf06, kf18-kf24)
+#                       string= Text to sent on button depression
+#
+# The following in version 2 only:
+#
+#       Request For Local Directory Data: \EPp12;\
+#
+#       Local Directory Data to host: \EPp11;LOCAL...DIRECTORY...DATA\
+#
+#	Request for Local Directory Data in print format: \EPp13;\
+#
+#	Enable 'Prt on Line' mode: \022 (DC2)
+#
+#	Disable 'Prt on Line' mode: \024 (DC4)
+#
+
+# 05-Aug-86:
+# The following Terminfo entry describes functions which are supported by
+# the AT&T 5430/pt505 terminal software version 2 and later.
+att505|pt505|att5430|gs5430|AT&T Personal Terminal 505 or 5430 GETSET terminal,
+	am, xon,
+	cols#80, it#8, lines#24,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[2J\E[H,
+	cnorm=\E[>l, cr=\r, cub=\E[%p1%dD, cub1=\E[D,
+	cud=\E[%p1%dB, cud1=\E[B, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	cvvis=\E[>h, dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM,
+	dl1=\E[M, ed=\E[0J, el=\E[0K, el1=\E[2K, home=\E[H, ht=^I,
+	il=\E[%p1%dL, il1=\E[L, ind=\n,
+	is1=\EPr\\E[0u\E[2J\E[0;0H\E[m\E[3l\E[<l\E[4l\E[>l\E[=l\E[?l,
+	kbs=^H, kcmd=\E!, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C,
+	kcuu1=\E[A, kf0=\E[00s, kf1=\E[01s, kf18=\E[18s,
+	kf19=\E[19s, kf2=\E[02s, kf20=\E[20s, kf21=\E[21s,
+	kf22=\E[22s, kf23=\E[23s, kf24=\E[24s, kf26=\E[26s,
+	kf3=\E[03s, kf4=\E[04s, kf5=\E[05s, kf6=\E[06s,
+	krfr=\E[27s, mc4=\E[4i, mc5=\E[5i, rc=\E8, rev=\E[7m,
+	rmacs=\E[10m, rmam=\E[11;1j, rmir=\E[4l, rmso=\E[m,
+	rmul=\E[m, rs1=\Ec, sc=\E7, sgr0=\E[m, smacs=\E[11m,
+	smam=\E[11;0j, smir=\E[4h, smso=\E[1m, smul=\E[4m,
+	use=ansi+cpr,
+
+# The following Terminfo entry describes functions which are supported by
+# the AT&T 5430/pt505 terminal software version 1.
+att505-24|pt505-24|gs5430-24|AT&T PT505 or 5430 GETSET version 1 24 lines,
+	lines#24,
+	mc4@, mc5@, rc@, rmam@, sc@, smam@, use=att505,
+att505-22|pt505-22|gs5430-22|AT&T PT505 or 5430 GETSET version 1 22 lines,
+	lines#22, use=att505,
+#
+#### ------------------ TERMINFO FILE CAN BE SPLIT HERE ---------------------
+# This cut mark helps make life less painful for people running ncurses tic
+# on machines with relatively little RAM.  The file can be broken in half here
+# cleanly and compiled in sections -- no `use' references cross this cut
+# going forward.
+#
+
+#### Ampex (Dialogue)
+#
+# Yes, these are the same people who are better-known for making audio- and
+# videotape.  I'm told they are located in Redwood City, CA.
+#
+
+# From: <cbosg!ucbvax!SRC:george> Fri Sep 11 22:38:32 1981
+# (ampex80: some capabilities merged in from SCO's entry -- esr)
+ampex80|a80|d80|dialogue|dialogue80|Ampex dialogue 80,
+	OTbs, am, bw, ul,
+	cols#80, it#8, lines#24,
+	bel=^G, cbt=\EI, clear=\E*$<75>, cr=\r, cub1=^H, cud1=\n,
+	cuf1=^L, cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K,
+	dch1=\EW, dl1=\ER$<5*>, ed=\Ey, el=\Et, ht=^I, hts=\E1,
+	ich1=\EQ, il1=\EE$<5*>, ind=\n, is2=\EA, rmso=\Ek, rmul=\Em,
+	smso=\Ej, smul=\El, tbc=\E3,
+# This entry was from somebody anonymous, Tue Aug  9 20:11:37 1983, who wrote:
+ampex175|Ampex d175,
+	am,
+	cols#80, lines#24,
+	bel=^G, clear=\E+, cr=\r, cub1=^H, cud1=\n, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW,
+	dl1=\ER, ed=\Ey, el=\Et, home=^^, ich1=\EQ, il1=\EE, ind=\n,
+	is2=\EX\EA\EF, kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K,
+	kdch1=\EW, kdl1=\ER, khome=^^, kich1=\EQ, kil1=\EE, ll=^^^K,
+	rmcup=\EF, rmso=\Ek, rmul=\Em, smcup=\EN, smso=\Ej, smul=\El,
+# No backspace key in the main QWERTY cluster. Fortunately, it has a
+# NEWLINE/PAGE key just above RETURN that sends a strange single-character
+# code.  Given a suitable Unix (one that lets you set an echo-erase-as-BS-SP-BS
+# mode), this key can be used as the erase key; I find I like this. Because
+# some people and some systems may not, there is another termcap ("ampex175")
+# that suppresses this little eccentricity by omitting the relevant capability.
+ampex175-b|Ampex d175 using left arrow for erase,
+	kbs=^_, use=ampex175,
+# From: Richard Bascove <atd!dsd!rcb@ucbvax.berkeley.edu>
+# (ampex210: removed obsolete ":kn#10:" -- esr)
+ampex210|a210|Ampex a210,
+	OTbs, am, hs, xenl,
+	cols#80, it#8, lines#24, xmc#1,
+	cbt=\EI, clear=\E*, cub1=^H, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW,
+	dl1=\ER, ed=\Ey, el=\Et, flash=\EU\EX\EU\EX\EU\EX\EU\EX,
+	fsl=\E.2, home=^^, ht=^I, ich1=\EQ,
+	if=/usr/share/tabset/std, il1=\EE, invis@,
+	is2=\EC\Eu\E'\E(\El\EA\E%\E{\E.2\EG0\Ed\En, kcub1=^H,
+	kcud1=^V, kcuf1=^L, kcuu1=^K, kf0=^A0\r, kf1=^A1\r,
+	kf2=^A2\r, kf3=^A3\r, kf4=^A4\r, kf5=^A5\r, kf6=^A6\r,
+	kf7=^A7\r, kf8=^A8\r, kf9=^A9\r, khome=^^,
+	tsl=\E.0\Eg\E}\Ef, use=adm+sgr,
+# (ampex219: I added <rmam>/<smam> based on the init string, added <cvvis>
+# from ampex219w, added <cnorm>=\E[?3l, irresistibly suggested by <cvvis>,
+# and moved the padding to be *after* the caps -- esr)
+ampex219|ampex-219|amp219|Ampex with automargins,
+	hs, xenl,
+	cols#80, it#8, lines#24,
+	bel=^G, blink=\E[5m$<2>, bold=\E[1m$<2>, cbt=\E[Z,
+	clear=\E[H\E[2J$<50>, cnorm=\E[?3l, cr=\r,
+	csr=%i\E[%p1%2d;%p2%2dr, cub1=^H, cud1=\E[B,
+	cuf1=\E[C$<2>, cup=\E[%i%p1%d;%p2%dH$<5>,
+	cuu1=\E[A$<2>, cvvis=\E[?3h, dim=\E[1m, ed=\E[J$<50>,
+	el=\E[K$<3>, home=\E[H, ht=^I, ind=\n,
+	is2=\E>\E[?1l\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h,
+	kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kf0=\E[21~,
+	kf1=\E[7~, kf2=\E[8~, kf3=\E[9~, kf4=\E[10~, kf5=\E[11~,
+	kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, khome=\E[H,
+	rev=\E[7m, ri=\EM$<5>, rmam=\E[?7l, rmkx=\E>,
+	rmso=\E[m$<2>, rmul=\E[m$<2>, sgr0=\E[m$<2>, smam=\E[?7h,
+	smkx=\E=, smso=\E[7m$<2>, smul=\E[4m$<2>,
+ampex219w|ampex-219w|amp219w|Ampex 132 cols,
+	cols#132, lines#24,
+	bel=^G, cr=\r, cud1=\n, ind=\n,
+	is2=\E>\E[?3h\E[?4l\E[?5l\E[?7h\E[?8h, use=ampex219,
+# (ampex232: removed <if=/usr/share/tabset/ampex>, no file and no <hts> --esr)
+ampex232|ampex-232|Ampex Model 232,
+	am,
+	cols#80, lines#24, xmc#1,
+	cbt=\EI, civis=\E.0, clear=\E+, cnorm=\E.4, cub1=^H, cud1=^V,
+	cuf1=^L, cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K,
+	dch1=\EW, dl1=\ER$<5*/>, ed=\EY, el=\ET,
+	flash=\Eb$<200/>\Ed, ht=^I, ich1=\EQ, il1=\EE$<5*/>,
+	invis@, is2=\Eg\El, kbs=^H, kcub1=^H, kcud1=^V, kcuf1=^L,
+	kcuu1=^K, kf0=^A@\r, kf1=^AA\r, kf2=^AB\r, kf3=^AC\r,
+	kf4=^AD\r, kf5=^AE\r, kf6=^AF\r, kf7=^AG\r, kf8=^AH\r,
+	kf9=^AI\r, khome=^^, use=adm+sgr,
+# (ampex: removed <if=/usr/share/tabset/amp-132>, no file and no <hts> -- esr)
+ampex232w|Ampex Model 232 / 132 columns,
+	cols#132, lines#24,
+	is2=\E\034Eg\El, use=ampex232,
+
+#### Ann Arbor (aa)
+#
+# Ann Arbor made dream terminals for hackers -- large screen sizes and huge
+# numbers of function keys.  At least some used monitors in portrait mode,
+# allowing up to 76-character screen heights!  They were reachable at:
+#
+#	Ann Arbor Terminals
+#	6175 Jackson Road
+#	Ann Arbor, MI 48103
+#	(313)-663-8000
+#
+# But in 1996 the phone number reaches some kitschy retail shop, and Ann Arbor
+# can't be found on the Web; I fear they're long dead.  R.I.P.
+#
+
+
+# Originally from Mike O'Brien@Rand and Howard Katseff at Bell Labs.
+# Highly modified 6/22 by Mike O'Brien.
+# split out into several for the various screen sizes by dave-yost@rand
+# Modifications made 3/82 by Mark Horton
+# Modified by Tom Quarles at UCB for greater efficiency and more diversity
+# status line moved to top of screen, <flash> removed 5/82
+# Some unknown person at SCO then hacked the init strings to make them more
+# efficient.
+#
+# assumes the following setup:
+#   A menu: 0000 1010  0001 0000
+#   B menu: 9600  0100 1000  0000 0000  1000 0000  17  19
+#   C menu: 56   66   0    0    9600  0110 1100
+#   D menu: 0110 1001   1   0
+#
+#	Briefly, the settings are for the following modes:
+#	   (values are for bit set/clear with * indicating our preference
+#	    and the value used to test these termcaps)
+#	Note that many of these settings are irrelevant to the terminfo
+#	and are just set to the default mode of the terminal as shipped
+#	by the factory.
+#
+# A menu: 0000 1010  0001 0000
+#	Block/underline cursor*
+#	blinking/nonblinking cursor*
+#	key click/no key click*
+#	bell/no bell at column 72*
+#
+#	key pad is cursor control*/key pad is numeric
+#	return and line feed/return for <cr> key *
+#	repeat after .5 sec*/no repeat
+#	repeat at 25/15 chars per sec. *
+#
+#	hold data until pause pressed/process data unless pause pressed*
+#	slow scroll/no slow scroll*
+#	Hold in area/don't hold in area*
+#	functions keys have default*/function keys disabled on powerup
+#
+#	show/don't show position of cursor during page transmit*
+#	unused
+#	unused
+#	unused
+#
+# B menu: 9600  0100 1000  0000 0000  1000 0000  17  19
+#	Baud rate (9600*)
+#
+#	2 bits of parity - 00=odd,01=even*,10=space,11=mark
+#	1 stop bit*/2 stop bits
+#	parity error detection off*/on
+#
+#	keyboard local/on line*
+#	half/full duplex*
+#	disable/do not disable keyboard after data transmission*
+#
+#	transmit entire page/stop transmission at cursor*
+#	transfer/do not transfer protected characters*
+#	transmit all characters/transmit only selected characters*
+#	transmit all selected areas/transmit only 1 selected area*
+#
+#	transmit/do not transmit line separators to host*
+#	transmit/do not transmit page tab stops tabs to host*
+#	transmit/do not transmit column tab stop tabs to host*
+#	transmit/do not transmit graphics control (underline,inverse..)*
+#
+#	enable*/disable auto XON/XOFF control
+#	require/do not require receipt of a DC1 from host after each LF*
+#	pause key acts as a meta key/pause key is pause*
+#	unused
+#
+#	unused
+#	unused
+#	unused
+#	unused
+#
+#	XON character (17*)
+#	XOFF character (19*)
+#
+# C menu: 56   66   0    0    9600  0110 1100
+#	number of lines to print data on (printer) (56*)
+#
+#	number of lines on a sheet of paper (printer) (66*)
+#
+#	left margin (printer) (0*)
+#
+#	number of pad chars on new line to printer (0*)
+#
+#	printer baud rate (9600*)
+#
+#	printer parity: 00=odd,01=even*,10=space,11=mark
+#	printer stop bits: 2*/1
+#	print/do not print guarded areas*
+#
+#	new line is: 01=LF,10=CR,11=CRLF*
+#	unused
+#	unused
+#
+# D menu: 0110 1001   1   0
+#	LF is newline/LF is down one line, same column*
+#	wrap to preceding line if move left from col 1*/don't wrap
+#	wrap to next line if move right from col 80*/don't wrap
+#	backspace is/is not destructive*
+#
+#	display*/ignore DEL character
+#	display will not/will scroll*
+#	page/column tab stops*
+#	erase everything*/erase unprotected only
+#
+#	editing extent: 0=display,1=line*,2=field,3=area
+#
+#	unused
+#
+
+annarbor4080|aa4080|Ann Arbor 4080,
+	OTbs, am,
+	cols#80, lines#40,
+	bel=^G, clear=\014$<2>, cr=\r, cub1=^H, cud1=\n, cuf1=^_,
+	cup=\017%p2%{10}%/%{16}%*%p2%{10}%m%+%c%p1%?%p1%{19}%>%t
+	    %{12}%+%;%{64}%+%c,
+	cuu1=^N, home=^K, ht=^I, hts=^]^P1, ind=\n, kbs=^^, kcub1=^H,
+	kcud1=\n, kcuf1=^_, kcuu1=^N, khome=^K, tbc=^\^P^P,
+
+# Strange Ann Arbor terminal from BRL
+aas1901|Ann Arbor K4080 w/S1901 mod,
+	am,
+	cols#80, lines#40,
+	bel=^G, clear=^L, cr=\r, cub1=^H, cud1=\n, cuf1=^_, cuu1=^N,
+	home=^K, ht=^I, ind=\n, kbs=^H, kcub1=^H, kcud1=\n, ll=^O\0c,
+	nel=\r\n,
+
+# If you're using the GNU termcap library, add
+#	:cS=\E[%p1%d;%p2%d;%p3%d;%p4%dp:
+# to these capabilities.  This is the nonstandard GNU termcap scrolling
+# capability, arguments are:
+#   1. Total number of lines on the screen.
+#   2. Number of lines above desired scroll region.
+#   3. Number of lines below (outside of) desired scroll region.
+#   4. Total number of lines on the screen, the same as the first parameter.
+# The generic Ann Arbor entry is the only one that uses this.
+aaa+unk|aaa-unk|Ann Arbor Ambassador (internal - don't use this directly),
+	OTbs, am, km, mc5i, mir, xon,
+	cols#80, it#8,
+	bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z,
+	clear=\E[H\E[J$<156>, cr=\r, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=^K, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M, ed=\E[J,
+	el=\E[K$<5>, home=\E[H, hpa=\E[%p1%{1}%+%dG, ht=^I,
+	hts=\EH, ich=\E[%p1%d@$<4*>, ich1=\E[@$<4>, il=\E[%p1%dL,
+	il1=\E[L$<3>, ind=^K, invis=\E[8m, is1=\E[m\E7\E[H\E9\E8,
+	is3=\E[1Q\E[>20;30l\EP`+x~M\E\\, kbs=^H, kcbt=\E[Z,
+	kclr=\E[J, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A,
+	kdch1=\E[P, kdl1=\E[M, kf1=\EOA, kf10=\EOJ, kf11=\EOK,
+	kf12=\EOL, kf13=\EOM, kf14=\EON, kf15=\EOO, kf16=\EOP,
+	kf17=\EOQ, kf18=\EOR, kf19=\EOS, kf2=\EOB, kf20=\EOT,
+	kf21=\EOU, kf22=\EOV, kf23=\EOW, kf24=\EOX, kf3=\EOC,
+	kf4=\EOD, kf5=\EOE, kf6=\EOF, kf7=\EOG, kf8=\EOH, kf9=\EOI,
+	khome=\E[H, kich1=\E[@, kil1=\E[L, krmir=\E6, mc0=\E[0i,
+	mc4=^C, mc5=\E[v, mc5p=\E[%p1%dv, rc=\E8, rev=\E[7m,
+	rmkx=\EP`>y~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\E
+	     \\,
+	rmm=\E[>52l, rmso=\E[m, rmul=\E[m, sc=\E7,
+	sgr=\E[%?%p1%t7;%;%?%p2%t4;%;%?%p3%t7;%;%?%p4%t5;%;%?%p6%t1;
+	    %;%?%p7%t8;%;m,
+	sgr0=\E[m,
+	smkx=\EP`>z~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\E
+	     \\,
+	smm=\E[>52h, smso=\E[7m, smul=\E[4m, tbc=\E[3g,
+	vpa=\E[%p1%{1}%+%dd, use=ansi+rep,
+
+aaa+rv|Ann Arbor Ambassador in reverse video,
+	blink=\E[5;7m, bold=\E[1;7m, invis=\E[7;8m,
+	is1=\E[7m\E7\E[H\E9\E8, rev=\E[m, rmso=\E[7m, rmul=\E[7m,
+	rs1=\E[H\E[7m\E[J$<156>,
+	sgr=\E[%?%p2%t4;%;%?%p4%t5;%;%?%p6%t1;%;%?%p1%p2%|%p3%!%|%t7
+	    ;%;%?%p7%t8;%;m\016,
+	sgr0=\E[7m\016, smso=\E[m, smul=\E[4;7m,
+# Ambassador with the DEC option, for partial VT100 compatibility.
+aaa+dec|Ann Arbor Ambassador in DEC VT100 mode,
+	acsc=aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}},
+	csr=\E[%i%p1%d;%p2%dr, enacs=\E(B\E)0, rmacs=^O,
+	sgr=\E[%?%p2%t4;%;%?%p4%t5;%;%?%p6%t1;%;%?%p1%p3%|%!%t7;%;%?
+	    %p7%t8;%;m%?%p9%t\016%e\017%;,
+	smacs=^N,
+aaa-18|Ann Arbor Ambassador/18 lines,
+	lines#18,
+	is2=\E7\E[60;0;0;18p\E8,
+	rmcup=\E[60;0;0;18p\E[60;1H\E[K, smcup=\E[18;0;0;18p,
+	use=aaa+unk,
+aaa-18-rv|Ann Arbor Ambassador/18 lines+reverse video,
+	use=aaa+rv, use=aaa-18,
+aaa-20|Ann Arbor Ambassador/20 lines,
+	lines#20,
+	is2=\E7\E[60;0;0;20p\E8,
+	rmcup=\E[60;0;0;20p\E[60;1H\E[K, smcup=\E[20;0;0;20p,
+	use=aaa+unk,
+aaa-22|Ann Arbor Ambassador/22 lines,
+	lines#22,
+	is2=\E7\E[60;0;0;22p\E8,
+	rmcup=\E[60;0;0;22p\E[60;1H\E[K, smcup=\E[22;0;0;22p,
+	use=aaa+unk,
+aaa-24|Ann Arbor Ambassador/24 lines,
+	lines#24,
+	is2=\E7\E[60;0;0;24p\E8,
+	rmcup=\E[60;0;0;24p\E[60;1H\E[K, smcup=\E[24;0;0;24p,
+	use=aaa+unk,
+aaa-24-rv|Ann Arbor Ambassador/24 lines+reverse video,
+	use=aaa+rv, use=aaa-24,
+aaa-26|Ann Arbor Ambassador/26 lines,
+	lines#26,
+	is2=\E7\E[60;0;0;26p\E8,
+	rmcup=\E[60;0;0;26p\E[26;1H\E[K,
+	smcup=\E[H\E[J$<156>\E[26;0;0;26p, use=aaa+unk,
+aaa-28|Ann Arbor Ambassador/28 lines,
+	lines#28,
+	is2=\E7\E[60;0;0;28p\E8,
+	rmcup=\E[60;0;0;28p\E[28;1H\E[K,
+	smcup=\E[H\E[J$<156>\E[28;0;0;28p, use=aaa+unk,
+aaa-30-s|aaa-s|Ann Arbor Ambassador/30 lines w/status,
+	eslok, hs,
+	lines#29,
+	dsl=\E7\E[60;0;0;30p\E[1;1H\E[K\E[H\E8\r\n\E[K,
+	fsl=\E[>51l, is2=\r\n\E[A\E7\E[60;1;0;30p\E8,
+	rmcup=\E[60;1;0;30p\E[29;1H\E[K,
+	smcup=\E[H\E[J$<156>\E[30;1;0;30p\E[30;1H\E[K,
+	tsl=\E[>51h\E[1;%p1%dH\E[2K, use=aaa+unk,
+aaa-30-s-rv|aaa-s-rv|Ann Arbor Ambassador/30 lines+status+reverse video,
+	use=aaa+rv, use=aaa-30-s,
+aaa-s-ctxt|aaa-30-s-ctxt|Ann Arbor Ambassador/30 lines+status+save context,
+	rmcup=\E[60;1;0;30p\E[59;1H\E[K,
+	smcup=\E[30;1H\E[K\E[30;1;0;30p, use=aaa-30-s,
+aaa-s-rv-ctxt|aaa-30-s-rv-ct|Ann Arbor Ambassador/30 lines+status+save context+reverse video,
+	rmcup=\E[60;1;0;30p\E[59;1H\E[K,
+	smcup=\E[30;1H\E[K\E[30;1;0;30p, use=aaa-30-s-rv,
+aaa|aaa-30|ambas|ambassador|Ann Arbor Ambassador/30 lines,
+	lines#30,
+	is2=\E7\E[60;0;0;30p\E8,
+	rmcup=\E[60;0;0;30p\E[30;1H\E[K,
+	smcup=\E[H\E[J$<156>\E[30;0;0;30p, use=aaa+unk,
+aaa-30-rv|aaa-rv|Ann Arbor Ambassador/30 lines in reverse video,
+	use=aaa+rv, use=aaa-30,
+aaa-30-ctxt|aaa-ctxt|Ann Arbor Ambassador/30 lines; saving context,
+	rmcup=\E[60;0;0;30p\E[60;1H\E[K, smcup=\E[30;0;0;30p,
+	use=aaa-30,
+aaa-30-rv-ctxt|aaa-rv-ctxt|Ann Arbor Ambassador/30 lines reverse video; saving context,
+	rmcup=\E[60;0;0;30p\E[60;1H\E[K, smcup=\E[30;0;0;30p,
+	use=aaa+rv, use=aaa-30,
+aaa-36|Ann Arbor Ambassador/36 lines,
+	lines#36,
+	is2=\E7\E[60;0;0;36p\E8,
+	rmcup=\E[60;0;0;36p\E[36;1H\E[K,
+	smcup=\E[H\E[J$<156>\E[36;0;0;36p, use=aaa+unk,
+aaa-36-rv|Ann Arbor Ambassador/36 lines+reverse video,
+	use=aaa+rv, use=aaa-36,
+aaa-40|Ann Arbor Ambassador/40 lines,
+	lines#40,
+	is2=\E7\E[60;0;0;40p\E8,
+	rmcup=\E[60;0;0;40p\E[40;1H\E[K,
+	smcup=\E[H\E[J$<156>\E[40;0;0;40p, use=aaa+unk,
+aaa-40-rv|Ann Arbor Ambassador/40 lines+reverse video,
+	use=aaa+rv, use=aaa-40,
+aaa-48|Ann Arbor Ambassador/48 lines,
+	lines#48,
+	is2=\E7\E[60;0;0;48p\E8,
+	rmcup=\E[60;0;0;48p\E[48;1H\E[K,
+	smcup=\E[H\E[J$<156>\E[48;0;0;48p, use=aaa+unk,
+aaa-48-rv|Ann Arbor Ambassador/48 lines+reverse video,
+	use=aaa+rv, use=aaa-48,
+aaa-60-s|Ann Arbor Ambassador/59 lines+status,
+	eslok, hs,
+	lines#59,
+	dsl=\E7\E[60;0;0;60p\E[1;1H\E[K\E[H\E8\r\n\E[K,
+	fsl=\E[>51l, is2=\r\n\E[A\E7\E[60;1;0;60p\E8,
+	tsl=\E[>51h\E[1;%p1%dH\E[2K, use=aaa+unk,
+aaa-60-s-rv|Ann Arbor Ambassador/59 lines+status+reverse video,
+	use=aaa+rv, use=aaa-60-s,
+aaa-60-dec-rv|Ann Arbor Ambassador/DEC mode+59 lines+status+rev video,
+	use=aaa+dec, use=aaa+rv, use=aaa-60-s,
+aaa-60|Ann Arbor Ambassador/60 lines,
+	lines#60,
+	is2=\E7\E[60;0;0;60p\E[1Q\E[m\E[>20;30l\E8,
+	use=aaa+unk,
+aaa-60-rv|Ann Arbor Ambassador/60 lines+reverse video,
+	use=aaa+rv, use=aaa-60,
+aaa-db|Ann Arbor Ambassador 30/destructive backspace,
+	OTbs@,
+	cub1=\E[D, is3=\E[1Q\E[m\E[>20l\E[>30h, use=aaa-30,
+
+guru|guru-33|guru+unk|Ann Arbor guru/33 lines 80 cols,
+	lines#33,
+	flash=\E[>59h$<100>\E[>59l,
+	is2=\E7\E[255;0;0;33;80;80p\E8\E[J, is3=\E[>59l,
+	rmcup=\E[255p\E[255;1H\E[K, smcup=\E[33p, use=aaa+unk,
+guru+rv|guru changes for reverse video,
+	flash=\E[>59l$<100>\E[>59h, is3=\E[>59h,
+guru-rv|guru-33-rv|Ann Arbor guru/33 lines+reverse video,
+	use=guru+rv, use=guru-33,
+guru+s|guru status line,
+	eslok, hs,
+	dsl=\E7\E[;0p\E[1;1H\E[K\E[H\E8\r\n\E[K, fsl=\E[>51l,
+	rmcup=\E[255;1p\E[255;1H\E[K, smcup=,
+	tsl=\E[>51h\E[1;%p1%dH\E[2K,
+guru-nctxt|guru with no saved context,
+	smcup=\E[H\E[J$<156>\E[33p\E[255;1H\E[K, use=guru,
+guru-s|guru-33-s|Ann Arbor guru/33 lines+status,
+	lines#32,
+	is2=\r\n\E[A\E7\E[255;1;0;33;80;80p\E8\E[J,
+	smcup=\E[33;1p\E[255;1H\E[K, use=guru+s, use=guru+unk,
+guru-24|Ann Arbor guru 24 lines,
+	cols#80, lines#24,
+	is2=\E7\E[255;0;0;24;80;80p\E8\E[J, smcup=\E[24p,
+	use=guru+unk,
+guru-44|Ann Arbor guru 44 lines,
+	cols#97, lines#44,
+	is2=\E7\E[255;0;0;44;97;100p\E8\E[J, smcup=\E[44p,
+	use=guru+unk,
+guru-44-s|Ann Arbor guru/44 lines+status,
+	lines#43,
+	is2=\r\n\E[A\E7\E[255;1;0;44;80;80p\E8\E[J,
+	smcup=\E[44;1p\E[255;1H\E[K, use=guru+s, use=guru+unk,
+guru-76|guru with 76 lines by 89 cols,
+	cols#89, lines#76,
+	is2=\E7\E[255;0;0;76;89;100p\E8\E[J, smcup=\E[76p,
+	use=guru+unk,
+guru-76-s|Ann Arbor guru/76 lines+status,
+	cols#89, lines#75,
+	is2=\r\n\E[A\E7\E[255;1;0;76;89;100p\E8\E[J,
+	smcup=\E[76;1p\E[255;1H\E[K, use=guru+s, use=guru+unk,
+guru-76-lp|guru-lp|guru with page bigger than line printer,
+	cols#134, lines#76,
+	is2=\E7\E[255;0;0;76;134;134p\E8\E[J, smcup=\E[76p,
+	use=guru+unk,
+guru-76-w|guru 76 lines by 178 cols,
+	cols#178, lines#76,
+	is2=\E7\E[255;0;0;76;178;178p\E8\E[J, smcup=\E[76p,
+	use=guru+unk,
+guru-76-w-s|Ann Arbor guru/76 lines+status+wide,
+	cols#178, lines#75,
+	is2=\r\n\E[A\E7\E[255;1;0;76;178;178p\E8\E[J,
+	smcup=\E[76;1p\E[255;1H\E[K, use=guru+s, use=guru+unk,
+guru-76-wm|guru 76 lines by 178 cols with 255 cols memory,
+	cols#178, lines#76,
+	is2=\E7\E[255;0;0;76;178;255p\E8\E[J, smcup=\E[76p,
+	use=guru+unk,
+aaa-rv-unk|Ann Arbor unknown type,
+	lh#0, lw#0, nlab#0,
+	blink=\E[5;7m, bold=\E[1;7m, home=\E[H, invis=\E[7;8m,
+	is1=\E[7m\E7\E[H\E9\E8, rev=\E[m, rmso=\E[7m, rmul=\E[7m,
+	rs1=\E[H\E[7m\E[J,
+	sgr=\E[%?%p6%t1;%;%?%p2%t4;%;%?%p3%t7;%;%?%p4%t5;%;%?%p1%!%t
+	    7;%;%?%p7%t8;%;m,
+	sgr0=\E[7m, smso=\E[m, smul=\E[4;7m,
+
+#### Applied Digital Data Systems (adds)
+#
+# ADDS itself is long gone.  ADDS was bought by NCR, and the same group made
+# ADDS and NCR terminals.  When AT&T and NCR merged, the engineering for
+# terminals was merged again.  Then AT&T sold the terminal business to
+# SunRiver, which later changed its  name to Boundless Technologies.  The
+# engineers from Teletype, AT&T terminals, ADDS, and NCR (who are still there
+# as of early 1995) are at:
+#
+#	Boundless Technologies
+#	100 Marcus Boulevard
+#	Hauppauge, NY 11788-3762
+#	Vox: (800)-231-5445
+#	Fax: (516)-342-7378
+#	Web: http://boundless.com
+#
+# Their voice mail used to describe the place as "SunRiver (formerly ADDS)".
+# In 1995 Boundless acquired DEC's terminals business.
+#
+
+# Regent: lowest common denominator, works on all regents.
+# (regent: renamed ":bc:" to ":le:" -- esr)
+regent|ADDS Regent Series,
+	OTbs, am,
+	cols#80, lines#24,
+	bel=^G, clear=^L, cr=\r, cub1=^U, cud1=\n, cuf1=^F, cuu1=^Z,
+	home=\EY\s\s, ind=\n, ll=^A,
+# Regent 100 has a bug where if computer sends escape when user is holding
+# down shift key it gets confused, so we avoid escape.
+regent100|ADDS Regent 100,
+	xmc#1,
+	bel=^G,
+	cup=\013%p1%'\s'%+%c\020%p2%{10}%/%{16}%*%p2%{10}%m%+%c,
+	kf0=^B1\r, kf1=^B2\r, kf2=^B3\r, kf3=^B4\r, kf4=^B5\r,
+	kf5=^B6\r, kf6=^B7\r, kf7=^B8\r, lf0=F1, lf1=F2, lf2=F3,
+	lf3=F4, lf4=F5, lf5=F6, lf6=F7, lf7=F8, rmso=\E0@, rmul=\E0@,
+	sgr0=\E0@, smso=\E0P, smul=\E0`, use=regent,
+regent20|ADDS Regent 20,
+	bel=^G, cup=\EY%p1%{32}%+%c%p2%{32}%+%c, ed=\Ek, el=\EK,
+	use=regent,
+regent25|ADDS Regent 25,
+	bel=^G, kcub1=^U, kcud1=\n, kcuf1=^F, kcuu1=^Z, khome=^A,
+	use=regent20,
+regent40|ADDS Regent 40,
+	xmc#1,
+	bel=^G, dl1=\El$<2*>, il1=\EM$<2*>, kf1=^B1\r, kf2=^B2\r,
+	kf3=^B3\r, kf4=^B4\r, kf5=^B5\r, kf6=^B6\r, kf7=^B7\r,
+	kf8=^B8\r, lf0=F1, lf1=F2, lf2=F3, lf3=F4, lf4=F5, lf5=F6,
+	lf6=F7, lf7=F8, rmso=\E0@, rmul=\E0@, sgr0=\E0@, smso=\E0P,
+	smul=\E0`, use=regent25,
+regent40+|ADDS Regent 40+,
+	is2=\EB, use=regent40,
+# It uses a different code for mapping acs vs dim/blink.
+regent60|regent200|adds200|ADDS Regent 60,
+	acsc=jLkDl@mHnhq`tXuTv\\wPxd, dch1=\EE, ed=\Ek,
+	is2=\EV\EB, kbs=^H, kcbt=\EO, kdch1=\EE, kich1=\EF,
+	krmir=\EF, rmacs=\E2, rmir=\EF, rmso=\ER\E0@\EV, smacs=\E1,
+	smir=\EF, smso=\ER\E0P\EV, kF1=^B!\r, kF2=^B"\r, kF3=^B#\r,
+	kF4=^B$\r, kF5=^B%\r, kF6=^B&\r, kF7=^B'\r, kF8=^B(\r,
+	use=regent40+,
+# From: <edward@onyx.berkeley.edu> Thu Jul  9 09:27:33 1981
+# (viewpoint: added <kcuf1>, function key, and <dl1> capabilities -- esr)
+viewpoint|addsviewpoint|ADDS Viewpoint,
+	OTbs, am,
+	cols#80, lines#24,
+	bel=^G, clear=^L, cnorm=\017\E0`, cr=\r, cub1=^H, cud1=\n,
+	cuf1=^F, cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=^Z,
+	cvvis=\017\E0P, dl1=\El, ed=\Ek$<16.1*>, el=\EK$<16>,
+	ind=\n, is2=\017\E0`, kcub1=^U, kcud1=\n, kcuf1=^F, kcuu1=^Z,
+	kf0=^B1, kf2=^B2, kf3=^B!, kf4=^B", kf5=^B#, khome=^A, ll=^A,
+	rmso=^O, rmul=^O, sgr0=^O, smso=^N, smul=^N,
+# Some viewpoints have bad ROMs that foo up on ^O
+screwpoint|ADDS Viewpoint with ^O bug,
+	cvvis@, rmso@, rmul@, smso@, smul@, use=viewpoint,
+
+# From: Jay S. Rouman <jsr@dexter.mi.org> 5 Jul 92
+# The <civis>/<cnorm>/<sgr>/<sgr0> strings were added by ESR from specs.
+# Theory; the vp3a+ wants \E0%c to set highlights, where normal=01000000,
+# underline=01100000, rev=01010000, blink=01000010,dim=01000001,
+# invis=01000100 and %c is the logical or of desired attributes.
+# There is also a `tag bit' enabling attributes, set by \E) and unset by \E(.
+#
+# Update by TD - 2004:
+# Adapted from
+#	https://web.archive.org/web/19990922005103/http://www.cs.utk.edu/~shuford/terminal/adds_viewpoint_news.txt
+#
+# COMMANDS                        ASCII CODE
+#
+# Address, Absolute               ESC,=,row,column
+# Beep                            BEL
+# Aux Port Enable                 ESC,@
+# Aux Port Disable                ESC,A
+# Backspace                       BS
+# Cursor back                     BS
+# Cursor down                     LF
+# Cursor forward                  FF
+# Cursor home                     RS
+# Cursor up                       VT
+# Cursor suppress                 ETB
+# Cursor enable                   CAN
+# Erase to end of line            ESC,T
+# Erase to end of page            ESC,Y
+# Erase screen                    SUB
+# Keyboard lock                   SI
+# Keyboard unlock                 SO
+# Read current cursor position    ESC,?
+# Set Attribute                   ESC,0,x  (see below for values of x)
+# Tag bit reset                   ESC,(
+# Tag bit set                     ESC,)
+# Transparent Print on            ESC,3
+# Transparent Print off           ESC,4
+#
+#
+# ATTRIBUTES
+#
+# Normal                          @	0100
+# Half Intensity                  A	0101
+# Blinking                        B	0102
+# Half Intensity Blinking         C	0103
+# Reverse Video                   P	0120
+# Reverse Video Half Intensity    Q	0121
+# Reverse Video Blinking          R	0122
+# Reverse Video Half Intensity
+#    Blinking                     S	0123
+# Underlined                      `	0140
+# Underlined Half Intensity       a	0141
+# Underlined Blinking             b	0142
+# Underlined Half Intensity
+#    Blinking                     c	0143
+# Video suppress                  D	0104
+vp3a+|viewpoint3a+|ADDS Viewpoint 3a+,
+	am, bw,
+	cols#80, it#8, lines#24,
+	blink=\E0B\E), civis=^W, clear=\E*$<80>, cnorm=^X, cr=\r,
+	cub1=^H, cud1=\n, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dim=\E0A\E),
+	ed=\EY$<80>, el=\ET, home=^^, ht=^I, ind=\n, invis=\E0D\E),
+	kbs=^H, kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K, khome=^^,
+	nel=\r\n, rev=\E0P\E), rmso=\E(,
+	sgr=%?%p1%p2%|%p3%|%p4%|%p5%|%p7%|%t\E0%{64}%?%p1%t%{17}%|%;
+	    %?%p2%t%{32}%|%;%?%p3%t%{16}%|%;%?%p4%t%{2}%|%;%?%p5%t
+	    %{1}%|%;%c%?%p7%tD%;\E)%e\E(%;,
+	sgr0=\E(, smso=\E0Q\E), smul=\E0`\E),
+vp60|viewpoint60|addsvp60|ADDS Viewpoint60,
+	use=regent40,
+#
+# adds viewpoint 90 - from cornell
+# Note:  emacs sends ei occasionally to insure the terminal is out of
+#        insert mode. This unfortunately puts the viewpoint90 IN insert
+#        mode.  A hack to get around this is <ich1=\EF\s\EF^U>.  (Also,
+#   -    :ei=:im=: must be present in the termcap translation.)
+#   -    <xhp> indicates glitch that attributes stick to location
+#   -    <msgr> means it's safe to move in standout mode
+#   -    <clear=\EG\Ek>: clears screen and visual attributes without affecting
+#               the status line
+# Function key and label capabilities merged in from SCO.
+vp90|viewpoint90|ADDS Viewpoint 90,
+	OTbs, bw, msgr, xhp,
+	cols#80, lines#24,
+	clear=\EG\Ek, cub1=^H, cud1=\n, cuf1=^F,
+	cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=^Z, dch1=\EE,
+	dl1=\El, ed=\Ek, el=\EK, home=\EY\s\s, ht=^I,
+	ich1=\EF \EF\025, ind=\n, kbs=^H, kcub1=^U, kcud1=\n,
+	kcuf1=^F, kcuu1=^Z, kf0=^B1\r, kf1=^B2\r, kf10=^B;\r,
+	kf2=^B3\r, kf3=^B4\r, kf4=^B5\r, kf5=^B6\r, kf6=^B7\r,
+	kf7=^B8\r, kf8=^B9\r, kf9=^B:\r, khome=^A, lf0=F1, lf1=F2,
+	lf10=F11, lf2=F3, lf3=F4, lf4=F5, lf5=F6, lf6=F7, lf7=F8, lf8=F9,
+	lf9=F10, ll=^A, rmso=\ER\E0@\EV, rmul=\ER\E0@\EV,
+	sgr0=\ER\E0@\EV, smso=\ER\E0Q\EV, smul=\ER\E0`\EV,
+# Note: if return acts weird on a980, check internal switch #2
+# on the top chip on the CONTROL pc board.
+adds980|a980|ADDS Consul 980,
+	OTbs, am,
+	cols#80, lines#24,
+	bel=^G, clear=\014$<1>\013@, cr=\r, cub1=^H, cud1=\n,
+	cuf1=\E^E01, cup=\013%p1%{64}%+%c\E\005%p2%2d,
+	dl1=\E\017$<13>, il1=\E\016$<13>, ind=\n, kf0=\E0, kf1=\E1,
+	kf2=\E2, kf3=\E3, kf4=\E4, kf5=\E5, kf6=\E6, kf7=\E7, kf8=\E8,
+	kf9=\E9, rmso=^O, sgr0=^O, smso=^Y^^^N,
+
+#### C. Itoh Electronics
+#
+# As of 1995 these people no longer make terminals (they're still in the
+# printer business).  Their terminals were all clones of the DEC VT series.
+# They're located in Orange County, CA.
+#
+
+# CIT 80  - vt-52 emulator, the termcap has been modified to remove
+#           the delay times and do an auto tab set rather than the indirect
+#           file used in vt100.
+cit80|cit-80|citoh 80,
+	OTbs, am,
+	cols#80, lines#24,
+	clear=\E[H\EJ, cr=\r, cub1=^H, cud1=\E[B, cuf1=\E[C,
+	cup=\E[%i%p1%2d;%p2%2dH, cuu1=\E[A, ed=\EJ, el=\EK, ff=^L,
+	ind=\n, is2=\E>, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC,
+	kcuu1=\EOA, rmkx=\E[?1l\E>, smkx=\E[?1h\E=,
+# From: Tim Wood <mtxinu!sybase!tim> Fri Sep 27 09:39:12 PDT 1985
+# (cit101: added <rmam>/<smam> based on init string, merged this with c101 -- esr)
+cit101|citc|C. Itoh fast VT100,
+	OTbs, am, xenl,
+	cols#80, lines#24,
+	bel=^G, clear=\E[H\E[2J, cnorm=\E[V\E8, cub1=^H, cud1=\E[B,
+	cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A,
+	cvvis=\E7\E[U, dch1=\E[P, dl1=\E[M, ed=\E[J, el=\E[K,
+	flash=\E[?5h$<200/>\E[?5l, ich1=\E[@, il1=\E[L,
+	is2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h\E[3g\E[>5g,
+	kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
+	rmam=\E[?7l, rmkx=\E[?1l\E>, rmso=\E[m, rmul=\E[m,
+	sgr0=\E[m, smam=\E[?7h, smkx=\E[?1h\E=, smso=\E[7m,
+	smul=\E[4m,
+# CIE Terminals CIT-101e from Geoff Kuenning <callan!geoff> via BRL
+# The following termcap entry was created from the Callan cd100 entry.  The
+# last two lines (with the capabilities in caps) are used by RM-cobol to allow
+# full selection of combinations of reverse video, underline, and blink.
+# (cit101e: removed unknown :f0=\EOp:f1=\EOq:f2=\EOr:f3=\EOs:f4=\EOt:f5=\EOu:\
+# f6=\EOv:f7=\EOw:f8=\EOx:f9=\EOy:AB=\E[0;5m:AL=\E[m:AR=\E[0;7m:AS=\E[0;5;7m:\
+# :NB=\E[0;1;5m:NM=\E[0;1m:NR=\E[0;1;7m:NS=\E[0;1;5;7m: -- esr)
+cit101e|C. Itoh CIT-101e,
+	OTbs, OTpt, am, mir, msgr,
+	cols#80, it#8, lines#24,
+	acsc=, clear=\E[H\E[J, cnorm=, csr=\E[%i%p1%2d;%p2%2dr,
+	cub1=\E[D, cud1=\E[B, cuf1=\E[C, cup=\E[%i%p1%2d;%p2%2dH,
+	cuu1=\E[A, cvvis=\E[?1l\E[?4l\E[?7h, dch1=\E[P, dl1=\E[M,
+	ed=\E[J, el=\E[K, if=/usr/share/tabset/vt100, il1=\E[L,
+	kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kf0=\EOT,
+	kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf5=\EOm, kf6=\EOl,
+	kf7=\EOM, kf8=\EOn, rc=\E8, ri=\EM, rmacs=^O, rmir=\E[4l,
+	rmkx=\E>, rmso=\E[m, rmul=\E[m, sc=\E7, smacs=^N, smir=\E[4h,
+	smkx=\E=, smso=\E[7m, smul=\E[4m,
+# From: David S. Lawyer, June 1997:
+# The CIT 101-e was made in Japan in 1983-4 and imported by CIE
+# Terminals in Irvine, CA.  It was part of CITOH Electronics.  In the
+# late 1980's CIT Terminals went out of business.
+# There is no need to use the initialization string is=... (by invoking
+# tset or setterm etc.) provided that the terminal has been manually set
+# up (and the setup saved with ^S) to be compatible with this termcap.  To be
+# compatible it should be in ANSI mode (not VT52).   A set-up that
+# works is to set all the manually settable stuff to factory defaults
+# by pressing ^D in set-up mode.  Then increase the brightness with the
+# up-arrow key since the factory default will likely be dim on an old
+# terminal.  Then change any options you want (provided that they are
+# compatible with the termcap).  For my terminal I set: Screen
+# Background: light; Keyclicks: silent; Auto wraparound: on; CRT saver:
+# on.  I also set up mine for parity (but you may not need it).  Then
+# save the setup with ^S.
+# (cit101e-rv: added empty <rmcup> to suppress a tic warning. --esr)
+cit101e-rv|C. Itoh CIT-101e (sets reverse video),
+	am, eo, mir, msgr, xenl, xon,
+	cols#80, it#8, lines#24,
+	OTnl=\EM, bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z,
+	civis=\E[1v, clear=\E[H\E[J, cnorm=\E[0;3;4v, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\E[B, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	cvvis=\E[3;5v, dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM,
+	dl1=\E[M, ed=\E[J, el=\E[K, flash=\E[?5l$<200/>\E[?5h,
+	home=\E[H, hpa=\E[%i%p1%dG, ht=^I, hts=\EH, ich=\E[%p1%d@,
+	ich1=\E[@, il=\E[%p1%dL, il1=\E[L, ind=\n,
+	is2=\E<\E>\E[?1l\E[?3l\E[?4l\E[?5h\E[?7h\E[?8h\E[3g\E[>5g\E(
+	    B\E[m\E[20l\E[1;24r\E[24;1H,
+	kbs=^?, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A,
+	kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, nel=\EE, rc=\E8,
+	rev=\E[7m, ri=\EM, rmcup=, rmir=\E[4l, rmso=\E[m, rmul=\E[m,
+	rs1=\Ec\E[?7h\E[>5g, sc=\E7, sgr0=\E[m,
+	smcup=\E[>5g\E[?7h\E[?5h, smir=\E[4h, smso=\E[7m,
+	smul=\E[4m, tbc=\E[3g, u6=\E[%i%p1%d;%p2%dR, u8=\E[?6c,
+	use=ansi+enq, use=ecma+index,
+cit101e-n|CIT-101e w/o am,
+	am@,
+	cvvis=\E[?1l\E[?4l\E[?7l, kbs=^H, kcub1=^H, kcud1=\n,
+	use=cit101e,
+cit101e-132|CIT-101e with 132 cols,
+	cols#132,
+	kbs=^H, kcub1=^H, kcud1=\n, use=cit101e,
+cit101e-n132|CIT-101e with 132 cols w/o am,
+	am@,
+	cols#132,
+	cvvis=\E[?1l\E[?4l\E[?7l, kbs=^H, kcub1=^H, kcud1=\n,
+	use=cit101e,
+# CIE Terminals CIT-500 from BRL
+# The following SET-UP modes are assumed for normal operation:
+#	GENERATE_XON/XOFF:YES	DUPLEX:FULL		NEWLINE:OFF
+#	AUTOWRAP:ON		MODE:ANSI		SCREEN_LENGTH:64_LINES
+#	DSPLY_CNTRL_CODES?NO	PAGE_WIDTH:80		EDIT_MODE:OFF
+# Other SET-UP modes may be set for operator convenience or communication
+# requirements.
+# Hardware tabs are assumed to be set every 8 columns; they can be set up
+# by the "reset", "tset", or "tabs" utilities.  No delays are specified; use
+# "stty ixon -ixany" to enable DC3/DC1 flow control!
+# (cit500: I added <rmam>/<smam> based on the init string -- esr)
+cit500|CIE Terminals CIT-500,
+	OTbs, OTpt, mir, msgr, xon,
+	OTkn#10, cols#80, it#8, lines#64, vt#3,
+	acsc=, bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z,
+	clear=\E[H\E[J, cr=\r, csr=\E[%i%p1%d;%p2%dr,
+	cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=\n,
+	cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH,
+	cuu=\E[%p1%dA, cuu1=\EM, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M,
+	ed=\EJ, el=\EK, home=\E[H, ht=^I, hts=\EH, il=\E[%p1%dL,
+	il1=\E[L, ind=\n, is2=\E<\E)0, kbs=^H, kcbt=\E[Z, kcub1=\EOD,
+	kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kdch1=\E[P, kdl1=\E[M,
+	ked=\EJ, kel=\EK, kf0=\EOP, kf1=\EOQ, kf2=\EOR, kf3=\EOS,
+	kf4=\EOU, kf5=\EOV, kf6=\EOW, kf7=\EOX, kf8=\EOY, kf9=\EOZ,
+	khome=\E[H, kich1=\E[4h, kil1=\E[L, krmir=\E[4l, lf0=PF1,
+	lf1=PF2, lf2=PF3, lf3=PF4, lf4=F15, lf5=F16, lf6=F17, lf7=F18,
+	lf8=F19, lf9=F20, ll=\E[64H, nel=\EE, rc=\E8, rev=\E[7m,
+	ri=\EM, rmacs=^O, rmam=\E[?7l, rmir=\E[4l, rmkx=\E[?1l\E>,
+	rmso=\E[m, rmul=\E[m,
+	rs1=\E<\E2\E[20l\E[?6l\E[r\E[m\E[q\E(B\017\E)0\E>,
+	sc=\E7, sgr0=\E[m, smacs=^N, smam=\E[?7h, smir=\E[4h,
+	smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m, tbc=\E[3g,
+
+# C. Itoh printers begin here
+citoh|ci8510|8510|C. Itoh 8510a,
+	cols#80, it#8,
+	bold=\E!, cub1@,
+	is2=\E(009\,017\,025\,033\,041\,049\,057\,065\,073.,
+	rep=\ER%p2%03d%p1%c, ri=\Er, rmul=\EY, sgr0=\E"\EY,
+	smul=\EX, use=lpr,
+citoh-pica|citoh in pica,
+	is1=\EN, use=citoh,
+citoh-elite|citoh in elite,
+	cols#96,
+	is1=\EE,
+	is2=\E(009\,017\,025\,033\,041\,049\,057\,065\,073\,081\,089
+	    .,
+	use=citoh,
+citoh-comp|citoh in compressed,
+	cols#136,
+	is1=\EQ,
+	is2=\E(009\,017\,025\,033\,041\,049\,057\,065\,073\,081\,089
+	    \,097\,105\,113\,121\,129.,
+	use=citoh,
+# citoh has infinite cols because we don't want lp ever inserting \n\t**.
+citoh-prop|citoh-ps|ips|citoh in proportional spacing mode,
+	cols#0x7fff,
+	is1=\EP, use=citoh,
+citoh-6lpi|citoh in 6 lines per inch mode,
+	is3=\EA, use=citoh,
+citoh-8lpi|citoh in 8 lines per inch mode,
+	lines#88,
+	is3=\EB, use=citoh,
+
+#### Control Data (cdc)
+#
+
+cdc456|CDC 456 terminal,
+	OTbs, am,
+	cols#80, lines#24,
+	bel=^G, clear=^Y^X, cr=\r, cub1=^H, cud1=\n, cuf1=^L,
+	cup=\E1%p1%{32}%+%c%p2%{32}%+%c, cuu1=^Z, dl1=\EJ, ed=^X,
+	el=^V, home=^Y, il1=\EL, ind=\n,
+
+# Assorted CDC terminals from BRL (improvements by DAG & Ferd Brundick)
+cdc721|CDC Viking,
+	OTbs, am,
+	cols#80, lines#24,
+	clear=^L, cuf1=^X, cup=\002%p2%{32}%+%c%p1%{32}%+%c,
+	cuu1=^W, el=^K, home=^Y, kcub1=^H, kcud1=\n, kcuf1=^I,
+	kcuu1=^W, khome=^Y,
+cdc721ll|CDC Viking with long lines,
+	OTbs, am,
+	cols#132, lines#24,
+	clear=^L, cuf1=^X, cup=\002%p2%{32}%+%c%p1%{32}%+%c,
+	cuu1=^W, el=^K, home=^Y, kcub1=^H, kcud1=\n, kcuf1=^I,
+	kcuu1=^W, khome=^Y,
+# (cdc752: the BRL entry had :ll=\E1  ^Z: commented out
+cdc752|CDC 752,
+	OTbs, am, bw, xhp,
+	cols#80, lines#24,
+	bel=^G, clear=\030\E1\s\s, cr=\r, cub1=^H, cud1=\n, cuf1=^U,
+	cup=\E1%p2%{32}%+%c%p1%{32}%+%c, cuu1=^Z, el=^V,
+	home=\E1\s\s, ind=\n, ll=^Y, rs1=\E1  \030\002\003\017,
+# CDC 756
+# The following switch/key settings are assumed for normal operation:
+#	96 chars	SCROLL		FULL duplex	not BLOCK
+# Other switches may be set according to communication requirements.
+# Insert/delete-character cannot be used, as the whole display is affected.
+# "so" & "se" are commented out until jove handles "sg" correctly.
+cdc756|CDC 756,
+	OTbs, am, bw,
+	OTkn#10, cols#80, lines#24,
+	bel=^G, clear=^Y^X, cr=\r, cub1=^H, cud1=\n, cuf1=^U,
+	cup=\E1%p2%{32}%+%c%p1%{32}%+%c, cuu1=^Z,
+	dl1=\EJ$<6*/>, ed=^X, el=^V, home=^Y, il1=\EL$<6*/>, ind=\n,
+	kbs=^H, kcub1=^H, kcud1=\n, kcuf1=^U, kcuu1=^Z, kdch1=\EI,
+	kdl1=\EL, ked=^X, kel=^V, kf0=\EA, kf1=\EB, kf2=\EC, kf3=\ED,
+	kf4=\EE, kf5=\EF, kf6=\EG, kf7=\EH, kf8=\Ea, kf9=\Eb, khome=^Y,
+	khts=^O, kich1=\EK, kil1=\EL, lf0=F1, lf1=F2, lf2=F3, lf3=F4,
+	lf4=F5, lf5=F6, lf6=F7, lf7=F8, lf8=F9, lf9=F10, ll=^Y^Z,
+	rs1=^Y^X^B^C^O,
+#
+# CDC 721 from Robert Viduya, Ga. Tech. <ihnp4!gatech!gitpyr!robert> via BRL.
+#
+# Part of the long initialization string defines the "DOWN" key to the left
+# of the tab key to send an ESC.  The real ESC key is positioned way out
+# in right field.
+#
+# The termcap won't work in 132 column mode due to the way it it moves the
+# cursor.  Termcap doesn't have the capability (as far as I could tell) to
+# handle the 721 in 132 column mode.
+#
+# (cdc721: changed :ri: to :sr: -- esr)
+cdc721-esc|Control Data 721,
+	OTbs, OTpt, am, bw, msgr, xon,
+	OTkn#10, cols#80, it#8, lines#30,
+	bel=^G, blink=^N, cbt=^^^K, clear=^L, cub1=^H, cud1=^Z,
+	cuf1=^X, cup=\002%p2%{32}%+%c%p1%{32}%+%c, cuu1=^W,
+	dch1=^^N, dim=^\, dl1=^^Q, ed=^^P, el=^K, home=^Y, hts=^^^RW,
+	ich1=^^O, il1=^^R, ind=\036W =\036U, invis=^^^R[,
+	is2=\036\022B\003\036\035\017\022\025\035\036E\036\022H\036
+	    \022J\036\022L\036\022N\036\022P\036\022Q\036\022\036
+	    \022\^\036\022b\036\022i\036W\s=\036\022Z\036\011C1-`\s`
+	    !k/o,
+	kbs=^H, kcub1=^H, kcud1=^Z, kcuf1=^X, kcuu1=^W, kf0=^^q,
+	kf1=^^r, kf2=^^s, kf3=^^t, kf4=^^u, kf5=^^v, kf6=^^w, kf7=^^x,
+	kf8=^^y, kf9=^^z, khome=^Y, ll=^B =, rev=^^D,
+	ri=\036W =\036V, rmir=, rmkx=^^^Rl, rmso=^^E, rmul=^],
+	sgr0=^O^U^]^^E^^^R\\, smir=, smkx=^^^Rk, smso=^^D, smul=^\,
+	tbc=^^^RY,
+
+#### Getronics
+#
+# Getronics is a Dutch electronics company that at one time was called
+# `Geveke' and made async terminals; but (according to the company itself!)
+# they've lost all their documentation on the command set.  The hardware
+# documentation suggests the terminals were actually manufactured by a
+# Taiwanese electronics company named Cal-Comp.  There are known
+# to have been at least two models, the 33 and the 50.
+#
+
+# The 50 seems to be a top end VT220 clone, with the addition of a higher
+# screen resolution, a larger screen, at least 1 page of memory above and
+# below the screen, apparently pages of memory right and left of the screen
+# which can be panned, and about 75 function keys (15 function keys x normal,
+# shift, control, func A, func B). It also has more setup possibilities than
+# the VT220. The monitor case is dated November 1978 and the keyboard case is
+# May 1982.
+#
+# The VT100 emulation works as is.  The entry below describes the rather
+# non-conformant (but more featureful) ANSI mode.
+#
+# From: Stephen Peterson <stv@utrecht.ow.nl>, 27 May 1995
+visa50|Geveke VISA 50 terminal in ANSI 80 character mode,
+	bw, mir, msgr,
+	cols#80, lines#25,
+	acsc=0_aaffggh jjkkllmmnnooqqssttuuvvwwxx, bel=^G,
+	blink=\E[5m, bold=\E[1m, cbt=\E[Z, clear=\E[H\E[2J, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=\E[D,
+	cud=\E[%p1%dB, cud1=\E[B, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	dch=\E[%p1%dX, dch1=\E[X, dim=\E[2m, dl=\E[%p1%dM,
+	dl1=\E[M, ed=\E[J, el=\E[K, flash=\E[?5h$<100/>\E[?5l,
+	home=\E[H, hpa=\E[%i%p1%dG, ht=^I, ich=\E[%p1%d@,
+	ich1=\E[@, il=\E[%p1%dL, il1=\E[L, ind=\n, invis=\E[8m,
+	is2=\E0;2m\E[1;25r\E[25;1H\E[?3l\E[?7h\E[?8h,
+	ka1=\E[f, ka3=\EOQ, kb2=\EOP, kbs=^H, kc1=\EOR, kc3=\EOS,
+	kcub1=\E[D, kcud1=\E[A, kcuf1=\E[C, kcuu1=\E[A, kdch1=^?,
+	kdl1=\EOS, kf0=\E010, kf1=\E001, kf10=\E011, kf2=\E002,
+	kf3=\E003, kf4=\E004, kf5=\E005, kf6=\E006, kf7=\E007,
+	kf8=\E008, kf9=\E009, khome=\E[f, lf2=A delete char,
+	lf3=A insert line, lf4=A delete line, lf5=A clear,
+	lf6=A ce of/cf gn, lf7=A print, lf8=A on-line,
+	lf9=A funcl0=A send, nel=\r\n, rev=\E[7m, rmacs=\E[3l,
+	rmam=\E[?7l, rmir=\E[4l, rmkx=\E>, rmso=\E[0;2m,
+	rmul=\E[0m, sgr0=\E[0;2m, smacs=\E3h, smam=\E?7h,
+	smir=\E[4h, smkx=\E=, smso=\E[2;7m, smul=\E[4m, tbc=\E[3g,
+	vpa=\E[%i%p1%dd,
+
+#### Human Designed Systems (Concept)
+#
+#	Human Designed Systems
+#	400 Fehley Drive
+#	King of Prussia, PA 19406
+#	Vox: (610)-277-8300
+#	Fax: (610)-275-5739
+#	Net: support@hds.com
+#
+# John Martin <john@hds.com> is their termcap expert.  They're mostly out of
+# the character-terminal business now (1995) and making X terminals.  In
+# particular, the whole `Concept' line described here was discontinued long
+# ago.
+#
+
+# From: <vax135!hpk>  Sat Jun 27 07:41:20 1981
+# Extensive changes to c108 by arpavax:eric Feb 1982
+# Some unknown person at SCO then translated it to terminfo.
+#
+# There seem to be a number of different versions of the C108 PROMS
+# (with bug fixes in its Z-80 program).
+#
+# The first one that we had would lock out the keyboard of you
+# sent lots of short lines (like /usr/dict/words) at 9600 baud.
+# Try that on your C108 and see if it sends a ^S when you type it.
+# If so, you have an old version of the PROMs.
+#
+# You should configure the C108 to send ^S/^Q before running this.
+# It is much faster (at 9600 baud) than the c100 because the delays
+# are not fixed.
+# new status line display entries for c108-8p:
+# <is3> - init str #3 - setup term for status display -
+# set programmer mode, select window 2, define window at last
+# line of memory, set bkgnd stat mesg there, select window 0.
+#
+# <tsl> - to status line - select window 2, home cursor, erase to
+# end-of-window, 1/2 bright on, goto(line#0, col#?)
+#
+# <fsl> - from status line - 1/2 bright off, select window 0
+#
+# <dsl> - disable status display - set bkgnd status mesg with
+# illegal window #
+#
+# There are probably more function keys that should be added but
+# I don't know what they are.
+#
+# No delays needed on c108 because of ^S/^Q handshaking
+#
+c108|concept108|c108-8p|concept108-8p|Concept 108 w/8 pages,
+	is3=\EU\E\sz"\Ev\001\177\s!p\E\s;"\E\sz\s\Ev\s\s\001\177p
+	    \Ep\n,
+	rmcup=\Ev  \001\177p\Ep\r\n, use=c108-4p,
+c108-4p|concept108-4p|Concept 108 w/4 pages,
+	OTbs, eslok, hs, xon,
+	pb@,
+	acsc=jEkTl\\mMqLxU, cnorm=\Ew, cr=\r,
+	cup=\Ea%p1%?%p1%{95}%>%t\001%{96}%-%;%{32}%+%c%p2%?%p2%{95}
+	    %>%t\001%{96}%-%;%{32}%+%c,
+	cvvis=\EW, dch1=\E 1$<16*>, dsl=\E ;\177, fsl=\Ee\E z\s,
+	ind=\n, is1=\EK\E!\E F,
+	is3=\EU\E z"\Ev\177 !p\E ;"\E z \Ev  \001 p\Ep\n,
+	rmacs=\Ej\s, rmcup=\Ev  \001 p\Ep\r\n, smacs=\Ej!,
+	smcup=\EU\Ev  8p\Ep\r\E\025,
+	tsl=\E z"\E?\E\005\EE\Ea %+\s, use=c100,
+c108-rv|c108-rv-8p|Concept 108 w/8 pages in reverse video,
+	rmcup=\Ev  \002 p\Ep\r\n, smcup=\EU\Ev  8p\Ep\r,
+	use=c108-rv-4p,
+c108-rv-4p|concept108rv4p|Concept 108 w/4 pages in reverse video,
+	flash=\EK$<200>\Ek, is1=\Ek, rmso=\Ee, smso=\EE,
+	use=c108-4p,
+c108-w|c108-w-8p|concept108-w-8|concept108-w8p|Concept 108 w/8 pages in wide mode,
+	cols#132,
+	is1=\E F\E", rmcup=\Ev  ^A0\001D\Ep\r\n,
+	smcup=\EU\Ev  8\001D\Ep\r, use=c108-8p,
+
+# Concept 100:
+# These have only window relative cursor addressing, not screen
+# relative. To get it to work right here, smcup/rmcup (which
+# were invented for the concept) lock you into a one page
+# window for screen style programs.
+#
+# To get out of the one page window, we use a clever trick:
+# we set the window size to zero ("\Ev    " in rmcup) which the
+# terminal recognizes as an error and resets the window to all
+# of memory.
+#
+# This trick works on c100 but does not on c108, sigh.
+#
+# Some tty drivers use cr3 for concept, others use nl3, hence
+# the delays on cr and ind below. This padding is only needed at
+# 9600 baud and up.  One or the other is commented out depending on
+# local conventions.
+#
+# 2 ms padding on <rmcup> isn't always enough. 6 works fine. Maybe
+# less than 6 but more than 2 will work.
+#
+# Note: can't use function keys f7-f10 because they are
+# indistinguishable from arrow keys (!), also, del char and
+# clear eol use xon/xoff so they probably won't work very well.
+#
+# Also note that we don't define insrt/del char/delline/eop/send
+# because they don't transmit unless we reset them - I figured
+# it was a bad idea to clobber their definitions.
+#
+# The <mc5> sequence changes the escape character to ^^ so that
+# escapes will be passed through to the printer. Only trouble
+# is that ^^ won't be - ^^ was chosen to be unlikely.
+# Unfortunately, if you're sending raster bits through to be
+# plotted, any character you choose will be likely, so we lose.
+#
+# \EQ"\EY(^W (send anything from printer to host, for xon/xoff)
+# cannot be # in is2 because it will hang a c100 with no printer
+# if sent twice.
+c100|concept100|concept|c104|c100-4p|HDS Concept 100,
+	OTbs, am, eo, mir, ul, xenl,
+	cols#80, lines#24, pb#9600, vt#8,
+	bel=^G, blink=\EC, clear=\E?\E\005$<2*>, cr=$<9>\r,
+	cub1=^H, cud1=\n, cuf1=\E=,
+	cup=\Ea%p1%{32}%+%c%p2%{32}%+%c, cuu1=\E;,
+	dch1=\E\021$<16*>, dim=\EE, dl1=\E\002$<3*>,
+	ed=\E\005$<16*>, el=\E\025$<16>, flash=\Ek$<200>\EK,
+	ht=\011$<8>, il1=\E\022$<3*>, ind=\n, invis=\EH, ip=$<16*>,
+	is1=\EK,
+	is2=\EU\Ef\E7\E5\E8\El\ENH\E\0\Eo&\0\Eo'\E\Eo!\0\E\007!\E
+	    \010A@\s\E4#:"\E:a\E4#;"\E:b\E4#<"\E:c,
+	is3=\Ev    $<6>\Ep\n, kbs=^H, kcbt=\E', kctab=\E_,
+	kcub1=\E>, kcud1=\E<, kcuf1=\E=, kcuu1=\E;, kdch1=\E^Q,
+	kdl1=\E^B, ked=\E^C, kel=\E^S, kf1=\E5, kf2=\E6, kf3=\E7,
+	kf4=\E8, kf5=\E9, kf6=\E:a, kf7=\E:b, kf8=\E:c, khome=\E?,
+	khts=\E], kich1=\E^P, kil1=\E^R, kind=\E[, knp=\E-, kpp=\E.,
+	kri=\E\\, krmir=\E\0, mc4=\036o \E\EQ!\EYP\027,
+	mc5=\EQ"\EY(\027\EYD\Eo \036, prot=\EI,
+	rep=\Er%p1%c%p2%{32}%+%c$<.2*>, rev=\ED,
+	rmcup=\Ev    $<6>\Ep\r\n, rmir=\E\s\s, rmkx=\Ex,
+	rmso=\Ed, rmul=\Eg, sgr0=\EN@,
+	smcup=\EU\Ev  8p\Ep\r\E\025$<16>, smir=\E^P, smkx=\EX,
+	smso=\ED, smul=\EG,
+c100-rv|c100-rv-4p|concept100-rv|Concept 100 reverse video,
+	cnorm@, cvvis@, flash=\EK$<200>\Ek, is1=\Ek, rmso=\Ee,
+	smso=\EE, use=c100,
+oc100|oconcept|c100-1p|old 1-page Concept 100,
+	in,
+	is3@, use=c100,
+
+# From: Walter Skorski <walt@genetics1.JMP.TJU.EDU>, 16-oct-1996.
+# Lots of notes, originally inline, but ncurses doesn't grok that.
+#
+# am:	not available in power on mode, but turned on with \E[=107;207h in
+#	is2=.  Also, \E=124l in is2= could have been used to prevent needing
+#	to specify xenl:, but that would have rendered the last space on the
+#	last line useless.
+# bw:	Not available in power on mode, but turned on with \E[=107;207h in
+#	is2=.
+# clear: Could be done with \E[2J alone, except that vi (and probably most
+#	other programs) assume that this also homes the cursor.
+# dsl:	Go to window 2, go to the beginning of the line, use a line feed to
+#	scroll the window, and go back to window 1.
+# is2:	the string may cause a warning to be issued by tic that it
+#	found a very long line and that it suspects that a comma is missing
+#	somewhere.  This warning can be ignored (unless it comes up more than
+#	once).  The initialization string contains the following commands:
+#
+#	 [Setup mode items changed from factory defaults:]
+#		\E)0			set alternate character set to
+#						graphics
+#		^O			set character set to default
+#	 [In case it wasn't]
+#		\E[m			turn off all attributes
+#	 [In case they weren't off]
+#		\E[=107;		cursor wrap and
+#			207h			character wrap on
+#		\E[90;3u		set Fkey definitions to "transmit"
+#						defaults
+#		\E[92;3u		set cursor key definitions to
+#						"transmit" defaults
+#		\E[43;1u		set shift F13 to transmit...
+#		\177\E$P\177
+#		\E[44;1u		set shift F14 to transmit...
+#			\177\E$Q\177
+#		\E[45;1u		set shift F15 to transmit...
+#			\177\E$R\177
+#		\E[46;1u		set shift F16 to transmit...
+#			\177\E$S\177
+#		\E[200;1u		set shift up to transmit...
+#			\177\E$A\177
+#		\E[201;1u		set shift down to transmit...
+#			\177\E$B\177
+#		\E[202;1u		set shift right to transmit...
+#			\177\E$C\177
+#		\E[203;1u		set shift left to transmit...
+#			\177\E$D\177
+#		\E[204;1u		set shift home to transmit...
+#			\177\E$H\177
+#		\E[212;1u		set backtab to transmit...
+#			\177\E$I\177
+#		\E[213;1u		set shift backspace to transmit...
+#			\177\E$^H\177
+#		\E[214;1u		set shift del to transmit...
+#			"\E$\177"
+#	 [Necessary items not mentioned in setup mode:]
+#		\E[2!w			move to window 2
+#		\E[25;25w		define window as line 25 of memory
+#		\E[!w			move to window 1
+#		\E[2*w			show current line of window 2 as
+#						status line
+#		\E[2+x			set meta key to use high bit
+#		\E[;3+}			move underline to bottom of character
+#
+#	All Fkeys are set to their default transmit definitions with \E[90;3u
+#	in is2=.  IMPORTANT:  to use this terminal definition, the "quit" stty
+#	setting MUST be redefined or deactivated, because the default is
+#	contained in almost all of this terminal's Fkey strings!  If for some
+#	reason "quit" cannot be altered, the Fkeys can, but it would be
+#	necessary to change ^| to ^] in all of these definitions, and add
+#	\E[2;029!t to is2.
+# lines: is set to 24 because this terminal refuses to treat the 25th
+#	line normally.
+# ll:	Not available in power on mode, but turned on with \E[=107;207h in
+#	is2=.
+# lm:	Pointless, given that this definition locks a single screen of
+#	memory into view, but what the hey...
+# rmso: Could use \E[1;7!{ to turn off only bold and reverse (leaving any
+#	other attributes alone), but some programs expect this to turn off
+#	everything.
+# rmul: Could use \E[4!{ to turn off only underline (leaving any other
+#	attributes alone), but some programs expect this to turn off
+#	everything.
+# sgr:	Attributes are set on this terminal with the string \E[ followed by
+#	a list of attribute code numbers (in decimal, separated by
+#	semicolons), followed by the character m.  The attribute code
+#	numbers are:
+#		  1 for bold;
+#		  2 for dim (which is ignored in power on mode);
+#		  4 for underline;
+#		  5 for blinking;
+#		  7 for inverse;
+#		  8 for not displayable; and
+#		=99 for protected (except that there are strange side
+#		effects to protected characters which make them inadvisable).
+#	 The mapping of terminfo parameters to attributes is as follows:
+#		%p1 (standout) = bold and inverse together;
+#		%p2 (underline) = underline;
+#		%p3 (reverse) = inverse;
+#		%p4 (blink) = blinking;
+#		%p5 (dim) is ignored;
+#		%p6 (bold) = bold;
+#		%p7 (invisible) = not displayable;
+#		%p8 (protected) is ignored; and
+#		%p9 (alt char set) = alt char set.
+#	 The code to do this is:
+#		\E[0		OUTPUT	\E[0
+#		%?%p1%p6%O	IF	(standout; bold) OR
+#		%t;1		THEN	OUTPUT	;1
+#		%;		ENDIF
+#		%?%p2		IF	underline
+#		%t;4		THEN	OUTPUT	;4
+#		%;		ENDIF
+#		%?%p4		IF	blink
+#		%t;5		THEN	OUTPUT	;5
+#		%;		ENDIF
+#		%?%p1%p3%O	IF	(standout; reverse) OR
+#		%t;7		THEN	OUTPUT	;7
+#		%;		ENDIF
+#		%?%p7		IF	invisible
+#		%t;8		THEN	OUTPUT	;8
+#		%;		ENDIF
+#		m		OUTPUT	m
+#		%?%p9		IF	altcharset
+#		%t^N		THEN	OUTPUT	^N
+#		%e^O		ELSE	OUTPUT	^O
+#		%;		ENDIF
+# sgr0: Everything is turned off (including alternate character set), since
+#	there is no way of knowing what it is that the program wants turned
+#	off.
+# smul: The "underline" attribute is reconfigurable to an overline or
+#	strike-through, or (as done with \E[;3+} in is2=), to a line at the true
+#	bottom of the character cell.  This was done to allow for more readable
+#	underlined characters, and to be able to distinguish between an
+#	underlined space, an underscore, and an underlined underscore.
+# xenl: Terminal can be configured to not need this, but this "glitch"
+#	behavior is actually preferable with autowrap terminals.
+#
+# Parameters kf31= thru kf53= actually contain the strings sent by the shifted
+# Fkeys.  There are no parameters for shifted Fkeys in terminfo.  The is2
+# string modifies the 'O' in kf43 to kf46 to a '$'.
+#
+# kcbt was originally ^I but redefined in is2=.
+# kHOM was \E[H originally but redefined in is2=, as were a number of
+# other keys.
+# kDC was originally \177 but redefined in is2=.
+#
+# kbs:	Shift was also ^H originally but redefined as \E$^H in is2=.
+# tsl:	Go to window 2, then do an hpa=.
+#
+#------- flash=\E[8;3!}^G\E[3;3!}
+#------- flash=\E[?5h$<100>\E[?5l
+# There are two ways to flash the screen, both of which have their drawbacks.
+# The first is to set the bell mode to video, transmit a bell character, and
+# set the bell mode back - but to what?  There is no way of knowing what the
+# user's old bell setting was before we messed with it.  Worse, the command to
+# set the bell mode also sets the key click volume, and there is no way to say
+# "leave that alone", or to know what it's set to, either.
+# The second way to do a flash is to set the screen to inverse video, pad for a
+# tenth of a second, and set it back - but like before, there's no way to know
+# that the screen wasn't ALREADY in inverse video, or that the user may prefer
+# it that way.  The point is moot anyway, since vi (and probably other
+# programs) assume that by defining flash=, you want the computer to use it
+# INSTEAD of bel=, rather than as a secondary type of signal.
+#
+#------- cvvis=\E[+{
+# The is the power on setting, which is also as visible as the cursor
+# gets.
+#-------  wind=\E[%i%p1%d;%p2%d;%p3%{1}%+%d;%p4%{1}%+%dw
+# Windowing is possible, but not defined here because it is also used to
+# emulate status line functions.  Allowing a program to set a window could
+# clobber the status line or render it unusable.  There is additional memory,
+# but screen scroll functions are destructive and do not make use of it.
+#
+#-------   dim=			Not available in power on mode.
+# You have a choice of defining low intensity characters as "half bright" and
+# high intensity as "normal", or defining low as "normal" and high as "bold".
+# No matter which you choose, only one of either "half bright" or "bold" is
+# available at any time, so taking the time to override the default is
+# pointless.
+#
+#-------  prot=\E[=0;99m
+# Not defined, because it appears to have some strange side effects.
+#------- pfkey=%?%p1%{24}%<%p1%{30}%>%p1%{54}%<%A%O%t\E[%p1%du\177%p2%s\177%;
+#------- pfloc=%?%p1%{24}%<%p1%{30}%>%p1%{54}%<%A%O%t\E[%p1%du\177%p2%s\177%;
+#-------   pfx=%?%p1%{24}%<%p1%{30}%>%p1%{54}%<%A%O%t\E[%p1%d;1u\177%p2%s\177%;
+#	 Available, but making them available to programs is inadvisable.
+#	 The code to do this is:
+#		%?%p1%{24}%<	IF	((key; 24) <;
+#		%p1%{30}%>		 ((key; 30) >;
+#		%p1%{54}%<		  (key; 54) <
+#		%A			 ) AND
+#		%O			) OR
+#	 [that is, "IF key < 24 OR (key > 30 AND key < 54)",]
+#		%t\E[		THEN	OUTPUT	\E[
+#		%p1%d			OUTPUT	(key) as decimal
+#	 [next line applies to pfx only]
+#		;1			OUTPUT	;1
+#		u			OUTPUT	u
+#		\177			OUTPUT	\177
+#		%p2%s			OUTPUT	(string) as string
+#		\177			OUTPUT	\177
+#	 [DEL chosen as delimiter, but could be any character]
+#	 [implied:		ELSE	do nothing]
+#		%;		ENDIF
+#
+#-------   rs2=
+# Not defined since anything it might do could be done faster and easier with
+# either Meta-Shift-Reset or the main power switch.
+#
+#-------  smkx=\E[1!z
+#-------  rmkx=\E[!z
+# These sequences apply to the cursor and setup keys only, not to the
+# numeric keypad.  But it doesn't matter anyway, since making these
+# available to programs is inadvisable.
+# For the key definitions below, all sequences beginning with \E$ are
+# custom and programmed into the terminal via is2.  \E$ also has no
+# meaning to any other terminal.
+#
+#------- cmdch=\E[;%p1%d!t
+# Available, but making it available to programs is inadvisable.
+#------- smxon=\E[1*q
+# Available, but making it available to programs is inadvisable.
+# Terminal will send XON/XOFF on buffer overflow.
+#------- rmxon=\E[*q
+# Available, but making it available to programs is inadvisable.
+# Terminal will not notify on buffer overflow.
+#-------   smm=\E[2+x
+#-------   rmm=\E[+x
+# Available, but making them available to programs is inadvisable.
+#
+# Printing:
+#	 It's not made clear in the manuals, but based on other ansi/vt type
+#	 terminals, it's a good guess that this terminal is capable of both
+#	 "transparent print" (which doesn't copy data to the screen, and
+#	 therefore needs mc5i: specified to say so) and "auxiliary print"
+#	 (which does duplicate printed data on the screen, in which case mc4=
+#	 and mc5= should use the \E[?4i and \E[?5i strings instead).
+
+hds200|Human Designed Systems HDS200,
+	am, bw, eslok, hs, km, mir, msgr, xenl, xon, NQ,
+	cols#80, it#8, lines#24, lm#0,
+	acsc=``aaffggjjkkllmmnnooqqssttuuvvwwxx~~, bel=^G,
+	blink=\E[0;5m, bold=\E[0;1m, cbt=\E[Z, civis=\E[6+{,
+	clear=\E[H\E[J, cnorm=\E[+{, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=\E[D,
+	cud=\E[%p1%dB, cud1=\E[B, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M,
+	dsl=\E[2!w\r\n\E[!w, ed=\E[J, el=\E[K, el1=\E[1K,
+	fsl=\E[!w, home=\E[H, hpa=\E[%i%p1%dG, ht=^I, hts=\EH,
+	ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[L, ind=\ED,
+	invis=\E[0;8m,
+	is2=\E)0\017\E[m\E[=107;207h\E[90;3u\E[92;3u\E[43;1u\177\E$P
+	    \177\E[44;1u\177\E$Q\177\E[45;1u\177\E$R\177\E[46;1u
+	    \177\E$S\177\E[200;1u\177\E$A\177\E[201;1u\177\E$B\177
+	    \E[202;1u\177\E$C\177\E[203;1u\177\E$D\177\E[204;1u\177
+	    \E$H\177\E[212;1u\177\E$I\177\E[213;1u\177\E$\010\177\E[
+	    214;1u"\E$\177"\E[2!w\E[25;25w\E[!w\E[2*w\E[2+x\E[;3+},
+	kDC=\E$^?, kHOM=\E$H, kLFT=\E$D, kRIT=\E$C, kbs=^H,
+	kcbt=\E$I, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A,
+	kdch1=^?, kent=\r, kf1=^\001\r, kf10=^\010\r, kf11=^\011\r,
+	kf12=^\012\r, kf13=\EOP, kf14=\EOQ, kf15=\EOR, kf16=\EOS,
+	kf17=^\017\r, kf18=^\018\r, kf19=^\019\r, kf2=^\002\r,
+	kf20=^\020\r, kf21=^\021\r, kf22=^\022\r, kf23=^\023\r,
+	kf3=^\003\r, kf31=^\031\r, kf32=^\032\r, kf33=^\033\r,
+	kf34=^\034\r, kf35=^\035\r, kf36=^\036\r, kf37=^\037\r,
+	kf38=^\038\r, kf39=^\039\r, kf4=^\004\r, kf40=^\040\r,
+	kf41=^\041\r, kf42=^\042\r, kf43=\E$P, kf44=\E$Q,
+	kf45=\E$R, kf46=\E$S, kf47=^\047\r, kf48=^\048\r,
+	kf49=^\049\r, kf5=^\005\r, kf50=^\050\r, kf51=^\051\r,
+	kf52=^\052\r, kf53=^\053\r, kf6=^\006\r, kf7=^\007\r,
+	kf8=^\008\r, kf9=^\009\r, khome=\E[H, kind=\E[T, knp=\E[U,
+	kpp=\E[V, kri=\E[S, ll=\E[H\E[A, nel=\E[E, rc=\E8,
+	rev=\E[0;7m, ri=\EM, rmacs=^O, rmir=\E[4l, rmso=\E[m\017,
+	rmul=\E[m\017, sc=\E7,
+	sgr=\E[0%?%p1%p6%O%t;1%;%?%p2%t;4%;%?%p4%t;5%;%?%p1%p3%O%t;7
+	    %;%?%p7%t;8%;m%?%p9%t\016%e\017%;,
+	sgr0=\E[m\017, smacs=^N, smir=\E[4h, smso=\E[0;1;7m,
+	smul=\E[0;4m, tbc=\E[3g, tsl=\E[2!w\E[%i%p1%dG,
+	vpa=\E[%i%p1%dd, use=ansi+pp,
+
+# <ht> through <el> included to specify padding needed in raw mode.
+# (avt-ns: added empty <acsc> to suppress a tic warning --esr)
+avt-ns|Concept AVT no status line,
+	OTbs, am, eo, mir, ul, xenl, xon,
+	cols#80, it#8, lines#24, lm#192,
+	acsc=, bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z,
+	clear=\E[H\E[J$<38>, cnorm=\E[=119l, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	cvvis=\E[=119h, dch1=\E[P, dim=\E[1!{, dl=\E[%p1%dM$<4*>,
+	dl1=\E[M$<4>, ed=\E[J$<96>, el=\E[K$<6>, home=\E[H,
+	hpa=\E[%p1%{1}%+%dG, ht=\011$<4>, hts=\EH, ich=\E[%p1%d@,
+	ich1=\E[@, il=\E[%p1%dL$<4*>, il1=\E[L$<4>, ind=\n$<8>,
+	invis=\E[8m, ip=$<4>, is1=\E[=103l\E[=205l,
+	is2=\E[1*q\E[2!t\E[7!t\E[=4;101;119;122l\E[=107;118;207h\E)1
+	    \E[1Q\EW\E[!y\E[!z\E>\E[0:0:32!r\E[0*w\E[w\E2\r\n\E[2;27
+	    !t,
+	kbs=^H, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A,
+	kdch1=\E\002\r, ked=\E\004\r, kf1=\EOP, kf2=\EOQ, kf3=\EOR,
+	kf4=\EOS, khome=\E[H, kich1=\E\001\r, kil1=\E\003\r,
+	ll=\E[24H, mc0=\E[0i, mc4=\E[4i, mc5=\E[5i,
+	pfloc=\E[%p1%d;0u#%p2%s#, pfx=\E[%p1%d;1u#%p2%s#,
+	prot=\E[99m, rc=\E8, rev=\E[7m, ri=\EM$<4>, rmacs=\016$<1>,
+	rmcup=\E[w\E2\r\n, rmir=\E[4l, rmkx=\E[!z\E[0;2u,
+	rmso=\E[7!{, rmul=\E[4!{, sc=\E7,
+	sgr=\E[%?%p1%t7;%;%?%p2%t4;%;%?%p3%t7;%;%?%p4%t5;%;%?%p6%t1;
+	    %;%?%p7%t8;%;%?%p8%t99;%;m%?%p5%t\E[1!{%;%?%p9%t\017%e
+	    \016%;$<1>,
+	sgr0=\E[m\016$<1>, smacs=\017$<1>,
+	smcup=\E[=4l\E[1;24w\E2\r, smir=\E[4h,
+	smkx=\E[1!z\E[0;3u, smso=\E[7m, smul=\E[4m, tbc=\E[3g,
+	vpa=\E[%p1%{1}%+%dd, use=ansi+rep,
+avt-rv-ns|Concept AVT in reverse video mode/no status line,
+	flash=\E[=205l$<200>\E[=205h, is1=\E[=103l\E[=205h,
+	use=avt-ns,
+avt-w-ns|Concept AVT in 132 column mode/no status line,
+	is1=\E[=103h\E[=205l, smcup=\E[H\E[1;24;1;132w,
+	use=avt-ns,
+avt-w-rv-ns|Concept AVT in 132 column mode/no status line/reverse video,
+	flash=\E[=205l$<200>\E[=205h, is1=\E[=103h\E[=205h,
+	smcup=\E[H\E[1;24;1;132w, use=avt-ns,
+
+# Concept AVT with status line. We get the status line using the
+# "Background status line" feature of the terminal. We swipe the
+# first line of memory in window 2 for the status line, keeping
+# 191 lines of memory and 24 screen lines for regular use.
+# The first line is used instead of the last so that this works
+# on both 4 and 8 page AVTs. (Note the lm#191 or 192 - this
+# assumes an 8 page AVT but lm isn't currently used anywhere.)
+#
+avt+s|Concept AVT status line changes,
+	eslok, hs,
+	lm#191,
+	dsl=\E[0*w, fsl=\E[1;1!w,
+	is3=\E[2w\E[2!w\E[1;1;1;80w\E[H\E[2*w\E[1!w\E2\r\n,
+	rmcup=\E[2w\E2\r\n, smcup=\E[2;25w\E2\r,
+	tsl=\E[2;1!w\E[;%p1%dH\E[2K,
+avt|avt-s|concept-avt|Concept AVT w/80 columns,
+	use=avt+s, use=avt-ns,
+avt-rv|avt-rv-s|Concept AVT reverse video w/sl,
+	flash=\E[=205l$<200>\E[=205h, is1=\E[=103l\E[=205h,
+	use=avt+s, use=avt-ns,
+avt-w|avt-w-s|Concept AVT 132 cols+status,
+	is1=\E[=103h\E[=205l, smcup=\E[H\E[1;24;1;132w,
+	use=avt+s, use=avt-ns,
+avt-w-rv|avt-w-rv-s|Concept AVT wide+status+rv,
+	flash=\E[=205l$<200>\E[=205h, is1=\E[=103h\E[=205h,
+	smcup=\E[H\E[1;24;1;132w, use=avt+s, use=avt-ns,
+
+#### Contel Business Systems.
+#
+
+# Contel c300 and c320 terminals.
+contel300|contel320|c300|Contel Business Systems C-300 or C-320,
+	am, in, xon,
+	cols#80, lines#24, xmc#1,
+	bel=^G, clear=\EK, cr=\r, cub1=^H, cud1=\n, cuf1=\EC,
+	cup=\EX%p1%{32}%+%c\EY%p2%{32}%+%c, cuu1=\EA,
+	dch1=\EO$<5.5*>, dl1=\EM$<5.5*>, ed=\EJ$<5.5*>,
+	el=\EI$<5.5>, flash=\020\002$<200/>\020\003, home=\EH,
+	hts=\E1, ich1=\EN, il1=\EL$<5.5*>, ind=\n, ip=$<5.5*>,
+	kbs=^H, kf0=\ERJ, kf1=\ERA, kf2=\ERB, kf3=\ERC, kf4=\ERD,
+	kf5=\ERE, kf6=\ERF, kf7=\ERG, kf8=\ERH, kf9=\ERI, ll=\EH\EA,
+	rmso=\E!\0, sgr0=\E!\0, smso=\E!\r, tbc=\E3,
+# Contel c301 and c321 terminals.
+contel301|contel321|c301|c321|Contel Business Systems C-301 or C-321,
+	flash@, ich1@, ip@, rmso=\E!\0$<20>, smso=\E!\r$<20>,
+	use=contel300,
+
+#### Data General (dg)
+#
+# According to James Carlson <carlson@xylogics.com> writing in January 1995,
+# the terminals group at Data General was shut down in 1991; all these
+# terminals have thus been discontinued.
+#
+# DG terminals have function keys that respond to the SHIFT and CTRL keys,
+# e.g., SHIFT-F1 generates a different code from F1.  To number the keys
+# sequentially, first the unmodified key codes are listed as F1 through F15.
+# Then their SHIFT versions are listed as F16 through F30, their CTRL versions
+# are listed as F31 through F45, and their CTRL-SHIFT versions are listed as
+# F46 through F60.  This is done in the private "includes" below whose names
+# start with "dgkeys+".
+#
+# DG terminals generally support 8 bit characters.  For each of these terminals
+# two descriptions are supplied:
+#	1) A default description for 8 bits/character communications, which
+#	   uses the default DG international character set and keyboard codes.
+#	2) A description with suffix "-7b" for 7 bits/character communications.
+#	   This description must use the NON-DEFAULT native keyboard language.
+
+# Unmodified fkeys (kf1-kf11), Shift fkeys (kf12-kf22), Ctrl fkeys (kf23-kf33),
+# Ctrl/Shift fdkeys (kf34-kf44).
+
+dgkeys+8b|Private entry describing DG terminal 8-bit ANSI mode special keys,
+	ka1=\233020z, ka3=\233021z, kc1=\233022z, kc3=\233023z,
+	kclr=\2332J, kcub1=\233D, kcud1=\233B, kcuf1=\233C,
+	kcuu1=\233A, kel=\233K, kf1=\233001z, kf10=\233010z,
+	kf11=\233011z, kf12=\233012z, kf13=\233013z,
+	kf14=\233014z, kf15=\233000z, kf16=\233101z,
+	kf17=\233102z, kf18=\233103z, kf19=\233104z,
+	kf2=\233002z, kf20=\233105z, kf21=\233106z,
+	kf22=\233107z, kf23=\233108z, kf24=\233109z,
+	kf25=\233110z, kf26=\233111z, kf27=\233112z,
+	kf28=\233113z, kf29=\233114z, kf3=\233003z,
+	kf30=\233100z, kf31=\233201z, kf32=\233202z,
+	kf33=\233203z, kf34=\233204z, kf35=\233205z,
+	kf36=\233206z, kf37=\233207z, kf38=\233208z,
+	kf39=\233209z, kf4=\233004z, kf40=\233210z,
+	kf41=\233211z, kf42=\233212z, kf43=\233213z,
+	kf44=\233214z, kf45=\233200z, kf46=\233301z,
+	kf47=\233302z, kf48=\233303z, kf49=\233304z,
+	kf5=\233005z, kf50=\233305z, kf51=\233306z,
+	kf52=\233307z, kf53=\233308z, kf54=\233309z,
+	kf55=\233310z, kf56=\233311z, kf57=\233312z,
+	kf58=\233313z, kf59=\233314z, kf6=\233006z,
+	kf60=\233300z, kf7=\233007z, kf8=\233008z, kf9=\233009z,
+	khome=\233H, kprt=\233i,
+
+dgkeys+7b|Private entry describing DG terminal 7-bit ANSI mode special keys,
+	ka1=\E[020z, ka3=\E[021z, kc1=\E[022z, kc3=\E[023z,
+	kclr=\E[2J, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A,
+	kel=\E[K, kf1=\E[001z, kf10=\E[010z, kf11=\E[011z,
+	kf12=\E[012z, kf13=\E[013z, kf14=\E[014z, kf15=\E[000z,
+	kf16=\E[101z, kf17=\E[102z, kf18=\E[103z, kf19=\E[104z,
+	kf2=\E[002z, kf20=\E[105z, kf21=\E[106z, kf22=\E[107z,
+	kf23=\E[108z, kf24=\E[109z, kf25=\E[110z, kf26=\E[111z,
+	kf27=\E[112z, kf28=\E[113z, kf29=\E[114z, kf3=\E[003z,
+	kf30=\E[100z, kf31=\E[201z, kf32=\E[202z, kf33=\E[203z,
+	kf34=\E[204z, kf35=\E[205z, kf36=\E[206z, kf37=\E[207z,
+	kf38=\E[208z, kf39=\E[209z, kf4=\E[004z, kf40=\E[210z,
+	kf41=\E[211z, kf42=\E[212z, kf43=\E[213z, kf44=\E[214z,
+	kf45=\E[200z, kf46=\E[301z, kf47=\E[302z, kf48=\E[303z,
+	kf49=\E[304z, kf5=\E[005z, kf50=\E[305z, kf51=\E[306z,
+	kf52=\E[307z, kf53=\E[308z, kf54=\E[309z, kf55=\E[310z,
+	kf56=\E[311z, kf57=\E[312z, kf58=\E[313z, kf59=\E[314z,
+	kf6=\E[006z, kf60=\E[300z, kf7=\E[007z, kf8=\E[008z,
+	kf9=\E[009z, khome=\E[H, kprt=\E[i,
+
+dgkeys+11|Private entry describing 11 minimal-subset DG mode special keys,
+	kclr=^L, kcub1=^Y, kcud1=^Z, kcuf1=^X, kcuu1=^W, kel=^K,
+	kf1=^^q, kf10=^^z, kf11=^^{, kf12=^^a, kf13=^^b, kf14=^^c,
+	kf15=^^d, kf16=^^e, kf17=^^f, kf18=^^g, kf19=^^h, kf2=^^r,
+	kf20=^^i, kf21=^^j, kf22=^^k, kf23=^^1, kf24=^^2, kf25=^^3,
+	kf26=^^4, kf27=^^5, kf28=^^6, kf29=^^7, kf3=^^s, kf30=^^8,
+	kf31=^^9, kf32=^^:, kf33=^^;, kf34=^^!, kf35=^^", kf36=^^#,
+	kf37=^^$, kf38=^^%%, kf39=^^&, kf4=^^t, kf40=^^', kf41=^^(,
+	kf42=^^), kf43=^^*, kf44=^^+, kf5=^^u, kf6=^^v, kf7=^^w,
+	kf8=^^x, kf9=^^y, khome=^H,
+
+dgkeys+15|Private entry describing 15 DG mode special keys,
+	kHOM=^^^H, kLFT=^^^Y, kRIT=^^^X, ka1=^^\\, ka3=^^], kc1=^^\^,
+	kc3=^^_, kf1=^^q, kf10=^^z, kf11=^^{, kf12=^^|, kf13=^^},
+	kf14=^^~, kf15=^^p, kf16=^^a, kf17=^^b, kf18=^^c, kf19=^^d,
+	kf2=^^r, kf20=^^e, kf21=^^f, kf22=^^g, kf23=^^h, kf24=^^i,
+	kf25=^^j, kf26=^^k, kf27=^^l, kf28=^^m, kf29=^^n, kf3=^^s,
+	kf30=^^`, kf31=^^1, kf32=^^2, kf33=^^3, kf34=^^4, kf35=^^5,
+	kf36=^^6, kf37=^^7, kf38=^^8, kf39=^^9, kf4=^^t, kf40=^^:,
+	kf41=^^;, kf42=^^<, kf43=^^=, kf44=^^>, kf45=^^0, kf46=^^!,
+	kf47=^^", kf48=^^#, kf49=^^$, kf5=^^u, kf50=^^%%, kf51=^^&,
+	kf52=^^', kf53=^^(, kf54=^^), kf55=^^*, kf56=^^+, kf57=^^\,,
+	kf58=^^-, kf59=^^., kf6=^^v, kf60=^^\s, kf7=^^w, kf8=^^x,
+	kf9=^^y,
+
+# Data General color terminals use the "Tektronix" color model.  The total
+# number of colors varies with the terminal model, as does support for
+# attributes used in conjunction with color.
+
+# Removed u7, u8 definitions since they conflict with tack:
+#		Preserve user-defined colors in at least some cases.
+#	u7=^^Fh,
+#		Default is ACM mode.
+#	u8=^^F}20^^Fi^^F}21,
+#
+dgunix+fixed|Fixed color info for DG D430C terminals in DG-UNIX mode,
+	bce,
+	colors#16, ncv#53, pairs#0x100,
+	op=\036Ad\036Bd,
+	setab=\036B%p1%?%p1%{8}%<%t%{2}%&%?%p1%{1}%&%t%{4}%|%;%?%p1
+	      %{4}%&%t%{1}%|%;%;%{48}%+%c,
+	setaf=\036A%p1%?%p1%{8}%<%t%{2}%&%?%p1%{1}%&%t%{4}%|%;%?%p1
+	      %{4}%&%t%{1}%|%;%;%{48}%+%c,
+	setb=\036B%p1%{48}%+%c, setf=\036A%p1%{48}%+%c,
+
+dg+fixed|Fixed color info for DG D430C terminals in DG mode,
+	use=dgunix+fixed,
+
+# Video attributes are coordinated using static variables set by "sgr", then
+# checked by "op", "seta[bf]", and "set[bf]" to refresh the attribute settings.
+# (D=dim, U=underline, B=blink, R=reverse.)
+dg+color8|Color info for Data General D220 and D230C terminals in ANSI mode,
+	bce,
+	colors#8, ncv#16, pairs#64,
+	op=\E[%?%gD%t2;%;%?%gU%t4;%;%?%gB%t5;%;%?%gR%t7;%;m,
+	setab=\E[4%p1%d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t;5%;%?%gR%t;7%;m,
+	setaf=\E[3%p1%d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t;5%;%?%gR%t;7%;m,
+	setb=\E[4%p1%{2}%&%?%p1%{1}%&%t%{4}%|%;%?%p1%{4}%&%t%{1}%|%;
+	     %d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t;5%;%?%gR%t;7%;m,
+	setf=\E[3%p1%{2}%&%?%p1%{1}%&%t%{4}%|%;%?%p1%{4}%&%t%{1}%|%;
+	     %d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t;5%;%?%gR%t;7%;m,
+
+dg+color|Color info for Data General D470C terminals in ANSI mode,
+	colors#16, ncv#53, pairs#0x100,
+	setab=\E[%?%p1%{8}%<%t4%p1%e=%p1%{2}%&%?%p1%{1}%&%t%{4}%|%;
+	      %?%p1%{4}%&%t%{1}%|%;%;%d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t
+	      ;5%;%?%gR%t;7%;m,
+	setaf=\E[%?%p1%{8}%<%t3%p1%e<%p1%{2}%&%?%p1%{1}%&%t%{4}%|%;
+	      %?%p1%{4}%&%t%{1}%|%;%;%d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t
+	      ;5%;%?%gR%t;7%;m,
+	setb=\E[%?%p1%{8}%<%t4%e=%;%p1%{2}%&%?%p1%{1}%&%t%{4}%|%;%?
+	     %p1%{4}%&%t%{1}%|%;%d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t;5%;
+	     %?%gR%t;7%;m,
+	setf=\E[%?%p1%{8}%<%t3%e<%;%p1%{2}%&%?%p1%{1}%&%t%{4}%|%;%?
+	     %p1%{4}%&%t%{1}%|%;%d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t;5%;
+	     %?%gR%t;7%;m,
+	use=dg+color8,
+
+dgmode+color8|Color info for Data General D220/D230C terminals in DG mode,
+	bce,
+	colors#8, ncv#16, pairs#64,
+	op=\036Ad\036Bd,
+	setab=\036B%p1%{2}%&%?%p1%{1}%&%t%{4}%|%;%?%p1%{4}%&%t%{1}%|
+	      %;%{48}%+%c,
+	setaf=\036A%p1%{2}%&%?%p1%{1}%&%t%{4}%|%;%?%p1%{4}%&%t%{1}%|
+	      %;%{48}%+%c,
+	setb=\036B%p1%{48}%+%c, setf=\036A%p1%{48}%+%c,
+
+dgmode+color|Color info for Data General D470C terminals in DG mode,
+	colors#16, pairs#0x100,
+	setab=\036B%p1%?%p1%{8}%<%t%{2}%&%?%p1%{1}%&%t%{4}%|%;%?%p1
+	      %{4}%&%t%{1}%|%;%;%{48}%+%c,
+	setaf=\036A%p1%?%p1%{8}%<%t%{2}%&%?%p1%{1}%&%t%{4}%|%;%?%p1
+	      %{4}%&%t%{1}%|%;%;%{48}%+%c,
+	use=dgmode+color8,
+
+dgunix+ccc|Configurable color info for DG D430C terminals in DG-UNIX mode,
+	bce, ccc,
+	colors#52, ncv#53, pairs#26,
+	initp=\036RG0%p1%02X%p2%{255}%*%{1000}%/%02X%p3%{255}%*
+	      %{1000}%/%02X%p4%{255}%*%{1000}%/%02X%p5%{255}%*
+	      %{1000}%/%02X%p6%{255}%*%{1000}%/%02X%p7%{255}%*
+	      %{1000}%/%02X,
+	oc=\036RG01A00FF00000000\036RG01B00000000FF00
+	   \036RG01C007F00000000\036RG01D000000007F00,
+	op=\036RF4831A\036RF2E31B\036RF1D31C\036RF3F31D,
+	scp=\036RG2%p1%02X,
+
+# Colors are in the order:  normal, reverse, dim, dim + reverse.
+dg+ccc|Configurable color info for DG D430C terminals in DG mode,
+	bce, ccc,
+	colors#52, ncv#53, pairs#26,
+	initp=\036RG0%p1%{16}%/%{48}%+%c%p1%{16}%m%{48}%+%c%p2%{255}
+	      %*%{1000}%/%Pa%ga%{16}%/%{48}%+%c%ga%{16}%m%{48}%+%c
+	      %p3%{255}%*%{1000}%/%Pa%ga%{16}%/%{48}%+%c%ga%{16}%m
+	      %{48}%+%c%p4%{255}%*%{1000}%/%Pa%ga%{16}%/%{48}%+%c%ga
+	      %{16}%m%{48}%+%c%p5%{255}%*%{1000}%/%Pa%ga%{16}%/%{48}
+	      %+%c%ga%{16}%m%{48}%+%c%p6%{255}%*%{1000}%/%Pa%ga%{16}
+	      %/%{48}%+%c%ga%{16}%m%{48}%+%c%p7%{255}%*%{1000}%/%Pa
+	      %ga%{16}%/%{48}%+%c%ga%{16}%m%{48}%+%c,
+	oc=\036RG01:00??00000000\036RG01;00000000??00\036RG01<007?00
+	   000000\036RG01=000000007?00,
+	op=\036RF4831:\036RF2>31;\036RF1=31<\036RF3?31=,
+	scp=\036RG2%p1%{16}%/%{48}%+%c%p1%{16}%m%{48}%+%c,
+
+# The generic DG terminal type (an 8-bit-clean subset of the 6053)
+# Initialization string 1 sets:
+#	^R		- vertical scrolling enabled
+#	^C		- blinking enabled
+dg-generic|generic Data General terminal in DG mode,
+	am, bw, msgr, xon,
+	cols#80, lines#24,
+	bel=^G, blink=^N, clear=^L, cr=\r, cub1=^Y, cud1=^Z, cuf1=^X,
+	cup=\020%p2%c%p1%c, cuu1=^W, dim=^\, el=^K, ind=\n, is1=^R^C,
+	mc0=^Q, nel=\n, rmso=^], rmul=^U, sgr0=^O^U^], smso=^\,
+	smul=^T, use=dgkeys+11,
+
+# According to the 4.4BSD termcap file, the dg200 <cup> should be the
+# termcap equivalent of \020%p2%{128}%+%c%p1%{128}%+%c (in termcap
+# notation that's "^P%r%+\200%+\200").  Those \200s are suspicious,
+# maybe they were originally nuls (which would fit).
+
+dg200|Data General DASHER 200,
+	OTbs, am, bw,
+	cols#80, lines#24,
+	bel=^G, clear=^L, cr=\r, cub1=^Y, cud1=^Z, cuf1=^X,
+	cup=\020%p2%c%p1%c, cuu1=^W, el=^K, home=^H, ind=\n,
+	kcub1=^Y, kcud1=^Z, kcuf1=^X, kcuu1=^W, kf0=^^z, kf1=^^q,
+	kf2=^^r, kf3=^^s, kf4=^^t, kf5=^^u, kf6=^^v, kf7=^^w, kf8=^^x,
+	kf9=^^y, khome=^H, lf0=f10, nel=\n, rmso=^^E, rmul=^U,
+	smso=^^D, smul=^T,
+
+# Data General 210/211 (and 410?)	from Lee Pearson (umich!lp) via BRL
+dg210|dg-ansi|Data General 210/211,
+	am,
+	cols#80, lines#24,
+	OTnl=\E[B, clear=\E[2J, cub1=\E[D, cud1=\E[B, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, ed=\E[J, el=\E[K,
+	home=\E[H, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A,
+	khome=\E[H, nel=\r\E[H\E[A\n, rmso=\E[0;m, rmul=\E[0;m,
+	smso=\E[7;m, smul=\E[4;m,
+# From: Peter N. Wan <ihnp4!gatech!gacsr!wan>
+# courtesy of Carlos Rucalde of Vantage Software, Inc.
+# (dg211: this had <cup=\020%r%.%>., which was an ancient termcap hangover.
+# I suspect the d200 function keys actually work on the dg211, check it out.)
+dg211|Data General d211,
+	cnorm=^L, cvvis=^L^R, ht=^I, ind@, kbs=^Y, kf0@, kf1@, kf2@, kf3@,
+	kf4@, kf5@, kf6@, kf7@, kf8@, kf9@, lf0@, nel=\r^Z, rmcup=^L,
+	rmso=\036E$<0/>, smcup=^L^R, smso=\036D$<5/>, use=dg200,
+
+# dg450 from Cornell (not official)
+dg450|dg6134|Data General 6134,
+	cub1@, cuf1=^X, use=dg200,
+
+# Not official...
+# Note: lesser Dasher terminals will not work with vi because vi insists upon
+# having a command to move straight down from any position on the bottom line
+# and scroll the screen up, or a direct vertical scroll command.  The 460 and
+# above have both, the D210/211, for instance, has neither.  We must use ANSI
+# mode rather than DG mode because standard UNIX tty drivers assume that ^H is
+# backspace on all terminals.  This is not so in DG mode.
+# (dg460-ansi: removed obsolete ":kn#6:"; also removed ":mu=\EW:", on the
+# grounds that there is no matching ":ml:"
+dg460-ansi|Data General Dasher 460 in ANSI-mode,
+	OTbs, am, msgr, ul,
+	cols#80, it#8, lines#24,
+	OTnl=\ED, blink=\E[5m, clear=\E[2J, cub1=^H, cud1=\E[B,
+	cuf1=\E[C, cup=\E[%i%p1%2d;%p2%2dH, cuu1=\E[A, dch1=\E[P,
+	dim=\E[2m, dl1=\E[M, ed=\E[J, el=\E[K, home=\E[H, ht=^I,
+	ich1=\E[@, il1=\E[L, ind=\E[S, is2=^^F@, kbs=\E[D,
+	kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A,
+	kf0=\E[001z, kf1=\E[002z, kf2=\E[003z, kf3=\E[004z,
+	kf4=\E[005z, kf5=\E[006z, kf6=\E[007z, kf7=\E[008z,
+	kf8=\E[009z, kf9=\E[00:z, khome=\E[H, lf0=f1, lf1=f2, lf2=f3,
+	lf3=f4, lf4=f5, lf5=f6, lf6=f7, lf7=f8, lf9=f10, mc0=\E[i,
+	rev=\E[7m, ri=\E[T, rmso=\E[m, rmul=\E[05,
+	sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p5%t;2%;%?%p2%t;4%;%?%p4%t;5%;
+	    %?%p1%p3%|%t;7%;m,
+	sgr0=\E(B\E[m, smso=\E[7m, smul=\E[4m, u8=\E[5n, u9=\E[0n,
+	use=ansi+cpr,
+# From: Wayne Throop <mcnc!rti-sel!rtp47!throopw> (not official)
+# Data General 605x
+# Ought to work for a Model 6242, Type D210 as well as a 605x.
+# Note that the cursor-down key transmits ^Z.  Job control users, beware!
+# This also matches a posted description of something called a `Dasher 100'
+# so there's a dg100 alias here.
+# (dg6053: the 4.4BSD file had <cub1=^H>, <cud1=^J>, <cuf1=^S>. -- esr)
+dg6053-old|dg100|Data General 6053,
+	OTbs, am, bw, ul,
+	cols#80, lines#24,
+	OTbc=^Y, bel=^G, clear=^L, cnorm=^L, cr=\r, cub1=^Y, cud1=^Z,
+	cuf1=^X, cup=\020%p2%c%p1%c, cuu1=^W, cvvis=^L^R, el=^K,
+	home=^H, ht=^I, is2=^R, kbs=^Y, kcub1=^Y, kcud1=^Z, kcuf1=^X,
+	kcuu1=^W, kf0=^^q, kf1=^^r, kf2=^^s, kf3=^^t, kf4=^^u, kf5=^^v,
+	kf6=^^w, kf7=^^x, kf8=^^y, kf9=^^z, khome=^H, rmcup=^L,
+	rmso=\0^^E, rmul=^U, smcup=^L^R, smso=\0\0\0\0\0\036D,
+	smul=^T,
+
+# (Some performance can be gained over the generic DG terminal type)
+dg6053|6053|6053-dg|dg605x|605x|605x-dg|d2|d2-dg|Data General DASHER 6053,
+	xon@,
+	home=\020\0\0, ll=^P\0^W, use=dg-generic,
+
+# Like 6053, but adds reverse video and more keypad and function keys.
+d200|d200-dg|Data General DASHER D200,
+	bold=^^D^T, home@, ll@, rev=^^D, rmso=^^E^],
+	sgr=\036%?%p1%p3%|%p6%|%tD%eE%;%?%p2%p6%|%t\024%e\025%;%?%p4
+	    %t\016%e\017%;%?%p1%p5%|%t\034%e\035%;,
+	sgr0=^O^U^]^^E, smso=^^D^\, use=dgkeys+15, use=dg6053,
+
+# DASHER D210 series terminals in ANSI mode.
+#	Reverse video, no insert/delete character/line, 7 bits/character only.
+#
+# Initialization string 1 sets:
+#	<0		- scrolling enabled
+#	<1		- blink enabled
+#	<4		- print characters regardless of attributes
+d210|d214|Data General DASHER D210 series,
+	am, bw, msgr, xon,
+	cols#80, lines#24,
+	bel=^G, blink=\E[5m, bold=\E[4;7m, clear=\E[2J, cr=\r,
+	cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=\E[B,
+	cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH,
+	cuu=\E[%p1%dA, cuu1=\E[A, dim=\E[2m, ed=\E[J, el=\E[K,
+	el1=\E[1K, home=\E[H, ind=\n, is1=\E[<0;<1;<4l,
+	ll=\E[H\E[A, nel=\n, rev=\E[7m, rmso=\E[m, rmul=\E[m,
+	sgr=\E[%?%p4%t5;%;%?%p2%p6%|%t4;%;%?%p1%p5%|%t2;%;%?%p1%p3%|
+	    %p6%|%t7;%;m,
+	sgr0=\E[m, smso=\E[2;7m, smul=\E[4m, use=dgkeys+7b,
+
+# DASHER D210 series terminals in DG mode.
+# Like D200, but adds clear to end-of-screen and needs XON/XOFF.
+d210-dg|d214-dg|Data General DASHER D210 series in DG mode,
+	xon,
+	ed=^^FF, use=d200-dg,
+
+# DASHER D211 series terminals in ANSI mode.
+# Like the D210, but with 8-bit characters and local printer support.
+#
+# Initialization string 2 sets:
+#	\E[2;1;1;1v
+#		2;1	- 8 bit operations
+#		1;1	- 8 bit (international) keyboard language
+#	\E(B		- default primary character set (U.S. ASCII)
+#	\E)4		- default secondary character set (international)
+#	^O		- primary character set
+#
+d211|d215|Data General DASHER D211 series,
+	km,
+	is2=\E[2;1;1;1v\E(B\E)4\017, mc0=\E[i, use=dgkeys+8b,
+	use=d210,
+
+# Initialization string 2 sets:
+#	\E[2;0;1;0v
+#		2;0	- 7 bit operations
+#		1;0	- 7 bit (native) keyboard language
+#	\E(0		- default character set (the keyboard native language)
+#	^O		- primary character set
+d211-7b|d215-7b|Data General DASHER D211 series in 7 bit mode,
+	km@,
+	is2=\E[2;0;1;0v\E(0\017, use=dgkeys+7b, use=d211,
+
+# Like the D210 series, but adds support for 8-bit characters.
+#
+# Reset string 2 sets:
+#	^^N	- secondary character set
+#	^^FS0>	- 8 bit international character set
+#	^^O	- primary character set
+#	^^FS00	- default character set (matching the native keyboard language)
+#
+d211-dg|d215-dg|Data General DASHER D211 series in DG mode,
+	km,
+	rs2=\036N\036FS0>\036O\036FS00, use=d210-dg,
+
+d216-dg|d216e-dg|d216+dg|d216e+dg|d217-dg|Data General DASHER D216 series in DG mode,
+	use=d211-dg,
+
+# Enhanced DG mode with changes to be more UNIX compatible.
+d216-unix|d216e-unix|d216+|d216e+|Data General DASHER D216+ in DG-UNIX mode,
+	mc5i,
+	it#8,
+	acsc=a\177j$k"l!m#n)q+t'u&v(w%x*, blink=^^PI,
+	clear=^^PH, cub1=^^PD, cud1=^^PB, cuf1=^^PC, cuu1=^^PA,
+	el=^^PE, home=^^PF, hpa=\020%p1%c\177, ht=^I, ind=\n,
+	is1=^R^C^^P@1, is3=^^Fz0, kHOM=^^Pf, kLFT=^^Pd, kPRT=^^P1,
+	kRIT=^^Pc, kclr=^^PH, kcub1=^^PD, kcud1=^^PB, kcuf1=^^PC,
+	kcuu1=^^PA, kel=^^PE, khome=^^PF, kprt=^^P0, mc0=^^F?9,
+	mc4=^^Fa, mc5=^^F`, rmacs=\036FS00,
+	rs2=\036N\036FS0E\036O\036FS00,
+	sgr=\036%?%p1%p3%|%p6%|%tD%eE%;%?%p2%p6%|%t\024%e\025%;
+	    \036P%?%p4%tI%eJ%;%?%p1%p5%|%t\034%e\035%;\036FS%?%p9%t1
+	    1%e00%;,
+	sgr0=\036PJ\025\035\036E\036FS00, smacs=\036FS11,
+	vpa=\020\177%p1%c, use=dgkeys+15, use=d216-dg,
+d216-unix-25|d216+25|Data General DASHER D216+ in DG-UNIX mode with 25 lines,
+	lines#25,
+	is3=^^Fz2, use=d216+,
+
+d217-unix|Data General DASHER D217 in DG-UNIX mode,
+	use=d216-unix,
+d217-unix-25|Data General DASHER D217 in DG-UNIX mode with 25 lines,
+	use=d216-unix-25,
+
+# DASHER D220 color terminal in ANSI mode.
+# Like the D470C but with fewer colors and screen editing features.
+#
+# Initialization string 1 sets:
+#	\E[<0;<1;<4l
+#		<0	- scrolling enabled
+#		<1	- blink enabled
+#		<4	- print characters regardless of attributes
+#	\E[m		- all attributes off
+# Reset string 1 sets:
+#	\Ec		- initial mode defaults (RIS)
+#
+d220|Data General DASHER D220,
+	mc5i@,
+	dl@, dl1@, il@, il1@, is1=\E[<0;<1;<4l\E[m, mc4@, mc5@, rs1=\Ec,
+	use=dg+color8, use=d470c,
+
+d220-7b|Data General DASHER D220 in 7 bit mode,
+	mc5i@,
+	dl@, dl1@, il@, il1@, is1=\E[<0;<1;<4l\E[m, mc4@, mc5@, rs1=\Ec,
+	use=dg+color8, use=d470c-7b,
+
+# Initialization string 3 sets:
+#	- default cursor (solid rectangle)
+# Reset string 2 sets:
+#	^^N     - secondary character set
+#	^^FS0>  - 8 bit international character set
+#	^^O     - primary character set
+#       ^^FS00  - default character set (matching the native keyboard language)
+#
+d220-dg|Data General DASHER D220 color terminal in DG mode,
+	mc5i@,
+	dl1@, home@, il1@, is2@, is3=^^FQ2, ll@, mc4@, mc5@, rs1@,
+	rs2=\036N\036FS0>\036O\036FS00, use=dgmode+color8,
+	use=d470c-dg,
+
+# DASHER D230C color terminal in ANSI mode.
+# Like the D220 but with minor ANSI compatibility improvements.
+#
+d230c|d230|Data General DASHER D230C,
+	blink=\E[5;50m, bold=\E[4;7;50m, dim=\E[2;50m, nel=\r\n,
+	rev=\E[7;50m, rmkx=\E[2;1v, rmso=\E[50m, rmul=\E[50m,
+	sgr=\E[%?%p1%p3%|%p6%|%t7;%{1}%e%{0}%;%PR%?%p4%t5;%{1}%e%{0}
+	    %;%PB%?%p2%p6%|%t4;%{1}%e%{0}%;%PU%?%p1%p5%|%t2;%{1}%e
+	    %{0}%;%PD50m\E)%?%p9%t6\016%e4\017%;,
+	sgr0=\E[50m\E)4\017, smkx=\E[2;0v, smso=\E[2;7;50m,
+	smul=\E[4;50m, use=dgkeys+7b, use=d220,
+
+d230c-dg|d230-dg|Data General DASHER D230C in DG mode,
+	use=d220-dg,
+
+# DASHER D400/D450 series terminals.
+# These add intelligent features like insert/delete to the D200 series.
+#
+# Initialization string 2 sets:
+#	^^FQ2		- default cursor (solid rectangle)
+#	^^FW		- character protection disabled
+#	^^FJ		- normal (80 column) mode
+#	^^F\^		- horizontal scrolling enabled (for alignment)
+#	^^FX004?	- margins at columns 0 and 79
+#	^^F]		- horizontal scrolling disabled
+#	^^O		- primary character set
+#	^^FS00		- default character set (the keyboard native language)
+#	- (should reset scrolling regions, but that glitches the screen)
+# Reset string 1 sets:
+#	^^FA		- all terminal defaults except scroll rate
+# Reset string 2 sets:
+#	^^F]		- horizontal scrolling disabled
+#	^^FT0		- jump scrolling
+#
+d400|d400-dg|d450|d450-dg|Data General DASHER D400/D450 series,
+	mc5i,
+	acsc=j$k"l!m#n)q+t'u&v(w%x*, civis=^^FQ0, cnorm=^^FQ2,
+	dch1=^^K, dl1=^^FI, enacs=\036N\036FS11\036O, home=^^FG,
+	hpa=\020%p1%c\177, ich1=^^J, il1=^^FH,
+	is2=\036FQ2\036FW\036FJ\036F\^\036FX004?\036F]\036O
+	    \036FS00,
+	ll=^^FG^W, mc4=^^Fa, mc5=^^F`, ri=^^I, rmacs=^^O, rs1=^^FA,
+	rs2=\036F]\036FT0,
+	sgr=\036%?%p1%p3%|%p6%|%tD%eE%;%?%p2%p6%|%t\024%e\025%;%?%p4
+	    %t\016%e\017%;%?%p1%p5%|%t\034%e\035%;\036%?%p9%tN%eO%;,
+	sgr0=^O^U^]^^E^^O, smacs=^^N, vpa=\020\177%p1%c,
+	use=d210-dg,
+
+# DASHER D410/D460 series terminals in ANSI mode.
+# These add a large number of intelligent terminal features.
+#
+# Initialization string 1 sets:
+#	\E[<0;<1;<2;<4l
+#		<0	- scrolling enabled
+#		<1	- blink enabled
+#		<2	- horizontal scrolling enabled (for alignment)
+#		<4	- print characters regardless of attributes
+#	\E[5;0v		- normal (80 column) mode
+#	\E[1;1;80w	- margins at columns 1 and 80
+#	\E[1;6;<2h
+#		1	- print all characters even if protected
+#		6	- character protection disabled
+#		<2	- horizontal scrolling disabled
+#	- (should reset scrolling regions, but that glitches the screen)
+#
+# Initialization string 2 sets:
+#	\E[3;2;2;1;1;1v
+#		3;2	- default cursor (solid rectangle)
+#		2;1	- 8 bit operations
+#		1;1	- international keyboard language
+#	\E(B		- default primary character set (U.S. ASCII)
+#	\E)4		- default secondary character set (international)
+#	^O		- primary character set
+#
+#	Reset string 1 sets:
+#	\Ec		- initial mode defaults (RIS)
+#	\E[<2h		- horizontal scrolling disabled
+#
+# Reset string 2 sets:
+#	\E[4;0;2;1;1;1v
+#		4;0	- jump scrolling
+#		2;1	- 8 bit operations
+#		1;1	- 8 bit (international) keyboard language
+#	\E(B		- default primary character set (U.S. ASCII)
+#	\E)4		- default secondary character set (international)
+#
+d410|d411|d460|d461|Data General DASHER D410/D460 series,
+	mc5i,
+	acsc=j$k"l!m#n)q+t'u&v(w%x*, civis=\E[3;0v,
+	cnorm=\E[3;2v, dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM,
+	dl1=\E[M, ich=\E[%p1%d@, ich1=\E[@, il=\E[%p1%dL, il1=\E[L,
+	is1=\E[<0;<1;<2;<4l\E[5;0v\E[1;1;80w\E[1;6;<2h,
+	is2=\E[3;2;2;1;1;1v\E(B\E)4\017, mc4=\E[4i, mc5=\E[5i,
+	ri=\EM, rmacs=\E)4\017, rs1=\Ec\E[<2h,
+	rs2=\E[4;0;2;1;1;1v\E(B\E)4,
+	sgr=\E[%?%p1%t2;7%;%?%p3%t7;%;%?%p4%t5;%;%?%p2%t4;%;%?%p1%p5
+	    %|%t2;%;%?%p6%t4;7;%;m\E)%?%p9%t6\016%e4\017%;,
+	sgr0=\E[m\E)4\017, smacs=\E)6\016, use=d211,
+
+# Initialization string 2 sets:
+#	\E[3;2;2;0;1;0v
+#		3;2	- default cursor (solid rectangle)
+#		2;0	- 7 bit operations
+#		1;0	- 7 bit (native) keyboard language
+#	\E(0		- default character set (the keyboard native language)
+#	^O		- primary character set
+#
+# Reset string 2 sets:
+#	\E[4;0;2;0;1;0v
+#		4;0	- jump scrolling
+#		2;0	- 7 bit operations
+#		1;0	- 7 bit (native) keyboard language
+#	\E(0		- default character set (the keyboard native language)
+#
+d410-7b|d411-7b|d460-7b|d461-7b|Data General DASHER D410/D460 series in 7 bit mode,
+	km@,
+	enacs=\E)6, is2=\E[3;2;2;0;1;0v\E(0\017, rmacs=^O,
+	rs2=\E[4;0;2;0;1;0v\E(0,
+	sgr=\E[%?%p1%p5%|%t2;%;%?%p2%p6%|%t4;%;%?%p1%p3%|%p6%|%t7;%;
+	    %?%p4%t5;%;m%?%p9%t\016%e\017%;,
+	sgr0=\E[m\017, smacs=^N, use=dgkeys+7b, use=d410,
+
+d410-dg|d460-dg|d411-dg|d461-dg|Data General DASHER D410/D460 series in DG mode,
+	km,
+	enacs@, rmacs=\036FS00,
+	sgr=\036%?%p1%p3%|%p6%|%tD%eE%;%?%p2%p6%|%t\024%e\025%;%?%p4
+	    %t\016%e\017%;%?%p1%p5%|%t\034%e\035%;\036FS%?%p9%t11%e0
+	    0%;,
+	sgr0=\017\025\035\036E\036FS00, smacs=\036FS11,
+	use=d400-dg,
+
+# DASHER D410/D460 series terminals in wide (126 columns) ANSI mode.
+#
+# Initialization string 1 sets:
+#	\E[<0;<1;<2;<4l
+#		<0	- scrolling enabled
+#		<1	- blink enabled
+#		<2	- horizontal scrolling enabled (for alignment)
+#		<4	- print characters regardless of attributes
+#	\E[5;1v		- compressed (135 column) mode
+#	\E[1;1;126	- margins at columns 1 and 126
+#	\E[1;6;<2h
+#		1	- print all characters even if protected
+#		6	- character protection disabled
+#		<2	- horizontal scrolling disabled
+#	- (should reset scrolling regions, but that glitches the screen)
+#
+# Reset string 1 sets:
+#	\Ec		- initial mode defaults (RIS)
+#	\E[5;1v		- compressed (135 column) mode
+#	\E[1;1;126w	- margins at columns 1 and 126
+#	\E[<2h		- horizontal scrolling disabled
+#
+d410-w|d411-w|d460-w|d461-w|Data General DASHER D410/D460 series in wide mode,
+	cols#126,
+	is1=\E[<0;<1;<2;<4l\E[5;1v\E[1;1;126w\E[1;6;<2h,
+	rs1=\Ec\E[5;1v\E[1;1;126w\E[<2h, use=d410,
+
+d410-7b-w|d411-7b-w|d460-7b-w|d461-7b-w|Data General DASHER D410/D460 series in wide 7 bit mode,
+	cols#126,
+	is1=\E[<0;<1;<2;<4l\E[5;1v\E[1;1;126w\E[1;6;<2h,
+	rs1=\Ec\E[5;1v\E[1;1;126w\E[<2h, use=d410-7b,
+
+d412-dg|d462-dg|d462e-dg|d412+dg|d462+dg|d413-dg|d463-dg|Data General DASHER D412/D462 series in DG mode,
+	use=d410-dg,
+
+# These add intelligent features like scrolling regions.
+d412-unix|d462-unix|d412+|d462+|Data General DASHER D412+/D462+ series in Unix mode,
+	civis=^^FQ0, clear=^^FE, cnorm=^^FQ5,
+	cup=\036FP%p2%2.2X%p1%2.2X, dch1=^^K, dl1=^^FI,
+	home=^^FG, hpa=\036FP%p1%2.2XFF, ich1=^^J, il1=^^FH,
+	is2=\036FQ5\036FW\036FJ\036F\^\036FX004F\036O
+	    \036FS00,
+	ll=\036FG\036PA, mc0=^A, rc=\036F}11, ri=^^I,
+	rs1=\036FA\036FT0, rs2=^^P@1, sc=\036F}10,
+	vpa=\036FPFF%p1%2.2X,
+	wind=\036FB%?%p1%t%p1%2.2X0%;%p2%p1%-%{1}%+%2.2X0%?%{23}%p2
+	     %>%t000%;\036FX%p3%2.2X%p4%2.2X,
+	use=d216+,
+d412-unix-w|d462-unix-w|d412+w|d462+w|Data General DASHER D412+/D462+ series in wide Unix mode,
+	cols#132,
+	is2=\036FQ5\036FW\036FK\036F\^\036FX0083\036O
+	    \036FS00,
+	rs2=\036P@1\036FK\036FX0083,
+	wind=\036FB%?%p1%t%p1%2.2X1%;%p2%p1%-%{1}%+%2.2X1%?%{23}%p2
+	     %>%t001%;\036FX%p3%2.2X%p4%2.2X,
+	use=d412-unix,
+d412-unix-25|d462-unix-25|d412+25|d462+25|Data General DASHER D412+/D462+ series in Unix mode with 25 lines,
+	lines#25,
+	is3=^^Fz2,
+	wind=\036FB%?%p1%t%p1%2.2X0%;%p2%p1%-%{1}%+%2.2X0%?%{24}%p2
+	     %>%t000%;\036FX%p3%2.2X%p4%2.2X,
+	use=d462+,
+d412-unix-s|d462-unix-s|d412+s|d462+s|Data General DASHER D412+/D462+ in Unix mode with status line,
+	eslok, hs,
+	clear=\036FG\036PH, fsl=\036F}01\022,
+	is3=\036Fz2\036F}00\036FB180000\036F}01, ll@,
+	tsl=\036F}00\036FP%p1%2.2X18\036PG,
+	wind=\036FB%?%p1%t%p1%2.2X0%;%p2%p1%-%{1}%+%2.2X0%?%{23}%p2
+	     %>%t%{23}%p2%-%2.2X0%;000\036FX%p3%2.2X%p4%2.2X,
+	use=d462+,
+
+#	Relative cursor motions are confined to the current window,
+#	which is not what the scrolling region specification expects.
+#	Thus, relative vertical cursor positioning must be deleted.
+d412-unix-sr|d462-unix-sr|d412+sr|d462+sr|Data General DASHER D412+/D462+ in Unix mode with scrolling region,
+	csr=\036FB%?%p1%t%p1%2.2X0%;%p2%p1%-%{1}%+%2.2X0%?%{23}%p2%>
+	    %t000%;,
+	cud1@, cuu1@, ll@, use=d462+,
+
+d413-unix|d463-unix|Data General DASHER D413/D463 series in DG-UNIX mode,
+	use=d412-unix,
+d413-unix-w|d463-unix-w|Data General DASHER D413/D463 series in wide DG-UNIX mode,
+	use=d412-unix-w,
+d413-unix-25|d463-unix-25|Data General DASHER D413/D463 series in DG-UNIX mode with 25 lines,
+	use=d412-unix-25,
+d413-unix-s|d463-unix-s|Data General DASHER D413/D463 in DG-UNIX mode with status line,
+	use=d412-unix-s,
+d413-unix-sr|d463-unix-sr|Data General DASHER D413/D463 in DG-UNIX mode with scrolling region,
+	use=d412-unix-sr,
+
+d414-unix|d464-unix|Data General D414/D464 in DG-UNIX mode,
+	use=d413-unix,
+d414-unix-w|d464-unix-w|Data General D414/D464 in wide DG-UNIX mode,
+	use=d413-unix-w,
+d414-unix-25|d464-unix-25|Data General D414/D464 in DG-UNIX mode with 25 lines,
+	use=d413-unix-25,
+d414-unix-s|d464-unix-s|Data General D414/D464 in DG-UNIX mode with status line,
+	use=d413-unix-s,
+d414-unix-sr|d464-unix-sr|Data General D414/D464 in DG-UNIX mode with scrolling region,
+	use=d413-unix-sr,
+
+d430c-dg|d430-dg|Data General D430C in DG mode,
+	use=d413-dg, use=dg+fixed,
+d430c-dg-ccc|d430-dg-ccc|Data General D430C in DG mode with configurable colors,
+	use=d413-dg, use=dg+ccc,
+
+d430c-unix|d430-unix|Data General D430C in DG-UNIX mode,
+	use=d413-unix, use=dgunix+fixed,
+d430c-unix-w|d430-unix-w|Data General D430C in wide DG-UNIX mode,
+	use=d413-unix-w, use=dgunix+fixed,
+d430c-unix-25|d430-unix-25|Data General D430C in DG-UNIX mode with 25 lines,
+	use=d413-unix-25, use=dgunix+fixed,
+d430c-unix-s|d430-unix-s|Data General D430C in DG-UNIX mode with status line,
+	use=d413-unix-s, use=dgunix+fixed,
+d430c-unix-sr|d430-unix-sr|Data General D430C in DG-UNIX mode with scrolling region,
+	use=d413-unix-sr, use=dgunix+fixed,
+d430c-unix-ccc|d430-unix-ccc|Data General D430C in DG-UNIX mode with configurable colors,
+	use=d413-unix, use=dgunix+ccc,
+d430c-unix-w-ccc|d430-unix-w-ccc|Data General D430C in wide DG-UNIX mode with configurable colors,
+	use=d413-unix-w, use=dgunix+ccc,
+d430c-unix-25-ccc|d430-unix-25-ccc|Data General D430C in DG-UNIX mode with 25 lines and configurable colors,
+	use=d413-unix-25, use=dgunix+ccc,
+d430c-unix-s-ccc|d430-unix-s-ccc|Data General D430C in DG-UNIX mode with status line and configurable colors,
+	use=d413-unix-s, use=dgunix+ccc,
+d430c-unix-sr-ccc|d430-unix-sr-ccc|Data General D430C in DG-UNIX mode with scrolling region and configurable colors,
+	use=d413-unix-sr, use=dgunix+ccc,
+
+# DASHER D470C color terminal in ANSI mode.
+# Like the D460 but with 16 colors and without a compressed mode.
+#
+# Initialization string 1 sets:
+#	\E[<0;<1;<2;<4l
+#		<0	- scrolling enabled
+#		<1	- blink enabled
+#		<2	- horizontal scrolling enabled (for alignment)
+#		<4	- print characters regardless of attributes
+#	\E[1;1;80w	- margins at columns 1 and 80
+#	\E[1;6;<2h
+#		1	- print all characters even if protected
+#		6	- character protection disabled
+#		<2	- horizontal scrolling disabled
+#	- (should reset scrolling regions, but that glitches the screen)
+#
+d470c|d470|Data General DASHER D470C,
+	is1=\E[<0;<1;<2;<4l\E[1;1;80w\E[1;6;<2h,
+	sgr=\E[%?%p3%t7;%;%?%p4%t5;%;%?%p2%t4;%;%?%p6%t4;7;%;%?%p1%t
+	    2;7;%;%?%p5%t2;%;m\E)%?%p9%t6\016%e4\017%;,
+	use=dg+color, use=d460,
+
+d470c-7b|d470-7b|Data General DASHER D470C in 7 bit mode,
+	is1=\E[<0;<1;<2;<4l\E[1;1;80w\E[1;6;<2h,
+	sgr=\E[%?%p3%t7;%;%?%p4%t5;%;%?%p2%t4;%;%?%p6%t4;7;%;%?%p1%t
+	    2;7;%;%?%p5%t2;%;m%?%p9%t\016%e\017%;,
+	use=dg+color, use=d460-7b,
+
+# Initialization string 2 sets:
+#	^^FQ2		- default cursor (solid rectangle)
+#	^^FW		- character protection disabled
+#	^^F\^		- horizontal scrolling enabled (for alignment)
+#	^^FX004?	- margins at columns 0 and 79
+#	^^F]		- horizontal scrolling disabled
+#	^^O		- primary character set
+#	^^FS00		- default character set (the keyboard native language)
+#	- (should reset scrolling regions, but that glitches the screen)
+#
+d470c-dg|d470-dg|Data General DASHER D470C in DG mode,
+	is2=\036FQ2\036FW\036F\^\036FX004?\036F]\036O
+	    \036FS00,
+	use=dgmode+color, use=d460-dg,
+
+# DASHER D555 terminal in ANSI mode.
+# Like a D411, but has an integrated phone.
+d555|Data General DASHER D555,
+	use=d411,
+d555-7b|Data General DASHER D555 in 7-bit mode,
+	use=d411-7b,
+d555-w|Data General DASHER D555 in wide mode,
+	use=d411-w,
+d555-7b-w|Data General DASHER D555 in wide 7-bit mode,
+	use=d411-7b-w,
+d555-dg|Data General DASHER D555 series in DG mode,
+	use=d411-dg,
+
+# DASHER D577 terminal in ANSI mode.
+# Like a D411, but acts as a keyboard for serial printers ("KSR" modes).
+d577|Data General DASHER D577,
+	use=d411,
+d577-7b|Data General DASHER D577 in 7-bit mode,
+	use=d411-7b,
+d577-w|Data General DASHER D577 in wide mode,
+	use=d411-w,
+d577-7b-w|Data General DASHER D577 in wide 7-bit mode,
+	use=d411-7b-w,
+
+d577-dg|d578-dg|Data General DASHER D577/D578 series in DG mode,
+	use=d411-dg,
+
+# DASHER D578 terminal.
+# Like a D577, but without compressed mode; like a D470C in this respect.
+#
+# Initialization string 1 sets:
+#	\E[<0;<1;<2;<4l
+#		<0	- scrolling enabled
+#		<1	- blink enabled
+#		<2	- horizontal scrolling enabled (for alignment)
+#		<4	- print characters regardless of attributes
+#	\E[1;1;80w	- margins at columns 1 and 80
+#	\E[1;6;<2h
+#		1	- print all characters even if protected
+#		6	- character protection disabled
+#		<2	- horizontal scrolling disabled
+#	- (should reset scrolling regions, but that glitches the screen)
+#
+d578|Data General DASHER D578,
+	is1=\E[<0;<1;<2;<4l\E[1;1;80w\E[1;6;<2h, use=d577,
+d578-7b|Data General DASHER D578 in 7-bit mode,
+	is1=\E[<0;<1;<2;<4l\E[1;1;80w\E[1;6;<2h, use=d577-7b,
+
+#### Datamedia (dm)
+#
+# Datamedia was headquartered in Nashua, New Hampshire until it went
+# out of business in 1993, but the ID plates on the terminals referred
+# to the factory in Pennsauken, NJ.  The factory was sold to a PCB board
+# manufacturer which threw out all information about the terminals.
+#
+
+cs10|colorscan|Datamedia Color Scan 10,
+	msgr,
+	cols#80, lines#24,
+	bel=^G, clear=\E[H\E[J, cr=\r, cub1=^H, cud1=\n, cuf1=\E[C,
+	cup=\E[%i%p1%02d;%p2%02dH, cuu1=\E[A, ed=\E[J, el=\E[K,
+	ind=\n, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A,
+	kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, rmso=\E[m, rmul=\E[m,
+	sgr0=\E[m, smso=\E[7m, smul=\E[4m,
+cs10-w|Datamedia Color Scan 10 with 132 columns,
+	cols#132,
+	cup=\E[%i%p1%02d;%p2%03dH, use=cs10,
+
+# (dm1520: removed obsolete ":ma=^\ ^_^P^YH:" -- esr)
+dm1520|dm1521|Datamedia 1520,
+	OTbs, am, xenl,
+	cols#80, it#8, lines#24,
+	bel=^G, clear=^L, cr=\r, cub1=^H, cud1=\n, cuf1=^\,
+	cup=\036%p2%{32}%+%c%p1%{32}%+%c, cuu1=^_, ed=^K, el=^],
+	home=^Y, ht=^I, ind=\n, kcub1=^H, kcud1=\n, kcuf1=^\, kcuu1=^_,
+	khome=^Y,
+# dm2500: this terminal has both <ich> and <smir>. Applications using
+# termcap/terminfo directly (rather than through ncurses) might be confused.
+dm2500|datamedia2500|Datamedia 2500,
+	OTbs, OTnc,
+	cols#80, lines#24,
+	bel=^G, clear=^^^^^?, cub1=^H, cud1=\n, cuf1=^\,
+	cup=\014%p2%{96}%^%c%p1%{96}%^%c, cuu1=^Z,
+	dch1=\020\010\030\035$<10*>,
+	dl1=\020\032\030\035$<10*>, el=^W, home=^B,
+	ich1=\020\034\030\035$<10*>,
+	il1=\020\n\030\035\030\035$<15>, ind=\n, pad=\377,
+	rmdc=^X^], rmir=\377\377\030\035$<10>, rmso=^X^],
+	smdc=^P, smir=^P, smso=^N,
+# dmchat is like DM2500, but DOES need "all that padding" (jcm 1/31/82)
+# also, has a meta-key.
+# From: <goldberger@su-csli.arpa>
+# (dmchat: ":MT:" changed to ":km:" -- esr)
+dmchat|dmchat version of Datamedia 2500,
+	km,
+	dl1=\020\032\030\035$<2/>,
+	il1=\020\n\030\035\030\035$<1*/>, use=dm2500,
+# (dm3025: ":MT:" changed to ":km:" -- esr)
+dm3025|Datamedia 3025a,
+	OTbs, km,
+	cols#80, it#8, lines#24,
+	bel=^G, clear=\EM$<2>, cr=\r, cub1=^H, cud1=\n, cuf1=\EC,
+	cup=\EY%p2%{32}%+%c%p1%{32}%+%c, cuu1=\EA,
+	dch1=\010$<6>, dl1=\EP\EA\EQ$<130>, ed=\EJ$<2>, el=\EK,
+	home=\EH, ht=^I, il1=\EP\n\EQ$<130>, ind=\n, ip=$<6>,
+	is2=\EQ\EU\EV, rmdc=\EQ, rmir=\EQ, rmso=\EO0, smdc=\EP,
+	smir=\EP, smso=\EO1,
+dm3045|Datamedia 3045a,
+	OTbs, am, eo, km@, ul, xenl,
+	dch1=\EB$<6>, dl1@, il1@, is2=\EU\EV, kcuf1=\EC, kcuu1=\EA,
+	kf0=\Ey\r, kf1=\Ep\r, kf2=\Eq\r, kf3=\Er\r, kf4=\Es\r,
+	kf5=\Et\r, kf6=\Eu\r, kf7=\Ev\r, kf8=\Ew\r, kf9=\Ex\r,
+	khome=\EH, pad=^?, rmdc@, rmir=\EP, rmso@, smdc@, smso@,
+	use=dm3025,
+# Datamedia DT80 soft switches:
+# 1	0=Jump  1=Smooth
+#	Autorepeat	0=off  1=on
+#	Screen		0=Dark 1=light
+#	Cursor		0=u/l  1=block
+#
+# 2	Margin Bell	0=off  1=on
+#	Keyclick	0=off  1=on
+#	ANSI/VT52	0=VT52 1=ANSI
+#	Xon/Xoff	0=Off  1=On
+#
+# 3	Shift3		0=Hash 1=UK Pound
+#	Wrap		0=Off  1=On
+#	Newline		0=Off  1=On
+#	Interlace	0=Off  1=On
+#
+# 4	Parity		0=Odd  1=Even
+#	Parity		0=Off  1=On
+#	Bits/Char	0=7    1=8
+#	Power		0=60Hz 1=50Hz
+#
+# 5	Line Interface  0=EIA  1=Loop
+#	Aux Interface	0=EIA  1=Loop
+#	Local Copy	0=Off  1=On
+#	Spare
+#
+# 6	Aux Parity	0=Odd  1=Even
+#	Aux Parity	0=Off  1=On
+#	Aux Bits/Char	0=7    1=8
+#	CRT Saver	0=Off  1=On
+# dm80/1 is a VT100 lookalike, but it doesn't seem to need any padding.
+dm80|dmdt80|dt80|Datamedia dt80/1,
+	clear=\E[2J\E[H, cud1=\n, cuf1=\E[C,
+	cup=%i\E[%p1%d;%p2%dH, cuu1=\E[A, ed=\E[J, el=\E[K,
+	home=\E[H, mc0=\E[0i, mc4=\E[4i, mc5=\E[5i, ri=\EM,
+	rmso=\E[m, rmul=\E[m, sgr0=\E[m\017$<2>, smso=\E[7m,
+	smul=\E[4m, use=vt100+4bsd,
+# except in 132 column mode, where it needs a little padding.
+# This is still less padding than the VT100, and you can always turn on
+# the ^S/^Q handshaking, so you can use VT100 flavors for things like
+# reverse video.
+dm80w|dmdt80w|dt80w|Datamedia dt80/1 in 132 char mode,
+	cols#132,
+	clear=\E[H\E[2J$<50/>, cud1=\n,
+	cup=\E[%i%p1%d;%p2%dH$<5/>, cuu1=\E[A$<5/>,
+	ed=\E[0J$<20/>, el=\E[0K$<20/>, use=dm80,
+# From: Adam Thompson <athompso@pangea.ca> Sept 10 1995
+dt80-sas|Datamedia DT803/DTX for SAS usage,
+	am, bw,
+	cols#80, lines#24,
+	acsc=``a1fxgqh0jYk?lZm@nEooppqDrrsstCu4vAwBx3yyzz{{||}}~~,
+	bel=^G, clear=^L, cr=\r,
+	csr=\E=%p1%{32}%+%c%{32}%c\E#1\E=%p2%{32}%+%c%{32}%c\E#2,
+	cub1=^H, cud1=\EB, cuf1=^\,
+	cup=\E=%p2%{32}%+%c%p1%{32}%+%c, cuu1=^_, dl1=\EM, ed=^K,
+	el=^], ff=^L, home=^Y, ht=^I, hts=\E'1, il1=\EL, ind=\EB,
+	is2=\E)0\E<\EP\E'0\E$2, kclr=^L, kcub1=^H, kcud1=\n,
+	kcuf1=^\, kcuu1=^_, ked=^K, kel=^], khome=^Y, mc4=^O, mc5=^N,
+	rev=\E$2\004, ri=\EI, rmacs=\EG, rmso=^X, sgr0=^X, smacs=\EF,
+	smso=\E$2\004, tbc=\E'0,
+
+# Datamedia Excel 62, 64 from Gould/SEL UTX/32 via BRL
+# These aren't end-all Excel termcaps; but do insert/delete char/line
+# and name some of the extra function keys.  (Mike Feldman ccvaxa!feldman)
+# The naming convention has been bent somewhat, with the use of E? (where
+# E is for 'Excel') as # a name.  This was done to distinguish the entries
+# from the other Datamedias in use here, and yet to associate a model of
+# the Excel terminals with the regular datamedia terminals that share
+# major characteristics.
+excel62|excel64|Datamedia Excel 62,
+	dch1=\E[P, kbs=^H, kcub1=^H, kcud1=\n, kf5=\EOu, kf6=\EOv,
+	kf7=\EOw, kf8=\EOx, kf9=\EOy, rmir=\E[4l, smir=\E[4h,
+	use=dt80,
+excel62-w|excel64-w|Datamedia Excel 62 in 132 char mode,
+	dch1=\E[P, kbs=^H, kcub1=^H, kcud1=\n, kf5=\EOu, kf6=\EOv,
+	kf7=\EOw, kf8=\EOx, kf9=\EOy, rmir=\E[4l, smir=\E[4h,
+	use=dt80w,
+excel62-rv|excel64-rv|Datamedia Excel 62 in reverse video mode,
+	dch1=\E[P, flash=\E[?5l\E[?5h, kbs=^H, kcub1=^H, kcud1=\n,
+	kf5=\EOu, kf6=\EOv, kf7=\EOw, kf8=\EOx, kf9=\EOy, rmir=\E[4l,
+	smir=\E[4h, use=dt80,
+
+#### Falco
+#
+#	Falco Data Products
+#	440 Potrero Avenue
+#	Sunnyvale, CA 940864-196
+#	Vox: (800)-325-2648
+#	Fax: (408)-745-7860
+#	Net: techsup@charm.sys.falco.com
+#
+# Current Falco models as of 1995 are generally ANSI-compatible and support
+# emulations of DEC VT-series, Wyse, and TeleVideo types.
+#
+
+# Test version for Falco ts-1. See <arpavax.hickman@ucb> for info
+# This terminal was released around 1983 and was discontinued long ago.
+# The standout and underline highlights are the same.
+falco|ts1|ts-1|Falco ts-1,
+	OTbs, am,
+	cols#80, it#8, lines#24,
+	bel=^G, clear=\E*, cr=\r, cub1=^H, cud1=\n, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW,
+	dl1=\ER, ed=\EY, el=\ET\EG0\010, home=^^, ht=^I, il1=\EE,
+	ind=\n, is2=\Eu\E3, kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K,
+	kf0=^A0\r, rmir=\Er, rmso=\Eg0, rmul=\Eg0, sgr0=\Eg0,
+	smir=\Eq, smso=\Eg1, smul=\Eg1,
+falco-p|ts1p|ts-1p|Falco ts-1 with paging option,
+	OTbs, am, da, db, mir, msgr, ul,
+	cols#80, it#8, lines#24,
+	bel=^G, cbt=\EI, clear=\E*, cr=\r, cub1=^H, cud1=\E[B,
+	cuf1=\E[C, cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=\E[A,
+	dch1=\EW, dl1=\ER, ed=\EY, el=\ET\EG0\010\Eg0, ht=^I,
+	il1=\EE, ind=\n, is2=\EZ\E3\E_c, kcub1=\E[D, kcud1=\E[B,
+	kcuf1=\E[C, kcuu1=\E[A, khome=\E[H, rmcup=\E_b, rmir=\Er,
+	rmso=\Eg0, rmul=\Eg0, sgr0=\Eg0, smcup=\E_d, smir=\Eq,
+	smso=\Eg4, smul=\Eg1,
+# (ts100: I added <rmam>/<smam> based on the init string -- esr)
+ts100|ts100-sp|Falco ts100-sp,
+	am, mir, msgr, xenl, xon,
+	cols#80, it#8, lines#24, vt#3,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\E[5m$<2>, bold=\E[1m$<2>,
+	clear=\E[H\E[J$<50>, cr=\r, csr=\E[%i%p1%d;%p2%dr,
+	cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=\n,
+	cuf=\E[%p1%dC, cuf1=\E[C$<2>,
+	cup=\E[%i%p1%d;%p2%dH$<5>, cuu=\E[%p1%dA,
+	cuu1=\E[A$<2>, dch1=\E~W, dl1=\E~R, ed=\E[J$<50>,
+	el=\E[K$<3>, el1=\E[1K$<3>, enacs=\E(B\E)0, home=\E[H,
+	ht=^I, hts=\EH, ich1=\E~Q, il1=\E~E, ind=\n, is1=\E~)\E~ea,
+	kbs=^H, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
+	rc=\E8, rev=\E[7m$<2>, ri=\EM$<5>, rmacs=^O, rmam=\E[?7l,
+	rmkx=\E[?1l\E>, rmso=\E[m$<2>, rmul=\E[m$<2>,
+	rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, sc=\E7,
+	sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5
+	    %;m%?%p9%t\016%e\017%;$<2>,
+	sgr0=\E[m\017$<2>, smacs=^N, smam=\E[?7h, smkx=\E[?1h\E=,
+	smso=\E[1;7m$<2>, smul=\E[4m$<2>, tbc=\E[3g,
+	use=decid+cpr, use=vt100+fnkeys,
+ts100-ctxt|Falco ts-100 saving context,
+	rmcup=\E~_b, smcup=\E~_d\E[2J, use=ts100,
+
+#### Florida Computer Graphics
+#
+
+# Florida Computer Graphics Beacon System, using terminal emulator program
+# "host.com", as provided by FCG.  This description is for an early release
+# of the "host" program.  Known bug: <ed> clears the whole screen, so it's
+# commented out.
+
+# From: David Bryant <cbosg!djb> 1/7/83
+beacon|FCG Beacon System,
+	am, da, db,
+	cols#80, lines#32,
+	bel=\ESTART\r\E37\r\EEND\r$<1>,
+	blink=\ESTART\r\E61\,1\r\EEND\r, clear=\EZ$<10>, cr=\r,
+	cub1=^H, cud1=\n, cuf1=\EV,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c$<20>, cuu1=\EU,
+	dch1=\EW, dl1=\ER, el=\ET, home=\EH$<10>, ich1=\EQ, il1=\EE,
+	ind=\n, rev=\ESTART\r\E59\,1\r\EEND\r, rmcup=,
+	rmso=\ESTART\r\E70\,0\r\EEND\r$<20>,
+	rmul=\ESTART\r\E60\,0\r\EEND\r,
+	sgr0=\ESTART\r\E78\r\E70\,0\r\EEND\r$<20>,
+	smcup=\ESTART\r\E2\,0\r\E12\r\EEND\r$<10>,
+	smso=\ESTART\r\E70\,6\r\EEND\r$<20>,
+	smul=\ESTART\r\E60\,1\r\EEND\r,
+
+#### Fluke
+#
+
+# The f1720a differences from ANSI: no auto margin, destructive
+# tabs, # of lines, funny highlighting and underlining
+f1720|f1720a|fluke 1720A,
+	xt,
+	cols#80, lines#16, xmc#1,
+	bel=^G, clear=\E[H\E[2J, cr=\r, cub1=^H, cud1=\E[B,
+	cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, ed=\E[J,
+	el=\E[K, ind=\ED, is2=\E[H\E[2J, kcub1=^_, kcud1=^],
+	kcuf1=^^, kcuu1=^\, ri=\EM, rmso=\E[m, rmul=\E[m, sgr0=\E[m,
+	smso=\E[7m, smul=\E[4m,
+
+#### Liberty Electronics (Freedom)
+#
+#	Liberty Electronics
+#	48089 Fremont Blvd
+#	Fremont CA 94538
+#	Vox: (510)-623-6000
+#	Fax: (510)-623-7021
+
+# From: <faletti@berkeley.edu>
+# (f100: added empty <acsc> to suppress a tic warning;
+# made this relative to adm+sgr -- note that <invis> isn't
+# known to work for f100 but does on the f110. --esr)
+f100|freedom|freedom100|Liberty Freedom model 100,
+	OTbs, am, bw, hs, mir, msgr, xon,
+	cols#80, lines#24,
+	acsc=, bel=^G, cbt=\EI, clear=^Z, cr=\r, cub1=^H, cud1=\n,
+	cuf1=^L, cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K,
+	dch1=\EW, dl1=\ER$<11.5*>, dsl=\Eg\Ef\r, ed=\EY, el=\ET,
+	flash=\Eb$<200>\Ed, fsl=\r, home=^^, hpa=\E]%p1%{32}%+%c,
+	ht=^I, hts=\E1, il1=\EE$<8.5*>, ind=\n, ip=$<6>,
+	is2=\Eg\Ef\r\Ed, kbs=^H, kcbt=\EI, kcub1=^H, kcud1=^V,
+	kcuf1=^L, kcuu1=^K, kf1=^A@\r, kf10=^AI\r, kf2=^AA\r,
+	kf3=^AB\r, kf4=^AC\r, kf5=^AD\r, kf6=^AE\r, kf7=^AF\r,
+	kf8=^AG\r, kf9=^AH\r, khome=^^, ri=\Ej, rmacs=\E$, rmir=\Er,
+	smacs=\E%%, smir=\Eq, tbc=\E3, tsl=\Eg\Ef,
+	vpa=\E[%p1%{32}%+%c, use=adm+sgr,
+f100-rv|freedom-rv|Liberty Freedom 100 in reverse video,
+	flash=\Ed$<200>\Eb, is2=\Eg\Ef\r\Eb, use=f100,
+# The f110 and f200 have problems with vi(1).  They use the ^V
+# code for the down cursor key. When kcud1 is defined in terminfo
+# as ^V, the Control Character Quoting capability (^V in insert mode)
+# is lost! It cannot be remapped in vi because it is necessary to enter
+# a ^V to to quote the ^V that is being remapped!!!
+#
+# f110/f200 users will have to decide whether
+# to lose the down cursor key or the quoting capability. We will opt
+# initially for leaving the quoting capability out, since use of VI
+# is not generally applicable to most interactive applications
+# (f110: added <ht>, <khome> & <kcbt> from f100 -- esr)
+f110|freedom110|Liberty Freedom 110,
+	bw@, eslok,
+	it#8, wsl#80,
+	blink=\EG2, bold=\EG0, civis=\E.1, cnorm=\E.2, cud1=^V,
+	dim=\EG@, dl1=\ER, dsl=\Ef\r, flash=\Eb$<200/>\Ed, il1=\EE,
+	ip@, is2@, kclr=^^, kdch1=\EW, kdl1=\ER, ked=\EY, kel=\ET,
+	kf0=^AI\r, kf10@, kich1=\EQ, kil1=\EE, mc4=\Ea, mc5=\E`,
+	ri=\EJ, rmacs=\E%%, rmir=\Er\EO, smacs=\E$, smir=\EO\Eq,
+	smso=\EG<, tsl=\Ef, use=f100,
+f110-14|Liberty Freedom 110 14inch,
+	dch1@, use=f110,
+f110-w|Liberty Freedom 110 - 132 cols,
+	cols#132, use=f110,
+f110-14w|Liberty Freedom 110 14in/132 cols,
+	cols#132,
+	dch1@, use=f110,
+# (f200: added <acsc> to suppress tic warnings re <smacs>/<rmacs> --esr)
+f200|freedom200|Liberty Freedom 200,
+	OTbs, am, eslok, hs, mir, msgr, xon,
+	cols#80, it#8, lines#24, wsl#80,
+	acsc=, bel=^G, blink=\EG2, bold=\EG0, cbt=\EI, civis=\E.0,
+	clear=^Z, cnorm=\E.1, cr=\r,
+	csr=\Em0%p1%{32}%+%c%p2%{32}%+%c, cub1=^H, cud1=^V,
+	cuf1=^L, cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K,
+	dch1=\EW, dim=\EG@, dl1=\ER, dsl=\Ef\r, ed=\EY, el=\ET,
+	flash=\Eo$<200/>\En, fsl=\r, home=^^,
+	hpa=\E]%p1%{32}%+%c, hts=\E1, il1=\EE, ind=\n, kbs=^H,
+	kclr=^^, kcub1=^H, kcud1=^V, kcuf1=^L, kcuu1=^K, kdch1=\EW,
+	kdl1=\ER, ked=\EY, kel=\ET, kf0=^AI\r, kf1=^A@\r, kf2=^AA\r,
+	kf3=^AB\r, kf4=^AC\r, kf5=^AD\r, kf6=^AE\r, kf7=^AF\r,
+	kf8=^AG\r, kf9=^AH\r, kich1=\EQ, kil1=\EE, mc4=\Ea, mc5=\E`,
+	ri=\EJ, rmacs=\E%%, rmir=\Er, smacs=\E$, smir=\Eq, smso=\EG<,
+	tbc=\E3, tsl=\Ef, vpa=\E[%p1%{32}%+%c, use=adm+sgr,
+f200-w|Liberty Freedom 200 - 132 cols,
+	cols#132, use=f200,
+# The f200 has the ability to reprogram the down cursor key. The key is
+# reprogrammed to ^J (linefeed). This value is remembered in non-volatile RAM,
+# so powering the terminal off and on will not cause the change to be lost.
+f200vi|Liberty Freedom 200 for vi,
+	flash=\Eb$<200/>\Ed, kcud1=\n, use=f200,
+f200vi-w|Liberty Freedom 200 - 132 cols for vi,
+	cols#132, use=f200vi,
+
+#### GraphOn (go)
+#
+#	Graphon Corporation
+#	544 Division Street
+#	Campbell, CA 95008
+#	Vox: (408)-370-4080
+#	Fax: (408)-370-5047
+#	Net: troy@graphon.com (Troy Morrison)
+#
+#
+# The go140 and go225 have been discontinued.  GraphOn now makes X terminals,
+# including one odd hybrid that starts out life on power-up as a character
+# terminal, than can be switched to X graphics mode (driven over the serial
+# line) by an escape sequence.  No info on this beast yet.
+# (go140: I added <rmam>/<smam> based on the init string -- esr)
+go140|graphon go-140,
+	OTbs,
+	cols#80, it#8, lines#24,
+	clear=\E[H\E[2J$<10/>, cub1=^H, cud1=\E[B, cuf1=\E[C,
+	cup=\E[%i%p1%2d;%p2%2dH, cuu1=\E[A, dch1=\E[P, dl1=\E[M,
+	ed=\E[J$<10/>, el=\E[K, ht=^I,
+	if=/usr/share/tabset/vt100, il1=\E[L,
+	is2=\E<\E=\E[?3l\E[?7l\E(B\E[J\E7\E[;r\E8\E[m\E[q,
+	kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kf1=\EOP,
+	kf2=\EOQ, kf3=\EOR, kf4=\EOS, khome=\E[H, ri=\EM,
+	rmam=\E[?7l, rmir=\E[4l, rmkx=\E[?1l\E>, rmso=\E[m,
+	rmul=\E[m, sgr0=\E[m, smam=\E[?7h, smir=\E[4h,
+	smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m,
+go140w|graphon go-140 in 132 column mode,
+	am,
+	cols#132,
+	is2=\E<\E=\E[?3h\E[?7h\E(B\E[J\E7\E[;r\E8\E[m\E[q,
+	use=go140,
+# Hacked up vt200 termcap to handle GO-225/VT220
+# From: <edm@nwnexus.WA.COM>
+# (go225: I added <rmam>/<smam> based on the init string -- esr)
+go225|go-225|Graphon 225,
+	OTbs, am, mir, xenl,
+	cols#80, it#8, lines#25, vt#3,
+	blink=\E[5m, bold=\E[1m, clear=\E[H\E[J,
+	csr=\E[%i%p1%d;%p2%dr, cub1=^H, cud1=\n, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, dch1=\E[P, dl1=\E[M,
+	ed=\E[J, el=\E[K, home=\E[H, ht=^I, il1=\E[L, ind=\ED,
+	is2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, kbs=^H,
+	kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kf1=\EOP,
+	kf2=\EOQ, kf3=\EOR, kf4=\EOS, khome=\E[H, rc=\E8, rev=\E[7m,
+	rf=/usr/share/tabset/vt100, ri=\EM, rmam=\E[?7l,
+	rmcup=\E[!p\E[?7h\E[2;1;1#w, rmir=\E[4l, rmkx=\E>,
+	rmso=\E[27m, rmul=\E[24m, rs1=\E[!p\E[?7h\E[2;1;1#w,
+	sc=\E7, sgr0=\E[m, smam=\E[?7h, smcup=\E[2;0#w\E[1;25r,
+	smir=\E[4h, smkx=\E=, smso=\E[7m, smul=\E[4m,
+
+#### Harris (Beehive)
+#
+# Bletch.  These guys shared the Terminal Brain Damage laurels with Hazeltine.
+# Their terminal group is ancient history now (1995) though the parent
+# company is still in business.
+#
+
+# Beehive documentation is undated and marked Preliminary and has no figures
+# so we must have early Superbee2 (Model 600, according to phone conversation
+# with mfr.). It has proved reliable except for some missing padding
+# (notably after \EK and <nl> at bottom of screen).
+#
+# The key idea is that AEP mode is poison for <cup> & that US's in
+# the local memory should be avoided like the plague. That means
+# that the 2048 character local buffer is used as 25 lines of 80
+# characters, period. No scrolling local memory, folks. It also
+# appears that we cannot use naked INS LINE feature since it uses
+# US. The sbi fakes <il1> with an 80-space insert that may be too
+# slow at low speeds; also spaces get converted to \040 which is
+# too long for some programs (not vi).  DEL LINE is ok but slow.
+#
+# The <nl> string is designed for last line of screen ONLY; cup to
+# 25th line corrects the motion inherent in scrolling to Page 1.
+#
+# There is one understood bug. It is that the screen appears to
+# pop to a new (blank) page after a <nel>, or leave a half-line
+# ellipsis to a quad that is the extra 48 memory locations. The
+# data received is dumped into memory but not displayed.  Not to
+# worry if <cup> is being used; the lines not displayed will be,
+# whenever the cursor is moved up there. Since <cup> is addressed
+# relative to MEMORY of window, nothing is lost; but beware of
+# relative cursor motion (<cuu1>,<cud1>,<cuf1>,<cub1>). Recommended,
+# therefore, is setenv MORE -c .
+#
+# WARNING: Not all features tested.
+#
+# Timings are assembled from 3 sources. Some timings may reflect
+# SB2/Model 300 that were used if more conservative.
+# Tested on a Model 600 at 1200 and 9600 bd.
+#
+# The BACKSPACEkb option is cute. The NEWLINE key, so cleverly
+# placed on the keyboard and useless because of AEP, is made
+# into a backspace key. In use ESC must be pressed twice (to send)
+# and sending ^C must be prefixed by ESC to avoid that weird
+# transmit mode associated with ENTER key.
+#
+# IF TERMINAL EVER GOES CATATONIC with the cursor buzzing across
+# the screen, then it has dropped into ENTER mode; hit
+# RESET--ONLINE--!tset.
+#
+# As delivered this machine has a FATAL feature that will throw
+# it into that strange transmit state (SPOW) if the space bar is
+# hit after a CR is received, but before receiving a LF (or a
+# few others).
+#
+# The circuits MUST be modified to eliminate the SPOW latch.
+# This is done by strapping on chip A46 of the I/O board; cut
+# the p.c. connection to Pin 5 and strap Pin 5 to Pin 8 of that
+# chip. This mod has been checked out on a Mod 600 of Superbee II.
+# With this modification absurdly high timings on cr are
+# unnecessary.
+#
+# NOTE WELL that the rear panel switch should be set to CR/LF,
+# not AEP!
+#
+sb1|Beehive SuperBee,
+	OTbs, am, bw, da, db, mir, ul, xsb,
+	cols#80, lines#25, xmc#1,
+	bel=^G, cbt=\E`$<650>, clear=\EH$<1>\EJ$<3>, cr=$<1>\r,
+	cub1=^H, cud1=\n, cuf1=\EC$<3>, cup=\EF%p2%03d%p1%03d,
+	cuu1=\EA$<3>, dch1=\EP$<3>, dl1=\EM$<100>, ed=\EJ$<3>,
+	el=\EK$<3>, home=\EH$<1>, ht=^I, hts=\E1,
+	il1=\EN\EL$<3>\EQ\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s
+	    \s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s
+	    \s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s
+	    \s\s\s\s\s\EP$<3>\s\EO\ER\EA$<3>,
+	ind=\n, is2=\EE$<3>\EX\EZ\EO\Eb\Eg\ER, kbs=^_, kcub1=\ED,
+	kcud1=\EB, kcuf1=\EC, kcuu1=\EA, kdl1=\EM, ked=\EJ, kel=\EK,
+	kf0=\E2, kf9=\E1, khome=\EH, kich1=\EQ\EO, krmir=\ER,
+	lf0=TAB CLEAR, lf9=TAB SET, rmcup=, rmir=\ER, rmso=\E_3,
+	rmul=\E_3, sgr0=\E_3, smcup=\EO, smir=\EQ\EO, smso=\E_1,
+	smul=\E_0, tbc=\E3, use=hp+pfk-cr,
+sbi|superbee|Beehive SuperBee at Indiana U.,
+	xsb,
+	cr=\r$<1>, il1=\EN$<1>\EL$<9>\EQ \EP$<9> \EO\ER\EA,
+	use=sb1,
+# Alternate (older) description of Superbee - f1=escape, f2=^C.
+# Note: there are at least 3 kinds of superbees in the world.  The sb1
+# holds onto escapes and botches ^C's.  The sb2 is the best of the 3.
+# The sb3 puts garbage on the bottom of the screen when you scroll with
+# the switch in the back set to CRLF instead of AEP.  This description
+# is tested on the sb2 but should work on all with either switch setting.
+# The f1/f2 business is for the sb1 and the <xsb> can be taken out for
+# the other two if you want to try to hit that tiny escape key.
+# This description is tricky: being able to use cup depends on there being
+# 2048 bytes of memory and the hairy <nl> string.
+superbee-xsb|Beehive SuperBee (improved),
+	am, da, db, xsb,
+	cols#80, it#8, lines#25,
+	clear=\EH\EJ$<3>, cnorm=\n, cr=\r$<1000>, cub1=^H, cud1=\n,
+	cuf1=\EC, cup=\EF%p2%3d%p1%3d, cuu1=\EA$<3>,
+	dch1=\EP$<3>, dl1=\EM$<100>, ed=\EJ$<3>, el=\EK$<3>,
+	home=\EH, ht=^I, hts=\E1,
+	ind=\n\0\0\0\n\0\0\0\EA\EK\0\0\0\ET\ET, is2=\EH\EJ,
+	kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, khome=\EH,
+	rmso=\E_3, sgr0=\E_3, smso=\E_1, tbc=\E3, use=hp+pfk-cr,
+# This loses on lines > 80 chars long, use at your own risk
+superbeeic|SuperBee with insert char,
+	ich1=, rmir=\ER, smir=\EQ, use=superbee-xsb,
+sb2|sb3|fixed SuperBee,
+	xsb@, use=superbee,
+
+#### Beehive Medical Electronics
+#
+# Steve Seymour <srseymour@mindspring.com> writes (Wed, 03 Feb 1999):
+# Regarding your question though; Beehive terminals weren't made by Harris.
+# They were made by Beehive Medical Electronics in Utah. They went out of
+# business in the early '80s.
+#
+# (OK, then, I don't know why a couple of these say "Harris Beehive".)
+#
+
+# Reports are that most of these Beehive entries (except superbee) have not
+# been tested and do not work right.  <rmso> is a trouble spot.  Be warned.
+
+# (bee: <ich1> was empty, which is obviously bogus -- esr)
+beehive|bee|Harris Beehive,
+	OTbs, am, mir,
+	cols#80, lines#24,
+	cbt=\E>, clear=\EE, cub1=^H, cud1=\EB, cuf1=\EC,
+	cup=\EF%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, dch1=\EP,
+	dl1=\EM, ed=\EJ, el=\EK, home=\EH, il1=\EL, kbs=^H, kcbt=\E>,
+	kclr=\EE, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA,
+	kdch1=\EP, kdl1=\EM, kel=\EK, khome=\EH, kich1=\EQ, kil1=\EL,
+	krmir=\E@, rmir=\E@, rmso=\Ed@, rmul=\Ed@, sgr0=\Ed@,
+	smir=\EQ, smso=\EdP, smul=\Ed`,
+# set tab is ^F, clear (one) tab is ^V, no way to clear all tabs.
+# good grief - does this entry make :sg:/:ug: when it doesn't have to?
+# look at those spaces in <rmso>/<smso>.  Seems strange to me...
+# (beehive: <if=/usr/share/tabset/beehive> removed, no such file.  If you
+# really care, cook up one using ^F -- esr)
+beehive3|bh3m|beehiveIIIm|Harris Beehive 3m,
+	OTbs, am,
+	cols#80, it#8, lines#20,
+	bel=^G, clear=^E^R, cr=\r, cub1=^H, cud1=\n, cuf1=^L, cuu1=^K,
+	dl1=\021$<350>, ed=^R, el=^P, home=^E, ht=^I, hts=^F,
+	il1=\023$<160>, ind=\n, ll=^E^K, rmso=\s^_, smso=^]\s,
+beehive4|bh4|Beehive 4,
+	am,
+	cols#80, lines#24,
+	bel=^G, clear=\EE, cr=\r, cub1=\ED, cud1=\n, cuf1=\EC,
+	cuu1=\EA, ed=\EJ, el=\EK, home=\EH, ind=\n,
+# There was an early Australian kit-built computer called a "Microbee".
+# It's not clear whether this is for one of those or for a relative
+# of the Beehive.
+microb|microbee|Micro Bee series,
+	OTbs, am,
+	cols#80, it#8, lines#24,
+	bel=^G, clear=\EE, cr=\r, cub1=^H, cud1=\n, cuf1=\EC,
+	cup=\EF%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, ed=\EJ,
+	el=\EK, ht=^I, ind=\n, kcub1=\ED, kcud1=\EB, kcuf1=\EC,
+	kcuu1=\EA, kf9=\Ex, khome=\EH, rmso=\Ed@, rmul=\Ed@,
+	sgr0=\Ed@, smso=\s\EdP, smul=\Ed`, use=hp+pfk-cr,
+
+# 8675, 8686, and bee from Cyrus Rahman
+# (8675: changed k10, k11...k16 to k;, F1...F6 -- esr)
+ha8675|Harris 8675,
+	is2=\ES\E#\E*\Eh\Em\E?\E1\E9\E@\EX\EU, kf1=^F,
+	kf10=\Ed, kf11=^W, kf12=\ER, kf13=\EE, kf14=\EI, kf15=\Ei,
+	kf16=\Eg, kf2=^P, kf3=^N, kf4=^V, kf5=\n, kf6=^T, kf7=^H, kf8=^?,
+	kf9=\Ee, use=bee,
+# (8686: changed k10, k11...k16 to k;, F1...F6; fixed broken continuation
+# in :is: -- esr)
+ha8686|Harris 8686,
+	is2=\ES\E#\E*\Eh\Em\E?\E1\E9\E@\EX\EU\E"*Z01\E"8F35021B7C83#
+	    \E"8F45021B7D83#\E"8F55021B7E83#\E"8F65021B7F83#\E"8F750
+	    21B7383#\E"8F851BD7#\E"8F95021B7083#\E"8FA5021B7183#\E"8
+	    FB5021B7283#,
+	kf1=^B\Ep^C, kf10=\Ej, kf11=\EW, kf12=^B\E{^C,
+	kf13=^B\E|^C, kf14=^B\E}^C, kf15=^B\E~^C, kf16=^B\E^?^C,
+	kf2=^B\Eq^C, kf3=^B\Er^C, kf4=^B\Es^C, kf5=\E3, kf6=\EI,
+	kf7=\ER, kf8=\EJ, kf9=\E(, use=bee,
+
+#### Hazeltine
+#
+# Hazeltine appears to be out of the terminal business as of 1995.  These
+# guys were co-owners of the Terminal Brain Damage Hall Of Fame along with
+# Harris. They have a hazeltine.com domain (but no web page there ) and can
+# be reached at:
+#
+#	Hazeltine
+#	450 East Pulaski Road
+#	Greenlawn, New York 11740
+#
+# As late as 1993, manuals for the terminal product line could still be
+# purchased from:
+#
+#	TRW Customer Service Division
+#	15 Law Drive
+#	P.O. Box 2076
+#	Fairfield, NJ 07007-2078
+#
+# They're now (1998) a subsidiary of General Electric, operating under the
+# marque "GEC-Marconi Hazeltine" and doing military avionics.  Web page
+# at <http://www.gec.com/cpd/1ncpd.htm#1.55>.
+#
+
+# Since <cuf1> is blank, when you want to erase something you
+# are out of luck.  You will have to do ^L's a lot to
+# redraw the screen.  h1000 is untested.  It doesn't work in
+# vi - this terminal is too dumb for even vi.  (The code is
+# there but it isn't debugged for this case.)
+hz1000|Hazeltine 1000,
+	OTbs,
+	cols#80, lines#12,
+	bel=^G, clear=^L, cr=\r, cub1=^H, cud1=\n, cuf1=\s, home=^K,
+	ind=\n,
+# From: <cbosg!ucbvax!pur-ee!cincy!chris> Thu Aug 20 09:09:18 1981
+hz1420|Hazeltine 1420,
+	OTbs, am,
+	cols#80, lines#24,
+	bel=^G, clear=\E^\, cr=\r, cub1=^H, cud1=\n, cuf1=^P,
+	cup=\E\021%p2%c%p1%{32}%+%c, cuu1=\E^L, dl1=\E^S,
+	ed=\E^X, el=\E^O, ht=^N, il1=\E^Z, ind=\n, rmso=\E^Y,
+	smso=\E^_,
+# New "safe" cursor movement (11/87) from <cgs@umd5.umd.edu>.  Prevents
+# freakout with out-of-range args and tn3270.  No hz since it needs to
+# receive tildes.
+hz1500|Hazeltine 1500,
+	OTbs, am, hz,
+	cols#80, lines#24,
+	bel=^G, clear=~^\, cr=\r, cub1=^H, cud1=~^K, cuf1=^P,
+	cup=~\021%p2%p2%?%{30}%>%t%{32}%+%;%{96}%+%c%p1%{96}%+%c,
+	cuu1=~^L, dl1=~\023$<40>, ed=~\030$<10>, el=~^O, home=~^R,
+	il1=~\032$<40>, ind=\n, kcub1=^H, kcud1=\n, kcuf1=^P,
+	kcuu1=~^L, khome=~^R, rmso=~^Y, smso=~^_,
+# h1510 assumed to be in sane escape mode.  Else use h1500.
+# (h1510: early versions of this entry apparently had "<rmso=\E^_>,
+# <smso=\E^Y>, but these caps were commented out in 8.3; also,
+# removed incorrect and overridden ":do=^J:" -- esr)
+hz1510|Hazeltine 1510,
+	OTbs, am,
+	cols#80, lines#24,
+	bel=^G, clear=\E^\, cr=\r, cub1=^H, cud1=\E^K, cuf1=^P,
+	cup=\E\021%p2%c%p1%c, cuu1=\E^L, dl1=\E^S, ed=\E^X,
+	el=\E^O, il1=\E^Z, ind=\n,
+# Hazeltine 1520
+# The following switch settings are assumed for normal operation:
+#	FULL		CR		U/L_CASE	ESCAPE
+#	FORMAT_OFF	EOM_A_OFF	EOM_B_OFF	WRAPAROUND_ON
+# Other switches may be set for operator convenience or communication
+# requirements.
+hz1520|Hazeltine 1520,
+	OTbs, am, bw, msgr,
+	cols#80, lines#24,
+	bel=^G, bold=\E^_, clear=\E^\, cr=\r, cub1=^H, cud1=\n,
+	cuf1=^P, cup=\E\021%p2%c%p1%c, cuu1=\E^L, dl1=\E^S,
+	ed=\E^X, el=\E^O, home=\E^R, il1=\E^Z, ind=\n, kbs=^H,
+	kclr=\E^\, kcub1=^H, kcud1=\E^K, kcuf1=^P, kcuu1=\E^L,
+	kdl1=\E^S, ked=\E^X, kel=\E^O, khome=\E^R, kil1=\E^Z,
+	rmso=\E^Y, rs1=\E$\E\005\E?\E\031, sgr0=\E^Y, smso=\E^_,
+# This version works with the escape switch off
+# (h1520: removed incorrect and overridden ":do=^J:" -- esr)
+hz1520-noesc|Hazeltine 1520 (no escape),
+	am, hz,
+	cols#80, lines#24,
+	bel=^G, clear=~^\, cr=\r, cub1=^H, cud1=~^K, cuf1=^P,
+	cup=~\021%p2%c%p1%c$<1>, cuu1=~^L, dl1=~^S, ed=~^X, el=~^O,
+	home=~^R, il1=~^Z, ind=\n, rmso=~^Y, smso=~^_,
+# Note: the h1552 appears to be the first Hazeltine terminal which
+# is not braindamaged.  It has tildes and backprimes and everything!
+# Be sure the auto lf/cr switch is set to cr.
+hz1552|Hazeltine 1552,
+	OTbs,
+	cud1=\n, dl1=\EO, il1=\EE, lf1=blue, lf2=red, lf3=green,
+	use=vt52,
+hz1552-rv|Hazeltine 1552 reverse video,
+	cud1=\n, rmso=\ET, smso=\ES, use=hz1552,
+# Note: h2000 won't work well because of a clash between upper case and ~'s.
+hz2000|Hazeltine 2000,
+	OTbs, OTnc, am,
+	cols#74, lines#27,
+	bel=^G, clear=~\034$<6>, cub1=^H, cud1=\n,
+	cup=~\021%p2%c%p1%c, dl1=~\023$<6>, home=~^R,
+	il1=~\032$<6>, ind=\n, pad=^?,
+# Date: Fri Jul 23 10:27:53 1982.  Some unknown person wrote:
+# I tested this termcap entry for the Hazeltine Esprit with vi. It seems
+# to work ok. There is one problem though if one types a lot of garbage
+# characters very fast vi seems not able to keep up and hangs while trying
+# to insert. That's in insert mode while trying to insert in the middle of
+# a line. It might be because the Esprit doesn't have insert char and delete
+# char as a built in function. Vi has to delete to end of line and then
+# redraw the rest of the line.
+esprit|Hazeltine Esprit I,
+	OTbs, am, bw,
+	cols#80, lines#24,
+	bel=^G, cbt=\E^T, clear=\E^\, cr=\r, cub1=^H, cud1=\E^K,
+	cuf1=^P, cup=\E\021%p2%c%p1%c, cuu1=\E^L, dl1=\E^S,
+	ed=\E^W, el=\E^O, home=\E^R, il1=\E^Z, ind=\n, is2=\E?, kbs=^H,
+	kcub1=^H, kcud1=\E^K, kcuf1=^P, kcuu1=\E^L, kf0=^B0\n,
+	kf1=^B1\n, kf2=^B2\n, kf3=^B3\n, kf4=^B4\n, kf5=^B5\n,
+	kf6=^B6\n, kf7=^B7\n, kf8=^B8\n, kf9=^B9\n, khome=\E^R,
+	lf0=0, lf1=1, lf2=2, lf3=3, lf4=4, lf5=5, lf6=6, lf7=7, lf8=8, lf9=9,
+	rmkx=\E>, rmso=\E^Y, smkx=\E<, smso=\E^_,
+esprit-am|Hazeltine esprit auto-margin,
+	am, use=esprit,
+# Hazeltine Modular-1 from Cliff Shackelton <ittvax!ittral!shackelt> via BRL
+# Vi it seems always wants to send a control J for "do" and it turned out
+# that the terminal would work somewhat if the auto LF/CR was turned off.
+# (hmod1: removed :dn=~^K: -- esr)
+hmod1|Hazeltine Modular 1,
+	OTbs, am, hz,
+	cols#80, lines#24,
+	bel=^G, cbt=~^T, clear=~^\, cr=\r, cub1=^H, cud1=~^K, cuf1=^P,
+	cup=~\021%p2%c%p1%c, cuu1=~^L, dl1=~^S, home=~^R, il1=~^Z,
+	ind=\n, kcub1=^H, kcud1=~^K, kcuf1=^P, kcuu1=~^L, khome=~^R,
+	rc=~^Q, rmso=~^Y, sc=~^E, sgr0=~^Y, smso=~^_,
+#
+# Hazeltine Executive 80 Model 30 (1554?)
+#	from  Will Martin <control@ALMSA-1.ARPA> via BRL
+# Like VT100, except for different "am" behavior.
+hazel|exec80|h80|he80|Hazeltine Executive 80,
+	OTbs, OTpt, am,
+	cols#80, it#8, lines#24, vt#3,
+	OTnl=\n, bel=^G, blink=\E[5m$<2/>, bold=\E[1m$<2/>,
+	clear=\E[;H\E[2J$<50/>, cr=\r, csr=\E[%i%p1%d;%p2%dr,
+	cub1=^H, cud1=\n, cuf1=\E[C$<2/>,
+	cup=\E[%i%p1%d;%p2%dH$<5/>, cuu1=\E[A$<2/>,
+	ed=\E[J$<50/>, el=\E[K$<3/>, home=\E[H, ht=^I,
+	is2=\E[1;24r\E[24;1H, kbs=^H, kcub1=\EOD, kcud1=\EOB,
+	kcuf1=\EOC, kcuu1=\EOA, kf1=\EOP, kf2=\EOQ, kf3=\EOR,
+	kf4=\EOS, rc=\E8, rev=\E[7m$<2/>,
+	rf=/usr/share/tabset/vt100, ri=\EM$<5/>,
+	rmkx=\E[?1l\E>, rmso=\E[m$<2/>, rmul=\E[m$<2/>,
+	rs1=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, sc=\E7,
+	sgr0=\E[m$<2/>, smkx=\E[?1h\E=, smso=\E[7m$<2/>,
+	smul=\E[4m$<2/>,
+
+#### IBM
+#
+
+ibm327x|line mode IBM 3270 style,
+	gn,
+	clear=\r\n, el=\r, home=\r,
+
+ibm3101|i3101|IBM 3101-10,
+	OTbs, am, xon,
+	cols#80, lines#24,
+	bel=^G, clear=\EK, cr=\r, cub1=^H, cud1=\n, cuf1=\EC,
+	cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, ed=\EJ,
+	el=\EI, home=\EH, hts=\E0, ind=\n, kcub1=\ED, kcud1=\EB,
+	kcuf1=\EC, kcuu1=\EA, nel=\r\n, tbc=\EH,
+ibm3151|IBM 3151 display,
+	is2=\E S, rmacs=\E>B, rmcup=\E>B, rs2=\E S, s0ds=\E>B,
+	sgr=\E4%{64}%?%p1%t%{65}%|%;%?%p2%t%{66}%|%;%?%p3%t%{65}%|%;
+	    %?%p4%t%{68}%|%;%?%p5%t%{64}%|%;%?%p6%t%{72}%|%;%?%p7%t
+	    %{80}%|%;%c%?%p9%t\E>A%e\E>B%;,
+	sgr0=\E4@\E>B, smacs=\E>A, smcup=\E>B, use=ibm3162,
+# From: Mark Easter <marke@fsi-ssd.csg.ssd.fsi.com> 29 Oct 1992
+# removed kend, knp, kpp -TD
+#
+# From: Stephen Powell <zlinuxman@wowway.com> 23 Apr 2015
+# Added ich1 (kich1 without ich1 doesn't make sense).
+# Added il1 (kil1 without il1 doesn't make sense).
+# Added xon (terminal uses XON/XOFF flow control).
+#
+ibm3161|ibm3163|wy60-316X|wyse60-316X|IBM 3161/3163 display,
+	OTbs, am, mir, msgr, xon,
+	cols#80, it#8, lines#24,
+	acsc=j\352k\353l\354m\355n\356q\361t\364u\365v\366w\367x
+	     \370,
+	bel=^G, blink=\E4D, bold=\E4H, clear=\EH\EJ, cr=\r, cub1=\ED,
+	cud1=\EB, cuf1=\EC, cup=\EY%p1%{32}%+%c%p2%{32}%+%c,
+	cuu1=\EA, dch1=\EQ, dl1=\EO, ed=\EJ, el=\EI, home=\EH,
+	ich1=\EP \010, il1=\EN, ind=\n, invis=\E4P, kbs=^H, kcbt=\E2,
+	kclr=\EL\r, kctab=\E1, kcub1=\ED, kcud1=\EB, kcuf1=\EC,
+	kcuu1=\EA, kdch1=\EQ, kdl1=\EO, ked=\EJ, kel=\EI, kf1=\Ea\r,
+	kf10=\Ej\r, kf11=\Ek\r, kf12=\El\r, kf13=\E!a\r,
+	kf14=\E!b\r, kf15=\E!c\r, kf16=\E!d\r, kf17=\E!e\r,
+	kf18=\E!f\r, kf19=\E!g\r, kf2=\Eb\r, kf20=\E!h\r,
+	kf21=\E!i\r, kf22=\E!j\r, kf23=\E!k\r, kf24=\E!l\r,
+	kf3=\Ec\r, kf4=\Ed\r, kf5=\Ee\r, kf6=\Ef\r, kf7=\Eg\r,
+	kf8=\Eh\r, kf9=\Ei\r, khome=\EH, khts=\E0, kich1=\EP \010,
+	kil1=\EN, ktbc=\E 1, mc4=^P^T, mc5=^P^R, rev=\E4A,
+	rmcup=\E>A, rmso=\E4@, rmul=\E4@,
+	sgr=\E4%{64}%?%p1%t%{65}%|%;%?%p2%t%{66}%|%;%?%p3%t%{65}%|%;
+	    %?%p4%t%{68}%|%;%?%p5%t%{64}%|%;%?%p6%t%{72}%|%;%?%p7%t
+	    %{80}%|%;%c%?%p9%t\E>A%e\E<@%;,
+	sgr0=\E4@\E<@, smcup=\E>A, smso=\E4A, smul=\E4B,
+
+ibm3161-C|IBM 3161-C NLS terminal using cartridge,
+	rmcup=\E>B, s0ds=\E>B, s1ds=\E>A, smcup=\E>B, use=ibm3161,
+#
+# From: Stephen Powell <zlinuxman@wowway.com> 23 Apr 2015
+# Deleted il1.  (il1 will now be inherited from ibm3161-C, which inherits
+# it from ibm3161.
+#
+ibm3162|IBM 3162 display,
+	blink=\E4$a, bold=\E4(a, invis=\E40a, rev=\E4!a,
+	rmso=\E4>b, rmul=\E4=b, sgr0=\E4@, smso=\E4!a, smul=\E4"a,
+	use=ibm3161-C,
+
+# This really should not use setab/setaf, but it is clear that the
+# original terminfo does not toggle red/blue colors as in setb/setf.
+ibm3164|i3164|IBM 3164,
+	msgr,
+	colors#8, pairs#64,
+	op=\E4 "@, rmcup=\E!9(N\E>B, s0ds=\E>B, s1ds=\E>A,
+	setab=\E4  %p1%{64}%+%c,
+	setaf=\E4%?%p1%t %p1%{32}%+%c%e!'%;@,
+	smcup=\E!9/N\E>B, use=ibm3161,
+
+ibm5151|wy60-AT|wyse60-AT|IBM 5151 Monochrome display,
+	am, bw, msgr, xon,
+	cols#80, it#8, lines#25,
+	acsc=j\331k\277l\332m\300n\305q\304t\303u\264v\301w\302x
+	     \263,
+	bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[J, cr=\r,
+	cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=\n,
+	cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH,
+	cuu=\E[%p1%dA, cuu1=\E[A, dch1=\E[P, dl=\E[%p1%dM,
+	dl1=\E[M, ech=\E[%p1%dX, ed=\E[J, el=\E[K, home=\E[H,
+	hpa=\E[%i%p1%dG, il=\E[%p1%dL, il1=\E[L, ind=\E[S,
+	invis=\E[8m, is2=\Ec, kbs=^H, kcbt=\E[Z, kclr=\E[144q,
+	kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kdch1=\E[P,
+	ked=\E[148q, kel=\E[142q, kend=\E[146q, kf1=\E[001q,
+	kf10=\E[010q, kf11=\E[011q, kf12=\E[012q, kf13=\E[013q,
+	kf14=\E[014q, kf15=\E[015q, kf16=\E[016q, kf17=\E[017q,
+	kf18=\E[018q, kf19=\E[019q, kf2=\E[002q, kf20=\E[020q,
+	kf21=\E[021q, kf22=\E[022q, kf23=\E[023q, kf24=\E[024q,
+	kf25=\E[025q, kf26=\E[026q, kf27=\E[027q, kf28=\E[028q,
+	kf29=\E[029q, kf3=\E[003q, kf30=\E[030q, kf31=\E[031q,
+	kf32=\E[032q, kf33=\E[033q, kf34=\E[034q, kf35=\E[035q,
+	kf36=\E[036q, kf4=\E[004q, kf5=\E[005q, kf6=\E[006q,
+	kf7=\E[007q, kf8=\E[008q, kf9=\E[009q, khome=\E[H,
+	kich1=\E[139q, kil1=\E[140q, kind=\E[151q, knp=\E[154q,
+	kpp=\E[150q, kri=\E[155q, krmir=\E[4l, rev=\E[7m, ri=\E[T,
+	rmir=\E[4l, rmso=\E[m, rmul=\E[m, rs2=\Ec,
+	sgr=\E[%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1
+	    %;%?%p7%t;8%;m,
+	sgr0=\E[0m, smir=\E[4h, smso=\E[7m, smul=\E[4m,
+	use=ecma+index,
+
+ibmaed|IBM Experimental display,
+	OTbs, am, eo, msgr,
+	cols#80, it#8, lines#52,
+	clear=\EH\EK, cub1=^H, cud1=\EB, cuf1=\EC,
+	cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, dch1=\EQ,
+	dl1=\EO, ed=\EJ, el=\EI, flash=\EG, home=\EH, ht=^I, ich1=\EP,
+	il1=\EN, kbs=^H, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA,
+	rmso=\E0, sgr0=\E0, smso=\E0,
+ibm-apl|apl|IBM apl terminal simulator,
+	lines#25, use=dm1520,
+# (ibmmono: this had an unknown `sb' boolean, I changed it to `bs'.
+# Also it had ":I0=f10:" which pretty obviously should be "l0=f10" -- esr)
+ibmmono|IBM workstation monochrome,
+	eslok, hs,
+	bold=\EZ, dl1=\EM, dsl=\Ej\EY8 \EI\Ek, fsl=\Ek, il1=\EL,
+	invis=\EF\Ef0;\Eb0;, kbs=^H, kf0=\E<, kf1=\ES, kf2=\ET,
+	kf3=\EU, kf4=\EV, kf5=\EW, kf6=\EP, kf7=\EQ, kf8=\ER, kf9=\EY,
+	khome=\EH, kich1=\0, kind=\EE, knp=\EE, kpp=\Eg, kri=\EG,
+	lf0=f10, rev=\Ep, ri=\EA, rmso=\Ez, rmul=\Ew,
+	sgr0=\Ew\Eq\Ez\EB, smso=\EZ, smul=\EW, tsl=\Ej\EY8%+ \Eo,
+	use=ibm3101,
+ibmega|IBM Enhanced Color Display,
+	cr=\r, cud1=\n, ht=^I, ind=\n, kbs=^H, kcub1=^H, kcud1=\n,
+	nel=\r\n, use=ibmmono,
+# This color scheme is assumed in some recent IBM terminal descriptions
+# (green on black, emulated on a 16-color terminal).
+ibm+color|IBM color definitions,
+	colors#8, ncv#3, pairs#64,
+	op=\E[32m\E[40m,
+	setb=\E[%?%p1%{0}%=%t40m%e%p1%{1}%=%t41m%e%p1%{2}%=%t42m%e
+	     %p1%{3}%=%t43m%e%p1%{4}%=%t44m%e%p1%{5}%=%t45m%e%p1%{6}
+	     %=%t46m%e%p1%{7}%=%t107m%;,
+	setf=\E[%?%p1%{0}%=%t30m%e%p1%{1}%=%t31m%e%p1%{2}%=%t32m%e
+	     %p1%{3}%=%t33m%e%p1%{4}%=%t34m%e%p1%{5}%=%t35m%e%p1%{6}
+	     %=%t36m%e%p1%{7}%=%t97m%;,
+ibm+16color|IBM aixterm color definitions,
+	colors#16, pairs#0x100,
+	setab=\E[%?%p1%{8}%<%t%p1%{40}%+%e%p1%{92}%+%;%dm,
+	setaf=\E[%?%p1%{8}%<%t%p1%{30}%+%e%p1%{82}%+%;%dm,
+	setb=%p1%{8}%/%{6}%*%{4}%+\E[%d%p1%{8}%m%Pa%?%ga%{1}%=%t4%e
+	     %ga%{3}%=%t6%e%ga%{4}%=%t1%e%ga%{6}%=%t3%e%ga%d%;m,
+	setf=%p1%{8}%/%{6}%*%{3}%+\E[%d%p1%{8}%m%Pa%?%ga%{1}%=%t4%e
+	     %ga%{3}%=%t6%e%ga%{4}%=%t1%e%ga%{6}%=%t3%e%ga%d%;m,
+ibm5154|IBM 5154 Color display,
+	colors#8, ncv@, pairs#64,
+	bold@, setab=\E[4%p1%dm, setaf=\E[3%p1%dm, use=ibm5151,
+	use=ibm+color,
+ibmega-c|ibm5154-c|IBM Enhanced Color Display with standout and underline,
+	rmso=\EB, rmul=\EB, smso=\EF\Ef3;, smul=\EF\Ef2;,
+	use=ibmmono,
+ibmvga-c|IBM VGA display color termcap,
+	cr=\r, cud1=\n, ht=^I, ind=\n, kbs=^H, kcub1=^H, kcud1=\n,
+	nel=\r\n, use=ibmega-c,
+ibmvga|IBM VGA display,
+	cr=\r, cud1=\n, ht=^I, ind=\n, kbs=^H, kcub1=^H, kcud1=\n,
+	nel=\r\n, use=ibmega,
+# ibmapa* and ibmmono entries come from ACIS 4.3 distribution
+rtpc|ibmapa16|IBM 6155 Extended Monochrome Graphics Display,
+	lines#32,
+	dsl=\Ej\EY@ \EI\Ek, tsl=\Ej\EY@%+ \Eo, use=ibmmono,
+ibm6155|IBM 6155 Black & White display,
+	blink@, bold@, use=ibm5151,
+# Advanced Monochrome (6153) and Color (6154) Graphics Display:
+ibmapa8c|ibmapa8|IBM 6154 Advanced Graphics Display,
+	lines#31,
+	dsl=\Ej\EY? \EI\Ek, tsl=\Ej\EY?%+ \Eo, use=ibmmono,
+ibmapa8c-c|ibm6154-c|IBM 6154 Advanced Color Graphics Display,
+	lines#31,
+	dim=\EF\Ef7;, dsl=\Ej\EY? \EI\Ek, tsl=\Ej\EY?%+ \Eo,
+	use=ibmega-c,
+ibm6154|IBM 6154 Color displays,
+	blink@, bold=\E[12m, s0ds=\E[10m, s1ds=\E[11m, s2ds=\E[12m,
+	sgr=\E[%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p7%t;8%;%?%p6%t;1
+	    2%;m,
+	sgr0=\E[0;10m, use=ibm5154,
+ibm6153|IBM 6153 Black & White display,
+	blink@, bold=\E[12m, s0ds=\E[10m, s1ds=\E[11m, s2ds=\E[12m,
+	sgr=\E[%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p7%t;8%;%?%p6%t;1
+	    2%;m,
+	sgr0=\E[0;10m, use=ibm5151,
+ibm6153-90|IBM 6153 Black & White display (36-line),
+	cols#90, lines#36,
+	blink@, bold@, use=ibm5151,
+ibm6153-40|IBM 6153 Black & White display (12-line),
+	cols#40, lines#12, use=ibm6153-90,
+ibm8512|ibm8513|IBM color VGA Terminal,
+	am, mir, msgr,
+	cols#80, it#8, lines#25,
+	acsc=jjkkllmmnnqqttuuvvwwxx, blink=\E[5m, bold=\E[1m,
+	clear=\E[H\E[J, cub1=\E[D, cud1=\n, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, dl=\E[%p1%dM, dl1=\E[M,
+	ech=\E[%p1%dX, ed=\E[J, el=\E[K, home=\E[H, il=\E[%p1%dL,
+	il1=\E[L, is2=\Eb\E[m\017\E[?7h, kcud1=\E[B, kcuu1=\E[A,
+	kf0=\E[010q, kf1=\E[001q, kf2=\E[002q, kf3=\E[003q,
+	kf4=\E[004q, kf5=\E[005q, kf6=\E[006q, kf7=\E[007q,
+	kf8=\E[008q, kf9=\E[009q, khome=\E[H, rc=\E[u, rev=\E[7m,
+	rmacs=^O, rmam=\E[?7l, rmcup=\E[20h, rmdc=\E[4l,
+	rmir=\E[4l, rmso=\E[m, rmul=\E[m,
+	rs1=\Eb\E[m\017\E[?7h\E[H\E[J, sc=\E[s, sgr0=\E[m,
+	smacs=^N, smam=\E[?7h, smcup=\E[20;4l\E[?7h\Eb,
+	smdc=\E[4h, smir=\E[4h, smso=\E[7m, smul=\E[4m,
+	use=ibm8503,
+hft-c|HFT with Color,
+	colors#8, pairs#64,
+	acsc=jjkkllmmnnqqttuuvvwwxx, s0ds=\E(B, s1ds=\E(0,
+	setab=\E[4%p1%dm, setaf=\E[3%p1%dm, sgr0=\E[0m\E(B,
+	use=ibm5151, use=ibm+color,
+hft-c-old|HFT with Color PC850,
+	colors#8, pairs#64,
+	setab=\E[4%p1%dm, setaf=\E[3%p1%dm, use=ibm5151,
+	use=ibm+color,
+hft-old|AIWS High Function Terminal,
+	am, xon,
+	cols#80, lines#25,
+	bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[J, cr=\r,
+	cub1=^H, cud1=\n, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH,
+	cuu1=\E[A, dch1=\E[P, dl1=\E[M, ed=\E[J, el=\E[K, home=\E[H,
+	ht=^I, ich1=\E[@, il1=\E[L, ind=\n, invis=\E[8m, kbs=^H,
+	kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A,
+	kf1=\E[001q, kf2=\E[002q, kf3=\E[003q, kf4=\E[004q,
+	kf5=\E[005q, kf6=\E[006q, kf7=\E[007q, kf8=\E[008q,
+	kf9=\E[009q, khome=\E[H, knp=\E[153q, kpp=\E[159q,
+	ktbc=\E[010q, rev=\E[7m, rmir=\E6, rmso=\E[m, rmul=\E[m,
+	sgr0=\E[m, smir=\E6, smso=\E[7m, smul=\E[4m, use=ibm+color,
+ibm-system1|system1|IBM system/1 computer,
+	am, xt,
+	cols#80, lines#24,
+	bel=^G, clear=^Z, cub1=^H, cuf1=^\,
+	cup=\005%p1%{32}%+%c%p2%{32}%+%c, cuu1=^^, home=^K,
+	ind=\n,
+#       lft-pc850 : IBM Low Function Terminal Device
+#    lft "supports" underline, bold, and blink in the sense that the lft code
+#    sets all the right bits.  HOWEVER, depending upon the adapter, these
+#    attributes may or may not be supported by the device driver.
+lft|lft-pc850|LFT-PC850|IBM LFT PC850 Device,
+	am, bw, msgr, xon,
+	cols#80, it#8, lines#25,
+	acsc=j\331k\277l\332m\300n\305q\304t\303u\264v\301w\302x
+	     \263,
+	bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, clear=\E[H\E[J,
+	cr=\r, cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=\n,
+	cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH,
+	cuu=\E[%p1%dA, cuu1=\E[A, dch=\E[%p1%dP, dch1=\E[P,
+	dl=\E[%p1%dM, dl1=\E[M, ech=\E[%p1%dX, ed=\E[2J, el=\E[0K,
+	home=\E[H, hpa=\E[%i%p1%dG, ich=\E[%p1%d@, il=\E[%p1%dL,
+	il1=\E[L, ind=\ED, invis=\E[8m, is2=\Ec, kbs=^H, kcbt=\E[Z,
+	kclr=\E[144q, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C,
+	kcuu1=\E[A, kdch1=\E[P, ked=\E[148q, kel=\E[142q,
+	kend=\E[146q, kf1=\E[001q, kf10=\E[010q, kf11=\E[011q,
+	kf12=\E[012q, kf13=\E[013q, kf14=\E[014q, kf15=\E[015q,
+	kf16=\E[016q, kf17=\E[017q, kf18=\E[018q, kf19=\E[019q,
+	kf2=\E[002q, kf20=\E[020q, kf21=\E[021q, kf22=\E[022q,
+	kf23=\E[023q, kf24=\E[024q, kf25=\E[025q, kf26=\E[026q,
+	kf27=\E[027q, kf28=\E[028q, kf29=\E[029q, kf3=\E[003q,
+	kf30=\E[030q, kf31=\E[031q, kf32=\E[032q, kf33=\E[033q,
+	kf34=\E[034q, kf35=\E[035q, kf36=\E[036q, kf4=\E[004q,
+	kf5=\E[005q, kf6=\E[006q, kf7=\E[007q, kf8=\E[008q,
+	kf9=\E[009q, khome=\E[H, kich1=\E[139q, kil1=\E[140q,
+	kind=\E[151q, knp=\E[154q, kpp=\E[150q, kri=\E[155q,
+	krmir=\E[4l, rev=\E[7m, ri=\EL, rmacs=\E(B, rmir=\E[4l,
+	rmso=\E[0m, rmul=\E[0m, rs2=\Ec,
+	sgr=\E[%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1
+	    %;%?%p7%t;8%;m%?%p9%t\E(0%e\E(B%;,
+	sgr0=\E[0m, smacs=\E(0, smir=\E[4h, smso=\E[7m, smul=\E[4m,
+	tbc=\E[3g, use=ecma+index,
+# "Megapel" refers to the display adapter, which was used with the IBM RT
+# aka IBM 6150.
+ibm5081|hft|IBM Megapel Color display,
+	acsc=jjkkllmmnnqqttuuvvwwxx, blink@, bold@, s0ds=\E(B,
+	s1ds=\E(0, sgr0=\E[0m\E(B, use=ibm5154,
+ibm5081-c|ibmmpel-c|IBM 5081 1024x1024 256/4096 Megapel enhanced color display,
+	eslok, hs,
+	lines#33,
+	dsl=\Ej\EYA \EI\Ek, fsl=\Ek, tsl=\Ej\EYA%+ \Eo,
+	use=ibmega-c,
+ibm8503|ibm8507|ibm8604|IBM 8503 B & W VGA display,
+	use=hft-c,
+ibm8514|IBM 8514/a color VGA display,
+	eslok, hs,
+	dsl=\Ej\EYI \EI\Ek, fsl=\Ek, tsl=\Ej\EYI%+ \Eo, use=hft,
+ibm8514-c|IBM 8514 color display with standout and underline,
+	eslok, hs,
+	lines#41,
+	cr=\r, cud1=\n, dsl=\Ej\EYI \EI\Ek, fsl=\Ek, ht=^I, ind=\n,
+	kbs=^H, kcub1=^H, kcud1=\n, nel=\r\n, tsl=\Ej\EYI%+ \Eo,
+	use=ibmega-c,
+
+#
+# AIX entries.  IBM ships these with AIX 3.2.5.
+# -- added rc, sc based on manpage -TD
+# -- added rmacs, smacs based on manpage -TD
+# Note that we could use ibm+16color, but that is not how IBM defines this one.
+aixterm|IBM Aixterm Terminal Emulator,
+	acsc=jjkkllmmnnqqttuuvvwwxx, bold=\E[1m, rc=\E8, ri@,
+	rmacs=\E(B, s0ds=\E(B, s1ds=\E(0, sc=\E7,
+	sgr=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p6%t;1%;%?%p7
+	    %t;8%;m%?%p9%t\E(0%e\E(B%;,
+	sgr0=\E[0;10m\E(B, smacs=\E(0, use=ibm6154,
+	use=aixterm+sl,
+aixterm+sl|status line for AIXterm,
+	eslok, hs,
+	dsl=\E[?E, fsl=\E[?F, tsl=\E[?%p1%dT,
+
+aixterm-m|IBM AIXterm Monochrome Terminal Emulator,
+	acsc=jjkkllmmnnqqttuuvvwwxx, bold=\E[1m, ri@, s0ds=\E(B,
+	s1ds=\E(0,
+	sgr=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p6%t;1%;%?%p7
+	    %t;8%;m%?%p9%t\E(0%e\E(B%;,
+	sgr0=\E[0;10m\E(B, use=ibm6153, use=aixterm+sl,
+aixterm-m-old|old IBM AIXterm Monochrome Terminal Emulator,
+	bold=\E[1m, ri@,
+	sgr=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p6%t;1%;%?%p7
+	    %t;8%;m,
+	use=ibm6153, use=aixterm+sl,
+jaixterm|IBM Kanji Aixterm Terminal Eemulator,
+	acsc@, rmacs@,
+	sgr=\E[%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p6%t;1%;%?%p7%t;8
+	    %;m,
+	sgr0=\E[m, smacs@, use=aixterm,
+jaixterm-m|IBM Kanji AIXterm Monochrome Terminal Emulator,
+	acsc@, rmacs@,
+	sgr=\E[%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p6%t;1%;%?%p7%t;8
+	    %;m,
+	sgr0=\E[m, smacs@, use=aixterm-m,
+
+# This flavor is adapted from xterm, in turn from aixterm documentation -TD
+aixterm-16color|IBM Aixterm Terminal Emulator with 16 colors,
+	use=ibm+16color, use=aixterm,
+
+#### Infoton/General Terminal Corp.
+#
+
+# gt100 sounds like something DEC would come out with.  Let's hope they don't.
+i100|gt100|gt100a|General Terminal 100A (formerly Infoton 100),
+	OTbs, am,
+	cols#80, lines#24,
+	bel=^G, clear=^L, cr=\r, cub1=^H, cud1=\n, cuf1=\EC,
+	cup=\Ef%p2%{32}%+%c%p1%{32}%+%c, cuu1=\EA, dl1=\EM,
+	ed=\EJ, el=\EK, flash=\Eb$<200/>\Ea, home=\EH, il1=\EL,
+	ind=\n, rmso=\Ea, smso=\Eb,
+
+i400|Infoton 400,
+	OTbs, am,
+	cols#80, lines#25,
+	bel=^G, clear=\E[2J, cr=\r, cub1=^H, cud1=\n, cuf1=\E[C,
+	cup=\E[%i%p1%3d;%p2%3dH, cuu1=\E[A,
+	dch1=\E[4h\E[2Q\E[P\E[4l\E[0Q, dl1=\E[M, el=\E[N,
+	il1=\E[L, ind=\n, rmir=\E[4l\E[0Q, smir=\E[4h\E[2Q,
+
+# (addrinfo: removed obsolete ":bc=^Z:" -- esr)
+addrinfo|cursor-addressable Infoton,
+	cup=\037%p1%c%p2%c, home=^H, use=infoton,
+
+# "VISTAR II/HZ Technical Users Manual" (May 1975).
+#
+infoton2|cursor-addressable Infoton VISTAR II,
+	cup=~\021%p2%c%p1%c, home=^H, use=infoton,
+
+# "VISTAR Technical User's Manual" (October 1972).
+#
+# (infoton: used to have the no-ops <lh#0>, <lw#0>, <nlab#0> -- esr)
+infoton|Infoton VISTAR,
+	am,
+	cols#80, lines#24,
+	bel=^G, clear=^L, cr=\r, cub1=^Z, cud1=\n, cuf1=^Y, cuu1=^\,
+	ed=^K, ind=\n, ll=^H^\,
+
+# The ICL6402 was actually the Kokusai Display System 6402.
+# The 6404 was the KDS7372 (color version of the 6402).
+#
+# ICL6404 control codes follow:
+#
+#code            function
+#~~~~~~~~~~~     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+#ctrl-A          set SOM position at cursor position
+#ctrl-G          Bell
+#ctrl-H          Backspace
+#ctrl-I          Horizontal tab
+#ctrl-J          Linefeed
+#ctrl-K          Cursor up
+#ctrl-L          Cursor right
+#ctrl-M          Carriage return
+#ctrl-N          Disable xon/xoff to host
+#ctrl-O          Enable xon/xoff to host
+#ctrl-R          Enable bidirectional mode
+#ctrl-T          Disable bidirectional mode
+#ctrl-V          Cursor down
+#ctrl-Z          Clear unprotected data to insert char
+#ctrl-^          Cursor home
+#ctrl-_          Newline
+#
+#ESC             lead-in char for multiple character command
+#
+#ESC space R     execute power on sequence
+#ESC ! p1 p2     define scroll region:
+#                p1 = scroll top    line:  20h - 37h
+#                p1 = scroll bottom line:  20h - 37h
+#ESC "           unlock keyboard
+#ESC #           lock keyboard
+#ESC $           Semi-graphics mode on
+#ESC %           Semi-graphics mode off
+#ESC &           protect mode on
+#ESC '           protect mode off
+#ESC (           write protect mode off (full intensity)
+#ESC )           write protect mode on (half intensity)
+#
+#ESC *           clear screen
+#ESC +           clear unprotected data to insert char
+#ESC ,           clear unprotected data to half intensity spaces
+#ESC - p1 p2 p3 p4     address cursor to page, row, column:
+#                      p1 = page number  0 - 3
+#                      p2 = row          20h - 7fh
+#                      p3 = column (lo)  20h - 7fh
+#                      p4 = column (hi)  20h - 21h (only 132 col)
+#ESC . p1        set cursor style:
+#                p1 = 0  invisible cursor
+#                p1 = 1  block blinking cursor
+#                p1 = 2  block steady cursor
+#                p1 = 3  underline blinking cursor
+#                p1 = 4  underline steady cursor
+#ESC /           transmit cursor location (page, row, column)
+#ESC 0 p1 p2 p3 p4     program edit key:
+#                      p1 = edit key code: '@'-'S', '`'-'s'
+#                      p2 p3 p4 = program data (3 bytes)
+#
+#ESC 1           set tab
+#ESC 2           clear tab at cursor
+#ESC 3           clear all tabs
+#ESC 4           send unprotect line to cursor
+#ESC 5           send unprotect page to cursor
+#ESC 6           send line to cursor
+#ESC 7           send page to cursor
+#ESC 8 n         set scroll mode:
+#                n = 0   set jump scroll
+#                n = 1   set smooth scroll
+#ESC 9 n         control display:
+#                n = 0   display off
+#                n = 1   display on
+#ESC :           clear unprotected data to null
+#ESC ;           clear unprotected data to insert char
+#
+#ESC <           keyclick on
+#ESC = p1 p2     address cursor to row, column
+#                p1 = row          20h - 7fh
+#                p2 = column (lo)  20h - 7fh
+#                p3 = column (hi)  20h - 21h (only 132 col)
+#ESC >           keyclick off
+#ESC ?           transmit cursor location (row, column)
+#
+#ESC @           copy print mode on
+#ESC A           copy print mode off
+#ESC B           block mode on
+#ESC C           block mode off (conversation mode)
+#ESC D F         set full duplex
+#ESC D H         set half duplex
+#ESC E           line insert
+#ESC F p1 p2     set page colour (p1 = f/grnd, p2 = b/grnd)
+#                0 = black, 1 = red,     2 = green, 3 = yellow
+#                4 = blue,  5 = magenta, 6 = cyan,  7 = white
+#ESC G n         set serial field attribute (n = 30h - 3Fh)
+#ESC H n         full graphics mode:
+#                n = 0  exit full graphics mode
+#                n = 1  enter full graphics mode
+#ESC I           back tab
+#ESC J           back page
+#ESC K           forward page
+#
+#ESC L           unformatted page print
+#ESC M L         move window left  (132 col mode only)
+#ESC M R         move window right (132 col mode only)
+#ESC N           set page edit (clear line edit)
+#ESC O           set line edit (clear page edit)
+#ESC P           formatted page print
+#ESC Q           character insert
+#ESC R           line delete
+#ESC S           send message unprotected only
+#ESC T           erase line to insert char
+#ESC U           set monitor mode   (see ESC X, ESC u)
+#
+#ESC V n         select video attribute mode:
+#                n = 0   serial field attribute mode
+#                n = 1   parallel character attribute mode
+#ESC V 2 n       define line attribute:
+#                n = 0   single width single height
+#                n = 1   single width double height
+#                n = 2   double width single height
+#                n = 3   double width double height
+#ESC V 3 n       select character font:
+#                n = 0   system font
+#                n = 1   user defined font
+#ESC V 4 n       select screen mode:
+#                n = 0   page screen mode
+#                n = 1   virtual screen mode
+#ESC V 5 n       control mouse mode:
+#                n = 0   disable mouse
+#                n = 1   enable sample mode
+#                n = 2   send mouse information
+#                n = 3   enable request mode
+#ESC W           character delete
+#ESC X           clear monitor mode (see ESC U, ESC u)
+#ESC Y           erase page to insert char
+#
+#ESC Z n         send user/status line:
+#                n = 0   send user line
+#                n = 1   send status line
+#                n = 2   send terminal ID
+#ESC [ p1 p2 p3  set character attribute (parallel char mode):
+#                p1: 0 = normal
+#                    1 = blank
+#                    2 = blink
+#                    3 = blink blank (= blank)
+#                    4 = reverse
+#                    5 = reverse blank
+#                    6 = reverse blink
+#                    7 = reverse blink blank (= reverse blank)
+#                    8 = underline
+#                    9 = underline blank
+#                    : = underline blink
+#                    ; = underline blink blank
+#                    < = reverse underline
+#                    = = reverse underline blank
+#                    > = reverse underline blink
+#                    ? = reverse underline blink blank
+#                p2, p3: f/grnd, b/grnd colour
+#                (see ESC F for colours)
+#                use ZZ for mono, eg.
+#                    ESC [ 0 Z Z for normal
+#                    ESC [ 4 Z Z for inverse etc.
+#
+#ESC \ n         set page size:
+#                n = 1   24 lines/page
+#                n = 2   48 lines/page
+#                n = 3   72 lines/page
+#                n = 4   96 lines/page
+#ESC ] n         set Wordstar mode:
+#                n = 0   normal (KDS7372) mode
+#                n = 1   Wordstar mode
+#
+#ESC b           set foreground colour screen
+#
+#ESC c n         enter self-test mode:
+#                n = 0   exit self test mode
+#                n = 1   ROM test
+#                n = 2   RAM test
+#                n = 3   NVRAM test
+#                n = 4   screen display test
+#                n = 5   main/printer port test
+#                n = 6   mouse port test
+#                n = 7   graphics board test
+#                n = 8   graphics memory test
+#                n = 9   display all 'E'
+#                n = :   display all 'H'
+#ESC d           set background colour screen
+#
+#ESC e n         program insert char (n = insert char)
+#ESC f text CR   load user status line with 'text'
+#
+#ESC g           display user status line on 25th line
+#ESC h           display system status line on 25th line
+#ESC i           tab
+#ESC j           reverse linefeed
+#ESC k n         duplex/local edit mode:
+#                n = 0   duplex edit mode
+#                n = 1   local edit mode
+#ESC l n         select virtual screen:
+#                n = 0   screen 1
+#                n = 1   screen 2
+#ESC m           save current config to NVRAM
+#ESC n p1        select display screen:
+#                p1 = 0  screen 1
+#                p1 = 1  screen 2
+#                p1 = 2  screen 3
+#                p1 = 3  screen 4
+#ESC o p1 p2     set characters/line and attribute:
+#                p1 = 0  80 chars/line
+#
+#ESC o p1 p2     set characters/line and attribute:
+#                p1 = 0  80 chars/line
+#                p1 = 1  132 chars/line
+#                p2 = 0  single width single height
+#                p2 = 1  single width double height
+#                p2 = 2  double width single height
+#                p2 = 3  double width double height
+#
+#ESC q           insert mode on
+#ESC r           edit mode on
+#ESC s           send message all
+#ESC t           erase line to null
+#ESC u           clear monitor mode (see ESC U, ESC X)
+#ESC v           autopage mode on
+#ESC w           autopage mode off
+#ESC x p1 p2 p3  define delimiter code...
+#ESC y           erase page to null
+#
+#ESC z 2 p1 p2 p3 p4   draw quadrangle:
+#                      p1 = starting row
+#                      p2 = starting column
+#                      p3 = end row
+#                      p4 = end column
+#
+#ESC { p1 p2 p3 p4     configure main port
+#                      (baud, stop bits, parity, word length)
+#
+#ESC | p1 p2 text Ctrl-Y    program function key with 'text':
+#                        p1 = function key code:
+#                             '1' - ';'  normal f1- f11
+#                             '<' - 'F'  shifted f1 - f11
+#                        p2 = program mode:
+#                             1 = FDX
+#                             2 = LOC
+#                             3 = HDX
+#                        Ctrl-Y = terminator
+#                        (use Ctrl-P to escape ^P, ^Y )
+#
+#ESC } p1 p2 p3 p4     configure printer port
+#                      (baud, stop bits, parity, word length)
+#ESC ~           send system status
+#
+# Codes and info from Peter Disdale <pete@pdlmail.demon.co.uk> 12 May 1997
+#
+# Entry is by esr going solely on above information and is UNTESTED.
+# This actually looks a lot like a TeleVideo 9xx.
+# This entry uses page 0 and is monochrome; I'm not brave enough to try
+# to make color work without a test terminal.  The <am> capability is a guess.
+# The initialization string sets conversation mode, blinking underline cursor,
+# full duplex, parallel attribute mode, display user status line, white
+# foreground, black background, normal highlight.
+#
+icl6404|kds7372|icl6402|kds6402|ICL 6404 aka Kokusai Display Systems 7372,
+	OTbs, am, hs,
+	cols#80, lines#24,
+	bel=^G, blink=\E[2ZZ, cbt=\EI, civis=\E.0, clear=\E*,
+	cnorm=\E.3, cr=\r, csr=\E!%p1%{32}%+%c%p2%{32}%+%c,
+	cub1=^H, cud1=^V, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{80}%m%{32}%+%c%p2%{80}%>%{32}%+%c,
+	cuu1=^K, cvvis=\E.1, dch1=\EW, dl1=\ER, home=^^, ht=^I,
+	hts=\E1, il1=\EE, invis=\E[1ZZ,
+	is1=\EC\E.3\EDF\EV1\Eg\E[0ZZ, nel=^_, rev=\E[4ZZ,
+	rmir=\Er, rmso=\E[%gh%{4}%^%Ph%gh%dZZ,
+	rmul=\E[%gh%{8}%^%Ph%gh%dZZ, rs2=\Eo1,
+	sgr=\E[%'0'%?%p1%t%'8'%|%;%?%p2%t%'8'%|%;%?%p3%t%'4'%|%;%?
+	    %p4%t%'2'%|%;%?%p7%t%'1'%|%;%cZZ,
+	sgr0=\E[0ZZ, smir=\Eq, smso=\E[8ZZ, smul=\E[8ZZ, tbc=\E3,
+icl6404-w|kds7372-w|ICL 6404 aka Kokusai Display Systems 7372 132 cols,
+	rs2=\Eo1, use=icl6404,
+
+#### Interactive Systems Corp
+#
+# ISC used to sell OEMed and customized hardware to support ISC UNIX.
+# ISC UNIX still exists in 1995, but ISC itself is no more; they got
+# bought out by Sun.
+#
+
+# From: <cithep!eric>  Wed Sep 16 08:06:44 1981
+# (intext: removed obsolete ":ma=^K^P^R^L^L ::bc=^_:", also the
+# ":le=^_:" later overridden -- esr)
+intext|Interactive Systems Corporation modified owl 1200,
+	OTbs, am,
+	cols#80, it#8, lines#24, xmc#1,
+	bel=^G, cbt=^Y, clear=\014$<132>, cr=\r, cub1=^H, cud1=\n,
+	cuf1=^^, cup=\017%p1%{32}%+%c%p2%{32}%+%c, cuu1=^\,
+	dch1=\022$<5.5*>, dl1=\021$<5.5*>, ed=\026J$<5.5*>,
+	el=^Kp^R, ht=^I, il1=\020$<5.5*>, ind=\n, ip=$<5.5*>, kbs=^H,
+	kcub1=^_, kcud1=\n, kcuf1=^^, kcuu1=^\, kf0=^VJ\r, kf1=^VA\r,
+	kf2=^VB\r, kf3=^VC\r, kf4=^VD\r, kf5=^VE\r, kf6=^VF\r,
+	kf7=^VG\r, kf8=^VH\r, kf9=^VI\r, khome=^Z, rmir=^V<,
+	rmkx=^V9, rmso=^V#\s, smir=^V;, smkx=\036:\264\026%%,
+	smso=^V$\,,
+intext2|intextii|INTERACTIVE modified owl 1251,
+	am, bw, ul,
+	cols#80, lines#24, xmc#0,
+	bel=^G, cbt=\E[Z, clear=\E[H\E[2J, cr=\r, cub1=\E[D,
+	cud1=\E[B, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A,
+	dch1=\E[P, dl1=\E[M, ed=\E[J, el=\E[K,
+	flash=\E[;;;;;;;;;2;;u$<200/>\E[;;;;;;;;;1;;u,
+	hpa=\E[%p1%{1}%+%dG, ht=^I, ich1=\E[@, il1=\E[L, ind=\E[S,
+	kbs=^H, kcub1=\ED\r, kcud1=\EB\r, kcuf1=\EC\r, kcuu1=\EA\r,
+	kf0=\E@\r, kf1=\EP\r, kf2=\EQ\r, kf3=\ES\r, kf4=\ET\r,
+	kf5=\EU\r, kf6=\EV\r, kf7=\EW\r, kf8=\EX\r, kf9=\EY\r,
+	khome=\ER\r, lf0=REFRSH, lf1=DEL CH, lf2=TABSET, lf3=GOTO,
+	lf4=+PAGE, lf5=+SRCH, lf6=-PAGE, lf7=-SRCH, lf8=LEFT,
+	lf9=RIGHT, ri=\E[T, rmso=\E[2 D, rmul=\E[2 D, smso=\E[6 D,
+	smul=\E[18 D,
+
+#### Kimtron (abm, kt)
+#
+# Kimtron seems to be history, but as March 1998 these people are still
+# offering repair services for Kimtron equipment:
+#
+#    Com/Pair Monitor Service
+#    1105 N. Cliff Ave.
+#    Sioux Falls, South Dakota 57103
+#
+#    WATS voice:  1-800/398-4946
+#    POTS   fax: +1 605/338-8709
+#    POTS voice: +1 605/338-9650
+#         Email: <compair@sd.cybernex.net>
+#  Internet/Web: <http://www.com-pair.com>
+#
+# Kimtron entries include (undocumented) codes for: enter dim mode,
+# enter bold mode, enter reverse mode, turn off all attributes.
+#
+
+# Kimtron ABM 85 added by Dual Systems
+# (abm85: removed duplicated ":kd=^J:" -- esr)
+abm85|Kimtron ABM 85,
+	OTbs, am, bw, msgr,
+	cols#80, it#8, lines#24, xmc#1,
+	cbt=\EI, clear=\E*, cub1=^H, cud1=\n, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW,
+	dl1=\ER, ed=\Ey, el=\Et, ht=^I,
+	if=/usr/share/tabset/stdcrt, il1=\EE,
+	is2=\EC\EX\Eg\En\E%\Er\E(\Ek\Em\Eq, kbs=^H, kcub1=^H,
+	kcud1=\n, kcuf1=^L, kcuu1=^K, khome=^^, rmir=\Er, rmso=\Ek,
+	rmul=\Em, smir=\EQ, smso=\Ej, smul=\El,
+# Kimtron ABM 85H added by Dual Systems.
+# Some notes about the abm85h entries:
+# 1) there are several firmware revs of 85H in the world. Use abm85h-old for
+#    firmware revs prior to SP51
+# 2) Make sure to use abm85h entry if the terminal is in 85h mode and the
+#    abm85e entry if it is in tvi920 emulation mode. They are incompatible
+#    in some places and NOT software settable i.e., <is2> can't fix it)
+# 3) In 85h mode, the arrow keys and special functions transmit when
+#    the terminal is in dup-edit, and work only locally in local-edit.
+#    Vi won't swallow `del char' for instance, but <smcup> turns on
+#    dup-edit anyway so that the arrow keys will work right. If the
+#    arrow keys don't work the way you like, change <smcup>, <rmcup>, and
+#    <is2>.  Note that 920E mode does not have software commands to toggle
+#    between dup and local edit, so you get whatever was set last on the
+#    terminal.
+# 4) <flash> attribute is nice, but seems too slow to work correctly
+#    (\Eb<pad>\Ed)
+# 5) Make sure `hidden' attributes are selected. If `embedded' attributes
+#    are selected, the <xmc@> entry should be removed.
+# 6) auto new-line should be on (selectable from setup mode only)
+#
+# From: Erik Fair <fair@ucbarpa>  Sun Oct 27 07:21:05 1985
+abm85h|Kimtron ABM 85H native mode,
+	hs,
+	xmc@,
+	bel=^G, cnorm=\E.4, cvvis=\E.2, dim=\E), dsl=\Ee, flash@,
+	fsl=\r, invis@,
+	is2=\EC\EN\EX\024\016\EA\Ea\E%\E9\Ee\Er\En\E"\E}\E'\E(\Ef\r
+	    \EG0\Ed\E.4\El,
+	kcud1=^V, sgr0=\E(\EG0, smir=\EZ, tsl=\Eg\Ef, use=adm+sgr,
+	use=abm85,
+abm85e|Kimtron ABM 85H in 920E mode,
+	xmc@,
+	bel=^G, dim=\E), flash@,
+	is2=\EC\EX\EA\E%\E9\Ee\Er\En\E"\E}\E'\E(\Ef\r\Ek\Eq
+	    \Em,
+	rev=\Ej, sgr0=\E(\Ek, smir=\EZ, use=abm85,
+abm85h-old|oabm85h|o85h|Kimtron ABM 85H with old firmware rev.,
+	xmc@,
+	bel=^G, dim=\E),
+	is2=\E}\EC\EX\Ee\En\E%\Er\E(\Ek\Em\Eq\Ed\ET\EC\E9
+	    \EF,
+	rev=\Ej, sgr0=\E(\Ek, smir=\EZ, use=abm85,
+# From: <malman@bbn-vax.arpa>
+# (kt7: removed obsolete :ma=^V^J^L :" -- esr)
+kt7|kimtron model kt-7,
+	OTbs, am,
+	cols#80, it#8, lines#24,
+	cbt=\EI, clear=^Z, cub1=^H, cud1=^V, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW,
+	dl1=\ER, ed=\EY, el=\ET, fsl=\Eg, home=^^, ht=^I, ich1=\EQ,
+	if=/usr/share/tabset/stdcrt, il1=\EE, invis@, is2=\El\E",
+	kbs=^H, kcbt=\EI, kclr=^Z, kcub1=^H, kcud1=^V, kcuf1=^L,
+	kcuu1=^K, kdch1=\EW, kdl1=\ER, ked=\EY, kel=\ET, kf0=^AI\r,
+	kf1=^A@\r, kf2=^AA\r, kf3=^AB\r, kf4=^AC\r, kf5=^AD\r,
+	kf6=^AE\r, kf7=^AF\r, kf8=^AG\r, kf9=^AH\r, khome=^^,
+	kich1=\EQ, kil1=\EE, tsl=\Ef, use=adm+sgr,
+# Renamed TB=^I to :ta:, BE=^G to :bl:, BS=^H to :kb:, N to :kS: (based on the
+# other kt7 entry and the adjacent key capabilities).  Removed EE which is
+# identical to :mh:.  Removed :ES=\EGD: which is some kind of highlight
+# but we can't figure out what.
+kt7ix|kimtron model kt-7 or 70 in IX mode,
+	am, bw,
+	cols#80, it#8, lines#25,
+	acsc=jYk?lZm@nEqDt4uCvAwBx3, bel=^G, blink=\EG2, cbt=\EI,
+	civis=\E.0, clear=\E*, cnorm=\E.3, cr=\r, cub1=^H, cud1=^V,
+	cuf1=^L, cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K,
+	dch1=\EW, dim=\EG@, dl1=\ER, dsl=\Ef\r, ed=\EY, el=\ET, fsl=\r,
+	home=^^, ht=^I, ich1=\EQ, il1=\EE, ind=\n,
+	is2=\EG0\E s\017\E~, kbs=^H, kcbt=\EI, kclr=\E*,
+	kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kdl1=\ER,
+	ked=\EY, kel=\ET, kend=\EY, kf0=^AI\r, kf1=^A@\r, kf2=^AA\r,
+	kf3=^AB\r, kf4=^AC\r, kf5=^AD\r, kf6=^AE\r, kf7=^AF\r,
+	kf8=^AG\r, kf9=^AH\r, khome=^^, kich1=\EQ, kil1=\EE, knp=\EJ,
+	nel=\r\n, pulse=\EK, rmacs=\E%%, rmir=, rmso=\EG0, rmul=\EG0,
+	sgr0=\EG0, smacs=\E$, smir=, smso=\EG4, smul=\EG8, tsl=\Ef,
+
+#### Microdata/MDIS
+#
+# This was a line of terminals made by McDonnell-Douglas Information Systems.
+# These entries come direct from MDIS documentation.  I have edited them only
+# to move primary names of the form p[0-9] * to aliases, and to comment out
+# <rmacs>/<smacs> in a couple of entries without <acsc> strings.  I have
+# also removed the change history; the last version indicates this is
+# version 4.3 by A.Barkus, September 1990 (earliest entry is October 1989).
+#
+
+# McDonnell Information Systems Terminal Family History
+# =========================================
+#
+# Prism-1, Prism-2 and P99:
+#       Ancient Microdata and CMC terminals, vaguely like ADDS Regent 25.
+#
+# Prism-4 and Prism-5:
+#       Slightly less ancient range of Microdata terminals. Follow-on from
+#       Prism-2, but with many enhancements. P5 has eight display pages.
+#
+# Prism-6:
+#       A special terminal for use with library systems, primarily in Germany.
+#       Limited numbers. Similar functionality to P5 (except attributes?).
+#
+# Prism-7, Prism-8 and Prism-9:
+#       More recent range of MDIS terminals, in which P7 and P8
+#       replace the P4 & P5, with added functionality, and P9 is the flagship.
+#       The P9 has two emulation modes - P8 and ANSI - and includes a
+#       large number of the DEC VT220 control sequences. Both
+#       P8 and P9 support 80c/24ln/8pg and 132cl/24li/4pg formats.
+#
+# Prism-12 and Prism-14:
+#       Latest range, functionally very similar to the P9.  The P14 has a
+#       black-on-white overscanning screen.
+#
+# The terminfo definitions given here are:
+#
+# p2      - Prism-2 (or Prism-1 or P99).
+#
+# p4      - Prism-4 (and older P7s & P8s).
+# p5      - Prism-5 (or Prism-6).
+#
+# p7      - Prism-7.
+# p8      - Prism-8 (in national or multinational mode).
+# p8-w    - 132 column version of p8.
+# p9      - Prism-9 in ANSI mode.
+# p9-w    - 132 column version of p9.
+# p9-8    - Prism-9 in Prism-8 emulation mode.
+# p9-8-w  - As p9-8, but with 132 columns.
+#
+# p12     - Prism-12 in ANSI mode.
+# p12-w   - 132 column version of p12.
+# p12-m   - Prism-12 in MDC emulation mode.
+# p12-m-w - As p12-m, but with 132 columns.
+# p14     - Prism-14 in ANSI mode.
+# p14-w   - 132 column version of p14.
+# p14-m   - Prism-14 in MDC emulation mode.
+# p14-m-w - As p14-m, but with 132 columns.
+#
+# p2: Prism-2
+# -----------
+#
+# Includes Prism-1 and basic P99 without SP or MP loaded.
+# The simplest form of Prism-type terminal.
+# Basic cursor movement and clearing operations only.
+# No video attributes.
+# Notes:
+#  Horizontal cursor qualifiers of NUL, XON and XOFF are mapped to the next
+#  value up, followed by backspace.
+#
+prism2|MDC Prism-2,
+	am, bw, msgr,
+	cols#80, lines#24,
+	bel=^G, clear=\014$<20>, cr=\r, cub1=^H, cud1=\n, cuf1=^F,
+	cup=\013%p1%{32}%+%c\020%p2%{10}%/%{16}%*%p2%{10}%m%+%Pc%?
+	    %{17}%gc%=%{19}%gc%=%|%gc%!%|%t%{1}%gc%+%c%{8}%e%gc%;%c,
+	cuu1=^Z, ed=\EJ, el=\EK, home=^A,
+	hpa=\020%p1%{10}%/%{16}%*%p1%{10}%m%+%Pc%?%{17}%gc%=%{19}%gc
+	    %=%|%gc%!%|%t%{1}%gc%+%c%{8}%e%gc%;%c,
+	ind=\n, kbs=^H, khome=^A, vpa=\013%p1%{32}%+%c,
+
+# p4: Prism-4
+# -----------
+#
+# Includes early versions of P7 & P8.
+# Basic family definition for most Prisms (except P2 and P9 ANSI).
+# Notes:
+#  Horizontal cursor qualifiers of NUL, XON and XOFF are mapped to the next
+#  value up, followed by backspace.
+#  Cursor key definitions removed because they interfere with vi and csh keys.
+#
+prism4|p4|P4|MDC Prism-4,
+	am, bw, hs, mc5i, msgr,
+	cols#80, lines#24, wsl#72, xmc#1,
+	bel=^G, blink=^CB, civis=\035\344, clear=\014$<20>,
+	cnorm=\035\342, cr=\r, cub1=^H, cud1=\n, cuf1=^F,
+	cup=\013%p1%{32}%+%c\020%p2%{10}%/%{16}%*%p2%{10}%m%+%Pc%?
+	    %{17}%gc%=%{19}%gc%=%|%gc%!%|%t%{1}%gc%+%c%{8}%e%gc%;%c,
+	cuu1=^Z, dim=^CA, dsl=\035\343\035\345, ed=\EJ, el=\EK,
+	fsl=\035\345, home=^A,
+	hpa=\020%p1%{10}%/%{16}%*%p1%{10}%m%+%Pc%?%{17}%gc%=%{19}%gc
+	    %=%|%gc%!%|%t%{1}%gc%+%c%{8}%e%gc%;%c,
+	ind=\n, invis=^CH, kbs=^H, khome=^A, mc0=\EU, mc4=\ET, mc5=\ER,
+	rev=^CD, rmso=^C\s, rmul=^C\s,
+	sgr=\003%{64}%?%p1%p3%|%t%{4}%+%;%?%p2%t%{16}%+%;%?%p4%t%{2}
+	    %+%;%?%p5%t%{1}%+%;%?%p7%t%{8}%+%;%c%?%p9%t\016%e\017%;,
+	sgr0=^C\s, smso=^CD, smul=^CP, tsl=\035\343,
+	vpa=\013%p1%{32}%+%c,
+
+# p5: Prism-5
+# -----------
+#
+# Same definition as p4. Includes Prism-6 (not tested!).
+# Does not use any multi-page features.
+#
+prism5|p5|P5|MDC Prism-5,
+	use=p4,
+
+# p7: Prism-7
+# -----------
+#
+# Similar definition to p4. Uses ANSI cursor motion to avoid network problems.
+# Notes:
+#  Use p4 for very early models of P7.
+#  Rev-index removed; can't send nulls to terminal in 8-bit modes.
+#
+prism7|p7|P7|MDC Prism-7,
+	cup=\E[%i%p1%d;%p2%dH, hpa@, vpa@, use=p4,
+
+# p8: Prism-8
+# -----------
+#
+# Similar definition to p7. Uses ANSI cursor motion to avoid network problems.
+# Supports national and multinational character sets.
+# Notes:
+#  Alternate char set operations only work in multinational mode.
+#  Use p4 for very early models of P8.
+#  Rev-index removed; can't send nulls to terminal in 8-bit modes.
+# (esr: commented out <smacs>/<rmacs> because there's no <acsc>)
+#
+prism8|p8|P8|MDC Prism-8,
+	cup=\E[%i%p1%d;%p2%dH, hpa=\E[%i%p1%d`, is2=\E[<12h,
+	vpa=\E[%i%p1%dd, use=p4,
+
+# p8-w: Prism-8 in 132 column mode
+# --------------------------------
+#
+# 'Wide' version of p8.
+# Notes:
+#  Rev-index removed; can't send nulls to terminal in 8-bit modes.
+#
+prism8-w|p8-w|P8-W|MDC Prism-8 in 132 column mode,
+	cols#132,
+	is2=\E[<12h\E[<14h, use=p8,
+
+# p9: Prism-9 in ANSI mode
+# -------------------------
+#
+# The "flagship" model of this generation of terminals.
+# ANSI X3.64 (ISO 6429) standard sequences, plus many DEC VT220 ones.
+# Notes:
+#  Tabs only reset by "reset". Otherwise assumes default (8 cols).
+#  Fixes to deal with terminal firmware bugs:
+#  . 'ri' uses insert-line since rev index doesn't always
+#  . 'sgr0' has extra '0' since esc[m fails
+#  . 'fsl' & 'dsl' use illegal char since cr is actioned wrong on line 25
+#  Not covered in the current definition:
+#  . Labels
+#  . Programming Fn keys
+#  . Graphic characters (defaults correctly to vt100)
+#  . Padding values (sets xon)
+# (esr: commented out <smacs>/<rmacs> because there's no <acsc>)
+#
+prism9|p9|P9|MDC Prism-9 in ANSI mode,
+	am, bw, hs, msgr, xenl, xon,
+	cols#80, it#8, lines#24, vt#3, wsl#72,
+	bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, civis=\E[<4l,
+	clear=^L, cnorm=\E[<4h, cr=\r, csr=\E[%i%p1%d;%p2%d%%v,
+	cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=\n,
+	cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH,
+	cuu=\E[%p1%dA, cuu1=\E[A, dch=\E[%p1%dP, dch1=\E[P,
+	dl=\E[%p1%dM, dl1=\E[M, dsl=\E[%}\024, ech=\E[%p1%dX,
+	ed=\E[J$<10>, el=\E[K, fsl=^T, home=\E[H, hpa=\E[%i%p1%d`,
+	ht=^I, hts=\EH, il=\E[%p1%dL, il1=\E[L, ind=\n,
+	is2=\E[&p\E[<12l\E F, kbs=^H, kclr=^L, kcub1=\E[D,
+	kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kf1=\E[11~,
+	kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\E[25~,
+	kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, kf17=\E[31~,
+	kf18=\E[32~, kf2=\E[12~, kf3=\E[13~, kf4=\E[14~,
+	kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~,
+	khome=\E[H, nel=\r\n, prot=\E[32%{, rc=\E[%z,
+	rep=\E[%p2%db%p1%c, rev=\E[7m, ri=\E[L, rmir=\E[4l,
+	rmso=\E[27m, rmul=\E[24m,
+	rs2=\E[&p\E[<12l\E\sF\E[3g\E[9;17;25;33;41;49;57;65;73
+	    \sN,
+	sc=\E[%y,
+	sgr=\E[0%?%p1%p3%|%t;7%;%?%p2%t;4%;%?%p4%t;5%;%?%p6%t;1%;m%?
+	    %p8%t\E[32%%{%;%?%p9%t\016%e\017%;,
+	sgr0=\E[0m\017, smir=\E[4h, smso=\E[7m, smul=\E[4m,
+	tbc=\E[3g, tsl=\E[%i%p1%d%%}, vpa=\E[%i%p1%dd,
+	use=ansi+pp,
+
+# p9-w: Prism-9 in 132 column mode
+# --------------------------------
+#
+# 'Wide' version of p9.
+#
+prism9-w|p9-w|P9-W|MDC Prism-9 in 132 column mode,
+	cols#132,
+	is2=\E[&p\E[<12l\E F\E[<14h,
+	rs2=\E[&p\E[<12l\E F\E[<14h, use=p9,
+
+# p9-8: Prism-9 in P8 mode
+# ------------------------
+#
+# P9 terminal in P8 emulation mode.
+# Similar to p8 definition.
+# Insertion and deletion operations possible.
+#
+prism9-8|p9-8|P9-8|MDC Prism-9 in P8 mode,
+	dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M,
+	ich=\E[%p1%d@, ich1=\E[@, il=\E[%p1%dL, il1=\E[L, use=p8,
+
+# p9-8-w: Prism-9 in P8 and 132 column modes
+# ------------------------------------------
+#
+# P9 terminal in P8 emulation mode and 132 column mode.
+#
+prism9-8-w|p9-8-w|P9-8-W|MDC Prism-9 in Prism 8 emulation and 132 column mode,
+	dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M,
+	ich=\E[%p1%d@, ich1=\E[@, il=\E[%p1%dL, il1=\E[L, use=p8-w,
+
+# p12: Prism-12 in ANSI mode
+# ---------------------------
+#
+# See p9 definition.
+#
+prism12|p12|P12|MDC Prism-12 in ANSI mode,
+	use=p9,
+
+# p12-w: Prism-12 in 132 column mode
+# ----------------------------------
+#
+# 'Wide' version of p12.
+#
+prism12-w|p12-w|P12-W|MDC Prism-12 in 132 column mode,
+	use=p9-w,
+
+# p12-m: Prism-12 in MDC emulation mode
+# -------------------------------------
+#
+# P12 terminal in MDC emulation mode.
+# Similar to p8 definition.
+# Insertion and deletion operations possible.
+#
+prism12-m|p12-m|P12-M|MDC Prism-12 in MDC emulation mode,
+	use=p9-8,
+
+# p12-m-w: Prism-12 in MDC emulation and 132 column modes
+# -------------------------------------------------------
+#
+# P12 terminal in MDC emulation mode and 132 column mode.
+#
+prism12-m-w|p12-m-w|P12-M-W|MDC Prism-12 in MDC emulation and 132 column mode,
+	use=p9-8-w,
+
+# p14: Prism-14 in ANSI mode
+# ---------------------------
+#
+# See p9 definition.
+#
+prism14|p14|P14|MDC Prism-14 in ANSI mode,
+	use=p9,
+
+# p14-w: Prism-14 in 132 column mode
+# ----------------------------------
+#
+# 'Wide' version of p14.
+#
+prism14-w|p14-w|P14-W|MDC Prism-14 in 132 column mode,
+	use=p9-w,
+
+# p14-m: Prism-14 in MDC emulation mode
+# -------------------------------------
+#
+# P14 terminal in MDC emulation mode.
+# Similar to p8 definition.
+# Insertion and deletion operations possible.
+#
+prism14-m|p14-m|P14-M|MDC Prism-14 in MDC emulation mode,
+	use=p9-8,
+
+# p14-m-w: Prism-14 in MDC emulation and 132 column modes
+# -------------------------------------------------------
+#
+# P14 terminal in MDC emulation mode and 132 column mode.
+#
+prism14-m-w|p14-m-w|P14-M-W|MDC Prism-14 in MDC emulation and 132 column mode,
+	use=p9-8-w,
+
+# End of McDonnell Information Systems Prism definitions
+
+# These things were popular in the Pick database community at one time
+# From: George Land <georgeland@aol.com> 24 Sep 1996
+p8gl|prism8gl|McDonnell-Douglas Prism-8 alternate definition,
+	am, bw, hs, mir,
+	cols#80, lines#24, ma#1, wsl#78, xmc#1,
+	bel=^G, blink=^CB, clear=^L, cr=\r, cub1=^U, cud1=\n, cuf1=^F,
+	cup=\E[%i%p1%d;%p2%dH, cuu1=^Z, dch1=\s^H, dim=^CA, dl1=^P,
+	ed=\EJ, el=\EK, home=^A, ind=\n, invis=^CH, kbs=^H, kcub1=^U,
+	kcud1=\n, kcuf1=^F, kcuu1=^Z, kdch1=\s^H, kdl1=^P, ked=\EJ,
+	kel=\EK, kf1=^A@\r, kf10=^AI\r, kf12=^AJ\r, kf13=^AK\r,
+	kf14=^AL\r, kf15=^AM\r, kf16=^AN\r, kf17=^AO\r, kf2=^AA\r,
+	kf3=^AB\r, kf4=^AC\r, kf5=^AD\r, kf6=^AE\r, kf7=^AF\r,
+	kf8=^AG\r, kf9=^AH\r, khome=^A, lf1=F1, lf10=F10, lf2=F2,
+	lf3=F3, lf4=F4, lf5=F5, lf6=F6, lf7=F7, lf8=F8, lf9=F9, nel=\n\r,
+	pad=\0, rev=^CD, rmso=^C\s, rmul=^C\s, sgr0=^C\s, smso=^CE,
+	smul=^C0,
+
+#### Microterm (act, mime)
+#
+# The mime1 entries refer to the Microterm Mime I or Mime II.
+# The default mime is assumed to be in enhanced act iv mode.
+#
+
+# New "safe" cursor movement (5/87) from <reuss@umd5.umd.edu>.  Prevents
+# freakout with out-of-range args on Sytek multiplexors.  No <smso=^N> and
+# <rmso=^N> since  it gets confused and it's too dim anyway.  No <ich1>
+# since Sytek insists ^S means xoff.
+# (act4: found ":ic=2^S:ei=:im=:ip=.1*^V:" commented out in 8.3 -- esr)
+act4|microterm|microterm act iv,
+	OTbs, am,
+	cols#80, lines#24,
+	bel=^G, clear=\014$<12/>, cr=\r, cub1=^H, cud1=^K, cuf1=^X,
+	cup=\024%p1%{24}%+%c%p2%p2%?%{47}%>%t%{48}%+%;%{80}%+%c,
+	cuu1=^Z, dch1=\004$<.1*/>, dl1=\027$<2.3*/>,
+	ed=\037$<2.2*/>, el=\036$<.1*/>, home=^],
+	il1=\001<2.3*/>, ind=\n, kcub1=^H, kcud1=^K, kcuf1=^X,
+	kcuu1=^Z,
+# The padding on :sr: and :ta: for act5 and mime is a guess and not final.
+# The act 5 has hardware tabs, but they are in columns 8, 16, 24, 32, 41 (!)...
+# (microterm5: removed obsolete ":ma==^Z^P^Xl^Kj:" -- esr)
+act5|microterm5|microterm act v,
+	kcub1=^H, kcud1=^K, kcuf1=^X, kcuu1=^Z, ri=\EH$<3>, uc=^H\EA,
+	use=act4,
+# Mimes using brightness for standout.  Half bright is really dim unless
+# you turn up the brightness so far that lines show up on the screen.
+mime-fb|full bright mime1,
+	is2=^S\E, rmso=^S, smso=^Y, use=mime,
+mime-hb|half bright mime1,
+	is2=^Y\E, rmso=^Y, smso=^S, use=mime,
+# (mime: removed obsolete ":ma=^X ^K^J^Z^P:"; removed ":do=^K:" that overrode
+# the more plausible ":do=^J:" -- esr)
+# uc was at one time disabled to get around a curses bug, be wary of it
+mime|mime1|mime2|mimei|mimeii|microterm mime1,
+	OTbs, am,
+	cols#80, it#8, lines#24, vt#9,
+	bel=^G, clear=^]^C, cr=\r, cub1=^H, cud1=\n, cuf1=^X,
+	cup=\024%p1%{24}%+%c%p2%p2%?%{32}%>%t%{48}%+%;%{80}%+%c,
+	cuu1=^Z, dl1=\027$<80>, ed=^_, el=^^, home=^], ht=\011$<2>,
+	il1=\001$<80>, ind=\n, is2=^S\E^Q, kcub1=^H, kcud1=^K,
+	kcuf1=^X, kcuu1=^Z, ri=\022$<3>, uc=^U,
+# These termcaps (for mime2a) put the terminal in low intensity mode
+# since high intensity mode is so obnoxious.
+mime2a-s|microterm mime2a (emulating an enhanced Soroc iq120),
+	OTbs, am,
+	cols#80, lines#24,
+	bel=^G, clear=\EL, cr=\r, cub1=^H, cud1=\n, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EI, dch1=\ED,
+	dl1=\027$<20*>, ed=\EJ$<20*>, el=\EK, home=^^,
+	il1=\001$<20*>, ind=\n, ip=$<2>, is2=\E), kcub1=^H, kcud1=\n,
+	kcuf1=^L, kcuu1=^K, ri=\EI, rmir=^Z, rmso=\E;, rmul=\E7,
+	smir=\EE, smso=\E:, smul=\E6,
+# This is the preferred mode (but ^X can't be used as a kill character)
+mime2a|mime2a-v|microterm mime2a (emulating an enhanced VT52),
+	OTbs,
+	cols#80, it#8, lines#24,
+	bel=^G, clear=\EL, cr=\r, cub1=^H, cud1=\n, cuf1=\EC,
+	cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, dch1=^N,
+	dl1=\027$<20*>, ed=\EQ$<20*>, el=\EP, home=\EH, ht=^I,
+	il1=\001$<20*>, ind=\n, ip=$<2>, is2=^Y, kcub1=\ED,
+	kcud1=\EB, kcuf1=\EC, kcuu1=\EA, ri=\EA, rmir=^Z, rmso=\E9,
+	rmul=\E5, smir=^O, smso=\E8, smul=\E4,
+# (mime3a: removed obsolete ":ma=^X ^K^J^Z^P:" -- esr)
+mime3a|mime1 emulating 3a,
+	am@,
+	kcub1=^H, kcud1=^K, kcuf1=^X, kcuu1=^Z, use=adm3a,
+mime3ax|mime-3ax|mime1 emulating enhanced 3a,
+	it#8,
+	dl1=\027$<80>, ed=^_, el=^X, ht=\011$<3>, il1=\001$<80>,
+	use=mime3a,
+# Wed Mar  9 18:53:21 1983
+# We run our terminals at 2400 baud, so there might be some timing problems at
+# higher speeds. The major improvements in this model are the terminal now
+# scrolls down and insert mode works without redrawing the rest of the line
+# to the right of the cursor. This is done with a bit of a kludge using the
+# exit graphics mode to get out of insert, but it does not appear to hurt
+# anything when using vi at least. If you have some users using act4s with
+# programs that use curses and graphics mode this could be a problem.
+mime314|mm314|mime 314,
+	am,
+	cols#80, lines#24,
+	clear=^L, cub1=^H, cuf1=^X, cup=\024%p1%c%p2%c, cuu1=^Z,
+	dch1=^D, dl1=^W, ed=^_, el=^^, home=^], ht=^I, il1=^A, kcub1=^H,
+	kcud1=^K, kcuf1=^X, kcuu1=^Z, rmir=^V, smir=^S,
+# Microterm mime 340 from University of Wisconsin
+mm340|mime340|mime 340,
+	cols#80, lines#24,
+	clear=\032$<12/>, cr=\r, cub1=^H, cud1=\n, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K,
+	dch1=\E#$<2.1*/>, dl1=\EV$<49.6/>, ed=\037$<2*/>,
+	el=\EL$<2.1/>, ht=^I, il1=\EU$<46/>, ind=\n, is2=\E\,,
+	kbs=^H, kcub1=^H, kcud1=\n, kcuu1=^K, nel=\r\n,
+# This came from University of Wisconsin marked "astro termcap for jooss".
+# (mt4520-rv: removed obsolete ":kn#4:" and incorrect ":ri=\E[C:";
+# also added <rmam>/<smam> based  on the init string -- esr)
+mt4520-rv|micro-term 4520 reverse video,
+	am, hs, msgr, xenl, xon,
+	cols#80, it#8, lines#24, wsl#80,
+	bel=^G, clear=\E[H\E[J, cnorm=\E[0V\E8, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=\E[D,
+	cud=\E[%p1%dB, cud1=\E[B, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	cvvis=\E7\E[0U, dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM,
+	dl1=\E[M, ed=\E[J, el=\E[K, flash=\E[?5l$<200/>\E[?5h,
+	fsl=\E[?5l\E[?5h, home=\E[H, ht=^I, hts=\EH, ich=\E[%p1%d@,
+	ich1=\E[@, il=\E[%p1%dL, il1=\E[L, ind=\ED,
+	is2=\E(B\E[2l\E>\E[20l\E[?3l\E[?5h\E[?7h\E[1;24r\E[24;1H\E[H
+	    \E[J,
+	kbs=^H, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A,
+	kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, khome=\E[H,
+	ll=\E[24;1H, nel=\EE, rc=\E8, rf=/usr/share/tabset/vt100,
+	ri=\EM, rmam=\E[?7l, rmso=\E[0m, rmul=\E[24m,
+	rs1=\E(B\E[2l\E>\E[20l\E[?3l\E[?5h\E[?7h\E[H\E[J,
+	sc=\E7, sgr0=\E[m, smam=\E[?7h, smso=\E[7m, smul=\E[4m,
+	tbc=\E[g, tsl=\E[25;1H,
+
+# Fri Aug  5 08:11:57 1983
+# This entry works for the ergo 4000 with the following setups:
+# ansi,wraparound,newline disabled, xon/xoff disabled in both
+# setup a & c.
+#
+# WARNING!!! There are multiple versions of ERGO 4000 microcode
+# Be advised that very early versions DO NOT WORK RIGHT !!
+# Microterm does have a ROM exchange program- use it or lose big
+# (ergo400: added <rmam>/<smam> based on the init string -- esr)
+ergo4000|microterm ergo 4000,
+	da, db, msgr,
+	cols#80, lines#66,
+	bel=^G, clear=\E[H\E[2J$<80>, cr=\r, cub1=^H, cud1=\E[B,
+	cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A,
+	dch1=\E[1P$<80>, dl1=\E[1M$<5*>, ed=\E[0J$<15>,
+	el=\E[0K$<13>, ht=^I, il1=\E[1L$<5*>, ind=\ED$<20*>,
+	is2=\E<\E=\E[?1l\E[?4l\E[?5l\E[?7h\E[?8h$<300>,
+	kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kf1=\EOP,
+	kf2=\EOQ, kf3=\EOR, kf4=\EOS, lf1=pf1, lf2=pf2, lf3=pf3,
+	lf4=pf4, ri=\EM$<20*>, rmam=\E[?7l, rmir=\E[4l,
+	rmkx=\E=$<4>, rmso=\E[m$<20>, sgr0=\E[m$<20>,
+	smam=\E[?7m, smir=\E[4h$<6>, smkx=\E=$<4>,
+	smso=\E[7m$<20>,
+
+#### NCR
+#
+# NCR's terminal group was merged with AT&T's when AT&T bought the company.
+# For what happened to that group, see the ADDS section.
+#
+# There is an NCR4103 terminal that's just a re-badged Wyse-50.
+#
+
+# The following vendor-supplied termcaps were captured from the Boundless
+# Technologies site, 8 March 1998.  I removed all-upper-case names that were
+# identical, except for case, to lower-case ones.  I also uncommented the acsc
+# capabilities.X
+#
+# The Intecolor emulation of the NCR 2900/260C color terminal is basically a
+# DEC VT200/300 with color capabilities added.
+ncr260intan|NCR Intecolor emulation of the 2900/260C with an ANSI keyboard,
+	colors#8, pairs#64,
+	op=\E[0m, setab=\E[4%p1%dm, setaf=\E[3%p1%dm,
+	use=decid+cpr, use=ncr260vt300an,
+# The Intecolor emulation of the NCR 2900/260C color terminal is basically a
+# DEC VT200/300 with color capabilities added.
+ncr260intwan|NCR Intecolor emulation of the 2900/260C with an ANSI keyboard (132 column),
+	colors#8, pairs#64,
+	op=\E[0m, setab=\E[4%p1%dm, setaf=\E[3%p1%dm,
+	use=decid+cpr, use=ncr260vt300wan,
+# The Intecolor emulation of the NCR 2900/260C color terminal is basically a
+# DEC VT200/300 with color capabilities added.
+ncr260intpp|NCR Intecolor emulation of the 2900/260C with a PC+ keyboard,
+	colors#8, pairs#64,
+	op=\E[0m, setab=\E[4%p1%dm, setaf=\E[3%p1%dm,
+	use=ncr260vt300pp,
+# The Intecolor emulation of the NCR 2900/260C color terminal is basically a
+# DEC VT200/300 with color capabilities added.
+ncr260intwpp|NCR Intecolor emulation of the 2900/260C with a PC+ keyboard (132 column),
+	colors#8, pairs#64,
+	op=\E[0m, setab=\E[4%p1%dm, setaf=\E[3%p1%dm,
+	use=ncr260vt300wpp,
+# This definition for ViewPoint supports several attributes.  This means
+# that it has magic cookies (extra spaces where the attributes begin).
+# Some applications do not function well with magic cookies.  The System
+# Administrator's Shell in NCR Unix SVR4 1.03 is one such application.
+# If supporting various attributes is not vital, 'xmc#1' and the extra
+# attributes can be removed.
+# Mapping to ASCII character set ('acsc' capability) can also be
+# restored if needed.
+ncr260vppp|NCR 2900/260 viewpoint,
+	am, bw, km, mc5i, mir, msgr, xon,
+	cols#80, lines#24, nlab#32, xmc#1,
+	acsc=07a?h;j5k3l2m1n8q:t4u9v=w0x6, bel=^G, blink=\EG2,
+	cbt=\EI, civis=\E`0, clear=\014$<40>, cnorm=\E`5,
+	cr=\r$<2>, cub1=\010$<2>, cud1=\n$<2>, cuf1=\006$<2>,
+	cup=\EY%p1%{32}%+%c%p2%{32}%+%c$<5>, cuu1=\032$<2>,
+	dch1=\EW$<2>, dim=\EGp, dl1=\El$<2>, ed=\Ek$<2>,
+	el=\EK$<2>, home=\036$<2>, ht=^I, hts=\E1, il1=\EM$<2>,
+	ind=\n$<2>, invis=\EG1,
+	is2=\Ee6\E~%$<100>\E+\E`:\Ed/\E`1\EO\Ee4\Ec@0@\Ec@1A\EcB0
+	    \EcC1\Ee7$<100>,
+	kDC=\El, kEND=\Ek, kHOM=^A, kPRT=\E7, kRIT=^F, ka1=^A, ka3=\EJ,
+	kbs=^H, kc1=\ET, kc3=\EJ, kcub1=^U, kcud1=\n, kcuf1=^F,
+	kcuu1=^Z, kdch1=\EW, kend=\EK, kf1=^B1\r, kf10=^B:\r,
+	kf11=^B;\r, kf12=^B<\r, kf13=^B=\r, kf14=^B>\r, kf15=^B?\r,
+	kf16=^B@\r, kf17=^B!\r, kf18=^B"\r, kf19=^B#\r, kf2=^B2\r,
+	kf20=^B$\r, kf21=^B%^M, kf22=^B&\r, kf23=^B'\r, kf24=^B(\r,
+	kf25=^B)\r, kf26=^B*\r, kf27=^B+\r, kf28=\002\,\r,
+	kf29=^B-\r, kf3=^B3\r, kf30=^B.\r, kf31=^B/\r, kf32=^B0\r,
+	kf4=^B4\r, kf5=^B5\r, kf6=^B6\r, kf7=^B7\r, kf8=^B8\r,
+	kf9=^B9\r, khome=^A, kich1=\Eq, knp=\EJ, kpp=\EJ, kprt=\EP,
+	ll=\001$<5>, mc0=\EP$<100>, mc4=^T, mc5=^R,
+	mrcup=\Ew@%p1%{48}%+%c%p2%{32}%+%c%p3%{32}%+%c$<5>,
+	nel=\037$<2>, rev=\EG4, ri=\Ej$<2>, rmacs=\EcB0\EH\003,
+	rmir=\Er, rmso=\EG0, rmul=\EG0, rmxon=\Ec20,
+	rs2=\Ee6\E~%$<100>\E+\E`:\Ed/\E`1\EO\Ee4\Ec@0@\Ec@1A\EcB0
+	    \EcC1\Ee7$<100>,
+	sgr0=\EG0\EH\003, smacs=\EcB1\EH\002, smir=\Eq,
+	smso=\EG4, smul=\EG8, smxon=\Ec21, use=ncr260vp+sl,
+
+ncr260vp+sl|NCR 2900/260 viewpoint with status-line,
+	hs,
+	dsl=\E`c, fsl=\r, tsl=\EF,
+
+ncr260vpwpp|NCR 2900/260 viewpoint wide mode,
+	cols#132,
+	cup=\Ea%i%p1%dR%p2%dC$<30>,
+	is2=\Ee6\E~%$<100>\E+\E`;\Ed/\E`1\EO\Ee4\Ec@0@\Ec@1A\EcB0
+	    \EcC1\Ee7$<100>,
+	rs2=\Ee6\E~%$<100>\E+\E`;\Ed/\E`1\EO\Ee4\Ec@0@\Ec@1A\EcB0
+	    \EcC1\Ee7$<100>,
+	use=ncr260vppp,
+
+ncr260vt100an|NCR 2900/260 VT100 with ANSI keyboard,
+	am, mir, msgr, xenl, xon,
+	cols#80, lines#24, nlab#32,
+	acsc=``aaffggjjkkllmmnnooqqssttuuvvwwxx~~, bel=^G,
+	blink=\E[5m, bold=\E[1m, clear=\E[2J\E[1;1H$<20>,
+	cr=\r$<1>, csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD$<5>,
+	cub1=\E[D$<5>, cud=\E[%p1%dB$<5>, cud1=\E[B$<5>,
+	cuf=\E[%p1%dC$<5>, cuf1=\E[C$<5>,
+	cup=\E[%i%p1%d;%p2%dH$<10>, cuu=\E[%p1%dA$<5>,
+	cuu1=\E[A$<5>, dch=\E[%p1%dP$<5>, dch1=\E[1P$<5>,
+	dl=\E[%p1%dM$<5>, dl1=\E[M$<5>, ech=\E[%p1%dX,
+	ed=\E[0J$<5>, el=\E[0K$<3>, el1=\E[1K$<3>, home=\E[H$<1>,
+	hpa=\E[%p1%dG$<40>, ht=^I, hts=\EH, ich=\E[%p1%d@$<5>,
+	il=\E[%p1%dL$<5>, il1=\E[L$<5>, ind=\ED$<5>,
+	indn=\E[%p1%dE$<5>, invis=\E[8m,
+	is2=\E[!p\E[?7;19;67h\E[?1;3;4l\E(B\E)0\017\E[2J\E[1;1H\E>$<
+	    200>,
+	kbs=^H, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
+	khlp=\E[28~, kich1=\E[2~, krdo=\E[29~, nel=\EE$<5>, rc=\E8,
+	rev=\E[7m, ri=\EM$<5>, rmacs=^O, rmir=\E[4l,
+	rmkx=\E[?1l\E>, rmso=\E[0m, rmul=\E[0m,
+	rs2=\E[!p\E[?7;19;67h\E[?1;3;4l\E(B\E)0\017\E[2J\E[1;1H\E>$<
+	    200>,
+	sc=\E7,
+	sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5
+	    %;%?%p7%t;8%;m%?%p9%t\016%e\017%;$<20>,
+	sgr0=\E[0m\017$<20>, smacs=^N, smir=\E[4h,
+	smkx=\E[?1h\E=, smso=\E[1;7m, smul=\E[4m, tbc=\E[3g,
+	vpa=\E[%p1%dd$<40>, use=decid+cpr, use=vt220+vtedit,
+	use=vt220+cvis, use=vt220+keypad, use=ncr260vt+sl,
+ncr260vt+sl|NCR 2900/260 VT100 status line,
+	hs,
+	dsl=\E[0$~\E[1$~, fsl=\E[0$}, tsl=\E[2$~\E[1$},
+ncr260vt100wan|NCR 2900/260 VT100 wide mode ANSI keyboard,
+	cols#132,
+	cup=\E[%i%p1%d;%p2%dH$<30>,
+	is2=\E[!p\E[?3;7;19;67h\E[?1;4l\E(B\E)0\017\E[2J\E[1;1H\E>$<
+	    200>,
+	rs2=\E[!p\E[?3;7;19;67h\E[?1;4l\E(B\E)0\017\E[2J\E[1;1H\E>$<
+	    200>,
+	use=ncr260vt100an,
+ncr260vt100pp|NCR 2900/260 VT100 with PC+ keyboard,
+	is2=\E[!p\E[?7;19;67h\E[?1;3;4l\E(B\E)0\017\E[2J\E[1;1H\E>$<
+	    200>,
+	ka1=\E[H, ka3=\EOu, kb2=\E[V, kc3=\E[U, kcub1=\E[D,
+	kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kdch1=\E[4~,
+	kend=\E[5~, khome=\E[2~, kich1=\E[1~, knp=\E[6~, kpp=\E[3~,
+	lf1=pf1, lf2=pf2, lf3=pf3, lf4=pf4, rmkx=\E>,
+	rs2=\E[!p\E[?7;19;67h\E[?1;3;4l\E(B\E)0\017\E[2J\E[1;1H\E>$<
+	    200>,
+	smkx=\E=, use=ncr260vt100an,
+ncr260vt100wpp|NCR 2900/260 VT100 wide mode PC+  keyboard,
+	cols#132,
+	cup=\E[%i%p1%d;%p2%dH$<30>,
+	is2=\E[!p\E[?3;7;19;67h\E[?1;4l\E(B\E)0\017\E[2J\E[1;1H\E>$<
+	    200>,
+	rs2=\E[!p\E[?3;7;19;67h\E[?1;4l\E(B\E)0\017\E[2J\E[1;1H\E>$<
+	    200>,
+	use=ncr260vt100pp,
+ncr260vt200an|NCR 2900/260 VT200 with ANSI keyboard,
+	am, mir, msgr, xenl, xon,
+	cols#80, lines#24, nlab#32,
+	acsc=``aaffggjjkkllmmnnooqqssttuuvvwwxx~~, bel=^G,
+	blink=\E[5m, bold=\E[1m, clear=\E[2J\E[1;1H$<20>,
+	cr=\r$<1>, csr=\E[%i%p1%d;%p2%dr$<5>,
+	cub=\E[%p1%dD$<5>, cub1=\E[D$<5>, cud=\E[%p1%dB$<5>,
+	cud1=\E[B$<5>, cuf=\E[%p1%dC$<5>, cuf1=\E[C$<5>,
+	cup=\E[%i%p1%d;%p2%dH$<10>, cuu=\E[%p1%dA$<5>,
+	cuu1=\E[A$<5>, dch=\E[%p1%dP$<5>, dch1=\E[1P$<5>,
+	dl=\E[%p1%dM$<5>, dl1=\E[M$<5>, ech=\E[%p1%dX$<5>,
+	ed=\E[0J, el=\E[0K$<5>, el1=\E[1K$<5>, home=\E[H,
+	hpa=\E[%p1%dG$<40>, ht=^I, hts=\EH, ich=\E[%p1%d@$<5>,
+	il=\E[%p1%dL$<5>, il1=\E[L$<5>, ind=\ED$<5>,
+	indn=\E[%p1%dE$<5>, invis=\E[8m,
+	is2=\E[!p\E[?7;19;67h\E[?1;3;4l\E(B\E)0\017\E[2J\E[1;1H\E>$<
+	    200>,
+	kbs=^H, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
+	kf0=\EOy, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~,
+	kf13=\E[25~, kf14=\E[26~, kf15=\E[28~, kf16=\E[29~,
+	kf17=\E[31~, kf18=\E[32~, kf19=\E[33~, kf2=\EOQ,
+	kf20=\E[34~, kf21=\E[31~, kf22=\E[32~, kf23=\E[33~,
+	kf24=\E[34~, kf25=\E[35~, kf26=\E[1~, kf27=\E[2~,
+	kf28=\E[3~, kf29=\E[4~, kf3=\EOR, kf30=\E[5~, kf31=\E[6~,
+	kf32=\E[7~, kf33=\E[8~, kf34=\E[9~, kf35=\E[10~, kf4=\EOS,
+	kf5=\E[M, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~,
+	khlp=\E[28~, krdo=\E[29~, mc0=\E[i, mc4=\E[4i, mc5=\E[5i,
+	nel=\EE, rc=\E8, rev=\E[7m, ri=\EM$<5>, rmacs=\017$<20>,
+	rmam=\E[?7l, rmir=\E[4l, rmkx=\E[?1l\E>, rmso=\E[27m,
+	rmul=\E[24m,
+	rs2=\E[!p\E[?7;19;67h\E[?1;3;4l\E(B\E)0\017\E[2J\E[1;1H\E>$<
+	    200>,
+	sc=\E7,
+	sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5
+	    %;%?%p7%t;8%;m%?%p9%t\016%e\017%;$<20>,
+	sgr0=\E[0m\017$<20>, smacs=\016$<20>, smam=\E[?7h,
+	smir=\E[4h, smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m,
+	tbc=\E[3g, vpa=\E[%p1%dd$<40>, use=decid+cpr,
+	use=vt220+vtedit, use=vt220+cvis, use=vt220+keypad,
+	use=ncr260vt+sl,
+ncr260vt200wan|NCR 2900/260 VT200 wide mode ANSI keyboard,
+	cols#132,
+	cup=\E[%i%p1%d;%p2%dH$<30>,
+	is2=\E[!p\E[?3;7;19;67h\E[?4l\E(B\E)0\017\E[2J\E[1;1H$<200>,
+	rs2=\E[!p\E[?3;7;19;67h\E[?4l\E(B\E)0\017\E[2J\E[1;1H$<200>, use=ncr260vt200an,
+ncr260vt200pp|NCR 2900/260 VT200 with PC+ keyboard,
+	ka1=\E[H, ka3=\EOu, kb2=\E[V, kc3=\E[U, kcub1=\E[D,
+	kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kdch1=\E[4~,
+	kend=\E[1~, khome=\E[H, kich1=\E[2~, knp=\E[6~, kpp=\E[5~,
+	lf1=pf1, lf2=pf2, lf3=pf3, lf4=pf4, rmkx=\E>, smkx=\E=,
+	use=ncr260vt200an,
+ncr260vt200wpp|NCR 2900/260 VT200 wide mode PC+  keyboard,
+	cols#132,
+	cup=\E[%i%p1%d;%p2%dH$<30>,
+	is2=\E[!p\E[?3;7;19;67h\E[?1;4l\E(B\E)0\017\E[2J\E[1;1H\E>$<
+	    200>,
+	rs2=\E[!p\E[?3;7;19;67h\E[?1;4l\E(B\E)0\017\E[2J\E[1;1H\E>$<
+	    200>,
+	use=ncr260vt200pp,
+ncr260vt300an|NCR 2900/260 VT300 with ANSI keyboard,
+	am, mir, msgr, xenl, xon,
+	cols#80, lines#24, nlab#32,
+	acsc=``aaffggjjkkllmmnnooqqssttuuvvwwxx~~, bel=^G,
+	blink=\E[5m, bold=\E[1m, clear=\E[2J\E[1;1H$<20>,
+	cr=\r$<1>, csr=\E[%i%p1%d;%p2%dr$<5>,
+	cub=\E[%p1%dD$<5>, cub1=\E[D$<5>, cud=\E[%p1%dB$<5>,
+	cud1=\E[B$<5>, cuf=\E[%p1%dC$<5>, cuf1=\E[C$<5>,
+	cup=\E[%i%p1%d;%p2%dH$<10>, cuu=\E[%p1%dA$<5>,
+	cuu1=\E[A$<5>, dch=\E[%p1%dP$<5>, dch1=\E[1P$<5>,
+	dl=\E[%p1%dM$<5>, dl1=\E[M$<5>, ech=\E[%p1%dX$<5>,
+	ed=\E[0J, el=\E[0K$<5>, el1=\E[1K$<5>, home=\E[H,
+	hpa=\E[%p1%dG$<40>, ht=^I, hts=\EH, ich=\E[%p1%d@$<5>,
+	il=\E[%p1%dL$<5>, il1=\E[L$<5>, ind=\ED$<5>,
+	indn=\E[%p1%dE$<5>, invis=\E[8m,
+	is2=\E[!p\E[?7;19;67h\E[?1;3;4l\E[1;0%w\E(B\E)0\017\E[2J\E[1
+	    ;1H\E>$<200>,
+	kbs=^H, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
+	kf0=\EOy, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~,
+	kf13=\E[25~, kf14=\E[26~, kf15=\E[28~, kf16=\E[29~,
+	kf17=\E[31~, kf18=\E[32~, kf19=\E[33~, kf20=\E[34~,
+	kf21=\E[31~, kf22=\E[32~, kf23=\E[33~, kf24=\E[34~,
+	kf25=\E[35~, kf26=\E[1~, kf27=\E[2~, kf28=\E[3~,
+	kf29=\E[4~, kf30=\E[5~, kf31=\E[6~, kf32=\E[7~, kf33=\E[8~,
+	kf34=\E[9~, kf35=\E[10~, kf5=\E[M, kf6=\E[17~, kf7=\E[18~,
+	kf8=\E[19~, kf9=\E[20~, khlp=\E[28~, krdo=\E[29~, mc0=\E[i,
+	mc4=\E[4i, mc5=\E[5i, nel=\EE, rc=\E8, rev=\E[7m, ri=\EM$<5>,
+	rmacs=\017$<20>, rmam=\E[?7l, rmir=\E[4l, rmkx=\E[?1l\E>,
+	rmso=\E[27m, rmul=\E[24m,
+	rs2=\E[!p\E[?7;19;67h\E[?1;3;4l\E[1;0%w\E(B\E)0\017\E[2J\E[1
+	    ;1H\E>$<200>,
+	sc=\E7,
+	sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5
+	    %;%?%p7%t;8%;m%?%p9%t\016%e\017%;$<20>,
+	sgr0=\E[0m\017$<20>, smacs=\016$<20>, smam=\E[?7h,
+	smir=\E[4h, smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m,
+	tbc=\E[3g, vpa=\E[%p1%dd$<40>, use=decid+cpr,
+	use=vt220+vtedit, use=vt220+cvis, use=vt220+keypad,
+	use=ncr260vt+sl,
+ncr260vt300wan|NCR 2900/260 VT300 wide mode ANSI keyboard,
+	cols#132,
+	cup=\E[%i%p1%d;%p2%dH$<30>,
+	is2=\E[!p\E[?3;7;19;67h\E[?4l\E[1;0%w\E(B\E)0\017\E[2J\E[1;1
+	    H$<200>,
+	rs2=\E[!p\E[?3;7;19;67h\E[?4l\E[1;0%w\E(B\E)0\017\E[2J\E[1;1
+	    H$<200>,
+	use=ncr260vt300an,
+ncr260vt300pp|NCR 2900/260 VT300 with PC+ keyboard,
+	ka1=\E[H, ka3=\EOu, kb2=\E[V, kc3=\E[U, kcub1=\E[D,
+	kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kdch1=\E[4~,
+	kend=\E[1~, khome=\E[H, kich1=\E[2~, knp=\E[6~, kpp=\E[5~,
+	lf1=pf1, lf2=pf2, lf3=pf3, lf4=pf4, rmkx=\E>, smkx=\E=,
+	use=ncr260vt300an,
+ncr260vt300wpp|NCR260VT300WPP|NCR 2900/260 VT300 wide mode PC+  keyboard,
+	cols#132,
+	cup=\E[%i%p1%d;%p2%dH$<30>,
+	is2=\E[!p\E[?3;7;19;67h\E[?1;4l\E[1;0%w\E(B\E)0\017\E[2J\E[1
+	    ;1H\E>$<200>,
+	rs2=\E[!p\E[?3;7;19;67h\E[?1;4l\E[1;0%w\E(B\E)0\017\E[2J\E[1
+	    ;1H\E>$<200>,
+	use=ncr260vt300pp,
+# This terminfo file contains color capabilities for the Wyse325 emulation of
+# the NCR 2900/260C color terminal.  Because of the structure of the command
+# (escape sequence) used to set color attributes, one of the fore/background
+# colors must be preset to a given value. I have set the background color to
+# black.  The user can change this setup by altering the last section of the
+# 'setf' definition.  The escape sequence to set color attributes is
+#		ESC d y <foreground_color> <background_color> 1
+# In addition, the background color can be changed through the desk accessories.
+# The capability 'op' sets colors to green on black (default combination).
+#
+# NOTE:  The NCR Unix System Administrator's Shell will not function properly
+#	    if the 'pairs' capability is defined. Un-Comment the 'pairs'
+#	    capability and recompile if you wish to have it included.
+#
+ncr260wy325pp|NCR 2900/260 Wyse 325,
+	am, bw, km, mc5i, mir, msgr, xon,
+	colors#16, cols#80, lines#24, ncv#33, nlab#32,
+	acsc=07a?h;j5k3l2m1n8q:t4u9v=w0x6, bel=^G, blink=\EG2,
+	cbt=\EI, civis=\E`0, clear=\E*$<10>, cnorm=\E`1, cr=\r,
+	cub1=\010$<5>, cud1=\n$<5>, cuf1=\014$<5>,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c$<10>, cuu1=\013$<5>,
+	cvvis=\E`5, dch1=\EW$<50>, dl1=\ER$<5>, ed=\Ey$<5>,
+	el=\Et$<5>, home=\036$<5>, ht=^I, hts=\E1, il1=\EE$<5>,
+	ind=\n$<5>, invis=\EG1,
+	is2=\Ee6\Ed/\Ee1\Ed*\Er\EO\E`1\E`:\E`@\E~!\E"\Ee4\Ex@\E`9
+	    \Ee7$<100>,
+	kDC=\ER, kEND=\EY, kHOM=\E{, kNXT=\EK, kPRT=\E7, kPRV=\EJ,
+	kRIT=^L, ka1=^^, kb2=\EJ, kbs=^H, kc1=\ET, kc3=\EK, kcbt=\EI,
+	kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K, kdch1=\EW, kend=\ET,
+	kf1=^A@\r, kf10=^AI\r, kf11=^AJ\r, kf12=^AK\r, kf13=^AL\r,
+	kf14=^AM\r, kf15=^AN\r, kf16=^AO\r, kf17=^A`\r, kf18=^Aa\r,
+	kf19=^Ab\r, kf2=^AA\r, kf20=^Ac\r, kf21=^Ad\r, kf22=^Ae\r,
+	kf23=^Af\r, kf24=^Ag\r, kf25=^Ah\r, kf26=^Ai\r, kf27=^Aj\r,
+	kf28=^Ak\r, kf29=^Al\r, kf3=^AB\r, kf30=^Am\r, kf31=^An\r,
+	kf32=^Ao\r, kf4=^AC\r, kf5=^AD\r, kf6=^AE\r, kf7=^AF\r,
+	kf8=^AG\r, kf9=^AH\r, khome=^^, kich1=\Eq, knp=\EK, kpp=\EJ,
+	kprt=\EP, mc0=\EP, mc4=^T, mc5=^R,
+	mrcup=\Ew@%p1%{48}%+%c%p2%{32}%+%c%p3%{32}%+%c$<10>,
+	nel=\037$<5>, rev=\EG4, ri=\Ej$<5>, rmacs=\EH\003\EcB0,
+	rmam=\Ed., rmir=\Er, rmso=\EG0, rmul=\EG0, rmxon=\Ec20,
+	rs2=\Ee6\Ed/\Ee1\Ed*\Er\EO\E`1\E`:\E`@\E~!\E"\Ee4\Ex@\E`9
+	    \Ee7$<100>,
+	setb=\s,
+	setf=%?%p1%{0}%=%t%{49}%e%p1%{1}%=%t%{50}%e%p1%{2}%=%t%{51}
+	     %e%p1%{3}%=%t%{52}%e%p1%{4}%=%t%{53}%e%p1%{5}%=%t%{54}
+	     %e%p1%{6}%=%t%{55}%e%p1%{7}%=%t%{64}%e%p1%{8}%=%t%{57}
+	     %e%p1%{9}%=%t%{58}%e%p1%{10}%=%t%{59}%e%p1%{11}%=%t
+	     %{60}%e%p1%{12}%=%t%{61}%e%p1%{13}%=%t%{62}%e%p1%{14}%=
+	     %t%{63}%e%p1%{15}%=%t%{56}%;\Edy%c11$<100>,
+	sgr0=\EG0\EcB0\EcD$<15>, smacs=\EH\002\EcB1, smam=\Ed/,
+	smir=\Eq, smso=\EGt, smul=\EG8, smxon=\Ec21, tbc=\E0,
+	use=ncr260vp+sl,
+ncr260wy325wpp|NCR 2900/260 Wyse 325 wide mode,
+	cols#132,
+	cup=\Ea%i%p1%dR%p2%dC$<30>,
+	is2=\Ee6\Ed/\Ee1\Ed*\Er\EO\E`1\E`;\E`@\E~!\E"\Ee4\Ex@\E`9
+	    \Ee7$<100>,
+	rs2=\Ee6\Ed/\Ee1\Ed*\Er\EO\E`1\E`;\E`@\E~!\E"\Ee4\Ex@\E`9
+	    \Ee7$<100>,
+	use=ncr260wy325pp,
+# This definition for Wyse 350 supports several attributes.  This means
+# that it has magic cookies (extra spaces where the attributes begin).
+# Some applications do not function well with magic cookies.  The System
+# Administrator's Shell in NCR Unix SVR4 1.03 is one such application.
+# If supporting various attributes is not vital, 'xmc#1' and the extra
+# attributes can be removed.
+# Mapping to ASCII character set ('acsc' capability) can also be
+# restored if needed.
+# In addition, color capabilities have been added to this file.  The drawback,
+# however, is that the background color has to be black.  The foreground colors
+# are numbered 0 through 15.
+#
+# NOTE:  The NCR Unix System Administrator's Shell does not function properly
+#	    with the 'pairs' capability defined as below.  If you wish to
+#	    have it included, Un-comment it and recompile (using 'tic').
+#
+ncr260wy350pp|NCR 2900/260 Wyse 350,
+	am, bw, km, mc5i, mir, msgr, xon,
+	colors#16, cols#80, lines#24, ncv#33, nlab#32, pairs#16, xmc#1,
+	acsc=07a?h;j5k3l2m1n8q:t4u9v=w0x6, bel=^G, blink=\EG2,
+	cbt=\EI, civis=\E`0, clear=\E+$<20>, cnorm=\E`1, cr=\r,
+	cub1=\010$<5>, cud1=\n$<5>, cuf1=\014$<5>,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c$<40>, cuu1=\013$<5>,
+	cvvis=\E`5, dch1=\EW$<50>, dim=\EGp, dl1=\ER$<5>,
+	ed=\Ey$<5>, el=\Et$<5>, home=\036$<10>, ht=^I, hts=\E1,
+	il1=\EE$<5>, ind=\n$<5>, invis=\EG1,
+	is2=\Ee6\Ed/\Ee1\Ed*\Er\EO\E`1\E`:\E`@\E~!\E"\Ee4\Ex@\E`9
+	    \Ee7$<100>,
+	kDC=\ER, kEND=\EY, kHOM=\E{, kPRT=\E7, kRIT=^L, ka1=^^, kbs=^H,
+	kc1=\ET, kc3=\EK, kcbt=\EI, kcub1=^H, kcud1=\n, kcuf1=^L,
+	kcuu1=^K, kdch1=\EW, kend=\ET, kf1=^A@\r, kf10=^AI\r,
+	kf11=^AJ\r, kf12=^AK\r, kf13=^AL\r, kf14=^AM\r, kf15=^AN\r,
+	kf16=^AO\r, kf17=^A`\r, kf18=^Aa\r, kf19=^Ab\r, kf2=^AA\r,
+	kf20=^Ac\r, kf21=^Ad\r, kf22=^Ae\r, kf23=^Af\r, kf24=^Ag\r,
+	kf25=^Ah\r, kf26=^Ai\r, kf27=^Aj\r, kf28=^Ak\r, kf29=^Al\r,
+	kf3=^AB\r, kf30=^Am\r, kf31=^An\r, kf32=^Ao\r, kf4=^AC\r,
+	kf5=^AD\r, kf6=^AE\r, kf7=^AF\r, kf8=^AG\r, kf9=^AH\r,
+	khome=^^, kich1=\Eq, knp=\EK, kpp=\EJ, kprt=\EP,
+	mc0=\EP$<10>, mc4=^T, mc5=^R,
+	mrcup=\Ew@%p1%{48}%+%c%p2%{32}%+%c%p3%{32}%+%c$<20>,
+	nel=\037$<5>, rev=\EG4, ri=\Ej$<5>, rmacs=\EH\003\EcB0,
+	rmam=\Ed., rmir=\Er, rmso=\EG0, rmul=\EG0, rmxon=\Ec20,
+	rs2=\Ee6\Ed/\Ee1\Ed*\Er\EO\E`1\E`:\E`@\E~!\E"\Ee4\Ex@\E`9
+	    \Ee7$<100>,
+	setb=\s,
+	setf=%?%p1%{0}%=%t%{49}%e%p1%{1}%=%t%{50}%e%p1%{2}%=%t%{51}
+	     %e%p1%{3}%=%t%{52}%e%p1%{4}%=%t%{53}%e%p1%{5}%=%t%{54}
+	     %e%p1%{6}%=%t%{55}%e%p1%{7}%=%t%{102}%e%p1%{8}%=%t%{97}
+	     %e%p1%{9}%=%t%{98}%e%p1%{10}%=%t%{99}%e%p1%{11}%=%t
+	     %{101}%e%p1%{12}%=%t%{106}%e%p1%{13}%=%t%{110}%e%p1
+	     %{14}%=%t%{111}%e%p1%{15}%=%t%{56}%;\Em0%c$<100>,
+	sgr0=\EG0\EH\003\EcD, smacs=\EH\002\EcB1, smam=\Ed/,
+	smir=\Eq, smso=\EGt, smul=\EG8, smxon=\Ec21, tbc=\E0,
+	use=ncr260vp+sl,
+ncr260wy350wpp|NCR 2900/260 Wyse 350 wide mode,
+	cols#132,
+	cup=\Ea%i%p1%dR%p2%dC$<30>,
+	is2=\Ee6\Ed/\Ee1\Ed*\Er\EO\E`1\E`;\E`@\E~!\E"\Ee4\Ex@\E`9
+	    \Ee7$<200>,
+	rs2=\Ee6\Ed/\Ee1\Ed*\Er\EO\E`1\E`;\E`@\E~!\E"\Ee4\Ex@\E`9
+	    \Ee7$<200>,
+	use=ncr260wy350pp,
+# This definition for Wyse 50+ supports several attributes.  This means
+# that it has magic cookies (extra spaces where the attributes begin).
+# Some applications do not function well with magic cookies.  The System
+# Administrator's Shell in NCR Unix SVR4 1.03 is one such application.
+# If supporting various attributes is not vital, 'xmc#1' and the extra
+# attributes can be removed.
+# Mapping to ASCII character set ('acsc' capability) can also be
+# restored if needed.
+# (ncr260wy50+pp: originally contained commented-out
+# <acsc=j5k3l2m1n8q:t4u9v=w0x6>, as well as the commented-out one there -- esr)
+ncr260wy50+pp|NCR 2900/260 Wyse 50+,
+	am, bw, km, mc5i, mir, msgr, xon,
+	cols#80, lines#24, nlab#32, xmc#1,
+	acsc=0wa_h[jukslrmqnxqzttuyv]wpxv, bel=^G, blink=\EG2,
+	cbt=\EI$<5>, civis=\E`0, clear=\E+$<20>, cnorm=\E`1, cr=\r,
+	cub1=\010$<5>, cud1=\n$<5>, cuf1=\014$<5>,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c$<30>, cuu1=\013$<5>,
+	cvvis=\E`5, dch1=\EW$<50>, dim=\EGp, dl1=\ER$<5>,
+	ed=\EY$<5>, el=\ET$<5>, home=\036$<10>, ht=\011$<5>,
+	hts=\E1$<5>, il1=\EE$<5>, ind=\n$<5>, invis=\EG1,
+	is2=\Ee6\E~"$<100>\E+\Ed/\Ee1\Ed*\Er\EO\E`1\E`:\E`@\E~!\E"
+	    \Ee4\Ex@\E`9\Ee7$<100>,
+	kDC=\ER, kEND=\EY, kHOM=\E{, kPRT=\E7, kRIT=^L, ka1=^^, kbs=^H,
+	kc1=\ET, kc3=\EK, kcbt=\EI, kcub1=^H, kcud1=\n, kcuf1=^L,
+	kcuu1=^K, kdch1=\EW, kend=\ET, kf1=^A@\r, kf10=^AI\r,
+	kf11=^AJ\r, kf12=^AK\r, kf13=^AL\r, kf14=^AM\r, kf15=^AN\r,
+	kf16=^AO\r, kf17=^A`\r, kf18=^Aa\r, kf19=^Ab\r, kf2=^AA\r,
+	kf20=^Ac\r, kf21=^Ad\r, kf22=^Ae\r, kf23=^Af\r, kf24=^Ag\r,
+	kf25=^Ah\r, kf26=^Ai\r, kf27=^Aj\r, kf28=^Ak\r, kf29=^Al\r,
+	kf3=^AB\r, kf30=^Am\r, kf31=^An\r, kf32=^Ao\r, kf4=^AC\r,
+	kf5=^AD\r, kf6=^AE\r, kf7=^AF\r, kf8=^AG\r, kf9=^AH\r,
+	khome=^^, kich1=\Eq, knp=\EK, kpp=\EJ, kprt=\EP,
+	mc0=\EP$<10>, mc4=^T, mc5=^R,
+	mrcup=\Ew@%p1%{48}%+%c%p2%{32}%+%c%p3%{32}%+%c$<10>,
+	nel=\037$<5>, rev=\EG4, ri=\Ej$<5>, rmacs=\EH^C, rmam=\Ed.,
+	rmir=\Er, rmso=\EG0, rmul=\EG0, rmxon=\Ec20,
+	rs2=\Ee6\E~"$<100>\E+\Ed/\Ee1\Ed*\Er\EO\E`1\E`:\E`@\E~!\E"
+	    \Ee4\Ex@\E`9\Ee7$<100>,
+	sgr0=\EG0\EH\003$<15>, smacs=\EH^B, smam=\Ed/, smir=\Eq,
+	smso=\EGt, smul=\EG8, smxon=\Ec21, tbc=\E0$<5>,
+	use=ncr260vp+sl,
+ncr260wy50+wpp|NCR 2900/260 Wyse 50+ wide mode,
+	cols#132,
+	cup=\Ea%i%p1%dR%p2%dC$<30>,
+	is2=\Ee6\E~"$<100>\E+\Ed/\Ee1\Ed*\Er\EO\E`1\E`;\E`@\E~!\E"
+	    \Ee4\Ex@\E`9\Ee7$<200>,
+	rs2=\Ee6\E~"$<100>\E+\Ed/\Ee1\Ed*\Er\EO\E`1\E`;\E`@\E~!\E"
+	    \Ee4\Ex@\E`9\Ee7$<200>,
+	use=ncr260wy50+pp,
+ncr260wy60pp|NCR 2900/260 Wyse 60,
+	am, bw, km, mc5i, mir, msgr, xon,
+	cols#80, lines#24, nlab#32,
+	acsc=07a?h;j5k3l2m1n8q:t4u9v=w0x6, bel=^G, blink=\EG2,
+	cbt=\EI$<15>, civis=\E`0, clear=\E*$<100>, cnorm=\E`1,
+	cr=\r, cub1=\010$<5>, cud1=\n$<5>, cuf1=\014$<5>,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c$<10>, cuu1=\013$<5>,
+	cvvis=\E`5, dch1=\EW$<50>, dl1=\ER$<5>, ed=\Ey$<5>,
+	el=\Et$<5>, home=\036$<25>, ht=\011$<15>, hts=\E1$<15>,
+	il1=\EE$<5>, ind=\n$<5>, invis=\EG1,
+	is2=\Ee6\E~4$<100>\E+\Ed/\Ee1\Ed*\Er\EO\E`1\E`:\E`@\E~!\E"
+	    \Ee4\Ex@\E`9\Ee7$<100>,
+	kDC=\ER, kEND=\EY, kHOM=\E{, kNXT=\EK, kPRT=\E7, kPRV=\EJ,
+	kRIT=^L, ka1=^^, kb2=\EJ, kbs=^H, kc1=\ET, kc3=\EK,
+	kcbt=\EI$<15>, kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K,
+	kdch1=\EW, kend=\ET, kf1=^A@\r, kf10=^AI\r, kf11=^AJ\r,
+	kf12=^AK\r, kf13=^AL\r, kf14=^AM\r, kf15=^AN\r, kf16=^AO\r,
+	kf17=^A`\r, kf18=^Aa\r, kf19=^Ab\r, kf2=^AA\r, kf20=^Ac\r,
+	kf21=^Ad\r, kf22=^Ae\r, kf23=^Af\r, kf24=^Ag\r, kf25=^Ah\r,
+	kf26=^Ai\r, kf27=^Aj\r, kf28=^Ak\r, kf29=^Al\r, kf3=^AB\r,
+	kf30=^Am\r, kf31=^An\r, kf32=^Ao\r, kf4=^AC\r, kf5=^AD\r,
+	kf6=^AE\r, kf7=^AF\r, kf8=^AG\r, kf9=^AH\r, khome=^^,
+	kich1=\Eq, knp=\EK, kpp=\EJ, kprt=\EP, mc0=\EP, mc4=^T, mc5=^R,
+	mrcup=\Ew@%p1%{48}%+%c%p2%{32}%+%c%p3%{32}%+%c$<30>,
+	nel=\037$<5>, rev=\EG4, ri=\Ej$<5>, rmacs=\EH^C, rmam=\Ed.,
+	rmir=\Er, rmso=\EG0, rmul=\EG0, rmxon=\Ec20,
+	rs2=\Ee6\E~4$<100>\E+\Ed/\Ee1\Ed*\Er\EO\E`1\E`:\E`@\E~!\E"
+	    \Ee4\Ex@\E`9\Ee7$<100>,
+	sgr0=\EG0\EcB0\EcD$<15>, smacs=\EH^B, smam=\Ed/,
+	smir=\Eq, smso=\EGt, smul=\EG8, smxon=\Ec21, tbc=\E0$<15>,
+	use=ncr260vp+sl,
+ncr260wy60wpp|NCR 2900/260 Wyse 60 wide mode,
+	cols#132,
+	cup=\Ea%i%p1%dR%p2%dC$<30>,
+	is2=\Ee6\E~4$<100>\E+\Ed/\Ee1\Ed*\Er\EO\E`1\E`;\E`@\E~!\E"
+	    \Ee4\Ex@\E`9\Ee7$<100>,
+	rs2=\Ee6\E~4$<100>\E+\Ed/\Ee1\Ed*\Er\EO\E`1\E`;\E`@\E~!\E"
+	    \Ee4\Ex@\E`9\Ee7$<100>,
+	use=ncr260wy60pp,
+ncr160vppp|NCR 2900/160 viewpoint,
+	use=ncr260vppp,
+ncr160vpwpp|NCR 2900/160 viewpoint wide mode,
+	use=ncr260vpwpp,
+ncr160vt100an|NCR 2900/160 VT100 with ANSI keyboard,
+	use=ncr260vt100an,
+ncr160vt100pp|NCR 2900/160 VT100 with PC+  keyboard,
+	use=ncr260vt100pp,
+ncr160vt100wan|NCR 2900/160 VT100 wide mode ANSI keyboard,
+	use=ncr260vt100wan,
+ncr160vt100wpp|NCR 2900/160 VT100 wide mode PC+  keyboard,
+	use=ncr260vt100wpp,
+ncr160vt200an|NCR 2900/160 VT200 with ANSI keyboard,
+	use=ncr260vt200an,
+ncr160vt200pp|NCR 2900/160 VT200 with PC+  keyboard,
+	use=ncr260vt200pp,
+ncr160vt200wan|NCR 2900/160 VT200 wide mode ANSI keyboard,
+	use=ncr260vt200wan,
+ncr160vt200wpp|NCR 2900/160 VT200 wide mode PC+  keyboard,
+	use=ncr260vt200wpp,
+ncr160vt300an|NCR 2900/160 VT300 with ANSI keyboard,
+	use=ncr260vt300an,
+ncr160vt300pp|NCR 2900/160 VT300 with PC+ keyboard,
+	use=ncr260vt300pp,
+ncr160vt300wan|NCR 2900/160 VT300 wide mode ANSI keyboard,
+	use=ncr260vt300wan,
+ncr160vt300wpp|NCR 2900/160 VT300 wide mode PC+  keyboard,
+	use=ncr260vt300wpp,
+ncr160wy50+pp|NCR 2900/160 Wyse 50+,
+	use=ncr260wy50+pp,
+ncr160wy50+wpp|NCR 2900/160 Wyse 50+ wide mode,
+	use=ncr260wy50+wpp,
+ncr160wy60pp|NCR 2900/160 Wyse 60,
+	use=ncr260wy60pp,
+ncr160wy60wpp|NCR 2900/160 Wyse 60 wide mode,
+	use=ncr260wy60wpp,
+ncrvt100an|ncrvt100pp|NCR VT100 for the 2900 terminal,
+	am, hs, mc5i, mir, msgr, xon,
+	cols#80, it#8, lines#24, nlab#32,
+	acsc=``aaffgghhiijjkkllmmnnqqttuuvvwwxxyyzz~~,
+	bel=^G, blink=\E[5m$<30>, bold=\E[1m$<30>,
+	clear=\E[2J\E[1;1H$<300>, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr$<100>, cub=\E[%p1%dD$<30>,
+	cub1=\E[D$<2>, cud=\E[%p1%dB$<30>, cud1=\E[B$<2>,
+	cuf=\E[%p1%dC$<30>, cuf1=\E[C$<2>,
+	cup=\E[%i%p1%d;%p2%dH$<100>, cuu=\E[%p1%dA$<30>,
+	cuu1=\E[A$<2>, dch=\E[%p1%dP$<40>, dch1=\E[1P$<10>,
+	dl=\E[%p1%dM$<70>, dl1=\E[M$<40>, dsl=\E[31l$<25>,
+	ed=\E[0J$<300>, el=\E[0K$<30>, el1=\E[1K$<30>,
+	enacs=\E(B\E)0$<40>, fsl=1$<10>, home=\E[H$<2>$<80>,
+	ht=^I, hts=\EH, il=\E[%p1%dL$<80>, il1=\E[B\E[L$<80>,
+	ind=\ED,
+	is2=\E[12h\E[?10l\E%/0n\E[P\031\E[?3l\E(B\E)0$<200>,
+	kLFT=\E[D, kRIT=\E[C, ka1=\E[H, kbs=^H, kcub1=\E[D,
+	kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kent=\r, kf1=\EOP,
+	kf2=\EOQ, kf3=\EOR, kf4=\EOS, mc0=\E[i$<100>, nel=\EE,
+	rc=\E8, rev=\E[7m$<30>, ri=\EM$<50>, rmacs=\017$<90>,
+	rmir=\E[4l$<80>, rmso=\E[0m$<30>, rmul=\E[0m$<30>,
+	rs2=\Ec\E[12;31h\E[?3;4;5;10l\E[?6;7;19;25h\E[33;34l\E[0m\E(
+	    B\E)0\E%/0n\E[P\031$<200>,
+	sc=\E7,
+	sgr=%?%p9%t\016%e\017%;\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1
+	    %p3%|%t;7%;%?%p4%t;5%;m$<120>,
+	sgr0=\017\E[0m$<120>, smacs=\016$<90>, smir=\E[4h$<80>,
+	smso=\E[7m$<30>, smul=\E[4m$<30>, tbc=\E[3g$<40>,
+	tsl=\E[>+1$<70>, use=decid+cpr,
+ncrvt100wan|NCRVT100WPP|ncrvt100wpp|NCR VT100 emulation of the 2900 terminal,
+	cols#132,
+	is2=\E[12h\E[?10l\E%/0n\E[P\031\E[?3h\E(B\E)0$<200>,
+	rs2=\Ec\E[12;31h\E[?4;5;10l\E?3;6;7;19;25h\E[33;34l\E[0m\E(B
+	    \E)0\E%/0n\E[P\031$<200>,
+	use=ncrvt100an,
+#
+# Vendor-supplied NCR termcaps end here
+
+# NCR7900 DIP switches:
+#
+# Switch A:
+# 1-4 - Baud Rate
+# 5   - Parity (Odd/Even)
+# 6   - Don't Send or Do Send Spaces
+# 7   - Parity Enable
+# 8   - Stop Bits (One/Two)
+#
+# Switch B:
+# 1   - Upper/Lower Shift
+# 2   - Typewriter Shift
+# 3   - Half Duplex / Full Duplex
+# 4   - Light/Dark Background
+# 5-6 - Carriage Return Without / With Line Feed
+# 7   - Extended Mode
+# 8   - Suppress Keyboard Display
+#
+# Switch C:
+# 1   - End of line entry disabled/enabled
+# 2   - Conversational mode / (Local?) Mode
+# 3   - Control characters displayed / not displayed
+# 4   - (2-wire?) / 4-wire communications
+# 5   - RTS on and off for each character
+# 6   - (50Hz?) / 60 Hz
+# 7   - Exit after level zero diagnostics
+# 8   - RS-232 interface
+#
+# Switch D:
+# 1   - Reverse Channel (yes / no)
+# 2   - Manual answer (no / yes)
+# 3-4 - Cursor appearance
+# 5   - Communication Rate
+# 6   - Enable / Disable EXT turnoff
+# 7   - Enable / Disable CR turnoff
+# 8   - Enable / Disable backspace
+#
+# Since each attribute parameter is 0 or 1, we shift each attribute (standout,
+# reverse, blink, dim, and underline) the appropriate number of bits (by
+# multiplying the 0 or 1 by a correct factor to shift) so the bias character,
+# '@' is (effectively) "or"ed with each attribute to generate the proper third
+# character in the <ESC>0 sequence.  The <sgr> string implements the following
+# equation:
+#
+# ((((('@' + P5) | (P4 << 1)) | (P3 << 3)) | (P2 << 4)) | (p1 * 17))    =>
+# ((((('@' + P5) + (P4 << 1)) + (P3 << 3)) + (P2 << 4)) + (p1 * 17))
+#
+#	Where:  P1 <==> Standout attribute parameter
+#		P2 <==> Underline attribute parameter
+#		P3 <==> Reverse attribute parameter
+#		P4 <==> Blink attribute parameter
+#		P5 <==> Dim attribute parameter
+# From <root@goliath.un.atlantaga.NCR.COM>, init string hacked by SCO.
+ncr7900i|ncr7900|n7900|NCR 7900 model 1,
+	am, bw, ul,
+	cols#80, lines#24, xmc#1,
+	bel=^G, blink=\E0B, clear=^L, cr=\r, cub1=^H, cud1=\n, cuf1=^F,
+	cup=\E1%p2%c%p1%c, cuu1=^Z, dim=\E0A, ed=\Ek, el=\EK, ind=\n,
+	is2=\E0@\010\E3\E4\E7, kcub1=^U, kcud1=\n, kcuf1=^F,
+	kcuu1=^Z, khome=^A, ll=^A, mc4=^T, mc5=^R, rev=\E0P, rmso=\E0@,
+	rmul=\E0@,
+	sgr=\E0%p5%{64}%+%p4%{2}%*%+%p3%{16}%*%+%p2%{32}%*%+%p1%{17}
+	    %*%+%c,
+	sgr0=\E0@, smso=\E0Q, smul=\E0`,
+ncr7900iv|NCR 7900 model 4,
+	am, bw, eslok, hs,
+	cols#80, lines#24,
+	bel=^G, clear=^L, cr=\r, cub1=^H, cud1=\n,
+	cup=\013%p1%{64}%+%c\E\005%p2%02d, dl1=\E^O, dsl=\Ey1,
+	fsl=\Ek\Ey5, home=\013@\E^E00, il1=\E^N, ind=\n, kbs=^H,
+	kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, kf1=\ES, kf2=\ET,
+	kf3=\EU, kf4=\EV, kf5=\EW, kf6=\EP, kf7=\EQ, kf8=\ER,
+	khome=\EH, lf6=blue, lf7=red, lf8=white, nel=\r\n,
+	tsl=\Ej\Ex5\Ex1\EY8%p1%{32}%+%c\Eo,
+# Warning: This terminal will lock out the keyboard when it receives a CTRL-D.
+#	   The user can enter a CTRL-B to get out of this locked state.
+# In <hpa>, we want to output the character given by the formula:
+#		((col / 10) * 16) + (col % 10)		where "col" is "p1"
+ncr7901|NCR 7901 model,
+	am, bw, ul,
+	cols#80, lines#24,
+	bel=^G, blink=\E0B, civis=^W, clear=^L, cnorm=^X, cr=\r,
+	cub1=^H, cud1=\n, cuf1=^F,
+	cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=^Z, dim=\E0A,
+	ed=\Ek, el=\EK,
+	hpa=\020%p1%{10}%/%{16}%*%p1%{10}%m%+%c, ind=\n,
+	is2=\E4^O, kclr=^L, kcub1=^U, kcud1=\n, kcuf1=^F, kcuu1=^Z,
+	khome=^H, ll=^A, mc4=^T, mc5=^R, rev=\E0P, rmso=^O, rmul=^O,
+	sgr=\E0%p5%{64}%+%p4%{2}%*%+%p3%{16}%*%+%p2%{32}%*%+%p1%{17}
+	    %*%+%c\016,
+	sgr0=^O, smso=\E0Q\016, smul=\E0`\016,
+	vpa=\013%p1%{64}%+%c,
+
+# Newbury Data Recording Limited (Newbury Data)
+#
+# Have been manufacturing and reselling  various peripherals for a long time
+# They don't make terminals anymore, but are still in business (in 2007).
+# Their e-mail address is at ndsales@newburydata.co.uk
+# and their post address is:
+#
+# Newbury Data Recording Ltd,
+# Premier Park, Road One,
+# Winsford, Cheshire, CW7 3PT
+#
+# Their technical support is still good, they sent me for free a printed copy
+# of the 9500 user manual and I got it just 1 week after I first contacted them
+# (in 2005)!
+
+# NDR 9500
+# Manufactured in the early/mid eighties, behaves almost the same as a
+# TeleVideo 950.  Take a 950, change its cabinet for a more 80s-ish one (but
+# keep the same keyboard layout), add an optional 25-line mode, replace the DIP
+# switches with a menu and remove the "lock line" feature (ESC !  1 and ESC !
+# 2), here is the NDR 9500.  Even the line-lock, albeit disabled, is
+# recognized:  if you type in "ESC !", the next (third) character is not
+# echoed, showing that the terminal was actually waiting for a parameter!
+ndr9500|nd9500|Newbury Data 9500,
+	am, bw, hs, mc5i, mir, msgr, ul, xon,
+	cols#80, lines#24, wsl#79,
+	acsc=jDkClBmAnIqKtMuLvOwNxJ, bel=^G, cbt=\EI, civis=\E.0,
+	clear=\E;, cnorm=\E.1, cr=\r, cub1=^H, cud1=^V, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW,
+	dim=\E), dl1=\ER, dsl=\Eh, ed=\EY, el=\ET,
+	flash=\Eb$<50/>\Ed, fsl=\r, home=^^, ht=^I, hts=\E1,
+	ich1=\EQ, il1=\EE, ind=\n, is2=\Ew\E'\EDF\El\Er\EO,
+	kDC=\Er, kDL=\EO, kEOL=\Et, kIC=\Eq, kcbt=\EI, kclr=^Z,
+	kcub1=^H, kcud1=^V, kcuf1=^L, kcuu1=^K, kdch1=\EW, kdl1=\ER,
+	ked=\EY, kel=\ET, kent=\r, kf1=^A@\r, kf10=^AI\r, kf11=^AJ\r,
+	kf12=^A`\r, kf13=^Aa\r, kf14=^Ab\r, kf15=^Ac\r, kf16=^Ad\r,
+	kf17=^Ae\r, kf18=^Af\r, kf19=^Ag\r, kf2=^AA\r, kf20=^Ah\r,
+	kf21=^Ai\r, kf22=^Aj\r, kf3=^AB\r, kf4=^AC\r, kf5=^AD\r,
+	kf6=^AE\r, kf7=^AF\r, kf8=^AG\r, kf9=^AH\r, khome=^^,
+	kich1=\EQ, kil1=\EE, kprt=\EP, mc4=\Ea, mc5=\E`, nel=^_,
+	pfloc=\E|%{48}%p1%+%c2%p2%s\031,
+	pfx=\E|%{48}%p1%+%c1%p2%s\031, prot=\E), ri=\Ej,
+	rmacs=\E%%, rmir=\Er, rmso=\E(, rmxon=^N,
+	sgr=\EG0\E%%%%\E(%?%p1%p5%p8%|%|%t\E)%;%?%p9%t\E$%;,
+	sgr0=\EG0\E%%\E(, smacs=\E$, smir=\Eq, smso=\E), smxon=^O,
+	tbc=\E3, tsl=\Eg\Ef\011%p1%{32}%+%c, .kbs=^H,
+
+ndr9500-nl|NDR 9500 with no status line,
+	hs@,
+	wsl@,
+	dsl@, fsl@, tsl@, use=ndr9500,
+
+ndr9500-25|NDR 9500 with 25th line enabled,
+	lines#25, use=ndr9500,
+
+ndr9500-25-nl|NDR 9500 with 25 lines and no status line,
+	lines#25, use=ndr9500-nl,
+
+ndr9500-mc|NDR 9500 with magic cookies (enables underline inverse video invisible and blink),
+	msgr@,
+	xmc#1,
+	blink=\EG2, invis=\EG1, rev=\EG4, rmso=\EG0, rmul=\EG0,
+	sgr=\E%%\E(%?%p5%p8%|%t\E)%;%?%p9%t\E$%;\EG%{48}%?%p7%t%{1}
+	    %+%;%?%p4%t%{2}%+%;%?%p3%p1%|%t%{4}%+%;%?%p2%t%{8}%+%;%c,
+	sgr0=\EG0\E%%\E(, smso=\EG4, smul=\EG8, use=ndr9500,
+
+ndr9500-25-mc|NDR 500 with 25 lines and magic cookies,
+	lines#25, use=ndr9500-mc,
+
+ndr9500-mc-nl|NDR 9500 with magic cookies and no status line,
+	hs@,
+	wsl@,
+	dsl@, fsl@, tsl@, use=ndr9500-mc,
+
+ndr9500-25-mc-nl|NDR 9500 with 25 lines and magic cookies and no status line,
+	lines#25, use=ndr9500-mc-nl,
+
+#### Perkin-Elmer (Owl)
+#
+# These are official terminfo entries from within Perkin-Elmer.
+#
+
+bantam|pe550|pe6100|Perkin Elmer 550,
+	OTbs,
+	cols#80, lines#24,
+	bel=^G, clear=\EK$<20>, cr=\r, cub1=^H, cud1=\n, cuf1=\EC,
+	cup=\EX%p1%{32}%+%c\EY%p2%{32}%+%c, cuu1=\EA,
+	el=\EI$<20>, home=\EH, ind=\n, ll=\EH\EA,
+fox|pe1100|Perkin Elmer 1100,
+	OTbs, am,
+	cols#80, lines#24,
+	bel=^G, clear=\EH\EJ$<132>, cr=\r, cub1=^H, cud1=\n,
+	cuf1=\EC, cup=\EX%p1%{32}%+%c\EY%p2%{32}%+%c, cuu1=\EA,
+	ed=\EJ$<5.5*>, el=\EI, flash=\020\002$<200/>\020\003,
+	home=\EH, hts=\E1, ind=\n, ll=\EH\EA, tbc=\E3,
+owl|pe1200|Perkin Elmer 1200,
+	OTbs, am, in,
+	cols#80, lines#24,
+	bel=^G, clear=\EH\EJ$<132>, cr=\r, cub1=^H, cud1=\n,
+	cuf1=\EC, cup=\EX%p1%{32}%+%c\EY%p2%{32}%+%c, cuu1=\EA,
+	dch1=\EO$<5.5*>, dl1=\EM$<5.5*>, ed=\EJ$<5.5*>,
+	el=\EI$<5.5>, flash=\020\002$<200/>\020\003, home=\EH,
+	hts=\E1, ich1=\EN, il1=\EL$<5.5*>, ind=\n, ip=$<5.5*>,
+	kbs=^H, kf0=\ERJ, kf1=\ERA, kf2=\ERB, kf3=\ERC, kf4=\ERD,
+	kf5=\ERE, kf6=\ERF, kf7=\ERG, kf8=\ERH, kf9=\ERI, ll=\EH\EA,
+	rmso=\E!\0, sgr0=\E!\0, smso=\E!^H, tbc=\E3,
+pe1251|pe6300|pe6312|Perkin Elmer 1251,
+	am,
+	cols#80, it#8, lines#24, pb#300, vt#8, xmc#1,
+	bel=^G, clear=\EK$<332>, cr=\r, cub1=\ED, cud1=\EB, cuf1=\EC,
+	cup=\EX%p1%{32}%+%c\EY%p2%{32}%+%c, cuu1=\EA,
+	ed=\EJ$<20*>, el=\EI$<10*>, home=\EH, hts=\E1, ind=\n,
+	kf0=\ERA, kf1=\ERB, kf10=\ERK, kf2=\ERC, kf3=\ERD, kf4=\ERE,
+	kf5=\ERF, kf6=\ERG, kf7=\ERH, kf8=\ERI, kf9=\ERJ, tbc=\E3,
+# (pe7000m: this had
+#	rmul=\E!\0, smul=\E!\040,
+# which is probably wrong, it collides with kf0
+pe7000m|Perkin Elmer 7000 series monochrome monitor,
+	am,
+	cols#80, lines#24,
+	bel=^G, cbt=\E!Y, clear=\EK, cr=\r, cub1=\ED, cud1=\EB,
+	cuf1=\EC, cup=\ES%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA,
+	ed=\EJ, el=\EI, home=\EH, ind=\n,
+	is1=\E!\0\EW  7o\Egf\ES7\s, kbs=^H, kcub1=\E!V,
+	kcud1=\E!U, kcuf1=\E!W, kcuu1=\E!T, kf0=\E!\0, kf1=\E!^A,
+	kf10=\E!\n, kf2=\E!^B, kf3=\E!^C, kf4=\E!^D, kf5=\E!^E,
+	kf6=\E!^F, kf7=\E!^G, kf8=\E!^H, kf9=\E!^I, khome=\E!S,
+	ll=\ES7\s, ri=\ER,
+pe7000c|Perkin Elmer 7000 series colour monitor,
+	is1=\E!\0\EW  7o\Egf\Eb0\Ec7\ES7\s, rmso=\Eb0,
+	rmul=\E!\0, smso=\Eb2, smul=\E!\s, use=pe7000m,
+
+#### Sperry Univac
+#
+# Sperry Univac has merged with Burroughs to form Unisys.
+#
+
+# This entry is for the Sperry UTS30 terminal running the TTY
+# utility under control of CP/M Plus 1R1. The functionality
+# provided is comparable to the DEC VT100.
+# (uts30: I added <rmam>/<smam> based on the init string -- esr)
+uts30|Sperry UTS30 with cp/m@1R1,
+	am, bw, hs,
+	cols#80, lines#24, wsl#40,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[1m, civis=\ER, clear=^L,
+	cnorm=\ES, cr=\r, csr=\EU%p1%{32}%+%c%p2%{32}%+%c,
+	cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=\E[B,
+	cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH,
+	cuu=\E[%p1%dA, cuu1=\E[A, dch=\E[%p1%dP, dch1=\EM,
+	dl=\E[%p1%dM, dl1=\EL, ed=\E[J, el=\E[K, fsl=\r, home=\E[H,
+	ht=^I, ich=\E[%p1%d@, ich1=\EO, il=\E[%p1%dL, il1=\EN,
+	ind=\n, indn=\E[%p1%dB, is2=\E[U 7\E[24;1H, kbs=^H,
+	kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, khome=\E[H,
+	rc=\EX, rev=\E[7m, rf=/usr/share/tabset/vt100, ri=\EI,
+	rin=\E[%p1%dA, rmacs=\Ed, rmam=\E[?7l, rmso=\E[m,
+	rmul=\E[m, rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h,
+	sc=\EW, sgr0=\E[m, smacs=\EF, smam=\E[?7m, smso=\E[7m,
+	smul=\E[4m, tsl=\E], uc=\EPB,
+
+#### Tandem
+#
+# Tandem builds these things for use with its line of fault-tolerant
+# transaction-processing computers.  They aren't generally available
+# on the merchant market, and so are fairly uncommon.
+#
+
+tandem6510|adm3a repackaged by Tandem,
+	use=adm3a,
+
+# A funny series of terminal that TANDEM uses.  The actual model numbers
+# have a fourth digit after 653 that designates minor variants.  These are
+# natively block-mode and rather ugly, but they have a character mode which
+# this doubtless(?) exploits.  There is a 6520 that is slightly dumber.
+# (tandem653: had ":sb=\ES:", probably someone's mistake for sf; also,
+# removed <if=/usr/share/tabset/tandem653>, no such file -- esr)
+tandem653|t653x|Tandem 653x multipage terminal,
+	OTbs, am, da, db, hs,
+	cols#80, lines#24, wsl#64, xmc#1,
+	clear=\EI, cub1=^H, cud1=\n, cuf1=\EC,
+	cup=\023%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, dsl=\Eo\r,
+	ed=\EJ, el=\EK, fsl=\r, home=\EH, ind=\ES, ri=\ET, rmso=\E6\s,
+	rmul=\E6\s, sgr0=\E6\s, smso=\E6$, smul=\E60, tsl=\Eo,
+
+#### Tandy/Radio Shack
+#
+# Tandy has a line of VDTs distinct from its microcomputers.
+#
+
+dmterm|deskmate terminal,
+	am, bw,
+	cols#80, lines#24,
+	bel=^G, civis=\EG5, clear=\Ej, cnorm=\EG6, cr=\r, cub1=^H,
+	cud1=\EB, cuf1=\EC, cup=\EY%p1%{32}%+%c%p2%{32}%+%c,
+	cuu1=\EA, dch1=\ES, dl1=\ER, ed=\EJ, el=\EK, home=\EH, ht=^I,
+	ich1=\EQ, il1=\EP, ind=\EX, invis@, kcub1=\ED, kcud1=\EB,
+	kcuf1=\EC, kcuu1=\EA, kf0=\E1, kf1=\E2, kf2=\E3, kf3=\E4,
+	kf4=\E5, kf5=\E6, kf6=\E7, kf7=\E8, kf8=\E9, kf9=\E0,
+	khome=\EH, lf0=f1, lf1=f2, lf2=f3, lf3=f4, lf4=f5, lf5=f6,
+	lf6=f7, lf7=f8, lf8=f9, lf9=f10, ll=\EE, rmul@, smul@,
+	use=adm+sgr,
+dt100|dt-100|Tandy DT-100 terminal,
+	xon,
+	cols#80, lines#24, xmc#1,
+	acsc=jjkkllmmnnqqttuuvvwwxx, bel=^G, clear=\E[H\E[2J,
+	cr=\r, csr=\E[%p1%2d;%p2%2dr, cub1=^H, cud1=\E[B,
+	cuf1=\E[C, cup=\010\E[%i%p1%d;%p2%dH, cuu1=\E[A,
+	dch1=\E[P, dl1=\E[M, ed=\E[J, el=\E[K, home=\E[H, ht=^I,
+	ich1=\E[@, il1=\E[L, ind=\n, is2=\E[?3l\E)0\E(B,
+	kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kf1=\E[?3i,
+	kf10=\E[?5i, kf2=\E[2i, kf3=\E[@, kf4=\E[M, kf5=\E[17~,
+	kf6=\E[18~, kf7=\E[19~, kf8=\E[20~, kf9=\E[21~, khome=\E[H,
+	knp=\E[29~, kpp=\E[28~, lf1=f1, lf2=f2, lf3=f3, lf4=f4, lf5=f5,
+	lf6=f6, lf7=f7, lf8=f8, ri=\EM, rmacs=^O, rmso=\E[m, rmul=\E[m,
+	sgr0=\E[m, smacs=^N, smso=\E[7m, smul=\E[4m,
+	use=vt220+cvis,
+dt100w|dt-100w|Tandy DT-100 terminal (wide mode),
+	cols#132, use=dt100,
+dt110|Tandy DT-110 emulating ANSI,
+	xon,
+	cols#80, lines#24,
+	acsc=jjkkllmmnnqqttuuvvwwxx, bel=^G, clear=\E[H\E[2J,
+	cr=\r, csr=\E[%i%p1%d;%p2%dr, cub1=^H, cud1=\E[B,
+	cuf1=\E[C, cup=\010\E[%i%p1%d;%p2%dH, cuu1=\E[A,
+	dch1=\E[0P, dl1=\E[0M, ed=\E[0J, el=\E[0K, enacs=\E(B\E)0,
+	home=\E[H, ht=^I, ich1=\E[0@, il1=\E[0L, ind=\n,
+	is2=\E[?3l\E)0\E(B, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C,
+	kcuu1=\E[A, kend=\E[K, kf1=\E[1~, kf10=\E[10~, kf2=\E[2~,
+	kf3=\E[3~, kf4=\E[4~, kf5=\E[5~, kf6=\E[6~, kf7=\E[7~,
+	kf8=\E[8~, kf9=\E[9~, khome=\E[G, kich1=\E[@, knp=\E[26~,
+	kpp=\E[25~, lf0=f1, lf1=f2, lf2=f3, lf3=f4, lf4=f5, lf5=f6,
+	lf6=f7, lf7=f8, lf8=f9, lf9=f10, ri=\EM, rmacs=^O, rmso=\E[m,
+	rmul=\E[m, sgr0=\E[m, smacs=^N, smso=\E[7m, smul=\E[4m,
+	use=vt220+cvis,
+pt210|TRS-80 PT-210 printing terminal,
+	hc, os,
+	cols#80,
+	bel=^G, cr=\r, cud1=\n, ind=\n,
+
+#### Tektronix (tek)
+#
+# Tektronix tubes are graphics terminals.  Most of them use modified
+# oscilloscope technology incorporating a long-persistence green phosphor,
+# and support vector graphics on a main screen with an attached "dialogue
+# area" for interactive text.
+#
+
+tek|tek4012|Tektronix 4012,
+	OTbs, os,
+	cols#75, lines#35,
+	bel=^G, clear=\E\014$<1000>, cr=\r, cub1=^H, cud1=\n,
+	ff=\014$<1000>, is2=\E^O,
+# (tek4013: added <acsc> to suppress tic warnings re <smacs>/<rmacs> --esr)
+tek4013|Tektronix 4013,
+	acsc=, rmacs=\E^O, smacs=\E^N, use=tek4012,
+tek4014|Tektronix 4014,
+	cols#81, lines#38,
+	is2=\E\017\E9, use=tek4012,
+# (tek4015: added <acsc> to suppress tic warnings re <smacs>/<rmacs> --esr)
+tek4015|Tektronix 4015,
+	acsc=, rmacs=\E^O, smacs=\E^N, use=tek4014,
+tek4014-sm|Tektronix 4014 in small font,
+	cols#121, lines#58,
+	is2=\E\017\E:, use=tek4014,
+# (tek4015-sm: added <acsc> to suppress tic warnings re <smacs>/<rmacs> --esr)
+tek4015-sm|Tektronix 4015 in small font,
+	acsc=, rmacs=\E^O, smacs=\E^N, use=tek4014-sm,
+# Tektronix 4023 from Andrew Klossner <orca!andrew.tektronix@csnet-relay>
+#
+# You need to have "stty nl2" in effect.  Some versions of tset(1) know
+# how to set it for you.
+#
+# It's got the Magic Cookie problem around stand-out mode.  If you can't
+# live with Magic Cookie, remove the :so: and :se: fields and do without
+# reverse video.  If you like reverse video stand-out mode but don't want
+# it to flash, change the letter 'H' to 'P' in the :so: field.
+tek4023|Tektronix 4023,
+	OTbs, am,
+	OTdN#4, cols#80, lines#24, vt#4, xmc#1,
+	OTnl=\n, bel=^G, clear=\E\014$<4/>, cr=\r, cub1=^H, cud1=\n,
+	cuf1=^I, cup=\034%p2%{32}%+%c%p1%{32}%+%c, kbs=^H,
+	rmso=^_@, smso=^_P,
+# It is recommended that you run the 4025 at 4800 baud or less;
+# various bugs in the terminal appear at 9600.  It wedges at the
+# bottom of memory (try "cat /usr/dict/words"); ^S and ^Q typed
+# on keyboard don't work.  You have to hit BREAK twice to get
+# one break at any speed - this is a documented feature.
+# Can't use cursor motion because it's memory relative, and
+# because it only works in the workspace, not the monitor.
+# Same for home. Likewise, standout only works in the workspace.
+#
+# <el> was commented out since vi and rogue seem to work better
+# simulating it with lots of spaces!
+#
+# <il1> and <il> had 145ms of padding, but that slowed down vi's ^U
+# and didn't seem necessary.
+#
+tek4024|tek4025|tek4027|Tektronix 4024/4025/4027,
+	OTbs, am, da, db,
+	cols#80, it#8, lines#34, lm#0,
+	bel=^G, clear=\037era\r\n\n, cmdch=^_, cr=\r,
+	cub=\037lef %p1%d\r, cub1=^H, cud=\037dow %p1%d\r,
+	cud1=^F\n, cuf=\037rig %p1%d\r, cuf1=\037rig\r,
+	cuu=\037up %p1%d\r, cuu1=^K, dch1=\037dch\r,
+	dl=\037dli %p1%d\r\006, dl1=\037dli\r\006,
+	ed=\037dli 50\r, ht=^I, ich1=\037ich\r \010,
+	il=\037up\r\037ili %p1%d\r, il1=\037up\r\037ili\r,
+	ind=^F\n,
+	is2=!com 31\r\n\037sto 9 17 25 33 41 49 57 65 73\r,
+	rmkx=\037lea\sp2\r\037lea\sp4\r\037lea\sp6\r\037lea\sp8\r
+	     \037lea\sf5\r,
+	smkx=\037lea\sp4\s/h/\r\037lea\sp8\s/k/\r\037lea\sp6\s/\s/
+	     \r\037lea\sp2\s/j/\r\037lea\sf5\s/H/\r,
+tek4025-17|Tektronix 4025 17 line window,
+	lines#17, use=tek4025,
+tek4025-17-ws|Tektronix 4025 17 line window in workspace,
+	is2=!com\s31\r\n\037sto\s9\s17\s25\s33\s41\s49\s57\s65\s73
+	    \r\037wor\s17\r\037mon\s17\r,
+	rmcup=\037mon h\r, rmso=\037att s\r, smcup=\037wor h\r,
+	smso=\037att e\r, use=tek4025-17,
+tek4025-ex|tek4027-ex|Tektronix 4025/4027 w/!,
+	is2=\037com 33\r\n!sto 9 17 25 33 41 49 57 65 73\r,
+	rmcup=\037com 33\r, smcup=!com 31\r, use=tek4025,
+# Tektronix 4025a
+# From: Doug Gwyn <gwyn@brl-smoke.ARPA>
+# The following status modes are assumed for normal operation (replace the
+# initial "!" by whatever the current command character is):
+#	!COM 29			# NOTE: changes command character to GS (^])
+#	^]DUP
+#	^]ECH R
+#	^]EOL
+#	^]RSS T
+#	^]SNO N
+#	^]STO 9 17 25 33 41 49 57 65 73
+# Other modes may be set according to communication requirements.
+# If the command character is inadvertently changed, termcap can't restore it.
+# Insert-character cannot be made to work on both top and bottom rows.
+# Clear-to-end-of-display emulation via !DLI 988 is too grotty to use, alas.
+# There also seems to be a problem with vertical motion, perhaps involving
+# delete/insert-line, following a typed carriage return.  This terminal sucks.
+# Delays not specified; use "stty ixon -ixany" to enable DC3/DC1 flow control!
+# (tek4025a: removed obsolete ":xx:". This may mean the tek4025a entry won't
+# work any more. -- esr)
+tek4025a|Tektronix 4025A,
+	OTbs, OTpt, am, bw, da, db, xon,
+	cols#80, it#8, lines#34,
+	bel=^G, cbt=\035bac;, clear=\035era;\n\035rup;, cmdch=^],
+	cr=\r, cub=\035lef %p1%d;, cub1=^H, cud=\035dow %p1%d;,
+	cud1=\n, cuf=\035rig %p1%d;, cuf1=\035rig;,
+	cuu=\035up %p1%d;, cuu1=^K, dch=\035dch %p1%d;,
+	dch1=\035dch;, dl=\035dli %p1%d;, dl1=\035dli;,
+	el=\035dch 80;, hpa=\r\035rig %p1%d;, ht=^I,
+	il1=\013\035ili;, ind=\n, indn=\035dow %p1%d;,
+	rs2=!com\s29\035del\s0\035rss\st\035buf\035buf\sn\035cle
+	    \035dis\035dup\035ech\sr\035eol\035era\sg\035for\sn
+	    \035pad\s203\035pad\s209\035sno\sn\035sto\s9\s17\s25
+	    \s33\s41\s49\s57\s65\s73\035wor\s0;,
+	tbc=\035sto;,
+# From: cbosg!teklabs!davem Wed Sep 16 21:11:41 1981
+# Here's the command file that I use to get rogue to work on the 4025.
+# It should work with any program using the old curses (e.g. it better
+# not try to scroll, or cursor addressing won't work.  Also, you can't
+# see the cursor.)
+# (This "learns" the arrow keys for rogue. I have adapted it for termcap - mrh)
+tek4025-cr|Tektronix 4025 for curses and rogue,
+	OTbs, am,
+	cols#80, it#8, lines#33,
+	clear=\037era;, cub1=^H, cud1=^F\n, cuf1=\037rig;,
+	cup=\037jum%i%p1%d\,%p2%d;, cuu1=^K, ht=^I, ind=^F\n,
+	is2=!com 31\r\n\037sto 9 17 25 33 41 49 57 65 73\r,
+	rmcup=\037wor 0, smcup=\037wor 33h,
+# next two lines commented out since curses only allows 128 chars, sigh.
+#	:ti=\037lea p1/b/\037lea p2/j/\037lea p3/n/\037lea p4/h/\037lea p5/ /\037lea p6/l/\037lea p7/y/\037lea p8/k/\037lea p9/u/\037lea p./f/\037lea pt/`era w/13\037lea p0/s/\037wor 33h:\
+#	:te=\037lea p1\037lea p2\037lea p3\037lea p4\037lea pt\037lea p5\037lea p6\037lea p7\037lea p8\037lea p9/la/13\037lea p.\037lea p0\037wor 0:
+tek4025ex|4025ex|4027ex|Tektronix 4025 w/!,
+	is2=\037com\s33\r\n!sto\s9\,17\,25\,33\,41\,49\,57\,65\,73
+	    \r,
+	rmcup=\037com 33\r, smcup=!com 31\r, use=tek4025,
+tek4105|Tektronix 4105,
+	OTbs, am, mir, msgr, ul, xenl, xt,
+	cols#79, it#8, lines#29,
+	acsc=, bel=^G, blink=\E[=3;<7m, bold=\E[=7;<4m, cbt=\E[Z,
+	clear=\E[2J\E[H, cr=\r, cub1=\E[1D, cud1=\E[1B, cuf1=\E[1C,
+	cup=\E[%i%p1%2d;%p2%2dH, cuu1=\E[1A, dch1=\E[1P,
+	dim=\E[=1;<6m, dl1=\E[1M, ed=\E[J, el=\E[K, home=\E[H, ht=^I,
+	il1=\E[1L, ind=\E[S, invis=\E[=6;<5, is1=\E%!1\E[m,
+	is2=\E%!1\E[?6141\E[m, kbs=^H, kcub1=\E[1D, kcud1=\E[1B,
+	kcuf1=\E[1C, kcuu1=\E[1A, rev=\E[=1;<3m, ri=\E[T,
+	rmacs=\E[m, rmcup=, rmir=\E[4l, rmso=\E[=0;<1m,
+	rmul=\E[=0;<1m, sgr0=\E[=0;<1m, smacs=\E[1m,
+	smcup=\E%!1\E[?6l\E[2J, smir=\E[4h, smso=\E[=2;<3m,
+	smul=\E[=5;<2m, tbc=\E[1g,
+
+# (tek4105-30: I added <rmam>/<smam> based on the init string -- esr)
+tek4105-30|Tektronix 4015 emulating 30 line VT100,
+	am, mir, msgr, xenl, xon,
+	cols#80, it#8, lines#30, vt#3,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\E[5m$<2>, bold=\E[1m$<2>,
+	clear=\E[H\E[J$<50>, cr=\r, csr=\E[%i%p1%d;%p2%dr,
+	cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=\n,
+	cuf=\E[%p1%dC, cuf1=\E[C$<2>,
+	cup=\E[%i%p1%d;%p2%dH$<5>, cuu=\E[%p1%dA,
+	cuu1=\E[A$<2>, ed=\E[J$<50>, el=\E[K$<3>, el1=\E[1K$<3>,
+	enacs=\E(B\E)0, home=\E[H, ht=^I, hts=\EH, ind=\n, kbs=^H,
+	kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, rc=\E8,
+	rev=\E[7m$<2>, ri=\EM$<5>, rmacs=^O, rmam=\E[?7l,
+	rmkx=\E[?1l\E>, rmso=\E[m$<2>, rmul=\E[m$<2>,
+	rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, sc=\E7,
+	sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5
+	    %;m%?%p9%t\016%e\017%;$<2>,
+	sgr0=\E[m\017$<2>, smacs=^N, smam=\E[?7h, smkx=\E[?1h\E=,
+	smso=\E[1;7m$<2>, smul=\E[4m$<2>, tbc=\E[3g,
+	use=vt100+fnkeys,
+
+# Tektronix 4105 from BRL
+# The following setup modes are assumed for normal operation:
+#	CODE ansi		CRLF no			DABUFFER 141
+#	DAENABLE yes		DALINES 30		DAMODE replace
+#	DAVISIBILITY yes	ECHO no			EDITMARGINS 1 30
+#	FLAGGING input		INSERTREPLACE replace	LFCR no
+#	ORIGINMODE relative	PROMPTMODE no		SELECTCHARSET G0 B
+#	SELECTCHARSET G1 0	TABS -2
+# Other setup modes may be set for operator convenience or communication
+# requirements; I recommend
+#	ACURSOR 1 0		AUTOREPEAT yes		AUTOWRAP yes
+#	BYPASSCANCEL <LF>	CURSORKEYMODE no	DAINDEX 1 0 0
+#	EOFSTRING ''		EOLSTRING <CR>		EOMCHARS <CR> <NU>
+#	GAMODE overstrike	GCURSOR 0 100 0		GSPEED 10 1
+#	IGNOREDEL no		KEYEXCHAR <DL>		NVDEFINE -53 "<NU>"
+#	PROMPTSTRING ''		QUEUESIZE 2460		WINDOW 0 0 4095 3132
+#	XMTDELAY 0
+# and factory color maps.  After setting these modes, save them with NVSAVE. No
+# delays are specified; use "stty ixon -ixany" to enable DC3/DC1 flow control!
+# "IC" cannot be used in combination with "im" & "ei".
+# "tek4105a" is just a guess:
+tek4105a|Tektronix 4105 (BRL),
+	OTbs, OTpt, msgr, xon,
+	OTkn#8, cols#80, it#8, lines#30, vt#3,
+	acsc=, bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z,
+	civis=\E%!0\ETD00\E%!1, clear=\E[H\E[J,
+	cnorm=\E%!0\ETD10\E%!1, cr=\r, csr=\E[%i%p1%d;%p2%dr,
+	cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=\n,
+	cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH,
+	cuu=\E[%p1%dA, cuu1=\EM, cvvis=\E%!0\ETD70\E%!1,
+	dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M,
+	ech=\E[%p1%dX, ed=\E[J, el=\E[K, home=\E[H, ht=^I, hts=\EH,
+	il=\E[%p1%dL, il1=\E[L, ind=\n, is2=\E%!1, kbs=^H,
+	kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kf0=\EOA,
+	kf1=\EOB, kf2=\EOC, kf3=\EOD, kf4=\EOP, kf5=\EOQ, kf6=\EOR,
+	kf7=\EOS, lf0=F1, lf1=F2, lf2=F3, lf3=F4, lf4=F5, lf5=F6, lf6=F8,
+	ll=\E[30;H, nel=\EE, rc=\E8, rev=\E[7m, ri=\EM, rmacs=^O,
+	rmcup=\E%!0\ELBH=\E%!1, rmir=\E[4l, rmkx=\E[?1l\E>,
+	rmso=\E[m, rmul=\E[m,
+	rs2=\030\E%!0\EKC\E\014\EKR0\EKF0\ENM0\ELBH=\ETF8000010F40
+	    \ELI100\ELLA>\ELM0\EKE0\ENF1\EKS0\END0\E%!1\Ec\E[?3;5l
+	    \E[?7;8h\E[r\E[m\E>,
+	sc=\E7, sgr0=\E[m, smacs=^N, smcup=\E[?6l, smir=\E[4h,
+	smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m, tbc=\E[3g,
+	use=ecma+index,
+
+#
+# Tektronix 4106/4107/4109 from BRL
+# The following setup modes are assumed for normal operation:
+#	CODE ansi		COLUMNMODE 80		CRLF no
+#	DABUFFER 141		DAENABLE yes		DALINES 32
+#	DAMODE replace		DAVISIBILITY yes	ECHO no
+#	EDITMARGINS 1 32	FLAGGING input		INSERTREPLACE replace
+#	LFCR no			LOCKKEYBOARD no		ORIGINMODE relative
+#	PROMPTMODE no		SELECTCHARSET G0 B	SELECTCHARSET G1 0
+#	TABS -2
+# Other setup modes may be set for operator convenience or communication
+# requirements; I recommend
+#	ACURSOR 1 0		AUTOREPEAT yes		AUTOWRAP yes
+#	BYPASSCANCEL <LF>	CURSORKEYMODE no	DAINDEX 1 0 0
+#	EOFSTRING ''		EOLSTRING <CR>		EOMCHARS <CR> <NU>
+#	GAMODE overstrike	GCURSOR 0 100 0		GSPEED 9 3
+#	IGNOREDEL no		KEYEXCHAR <DL>		NVDEFINE -53 "<NU>"
+#	PROMPTSTRING ''		QUEUESIZE 2620		WINDOW 0 0 4095 3132
+#	XMTDELAY 0
+# and factory color maps.  After setting these modes, save them with NVSAVE.  No
+# delays are specified; use "stty ixon -ixany" to enable DC3/DC1 flow control!
+# "IC" cannot be used in combination with "im" & "ei".
+tek4106brl|tek4107brl|tek4109brl|Tektronix 4106 4107 or 4109,
+	msgr, xon,
+	cols#80, it#8, lines#32, vt#3,
+	acsc=, bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z,
+	civis=\E%!0\ETD00\E%!1, clear=\E[H\E[J,
+	cnorm=\E%!0\ETD10\E%!1, cr=\r, csr=\E[%i%p1%d;%p2%dr,
+	cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=\n,
+	cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH,
+	cuu=\E[%p1%dA, cuu1=\EM, cvvis=\E%!0\ETD70\E%!1,
+	dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M,
+	ech=\E[%p1%dX, ed=\E[J, el=\E[K, home=\E[H, ht=^I, hts=\EH,
+	il=\E[%p1%dL, il1=\E[L, ind=\n, is2=\E%!1, kbs=^H,
+	kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kf0=\EOA,
+	kf1=\EOB, kf2=\EOC, kf3=\EOD, kf4=\EOP, kf5=\EOQ, kf6=\EOR,
+	kf7=\EOS, lf0=F1, lf1=F2, lf2=F3, lf3=F4, lf4=F5, lf5=F6, lf6=F8,
+	ll=\E[32;H, nel=\EE, rc=\E8, rev=\E[7m, ri=\EM, rmacs=^O,
+	rmcup=\E%!0\ELBH=\E%!1, rmir=\E[4l, rmkx=\E[?1l\E>,
+	rmso=\E[m, rmul=\E[m,
+	rs1=\030\E%!0\EKC\E\014\EKR0\EKF0\ENM0\ELBH=\ETF8000010F40
+	    \ELI100\ELLB0\ELM0\EKE0\ENF1\EKS0\END0\ERE0\E%!1\Ec\E[?3
+	    ;5l\E[?7;8h\E[r\E[m\E>,
+	sc=\E7, sgr0=\E[m, smacs=^N, smcup=\E[?6l, smir=\E[4h,
+	smkx=\E[?1h\E=, smso=\E[7;42m, smul=\E[4m, tbc=\E[3g,
+	use=ecma+index,
+
+# Refer to:
+# TEK Programmer's Reference
+# Part No. 070-4893-00
+# Product Group 18
+# 4107/4109 Computer Display Terminal
+# November 1983
+#
+# Tektronix 4107/4109 interpret 4 modes using "\E%!" followed by a code:
+# 0 selects Tek mode, i.e., \E%!0
+# 1 selects ANSI mode
+# 2 selects ANSI edit-mode
+# 3 selects VT52 mode
+#
+# One odd thing about the description (which has been unchanged since the 90s)
+# is that the cursor addressing is using VT52 mode, and a few others use the
+# VT52's non-CSI versions of ANSI, e.g., \EJ.  A possible explanation is that
+# the developer used Emacs, which misuses cvvis (this description sets VT52
+# mode in that capability).
+tek4107|tek4109|Tektronix terminals 4107 4109,
+	OTbs, am, mir, msgr, ul, xenl, xt,
+	cols#79, it#8, lines#29,
+	bel=^G, blink=\E%!1\E[5m$<2>\E%!0,
+	bold=\E%!1\E[1m$<2>\E%!0, clear=\ELZ, cnorm=\E%!0, cr=\r,
+	cub1=^H, cud1=\n, cuf1=\EC,
+	cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, cvvis=\E%!3,
+	dim=\E%!1\E[<0m$<2>\E%!0, ed=\EJ, el=\EK, ht=^I, ind=\n,
+	kbs=^H, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA,
+	rev=\E%!1\E[7m$<2>\E%!0, ri=\EI,
+	rmso=\E%!1\E[m$<2>\E%!0, rmul=\E%!1\E[m$<2>\E%!0,
+	sgr=\E%%!1\E[%?%p1%t;7;5%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;
+	    %?%p5%t<0%;%?%p6%t;1%;m$<2>\E%%!0,
+	sgr0=\E%!1\E[m$<2>\E%!0, smso=\E%!1\E[7;5m$<2>\E%!0,
+	smul=\E%!1\E[4m$<2>\E%!0,
+# Tektronix 4207 with sysline.  In the ancestral termcap file this was 4107-s;
+# see the note attached to tek4207.
+tek4207-s|Tektronix 4207 with sysline but no memory,
+	eslok, hs,
+	dsl=\E7\E[?6l\E[2K\E[?6h\E8, fsl=\E[?6h\E8,
+	is1=\E%!1\E[2;32r\E[132D\E[2g\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[8
+	    C\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[J,
+	is2=\E7\E[?6l\E[2K\E[?6h\E8,
+	tsl=\E7\E[?6l\E[2K\E[;%i%df, use=tek4107,
+
+# The 4110 series may be a wonderful graphics series, but they make the 4025
+# look good for screen editing.  In the dialog area, you can't move the cursor
+# off the bottom line.  Out of the dialog area, ^K moves it up, but there
+# is no way to scroll.
+#
+# Note that there is a floppy for free from Tek that makes the
+# 4112 emulate the VT52 (use the VT52 termcap). There is also
+# an expected enhancement that will use ANSI standard sequences.
+#
+# 4112 in non-dialog area pretending to scroll. It really wraps
+# but vi is said to work (more or less) in this mode.
+#
+# 'vi' works reasonably well with this entry.
+#
+otek4112|o4112-nd|otek4113|otek4114|Tektronix 4110 series (old),
+	am,
+	cols#80, lines#34,
+	bel=^G, clear=\E^L, cr=\r, cub1=^H, cud1=\n, cuu1=^K, ind=\n,
+	rmcup=\EKA1\ELV1, smcup=\EKA0\ELV0\EMG0,
+# The 4112 with the ANSI compatibility enhancement
+tek4112|tek4114|Tektronix 4110 series,
+	OTbs, am, db,
+	cols#80, lines#34,
+	cbt=\E[Z, clear=\E[2J\E[0;0H, cub1=^H, cud1=\E[B,
+	cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, cuu1=\EM, dch1=\E[P,
+	dl1=\E[M, ed=\E[0J, el=\E[0K, ich1=\E[@, il1=\E[L,
+	ind=\E7\E[0;0H\E[M\E8, is2=\E3!1, ri=\E7\E[0;0H\E[L\E8,
+	rmso=\E[m, rmul=\E[m, sgr0=\E[m, smso=\E[7m, smul=\E[4m,
+tek4112-nd|Tektronix 4112 not in dialog area,
+	OTns,
+	cuu1=^K, use=tek4112,
+tek4112-5|Tektronix 4112 in 5 line dialog area,
+	lines#5, use=tek4112,
+# (tek4113: this used to have "<cuf1=\LM1\s\LM0>", someone's mistake;
+# removed "<smacs=\E^N>, <rmacs=\E^O>", which had been commented out in 8.3.
+# Note, the !0 and !1 sequences in <rmcup>/<smcup>/<cnorm>/<civis> were
+# previously \0410 and \0411 sequences...I don't *think* they were supposed
+# to be 4-digit octal -- esr)
+tek4113|Tektronix 4113 color graphics with 5 line dialog area,
+	OTbs, am, da, eo,
+	cols#80, lines#5,
+	clear=\ELZ, cub1=^H, cud1=\n, cuf1=\ELM1 \ELM0,
+	flash=\ERBA4\ERBA4\ERBA4\ERBA4\ERBA4\ERBA4\ERBA4\ERBA4
+	      \ERBA4\ERBA4\ERB0,
+	is2=\EKA1\ELL5\ELV0\ELV1, uc=\010\ELM1_\ELM0,
+tek4113-34|Tektronix 4113 color graphics with 34 line dialog area,
+	lines#34,
+	is2=\EKA1\ELLB2\ELV0\ELV1, use=tek4113,
+# :ns: left off to allow vi visual mode. APL font (:as=\E^N:/:ae=\E^O:) not
+# supported here. :uc: is slow, but looks nice. Suggest setenv MORE -up .
+# :vb: needs enough delay to let you see the background color being toggled.
+tek4113-nd|Tektronix 4113 color graphics with no dialog area,
+	OTbs, am, eo,
+	cols#80, it#8, lines#34,
+	clear=\E^L, cub1=^H, cud1=\n, cuf1=^I, cuu1=^K,
+	cvvis=\ELZ\EKA0,
+	flash=\ERBA4\ERBA4\ERBA4\ERBA4\ERBA4\ERBA4\ERBA4\ERBA4
+	      \ERBA4\ERBA4\ERB0,
+	home=\ELF7l\177 @, ht=^I, is2=\ELZ\EKA0\ELF7l\177 @,
+	ll=\ELF hl @, rmso=\EMT1, smso=\EMT2, uc=\010\EMG1_\EMG0,
+# This entry is from Tek. Inc.  (Brian Biehl)
+# (tek4115: :bc: renamed to :le:, <rmam>/<smam> added based on init string -- esr)
+otek4115|Tektronix 4115 (old),
+	OTbs, am, da, db, eo,
+	cols#80, it#8, lines#34,
+	cbt=\E[Z, clear=\E[H\E[2J,
+	cnorm=\E%!0\ELBG8\E%!1\E[34;1H, cub1=\E[D, cud1=\E[B,
+	cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A,
+	cvvis=\E%!0\ELBB2\E%!1, dch1=\E[P, dl1=\E[M, ed=\E[J,
+	el=\E[K, home=\E[H, ht=^I, if=/usr/share/tabset/vt100,
+	il1=\E[L,
+	is2=\E%!0\E%\014\ELV0\EKA1\ELBB2\ENU@=\ELLB2\ELM0\ELV1\EKYA?
+	    \E%!1\E[<1l\E[?7h\E[?8h\E[34;1H\E[34B\E[m,
+	kbs=^H, ri=\EM, rmam=\E[?7l,
+	rmcup=\E%!0\ELBG8\E%!1\E[34;1H\E[J, rmir=\E[4l,
+	rmkx=\E>, rmso=\E[m, rmul=\E[m, sgr0=\E[m, smam=\E[?7h,
+	smcup=\E%!0\ELBB2\E%!1, smir=\E[4h, smkx=\E=, smso=\E[7m,
+	smul=\E[4m,
+tek4115|Tektronix 4115 entry with more ANSI capabilities (new),
+	am, xon,
+	cols#80, lines#34,
+	bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, clear=\E[H\E[J,
+	cr=\r, cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=\n,
+	cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH,
+	cuu=\E[%p1%dA, cuu1=\E[A, dch1=\E[P, dl=\E[%p1%dM,
+	dl1=\E[M, ed=\E[J, el=\E[K, home=\E[H, hpa=\E[%p1%{1}%+%dG,
+	ht=^I, hts=\EH, ich=\E[%p1%d@, ich1=\E[@, il=\E[%p1%dL,
+	il1=\E[L, ind=\n, invis=\E[8m, kbs=^H, kcub1=\E[D,
+	kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, khome=\E[H, rev=\E[7m,
+	rmam=\E[?7l, rmso=\E[m, rmul=\E[m,
+	sgr=\E[%?%p1%t7;%;%?%p2%t4;%;%?%p3%t7;%;%?%p4%t5;%;%?%p6%t1;
+	    %;%?%p7%t8;%;m,
+	sgr0=\E[m, smam=\E[?7h, smso=\E[7m, smul=\E[4m, tbc=\E[3g,
+	vpa=\E[%p1%{1}%+%dd, use=ansi+rep,
+# The tek4125 emulates a VT100 incorrectly - the scrolling region
+# command is ignored.  The following entry replaces <csr> with the needed
+# <il>, <il>, and <smir>; removes some cursor pad commands that the tek4125
+# chokes on; and adds a lot of initialization for the Tektronix dialog area.
+# Note that this entry uses all 34 lines and sets the cursor color to green.
+# Steve Jacobson 8/85
+# (tek4125: there were two "\!"s in the is that I replaced with "\E!";
+# commented out, <smir>=\E1 because there's no <rmir>  -- esr)
+tek4125|Tektronix 4125,
+	lines#34,
+	csr@, dl1=\E[1M, il1=\E[1L,
+	is2=\E%\E!0\EQD1\EUX03\EKA\ELBB2\ELCE0\ELI100\ELJ2\ELLB2
+	    \ELM0\ELS1\ELX00\ELV1\E%\E!1\E>\E[?3l\E[?4l\E[?5l\E[?7h
+	    \E[?8h,
+	rc@, sc@, smkx=\E=, use=vt100+4bsd,
+
+# From: <jcoker@ucbic>
+# (tek4207: This was the termcap file's entry for the 4107/4207, but SCO
+# supplied another, less capable 4107 entry.  So we'll use that for 4107 and
+# note that if jcoker wasn't confused you may be able to use this one.
+# I merged in <msgr>,<ind>,<ri>,<invis>,<tbc> from a BRL entry -- esr)
+tek4207|Tektronix 4207 graphics terminal with memory,
+	am, bw, mir, msgr, ul, xenl,
+	cols#80, it#8, lines#32,
+	blink=\E[5m, bold=\E[1m, cbt=\E[Z, clear=\E[H\E[J$<156/>,
+	cub1=^H, cud1=\n, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH,
+	cuu1=\EM, dch1=\E[P$<4/>, dl1=\E[M$<3/>, ed=\E[J,
+	el=\E[K$<5/>, home=\E[H, ht=^I, ich1=\E[@$<4/>,
+	il1=\E[L$<3/>, ind=\E[S, invis=\E[=6;<5,
+	is2=\E%!0\ELBP0\E%!1\E[H\E[2g\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[8
+	    C\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[J,
+	kcub1=\E[D, kcud1=\ED, kcuf1=\E[C, kcuu1=\EM, khome=\E[H,
+	rev=\E[7m, ri=\E[T,
+	rmcup=\E[?6h\E%!0\ELBP0\E%!1\E[32;1f, rmso=\E[m,
+	rmul=\E[m, sgr0=\E[m, smcup=\E[?6l\E[H\E[J, smso=\E[7m,
+	smul=\E[4m, tbc=\E[1g,
+
+# From: <carolyn@dali.berkeley.edu>  Thu Oct 31 12:54:27 1985
+# (tek4404: There was a "\!" in <smcup> that I replaced with "\E!".
+# Tab had been given as \E2I,that must be the tab-set capability -- esr)
+tek4404|Tektronix 4404,
+	OTbs,
+	cols#80, it#8, lines#32,
+	blink=\E[5m, bold=\E[1m, clear=\E[H\E[2J,
+	csr=\E[%i%p1%d;%p2%dr, cub1=^H, cud1=\n, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, dch1=\E[P, dl1=\E[1M,
+	ed=\E[J, el=\E[K, home=\E[H, ht=^I, hts=\E[2I, il1=\E[1L,
+	kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, rc=\E8,
+	rmcup=\E[1;1H\E[0J\E[?6h\E[?1l, rmir=\E[4l,
+	rmkx=\E[?1h, rmso=\E[27m, rmul=\E[m, sc=\E7, sgr0=\E[m,
+	smcup=\E%\E!1\E[1;32r\E[?6l\E>, smir=\E[4h,
+	smkx=\E[?1l, smso=\E[7m, smul=\E[4m,
+# Some unknown person wrote:
+# I added the is string - straight Unix has ESC ; in the login
+# string which sets a ct8500 into monitor mode (aka 4025 snoopy
+# mode). The is string here cleans up a few things (but not
+# everything).
+ct8500|Tektronix ct8500,
+	am, bw, da, db,
+	cols#80, lines#25,
+	bel=^G, cbt=\E^I, clear=\E^E, cr=\r, cub1=^H, cud1=\n,
+	cuf1=\ES, cup=\E|%p1%{32}%+%c%p2%{32}%+%c, cuu1=\ER,
+	dch1=\E^], dl1=\E\r, ed=\E^U, el=\E^T, ht=^I, ich1=\E^\,
+	il1=\E^L, ind=\n, is2=\037\EZ\Ek, ri=\E^A, rmso=\E\s,
+	rmul=\E\s, sgr0=\E\s, smso=\E$, smul=\E!,
+
+# Tektronix 4205 terminal.
+#
+# am is not defined because the wrap around occurs not when the char.
+# is placed in the 80'th column, but when we are attempting to type
+# the 81'st character on the line.  (esr: hmm, this is like the VT100
+# version of xenl, perhaps am + xenl would work!)
+#
+# Bold, dim, and standout are simulated by colors and thus not allowed
+# with colors.  The Tektronix color table is mapped into the RGB color
+# table by setf/setb. All colors are reset to factory specifications by oc.
+# The <initc> cap uses RGB notation to define colors.  for arguments 1-3 the
+# interval (0-1000) is broken into 8 smaller sub-intervals (125).  Each sub-
+# interval then maps into pre-defined value.
+tek4205|Tektronix 4205,
+	ccc, mir, msgr,
+	colors#8, cols#80, it#8, lines#30, ncv#49, pairs#63,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[=7;<4m, cbt=\E[Z,
+	clear=\E[2J\E[H, cr=\r, cub=\E[%p1%dD, cub1=\E[D,
+	cud=\E[%p1%dB, cud1=\E[B, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	dch1=\E[1P, dim=\E[=1;<6m, dl=\E[%p1%dM, dl1=\E[1M,
+	ech=\E%p1%dX, ed=\E[J, el=\E[K, el1=\E[1K, enacs=\E)0,
+	home=\E[H, ht=^I, ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[1L,
+	ind=\ED,
+	initc=\E%%!0\ETF4%?%p1%{0}%=%t0%e%p1%{1}%=%t4%e%p1%{2}%=%t3
+	      %e%p1%{3}%=%t5%e%p1%{4}%=%t2%e%p1%{5}%=%t6%e%p1%{6}%=
+	      %t7%e1%;%?%p2%{125}%<%t0%e%p2%{250}%<%tA2%e%p2%{375}%<
+	      %tA?%e%p2%{500}%<%tC8%e%p2%{625}%<%tD4%e%p2%{750}%<%tE
+	      1%e%p2%{875}%<%tE:%eF4%;%?%p3%{125}%<%t0%e%p3%{250}%<
+	      %tA2%e%p3%{375}%<%tA?%e%p3%{500}%<%tC8%e%p3%{625}%<%tD
+	      4%e%p3%{750}%<%tE1%e%p3%{875}%<%tE:%eF4%;%?%p4%{125}%<
+	      %t0%e%p4%{250}%<%tA2%e%p4%{375}%<%tA?%e%p4%{500}%<%tC8
+	      %e%p4%{625}%<%tD4%e%p4%{750}%<%tE1%e%p4%{875}%<%tE:%eF
+	      4%;\E%%!1,
+	invis=\E[=6;<5, is1=\E%!0\ETM1\E%!1\E[m, kbs=^H,
+	kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kf0=\EOA,
+	kf1=\EOB, kf2=\EOC, kf3=\EOD, kf4=\EP, kf5=\EQ, kf6=\ER,
+	kf7=\ES,
+	oc=\E%!0\ETFB000001F4F4F42F40030F404A4C<F450F4F46F40F47F4F40
+	   \E%!1,
+	op=\E[39;40m, rev=\E[7m, ri=\EM, rmacs=^O, rmcup=,
+	rmir=\E[4l, rmso=\E[=0;<1m, rmul=\E[24m,
+	setb=\E[=%?%p1%{0}%=%t0m%e%p1%{1}%=%t4m%e%p1%{2}%=%t3m%e%p1
+	     %{3}%=%t5m%e%p1%{4}%=%t2m%e%p1%{5}%=%t6m%e%p1%{6}%=%t7m
+	     %e1m%;,
+	setf=\E[<%?%p1%{0}%=%t0m%e%p1%{1}%=%t4m%e%p1%{2}%=%t3m%e%p1
+	     %{3}%=%t5m%e%p1%{4}%=%t2m%e%p1%{5}%=%t6m%e%p1%{6}%=%t7m
+	     %e1m%;,
+	sgr0=\E[=0;<1m\E[24;25;27m\017, smacs=^N,
+	smcup=\E%%!1\E[?6l\E[2J, smir=\E[4h, smso=\E[=2;<3m,
+	smul=\E[4m, tbc=\E[1g,
+
+#### Teletype (tty)
+#
+# These are the hardcopy Teletypes from before AT&T bought the company,
+# clattering electromechanical dinosaurs in Bakelite cases that printed on
+# pulpy yellow roll paper.  If you remember these you go back a ways.
+# Teletype-branded VDTs are listed in the AT&T section.
+#
+# The earliest UNIXes were designed to use these clunkers; nroff and a few
+# other programs still default to emitting codes for the Model 37.
+#
+
+tty33|tty35|model 33 or 35 teletype,
+	hc, os, xon,
+	cols#72,
+	bel=^G, cr=\r, cud1=\n, ind=\n,
+tty37|model 37 teletype,
+	OTbs, hc, os, xon,
+	bel=^G, cr=\r, cub1=^H, cud1=\n, cuu1=\E7, hd=\E9, hu=\E8,
+	ind=\n,
+
+# There are known to be at least three flavors of the tty40, all seem more
+# like IBM half duplex forms fillers than ASCII terminals.  They have lots of
+# awful braindamage, such as printing a visible newline indicator after each
+# newline.  The 40-1 is a half duplex terminal and is hopeless.  The 40-2 is
+# braindamaged but has hope and is described here.  The 40-4 is a 3270
+# lookalike and beyond hope.  The terminal has visible bell but I don't know
+# it - it's null here to prevent it from showing the BL character.
+# There is an \EG in <nl> because of a bug in old vi (if stty says you have
+# a "newline" style terminal (-crmode) vi figures all it needs is nl
+# to get crlf, even if <cr> is not ^M.)
+# (tty40: removed obsolete ":nl=\EG\EB:", it's just do+cr -- esr)
+tty40|ds40|ds40-2|dataspeed40|Teletype dataspeed 40/2,
+	OTbs, xon,
+	cols#80, lines#24,
+	clear=\EH$<20>\EJ$<80>, cr=\EG, cub1=^H, cud1=\EB,
+	cuf1=\EC, cuu1=\E7, dch1=\EP$<50>, dl1=\EM$<50>,
+	ed=\EJ$<75>, home=\EH$<10>, ht=\E@$<10>, hts=\E1,
+	ich1=\E\^$<50>, il1=\EL$<50>, ind=\ES$<20>, kbs=^],
+	kcub1=^H, mc4=^T, mc5=\022$<2000>, ri=\ET$<10>, rmso=\E4,
+	rs2=\023\ER$<60>, smso=\E3, tbc=\EH\E2$<80>,
+tty43|model 43 teletype,
+	OTbs, am, hc, os, xon,
+	cols#132,
+	bel=^G, cr=\r, cub1=^H, cud1=\n, ind=\n, kbs=^H,
+
+#### Tymshare
+#
+
+# You can add <is2=\E<> to put this 40-column mode, though I can't
+# for the life of me think why anyone would want to.
+scanset|sc410|sc415|Tymshare Scan Set,
+	am, bw, msgr,
+	cols#80, lines#24,
+	acsc=j%k4l<m-q\,x5, bel=^G, clear=\EH\EJ, cr=\r, cub1=^H,
+	cud1=\n, cuf1=^I, cup=\EY%p1%{32}%+%c%p2%{32}%+%c,
+	cuu1=^K, ed=\EJ, el=\EK, home=\EH, ind=\n, kcub1=\ED,
+	kcud1=\EB, kcuf1=\EC, kcuu1=\EA, mc0=\E;3, mc4=\E;0,
+	mc5=\E;0, rc=^C, rmacs=^O, rs1=\E>, sc=^B, smacs=^N,
+
+#### Volker-Craig (vc)
+#
+# If you saw a Byte Magazine cover with a terminal on it during the early
+# 1980s, it was probably one of these.  Carl Helmers liked them because
+# they could crank 19.2 and were cheap (that is, he liked them until he tried
+# to program one...)
+#
+
+# Missing in vc303a and vc303 descriptions:  they scroll 2 lines at a time
+# every other linefeed.
+vc303|vc103|vc203|Volker-Craig 303,
+	OTbs, OTns, am,
+	cols#80, lines#24,
+	bel=^G, clear=\014$<40>, cr=\r, cub1=^H, cud1=\n, cuf1=^I,
+	cuu1=^N, home=\013$<40>, kcub1=^H, kcud1=\n, kcuf1=^I,
+	kcuu1=^N, ll=\017$<1>W,
+vc303a|vc403a|Volker-Craig 303a,
+	clear=\030$<40>, cuf1=^U, cuu1=^Z, el=\026$<20>,
+	home=\031$<40>, kcuf1=^U, kcuu1=^Z, ll=^P, use=vc303,
+# (vc404: removed obsolete ":ma=^Z^P^U :" -- esr)
+vc404|Volker-Craig 404,
+	OTbs, am,
+	cols#80, lines#24,
+	bel=^G, clear=\030$<40>, cr=\r, cub1=^H, cud1=\n, cuf1=^U,
+	cup=\020%p1%{32}%+%c%p2%{32}%+%c, cuu1=^Z,
+	ed=\027$<40>, el=\026$<20>, home=\031$<40>, ind=\n,
+	kcub1=^H, kcud1=\n, kcuf1=^U, kcuu1=^Z,
+vc404-s|Volker-Craig 404 w/standout mode,
+	cud1=\n, rmso=^O, smso=^N, use=vc404,
+# From: <wolfgang@cs.sfu.ca>
+# (vc414: merged in cup/dl1/home from an old vc414h-noxon)
+vc414|vc414h|Volker-Craig 414H in sane escape mode.,
+	OTbs, am,
+	cols#80, lines#24,
+	clear=\E\034$<40>, cud1=\E^K, cuf1=^P,
+	cup=\E\021%p2%c%p1%c$<40>, cuu1=\E^L, dch1=\E3,
+	dl1=\E\023$<40>, ed=\E^X, el=\E\017$<10/>, home=\E^R,
+	ich1=\E:, il1=\E\032$<40>, kcub1=^H, kcud1=\E^K, kcuf1=^P,
+	kcuu1=\E^L, kf0=\EA, kf1=\EB, kf2=\EC, kf3=\ED, kf4=\EE,
+	kf5=\EF, kf6=\EG, kf7=\EH, khome=\E^R, lf0=PF1, lf1=PF2,
+	lf2=PF3, lf3=PF4, lf4=PF5, lf5=PF6, lf6=PF7, lf7=PF8,
+	rmso=\E^_, smso=\E^Y,
+vc415|Volker-Craig 415,
+	clear=^L, use=vc404,
+
+######## OBSOLETE PERSONAL-MICRO CONSOLES AND EMULATIONS
+#
+
+#### IBM PC and clones
+#
+
+# The pcplot IBM-PC terminal emulation program is really messed up. It is
+# supposed to emulate a vt-100, but emulates the wraparound bug incorrectly,
+# doesn't support scrolling regions, ignores add line commands, and ignores
+# delete line commands. Consequently, the resulting behavior looks like a
+# crude adm3a-type terminal.
+# Steve Jacobson 8/85
+pcplot|pc-plot terminal emulation program,
+	xenl@,
+	csr@, dl@, dl1@, il@, il1@, rc@, sc@, use=vt100+4bsd,
+# KayPro II from Richard G Turner <rturner at Darcom-Hq.ARPA>
+# I've found that my KayPro II, running MDM730, continues to emulate an
+# ADM-3A terminal, just like I was running TERM.COM. On our 4.2 UNIX
+# system the following termcap entry works well:
+# I have noticed a couple of minor glitches, but nothing I can't work
+# around. (I added two capabilities from the BRL entry -- esr)
+kaypro|kaypro2|kaypro II,
+	OTbs, am,
+	cols#80, lines#24,
+	bel=^G, clear=\032$<1/>, cr=\r, cud1=\n, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dl1=\ER, ed=^W,
+	el=^X, home=^^, il1=\EE, ind=\n, kcud1=\n, kcuf1=^L, kcuu1=^K,
+
+# From IBM, Thu May  5 19:35:27 1983
+# (ibmpc: commented out <smir>=\200R because we don't know <rmir> -- esr)
+ibm-pc|ibm5051|5051|IBM Personal Computer (no ANSI.SYS),
+	OTbs, am,
+	cols#80, lines#24,
+	bel=^G, clear=^L^K, cr=\r^^, cub1=^], cud1=\n, cuf1=^\,
+	cuu1=^^, home=^K, ind=\n$<10>, kcud1=^_,
+
+ibmpc|wy60-PC|wyse60-PC|IBM PC/XT running PC/IX,
+	OTbs, am, bw, eo, hs, km, msgr, ul,
+	cols#80, it#8, lines#24,
+	acsc=j\331k\277l\332m\300n\305q\304t\303u\264v\301w\302x
+	     \263,
+	bel=^G, blink=\E[5m, bold=\E[1m, clear=\Ec, cr=\r,
+	cub=\E[%p1%dD, cub1=\E[D, cud=\E[%p1%dB, cud1=\E[B,
+	cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH,
+	cuu=\E[%p1%dA, cuu1=\E[A, ech=\E[%p1%dX, ed=\E[J, el=\E[K,
+	home=\E[H, hpa=\E[%i%p1%dG, ind=\E[S\E[B,
+	indn=\E[%p1%dS\E[%p1%dB, invis=\E[30;40m, kbs=^H,
+	kcbt=^], kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A,
+	kdch1=^?, kend=\E[Y, kf1=\240, kf10=\251, kf2=\241, kf3=\242,
+	kf4=\243, kf5=\244, kf6=\245, kf7=\246, kf8=\247, kf9=\250,
+	khome=\E[H, kich1=\E[^H, knp=\E[U, kpp=\E[V, ll=\E[24;1H,
+	nel=\r, rev=\E[7m, ri=\E[T\E[A, rin=\E[%p1%dT\E[%p1%dA,
+	rmso=\E[m, rmul=\E[m,
+	sgr=\E[%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1
+	    %;%?%p7%t30;40%;m,
+	sgr0=\E[m, smso=\E[7m, smul=\E[4m,
+
+#### Apple II
+#
+# Apple II firmware console first, then various 80-column cards and
+# terminal emulators.  For two cents I'd toss all these in the UFO file
+# along with the 40-column apple entries.
+#
+
+# From: brsmith@umn-cs.cs.umn.edu (Brian R. Smith) via BRL
+#	'it#8' tells UNIX that you have tabs every 8 columns.  This is a
+#		function of TIC, not the firmware.
+#	The clear key on a IIgs will do something like clear-screen,
+#		depending on what you're in.
+appleIIgs|appleIIe|appleIIc|Apple 80 column firmware interface,
+	OTbs, am, bw, eo, msgr,
+	cols#80, it#8, lines#24,
+	bel=^G, clear=^L, cr=\r, cub1=^H, cud1=\n, cuf1=^\,
+	cup=\036%p2%{32}%+%c%p1%{32}%+%c, cuu1=^_, ed=^K, el=^],
+	home=^Y, ht=^I, ind=^W, kbs=^H, kclr=^X, kcub1=^H, kcud1=\n,
+	kcuf1=^U, kcuu1=^K, kdch1=^?, nel=\r^W, ri=^V, rmso=^N,
+	smso=^O,
+# Apple //e with 80-column card, entry from BRL
+# The modem interface is permitted to discard LF (maybe DC1), otherwise
+# passing characters to the 80-column firmware via COUT (PR#3 assumed).
+# Auto-wrap does not work right due to newline scrolling delay, which also
+# requires that you set "stty cr2".
+# Note: Cursor addressing is only available via the Pascal V1.1 entry,
+# not via the BASIC PR#3 hook.  All this nonsense can be avoided only by
+# using a terminal emulation program instead of the built-in firmware.
+apple2e|Apple //e,
+	bw, msgr,
+	cols#80, lines#24,
+	bel=^G, clear=\014$<100/>, cub1=^H, cud1=\n, cuu1=^_,
+	ed=\013$<4*/>, el=\035$<4/>, home=^Y, ht=^I, ind=^W,
+	is2=^R^N, kbs=^H, kcub1=^H, kcud1=\n, kcuf1=^U, kcuu1=^K,
+	nel=\r$<100/>, rev=^O, ri=^V, rmso=^N, rs1=^R^N, sgr0=^N,
+	smso=^O,
+# mcvax!vu44!vu45!wilcke uses the "ap" entry together with Ascii Express Pro
+# 4.20, with incoming and outgoing terminals both on 0, emulation On.
+apple2e-p|Apple //e via Pascal,
+	cup=\036%p2%{32}%+%c%p1%{32}%+%c, kbs=^H, kcub1=^H,
+	kcud1=\n, use=apple2e,
+# (ASCII Express) MouseTalk "Standard Apple //" emulation from BRL
+# Enable DC3/DC1 flow control with "stty ixon -ixany".
+apple-ae|ASCII Express,
+	OTbs, am, bw, msgr, nxon, xon,
+	cols#80, it#8, lines#24,
+	bel=\007$<500/>, clear=^L, cr=\r, cub1=^H, cud1=\n, cuf1=^U,
+	cup=\036%p2%{32}%+%c%p1%{32}%+%c, cuu1=^_, ed=^K, el=^],
+	home=^Y, ind=^W, is2=^R^N, kclr=^X, kcub1=^H, kcud1=\n,
+	kcuf1=^U, kcuu1=^K, rev=^O, ri=^V, rmso=^N, rs1=^R^N, sgr0=^N,
+	smso=^O,
+appleII|Apple II plus,
+	OTbs, am,
+	cols#80, it#8, lines#24,
+	clear=^L, cnorm=^TC2, cub1=^H, cud1=\n, cuf1=^\,
+	cup=\036%p2%{32}%+%c%p1%{32}%+%c, cuu1=^_, cvvis=^TC6,
+	ed=^K, el=^], flash=\024G1$<200/>\024T1, home=\E^Y, ht=^I,
+	is2=^TT1^N, kcud1=\n, kcuf1=^U, rmso=^N, sgr0=^N, smso=^O,
+# Originally by Gary Ford 21NOV83
+# From: <ee178aci%sdcc7@SDCSVAX.ARPA>  Fri Oct 11 21:27:00 1985
+apple-80|Apple II with smarterm 80 col,
+	OTbs, am, bw,
+	cols#80, lines#24,
+	cbt=^R, clear=\014$<10*/>, cr=\r$<10*/>, cub1=^H, cud1=\n,
+	cuf1=^\, cup=\036%p2%{32}%+%c%p1%{32}%+%c, cuu1=^_,
+	ed=\013$<10*/>, el=\035$<10/>, home=^Y,
+apple-soroc|Apple emulating Soroc 120,
+	am,
+	cols#80, lines#24,
+	bel=^G, clear=\E*$<300>, cr=\r, cub1=^H, cud1=\n, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, ed=\EY, el=\ET,
+	home=^^, ind=\n, kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K,
+# From Peter Harrison, Computer Graphics Lab, San Francisco
+#   ucbvax!ucsfmis!harrison  .....uucp
+#   ucbvax!ucsfmis!harrison@BERKELEY   .......ARPA
+# "These two work.  If you don't have the inverse video chip for the
+# Apple with videx then remove the :so: and :se: fields."
+# (apple-videx: this used to be called DaleApple -- esr)
+apple-videx|Apple with videx videoterm 80 column board with inverse video,
+	OTbs, am, xenl,
+	cols#80, it#8, lines#24,
+	clear=\014$<300/>, cub1=^H, cud1=\n, cuf1=^\,
+	cup=\036%p2%{32}%+%c%p1%{32}%+%c, cuu1=^_, ed=^K, el=^],
+	home=^Y, ht=^I, kcub1=^H, kcud1=\n, kcuf1=^U, khome=^Y,
+	rmso=^Z2, sgr0=^Z2, smso=^Z3,
+# My system [for reference] : Apple ][+, 64K, Ultraterm display card,
+#			      Apple Cat ][ 212 modem, + more all
+#			      controlled by ASCII Express: Pro.
+# From Dave Shaver <isucs1!shaver>
+apple-uterm-vb|Videx Ultraterm for Apple micros with Visible Bell,
+	OTbs, am, eo, xt,
+	cols#80, lines#24,
+	acsc=, clear=^L, cuf1=^\,
+	cup=\036%p2%{32}%+%c%p1%{32}%+%c, cuu1=^_, ed=^K, el=^],
+	flash=^W35^W06, home=^Y,
+	is2=^V4^W06\017\rVisible Bell Installed.\016\r\n,
+	rmso=^N, smso=^O,
+apple-uterm|Ultraterm for Apple micros,
+	OTbs, am, eo, xt,
+	cols#80, lines#24,
+	acsc=, clear=^L, cuf1=^\,
+	cup=\036%p2%{32}%+%c%p1%{32}%+%c, cuu1=^_, ed=^K, el=^],
+	home=^Y, is2=^V4^W06\016, rmso=^N, smso=^O,
+# from trwrba!bwong (Bradley W. Wong):
+#
+# This entry assumes that you are using an apple with the UCSD Pascal
+# language card.  SYSTEM.MISCINFO is assumed to be the same as that
+# supplied with the standard apple except that screenwidth should be set
+# using SETUP to 80 columns.  Note that the right arrow is not mapped in
+# this termcap entry.  This is because that key, on the Apple, transmits
+# a ^U and would thus preempt the more useful "up" function of vi.
+#
+# HMH 2/23/81
+apple80p|80-column apple with Pascal card,
+	am, bw,
+	cols#80, lines#24,
+	clear=^Y^L, cuf1=^\:, cup=\036%p2%{32}%+%c%p1%{32}%+%c,
+	cuu1=^_, ed=^K, el=^], home=^Y, kcub1=^H,
+#
+# Apple II+ equipped with Videx 80 column card
+#
+# Terminfo from ihnp4!ihu1g!djc1 (Dave Christensen) via BRL;
+# manually converted by D A Gwyn
+#
+# DO NOT use any terminal emulation with this data base, it works directly
+# with the Videx card.  This has been tested with vi 1200 baud and works fine.
+#
+# This works great for vi, except I've noticed in pre-R2, ^U will scroll back
+# 1 screen, while in R2 ^U doesn't.
+# For inverse alternate character set add:
+#	<smacs>=^O:<rmacs>=^N:
+# (apple-v: added it#8 -- esr)
+apple-videx2|Apple II+ w/ Videx card (similar to Datamedia h1520),
+	am, xenl,
+	cols#80, it#8, lines#24,
+	bel=\007$<100/>, clear=\014$<16*/>, cr=\r, cub1=^H,
+	cud1=\n, cuf1=^\, cup=\036%p2%{32}%+%c%p1%{32}%+%c,
+	cuu1=^_, ed=\013$<16*/>, el=^], home=^Y, ht=\011$<8/>,
+	ind=\n, kbs=^H, kcub1=^H, kcud1=\n, kcuf1=^\, kcuu1=^_,
+	khome=^Y, rmso=^Z2, smso=^Z3,
+apple-videx3|vapple|Apple II with 80 col card,
+	OTbs, am,
+	cols#80, lines#24,
+	clear=\Ev, cub1=\ED, cud1=\EB, cuf1=\EC,
+	cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, el=\Ex,
+	home=\EH, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA,
+	kf0=\EP, kf1=\EQ, kf2=\ER, kf3=\E\s, kf4=\E!, kf5=\E", kf6=\E#,
+	kf7=\E$, kf8=\E%%, kf9=\E&, khome=\EH,
+#From: decvax!cbosgd!cbdkc1!mww Mike Warren via BRL
+aepro|Apple II+ running ASCII Express Pro--vt52,
+	OTbs,
+	cols#80, lines#24,
+	clear=\014$<300/>, cub1=\ED, cud1=\EB, cuf1=\EC,
+	cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, ed=\EJ,
+	el=\EK, home=\EH,
+# UCSD addition: Yet another termcap from Brian Kantor's Micro Munger Factory
+apple-vm80|ap-vm80|Apple with viewmax-80,
+	OTbs,
+	cols#80, lines#24,
+	clear=\014$<300/>, cuf1=^\:,
+	cup=\036%p1%{32}%+%c%p2%{32}%+%c$<100/>, cuu1=^_,
+	ed=\013$<300/>, el=^], home=\031$<200/>,
+
+#### Apple Lisa & Macintosh
+#
+
+# (lisa: changed <cvvis> to <cnorm> -- esr)
+lisa|Apple Lisa console display (black on white),
+	OTbs, am, eo, msgr,
+	cols#88, it#8, lines#32,
+	acsc=jdkclfmenbqattuvvuwsx`, civis=\E[5h, clear=^L,
+	cnorm=\E[5l, cub1=^H, cud1=\E[B, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, dch1=\E[P, dl1=\E[M,
+	ed=\E[J, el=\E[K, home=\E[H, ht=^I, ich1=\E[@, il1=\E[L,
+	is2=\E>\E[m\014, kbs=^H, kcub1=\E[D, kcud1=\E[B,
+	kcuf1=\E[C, kcuu1=\E[A, rmacs=\E[10m, rmso=\E[m, rmul=\E[m,
+	sgr0=\E[m, smacs=\E[11m, smso=\E[7m, smul=\E[4m,
+liswb|Apple Lisa console display (white on black),
+	is2=\E>\E[0;7m\014, rmso=\E[0;7m, rmul=\E[0;7m,
+	smso=\E[m, smul=\E[4m, use=lisa,
+
+# lisaterm from ulysses!gamma!epsilon!mb2c!jed (John E. Duncan III) via BRL;
+# <is2> revised by Ferd Brundick <fsbrn@BRL.ARPA>
+#
+# These entries assume that the 'Auto Wraparound' is enabled.
+# Xon-Xoff flow control should also be enabled.
+#
+# The VT100 uses :rs2: and :rf: rather than :is2:/:tbc:/:hts: because the tab
+# settings are in non-volatile memory and don't need to be reset upon login.
+# Also setting the number of columns glitches the screen annoyingly.
+# You can type "reset" to get them set.
+#
+lisaterm|Apple Lisa or Lisa/2 running LisaTerm VT100 emulation,
+	OTbs, OTpt, am, xenl, xon,
+	OTkn#4, cols#80, it#8, lines#24, vt#3,
+	bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[2J, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A, ed=\E[J,
+	el=\E[K, home=\E[H, ht=^I, hts=\EH, ind=\n, kbs=^H, kcub1=\EOD,
+	kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kf0=\EOP, kf1=\EOQ,
+	kf2=\EOR, kf3=\EOS, lf0=F1, lf1=F2, lf2=F3, lf3=F4, rc=\E8,
+	rev=\E[7m, ri=\EM, rmkx=\E[?1l\E>, rmso=\E[m, rmul=\E[m,
+	rs1=\E>\E[?1l\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h\E[1;24r,
+	sc=\E7, sgr0=\E[m, smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m,
+	tbc=\E[3g,
+# Lisaterm in 132 column ("wide") mode.
+lisaterm-w|Apple Lisa with Lisaterm in 132 column mode,
+	cols#132,
+	kbs=^H, kcub1=^H, kcud1=\n, use=lisaterm,
+# Although MacTerminal has insert/delete line, it is commented out here
+# since it is much faster and cleaner to use the "lock scrolling region"
+# method of inserting and deleting lines due to the MacTerminal implementation.
+# Also, the "Insert/delete ch" strings have an extra character appended to them
+# due to a bug in MacTerminal V1.1.  Blink is disabled since it is not
+# supported by MacTerminal.
+mac|macintosh|Macintosh with MacTerminal,
+	xenl,
+	OTdN#30,
+	blink@, dch1=\E[P$<7/>, ich1=\E[@$<9/>, ip=$<7/>, use=lisa,
+# Lisaterm in 132 column ("wide") mode.
+mac-w|macterminal-w|Apple Macintosh with MacTerminal in 132 column mode,
+	cols#132, use=mac,
+
+#### Radio Shack/Tandy
+#
+
+# (coco3: This had "ta" used incorrectly as a boolean and bl given as "bl#7".
+# I read these as mistakes for ":it#8:" and ":bl=\007:" respectively -- esr)
+# From: <{pbrown,ctl}@ocf.berkeley.edu> 12 Mar 90
+coco3|os9LII|Tandy CoCo3 24*80 OS9 Level II,
+	OTbs, am,
+	cols#80, it#8, lines#24,
+	bel=^G, blink=^_", bold=\E:^A, civis=^E\s,
+	clear=\014$<5*/>, cnorm=^E!, cub1=^H, cud1=\n, cuf1=^F,
+	cup=\002%p2%{32}%+%c%p1%{32}%+%c$<2/>, cuu1=^I,
+	dl1=^_1, ed=^K, el=^D, home=^A, il1=^_0, kcub1=^H, kcud1=\n,
+	kcuf1=^I, kcuu1=^L, rev=^_\s, rmso=^_!, rmul=^_#,
+	sgr0=\037!\E:\0, smso=^_\s, smul=^_",
+# (trs2: removed obsolete ":nl=^_:" -- esr)
+trs2|trsII|trs80II|Radio Shack Model II using P&T CP/M,
+	OTbs, am, msgr,
+	cols#80, it#8, lines#24,
+	bel=^G, clear=^L, cr=\r, cub1=^H, cud1=^_, cuf1=^],
+	cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=^^, dl1=^K, ed=^B,
+	el=^A, home=^F, ht=^I, il1=^D, ind=\n, kbs=^H, kcub1=^\,
+	kcud1=^_, kcuf1=^], kcuu1=^^, rmso=^O, sgr0=^O, smso=^N,
+# From: Kevin Braunsdorf <ksb@mentor.cc.purdue.edu>
+# (This had extension capabilities
+#	:BN=\E[?33h:BF=\E[?33l:UC=\E[_ q:BC=\E[\177 q:\
+#	:CN=\ERC:CF=\ERc:NR=\ERD:NM=\ER@:
+# I also deleted the unnecessary ":kn#2:", ":sg#0:" -- esr)
+trs16|trs-80 model 16 console,
+	OTbs, am,
+	cols#80, it#8, lines#24,
+	acsc=jak`l_mbquvewcxs, bel=^G, civis=\ERc, clear=^L,
+	cnorm=\ERC, cr=\r, cub1=^H, cud1=\EB, cuf1=\EC,
+	cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, dch1=\EQ,
+	dl1=\EM, ed=\EJ, el=\EK, home=\EH, ht=^I, ich1=\EP, il1=\EL,
+	ind=\n, kbs=^H, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA,
+	kf0=^A, kf1=^B, kf2=^D, kf3=^L, kf4=^U, kf5=^P, kf6=^N, kf7=^S,
+	khome=^W, lf0=f1, lf1=f2, lf2=f3, lf3=f4, lf4=f5, lf5=f6, lf6=f7,
+	lf7=f8, mc4=\E]+, mc5=\E]=, rmacs=\ERg, rmso=\ER@, sgr0=\ER@,
+	smacs=\ERG, smso=\ERD,
+
+#### Commodore Business Machines
+#
+# Formerly located in West Chester, PA; went spectacularly bust in 1994
+# after years of shaky engineering and egregious mismanagement.  Made one
+# really nice machine (the Amiga) and boatloads of nasty ones (PET, C-64,
+# C-128, VIC-20).  The C-64 is said to have been the most popular machine
+# ever (most units sold); they can still be found gathering dust in closets
+# everywhere.
+#
+
+# From: Kent Polk <kent@swrinde.nde.swri.edu>, 30 May 90
+# Added a few more entries, converted caret-type control sequence (^x) entries
+# to '\0xx' entries since a couple of people mentioned losing '^x' sequences.
+# Corrections by Ty Sarna <tsarna@endicor.com>, Sat Feb 28 18:55:15 1998
+#
+# :as:, :ae:			Support for alternate character sets.
+# :ve=\E[\040p:vi=\E[\060\040p:	cursor visible/invisible.
+# :xn:  vt100 kludginess at column 80/NEWLINE ignore after 80 cols(Concept)
+#     This one appears to fix a problem I always had with a line ending
+#     at 'width+1' (I think) followed by a blank line in vi. The blank
+#     line tended to disappear and reappear depending on how the screen
+#     was refreshed. Note that this is probably needed only if you use
+#     something like a Dnet Fterm with the window sized to some peculiar
+#     dimension larger than 80 columns.
+# :k0=\E9~:	map F10 to k0 - could have F0-9 -> k0-9, but ... F10 was 'k;'
+# (amiga: removed obsolete :kn#10:,
+# also added empty <acsc> to suppress a warning --esr)
+amiga|Amiga ANSI,
+	OTbs, am, bw, xenl,
+	cols#80, lines#24,
+	acsc=, bel=^G, blink=\E[7;2m, bold=\E[1m, cbt=\E[Z,
+	civis=\E[0 p, clear=\E[H\E[J, cnorm=\E[ p, cub=\E[%p1%dD,
+	cub1=\E[D, cud=\E[%p1%dB, cud1=\E[B, cuf=\E[%p1%dC,
+	cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA,
+	cuu1=\E[A, dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m,
+	dl=\E[%p1%dM, dl1=\E[M, ed=\E[J, el=\E[K, home=\E[H,
+	ich=\E[%p1%d@, ich1=\E[@, il=\E[%p1%dL, il1=\E[L, ind=\E[S,
+	invis=\E[8m, is2=\E[20l, kbs=^H, kcub1=\E[D, kcud1=\E[B,
+	kcuf1=\E[C, kcuu1=\E[A, kf0=\E[9~, kf1=\E[0~, kf2=\E[1~,
+	kf3=\E[2~, kf4=\E[3~, kf5=\E[4~, kf6=\E[5~, kf7=\E[6~,
+	kf8=\E[7~, kf9=\E[8~, rev=\E[7m, ri=\E[T, rmacs=^O,
+	rmso=\E[m, rmul=\E[m, rs1=\Ec, sgr0=\E[m, smacs=^N,
+	smso=\E[7m, smul=\E[4m, use=ecma+index,
+
+# From: Hans Verkuil <hans@wyst.hobby.nl>, 4 Dec 1995
+# (amiga: added empty <acsc> to suppress a warning.
+# I'm told this entry screws up badly with AS225, the Amiga
+# TCP/IP package once from Commodore, and now sold by InterWorks.--esr)
+amiga-h|Hans Verkuil's Amiga ANSI,
+	OTbs, bw, msgr,
+	cols#80, lines#24,
+	acsc=, bel=^G, blink=\2337;2m, bold=\2331m, cbt=\233Z,
+	civis=\2330 p, clear=\233H\233J, cnorm=\233 p, cr=\r,
+	cub=\233%p1%dD, cub1=\233D, cud=\233%p1%dB, cud1=\233B,
+	cuf=\233%p1%dC, cuf1=\233C, cup=\233%i%p1%d;%p2%dH,
+	cuu=\233%p1%dA, cuu1=\233A, dch=\233%p1%dP, dch1=\233P,
+	dim=\2332m, ech=\233%p1%dP, ed=\233J, el=\233K, flash=^G,
+	home=\233H, ht=^I, ich=\233%p1%d@, ich1=\233@, ind=\233S,
+	indn=\233%p1%dS, invis=\2338m, is2=\23320l, kbs=^H,
+	kcub1=\233D, kcud1=\233B, kcuf1=\233C, kcuu1=\233A,
+	kdch1=^?, kf0=\2339~, kf1=\2330~, kf2=\2331~, kf3=\2332~,
+	kf4=\2333~, kf5=\2334~, kf6=\2335~, kf7=\2336~, kf8=\2337~,
+	kf9=\2338~, nel=\233B\r, rev=\2337m, ri=\233T,
+	rin=\233%p1%dT, rmacs=^O, rmcup=\233?7h, rmso=\2330m,
+	rmul=\2330m, rs1=\Ec, sgr0=\2330m, smacs=^N, smcup=\233?7l,
+	smso=\2337m, smul=\2334m,
+
+# From: Henning 'Faroul' Peters <Faroul@beyond.kn-bremen.de>, 25 Sep 1999
+#
+# Pavel Fedin added
+#	Home    Shift+Left
+#	End     Shift+Right
+#	PgUp    Shift+Up
+#	PgDn    Shift+Down
+amiga-8bit|Amiga ANSI using 8-bit controls,
+	acsc=, dl=\233%p1%dM, dl1=\233M, il=\233%p1%dL, il1=\233L,
+	ind=\204, indn@, kend=\233 @, khome=\233 A, knp=\233S,
+	kpp=\233T, ri=\215, rin@, use=amiga-h,
+
+# From: Ruediger Kuhlmann <terminfo@ruediger-kuhlmann.de>, 18 Jul 2000
+# requires use of appropriate preferences settings.
+amiga-vnc|Amiga using VNC console (black on light gray),
+	am, da, db, msgr, ndscr,
+	btns#1, colors#16, cols#80, lines#24, lm#0, ncv#0, pairs#0x100,
+	bel=^G, blink=\E[7;2m, bold=\E[1m, civis=\E[0p,
+	clear=\E[H\E[J, cnorm=\E[p\E[>?6l, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=\E[D,
+	cud=\E[%p1%dB, cud1=\E[B, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	cvvis=\E[>?6h, dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m,
+	dl=\E[%p1%dM, dl1=\E[1M, ed=\E[J, el=\E[K, flash=^G,
+	ich=\E[%p1%d@, ich1=\E[@, il=\E[%p1%dL, il1=\E[1L, ind=\ED,
+	invis=\E8m,
+	is2=\E[>?2;18l\E[>?26;?6;20;>?15;?7;>?22;>?8h,
+	kbs=^H, kcbt=\233Z, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C,
+	kcuu1=\E[A, kdch1=^?, kf0=\E[9~, kf1=\E[0~, kf2=\E[1~,
+	kf3=\E[2~, kf4=\E[3~, kf5=\E[4~, kf6=\E[5~, kf7=\E[6~,
+	kf8=\E[7~, kf9=\E[8~, khlp=\E[?~, khome=\E[44~, kll=\E[45~,
+	kmous=\E[M, knp=\E[42~, kpp=\E[41~, nel=\EE, oc=\E[0m,
+	rev=\E[7m, ri=\EM, rmcup=\E[?7h\E[r\E[J, rmkx=\E[?1l,
+	rmso=\E[21m, rmul=\E[24m, rs1=\Ec,
+	rs2=\E[>?2;18l\E[>?26;?6;20;>?15;?7;>?22;>?8h,
+	setab=\E[%?%p1%{8}%>%t%'F'%p1%+%d%e4%p1%d%;m,
+	setaf=\E[%?%p1%{8}%>%t%'2'%p1%+%d%e3%p1%d%;m,
+	sgr0=\E[0m\017\E[30;85;>15m, smcup=\E[?7h, smkx=\E[?1h,
+	smso=\E[1m, smul=\E[4m, use=ecma+index,
+
+# MorphOS on Genesi Pegasos
+# By Pavel Fedin <sonic_amiga@rambler.ru>
+morphos|MorphOS on Genesi Pegasos,
+	acsc=, dl=\233%p1%dM, dl1=\233M, il=\233%p1%dL, il1=\233L,
+	ind=\204, indn@, kend=\23345~, kf11=\23320~, kf12=\23321~,
+	khome=\23344~, kich1=\23340~, knp=\23342~, kpp=\23341~,
+	ri=\215, rin@, use=amiga-h,
+
+# Commodore B-128 microcomputer from Doug Tyrol <det@HEL-ACE.ARPA>
+#	I'm trying to write a termcap for a commodore b-128, and I'm
+# having a little trouble. I've had to map most of my control characters
+# to something that unix will accept (my delete-char is a ctrl-t, etc),
+# and create some functions (like cm), but thats life.
+#	The problem is with the arrow keys - right, and up work fine, but
+# left deletes the previous character and down I just can't figure out.
+# Jove knows what I want, but I don't know what it's sending to me (it
+# isn't thats bound to next-line in jove).
+#	Anybody got any ideas? Here's my termcap.
+# DAG -- I changed his "^n" entries to "\n"; see if that works.
+#
+commodore|b-128|Commodore B-128 micro,
+	am, bw,
+	OTdN#20, cols#80, lines#24, pb#150,
+	OTbc=^H, OTnl=\r, clear=\E\006$<10/>, cr=\r, cud1=\n,
+	cuf1=^F, cup=\E\013%p1%2d\,%p2%2d\,$<20/>, cuu1=^P,
+	dch1=\177$<10*/>, dl1=\Ed$<10*/>, el=\Eq$<10/>,
+	home=\E^E, ht=\011$<5/>, ich1=\E\n$<5/>, il1=\Ei$<10/>,
+	kcub1=^B, kcud1=\n, kcuf1=^F, kcuu1=^P, khome=\E^E, rmir=,
+	smir=,
+
+#### North Star
+#
+# North Star Advantage from Lt. Fickie <brl-ibd!fickie> via BRL
+northstar|North Star Advantage,
+	OTbs,
+	cols#80, lines#24,
+	clear=\004$<200/>,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c$<1/>, ed=\017$<200/>,
+	el=\016$<200/>, home=\034\032$<200/>,
+
+#### Osborne
+#
+# Thu Jul  7 03:55:16 1983
+#
+# As an aside, be careful; it may sound like an anomaly on the
+# Osborne, but with the 80-column upgrade, it's too easy to
+# enter lines >80 columns!
+#
+# I've already had several comments...
+# The Osborne-1 with the 80-col option is capable of being
+# 52, 80, or 104 characters wide; default to 80 for compatibility
+# with most systems.
+#
+# The tab is destructive on the Ozzie; make sure to 'stty -tabs'.
+osborne-w|osborne1-w|Osborne I in 104-column mode,
+	msgr, ul, xt,
+	cols#104, lines#24,
+	bel=^G, clear=^Z, cr=\r, cub1=^H, cud1=\n, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW,
+	dl1=\ER, el=\ET, ich1=\EQ, il1=\EE, ind=\n, kcub1=^H, kcud1=\n,
+	kcuf1=^L, kcuu1=^K, rmso=\E(, rmul=\Em, smso=\E), smul=\El,
+# Osborne I	from ptsfa!rhc (Robert Cohen) via BRL
+osborne|osborne1|Osborne I in 80-column mode,
+	OTbs, am, mir, msgr, ul, xhp,
+	OTdB#4, cols#80, lines#24,
+	clear=^Z, cub1=\010$<4>, cud1=\n, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K,
+	dch1=\EW$<4/>, dl1=\ER, el=\ET, il1=\EE, is2=^Z, kbs=^H,
+	kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K, rmir=, rmso=\E),
+	rmul=\Em, smir=\EQ, smso=\E(, smul=\El,
+#
+# Osborne Executive definition from BRL
+# Similar to tvi920
+# Added by David Milligan and Tom Smith (SMU)
+osexec|Osborne executive,
+	OTbs, am,
+	OTug#1, cols#80, lines#24, xmc#1,
+	OTnl=\n, bel=^G, clear=^Z, cr=\r, cub1=^H, cud1=\n, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW,
+	dl1=\ER, ed=\EY, el=\ET, home=^^, hts=\E1, ich1=\EQ, il1=\EE,
+	is2=\Eq\Ek\Em\EA\Ex0, kbs=^H, kcub1=^H, kcud1=\n, kcuf1=^L,
+	kcuu1=^K, kf0=^A@\r, kf1=^AA\r, kf2=^AB\r, kf3=^AC\r,
+	kf4=^AD\r, kf5=^AE\r, kf6=^AF\r, kf7=^AG\r, kf8=^AH\r,
+	kf9=^AI\r, rmir=, rmso=\Ek, rmul=\Em, smir=, smso=\Ej,
+	smul=\El, tbc=\E3,
+
+#### Console types for obsolete UNIX clones
+#
+# Coherent, Minix, Venix, and several lesser-known kin were OSs for 8088
+# machines that tried to emulate the UNIX look'n'feel.  Coherent and Venix
+# were commercial, Minix an educational tool sold in conjunction with a book.
+# Memory-segmentation limits and a strong tendency to look like V7 long after
+# it was obsolete made all three pretty lame.  Venix croaked early.  Coherent
+# and Minix were ported to 32-bit Intel boxes, only to be run over by a
+# steamroller named `Linux' (which, to be fair, traces some lineage to Minix).
+# Coherent's vendor, the Mark Williams Company, went belly-up in 1994.  There
+# are also, I'm told, Minix ports that ran on Amiga and Atari machines and
+# even as single processes under SunOS and the Macintosh OS.
+#
+
+# See
+#	https://web.archive.org/web/20120703021949/http://www.minix3.org/manpages/html4/console.html
+minix|minix console (v3),
+	NQ,
+	acsc=+\020\,\021-\030.^Y0\333`\004a\261f\370g\361h\260j
+	     \331k\277l\332m\300n\305o~p\304q\304r\304s_t\303u\264v
+	     \301w\302x\263y\363z\362{\343|\330}\234~\376,
+	kdch1=^?, kend=\E[Y, kf0=\E[21~, kf1=\E[11~, kf10=\E[21~,
+	kf11=\E[11;2~, kf12=\E[12;2~, kf13=\E[13;2~,
+	kf14=\E[14;2~, kf15=\E[15;2~, kf16=\E[17;2~,
+	kf17=\E[18;2~, kf18=\E[19;2~, kf19=\E[20;2~, kf2=\E[12~,
+	kf20=\E[21;2~, kf21=\E[11;5~, kf22=\E[12;5~,
+	kf23=\E[13;5~, kf24=\E[14;5~, kf25=\E[15;5~,
+	kf26=\E[17;5~, kf27=\E[18;5~, kf28=\E[19;5~,
+	kf29=\E[20;5~, kf3=\E[13~, kf30=\E[21;5~, kf31=\E[11;6~,
+	kf32=\E[12;6~, kf33=\E[13;6~, kf34=\E[14;6~,
+	kf35=\E[15;6~, kf36=\E[17;6~, kf37=\E[18;6~,
+	kf38=\E[19;6~, kf39=\E[20;6~, kf4=\E[14~, kf40=\E[21;6~,
+	kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~,
+	kich1=\E[@, knp=\E[U, kpp=\E[V, lf0@, lf1@, lf2@, lf3@, lf4@, lf5@,
+	use=minix-3.0,
+
+minix-3.0|minix console (v3.0),
+	use=ecma+color, use=minix-1.7,
+
+# See
+#	https://web.archive.org/web/20030914201935/http://www.minix-vmd.org/pub/Minix-vmd/1.7.0/wwwman/man4/console.4.html
+# This matches the entry provided with minix 1.7.4, with bogus :ri: removed.
+minix-1.7|minix console (v1.7),
+	am, xenl, xon@,
+	el1=\E[2K, is2=\E[0m, lf0=End, lf1=PgUp, lf2=PgDn, lf3=Num +,
+	lf4=Num -, lf5=Num 5, use=minix-1.5,
+# Corrected Jan 14, 1997 by Vincent Broman <broman@nosc.mil>
+minix-old|minix-1.5|minix console (v1.5),
+	xon, NQ,
+	cols#80, it#8, lines#25,
+	bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[0J, cr=\r,
+	cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=\E[B,
+	cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH,
+	cuu=\E[%p1%dA, cuu1=\E[A, dch=\E[%p1%dP, dch1=\E[P,
+	dl=\E[%p1%dM, dl1=\E[M, ed=\E[0J, el=\E[K, home=\E[H, ht=^I,
+	ich=\E[%p1%d@, ich1=\E[@, il=\E[%p1%dL, il1=\E[L, ind=\n,
+	kbs=^H, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A,
+	kf0=\E[Y, kf1=\E[V, kf2=\E[U, kf3=\E[T, kf4=\E[S, kf5=\E[G,
+	khome=\E[H, nel=\r\n, rev=\E[7m, ri=\EM, rmso=\E[0m,
+	rmul=\E[0m, sgr0=\E[0m, smso=\E[7m, smul=\E[4m,
+# The linewrap option can be specified by editing /usr/include/minix/config.h
+# before recompiling the minix 1.5 kernel.
+minix-old-am|minix console with linewrap,
+	am, use=minix-old,
+
+pc-minix|minix console on an Intel box,
+	use=klone+acs, use=minix-3.0,
+
+# According to the Coherent 2.3 manual, the PC console is similar
+# to a z19. The differences seem to be (1) 25 lines, (2) no status
+# line, (3) standout is broken, (4) ins/del line is broken, (5)
+# has blinking and bold.
+pc-coherent|pcz19|coherent|IBM PC console running Coherent,
+	am, mir,
+	cols#80, it#8, lines#25,
+	bel=^G, clear=\EE, cr=\r, cub1=^H, cud1=\EB, cuf1=\EC,
+	cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, dch1=\EN,
+	ed=\EJ, el=\EK, home=\EH, ht=^I, ind=\n, kbs=^H, kcub1=\ED,
+	kcud1=\EB, kcuf1=\EC, kcuu1=\EA, khome=\EH, ri=\EI, rmir=\EO,
+	rmso=\Eq, sgr0=\Eq, smir=\E@, smso=\Ep,
+
+# According to the Venix 1.1 manual, the PC console is similar
+# to a DEC VT52.  Differences seem to be (1) arrow keys send
+# different strings, (2) enhanced standout, (3) added insert/delete line.
+# Note in particular that it doesn't have automatic margins.
+# There are other keys (f1-f10, kpp, knp, kcbt, kich1, kdch1) but they
+# not described here because this derives from an old termcap entry.
+pc-venix|venix|IBM PC console running Venix,
+	cols#80, it#8, lines#25,
+	bel=^G, clear=\EH\EJ, cr=\r, cub1=^H, cud1=\n, cuf1=\EC,
+	cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, dl1=\EM,
+	ed=\EJ, el=\EK, ht=^I, il1=\EL, ind=\n, kbs=^H, kcub1=\EK,
+	kcud1=\EP, kcuf1=\EM, kcuu1=\EH, khome=\EG, ri=\EI,
+
+#### Miscellaneous microcomputer consoles
+#
+# If you know anything more about any of these, please tell me.
+#
+
+# The MAI Basic Four computer was obsolete at the end of the 1980s.
+# It may be used as a terminal by putting it in "line" mode as seen on
+# one of the status lines.
+# Initialization is similar to CIT80. <is2> will set ANSI mode for you.
+# Hardware tabs set by <if> at 8-spacing.  Auto line wrap causes glitches so
+# wrap mode is reset by <cvvis>.  Using <ind>=\E[S caused errors so I
+# used \ED instead.
+# From: bf347@lafn.org (David Lawyer), 28 Jun 1997
+mai|basic4|MAI Basic Four in ANSI mode,
+	am, da, db, mir, msgr,
+	cols#82, it#8, lines#25,
+	bel=^G, blink=\E[5m, bold=\E[1m, clear=^]^_, cnorm=\E[?7h,
+	cr=\r, csr=\E[%i%p1%d;%p2%dr, cub1=^H, cud1=\n, cuf1=^X,
+	cup=\E[%i%p1%d;%p2%dH, cuu1=^Z, cvvis=\E[?7l, dch1=\E[1P,
+	dl1=\E[M, ed=^_, el=^^, home=^], ht=^I,
+	if=/usr/share/tabset/vt100, il1=\E[L, ind=\ED,
+	is2=\E>\E[?1h\E[?7h\E[?5l\017\E(B\E[m\E[20l\E[1;24r\E[24;1H,
+	kbs=^H, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
+	kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf5=\EOT, kf6=\EOU,
+	kf7=\EOV, kf8=\EOW, nel=\r\ED, rc=\E8, rev=\E[7m, ri=\E[T,
+	rmir=\E[4l, rmso=\E[m, rmul=\E[m, sc=\E7, sgr0=\E[m,
+	smir=\E[4h, smso=\E[7m, smul=\E[4m,
+# basis from Peter Harrison, Computer Graphics Lab, San Francisco
+#   ucbvax!ucsfmis!harrison ...uucp / ucbvax!ucsfmis!harrison@BERKELEY ...ARPA
+#
+# On Sat, 7 Aug 1999, Torsten Jerzembeck <toje@nightingale.ms.sub.org> wrote:
+# The Basis 108 was a Apple II clone, manufactured by the "Basis
+# Mikrocomputer GmbH" in Munster, Germany (the company still exists today,
+# about 1,5 km from where I live, but doesn't build own computers any
+# more). A Basis 108 featured a really heavy (cast aluminium?) case, was
+# equipped with one or two 5.25" disk drives, had a monochrome and colour
+# video output for a TV set or a dedicated monitor and several slots for
+# Apple II cards. Basis 108 were quite popular at german schools before
+# the advent of the IBM PC. They run, for example, the UCSD Pascal
+# development system (which I used even in 1993 to program the steering
+# and data recording for our school's experimental solar panel :), Apple DOS
+# or CP/M.
+# (basis: removed obsolete ":ma=^K^P^R^L^L :nl=5000*^J:" -- esr)
+basis|BASIS108 computer with terminal translation table active,
+	clear=\E*$<300/>, cud1=\n$<5000/>, ed=\EY, el=\ET, kbs=^H,
+	kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K, rmso=\E), sgr0=\E),
+	smso=\E(, use=adm3a,
+# luna's BMC terminal emulator
+luna|luna68k|LUNA68K Bitmap console,
+	cols#88, lines#46, use=ansi-mini,
+megatek|pegasus workstation terminal emulator,
+	am, os,
+	cols#83, lines#60,
+# The Xerox 820 was a Z80 micro with a snazzy XEROX PARC-derived
+# interface (pre-Macintosh by several years) that went nowhere.
+xerox820|x820|Xerox 820,
+	am,
+	cols#80, lines#24,
+	bel=^G, clear=\032$<1>, cr=\r, cub1=^H, cud1=\n, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, ed=^Q, el=^X,
+	home=^^, ind=\n,
+
+#### Videotex and teletext
+#
+
+# \E\:1}	switch to te'le'informatique mode (ascii terminal/ISO 6429)
+# \E[?3l	80 columns
+# \E[?4l	scrolling on
+# \E[12h	local echo off
+# \Ec		reset: G0 U.S. charset (to get #,@,{,},...), 80 cols, clear screen
+# \E)0		G1 DEC set (line graphics)
+#
+# From: Igor Tamitegama <igor@ppp1493-ft.teaser.fr>, 18 Jan 1997
+m2-nam|minitel|minitel-2|minitel-2-nam|France Telecom Minitel 2 mode te'le'informatique,
+	OTbs, eslok, hs, xenl,
+	cols#80, it#8, lines#24, wsl#72, xmc#0,
+	acsc=aaffggjjkkllmmnnooqqssttuuvvwwxx, bel=^G,
+	blink=\E[5m, bold=\E[1m, civis=\E[<1h, clear=\E[H\E[J,
+	cnorm=\E[<1l, cr=\r, csr=\E[%i%p1%d;%p2%dr,
+	cub=\E[%p1%dD, cub1=\E[D, cud=\E[%p1%dB, cud1=\E[B,
+	cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH,
+	cuu=\E[%p1%dA, cuu1=\E[A, dch=\E[%p1%dP, dch1=\E[P,
+	dl=\E[%p1%dM, dl1=\E[M, ed=\E[J, el=\E[K, flash=^G, fsl=\n,
+	home=\E[H, ht=^I, il=\E[%p1%dL, il1=\E[L, ind=\n, ip=$<7/>,
+	is1=\E:1}\Ec\E[?4l\E[12h, is2=\Ec\E[12h\E)0,
+	is3=\E[?3l, kbs=^H, kclr=\E[2J, kcub1=\E[D, kcud1=\E[B,
+	kcuf1=\E[C, kcuu1=\E[A, kdch1=\E[P, kdl1=\E[M, kf0=\EOp,
+	kf1=\EOq, kf10=\EOp, kf2=\EOr, kf3=\EOs, kf4=\EOt, kf5=\EOu,
+	kf6=\EOv, kf7=\EOw, kf8=\EOx, kf9=\EOy, khome=\E[H,
+	kich1=\E[4h, kil1=\E[4l, knp=\EOn, kpp=\EOR, ll=\E[24;80H,
+	mc0=\E[i, nel=\r\n, rc=\E8, rev=\E[7m, ri=\EM, rmacs=^O,
+	rmir=\E[4l, rmso=\E[27m, rmul=\E[24m,
+	rs1=\Ec\E[?4l\E[12h, rs2=\Ec\E)0, sc=\E7, sgr0=\E[m,
+	smacs=^N, smir=\E[4h, smso=\E[7m, smul=\E[4m, tsl=^_@A,
+	use=ansi+cpr,
+
+# From: Alexandre Montaron <canal@mygale.org>, 18 Jun 1998, updated 19 Sep 2016
+#
+minitel1|minitel 1,
+	am, bw, eslok, hs, hz, .msgr, G0,
+	colors#8, cols#40, lines#24, pairs#8, .ncv#16,
+	acsc=j+k+l+m+n+o~q`s_t+u+v+w+x|, bel=^G, blink=\EH,
+	civis=^T, clear=^L, cnorm=^Q, cr=\r, cub1=^H, cud1=\n, cuf1=^I,
+	cup=\037%p1%'A'%+%c%p2%'A'%+%c, cuu1=^K,
+	dsl=\037@A\030\n, el=^X,
+	flash=\037@A\EW \177\022\177\022P\r\030\n, fsl=\n,
+	home=^^, ind=\n, is2=\E;`ZQ\E:iC\E:iE\021, kbs=^SG,
+	kcan=^SE, kend=^SI, kent=^SA, khlp=^SD, knp=^SH, kpp=^SB,
+	krfr=^SC, nel=\r\n, op=\EG, rep=%p1%c\022%p2%'?'%+%c,
+	rev=\E], ri=^K, rmso=\E\\,
+	rs2=\024\037XA\030\n\030\n\030\n\030\n\030\n\030\n\030\n
+	    \030\n\030\n\030\n\030\n\030\n\030\n\030\n\030\n\030\n
+	    \030\n\030\n\030\n\030\n\030\n\030\n\030\n\030\014
+	    \021,
+	setab=\0, setaf=\E%p1%'@'%+%c, setb=\0,
+	setf=\E%?%p1%{1}%=%tD%e%p1%{3}%=%tF%e%p1%{4}%=%tA%e%p1%{6}%=
+	     %tC%e%p1%'@'%+%c%;,
+	sgr=%?%p1%t\E]%;%?%p3%t\E]%;%?%p4%t\EH%;,
+	sgr0=\EI\E\\\EG, smso=\E], tsl=\037@%p1%'A'%+%c,
+	u6=\037%c%'A'%-%c%'A'%-, u7=\Ea,
+	u8=\001%[BCDEFGHIJKLbcresdfg0123456789]\004, u9=\E9{,
+	.dim=\EB, .hup=\E9g, .rs2=^L, .u8=^ABr4^D,
+	C0=`>a9f!j%k4l<m-n=p#q\,rpt=u5v-w<x5yvzy|l~$, E0=^O,
+	S0=^N,
+	XC=B\031%\,\241!\,\242"\,\243#\,\244$\,\245%\,\246&\,\247'\,
+	   \250(\,\253+\,\257P\,\2600\,\2611\,\2622\,\2633\,\2655\,
+	   \2677\,\272k\,\273;\,\274<\,\275=\,\276>\,\277?\,\300AA\,
+	   \301BA\,\302CA\,\303DA\,\304HA\,\305JA\,\306a\,\307KC\,
+	   \310AE\,\311BE\,\312CE\,\313HE\,\314AI\,\315BI\,\316CI\,
+	   \317HI\,\320b\,\321DN\,\322AO\,\323BO\,\324CO\,\325DO\,
+	   \326HO\,\3274\,\330i\,\331AU\,\332BU\,\333CU\,\334HU\,
+	   \335BY\,\336l\,\337{\,\340Aa\,\341Ba\,\342Ca\,\343Da\,
+	   \344Ha\,\345Ja\,\346q\,\347Kc\,\350Ae\,\351Be\,\352Ce\,
+	   \353He\,\354Ai\,\355Bi\,\356Ci\,\357Hi\,\360r\,\361Dn\,
+	   \362Ao\,\363Bo\,\364Co\,\365Do\,\366Ho\,\3678\,\370y\,
+	   \371Au\,\372Bu\,\373Cu\,\374Hu\,\375By\,\376|\,\377Hy\,
+	   \252c\,\,0\017\031%\016\,}#\,f0\,g1\,\\\,\\\,\,+.\,./\,0
+	   \177\,--,
+minitel1b|minitel 1-bistandard (in 40cols mode),
+	mir,
+	cub=\E[%p1%dD, cud=\E[%p1%dB, cuf=\E[%p1%dC,
+	cuu=\E[%p1%dA, dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM,
+	dl1=\E[M, ed=\E[J, el1=\E[1K, il=\E[%p1%dL, il1=\E[L,
+	is1=\E;iYA\E;jYC, kbs@, kcan@, kclr=\E[2J, kctab=^I,
+	kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kdch1=\E[P,
+	kdl1=\E[M, kent@, kf1=^SD, kf10=^Y0, kf11=^Y1, kf12=^Y/,
+	kf13=^Y{1, kf14=^Y{2, kf15=^Y{3, kf16=^Y{4, kf17=^Y{5,
+	kf18=^Y{6, kf19=^Y{7, kf2=^SC, kf20=^Y{8, kf21=^Y{9,
+	kf22=^Y{0, kf23=^Y{*, kf24=^Y{#, kf3=^SF, kf4=^SA, kf5=^SG,
+	kf6=^SE, kf7=^Y8, kf8=^Y\,, kf9=^Y., khlp@, khome=\E[H,
+	kich1=\E[4h, kil1=\E[L, krfr@, lf1=Guide, lf2=Repetition,
+	lf3=Sommaire, lf4=Envoi, lf5=Correction, lf6=Annulation,
+	rmir=\E[4l, smir=\E[4h,
+	u8=\001%[ABCPtuvwxyz0123456789:;<=>?]\004,
+	.ich=\E[%p1%d@, .ich1=\E[@, .kLFT=\E[P, .kRIT=\E[4h,
+	.kb2=^Y{g, .kcbt=^Y{i, .kel=^X, .mc0=\E:|k, .rmkx=\E;jYA,
+	.rs1=\E[4l\E[2l, .smkx=\E;iYA\E;jYC, .u8=^ACu<^D,
+	use=minitel1,
+# rmkx posait des problemes (logout en sortant de vi).
+minitel1b-80|minitel 1-bistandard (standard teleinformatique),
+	am@, bw@, eslok@, hz@, msgr, G0,
+	colors@, cols#80, it#8, pairs@,
+	acsc@, blink=\E[5m, bold=\E[1m, civis=\037@A\024\n,
+	clear=\E[H\E[J, cnorm=\037@A\021\n, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, el=\E[K, home=\E[H,
+	ht=^I, ind=\ED, is1@, is2@, kbs=\EOl, kcan=\EOQ, kend=\E)4\r,
+	kent=\EOM, kf1=\EOq, kf10=\EOp, kf11=\EOP1, kf12=\EOP2,
+	kf13=\EOP3, kf14=\EOP4, kf15=\EOP5, kf16=\EOP6, kf17=\EOP7,
+	kf18=\EOP8, kf19=\EOP9, kf2=\EOr, kf20=\EOP0, kf21=\EOP*,
+	kf22=\EOP#, kf23@, kf24@, kf3=\EOs, kf4=\EOt, kf5=\EOu,
+	kf6=\EOv, kf7=\EOw, kf8=\EOx, kf9=\EOy, khlp=\EOm, knp=\EOn,
+	kpp=\EOR, krfr=\EOS, lf1@, lf2@, lf3@, lf4@, lf5@, lf6@, nel=\EE,
+	op@, rc=\E8, rep@, rev=\E[7m, ri=\EM, rmkx@, rmso=\E[27m,
+	rmul=\E[24m,
+	rs2=\036\E[12H\E[2M\E[H\E[L\E[12H\E[2M\E[H\E[L\E[12H\E[2M\E[
+	    H\E[L\E[12H\E[2M\E[H\E[L\E[12H\E[2M\E[H\E[L\E[12H\E[2M
+	    \E[H\E[L\E[12H\E[2M\E[H\E[L\E[12H\E[2M\E[H\E[L\E[12H\E[2
+	    M\E[H\E[L\E[12H\E[2M\E[H\E[L\E[12H\E[2M\E[H\E[L\E[12H\E[
+	    2M\E[H\E[J\E[m,
+	sc=\E7, setab@, setaf@, setb@, setf@, sgr@, sgr0=\E[m, smkx@,
+	smso=\E[7m, smul=\E[4m,
+	tsl=\037@%?%p1%{63}%<%t%p1%'A'%+%c%e\177%p1%{62}%-%Pa%?%ga
+	    %{1}%&%t\011%;%?%ga%{2}%&%t\011\011%;%?%ga%{4}%&%t\011
+	    \011\011\011%;%?%ga%{07}%>%t\011\011\011\011\011\011
+	    \011\011%;%?%ga%{15}%>%t\011\011\011\011\011\011\011
+	    \011%;%;,
+	u6@, u7@, u8@, u9@, .acsc=}#f[, .enacs=^O, .kb2=\EOPg,
+	.kcbt=\EOPi, .ll=\E[24H, .mc0=\E[i, .rmacs=^O, .rs2=\Ec,
+	.sgr=\E[%?%p1%t7;%;%?%p2%t4;%;%?%p3%t7;%;%?%p4%t5;%;%?%p6%t1
+	     ;%;m,
+	.smacs=^N, C0=}#f[j+k+l+m+n+o~q=s_t+u+v+w+x!0\032,
+	E0=^O, S0=^N,
+	XC=B\016%\017\,\243#\,\247]\,\260[\,\340@\,\347\\\\\,\351{\,
+	   \350}\,\371|\,\300A\,\301A\,\302A\,\303A\,\304A\,\305A\,
+	   \306E\,\307C\,\310E\,\311E\,\312E\,\313E\,\314I\,\315I\,
+	   \316I\,\317I\,\320D\,\321N\,\322O\,\323O\,\324O\,\325O\,
+	   \326O\,\331U\,\332U\,\333U\,\334U\,\335Y\,\337s\,\341a\,
+	   \342a\,\343a\,\344a\,\345a\,\346e\,\352e\,\353e\,\354i\,
+	   \355i\,\356i\,\357i\,\360d\,\361n\,\362o\,\363o\,\364o\,
+	   \365o\,\366o\,\372u\,\373u\,\374u\,\375y\,\377y\,\267.\,
+	   \327x\,\367/\,\261\E7\E[4m+\E8\E[C\,\,0\017%\016\,x|\,y
+	   \E7\E[4m<\E8\E[C\,z\E7\E[4m>\E8\E[C\,g\E7\E[4m+\E8\E[C,
+	use=minitel1b,
+
+minitel1-nb|minitel 1 (40cols) noir & blanc sans couleurs avec bold et dim ...,
+	colors@, pairs@,
+	bold=\EG, clear=^L\EB,
+	cup=\037%p1%'A'%+%c%p2%'A'%+%c\EB, dim=\ED, home=^^\EB,
+	op@, rs2=^L\EB, setab@, setaf@, setb@, setf@,
+	sgr=%?%p1%p3%O%t\E]%;%?%p4%t\EH%;%?%p5%t\ED%;%?%p6%t\EG%;,
+	sgr0=\EI\E\\\EB, tsl=\037@%p1%'A'%+%c\EB, .invis=\E@,
+	use=minitel1,
+
+minitel1b-nb|minitel 1b (40cols) noir & blanc sans couleurs avec bold et dim ...,
+	msgr,
+	colors@, pairs@,
+	acsc=`>a9f!j%k4l<m-n=p#q\,rpt=u5v-w<x5yvzy|l~$,
+	bold=\EG, clear=^L\EB, cup=\E[%i%p1%d;%p2%dH, dim=\ED,
+	home=^^\EB, kend=\E)4\r, kf1=\E$4\r, kf2=\E#4\r,
+	kf3=\E&4\r, kf4=\E!4\r, kf5=\E'4\r, kf6=\E/4\r, knp=\E(4\r,
+	kpp=\E"4\r, op@, rmacs=^O, rs2=^L\EB, setab@, setaf@, setb@,
+	setf@,
+	sgr=%?%p1%p3%O%t\E]%;%?%p4%t\EH%;%?%p5%t\ED%;%?%p6%t\EG%;,
+	sgr0=\EI\E\\\EB, smacs=^N, tsl=\037@%p1%'A'%+%c\EB,
+	u8=\001%[ABCPpqrstuvwxyz{|}~\177]\004\r, .invis=\E@,
+	.u8=\001Cu|\004r, use=minitel1b,
+
+# Note:
+#
+# Faire, Fnct T puis "/" (TS+"?") pour activer les touches en 40cols :
+#
+# TS+Connexion/Fin(Fin),Retour(Page Up),Suite(Page Down),Guide(F1),
+# Repetition(F2),Sommaire(F3),Envoi(F4),Correction(F5),Annulation(F6),
+# Ctrl+7(F7),Ctrl+8(F8),Ctrl+9(F9),Ctrl+0(F10),Ctrl+*(F11),Ctrl+#(F12).
+#
+# Ctrl+Suite-1(F13), Ctrl+Suite-2(F14), Ctrl+Suite-3(F15),
+# Ctrl+Suite-4(F16), Ctrl+Suite-5(F17), Ctrl+Suite-6(F18),
+# Ctrl+Suite-7(F19), Ctrl+Suite-8(F20), Ctrl+Suite-9(F21),
+# Ctrl+Suite-0(F22), Ctrl+Suite-*(F23), Ctrl+Suite-#(F24).
+#
+# Fonctionne par exemple avec Midnight Commander (mc).
+
+minitel2-80|minitel 2 (80cols) avec filets VT100 (DEC),
+	G0,
+	acsc=ffggjjkkllmmnnooqqssttuuvvwwxxyyzz||}},
+	enacs=\E)0, rmacs=^O, smacs=^N, u6=\E[%i%d;%dR,
+	C0=ffggjjkkllmmnnooqqssttuuvvwwxxyyzz||}}, E0=^O,
+	S0=\E)0\016,
+	XC=B%\E(B\,\243\E(3}\,\247\E(R[\,\257\E(3v\,\260\E(3f\,\261
+	   \E(3g\,\265\E(3Y\,\267\E(3~\,\274\E(3O\,\275\E(3P\,\276
+	   \E(3Q\,\277\E(3Z\,\300A\,\301A\,\302A\,\303A\,\304\E(3R\,
+	   \305A\,\306E\,\307C\,\310E\,\311\E(3S\,\312E\,\313E\,
+	   \314\E(3T\,\315I\,\316I\,\317I\,\320D\,\321\E(3W\,\322\E(
+	   3U\,\323O\,\324O\,\325O\,\326O\,\327x\,\331U\,\332U\,
+	   \333U\,\334\E(3V\,\335Y\,\337\E(3{\,\340\E(3A\,\341a\,
+	   \342\E(3B\,\343a\,\344\E(3C\,\345a\,\346e\,\347\E(R\\\\\,
+	   \350\E(3E\,\351\E(3D\,\352\E(3F\,\353\E(3G\,\354i\,\355i
+	   \,\356\E(3H\,\357\E(3I\,\360d\,\361\E(3X\,\362o\,\363o\,
+	   \364\E(3J\,\365o\,\366\E(3K\,\367\E(3h\,\371\E(3L\,\372u
+	   \,\373\E(3M\,\374\E(3N\,\375y\,\377y\,\,0\E)3%\E)0\,\\\,m
+	   \,+k\,.l\,0\177\,-j,
+	use=minitel12-80,
+
+minitel12-80|minitel 12 (80cols),
+	G0,
+	civis=\E[<1h, cnorm=\E[<1l, is2=\E[12h, u6=\E[%i%d;%dH,
+	u7=\E[6n,
+	.acsc=ffggj+k+l+m+n+ovq-swt+u+v+w+xx}}\,m+k.l-j0
+	      \177,
+	.enacs=\E)3, .rmacs=^O, .rs3=\E[?4l, .scs=\E(%p1%c,
+	.smacs=^N,
+	C0=ffggj+k+l+m+n+ovq-swt+u+v+w+xx}}\,m+k.l-j0\177,
+	E0=^O, S0=\E)3\016,
+	XC=B%\E(B\,\243\E(3}\,\247\E(R[\,\257\E(3v\,\260\E(3f\,\261
+	   \E(3g\,\267\E(3~\,\274\E(3O\,\275\E(3P\,\276\E(3Q\,\300A
+	   \,\301A\,\302A\,\303A\,\304A\,\305A\,\306E\,\307C\,\310E
+	   \,\311E\,\312E\,\313E\,\314I\,\315I\,\316I\,\317I\,\320D
+	   \,\321N\,\322O\,\323O\,\324O\,\325O\,\326O\,\327x\,\331U
+	   \,\332U\,\333U\,\334U\,\335Y\,\337\E(3{\,\340\E(3A\,
+	   \341a\,\342\E(3B\,\343a\,\344\E(3C\,\345a\,\346e\,\347\E(
+	   R\\\\\,\350\E(3E\,\351\E(3D\,\352\E(3F\,\353\E(3G\,\354i
+	   \,\355i\,\356\E(3H\,\357\E(3I\,\360d\,\361n\,\362o\,
+	   \363o\,\364\E(3J\,\365o\,\366\E(3K\,\367\E(3h\,\371\E(3L
+	   \,\372u\,\373\E(3M\,\374\E(3N\,\375y\,\377y\,\,0\E)3%\E)0
+	   \,\\\,m\,+k\,.l\,0\177\,-j,
+	use=minitel1b-80,
+
+#
+# Add these in your ~/.screenrc for inputting some special glyphs like french
+# accentuated chars in 40 cols mode:
+#
+# bindkey ^YA digraph '`'  # Saisi accent grave.
+# bindkey ^YB digraph "'"  # Saisi accent aigu.
+# bindkey ^YC digraph '^'  # Saisi accent circonflexe.
+# bindkey ^YH digraph '"'  # Saisi accent trema.
+#
+# bindkey ^Y#      stuff \243  # Livre.
+# bindkey "^Y\047" stuff \247  # Paragraphe.
+# bindkey ^Yj      stuff \306  # AE
+# bindkey ^Yz      stuff \346  # ae
+# bindkey ^YKc     stuff \347  # c cedille.
+#
+
+screen.minitel1|Screen specific for minitel1,
+	ncv@,
+	acsc=++\,\,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxy
+	     yzz||}}~~,
+	bel=\007\E\^ \E\\, bold@, csr@, flash=\Eg\E\^ \E\\, kmous@,
+	rmul@, smul@, u8=\E[?1;2c, use=decid+cpr,
+	use=xterm+x11mouse, use=screen,
+
+screen.minitel1b|Screen specific for minitel1b,
+	kclr=\E[2J, kdl1=\E[M, kf13=^Y{1, kf14=^Y{2, kf15=^Y{3,
+	kf16=^Y{4, kf17=^Y{5, kf18=^Y{6, kf19=^Y{7, kf20=^Y{8,
+	kf21=^Y{9, kf22=^Y{0, kf23=^Y{*, kf24=^Y{#, kil1=\E[L,
+	use=screen.minitel1,
+
+screen.minitel1b-80|screen.minitel2-80|screen.minitel12-80|Screen specific for minitel1b-80 minitel2-80 and minitel12-80,
+	colors@, ncv@, pairs@,
+	bold=\E[1m, kent=\EOM, kf13@, kf14@, kf15@, kf16@, kf17@, kf18@,
+	kf19@, kf20@, kf21@, kf22@, kf23@, kf24@, khlp=\EOm, op@,
+	rmul=\E[24m, setab@, setaf@, setb@, setf@, smul=\E[4m,
+	use=screen.minitel1b,
+
+screen.minitel1-nb|Screen specific for minitel1-nb,
+	colors@, ncv@, pairs@,
+	bold=\E[1m, dim=\E[2m, op@, setab@, setaf@, setb@, setf@,
+	use=screen.minitel1,
+
+screen.minitel1b-nb|Screen specific for minitel1b-nb,
+	colors@, ncv@, pairs@,
+	bold=\E[1m, dim=\E[2m, op@, setab@, setaf@, setb@, setf@,
+	use=screen.minitel1b,
+
+# From: Alexandre Montaron, 29 Sep 2016
+
+linux-m1|Linux Minitel 1 "like" Couleurs,
+	am, bw@, ccc, mir, msgr, xenl,
+	colors#8, it#8, ncv#16, pairs#64,
+	acsc=a\261f\370g\361h\260j\274k\273l\311m\310n\316q\315t
+	     \314u\271v\312w\313x\272y\363z\362{\343|\252~\372,
+	bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[J, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub1=^H, cud1=\n, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, dch=\E[%p1%dP,
+	dch1=\E[P, dim=\E[2m, dl=\E[%p1%dM, dl1=\E[M,
+	ech=\E[%p1%dX, ed=\E[J, el=\E[K, el1=\E[1K, enacs=\E)U,
+	flash=\E[?5h$<100/>\E[?5l, home=\E[H, hpa=\E[%i%p1%d`,
+	ht=^I, hts=\EH, il=\E[%p1%dL, il1=\E[L, ind=\n,
+	initc=\E]P%p1%{15}%&%X%p2%{255}%&%02X%p3%{255}%&%02X%p4
+	      %{255}%&%02X,
+	is2=\E]R\E]P3FFFF80\E[?8c, ka1=\EOw, ka3=\EOy, kb2=\E[G,
+	kbs=^?, kc1=\EOq, kc3=\EOs, kcbt=\E^I, kclr=\E\r, kcub1=\E[D,
+	kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kdl1=\E\E[A, kent=\EOM,
+	kf1=\E[[A, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~,
+	kf13=\E[25~, kf14=\E[26~, kf15=\E[28~, kf16=\E[29~,
+	kf17=\E[31~, kf18=\E[32~, kf19=\E[33~, kf2=\E[[B,
+	kf20=\E[34~, kf3=\E[[C, kf4=\E[[D, kf5=\E[[E, kf6=\E[17~,
+	kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, kil1=\E\E[B,
+	kmous=\E[M, nel=\EE, oc=\E]R\E]P3FFFF80, op=\E[39;49m,
+	rc=\E8, rev=\E[7m, ri=\EM, rmacs=^O, rmam=\E[?7l, rmir=\E[4l,
+	rmpch=\E[10m, rmso=\E[27m, rs1=\Ec, rs3=\E[37;40m\E[8],
+	sc=\E7, setab=\E[4%p1%dm, setaf=\E[3%p1%dm, sgr0=\E[m,
+	smacs=^N, smam=\E[?7h, smir=\E[4h, smpch=\E[11m,
+	smso=\E[7m, tbc=\E[3g, vpa=\E[%i%p1%dd, .VN=\E[?5l,
+	.VR=\E[?5h, .am@, .ich=\E[%p1%d@, .ich1=\E[@, .ll=\E[99H,
+	.rmcup=, .rmul=\E[24m, .smcup=\E]R\E]P3FFFF80\E[?8c,
+	.smul=\E[4m,
+	E3=\E[99H\E[2J\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
+	   \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
+	   \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
+	   \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
+	   \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
+	   \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
+	   \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
+	   \n\n\n\n\n\n\n\n\n\n,
+	use=vt220+pcedit, use=vt220+cvis, use=linux+decid,
+
+# 1. Using double-shapes for VT100 graphical chars (eg: mc).
+# 2. Native brown color corrected to good yellow color.
+# 3. Adding "Insert" and "Delete Line" keys as ESC Up and ESC Down arrow keys.
+# 4. Suppressed nonexistent underlined mode (normally as bright).
+# 5. ich/ich1 not filled because of non-curses programs.
+#--
+# 6. Suppressed nonexistent invisible mode.
+#(7.)Adding forgotten "cub/cud/cuf/cuu" sequences deplacement.
+
+linux-m1b|Linux Minitel 1B "like" Monochrome (Gris/Blanc/Noir+Dim),
+	ccc@,
+	colors@, ncv@, pairs@,
+	acsc@, bold=\E[33m, enacs@, initc@,
+	is2=\E]R\E]P1A9A9A9\E]P2A9A9A9\E]P3FFFFFF\E]P4A9A9A9\E]P5A9A
+	    9A9\E]P6A9A9A9\E]P9FFFFFF\E]PAFFFFFF\E]PBFFFFFF\E]PCFFFF
+	    FF\E]PDFFFFFF\E]PEFFFFFF\E[?2c,
+	oc@, op@, rmacs@, setab=^A, setaf=^A, smacs@, .setab@, .setaf@,
+	.smcup=\E]R\E]P1A9A9A9\E]P2A9A9A9\E]P3FFFFFF\E]P4A9A9A9\E]P5
+	       A9A9A9\E]P6A9A9A9\E]P9FFFFFF\E]PAFFFFFF\E]PBFFFFFF\E]
+	       PCFFFFFF\E]PDFFFFFF\E]PEFFFFFF\E[?2c,
+	use=linux-m1,
+
+linux-m2|Linux Minitel 2 "like" Couleurs (Vert/Blanc/Noir+Bleu),
+	ccc@,
+	colors@, ncv@, pairs@,
+	acsc=++\,\,--..00``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttu
+	     uvvwwxxyyzz{{||}}~~,
+	bold=\E[33m, cnorm=\E[?2c\E[?25h, cvvis=\E[?8c\E[?25h,
+	enacs=\E)0, initc@,
+	is2=\E]R\E]P100A900\E]P200A900\E]P3FFFFFF\E]P400A900\E]P500A
+	    900\E]P600A900\E]P700A900\E]P80000FF\E]P9FFFFFF\E]PAFFFF
+	    FF\E]PBFFFFFF\E]PCFFFFFF\E]PDFFFFFF\E]PEFFFFFF\E]PFFFFFF
+	    F\E[;37m,
+	oc@, op@, rmacs=^O, setab=^A, setaf=^A, sgr0=\E[;37m, smacs=^N,
+	.setab@, .setaf@,
+	.smcup=\E]R\E]P100A900\E]P200A900\E]P3FFFFFF\E]P400A900\E]P5
+	       00A900\E]P600A900\E]P700A900\E]P80000FF\E]P9FFFFFF\E]
+	       PAFFFFFF\E]PBFFFFFF\E]PCFFFFFF\E]PDFFFFFF\E]PEFFFFFF
+	       \E]PFFFFFFF\E[;37m,
+	use=linux-m1,
+
+# From: Alexandre Montaron, 27 May 2020
+linux-s|Linux console with added status line at bottom,
+	hs,
+	clear=\E[255;255H\E[A\E[1J\E[H, csr@,
+	dsl=\E7\E[255H\E[K\E8, ed@, fsl=\E8,
+	iprog=\sbash\s-c\s'echo\s-ne\s"\E[?6l\E[255H\E[A\E[6n"\s;
+	      \sread\s-d\sR\sTMP\s;\sLINES=`echo\s$TMP\s|\scut\s-f1
+	      \s-d\s";"\s|\scut\s-f2\s-d\s"["`\s;\sstty\srows\s$LINE
+	      S\s;\secho\s-ne\s"\E[;"$LINES"r\E[J"',
+	rs1=\E]R, tsl=\E7\E[255;%p1%dH, .rc@, .sc@, use=linux,
+
+# Screen entries counterpart :
+
+screen.linux-m1|Linux m1 specific for screen,
+	ncv@,
+	dim=\E[2m, kbs=^?, kclr=\E\r, kdl1=\E\E[A, kf13=\E[25~,
+	kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, kf17=\E[31~,
+	kf18=\E[32~, kf19=\E[33~, kf20=\E[34~, kil1=\E\E[B, rmul@,
+	smul@, u8=\E[?1;2c,
+	E3=\E[99H\E[2J\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
+	   \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
+	   \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
+	   \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
+	   \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
+	   \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
+	   \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
+	   \n\n\n\n\n\n\n\n\n\n,
+	use=decid+cpr, use=xterm+x11mouse, use=screen,
+
+screen.linux-m1b|Linux m1b specific for screen,
+	colors@, pairs@,
+	op@, setab@, setaf@, setb@, setf@, use=screen.linux-m1,
+
+screen.linux-m2|Linux m2 specific for screen,
+	acsc=++\,\,--..00``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttu
+	     uvvwwxxyyzz{{||}}~~,
+	use=screen.linux-m1b,
+
+# Putty :
+
+putty-m1|Putty Minitel 1 "like" Couleurs,
+	hs,
+	dim@, kf1=\E[11~, kf2=\E[12~, kf3=\E[13~, kf4=\E[14~,
+	kf5=\E[15~, rmul=\E[24m, smul=\E[4m, .E3=\E[300S,
+	use=xterm+alt47, use=putty+screen, use=xterm+sl-twm,
+	use=ecma+index, use=linux-m1,
+
+putty-m1b|Putty Minitel 1B "like" Monochrome (Gris/Blanc/Noir),
+	hs,
+	dim@, kf1=\E[11~, kf2=\E[12~, kf3=\E[13~, kf4=\E[14~,
+	kf5=\E[15~, rmul=\E[24m, smul=\E[4m, .E3=\E[300S,
+	use=xterm+alt47, use=putty+screen, use=xterm+sl-twm,
+	use=ecma+index, use=linux-m1b,
+
+putty-m2|Putty Minitel 2 "like" Couleurs (Vert/Blanc/Noir),
+	hs,
+	acsc=``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{
+	     {||}}~~,
+	dim@, kf1=\E[11~, kf2=\E[12~, kf3=\E[13~, kf4=\E[14~,
+	kf5=\E[15~, rmul=\E[24m, smul=\E[4m, .E3=\E[300S,
+	use=xterm+alt47, use=putty+screen, use=xterm+sl-twm,
+	use=ecma+index, use=linux-m2,
+
+putty+screen|PuTTY with screen resizing extensions (building-block),
+	.WS=\E[8;%p1%d;%p2%dt, Z0=\E[?3h, Z1=\E[?3l,
+
+putty-screen|PuTTY with screen resizing extensions,
+	WS=\E[8;%p1%d;%p2%dt, Z0=\E[?3h, Z1=\E[?3l, use=putty,
+
+screen.putty-m1|Putty m1 specific for screen,
+	dim@, rmul=\E[24m, smul=\E[4m, E3@, use=screen.linux-m1,
+
+screen.putty-m1b|Putty m1b specific for screen,
+	colors@, pairs@,
+	op@, setab@, setaf@, setb@, setf@, use=screen.putty-m1,
+
+screen.putty-m2|Putty m2 specific for screen,
+	acsc=++\,\,--..00``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttu
+	     uvvwwxxyyzz{{||}}~~,
+	use=screen.putty-m1b,
+# From: Alexandre Montaron, 19 Nov 2015, updated 19 Sep 2016
+#
+# He comments:
+# viewdata lacks a true cup capability,
+# so I achieved it with home and cud1/cuf1 sequences only !
+viewdata|Prestel/Viewdata terminals,
+	am, bw, eslok, hz,
+	cols#40, lines#24,
+	bel=^G, civis=^T, clear=^L, cnorm=^Q, cr=\r, cub1=^H, cud1=\n,
+	cuf1=^I,
+	cup=\036%?%p1%{07}%>%t\n\n\n\n\n\n\n\n%;%?%p1%{15}%>%t\n\n
+	    \n\n\n\n\n\n%;%?%p1%{4}%&%t\n\n\n\n%;%?%p1%{2}%&%t\n\n%;
+	    %?%p1%{1}%&%t\n%;%?%p2%{07}%>%t\011\011\011\011\011\011
+	    \011\011%;%?%p2%{15}%>%t\011\011\011\011\011\011\011
+	    \011%;%?%p2%{23}%>%t\011\011\011\011\011\011\011\011%;%?
+	    %p2%{31}%>%t\011\011\011\011\011\011\011\011%;%?%p2%{4}
+	    %&%t\011\011\011\011%;%?%p2%{2}%&%t\011\011%;%?%p2%{1}%&
+	    %t\011%;,
+	cuu1=^K, home=^^, nel=\r\n, rs2=^L, .el=^X, .ind=\n,
+	.rep=%p1%c\022%p2%'?'%+%c, .ri=^K,
+
+viewdata-o|optimized version of Viewdata Prestel/Viewdata terminals,
+	cup=\036%p1%?%p2%{20}%>%t%?%p1%{23}%=%t%Pa%{1}%e%{1}%+%;%;
+	    %Pa%?%ga%{13}%<%t%?%ga%{07}%>%t\n\n\n\n\n\n\n\n%;%?%ga
+	    %{4}%&%t\n\n\n\n%;%?%ga%{2}%&%t\n\n%;%?%ga%{1}%&%t\n%;%e
+	    %{24}%ga%-%Pa%?%ga%{07}%>%t\013\013\013\013\013\013\013
+	    \013%;%?%ga%{4}%&%t\013\013\013\013%;%?%ga%{2}%&%t\013
+	    \013%;%?%ga%{1}%&%t\013%;%;%?%p2%{21}%<%t%?%p2%{07}%>%t
+	    \011\011\011\011\011\011\011\011%;%?%p2%{15}%>%t\011
+	    \011\011\011\011\011\011\011%;%?%p2%{4}%&%t\011\011\011
+	    \011%;%?%p2%{2}%&%t\011\011%;%?%p2%{1}%&%t\011%;%e%{40}
+	    %p2%-%Pa%?%ga%{07}%>%t\010\010\010\010\010\010\010\010%;
+	    %?%ga%{15}%>%t\010\010\010\010\010\010\010\010%;%?%ga
+	    %{4}%&%t\010\010\010\010%;%?%ga%{2}%&%t\010\010%;%?%ga
+	    %{1}%&%t\010%;%?%p1%{23}%=%t\013%;%;,
+	.ll=^^^K, use=viewdata,
+
+# Samples with TERM=viewdata and TERM=viewdata-rv: http://canal.chez.com/blog/
+
+viewdata-rv|Prestel/Viewdata terminals with reverse capabilitie (as green),
+	xmc#1,
+	rmso=\EG, smso=\EB, use=viewdata-o,
+
+######## OBSOLETE VDT TYPES
+#
+# These terminals are *long* dead -- these entries are retained for
+# historical interest only.
+
+#### Amtek Business Machines
+#
+
+# (abm80: early versions of this entry apparently had ":se=\E^_:so=\E^Y",
+# but these caps were commented out in 8.3; also, removed overridden
+# ":do=^J:" -- esr)
+abm80|amtek business machines 80,
+	OTbs, am, bw,
+	cols#80, lines#24,
+	cbt=^T, clear=\E^\, cub1=^H, cud1=\E^K, cuf1=^P,
+	cup=\E\021%p2%{32}%+%c%p1%{32}%+%c, cuu1=\E^L,
+	dl1=\E^S, ed=\E^X, el=\E^O, home=\E^R, il1=\E^Z,
+
+#### Bell Labs blit terminals
+#
+# These were AT&T's official entries.  The 5620 FAQ maintained by
+# David Breneman <daveb@dgtl.com> has this to say:
+#
+#  Actually, in the beginning was the Jerq, and the Jerq was white with a
+#  green face, and Locanthi and Pike looked upon the Jerq and said the Jerq
+#  was good.  But lo, upon the horizon loomed a mighty management-type person
+#  (known now only by the initials VP) who said, the mighty Jerq must stay
+#  alone, and could not go forth into the world. So Locanthi and Pike put the
+#  Jerq to sleep, cloned its parts, and the Blit was brought forth unto the
+#  world. And the Jerq lived the rest of its days in research, but never
+#  strayed from those paths.
+#
+#  In all seriousness, the Blit was originally known as the Jerq, but when
+#  it started to be shown outside of the halls of the Bell Labs Research
+#  organization, the management powers that be decided that the name could
+#  not remain. So it was renamed to be Blit. This was in late 1981.
+#
+# (The AT&T 5620 was the commercialized Blit.  Its successors were the 630,
+# 730, and 730+.)
+#
+
+blit|jerq|blit running teletype rom,
+	am, eo, ul, xon,
+	cols#87, it#8, lines#72,
+	bel=^G, clear=^L, cr=\r, cub1=\ED, cud1=\n, cuf1=\EC,
+	cup=\EY%p2%{32}%+%c%p1%{32}%+%c, cuu1=\EA,
+	dch=\Ee%p1%{32}%+%c, dch1=\Ee!, dl=\EE%p1%{32}%+%c,
+	dl1=\EE!, el=\EK, ht=^I, ich=\Ef%p1%{32}%+%c, ich1=\Ef!,
+	il=\EF%p1%{32}%+%c, il1=\EF!, ind=\n, kbs=^H, kcub1=\ED,
+	kcud1=\EB, kcuf1=\EC, kcuu1=\EA, kf1=\Ex, kf2=\Ey, kf3=\Ez,
+
+# (cbblit: here's a BSD termcap that says <cud1=\EG> -- esr)
+cbblit|fixterm|blit running columbus code,
+	cols#88,
+	ed=\EJ, flash=\E^G, ich1@, mc4=^T, mc5=^R, mc5p=\EP%p1%03d,
+	rmir=\ER, rmso=\EV!, rmul=\EV", smir=\EQ, smso=\EU!,
+	smul=\EU", use=blit,
+
+oblit|ojerq|first version of blit rom,
+	am, da, db, eo, mir, ul, xon,
+	cols#88, it#8, lines#72,
+	bel=^G, clear=^L, cr=\r, cub1=\ED, cud1=\n, cuf1=\EC,
+	cup=\EY%p2%{32}%+%c%p1%{32}%+%c, cuu1=\EA, dch1=\EO,
+	dl=\Ee%p1%{32}%+%c, dl1=\EE, ed=\EJ, el=\EK, flash=\E^G,
+	ht=^I, il=\Ef%p1%{32}%+%c, il1=\EF, ind=\n, kbs=^H, rmir=\ER,
+	smir=\EQ,
+
+#### Bolt, Beranek & Newman (bbn)
+#
+# The BitGraph was a product of the now-defunct BBN Computer Corporation.
+# The parent company, best known as the architects of the Internet, is
+# still around.
+#
+# Jeff DelPapa <dp@world.std.com> writes:
+# The bitgraph was a large white box that contained a monochrome bitmap
+# display, and a 68000 to run it.  You could download code and run it on
+# the cpu, it had 128kb (I think) of memory.  I used one in the late
+# 70's, sure beat a VT100.  It had one strange feature tho -- it used
+# the cpu to bitblt pixels to scroll, it took longer than the refresh
+# rate, and looked like a rubber sheet stretching, then snapping
+# upwards.  It had everything the early mac had, except a floppy drive a
+# small screen (it had a 17" crisp beauty) and a real OS. They (Bolt
+# Beranek and Neuman) sold at most a few hundred of them to the real
+# world.  DOD may have bought more...
+#
+
+# Entries for the BitGraph terminals.  The problem
+# with scrolling in vi can only be fixed by getting BBN to put
+# smarter scroll logic in the terminal or changing vi or padding
+# scrolls with about 500 ms delay.
+#
+# I always thought the problem was related to the terminal
+# counting newlines in its input buffer before scrolling and
+# then moving the screen that much. Then vi comes along and
+# paints lines in on the bottom line of the screen, so you get
+# this big white gap.
+
+bitgraph|bg2.0nv|bg3.10nv|BBN BitGraph 2.0 or later (normal video),
+	flash=\E[?5h$<200/>\E[?5l, is2=\E>\E[?5l\E[?7h,
+	use=bg2.0,
+bg2.0rv|bg3.10rv|BBn BitGraph 2.0 (reverse video),
+	flash=\E[?5l$<200/>\E[?5h, is2=\E>\E[?5h\E[?7h,
+	use=bg2.0,
+bg2.0|bg3.10|BBN BitGraph 2.0 or later (no init),
+	OTbs, xenl,
+	cols#85, lines#64,
+	bel=^G, clear=\E[H\E[J$<150>, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub1=^H, cud1=\E[B, cuf1=\E[C,
+	cup=%i\E[%p1%d;%p2%dH, cuu1=\E[A, dl1=\E[M$<2*>,
+	ed=\E[J$<150>, el=\E[K$<2>, ht=^I, il1=\E[L$<2*>,
+	ind=\n$<280>, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C,
+	kcuu1=\E[A, kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, lf1=PF1,
+	lf2=PF2, lf3=PF3, lf4=PF4, rc=\E8, rmkx=\E>, rmso=\E[m, sc=\E7,
+	sgr0=\E[m, smkx=\E=, smso=\E[7m,
+
+bg1.25rv|BBN BitGraph 1.25 (reverse video),
+	flash=\E[?5l$<200/>\E[?5h, is2=\E>\E[?5h\E[?7h,
+	use=bg1.25,
+bg1.25nv|BBN BitGraph 1.25 (normal video),
+	flash=\E[?5h$<200/>\E[?5l, is2=\E>\E[?5l\E[?7h,
+	use=bg1.25,
+# (bg1.25: I added <rmam>/<smam> based on the init string -- esr)
+bg1.25|BBN BitGraph 1.25,
+	cols#85, lines#64,
+	bel=^G, clear=\E[H\E[J$<150>, cr=\r, cub1=^H, cud1=\E[B,
+	cuf1=\E[C, cup=%i\E[%p1%d;%p2%dH, cuu1=\E[A,
+	dl1=\E[M$<2*>, ed=\E[J$<150>, el=\E[K$<2>, ht=^I,
+	il1=\E[L$<2*>, ind=\n$<280>, kcub1=\ED, kcud1=\EB,
+	kcuf1=\EC, kcuu1=\EA, kf1=\EP, kf2=\EQ, kf3=\ER, kf4=\ES,
+	lf1=PF1, lf2=PF2, lf3=PF3, lf4=PF4, ll=\E[64;1H, rmam=\E[?7l,
+	rmkx=\E>, rmso=\E[m, sgr0=\E[m, smam=\E[?7h, smkx=\E=,
+	smso=\E[7m,
+
+#### Bull (bq, dku, vip)
+#
+# (Adapted for terminfo; AIX extension capabilities translated -- esr)
+
+#============================================#
+# BULL QUESTAR 210 `SDP' terminals emulation #
+#============================================#
+#
+# Description written by R.K.Saunders (Bull Transac)
+#
+# Modifications written by F. Girard (Bull MTS)
+#		19-05-87 V02.00.01
+#		17-12-87 V02.00.02
+#		15-09-89 V02.00.05
+#
+#	Typical technical selections F1 (modes SDP/ROLL):
+# -------------------------------------------------------
+# |   01   02   03   04   05   06   07   08   09   10   |
+# |  1010 0011 1010 0110 0110 0001 0100 0000 0000 0000  |
+# |                                                     |
+# |   11   12   13   14   15   16   17   18   19   20   |
+# |  0000 0110 100? 0000 0000 0000 0001 0000 0000 0001  |
+# |                                                     |
+# |   21   22   23   24   25   26   27   28   29   30   |
+# |  0011 0000 0001 1000 0000 0000 0000 0000 0000 0000  |
+# |                                                     |
+# |   31   32   33   34   35   36   37   38   39   40   |
+# |  1010 0011 0000 0000 0000 0000 0000 0000 0000 0000  |
+# -------------------------------------------------------
+#	Typical firmware identification F5 "etat 6":
+#  P287.02.04b	(AZERTY)
+#  P297.11.04	(24-pin: 2732)	or P798.11.04	(28-pin: 2764)
+#  P298.03.03	(monochrome)	or P374.03.02	(colour)
+#
+#	SM SDP mode (VIP command):	^[[?=h
+#	RIS (erases screen):		^[c
+#	DMI disable keyboard:		^[`
+#	SM double rendition mode:	^[[?>h
+#	RM solicited status mode:	^[[5l
+#	RM character mode:		^[[>l
+#	RM echoplex mode:		^[[12l
+#	RM column tab mode:		^[[18l
+#	RM forbid SS2 keyboard mode:	^[[?<l
+#	SM scroll mode:			^[[=h
+#	FCF enable XON/XOFF:		^[P1s^[\
+#	MTL select end msg character:	^[[^Wp
+#	EMI enable keyboard:		^[b
+#	RIS retour etat initial:	^[c
+#	enable FC keypad:		^[[?<h,
+#	MPW map status line window:	^[PY99:98^[\
+#	SCP select status line:		^[[0;98v
+#	ED erase entire partition:	^[[2J
+#	SCP select main partition:	^[[v
+#	SM character insertion mode:	^[[4h
+#	RM character replacement mode:	^[[4l
+#	COO cursor on:			^[[r
+#	COO cursor off:			^[[1r
+#	SGR dim (turquoise) rev attr:	^[[2;7m
+#	SGR Data normal attr:		^[[m
+#	SO Line-graphic mode ON:	^N
+#	SI Line-graphic mode OFF:	^O
+#	MC start routing to printer:	^[[5i
+#	MC stop routing to printer:	^M^[[4i
+#
+
+# This entry covers the following terminals:
+# dku7102, tws2102, and tws models 2105 to 2112
+tws-generic|dku7102|Bull Questar tws terminals,
+	am, eslok, hs, mir, msgr, xenl, xhp@, xon,
+	cols#80, it#8, lines#24, wsl#80,
+	acsc=``aaffggj)k\,l&m#n/ooppq*rrsst'u-v+w.x%yyzz{{||}}~~,
+	bel=^G, blink=\E[0;5m, cbt=\E[Z, civis=\E[1r, clear=\E[2J,
+	cnorm=\E[r, cr=\r, cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB,
+	cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%df,
+	cuu=\E[%p1%dA, cuu1=\E[A, dch=\E[%p1%dP, dch1=\E[P,
+	dim=\E[0;2m, dl=\E[%p1%dM, dl1=\E[M,
+	dsl=\EPY99:98\E\\\E[0;98v\E[2J\E[v, ed=\E[J, el=\E[K,
+	fsl=\E[v, home=\E[H, ht=\E[I, hts=\EH, il=\E[%p1%dL,
+	il1=\E[L, ind=\n, invis=\E[0;8m,
+	is1=\E[?=h\Ec\E`\E[?>h\EPY99:98\E\\,
+	is2=\E[5;>;12;18;?<l\E[=h\EP1s\E\\\E[\027p,
+	is3=\Eb\E[?<h, kbs=^H, kcbt=\E[Z, kctab=\E[g, kcub1=\E[D,
+	kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kdch1=\E[P, kdl1=\E[M,
+	ked=\E[J, kel=\E[K, kf1=\E[1u\027, kf2=\E[2u\027,
+	kf3=\E[3u\027, kf4=\E[4u\027, kf5=\E[5u\027,
+	kf6=\E[6u\027, kf7=\E[7u\027, kf8=\E[8u\027, khome=\E[H,
+	khts=\EH, kil1=\E[L, krmir=\E[4l, ll=\E[H\E[A, mc0=\E[0i,
+	mc4=\r\E[4i, mc5=\E[5i, rev=\E[0;7m, rmacs=^O,
+	rmcup=\E[0;98v\E[2J\E[v, rmir=\E[4l, rmso=\E[m,
+	rmul=\E[m, rs2=\E[?=h\Ec, s0ds=^O, s1ds=^N,
+	sgr=\E[0%?%p1%p3%|%t;7%;%?%p2%t;4%;%?%p4%t;5%;%?%p5%t;2%;%?
+	    %p7%t;8%;m%?%p9%t\016%e\017%;,
+	sgr0=\E[m\017, smacs=^N, smcup=\E[?>h\EPY99:98\E\\,
+	smir=\E[4h, smso=\E[0;7m, smul=\E[0;4m, tbc=\E[3g,
+	tsl=\EPY99:98\E\\\E[0;98v\E[2;7m,
+tws2102-sna|dku7102-sna|Bull Questar tws2102 for SNA,
+	dsl=\E[0;98v\E[2J\E[v, fsl=\E[v, is3=\Eb, tsl=\E[0;98v,
+	use=tws-generic,
+tws2103|xdku|Bull Questar tws2103,
+	ht=^I, use=tws-generic,
+tws2103-sna|dku7103-sna|Bull Questar tws2103 for SNA,
+	ht=^I, use=tws2102-sna,
+dku7102-old|Bull Questar 200 DKU7102 (microcode version < 6),
+	clear=\E[2J\E[H, cup@, dl@, dl1@,
+	dsl=\EPY99:98\E\\\E[0;98v\E[2J\E[H\E[v, el=\E[K\E[m,
+	il@, il1@, tsl=\EPY99:98\E\\\E[0;98v\E[H\E[2;7m,
+	use=tws-generic,
+dku7202|Bull Questar 200 DKU7202 (colour/character attributes),
+	blink=\E[0;2;4m, dim=\E[0;5m, ht=^I, is3=\E[?3h\Eb,
+	sgr=\E[0%?%p1%t;2;4;5;7%;%?%p3%t;7%;%?%p2%t;2%;%?%p4%t;2;4%;
+	    %?%p5%t;5%;%?%p7%t;8%;m%?%p9%t\016%e\017%;,
+	smso=\E[0;4;5;7m, smul=\E[0;2m, use=tws-generic,
+
+#=========================================================#
+# BULL QUESTAR 303 & 310 `DEC VT 320' terminals emulation #
+#=========================================================#
+#
+# Description written by J. Staerck (BULL SA)
+#       Copyright (c) 1989 BULL SA
+#---------------------------------------------------------------------------
+#  This entry is used for terminals with VT320 emulation mode
+#  and following set-up :
+#    8 bit ISO Latin Character Set (ISO 8859-1),
+#    7 bit Control Characters,
+#    80 columns screen.
+#  Hereafter are some DEC vt terminals' commands. (valid on VT200 and 300)
+#  They are used in string capabilities with VT220-320 emulation mode.
+#  In the following DEC definitions, two kinds of terminfo databases are
+#    provided :
+#    1. the first with Command Sequence Introducer starting with escape
+#       sequence in 7 bits characters ex. ESC [ : 2 chars. in 7-bit mode.
+#    2. the second with Command Sequence Introducer starting with escape
+#       sequence in 8 bits characters ex. ESC [ : 1 char. 'CSI' =x9B.
+#	Soft Terminal Reset		esc [ ! p
+#	RIS (erases screen):		esc c
+#	DECKPNM numeric keypad mode:	esc >
+#	DECKPAM applic. keypad mode:	esc =
+#	DECSTBM Scrolling region:	esc [ r
+#	SCS select G0 = US:		esc ( B
+#	SCS select G1 = line-graphic:	esc ) 0
+#	Select 7-bit C1 controls:	esc sp F
+#	Select 8-bit C1 controls:	esc sp G
+#	Select cursor home:		esc [  H
+#	Select erase screen:		esc [  J
+#	SM KAM lock keyboard:		esc [ 2 h
+#	RM KAM unlock keyboard:		esc [ 2 l
+#	SM SRM local echo off:		esc [ 1 2 h
+#	RM SRM local echo on:		esc [ 1 2 l
+#	SM LNM New line :		esc [ 2 0 h
+#	RM LNM return = CR only:	esc [ 2 0 l
+#	SM DECCKM cursor keys mode:	esc [ ? 1 h
+#	RM DECCKM appli. keys mode:	esc [ ? 1 l
+#	SM DECANM ANSI mode on:		esc [ ? 2 h
+#	RM DECANM ANSI mode off:	esc [ ? 2 l
+#	SM DECCOLM 132-column screen:	esc [ ? 3 h
+#	RM DECCOLM 80-column screen:	esc [ ? 3 l
+#	SM DECSCLM Smooth scroll:	esc [ ? 4 h
+#	RM DECSCLM Jump scroll:		esc [ ? 4 l
+#	SM DECSCNM screen light backgr.	esc [ ? 5 h
+#	RM DECSCNM screen dark backgr.	esc [ ? 5 l
+#	SM DECOM move within margins:	esc [ ? 6 h
+#	RM DECOM move outside margins:	esc [ ? 6 l
+#	SM DECAWM auto right margin:	esc [ ? 7 h
+#	RM DECAWM auto right margin:	esc [ ? 7 l
+#	SM DECARM auto repeat:		esc [ ? 8 h
+#	RM DECARM auto repeat:		esc [ ? 8 l
+#	DECSASD Select active main:	esc [ 0 $ }
+#	DECSASD Select active status:	esc [ 1 $ }
+#	DECSSDT Select status none:	esc [ 0 $ ~
+#	DECSSDT Select status indic.:	esc [ 1 $ ~
+#	DECSSDT Select status host-wr:	esc [ 2 $ ~
+#	SM DECTCEM Visible cursor:	esc [ ? 2 5 h
+#	RM DECTCEM Invisible cursor:	esc [ ? 2 5 l
+#	SM DECNCRM 7 bits NCR set:	esc [ ? 4 2 h
+#	RM DECNCRM Multi or ISO latin:	esc [ ? 4 2 l
+#	SM DECNKM numeric keypad mode:	esc [ ? 6 6 h
+#	RM DECNKM numeric keypad appl.:	esc [ ? 6 6 l
+#	SM DECKBUM clavier informatique	esc [ ? 6 8 h
+#	RM DECKBUM clavier bureautique:	esc [ ? 6 8 l
+#	DECSCL VT300 mode 8-bit ctrl:	esc [ 6 3 " p
+# or	DECSCL VT300 mode 8-bit ctrl:	esc [ 6 3 ; 0 " p
+# or	DECSCL VT300 mode 8-bit ctrl:	esc [ 6 3 ; 2 " p
+#	DECSCL VT300 mode 7-bit ctrl:	esc [ 6 3 ; 1 " p
+#	Char. and Line attributes:	esc [ Ps ... Ps m
+# with:  0 All off, 1 Bold, 4 Underline, 5 Blinking, 7 Reverse
+# and : 22 Bold off, 24 Underline off, 25 Blinking off, 27 Reverse off
+#
+
+# This entry covers BQ303, BQ306, BQ310, Q303, Q306, Q310
+bq300|Bull VT320 ISO Latin 1 80 columns terminal,
+	am, eo, eslok, hs, km, mir, msgr, xenl, xon,
+	cols#80, it#8, lines#24, vt#3, wsl#80,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[J, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=\E[D,
+	cud=\E[%p1%dB, cud1=\E[B, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M,
+	dsl=\E[1$}\E[2$~\n\E[0$}, ech=\E[%p1%dX, ed=\E[J,
+	el=\E[K, el1=\E[1K, enacs=\E(B\E)0,
+	flash=\E[?5h$<50>\E[?5l, fsl=\E[0$}, home=\E[H, ht=^I,
+	hts=\EH, ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[L, ind=\ED,
+	is1=\E[63;1"p\E[2h,
+	is2=\E[?2h\E[?3l\E[?5l\E[?7h\E[?8h\E>\E[?1l\E\sF\E[?42l\E[?4
+	    l,
+	is3=\E[0$}\E[?25h\E[2l\E[H\E[J, ka1=\EOw, ka3=\EOy,
+	kb2=\EOu, kbs=^H, kc1=\EOq, kc3=\EOs, kcub1=\E[D, kcud1=\E[B,
+	kcuf1=\E[C, kcuu1=\E[A, kf1=\EOP, kf10=\E[21~, kf11=\E[23~,
+	kf12=\E[24~, kf13=\E[25~, kf14=\E[26~, kf15=\E[28~,
+	kf16=\E[29~, kf17=\E[31~, kf18=\E[32~, kf19=\E[33~,
+	kf2=\EOQ, kf20=\E[34~, kf3=\EOR, kf4=\EOS, kf6=\E[17~,
+	kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, khlp=\E[28~,
+	krdo=\E[29~, lf1=pf1, lf2=pf2, lf3=pf3, lf4=pf4, nel=\EE,
+	rc=\E8, rev=\E[7m, ri=\EM, rmacs=\E(B, rmam=\E[?7l,
+	rmcup=\E[?7h, rmir=\E[4l, rmkx=\E[?1l\E>, rmso=\E[27m,
+	rmul=\E[24m, rs1=\E[!p, rs2=\E[?3l, s0ds=\E(B, s1ds=\E(0,
+	sc=\E7,
+	sgr=\E[%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1
+	    %;m%?%p9%t\E(0%e\E(B%;,
+	sgr0=\E[0m\E(B, smacs=\E(0, smam=\E[?7h,
+	smcup=\E[?7l\E[?1l\E(B, smir=\E[4h, smso=\E[7m,
+	smul=\E[4m, tbc=\E[3g, tsl=\E[1$}\E[2$~, use=ansi+enq,
+	use=vt220+vtedit, use=ansi+pp, use=vt220+cvis,
+bq300-rv|Bull VT320 reverse 80 columns,
+	flash=\E[?5l$<50>\E[?5h,
+	is2=\E[?2h\E[?3l\E[?5h\E[?7h\E[?8h\E>\E[?1l\E\sF\E[?42l\E[?4
+	    l,
+	use=bq300,
+bq300-w|Bull VT320 132 columns,
+	cols#132, wsl#132,
+	is2=\E[?2h\E[?3h\E[?5l\E[?7h\E[?8h\E>\E[?1l\E\sF\E[?42l\E[?4
+	    l,
+	rs2=\E[?3h, use=bq300,
+bq300-w-rv|Bull VT320 reverse mode 132 columns,
+	cols#132, wsl#132,
+	flash=\E[?5l$<50>\E[?5h,
+	is2=\E[?2h\E[?3h\E[?5h\E[?7h\E[?8h\E>\E[?1l\E\sF\E[?42l\E[?4
+	    l,
+	rs2=\E[?3h, use=bq300,
+
+#  This entry is used for terminals with VT320 emulation mode
+#  and following set-up :
+#    8 bit ISO Latin Character Set (ISO 8859-1),
+#    8 bit Control Characters, (CSI coded as x9B for ESC [)
+#    80 columns screen.
+#	Soft Terminal Reset		csi ! p
+#	RIS (erases screen):		esc c
+#	DECKPNM numeric keypad mode:	esc >
+#	DECKPAM applic. keypad mode:	esc =
+#	DECSTBM Scrolling region:	esc [ r
+#	SCS select G0 = US:		esc ( B
+#	SCS select G1 = line-graphic:	esc ) 0
+#	Select 7-bit C1 controls:	esc sp F
+#	Select 8-bit C1 controls:	esc sp G
+#	Select cursor home:		csi H
+#	Select erase screen:		csi J
+#	SM KAM lock keyboard:		csi 2 h
+#	RM KAM unlock keyboard:		csi 2 l
+#	SM SRM local echo off:		csi 1 2 h
+#	RM SRM local echo on:		csi 1 2 l
+#	SM LNM New line :		csi 2 0 h
+#	RM LNM return = CR only:	csi 2 0 l
+#	SM DECCKM cursor keys mode:	csi ? 1 h
+#	RM DECCKM appli. keys mode:	csi ? 1 l
+#	SM DECANM ANSI mode on:		csi ? 2 h
+#	RM DECANM ANSI mode off:	csi ? 2 l
+#	SM DECCOLM 132-column screen:	csi ? 3 h
+#	RM DECCOLM 80-column screen:	csi ? 3 l
+#	SM DECSCLM Smooth scroll:	csi ? 4 h
+#	RM DECSCLM Jump scroll:		csi ? 4 l
+#	SM DECSCNM screen light backgr.	csi ? 5 h
+#	RM DECSCNM screen dark backgr.	csi ? 5 l
+#	SM DECOM move within margins:	csi ? 6 h
+#	RM DECOM move outside margins:	csi ? 6 l
+#	SM DECAWM auto right margin:	csi ? 7 h
+#	RM DECAWM auto right margin:	csi ? 7 l
+#	SM DECARM auto repeat:		csi ? 8 h
+#	RM DECARM auto repeat:		csi ? 8 l
+#	DECSASD Select active main:	csi 0 $ }
+#	DECSASD Select active status:	csi 1 $ }
+#	DECSSDT Select status none:	csi 0 $ ~
+#	DECSSDT Select status indic.:	csi 1 $ ~
+#	DECSSDT Select status host-wr:	csi 2 $ ~
+#	SM DECTCEM Visible cursor:	csi ? 2 5 h
+#	RM DECTCEM Invisible cursor:	csi ? 2 5 l
+#	SM DECNCRM 7 bits NCR set:	csi ? 4 2 h
+#	RM DECNCRM Multi or ISO latin:	csi ? 4 2 l
+#	DECSCL VT300 mode 8-bit ctrl:	csi 6 3 " p
+# or	DECSCL VT300 mode 8-bit ctrl:	csi 6 3 ; 0 " p
+#	DECSCL VT300 mode 7-bit ctrl:	csi 6 3 ; 1 " p
+#	Char. and Line attributes:	csi Ps ... Ps m
+# with:  0 All off, 1 Bold, 4 Underline, 5 Blinking, 7 Reverse
+# and : 22 Bold off, 24 Underline off, 25 Blinking off, 27 Reverse off
+# (bq300-8: <cub1>,<cuf1>,<cuu1>,<cud1>,<dl1>,<il1> to get under 1024 --esr)
+bq300-8|Bull VT320 full 8 bits 80 columns,
+	am, eo, eslok, hs, km, mc5i, mir, msgr, xenl, xon,
+	cols#80, it#8, lines#24, vt#3, wsl#80,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, blink=\2335m, bold=\2331m, clear=\233H\233J, cr=\r,
+	csr=\233%i%p1%d;%p2%dr, cub=\233%p1%dD, cub1=\2331D,
+	cud=\233%p1%dB, cud1=\2331B, cuf=\233%p1%dC, cuf1=\2331C,
+	cup=\233%i%p1%d;%p2%dH, cuu=\233%p1%dA, cuu1=\2331A,
+	dch=\233%p1%dP, dch1=\233P, dl=\233%p1%dM, dl1=\233M,
+	dsl=\2331$}\2332$~\n\2330$}, ech=\233%p1%dX, ed=\233J,
+	el=\233K, el1=\2331K, enacs=\E(B\E)0,
+	flash=\233?5h$<50>\233?5l, fsl=\2330$}, home=\233H,
+	ht=^I, hts=\EH, ich=\233%p1%d@, il=\233%p1%dL, il1=\233L,
+	ind=\ED, is1=\E[63;2"p\E[2h,
+	is2=\E[?2h\E[?3l\E[?5l\E[?7h\E[?8h\E>\E[?1l\E\sG\E[?42l\E[?4
+	    l,
+	is3=\2330$}\233?25h\2332l\233H\233J, ka1=\217w,
+	ka3=\217y, kb2=\217u, kbs=^H, kc1=\217q, kc3=\217s,
+	kcub1=\233D, kcud1=\233B, kcuf1=\233C, kcuu1=\233A,
+	kdch1=\2333~, kf1=\217P, kf10=\23321~, kf11=\23323~,
+	kf12=\23324~, kf13=\23325~, kf14=\23326~, kf15=\23328~,
+	kf16=\23329~, kf17=\23331~, kf18=\23332~, kf19=\23333~,
+	kf2=\217Q, kf20=\23334~, kf3=\217R, kf4=\217S, kf6=\23317~,
+	kf7=\23318~, kf8=\23319~, kf9=\23320~, kfnd=\2331~,
+	khlp=\23328~, kich1=\2332~, knp=\2336~, kpp=\2335~,
+	krdo=\23329~, kslt=\2334~, lf1=pf1, lf2=pf2, lf3=pf3,
+	lf4=pf4, mc0=\233i, mc4=\2334i, mc5=\2335i, nel=\EE, rc=\E8,
+	rev=\2337m, ri=\EM, rmacs=\E(B, rmam=\233?7l,
+	rmcup=\233?7h, rmir=\2334l, rmkx=\233?1l\E>,
+	rmso=\23327m, rmul=\23324m, rs1=\E[!p, rs2=\E[?3l,
+	s0ds=\E(B, s1ds=\E(0, sc=\E7,
+	sgr=\233%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;
+	    1%;m%?%p9%t\E(0%e\E(B%;,
+	sgr0=\2330m\E(B, smacs=\E(0, smam=\233?7h,
+	smcup=\233?7l\233?1l\E(B, smir=\2334h, smso=\2337m,
+	smul=\2334m, tbc=\2333g, tsl=\2331$}\2332$~,
+	use=vt220+cvis8,
+bq300-8rv|Bull VT320 8-bit reverse mode 80 columns,
+	flash=\233?5l$<50>\233?5h,
+	is2=\E[?2h\E[?3l\E[?5h\E[?7h\E[?8h\E>\E[?1l\E\sG\E[?42l\E[?4
+	    l,
+	use=bq300-8,
+bq300-8w|Bull VT320 8-bit 132 columns,
+	cols#132, wsl#132,
+	is2=\E[?2h\E[?3h\E[?5l\E[?7h\E[?8h\E>\E[?1l\E\sG\E[?42l\E[?4
+	    l,
+	rs2=\233?3h, use=bq300-8,
+bq300-w-8rv|Bull VT320 8-bit reverse mode 132 columns,
+	cols#132, wsl#132,
+	flash=\233?5l$<50>\233?5h,
+	is2=\E[?2h\E[?3h\E[?5h\E[?7h\E[?8h\E>\E[?1l\E\sG\E[?42l\E[?4
+	    l,
+	rs2=\233?3h, use=bq300-8,
+
+#  This entry is used for terminals with VT320 emulation mode
+#  a 102 keys keyboard (PC scancode !) and following set-up :
+#    8 bit ISO Latin Character Set (ISO 8859-1),
+#    7 bit Control Characters,
+#    80 columns screen.
+bq300-pc|Questar 303 with PC keyboard ISO Latin 1 80 columns,
+	kbs=^H, kf1=\E[17~, kf10=\E[28~, kf11=\E[29~, kf12=\E[31~,
+	kf13@, kf14@, kf15@, kf16@, kf17@, kf18@, kf19@, kf2=\E[18~, kf20@,
+	kf3=\E[19~, kf4=\E[20~, kf5=\E[21~, kf6=\E[23~, kf7=\E[24~,
+	kf8=\E[25~, kf9=\E[26~, kfnd@, khlp@, krdo@, kslt@, lf1@, lf2@,
+	lf3@, lf4@, use=vt220+pcedit, use=bq300,
+bq300-pc-rv|Questar 303 with PC keyboard reverse mode 80 columns,
+	flash=\E[?5l$<50>\E[?5h,
+	is2=\E[?2h\E[?3l\E[?5h\E[?7h\E[?8h\E>\E[?1l\E\sF\E[?42l\E[?4
+	    l,
+	use=bq300-pc,
+bq300-pc-w|Questar 303 with PC keyboard 132 columns terminal,
+	cols#132, wsl#132,
+	is2=\E[?2h\E[?3h\E[?5l\E[?7h\E[?8h\E>\E[?1l\E\sF\E[?42l\E[?4
+	    l,
+	rs2=\E[?3h, use=bq300-pc,
+bq300-pc-w-rv|Questar 303 with PC keyboard reverse mode 132 columns,
+	cols#132, wsl#132,
+	flash=\E[?5l$<50>\E[?5h,
+	is2=\E[?2h\E[?3h\E[?5h\E[?7h\E[?8h\E>\E[?1l\E\sF\E[?42l\E[?4
+	    l,
+	rs2=\E[?3h, use=bq300-pc,
+#    8 bit ISO Latin Character Set (ISO 8859-1),
+#    8 bit Control Characters,
+#    80 columns screen.
+bq300-8-pc|Q306-8-pc|Questar 303 with PC keyboard in full 8 bits 80 columns,
+	kbs=^H, kdch1=\2333~, kend=\2334~, kf1=\23317~,
+	kf10=\23328~, kf11=\23329~, kf12=\23331~, kf13@, kf14@,
+	kf15@, kf16@, kf17@, kf18@, kf19@, kf2=\23318~, kf20@,
+	kf3=\23319~, kf4=\23320~, kf5=\23321~, kf6=\23323~,
+	kf7=\23324~, kf8=\23325~, kf9=\23326~, kfnd@, khlp@,
+	khome=\2331~, kich1=\2332~, knp=\2336~, kpp=\2335~, krdo@,
+	kslt@, lf1@, lf2@, lf3@, lf4@, use=bq300-8,
+bq300-8-pc-rv|Questar 303 with PC keyboard full 8 bits reverse mode 80 columns,
+	flash=\E[?5l$<50>\E[?5h,
+	is2=\E[?2h\E[?3l\E[?5h\E[?7h\E[?8h\E>\E[?1l\E\sG\E[?42l\E[?4
+	    l,
+	use=bq300-8-pc,
+bq300-8-pc-w|Questar 303 with PC keyboard full 8 bits 132 columns,
+	cols#132, wsl#132,
+	is2=\E[?2h\E[?3h\E[?5l\E[?7h\E[?8h\E>\E[?1l\E\sG\E[?42l\E[?4
+	    l,
+	rs2=\E[?3h, use=bq300-8-pc,
+bq300-8-pc-w-rv|Questar 303 with PC keyboard full 8 bits reverse 132 columns,
+	cols#132, wsl#132,
+	flash=\E[?5l$<50>\E[?5h,
+	is2=\E[?2h\E[?3h\E[?5h\E[?7h\E[?8h\E>\E[?1l\E\sG\E[?42l\E[?4
+	    l,
+	rs2=\E[?3h, use=bq300-8-pc,
+
+#======================================================#
+# BULL QUESTAR 310 `VIP 7800/8800' terminals emulation #
+#======================================================#
+
+# normal mode, 8 bits, 80 columns terminal.
+#	BLD  bell disable			^[g
+#	BLE  bell enable			^[h
+#	CAMR char. attr. mode reset		^[[G
+#	CAMS char. attr. mode set		^[[D
+#	CLR  clear				^[`
+#	CM   character mode (async.)		^[k
+#	EP   echoplex mode (by host)		^[m
+#	IM   insert mode set			^[[I
+#	IMR  insert mode reset			^[[J
+#	KBL  keyboard lock (reset)		^[[X
+#	KBU  keyboard unlock (set)		^[[W
+#	LGR  Line-graphic mode reset		^[F
+#	LGS  Line-graphic mode set		^[G
+#	NEP  non echoplex mode (by host)	^[l
+#	PDS  print data space			^[[0p
+#	PDT  print data terminator		^[[<p
+#	PHD  print host data			^[[3p
+#	PRES print adapter reset		^[[2p
+#	RBM  block mode reset			^[[E
+#	RES  reset :				^[e
+#	RIS  reset initial state:		^[c
+#	RMR  roll mode reset			^[q
+#	RMS  roll mode set			^[r
+#	SCD  scroll down (72 lines)		^[[1s
+#	SCU  scroll up	(72 lines)		^[[0s
+#	SLL  status line lock			^[O
+#	SLR  status line reset			^[v
+#	SLS  status line set			^[w
+#	SM78 set mode vip7800			^[[1q
+#	SSP0 partition 0 set			^[[00u
+#	SSP1 partition n format 1		^[[PnPnSTRINGu
+#	SSP2 partition n format 2		^[[PnPnSTRINGu
+#	SSP3 partition n format 3		^[[PnPnu
+#	SSPR multi-part. reset			^[[<>u
+#	TBC  tab clear (at cursor pos.)		^[[g
+#	TBI  tab initialize			^[[N
+#	TBS  tab set (at cursor pos.)		^[p
+#
+#	ATR attribute (visual)
+#	    blink :				^[sB
+#	    dim :				^[sL
+#	    hide (blank) :			^[sH
+#	    inverse video :			^[sI
+#	    protected :				^[sP
+#	    reset :				^[sR
+#	    underline :				^[s_
+#
+# This covers the vip7800 and BQ3155-vip7800
+vip|Bull Questar 3155-7800,
+	am, eslok, hs, km, mc5i, msgr, xenl, xon,
+	cols#80, it#8, lines#24, vt#3, wsl#80,
+	acsc=0pjdkblamcnkqitgufvhwexj, bel=^G, blink=\EsB,
+	cbt=\E[Z, clear=\E`, cr=\r, cub1=^H, cud1=\n, cuf1=\EC,
+	cup=\E[%i%p1%03d%p2%03df, cuu1=\EA, dch1=\E[P, dim=\EsL,
+	dl1=\E[M, dsl=\Ev, ed=\EJ, el=\EK,
+	flash=\007$<80>\007$<80>\007, fsl=\EO, home=\EH, ht=^I,
+	hts=\Ep, ich1=\E[I, ind=\n, invis=\EsH,
+	is2=\E[00u\E[<>001001024080024080u\E[01u,
+	is3=\Er\E[W\E`, kHOM=\EH, kLFT=\Eo, kRIT=\Eu, kbs=^H,
+	kcbt=\E[Z, kclr=\E`, kctab=\E[g, kcub1=\ED, kcud1=\EB,
+	kcuf1=\EC, kcuu1=\EA, kdch1=\E[P, kdl1=\E[M, ked=\EJ,
+	kel=\EK, kf1=\E0, kf10=\ET, kf11=\E\\, kf12=\E\^, kf13@, kf14@,
+	kf15@, kf16@, kf17@, kf18@, kf19@, kf2=\E2, kf20@, kf21=\E1,
+	kf22=\E5, kf23=\E7, kf24=\E9, kf25=\E;, kf26=\E=, kf27=\E?,
+	kf28=\EQ, kf29=\ES, kf3=\E6, kf30=\EV, kf31=\E], kf32=\E_,
+	kf4=\E8, kf5=\E:, kf6=\E<, kf7=\E>, kf8=\EP, kf9=\ER,
+	khome=\EH, khts=\Ep, kich1=\E[I, kil1=\E[L, kind=\E[0s,
+	kll=\EH\EA, kri=\E[1s, krmir=\E[J, ktbc=\E[N, lf1=pf1,
+	lf2=pf2, lf3=pf3, lf4=pf4, ll=\EH\EA, mc0=\E[0p, mc4=\E[<p,
+	mc5=\E[3p, nel=\r, prot=\EsP, rev=\EsI,
+	ri=\EA\EJ\EH\E[L$<10>, rmacs=\EF, rmir=\E[J, rmso=\EsR,
+	rmul=\EsR, rs1=\Ec, rs2=\E[G, s0ds=\EF, s1ds=\EG,
+	sgr0=\EsR\EsU\EF, smacs=\EG, smir=\E[I, smso=\EsI,
+	smul=\Es_, tbc=\E[N, tsl=\Ew,
+# normal screen, 8 bits, 132 columns terminal.
+vip-w|vip7800-w|Q310-vip-w|Q310-vip-w-am|Questar 3155-vip7800 wide,
+	cols#132, wsl#132,
+	is2=\E[00u\E[<>001001024132024132u\E[01u, use=vip,
+vip-H|vip7800-H|Q310-vip-H|Q310-vip-H-am|Questar 3155-vip7800 72 lines,
+	lines#72,
+	is2=\E[00u\E[<>001001024080072080u\E[01u, use=vip,
+vip-Hw|vip7800-Hw|Q310-vip-Hw|Questar 3155-vip7800 wide 72 lines,
+	cols#132, lines#72, wsl#132,
+	is2=\E[00u\E[<>001001024132072132u\E[01u, use=vip,
+
+#### Chromatics
+#
+
+# I have put the long strings in <smcup>/<rmcup>. Ti sets up a window
+# that is smaller than the screen, and puts up a warning message
+# outside the window. Te erases the warning message, puts the
+# window back to be the whole screen, and puts the cursor at just
+# below the small window. I defined <cnorm> and <civis> to really turn
+# the cursor on and off, but I have taken this out since I don't
+# like the cursor being turned off when vi exits.
+cg7900|chromatics|chromatics 7900,
+	am,
+	cols#80, lines#40,
+	bel=^G, clear=^L, cr=\r, cub1=^H, cud1=\n, cuf1=^],
+	cup=\001M%p2%d\,%p1%d\,, cuu1=^K, dch1=^A<1, dl1=^A<2,
+	ed=^Al, el=^A`, home=^\, ich1=^A>1, il1=^A>2, ind=\n, ll=^A|,
+	rmcup=\001W0\,40\,85\,48\,\014\001W0\,0\,85\,48\,\001M0\,40
+	      \,,
+	rmso=\001C1\,\001c2\,,
+	smcup=\001P0\001O1\001R1\001C4\,\001c0\,\014\001M0\,42\,WARN
+	      ING\sDOUBLE\sENTER\sESCAPE\sand\s\025\001C1\,\001c2\,
+	      \001W0\,0\,79\,39\,,
+	smso=\001C4\,\001c7\,, uc=^A^A_^A\0,
+
+#### Computer Automation
+#
+
+ca22851|Computer Automation 22851,
+	am,
+	cols#80, lines#24,
+	bel=^G, clear=\014$<8>, cr=\r, cub1=^U, cud1=\n, cuf1=^I,
+	cup=\002%i%p1%c%p2%c, cuu1=^V, ed=^\, el=^], home=^^, ind=\n,
+	kcub1=^U, kcud1=^W, kcuu1=^V, khome=^^,
+
+#### Cybernex
+#
+
+# This entry has correct padding and the undocumented "ri" capability
+cyb83|xl83|Cybernex xl-83,
+	OTbs, am,
+	cols#80, lines#24,
+	bel=^G, clear=\014$<62>, cr=\r, cub1=^H, cud1=\n, cuf1=^I,
+	cup=\027%p1%{32}%+%c%p2%{32}%+%c, cuu1=^N,
+	ed=\020$<62>, el=\017$<3>, home=^K, ind=\n, kcub1=^H,
+	kcud1=\n, kcuf1=^I, kcuu1=^N, ri=^N,
+# (mdl110: removed obsolete ":ma=^Z^P:" and overridden ":cd=145^NA^W:" -- esr)
+cyb110|mdl110|Cybernex mdl-110,
+	OTbs, am,
+	cols#80, lines#24,
+	bel=^G, clear=\030$<70>, cr=\r, cub1=^H, cud1=\n, cuf1=^U,
+	cup=\020%p1%{32}%+%c%p2%{32}%+%c, cuu1=^Z,
+	dch1=\016A\036$<3.5>, dl1=\016A\016\036$<40>,
+	ed=\016@\026$<6>, el=\016@\026$<145>, home=^Y,
+	ht=\011$<43>, ich1=\016A\035$<3.5>,
+	il1=\016A\016\035$<65>, ind=\n, rmso=^NG, smso=^NF,
+
+#### Datapoint
+#
+# Datapoint is gone.  They used to be headquartered in Texas.
+# They created ARCnet, an Ethernet competitor that flourished for a while
+# in the early 1980s before 3COM got wise and cut its prices.  The service
+# side of Datapoint still lives (1995) in the form of Intelogic Trace.
+#
+
+dp3360|datapoint|Datapoint 3360,
+	OTbs, am,
+	cols#82, lines#25,
+	bel=^G, clear=^]^_, cr=\r, cub1=^H, cud1=\n, cuf1=^X, cuu1=^Z,
+	ed=^_, el=^^, home=^], ind=\n,
+
+# From: Jan Willem Stumpel <jw.stumpel@inter.nl.net>, 11 May 1997
+# The Datapoint 8242 Workstation was sold at least between 1985
+# and 1989. To make the terminal work with this entry, press
+# CONTROL-INT-INT to take the terminal off-line, and type (opt).
+# Set the options AUTO ROLL, ROLL DN, and ESC KBD on, and AUTO
+# CR/LF off. Use control-shift-[] as escape key, control-I as tab,
+# shift-F1 to shift-F5 as F6 to F10 (unshifted F1 to F5 are in
+# fact unusable because the strings sent by the terminal conflict
+# with other keys).
+# The terminal is capable of displaying "box draw" characters.
+# For each graphic character you must send 2 ESC's (\E\E) followed
+# by a control character as follows:
+#         character        meaning
+#         =========        =======
+#         ctrl-E           top tee
+#         ctrl-F           right tee
+#         ctrl-G           bottom tee
+#         ctrl-H           left tee
+#         ctrl-I           cross
+#         ctrl-J           top left corner
+#         ctrl-K           top right corner
+#         ctrl-L           bottom left corner
+#         ctrl-M           bottom right corner
+#         ctrl-N           horizontal line
+#         ctrl-O           vertical line
+# Unfortunately this cannot be fitted into the termcap/terminfo
+# description scheme.
+dp8242|Datapoint 8242,
+	msgr,
+	cols#80, lines#25,
+	bel=^G, civis=^Y, clear=^U\E^D^W^X, cnorm=^X, cr=\r, cub1=^H,
+	cud1=\n, cup=\011%p2%'\0'%+%c%p1%'\0'%+%c, dl1=\E^Z,
+	ed=^W, el=^V, home=^U, ht=^I, il1=\E^T, ind=^C,
+	is1=\E\014\E\016\0\230\0\317\025\027\030\E\004,
+	kbs=^H, kcub1=^D, kcud1=^B, kcuf1=^F, kcuu1=^E, kf1=^G\Ee,
+	kf10=\EK\Ea, kf2=^I\Ed, kf3=\n\Ec, kf4=\n\Eb, kf5=^S\Ea,
+	kf6=\EO\Ee, kf7=\EN\Ed, kf8=\EM\Ec, kf9=\EL\Eb, nel=\r\n,
+	rep=\E\023%p1%c%p2%c, ri=^K, rmso=\E^D, rmul=\E^D,
+	rs1=\E\014\E\016\0\230\0\317\025\027\030\E\004,
+	smso=\E^E, smul=\E^F,
+	wind=\E\014\E\016%p1%'\0'%+%c%p2%'\0'%+%c%p3%'\0'%+%c%p4%'
+	     \0'%+%c\025,
+
+#### DEC terminals (Obsolete types: DECwriter and VT40/42/50)
+#
+# These entries came from DEC's official terminfos for its older terminals
+# (which happen to be identical to the AT&T/SCO terminal descriptions),
+# Bill Hedberg <hedberg@hannah.enet.dec.com> of Terminal Support Engineering
+# may have had more information.  Updated terminfos and termcaps were available
+# at ftp://gatekeeper.dec.com/pub/DEC/termcaps.
+
+# DEC's terminfos did not describe the auxiliary keypad.
+#
+# DECScope of course had no "function keys", but this building block assigns
+# the three blank keys at the top of the auxiliary (numeric) keypad, using
+# the same analogy as VT100 (also lacking function-keys).
+#
+# These assignments use the same layout for 0-9 as VT100+keypad; the VT52
+# keypad had its cursor-keys on the right-column as shown -TD
+#   _______________________________________
+#  |   PF1   |   PF2   |   PF3   | c-up    |
+#  |   \EP   |   \EQ   |   \ER   |   \EA   |
+#  |_kf1__k1_|_kf2__k2_|_kf3__k3_|kcuu1_k4_|
+#  |    7         8         9      c-down  |
+#  |   \E?w  |   \E?x  |   \E?y  |   \EB   |
+#  |_kf9__k9_|_kf10_k;_|_kf0__k0_|kcud1____|
+#  |    4    |    5    |    6    | c-right |
+#  |   \E?t  |   \E?u  |   \E?v  |   \EC   |
+#  |_kf5__k5_|_kf6__k6_|_kf7__k7_|kcuf1_k8_|
+#  |    1    |    2    |    3    | c-left  |
+#  |   \E?q  |   \E?r  |   \E?s  |   \ED   |
+#  |_ka1__K1_|_kb2__K2_|_ka3__K3_|kcub1____|
+#  |         0         |   .     |  enter  |
+#  |        \E?p       |  \E?n   |  \E?M   |
+#  |___kc1_______K4____|_kc3__K5_|_kent_@8_|
+#
+vt52+keypad|DECScope auxiliary keypad,
+	ka1=\E?q, ka3=\E?s, kb2=\E?r, kc1=\E?p, kc3=\E?n, kf0=\E?y,
+	kf1=\EP, kf2=\EQ, kf3=\ER, kf5=\E?t, kf6=\E?u, kf7=\E?v,
+	kf8=\E?w, kf9=\E?x,
+
+gt40|DEC gt40,
+	OTbs, os,
+	cols#72, lines#30,
+	bel=^G, cr=\r, cub1=^H, cud1=\n,
+gt42|DEC gt42,
+	OTbs, os,
+	cols#72, lines#40,
+	bel=^G, cr=\r, cub1=^H, cud1=\n,
+
+vt50|DEC VT50,
+	OTbs,
+	cols#80, lines#12,
+	bel=^G, clear=\EH\EJ, cr=\r, cub1=^H, cud1=\n, cuf1=\EC,
+	cuu1=\EA, ed=\EJ, el=\EK, ht=^I, ind=\n, u8=\E/A, u9=\EZ,
+vt50h|DEC VT50h,
+	cub1=\ED, cud1=\EB, cup=\EY%p1%{32}%+%c%p2%{32}%+%c,
+	kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, u8=\E/[HJ],
+	use=vt52+keypad, use=vt50,
+
+# (vt61: there's a BSD termcap that claims <dl1=\EPd>, <il1=\EPf.> <kbs=^H>)
+vt61|vt-61|vt61.5|DEC VT61,
+	cols#80, lines#24,
+	bel=^G, clear=\EH\EJ$<120>, cr=\r$<20>, cub1=^H, cud1=\n,
+	cuf1=\EC$<20>, cup=\EY%p1%{32}%+%c%p2%{32}%+%c$<20>,
+	cuu1=\EA$<20>, ed=\EJ$<120>, el=\EK$<70>, ht=^I,
+	ind=\n$<20>, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA,
+	ri=\E$<20>I,
+
+# The gigi does standout with red!
+# (gigi: I added <rmam>/<smam> based on the init string, corrected cub1 -- esr)
+gigi|vk100|DEC gigi graphics terminal,
+	OTbs, am, xenl,
+	cols#84, lines#24,
+	bel=^G, clear=\E[H\E[2J, cr=\r, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A, ed=\E[J,
+	el=\E[K, ht=^I, ind=\n,
+	is2=\E>\E[?3l\E[?4l\E[?5l\E[?20l\E[?7h\E[?8h,
+	kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kf1=\EOP,
+	kf2=\EOQ, kf3=\EOR, kf4=\EOS, khome=\E[H, ri=\EM,
+	rmam=\E[?7l, rmkx=\E[?1l\E>, rmso=\E[m, rmul=\E[m,
+	sgr0=\E[m, smam=\E[?7h, smkx=\E[?1h\E=, smso=\E[7;31m,
+	smul=\E[4m,
+
+# DEC PRO-350 console (VT220-style).  The 350 was DEC's attempt to produce
+# a PC differentiated from the IBM clones.  It was a total, ludicrous,
+# grossly-overpriced failure (among other things, DEC's OS didn't include
+# a format program, so you had to buy pre-formatted floppies from DEC at
+# a hefty premium!).
+pro350|decpro|DEC pro console,
+	OTbs,
+	cols#80, it#8, lines#24,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	clear=\EH\EJ, cub1=^H, cud1=\EB, cuf1=\EC,
+	cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, ed=\EJ,
+	el=\EK, home=\EH, ht=^I, kcub1=\ED, kcud1=\EB, kcuf1=\EC,
+	kcuu1=\EA, kf0=\EE, kf1=\EF, kf2=\EG, kf3=\EH, kf4=\EI,
+	kf5=\EJ, kf6=\Ei, kf7=\Ej, khome=\EH, ri=\EI, rmacs=\EG,
+	rmso=\E^N, rmul=\E^C, smacs=\EF, smso=\E^H, smul=\E^D,
+
+dw1|DECwriter I,
+	OTbs, hc, os,
+	cols#72,
+	bel=^G, cr=\r, cub1=^H, cud1=\n, ind=\n,
+dw2|decwriter|dw|DECwriter II,
+	OTbs, hc, os,
+	cols#132,
+	bel=^G, cr=\r, cub1=^H, cud1=\n, ind=\n, kbs=^H,
+# \E(B		Use U.S. character set (otherwise # => british pound !)
+# \E[20l	Disable "linefeed newline" mode (else puts \r after \n,\f,\v)
+# \E[w		10 char/in pitch
+# \E[1;132	full width horizontal margins
+# \E[2g		clear all tab stops
+# \E[z		6 lines/in
+# \E[66t	66 lines/page (for \f)
+# \E[1;66r	full vertical page can be printed
+# \E[4g		clear vertical tab stops
+# \E>		disable alternate keypad mode (so it transmits numbers!)
+# \E[%i%p1%du	set tab stop at column %d (origin == 1)
+#		(Full syntax is \E[n;n;n;n;n;...;nu where each 'n' is
+#		a tab stop)
+#
+#       The dw3 does standout with wide characters.
+#
+dw3|la120|DECwriter III,
+	OTbs, hc, os,
+	cols#132,
+	bel=^G, cr=\r, cub1=^H, cud1=\n, ht=^I, ind=\n,
+	is1=\E(B\E[20l\E[w\E[0;132s\E[2g\E[z\E[66t\E[1;66r\E[4g\E>,
+	is2=\E[9;17;25;33;41;49;57;65;73;81;89;97;105;113;121;129u
+	    \r,
+	kbs=^H, rmso=\E[w, sgr0=\E[w, smso=\E[6w,
+dw4|DECwriter IV,
+	OTbs, am, hc, os,
+	cols#132,
+	bel=^G, cr=\r, cub1=^H, cud1=\n, ht=^I, ind=\n, is2=\Ec, kbs=^H,
+	kf0=\EOP, kf1=\EOQ, kf2=\EOR, kf3=\EOS,
+
+# These aren't official
+ln03|DEC ln03 laser printer,
+	hc,
+	cols#80, lines#66,
+	bel=^G, cr=\r, cud1=\n, hd=\EK, ht=^I, hu=\EL, ind=\n, nel=\r\n,
+	rmso=\E[22m, rmul=\E[24m, sgr0=\E[m, smso=\E[1m,
+	smul=\E[4m,
+ln03-w|DEC ln03 laser printer 132 cols,
+	cols#132,
+	bel=^G, cr=\r, cud1=\n, ht=^I, ind=\n, kbs=^H, kcub1=^H,
+	kcud1=\n, nel=\r\n, use=ln03,
+
+#### Delta Data (dd)
+#
+
+# Untested. The cup sequence is hairy enough that it probably needs work.
+# The idea is ctrl(O), dd(row), dd(col), where dd(x) is x - 2*(x%16) + '9'.
+# There are BSD-derived termcap entries floating around for this puppy
+# that are *certainly* wrong.
+delta|dd5000|delta data 5000,
+	OTbs, am,
+	cols#80, lines#27,
+	bel=^G, clear=^NR, cub1=^H, cud1=\n, cuf1=^Y,
+	cup=\017%p1%p1%{16}%m%{2}%*%-%{57}%+%c%p2%p2%{16}%m%{2}%*%-
+	    %{57}%+%c,
+	cuu1=^Z, dch1=^NV, el=^NU, home=^NQ, ind=\n,
+
+#### Digital Data Research (ddr)
+#
+
+# (ddr: I added <rmam>/<smam> based on the init string -- esr)
+ddr|rebus3180|ddr3180|Rebus/DDR 3180 VT100 emulator,
+	OTbs, am, xenl,
+	cols#80, it#8, lines#24, vt#3,
+	blink=\E[5m$<2/>, bold=\E[1m$<2/>,
+	clear=\E[H\E[2J$<50/>, csr=\E[%i%p1%d;%p2%dr, cub1=^H,
+	cud1=\n, cuf1=\E[C$<2/>, cup=\E[%i%p1%d;%p2%dH$<5/>,
+	cuu1=\E[A$<2/>, ed=\E[J$<50/>, el=\E[K$<3/>, home=\E[H,
+	ht=^I, ind=\ED$<5/>, is2=\E[1;24r\E[24;1H, kbs=^H,
+	kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kf1=\EOP,
+	kf2=\EOQ, kf3=\EOR, kf4=\EOS, rc=\E8, rev=\E[7m$<2/>,
+	rf=/usr/share/tabset/vt100, ri=\EM$<5/>, rmam=\E[7l,
+	rmkx=\E[?1l\E>, rmso=\E[m, rmul=\E[m$<2/>,
+	rs1=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, sc=\E7,
+	sgr0=\E[m$<2/>, smam=\E[7l, smkx=\E[?1h\E=, smso=\E[7m,
+	smul=\E[4m$<2/>,
+
+#### Evans & Sutherland
+#
+
+# Jon Leech <leech@cs.unc.edu> tells us:
+# The ps300 was the Evans & Sutherland Picture System 300, a high
+# performance 3D vector graphics system with a bunch of specialized hardware.
+# Approximate date of release was 1982 (early 80s, anyway), and it had several
+# evolutions including (limited) color versions such as the PS330C. PS300s
+# were effectively obsolete by the late 80s, replaced by raster graphics
+# systems, although specialized applications like molecular modeling
+# hung onto them for a while longer.  AFAIK all E&S vector graphics systems
+# are out of production, though of course E&S is very much alive (in 1996).
+# (ps300: changed ":pt@:" to "it@" -- esr)
+#
+ps300|Picture System 300,
+	xt,
+	it@,
+	rmso@, rmul@, smso@, smul@, use=vt100+4bsd,
+
+#### General Electric (ge)
+#
+
+terminet1200|terminet300|tn1200|tn300|terminet|GE terminet 1200,
+	OTbs, hc, os,
+	cols#120,
+	bel=^G, cr=\r, cud1=\n, ind=\n,
+
+#### Heathkit/Zenith
+#
+
+# Here is a description of the H19 DIP switches:
+#
+# S401
+# 0-3 = baud rate as follows:
+#
+#         3       2       1       0
+#	---	---	---	---
+#         0       0       1       1       300 baud
+#         0       1       0       1       1200 baud
+#         1       0       0       0       2400 baud
+#         1       0       1       0       4800 baud
+#         1       1       0       0       9600 baud
+#         1       1       0       1       19.2K baud
+#
+# 4 = parity (0 = no parity)
+# 5 = even parity (0 = odd parity)
+# 6 = stick parity (0 = normal parity)
+# 7 = full duplex (0 = half duplex)
+#
+# S402
+# 0 = block cursor (0 = underscore cursor)
+# 1 = no key click (0 = keyclick)
+# 2 = wrap at end of line (0 = no wrap)
+# 3 = auto LF on CR (0 = no LF on CR)
+# 4 = auto CR on LF (0 = no CR on LF)
+# 5 = ANSI mode (0 = VT52 mode)
+# 6 = keypad shifted (0 = keypad unshifted)
+# 7 = 50Hz refresh (1 = 60Hz refresh)
+#
+# Factory Default settings are as follows:
+#          7 6 5 4 3 2 1 0
+# S401     1 0 0 0 1 1 0 0
+# S402     0 0 0 0 0 0 0 0
+# (h19: I added <rmam>/<smam> based on the init string;
+# also added empty <acsc> to suppress a tic warning -- esr)
+h19-a|h19a|heath-ansi|heathkit-a|Heathkit h19 ANSI mode,
+	OTbs, am, mir, msgr,
+	cols#80, it#8, lines#24,
+	acsc=, bel=^G, clear=\E[2J, cnorm=\E[>4l, cr=\r, cub1=^H,
+	cud1=\E[1B, cuf1=\E[1C, cup=\E[%i%p1%d;%p2%dH,
+	cuu1=\E[1A, cvvis=\E[>4h, dch1=\E[1P, dl1=\E[1M$<1*>,
+	ed=\E[J, el=\E[K, home=\E[H, ht=^I, il1=\E[1L$<1*>, ind=\n,
+	is2=\E<\E[>1;2;3;4;5;6;7;8;9l\E[m\E[11m\E[?7h,
+	kbs=^H, kcub1=\E[1D, kcud1=\E[1B, kcuf1=\E[1C, kcuu1=\E[1A,
+	kf1=\EOS, kf2=\EOT, kf3=\EOU, kf4=\EOV, kf5=\EOW, kf6=\EOP,
+	kf7=\EOQ, kf8=\EOR, khome=\E[H, lf6=blue, lf7=red, lf8=white,
+	ri=\EM, rmacs=\E[11m, rmam=\E[?7l, rmir=\E[4l, rmso=\E[m,
+	smacs=\E[10m, smam=\E[?7h, smir=\E[4h, smso=\E[7m,
+h19-bs|Heathkit w/keypad shifted,
+	rmkx=\Eu, smkx=\Et, use=h19-b,
+h19-us|h19us|h19-smul|Heathkit w/keypad shifted/underscore cursor,
+	rmkx=\Eu, smkx=\Et, use=h19-u,
+# (h19: merged in <ip> from BSDI hp19-e entry>;
+# also added empty <acsc> to suppress a tic warning --esr)
+# From: Tim Pierce <twp@skepsis.com>, 23 Feb 1998
+# Tim tells us that:
+# I have an old Zenith-19 terminal at home that still gets a lot of use.
+# This terminal suffers from the same famous insert-mode padding lossage
+# that has been acknowledged for the Z29 terminal.  Emacs is nearly
+# unusable on this box, since even a half-scroll up or down the window
+# causes flaming terminal death.
+#
+# On the Z19, the only way I have found around this problem is to remove
+# the :al: and :dl: entries entirely.  No amount of extra padding will
+# help (I have tried up to 20000).  Removing <il1=\EL$> and <dl1=\EM$>
+# makes Emacs a little slower, but it remains in the land of the living.
+# Big win.
+h19|heath|h19-b|heathkit|heath-19|z19|zenith|Heathkit h19,
+	OTbs, am, eslok, hs, mir, msgr,
+	cols#80, it#8, lines#24,
+	acsc=+h.kaiggjdkclfmenbozqas{tvutvuwsx`~\^, bel=^G,
+	clear=\EE, cnorm=\Ey4, cr=\r, cub1=^H, cud1=\EB, cuf1=\EC,
+	cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, cvvis=\Ex4,
+	dch1=\EN, ed=\EJ, el=\EK, fsl=\Ek\Ey5, home=\EH, ht=^I, ind=\n,
+	ip=$<1.5/>, kbs=^H, kcub1=\ED, kcud1=\EB, kcuf1=\EC,
+	kcuu1=\EA, kf1=\ES, kf2=\ET, kf3=\EU, kf4=\EV, kf5=\EW,
+	kf6=\EP, kf7=\EQ, kf8=\ER, khome=\EH, lf6=blue, lf7=red,
+	lf8=white, ri=\EI, rmacs=\EG, rmir=\EO, rmso=\Eq, smacs=\EF,
+	smir=\E@, smso=\Ep, tsl=\Ej\Ex5\EY8%p1%{32}%+%c\Eo\Eo,
+h19-u|Heathkit with underscore cursor,
+	cnorm@, cvvis@, use=h19-b,
+h19-g|h19g|Heathkit w/block cursor,
+	cnorm=\Ex4, cvvis@, use=h19-b,
+alto-h19|altoh19|altoheath|alto-heath|alto emulating Heathkit h19,
+	lines#60,
+	dl1=\EM, il1=\EL, use=h19,
+
+# The major problem with the Z29 is that it requires more padding than the Z19.
+#
+# The problem with declaring an H19 to be synonymous with a Z29 is that
+# it needs more padding. It especially loses if a program attempts
+# to put the Z29 into insert mode and insert text at 9600 baud. It
+# even loses worse if the program attempts to insert tabs at 9600
+# baud. Adding padding to text that is inserted loses because in
+# order to make the Z29 not die, one must add so much padding that
+# whenever the program tries to use insert mode, the effective
+# rate is about 110 baud.
+#
+# What program would want to put the terminal into insert mode
+# and shove stuff at it at 9600 baud you ask?
+#
+# Emacs. Emacs seems to want to do the mathematically optimal
+# thing in doing a redisplay rather than the practical thing.
+# When it is about to output a line on top of a line that is
+# already on the screen, instead of just killing to the end of
+# the line and outputting the new line, it compares the old line
+# and the new line and if there are any similarities, it
+# constructs the new line by deleting the text on the old line
+# on the terminal that is already there and then inserting new
+# text into the line to transform it into the new line that is
+# to be displayed. The Z29 does not react kindly to this.
+#
+# But don't cry for too long.... There is a solution. You can make
+# a termcap entry for the Z29 that says the Z29 has no insert mode.
+# Then Emacs cannot use it. "Oh, no, but now inserting into a
+# line will be really slow", you say. Well there is a sort of a
+# solution to that too. There is an insert character option on
+# the Z29 that will insert one character. Unfortunately, it
+# involves putting the terminal into ANSI mode, inserting the
+# character, and changing it back to H19 mode. All this takes 12
+# characters. Pretty expensive to insert one character, but it
+# works. Either Emacs doesn't try to use its inserting hack when
+# it's only given an insert character ability or the Z29 doesn't
+# require padding with this (the former is probably more likely,
+# but I haven't checked it out).
+# (z29: added empty <acsc> to suppress a tic warning, merged in
+# status line capabilities from BRL entry --esr)
+z29|zenith29|z29b|Zenith z29b,
+	OTbs, OTpt, am, eslok, hs, mir, msgr,
+	OTkn#10, cols#80, lines#24,
+	OTbc=\ED, acsc=, bel=^G, cbt=\E-, clear=\EE$<14>, cnorm=\Ey4,
+	cr=\r, cub1=^H, cud1=\EB, cuf1=\EC,
+	cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\E$<1>A,
+	cvvis=\Ex4, dch1=\EN$<0.1*>, dl1=\EM$<1/>, dsl=\Ey1,
+	ed=\EJ$<14>, el=\EK$<1>, fsl=\Ek\Ey5, home=\EH, ht=^I,
+	ich1=\E<\E[1@\E[?2h$<1>, il1=\EL$<1/>, ind=\n$<2>,
+	is2=\E<\E[?2h\Ev, kbs=^H, kcub1=\ED, kcud1=\EB, kcuf1=\EC,
+	kcuu1=\EA, kf0=\E~, kf1=\ES, kf2=\ET, kf3=\EU, kf4=\EV,
+	kf5=\EW, kf6=\EP, kf7=\EQ, kf8=\ER, kf9=\E0I, khome=\EH,
+	lf0=home, ri=\EI$<2/>, rmacs=\EF, rmir=\EO, rmso=\Eq,
+	rmul=\Es0, smacs=\EG, smir=\E@, smso=\Ep, smul=\Es8,
+	tsl=\Ej\Ex5\Ex1\EY8%+ \Eo,
+# z29 in ANSI mode. Assumes that the cursor is in the correct state, and that
+# the world is stable. <rs1> causes the terminal to be reset to the state
+# indicated by the name. kc -> key click, nkc -> no key click, uc -> underscore
+# cursor, bc -> block cursor.
+# From: Mike Meyers
+# (z29a: replaced nonexistent <if=/usr/share/tabset/zenith29> because <hts>
+# looks VT100-compatible -- esr)
+z29a|z29a-kc-bc|h29a-kc-bc|Heath/Zenith 29 in ANSI mode,
+	OTbs, OTpt, am, eslok, hs, mir, msgr,
+	OTkn#10, cols#80, it#8, lines#24,
+	OTbc=\ED, bel=^G, blink=\E[5m, bold=\E[2m, clear=\E[2J,
+	cr=\r, csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	dch=\E[%p1%dP, dch1=\E[1P, dim=\E[2m, dl=\E[%p1%dM,
+	dl1=\E[M, dsl=\E[>1l, ed=\E[J, el=\E[K, fsl=\E[u\E[>5l,
+	home=\E[H, ht=^I, hts=\EH, if=/usr/share/tabset/vt100,
+	il=\E[%p1%dL, il1=\E[L, ind=\ED, kbs=^H, kclr=\E[J,
+	kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, ked=\E[J,
+	kf0=\E[~, kf1=\EOS, kf2=\EOT, kf3=\EOU, kf4=\EOV, kf5=\EOW,
+	kf6=\EOP, kf7=\EOQ, kf8=\EOR, kf9=\EOX, khome=\E[H, lf0=help,
+	mc0=\E#7, nel=\r\ED, rc=\E[r, rev=\E[7m, ri=\EM,
+	rmcup=\E[?7h, rmso=\E[m, rmul=\E[m,
+	rs1=\E<\E[1;24r\E[24;1H\E[?7h\E[>4h\E[>1;2;3;5;6;7;8;9l\E[m
+	    \E[11m,
+	sc=\E[s, sgr0=\E[m, smcup=\E[?7l, smso=\E[7;2m, smul=\E[4m,
+	tbc=\E[3g, tsl=\E[s\E[>5;1h\E[25;%i%dH\E[1K,
+z29a-kc-uc|h29a-kc-uc|Zenith z29 ANSI mode with keyclick and underscore cursor,
+	rs1=\E<\E[1;24r\E[24;1H\E[?7h\E[>1;2;3;4;5;6;7;8;9l\E[m\E[11
+	    m,
+	use=z29a,
+z29a-nkc-bc|h29a-nkc-bc|Zenith z29 ANSI mode with block cursor and no keyclick,
+	rs1=\E<\E[1;24r\E[24;1H\E[?7h\E[>2;4h\E[>1;3;5;6;7;8;9l\E[m
+	    \E[11m,
+	use=z29a,
+z29a-nkc-uc|h29a-nkc-uc|Zenith z29 ANSI mode with underscore cursor and no keyclick,
+	rs1=\E<\E[1;24r\E[24;1H\E[?7h\E[>2h\E[>1;3;4;5;6;7;8;9l\E[m
+	    \E[11m,
+	use=z29a,
+# From: Jeff Bartig <jeffb@dont.doit.wisc.edu> 31 Mar 1995
+z39-a|z39a|zenith39-a|zenith39-ansi|Zenith 39 in ANSI mode,
+	am, eslok, hs, mc5i, mir, msgr, xon,
+	cols#80, lines#24,
+	acsc=0a``aaffggjjkkllmmnnooqqssttuuvvwwxx~~, bel=^G,
+	blink=\E[5m, bold=\E[1m, cbt=\E[1Z, civis=\E[>5h,
+	clear=\E[2J\E[H, cnorm=\E[>5l, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\E[B, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+	dch=\E[%p1%dP, dch1=\E[1P, dim=\E[2m, dl=\E[%p1%dM,
+	dl1=\E[1M, dsl=\E[>1l, ed=\E[0J, el=\E[0K, el1=\E[1K,
+	fsl=\E[u, home=\E[H, ht=^I, hts=\EH, il=\E[%p1%dL, il1=\E[1L,
+	ind=\n, is2=\E<\E[>1;3;5;6;7l\E[0m\E[2J, ka1=\EOw,
+	ka3=\EOu, kb2=\EOy, kbs=^H, kc1=\EOq, kc3=\EOs, kcub1=\E[D,
+	kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, ked=\E[J, kf1=\EOS,
+	kf2=\EOT, kf3=\EOU, kf4=\EOV, kf5=\EOW, kf6=\EOP, kf7=\EOQ,
+	kf8=\EOR, kf9=\EOX, khlp=\E[~, khome=\E[H, ll=\E[24;1H,
+	mc0=\E[?19h\E[i, mc4=\E[4i, mc5=\E[5i, rc=\E[u, rev=\E[7m,
+	rmacs=\E(B, rmir=\E[4l, rmkx=\E[>7l, rmso=\E[0m,
+	rmul=\E[0m, rs2=\E<\Ec\0, sc=\E[s, sgr0=\E[0m, smacs=\E(0,
+	smir=\E[4h, smkx=\E[>7h, smso=\E[7m, smul=\E[4m, tbc=\E[3g,
+	tsl=\E[s\E[>1h\E[25;%i%p1%dH,
+
+# From: Brad Brahms <Brahms@USC-ECLC>
+z100|h100|z110|z-100|h-100|Heath/Zenith z-100 pc with color monitor,
+	cnorm=\Ey4\Em70, cvvis=\Ex4\Em71, use=z100bw,
+# (z100bw: removed obsolete ":kn#10:", added empty <acsc> -- esr)
+z100bw|h100bw|z110bw|z-100bw|h-100bw|Heath/Zenith z-100 pc,
+	OTbs, OTpt, mir, msgr,
+	OTkn#10, cols#80, it#8, lines#24,
+	acsc=+h.kaiggjdkclfmenbozqas{tvutvuwsx`~\^,
+	clear=\EE$<5*/>, cnorm=\Ey4, cub1=^H, cud1=\EB, cuf1=\EC,
+	cup=\EY%p1%{32}%+%c%p2%{32}%+%c$<1*/>, cuu1=\EA,
+	cvvis=\Ex4, dch1=\EN$<1*/>, dl1=\EM$<5*/>, ed=\EJ, el=\EK,
+	home=\EH, ht=^I, il1=\EL$<5*/>, kbs=^H, kcub1=\ED, kcud1=\EB,
+	kcuf1=\EC, kcuu1=\EA, kf0=\EJ, kf1=\ES, kf2=\ET, kf3=\EU,
+	kf4=\EV, kf5=\EW, kf6=\EP, kf7=\EQ, kf8=\ER, kf9=\EOI,
+	khome=\EH, ri=\EI, rmacs=\EG, rmir=\EO, rmso=\Eq, smacs=\EF,
+	smir=\E@, smso=\Ep,
+p19|h19-b with il1/dl1,
+	dl1=\EM$<2*/>, il1=\EL$<2*/>, use=h19-b,
+# From: <ucscc!B.fiatlux@ucbvax.berkeley.edu>
+# (ztx: removed duplicate :sr: -- esr)
+ztx|ztx11|zt-1|htx11|ztx-1-a|Heath/Zenith ztx-10 or 11,
+	OTbs, am, eslok, hs,
+	cols#80, it#8, lines#24,
+	clear=\EE, cub1=^H, cud1=\n, cuf1=\EC,
+	cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, dl1=\EM,
+	dsl=\Ey1, ed=\EJ, el=\EK, fsl=\Ek\Ey5, home=\EH, ht=^I,
+	il1=\EL, is2=\Ej\EH\Eq\Ek\Ev\Ey1\Ey5\EG\Ey8\Ey9\Ey>,
+	kbs=^H, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, kf0=\ES,
+	kf1=\EB, kf2=\EU, kf3=\EV, kf4=\EW, kf5=\EP, kf6=\EQ, kf7=\ER,
+	ri=\EI, rmso=\Eq, rmul=\Eq, smso=\Es5, smul=\Es2,
+	tsl=\Ej\Ex5\Ex1\EY8%+ \Eo,
+
+#### IMS International (ims)
+#
+# There was a company called IMS International located in Carson City,
+# Nevada, that flourished from the mid-70s to mid-80s.  They made S-100
+# bus/Z80 hardware and a line of terminals called Ultimas.
+#
+
+# From: Erik Fair <fair@ucbarpa.berkeley.edu>  Sun Oct 27 07:21:05 1985
+ims950-b|bare ims950 no init string,
+	is2@, use=ims950,
+# (ims950: removed obsolete ":ko@:" -- esr)
+ims950|IMS TeleVideo 950 emulation,
+	xenl@,
+	flash@, kbs@, kcub1@, kcud1@, kcuf1@, kcuu1@, kf0@, kf1@, kf2@, kf3@,
+	kf4@, kf5@, kf6@, kf7@, kf8@, kf9@, khome@, use=tvi950,
+# (ims950-rv: removed obsolete ":ko@:" -- esr)
+ims950-rv|IMS tvi950 rev video,
+	xenl@,
+	flash@, kbs@, kcub1@, kcud1@, kcuf1@, kcuu1@, kf0@, kf1@, kf2@, kf3@,
+	kf4@, kf5@, kf6@, kf7@, kf8@, kf9@, khome@, use=tvi950-rv,
+ims-ansi|ultima2|ultimaII|IMS Ultima II,
+	OTbs, am,
+	cols#80, it#8, lines#24,
+	clear=\E[H\E[2J, cub1=^H, cud1=\ED, cuf1=\EC,
+	cup=\E[%i%p1%2d;%p2%2dH, cuu1=\EM, ed=\E[0J, el=\E[0K,
+	ht=^I, if=/usr/share/tabset/vt100,
+	is2=\E[m\E[>14l\E[?1;?5;20l\E>\E[1m\r, kcub1=\E[D,
+	kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, khome=\E[H, ri=\EM,
+	rmso=\E[m\E[1m, rmul=\E[m\E[1m, sgr0=\E[m, smso=\E[7m,
+	smul=\E[4m,
+
+#### Intertec Data Systems
+#
+# I think this company is long dead as of 1995.  They made an early CP/M
+# micro called the "Intertec Superbrain" that was moderately popular,
+# then sank out of sight.
+#
+
+superbrain|Intertec Superbrain,
+	OTbs, am, bw,
+	cols#80, lines#24,
+	OTbc=^U, bel=^G, clear=\014$<5*>, cr=\r, cub1=^H, cud1=\n,
+	cuf1=^F, cup=\EY%p1%{32}%+%c%p2%{32}%+%c$<20>, cuu1=^K,
+	ed=\E~k<10*>, el=\E~K$<15>, ht=^I, ind=\n, kcub1=^U,
+	kcud1=\n, kcuf1=^F, kcuu1=^K, rmcup=^L, smcup=^L,
+# (intertube: a Gould entry via BRL asserted smul=\E0@$<200/>,
+# rmul=\E0A$<200/>; my guess is the highlight letter is bit-coded like an ADM,
+# and the reverse is actually true.  Try it. -- esr)
+intertube|intertec|Intertec InterTube,
+	OTbs, am,
+	cols#80, lines#25,
+	bel=^G, clear=^L, cr=\r, cub1=^H, cud1=\n, cuf1=^F,
+	cup=\EY%p1%{32}%+%c%p2%{32}%+%c$<50>, cuu1=^Z, home=^A,
+	ind=\n, rmso=\E0@, smso=\E0P,
+# The intertube 2 has the "full duplex" problem like the Tektronix 4025: if you
+# are typing and a command comes in, the keystrokes you type get interspersed
+# with the command and it messes up
+intertube2|Intertec data systems InterTube 2,
+	OTbs,
+	cup=\016%p1%c\020%p2%{10}%/%{16}%*%p2%{10}%m%+%c,
+	el=\EK, hpa=\020%p1%{10}%/%{16}%*%p1%{10}%m%+%c,
+	ll=^K^X\r, vpa=\013%p1%c, use=intertube,
+
+#### Ithaca Intersystems
+#
+# This company made S100-bus personal computers long ago in the pre-IBM-PC
+# past.  They used to be reachable at:
+#
+#	Ithaca Intersystems
+#	1650 Hanshaw Road
+#	Ithaca, New York 14850
+#
+# However, the outfit went bankrupt years ago.
+#
+
+# The Graphos III was a color graphics terminal from Ithaca Intersystems.
+# These entries were written (originally in termcap syntax) by Brian Yandell
+# <yandell@stat.wisc.edu> and Mike Meyer <mikem@stat.wisc.edu> at the
+# University of Wisconsin.
+
+# (graphos: removed obsolete and syntactically incorrect :kn=4:,
+# removed <if=/usr/share/tabset/init.graphos> and
+# <rf=/usr/share/tabset/init.graphos> no such file & no <hts> -- esr)
+graphos|graphos III,
+	am, mir,
+	cols#80, it#8, lines#24,
+	clear=\E[H\E[2J, cnorm=\Ez56;2;0;0z\Ez73z\Ez4;1;1z,
+	cr=\r, cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=\E[B,
+	cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH,
+	cuu=\E[%p1%dA, cuu1=\E[A,
+	cvvis=\Ez4;2;1z\Ez56;2;80;24z, dch1=\E[P, dl=\E[%p1%dM,
+	dl1=\E[M, ed=\E[J, el=\E[K, home=\E[H, ht=^I, il=\E[%p1%dL,
+	il1=\E[L, ind=\ED, kbs=^H, kcub1=\E[D, kcud1=\E[B,
+	kcuf1=\E[C, kcuu1=\E[A, kf1=\EOP, kf2=\EOQ, kf3=\EOR,
+	kf4=\EOS, khome=\E[H, nel=\r\ED, rc=\E8, ri=\EM, rmdc=\E[4l,
+	rmir=\E[4l, rmso=\E[m, sc=\E7, sgr0=\E[m, smdc=\E[4h,
+	smir=\E[4h, smso=\E[7m,
+graphos-30|graphos III with 30 lines,
+	lines#30,
+	cvvis=\Ez4;2;1z\Ez56;2;80;30z, use=graphos,
+
+#### Modgraph
+#
+# These people used to be reachable at:
+#
+#	Modgraph, Inc
+#	1393 Main Street,
+#	Waltham, MA 02154
+#	Vox: (617)-890-5796.
+#
+# However, if you call that number today you'll get an insurance company.
+# I have mail from "Michael Berman, V.P. Sales, Modgraph" dated
+# 26 Feb 1997 that says:
+#
+# Modgraph GX-1000, replaced by GX-2000.  Both are out of production, have been
+# for ~7 years.  Modgraph still in business.  Products are rugged laptop and
+# portable PC's and specialized CRT and LCD monitors (rugged, rack-mount
+# panel-mount etc).  I can be emailed at sonfour@aol.com
+#
+# Peter D. Smith <pdsmith@nbbn.com> notes that his modgraph manual was
+# dated 1984.  According to the manual, it featured Tek 4010/4014
+# graphics and DEC VT100/VT52 + ADM-3A emulation with a VT220-style keyboard.
+#
+
+modgraph|mod24|modgraph terminal emulating VT100,
+	xenl@,
+	cols#80, lines#24,
+	cvvis=\E\^9;0s\E\^7;1s,
+	is2=\E\^9;0s\E\^7;1s\E[3g\E\^11;9s\E\^11;17s\E\^11;25s\E\^11
+	    ;33s\E\^11;41s\E\^11;49s\E\^11;57s\E\^11;65s\E\^11;73s
+	    \E\^11;81s\E\^11;89s,
+	rf@, ri=\EM\E[K$<5/>, use=vt100+4bsd,
+# The GX-1000 manual is dated 1984.  This looks rather like a VT-52.
+modgraph2|modgraph gx-1000 80x24 with keypad not enabled,
+	am, da, db,
+	cols#80, it#8, lines#24,
+	clear=\EH\EJ$<50/>, cub1=^H, cud1=\EB$<2/>,
+	cuf1=\EC$<2/>, cup=\EY%p1%{32}%+%c%p2%{32}%+%c$<5/>,
+	cuu1=\EA$<2/>, ed=\EJ$<50/>, el=\EK$<3/>, ht=^I,
+	is2=\E<\E\^5;2s\E\^7;1s\E[3g\E\^11;9s\E\^11;17s\E\^11;25s\E
+	    \^11;33s\E\^11;41s\E\^11;49s\E\^11;57s\E\^11;65s\E\^11;7
+	    3s\E\^11;81s\E\^11;89s\E\^12;0s\E\^14;2s\E\^15;9s\E\^25;
+	    1s\E\^9;1s\E\^27;1,
+	ri=\EI$<5/>,
+#
+# Modgraph from Nancy L. Cider <nancyc@brl-tbd>
+# BUG NOTE from Barbara E. Ringers <barb@brl-tbd>:
+# If we set TERM=vt100, and set the Modgraph screen to 24 lines, setting a
+# mark and using delete-to-killbuffer work correctly.  However, we would
+# like normal mode of operation to be using a Modgraph with 48 line setting.
+# If we set TERM=mod (which is a valid entry in termcap with 48 lines)
+# the setting mark and delete-to-killbuffer results in the deletion of only
+# the line the mark is set on.
+# We've discovered that the delete-to-killbuffer works correctly
+# with TERM=mod and screen set to 80x48 but it's not obvious.  Only
+# the first line disappears but a ctrl-l shows that it did work
+# correctly.
+modgraph48|mod|Modgraph w/48 lines,
+	OTbs, OTpt, am, xenl,
+	cols#80, it#8, lines#48, vt#3,
+	OTnl=\n, bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[;H\E[2J,
+	cr=\r, csr=\E[%i%p1%d;%p2%dr, cub1=^H, cud1=\n, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, ed=\E[J, el=\E[K,
+	flash=\E[?5h\E[0q\E[1;2q\E[?5l\E[0q\E[4;3q,
+	home=\E[H, ht=^I, is2=\E<\E[1;48r\E[0q\E[3;4q\E=\E[?1h,
+	kbs=^H, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
+	kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, rc=\E8, rev=\E[7m,
+	ri=\EM, rmkx=\E[?1l\E>, rmso=\E[m, rmul=\E[m,
+	rs1=\E=\E[0q\E>, sc=\E7, sgr0=\E[m, smkx=\E[?1h\E=,
+	smso=\E[7m, smul=\E[4m,
+
+#### Morrow Designs
+#
+# This was George Morrow's company.  They started in the late 1970s making
+# S100-bus machines.  They used to be reachable at:
+#
+#        Morrow
+#        600 McCormick St.
+#        San Leandro, CA 94577
+#
+# but they're long gone now (1995).
+#
+
+# The mt70 terminal was shipped with the Morrow MD-3 microcomputer.
+# Jeff's specimen was dated June 1984.
+# From: Jeff Wieland <wieland@acn.purdue.edu> 24 Feb 1995
+mt70|mt-70|Morrow MD-70; native Morrow mode,
+	am, mir, msgr, xon,
+	cols#80, it#8, lines#24,
+	acsc=+z\,{-x.yOi`|jGkFlEmDnHqJtLuKvNwMxI, bel=^G,
+	cbt=\EI, civis=\E"0, clear=^Z, cnorm=\E"2, cr=\r, cub1=^H,
+	cud1=\n, cuf1=^L, cup=\E=%p1%{32}%+%c%p2%{32}%+%c$<1>,
+	cuu1=^K, dch1=\EW, dim=\EG2, dl1=\ER, ed=\EY, el=\ET$<10>,
+	flash=\EK1$<200>\EK0, home=^^, ht=^I, ich1=\EQ, il1=\EE,
+	ind=\n, invis@, is1=\E"2\EG0\E], kbs=^H, kcbt=^A^Z\r,
+	kclr=^An\r, kcub1=^AL\r, kcud1=^AK\r, kcuf1=^AM\r,
+	kcuu1=^AJ\r, kdch1=^?, kf1=^A@\r, kf10=^AI\r, kf11=^A`\r,
+	kf12=^Aa\r, kf13=^Ab\r, kf14=^Ac\r, kf15=^Ad\r, kf16=^Ae\r,
+	kf17=^Af\r, kf18=^Ag\r, kf19=^Ah\r, kf2=^AA\r, kf20=^Ai\r,
+	kf3=^AB\r, kf4=^AC\r, kf5=^AD\r, kf6=^AE\r, kf7=^AF\r,
+	kf8=^AG\r, kf9=^AH\r, khlp=^AO\r, khome=^AN\r, nel=^_,
+	rmacs=\E%%, rmcup=, smacs=\E$, smcup=\E"2\EG0\E],
+	smul=\EG1, tbc=\E0, use=adm+sgr,
+
+#### Motorola
+#
+
+# Motorola EXORterm 155	from {decvax, ihnp4}!philabs!sbcs!megad!seth via BRL
+# (Seth H Zirin)
+ex155|Motorola Exorterm 155,
+	OTbs, am, bw,
+	OTkn#5, OTug#1, cols#80, lines#24,
+	cbt=\E[, clear=\EX, cub1=\ED, cud1=\EB, cuf1=\EC,
+	cup=\EE%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, ed=\ET,
+	el=\EU, home=\E@, ht=\EZ, kbs=^H, kcbt=\E[, kclr=\EX, kcub1=^H,
+	kcud1=\n, kcuf1=^L, kcuu1=^K, ked=\ET, kel=\EU, khome=\E@,
+	rmso=\Ec\ED, rmul=\Eg\ED, smso=\Eb\ED, smul=\Ef\ED,
+
+#### Omron
+#
+# This company is still around in 1995, manufacturing point-of-sale systems.
+
+omron|Omron 8025AG,
+	OTbs, am, da, db,
+	cols#80, lines#24,
+	bel=^G, clear=\EJ, cr=\r, cub1=^H, cud1=\n, cuf1=\EC, cuu1=\EA,
+	cvvis=\EN, dch1=\EP, dl1=\EM, ed=\ER, el=\EK, home=\EH,
+	il1=\EL, ind=\ES, ri=\ET, rmso=\E4, smso=\Ef,
+
+#### Ramtek
+#
+# Ramtek was a vendor of high-end graphics terminals around 1979-1983; they
+# were competition for things like the Tektronix 4025.
+#
+
+# Ramtek 6221 from BRL, probably by Doug Gwyn
+# The following SET-UP modes are assumed for normal operation:
+#	UNDERLINE_CURSOR	ANSI_MODE	AUTO_XON/XOFF_ON
+#	NEWLINE_OFF		80_COLUMNS
+# Other SET-UP modes may be set for operator convenience or communication
+# requirements; I recommend
+#	SMOOTH_SCROLL	AUTO_REPEAT_ON	3_#_SHIFTED	WRAP_AROUND_ON
+# Hardware tabs are assumed to be every 8 columns; they can be set up by the
+# "reset", "tset", or "tabs" utilities (use rt6221-w, 160 columns, for this).
+# Note that the Control-E key is useless on this brain-damaged terminal.  No
+# delays are specified; use "stty ixon -ixany" to enable DC3/DC1 flow control!
+rt6221|Ramtek 6221 80x24,
+	OTbs, OTpt, msgr, xon,
+	OTkn#4, cols#80, it#8, lines#24, vt#3,
+	acsc=, bel=^G, blink=\E[5m, bold=\E[1m, civis=\E[>5l,
+	clear=\E[1;1H\E[J, cnorm=\E[>5h\E[>9h, cr=\r,
+	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=^K, cuf=\E[%p1%dC, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\EM,
+	cvvis=\E[>7h\E[>9l, ed=\E[J, el=\E[K, home=\E[1;1H, ht=^I,
+	hts=\EH, ind=\n, is2=\E)0, kbs=^H, kcub1=\E[D, kcud1=\E[B,
+	kcuf1=\E[C, kcuu1=\E[A, kf0=\EOP, kf1=\EOQ, kf2=\EOR,
+	kf3=\EOS, lf0=PF1, lf1=PF2, lf2=PF3, lf3=PF4, ll=\E[24;1H,
+	nel=\EE, rc=\E8, rev=\E[7m, ri=\EM, rmacs=^O, rmkx=\E>,
+	rmso=\E[m, rmul=\E[m,
+	rs1=\E[1w\E[>37m\E[>39m\E[1v\E[20l\E[?3l\E[?6l\E[>5h\E[>6h
+	    \E[>7h\E[>8l\E[>9h\E[>10l\E[1;24r\E[m\E[q\E(B\017\E)0\E#
+	    5\E>,
+	sc=\E7, sgr0=\E[m, smacs=^N, smkx=\E=, smso=\E[7m,
+	smul=\E[4m, tbc=\E[3g,
+# [TO DO: Check out: short forms of ho/cl and ll; reset (\Ec)].
+rt6221-w|Ramtek 6221 160x48,
+	cols#160, lines#48,
+	ll=\E[48;1H, use=rt6221,
+
+#### RCA
+#
+
+# RCA VP3301 or VP3501
+rca|RCA vp3301/vp3501,
+	OTbs,
+	cols#40, lines#24,
+	clear=^L, cuf1=^U, cup=\EY%p1%{32}%+%c%p2%{32}%+%c,
+	cuu1=^K, home=^Z, rmso=\E\ES0, smso=\E\ES1,
+
+
+#### Selanar
+#
+
+# Selanar HiREZ-100 from BRL, probably by Doug Gwyn
+# The following SET-UP modes are assumed for normal operation:
+#	SET_DEFAULT_TABS	48_LINES		80_COLUMNS
+#	ONLINE			ANSI			CURSOR_VISIBLE
+#	VT102_AUTO_WRAP_ON	VT102_NEWLINE_OFF	VT102_MONITOR_MODE_OFF
+#	LOCAL_ECHO_OFF		US_CHAR_SET		WPS_TERMINAL_DISABLED
+#	CPU_AUTO_XON/XOFF_ENABLED			PRINT_FULL_SCREEN
+# For use with graphics software, all graphics modes should be set to factory
+# default.  Other SET-UP modes may be set for operator convenience or
+# communication requirements.  No delays are specified; use "stty ixon -ixany"
+# to enable DC3/DC1 flow control!
+# I commented out the scrolling capabilities since they are too slow.
+hirez100|Selanar HiREZ-100,
+	OTbs, OTpt, mir, msgr, xon,
+	OTkn#4, cols#80, it#8, lines#48, vt#3,
+	acsc=, bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[J,
+	cr=\r, cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=\n,
+	cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH,
+	cuu=\E[%p1%dA, cuu1=\EM, dch=\E[%p1%dP, dch1=\E[P,
+	dl=\E[%p1%dM, dl1=\E[M, ed=\E[J, el=\E[K, home=\E[H, ht=^I,
+	hts=\EH, il=\E[%p1%dL, il1=\E[L, is2=\E<\E)0, kbs=^H,
+	kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kf0=\EOP,
+	kf1=\EOQ, kf2=\EOR, kf3=\EOS, lf0=PF1, lf1=PF2, lf2=PF3,
+	lf3=PF4, ll=\E[48H, mc0=\E[i, mc4=\E[4i\E[?4i,
+	mc5=\E[?5i\E[5i, nel=\EE, rc=\E8, rev=\E[7m, rmacs=^O,
+	rmkx=\E[?1l\E>, rmso=\E[m, rmul=\E[m,
+	rs1=\030\E2\E<\E[4i\E[?4i\E[12h\E[2;4;20l\E[?0;7h\E[?1;3;6;1
+	    9l\E[r\E[m\E(B\017\E)0\E>,
+	sc=\E7, sgr0=\E[m, smacs=^N, smkx=\E[?1h\E=, smso=\E[7m,
+	smul=\E[4m, tbc=\E[3g,
+hirez100-w|Selanar HiREZ-100 in 132-column mode,
+	cols#132, use=hirez100,
+
+#### Signetics
+#
+
+# From University of Wisconsin
+vsc|Signetics Vsc Video driver by RMC,
+	am, msgr,
+	cols#80, it#8, lines#26,
+	clear=\E[;H\E[2J$<50/>, cr=\r, cub1=^H, cud1=\n, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, el=\E[K, home=\E[H,
+	ht=^I, ind=\n, kbs=^H, kcub1=^H, kcud1=\n, nel=\r\n, rev=^_\s,
+	rmso=^_!, rmul=^_#, sgr0=^_!, smso=^_\s, smul=^_",
+
+#### Soroc
+#
+# Alan Frisbie <frisbie@flying-disk.com> writes:
+#
+# As you may recall, the Soroc logo consisted of their name,
+# with the letter "S" superimposed over an odd design.   This
+# consisted of a circle with a slightly smaller 15 degree (approx.)
+# wedge with rounded corners inside it.   The color was sort of
+# a metallic gold/yellow.
+#
+# If I had been more of a beer drinker it might have been obvious
+# to me, but it took a clue from their service department to make
+# me exclaim, "Of course!"   The circular object was the top of
+# a beer can (the old removable pop-top style) and "Soroc" was an
+# anagram for "Coors".
+#
+# I can just imagine the founders of the company sitting around
+# one evening, tossing back a few and trying to decide what to
+# call their new company and what to use for a logo.
+#
+
+# (soroc120: removed obsolete ":ma=^K^P^R^L^L :" -- esr)
+soroc120|iq120|soroc|Soroc iq120,
+	clear=\E*$<2>, cud1=\n, ed=\EY, el=\ET, kcub1=^H, kcud1=\n,
+	kcuf1=^L, kcuu1=^K, use=adm3a,
+soroc140|iq140|Soroc iq140,
+	OTbs, am, mir,
+	cols#80, lines#24,
+	bel=^G, cbt=\EI, clear=\E+, cr=\r, cub1=^H, cud1=\n, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\Ew,
+	dl1=\Er$<.7*>, ed=\Ey, el=\Et, home=^^, il1=\Ee$<1*>, ind=\n,
+	kbs=^H, kcuf1=^L, kcuu1=^K, kf0=^A0\r, kf1=^A@\r, kf2=^AA\r,
+	kf3=^AB\r, kf4=^AC\r, kf5=^AD\r, kf6=^AE\r, kf7=^AF\r,
+	kf8=^AG\r, kf9=^AH\r, khome=^^, ll=^^^K, rmir=\E8, rmso=\E^?,
+	rmul=\E^A, smir=\E9, smso=\E^?, smul=\E^A,
+
+#### Southwest Technical Products
+#
+# These guys made an early personal micro called the M6800.
+# The ct82 was probably its console terminal.
+#
+
+# (swtp: removed obsolete ":bc=^D:" -- esr)
+swtp|ct82|Southwest Technical Products ct82,
+	am,
+	cols#82, lines#20,
+	bel=^G, clear=^L, cr=\r, cub1=^D, cud1=\n, cuf1=^S,
+	cup=\013%p2%c%p1%c, cuu1=^A, dch1=^\^H, dl1=^Z, ed=^V, el=^F,
+	home=^P, ich1=^\^X, il1=^\^Y, ind=^N,
+	is2=\034\022\036\023\036\004\035\027\011\023\036\035\036
+	    \017\035\027\022\011,
+	ll=^C, ri=^O, rmso=^^^F, smso=^^^V,
+
+#### Synertek
+#
+# Bob Manson <manson@pattyr.acs.ohio-state.edu> writes (28 Apr 1995):
+#
+# Synertek used to make ICs, various 6502-based single-board process
+# control and hobbyist computers, and assorted peripherals including a
+# series of small inexpensive terminals (I think they were one of the
+# first to have a "terminal-on-a-keyboard", where the terminal itself
+# was only slightly larger than the keyboard).
+#
+# They apparently had a KTM-1 model, which I've never seen. The KTM-2/40
+# was a 40x24 terminal that could connect to a standard TV through a
+# video modulator.  The KTM-2/80 was the 80-column version (the 2/40
+# could be upgraded to the 2/80 by adding 2 2114 SRAMs and a new ROM).
+# I have a KTM-2/80 still in working order.  The KTM-2s had fully
+# socketed parts, used 2 6507s, a 6532 as keyboard scanner, a program
+# ROM and 2 ROMs as character generators. They were incredibly simple,
+# and I've never had any problems with mine (witness the fact that mine
+# was made in 1981 and is still working great... I've blown the video
+# output transistor a couple of times, but it's a 2N2222 :-)
+#
+# The KTM-3 (which is what is listed in the terminfo file) was their
+# attempt at putting a KTM-2 in a box (and some models came with a
+# CRT). It wasn't much different from the KTM-2 hardware-wise, but the
+# control and escape sequences are very different. The KTM-3 was always
+# real broken, at least according to the folks I've talked to about it.
+#
+# The padding in the entry is probably off--these terminals were very
+# slow (it takes like 100ms for the KTM-2 to clear the screen...) And
+# anyone with any sanity replaced the ROMs with something that provided
+# a reasonable subset of VT100 functionality, since the usual ROMs were
+# obviously very primitive... oh, you could get an upgraded ROM from
+# Synertek for some incredible amount of money, but what hacker with an
+# EPROM burner would do that? :)
+#
+# Sorry I don't have any contact info; I believe they were located in
+# Sunnyvale, and I'm fairly sure they are still manufacturing ICs
+# (they've gone to ASICs and FPGAs), but I doubt they're in the computer
+# business these days.
+#
+
+# Tested, seems to work fine with vi.
+synertek|ktm|synertek380|Synertek KTM 3/80 tubeless terminal,
+	am,
+	cols#80, lines#24,
+	clear=^Z, cub1=^H, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, ed=\EJ, el=\EK,
+
+#### Tab Office Products
+#
+#	TAB Products Co. - Palo Alto, California
+#	Electronic Office Products,
+#	1451 California Avenue 94304
+#
+# I think they're out of business.
+#
+
+# The tab 132 uses xon/xoff, so no padding needed.
+# <smkx>/<rmkx> have nothing to do with arrow keys.
+# <is2> sets 80 col mode, normal video, autowrap on (for <am>).
+# Seems to be no way to get rid of status line.
+# The manual for this puppy was dated June 1981.  It claims to be VT52-
+# compatible but looks more VT100-like -esr
+#
+# According to
+# https://ub.fnwi.uva.nl/computermuseum/tab13215g.html
+#	This monochrome graphics terminal of TAB Products, California, is a DEC
+#	VT52/VT100/VT132 compatible alphanumeric terminal (TAB 132/15),
+#	factory-fitted with additional hardware for Tektronix 4010 emulation. 
+#	Also the terminal understands a selection of Tektronix 4027 commands. 
+tab132|tab|tab132-15|tab 132/15,
+	da, db,
+	OTdN@, cols#80, lines#24, lm#96,
+	cud1=\n, cup=\E[%i%p1%d;%p2%dH, dch1=\E[P, dl1=\E[M,
+	il1=\E[L, is2=\E[?7h\E[?3l\E[?5l, kcub1=\E[D, kcud1=\E[B,
+	kcuu1=\E[A, rmir=\E[4l, rmkx@, smir=\E[4h, smkx@,
+	use=decid+cpr, use=vt100+4bsd,
+tab132-w|tab132 in wide mode,
+	cols#132,
+	is2=\E[?7h\E[?3h\E[?5l, use=tab132,
+tab132-rv|tab132 in reverse-video mode,
+	is2=\E[?7h\E[?3l\E[?5h, use=tab132,
+tab132-w-rv|tab132 in reverse-video/wide mode,
+	is2=\E[?7h\E[?3h\E[?5h, use=tab132-w,
+
+
+#### Teleray
+#
+#	Research Incorporated
+#	6425 Flying Cloud Drive
+#	Eden Prairie, MN 55344
+#	Vox: (612)-941-3300
+#
+# The Teleray terminals were all discontinued in 1992-93.  RI still services
+# and repairs these beasts, but no longer manufactures them.  The Teleray
+# people believe that all the types listed below are very rare now (1995).
+# There was a newer line of Telerays (Model 7, Model 20, Model 30, and
+# Model 100) that were ANSI-compatible.
+#
+# Note two things called "teleray".  Reorder should move the common one
+# to the front if you have either.  A dumb Teleray with the cursor stuck
+# on the bottom and no obvious model number is probably a 3700.
+#
+
+t3700|dumb Teleray 3700,
+	OTbs,
+	cols#80, lines#24,
+	bel=^G, clear=^L, cr=\r, cub1=^H, cud1=\n, ind=\n,
+t3800|Teleray 3800 series,
+	OTbs,
+	cols#80, it#8, lines#24,
+	bel=^G, clear=^L, cr=\r, cub1=^H, cud1=\n, cuf1=\EC,
+	cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, ed=\EJ, el=\EK,
+	home=\EH, ht=^I, ind=\n, ll=\EY7\s,
+t1061|teleray|Teleray 1061,
+	OTbs, am, km, xhp, xt,
+	cols#80, it#8, lines#24, xmc#1,
+	bel=^G, clear=\014$<1>, cr=\r, cub1=^H, cud1=\n, cuf1=\EC,
+	cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, dch1=\EQ,
+	dl1=\EM$<2*>, ed=\EJ$<1>, el=\EK, home=\EH, ht=^I, hts=\EF,
+	ich1=\EP, il1=\EL$<2*>, ind=\n, ip=$<0.4*>,
+	is2=\Ee\EU01^Z1\EV\EU02^Z2\EV\EU03^Z3\EV\EU04^Z4\EV\EU05^Z5
+	    \EV\EU06^Z6\EV\EU07^Z7\EV\EU08^Z8\EV\Ef,
+	kf1=^Z1, kf2=^Z2, kf3=^Z3, kf4=^Z4, kf5=^Z5, kf6=^Z6, kf7=^Z7,
+	kf8=^Z8, rmso=\ER@, rmul=\ER@, smso=\s\ERD, smul=\ERH,
+	tbc=\EG,
+t1061f|Teleray 1061 with fast PROMs,
+	dl1=\EM, il1=\EL, ip@, use=t1061,
+# "Teleray Arpa Special", officially designated as
+# "Teleray Arpa network model 10" with "Special feature 720".
+# This is the new (1981) fast microcode updating the older "arpa" proms
+# (which gave meta-key and programmable-fxn keys).  720 is much much faster,
+# converts the keypad to programmable function keys, and has other goodies.
+# Standout mode is still broken (magic cookie, etc) so is suppressed as no
+# programs handle such lossage properly.
+# Note: this is NOT the old termcap's "t1061f with fast proms."
+# From: J. Lepreau <lepreau@utah-cs> Tue Feb  1 06:39:37 1983, Univ of Utah
+# (t10: removed overridden ":so@:se@:us@:ue@:" -- esr)
+t10|Teleray 10 special,
+	OTbs, km, xhp, xt,
+	cols#80, it#8, lines#24, xmc#2,
+	clear=\Ej$<30/>, cub1=^H, cud1=\EB, cuf1=\EC,
+	cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, dch1=\EQ,
+	dl1=\EM, ed=\EJ, el=\EK, home=\EH, ht=^I, ich1=\EP, il1=\EL,
+	ind=\Eq, pad=\0, ri=\Ep, rmso=\ER@, rmul=\ER@, smso=\ERD,
+	smul=\ERH,
+# Teleray 16 - map the arrow keys for vi/rogue, shifted to up/down page, and
+# back/forth words. Put the function keys (f1-f10) where they can be
+# found, and turn off the other magic keys along the top row, except
+# for line/local. Do the magic appropriate to make the page shifts work.
+# Also toggle ^S/^Q for those of us who use Emacs.
+t16|Teleray 16,
+	am, da, db, mir, xhp, xt,
+	cols#80, lines#24,
+	bel=^G, clear=\E[H\E[2J, cr=\r, cub1=^H, cud1=\E[B,
+	cuf1=\E[C, cup=%i\E[%p1%d;%p2%df, cuu1=\E[A, dch1=\E[P,
+	dl1=\E[M, ed=\E[0J, el=\E[0K, home=\E[H, ht=^I, il1=\E[L,
+	ind=\n, kf1=^Z1, kf10=^Z0, kf2=^Z2, kf3=^Z3, kf4=^Z4, kf5=^Z5,
+	kf6=^Z6, kf7=^Z7, kf8=^Z8, kf9=^Z9, ri=\E[T,
+	rmcup=\E[V\E[24;1f\E[?38h, rmir=\E[4l, rmso=\E[m,
+	rmul=\E[m, sgr0=\E[m, smcup=\E[U\E[?38l, smir=\E[4h,
+	smso=\E[7m, smul=\E[4m,
+
+#### Texas Instruments (ti)
+#
+
+# The Silent 700 was so called because it was built around a quiet thermal
+# printer.  It was portable, equipped with an acoustic coupler, and pretty
+# neat for its day.
+ti700|ti733|ti735|ti745|ti800|Texas Instruments Silent 700/733/735/745 or OMNI 800,
+	OTbs, hc, os,
+	cols#80,
+	bel=^G, cr=\r$<162>, cub1=^H, cud1=\n, ind=\n,
+
+# Terminal entries for the Texas Instruments 703/707
+# hardcopy terminals.
+#
+# http://www.bitsavers.org/pdf/ti/terminal/silent_700/
+# Refer to:
+#	Model 707 Data Terminal User's Manual
+#	http://www.bitsavers.org/pdf/ti/terminal/silent_700/2310451-0001_Silent_700_Model_707_Users_Manual_Nov1983.pdf
+#
+# pages 2-7 and 2-8 say that the model 707 prints 10.2 characters per inch
+# (cpi) (80 characters per line) by default, and can be switched to/from 17.0
+# cpi using an escape sequence.  There is no 80/132-column capability in
+# terminfo (only the more general cpi which allows any value).
+ti703|ti707|Texas Instruments Silent 703/707,
+	am, xenl,
+	it#8,
+	cuf1=\s, is2=\EPC\\, nel=\r\n, use=ti700,
+ti703-w|ti707-w|Texas Instruments Silent 703/707 (132 column),
+	cols#132,
+	is2=\EPD\\, use=ti703,
+
+#
+# Texas Instruments 916 VDT 7 bit control mode
+#
+ti916|ti916-220-7|Texas Instruments 916 VDT 8859/1 VT220 mode 7 bit CTRL,
+	da, db, in, msgr,
+	cbt=\E[Z, clear=\E[H\E[2J$<6>, cub=\E[%p1%dD,
+	cud=\E[%p1%dB, cuf=\E[%p1%dC, cup=\E[%i%p1%d;%p2%dH,
+	cuu=\E[%p1%dA, dch=\E[%p1%dP$<250>, dch1=\E[P,
+	dl=\E[%p1%dM, ech=\E[%p1%dX$<20>, ed=\E[J$<6>, el=\E[0K,
+	el1=\E[1K, enacs=\E(B\E)0, ff=^L, flash=\E[?5h\E[?5l$<6>,
+	hpa=\E[%p1%{1}%+%dG, hts=\E[0W, ich=\E[%p1%d@$<250>,
+	il=\E[%p1%dL$<36>, ip=$<10>, is2=\E[1;24r\E[24;1H,
+	kcmd=\E[29~, kdch1=\E[P, kent=\n, kf1=\E[17~, kf10=\E[28~,
+	kf11=\E[29~, kf12=\E[31~, kf2=\E[18~, kf3=\E[19~,
+	kf4=\E[20~, kf5=\E[21~, kf6=\E[23~, kf7=\E[24~, kf8=\E[25~,
+	kf9=\E[26~, khome=\E[H, kich1=\E[@, knp=\E[S, kpp=\E[T,
+	kprt=^X, prot=\E&, rmacs=\017$<2>, rs2=\E[!p, sgr@,
+	smacs=\016$<2>, tbc=\E[3g, vpa=\E[%p1%{1}%+%dd,
+	use=vt220,
+#
+# Texas Instruments 916 VDT 8 bit control mode
+#
+ti916-8|ti916-220-8|Texas Instruments 916 VDT 8859/1 8 VT220 mode bit CTRL,
+	kcmd=\23329~, kcub1=\233D, kcud1=\233B, kcuf1=\233C,
+	kcuu1=\233A, kdch1=\233P, kent=\n, kf1=\23317~,
+	kf10=\23328~, kf11=\23329~, kf12=\23331~, kf2=\23318~,
+	kf3=\23319~, kf4=\23320~, kf5=\23321~, kf6=\23323~,
+	kf7=\23324~, kf8=\23325~, kf9=\23326~, khome=\233H,
+	kich1=\233@, knp=\233S, kpp=\233T, kprt=^X, use=ti916,
+#
+# Texas Instruments 916 VDT 8859/1 7 bit control 132 column mode
+#
+ti916-132|Texas Instruments 916 VDT VT220 132 column,
+	cols#132, use=ti916,
+#
+# Texas Instruments 916 VDT 8859/1 8 bit control 132 column mode
+#
+ti916-8-132|Texas Instruments 916 VDT 8-bit VT220 132 column,
+	cols#132, use=ti916-8,
+ti924|Texas Instruments 924 VDT 8859/1 7 bit CTRL,
+	OTbs, am, xon,
+	cols#80, it#8, lines#24,
+	bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[2J\E[H, cr=\r,
+	csr=%i\E[%p1%d;%p2%dr, cub1=\E[D, cud1=\E[B, cuf1=\E[C,
+	cup=%i\E[%p1%d;%p2%dH, cuu1=\E[A, cvvis=\E[?31h,
+	dl1=\E[M, ed=\E[J, el=\E[K, home=\E[H, ht=^I, hts=\EH,
+	il1=\E[L, ind=\ED, kbs=^H, kcub1=\E[D, kcud1=\E[B,
+	kcuf1=\E[C, kcuu1=\E[A, kdch1=\E[P, kf1=\EOP, kf2=\EOQ,
+	kf3=\EOR, kf4=\EOS, kf5=\E[16~, kf6=\E[17~, kf7=\E[18~,
+	kf8=\E[19~, kf9=\E[20~, kich1=\E[@, rc=\E8, rev=\E[7m,
+	ri=\EM, rmso=\E[m, rmul=\E[m, sc=\E7, sgr0=\E[m, smso=\E[7m,
+	smul=\E[4m, tbc=\E[3g, use=vt220+cvis,
+ti924-8|Texas Instruments 924 VDT 8859/1 8 bit CTRL,
+	am, xon,
+	cols#80, it#8, lines#24,
+	bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[2J\E[H, cr=\r,
+	csr=%i\E[%p1%d;%p2%dr, cub1=\E[D, cud1=\E[B, cuf1=\E[C,
+	cup=%i\E[%p1%d;%p2%dH, cuu1=\E[A, cvvis=\E[?31h,
+	dl1=\E[M, ed=\E[J, el=\E[K, home=\E[H, ht=^I, hts=\EH,
+	il1=\E[L, ind=\ED, kbs=^H, kcub1=\E[D, kcud1=\E[B,
+	kcuf1=\E[C, kcuu1=\E[A, kdch1=\233P, kf1=\217P, kf2=\217Q,
+	kf3=\217R, kf4=\217S, kf5=\23316~, kf6=\23317~,
+	kf7=\23318~, kf8=\23319~, kf9=\23320~, kich1=\233@, rc=\E8,
+	rev=\E[7m, ri=\EM, rmso=\E[m, rmul=\E[m, sc=\E7, sgr0=\E[m,
+	smso=\E[7m, smul=\E[4m, tbc=\E[3g, use=vt220+cvis,
+ti924w|Texas Instruments 924 VDT 7 bit - 132 column mode,
+	cols#132, use=ti924,
+ti924-8w|Texas Instruments 924 VDT 8 bit - 132 column mode,
+	cols#132, use=ti924-8,
+ti931|Texas Instruments 931 VDT,
+	OTbs, am, xon,
+	cols#80, lines#24,
+	bel=^G, blink=\E4P, clear=\EL, cnorm=\E4@, cr=\r, cub1=\ED,
+	cud1=\EB, cuf1=\EC, cup=\EY%p1%{32}%+%c%p2%{32}%+%c,
+	cuu1=\EA, dch1=\EQ, dl1=\EO, ed=\EJ, el=\EI, home=\EH,
+	ich1=\ER\EP\EM, il1=\EN, ind=\Ea, invis=\E4H,
+	is2=\EGB\E(@B@@\E), kcub1=\ED, kcud1=\EB, kcuf1=\EC,
+	kcuu1=\EA, kdch1=\EQ, kdl1=\EO, kf1=\Ei1, kf2=\Ei2, kf3=\Ei3,
+	kf4=\Ei4, kf5=\Ei5, kf6=\Ei6, kf7=\Ei7, kf8=\Ei8, kf9=\Ei9,
+	kich1=\EP, kil1=\EN, rev=\E4B, ri=\Eb, rmso=\E4@, rmul=\E4@,
+	sgr0=\E4@, smso=\E4A, smul=\E4D,
+ti926|Texas Instruments 926 VDT 8859/1 7 bit CTRL,
+	csr@, ind=\E[1S, ri=\E[1T, use=ti924,
+# (ti926-8: I corrected this from the broken SCO entry -- esr)
+ti926-8|Texas Instruments 926 VDT 8859/1 8 bit CTRL,
+	csr@, ind=\2331S, ri=\2331T, use=ti924-8,
+ti_ansi|basic entry for ti928,
+	am, bce, eo, xenl, xon,
+	colors#8, cols#80, it#8, lines#25, pairs#64,
+	bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, clear=\E[2J\E[H,
+	cr=\r, csr=\E[%i%p1%d;%p2%dr, cub1=^H, cud1=\E[B,
+	cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, dch1=\E[P,
+	dl1=\E[M, ed=\E[J, el=\E[K, home=\E[H, ht=^I, ich1=\E[@,
+	il1=\E[L, ind=\E[S, kbs=^H, kcub1=\E[D, kcud1=\E[B,
+	kcuf1=\E[C, kcuu1=\E[A, kend=\E[F, kf0=\E[V, kf1=\E[M,
+	kf2=\E[N, kf3=\E[O, kf4=\E[P, kf5=\E[Q, kf6=\E[R, kf7=\E[S,
+	kf8=\E[T, kf9=\E[U, khome=\E[H, knp=\E[G, kpp=\E[I,
+	op=\E[37;40m, ri=\E[T, rmso=\E[m, rmul=\E[m,
+	setab=\E[4%p1%dm, setaf=\E[3%p1%dm, sgr0=\E[m,
+	smso=\E[7m, smul=\E[4m,
+#
+#       928 VDT 7 bit control mode
+#
+ti928|Texas Instruments 928 VDT 8859/1 7 bit CTRL,
+	kdch1=\E[P, kend=\E_1\E\\, kent=\E[8~, kf1=\E[17~,
+	kf10=\E[28~, kf11=\E[29~, kf12=\E[31~, kf13=\E[32~,
+	kf15=\E[34~, kf2=\E[18~, kf3=\E[19~, kf4=\E[20~,
+	kf5=\E[21~, kf6=\E[23~, kf7=\E[24~, kf8=\E[25~, kf9=\E[26~,
+	kich1=\E[@, knp=\E[S, kpp=\E[T, kprt=\E[35~, use=ti_ansi,
+#
+#       928 VDT 8 bit control mode
+#
+ti928-8|Texas Instruments 928 VDT 8859/1 8 bit CTRL,
+	kdch1=\233P, kend=\2371\234, kent=\2338~, kf1=\23317~,
+	kf10=\23328~, kf11=\23329~, kf12=\23331~, kf13=\23332~,
+	kf15=\23334~, kf2=\23318~, kf3=\23319~, kf4=\23320~,
+	kf5=\23321~, kf6=\23323~, kf7=\23324~, kf8=\23325~,
+	kf9=\23326~, khome=\233H, kich1=\233@, knp=\233S,
+	kpp=\233T, kprt=\23335~, use=ti_ansi,
+
+#### Zentec (zen)
+#
+
+# (zen30: removed obsolete :ma=^L ^R^L^K^P:.  This entry originally
+# had just <smso>=\EG6 which I think means standout was supposed to be
+# dim-reverse using ADM12-style attributes. ADM12 <smul>/<rmul> and
+# <invis> might work-- esr)
+zen30|z30|Zentec 30,
+	OTbs, am, mir, ul,
+	cols#80, lines#24,
+	bel=^G, clear=\E*, cr=\r, cub1=^H, cud1=\n, cuf1=^L,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW,
+	dim=\EG2, dl1=\ER$<1.5*>, ed=\EY, el=\ET$<1.0*>, home=^^,
+	il1=\EE$<1.5*>, ind=\n, rmir=\Er, rmul@, smir=\Eq, smso=\EG6,
+	smul@, use=adm+sgr,
+# (zen50: this had extension capabilities
+#	:BS=^U:CL=^V:CR=^B:
+# UK/DK/RK/LK/HM were someone's aliases for ku/kd/kl/kr/kh,
+# which were also in the original entry -- esr)
+# (zen50: removed obsolete ":ma=^Hh^Ll^Jj^Kk:" -- esr)
+zen50|z50|Zentec Zephyr,
+	OTbs, am,
+	cols#80, lines#24, xmc#1,
+	clear=\E+, cub1=^H, cup=\E=%p1%{32}%+%c%p2%{32}%+%c,
+	cuu1=^K, dch1=\EW, dl1=\ER, ed=\EY, el=\ET, ich1=\EQ, il1=\EE,
+	invis@, kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K, khome=^^,
+	rmul@, smul@, use=adm+sgr,
+
+# CCI 4574 (Office Power) from Will Martin <wmartin@BRL.ARPA> via BRL
+cci|cci1|z8001|zen8001|CCI Custom Zentec 8001,
+	OTbs, am, bw,
+	cols#80, lines#24,
+	blink=\EM", clear=\EH\EJ, cnorm=\EP,
+	csr=\ER%p1%{32}%+%c%p2%{32}%+%c, cub1=^H, cud1=\n,
+	cuf1=\EC, cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA,
+	cvvis=\EF\EQ\EM \ER 7, dim=\EM!, ed=\EJ, el=\EK, home=\EH,
+	invis=\EM(, is2=\EM \EF\ET\EP\ER 7, kbs=^H, kcub1=\ED,
+	kcud1=\EB, kcuf1=\EC, kcuu1=\EA, khome=\EH, mc4=^T, mc5=^R,
+	rev=\EM$, ri=\EI, rmso=\EM\s, rmul=\EM\s, sgr0=\EM\s,
+	smso=\EM$, smul=\EM0,
+
+######## OBSOLETE UNIX CONSOLES
+#
+
+#### Apollo consoles
+#
+# Apollo got bought by Hewlett-Packard.  The Apollo workstations are
+# labeled HP700s now.
+#
+
+# From: Gary Darland <goodmanc@garnet.berkeley.edu>
+apollo|Apollo console,
+	OTbs, am, mir,
+	cols#88, lines#53,
+	clear=^L, cub1=^H, cud1=\EB, cuf1=\EC,
+	cup=\EM%p1%{32}%+%c%p2%d), cuu1=\EA, dch1=\EP, dl1=\EL,
+	ed=\EJ, el=\EK, hpa=\EN%p1%d, il1=\EI, ind=\EE, ri=\ED,
+	rmcup=\EX, rmir=\ER, rmso=\ET, rmul=\EV, smcup=\EW, smir=\EQ,
+	smso=\ES, smul=\EU, vpa=\EO+\s,
+
+# We don't know whether or not the apollo guys replicated DEC's firmware bug
+# in the VT132 that reversed <rmir>/<smir>.  To be on the safe side, disable
+# both these capabilities.
+apollo+vt132|Apollo console emulating VT132,
+	rmir@, smir@, use=vt132,
+
+apollo_15P|Apollo 15 inch display,
+	use=apollo+vt132,
+apollo_19L|Apollo 19 inch display,
+	use=apollo+vt132,
+apollo_color|Apollo color display,
+	use=apollo+vt132,
+
+#### AT&T consoles
+
+# This actually describes the generic SVr4 display driver for Intel boxes.
+# The <dim=\E[2m> isn't documented and therefore may not be reliable.
+# From: Eric Raymond <esr@snark.thyrsus.com> Mon Nov 27 19:00:53 EST 1995
+att6386|at386|386at|AT&T WGS 6386 console,
+	am, bw, eo, xon,
+	cols#80, it#8, lines#25,
+	acsc=``a1fxgqh0jYk?lZm@nEooppqDrrsstCu4vAwBx3yyzz{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, civis=\E[=C,
+	clear=\E[2J\E[H, cnorm=\E[=1C, cr=\r, cub=\E[%p1%dD,
+	cub1=\E[D, cud=\E[%p1%dB, cud1=\E[B, cuf=\E[%p1%dC,
+	cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA,
+	cuu1=\E[A, dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m,
+	dl=\E[%p1%dM, dl1=\E[1M, ech=\E[%p1%dX, ed=\E[J, el=\E[K,
+	home=\E[H, hpa=\E[%i%p1%dG, ht=^I, hts=\EH, ich=\E[%p1%d@,
+	ich1=\E[1@, il=\E[%p1%dL, il1=\E[1L, ind=\E[S, invis=\E[9m,
+	is2=\E[0;10;39m, kbs=^H, kcbt=^], kcub1=\E[D, kcud1=\E[B,
+	kcuf1=\E[C, kcuu1=\E[A, kdch1=\E[P, kend=\E[Y, kf1=\EOP,
+	kf10=\EOY, kf11=\EOZ, kf12=\EOA, kf2=\EOQ, kf3=\EOR,
+	kf4=\EOS, kf5=\EOT, kf6=\EOU, kf7=\EOV, kf8=\EOW, kf9=\EOX,
+	khome=\E[H, kich1=\E[@, knp=\E[U, kpp=\E[V, krmir=\E0,
+	nel=\r\E[S, rc=\E8, rev=\E[7m, ri=\E[T, rmacs=\E[10m,
+	rmso=\E[m, rmul=\E[m, sc=\E7,
+	sgr=\E[10m\E[0%?%p1%p3%|%t;7%;%?%p2%t;4%;%?%p4%t;5%;%?%p5%t;
+	    2%;%?%p6%t;1%;%?%p9%t;12%e;10%;%?%p7%t;9%;m,
+	sgr0=\E[0;10m, smacs=\E[12m, smso=\E[7m, smul=\E[4m,
+	tbc=\E[3g, vpa=\E[%i%p1%dd, use=ecma+index,
+	use=klone+color,
+# (pc6300plus: removed ":KM=/usr/lib/ua/kmap.s5:"; renamed BO/EE/CI/CV -- esr)
+pc6300plus|AT&T 6300 plus,
+	OTbs, am, xon,
+	cols#80, lines#24,
+	bel=^G, blink=\E[5m, bold=\E[1m, civis=\E[=C,
+	clear=\E[2J\E[H, cnorm=\E[=1C, cr=\r, cub1=^H, cud1=\E[B,
+	cuf1=\E[C, cup=\E[%i%p1%2d;%p2%2dH, cuu1=\E[A,
+	dch1=\E[1P, dim=\E[2m, dl1=\E[1M, ed=\E[0J, el=\E[0K,
+	home=\E[H, hts=\EH, ich1=\E[1@, il1=\E[1L, ind=\n,
+	invis=\E[9m, kbs=^H, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C,
+	kcuu1=\E[A, kf1=\EOc, kf10=\EOu, kf2=\EOd, kf3=\EOe,
+	kf4=\EOf, kf5=\EOg, kf6=\EOh, kf7=\EOi, kf8=\EOj, kf9=\EOk,
+	nel=\r\n, rev=\E[7m, rmso=\E[m, rmul=\E[m, sgr0=\E[m,
+	smso=\E[7m, smul=\E[4m, tbc=\E[3g,
+
+# From: Benjamin C. W. Sittler <bsittler@nmt.edu>
+#
+# I have a UNIX PC which I use as a terminal attached to my Linux PC.
+# Unfortunately, the UNIX PC terminfo entry that comes with ncurses
+# is broken. All the special key sequences are broken, making it unusable
+# with Emacs. The problem stems from the following:
+#
+# The UNIX PC has a plethora of keys (103 of them, and there's no numeric
+# keypad!), loadable fonts, and strange highlighting modes ("dithered"
+# half-intensity, "smeared" bold, and real strike-out, for example.) It also
+# uses resizable terminal windows, but the bundled terminal program always
+# uses an 80x24 window (and doesn't support seem to support a 132-column
+# mode.)
+#
+# HISTORY: The UNIX PC was one of the first machines with a GUI, and used a
+# library which was a superset of SVr3.5 curses (called tam, for "terminal
+# access method".) tam includes support for real, overlapping windows,
+# onscreen function key labels, and bitmap graphics. But since the primary
+# user interface on the UNIX PC was a GUI program (ua, for "user
+# assistant",) and remote administration was considered important for the
+# machine, tam also supported VT100-compatible terminals attached to the
+# serial port or used across the StarLan network. To simulate the extra keys
+# not present on a VT100, users could press ESC and a two-letter sequence,
+# such as u d (Undo) or U D (Shift-Undo.) These two-letter sequences,
+# however, were not the same as those sent by the actual Undo key. The
+# actual Undo key sends ESC 0 s unshifted, and ESC 0 S shifted, for example.
+# (If you're interested in adding some of the tam calls to ncurses, btw, I
+# have the full documentation and several programs which use tam. It also
+# used an extended terminfo format to describe key sequences, special
+# highlighting modes, etc.)
+#
+# KEYS: This means that ncurses would quite painful on the UNIX PC, since
+# there are two sequences for every key-modifier combination (local keyboard
+# sequence and remote "VT100" sequence.) But I doubt many people are trying
+# to use ncurses on the UNIX PC, since ncurses doesn't properly handle the
+# GUI. Unfortunately, the terminfo entry (and the termcap, too, I presume)
+# seem to have been built from the manual describing the VT100 sequences.
+# This means it doesn't work for a real live UNIX PC.
+#
+# FONTS: The UNIX PC also has a strange interpretation of "alternate
+# character set". Rather than the VT100 graphics you might expect, it allows
+# up to 8 custom fonts to be loaded at any given time. This means that
+# programs expecting VT100 graphics will usually be disappointed. For this
+# reason I have disabled the smacs/rmacs sequences, but they could easily be
+# re-enabled. Here are the relevant control sequences (from the ESCAPE(7)
+# manpage), should you wish to do so:
+#
+# SGR10 - Select font 0 - ESC [ 10 m or SO
+# SGR11 - Select font 1 - ESC [ 11 m or SI
+# SGR12 - Select font 2 - ESC [ 12 m
+# ... (etc.)
+# SGR17 - Select font 7 - ESC [ 17 m
+#
+# Graphics for line drawing are not reliably found at *any* character
+# location because the UNIX PC has dynamically reloadable fonts. I use font
+# 0 for regular text and font 1 for italics, but this is by no means
+# universal. So ASCII line drawing is in order if smacs/rmacs are enabled.
+#
+# MISC: The cursor visible/cursor invisible sequences were swapped in the
+# distributed terminfo.
+#
+# To ameliorate these problems (and fix a few highlighting bugs) I rewrote
+# the UNIX PC terminfo entry. The modified version works great with Lynx,
+# Emacs, and XEmacs running on my Linux PC and displaying on the UNIX PC
+# attached by serial cable. In Emacs, even the Undo key works, and many
+# applications can now use the F1-F8 keys.
+#
+# esr's notes:
+#	Terminfo entry for the AT&T Unix PC 7300
+#	from escape(7) in Unix PC 7300 Manual.
+#	Somewhat similar to a vt100-am (but different enough
+#	to redo this from scratch.)
+#
+#	/***************************************************************
+#	*
+#	*           FONT LOADING PROGRAM FOR THE UNIX PC
+#	*
+#	*     This routine loads a font defined in the file ALTFONT
+#	*     into font memory slot #1.  Once the font has been loaded,
+#	*     it can be used as an alternative character set.
+#	*
+#	*     The call to ioctl with the argument WIOCLFONT is the key
+#	*     to this routine.  For more information, see window(7) in
+#	*     the PC 7300 documentation.
+#	***************************************************************/
+#	#include <string.h>		/* needed for strcpy call */
+#	#include <sys/window.h>         /* needed for ioctl call */
+#	#define FNSIZE	60		/* font name size */
+#	#define ALTFONT  "/usr/lib/wfont/special.8.ft"  /* font file */
+#	/*
+#	*     The file /usr/lib/wfont/special.8.ft comes with the
+#	*     standard PC software.  It defines a graphics character set
+#	*     similar to that of the Teletype 5425 terminal.  To view
+#	*     this or other fonts in /usr/lib/wfont, use the command
+#	*     cfont <filename>.  For further information on fonts see
+#	*     cfont(1) in the PC 7300 documentation.
+#	*/
+#
+#	struct altfdata		/* structure for alt font data */
+#	{
+#	short	altf_slot;		/* memory slot number */
+#	char	altf_name[FNSIZE];	/* font name (file name) */
+#	};
+#	ldfont()
+#	{
+#		int wd;		/* window in which altfont will be */
+#		struct altfdata altf;
+#		altf.altf_slot=1;
+#		strcpy(altf.altf_name,ALTFONT);
+#		for (wd =1; wd < 12; wd++) {
+#		     ioctl(wd, WIOCLFONT,&altf);
+#	        }
+#	}
+#
+# (att7300: added <civis>/<cnorm>/<ich1>/<invis> from the BSDI entry,
+# they're confirmed by the man page for the System V display---esr)
+#
+att7300|unixpc|pc7300|3b1|s4|AT&T UNIX PC Model 7300,
+	am, xon,
+	cols#80, it#8, lines#24,
+	bel=^G, blink=\E[9m, bold=\E[1m, cbt=\E^I, civis=\E[=1C,
+	clear=\E[2J\E[H, cnorm=\E[=0C, cr=\r, cub=\E[%p1%dD,
+	cub1=^H, cud=\E[%p1%dB, cud1=\E[B, cuf=\E[%p1%dC,
+	cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA,
+	cuu1=\E[A, dch1=\E[P, dim=\E[2m, dl=\E[%p1%dM, dl1=\E[M,
+	ed=\E[0J, el=\E[0K, home=\E[H, ich1=\E[@, il=\E[%p1%dL,
+	il1=\E[L, ind=\n, invis=\E[9m, is1=\017\E[=1w, kBEG=\ENB,
+	kCAN=\EOW, kCPY=\END, kCRT=\EON, kDC=\ENF, kDL=\ENE,
+	kEND=\ENN, kEOL=\EOA, kFND=\EOX, kHLP=\EOM, kHOM=\ENM,
+	kIC=\ENJ, kLFT=\ENK, kMOV=\ENC, kNXT=\ENH, kOPT=\EOR,
+	kPRV=\ENG, kRDO=\EOT, kRIT=\ENL, kRPL=\EOY, kSAV=\EOO,
+	kUND=\EOS, kbeg=\ENb, kbs=^H, kcan=\EOw, kcbt=\E[Z,
+	kclo=\EOV, kclr=\E[J, kcmd=\EOu, kcpy=\ENd, kcrt=\EOn,
+	kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kdch1=\ENf,
+	ked=\E[J, kel=\EOa, kend=\E0, kext=\EOk, kf1=\EOc, kf2=\EOd,
+	kf3=\EOe, kf4=\EOf, kf5=\EOg, kf6=\EOh, kf7=\EOi, kf8=\EOj,
+	kfnd=\EOx, khlp=\EOm, khome=\E[H, kich1=\ENj, kind=\E[B,
+	kmov=\ENc, kmrk=\ENi, knp=\E[U, knxt=\ENh, kopn=\EOv,
+	kopt=\EOr, kpp=\E[V, kprt=\EOz, kprv=\ENg, krdo=\EOt,
+	kref=\EOb, krfr=\ENa, kri=\E[A, krpl=\EOy, krst=\EOB,
+	ksav=\EOo, kslt=\ENI, kund=\EOs, nel=\EE, rev=\E[7m, ri=\EM,
+	rmso=\E[m, rmul=\E[m, sgr0=\E[0;10m, smso=\E[7m,
+	smul=\E[4m,
+
+#### Convergent Technology
+#
+# Burroughs bought Convergent shortly before it merged with Univac.
+# CTOS is (I believe) dead.  Probably the aws is too (this entry dates
+# from 1991 or earlier).
+#
+
+# Convergent AWS workstation from Gould/SEL UTX/32 via BRL
+# (aws: removed unknown :dn=^K: -- esr)
+aws|Convergent Technologies AWS workstation under UTX and Xenix,
+	am,
+	OTug#0, cols#80, lines#28, xmc#0,
+	OTbc=^H, OTma=\016h\013j\001k\022l\002m, OTnl=\n, acsc=,
+	clear=^L, cud1=^K, cuf1=^R, cup=\EC%p2%c%p1%c, cuu1=^A,
+	dch1=\EDC, dl1=\EDL, ed=\EEF, el=\EEL, hpa=\EH%p1%c,
+	ich1=\EIC, il1=\EIL, ind=\ESU, kbs=^H, kcub1=^N, kcud1=^K,
+	kcuf1=^R, kcuu1=^A, ri=\ESD, rmacs=\EAAF, rmso=\EARF,
+	rmul=\EAUF, smacs=\EAAN, smso=\EARN, smul=\EAUN,
+	vpa=\EV%p1%c,
+awsc|Convergent Technologies AWS workstation under CTOS,
+	am,
+	OTug#0, cols#80, lines#24, xmc#0,
+	OTbc=^N, OTma=\016h\013j\001k\022l\002m, acsc=, clear=^L,
+	cud1=^K, cuf1=^R, cup=\EC%p2%c%p1%c, cuu1=^A, ed=\EEF,
+	el=\EEL, kbs=^H, kcub1=^N, kcud1=^K, kcuf1=^R, kcuu1=^A,
+	rmacs=\EAAF, rmso=\EAA, rmul=\EAA, smacs=\EAAN, smso=\EAE,
+	smul=\EAC,
+
+#### DEC consoles
+#
+
+# The MicroVax console.  Tim Theisen <tim@cs.wisc.edu> writes:
+# The digital uVax II's had a graphic display called a qdss.  It was
+# supposed to be a high performance graphic accelerator, but it was
+# late to market and barely appeared before faster dumb frame buffers
+# appeared.  I have only used this display while running X11.  However,
+# during bootup, it was in text mode, and probably had a terminal emulator
+# within it.  And that is what your termcap entry is for.  In graphics
+# mode the screen size is 1024x864 pixels.
+qdss|qdcons|qdss glass tty,
+	OTbs, am,
+	cols#128, lines#57,
+	clear=\032$<1/>, cub1=^H, cud1=\n, cuf1=^L,
+	cup=\E=%p1%c%p2%c, cuu1=^K,
+
+#### Fortune Systems consoles
+#
+# Fortune made a line of 68K-based UNIX boxes that were pretty nifty
+# in their day; I (esr) used one myself for a year or so around 1984.
+# They had no graphics, though, and couldn't compete against Suns and
+# the like.  R.I.P.
+#
+
+# From: Robert Nathanson <c160-3bp@Coral> via tut   Wed Oct 5, 1983
+# (This had extension capabilities
+#	:rv=\EH:re=\EI:rg=0:GG=0:\
+#	:CO=\E\\:WL=^Aa\r:WR=^Ab\r:CL=^Ac\r:CR=^Ad\r:DL=^Ae\r:RF=^Af\r:\
+#	:RC=^Ag\r:CW=^Ah\r:NU=^Aj\r:EN=^Ak\r:HM=^Al:PL=^Am\r:\
+#	:PU=^An\r:PD=^Ao\r:PR=^Ap\r:HP=^A@\r:RT=^Aq\r:TB=\r:CN=\177:MP=\E+F:
+# It had both ":bs:" and ":bs=^H:"; I removed the latter.  Also, it had
+# ":sg=0:" and ":ug=0:"; evidently the composer was trying (unnecessarily)
+# to force both magic cookie glitches off.  Once upon a time, I
+# used a Fortune myself, so I know the capabilities of the form ^A[a-z]\r are
+# function keys; thus the "Al" value for HM was certainly an error.  I renamed
+# EN/PD/PU/CO/CF/RT according to the XENIX/TC mappings, but not HM/DL/RF/RC.
+# I think :rv: and :re: are start/end reverse video and :rg: is a nonexistent
+# "reverse-video-glitch" capability; I have put :rv: and :re: in with standard
+# names below.  I've removed obsolete ":nl=5^J:" as there is a :do: -- esr)
+fos|fortune|Fortune system,
+	OTbs, am, bw,
+	cols#80, lines#25,
+	acsc=j*k(l m"q&v%w#x-, bel=^G, blink=\EN, civis=\E],
+	clear=\014$<20>, cnorm=\E\\, cr=\r, cub1=^H, cud1=\n$<3>,
+	cup=\034C%p1%{32}%+%c%p2%{32}%+%c, cuu1=\013$<3>,
+	cvvis=\E:, dch1=\034W$<5>, dl1=\034R$<15>, ed=\034Y$<3*>,
+	el=^\Z, home=\036$<10>, ht=^Z, ich1=\034Q$<5>,
+	il1=\034E$<15>, ind=\n, is2=^_.., kbs=^H, kcub1=^Aw\r,
+	kcud1=^Ay\r, kcuf1=^Az\r, kcuu1=^Ax\r, kend=^Ak\r,
+	kent=^Aq, kf1=^Aa\r, kf2=^Ab\r, kf3=^Ac\r, kf4=^Ad\r,
+	kf5=^Ae\r, kf6=^Af\r, kf7=^Ag\r, kf8=^Ah\r, khome=^A?\r,
+	knp=^Ao\r, kpp=^An\r, nel=\r\n, rev=\EH, rmacs=^O, rmso=^\I`,
+	rmul=^\IP, sgr0=\EI, smacs=\Eo, smso=^\H`, smul=^\HP,
+
+#### Masscomp consoles
+#
+# Masscomp has gone out of business.  Their product line was purchased by a
+# company in Georgia (US) called "XS International", parts and service may
+# still be available through them.
+#
+
+# (masscomp: ":MT:" changed to ":km:";  -- esr)
+masscomp|masscomp workstation console,
+	OTbs, km, mir,
+	cols#80, it#8, lines#24,
+	clear=\E[2J, cub1=^H, cud1=\E[B, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, dch1=\E[P, dl1=\E[M,
+	ed=\E[J, el=\E[K, ht=^I, il1=\E[L, is2=\EGc\EGb\EGw, kbs=^H,
+	kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, rmir=\E[4l,
+	rmso=\E[m, rmul=\EGau, smir=\E[4h, smso=\E[7m, smul=\EGu,
+masscomp1|masscomp large screen version 1,
+	cols#104, lines#36, use=masscomp,
+masscomp2|masscomp large screen version 2,
+	cols#64, lines#21, use=masscomp,
+
+#### OSF Unix
+#
+
+# OSF/1 1.1 Snapshot 2
+pmcons|pmconsole|PMAX console,
+	am,
+	cols#128, lines#57,
+	bel=^G, clear=^L, cr=\r, cub1=^H, cud1=\n, cuu1=^K, ht=^I,
+	ind=\n, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A,
+	kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS,
+
+#### Other consoles
+# The following is a version of the ibm-pc entry distributed with PC/IX,
+# (Interactive Systems' System 3 for the Big Blue), modified by Richard
+# McIntosh at UCB/CSM.  The :pt: and :uc: have been removed from the original,
+# (the former is untrue, and the latter failed under UCB/man); standout and
+# underline modes have been added.  Note: this entry describes the "native"
+# capabilities of the PC monochrome display, without ANY emulation; most
+# communications packages (but NOT PC/IX connect) do some kind of emulation.
+pcix|PC/IX console,
+	am, bw, eo,
+	cols#80, lines#24,
+	clear=\Ec, cub1=^H, cud1=\E[B, cuf1=\E[C,
+	cup=\E[%i%p1%2d;%p2%2dH, cuu1=\E[A, ed=\E[J, el=\E[K,
+	home=\E[H, rmso=\E[m, rmul=\E[m, sgr0=\E[m, smso=\E[7m,
+	smul=\E[4m,
+
+# (ibmpcx: this entry used to be known as ibmx.
+# It formerly included the following extension capabilities:
+#	:GC=b:GL=v:GR=t:RT=^J:\
+#	:GH=\E[196g:GV=\E[179g:\
+#	:GU=\E[193g:GD=\E[194g:\
+#	:G1=\E[191g:G2=\E[218g:G3=\E[192g:G4=\E[217g:\
+#	:CW=\E[E:NU=\E[F:RF=\E[G:RC=\E[H:\
+#	:WL=\E[K:WR=\E[L:CL=\E[M:CR=\E[N:\
+# I renamed GS/GE/WL/WR/CL/CR/PU/PD/HM/EN; also, removed a duplicate
+# ":kh=\E[Y:".  Added IBM-PC forms characters and highlights, they match
+# what was there before. -- esr)
+ibmpcx|xenix|ibmx|IBM PC xenix console display,
+	OTbs, am, msgr,
+	cols#80, lines#25,
+	clear=^L, cub1=^H, cud1=\E[B, cuf1=\E[C,
+	cup=\E[%p1%d;%p2%dH, cuu1=\E[A, dch1=\E[P, dl1=\E[M,
+	ed=\E[J, el=\E[K, home=\E[H, ich1=\E[@, il1=\E[L, kbs=^H,
+	kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kend=\E[d,
+	kf1=\E[K, kf2=\E[L, kf3=\E[M, kf4=\E[N, khome=\E[Y, knp=\E[e,
+	kpp=\E[Z, use=klone+acs, use=klone+sgr8,
+
+######## OTHER OBSOLETE TYPES
+#
+# These terminals are *long* dead -- these entries are retained for
+# historical interest only.
+#
+
+#### Obsolete non-ANSI software emulations
+#
+
+# CTRM terminal emulator
+# 1. underlining is not allowed with colors: first, is is simulated by
+# black on white, second, it disables background color manipulations.
+# 2. BLINKING, REVERSE and BOLD are allowed with colors,
+# so we have to save their status in the static registers A, B and H
+# respectively, to be able to restore them when color changes
+# (because any color change turns off ALL attributes)
+# 3. <bold> and <rev> sequences alternate modes,
+# rather than simply  entering them.  Thus we have to check the
+# static register B and H to determine the status, before sending the
+# escape sequence.
+# 4. <sgr0> now must set the status of all 3 register (A,B,H) to zero
+# and then reset colors
+# 5. implementation of the protect mode would badly penalize the performance.
+# we would have to use \E&bn sequence to turn off colors (as well as all
+# other attributes), and keep the status of protect mode in yet another
+# static variable.  If someone really needs this mode, they would have to
+# create another terminfo entry.
+# 6. original color-pair is white on black.
+# store the information about colors into static registers
+# 7. set foreground color.  it performs the following steps.
+#   1) turn off all attributes
+#   2) turn on the background and video attributes that have been turned
+#      on before (this information is stored in static registers X,Y,Z,A,B,H,D).
+#   3) turn on foreground attributes
+#   4) store information about foreground into U,V,W static registers
+# 8. turn on background: similar to turn on foreground above
+ctrm|C terminal emulator,
+	am, bce, xon,
+	colors#8, cols#80, lh#0, lines#24, lm#0, lw#0, ncv#2, nlab#0,
+	pairs#63, pb#19200, vt#6,
+	bel=^G, blink=\E&dA%{1}%PA,
+	bold=%?%gH%{0}%=%t\E&dH%{1}%PH%;, cbt=\Ei,
+	clear=\EH\EJ, cr=\r, cub1=^H, cud1=\n, cuf1=\EC,
+	cup=\E&a%p2%dc%p1%dY, cuu1=\EA, dch1=\EP$<2>, dl1=\EM,
+	ed=\EJ, el=\EK, hpa=\E&a%p1%dC, ht=\011$<2>, hts=\E1,
+	il1=\EL, ind=\n, ip=$<2>, is2=\E&jA\r, kbs=^H, kcub1=\Eu\r,
+	kcud1=\Ew\r, kcuf1=\Ev\r, kcuu1=\Et\r, kf1=\Ep\r,
+	kf2=\Eq\r, kf3=\Er\r, kf4=\Es\r, kf5=\Et\r, kf6=\Eu\r,
+	kf7=\Ev\r, kf8=\Ew\r, khome=\Ep\r,
+	op=\E&bn\E&bB\E&bG\E&bR%{0}%PX%{0}%PY%{0}%PZ%{1}%PW%{1}%PV
+	   %{1}%PU,
+	rev=%?%gB%{0}%=%t\E&dB%{1}%PB%;, rmir=\ER, rmkx=\E&jA,
+	setb=\E&bn%?%gA%t\E&dA%;%?%gB%t\E&dB%;%?%gH%t\E&dH%;%?%gU%t
+	     \E&bR%;%?%gV%t\E&bG%;%?%gW%t\E&bB%;%?%p1%{1}%&%t\E&bb
+	     %{1}%e%{0}%;%PZ%?%p1%{2}%&%t\E&bg%{1}%e%{0}%;%PY%?%p1
+	     %{4}%&%t\E&br%{1}%e%{0}%;%PX,
+	setf=\E&bn%?%gA%t\E&dA%;%?%gB%t\E&dB%;%?%gH%t\E&dH%;%?%gX%t
+	     \E&br%;%?%gY%t\E&bg%;%?%gZ%t\E&bb%;%?%p1%{1}%&%t\E&bB
+	     %{1}%e%{0}%;%PW%?%p1%{2}%&%t\E&bG%{1}%e%{0}%;%PV%?%p1
+	     %{4}%&%t\E&bR%{1}%e%{0}%;%PU,
+	sgr=\E&d@%{0}%PA%{0}%PB%{0}%PD%{0}%PH%?%p1%p3%p5%|%|%t\E&dB
+	    %{1}%PB%;%?%p4%t\E&dA%{1}%PA%;%?%p6%t\E&dH%{1}%PH%;%?%p2
+	    %t\E&dD%;,
+	sgr0=\E&d@%{0}%PA%{0}%PB%{0}%PH, smir=\EQ, smkx=\E&jB,
+	smso=\E&dD, smul=\E&dD, tbc=\E3, vpa=\E&a%p1%dY,
+
+# gs6300 - can't use blue foreground, it clashes with underline;
+# it's simulated with cyan
+# Bug: The <op> capability probably resets attributes.
+# (gs6300: commented out <rmln> (no <smln>) --esr)
+gs6300|emots|AT&T PC6300 with EMOTS terminal emulator,
+	am, bce, msgr, xon,
+	colors#8, cols#80, it#8, lines#24, pairs#63,
+	acsc=++\,\,--..``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyz
+	     z{{||}}~~,
+	bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[J, cr=\r,
+	cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=\n,
+	cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH,
+	cuu=\E[%p1%dA, cuu1=\E[A, dch=\E[%p1%dP, dch1=\E[P,
+	dl=\E[%p1%dM, dl1=\E[M, ed=\E[J, el=\E[K, home=\E[H, ht=^I,
+	ich=\E[%p1%d@, ich1=\E[@, il=\E[%p1%dL, il1=\E[L, ind=\n,
+	is2=\E[m, kbs=^H, kcbt=^R^I, kcub1=\E[D, kcud1=\E[B,
+	kcuf1=\E[C, kcuu1=\E[A, kf1=\E[0s, kf2=\E[24s, kf3=\E[1s,
+	kf4=\E[23s, kf5=\E[2s, kf6=\E[22s, kf7=\E[3s, kf8=\E[21s,
+	khome=\E[H, mc4=\E[4i, mc5=\E[5i, op=\E[?;m, rev=\E[7m,
+	ri=\E[L, rmacs=\E[10m, rs1=\Ec, setb=\E[?;%p1%dm,
+	setf=\E[?%?%p1%{0}%=%t0%e%p1%{1}%=%t2%e%p1%{1}%-%d%;m,
+	sgr0=\E[m\E[10m, smacs=\E[11m, smso=\E[1m, smul=\E[4m,
+
+# From: <earle@smeagol.UUCP> 29 Oct 85 05:40:18 GMT
+# MS-Kermit with Heath-19 emulation mode enabled
+# (h19k: changed ":pt@:" to ":it@"
+h19k|h19kermit|Heathkit emulation provided by Kermit (no auto margin),
+	am@, da, db, xt,
+	it@,
+	ht@, use=h19-u,
+
+# Apple Macintosh with VersaTerm, a terminal emulator distributed by Synergy
+# Software (formerly Peripherals Computers & Supplies, Inc) of
+# 2457 Perkiomen Ave., Reading, PA 19606, 1-800-876-8376.  They can
+# also be reached at support@synergy.com.
+versaterm|VersaTerm VT100 emulator for the Macintosh,
+	am, xenl,
+	cols#80, it#8, lines#24,
+	bel=^G, blink=\E[5m$<2/>, bold=\E[1m$<2/>,
+	clear=\E[;H\E[2J$<50/>, cr=\r, csr=\E[%i%p1%d;%p2%dr,
+	cub1=^H, cud1=\n, cuf1=\E[C$<2/>,
+	cup=\E[%i%p1%d;%p2%dH$<5/>, cuu1=\E[A$<2/>,
+	dch1=\E[1P$<7/>, dl1=\E[1M$<9/>, ed=\E[J$<50/>,
+	el=\E[K$<3/>, home=\E[H, ht=^I, ich1=\E[1@$<7/>,
+	il1=\E[1L$<9/>, is2=\E[1;24r\E[24;1H, kbs=^H, kcub1=\EOD,
+	kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kf1=\EOP, kf2=\EOQ,
+	kf3=\EOR, kf4=\EOS, nel=\r\n, rc=\E8, rev=\E[7m$<2/>,
+	rf=/usr/share/tabset/vt100, ri=\EM$<5/>,
+	rmkx=\E>\E[?1l, rmso=\E[m$<2/>, rmul=\E[m$<2/>, rs1=\E>,
+	sc=\E7, sgr0=\E[m$<2/>, smkx=\E=\E[?1h, smso=\E[7m$<2/>,
+	smul=\E[4m$<2/>,
+
+# From: Rick Thomas <ihnp4!btlunix!rbt>
+# (xtalk: I added <rmam>/<smam> based on the init string.
+xtalk|IBM PC with xtalk communication program (versions up to 3.4),
+	am, mir, msgr, xon,
+	cols#80, it#8, lines#24, vt#3, xmc#1,
+	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+	bel=^G, clear=\E[H\E[J$<50>, cr=\r, cub=\E[%p1%dD, cub1=^H,
+	cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C$<2>,
+	cup=\E[%i%p1%d;%p2%dH$<5>, cuu=\E[%p1%dA,
+	cuu1=\E[A$<2>, dl1=\E[M$<99>, ed=\E[J$<50>, el=\E[K$<3>,
+	el1=\E[1K$<3>, enacs=\E(B\E)0, home=\E[H, ht=^I, hts=\EH,
+	il1=\E[L$<99>, ind=\n, kbs=^H, kcub1=\EOD, kcud1=\EOB,
+	kcuf1=\EOC, kcuu1=\EOA, ri=\EM$<5>, rmacs=^O, rmam=\E[?7l,
+	rmkx=\E[?1l\E>, rmso=\E[m\s,
+	rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, sgr0=\E[m,
+	smacs=^N, smam=\E[?7h, smkx=\E[?1h\E=, smso=\E[7m\s,
+	tbc=\E[3g, use=vt100+fnkeys,
+
+# The official PC terminal emulator program of the AT&T Product Centers.
+# Note - insert mode commented out - doesn't seem to work on AT&T PC.
+simterm|attpc running simterm,
+	am,
+	cols#80, lines#24,
+	bel=^G, clear=\EH\EJ, cr=\r, cub1=^H, cud1=\EB, cuf1=\EC,
+	cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, dch1=\ER,
+	dl1=\EM, ed=\EJ, el=\EK, home=\EH, il1=\EL, ind=\n, rmcup=\EVE,
+	rmso=\E&d@, sgr0=\E&d@, smcup=\EVS, smso=\E&dB,
+
+#### Daisy wheel printers
+#
+# This section collects Diablo, DTC, Xerox, Qume, and other daisy
+# wheel terminals.  These are now largely obsolete.
+#
+
+# (diablo1620: removed <if=/usr/share/tabset/xerox1720>, no such file -- esr)
+diablo1620|diablo1720|diablo450|ipsi|Diablo 1620,
+	hc, os,
+	cols#132, it#8,
+	cub1=^H, cud1=\n, cuu1=\E\n, hd=\ED, hpa=\E\011%i%p1%c,
+	ht=^I, hts=\E1, hu=\EU, kbs=^H, tbc=\E2,
+diablo1620-m8|diablo1640-m8|Diablo 1620 w/8 column left margin,
+	cols#124,
+	is2=\r        \E9, use=diablo1620,
+# (diablo1640: removed <if=/usr/share/tabset/xerox1730>, no such file -- esr)
+diablo1640|diablo1730|diablo1740|diablo630|x1700|diablo|xerox|Diablo 1640,
+	bel=^G, rmso=\E&, rmul=\ER, smso=\EW, smul=\EE,
+	use=diablo1620,
+# (diablo1640-lm: removed <if=/usr/share/tabset/xerox1730-lm>, no such
+# file -- esr)
+diablo1640-lm|diablo-lm|xerox-lm|Diablo 1640 with indented left margin,
+	cols#124,
+	rmso=\E&, rmul=\ER, smso=\EW, smul=\EE, use=diablo1620,
+diablo1740-lm|630-lm|1730-lm|x1700-lm|Diablo 1740 printer,
+	use=diablo1640-lm,
+# DTC 382 with VDU.  Has no <ed> so we fake it with <el>.  Standout
+# <smso=^P\s\002^PF> works but won't go away without dynamite <rmso=^P\s\0>.
+# The terminal has tabs, but I'm getting tired of fighting the braindamage.
+# If no tab is set or the terminal's in a bad mood, it glitches the screen
+# around all of memory.  Note that return puts a blank ("a return character")
+# in the space the cursor was at, so we use ^P return (and thus ^P newline for
+# newline).  Note also that if you turn off :pt: and let Unix expand tabs,
+# curses won't work (some old BSD versions) because it doesn't clear this bit,
+# and cursor addressing sends a tab for row/column 9.  What a losing terminal!
+# I have been unable to get tabs set in all 96 lines - it always leaves at
+# least one line with no tabs in it, and once you tab through that line,
+# it completely weirds out.
+# (dtc382: change <rmcup> to <smcup> -- it  just does a clear --esr)
+dtc382|DTC 382,
+	am, da, db, xhp,
+	cols#80, lines#24, lm#96,
+	bel=^G, clear=\020\035$<20>, cnorm=^Pb, cr=^P\r, cub1=^H,
+	cuf1=^PR, cup=\020\021%p2%c%p1%c, cuu1=^P^L, cvvis=^PB,
+	dch1=^X, dl1=^P^S, ed=^P^U^P^S^P^S, el=^P^U, home=^P^R,
+	il1=^P^Z, ind=\n, pad=^?, rmcup=, rmir=^Pi, rmul=^P \0,
+	smcup=\020\035$<20>, smir=^PI, smul=^P ^P,
+dtc300s|DTC 300s,
+	hc, os,
+	cols#132,
+	bel=^G, cr=\r, cub1=^H, cud1=\n, cuu1=^Z, ff=^L, hd=\Eh, ht=^I,
+	hts=\E1, hu=\EH, ind=\n, kbs=^H, tbc=\E3,
+gsi|mystery gsi terminal,
+	hc, os,
+	cols#132,
+	bel=^G, cr=\r, cub1=^H, cud1=\n, cuu1=^Z, hd=\Eh, ht=^I, hu=\EH,
+	ind=\n,
+aj830|aj832|aj|Anderson Jacobson,
+	hc, os,
+	bel=^G, cr=\r, cub1=^H, cud1=\n, cuu1=\E7, hd=\E9, hu=\E8,
+	ind=\n,
+# From: Chris Torek <chris@gyre.umd.edu> Thu, 7 Nov 85 18:21:58 EST
+aj510|Anderson-Jacobson model 510,
+	am, mir,
+	cols#80, lines#24,
+	clear=^L, cub1=^H, cuf1=\EX,
+	cup=\E#%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EY,
+	dch1=\E'D$<.1*>, dl1=\E&D$<2*/>, ed=\E'P, el=\E'L, ich1=,
+	il1=\E&I$<2*/>, ip=$<.1*/>, kcub1=\EW, kcud1=\EZ,
+	kcuf1=\EX, kcuu1=\EY, pad=^?, rmcup=\E"N, rmir=\E'J,
+	rmso=\E"I, rmul=\E"U, smcup=\E"N, smir=\E'I, smso=\E"I,
+	smul=\E"U,
+# From: <cbosg!ucbvax!pur-ee!cincy!chris> Thu Aug 20 09:09:18 1981
+# This is incomplete, but it's a start.
+nec5520|nec|spinwriter|NEC 5520,
+	hc, os,
+	cols#132, it#8,
+	bel=^G, cr=\r, cub1=^H, cud1=\n, cuu1=\E9, ff=^L,
+	hd=\E]s\n\E]W, ht=^I, hts=\E1, hu=\E]s\E9\E]W, ind=\n,
+	kbs=^H, tbc=\E3,
+qume5|qume|Qume Sprint 5,
+	hc, os,
+	cols#80, it#8,
+	bel=^G, cr=\r, cub1=^H, cud1=\n, cuu1=^Z, ff=^L, hd=\Eh, ht=^I,
+	hts=\E1, hu=\EH, ind=\n, kbs=^H, tbc=\E3,
+# I suspect the Xerox 1720 is the same as the Diablo 1620.
+xerox1720|x1720|x1750|Xerox 1720,
+	hc, os,
+	cols#132, it#8,
+	bel=^G, cr=\r, cub1=^H, cud1=\n, ff=^L, ht=^I, hts=\E1, ind=\n,
+	tbc=\E2,
+
+#### Miscellaneous obsolete terminals, manufacturers unknown
+#
+# If you have any information about these (like, a manufacturer's name,
+# and a date on the serial-number plate) please send it!
+
+cad68-3|cgc3|cad68 basic monitor transparent mode size 3 chars,
+	OTbs, am,
+	cols#73, lines#36,
+	clear=^Z, cub1=^H, cuf1=^L, cuu1=^K, home=^^,
+cad68-2|cgc2|cad68 basic monitor transparent mode size 2 chars,
+	OTbs, am,
+	cols#85, lines#39,
+	clear=^Z, cub1=^H, cuf1=^L, cuu1=^K, home=^^, kcub1=\E3,
+	kcud1=\E2, kcuf1=\E4, kcuu1=\E1, kf1=\E5, kf2=\E6, kf3=\E7,
+	kf4=\E8, rmso=\Em^C, smso=\Em^L,
+cops10|cops|cops-10|cops 10,
+	am, bw,
+	cols#80, lines#24,
+	bel=^G, clear=\030$<30/>, cr=\r, cub1=^H, cud1=\n, cuf1=^L,
+	cup=\020%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, ed=^W, el=^V,
+	ind=\n, kbs=^H, kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K,
+	khome=^Y,
+
+# http://www.bitsavers.org/pdf/datapro/alphanumeric_terminals/Datapro_C25_Datagraphix.pdf
+#
+# DatagraphiX, Inc.
+# (a subsidiary of General Dynamics),
+# P.O. Box 82449, San Diego, California 92138.
+#
+# (d132: removed duplicate :ic=\E5:,
+# merged in capabilities from a BRL entry -- esr)
+d132|datagraphix|DatagraphiX 132a,
+	da, db, in,
+	cols#80, lines#30,
+	bel=^G, clear=^L, cnorm=\Em\En, cr=\r, cub1=^H, cud1=\n,
+	cuf1=\EL, cup=\E8%i%p1%3d%p2%3d, cuu1=\EK, cvvis=\Ex,
+	dch1=\E6, home=\ET, ht=^I, ich1=\E5, il1=\E3, ind=\n, kbs=^H,
+	kcub1=^H, kcud1=\n, nel=\r\n, ri=\Ew,
+# The d800 was an early portable terminal from c.1984-85 that looked a lot
+# like the original Compaq `lunchbox' portable (but no handle).  It had a VT220
+# mode (which is what this entry looks like) and several other lesser-known
+# emulations.
+d800|Direct 800/A,
+	OTbs, am, da, db, msgr, xhp,
+	cols#80, it#8, lines#24,
+	acsc=``a1fxgqh0jYk?lZm@nEooppqDrrsstCu4vAwBx3yyzz{{||}}~~,
+	bel=^G, clear=\E[1;1H\E[2J, cnorm=\E[>12h, cr=\r, cub1=^H,
+	cud1=\n, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A,
+	cvvis=\E[>12l, ed=\E[J, el=\E[K, ht=^I, ind=\ED, kcub1=\E[D,
+	kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kf1=\EOP, kf2=\EOQ,
+	kf3=\EOR, kf4=\EOS, kf5=\EOT, kf6=\EOU, kf7=\EOV, kf8=\EOW,
+	ri=\EM, rmacs=\E[m, rmso=\E[m, rmul=\E[m, sgr0=\E[m,
+	smacs=\E[1m, smso=\E[7m, smul=\E[4m,
+digilog|digilog 333,
+	OTbs,
+	cols#80, lines#16,
+	bel=^G, cr=\r, cub1=^H, cud1=\n, cuf1=^I, cuu1=^O, el=^X,
+	home=^N, ind=\n,
+# The DWK was a terminal manufactured in the Soviet Union c.1986
+dwk|dwk-vt|dwk terminal,
+	am,
+	cols#80, it#8, lines#24,
+	acsc=+\^\,Q-S.M0\177`+a:f'g#h#i#jXkClJmFnNo~qUs_tEuPv\\wKxW~
+	     _,
+	bel=^G, clear=\EH\EJ, cr=\r, cub1=^H, cud1=\n, cuf1=\EC,
+	cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, dch1=\EP,
+	ed=\EJ, el=\EK, home=\EH, ht=^I, ich1=\EQ, ind=\n, kbs=^?,
+	kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, kdch1=\Ee,
+	kf1=\Ef1, kf10=\Ef0, kf2=\Ef2, kf3=\Ef3, kf4=\Ef4, kf5=\Ef5,
+	kf6=\Ef6, kf7=\Ef7, kf8=\Ef8, kf9=\Ef9, kich1=\Ed, knp=\Eh,
+	kpp=\Eg, nel=\r\n, rev=\ET, ri=\ES, rmacs=\EG, rmso=\EX,
+	sgr0=\EX, smacs=\EF, smso=\ET,
+env230|envision230|envision 230 graphics terminal,
+	xenl@,
+	enacs@, mc0=\E[0i, mc4=\E[4i, mc5=\E[5i, rmacs@,
+	sgr=\E[0%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;
+	    1%;m$<2>,
+	sgr0=\E[0m$<2>, smacs@, smso=\E[7m, use=vt100+4bsd,
+# These execuports were impact-printer ttys with a 30- or maybe 15-cps acoustic
+# coupler attached, the whole rig fitting in a suitcase and more or less
+# portable.  Hot stuff for c.1977 :-) -- esr
+ep48|ep4080|execuport 4080,
+	OTbs, am, os,
+	cols#80,
+	bel=^G, cr=\r, cub1=^H, cud1=\n, hd=^\, hu=^^, ind=\n,
+ep40|ep4000|execuport 4000,
+	cols#136, use=ep4080,
+# Adam Thompson <athompso@pangea.ca> tells us:
+# Informer series - these are all portable units, resembling older
+# automatic bread-baking machines.  The terminal looks like a `clamshell'
+# design, but isn't.  The structure is similar to the Direct terminals,
+# but only half the width.  The entire unit is only about 10" wide.
+# It features an 8" screen (6" or 7" if you have color!), and an 9"x6"
+# keyboard.  All the keys are crammed together, much like some laptop
+# PCs today, but perhaps less well organized...all these units have a
+# bewildering array of plugs on the back, including a built-in modem.
+# The 305 was a color version of the 304; the 306 and 307 were mono and
+# color terminals built for IBM bisync protocols.
+# From: Paul Leondis <unllab@amber.berkeley.edu>
+ifmr|Informer D304,
+	OTbs, am,
+	cols#80, lines#24,
+	clear=\EZ, cub1=^H, cud1=\n, cuf1=\EC,
+	cup=\EY%p2%{32}%+%c%p1%{32}%+%c, cuu1=\EA, dch1=\E\\,
+	ed=\E/, el=\EQ, home=\EH, ich1=\E[, ri=\En, rmso=\EK, sgr0=\EK,
+	smso=\EJ,
+# Entry largely based on wy60 and has the features of wy60ak.
+opus3n1+|Esprit Opus3n1+ in wy60 mode with ANSI arrow keys,
+	am, bw, hs, km, mir, msgr, ul, xon,
+	cols#80, lh#1, lines#24, lw#8, nlab#8, wsl#80,
+	acsc=0wa_h[jukslrmqnxqzttuyv]wpxv, bel=^G, blink=\EG2,
+	cbt=\EI, civis=\E`0, clear=\E*$<100>, cnorm=\E`1, cr=\r,
+	cub1=^H, cud1=\n, cuf1=^L, cup=\Ea%i%p1%dR%p2%dC, cuu1=^K,
+	dch1=\EW$<11>, dim=\EGp, dl1=\ER$<5>, dsl=\Ez(\r,
+	ed=\EY$<100>, el=\ET, fsl=\r, home=\036$<2>, ht=\011$<5>,
+	hts=\E1, if=/usr/share/tabset/std, il1=\EE$<4>, ind=\n,
+	ip=$<3>,
+	is2=\E`:\Ee(\EO\Ee6\Ec41\E~4\Ec21\Ed/\Ezz&\E[A\177\Ezz'\E[B
+	    \177\Ezz(\E[D\177\Ezz)\E[C\177\Ezz<\E[Q\177\Ezz`\E[F
+	    \177\EA1*\EZH12,
+	kHOM=\E{, kbs=^H, kcbt=\EI, kcub1=\E[D, kcud1=\E[B,
+	kcuf1=\E[C, kcuu1=\E[A, kdch1=\EW, kdl1=\ER, ked=\EY,
+	kel=\ET, kend=\E[F, kent=\E7, kf1=^A@\r, kf10=^AI\r,
+	kf11=^AJ\r, kf12=^AK\r, kf13=^AL\r, kf14=^AM\r, kf15=^AN\r,
+	kf16=^AO\r, kf2=^AA\r, kf3=^AB\r, kf4=^AC\r, kf5=^AD\r,
+	kf6=^AE\r, kf7=^AF\r, kf8=^AG\r, kf9=^AH\r, khome=^^,
+	kich1=\EQ, kil1=\EE, knp=\EK, kpp=\EJ, kprt=\EP, krpl=\Er,
+	mc0=\EP, mc4=^T, mc5=^R, nel=\r\n$<3>,
+	pfloc=\EZ2%p1%{63}%+%c%p2%s\177,
+	pfx=\EZ1%p1%{63}%+%c%p2%s\177,
+	pln=\Ez%p1%{47}%+%c%p2%s\r, prot=\E), ri=\Ej$<7>,
+	rmacs=\EH^C, rmam=\Ed., rmcup=, rmir=\Er, rmln=\EA11,
+	rmxon=\Ec20, rs1=\E~!\E~4$<150>, rs2=\EeF$<150>,
+	rs3=\EwG\Ee($<150>,
+	sgr=%?%p8%t\E)%e\E(%;%?%p9%t\EH\002%e\EH\003%;\EG%{48}%?%p2
+	    %t%{8}%|%;%?%p1%p3%|%t%{4}%|%;%?%p4%t%{2}%|%;%?%p1%p5%|
+	    %t%{64}%|%;%?%p7%t%{1}%|%;%c,
+	sgr0=\E(\EH\003\EG0\EcD, smacs=\EH^B, smam=\Ed/,
+	smcup=\Ezz&\E[A\177\Ezz'\E[B\177\Ezz(\E[D\177\Ezz)\E[C\177
+	      \Ezz<\E[Q\177,
+	smir=\Eq, smln=\EA10, smxon=\Ec21, tbc=\E0, tsl=\Ez(,
+	uc=\EG8\EG0, use=adm+sgr,
+teletec|Teletec Datascreen,
+	OTbs, am,
+	cols#80, lines#24,
+	bel=^G, clear=^L, cr=\r, cub1=^H, cud1=\n, cuf1=^_, cuu1=^K,
+	home=^^, ind=\n,
+# From: Mark Dornfeld <romwa@ucbvax.berkeley.edu>
+# This description is for the LANPAR Technologies VISION 3220
+# terminal from 1984/85.  The function key definitions k0-k5 represent the
+# edit keypad: FIND, INSERT HERE, REMOVE, SELECT, PREV SCREEN,
+# NEXT SCREEN. The key definitions k6-k9 represent the PF1 to PF4 keys.
+#
+# Kenneth Randell <kenr@datametrics.com> writes on 31 Dec 1998:
+# I had a couple of scopes (3221) like this once where I used to work, around
+# the 1987 time frame if memory serves me correctly.  These scopes were made
+# by an outfit called LANPAR Technologies, and were meant to me DEC VT 220
+# compatible.  The 3220 was a plain text terminal like the VT-220, the 3221
+# was a like the VT-240 (monochrome with Regis + Sixel graphics), and the 3222
+# was like the VT-241 (color with Regis + Sixel Graphics).  These terminals
+# (3221) cost about $1500 each, and one was always broken -- had to be sent
+# back to the shop for repairs.
+# The only real advantage these scopes had over the VT-240's were:
+# 1) They were faster in the Regis display, or at least the ones I did
+# 2) They had a handy debugging feature where you could split-screen the
+# scope, the graphics would appear on the top, and the REGIS commands would
+# appear on the bottom.  I don't remember the VT-240s being able to do that.
+# I would swear that LANPAR Technologies was in MA someplace, but since I
+# don't work at the same place anymore, and those terminals and manuals were
+# long since junked, I cannot be any more sure than that.
+#
+# (v3220: removed obsolete ":kn#10:",
+# I added <rmam>/<smam> based on the init string -- esr)
+v3220|LANPAR Vision II model 3220/3221/3222,
+	OTbs, am, mir, xenl,
+	cols#80, it#8, lines#24,
+	clear=\E[H\E[J, cub1=^H, cud1=\E[B, cuf1=\E[C,
+	cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, dch1=\E[P, dl1=\E[M,
+	ed=\E[J, el=\E[K, ht=^I, il1=\E[L,
+	is2=\E>\E[?3l\E[?7h\E[?8h\E[p, kcub1=\E[D, kcud1=\E[B,
+	kcuf1=\E[C, kcuu1=\E[A, kf0=\E[1~, kf1=\E[2~, kf2=\E[3~,
+	kf3=\E[4~, kf4=\E[5~, kf5=\E[6~, kf6=\E[OP, kf7=\E[OQ,
+	kf8=\E[OR, kf9=\E[OS, khome=\E[H, ri=\EM, rmam=\E[?7l,
+	rmir=\E[4l, rmkx=\E>, rmso=\E[m, rmul=\E[m, sgr0=\E[m,
+	smam=\E[?7h, smir=\E[4h, smkx=\E=, smso=\E[7m, smul=\E[4m,
+######## ICH/ICH1 VERSUS RMIR/SMIR
+#
+# Some non-curses applications get confused if both ich/ich1 and rmir/smir
+# are present; the symptom is doubled characters in an update using insert.
+# These applications are technically correct; in both 4.3BSD termcap and
+# terminfo, you're not actually supposed to specify both ich/ich1 and rmir/smir
+# unless the terminal needs both.  To my knowledge, no terminal still in this
+# file requires both other than the very obsolete dm2500.
+#
+# For ncurses-based applications this is not a problem, as ncurses uses
+# one or the other as appropriate but never mixes the two.  Therefore we
+# have not corrected entries like `linux' and `xterm' that specify both.
+# If you see doubled characters from these, use the linux-nic and xterm-nic
+# entries that suppress ich/ich1.  And upgrade to ncurses!
+#
+
+######## VT100/ANSI/ISO 6429/ECMA-48/PC-TERM TERMINAL STANDARDS
+#
+# ANSI X3.64 has been withdrawn and replaced by ECMA-48.  The ISO 6429 and
+# ECMA-48 standards are said to be almost identical, but are not the same
+# as X3.64 (though for practical purposes they are close supersets of it).
+#
+# You can obtain ECMA-48 for free by sending email to helpdesk@ecma.ch
+# requesting the standard(s) you want (i.e. ECMA-48, "Control Functions for
+# Coded Character Sets"), include your snail-mail address, and you should
+# receive the document in due course.  Don't expect an email acknowledgment.
+#
+# Related standards include "X3.4-1977: American National Standard Code for
+# Information Interchange" (the ASCII standard) and "X3.41.1974:
+# Code-Extension Techniques for Use with the 7-Bit Coded Character Set of
+# American National Standard for Information Interchange."  I believe (but
+# am not certain) that these are effectively identical to ECMA-6 and ECMA-35
+# respectively.
+#
+
+#### VT100/ANSI/ECMA-48
+#
+# ANSI Standard (X3.64) Control Sequences for Video Terminals and Peripherals
+# and ECMA-48 Control Functions for Coded Character Sets.
+#
+# Much of the content of this comment is adapted from a table prepared by
+# Richard Shuford, based on a 1984 Byte article.  Terminfo correspondences,
+# discussion of some terminfo-related issues, and updates to capture ECMA-48
+# have been added.  Control functions described in ECMA-48 only are tagged
+# with * after their names.
+#
+# The table is a complete list of the defined ANSI X3.64/ECMA-48 control
+# sequences.  In the main table, \E stands for an escape (\033) character,
+# SPC for space.  Pn stands for a single numeric parameter to be inserted
+# in decimal ASCII.  Ps stands for a list of such parameters separated by
+# semicolons.  Parameter meanings for most parameterized sequences are
+# described in the notes.
+#
+# Sequence     Sequence                             Parameter   or
+# Mnemonic     Name              Sequence           Value      Mode   terminfo
+# -----------------------------------------------------------------------------
+# APC  Applicatn Program Command \E _                -         Delim  -
+# BEL  Bell *                    ^G                  -         -      bel
+# BPH  Break Permitted Here *    \E B                -         *      -
+# BS   BackSpace *               ^H                  -         EF     -
+# CAN  Cancel *                  ^X                  -         -      -   (A)
+# CBT  Cursor Backward Tab       \E [ Pn Z           1         eF     cbt
+# CCH  Cancel Previous Character \E T                -         -      -
+# CHA  Cursor Horizntal Absolute \E [ Pn G           1         eF     hpa (B)
+# CHT  Cursor Horizontal Tab     \E [ Pn I           1         eF     tab (C)
+# CMD  Coding Method Delimiter * \E
+# CNL  Cursor Next Line          \E [ Pn E           1         eF     nel (D)
+# CPL  Cursor Preceding Line     \E [ Pn F           1         eF     -
+# CPR  Cursor Position Report    \E [ Pn ; Pn R      1, 1      -      -   (E)
+# CSI  Control Sequence Intro    \E [                -         Intro  -
+# CTC  Cursor Tabulation Control \E [ Ps W           0         eF     -   (F)
+# CUB  Cursor Backward           \E [ Pn D           1         eF     cub
+# CUD  Cursor Down               \E [ Pn B           1         eF     cud
+# CUF  Cursor Forward            \E [ Pn C           1         eF     cuf
+# CUP  Cursor Position           \E [ Pn ; Pn H      1, 1      eF     cup (G)
+# CUU  Cursor Up                 \E [ Pn A           1         eF     cuu
+# CVT  Cursor Vertical Tab       \E [ Pn Y           -         eF     -   (H)
+# DA   Device Attributes         \E [ Pn c           0         -      -
+# DAQ  Define Area Qualification \E [ Ps o           0         -      -
+# DCH  Delete Character          \E [ Pn P           1         eF     dch
+# DCS  Device Control String     \E P                -         Delim  -
+# DL   Delete Line               \E [ Pn M           1         eF     dl
+# DLE  Data Link Escape *        ^P                  -         -      -
+# DMI  Disable Manual Input      \E \                -         Fs     -
+# DSR  Device Status Report      \E [ Ps n           0         -      -   (I)
+# DTA  Dimension Text Area *     \E [ Pn ; Pn SPC T  -         PC     -
+# EA   Erase in Area             \E [ Ps O           0         eF     -   (J)
+# ECH  Erase Character           \E [ Pn X           1         eF     ech
+# ED   Erase in Display          \E [ Ps J           0         eF     ed  (J)
+# EF   Erase in Field            \E [ Ps N           0         eF     -
+# EL   Erase in Line             \E [ Ps K           0         eF     el  (J)
+# EM   End of Medium *           ^Y                  -         -      -
+# EMI  Enable Manual Input       \E b                          Fs     -
+# ENQ  Enquire                   ^E                  -         -      -
+# EOT  End Of Transmission       ^D                  -         *      -
+# EPA  End of Protected Area     \E W                -         -      -   (K)
+# ESA  End of Selected Area      \E G                -         -      -
+# ESC  Escape                    ^[                  -         -      -
+# ETB  End Transmission Block    ^W                  -         -      -
+# ETX  End of Text               ^C                  -         -      -
+# FF   Form Feed                 ^L                  -         -      -
+# FNK  Function Key *            \E [ Pn SPC W       -         -      -
+# GCC  Graphic Char Combination* \E [ Pn ; Pn SPC B  -         -      -
+# FNT  Font Selection            \E [ Pn ; Pn SPC D  0, 0      FE     -
+# GSM  Graphic Size Modify       \E [ Pn ; Pn SPC B  100, 100  FE     -   (L)
+# GSS  Graphic Size Selection    \E [ Pn SPC C       none      FE     -
+# HPA  Horz Position Absolute    \E [ Pn `           1         FE     -   (B)
+# HPB  Char Position Backward    \E [ j              1         FE     -
+# HPR  Horz Position Relative    \E [ Pn a           1         FE     -   (M)
+# HT   Horizontal Tab *          ^I                  -         FE     -   (N)
+# HTJ  Horz Tab w/Justification  \E I                -         FE     -
+# HTS  Horizontal Tab Set        \E H                -         FE     hts
+# HVP  Horz & Vertical Position  \E [ Pn ; Pn f      1, 1      FE     -   (G)
+# ICH  Insert Character          \E [ Pn @           1         eF     ich
+# IDCS ID Device Control String  \E [ SPC O          -         *      -
+# IGS  ID Graphic Subrepertoire  \E [ SPC M          -         *      -
+# IL   Insert Line               \E [ Pn L           1         eF     il
+# IND  Index                     \E D                -         FE     -
+# INT  Interrupt                 \E a                -         Fs     -
+# JFY  Justify                   \E [ Ps SPC F       0         FE     -
+# IS1  Info Separator #1 *       ^_                  -         *      -
+# IS2  Info Separator #1 *       ^^                  -         *      -
+# IS3  Info Separator #1 *       ^]                  -         *      -
+# IS4  Info Separator #1 *       ^\                  -         *      -
+# LF   Line Feed                 ^J                  -         -      -
+# LS1R Locking Shift Right 1 *   \E ~                -         -      -
+# LS2  Locking Shift 2 *         \E n                -         -      -
+# LS2R Locking Shift Right 2 *   \E }                -         -      -
+# LS3  Locking Shift 3 *         \E o                -         -      -
+# LS3R Locking Shift Right 3 *   \E |                -         -      -
+# MC   Media Copy                \E [ Ps i           0         -      -   (S)
+# MW   Message Waiting           \E U                -         -      -
+# NAK  Negative Acknowledge *    ^U                  -         *      -
+# NBH  No Break Here *           \E C                -         -      -
+# NEL  Next Line                 \E E                -         FE     nel (D)
+# NP   Next Page                 \E [ Pn U           1         eF     -
+# NUL  Null *                    ^@                  -         -      -
+# OSC  Operating System Command  \E ]                -         Delim  -
+# PEC  Pres. Expand/Contract *   \E Pn SPC Z         0         -      -
+# PFS  Page Format Selection *   \E Pn SPC J         0         -      -
+# PLD  Partial Line Down         \E K                -         FE     -   (T)
+# PLU  Partial Line Up           \E L                -         FE     -   (U)
+# PM   Privacy Message           \E ^                -         Delim  -
+# PP   Preceding Page            \E [ Pn V           1         eF     -
+# PPA  Page Position Absolute *  \E [ Pn SPC P       1         FE     -
+# PPB  Page Position Backward *  \E [ Pn SPC R       1         FE     -
+# PPR  Page Position Forward *   \E [ Pn SPC Q       1         FE     -
+# PTX  Parallel Texts *          \E [ \              -         -      -
+# PU1  Private Use 1             \E Q                -         -      -
+# PU2  Private Use 2             \E R                -         -      -
+# QUAD Typographic Quadding      \E [ Ps SPC H       0         FE     -
+# REP  Repeat Char or Control    \E [ Pn b           1         -      rep
+# RI   Reverse Index             \E M                -         FE     -   (V)
+# RIS  Reset to Initial State    \E c                -         Fs     -
+# RM   Reset Mode *              \E [ Ps l           -         -      -   (W)
+# SACS Set Add. Char. Sep. *     \E [ Pn SPC /       0         -      -
+# SAPV Sel. Alt. Present. Var. * \E [ Ps SPC ]       0         -      -   (X)
+# SCI  Single-Char Introducer    \E Z                -         -      -
+# SCO  Sel. Char. Orientation *  \E [ Pn ; Pn SPC k  -         -      -
+# SCS  Set Char. Spacing *       \E [ Pn SPC g       -         -      -
+# SD   Scroll Down               \E [ Pn T           1         eF     rin
+# SDS  Start Directed String *   \E [ Pn ]           1         -      -
+# SEE  Select Editing Extent     \E [ Ps Q           0         -      -   (Y)
+# SEF  Sheet Eject & Feed *      \E [ Ps ; Ps SPC Y  0,0       -      -
+# SGR  Select Graphic Rendition  \E [ Ps m           0         FE     sgr (O)
+# SHS  Select Char. Spacing *    \E [ Ps SPC K       0         -      -
+# SI   Shift In                  ^O                  -         -      -   (P)
+# SIMD Sel. Imp. Move Direct. *  \E [ Ps ^           -         -      -
+# SL   Scroll Left               \E [ Pn SPC @       1         eF     -
+# SLH  Set Line Home *           \E [ Pn SPC U       -         -      -
+# SLL  Set Line Limit *          \E [ Pn SPC V       -         -      -
+# SLS  Set Line Spacing *        \E [ Pn SPC h       -         -      -
+# SM   Select Mode               \E [ Ps h           none      -      -   (W)
+# SO   Shift Out                 ^N                  -         -      -   (Q)
+# SOH  Start Of Heading *        ^A                  -         -      -
+# SOS  Start of String *         \E X                -         -      -
+# SPA  Start of Protected Area   \E V                -         -      -   (Z)
+# SPD  Select Pres. Direction *  \E [ Ps ; Ps SPC S  0,0       -      -
+# SPH  Set Page Home *           \E [ Ps SPC G       -         -      -
+# SPI  Spacing Increment         \E [ Pn ; Pn SPC G  none      FE     -
+# SPL  Set Page Limit *          \E [ Ps SPC j       -         -      -
+# SPQR Set Pr. Qual. & Rapid. *  \E [ Ps SPC X       0         -      -
+# SR   Scroll Right              \E [ Pn SPC A       1         eF     -
+# SRCS Set Reduced Char. Sep. *  \E [ Pn SPC f       0         -      -
+# SRS  Start Reversed String *   \E [ Ps [           0         -      -
+# SSA  Start of Selected Area    \E F                -         -      -
+# SSU  Select Size Unit *        \E [ Pn SPC I       0         -      -
+# SSW  Set Space Width *         \E [ Pn SPC [       none      -      -
+# SS2  Single Shift 2 (G2 set)   \E N                -         Intro  -
+# SS3  Single Shift 3 (G3 set)   \E O                -         Intro  -
+# ST   String Terminator         \E \                -         Delim  -
+# STAB Selective Tabulation *    \E [ Pn SPC ^       -         -      -
+# STS  Set Transmit State        \E S                -         -      -
+# STX  Start pf Text *           ^B                  -         -      -
+# SU   Scroll Up                 \E [ Pn S           1         eF     indn
+# SUB  Substitute *              ^Z                  -         -      -
+# SVS  Select Line Spacing *     \E [ Pn SPC \       1         -      -
+# SYN  Synchronous Idle *        ^F                  -         -      -
+# TAC  Tabul. Aligned Centered * \E [ Pn SPC b       -         -      -
+# TALE Tabul. Al. Leading Edge * \E [ Pn SPC a       -         -      -
+# TATE Tabul. Al. Trailing Edge* \E [ Pn SPC `       -         -      -
+# TBC  Tab Clear                 \E [ Ps g           0         FE     tbc
+# TCC  Tabul. Centered on Char * \E [ Pn SPC c       -         -      -
+# TSR  Tabulation Stop Remove  * \E [ Pn SPC d       -         FE     -
+# TSS  Thin Space Specification  \E [ Pn SC E        none      FE     -
+# VPA  Vert. Position Absolute   \E [ Pn d           1         FE     vpa
+# VPB  Line Position Backward *  \E [ Pn k           1         FE     -
+# VPR  Vert. Position Relative   \E [ Pn e           1         FE     -   (R)
+# VT   Vertical Tabulation *     ^K                  -         FE     -
+# VTS  Vertical Tabulation Set   \E J                -         FE     -
+#
+# ---------------------------------------------------------------------------
+#
+# Notes:
+#
+# Some control characters are listed in the ECMA-48 standard without
+# being assigned functions relevant to terminal control there (they
+# referred to other standards such as ISO 1745 or ECMA-35).  They are listed
+# here anyway for completeness.
+#
+# (A) ECMA-48 calls this "CancelCharacter" but retains the CCH abbreviation.
+#
+# (B) There seems to be some confusion abroad between CHA and HPA.  Most
+# `ANSI' terminals accept the CHA sequence, not the HPA. but terminfo calls
+# the capability (hpa).  ECMA-48 calls this "Cursor Character Absolute" but
+# preserved the CHA abbreviation.
+#
+# (C) CHT corresponds to terminfo (tab).  Usually it has the value ^I.
+# Occasionally (as on, for example, certain HP terminals) this has the HTJ
+# value.  ECMA-48 calls this "Cursor Forward Tabulation" but preserved the
+# CHT abbreviation.
+#
+# (D) terminfo (nel) is usually \r\n rather than ANSI \EE.
+#
+# (E) ECMA-48 calls this "Active Position Report" but preserves the CPR
+# abbreviation.
+#
+# (F) CTC parameter values:
+#	0 = set char tab,
+#	1 = set line tab,
+#	2 = clear char tab,
+#	3 = clear line tab,
+#	4 = clear all char tabs on current line,
+#	5 = clear all char tabs,
+#	6 = clear all line tabs.
+#
+# (G) CUP and HVP are identical in effect.  Some ANSI.SYS versions accept
+# HVP, but always allow CUP as an alternate.  ECMA-48 calls HVP "Character
+# Position Absolute" but retains the HVP abbreviation.
+#
+# (H) ECMA calls this "Cursor Line Tabulation" but preserves the CVT
+# abbreviation.
+#
+# (I) DSR parameter values:
+#	0 = ready,
+#	1 = busy,
+#	2 = busy, will send DSR later,
+#	3 = malfunction,
+#	4 = malfunction, will send DSR later,
+#	5 = request DSR,
+#	6 = request CPR response.
+#
+# (J) ECMA calls ED "Erase In Page". EA/ED/EL parameters:
+#	0 = clear to end,
+#	1 = clear from beginning,
+#	2 = clear.
+#
+# (K) ECMA calls this "End of Guarded Area" but preserves the EPA abbreviation.
+#
+# (L) The GSM parameters are vertical and horizontal parameters to scale by.
+#
+# (M) Some ANSI.SYS versions accept HPR, but more commonly `ANSI' terminals
+# use CUF for this function and ignore HPR.  ECMA-48 calls this "Character
+# Position Relative" but retains the HPR abbreviation.
+#
+# (N) ECMA-48 calls this "Character Tabulation" but retains the HT
+# abbreviation.
+#
+# (O) SGR parameter values:
+#	0 = default mode (attributes off),
+#	1 = bold,
+#	2 = dim,
+#	3 = italicized,
+#	4 = underlined,
+#	5 = slow blink,
+#	6 = fast blink,
+#	7 = reverse video,
+#	8 = invisible,
+#	9 = crossed-out (marked for deletion),
+#	10 = primary font,
+#	10 + n (n in 1..9) = nth alternative font,
+#	20 = Fraktur,
+#	21 = double underline,
+#	22 = turn off 2,
+#	23 = turn off 3,
+#	24 = turn off 4,
+#	25 = turn off 5,
+#	26 = proportional spacing,
+#	27 = turn off 7,
+#	28 = turn off 8,
+#	29 = turn off 9,
+#	30 = black fg,
+#	31 = red fg,
+#	32 = green fg,
+#	33 = yellow fg,
+#	34 = blue fg,
+#	35 = magenta fg,
+#	36 = cyan fg,
+#	37 = white fg,
+#	38 = set fg color as in CCITT T.416,
+#	39 = set default fg color,
+#	40 = black bg
+#	41 = red bg,
+#	42 = green bg,
+#	43 = yellow bg,
+#	44 = blue bg,
+#	45 = magenta bg,
+#	46 = cyan bg,
+#	47 = white bg,
+#	48 = set bg color as in CCITT T.416,
+#	49 = set default bg color,
+#	50 = turn off 26,
+#	51 = framed,
+#	52 = encircled,
+#	53 = overlined,
+#	54 = turn off 51 & 52,
+#	55 = not overlined,
+#	56-59 = reserved,
+#	61-65 = variable highlights for ideograms.
+#
+# (P) SI is also called LSO, Locking Shift Zero.
+#
+# (Q) SI is also called LS1, Locking Shift One.
+#
+# (R) Some ANSI.SYS versions accept VPR, but more commonly `ANSI' terminals
+# use CUD for this function and ignore VPR.  ECMA calls it `Line Position
+# Absolute' but retains the VPA abbreviation.
+#
+# (S) MC parameters:
+#	0 = start xfer to primary aux device,
+#	1 = start xfer from primary aux device,
+#	2 = start xfer to secondary aux device,
+#	3 = start xfer from secondary aux device,
+#	4 = stop relay to primary aux device,
+#	5 = start relay to primary aux device,
+#	6 = stop relay to secondary aux device,
+#	7 = start relay to secondary aux device.
+#
+# (T) ECMA-48 calls this "Partial Line Forward" but retains the PLD
+# abbreviation.
+#
+# (U) ECMA-48 calls this "Partial Line Backward" but retains the PLU
+# abbreviation.
+#
+# (V) ECMA-48 calls this "Reverse Line Feed" but retains the RI abbreviation.
+#
+# (W) RM/SM modes are as follows:
+#	1 = Guarded Area Transfer Mode (GATM),
+#	2 = Keyboard Action Mode (KAM),
+#	3 = Control Representation Mode (CRM),
+#	4 = Insertion Replacement Mode (IRM),
+#	5 = Status Report Transfer Mode (SRTM),
+#	6 = Erasure Mode (ERM),
+#	7 = Line Editing Mode (LEM),
+#	8 = Bi-Directional Support Mode (BDSM),
+#	9 = Device Component Select Mode (DCSM),
+#	10 = Character Editing Mode (HEM),
+#	11 = Positioning Unit Mode (PUM),
+#	12 = Send/Receive Mode (SRM),
+#	13 = Format Effector Action Mode (FEAM),
+#	14 = Format Effector Transfer Mode (FETM),
+#	15 = Multiple Area Transfer Mode (MATM),
+#	16 = Transfer Termination Mode (TTM),
+#	17 = Selected Area Transfer Mode (SATM),
+#	18 = Tabulation Stop Mode (TSM),
+#	19 = Editing Boundary Mode (EBM),
+#	20 = Line Feed New Line Mode (LF/NL),
+#	21 = Graphic Rendition Combination Mode (GRCM),
+#	22 = Zero Default Mode (ZDM).
+#
+# The EBM and LF/NL modes have actually been removed from ECMA-48's 5th edition
+# but are listed here for reference.
+#
+# (X) Select Alternate Presentation Variants is used only for non-Latin
+# alphabets.
+#
+# (Y) "Select Editing Extent" (SEE) was ANSI "Select Edit Extent Mode" (SEM).
+#
+# (Z) ECMA-48 calls this "Start of Guarded Area" but retains the SPA
+# abbreviation.
+#
+# ---------------------------------------------------------------------------
+#
+# Abbreviations:
+#
+# Intro  an Introducer of some kind of defined sequence; the normal 7-bit
+#        X3.64 Control Sequence Introducer is the two characters "Escape ["
+#
+# Delim  a Delimiter
+#
+# x/y    identifies a character by position in the ASCII table (column/row)
+#
+# eF     editor function (see explanation)
+#
+# FE     format effector (see explanation)
+#
+# F      is a Final character in
+#             an Escape sequence (F from 3/0 to 7/14 in the ASCII table)
+#             a control sequence (F from 4/0 to 7/14)
+#
+# Gs     is a graphic character appearing in strings (Gs ranges from
+#        2/0 to 7/14) in the ASCII table
+#
+# Ce     is a control represented as a single bit combination in the C1 set
+#        of controls in an 8-bit character set
+#
+# C0     the familiar set of 7-bit ASCII control characters
+#
+# C1     roughly, the set of control chars available only in 8-bit systems.
+#        This is too complicated to explain fully here, so read Jim Fleming's
+#        article in the February 1983 BYTE, especially pages 214 through 224.
+#
+# Fe     is a Final character of a 2-character Escape sequence that has an
+#        equivalent representation in an 8-bit environment as a Ce-type
+#        (Fe ranges from 4/0 to 5/15)
+#
+# Fs     is a Final character of a 2-character Escape sequence that is
+#        standardized internationally with identical representation in 7-bit
+#        and 8-bit environments and is independent of the currently
+#        designated C0 and C1 control sets (Fs ranges from 6/0 to 7/14)
+#
+# I      is an Intermediate character from 2/0 to 2/15 (inclusive) in the
+#        ASCII table
+#
+# P      is a parameter character from 3/0 to 3/15 (inclusive) in the ASCII
+#        table
+#
+# Pn     is a numeric parameter in a control sequence, a string of zero or
+#        more characters ranging from 3/0 to 3/9 in the ASCII table
+#
+# Ps     is a variable number of selective parameters in a control sequence
+#        with each selective parameter separated from the other by the code
+#        3/11 (which usually represents a semicolon); Ps ranges from
+#        3/0 to 3/9 and includes 3/11
+#
+# *      Not relevant to terminal control, listed for completeness only.
+#
+# Format Effectors versus Editor Functions
+#
+# A format effector specifies how following output is to be displayed.
+# An editor function allows you to modify the display.  Informally
+# format effectors may be destructive; format effectors should not be.
+#
+# For instance, a format effector that moves the "active position" (the
+# cursor or equivalent) one space to the left would be useful when you want to
+# create an overstrike, a compound character made of two standard characters
+# overlaid. Control-H, the Backspace character, is actually supposed to be a
+# format effector, so you can do this. But many systems use it in a
+# nonstandard fashion, as an editor function, deleting the character to the
+# left of the cursor and moving the cursor left. When Control-H is assumed to
+# be an editor function, you cannot predict whether its use will create an
+# overstrike unless you also know whether the output device is in an "insert
+# mode" or an "overwrite mode". When Control-H is used as a format effector,
+# its effect can always be predicted. The familiar characters carriage
+# return, linefeed, formfeed, etc., are defined as format effectors.
+#
+# NOTES ON THE DEC VT100 IMPLEMENTATION
+#
+# Control sequences implemented in the VT100 are as follows:
+#
+#      CPR, CUB, CUD, CUF, CUP, CUU, DA, DSR, ED, EL, HTS, HVP, IND,
+#      LNM, NEL, RI, RIS, RM, SGR, SM, TBC
+#
+# plus several private DEC commands.
+#
+# Erasing parts of the display (EL and ED) in the VT100 is performed thus:
+#
+#      Erase from cursor to end of line           Esc [ 0 K    or Esc [ K
+#      Erase from beginning of line to cursor     Esc [ 1 K
+#      Erase line containing cursor               Esc [ 2 K
+#      Erase from cursor to end of screen         Esc [ 0 J    or Esc [ J
+#      Erase from beginning of screen to cursor   Esc [ 1 J
+#      Erase entire screen                        Esc [ 2 J
+#
+# Some brain-damaged terminal/emulators respond to Esc [ J as if it were
+# Esc [ 2 J, but this is wrong; the default is 0.
+#
+# The VT100 responds to receiving the DA (Device Attributes) control
+#
+#      Esc [ c    (or Esc [ 0 c)
+#
+# by transmitting the sequence
+#
+#      Esc [ ? l ; Ps c
+#
+# where Ps is a character that describes installed options.
+#
+# The VT100's cursor location can be read with the DSR (Device Status
+# Report) control
+#
+#      Esc [ 6 n
+#
+# The VT100 reports by transmitting the CPR sequence
+#
+#      Esc [ Pl ; Pc R
+#
+# where Pl is the line number and Pc is the column number (in decimal).
+#
+# The specification for the DEC VT100 is document EK-VT100-UG-003.
+
+#### ANSI.SYS
+#
+# Here is a description of the color and attribute controls supported in the
+# the ANSI.SYS driver under MS-DOS.  Most console drivers and ANSI
+# terminal emulators for Intel boxes obey these.  They are a proper subset
+# of the ECMA-48 escapes.
+#
+# 0	all attributes off
+# 1	foreground bright
+# 4	underscore on
+# 5	blink on/background bright (not reliable with brown)
+# 7	reverse-video
+# 8	set blank (non-display)
+# 10	set primary font
+# 11	set first alternate font (on PCs, display ROM characters 1-31)
+# 12	set second alternate font (on PCs, display IBM high-half chars)
+#
+#			Color attribute sets
+# 3n	set foreground color       / 0=black, 1=red,     2=green, 3=brown,
+# 4n	set background color       \ 4=blue,  5=magenta, 6=cyan,  7=white
+# Bright black becomes gray.  Bright brown becomes yellow,
+# These coincide with the prescriptions of the ISO 6429/ECMA-48 standard.
+#
+# * If the 5 attribute is on and you set a background color (40-47) it is
+#   supposed to enable bright background.
+#
+# * Many VGA cards (such as the Paradise and compatibles) do the wrong thing
+#   when you try to set a "bright brown" (yellow) background with attribute
+#   5 (you get a blinking yellow foreground instead).  A few displays
+#   (including the System V console) support an attribute 6 that undoes this
+#   braindamage (this is required by iBCS2).
+#
+# * Some older versions of ANSI.SYS have a bug that causes them to require
+#   ESC [ Pn k as EL rather than the ANSI ESC [ Pn K.  (This is not ECMA-48
+#   compatible.)
+
+#### Intel Binary Compatibility Standard
+#
+# For comparison, here are the capabilities implied by the Intel Binary
+# Compatibility Standard for UNIX systems (Intel order number 468366-001).
+# These recommendations are optional.  IBCS2 allows the leading escape to
+# be either the 7-bit \E[ or 8-bit \0233 introducer, in accordance with
+# the ANSI X.364/ISO 6429/ECMA-48 standard.  Here are the iBCS2 capabilities
+# (as described in figure 9-3 of the standard).  Those expressed in the ibcs2
+# terminfo entry are followed with the corresponding capability in parens:
+#
+#	CSI <n>k		disable (n=0) or enable (n=1) keyclick
+#	CSI 2h			lock keyboard
+#	CSI 2i			send screen as input
+#	CSI 2l			unlock keyboard
+#	CSI 6m			enable background color intensity
+#	CSI <0-2>c		reserved
+#	CSI <0-59>m		select graphic rendition
+#	CSI <n>;<m>H	(cup)	cursor to line n and column m
+#	CSI <n>;<m>f		cursor to line n and column m
+#	CSI <n>@	(ich)	insert characters
+#	CSI <n>A	(cuu)	cursor up n lines
+#	CSI <n>B	(cud)	cursor down n lines
+#	CSI <n>C	(cuu)	cursor right n characters
+#	CSI <n>D	(cud)	cursor left n characters
+#	CSI <n>E		cursor down n lines and in first column
+#	CSI <n>F		cursor up n lines and in first column
+#	CSI <n>G	(hpa)	position cursor at column n-1
+#	CSI <n>J	(ed)	erase in display
+#	CSI <n>K	(el)	erase in line
+#	CSI <n>L	(il)	insert line(s)
+#	CSI <n>P	(dch)	delete characters
+#	CSI <n>S	(indn)	scroll up n lines
+#	CSI <n>T	(rin)	scroll down n lines
+#	CSI <n>X	(ech)	erase characters
+#	CSI <n>Z	(cbt)	back up n tab stops
+#	CSI <n>`		cursor to column n on line
+#	CSI <n>a	(cuu)	cursor right n characters
+#	CSI <n>d	(vpa)	cursor to line n
+#	CSI <n>e		cursor down n lines and in first column
+#	CSI <n>g	(cbt)	clear all tabs
+#	CSI <n>z		make virtual terminal n active
+#	CSI ?7h		(smam)	turn automargin on
+#	CSI ?7l		(rmam)	turn automargin off
+#	CSI s			save cursor position
+#	CSI u			restore cursor position to saved value
+#	CSI =<c>A		set overscan color
+#	CSI =<c>F		set normal foreground color
+#	CSI =<c>G		set normal background color
+#	CSI =<c>H		set reverse foreground color
+#	CSI =<c>I		set reverse foreground color
+#	CSI =<c>J		set graphic foreground color
+#	CSI =<c>K		set graphic foreground color
+#	CSI =<n>g	(dispc) display n from alternate graphics character set
+#	CSI =<p>;<d>B		set bell parameters
+#	CSI =<s>;<e>C		set cursor parameters
+#	CSI =<x>D		enable/disable intensity of background color
+#	CSI =<x>E		set/clear blink vs. bold background
+#	CSI 7		(sc)	(sc) save cursor position
+#	CSI 8		(rc)	(rc) restore cursor position to saved value
+#	CSI H		(hts)	(hts) set tab stop
+#	CSI Q<n><string>	define function key string
+#				(string must begin and end with delimiter char)
+#	CSI c		(clear) clear screen
+#
+# The lack of any specification for attributes in SGR (among other things)
+# makes this a wretchedly weak standard. The table above is literally
+# everything iBSC2 has to say about terminal escape sequences; there is
+# no further discussion of their meaning or how to set the parameters
+# in these sequences at all.
+#
+
+######## NONSTANDARD CAPABILITY TRANSLATIONS USED IN THIS FILE
+#
+# The historical termcap file entries were written primarily in 4.4BSD termcap.
+# The 4.4BSD termcap set was substantially larger than the original 4.1BSD set,
+# with the extension names chosen for compatibility with the termcap names
+# assigned in System V terminfo.  There are some variant extension sets out
+# there.  We try to describe them here.
+#
+#### XENIX extensions:
+#
+# The XENIX extensions include a set of function-key capabilities as follows:
+#
+#       code	XENIX variable name	terminfo name	name clashes?
+#	----	-------------------	-------------	-----------------------
+#	CL	key_char_left
+#	CR	key_char_right
+#	CW	key_change_window			create_window
+#	EN	key_end			kend
+#	HM	key_home		khome
+#	HP	??
+#	LD	key_delete_line		kdl1
+#	LF	key_linefeed				label_off
+#	NU	key_next_unlocked_cell
+#	PD	key_page_down		knp
+#	PL	??
+#	PN	start_print		mc5
+#	PR	??
+#	PS	stop_print		mc4
+#	PU	key_page_up		kpp		pulse
+#	RC	key_recalc				remove_clock
+#	RF	key_toggle_ref				req_for_input
+#	RT	key_return		kent
+#	UP	key_up_arrow		kcuu1		parm_up_cursor
+#	WL	key_word_left
+#	WR	key_word_right
+#
+# The XENIX extensions also include the following character-set and highlight
+# capabilities:
+#
+#	XENIX	terminfo	function
+#	-----	--------	------------------------------
+#	GS	smacs		start alternate character set
+#	GE	rmacs		end alternate character set
+#	GG			:as:/:ae: glitch (analogous to :sg:/:ug:)
+#	bo	blink		begin blink (not used in /etc/termcap)
+#	be			end blink (not used in /etc/termcap)
+#	bb			blink glitch  (not used in /etc/termcap)
+#	it	dim		begin dim (not used in /etc/termcap)
+#	ie			end dim (not used in /etc/termcap)
+#	ig			dim glitch  (not used in /etc/termcap)
+#
+# Finally, XENIX also used the following forms-drawing capabilities:
+#
+#	single	double  type             ASCII approximation
+#	------	------	-------------    -------------------
+#	GV	Gv	vertical line             |
+#	GH	Gv	horizontal line       -   _
+#	G1	G5	top right corner       _   |
+#	G2	G6	top left corner       |
+#	G3	G7	bottom left corner         |_
+#	G4	G8	bottom right corner   _|
+#	GD	Gd	down-tick character        T
+#	GL	Gl	left-tick character   -|
+#	GR	Gr	right-tick character       |-
+#	GC	Gc	middle intersection   -|-
+#	GU	Gu	up-tick character          _|_
+#
+# These were invented to take advantage of the IBM PC ROM character set.  One
+# can compose an acsc string from the single-width characters as follows
+#	"j{G4}k{G1}l{G2}m{G3}q{GH}x{GV}t{GR}u{GL}v{GU}w{GD}n{GC}"
+# When translating a termcap file, ncurses tic will do this automatically.
+# The double forms characters don't fit the SVr4 terminfo model.
+#
+#### AT&T Extensions:
+#
+# The old AT&T 5410, 5420, 5425, pc6300plus, 610, and s4 entries used a set of
+# nonstandard capabilities.  Its signature is the KM capability, used to name
+# some sort of keymap file.  EE, BO, CI, CV, XS, DS, FL and FE are in this
+# set.  Comments in the original, and a little cross-checking with other AT&T
+# documentation, seem to establish that BO=:mr: (start reverse video), DS=:mh:
+# (start dim), XS=:mk: (secure/invisible mode), EE=:me: (end highlights),
+# FL=:LO: (enable soft labels), FE=:LF: (disable soft labels), CI=:vi: (make
+# cursor invisible), and CV=:ve: (make cursor normal).
+#
+#### HP Extensions
+#
+# The HP library (as of mid-1995, their term.h file version 70.1) appears to
+# have the System V capabilities up to SVr1 level.  After that, it supports
+# two nonstandard caps meml and memu corresponding to the old termcap :ml:,
+# :mu: capabilities.  After that, it supports caps plab_norm, label_on,
+# label_off, and key_f11..key_f63 capabilities like SVr4's.  This makes the
+# HP binary format incompatible with SVr4's.
+#
+#### IBM Extensions
+#
+# There is a set of nonstandard terminfos used by IBM's AIX operating system.
+# The AIX terminfo library diverged from SVr1 terminfo, and replaces all
+# capabilities following prtr_non with the following special capabilities:
+# box[12], batt[12], colb[0123456789], colf[0123456789], f[01234567], kbtab,
+# kdo, kcmd, kcpn, kend, khlp, knl, knpn, kppn, kppn, kquit, ksel, kscl, kscr,
+# ktab, kmpf[123456789], apstr, ksf1..ksf10, kf11...kf63, kact, topl, btml,
+# rvert, lvert.   Some of these are identical to XPG4/SVr4 equivalents:
+# kcmd, kend, khlp, and kf11...kf63.  Two others (kbtab and ksel) can be
+# renamed (to kcbt and kslt).  The places in the box[12] capabilities
+# correspond to acsc chars, here is the mapping:
+#
+#	box1[0]  = ACS_ULCORNER
+#	box1[1]  = ACS_HLINE
+#	box1[2]  = ACS_URCORNER
+#	box1[3]  = ACS_VLINE
+#	box1[4]  = ACS_LRCORNER
+#	box1[5]  = ACS_LLCORNER
+#	box1[6]  = ACS_TTEE
+#	box1[7]  = ACS_RTEE
+#	box1[8]  = ACS_BTEE
+#	box1[9]  = ACS_LTEE
+#	box1[10] = ACS_PLUS
+#
+# The box2 characters are the double-line versions of these forms graphics.
+# The AIX binary terminfo format is incompatible with SVr4's.
+#
+#### Iris console extensions:
+#
+# HS is half-intensity start; HE is half-intensity end
+# CT is color terminal type (for Curses & rogue)
+# CP is color change escape sequence
+# CZ are color names (for Curses & rogue)
+#
+# The ncurses tic utility recognizes HS as an alias for mh <dim>.
+#
+#### TC Extensions:
+#
+# There is a set of extended termcaps associated with something
+# called the "Terminal Control" or TC package created by MainStream Systems,
+# Winfield Kansas.  This one also uses GS/GE for as/ae, and also uses
+# CF for civis and CO for cvvis.  Finally, they define a boolean :ct:
+# that flags color terminals.
+#
+######## NCURSES USER-DEFINABLE CAPABILITIES
+#
+# Extensions added after ncurses 5.0 generally use the "-x" option of tic and
+# infocmp to manipulate user-definable capabilities.  Those that are intended
+# for use in either terminfo or termcap use 2-character names.  Extended
+# function keys do not use 2-character names, and are available only with
+# terminfo.
+#
+# Beginning in 2010, NetBSD curses has also provided a "-x" option for
+# tic/infocmp, and uses this database (with a few changes).  There are a few
+# differences, noted in
+#	https://invisible-island.net/ncurses/ncurses-netbsd.html
+#
+# ncurses makes explicit checks for a few user-definable capabilities:  AX,
+# RGB, U8, XM, which are documented in the user_caps(5) manual page.
+#
+#### SCREEN Extensions:
+#
+# The screen program uses the termcap interface.  It recognizes a few useful
+# nonstandard capabilities.  Those are used in this file.
+#
+#       AX   (bool)  Does  understand  ANSI  set  default fg/bg color (\E[39m /
+#                    \E[49m).
+#       G0   (bool)  Terminal can deal with ISO 2022  font  selection sequences.
+#       E0   (str)   Switch charset 'G0' back to standard charset.
+#       S0   (str)   Switch charset 'G0' to the specified charset.
+#       XT   (bool)  Terminal understands special xterm sequences  (OSC,  mouse
+#                    tracking).
+#
+# AX is relatively straightforward; it is interpreted by ncurses to say that
+# SGR 39/49 reset the terminal's foreground and background colors to their
+# "default".
+#
+# XT is harder, since screen's manpage does not give more details.  For that,
+# we must read screen's source-code.  For example, when XT is set, screen
+# assumes
+#
+# a) OSC 1 sets the title string, e.g., for the icon.  Recent versions of
+#    screen may also set the terminal's name, which is (for xterm) distinct
+#    from the icon name.
+# b) OSC 20 sets the background pixmap.  This is an rxvt feature.
+# c) OSC 39 and OSC 49 set the default foreground/background colors.  Again
+#    this is an rxvt feature.
+# d) certain mode settings enable the mouse: 9, 1000, 1001, 1002, 1003.
+#    These are from xterm, although xterm accepts mouse codes that may not be
+#    recognized by screen, e.g., 1005, 1006.
+# e) colors beyond 0..7 are implemented by xterm's aixterm-like 16-color
+#    sequence.  However, because screen uses only termcap, the values returned
+#    by Af/Ab are not usable because they rely on expressions that termcap
+#    does not support.  Therefore, screen uses a hardcoded string to work
+#    around the limitation.  In a few cases, screen also uses tparm, which
+#    is a terminfo function rather than termcap.
+# f) all entries named "*xterm*" or "*rxvt*" have the bce flag set.
+# g) screen also uses the feature to decide whether to pay attention to other
+#    xterm-related features which are unrelated to the description in the
+#    manual page.
+#
+# Since XT is useful only when the outer terminal matches screen's assumptions,
+# it is appropriate to use it in the derived terminal descriptions such as
+# "screen.xterm", but not in the generic "screen", "screen-bce" entries.
+#
+# The other ISO-2022 features are rarely used, but provided here to make
+# screen's termcap features available.
+#
+#### XTERM Extensions:
+#
+# For a discussion of "xterm", "xterm-256color" as values for TERM, see
+#	https://invisible-island.net/ncurses/ncurses.faq.html#xterm_generic
+#	https://invisible-island.net/ncurses/ncurses.faq.html#xterm_256color
+#
+# For xterm control sequences, see
+#	https://invisible-island.net/xterm/ctlseqs/ctlseqs.html
+#
+# For function-keys with modifiers, see
+#	https://invisible-island.net/ncurses/ncurses.faq.html#modified_keys
+#
+# For a discussion of "bracketed paste", see
+#	https://invisible-island.net/xterm/xterm-paste64.html
+#
+# Most of the xterm extensions are for function-keys.  Since xterm patch #94 (in
+# 1999), xterm has supported shift/control/alt/meta modifiers which produce
+# additional function-key strings.  Some other developers copied the feature,
+# though they did not follow xterm's lead in xterm patch #167 (in 2002), to make
+# these key definitions less ambiguous.
+#
+# A few terminals provide similar functionality (sending distinct keys when
+# a modifier is used), including rxvt.
+#
+# These are the extended keys defined in this file:
+#
+# kDC3 kDC4 kDC5 kDC6 kDC7 kDN kDN3 kDN4 kDN5 kDN6 kDN7 kEND3 kEND4 kEND5 kEND6
+# kEND7 kHOM3 kHOM4 kHOM5 kHOM6 kHOM7 kIC3 kIC4 kIC5 kIC6 kIC7 kLFT3 kLFT4
+# kLFT5 kLFT6 kLFT7 kNXT3 kNXT4 kNXT5 kNXT6 kNXT7 kPRV3 kPRV4 kPRV5 kPRV6 kPRV7
+# kRIT3 kRIT4 kRIT5 kRIT6 kRIT7 kUP kUP3 kUP4 kUP5 kUP6 kUP7 ka2 kb1 kb3 kc2
+#
+# Bracketed paste is described with these capabilities in vim:
+#
+# BE enables bracketed paste
+# BD disables bracketed paste
+# PS is sent before the pasted text
+# PE is sent after the pasted text
+#
+# Here are the other xterm-related extensions which are used in this file:
+#
+# Cr is a string capability which resets the cursor color
+# Cs is a string capability which sets the cursor color to a given value.
+#    The single string parameter is the color name/number, according to the
+#    implementation.
+# Ms modifies the selection/clipboard.  Its parameters are
+#	p1 = the storage unit (clipboard, selection or cut buffer)
+#	p2 = the base64-encoded clipboard content.
+# Se resets the cursor style to the terminal power-on default.
+# Ss is a string capability with one numeric parameter.  It is used to set the
+#    cursor style as described by the DECSCUSR function to a block or
+#    underline.
+# TS is a string capability which acts like "tsl", but uses no parameter and
+#    goes to the first column of the "status line".
+# XM is a string capability which overrides ncurses's built-in string which
+#    enables/disables xterm mouse mode.
+# xm shows the format of the mouse responses.  Parameters:
+#	p1 = y-ordinate
+#	p2 = x-ordinate
+#	p3 = button
+#	p4 = state, e.g., pressed or released
+#	p5 = y-ordinate starting region
+#	p6 = x-ordinate starting region
+#	p7 = y-ordinate ending region
+#	p8 = x-ordinate ending region
+# Other extensions, used in xm:
+#	%u = UTF-8
+#
+#### Miscellaneous extensions:
+#
+# csr clears the status line
+# gsbom/grbom are used to enable/disable real bold (not intensity bright) mode.
+#    This was implemented for the Hurd.
+# rmxx/smxx describes the ECMA-48 strikeout/crossed-out attributes, as an
+#    experimental feature of tmux.
+# CO gives the number of indexed ("ANSI") colors which overlay an RGB color
+#    space.
+# E3 clears the terminal's scrollback buffer.  This was implemented in the
+#    Linux 3.0 kernel as a security feature.  It matches a feature which was
+#    added in xterm patch #107.
+# NQ denotes a terminal which does not support the standard query/response used
+#    in u6/u7 (cursor position) and u8/u9 (device attributes).
+# U8 is a numeric capability which denotes a terminal emulator which does not
+#    support VT100 SI/SO when processing UTF-8 encoding.  Set this to a nonzero
+#    value to enable it.
+# Smulx modifies the appearance of underlines in VTE, December 2017.
+#
+######## CHANGE HISTORY
+#
+# The last /etc/termcap version maintained by John Kunze was 8.3, dated 8/5/94.
+# Releases 9 and 10 (up until the release of ncurses 4.2 in 1998) were
+# maintained by Eric S. Raymond as part of the ncurses project.
+#
+# This file contains all the capability information present in John Kunze's
+# last version of the termcap master file, except as noted in the change
+# comments at end of file.  Some information about very ancient obsolete
+# capabilities has been moved to comments.  Some all-numeric names of older
+# terminals have been retired.
+#
+# I changed :MT: to :km: (the 4.4BSD name) everywhere.  I commented out some
+# capabilities (EP, dF, dT, dV, kn, ma, ml, mu, xr, xx) that are no longer
+# used by BSD curses.
+#
+# The 9.1.0 version of this file was translated from my lightly-edited copy of
+# 8.3, then mechanically checked against 8.3 using Emacs Lisp code written for
+# the purpose.  Unless the ncurses tic implementation and the Lisp code were
+# making perfectly synchronized mistakes which I then failed to catch by
+# eyeball, the translation was correct and perfectly information-preserving.
+#
+# Major version number bumps correspond to major version changes in ncurses.
+#
+# Here is a log of the changes since then:
+#
+# 9.1.0 (Wed Feb  1 04:50:32 EST 1995):
+#	* First terminfo master translated from 8.3.
+# 9.2.0 (Wed Feb  1 12:21:45 EST 1995):
+#	* Replaced Wyse entries with updated entries supplied by vendor.
+#
+# 9.3.0 (Mon Feb  6 19:14:40 EST 1995):
+#	* Added contact & status info from G. Clark Brown <clark@sssi.com>.
+# 9.3.1 (Tue Feb  7 12:00:24 EST 1995):
+#	* Better XENIX keycap translation.  Describe TC termcaps.
+#	* Contact and history info supplied by Qume.
+# 9.3.2 (Sat Feb 11 23:40:02 EST 1995):
+#	* Raided the Shuford FTP site for recent termcaps/terminfos.
+#	* Added information on X3.64 and VT100 standard escape sequences.
+# 9.3.3 (Mon Feb 13 12:26:15 EST 1995):
+#	* Added a correct X11R6 xterm entry.
+#	* Fixed terminfo translations of padding.
+# 9.3.4 (Wed Feb 22 19:27:34 EST 1995):
+#	* Added correct acsc/smacs/rmacs strings for vt100 and xterm.
+#	* Added u6/u7/u8/u9 capabilities.
+#	* Added PCVT entry.
+# 9.3.5 (Thu Feb 23 09:37:12 EST 1995):
+#	* Emacs uses :so:, not :mr:, for its mode line.  Fix linux entry
+#	  to use reverse-video standout so Emacs will look right.
+#	* Added el1 capability to ansi.
+#	* Added smacs/rmacs to ansi.sys.
+#
+# 9.4.0 (Sat Feb 25 16:43:25 EST 1995):
+#	* New mt70 entry.
+#	* Added COPYRIGHTS AND OTHER DELUSIONS.
+#	* Added AT&T 23xx & 500/513, vt220 and vt420, opus3n1+, netronics
+#	  smartvid & smarterm, ampex 175 & 219 & 232,
+#	  env230, falco ts100, fluke, intertube, superbrain, ncr7901, vic20,
+#	  ozzie, trs200, tr600, Tandy & Texas Instruments VDTs, intext2,
+#	  screwpoint, fviewpoint, Contel Business Systems, Datamedia Colorscan,
+#	  adm36, mime314, ergo4000, ca22851.  Replaced att7300, esprit, dd5500.
+#	* Replaced the Perkin-Elmer entries with vendor's official ones.
+#	* Restored the old minimal-ansi entry, luna needs it.
+#	* Fixed some incorrect ip and proportional-padding translations.
+# 9.4.1 (Mon Feb 27 14:18:33 EST 1995):
+#	* Fix linux & AT386 sgr strings to do A_ALTCHARSET turnoff correctly.
+#	* Make the xterm entry 65 lines again; create xterm25 and xterm24
+#	  to force a particular height.
+#	* Added beehive4 and reorganized other Harris entries.
+# 9.4.2 (Thu Mar  9 01:45:44 EST 1995):
+#	* Merged in DEC's official entries for its terminals.  The only old
+#	  entry I kept was Doug Gwyn's alternate vt100 (as vt100-avo).
+#	* Replaced the translated BBN BitGraph entries with purpose-built
+#	  ones from AT&T's SVr3.
+#	* Replaced the AT&T entries with AT&T's official terminfos.
+#	* Added Teleray 16, vc415, cops10.
+#	* Merged in many individual capabilities from SCO terminfo files.
+# 9.4.3 (Mon Mar 13 02:37:53 EST 1995):
+#	* Typo fixes.
+#	* Change linux entry so A_PROTECT enables IBM-PC ROM characters.
+# 9.4.4 (Mon Mar 27 12:32:35 EST 1995):
+#	* Added tty35, Ann Arbor Guru series. vi300 and 550, cg7900, tvi803,
+#	  pt210, ibm3164, IBM System 1, ctrm, Tymshare scanset, dt200, adm21,
+#	  simterm, citoh and variants.
+#	* Replaced sol entry with sol1 and sol2.
+#	* Replaced Qume QVT and Freedom-series entries with purpose-built
+#	  terminfo entries.
+#	* Enhanced vt220, tvi910, tvi924, hpterm, hp2645, adm42, tek
+#	  and dg200 entries using caps from from SCO.
+#	* Added the usual set of function-key mappings to ANSI entry.
+#	* Corrected xterm's function-key capabilities.
+# 9.4.5 (Tue Mar 28 14:27:49 EST 1995):
+#	* Fix in xterm entry, cub and cud are not reliable under X11R6.
+# 9.4.6 (Thu Mar 30 14:52:15 EST 1995):
+#	* Fix in xterm entry, get the arrow keys right.
+#	* Change some \0 escapes to \200.
+# 9.4.7 (Tue Apr  4 11:27:11 EDT 1995)
+#	* Added apple (Videx card), adm1a, oadm31.
+#	* Fixed malformed ampex csr.
+#	* Fixed act4, cyb110; they had old-style prefix padding left in.
+#	* Changed mandatory to advisory padding in many entries.
+#	* Replaced HP entries up to hpsub with purpose-built ones.
+#	* Blank rmir/smir/rmdc/smdc capabilities removed.
+#	* Small fixes merged in from SCO entries for lpr, fos, tvi910+, tvi924.
+# 9.4.8 (Fri Apr  7 09:36:34 EDT 1995):
+#	* Replaced the Ann Arbor entries with SCO's, the init strings are
+#	  more efficient (but the entries otherwise identical).
+#	* Added dg211 from Shuford archive.
+#	* Added synertek, apple-soroc, ibmpc, pc-venix, pc-coherent, xtalk,
+#	  adm42-nl, pc52, gs6300, xerox820, uts30.
+#	* Pull SCO's padding into vi200 entry.
+#	* Improved capabilities for tvi4107 and other TeleVideo and Viewpoint
+#	  entries merged in from SCO's descriptions.
+#	* Fixed old-style prefix padding on zen50, h1500.
+#	* Moved old superbee entry to superbee-xsb, pulled in new superbee
+#	  entry from SCO's description.
+#	* Reorganized the special entries.
+#	* Added lm#0 to cbunix and virtual entries.
+#
+# 9.5.0 (Mon Apr 10 11:30:00 EDT 1995):
+#	* Restored cdc456tst.
+#	* Fixed sb1 entry, SCO erroneously left out the xsb glitch.
+#	* Added megatek, beacon, microkit.
+#	* Freeze for ncurses-1.9 release.
+# 9.5.1 (Fri Apr 21 12:46:42 EDT 1995):
+#	* Added historical data for TAB.
+#	* Comment fixes from David MacKenzie.
+#	* Added the new BSDI pc3 entry.
+# 9.5.2 (Tue Apr 25 17:27:52 EDT 1995)
+#	* A change in the tic -C logic now ensures that all entries in
+#	  the termcap translation will fit in < 1024 bytes.
+#	* Added `bobcat' and `gator' HP consoles and the Nu machine entries
+#	  from GNU termcap file.  This merges in all their local information.
+# 9.5.3 (Tue Apr 25 22:28:13 EDT 1995)
+#	* Changed tic -C logic to dump all capabilities used by GNU termcap.
+#	* Added warnings about entries with long translations (restoring
+#	  all the GNU termcaps pushes a few over the edge).
+# 9.5.4 (Wed Apr 26 15:35:09 EDT 1995)
+#	* Yet another tic change, and a couple of entry tweaks, to reduce the
+#	  number of long (> 1024) termcap translations back to 0.
+#
+# 9.6.0 (Mon May  1 10:35:54 EDT 1995)
+#	* Added kf13-kf20 to Linux entry.
+#	* Regularize Prime terminal names.
+#	* Historical data on Synertek.
+#	* Freeze for ncurses-1.9.1.
+# 9.6.1 (Sat May  6 02:00:52 EDT 1995):
+#	* Added true xterm-color entry, renamed djm's pseudo-color entry.
+#	* Eliminate whitespace in short name fields, this tanks some scripts.
+#	* Name field changes to shorten some long entries.
+#	* Termcap translation now automatically generates empty rmir/smir
+#	  when ich1/ich is present (copes with an ancient vi bug).
+#	* Added `screen' entries from FSF's screen-3.6.2.
+#	* Added linux-nic and xterm-nic entries.
+# 9.6.2 (Sat May  6 17:00:55 EDT 1995):
+#	* Change linux entry to use smacs=\E[11m and have an explicit acsc,
+#	  eliminating some special-case code in ncurses.
+#
+# 9.7.0 (Tue May  9 18:03:12 EDT 1995):
+#	* Added vt320-k3, rsvidtx from the Emacs termcap.dat file.  I think
+#	  that captures everything unique from it.
+#	* Added reorder script generator.
+#	* Freeze for ncurses 1.9.2 release.
+# 9.7.1 (Thu Jun 29 09:35:22 EDT 1995):
+#	* Added Sean Farley's kspd, flash, rs1 capabilities for linux.
+#	* Added Olaf Siebert's corrections for adm12.
+#	* ansi-pc-color now includes the colors and pairs caps, so that
+#	  entries which use it will inherit them automatically.
+#	* The linux entry can now recognize the center (keypad 5) key.
+#	* Removed some junk that found its way into Linux acsc.
+#
+# 9.8.0 (Fri Jul  7 04:46:57 EDT 1995):
+#	* Add 50% cut mark as a desperate hack to reduce tic's core usage.
+#	* xterm doesn't try to use application keypad mode any more.
+#	* Freeze for ncurses-1.9.3 release.
+# 9.8.1 (Thu Jul 19 17:02:12 EDT 1995):
+#	* Added corrected sun entry from vendor.
+#	* Added csr capability to linux entry.
+#	* Peter Wemm says the at386 hpa should be \E[%i%p1%dG, not \E[%p1%dG.
+#	* Added vt102-nsgr to cope with stupid IBM PC `VT100' emulators.
+#	* Some commented-out caps in long entries come back in, my code
+#	  for computing string-table lengths had a bug in it.
+#	* pcansi series modified to fit comm-program reality better.
+# 9.8.2 (Sat Sep  9 23:35:00 EDT 1995):
+#	* BSD/OS actually ships the ibmpc3 bold entry as its console.
+#	* Correct some bad aliases in the pcansi series
+#	* Added entry for QNX console.
+#	* Clean up duplicate long names for use with 4.4 library.
+#	* Change vt100 standout to be normal reverse vide, not bright reverse;
+#	  this makes the Emacs status line look better.
+# 9.8.3 (Sun Sep 10 13:07:34 EDT 1995):
+#	* Added Adam Thompson's VT320 entries, also his dtx-sas and z340.
+#	* Minor surgery, mostly on name strings, to shorten termcap version.
+#
+# 9.9.0 (Sat Sep 16 23:03:48 EDT 1995):
+#	* Added dec-vt100 for use with the EWAN emulator.
+#	* Added kmous to xterm for use with xterm's mouse-tracking facility.
+#	* Freeze for 1.9.5 alpha release.
+# 9.9.1 (Wed Sep 20 13:46:09 EDT 1995):
+#	* Changed xterm lines to 24, the X11R6 default.
+# 9.9.2 (Sat Sep 23 21:29:21 EDT 1995):
+#	* Added 7 newly discovered, undocumented acsc characters to linux
+#	  entry (the pryz{|} characters).
+#	* ncurses no longer steals A_PROTECT.  Simplify linux sgr accordingly.
+#	* Correct two typos in the xterm entries introduced in 9.9.1.
+#	* I finally figured out how to translate ko capabilities.  Done.
+#	* Added tvi921 entries from Tim Theisen.
+#	* Cleanup: dgd211 -> dg211, adm42-nl -> adm42-nsl.
+#	* Removed mystery tec entry, it was neither interesting nor useful.
+#	* shortened altos3, qvt203, tvi910+, tvi92D, tvi921-g, tvi955, vi200-f,
+#	  vi300-ss, att505-24, contel301, dm3045, f200vi, pe7000c, vc303a,
+#	  trs200, wind26, wind40, wind50, cdc456tst, dku7003, f110, dg211,
+#	  by making them relative to use capabilities
+#	* Added cuf1=^L to tvi925 from deleted variant tvi925a.
+#	* fixed cup in adm22 entry and parametrized strings in vt320-k3.
+#	* added it#8 to entries that used to have :pt: -- tvi912, vi200,
+#	  ampex80,
+#	* Translate all home=\E[;H capabilities to home=\E[H, they're
+#	  equivalent.
+#	* Translate \E[0m -> \E[m in [rs]mso, [rs]mul, and init strings of
+#	  vt100 and ANSI-like terminals.
+# 9.9.3 (Tue Sep 26 20:11:15 EDT 1995):
+#	* Added it#8 and ht=\t to *all* entries with :pt:; the ncurses tic
+#	  does this now, too.
+#	* fviewpoint is gone, it duplicated screwpoint.
+#	* Added hp2627, graphos, graphos-30, hpex, ibmega, ibm8514, ibm8514-c,
+#	  ibmvga, ibmvga-c, minix, mm340, mt4520-rv, screen2, screen3,
+#	  versaterm, vi500, vsc, vt131, vt340, vt400 entries from UW.
+#	  The UW vi50 replaces the old one, which becomes vi50adm,
+#	* No more embedded commas in name fields.
+#
+# 9.10.0 (Wed Oct  4 15:39:37 EDT 1995):
+#	* XENIX forms characters in fos, trs16, scoansi become acsc strings,
+#	* Introduced klone+* entries for describing Intel-console behavior.
+#	* Linux kbs is default-mapped to delete for some brain-dead reason.
+#	* -nsl -> -ns.  The -pp syntax is obsolete.
+#	* Eliminate [A-Z]* primaries in accordance with SVr4 terminfo docs.
+#	* Make xterm entry do application-keypad mode again.  I got complaints
+#	  that it was messing up someone's 3270 emulator.
+#	* Added some longname fields in order to avoid warning messages from
+#	  older tic implementations.
+#	* According to ctlseqs.ms, xterm has a full vt100 graphics set.  Use
+#	  it! (This gives us pi, greater than, less than, and a few more.)
+#	* Freeze for ncurses-1.9.6 release.
+# 9.10.1 (Sat Oct 21 22:18:09 EDT 1995):
+#	* Add xon to a number of console entries, they're memory-mapped and
+#	  don't need padding.
+#	* Correct the use dependencies in the ansi series.
+#	* Hand-translate more XENIX capabilities.
+#	* Added hpterm entry for HP's X terminal emulator.
+#	* Added aixterm entries.
+#	* Shortened four names so everything fits in 14 chars.
+#
+# 9.11.0 (Thu Nov  2 17:29:35 EST 1995):
+#	* Added ibcs2 entry and info on iBCS2 standard.
+#	* Corrected hpa/vpa in linux entry.  They still fail the worm test.
+#	* We can handle the HP meml/memu capability now.
+#	* Added smacs to klone entries, just as documentation.
+#	* Corrected ansi.sys and cit-500 entries.
+#	* Added z39, vt320-k311, v220c, and avatar entries.
+#	* Make pcansi use the ansi.sys invis capability.
+#	* Added DIP switch descriptions for vt100, adm31, tvi910, tvi920c,
+#	  tvi925, tvi950, dt80, ncr7900i, h19.
+#	* X3.64 has been withdrawn, change some references.
+#	* Removed function keys from ansi-m entry.
+#	* Corrected ansi.sys entry.
+#	* Freeze for ncurses-1.9.7 release.
+# 9.11.1 (Tue Nov  6 18:18:38 EST 1995):
+#	* Added rmam/smam capabilities to many entries based on init strings.
+#	* Added correct hpa/vpa to linux.
+#	* Reduced several entries relative to vt52.
+# 9.11.2 (Tue Nov  7 00:21:06 EST 1995):
+#	* Exiled some utterly unidentifiable custom and homebrew types to the
+#	  UFO file; also, obsolete small-screen hardware; also, entries which
+#	  look flat-out incorrect, garbled, or redundant.  These include the
+#	  following entries: carlock, cdc456tst, microkit, qdss, ramtek, tec,
+#	  tec400, tec500, ubell, wind, wind16, wind40, wind50, plasma, agile,
+#	  apple, bch, daleblit, nucterm, ttywilliams, nuterminal, nu24, bnu,
+#	  fnu, nunix-30, nunix-61, exidy, ex3000, sexidy, pc52, sanyo55,
+#	  yterm10, yterm11, yterm10nat, aed, aed-ucb, compucolor, compucolor2,
+#	  vic20, dg1, act5s, netx, smartvid, smarterm, sol, sol2, dt200,
+#	  trs80, trs100, trs200, trs600, xitex, rsvidtx, vid, att2300-x40,
+#	  att2350-x40, att4410-nfk, att5410-ns, otty5410, att5425-nl-w,
+#	  tty5425-fk, tty5425-w-fk, cita, c108-na, c108-rv-na, c100-rv-na,
+#	  c108-na-acs, c108-rv-na-acs, ims950-ns, infotonKAS, ncr7900i-na,
+#	  regent60na, scanset-n, tvi921-g, tvi925n, tvi925vbn, tvi925vb,
+#	  vc404-na, vc404-s-na, vt420nam, vt420f-nam, vt420pc-nam, vt510nam,
+#	  vt510pc-nam, vt520nam, vt525nam, xterm25, xterm50, xterm65, xterms.
+#	* Corrected pcvt25h as suggested by Brian C. Grayson
+#	  <bgrayson@pine.ece.utexas.edu>.
+# 9.11.3 (Thu Nov  9 12:14:40 EST 1995):
+#	* Added kspd=\E[P, kcbt=\E[Z, to linux entry, changed kbs back to ^H.
+#	* Added kent=\EOM to xterm entry.
+#
+# 9.11.4 (Fri Nov 10 08:31:35 EST 1995):
+#	* Corrected gigi entry.
+#	* Restored cuf/cud1 to xterm, their apparent bugginess was due to
+#	  bad hpa/vpa capabilities.
+#	* Corrected flash strings to have a uniform delay of .2 sec.  No
+#	  more speed-dependent NUL-padding!
+#	* terminfo capabilities in comments bracketed with <>.
+# 9.11.5 (Fri Nov 10 15:35:02 EST 1995):
+#	* Replaced pcvt with the 3.31 pcvt entries.
+#	* Freeze for 1.9.7a.
+# 9.11.6 (Mon Nov 13 10:20:24 EST 1995):
+#	* Added emu entry from the X11R6 contrib tape sources.
+#
+# 9.12.0 (Wed Nov 29 04:22:25 EST 1995):
+#	* Improved iris-ansi and sun entries.
+#	* More flash string improvements.
+#	* Corrected wy160 & wy160 as suggested by Robert Dunn
+#	* Added dim to at386.
+#	* Reconciled pc3 and ibmpc3 with the BSDI termcap file.  Keith says
+#	  he's ready to start using the termcap generated from this one.
+#	* Added vt102-w, vt220-w, xterm-bold, wyse-vp, wy75ap, att4424m,
+#	  ln03, lno3-w, h19-g, z29a*, qdss.  Made vt200 an alias of vt220.
+#	* Improved hpterm, apollo consoles, fos, qvt101, tvi924. tvi925,
+#	  att610, att620, att630,
+#	* Changed hazeltine name prefix from h to hz.
+#	* Sent t500 to the UFI file.
+#	* I think we've sucked all the juice out of BSDI's termcap file now.
+#	* Freeze for ncurses 1.9.8 release
+# 9.12.1 (Thu Nov 30 03:14:06 EST 1995)
+#	* Unfreeze, linux kbs needed to be fixed.
+#	* Tim Theisen pinned down a bug in the DMD firmware.
+# 9.12.2 (Thu Nov 30 19:08:55 EST 1995):
+#	* Fixes to ansi and klone capabilities (thank you, Aaron Ucko).
+#	  (The broken ones had been shadowed by sgr.)
+# 9.12.3 (Thu Dec  7 17:47:22 EST 1995):
+#	* Added documentation on ECMA-48 standard.
+#	* New Amiga entry.
+# 9.12.4 (Thu Dec 14 04:16:39 EST 1995):
+#	* More ECMA-48 stuff
+#	* Corrected typo in minix entry, added pc-minix.
+#	* Corrected khome/kend in xterm (thank you again, Aaron Ucko).
+#	* Added rxvt entry.
+#	* Added 1.3.x color-change capabilities to linux entry.
+# 9.12.5 (Tue Dec 19 00:22:10 EST 1995):
+#	* Corrected rxvt entry khome/kend.
+#	* Corrected linux color change capabilities.
+#	* NeXT entries from Dave Wetzel.
+#	* Cleaned up if and rf file names (all in /usr/share now).
+#	* Changed linux op capability to avoid screwing up a background color
+#	  pair set by setterm.
+# 9.12.6 (Wed Feb  7 16:14:35 EST 1996):
+#	* Added xterm-sun.
+# 9.12.7 (Fri Feb  9 13:27:35 EST 1996):
+#	* Added visa50.
+#
+# 9.13.0 (Sun Mar 10 00:13:08 EST 1996):
+#	* Another sweep through the Shuford archive looking for new info.
+#	* Added dg100 alias to dg6053 based on a comp.terminals posting.
+#	* Added st52 from Per Persson.
+#	* Added eterm from the GNU Emacs 19.30 distribution.
+#	* Freeze for 1.9.9.
+# 9.13.1 (Fri Mar 29 14:06:46 EST 1996):
+#	* FreeBSD console entries from Andrew Chernov.
+#	* Removed duplicate Atari st52 name.
+# 9.13.2 (Tue May  7 16:10:06 EDT 1996)
+#	* xterm doesn't actually have ACS_BLOCK.
+#	* Change klone+color setf/setb to simpler forms that can be
+#	  translated into termcap.
+#	* Added xterm1.
+#	* Removed mechanically-generated junk capabilities from cons* entries.
+#	* Added color support to bsdos.
+# 9.13.3 (Thu May  9 10:35:51 EDT 1996):
+#	* Added Wyse 520 entries from Wm. Randolph Franklin <wrf@ecse.rpi.edu>.
+#	* Created ecma+color, linux can use it.  Also added ech to linux.
+#	* Teach xterm about more keys. Add Thomas Dickey's 3.1.2E updates.
+#	* Add descriptions to FreeBSD console entries.  Also shorten
+#	  some aliases to <= 14 chars for portability.
+#	* Added x68k console
+#	* Added OTbs to several VT-series entries.
+# 9.13.4 (Wed May 22 10:54:09 EDT 1996):
+#	* screen entry update for 3.7.1 from Michael Alan Dorman.
+# 9.13.5 (Wed Jun  5 11:22:41 EDT 1996):
+#	* kterm correction due to Kenji Rikitake.
+#	* ACS correction in vt320-kll due to Phillippe De Muyter.
+# 9.13.6 (Sun Jun 16 15:01:07 EDT 1996):
+#	* Sun console entry correction from J.T. Conklin.
+#	* Changed all DEC VT300 and up terminals to use VT300 tab set
+# 9.13.7 (Mon Jul  8 20:14:32 EDT 1996):
+#	* Added smul to linux entry (we never noticed it was missing
+#	  because of sgr!).
+#	* Added rmln to hp+labels (deduced from other HP entries).
+#	* Added vt100 acsc capability to vt220, vt340, vt400, d800, dt80-sas,
+#	  pro350, att7300, 5420_2, att4418, att4424, att4426, att505, vt320-k3.
+#	* Corrected vt220 acsc.
+#	* The klone+sgr and klone+sgr-dumb entries now use klone+acs;
+#	  this corresponds to reality and helps prevent some tic warnings.
+#	* Added sgr0 to c101, pcix, vt100-nav, screen2, oldsun, next, altos2,
+#	  hpgeneric, hpansi, hpsub, hp236, hp700-wy, bobcat, dku7003, adm11,
+#	  adm12, adm20, adm21, adm22, adm31, adm36, adm42, pt100, pt200,
+#	  qvt101, tvi910, tvi921, tvi92B, tvi925, tvi950, tvi970, wy30-mc,
+#	  wy50-mc, wy100, wyse-vp, ampex232, regent100, viewpoint, vp90,
+#	  adds980, cit101, cit500, contel300, cs10, dm80, falco, falco-p,
+#	  f1720a, go140, sb1, superbeeic, microb, ibm8512, kt7, ergo4000,
+#	  owl, uts30, dmterm, dt100, dt100, dt110, appleII, apple-videx,
+#	  lisa, trsII, atari, st52, pc-coherent, basis, m2-man, bg2.0, bg1.25,
+#	  dw3, ln03, ims-ansi, graphos, t16, zen30, xtalk, simterm, d800,
+#	  ifmr, v3220, wy100q, tandem653, ibmaed.
+#	* Added DWK terminal description.
+# 9.13.8 (Wed Jul 10 11:45:21 EDT 1996):
+#	* Many entries now have highlights inherited from adm+sgr.
+#	* xterm entry now corresponds to XFree86 3.1.2E, with color.
+#	* xtitle and xtitle-twm enable access to the X status line.
+#	* Added linux-1.3.6 color palette caps in conventional format.
+#	* Added adm1178 terminal.
+#	* Move fos and apollo terminals to obsolete category.
+#	* Aha! The BRL terminals file told us what the Iris extensions mean.
+#	* Added, from the BRL termcap file: rt6221, rt6221-w, northstar,
+#	  commodore, cdc721-esc, excel62, osexec.  Replaced from the BRL file:
+#	  cit500, adm11.
+# 9.13.9 (Mon Jul 15 00:32:51 EDT 1996):
+#	* Added, from the BRL termcap file: cdc721, cdc721l, cdc752, cdc756,
+#	  aws, awsc, zentec8001, modgraph48, rca vp3301/vp3501, ex155.
+#	* Corrected, from BRL termcap file: vi50.
+#	* Better rxvt entry & corrected xterm entries from Thomas Dickey.
+# 9.13.10 (Mon Jul 15 12:20:13 EDT 1996):
+#	* Added from BRL: cit101e & variants, hmod1, vi200, ansi77, att5620-1,
+#	  att5620-s, att5620-s, dg210, aas1901, hz1520, hp9845, osborne
+#	  (old osborne moved to osborne-w), tvi970-vb, tvi970-2p, tvi925-hi,
+#	  tek4105brl, tek4106brl, tek4107brl,tek4109brl, hazel, aepro,
+#	  apple40p, apple80p, appleIIgs, apple2e, apple2e-p, apple-ae.
+#	* Paired-attribute fixes to various terminals.
+#	* Sun entry corrections from A. Lukyanov & Gert-Jan Vons.
+#	* xterm entry corrections from Thomas Dickey.
+# 9.13.11 (Tue Jul 30 16:42:58 EDT 1996):
+#	* Added t916 entry, translated from a termcap in SCO's support area.
+#	* New qnx entry from Michael Hunter.
+# 9.13.12 (Mon Aug  5 14:31:11 EDT 1996):
+#	* Added hpex2 from Ville Sulko.
+#	* Fixed a bug that ran the qnx and pcvtXX together.
+# 9.13.13 (Fri Aug  9 01:16:17 EDT 1996):
+#	* Added dtterm entry from Solaris CDE.
+# 9.13.14 (Tue Sep 10 15:31:56 EDT 1996):
+#	* corrected pairs#8 typo in dtterm entry.
+#	* added tvi9065.
+# 9.13.15 (Sun Sep 15 02:47:05 EDT 1996):
+#	* updated xterm entry to cover 3.1.2E's new features.
+# 9.13.16 (Tue Sep 24 12:47:43 EDT 1996):
+#	* Added new minix entry
+#	* Removed aliases of the form ^[0-9]* for obsolete terminals.
+#	* Commented out linux-old, nobody's using pre-1.2 kernels now.
+# 9.13.17 (Fri Sep 27 13:25:38 EDT 1996):
+#	* Added Prism entries and kt7ix.
+#	* Caution notes about EWAN and tabset files.
+#	* Changed /usr/lib/tabset -> /usr/share/tabset.
+#	* Added acsc/rmacs/smacs to vt52.
+# 9.13.18 (Mon Oct 28 13:24:59 EST 1996):
+#	* Merged in Thomas Dickey's reorganization of the xterm entries;
+#	  added technical corrections to avoid warning messages.
+# 9.13.19 (Sat Nov 16 16:05:49 EST 1996):
+#	* Added rmso=\E[27m in Linux entry.
+#	* Added koi8-r support for Linux console.
+#	* Replace xterm entries with canonical ones from XFree86 3.2.
+# 9.13.20 (Sun Nov 17 23:02:51 EST 1996):
+#	* Added color_xterm from Jacob Mandelson
+# 9.13.21 (Mon Nov 18 12:43:42 EST 1996):
+#	* Back off the xterm entry to use r6 as a base.
+# 9.13.22 (Sat Nov 30 11:51:31 EST 1996):
+#	* Added dec-vt220 at Adrian Garside's request.
+#
+#-(original-changelog-1996/12/29-to-1998/02/28-by-TD)---------------------------
+#
+# 10.1.0 (Sun Dec 29 02:36:31 EST 1996): withdrawn
+#	* Minor corrections to xterm entries.
+#	* Replaced EWAN telnet entry.
+#	* Dropped the reorder script generator.  It was a fossil.
+# 9.13.23 (Fri Feb 21 16:36:06 EST 1997):
+#	* Replaced minitel-2 entry.
+#	* Added MGR, ansi-nt.
+# 9.13.24 (Sun Feb 23 20:55:23 EST 1997):
+#	* Thorsten Lockert added termcap `bs' to a lot of types, working from
+#	  the 4.4BSD Lite2 file.
+#
+# 10.1.1 (Sat May  3 21:41:27 EDT 1997):
+#	* Use setaf/setab consistently with SVr4.
+#	* Remove ech, el1 from cons25w, they do not work in FreeBSD 2.1.5
+# 10.1.2 (Sat May 24 21:10:57 EDT 1997)
+#	* update xterm-xf86-v32 to match XFree86 3.2A (changes F1-F4)
+#	* add xterm-16color, for XFree86 3.3
+# 10.1.3 (Sat May 31 12:21:05 EDT 1997)
+#	* correct typo in emu
+#	* correct typo in vt102-w (Robert Wuest)
+#	* make new entry xterm-xf86-v33, restored xterm-xf86-v32.
+# 10.1.4 (Sun Jun 15 08:29:05 EDT 1997)
+#	* remove ech capability from rxvt (it does the wrong thing)
+# 10.1.5 (Sat Jun 28 21:34:36 EDT 1997)
+#	* remove spurious newlines from several entries (hp+color, wy50,
+#	  wy350, wy370-nk, wy99gt-tek, wy370-tek, ibm3161, tek4205, ctrm,
+#	  gs6300)
+# 10.1.6 (Sat Jul  5 15:08:16 EDT 1997)
+#	* correct rmso capability of wy50-mc
+# 10.1.7 (Sat Jul 12 20:05:55 EDT 1997)
+#	* add cbt to xterm-xf86-v32
+#	* disentangle some entries from 'xterm', preferring xterm-r6 in case
+#	  'xterm' is derived from xterm-xf86-v32, which implements ech and
+#	  other capabilities not in xterm-r6.
+#	* remove alternate character set from kterm entry.
+# 10.1.8 (Sat Aug  2 18:43:18 EDT 1997)
+#	* correct acsc entries for ACS_LANTERN, which is 'i', not 'I'.
+# 10.1.9 (Sat Aug 23 17:54:38 EDT 1997)
+#	* add xterm-8bit entry.
+# 10.1.10 (Sat Oct  4 18:17:13 EDT 1997)
+#	* repair several places where early version of tic replaced \, with \\\,
+#	* make acsc entries canonical form (sorted, uniq).
+#	* modify acsc entries for linux, linux-koi8
+#	* new rxvt entry, from corrected copy of distribution in rxvt 2.21b
+#	* add color, mouse support to kterm.
+# 10.1.11 (Sat Oct 11 14:57:10 EDT 1997)
+#	* correct wy120 smxon/tbc capabilities which were stuck together.
+# 10.1.12 (Sat Oct 18 17:38:41 EDT 1997)
+#	* add entry for xterm-xf86-v39t
+# 10.1.13 (Sat Nov  8 13:43:33 EST 1997)
+#	* add u8,u9 to sun-il description
+# 10.1.14 (Sat Nov 22 19:59:03 EST 1997)
+#	* add vt220-js, pilot, rbcomm, datapoint entries from esr's 27-jun-97
+#	  version.
+#	* add hds200 description (Walter Skorski)
+#	* add EMX 0.9b descriptions
+#	* correct rmso/smso capabilities in wy30-mc and wy50-mc (Daniel Weaver)
+#	* rename xhpterm back to hpterm.
+# 10.1.15 (Sat Nov 29 19:21:59 EST 1997)
+#	* change initc in linux-c-nc to use 0..1000 range.
+# 10.1.16 (Sat Dec 13 19:41:59 EST 1997)
+#	* remove hpa/vpa from rxvt, which implements them incorrectly.
+#	* add sgr0 for rxvt.
+#	* remove bogus smacs/rmacs from EMX descriptions.
+# 10.1.17 (Sat Dec 20 17:54:10 EST 1997)
+#	* revised entry for att7300
+# 10.1.18 (Sat Jan  3 17:58:49 EST 1998)
+#	* use \0 rather than \200.
+#	* rename rxvt-color to rxvt to match rxvt 2.4.5 distribution.
+# 10.1.19 (Sat Jan 17 14:24:57 EST 1998)
+#	* change xterm (xterm-xf86-v40), xterm-8bit rs1 to use hard reset.
+#	* rename xterm-xf86-v39t to xterm-xf86-v40
+#	* remove bold/underline from sun console entries since they're not
+#	  implemented.
+# 10.1.20 (Sat Jan 24 11:02:51 EST 1998)
+#	* add beterm entry (Fred Fish)
+#	* add irix-color/xwsh entry.
+#	* turn ncv off for linux.
+# 10.1.21 (Sat Jan 31 17:39:16 EST 1998)
+#	* set ncv for FreeBSD console (treat colors with reverse specially).
+#	* remove sgr string from qnx based on report by Xiaodan Tang
+# 10.1.22 (Wed Feb 11 18:40:12 EST 1998)
+#	* remove spurious commas from descriptions
+#	* correct xterm-8bit to match XFree86 3.9Ad F1-F4.
+# 10.1.23 (Sat Feb 28 17:48:38 EST 1998)
+#	* add linux-koi8r to replace linux-koi8 (which uses a corrupt acsc,
+#	  apparently based on cp-866).
+#
+#-(replaced-changelog-1998/02/28-by-ESR)----------------------------------------
+#
+# 9.13.23 (Fri Feb 21 16:36:06 EST 1997):
+#	* Replaced minitel-2 entry.
+#	* Added MGR, ansi-nt.
+#	* Minor corrections to xterm entries.
+#	* Replaced EWAN telnet entry.
+#	* Dropped the reorder script generator.  It was a fossil.
+# 9.13.24 (Sun Feb 23 20:55:23 EST 1997):
+#	* Thorsten Lockert added termcap `bs' to a lot of types, working from
+#	  the 4.4BSD Lite2 file.
+# 9.13.25 (Fri Jun 20 12:33:36 EDT 1997):
+#	* Added Datapoint 8242, pilot, ansi_psx, rbcomm, vt220js.
+#	* Updated iris-ansi; corrected vt102-w.
+#	* Switch base xterm entry to 3.3 level.
+# 9.13.26 (Mon Jun 30 22:45:45 EDT 1997)
+#	* Added basic4.
+#	* Removed rmir/smir from tv92B.
+#
+# 10.2.0 (Sat Feb 28 12:47:36 EST 1998):
+#	* add hds200 description (Walter Skorski)
+#	* add beterm entry (Fred Fish)
+#	* add Thomas Dickey's xterm-xf86-v40, xterm-8bit, xterm-16color,
+#	  iris-color entries.
+#	* add emx entries.
+#	* Replaced unixpc entry with Benjamin Sittler's corrected version.
+#	* Replaced xterm/rxvt/emu/syscons entries with Thomas Dickey's
+#	  versions.
+#	* remove sgr string from qnx based on report by Xiaodan Tang
+#	* Added u8/u9, removed rmul/smul from sun-il.
+#	* 4.2 tic displays \0 rather than \200.
+#	* add linux-koi8r to replace linux-koi8 (which uses a corrupt acsc,
+#	  apparently based on cp-866).
+#	* Merged in Pavel Roskin's acsc for linux-koi8
+#	* Corrected some erroneous \\'s to \.
+#	* 4.2 ncurses has been changed to use setaf/setab, consistent w/SysV.
+#	* II -> ii in pcvtXX, screen, xterm.
+#	* Removed \n chars following ANSI escapes in sgr & friends.
+#	* Updated Wyse entries.
+#	* h19 corrections from Tim Pierce.
+#	* Noted that the dm2500 has both ich and smir.
+#	* added pccons for the Alpha under OSF/1.
+#	* Added Sony NEWS workstation entries and cit101e-rv.
+#	* Reverted `amiga'; to Kent Polk's version, as I'm told
+#	  the Verkuil entry messes up with Amiga Telnet.
+# 10.2.1 (Sun Mar  8 18:32:04 EST 1998):
+#	* Corrected attributions in 10.2.0 release notes.
+#	* Scanned the Shuford archive for new terminfos and information.
+#	* Removed sgr from qnx entry (Thomas Dickey).
+#	* Added entries for ICL and Kokusai Data Systems terminals.
+#	* Incorporated NCR terminfos from the Boundless Technology FTP site.
+#	* Incorporated att700 from the Boundless Technology FTP site.
+#	* Miscellaneous contact-address and Web-page updates.
+#
+#-(changelog-beginning-ncurses-4.2)---------------------------------------------
+#
+# 1998/5/9
+#	* add nxterm and xterm-color terminfo description (request by Cristian
+#	  Gafton <gafton@redhat.com>).
+#	* modify rxvt terminfo description to clear alternate screen before
+#	  switching back to normal screen, for compatibility with applications
+#	  which use xterm (reported by Manoj Kasichainula <manojk@io.com>).
+#	* modify linux terminfo description to reset color palette (reported
+#	  by Telford Tendys <telford@eng.uts.edu.au>).
+#
+# 1998/7/4
+#	* merge changes from current XFree86 xterm terminfo descriptions.
+#
+# 1998/7/25
+#	* Added minitel1 entries from Alexander Montaron.
+#	* Added qnxt2 from Federico Bianchi.
+#	* Added arm100 terminfo entries from Dave Millen.
+#
+# 1998/8/6
+#	* Added ncsa telnet entries from Francesco Potorti
+#
+# 1998/8/15
+#	* modify ncsa telnet entry to reflect color, other capabilities based on
+#	  examination of the source code - T.Dickey.
+#
+# 1998/8/22
+#	* Corrected some erroneous \\'s to \ (eterm, osborne) - TD.
+#
+# 1998/8/29
+#	* Added Francesco Potorti's tuned Wyse 99 entries.
+#	* dtterm enacs correction from Alexander V. Lukyanov.
+#	* Add ncsa-ns, ncsa-m-ns and ncsa-m entries from esr version.
+#	* correct a typo in icl6404 entry.
+#	* add xtermm and xtermc
+#
+# 1998/9/26
+#	* format most %'char' sequences to %{number}
+#	* adapt IBM AIX 3.2.5 terminfo - T.Dickey
+#	* merge Data General terminfo from Hasufin <hasufin@vidnet.net> - TD
+#
+# 1998/10/10
+#	* update xterm-xfree86 to current (xterm patch #84), for is2/rs2 changes - TD
+#	* correct initialization string in xterm-r5, add misc other features
+#	  to correspond with xterm patch #84 - TD
+#
+# 1998/12/19
+#	* update xterm-xfree86 to current (xterm patch #90), smcur/rmcur changes - TD
+#	* add Mathew Vernon's mach console entries
+#	* corrections for ncsa function-keys (report by Larry Virden)
+#
+# 1998/12/19
+#	* change linux to use ncv#2, since underline does not work with color - TD
+#
+# 1999/1/9
+#	* add kbt to iris-ansi, document other shift/control functionkeys - TD
+#	* correct iris-ansi and iris-ansi-ap with respect to normal vs keypad
+#	  application modes, change kent to use the correct keypad code - TD
+#
+# 1999/1/10
+#	* add entry for Tera Term - TD
+#
+# 1999/1/23
+#	* minor improvements for teraterm entry - TD
+#	* rename several entries used by BSDI: bsdos to bsdos-pc-nobold,
+#	  and bsdos-bold to bsdos-pc (Jeffrey C Honig)
+#
+# 1999/2/20
+#	* resolve ambiguity of kend/kll/kslt and khome/kfnd/kich1 strings in
+#	  xterm and ncsa entries by removing the unneeded ones.  Note that
+#	  some entries will return kend & khome versus kslt and kfnd, for
+#	  PC-style keyboards versus strict vt220 compatibility - TD
+#
+# 1999/3/13
+#	* adjust xterm-xfree86 khome/kend to match default PC-style keyboard
+#	  tables - TD
+#	* add 'crt' entry - TD
+#	* correct typos in 'linux-c' entry - TD
+#
+# 1999/3/14
+#	* update entries for BSD/OS console to use klone+sgr and klone+color
+#	  (Jeffrey C Honig)
+#
+# 1999/3/27
+#	* adjust xterm-xfree86 miscellaneous keypad keys, as per xterm patch #94 - TD.
+#
+# 1999/4/10
+#	* add linux-lat, from RedHat patches to ncurses 4.2
+#
+# 1999/4/17
+#	* add complete set of default function-key definitions for scoansi - TD.
+#
+# 1999/7/3
+#	* add cnorm, cvvis for Linux 2.2 kernels
+#
+# 1999/7/24
+#	* add kmous to xterm-r5 -TD
+#	* correct entries xterm+sl and xterm+sl-twm, which were missing the
+#	  parent "use" clause -TD
+#
+# 1999/7/31
+#	* corrected cnorm, added el1 in 'screen' description -TD
+#
+# 1999/8/14
+#	* add ms-vt100 -TD
+#
+# 1999/8/21
+#	* corrections to beterm entry -TD
+#
+# 1999/8/28
+#	* add cygwin entry -TD
+#
+# 1999/9/4
+#	* minor corrections for beterm entry -TD
+#
+# 1999/9/18
+#	* add acsc string to HP 70092 terminfo entry -Joerg Wunsch
+#
+# 1999/9/25
+#	* add amiga-8bit entry
+#	* add console entries from NetBSD: ofcons, wsvt25, wsvt25m, rcons,
+#	  rcons-color, based on
+#	  ftp://ftp.netbsd.org/pub/NetBSD/NetBSD-current/src/share/termcap/termcap.src
+#	* add alias for iris-ansi-net
+#
+# 1999/10/2
+#	* corrected scoansi entry's acsc, some function keys, add color -TD
+#
+# 1999/10/23
+#	* add cnorm, cvvis to cons25w, and modify ncv to add 'dim' -TD
+#	* reorder ncsa entries to make ncsa-vt220 use the alternate function
+#	  key mapping, leaving Potorti's entries more like he named them -TD
+#	* remove enter/exit am-mode from cygwin -TD
+#
+# 1999/10/30
+#	* correct typos in several entries (missing '[' from CSI):
+#	  mgr-sun, ncsa-m, vt320-k3, att505, avt-ns, as well as smir/rmir
+#	  strings for avt-ns -TD
+#	* add 'dim' to ncv mask for linux (report by Klaus Weide).
+#
+# 1999/11/27
+#	* correct kf1-kf4 in xterm-r6 which were vt100-style PF1-PF4 -TD
+#	* add hts to xterm-r6, and u6-u9 to xterm-r5 -TD
+#	* add xterm-88color and xterm-256color -TD
+#
+# 1999/12/4
+#	* add "obsolete" termcap strings -TD
+#	* add kvt and gnome entries -TD
+#
+# 1999/12/11
+#	* correct cup string for regent100 -TD
+#
+# 2000/1/1
+#	* update mach, add mach-color based on Debian diffs for ncurses 5.0 -TD
+#	* add entries for xterm-hp, xterm-vt220, xterm-vt52 and xterm-noapp -TD
+#	* change OTrs capabilities to rs2 -TD
+#	* add obsolete and extended capabilities to 'screen' -TD
+#
+# 2000/1/5
+#	* remove kf0 from rxvt, vt520, vt525 and ibm5151 since it conflicts
+#	  with kf10 -TD
+#	* updated xterm-xf86-v40, making kdch1 correspond to vt220 'Remove',
+#	  and adding kcbt -TD
+#
+# 2000/1/12
+#	* remove incorrect khome/kend from xterm-xf86-v333, which was based on
+#	  nonstandard resource settings -TD
+#
+# 2000/2/26
+#	* minor fixes for xterm-*, based on Debian #58530 -TD
+#
+# 2000/3/4
+#	* add several terminal types from esr's "11.0", as well as comments.
+#	  bq300*, dku7102-old, dku7202, hft, lft, pcmw, pmcons, tws*, vip*,
+#	  vt220-8bit, vt220-old, wy85-8bit
+#
+# 2000/3/18
+#	* add several terminal types from esr's "11.0.1" (ansi-*).
+#	* update OTxx capabilities for changes on 2000/3/4.
+#	* revert part of vt220 change (request by Todd C Miller for OpenBSD)
+#
+# 2000/3/26
+#	* move screen's AX extension to ecma+color, modify several entries to
+#	  use that, adjusting ncv as needed -TD
+#
+# 2000/4/8
+#	* add bsdos-pc-m, bsdos-pc-mono (Jeffrey C Honig)
+#	* correct spelling error in entry name: bq300-rv was given as bg300-rv
+#	  in esr's version.
+#
+# 2000/4/15
+#	* add cud, ech, etc., to beterm based on feedback from Rico Tudor -TD
+#	* correct color definition for ibm3164, make minor changes to other
+#	  IBM terminal definitions based on recent terminfo descriptions -TD
+#
+# 2000/4/22
+#	* add mgterm, from NetBSD -TD
+#	* add alias sun-cgsix for sun-ss5 as per NetBSD
+#	* change cons25w to use rs2 for reset rather than rs1 -TD
+#	* add rc/sc to aixterm based on manpage -TD
+#
+# 2000/5/13
+#	* remove ncv from xterm-16color, xterm-256color
+#
+# 2000/6/10
+#	* add kmous capability to linux to use Joerg Schoen's gpm patch.
+#
+# 2000/7/1
+#	* add Eterm (Michael Jennings)
+#
+# 2000-07-18
+#       * add amiga-vnc entry.
+#
+# 2000-08-12
+#	* correct description of Top Gun Telnet.
+#	* add kterm-color
+#
+# 2000-08-26
+#	* add qansi* entries from QNX ftp site.
+#
+# 2000-09-16
+#	* add Matrix Orbital entries by Eric Z. Ayers).
+#	* add xterm-basic, xterm-sco entries, update related entries to XFree86
+#	  4.0.1c -TD
+#
+# 2000-09-17
+#	* add S0, E0 extensions to screen's entry -TD
+#
+# 2000-09-23
+#	* several corrections based on tic's new parameter-checking code -TD
+#	* modify xterm-r6 and similar rs2 sequences which had \E7...\E8
+#	  bracketing sequences that reset video attributes (\E8 would restore
+#	  them) -TD
+#
+# 2000-11-11
+#	* rename cygwin to cygwinB19, adapt newer entry from Earnie Boyd -TD
+#
+# 2000-12-16
+#	* improved scoansi, based on SCO man-page, and testing console,
+#	  scoterm with tack -TD
+#
+# 2001-01-27
+#	* modify kterm to use acsc via SCS controls.
+#
+# 2001-02-10
+#	* screen 3.9.8 allows xterm mouse controls to pass-through
+#
+# 2001-03-11
+#	* remove spurious "%|" from some xterm entries.
+#
+# 2001-03-31
+#	* modify 'screen' khome/kend to match screen 3.09.08
+#	* add examples of 'screen' customization (screen.xterm-xfree86,
+#	  screen.xterm-r6, screen.teraterm) -TD
+#
+# 2001-04-14
+#	* correct definitions of shifted editing keys for xterm-xfree86 -TD
+#	* add "Apple_Terminal" entries -Benjamin Sittler
+#	* remove time-delays from "Apple_Terminal" entries -TD
+#	* make sgr entries time-delays consistent with individual caps -TD
+#
+# 2001-05-05
+#	* corrected/updated screen.xterm-xfree86
+#
+# 2001-05-19
+#	* ELKS descriptions, from Federico Bianchi
+#	* add u6 (CSR) to Eterm (Michael Jennings).
+#
+# 2001-07-21
+#	* renamed "Apple_Terminal" entries to "nsterm" to work with Solaris's
+#	  tic which handles names no longer than 14 characters.  Add
+#	  corresponding descriptions for the Darwin PowerPC console named
+#	  "xnuppc" -Benjamin Sittler
+#
+# 2001-09-01
+#	* change kbs in mach entries to ^? (Marcus Brinkmann).
+#
+# 2001-11-17
+#	* add "putty" entry -TD
+#	* updated "Apple_Terminal" entries -Benjamin Sittler
+#
+# 2001-11-24
+#	* add ms-vt100-color entry -TD
+#	* add "konsole" entries -TD
+#
+# 2001-12-08
+#	* update gnome entry to Redhat 7.2 -TD
+#
+# 2002-05-25
+#	* add kf13-kf48 strings to cons25w -TD
+#	* add pcvt25-color entry -TD
+#	* changed a few /usr/lib/tabset -> /usr/share/tabset.
+#	* improve some features of scoansi entry based on SCO's version -TD
+#	* add scoansi-new entry corresponding to OpenServer 5.0.6
+#
+# 2002-06-15
+#	* add kcbt to screen entry -TD
+#
+# 2002-06-22
+#	* add rxvt-16color, ibm+16color, mvterm entries -TD
+#
+# 2002-09-28
+#	* split out linux-basic entry, making linux-c inherit from that, and
+#	  in turn linux (with cnorm, etc) inherit from linux-c-nc to reflect
+#	  the history of this console type -TD
+#	* scaled the linux-c terminfo entry to match linux-c-nc, i.e., the
+#	  r/g/b parameters of initc are in the range 0 to 1000 -TD
+#
+# 2002-10-05
+#	* minor fix for scale-factor of linux-c and linux-c-nc -TD
+#
+# 2002-11-09
+#	* split-out vt100+keypad and vt220+keypad, fix interchanged ka3/kb2
+#	  in the latter -TD
+#
+# 2002-11-16
+#	* add entries for mterm (mterm, mterm-ansi, decansi) -TD
+#	* ncr260wy350pp has only 16 color pairs -TD
+#	* add sun-type4 from NetBSD -TD
+#	* update xterm-xfree86 to current (xterm patch #170) -TD
+#	* add screen-bce, screen-s entries -TD
+#	* add xterm-1002, xterm-1003 entries -TD
+#
+# 2003-01-11
+#	* update homepage for Top Gun Telnet/SSH
+#
+# 2003-01-25
+#	* reduce duplication in emx entries, added emx-base -TD
+#
+# 2003-05-24
+#	* corrected acs for screen.teraterm -TD
+#	* add tkterm entry -TD
+#
+# 2003-07-15
+#	* cygwin changes from Charles Wilson:
+#	  misc/terminfo.src (nxterm|xterm-color): make xterm-color
+#	  primary instead of nxterm, to match XFree86's xterm.terminfo
+#	  usage and to prevent circular links.
+#	  (rxvt): add additional codes from rxvt.org.
+#	  (rxvt-color): new alias
+#	  (rxvt-xpm): new alias
+#	  (rxvt-cygwin): like rxvt, but with special acsc codes.
+#	  (rxvt-cygwin-native): ditto.  rxvt may be run under XWindows, or
+#	  with a "native" MSWin GUI.  Each takes different acsc codes,
+#	  which are both different from the "normal" rxvt's acsc.
+#	  (cygwin): cygwin-in-cmd.exe window.  Lots of fixes.
+#	  (cygwinDBG): ditto.
+#
+# 2003-09-27
+#	* update gnome terminal entries -TD
+#
+# 2003-10-04
+#	* add entries for djgpp 2.03 and 2.04 -TD
+#
+# 2003-10-25
+#	* add alias for vtnt -TD
+#	* update xterm-xfree86 for XFree86 4.4 -TD
+#
+# 2003-11-22
+#	* add linux-vt (Andrey V Lukyanov)
+#
+# 2003-12-20
+#	* add screen.linux -TD
+#
+# 2004-01-10
+#	* revised/improved entries for tvi912b, tvi920b (Benjamin Sittler)
+#
+# 2004-01-17
+#	* add OpenNT/Interix/SFU entries (Federico Bianchi)
+#	* add vt100+ and vt-utf8 entries -TD
+#	* add uwin entry -TD
+#
+# 2004-03-27
+#	* add sgr strings to several common entries lacking them, e.g.,
+#	  screen, to make the entries more portable -TD
+#	* remove cvvis from rxvt entry, since it is the same as cnorm -TD
+#	* similar fixups for cvvis/cnorm various entries -TD
+#
+# 2004-05-22
+#	* remove 'ncv' from xterm-256color (xterm patch #188) -TD
+#
+# 2004-06-26
+#	* add mlterm -TD
+#	* add xterm-xf86-v44 -TD
+#	* modify xterm-new aka xterm-xfree86 to accommodate luit, which relies
+#	  on G1 being used via an ISO-2022 escape sequence (report by
+#	  Juliusz Chroboczek) -TD
+#	* add 'hurd' entry -TD
+#
+# 2004-07-03
+#	* make xterm-xf86-v43 derived from xterm-xf86-v40 rather than
+#	  xterm-basic -TD
+#	* align with xterm #192's use of xterm-new -TD
+#	* update xterm-new and xterm-8bit for cvvis/cnorm strings -TD
+#	* make xterm-new the default "xterm" -TD
+#
+# 2004-07-10
+#	* minor fixes for emu -TD
+#	* add emu-220
+#	* add rmam/smam to linux (Trevor Van Bremen)
+#	* change wyse acsc strings to use 'i' map rather than 'I' -TD
+#	* fixes for avatar0 -TD
+#	* fixes for vp3a+ -TD
+#
+# 2004-07-17
+#	* add xterm-pc-fkeys -TD
+#	* review/update gnome and gnome-rh90 entries (prompted by
+#	  Redhat Bugzilla #122815) -TD
+#	* review/update konsole entries -TD
+#	* add sgr, correct sgr0 for kterm and mlterm -TD
+#	* correct tsl string in kterm -TD
+#
+# 2004-07-24
+#	* make ncsa-m rmacs/smacs consistent with sgr -TD
+#	* add sgr, rc/sc and ech to syscons entries -TD
+#	* add function-keys to decansi -TD
+#	* add sgr to mterm-ansi -TD
+#	* add sgr, civis, cnorm to emu -TD
+#	* correct/simplify cup in addrinfo -TD
+#	* corrections for gnome and konsole entries
+#	  (Redhat Bugzilla #122815) -Hans de Goede
+#	* modify DEC entries (vt220, etc), to add sgr string, and to use
+#	  ISO-2022 strings for rmacs/smacs -TD
+#
+# 2004-07-31
+#	* rename xterm-pc-fkeys to xterm+pcfkeys -TD
+#
+# 2004-08-07
+#	* improved putty entry -Robert de Bath
+#
+# 2004-08-14
+#	* remove dch/dch1 from rxvt because they are implemented inconsistently
+#	  with the common usage of bce/ech -TD
+#	* remove khome from vt220 (vt220's have no home key) -TD
+#	* add rxvt+pcfkeys -TD
+#
+# 2004-08-21
+#	* modify several entries to ensure xterm mouse and cursor visibility
+#	  are reset in rs2 string:  hurd, putty, gnome, konsole-base, mlterm,
+#	  Eterm, screen.  (The xterm entries are left alone - old ones for
+#	  compatibility, and the new ones do not require this change) -TD
+#
+# 2004-08-28
+#	* add morphos entry -Pavel Fedin
+#	* modify amiga-8bit to add khome/kend/knp/kpp -Pavel Fedin
+#	* corrected \E[5?l to \E[?5l in vt320 entries -TD
+#
+# 2004-11-20
+#	* update wsvt25 entry -TD
+#
+# 2005-01-29
+#	* update pairs for xterm-88color and xterm-256color to reflect the
+#	  ncurses extended-color support -TD
+#
+# 2005-02-26
+#	* modify sgr/sgr0 in xterm-new to improve tgetent's derived "me" -TD
+#	* add aixterm-16color to demonstrate 16-color capability -TD
+#
+# 2005-04-23
+#	* add media-copy to vt100 -TD
+#	* corrected acsc string for vt52 -TD
+#
+# 2005-04-30
+#	* add kUP, kDN (user-defined shifted up/down arrow) definitions for
+#	  xterm-new -TD
+#	* add kUP5, kUP6, etc., for xterm-new and rxvt -TD
+#
+# 2005-05-07
+#	* re-corrected acsc string for vt52 -TD
+#
+# 2005-05-28
+#	* corrected sun-il sgr string which referred to bold and underline -TD
+#	* add sun-color entry -TD
+#
+# 2005-07-23
+#	* modify sgr0 in several entries to reset alternate-charset as in the
+#	  sgr string -TD
+#	* modify sgr string of prism9 to better match the individual
+#	  attributes -TD
+#
+# 2005-10-15
+#	* correct order of use= in rxvt-basic -TD
+#
+# 2005-10-26
+#	* use kind/kri as shifted up/down cursor keys for xterm-new -TD
+#
+# 2005-11-12
+#	* other minor fixes to cygwin based on tack -TD
+#	* correct smacs in cygwin (report by Baurzhan Ismagulov).
+#
+# 2006-02-18
+#	* add nsterm-16color entry -TD
+#	* remove ncv flag from xterm-16color -TD
+#	* remove setf/setb from xterm-256color to match xterm #209 -TD
+#	* update mlterm entry to 2.9.2 -TD
+#
+# 2006-02-25
+#	* fixes to make nsterm-16color match report
+#	  by Christian Ebert -Alain Bench
+#
+# 2006-04-22
+#	* add xterm+256color building block -TD
+#	* add gnome-256color, putty-256color, rxvt-256color -TD
+#
+# 2006-05-06
+#	* add hpterm-color -TD
+#
+# 2006-06-24
+#	* add xterm+pcc0, xterm+pcc1, xterm+pcc2, xterm+pcc3 -TD
+#	* add gnome-fc5 (prompted by GenToo #122566) -TD
+#	* remove obsolete/misleading comments about kcbt on Linux -Alain Bench
+#	* improve xterm-256color by combining the ibm+16color setaf/setab
+#	  strings with SGR 48.  The setf/setb strings also are cancelled here
+#	  rather than omitted so derived entries will cancel those also -Alain
+#	  Bench
+#
+# 2006-07-01
+#	* add some notes regarding copyright to terminfo.src -TD
+#	* use rxvt+pcfkeys in Eterm -TD
+#	* remove km and flash from gnome, Eterm and rxvt since they do not work
+#	  as one would expect (km sends ESC rather than setting the 8th bit
+#	  of the key) -TD
+#	* add/use ansi+enq, vt100+enq and vt102+enq -TD
+#	* add konsole-solaris -TD
+#
+# 2006-07-22
+#	* update xterm-sun and xterm-sco entries to match xterm #216 -TD
+#	* modify is2/rs2 strings for xterm-r6 as per fix in xterm #148 -TD
+#	* modify xterm-24 to inherit from "xterm" -TD
+#	* add xiterm entry -TD
+#	* add putty-vt100 entry -TD
+#	* corrected spelling of Michael A Dorman's name, prompted by
+#	  http://www.advogato.org/person/mdorman/diary.html -TD
+#
+# 2006-08-05
+#	* add xterm+pcf0, xterm+pcf2 from xterm #216 -TD
+#	* update xterm+pcfkeys to match xterm #216 -TD
+#
+# 2006-08-17
+#	* make descriptions of xterm entries consistent with its terminfo -TD
+#
+# 2006-08-26
+#	* add xfce, mgt -TD
+#
+# 2006-09-02
+#	* correct acsc string in kterm -TD
+#
+# 2006-09-09
+#	* add kon entry -TD
+#	* remove invis from linux and related entries, add klone+sgr8 for those
+#	  that implement the feature (or have not been shown to lack it) -TD
+#
+# 2006-09-23
+#	* add ka2, kb1, kb3, kc2 to vt220-keypad as an extension -TD
+#	* minor improvements to rxvt+pcfkeys -TD
+#
+# 2006-09-30
+#	* fix a few typos in if/then/else expressions -TD
+#
+# 2006-10-07
+#	* add several GNU Screen variations with 16- and 256-colors, and
+#	  status line (Alain Bench).
+#
+# 2007-03-03
+#	* add Newbury Data entries (Jean-Charles Billaud).
+#
+# 2007-06-10
+#	* corrected xterm+pcf2 modifiers for F1-F4, match xterm #226 -TD
+#
+# 2007-07-14
+#	* restore section of pre-ncurses-4.2 changelog to fix attribution -TD
+#	* add konsole-256color entry -TD
+#
+# 2007-08-18
+#	* add 9term entry (request by Juhapekka Tolvanen) -TD
+#
+# 2007-10-13
+#	* correct kIC in rxvt+pcfkeys (prompted by Debian #446444) -TD
+#	* add shift-control- and control-modified keys for rxvt editing
+#	  keypad -TD
+#	* update mlterm entry to 2.9.3 -TD
+#	* add mlterm+pcfkeys -TD
+#
+# 2007-10-20
+#	* move kLFT, kRIT, kind and kri capabilities from xterm-new to
+#	  xterm+pcc0, etc., to make the corresponding building blocks reflect
+#	  xterm's capabilities -TD
+#	* add mrxvt entry -TD
+#	* add xterm+r6f2, use in mlterm and mrxvt entries -TD
+#
+# 2007-11-03
+#	* correct acsc strings for h19 and z100 (Benjamin Sittler)
+#
+# 2007-11-11
+#	* use xterm-xf86-v44 for "xterm-xfree86", reflecting changes to
+#	  xterm starting with xterm patch #216 -TD
+#	* make legacy xterm entries such as xterm-24 inherit from xterm-old,
+#	  to match xterm #230 -TD
+#	* extend xterm+pccX entries to match xterm #230 -TD
+#	* add xterm+app, xterm+noapp, from xterm #230 -TD
+#	* add/use xterm+pce2 from xterm #230, in xterm+pcfkeys -TD
+#
+# 2008-04-19
+#	* add screen.rxvt -TD
+#
+# 2008-04-28
+#	* add screen+fkeys (prompted by Debian #478094) -TD
+#
+# 2008-06-28
+#	* add screen.mlterm -TD
+#	* improve mlterm and mlterm+pcfkeys -TD
+#
+# 2008-08-23
+#	* add Eterm-256color, Eterm-88color -TD
+#	* add rxvt-88color -TD
+#
+# 2008-10-12
+#	* add teraterm4.59 entry, use that as primary teraterm entry, rename
+#	  original to teraterm2.3 -TD
+#	* update "gnome" to 2.22.3 -TD
+#	* update "konsole" to 1.6.6 -TD
+#	* add "aterm" -TD
+#	* add "linux2.6.26" -TD
+#
+# 2008-11-15
+#	* change several \E[2g (clear tab at current column) to \E[3g
+#	  (clear all tabs) to match definition for tbc capability -TD
+#
+# 2008-11-29
+#	* add eterm-color -TD
+#
+# 2009-01-10
+#	* add screen.Eterm -TD
+#
+# 2009-03-28
+#	* correct typo in pfkey of ansi.sys-old
+#	  (report by Kalle Olavi Niemitalo)
+#	* move function- and cursor-keys from emx-base to ansi.sys, and create
+#	  a pfkey capability which handles F1-F48 -TD
+#
+# 2009-05-02
+#	* add vwmterm entry (Bryan Christ)
+#
+# 2009-09-19
+#	* change ncv and op capabilities in sun-color to match Sun's entry for
+#	  this (report by Laszlo Peter)
+#	* improve interix smso by using reverse rather than bold (report by
+#	  Kristof Zelechovski).
+#
+# 2009-10-03
+#	* remove unnecessary kcan assignment to ^C from putty (Sven Joachim)
+#	* add linux-16color (Benjamin Sittler)
+#	* correct initc capability of linux-c-nc end-of-range (Benjamin Sittler)
+#	* similar change for dg+ccc and dgunix+ccc (Benjamin Sittler)
+#	* add ccc and initc capabilities to xterm-16color -TD
+#
+# 2009-10-31
+#	* updated nsterm* entries (Benjamin Sittler, prompted by GenToo #206201)
+#
+# 2009-12-12
+#	* updated nsterm* entries (Benjamin Sittler, Emanuele Giaquinta)
+#
+# 2009-12-19
+#	* add bw (auto-left-margin) to nsterm* entries (Benjamin Sittler)
+#	* rename minix to minix-1.7, add minix entry for Minix3 -TD
+#
+# 2009-12-26
+#	* add bterm (bogl 0.1.18) -TD
+#	* minor fix to rxvt+pcfkeys -TD
+#
+# 2010-02-06
+#	* update mrxvt to 0.5.4, add mrxvt-256color -TD
+#
+# 2010-02-13
+#	* add several screen-bce.XXX entries -TD
+#
+# 2010-02-23
+#	* modify screen-bce.XXX entries to exclude ech, since screen's color
+#	  model does not clear with color for that feature -TD
+#
+# 2010-03-20
+#	* rename atari and st52 to atari-old, st52-old, use newer entries from
+#	  FreeMiNT by Guido Flohr (from patch/report by Alan Hourihane).
+#
+# 2010-06-12
+#	* add mlterm-256color entry -TD
+#
+# 2010-07-17
+#	* add hard-reset for rs2 to wsvt25 to help ensure that reset ends
+#	  the alternate character set (patch by Nicholas Marriott)
+#
+# 2010-08-28
+#	* improve acsc for vt52 (Benjamin Sittler)
+#	* modify nsterm entries for consistent sgr/sgr0 -TD
+#	* modify xnuppc entries for consistent sgr/sgr0 -TD
+#	* add invis to tek4115 sgr -TD
+#
+# 2010-09-11
+#	* reformat acsc strings to canonical format -TD
+#
+# 2010-09-25
+#	* add "XT" capability to entries for terminals that support both
+#	  xterm-style mouse- and title-controls, for "screen" which
+#	  special-cases TERM beginning with "xterm" or "rxvt" -TD
+#
+# 2010-10-02
+#	* fill in no-parameter forms of cursor-movement where a parameterized
+#	  form is available -TD
+#	* fill in missing cursor controls where the form of the controls is
+#	  ANSI -TD
+#	* add parameterized cursor-controls to linux-basic (report by Dae) -TD
+#
+# 2010-10-09
+#	* correct comparison used for setting 16-colors in linux-16color
+#	  entry (Novell #644831) -TD
+#	* improve linux-16color entry, using "dim" for color-8 which makes it
+#	  gray rather than black like color-0 -TD
+#
+# 2010-11-20
+#	* make "vte" the principal entry defining "gnome", since GNOME terminal
+#	  is merely one of several terminals whose behavior is provided by this
+#	  library -TD
+#
+# 2010-11-27
+#	* fix typo in rmso for tek4106 -Goran Weinholt
+#
+# 2010-12-11
+#	* suppress ncv in screen entry, allowing underline -Alejandro R. Sedeno
+#	* also suppress ncv in konsole-base -TD
+#
+# 2011-02-05
+#	* add U8 feature to denote entries for terminal emulators which do not
+#	  support VT100 SI/SO when processing UTF-8 encoding -TD
+#	* add xterm-utf8 as a demo of the U8 feature -TD
+#
+# 2011-02-20
+#	* add cons25-debian entry (Brian M Carlson, Debian #607662).
+#
+# 2011-06-11
+#	* update minix entry to minix 3.2 (Thomas Cort).
+#
+# 2011-07-09
+#	* fix inconsistent tabset path in pcmw (Todd C. Miller).
+#	* remove a backslash which continued comment, obscuring altos3
+#	  definition with OpenBSD toolset (Nicholas Marriott).
+#
+# 2011-07-16
+#	* add/use xterm+tmux chunk from xterm #271 -TD
+#	* resync xterm-new entry from xterm #271 -TD
+#	* add E3 extended capability to linux-basic (Miroslav Lichvar)
+#	* add linux2.2, linux2.6, linux3.0 entries to give context for E3 -TD
+#	* add SI/SO change to linux2.6 entry (Debian #515609) -TD
+#
+# 2011-07-21
+#	* add kich1 to sun (Yuri Pankov)
+#	* use bold rather than reverse for smso in sun-color (Yuri Pankov).
+#
+# 2011-08-06
+#	* corrected k9 in dg460-ansi, add other features based on manuals -TD
+#
+# 2011-08-20
+#	* minor cleanup of X-terminal emulator section -TD
+#	* add terminator entry -TD
+#	* add simpleterm entry -TD
+#
+# 2011-09-10
+#	* add xterm+kbs fragment from xterm #272 -TD
+#
+# 2011-11-12
+#	* add pccon entries for OpenBSD console (Alexei Malinin)
+#
+# 2011-12-17
+#	* corrected old changelog comments -TD
+#
+# 2011-11-24
+#	* add putty-sco -TD
+#
+# 2012-01-28
+#	* add mach-gnu (Samuel Thibault)
+#	* add mach-gnu-color, tweaks to mach-gnu -TD
+#	* make sgr for sun-color agree with smso -TD
+#	* make sgr for prism9 agree with other caps -TD
+#	* make sgr for icl6404 agree with other caps -TD
+#	* make sgr for ofcons agree with other caps -TD
+#	* make sgr for att5410v1, att4415, att620 agree with other caps -TD
+#	* make sgr for aaa-unk, aaa-rv agree with other caps -TD
+#	* make sgr for avt-ns agree with other caps -TD
+#
+# 2012-02-11
+#	* make sgr for xterm-pcolor agree with other caps -TD
+#	* make sgr for att5425 agree with other caps -TD
+#	* make sgr for att630 agree with other caps -TD
+#	* make sgr for linux entries agree with other caps -TD
+#	* make sgr for tvi9065 agree with other caps -TD
+#	* make sgr for ncr260vt200an agree with other caps -TD
+#	* make sgr for ncr160vt100pp agree with other caps -TD
+#	* make sgr for ncr260vt300an agree with other caps -TD
+#	* make sgr for aaa-60-dec-rv, aaa+dec agree with other caps -TD
+#	* make sgr for cygwin, cygwinDBG agree with other caps -TD
+#
+# 2012-03-31
+#	* correct order of use-clauses in st-256color -TD
+#
+# 2012-04-01
+#	* revert 2011-07-16 change to "linux" alias, return to "linux2.2" -TD
+#
+# 2012-04-14
+#	* document all of the user-defined capabilities in one place -TD
+#	* add XT to some places to improve usefulness for other applications
+#	  than screen, which would like to pretend that xterm's title is
+#	  a status-line. -TD
+#	* change use-clauses in ansi-mtabs, hp2626, and hp2622 based on review
+#	  of ordering and overrides -TD
+#
+# 2012-04-21
+#	* add msgr to vt420, similar DEC vtXXX entries -TD
+#	* add several missing vt420 capabilities from vt220 -TD
+#	* factor out ansi+pp from several entries -TD
+#	* change xterm+sl and xterm+sl-twm to include only the status-line
+#	  capabilities and not "use=xterm", making them more generally useful
+#	  as building-blocks -TD
+#	* add dec+sl building block, as example -TD
+#
+# 2012-04-28
+#	* fix some inconsistencies between vt320/vt420, e.g., cnorm/civis -TD
+#	* add eslok flag to dec+sl -TD
+#	* dec+sl applies to vt320 and up -TD
+#	* drop wsl width from xterm+sl -TD
+#	* reuse xterm+sl in putty and nsca-m -TD
+#	* add ansi+tabs to vt520 -TD
+#	* add ansi+enq to vt220-vt520 -TD
+#
+# 2012-05-05
+#	* remove p6 (bold) from opus3n1+ for consistency -TD
+#	* remove acs stuff from env230 per clues in Ingres termcap -TD
+#	* modify env230 sgr/sgr0 to match other capabilities -TD
+#	* modify smacs/rmacs in bq300-8 to match sgr/sgr0 -TD
+#	* make sgr for dku7202 agree with other caps -TD
+#	* make sgr for ibmpc agree with other caps -TD
+#	* make sgr for tek4107 agree with other caps -TD
+#	* make sgr for ndr9500 agree with other caps -TD
+#	* make sgr for sco-ansi agree with other caps -TD
+#	* make sgr for d410 agree with other caps -TD
+#	* make sgr for d210 agree with other caps -TD
+#	* make sgr for d470c, d470c-7b agree with other caps -TD
+#
+# 2012-05-12
+#	* rewrite vt520 entry based on vt420 -TD
+#	* corrected 'op' for bterm (report by Samuel Thibault) -TD
+#
+# 2012-06-02
+#	* add kdch1 to wsvt25 entry from NetBSD CVS (reported by David Lord,
+#	  analysis by Martin Husemann).
+#	* add cnorm/civis to wsvt25 entry from NetBSD CVS (report/analysis by
+#	  Onno van der Linden).
+#	* add kdch1 aka "Remove" to vt220 and vt220-8 entries -TD
+#	* add kdch1, etc., to qvt108 -TD
+#	* add dl1/il1 to some entries based on dl/il values -TD
+#	* add dl to simpleterm -TD
+#
+# 2012-06-10
+#	* modify some older xterm entries to align with xterm source -TD
+#	* separate "xterm-old" alias from "xterm-r6" -TD
+#
+# 2012-07-28
+#	* add E3 to xterm-basic and putty -TD
+#
+# 2012-08-11
+#	* add nsterm-256color, make this the default nsterm -TD
+#	* remove bw from nsterm-bce, per testing with tack -TD
+#
+# 2012-10-12
+#       * add vte-2012, gnome-2012, making these the defaults for vte/gnome
+#	  (patch by Christian Persch).
+#
+# 2012-11-02
+#	* reviewed vte-2012, reverted most of the change since it was incorrect
+#	  based on testing with tack -TD
+#	* un-cancel the initc in vte-256color, since this was implemented
+#	  starting with version 0.20 in 2009 -TD
+#
+# 2013-03-16
+#	* correct typo in sgr string for sun-color,
+#	  add bold for consistency with sgr,
+#	  change smso for consistency with sgr -TD
+#	* correct typo in sgr string for terminator -TD
+#	* add blink to the attributes masked by ncv in linux-16color (report
+#	  by Benjamin Sittler)
+#
+# 2013-03-23
+#	* change initialization for vt220, similar entries for consistency
+#	  with cursor-key strings (NetBSD #47674) -TD
+#	* further improvements to linux-16color (Benjamin Sittler)
+#
+# 2013-05-11
+#	* move nsterm-related entries out of "obsolete" section to more
+#	  plausible "ansi consoles" -TD
+#	* additional cleanup of table-of-contents by reordering -TD
+#
+# 2013-06-07
+#	* added note to clarify Terminal.app's non-emulation of the various
+#	  terminal types listed in the preferences dialog -TD
+#
+# 2013-11-02
+#	* use TS extension to describe xterm's title-escapes -TD
+#	* modify terminator and nsterm-s to use xterm+sl-twm building block -TD
+#	* update hurd.ti, add xenl to reflect 2011-03-06 change in
+#	  http://git.savannah.gnu.org/cgit/hurd/hurd.git/log/console/display.c
+#	  (Debian #727119).
+#	* simplify pfkey expression in ansi.sys -TD
+#
+# 2013-11-10
+#	* split-out building blocks xterm+sm+1002 and xterm+sm+1003 -TD
+#
+# 2014-02-22
+#	* updated notes for wsvt25 based on tack and vttest -TD
+#	* add teken entry to show actual properties of FreeBSD's "xterm"
+#	  console -TD
+#
+# 2014-03-22
+#	* add terminology entry -TD
+#	* add mlterm3 entry, use that as "mlterm" -TD
+#	* inherit mlterm-256color from mlterm -TD
+#
+# 2014-03-23
+#	* fix typo in "mlterm" entry (report by Gabriele Balducci) -TD
+#
+# 2014-03-30
+#	* cancel ccc in putty-256color and konsole-256color for consistency
+#	  with the cancelled initc capability (patch by Sven Zuhlsdorf).
+#	* add xterm+256setaf building block for various terminals which only
+#	  get the 256-color feature half-implemented -TD
+#	* updated "st" entry (leaving the 0.1.1 version as "simpleterm") to
+#	  0.4.1 -TD
+#
+# 2014-05-03
+#	* add vt520ansi (Mike Gran)
+#
+# 2014-05-24
+#	* correct several entries which had termcap-style padding used in
+#	  terminfo: adm21, aj510, alto-h19, att605-pc, x820 -TD
+#	* correct syntax for padding in some entries: dg211, h19 -TD
+#	* correct ti924-8 which had confused padding versus octal escapes -TD
+#	* correct padding in sbi entry -TD
+#
+# 2014-06-07
+#	* update xterm-new to xterm patch #305 -TD
+#	+ change screen's smso to use SGR 7 (ECMA-80 reverse) rather than SGR 3
+#	  (italic).  This was a long-ago typo in screen 3.1.1 which was
+#	  overlooked until a few terminal emulators implemented the feature -TD
+#
+# 2014-06-09
+#	> fix regression in screen terminfo entries (reports by Christian
+#	  Ebert, Gabriele Balducci) -TD
+#	+ revert the change to screen; see notes for why this did not work -TD
+#	+ cancel sitm/ritm for entries which extend "screen", to work around
+#	  screen's hardcoded behavior for SGR 3 -TD
+#
+# 2014-06-14
+#	+ modify sgr for screen.xterm-new to support dim capability -TD
+#	+ add dim capability to nsterm+7 -TD
+#	+ cancel dim capability for iterm -TD
+#	+ add dim, invis capabilities to vte-2012 -TD
+#	+ add sitm/ritm to konsole-base and mlterm3 -TD
+#
+# 2014-10-06
+#	+ add xterm-1005 and xterm-1006 entries, with suggested extension
+#	  capability "xm" -TD
+#
+# 2014-10-07
+#	+ update test-report for mrxvt -TD
+#
+# 2014-10-11
+#	+ add xterm-x10mouse, xterm-x11mouse, etc. -TD
+#
+# 2014-10-18
+#	+ reviewed terminology 0.6.1, add function key definitions.  None of
+#	  the vt100-compatibility issues were improved -TD
+#
+# 2015-04-22
+#	+ add 'dim' capability to screen entry (report by Leonardo B Schenkel)
+#	+ add several key definitions to nsterm-bce to match preconfigured
+#	  keys, e.g., with OSX 10.9 and 10.10 (report by Leonardo B Schenkel)
+#
+# 2015-05-02
+#	+ remove unnecessary ';' from E3 capabilities -TD
+#	+ add tmux entry, derived from screen (patch by Nicholas Marriott).
+#	+ split-out recent change to nsterm-bce as nsterm-build326, and add
+#	  nsterm-build342 to reflect changes with successive releases of OSX
+#	  (discussion with Leonardo B Schenkel)
+#	+ add xon, ich1, il1 to ibm3161 (patch by Stephen Powell,
+#	  Debian #783806)
+#
+# 2015-05-17
+#	+ remove screen-bce.mlterm, since mlterm does not do "bce" -TD
+#	+ add several screen.XXX entries to support the respective variations
+#	  for 256 colors -TD
+#
+# 2015-05-23
+#	+ add putty+fnkeys* building-block entries -TD
+#
+# 2015-05-30
+#	+ remove spurious "%;" from st entry (report by Daniel Pitts) -TD
+#	+ add vte-2014, update vte to use that -TD
+#
+# 2015-06-27
+#	+ comment-out "screen.xterm" entry, and inherit screen.xterm-256color
+#	  from xterm-new (report by Richard Birkett) -TD
+#
+# 2015-07-25
+#	+ add status line to tmux via xterm+sl (patch by Nicholas Marriott).
+#	+ fixes for st 0.5 from testing with tack -TD
+#
+# 2015-10-24
+#	+ updated minitel entries to fix kel problem with emacs, and add
+#	  minitel1b-nb (Alexandre Montaron).
+#	+ reviewed/updated nsterm entry Terminal.app in OSX -TD
+#	+ replace some dead URLs in commands with equivalents from the
+#	  Internet Archive -TD
+#
+# 2015-11-14
+#	+ add bold to pccon+sgr+acs and pccon-base (Tati Chevron).
+#	+ add keys f12-f124 to pccon+keys (Tati Chevron).
+#
+# 2015-11-21
+#	+ fix some inconsistencies in the pccon* entries -TD
+#
+# 2015-11-28
+#	+ add viewdata (Alexandre Montaron).
+#
+# 2016-01-16
+#	+ tidy up comments about hardcoded 256color palette (report by
+#	  Leonardo Brondani Schenkel) -TD
+#	+ add putty-noapp entry, and amend putty entry to use application mode
+#	  for better consistency with xterm (report by Leonardo Brondani
+#	  Schenkel) -TD
+#
+# 2016-04-23
+#	+ add 'oc' capability to xterm+256color, allowing palette reset for
+#	  xterm -TD
+#
+# 2016-05-14
+#	+ modify linux2.6 entry to improve line-drawing -TD
+#	+ make linux3.0 entry the default linux entry (Debian #823658) -TD
+#
+# 2016-05-29
+#	+ modify rs1 for xterm-16color, xterm-88color and xterm-256color to
+#	  reset palette using "oc" string as in linux -TD
+#
+# 2016-06-11
+#	+ use ANSI reply for u8 in xterm-new, to reflect vt220-style responses
+#	  that could be returned -TD
+#	+ added a few capabilities fixed in recent vte -TD
+#
+# 2016-08-17
+#	+ correct a typo in interix -TD
+#
+# 2016-09-24
+#	+ updated minitel entries to use status line with screen(1), as well as
+#	  printing special G2 videotex chars like french accentuated glyph
+#	  using special cap XC= (patch by Alexandre Montaron).
+#
+# 2016-10-01
+#	+ add linux-m1 minitel entries (patch by Alexandre Montaron).
+#	+ correct rs2 string for vt100-nam -TD
+#
+# 2016-11-26
+#	+ modify linux-16color to not mask dim, standout or reverse with the
+#	  ncv capability -TD
+#	+ add 0.1sec mandatory delay to flash capabilities using the VT100
+#	  reverse-video control -TD
+#	+ omit selection of ISO-8859-1 for G0 in enacs capability from linux2.6
+#	  entry, to avoid conflict with the user-defined mapping.  The reset
+#	  feature will use ISO-8859-1 in any case (Mikulas Patocka).
+#
+# 2016-12-30
+#	+ merge current st description (report by Harry Gindi) -TD
+#
+# 2016-12-31
+#	+ modify flash capability for linux and wyse entries to put the delay
+#	  between the reverse/normal escapes rather than after -TD
+#
+# 2017-01-28
+#	+ minor comment-fixes to help automate links to bug-urls -TD
+#	+ add dvtm, dvtm-256color -TD
+#	+ add settings corresponding to xterm-keys option to tmux entry to
+#	  reflect upcoming change to make that option "on" by default
+#	  (patch by Nicholas Marriott).
+#	+ uncancel Ms in tmux entry (Harry Gindi, Nicholas Marriott).
+#	+ add dumb-emacs-ansi -TD
+#
+# 2017-03-05
+#	+ correct a few spelling errors in comments -TD
+#	+ add fbterm -TD
+#
+# 2017-03-11
+#	+ add vt100+4bsd building block, use that for older terminals rather
+#	  than "vt100" which is now mostly used as a building block for
+#	  terminal emulators -TD
+#	+ modify vt100 rs2 string to reset vt52 mode and scrolling regions
+#	  (report/analysis by Robert King) -TD
+#
+# 2017-04-01
+#	+ minor fixes for vt100+4bsd, e.g., delay in sgr for consistency -TD
+#	+ add smso for env230, to match sgr -TD
+#	+ remove p7/protect from sgr in fbterm -TD
+#	+ drop setf/setb from fbterm; setaf/setab are enough -TD
+#	+ make xterm-pcolor sgr consistent with other capabilities -TD
+#	+ add rmxx/smxx ECMA-48 strikeout extension to tmux and xterm-basic
+#	  (discussion with Nicholas Marriott)
+#
+# 2017-04-22
+#	+ correct missing comma-separator between string capabilities in
+#	  icl6402 and m2-nam -TD
+#	+ update formatting with ncurses 6.0.20170422 -TD
+#	+ restore rmir/smir in ansi+idc to better match original ansiterm+idc,
+#	  add alias ansiterm (report by Robert King).
+#
+# 2017-05-13
+#	+ reformatted using hexadecimal numbers to improve readability -TD
+#
+# 2017-07-29
+#	+ update interix entry using tack and SFU on Windows 7 Ultimate -TD
+#	+ use ^? for kdch1 in interix (reported by Jonathan de Boyne Pollard)
+#	+ add "rep" to xterm-new, available since 1997/01/26 -TD
+#	+ move SGR 24 and 27 from vte-2014 to vte-2012 (request by Alain
+#	  Williams) -TD
+#
+# 2017-08-16
+#	+ update "iterm" entry -TD
+#	+ add "iterm2" entry (report by Leonardo Brondani Schenkel) -TD
+#
+# 2017-08-18
+#	+ update notes on user-defined capabilities -TD
+#
+# 2017-08-26
+#	+ fixes for "iterm2" (report by Leonardo Brondani Schenkel) -TD
+#
+# 2017-11-11
+#	+ add "op" to xterm+256setaf -TD
+#	+ reviewed terminology 1.0.0 -TD
+#	+ reviewed st 0.7 -TD
+#
+# 2017-11-18
+#	+ modify old terminology entry and a few other terminal emulators to
+#	  account for xon -TD
+#	+ correct sgr string for tmux, which used screen's "standout" code
+#	  rather than the standard code (patch by Roman Kagan)
+#	+ correct sgr/sgr0 strings in a few other cases reported by tic, making
+#	  those correspond to the non-sgr settings where they differ, but
+#	  otherwise use ECMA-48 consistently:
+#	  jaixterm, aixterm, att5420_2, att4424, att500, decansi, d410-7b,
+#	  dm80, hpterm, emu-220, hp2, iTerm2.app, mterm-ansi, ncrvt100an,
+#	  st-0.7, vi603, vwmterm -TD
+#
+# 2017-12-30
+#	+ add xterm+noalt, xterm+titlestack, xterm+alt1049, xterm+alt+title
+#	  blocks from xterm #331 -TD
+#	+ add xterm+direct, xterm+indirect, xterm-direct entries from xterm
+#	  #331 -TD
+#	+ modify xterm+256color and xterm+256setaf to use correct number of
+#	  color pairs, for ncurses 6.1 -TD
+#	+ add rs1 capability to xterm-256color -TD
+#	+ modify xterm-r5, xterm-r6 and xterm-xf86-v32 to use xterm+kbs to
+#	  match xterm #272, reflecting packager's changes -TD
+#	+ remove "boolean" Se, Ss from st-0.7 -TD
+#
+# 2018-01-04
+#	+ add konsole-direct and st-direct -TD
+#	+ remove unsupported "Tc" capability from st-0.7; use st-direct if
+#	  direct-colors are wanted -TD
+#
+# 2018-01-17
+#	+ add vte-direct -TD
+#	+ add XT, hpa, indn, and vpa to screen, and invis, E3 to tmux (patch by
+#	  Pierre Carru)
+#
+# 2018-01-21
+#	+ use xterm+sm+1006 in xterm-new, vte-2014 -TD
+#	+ use xterm+x11mouse in iterm, iterm2, mlterm3 because xterm's 1006
+#	  mode does not work with those programs.  konsole is debatable -TD
+#	+ add "termite" entry (report by Markus Pfeiffer) -TD
+#
+# 2018-01-27
+#	+ trim "XT" from screen entry -TD
+#	+ modify iterm to use xterm+sl-twm building block -TD
+#	+ mark konsole-420pc, konsole-vt100, konsole-xf3x obsolete reflecting
+#	  konsole's removal in 2008 -TD
+#	+ expanded the history section of konsole to explain its flawed
+#	  imitation of xterm's keyboard -TD
+#	+ use xterm+x11mouse in screen.* entries because screen does not yet
+#	  support xterm's 1006 mode -TD
+#	+ add nsterm-build400 for macOS 10.13 -TD
+#	+ add ansi+idc1, use that in ansi+idc adding dch for consistency -TD
+#	+ update vte to vte-2017 -TD
+#	+ add ecma+strikeout to vte-2017 -TD
+#	+ add iterm2-direct -TD
+#	+ updated teraterm, added teraterm-256color -TD
+#	+ add mlterm-direct -TD
+#	+ add descriptions for ANSI building-blocks -TD
+#
+# 2018-02-24
+#	+ correct Ss/Ms interchange in st-0.7 entry (tmux #1264) -TD
+#	+ fix remaining flash capabilities with trailing mandatory delays -TD
+#
+# 2018-03-17
+#	+ trim some redundant capabilities from st-0.7 -TD
+#	+ trim unnecessary setf/setb from interix -TD
+#
+# 2018-05-19
+#	+ trim spurious whitespace from tmux in 2018-02-24 changes;
+#	  fix some inconsistencies in/between tmux- and iterm2-entries for SGR
+#	  (report by C Anthony Risinger)
+#	+ improve iterm2 using some xterm features which it has adapted -TD
+#
+# 2018-06-30
+#	+ add acsc string to vi200 (Nibby Nebbulous)
+#	  add right/down-arrow to vi200's acsc -TD
+#
+# 2018-07-21
+#	+ corrected acsc for wy50 -TD
+#	+ add wy50 and wy60 shifted function-keys as kF1 to kF16 -TD
+#	+ remove ansi+rep mis-added to interix in 2018-02-23 -TD
+#
+# 2018-07-28
+#	+ fix typo in tvi955 -TD
+#	+ corrected acsc for regent60 -TD
+#	+ add alias n7900 -TD
+#
+# 2018-09-29
+#	+ corrected acsc for tvi950 -TD
+#	+ remove bogus kf0 from tvi950 -TD
+#	+ added function-key definitions to agree with TeleVideo 950 manual -TD
+#	+ add bel to tvi950 -TD
+#	+ add shifted function-keys to regent60 -TD
+#	+ renumber regent40 function-keys to match manual -TD
+#	+ add cd (clr_eos) to adds200 -TD
+#
+# 2018-10-27
+#	+ add OpenGL clients alacritty and kitty -TD
+#	+ add Smulx for tmux, vte-2018 -Nicholas Marriott
+#
+# 2018-12-15
+#	+ fix a typo in comments (Aaron Gyes).
+#	+ add nsterm-build309 to replace nsterm-256color, assigning the latter
+#	  as an alias of nsterm, to make mouse work with nsterm-256color -TD
+#	+ base gnome-256color entry on "gnome", not "vte", for consistency -TD
+#
+# 2019-01-12
+#	+ add nsterm-direct -TD
+#	+ use SGR 1006 mouse for konsole-base -TD
+#	+ use SGR 1006 mouse for putty -TD
+#	+ add ti703/ti707, ti703-w/ti707-w (Robert Clausecker)
+#
+# 2019-02-23
+#	+ fix typo in adds200 -TD
+#
+# 2019-03-30
+#	+ add "screen5", to mention italics (report by Stefan Assmann)
+#	+ modify description of xterm+x11hilite to eliminate unused p5 -TD
+#
+# 2019-05-18
+#	+ update xterm-new to xterm patch #345 -TD
+#	+ add/use xterm+keypad in xterm-new (report by Alain D D Williams) -TD
+#	+ update terminator entry -TD
+#	+ remove hard-tabs from ti703 (report by Robert Clausecker)
+#	+ add Smol/Rmol for mintty, vte-2018 -Nicholas Marriott
+#
+# 2019-06-01
+#	+ add rs1 to konsole, mlterm -TD
+#
+# 2019-06-08
+#	+ add mintty, mintty-direct (Thomas Wolff)
+# 2019-06-09
+#	+ comment-out some user-defined capabilities in mintty+common to allow
+#	  builds with existing releases 5.9-6.1 -TD
+#
+# 2019-06-30
+#	+ add ms-terminal -TD
+#	+ add vscode, vscode-direct -TD
+#	+ use ecma+index in screen, st -TD
+#
+# 2019-07-06
+#	+ add domterm -TD
+#	+ improve comments for recent changes, add alias xterm.js -TD
+#
+# 2019-08-03
+#	+ amend the change to screen, because tmux relies upon that entry
+#	  and does not support that feature (Debian #933572) -TD
+#	+ updated ms-terminal entry & notes -TD
+#	+ updated kitty entry & notes -TD
+#	+ updated alacritty+common entry & notes -TD
+#	+ use xterm+sl-twm for consistency -TD
+#
+# 2019-09-22
+#	+ correct a comment -TD
+#
+# 2019-10-26
+#	+ modify linux-16color to accommodate Linux console driver change in
+#	  early 2018 (report by Dino Petrucci).
+#
+# 2019-11-02
+#	+ add "xterm-mono" to help packagers (report by Sven Joachim) -TD
+#
+# 2019-11-09
+#	+ drop ich1 from rxvt-basic, Eterm and mlterm to improve compatibility
+#	  with old non-curses programs -TD
+#	+ reviewed st 0.8.2, updated some details -TD
+#	+ use ansi+rep several places -TD
+#
+# 2020-01-12
+#	+ update alacritty entries for 0.4.0 (prompted by patch by
+#	  Christian Duerr) -TD
+#
+# 2020-01-18
+#	+ spelling fixes per codespell -TD
+#	+ improve xm example for xterm+x11mouse, xterm+sm+1006 -TD
+#
+# 2020-02-22
+#	+ improve vt50h and vt52 based on DECScope manual -TD
+#	+ add/use vt52+keypad and vt52-basic -TD
+#
+# 2020-04-18
+#	+ use vt52+keypad in xterm-vt52, from xterm #354 -TD
+#
+# 2020-04-25
+#	+ use vt100+fnkeys in putty -TD
+#
+# 2020-05-02
+#	+ add details on the change to Linux SGR 21 in 2018 -TD
+#	+ add xterm-direct16 and xterm-direct256 -TD
+#
+# 2020-05-03
+#	+ fix some dead URLs -TD
+#
+# 2020-05-16
+#	+ update notes on vscode / xterm.js -TD
+#
+# 2020-05-30
+#	+ re-enable "bel" in konsole-base (report by Nia Huang)
+#	+ add linux-s entry (patch by Alexandre Montaron).
+#
+# 2020-06-06
+#	+ add xterm+256color2, xterm+88color2, to deprecate nonstandard usage
+#	  in xterm+256color, xterm+88color -TD
+#	+ add shifted Linux console keys in linux+sfkeys entry for
+#	  screen.linux (report by Alexandre Montaron).
+#	+ use vt100+enq in screen (report by Alexandre Montaron).
+#	+ add screen.linux-s alias (suggested by Alexandre Montaron).
+#
+# 2020-07-11
+#	+ fix pound-sign mapping in acsc of linux2.6 entry (report by Ingo
+#	  Bruckl).
+#
+# 2020-08-28
+#	+ correct icl6404 csr (report by Florian Weimer).
+#	+ correct ti916 cup (report by Florian Weimer).
+#	+ improve ndr9500 (report by Florian Weimer).
+#
+# 2020-09-05
+#	+ correct description of vt330/vt340 (Ross Combs).
+#
+# 2020-09-19
+#	+ update mlterm3 for 3.9.0 (report by Premysl Eric Janouch).
+#
+# 2020-09-29
+#	+ add tmux-direct (tmux #2370)
+#	+ simplify mlterm initialization with DECSTR -TD
+#	+ change tmux's kbs to ^? (report by Premysl Eric Janouch)
+#
+# 2020-10-10
+#	+ correct sgr in aaa+rv (report by Florian Weimer) -TD
+#	+ fix some sgr inconsistencies in d230c, ibm6153, ibm6154,
+#	  ncrvt100an -TD
+#
+# 2020-10-17
+#	+ expanded notes about tek4107 -TD
+#
+# 2020-11-07
+#	+ update kitty+common -TD
+#	+ add putty+screen and putty-screen (suggested by Alexandre Montaron).
+#
+# 2020-11-28
+#	+ add Smulx to alacritty (Christian Duerr).
+#	+ add rep to PuTTY -TD
+#	+ add putty+keypad -TD
+#
+# 2020-12-05
+#	+ correct mlterm3 kf1-kf4 (Debian #975322) -TD
+#	+ add flash to mlterm3 -TD
+#
+# 2020-12-27
+#	+ update terminology to 1.8.1 -TD
+#
+# 2021-01-16
+#	+ add comment for linux2.6 regarding CONFIG_CONSOLE_TRANSLATIONS
+#	  (report by Patrick McDermott) -TD
+#
+# 2021-01-25
+#	+ split-out att610+cvis, vt220+cvis, vt220+cvis8 -TD
+#	+ add vt220-base, for terminal emulators which generally have not
+#	  supported att610's blinking cursor control -TD
+#	+ use vt220+cvis in vt220, etc -TD
+#	+ use att610+cvis, xterm+tmux and ansi+enq in kitty -TD
+#	+ use vt220+cvis in st, terminology, termite since they ignore
+#	  blinking-cursor detail in att610+cvis -TD
+#
+# 2021-02-20
+#	+ add/use vt220+pcedit and vt220+vtedit  -TD
+#	+ add scrt/securecrt and absolute -TD
+#	+ add nel to xterm-new, though supported since X11R5 -TD
+#	+ add/use xterm+nofkeys -TD
+#	+ move use of ecma+italics from xterm-basic to xterm+nofkeys -TD
+#
+# 2021-02-27
+#	+ remove a duplicate "use" in xterm-vt220 -TD
+#
+# 2021-03-14
+#	+ correct use-ordering in some xterm-direct flavors -TD
+#
+# 2021-03-20
+#	+ add hterm, hterm-256color (Mike Frysinger)
+#
+# 2021-06-26
+#	+ use default colors in pccon "op" -TD
+#	+ correct rmacs/smacs in aaa+dec, aaa+rv -TD
+#	+ add hpterm-color2 and hp98550-color (Martin Trusler)
+#
+# 2021-07-17
+#	+ correct typo in "vip" comments (report by Nick Black), reviewed this
+#	  against Glink manual -TD
+#	+ fill in some missing pieces for pccon, to make it comparable to the
+#	  vt220 entry -TD
+#
+# 2021-07-24
+#	+ trim "flash" from pccon+base -TD
+#	+ revert change for aaa+rv -TD
+#	+ add workaround for Windows Terminal's problems with CR/LF mapping to
+#	  ms-terminal (patch by Juergen Pfeifer).
+#	+ review/update current Windows Terminal vs ms-terminal -TD
+#
+# 2021-07-31
+#	+ add extensions in xterm+tmux and ecma+strikeout to ms-terminal,
+#	  but cancel the non-working Cr and Ms capabilities -TD
+#	+ add foot and foot-direct -TD
+#
+# 2021-08-15
+#	+ fix missing "%d" for setaf/setab code 8-15 in xterm+direct16 (report
+#	  by Florian Weimer) -TD
+#
+# 2021-08-16
+#	+ corrected tsl capability for terminator -TD
+#
+# 2021-09-04
+#	+ modify linux3.0 entry to reflect default mapping of shift-tab by
+#	  kbd 1.14 (report by Jan Engelhardt) -TD
+#
+# 2021-09-11
+#	+ add testing note for xterm-{hp|sco|sun} -TD
+#	+ corrected description for ansi.sys-old -TD
+#	+ add xterm+nopcfkeys, to fill in keys for xterm-hp, xterm-sun -TD
+#	+ use hp+arrows in a few places -TD
+#	+ use hp+pfk-cr in a few places -TD
+#
+# 2021-09-21
+#	+ add kbeg to xterm+keypad to accommodate termcap applications -TD
+#	+ add smglp and smgrp to vt420+lrmm, to provide useful data for the
+#	  "tabs" +m option -TD
+#
+# 2021-10-09
+#	+ fill in some details for infoton -TD
+#	+ fix spelling/consistency in several descriptions -TD
+#	+ use vt420+lrmm in vt420 -TD
+#
+# 2021-10-13
+#	+ trim some redundant definitions -TD
+#
+# 2021-11-13
+#	+ add xterm+sl-alt, use that in foot+base (report by Jonas Grosse
+#	  Sundrup) -TD
+#
+# 2021-11-20
+#	+ add dim, ecma+strikeout to st-0.6 -TD
+#
+# 2021-11-27
+#	+ fix errata in description fields (report by Eric Lindblad) -TD
+#	+ add x10term+sl, aixterm+sl, ncr260vp+sl, ncr260vp+vt, wyse+sl -TD
+#
+# 2022-01-23
+#	+ update kitty -TD
+#
+# 2022-03-12
+#	+ add xterm+acs building-block -TD
+#	+ add xterm-p370, for use in older terminals -TD
+#	+ add dec+sl to xterm-new, per patch #371 -TD
+#	+ add mosh and mosh-256color -TD
+#
+# 2022-03-19
+#	+ add xgterm -TD
+#	+ correct setal in mintty/tmux entries, add to vte-2018 (report by
+#	  Robert Lange)
+#	+ add blink to vte-2018 (report by Robert Lange)
+#
+# 2022-03-26
+#	+ update teken -TD
+#	+ add teken-16color, teken-vt and teken-sc -TD
+#	+ add a few missing details for vte-2018 (report by Robert Lange) -TD
+#
+# 2022-03-27
+#	+ make description-fields distinct -TD
+#
+# 2022-04-30
+#	+ modify samples for xterm mouse 1002/1003 modes to use 1006 mode, and
+#	  also provide for focus in/out responses -TD
+#
+# 2022-05-28
+#	+ expanded notes for teken/syscons -TD
+#
+# 2022-06-04
+#	+ remove u6-u9 from teken-2018 -TD
+#	+ set "xterm-new" to "xterm-p370", add "xterm-p371" -TD
+#
+# 2022-06-18
+#	+ revise kon/kon2/jfbterm to undo "linux2.6" change to
+#	  smacs/rmacs/enacs (Debian #1012800) -TD
+#	+ amended note for att610+cvis0, as per documentation for att610,
+#	  att620, att730 -TD
+#
+# 2022-06-25
+#	+ correct dsl in dec+sl (report by Rajeev Pillai) -TD
+#	+ add/use ansi+cpr, decid+cpr -TD
+#
+# 2022-07-03
+#	+ use NQ to flag entries where the terminal does not support query and
+#	  response -TD
+#	+ use ansi+enq and decid+cpr in cases where the terminal probably
+#	  supported the u6-u9 extension -TD
+#	+ add/use apollo+vt132, xterm+alt47 -TD
+#
+# 2022-08-27
+#	+ modify nsterm to use xterm+alt1049 (report by Paul Handly) -TD
+#	+ modify putty to use xterm+alt1049 -TD
+#
+# 2022-12-24
+#	+ add/use bracketed+paste to help identify terminals supporting this
+#	  xterm feature (prompted by discussion with Bram Moolenaar) -TD
+#
+# 2022-12-29
+#	+ correct PS vs PE names in bracketed+paste (report by Bram Moolenaar)
+#	  -TD
+#
+######## SHANTIH!  SHANTIH!  SHANTIH!
diff --git a/mk-0th.awk b/mk-0th.awk
new file mode 100644
index 0000000..3662243
--- /dev/null
+++ b/mk-0th.awk
@@ -0,0 +1,175 @@
+# $Id: mk-0th.awk,v 1.24 2021/03/20 11:44:48 tom Exp $
+##############################################################################
+# Copyright 2020,2021 Thomas E. Dickey                                       #
+# Copyright 1998-2010,2012 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey 1996-on
+#
+# Generate list of sources for a library, together with lint/lintlib rules
+#
+# Variables:
+#	libname (library name, e.g., "ncurses", "panel", "forms", "menus")
+#	subsets (is used here to decide if wide-character code is used)
+#	ticlib (library name for libtic, e.g., "tic")
+#	termlib (library name for libtinfo, e.g., "tinfo")
+#
+function make_lintlib(name,sources) {
+	print  ""
+	print  "clean ::"
+	printf "\trm -f llib-l%s.*\n", name
+	print  ""
+	print  "realclean ::"
+	printf "\trm -f llib-l%s\n", name
+	print  ""
+	printf "llib-l%s : %s\n", name, sources
+	printf "\tcproto -a -l -DNCURSES_ENABLE_STDBOOL_H=0 -DLINT $(CPPFLAGS) %s >$@\n", sources
+	print  ""
+	print  "lintlib ::"
+	printf "\tsh $(srcdir)/../misc/makellib %s $(CPPFLAGS)\n", name
+	print ""
+	print "lint ::"
+	printf "\t$(LINT) $(LINT_OPTS) $(CPPFLAGS) %s $(LINT_LIBS)\n", sources
+}
+
+# A blank in "subsets" indicates a split-off of the library into a separate
+# file, e.g., for libtic or libtinfo.  They are all logical parts of the same
+# library.
+function which_library() {
+	if ( ( which == "ticlib" ) && ( subsets ~ /ticlib / ) ) {
+		return ticlib;
+	} else if ( ( which == "termlib" || which == "ext_tinfo" ) && ( subsets ~ /[[:space:]]base/ ) ) {
+		return termlib;
+	} else {
+		return libname;
+	}
+}
+
+function show_list(name, len, list) {
+	if ( len > 0 ) {
+		printf "\n%s_SRC =", toupper(name);
+		for (n = 0; n < len; ++n)
+			printf " \\\n\t%s", list[n];
+		print "";
+		make_lintlib(name, sprintf("$(%s_SRC)", toupper(name)));
+	}
+}
+
+BEGIN	{
+		which = libname;
+		using = 0;
+		found = 0;
+		count_ticlib = 0;
+		count_termlib = 0;
+		count_library = 0;
+	}
+	/^@/ {
+		which = $0;
+		sub(/^@[[:blank:]]+/, "", which);
+		sub(/[[:blank:]]+$/, "", which);
+	}
+	!/^[@#]/ {
+		if (using == 0)
+		{
+			print  ""
+			print  "# generated by mk-0th.awk"
+			printf "#   libname:    %s\n", libname
+			printf "#   subsets:    %s\n", subsets
+			if ( libname ~ /ncurses/ ) {
+				printf "#   ticlib:     %s\n", ticlib
+				printf "#   termlib:    %s\n", termlib
+			}
+			print  ""
+			print  ".SUFFIXES: .c .cc .h .i .ii"
+			print  ".c.i :"
+			printf "\t$(CPP) $(CPPFLAGS) $< >$@\n"
+			print  ".cc.ii :"
+			printf "\t$(CPP) $(CPPFLAGS) $< >$@\n"
+			print  ".h.i :"
+			printf "\t$(CPP) $(CPPFLAGS) $< >$@\n"
+			print  ""
+			using = 1;
+		}
+		if (which ~ /port_/ )
+		{
+			# skip win32 source
+		}
+		else if ( $0 != "" && $1 != "link_test" )
+		{
+			if ( found == 0 )
+			{
+				if ( subsets ~ /widechar/ )
+					widechar = 1;
+				else
+					widechar = 0;
+				printf "C_SRC ="
+				if ( $2 == "lib" )
+					found = 1
+				else if ( $2 == "c++" )
+					found = 2
+				else
+					found = 3
+			}
+			if ( libname == "c++" || libname == "c++w" ) {
+				srcname = sprintf("%s/%s.cc", $3, $1);
+				printf " \\\n\t%s", srcname;
+			} else if ( widechar == 1 || $3 != "$(wide)" ) {
+				srcname = sprintf("%s/%s.c", $3, $1);
+				printf " \\\n\t%s", srcname;
+				if ( which_library() == libname ) {
+					list_library[count_library++] = srcname;
+				} else if ( which_library() == ticlib ) {
+					list_ticlib[count_ticlib++] = srcname;
+				} else {
+					list_termlib[count_termlib++] = srcname;
+				}
+			}
+		}
+	}
+END	{
+		print  ""
+		if ( found == 1 )
+		{
+			print  ""
+			printf "# Producing llib-l%s is time-consuming, so there's no direct-dependency for\n", libname;
+			print  "# it in the lintlib rule.  We'll only remove in the cleanest setup.";
+			show_list(libname, count_library, list_library);
+			show_list(ticlib, count_ticlib, list_ticlib);
+			show_list(termlib, count_termlib, list_termlib);
+		}
+		else if ( found == 2 )
+		{
+			make_lintlib(libname, "$(C_SRC)");
+		}
+		else
+		{
+			print  ""
+			print  "lintlib :"
+			print  "\t@echo no action needed"
+		}
+	}
+# vile:ts=4 sw=4
diff --git a/mk-1st.awk b/mk-1st.awk
new file mode 100644
index 0000000..30638c3
--- /dev/null
+++ b/mk-1st.awk
@@ -0,0 +1,609 @@
+# $Id: mk-1st.awk,v 1.124 2021/10/15 00:50:05 tom Exp $
+##############################################################################
+# Copyright 2018-2020,2021 Thomas E. Dickey                                  #
+# Copyright 1998-2016,2017 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey
+#
+# Generate list of objects for a given model library
+# Variables:
+#	name		  (library name, e.g., "ncurses", "panel", "forms", "menus")
+#	traces		  ("all" or "DEBUG", to control whether tracing is compiled in)
+#	MODEL		  (e.g., "DEBUG", uppercase; toupper is not portable)
+#	CXX_MODEL	  (e.g., "DEBUG", uppercase)
+#	LIB_SUFFIX	  (e.g., "", "w", "t", "tw")
+#	USE_LIB_SUFFIX (e.g., "", "w", "t", "tw")
+#	model		  (directory into which we compile, e.g., "obj")
+#	prefix		  (e.g., "lib", for Unix-style libraries)
+#	suffix		  (e.g., "_g.a", for debug libraries)
+#	subset		  ("none", "base", "base+ext_funcs" or "termlib", etc.)
+#	driver		  ("yes" or "no", depends on --enable-term-driver)
+#	ShlibVer	  ("rel", "abi" or "auto", to augment DoLinks variable)
+#	ShlibVerInfix ("yes" or "no", determines location of version #)
+#	SymLink		  ("ln -s", etc)
+#	TermlibRoot	  ("tinfo" or other root for libterm.so)
+#	TermlibSuffix (".so" or other suffix for libterm.so)
+#	ReLink		  ("yes", or "no", flag to rebuild shared libs on install)
+#	ReRanlib	  ("yes", or "no", flag to rerun ranlib for installing static)
+#	DoLinks		  ("yes", "reverse" or "no", flag to add symbolic links)
+#	rmSoLocs	  ("yes" or "no", flag to add extra clean target)
+#	ldconfig	  (path for this tool, if used)
+#	make_phony    ("yes" if the make-program accepts ".PHONY" directive.
+#	overwrite	  ("yes" or "no", flag to add link to libcurses.a
+#	depend		  (optional dependencies for all objects, e.g, ncurses_cfg.h)
+#	host		  (cross-compile host, if any)
+#	libtool_version (libtool "-version-info" or "-version-number")
+#
+# Notes:
+#	CLIXs nawk does not like underscores in command-line variable names.
+#	Mixed-case variable names are ok.
+#	HP-UX requires shared libraries to have executable permissions.
+#
+function is_ticlib() {
+		return ( subset ~ /^ticlib$/ );
+	}
+function is_termlib() {
+		return ( subset ~ /^(ticlib\+)?termlib((\+[^+ ]+)*\+[a-z_]+_tinfo)?$/ );
+	}
+# see lib_name
+function lib_name_of(a_name) {
+		return sprintf("%s%s%s", prefix, a_name, suffix)
+	}
+# see imp_name
+function imp_name_of(a_name) {
+		if (ShlibVerInfix == "cygdll" || ShlibVerInfix == "msysdll" || ShlibVerInfix == "mingw") {
+			result = sprintf("%s%s%s.a", prefix, a_name, suffix);
+		} else if (ShlibVerInfix == "msvcdll") {
+			result = sprintf("%s%s%s.lib", prefix, a_name, suffix);
+		} else{
+			result = "";
+		}
+		return result;
+	}
+# see abi_name
+function abi_name_of(a_name) {
+		if (ShlibVerInfix == "cygdll") {
+			result = sprintf("%s%s$(ABI_VERSION)%s", "cyg", a_name, suffix);
+		} else if (ShlibVerInfix == "msysdll") {
+			result = sprintf("%s%s$(ABI_VERSION)%s", "msys-", a_name, suffix);
+		} else if (ShlibVerInfix == "mingw" || ShlibVerInfix == "msvcdll") {
+			result = sprintf("%s%s$(ABI_VERSION)%s", prefix, a_name, suffix);
+		} else if (ShlibVerInfix == "yes") {
+			result = sprintf("%s%s.$(ABI_VERSION)%s", prefix, a_name, suffix);
+		} else {
+			result = sprintf("%s.$(ABI_VERSION)", lib_name_of(a_name));
+		}
+		return result;
+	}
+# see rel_name
+function rel_name_of(a_name) {
+		if (ShlibVerInfix == "cygdll") {
+			result = sprintf("%s%s$(REL_VERSION)%s", "cyg", a_name, suffix);
+		} else if (ShlibVerInfix == "msysdll") {
+			result = sprintf("%s%s$(ABI_VERSION)%s", "msys-", a_name, suffix);
+		} else if (ShlibVerInfix == "mingw" || ShlibVerInfix == "msvcdll") {
+			result = sprintf("%s%s$(REL_VERSION)%s", prefix, a_name, suffix);
+		} else if (ShlibVerInfix == "yes") {
+			result = sprintf("%s%s.$(REL_VERSION)%s", prefix, a_name, suffix);
+		} else {
+			result = sprintf("%s.$(REL_VERSION)", lib_name_of(a_name));
+		}
+		return result;
+	}
+# see end_name
+function end_name_of(a_name) {
+		if ( MODEL != "SHARED" ) {
+			result = lib_name_of(a_name);
+		} else if ( DoLinks == "reverse") {
+			result = lib_name_of(a_name);
+		} else {
+			if ( ShlibVer == "rel" ) {
+				result = rel_name_of(a_name);
+			} else if ( ShlibVer == "abi" || ShlibVer == "cygdll" || ShlibVer == "msysdll" || ShlibVer == "mingw" || ShlibVer == "msvcdll" ) {
+				result = abi_name_of(a_name);
+			} else {
+				result = lib_name_of(a_name);
+			}
+		}
+		return result
+	}
+function symlink(src,dst) {
+		if ( src != dst ) {
+			if ( SymLink !~ /.*-f.*/ ) {
+				printf "rm -f %s; ", dst
+			}
+			printf "$(LN_S) %s %s; ", src, dst
+		}
+	}
+function rmlink(directory, dst) {
+		if ( dst != "" ) {
+			printf "\t-rm -f %s/%s\n", directory, dst
+		}
+	}
+function removelinks(directory) {
+		nlinks = 0;
+		links[nlinks++] = end_name;
+		if ( DoLinks == "reverse" ) {
+			if ( ShlibVer == "rel" ) {
+				links[nlinks++] = abi_name;
+				links[nlinks++] = rel_name;
+			} else if ( ShlibVer == "abi" ) {
+				links[nlinks++] = abi_name;
+			}
+		} else {
+			if ( ShlibVer == "rel" ) {
+				links[nlinks++] = abi_name;
+				links[nlinks++] = lib_name;
+			} else if ( ShlibVer == "abi" ) {
+				links[nlinks++] = lib_name;
+			}
+		}
+		for (j = 0; j < nlinks; ++j) {
+			found = 0;
+			for (k = 0; k < j; ++k ) {
+				if ( links[j] == links[k] ) {
+					found = 1;
+					break;
+				}
+			}
+			if ( !found ) {
+				rmlink(directory, links[j]);
+			}
+		}
+	}
+function make_shlib(objs, shlib_list) {
+		printf "\t$(MK_SHARED_LIB) $(%s_OBJS) $(%s)\n", objs, shlib_list
+	}
+function sharedlinks(directory) {
+		if ( ShlibVer != "auto" && ShlibVer != "cygdll" && ShlibVer != "msysdll" && ShlibVer != "mingw" && ShlibVer != "msvcdll" ) {
+			printf "\tcd %s && (", directory
+			if ( DoLinks == "reverse" ) {
+				if ( ShlibVer == "rel" ) {
+					symlink(lib_name, abi_name);
+					symlink(abi_name, rel_name);
+				} else if ( ShlibVer == "abi" ) {
+					symlink(lib_name, abi_name);
+				}
+			} else {
+				if ( ShlibVer == "rel" ) {
+					symlink(rel_name, abi_name);
+					symlink(abi_name, lib_name);
+				} else if ( ShlibVer == "abi" ) {
+					symlink(abi_name, lib_name);
+				}
+			}
+			printf ")\n"
+		}
+	}
+# termlib may be named explicitly via "--with-termlib=XXX", which overrides
+# any suffix.  Temporarily override "suffix" to account for this.
+function termlib_end_of() {
+	termlib_save_suffix = suffix;
+	suffix = TermlibSuffix;
+	termlib_temp_result = end_name_of(TermlibRoot);
+	suffix = termlib_save_suffix;
+	return termlib_temp_result;
+}
+function shlib_build(directory) {
+		dst_libs = sprintf("%s/%s", directory, end_name);
+		printf "%s : \\\n", dst_libs
+		if (subset == "ticlib" && driver == "yes" ) {
+			base = name;
+			sub(/^tic/, "ncurses", base); # workaround for "w"
+			printf "\t\t%s/%s \\\n", directory, end_name_of(base);
+		}
+		if (subset ~ /^base/ || subset == "ticlib" ) {
+			save_suffix = suffix
+			sub(/^[^.]\./,".",suffix)
+			if (directory != "../lib") {
+				printf "\t\t%s/%s \\\n", "../lib", termlib_end_of();
+			}
+			printf "\t\t%s/%s \\\n", directory, termlib_end_of();
+			suffix = save_suffix
+		}
+		printf "\t\t$(RESULTING_SYMS) $(%s_OBJS)\n", OBJS
+		printf "\t@echo linking $@\n"
+		printf "\t@mkdir -p %s\n", directory
+		if ( ReLink != "yes" ) {
+			printf "\t@sleep 1\n"
+		}
+		if ( is_ticlib() ) {
+			make_shlib(OBJS, "TICS_LIST")
+		} else if ( is_termlib() ) {
+			make_shlib(OBJS, "TINFO_LIST")
+		} else {
+			make_shlib(OBJS, "SHLIB_LIST")
+		}
+		sharedlinks(directory)
+	}
+function shlib_install(directory) {
+		src_lib1 = sprintf("../lib/%s", end_name);
+		dst_lib1 = sprintf("%s/%s", directory, end_name);
+		printf "%s : \\\n", dst_lib1
+		printf "\t\t%s \\\n", directory
+		printf "\t\t%s\n", src_lib1
+		printf "\t@echo installing $@\n"
+		printf "\t$(INSTALL_LIB) %s %s\n", src_lib1, dst_lib1;
+		sharedlinks(directory)
+	}
+function install_dll(directory,filename) {
+		src_name = sprintf("../lib/%s", filename);
+		dst_name = sprintf("$(DESTDIR)%s/%s", directory, filename);
+		printf "\t@echo installing %s as %s\n", src_name, dst_name
+		if ( directory == "$(bindir)" ) {
+			program = "$(INSTALL) -m 755";
+		} else {
+			program = "$(INSTALL_LIB)";
+		}
+		printf "\t%s %s %s\n", program, src_name, dst_name
+	}
+function in_subset(value) {
+		value = " " value " ";
+		check = subset;
+		gsub("[+]", " ", check);
+		check = " " check " ";
+		return index(check,value);
+	}
+function trim_suffix(value) {
+	if (USE_LIB_SUFFIX != "" && length(value) > length(USE_LIB_SUFFIX)) {
+		check = substr(value, 1 + length(value) - length(USE_LIB_SUFFIX));
+		if (check == USE_LIB_SUFFIX) {
+			value = substr(value, 1, length(value) - length(USE_LIB_SUFFIX));
+		}
+	}
+	return value;
+}
+BEGIN	{
+		TOOL_PREFIX = "";
+		found = 0;
+		using = 0;
+	}
+	/^@/ {
+		using = 0
+		if (subset == "none") {
+			using = 1
+			print  ""
+			print "# generated by mk-1st.awk"
+		} else if (in_subset($2) > 0) {
+			if (using == 0) {
+				if (found == 0) {
+					if ( name ~ /^.*\+\+.*/ ) {
+						if ( CXX_MODEL == "NORMAL" && MODEL == "SHARED" ) {
+							print  ""
+							printf "# overriding model from %s to match CXX_MODEL\n", MODEL;
+							MODEL = "NORMAL";
+							suffix = ".a";
+							DoLinks = "no";
+						}
+					}
+					print  ""
+					printf "# generated by mk-1st.awk (subset=%s)\n", subset
+					printf "#  name:            %s\n", name
+					printf "#  traces:          %s\n", traces
+					printf "#  MODEL:           %s\n", MODEL
+					printf "#  CXX_MODEL:       %s\n", CXX_MODEL
+					printf "#  LIB_SUFFIX:      %s\n", LIB_SUFFIX
+					printf "#  USE_LIB_SUFFIX:  %s\n", USE_LIB_SUFFIX
+					printf "#  model:           %s\n", model
+					printf "#  prefix:          %s\n", prefix
+					printf "#  suffix:          %s\n", suffix
+					printf "#  subset:          %s\n", subset
+					printf "#  driver:          %s\n", driver
+					printf "#  ShlibVer:        %s\n", ShlibVer
+					printf "#  ShlibVerInfix:   %s\n", ShlibVerInfix
+					printf "#  SymLink:         %s\n", SymLink
+					printf "#  TermlibRoot:     %s\n", TermlibRoot
+					printf "#  TermlibSuffix:   %s\n", TermlibSuffix
+					printf "#  ReLink:          %s\n", ReLink
+					printf "#  ReRanlib:        %s\n", ReRanlib
+					printf "#  DoLinks:         %s\n", DoLinks
+					printf "#  rmSoLocs:        %s\n", rmSoLocs
+					printf "#  ldconfig:        %s\n", ldconfig
+					printf "#  make_phony:      %s\n", make_phony
+					printf "#  overwrite:       %s\n", overwrite
+					printf "#  depend:          %s\n", depend
+					printf "#  host:            %s\n", host
+					printf "#  libtool_version: %s\n", libtool_version
+					print  ""
+				}
+				using = 1
+			}
+			if ( is_ticlib() ) {
+				OBJS  = MODEL "_P"
+			} else if ( is_termlib() ) {
+				OBJS  = MODEL "_T"
+			} else {
+				OBJS  = MODEL
+			}
+		}
+	}
+	/^[@#]/ {
+		next
+	}
+	$1 ~ /trace/ {
+		if (traces != "all" && traces != MODEL && $1 != "lib_trace")
+			next
+	}
+	{
+		if (using \
+		 && ( $1 != "link_test" ) \
+		 && ( $2 == "lib" \
+		   || $2 == "progs" \
+		   || $2 == "c++" \
+		   || $2 == "tack" ))
+		{
+			if ( found == 0 )
+			{
+				printf "%s_OBJS =", OBJS
+				if ( $2 == "lib" ) {
+					found = 1;
+				} else if ( $2 == "c++" ) {
+					TOOL_PREFIX = "CXX_";
+					found = 1;
+				} else {
+					found = 2;
+				}
+				if ( $2 == "c++" ) {
+					CC_NAME="CXX"
+					CC_FLAG="CXXFLAGS"
+				} else {
+					CC_NAME="CC"
+					CC_FLAG="CFLAGS"
+				}
+			}
+			printf " \\\n\t../%s/%s$o", model, $1;
+		}
+	}
+END	{
+		print  ""
+		if ( found != 0 )
+		{
+			printf "\n$(%s_OBJS) : %s\n", OBJS, depend
+		}
+		if ( found == 1 )
+		{
+			print  ""
+			lib_name = lib_name_of(name);
+			if ( MODEL == "SHARED" )
+			{
+				abi_name = abi_name_of(name);
+				rel_name = rel_name_of(name);
+				imp_name = imp_name_of(name);
+				end_name = end_name_of(name);
+
+				shlib_build("../lib")
+
+				print  ""
+				print  "install \\"
+				print  "install.libs \\"
+
+				if ( ShlibVer == "cygdll" || ShlibVer == "msysdll" || ShlibVer == "mingw" || ShlibVer == "msvcdll") {
+
+					dst_dirs = "$(DESTDIR)$(bindir) $(DESTDIR)$(libdir)";
+					printf "install.%s :: %s $(LIBRARIES)\n", name, dst_dirs
+					install_dll("$(bindir)",end_name);
+					install_dll("$(libdir)",imp_name);
+
+				} else {
+
+					lib_dir = "$(DESTDIR)$(libdir)";
+					printf "install.%s :: %s/%s\n", name, lib_dir, end_name
+					print ""
+					if ( ReLink == "yes" ) {
+						shlib_build(lib_dir)
+					} else {
+						shlib_install(lib_dir)
+					}
+				}
+
+				if ( overwrite == "yes" && name == "ncurses" )
+				{
+					if ( ShlibVer == "cygdll" || ShlibVer == "msysdll" || ShlibVer == "mingw" || SlibVer == "msvcdll") {
+						if (ShlibVer == "msvcdll") {
+							curses_prefix = ""
+						} else {
+							curses_prefix = "lib"
+						}
+						ovr_name = sprintf("%scurses%s.a", curses_prefix, suffix)
+						printf "\t@echo linking %s to %s\n", imp_name, ovr_name
+						printf "\tcd $(DESTDIR)$(libdir) && ("
+						symlink(imp_name, ovr_name)
+						printf ")\n"
+					} else {
+						ovr_name = sprintf("libcurses%s", suffix)
+						printf "\t@echo linking %s to %s\n", end_name, ovr_name
+						printf "\tcd $(DESTDIR)$(libdir) && ("
+						symlink(end_name, ovr_name)
+						printf ")\n"
+					}
+				}
+				if ( ldconfig != "" && ldconfig != ":" ) {
+					printf "\t- test -z \"$(DESTDIR)\" && %s\n", ldconfig
+				}
+				print  ""
+				print  "uninstall \\"
+				print  "uninstall.libs \\"
+				printf "uninstall.%s ::\n", name
+				if ( ShlibVer == "cygdll" || ShlibVer == "msysdll" || ShlibVer == "mingw" || ShlibVer == "msvcdll") {
+
+					printf "\t@echo uninstalling $(DESTDIR)$(bindir)/%s\n", end_name
+					printf "\t-@rm -f $(DESTDIR)$(bindir)/%s\n", end_name
+
+					printf "\t@echo uninstalling $(DESTDIR)$(libdir)/%s\n", imp_name
+					printf "\t-@rm -f $(DESTDIR)$(libdir)/%s\n", imp_name
+
+				} else {
+					printf "\t@echo uninstalling $(DESTDIR)$(libdir)/%s\n", end_name
+					removelinks("$(DESTDIR)$(libdir)")
+					if ( overwrite == "yes" && name == "ncurses" )
+					{
+						ovr_name = sprintf("libcurses%s", suffix)
+						printf "\t-@rm -f $(DESTDIR)$(libdir)/%s\n", ovr_name
+					}
+				}
+				if ( rmSoLocs == "yes" ) {
+					print  ""
+					print  "mostlyclean \\"
+					print  "clean ::"
+					printf "\t-@rm -f so_locations\n"
+				}
+			}
+			else if ( MODEL == "LIBTOOL" )
+			{
+				end_name = lib_name;
+				use_name = trim_suffix(TermlibRoot) USE_LIB_SUFFIX
+				printf "../lib/%s : \\\n", lib_name
+				if ( (name != use_name ) && ( index(name, "++") == 0 ) && ( index(name, "tic") == 1 || index(name, "ncurses") == 1 ) ) {
+					printf "\t\t../lib/lib%s.la \\\n", use_name;
+					if ( index(name, "tic") == 1 && index(TermlibRoot, "ncurses") != 1 ) {
+						printf "\t\t../lib/lib%s%s.la \\\n", "ncurses", USE_LIB_SUFFIX;
+					}
+				}
+				printf "\t\t$(%s_OBJS)\n", OBJS
+				if ( is_ticlib() ) {
+					which_list = "TICS_LIST";
+				} else if ( is_termlib() ) {
+					which_list = "TINFO_LIST";
+				} else {
+					which_list = "SHLIB_LIST";
+				}
+				printf "\tcd ../lib && $(LIBTOOL_LINK) $(%s) $(%s) \\\n", CC_NAME, CC_FLAG;
+				printf "\t\t-o %s $(%s_OBJS:$o=.lo) \\\n", lib_name, OBJS;
+				printf "\t\t-rpath $(libdir) \\\n";
+				printf "\t\t%s $(NCURSES_MAJOR):$(NCURSES_MINOR) $(LT_UNDEF) $(%s) $(LDFLAGS)\n", libtool_version, which_list;
+				if ( make_phony == "yes" ) {
+					print  ""
+					printf ".PHONY :\tinstall.%s\n", trim_suffix(name);
+				}
+				print  ""
+				print  "install \\"
+				print  "install.libs \\"
+				printf "install.%s :: \\\n", trim_suffix(name);
+				printf "\t\t$(DESTDIR)$(libdir) \\\n";
+				use_name = TermlibRoot USE_LIB_SUFFIX
+				if ( (name != use_name ) && ( index(name, "++") == 0 ) && ( index(name, "tic") == 1 || index(name, "ncurses") == 1 ) ) {
+					if ( trim_suffix(TermlibRoot) != trim_suffix(name) ) {
+						printf "\t\tinstall.%s \\\n", trim_suffix(TermlibRoot);
+					}
+					if ( index(name, "tic") == 1 && index(TermlibRoot, "ncurses") != 1 && trim_suffix(name) != "ncurses" ) {
+						printf "\t\tinstall.%s \\\n", "ncurses";
+					}
+				}
+				printf "\t\t../lib/%s\n", lib_name
+				printf "\t@echo installing ../lib/%s as $(DESTDIR)$(libdir)/%s\n", lib_name, lib_name
+				printf "\tcd ../lib; $(LIBTOOL_INSTALL) $(INSTALL) %s $(DESTDIR)$(libdir)\n", lib_name
+				print  ""
+				print  "uninstall \\"
+				print  "uninstall.libs \\"
+				printf "uninstall.%s ::\n", trim_suffix(name)
+				printf "\t@echo uninstalling $(DESTDIR)$(libdir)/%s\n", lib_name
+				printf "\t-@$(LIBTOOL_UNINSTALL) rm -f $(DESTDIR)$(libdir)/%s\n", lib_name
+			}
+			else
+			{
+				end_name = lib_name;
+				printf "../lib/%s : $(%s_OBJS)\n", lib_name, OBJS
+				# workaround: binutils' ranlib tries to be clever with
+				# timestamps, by pretending its update took no time, confusing
+				# the make utility.
+				if ( ReLink != "yes" ) {
+					printf "\t@sleep 1\n"
+				}
+				printf "\t$(%sAR) $(%sARFLAGS) $@ $?\n", TOOL_PREFIX, TOOL_PREFIX;
+				printf "\t$(RANLIB) $@\n"
+				if ( host == "vxworks" )
+				{
+					printf "\t$(LD) $(LD_OPTS) $? -o $(@:.a=$o)\n"
+				}
+				print  ""
+				print  "install \\"
+				print  "install.libs \\"
+				printf "install.%s :: $(DESTDIR)$(libdir) ../lib/%s\n", name, lib_name
+				printf "\t@echo installing ../lib/%s as $(DESTDIR)$(libdir)/%s\n", lib_name, lib_name
+				printf "\t$(INSTALL_DATA) ../lib/%s $(DESTDIR)$(libdir)/%s\n", lib_name, lib_name
+				if ( overwrite == "yes" && lib_name == "libncurses.a" )
+				{
+					printf "\t@echo linking libcurses.a to libncurses.a\n"
+					printf "\t-@rm -f $(DESTDIR)$(libdir)/libcurses.a\n"
+					printf "\t(cd $(DESTDIR)$(libdir) && "
+					symlink("libncurses.a", "libcurses.a")
+					printf ")\n"
+				}
+				if ( ReRanlib == "yes" )
+				{
+					printf "\t$(RANLIB) $(DESTDIR)$(libdir)/%s\n", lib_name
+				}
+				if ( host == "vxworks" )
+				{
+					printf "\t@echo installing ../lib/lib%s$o as $(DESTDIR)$(libdir)/lib%s$o\n", name, name
+					printf "\t$(INSTALL_DATA) ../lib/lib%s$o $(DESTDIR)$(libdir)/lib%s$o\n", name, name
+				}
+				print  ""
+				print  "uninstall \\"
+				print  "uninstall.libs \\"
+				printf "uninstall.%s ::\n", name
+				printf "\t@echo uninstalling $(DESTDIR)$(libdir)/%s\n", lib_name
+				printf "\t-@rm -f $(DESTDIR)$(libdir)/%s\n", lib_name
+				if ( overwrite == "yes" && lib_name == "libncurses.a" )
+				{
+					printf "\t@echo linking libcurses.a to libncurses.a\n"
+					printf "\t-@rm -f $(DESTDIR)$(libdir)/libcurses.a\n"
+				}
+				if ( host == "vxworks" )
+				{
+					printf "\t@echo uninstalling $(DESTDIR)$(libdir)/lib%s$o\n", name
+					printf "\t-@rm -f $(DESTDIR)$(libdir)/lib%s$o\n", name
+				}
+			}
+			print ""
+			print "clean ::"
+			removelinks("../lib");
+			print ""
+			print "mostlyclean::"
+			printf "\t-rm -f $(%s_OBJS)\n", OBJS
+			if ( MODEL == "LIBTOOL" ) {
+				printf "\t-$(LIBTOOL_CLEAN) rm -f $(%s_OBJS:$o=.lo)\n", OBJS
+			}
+		}
+		else if ( found == 2 )
+		{
+			print ""
+			print "mostlyclean::"
+			printf "\t-rm -f $(%s_OBJS)\n", OBJS
+			if ( MODEL == "LIBTOOL" ) {
+				printf "\t-$(LIBTOOL_CLEAN) rm -f $(%s_OBJS:$o=.lo)\n", OBJS
+			}
+			print ""
+			print "clean ::"
+			printf "\t-rm -f $(%s_OBJS)\n", OBJS
+			if ( MODEL == "LIBTOOL" ) {
+				printf "\t-$(LIBTOOL_CLEAN) rm -f $(%s_OBJS:$o=.lo)\n", OBJS
+			}
+		}
+	}
+# vile:ts=4 sw=4
diff --git a/mk-2nd.awk b/mk-2nd.awk
new file mode 100644
index 0000000..4493bcf
--- /dev/null
+++ b/mk-2nd.awk
@@ -0,0 +1,154 @@
+# $Id: mk-2nd.awk,v 1.23 2021/06/17 21:20:30 tom Exp $
+##############################################################################
+# Copyright 2020,2021 Thomas E. Dickey                                       #
+# Copyright 1998-2004,2005 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey
+#
+# Generate compile-rules for the modules that we are using in libraries or
+# programs.  We are listing them explicitly because we have turned off the
+# suffix rules (to force compilation with the appropriate flags).  We could use
+# make-recursion but that would result in makefiles that are useless for
+# development.
+#
+# Variables:
+#	model directory into which objects are compiled.
+#	MODEL (uppercase version of "model"; toupper is not portable)
+#	echo (yes iff we will show the $(CC) lines)
+#	subset ("none", "base", "base+ext_funcs" or "termlib")
+#	crenames ("yes" or "no", flag to control whether -c & -o options are used)
+#	cxxrenames ("yes" or "no", flag to control whether -c & -o options are used)
+#	traces ("all" or "DEBUG", to control whether tracing is compiled in)
+#	srcdir is expanded when "configure --srcdir" was used
+#
+# Fields in src/modules:
+#	$1 = module name
+#	$2 = progs|lib|c++
+#	$3 = source-directory
+#
+# Fields in src/modules past $3 are dependencies
+#
+function in_subset(value) {
+		value = " " value " ";
+		check = subset;
+		gsub("[+]", " ", check);
+		check = " " check " ";
+		return index(check,value);
+	}
+BEGIN	{
+		found = 0
+		using = 0
+	}
+	/^@/ {
+		using = 0
+		if (subset == "none") {
+			using = 1
+		} else if (in_subset($2) > 0) {
+			if (using == 0) {
+				if (found == 0) {
+					print  ""
+					print  "# generated by mk-2nd.awk"
+					printf "#   model:      %s\n", model
+					printf "#   MODEL:      %s\n", MODEL
+					printf "#   echo:       %s\n", echo
+					printf "#   subset:     %s\n", subset
+					printf "#   crenames:   %s\n", crenames
+					printf "#   cxxrenames: %s\n", cxxrenames
+					printf "#   traces:     %s\n", traces
+					printf "#   srcdir:     %s\n", srcdir
+				}
+				using = 1
+			}
+		}
+	}
+	/^[@#]/ {
+		next
+	}
+	$1 ~ /trace/ {
+		if (traces != "all" && traces != MODEL && $1 != "lib_trace")
+			next
+	}
+	{
+		if ($0 != "" \
+		 && using != 0) {
+			found = 1
+			if ( $1 != "" ) {
+				print  ""
+				if ( $2 == "c++" ) {
+					compile="CXX"
+					suffix=".cc"
+					use_c_o=cxxrenames
+				} else {
+					compile="CC"
+					suffix=".c"
+					use_c_o=crenames
+				}
+				printf "../%s/%s$o :\t%s/%s%s", model, $1, $3, $1, suffix
+				for (n = 4; n <= NF; n++) printf " \\\n\t\t\t%s", $n
+				print  ""
+				if ( echo == "yes" )
+					atsign=""
+				else {
+					atsign="@"
+					printf "\t@echo 'compiling %s (%s)'\n", $1, model
+				}
+				printf "\t%s", atsign;
+				if ( use_c_o != "yes" ) {
+					printf "cd ../%s; ", model;
+				}
+				# The choice here is between
+				#	base+ext_funcs and
+				#	termlib+ext_tinfo
+				# but they may appear in the same value.
+				if ( subset ~ /base/ ) {
+					mycflags=""
+				} else if ( subset ~ /termlib/ ) {
+					mycflags=" -DUSE_TERMLIB"
+				}
+				printf "$(LIBTOOL_COMPILE) $(%s) $(CFLAGS_%s)%s -c ", compile, MODEL, mycflags
+				if ( $3 == "." || srcdir == "." ) {
+					dir = $3 "/"
+					sub("^\\$\\(srcdir\\)/","",dir);
+					sub("^\\./","",dir);
+					printf "../%s/%s%s%s", name, dir, $1, suffix
+				} else {
+					printf "%s/%s%s", $3, $1, suffix
+				}
+				if ( use_c_o == "yes" ) {
+					printf " -o ../%s/%s$o", model, $1
+				}
+			} else {
+				printf "%s", $1
+				for (n = 2; n <= NF; n++) printf " %s", $n
+			}
+			print  ""
+		}
+	}
+END	{
+		print  ""
+	}
diff --git a/mk-hdr.awk b/mk-hdr.awk
new file mode 100644
index 0000000..7608afe
--- /dev/null
+++ b/mk-hdr.awk
@@ -0,0 +1,115 @@
+# $Id: mk-hdr.awk,v 1.8 2021/06/17 21:20:30 tom Exp $
+##############################################################################
+# Copyright 2020,2021 Thomas E. Dickey                                       #
+# Copyright 2007-2010,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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey	2007
+#
+# Generate install/uninstall rules for header files
+# Variables:
+#	subset	  ("none", "base", "base+ext_funcs" or "termlib", etc.)
+#	compat	  ("yes" or "no", flag to add link to curses.h
+#
+function basename(path) {
+	sub(/^.*\//,"",path)
+	return path;
+}
+function in_subset(value) {
+	value = " " value " ";
+	check = subset;
+	gsub("[+]", " ", check);
+	check = " " check " ";
+	return index(check,value);
+}
+BEGIN	{
+		found = 0
+		using = 1
+		count = 0
+	}
+	/^@/ {
+		using = 0
+		if (subset == "none") {
+			using = 1
+		} else if (in_subset($2) > 0) {
+			using = 1
+		} else {
+			using = 0
+		}
+	}
+	/^[@#]/ {
+		next
+	}
+	{
+		if (using && NF != 0) {
+			if (found == 0) {
+				print  ""
+				print  "# generated by mk-hdr.awk"
+				printf "#  subset:     %s\n", subset
+				printf "#  compat:     %s\n", compat
+				print  ""
+				found = 1
+			}
+			data[count] = $1
+			count = count + 1
+		}
+	}
+END	{
+		if ( count > 0 )
+		{
+			print "${INCLUDEDIR} :"
+			print "	mkdir -p $@"
+			print ""
+			print "install \\"
+			print "install.libs \\"
+			print "install.includes :: ${AUTO_SRC} ${INCLUDEDIR} \\"
+
+			for (i = 0; i < count - 1; ++i) {
+				printf "		%s \\\n", data[i]
+			}
+			printf "		%s\n", data[count - 1]
+
+			for (i = 0; i < count; ++i) {
+				printf "	@ (cd ${INCLUDEDIR} && rm -f %s) ; ../headers.sh ${INSTALL_DATA} ${INCLUDEDIR} ${srcdir} %s\n", basename(data[i]), data[i]
+				if (data[i] == "curses.h" && compat == "yes") {
+					printf "	@ (cd ${INCLUDEDIR} && rm -f ncurses.h && ${LN_S} %s ncurses.h)\n", data[i]
+				}
+			}
+			print ""
+			print "uninstall \\"
+			print "uninstall.libs \\"
+			print "uninstall.includes ::"
+
+			for (i = 0; i < count; ++i) {
+				printf "	-@ (cd ${INCLUDEDIR} && rm -f %s)\n", basename(data[i])
+				if (data[i] == "curses.h" && compat == "yes") {
+					printf "	-@ (cd ${INCLUDEDIR} && rm -f ncurses.h)\n"
+				}
+			}
+		}
+	}
+# vile:ts=4 sw=4
diff --git a/ncurses/Makefile.in b/ncurses/Makefile.in
new file mode 100644
index 0000000..59e80d0
--- /dev/null
+++ b/ncurses/Makefile.in
@@ -0,0 +1,382 @@
+# $Id: Makefile.in,v 1.183 2022/10/01 12:47:39 tom Exp $
+##############################################################################
+# Copyright 2018-2021,2022 Thomas E. Dickey                                  #
+# Copyright 1998-2017,2018 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey 1996-on
+#
+# Makefile for ncurses source code.
+#
+# This makes the following:
+#	programs
+#	includes
+#	libraries (normal/debug/profile/shared)
+#
+# The variable 'srcdir' refers to the source-distribution, and can be set with
+# the configure script by "--srcdir=DIR".
+#
+# The rules are organized to produce the libraries for the configured models,
+# and the programs with the configured default model.
+
+# turn off _all_ suffix rules; we'll generate our own
+.SUFFIXES:
+
+SHELL		= @SHELL@
+VPATH		= @srcdir@
+THIS		= Makefile
+
+TOP_MFLAGS	= @cf_cv_makeflags@ DESTDIR="$(DESTDIR)" RPATH_LIST="$(RPATH_LIST)"
+@SET_MAKE@
+
+x		= @EXEEXT@
+o		= .@OBJEXT@
+
+MODEL		= @DFT_LWR_MODEL@
+DESTDIR		= @DESTDIR@
+top_srcdir	= @top_srcdir@
+srcdir		= @srcdir@
+prefix		= @prefix@
+exec_prefix	= @exec_prefix@
+bindir		= @bindir@
+libdir		= @libdir@
+includedir	= @includedir@
+datarootdir	= @datarootdir@
+datadir		= @datadir@
+includesubdir	= @includesubdir@
+
+INCLUDEDIR	= $(DESTDIR)$(includedir)$(includesubdir)
+
+PACKAGE		= @PACKAGE@
+
+LIBTOOL		= @LIBTOOL@
+LIBTOOL_OPTS	= @LIBTOOL_OPTS@ @EXPORT_SYMS@
+LIBTOOL_CLEAN	= @LIB_CLEAN@
+LIBTOOL_COMPILE	= @LIB_COMPILE@
+LIBTOOL_LINK	= @LIB_LINK@
+LIBTOOL_INSTALL	= @LIB_INSTALL@
+LIBTOOL_UNINSTALL = @LIB_UNINSTALL@
+LT_UNDEF	= @LT_UNDEF@
+
+INSTALL		= @INSTALL@
+INSTALL_LIB	= @INSTALL@ @INSTALL_LIB@
+INSTALL_PROG	= @INSTALL_PROGRAM@ @INSTALL_OPT_S@
+INSTALL_DATA	= @INSTALL_DATA@
+
+AR		= @AR@
+ARFLAGS		= @ARFLAGS@
+AWK		= @AWK@
+LD		= @LD@
+LN_S		= @LN_S@
+NM		= @NM@
+
+CTAGS		= @CTAGS@
+ETAGS		= @ETAGS@
+
+CC		= @CC@
+CPP		= @CPP@
+CFLAGS		= @CFLAGS@ @EXTRA_CFLAGS@
+LIBS		= @LIBS@
+
+INCDIR		= $(srcdir)/../include
+CPPFLAGS	= -DHAVE_CONFIG_H -DBUILDING_NCURSES -I../ncurses @CPPFLAGS@
+
+CCFLAGS		= $(CPPFLAGS) $(CFLAGS)
+
+BUILD_CPPFLAGS	= -DHAVE_CONFIG_H -DUSE_BUILD_CC -I../ncurses -I$(srcdir) -I../include -I$(INCDIR) @BUILD_CPPFLAGS@
+BUILD_CC	= @BUILD_CC@
+BUILD_CCFLAGS	= @BUILD_CFLAGS@
+BUILD_LDFLAGS	= @BUILD_LDFLAGS@
+BUILD_LIBS	= @BUILD_LIBS@
+
+# The executables built in this directory are used for generating source that
+# is compiled into the build, or are test-programs that are not installed.
+
+BUILD_EXEEXT	= @BUILD_EXEEXT@
+x		= @EXEEXT@
+
+CFLAGS_LIBTOOL	= $(CCFLAGS)
+CFLAGS_NORMAL	= $(CCFLAGS) -DNCURSES_STATIC
+CFLAGS_DEBUG	= $(CCFLAGS) -DNCURSES_STATIC @CC_G_OPT@ -DTRACE
+CFLAGS_PROFILE	= $(CCFLAGS) -DNCURSES_STATIC -pg
+CFLAGS_SHARED	= $(CCFLAGS) @CC_SHARED_OPTS@
+
+CFLAGS_DEFAULT	= $(CFLAGS_@DFT_UPR_MODEL@)
+
+LINK		= $(LIBTOOL)
+LDFLAGS		= @LDFLAGS@ @LD_MODEL@
+
+SHLIB_DIRS	= -L../lib
+SHLIB_LIST	= $(SHLIB_DIRS) @SHLIB_LIST@ @LIBS@
+TINFO_LIST	= $(SHLIB_DIRS) @TINFO_LIST@ @LIBS@
+TICS_LIST	= $(SHLIB_DIRS) @TICS_LIST@ @LIBS@
+
+RPATH_LIST	= @RPATH_LIST@
+RESULTING_SYMS	= @RESULTING_SYMS@
+VERSIONED_SYMS	= @VERSIONED_SYMS@
+MK_SHARED_LIB	= @MK_SHARED_LIB@
+
+NCURSES_MAJOR	= @NCURSES_MAJOR@
+NCURSES_MINOR	= @NCURSES_MINOR@
+REL_VERSION	= @cf_cv_rel_version@
+ABI_VERSION	= @cf_cv_abi_version@
+
+RANLIB		= @LIB_PREP@
+
+LIBRARIES	= @Libs_To_Make@
+
+LINT		= @LINT@
+LINT_OPTS	= @LINT_OPTS@
+LINT_LIBS	= -lncurses @LIBS@
+
+FALLBACK_LIST	= @FALLBACK_LIST@
+
+USE_BIG_STRINGS	= @USE_BIG_STRINGS@
+TERMINFO_CAPS	= $(top_srcdir)/include/@TERMINFO_CAPS@
+CAPLIST		= $(TERMINFO_CAPS) $(top_srcdir)/include/Caps-ncurses
+
+TERMINFO	= @TERMINFO@
+TERMINFO_SRC	= @TERMINFO_SRC@
+TIC_PATH	= @TIC@
+INFOCMP_PATH	= @INFOCMP@
+
+AUTO_SRC = \
+	./codes.c \
+	./comp_captab.c \
+	./comp_userdefs.c \
+	./expanded.c \
+	./fallback.c \
+	./lib_gen.c \
+	./lib_keyname.c \
+	./link_test.c \
+	./names.c \
+	./unctrl.c \
+	init_keytry.h \
+	keys.list
+
+HEADER_DEPS	= @INTERNALS_HDR@ \
+	../include/ncurses_cfg.h \
+	../include/ncurses_def.h \
+	../include/ncurses_dll.h \
+	../include/curses.h \
+	../include/term.h \
+	../include/unctrl.h \
+	$(INCDIR)/nc_alloc.h \
+	$(INCDIR)/nc_panel.h \
+	$(INCDIR)/nc_string.h \
+	$(INCDIR)/nc_termios.h \
+	$(INCDIR)/nc_tparm.h \
+	$(INCDIR)/nc_win32.h \
+	$(INCDIR)/term_entry.h \
+	$(srcdir)/curses.priv.h \
+	$(srcdir)/new_pair.h \
+	$(srcdir)/term.priv.h
+
+TEST_DEPS	= ../lib/@LIB_PREFIX@ncurses@DFT_DEP_SUFFIX@
+TEST_ARGS	= @LDFLAGS_STATIC@ @TEST_ARGS@ @LDFLAGS_SHARED@
+TEST_LDFLAGS	= @LD_MODEL@ $(TEST_ARGS) @LIBS@ @LOCAL_LDFLAGS@ @LDFLAGS@
+
+TEST_PROGS = \
+	captoinfo$x \
+	hardscroll$x \
+	hashmap$x \
+	lib_mvcur$x \
+	link_test$x \
+	report_hashing$x
+
+LOCAL_LIBDIR	= @top_builddir@/lib
+
+base	 = $(srcdir)/base
+serial	 = $(srcdir)/tty
+tinfo	 = $(srcdir)/tinfo
+trace	 = $(srcdir)/trace
+wide	 = $(srcdir)/widechar
+win32con = $(srcdir)/win32con
+
+################################################################################
+
+@MAKE_PHONY@.PHONY :	all
+@MAKE_PHONY@.PHONY :	check
+@MAKE_PHONY@.PHONY :	clean
+@MAKE_PHONY@.PHONY :	distclean
+@MAKE_PHONY@.PHONY :	libs
+@MAKE_PHONY@.PHONY :	mostlyclean
+@MAKE_PHONY@.PHONY :	realclean
+@MAKE_PHONY@.PHONY :	sources
+@MAKE_PHONY@.PHONY :	test_progs
+
+all libs ::	$(AUTO_SRC) ../lib $(LIBRARIES)
+
+@CHECK_BUILD@all libs ::	report_offsets$(BUILD_EXEEXT)
+
+sources:	$(AUTO_SRC)
+
+$(DESTDIR)$(bindir) \
+$(DESTDIR)$(libdir) :
+	mkdir -p $@
+
+../lib : ; mkdir $@
+
+./fallback.c : $(tinfo)/MKfallback.sh
+	$(SHELL) -e $(tinfo)/MKfallback.sh $(TERMINFO) $(TERMINFO_SRC) "$(TIC_PATH)" "$(INFOCMP_PATH)" $(FALLBACK_LIST) >$@
+
+./lib_gen.c : $(base)/MKlib_gen.sh ../include/curses.h
+	FGREP="@FGREP@" $(SHELL) -e $(base)/MKlib_gen.sh "$(CPP) $(CPPFLAGS)" "$(AWK)" generated <../include/curses.h >$@
+
+init_keytry.h : make_keys$(BUILD_EXEEXT) keys.list
+	./make_keys$(BUILD_EXEEXT) keys.list > $@
+
+keys.list :	$(tinfo)/MKkeys_list.sh
+	AWK=$(AWK) $(SHELL) $(tinfo)/MKkeys_list.sh $(CAPLIST) | LC_ALL=C sort >$@
+
+make_keys$(BUILD_EXEEXT) : \
+		build.priv.h \
+		$(tinfo)/make_keys.c \
+		./names.c
+	$(BUILD_CC) -o $@ $(BUILD_CPPFLAGS) $(BUILD_CCFLAGS) $(tinfo)/make_keys.c $(BUILD_LDFLAGS) $(BUILD_LIBS)
+
+make_hash$(BUILD_EXEEXT) : \
+		build.priv.h \
+		$(tinfo)/make_hash.c \
+		../include/hashsize.h
+	$(BUILD_CC) -o $@ $(BUILD_CPPFLAGS) $(BUILD_CCFLAGS) $(tinfo)/make_hash.c $(BUILD_LDFLAGS) $(BUILD_LIBS)
+
+report_offsets$(BUILD_EXEEXT) : \
+		$(srcdir)/curses.priv.h \
+		$(srcdir)/report_offsets.c
+	$(BUILD_CC) -o $@ $(BUILD_CPPFLAGS) $(BUILD_CCFLAGS) $(srcdir)/report_offsets.c $(BUILD_LDFLAGS) $(BUILD_LIBS)
+	./report_offsets$(BUILD_EXEEXT)
+
+./expanded.c : $(srcdir)/curses.priv.h $(serial)/MKexpanded.sh
+	$(SHELL) -e $(serial)/MKexpanded.sh "$(CPP)" $(CPPFLAGS) > $@
+
+./comp_captab.c: \
+		make_hash$(BUILD_EXEEXT) \
+		../include/hashsize.h \
+		$(tinfo)/MKcaptab.sh \
+		$(tinfo)/MKcaptab.awk
+	$(SHELL) -e $(tinfo)/MKcaptab.sh $(AWK) $(USE_BIG_STRINGS) $(tinfo)/MKcaptab.awk $(CAPLIST) > $@
+
+./comp_userdefs.c: \
+		make_hash$(BUILD_EXEEXT) \
+		../include/hashsize.h \
+		$(tinfo)/MKuserdefs.sh
+	$(SHELL) -e $(tinfo)/MKuserdefs.sh $(AWK) $(USE_BIG_STRINGS) $(CAPLIST) > $@
+
+./lib_keyname.c: keys.list $(base)/MKkeyname.awk
+	$(AWK) -f $(base)/MKkeyname.awk bigstrings=$(USE_BIG_STRINGS) keys.list > $@
+
+./codes.c: $(tinfo)/MKcodes.awk
+	$(AWK) -f $(tinfo)/MKcodes.awk bigstrings=$(USE_BIG_STRINGS) $(CAPLIST) >$@
+
+./names.c: $(tinfo)/MKnames.awk
+	$(AWK) -f $(tinfo)/MKnames.awk bigstrings=$(USE_BIG_STRINGS) $(CAPLIST) >$@
+
+./unctrl.c: $(base)/MKunctrl.awk
+	echo | $(AWK) -f $(base)/MKunctrl.awk bigstrings=$(USE_BIG_STRINGS) >$@
+
+tags:
+	$(CTAGS) *.[ch] */*.[ch]
+
+@MAKE_UPPER_TAGS@TAGS:
+@MAKE_UPPER_TAGS@	$(ETAGS) *.[ch] */*.[ch]
+
+mostlyclean ::
+	-rm -f core tags TAGS *~ *.bak *.i *.ln *.atac
+	-test -d trace || rm -f trace
+	-rm -f $(TEST_PROGS)
+
+clean :: mostlyclean
+	-rm -f $(AUTO_SRC)
+	-rm -f make_keys$(BUILD_EXEEXT)
+	-rm -f make_hash$(BUILD_EXEEXT)
+	-rm -f report_offsets$(BUILD_EXEEXT)
+	-rm -rf .libs *.dSYM *.map
+
+distclean :: clean
+	-rm -f Makefile
+
+realclean :: distclean
+
+# These rules are used to allow "make -n" to work on a clean directory-tree
+../include/hashsize.h \
+../include/parametrized.h \
+../include/term.h :
+	( cd ../include && $(MAKE) $(TOP_MFLAGS) )
+
+# These rules build test-programs for the modules that have test-drivers
+@MAKE_PHONY@.PHONY :	test_progs
+test_progs : $(TEST_PROGS)
+
+./link_test.c : $(base)/MKlib_gen.sh ../include/curses.h
+	FGREP="@FGREP@" $(SHELL) -e $(base)/MKlib_gen.sh "$(CPP) $(CPPFLAGS)" "$(AWK)" implemented <../include/curses.h >$@
+
+captoinfo$x : $(tinfo)/captoinfo.c $(TEST_DEPS)
+	@ECHO_LD@ $(LIBTOOL_LINK) -o $@ $(CFLAGS_DEFAULT) -DMAIN $(tinfo)/captoinfo.c $(TEST_LDFLAGS)
+
+hardscroll$x : $(serial)/hardscroll.c $(TEST_DEPS)
+	@ECHO_LD@ $(LIBTOOL_LINK) -o $@ $(CFLAGS_DEFAULT) -DSCROLLDEBUG $(serial)/hardscroll.c $(TEST_LDFLAGS)
+
+hashmap$x : $(serial)/hashmap.c $(serial)/hardscroll.c $(TEST_DEPS)
+	@ECHO_LD@ $(LIBTOOL_LINK) -o $@ $(CFLAGS_DEFAULT) -DHASHDEBUG $(serial)/hashmap.c $(serial)/hardscroll.c $(TEST_LDFLAGS)
+
+lib_mvcur$x : $(serial)/lib_mvcur.c $(TEST_DEPS) \
+		../@DFT_OBJ_SUBDIR@/dump_entry$o
+	@ECHO_LD@ $(LIBTOOL_LINK) -o $@ $(CFLAGS_DEFAULT) -DNCURSES_TEST -I$(serial)/../../progs $(serial)/lib_mvcur.c ../@DFT_OBJ_SUBDIR@/dump_entry$o $(TEST_LDFLAGS)
+
+link_test$x : ./link_test.c $(TEST_DEPS) \
+		../@DFT_OBJ_SUBDIR@/link_test$o
+	@ECHO_LD@ $(CC) -o $@ $(CFLAGS_DEFAULT) ../@DFT_OBJ_SUBDIR@/link_test$o $(TEST_LDFLAGS)
+
+../@DFT_OBJ_SUBDIR@/dump_entry$o:
+	( cd ../progs && $(MAKE) ../@DFT_OBJ_SUBDIR@/dump_entry$o )
+
+report_hashing$x : \
+		$(srcdir)/curses.priv.h \
+		$(srcdir)/report_hashing.c $(TEST_DEPS)
+	@ECHO_LD@ $(CC) -o $@ $(CFLAGS_DEFAULT) report_hashing.c $(TEST_LDFLAGS)
+
+# Verify that each header-file can be compiled without including another.
+@MAKE_PHONY@.PHONY :	check_headers
+check_headers:
+	@$(SHELL) -c "for header in *.h;\
+		do \
+			echo \"** testing \$${header}\" ; \
+			echo \"#include <\$${header}>\" >headers.c; \
+			echo \"int main(void) { return 0; }\" >>headers.c; \
+			$(CC) -c $(CFLAGS) $(CPPFLAGS) headers.c; \
+		done"
+	-@rm -f headers.*
+
+@MAKE_PHONY@.PHONY :	check_objects
+check_objects: test_progs
+
+check :: check_headers check_objects
+
+###############################################################################
+# The remainder of this file is automatically generated during configuration
+###############################################################################
diff --git a/ncurses/README b/ncurses/README
new file mode 100644
index 0000000..f52a652
--- /dev/null
+++ b/ncurses/README
@@ -0,0 +1,51 @@
+-------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                           --
+-- Copyright 1998-2006,2009 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: README,v 1.11 2020/02/02 23:34:34 tom Exp $
+-------------------------------------------------------------------------------
+For discussion of the package internals, see hackguide.html in the doc/html
+directory.
+
+-------------------------------------------------------------------------------
+The llib-lXXXX files could be used as lint-library sources (and were, at one
+time).  However, they are actually used as a documentation aid to keep track
+of changes to the public/private interfaces in ncurses.  Most of the text in
+these files is generated using cproto; some manual cleanup and adjustment of
+types (to reflect #define's in curses.h) is needed.  The functions listed in
+the llib-lXXXX files do not correspond to the default configure options; some
+additional ones are added to include "all" of the entrypoints for each of the
+major configurations (normal, wide-character, threaded):
+
+	--disable-macros
+	--disable-root-environ
+	--enable-expanded
+	--enable-getcap
+	--enable-getcap-cache
+	--enable-sp-funcs
+	--enable-termcap
+	--with-develop
diff --git a/ncurses/README.IZ b/ncurses/README.IZ
new file mode 100644
index 0000000..a9e52ea
--- /dev/null
+++ b/ncurses/README.IZ
@@ -0,0 +1,96 @@
+-------------------------------------------------------------------------------
+-- Copyright 2020,2021 Thomas E. Dickey                                      --
+-- Copyright 2002,2006 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: README.IZ,v 1.5 2021/06/17 21:20:30 tom Exp $
+---------------------------------------------------------------------
+
+Here is the patch.  I did no testing whatsoever with event watching
+requests present (I need some applications which exercise this before
+this, probably lynx ;-), but the code looks working "the normal way".
+
+I had no way to test that the poll() branch compiles/works...
+
+Here is the API:
+
+*) two new functions wgetch_events() wgetstrn_event() are introduced,
+   which allow an event-watch specification given as the last argument;
+
+*) if the last argument is NULL, they behave as wgetch() and
+   wgetstrn() (TESTED!);
+
+*) the event specification is a pointer to _nc_eventlist, which
+   contains bookkeeping elements (count and the summary of results),
+   and an array of pointers to _nc_event;
+
+*) each _nc_event is a typed union, with two types supported "as
+   shipped": _NC_EVENT_TIMEOUT_MSEC, _NC_EVENT_FILE.  For
+   _NC_EVENT_FILE the fields are fd, flag, and the output field.
+
+*) The only supported flag "as shipped" is _NC_EVENT_FILE_READABLE.
+   If the file was found readable, the return field is set to this,
+   otherwise to 0;
+
+*) If these functions return KEY_EVENT, this means that the return
+   fields in both the _nc_eventlist and _nc_event structures make
+   sense.  The field result_flags of _nc_eventlist may have a
+   combination of bits _NC_EVENT_TIMEOUT_MSEC and _NC_EVENT_FILE_READABLE
+   set;
+
+*) The timeout_msec field of _NC_EVENT_TIMEOUT_MSEC _nc_event's is
+   updated on return, even if the return is not KEY_EVENT.  However,
+   the change in the value represents only the amount of time spent in
+   waiting for events, not the amount of time spent bookkeeping;
+
+*) the return KEY_EVENT of wgetstrn_event() means that the output
+   string includes the user input typed so far, but the user did not have
+   a chance to press ENTER (or whatever).  This call should be
+   repeated (with "shifted" pointer to a buffer, of course) to
+   complete the input;
+
+*) The presence of this extension can be checked via inspecting
+   #ifdef NCURSES_EVENT_VERSION.  This symbol is not defined on BeOS,
+   since there is no support for this on BeOS.
+
+Known issues:  calls interrupted by KEY_EVENT reset the ESCDELAY
+timer.  This is not entirely new, since other synthetic events behave
+the same (see "if (ch >= KEY_MIN)" branch of kgetch()).  However,
+KEY_EVENT may be generated in a continuous stream (say, when
+downloading a file), thus this may be more important than with other
+synthetic keys.  An additional field in window structure which keeps
+timestamp of the first raw key in the queue may be needed to
+circumvent this.
+
+Another possible issue: KEY_EVENT has a preference over a user input,
+so a stream of KEY_EVENT's can make input hard.  Maybe use
+result_flags as in input parameter too, which specifies whether the
+user input should have higher precedence?
+
+Also: I took an opportunity to document kgetch() better.
+
+Enjoy,
+Ilya
diff --git a/ncurses/SigAction.h b/ncurses/SigAction.h
new file mode 100644
index 0000000..30f2474
--- /dev/null
+++ b/ncurses/SigAction.h
@@ -0,0 +1,110 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2003,2005 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ ****************************************************************************/
+
+/*
+ * $Id: SigAction.h,v 1.10 2020/02/02 23:34:34 tom Exp $
+ *
+ * This file exists to handle non-POSIX systems which don't have <unistd.h>,
+ * and usually no sigaction() nor <termios.h>
+ */
+
+#ifndef _SIGACTION_H
+#define _SIGACTION_H
+
+#ifndef HAVE_SIGACTION
+#define HAVE_SIGACTION 0
+#endif
+
+#ifndef HAVE_SIGVEC
+#define HAVE_SIGVEC 0
+#endif
+
+#if HAVE_SIGACTION
+
+#if !HAVE_TYPE_SIGACTION
+typedef struct sigaction sigaction_t;
+#endif
+
+#else	/* !HAVE_SIGACTION */
+
+#if HAVE_SIGVEC
+
+#undef  SIG_BLOCK
+#define SIG_BLOCK       00
+
+#undef  SIG_UNBLOCK
+#define SIG_UNBLOCK     01
+
+#undef  SIG_SETMASK
+#define SIG_SETMASK     02
+
+ 	/*
+	 * <bsd/signal.h> is in the Linux 1.2.8 + gcc 2.7.0 configuration,
+	 * and is useful for testing this header file.
+	 */
+#if HAVE_BSD_SIGNAL_H
+#include <bsd/signal.h>
+#endif
+
+typedef struct sigvec sigaction_t;
+
+#define sigset_t _nc_sigset_t
+typedef unsigned long sigset_t;
+
+#undef  sa_mask
+#define sa_mask sv_mask
+#undef  sa_handler
+#define sa_handler sv_handler
+#undef  sa_flags
+#define sa_flags sv_flags
+
+#undef  sigaction
+#define sigaction   _nc_sigaction
+#undef  sigprocmask
+#define sigprocmask _nc_sigprocmask
+#undef  sigemptyset
+#define sigemptyset _nc_sigemptyset
+#undef  sigsuspend
+#define sigsuspend  _nc_sigsuspend
+#undef  sigdelset
+#define sigdelset   _nc_sigdelset
+#undef  sigaddset
+#define sigaddset   _nc_sigaddset
+
+/* tty/lib_tstp.c is the only user */
+#include <base/sigaction.c>
+
+#endif /* HAVE_SIGVEC */
+#endif /* HAVE_SIGACTION */
+#endif /* !defined(_SIGACTION_H) */
diff --git a/ncurses/base/MKkeyname.awk b/ncurses/base/MKkeyname.awk
new file mode 100644
index 0000000..b3d04ee
--- /dev/null
+++ b/ncurses/base/MKkeyname.awk
@@ -0,0 +1,178 @@
+# $Id: MKkeyname.awk,v 1.51 2020/02/02 23:34:34 tom Exp $
+##############################################################################
+# Copyright 2020 Thomas E. Dickey                                            #
+# Copyright 1998-2016,2017 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.                                                             #
+##############################################################################
+BEGIN {
+	print "/* generated by MKkeyname.awk */"
+	print ""
+	print "#include <curses.priv.h>"
+	print "#include <tic.h>"
+	print ""
+	first = 1;
+}
+
+/^[^#]/ {
+		if (bigstrings) {
+			if (first)  {
+				print "struct kn { short offset; int code; };"
+				print "static const struct kn _nc_key_names[] = {"
+			}
+			printf "\t{ %d, %s },\n", offset, $1
+			offset += length($1) + 1
+			names = names"\n\t\""$1"\\0\""
+		} else {
+			if (first) {
+				print "struct kn { const char *name; int code; };"
+				print "static const struct kn _nc_key_names[] = {"
+			}
+			printf "\t{ \"%s\", %s },\n", $1, $1;
+		}
+		first = 0;
+	}
+
+END {
+	if (bigstrings) {
+		printf "\t{ -1, 0 }};\n"
+		print ""
+		print "static const char key_names[] = "names";"
+	} else {
+		printf "\t{ 0, 0 }};\n"
+	}
+	print ""
+	print "#define SIZEOF_TABLE 256"
+	print "#define MyTable _nc_globals.keyname_table"
+	print "#define MyInit  _nc_globals.init_keyname"
+	print ""
+	print "NCURSES_EXPORT(NCURSES_CONST char *)"
+	print "safe_keyname (SCREEN *sp, int c)"
+	print "{"
+	print "	char name[20];"
+	print "	NCURSES_CONST char *result = 0;"
+	print ""
+	print "	if (c == -1) {"
+	print "		result = \"-1\";"
+	print "	} else {"
+	print "		int i;"
+	if (bigstrings) {
+		print "		for (i = 0; _nc_key_names[i].offset != -1; i++) {"
+		print "			if (_nc_key_names[i].code == c) {"
+		print "				result = (NCURSES_CONST char *)key_names + _nc_key_names[i].offset;"
+		print "				break;"
+		print "			}"
+		print "		}"
+	} else {
+		print "		for (i = 0; _nc_key_names[i].name != 0; i++) {"
+		print "			if (_nc_key_names[i].code == c) {"
+		print "				result = (NCURSES_CONST char *)_nc_key_names[i].name;"
+		print "				break;"
+		print "			}"
+		print "		}"
+	}
+	print ""
+	print "		if (result == 0 && (c >= 0 && c < SIZEOF_TABLE)) {"
+	print "			if (MyTable == 0)"
+	print "				MyTable = typeCalloc(char *, SIZEOF_TABLE);"
+	print ""
+	print "			if (MyTable != 0) {"
+	print "				int m_prefix = (sp == 0 || sp->_use_meta);"
+	print ""
+	print "				/* if sense of meta() changed, discard cached data */"
+	print "				if (MyInit != (m_prefix + 1)) {"
+	print "					MyInit = m_prefix + 1;"
+	print "					for (i = 0; i < SIZEOF_TABLE; ++i) {"
+	print "						if (MyTable[i]) {"
+	print "							FreeAndNull(MyTable[i]);"
+	print "						}"
+	print "					}"
+	print "				}"
+	print ""
+	print "				/* create and cache result as needed */"
+	print "				if (MyTable[c] == 0) {"
+	print "					int cc = c;"
+	print "					char *p = name;"
+	print "#define P_LIMIT (sizeof(name) - (size_t) (p - name))"
+	print "					if (cc >= 128 && m_prefix) {"
+	print "						_nc_STRCPY(p, \"M-\", P_LIMIT);"
+	print "						p += 2;"
+	print "						cc -= 128;"
+	print "					}"
+	print "					if (cc < 32)"
+	print "						_nc_SPRINTF(p, _nc_SLIMIT(P_LIMIT) \"^%c\", cc + '@');"
+	print "					else if (cc == 127)"
+	print "						_nc_STRCPY(p, \"^?\", P_LIMIT);"
+	print "					else"
+	print "						_nc_SPRINTF(p, _nc_SLIMIT(P_LIMIT) \"%c\", cc);"
+	print "					MyTable[c] = strdup(name);"
+	print "				}"
+	print "				result = MyTable[c];"
+	print "			}"
+	print "#if NCURSES_EXT_FUNCS && NCURSES_XNAMES"
+	print "		} else if (result == 0 && HasTerminal(sp)) {"
+	print "			int j, k;"
+	print "			char * bound;"
+	print "			TERMTYPE2 *tp = &TerminalType(TerminalOf(sp));"
+	print "			unsigned save_trace = _nc_tracing;"
+	print ""
+	print "			_nc_tracing = 0;	/* prevent recursion via keybound() */"
+	print "			for (j = 0; (bound = NCURSES_SP_NAME(keybound)(NCURSES_SP_ARGx c, j)) != 0; ++j) {"
+	print "				for(k = STRCOUNT; k < (int) NUM_STRINGS(tp);  k++) {"
+	print "					if (tp->Strings[k] != 0 && !strcmp(bound, tp->Strings[k])) {"
+	print "						result = ExtStrname(tp, k, strnames);"
+	print "						break;"
+	print "					}"
+	print "				}"
+	print "				free(bound);"
+	print "				if (result != 0)"
+	print "					break;"
+	print "			}"
+	print "			_nc_tracing = save_trace;"
+	print "#endif"
+	print "		}"
+	print "	}"
+	print "	return result;"
+	print "}"
+	print ""
+	print "NCURSES_EXPORT(NCURSES_CONST char *)"
+	print "keyname (int c)"
+	print "{"
+	print "	return safe_keyname (CURRENT_SCREEN, c);"
+	print "}"
+	print ""
+	print "#if NO_LEAKS"
+	print "void _nc_keyname_leaks(void)"
+	print "{"
+	print "	if (MyTable != 0) {"
+	print "		int j;"
+	print "		for (j = 0; j < SIZEOF_TABLE; ++j) {"
+	print "			FreeIfNeeded(MyTable[j]);"
+	print "		}"
+	print "		FreeAndNull(MyTable);"
+	print "	}"
+	print "}"
+	print "#endif /* NO_LEAKS */"
+}
diff --git a/ncurses/base/MKlib_gen.sh b/ncurses/base/MKlib_gen.sh
new file mode 100755
index 0000000..f0ac045
--- /dev/null
+++ b/ncurses/base/MKlib_gen.sh
@@ -0,0 +1,529 @@
+#!/bin/sh
+#
+# MKlib_gen.sh -- generate sources from curses.h macro definitions
+#
+# ($Id: MKlib_gen.sh,v 1.73 2022/10/01 13:14:20 tom Exp $)
+#
+##############################################################################
+# Copyright 2018-2021,2022 Thomas E. Dickey                                  #
+# Copyright 1998-2016,2017 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.                                                             #
+##############################################################################
+#
+# The XSI Curses standard requires all curses entry points to exist as
+# functions, even though many definitions would normally be shadowed
+# by macros.  Rather than hand-hack all that code, we actually
+# generate functions from the macros.
+#
+# This script accepts a file of prototypes on standard input.  It discards
+# any that don't have a `generated' comment attached. It then parses each
+# prototype (relying on the fact that none of the macros take function
+# pointer or array arguments) and generates C source from it.
+#
+# Here is what the pipeline stages are doing:
+#
+# 1. sed: extract prototypes of generated functions
+# 2. sed: decorate prototypes with generated arguments a1. a2,...z
+# 3. awk: generate the calls with args matching the formals
+# 4. sed: prefix function names in prototypes so the preprocessor won't expand
+#         them.
+# 5. cpp: macro-expand the file so the macro calls turn into C calls
+# 6. awk: strip the expansion junk off the front and add the new header
+# 7. sed: squeeze spaces, strip off gen_ prefix.
+#
+
+# keep the editing independent of locale:
+if test "${LANGUAGE+set}"    = set; then LANGUAGE=C;    export LANGUAGE;    fi
+if test "${LANG+set}"        = set; then LANG=C;        export LANG;        fi
+if test "${LC_ALL+set}"      = set; then LC_ALL=C;      export LC_ALL;      fi
+if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+if test "${LC_CTYPE+set}"    = set; then LC_CTYPE=C;    export LC_CTYPE;    fi
+if test "${LC_COLLATE+set}"  = set; then LC_COLLATE=C;  export LC_COLLATE;  fi
+
+preprocessor="$1 -DNCURSES_WATTR_MACROS -DNCURSES_INTERNALS -I../include"
+AWK="$2"
+USE="$3"
+
+# A patch discussed here:
+#	https://gcc.gnu.org/ml/gcc-patches/2014-06/msg02185.html
+#
+# introduces spurious #line markers into the preprocessor output.  The result
+# appears in gcc 5.0 and (with modification) in 5.1, making it necessary to
+# determine if we are using gcc, and if so, what version because the proposed
+# solution uses a nonstandard option.
+#
+# As illustrated in
+#	https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60723
+#
+# gcc developers chose to ignore the problems with this, and summarized those
+# as "intriguing problems" in
+#	https://gcc.gnu.org/gcc-5/porting_to.html
+
+PRG=`echo "$1" | "$AWK" '{ sub(/^[ 	]*/,""); sub(/[ 	].*$/, ""); print; }' || exit 0`
+FSF=`("$PRG" --version 2>/dev/null || exit 0) | ${FGREP-grep -F} "Free Software Foundation" | head -n 1`
+ALL=`"$PRG" -dumpversion 2>/dev/null || exit 0`
+ONE=`echo "$ALL" | sed -e 's/[^0-9].*$//'`
+if test -n "$FSF" && test -n "$ALL" && test -n "$ONE" ; then
+	if test "$ONE" -ge 5 ; then
+		echo ".. adding -P option to work around $PRG $ALL" >&2
+		preprocessor="$preprocessor -P"
+	fi
+fi
+
+PID=$$
+ED1=sed1_${PID}.sed
+ED2=sed2_${PID}.sed
+ED3=sed3_${PID}.sed
+ED4=sed4_${PID}.sed
+AW1=awk1_${PID}.awk
+AW2=awk2_${PID}.awk
+TMP=gen__${PID}.c
+trap "rm -f $ED1 $ED2 $ED3 $ED4 $AW1 $AW2 $TMP; exit 1" 1 2 3 15
+trap "rm -f $ED1 $ED2 $ED3 $ED4 $AW1 $AW2 $TMP" 0
+
+ALL=$USE
+if test "$USE" = implemented ; then
+	cat >$ED1 <<EOF1
+/^extern.*implemented/{
+	h
+	s/GCC_DEPRECATED([^)]*)//
+	s/NCURSES_SP_NAME(\([^)]*\))/NCURSES_SP_NAME___\1/
+	h
+	s/^.*implemented:\([^ 	*]*\).*/P_POUNDCif_USE_\1_SUPPORT/p
+	g
+	s/^extern \([^;]*\);.*/\1/p
+	g
+	s/^.*implemented:\([^ 	*]*\).*/P_POUNDCendif/p
+}
+/^extern.*generated/{
+	h
+	s/^.*generated:\([^ 	*]*\).*/P_POUNDCif_USE_\1_SUPPORT/p
+	g
+	s/^extern \([^;]*\);.*/\1/p
+	g
+	s/^.*generated:\([^ 	*]*\).*/P_POUNDCendif/p
+}
+EOF1
+else
+	cat >$ED1 <<EOF1
+/^extern.*${ALL}/{
+	h
+	s/^.*${ALL}:\([^ 	*]*\).*/P_POUNDCif_USE_\1_SUPPORT/p
+	g
+	s/^extern \([^;]*\);.*/\1/p
+	g
+	s/^.*${ALL}:\([^ 	*]*\).*/P_POUNDCendif/p
+}
+EOF1
+fi
+
+cat >$ED2 <<EOF2
+/^P_/b nc
+/(void)/b nc
+	s/,/ a1% /
+	s/,/ a2% /
+	s/,/ a3% /
+	s/,/ a4% /
+	s/,/ a5% /
+	s/,/ a6% /
+	s/,/ a7% /
+	s/,/ a8% /
+	s/,/ a9% /
+	s/,/ a10% /
+	s/,/ a11% /
+	s/,/ a12% /
+	s/,/ a13% /
+	s/,/ a14% /
+	s/,/ a15% /
+	s/*/ * /g
+	s/%/ , /g
+	s/)/ z)/
+	s/\.\.\. z)/...)/
+:nc
+	s/(/ ( /
+	s/)/ )/
+EOF2
+
+cat >$ED3 <<EOF3
+/^P_/{
+	s/^P_POUNDCif_/#if /
+	s/^P_POUNDCendif/#endif/
+	s/^P_//
+	b done
+}
+	s/		*/ /g
+	s/  */ /g
+	s/ ,/,/g
+	s/( /(/g
+	s/ )/)/g
+	s/ gen_/ /
+	s/^[ 	]*@[ 	]*@[ 	]*/	/
+:done
+EOF3
+
+if test "$USE" = generated ; then
+cat >$ED4 <<EOF
+	s/^\(.*\) \(.*\) (\(.*\))\$/NCURSES_EXPORT(\1) \2 (\3)/
+	/attr_[sg]et.* z)/s,z),z GCC_UNUSED),
+EOF
+else
+cat >$ED4 <<EOF
+/^\(.*\) \(.*\) (\(.*\))\$/ {
+	h
+	s/^\(.*\) \(.*\) (\(.*\))\$/extern \1 call_\2 (\3);/
+	p
+	g
+	s/^\(.*\) \(.*\) (\(.*\))\$/\1 call_\2 (\3)/
+	}
+s/\([^_]\)NCURSES_SP_NAME___\([a-zA-Z][a-zA-Z_]*\)/\1NCURSES_SP_NAME(\2)/g
+EOF
+fi
+
+cat >$AW1 <<\EOF1
+BEGIN	{
+		skip=0;
+	}
+/^P_POUNDCif/ {
+		print "\n"
+		print $0
+		skip=0;
+}
+/^P_POUNDCendif/ {
+		print $0
+		skip=1;
+}
+$0 !~ /^P_/ {
+	if (skip)
+		print "\n"
+	skip=1;
+
+	first=$1
+	for (i = 1; i <= NF; i++) {
+		if ( $i != "NCURSES_CONST" ) {
+			first = i;
+			break;
+		}
+	}
+	second = first + 1;
+	returnCast = "";
+	if ( $first == "chtype" ) {
+		returnType = "Chtype";
+	} else if ( $first == "SCREEN" ) {
+		returnType = "SP";
+	} else if ( $first == "WINDOW" ) {
+		returnType = "Win";
+	} else if ( $first == "attr_t" || $second == "attrset" || $second == "standout" || $second == "standend" || $second == "wattrset" || $second == "wstandout" || $second == "wstandend" ) {
+		returnType = "IntAttr";
+		returnCast = "(attr_t)";
+	} else if ( $first == "bool" || $first == "NCURSES_BOOL" ) {
+		returnType = "Bool";
+	} else if ( $second == "*" ) {
+		returnType = ($1 == "NCURSES_CONST") ? "CPtr" : "Ptr";
+	} else {
+		returnType = "Code";
+	}
+	myfunc = second;
+	for (i = second; i <= NF; i++) {
+		if ($i != "*") {
+			myfunc = i;
+			break;
+		}
+	}
+	if (using == "implemented") {
+		printf "#undef %s\n", $myfunc;
+	}
+	print $0;
+	print "{";
+	argcount = 1;
+	check = NF - 1;
+	if ($check == "void")
+		argcount = 0;
+	if (argcount != 0) {
+		for (i = 1; i <= NF; i++)
+			if ($i == ",")
+				argcount++;
+	}
+
+	# suppress trace-code for functions that we cannot do properly here,
+	# since they return data.
+	dotrace = 1;
+	if ($myfunc ~ /innstr/)
+		dotrace = 0;
+	if ($myfunc ~ /innwstr/)
+		dotrace = 0;
+
+	# workaround functions that we do not parse properly
+	if ($myfunc ~ /ripoffline/) {
+		dotrace = 0;
+		argcount = 2;
+		if ($myfunc ~ /NCURSES_SP_NAME/) {
+			argcount = 3;
+		}
+	}
+	if ($myfunc ~ /wunctrl/) {
+		dotrace = 0;
+	}
+
+	do_getstr = 0;
+	if ($myfunc ~ /get[n]?str/) {
+		do_getstr = 1;
+	}
+
+	call = "@@T((T_CALLED(\""
+	args = ""
+	comma = ""
+	num = 0;
+	pointer = 0;
+	va_list = 0;
+	varargs = 0;
+	argtype = ""
+	for (i = myfunc; i <= NF; i++) {
+		ch = $i;
+		if ( ch == "*" ) {
+			pointer = 1;
+		} else if ( ch == "va_list" ) {
+			va_list = 1;
+		} else if ( ch == "..." ) {
+			varargs = 1;
+		} else if ( ch == "char" ) {
+			argtype = "char";
+		} else if ( ch == "int" ) {
+			argtype = "int";
+		} else if ( ch == "short" ) {
+			argtype = "short";
+		} else if ( ch == "chtype" ) {
+			argtype = "chtype";
+		} else if ( ch == "attr_t" || ch == "NCURSES_ATTR_T" ) {
+			argtype = "attr";
+		}
+
+		if ( ch == "," || ch == ")" ) {
+			argcast = "";
+			if (va_list) {
+				call = call "%s"
+			} else if (varargs) {
+				call = call "%s"
+			} else if (pointer) {
+				if ( argtype == "char" ) {
+					if (do_getstr) {
+						call = call "%p"
+					} else {
+						call = call "%s"
+					}
+					comma = comma "_nc_visbuf2(" num ","
+					pointer = 0;
+				} else {
+					call = call "%p"
+					comma = comma "(const void *)"
+				}
+			} else if (argcount != 0) {
+				if ( argtype == "int" || argtype == "short" ) {
+					call = call "%d"
+					argtype = ""
+				} else if ( argtype != "" ) {
+					call = call "%s"
+					comma = comma "_trace" argtype "2(" num ","
+					if (argtype == "attr") {
+						argcast = "(chtype)";
+					}
+				} else {
+					call = call "%#lx"
+					comma = comma "(long)"
+				}
+			}
+			if (ch == ",") {
+				args = args comma "a" ++num;
+			} else if ( argcount != 0 ) {
+				if ( va_list ) {
+					args = args comma "\"va_list\""
+				} else if ( varargs ) {
+					args = args comma "\"...\""
+				} else {
+					args = args comma argcast "z"
+				}
+			}
+			call = call ch
+			if (pointer == 0 && argcount != 0 && argtype != "" )
+				args = args ")"
+			if (args != "")
+				comma = ", "
+			pointer = 0;
+			argtype = ""
+		}
+		if ( i == myfunc || ch == "(" )
+			call = call ch
+	}
+	call = call "\")"
+	if (args != "")
+		call = call ", " args
+	call = call ")); "
+
+	if (dotrace)
+		printf "%s\n\t@@", call
+
+	if (match($0, "^void")) {
+		call = ""
+	} else if (dotrace) {
+		call = sprintf("return%s( ", returnType);
+		if (returnCast != "") {
+			call = call returnCast;
+		}
+	} else {
+		call = "@@return ";
+	}
+
+	call = call $myfunc "(";
+	for (i = 1; i < argcount; i++) {
+		if (i != 1)
+			call = call ", ";
+		call = call "a" i;
+	}
+	if ( argcount != 0 && $check != "..." ) {
+		if (argcount != 1)
+			call = call ", ";
+		call = call "z";
+	}
+	if (!match($0, "^void"))
+		call = call ") ";
+	if (dotrace) {
+		call = call ")";
+	}
+	print call ";"
+
+	if (match($0, "^void"))
+		print "@@returnVoid;"
+	print "}";
+}
+EOF1
+
+cat >$AW2 <<EOF1
+BEGIN		{
+		printf "/* This file was generated by $0 $USE */\n"
+		print ""
+		print "/*"
+		print " * DO NOT EDIT THIS FILE BY HAND!"
+		if ( "$USE" == "generated" ) {
+			print " *"
+			print " * This is a file of trivial functions generated from macro"
+			print " * definitions in curses.h to satisfy the XSI Curses requirement"
+			print " * that every macro also exist as a callable function."
+			print " *"
+			print " * It will never be linked unless you call one of the entry"
+			print " * points with its normal macro definition disabled.  In that"
+			print " * case, if you have no shared libraries, it will indirectly"
+			print " * pull most of the rest of the library into your link image."
+		}
+		print " */"
+		print "#define NCURSES_ATTR_T int"
+		print "#include <ncurses_cfg.h>"
+		print ""
+		print "#undef NCURSES_NOMACROS	/* _this_ file uses macros */"
+		print "#define NCURSES_NOMACROS 1"
+		print ""
+		print "#include <curses.priv.h>"
+		print ""
+		}
+/^DECLARATIONS/	{start = 1; next;}
+		{
+		if (start) {
+			if ( "$USE" == "generated" ) {
+				print \$0;
+			} else if ( \$0 ~ /^[{}]?\$/ ) {
+				print \$0;
+			} else if ( \$0 ~ /;/ ) {
+				print \$0;
+			} else {
+				calls[start] = \$0;
+				print \$0;
+				start++;
+			}
+		}
+		}
+END		{
+		if ( "$USE" != "generated" ) {
+			print "int main(void)"
+			print "{"
+			for (n = 1; n < start; ++n) {
+				value = calls[n];
+				if ( value !~ /P_POUNDC/ ) {
+					gsub(/[ \t]+/," ",value);
+					sub(/^[0-9a-zA-Z_]+ /,"",value);
+					sub(/^[*][ \t]*/,"",value);
+					gsub("struct[ \t]*[0-9a-zA-Z_]+[ \t]*[*]","",value);
+					gsub(/[0-9a-zA-Z_]+[ \t]*[*][ \t]*/,"",value);
+					gsub(/ (const) /," ",value);
+					gsub(/ (int|short|attr_t|chtype|wchar_t|NCURSES_BOOL|NCURSES_OUTC|NCURSES_OUTC_sp|va_list) /," ",value);
+					gsub(/ void /,"",value);
+					sub(/^/,"call_",value);
+					gsub(/ (a[0-9]|z) /, " 0 ", value);
+					gsub(/ int[ \t]*[(][^)]+[)][(][^)]+[)]/, "0", value);
+					printf "\t%s;\n", value;
+				} else {
+					print value;
+				}
+			}
+			print "	return 0;"
+			print "}"
+		}
+		}
+EOF1
+
+cat >$TMP <<EOF
+#include <ncurses_cfg.h>
+#undef NCURSES_NOMACROS
+#include <curses.h>
+#include <term.h>
+#include <unctrl.h>
+
+DECLARATIONS
+
+EOF
+
+sed -n -f $ED1 \
+| sed -e 's/NCURSES_EXPORT(\(.*\)) \(.*\) (\(.*\))/\1 \2(\3)/' \
+| sed -f $ED2 \
+| "$AWK" -f $AW1 using="$USE" \
+| sed \
+	-e 's/ [ ]*$//g' \
+	-e 's/^\([a-zA-Z_][a-zA-Z_]*[ *]*\)/\1 gen_/' \
+	-e 's/gen_$//' \
+	-e 's/  / /g' >>$TMP
+
+$preprocessor $TMP 2>/dev/null \
+| sed \
+	-e 's/  / /g' \
+	-e 's/^ //' \
+	-e 's/_Bool/NCURSES_BOOL/g' \
+| "$AWK" -f $AW2 \
+| sed -f $ED3 \
+| sed \
+	-e 's/^.*T_CALLED.*returnCode( \([a-z].*) \));/	return \1;/' \
+	-e 's/^.*T_CALLED.*returnCode( \((wmove.*) \));/	return \1;/' \
+	-e 's/gen_//' \
+	-e 's/^[ 	]*#/#/' \
+	-e '/#ident/d' \
+	-e '/#line/d' \
+| sed -f $ED4
diff --git a/ncurses/base/MKunctrl.awk b/ncurses/base/MKunctrl.awk
new file mode 100644
index 0000000..9a2a6db
--- /dev/null
+++ b/ncurses/base/MKunctrl.awk
@@ -0,0 +1,176 @@
+# $Id: MKunctrl.awk,v 1.29 2020/02/02 23:34:34 tom Exp $
+##############################################################################
+# Copyright 2020 Thomas E. Dickey                                            #
+# Copyright 1998-2012,2017 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey (1997-on)
+#
+
+BEGIN	{
+		print "/* generated by MKunctrl.awk */"
+		print ""
+		print "#include <curses.priv.h>"
+		print "#include <ctype.h>"
+		print ""
+		print "#undef unctrl"
+		print ""
+	}
+END	{
+		print "NCURSES_EXPORT(NCURSES_CONST char *) safe_unctrl(SCREEN *sp, chtype ch)"
+		print "{"
+		blob=""
+		offset=0
+		if (bigstrings) {
+			printf "static const short unctrl_table[] = {"
+		} else {
+			printf "static const char* const unctrl_table[] = {"
+		}
+		for ( ch = 0; ch < 256; ch++ ) {
+			gap = ","
+			part=""
+			if ((ch % 8) == 0) {
+				printf "\n    "
+				if (ch != 0)
+					blob = blob "\""
+				blob = blob "\n    \""
+			}
+			if (bigstrings)
+				printf "%4d%s", offset, gap;
+			if (ch < 32) {
+				part = sprintf ("^\\%03o", ch + 64);
+				offset = offset + 3;
+			} else if (ch == 127) {
+				part = "^?";
+				offset = offset + 3;
+			} else if (ch >= 128 && ch < 160) {
+				part = sprintf("~\\%03o", ch - 64);
+				offset = offset + 3;
+			} else if (ch == 255) {
+				part = "~?";
+				offset = offset + 3;
+			} else if (ch >= 160) {
+				part = sprintf("M-\\%03o", ch - 128);
+				offset = offset + 4;
+			} else {
+				gap = gap " "
+				part = sprintf("\\%03o", ch);
+				offset = offset + 2;
+			}
+			if (ch == 255)
+				gap = "\n"
+			else if (((ch + 1) % 8) != 0)
+				gap = gap " "
+			if (bigstrings) {
+				blob = blob part "\\0";
+			} else {
+				printf "\"%s\"%s", part, gap
+			}
+		}
+		print "};"
+		blob = blob "\"";
+
+		print ""
+		printf "#if NCURSES_EXT_FUNCS\n";
+		if (bigstrings) {
+			blob = blob "\n/* printable values in 128-255 range */"
+			printf "static const short unctrl_c1[] = {"
+		} else {
+			printf "static const char* const unctrl_c1[] = {"
+		}
+		for ( ch = 128; ch < 256; ch++ ) {
+			gap = ","
+			if ((ch % 8) == 0) {
+				if (ch != 128)
+					blob = blob "\""
+				printf "\n    "
+				blob = blob "\n    \""
+			}
+			if (bigstrings) {
+				printf "%4d%s", offset, gap;
+				part = sprintf("\\%03o\\0", ch);
+				blob = blob part
+				offset = offset + 2;
+				if (((ch + 1) % 8) != 0)
+					gap = gap " "
+			} else {
+				if (ch >= 128) {
+					printf "\"\\%03o\"", ch
+					gap = gap " "
+				}
+				if (ch == 255)
+					gap = "\n"
+				else if (((ch + 1) % 8) != 0)
+					gap = gap " "
+				printf "%s", gap
+			}
+		}
+		print "};"
+		print "#endif /* NCURSES_EXT_FUNCS */"
+		blob = blob "\"\n"
+
+		print ""
+		if (bigstrings) {
+			print "static const char unctrl_blob[] = "blob";"
+			print ""
+			stringname = "unctrl_blob + unctrl"
+		} else {
+			stringname = "unctrl"
+		}
+		print  "\tint check = (int) ChCharOf(ch);"
+		print  "\tconst char *result;"
+		print  ""
+		print  "(void) sp;"
+		print  "\tif (check >= 0 && check < (int)SIZEOF(unctrl_table)) {"
+		print  "#if NCURSES_EXT_FUNCS"
+		print  "\t\tif ((sp != 0)"
+		print  "\t\t && (sp->_legacy_coding > 1)"
+		print  "\t\t && (check >= 128)"
+		print  "\t\t && (check < 160))"
+		printf "\t\t\tresult = %s_c1[check - 128];\n", stringname;
+		print  "\t\telse"
+		print  "\t\tif ((check >= 160)"
+		print  "\t\t && (check < 256)"
+		print  "\t\t && ((sp != 0)"
+		print  "\t\t  && ((sp->_legacy_coding > 0)"
+		print  "\t\t   || (sp->_legacy_coding == 0"
+		print  "\t\t       && isprint(check)))))"
+		printf "\t\t\tresult = %s_c1[check - 128];\n", stringname;
+		print  "\t\telse"
+		print  "#endif /* NCURSES_EXT_FUNCS */"
+		printf "\t\t\tresult = %s_table[check];\n", stringname;
+		print  "\t} else {"
+		print  "\t\tresult = 0;"
+		print  "\t}"
+		print  "\treturn (NCURSES_CONST char *)result;"
+		print  "}"
+		print  ""
+		print  "NCURSES_EXPORT(NCURSES_CONST char *) unctrl (chtype ch)"
+		print  "{"
+		print  "\treturn safe_unctrl(CURRENT_SCREEN, ch);"
+		print  "}"
+	}
diff --git a/ncurses/base/README b/ncurses/base/README
new file mode 100644
index 0000000..2710b36
--- /dev/null
+++ b/ncurses/base/README
@@ -0,0 +1,36 @@
+-------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                           --
+-- Copyright 1998,2006 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: README,v 1.3 2020/02/02 23:34:34 tom Exp $
+-------------------------------------------------------------------------------
+
+The functions in this directory are the generic (not device-specific) modules
+of ncurses.
+
+As a rule, these modules should not depend directly on term.h references and
+associated terminfo function and variables.
diff --git a/ncurses/base/define_key.c b/ncurses/base/define_key.c
new file mode 100644
index 0000000..fb9ae36
--- /dev/null
+++ b/ncurses/base/define_key.c
@@ -0,0 +1,86 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2009,2014 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                        1997-on                 *
+ *     and: Juergen Pfeifer                         2009                    *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: define_key.c,v 1.22 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(define_key) (NCURSES_SP_DCLx const char *str, int keycode)
+{
+    int code = ERR;
+
+    T((T_CALLED("define_key(%p, %s,%d)"), (void *) SP_PARM, _nc_visbuf(str), keycode));
+    if (SP_PARM == 0 || !HasTInfoTerminal(SP_PARM)) {
+	code = ERR;
+    } else if (keycode > 0) {
+	unsigned ukey = (unsigned) keycode;
+
+#ifdef USE_TERM_DRIVER
+#define CallHasKey(keycode) CallDriver_1(SP_PARM, td_kyExist, keycode)
+#else
+#define CallHasKey(keycode) NCURSES_SP_NAME(has_key)(NCURSES_SP_ARGx keycode)
+#endif
+
+	if (str != 0) {
+	    NCURSES_SP_NAME(define_key) (NCURSES_SP_ARGx str, 0);
+	} else if (CallHasKey(keycode)) {
+	    while (_nc_remove_key(&(SP_PARM->_keytry), ukey))
+		code = OK;
+	}
+	if (str != 0) {
+	    if (NCURSES_SP_NAME(key_defined) (NCURSES_SP_ARGx str) == 0) {
+		if (_nc_add_to_try(&(SP_PARM->_keytry), str, ukey) == OK) {
+		    code = OK;
+		} else {
+		    code = ERR;
+		}
+	    } else {
+		code = ERR;
+	    }
+	}
+    } else {
+	while (_nc_remove_string(&(SP_PARM->_keytry), str))
+	    code = OK;
+    }
+    returnCode(code);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+define_key(const char *str, int keycode)
+{
+    return NCURSES_SP_NAME(define_key) (CURRENT_SCREEN, str, keycode);
+}
+#endif
diff --git a/ncurses/base/key_defined.c b/ncurses/base/key_defined.c
new file mode 100644
index 0000000..25d5a67
--- /dev/null
+++ b/ncurses/base/key_defined.c
@@ -0,0 +1,87 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 2003-2006,2009 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey, 2003                                          *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: key_defined.c,v 1.10 2020/02/02 23:34:34 tom Exp $")
+
+static int
+find_definition(TRIES * tree, const char *str)
+{
+    TRIES *ptr;
+    int result = OK;
+
+    if (str != 0 && *str != '\0') {
+	for (ptr = tree; ptr != 0; ptr = ptr->sibling) {
+	    if (UChar(*str) == UChar(ptr->ch)) {
+		if (str[1] == '\0' && ptr->child != 0) {
+		    result = ERR;
+		} else if ((result = find_definition(ptr->child, str + 1))
+			   == OK) {
+		    result = ptr->value;
+		} else if (str[1] == '\0') {
+		    result = ERR;
+		}
+	    }
+	    if (result != OK)
+		break;
+	}
+    }
+    return (result);
+}
+
+/*
+ * Returns the keycode associated with the given string.  If none is found,
+ * return OK.  If the string is only a prefix to other strings, return ERR.
+ * Otherwise, return the keycode's value (neither OK/ERR).
+ */
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(key_defined) (NCURSES_SP_DCLx const char *str)
+{
+    int code = ERR;
+
+    T((T_CALLED("key_defined(%p, %s)"), (void *) SP_PARM, _nc_visbuf(str)));
+    if (SP_PARM != 0 && str != 0) {
+	code = find_definition(SP_PARM->_keytry, str);
+    }
+
+    returnCode(code);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+key_defined(const char *str)
+{
+    return NCURSES_SP_NAME(key_defined) (CURRENT_SCREEN, str);
+}
+#endif
diff --git a/ncurses/base/keybound.c b/ncurses/base/keybound.c
new file mode 100644
index 0000000..bbd912a
--- /dev/null
+++ b/ncurses/base/keybound.c
@@ -0,0 +1,64 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1999-2009,2011 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                        1999-on                 *
+ *     and: Juergen Pfeifer                         2009                    *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: keybound.c,v 1.12 2020/02/02 23:34:34 tom Exp $")
+
+/*
+ * Returns the count'th string definition which is associated with the
+ * given keycode.  The result is malloc'd, must be freed by the caller.
+ */
+NCURSES_EXPORT(char *)
+NCURSES_SP_NAME(keybound) (NCURSES_SP_DCLx int code, int count)
+{
+    char *result = 0;
+
+    T((T_CALLED("keybound(%p, %d,%d)"), (void *) SP_PARM, code, count));
+    if (SP_PARM != 0 && code >= 0) {
+	result = _nc_expand_try(SP_PARM->_keytry,
+				(unsigned) code,
+				&count,
+				(size_t) 0);
+    }
+    returnPtr(result);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(char *)
+keybound(int code, int count)
+{
+    return NCURSES_SP_NAME(keybound) (CURRENT_SCREEN, code, count);
+}
+#endif
diff --git a/ncurses/base/keyok.c b/ncurses/base/keyok.c
new file mode 100644
index 0000000..945228a
--- /dev/null
+++ b/ncurses/base/keyok.c
@@ -0,0 +1,103 @@
+/****************************************************************************
+ * Copyright 2019-2020,2021 Thomas E. Dickey                                *
+ * Copyright 1998-2012,2014 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                        1997-on                 *
+ *     and: Juergen Pfeifer                         2009                    *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: keyok.c,v 1.17 2021/06/17 21:26:02 tom Exp $")
+
+/*
+ * Enable (or disable) ncurses' interpretation of a keycode by adding (or
+ * removing) the corresponding 'tries' entry.
+ *
+ * Do this by storing a second tree of tries, which records the disabled keys.
+ * The simplest way to copy is to make a function that returns the string (with
+ * nulls set to 0200), then use that to reinsert the string into the
+ * corresponding tree.
+ */
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(keyok) (NCURSES_SP_DCLx int c, bool flag)
+{
+    int code = ERR;
+
+    if (HasTerminal(SP_PARM)) {
+	T((T_CALLED("keyok(%p, %d,%d)"), (void *) SP_PARM, c, flag));
+#ifdef USE_TERM_DRIVER
+	code = CallDriver_2(sp, td_kyOk, c, flag);
+#else
+	if (c >= 0) {
+	    int count = 0;
+	    char *s;
+	    unsigned ch = (unsigned) c;
+
+	    if (flag) {
+		while ((s = _nc_expand_try(SP_PARM->_key_ok,
+					   ch, &count, (size_t) 0)) != 0) {
+		    if (_nc_remove_key(&(SP_PARM->_key_ok), ch)) {
+			code = _nc_add_to_try(&(SP_PARM->_keytry), s, ch);
+			free(s);
+			count = 0;
+			if (code != OK)
+			    break;
+		    } else {
+			free(s);
+		    }
+		}
+	    } else {
+		while ((s = _nc_expand_try(SP_PARM->_keytry,
+					   ch, &count, (size_t) 0)) != 0) {
+		    if (_nc_remove_key(&(SP_PARM->_keytry), ch)) {
+			code = _nc_add_to_try(&(SP_PARM->_key_ok), s, ch);
+			free(s);
+			count = 0;
+			if (code != OK)
+			    break;
+		    } else {
+			free(s);
+		    }
+		}
+	    }
+	}
+#endif
+    }
+    returnCode(code);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+keyok(int c, bool flag)
+{
+    return NCURSES_SP_NAME(keyok) (CURRENT_SCREEN, c, flag);
+}
+#endif
diff --git a/ncurses/base/legacy_coding.c b/ncurses/base/legacy_coding.c
new file mode 100644
index 0000000..a71aee0
--- /dev/null
+++ b/ncurses/base/legacy_coding.c
@@ -0,0 +1,58 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 2005,2009 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey          2005                                  *
+ *          Juergen Pfeifer           2009                                  *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: legacy_coding.c,v 1.6 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(use_legacy_coding) (NCURSES_SP_DCLx int level)
+{
+    int result = ERR;
+
+    T((T_CALLED("use_legacy_coding(%p,%d)"), (void *) SP_PARM, level));
+    if (level >= 0 && level <= 2 && SP_PARM != 0) {
+	result = SP_PARM->_legacy_coding;
+	SP_PARM->_legacy_coding = level;
+    }
+    returnCode(result);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+use_legacy_coding(int level)
+{
+    return NCURSES_SP_NAME(use_legacy_coding) (CURRENT_SCREEN, level);
+}
+#endif
diff --git a/ncurses/base/lib_addch.c b/ncurses/base/lib_addch.c
new file mode 100644
index 0000000..a14bfd3
--- /dev/null
+++ b/ncurses/base/lib_addch.c
@@ -0,0 +1,602 @@
+/****************************************************************************
+ * Copyright 2019-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/*
+**	lib_addch.c
+**
+**	The routine waddch().
+**
+*/
+
+#include <curses.priv.h>
+#include <ctype.h>
+
+MODULE_ID("$Id: lib_addch.c,v 1.141 2022/06/12 15:16:41 tom Exp $")
+
+static const NCURSES_CH_T blankchar = NewChar(BLANK_TEXT);
+
+/*
+ * Ugly microtweaking alert.  Everything from here to end of module is
+ * likely to be speed-critical -- profiling data sure says it is!
+ * Most of the important screen-painting functions are shells around
+ * waddch().  So we make every effort to reduce function-call overhead
+ * by inlining stuff, even at the cost of making wrapped copies for
+ * export.  Also we supply some internal versions that don't call the
+ * window sync hook, for use by string-put functions.
+ */
+
+/* Return bit mask for clearing color pair number if given ch has color */
+#define COLOR_MASK(ch) (~(attr_t)(((ch) & A_COLOR) ? A_COLOR : 0))
+
+static NCURSES_INLINE NCURSES_CH_T
+render_char(WINDOW *win, NCURSES_CH_T ch)
+/* compute a rendition of the given char correct for the current context */
+{
+    attr_t a = WINDOW_ATTRS(win);
+    int pair = GetPair(ch);
+
+    if (ISBLANK(ch)
+	&& AttrOf(ch) == A_NORMAL
+	&& pair == 0) {
+	/* color/pair in attrs has precedence over bkgrnd */
+	ch = win->_nc_bkgd;
+	SetAttr(ch, a | AttrOf(win->_nc_bkgd));
+	if ((pair = GET_WINDOW_PAIR(win)) == 0)
+	    pair = GetPair(win->_nc_bkgd);
+	SetPair(ch, pair);
+    } else {
+	/* color in attrs has precedence over bkgrnd */
+	a |= AttrOf(win->_nc_bkgd) & COLOR_MASK(a);
+	/* color in ch has precedence */
+	if (pair == 0) {
+	    if ((pair = GET_WINDOW_PAIR(win)) == 0)
+		pair = GetPair(win->_nc_bkgd);
+	}
+	AddAttr(ch, (a & COLOR_MASK(AttrOf(ch))));
+	SetPair(ch, pair);
+    }
+
+    TR(TRACE_VIRTPUT,
+       ("render_char bkg %s (%d), attrs %s (%d) -> ch %s (%d)",
+	_tracech_t2(1, CHREF(win->_nc_bkgd)),
+	GetPair(win->_nc_bkgd),
+	_traceattr(WINDOW_ATTRS(win)),
+	GET_WINDOW_PAIR(win),
+	_tracech_t2(3, CHREF(ch)),
+	GetPair(ch)));
+
+    return (ch);
+}
+
+NCURSES_EXPORT(NCURSES_CH_T)
+_nc_render(WINDOW *win, NCURSES_CH_T ch)
+/* make render_char() visible while still allowing us to inline it below */
+{
+    return render_char(win, ch);
+}
+
+/* check if position is legal; if not, return error */
+#ifndef NDEBUG			/* treat this like an assertion */
+#define CHECK_POSITION(win, x, y) \
+	if (y > win->_maxy \
+	 || x > win->_maxx \
+	 || y < 0 \
+	 || x < 0) { \
+		TR(TRACE_VIRTPUT, ("Alert! Win=%p _curx = %d, _cury = %d " \
+				   "(_maxx = %d, _maxy = %d)", win, x, y, \
+				   win->_maxx, win->_maxy)); \
+		return(ERR); \
+	}
+#else
+#define CHECK_POSITION(win, x, y)	/* nothing */
+#endif
+
+static bool
+newline_forces_scroll(WINDOW *win, NCURSES_SIZE_T *ypos)
+{
+    bool result = FALSE;
+
+    if (*ypos >= win->_regtop && *ypos <= win->_regbottom) {
+	if (*ypos == win->_regbottom) {
+	    *ypos = win->_regbottom;
+	    result = TRUE;
+	} else if (*ypos < win->_maxy) {
+	    *ypos = (NCURSES_SIZE_T) (*ypos + 1);
+	}
+    } else if (*ypos < win->_maxy) {
+	*ypos = (NCURSES_SIZE_T) (*ypos + 1);
+    }
+    return result;
+}
+
+/*
+ * The _WRAPPED flag is useful only for telling an application that we've just
+ * wrapped the cursor.  We don't do anything with this flag except set it when
+ * wrapping, and clear it whenever we move the cursor.  If we try to wrap at
+ * the lower-right corner of a window, we cannot move the cursor (since that
+ * wouldn't be legal).  So we return an error (which is what SVr4 does).
+ * Unlike SVr4, we can successfully add a character to the lower-right corner
+ * (Solaris 2.6 does this also, however).
+ */
+static int
+wrap_to_next_line(WINDOW *win)
+{
+    win->_flags |= _WRAPPED;
+    if (newline_forces_scroll(win, &(win->_cury))) {
+	win->_curx = win->_maxx;
+	if (!win->_scroll)
+	    return (ERR);
+	scroll(win);
+    }
+    win->_curx = 0;
+    return (OK);
+}
+
+#if USE_WIDEC_SUPPORT
+static int waddch_literal(WINDOW *, NCURSES_CH_T);
+/*
+ * Fill the given number of cells with blanks using the current background
+ * rendition.  This saves/restores the current x-position.
+ */
+static void
+fill_cells(WINDOW *win, int count)
+{
+    NCURSES_CH_T blank = blankchar;
+    int save_x = win->_curx;
+    int save_y = win->_cury;
+
+    while (count-- > 0) {
+	if (waddch_literal(win, blank) == ERR)
+	    break;
+    }
+    win->_curx = (NCURSES_SIZE_T) save_x;
+    win->_cury = (NCURSES_SIZE_T) save_y;
+}
+#endif
+
+/*
+ * Build up the bytes for a multibyte character, returning the length when
+ * complete (a positive number), -1 for error and -2 for incomplete.
+ */
+#if USE_WIDEC_SUPPORT
+NCURSES_EXPORT(int)
+_nc_build_wch(WINDOW *win, ARG_CH_T ch)
+{
+    char *buffer = WINDOW_EXT(win, addch_work);
+    int len;
+    int x = win->_curx;
+    int y = win->_cury;
+    mbstate_t state;
+    wchar_t result;
+
+    if ((WINDOW_EXT(win, addch_used) != 0) &&
+	(WINDOW_EXT(win, addch_x) != x ||
+	 WINDOW_EXT(win, addch_y) != y)) {
+	/* discard the incomplete multibyte character */
+	WINDOW_EXT(win, addch_used) = 0;
+	TR(TRACE_VIRTPUT,
+	   ("Alert discarded multibyte on move (%d,%d) -> (%d,%d)",
+	    WINDOW_EXT(win, addch_y), WINDOW_EXT(win, addch_x),
+	    y, x));
+    }
+    WINDOW_EXT(win, addch_x) = x;
+    WINDOW_EXT(win, addch_y) = y;
+
+    /*
+     * If the background character is a wide-character, that may interfere with
+     * processing multibyte characters in this function.
+     */
+    if (!is8bits(CharOf(CHDEREF(ch)))) {
+	if (WINDOW_EXT(win, addch_used) != 0) {
+	    /* discard the incomplete multibyte character */
+	    WINDOW_EXT(win, addch_used) = 0;
+	    TR(TRACE_VIRTPUT,
+	       ("Alert discarded incomplete multibyte"));
+	}
+	return 1;
+    }
+
+    init_mb(state);
+    buffer[WINDOW_EXT(win, addch_used)] = (char) CharOf(CHDEREF(ch));
+    WINDOW_EXT(win, addch_used) += 1;
+    buffer[WINDOW_EXT(win, addch_used)] = '\0';
+    if ((len = (int) mbrtowc(&result,
+			     buffer,
+			     (size_t) WINDOW_EXT(win, addch_used),
+			     &state)) > 0) {
+	attr_t attrs = AttrOf(CHDEREF(ch));
+	if_EXT_COLORS(int pair = GetPair(CHDEREF(ch)));
+	SetChar(CHDEREF(ch), result, attrs);
+	if_EXT_COLORS(SetPair(CHDEREF(ch), pair));
+	WINDOW_EXT(win, addch_used) = 0;
+    } else if (len == -1) {
+	/*
+	 * An error occurred.  We could either discard everything,
+	 * or assume that the error was in the previous input.
+	 * Try the latter.
+	 */
+	TR(TRACE_VIRTPUT, ("Alert! mbrtowc returns error"));
+	/* handle this with unctrl() */
+	WINDOW_EXT(win, addch_used) = 0;
+    }
+    return len;
+}
+#endif /* USE_WIDEC_SUPPORT */
+
+static
+#if !USE_WIDEC_SUPPORT		/* cannot be inline if it is recursive */
+NCURSES_INLINE
+#endif
+int
+waddch_literal(WINDOW *win, NCURSES_CH_T ch)
+{
+    int x;
+    int y;
+    struct ldat *line;
+
+    x = win->_curx;
+    y = win->_cury;
+
+    CHECK_POSITION(win, x, y);
+
+    ch = render_char(win, ch);
+
+    line = win->_line + y;
+
+    CHANGED_CELL(line, x);
+
+    /*
+     * Build up multibyte characters until we have a wide-character.
+     */
+#if NCURSES_SP_FUNCS
+#define DeriveSP() SCREEN *sp = _nc_screen_of(win);
+#else
+#define DeriveSP()		/*nothing */
+#endif
+    if_WIDEC({
+	DeriveSP();
+	if (WINDOW_EXT(win, addch_used) != 0 || !Charable(ch)) {
+	    int len = _nc_build_wch(win, CHREF(ch));
+
+	    if (len >= -1) {
+		attr_t attr = AttrOf(ch);
+
+		/* handle EILSEQ (i.e., when len >= -1) */
+		if (len == -1 && is8bits(CharOf(ch))) {
+		    const char *s = NCURSES_SP_NAME(unctrl)
+		      (NCURSES_SP_ARGx (chtype) CharOf(ch));
+
+		    if (s[1] != '\0') {
+			int rc = OK;
+			while (*s != '\0') {
+			    rc = waddch(win, UChar(*s) | attr);
+			    if (rc != OK)
+				break;
+			    ++s;
+			}
+			return rc;
+		    }
+		}
+		if (len == -1)
+		    return waddch(win, ' ' | attr);
+	    } else {
+		return OK;
+	    }
+	}
+    });
+
+    /*
+     * Non-spacing characters are added to the current cell.
+     *
+     * Spacing characters that are wider than one column require some display
+     * adjustments.
+     */
+    if_WIDEC({
+	int len = _nc_wacs_width(CharOf(ch));
+	int i;
+	int j;
+
+	if (len == 0) {		/* non-spacing */
+	    if ((x > 0 && y >= 0)
+		|| (win->_maxx >= 0 && win->_cury >= 1)) {
+		NCURSES_CH_T *dst;
+		wchar_t *chars;
+		if (x > 0 && y >= 0) {
+		    for (j = x - 1; j >= 0; --j) {
+			if (!isWidecExt(win->_line[y].text[j])) {
+			    win->_curx = (NCURSES_SIZE_T) j;
+			    break;
+			}
+		    }
+		    dst = &(win->_line[y].text[j]);
+		} else {
+		    dst = &(win->_line[y - 1].text[win->_maxx]);
+		}
+		chars = dst->chars;
+		for (i = 0; i < CCHARW_MAX; ++i) {
+		    if (chars[i] == 0) {
+			TR(TRACE_VIRTPUT,
+			   ("adding non-spacing %s (level %d)",
+			    _tracech_t(CHREF(ch)), i));
+			chars[i] = CharOf(ch);
+			break;
+		    }
+		}
+	    }
+	    goto testwrapping;
+	} else if (len > 1) {	/* multi-column characters */
+	    /*
+	     * Check if the character will fit on the current line.  If it does
+	     * not fit, fill in the remainder of the line with blanks.  and
+	     * move to the next line.
+	     */
+	    if (len > win->_maxx + 1) {
+		TR(TRACE_VIRTPUT, ("character will not fit"));
+		return ERR;
+	    } else if (x + len > win->_maxx + 1) {
+		int count = win->_maxx + 1 - x;
+		TR(TRACE_VIRTPUT, ("fill %d remaining cells", count));
+		fill_cells(win, count);
+		if (wrap_to_next_line(win) == ERR)
+		    return ERR;
+		x = win->_curx;
+		y = win->_cury;
+		CHECK_POSITION(win, x, y);
+		line = win->_line + y;
+	    }
+	    /*
+	     * Check for cells which are orphaned by adding this character, set
+	     * those to blanks.
+	     *
+	     * FIXME: this actually could fill j-i cells, more complicated to
+	     * setup though.
+	     */
+	    for (i = 0; i < len; ++i) {
+		if (isWidecBase(win->_line[y].text[x + i])) {
+		    break;
+		} else if (isWidecExt(win->_line[y].text[x + i])) {
+		    for (j = i; x + j <= win->_maxx; ++j) {
+			if (!isWidecExt(win->_line[y].text[x + j])) {
+			    TR(TRACE_VIRTPUT, ("fill %d orphan cells", j));
+			    fill_cells(win, j);
+			    break;
+			}
+		    }
+		    break;
+		}
+	    }
+	    /*
+	     * Finally, add the cells for this character.
+	     */
+	    for (i = 0; i < len; ++i) {
+		NCURSES_CH_T value = ch;
+		SetWidecExt(value, i);
+		TR(TRACE_VIRTPUT, ("multicolumn %d:%d (%d,%d)",
+				   i + 1, len,
+				   win->_begy + y, win->_begx + x));
+		line->text[x] = value;
+		CHANGED_CELL(line, x);
+		++x;
+	    }
+	    goto testwrapping;
+	}
+    });
+
+    /*
+     * Single-column characters.
+     */
+    line->text[x++] = ch;
+    /*
+     * This label is used only for wide-characters.
+     */
+    if_WIDEC(
+  testwrapping:
+    );
+
+    TR(TRACE_VIRTPUT, ("cell (%d, %d..%d) = %s",
+		       win->_cury, win->_curx, x - 1,
+		       _tracech_t(CHREF(line->text[win->_curx]))));
+
+    if (x > win->_maxx) {
+	return wrap_to_next_line(win);
+    }
+    win->_curx = (NCURSES_SIZE_T) x;
+    return OK;
+}
+
+static NCURSES_INLINE int
+waddch_nosync(WINDOW *win, const NCURSES_CH_T ch)
+/* the workhorse function -- add a character to the given window */
+{
+    NCURSES_SIZE_T x, y;
+    chtype t = (chtype) CharOf(ch);
+#if USE_WIDEC_SUPPORT || NCURSES_SP_FUNCS || USE_REENTRANT
+    SCREEN *sp = _nc_screen_of(win);
+#endif
+    const char *s = NCURSES_SP_NAME(unctrl) (NCURSES_SP_ARGx t);
+    int tabsize = 8;
+
+    /*
+     * If we are using the alternate character set, forget about locale.
+     * Otherwise, if unctrl() returns a single-character or the locale
+     * claims the code is printable (and not also a control character),
+     * treat it that way.
+     */
+    if ((AttrOf(ch) & A_ALTCHARSET)
+	|| (
+#if USE_WIDEC_SUPPORT
+	       (sp != 0 && sp->_legacy_coding) &&
+#endif
+	       s[1] == 0
+	)
+	|| (
+	       (isprint((int) t) && !iscntrl((int) t))
+#if USE_WIDEC_SUPPORT
+	       || ((sp == 0 || !sp->_legacy_coding) &&
+		   (WINDOW_EXT(win, addch_used)
+		    || !_nc_is_charable(CharOf(ch))))
+#endif
+	)) {
+	return waddch_literal(win, ch);
+    }
+
+    /*
+     * Handle carriage control and other codes that are not printable, or are
+     * known to expand to more than one character according to unctrl().
+     */
+    x = win->_curx;
+    y = win->_cury;
+    CHECK_POSITION(win, x, y);
+
+    switch (t) {
+    case '\t':
+#if USE_REENTRANT
+	tabsize = *ptrTabsize(sp);
+#else
+	tabsize = TABSIZE;
+#endif
+	x = (NCURSES_SIZE_T) (x + (tabsize - (x % tabsize)));
+	/*
+	 * Space-fill the tab on the bottom line so that we'll get the
+	 * "correct" cursor position.
+	 */
+	if ((!win->_scroll && (y == win->_regbottom))
+	    || (x <= win->_maxx)) {
+	    NCURSES_CH_T blank = blankchar;
+	    AddAttr(blank, AttrOf(ch));
+	    while (win->_curx < x) {
+		if (waddch_literal(win, blank) == ERR)
+		    return (ERR);
+	    }
+	    break;
+	} else {
+	    wclrtoeol(win);
+	    win->_flags |= _WRAPPED;
+	    if (newline_forces_scroll(win, &y)) {
+		x = win->_maxx;
+		if (win->_scroll) {
+		    scroll(win);
+		    x = 0;
+		}
+	    } else {
+		x = 0;
+	    }
+	}
+	break;
+    case '\n':
+	wclrtoeol(win);
+	if (newline_forces_scroll(win, &y)) {
+	    if (win->_scroll)
+		scroll(win);
+	    else
+		return (ERR);
+	}
+	/* FALLTHRU */
+    case '\r':
+	x = 0;
+	win->_flags &= ~_WRAPPED;
+	break;
+    case '\b':
+	if (x == 0)
+	    return (OK);
+	x--;
+	win->_flags &= ~_WRAPPED;
+	break;
+    default:
+	while (*s) {
+	    NCURSES_CH_T sch;
+	    SetChar(sch, UChar(*s++), AttrOf(ch));
+	    if_EXT_COLORS(SetPair(sch, GetPair(ch)));
+	    if (waddch_literal(win, sch) == ERR)
+		return ERR;
+	}
+	return (OK);
+    }
+
+    win->_curx = x;
+    win->_cury = y;
+
+    return (OK);
+}
+
+NCURSES_EXPORT(int)
+_nc_waddch_nosync(WINDOW *win, const NCURSES_CH_T c)
+/* export copy of waddch_nosync() so the string-put functions can use it */
+{
+    return (waddch_nosync(win, c));
+}
+
+/*
+ * The versions below call _nc_synchook().  We wanted to avoid this in the
+ * version exported for string puts; they'll call _nc_synchook once at end
+ * of run.
+ */
+
+/* These are actual entry points */
+
+NCURSES_EXPORT(int)
+waddch(WINDOW *win, const chtype ch)
+{
+    int code = ERR;
+    NCURSES_CH_T wch;
+    SetChar2(wch, ch);
+
+    TR(TRACE_VIRTPUT | TRACE_CCALLS, (T_CALLED("waddch(%p, %s)"), (void *) win,
+				      _tracechtype(ch)));
+
+    if (win && (waddch_nosync(win, wch) != ERR)) {
+	_nc_synchook(win);
+	code = OK;
+    }
+
+    TR(TRACE_VIRTPUT | TRACE_CCALLS, (T_RETURN("%d"), code));
+    return (code);
+}
+
+NCURSES_EXPORT(int)
+wechochar(WINDOW *win, const chtype ch)
+{
+    int code = ERR;
+    NCURSES_CH_T wch;
+    SetChar2(wch, ch);
+
+    TR(TRACE_VIRTPUT | TRACE_CCALLS, (T_CALLED("wechochar(%p, %s)"),
+				      (void *) win,
+				      _tracechtype(ch)));
+
+    if (win && (waddch_nosync(win, wch) != ERR)) {
+	bool save_immed = win->_immed;
+	win->_immed = TRUE;
+	_nc_synchook(win);
+	win->_immed = save_immed;
+	code = OK;
+    }
+    TR(TRACE_VIRTPUT | TRACE_CCALLS, (T_RETURN("%d"), code));
+    return (code);
+}
diff --git a/ncurses/base/lib_addstr.c b/ncurses/base/lib_addstr.c
new file mode 100644
index 0000000..ea44979
--- /dev/null
+++ b/ncurses/base/lib_addstr.c
@@ -0,0 +1,255 @@
+/****************************************************************************
+ * Copyright 2019-2020,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *                                                                          *
+ *  Rewritten 2001-2004 to support wide-characters by                       *
+ *	Sven Verdoolaege                                                    *
+ *	Thomas Dickey                                                       *
+ ****************************************************************************/
+
+/*
+**	lib_addstr.c
+*
+**	The routines waddnstr(), waddchnstr().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_addstr.c,v 1.58 2022/06/11 20:12:04 tom Exp $")
+
+NCURSES_EXPORT(int)
+waddnstr(WINDOW *win, const char *astr, int n)
+{
+    const char *str = astr;
+    int code = ERR;
+
+    T((T_CALLED("waddnstr(%p,%s,%d)"), (void *) win, _nc_visbufn(astr, n), n));
+
+    if (win && (str != 0)) {
+	TR(TRACE_VIRTPUT | TRACE_ATTRS,
+	   ("... current %s", _traceattr(WINDOW_ATTRS(win))));
+	code = OK;
+
+	TR(TRACE_VIRTPUT, ("str is not null, length = %d",
+			   ((n > 0) ? n : (int) strlen(str))));
+	if (n < 0)
+	    n = INT_MAX;
+	while ((*str != '\0') && (n-- > 0)) {
+	    NCURSES_CH_T ch;
+	    TR(TRACE_VIRTPUT, ("*str = %#o", UChar(*str)));
+	    SetChar(ch, UChar(*str++), A_NORMAL);
+	    if (_nc_waddch_nosync(win, ch) == ERR) {
+		code = ERR;
+		break;
+	    }
+	}
+	_nc_synchook(win);
+    }
+    TR(TRACE_VIRTPUT, ("waddnstr returns %d", code));
+    returnCode(code);
+}
+
+NCURSES_EXPORT(int)
+waddchnstr(WINDOW *win, const chtype *astr, int n)
+{
+    NCURSES_SIZE_T y, x;
+    int code = OK;
+    int i;
+    struct ldat *line;
+
+    T((T_CALLED("waddchnstr(%p,%p,%d)"), (void *) win, (const void *) astr, n));
+
+    if (!win || !astr)
+	returnCode(ERR);
+
+    y = win->_cury;
+    x = win->_curx;
+    if (n < 0) {
+	const chtype *str;
+	n = 0;
+	for (str = (const chtype *) astr; *str != 0; str++)
+	    n++;
+    }
+    if (n > win->_maxx - x + 1)
+	n = win->_maxx - x + 1;
+    if (n == 0)
+	returnCode(code);
+
+    line = &(win->_line[y]);
+    for (i = 0; i < n && ChCharOf(astr[i]) != '\0'; ++i) {
+	SetChar2(line->text[i + x], astr[i]);
+    }
+    CHANGED_RANGE(line, x, (NCURSES_SIZE_T) (x + n - 1));
+
+    _nc_synchook(win);
+    returnCode(code);
+}
+
+#if USE_WIDEC_SUPPORT
+
+NCURSES_EXPORT(int)
+_nc_wchstrlen(const cchar_t *s)
+{
+    int result = 0;
+    if (s != 0) {
+	while (CharOf(s[result]) != L'\0') {
+	    result++;
+	}
+    }
+    return result;
+}
+
+NCURSES_EXPORT(int)
+wadd_wchnstr(WINDOW *win, const cchar_t *astr, int n)
+{
+    static const NCURSES_CH_T blank = NewChar(BLANK_TEXT);
+    NCURSES_SIZE_T y;
+    NCURSES_SIZE_T x;
+    int code = OK;
+    struct ldat *line;
+    int i, j, start, len, end;
+
+    T((T_CALLED("wadd_wchnstr(%p,%s,%d)"),
+       (void *) win,
+       _nc_viscbuf(astr, n),
+       n));
+
+    if (!win)
+	returnCode(ERR);
+
+    y = win->_cury;
+    x = win->_curx;
+    if (n < 0) {
+	n = _nc_wchstrlen(astr);
+    }
+    if (n > win->_maxx - x + 1)
+	n = win->_maxx - x + 1;
+    if (n == 0)
+	returnCode(code);
+
+    line = &(win->_line[y]);
+    start = x;
+    end = x + n - 1;
+
+    /*
+     * Reset orphaned cells of multi-column characters that extend up to the
+     * new string's location to blanks.
+     */
+    if (x > 0 && isWidecExt(line->text[x])) {
+	for (i = 0; i <= x; ++i) {
+	    if (!isWidecExt(line->text[x - i])) {
+		/* must be isWidecBase() */
+		start -= i;
+		while (i > 0) {
+		    line->text[x - i--] = _nc_render(win, blank);
+		}
+		break;
+	    }
+	}
+    }
+
+    /*
+     * Copy the new string to the window.
+     */
+    for (i = 0; i < n && CharOf(astr[i]) != L'\0' && x <= win->_maxx; ++i) {
+	if (isWidecExt(astr[i]))
+	    continue;
+
+	len = _nc_wacs_width(CharOf(astr[i]));
+
+	if (x + len - 1 <= win->_maxx) {
+	    line->text[x] = _nc_render(win, astr[i]);
+	    if (len > 1) {
+		for (j = 0; j < len; ++j) {
+		    if (j != 0) {
+			line->text[x + j] = line->text[x];
+		    }
+		    SetWidecExt(line->text[x + j], j);
+		}
+	    } else {
+		len = 1;
+	    }
+	    x = (NCURSES_SIZE_T) (x + len);
+	    end += len - 1;
+	} else {
+	    break;
+	}
+    }
+
+    /*
+     * Set orphaned cells of multi-column characters which lie after the new
+     * string to blanks.
+     */
+    while (x <= win->_maxx && isWidecExt(line->text[x])) {
+	line->text[x] = _nc_render(win, blank);
+	++end;
+	++x;
+    }
+    CHANGED_RANGE(line, start, end);
+
+    _nc_synchook(win);
+    returnCode(code);
+}
+
+NCURSES_EXPORT(int)
+waddnwstr(WINDOW *win, const wchar_t *str, int n)
+{
+    int code = ERR;
+
+    T((T_CALLED("waddnwstr(%p,%s,%d)"), (void *) win, _nc_viswbufn(str, n), n));
+
+    if (win && (str != 0)) {
+	TR(TRACE_VIRTPUT | TRACE_ATTRS,
+	   ("... current %s", _traceattr(WINDOW_ATTRS(win))));
+	code = OK;
+
+	TR(TRACE_VIRTPUT, ("str is not null, length = %d",
+			   ((n > 0) ? n : (int) wcslen(str))));
+	if (n < 0)
+	    n = INT_MAX;
+	while ((*str != L('\0')) && (n-- > 0)) {
+	    NCURSES_CH_T ch;
+	    TR(TRACE_VIRTPUT, ("*str[0] = %#lx", (unsigned long) *str));
+	    SetChar(ch, *str++, A_NORMAL);
+	    if (wadd_wch(win, &ch) == ERR) {
+		code = ERR;
+		break;
+	    }
+	}
+	_nc_synchook(win);
+    }
+    TR(TRACE_VIRTPUT, ("waddnwstr returns %d", code));
+    returnCode(code);
+}
+
+#endif
diff --git a/ncurses/base/lib_beep.c b/ncurses/base/lib_beep.c
new file mode 100644
index 0000000..b1a60b9
--- /dev/null
+++ b/ncurses/base/lib_beep.c
@@ -0,0 +1,91 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2013,2014 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ *     and: Juergen Pfeifer                         2009                    *
+ ****************************************************************************/
+
+/*
+ *	beep.c
+ *
+ *	The routine beep().
+ *
+ */
+
+#include <curses.priv.h>
+
+#ifndef CUR
+#define CUR SP_TERMTYPE
+#endif
+
+MODULE_ID("$Id: lib_beep.c,v 1.18 2020/02/02 23:34:34 tom Exp $")
+
+/*
+ *	beep()
+ *
+ *	Sound the current terminal's audible bell if it has one.   If not,
+ *	flash the screen if possible.
+ *
+ */
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(beep) (NCURSES_SP_DCL0)
+{
+    int res = ERR;
+
+    T((T_CALLED("beep(%p)"), (void *) SP_PARM));
+
+#ifdef USE_TERM_DRIVER
+    if (SP_PARM != 0)
+	res = CallDriver_1(SP_PARM, td_doBeepOrFlash, TRUE);
+#else
+    /* FIXME: should make sure that we are not in altchar mode */
+    if (cur_term == 0) {
+	res = ERR;
+    } else if (bell) {
+	res = NCURSES_PUTP2_FLUSH("bell", bell);
+    } else if (flash_screen) {
+	res = NCURSES_PUTP2_FLUSH("flash_screen", flash_screen);
+	_nc_flush();
+    }
+#endif
+
+    returnCode(res);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+beep(void)
+{
+    return NCURSES_SP_NAME(beep) (CURRENT_SCREEN);
+}
+#endif
diff --git a/ncurses/base/lib_bkgd.c b/ncurses/base/lib_bkgd.c
new file mode 100644
index 0000000..4f99080
--- /dev/null
+++ b/ncurses/base/lib_bkgd.c
@@ -0,0 +1,273 @@
+/****************************************************************************
+ * Copyright 2018-2020,2021 Thomas E. Dickey                                *
+ * Copyright 1998-2014,2016 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Juergen Pfeifer                         1997                    *
+ *     and: Sven Verdoolaege                        2000                    *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_bkgd.c,v 1.63 2021/05/08 14:58:12 tom Exp $")
+
+static const NCURSES_CH_T blank = NewChar(BLANK_TEXT);
+
+/*
+ * Set the window's background information.
+ */
+#if USE_WIDEC_SUPPORT
+NCURSES_EXPORT(void)
+#else
+static NCURSES_INLINE void
+#endif
+wbkgrndset(WINDOW *win, const ARG_CH_T ch)
+{
+    T((T_CALLED("wbkgrndset(%p,%s)"), (void *) win, _tracech_t(ch)));
+
+    if (win) {
+	attr_t off = AttrOf(win->_nc_bkgd);
+	attr_t on = AttrOf(CHDEREF(ch));
+
+	toggle_attr_off(WINDOW_ATTRS(win), off);
+	toggle_attr_on(WINDOW_ATTRS(win), on);
+
+#if NCURSES_EXT_COLORS
+	{
+	    int pair;
+
+	    if (GetPair(win->_nc_bkgd) != 0)
+		SET_WINDOW_PAIR(win, 0);
+	    if ((pair = GetPair(CHDEREF(ch))) != 0)
+		SET_WINDOW_PAIR(win, pair);
+	}
+#endif
+
+	if (CharOf(CHDEREF(ch)) == L('\0')) {
+	    SetChar(win->_nc_bkgd, BLANK_TEXT, AttrOf(CHDEREF(ch)));
+	    if_EXT_COLORS(SetPair(win->_nc_bkgd, GetPair(CHDEREF(ch))));
+	} else {
+	    win->_nc_bkgd = CHDEREF(ch);
+	}
+#if USE_WIDEC_SUPPORT
+	/*
+	 * If we're compiled for wide-character support, _bkgrnd is the
+	 * preferred location for the background information since it stores
+	 * more than _bkgd.  Update _bkgd each time we modify _bkgrnd, so the
+	 * macro getbkgd() will work.
+	 */
+	{
+	    cchar_t wch;
+	    int tmp;
+
+	    memset(&wch, 0, sizeof(wch));
+	    (void) wgetbkgrnd(win, &wch);
+	    tmp = _nc_to_char((wint_t) CharOf(wch));
+
+	    win->_bkgd = (((tmp == EOF) ? ' ' : (chtype) tmp)
+			  | (AttrOf(wch) & ALL_BUT_COLOR)
+			  | (chtype) ColorPair(GET_WINDOW_PAIR(win)));
+	}
+#endif
+    }
+    returnVoid;
+}
+
+NCURSES_EXPORT(void)
+wbkgdset(WINDOW *win, chtype ch)
+{
+    NCURSES_CH_T wch;
+    T((T_CALLED("wbkgdset(%p,%s)"), (void *) win, _tracechtype(ch)));
+    SetChar2(wch, ch);
+    wbkgrndset(win, CHREF(wch));
+    returnVoid;
+}
+
+/*
+ * Set the window's background information and apply it to each cell.
+ */
+static NCURSES_INLINE int
+_nc_background(WINDOW *win, const ARG_CH_T ch, bool narrow)
+{
+#undef  SP_PARM
+#define SP_PARM SP		/* to use Charable() */
+    int code = ERR;
+
+#if USE_WIDEC_SUPPORT
+    T((T_CALLED("%s(%p,%s)"),
+       narrow ? "wbkgd" : "wbkgrnd",
+       (void *) win,
+       _tracecchar_t(ch)));
+#define TraceChar(c) _tracecchar_t2(1, &(c))
+#else
+    T((T_CALLED("%s(%p,%s)"),
+       "wbkgd",
+       (void *) win,
+       _tracech_t(ch)));
+    (void) narrow;
+#define TraceChar(c) _tracechar(CharOf(c))
+#endif
+
+    if (SP == 0) {
+	;
+    } else if (win) {
+	NCURSES_CH_T new_bkgd = CHDEREF(ch);
+	NCURSES_CH_T old_bkgd;
+	int y;
+	NCURSES_CH_T old_char;
+	attr_t old_attr;
+	int old_pair;
+	NCURSES_CH_T new_char;
+	attr_t new_attr;
+	int new_pair;
+
+	/* SVr4 trims color info if non-color terminal */
+	if (!SP->_pair_limit) {
+	    RemAttr(new_bkgd, A_COLOR);
+	    SetPair(new_bkgd, 0);
+	}
+
+	/* avoid setting background-character to a null */
+	if (CharOf(new_bkgd) == 0) {
+	    NCURSES_CH_T tmp_bkgd = blank;
+	    SetAttr(tmp_bkgd, AttrOf(new_bkgd));
+	    SetPair(tmp_bkgd, GetPair(new_bkgd));
+	    new_bkgd = tmp_bkgd;
+	}
+
+	memset(&old_bkgd, 0, sizeof(old_bkgd));
+	(void) wgetbkgrnd(win, &old_bkgd);
+
+	if (!memcmp(&old_bkgd, &new_bkgd, sizeof(new_bkgd))) {
+	    T(("...unchanged"));
+	    returnCode(OK);
+	}
+
+	old_char = old_bkgd;
+	RemAttr(old_char, ~A_CHARTEXT);
+	old_attr = AttrOf(old_bkgd);
+	old_pair = GetPair(old_bkgd);
+
+	if (!(old_attr & A_COLOR)) {
+	    old_pair = 0;
+	}
+	T(("... old background char %s, attr %s, pair %d",
+	   TraceChar(old_char), _traceattr(old_attr), old_pair));
+
+	new_char = new_bkgd;
+	RemAttr(new_char, ~A_CHARTEXT);
+	new_attr = AttrOf(new_bkgd);
+	new_pair = GetPair(new_bkgd);
+
+	/* SVr4 limits background character to printable 7-bits */
+	if (
+#if USE_WIDEC_SUPPORT
+	       narrow &&
+#endif
+	       !Charable(new_bkgd)) {
+	    new_char = old_char;
+	}
+	if (!(new_attr & A_COLOR)) {
+	    new_pair = 0;
+	}
+	T(("... new background char %s, attr %s, pair %d",
+	   TraceChar(new_char), _traceattr(new_attr), new_pair));
+
+	(void) wbkgrndset(win, CHREF(new_bkgd));
+
+	/* SVr4 updates color pair if old/new match, otherwise just attrs */
+	if ((new_pair != 0) && (new_pair == old_pair)) {
+	    WINDOW_ATTRS(win) = new_attr;
+	    SET_WINDOW_PAIR(win, new_pair);
+	} else {
+	    WINDOW_ATTRS(win) = new_attr;
+	}
+
+	for (y = 0; y <= win->_maxy; y++) {
+	    int x;
+
+	    for (x = 0; x <= win->_maxx; x++) {
+		NCURSES_CH_T *cp = &(win->_line[y].text[x]);
+		int tmp_pair = GetPair(*cp);
+		attr_t tmp_attr = AttrOf(*cp);
+
+		if (CharEq(*cp, old_bkgd)) {
+#if USE_WIDEC_SUPPORT
+		    if (!narrow) {
+			if (Charable(new_bkgd)) {
+			    SetChar2(*cp, CharOf(new_char));
+			} else {
+			    SetChar(*cp, L' ', AttrOf(new_char));
+			}
+			memcpy(cp->chars,
+			       new_char.chars,
+			       CCHARW_MAX * sizeof(cp->chars[0]));
+		    } else
+#endif
+			SetChar2(*cp, CharOf(new_char));
+		}
+		if (tmp_pair != 0) {
+		    if (tmp_pair == old_pair) {
+			SetAttr(*cp, (tmp_attr & ~old_attr) | new_attr);
+			SetPair(*cp, new_pair);
+		    } else {
+			SetAttr(*cp,
+				(tmp_attr & (~old_attr | A_COLOR))
+				| (new_attr & ALL_BUT_COLOR));
+		    }
+		} else {
+		    SetAttr(*cp, (tmp_attr & ~old_attr) | new_attr);
+		    SetPair(*cp, new_pair);
+		}
+	    }
+	}
+	touchwin(win);
+	_nc_synchook(win);
+	code = OK;
+    }
+    returnCode(code);
+}
+
+#if USE_WIDEC_SUPPORT
+NCURSES_EXPORT(int)
+wbkgrnd(WINDOW *win, const ARG_CH_T ch)
+{
+    return _nc_background(win, ch, FALSE);
+}
+#endif
+
+NCURSES_EXPORT(int)
+wbkgd(WINDOW *win, chtype ch)
+{
+    NCURSES_CH_T wch;
+    SetChar2(wch, ch);
+    return _nc_background(win, CHREF(wch), TRUE);
+}
diff --git a/ncurses/base/lib_box.c b/ncurses/base/lib_box.c
new file mode 100644
index 0000000..186f112
--- /dev/null
+++ b/ncurses/base/lib_box.c
@@ -0,0 +1,140 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2010,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ *     and: Sven Verdoolaege                        2001                    *
+ ****************************************************************************/
+
+/*
+**	lib_box.c
+**
+**	The routine wborder().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_box.c,v 1.26 2020/02/02 23:34:34 tom Exp $")
+
+#if USE_WIDEC_SUPPORT
+static NCURSES_INLINE chtype
+_my_render(WINDOW *win, chtype ch)
+{
+    NCURSES_CH_T wch;
+    SetChar2(wch, ch);
+    wch = _nc_render(win, wch);
+    return ((attr_t) CharOf(wch)) | AttrOf(wch);
+}
+
+#define RENDER_WITH_DEFAULT(ch,def) w ## ch = _my_render(win, (ch == 0) ? def : ch)
+#else
+#define RENDER_WITH_DEFAULT(ch,def) w ## ch = _nc_render(win, (ch == 0) ? def : ch)
+#endif
+
+NCURSES_EXPORT(int)
+wborder(WINDOW *win,
+	chtype ls, chtype rs,
+	chtype ts, chtype bs,
+	chtype tl, chtype tr,
+	chtype bl, chtype br)
+{
+    NCURSES_SIZE_T i;
+    NCURSES_SIZE_T endx, endy;
+    chtype wls, wrs, wts, wbs, wtl, wtr, wbl, wbr;
+
+    T((T_CALLED("wborder(%p,%s,%s,%s,%s,%s,%s,%s,%s)"),
+       (void *) win,
+       _tracechtype2(1, ls),
+       _tracechtype2(2, rs),
+       _tracechtype2(3, ts),
+       _tracechtype2(4, bs),
+       _tracechtype2(5, tl),
+       _tracechtype2(6, tr),
+       _tracechtype2(7, bl),
+       _tracechtype2(8, br)));
+
+    if (!win)
+	returnCode(ERR);
+
+    RENDER_WITH_DEFAULT(ls, ACS_VLINE);
+    RENDER_WITH_DEFAULT(rs, ACS_VLINE);
+    RENDER_WITH_DEFAULT(ts, ACS_HLINE);
+    RENDER_WITH_DEFAULT(bs, ACS_HLINE);
+    RENDER_WITH_DEFAULT(tl, ACS_ULCORNER);
+    RENDER_WITH_DEFAULT(tr, ACS_URCORNER);
+    RENDER_WITH_DEFAULT(bl, ACS_LLCORNER);
+    RENDER_WITH_DEFAULT(br, ACS_LRCORNER);
+
+    T(("using %s, %s, %s, %s, %s, %s, %s, %s",
+       _tracechtype2(1, wls),
+       _tracechtype2(2, wrs),
+       _tracechtype2(3, wts),
+       _tracechtype2(4, wbs),
+       _tracechtype2(5, wtl),
+       _tracechtype2(6, wtr),
+       _tracechtype2(7, wbl),
+       _tracechtype2(8, wbr)));
+
+    endx = win->_maxx;
+    endy = win->_maxy;
+
+    for (i = 0; i <= endx; i++) {
+	SetChar2(win->_line[0].text[i], wts);
+	SetChar2(win->_line[endy].text[i], wbs);
+    }
+    win->_line[endy].firstchar = win->_line[0].firstchar = 0;
+    win->_line[endy].lastchar = win->_line[0].lastchar = endx;
+
+    for (i = 0; i <= endy; i++) {
+#if USE_WIDEC_SUPPORT
+	if (endx > 0 && isWidecExt(win->_line[i].text[endx])) {
+	    SetChar2(win->_line[i].text[endx - 1], ' ');
+	}
+#endif
+	SetChar2(win->_line[i].text[0], wls);
+	SetChar2(win->_line[i].text[endx], wrs);
+	win->_line[i].firstchar = 0;
+	win->_line[i].lastchar = endx;
+#if USE_WIDEC_SUPPORT
+	if (isWidecExt(win->_line[i].text[1])) {
+	    SetChar2(win->_line[i].text[1], ' ');
+	}
+#endif
+    }
+    SetChar2(win->_line[0].text[0], wtl);
+    SetChar2(win->_line[0].text[endx], wtr);
+    SetChar2(win->_line[endy].text[0], wbl);
+    SetChar2(win->_line[endy].text[endx], wbr);
+
+    _nc_synchook(win);
+    returnCode(OK);
+}
diff --git a/ncurses/base/lib_chgat.c b/ncurses/base/lib_chgat.c
new file mode 100644
index 0000000..74c4f75
--- /dev/null
+++ b/ncurses/base/lib_chgat.c
@@ -0,0 +1,80 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Sven Verdoolaege                        2001                    *
+ *     and: Thomas E. Dickey                        2005                    *
+ ****************************************************************************/
+
+/*
+**	lib_chgat.c
+**
+**	The routine wchgat().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_chgat.c,v 1.13 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(int)
+wchgat(WINDOW *win,
+       int n,
+       attr_t attr,
+       NCURSES_PAIRS_T pair_arg,
+       const void *opts GCC_UNUSED)
+{
+    int code = ERR;
+    int color_pair = pair_arg;
+
+    T((T_CALLED("wchgat(%p,%d,%s,%d)"),
+       (void *) win,
+       n,
+       _traceattr(attr),
+       color_pair));
+
+    set_extended_pair(opts, color_pair);
+    if (win) {
+	struct ldat *line = &(win->_line[win->_cury]);
+	int i;
+
+	toggle_attr_on(attr, ColorPair(color_pair));
+
+	for (i = win->_curx; i <= win->_maxx && (n == -1 || (n-- > 0)); i++) {
+	    SetAttr(line->text[i], attr);
+	    SetPair(line->text[i], color_pair);
+	    CHANGED_CELL(line, i);
+	}
+
+	code = OK;
+    }
+    returnCode(code);
+}
diff --git a/ncurses/base/lib_clear.c b/ncurses/base/lib_clear.c
new file mode 100644
index 0000000..2a1c97c
--- /dev/null
+++ b/ncurses/base/lib_clear.c
@@ -0,0 +1,57 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2000,2009 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ ****************************************************************************/
+
+/*
+**	lib_clear.c
+**
+**	The routine wclear().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_clear.c,v 1.9 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(int)
+wclear(WINDOW *win)
+{
+    int code = ERR;
+
+    T((T_CALLED("wclear(%p)"), (void *) win));
+
+    if ((code = werase(win)) != ERR)
+	win->_clear = TRUE;
+
+    returnCode(code);
+}
diff --git a/ncurses/base/lib_clearok.c b/ncurses/base/lib_clearok.c
new file mode 100644
index 0000000..d98287c
--- /dev/null
+++ b/ncurses/base/lib_clearok.c
@@ -0,0 +1,56 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2000,2009 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ ****************************************************************************/
+
+/*
+**	lib_clearok.c
+**
+**	The routine clearok.
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_clearok.c,v 1.6 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(int)
+clearok(WINDOW *win, bool flag)
+{
+    T((T_CALLED("clearok(%p,%d)"), (void *) win, flag));
+
+    if (win) {
+	win->_clear = flag;
+	returnCode(OK);
+    } else
+	returnCode(ERR);
+}
diff --git a/ncurses/base/lib_clrbot.c b/ncurses/base/lib_clrbot.c
new file mode 100644
index 0000000..e5482b9
--- /dev/null
+++ b/ncurses/base/lib_clrbot.c
@@ -0,0 +1,77 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2006,2009 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ ****************************************************************************/
+
+/*
+**	lib_clrbot.c
+**
+**	The routine wclrtobot().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_clrbot.c,v 1.22 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(int)
+wclrtobot(WINDOW *win)
+{
+    int code = ERR;
+
+    T((T_CALLED("wclrtobot(%p)"), (void *) win));
+
+    if (win) {
+	NCURSES_SIZE_T y;
+	NCURSES_SIZE_T startx = win->_curx;
+	NCURSES_CH_T blank = win->_nc_bkgd;
+
+	T(("clearing from y = %ld to y = %ld with maxx =  %ld",
+	   (long) win->_cury, (long) win->_maxy, (long) win->_maxx));
+
+	for (y = win->_cury; y <= win->_maxy; y++) {
+	    struct ldat *line = &(win->_line[y]);
+	    NCURSES_CH_T *ptr = &(line->text[startx]);
+	    NCURSES_CH_T *end = &(line->text[win->_maxx]);
+
+	    CHANGED_TO_EOL(line, startx, win->_maxx);
+
+	    while (ptr <= end)
+		*ptr++ = blank;
+
+	    startx = 0;
+	}
+	_nc_synchook(win);
+	code = OK;
+    }
+    returnCode(code);
+}
diff --git a/ncurses/base/lib_clreol.c b/ncurses/base/lib_clreol.c
new file mode 100644
index 0000000..0b6b0ff
--- /dev/null
+++ b/ncurses/base/lib_clreol.c
@@ -0,0 +1,92 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2001,2009 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ ****************************************************************************/
+
+/*
+**	lib_clreol.c
+**
+**	The routine wclrtoeol().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_clreol.c,v 1.24 2021/10/23 19:06:01 tom Exp $")
+
+NCURSES_EXPORT(int)
+wclrtoeol(WINDOW *win)
+{
+    int code = ERR;
+
+    T((T_CALLED("wclrtoeol(%p)"), (void *) win));
+
+    if (win) {
+	NCURSES_CH_T blank;
+	NCURSES_CH_T *ptr, *end;
+	struct ldat *line;
+	NCURSES_SIZE_T y = win->_cury;
+	NCURSES_SIZE_T x = win->_curx;
+
+	/*
+	 * If we have just wrapped the cursor, the clear applies to the
+	 * new line, unless we are at the lower right corner.
+	 */
+	if (IS_WRAPPED(win) != 0
+	    && y < win->_maxy) {
+	    win->_flags &= ~_WRAPPED;
+	}
+
+	/*
+	 * There's no point in clearing if we're not on a legal
+	 * position, either.
+	 */
+	if (IS_WRAPPED(win)
+	    || y > win->_maxy
+	    || x > win->_maxx)
+	    returnCode(ERR);
+
+	blank = win->_nc_bkgd;
+	line = &win->_line[y];
+	CHANGED_TO_EOL(line, x, win->_maxx);
+
+	ptr = &(line->text[x]);
+	end = &(line->text[win->_maxx]);
+
+	while (ptr <= end)
+	    *ptr++ = blank;
+
+	_nc_synchook(win);
+	code = OK;
+    }
+    returnCode(code);
+}
diff --git a/ncurses/base/lib_color.c b/ncurses/base/lib_color.c
new file mode 100644
index 0000000..b61d44a
--- /dev/null
+++ b/ncurses/base/lib_color.c
@@ -0,0 +1,1166 @@
+/****************************************************************************
+ * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ *     and: Juergen Pfeifer                         2009                    *
+ ****************************************************************************/
+
+/* lib_color.c
+ *
+ * Handles color emulation of SYS V curses
+ */
+
+#define NEW_PAIR_INTERNAL 1
+
+#include <curses.priv.h>
+#include <new_pair.h>
+#include <tic.h>
+
+#ifndef CUR
+#define CUR SP_TERMTYPE
+#endif
+
+MODULE_ID("$Id: lib_color.c,v 1.149 2022/04/30 18:36:54 tom Exp $")
+
+#ifdef USE_TERM_DRIVER
+#define CanChange      InfoOf(SP_PARM).canchange
+#define DefaultPalette InfoOf(SP_PARM).defaultPalette
+#define HasColor       InfoOf(SP_PARM).hascolor
+#define InitColor      InfoOf(SP_PARM).initcolor
+#define MaxColors      InfoOf(SP_PARM).maxcolors
+#define MaxPairs       InfoOf(SP_PARM).maxpairs
+#define UseHlsPalette  (DefaultPalette == _nc_hls_palette)
+#else
+#define CanChange      can_change
+#define DefaultPalette (hue_lightness_saturation ? hls_palette : cga_palette)
+#define HasColor       has_color
+#define InitColor      initialize_color
+#define MaxColors      max_colors
+#define MaxPairs       max_pairs
+#define UseHlsPalette  (hue_lightness_saturation)
+#endif
+
+#ifndef USE_TERM_DRIVER
+/*
+ * These should be screen structure members.  They need to be globals for
+ * historical reasons.  So we assign them in start_color() and also in
+ * set_term()'s screen-switching logic.
+ */
+#if USE_REENTRANT
+NCURSES_EXPORT(int)
+NCURSES_PUBLIC_VAR(COLOR_PAIRS) (void)
+{
+    return SP ? SP->_pair_count : -1;
+}
+NCURSES_EXPORT(int)
+NCURSES_PUBLIC_VAR(COLORS) (void)
+{
+    return SP ? SP->_color_count : -1;
+}
+#else
+NCURSES_EXPORT_VAR(int) COLOR_PAIRS = 0;
+NCURSES_EXPORT_VAR(int) COLORS = 0;
+#endif
+#endif /* !USE_TERM_DRIVER */
+
+#define DATA(r,g,b) {r,g,b, 0,0,0, 0}
+
+#define MAX_PALETTE	8
+
+#define OkColorHi(n)	(((n) < COLORS) && ((n) < maxcolors))
+#define InPalette(n)	((n) >= 0 && (n) < MAX_PALETTE)
+
+/*
+ * Given a RGB range of 0..1000, we'll normally set the individual values
+ * to about 2/3 of the maximum, leaving full-range for bold/bright colors.
+ */
+#define RGB_ON  680
+#define RGB_OFF 0
+/* *INDENT-OFF* */
+static const color_t cga_palette[] =
+{
+    /*  R               G               B */
+    DATA(RGB_OFF,	RGB_OFF,	RGB_OFF),	/* COLOR_BLACK */
+    DATA(RGB_ON,	RGB_OFF,	RGB_OFF),	/* COLOR_RED */
+    DATA(RGB_OFF,	RGB_ON,		RGB_OFF),	/* COLOR_GREEN */
+    DATA(RGB_ON,	RGB_ON,		RGB_OFF),	/* COLOR_YELLOW */
+    DATA(RGB_OFF,	RGB_OFF,	RGB_ON),	/* COLOR_BLUE */
+    DATA(RGB_ON,	RGB_OFF,	RGB_ON),	/* COLOR_MAGENTA */
+    DATA(RGB_OFF,	RGB_ON,		RGB_ON),	/* COLOR_CYAN */
+    DATA(RGB_ON,	RGB_ON,		RGB_ON),	/* COLOR_WHITE */
+};
+
+static const color_t hls_palette[] =
+{
+    /*  	H       L       S */
+    DATA(	0,	0,	0),		/* COLOR_BLACK */
+    DATA(	120,	50,	100),		/* COLOR_RED */
+    DATA(	240,	50,	100),		/* COLOR_GREEN */
+    DATA(	180,	50,	100),		/* COLOR_YELLOW */
+    DATA(	330,	50,	100),		/* COLOR_BLUE */
+    DATA(	60,	50,	100),		/* COLOR_MAGENTA */
+    DATA(	300,	50,	100),		/* COLOR_CYAN */
+    DATA(	0,	50,	100),		/* COLOR_WHITE */
+};
+
+#ifdef USE_TERM_DRIVER
+NCURSES_EXPORT_VAR(const color_t*) _nc_cga_palette = cga_palette;
+NCURSES_EXPORT_VAR(const color_t*) _nc_hls_palette = hls_palette;
+#endif
+
+/* *INDENT-ON* */
+#if NCURSES_EXT_FUNCS
+/*
+ * These are called from _nc_do_color(), which in turn is called from
+ * vidattr - so we have to assume that sp may be null.
+ */
+static int
+default_fg(NCURSES_SP_DCL0)
+{
+    return (SP_PARM != 0) ? SP_PARM->_default_fg : COLOR_WHITE;
+}
+
+static int
+default_bg(NCURSES_SP_DCL0)
+{
+    return SP_PARM != 0 ? SP_PARM->_default_bg : COLOR_BLACK;
+}
+#else
+#define default_fg(sp) COLOR_WHITE
+#define default_bg(sp) COLOR_BLACK
+#endif
+
+#ifndef USE_TERM_DRIVER
+/*
+ * SVr4 curses is known to interchange color codes (1,4) and (3,6), possibly
+ * to maintain compatibility with a pre-ANSI scheme.  The same scheme is
+ * also used in the FreeBSD syscons.
+ */
+static int
+toggled_colors(int c)
+{
+    if (c < 16) {
+	static const int table[] =
+	{0, 4, 2, 6, 1, 5, 3, 7,
+	 8, 12, 10, 14, 9, 13, 11, 15};
+	c = table[c];
+    }
+    return c;
+}
+#endif
+
+static void
+set_background_color(NCURSES_SP_DCLx int bg, NCURSES_SP_OUTC outc)
+{
+#ifdef USE_TERM_DRIVER
+    CallDriver_3(SP_PARM, td_color, FALSE, bg, outc);
+#else
+    if (set_a_background) {
+	TPUTS_TRACE("set_a_background");
+	NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx
+				TIPARM_1(set_a_background, bg),
+				1, outc);
+    } else {
+	TPUTS_TRACE("set_background");
+	NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx
+				TIPARM_1(set_background, toggled_colors(bg)),
+				1, outc);
+    }
+#endif
+}
+
+static void
+set_foreground_color(NCURSES_SP_DCLx int fg, NCURSES_SP_OUTC outc)
+{
+#ifdef USE_TERM_DRIVER
+    CallDriver_3(SP_PARM, td_color, TRUE, fg, outc);
+#else
+    if (set_a_foreground) {
+	TPUTS_TRACE("set_a_foreground");
+	NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx
+				TIPARM_1(set_a_foreground, fg),
+				1, outc);
+    } else {
+	TPUTS_TRACE("set_foreground");
+	NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx
+				TIPARM_1(set_foreground, toggled_colors(fg)),
+				1, outc);
+    }
+#endif
+}
+
+static void
+init_color_table(NCURSES_SP_DCL0)
+{
+    const color_t *tp = DefaultPalette;
+    int n;
+
+    assert(tp != 0);
+
+    for (n = 0; n < COLORS; n++) {
+	if (InPalette(n)) {
+	    SP_PARM->_color_table[n] = tp[n];
+	} else {
+	    SP_PARM->_color_table[n] = tp[n % MAX_PALETTE];
+	    if (UseHlsPalette) {
+		SP_PARM->_color_table[n].green = 100;
+	    } else {
+		if (SP_PARM->_color_table[n].red)
+		    SP_PARM->_color_table[n].red = 1000;
+		if (SP_PARM->_color_table[n].green)
+		    SP_PARM->_color_table[n].green = 1000;
+		if (SP_PARM->_color_table[n].blue)
+		    SP_PARM->_color_table[n].blue = 1000;
+	    }
+	}
+    }
+}
+
+static bool
+init_direct_colors(NCURSES_SP_DCL0)
+{
+    static NCURSES_CONST char name[] = "RGB";
+
+    rgb_bits_t *result = &(SP_PARM->_direct_color);
+
+    result->value = 0;
+
+    if (COLORS >= 8) {
+	int n;
+	const char *s;
+	int width;
+
+	/* find the number of bits needed for the maximum color value */
+	for (width = 0; (1 << width) - 1 < (COLORS - 1); ++width) {
+	    ;
+	}
+
+	if (tigetflag(name) > 0) {
+	    n = (width + 2) / 3;
+	    result->bits.red = UChar(n);
+	    result->bits.green = UChar(n);
+	    result->bits.blue = UChar(width - (2 * n));
+	} else if ((n = tigetnum(name)) > 0) {
+	    result->bits.red = UChar(n);
+	    result->bits.green = UChar(n);
+	    result->bits.blue = UChar(n);
+	} else if ((s = tigetstr(name)) != 0 && VALID_STRING(s)) {
+	    int red = n;
+	    int green = n;
+	    int blue = width - (2 * n);
+
+	    switch (sscanf(s, "%d/%d/%d", &red, &green, &blue)) {
+	    default:
+		blue = width - (2 * n);
+		/* FALLTHRU */
+	    case 1:
+		green = n;
+		/* FALLTHRU */
+	    case 2:
+		red = n;
+		/* FALLTHRU */
+	    case 3:
+		/* okay */
+		break;
+	    }
+	    result->bits.red = UChar(red);
+	    result->bits.green = UChar(green);
+	    result->bits.blue = UChar(blue);
+	}
+    }
+    return (result->value != 0);
+}
+
+/*
+ * Reset the color pair, e.g., to whatever color pair 0 is.
+ */
+static bool
+reset_color_pair(NCURSES_SP_DCL0)
+{
+#ifdef USE_TERM_DRIVER
+    return CallDriver(SP_PARM, td_rescol);
+#else
+    bool result = FALSE;
+
+    (void) SP_PARM;
+    if (orig_pair != 0) {
+	(void) NCURSES_PUTP2("orig_pair", orig_pair);
+	result = TRUE;
+    }
+    return result;
+#endif
+}
+
+/*
+ * Reset color pairs and definitions.  Actually we do both more to accommodate
+ * badly-written terminal descriptions than for the relatively rare case where
+ * someone has changed the color definitions.
+ */
+NCURSES_EXPORT(bool)
+NCURSES_SP_NAME(_nc_reset_colors) (NCURSES_SP_DCL0)
+{
+    int result = FALSE;
+
+    T((T_CALLED("_nc_reset_colors(%p)"), (void *) SP_PARM));
+    if (SP_PARM->_color_defs > 0)
+	SP_PARM->_color_defs = -(SP_PARM->_color_defs);
+    if (reset_color_pair(NCURSES_SP_ARG))
+	result = TRUE;
+
+#ifdef USE_TERM_DRIVER
+    result = CallDriver(SP_PARM, td_rescolors);
+#else
+    if (orig_colors != 0) {
+	NCURSES_PUTP2("orig_colors", orig_colors);
+	result = TRUE;
+    }
+#endif
+    returnBool(result);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(bool)
+_nc_reset_colors(void)
+{
+    return NCURSES_SP_NAME(_nc_reset_colors) (CURRENT_SCREEN);
+}
+#endif
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(start_color) (NCURSES_SP_DCL0)
+{
+    int result = ERR;
+
+    T((T_CALLED("start_color(%p)"), (void *) SP_PARM));
+
+    if (SP_PARM == 0) {
+	result = ERR;
+    } else if (SP_PARM->_coloron) {
+	result = OK;
+    } else {
+	int maxpairs = MaxPairs;
+	int maxcolors = MaxColors;
+	if (reset_color_pair(NCURSES_SP_ARG) != TRUE) {
+	    set_foreground_color(NCURSES_SP_ARGx
+				 default_fg(NCURSES_SP_ARG),
+				 NCURSES_SP_NAME(_nc_outch));
+	    set_background_color(NCURSES_SP_ARGx
+				 default_bg(NCURSES_SP_ARG),
+				 NCURSES_SP_NAME(_nc_outch));
+	}
+#if !NCURSES_EXT_COLORS
+	/*
+	 * Without ext-colors, we cannot represent more than 256 color pairs.
+	 */
+	if (maxpairs > 256)
+	    maxpairs = 256;
+#endif
+
+	if (maxpairs > 0 && maxcolors > 0) {
+	    SP_PARM->_pair_limit = maxpairs;
+
+#if NCURSES_EXT_FUNCS
+	    /*
+	     * If using default colors, allocate extra space in table to
+	     * allow for default-color as a component of a color-pair.
+	     */
+	    SP_PARM->_pair_limit += (1 + (2 * maxcolors));
+#if !NCURSES_EXT_COLORS
+	    SP_PARM->_pair_limit = limit_PAIRS(SP_PARM->_pair_limit);
+#endif
+#endif /* NCURSES_EXT_FUNCS */
+	    SP_PARM->_pair_count = maxpairs;
+	    SP_PARM->_color_count = maxcolors;
+#if !USE_REENTRANT
+	    COLOR_PAIRS = maxpairs;
+	    COLORS = maxcolors;
+#endif
+
+	    ReservePairs(SP_PARM, 16);
+	    if (SP_PARM->_color_pairs != 0) {
+		if (init_direct_colors(NCURSES_SP_ARG)) {
+		    result = OK;
+		} else {
+		    TYPE_CALLOC(color_t, maxcolors, SP_PARM->_color_table);
+		    if (SP_PARM->_color_table != 0) {
+			MakeColorPair(SP_PARM->_color_pairs[0],
+				      default_fg(NCURSES_SP_ARG),
+				      default_bg(NCURSES_SP_ARG));
+			init_color_table(NCURSES_SP_ARG);
+
+			result = OK;
+		    }
+		}
+		if (result == OK) {
+		    T(("started color: COLORS = %d, COLOR_PAIRS = %d",
+		       COLORS, COLOR_PAIRS));
+
+		    SP_PARM->_coloron = 1;
+		} else if (SP_PARM->_color_pairs != 0) {
+		    FreeAndNull(SP_PARM->_color_pairs);
+		}
+	    }
+	} else {
+	    result = OK;
+	}
+    }
+    returnCode(result);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+start_color(void)
+{
+    return NCURSES_SP_NAME(start_color) (CURRENT_SCREEN);
+}
+#endif
+
+/* This function was originally written by Daniel Weaver <danw@znyx.com> */
+static void
+rgb2hls(int r, int g, int b, int *h, int *l, int *s)
+/* convert RGB to HLS system */
+{
+    int min, max, t;
+
+    if ((min = g < r ? g : r) > b)
+	min = b;
+    if ((max = g > r ? g : r) < b)
+	max = b;
+
+    /* calculate lightness */
+    *l = ((min + max) / 20);
+
+    if (min == max) {		/* black, white and all shades of gray */
+	*h = 0;
+	*s = 0;
+	return;
+    }
+
+    /* calculate saturation */
+    if (*l < 50)
+	*s = (((max - min) * 100) / (max + min));
+    else
+	*s = (((max - min) * 100) / (2000 - max - min));
+
+    /* calculate hue */
+    if (r == max)
+	t = (120 + ((g - b) * 60) / (max - min));
+    else if (g == max)
+	t = (240 + ((b - r) * 60) / (max - min));
+    else
+	t = (360 + ((r - g) * 60) / (max - min));
+
+    *h = (t % 360);
+}
+
+/*
+ * Change all cells which use(d) a given color pair to force a repaint.
+ */
+NCURSES_EXPORT(void)
+_nc_change_pair(SCREEN *sp, int pair)
+{
+    int y, x;
+
+    if (CurScreen(sp)->_clear)
+	return;
+#if NO_LEAKS
+    if (_nc_globals.leak_checking)
+	return;
+#endif
+
+    for (y = 0; y <= CurScreen(sp)->_maxy; y++) {
+	struct ldat *ptr = &(CurScreen(sp)->_line[y]);
+	bool changed = FALSE;
+	for (x = 0; x <= CurScreen(sp)->_maxx; x++) {
+	    if (GetPair(ptr->text[x]) == pair) {
+		/* Set the old cell to zero to ensure it will be
+		   updated on the next doupdate() */
+		SetChar(ptr->text[x], 0, 0);
+		CHANGED_CELL(ptr, x);
+		changed = TRUE;
+	    }
+	}
+	if (changed)
+	    NCURSES_SP_NAME(_nc_make_oldhash) (NCURSES_SP_ARGx y);
+    }
+}
+
+NCURSES_EXPORT(void)
+_nc_reserve_pairs(SCREEN *sp, int want)
+{
+    int have = sp->_pair_alloc;
+
+    if (have == 0)
+	have = 1;
+    while (have <= want)
+	have *= 2;
+    if (have > sp->_pair_limit)
+	have = sp->_pair_limit;
+
+    if (sp->_color_pairs == 0) {
+	TYPE_CALLOC(colorpair_t, have, sp->_color_pairs);
+    } else if (have > sp->_pair_alloc) {
+#if NCURSES_EXT_COLORS
+	colorpair_t *next;
+
+	if ((next = typeCalloc(colorpair_t, have)) == 0)
+	    _nc_err_abort(MSG_NO_MEMORY);
+	memcpy(next, sp->_color_pairs, (size_t) sp->_pair_alloc * sizeof(*next));
+	_nc_copy_pairs(sp, next, sp->_color_pairs, sp->_pair_alloc);
+	free(sp->_color_pairs);
+	sp->_color_pairs = next;
+#else
+	TYPE_REALLOC(colorpair_t, have, sp->_color_pairs);
+	if (sp->_color_pairs != 0) {
+	    memset(sp->_color_pairs + sp->_pair_alloc, 0,
+		   sizeof(colorpair_t) * (size_t) (have - sp->_pair_alloc));
+	}
+#endif
+    }
+    if (sp->_color_pairs != 0) {
+	sp->_pair_alloc = have;
+    }
+}
+
+/*
+ * Extension (1997/1/18) - Allow negative f/b values to set default color
+ * values.
+ */
+NCURSES_EXPORT(int)
+_nc_init_pair(SCREEN *sp, int pair, int f, int b)
+{
+    static colorpair_t null_pair;
+    colorpair_t result = null_pair;
+    colorpair_t previous;
+    int maxcolors;
+
+    T((T_CALLED("init_pair(%p,%d,%d,%d)"), (void *) sp, pair, f, b));
+
+    if (!ValidPair(sp, pair))
+	returnCode(ERR);
+
+    maxcolors = MaxColors;
+
+    ReservePairs(sp, pair);
+    previous = sp->_color_pairs[pair];
+#if NCURSES_EXT_FUNCS
+    if (sp->_default_color || sp->_assumed_color) {
+	bool isDefault = FALSE;
+	bool wasDefault = FALSE;
+	int default_pairs = sp->_default_pairs;
+
+	/*
+	 * Map caller's color number, e.g., -1, 0, 1, .., 7, etc., into
+	 * internal unsigned values which we will store in the _color_pairs[]
+	 * table.
+	 */
+	if (isDefaultColor(f)) {
+	    f = COLOR_DEFAULT;
+	    isDefault = TRUE;
+	} else if (!OkColorHi(f)) {
+	    returnCode(ERR);
+	}
+
+	if (isDefaultColor(b)) {
+	    b = COLOR_DEFAULT;
+	    isDefault = TRUE;
+	} else if (!OkColorHi(b)) {
+	    returnCode(ERR);
+	}
+
+	/*
+	 * Check if the table entry that we are going to init/update used
+	 * default colors.
+	 */
+	if (isDefaultColor(FORE_OF(previous))
+	    || isDefaultColor(BACK_OF(previous)))
+	    wasDefault = TRUE;
+
+	/*
+	 * Keep track of the number of entries in the color pair table which
+	 * used a default color.
+	 */
+	if (isDefault && !wasDefault) {
+	    ++default_pairs;
+	} else if (wasDefault && !isDefault) {
+	    --default_pairs;
+	}
+
+	/*
+	 * As an extension, ncurses allows the pair number to exceed the
+	 * terminal's color_pairs value for pairs using a default color.
+	 *
+	 * Note that updating a pair which used a default color with one
+	 * that does not will decrement the count - and possibly interfere
+	 * with sequentially adding new pairs.
+	 */
+	if (pair > (sp->_pair_count + default_pairs)) {
+	    returnCode(ERR);
+	}
+	sp->_default_pairs = default_pairs;
+    } else
+#endif
+    {
+	if ((f < 0) || !OkColorHi(f)
+	    || (b < 0) || !OkColorHi(b)
+	    || (pair < 1)) {
+	    returnCode(ERR);
+	}
+    }
+
+    /*
+     * When a pair's content is changed, replace its colors (if pair was
+     * initialized before a screen update is performed replacing original
+     * pair colors with the new ones).
+     */
+    MakeColorPair(result, f, b);
+    if ((FORE_OF(previous) != 0
+	 || BACK_OF(previous) != 0)
+	&& !isSamePair(previous, result)) {
+	_nc_change_pair(sp, pair);
+    }
+
+    _nc_reset_color_pair(sp, pair, &result);
+    sp->_color_pairs[pair] = result;
+    _nc_set_color_pair(sp, pair, cpINIT);
+
+    if (GET_SCREEN_PAIR(sp) == pair)
+	SET_SCREEN_PAIR(sp, (int) (~0));	/* force attribute update */
+
+#ifdef USE_TERM_DRIVER
+    CallDriver_3(sp, td_initpair, pair, f, b);
+#else
+    if (initialize_pair && InPalette(f) && InPalette(b)) {
+	const color_t *tp = DefaultPalette;
+
+	TR(TRACE_ATTRS,
+	   ("initializing pair: pair = %d, fg=(%d,%d,%d), bg=(%d,%d,%d)",
+	    (int) pair,
+	    (int) tp[f].red, (int) tp[f].green, (int) tp[f].blue,
+	    (int) tp[b].red, (int) tp[b].green, (int) tp[b].blue));
+
+	NCURSES_PUTP2("initialize_pair",
+		      TIPARM_7(initialize_pair,
+			       pair,
+			       (int) tp[f].red,
+			       (int) tp[f].green,
+			       (int) tp[f].blue,
+			       (int) tp[b].red,
+			       (int) tp[b].green,
+			       (int) tp[b].blue));
+    }
+#endif
+
+    returnCode(OK);
+}
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(init_pair) (NCURSES_SP_DCLx
+			    NCURSES_PAIRS_T pair,
+			    NCURSES_COLOR_T f,
+			    NCURSES_COLOR_T b)
+{
+    return _nc_init_pair(SP_PARM, pair, f, b);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+init_pair(NCURSES_COLOR_T pair, NCURSES_COLOR_T f, NCURSES_COLOR_T b)
+{
+    return NCURSES_SP_NAME(init_pair) (CURRENT_SCREEN, pair, f, b);
+}
+#endif
+
+#define okRGB(n) ((n) >= 0 && (n) <= 1000)
+
+NCURSES_EXPORT(int)
+_nc_init_color(SCREEN *sp, int color, int r, int g, int b)
+{
+    int result = ERR;
+    int maxcolors;
+
+    T((T_CALLED("init_color(%p,%d,%d,%d,%d)"),
+       (void *) sp,
+       color,
+       r, g, b));
+
+    if (sp == 0 || sp->_direct_color.value)
+	returnCode(result);
+
+    maxcolors = MaxColors;
+
+    if (InitColor
+	&& sp->_coloron
+	&& (color >= 0 && OkColorHi(color))
+	&& (okRGB(r) && okRGB(g) && okRGB(b))) {
+
+	sp->_color_table[color].init = 1;
+	sp->_color_table[color].r = r;
+	sp->_color_table[color].g = g;
+	sp->_color_table[color].b = b;
+
+	if (UseHlsPalette) {
+	    rgb2hls(r, g, b,
+		    &sp->_color_table[color].red,
+		    &sp->_color_table[color].green,
+		    &sp->_color_table[color].blue);
+	} else {
+	    sp->_color_table[color].red = r;
+	    sp->_color_table[color].green = g;
+	    sp->_color_table[color].blue = b;
+	}
+
+#ifdef USE_TERM_DRIVER
+	CallDriver_4(sp, td_initcolor, color, r, g, b);
+#else
+	NCURSES_PUTP2("initialize_color",
+		      TIPARM_4(initialize_color, color, r, g, b));
+#endif
+	sp->_color_defs = max(color + 1, sp->_color_defs);
+
+	result = OK;
+    }
+    returnCode(result);
+}
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(init_color) (NCURSES_SP_DCLx
+			     NCURSES_COLOR_T color,
+			     NCURSES_COLOR_T r,
+			     NCURSES_COLOR_T g,
+			     NCURSES_COLOR_T b)
+{
+    return _nc_init_color(SP_PARM, color, r, g, b);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+init_color(NCURSES_COLOR_T color,
+	   NCURSES_COLOR_T r,
+	   NCURSES_COLOR_T g,
+	   NCURSES_COLOR_T b)
+{
+    return NCURSES_SP_NAME(init_color) (CURRENT_SCREEN, color, r, g, b);
+}
+#endif
+
+NCURSES_EXPORT(bool)
+NCURSES_SP_NAME(can_change_color) (NCURSES_SP_DCL)
+{
+    int result = FALSE;
+
+    T((T_CALLED("can_change_color(%p)"), (void *) SP_PARM));
+
+    if (HasTerminal(SP_PARM) && (CanChange != 0)) {
+	result = TRUE;
+    }
+
+    returnCode(result);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(bool)
+can_change_color(void)
+{
+    return NCURSES_SP_NAME(can_change_color) (CURRENT_SCREEN);
+}
+#endif
+
+NCURSES_EXPORT(bool)
+NCURSES_SP_NAME(has_colors) (NCURSES_SP_DCL0)
+{
+    int code = FALSE;
+
+    (void) SP_PARM;
+    T((T_CALLED("has_colors(%p)"), (void *) SP_PARM));
+    if (HasTerminal(SP_PARM)) {
+#ifdef USE_TERM_DRIVER
+	code = HasColor;
+#else
+	code = ((VALID_NUMERIC(max_colors) && VALID_NUMERIC(max_pairs)
+		 && (((set_foreground != NULL)
+		      && (set_background != NULL))
+		     || ((set_a_foreground != NULL)
+			 && (set_a_background != NULL))
+		     || set_color_pair)) ? TRUE : FALSE);
+#endif
+    }
+    returnCode(code);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(bool)
+has_colors(void)
+{
+    return NCURSES_SP_NAME(has_colors) (CURRENT_SCREEN);
+}
+#endif
+
+static int
+_nc_color_content(SCREEN *sp, int color, int *r, int *g, int *b)
+{
+    int result = ERR;
+
+    T((T_CALLED("color_content(%p,%d,%p,%p,%p)"),
+       (void *) sp,
+       color,
+       (void *) r,
+       (void *) g,
+       (void *) b));
+
+    if (sp != 0) {
+	int maxcolors = MaxColors;
+
+	if (color >= 0 && OkColorHi(color) && sp->_coloron) {
+	    int c_r, c_g, c_b;
+
+	    if (sp->_direct_color.value) {
+		rgb_bits_t *work = &(sp->_direct_color);
+
+#define max_direct_color(name)	((1 << work->bits.name) - 1)
+#define value_direct_color(max) (1000 * ((color >> bitoff) & max)) / max
+
+		int max_r = max_direct_color(red);
+		int max_g = max_direct_color(green);
+		int max_b = max_direct_color(blue);
+
+		int bitoff = 0;
+
+		c_b = value_direct_color(max_b);
+		bitoff += work->bits.blue;
+
+		c_g = value_direct_color(max_g);
+		bitoff += work->bits.green;
+
+		c_r = value_direct_color(max_r);
+
+	    } else {
+		c_r = sp->_color_table[color].red;
+		c_g = sp->_color_table[color].green;
+		c_b = sp->_color_table[color].blue;
+	    }
+
+	    if (r)
+		*r = c_r;
+	    if (g)
+		*g = c_g;
+	    if (b)
+		*b = c_b;
+
+	    TR(TRACE_ATTRS, ("...color_content(%d,%d,%d,%d)",
+			     color, c_r, c_g, c_b));
+	    result = OK;
+	}
+    }
+    if (result != OK) {
+	if (r)
+	    *r = 0;
+	if (g)
+	    *g = 0;
+	if (b)
+	    *b = 0;
+    }
+    returnCode(result);
+}
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(color_content) (NCURSES_SP_DCLx
+				NCURSES_COLOR_T color,
+				NCURSES_COLOR_T *r,
+				NCURSES_COLOR_T *g,
+				NCURSES_COLOR_T *b)
+{
+    int my_r, my_g, my_b;
+    int rc = _nc_color_content(SP_PARM, color, &my_r, &my_g, &my_b);
+    if (rc == OK) {
+	*r = limit_COLOR(my_r);
+	*g = limit_COLOR(my_g);
+	*b = limit_COLOR(my_b);
+    }
+    return rc;
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+color_content(NCURSES_COLOR_T color,
+	      NCURSES_COLOR_T *r,
+	      NCURSES_COLOR_T *g,
+	      NCURSES_COLOR_T *b)
+{
+    return NCURSES_SP_NAME(color_content) (CURRENT_SCREEN, color, r, g, b);
+}
+#endif
+
+NCURSES_EXPORT(int)
+_nc_pair_content(SCREEN *sp, int pair, int *f, int *b)
+{
+    int result;
+
+    T((T_CALLED("pair_content(%p,%d,%p,%p)"),
+       (void *) sp,
+       (int) pair,
+       (void *) f,
+       (void *) b));
+
+    if (!ValidPair(sp, pair)) {
+	result = ERR;
+    } else {
+	int fg;
+	int bg;
+
+	ReservePairs(sp, pair);
+	fg = FORE_OF(sp->_color_pairs[pair]);
+	bg = BACK_OF(sp->_color_pairs[pair]);
+#if NCURSES_EXT_FUNCS
+	if (isDefaultColor(fg))
+	    fg = -1;
+	if (isDefaultColor(bg))
+	    bg = -1;
+#endif
+
+	if (f)
+	    *f = fg;
+	if (b)
+	    *b = bg;
+
+	TR(TRACE_ATTRS, ("...pair_content(%p,%d,%d,%d)",
+			 (void *) sp,
+			 (int) pair,
+			 (int) fg, (int) bg));
+	result = OK;
+    }
+    returnCode(result);
+}
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(pair_content) (NCURSES_SP_DCLx
+			       NCURSES_PAIRS_T pair,
+			       NCURSES_COLOR_T *f,
+			       NCURSES_COLOR_T *b)
+{
+    int my_f, my_b;
+    int rc = _nc_pair_content(SP_PARM, pair, &my_f, &my_b);
+    if (rc == OK) {
+	*f = limit_COLOR(my_f);
+	*b = limit_COLOR(my_b);
+    }
+    return rc;
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+pair_content(NCURSES_COLOR_T pair, NCURSES_COLOR_T *f, NCURSES_COLOR_T *b)
+{
+    return NCURSES_SP_NAME(pair_content) (CURRENT_SCREEN, pair, f, b);
+}
+#endif
+
+NCURSES_EXPORT(void)
+NCURSES_SP_NAME(_nc_do_color) (NCURSES_SP_DCLx
+			       int old_pair,
+			       int pair,
+			       int reverse,
+			       NCURSES_SP_OUTC outc)
+{
+#ifdef USE_TERM_DRIVER
+    CallDriver_4(SP_PARM, td_docolor, old_pair, pair, reverse, outc);
+#else
+    int fg = COLOR_DEFAULT;
+    int bg = COLOR_DEFAULT;
+    int old_fg = -1;
+    int old_bg = -1;
+
+    if (!ValidPair(SP_PARM, pair)) {
+	return;
+    } else if (pair != 0) {
+	if (set_color_pair) {
+	    TPUTS_TRACE("set_color_pair");
+	    NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx
+				    TIPARM_1(set_color_pair, pair),
+				    1, outc);
+	    return;
+	} else if (SP_PARM != 0) {
+	    if (_nc_pair_content(SP_PARM, pair, &fg, &bg) == ERR)
+		return;
+	}
+    }
+
+    if (old_pair >= 0
+	&& SP_PARM != 0
+	&& _nc_pair_content(SP_PARM, old_pair, &old_fg, &old_bg) != ERR) {
+	if ((isDefaultColor(fg) && !isDefaultColor(old_fg))
+	    || (isDefaultColor(bg) && !isDefaultColor(old_bg))) {
+#if NCURSES_EXT_FUNCS
+	    /*
+	     * A minor optimization - but extension.  If "AX" is specified in
+	     * the terminal description, treat it as screen's indicator of ECMA
+	     * SGR 39 and SGR 49, and assume the two sequences are independent.
+	     */
+	    if (SP_PARM->_has_sgr_39_49
+		&& isDefaultColor(old_bg)
+		&& !isDefaultColor(old_fg)) {
+		NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx "\033[39m", 1, outc);
+	    } else if (SP_PARM->_has_sgr_39_49
+		       && isDefaultColor(old_fg)
+		       && !isDefaultColor(old_bg)) {
+		NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx "\033[49m", 1, outc);
+	    } else
+#endif
+		reset_color_pair(NCURSES_SP_ARG);
+	}
+    } else {
+	reset_color_pair(NCURSES_SP_ARG);
+	if (old_pair < 0 && pair <= 0)
+	    return;
+    }
+
+#if NCURSES_EXT_FUNCS
+    if (isDefaultColor(fg))
+	fg = default_fg(NCURSES_SP_ARG);
+    if (isDefaultColor(bg))
+	bg = default_bg(NCURSES_SP_ARG);
+#endif
+
+    if (reverse) {
+	int xx = fg;
+	fg = bg;
+	bg = xx;
+    }
+
+    TR(TRACE_ATTRS, ("setting colors: pair = %d, fg = %d, bg = %d", pair,
+		     fg, bg));
+
+    if (!isDefaultColor(fg)) {
+	set_foreground_color(NCURSES_SP_ARGx fg, outc);
+    }
+    if (!isDefaultColor(bg)) {
+	set_background_color(NCURSES_SP_ARGx bg, outc);
+    }
+#endif
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(void)
+_nc_do_color(int old_pair, int pair, int reverse, NCURSES_OUTC outc)
+{
+    SetSafeOutcWrapper(outc);
+    NCURSES_SP_NAME(_nc_do_color) (CURRENT_SCREEN,
+				   old_pair,
+				   pair,
+				   reverse,
+				   _nc_outc_wrapper);
+}
+#endif
+
+#if NCURSES_EXT_COLORS
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(init_extended_pair) (NCURSES_SP_DCLx int pair, int f, int b)
+{
+    return _nc_init_pair(SP_PARM, pair, f, b);
+}
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(init_extended_color) (NCURSES_SP_DCLx
+				      int color,
+				      int r, int g, int b)
+{
+    return _nc_init_color(SP_PARM, color, r, g, b);
+}
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(extended_color_content) (NCURSES_SP_DCLx
+					 int color,
+					 int *r, int *g, int *b)
+{
+    return _nc_color_content(SP_PARM, color, r, g, b);
+}
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(extended_pair_content) (NCURSES_SP_DCLx
+					int pair,
+					int *f, int *b)
+{
+    return _nc_pair_content(SP_PARM, pair, f, b);
+}
+
+NCURSES_EXPORT(void)
+NCURSES_SP_NAME(reset_color_pairs) (NCURSES_SP_DCL0)
+{
+    if (SP_PARM != 0) {
+	if (SP_PARM->_color_pairs) {
+	    _nc_free_ordered_pairs(SP_PARM);
+	    free(SP_PARM->_color_pairs);
+	    SP_PARM->_color_pairs = 0;
+	    SP_PARM->_pair_alloc = 0;
+	    ReservePairs(SP_PARM, 16);
+	    clearok(CurScreen(SP_PARM), TRUE);
+	    touchwin(StdScreen(SP_PARM));
+	}
+    }
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+init_extended_pair(int pair, int f, int b)
+{
+    return NCURSES_SP_NAME(init_extended_pair) (CURRENT_SCREEN, pair, f, b);
+}
+
+NCURSES_EXPORT(int)
+init_extended_color(int color, int r, int g, int b)
+{
+    return NCURSES_SP_NAME(init_extended_color) (CURRENT_SCREEN,
+						 color,
+						 r, g, b);
+}
+
+NCURSES_EXPORT(int)
+extended_color_content(int color, int *r, int *g, int *b)
+{
+    return NCURSES_SP_NAME(extended_color_content) (CURRENT_SCREEN,
+						    color,
+						    r, g, b);
+}
+
+NCURSES_EXPORT(int)
+extended_pair_content(int pair, int *f, int *b)
+{
+    return NCURSES_SP_NAME(extended_pair_content) (CURRENT_SCREEN, pair, f, b);
+}
+
+NCURSES_EXPORT(void)
+reset_color_pairs(void)
+{
+    NCURSES_SP_NAME(reset_color_pairs) (CURRENT_SCREEN);
+}
+#endif /* NCURSES_SP_FUNCS */
+#endif /* NCURSES_EXT_COLORS */
diff --git a/ncurses/base/lib_colorset.c b/ncurses/base/lib_colorset.c
new file mode 100644
index 0000000..387edef
--- /dev/null
+++ b/ncurses/base/lib_colorset.c
@@ -0,0 +1,65 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2014,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Juergen Pfeifer,  1998                                          *
+ *     and: Thomas E. Dickey, 2005-on                                       *
+ ****************************************************************************/
+
+/*
+**	lib_colorset.c
+**
+**	The routine wcolor_set().
+**
+*/
+
+#include <curses.priv.h>
+#include <ctype.h>
+
+MODULE_ID("$Id: lib_colorset.c,v 1.16 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(int)
+wcolor_set(WINDOW *win, NCURSES_PAIRS_T pair_arg, void *opts)
+{
+    int code = ERR;
+    int color_pair = pair_arg;
+
+    T((T_CALLED("wcolor_set(%p,%d)"), (void *) win, color_pair));
+    set_extended_pair(opts, color_pair);
+    if (win
+	&& (SP != 0)
+	&& (color_pair >= 0)
+	&& (color_pair < SP->_pair_limit)) {
+	TR(TRACE_ATTRS, ("... current %ld", (long) GET_WINDOW_PAIR(win)));
+	SET_WINDOW_PAIR(win, color_pair);
+	if_EXT_COLORS(win->_color = color_pair);
+	code = OK;
+    }
+    returnCode(code);
+}
diff --git a/ncurses/base/lib_delch.c b/ncurses/base/lib_delch.c
new file mode 100644
index 0000000..d39a8eb
--- /dev/null
+++ b/ncurses/base/lib_delch.c
@@ -0,0 +1,70 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2001,2009 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ ****************************************************************************/
+
+/*
+**	lib_delch.c
+**
+**	The routine wdelch().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_delch.c,v 1.14 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(int)
+wdelch(WINDOW *win)
+{
+    int code = ERR;
+
+    T((T_CALLED("wdelch(%p)"), (void *) win));
+
+    if (win) {
+	NCURSES_CH_T blank = win->_nc_bkgd;
+	struct ldat *line = &(win->_line[win->_cury]);
+	NCURSES_CH_T *end = &(line->text[win->_maxx]);
+	NCURSES_CH_T *temp2 = &(line->text[win->_curx + 1]);
+	NCURSES_CH_T *temp1 = temp2 - 1;
+
+	CHANGED_TO_EOL(line, win->_curx, win->_maxx);
+	while (temp1 < end)
+	    *temp1++ = *temp2++;
+
+	*temp1 = blank;
+
+	_nc_synchook(win);
+	code = OK;
+    }
+    returnCode(code);
+}
diff --git a/ncurses/base/lib_delwin.c b/ncurses/base/lib_delwin.c
new file mode 100644
index 0000000..1136305
--- /dev/null
+++ b/ncurses/base/lib_delwin.c
@@ -0,0 +1,102 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2008,2009 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ *     and: Juergen Pfeifer                         2008                    *
+ ****************************************************************************/
+
+/*
+**	lib_delwin.c
+**
+**	The routine delwin().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_delwin.c,v 1.24 2021/12/11 23:56:25 tom Exp $")
+
+static bool
+cannot_delete(WINDOW *win)
+{
+    bool result = TRUE;
+
+    if (IS_PAD(win)) {
+	result = FALSE;
+    } else {
+	WINDOWLIST *p;
+#ifdef USE_SP_WINDOWLIST
+	SCREEN *sp = _nc_screen_of(win);
+#endif
+
+	for (each_window(SP_PARM, p)) {
+	    if (&(p->win) == win) {
+		result = FALSE;
+	    } else if (IS_SUBWIN(&(p->win))
+		       && p->win._parent == win) {
+		result = TRUE;
+		break;
+	    }
+	}
+    }
+    return result;
+}
+
+NCURSES_EXPORT(int)
+delwin(WINDOW *win)
+{
+    int result = ERR;
+
+    T((T_CALLED("delwin(%p)"), (void *) win));
+
+    if (_nc_try_global(curses) == 0) {
+	if (win == 0
+	    || cannot_delete(win)) {
+	    result = ERR;
+	} else if (IS_PAD(win)) {
+	    win->_parent = NULL;
+	    result = _nc_freewin(win);
+	} else {
+#if NCURSES_SP_FUNCS
+	    SCREEN *sp = _nc_screen_of(win);
+#endif
+	    if (IS_SUBWIN(win)) {
+		touchwin(win->_parent);
+	    } else if (CurScreen(SP_PARM) != 0) {
+		touchwin(CurScreen(SP_PARM));
+	    }
+	    result = _nc_freewin(win);
+	}
+	_nc_unlock_global(curses);
+    }
+    returnCode(result);
+}
diff --git a/ncurses/base/lib_dft_fgbg.c b/ncurses/base/lib_dft_fgbg.c
new file mode 100644
index 0000000..4dd43bb
--- /dev/null
+++ b/ncurses/base/lib_dft_fgbg.c
@@ -0,0 +1,104 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2014,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey          1998-on                               *
+ *          Juergen Pfeifer           2009                                  *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+
+#ifndef CUR
+#define CUR SP_TERMTYPE
+#endif
+
+MODULE_ID("$Id: lib_dft_fgbg.c,v 1.31 2021/04/03 22:27:18 tom Exp $")
+
+/*
+ * Modify the behavior of color-pair 0 so that the library doesn't assume that
+ * it is white on black.  This is an extension to XSI curses.
+ */
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(use_default_colors) (NCURSES_SP_DCL0)
+{
+    T((T_CALLED("use_default_colors(%p)"), (void *) SP_PARM));
+    returnCode(NCURSES_SP_NAME(assume_default_colors) (NCURSES_SP_ARGx -1, -1));
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+use_default_colors(void)
+{
+    return NCURSES_SP_NAME(use_default_colors) (CURRENT_SCREEN);
+}
+#endif
+
+/*
+ * Modify the behavior of color-pair 0 so that the library assumes that it
+ * is something specific, possibly not white on black.
+ */
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(assume_default_colors) (NCURSES_SP_DCLx int fg, int bg)
+{
+    int code = ERR;
+
+    T((T_CALLED("assume_default_colors(%p,%d,%d)"), (void *) SP_PARM, fg, bg));
+    if (SP_PARM != 0) {
+#ifdef USE_TERM_DRIVER
+	code = CallDriver_2(SP_PARM, td_defaultcolors, fg, bg);
+#else
+	if ((orig_pair || orig_colors) && !initialize_pair) {
+
+	    SP_PARM->_default_color = isDefaultColor(fg) || isDefaultColor(bg);
+	    SP_PARM->_has_sgr_39_49 = (tigetflag("AX") == TRUE);
+	    SP_PARM->_default_fg = isDefaultColor(fg) ? COLOR_DEFAULT : fg;
+	    SP_PARM->_default_bg = isDefaultColor(bg) ? COLOR_DEFAULT : bg;
+	    if (SP_PARM->_color_pairs != 0) {
+		bool save = SP_PARM->_default_color;
+		SP_PARM->_assumed_color = TRUE;
+		SP_PARM->_default_color = TRUE;
+		NCURSES_SP_NAME(init_pair) (NCURSES_SP_ARGx 0,
+					    (short)fg,
+					    (short)bg);
+		SP_PARM->_default_color = save;
+	    }
+	    code = OK;
+	}
+#endif
+    }
+    returnCode(code);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+assume_default_colors(int fg, int bg)
+{
+    return NCURSES_SP_NAME(assume_default_colors) (CURRENT_SCREEN, fg, bg);
+}
+#endif
diff --git a/ncurses/base/lib_driver.c b/ncurses/base/lib_driver.c
new file mode 100644
index 0000000..c53802f
--- /dev/null
+++ b/ncurses/base/lib_driver.c
@@ -0,0 +1,148 @@
+/****************************************************************************
+ * Copyright 2018,2020 Thomas E. Dickey                                     *
+ * Copyright 2009-2012,2014 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Juergen Pfeifer                                                 *
+ *                                                                          *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_driver.c,v 1.9 2020/08/29 19:53:35 tom Exp $")
+
+#ifndef EXP_WIN32_DRIVER
+typedef struct DriverEntry {
+    const char *name;
+    TERM_DRIVER *driver;
+} DRIVER_ENTRY;
+
+static DRIVER_ENTRY DriverTable[] =
+{
+#ifdef _WIN32
+    {"win32console", &_nc_WIN_DRIVER},
+#endif
+    {"tinfo", &_nc_TINFO_DRIVER}	/* must be last */
+};
+
+NCURSES_EXPORT(int)
+_nc_get_driver(TERMINAL_CONTROL_BLOCK * TCB, const char *name, int *errret)
+{
+    int code = ERR;
+    size_t i;
+    TERM_DRIVER *res = (TERM_DRIVER *) 0;
+    TERM_DRIVER *use = 0;
+
+    T((T_CALLED("_nc_get_driver(%p, %s, %p)"),
+       (void *) TCB, NonNull(name), (void *) errret));
+
+    assert(TCB != 0);
+
+    for (i = 0; i < SIZEOF(DriverTable); i++) {
+	res = DriverTable[i].driver;
+	if (strcmp(DriverTable[i].name, res->td_name(TCB)) == 0) {
+	    if (res->td_CanHandle(TCB, name, errret)) {
+		use = res;
+		break;
+	    }
+	}
+    }
+    if (use != 0) {
+	TCB->drv = use;
+	code = OK;
+    }
+    returnCode(code);
+}
+#endif /* !EXP_WIN32_DRIVER */
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(has_key) (SCREEN *sp, int keycode)
+{
+    T((T_CALLED("has_key(%p, %d)"), (void *) sp, keycode));
+    returnCode(IsValidTIScreen(sp) ? CallDriver_1(sp, td_kyExist, keycode) : FALSE);
+}
+
+NCURSES_EXPORT(int)
+has_key(int keycode)
+{
+    return NCURSES_SP_NAME(has_key) (CURRENT_SCREEN, keycode);
+}
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(_nc_mcprint) (SCREEN *sp, char *data, int len)
+{
+    int code = ERR;
+
+    if (0 != TerminalOf(sp))
+	code = CallDriver_2(sp, td_print, data, len);
+    return (code);
+}
+
+NCURSES_EXPORT(int)
+mcprint(char *data, int len)
+{
+    return NCURSES_SP_NAME(_nc_mcprint) (CURRENT_SCREEN, data, len);
+}
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(doupdate) (SCREEN *sp)
+{
+    int code = ERR;
+
+    T((T_CALLED("doupdate(%p)"), (void *) sp));
+
+    if (IsValidScreen(sp))
+	code = CallDriver(sp, td_update);
+
+    returnCode(code);
+}
+
+NCURSES_EXPORT(int)
+doupdate(void)
+{
+    return NCURSES_SP_NAME(doupdate) (CURRENT_SCREEN);
+}
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(mvcur) (SCREEN *sp, int yold, int xold, int ynew, int xnew)
+{
+    int code = ERR;
+    TR(TRACE_CALLS | TRACE_MOVE, (T_CALLED("mvcur(%p,%d,%d,%d,%d)"),
+				  (void *) sp, yold, xold, ynew, xnew));
+    if (HasTerminal(sp)) {
+	code = CallDriver_4(sp, td_hwcur, yold, xold, ynew, xnew);
+    }
+    returnCode(code);
+}
+
+NCURSES_EXPORT(int)
+mvcur(int yold, int xold, int ynew, int xnew)
+/* optimized cursor move from (yold, xold) to (ynew, xnew) */
+{
+    return NCURSES_SP_NAME(mvcur) (CURRENT_SCREEN, yold, xold, ynew, xnew);
+}
diff --git a/ncurses/base/lib_echo.c b/ncurses/base/lib_echo.c
new file mode 100644
index 0000000..d8f57f2
--- /dev/null
+++ b/ncurses/base/lib_echo.c
@@ -0,0 +1,84 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2000,2009 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ *     and: Juergen Pfeifer                         2009                    *
+ ****************************************************************************/
+
+/*
+ *	echo.c
+ *
+ *	Routines:
+ *		echo()
+ *		noecho()
+ *
+ */
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_echo.c,v 1.9 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(echo) (NCURSES_SP_DCL0)
+{
+    T((T_CALLED("echo(%p)"), (void *) SP_PARM));
+    if (0 == SP_PARM)
+	returnCode(ERR);
+    SP_PARM->_echo = TRUE;
+    returnCode(OK);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+echo(void)
+{
+    return NCURSES_SP_NAME(echo) (CURRENT_SCREEN);
+}
+#endif
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(noecho) (NCURSES_SP_DCL0)
+{
+    T((T_CALLED("noecho(%p)"), (void *) SP_PARM));
+    if (0 == SP_PARM)
+	returnCode(ERR);
+    SP_PARM->_echo = FALSE;
+    returnCode(OK);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+noecho(void)
+{
+    return NCURSES_SP_NAME(noecho) (CURRENT_SCREEN);
+}
+#endif
diff --git a/ncurses/base/lib_endwin.c b/ncurses/base/lib_endwin.c
new file mode 100644
index 0000000..b8a9e4e
--- /dev/null
+++ b/ncurses/base/lib_endwin.c
@@ -0,0 +1,80 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2014,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ *     and: Juergen Pfeifer                         2009                    *
+ ****************************************************************************/
+
+/*
+**	lib_endwin.c
+**
+**	The routine endwin().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_endwin.c,v 1.25 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(endwin) (NCURSES_SP_DCL0)
+{
+    int code = ERR;
+
+    T((T_CALLED("endwin(%p)"), (void *) SP_PARM));
+
+    if (SP_PARM) {
+#ifdef USE_TERM_DRIVER
+	TERMINAL_CONTROL_BLOCK *TCB = TCBOf(SP_PARM);
+
+	SP_PARM->_endwin = ewSuspend;
+	if (TCB && TCB->drv && TCB->drv->td_scexit)
+	    TCB->drv->td_scexit(SP_PARM);
+#else
+	SP_PARM->_endwin = ewSuspend;
+	SP_PARM->_mouse_wrap(SP_PARM);
+	_nc_screen_wrap();
+	_nc_mvcur_wrap();	/* wrap up cursor addressing */
+#endif
+	code = NCURSES_SP_NAME(reset_shell_mode) (NCURSES_SP_ARG);
+    }
+
+    returnCode(code);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+endwin(void)
+{
+    return NCURSES_SP_NAME(endwin) (CURRENT_SCREEN);
+}
+#endif
diff --git a/ncurses/base/lib_erase.c b/ncurses/base/lib_erase.c
new file mode 100644
index 0000000..aa9437a
--- /dev/null
+++ b/ncurses/base/lib_erase.c
@@ -0,0 +1,97 @@
+/****************************************************************************
+ * Copyright 2020,2022 Thomas E. Dickey                                     *
+ * Copyright 1998-2009,2016 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ ****************************************************************************/
+
+/*
+**	lib_erase.c
+**
+**	The routine werase().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_erase.c,v 1.20 2022/09/03 21:40:27 tom Exp $")
+
+NCURSES_EXPORT(int)
+werase(WINDOW *win)
+{
+    int code = ERR;
+    NCURSES_CH_T *start;
+
+    T((T_CALLED("werase(%p)"), (void *) win));
+
+    if (win) {
+	NCURSES_CH_T blank;
+	NCURSES_CH_T *sp;
+	int y;
+
+	blank = win->_nc_bkgd;
+	for (y = 0; y <= win->_maxy; y++) {
+	    NCURSES_CH_T *end;
+
+	    start = win->_line[y].text;
+	    end = &start[win->_maxx];
+
+	    /*
+	     * If this is a derived window, we have to handle the case where
+	     * a multicolumn character extends into the window that we are
+	     * erasing.
+	     */
+	    if_WIDEC({
+		if (isWidecExt(start[0])) {
+		    int x = (win->_parent != 0) ? (win->_begx) : 0;
+		    while (x-- > 0) {
+			if (isWidecBase(start[-1])) {
+			    --start;
+			    break;
+			}
+			--start;
+		    }
+		}
+	    });
+
+	    for (sp = start; sp <= end; sp++)
+		*sp = blank;
+
+	    win->_line[y].firstchar = 0;
+	    win->_line[y].lastchar = win->_maxx;
+	}
+	win->_curx = win->_cury = 0;
+	win->_flags &= ~_WRAPPED;
+	_nc_synchook(win);
+	code = OK;
+    }
+    returnCode(code);
+}
diff --git a/ncurses/base/lib_flash.c b/ncurses/base/lib_flash.c
new file mode 100644
index 0000000..975d5f5
--- /dev/null
+++ b/ncurses/base/lib_flash.c
@@ -0,0 +1,88 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2013,2014 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ *     and: Juergen Pfeifer                         2009                    *
+ ****************************************************************************/
+
+/*
+ *	flash.c
+ *
+ *	The routine flash().
+ *
+ */
+
+#include <curses.priv.h>
+
+#ifndef CUR
+#define CUR SP_TERMTYPE
+#endif
+
+MODULE_ID("$Id: lib_flash.c,v 1.15 2020/02/02 23:34:34 tom Exp $")
+
+/*
+ *	flash()
+ *
+ *	Flash the current terminal's screen if possible.   If not,
+ *	sound the audible bell if one exists.
+ *
+ */
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(flash) (NCURSES_SP_DCL0)
+{
+    int res = ERR;
+
+    T((T_CALLED("flash(%p)"), (void *) SP_PARM));
+#ifdef USE_TERM_DRIVER
+    if (SP_PARM != 0)
+	res = CallDriver_1(SP_PARM, td_doBeepOrFlash, FALSE);
+#else
+    if (HasTerminal(SP_PARM)) {
+	/* FIXME: should make sure that we are not in altchar mode */
+	if (flash_screen) {
+	    res = NCURSES_PUTP2_FLUSH("flash_screen", flash_screen);
+	} else if (bell) {
+	    res = NCURSES_PUTP2_FLUSH("bell", bell);
+	}
+    }
+#endif
+    returnCode(res);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+flash(void)
+{
+    return NCURSES_SP_NAME(flash) (CURRENT_SCREEN);
+}
+#endif
diff --git a/ncurses/base/lib_freeall.c b/ncurses/base/lib_freeall.c
new file mode 100644
index 0000000..75bbe77
--- /dev/null
+++ b/ncurses/base/lib_freeall.c
@@ -0,0 +1,201 @@
+/****************************************************************************
+ * Copyright 2018-2020,2021 Thomas E. Dickey                                *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                    1996-on                     *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+#include <tic.h>
+
+#if HAVE_NC_FREEALL
+
+#if HAVE_LIBDBMALLOC
+extern int malloc_errfd;	/* FIXME */
+#endif
+
+MODULE_ID("$Id: lib_freeall.c,v 1.76 2021/11/06 21:52:49 tom Exp $")
+
+/*
+ * Free all ncurses data.  This is used for testing only (there's no practical
+ * use for it as an extension).
+ */
+NCURSES_EXPORT(void)
+NCURSES_SP_NAME(_nc_freeall) (NCURSES_SP_DCL0)
+{
+    static va_list empty_va;
+
+    T((T_CALLED("_nc_freeall()")));
+#if NO_LEAKS
+    _nc_globals.leak_checking = TRUE;
+    if (SP_PARM != 0) {
+	if (SP_PARM->_oldnum_list != 0) {
+	    FreeAndNull(SP_PARM->_oldnum_list);
+	}
+	if (SP_PARM->_panelHook.destroy != 0) {
+	    SP_PARM->_panelHook.destroy(SP_PARM->_panelHook.stdscr_pseudo_panel);
+	}
+#if NCURSES_EXT_COLORS
+	_nc_new_pair_leaks(SP_PARM);
+#endif
+    }
+#endif
+    if (SP_PARM != 0) {
+	_nc_lock_global(curses);
+
+	while (WindowList(SP_PARM) != 0) {
+	    WINDOWLIST *p, *q;
+	    bool deleted = FALSE;
+
+	    /* Delete only windows that're not a parent */
+	    for (each_window(SP_PARM, p)) {
+		WINDOW *p_win = &(p->win);
+		bool found = FALSE;
+
+		if (IS_PAD(p_win))
+		    continue;
+
+#ifndef USE_SP_WINDOWLIST
+		if (p->screen != SP_PARM)
+		    continue;
+#endif
+
+		for (each_window(SP_PARM, q)) {
+		    WINDOW *q_win = &(q->win);
+
+#ifndef USE_SP_WINDOWLIST
+		    if (q->screen != SP_PARM)
+			continue;
+#endif
+
+		    if ((p != q)
+			&& IS_SUBWIN(q_win)
+			&& (p_win == q_win->_parent)) {
+			found = TRUE;
+			break;
+		    }
+		}
+
+		if (!found) {
+		    if (delwin(p_win) != ERR)
+			deleted = TRUE;
+		    break;
+		}
+	    }
+
+	    /*
+	     * Don't continue to loop if the list is trashed.
+	     */
+	    if (!deleted)
+		break;
+	}
+	delscreen(SP_PARM);
+	_nc_unlock_global(curses);
+    }
+
+    (void) _nc_printf_string(0, empty_va);
+#ifdef TRACE
+    (void) _nc_trace_buf(-1, (size_t) 0);
+#endif
+#if USE_WIDEC_SUPPORT
+    FreeIfNeeded(_nc_wacs);
+#endif
+    _nc_leaks_tinfo();
+
+#if HAVE_LIBDBMALLOC
+    malloc_dump(malloc_errfd);
+#elif HAVE_LIBDMALLOC
+#elif HAVE_LIBMPATROL
+    __mp_summary();
+#elif HAVE_PURIFY
+    purify_all_inuse();
+#endif
+    returnVoid;
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(void)
+_nc_freeall(void)
+{
+    NCURSES_SP_NAME(_nc_freeall) (CURRENT_SCREEN);
+}
+#endif
+
+NCURSES_EXPORT(void)
+NCURSES_SP_NAME(_nc_free_and_exit) (NCURSES_SP_DCLx int code)
+{
+    T((T_CALLED("_nc_free_and_exit(%d)"), code));
+    NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_ARG);
+    NCURSES_SP_NAME(_nc_freeall) (NCURSES_SP_ARG);
+#ifdef TRACE
+    curses_trace(0);		/* close trace file, freeing its setbuf */
+    {
+	static va_list fake;
+	free(_nc_varargs("?", fake));
+    }
+#endif
+    exit(code);
+}
+
+#else /* !HAVE_NC_FREEALL */
+NCURSES_EXPORT(void)
+_nc_freeall(void)
+{
+}
+
+NCURSES_EXPORT(void)
+NCURSES_SP_NAME(_nc_free_and_exit) (NCURSES_SP_DCLx int code)
+{
+    if (SP_PARM) {
+	delscreen(SP_PARM);
+    }
+    exit(code);
+}
+#endif /* HAVE_NC_FREEALL */
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(void)
+_nc_free_and_exit(int code)
+{
+    NCURSES_SP_NAME(_nc_free_and_exit) (CURRENT_SCREEN, code);
+}
+#endif
+
+NCURSES_EXPORT(void)
+exit_curses(int code)
+{
+#if NO_LEAKS
+#if NCURSES_SP_FUNCS
+    NCURSES_SP_NAME(_nc_free_and_exit) (CURRENT_SCREEN, code);
+#else
+    _nc_free_and_exit(code);	/* deprecated... */
+#endif
+#endif
+    exit(code);
+}
diff --git a/ncurses/base/lib_getch.c b/ncurses/base/lib_getch.c
new file mode 100644
index 0000000..831ded9
--- /dev/null
+++ b/ncurses/base/lib_getch.c
@@ -0,0 +1,802 @@
+/****************************************************************************
+ * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2015,2016 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ *     and: Juergen Pfeifer                         2009                    *
+ ****************************************************************************/
+
+/*
+**	lib_getch.c
+**
+**	The routine getch().
+**
+*/
+
+#define NEED_KEY_EVENT
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_getch.c,v 1.145 2022/12/24 22:38:38 tom Exp $")
+
+#include <fifo_defs.h>
+
+#if USE_REENTRANT
+#define GetEscdelay(sp) *_nc_ptr_Escdelay(sp)
+NCURSES_EXPORT(int)
+NCURSES_PUBLIC_VAR(ESCDELAY) (void)
+{
+    return *(_nc_ptr_Escdelay(CURRENT_SCREEN));
+}
+
+NCURSES_EXPORT(int *)
+_nc_ptr_Escdelay(SCREEN *sp)
+{
+    return ptrEscdelay(sp);
+}
+#else
+#define GetEscdelay(sp) ESCDELAY
+NCURSES_EXPORT_VAR(int) ESCDELAY = 1000;
+#endif
+
+#if NCURSES_EXT_FUNCS
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(set_escdelay) (NCURSES_SP_DCLx int value)
+{
+    int code = OK;
+    if (value < 0) {
+	code = ERR;
+    } else {
+#if USE_REENTRANT
+	if (SP_PARM) {
+	    SET_ESCDELAY(value);
+	} else {
+	    code = ERR;
+	}
+#else
+	(void) SP_PARM;
+	ESCDELAY = value;
+#endif
+    }
+    return code;
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+set_escdelay(int value)
+{
+    int code;
+    if (value < 0) {
+	code = ERR;
+    } else {
+#if USE_REENTRANT
+	code = NCURSES_SP_NAME(set_escdelay) (CURRENT_SCREEN, value);
+#else
+	ESCDELAY = value;
+	code = OK;
+#endif
+    }
+    return code;
+}
+#endif
+#endif /* NCURSES_EXT_FUNCS */
+
+#if NCURSES_EXT_FUNCS
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(get_escdelay) (NCURSES_SP_DCL0)
+{
+#if !USE_REENTRANT
+    (void) SP_PARM;
+#endif
+    return GetEscdelay(SP_PARM);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+get_escdelay(void)
+{
+    return NCURSES_SP_NAME(get_escdelay) (CURRENT_SCREEN);
+}
+#endif
+#endif /* NCURSES_EXT_FUNCS */
+
+static int
+_nc_use_meta(WINDOW *win)
+{
+    SCREEN *sp = _nc_screen_of(win);
+    return (sp ? sp->_use_meta : 0);
+}
+
+#ifdef USE_TERM_DRIVER
+# if defined(_NC_WINDOWS) && !defined(EXP_WIN32_DRIVER)
+static HANDLE
+_nc_get_handle(int fd)
+{
+    intptr_t value = _get_osfhandle(fd);
+    return (HANDLE) value;
+}
+# endif
+#endif
+
+/*
+ * Check for mouse activity, returning nonzero if we find any.
+ */
+static int
+check_mouse_activity(SCREEN *sp, int delay EVENTLIST_2nd(_nc_eventlist * evl))
+{
+    int rc;
+
+#ifdef USE_TERM_DRIVER
+    TERMINAL_CONTROL_BLOCK *TCB = TCBOf(sp);
+    rc = TCBOf(sp)->drv->td_testmouse(TCBOf(sp), delay EVENTLIST_2nd(evl));
+# if defined(EXP_WIN32_DRIVER)
+    /* if we emulate terminfo on console, we have to use the console routine */
+    if (IsTermInfoOnConsole(sp)) {
+	rc = _nc_console_testmouse(sp,
+				   _nc_console_handle(sp->_ifd),
+				   delay EVENTLIST_2nd(evl));
+    } else
+# elif defined(_NC_WINDOWS)
+    /* if we emulate terminfo on console, we have to use the console routine */
+    if (IsTermInfoOnConsole(sp)) {
+	HANDLE fd = _nc_get_handle(sp->_ifd);
+	rc = _nc_mingw_testmouse(sp, fd, delay EVENTLIST_2nd(evl));
+    } else
+# endif
+	rc = TCB->drv->td_testmouse(TCB, delay EVENTLIST_2nd(evl));
+#else /* !USE_TERM_DRIVER */
+# if USE_SYSMOUSE
+    if ((sp->_mouse_type == M_SYSMOUSE)
+	&& (sp->_sysmouse_head < sp->_sysmouse_tail)) {
+	rc = TW_MOUSE;
+    } else
+# endif
+    {
+# if defined(EXP_WIN32_DRIVER)
+	rc = _nc_console_testmouse(sp,
+				   _nc_console_handle(sp->_ifd),
+				   delay
+				   EVENTLIST_2nd(evl));
+# else
+	rc = _nc_timed_wait(sp,
+			    TWAIT_MASK,
+			    delay,
+			    (int *) 0
+			    EVENTLIST_2nd(evl));
+# endif
+# if USE_SYSMOUSE
+	if ((sp->_mouse_type == M_SYSMOUSE)
+	    && (sp->_sysmouse_head < sp->_sysmouse_tail)
+	    && (rc == 0)
+	    && (errno == EINTR)) {
+	    rc |= TW_MOUSE;
+	}
+# endif
+    }
+#endif /* USE_TERM_DRIVER */
+    return rc;
+}
+
+static NCURSES_INLINE int
+fifo_peek(SCREEN *sp)
+{
+    int ch = (peek >= 0) ? sp->_fifo[peek] : ERR;
+    TR(TRACE_IEVENT, ("peeking at %d", peek));
+
+    p_inc();
+    return ch;
+}
+
+static NCURSES_INLINE int
+fifo_pull(SCREEN *sp)
+{
+    int ch = (head >= 0) ? sp->_fifo[head] : ERR;
+
+    TR(TRACE_IEVENT, ("pulling %s from %d", _nc_tracechar(sp, ch), head));
+
+    if (peek == head) {
+	h_inc();
+	peek = head;
+    } else {
+	h_inc();
+    }
+
+#ifdef TRACE
+    if (USE_TRACEF(TRACE_IEVENT)) {
+	_nc_fifo_dump(sp);
+	_nc_unlock_global(tracef);
+    }
+#endif
+    return ch;
+}
+
+static NCURSES_INLINE int
+fifo_push(SCREEN *sp EVENTLIST_2nd(_nc_eventlist * evl))
+{
+    int n;
+    int ch = 0;
+    int mask = 0;
+
+    (void) mask;
+    if (tail < 0)
+	return ERR;
+
+#ifdef NCURSES_WGETCH_EVENTS
+    if (evl
+#if USE_GPM_SUPPORT || USE_EMX_MOUSE || USE_SYSMOUSE
+	|| (sp->_mouse_fd >= 0)
+#endif
+	) {
+	mask = check_mouse_activity(sp, -1 EVENTLIST_2nd(evl));
+    } else
+	mask = 0;
+
+    if (mask & TW_EVENT) {
+	T(("fifo_push: ungetch KEY_EVENT"));
+	safe_ungetch(sp, KEY_EVENT);
+	return KEY_EVENT;
+    }
+#elif USE_GPM_SUPPORT || USE_EMX_MOUSE || USE_SYSMOUSE
+    if (sp->_mouse_fd >= 0) {
+	mask = check_mouse_activity(sp, -1 EVENTLIST_2nd(evl));
+    }
+#endif
+
+#if USE_GPM_SUPPORT || USE_EMX_MOUSE
+    if ((sp->_mouse_fd >= 0) && (mask & TW_MOUSE)) {
+	sp->_mouse_event(sp);
+	ch = KEY_MOUSE;
+	n = 1;
+    } else
+#endif
+#if USE_SYSMOUSE
+	if ((sp->_mouse_type == M_SYSMOUSE)
+	    && (sp->_sysmouse_head < sp->_sysmouse_tail)) {
+	sp->_mouse_event(sp);
+	ch = KEY_MOUSE;
+	n = 1;
+    } else if ((sp->_mouse_type == M_SYSMOUSE)
+	       && (mask <= 0) && errno == EINTR) {
+	sp->_mouse_event(sp);
+	ch = KEY_MOUSE;
+	n = 1;
+    } else
+#endif
+#ifdef USE_TERM_DRIVER
+	if ((sp->_mouse_type == M_TERM_DRIVER)
+	    && (sp->_drv_mouse_head < sp->_drv_mouse_tail)) {
+	sp->_mouse_event(sp);
+	ch = KEY_MOUSE;
+	n = 1;
+    } else
+#endif
+#if USE_KLIBC_KBD
+    if (NC_ISATTY(sp->_ifd) && sp->_cbreak) {
+	ch = _read_kbd(0, 1, !sp->_raw);
+	n = (ch == -1) ? -1 : 1;
+	sp->_extended_key = (ch == 0);
+    } else
+#endif
+    {				/* Can block... */
+#if defined(USE_TERM_DRIVER)
+	int buf;
+# if defined(EXP_WIN32_DRIVER)
+	if (NC_ISATTY(sp->_ifd) && IsTermInfoOnConsole(sp) && sp->_cbreak) {
+	    _nc_set_read_thread(TRUE);
+	    n = _nc_console_read(sp,
+				 _nc_console_handle(sp->_ifd),
+				 &buf);
+	    _nc_set_read_thread(FALSE);
+	} else
+# elif defined(_NC_WINDOWS)
+	if (NC_ISATTY(sp->_ifd) && IsTermInfoOnConsole(sp) && sp->_cbreak)
+	    n = _nc_mingw_console_read(sp,
+				       _nc_get_handle(sp->_ifd),
+				       &buf);
+	else
+# endif	/* EXP_WIN32_DRIVER */
+	    n = CallDriver_1(sp, td_read, &buf);
+	ch = buf;
+#else /* !USE_TERM_DRIVER */
+#if defined(EXP_WIN32_DRIVER)
+	int buf;
+#endif
+	unsigned char c2 = 0;
+
+	_nc_set_read_thread(TRUE);
+#if defined(EXP_WIN32_DRIVER)
+	n = _nc_console_read(sp,
+			     _nc_console_handle(sp->_ifd),
+			     &buf);
+	c2 = buf;
+#else
+	n = (int) read(sp->_ifd, &c2, (size_t) 1);
+#endif
+	_nc_set_read_thread(FALSE);
+	ch = c2;
+#endif /* USE_TERM_DRIVER */
+    }
+
+    if ((n == -1) || (n == 0)) {
+	TR(TRACE_IEVENT, ("read(%d,&ch,1)=%d, errno=%d", sp->_ifd, n, errno));
+	ch = ERR;
+    }
+    TR(TRACE_IEVENT, ("read %d characters", n));
+
+    sp->_fifo[tail] = ch;
+    sp->_fifohold = 0;
+    if (head == -1)
+	head = peek = tail;
+    t_inc();
+    TR(TRACE_IEVENT, ("pushed %s at %d", _nc_tracechar(sp, ch), tail));
+#ifdef TRACE
+    if (USE_TRACEF(TRACE_IEVENT)) {
+	_nc_fifo_dump(sp);
+	_nc_unlock_global(tracef);
+    }
+#endif
+    return ch;
+}
+
+static NCURSES_INLINE void
+fifo_clear(SCREEN *sp)
+{
+    memset(sp->_fifo, 0, sizeof(sp->_fifo));
+    head = -1;
+    tail = peek = 0;
+}
+
+static int kgetch(SCREEN *, bool EVENTLIST_2nd(_nc_eventlist *));
+
+static void
+recur_wrefresh(WINDOW *win)
+{
+#ifdef USE_PTHREADS
+    SCREEN *sp = _nc_screen_of(win);
+    bool same_sp;
+
+    if (_nc_use_pthreads) {
+	_nc_lock_global(curses);
+	same_sp = (sp == CURRENT_SCREEN);
+	_nc_unlock_global(curses);
+    } else {
+	same_sp = (sp == CURRENT_SCREEN);
+    }
+
+    if (_nc_use_pthreads && !same_sp) {
+	SCREEN *save_SP;
+
+	/* temporarily switch to the window's screen to check/refresh */
+	_nc_lock_global(curses);
+	save_SP = CURRENT_SCREEN;
+	_nc_set_screen(sp);
+	recur_wrefresh(win);
+	_nc_set_screen(save_SP);
+	_nc_unlock_global(curses);
+    } else
+#endif
+	if ((is_wintouched(win) || (win->_flags & _HASMOVED))
+	    && !IS_PAD(win)) {
+	wrefresh(win);
+    }
+}
+
+static int
+recur_wgetnstr(WINDOW *win, char *buf)
+{
+    SCREEN *sp = _nc_screen_of(win);
+    int rc;
+
+    if (sp != 0) {
+#ifdef USE_PTHREADS
+	if (_nc_use_pthreads && sp != CURRENT_SCREEN) {
+	    SCREEN *save_SP;
+
+	    /* temporarily switch to the window's screen to get cooked input */
+	    _nc_lock_global(curses);
+	    save_SP = CURRENT_SCREEN;
+	    _nc_set_screen(sp);
+	    rc = recur_wgetnstr(win, buf);
+	    _nc_set_screen(save_SP);
+	    _nc_unlock_global(curses);
+	} else
+#endif
+	{
+	    sp->_called_wgetch = TRUE;
+	    rc = wgetnstr(win, buf, MAXCOLUMNS);
+	    sp->_called_wgetch = FALSE;
+	}
+    } else {
+	rc = ERR;
+    }
+    return rc;
+}
+
+NCURSES_EXPORT(int)
+_nc_wgetch(WINDOW *win,
+	   int *result,
+	   int use_meta
+	   EVENTLIST_2nd(_nc_eventlist * evl))
+{
+    SCREEN *sp;
+    int ch;
+    int rc = 0;
+#ifdef NCURSES_WGETCH_EVENTS
+    int event_delay = -1;
+#endif
+
+    T((T_CALLED("_nc_wgetch(%p)"), (void *) win));
+
+    *result = 0;
+
+    sp = _nc_screen_of(win);
+    if (win == 0 || sp == 0) {
+	returnCode(ERR);
+    }
+
+    if (cooked_key_in_fifo()) {
+	recur_wrefresh(win);
+	*result = fifo_pull(sp);
+	returnCode(*result >= KEY_MIN ? KEY_CODE_YES : OK);
+    }
+#ifdef NCURSES_WGETCH_EVENTS
+    if (evl && (evl->count == 0))
+	evl = NULL;
+    event_delay = _nc_eventlist_timeout(evl);
+#endif
+
+    /*
+     * Handle cooked mode.  Grab a string from the screen,
+     * stuff its contents in the FIFO queue, and pop off
+     * the first character to return it.
+     */
+    if (head == -1 &&
+	!sp->_notty &&
+	!sp->_raw &&
+	!sp->_cbreak &&
+	!sp->_called_wgetch) {
+	char buf[MAXCOLUMNS], *bufp;
+
+	TR(TRACE_IEVENT, ("filling queue in cooked mode"));
+
+	/* ungetch in reverse order */
+#ifdef NCURSES_WGETCH_EVENTS
+	rc = recur_wgetnstr(win, buf);
+	if (rc != KEY_EVENT && rc != ERR)
+	    safe_ungetch(sp, '\n');
+#else
+	if (recur_wgetnstr(win, buf) != ERR)
+	    safe_ungetch(sp, '\n');
+#endif
+	for (bufp = buf + strlen(buf); bufp > buf; bufp--)
+	    safe_ungetch(sp, bufp[-1]);
+
+#ifdef NCURSES_WGETCH_EVENTS
+	/* Return it first */
+	if (rc == KEY_EVENT) {
+	    *result = rc;
+	} else
+#endif
+	    *result = fifo_pull(sp);
+	returnCode(*result >= KEY_MIN ? KEY_CODE_YES : OK);
+    }
+
+    if (win->_use_keypad != sp->_keypad_on)
+	_nc_keypad(sp, win->_use_keypad);
+
+    recur_wrefresh(win);
+
+    if (win->_notimeout || (win->_delay >= 0) || (sp->_cbreak > 1)) {
+	if (head == -1) {	/* fifo is empty */
+	    int delay;
+
+	    TR(TRACE_IEVENT, ("timed delay in wgetch()"));
+	    if (sp->_cbreak > 1)
+		delay = (sp->_cbreak - 1) * 100;
+	    else
+		delay = win->_delay;
+
+#ifdef NCURSES_WGETCH_EVENTS
+	    if (event_delay >= 0 && delay > event_delay)
+		delay = event_delay;
+#endif
+
+	    TR(TRACE_IEVENT, ("delay is %d milliseconds", delay));
+
+	    rc = check_mouse_activity(sp, delay EVENTLIST_2nd(evl));
+
+#ifdef NCURSES_WGETCH_EVENTS
+	    if (rc & TW_EVENT) {
+		*result = KEY_EVENT;
+		returnCode(KEY_CODE_YES);
+	    }
+#endif
+	    if (!rc) {
+		goto check_sigwinch;
+	    }
+	}
+	/* else go on to read data available */
+    }
+
+    if (win->_use_keypad) {
+	/*
+	 * This is tricky.  We only want to get special-key
+	 * events one at a time.  But we want to accumulate
+	 * mouse events until either (a) the mouse logic tells
+	 * us it has picked up a complete gesture, or (b)
+	 * there's a detectable time lapse after one.
+	 *
+	 * Note: if the mouse code starts failing to compose
+	 * press/release events into clicks, you should probably
+	 * increase the wait with mouseinterval().
+	 */
+	int runcount = 0;
+
+	do {
+	    ch = kgetch(sp, win->_notimeout EVENTLIST_2nd(evl));
+	    if (ch == KEY_MOUSE) {
+		++runcount;
+		if (sp->_mouse_inline(sp))
+		    break;
+	    }
+	    if (sp->_maxclick < 0)
+		break;
+	} while
+	    (ch == KEY_MOUSE
+	     && (((rc = check_mouse_activity(sp, sp->_maxclick
+					     EVENTLIST_2nd(evl))) != 0
+		  && !(rc & TW_EVENT))
+		 || !sp->_mouse_parse(sp, runcount)));
+#ifdef NCURSES_WGETCH_EVENTS
+	if ((rc & TW_EVENT) && !(ch == KEY_EVENT)) {
+	    safe_ungetch(sp, ch);
+	    ch = KEY_EVENT;
+	}
+#endif
+	if (runcount > 0 && ch != KEY_MOUSE) {
+#ifdef NCURSES_WGETCH_EVENTS
+	    /* mouse event sequence ended by an event, report event */
+	    if (ch == KEY_EVENT) {
+		safe_ungetch(sp, KEY_MOUSE);	/* FIXME This interrupts a gesture... */
+	    } else
+#endif
+	    {
+		/* mouse event sequence ended by keystroke, store keystroke */
+		safe_ungetch(sp, ch);
+		ch = KEY_MOUSE;
+	    }
+	}
+    } else {
+	if (head == -1)
+	    fifo_push(sp EVENTLIST_2nd(evl));
+	ch = fifo_pull(sp);
+    }
+
+    if (ch == ERR) {
+      check_sigwinch:
+#if USE_SIZECHANGE
+	if (_nc_handle_sigwinch(sp)) {
+	    _nc_update_screensize(sp);
+	    /* resizeterm can push KEY_RESIZE */
+	    if (cooked_key_in_fifo()) {
+		*result = fifo_pull(sp);
+		/*
+		 * Get the ERR from queue -- it is from WINCH,
+		 * so we should take it out, the "error" is handled.
+		 */
+		if (fifo_peek(sp) == -1)
+		    fifo_pull(sp);
+		returnCode(*result >= KEY_MIN ? KEY_CODE_YES : OK);
+	    }
+	}
+#endif
+	returnCode(ERR);
+    }
+
+    /*
+     * If echo() is in effect, display the printable version of the
+     * key on the screen.  Carriage return and backspace are treated
+     * specially by Solaris curses:
+     *
+     * If carriage return is defined as a function key in the
+     * terminfo, e.g., kent, then Solaris may return either ^J (or ^M
+     * if nonl() is set) or KEY_ENTER depending on the echo() mode.
+     * We echo before translating carriage return based on nonl(),
+     * since the visual result simply moves the cursor to column 0.
+     *
+     * Backspace is a different matter.  Solaris curses does not
+     * translate it to KEY_BACKSPACE if kbs=^H.  This does not depend
+     * on the stty modes, but appears to be a hardcoded special case.
+     * This is a difference from ncurses, which uses the terminfo entry.
+     * However, we provide the same visual result as Solaris, moving the
+     * cursor to the left.
+     */
+    if (sp->_echo && !IS_PAD(win)) {
+	chtype backup = (chtype) ((ch == KEY_BACKSPACE) ? '\b' : ch);
+	if (backup < KEY_MIN)
+	    wechochar(win, backup);
+    }
+
+    /*
+     * Simulate ICRNL mode
+     */
+    if ((ch == '\r') && sp->_nl)
+	ch = '\n';
+
+    /* Strip 8th-bit if so desired.  We do this only for characters that
+     * are in the range 128-255, to provide compatibility with terminals
+     * that display only 7-bit characters.  Note that 'ch' may be a
+     * function key at this point, so we mustn't strip _those_.
+     */
+    if (!use_meta)
+	if ((ch < KEY_MIN) && (ch & 0x80))
+	    ch &= 0x7f;
+
+    T(("wgetch returning : %s", _nc_tracechar(sp, ch)));
+
+    *result = ch;
+    returnCode(ch >= KEY_MIN ? KEY_CODE_YES : OK);
+}
+
+#ifdef NCURSES_WGETCH_EVENTS
+NCURSES_EXPORT(int)
+wgetch_events(WINDOW *win, _nc_eventlist * evl)
+{
+    int code;
+    int value;
+
+    T((T_CALLED("wgetch_events(%p,%p)"), (void *) win, (void *) evl));
+    code = _nc_wgetch(win,
+		      &value,
+		      _nc_use_meta(win)
+		      EVENTLIST_2nd(evl));
+    if (code != ERR)
+	code = value;
+    returnCode(code);
+}
+#endif
+
+NCURSES_EXPORT(int)
+wgetch(WINDOW *win)
+{
+    int code;
+    int value;
+
+    T((T_CALLED("wgetch(%p)"), (void *) win));
+    code = _nc_wgetch(win,
+		      &value,
+		      _nc_use_meta(win)
+		      EVENTLIST_2nd((_nc_eventlist *) 0));
+    if (code != ERR)
+	code = value;
+    returnCode(code);
+}
+
+/*
+**      int
+**      kgetch()
+**
+**      Get an input character, but take care of keypad sequences, returning
+**      an appropriate code when one matches the input.  After each character
+**      is received, set an alarm call based on ESCDELAY.  If no more of the
+**      sequence is received by the time the alarm goes off, pass through
+**      the sequence gotten so far.
+**
+**	This function must be called when there are no cooked keys in queue.
+**	(that is head==-1 || peek==head)
+**
+*/
+
+static int
+kgetch(SCREEN *sp, bool forever EVENTLIST_2nd(_nc_eventlist * evl))
+{
+    TRIES *ptr;
+    int ch = 0;
+    int timeleft = forever ? 9999999 : GetEscdelay(sp);
+
+    TR(TRACE_IEVENT, ("kgetch() called"));
+
+    ptr = sp->_keytry;
+
+    for (;;) {
+	if (cooked_key_in_fifo() && sp->_fifo[head] >= KEY_MIN) {
+	    break;
+	} else if (!raw_key_in_fifo()) {
+	    ch = fifo_push(sp EVENTLIST_2nd(evl));
+	    if (ch == ERR) {
+		peek = head;	/* the keys stay uninterpreted */
+		return ERR;
+	    }
+#ifdef NCURSES_WGETCH_EVENTS
+	    else if (ch == KEY_EVENT) {
+		peek = head;	/* the keys stay uninterpreted */
+		return fifo_pull(sp);	/* Remove KEY_EVENT from the queue */
+	    }
+#endif
+	}
+
+	ch = fifo_peek(sp);
+	if (ch >= KEY_MIN) {
+	    /* If not first in queue, somebody put this key there on purpose in
+	     * emergency.  Consider it higher priority than the unfinished
+	     * keysequence we are parsing.
+	     */
+	    peek = head;
+	    /* assume the key is the last in fifo */
+	    t_dec();		/* remove the key */
+	    return ch;
+	}
+
+	TR(TRACE_IEVENT, ("ch: %s", _nc_tracechar(sp, (unsigned char) ch)));
+	while ((ptr != NULL) && (ptr->ch != (unsigned char) ch))
+	    ptr = ptr->sibling;
+
+	if (ptr == NULL) {
+	    TR(TRACE_IEVENT, ("ptr is null"));
+	    break;
+	}
+	TR(TRACE_IEVENT, ("ptr=%p, ch=%d, value=%d",
+			  (void *) ptr, ptr->ch, ptr->value));
+
+	if (ptr->value != 0) {	/* sequence terminated */
+	    TR(TRACE_IEVENT, ("end of sequence"));
+	    if (peek == tail) {
+		fifo_clear(sp);
+	    } else {
+		head = peek;
+	    }
+	    return (ptr->value);
+	}
+
+	ptr = ptr->child;
+
+	if (!raw_key_in_fifo()) {
+	    int rc;
+
+	    TR(TRACE_IEVENT, ("waiting for rest of sequence"));
+	    rc = check_mouse_activity(sp, timeleft EVENTLIST_2nd(evl));
+#ifdef NCURSES_WGETCH_EVENTS
+	    if (rc & TW_EVENT) {
+		TR(TRACE_IEVENT, ("interrupted by a user event"));
+		/* FIXME Should have preserved remainder timeleft for reuse... */
+		peek = head;	/* Restart interpreting later */
+		return KEY_EVENT;
+	    }
+#endif
+	    if (!rc) {
+		TR(TRACE_IEVENT, ("ran out of time"));
+		break;
+	    }
+	}
+    }
+    ch = fifo_pull(sp);
+    peek = head;
+    return ch;
+}
diff --git a/ncurses/base/lib_getstr.c b/ncurses/base/lib_getstr.c
new file mode 100644
index 0000000..8ddf765
--- /dev/null
+++ b/ncurses/base/lib_getstr.c
@@ -0,0 +1,227 @@
+/****************************************************************************
+ * Copyright 2018-2020,2021 Thomas E. Dickey                                *
+ * Copyright 1998-2011,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ ****************************************************************************/
+
+/*
+**	lib_getstr.c
+**
+**	The routine wgetstr().
+**
+*/
+
+#define NEED_KEY_EVENT
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_getstr.c,v 1.38 2021/10/23 19:02:39 tom Exp $")
+
+/*
+ * This wipes out the last character, no matter whether it was a tab, control
+ * or other character, and handles reverse wraparound.
+ */
+static char *
+WipeOut(WINDOW *win, int y, int x, char *first, char *last, int echoed)
+{
+    if (last > first) {
+	*--last = '\0';
+	if (echoed) {
+	    int y1 = win->_cury;
+	    int x1 = win->_curx;
+
+	    wmove(win, y, x);
+	    waddstr(win, first);
+	    getyx(win, y, x);
+	    while (win->_cury < y1
+		   || (win->_cury == y1 && win->_curx < x1))
+		waddch(win, (chtype) ' ');
+
+	    wmove(win, y, x);
+	}
+    }
+    return last;
+}
+
+NCURSES_EXPORT(int)
+wgetnstr_events(WINDOW *win,
+		char *str,
+		int maxlen,
+		EVENTLIST_1st(_nc_eventlist * evl))
+{
+    SCREEN *sp = _nc_screen_of(win);
+    TTY buf;
+    bool oldnl, oldecho, oldraw, oldcbreak;
+    char erasec;
+    char killc;
+    char *oldstr;
+    int ch;
+    int y, x;
+
+    T((T_CALLED("wgetnstr(%p,%p,%d)"), (void *) win, (void *) str, maxlen));
+
+    if (!win || !str)
+	returnCode(ERR);
+
+    maxlen = _nc_getstr_limit(maxlen);
+
+    NCURSES_SP_NAME(_nc_get_tty_mode) (NCURSES_SP_ARGx &buf);
+
+    oldnl = sp->_nl;
+    oldecho = sp->_echo;
+    oldraw = sp->_raw;
+    oldcbreak = sp->_cbreak;
+    NCURSES_SP_NAME(nl) (NCURSES_SP_ARG);
+    NCURSES_SP_NAME(noecho) (NCURSES_SP_ARG);
+    NCURSES_SP_NAME(raw) (NCURSES_SP_ARG);
+
+    erasec = NCURSES_SP_NAME(erasechar) (NCURSES_SP_ARG);
+    killc = NCURSES_SP_NAME(killchar) (NCURSES_SP_ARG);
+
+    oldstr = str;
+    getyx(win, y, x);
+
+    if (is_wintouched(win) || (win->_flags & _HASMOVED))
+	wrefresh(win);
+
+    while ((ch = wgetch_events(win, evl)) != ERR) {
+	/*
+	 * Some terminals (the Wyse-50 is the most common) generate
+	 * a \n from the down-arrow key.  With this logic, it is the
+	 * user's choice whether to set kcud=\n for wgetch();
+	 * terminating *getstr() with \n should work either way.
+	 */
+	if (ch == '\n'
+	    || ch == '\r'
+	    || ch == KEY_DOWN
+	    || ch == KEY_ENTER) {
+	    if (oldecho == TRUE
+		&& win->_cury == win->_maxy
+		&& win->_scroll)
+		wechochar(win, (chtype) '\n');
+	    break;
+	}
+#ifdef KEY_EVENT
+	if (ch == KEY_EVENT)
+	    break;
+#endif
+#ifdef KEY_RESIZE
+	if (ch == KEY_RESIZE)
+	    break;
+#endif
+	if (ch == erasec || ch == KEY_LEFT || ch == KEY_BACKSPACE) {
+	    if (str > oldstr) {
+		str = WipeOut(win, y, x, oldstr, str, oldecho);
+	    }
+	} else if (ch == killc) {
+	    while (str > oldstr) {
+		str = WipeOut(win, y, x, oldstr, str, oldecho);
+	    }
+	} else if (ch >= KEY_MIN
+		   || (str - oldstr >= maxlen)) {
+	    NCURSES_SP_NAME(beep) (NCURSES_SP_ARG);
+	} else {
+	    *str++ = (char) ch;
+	    if (oldecho == TRUE) {
+		int oldy = win->_cury;
+		if (waddch(win, (chtype) ch) == ERR) {
+		    /*
+		     * We can't really use the lower-right
+		     * corner for input, since it'll mess
+		     * up bookkeeping for erases.
+		     */
+		    win->_flags &= ~_WRAPPED;
+		    waddch(win, (chtype) ' ');
+		    str = WipeOut(win, y, x, oldstr, str, oldecho);
+		    continue;
+		} else if (IS_WRAPPED(win)) {
+		    /*
+		     * If the last waddch forced a wrap &
+		     * scroll, adjust our reference point
+		     * for erasures.
+		     */
+		    if (win->_scroll
+			&& oldy == win->_maxy
+			&& win->_cury == win->_maxy) {
+			if (--y <= 0) {
+			    y = 0;
+			}
+		    }
+		    win->_flags &= ~_WRAPPED;
+		}
+		wrefresh(win);
+	    }
+	}
+    }
+
+    win->_curx = 0;
+    win->_flags &= ~_WRAPPED;
+    if (win->_cury < win->_maxy)
+	win->_cury++;
+    wrefresh(win);
+
+    /* Restore with a single I/O call, to fix minor asymmetry between
+     * raw/noraw, etc.
+     */
+    sp->_nl = oldnl;
+    sp->_echo = oldecho;
+    sp->_raw = oldraw;
+    sp->_cbreak = oldcbreak;
+
+    NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf);
+
+    *str = '\0';
+    if (ch == ERR)
+	returnCode(ch);
+
+    T(("wgetnstr returns %s", _nc_visbuf(oldstr)));
+
+#ifdef KEY_EVENT
+    if (ch == KEY_EVENT)
+	returnCode(ch);
+#endif
+#ifdef KEY_RESIZE
+    if (ch == KEY_RESIZE)
+	returnCode(ch);
+#endif
+
+    returnCode(OK);
+}
+
+#ifdef NCURSES_WGETCH_EVENTS
+NCURSES_EXPORT(int)
+wgetnstr(WINDOW *win, char *str, int maxlen)
+{
+    returnCode(wgetnstr_events(win,
+			       str,
+			       maxlen,
+			       EVENTLIST_1st((_nc_eventlist *) 0)));
+}
+#endif
diff --git a/ncurses/base/lib_hline.c b/ncurses/base/lib_hline.c
new file mode 100644
index 0000000..938c499
--- /dev/null
+++ b/ncurses/base/lib_hline.c
@@ -0,0 +1,89 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ *     and: Sven Verdoolaege                        2001                    *
+ ****************************************************************************/
+
+/*
+**	lib_hline.c
+**
+**	The routine whline().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_hline.c,v 1.16 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(int)
+whline(WINDOW *win, chtype ch, int n)
+{
+    int code = ERR;
+
+    T((T_CALLED("whline(%p,%s,%d)"), (void *) win, _tracechtype(ch), n));
+
+    if (win) {
+	struct ldat *line = &(win->_line[win->_cury]);
+	NCURSES_CH_T wch;
+	int start = win->_curx;
+	int end = start + n - 1;
+
+	if (end > win->_maxx)
+	    end = win->_maxx;
+
+	CHANGED_RANGE(line, start, end);
+
+	if (ch == 0)
+	    SetChar2(wch, ACS_HLINE);
+	else
+	    SetChar2(wch, ch);
+	wch = _nc_render(win, wch);
+
+#if USE_WIDEC_SUPPORT
+	if (start > 0 && isWidecExt(line->text[start])) {
+	    SetChar2(line->text[start - 1], ' ');
+	}
+	if (end < win->_maxx && isWidecExt(line->text[end + 1])) {
+	    SetChar2(line->text[end + 1], ' ');
+	}
+#endif
+	while (end >= start) {
+	    line->text[end] = wch;
+	    end--;
+	}
+
+	_nc_synchook(win);
+	code = OK;
+    }
+    returnCode(code);
+}
diff --git a/ncurses/base/lib_immedok.c b/ncurses/base/lib_immedok.c
new file mode 100644
index 0000000..23afe5b
--- /dev/null
+++ b/ncurses/base/lib_immedok.c
@@ -0,0 +1,55 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2000,2009 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ ****************************************************************************/
+
+/*
+**	lib_immedok.c
+**
+**	The routine immedok.
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_immedok.c,v 1.6 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(void)
+immedok(WINDOW *win, bool flag)
+{
+    T((T_CALLED("immedok(%p,%d)"), (void *) win, flag));
+
+    if (win)
+	win->_immed = flag;
+
+    returnVoid;
+}
diff --git a/ncurses/base/lib_inchstr.c b/ncurses/base/lib_inchstr.c
new file mode 100644
index 0000000..38af239
--- /dev/null
+++ b/ncurses/base/lib_inchstr.c
@@ -0,0 +1,69 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2010,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ ****************************************************************************/
+
+/*
+**	lib_inchstr.c
+**
+**	The routine winchnstr().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_inchstr.c,v 1.17 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(int)
+winchnstr(WINDOW *win, chtype *str, int n)
+{
+    int i = 0;
+
+    T((T_CALLED("winchnstr(%p,%p,%d)"), (void *) win, (void *) str, n));
+
+    if (!win || !str) {
+	i = ERR;
+    } else {
+	int row = win->_cury;
+	int col = win->_curx;
+	NCURSES_CH_T *text = win->_line[row].text;
+
+	for (; (n < 0 || (i < n)) && (col + i <= win->_maxx); i++) {
+	    str[i] = (((chtype) CharOf(text[col + i]) & A_CHARTEXT) |
+		      AttrOf(text[col + i]));
+	}
+	str[i] = (chtype) 0;
+    }
+
+    returnCode(i);
+}
diff --git a/ncurses/base/lib_initscr.c b/ncurses/base/lib_initscr.c
new file mode 100644
index 0000000..6b91491
--- /dev/null
+++ b/ncurses/base/lib_initscr.c
@@ -0,0 +1,110 @@
+/****************************************************************************
+ * Copyright 2019,2020 Thomas E. Dickey                                     *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ ****************************************************************************/
+
+/*
+**	lib_initscr.c
+**
+**	The routines initscr(), and termname().
+**
+*/
+
+#include <curses.priv.h>
+
+#if HAVE_SYS_TERMIO_H
+#include <sys/termio.h>		/* needed for ISC */
+#endif
+
+MODULE_ID("$Id: lib_initscr.c,v 1.48 2020/09/07 14:26:48 tom Exp $")
+
+NCURSES_EXPORT(WINDOW *)
+initscr(void)
+{
+    WINDOW *result;
+
+    START_TRACE();
+    T((T_CALLED("initscr()")));
+
+    _nc_init_pthreads();
+    _nc_lock_global(curses);
+
+    /* Portable applications must not call initscr() more than once */
+    if (!_nc_globals.init_screen) {
+	const char *env;
+	char *name;
+
+	_nc_globals.init_screen = TRUE;
+
+	env = getenv("TERM");
+	(void) VALID_TERM_ENV(env, "unknown");
+
+	if ((name = strdup(env)) == NULL) {
+	    fprintf(stderr, "Error opening allocating $TERM.\n");
+	    ExitProgram(EXIT_FAILURE);
+	}
+#ifdef __CYGWIN__
+	/*
+	 * 2002/9/21
+	 * Work around a bug in Cygwin.  Full-screen subprocesses run from
+	 * bash, in turn spawned from another full-screen process, will dump
+	 * core when attempting to write to stdout.  Opening /dev/tty
+	 * explicitly seems to fix the problem.
+	 */
+	if (NC_ISATTY(fileno(stdout))) {
+	    FILE *fp = fopen("/dev/tty", "w");
+	    if (fp != 0 && NC_ISATTY(fileno(fp))) {
+		fclose(stdout);
+		dup2(fileno(fp), STDOUT_FILENO);
+		stdout = fdopen(STDOUT_FILENO, "w");
+	    }
+	}
+#endif
+	if (newterm(name, stdout, stdin) == 0) {
+	    fprintf(stderr, "Error opening terminal: %s.\n", name);
+	    ExitProgram(EXIT_FAILURE);
+	}
+
+	/* def_shell_mode - done in newterm/_nc_setupscreen */
+#if NCURSES_SP_FUNCS
+	NCURSES_SP_NAME(def_prog_mode) (CURRENT_SCREEN);
+#else
+	def_prog_mode();
+#endif
+	free(name);
+    }
+    result = stdscr;
+    _nc_unlock_global(curses);
+
+    returnWin(result);
+}
diff --git a/ncurses/base/lib_insch.c b/ncurses/base/lib_insch.c
new file mode 100644
index 0000000..894605c
--- /dev/null
+++ b/ncurses/base/lib_insch.c
@@ -0,0 +1,165 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2013,2016 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Sven Verdoolaege                                                *
+ *     and: Thomas E. Dickey                                                *
+ ****************************************************************************/
+
+/*
+**	lib_insch.c
+**
+**	The routine winsch().
+**
+*/
+
+#include <curses.priv.h>
+#include <ctype.h>
+
+MODULE_ID("$Id: lib_insch.c,v 1.37 2020/02/02 23:34:34 tom Exp $")
+
+/*
+ * Insert the given character, updating the current location to simplify
+ * inserting a string.
+ */
+NCURSES_EXPORT(int)
+_nc_insert_ch(SCREEN *sp, WINDOW *win, chtype ch)
+{
+    int code = OK;
+    int ch8 = (int) ChCharOf(ch);
+    NCURSES_CH_T wch;
+    int count;
+    int tabsize = (
+#if USE_REENTRANT
+		      sp->_TABSIZE
+#else
+		      TABSIZE
+#endif
+    );
+
+    switch (ch) {
+    case '\t':
+	for (count = (tabsize - (win->_curx % tabsize)); count > 0; count--) {
+	    if ((code = _nc_insert_ch(sp, win, ' ')) != OK)
+		break;
+	}
+	break;
+    case '\n':
+    case '\r':
+    case '\b':
+	SetChar2(wch, ch);
+	_nc_waddch_nosync(win, wch);
+	break;
+    default:
+	if (
+#if USE_WIDEC_SUPPORT
+	       WINDOW_EXT(win, addch_used) == 0 &&
+#endif
+	       (isprint(ch8) ||
+		(ChAttrOf(ch) & A_ALTCHARSET) ||
+		(sp != 0 && sp->_legacy_coding && !iscntrl(ch8)))) {
+	    if (win->_curx <= win->_maxx) {
+		struct ldat *line = &(win->_line[win->_cury]);
+		NCURSES_CH_T *end = &(line->text[win->_curx]);
+		NCURSES_CH_T *temp1 = &(line->text[win->_maxx]);
+		NCURSES_CH_T *temp2 = temp1 - 1;
+
+		SetChar2(wch, ch);
+
+		CHANGED_TO_EOL(line, win->_curx, win->_maxx);
+		while (temp1 > end)
+		    *temp1-- = *temp2--;
+
+		*temp1 = _nc_render(win, wch);
+		win->_curx++;
+	    }
+	} else if (iscntrl(ch8)) {
+	    NCURSES_CONST char *s;
+	    s = NCURSES_SP_NAME(unctrl) (NCURSES_SP_ARGx (chtype) ch8);
+	    while (*s != '\0') {
+		code = _nc_insert_ch(sp, win, ChAttrOf(ch) | UChar(*s));
+		if (code != OK)
+		    break;
+		++s;
+	    }
+	}
+#if USE_WIDEC_SUPPORT
+	else {
+	    /*
+	     * Handle multibyte characters here
+	     */
+	    SetChar2(wch, ch);
+	    wch = _nc_render(win, wch);
+	    count = _nc_build_wch(win, &wch);
+	    if (count > 0) {
+		code = _nc_insert_wch(win, &wch);
+	    } else if (count == -1) {
+		NCURSES_CONST char *s;
+		/* handle EILSEQ */
+		s = NCURSES_SP_NAME(unctrl) (NCURSES_SP_ARGx (chtype) ch8);
+		if (strlen(s) > 1) {
+		    while (*s != '\0') {
+			code = _nc_insert_ch(sp, win,
+					     ChAttrOf(ch) | UChar(*s));
+			if (code != OK)
+			    break;
+			++s;
+		    }
+		} else {
+		    code = ERR;
+		}
+	    }
+	}
+#endif
+	break;
+    }
+    return code;
+}
+
+NCURSES_EXPORT(int)
+winsch(WINDOW *win, chtype c)
+{
+    int code = ERR;
+
+    T((T_CALLED("winsch(%p, %s)"), (void *) win, _tracechtype(c)));
+
+    if (win != 0) {
+	NCURSES_SIZE_T oy = win->_cury;
+	NCURSES_SIZE_T ox = win->_curx;
+
+	code = _nc_insert_ch(_nc_screen_of(win), win, c);
+
+	win->_curx = ox;
+	win->_cury = oy;
+	_nc_synchook(win);
+    }
+    returnCode(code);
+}
diff --git a/ncurses/base/lib_insdel.c b/ncurses/base/lib_insdel.c
new file mode 100644
index 0000000..7c00739
--- /dev/null
+++ b/ncurses/base/lib_insdel.c
@@ -0,0 +1,64 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2003,2009 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ ****************************************************************************/
+
+/*
+**	lib_insdel.c
+**
+**	The routine winsdelln(win, n).
+**  positive n insert n lines above current line
+**  negative n delete n lines starting from current line
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_insdel.c,v 1.14 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(int)
+winsdelln(WINDOW *win, int n)
+{
+    int code = ERR;
+
+    T((T_CALLED("winsdelln(%p,%d)"), (void *) win, n));
+
+    if (win) {
+	if (n != 0) {
+	    _nc_scroll_window(win, -n, win->_cury, win->_maxy,
+			      win->_nc_bkgd);
+	    _nc_synchook(win);
+	}
+	code = OK;
+    }
+    returnCode(code);
+}
diff --git a/ncurses/base/lib_insnstr.c b/ncurses/base/lib_insnstr.c
new file mode 100644
index 0000000..dd51a9c
--- /dev/null
+++ b/ncurses/base/lib_insnstr.c
@@ -0,0 +1,96 @@
+/****************************************************************************
+ * Copyright 2018-2020,2022 Thomas E. Dickey                                *
+ * Copyright 2004-2009,2016 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                                                *
+ ****************************************************************************/
+
+/*
+**	lib_insnstr.c
+**
+**	The routine winsnstr().
+**
+*/
+
+#include <curses.priv.h>
+#include <ctype.h>
+
+MODULE_ID("$Id: lib_insnstr.c,v 1.8 2022/05/21 17:35:15 tom Exp $")
+
+NCURSES_EXPORT(int)
+winsnstr(WINDOW *win, const char *s, int n)
+{
+    int code = ERR;
+    const unsigned char *str = (const unsigned char *) s;
+
+    T((T_CALLED("winsnstr(%p,%s,%d)"), (void *) win, _nc_visbufn(s, n), n));
+
+    if (win != 0 && str != 0) {
+	SCREEN *sp = _nc_screen_of(win);
+#if USE_WIDEC_SUPPORT
+	/*
+	 * If the output contains "wide" (multibyte) characters, we will not
+	 * really know the width of a character until we get the last byte
+	 * of the character.  Since the preceding byte(s) may use more columns
+	 * on the screen than the final character, it is best to route the
+	 * call to the wins_nwstr() function.
+	 */
+	if (sp->_screen_unicode) {
+	    size_t nn = (n > 0) ? (size_t) n : strlen(s);
+	    wchar_t *buffer = typeMalloc(wchar_t, nn + 1);
+	    if (buffer != 0) {
+		mbstate_t state;
+		size_t n3;
+		init_mb(state);
+		n3 = mbstowcs(buffer, s, nn);
+		if (n3 != (size_t) (-1)) {
+		    buffer[n3] = '\0';
+		    code = wins_nwstr(win, buffer, (int) n3);
+		}
+		free(buffer);
+	    }
+	}
+	if (code == ERR)
+#endif
+	{
+	    NCURSES_SIZE_T oy = win->_cury;
+	    NCURSES_SIZE_T ox = win->_curx;
+	    const unsigned char *cp;
+
+	    for (cp = str; (n <= 0 || (cp - str) < n) && *cp; cp++) {
+		_nc_insert_ch(sp, win, (chtype) UChar(*cp));
+	    }
+	    win->_curx = ox;
+	    win->_cury = oy;
+	    _nc_synchook(win);
+	    code = OK;
+	}
+    }
+    returnCode(code);
+}
diff --git a/ncurses/base/lib_instr.c b/ncurses/base/lib_instr.c
new file mode 100644
index 0000000..b9874b7
--- /dev/null
+++ b/ncurses/base/lib_instr.c
@@ -0,0 +1,122 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ ****************************************************************************/
+
+/*
+**	lib_instr.c
+**
+**	The routine winnstr().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_instr.c,v 1.25 2021/04/03 22:24:18 tom Exp $")
+
+NCURSES_EXPORT(int)
+winnstr(WINDOW *win, char *str, int n)
+{
+    int i = 0;
+
+    T((T_CALLED("winnstr(%p,%p,%d)"), (void *) win, str, n));
+
+    if (!win || !str) {
+	i = ERR;
+    } else {
+	int row = win->_cury;
+	int col = win->_curx;
+	NCURSES_CH_T *text = win->_line[row].text;
+
+	if (n < 0)
+	    n = win->_maxx - col + 1;
+
+	for (; i < n;) {
+#if USE_WIDEC_SUPPORT
+	    cchar_t *cell = &(text[col]);
+	    attr_t attrs;
+	    NCURSES_PAIRS_T pair;
+	    char *tmp;
+
+	    if (!isWidecExt(*cell)) {
+		wchar_t *wch;
+		int n2;
+
+		n2 = getcchar(cell, 0, 0, 0, 0);
+		if (n2 > 0
+		    && (wch = typeCalloc(wchar_t, (unsigned) n2 + 1)) != 0) {
+		    bool done = FALSE;
+
+		    if (getcchar(cell, wch, &attrs, &pair, 0) == OK) {
+			mbstate_t state;
+			size_t n3;
+
+			init_mb(state);
+			n3 = wcstombs(0, wch, (size_t) 0);
+			if (!isEILSEQ(n3) && (n3 != 0)) {
+			    size_t need = n3 + 10 + (size_t) i;
+			    int have = (int) n3 + i;
+
+			    /* check for loop-done as well as overflow */
+			    if (have > n || (int) need <= 0) {
+				done = TRUE;
+			    } else if ((tmp = typeCalloc(char, need)) == 0) {
+				done = TRUE;
+			    } else {
+				size_t i3;
+
+				init_mb(state);
+				wcstombs(tmp, wch, n3);
+				for (i3 = 0; i3 < n3; ++i3)
+				    str[i++] = tmp[i3];
+				free(tmp);
+			    }
+			}
+		    }
+		    free(wch);
+		    if (done)
+			break;
+		}
+	    }
+#else
+	    str[i++] = (char) CharOf(text[col]);
+#endif
+	    if (++col > win->_maxx) {
+		break;
+	    }
+	}
+	str[i] = '\0';		/* SVr4 does not seem to count the null */
+    }
+    T(("winnstr returns %s", _nc_visbuf(str)));
+    returnCode(i);
+}
diff --git a/ncurses/base/lib_isendwin.c b/ncurses/base/lib_isendwin.c
new file mode 100644
index 0000000..a54d500
--- /dev/null
+++ b/ncurses/base/lib_isendwin.c
@@ -0,0 +1,62 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2009,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ *     and: Juergen Pfeifer                         2009                    *
+ ****************************************************************************/
+
+/*
+**	lib_endwin.c
+**
+**	The routine endwin().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_isendwin.c,v 1.9 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(bool)
+NCURSES_SP_NAME(isendwin) (NCURSES_SP_DCL0)
+{
+    if (SP_PARM == NULL)
+	return FALSE;
+    return (SP_PARM->_endwin == ewSuspend);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(bool)
+isendwin(void)
+{
+    return NCURSES_SP_NAME(isendwin) (CURRENT_SCREEN);
+}
+#endif
diff --git a/ncurses/base/lib_leaveok.c b/ncurses/base/lib_leaveok.c
new file mode 100644
index 0000000..4d05b2c
--- /dev/null
+++ b/ncurses/base/lib_leaveok.c
@@ -0,0 +1,56 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2000,2009 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ ****************************************************************************/
+
+/*
+**	lib_leaveok.c
+**
+**	The routine leaveok.
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_leaveok.c,v 1.7 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(int)
+leaveok(WINDOW *win, bool flag)
+{
+    T((T_CALLED("leaveok(%p,%d)"), (void *) win, flag));
+
+    if (win) {
+	win->_leaveok = flag;
+	returnCode(OK);
+    } else
+	returnCode(ERR);
+}
diff --git a/ncurses/base/lib_mouse.c b/ncurses/base/lib_mouse.c
new file mode 100644
index 0000000..f4151b8
--- /dev/null
+++ b/ncurses/base/lib_mouse.c
@@ -0,0 +1,2056 @@
+/****************************************************************************
+ * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ *     and: Juergen Pfeifer                         2008                    *
+ ****************************************************************************/
+
+/*
+ * This module is intended to encapsulate ncurses's interface to pointing
+ * devices.
+ *
+ * The primary method used is xterm's internal mouse-tracking facility.
+ * Additional methods depend on the platform:
+ *	Alessandro Rubini's GPM server (Linux)
+ *	sysmouse (FreeBSD)
+ *	special-purpose mouse interface for OS/2 EMX.
+ *
+ * Notes for implementors of new mouse-interface methods:
+ *
+ * The code is logically split into a lower level that accepts event reports
+ * in a device-dependent format and an upper level that parses mouse gestures
+ * and filters events.  The mediating data structure is a circular queue of
+ * MEVENT structures.
+ *
+ * Functionally, the lower level's job is to pick up primitive events and
+ * put them on the circular queue.  This can happen in one of two ways:
+ * either (a) _nc_mouse_event() detects a series of incoming mouse reports
+ * and queues them, or (b) code in lib_getch.c detects the kmous prefix in
+ * the keyboard input stream and calls _nc_mouse_inline to queue up a series
+ * of adjacent mouse reports.
+ *
+ * In either case, _nc_mouse_parse() should be called after the series is
+ * accepted to parse the digested mouse reports (low-level MEVENTs) into
+ * a gesture (a high-level or composite MEVENT).
+ *
+ * Don't be too shy about adding new event types or modifiers, if you can find
+ * room for them in the 32-bit mask.  The API is written so that users get
+ * feedback on which theoretical event types they won't see when they call
+ * mousemask. There's one bit per button (the RESERVED_EVENT bit) not being
+ * used yet, and a couple of bits open at the high end.
+ */
+
+#ifdef __EMX__
+#  include <io.h>
+#  define  INCL_DOS
+#  define  INCL_VIO
+#  define  INCL_KBD
+#  define  INCL_MOU
+#  define  INCL_DOSPROCESS
+#  include <os2.h>		/* Need to include before the others */
+#endif
+
+#include <curses.priv.h>
+
+#ifndef CUR
+#define CUR SP_TERMTYPE
+#endif
+
+MODULE_ID("$Id: lib_mouse.c,v 1.197 2022/08/13 14:13:12 tom Exp $")
+
+#include <tic.h>
+
+#if USE_GPM_SUPPORT
+#include <linux/keyboard.h>	/* defines KG_* macros */
+
+#ifdef HAVE_LIBDL
+/* use dynamic loader to avoid linkage dependency */
+#include <dlfcn.h>
+
+#ifdef RTLD_NOW
+#define my_RTLD RTLD_NOW
+#else
+#ifdef RTLD_LAZY
+#define my_RTLD RTLD_LAZY
+#else
+make an error
+#endif
+#endif				/* RTLD_NOW */
+#endif				/* HAVE_LIBDL */
+
+#endif				/* USE_GPM_SUPPORT */
+
+#if USE_SYSMOUSE
+#undef buttons			/* symbol conflict in consio.h */
+#undef mouse_info		/* symbol conflict in consio.h */
+#include <osreldate.h>
+#if defined(__DragonFly_version) || (defined(__FreeBSD__) && (__FreeBSD_version >= 400017))
+#include <sys/consio.h>
+#include <sys/fbio.h>
+#else
+#include <machine/console.h>
+#endif
+#endif				/* use_SYSMOUSE */
+
+#if USE_KLIBC_MOUSE
+#include <sys/socket.h>
+#define pipe(handles) socketpair(AF_LOCAL, SOCK_STREAM, 0, handles)
+#define DosWrite(hfile, pbuffer, cbwrite, pcbactual) \
+		write(hfile, pbuffer, cbwrite)
+#define DosExit(action, result )	/* do nothing */
+#define DosCreateThread(ptid, pfn, param, flag, cbStack) \
+		(*(ptid) = _beginthread(pfn, NULL, cbStack, \
+					(void *)param), (*(ptid) == -1))
+#endif
+
+#define MY_TRACE TRACE_ICALLS|TRACE_IEVENT
+
+#define	MASK_RELEASE(x)		(mmask_t) NCURSES_MOUSE_MASK(x, 001)
+#define	MASK_PRESS(x)		(mmask_t) NCURSES_MOUSE_MASK(x, 002)
+#define	MASK_CLICK(x)		(mmask_t) NCURSES_MOUSE_MASK(x, 004)
+#define	MASK_DOUBLE_CLICK(x)	(mmask_t) NCURSES_MOUSE_MASK(x, 010)
+#define	MASK_TRIPLE_CLICK(x)	(mmask_t) NCURSES_MOUSE_MASK(x, 020)
+#define	MASK_RESERVED_EVENT(x)	(mmask_t) NCURSES_MOUSE_MASK(x, 040)
+
+#if NCURSES_MOUSE_VERSION == 1
+
+#define BUTTON_CLICKED        (BUTTON1_CLICKED        | BUTTON2_CLICKED        | BUTTON3_CLICKED        | BUTTON4_CLICKED)
+#define BUTTON_PRESSED        (BUTTON1_PRESSED        | BUTTON2_PRESSED        | BUTTON3_PRESSED        | BUTTON4_PRESSED)
+#define BUTTON_RELEASED       (BUTTON1_RELEASED       | BUTTON2_RELEASED       | BUTTON3_RELEASED       | BUTTON4_RELEASED)
+#define BUTTON_DOUBLE_CLICKED (BUTTON1_DOUBLE_CLICKED | BUTTON2_DOUBLE_CLICKED | BUTTON3_DOUBLE_CLICKED | BUTTON4_DOUBLE_CLICKED)
+#define BUTTON_TRIPLE_CLICKED (BUTTON1_TRIPLE_CLICKED | BUTTON2_TRIPLE_CLICKED | BUTTON3_TRIPLE_CLICKED | BUTTON4_TRIPLE_CLICKED)
+
+#define MAX_BUTTONS  4
+
+#else
+
+#define BUTTON_CLICKED        (BUTTON1_CLICKED        | BUTTON2_CLICKED        | BUTTON3_CLICKED        | BUTTON4_CLICKED        | BUTTON5_CLICKED)
+#define BUTTON_PRESSED        (BUTTON1_PRESSED        | BUTTON2_PRESSED        | BUTTON3_PRESSED        | BUTTON4_PRESSED        | BUTTON5_PRESSED)
+#define BUTTON_RELEASED       (BUTTON1_RELEASED       | BUTTON2_RELEASED       | BUTTON3_RELEASED       | BUTTON4_RELEASED       | BUTTON5_RELEASED)
+#define BUTTON_DOUBLE_CLICKED (BUTTON1_DOUBLE_CLICKED | BUTTON2_DOUBLE_CLICKED | BUTTON3_DOUBLE_CLICKED | BUTTON4_DOUBLE_CLICKED | BUTTON5_DOUBLE_CLICKED)
+#define BUTTON_TRIPLE_CLICKED (BUTTON1_TRIPLE_CLICKED | BUTTON2_TRIPLE_CLICKED | BUTTON3_TRIPLE_CLICKED | BUTTON4_TRIPLE_CLICKED | BUTTON5_TRIPLE_CLICKED)
+
+#if NCURSES_MOUSE_VERSION == 2
+#define MAX_BUTTONS  5
+#else
+#define MAX_BUTTONS  11
+#endif
+
+#endif
+
+#define INVALID_EVENT	-1
+#define NORMAL_EVENT	0
+
+#define ValidEvent(ep) ((ep)->id != INVALID_EVENT)
+#define Invalidate(ep) (ep)->id = INVALID_EVENT
+
+#if USE_GPM_SUPPORT
+
+#ifndef LIBGPM_SONAME
+#define LIBGPM_SONAME "libgpm.so"
+#endif
+
+#define GET_DLSYM(name) (my_##name = (TYPE_##name) dlsym(sp->_dlopen_gpm, #name))
+
+#endif				/* USE_GPM_SUPPORT */
+
+static bool _nc_mouse_parse(SCREEN *, int);
+static void _nc_mouse_resume(SCREEN *);
+static void _nc_mouse_wrap(SCREEN *);
+
+/* maintain a circular list of mouse events */
+
+#define FirstEV(sp)	((sp)->_mouse_events)
+#define LastEV(sp)	((sp)->_mouse_events + EV_MAX - 1)
+
+#undef  NEXT
+#define NEXT(ep)	((ep >= LastEV(SP_PARM)) \
+			 ? FirstEV(SP_PARM) \
+			 : ep + 1)
+
+#undef  PREV
+#define PREV(ep)	((ep <= FirstEV(SP_PARM)) \
+			 ? LastEV(SP_PARM) \
+			 : ep - 1)
+
+#define IndexEV(sp, ep)	(ep - FirstEV(sp))
+
+#define RunParams(sp, eventp, runp) \
+		(long) IndexEV(sp, runp), \
+		(long) (IndexEV(sp, eventp) + (EV_MAX - 1)) % EV_MAX
+
+#ifdef TRACE
+static void
+_trace_slot(SCREEN *sp, const char *tag)
+{
+    MEVENT *ep;
+
+    _tracef("%s", tag);
+
+    for (ep = FirstEV(sp); ep <= LastEV(sp); ep++)
+	_tracef("mouse event queue slot %ld = %s",
+		(long) IndexEV(sp, ep),
+		_nc_tracemouse(sp, ep));
+}
+#endif
+
+#if USE_EMX_MOUSE
+
+#  define TOP_ROW          0
+#  define LEFT_COL         0
+
+#  define M_FD(sp) sp->_mouse_fd
+
+static void
+write_event(SCREEN *sp, int down, int button, int x, int y)
+{
+    char buf[6];
+    unsigned long ignore;
+
+    _nc_STRCPY(buf, "\033[M", sizeof(buf));	/* should be the same as key_mouse */
+    buf[3] = ' ' + (button - 1) + (down ? 0 : 0x40);
+    buf[4] = ' ' + x - LEFT_COL + 1;
+    buf[5] = ' ' + y - TOP_ROW + 1;
+    DosWrite(sp->_emxmouse_wfd, buf, 6, &ignore);
+}
+
+static void
+#if USE_KLIBC_MOUSE
+mouse_server(void *param)
+#else
+mouse_server(unsigned long param)
+#endif
+{
+    SCREEN *sp = (SCREEN *) param;
+    unsigned short fWait = MOU_WAIT;
+    /* NOPTRRECT mourt = { 0,0,24,79 }; */
+    MOUEVENTINFO mouev;
+    HMOU hmou;
+    unsigned short mask = MOUSE_BN1_DOWN | MOUSE_BN2_DOWN | MOUSE_BN3_DOWN;
+    int nbuttons = 3;
+    int oldstate = 0;
+    char err[80];
+    unsigned long rc;
+
+    /* open the handle for the mouse */
+    if (MouOpen(NULL, &hmou) == 0) {
+	rc = MouSetEventMask(&mask, hmou);
+	if (rc) {		/* retry with 2 buttons */
+	    mask = MOUSE_BN1_DOWN | MOUSE_BN2_DOWN;
+	    rc = MouSetEventMask(&mask, hmou);
+	    nbuttons = 2;
+	}
+	if (rc == 0 && MouDrawPtr(hmou) == 0) {
+	    for (;;) {
+		/* sit and wait on the event queue */
+		rc = MouReadEventQue(&mouev, &fWait, hmou);
+		if (rc) {
+		    _nc_SPRINTF(err, _nc_SLIMIT(sizeof(err))
+				"Error reading mouse queue, rc=%lu.\r\n", rc);
+		    break;
+		}
+		if (!sp->_emxmouse_activated)
+		    goto finish;
+
+		/*
+		 * OS/2 numbers a 3-button mouse inconsistently from other
+		 * platforms:
+		 *      1 = left
+		 *      2 = right
+		 *      3 = middle.
+		 */
+		if ((mouev.fs ^ oldstate) & MOUSE_BN1_DOWN)
+		    write_event(sp, mouev.fs & MOUSE_BN1_DOWN,
+				sp->_emxmouse_buttons[1], mouev.col, mouev.row);
+		if ((mouev.fs ^ oldstate) & MOUSE_BN2_DOWN)
+		    write_event(sp, mouev.fs & MOUSE_BN2_DOWN,
+				sp->_emxmouse_buttons[3], mouev.col, mouev.row);
+		if ((mouev.fs ^ oldstate) & MOUSE_BN3_DOWN)
+		    write_event(sp, mouev.fs & MOUSE_BN3_DOWN,
+				sp->_emxmouse_buttons[2], mouev.col, mouev.row);
+
+	      finish:
+		oldstate = mouev.fs;
+	    }
+	} else {
+	    _nc_SPRINTF(err, _nc_SLIMIT(sizeof(err))
+			"Error setting event mask, buttons=%d, rc=%lu.\r\n",
+			nbuttons, rc);
+	}
+
+	DosWrite(2, err, strlen(err), &rc);
+	MouClose(hmou);
+    }
+    DosExit(EXIT_THREAD, 0L);
+}
+
+#endif /* USE_EMX_MOUSE */
+
+#if USE_SYSMOUSE
+static void
+sysmouse_server(SCREEN *sp)
+{
+    struct mouse_info the_mouse;
+    MEVENT *work;
+
+    the_mouse.operation = MOUSE_GETINFO;
+    if (sp != 0
+	&& sp->_mouse_fd >= 0
+	&& sp->_sysmouse_tail < FIFO_SIZE
+	&& ioctl(sp->_mouse_fd, CONS_MOUSECTL, &the_mouse) != -1) {
+
+	if (sp->_sysmouse_head > sp->_sysmouse_tail) {
+	    sp->_sysmouse_tail = 0;
+	    sp->_sysmouse_head = 0;
+	}
+	work = &(sp->_sysmouse_fifo[sp->_sysmouse_tail]);
+	memset(work, 0, sizeof(*work));
+	work->id = NORMAL_EVENT;	/* there's only one mouse... */
+
+	sp->_sysmouse_old_buttons = sp->_sysmouse_new_buttons;
+	sp->_sysmouse_new_buttons = the_mouse.u.data.buttons & 0x7;
+
+	if (sp->_sysmouse_new_buttons) {
+	    if (sp->_sysmouse_new_buttons & 1)
+		work->bstate |= BUTTON1_PRESSED;
+	    if (sp->_sysmouse_new_buttons & 2)
+		work->bstate |= BUTTON2_PRESSED;
+	    if (sp->_sysmouse_new_buttons & 4)
+		work->bstate |= BUTTON3_PRESSED;
+	} else {
+	    if (sp->_sysmouse_old_buttons & 1)
+		work->bstate |= BUTTON1_RELEASED;
+	    if (sp->_sysmouse_old_buttons & 2)
+		work->bstate |= BUTTON2_RELEASED;
+	    if (sp->_sysmouse_old_buttons & 4)
+		work->bstate |= BUTTON3_RELEASED;
+	}
+
+	/* for cosmetic bug in syscons.c on FreeBSD 3.[34] */
+	the_mouse.operation = MOUSE_HIDE;
+	ioctl(sp->_mouse_fd, CONS_MOUSECTL, &the_mouse);
+	the_mouse.operation = MOUSE_SHOW;
+	ioctl(sp->_mouse_fd, CONS_MOUSECTL, &the_mouse);
+
+	/*
+	 * We're only interested if the button is pressed or released.
+	 * FIXME: implement continuous event-tracking.
+	 */
+	if (sp->_sysmouse_new_buttons != sp->_sysmouse_old_buttons) {
+	    sp->_sysmouse_tail += 1;
+	}
+	work->x = the_mouse.u.data.x / sp->_sysmouse_char_width;
+	work->y = the_mouse.u.data.y / sp->_sysmouse_char_height;
+    }
+}
+
+static void
+handle_sysmouse(int sig GCC_UNUSED)
+{
+    sysmouse_server(CURRENT_SCREEN);
+}
+#endif /* USE_SYSMOUSE */
+
+#ifndef USE_TERM_DRIVER
+#define xterm_kmous "\033[M"
+
+static void
+init_xterm_mouse(SCREEN *sp)
+{
+    sp->_mouse_type = M_XTERM;
+    sp->_mouse_format = MF_X10;
+    sp->_mouse_xtermcap = tigetstr("XM");
+    if (VALID_STRING(sp->_mouse_xtermcap)) {
+	char *code = strstr(sp->_mouse_xtermcap, "[?");
+	if (code != 0) {
+	    code += 2;
+	    while ((*code >= '0') && (*code <= '9')) {
+		char *next = code;
+		while ((*next >= '0') && (*next <= '9')) {
+		    ++next;
+		}
+		if (!strncmp(code, "1006", (size_t) (next - code))) {
+		    sp->_mouse_format = MF_SGR1006;
+		}
+#ifdef EXP_XTERM_1005
+		if (!strncmp(code, "1005", (size_t) (next - code))) {
+		    sp->_mouse_format = MF_XTERM_1005;
+		}
+#endif
+		if (*next == ';') {
+		    while (*next == ';') {
+			++next;
+		    }
+		    code = next;
+		} else {
+		    break;
+		}
+	    }
+	}
+    } else {
+	int code = tigetnum("XM");
+	switch (code) {
+#ifdef EXP_XTERM_1005
+	case 1005:
+	    /* see "xterm+sm+1005" */
+	    sp->_mouse_xtermcap = "\033[?1005;1000%?%p1%{1}%=%th%el%;";
+	    sp->_mouse_format = MF_XTERM_1005;
+	    break;
+#endif
+	case 1006:
+	    /* see "xterm+sm+1006" */
+	    sp->_mouse_xtermcap = "\033[?1006;1000%?%p1%{1}%=%th%el%;";
+	    sp->_mouse_format = MF_SGR1006;
+	    break;
+	default:
+	    sp->_mouse_xtermcap = "\033[?1000%?%p1%{1}%=%th%el%;";
+	    break;
+	}
+    }
+}
+#endif
+
+static void
+enable_xterm_mouse(SCREEN *sp, int enable)
+{
+#if USE_EMX_MOUSE
+    sp->_emxmouse_activated = enable;
+#else
+    NCURSES_PUTP2("xterm-mouse", TIPARM_1(sp->_mouse_xtermcap, enable));
+#endif
+    sp->_mouse_active = enable;
+}
+
+#if USE_GPM_SUPPORT
+static bool
+allow_gpm_mouse(SCREEN *sp GCC_UNUSED)
+{
+    bool result = FALSE;
+
+#if USE_WEAK_SYMBOLS
+    /* Danger Robinson: do not use dlopen for libgpm if already loaded */
+    if ((Gpm_Wgetch) != 0) {
+	if (!sp->_mouse_gpm_loaded) {
+	    T(("GPM library was already dlopen'd, not by us"));
+	}
+    } else
+#endif
+	/* GPM does printf's without checking if stdout is a terminal */
+    if (NC_ISATTY(fileno(stdout))) {
+	const char *list = getenv("NCURSES_GPM_TERMS");
+	const char *env = getenv("TERM");
+	if (list != 0) {
+	    if (env != 0) {
+		result = _nc_name_match(list, env, "|:");
+	    }
+	} else {
+	    /* GPM checks the beginning of the $TERM variable to decide if it
+	     * should pass xterm events through.  There is no real advantage in
+	     * allowing GPM to do this.  Recent versions relax that check, and
+	     * pretend that GPM can work with any terminal having the kmous
+	     * capability.  Perhaps that works for someone.  If so, they can
+	     * set the environment variable (above).
+	     */
+	    if (env != 0 && strstr(env, "linux") != 0) {
+		result = TRUE;
+	    }
+	}
+    }
+    return result;
+}
+
+#ifdef HAVE_LIBDL
+static void
+unload_gpm_library(SCREEN *sp)
+{
+    if (sp->_dlopen_gpm != 0) {
+	T(("unload GPM library"));
+	sp->_mouse_gpm_loaded = FALSE;
+	sp->_mouse_fd = -1;
+    }
+}
+
+static void
+load_gpm_library(SCREEN *sp)
+{
+    sp->_mouse_gpm_found = FALSE;
+
+    /*
+     * If we already had a successful dlopen, reuse it.
+     */
+    if (sp->_dlopen_gpm != 0) {
+	sp->_mouse_gpm_found = TRUE;
+	sp->_mouse_gpm_loaded = TRUE;
+    } else if ((sp->_dlopen_gpm = dlopen(LIBGPM_SONAME, my_RTLD)) != 0) {
+#if (defined(__GNUC__) && (__GNUC__ >= 5)) || defined(__clang__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wpedantic"
+#endif
+	if (GET_DLSYM(gpm_fd) == 0 ||
+	    GET_DLSYM(Gpm_Open) == 0 ||
+	    GET_DLSYM(Gpm_Close) == 0 ||
+	    GET_DLSYM(Gpm_GetEvent) == 0) {
+#if (defined(__GNUC__) && (__GNUC__ >= 5)) || defined(__clang__)
+#pragma GCC diagnostic pop
+#endif
+	    T(("GPM initialization failed: %s", dlerror()));
+	    unload_gpm_library(sp);
+	    dlclose(sp->_dlopen_gpm);
+	    sp->_dlopen_gpm = 0;
+	} else {
+	    sp->_mouse_gpm_found = TRUE;
+	    sp->_mouse_gpm_loaded = TRUE;
+	}
+    }
+}
+#endif /* HAVE_LIBDL */
+
+static bool
+enable_gpm_mouse(SCREEN *sp, bool enable)
+{
+    bool result;
+
+    T((T_CALLED("enable_gpm_mouse(%d)"), enable));
+
+    if (enable && !sp->_mouse_active) {
+#ifdef HAVE_LIBDL
+	if (sp->_mouse_gpm_found && !sp->_mouse_gpm_loaded) {
+	    load_gpm_library(sp);
+	}
+#endif
+	if (sp->_mouse_gpm_loaded) {
+	    int code;
+
+	    /* GPM: initialize connection to gpm server */
+	    sp->_mouse_gpm_connect.eventMask = GPM_DOWN | GPM_UP;
+	    sp->_mouse_gpm_connect.defaultMask =
+		(unsigned short) (~(sp->_mouse_gpm_connect.eventMask | GPM_HARD));
+	    sp->_mouse_gpm_connect.minMod = 0;
+	    sp->_mouse_gpm_connect.maxMod =
+		(unsigned short) (~((1 << KG_SHIFT) |
+				    (1 << KG_SHIFTL) |
+				    (1 << KG_SHIFTR)));
+	    /*
+	     * Note: GPM hardcodes \E[?1001s and \E[?1000h during its open.
+	     * The former is recognized by wscons (SunOS), and the latter by
+	     * xterm.  Those will not show up in ncurses' traces.
+	     */
+	    code = my_Gpm_Open(&sp->_mouse_gpm_connect, 0);
+	    result = (code >= 0);
+
+	    /*
+	     * GPM can return a -2 if it is trying to do something with xterm.
+	     * Ignore that, since it conflicts with our use of stdin.
+	     */
+	    if (code == -2) {
+		my_Gpm_Close();
+	    }
+	} else {
+	    result = FALSE;
+	}
+	sp->_mouse_active = result;
+	T(("GPM open %s", result ? "succeeded" : "failed"));
+    } else {
+	if (!enable && sp->_mouse_active) {
+	    /* GPM: close connection to gpm server */
+	    my_Gpm_Close();
+	    sp->_mouse_active = FALSE;
+	    T(("GPM closed"));
+	}
+	result = enable;
+    }
+#ifdef HAVE_LIBDL
+    if (!result) {
+	unload_gpm_library(sp);
+    }
+#endif
+    returnBool(result);
+}
+#endif /* USE_GPM_SUPPORT */
+
+static void
+initialize_mousetype(SCREEN *sp)
+{
+    T((T_CALLED("initialize_mousetype()")));
+
+    /* Try gpm first, because gpm may be configured to run in xterm */
+#if USE_GPM_SUPPORT
+    if (allow_gpm_mouse(sp)) {
+	if (!sp->_mouse_gpm_loaded) {
+#ifdef HAVE_LIBDL
+	    load_gpm_library(sp);
+#else /* !HAVE_LIBDL */
+	    sp->_mouse_gpm_found = TRUE;
+	    sp->_mouse_gpm_loaded = TRUE;
+#endif
+	}
+
+	/*
+	 * The gpm_fd file-descriptor may be negative (xterm).  So we have to
+	 * maintain our notion of whether the mouse connection is active
+	 * without testing the file-descriptor.
+	 */
+	if (sp->_mouse_gpm_found && enable_gpm_mouse(sp, TRUE)) {
+	    sp->_mouse_type = M_GPM;
+	    sp->_mouse_fd = *(my_gpm_fd);
+	    T(("GPM mouse_fd %d", sp->_mouse_fd));
+	    returnVoid;
+	}
+    }
+#endif /* USE_GPM_SUPPORT */
+
+    /* OS/2 VIO */
+#if USE_EMX_MOUSE
+    if (!sp->_emxmouse_thread
+	&& strstr(SP_TERMTYPE term_names, "xterm") == 0
+	&& NonEmpty(key_mouse)) {
+	int handles[2];
+
+	if (pipe(handles) < 0) {
+	    perror("mouse pipe error");
+	    returnVoid;
+	} else {
+	    int rc;
+
+	    if (!sp->_emxmouse_buttons[0]) {
+		const char *s = getenv("MOUSE_BUTTONS_123");
+
+		sp->_emxmouse_buttons[0] = 1;
+		if (s && strlen(s) >= 3) {
+		    sp->_emxmouse_buttons[1] = s[0] - '0';
+		    sp->_emxmouse_buttons[2] = s[1] - '0';
+		    sp->_emxmouse_buttons[3] = s[2] - '0';
+		} else {
+		    sp->_emxmouse_buttons[1] = 1;
+		    sp->_emxmouse_buttons[2] = 3;
+		    sp->_emxmouse_buttons[3] = 2;
+		}
+	    }
+	    sp->_emxmouse_wfd = handles[1];
+	    M_FD(sp) = handles[0];
+	    /* Needed? */
+	    setmode(handles[0], O_BINARY);
+	    setmode(handles[1], O_BINARY);
+	    /* Do not use CRT functions, we may single-threaded. */
+	    rc = DosCreateThread((unsigned long *) &sp->_emxmouse_thread,
+				 mouse_server, (long) sp, 0, 8192);
+	    if (rc) {
+		printf("mouse thread error %d=%#x", rc, rc);
+	    } else {
+		sp->_mouse_type = M_XTERM;
+	    }
+	    returnVoid;
+	}
+    }
+#endif /* USE_EMX_MOUSE */
+
+#if USE_SYSMOUSE
+    {
+	static char dev_tty[] = "/dev/tty";
+	struct mouse_info the_mouse;
+	char *the_device = 0;
+
+	if (NC_ISATTY(sp->_ifd))
+	    the_device = ttyname(sp->_ifd);
+	if (the_device == 0)
+	    the_device = dev_tty;
+
+	sp->_mouse_fd = open(the_device, O_RDWR);
+
+	if (sp->_mouse_fd >= 0) {
+	    /*
+	     * sysmouse does not have a usable user interface for obtaining
+	     * mouse events.  The logical way to proceed (reading data on a
+	     * stream) only works if one opens the device as root.  Even in
+	     * that mode, careful examination shows we lose events
+	     * occasionally.  The interface provided for user programs is to
+	     * establish a signal handler.  really.
+	     *
+	     * Take over SIGUSR2 for this purpose since SIGUSR1 is more
+	     * likely to be used by an application.  getch() will have to
+	     * handle the misleading EINTR's.
+	     */
+	    signal(SIGUSR2, SIG_IGN);
+	    the_mouse.operation = MOUSE_MODE;
+	    the_mouse.u.mode.mode = 0;
+	    the_mouse.u.mode.signal = SIGUSR2;
+	    if (ioctl(sp->_mouse_fd, CONS_MOUSECTL, &the_mouse) != -1) {
+		signal(SIGUSR2, handle_sysmouse);
+		the_mouse.operation = MOUSE_SHOW;
+		ioctl(sp->_mouse_fd, CONS_MOUSECTL, &the_mouse);
+
+#if defined(FBIO_MODEINFO) || defined(CONS_MODEINFO)	/* FreeBSD > 2.x */
+		{
+#ifndef FBIO_GETMODE		/* FreeBSD 3.x */
+#define FBIO_GETMODE    CONS_GET
+#define FBIO_MODEINFO   CONS_MODEINFO
+#endif /* FBIO_GETMODE */
+		    video_info_t the_video;
+
+		    if (ioctl(sp->_mouse_fd,
+			      FBIO_GETMODE,
+			      &the_video.vi_mode) != -1
+			&& ioctl(sp->_mouse_fd,
+				 FBIO_MODEINFO,
+				 &the_video) != -1) {
+			sp->_sysmouse_char_width = the_video.vi_cwidth;
+			sp->_sysmouse_char_height = the_video.vi_cheight;
+		    }
+		}
+#endif /* defined(FBIO_MODEINFO) || defined(CONS_MODEINFO) */
+
+		if (sp->_sysmouse_char_width <= 0)
+		    sp->_sysmouse_char_width = 8;
+		if (sp->_sysmouse_char_height <= 0)
+		    sp->_sysmouse_char_height = 16;
+		sp->_mouse_type = M_SYSMOUSE;
+		returnVoid;
+	    }
+	}
+    }
+#endif /* USE_SYSMOUSE */
+
+#ifdef USE_TERM_DRIVER
+    CallDriver(sp, td_initmouse);
+#else
+    /* we know how to recognize mouse events under "xterm" */
+    if (NonEmpty(key_mouse)) {
+	init_xterm_mouse(sp);
+    } else if (strstr(SP_TERMTYPE term_names, "xterm") != 0) {
+	if (_nc_add_to_try(&(sp->_keytry), xterm_kmous, KEY_MOUSE) == OK)
+	    init_xterm_mouse(sp);
+    }
+#endif
+
+    returnVoid;
+}
+
+static bool
+_nc_mouse_init(SCREEN *sp)
+/* initialize the mouse */
+{
+    bool result = FALSE;
+
+    if (sp != 0) {
+	if (!sp->_mouse_initialized) {
+	    int i;
+
+	    sp->_mouse_initialized = TRUE;
+
+	    TR(MY_TRACE, ("_nc_mouse_init() called"));
+
+	    sp->_mouse_eventp = FirstEV(sp);
+	    for (i = 0; i < EV_MAX; i++)
+		Invalidate(sp->_mouse_events + i);
+
+	    initialize_mousetype(sp);
+
+	    T(("_nc_mouse_init() set mousetype to %d", sp->_mouse_type));
+	}
+	result = sp->_mouse_initialized;
+    }
+    return result;
+}
+
+/*
+ * Query to see if there is a pending mouse event.  This is called from
+ * fifo_push() in lib_getch.c
+ */
+static bool
+_nc_mouse_event(SCREEN *sp)
+{
+    MEVENT *eventp = sp->_mouse_eventp;
+    bool result = FALSE;
+
+    (void) eventp;
+
+    switch (sp->_mouse_type) {
+    case M_XTERM:
+	/* xterm: never have to query, mouse events are in the keyboard stream */
+#if USE_EMX_MOUSE
+	{
+	    char kbuf[3];
+
+	    int i, res = read(M_FD(sp), &kbuf, 3);	/* Eat the prefix */
+	    if (res != 3)
+		printf("Got %d chars instead of 3 for prefix.\n", res);
+	    for (i = 0; i < res; i++) {
+		if (kbuf[i] != key_mouse[i])
+		    printf("Got char %d instead of %d for prefix.\n",
+			   (int) kbuf[i], (int) key_mouse[i]);
+	    }
+	    result = TRUE;
+	}
+#endif /* USE_EMX_MOUSE */
+	break;
+
+#if USE_GPM_SUPPORT
+    case M_GPM:
+	if (sp->_mouse_fd >= 0) {
+	    /* query server for event, return TRUE if we find one */
+	    Gpm_Event ev;
+
+	    switch (my_Gpm_GetEvent(&ev)) {
+	    case 0:
+		/* Connection closed, drop the mouse. */
+		sp->_mouse_fd = -1;
+		break;
+	    case 1:
+		/* there's only one mouse... */
+		eventp->id = NORMAL_EVENT;
+
+		eventp->bstate = 0;
+		switch (ev.type & 0x0f) {
+		case (GPM_DOWN):
+		    if (ev.buttons & GPM_B_LEFT)
+			eventp->bstate |= BUTTON1_PRESSED;
+		    if (ev.buttons & GPM_B_MIDDLE)
+			eventp->bstate |= BUTTON2_PRESSED;
+		    if (ev.buttons & GPM_B_RIGHT)
+			eventp->bstate |= BUTTON3_PRESSED;
+		    break;
+		case (GPM_UP):
+		    if (ev.buttons & GPM_B_LEFT)
+			eventp->bstate |= BUTTON1_RELEASED;
+		    if (ev.buttons & GPM_B_MIDDLE)
+			eventp->bstate |= BUTTON2_RELEASED;
+		    if (ev.buttons & GPM_B_RIGHT)
+			eventp->bstate |= BUTTON3_RELEASED;
+		    break;
+		default:
+		    eventp->bstate |= REPORT_MOUSE_POSITION;
+		    break;
+		}
+
+		eventp->x = ev.x - 1;
+		eventp->y = ev.y - 1;
+		eventp->z = 0;
+
+		/* bump the next-free pointer into the circular list */
+		sp->_mouse_eventp = NEXT(eventp);
+		result = TRUE;
+		break;
+	    }
+	}
+	break;
+#endif
+
+#if USE_SYSMOUSE
+    case M_SYSMOUSE:
+	if (sp->_sysmouse_head < sp->_sysmouse_tail) {
+	    *eventp = sp->_sysmouse_fifo[sp->_sysmouse_head];
+
+	    /*
+	     * Point the fifo-head to the next possible location.  If there
+	     * are none, reset the indices.  This may be interrupted by the
+	     * signal handler, doing essentially the same reset.
+	     */
+	    sp->_sysmouse_head += 1;
+	    if (sp->_sysmouse_head == sp->_sysmouse_tail) {
+		sp->_sysmouse_tail = 0;
+		sp->_sysmouse_head = 0;
+	    }
+
+	    /* bump the next-free pointer into the circular list */
+	    sp->_mouse_eventp = eventp = NEXT(eventp);
+	    result = TRUE;
+	}
+	break;
+#endif /* USE_SYSMOUSE */
+
+#ifdef USE_TERM_DRIVER
+    case M_TERM_DRIVER:
+	while (sp->_drv_mouse_head < sp->_drv_mouse_tail) {
+	    *eventp = sp->_drv_mouse_fifo[sp->_drv_mouse_head];
+
+	    /*
+	     * Point the fifo-head to the next possible location.  If there
+	     * are none, reset the indices.
+	     */
+	    sp->_drv_mouse_head += 1;
+	    if (sp->_drv_mouse_head == sp->_drv_mouse_tail) {
+		sp->_drv_mouse_tail = 0;
+		sp->_drv_mouse_head = 0;
+	    }
+
+	    /* bump the next-free pointer into the circular list */
+	    sp->_mouse_eventp = eventp = NEXT(eventp);
+	    result = TRUE;
+	}
+	break;
+#endif
+
+    case M_NONE:
+	break;
+    }
+
+    return result;		/* true if we found an event */
+}
+
+#if USE_EMX_MOUSE
+#define PRESS_POSITION(n) \
+    do { \
+	    eventp->bstate = MASK_PRESS(n); \
+	    sp->_mouse_bstate |= MASK_PRESS(n); \
+	    if (button & 0x40) { \
+		    eventp->bstate = MASK_RELEASE(n); \
+		    sp->_mouse_bstate &= ~MASK_PRESS(n); \
+	    } \
+    } while (0)
+#else
+#define PRESS_POSITION(n) \
+    do { \
+	    eventp->bstate = (mmask_t) ((sp->_mouse_bstate & MASK_PRESS(n)) \
+				    ? REPORT_MOUSE_POSITION \
+				    : MASK_PRESS(n)); \
+	    sp->_mouse_bstate |= MASK_PRESS(n); \
+    } while (0)
+#endif
+
+static bool
+handle_wheel(SCREEN *sp, MEVENT * eventp, int button, int wheel)
+{
+    bool result = TRUE;
+
+    switch (button & 3) {
+    case 0:
+	if (wheel) {
+	    eventp->bstate = MASK_PRESS(4);
+	    /* Do not record in sp->_mouse_bstate; there will be no
+	     * corresponding release event.
+	     */
+	} else {
+	    PRESS_POSITION(1);
+	}
+	break;
+    case 1:
+	if (wheel) {
+#if NCURSES_MOUSE_VERSION >= 2
+	    eventp->bstate = MASK_PRESS(5);
+	    /* See comment above for button 4 */
+#else
+	    /* Ignore this event as it is not a true press of the button */
+	    eventp->bstate = REPORT_MOUSE_POSITION;
+#endif
+	} else {
+	    PRESS_POSITION(2);
+	}
+	break;
+    case 2:
+	PRESS_POSITION(3);
+	break;
+    default:
+	/*
+	 * case 3 is sent when the mouse buttons are released.
+	 *
+	 * If the terminal uses xterm mode 1003, a continuous series of
+	 * button-release events is sent as the mouse moves around the screen,
+	 * or as the wheel mouse is rotated.
+	 *
+	 * Return false in this case, so that when running in X10 mode, we will
+	 * recalculate bstate.
+	 */
+	eventp->bstate = REPORT_MOUSE_POSITION;
+	result = FALSE;
+	break;
+    }
+    return result;
+}
+
+static bool
+decode_X10_bstate(SCREEN *sp, MEVENT * eventp, unsigned intro)
+{
+    bool result;
+    int button = 0;
+    int wheel = (intro & 96) == 96;
+
+    eventp->bstate = 0;
+
+    if (intro >= 96) {
+	if (intro >= 160) {
+	    button = (int) (intro - 152);	/* buttons 8-11 */
+	} else {
+	    button = (int) (intro - 92);	/* buttons 4-7 */
+	}
+    } else {
+	button = (intro & 3);
+    }
+
+    if (button > MAX_BUTTONS) {
+	eventp->bstate = REPORT_MOUSE_POSITION;
+    } else if (!handle_wheel(sp, eventp, (int) intro, wheel)) {
+
+	/*
+	 * Release events aren't reported for individual buttons, just for
+	 * the button set as a whole.  However, because there are normally
+	 * no mouse events under xterm that intervene between press and
+	 * release, we can infer the button actually released by looking at
+	 * the previous event.
+	 */
+	if (sp->_mouse_bstate & BUTTON_PRESSED) {
+	    int b;
+
+	    eventp->bstate = BUTTON_RELEASED;
+	    for (b = 1; b <= MAX_BUTTONS; ++b) {
+		if (!(sp->_mouse_bstate & MASK_PRESS(b)))
+		    eventp->bstate &= ~MASK_RELEASE(b);
+	    }
+	    sp->_mouse_bstate = 0;
+	} else {
+	    /*
+	     * xterm will return a stream of release-events to let the
+	     * application know where the mouse is going, if private mode
+	     * 1002 or 1003 is enabled.
+	     */
+	    eventp->bstate = REPORT_MOUSE_POSITION;
+	}
+    }
+
+    if (intro & 4) {
+	eventp->bstate |= BUTTON_SHIFT;
+    }
+    if (intro & 8) {
+	eventp->bstate |= BUTTON_ALT;
+    }
+    if (intro & 16) {
+	eventp->bstate |= BUTTON_CTRL;
+    }
+    result = (eventp->bstate & REPORT_MOUSE_POSITION) ? TRUE : FALSE;
+    return result;
+}
+
+/* This code requires that your xterm entry contain the kmous capability and
+ * that it be set to the \E[M documented in the Xterm Control Sequences
+ * reference.  This is how we arrange for mouse events to be reported via a
+ * KEY_MOUSE return value from wgetch().  After this value is received,
+ * _nc_mouse_inline() gets called and is immediately responsible for parsing
+ * the mouse status information following the prefix.
+ *
+ * The following quotes from the ctlseqs.ms document in the XTerm distribution,
+ * describing the mouse tracking feature:
+ *
+ * Parameters for all mouse tracking escape sequences generated by xterm encode
+ * numeric parameters in a single character as value+040.  For example, ! is
+ * 1.
+ *
+ * On button press or release, xterm sends ESC [ M CbCxCy.  The low two bits of
+ * Cb encode button information:  0=MB1 pressed, 1=MB2 pressed, 2=MB3 pressed,
+ * 3=release.  The upper bits encode what modifiers were down when the button
+ * was pressed and are added together.  4=Shift, 8=Meta, 16=Control.  Cx and Cy
+ * are the x and y coordinates of the mouse event.  The upper left corner is
+ * (1,1).
+ *
+ * (End quote) By the time we get here, we've eaten the key prefix.  FYI, the
+ * loop below is necessary because mouse click info isn't guaranteed to present
+ * as a single clist item.
+ *
+ * Wheel mice may return buttons 4 and 5 when the wheel is turned.  We encode
+ * those as button presses.
+ */
+static bool
+decode_xterm_X10(SCREEN *sp, MEVENT * eventp)
+{
+#define MAX_KBUF 3
+    unsigned char kbuf[MAX_KBUF + 1];
+    size_t grabbed;
+    int res;
+    bool result;
+
+    _nc_set_read_thread(TRUE);
+    for (grabbed = 0; grabbed < MAX_KBUF; grabbed += (size_t) res) {
+
+	/* For VIO mouse we add extra bit 64 to disambiguate button-up. */
+	res = (int) read(
+#if USE_EMX_MOUSE
+			    (M_FD(sp) >= 0) ? M_FD(sp) : sp->_ifd,
+#else
+			    sp->_ifd,
+#endif
+			    kbuf + grabbed, (size_t) (MAX_KBUF - (int) grabbed));
+	if (res == -1)
+	    break;
+    }
+    _nc_set_read_thread(FALSE);
+    kbuf[MAX_KBUF] = '\0';
+
+    TR(TRACE_IEVENT,
+       ("_nc_mouse_inline sees the following xterm data: '%s'", kbuf));
+
+    /* there's only one mouse... */
+    eventp->id = NORMAL_EVENT;
+
+    result = decode_X10_bstate(sp, eventp, kbuf[0]);
+
+    eventp->x = (kbuf[1] - ' ') - 1;
+    eventp->y = (kbuf[2] - ' ') - 1;
+
+    return result;
+}
+
+#ifdef EXP_XTERM_1005
+/*
+ * This is identical to X10/X11 responses except that there are two UTF-8
+ * characters storing the ordinates instead of two bytes.
+ */
+static bool
+decode_xterm_1005(SCREEN *sp, MEVENT * eventp)
+{
+    char kbuf[80];
+    size_t grabbed;
+    size_t limit = (sizeof(kbuf) - 1);
+    unsigned coords[2];
+    bool result;
+
+    coords[0] = 0;
+    coords[1] = 0;
+
+    _nc_set_read_thread(TRUE);
+    for (grabbed = 0; grabbed < limit;) {
+	int res;
+
+	res = (int) read(
+#if USE_EMX_MOUSE
+			    (M_FD(sp) >= 0) ? M_FD(sp) : sp->_ifd,
+#else
+			    sp->_ifd,
+#endif
+			    (kbuf + grabbed), (size_t) 1);
+	if (res == -1)
+	    break;
+	grabbed += (size_t) res;
+	if (grabbed > 1) {
+	    size_t check = 1;
+	    int n;
+
+	    for (n = 0; n < 2; ++n) {
+		int rc;
+
+		if (check >= grabbed)
+		    break;
+		rc = _nc_conv_to_utf32(&coords[n], kbuf + check, (unsigned)
+				       (grabbed - check));
+		if (!rc)
+		    break;
+		check += (size_t) rc;
+	    }
+	    if (n >= 2)
+		break;
+	}
+    }
+    _nc_set_read_thread(FALSE);
+
+    TR(TRACE_IEVENT,
+       ("_nc_mouse_inline sees the following xterm data: %s",
+	_nc_visbufn(kbuf, (int) grabbed)));
+
+    /* there's only one mouse... */
+    eventp->id = NORMAL_EVENT;
+
+    result = decode_X10_bstate(sp, eventp, UChar(kbuf[0]));
+
+    eventp->x = (int) (coords[0] - ' ') - 1;
+    eventp->y = (int) (coords[1] - ' ') - 1;
+
+    return result;
+}
+#endif /* EXP_XTERM_1005 */
+
+/*
+ * ECMA-48 section 5.4
+ */
+#define isInter(c) ((c) >= 0x20 && (c) <= 0x2f)
+#define isParam(c) ((c) >= 0x30 && (c) <= 0x3f)
+#define isFinal(c) ((c) >= 0x40 && (c) <= 0x7e)
+
+#define MAX_PARAMS 9
+
+typedef struct {
+    int nerror;			/* nonzero if there are unexpected chars */
+    int nparam;			/* number of numeric parameters */
+    int params[MAX_PARAMS];
+    int final;			/* the final-character */
+} SGR_DATA;
+
+static bool
+read_SGR(SCREEN *sp, SGR_DATA * result)
+{
+    char kbuf[80];		/* bigger than any possible mouse response */
+    int grabbed = 0;
+    int ch = 0;
+    int now = -1;
+    int marker = 1;
+
+    memset(result, 0, sizeof(*result));
+    _nc_set_read_thread(TRUE);
+
+    do {
+	int res;
+
+	res = (int) read(
+#if USE_EMX_MOUSE
+			    (M_FD(sp) >= 0) ? M_FD(sp) : sp->_ifd,
+#else
+			    sp->_ifd,
+#endif
+			    (kbuf + grabbed), (size_t) 1);
+	if (res == -1)
+	    break;
+	if ((grabbed + MAX_KBUF) >= (int) sizeof(kbuf)) {
+	    result->nerror++;
+	    break;
+	}
+	ch = UChar(kbuf[grabbed]);
+	kbuf[grabbed + 1] = 0;
+	switch (ch) {
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':
+	    if (marker) {
+		++now;
+		result->nparam = (now + 1);
+	    }
+	    marker = 0;
+	    result->params[now] = (result->params[now] * 10) + (ch - '0');
+	    break;
+	case ';':
+	    if (marker) {
+		++now;
+		result->nparam = (now + 1);
+	    }
+	    marker = 1;
+	    break;
+	default:
+	    if (ch < 32 || ch > 126) {
+		/*
+		 * Technically other characters could be interspersed in the
+		 * response.  Ignore those for now.
+		 */
+		result->nerror++;
+		continue;
+	    } else if (isFinal(ch)) {
+		if (marker) {
+		    result->nparam++;
+		}
+		result->final = ch;
+	    } else {
+		result->nerror++;
+	    }
+	    break;
+	}
+	++grabbed;
+    } while (!isFinal(ch));
+    _nc_set_read_thread(FALSE);
+
+    kbuf[++grabbed] = 0;
+    TR(TRACE_IEVENT,
+       ("_nc_mouse_inline sees the following xterm data: '%s'", kbuf));
+    return (grabbed > 0) && (result->nerror == 0);
+}
+
+static bool
+decode_xterm_SGR1006(SCREEN *sp, MEVENT * eventp)
+{
+    SGR_DATA data;
+    bool result = FALSE;
+    if (read_SGR(sp, &data)) {
+	int b = data.params[0];
+	int b3 = 1 + (b & 3);
+	int wheel = ((b & 64) == 64);
+
+	if (b >= 132) {
+	    b3 = MAX_BUTTONS + 1;
+	} else if (b >= 128) {
+	    b3 = (b - 120);	/* buttons 8-11 */
+	} else if (b >= 64) {
+	    b3 = (b - 60);	/* buttons 6-7 */
+	}
+
+	eventp->id = NORMAL_EVENT;
+	if (data.final == 'M') {
+	    (void) handle_wheel(sp, eventp, b, wheel);
+	} else if (b3 > MAX_BUTTONS) {
+	    eventp->bstate = REPORT_MOUSE_POSITION;
+	} else {
+	    mmask_t pressed = (mmask_t) NCURSES_MOUSE_MASK(b3, NCURSES_BUTTON_PRESSED);
+	    mmask_t release = (mmask_t) NCURSES_MOUSE_MASK(b3, NCURSES_BUTTON_RELEASED);
+	    if (sp->_mouse_bstate & pressed) {
+		eventp->bstate = release;
+		sp->_mouse_bstate &= ~pressed;
+	    } else {
+		eventp->bstate = REPORT_MOUSE_POSITION;
+	    }
+	}
+	if (b & 4) {
+	    eventp->bstate |= BUTTON_SHIFT;
+	}
+	if (b & 8) {
+	    eventp->bstate |= BUTTON_ALT;
+	}
+	if (b & 16) {
+	    eventp->bstate |= BUTTON_CTRL;
+	}
+	result = (eventp->bstate & REPORT_MOUSE_POSITION) ? TRUE : FALSE;
+	eventp->x = (data.params[1] ? (data.params[1] - 1) : 0);
+	eventp->y = (data.params[2] ? (data.params[2] - 1) : 0);
+    }
+    return result;
+}
+
+static bool
+_nc_mouse_inline(SCREEN *sp)
+/* mouse report received in the keyboard stream -- parse its info */
+{
+    bool result = FALSE;
+    MEVENT *eventp = sp->_mouse_eventp;
+
+    TR(MY_TRACE, ("_nc_mouse_inline() called"));
+
+    if (sp->_mouse_type == M_XTERM) {
+	switch (sp->_mouse_format) {
+	case MF_X10:
+	    result = decode_xterm_X10(sp, eventp);
+	    break;
+	case MF_SGR1006:
+	    result = decode_xterm_SGR1006(sp, eventp);
+	    break;
+#ifdef EXP_XTERM_1005
+	case MF_XTERM_1005:
+	    result = decode_xterm_1005(sp, eventp);
+	    break;
+#endif
+	}
+
+	TR(MY_TRACE,
+	   ("_nc_mouse_inline: primitive mouse-event %s has slot %ld",
+	    _nc_tracemouse(sp, eventp),
+	    (long) IndexEV(sp, eventp)));
+
+	/* bump the next-free pointer into the circular list */
+	sp->_mouse_eventp = NEXT(eventp);
+
+	if (!result) {
+	    /* If this event is from a wheel-mouse, treat it like position
+	     * reports and avoid waiting for the release-events which will
+	     * never come.
+	     */
+	    if (eventp->bstate & BUTTON_PRESSED) {
+		int b;
+
+		for (b = 4; b <= MAX_BUTTONS; ++b) {
+		    if ((eventp->bstate & MASK_PRESS(b))) {
+			result = TRUE;
+			break;
+		    }
+		}
+	    }
+	}
+    }
+
+    return (result);
+}
+
+static void
+mouse_activate(SCREEN *sp, int on)
+{
+    if (!on && !sp->_mouse_initialized)
+	return;
+
+    if (!_nc_mouse_init(sp))
+	return;
+
+    if (on) {
+	sp->_mouse_bstate = 0;
+	switch (sp->_mouse_type) {
+	case M_XTERM:
+#if NCURSES_EXT_FUNCS
+	    NCURSES_SP_NAME(keyok) (NCURSES_SP_ARGx KEY_MOUSE, on);
+#endif
+	    TPUTS_TRACE("xterm mouse initialization");
+	    enable_xterm_mouse(sp, 1);
+	    break;
+#if USE_GPM_SUPPORT
+	case M_GPM:
+	    if (enable_gpm_mouse(sp, TRUE)) {
+		sp->_mouse_fd = *(my_gpm_fd);
+		T(("GPM mouse_fd %d", sp->_mouse_fd));
+	    }
+	    break;
+#endif
+#if USE_SYSMOUSE
+	case M_SYSMOUSE:
+	    signal(SIGUSR2, handle_sysmouse);
+	    sp->_mouse_active = TRUE;
+	    break;
+#endif
+#ifdef USE_TERM_DRIVER
+	case M_TERM_DRIVER:
+	    sp->_mouse_active = TRUE;
+	    break;
+#endif
+	case M_NONE:
+	    return;
+	}
+	/* Make runtime binding to cut down on object size of applications that
+	 * do not use the mouse (e.g., 'clear').
+	 */
+	sp->_mouse_event = _nc_mouse_event;
+	sp->_mouse_inline = _nc_mouse_inline;
+	sp->_mouse_parse = _nc_mouse_parse;
+	sp->_mouse_resume = _nc_mouse_resume;
+	sp->_mouse_wrap = _nc_mouse_wrap;
+    } else {
+
+	switch (sp->_mouse_type) {
+	case M_XTERM:
+	    TPUTS_TRACE("xterm mouse deinitialization");
+	    enable_xterm_mouse(sp, 0);
+	    break;
+#if USE_GPM_SUPPORT
+	case M_GPM:
+	    enable_gpm_mouse(sp, FALSE);
+	    break;
+#endif
+#if USE_SYSMOUSE
+	case M_SYSMOUSE:
+	    signal(SIGUSR2, SIG_IGN);
+	    sp->_mouse_active = FALSE;
+	    break;
+#endif
+#ifdef USE_TERM_DRIVER
+	case M_TERM_DRIVER:
+	    sp->_mouse_active = FALSE;
+	    break;
+#endif
+	case M_NONE:
+	    return;
+	}
+    }
+    NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_ARG);
+}
+
+/**************************************************************************
+ *
+ * Device-independent code
+ *
+ **************************************************************************/
+
+static bool
+_nc_mouse_parse(SCREEN *sp, int runcount)
+/* parse a run of atomic mouse events into a gesture */
+{
+    MEVENT *eventp = sp->_mouse_eventp;
+    MEVENT *next, *ep;
+    MEVENT *first_valid = NULL;
+    MEVENT *first_invalid = NULL;
+    int n;
+    int b;
+    bool merge;
+    bool endLoop;
+
+    TR(MY_TRACE, ("_nc_mouse_parse(%d) called", runcount));
+
+    /*
+     * When we enter this routine, the event list next-free pointer
+     * points just past a run of mouse events that we know were separated
+     * in time by less than the critical click interval. The job of this
+     * routine is to collapse this run into a single higher-level event
+     * or gesture.
+     *
+     * We accomplish this in two passes.  The first pass merges press/release
+     * pairs into click events.  The second merges runs of click events into
+     * double or triple-click events.
+     *
+     * It's possible that the run may not resolve to a single event (for
+     * example, if the user quadruple-clicks).  If so, leading events
+     * in the run are ignored if user does not call getmouse in a loop (getting
+     * them from newest to older).
+     *
+     * Note that this routine is independent of the format of the specific
+     * format of the pointing-device's reports.  We can use it to parse
+     * gestures on anything that reports press/release events on a per-
+     * button basis, as long as the device-dependent mouse code puts stuff
+     * on the queue in MEVENT format.
+     */
+
+    /*
+     * Reset all events that were not set, in case the user sometimes calls
+     * getmouse only once and other times until there are no more events in
+     * queue.
+     *
+     * This also allows reaching the beginning of the run.
+     */
+    ep = eventp;
+    for (n = runcount; n < EV_MAX; n++) {
+	Invalidate(ep);
+	ep = NEXT(ep);
+    }
+
+#ifdef TRACE
+    if (USE_TRACEF(TRACE_IEVENT)) {
+	_trace_slot(sp, "before mouse press/release merge:");
+	_tracef("_nc_mouse_parse: run starts at %ld, ends at %ld, count %d",
+		RunParams(sp, eventp, ep),
+		runcount);
+	_nc_unlock_global(tracef);
+    }
+#endif /* TRACE */
+
+    /* first pass; merge press/release pairs */
+    endLoop = FALSE;
+    while (!endLoop) {
+	next = NEXT(ep);
+	if (next == eventp) {
+	    /* Will end the loop, but compact before */
+	    endLoop = TRUE;
+	} else {
+
+#define MASK_CHANGED(x) (!(ep->bstate & MASK_PRESS(x)) \
+		      == !(next->bstate & MASK_RELEASE(x)))
+
+	    if (ValidEvent(ep) && ValidEvent(next)
+		&& ep->x == next->x && ep->y == next->y
+		&& (ep->bstate & BUTTON_PRESSED)
+		&& (!(next->bstate & BUTTON_PRESSED))) {
+		bool changed = TRUE;
+
+		for (b = 1; b <= MAX_BUTTONS; ++b) {
+		    if (!MASK_CHANGED(b)) {
+			changed = FALSE;
+			break;
+		    }
+		}
+
+		if (changed) {
+		    merge = FALSE;
+		    for (b = 1; b <= MAX_BUTTONS; ++b) {
+			if ((sp->_mouse_mask2 & MASK_CLICK(b))
+			    && (ep->bstate & MASK_PRESS(b))) {
+			    next->bstate &= ~MASK_RELEASE(b);
+			    next->bstate |= MASK_CLICK(b);
+			    merge = TRUE;
+			}
+		    }
+		    if (merge) {
+			Invalidate(ep);
+		    }
+		}
+	    }
+	}
+
+	/* Compact valid events */
+	if (!ValidEvent(ep)) {
+	    if ((first_valid != NULL) && (first_invalid == NULL)) {
+		first_invalid = ep;
+	    }
+	} else {
+	    if (first_valid == NULL) {
+		first_valid = ep;
+	    } else if (first_invalid != NULL) {
+		*first_invalid = *ep;
+		Invalidate(ep);
+		first_invalid = NEXT(first_invalid);
+	    }
+	}
+
+	ep = next;
+    }
+
+    if (first_invalid != NULL) {
+	eventp = first_invalid;
+    }
+#ifdef TRACE
+    if (USE_TRACEF(TRACE_IEVENT)) {
+	_trace_slot(sp, "before mouse click merge:");
+	if (first_valid == NULL) {
+	    _tracef("_nc_mouse_parse: no valid event");
+	} else {
+	    _tracef("_nc_mouse_parse: run starts at %ld, ends at %ld, count %d",
+		    RunParams(sp, eventp, first_valid),
+		    runcount);
+	    _nc_unlock_global(tracef);
+	}
+    }
+#endif /* TRACE */
+
+    /*
+     * Second pass; merge click runs.  We merge click events forward in the
+     * queue.  For example, double click can be changed to triple click.
+     *
+     * NOTE: There is a problem with this design!  If the application
+     * allows enough click events to pile up in the circular queue so
+     * they wrap around, it will cheerfully merge the newest forward
+     * into the oldest, creating a bogus doubleclick and confusing
+     * the queue-traversal logic rather badly.  Generally this won't
+     * happen, because calling getmouse() marks old events invalid and
+     * ineligible for merges.  The true solution to this problem would
+     * be to timestamp each MEVENT and perform the obvious sanity check,
+     * but the timer element would have to have sub-second resolution,
+     * which would get us into portability trouble.
+     */
+    first_invalid = NULL;
+    endLoop = (first_valid == NULL);
+    ep = first_valid;
+    while (!endLoop) {
+	next = NEXT(ep);
+
+	if (next == eventp) {
+	    /* Will end the loop, but check event type and compact before */
+	    endLoop = TRUE;
+	} else if (!ValidEvent(next)) {
+	    continue;
+	} else {
+	    /* merge click events forward */
+	    if ((ep->bstate & BUTTON_CLICKED)
+		&& (next->bstate & BUTTON_CLICKED)) {
+		merge = FALSE;
+		for (b = 1; b <= MAX_BUTTONS; ++b) {
+		    if ((sp->_mouse_mask2 & MASK_DOUBLE_CLICK(b))
+			&& (ep->bstate & MASK_CLICK(b))
+			&& (next->bstate & MASK_CLICK(b))) {
+			next->bstate &= ~MASK_CLICK(b);
+			next->bstate |= MASK_DOUBLE_CLICK(b);
+			merge = TRUE;
+		    }
+		}
+		if (merge) {
+		    Invalidate(ep);
+		}
+	    }
+
+	    /* merge double-click events forward */
+	    if ((ep->bstate & BUTTON_DOUBLE_CLICKED)
+		&& (next->bstate & BUTTON_CLICKED)) {
+		merge = FALSE;
+		for (b = 1; b <= MAX_BUTTONS; ++b) {
+		    if ((sp->_mouse_mask2 & MASK_TRIPLE_CLICK(b))
+			&& (ep->bstate & MASK_DOUBLE_CLICK(b))
+			&& (next->bstate & MASK_CLICK(b))) {
+			next->bstate &= ~MASK_CLICK(b);
+			next->bstate |= MASK_TRIPLE_CLICK(b);
+			merge = TRUE;
+		    }
+		}
+		if (merge) {
+		    Invalidate(ep);
+		}
+	    }
+	}
+
+	/* Discard event if it does not match event mask */
+	if (!(ep->bstate & sp->_mouse_mask2)) {
+	    Invalidate(ep);
+	}
+
+	/* Compact valid events */
+	if (!ValidEvent(ep)) {
+	    if (ep == first_valid) {
+		first_valid = next;
+	    } else if (first_invalid == NULL) {
+		first_invalid = ep;
+	    }
+	} else if (first_invalid != NULL) {
+	    *first_invalid = *ep;
+	    Invalidate(ep);
+	    first_invalid = NEXT(first_invalid);
+	}
+
+	ep = next;
+    }
+
+    if (first_invalid == NULL) {
+	first_invalid = eventp;
+    }
+    sp->_mouse_eventp = first_invalid;
+
+#ifdef TRACE
+    if (first_valid != NULL) {
+	if (USE_TRACEF(TRACE_IEVENT)) {
+	    _trace_slot(sp, "after mouse event queue compaction:");
+	    _tracef("_nc_mouse_parse: run starts at %ld, ends at %ld, count %d",
+		    RunParams(sp, first_invalid, first_valid),
+		    runcount);
+	    _nc_unlock_global(tracef);
+	}
+	for (ep = first_valid; ep != first_invalid; ep = NEXT(ep)) {
+	    if (ValidEvent(ep))
+		TR(MY_TRACE,
+		   ("_nc_mouse_parse: returning composite mouse event %s at slot %ld",
+		    _nc_tracemouse(sp, ep),
+		    (long) IndexEV(sp, ep)));
+	}
+    }
+#endif /* TRACE */
+
+    /* after all this, do we have a valid event? */
+    ep = PREV(first_invalid);
+    return ValidEvent(ep) && ((ep->bstate & sp->_mouse_mask) != 0);
+}
+
+static void
+_nc_mouse_wrap(SCREEN *sp)
+/* release mouse -- called by endwin() before shellout/exit */
+{
+    TR(MY_TRACE, ("_nc_mouse_wrap() called"));
+
+    switch (sp->_mouse_type) {
+    case M_XTERM:
+	if (sp->_mouse_mask)
+	    mouse_activate(sp, FALSE);
+	break;
+#if USE_GPM_SUPPORT
+	/* GPM: pass all mouse events to next client */
+    case M_GPM:
+	if (sp->_mouse_mask)
+	    mouse_activate(sp, FALSE);
+	break;
+#endif
+#if USE_SYSMOUSE
+    case M_SYSMOUSE:
+	mouse_activate(sp, FALSE);
+	break;
+#endif
+#ifdef USE_TERM_DRIVER
+    case M_TERM_DRIVER:
+	mouse_activate(sp, FALSE);
+	break;
+#endif
+    case M_NONE:
+	break;
+    }
+}
+
+static void
+_nc_mouse_resume(SCREEN *sp)
+/* re-connect to mouse -- called by doupdate() after shellout */
+{
+    TR(MY_TRACE, ("_nc_mouse_resume() called"));
+
+    switch (sp->_mouse_type) {
+    case M_XTERM:
+	/* xterm: re-enable reporting */
+	if (sp->_mouse_mask)
+	    mouse_activate(sp, TRUE);
+	break;
+
+#if USE_GPM_SUPPORT
+    case M_GPM:
+	/* GPM: reclaim our event set */
+	if (sp->_mouse_mask)
+	    mouse_activate(sp, TRUE);
+	break;
+#endif
+
+#if USE_SYSMOUSE
+    case M_SYSMOUSE:
+	mouse_activate(sp, TRUE);
+	break;
+#endif
+
+#ifdef USE_TERM_DRIVER
+    case M_TERM_DRIVER:
+	mouse_activate(sp, TRUE);
+	break;
+#endif
+
+    case M_NONE:
+	break;
+    }
+}
+
+/**************************************************************************
+ *
+ * Mouse interface entry points for the API
+ *
+ **************************************************************************/
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(getmouse) (NCURSES_SP_DCLx MEVENT * aevent)
+{
+    int result = ERR;
+    MEVENT *eventp;
+
+    T((T_CALLED("getmouse(%p,%p)"), (void *) SP_PARM, (void *) aevent));
+
+    if ((aevent != 0) &&
+	(SP_PARM != 0) &&
+	(SP_PARM->_mouse_type != M_NONE) &&
+	(eventp = SP_PARM->_mouse_eventp) != 0) {
+	/* compute the current-event pointer */
+	MEVENT *prev = PREV(eventp);
+
+	/*
+	 * Discard events not matching mask (there could be still some if
+	 * _nc_mouse_parse was not called, e.g., when _nc_mouse_inline returns
+	 * false).
+	 */
+	while (ValidEvent(prev) && (!(prev->bstate & SP_PARM->_mouse_mask2))) {
+	    Invalidate(prev);
+	    prev = PREV(prev);
+	}
+	if (ValidEvent(prev)) {
+	    /* copy the event we find there */
+	    *aevent = *prev;
+
+	    TR(TRACE_IEVENT, ("getmouse: returning event %s from slot %ld",
+			      _nc_tracemouse(SP_PARM, prev),
+			      (long) IndexEV(SP_PARM, prev)));
+
+	    Invalidate(prev);	/* so the queue slot becomes free */
+	    SP_PARM->_mouse_eventp = prev;
+	    result = OK;
+	} else {
+	    /* Reset the provided event */
+	    aevent->bstate = 0;
+	    Invalidate(aevent);
+	    aevent->x = 0;
+	    aevent->y = 0;
+	    aevent->z = 0;
+	}
+    }
+    returnCode(result);
+}
+
+#if NCURSES_SP_FUNCS
+/* grab a copy of the current mouse event */
+NCURSES_EXPORT(int)
+getmouse(MEVENT * aevent)
+{
+    return NCURSES_SP_NAME(getmouse) (CURRENT_SCREEN, aevent);
+}
+#endif
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(ungetmouse) (NCURSES_SP_DCLx MEVENT * aevent)
+{
+    int result = ERR;
+    MEVENT *eventp;
+
+    T((T_CALLED("ungetmouse(%p,%p)"), (void *) SP_PARM, (void *) aevent));
+
+    if (aevent != 0 &&
+	SP_PARM != 0 &&
+	(eventp = SP_PARM->_mouse_eventp) != 0) {
+
+	/* stick the given event in the next-free slot */
+	*eventp = *aevent;
+
+	/* bump the next-free pointer into the circular list */
+	SP_PARM->_mouse_eventp = NEXT(eventp);
+
+	/* push back the notification event on the keyboard queue */
+	result = NCURSES_SP_NAME(ungetch) (NCURSES_SP_ARGx KEY_MOUSE);
+    }
+    returnCode(result);
+}
+
+#if NCURSES_SP_FUNCS
+/* enqueue a synthesized mouse event to be seen by the next wgetch() */
+NCURSES_EXPORT(int)
+ungetmouse(MEVENT * aevent)
+{
+    return NCURSES_SP_NAME(ungetmouse) (CURRENT_SCREEN, aevent);
+}
+#endif
+
+NCURSES_EXPORT(mmask_t)
+NCURSES_SP_NAME(mousemask) (NCURSES_SP_DCLx mmask_t newmask, mmask_t * oldmask)
+/* set the mouse event mask */
+{
+    mmask_t result = 0;
+
+    T((T_CALLED("mousemask(%p,%#lx,%p)"),
+       (void *) SP_PARM,
+       (unsigned long) newmask,
+       (void *) oldmask));
+
+    if (SP_PARM != 0) {
+	if (oldmask)
+	    *oldmask = SP_PARM->_mouse_mask;
+
+	if (newmask || SP_PARM->_mouse_initialized) {
+	    _nc_mouse_init(SP_PARM);
+
+	    if (SP_PARM->_mouse_type != M_NONE) {
+		int b;
+
+		result = newmask &
+		    (REPORT_MOUSE_POSITION
+		     | BUTTON_ALT
+		     | BUTTON_CTRL
+		     | BUTTON_SHIFT
+		     | BUTTON_PRESSED
+		     | BUTTON_RELEASED
+		     | BUTTON_CLICKED
+		     | BUTTON_DOUBLE_CLICKED
+		     | BUTTON_TRIPLE_CLICKED);
+
+		mouse_activate(SP_PARM, (bool) (result != 0));
+
+		SP_PARM->_mouse_mask = result;
+		SP_PARM->_mouse_mask2 = result;
+
+		/*
+		 * Make a mask corresponding to the states we will need to
+		 * retain (temporarily) while building up the state that the
+		 * user asked for.
+		 */
+		for (b = 1; b <= MAX_BUTTONS; ++b) {
+		    if (SP_PARM->_mouse_mask2 & MASK_TRIPLE_CLICK(b))
+			SP_PARM->_mouse_mask2 |= MASK_DOUBLE_CLICK(b);
+		    if (SP_PARM->_mouse_mask2 & MASK_DOUBLE_CLICK(b))
+			SP_PARM->_mouse_mask2 |= MASK_CLICK(b);
+		    if (SP_PARM->_mouse_mask2 & MASK_CLICK(b))
+			SP_PARM->_mouse_mask2 |= (MASK_PRESS(b) |
+						  MASK_RELEASE(b));
+		}
+	    }
+	}
+    }
+    returnMMask(result);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(mmask_t)
+mousemask(mmask_t newmask, mmask_t * oldmask)
+{
+    return NCURSES_SP_NAME(mousemask) (CURRENT_SCREEN, newmask, oldmask);
+}
+#endif
+
+NCURSES_EXPORT(bool)
+wenclose(const WINDOW *win, int y, int x)
+/* check to see if given window encloses given screen location */
+{
+    bool result = FALSE;
+
+    T((T_CALLED("wenclose(%p,%d,%d)"), (const void *) win, y, x));
+
+    if (win != 0) {
+	y -= win->_yoffset;
+	result = ((win->_begy <= y &&
+		   win->_begx <= x &&
+		   (win->_begx + win->_maxx) >= x &&
+		   (win->_begy + win->_maxy) >= y) ? TRUE : FALSE);
+    }
+    returnBool(result);
+}
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(mouseinterval) (NCURSES_SP_DCLx int maxclick)
+/* set the maximum mouse interval within which to recognize a click */
+{
+    int oldval;
+
+    T((T_CALLED("mouseinterval(%p,%d)"), (void *) SP_PARM, maxclick));
+
+    if (SP_PARM != 0) {
+	oldval = SP_PARM->_maxclick;
+	if (maxclick >= 0)
+	    SP_PARM->_maxclick = maxclick;
+    } else {
+	oldval = DEFAULT_MAXCLICK;
+    }
+
+    returnCode(oldval);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+mouseinterval(int maxclick)
+{
+    return NCURSES_SP_NAME(mouseinterval) (CURRENT_SCREEN, maxclick);
+}
+#endif
+
+/* This may be used by other routines to ask for the existence of mouse
+   support */
+NCURSES_EXPORT(bool)
+_nc_has_mouse(SCREEN *sp)
+{
+    return (((0 == sp) || (sp->_mouse_type == M_NONE)) ? FALSE : TRUE);
+}
+
+NCURSES_EXPORT(bool)
+NCURSES_SP_NAME(has_mouse) (NCURSES_SP_DCL0)
+{
+    return _nc_has_mouse(SP_PARM);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(bool)
+has_mouse(void)
+{
+    return _nc_has_mouse(CURRENT_SCREEN);
+}
+#endif
+
+NCURSES_EXPORT(bool)
+wmouse_trafo(const WINDOW *win, int *pY, int *pX, bool to_screen)
+{
+    bool result = FALSE;
+
+    T((T_CALLED("wmouse_trafo(%p,%p,%p,%d)"),
+       (const void *) win,
+       (void *) pY,
+       (void *) pX,
+       to_screen));
+
+    if (win && pY && pX) {
+	int y = *pY;
+	int x = *pX;
+
+	if (to_screen) {
+	    y += win->_begy + win->_yoffset;
+	    x += win->_begx;
+	    if (wenclose(win, y, x))
+		result = TRUE;
+	} else {
+	    if (wenclose(win, y, x)) {
+		y -= (win->_begy + win->_yoffset);
+		x -= win->_begx;
+		result = TRUE;
+	    }
+	}
+	if (result) {
+	    *pX = x;
+	    *pY = y;
+	}
+    }
+    returnBool(result);
+}
diff --git a/ncurses/base/lib_move.c b/ncurses/base/lib_move.c
new file mode 100644
index 0000000..d9ba8c0
--- /dev/null
+++ b/ncurses/base/lib_move.c
@@ -0,0 +1,61 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2004,2009 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ ****************************************************************************/
+
+/*
+**	lib_move.c
+**
+**	The routine wmove().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_move.c,v 1.14 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(int)
+wmove(WINDOW *win, int y, int x)
+{
+    T((T_CALLED("wmove(%p,%d,%d)"), (void *) win, y, x));
+
+    if (LEGALYX(win, y, x)) {
+	win->_curx = (NCURSES_SIZE_T) x;
+	win->_cury = (NCURSES_SIZE_T) y;
+
+	win->_flags &= ~_WRAPPED;
+	win->_flags |= _HASMOVED;
+	returnCode(OK);
+    } else
+	returnCode(ERR);
+}
diff --git a/ncurses/base/lib_mvwin.c b/ncurses/base/lib_mvwin.c
new file mode 100644
index 0000000..fca014e
--- /dev/null
+++ b/ncurses/base/lib_mvwin.c
@@ -0,0 +1,121 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2009,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ *     and: Juergen Pfeifer                                                 *
+ ****************************************************************************/
+
+/*
+**	lib_mvwin.c
+**
+**	The routine mvwin().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_mvwin.c,v 1.20 2021/10/23 18:57:41 tom Exp $")
+
+NCURSES_EXPORT(int)
+mvwin(WINDOW *win, int by, int bx)
+{
+#if NCURSES_SP_FUNCS
+    SCREEN *sp = _nc_screen_of(win);
+#endif
+
+    T((T_CALLED("mvwin(%p,%d,%d)"), (void *) win, by, bx));
+
+    if (!win || IS_PAD(win))
+	returnCode(ERR);
+
+    /*
+     * mvwin() should only modify the indices.  See test/demo_menus.c and
+     * test/movewindow.c for examples.
+     */
+#if 0
+    /* Copying subwindows is allowed, but it is expensive... */
+    if (IS_SUBWIN(win)) {
+	int err = ERR;
+	WINDOW *parent = win->_parent;
+	if (parent) {		/* Now comes the complicated and costly part, you should really
+				 * try to avoid to move subwindows. Because a subwindow shares
+				 * the text buffers with its parent, one can't do a simple
+				 * memmove of the text buffers. One has to create a copy, then
+				 * to relocate the subwindow and then to do a copy.
+				 */
+	    if ((by - parent->_begy == win->_pary) &&
+		(bx - parent->_begx == win->_parx))
+		err = OK;	/* we don't actually move */
+	    else {
+		WINDOW *clone = dupwin(win);
+		if (clone) {
+		    /* now we have the clone, so relocate win */
+
+		    werase(win);	/* Erase the original place     */
+		    /* fill with parents background */
+		    wbkgrnd(win, CHREF(parent->_nc_bkgd));
+		    wsyncup(win);	/* Tell the parent(s)           */
+
+		    err = mvderwin(win,
+				   by - parent->_begy,
+				   bx - parent->_begx);
+		    if (err != ERR) {
+			err = copywin(clone, win,
+				      0, 0, 0, 0, win->_maxy, win->_maxx, 0);
+			if (ERR != err)
+			    wsyncup(win);
+		    }
+		    if (ERR == delwin(clone))
+			err = ERR;
+		}
+	    }
+	}
+	returnCode(err);
+    }
+#endif
+
+    if (by + win->_maxy > screen_lines(SP_PARM) - 1
+	|| bx + win->_maxx > screen_columns(SP_PARM) - 1
+	|| by < 0
+	|| bx < 0)
+	returnCode(ERR);
+
+    /*
+     * Whether or not the window is moved, touch the window's contents so
+     * that a following call to 'wrefresh()' will paint the window at the
+     * new location.  This ensures that if the caller has refreshed another
+     * window at the same location, that this one will be displayed.
+     */
+    win->_begy = (NCURSES_SIZE_T) by;
+    win->_begx = (NCURSES_SIZE_T) bx;
+    returnCode(touchwin(win));
+}
diff --git a/ncurses/base/lib_newterm.c b/ncurses/base/lib_newterm.c
new file mode 100644
index 0000000..15d05a3
--- /dev/null
+++ b/ncurses/base/lib_newterm.c
@@ -0,0 +1,375 @@
+/****************************************************************************
+ * Copyright 2018-2020,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ *     and: Juergen Pfeifer                         2009                    *
+ ****************************************************************************/
+
+/*
+**	lib_newterm.c
+**
+**	The newterm() function.
+**
+*/
+
+#include <curses.priv.h>
+
+#ifndef CUR
+#define CUR SP_TERMTYPE
+#endif
+
+#include <tic.h>
+
+MODULE_ID("$Id: lib_newterm.c,v 1.104 2022/07/09 18:58:58 tom Exp $")
+
+#ifdef USE_TERM_DRIVER
+#define NumLabels      InfoOf(SP_PARM).numlabels
+#else
+#define NumLabels      num_labels
+#endif
+
+#ifndef ONLCR			/* Allows compilation under the QNX 4.2 OS */
+#define ONLCR 0
+#endif
+
+/*
+ * SVr4/XSI Curses specify that hardware echo is turned off in initscr, and not
+ * restored during the curses session.  The library simulates echo in software.
+ * (The behavior is unspecified if the application enables hardware echo).
+ *
+ * The newterm function also initializes terminal settings, and since initscr
+ * is supposed to behave as if it calls newterm, we do it here.
+ */
+static NCURSES_INLINE int
+_nc_initscr(NCURSES_SP_DCL0)
+{
+    int result = ERR;
+    TERMINAL *term = TerminalOf(SP_PARM);
+
+    /* for extended XPG4 conformance requires cbreak() at this point */
+    /* (SVr4 curses does this anyway) */
+    T((T_CALLED("_nc_initscr(%p) ->term %p"), (void *) SP_PARM, (void *) term));
+    if (NCURSES_SP_NAME(cbreak) (NCURSES_SP_ARG) == OK) {
+	TTY buf;
+
+	buf = term->Nttyb;
+#ifdef TERMIOS
+	buf.c_lflag &= (unsigned) ~(ECHO | ECHONL);
+	buf.c_iflag &= (unsigned) ~(ICRNL | INLCR | IGNCR);
+	buf.c_oflag &= (unsigned) ~(ONLCR);
+#elif HAVE_SGTTY_H
+	buf.sg_flags &= ~(ECHO | CRMOD);
+#elif defined(EXP_WIN32_DRIVER)
+	buf.dwFlagIn = CONMODE_IN_DEFAULT;
+	buf.dwFlagOut = CONMODE_OUT_DEFAULT | VT_FLAG_OUT;
+	if (WINCONSOLE.isTermInfoConsole) {
+	    buf.dwFlagIn |= VT_FLAG_IN;
+	}
+#else
+	memset(&buf, 0, sizeof(buf));
+#endif
+	result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf);
+	if (result == OK)
+	    term->Nttyb = buf;
+    }
+    returnCode(result);
+}
+
+/*
+ * filter() has to be called before either initscr() or newterm(), so there is
+ * apparently no way to make this flag apply to some terminals and not others,
+ * aside from possibly delaying a filter() call until some terminals have been
+ * initialized.
+ */
+NCURSES_EXPORT(void)
+NCURSES_SP_NAME(filter) (NCURSES_SP_DCL0)
+{
+    START_TRACE();
+    T((T_CALLED("filter(%p)"), (void *) SP_PARM));
+#if NCURSES_SP_FUNCS
+    if (IsPreScreen(SP_PARM)) {
+	SP_PARM->_filtered = TRUE;
+    }
+#else
+    _nc_prescreen.filter_mode = TRUE;
+#endif
+    returnVoid;
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(void)
+filter(void)
+{
+    START_TRACE();
+    T((T_CALLED("filter()")));
+    _nc_prescreen.filter_mode = TRUE;
+    returnVoid;
+}
+#endif
+
+#if NCURSES_EXT_FUNCS
+/*
+ * An extension, allowing the application to open a new screen without
+ * requiring it to also be filtered.
+ */
+NCURSES_EXPORT(void)
+NCURSES_SP_NAME(nofilter) (NCURSES_SP_DCL0)
+{
+    START_TRACE();
+    T((T_CALLED("nofilter(%p)"), (void *) SP_PARM));
+#if NCURSES_SP_FUNCS
+    if (IsPreScreen(SP_PARM)) {
+	SP_PARM->_filtered = FALSE;
+    }
+#else
+    _nc_prescreen.filter_mode = FALSE;
+#endif
+    returnVoid;
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(void)
+nofilter(void)
+{
+    START_TRACE();
+    T((T_CALLED("nofilter()")));
+    _nc_prescreen.filter_mode = FALSE;
+    returnVoid;
+}
+#endif
+#endif /* NCURSES_EXT_FUNCS */
+
+NCURSES_EXPORT(SCREEN *)
+NCURSES_SP_NAME(newterm) (NCURSES_SP_DCLx
+			  const char *name,
+			  FILE *ofp,
+			  FILE *ifp)
+{
+    int errret;
+    SCREEN *result = 0;
+    SCREEN *current;
+    TERMINAL *its_term;
+    FILE *_ofp = ofp ? ofp : stdout;
+    FILE *_ifp = ifp ? ifp : stdin;
+    TERMINAL *new_term = 0;
+
+    START_TRACE();
+    T((T_CALLED("newterm(%p, \"%s\", %p,%p)"),
+       (void *) SP_PARM,
+       (name ? name : ""),
+       (void *) ofp,
+       (void *) ifp));
+
+#if NCURSES_SP_FUNCS
+    assert(SP_PARM != 0);
+    if (SP_PARM == 0)
+	returnSP(SP_PARM);
+#endif
+
+    _nc_init_pthreads();
+    _nc_lock_global(curses);
+
+    current = CURRENT_SCREEN;
+    its_term = (current ? current->_term : 0);
+
+#if defined(EXP_WIN32_DRIVER)
+    _setmode(fileno(_ifp), _O_BINARY);
+    _setmode(fileno(_ofp), _O_BINARY);
+#endif
+
+    INIT_TERM_DRIVER();
+    /* this loads the capability entry, then sets LINES and COLS */
+    if (
+	   TINFO_SETUP_TERM(&new_term, name,
+			    fileno(_ofp), &errret, FALSE) != ERR) {
+	int slk_format;
+	int filter_mode;
+
+	_nc_set_screen(0);
+#ifdef USE_TERM_DRIVER
+	assert(new_term != 0);
+#endif
+
+#if NCURSES_SP_FUNCS
+	slk_format = SP_PARM->slk_format;
+	filter_mode = SP_PARM->_filtered;
+#else
+	slk_format = _nc_globals.slk_format;
+	filter_mode = _nc_prescreen.filter_mode;
+#endif
+
+	/*
+	 * This actually allocates the screen structure, and saves the original
+	 * terminal settings.
+	 */
+	if (NCURSES_SP_NAME(_nc_setupscreen) (
+#if NCURSES_SP_FUNCS
+						 &SP_PARM,
+#endif
+						 *(ptrLines(SP_PARM)),
+						 *(ptrCols(SP_PARM)),
+						 _ofp,
+						 filter_mode,
+						 slk_format) == ERR) {
+	    _nc_set_screen(current);
+	    result = 0;
+	} else {
+	    int value;
+	    int cols;
+
+#ifdef USE_TERM_DRIVER
+	    TERMINAL_CONTROL_BLOCK *TCB;
+#elif !NCURSES_SP_FUNCS
+	    _nc_set_screen(CURRENT_SCREEN);
+#endif
+	    assert(SP_PARM != 0);
+	    cols = *(ptrCols(SP_PARM));
+#ifdef USE_TERM_DRIVER
+	    _nc_set_screen(SP_PARM);
+	    TCB = (TERMINAL_CONTROL_BLOCK *) new_term;
+	    TCB->csp = SP_PARM;
+#endif
+	    /*
+	     * In setupterm() we did a set_curterm(), but it was before we set
+	     * CURRENT_SCREEN.  So the "current" screen's terminal pointer was
+	     * overwritten with a different terminal.  Later, in
+	     * _nc_setupscreen(), we set CURRENT_SCREEN and the terminal
+	     * pointer in the new screen.
+	     *
+	     * Restore the terminal-pointer for the pre-existing screen, if
+	     * any.
+	     */
+	    if (current)
+		current->_term = its_term;
+
+#ifdef USE_TERM_DRIVER
+	    SP_PARM->_term = new_term;
+#else
+	    new_term = SP_PARM->_term;
+#endif
+
+	    /* allow user to set maximum escape delay from the environment */
+	    if ((value = _nc_getenv_num("ESCDELAY")) >= 0) {
+#if NCURSES_EXT_FUNCS
+		NCURSES_SP_NAME(set_escdelay) (NCURSES_SP_ARGx value);
+#else
+		ESCDELAY = value;
+#endif
+	    }
+
+	    /* if the terminal type has real soft labels, set those up */
+	    if (slk_format && NumLabels > 0 && SLK_STDFMT(slk_format))
+		_nc_slk_initialize(StdScreen(SP_PARM), cols);
+
+	    SP_PARM->_ifd = fileno(_ifp);
+	    NCURSES_SP_NAME(typeahead) (NCURSES_SP_ARGx fileno(_ifp));
+#ifdef TERMIOS
+	    SP_PARM->_use_meta = ((new_term->Ottyb.c_cflag & CSIZE) == CS8 &&
+				  !(new_term->Ottyb.c_iflag & ISTRIP)) ||
+		USE_KLIBC_KBD;
+#else
+	    SP_PARM->_use_meta = FALSE;
+#endif
+	    SP_PARM->_endwin = ewInitial;
+#ifndef USE_TERM_DRIVER
+	    /*
+	     * Check whether we can optimize scrolling under dumb terminals in
+	     * case we do not have any of these capabilities, scrolling
+	     * optimization will be useless.
+	     */
+	    SP_PARM->_scrolling = ((scroll_forward && scroll_reverse) ||
+				   ((parm_rindex ||
+				     parm_insert_line ||
+				     insert_line) &&
+				    (parm_index ||
+				     parm_delete_line ||
+				     delete_line)));
+#endif
+
+	    NCURSES_SP_NAME(baudrate) (NCURSES_SP_ARG);		/* sets a field in the screen structure */
+
+	    SP_PARM->_keytry = 0;
+
+	    /* compute movement costs so we can do better move optimization */
+#ifdef USE_TERM_DRIVER
+	    TCBOf(SP_PARM)->drv->td_scinit(SP_PARM);
+#else /* ! USE_TERM_DRIVER */
+	    /*
+	     * Check for mismatched graphic-rendition capabilities.  Most SVr4
+	     * terminfo trees contain entries that have rmul or rmso equated to
+	     * sgr0 (Solaris curses copes with those entries).  We do this only
+	     * for curses, since many termcap applications assume that
+	     * smso/rmso and smul/rmul are paired, and will not function
+	     * properly if we remove rmso or rmul.  Curses applications
+	     * shouldn't be looking at this detail.
+	     */
+#define SGR0_TEST(mode) (mode != 0) && (exit_attribute_mode == 0 || strcmp(mode, exit_attribute_mode))
+	    SP_PARM->_use_rmso = SGR0_TEST(exit_standout_mode);
+	    SP_PARM->_use_rmul = SGR0_TEST(exit_underline_mode);
+#if USE_ITALIC
+	    SP_PARM->_use_ritm = SGR0_TEST(exit_italics_mode);
+#endif
+
+	    /* compute movement costs so we can do better move optimization */
+	    _nc_mvcur_init();
+
+	    /* initialize terminal to a sane state */
+	    _nc_screen_init();
+#endif /* USE_TERM_DRIVER */
+
+	    /* Initialize the terminal line settings. */
+	    _nc_initscr(NCURSES_SP_ARG);
+
+	    _nc_signal_handler(TRUE);
+	    result = SP_PARM;
+	}
+    }
+    _nc_unlock_global(curses);
+    returnSP(result);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(SCREEN *)
+newterm(const char *name, FILE *ofp, FILE *ifp)
+{
+    SCREEN *rc;
+
+    _nc_init_pthreads();
+    _nc_lock_global(prescreen);
+    START_TRACE();
+    rc = NCURSES_SP_NAME(newterm) (CURRENT_SCREEN_PRE, name, ofp, ifp);
+    _nc_forget_prescr();
+    _nc_unlock_global(prescreen);
+
+    return rc;
+}
+#endif
diff --git a/ncurses/base/lib_newwin.c b/ncurses/base/lib_newwin.c
new file mode 100644
index 0000000..a672319
--- /dev/null
+++ b/ncurses/base/lib_newwin.c
@@ -0,0 +1,406 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ *     and: Juergen Pfeifer                         2009                    *
+ ****************************************************************************/
+
+/*
+**	lib_newwin.c
+**
+**	The routines newwin(), subwin() and their dependent
+**
+*/
+
+#include <curses.priv.h>
+#include <stddef.h>
+
+MODULE_ID("$Id: lib_newwin.c,v 1.76 2021/10/23 18:53:38 tom Exp $")
+
+#define window_is(name) ((sp)->_##name == win)
+
+#if USE_REENTRANT
+#define remove_window(name) \
+		sp->_##name = 0
+#else
+#define remove_window(name) \
+		sp->_##name = 0; \
+		if (win == name) \
+		    name = 0
+#endif
+
+static void
+remove_window_from_screen(WINDOW *win)
+{
+    SCREEN *sp;
+
+#ifdef USE_SP_WINDOWLIST
+    if ((sp = _nc_screen_of(win)) != 0) {
+	if (window_is(curscr)) {
+	    remove_window(curscr);
+	} else if (window_is(stdscr)) {
+	    remove_window(stdscr);
+	} else if (window_is(newscr)) {
+	    remove_window(newscr);
+	}
+    }
+#else
+    for (each_screen(sp)) {
+	if (window_is(curscr)) {
+	    remove_window(curscr);
+	    break;
+	} else if (window_is(stdscr)) {
+	    remove_window(stdscr);
+	    break;
+	} else if (window_is(newscr)) {
+	    remove_window(newscr);
+	    break;
+	}
+    }
+#endif
+}
+
+NCURSES_EXPORT(int)
+_nc_freewin(WINDOW *win)
+{
+    int result = ERR;
+#ifdef USE_SP_WINDOWLIST
+    SCREEN *sp = _nc_screen_of(win);	/* pretend this is parameter */
+#endif
+
+    T((T_CALLED("_nc_freewin(%p)"), (void *) win));
+
+    if (win != 0) {
+
+	if (_nc_nonsp_try_global(curses) == 0) {
+	    WINDOWLIST *p, *q;
+
+	    q = 0;
+	    for (each_window(sp, p)) {
+
+		if (&(p->win) == win) {
+		    remove_window_from_screen(win);
+		    if (q == 0)
+			WindowList(sp) = p->next;
+		    else
+			q->next = p->next;
+
+		    if (!IS_SUBWIN(win)) {
+			int i;
+
+			for (i = 0; i <= win->_maxy; i++)
+			    FreeIfNeeded(win->_line[i].text);
+		    }
+		    free(win->_line);
+		    free(p);
+
+		    result = OK;
+		    T(("...deleted win=%p", (void *) win));
+		    break;
+		}
+		q = p;
+	    }
+	    _nc_nonsp_unlock_global(curses);
+	}
+    }
+    returnCode(result);
+}
+
+NCURSES_EXPORT(WINDOW *)
+NCURSES_SP_NAME(newwin) (NCURSES_SP_DCLx
+			 int num_lines, int num_columns, int begy, int begx)
+{
+    WINDOW *win;
+    NCURSES_CH_T *ptr;
+    int i;
+
+    T((T_CALLED("newwin(%p, %d,%d,%d,%d)"), (void *) SP_PARM, num_lines, num_columns,
+       begy, begx));
+
+    if (begy < 0
+	|| begx < 0
+	|| num_lines < 0
+	|| num_columns < 0
+	|| SP_PARM == 0)
+	returnWin(0);
+
+    if (num_lines == 0)
+	num_lines = SP_PARM->_lines_avail - begy;
+    if (num_columns == 0)
+	num_columns = screen_columns(SP_PARM) - begx;
+
+    win = NCURSES_SP_NAME(_nc_makenew) (NCURSES_SP_ARGx
+					num_lines, num_columns, begy, begx, 0);
+    if (win == 0)
+	returnWin(0);
+
+    for (i = 0; i < num_lines; i++) {
+	win->_line[i].text = typeCalloc(NCURSES_CH_T, (unsigned) num_columns);
+	if (win->_line[i].text == 0) {
+	    (void) _nc_freewin(win);
+	    returnWin(0);
+	}
+	for (ptr = win->_line[i].text;
+	     ptr < win->_line[i].text + num_columns;
+	     ptr++)
+	    SetChar(*ptr, BLANK_TEXT, BLANK_ATTR);
+    }
+
+    returnWin(win);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(WINDOW *)
+newwin(int num_lines, int num_columns, int begy, int begx)
+{
+    WINDOW *win;
+    _nc_sp_lock_global(curses);
+    win = NCURSES_SP_NAME(newwin) (CURRENT_SCREEN,
+				   num_lines, num_columns, begy, begx);
+    _nc_sp_unlock_global(curses);
+    return (win);
+}
+#endif
+
+NCURSES_EXPORT(WINDOW *)
+derwin(WINDOW *orig, int num_lines, int num_columns, int begy, int begx)
+{
+    WINDOW *win;
+    int i;
+    int flags = _SUBWIN;
+#if NCURSES_SP_FUNCS
+    SCREEN *sp = _nc_screen_of(orig);
+#endif
+
+    T((T_CALLED("derwin(%p,%d,%d,%d,%d)"), (void *) orig, num_lines, num_columns,
+       begy, begx));
+
+    /*
+     * make sure window fits inside the original one
+     */
+    if (begy < 0 || begx < 0 || orig == 0 || num_lines < 0 || num_columns < 0)
+	returnWin(0);
+    if (begy + num_lines > orig->_maxy + 1
+	|| begx + num_columns > orig->_maxx + 1)
+	returnWin(0);
+
+    if (num_lines == 0)
+	num_lines = orig->_maxy + 1 - begy;
+
+    if (num_columns == 0)
+	num_columns = orig->_maxx + 1 - begx;
+
+    if (IS_PAD(orig))
+	flags |= _ISPAD;
+
+    win = NCURSES_SP_NAME(_nc_makenew) (NCURSES_SP_ARGx num_lines, num_columns,
+					orig->_begy + begy,
+					orig->_begx + begx, flags);
+    if (win == 0)
+	returnWin(0);
+
+    win->_pary = begy;
+    win->_parx = begx;
+    WINDOW_ATTRS(win) = WINDOW_ATTRS(orig);
+    win->_nc_bkgd = orig->_nc_bkgd;
+
+    for (i = 0; i < num_lines; i++)
+	win->_line[i].text = &orig->_line[begy++].text[begx];
+
+    win->_parent = orig;
+
+    returnWin(win);
+}
+
+NCURSES_EXPORT(WINDOW *)
+subwin(WINDOW *w, int l, int c, int y, int x)
+{
+    WINDOW *result = 0;
+
+    T((T_CALLED("subwin(%p, %d, %d, %d, %d)"), (void *) w, l, c, y, x));
+    if (w != 0) {
+	T(("parent has begy = %ld, begx = %ld", (long) w->_begy, (long) w->_begx));
+
+	result = derwin(w, l, c, y - w->_begy, x - w->_begx);
+    }
+    returnWin(result);
+}
+
+static bool
+dimension_limit(int value)
+{
+    NCURSES_SIZE_T test = (NCURSES_SIZE_T) value;
+    return (test == value && value > 0);
+}
+
+NCURSES_EXPORT(WINDOW *)
+NCURSES_SP_NAME(_nc_makenew) (NCURSES_SP_DCLx
+			      int num_lines,
+			      int num_columns,
+			      int begy,
+			      int begx,
+			      int flags)
+{
+    int i;
+    WINDOWLIST *wp;
+    WINDOW *win;
+    bool is_padwin = (flags & _ISPAD);
+
+    T((T_CALLED("_nc_makenew(%p,%d,%d,%d,%d)"),
+       (void *) SP_PARM, num_lines, num_columns, begy, begx));
+
+    if (SP_PARM == 0)
+	returnWin(0);
+
+    if (!dimension_limit(num_lines) || !dimension_limit(num_columns))
+	returnWin(0);
+
+    if ((wp = typeCalloc(WINDOWLIST, 1)) == 0)
+	returnWin(0);
+
+    win = &(wp->win);
+
+    if ((win->_line = typeCalloc(struct ldat, ((unsigned) num_lines))) == 0) {
+	free(wp);
+	returnWin(0);
+    }
+
+    _nc_nonsp_lock_global(curses);
+
+    win->_curx = 0;
+    win->_cury = 0;
+    win->_maxy = (NCURSES_SIZE_T) (num_lines - 1);
+    win->_maxx = (NCURSES_SIZE_T) (num_columns - 1);
+    win->_begy = (NCURSES_SIZE_T) begy;
+    win->_begx = (NCURSES_SIZE_T) begx;
+    win->_yoffset = SP_PARM->_topstolen;
+
+    win->_flags = (short) flags;
+    WINDOW_ATTRS(win) = A_NORMAL;
+    SetChar(win->_nc_bkgd, BLANK_TEXT, BLANK_ATTR);
+
+    win->_clear = (is_padwin
+		   ? FALSE
+		   : (num_lines == screen_lines(SP_PARM)
+		      && num_columns == screen_columns(SP_PARM)));
+    win->_idlok = FALSE;
+    win->_idcok = TRUE;
+    win->_scroll = FALSE;
+    win->_leaveok = FALSE;
+    win->_use_keypad = FALSE;
+    win->_delay = -1;
+    win->_immed = FALSE;
+    win->_sync = 0;
+    win->_parx = -1;
+    win->_pary = -1;
+    win->_parent = 0;
+
+    win->_regtop = 0;
+    win->_regbottom = (NCURSES_SIZE_T) (num_lines - 1);
+
+    win->_pad._pad_y = -1;
+    win->_pad._pad_x = -1;
+    win->_pad._pad_top = -1;
+    win->_pad._pad_bottom = -1;
+    win->_pad._pad_left = -1;
+    win->_pad._pad_right = -1;
+
+    for (i = 0; i < num_lines; i++) {
+	/*
+	 * This used to do
+	 *
+	 * win->_line[i].firstchar = win->_line[i].lastchar = _NOCHANGE;
+	 *
+	 * which marks the whole window unchanged.  That's how
+	 * SVr1 curses did it, but SVr4 curses marks the whole new
+	 * window changed.
+	 *
+	 * With the old SVr1-like code, say you have stdscr full of
+	 * characters, then create a new window with newwin(),
+	 * then do a printw(win, "foo        ");, the trailing spaces are
+	 * completely ignored by the following refreshes.  So, you
+	 * get "foojunkjunk" on the screen instead of "foo        " as
+	 * you actually intended.
+	 *
+	 * SVr4 doesn't do this.  Instead the spaces are actually written.
+	 * So that's how we want ncurses to behave.
+	 */
+	win->_line[i].firstchar = 0;
+	win->_line[i].lastchar = (NCURSES_SIZE_T) (num_columns - 1);
+
+	if_USE_SCROLL_HINTS(win->_line[i].oldindex = i);
+    }
+
+    if (!is_padwin && (begx + num_columns == screen_columns(SP_PARM))) {
+	win->_flags |= _ENDLINE;
+
+	if (begx == 0 && num_lines == screen_lines(SP_PARM) && begy == 0)
+	    win->_flags |= _FULLWIN;
+
+	if (begy + num_lines == screen_lines(SP_PARM))
+	    win->_flags |= _SCROLLWIN;
+    }
+
+    wp->next = WindowList(SP_PARM);
+    wp->screen = SP_PARM;
+    WindowList(SP_PARM) = wp;
+
+    T((T_CREATE("window %p"), (void *) win));
+
+    _nc_nonsp_unlock_global(curses);
+    returnWin(win);
+}
+
+/*
+ * wgetch() and other functions with a WINDOW* parameter may use a SCREEN*
+ * internally, and it is useful to allow those to be invoked without switching
+ * SCREEN's, e.g., for multi-threaded applications.
+ */
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(WINDOW *)
+_nc_curscr_of(SCREEN *sp)
+{
+    return (sp == 0) ? NULL : CurScreen(sp);
+}
+
+NCURSES_EXPORT(WINDOW *)
+_nc_newscr_of(SCREEN *sp)
+{
+    return (sp == 0) ? NULL : NewScreen(sp);
+}
+
+NCURSES_EXPORT(WINDOW *)
+_nc_stdscr_of(SCREEN *sp)
+{
+    return (sp == 0) ? NULL : StdScreen(sp);
+}
+#endif
diff --git a/ncurses/base/lib_nl.c b/ncurses/base/lib_nl.c
new file mode 100644
index 0000000..df07349
--- /dev/null
+++ b/ncurses/base/lib_nl.c
@@ -0,0 +1,96 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2000,2009 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ *     and: Juergen Pfeifer                         2009                    *
+ ****************************************************************************/
+
+/*
+ *	nl.c
+ *
+ *	Routines:
+ *		nl()
+ *		nonl()
+ *
+ */
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_nl.c,v 1.13 2020/02/02 23:34:34 tom Exp $")
+
+#ifdef __EMX__
+#include <io.h>
+#endif
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(nl) (NCURSES_SP_DCL0)
+{
+    T((T_CALLED("nl(%p)"), (void *) SP_PARM));
+    if (0 == SP_PARM)
+	returnCode(ERR);
+    SP_PARM->_nl = TRUE;
+#ifdef __EMX__
+    _nc_flush();
+    _fsetmode(NC_OUTPUT(SP_PARM), "t");
+#endif
+    returnCode(OK);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+nl(void)
+{
+    return NCURSES_SP_NAME(nl) (CURRENT_SCREEN);
+}
+#endif
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(nonl) (NCURSES_SP_DCL0)
+{
+    T((T_CALLED("nonl(%p)"), (void *) SP_PARM));
+    if (0 == SP_PARM)
+	returnCode(ERR);
+    SP_PARM->_nl = FALSE;
+#ifdef __EMX__
+    _nc_flush();
+    _fsetmode(NC_OUTPUT(SP_PARM), "b");
+#endif
+    returnCode(OK);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+nonl(void)
+{
+    return NCURSES_SP_NAME(nonl) (CURRENT_SCREEN);
+}
+#endif
diff --git a/ncurses/base/lib_overlay.c b/ncurses/base/lib_overlay.c
new file mode 100644
index 0000000..6d451d0
--- /dev/null
+++ b/ncurses/base/lib_overlay.c
@@ -0,0 +1,223 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2013,2016 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ ****************************************************************************/
+
+/*
+**	lib_overlay.c
+**
+**	The routines overlay(), copywin(), and overwrite().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_overlay.c,v 1.33 2020/02/02 23:34:34 tom Exp $")
+
+static int
+overlap(const WINDOW *const src, WINDOW *const dst, int const flag)
+{
+    int rc = ERR;
+
+    T((T_CALLED("overlap(%p,%p,%d)"), (const void *) src, (void *) dst, flag));
+
+    if (src != 0 && dst != 0) {
+	int sx1, sy1, sx2, sy2;
+	int dx1, dy1, dx2, dy2;
+
+	_nc_lock_global(curses);
+
+	T(("src : begy %ld, begx %ld, maxy %ld, maxx %ld",
+	   (long) src->_begy,
+	   (long) src->_begx,
+	   (long) src->_maxy,
+	   (long) src->_maxx));
+	T(("dst : begy %ld, begx %ld, maxy %ld, maxx %ld",
+	   (long) dst->_begy,
+	   (long) dst->_begx,
+	   (long) dst->_maxy,
+	   (long) dst->_maxx));
+
+	sx1 = src->_begx;
+	sy1 = src->_begy;
+	sx2 = sx1 + src->_maxx;
+	sy2 = sy1 + src->_maxy;
+
+	dx1 = dst->_begx;
+	dy1 = dst->_begy;
+	dx2 = dx1 + dst->_maxx;
+	dy2 = dy1 + dst->_maxy;
+
+	if (dx2 >= sx1 && dx1 <= sx2 && dy2 >= sy1 && dy1 <= sy2) {
+	    int sminrow = max(sy1, dy1) - sy1;
+	    int smincol = max(sx1, dx1) - sx1;
+	    int dminrow = max(sy1, dy1) - dy1;
+	    int dmincol = max(sx1, dx1) - dx1;
+	    int dmaxrow = min(sy2, dy2) - dy1;
+	    int dmaxcol = min(sx2, dx2) - dx1;
+
+	    rc = copywin(src, dst,
+			 sminrow, smincol,
+			 dminrow, dmincol,
+			 dmaxrow, dmaxcol,
+			 flag);
+	}
+	_nc_unlock_global(curses);
+    }
+    returnCode(rc);
+}
+
+/*
+**
+**	overlay(win1, win2)
+**
+**
+**	overlay() writes the overlapping area of win1 behind win2
+**	on win2 non-destructively.
+**
+**/
+
+NCURSES_EXPORT(int)
+overlay(const WINDOW *win1, WINDOW *win2)
+{
+    T((T_CALLED("overlay(%p,%p)"), (const void *) win1, (void *) win2));
+    returnCode(overlap(win1, win2, TRUE));
+}
+
+/*
+**
+**	overwrite(win1, win2)
+**
+**
+**	overwrite() writes the overlapping area of win1 behind win2
+**	on win2 destructively.
+**
+**/
+
+NCURSES_EXPORT(int)
+overwrite(const WINDOW *win1, WINDOW *win2)
+{
+    T((T_CALLED("overwrite(%p,%p)"), (const void *) win1, (void *) win2));
+    returnCode(overlap(win1, win2, FALSE));
+}
+
+NCURSES_EXPORT(int)
+copywin(const WINDOW *src, WINDOW *dst,
+	int sminrow, int smincol,
+	int dminrow, int dmincol,
+	int dmaxrow, int dmaxcol,
+	int over)
+{
+    int rc = ERR;
+
+    T((T_CALLED("copywin(%p, %p, %d, %d, %d, %d, %d, %d, %d)"),
+       (const void *) src,
+       (void *) dst,
+       sminrow, smincol,
+       dminrow, dmincol,
+       dmaxrow, dmaxcol, over));
+
+    if (src != 0
+	&& dst != 0
+	&& dmaxrow >= dminrow
+	&& dmaxcol >= dmincol) {
+	attr_t bk;
+	attr_t mask;
+
+	_nc_lock_global(curses);
+
+	bk = AttrOf(dst->_nc_bkgd);
+	mask = ~(attr_t) ((bk & A_COLOR) ? A_COLOR : 0);
+
+	/* make sure rectangle exists in source */
+	if ((sminrow + dmaxrow - dminrow) <= (src->_maxy + 1) &&
+	    (smincol + dmaxcol - dmincol) <= (src->_maxx + 1)) {
+
+	    T(("rectangle exists in source"));
+
+	    /* make sure rectangle fits in destination */
+	    if (dmaxrow <= dst->_maxy && dmaxcol <= dst->_maxx) {
+		int sx, sy, dx, dy;
+		bool copied = FALSE;
+
+		T(("rectangle fits in destination"));
+
+		for (dy = dminrow, sy = sminrow;
+		     dy <= dmaxrow;
+		     sy++, dy++) {
+		    bool touched;
+
+		    if (dy < 0 || sy < 0)
+			continue;
+
+		    touched = FALSE;
+		    for (dx = dmincol, sx = smincol;
+			 dx <= dmaxcol;
+			 sx++, dx++) {
+
+			if (dx < 0 || sx < 0)
+			    continue;
+			copied = TRUE;
+
+			if (over) {
+			    if ((CharOf(src->_line[sy].text[sx]) != L(' ')) &&
+				(!CharEq(dst->_line[dy].text[dx],
+					 src->_line[sy].text[sx]))) {
+				dst->_line[dy].text[dx] =
+				    src->_line[sy].text[sx];
+				SetAttr(dst->_line[dy].text[dx],
+					((AttrOf(src->_line[sy].text[sx]) &
+					  mask) | bk));
+				touched = TRUE;
+			    }
+			} else {
+			    if (!CharEq(dst->_line[dy].text[dx],
+					src->_line[sy].text[sx])) {
+				dst->_line[dy].text[dx] =
+				    src->_line[sy].text[sx];
+				touched = TRUE;
+			    }
+			}
+		    }
+		    if (touched) {
+			touchline(dst, dminrow, (dmaxrow - dminrow + 1));
+		    }
+		}
+		T(("finished copywin"));
+		if (copied)
+		    rc = OK;
+	    }
+	}
+	_nc_unlock_global(curses);
+    }
+    returnCode(rc);
+}
diff --git a/ncurses/base/lib_pad.c b/ncurses/base/lib_pad.c
new file mode 100644
index 0000000..d4bd7f1
--- /dev/null
+++ b/ncurses/base/lib_pad.c
@@ -0,0 +1,349 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2010,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ *     and: Juergen Pfeifer                         2009                    *
+ ****************************************************************************/
+
+/*
+ * lib_pad.c
+ * newpad	-- create a new pad
+ * pnoutrefresh -- refresh a pad, no update
+ * pechochar	-- add a char to a pad and refresh
+ */
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_pad.c,v 1.50 2021/10/23 22:57:27 tom Exp $")
+
+NCURSES_EXPORT(WINDOW *)
+NCURSES_SP_NAME(newpad) (NCURSES_SP_DCLx int l, int c)
+{
+    WINDOW *win;
+    NCURSES_CH_T *ptr;
+    int i;
+
+    T((T_CALLED("newpad(%p,%d, %d)"), (void *) SP_PARM, l, c));
+
+    if (l <= 0 || c <= 0)
+	returnWin(0);
+
+    win = NCURSES_SP_NAME(_nc_makenew) (NCURSES_SP_ARGx l, c, 0, 0, _ISPAD);
+    if (win == NULL)
+	returnWin(0);
+
+    for (i = 0; i < l; i++) {
+	if_USE_SCROLL_HINTS(win->_line[i].oldindex = _NEWINDEX);
+	if ((win->_line[i].text = typeCalloc(NCURSES_CH_T, ((size_t) c))) == 0) {
+	    (void) _nc_freewin(win);
+	    returnWin(0);
+	}
+	for (ptr = win->_line[i].text; ptr < win->_line[i].text + c; ptr++)
+	    SetChar(*ptr, BLANK_TEXT, BLANK_ATTR);
+    }
+
+    returnWin(win);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(WINDOW *)
+newpad(int l, int c)
+{
+    return NCURSES_SP_NAME(newpad) (CURRENT_SCREEN, l, c);
+}
+#endif
+
+NCURSES_EXPORT(WINDOW *)
+subpad(WINDOW *orig, int l, int c, int begy, int begx)
+{
+    WINDOW *win = (WINDOW *) 0;
+
+    T((T_CALLED("subpad(%d, %d)"), l, c));
+
+    if (orig) {
+	if (!IS_PAD(orig)
+	    || ((win = derwin(orig, l, c, begy, begx)) == NULL))
+	    returnWin(0);
+    }
+    returnWin(win);
+}
+
+NCURSES_EXPORT(int)
+prefresh(WINDOW *win,
+	 int pminrow,
+	 int pmincol,
+	 int sminrow,
+	 int smincol,
+	 int smaxrow,
+	 int smaxcol)
+{
+#if NCURSES_SP_FUNCS
+    SCREEN *sp = _nc_screen_of(win);
+#endif
+
+    T((T_CALLED("prefresh()")));
+    if (pnoutrefresh(win, pminrow, pmincol, sminrow, smincol, smaxrow,
+		     smaxcol) != ERR
+	&& NCURSES_SP_NAME(doupdate) (NCURSES_SP_ARG) != ERR) {
+	returnCode(OK);
+    }
+    returnCode(ERR);
+}
+
+NCURSES_EXPORT(int)
+pnoutrefresh(WINDOW *win,
+	     int pminrow,
+	     int pmincol,
+	     int sminrow,
+	     int smincol,
+	     int smaxrow,
+	     int smaxcol)
+{
+    int i, j;
+    int m, n;
+    int pmaxrow;
+    int pmaxcol;
+    SCREEN *sp;
+
+#if USE_SCROLL_HINTS
+    const int my_len = 2;	/* parameterize the threshold for hardscroll */
+    NCURSES_SIZE_T displaced;
+    bool wide;
+#endif
+
+    T((T_CALLED("pnoutrefresh(%p, %d, %d, %d, %d, %d, %d)"),
+       (void *) win, pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol));
+
+    if (win == 0)
+	returnCode(ERR);
+
+    if (!IS_PAD(win))
+	returnCode(ERR);
+
+    sp = _nc_screen_of(win);
+
+    /* negative values are interpreted as zero */
+    if (pminrow < 0)
+	pminrow = 0;
+    if (pmincol < 0)
+	pmincol = 0;
+    if (sminrow < 0)
+	sminrow = 0;
+    if (smincol < 0)
+	smincol = 0;
+
+    pmaxrow = pminrow + smaxrow - sminrow;
+    pmaxcol = pmincol + smaxcol - smincol;
+
+    T((" pminrow + smaxrow - sminrow %ld, win->_maxy %ld",
+       (long) pmaxrow, (long) win->_maxy));
+    T((" pmincol + smaxcol - smincol %ld, win->_maxx %ld",
+       (long) pmaxcol, (long) win->_maxx));
+
+    /*
+     * Trim the caller's screen size back to the actual limits.
+     */
+    if (pmaxrow > win->_maxy) {
+	smaxrow -= (pmaxrow - win->_maxy);
+	pmaxrow = pminrow + smaxrow - sminrow;
+    }
+    if (pmaxcol > win->_maxx) {
+	smaxcol -= (pmaxcol - win->_maxx);
+	pmaxcol = pmincol + smaxcol - smincol;
+    }
+
+    if (smaxrow >= screen_lines(sp)
+	|| smaxcol >= screen_columns(sp)
+	|| sminrow > smaxrow
+	|| smincol > smaxcol)
+	returnCode(ERR);
+
+    T(("pad being refreshed"));
+
+#ifdef TRACE
+    if (USE_TRACEF(TRACE_UPDATE)) {
+	_tracedump("...pad", win);
+	_nc_unlock_global(tracef);
+    }
+#endif /* TRACE */
+#if USE_SCROLL_HINTS
+    if (win->_pad._pad_y >= 0) {
+	displaced = pminrow - win->_pad._pad_y
+	    - (sminrow - win->_pad._pad_top);
+	T(("pad being shifted by %d line(s)", displaced));
+    } else
+	displaced = 0;
+#endif
+
+    /*
+     * For pure efficiency, we'd want to transfer scrolling information
+     * from the pad to newscr whenever the window is wide enough that
+     * its update will dominate the cost of the update for the horizontal
+     * band of newscr that it occupies.  Unfortunately, this threshold
+     * tends to be complex to estimate, and in any case scrolling the
+     * whole band and rewriting the parts outside win's image would look
+     * really ugly.  So.  What we do is consider the pad "wide" if it
+     * either (a) occupies the whole width of newscr, or (b) occupies
+     * all but at most one column on either vertical edge of the screen
+     * (this caters to fussy people who put boxes around full-screen
+     * windows).  Note that changing this formula will not break any code,
+     * merely change the costs of various update cases.
+     */
+#if USE_SCROLL_HINTS
+    wide = (smincol < my_len && smaxcol > (NewScreen(sp)->_maxx - my_len));
+#endif
+
+    for (i = pminrow, m = sminrow + win->_yoffset;
+	 i <= pmaxrow && m <= NewScreen(sp)->_maxy;
+	 i++, m++) {
+	register struct ldat *nline = &NewScreen(sp)->_line[m];
+	register struct ldat *oline = &win->_line[i];
+	for (j = pmincol, n = smincol; j <= pmaxcol; j++, n++) {
+	    NCURSES_CH_T ch = oline->text[j];
+#if USE_WIDEC_SUPPORT
+	    /*
+	     * Special case for leftmost character of the displayed area.
+	     * Only half of a double-width character may be visible.
+	     */
+	    if (j == pmincol
+		&& j > 0
+		&& isWidecExt(ch)) {
+		SetChar(ch, L(' '), AttrOf(oline->text[j - 1]));
+	    }
+#endif
+	    if (!CharEq(ch, nline->text[n])) {
+		nline->text[n] = ch;
+		CHANGED_CELL(nline, n);
+	    }
+	}
+
+#if USE_SCROLL_HINTS
+	if (wide) {
+	    int nind = m + displaced;
+	    if (oline->oldindex < 0
+		|| nind < sminrow
+		|| nind > smaxrow) {
+		nind = _NEWINDEX;
+	    } else if (displaced) {
+		register struct ldat *pline = &CurScreen(sp)->_line[nind];
+		for (j = 0; j <= my_len; j++) {
+		    int k = NewScreen(sp)->_maxx - j;
+		    if (pline->text[j] != nline->text[j]
+			|| pline->text[k] != nline->text[k]) {
+			nind = _NEWINDEX;
+			break;
+		    }
+		}
+	    }
+
+	    nline->oldindex = nind;
+	}
+#endif /* USE_SCROLL_HINTS */
+	oline->firstchar = oline->lastchar = _NOCHANGE;
+	if_USE_SCROLL_HINTS(oline->oldindex = i);
+    }
+
+    /*
+     * Clean up debris from scrolling or resizing the pad, so we do not
+     * accidentally pick up the index value during the next call to this
+     * procedure.  The only rows that should have an index value are those
+     * that are displayed during this cycle.
+     */
+#if USE_SCROLL_HINTS
+    for (i = pminrow - 1; (i >= 0) && (win->_line[i].oldindex >= 0); i--)
+	win->_line[i].oldindex = _NEWINDEX;
+    for (i = pmaxrow + 1; (i <= win->_maxy)
+	 && (win->_line[i].oldindex >= 0); i++)
+	win->_line[i].oldindex = _NEWINDEX;
+#endif
+
+    win->_begx = (NCURSES_SIZE_T) smincol;
+    win->_begy = (NCURSES_SIZE_T) sminrow;
+
+    if (win->_clear) {
+	win->_clear = FALSE;
+	NewScreen(sp)->_clear = TRUE;
+    }
+
+    /*
+     * Use the pad's current position, if it will be visible.
+     * If not, don't do anything; it is not an error.
+     */
+    if (win->_leaveok == FALSE
+	&& win->_cury >= pminrow
+	&& win->_curx >= pmincol
+	&& win->_cury <= pmaxrow
+	&& win->_curx <= pmaxcol) {
+	NewScreen(sp)->_cury = (NCURSES_SIZE_T) (win->_cury - pminrow
+						 + win->_begy + win->_yoffset);
+	NewScreen(sp)->_curx = (NCURSES_SIZE_T) (win->_curx - pmincol
+						 + win->_begx);
+    }
+    NewScreen(sp)->_leaveok = win->_leaveok;
+    win->_flags &= ~_HASMOVED;
+
+    /*
+     * Update our cache of the line-numbers that we displayed from the pad.
+     * We will use this on subsequent calls to this function to derive
+     * values to stuff into 'oldindex[]' -- for scrolling optimization.
+     */
+    win->_pad._pad_y = (NCURSES_SIZE_T) pminrow;
+    win->_pad._pad_x = (NCURSES_SIZE_T) pmincol;
+    win->_pad._pad_top = (NCURSES_SIZE_T) sminrow;
+    win->_pad._pad_left = (NCURSES_SIZE_T) smincol;
+    win->_pad._pad_bottom = (NCURSES_SIZE_T) smaxrow;
+    win->_pad._pad_right = (NCURSES_SIZE_T) smaxcol;
+
+    returnCode(OK);
+}
+
+NCURSES_EXPORT(int)
+pechochar(WINDOW *pad, const chtype ch)
+{
+    T((T_CALLED("pechochar(%p, %s)"), (void *) pad, _tracechtype(ch)));
+
+    if (pad == 0)
+	returnCode(ERR);
+
+    if (!IS_PAD(pad))
+	returnCode(wechochar(pad, ch));
+
+    waddch(pad, ch);
+    prefresh(pad, pad->_pad._pad_y,
+	     pad->_pad._pad_x,
+	     pad->_pad._pad_top,
+	     pad->_pad._pad_left,
+	     pad->_pad._pad_bottom,
+	     pad->_pad._pad_right);
+
+    returnCode(OK);
+}
diff --git a/ncurses/base/lib_printw.c b/ncurses/base/lib_printw.c
new file mode 100644
index 0000000..d901b72
--- /dev/null
+++ b/ncurses/base/lib_printw.c
@@ -0,0 +1,167 @@
+/****************************************************************************
+ * Copyright 2018-2019,2020 Thomas E. Dickey                                *
+ * Copyright 1998-2012,2016 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey            1997-on                             *
+ ****************************************************************************/
+
+/*
+**	lib_printw.c
+**
+**	The routines printw(), wprintw() and friends.
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_printw.c,v 1.28 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(int)
+printw(const char *fmt, ...)
+{
+    va_list argp;
+    int code;
+
+#ifdef TRACE
+    va_list argq;
+    va_start(argq, fmt);
+    T((T_CALLED("printw(%s%s)"),
+       _nc_visbuf(fmt), _nc_varargs(fmt, argq)));
+    va_end(argq);
+#endif
+
+    va_start(argp, fmt);
+    code = vw_printw(stdscr, fmt, argp);
+    va_end(argp);
+
+    returnCode(code);
+}
+
+NCURSES_EXPORT(int)
+wprintw(WINDOW *win, const char *fmt, ...)
+{
+    va_list argp;
+    int code;
+
+#ifdef TRACE
+    va_list argq;
+    va_start(argq, fmt);
+    T((T_CALLED("wprintw(%p,%s%s)"),
+       (void *) win, _nc_visbuf(fmt), _nc_varargs(fmt, argq)));
+    va_end(argq);
+#endif
+
+    va_start(argp, fmt);
+    code = vw_printw(win, fmt, argp);
+    va_end(argp);
+
+    returnCode(code);
+}
+
+NCURSES_EXPORT(int)
+mvprintw(int y, int x, const char *fmt, ...)
+{
+    int code;
+
+#ifdef TRACE
+    va_list argq;
+    va_start(argq, fmt);
+    T((T_CALLED("mvprintw(%d,%d,%s%s)"),
+       y, x, _nc_visbuf(fmt), _nc_varargs(fmt, argq)));
+    va_end(argq);
+#endif
+
+    if ((code = move(y, x)) != ERR) {
+	va_list argp;
+
+	va_start(argp, fmt);
+	code = vw_printw(stdscr, fmt, argp);
+	va_end(argp);
+    }
+    returnCode(code);
+}
+
+NCURSES_EXPORT(int)
+mvwprintw(WINDOW *win, int y, int x, const char *fmt, ...)
+{
+    int code;
+
+#ifdef TRACE
+    va_list argq;
+    va_start(argq, fmt);
+    T((T_CALLED("mvwprintw(%d,%d,%p,%s%s)"),
+       y, x, (void *) win, _nc_visbuf(fmt), _nc_varargs(fmt, argq)));
+    va_end(argq);
+#endif
+
+    if ((code = wmove(win, y, x)) != ERR) {
+	va_list argp;
+
+	va_start(argp, fmt);
+	code = vw_printw(win, fmt, argp);
+	va_end(argp);
+    }
+    returnCode(code);
+}
+
+NCURSES_EXPORT(int)
+vwprintw(WINDOW *win, const char *fmt, va_list argp)
+{
+    char *buf;
+    int code = ERR;
+#if NCURSES_SP_FUNCS
+    SCREEN *sp = _nc_screen_of(win);
+#endif
+
+    T((T_CALLED("vwprintw(%p,%s,va_list)"), (void *) win, _nc_visbuf(fmt)));
+
+    buf = NCURSES_SP_NAME(_nc_printf_string) (NCURSES_SP_ARGx fmt, argp);
+    if (buf != 0) {
+	code = waddstr(win, buf);
+    }
+    returnCode(code);
+}
+
+NCURSES_EXPORT(int)
+vw_printw(WINDOW *win, const char *fmt, va_list argp)
+{
+    char *buf;
+    int code = ERR;
+#if NCURSES_SP_FUNCS
+    SCREEN *sp = _nc_screen_of(win);
+#endif
+
+    T((T_CALLED("vw_printw(%p,%s,va_list)"), (void *) win, _nc_visbuf(fmt)));
+
+    buf = NCURSES_SP_NAME(_nc_printf_string) (NCURSES_SP_ARGx fmt, argp);
+    if (buf != 0) {
+	code = waddstr(win, buf);
+    }
+    returnCode(code);
+}
diff --git a/ncurses/base/lib_redrawln.c b/ncurses/base/lib_redrawln.c
new file mode 100644
index 0000000..c99d699
--- /dev/null
+++ b/ncurses/base/lib_redrawln.c
@@ -0,0 +1,88 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2009,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey <dickey@clark.net> 1997                        *
+ ****************************************************************************/
+
+/*
+ *	lib_redrawln.c
+ *
+ *	The routine wredrawln().
+ *
+ */
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_redrawln.c,v 1.18 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(int)
+wredrawln(WINDOW *win, int beg, int num)
+{
+    int i;
+    int end;
+    size_t len;
+    SCREEN *sp;
+
+    T((T_CALLED("wredrawln(%p,%d,%d)"), (void *) win, beg, num));
+
+    if (win == 0)
+	returnCode(ERR);
+
+    sp = _nc_screen_of(win);
+
+    if (beg < 0)
+	beg = 0;
+
+    if (touchline(win, beg, num) == ERR)
+	returnCode(ERR);
+
+    if (touchline(CurScreen(sp), beg + win->_begy, num) == ERR)
+	returnCode(ERR);
+
+    end = beg + num;
+    if (end > CurScreen(sp)->_maxy + 1 - win->_begy)
+	end = CurScreen(sp)->_maxy + 1 - win->_begy;
+    if (end > win->_maxy + 1)
+	end = win->_maxy + 1;
+
+    len = (size_t) (win->_maxx + 1);
+    if (len > (size_t) (CurScreen(sp)->_maxx + 1 - win->_begx))
+	len = (size_t) (CurScreen(sp)->_maxx + 1 - win->_begx);
+    len *= sizeof(CurScreen(sp)->_line[0].text[0]);
+
+    for (i = beg; i < end; i++) {
+	int crow = i + win->_begy;
+
+	memset(CurScreen(sp)->_line[crow].text + win->_begx, 0, len);
+	NCURSES_SP_NAME(_nc_make_oldhash) (NCURSES_SP_ARGx crow);
+    }
+
+    returnCode(OK);
+}
diff --git a/ncurses/base/lib_refresh.c b/ncurses/base/lib_refresh.c
new file mode 100644
index 0000000..4579cbf
--- /dev/null
+++ b/ncurses/base/lib_refresh.c
@@ -0,0 +1,307 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2010,2011 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ *     and: Juergen Pfeifer                                                 *
+ ****************************************************************************/
+
+/*
+ *	lib_refresh.c
+ *
+ *	The routines wrefresh() and wnoutrefresh().
+ *
+ */
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_refresh.c,v 1.47 2021/11/06 22:22:03 tom Exp $")
+
+NCURSES_EXPORT(int)
+wrefresh(WINDOW *win)
+{
+    int code;
+#if NCURSES_SP_FUNCS
+    SCREEN *SP_PARM = _nc_screen_of(win);
+#endif
+
+    T((T_CALLED("wrefresh(%p)"), (void *) win));
+
+    if (win == 0) {
+	code = ERR;
+    } else if (win == CurScreen(SP_PARM)) {
+	CurScreen(SP_PARM)->_clear = TRUE;
+	code = NCURSES_SP_NAME(doupdate) (NCURSES_SP_ARG);
+    } else if ((code = wnoutrefresh(win)) == OK) {
+	if (win->_clear)
+	    NewScreen(SP_PARM)->_clear = TRUE;
+	code = NCURSES_SP_NAME(doupdate) (NCURSES_SP_ARG);
+	/*
+	 * Reset the clearok() flag in case it was set for the special
+	 * case in hardscroll.c (if we don't reset it here, we'll get 2
+	 * refreshes because the flag is copied from stdscr to newscr).
+	 * Resetting the flag shouldn't do any harm, anyway.
+	 */
+	win->_clear = FALSE;
+    }
+    returnCode(code);
+}
+
+NCURSES_EXPORT(int)
+wnoutrefresh(WINDOW *win)
+{
+    int limit_x;
+    int src_row, src_col;
+    int begx;
+    int begy;
+    int dst_row, dst_col;
+#if USE_SCROLL_HINTS
+    bool wide;
+#endif
+#if NCURSES_SP_FUNCS
+    SCREEN *SP_PARM = _nc_screen_of(win);
+#endif
+
+    T((T_CALLED("wnoutrefresh(%p)"), (void *) win));
+
+    if (win == NULL)
+	returnCode(ERR);
+
+    /*
+     * Handle pads as a special case.
+     */
+    if (IS_PAD(win)) {
+	returnCode(pnoutrefresh(win,
+				win->_pad._pad_y,
+				win->_pad._pad_x,
+				win->_pad._pad_top,
+				win->_pad._pad_left,
+				win->_pad._pad_bottom,
+				win->_pad._pad_right));
+    }
+#ifdef TRACE
+    if (USE_TRACEF(TRACE_UPDATE)) {
+	_tracedump("...win", win);
+	_nc_unlock_global(tracef);
+    }
+#endif /* TRACE */
+
+    /* put them here so "win == 0" won't break our code */
+    begx = win->_begx;
+    begy = win->_begy;
+
+    NewScreen(SP_PARM)->_nc_bkgd = win->_nc_bkgd;
+    WINDOW_ATTRS(NewScreen(SP_PARM)) = WINDOW_ATTRS(win);
+
+    /* merge in change information from all subwindows of this window */
+    wsyncdown(win);
+
+#if USE_SCROLL_HINTS
+    /*
+     * For pure efficiency, we'd want to transfer scrolling information
+     * from the window to newscr whenever the window is wide enough that
+     * its update will dominate the cost of the update for the horizontal
+     * band of newscr that it occupies.  Unfortunately, this threshold
+     * tends to be complex to estimate, and in any case scrolling the
+     * whole band and rewriting the parts outside win's image would look
+     * really ugly.  So.  What we do is consider the window "wide" if it
+     * either (a) occupies the whole width of newscr, or (b) occupies
+     * all but at most one column on either vertical edge of the screen
+     * (this caters to fussy people who put boxes around full-screen
+     * windows).  Note that changing this formula will not break any code,
+     * merely change the costs of various update cases.
+     */
+    wide = (begx <= 1 && win->_maxx >= (NewScreen(SP_PARM)->_maxx - 1));
+#endif
+
+    win->_flags &= ~_HASMOVED;
+
+    /*
+     * Microtweaking alert!  This double loop is one of the genuine
+     * hot spots in the code.  Even gcc doesn't seem to do enough
+     * common-subexpression chunking to make it really tense,
+     * so we'll force the issue.
+     */
+
+    /* limit(dst_col) */
+    limit_x = win->_maxx;
+    /* limit(src_col) */
+    if (limit_x > NewScreen(SP_PARM)->_maxx - begx)
+	limit_x = NewScreen(SP_PARM)->_maxx - begx;
+
+    for (src_row = 0, dst_row = begy + win->_yoffset;
+	 src_row <= win->_maxy && dst_row <= NewScreen(SP_PARM)->_maxy;
+	 src_row++, dst_row++) {
+	struct ldat *nline = &(NewScreen(SP_PARM)->_line[dst_row]);
+	struct ldat *oline = &win->_line[src_row];
+
+	if (oline->firstchar != _NOCHANGE) {
+	    int last_src = oline->lastchar;
+
+	    if (last_src > limit_x)
+		last_src = limit_x;
+
+	    src_col = oline->firstchar;
+	    dst_col = src_col + begx;
+
+	    if_WIDEC({
+		int j;
+
+		/*
+		 * Ensure that we will copy complete multi-column characters
+		 * on the left-boundary.
+		 */
+		if (isWidecExt(oline->text[src_col])) {
+		    j = 1 + dst_col - WidecExt(oline->text[src_col]);
+		    if (j < 0)
+			j = 0;
+		    if (dst_col > j) {
+			src_col -= (dst_col - j);
+			dst_col = j;
+		    }
+		}
+
+		/*
+		 * Ensure that we will copy complete multi-column characters
+		 * on the right-boundary.
+		 */
+		j = last_src;
+		if (WidecExt(oline->text[j])) {
+		    ++j;
+		    while (j <= limit_x) {
+			if (isWidecBase(oline->text[j])) {
+			    break;
+			} else {
+			    last_src = j;
+			}
+			++j;
+		    }
+		}
+	    });
+
+	    if_WIDEC({
+		static cchar_t blank = BLANK;
+		int last_dst = begx + ((last_src < win->_maxx)
+				       ? last_src
+				       : win->_maxx);
+		int fix_left = dst_col;
+		int fix_right = last_dst;
+		int j;
+
+		/*
+		 * Check for boundary cases where we may overwrite part of a
+		 * multi-column character.  For those, wipe the remainder of
+		 * the character to blanks.
+		 */
+		j = dst_col;
+		if (isWidecExt(nline->text[j])) {
+		    /*
+		     * On the left, we only care about multi-column characters
+		     * that extend into the changed region.
+		     */
+		    fix_left = 1 + j - WidecExt(nline->text[j]);
+		    if (fix_left < 0)
+			fix_left = 0;	/* only if cell is corrupt */
+		}
+
+		j = last_dst;
+		if (WidecExt(nline->text[j]) != 0) {
+		    /*
+		     * On the right, any multi-column character is a problem,
+		     * unless it happens to be contained in the change, and
+		     * ending at the right boundary of the change.  The
+		     * computation for 'fix_left' accounts for the left-side of
+		     * this character.  Find the end of the character.
+		     */
+		    ++j;
+		    while (j <= NewScreen(SP_PARM)->_maxx &&
+			   isWidecExt(nline->text[j])) {
+			fix_right = j++;
+		    }
+		}
+
+		/*
+		 * The analysis is simpler if we do the clearing afterwards.
+		 * Do that now.
+		 */
+		if (fix_left < dst_col || fix_right > last_dst) {
+		    for (j = fix_left; j <= fix_right; ++j) {
+			nline->text[j] = blank;
+			CHANGED_CELL(nline, j);
+		    }
+		}
+	    });
+
+	    /*
+	     * Copy the changed text.
+	     */
+	    for (; src_col <= last_src; src_col++, dst_col++) {
+		if (!CharEq(oline->text[src_col], nline->text[dst_col])) {
+		    nline->text[dst_col] = oline->text[src_col];
+		    CHANGED_CELL(nline, dst_col);
+		}
+	    }
+
+	}
+#if USE_SCROLL_HINTS
+	if (wide) {
+	    int oind = oline->oldindex;
+
+	    nline->oldindex = ((oind == _NEWINDEX)
+			       ? _NEWINDEX
+			       : (begy + oind + win->_yoffset));
+	}
+#endif /* USE_SCROLL_HINTS */
+
+	oline->firstchar = oline->lastchar = _NOCHANGE;
+	if_USE_SCROLL_HINTS(oline->oldindex = src_row);
+    }
+
+    if (win->_clear) {
+	win->_clear = FALSE;
+	NewScreen(SP_PARM)->_clear = TRUE;
+    }
+
+    if (!win->_leaveok) {
+	NewScreen(SP_PARM)->_cury = (NCURSES_SIZE_T) (win->_cury +
+						      win->_begy + win->_yoffset);
+	NewScreen(SP_PARM)->_curx = (NCURSES_SIZE_T) (win->_curx + win->_begx);
+    }
+    NewScreen(SP_PARM)->_leaveok = win->_leaveok;
+
+#ifdef TRACE
+    if (USE_TRACEF(TRACE_UPDATE)) {
+	_tracedump("newscr", NewScreen(SP_PARM));
+	_nc_unlock_global(tracef);
+    }
+#endif /* TRACE */
+    returnCode(OK);
+}
diff --git a/ncurses/base/lib_restart.c b/ncurses/base/lib_restart.c
new file mode 100644
index 0000000..81eb368
--- /dev/null
+++ b/ncurses/base/lib_restart.c
@@ -0,0 +1,118 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2012,2015 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ *     and: Juergen Pfeifer                         2008                    *
+ ****************************************************************************/
+
+/*
+ * Terminfo-only terminal setup routines:
+ *
+ *		int restartterm(const char *, int, int *)
+ */
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_restart.c,v 1.17 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(restartterm) (NCURSES_SP_DCLx
+			      NCURSES_CONST char *termp,
+			      int filenum,
+			      int *errret)
+{
+    int result;
+#ifdef USE_TERM_DRIVER
+    TERMINAL *new_term = 0;
+#endif
+
+    START_TRACE();
+    T((T_CALLED("restartterm(%p,%s,%d,%p)"),
+       (void *) SP_PARM,
+       termp,
+       filenum,
+       (void *) errret));
+
+    if (TINFO_SETUP_TERM(&new_term, termp, filenum, errret, FALSE) != OK) {
+	result = ERR;
+    } else if (SP_PARM != 0) {
+	int saveecho = SP_PARM->_echo;
+	int savecbreak = SP_PARM->_cbreak;
+	int saveraw = SP_PARM->_raw;
+	int savenl = SP_PARM->_nl;
+
+#ifdef USE_TERM_DRIVER
+	SP_PARM->_term = new_term;
+#endif
+	if (saveecho) {
+	    NCURSES_SP_NAME(echo) (NCURSES_SP_ARG);
+	} else {
+	    NCURSES_SP_NAME(noecho) (NCURSES_SP_ARG);
+	}
+
+	if (savecbreak) {
+	    NCURSES_SP_NAME(cbreak) (NCURSES_SP_ARG);
+	    NCURSES_SP_NAME(noraw) (NCURSES_SP_ARG);
+	} else if (saveraw) {
+	    NCURSES_SP_NAME(nocbreak) (NCURSES_SP_ARG);
+	    NCURSES_SP_NAME(raw) (NCURSES_SP_ARG);
+	} else {
+	    NCURSES_SP_NAME(nocbreak) (NCURSES_SP_ARG);
+	    NCURSES_SP_NAME(noraw) (NCURSES_SP_ARG);
+	}
+	if (savenl) {
+	    NCURSES_SP_NAME(nl) (NCURSES_SP_ARG);
+	} else {
+	    NCURSES_SP_NAME(nonl) (NCURSES_SP_ARG);
+	}
+
+	NCURSES_SP_NAME(reset_prog_mode) (NCURSES_SP_ARG);
+
+#if USE_SIZECHANGE
+	_nc_update_screensize(SP_PARM);
+#endif
+
+	result = OK;
+    } else {
+	result = ERR;
+    }
+    returnCode(result);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+restartterm(NCURSES_CONST char *termp, int filenum, int *errret)
+{
+    START_TRACE();
+    return NCURSES_SP_NAME(restartterm) (CURRENT_SCREEN, termp, filenum, errret);
+}
+#endif
diff --git a/ncurses/base/lib_scanw.c b/ncurses/base/lib_scanw.c
new file mode 100644
index 0000000..1ed36a5
--- /dev/null
+++ b/ncurses/base/lib_scanw.c
@@ -0,0 +1,126 @@
+/****************************************************************************
+ * Copyright 2018-2019,2020 Thomas E. Dickey                                *
+ * Copyright 1998-2009,2011 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ ****************************************************************************/
+
+/*
+**	lib_scanw.c
+**
+**	The routines scanw(), wscanw() and friends.
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_scanw.c,v 1.19 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(int)
+vwscanw(WINDOW *win, const char *fmt, va_list argp)
+{
+    char buf[BUFSIZ];
+    int code = ERR;
+
+    if (wgetnstr(win, buf, (int) sizeof(buf) - 1) != ERR) {
+	if ((code = vsscanf(buf, fmt, argp)) == EOF) {
+	    code = ERR;
+	}
+    }
+
+    return code;
+}
+
+NCURSES_EXPORT(int)
+vw_scanw(WINDOW *win, const char *fmt, va_list argp)
+{
+    char buf[BUFSIZ];
+    int code = ERR;
+
+    if (wgetnstr(win, buf, (int) sizeof(buf) - 1) != ERR) {
+	if ((code = vsscanf(buf, fmt, argp)) == EOF) {
+	    code = ERR;
+	}
+    }
+
+    return code;
+}
+
+NCURSES_EXPORT(int)
+scanw(const char *fmt, ...)
+{
+    int code;
+    va_list ap;
+
+    T(("scanw(\"%s\",...) called", fmt));
+
+    va_start(ap, fmt);
+    code = vw_scanw(stdscr, fmt, ap);
+    va_end(ap);
+    return (code);
+}
+
+NCURSES_EXPORT(int)
+wscanw(WINDOW *win, const char *fmt, ...)
+{
+    int code;
+    va_list ap;
+
+    T(("wscanw(%p,\"%s\",...) called", (void *) win, fmt));
+
+    va_start(ap, fmt);
+    code = vw_scanw(win, fmt, ap);
+    va_end(ap);
+    return (code);
+}
+
+NCURSES_EXPORT(int)
+mvscanw(int y, int x, const char *fmt, ...)
+{
+    int code;
+    va_list ap;
+
+    va_start(ap, fmt);
+    code = (move(y, x) == OK) ? vw_scanw(stdscr, fmt, ap) : ERR;
+    va_end(ap);
+    return (code);
+}
+
+NCURSES_EXPORT(int)
+mvwscanw(WINDOW *win, int y, int x, const char *fmt, ...)
+{
+    int code;
+    va_list ap;
+
+    va_start(ap, fmt);
+    code = (wmove(win, y, x) == OK) ? vw_scanw(win, fmt, ap) : ERR;
+    va_end(ap);
+    return (code);
+}
diff --git a/ncurses/base/lib_screen.c b/ncurses/base/lib_screen.c
new file mode 100644
index 0000000..70cf6fd
--- /dev/null
+++ b/ncurses/base/lib_screen.c
@@ -0,0 +1,1082 @@
+/****************************************************************************
+ * Copyright 2019-2020,2021 Thomas E. Dickey                                *
+ * Copyright 1998-2017,2018 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996 on                 *
+ *     and: Juergen Pfeifer                         2009                    *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+
+#include <ctype.h>
+
+#ifndef CUR
+#define CUR SP_TERMTYPE
+#endif
+
+MODULE_ID("$Id: lib_screen.c,v 1.104 2021/10/23 17:12:16 tom Exp $")
+
+#define MAX_SIZE 0x3fff		/* 16k is big enough for a window or pad */
+
+#define MARKER '\\'
+#define APPEND '+'
+#define GUTTER '|'
+#define L_CURL '{'
+#define R_CURL '}'
+
+#if USE_STRING_HACKS && HAVE_SNPRINTF
+#define ARG_SLIMIT(name) size_t name,
+#else
+#define ARG_SLIMIT(name)	/* nothing */
+#endif
+
+#define CUR_SLIMIT _nc_SLIMIT(limit - (size_t) (target - base))
+#define TOP_SLIMIT _nc_SLIMIT(sizeof(buffer))
+
+/*
+ * Use 0x888888 as the magic number for new-format files, since it cannot be
+ * mistaken for the _cury/_curx pair of 16-bit numbers which start the old
+ * format.  It happens to be unused in the file 5.22 database (2015/03/07).
+ */
+static const char my_magic[] =
+{'\210', '\210', '\210', '\210', 0};
+
+#if NCURSES_EXT_PUTWIN
+typedef enum {
+    pINT			/* int */
+    ,pSHORT			/* short */
+    ,pBOOL			/* bool */
+    ,pATTR			/* attr_t */
+    ,pCHAR			/* chtype */
+    ,pSIZE			/* NCURSES_SIZE_T */
+#if NCURSES_WIDECHAR
+    ,pCCHAR			/* cchar_t */
+#endif
+} PARAM_TYPE;
+
+typedef struct {
+    const char name[11];
+    attr_t attr;
+} SCR_ATTRS;
+
+typedef struct {
+    const char name[17];
+    PARAM_TYPE type;
+    size_t size;
+    size_t offset;
+} SCR_PARAMS;
+
+#define DATA(name) { { #name }, A_##name }
+static const SCR_ATTRS scr_attrs[] =
+{
+    DATA(NORMAL),
+    DATA(STANDOUT),
+    DATA(UNDERLINE),
+    DATA(REVERSE),
+    DATA(BLINK),
+    DATA(DIM),
+    DATA(BOLD),
+    DATA(ALTCHARSET),
+    DATA(INVIS),
+    DATA(PROTECT),
+    DATA(HORIZONTAL),
+    DATA(LEFT),
+    DATA(LOW),
+    DATA(RIGHT),
+    DATA(TOP),
+    DATA(VERTICAL),
+
+#ifdef A_ITALIC
+    DATA(ITALIC),
+#endif
+};
+#undef DATA
+
+#define sizeof2(type,name) sizeof(((type *)0)->name)
+#define DATA(name, type) { { #name }, type, sizeof2(WINDOW, name), offsetof(WINDOW, name) }
+
+static const SCR_PARAMS scr_params[] =
+{
+    DATA(_cury, pSIZE),
+    DATA(_curx, pSIZE),
+    DATA(_maxy, pSIZE),
+    DATA(_maxx, pSIZE),
+    DATA(_begy, pSIZE),
+    DATA(_begx, pSIZE),
+    DATA(_flags, pSHORT),
+    DATA(_attrs, pATTR),
+    DATA(_bkgd, pCHAR),
+    DATA(_notimeout, pBOOL),
+    DATA(_clear, pBOOL),
+    DATA(_leaveok, pBOOL),
+    DATA(_scroll, pBOOL),
+    DATA(_idlok, pBOOL),
+    DATA(_idcok, pBOOL),
+    DATA(_immed, pBOOL),
+    DATA(_sync, pBOOL),
+    DATA(_use_keypad, pBOOL),
+    DATA(_delay, pINT),
+    DATA(_regtop, pSIZE),
+    DATA(_regbottom, pSIZE),
+    DATA(_pad._pad_y, pSIZE),
+    DATA(_pad._pad_x, pSIZE),
+    DATA(_pad._pad_top, pSIZE),
+    DATA(_pad._pad_left, pSIZE),
+    DATA(_pad._pad_bottom, pSIZE),
+    DATA(_pad._pad_right, pSIZE),
+    DATA(_yoffset, pSIZE),
+#if NCURSES_WIDECHAR
+    DATA(_bkgrnd, pCCHAR),
+#if NCURSES_EXT_COLORS
+    DATA(_color, pINT),
+#endif
+#endif
+};
+#undef DATA
+
+static const NCURSES_CH_T blank = NewChar(BLANK_TEXT);
+
+/*
+ * Allocate and read a line of text.  Caller must free it.
+ */
+static char *
+read_txt(FILE *fp)
+{
+    size_t limit = 1024;
+    char *result = malloc(limit);
+    char *buffer;
+
+    if (result != 0) {
+	int ch = 0;
+	size_t used = 0;
+
+	clearerr(fp);
+	result[used] = '\0';
+	do {
+	    if (used + 2 >= limit) {
+		limit += 1024;
+		buffer = realloc(result, limit);
+		if (buffer == 0) {
+		    free(result);
+		    result = 0;
+		    break;
+		}
+		result = buffer;
+	    }
+	    ch = fgetc(fp);
+	    if (ch == EOF)
+		break;
+	    result[used++] = (char) ch;
+	    result[used] = '\0';
+	} while (ch != '\n');
+
+	if (ch == '\n') {
+	    result[--used] = '\0';
+	    TR(TRACE_IEVENT, ("READ:%s", result));
+	} else if (used == 0) {
+	    free(result);
+	    result = 0;
+	}
+    }
+    return result;
+}
+
+static char *
+decode_attr(char *source, attr_t *target, int *color)
+{
+    bool found = FALSE;
+
+    TR(TRACE_IEVENT, ("decode_attr   '%s'", source));
+
+    while (*source) {
+	if (source[0] == MARKER && source[1] == L_CURL) {
+	    source += 2;
+	    found = TRUE;
+	} else if (source[0] == R_CURL) {
+	    source++;
+	    found = FALSE;
+	} else if (found) {
+	    size_t n;
+	    char *next = source;
+
+	    if (source[0] == GUTTER) {
+		++next;
+	    } else if (*next == 'C') {
+		int value = 0;
+		unsigned pair;
+		next++;
+		while (isdigit(UChar(*next))) {
+		    value = value * 10 + (*next++ - '0');
+		}
+		*target &= ~A_COLOR;
+		pair = (unsigned) ((value > 256)
+				   ? COLOR_PAIR(255)
+				   : COLOR_PAIR(value));
+		*target |= pair;
+		*color = value;
+	    } else {
+		while (isalnum(UChar(*next))) {
+		    ++next;
+		}
+		for (n = 0; n < SIZEOF(scr_attrs); ++n) {
+		    if ((size_t) (next - source) == strlen(scr_attrs[n].name)) {
+			if (scr_attrs[n].attr) {
+			    *target |= scr_attrs[n].attr;
+			} else {
+			    *target = A_NORMAL;
+			}
+			break;
+		    }
+		}
+	    }
+	    source = next;
+	} else {
+	    break;
+	}
+    }
+    return source;
+}
+
+static char *
+decode_char(char *source, int *target)
+{
+    int limit = 0;
+    int base = 16;
+    const char digits[] = "0123456789abcdef";
+
+    TR(TRACE_IEVENT, ("decode_char   '%s'", source));
+    *target = ' ';
+    switch (*source) {
+    case MARKER:
+	switch (*++source) {
+	case APPEND:
+	    break;
+	case MARKER:
+	    *target = MARKER;
+	    ++source;
+	    break;
+	case 's':
+	    *target = ' ';
+	    ++source;
+	    break;
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	    base = 8;
+	    limit = 3;
+	    break;
+	case 'u':
+	    limit = 4;
+	    ++source;
+	    break;
+	case 'U':
+	    limit = 8;
+	    ++source;
+	    break;
+	}
+	if (limit) {
+	    *target = 0;
+	    while (limit-- > 0) {
+		char *find = strchr(digits, *source++);
+		int ch = (find != 0) ? (int) (find - digits) : -1;
+		*target *= base;
+		if (ch >= 0 && ch < base) {
+		    *target += ch;
+		}
+	    }
+	}
+	break;
+    default:
+	*target = *source++;
+	break;
+    }
+    return source;
+}
+
+static char *
+decode_chtype(char *source, chtype fillin, chtype *target)
+{
+    attr_t attr = ChAttrOf(fillin);
+    int color = PAIR_NUMBER((int) attr);
+    int value;
+
+    TR(TRACE_IEVENT, ("decode_chtype '%s'", source));
+    source = decode_attr(source, &attr, &color);
+    source = decode_char(source, &value);
+    *target = (ChCharOf(value) | attr | (chtype) COLOR_PAIR(color));
+    /* FIXME - ignore combining characters */
+    return source;
+}
+
+#if NCURSES_WIDECHAR
+static char *
+decode_cchar(char *source, cchar_t *fillin, cchar_t *target)
+{
+    int color;
+    attr_t attr = fillin->attr;
+    wchar_t chars[CCHARW_MAX];
+    int append = 0;
+    int value = 0;
+
+    TR(TRACE_IEVENT, ("decode_cchar  '%s'", source));
+    *target = blank;
+#if NCURSES_EXT_COLORS
+    color = fillin->ext_color;
+#else
+    color = (int) PAIR_NUMBER(attr);
+#endif
+    source = decode_attr(source, &attr, &color);
+    memset(chars, 0, sizeof(chars));
+    source = decode_char(source, &value);
+    chars[0] = (wchar_t) value;
+    /* handle combining characters */
+    while (source[0] == MARKER && source[1] == APPEND) {
+	source += 2;
+	source = decode_char(source, &value);
+	if (++append < CCHARW_MAX) {
+	    chars[append] = (wchar_t) value;
+	}
+    }
+    setcchar(target, chars, attr, (short) color, &color);
+    return source;
+}
+#endif
+
+static int
+read_win(WINDOW *win, FILE *fp)
+{
+    int code = ERR;
+    size_t n;
+    int color;
+#if NCURSES_WIDECHAR
+    NCURSES_CH_T prior;
+#endif
+    chtype prior2;
+
+    memset(win, 0, sizeof(WINDOW));
+    for (;;) {
+	char *name;
+	char *value;
+	char *txt = read_txt(fp);
+
+	if (txt == 0)
+	    break;
+	if (!strcmp(txt, "rows:")) {
+	    free(txt);
+	    code = OK;
+	    break;
+	}
+	if ((value = strchr(txt, '=')) == 0) {
+	    free(txt);
+	    continue;
+	}
+	*value++ = '\0';
+	name = !strcmp(txt, "flag") ? value : txt;
+	for (n = 0; n < SIZEOF(scr_params); ++n) {
+	    if (!strcmp(name, scr_params[n].name)) {
+		void *data = (void *) ((char *) win + scr_params[n].offset);
+
+		switch (scr_params[n].type) {
+		case pATTR:
+		    (void) decode_attr(value, data, &color);
+		    break;
+		case pBOOL:
+		    *(bool *) data = TRUE;
+		    break;
+		case pCHAR:
+		    prior2 = ' ';
+		    decode_chtype(value, prior2, data);
+		    break;
+		case pINT:
+		    *(int *) data = atoi(value);
+		    break;
+		case pSHORT:
+		    *(short *) data = (short) atoi(value);
+		    break;
+		case pSIZE:
+		    *(NCURSES_SIZE_T *) data = (NCURSES_SIZE_T) atoi(value);
+		    break;
+#if NCURSES_WIDECHAR
+		case pCCHAR:
+		    prior = blank;
+		    decode_cchar(value, &prior, data);
+		    break;
+#endif
+		}
+		break;
+	    }
+	}
+	free(txt);
+    }
+    return code;
+}
+
+static int
+read_row(char *source, NCURSES_CH_T *prior, NCURSES_CH_T *target, int length)
+{
+    while (*source != '\0' && length > 0) {
+#if NCURSES_WIDECHAR
+	int len;
+
+	source = decode_cchar(source, prior, target);
+	len = _nc_wacs_width(target->chars[0]);
+	if (len > 1) {
+	    int n;
+
+	    SetWidecExt(CHDEREF(target), 0);
+	    for (n = 1; n < len; ++n) {
+		target[n] = target[0];
+		SetWidecExt(CHDEREF(target), n);
+	    }
+	    target += (len - 1);
+	    length -= (len - 1);
+	}
+#else
+	source = decode_chtype(source, *prior, target);
+#endif
+	*prior = *target;
+	++target;
+	--length;
+    }
+    while (length-- > 0) {
+	*target++ = blank;
+    }
+    /* FIXME - see what error conditions should apply if I need to return ERR */
+    return 0;
+}
+#endif /* NCURSES_EXT_PUTWIN */
+
+/*
+ * Originally, getwin/putwin used fread/fwrite, because they used binary data.
+ * The new format uses printable ASCII, which does not have as predictable
+ * sizes.  Consequently, we use buffered I/O, e.g., fgetc/fprintf, which need
+ * special handling if we want to read screen dumps from an older library.
+ */
+static int
+read_block(void *target, size_t length, FILE *fp)
+{
+    int result = 0;
+    char *buffer = target;
+
+    clearerr(fp);
+    while (length-- != 0) {
+	int ch = fgetc(fp);
+	if (ch == EOF) {
+	    result = -1;
+	    break;
+	}
+	*buffer++ = (char) ch;
+    }
+    return result;
+}
+
+NCURSES_EXPORT(WINDOW *)
+NCURSES_SP_NAME(getwin) (NCURSES_SP_DCLx FILE *filep)
+{
+    WINDOW tmp, *nwin;
+    bool old_format = FALSE;
+
+    T((T_CALLED("getwin(%p)"), (void *) filep));
+
+    if (filep == 0) {
+	returnWin(0);
+    }
+
+    /*
+     * Read the first 4 bytes to determine first if this is an old-format
+     * screen-dump, or new-format.
+     */
+    if (read_block(&tmp, (size_t) 4, filep) < 0) {
+	returnWin(0);
+    }
+    /*
+     * If this is a new-format file, and we do not support it, give up.
+     */
+    if (!memcmp(&tmp, my_magic, (size_t) 4)) {
+#if NCURSES_EXT_PUTWIN
+	if (read_win(&tmp, filep) < 0)
+#endif
+	    returnWin(0);
+    } else if (read_block(((char *) &tmp) + 4, sizeof(WINDOW) - 4, filep) < 0) {
+	returnWin(0);
+    } else {
+	old_format = TRUE;
+    }
+
+    /*
+     * Check the window-size:
+     */
+    if (tmp._maxy == 0 ||
+	tmp._maxy > MAX_SIZE ||
+	tmp._maxx == 0 ||
+	tmp._maxx > MAX_SIZE) {
+	returnWin(0);
+    }
+
+    if (IS_PAD(&tmp)) {
+	nwin = NCURSES_SP_NAME(newpad) (NCURSES_SP_ARGx
+					tmp._maxy + 1,
+					tmp._maxx + 1);
+    } else {
+	nwin = NCURSES_SP_NAME(newwin) (NCURSES_SP_ARGx
+					tmp._maxy + 1,
+					tmp._maxx + 1, 0, 0);
+    }
+
+    /*
+     * We deliberately do not restore the _parx, _pary, or _parent
+     * fields, because the window hierarchy within which they
+     * made sense is probably gone.
+     */
+    if (nwin != 0) {
+	int n;
+	size_t linesize = sizeof(NCURSES_CH_T) * (size_t) (tmp._maxx + 1);
+
+	nwin->_curx = tmp._curx;
+	nwin->_cury = tmp._cury;
+	nwin->_maxy = tmp._maxy;
+	nwin->_maxx = tmp._maxx;
+	nwin->_begy = tmp._begy;
+	nwin->_begx = tmp._begx;
+	nwin->_yoffset = tmp._yoffset;
+	nwin->_flags = tmp._flags & ~(_SUBWIN);
+
+	WINDOW_ATTRS(nwin) = WINDOW_ATTRS(&tmp);
+	nwin->_nc_bkgd = tmp._nc_bkgd;
+
+	nwin->_notimeout = tmp._notimeout;
+	nwin->_clear = tmp._clear;
+	nwin->_leaveok = tmp._leaveok;
+	nwin->_idlok = tmp._idlok;
+	nwin->_idcok = tmp._idcok;
+	nwin->_immed = tmp._immed;
+	nwin->_scroll = tmp._scroll;
+	nwin->_sync = tmp._sync;
+	nwin->_use_keypad = tmp._use_keypad;
+	nwin->_delay = tmp._delay;
+
+	nwin->_regtop = tmp._regtop;
+	nwin->_regbottom = tmp._regbottom;
+
+	if (IS_PAD(&tmp))
+	    nwin->_pad = tmp._pad;
+
+	if (old_format) {
+	    T(("reading old-format screen dump"));
+	    for (n = 0; n <= nwin->_maxy; n++) {
+		if (read_block(nwin->_line[n].text, linesize, filep) < 0) {
+		    delwin(nwin);
+		    returnWin(0);
+		}
+	    }
+	}
+#if NCURSES_EXT_PUTWIN
+	else {
+	    char *txt = 0;
+	    bool success = TRUE;
+	    NCURSES_CH_T prior = blank;
+
+	    T(("reading new-format screen dump"));
+	    for (n = 0; n <= nwin->_maxy; n++) {
+		long row;
+		char *next;
+
+		if ((txt = read_txt(filep)) == 0) {
+		    T(("...failed to read string for row %d", n + 1));
+		    success = FALSE;
+		    break;
+		}
+		row = strtol(txt, &next, 10);
+		if (row != (n + 1) || *next != ':') {
+		    T(("...failed to read row-number %d", n + 1));
+		    success = FALSE;
+		    break;
+		}
+
+		if (read_row(++next, &prior, nwin->_line[n].text, tmp._maxx
+			     + 1) < 0) {
+		    T(("...failed to read cells for row %d", n + 1));
+		    success = FALSE;
+		    break;
+		}
+		free(txt);
+		txt = 0;
+	    }
+
+	    if (!success) {
+		free(txt);
+		delwin(nwin);
+		returnWin(0);
+	    }
+	}
+#endif
+	touchwin(nwin);
+    }
+    returnWin(nwin);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(WINDOW *)
+getwin(FILE *filep)
+{
+    return NCURSES_SP_NAME(getwin) (CURRENT_SCREEN, filep);
+}
+#endif
+
+#if NCURSES_EXT_PUTWIN
+static void
+encode_attr(char *target, ARG_SLIMIT(limit)
+	    attr_t source,
+	    attr_t prior,
+	    int source_color,
+	    int prior_color)
+{
+#if USE_STRING_HACKS && HAVE_SNPRINTF
+    char *base = target;
+#endif
+    source &= ~A_CHARTEXT;
+    prior &= ~A_CHARTEXT;
+
+    *target = '\0';
+    if ((source != prior) || (source_color != prior_color)) {
+	size_t n;
+	bool first = TRUE;
+
+	*target++ = MARKER;
+	*target++ = L_CURL;
+
+	for (n = 0; n < SIZEOF(scr_attrs); ++n) {
+	    if ((source & scr_attrs[n].attr) != 0 ||
+		((source & ALL_BUT_COLOR) == 0 &&
+		 (scr_attrs[n].attr == A_NORMAL))) {
+		if (first) {
+		    first = FALSE;
+		} else {
+		    *target++ = '|';
+		}
+		_nc_STRCPY(target, scr_attrs[n].name, limit);
+		target += strlen(target);
+	    }
+	}
+	if (source_color != prior_color) {
+	    if (!first)
+		*target++ = '|';
+	    _nc_SPRINTF(target, CUR_SLIMIT "C%d", source_color);
+	    target += strlen(target);
+	}
+
+	*target++ = R_CURL;
+	*target = '\0';
+    }
+}
+
+static void
+encode_cell(char *target, ARG_SLIMIT(limit) CARG_CH_T source, CARG_CH_T previous)
+{
+#if USE_STRING_HACKS && HAVE_SNPRINTF
+    char *base = target;
+#endif
+#if NCURSES_WIDECHAR
+    size_t n;
+    int source_pair = GetPair(*source);
+    int previous_pair = GetPair(*previous);
+
+    *target = '\0';
+    if ((previous->attr != source->attr) || (previous_pair != source_pair)) {
+	encode_attr(target, CUR_SLIMIT
+		    source->attr,
+		    previous->attr,
+		    source_pair,
+		    previous_pair);
+    }
+    target += strlen(target);
+#if NCURSES_EXT_COLORS
+    if (previous->ext_color != source->ext_color) {
+	_nc_SPRINTF(target, CUR_SLIMIT
+		    "%c%cC%d%c", MARKER, L_CURL, source->ext_color, R_CURL);
+    }
+#endif
+    for (n = 0; n < SIZEOF(source->chars); ++n) {
+	unsigned uch = (unsigned) source->chars[n];
+	if (uch == 0)
+	    continue;
+	if (n) {
+	    *target++ = MARKER;
+	    *target++ = APPEND;
+	}
+	*target++ = MARKER;
+	if (uch > 0xffff) {
+	    _nc_SPRINTF(target, CUR_SLIMIT "U%08x", uch);
+	} else if (uch > 0xff) {
+	    _nc_SPRINTF(target, CUR_SLIMIT "u%04x", uch);
+	} else if (uch < 32 || uch >= 127) {
+	    _nc_SPRINTF(target, CUR_SLIMIT "%03o", uch & 0xff);
+	} else {
+	    switch (uch) {
+	    case ' ':
+		_nc_STRCPY(target, "s", limit);
+		break;
+	    case MARKER:
+		*target++ = MARKER;
+		*target = '\0';
+		break;
+	    default:
+		--target;
+		_nc_SPRINTF(target, CUR_SLIMIT "%c", uch);
+		break;
+	    }
+	}
+	target += strlen(target);
+    }
+#else
+    chtype ch = CharOfD(source);
+
+    *target = '\0';
+    if (AttrOfD(previous) != AttrOfD(source)) {
+	encode_attr(target, CUR_SLIMIT
+		    AttrOfD(source),
+		    AttrOfD(previous),
+		    GetPair(source),
+		    GetPair(previous));
+    }
+    target += strlen(target);
+    *target++ = MARKER;
+    if (ch < 32 || ch >= 127) {
+	_nc_SPRINTF(target, CUR_SLIMIT "%03o", UChar(ch));
+    } else {
+	switch (ch) {
+	case ' ':
+	    _nc_STRCPY(target, "s", limit);
+	    break;
+	case MARKER:
+	    *target++ = MARKER;
+	    *target = '\0';
+	    break;
+	default:
+	    --target;
+	    _nc_SPRINTF(target, CUR_SLIMIT "%c", UChar(ch));
+	    break;
+	}
+    }
+#endif
+}
+#endif
+
+NCURSES_EXPORT(int)
+putwin(WINDOW *win, FILE *filep)
+{
+    int code = ERR;
+
+    T((T_CALLED("putwin(%p,%p)"), (void *) win, (void *) filep));
+
+#if NCURSES_EXT_PUTWIN
+    if (win != 0) {
+	const char *version = curses_version();
+	char buffer[1024];
+	NCURSES_CH_T last_cell;
+	int y;
+
+	memset(&last_cell, 0, sizeof(last_cell));
+
+	clearerr(filep);
+
+	/*
+	 * Our magic number is technically nonprinting, but aside from that,
+	 * all of the file is printable ASCII.
+	 */
+#define PUTS(s) if (fputs(s, filep) == EOF || ferror(filep)) returnCode(code)
+	PUTS(my_magic);
+	PUTS(version);
+	PUTS("\n");
+	for (y = 0; y < (int) SIZEOF(scr_params); ++y) {
+	    const char *name = scr_params[y].name;
+	    const char *data = (char *) win + scr_params[y].offset;
+	    const void *dp = (const void *) data;
+	    attr_t attr;
+
+	    *buffer = '\0';
+	    if (!strncmp(name, "_pad.", (size_t) 5) && !IS_PAD(win)) {
+		continue;
+	    }
+	    switch (scr_params[y].type) {
+	    case pATTR:
+		attr = (*(const attr_t *) dp) & ~A_CHARTEXT;
+		encode_attr(buffer, TOP_SLIMIT
+			    (*(const attr_t *) dp) & ~A_CHARTEXT,
+			    A_NORMAL,
+			    COLOR_PAIR((int) attr),
+			    0);
+		break;
+	    case pBOOL:
+		if (!(*(const bool *) data)) {
+		    continue;
+		}
+		_nc_STRCPY(buffer, name, sizeof(buffer));
+		name = "flag";
+		break;
+	    case pCHAR:
+		attr = (*(const attr_t *) dp);
+		encode_attr(buffer, TOP_SLIMIT
+			    * (const attr_t *) dp,
+			    A_NORMAL,
+			    COLOR_PAIR((int) attr),
+			    0);
+		break;
+	    case pINT:
+		if (!(*(const int *) dp))
+		    continue;
+		_nc_SPRINTF(buffer, TOP_SLIMIT
+			    "%d", *(const int *) dp);
+		break;
+	    case pSHORT:
+		if (!(*(const short *) dp))
+		    continue;
+		_nc_SPRINTF(buffer, TOP_SLIMIT
+			    "%d", *(const short *) dp);
+		break;
+	    case pSIZE:
+		if (!(*(const NCURSES_SIZE_T *) dp))
+		    continue;
+		_nc_SPRINTF(buffer, TOP_SLIMIT
+			    "%d", *(const NCURSES_SIZE_T *) dp);
+		break;
+#if NCURSES_WIDECHAR
+	    case pCCHAR:
+		encode_cell(buffer, TOP_SLIMIT
+			    (CARG_CH_T) dp, CHREF(last_cell));
+		break;
+#endif
+	    }
+	    /*
+	     * Only write non-default data.
+	     */
+	    if (*buffer != '\0') {
+		if (fprintf(filep, "%s=%s\n", name, buffer) <= 0
+		    || ferror(filep))
+		    returnCode(code);
+	    }
+	}
+	/* Write row-data */
+	fprintf(filep, "rows:\n");
+	for (y = 0; y <= win->_maxy; y++) {
+	    NCURSES_CH_T *data = win->_line[y].text;
+	    int x;
+	    if (fprintf(filep, "%d:", y + 1) <= 0
+		|| ferror(filep))
+		returnCode(code);
+	    for (x = 0; x <= win->_maxx; x++) {
+#if NCURSES_WIDECHAR
+		int len = _nc_wacs_width(data[x].chars[0]);
+		encode_cell(buffer, TOP_SLIMIT CHREF(data[x]), CHREF(last_cell));
+		last_cell = data[x];
+		PUTS(buffer);
+		if (len > 1)
+		    x += (len - 1);
+#else
+		encode_cell(buffer, TOP_SLIMIT CHREF(data[x]), CHREF(last_cell));
+		last_cell = data[x];
+		PUTS(buffer);
+#endif
+	    }
+	    PUTS("\n");
+	}
+	code = OK;
+    }
+#else
+    /*
+     * This is the original putwin():
+     * A straight binary dump is simple, but its format can depend on whether
+     * ncurses is compiled with wide-character support, and also may depend
+     * on the version of ncurses, e.g., if the WINDOW structure is extended.
+     */
+    if (win != 0) {
+	size_t len = (size_t) (win->_maxx + 1);
+	int y;
+
+	clearerr(filep);
+	if (fwrite(win, sizeof(WINDOW), (size_t) 1, filep) != 1
+	    || ferror(filep))
+	      returnCode(code);
+
+	for (y = 0; y <= win->_maxy; y++) {
+	    if (fwrite(win->_line[y].text,
+		       sizeof(NCURSES_CH_T), len, filep) != len
+		|| ferror(filep)) {
+		returnCode(code);
+	    }
+	}
+	code = OK;
+    }
+#endif
+    returnCode(code);
+}
+
+/*
+ * Replace a window covering the whole screen, i.e., newscr or curscr.
+ */
+static WINDOW *
+replace_window(WINDOW *target, FILE *source)
+{
+    WINDOW *result = getwin(source);
+#if NCURSES_EXT_FUNCS
+    if (result != NULL) {
+	if (getmaxx(result) != getmaxx(target)
+	    || getmaxy(result) != getmaxy(target)) {
+	    int code = wresize(result,
+			       1 + getmaxy(target),
+			       1 + getmaxx(target));
+	    if (code != OK) {
+		delwin(result);
+		result = NULL;
+	    }
+	}
+    }
+#endif
+    delwin(target);
+    return result;
+}
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(scr_restore) (NCURSES_SP_DCLx const char *file)
+{
+    FILE *fp = 0;
+    int code = ERR;
+
+    T((T_CALLED("scr_restore(%p,%s)"), (void *) SP_PARM, _nc_visbuf(file)));
+
+    if (_nc_access(file, R_OK) >= 0
+	&& (fp = safe_fopen(file, BIN_R)) != 0) {
+	NewScreen(SP_PARM) = replace_window(NewScreen(SP_PARM), fp);
+#if !USE_REENTRANT
+	newscr = NewScreen(SP_PARM);
+#endif
+	(void) fclose(fp);
+	if (NewScreen(SP_PARM) != 0) {
+	    code = OK;
+	}
+    }
+    returnCode(code);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+scr_restore(const char *file)
+{
+    return NCURSES_SP_NAME(scr_restore) (CURRENT_SCREEN, file);
+}
+#endif
+
+NCURSES_EXPORT(int)
+scr_dump(const char *file)
+{
+    int result;
+    FILE *fp = 0;
+
+    T((T_CALLED("scr_dump(%s)"), _nc_visbuf(file)));
+
+    if (_nc_access(file, W_OK) < 0
+	|| (fp = safe_fopen(file, BIN_W)) == 0) {
+	result = ERR;
+    } else {
+	(void) putwin(newscr, fp);
+	(void) fclose(fp);
+	result = OK;
+    }
+    returnCode(result);
+}
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(scr_init) (NCURSES_SP_DCLx const char *file)
+{
+    int code = ERR;
+
+    T((T_CALLED("scr_init(%p,%s)"), (void *) SP_PARM, _nc_visbuf(file)));
+
+    if (SP_PARM != 0 &&
+#ifdef USE_TERM_DRIVER
+	InfoOf(SP_PARM).caninit
+#else
+	!(exit_ca_mode && non_rev_rmcup)
+#endif
+	) {
+	FILE *fp = 0;
+
+	if (_nc_access(file, R_OK) >= 0
+	    && (fp = safe_fopen(file, BIN_R)) != 0) {
+	    CurScreen(SP_PARM) = replace_window(CurScreen(SP_PARM), fp);
+#if !USE_REENTRANT
+	    curscr = CurScreen(SP_PARM);
+#endif
+	    (void) fclose(fp);
+	    if (CurScreen(SP_PARM) != 0) {
+		code = OK;
+	    }
+	}
+    }
+    returnCode(code);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+scr_init(const char *file)
+{
+    return NCURSES_SP_NAME(scr_init) (CURRENT_SCREEN, file);
+}
+#endif
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(scr_set) (NCURSES_SP_DCLx const char *file)
+{
+    int code = ERR;
+
+    T((T_CALLED("scr_set(%p,%s)"), (void *) SP_PARM, _nc_visbuf(file)));
+
+    if (NCURSES_SP_NAME(scr_init) (NCURSES_SP_ARGx file) == OK) {
+	delwin(NewScreen(SP_PARM));
+	NewScreen(SP_PARM) = dupwin(curscr);
+#if !USE_REENTRANT
+	newscr = NewScreen(SP_PARM);
+#endif
+	if (NewScreen(SP_PARM) != 0) {
+	    code = OK;
+	}
+    }
+    returnCode(code);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+scr_set(const char *file)
+{
+    return NCURSES_SP_NAME(scr_set) (CURRENT_SCREEN, file);
+}
+#endif
diff --git a/ncurses/base/lib_scroll.c b/ncurses/base/lib_scroll.c
new file mode 100644
index 0000000..ecc0ba5
--- /dev/null
+++ b/ncurses/base/lib_scroll.c
@@ -0,0 +1,153 @@
+/****************************************************************************
+ * Copyright 2019,2020 Thomas E. Dickey                                     *
+ * Copyright 1998-2010,2011 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey 1996-2003                                      *
+ *     and: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ ****************************************************************************/
+
+/*
+**	lib_scroll.c
+**
+**	The routine wscrl(win, n).
+**  positive n scroll the window up (ie. move lines down)
+**  negative n scroll the window down (ie. move lines up)
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_scroll.c,v 1.32 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(void)
+_nc_scroll_window(WINDOW *win,
+		  int const n,
+		  int const top,
+		  int const bottom,
+		  NCURSES_CH_T blank)
+{
+    int limit;
+    int line;
+    int j;
+    size_t to_copy = (sizeof(NCURSES_CH_T) * (size_t) (win->_maxx + 1));
+
+    TR(TRACE_MOVE, ("_nc_scroll_window(%p, %d, %ld, %ld)",
+		    (void *) win, n, (long) top, (long) bottom));
+
+    if (top < 0
+	|| bottom < top
+	|| bottom > win->_maxy) {
+	TR(TRACE_MOVE, ("nothing to scroll"));
+	return;
+    }
+
+    /*
+     * This used to do a line-text pointer-shuffle instead of text copies.
+     * That (a) doesn't work when the window is derived and doesn't have
+     * its own storage, (b) doesn't save you a lot on modern machines
+     * anyway.  Your typical memcpy implementations are coded in
+     * assembler using a tight BLT loop; for the size of copies we're
+     * talking here, the total execution time is dominated by the one-time
+     * setup cost.  So there is no point in trying to be excessively
+     * clever -- esr.
+     */
+#define BottomLimit(n) ((n) >= 0 && (n) >= top)
+#define TopLimit(n)    ((n) <= win->_maxy && (n) <= bottom)
+
+    /* shift n lines downwards */
+    if (n < 0) {
+	limit = top - n;
+	for (line = bottom; line >= limit && BottomLimit(line); line--) {
+	    TR(TRACE_MOVE, ("...copying %d to %d", line + n, line));
+	    memcpy(win->_line[line].text,
+		   win->_line[line + n].text,
+		   to_copy);
+	    if_USE_SCROLL_HINTS(win->_line[line].oldindex =
+				win->_line[line + n].oldindex);
+	}
+	for (line = top; line < limit && TopLimit(line); line++) {
+	    TR(TRACE_MOVE, ("...filling %d", line));
+	    for (j = 0; j <= win->_maxx; j++)
+		win->_line[line].text[j] = blank;
+	    if_USE_SCROLL_HINTS(win->_line[line].oldindex = _NEWINDEX);
+	}
+    }
+
+    /* shift n lines upwards */
+    if (n > 0) {
+	limit = bottom - n;
+	for (line = top; line <= limit && TopLimit(line); line++) {
+	    memcpy(win->_line[line].text,
+		   win->_line[line + n].text,
+		   to_copy);
+	    if_USE_SCROLL_HINTS(win->_line[line].oldindex =
+				win->_line[line + n].oldindex);
+	}
+	for (line = bottom; line > limit && BottomLimit(line); line--) {
+	    for (j = 0; j <= win->_maxx; j++)
+		win->_line[line].text[j] = blank;
+	    if_USE_SCROLL_HINTS(win->_line[line].oldindex = _NEWINDEX);
+	}
+    }
+    touchline(win, top, bottom - top + 1);
+
+    if_WIDEC({
+	if (WINDOW_EXT(win, addch_used) != 0) {
+	    int next = WINDOW_EXT(win, addch_y) + n;
+	    if (next < 0 || next > win->_maxy) {
+		TR(TRACE_VIRTPUT,
+		   ("Alert discarded multibyte on scroll"));
+		WINDOW_EXT(win, addch_y) = 0;
+	    } else {
+		TR(TRACE_VIRTPUT, ("scrolled working position to %d,%d",
+				   WINDOW_EXT(win, addch_y),
+				   WINDOW_EXT(win, addch_x)));
+		WINDOW_EXT(win, addch_y) = next;
+	    }
+	}
+    })
+}
+
+NCURSES_EXPORT(int)
+wscrl(WINDOW *win, int n)
+{
+    T((T_CALLED("wscrl(%p,%d)"), (void *) win, n));
+
+    if (!win || !win->_scroll) {
+	TR(TRACE_MOVE, ("...scrollok is false"));
+	returnCode(ERR);
+    }
+
+    if (n != 0) {
+	_nc_scroll_window(win, n, win->_regtop, win->_regbottom, win->_nc_bkgd);
+	_nc_synchook(win);
+    }
+    returnCode(OK);
+}
diff --git a/ncurses/base/lib_scrollok.c b/ncurses/base/lib_scrollok.c
new file mode 100644
index 0000000..c9462c3
--- /dev/null
+++ b/ncurses/base/lib_scrollok.c
@@ -0,0 +1,56 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2000,2009 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ ****************************************************************************/
+
+/*
+**	lib_scrollok.c
+**
+**	The routine scrollok.
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_scrollok.c,v 1.6 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(int)
+scrollok(WINDOW *win, bool flag)
+{
+    T((T_CALLED("scrollok(%p,%d)"), (void *) win, flag));
+
+    if (win) {
+	win->_scroll = flag;
+	returnCode(OK);
+    } else
+	returnCode(ERR);
+}
diff --git a/ncurses/base/lib_scrreg.c b/ncurses/base/lib_scrreg.c
new file mode 100644
index 0000000..5207f6f
--- /dev/null
+++ b/ncurses/base/lib_scrreg.c
@@ -0,0 +1,61 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2000,2009 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ ****************************************************************************/
+
+/*
+**	lib_scrreg.c
+**
+**	The routine wsetscrreg().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_scrreg.c,v 1.12 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(int)
+wsetscrreg(WINDOW *win, int top, int bottom)
+{
+    T((T_CALLED("wsetscrreg(%p,%d,%d)"), (void *) win, top, bottom));
+
+    if (win &&
+	top >= 0 && top <= win->_maxy &&
+	bottom >= 0 && bottom <= win->_maxy &&
+	bottom > top) {
+	win->_regtop = (NCURSES_SIZE_T) top;
+	win->_regbottom = (NCURSES_SIZE_T) bottom;
+
+	returnCode(OK);
+    } else
+	returnCode(ERR);
+}
diff --git a/ncurses/base/lib_set_term.c b/ncurses/base/lib_set_term.c
new file mode 100644
index 0000000..78de859
--- /dev/null
+++ b/ncurses/base/lib_set_term.c
@@ -0,0 +1,872 @@
+/****************************************************************************
+ * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ *     and: Juergen Pfeifer                         2009                    *
+ ****************************************************************************/
+
+/*
+**	lib_set_term.c
+**
+**	The routine set_term().
+**
+*/
+
+#define NEW_PAIR_INTERNAL 1
+
+#include <curses.priv.h>
+#include <tic.h>
+#include <new_pair.h>
+
+#if USE_GPM_SUPPORT
+#ifdef HAVE_LIBDL
+/* use dynamic loader to avoid linkage dependency */
+#include <dlfcn.h>
+#endif
+#endif
+
+#undef CUR
+#define CUR SP_TERMTYPE
+
+MODULE_ID("$Id: lib_set_term.c,v 1.184 2022/12/10 21:34:12 tom Exp $")
+
+#ifdef USE_TERM_DRIVER
+#define MaxColors      InfoOf(sp).maxcolors
+#define NumLabels      InfoOf(sp).numlabels
+#else
+#define MaxColors      max_colors
+#define NumLabels      num_labels
+#endif
+
+NCURSES_EXPORT(SCREEN *)
+set_term(SCREEN *screenp)
+{
+    SCREEN *oldSP;
+    SCREEN *newSP;
+
+    T((T_CALLED("set_term(%p)"), (void *) screenp));
+
+    _nc_lock_global(curses);
+
+    oldSP = CURRENT_SCREEN;
+    _nc_set_screen(screenp);
+    newSP = screenp;
+
+    if (newSP != 0) {
+	TINFO_SET_CURTERM(newSP, newSP->_term);
+#if !USE_REENTRANT
+	curscr = CurScreen(newSP);
+	newscr = NewScreen(newSP);
+	stdscr = StdScreen(newSP);
+	COLORS = newSP->_color_count;
+	COLOR_PAIRS = newSP->_pair_count;
+#endif
+    } else {
+	TINFO_SET_CURTERM(oldSP, 0);
+#if !USE_REENTRANT
+	curscr = 0;
+	newscr = 0;
+	stdscr = 0;
+	COLORS = 0;
+	COLOR_PAIRS = 0;
+#endif
+    }
+
+    _nc_unlock_global(curses);
+
+    T((T_RETURN("%p"), (void *) oldSP));
+    return (oldSP);
+}
+
+static void
+_nc_free_keytry(TRIES * kt)
+{
+    if (kt != 0) {
+	_nc_free_keytry(kt->child);
+	_nc_free_keytry(kt->sibling);
+	free(kt);
+    }
+}
+
+static bool
+delink_screen(SCREEN *sp)
+{
+    SCREEN *last = 0;
+    SCREEN *temp;
+    bool result = FALSE;
+
+    for (each_screen(temp)) {
+	if (temp == sp) {
+	    if (last)
+		last->_next_screen = sp->_next_screen;
+	    else
+		_nc_screen_chain = sp->_next_screen;
+	    result = TRUE;
+	    break;
+	}
+	last = temp;
+    }
+    return result;
+}
+
+/*
+ * Free the storage associated with the given SCREEN sp.
+ */
+NCURSES_EXPORT(void)
+delscreen(SCREEN *sp)
+{
+
+    T((T_CALLED("delscreen(%p)"), (void *) sp));
+
+    _nc_lock_global(curses);
+    if (delink_screen(sp)) {
+	WINDOWLIST *wl;
+	bool is_current = (sp == CURRENT_SCREEN);
+
+#ifdef USE_SP_RIPOFF
+	if (safe_ripoff_sp && safe_ripoff_sp != safe_ripoff_stack) {
+	    ripoff_t *rop;
+	    for (rop = safe_ripoff_stack;
+		 rop != safe_ripoff_sp && (rop - safe_ripoff_stack) < N_RIPS;
+		 rop++) {
+		if (rop->win) {
+		    (void) delwin(rop->win);
+		    rop->win = 0;
+		}
+	    }
+	}
+#endif
+
+	/* delete all of the windows in this screen */
+      rescan:
+	for (each_window(sp, wl)) {
+	    if (_nc_freewin(&(wl->win)) == OK) {
+		goto rescan;
+	    }
+	}
+
+	if (sp->_slk != 0) {
+
+	    if (sp->_slk->ent != 0) {
+		int i;
+
+		for (i = 0; i < sp->_slk->labcnt; ++i) {
+		    FreeIfNeeded(sp->_slk->ent[i].ent_text);
+		    FreeIfNeeded(sp->_slk->ent[i].form_text);
+		}
+		free(sp->_slk->ent);
+	    }
+	    free(sp->_slk);
+	    sp->_slk = 0;
+	}
+
+	_nc_free_keytry(sp->_keytry);
+	sp->_keytry = 0;
+
+	_nc_free_keytry(sp->_key_ok);
+	sp->_key_ok = 0;
+
+	FreeIfNeeded(sp->_current_attr);
+
+	_nc_free_ordered_pairs(sp);
+	FreeIfNeeded(sp->_color_table);
+	FreeIfNeeded(sp->_color_pairs);
+
+	FreeIfNeeded(sp->_oldnum_list);
+	FreeIfNeeded(sp->oldhash);
+	FreeIfNeeded(sp->newhash);
+	FreeIfNeeded(sp->hashtab);
+
+	FreeIfNeeded(sp->_acs_map);
+	FreeIfNeeded(sp->_screen_acs_map);
+
+	NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_ARG);
+	NCURSES_SP_NAME(del_curterm) (NCURSES_SP_ARGx sp->_term);
+	FreeIfNeeded(sp->out_buffer);
+	if (_nc_find_prescr() == sp) {
+	    _nc_forget_prescr();
+	}
+#if USE_GPM_SUPPORT
+#ifdef HAVE_LIBDL
+	if (sp->_dlopen_gpm != 0) {
+	    dlclose(sp->_dlopen_gpm);
+	    sp->_dlopen_gpm = 0;
+	}
+#endif
+#endif /* USE_GPM_SUPPORT */
+	free(sp);
+
+	/*
+	 * If this was the current screen, reset everything that the
+	 * application might try to use (except cur_term, which may have
+	 * multiple references in different screens).
+	 */
+	if (is_current) {
+#if !USE_REENTRANT
+	    curscr = 0;
+	    newscr = 0;
+	    stdscr = 0;
+	    COLORS = 0;
+	    COLOR_PAIRS = 0;
+#endif
+	    _nc_set_screen(0);
+#if USE_WIDEC_SUPPORT
+	    if (SP == 0) {
+		FreeIfNeeded(_nc_wacs);
+		_nc_wacs = 0;
+	    }
+#endif
+	} else {
+	    set_term(CURRENT_SCREEN);
+	}
+    }
+    _nc_unlock_global(curses);
+
+    returnVoid;
+}
+
+static bool
+no_mouse_event(SCREEN *sp GCC_UNUSED)
+{
+    return FALSE;
+}
+
+static bool
+no_mouse_inline(SCREEN *sp GCC_UNUSED)
+{
+    return FALSE;
+}
+
+static bool
+no_mouse_parse(SCREEN *sp GCC_UNUSED, int code GCC_UNUSED)
+{
+    return TRUE;
+}
+
+static void
+no_mouse_resume(SCREEN *sp GCC_UNUSED)
+{
+}
+
+static void
+no_mouse_wrap(SCREEN *sp GCC_UNUSED)
+{
+}
+
+#if NCURSES_EXT_FUNCS && USE_COLORFGBG
+static const char *
+extract_fgbg(const char *src, int *result)
+{
+    const char *dst = 0;
+    char *tmp = 0;
+    long value = strtol(src, &tmp, 0);
+
+    if ((dst = tmp) == 0) {
+	dst = src;
+    } else if (value >= 0) {
+	*result = (int) value;
+    }
+    while (*dst != 0 && *dst != ';')
+	dst++;
+    if (*dst == ';')
+	dst++;
+    return dst;
+}
+#endif
+
+#define ReturnScreenError() do { _nc_set_screen(0); \
+                            returnCode(ERR); } while (0)
+
+/* OS-independent screen initializations */
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(_nc_setupscreen) (
+#if NCURSES_SP_FUNCS
+				     SCREEN **spp,
+#endif
+				     int slines,
+				     int scolumns,
+				     FILE *output,
+				     int filtered,
+				     int slk_format)
+{
+#ifndef USE_TERM_DRIVER
+    static const TTY null_TTY;	/* all zeros iff uninitialized */
+#endif
+    char *env;
+    int bottom_stolen = 0;
+    SCREEN *sp;
+#ifndef USE_TERM_DRIVER
+    bool support_cookies = USE_XMC_SUPPORT;
+#endif
+
+    T((T_CALLED("_nc_setupscreen(%d, %d, %p, %d, %d)"),
+       slines, scolumns, (void *) output, filtered, slk_format));
+
+    assert(CURRENT_SCREEN == 0);	/* has been reset in newterm() ! */
+
+#if NCURSES_SP_FUNCS
+    assert(spp != 0);
+    sp = *spp;
+
+    if (!sp) {
+	sp = _nc_alloc_screen_sp();
+	T(("_nc_alloc_screen_sp %p", (void *) sp));
+	*spp = sp;
+    }
+    if (sp == NULL) {
+	ReturnScreenError();
+    }
+    if ((sp->_acs_map = typeCalloc(chtype, ACS_LEN)) == NULL) {
+	ReturnScreenError();
+    }
+    if ((sp->_screen_acs_map = typeCalloc(bool, ACS_LEN)) == NULL) {
+	free(sp->_acs_map);
+	ReturnScreenError();
+    }
+
+    T(("created SP %p", (void *) sp));
+    sp->_next_screen = _nc_screen_chain;
+    _nc_screen_chain = sp;
+
+    if ((sp->_current_attr = typeCalloc(NCURSES_CH_T, 1)) == 0) {
+	ReturnScreenError();
+    }
+#else
+    if (!_nc_alloc_screen()
+	|| ((SP->_acs_map = typeCalloc(chtype, ACS_LEN)) == 0)
+	|| ((SP->_screen_acs_map = typeCalloc(bool, ACS_LEN)) == 0)) {
+	returnCode(ERR);
+    }
+
+    T(("created SP %p", (void *) SP));
+
+    sp = SP;			/* fixup so SET_LINES and SET_COLS works */
+    sp->_next_screen = _nc_screen_chain;
+    _nc_screen_chain = sp;
+
+    if ((sp->_current_attr = typeCalloc(NCURSES_CH_T, 1)) == 0) {
+	returnCode(ERR);
+    }
+#endif
+
+    /*
+     * We should always check the screensize, just in case.
+     */
+    _nc_set_screen(sp);
+    sp->_term = cur_term;
+#ifdef USE_TERM_DRIVER
+    TCBOf(sp)->csp = sp;
+    _nc_get_screensize(sp, sp->_term, &slines, &scolumns);
+#else
+    _nc_get_screensize(sp, &slines, &scolumns);
+#endif
+    SET_LINES(slines);
+    SET_COLS(scolumns);
+
+    T((T_CREATE("screen %s %dx%d"),
+       NCURSES_SP_NAME(termname) (NCURSES_SP_ARG), slines, scolumns));
+
+    sp->_filtered = filtered;
+
+    /* implement filter mode */
+    if (filtered) {
+	slines = 1;
+	SET_LINES(slines);
+#ifdef USE_TERM_DRIVER
+	CallDriver(sp, td_setfilter);
+#else
+	/* *INDENT-EQLS* */
+	clear_screen     = ABSENT_STRING;
+	cursor_address   = ABSENT_STRING;
+	cursor_down      = ABSENT_STRING;
+	cursor_up        = ABSENT_STRING;
+	parm_down_cursor = ABSENT_STRING;
+	parm_up_cursor   = ABSENT_STRING;
+	row_address      = ABSENT_STRING;
+	cursor_home      = carriage_return;
+
+	if (back_color_erase)
+	    clr_eos = ABSENT_STRING;
+
+#endif
+	T(("filter screensize %dx%d", slines, scolumns));
+    }
+#ifdef __DJGPP__
+    T(("setting output mode to binary"));
+    fflush(output);
+    setmode(output, O_BINARY);
+#endif
+#if defined(EXP_WIN32_DRIVER)
+    T(("setting output mode to binary"));
+    fflush(output);
+    _setmode(fileno(output), _O_BINARY);
+#endif
+    sp->_lines = (NCURSES_SIZE_T) slines;
+    sp->_lines_avail = (NCURSES_SIZE_T) slines;
+    sp->_columns = (NCURSES_SIZE_T) scolumns;
+
+    fflush(output);
+    sp->_ofd = output ? fileno(output) : -1;
+    sp->_ofp = output;
+#if defined(EXP_WIN32_DRIVER)
+    if (output)
+	_setmode(fileno(output), _O_BINARY);
+#endif
+    sp->out_limit = (size_t) ((2 + slines) * (6 + scolumns));
+    if ((sp->out_buffer = malloc(sp->out_limit)) == 0)
+	sp->out_limit = 0;
+    sp->out_inuse = 0;
+
+    SP_PRE_INIT(sp);
+    SetNoPadding(sp);
+
+#if NCURSES_EXT_FUNCS
+    sp->_default_color = FALSE;
+    sp->_has_sgr_39_49 = FALSE;
+
+    /*
+     * Set our assumption of the terminal's default foreground and background
+     * colors.  The curs_color man-page states that we can assume that the
+     * background is black.  The origin of this assumption appears to be
+     * terminals that displayed colored text, but no colored backgrounds, e.g.,
+     * the first colored terminals around 1980.  More recent ones with better
+     * technology can display not only colored backgrounds, but all
+     * combinations.  So a terminal might be something other than "white" on
+     * black (green/black looks monochrome too), but black on white or even
+     * on ivory.
+     *
+     * White-on-black is the simplest thing to use for monochrome.  Almost
+     * all applications that use color paint both text and background, so
+     * the distinction is moot.  But a few do not - which is why we leave this
+     * configurable (a better solution is to use assume_default_colors() for
+     * the rare applications that do require that sort of appearance, since
+     * is appears that more users expect to be able to make a white-on-black
+     * or black-on-white display under control of the application than not).
+     */
+#ifdef USE_ASSUMED_COLOR
+    sp->_default_fg = COLOR_WHITE;
+    sp->_default_bg = COLOR_BLACK;
+#else
+    sp->_default_fg = COLOR_DEFAULT;
+    sp->_default_bg = COLOR_DEFAULT;
+#endif
+
+    /*
+     * Allow those assumed/default color assumptions to be overridden at
+     * runtime:
+     */
+    if ((env = getenv("NCURSES_ASSUMED_COLORS")) != 0) {
+	int fg, bg;
+	char sep1, sep2;
+	int count = sscanf(env, "%d%c%d%c", &fg, &sep1, &bg, &sep2);
+	if (count >= 1) {
+	    sp->_default_fg = ((fg >= 0 && fg < MaxColors) ? fg : COLOR_DEFAULT);
+	    if (count >= 3) {
+		sp->_default_bg = ((bg >= 0 && bg < MaxColors) ? bg : COLOR_DEFAULT);
+	    }
+	    TR(TRACE_CHARPUT | TRACE_MOVE,
+	       ("from environment assumed fg=%d, bg=%d",
+		sp->_default_fg,
+		sp->_default_bg));
+	}
+    }
+#if USE_COLORFGBG
+    /*
+     * If rxvt's $COLORFGBG variable is set, use it to specify the assumed
+     * default colors.  Note that rxvt (mis)uses bold colors, equating a bold
+     * color to that value plus 8.  We'll only use the non-bold color for now -
+     * decide later if it is worth having default attributes as well.
+     */
+    if (getenv("COLORFGBG") != 0) {
+	const char *p = getenv("COLORFGBG");
+	TR(TRACE_CHARPUT | TRACE_MOVE, ("decoding COLORFGBG %s", p));
+	p = extract_fgbg(p, &(sp->_default_fg));
+	p = extract_fgbg(p, &(sp->_default_bg));
+	if (*p)			/* assume rxvt was compiled with xpm support */
+	    extract_fgbg(p, &(sp->_default_bg));
+	TR(TRACE_CHARPUT | TRACE_MOVE, ("decoded fg=%d, bg=%d",
+					sp->_default_fg, sp->_default_bg));
+	if (sp->_default_fg >= MaxColors) {
+	    if (set_a_foreground != ABSENT_STRING
+		&& !strcmp(set_a_foreground, "\033[3%p1%dm")) {
+		set_a_foreground = strdup("\033[3%?%p1%{8}%>%t9%e%p1%d%;m");
+	    } else {
+		sp->_default_fg %= MaxColors;
+	    }
+	}
+	if (sp->_default_bg >= MaxColors) {
+	    if (set_a_background != ABSENT_STRING
+		&& !strcmp(set_a_background, "\033[4%p1%dm")) {
+		set_a_background = strdup("\033[4%?%p1%{8}%>%t9%e%p1%d%;m");
+	    } else {
+		sp->_default_bg %= MaxColors;
+	    }
+	}
+    }
+#endif
+#endif /* NCURSES_EXT_FUNCS */
+
+    sp->_maxclick = DEFAULT_MAXCLICK;
+    sp->_mouse_event = no_mouse_event;
+    sp->_mouse_inline = no_mouse_inline;
+    sp->_mouse_parse = no_mouse_parse;
+    sp->_mouse_resume = no_mouse_resume;
+    sp->_mouse_wrap = no_mouse_wrap;
+    sp->_mouse_fd = -1;
+
+    /*
+     * If we've no magic cookie support, we suppress attributes that xmc would
+     * affect, i.e., the attributes that affect the rendition of a space.
+     */
+    sp->_ok_attributes = NCURSES_SP_NAME(termattrs) (NCURSES_SP_ARG);
+    if (NCURSES_SP_NAME(has_colors) (NCURSES_SP_ARG)) {
+	sp->_ok_attributes |= A_COLOR;
+    }
+#ifdef USE_TERM_DRIVER
+    _nc_cookie_init(sp);
+#else
+#if USE_XMC_SUPPORT
+    /*
+     * If we have no magic-cookie support compiled-in, or if it is suppressed
+     * in the environment, reset the support-flag.
+     */
+    if (magic_cookie_glitch >= 0) {
+	if (getenv("NCURSES_NO_MAGIC_COOKIE") != 0) {
+	    support_cookies = FALSE;
+	}
+    }
+#endif
+
+    if (!support_cookies && magic_cookie_glitch >= 0) {
+	T(("will disable attributes to work w/o magic cookies"));
+    }
+
+    if (magic_cookie_glitch > 0) {	/* tvi, wyse */
+
+	sp->_xmc_triggers = sp->_ok_attributes & XMC_CONFLICT;
+#if 0
+	/*
+	 * We "should" treat colors as an attribute.  The wyse350 (and its
+	 * clones) appear to be the only ones that have both colors and magic
+	 * cookies.
+	 */
+	if (has_colors()) {
+	    sp->_xmc_triggers |= A_COLOR;
+	}
+#endif
+	sp->_xmc_suppress = sp->_xmc_triggers & (chtype) ~(A_BOLD);
+
+	T(("magic cookie attributes %s", _traceattr(sp->_xmc_suppress)));
+	/*
+	 * Supporting line-drawing may be possible.  But make the regular
+	 * video attributes work first.
+	 */
+	acs_chars = ABSENT_STRING;
+	ena_acs = ABSENT_STRING;
+	enter_alt_charset_mode = ABSENT_STRING;
+	exit_alt_charset_mode = ABSENT_STRING;
+#if USE_XMC_SUPPORT
+	/*
+	 * To keep the cookie support simple, suppress all of the optimization
+	 * hooks except for clear_screen and the cursor addressing.
+	 */
+	if (support_cookies) {
+	    clr_eol = ABSENT_STRING;
+	    clr_eos = ABSENT_STRING;
+	    set_attributes = ABSENT_STRING;
+	}
+#endif
+    } else if (magic_cookie_glitch == 0) {	/* hpterm */
+    }
+
+    /*
+     * If magic cookies are not supported, cancel the strings that set
+     * video attributes.
+     */
+    if (!support_cookies && magic_cookie_glitch >= 0) {
+	magic_cookie_glitch = ABSENT_NUMERIC;
+	set_attributes = ABSENT_STRING;
+	enter_blink_mode = ABSENT_STRING;
+	enter_bold_mode = ABSENT_STRING;
+	enter_dim_mode = ABSENT_STRING;
+	enter_reverse_mode = ABSENT_STRING;
+	enter_standout_mode = ABSENT_STRING;
+	enter_underline_mode = ABSENT_STRING;
+    }
+
+    /* initialize normal acs before wide, since we use mapping in the latter */
+#if !USE_WIDEC_SUPPORT
+    if (_nc_unicode_locale() && _nc_locale_breaks_acs(sp->_term)) {
+	acs_chars = NULL;
+	ena_acs = NULL;
+	enter_alt_charset_mode = NULL;
+	exit_alt_charset_mode = NULL;
+	set_attributes = NULL;
+    }
+#endif
+#endif
+
+    NCURSES_SP_NAME(_nc_init_acs) (NCURSES_SP_ARG);
+#if USE_WIDEC_SUPPORT
+    sp->_screen_unicode = _nc_unicode_locale();
+    if (_nc_wacs == 0) {
+	_nc_init_wacs();
+    }
+    if (_nc_wacs == 0) {
+	ReturnScreenError();
+    }
+
+    sp->_screen_acs_fix = (sp->_screen_unicode
+			   && _nc_locale_breaks_acs(sp->_term));
+#endif
+    env = _nc_get_locale();
+    sp->_legacy_coding = ((env == 0)
+			  || !strcmp(env, "C")
+			  || !strcmp(env, "POSIX"));
+    T(("legacy-coding %d", sp->_legacy_coding));
+
+    sp->_nc_sp_idcok = TRUE;
+    sp->_nc_sp_idlok = FALSE;
+
+    sp->oldhash = 0;
+    sp->newhash = 0;
+
+    T(("creating newscr"));
+    NewScreen(sp) = NCURSES_SP_NAME(newwin) (NCURSES_SP_ARGx slines, scolumns,
+					     0, 0);
+    if (NewScreen(sp) == 0) {
+	ReturnScreenError();
+    }
+    T(("creating curscr"));
+    CurScreen(sp) = NCURSES_SP_NAME(newwin) (NCURSES_SP_ARGx slines, scolumns,
+					     0, 0);
+    if (CurScreen(sp) == 0) {
+	ReturnScreenError();
+    }
+#if !USE_REENTRANT
+    newscr = NewScreen(sp);
+    curscr = CurScreen(sp);
+#endif
+#if USE_SIZECHANGE
+    sp->_resize = NCURSES_SP_NAME(resizeterm);
+    sp->_ungetch = safe_ungetch;
+#endif
+
+    NewScreen(sp)->_clear = TRUE;
+    CurScreen(sp)->_clear = FALSE;
+
+    /*
+     * Get the current tty-modes. setupterm() may already have done this,
+     * unless we use the term-driver.
+     */
+#ifndef USE_TERM_DRIVER
+    if (cur_term != 0 &&
+	!memcmp(&cur_term->Ottyb, &null_TTY, sizeof(TTY)))
+#endif
+    {
+	NCURSES_SP_NAME(def_shell_mode) (NCURSES_SP_ARG);
+	NCURSES_SP_NAME(def_prog_mode) (NCURSES_SP_ARG);
+    }
+
+    if (safe_ripoff_sp && safe_ripoff_sp != safe_ripoff_stack) {
+	ripoff_t *rop;
+
+	for (rop = safe_ripoff_stack;
+	     rop != safe_ripoff_sp && (rop - safe_ripoff_stack) < N_RIPS;
+	     rop++) {
+
+	    /* If we must simulate soft labels, grab off the line to be used.
+	       We assume that we must simulate, if it is none of the standard
+	       formats (4-4 or 3-2-3) for which there may be some hardware
+	       support. */
+	    if (rop->hook == _nc_slk_initialize) {
+		if (!TerminalOf(sp)) {
+		    continue;
+		}
+		if (!(NumLabels <= 0 || !SLK_STDFMT(slk_format))) {
+		    continue;
+		}
+	    }
+	    if (rop->hook) {
+		int count;
+		WINDOW *w;
+
+		count = (rop->line < 0) ? -rop->line : rop->line;
+		T(("ripping off %i lines at %s", count,
+		   ((rop->line < 0)
+		    ? "bottom"
+		    : "top")));
+
+		w = NCURSES_SP_NAME(newwin) (NCURSES_SP_ARGx
+					     count, scolumns,
+					     ((rop->line < 0)
+					      ? sp->_lines_avail - count
+					      : 0),
+					     0);
+		if (w) {
+		    rop->win = w;
+		    rop->hook(w, scolumns);
+		} else {
+		    ReturnScreenError();
+		}
+		if (rop->line < 0) {
+		    bottom_stolen += count;
+		} else {
+		    sp->_topstolen = (NCURSES_SIZE_T) (sp->_topstolen + count);
+		}
+		sp->_lines_avail = (NCURSES_SIZE_T) (sp->_lines_avail - count);
+	    }
+	}
+	/* reset the stack */
+	safe_ripoff_sp = safe_ripoff_stack;
+    }
+
+    T(("creating stdscr"));
+    (void) bottom_stolen;
+    assert((sp->_lines_avail + sp->_topstolen + bottom_stolen) == slines);
+    if ((StdScreen(sp) = NCURSES_SP_NAME(newwin) (NCURSES_SP_ARGx
+						  sp->_lines_avail,
+						  scolumns, 0, 0)) == 0) {
+	ReturnScreenError();
+    }
+    SET_LINES(sp->_lines_avail);
+#if !USE_REENTRANT
+    stdscr = StdScreen(sp);
+#endif
+    sp->_prescreen = FALSE;
+    returnCode(OK);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+_nc_setupscreen(int slines GCC_UNUSED,
+		int scolumns GCC_UNUSED,
+		FILE *output,
+		int filtered,
+		int slk_format)
+{
+    SCREEN *sp = 0;
+    int rc = NCURSES_SP_NAME(_nc_setupscreen) (&sp,
+					       slines,
+					       scolumns,
+					       output,
+					       filtered,
+					       slk_format);
+    if (rc != OK)
+	_nc_set_screen(0);
+    return rc;
+}
+#endif
+
+/*
+ * The internal implementation interprets line as the number of lines to rip
+ * off from the top or bottom.
+ */
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(_nc_ripoffline) (NCURSES_SP_DCLx
+				 int line,
+				 int (*init) (WINDOW *, int))
+{
+    int code = ERR;
+    TR_FUNC_BFR(1);
+
+    START_TRACE();
+    T((T_CALLED("ripoffline(%p,%d,%s)"),
+       (void *) SP_PARM, line,
+       TR_FUNC_ARG(0, init)));
+
+#if NCURSES_SP_FUNCS
+    if (SP_PARM != 0 && SP_PARM->_prescreen)
+#endif
+    {
+	if (line == 0) {
+	    code = OK;
+	} else {
+	    if (safe_ripoff_sp == 0) {
+		safe_ripoff_sp = safe_ripoff_stack;
+	    }
+	    if (safe_ripoff_sp < safe_ripoff_stack + N_RIPS) {
+		safe_ripoff_sp->line = line;
+		safe_ripoff_sp->hook = init;
+		(safe_ripoff_sp)++;
+		T(("ripped-off %d:%d chunks",
+		   (int) (safe_ripoff_sp - safe_ripoff_stack), N_RIPS));
+		code = OK;
+	    }
+	}
+    }
+
+    returnCode(code);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+_nc_ripoffline(int line, int (*init) (WINDOW *, int))
+{
+    int rc;
+
+    _nc_init_pthreads();
+    _nc_lock_global(prescreen);
+    START_TRACE();
+    rc = NCURSES_SP_NAME(_nc_ripoffline) (CURRENT_SCREEN_PRE, line, init);
+    _nc_unlock_global(prescreen);
+
+    return rc;
+}
+#endif
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(ripoffline) (NCURSES_SP_DCLx
+			     int line,
+			     int (*init) (WINDOW *, int))
+{
+    START_TRACE();
+    return NCURSES_SP_NAME(_nc_ripoffline) (NCURSES_SP_ARGx
+					    (line < 0) ? -1 : 1,
+					    init);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+ripoffline(int line, int (*init) (WINDOW *, int))
+{
+    int rc;
+
+    _nc_init_pthreads();
+    _nc_lock_global(prescreen);
+    START_TRACE();
+    rc = NCURSES_SP_NAME(ripoffline) (CURRENT_SCREEN_PRE, line, init);
+    _nc_unlock_global(prescreen);
+
+    return rc;
+}
+#endif
diff --git a/ncurses/base/lib_slk.c b/ncurses/base/lib_slk.c
new file mode 100644
index 0000000..47e57e0
--- /dev/null
+++ b/ncurses/base/lib_slk.c
@@ -0,0 +1,254 @@
+/****************************************************************************
+ * Copyright 2020,2022 Thomas E. Dickey                                     *
+ * Copyright 1998-2010,2011 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Authors:                                                                *
+ *          Gerhard Fuernkranz                      1993 (original)         *
+ *          Zeyd M. Ben-Halim                       1992,1995 (sic)         *
+ *          Eric S. Raymond                                                 *
+ *          Juergen Pfeifer                         1996-on                 *
+ *          Thomas E. Dickey                                                *
+ ****************************************************************************/
+
+/*
+ *	lib_slk.c
+ *	Soft key routines.
+ */
+
+#include <curses.priv.h>
+#include <ctype.h>
+
+#ifndef CUR
+#define CUR SP_TERMTYPE
+#endif
+
+MODULE_ID("$Id: lib_slk.c,v 1.50 2022/08/20 18:29:22 tom Exp $")
+
+#ifdef USE_TERM_DRIVER
+#define NumLabels    InfoOf(SP_PARM).numlabels
+#define NoColorVideo InfoOf(SP_PARM).nocolorvideo
+#define LabelWidth   InfoOf(SP_PARM).labelwidth
+#define LabelHeight  InfoOf(SP_PARM).labelheight
+#else
+#define NumLabels    num_labels
+#define NoColorVideo no_color_video
+#define LabelWidth   label_width
+#define LabelHeight  label_height
+#endif
+
+/*
+ * Free any memory related to soft labels, return an error.
+ */
+static int
+slk_failed(NCURSES_SP_DCL0)
+{
+    if ((0 != SP_PARM) && SP_PARM->_slk) {
+	FreeIfNeeded(SP_PARM->_slk->ent);
+	free(SP_PARM->_slk);
+	SP_PARM->_slk = (SLK *) 0;
+    }
+    return ERR;
+}
+
+NCURSES_EXPORT(int)
+_nc_format_slks(NCURSES_SP_DCLx int cols)
+{
+    int gap, i, x;
+    int max_length;
+
+    if (!SP_PARM || !SP_PARM->_slk)
+	return ERR;
+
+    max_length = SP_PARM->_slk->maxlen;
+    if (SP_PARM->slk_format >= 3) {	/* PC style */
+	gap = (cols - 3 * (3 + 4 * max_length)) / 2;
+
+	if (gap < 1)
+	    gap = 1;
+
+	for (i = x = 0; i < SP_PARM->_slk->maxlab; i++) {
+	    SP_PARM->_slk->ent[i].ent_x = x;
+	    x += max_length;
+	    x += (i == 3 || i == 7) ? gap : 1;
+	}
+    } else {
+	if (SP_PARM->slk_format == 2) {		/* 4-4 */
+	    gap = cols - (int) (SP_PARM->_slk->maxlab * max_length) - 6;
+
+	    if (gap < 1)
+		gap = 1;
+	    for (i = x = 0; i < SP_PARM->_slk->maxlab; i++) {
+		SP_PARM->_slk->ent[i].ent_x = x;
+		x += max_length;
+		x += (i == 3) ? gap : 1;
+	    }
+	} else {
+	    if (SP_PARM->slk_format == 1) {	/* 1 -> 3-2-3 */
+		gap = (cols - (SP_PARM->_slk->maxlab * max_length) - 5)
+		    / 2;
+
+		if (gap < 1)
+		    gap = 1;
+		for (i = x = 0; i < SP_PARM->_slk->maxlab; i++) {
+		    SP_PARM->_slk->ent[i].ent_x = x;
+		    x += max_length;
+		    x += (i == 2 || i == 4) ? gap : 1;
+		}
+	    } else {
+		return slk_failed(NCURSES_SP_ARG);
+	    }
+	}
+    }
+    SP_PARM->_slk->dirty = TRUE;
+
+    return OK;
+}
+
+/*
+ * Initialize soft labels.
+ * Called from newterm()
+ */
+NCURSES_EXPORT(int)
+_nc_slk_initialize(WINDOW *stwin, int cols)
+{
+    int i;
+    int res = OK;
+    size_t max_length;
+    SCREEN *sp;
+    int numlab;
+
+    T((T_CALLED("_nc_slk_initialize()")));
+
+    assert(stwin);
+
+    sp = _nc_screen_of(stwin);
+    if (0 == sp)
+	returnCode(ERR);
+
+    assert(TerminalOf(SP_PARM));
+
+    numlab = NumLabels;
+
+    if (SP_PARM->_slk) {	/* we did this already, so simply return */
+	returnCode(OK);
+    } else if ((SP_PARM->_slk = typeCalloc(SLK, 1)) == 0)
+	returnCode(ERR);
+
+    if (!SP_PARM->slk_format)
+	SP_PARM->slk_format = _nc_globals.slk_format;
+
+    /*
+     * If we use colors, vidputs() will suppress video attributes that conflict
+     * with colors.  In that case, we're still guaranteed that "reverse" would
+     * work.
+     */
+    if ((NoColorVideo & 1) == 0)
+	SetAttr(SP_PARM->_slk->attr, A_STANDOUT);
+    else
+	SetAttr(SP_PARM->_slk->attr, A_REVERSE);
+
+    SP_PARM->_slk->maxlab = (short) ((numlab > 0)
+				     ? numlab
+				     : MAX_SKEY(SP_PARM->slk_format));
+    SP_PARM->_slk->maxlen = (short) ((numlab > 0)
+				     ? LabelWidth * LabelHeight
+				     : MAX_SKEY_LEN(SP_PARM->slk_format));
+    SP_PARM->_slk->labcnt = (short) ((SP_PARM->_slk->maxlab < MAX_SKEY(SP_PARM->slk_format))
+				     ? MAX_SKEY(SP_PARM->slk_format)
+				     : SP_PARM->_slk->maxlab);
+
+    if (SP_PARM->_slk->maxlen <= 0
+	|| SP_PARM->_slk->labcnt <= 0
+	|| (SP_PARM->_slk->ent = typeCalloc(slk_ent,
+					    (size_t) SP_PARM->_slk->labcnt))
+	== NULL) {
+	free(SP_PARM->_slk->ent);
+	returnCode(slk_failed(NCURSES_SP_ARG));
+    }
+
+    max_length = (size_t) SP_PARM->_slk->maxlen;
+    for (i = 0; i < SP_PARM->_slk->labcnt; i++) {
+	size_t used = max_length + 1;
+
+	SP_PARM->_slk->ent[i].ent_text = (char *) _nc_doalloc(0, used);
+	if (SP_PARM->_slk->ent[i].ent_text == 0)
+	    returnCode(slk_failed(NCURSES_SP_ARG));
+	memset(SP_PARM->_slk->ent[i].ent_text, 0, used);
+
+	SP_PARM->_slk->ent[i].form_text = (char *) _nc_doalloc(0, used);
+	if (SP_PARM->_slk->ent[i].form_text == 0)
+	    returnCode(slk_failed(NCURSES_SP_ARG));
+
+	if (used > 1) {
+	    memset(SP_PARM->_slk->ent[i].form_text, ' ', used - 1);
+	}
+	SP_PARM->_slk->ent[i].form_text[used - 1] = '\0';
+
+	SP_PARM->_slk->ent[i].visible = (char) (i < SP_PARM->_slk->maxlab);
+    }
+
+    res = _nc_format_slks(NCURSES_SP_ARGx cols);
+
+    if ((SP_PARM->_slk->win = stwin) == NULL) {
+	returnCode(slk_failed(NCURSES_SP_ARG));
+    }
+
+    /* We now reset the format so that the next newterm has again
+     * per default no SLK keys and may call slk_init again to
+     * define a new layout. (juergen 03-Mar-1999)
+     */
+    _nc_globals.slk_format = 0;
+    returnCode(res);
+}
+
+/*
+ * Restore the soft labels on the screen.
+ */
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(slk_restore) (NCURSES_SP_DCL0)
+{
+    T((T_CALLED("slk_restore(%p)"), (void *) SP_PARM));
+
+    if (0 == SP_PARM)
+	returnCode(ERR);
+    if (SP_PARM->_slk == NULL)
+	returnCode(ERR);
+    SP_PARM->_slk->hidden = FALSE;
+    SP_PARM->_slk->dirty = TRUE;
+
+    returnCode(NCURSES_SP_NAME(slk_refresh) (NCURSES_SP_ARG));
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+slk_restore(void)
+{
+    return NCURSES_SP_NAME(slk_restore) (CURRENT_SCREEN);
+}
+#endif
diff --git a/ncurses/base/lib_slkatr_set.c b/ncurses/base/lib_slkatr_set.c
new file mode 100644
index 0000000..7c5a23a
--- /dev/null
+++ b/ncurses/base/lib_slkatr_set.c
@@ -0,0 +1,81 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2014,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author:  Juergen Pfeifer, 1998                                          *
+ *     and:  Thomas E. Dickey 2005-on                                       *
+ ****************************************************************************/
+
+/*
+ *	lib_slkatr_set.c
+ *	Soft key routines.
+ *	Set the label's attributes
+ */
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_slkatr_set.c,v 1.17 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(slk_attr_set) (NCURSES_SP_DCLx
+			       const attr_t attr,
+			       NCURSES_PAIRS_T pair_arg,
+			       void *opts)
+{
+    int code = ERR;
+    int color_pair = pair_arg;
+
+    T((T_CALLED("slk_attr_set(%p,%s,%d)"),
+       (void *) SP_PARM,
+       _traceattr(attr),
+       color_pair));
+
+    set_extended_pair(opts, color_pair);
+    if (SP_PARM != 0
+	&& SP_PARM->_slk != 0
+	&& color_pair >= 0
+	&& color_pair < SP_PARM->_pair_limit) {
+	TR(TRACE_ATTRS, ("... current %s", _tracech_t(CHREF(SP_PARM->_slk->attr))));
+	SetAttr(SP_PARM->_slk->attr, attr);
+	if (color_pair > 0) {
+	    SetPair(SP_PARM->_slk->attr, color_pair);
+	}
+	TR(TRACE_ATTRS, ("new attribute is %s", _tracech_t(CHREF(SP_PARM->_slk->attr))));
+	code = OK;
+    }
+    returnCode(code);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+slk_attr_set(const attr_t attr, NCURSES_COLOR_T pair_arg, void *opts)
+{
+    return NCURSES_SP_NAME(slk_attr_set) (CURRENT_SCREEN, attr,
+					  pair_arg, opts);
+}
+#endif
diff --git a/ncurses/base/lib_slkatrof.c b/ncurses/base/lib_slkatrof.c
new file mode 100644
index 0000000..2d53ab2
--- /dev/null
+++ b/ncurses/base/lib_slkatrof.c
@@ -0,0 +1,67 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2005,2009 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author:  Juergen Pfeifer, 1997                                          *
+ *     and:  Thomas E. Dickey 2005                                          *
+ ****************************************************************************/
+
+/*
+ *	lib_slkatrof.c
+ *	Soft key routines.
+ *      Switch off labels attributes
+ */
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_slkatrof.c,v 1.12 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(slk_attroff) (NCURSES_SP_DCLx const chtype attr)
+{
+    T((T_CALLED("slk_attroff(%p,%s)"), (void *) SP_PARM, _traceattr(attr)));
+
+    if (SP_PARM != 0 && SP_PARM->_slk != 0) {
+	TR(TRACE_ATTRS, ("... current %s", _tracech_t(CHREF(SP_PARM->_slk->attr))));
+	RemAttr(SP_PARM->_slk->attr, attr);
+	if ((attr & A_COLOR) != 0) {
+	    SetPair(SP_PARM->_slk->attr, 0);
+	}
+	TR(TRACE_ATTRS, ("new attribute is %s", _tracech_t(CHREF(SP_PARM->_slk->attr))));
+	returnCode(OK);
+    } else
+	returnCode(ERR);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+slk_attroff(const chtype attr)
+{
+    return NCURSES_SP_NAME(slk_attroff) (CURRENT_SCREEN, attr);
+}
+#endif
diff --git a/ncurses/base/lib_slkatron.c b/ncurses/base/lib_slkatron.c
new file mode 100644
index 0000000..accc2f2
--- /dev/null
+++ b/ncurses/base/lib_slkatron.c
@@ -0,0 +1,67 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2009,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author:  Juergen Pfeifer, 1997                                          *
+ *     and:  Thomas E. Dickey 2005                                          *
+ ****************************************************************************/
+
+/*
+ *	lib_slkatron.c
+ *	Soft key routines.
+ *      Switch on labels attributes
+ */
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_slkatron.c,v 1.13 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(slk_attron) (NCURSES_SP_DCLx const chtype attr)
+{
+    T((T_CALLED("slk_attron(%p,%s)"), (void *) SP_PARM, _traceattr(attr)));
+
+    if (SP_PARM != 0 && SP_PARM->_slk != 0) {
+	TR(TRACE_ATTRS, ("... current %s", _tracech_t(CHREF(SP_PARM->_slk->attr))));
+	AddAttr(SP_PARM->_slk->attr, attr);
+	if ((attr & A_COLOR) != 0) {
+	    SetPair(SP_PARM->_slk->attr, PairNumber(attr));
+	}
+	TR(TRACE_ATTRS, ("new attribute is %s", _tracech_t(CHREF(SP_PARM->_slk->attr))));
+	returnCode(OK);
+    } else
+	returnCode(ERR);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+slk_attron(const chtype attr)
+{
+    return NCURSES_SP_NAME(slk_attron) (CURRENT_SCREEN, attr);
+}
+#endif
diff --git a/ncurses/base/lib_slkatrset.c b/ncurses/base/lib_slkatrset.c
new file mode 100644
index 0000000..11fa7e6
--- /dev/null
+++ b/ncurses/base/lib_slkatrset.c
@@ -0,0 +1,62 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2005,2009 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author:  Juergen Pfeifer, 1997                                          *
+ *     and:  Thomas E. Dickey 2005                                          *
+ ****************************************************************************/
+
+/*
+ *	lib_slkatrset.c
+ *	Soft key routines.
+ *      Set the labels attributes
+ */
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_slkatrset.c,v 1.11 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(slk_attrset) (NCURSES_SP_DCLx const chtype attr)
+{
+    T((T_CALLED("slk_attrset(%p,%s)"), (void *) SP_PARM, _traceattr(attr)));
+
+    if (SP_PARM != 0 && SP_PARM->_slk != 0) {
+	SetAttr(SP_PARM->_slk->attr, attr);
+	returnCode(OK);
+    } else
+	returnCode(ERR);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+slk_attrset(const chtype attr)
+{
+    return NCURSES_SP_NAME(slk_attrset) (CURRENT_SCREEN, attr);
+}
+#endif
diff --git a/ncurses/base/lib_slkattr.c b/ncurses/base/lib_slkattr.c
new file mode 100644
index 0000000..af49f3b
--- /dev/null
+++ b/ncurses/base/lib_slkattr.c
@@ -0,0 +1,65 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2009,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author:  Juergen Pfeifer, 1997                                          *
+ *     and:  Thomas E. Dickey 2005                                          *
+ ****************************************************************************/
+
+/*
+ *	lib_slkattr.c
+ *	Soft key routines.
+ *      Fetch the labels attributes
+ */
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_slkattr.c,v 1.12 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(attr_t)
+NCURSES_SP_NAME(slk_attr) (NCURSES_SP_DCL0)
+{
+    T((T_CALLED("slk_attr(%p)"), (void *) SP_PARM));
+
+    if (SP_PARM != 0 && SP_PARM->_slk != 0) {
+	attr_t result = AttrOf(SP_PARM->_slk->attr) & ALL_BUT_COLOR;
+	int pair = GetPair(SP_PARM->_slk->attr);
+
+	result |= (attr_t) ColorPair(pair);
+	returnAttr(result);
+    } else
+	returnAttr(0);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(attr_t)
+slk_attr(void)
+{
+    return NCURSES_SP_NAME(slk_attr) (CURRENT_SCREEN);
+}
+#endif
diff --git a/ncurses/base/lib_slkclear.c b/ncurses/base/lib_slkclear.c
new file mode 100644
index 0000000..10531e4
--- /dev/null
+++ b/ncurses/base/lib_slkclear.c
@@ -0,0 +1,75 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2007,2009 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Juergen Pfeifer                         1996-1999               *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ ****************************************************************************/
+
+/*
+ *	lib_slkclear.c
+ *	Soft key routines.
+ *      Remove soft labels from the screen.
+ */
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_slkclear.c,v 1.15 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(slk_clear) (NCURSES_SP_DCL0)
+{
+    int rc = ERR;
+
+    T((T_CALLED("slk_clear(%p)"), (void *) SP_PARM));
+
+    if (SP_PARM != 0 && SP_PARM->_slk != 0) {
+	SP_PARM->_slk->hidden = TRUE;
+	/* For simulated SLK's it looks much more natural to
+	   inherit those attributes from the standard screen */
+	SP_PARM->_slk->win->_nc_bkgd = StdScreen(SP_PARM)->_nc_bkgd;
+	WINDOW_ATTRS(SP_PARM->_slk->win) = WINDOW_ATTRS(StdScreen(SP_PARM));
+	if (SP_PARM->_slk->win == StdScreen(SP_PARM)) {
+	    rc = OK;
+	} else {
+	    werase(SP_PARM->_slk->win);
+	    rc = wrefresh(SP_PARM->_slk->win);
+	}
+    }
+    returnCode(rc);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+slk_clear(void)
+{
+    return NCURSES_SP_NAME(slk_clear) (CURRENT_SCREEN);
+}
+#endif
diff --git a/ncurses/base/lib_slkcolor.c b/ncurses/base/lib_slkcolor.c
new file mode 100644
index 0000000..00d1eaa
--- /dev/null
+++ b/ncurses/base/lib_slkcolor.c
@@ -0,0 +1,91 @@
+/****************************************************************************
+ * Copyright 2018,2020 Thomas E. Dickey                                     *
+ * Copyright 1998-2014,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author:  Juergen Pfeifer, 1998,2009                                     *
+ *     and:  Thomas E. Dickey 2005-on                                       *
+ ****************************************************************************/
+
+/*
+ *	lib_slkcolor.c
+ *	Soft key routines.
+ *	Set the label's color
+ */
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_slkcolor.c,v 1.20 2020/02/02 23:34:34 tom Exp $")
+
+static int
+_nc_slk_color(SCREEN *sp, int pair_arg)
+{
+    int code = ERR;
+
+    T((T_CALLED("slk_color(%p,%d)"), (void *) sp, pair_arg));
+
+    if (sp != 0
+	&& sp->_slk != 0
+	&& pair_arg >= 0
+	&& pair_arg < sp->_pair_limit) {
+	TR(TRACE_ATTRS, ("... current is %s", _tracech_t(CHREF(sp->_slk->attr))));
+	SetPair(sp->_slk->attr, pair_arg);
+	TR(TRACE_ATTRS, ("new attribute is %s", _tracech_t(CHREF(sp->_slk->attr))));
+	code = OK;
+    }
+    returnCode(code);
+}
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(slk_color) (NCURSES_SP_DCLx NCURSES_PAIRS_T pair_arg)
+{
+    return _nc_slk_color(SP_PARM, pair_arg);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+slk_color(NCURSES_PAIRS_T pair_arg)
+{
+    return NCURSES_SP_NAME(slk_color) (CURRENT_SCREEN, pair_arg);
+}
+#endif
+
+#if NCURSES_EXT_COLORS
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(extended_slk_color) (NCURSES_SP_DCLx int pair_arg)
+{
+    return _nc_slk_color(SP_PARM, pair_arg);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+extended_slk_color(int pair_arg)
+{
+    return NCURSES_SP_NAME(extended_slk_color) (CURRENT_SCREEN, pair_arg);
+}
+#endif
+#endif
diff --git a/ncurses/base/lib_slkinit.c b/ncurses/base/lib_slkinit.c
new file mode 100644
index 0000000..318077f
--- /dev/null
+++ b/ncurses/base/lib_slkinit.c
@@ -0,0 +1,89 @@
+/****************************************************************************
+ * Copyright 2020,2022 Thomas E. Dickey                                     *
+ * Copyright 1998-2009,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ *     and: Juergen Pfeifer                         2009                    *
+ ****************************************************************************/
+
+/*
+ *	lib_slkinit.c
+ *	Soft key routines.
+ *      Initialize soft labels.  Called by the user before initscr().
+ */
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_slkinit.c,v 1.16 2022/07/09 18:58:58 tom Exp $")
+
+#ifdef USE_SP_RIPOFF
+#define SoftkeyFormat SP_PARM->slk_format
+#else
+#define SoftkeyFormat _nc_globals.slk_format
+#endif
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(slk_init) (NCURSES_SP_DCLx int format)
+{
+    int code = ERR;
+
+    START_TRACE();
+    T((T_CALLED("slk_init(%p,%d)"), (void *) SP_PARM, format));
+
+    if (format >= 0
+	&& format <= 3
+#ifdef USE_SP_RIPOFF
+	&& SP_PARM
+	&& SP_PARM->_prescreen
+#endif
+	&& !SoftkeyFormat) {
+	SoftkeyFormat = 1 + format;
+	code = NCURSES_SP_NAME(_nc_ripoffline) (NCURSES_SP_ARGx
+						-SLK_LINES(SoftkeyFormat),
+						_nc_slk_initialize);
+    }
+    returnCode(code);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+slk_init(int format)
+{
+    int rc;
+
+    _nc_init_pthreads();
+    _nc_lock_global(prescreen);
+    START_TRACE();
+    rc = NCURSES_SP_NAME(slk_init) (CURRENT_SCREEN_PRE, format);
+    _nc_unlock_global(prescreen);
+
+    return rc;
+}
+#endif
diff --git a/ncurses/base/lib_slklab.c b/ncurses/base/lib_slklab.c
new file mode 100644
index 0000000..894ff26
--- /dev/null
+++ b/ncurses/base/lib_slklab.c
@@ -0,0 +1,62 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2003,2009 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and:  Juergen Pfeifer,                       1998,2009               *
+ *     and:  Thomas E. Dickey                       1998-on                 *
+ ****************************************************************************/
+
+/*
+ *	lib_slklab.c
+ *	Soft key routines.
+ *      Fetch the label text.
+ */
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_slklab.c,v 1.11 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(char *)
+NCURSES_SP_NAME(slk_label) (NCURSES_SP_DCLx int n)
+{
+    T((T_CALLED("slk_label(%p,%d)"), (void *) SP_PARM, n));
+
+    if (SP_PARM == 0 || SP_PARM->_slk == 0 || n < 1 || n > SP_PARM->_slk->labcnt)
+	returnPtr(0);
+    returnPtr(SP_PARM->_slk->ent[n - 1].ent_text);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(char *)
+slk_label(int n)
+{
+    return NCURSES_SP_NAME(slk_label) (CURRENT_SCREEN, n);
+}
+#endif
diff --git a/ncurses/base/lib_slkrefr.c b/ncurses/base/lib_slkrefr.c
new file mode 100644
index 0000000..7a40624
--- /dev/null
+++ b/ncurses/base/lib_slkrefr.c
@@ -0,0 +1,188 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2013,2014 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Juergen Pfeifer                         1996-on                 *
+ *     and: Thomas E. Dickey                                                *
+ ****************************************************************************/
+
+/*
+ *	lib_slkrefr.c
+ *	Write SLK window to the (virtual) screen.
+ */
+#include <curses.priv.h>
+
+#ifndef CUR
+#define CUR SP_TERMTYPE
+#endif
+
+MODULE_ID("$Id: lib_slkrefr.c,v 1.32 2021/09/04 10:54:35 tom Exp $")
+
+#ifdef USE_TERM_DRIVER
+#define NumLabels    InfoOf(SP_PARM).numlabels
+#else
+#define NumLabels    num_labels
+#endif
+
+/*
+ * Paint the info line for the PC style SLK emulation.
+ */
+static void
+slk_paint_info(WINDOW *win)
+{
+    SCREEN *sp = _nc_screen_of(win);
+
+    if (win && sp && (sp->slk_format == 4)) {
+	int i;
+
+	(void) mvwhline(win, 0, 0, 0, getmaxx(win));
+	wmove(win, 0, 0);
+
+	for (i = 0; i < sp->_slk->maxlab; i++) {
+	    mvwprintw(win, 0, sp->_slk->ent[i].ent_x, "F%d", i + 1);
+	}
+    }
+}
+
+/*
+ * Write the soft labels to the soft-key window.
+ */
+static void
+slk_intern_refresh(SCREEN *sp)
+{
+    int i;
+    int fmt;
+    SLK *slk;
+    int numlab;
+
+    if (sp == 0)
+	return;
+
+    slk = sp->_slk;
+    fmt = sp->slk_format;
+    numlab = NumLabels;
+
+    if (slk->hidden)
+	return;
+
+    for (i = 0; i < slk->labcnt; i++) {
+	if (slk->dirty || slk->ent[i].dirty) {
+	    if (slk->ent[i].visible) {
+		if (numlab > 0 && SLK_STDFMT(fmt)) {
+#ifdef USE_TERM_DRIVER
+		    CallDriver_2(sp, td_hwlabel, i + 1, slk->ent[i].form_text);
+#else
+		    if (i < num_labels) {
+			NCURSES_PUTP2("plab_norm",
+				      TPARM_2(plab_norm,
+					      i + 1,
+					      slk->ent[i].form_text));
+		    }
+#endif
+		} else {
+		    if (fmt == 4)
+			slk_paint_info(slk->win);
+		    wmove(slk->win, SLK_LINES(fmt) - 1, slk->ent[i].ent_x);
+		    (void) wattrset(slk->win, (int) AttrOf(slk->attr));
+		    waddstr(slk->win, slk->ent[i].form_text);
+		    /* if we simulate SLK's, it is looking much more
+		       natural to use the current ATTRIBUTE also
+		       for the label window */
+		    (void) wattrset(slk->win, (int) WINDOW_ATTRS(StdScreen(sp)));
+		}
+	    }
+	    slk->ent[i].dirty = FALSE;
+	}
+    }
+    slk->dirty = FALSE;
+
+    if (numlab > 0) {
+#ifdef USE_TERM_DRIVER
+	CallDriver_1(sp, td_hwlabelOnOff, slk->hidden ? FALSE : TRUE);
+#else
+	if (slk->hidden) {
+	    NCURSES_PUTP2("label_off", label_off);
+	} else {
+	    NCURSES_PUTP2("label_on", label_on);
+	}
+#endif
+    }
+}
+
+/*
+ * Refresh the soft labels.
+ */
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(slk_noutrefresh) (NCURSES_SP_DCL0)
+{
+    T((T_CALLED("slk_noutrefresh(%p)"), (void *) SP_PARM));
+
+    if (SP_PARM == 0 || SP_PARM->_slk == 0)
+	returnCode(ERR);
+    if (SP_PARM->_slk->hidden)
+	returnCode(OK);
+    slk_intern_refresh(SP_PARM);
+
+    returnCode(wnoutrefresh(SP_PARM->_slk->win));
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+slk_noutrefresh(void)
+{
+    return NCURSES_SP_NAME(slk_noutrefresh) (CURRENT_SCREEN);
+}
+#endif
+
+/*
+ * Refresh the soft labels.
+ */
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(slk_refresh) (NCURSES_SP_DCL0)
+{
+    T((T_CALLED("slk_refresh(%p)"), (void *) SP_PARM));
+
+    if (SP_PARM == 0 || SP_PARM->_slk == 0)
+	returnCode(ERR);
+    if (SP_PARM->_slk->hidden)
+	returnCode(OK);
+    slk_intern_refresh(SP_PARM);
+
+    returnCode(wrefresh(SP_PARM->_slk->win));
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+slk_refresh(void)
+{
+    return NCURSES_SP_NAME(slk_refresh) (CURRENT_SCREEN);
+}
+#endif
diff --git a/ncurses/base/lib_slkset.c b/ncurses/base/lib_slkset.c
new file mode 100644
index 0000000..3e777f1
--- /dev/null
+++ b/ncurses/base/lib_slkset.c
@@ -0,0 +1,157 @@
+/****************************************************************************
+ * Copyright 2019,2020 Thomas E. Dickey                                     *
+ * Copyright 1998-2011,2012 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Juergen Pfeifer                                                 *
+ *     and: Thomas E. Dickey                                                *
+ ****************************************************************************/
+
+/*
+ *	lib_slkset.c
+ *      Set soft label text.
+ */
+#include <curses.priv.h>
+#include <ctype.h>
+
+#if USE_WIDEC_SUPPORT
+#if HAVE_WCTYPE_H
+#include <wctype.h>
+#endif
+#endif
+
+MODULE_ID("$Id: lib_slkset.c,v 1.26 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(slk_set) (NCURSES_SP_DCLx int i, const char *astr, int format)
+{
+    SLK *slk;
+    int offset = 0;
+    int numchrs;
+    int numcols;
+    int limit;
+    const char *str = astr;
+    const char *p;
+
+    T((T_CALLED("slk_set(%p, %d, \"%s\", %d)"), (void *) SP_PARM, i, str, format));
+
+    if (SP_PARM == 0
+	|| (slk = SP_PARM->_slk) == 0
+	|| i < 1
+	|| i > slk->labcnt
+	|| format < 0
+	|| format > 2)
+	returnCode(ERR);
+    if (str == 0)
+	str = "";
+    --i;			/* Adjust numbering of labels */
+
+    limit = MAX_SKEY_LEN(SP_PARM->slk_format);
+    while (isspace(UChar(*str)))
+	str++;			/* skip over leading spaces  */
+    p = str;
+
+#if USE_WIDEC_SUPPORT
+    numcols = 0;
+    while (*p != 0) {
+	mbstate_t state;
+	wchar_t wc;
+	size_t need;
+
+	init_mb(state);
+	need = mbrtowc(0, p, strlen(p), &state);
+	if (need == (size_t) -1)
+	    break;
+	mbrtowc(&wc, p, need, &state);
+	if (!iswprint((wint_t) wc))
+	    break;
+	if (_nc_wacs_width(wc) + numcols > limit)
+	    break;
+	numcols += _nc_wacs_width(wc);
+	p += need;
+    }
+    numchrs = (int) (p - str);
+#else
+    while (isprint(UChar(*p)))
+	p++;			/* The first non-print stops */
+
+    numcols = (int) (p - str);
+    if (numcols > limit)
+	numcols = limit;
+    numchrs = numcols;
+#endif
+
+    FreeIfNeeded(slk->ent[i].ent_text);
+    if ((slk->ent[i].ent_text = strdup(str)) == 0)
+	returnCode(ERR);
+    slk->ent[i].ent_text[numchrs] = '\0';
+
+    if ((slk->ent[i].form_text = (char *) _nc_doalloc(slk->ent[i].form_text,
+						      (size_t) (limit +
+								numchrs + 1))
+	) == 0)
+	returnCode(ERR);
+
+    switch (format) {
+    case 0:			/* left-justified */
+	offset = 0;
+	break;
+    case 1:			/* centered */
+	offset = (limit - numcols) / 2;
+	break;
+    case 2:			/* right-justified */
+	offset = limit - numcols;
+	break;
+    }
+    if (offset <= 0)
+	offset = 0;
+    else
+	memset(slk->ent[i].form_text, ' ', (size_t) offset);
+
+    memcpy(slk->ent[i].form_text + offset,
+	   slk->ent[i].ent_text,
+	   (size_t) numchrs);
+
+    if (offset < limit) {
+	memset(slk->ent[i].form_text + offset + numchrs,
+	       ' ',
+	       (size_t) (limit - (offset + numcols)));
+    }
+
+    slk->ent[i].form_text[numchrs - numcols + limit] = 0;
+    slk->ent[i].dirty = TRUE;
+    returnCode(OK);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+slk_set(int i, const char *astr, int format)
+{
+    return NCURSES_SP_NAME(slk_set) (CURRENT_SCREEN, i, astr, format);
+}
+#endif
diff --git a/ncurses/base/lib_slktouch.c b/ncurses/base/lib_slktouch.c
new file mode 100644
index 0000000..6696a25
--- /dev/null
+++ b/ncurses/base/lib_slktouch.c
@@ -0,0 +1,62 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2000,2009 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Juergen Pfeifer                         1997,2009               *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ ****************************************************************************/
+
+/*
+ *	lib_slktouch.c
+ *	Soft key routines.
+ *      Force the code to believe that the soft keys have been changed.
+ */
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_slktouch.c,v 1.9 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(slk_touch) (NCURSES_SP_DCL0)
+{
+    T((T_CALLED("slk_touch(%p)"), (void *) SP_PARM));
+
+    if (SP_PARM == 0 || SP_PARM->_slk == 0)
+	returnCode(ERR);
+    SP_PARM->_slk->dirty = TRUE;
+
+    returnCode(OK);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+slk_touch(void)
+{
+    return NCURSES_SP_NAME(slk_touch) (CURRENT_SCREEN);
+}
+#endif
diff --git a/ncurses/base/lib_touch.c b/ncurses/base/lib_touch.c
new file mode 100644
index 0000000..d8d59e1
--- /dev/null
+++ b/ncurses/base/lib_touch.c
@@ -0,0 +1,98 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ ****************************************************************************/
+
+/*
+**	lib_touch.c
+**
+**	   The routines	untouchwin(),
+**			wtouchln(),
+**			is_linetouched()
+**			is_wintouched().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_touch.c,v 1.16 2020/02/02 23:34:34 tom Exp $")
+
+#undef is_linetouched
+
+NCURSES_EXPORT(bool)
+is_linetouched(WINDOW *win, int line)
+{
+    T((T_CALLED("is_linetouched(%p,%d)"), (void *) win, line));
+
+    /* XSI doesn't define any error, and gcc ultimately made it impossible */
+    if (!win || (line > win->_maxy) || (line < 0)) {
+	returnCode(FALSE);
+    }
+
+    returnCode(win->_line[line].firstchar != _NOCHANGE ? TRUE : FALSE);
+}
+
+NCURSES_EXPORT(bool)
+is_wintouched(WINDOW *win)
+{
+    T((T_CALLED("is_wintouched(%p)"), (void *) win));
+
+    if (win) {
+	int i;
+
+	for (i = 0; i <= win->_maxy; i++)
+	    if (win->_line[i].firstchar != _NOCHANGE)
+		returnCode(TRUE);
+    }
+    returnCode(FALSE);
+}
+
+NCURSES_EXPORT(int)
+wtouchln(WINDOW *win, int y, int n, int changed)
+{
+    int i;
+
+    T((T_CALLED("wtouchln(%p,%d,%d,%d)"), (void *) win, y, n, changed));
+
+    if (!win || (n < 0) || (y < 0) || (y > win->_maxy))
+	returnCode(ERR);
+
+    for (i = y; i < y + n; i++) {
+	if (i > win->_maxy)
+	    break;
+	win->_line[i].firstchar = (NCURSES_SIZE_T) (changed ? 0 : _NOCHANGE);
+	win->_line[i].lastchar = (NCURSES_SIZE_T) (changed
+						   ? win->_maxx
+						   : _NOCHANGE);
+    }
+    returnCode(OK);
+}
diff --git a/ncurses/base/lib_ungetch.c b/ncurses/base/lib_ungetch.c
new file mode 100644
index 0000000..fcbe6f4
--- /dev/null
+++ b/ncurses/base/lib_ungetch.c
@@ -0,0 +1,94 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2011,2012 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ *     and: Juergen Pfeifer                         2009                    *
+ ****************************************************************************/
+
+/*
+**	lib_ungetch.c
+**
+**	The routine ungetch().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_ungetch.c,v 1.17 2020/02/02 23:34:34 tom Exp $")
+
+#include <fifo_defs.h>
+
+#ifdef TRACE
+NCURSES_EXPORT(void)
+_nc_fifo_dump(SCREEN *sp)
+{
+    int i;
+    T(("head = %d, tail = %d, peek = %d", head, tail, peek));
+    for (i = 0; i < 10; i++)
+	T(("char %d = %s", i, _nc_tracechar(sp, sp->_fifo[i])));
+}
+#endif /* TRACE */
+
+NCURSES_EXPORT(int)
+safe_ungetch(SCREEN *sp, int ch)
+{
+    int rc = ERR;
+
+    T((T_CALLED("ungetch(%p,%s)"), (void *) sp, _nc_tracechar(sp, ch)));
+
+    if (sp != 0 && tail >= 0) {
+	if (head < 0) {
+	    head = 0;
+	    t_inc();
+	    peek = tail;	/* no raw keys */
+	} else {
+	    h_dec();
+	}
+
+	sp->_fifo[head] = ch;
+	T(("ungetch %s ok", _nc_tracechar(sp, ch)));
+#ifdef TRACE
+	if (USE_TRACEF(TRACE_IEVENT)) {
+	    _nc_fifo_dump(sp);
+	    _nc_unlock_global(tracef);
+	}
+#endif
+	rc = OK;
+    }
+    returnCode(rc);
+}
+
+NCURSES_EXPORT(int)
+ungetch(int ch)
+{
+    return safe_ungetch(CURRENT_SCREEN, ch);
+}
diff --git a/ncurses/base/lib_vline.c b/ncurses/base/lib_vline.c
new file mode 100644
index 0000000..ae4af62
--- /dev/null
+++ b/ncurses/base/lib_vline.c
@@ -0,0 +1,89 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ *     and: Sven Verdoolaege                        2001                    *
+ ****************************************************************************/
+
+/*
+**	lib_vline.c
+**
+**	The routine wvline().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_vline.c,v 1.15 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(int)
+wvline(WINDOW *win, chtype ch, int n)
+{
+    int code = ERR;
+
+    T((T_CALLED("wvline(%p,%s,%d)"), (void *) win, _tracechtype(ch), n));
+
+    if (win) {
+	NCURSES_CH_T wch;
+	int row = win->_cury;
+	int col = win->_curx;
+	int end = row + n - 1;
+
+	if (end > win->_maxy)
+	    end = win->_maxy;
+
+	if (ch == 0)
+	    SetChar2(wch, ACS_VLINE);
+	else
+	    SetChar2(wch, ch);
+	wch = _nc_render(win, wch);
+
+	while (end >= row) {
+	    struct ldat *line = &(win->_line[end]);
+#if USE_WIDEC_SUPPORT
+	    if (col > 0 && isWidecExt(line->text[col])) {
+		SetChar2(line->text[col - 1], ' ');
+	    }
+	    if (col < win->_maxx && isWidecExt(line->text[col + 1])) {
+		SetChar2(line->text[col + 1], ' ');
+	    }
+#endif
+	    line->text[col] = wch;
+	    CHANGED_CELL(line, col);
+	    end--;
+	}
+
+	_nc_synchook(win);
+	code = OK;
+    }
+    returnCode(code);
+}
diff --git a/ncurses/base/lib_wattroff.c b/ncurses/base/lib_wattroff.c
new file mode 100644
index 0000000..eac07f0
--- /dev/null
+++ b/ncurses/base/lib_wattroff.c
@@ -0,0 +1,65 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2006,2009 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ ****************************************************************************/
+
+/*
+**	lib_wattroff.c
+**
+**	The routine wattr_off().
+**
+*/
+
+#include <curses.priv.h>
+#include <ctype.h>
+
+MODULE_ID("$Id: lib_wattroff.c,v 1.11 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(int)
+wattr_off(WINDOW *win, attr_t at, void *opts GCC_UNUSED)
+{
+    T((T_CALLED("wattr_off(%p,%s)"), (void *) win, _traceattr(at)));
+    if (win) {
+	T(("... current %s (%d)",
+	   _traceattr(WINDOW_ATTRS(win)),
+	   GET_WINDOW_PAIR(win)));
+
+	if_EXT_COLORS({
+	    if (at & A_COLOR)
+		win->_color = 0;
+	});
+	toggle_attr_off(WINDOW_ATTRS(win), at);
+	returnCode(OK);
+    } else
+	returnCode(ERR);
+}
diff --git a/ncurses/base/lib_wattron.c b/ncurses/base/lib_wattron.c
new file mode 100644
index 0000000..906021d
--- /dev/null
+++ b/ncurses/base/lib_wattron.c
@@ -0,0 +1,67 @@
+/****************************************************************************
+ * Copyright 2020,2022 Thomas E. Dickey                                     *
+ * Copyright 1998-2009,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ ****************************************************************************/
+
+/*
+**	lib_wattron.c
+**
+**	The routines wattr_on().
+**
+*/
+
+#include <curses.priv.h>
+#include <ctype.h>
+
+MODULE_ID("$Id: lib_wattron.c,v 1.13 2022/04/15 22:34:38 tom Exp $")
+
+NCURSES_EXPORT(int)
+wattr_on(WINDOW *win, attr_t at, void *opts GCC_UNUSED)
+{
+    T((T_CALLED("wattr_on(%p,%s)"), (void *) win, _traceattr(at)));
+    if (win != 0) {
+	T(("... current %s (%d)",
+	   _traceattr(WINDOW_ATTRS(win)),
+	   GET_WINDOW_PAIR(win)));
+
+	if_EXT_COLORS({
+	    if (at & A_COLOR) {
+		win->_color = PairNumber(at);
+		set_extended_pair(opts, win->_color);
+	    }
+	});
+	toggle_attr_on(WINDOW_ATTRS(win), at);
+	returnCode(OK);
+    } else
+	returnCode(ERR);
+}
diff --git a/ncurses/base/lib_winch.c b/ncurses/base/lib_winch.c
new file mode 100644
index 0000000..91253d1
--- /dev/null
+++ b/ncurses/base/lib_winch.c
@@ -0,0 +1,55 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2009,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey <dickey@clark.net> 1998                        *
+ ****************************************************************************/
+
+/*
+**	lib_winch.c
+**
+**	The routine winch().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_winch.c,v 1.9 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(chtype)
+winch(WINDOW *win)
+{
+    T((T_CALLED("winch(%p)"), (void *) win));
+    if (win != 0) {
+	returnChtype((chtype) CharOf(win->_line[win->_cury].text[win->_curx])
+		     | AttrOf(win->_line[win->_cury].text[win->_curx]));
+    } else {
+	returnChtype(0);
+    }
+}
diff --git a/ncurses/base/lib_window.c b/ncurses/base/lib_window.c
new file mode 100644
index 0000000..5323fbf
--- /dev/null
+++ b/ncurses/base/lib_window.c
@@ -0,0 +1,254 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2010,2016 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ ****************************************************************************/
+
+/*
+**	lib_window.c
+**
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_window.c,v 1.32 2021/10/23 23:06:24 tom Exp $")
+
+NCURSES_EXPORT(void)
+_nc_synchook(WINDOW *win)
+/* hook to be called after each window change */
+{
+    if (win->_immed)
+	wrefresh(win);
+    if (win->_sync)
+	wsyncup(win);
+}
+
+NCURSES_EXPORT(int)
+mvderwin(WINDOW *win, int y, int x)
+/* move a derived window */
+{
+    WINDOW *orig;
+    int rc = ERR;
+
+    T((T_CALLED("mvderwin(%p,%d,%d)"), (void *) win, y, x));
+
+    if (win != 0
+	&& (orig = win->_parent) != 0
+	&& (x >= 0 && y >= 0)
+	&& (x + getmaxx(win) <= getmaxx(orig))
+	&& (y + getmaxy(win) <= getmaxy(orig))) {
+	int i;
+
+	wsyncup(win);
+	win->_parx = x;
+	win->_pary = y;
+	for (i = 0; i < getmaxy(win); i++)
+	    win->_line[i].text = &(orig->_line[y++].text[x]);
+	rc = OK;
+    }
+    returnCode(rc);
+}
+
+NCURSES_EXPORT(int)
+syncok(WINDOW *win, bool bf)
+/* enable/disable automatic wsyncup() on each change to window */
+{
+    T((T_CALLED("syncok(%p,%d)"), (void *) win, bf));
+
+    if (win) {
+	win->_sync = bf;
+	returnCode(OK);
+    } else
+	returnCode(ERR);
+}
+
+NCURSES_EXPORT(void)
+wsyncup(WINDOW *win)
+/* mark changed every cell in win's ancestors that is changed in win */
+/* Rewritten by J. Pfeifer, 1-Apr-96 (don't even think that...)      */
+{
+    WINDOW *wp;
+
+    T((T_CALLED("wsyncup(%p)"), (void *) win));
+    if (win && win->_parent) {
+	for (wp = win; wp->_parent; wp = wp->_parent) {
+	    int y;
+	    WINDOW *pp = wp->_parent;
+
+	    assert((wp->_pary <= pp->_maxy) &&
+		   ((wp->_pary + wp->_maxy) <= pp->_maxy));
+
+	    for (y = 0; y <= wp->_maxy; y++) {
+		int left = wp->_line[y].firstchar;
+		if (left >= 0) {	/* line is touched */
+		    struct ldat *line = &(pp->_line[wp->_pary + y]);
+		    /* left & right character in parent window coordinates */
+		    int right = wp->_line[y].lastchar + wp->_parx;
+		    left += wp->_parx;
+
+		    CHANGED_RANGE(line, left, right);
+		}
+	    }
+	}
+    }
+    returnVoid;
+}
+
+NCURSES_EXPORT(void)
+wsyncdown(WINDOW *win)
+/* mark changed every cell in win that is changed in any of its ancestors */
+/* Rewritten by J. Pfeifer, 1-Apr-96 (don't even think that...)           */
+{
+    T((T_CALLED("wsyncdown(%p)"), (void *) win));
+
+    if (win != NULL && win->_parent != NULL) {
+	WINDOW *pp = win->_parent;
+	int y;
+
+	/* This recursion guarantees, that the changes are propagated down-
+	   wards from the root to our direct parent. */
+	wsyncdown(pp);
+
+	/* and now we only have to propagate the changes from our direct
+	   parent, if there are any. */
+	assert((win->_pary <= pp->_maxy) &&
+	       ((win->_pary + win->_maxy) <= pp->_maxy));
+
+	for (y = 0; y <= win->_maxy; y++) {
+	    if (pp->_line[win->_pary + y].firstchar >= 0) {	/* parent changed */
+		struct ldat *line = &(win->_line[y]);
+		/* left and right character in child coordinates */
+		int left = pp->_line[win->_pary + y].firstchar - win->_parx;
+		int right = pp->_line[win->_pary + y].lastchar - win->_parx;
+		/* The change may be outside the child's range */
+		if (left < 0)
+		    left = 0;
+		if (right > win->_maxx)
+		    right = win->_maxx;
+		CHANGED_RANGE(line, left, right);
+	    }
+	}
+    }
+    returnVoid;
+}
+
+NCURSES_EXPORT(void)
+wcursyncup(WINDOW *win)
+/* sync the cursor in all derived windows to its value in the base window */
+{
+    WINDOW *wp;
+
+    T((T_CALLED("wcursyncup(%p)"), (void *) win));
+    for (wp = win; wp && wp->_parent; wp = wp->_parent) {
+	wmove(wp->_parent, wp->_pary + wp->_cury, wp->_parx + wp->_curx);
+    }
+    returnVoid;
+}
+
+NCURSES_EXPORT(WINDOW *)
+dupwin(WINDOW *win)
+/* make an exact duplicate of the given window */
+{
+    WINDOW *nwin = 0;
+
+    T((T_CALLED("dupwin(%p)"), (void *) win));
+
+    if (win != 0) {
+#if NCURSES_SP_FUNCS
+	SCREEN *sp = _nc_screen_of(win);
+#endif
+	_nc_lock_global(curses);
+	if (IS_PAD(win)) {
+	    nwin = NCURSES_SP_NAME(newpad) (NCURSES_SP_ARGx
+					    win->_maxy + 1,
+					    win->_maxx + 1);
+	} else {
+	    nwin = NCURSES_SP_NAME(newwin) (NCURSES_SP_ARGx
+					    win->_maxy + 1,
+					    win->_maxx + 1,
+					    win->_begy,
+					    win->_begx);
+	}
+
+	if (nwin != 0) {
+	    int i;
+	    size_t linesize;
+
+	    nwin->_curx = win->_curx;
+	    nwin->_cury = win->_cury;
+	    nwin->_maxy = win->_maxy;
+	    nwin->_maxx = win->_maxx;
+	    nwin->_begy = win->_begy;
+	    nwin->_begx = win->_begx;
+	    nwin->_yoffset = win->_yoffset;
+
+	    nwin->_flags = win->_flags & ~_SUBWIN;
+	    /* Due to the use of newwin(), the clone is not a subwindow.
+	     * The text is really copied into the clone.
+	     */
+
+	    WINDOW_ATTRS(nwin) = WINDOW_ATTRS(win);
+	    nwin->_nc_bkgd = win->_nc_bkgd;
+
+	    nwin->_notimeout = win->_notimeout;
+	    nwin->_clear = win->_clear;
+	    nwin->_leaveok = win->_leaveok;
+	    nwin->_scroll = win->_scroll;
+	    nwin->_idlok = win->_idlok;
+	    nwin->_idcok = win->_idcok;
+	    nwin->_immed = win->_immed;
+	    nwin->_sync = win->_sync;
+	    nwin->_use_keypad = win->_use_keypad;
+	    nwin->_delay = win->_delay;
+
+	    nwin->_parx = 0;
+	    nwin->_pary = 0;
+	    nwin->_parent = (WINDOW *) 0;
+	    /* See above: the clone isn't a subwindow! */
+
+	    nwin->_regtop = win->_regtop;
+	    nwin->_regbottom = win->_regbottom;
+
+	    if (IS_PAD(win))
+		nwin->_pad = win->_pad;
+
+	    linesize = (unsigned) (win->_maxx + 1) * sizeof(NCURSES_CH_T);
+	    for (i = 0; i <= nwin->_maxy; i++) {
+		memcpy(nwin->_line[i].text, win->_line[i].text, linesize);
+		nwin->_line[i].firstchar = win->_line[i].firstchar;
+		nwin->_line[i].lastchar = win->_line[i].lastchar;
+	    }
+	}
+	_nc_unlock_global(curses);
+    }
+    returnWin(nwin);
+}
diff --git a/ncurses/base/nc_panel.c b/ncurses/base/nc_panel.c
new file mode 100644
index 0000000..002f118
--- /dev/null
+++ b/ncurses/base/nc_panel.c
@@ -0,0 +1,54 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2000,2009 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey <dickey@clark.net> 1997                        *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: nc_panel.c,v 1.6 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(struct panelhook *)
+NCURSES_SP_NAME(_nc_panelhook) (NCURSES_SP_DCL0)
+{
+    return (SP_PARM
+	    ? &(SP_PARM->_panelHook)
+	    : (CURRENT_SCREEN
+	       ? &(CURRENT_SCREEN->_panelHook)
+	       : 0));
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(struct panelhook *)
+_nc_panelhook(void)
+{
+    return NCURSES_SP_NAME(_nc_panelhook) (CURRENT_SCREEN);
+}
+#endif
diff --git a/ncurses/base/new_pair.c b/ncurses/base/new_pair.c
new file mode 100644
index 0000000..70866c6
--- /dev/null
+++ b/ncurses/base/new_pair.c
@@ -0,0 +1,393 @@
+/****************************************************************************
+ * Copyright 2018-2020,2021 Thomas E. Dickey                                *
+ * Copyright 2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                                                *
+ ****************************************************************************/
+
+/* new_pair.c
+ *
+ * New color-pair functions, alloc_pair and free_pair
+ */
+
+#define NEW_PAIR_INTERNAL 1
+#include <curses.priv.h>
+
+#ifndef CUR
+#define CUR SP_TERMTYPE
+#endif
+
+#ifdef USE_TERM_DRIVER
+#define MaxColors      InfoOf(SP_PARM).maxcolors
+#else
+#define MaxColors      max_colors
+#endif
+
+#if NCURSES_EXT_COLORS
+
+/* fix redefinition versys tic.h */
+#undef entry
+#define entry my_entry
+#undef ENTRY
+#define ENTRY my_ENTRY
+
+#include <search.h>
+
+#endif
+
+MODULE_ID("$Id: new_pair.c,v 1.23 2021/08/16 22:11:26 tom Exp $")
+
+#if NCURSES_EXT_COLORS
+
+#ifdef NEW_PAIR_DEBUG
+
+static int
+prev_len(SCREEN *sp, int pair)
+{
+    int result = 1;
+    int base = pair;
+    colorpair_t *list = sp->_color_pairs;
+    while (list[pair].prev != base) {
+	result++;
+	pair = list[pair].prev;
+    }
+    return result;
+}
+
+static int
+next_len(SCREEN *sp, int pair)
+{
+    int result = 1;
+    int base = pair;
+    colorpair_t *list = sp->_color_pairs;
+    while (list[pair].next != base) {
+	result++;
+	pair = list[pair].next;
+    }
+    return result;
+}
+
+/*
+ * Trace the contents of LRU color-pairs.
+ */
+static void
+dumpit(SCREEN *sp, int pair, const char *tag)
+{
+    colorpair_t *list = sp->_color_pairs;
+    char bigbuf[256 * 20];
+    char *p = bigbuf;
+    int n;
+    size_t have = sizeof(bigbuf);
+
+    _nc_STRCPY(p, tag, have);
+    for (n = 0; n < sp->_pair_alloc; ++n) {
+	if (list[n].mode != cpFREE) {
+	    p += strlen(p);
+	    if ((size_t) (p - bigbuf) + 50 > have)
+		break;
+	    _nc_SPRINTF(p, _nc_SLIMIT(have - (p - bigbuf))
+			" %d%c(%d,%d)",
+			n, n == pair ? '@' : ':', list[n].next, list[n].prev);
+	}
+    }
+    T(("(%d/%d) %ld - %s",
+       next_len(sp, 0),
+       prev_len(sp, 0),
+       strlen(bigbuf), bigbuf));
+
+    if (next_len(sp, 0) != prev_len(sp, 0)) {
+	endwin();
+	ExitProgram(EXIT_FAILURE);
+    }
+}
+#else
+#define dumpit(sp, pair, tag)	/* nothing */
+#endif
+
+static int
+compare_data(const void *a, const void *b)
+{
+    const colorpair_t *p = (const colorpair_t *) a;
+    const colorpair_t *q = (const colorpair_t *) b;
+    return ((p->fg == q->fg)
+	    ? (p->bg - q->bg)
+	    : (p->fg - q->fg));
+}
+
+static int
+_nc_find_color_pair(SCREEN *sp, int fg, int bg)
+{
+    colorpair_t find;
+    int result = -1;
+
+    find.fg = fg;
+    find.bg = bg;
+    if (sp != 0) {
+	void *pp;
+	if ((pp = tfind(&find, &sp->_ordered_pairs, compare_data)) != 0) {
+	    colorpair_t *temp = *(colorpair_t **) pp;
+	    result = (int) (temp - sp->_color_pairs);
+	}
+    }
+    return result;
+}
+
+static void
+delink_color_pair(SCREEN *sp, int pair)
+{
+    colorpair_t *list = sp->_color_pairs;
+    int prev = list[pair].prev;
+    int next = list[pair].next;
+
+    /* delink this from its current location */
+    if (list[prev].next == pair &&
+	list[next].prev == pair) {
+	list[prev].next = next;
+	list[next].prev = prev;
+	dumpit(sp, pair, "delinked");
+    }
+}
+
+/*
+ * Discard all nodes in the fast-index.
+ */
+NCURSES_EXPORT(void)
+_nc_free_ordered_pairs(SCREEN *sp)
+{
+    if (sp && sp->_ordered_pairs && sp->_pair_alloc) {
+	int n;
+	for (n = 0; n < sp->_pair_alloc; ++n) {
+	    tdelete(&sp->_color_pairs[n], &sp->_ordered_pairs, compare_data);
+	}
+    }
+}
+
+/*
+ * Use this call to update the fast-index when modifying an entry in the color
+ * pair table.
+ */
+NCURSES_EXPORT(void)
+_nc_reset_color_pair(SCREEN *sp, int pair, colorpair_t * next)
+{
+    colorpair_t *last;
+
+    if (ValidPair(sp, pair)) {
+	bool used;
+
+	ReservePairs(sp, pair);
+	last = &(sp->_color_pairs[pair]);
+	delink_color_pair(sp, pair);
+	if (last->mode > cpFREE &&
+	    (last->fg != next->fg || last->bg != next->bg)) {
+	    /* remove the old entry from fast index */
+	    tdelete(last, &sp->_ordered_pairs, compare_data);
+	    used = FALSE;
+	} else {
+	    used = (last->mode != cpFREE);
+	}
+	if (!used) {
+	    /* create a new entry in fast index */
+	    *last = *next;
+	    tsearch(last, &sp->_ordered_pairs, compare_data);
+	}
+    }
+}
+
+/*
+ * Use this call to relink the newest pair to the front of the list, keeping
+ * "0" first.
+ */
+NCURSES_EXPORT(void)
+_nc_set_color_pair(SCREEN *sp, int pair, int mode)
+{
+    if (ValidPair(sp, pair)) {
+	colorpair_t *list = sp->_color_pairs;
+	dumpit(sp, pair, "SET_PAIR");
+	list[0].mode = cpKEEP;
+	if (list[pair].mode <= cpFREE)
+	    sp->_pairs_used++;
+	list[pair].mode = mode;
+	if (list[0].next != pair) {
+	    /* link it at the front of the list */
+	    list[pair].next = list[0].next;
+	    list[list[pair].next].prev = pair;
+	    list[pair].prev = 0;
+	    list[0].next = pair;
+	}
+	dumpit(sp, pair, "...after");
+    }
+}
+
+/*
+ * If we reallocate the color-pair array, we have to adjust the fast-index.
+ */
+NCURSES_EXPORT(void)
+_nc_copy_pairs(SCREEN *sp, colorpair_t * target, colorpair_t * source, int length)
+{
+    int n;
+    for (n = 0; n < length; ++n) {
+	void *find = tfind(source + n, &sp->_ordered_pairs, compare_data);
+	if (find != 0) {
+	    tdelete(source + n, &sp->_ordered_pairs, compare_data);
+	    tsearch(target + n, &sp->_ordered_pairs, compare_data);
+	}
+    }
+}
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(alloc_pair) (NCURSES_SP_DCLx int fg, int bg)
+{
+    int pair;
+
+    T((T_CALLED("alloc_pair(%d,%d)"), fg, bg));
+    if (SP_PARM == 0) {
+	pair = -1;
+    } else if ((pair = _nc_find_color_pair(SP_PARM, fg, bg)) < 0) {
+	/*
+	 * Check if all of the slots have been used.  If not, find one and
+	 * use that.
+	 */
+	if (SP_PARM->_pairs_used + 1 < SP_PARM->_pair_limit) {
+	    bool found = FALSE;
+	    int hint = SP_PARM->_recent_pair;
+
+	    /*
+	     * The linear search is done to allow mixing calls to init_pair()
+	     * and alloc_pair().  The former can make gaps...
+	     */
+	    for (pair = hint + 1; pair < SP_PARM->_pair_alloc; pair++) {
+		if (SP_PARM->_color_pairs[pair].mode == cpFREE) {
+		    T(("found gap %d", pair));
+		    found = TRUE;
+		    break;
+		}
+	    }
+	    if (!found && (SP_PARM->_pair_alloc < SP_PARM->_pair_limit)) {
+		pair = SP_PARM->_pair_alloc;
+		ReservePairs(SP_PARM, pair);
+		if (SP_PARM->_color_pairs == 0) {
+		    pair = -1;
+		} else {
+		    found = TRUE;
+		}
+	    }
+	    if (!found && SP_PARM->_color_pairs != NULL) {
+		for (pair = 1; pair <= hint; pair++) {
+		    if (SP_PARM->_color_pairs[pair].mode == cpFREE) {
+			T(("found gap %d", pair));
+			found = TRUE;
+			break;
+		    }
+		}
+	    }
+	    if (found) {
+		SP_PARM->_recent_pair = pair;
+	    } else {
+		pair = ERR;
+	    }
+	} else {
+	    /* reuse the oldest one */
+	    pair = SP_PARM->_color_pairs[0].prev;
+	    T(("reusing %d", pair));
+	}
+
+	if (_nc_init_pair(SP_PARM, pair, fg, bg) == ERR)
+	    pair = ERR;
+    }
+    returnCode(pair);
+}
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(find_pair) (NCURSES_SP_DCLx int fg, int bg)
+{
+    int pair;
+
+    T((T_CALLED("find_pair(%d,%d)"), fg, bg));
+    pair = _nc_find_color_pair(SP_PARM, fg, bg);
+    returnCode(pair);
+}
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(free_pair) (NCURSES_SP_DCLx int pair)
+{
+    int result = ERR;
+    T((T_CALLED("free_pair(%d)"), pair));
+    if (ValidPair(SP_PARM, pair) && pair < SP_PARM->_pair_alloc) {
+	colorpair_t *cp = &(SP_PARM->_color_pairs[pair]);
+	if (pair != 0) {
+	    _nc_change_pair(SP_PARM, pair);
+	    delink_color_pair(SP_PARM, pair);
+	    tdelete(cp, &SP_PARM->_ordered_pairs, compare_data);
+	    cp->mode = cpFREE;
+	    result = OK;
+	    SP_PARM->_pairs_used--;
+	}
+    }
+    returnCode(result);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+alloc_pair(int f, int b)
+{
+    return NCURSES_SP_NAME(alloc_pair) (CURRENT_SCREEN, f, b);
+}
+
+NCURSES_EXPORT(int)
+find_pair(int f, int b)
+{
+    return NCURSES_SP_NAME(find_pair) (CURRENT_SCREEN, f, b);
+}
+
+NCURSES_EXPORT(int)
+free_pair(int pair)
+{
+    return NCURSES_SP_NAME(free_pair) (CURRENT_SCREEN, pair);
+}
+#endif
+
+#if NO_LEAKS
+NCURSES_EXPORT(void)
+_nc_new_pair_leaks(SCREEN *sp)
+{
+    if (sp->_color_pairs) {
+	while (sp->_color_pairs[0].next) {
+	    free_pair(sp->_color_pairs[0].next);
+	}
+    }
+}
+#endif
+
+#else
+void _nc_new_pair(void);
+void
+_nc_new_pair(void)
+{
+}
+#endif /* NCURSES_EXT_COLORS */
diff --git a/ncurses/base/resizeterm.c b/ncurses/base/resizeterm.c
new file mode 100644
index 0000000..b25cf90
--- /dev/null
+++ b/ncurses/base/resizeterm.c
@@ -0,0 +1,540 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2015,2016 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                                                *
+ *     and: Juergen Pfeifer                                                 *
+ ****************************************************************************/
+
+/*
+ * This is an extension to the curses library.  It provides callers with a hook
+ * into the NCURSES data to resize windows, primarily for use by programs
+ * running in an X Window terminal (e.g., xterm).  I abstracted this module
+ * from my application library for NCURSES because it must be compiled with
+ * the private data structures -- T.Dickey 1995/7/4.
+ */
+
+#include <curses.priv.h>
+
+#ifndef CUR
+#define CUR SP_TERMTYPE
+#endif
+
+MODULE_ID("$Id: resizeterm.c,v 1.52 2021/10/23 17:12:33 tom Exp $")
+
+/*
+ * If we're trying to be reentrant, do not want any local statics.
+ */
+#if USE_REENTRANT
+#define EXTRA_ARGS ,     CurLines,     CurCols
+#define EXTRA_DCLS , int CurLines, int CurCols
+#else
+static int current_lines;
+static int current_cols;
+#define CurLines current_lines
+#define CurCols  current_cols
+#define EXTRA_ARGS		/* nothing */
+#define EXTRA_DCLS		/* nothing */
+#endif
+
+#if NCURSES_SP_FUNCS && !defined(USE_SP_WINDOWLIST)
+#define UNUSED_SP  (void) sp
+#else
+#define UNUSED_SP		/* nothing */
+#endif
+
+#ifdef TRACE
+static void
+show_window_sizes(const char *name)
+{
+    SCREEN *sp;
+    WINDOWLIST *wp;
+
+    _nc_lock_global(curses);
+    for (each_screen(sp)) {
+	_tracef("%s resizing: %p: %2d x %2d (%2d x %2d)", name, (void *) sp,
+		*(ptrLines(sp)),
+		*(ptrCols(sp)),
+		screen_lines(sp), screen_columns(sp));
+	for (each_window(sp, wp)) {
+	    _tracef("  window %p is %2ld x %2ld at %2ld,%2ld",
+		    (void *) &(wp->win),
+		    (long) wp->win._maxy + 1,
+		    (long) wp->win._maxx + 1,
+		    (long) wp->win._begy,
+		    (long) wp->win._begx);
+	}
+    }
+    _nc_unlock_global(curses);
+}
+#endif
+
+/*
+ * Return true if the given dimensions do not match the internal terminal
+ * structure's size.
+ */
+NCURSES_EXPORT(bool)
+NCURSES_SP_NAME(is_term_resized) (NCURSES_SP_DCLx int ToLines, int ToCols)
+{
+    T((T_CALLED("is_term_resized(%p, %d, %d)"), (void *) SP_PARM, ToLines, ToCols));
+    returnCode(ToLines > 0
+	       && ToCols > 0
+	       && (ToLines != screen_lines(SP_PARM)
+		   || ToCols != screen_columns(SP_PARM)));
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(bool)
+is_term_resized(int ToLines, int ToCols)
+{
+    return NCURSES_SP_NAME(is_term_resized) (CURRENT_SCREEN, ToLines, ToCols);
+}
+#endif
+
+/*
+ */
+static ripoff_t *
+ripped_window(WINDOW *win)
+{
+    ripoff_t *result = 0;
+    ripoff_t *rop;
+
+    if (win != 0) {
+#ifdef USE_SP_RIPOFF
+	SCREEN *sp = _nc_screen_of(win);
+#endif
+	for (each_ripoff(rop)) {
+	    if (rop->win == win && rop->line != 0) {
+		result = rop;
+		break;
+	    }
+	}
+    }
+    return result;
+}
+
+/*
+ * Returns the number of lines from the bottom for the beginning of a ripped
+ * off window.
+ */
+static int
+ripped_bottom(WINDOW *win)
+{
+    int result = 0;
+
+    if (win != 0) {
+	ripoff_t *rop;
+
+#ifdef USE_SP_RIPOFF
+	SCREEN *sp = _nc_screen_of(win);
+#endif
+	for (each_ripoff(rop)) {
+	    if (rop->line < 0) {
+		result -= rop->line;
+		if (rop->win == win) {
+		    break;
+		}
+	    }
+	}
+    }
+    return result;
+}
+
+/*
+ * Return the number of levels of child-windows under the current window.
+ */
+static int
+child_depth(WINDOW *cmp)
+{
+    int depth = 0;
+
+    if (cmp != 0) {
+#ifdef USE_SP_WINDOWLIST
+	SCREEN *sp = _nc_screen_of(cmp);
+#endif
+	WINDOWLIST *wp;
+
+	for (each_window(sp, wp)) {
+	    WINDOW *tst = &(wp->win);
+	    if (tst->_parent == cmp) {
+		depth = 1 + child_depth(tst);
+		break;
+	    }
+	}
+    }
+    return depth;
+}
+
+/*
+ * Return the number of levels of parent-windows above the current window.
+ */
+static int
+parent_depth(WINDOW *cmp)
+{
+    int depth = 0;
+
+    if (cmp != 0) {
+	WINDOW *tst;
+	while ((tst = cmp->_parent) != 0) {
+	    ++depth;
+	    cmp = tst;
+	}
+    }
+    return depth;
+}
+
+/*
+ * FIXME: must adjust position so it is within the parent!
+ */
+static int
+adjust_window(WINDOW *win, int ToLines, int ToCols, int stolen EXTRA_DCLS)
+{
+    int result;
+    int bottom = CurLines + _nc_screen_of(win)->_topstolen - stolen;
+    int myLines = win->_maxy + 1;
+    int myCols = win->_maxx + 1;
+    ripoff_t *rop = ripped_window(win);
+
+    T((T_CALLED("adjust_window(%p,%d,%d)%s depth %d/%d currently %ldx%ld at %ld,%ld"),
+       (void *) win, ToLines, ToCols,
+       (rop != 0) ? " (rip)" : "",
+       parent_depth(win),
+       child_depth(win),
+       (long) getmaxy(win), (long) getmaxx(win),
+       (long) getbegy(win) + win->_yoffset, (long) getbegx(win)));
+
+    if (rop != 0 && rop->line < 0) {
+	/*
+	 * If it is a ripped-off window at the bottom of the screen, simply
+	 * move it to the same relative position.
+	 */
+	win->_begy = (NCURSES_SIZE_T) (ToLines - ripped_bottom(win) - 0 - win->_yoffset);
+	if (rop->hook == _nc_slk_initialize)
+	    _nc_format_slks(
+#if NCURSES_SP_FUNCS
+			       _nc_screen_of(win),
+#endif
+			       ToCols);
+    } else if (win->_begy >= bottom) {
+	/*
+	 * If it is below the bottom of the new screen, move up by the same
+	 * amount that the screen shrank.
+	 */
+	win->_begy = (NCURSES_SIZE_T) (win->_begy + (ToLines - CurLines));
+    } else {
+	if (myLines == (CurLines - stolen)
+	    && ToLines != CurLines) {
+	    myLines = ToLines - stolen;
+	} else if (myLines == CurLines
+		   && ToLines != CurLines) {
+	    myLines = ToLines;
+	}
+    }
+
+    if (myLines > ToLines) {
+	myLines = ToLines;
+    }
+
+    if (myCols > ToCols)
+	myCols = ToCols;
+
+    if (myCols == CurCols
+	&& ToCols != CurCols)
+	myCols = ToCols;
+
+    result = wresize(win, myLines, myCols);
+    returnCode(result);
+}
+
+/*
+ * If we're decreasing size, recursively search for windows that have no
+ * children, decrease those to fit, then decrease the containing window, etc.
+ */
+static int
+decrease_size(NCURSES_SP_DCLx int ToLines, int ToCols, int stolen EXTRA_DCLS)
+{
+    bool found;
+    int depth = 0;
+    WINDOWLIST *wp;
+
+    T((T_CALLED("decrease_size(%p, %d, %d)"), (void *) SP_PARM, ToLines, ToCols));
+    UNUSED_SP;
+
+    do {
+	found = FALSE;
+	TR(TRACE_UPDATE, ("decreasing size of windows to %dx%d, depth=%d",
+			  ToLines, ToCols, depth));
+	for (each_window(SP_PARM, wp)) {
+	    WINDOW *win = &(wp->win);
+
+	    if (!IS_PAD(win)) {
+		if (child_depth(win) == depth) {
+		    found = TRUE;
+		    if (adjust_window(win, ToLines, ToCols,
+				      stolen EXTRA_ARGS) != OK)
+			returnCode(ERR);
+		}
+	    }
+	}
+	++depth;
+    } while (found);
+    returnCode(OK);
+}
+
+/*
+ * If we're increasing size, recursively search for windows that have no
+ * parent, increase those to fit, then increase the contained window, etc.
+ */
+static int
+increase_size(NCURSES_SP_DCLx int ToLines, int ToCols, int stolen EXTRA_DCLS)
+{
+    bool found;
+    int depth = 0;
+    WINDOWLIST *wp;
+
+    T((T_CALLED("increase_size(%p, %d, %d)"), (void *) SP_PARM, ToLines, ToCols));
+    UNUSED_SP;
+
+    do {
+	found = FALSE;
+	TR(TRACE_UPDATE, ("increasing size of windows to %dx%d, depth=%d",
+			  ToLines, ToCols, depth));
+	for (each_window(SP_PARM, wp)) {
+	    WINDOW *win = &(wp->win);
+
+	    if (!IS_PAD(win)) {
+		if (parent_depth(win) == depth) {
+		    found = TRUE;
+		    if (adjust_window(win, ToLines, ToCols,
+				      stolen EXTRA_ARGS) != OK)
+			returnCode(ERR);
+		}
+	    }
+	}
+	++depth;
+    } while (found);
+    returnCode(OK);
+}
+
+/*
+ * This function reallocates NCURSES window structures, with no side-effects
+ * such as ungetch().
+ */
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(resize_term) (NCURSES_SP_DCLx int ToLines, int ToCols)
+{
+    int result = OK EXTRA_ARGS;
+    int was_stolen;
+
+    T((T_CALLED("resize_term(%p,%d,%d) old(%d,%d)"),
+       (void *) SP_PARM, ToLines, ToCols,
+       (SP_PARM == 0) ? -1 : screen_lines(SP_PARM),
+       (SP_PARM == 0) ? -1 : screen_columns(SP_PARM)));
+
+    if (SP_PARM == 0 || ToLines <= 0 || ToCols <= 0) {
+	returnCode(ERR);
+    }
+
+    _nc_nonsp_lock_global(curses);
+
+    was_stolen = (screen_lines(SP_PARM) - SP_PARM->_lines_avail);
+    if (NCURSES_SP_NAME(is_term_resized) (NCURSES_SP_ARGx ToLines, ToCols)) {
+	int myLines = CurLines = screen_lines(SP_PARM);
+	int myCols = CurCols = screen_columns(SP_PARM);
+
+#ifdef TRACE
+	if (USE_TRACEF(TRACE_UPDATE)) {
+	    show_window_sizes("before");
+	    _nc_unlock_global(tracef);
+	}
+#endif
+	if (ToLines > screen_lines(SP_PARM)) {
+	    result = increase_size(NCURSES_SP_ARGx
+				   myLines = ToLines,
+				   myCols,
+				   was_stolen EXTRA_ARGS);
+	    CurLines = myLines;
+	    CurCols = myCols;
+	}
+
+	if ((result == OK)
+	    && (ToCols > screen_columns(SP_PARM))) {
+	    result = increase_size(NCURSES_SP_ARGx
+				   myLines,
+				   myCols = ToCols,
+				   was_stolen EXTRA_ARGS);
+	    CurLines = myLines;
+	    CurCols = myCols;
+	}
+
+	if ((result == OK)
+	    && (ToLines < myLines ||
+		ToCols < myCols)) {
+	    result = decrease_size(NCURSES_SP_ARGx
+				   ToLines,
+				   ToCols,
+				   was_stolen EXTRA_ARGS);
+	}
+
+	if (result == OK) {
+	    screen_lines(SP_PARM) = (NCURSES_SIZE_T) ToLines;
+	    screen_columns(SP_PARM) = (NCURSES_SIZE_T) ToCols;
+
+#ifdef USE_TERM_DRIVER
+	    CallDriver_2(SP_PARM, td_setsize, ToLines, ToCols);
+#else
+	    lines = (NCURSES_SIZE_T) ToLines;
+	    columns = (NCURSES_SIZE_T) ToCols;
+#endif
+
+	    SP_PARM->_lines_avail = (NCURSES_SIZE_T) (ToLines - was_stolen);
+
+	    if (SP_PARM->oldhash) {
+		FreeAndNull(SP_PARM->oldhash);
+	    }
+	    if (SP_PARM->newhash) {
+		FreeAndNull(SP_PARM->newhash);
+	    }
+#ifdef TRACE
+	    if (USE_TRACEF(TRACE_UPDATE)) {
+		SET_LINES(ToLines - was_stolen);
+		SET_COLS(ToCols);
+		show_window_sizes("after");
+		_nc_unlock_global(tracef);
+	    }
+#endif
+	}
+    }
+
+    if (result == OK) {
+	/*
+	 * Always update LINES, to allow for call from lib_doupdate.c which
+	 * needs to have the count adjusted by the stolen (ripped off) lines.
+	 */
+	SET_LINES(ToLines - was_stolen);
+	SET_COLS(ToCols);
+    }
+
+    _nc_nonsp_unlock_global(curses);
+
+    returnCode(result);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+resize_term(int ToLines, int ToCols)
+{
+    int res;
+    _nc_sp_lock_global(curses);
+    res = NCURSES_SP_NAME(resize_term) (CURRENT_SCREEN, ToLines, ToCols);
+    _nc_sp_unlock_global(curses);
+    return (res);
+}
+#endif
+
+/*
+ * This function reallocates NCURSES window structures.  It is invoked in
+ * response to a SIGWINCH interrupt.  Other user-defined windows may also need
+ * to be reallocated.
+ *
+ * Because this performs memory allocation, it should not (in general) be
+ * invoked directly from the signal handler.
+ */
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(resizeterm) (NCURSES_SP_DCLx int ToLines, int ToCols)
+{
+    int result = ERR;
+
+    T((T_CALLED("resizeterm(%p, %d,%d) old(%d,%d)"),
+       (void *) SP_PARM, ToLines, ToCols,
+       (SP_PARM == 0) ? -1 : screen_lines(SP_PARM),
+       (SP_PARM == 0) ? -1 : screen_columns(SP_PARM)));
+
+    if (SP_PARM != 0 && ToLines > 0 && ToCols > 0) {
+	result = OK;
+	SP_PARM->_sig_winch = FALSE;
+
+	if (NCURSES_SP_NAME(is_term_resized) (NCURSES_SP_ARGx ToLines, ToCols)) {
+#if USE_SIGWINCH
+	    ripoff_t *rop;
+	    bool slk_visible = (SP_PARM != 0
+				&& SP_PARM->_slk != 0
+				&& !(SP_PARM->_slk->hidden));
+
+	    if (slk_visible) {
+		slk_clear();
+	    }
+#endif
+	    result = NCURSES_SP_NAME(resize_term) (NCURSES_SP_ARGx ToLines, ToCols);
+
+#if USE_SIGWINCH
+	    clearok(CurScreen(SP_PARM), TRUE);	/* screen contents are unknown */
+
+	    /* ripped-off lines are a special case: if we did not lengthen
+	     * them, we haven't moved them either.  repaint them, too.
+	     *
+	     * for the rest - stdscr and other windows - the client has to
+	     * decide which to repaint, since without panels, ncurses does
+	     * not know which are really on top.
+	     */
+	    for (each_ripoff(rop)) {
+		if (rop->win != StdScreen(SP_PARM)
+		    && rop->win != 0
+		    && rop->line < 0) {
+
+		    if (rop->hook != _nc_slk_initialize) {
+			touchwin(rop->win);
+			wnoutrefresh(rop->win);
+		    }
+		}
+	    }
+
+	    /* soft-keys are a special case: we _know_ how to repaint them */
+	    if (slk_visible) {
+		NCURSES_SP_NAME(slk_restore) (NCURSES_SP_ARG);
+		NCURSES_SP_NAME(slk_touch) (NCURSES_SP_ARG);
+		NCURSES_SP_NAME(slk_refresh) (NCURSES_SP_ARG);
+	    }
+#endif
+	}
+#if USE_SIGWINCH
+	safe_ungetch(SP_PARM, KEY_RESIZE);	/* so application can know this */
+#endif
+    }
+
+    returnCode(result);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+resizeterm(int ToLines, int ToCols)
+{
+    return NCURSES_SP_NAME(resizeterm) (CURRENT_SCREEN, ToLines, ToCols);
+}
+#endif
diff --git a/ncurses/base/safe_sprintf.c b/ncurses/base/safe_sprintf.c
new file mode 100644
index 0000000..3fff2e8
--- /dev/null
+++ b/ncurses/base/safe_sprintf.c
@@ -0,0 +1,293 @@
+/****************************************************************************
+ * Copyright 2018-2020,2021 Thomas E. Dickey                                *
+ * Copyright 1998-2012,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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey        1997-on                                 *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+#include <ctype.h>
+
+MODULE_ID("$Id: safe_sprintf.c,v 1.35 2021/10/03 00:25:09 tom Exp $")
+
+#if USE_SAFE_SPRINTF
+
+typedef enum {
+    Flags, Width, Prec, Type, Format
+} PRINTF;
+
+#define VA_INTGR(type) ival = (int) va_arg(ap, type)
+#define VA_FLOAT(type) fval = va_arg(ap, type)
+#define VA_POINT(type) pval = (void *)va_arg(ap, type)
+
+/*
+ * Scan a variable-argument list for printf to determine the number of
+ * characters that would be emitted.
+ */
+static int
+_nc_printf_length(const char *fmt, va_list ap)
+{
+    size_t length = BUFSIZ;
+    char *buffer;
+    char *format;
+    int len = 0;
+    size_t fmt_len;
+    char fmt_arg[BUFSIZ];
+
+    if (fmt == 0 || *fmt == '\0')
+	return 0;
+    fmt_len = strlen(fmt) + 1;
+    if ((format = typeMalloc(char, fmt_len)) == 0)
+	  return -1;
+    if ((buffer = typeMalloc(char, length)) == 0) {
+	free(format);
+	return -1;
+    }
+
+    while (*fmt != '\0') {
+	if (*fmt == '%') {
+	    static char dummy[] = "";
+	    PRINTF state = Flags;
+	    char *pval = dummy;	/* avoid const-cast */
+	    double fval = 0.0;
+	    int done = FALSE;
+	    int ival = 0;
+	    int prec = -1;
+	    int type = 0;
+	    int used = 0;
+	    int width = -1;
+	    size_t f = 0;
+
+	    format[f++] = *fmt;
+	    while (*++fmt != '\0' && len >= 0 && !done) {
+		format[f++] = *fmt;
+
+		if (isdigit(UChar(*fmt))) {
+		    int num = *fmt - '0';
+		    if (state == Flags && num != 0)
+			state = Width;
+		    if (state == Width) {
+			if (width < 0)
+			    width = 0;
+			width = (width * 10) + num;
+		    } else if (state == Prec) {
+			if (prec < 0)
+			    prec = 0;
+			prec = (prec * 10) + num;
+		    }
+		} else if (*fmt == '*') {
+		    VA_INTGR(int);
+		    if (state == Flags)
+			state = Width;
+		    if (state == Width) {
+			width = ival;
+		    } else if (state == Prec) {
+			prec = ival;
+		    }
+		    _nc_SPRINTF(fmt_arg,
+				_nc_SLIMIT(sizeof(fmt_arg))
+				"%d", ival);
+		    fmt_len += strlen(fmt_arg);
+		    if ((format = _nc_doalloc(format, fmt_len)) == 0) {
+			free(buffer);
+			return -1;
+		    }
+		    --f;
+		    _nc_STRCPY(&format[f], fmt_arg, fmt_len - f);
+		    f = strlen(format);
+		} else if (isalpha(UChar(*fmt))) {
+		    done = TRUE;
+		    switch (*fmt) {
+		    case 'Z':	/* FALLTHRU */
+		    case 'h':	/* FALLTHRU */
+		    case 'l':	/* FALLTHRU */
+			done = FALSE;
+			type = *fmt;
+			break;
+		    case 'i':	/* FALLTHRU */
+		    case 'd':	/* FALLTHRU */
+		    case 'u':	/* FALLTHRU */
+		    case 'x':	/* FALLTHRU */
+		    case 'X':	/* FALLTHRU */
+			if (type == 'l')
+			    VA_INTGR(long);
+			else if (type == 'Z')
+			    VA_INTGR(size_t);
+			else
+			    VA_INTGR(int);
+			used = 'i';
+			break;
+		    case 'f':	/* FALLTHRU */
+		    case 'e':	/* FALLTHRU */
+		    case 'E':	/* FALLTHRU */
+		    case 'g':	/* FALLTHRU */
+		    case 'G':	/* FALLTHRU */
+			VA_FLOAT(double);
+			used = 'f';
+			break;
+		    case 'c':
+			VA_INTGR(int);
+			used = 'i';
+			break;
+		    case 's':
+			VA_POINT(char *);
+			if (prec < 0)
+			    prec = (int) strlen(pval);
+			if (prec > (int) length) {
+			    length = length + (size_t) prec;
+			    buffer = typeRealloc(char, length, buffer);
+			    if (buffer == 0) {
+				free(format);
+				return -1;
+			    }
+			}
+			used = 'p';
+			break;
+		    case 'p':
+			VA_POINT(void *);
+			used = 'p';
+			break;
+		    case 'n':
+			VA_POINT(int *);
+			used = 0;
+			break;
+		    default:
+			break;
+		    }
+		} else if (*fmt == '.') {
+		    state = Prec;
+		} else if (*fmt == '%') {
+		    done = TRUE;
+		    used = 'p';
+		}
+	    }
+	    format[f] = '\0';
+	    switch (used) {
+	    case 'i':
+		_nc_SPRINTF(buffer, _nc_SLIMIT(length) format, ival);
+		break;
+	    case 'f':
+		_nc_SPRINTF(buffer, _nc_SLIMIT(length) format, fval);
+		break;
+	    default:
+		_nc_SPRINTF(buffer, _nc_SLIMIT(length) format, pval);
+		break;
+	    }
+	    len += (int) strlen(buffer);
+	} else {
+	    fmt++;
+	    len++;
+	}
+    }
+
+    free(buffer);
+    free(format);
+    return len;
+}
+#endif
+
+#define my_buffer _nc_globals.safeprint_buf
+#define my_length _nc_globals.safeprint_used
+
+/*
+ * Wrapper for vsprintf that allocates a buffer big enough to hold the result.
+ */
+NCURSES_EXPORT(char *)
+NCURSES_SP_NAME(_nc_printf_string) (NCURSES_SP_DCLx
+				    const char *fmt,
+				    va_list ap)
+{
+    char *result = NULL;
+
+    if (SP_PARM != NULL && fmt != NULL) {
+#if USE_SAFE_SPRINTF
+	va_list ap2;
+	int len;
+
+	begin_va_copy(ap2, ap);
+	len = _nc_printf_length(fmt, ap2);
+	end_va_copy(ap2);
+
+	if ((int) my_length < len + 1) {
+	    my_length = (size_t) (2 * (len + 1));
+	    my_buffer = typeRealloc(char, my_length, my_buffer);
+	}
+	if (my_buffer != NULL) {
+	    *my_buffer = '\0';
+	    if (len >= 0) {
+		vsprintf(my_buffer, fmt, ap);
+	    }
+	    result = my_buffer;
+	}
+#else
+#define MyCols _nc_globals.safeprint_cols
+#define MyRows _nc_globals.safeprint_rows
+
+	if (screen_lines(SP_PARM) > MyRows || screen_columns(SP_PARM) > MyCols) {
+	    if (screen_lines(SP_PARM) > MyRows)
+		MyRows = screen_lines(SP_PARM);
+	    if (screen_columns(SP_PARM) > MyCols)
+		MyCols = screen_columns(SP_PARM);
+	    my_length = (size_t) (MyRows * (MyCols + 1)) + 1;
+	    if (my_length < 80)
+		my_length = 80;
+	    my_buffer = typeRealloc(char, my_length, my_buffer);
+	}
+
+	if (my_buffer != NULL) {
+# if HAVE_VSNPRINTF
+	    /* SUSv2, 1997 */
+	    int used;
+	    while ((used = vsnprintf(my_buffer, my_length, fmt, ap))
+		   >= (int) my_length) {
+		my_length = (size_t) ((3 * used) / 2);
+		my_buffer = typeRealloc(char, my_length, my_buffer);
+	    }
+# else
+	    /* ISO/ANSI C, 1989 */
+	    vsprintf(my_buffer, fmt, ap);
+# endif
+	    result = my_buffer;
+	}
+#endif
+    } else if (my_buffer != NULL) {	/* see _nc_freeall() */
+	free(my_buffer);
+	my_buffer = NULL;
+	my_length = 0;
+    }
+    return result;
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(char *)
+_nc_printf_string(const char *fmt, va_list ap)
+{
+    return NCURSES_SP_NAME(_nc_printf_string) (CURRENT_SCREEN, fmt, ap);
+}
+#endif
diff --git a/ncurses/base/sigaction.c b/ncurses/base/sigaction.c
new file mode 100644
index 0000000..9688c69
--- /dev/null
+++ b/ncurses/base/sigaction.c
@@ -0,0 +1,100 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2002,2003 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-2003               *
+ ****************************************************************************/
+
+/* This file provides sigaction() emulation using sigvec() */
+/* Use only if this is non POSIX system */
+
+MODULE_ID("$Id: sigaction.c,v 1.15 2020/02/02 23:34:34 tom Exp $")
+
+static int
+_nc_sigaction(int sig, sigaction_t * sigact, sigaction_t * osigact)
+{
+    return sigvec(sig, sigact, osigact);
+}
+
+static int
+_nc_sigemptyset(sigset_t * mask)
+{
+    *mask = 0;
+    return 0;
+}
+
+static int
+_nc_sigprocmask(int mode, sigset_t * mask, sigset_t * omask)
+{
+    sigset_t current = sigsetmask(0);
+
+    if (omask)
+	*omask = current;
+
+    if (mode == SIG_BLOCK)
+	current |= *mask;
+    else if (mode == SIG_UNBLOCK)
+	current &= ~*mask;
+    else if (mode == SIG_SETMASK)
+	current = *mask;
+
+    sigsetmask(current);
+    return 0;
+}
+
+static int
+_nc_sigaddset(sigset_t * mask, int sig)
+{
+    *mask |= sigmask(sig);
+    return 0;
+}
+
+/* not used in lib_tstp.c */
+#if 0
+static int
+_nc_sigsuspend(sigset_t * mask)
+{
+    return sigpause(*mask);
+}
+
+static int
+_nc_sigdelset(sigset_t * mask, int sig)
+{
+    *mask &= ~sigmask(sig);
+    return 0;
+}
+
+static int
+_nc_sigismember(sigset_t * mask, int sig)
+{
+    return (*mask & sigmask(sig)) != 0;
+}
+#endif
diff --git a/ncurses/base/tries.c b/ncurses/base/tries.c
new file mode 100644
index 0000000..0f309c2
--- /dev/null
+++ b/ncurses/base/tries.c
@@ -0,0 +1,146 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2009,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey <dickey@clark.net> 1997                        *
+ ****************************************************************************/
+
+/*
+**	tries.c
+**
+**	Functions to manage the tree of partial-completions for keycodes.
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: tries.c,v 1.31 2020/02/02 23:34:34 tom Exp $")
+
+/*
+ * Expand a keycode into the string that it corresponds to, returning null if
+ * no match was found, otherwise allocating a string of the result.
+ */
+NCURSES_EXPORT(char *)
+_nc_expand_try(TRIES * tree, unsigned code, int *count, size_t len)
+{
+    TRIES *ptr = tree;
+    char *result = 0;
+
+    if (code != 0) {
+	while (ptr != 0) {
+	    if ((result = _nc_expand_try(ptr->child, code, count, len + 1))
+		!= 0) {
+		break;
+	    }
+	    if (ptr->value == code) {
+		*count -= 1;
+		if (*count == -1) {
+		    result = typeCalloc(char, len + 2);
+		    break;
+		}
+	    }
+	    ptr = ptr->sibling;
+	}
+    }
+    if (result != 0) {
+	if (ptr != 0 && (result[len] = (char) ptr->ch) == 0)
+	    *((unsigned char *) (result + len)) = 128;
+#ifdef TRACE
+	if (len == 0 && USE_TRACEF(TRACE_MAXIMUM)) {
+	    _tracef("expand_key %s %s",
+		    _nc_tracechar(CURRENT_SCREEN, (int) code),
+		    _nc_visbuf(result));
+	    _nc_unlock_global(tracef);
+	}
+#endif
+    }
+    return result;
+}
+
+/*
+ * Remove a code from the specified tree, freeing the unused nodes.  Returns
+ * true if the code was found/removed.
+ */
+NCURSES_EXPORT(int)
+_nc_remove_key(TRIES ** tree, unsigned code)
+{
+    T((T_CALLED("_nc_remove_key(%p,%d)"), (void *) tree, code));
+
+    if (code == 0)
+	returnCode(FALSE);
+
+    while (*tree != 0) {
+	if (_nc_remove_key(&(*tree)->child, code)) {
+	    returnCode(TRUE);
+	}
+	if ((*tree)->value == code) {
+	    if ((*tree)->child) {
+		/* don't cut the whole sub-tree */
+		(*tree)->value = 0;
+	    } else {
+		TRIES *to_free = *tree;
+		*tree = (*tree)->sibling;
+		free(to_free);
+	    }
+	    returnCode(TRUE);
+	}
+	tree = &(*tree)->sibling;
+    }
+    returnCode(FALSE);
+}
+
+/*
+ * Remove a string from the specified tree, freeing the unused nodes.  Returns
+ * true if the string was found/removed.
+ */
+NCURSES_EXPORT(int)
+_nc_remove_string(TRIES ** tree, const char *string)
+{
+    T((T_CALLED("_nc_remove_string(%p,%s)"), (void *) tree, _nc_visbuf(string)));
+
+    if (string == 0 || *string == 0)
+	returnCode(FALSE);
+
+    while (*tree != 0) {
+	if (UChar((*tree)->ch) == UChar(*string)) {
+	    if (string[1] != 0)
+		returnCode(_nc_remove_string(&(*tree)->child, string + 1));
+	    if ((*tree)->child == 0) {
+		TRIES *to_free = *tree;
+		*tree = (*tree)->sibling;
+		free(to_free);
+		returnCode(TRUE);
+	    } else {
+		returnCode(FALSE);
+	    }
+	}
+	tree = &(*tree)->sibling;
+    }
+    returnCode(FALSE);
+}
diff --git a/ncurses/base/use_window.c b/ncurses/base/use_window.c
new file mode 100644
index 0000000..4893053
--- /dev/null
+++ b/ncurses/base/use_window.c
@@ -0,0 +1,54 @@
+/****************************************************************************
+ * Copyright 2018,2020 Thomas E. Dickey                                     *
+ * Copyright 2007-2009,2016 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *     Author: Thomas E. Dickey                        2007                 *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: use_window.c,v 1.13 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(int)
+use_window(WINDOW *win, NCURSES_WINDOW_CB func, void *data)
+{
+    int code = OK;
+    TR_FUNC_BFR(1);
+
+    T((T_CALLED("use_window(%p,%s,%p)"),
+       (void *) win,
+       TR_FUNC_ARG(0, func),
+       data));
+
+    _nc_lock_global(curses);
+    code = func(win, data);
+    _nc_unlock_global(curses);
+
+    returnCode(code);
+}
diff --git a/ncurses/base/version.c b/ncurses/base/version.c
new file mode 100644
index 0000000..4d8ee81
--- /dev/null
+++ b/ncurses/base/version.c
@@ -0,0 +1,43 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1999-2004,2005 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey <dickey@clark.net> 1999                        *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: version.c,v 1.7 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(const char *)
+curses_version(void)
+{
+    T((T_CALLED("curses_version()")));
+    returnCPtr("ncurses " NCURSES_VERSION_STRING);
+}
diff --git a/ncurses/base/vsscanf.c b/ncurses/base/vsscanf.c
new file mode 100644
index 0000000..ef52425
--- /dev/null
+++ b/ncurses/base/vsscanf.c
@@ -0,0 +1,357 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2004,2012 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  State-machine fallback written by Thomas E. Dickey 2002                 *
+ ****************************************************************************/
+
+/*
+ * This function is needed to support vwscanw
+ */
+
+#include <curses.priv.h>
+
+#if !HAVE_VSSCANF
+
+MODULE_ID("$Id: vsscanf.c,v 1.21 2020/02/02 23:34:34 tom Exp $")
+
+#if !(HAVE_VFSCANF || HAVE__DOSCAN)
+
+#include <ctype.h>
+
+#define L_SQUARE '['
+#define R_SQUARE ']'
+
+typedef enum {
+    cUnknown
+    ,cError			/* anything that isn't ANSI */
+    ,cAssigned
+    ,cChar
+    ,cInt
+    ,cFloat
+    ,cDouble
+    ,cPointer
+    ,cLong
+    ,cShort
+    ,cRange
+    ,cString
+} ChunkType;
+
+typedef enum {
+    oUnknown
+    ,oShort
+    ,oLong
+} OtherType;
+
+typedef enum {
+    sUnknown
+    ,sPercent			/* last was '%' beginning a format */
+    ,sNormal			/* ...somewhere in the middle */
+    ,sLeft			/* last was left square bracket beginning a range */
+    ,sRange			/* ...somewhere in the middle */
+    ,sFinal			/* last finished a format */
+} ScanState;
+
+static ChunkType
+final_ch(int ch, OtherType other)
+{
+    ChunkType result = cUnknown;
+
+    switch (ch) {
+    case 'c':
+	if (other == oUnknown)
+	    result = cChar;
+	else
+	    result = cError;
+	break;
+    case 'd':
+    case 'i':
+    case 'X':
+    case 'x':
+	switch (other) {
+	case oUnknown:
+	    result = cInt;
+	    break;
+	case oShort:
+	    result = cShort;
+	    break;
+	case oLong:
+	    result = cLong;
+	    break;
+	}
+	break;
+    case 'E':
+    case 'e':
+    case 'f':
+    case 'g':
+	switch (other) {
+	case oUnknown:
+	    result = cFloat;
+	    break;
+	case oShort:
+	    result = cError;
+	    break;
+	case oLong:
+	    result = cDouble;
+	    break;
+	}
+	break;
+    case 'n':
+	if (other == oUnknown)
+	    result = cAssigned;
+	else
+	    result = cError;
+	break;
+    case 'p':
+	if (other == oUnknown)
+	    result = cPointer;
+	else
+	    result = cError;
+	break;
+    case 's':
+	if (other == oUnknown)
+	    result = cString;
+	else
+	    result = cError;
+	break;
+    }
+    return result;
+}
+
+static OtherType
+other_ch(int ch)
+{
+    OtherType result = oUnknown;
+    switch (ch) {
+    case 'h':
+	result = oShort;
+	break;
+    case 'l':
+	result = oLong;
+	break;
+    }
+    return result;
+}
+#endif
+
+/*VARARGS2*/
+NCURSES_EXPORT(int)
+vsscanf(const char *str, const char *format, va_list ap)
+{
+#if HAVE_VFSCANF || HAVE__DOSCAN
+    /*
+     * This code should work on anything descended from AT&T SVr1.
+     */
+    FILE strbuf;
+
+    strbuf._flag = _IOREAD;
+    strbuf._ptr = strbuf._base = (unsigned char *) str;
+    strbuf._cnt = strlen(str);
+    strbuf._file = _NFILE;
+
+#if HAVE_VFSCANF
+    return (vfscanf(&strbuf, format, ap));
+#else
+    return (_doscan(&strbuf, format, ap));
+#endif
+#else
+    static int can_convert = -1;
+
+    int assigned = 0;
+    int consumed = 0;
+
+    T((T_CALLED("vsscanf(%s,%s,...)"),
+       _nc_visbuf2(1, str),
+       _nc_visbuf2(2, format)));
+
+    /*
+     * This relies on having a working "%n" format conversion.  Check if it
+     * works.  Only very old C libraries do not support it.
+     *
+     * FIXME: move this check into the configure script.
+     */
+    if (can_convert < 0) {
+	int check1;
+	int check2;
+	if (sscanf("123", "%d%n", &check1, &check2) > 0
+	    && check1 == 123
+	    && check2 == 3) {
+	    can_convert = 1;
+	} else {
+	    can_convert = 0;
+	}
+    }
+
+    if (can_convert) {
+	size_t len_fmt = strlen(format) + 32;
+	char *my_fmt = malloc(len_fmt);
+	ChunkType chunk, ctest;
+	OtherType other, otest;
+	ScanState state;
+	unsigned n;
+	int eaten;
+	void *pointer;
+
+	if (my_fmt != 0) {
+	    /*
+	     * Split the original format into chunks, adding a "%n" to the end
+	     * of each (except of course if it used %n), and use that
+	     * information to decide where to start scanning the next chunk.
+	     *
+	     * FIXME:  does %n count bytes or characters?  If the latter, this
+	     * will require further work for multibyte strings.
+	     */
+	    while (*format != '\0') {
+		/* find a chunk */
+		state = sUnknown;
+		chunk = cUnknown;
+		other = oUnknown;
+		pointer = 0;
+		for (n = 0; format[n] != 0 && state != sFinal; ++n) {
+		    my_fmt[n] = format[n];
+		    switch (state) {
+		    case sUnknown:
+			if (format[n] == '%')
+			    state = sPercent;
+			break;
+		    case sPercent:
+			if (format[n] == '%') {
+			    state = sUnknown;
+			} else if (format[n] == L_SQUARE) {
+			    state = sLeft;
+			} else {
+			    state = sNormal;
+			    --n;
+			}
+			break;
+		    case sLeft:
+			state = sRange;
+			if (format[n] == '^') {
+			    ++n;
+			    my_fmt[n] = format[n];
+			}
+			break;
+		    case sRange:
+			if (format[n] == R_SQUARE) {
+			    state = sFinal;
+			    chunk = cRange;
+			}
+			break;
+		    case sNormal:
+			if (format[n] == '*') {
+			    state = sUnknown;
+			} else {
+			    if ((ctest = final_ch(format[n], other)) != cUnknown) {
+				state = sFinal;
+				chunk = ctest;
+			    } else if ((otest = other_ch(format[n])) != oUnknown) {
+				other = otest;
+			    } else if (isalpha(UChar(format[n]))) {
+				state = sFinal;
+				chunk = cError;
+			    }
+			}
+			break;
+		    case sFinal:
+			break;
+		    }
+		}
+		my_fmt[n] = '\0';
+		format += n;
+
+		if (chunk == cUnknown
+		    || chunk == cError) {
+		    if (assigned == 0)
+			assigned = EOF;
+		    break;
+		}
+
+		/* add %n, if the format was not that */
+		if (chunk != cAssigned) {
+		    _nc_STRCAT(my_fmt, "%n", len_fmt);
+		}
+
+		switch (chunk) {
+		case cAssigned:
+		    _nc_STRCAT(my_fmt, "%n", len_fmt);
+		    pointer = &eaten;
+		    break;
+		case cInt:
+		    pointer = va_arg(ap, int *);
+		    break;
+		case cShort:
+		    pointer = va_arg(ap, short *);
+		    break;
+		case cFloat:
+		    pointer = va_arg(ap, float *);
+		    break;
+		case cDouble:
+		    pointer = va_arg(ap, double *);
+		    break;
+		case cLong:
+		    pointer = va_arg(ap, long *);
+		    break;
+		case cPointer:
+		    pointer = va_arg(ap, void *);
+		    break;
+		case cChar:
+		case cRange:
+		case cString:
+		    pointer = va_arg(ap, char *);
+		    break;
+		case cError:
+		case cUnknown:
+		    break;
+		}
+		/* do the conversion */
+		T(("...converting chunk #%d type %d(%s,%s)",
+		   assigned + 1, chunk,
+		   _nc_visbuf2(1, str + consumed),
+		   _nc_visbuf2(2, my_fmt)));
+		if (sscanf(str + consumed, my_fmt, pointer, &eaten) > 0)
+		    consumed += eaten;
+		else
+		    break;
+		++assigned;
+	    }
+	    free(my_fmt);
+	}
+    }
+    returnCode(assigned);
+#endif
+}
+#else
+extern
+NCURSES_EXPORT(void)
+_nc_vsscanf(void);		/* quiet's gcc warning */
+NCURSES_EXPORT(void)
+_nc_vsscanf(void)
+{
+}				/* nonempty for strict ANSI compilers */
+#endif /* !HAVE_VSSCANF */
diff --git a/ncurses/base/wresize.c b/ncurses/base/wresize.c
new file mode 100644
index 0000000..5eb6a30
--- /dev/null
+++ b/ncurses/base/wresize.c
@@ -0,0 +1,277 @@
+/****************************************************************************
+ * Copyright 2019-2020,2021 Thomas E. Dickey                                *
+ * Copyright 1998-2010,2011 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey 1996-on                                        *
+ *     and: Juergen Pfeifer                                                 *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: wresize.c,v 1.42 2021/10/23 18:54:16 tom Exp $")
+
+static int
+cleanup_lines(struct ldat *data, int length)
+{
+    while (--length >= 0)
+	FreeAndNull(data[length].text);
+    free(data);
+    return ERR;
+}
+
+/*
+ * If we have reallocated the ldat structs, we will have to repair pointers
+ * used in subwindows.
+ */
+static void
+repair_subwindows(WINDOW *cmp)
+{
+    WINDOWLIST *wp;
+    struct ldat *pline = cmp->_line;
+    int row;
+#ifdef USE_SP_WINDOWLIST
+    SCREEN *sp = _nc_screen_of(cmp);
+#endif
+
+    _nc_lock_global(curses);
+
+    for (each_window(SP_PARM, wp)) {
+	WINDOW *tst = &(wp->win);
+
+	if (tst->_parent == cmp) {
+
+#define REPAIR1(field, limit) \
+	    if (tst->field > cmp->limit) \
+		tst->field = cmp->limit
+
+	    REPAIR1(_pary, _maxy);
+	    REPAIR1(_parx, _maxx);
+
+#define REPAIR2(field, limit) \
+	    if (tst->limit + tst->field > cmp->limit) \
+		tst->limit = (NCURSES_SIZE_T) (cmp->limit - tst->field)
+
+	    REPAIR2(_pary, _maxy);
+	    REPAIR2(_parx, _maxx);
+
+#define REPAIR3(field, limit) \
+	    if (tst->field > tst->limit) \
+		tst->field = tst->limit
+
+	    REPAIR3(_cury, _maxy);
+	    REPAIR3(_curx, _maxx);
+
+	    REPAIR3(_regtop, _maxy);
+	    REPAIR3(_regbottom, _maxy);
+
+	    for (row = 0; row <= tst->_maxy; ++row) {
+		tst->_line[row].text = &pline[tst->_pary + row].text[tst->_parx];
+	    }
+	    repair_subwindows(tst);
+	}
+    }
+    _nc_unlock_global(curses);
+}
+
+/*
+ * Reallocate a curses WINDOW struct to either shrink or grow to the specified
+ * new lines/columns.  If it grows, the new character cells are filled with
+ * blanks.  The application is responsible for repainting the blank area.
+ */
+NCURSES_EXPORT(int)
+wresize(WINDOW *win, int ToLines, int ToCols)
+{
+    int col, row, size_x, size_y;
+    struct ldat *pline;
+    struct ldat *new_lines = 0;
+
+#ifdef TRACE
+    T((T_CALLED("wresize(%p,%d,%d)"), (void *) win, ToLines, ToCols));
+    if (win) {
+	TR(TRACE_UPDATE, ("...beg (%ld, %ld), max(%ld,%ld), reg(%ld,%ld)",
+			  (long) win->_begy, (long) win->_begx,
+			  (long) win->_maxy, (long) win->_maxx,
+			  (long) win->_regtop, (long) win->_regbottom));
+	if (USE_TRACEF(TRACE_UPDATE)) {
+	    _tracedump("...before", win);
+	    _nc_unlock_global(tracef);
+	}
+    }
+#endif
+
+    if (!win || --ToLines < 0 || --ToCols < 0)
+	returnCode(ERR);
+
+    size_x = win->_maxx;
+    size_y = win->_maxy;
+
+    if (ToLines == size_y
+	&& ToCols == size_x)
+	returnCode(OK);
+
+    if (IS_SUBWIN(win)) {
+	/*
+	 * Check if the new limits will fit into the parent window's size.  If
+	 * not, do not resize.  We could adjust the location of the subwindow,
+	 * but the application may not like that.
+	 */
+	if (win->_pary + ToLines > win->_parent->_maxy
+	    || win->_parx + ToCols > win->_parent->_maxx) {
+	    returnCode(ERR);
+	}
+	pline = win->_parent->_line;
+    } else {
+	pline = 0;
+    }
+
+    /*
+     * Allocate new memory as needed.  Do the allocations without modifying
+     * the original window, in case an allocation fails.  Always allocate
+     * (at least temporarily) the array pointing to the individual lines.
+     */
+    new_lines = typeCalloc(struct ldat, (unsigned) (ToLines + 1));
+    if (new_lines == 0)
+	returnCode(ERR);
+
+    /*
+     * For each line in the target, allocate or adjust pointers for the
+     * corresponding text, depending on whether this is a window or a
+     * subwindow.
+     */
+    for (row = 0; row <= ToLines; ++row) {
+	int begin = (row > size_y) ? 0 : (size_x + 1);
+	int end = ToCols;
+	NCURSES_CH_T *s;
+
+	if (!IS_SUBWIN(win)) {
+	    if (row <= size_y) {
+		if (ToCols != size_x) {
+		    s = typeMalloc(NCURSES_CH_T, (unsigned) ToCols + 1);
+		    if (s == 0)
+			returnCode(cleanup_lines(new_lines, row));
+		    for (col = 0; col <= ToCols; ++col) {
+			bool valid = (col <= size_x);
+			if_WIDEC({
+			    if (col == ToCols
+				&& col < size_x
+				&& isWidecBase(win->_line[row].text[col])) {
+				valid = FALSE;
+			    }
+			});
+			s[col] = (valid
+				  ? win->_line[row].text[col]
+				  : win->_nc_bkgd);
+		    }
+		} else {
+		    s = win->_line[row].text;
+		}
+	    } else {
+		s = typeMalloc(NCURSES_CH_T, (unsigned) ToCols + 1);
+		if (s == 0)
+		    returnCode(cleanup_lines(new_lines, row));
+		for (col = 0; col <= ToCols; ++col)
+		    s[col] = win->_nc_bkgd;
+	    }
+	} else if (pline != 0 && pline[win->_pary + row].text != 0) {
+	    s = &pline[win->_pary + row].text[win->_parx];
+	} else {
+	    s = 0;
+	}
+
+	if_USE_SCROLL_HINTS(new_lines[row].oldindex = row);
+	if (row <= size_y) {
+	    new_lines[row].firstchar = win->_line[row].firstchar;
+	    new_lines[row].lastchar = win->_line[row].lastchar;
+	}
+	if ((ToCols != size_x) || (row > size_y)) {
+	    if (end >= begin) {	/* growing */
+		if (new_lines[row].firstchar < begin)
+		    new_lines[row].firstchar = (NCURSES_SIZE_T) begin;
+	    } else {		/* shrinking */
+		new_lines[row].firstchar = 0;
+	    }
+	    new_lines[row].lastchar = (NCURSES_SIZE_T) ToCols;
+	}
+	new_lines[row].text = s;
+    }
+
+    /*
+     * Dispose of unwanted memory.
+     */
+    if (!(win->_flags & _SUBWIN)) {
+	if (ToCols == size_x) {
+	    for (row = ToLines + 1; row <= size_y; row++) {
+		FreeAndNull(win->_line[row].text);
+	    }
+	} else {
+	    for (row = 0; row <= size_y; row++) {
+		FreeAndNull(win->_line[row].text);
+	    }
+	}
+    }
+
+    FreeAndNull(win->_line);
+    win->_line = new_lines;
+
+    /*
+     * Finally, adjust the parameters showing screen size and cursor
+     * position:
+     */
+    win->_maxx = (NCURSES_SIZE_T) ToCols;
+    win->_maxy = (NCURSES_SIZE_T) ToLines;
+
+    if (win->_regtop > win->_maxy)
+	win->_regtop = win->_maxy;
+    if (win->_regbottom > win->_maxy
+	|| win->_regbottom == size_y)
+	win->_regbottom = win->_maxy;
+
+    if (win->_curx > win->_maxx)
+	win->_curx = win->_maxx;
+    if (win->_cury > win->_maxy)
+	win->_cury = win->_maxy;
+
+    /*
+     * Check for subwindows of this one, and readjust pointers to our text,
+     * if needed.
+     */
+    repair_subwindows(win);
+
+#ifdef TRACE
+    TR(TRACE_UPDATE, ("...beg (%ld, %ld), max(%ld,%ld), reg(%ld,%ld)",
+		      (long) win->_begy, (long) win->_begx,
+		      (long) win->_maxy, (long) win->_maxx,
+		      (long) win->_regtop, (long) win->_regbottom));
+    if (USE_TRACEF(TRACE_UPDATE)) {
+	_tracedump("...after:", win);
+	_nc_unlock_global(tracef);
+    }
+#endif
+    returnCode(OK);
+}
diff --git a/ncurses/build.priv.h b/ncurses/build.priv.h
new file mode 100644
index 0000000..9014e74
--- /dev/null
+++ b/ncurses/build.priv.h
@@ -0,0 +1,108 @@
+/****************************************************************************
+ * Copyright 2019,2020 Thomas E. Dickey                                     *
+ * Copyright 2010,2012 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                        2010                    *
+ ****************************************************************************/
+
+/*
+ * $Id: build.priv.h,v 1.12 2020/02/02 23:34:34 tom Exp $
+ *
+ *	build.priv.h
+ *
+ *	This is a reduced version of curses.priv.h, for build-time utilities.
+ *	Because it has fewer dependencies, this simplifies cross-compiling.
+ *
+ */
+
+#ifndef CURSES_PRIV_H
+#define CURSES_PRIV_H 1
+
+#include <ncurses_dll.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <ncurses_cfg.h>
+
+#if USE_RCS_IDS
+#define MODULE_ID(id) static const char Ident[] = id;
+#else
+#define MODULE_ID(id)		/*nothing */
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+#include <assert.h>
+#include <stdio.h>
+
+#include <errno.h>
+
+#include <curses.h>		/* we'll use -Ipath directive to get the right one! */
+
+/* usually in <unistd.h> */
+#ifndef EXIT_SUCCESS
+#define EXIT_SUCCESS 0
+#endif
+
+#ifndef EXIT_FAILURE
+#define EXIT_FAILURE 1
+#endif
+
+#define FreeAndNull(p)   do { free(p); p = 0; } while (0)
+#define UChar(c)         ((unsigned char)(c))
+#define SIZEOF(v)        (sizeof(v) / sizeof(v[0]))
+
+#include <nc_alloc.h>
+#include <nc_string.h>
+
+/* declare these, to avoid needing term.h */
+#if BROKEN_LINKER || USE_REENTRANT
+#define NCURSES_ARRAY(name) \
+	NCURSES_WRAPPED_VAR(NCURSES_CONST char * const *, name)
+
+    NCURSES_ARRAY(boolnames);
+    NCURSES_ARRAY(boolfnames);
+    NCURSES_ARRAY(numnames);
+    NCURSES_ARRAY(numfnames);
+    NCURSES_ARRAY(strnames);
+    NCURSES_ARRAY(strfnames);
+#endif
+
+#if NO_LEAKS
+    NCURSES_EXPORT(void) _nc_names_leaks(void);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif				/* CURSES_PRIV_H */
diff --git a/ncurses/curses.priv.h b/ncurses/curses.priv.h
new file mode 100644
index 0000000..ff57cbf
--- /dev/null
+++ b/ncurses/curses.priv.h
@@ -0,0 +1,2578 @@
+/****************************************************************************
+ * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2017,2018 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ *     and: Juergen Pfeifer                                                 *
+ ****************************************************************************/
+
+/*
+ * $Id: curses.priv.h,v 1.653 2022/10/23 13:29:26 tom Exp $
+ *
+ *	curses.priv.h
+ *
+ *	Header file for curses library objects which are private to
+ *	the library.
+ *
+ */
+
+#ifndef CURSES_PRIV_H
+#define CURSES_PRIV_H 1
+/* *INDENT-OFF* */
+
+#include <ncurses_dll.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <ncurses_cfg.h>
+
+#if USE_RCS_IDS
+#define MODULE_ID(id) static const char Ident[] = id;
+#else
+#define MODULE_ID(id) /*nothing*/
+#endif
+
+#include <stddef.h>		/* for offsetof */
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#if HAVE_LIMITS_H
+# include <limits.h>
+#elif HAVE_SYS_PARAM_H
+# include <sys/param.h>
+#endif
+
+#include <assert.h>
+#include <stdio.h>
+
+#include <errno.h>
+
+#if defined __hpux
+#  ifndef EILSEQ
+#    define EILSEQ 47
+#  endif
+#endif
+
+#ifndef PATH_MAX
+# if defined(_POSIX_PATH_MAX)
+#  define PATH_MAX _POSIX_PATH_MAX
+# elif defined(MAXPATHLEN)
+#  define PATH_MAX MAXPATHLEN
+# else
+#  define PATH_MAX 255	/* the Posix minimum path-size */
+# endif
+#endif
+
+#if DECL_ERRNO
+extern int errno;
+#endif
+
+/* Some Windows related defines */
+#undef _NC_WINDOWS
+#if (defined(_WIN32) || defined(_WIN64))
+#define _NC_WINDOWS
+#else
+#undef EXP_WIN32_DRIVER
+#endif
+
+#undef _NC_MINGW
+#if (defined(__MINGW32__) || defined(__MINGW64__))
+#define _NC_MINGW
+#endif
+
+#undef _NC_MSC
+#ifdef _MSC_VER
+#define _NC_MSC
+#endif
+
+/* Some systems have a broken 'select()', but workable 'poll()'.  Use that */
+#if HAVE_WORKING_POLL
+#define USE_FUNC_POLL 1
+#if HAVE_POLL_H
+#include <poll.h>
+#else
+#include <sys/poll.h>
+#endif
+#else
+#define USE_FUNC_POLL 0
+#endif
+
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#else
+# if HAVE_STDINT_H
+#  include <stdint.h>
+# endif
+#endif
+
+#ifndef PRIxPTR
+# define PRIxPTR	"lx"
+#endif
+
+/* include signal.h before curses.h to work-around defect in glibc 2.1.3 */
+#include <signal.h>
+
+/* Alessandro Rubini's GPM (general-purpose mouse) */
+#if HAVE_LIBGPM && HAVE_GPM_H
+#define USE_GPM_SUPPORT 1
+#else
+#define USE_GPM_SUPPORT 0
+#endif
+
+/* QNX mouse support */
+#if defined(__QNX__) && !defined(__QNXNTO__)
+#define USE_QNX_MOUSE 1
+#else
+#define USE_QNX_MOUSE 0
+#endif
+
+/* EMX mouse support */
+#ifdef __EMX__
+#define USE_EMX_MOUSE 1
+#else
+#define USE_EMX_MOUSE 0
+#endif
+
+/* kLIBC keyboard/mouse support */
+#if defined(__OS2__) && defined(__KLIBC__)
+#define USE_KLIBC_KBD   1
+#define USE_KLIBC_MOUSE 1
+#else
+#define USE_KLIBC_KBD   0
+#define USE_KLIBC_MOUSE 0
+#endif
+
+#define DEFAULT_MAXCLICK 166
+#define EV_MAX		8	/* size of mouse circular event queue */
+
+/*
+ * If we don't have signals to support it, don't add a sigwinch handler.
+ * In any case, resizing is an extended feature.  Use it if we've got it.
+ */
+#if !NCURSES_EXT_FUNCS
+#undef HAVE_SIZECHANGE
+#define HAVE_SIZECHANGE 0
+#endif
+
+#if HAVE_SIZECHANGE && USE_SIGWINCH && defined(SIGWINCH)
+#define USE_SIZECHANGE 1
+#else
+#define USE_SIZECHANGE 0
+#undef USE_SIGWINCH
+#define USE_SIGWINCH 0
+#endif
+
+/*
+ * When building in the MSYS2 environment, the automatic discovery of
+ * the path separator in configure doesn't work properly. So, if building
+ * for MinGW, we enforce the correct Windows PATH separator
+ */
+#if defined(_NC_WINDOWS)
+#  ifdef NCURSES_PATHSEP
+#    undef NCURSES_PATHSEP
+#  endif
+#  define NCURSES_PATHSEP ';'
+#endif
+
+/*
+ * Not all platforms have memmove; some have an equivalent bcopy.  (Some may
+ * have neither).
+ */
+#if USE_OK_BCOPY
+#define memmove(d,s,n) bcopy(s,d,n)
+#elif USE_MY_MEMMOVE
+#define memmove(d,s,n) _nc_memmove(d,s,n)
+extern NCURSES_EXPORT(void *) _nc_memmove (void *, const void *, size_t);
+#endif
+
+/*
+ * If we have va_copy(), use it for assigning va_list's.
+ */
+#if defined(HAVE___VA_COPY)
+#define begin_va_copy(dst,src)	__va_copy(dst, src)
+#define end_va_copy(dst)	va_end(dst)
+#elif defined(va_copy) || defined(HAVE_VA_COPY)
+#define begin_va_copy(dst,src)	va_copy(dst, src)
+#define end_va_copy(dst)	va_end(dst)
+#else
+#define begin_va_copy(dst,src) (dst) = (src)
+#define end_va_copy(dst)	/* nothing */
+#endif
+
+/*
+ * Either/both S_ISxxx and/or S_IFxxx are defined in sys/types.h; some systems
+ * lack one or the other.
+ */
+#ifndef S_ISDIR
+#define S_ISDIR(mode) ((mode & S_IFMT) == S_IFDIR)
+#endif
+
+#ifndef S_ISREG
+#define S_ISREG(mode) ((mode & S_IFMT) == S_IFREG)
+#endif
+
+/*
+ * POSIX ignores the "b", which c89 specified.  Some very old systems do not
+ * accept it.
+ */
+#if USE_FOPEN_BIN_R
+#define BIN_R	"rb"
+#define BIN_W	"wb"
+#else
+#define BIN_R	"r"
+#define BIN_W	"w"
+#endif
+
+/*
+ * Scroll hints are useless when hashmap is used
+ */
+#if !USE_SCROLL_HINTS
+#if !USE_HASHMAP
+#define USE_SCROLL_HINTS 1
+#else
+#define USE_SCROLL_HINTS 0
+#endif
+#endif
+
+#if USE_SCROLL_HINTS
+#define if_USE_SCROLL_HINTS(stmt) stmt
+#else
+#define if_USE_SCROLL_HINTS(stmt) /*nothing*/
+#endif
+
+#include <nc_string.h>
+
+/*
+ * Options for terminal drivers, etc...
+ */
+#ifdef USE_TERM_DRIVER
+#define NO_TERMINAL "unknown"
+#define USE_SP_RIPOFF     1
+#define USE_SP_TERMTYPE   1
+#define USE_SP_WINDOWLIST 1
+#else
+#define NO_TERMINAL 0
+#endif
+
+#define VALID_TERM_ENV(term_env, no_terminal) \
+	(term_env = (NonEmpty(term_env) \
+		     ? term_env \
+		     : no_terminal), \
+	 NonEmpty(term_env))
+
+/*
+ * Note:  ht/cbt expansion flakes out randomly under Linux 1.1.47, but only
+ * when we're throwing control codes at the screen at high volume.  To see
+ * this, re-enable USE_HARD_TABS and run worm for a while.  Other systems
+ * probably don't want to define this either due to uncertainties about tab
+ * delays and expansion in raw mode.
+ */
+
+#define TRIES struct tries
+typedef TRIES {
+	TRIES    *child;            /* ptr to child.  NULL if none          */
+	TRIES    *sibling;          /* ptr to sibling.  NULL if none        */
+	unsigned char    ch;        /* character at this node               */
+	unsigned short   value;     /* code of string so far.  0 if none.   */
+#undef TRIES
+} TRIES;
+
+/*
+ * Common/troublesome character definitions
+ */
+#define StringOf(ch) {ch, 0}
+
+#define L_BRACE '{'
+#define R_BRACE '}'
+#define S_QUOTE '\''
+#define D_QUOTE '"'
+
+#define VT_ACSC "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~"
+
+/*
+ * Structure for palette tables
+ */
+
+#define MAXCOLUMNS    135
+#define MAXLINES      66
+#define FIFO_SIZE     MAXCOLUMNS+2  /* for nocbreak mode input */
+
+#define ACS_LEN       128
+
+#define WINDOWLIST struct _win_list
+
+#if USE_WIDEC_SUPPORT
+#define _nc_bkgd    _bkgrnd
+#else
+#undef _XOPEN_SOURCE_EXTENDED
+#undef _XPG5
+#define _nc_bkgd    _bkgd
+#define wgetbkgrnd(win, wch)	((*wch = win->_bkgd) != 0 ? OK : ERR)
+#define wbkgrnd	    wbkgd
+#endif
+
+#undef NCURSES_OPAQUE
+#define NCURSES_INTERNALS 1
+#define NCURSES_OPAQUE 0
+
+#include <curses.h>	/* we'll use -Ipath directive to get the right one! */
+
+#if !(defined(NCURSES_WGETCH_EVENTS) && defined(NEED_KEY_EVENT))
+#undef KEY_EVENT		/* reduce compiler-warnings with Visual C++ */
+#endif
+
+typedef struct
+{
+    int red, green, blue;	/* what color_content() returns */
+    int r, g, b;		/* params to init_color() */
+    int init;			/* true if we called init_color() */
+}
+color_t;
+
+typedef union {
+    struct {
+	unsigned char red;
+	unsigned char green;
+	unsigned char blue;
+    } bits;			/* bits per color-value in RGB */
+    unsigned value;
+} rgb_bits_t;
+
+/*
+ * If curses.h did not expose the SCREEN-functions, then we do not need the
+ * parameter in the corresponding unextended functions.
+ */
+
+#define USE_SP_FUNC_SUPPORT     NCURSES_SP_FUNCS
+#define USE_EXT_SP_FUNC_SUPPORT (NCURSES_SP_FUNCS && NCURSES_EXT_FUNCS)
+
+#if NCURSES_SP_FUNCS
+#define SP_PARM         sp	/* use parameter */
+#define NCURSES_SP_ARG          SP_PARM
+#define NCURSES_SP_DCL  SCREEN *NCURSES_SP_ARG
+#define NCURSES_SP_DCL0 NCURSES_SP_DCL
+#define NCURSES_SP_ARGx         NCURSES_SP_ARG,
+#define NCURSES_SP_DCLx SCREEN *NCURSES_SP_ARGx
+#else
+#define SP_PARM         SP	/* use global variable */
+#define NCURSES_SP_ARG
+#define NCURSES_SP_DCL
+#define NCURSES_SP_DCL0 void
+#define NCURSES_SP_ARGx
+#define NCURSES_SP_DCLx
+#endif
+
+#include <nc_panel.h>
+
+#include <term.priv.h>
+#include <nc_termios.h>
+
+#define IsPreScreen(sp)      (((sp) != 0) && sp->_prescreen)
+#define HasTerminal(sp)      (((sp) != 0) && (0 != ((sp)->_term)))
+#define IsValidScreen(sp)    (HasTerminal(sp) && !IsPreScreen(sp))
+
+#if USE_REENTRANT
+#define CurTerm              _nc_prescreen._cur_term
+#else
+#define CurTerm              cur_term
+#endif
+
+#if NCURSES_SP_FUNCS
+#define TerminalOf(sp)       ((sp) ? ((sp)->_term ? (sp)->_term : CurTerm) : CurTerm)
+#else
+#define TerminalOf(sp)       CurTerm
+#endif
+
+/*
+ * The legacy layout for TERMTYPE uses "short" for all of the numbers.  Moving
+ * past that, numeric capabilities can be "int" by using a TERMTYPE2 structure
+ * in TERMINAL, and doing most of the internal work using TERMTYPE2.  There are
+ * a few places (mostly to expose the legacy layout) where the distinction
+ * needs attention.
+ */
+#if NCURSES_EXT_COLORS && HAVE_INIT_EXTENDED_COLOR
+#define NCURSES_EXT_NUMBERS  1
+#define NCURSES_INT2         int
+#define SIZEOF_INT2          4
+#define TerminalType(tp)     (tp)->type2
+#else
+#define NCURSES_EXT_NUMBERS  0
+#define NCURSES_INT2         short
+#define SIZEOF_INT2          2
+#define TerminalType(tp)     (tp)->type
+#endif
+
+#define SIZEOF_SHORT         2
+
+#ifdef CUR
+#undef CUR
+#define CUR TerminalType(cur_term).
+#endif
+
+/*
+ * Reduce dependency on cur_term global by using terminfo data from SCREEN's
+ * pointer to this data.
+ */
+#ifdef USE_SP_TERMTYPE
+#undef CUR
+#endif
+
+#define SP_TERMTYPE TerminalType(TerminalOf(sp)).
+
+#include <term_entry.h>
+
+#include <nc_tparm.h>
+
+/*
+ * Simplify ifdef's for the "*_ATTR" macros in case italics are not configured.
+ */
+#if defined(A_ITALIC) && defined(exit_italics_mode)
+#define USE_ITALIC 1
+#else
+#define USE_ITALIC 0
+#undef  A_ITALIC
+#define A_ITALIC 0
+#endif
+
+/*
+ * Use these macros internally, to make tracing less verbose.  But leave the
+ * option for compiling the tracing into the library.
+ */
+#if 1
+#define ColorPair(n)		(NCURSES_BITS(n, 0) & A_COLOR)
+#define PairNumber(a)		(NCURSES_CAST(int,(((unsigned long)(a) & A_COLOR) >> NCURSES_ATTR_SHIFT)))
+#else
+#define ColorPair(pair)		COLOR_PAIR(pair)
+#define PairNumber(attr)	PAIR_NUMBER(attr)
+#endif
+
+#define unColor(n)		unColor2(AttrOf(n))
+#define unColor2(a)		((a) & ALL_BUT_COLOR)
+
+/*
+ * Extended-colors stores the color pair in a separate struct-member than the
+ * attributes.  But for compatibility, we handle most cases where a program
+ * written for non-extended colors stores the color in the attributes by
+ * checking for a color pair in both places.
+ */
+#if NCURSES_EXT_COLORS
+#define if_EXT_COLORS(stmt)	stmt
+#define SetPair(value,p)	SetPair2((value).ext_color, AttrOf(value), p)
+#define SetPair2(c,a,p)		c = (p), \
+				a = (unColor2(a) | ColorPair(oldColor(c)))
+#define GetPair(value)		GetPair2((value).ext_color, AttrOf(value))
+#define GetPair2(c,a)		((c) ? (c) : PairNumber(a))
+#define oldColor(p)		(((p) > 255) ? 255 : (p))
+#define GET_WINDOW_PAIR(w)	GetPair2((w)->_color, (w)->_attrs)
+#define SET_WINDOW_PAIR(w,p)	(w)->_color = (p)
+#define SameAttrOf(a,b)		(AttrOf(a) == AttrOf(b) && GetPair(a) == GetPair(b))
+
+#define VIDPUTS(sp,attr,pair)	do { \
+				    int vid_pair = pair; \
+				    NCURSES_SP_NAME(vid_puts)( \
+					NCURSES_SP_ARGx attr, \
+					(NCURSES_PAIRS_T) pair, \
+					&vid_pair, \
+					NCURSES_OUTC_FUNC); \
+				} while (0)
+
+#else /* !NCURSES_EXT_COLORS */
+
+#define if_EXT_COLORS(stmt)	/* nothing */
+#define SetPair(value,p)	RemAttr(value, A_COLOR), \
+				SetAttr(value, AttrOf(value) | ColorPair(p))
+#define GetPair(value)		PairNumber(AttrOf(value))
+#define GET_WINDOW_PAIR(w)	PairNumber(WINDOW_ATTRS(w))
+#define SET_WINDOW_PAIR(w,p)	WINDOW_ATTRS(w) &= ALL_BUT_COLOR, \
+				WINDOW_ATTRS(w) |= ColorPair(p)
+#define SameAttrOf(a,b)		(AttrOf(a) == AttrOf(b))
+
+#define VIDPUTS(sp,attr,pair)	NCURSES_SP_NAME(vidputs)(NCURSES_SP_ARGx attr, NCURSES_OUTC_FUNC)
+
+#endif /* NCURSES_EXT_COLORS */
+
+#define NCURSES_OUTC_FUNC       NCURSES_SP_NAME(_nc_outch)
+#define NCURSES_PUTP2(name,value)    NCURSES_SP_NAME(_nc_putp)(NCURSES_SP_ARGx name, value)
+#define NCURSES_PUTP2_FLUSH(name,value)    NCURSES_SP_NAME(_nc_putp_flush)(NCURSES_SP_ARGx name, value)
+
+#if NCURSES_NO_PADDING
+#define GetNoPadding(sp)	((sp) ? (sp)->_no_padding : _nc_prescreen._no_padding)
+#define SetNoPadding(sp)	_nc_set_no_padding(sp)
+extern NCURSES_EXPORT(void)     _nc_set_no_padding(SCREEN *);
+#else
+#define GetNoPadding(sp)	FALSE
+#define SetNoPadding(sp)	/*nothing*/
+#endif
+
+#define WINDOW_ATTRS(w)		((w)->_attrs)
+
+#define SCREEN_ATTRS(s)		(*((s)->_current_attr))
+#define GET_SCREEN_PAIR(s)	GetPair(SCREEN_ATTRS(s))
+#define SET_SCREEN_PAIR(s,p)	SetPair(SCREEN_ATTRS(s), p)
+
+#if USE_REENTRANT || NCURSES_SP_FUNCS
+NCURSES_EXPORT(int *)        _nc_ptr_Lines (SCREEN *);
+NCURSES_EXPORT(int *)        _nc_ptr_Cols (SCREEN *);
+NCURSES_EXPORT(int *)        _nc_ptr_Tabsize (SCREEN *);
+NCURSES_EXPORT(int *)        _nc_ptr_Escdelay (SCREEN *);
+#endif
+
+#if USE_REENTRANT
+
+#define ptrLines(sp)         (sp ? &(sp->_LINES) : &(_nc_prescreen._LINES))
+#define ptrCols(sp)          (sp ? &(sp->_COLS) : &(_nc_prescreen._COLS))
+#define ptrTabsize(sp)       (sp ? &(sp->_TABSIZE) : &(_nc_prescreen._TABSIZE))
+#define ptrEscdelay(sp)      (sp ? &(sp->_ESCDELAY) : &(_nc_prescreen._ESCDELAY))
+
+#define SET_LINES(value)     *_nc_ptr_Lines(SP_PARM) = value
+#define SET_COLS(value)      *_nc_ptr_Cols(SP_PARM) = value
+#define SET_TABSIZE(value)   *_nc_ptr_Tabsize(SP_PARM) = value
+#define SET_ESCDELAY(value)  *_nc_ptr_Escdelay(SP_PARM) = value
+
+#else
+
+#define ptrLines(sp)         &LINES
+#define ptrCols(sp)          &COLS
+#define ptrTabsize(sp)       &TABSIZE
+#define ptrEscdelay(sp)      &ESCDELAY
+
+#define SET_LINES(value)     LINES = value
+#define SET_COLS(value)      COLS = value
+#define SET_TABSIZE(value)   TABSIZE = value
+#define SET_ESCDELAY(value)  ESCDELAY = value
+
+#endif
+
+#define IS_SUBWIN(w)         ((w)->_flags & _SUBWIN)
+#define IS_PAD(w)            ((w)->_flags & _ISPAD)
+#define IS_WRAPPED(w)        ((w)->_flags & _WRAPPED)
+
+#define HasHardTabs()	(NonEmpty(clear_all_tabs) && NonEmpty(set_tab))
+
+#define TR_MUTEX(data) _tracef("%s@%d: me:%08lX COUNT:%2u/%2d/%6d/%2d/%s%9u: " #data, \
+	    __FILE__, __LINE__, \
+	    (unsigned long) (pthread_self()), \
+	    data.__data.__lock, \
+	    data.__data.__count, \
+	    data.__data.__owner, \
+	    data.__data.__kind, \
+	    (data.__data.__nusers > 5) ? " OOPS " : "", \
+	    data.__data.__nusers)
+#define TR_GLOBAL_MUTEX(name) TR_MUTEX(_nc_globals.mutex_##name)
+
+#if USE_WEAK_SYMBOLS
+#if defined(__GNUC__)
+#  if defined __USE_ISOC99
+#    define _cat_pragma(exp)	_Pragma(#exp)
+#    define _weak_pragma(exp)	_cat_pragma(weak name)
+#  else
+#    define _weak_pragma(exp)
+#  endif
+#  define _declare(name)	__extension__ extern __typeof__(name) name
+#  define weak_symbol(name)	_weak_pragma(name) _declare(name) __attribute__((weak))
+#else
+#  undef USE_WEAK_SYMBOLS
+#  define USE_WEAK_SYMBOLS 0
+#endif
+#endif
+
+#ifdef USE_PTHREADS
+
+#if USE_REENTRANT
+#include <pthread.h>
+extern NCURSES_EXPORT(void) _nc_init_pthreads(void);
+extern NCURSES_EXPORT(void) _nc_mutex_init(pthread_mutex_t *);
+extern NCURSES_EXPORT(int) _nc_mutex_lock(pthread_mutex_t *);
+extern NCURSES_EXPORT(int) _nc_mutex_trylock(pthread_mutex_t *);
+extern NCURSES_EXPORT(int) _nc_mutex_unlock(pthread_mutex_t *);
+#define _nc_lock_global(name)	_nc_mutex_lock(&_nc_globals.mutex_##name)
+#define _nc_try_global(name)    _nc_mutex_trylock(&_nc_globals.mutex_##name)
+#define _nc_unlock_global(name)	_nc_mutex_unlock(&_nc_globals.mutex_##name)
+
+#else
+#error POSIX threads requires --enable-reentrant option
+#endif
+
+#ifdef USE_PTHREADS
+#  if USE_WEAK_SYMBOLS
+weak_symbol(pthread_sigmask);
+weak_symbol(pthread_kill);
+weak_symbol(pthread_self);
+weak_symbol(pthread_equal);
+weak_symbol(pthread_mutex_init);
+weak_symbol(pthread_mutex_lock);
+weak_symbol(pthread_mutex_unlock);
+weak_symbol(pthread_mutex_trylock);
+weak_symbol(pthread_mutexattr_settype);
+weak_symbol(pthread_mutexattr_init);
+extern NCURSES_EXPORT(int) _nc_sigprocmask(int, const sigset_t *, sigset_t *);
+#    undef  sigprocmask
+#    define sigprocmask(a, b, c) _nc_sigprocmask(a, b, c)
+#    define GetThreadID() (((pthread_self)) ? pthread_self() : (pthread_t) getpid())
+#  else
+#    define GetThreadID() pthread_self()
+#  endif
+#endif
+
+#if HAVE_NANOSLEEP
+#undef HAVE_NANOSLEEP
+#define HAVE_NANOSLEEP 0	/* nanosleep suspends all threads */
+#endif
+
+#else /* !USE_PTHREADS */
+
+#if USE_PTHREADS_EINTR
+#  if USE_WEAK_SYMBOLS
+#include <pthread.h>
+weak_symbol(pthread_sigmask);
+weak_symbol(pthread_kill);
+weak_symbol(pthread_self);
+weak_symbol(pthread_equal);
+extern NCURSES_EXPORT(int) _nc_sigprocmask(int, const sigset_t *, sigset_t *);
+#    undef  sigprocmask
+#    define sigprocmask(a, b, c) _nc_sigprocmask(a, b, c)
+#  endif
+#endif /* USE_PTHREADS_EINTR */
+
+#define _nc_init_pthreads()	/* nothing */
+#define _nc_mutex_init(obj)	/* nothing */
+
+#define _nc_lock_global(name)	/* nothing */
+#define _nc_try_global(name)    0
+#define _nc_unlock_global(name)	/* nothing */
+#endif /* USE_PTHREADS */
+
+#if USE_PTHREADS_EINTR
+extern NCURSES_EXPORT(void) _nc_set_read_thread(bool);
+#else
+#define _nc_set_read_thread(enable)	/* nothing */
+#endif
+
+/*
+ * When using sp-funcs, locks are targeted to SCREEN-level granularity.
+ * So the locking is done in the non-sp-func (which calls the sp-func) rather
+ * than in the sp-func itself.
+ *
+ * Use the _nc_nonsp_XXX functions in the function using "NCURSES_SP_NAME()".
+ * Use the _nc_sp_XXX functions in the function using "#if NCURSES_SP_FUNCS".
+ */
+#if NCURSES_SP_FUNCS
+
+#define _nc_nonsp_lock_global(name)	/* nothing */
+#define _nc_nonsp_try_global(name)    0
+#define _nc_nonsp_unlock_global(name)	/* nothing */
+
+#define _nc_sp_lock_global(name)	_nc_lock_global(name)
+#define _nc_sp_try_global(name)         _nc_try_global(name)
+#define _nc_sp_unlock_global(name)	_nc_unlock_global(name)
+
+#else
+
+#define _nc_nonsp_lock_global(name)	_nc_lock_global(name)
+#define _nc_nonsp_try_global(name)      _nc_try_global(name)
+#define _nc_nonsp_unlock_global(name)	_nc_unlock_global(name)
+
+#define _nc_sp_lock_global(name)	/* nothing */
+#define _nc_sp_try_global(name)    0
+#define _nc_sp_unlock_global(name)	/* nothing */
+
+#endif
+
+#if HAVE_GETTIMEOFDAY
+# define PRECISE_GETTIME 1
+# define TimeType struct timeval
+#else
+# define PRECISE_GETTIME 0
+# define TimeType time_t
+#endif
+
+/*
+ * Definitions for color pairs
+ */
+
+#define MAX_OF_TYPE(t)   (int)(((unsigned t)(~0))>>1)
+
+#include <new_pair.h>
+
+#define isDefaultColor(c)	((c) < 0)
+#define COLOR_DEFAULT		-1
+
+#if defined(USE_BUILD_CC) || (defined(USE_TERMLIB) && !defined(NEED_NCURSES_CH_T))
+
+#undef NCURSES_CH_T		/* this is not a termlib feature */
+#define NCURSES_CH_T void	/* ...but we need a pointer in SCREEN */
+
+#endif	/* USE_TERMLIB */
+
+#ifndef USE_TERMLIB
+struct ldat
+{
+	NCURSES_CH_T	*text;		/* text of the line */
+	NCURSES_SIZE_T	firstchar;	/* first changed character in the line */
+	NCURSES_SIZE_T	lastchar;	/* last changed character in the line */
+	NCURSES_SIZE_T	oldindex;	/* index of the line at last update */
+};
+#endif	/* USE_TERMLIB */
+
+typedef enum {
+	M_XTERM	= -1		/* use xterm's mouse tracking? */
+	,M_NONE = 0		/* no mouse device */
+#if USE_GPM_SUPPORT
+	,M_GPM			/* use GPM */
+#endif
+#if USE_SYSMOUSE
+	,M_SYSMOUSE		/* FreeBSD sysmouse on console */
+#endif
+#ifdef USE_TERM_DRIVER
+	,M_TERM_DRIVER		/* Win32 console, etc */
+#endif
+} MouseType;
+
+typedef enum {
+    	MF_X10 = 0		/* conventional 3-byte format */
+	, MF_SGR1006		/* xterm private mode 1006, SGR-style */
+#ifdef EXP_XTERM_1005
+	, MF_XTERM_1005		/* xterm UTF-8 private mode 1005 */
+#endif
+} MouseFormat;
+
+/*
+ * Structures for scrolling.
+ */
+
+typedef struct {
+	unsigned long hashval;
+	int oldcount, newcount;
+	int oldindex, newindex;
+} HASHMAP;
+
+/*
+ * Structures for soft labels.
+ */
+
+struct _SLK;
+
+#if !(defined(USE_TERMLIB) || defined(USE_BUILD_CC))
+
+typedef struct
+{
+	char *ent_text;		/* text for the label */
+	char *form_text;	/* formatted text (left/center/...) */
+	int ent_x;		/* x coordinate of this field */
+	char dirty;		/* this label has changed */
+	char visible;		/* field is visible */
+} slk_ent;
+
+typedef struct _SLK {
+	bool    dirty;		/* all labels have changed */
+	bool    hidden;		/* soft labels are hidden */
+	WINDOW  *win;
+	slk_ent *ent;
+	short   maxlab;		/* number of available labels */
+	short   labcnt;		/* number of allocated labels */
+	short   maxlen;		/* length of labels */
+	NCURSES_CH_T attr;	/* soft label attribute */
+} SLK;
+
+#endif	/* USE_TERMLIB */
+
+#if USE_GPM_SUPPORT
+#undef buttons			/* term.h defines this, and gpm uses it! */
+#include <gpm.h>
+#if USE_WEAK_SYMBOLS
+weak_symbol(Gpm_Wgetch);
+#endif
+
+#ifdef HAVE_LIBDL
+/* link dynamically to GPM */
+typedef int *TYPE_gpm_fd;
+typedef int (*TYPE_Gpm_Open) (Gpm_Connect *, int);
+typedef int (*TYPE_Gpm_Close) (void);
+typedef int (*TYPE_Gpm_GetEvent) (Gpm_Event *);
+
+#define my_gpm_fd       SP_PARM->_mouse_gpm_fd
+#define my_Gpm_Open     SP_PARM->_mouse_Gpm_Open
+#define my_Gpm_Close    SP_PARM->_mouse_Gpm_Close
+#define my_Gpm_GetEvent SP_PARM->_mouse_Gpm_GetEvent
+#else
+/* link statically to GPM */
+#define my_gpm_fd       &gpm_fd
+#define my_Gpm_Open     Gpm_Open
+#define my_Gpm_Close    Gpm_Close
+#define my_Gpm_GetEvent Gpm_GetEvent
+#endif /* HAVE_LIBDL */
+#endif /* USE_GPM_SUPPORT */
+
+/*
+ * When converting from terminfo to termcap, check for cases where we can trim
+ * octal escapes down to 2-character form.  It is useful for terminfo format
+ * also, but not as important.
+ */
+#define MAX_TC_FIXUPS	10
+#define MIN_TC_FIXUPS	4
+
+#define isoctal(c) ((c) >= '0' && (c) <= '7')
+
+/*
+ * The filesystem database normally uses a single-letter for the lower level
+ * of directories.  Use a hexadecimal code for filesystems which do not
+ * preserve mixed-case names.
+ */
+#if MIXEDCASE_FILENAMES
+#define LEAF_FMT "%c"
+#define LEAF_LEN 1
+#else
+#define LEAF_FMT "%02x"
+#define LEAF_LEN 2
+#endif
+
+/*
+ * TRACEMSE_FMT is no longer than 80 columns, there are 5 numbers that
+ * could at most have 10 digits, and the mask contains no more than 32 bits
+ * with each bit representing less than 15 characters.  Usually the whole
+ * string is less than 80 columns, but this buffer size is an absolute
+ * limit.
+ */
+#define TRACEMSE_MAX	(80 + (5 * 10) + (32 * 15))
+#define TRACEMSE_FMT	"id %2d  at (%2d, %2d, %2d) state %4lx = {" /* } */
+
+#ifdef USE_TERM_DRIVER
+struct DriverTCB; /* Terminal Control Block forward declaration */
+#define INIT_TERM_DRIVER()	_nc_globals.term_driver = _nc_get_driver
+#else
+#define INIT_TERM_DRIVER()	/* nothing */
+#endif
+
+extern NCURSES_EXPORT_VAR(NCURSES_GLOBALS) _nc_globals;
+
+/* The limit reserves one byte for a terminating NUL */
+#define my_getstr_limit	(_nc_globals.getstr_limit - 1)
+#define _nc_getstr_limit(n) \
+	(((n) < 0) \
+	 ? my_getstr_limit \
+	 : (((n) > my_getstr_limit) \
+	    ? my_getstr_limit \
+	    : (n)))
+
+/*
+ * Use screen-specific ripoff data (for softkeys) rather than global.
+ */
+#ifdef USE_SP_RIPOFF
+#define safe_ripoff_sp     (sp)->rsp
+#define safe_ripoff_stack  (sp)->rippedoff
+#else
+#define safe_ripoff_sp	   _nc_prescreen.rsp
+#define safe_ripoff_stack  _nc_prescreen.rippedoff
+#endif
+
+extern NCURSES_EXPORT_VAR(NCURSES_PRESCREEN) _nc_prescreen;
+
+typedef enum {
+    ewInitial = 0,
+    ewRunning,
+    ewSuspend
+} ENDWIN;
+
+/*
+ * The SCREEN structure.
+ */
+typedef struct screen {
+	int		_ifd;		/* input file descriptor for screen */
+	int		_ofd;		/* output file descriptor for screen */
+	FILE		*_ofp;		/* output file ptr for screen	    */
+	char		*out_buffer;	/* output buffer		    */
+	size_t		out_limit;	/* output buffer size		    */
+	size_t		out_inuse;	/* output buffer current use	    */
+	bool		_filtered;	/* filter() was called		    */
+	bool		_prescreen;	/* is in prescreen phase	    */
+	bool		_use_env;	/* LINES & COLS from environment?   */
+	int		_checkfd;	/* filedesc for typeahead check	    */
+	TERMINAL	*_term;		/* terminal type information	    */
+	TTY		_saved_tty;	/* savetty/resetty information	    */
+	NCURSES_SIZE_T	_lines;		/* screen lines			    */
+	NCURSES_SIZE_T	_columns;	/* screen columns		    */
+
+	NCURSES_SIZE_T	_lines_avail;	/* lines available for stdscr	    */
+	NCURSES_SIZE_T	_topstolen;	/* lines stolen from top	    */
+
+	WINDOW		*_curscr;	/* current screen		    */
+	WINDOW		*_newscr;	/* virtual screen to be updated to  */
+	WINDOW		*_stdscr;	/* screen's full-window context	    */
+
+#define CurScreen(sp)  (sp)->_curscr
+#define NewScreen(sp)  (sp)->_newscr
+#define StdScreen(sp)  (sp)->_stdscr
+
+	TRIES		*_keytry;	/* "Try" for use with keypad mode   */
+	TRIES		*_key_ok;	/* Disabled keys via keyok(,FALSE)  */
+	bool		_tried;		/* keypad mode was initialized	    */
+	bool		_keypad_on;	/* keypad mode is currently on	    */
+
+	bool		_called_wgetch;	/* check for recursion in wgetch()  */
+	int		_fifo[FIFO_SIZE];	/* input push-back buffer   */
+	short		_fifohead,	/* head of fifo queue		    */
+			_fifotail,	/* tail of fifo queue		    */
+			_fifopeek,	/* where to peek for next char	    */
+			_fifohold;	/* set if breakout marked	    */
+
+	int		_endwin;	/* are we out of window mode?	    */
+	NCURSES_CH_T	*_current_attr; /* holds current attributes set	    */
+	int		_coloron;	/* is color enabled?		    */
+	int		_color_defs;	/* are colors modified		    */
+	int		_cursor;	/* visibility of the cursor	    */
+	int		_cursrow;	/* physical cursor row		    */
+	int		_curscol;	/* physical cursor column	    */
+	bool		_notty;		/* true if we cannot switch non-tty */
+	int		_nl;		/* True if NL -> CR/NL is on	    */
+	int		_raw;		/* True if in raw mode		    */
+	int		_cbreak;	/* 1 if in cbreak mode		    */
+					/* > 1 if in halfdelay mode	    */
+	int		_echo;		/* True if echo on		    */
+	int		_use_meta;	/* use the meta key?		    */
+	struct _SLK	*_slk;		/* ptr to soft key struct / NULL    */
+	int		slk_format;	/* selected format for this screen  */
+	/* cursor movement costs; units are 10ths of milliseconds */
+	int		_char_padding;	/* cost of character put	    */
+	int		_cr_cost;	/* cost of (carriage_return)	    */
+	int		_cup_cost;	/* cost of (cursor_address)	    */
+	int		_home_cost;	/* cost of (cursor_home)	    */
+	int		_ll_cost;	/* cost of (cursor_to_ll)	    */
+	int		_cub1_cost;	/* cost of (cursor_left)	    */
+	int		_cuf1_cost;	/* cost of (cursor_right)	    */
+	int		_cud1_cost;	/* cost of (cursor_down)	    */
+	int		_cuu1_cost;	/* cost of (cursor_up)		    */
+	int		_cub_cost;	/* cost of (parm_cursor_left)	    */
+	int		_cuf_cost;	/* cost of (parm_cursor_right)	    */
+	int		_cud_cost;	/* cost of (parm_cursor_down)	    */
+	int		_cuu_cost;	/* cost of (parm_cursor_up)	    */
+	int		_hpa_cost;	/* cost of (column_address)	    */
+	int		_vpa_cost;	/* cost of (row_address)	    */
+	/* used in tty_update.c, must be chars */
+	int		_ed_cost;	/* cost of (clr_eos)		    */
+	int		_el_cost;	/* cost of (clr_eol)		    */
+	int		_el1_cost;	/* cost of (clr_bol)		    */
+	int		_dch1_cost;	/* cost of (delete_character)	    */
+	int		_ich1_cost;	/* cost of (insert_character)	    */
+	int		_dch_cost;	/* cost of (parm_dch)		    */
+	int		_ich_cost;	/* cost of (parm_ich)		    */
+	int		_ech_cost;	/* cost of (erase_chars)	    */
+	int		_rep_cost;	/* cost of (repeat_char)	    */
+	int		_hpa_ch_cost;	/* cost of (column_address)	    */
+	int		_cup_ch_cost;	/* cost of (cursor_address)	    */
+	int		_cuf_ch_cost;	/* cost of (parm_cursor_right)	    */
+	int		_inline_cost;	/* cost of inline-move		    */
+	int		_smir_cost;	/* cost of (enter_insert_mode)	    */
+	int		_rmir_cost;	/* cost of (exit_insert_mode)	    */
+	int		_ip_cost;	/* cost of (insert_padding)	    */
+	/* used in lib_mvcur.c */
+	char *		_address_cursor;
+	/* used in tty_update.c */
+	int		_scrolling;	/* 1 if terminal's smart enough to  */
+
+	/* used in lib_color.c */
+	rgb_bits_t	_direct_color;	/* RGB overrides color-table	     */
+	color_t		*_color_table;	/* screen's color palette	     */
+	int		_color_count;	/* count of colors in palette	     */
+	colorpair_t	*_color_pairs;	/* screen's color pair list	     */
+	int		_pair_count;	/* same as COLOR_PAIRS               */
+	int		_pair_limit;	/* actual limit of color-pairs       */
+	int		_pair_alloc;	/* current table-size of color-pairs */
+	chtype		_ok_attributes; /* valid attributes for terminal     */
+	chtype		_xmc_suppress;	/* attributes to suppress if xmc     */
+	chtype		_xmc_triggers;	/* attributes to process if xmc	     */
+	chtype *	_acs_map;	/* the real alternate-charset map    */
+	bool *		_screen_acs_map;
+
+
+	/* used in lib_vidattr.c */
+	bool		_use_rmso;	/* true if we may use 'rmso'	     */
+	bool		_use_rmul;	/* true if we may use 'rmul'	     */
+
+	/*
+	 * These data correspond to the state of the idcok() and idlok()
+	 * functions.  A caveat is in order here:  the XSI and SVr4
+	 * documentation specify that these functions apply to the window which
+	 * is given as an argument.  However, ncurses implements this logic
+	 * only for the newscr/curscr update process, _not_ per-window.
+	 */
+	bool		_nc_sp_idlok;
+	bool		_nc_sp_idcok;
+
+	/*
+	 * These are the data that support the mouse interface.
+	 */
+	bool		_mouse_initialized;
+	MouseType	_mouse_type;
+	int		_maxclick;
+	bool		(*_mouse_event) (SCREEN *);
+	bool		(*_mouse_inline)(SCREEN *);
+	bool		(*_mouse_parse) (SCREEN *, int);
+	void		(*_mouse_resume)(SCREEN *);
+	void		(*_mouse_wrap)	(SCREEN *);
+	int		_mouse_fd;	/* file-descriptor, if any */
+	bool		_mouse_active;	/* true if initialized */
+	mmask_t		_mouse_mask;	/* set via mousemask() */
+	mmask_t		_mouse_mask2;	/* OR's in press/release bits */
+	mmask_t		_mouse_bstate;
+	MouseFormat	_mouse_format;	/* type of xterm mouse protocol */
+	NCURSES_CONST char *_mouse_xtermcap; /* string to enable/disable mouse */
+	MEVENT		_mouse_events[EV_MAX];	/* hold the last mouse event seen */
+	MEVENT		*_mouse_eventp;	/* next free slot in event queue */
+
+	/*
+	 * These are data that support the proper handling of the panel stack on an
+	 * per screen basis.
+	 */
+	struct panelhook _panelHook;
+
+	bool		_sig_winch;
+	SCREEN		*_next_screen;
+
+	/* hashes for old and new lines */
+	unsigned long	*oldhash, *newhash;
+	HASHMAP		*hashtab;
+	int		hashtab_len;
+	int		*_oldnum_list;
+	int		_oldnum_size;
+
+	NCURSES_SP_OUTC	_outch;		/* output handler if not putc */
+	NCURSES_OUTC	jump;
+
+	ripoff_t	rippedoff[N_RIPS];
+	ripoff_t	*rsp;
+
+	int		_legacy_coding;	/* see use_legacy_coding() */
+
+#if NCURSES_NO_PADDING
+	bool		_no_padding;	/* flag to set if padding disabled  */
+#endif
+
+#if USE_HARD_TABS
+	int		_ht_cost;	/* cost of (tab)		    */
+	int		_cbt_cost;	/* cost of (backtab)		    */
+#endif /* USE_HARD_TABS */
+
+	/* used in lib_vidattr.c */
+#if USE_ITALIC
+	bool		_use_ritm;	/* true if we may use 'ritm'	     */
+#endif
+
+	/* used in getch/twait */
+#if USE_KLIBC_KBD
+	bool		_extended_key;	/* true if an extended key	     */
+#endif
+
+	/* used in lib_color.c */
+#if NCURSES_EXT_FUNCS
+	bool		_assumed_color; /* use assumed colors		     */
+	bool		_default_color; /* use default colors		     */
+	bool		_has_sgr_39_49; /* has ECMA default color support    */
+	int		_default_fg;	/* assumed default foreground	     */
+	int		_default_bg;	/* assumed default background	     */
+	int		_default_pairs;	/* count pairs using default color   */
+#endif
+
+	/* system-dependent mouse data */
+#if USE_GPM_SUPPORT
+	bool		_mouse_gpm_loaded;
+	bool		_mouse_gpm_found;
+#ifdef HAVE_LIBDL
+	void		*_dlopen_gpm;
+	TYPE_gpm_fd	_mouse_gpm_fd;
+	TYPE_Gpm_Open	_mouse_Gpm_Open;
+	TYPE_Gpm_Close	_mouse_Gpm_Close;
+	TYPE_Gpm_GetEvent _mouse_Gpm_GetEvent;
+#endif
+	Gpm_Connect	_mouse_gpm_connect;
+#endif /* USE_GPM_SUPPORT */
+
+#if USE_EMX_MOUSE
+	int		_emxmouse_wfd;
+	int		_emxmouse_thread;
+	int		_emxmouse_activated;
+	char		_emxmouse_buttons[4];
+#endif
+
+#if USE_SYSMOUSE
+	MEVENT		_sysmouse_fifo[FIFO_SIZE];
+	int		_sysmouse_head;
+	int		_sysmouse_tail;
+	int		_sysmouse_char_width;	/* character width */
+	int		_sysmouse_char_height;	/* character height */
+	int		_sysmouse_old_buttons;
+	int		_sysmouse_new_buttons;
+#endif
+
+#if defined(USE_TERM_DRIVER) || defined(EXP_WIN32_DRIVER)
+	MEVENT		_drv_mouse_fifo[FIFO_SIZE];
+	int		_drv_mouse_head;
+	int		_drv_mouse_tail;
+	int		_drv_mouse_old_buttons;
+	int		_drv_mouse_new_buttons;
+#endif
+	/*
+	 * This supports automatic resizing
+	 */
+#if USE_SIZECHANGE
+	int		(*_resize)(NCURSES_SP_DCLx int y, int x);
+	int		(*_ungetch)(SCREEN *, int);
+#endif
+
+#ifdef USE_SP_WINDOWLIST
+	WINDOWLIST*	_windowlist;
+#define WindowList(sp)  (sp)->_windowlist
+#endif
+
+#if USE_REENTRANT
+	char		_ttytype[NAMESIZE];
+	int		_ESCDELAY;
+	int		_TABSIZE;
+	int		_LINES;
+	int		_COLS;
+#endif
+
+#if NCURSES_SP_FUNCS
+	bool		use_tioctl;
+#endif
+
+	/*
+	 * ncurses/ncursesw are the same up to this point.
+	 */
+#if USE_WIDEC_SUPPORT
+	/* recent versions of 'screen' have partially-working support for
+	 * UTF-8, but do not permit ACS at the same time (see tty_update.c).
+	 */
+	bool		_screen_acs_fix;
+	bool		_screen_unicode;
+#endif
+
+#if NCURSES_EXT_FUNCS && NCURSES_EXT_COLORS
+	void		*_ordered_pairs; /* index used by alloc_pair()	     */
+	int		_pairs_used;	/* actual number of color-pairs used */
+	int		_recent_pair;	/* number for most recent free-pair  */
+#endif
+
+#ifdef TRACE
+	char		tracechr_buf[40];
+	char		tracemse_buf[TRACEMSE_MAX];
+#if USE_REENTRANT
+	long		_outchars;
+	const char	*_tputs_trace;
+#endif
+#endif
+#undef SCREEN
+} SCREEN;
+
+extern NCURSES_EXPORT_VAR(SCREEN *) _nc_screen_chain;
+extern NCURSES_EXPORT_VAR(SIG_ATOMIC_T) _nc_have_sigwinch;
+
+	WINDOWLIST {
+	WINDOWLIST *next;
+	SCREEN *screen;		/* screen containing the window */
+	WINDOW	win;		/* WINDOW_EXT() needs to account for offset */
+#if NCURSES_WIDECHAR
+	char addch_work[(MB_LEN_MAX * 9) + 1];
+	unsigned addch_used;	/* number of bytes in addch_work[] */
+	int addch_x;		/* x-position for addch_work[] */
+	int addch_y;		/* y-position for addch_work[] */
+#endif
+};
+
+#define WINDOW_EXT(w,m) (((WINDOWLIST *)((void *)((char *)(w) - offsetof(WINDOWLIST, win))))->m)
+
+#ifdef USE_SP_WINDOWLIST
+#define SP_INIT_WINDOWLIST(sp)	WindowList(sp) = 0
+#else
+#define SP_INIT_WINDOWLIST(sp)	/* nothing */
+#endif
+
+#define SP_PRE_INIT(sp)                         \
+    sp->_cursrow = -1;                          \
+    sp->_curscol = -1;                          \
+    sp->_nl = TRUE;                             \
+    sp->_raw = FALSE;                           \
+    sp->_cbreak = 0;                            \
+    sp->_echo = TRUE;                           \
+    sp->_fifohead = -1;                         \
+    sp->_endwin = ewSuspend;                    \
+    sp->_cursor = -1;                           \
+    SP_INIT_WINDOWLIST(sp);                     \
+    sp->_outch = NCURSES_OUTC_FUNC;             \
+    sp->jump = 0                                \
+
+/* usually in <limits.h> */
+#ifndef UCHAR_MAX
+#define UCHAR_MAX 255
+#endif
+
+/* The terminfo source is assumed to be 7-bit ASCII */
+#define is7bits(c)	((unsigned)(c) < 128)
+
+/* Checks for isprint() should be done on 8-bit characters (non-wide) */
+#define is8bits(c)	((unsigned)(c) <= UCHAR_MAX)
+
+#ifndef min
+#define min(a,b)	((a) > (b)  ?  (b)  :  (a))
+#endif
+
+#ifndef max
+#define max(a,b)	((a) < (b)  ?  (b)  :  (a))
+#endif
+
+/* usually in <unistd.h> */
+#ifndef STDIN_FILENO
+#define STDIN_FILENO 0
+#endif
+
+#ifndef STDOUT_FILENO
+#define STDOUT_FILENO 1
+#endif
+
+#ifndef STDERR_FILENO
+#define STDERR_FILENO 2
+#endif
+
+#ifndef EXIT_SUCCESS
+#define EXIT_SUCCESS 0
+#endif
+
+#ifndef EXIT_FAILURE
+#define EXIT_FAILURE 1
+#endif
+
+#ifndef R_OK
+#define	R_OK	4		/* Test for read permission.  */
+#endif
+#ifndef W_OK
+#define	W_OK	2		/* Test for write permission.  */
+#endif
+#ifndef X_OK
+#define	X_OK	1		/* Test for execute permission.  */
+#endif
+#ifndef F_OK
+#define	F_OK	0		/* Test for existence.  */
+#endif
+
+#if HAVE_FCNTL_H
+#include <fcntl.h>		/* may define O_BINARY	*/
+#endif
+
+#ifndef O_BINARY
+#define O_BINARY 0
+#endif
+
+#ifdef TRACE
+#if USE_REENTRANT
+#define COUNT_OUTCHARS(n) _nc_count_outchars(n);
+#else
+#define COUNT_OUTCHARS(n) _nc_outchars += (n);
+#endif
+#else
+#define COUNT_OUTCHARS(n) /* nothing */
+#endif
+
+#define RESET_OUTCHARS() COUNT_OUTCHARS(-_nc_outchars)
+
+#define UChar(c)	((unsigned char)(c))
+#define UShort(c)	((unsigned short)(c))
+#define ChCharOf(c)	((chtype)(c) & (chtype)A_CHARTEXT)
+#define ChAttrOf(c)	((chtype)(c) & (chtype)A_ATTRIBUTES)
+
+#define TR_PUTC(c)	TR(TRACE_CHARPUT, ("PUTC %#x", UChar(c)))
+
+#ifndef MB_LEN_MAX
+#define MB_LEN_MAX 8 /* should be >= MB_CUR_MAX, but that may be a function */
+#endif
+
+#if USE_WIDEC_SUPPORT /* { */
+#define isEILSEQ(status) (((size_t)status == (size_t)-1) && (errno == EILSEQ))
+
+#define init_mb(state)	memset(&(state), 0, sizeof(state))
+
+#if NCURSES_EXT_COLORS
+#define NulColor	, 0
+#else
+#define NulColor	/* nothing */
+#endif
+
+#define NulChar		0,0,0,0	/* FIXME: see CCHARW_MAX */
+#define CharOf(c)	((c).chars[0])
+#define AttrOf(c)	((c).attr)
+
+#define AddAttr(c,a)	AttrOf(c) |=  ((a) & A_ATTRIBUTES)
+#define RemAttr(c,a)	AttrOf(c) &= ~((a) & A_ATTRIBUTES)
+#define SetAttr(c,a)	AttrOf(c) =   ((a) & A_ATTRIBUTES) | WidecExt(c)
+
+#define NewChar2(c,a)	{ a, { c, NulChar } NulColor }
+#define NewChar(ch)	NewChar2(ChCharOf(ch), ChAttrOf(ch))
+
+#if CCHARW_MAX == 5
+#define CharEq(a,b)	(((a).attr == (b).attr) \
+		       && (a).chars[0] == (b).chars[0] \
+		       && (a).chars[1] == (b).chars[1] \
+		       && (a).chars[2] == (b).chars[2] \
+		       && (a).chars[3] == (b).chars[3] \
+		       && (a).chars[4] == (b).chars[4] \
+			if_EXT_COLORS(&& (a).ext_color == (b).ext_color))
+#elif CCHARW_MAX > 0
+#error Inconsistent values for CCHARW_MAX
+#else
+#define CharEq(a,b)	(!memcmp(&(a), &(b), sizeof(a)))
+#endif
+
+#define SetChar(ch,c,a) do {							    \
+			    NCURSES_CH_T *_cp = &(ch);				    \
+			    memset(_cp, 0, sizeof(ch));				    \
+			    _cp->chars[0] = (wchar_t) (c);			    \
+			    _cp->attr = (a);					    \
+			    if_EXT_COLORS(SetPair(ch, PairNumber(a)));		    \
+			} while (0)
+#define CHREF(wch)	(&(wch))
+#define CHDEREF(wch)	(*(wch))
+#define ARG_CH_T	NCURSES_CH_T *
+#define CARG_CH_T	const NCURSES_CH_T *
+#define PUTC_DATA	char PUTC_buf[MB_LEN_MAX]; int PUTC_i, PUTC_n; \
+			mbstate_t PUT_st; wchar_t PUTC_ch
+#define PUTC_INIT	init_mb (PUT_st)
+#define PUTC(ch)	do { if(!isWidecExt(ch)) {				    \
+			if (Charable(ch)) {					    \
+			    TR_PUTC(CharOf(ch));				    \
+			    NCURSES_OUTC_FUNC (NCURSES_SP_ARGx CharOf(ch));	    \
+			    COUNT_OUTCHARS(1);					    \
+			} else {						    \
+			    for (PUTC_i = 0; PUTC_i < CCHARW_MAX; ++PUTC_i) {	    \
+				PUTC_ch = (ch).chars[PUTC_i];			    \
+				if (PUTC_ch == L'\0')				    \
+				    break;					    \
+				PUTC_INIT;					    \
+				PUTC_n = (int) wcrtomb(PUTC_buf,		    \
+						       (ch).chars[PUTC_i], &PUT_st); \
+				if (PUTC_n <= 0) {				    \
+				    if (PUTC_ch && is8bits(PUTC_ch) && PUTC_i == 0) { \
+					TR_PUTC(CharOf(ch));			    \
+					NCURSES_OUTC_FUNC (NCURSES_SP_ARGx CharOf(ch)); \
+				    }						    \
+				    break;					    \
+				} else {					    \
+				    int PUTC_j;					    \
+				    for (PUTC_j = 0; PUTC_j < PUTC_n; ++PUTC_j) {   \
+					TR_PUTC(PUTC_buf[PUTC_j]);		    \
+					NCURSES_OUTC_FUNC (NCURSES_SP_ARGx PUTC_buf[PUTC_j]); \
+				    }						    \
+				}						    \
+			    }							    \
+			    COUNT_OUTCHARS(PUTC_i);				    \
+			} } } while (0)
+
+#define BLANK		NewChar2(' ', WA_NORMAL)
+#define ZEROS		NewChar2('\0', WA_NORMAL)
+#define ISBLANK(ch)	((ch).chars[0] == L' ' && (ch).chars[1] == L'\0')
+
+	/*
+	 * Wide characters cannot be represented in the A_CHARTEXT mask of
+	 * attr_t's but an application might have set a narrow character there.
+	 * But even in that case, it would only be a printable character, or
+	 * zero.  Otherwise we can use those bits to tell if a cell is the
+	 * first or extension part of a wide character.
+	 */
+#define WidecExt(ch)	(int) (AttrOf(ch) & A_CHARTEXT)
+#define isWidecBase(ch)	(WidecExt(ch) == 1)
+#define isWidecExt(ch)	(WidecExt(ch) > 1 && WidecExt(ch) < 32)
+#define SetWidecExt(dst, ext)	AttrOf(dst) &= ~A_CHARTEXT,		\
+				AttrOf(dst) |= (attr_t) (ext + 1)
+
+#define if_WIDEC(code)  code
+#define Charable(ch)	(((SP_PARM->_legacy_coding)			\
+			 || (AttrOf(ch) & A_ALTCHARSET)			\
+			 || (!isWidecExt(ch))) &&			\
+			     (ch).chars[1] == L'\0' &&			\
+			     _nc_is_charable(CharOf(ch)))
+
+#define L(ch)		L ## ch
+#else /* }{ */
+#define CharOf(c)	ChCharOf(c)
+#define AttrOf(c)	ChAttrOf(c)
+#define AddAttr(c,a)	c |= (a)
+#define RemAttr(c,a)	c &= ~((a) & A_ATTRIBUTES)
+#define SetAttr(c,a)	c = ((c) & ~A_ATTRIBUTES) | (a)
+#define NewChar(ch)	(ch)
+#define NewChar2(c,a)	((c) | (a))
+#define CharEq(a,b)	((a) == (b))
+#define SetChar(ch,c,a)	ch = (c) | (a)
+#define CHREF(wch)	wch
+#define CHDEREF(wch)	wch
+#define ARG_CH_T	NCURSES_CH_T
+#define CARG_CH_T	NCURSES_CH_T
+#define PUTC_DATA	/* nothing */
+#define PUTC(ch)	{ \
+			    TR_PUTC(ch); \
+			    NCURSES_OUTC_FUNC (NCURSES_SP_ARGx (int) ch); \
+			}
+
+#define BLANK		(' '|A_NORMAL)
+#define ZEROS		('\0'|A_NORMAL)
+#define ISBLANK(ch)	(CharOf(ch) == ' ')
+
+#define isWidecExt(ch)	(0)
+#define if_WIDEC(code) /* nothing */
+
+#define Charable(ch)	((ch) >= ' ' && (ch) <= '~')
+#define L(ch)		ch
+#endif /* } */
+
+#define AttrOfD(ch)	AttrOf(CHDEREF(ch))
+#define CharOfD(ch)	CharOf(CHDEREF(ch))
+#define SetChar2(wch,ch)    SetChar(wch,ChCharOf(ch),ChAttrOf(ch))
+
+#define BLANK_ATTR	A_NORMAL
+#define BLANK_TEXT	L(' ')
+
+#define CHANGED     -1
+
+#define LEGALYX(w, y, x) \
+	      ((w) != 0 && \
+		((x) >= 0 && (x) <= (w)->_maxx && \
+		 (y) >= 0 && (y) <= (w)->_maxy))
+
+#define CHANGED_CELL(line,col) \
+	if (line->firstchar == _NOCHANGE) \
+		line->firstchar = line->lastchar = (NCURSES_SIZE_T) (col); \
+	else if ((col) < line->firstchar) \
+		line->firstchar = (NCURSES_SIZE_T) (col); \
+	else if ((col) > line->lastchar) \
+		line->lastchar = (NCURSES_SIZE_T) (col)
+
+#define CHANGED_RANGE(line,start,end) \
+	if (line->firstchar == _NOCHANGE \
+	 || line->firstchar > (start)) \
+		line->firstchar = (NCURSES_SIZE_T) (start); \
+	if (line->lastchar == _NOCHANGE \
+	 || line->lastchar < (end)) \
+		line->lastchar = (NCURSES_SIZE_T) (end)
+
+#define CHANGED_TO_EOL(line,start,end) \
+	if (line->firstchar == _NOCHANGE \
+	 || line->firstchar > (start)) \
+		line->firstchar = (NCURSES_SIZE_T) (start); \
+	line->lastchar = (NCURSES_SIZE_T) (end)
+
+#define SIZEOF(v) (sizeof(v)/sizeof(v[0]))
+
+#define FreeIfNeeded(p)  if ((p) != 0) free(p)
+
+/* FreeAndNull() is not a comma-separated expression because some compilers
+ * do not accept a mixture of void with values.
+ */
+#define FreeAndNull(p)   do { free(p); p = 0; } while (0)
+
+#include <nc_alloc.h>
+#include <nc_access.h>
+
+/*
+ * Use these for tic/infocmp malloc failures.  Generally the ncurses library
+ * tries to limp along after a failure.
+ */
+#define TYPE_MALLOC(type, size, name) \
+	do { \
+	    name = typeMalloc(type, size); \
+	    if (name == 0) \
+		_nc_err_abort(MSG_NO_MEMORY); \
+	} while (0)
+
+#define TYPE_CALLOC(type, size, name) \
+	do { \
+	    name = typeCalloc(type, size); \
+	    if (name == 0) \
+		_nc_err_abort(MSG_NO_MEMORY); \
+	} while (0)
+
+#define TYPE_REALLOC(type, size, name) \
+	do { \
+	    name = typeRealloc(type, size, name); \
+	    if (name == 0) \
+		_nc_err_abort(MSG_NO_MEMORY); \
+	} while (0)
+
+/*
+ * TTY bit definition for converting tabs to spaces.
+ */
+#ifdef TAB3
+# define OFLAGS_TABS TAB3	/* POSIX specifies TAB3 */
+#else
+# ifdef XTABS
+#  define OFLAGS_TABS XTABS	/* XTABS is usually the "same" */
+# else
+#  ifdef OXTABS
+#   define OFLAGS_TABS OXTABS	/* the traditional BSD equivalent */
+#  else
+#   define OFLAGS_TABS 0
+#  endif
+# endif
+#endif
+
+#ifdef __TANDEM
+#define ROOT_UID 65535
+#endif
+
+#ifndef ROOT_UID
+#define ROOT_UID 0
+#endif
+
+/*
+ * Standardize/simplify common loops
+ */
+#define each_screen(p) p = _nc_screen_chain; p != 0; p = (p)->_next_screen
+#define each_window(sp,p) p = WindowList(sp); p != 0; p = (p)->next
+#define each_ripoff(p) p = safe_ripoff_stack; (p - safe_ripoff_stack) < N_RIPS; ++p
+
+/*
+ * Prefixes for call/return points of library function traces.  We use these to
+ * instrument the public functions so that the traces can be easily transformed
+ * into regression scripts.
+ */
+#define T_CALLED(fmt) "called {" fmt
+#define T_CREATE(fmt) "create :" fmt
+#define T_RETURN(fmt) "return }" fmt
+
+#define NonNull(s)              ((s) != 0 ? s : "<null>")
+#define NonEmpty(s)             ((s) != 0 && *(s) != '\0')
+
+#ifdef TRACE
+
+#if USE_REENTRANT
+#define TPUTS_TRACE(s)	_nc_set_tputs_trace(s);
+#else
+#define TPUTS_TRACE(s)	_nc_tputs_trace = s;
+#endif
+
+#ifdef HAVE_CONSISTENT_GETENV
+#define START_TRACE() \
+	if ((_nc_tracing & TRACE_MAXIMUM) == 0) { \
+	    int t = _nc_getenv_num("NCURSES_TRACE"); \
+	    if (t >= 0) \
+		curses_trace((unsigned) t); \
+	}
+#else
+#define START_TRACE() /* nothing */
+#endif
+
+/*
+ * Many of the _tracef() calls use static buffers; lock the trace state before
+ * trying to fill them.
+ */
+#if USE_REENTRANT
+#define USE_TRACEF(mask) _nc_use_tracef(mask)
+extern NCURSES_EXPORT(int)	_nc_use_tracef (unsigned);
+extern NCURSES_EXPORT(void)	_nc_locked_tracef (const char *, ...) GCC_PRINTFLIKE(1,2);
+#else
+#define USE_TRACEF(mask) (_nc_tracing & (mask))
+#define _nc_locked_tracef _tracef
+#endif
+
+#define TR(n, a)	if (USE_TRACEF(n)) _nc_locked_tracef a
+#define T(a)		TR(TRACE_CALLS, a)
+#define TRACE_RETURN(value,type)     return _nc_retrace_##type((type)(value))
+#define TRACE_RETURN1(value,dst)     return _nc_retrace_##dst(value)
+#define TRACE_RETURN2(value,dst,src) return _nc_retrace_##dst##_##src(value)
+#define TRACE_RETURN_SP(value,type)  return _nc_retrace_##type(SP_PARM, value)
+
+typedef void VoidFunc(void);
+
+#define TR_FUNC_LEN		((sizeof(void *) + sizeof(void (*)(void))) * 2 + 4)
+#define TR_FUNC_BFR(max)	char tr_func_data[max][TR_FUNC_LEN]
+#define TR_FUNC_ARG(num,func)	_nc_fmt_funcptr(&tr_func_data[num][0], (const char *)&(func), sizeof((func)))
+
+#define returnAttr(code)	TRACE_RETURN(code,attr_t)
+#define returnBits(code)	TRACE_RETURN(code,unsigned)
+#define returnBool(code)	TRACE_RETURN(code,bool)
+#define returnCPtr(code)	TRACE_RETURN1(code,cptr)
+#define returnCVoidPtr(code)	TRACE_RETURN1(code,cvoid_ptr)
+#define returnChar(code)	TRACE_RETURN(code,char)
+#define returnChtype(code)	TRACE_RETURN(code,chtype)
+#define returnCode(code)	TRACE_RETURN(code,int)
+#define returnIntAttr(code)	TRACE_RETURN2(code,int,attr_t)
+#define returnMMask(code)	TRACE_RETURN_SP(code,mmask_t)
+#define returnPtr(code)		TRACE_RETURN1(code,ptr)
+#define returnSP(code)		TRACE_RETURN1(code,sp)
+#define returnVoid		T((T_RETURN(""))); return
+#define returnVoidPtr(code)	TRACE_RETURN1(code,void_ptr)
+#define returnWin(code)		TRACE_RETURN1(code,win)
+
+#define returnDB(rc)		do { TR(TRACE_DATABASE,(T_RETURN("code %d"), (rc))); return (rc); } while (0)
+#define returnPtrDB(rc)		do { TR(TRACE_DATABASE,(T_RETURN("%p"), (rc))); return (rc); } while (0)
+#define returnVoidDB		do { TR(TRACE_DATABASE,(T_RETURN(""))); return; } while (0)
+
+extern NCURSES_EXPORT(NCURSES_BOOL)     _nc_retrace_bool (int);
+extern NCURSES_EXPORT(NCURSES_CONST void *) _nc_retrace_cvoid_ptr (NCURSES_CONST void *);
+extern NCURSES_EXPORT(SCREEN *)         _nc_retrace_sp (SCREEN *);
+extern NCURSES_EXPORT(WINDOW *)         _nc_retrace_win (WINDOW *);
+extern NCURSES_EXPORT(attr_t)           _nc_retrace_attr_t (attr_t);
+extern NCURSES_EXPORT(char *)           _nc_retrace_ptr (char *);
+extern NCURSES_EXPORT(char *)           _nc_trace_ttymode(const TTY *tty);
+extern NCURSES_EXPORT(char *)           _nc_varargs (const char *, va_list);
+extern NCURSES_EXPORT(chtype)           _nc_retrace_chtype (chtype);
+extern NCURSES_EXPORT(const char *)     _nc_altcharset_name(attr_t, chtype);
+extern NCURSES_EXPORT(const char *)     _nc_retrace_cptr (const char *);
+extern NCURSES_EXPORT(char)             _nc_retrace_char (int);
+extern NCURSES_EXPORT(int)              _nc_retrace_int (int);
+extern NCURSES_EXPORT(int)              _nc_retrace_int_attr_t (attr_t);
+extern NCURSES_EXPORT(mmask_t)          _nc_retrace_mmask_t (SCREEN *, mmask_t);
+extern NCURSES_EXPORT(unsigned)         _nc_retrace_unsigned (unsigned);
+extern NCURSES_EXPORT(void *)           _nc_retrace_void_ptr (void *);
+extern NCURSES_EXPORT(void)             _nc_fifo_dump (SCREEN *);
+
+extern NCURSES_EXPORT(char *)           _nc_fmt_funcptr(char *, const char *, size_t);
+
+#if USE_REENTRANT
+NCURSES_WRAPPED_VAR(long, _nc_outchars);
+NCURSES_WRAPPED_VAR(const char *, _nc_tputs_trace);
+#define _nc_outchars       NCURSES_PUBLIC_VAR(_nc_outchars())
+#define _nc_tputs_trace    NCURSES_PUBLIC_VAR(_nc_tputs_trace())
+extern NCURSES_EXPORT(void)		_nc_set_tputs_trace (const char *);
+extern NCURSES_EXPORT(void)		_nc_count_outchars (long);
+#else
+extern NCURSES_EXPORT_VAR(const char *) _nc_tputs_trace;
+extern NCURSES_EXPORT_VAR(long)         _nc_outchars;
+#endif
+
+extern NCURSES_EXPORT_VAR(unsigned)     _nc_tracing;
+
+extern NCURSES_EXPORT(char *) _nc_tracebits (void);
+extern NCURSES_EXPORT(char *) _tracemouse (const MEVENT *);
+extern NCURSES_EXPORT(void) _tracedump (const char *, WINDOW *);
+
+#if USE_WIDEC_SUPPORT
+extern NCURSES_EXPORT(const char *) _nc_viswbuf2 (int, const wchar_t *);
+extern NCURSES_EXPORT(const char *) _nc_viswbufn (const wchar_t *, int);
+#endif
+
+extern NCURSES_EXPORT(const char *) _nc_viscbuf2 (int, const NCURSES_CH_T *, int);
+extern NCURSES_EXPORT(const char *) _nc_viscbuf (const NCURSES_CH_T *, int);
+
+#else /* !TRACE */
+
+#define START_TRACE() /* nothing */
+
+#define T(a)
+#define TR(n, a)
+#define TPUTS_TRACE(s)
+#define TR_FUNC_BFR(max)
+
+#define returnAttr(code)	return code
+#define returnBits(code)	return code
+#define returnBool(code)	return code
+#define returnCPtr(code)	return code
+#define returnCVoidPtr(code)	return code
+#define returnChar(code)	return ((char) code)
+#define returnChtype(code)	return code
+#define returnCode(code)	return code
+#define returnIntAttr(code)	return code
+#define returnMMask(code)	return code
+#define returnPtr(code)		return code
+#define returnSP(code)		return code
+#define returnVoid		return
+#define returnVoidPtr(code)	return code
+#define returnWin(code)		return code
+
+#define returnDB(code)		return code
+#define returnPtrDB(rc)		return rc
+#define returnVoidDB		return
+
+#endif /* TRACE/!TRACE */
+
+/*
+ * Workaround for defective implementation of gcc attribute warn_unused_result
+ */
+#if defined(__GNUC__) && defined(_FORTIFY_SOURCE)
+#define IGNORE_RC(func) errno = (int) func
+#else
+#define IGNORE_RC(func) (void) func
+#endif /* gcc workarounds */
+
+/*
+ * Return-codes for tgetent() and friends.
+ */
+#define TGETENT_YES  1		/* entry is found */
+#define TGETENT_NO   0		/* entry is not found */
+#define TGETENT_ERR -1		/* an error occurred */
+
+extern NCURSES_EXPORT(const char *) _nc_visbuf2 (int, const char *);
+extern NCURSES_EXPORT(const char *) _nc_visbufn (const char *, int);
+
+#define EMPTY_MODULE(name) \
+extern	NCURSES_EXPORT(void) name (void); \
+	NCURSES_EXPORT(void) name (void) { }
+
+#define ALL_BUT_COLOR ((chtype)~(A_COLOR))
+#define NONBLANK_ATTR (A_BOLD | A_DIM | A_BLINK | A_ITALIC)
+#define TPARM_ATTR    (A_STANDOUT | A_UNDERLINE | A_REVERSE | A_BLINK | A_DIM | A_BOLD | A_ALTCHARSET | A_INVIS | A_PROTECT)
+#define XMC_CONFLICT  (A_STANDOUT | A_UNDERLINE | A_REVERSE | A_BLINK | A_DIM | A_BOLD | A_INVIS | A_PROTECT | A_ITALIC)
+#define XMC_CHANGES(c) ((c) & SP_PARM->_xmc_suppress)
+
+#define toggle_attr_on(S,at) {\
+   if (PairNumber(at) > 0) {\
+      (S) = ((S) & ALL_BUT_COLOR) | (attr_t) (at);\
+   } else {\
+      (S) |= (attr_t) (at);\
+   }\
+   TR(TRACE_ATTRS, ("new attribute is %s", _traceattr((S))));}
+
+
+#define toggle_attr_off(S,at) {\
+   if (PairNumber(at) > 0) {\
+      (S) &= ~(at|A_COLOR);\
+   } else {\
+      (S) &= ~(at);\
+   }\
+   TR(TRACE_ATTRS, ("new attribute is %s", _traceattr((S))));}
+
+#define DelCharCost(sp,count) \
+		((parm_dch != 0) \
+		? sp->_dch_cost \
+		: ((delete_character != 0) \
+			? (sp->_dch1_cost * count) \
+			: INFINITY))
+
+#define InsCharCost(sp,count) \
+		((parm_ich != 0) \
+		? sp->_ich_cost \
+		: ((enter_insert_mode && exit_insert_mode) \
+		  ? sp->_smir_cost + sp->_rmir_cost + (sp->_ip_cost * count) \
+		  : ((insert_character != 0) \
+		    ? ((sp->_ich1_cost + sp->_ip_cost) * count) \
+		    : INFINITY)))
+
+#if USE_XMC_SUPPORT
+#define UpdateAttrs(sp,c) if (!SameAttrOf(SCREEN_ATTRS(sp), c)) { \
+				attr_t chg = AttrOf(SCREEN_ATTRS(sp)); \
+				VIDPUTS(sp, AttrOf(c), GetPair(c)); \
+				if (magic_cookie_glitch > 0 \
+				 && XMC_CHANGES((chg ^ AttrOf(SCREEN_ATTRS(sp))))) { \
+					T(("%s @%d before glitch %d,%d", \
+						__FILE__, __LINE__, \
+						sp->_cursrow, \
+						sp->_curscol)); \
+					NCURSES_SP_NAME(_nc_do_xmc_glitch)(NCURSES_SP_ARGx chg); \
+				} \
+			}
+#else
+#define UpdateAttrs(sp,c) if (!SameAttrOf(SCREEN_ATTRS(sp), c)) { \
+				    VIDPUTS(sp, AttrOf(c), GetPair(c)); \
+			}
+#endif
+
+/*
+ * Macros to make additional parameter to implement wgetch_events()
+ */
+#ifdef NCURSES_WGETCH_EVENTS
+#define EVENTLIST_0th(param) param
+#define EVENTLIST_1st(param) param
+#define EVENTLIST_2nd(param) , param
+#define TWAIT_MASK (TW_ANY | TW_EVENT)
+#else
+#define EVENTLIST_0th(param) void
+#define EVENTLIST_1st(param) /* nothing */
+#define EVENTLIST_2nd(param) /* nothing */
+#define TWAIT_MASK TW_ANY
+#endif
+
+#if NCURSES_EXPANDED && NCURSES_EXT_FUNCS
+
+#undef  toggle_attr_on
+#define toggle_attr_on(S,at) _nc_toggle_attr_on(&(S), at)
+extern NCURSES_EXPORT(void) _nc_toggle_attr_on (attr_t *, attr_t);
+
+#undef  toggle_attr_off
+#define toggle_attr_off(S,at) _nc_toggle_attr_off(&(S), at)
+extern NCURSES_EXPORT(void) _nc_toggle_attr_off (attr_t *, attr_t);
+
+#undef  DelCharCost
+#define DelCharCost(sp, count) NCURSES_SP_NAME(_nc_DelCharCost)(NCURSES_SP_ARGx count)
+
+#undef  InsCharCost
+#define InsCharCost(sp, count) NCURSES_SP_NAME(_nc_InsCharCost)(NCURSES_SP_ARGx count)
+
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(_nc_DelCharCost) (NCURSES_SP_DCLx int _c);
+extern NCURSES_EXPORT(int) NCURSES_SP_NAME(_nc_InsCharCost) (NCURSES_SP_DCLx int _c);
+
+#undef  UpdateAttrs
+#define UpdateAttrs(sp,c) NCURSES_SP_NAME(_nc_UpdateAttrs)(NCURSES_SP_ARGx CHREF(c))
+
+#if USE_WIDEC_SUPPORT || defined(NEED_NCURSES_CH_T)
+extern NCURSES_EXPORT(void) NCURSES_SP_NAME(_nc_UpdateAttrs) (NCURSES_SP_DCLx CARG_CH_T _c);
+#else
+extern NCURSES_EXPORT(void) NCURSES_SP_NAME(_nc_UpdateAttrs) (NCURSES_SP_DCLx chtype c);
+#endif
+
+#if NCURSES_SP_FUNCS
+extern NCURSES_EXPORT(int) _nc_DelCharCost (int);
+extern NCURSES_EXPORT(int) _nc_InsCharCost (int);
+extern NCURSES_EXPORT(void) _nc_UpdateAttrs (CARG_CH_T);
+#endif /* NCURSES_SP_FUNCS */
+
+#else
+
+extern NCURSES_EXPORT(void) _nc_expanded (void);
+
+#endif
+
+#if !NCURSES_EXT_FUNCS
+#define set_escdelay(value) ESCDELAY = value
+#endif
+
+#if !HAVE_GETCWD
+#define getcwd(buf,len) getwd(buf)
+#endif
+
+#define save_ttytype(termp) \
+	if (TerminalType(termp).term_names != 0) { \
+	    _nc_STRNCPY(ttytype, \
+	    		TerminalType(termp).term_names, \
+			NAMESIZE - 1); \
+	    ttytype[NAMESIZE - 1] = '\0'; \
+	}
+
+#if !NCURSES_WCWIDTH_GRAPHICS
+extern NCURSES_EXPORT(int) _nc_wacs_width(unsigned);
+#else
+#define _nc_wacs_width(ch) wcwidth(ch)
+#endif
+
+/* charable.c */
+#if USE_WIDEC_SUPPORT
+extern NCURSES_EXPORT(bool) _nc_is_charable(wchar_t);
+extern NCURSES_EXPORT(int) _nc_to_char(wint_t);
+extern NCURSES_EXPORT(wint_t) _nc_to_widechar(int);
+#endif
+
+/* comp_captab.c */
+typedef struct {
+	short	nte_name;	/* offset of name to hash on */
+	int	nte_type;	/* BOOLEAN, NUMBER or STRING */
+	short	nte_index;	/* index of associated variable in its array */
+	short	nte_link;	/* index in table of next hash, or -1 */
+} name_table_data;
+
+typedef struct
+{
+	short	from;
+	short	to;
+	short	source;
+} alias_table_data;
+
+/* comp_userdefs.c */
+typedef struct {
+	short	ute_name;	/* offset of name to hash on */
+	unsigned ute_type;	/* mask (BOOLEAN, NUMBER, STRING) */
+	unsigned ute_argc;	/* number of parameters */
+	unsigned ute_args;	/* bit-mask for string parameters */
+	short	ute_index;	/* index of associated variable in its array */
+	short	ute_link;	/* index in table of next hash, or -1 */
+} user_table_data;
+
+/* doupdate.c */
+#if USE_XMC_SUPPORT
+extern NCURSES_EXPORT(void) _nc_do_xmc_glitch (attr_t);
+#endif
+
+/* hardscroll.c */
+#if defined(TRACE) || defined(SCROLLDEBUG) || defined(HASHDEBUG)
+extern NCURSES_EXPORT(void) _nc_linedump (void);
+#endif
+
+/* lib_acs.c */
+extern NCURSES_EXPORT(void) _nc_init_acs (void); /* corresponds to traditional 'init_acs()' */
+extern NCURSES_EXPORT(int)  _nc_msec_cost (const char *const, int);  /* used by 'tack' program */
+
+/* lib_addch.c */
+#if USE_WIDEC_SUPPORT
+NCURSES_EXPORT(int) _nc_build_wch(WINDOW *win, ARG_CH_T ch);
+#endif
+
+/* lib_addstr.c */
+#if USE_WIDEC_SUPPORT && !(defined(USE_TERMLIB) || defined(USE_BUILD_CC))
+extern NCURSES_EXPORT(int) _nc_wchstrlen(const cchar_t *);
+#endif
+
+/* lib_color.c */
+extern NCURSES_EXPORT(int) _nc_init_color(SCREEN *, int, int, int, int);
+extern NCURSES_EXPORT(int) _nc_init_pair(SCREEN *, int, int, int);
+extern NCURSES_EXPORT(int) _nc_pair_content(SCREEN *, int, int *, int *);
+extern NCURSES_EXPORT(bool) _nc_reset_colors(void);
+extern NCURSES_EXPORT(void) _nc_reserve_pairs(SCREEN *, int);
+extern NCURSES_EXPORT(void) _nc_change_pair(SCREEN *, int);
+
+#define ReservePairs(sp,want) \
+	    if ((sp->_color_pairs == 0) || (want >= sp->_pair_alloc)) \
+		_nc_reserve_pairs(sp, want)
+
+/* lib_getch.c */
+extern NCURSES_EXPORT(int) _nc_wgetch(WINDOW *, int *, int EVENTLIST_2nd(_nc_eventlist *));
+
+/* lib_insch.c */
+extern NCURSES_EXPORT(int) _nc_insert_ch(SCREEN *, WINDOW *, chtype);
+
+/* lib_mvcur.c */
+#define INFINITY	1000000	/* cost: too high to use */
+
+extern NCURSES_EXPORT(int) _nc_mvcur(int yold, int xold, int ynew, int xnew);
+
+extern NCURSES_EXPORT(void) _nc_mvcur_init (void);
+extern NCURSES_EXPORT(void) _nc_mvcur_resume (void);
+extern NCURSES_EXPORT(void) _nc_mvcur_wrap (void);
+
+extern NCURSES_EXPORT(int) _nc_scrolln (int, int, int, int);
+
+extern NCURSES_EXPORT(void) _nc_screen_init (void);
+extern NCURSES_EXPORT(void) _nc_screen_resume (void);
+extern NCURSES_EXPORT(void) _nc_screen_wrap (void);
+
+/* lib_mouse.c */
+extern NCURSES_EXPORT(bool) _nc_has_mouse (SCREEN *);
+
+/* lib_mvcur.c */
+#define INFINITY	1000000	/* cost: too high to use */
+#define BAUDBYTE	9	/* 9 = 7 bits + 1 parity + 1 stop */
+
+/* lib_setup.c */
+extern NCURSES_EXPORT(char *) _nc_get_locale(void);
+extern NCURSES_EXPORT(int)    _nc_unicode_locale(void);
+extern NCURSES_EXPORT(int)    _nc_locale_breaks_acs(TERMINAL *);
+extern NCURSES_EXPORT(int)    _nc_setupterm(const char *, int, int *, int);
+extern NCURSES_EXPORT(void)   _nc_tinfo_cmdch(TERMINAL *, int);
+
+#ifdef USE_PTHREADS
+extern NCURSES_EXPORT(SCREEN *) _nc_find_prescr(void);
+extern NCURSES_EXPORT(void)   _nc_forget_prescr(void);
+#else
+#define _nc_find_prescr()     _nc_prescreen.allocated
+#define _nc_forget_prescr()   _nc_prescreen.allocated = 0
+#endif
+
+/* lib_set_term.c */
+extern NCURSES_EXPORT(int)    _nc_ripoffline(int, int(*)(WINDOW*, int));
+
+/* lib_setup.c */
+#define ExitTerminfo(code)    exit_terminfo(code)
+
+#define SETUP_FAIL ERR
+
+#define ret_error(rc, fmt, p, q)	if (errret) {\
+					    *errret = rc;\
+					    q;\
+					    returnCode(SETUP_FAIL);\
+					} else {\
+					    fprintf(stderr, fmt, p);\
+					    q;\
+					    ExitTerminfo(EXIT_FAILURE);\
+					}
+
+#define ret_error1(rc, fmt, p, q)	ret_error(rc, "'%s': " fmt, p, q)
+
+#define ret_error0(rc, msg)		if (errret) {\
+					    *errret = rc;\
+					    returnCode(SETUP_FAIL);\
+					} else {\
+					    fprintf(stderr, msg);\
+					    ExitTerminfo(EXIT_FAILURE);\
+					}
+
+/* lib_tstp.c */
+#if USE_SIGWINCH
+extern NCURSES_EXPORT(int) _nc_handle_sigwinch(SCREEN *);
+#else
+#define _nc_handle_sigwinch(a) /* nothing */
+#endif
+
+/* lib_wacs.c */
+#if USE_WIDEC_SUPPORT
+extern NCURSES_EXPORT(void) _nc_init_wacs(void);
+#endif
+
+typedef struct {
+    char *s_head;	/* beginning of the string (may be null) */
+    char *s_tail;	/* end of the string (may be null) */
+    size_t s_size;	/* current remaining size available */
+    size_t s_init;	/* total size available */
+} string_desc;
+
+/* strings.c */
+extern NCURSES_EXPORT(string_desc *) _nc_str_init (string_desc *, char *, size_t);
+extern NCURSES_EXPORT(string_desc *) _nc_str_null (string_desc *, size_t);
+extern NCURSES_EXPORT(string_desc *) _nc_str_copy (string_desc *, string_desc *);
+extern NCURSES_EXPORT(bool) _nc_safe_strcat (string_desc *, const char *);
+extern NCURSES_EXPORT(bool) _nc_safe_strcpy (string_desc *, const char *);
+
+#if !HAVE_STRSTR
+#define strstr _nc_strstr
+extern NCURSES_EXPORT(char *) _nc_strstr (const char *, const char *);
+#endif
+
+/* safe_sprintf.c */
+extern NCURSES_EXPORT(char *) _nc_printf_string (const char *, va_list);
+
+/* tries.c */
+extern NCURSES_EXPORT(int) _nc_add_to_try (TRIES **, const char *, unsigned);
+extern NCURSES_EXPORT(char *) _nc_expand_try (TRIES *, unsigned, int *, size_t);
+extern NCURSES_EXPORT(int) _nc_remove_key (TRIES **, unsigned);
+extern NCURSES_EXPORT(int) _nc_remove_string (TRIES **, const char *);
+
+/* elsewhere ... */
+extern NCURSES_EXPORT(SCREEN *) _nc_screen_of (WINDOW *);
+extern NCURSES_EXPORT(TERMINAL*) _nc_get_cur_term (void);
+extern NCURSES_EXPORT(WINDOW *) _nc_makenew (int, int, int, int, int);
+extern NCURSES_EXPORT(char *) _nc_trace_buf (int, size_t);
+extern NCURSES_EXPORT(char *) _nc_trace_bufcat (int, const char *);
+extern NCURSES_EXPORT(char *) _nc_tracechar (SCREEN *, int);
+extern NCURSES_EXPORT(char *) _nc_tracemouse (SCREEN *, MEVENT const *);
+extern NCURSES_EXPORT(char *) _nc_trace_mmask_t (SCREEN *, mmask_t);
+extern NCURSES_EXPORT(int) _nc_access (const char *, int);
+extern NCURSES_EXPORT(int) _nc_baudrate (int);
+extern NCURSES_EXPORT(int) _nc_freewin (WINDOW *);
+extern NCURSES_EXPORT(int) _nc_getenv_num (const char *);
+extern NCURSES_EXPORT(int) _nc_keypad (SCREEN *, int);
+extern NCURSES_EXPORT(int) _nc_ospeed (int);
+extern NCURSES_EXPORT(int) _nc_outch (int);
+extern NCURSES_EXPORT(int) _nc_putchar (int);
+extern NCURSES_EXPORT(int) _nc_putp(const char *, const char *);
+extern NCURSES_EXPORT(int) _nc_putp_flush(const char *, const char *);
+extern NCURSES_EXPORT(int) _nc_read_termcap_entry (const char *const, TERMTYPE2 *const);
+extern NCURSES_EXPORT(int) _nc_setup_tinfo(const char *, TERMTYPE2 *);
+extern NCURSES_EXPORT(int) _nc_setupscreen (int, int, FILE *, int, int);
+extern NCURSES_EXPORT(int) _nc_timed_wait (SCREEN *, int, int, int * EVENTLIST_2nd(_nc_eventlist *));
+extern NCURSES_EXPORT(void) _nc_init_termtype (TERMTYPE2 *const);
+extern NCURSES_EXPORT(void) _nc_do_color (int, int, int, NCURSES_OUTC);
+extern NCURSES_EXPORT(void) _nc_flush (void);
+extern NCURSES_EXPORT(void) _nc_free_entry (ENTRY *, TERMTYPE2 *);
+extern NCURSES_EXPORT(void) _nc_freeall (void);
+extern NCURSES_EXPORT(void) _nc_hash_map (void);
+extern NCURSES_EXPORT(void) _nc_init_keytry (SCREEN *);
+extern NCURSES_EXPORT(void) _nc_keep_tic_dir (const char *);
+extern NCURSES_EXPORT(void) _nc_make_oldhash (int i);
+extern NCURSES_EXPORT(void) _nc_scroll_oldhash (int n, int top, int bot);
+extern NCURSES_EXPORT(void) _nc_scroll_optimize (void);
+extern NCURSES_EXPORT(void) _nc_set_buffer (FILE *, int);
+extern NCURSES_EXPORT(void) _nc_setenv_num (const char *, int);
+extern NCURSES_EXPORT(void) _nc_signal_handler (int);
+extern NCURSES_EXPORT(void) _nc_synchook (WINDOW *);
+extern NCURSES_EXPORT(void) _nc_trace_tries (TRIES *);
+
+#if NCURSES_EXT_NUMBERS
+extern NCURSES_EXPORT(const TERMTYPE2 *) _nc_fallback2 (const char *);
+#else
+#define _nc_fallback2(tp) _nc_fallback(tp)
+#endif
+
+#if NCURSES_EXT_NUMBERS
+extern NCURSES_EXPORT(void) _nc_copy_termtype2 (TERMTYPE2 *, const TERMTYPE2 *);
+extern NCURSES_EXPORT(void) _nc_export_termtype2(TERMTYPE *, const TERMTYPE2 *);
+#else
+#define _nc_copy_termtype2(dst,src) _nc_copy_termtype((dst),(src))
+#define _nc_export_termtype2(dst,src) /* nothing */
+#define _nc_free_termtype2(t) _nc_free_termtype(t)
+/* also... */
+#define _nc_read_entry2 _nc_read_entry
+#endif
+
+#if NO_LEAKS
+extern NCURSES_EXPORT(void) _nc_alloc_entry_leaks(void);
+extern NCURSES_EXPORT(void) _nc_captoinfo_leaks(void);
+extern NCURSES_EXPORT(void) _nc_codes_leaks(void);
+extern NCURSES_EXPORT(void) _nc_comp_captab_leaks(void);
+extern NCURSES_EXPORT(void) _nc_comp_error_leaks(void);
+extern NCURSES_EXPORT(void) _nc_comp_scan_leaks(void);
+extern NCURSES_EXPORT(void) _nc_comp_userdefs_leaks(void);
+extern NCURSES_EXPORT(void) _nc_db_iterator_leaks(void);
+extern NCURSES_EXPORT(void) _nc_keyname_leaks(void);
+extern NCURSES_EXPORT(void) _nc_names_leaks(void);
+extern NCURSES_EXPORT(void) _nc_tgetent_leak(TERMINAL *);
+extern NCURSES_EXPORT(void) _nc_tgetent_leaks(void);
+#endif
+
+#if !(defined(USE_TERMLIB) || defined(USE_BUILD_CC))
+extern NCURSES_EXPORT(NCURSES_CH_T) _nc_render (WINDOW *, NCURSES_CH_T);
+extern NCURSES_EXPORT(int) _nc_waddch_nosync (WINDOW *, const NCURSES_CH_T);
+extern NCURSES_EXPORT(void) _nc_scroll_window (WINDOW *, int const, int const, int const, NCURSES_CH_T);
+#endif
+
+#if USE_WIDEC_SUPPORT
+extern NCURSES_EXPORT(int) _nc_insert_wch(WINDOW *, const cchar_t *);
+#endif
+
+#if USE_WIDEC_SUPPORT && !(defined(USE_TERMLIB) || defined(USE_BUILD_CC))
+extern NCURSES_EXPORT(size_t) _nc_wcrtomb (char *, wchar_t, mbstate_t *);
+#endif
+
+#if USE_SIZECHANGE
+extern NCURSES_EXPORT(void) _nc_update_screensize (SCREEN *);
+#endif
+
+#if HAVE_RESIZETERM
+extern NCURSES_EXPORT(void) _nc_resize_margins (WINDOW *);
+#else
+#define _nc_resize_margins(wp) /* nothing */
+#endif
+
+#ifdef NCURSES_WGETCH_EVENTS
+extern NCURSES_EXPORT(int) _nc_eventlist_timeout(_nc_eventlist *);
+#else
+#define wgetch_events(win, evl) wgetch(win)
+#define wgetnstr_events(win, str, maxlen, evl) wgetnstr(win, str, maxlen)
+#endif
+
+/*
+ * Wide-character macros to hide some platform-differences.
+ */
+#if USE_WIDEC_SUPPORT
+
+#if defined(_NC_WINDOWS) && !defined(_NC_MSC) && !defined(EXP_WIN32_DRIVER)
+/*
+ * MinGW has wide-character functions, but they do not work correctly.
+ */
+extern int __MINGW_NOTHROW _nc_wctomb(char *, wchar_t);
+#define wctomb(s,wc) _nc_wctomb(s,wc)
+#define wcrtomb(s,wc,n) _nc_wctomb(s,wc)
+
+extern int __MINGW_NOTHROW _nc_mbtowc(wchar_t *, const char *, size_t);
+#define mbtowc(pwc,s,n) _nc_mbtowc(pwc,s,n)
+
+extern int __MINGW_NOTHROW _nc_mblen(const char *, size_t);
+#define mblen(s,n) _nc_mblen(s, n)
+
+#endif /* _NC_WINDOWS && !_NC_MSC */
+
+#if HAVE_MBTOWC && HAVE_MBLEN
+#define reset_mbytes(state) IGNORE_RC(mblen(NULL, (size_t) 0)), IGNORE_RC(mbtowc(NULL, NULL, (size_t) 0))
+#define count_mbytes(buffer,length,state) mblen(buffer,length)
+#define check_mbytes(wch,buffer,length,state) \
+	(int) mbtowc(&(wch), buffer, length)
+#define state_unused
+#elif HAVE_MBRTOWC && HAVE_MBRLEN
+#define reset_mbytes(state) init_mb(state)
+#define count_mbytes(buffer,length,state) mbrlen(buffer,length,&(state))
+#define check_mbytes(wch,buffer,length,state) \
+	(int) mbrtowc(&(wch), buffer, length, &(state))
+#else
+make an error
+#endif
+
+#endif /* USE_WIDEC_SUPPORT */
+
+/*
+ * Not everyone has vsscanf(), but we'd like to use it for scanw().
+ */
+#if !HAVE_VSSCANF
+extern int vsscanf(const char *str, const char *format, va_list __arg);
+#endif
+
+/* scroll indices */
+extern NCURSES_EXPORT_VAR(int *) _nc_oldnums;
+
+#define USE_SETBUF_0 0
+
+#define NC_OUTPUT(sp) ((sp != 0 && sp->_ofp != 0) ? sp->_ofp : stdout)
+
+/*
+ * On systems with a broken linker, define 'SP' as a function to force the
+ * linker to pull in the data-only module with 'SP'.
+ */
+#define _nc_alloc_screen_sp() typeCalloc(SCREEN, 1)
+
+#if BROKEN_LINKER
+#define SP _nc_screen()
+extern NCURSES_EXPORT(SCREEN *) _nc_screen (void);
+extern NCURSES_EXPORT(int)      _nc_alloc_screen (void);
+extern NCURSES_EXPORT(void)     _nc_set_screen (SCREEN *);
+#define CURRENT_SCREEN          _nc_screen()
+#else
+/* current screen is private data; avoid possible linking conflicts too */
+extern NCURSES_EXPORT_VAR(SCREEN *) SP;
+#define CURRENT_SCREEN SP
+#define _nc_alloc_screen()      ((SP = _nc_alloc_screen_sp()) != 0)
+#define _nc_set_screen(sp)      SP = sp
+#endif
+
+#if NCURSES_SP_FUNCS
+#define CURRENT_SCREEN_PRE      (IsPreScreen(CURRENT_SCREEN) ? CURRENT_SCREEN : new_prescr())
+#else
+#define CURRENT_SCREEN_PRE      CURRENT_SCREEN
+#endif
+
+/*
+ * We don't want to use the lines or columns capabilities internally, because
+ * if the application is running multiple screens under X, it is quite possible
+ * they could all have type xterm but have different sizes!  So...
+ */
+#define screen_lines(sp)        (sp)->_lines
+#define screen_columns(sp)      (sp)->_columns
+
+extern NCURSES_EXPORT(int) _nc_slk_initialize (WINDOW *, int);
+extern NCURSES_EXPORT(int) _nc_format_slks (NCURSES_SP_DCLx int _c);
+
+/*
+ * Some constants related to SLK's
+ */
+#define MAX_SKEY_OLD	   8	/* count of soft keys */
+#define MAX_SKEY_LEN_OLD   8	/* max length of soft key text */
+#define MAX_SKEY_PC       12    /* This is what most PC's have */
+#define MAX_SKEY_LEN_PC    5
+
+/* Macro to check whether or not we use a standard format */
+#define SLK_STDFMT(fmt) (fmt < 3)
+/* Macro to determine height of label window */
+#define SLK_LINES(fmt)  (SLK_STDFMT(fmt) ? 1 : ((fmt) - 2))
+
+#define MAX_SKEY(fmt)     (SLK_STDFMT(fmt)? MAX_SKEY_OLD : MAX_SKEY_PC)
+#define MAX_SKEY_LEN(fmt) (SLK_STDFMT(fmt)? MAX_SKEY_LEN_OLD : MAX_SKEY_LEN_PC)
+
+/*
+ * Common error messages
+ */
+#define MSG_NO_MEMORY "Out of memory"
+#define MSG_NO_INPUTS "Premature EOF"
+
+extern NCURSES_EXPORT(int) _nc_set_tty_mode(TTY *);
+extern NCURSES_EXPORT(int) _nc_get_tty_mode(TTY *);
+
+/* timed_wait flag definitions */
+#define TW_NONE    0
+#define TW_INPUT   1
+#define TW_MOUSE   2
+#define TW_ANY     (TW_INPUT | TW_MOUSE)
+#define TW_EVENT   4
+
+#define SetSafeOutcWrapper(outc)	    \
+    SCREEN* sp = CURRENT_SCREEN;            \
+    struct screen outc_wrapper;		    \
+    if (sp==0) {                            \
+	sp = &outc_wrapper;                 \
+	memset(sp,0,sizeof(struct screen)); \
+	sp->_outch = _nc_outc_wrapper;      \
+    }\
+    sp->jump = outc
+
+#ifdef USE_TERM_DRIVER
+
+typedef struct _termInfo
+{
+    bool caninit;
+
+    bool hascolor;
+    bool initcolor;
+    bool canchange;
+
+    int  tabsize;
+
+    int  maxcolors;
+    int  maxpairs;
+    int  nocolorvideo;
+
+    int  numbuttons;
+    int  numlabels;
+    int  labelwidth;
+    int  labelheight;
+
+    const color_t* defaultPalette;
+} TerminalInfo;
+
+typedef struct term_driver {
+    bool   isTerminfo;
+    const char* (*td_name)(struct DriverTCB*);
+    bool   (*td_CanHandle)(struct DriverTCB*, const char*, int*);
+    void   (*td_init)(struct DriverTCB*);
+    void   (*td_release)(struct DriverTCB*);
+    int    (*td_size)(struct DriverTCB*, int* Line, int *Cols);
+    int    (*td_sgmode)(struct DriverTCB*, int setFlag, TTY*);
+    chtype (*td_conattr)(struct DriverTCB*);
+    int    (*td_hwcur)(struct DriverTCB*, int yold, int xold, int y, int x);
+    int    (*td_mode)(struct DriverTCB*, int progFlag, int defFlag);
+    bool   (*td_rescol)(struct DriverTCB*);
+    bool   (*td_rescolors)(struct DriverTCB*);
+    void   (*td_color)(struct DriverTCB*, int fore, int color, int(*)(SCREEN*, int));
+    int    (*td_doBeepOrFlash)(struct DriverTCB*, int);
+    void   (*td_initpair)(struct DriverTCB*, int, int, int);
+    void   (*td_initcolor)(struct DriverTCB*, int, int, int, int);
+    void   (*td_docolor)(struct DriverTCB*, int, int, int, int(*)(SCREEN*, int));
+    void   (*td_initmouse)(struct DriverTCB*);
+    int    (*td_testmouse)(struct DriverTCB*, int EVENTLIST_2nd(_nc_eventlist*));
+    void   (*td_setfilter)(struct DriverTCB*);
+    void   (*td_hwlabel)(struct DriverTCB*, int, char*);
+    void   (*td_hwlabelOnOff)(struct DriverTCB*, int);
+    int    (*td_update)(struct DriverTCB*);
+    int    (*td_defaultcolors)(struct DriverTCB*, int, int);
+    int    (*td_print)(struct DriverTCB*, char*, int);
+    int    (*td_getsize)(struct DriverTCB*, int*, int*);
+    int    (*td_setsize)(struct DriverTCB*, int, int);
+    void   (*td_initacs)(struct DriverTCB*, chtype*, chtype*);
+    void   (*td_scinit)(SCREEN *);
+    void   (*td_scexit)(SCREEN *);
+    int    (*td_twait)(struct DriverTCB*, int, int, int* EVENTLIST_2nd(_nc_eventlist*));
+    int    (*td_read)(struct DriverTCB*, int*);
+    int    (*td_nap)(struct DriverTCB*, int);
+    int    (*td_kpad)(struct DriverTCB*, int);
+    int    (*td_kyOk)(struct DriverTCB*, int, int);
+    bool   (*td_kyExist)(struct DriverTCB*, int);
+    int    (*td_cursorSet)(struct DriverTCB*, int);
+} TERM_DRIVER;
+
+typedef struct DriverTCB
+{
+    TERMINAL      term;   /* needs to be the first Element !!! */
+    TERM_DRIVER*  drv;    /* The driver for that Terminal */
+    SCREEN*       csp;    /* The screen that owns that Terminal */
+    TerminalInfo  info;   /* Driver independent core capabilities of the Terminal */
+    void*         prop;   /* Driver dependent property storage to be used by the Driver */
+    long          magic;
+} TERMINAL_CONTROL_BLOCK;
+
+#define NCDRV_MAGIC(id) (0x47110000 | (id&0xffff))
+#define NCDRV_TINFO      0x01
+#define NCDRV_WINCONSOLE 0x02
+
+#define TCBOf(sp)    ((TERMINAL_CONTROL_BLOCK*)(TerminalOf(sp)))
+#define InfoOf(sp)   TCBOf(sp)->info
+#define CallDriver(sp,method)                        TCBOf(sp)->drv->method(TCBOf(sp))
+#define CallDriver_1(sp,method,arg1)                 TCBOf(sp)->drv->method(TCBOf(sp),arg1)
+#define CallDriver_2(sp,method,arg1,arg2)            TCBOf(sp)->drv->method(TCBOf(sp),arg1,arg2)
+#define CallDriver_3(sp,method,arg1,arg2,arg3)       TCBOf(sp)->drv->method(TCBOf(sp),arg1,arg2,arg3)
+#define CallDriver_4(sp,method,arg1,arg2,arg3,arg4)  TCBOf(sp)->drv->method(TCBOf(sp),arg1,arg2,arg3,arg4)
+
+extern NCURSES_EXPORT_VAR(const color_t*) _nc_cga_palette;
+extern NCURSES_EXPORT_VAR(const color_t*) _nc_hls_palette;
+
+extern NCURSES_EXPORT(int)      _nc_get_driver(TERMINAL_CONTROL_BLOCK*, const char*, int*);
+extern NCURSES_EXPORT(void)     _nc_get_screensize_ex(SCREEN *, TERMINAL *, int *, int *);
+#endif /* USE_TERM_DRIVER */
+
+/*
+ * Entrypoints which are actually provided in the terminal driver, which would
+ * be an sp-name otherwise.
+ */
+#ifdef USE_TERM_DRIVER
+#define TINFO_HAS_KEY           _nc_tinfo_has_key
+#define TINFO_DOUPDATE          _nc_tinfo_doupdate
+#define TINFO_MVCUR             _nc_tinfo_mvcur
+extern NCURSES_EXPORT(int)      TINFO_HAS_KEY(SCREEN*, int);
+extern NCURSES_EXPORT(int)      TINFO_DOUPDATE(SCREEN *);
+extern NCURSES_EXPORT(int)      TINFO_MVCUR(SCREEN*, int, int, int, int);
+#else
+#define TINFO_HAS_KEY           NCURSES_SP_NAME(has_key)
+#define TINFO_DOUPDATE          NCURSES_SP_NAME(doupdate)
+#define TINFO_MVCUR             NCURSES_SP_NAME(_nc_mvcur)
+#endif
+
+#if defined(EXP_WIN32_DRIVER)
+#include <nc_win32.h>
+#endif
+
+/*
+ * Entrypoints using an extra parameter with the terminal driver.
+ */
+#ifdef USE_TERM_DRIVER
+extern NCURSES_EXPORT(void)   _nc_get_screensize(SCREEN *, TERMINAL *, int *, int *);
+extern NCURSES_EXPORT(int)    _nc_setupterm_ex(TERMINAL **, const char *, int , int *, int);
+#define TINFO_GET_SIZE(sp, tp, lp, cp) \
+	_nc_get_screensize(sp, tp, lp, cp)
+#define TINFO_SET_CURTERM(sp, tp) \
+	NCURSES_SP_NAME(set_curterm)(sp, tp)
+#define TINFO_SETUP_TERM(tpp, name, fd, err, reuse) \
+	_nc_setupterm_ex(tpp, name, fd, err, reuse)
+#else /* !USE_TERM_DRIVER */
+extern NCURSES_EXPORT(void)   _nc_get_screensize(SCREEN *, int *, int *);
+#define TINFO_GET_SIZE(sp, tp, lp, cp) \
+	_nc_get_screensize(sp, lp, cp)
+#define TINFO_SET_CURTERM(sp, tp) \
+	set_curterm(tp)
+#define TINFO_SETUP_TERM(tpp, name, fd, err, reuse) \
+	_nc_setupterm(name, fd, err, reuse)
+#endif /* !USE_TERM_DRIVER */
+
+#ifdef EXP_WIN32_DRIVER
+extern NCURSES_EXPORT_VAR(TERM_DRIVER) _nc_TINFO_DRIVER;
+#else
+#ifdef USE_TERM_DRIVER
+#if defined(USE_WIN32CON_DRIVER)
+#include <nc_mingw.h>
+extern NCURSES_EXPORT_VAR(TERM_DRIVER) _nc_WIN_DRIVER;
+extern NCURSES_EXPORT(int)  _nc_mingw_isatty(int fd);
+extern NCURSES_EXPORT(int)  _nc_mingw_isconsole(int fd);
+extern NCURSES_EXPORT(int) _nc_mingw_console_read(
+    SCREEN *sp,
+    HANDLE  fd,
+    int *buf);
+extern NCURSES_EXPORT(int) _nc_mingw_testmouse(
+    SCREEN * sp,
+    HANDLE fd,
+    int delay EVENTLIST_2nd(_nc_eventlist*));
+#else
+#endif
+extern NCURSES_EXPORT_VAR(TERM_DRIVER) _nc_TINFO_DRIVER;
+#endif /* USE_TERM_DRIVER */
+#endif /* EXP_WIN32_DRIVER */
+
+#if defined(USE_TERM_DRIVER) && defined(EXP_WIN32_DRIVER)
+#define NC_ISATTY(fd) (0 != _nc_console_isatty(fd))
+#elif defined(USE_TERM_DRIVER) && defined(USE_WIN32CON_DRIVER)
+#define NC_ISATTY(fd) _nc_mingw_isatty(fd)
+#else
+#define NC_ISATTY(fd) isatty(fd)
+#endif
+
+#ifdef USE_TERM_DRIVER
+#  define IsTermInfo(sp)       ((TCBOf(sp) != 0) && ((TCBOf(sp)->drv->isTerminfo)))
+#  define HasTInfoTerminal(sp) ((0 != TerminalOf(sp)) && IsTermInfo(sp))
+#  if defined(EXP_WIN32_DRIVER)
+#    define IsTermInfoOnConsole(sp) (IsTermInfo(sp) && _nc_console_test(TerminalOf(sp)->Filedes))
+#  elif defined(USE_WIN32CON_DRIVER)
+#    define IsTermInfoOnConsole(sp) (IsTermInfo(sp) && _nc_mingw_isconsole(TerminalOf(sp)->Filedes))
+#  else
+#    define IsTermInfoOnConsole(sp) FALSE
+#  endif
+#else
+#  define IsTermInfo(sp)       TRUE
+#  define HasTInfoTerminal(sp) (0 != TerminalOf(sp))
+#  if defined(EXP_WIN32_DRIVER)
+#    define IsTermInfoOnConsole(sp) _nc_console_test(TerminalOf(sp)->Filedes)
+#  else
+#    define IsTermInfoOnConsole(sp) FALSE
+#  endif
+#endif
+
+#define IsValidTIScreen(sp)  (HasTInfoTerminal(sp))
+
+/*
+ * Exported entrypoints beyond the published API
+ */
+#if NCURSES_SP_FUNCS
+extern NCURSES_EXPORT(WINDOW *) _nc_curscr_of(SCREEN*);
+extern NCURSES_EXPORT(WINDOW *) _nc_newscr_of(SCREEN*);
+extern NCURSES_EXPORT(WINDOW *) _nc_stdscr_of(SCREEN*);
+extern NCURSES_EXPORT(int)      _nc_outc_wrapper(SCREEN*,int);
+
+#if USE_REENTRANT
+extern NCURSES_EXPORT(int)       NCURSES_SP_NAME(_nc_TABSIZE)(SCREEN*);
+extern NCURSES_EXPORT(char *)    NCURSES_SP_NAME(longname)(SCREEN*);
+#endif
+
+#if NCURSES_EXT_FUNCS
+extern NCURSES_EXPORT(int)      NCURSES_SP_NAME(_nc_set_tabsize)(SCREEN*, int);
+#endif
+
+/*
+ * We put the safe versions of various calls here as they are not published
+ * part of the API up to now
+ */
+extern NCURSES_EXPORT(TERMINAL*) NCURSES_SP_NAME(_nc_get_cur_term) (SCREEN *sp);
+extern NCURSES_EXPORT(WINDOW *) NCURSES_SP_NAME(_nc_makenew) (SCREEN*, int, int, int, int, int);
+extern NCURSES_EXPORT(bool)     NCURSES_SP_NAME(_nc_reset_colors)(SCREEN*);
+extern NCURSES_EXPORT(char *)   NCURSES_SP_NAME(_nc_printf_string)(SCREEN*, const char *, va_list);
+extern NCURSES_EXPORT(chtype)   NCURSES_SP_NAME(_nc_acs_char)(SCREEN*,int);
+extern NCURSES_EXPORT(int)      NCURSES_SP_NAME(_nc_get_tty_mode)(SCREEN*,TTY*);
+extern NCURSES_EXPORT(int)      NCURSES_SP_NAME(_nc_mcprint)(SCREEN*,char*, int);
+extern NCURSES_EXPORT(int)      NCURSES_SP_NAME(_nc_msec_cost)(SCREEN*, const char *, int);
+extern NCURSES_EXPORT(int)      NCURSES_SP_NAME(_nc_mvcur)(SCREEN*, int, int, int, int);
+extern NCURSES_EXPORT(int)      NCURSES_SP_NAME(_nc_outch)(SCREEN*, int);
+extern NCURSES_EXPORT(int)      NCURSES_SP_NAME(_nc_putchar)(SCREEN*, int);
+extern NCURSES_EXPORT(int)      NCURSES_SP_NAME(_nc_putp)(SCREEN*, const char *, const char*);
+extern NCURSES_EXPORT(int)      NCURSES_SP_NAME(_nc_putp_flush)(SCREEN*, const char *, const char *);
+extern NCURSES_EXPORT(int)      NCURSES_SP_NAME(_nc_ripoffline)(SCREEN*, int, int (*)(WINDOW *,int));
+extern NCURSES_EXPORT(int)      NCURSES_SP_NAME(_nc_scrolln)(SCREEN*, int, int, int, int);
+extern NCURSES_EXPORT(int)      NCURSES_SP_NAME(_nc_set_tty_mode)(SCREEN*, TTY*);
+extern NCURSES_EXPORT(int)      NCURSES_SP_NAME(_nc_setupscreen)(SCREEN**, int, int, FILE *, int, int);
+extern NCURSES_EXPORT(int)      NCURSES_SP_NAME(_nc_tgetent)(SCREEN*,char*,const char *);
+extern NCURSES_EXPORT(void)     NCURSES_SP_NAME(_nc_do_color)(SCREEN*, int, int, int, NCURSES_SP_OUTC);
+extern NCURSES_EXPORT(void)     NCURSES_SP_NAME(_nc_do_xmc_glitch)(SCREEN*, attr_t);
+extern NCURSES_EXPORT(void)     NCURSES_SP_NAME(_nc_flush)(SCREEN*);
+extern GCC_NORETURN NCURSES_EXPORT(void) NCURSES_SP_NAME(_nc_free_and_exit)(SCREEN*, int);
+extern NCURSES_EXPORT(void)     NCURSES_SP_NAME(_nc_freeall)(SCREEN*);
+extern NCURSES_EXPORT(void)     NCURSES_SP_NAME(_nc_hash_map)(SCREEN*);
+extern NCURSES_EXPORT(void)     NCURSES_SP_NAME(_nc_init_acs)(SCREEN*);
+extern NCURSES_EXPORT(void)     NCURSES_SP_NAME(_nc_make_oldhash)(SCREEN*, int i);
+extern NCURSES_EXPORT(void)     NCURSES_SP_NAME(_nc_mvcur_init)(SCREEN*);
+extern NCURSES_EXPORT(void)     NCURSES_SP_NAME(_nc_mvcur_resume)(SCREEN*);
+extern NCURSES_EXPORT(void)     NCURSES_SP_NAME(_nc_mvcur_wrap)(SCREEN*);
+extern NCURSES_EXPORT(void)     NCURSES_SP_NAME(_nc_screen_init)(SCREEN*);
+extern NCURSES_EXPORT(void)     NCURSES_SP_NAME(_nc_screen_resume)(SCREEN*);
+extern NCURSES_EXPORT(void)     NCURSES_SP_NAME(_nc_screen_wrap)(SCREEN*);
+extern NCURSES_EXPORT(void)     NCURSES_SP_NAME(_nc_scroll_oldhash)(SCREEN*, int n, int top, int bot);
+extern NCURSES_EXPORT(void)     NCURSES_SP_NAME(_nc_scroll_optimize)(SCREEN*);
+extern NCURSES_EXPORT(void)     NCURSES_SP_NAME(_nc_set_buffer)(SCREEN*, FILE *, int);
+
+extern NCURSES_EXPORT(void)     _nc_cookie_init(SCREEN *sp);
+
+#if defined(TRACE) || defined(SCROLLDEBUG) || defined(HASHDEBUG)
+extern NCURSES_EXPORT(void)     NCURSES_SP_NAME(_nc_linedump)(SCREEN*);
+#endif
+
+#if USE_WIDEC_SUPPORT
+extern NCURSES_EXPORT(wchar_t *) NCURSES_SP_NAME(_nc_wunctrl)(SCREEN*, cchar_t *);
+#endif
+
+#endif /* NCURSES_SP_FUNCS */
+
+#if NCURSES_SP_FUNCS
+
+#define safe_keyname NCURSES_SP_NAME(keyname)
+#define safe_unctrl  NCURSES_SP_NAME(unctrl)
+#define safe_ungetch NCURSES_SP_NAME(ungetch)
+
+#else
+
+#define safe_keyname _nc_keyname
+#define safe_unctrl  _nc_unctrl
+#define safe_ungetch _nc_ungetch
+
+extern NCURSES_EXPORT(NCURSES_CONST char *) _nc_keyname (SCREEN *, int);
+extern NCURSES_EXPORT(int) _nc_ungetch (SCREEN *, int);
+extern NCURSES_EXPORT(NCURSES_CONST char *) _nc_unctrl (SCREEN *, chtype);
+
+#endif
+
+#ifdef EXP_XTERM_1005
+NCURSES_EXPORT(int) _nc_conv_to_utf8(unsigned char *, unsigned, unsigned);
+NCURSES_EXPORT(int) _nc_conv_to_utf32(unsigned *, const char *, unsigned);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+/* *INDENT-ON* */
+
+#endif /* CURSES_PRIV_H */
diff --git a/ncurses/fifo_defs.h b/ncurses/fifo_defs.h
new file mode 100644
index 0000000..ab9266d
--- /dev/null
+++ b/ncurses/fifo_defs.h
@@ -0,0 +1,86 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2012,2016 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ ****************************************************************************/
+
+/*
+ * Common macros for lib_getch.c, lib_ungetch.c
+ *
+ * $Id: fifo_defs.h,v 1.9 2020/02/02 23:34:34 tom Exp $
+ */
+
+#ifndef FIFO_DEFS_H
+#define FIFO_DEFS_H 1
+
+#define head	sp->_fifohead
+#define tail	sp->_fifotail
+/* peek points to next uninterpreted character */
+#define peek	sp->_fifopeek
+
+#define h_inc() { \
+	    (head >= FIFO_SIZE-1) \
+		? head = 0 \
+		: head++; \
+	    if (head == tail) \
+		head = -1, tail = 0; \
+	}
+#define h_dec() { \
+	    (head <= 0) \
+		? head = FIFO_SIZE-1 \
+		: head--; \
+	    if (head == tail) \
+		tail = -1; \
+	}
+#define t_inc() { \
+	    (tail >= FIFO_SIZE-1) \
+		? tail = 0 \
+		: tail++; \
+	    if (tail == head) \
+		tail = -1; \
+	    }
+#define t_dec() { \
+	    (tail <= 0) \
+		? tail = FIFO_SIZE-1 \
+		: tail--; \
+	    if (head == tail) \
+		fifo_clear(sp); \
+	    }
+#define p_inc() { \
+	    (peek >= FIFO_SIZE-1) \
+		? peek = 0 \
+		: peek++; \
+	    }
+
+#define cooked_key_in_fifo()	((head >= 0) && (peek != head))
+#define raw_key_in_fifo()	((head >= 0) && (peek != tail))
+
+#endif /* FIFO_DEFS_H */
diff --git a/ncurses/llib-lncurses b/ncurses/llib-lncurses
new file mode 100644
index 0000000..211cf3b
--- /dev/null
+++ b/ncurses/llib-lncurses
@@ -0,0 +1,4455 @@
+/****************************************************************************
+ * Copyright 2019,2021,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey       1996-on                                  *
+ ****************************************************************************/
+/* LINTLIBRARY */
+
+/* ./tty/hardscroll.c */
+
+#include <curses.priv.h>
+
+#undef _nc_oldnums
+int	*_nc_oldnums;
+
+#undef _nc_scroll_optimize_sp
+void	_nc_scroll_optimize_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_scroll_optimize
+void	_nc_scroll_optimize(void)
+		{ /* void */ }
+
+#undef _nc_linedump_sp
+void	_nc_linedump_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_linedump
+void	_nc_linedump(void)
+		{ /* void */ }
+
+/* ./tty/hashmap.c */
+
+#undef _nc_hash_map_sp
+void	_nc_hash_map_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_hash_map
+void	_nc_hash_map(void)
+		{ /* void */ }
+
+#undef _nc_make_oldhash_sp
+void	_nc_make_oldhash_sp(
+		SCREEN	*sp,
+		int	i)
+		{ /* void */ }
+
+#undef _nc_make_oldhash
+void	_nc_make_oldhash(
+		int	i)
+		{ /* void */ }
+
+#undef _nc_scroll_oldhash_sp
+void	_nc_scroll_oldhash_sp(
+		SCREEN	*sp,
+		int	n,
+		int	top,
+		int	bot)
+		{ /* void */ }
+
+#undef _nc_scroll_oldhash
+void	_nc_scroll_oldhash(
+		int	n,
+		int	top,
+		int	bot)
+		{ /* void */ }
+
+/* ./base/lib_addch.c */
+
+#undef _nc_render
+chtype	_nc_render(
+		WINDOW	*win,
+		chtype	ch)
+		{ return(*(chtype *)0); }
+
+#undef _nc_waddch_nosync
+int	_nc_waddch_nosync(
+		WINDOW	*win,
+		const chtype c)
+		{ return(*(int *)0); }
+
+#undef waddch
+int	waddch(
+		WINDOW	*win,
+		const chtype ch)
+		{ return(*(int *)0); }
+
+#undef wechochar
+int	wechochar(
+		WINDOW	*win,
+		const chtype ch)
+		{ return(*(int *)0); }
+
+/* ./base/lib_addstr.c */
+
+#undef waddnstr
+int	waddnstr(
+		WINDOW	*win,
+		const char *astr,
+		int	n)
+		{ return(*(int *)0); }
+
+#undef waddchnstr
+int	waddchnstr(
+		WINDOW	*win,
+		const chtype *astr,
+		int	n)
+		{ return(*(int *)0); }
+
+/* ./base/lib_beep.c */
+
+#undef beep_sp
+int	beep_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef beep
+int	beep(void)
+		{ return(*(int *)0); }
+
+/* ./base/lib_bkgd.c */
+
+#undef wbkgdset
+void	wbkgdset(
+		WINDOW	*win,
+		chtype	ch)
+		{ /* void */ }
+
+#undef wbkgd
+int	wbkgd(
+		WINDOW	*win,
+		chtype	ch)
+		{ return(*(int *)0); }
+
+/* ./base/lib_box.c */
+
+#undef wborder
+int	wborder(
+		WINDOW	*win,
+		chtype	ls,
+		chtype	rs,
+		chtype	ts,
+		chtype	bs,
+		chtype	tl,
+		chtype	tr,
+		chtype	bl,
+		chtype	br)
+		{ return(*(int *)0); }
+
+/* ./base/lib_chgat.c */
+
+#undef wchgat
+int	wchgat(
+		WINDOW	*win,
+		int	n,
+		attr_t	attr,
+		short	pair_arg,
+		const void *opts)
+		{ return(*(int *)0); }
+
+/* ./base/lib_clear.c */
+
+#undef wclear
+int	wclear(
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+/* ./base/lib_clearok.c */
+
+#undef clearok
+int	clearok(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+/* ./base/lib_clrbot.c */
+
+#undef wclrtobot
+int	wclrtobot(
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+/* ./base/lib_clreol.c */
+
+#undef wclrtoeol
+int	wclrtoeol(
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+/* ./base/lib_color.c */
+
+#undef COLOR_PAIRS
+int	COLOR_PAIRS;
+#undef COLORS
+int	COLORS;
+
+#undef _nc_reset_colors_sp
+NCURSES_BOOL _nc_reset_colors_sp(
+		SCREEN	*sp)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_reset_colors
+NCURSES_BOOL _nc_reset_colors(void)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef start_color_sp
+int	start_color_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef start_color
+int	start_color(void)
+		{ return(*(int *)0); }
+
+#undef _nc_change_pair
+void	_nc_change_pair(
+		SCREEN	*sp,
+		int	pair)
+		{ /* void */ }
+
+#undef _nc_reserve_pairs
+void	_nc_reserve_pairs(
+		SCREEN	*sp,
+		int	want)
+		{ /* void */ }
+
+#undef _nc_init_pair
+int	_nc_init_pair(
+		SCREEN	*sp,
+		int	pair,
+		int	f,
+		int	b)
+		{ return(*(int *)0); }
+
+#undef init_pair_sp
+int	init_pair_sp(
+		SCREEN	*sp,
+		short	pair,
+		short	f,
+		short	b)
+		{ return(*(int *)0); }
+
+#undef init_pair
+int	init_pair(
+		short	pair,
+		short	f,
+		short	b)
+		{ return(*(int *)0); }
+
+#undef _nc_init_color
+int	_nc_init_color(
+		SCREEN	*sp,
+		int	color,
+		int	r,
+		int	g,
+		int	b)
+		{ return(*(int *)0); }
+
+#undef init_color_sp
+int	init_color_sp(
+		SCREEN	*sp,
+		short	color,
+		short	r,
+		short	g,
+		short	b)
+		{ return(*(int *)0); }
+
+#undef init_color
+int	init_color(
+		short	color,
+		short	r,
+		short	g,
+		short	b)
+		{ return(*(int *)0); }
+
+#undef can_change_color_sp
+NCURSES_BOOL can_change_color_sp(
+		SCREEN	*sp)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef can_change_color
+NCURSES_BOOL can_change_color(void)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef has_colors_sp
+NCURSES_BOOL has_colors_sp(
+		SCREEN	*sp)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef has_colors
+NCURSES_BOOL has_colors(void)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef color_content_sp
+int	color_content_sp(
+		SCREEN	*sp,
+		short	color,
+		short	*r,
+		short	*g,
+		short	*b)
+		{ return(*(int *)0); }
+
+#undef color_content
+int	color_content(
+		short	color,
+		short	*r,
+		short	*g,
+		short	*b)
+		{ return(*(int *)0); }
+
+#undef _nc_pair_content
+int	_nc_pair_content(
+		SCREEN	*sp,
+		int	pair,
+		int	*f,
+		int	*b)
+		{ return(*(int *)0); }
+
+#undef pair_content_sp
+int	pair_content_sp(
+		SCREEN	*sp,
+		short	pair,
+		short	*f,
+		short	*b)
+		{ return(*(int *)0); }
+
+#undef pair_content
+int	pair_content(
+		short	pair,
+		short	*f,
+		short	*b)
+		{ return(*(int *)0); }
+
+#undef _nc_do_color_sp
+void	_nc_do_color_sp(
+		SCREEN	*sp,
+		int	old_pair,
+		int	pair,
+		int	reverse,
+		NCURSES_OUTC_sp outc)
+		{ /* void */ }
+
+#undef _nc_do_color
+void	_nc_do_color(
+		int	old_pair,
+		int	pair,
+		int	reverse,
+		NCURSES_OUTC outc)
+		{ /* void */ }
+
+/* ./base/lib_colorset.c */
+
+#undef wcolor_set
+int	wcolor_set(
+		WINDOW	*win,
+		short	pair_arg,
+		void	*opts)
+		{ return(*(int *)0); }
+
+/* ./base/lib_delch.c */
+
+#undef wdelch
+int	wdelch(
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+/* ./base/lib_delwin.c */
+
+#undef delwin
+int	delwin(
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+/* ./base/lib_echo.c */
+
+#undef echo_sp
+int	echo_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef echo
+int	echo(void)
+		{ return(*(int *)0); }
+
+#undef noecho_sp
+int	noecho_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef noecho
+int	noecho(void)
+		{ return(*(int *)0); }
+
+/* ./base/lib_endwin.c */
+
+#undef endwin_sp
+int	endwin_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef endwin
+int	endwin(void)
+		{ return(*(int *)0); }
+
+/* ./base/lib_erase.c */
+
+#undef werase
+int	werase(
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+/* ./base/lib_flash.c */
+
+#undef flash_sp
+int	flash_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef flash
+int	flash(void)
+		{ return(*(int *)0); }
+
+/* ./lib_gen.c */
+
+#undef addch
+int	addch(
+		const chtype z)
+		{ return(*(int *)0); }
+
+#undef addchnstr
+int	addchnstr(
+		const chtype *a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef addchstr
+int	addchstr(
+		const chtype *z)
+		{ return(*(int *)0); }
+
+#undef addnstr
+int	addnstr(
+		const char *a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef addstr
+int	addstr(
+		const char *z)
+		{ return(*(int *)0); }
+
+#undef attroff
+int	attroff(
+		NCURSES_ATTR_T	z)
+		{ return(*(int *)0); }
+
+#undef attron
+int	attron(
+		NCURSES_ATTR_T	z)
+		{ return(*(int *)0); }
+
+#undef attrset
+int	attrset(
+		NCURSES_ATTR_T	z)
+		{ return(*(int *)0); }
+
+#undef attr_get
+int	attr_get(
+		attr_t	*a1,
+		short	*a2,
+		void	*z)
+		{ return(*(int *)0); }
+
+#undef attr_off
+int	attr_off(
+		attr_t	a1,
+		void	*z)
+		{ return(*(int *)0); }
+
+#undef attr_on
+int	attr_on(
+		attr_t	a1,
+		void	*z)
+		{ return(*(int *)0); }
+
+#undef attr_set
+int	attr_set(
+		attr_t	a1,
+		short	a2,
+		void	*z)
+		{ return(*(int *)0); }
+
+#undef bkgd
+int	bkgd(
+		chtype	z)
+		{ return(*(int *)0); }
+
+#undef bkgdset
+void	bkgdset(
+		chtype	z)
+		{ /* void */ }
+
+#undef border
+int	border(
+		chtype	a1,
+		chtype	a2,
+		chtype	a3,
+		chtype	a4,
+		chtype	a5,
+		chtype	a6,
+		chtype	a7,
+		chtype	z)
+		{ return(*(int *)0); }
+
+#undef box
+int	box(
+		WINDOW	*a1,
+		chtype	a2,
+		chtype	z)
+		{ return(*(int *)0); }
+
+#undef chgat
+int	chgat(
+		int	a1,
+		attr_t	a2,
+		short	a3,
+		const void *z)
+		{ return(*(int *)0); }
+
+#undef clear
+int	clear(void)
+		{ return(*(int *)0); }
+
+#undef clrtobot
+int	clrtobot(void)
+		{ return(*(int *)0); }
+
+#undef clrtoeol
+int	clrtoeol(void)
+		{ return(*(int *)0); }
+
+#undef color_set
+int	color_set(
+		short	a1,
+		void	*z)
+		{ return(*(int *)0); }
+
+#undef COLOR_PAIR
+int	COLOR_PAIR(
+		int	z)
+		{ return(*(int *)0); }
+
+#undef delch
+int	delch(void)
+		{ return(*(int *)0); }
+
+#undef deleteln
+int	deleteln(void)
+		{ return(*(int *)0); }
+
+#undef echochar
+int	echochar(
+		const chtype z)
+		{ return(*(int *)0); }
+
+#undef erase
+int	erase(void)
+		{ return(*(int *)0); }
+
+#undef getbkgd
+chtype	getbkgd(
+		WINDOW	*z)
+		{ return(*(chtype *)0); }
+
+#undef getch
+int	getch(void)
+		{ return(*(int *)0); }
+
+#undef getnstr
+int	getnstr(
+		char	*a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef getstr
+int	getstr(
+		char	*z)
+		{ return(*(int *)0); }
+
+#undef hline
+int	hline(
+		chtype	a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef inch
+chtype	inch(void)
+		{ return(*(chtype *)0); }
+
+#undef inchnstr
+int	inchnstr(
+		chtype	*a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef inchstr
+int	inchstr(
+		chtype	*z)
+		{ return(*(int *)0); }
+
+#undef innstr
+int	innstr(
+		char	*a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef insch
+int	insch(
+		chtype	z)
+		{ return(*(int *)0); }
+
+#undef insdelln
+int	insdelln(
+		int	z)
+		{ return(*(int *)0); }
+
+#undef insertln
+int	insertln(void)
+		{ return(*(int *)0); }
+
+#undef insnstr
+int	insnstr(
+		const char *a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef insstr
+int	insstr(
+		const char *z)
+		{ return(*(int *)0); }
+
+#undef instr
+int	instr(
+		char	*z)
+		{ return(*(int *)0); }
+
+#undef move
+int	move(
+		int	a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvaddch
+int	mvaddch(
+		int	a1,
+		int	a2,
+		const chtype z)
+		{ return(*(int *)0); }
+
+#undef mvaddchnstr
+int	mvaddchnstr(
+		int	a1,
+		int	a2,
+		const chtype *a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvaddchstr
+int	mvaddchstr(
+		int	a1,
+		int	a2,
+		const chtype *z)
+		{ return(*(int *)0); }
+
+#undef mvaddnstr
+int	mvaddnstr(
+		int	a1,
+		int	a2,
+		const char *a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvaddstr
+int	mvaddstr(
+		int	a1,
+		int	a2,
+		const char *z)
+		{ return(*(int *)0); }
+
+#undef mvchgat
+int	mvchgat(
+		int	a1,
+		int	a2,
+		int	a3,
+		attr_t	a4,
+		short	a5,
+		const void *z)
+		{ return(*(int *)0); }
+
+#undef mvdelch
+int	mvdelch(
+		int	a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvgetch
+int	mvgetch(
+		int	a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvgetnstr
+int	mvgetnstr(
+		int	a1,
+		int	a2,
+		char	*a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvgetstr
+int	mvgetstr(
+		int	a1,
+		int	a2,
+		char	*z)
+		{ return(*(int *)0); }
+
+#undef mvhline
+int	mvhline(
+		int	a1,
+		int	a2,
+		chtype	a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvinch
+chtype	mvinch(
+		int	a1,
+		int	z)
+		{ return(*(chtype *)0); }
+
+#undef mvinchnstr
+int	mvinchnstr(
+		int	a1,
+		int	a2,
+		chtype	*a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvinchstr
+int	mvinchstr(
+		int	a1,
+		int	a2,
+		chtype	*z)
+		{ return(*(int *)0); }
+
+#undef mvinnstr
+int	mvinnstr(
+		int	a1,
+		int	a2,
+		char	*a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvinsch
+int	mvinsch(
+		int	a1,
+		int	a2,
+		chtype	z)
+		{ return(*(int *)0); }
+
+#undef mvinsnstr
+int	mvinsnstr(
+		int	a1,
+		int	a2,
+		const char *a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvinsstr
+int	mvinsstr(
+		int	a1,
+		int	a2,
+		const char *z)
+		{ return(*(int *)0); }
+
+#undef mvinstr
+int	mvinstr(
+		int	a1,
+		int	a2,
+		char	*z)
+		{ return(*(int *)0); }
+
+#undef mvvline
+int	mvvline(
+		int	a1,
+		int	a2,
+		chtype	a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwaddch
+int	mvwaddch(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const chtype z)
+		{ return(*(int *)0); }
+
+#undef mvwaddchnstr
+int	mvwaddchnstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const chtype *a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwaddchstr
+int	mvwaddchstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const chtype *z)
+		{ return(*(int *)0); }
+
+#undef mvwaddnstr
+int	mvwaddnstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const char *a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwaddstr
+int	mvwaddstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const char *z)
+		{ return(*(int *)0); }
+
+#undef mvwchgat
+int	mvwchgat(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		int	a4,
+		attr_t	a5,
+		short	a6,
+		const void *z)
+		{ return(*(int *)0); }
+
+#undef mvwdelch
+int	mvwdelch(
+		WINDOW	*a1,
+		int	a2,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwgetch
+int	mvwgetch(
+		WINDOW	*a1,
+		int	a2,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwgetnstr
+int	mvwgetnstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		char	*a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwgetstr
+int	mvwgetstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		char	*z)
+		{ return(*(int *)0); }
+
+#undef mvwhline
+int	mvwhline(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		chtype	a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwinch
+chtype	mvwinch(
+		WINDOW	*a1,
+		int	a2,
+		int	z)
+		{ return(*(chtype *)0); }
+
+#undef mvwinchnstr
+int	mvwinchnstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		chtype	*a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwinchstr
+int	mvwinchstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		chtype	*z)
+		{ return(*(int *)0); }
+
+#undef mvwinnstr
+int	mvwinnstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		char	*a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwinsch
+int	mvwinsch(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		chtype	z)
+		{ return(*(int *)0); }
+
+#undef mvwinsnstr
+int	mvwinsnstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const char *a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwinsstr
+int	mvwinsstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const char *z)
+		{ return(*(int *)0); }
+
+#undef mvwinstr
+int	mvwinstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		char	*z)
+		{ return(*(int *)0); }
+
+#undef mvwvline
+int	mvwvline(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		chtype	a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef PAIR_NUMBER
+int	PAIR_NUMBER(
+		int	z)
+		{ return(*(int *)0); }
+
+#undef redrawwin
+int	redrawwin(
+		WINDOW	*z)
+		{ return(*(int *)0); }
+
+#undef refresh
+int	refresh(void)
+		{ return(*(int *)0); }
+
+#undef scrl
+int	scrl(
+		int	z)
+		{ return(*(int *)0); }
+
+#undef scroll
+int	scroll(
+		WINDOW	*z)
+		{ return(*(int *)0); }
+
+#undef setscrreg
+int	setscrreg(
+		int	a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef standout
+int	standout(void)
+		{ return(*(int *)0); }
+
+#undef standend
+int	standend(void)
+		{ return(*(int *)0); }
+
+#undef timeout
+void	timeout(
+		int	z)
+		{ /* void */ }
+
+#undef touchline
+int	touchline(
+		WINDOW	*a1,
+		int	a2,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef touchwin
+int	touchwin(
+		WINDOW	*z)
+		{ return(*(int *)0); }
+
+#undef untouchwin
+int	untouchwin(
+		WINDOW	*z)
+		{ return(*(int *)0); }
+
+#undef vline
+int	vline(
+		chtype	a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef waddchstr
+int	waddchstr(
+		WINDOW	*a1,
+		const chtype *z)
+		{ return(*(int *)0); }
+
+#undef waddstr
+int	waddstr(
+		WINDOW	*a1,
+		const char *z)
+		{ return(*(int *)0); }
+
+#undef wattron
+int	wattron(
+		WINDOW	*a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef wattroff
+int	wattroff(
+		WINDOW	*a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef wattrset
+int	wattrset(
+		WINDOW	*a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef wattr_get
+int	wattr_get(
+		WINDOW	*a1,
+		attr_t	*a2,
+		short	*a3,
+		void	*z)
+		{ return(*(int *)0); }
+
+#undef wattr_set
+int	wattr_set(
+		WINDOW	*a1,
+		attr_t	a2,
+		short	a3,
+		void	*z)
+		{ return(*(int *)0); }
+
+#undef wdeleteln
+int	wdeleteln(
+		WINDOW	*z)
+		{ return(*(int *)0); }
+
+#undef wgetstr
+int	wgetstr(
+		WINDOW	*a1,
+		char	*z)
+		{ return(*(int *)0); }
+
+#undef winchstr
+int	winchstr(
+		WINDOW	*a1,
+		chtype	*z)
+		{ return(*(int *)0); }
+
+#undef winsertln
+int	winsertln(
+		WINDOW	*z)
+		{ return(*(int *)0); }
+
+#undef winsstr
+int	winsstr(
+		WINDOW	*a1,
+		const char *z)
+		{ return(*(int *)0); }
+
+#undef winstr
+int	winstr(
+		WINDOW	*a1,
+		char	*z)
+		{ return(*(int *)0); }
+
+#undef wstandout
+int	wstandout(
+		WINDOW	*z)
+		{ return(*(int *)0); }
+
+#undef wstandend
+int	wstandend(
+		WINDOW	*z)
+		{ return(*(int *)0); }
+
+#undef getattrs
+int	getattrs(
+		const WINDOW *z)
+		{ return(*(int *)0); }
+
+#undef getcurx
+int	getcurx(
+		const WINDOW *z)
+		{ return(*(int *)0); }
+
+#undef getcury
+int	getcury(
+		const WINDOW *z)
+		{ return(*(int *)0); }
+
+#undef getbegx
+int	getbegx(
+		const WINDOW *z)
+		{ return(*(int *)0); }
+
+#undef getbegy
+int	getbegy(
+		const WINDOW *z)
+		{ return(*(int *)0); }
+
+#undef getmaxx
+int	getmaxx(
+		const WINDOW *z)
+		{ return(*(int *)0); }
+
+#undef getmaxy
+int	getmaxy(
+		const WINDOW *z)
+		{ return(*(int *)0); }
+
+#undef getparx
+int	getparx(
+		const WINDOW *z)
+		{ return(*(int *)0); }
+
+#undef getpary
+int	getpary(
+		const WINDOW *z)
+		{ return(*(int *)0); }
+
+#undef wgetparent
+WINDOW	*wgetparent(
+		const WINDOW *z)
+		{ return(*(WINDOW **)0); }
+
+#undef is_cleared
+NCURSES_BOOL is_cleared(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_idcok
+NCURSES_BOOL is_idcok(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_idlok
+NCURSES_BOOL is_idlok(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_immedok
+NCURSES_BOOL is_immedok(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_keypad
+NCURSES_BOOL is_keypad(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_leaveok
+NCURSES_BOOL is_leaveok(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_nodelay
+NCURSES_BOOL is_nodelay(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_notimeout
+NCURSES_BOOL is_notimeout(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_pad
+NCURSES_BOOL is_pad(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_scrollok
+NCURSES_BOOL is_scrollok(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_subwin
+NCURSES_BOOL is_subwin(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_syncok
+NCURSES_BOOL is_syncok(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef wgetdelay
+int	wgetdelay(
+		const WINDOW *z)
+		{ return(*(int *)0); }
+
+#undef wgetscrreg
+int	wgetscrreg(
+		const WINDOW *a1,
+		int	*a2,
+		int	*z)
+		{ return(*(int *)0); }
+
+#undef mouse_trafo
+NCURSES_BOOL mouse_trafo(
+		int	*a1,
+		int	*a2,
+		NCURSES_BOOL z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./base/lib_getch.c */
+
+#undef ESCDELAY
+int	ESCDELAY;
+
+#undef set_escdelay_sp
+int	set_escdelay_sp(
+		SCREEN	*sp,
+		int	value)
+		{ return(*(int *)0); }
+
+#undef set_escdelay
+int	set_escdelay(
+		int	value)
+		{ return(*(int *)0); }
+
+#undef get_escdelay_sp
+int	get_escdelay_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef get_escdelay
+int	get_escdelay(void)
+		{ return(*(int *)0); }
+
+#undef _nc_wgetch
+int	_nc_wgetch(
+		WINDOW	*win,
+		int	*result,
+		int	use_meta)
+		{ return(*(int *)0); }
+
+#undef wgetch
+int	wgetch(
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+/* ./base/lib_getstr.c */
+
+#undef wgetnstr
+int	wgetnstr(
+		WINDOW	*win,
+		char	*str,
+		int	maxlen)
+		{ return(*(int *)0); }
+
+/* ./base/lib_hline.c */
+
+#undef whline
+int	whline(
+		WINDOW	*win,
+		chtype	ch,
+		int	n)
+		{ return(*(int *)0); }
+
+/* ./base/lib_immedok.c */
+
+#undef immedok
+void	immedok(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ /* void */ }
+
+/* ./base/lib_inchstr.c */
+
+#undef winchnstr
+int	winchnstr(
+		WINDOW	*win,
+		chtype	*str,
+		int	n)
+		{ return(*(int *)0); }
+
+/* ./base/lib_initscr.c */
+
+#undef initscr
+WINDOW	*initscr(void)
+		{ return(*(WINDOW **)0); }
+
+/* ./base/lib_insch.c */
+
+#undef _nc_insert_ch
+int	_nc_insert_ch(
+		SCREEN	*sp,
+		WINDOW	*win,
+		chtype	ch)
+		{ return(*(int *)0); }
+
+#undef winsch
+int	winsch(
+		WINDOW	*win,
+		chtype	c)
+		{ return(*(int *)0); }
+
+/* ./base/lib_insdel.c */
+
+#undef winsdelln
+int	winsdelln(
+		WINDOW	*win,
+		int	n)
+		{ return(*(int *)0); }
+
+/* ./base/lib_insnstr.c */
+
+#undef winsnstr
+int	winsnstr(
+		WINDOW	*win,
+		const char *s,
+		int	n)
+		{ return(*(int *)0); }
+
+/* ./base/lib_instr.c */
+
+#undef winnstr
+int	winnstr(
+		WINDOW	*win,
+		char	*str,
+		int	n)
+		{ return(*(int *)0); }
+
+/* ./base/lib_isendwin.c */
+
+#undef isendwin_sp
+NCURSES_BOOL isendwin_sp(
+		SCREEN	*sp)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef isendwin
+NCURSES_BOOL isendwin(void)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./base/lib_leaveok.c */
+
+#undef leaveok
+int	leaveok(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+/* ./base/lib_mouse.c */
+
+#undef getmouse_sp
+int	getmouse_sp(
+		SCREEN	*sp,
+		MEVENT	*aevent)
+		{ return(*(int *)0); }
+
+#undef getmouse
+int	getmouse(
+		MEVENT	*aevent)
+		{ return(*(int *)0); }
+
+#undef ungetmouse_sp
+int	ungetmouse_sp(
+		SCREEN	*sp,
+		MEVENT	*aevent)
+		{ return(*(int *)0); }
+
+#undef ungetmouse
+int	ungetmouse(
+		MEVENT	*aevent)
+		{ return(*(int *)0); }
+
+#undef mousemask_sp
+mmask_t	mousemask_sp(
+		SCREEN	*sp,
+		mmask_t	newmask,
+		mmask_t	*oldmask)
+		{ return(*(mmask_t *)0); }
+
+#undef mousemask
+mmask_t	mousemask(
+		mmask_t	newmask,
+		mmask_t	*oldmask)
+		{ return(*(mmask_t *)0); }
+
+#undef wenclose
+NCURSES_BOOL wenclose(
+		const WINDOW *win,
+		int	y,
+		int	x)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef mouseinterval_sp
+int	mouseinterval_sp(
+		SCREEN	*sp,
+		int	maxclick)
+		{ return(*(int *)0); }
+
+#undef mouseinterval
+int	mouseinterval(
+		int	maxclick)
+		{ return(*(int *)0); }
+
+#undef _nc_has_mouse
+NCURSES_BOOL _nc_has_mouse(
+		SCREEN	*sp)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef has_mouse_sp
+NCURSES_BOOL has_mouse_sp(
+		SCREEN	*sp)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef has_mouse
+NCURSES_BOOL has_mouse(void)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef wmouse_trafo
+NCURSES_BOOL wmouse_trafo(
+		const WINDOW *win,
+		int	*pY,
+		int	*pX,
+		NCURSES_BOOL to_screen)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./base/lib_move.c */
+
+#undef wmove
+int	wmove(
+		WINDOW	*win,
+		int	y,
+		int	x)
+		{ return(*(int *)0); }
+
+/* ./tty/lib_mvcur.c */
+
+#undef _nc_msec_cost_sp
+int	_nc_msec_cost_sp(
+		SCREEN	*sp,
+		const char *const cap,
+		int	affcnt)
+		{ return(*(int *)0); }
+
+#undef _nc_msec_cost
+int	_nc_msec_cost(
+		const char *const cap,
+		int	affcnt)
+		{ return(*(int *)0); }
+
+#undef _nc_mvcur_resume_sp
+void	_nc_mvcur_resume_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_mvcur_resume
+void	_nc_mvcur_resume(void)
+		{ /* void */ }
+
+#undef _nc_mvcur_init_sp
+void	_nc_mvcur_init_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_mvcur_init
+void	_nc_mvcur_init(void)
+		{ /* void */ }
+
+#undef _nc_mvcur_wrap_sp
+void	_nc_mvcur_wrap_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_mvcur_wrap
+void	_nc_mvcur_wrap(void)
+		{ /* void */ }
+
+#undef _nc_mvcur_sp
+int	_nc_mvcur_sp(
+		SCREEN	*sp,
+		int	yold,
+		int	xold,
+		int	ynew,
+		int	xnew)
+		{ return(*(int *)0); }
+
+#undef _nc_mvcur
+int	_nc_mvcur(
+		int	yold,
+		int	xold,
+		int	ynew,
+		int	xnew)
+		{ return(*(int *)0); }
+
+#undef mvcur_sp
+int	mvcur_sp(
+		SCREEN	*sp,
+		int	yold,
+		int	xold,
+		int	ynew,
+		int	xnew)
+		{ return(*(int *)0); }
+
+#undef mvcur
+int	mvcur(
+		int	yold,
+		int	xold,
+		int	ynew,
+		int	xnew)
+		{ return(*(int *)0); }
+
+#undef _nc_optimize_enable
+int	_nc_optimize_enable;
+
+/* ./base/lib_mvwin.c */
+
+#undef mvwin
+int	mvwin(
+		WINDOW	*win,
+		int	by,
+		int	bx)
+		{ return(*(int *)0); }
+
+/* ./base/lib_newterm.c */
+
+#undef filter_sp
+void	filter_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef filter
+void	filter(void)
+		{ /* void */ }
+
+#undef nofilter_sp
+void	nofilter_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef nofilter
+void	nofilter(void)
+		{ /* void */ }
+
+#undef newterm_sp
+SCREEN	*newterm_sp(
+		SCREEN	*sp,
+		const char *name,
+		FILE	*ofp,
+		FILE	*ifp)
+		{ return(*(SCREEN **)0); }
+
+#undef newterm
+SCREEN	*newterm(
+		const char *name,
+		FILE	*ofp,
+		FILE	*ifp)
+		{ return(*(SCREEN **)0); }
+
+/* ./base/lib_newwin.c */
+
+#undef _nc_freewin
+int	_nc_freewin(
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+#undef newwin_sp
+WINDOW	*newwin_sp(
+		SCREEN	*sp,
+		int	num_lines,
+		int	num_columns,
+		int	begy,
+		int	begx)
+		{ return(*(WINDOW **)0); }
+
+#undef newwin
+WINDOW	*newwin(
+		int	num_lines,
+		int	num_columns,
+		int	begy,
+		int	begx)
+		{ return(*(WINDOW **)0); }
+
+#undef derwin
+WINDOW	*derwin(
+		WINDOW	*orig,
+		int	num_lines,
+		int	num_columns,
+		int	begy,
+		int	begx)
+		{ return(*(WINDOW **)0); }
+
+#undef subwin
+WINDOW	*subwin(
+		WINDOW	*w,
+		int	l,
+		int	c,
+		int	y,
+		int	x)
+		{ return(*(WINDOW **)0); }
+
+#undef _nc_makenew_sp
+WINDOW	*_nc_makenew_sp(
+		SCREEN	*sp,
+		int	num_lines,
+		int	num_columns,
+		int	begy,
+		int	begx,
+		int	flags)
+		{ return(*(WINDOW **)0); }
+
+#undef _nc_curscr_of
+WINDOW	*_nc_curscr_of(
+		SCREEN	*sp)
+		{ return(*(WINDOW **)0); }
+
+#undef _nc_newscr_of
+WINDOW	*_nc_newscr_of(
+		SCREEN	*sp)
+		{ return(*(WINDOW **)0); }
+
+#undef _nc_stdscr_of
+WINDOW	*_nc_stdscr_of(
+		SCREEN	*sp)
+		{ return(*(WINDOW **)0); }
+
+/* ./base/lib_nl.c */
+
+#undef nl_sp
+int	nl_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef nl
+int	nl(void)
+		{ return(*(int *)0); }
+
+#undef nonl_sp
+int	nonl_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef nonl
+int	nonl(void)
+		{ return(*(int *)0); }
+
+/* ./base/lib_overlay.c */
+
+#undef overlay
+int	overlay(
+		const WINDOW *win1,
+		WINDOW	*win2)
+		{ return(*(int *)0); }
+
+#undef overwrite
+int	overwrite(
+		const WINDOW *win1,
+		WINDOW	*win2)
+		{ return(*(int *)0); }
+
+#undef copywin
+int	copywin(
+		const WINDOW *src,
+		WINDOW	*dst,
+		int	sminrow,
+		int	smincol,
+		int	dminrow,
+		int	dmincol,
+		int	dmaxrow,
+		int	dmaxcol,
+		int	over)
+		{ return(*(int *)0); }
+
+/* ./base/lib_pad.c */
+
+#undef newpad_sp
+WINDOW	*newpad_sp(
+		SCREEN	*sp,
+		int	l,
+		int	c)
+		{ return(*(WINDOW **)0); }
+
+#undef newpad
+WINDOW	*newpad(
+		int	l,
+		int	c)
+		{ return(*(WINDOW **)0); }
+
+#undef subpad
+WINDOW	*subpad(
+		WINDOW	*orig,
+		int	l,
+		int	c,
+		int	begy,
+		int	begx)
+		{ return(*(WINDOW **)0); }
+
+#undef prefresh
+int	prefresh(
+		WINDOW	*win,
+		int	pminrow,
+		int	pmincol,
+		int	sminrow,
+		int	smincol,
+		int	smaxrow,
+		int	smaxcol)
+		{ return(*(int *)0); }
+
+#undef pnoutrefresh
+int	pnoutrefresh(
+		WINDOW	*win,
+		int	pminrow,
+		int	pmincol,
+		int	sminrow,
+		int	smincol,
+		int	smaxrow,
+		int	smaxcol)
+		{ return(*(int *)0); }
+
+#undef pechochar
+int	pechochar(
+		WINDOW	*pad,
+		const chtype ch)
+		{ return(*(int *)0); }
+
+/* ./base/lib_printw.c */
+
+#undef printw
+int	printw(
+		const char *fmt,
+		...)
+		{ return(*(int *)0); }
+
+#undef wprintw
+int	wprintw(
+		WINDOW	*win,
+		const char *fmt,
+		...)
+		{ return(*(int *)0); }
+
+#undef mvprintw
+int	mvprintw(
+		int	y,
+		int	x,
+		const char *fmt,
+		...)
+		{ return(*(int *)0); }
+
+#undef mvwprintw
+int	mvwprintw(
+		WINDOW	*win,
+		int	y,
+		int	x,
+		const char *fmt,
+		...)
+		{ return(*(int *)0); }
+
+#undef vwprintw
+int	vwprintw(
+		WINDOW	*win,
+		const char *fmt,
+		va_list	argp)
+		{ return(*(int *)0); }
+
+#undef vw_printw
+int	vw_printw(
+		WINDOW	*win,
+		const char *fmt,
+		va_list	argp)
+		{ return(*(int *)0); }
+
+/* ./base/lib_redrawln.c */
+
+#undef wredrawln
+int	wredrawln(
+		WINDOW	*win,
+		int	beg,
+		int	num)
+		{ return(*(int *)0); }
+
+/* ./base/lib_refresh.c */
+
+#undef wrefresh
+int	wrefresh(
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+#undef wnoutrefresh
+int	wnoutrefresh(
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+/* ./base/lib_restart.c */
+
+#undef restartterm_sp
+int	restartterm_sp(
+		SCREEN	*sp,
+		const char *termp,
+		int	filenum,
+		int	*errret)
+		{ return(*(int *)0); }
+
+#undef restartterm
+int	restartterm(
+		const char *termp,
+		int	filenum,
+		int	*errret)
+		{ return(*(int *)0); }
+
+/* ./base/lib_scanw.c */
+
+#undef vwscanw
+int	vwscanw(
+		WINDOW	*win,
+		const char *fmt,
+		va_list	argp)
+		{ return(*(int *)0); }
+
+#undef vw_scanw
+int	vw_scanw(
+		WINDOW	*win,
+		const char *fmt,
+		va_list	argp)
+		{ return(*(int *)0); }
+
+#undef scanw
+int	scanw(
+		const char *fmt,
+		...)
+		{ return(*(int *)0); }
+
+#undef wscanw
+int	wscanw(
+		WINDOW	*win,
+		const char *fmt,
+		...)
+		{ return(*(int *)0); }
+
+#undef mvscanw
+int	mvscanw(
+		int	y,
+		int	x,
+		const char *fmt,
+		...)
+		{ return(*(int *)0); }
+
+#undef mvwscanw
+int	mvwscanw(
+		WINDOW	*win,
+		int	y,
+		int	x,
+		const char *fmt,
+		...)
+		{ return(*(int *)0); }
+
+/* ./base/lib_screen.c */
+
+#undef getwin_sp
+WINDOW	*getwin_sp(
+		SCREEN	*sp,
+		FILE	*filep)
+		{ return(*(WINDOW **)0); }
+
+#undef getwin
+WINDOW	*getwin(
+		FILE	*filep)
+		{ return(*(WINDOW **)0); }
+
+#undef putwin
+int	putwin(
+		WINDOW	*win,
+		FILE	*filep)
+		{ return(*(int *)0); }
+
+#undef scr_restore_sp
+int	scr_restore_sp(
+		SCREEN	*sp,
+		const char *file)
+		{ return(*(int *)0); }
+
+#undef scr_restore
+int	scr_restore(
+		const char *file)
+		{ return(*(int *)0); }
+
+#undef scr_dump
+int	scr_dump(
+		const char *file)
+		{ return(*(int *)0); }
+
+#undef scr_init_sp
+int	scr_init_sp(
+		SCREEN	*sp,
+		const char *file)
+		{ return(*(int *)0); }
+
+#undef scr_init
+int	scr_init(
+		const char *file)
+		{ return(*(int *)0); }
+
+#undef scr_set_sp
+int	scr_set_sp(
+		SCREEN	*sp,
+		const char *file)
+		{ return(*(int *)0); }
+
+#undef scr_set
+int	scr_set(
+		const char *file)
+		{ return(*(int *)0); }
+
+/* ./base/lib_scroll.c */
+
+#undef _nc_scroll_window
+void	_nc_scroll_window(
+		WINDOW	*win,
+		int const n,
+		int const top,
+		int const bottom,
+		chtype	blank)
+		{ /* void */ }
+
+#undef wscrl
+int	wscrl(
+		WINDOW	*win,
+		int	n)
+		{ return(*(int *)0); }
+
+/* ./base/lib_scrollok.c */
+
+#undef scrollok
+int	scrollok(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+/* ./base/lib_scrreg.c */
+
+#undef wsetscrreg
+int	wsetscrreg(
+		WINDOW	*win,
+		int	top,
+		int	bottom)
+		{ return(*(int *)0); }
+
+/* ./base/lib_set_term.c */
+
+#undef set_term
+SCREEN	*set_term(
+		SCREEN	*screenp)
+		{ return(*(SCREEN **)0); }
+
+#undef delscreen
+void	delscreen(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_setupscreen_sp
+int	_nc_setupscreen_sp(
+		SCREEN	**spp,
+		int	slines,
+		int	scolumns,
+		FILE	*output,
+		int	filtered,
+		int	slk_format)
+		{ return(*(int *)0); }
+
+#undef _nc_setupscreen
+int	_nc_setupscreen(
+		int	slines,
+		int	scolumns,
+		FILE	*output,
+		int	filtered,
+		int	slk_format)
+		{ return(*(int *)0); }
+
+#undef _nc_ripoffline_sp
+int	_nc_ripoffline_sp(
+		SCREEN	*sp,
+		int	line,
+		int	(*init)(
+		WINDOW	*p1,
+		int	p2))
+		{ return(*(int *)0); }
+
+#undef _nc_ripoffline
+int	_nc_ripoffline(
+		int	line,
+		int	(*init)(
+		WINDOW	*p1,
+		int	p2))
+		{ return(*(int *)0); }
+
+#undef ripoffline_sp
+int	ripoffline_sp(
+		SCREEN	*sp,
+		int	line,
+		int	(*init)(
+		WINDOW	*p1,
+		int	p2))
+		{ return(*(int *)0); }
+
+#undef ripoffline
+int	ripoffline(
+		int	line,
+		int	(*init)(
+		WINDOW	*p1,
+		int	p2))
+		{ return(*(int *)0); }
+
+/* ./base/lib_slk.c */
+
+#undef _nc_format_slks
+int	_nc_format_slks(
+		SCREEN	*sp,
+		int	cols)
+		{ return(*(int *)0); }
+
+#undef _nc_slk_initialize
+int	_nc_slk_initialize(
+		WINDOW	*stwin,
+		int	cols)
+		{ return(*(int *)0); }
+
+#undef slk_restore_sp
+int	slk_restore_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef slk_restore
+int	slk_restore(void)
+		{ return(*(int *)0); }
+
+/* ./base/lib_slkatr_set.c */
+
+#undef slk_attr_set_sp
+int	slk_attr_set_sp(
+		SCREEN	*sp,
+		const attr_t attr,
+		short	pair_arg,
+		void	*opts)
+		{ return(*(int *)0); }
+
+#undef slk_attr_set
+int	slk_attr_set(
+		const attr_t attr,
+		short	pair_arg,
+		void	*opts)
+		{ return(*(int *)0); }
+
+/* ./base/lib_slkatrof.c */
+
+#undef slk_attroff_sp
+int	slk_attroff_sp(
+		SCREEN	*sp,
+		const chtype attr)
+		{ return(*(int *)0); }
+
+#undef slk_attroff
+int	slk_attroff(
+		const chtype attr)
+		{ return(*(int *)0); }
+
+/* ./base/lib_slkatron.c */
+
+#undef slk_attron_sp
+int	slk_attron_sp(
+		SCREEN	*sp,
+		const chtype attr)
+		{ return(*(int *)0); }
+
+#undef slk_attron
+int	slk_attron(
+		const chtype attr)
+		{ return(*(int *)0); }
+
+/* ./base/lib_slkatrset.c */
+
+#undef slk_attrset_sp
+int	slk_attrset_sp(
+		SCREEN	*sp,
+		const chtype attr)
+		{ return(*(int *)0); }
+
+#undef slk_attrset
+int	slk_attrset(
+		const chtype attr)
+		{ return(*(int *)0); }
+
+/* ./base/lib_slkattr.c */
+
+#undef slk_attr_sp
+attr_t	slk_attr_sp(
+		SCREEN	*sp)
+		{ return(*(attr_t *)0); }
+
+#undef slk_attr
+attr_t	slk_attr(void)
+		{ return(*(attr_t *)0); }
+
+/* ./base/lib_slkclear.c */
+
+#undef slk_clear_sp
+int	slk_clear_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef slk_clear
+int	slk_clear(void)
+		{ return(*(int *)0); }
+
+/* ./base/lib_slkcolor.c */
+
+#undef slk_color_sp
+int	slk_color_sp(
+		SCREEN	*sp,
+		short	pair_arg)
+		{ return(*(int *)0); }
+
+#undef slk_color
+int	slk_color(
+		short	pair_arg)
+		{ return(*(int *)0); }
+
+/* ./base/lib_slkinit.c */
+
+#undef slk_init_sp
+int	slk_init_sp(
+		SCREEN	*sp,
+		int	format)
+		{ return(*(int *)0); }
+
+#undef slk_init
+int	slk_init(
+		int	format)
+		{ return(*(int *)0); }
+
+/* ./base/lib_slklab.c */
+
+#undef slk_label_sp
+char	*slk_label_sp(
+		SCREEN	*sp,
+		int	n)
+		{ return(*(char **)0); }
+
+#undef slk_label
+char	*slk_label(
+		int	n)
+		{ return(*(char **)0); }
+
+/* ./base/lib_slkrefr.c */
+
+#undef slk_noutrefresh_sp
+int	slk_noutrefresh_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef slk_noutrefresh
+int	slk_noutrefresh(void)
+		{ return(*(int *)0); }
+
+#undef slk_refresh_sp
+int	slk_refresh_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef slk_refresh
+int	slk_refresh(void)
+		{ return(*(int *)0); }
+
+/* ./base/lib_slkset.c */
+
+#undef slk_set_sp
+int	slk_set_sp(
+		SCREEN	*sp,
+		int	i,
+		const char *astr,
+		int	format)
+		{ return(*(int *)0); }
+
+#undef slk_set
+int	slk_set(
+		int	i,
+		const char *astr,
+		int	format)
+		{ return(*(int *)0); }
+
+/* ./base/lib_slktouch.c */
+
+#undef slk_touch_sp
+int	slk_touch_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef slk_touch
+int	slk_touch(void)
+		{ return(*(int *)0); }
+
+/* ./base/lib_touch.c */
+
+#undef is_linetouched
+NCURSES_BOOL is_linetouched(
+		WINDOW	*win,
+		int	line)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_wintouched
+NCURSES_BOOL is_wintouched(
+		WINDOW	*win)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef wtouchln
+int	wtouchln(
+		WINDOW	*win,
+		int	y,
+		int	n,
+		int	changed)
+		{ return(*(int *)0); }
+
+/* ./trace/lib_tracedmp.c */
+
+#undef _tracedump
+void	_tracedump(
+		const char *name,
+		WINDOW	*win)
+		{ /* void */ }
+
+/* ./trace/lib_tracemse.c */
+
+#undef _nc_trace_mmask_t
+char	*_nc_trace_mmask_t(
+		SCREEN	*sp,
+		mmask_t	code)
+		{ return(*(char **)0); }
+
+#undef _nc_tracemouse
+char	*_nc_tracemouse(
+		SCREEN	*sp,
+		MEVENT const *ep)
+		{ return(*(char **)0); }
+
+#undef _nc_retrace_mmask_t
+mmask_t	_nc_retrace_mmask_t(
+		SCREEN	*sp,
+		mmask_t	code)
+		{ return(*(mmask_t *)0); }
+
+#undef _tracemouse
+char	*_tracemouse(
+		MEVENT const *ep)
+		{ return(*(char **)0); }
+
+/* ./tty/lib_tstp.c */
+
+#undef _nc_signal_handler
+void	_nc_signal_handler(
+		int	enable)
+		{ /* void */ }
+
+/* ./base/lib_ungetch.c */
+
+#undef _nc_fifo_dump
+void	_nc_fifo_dump(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef ungetch_sp
+int	ungetch_sp(
+		SCREEN	*sp,
+		int	ch)
+		{ return(*(int *)0); }
+
+#undef ungetch
+int	ungetch(
+		int	ch)
+		{ return(*(int *)0); }
+
+/* ./tty/lib_vidattr.c */
+
+#undef vidputs_sp
+int	vidputs_sp(
+		SCREEN	*sp,
+		chtype	newmode,
+		NCURSES_OUTC_sp outc)
+		{ return(*(int *)0); }
+
+#undef vidputs
+int	vidputs(
+		chtype	newmode,
+		NCURSES_OUTC outc)
+		{ return(*(int *)0); }
+
+#undef vidattr_sp
+int	vidattr_sp(
+		SCREEN	*sp,
+		chtype	newmode)
+		{ return(*(int *)0); }
+
+#undef vidattr
+int	vidattr(
+		chtype	newmode)
+		{ return(*(int *)0); }
+
+#undef termattrs_sp
+chtype	termattrs_sp(
+		SCREEN	*sp)
+		{ return(*(chtype *)0); }
+
+#undef termattrs
+chtype	termattrs(void)
+		{ return(*(chtype *)0); }
+
+/* ./base/lib_vline.c */
+
+#undef wvline
+int	wvline(
+		WINDOW	*win,
+		chtype	ch,
+		int	n)
+		{ return(*(int *)0); }
+
+/* ./base/lib_wattroff.c */
+
+#undef wattr_off
+int	wattr_off(
+		WINDOW	*win,
+		attr_t	at,
+		void	*opts)
+		{ return(*(int *)0); }
+
+/* ./base/lib_wattron.c */
+
+#undef wattr_on
+int	wattr_on(
+		WINDOW	*win,
+		attr_t	at,
+		void	*opts)
+		{ return(*(int *)0); }
+
+/* ./base/lib_winch.c */
+
+#undef winch
+chtype	winch(
+		WINDOW	*win)
+		{ return(*(chtype *)0); }
+
+/* ./base/lib_window.c */
+
+#undef _nc_synchook
+void	_nc_synchook(
+		WINDOW	*win)
+		{ /* void */ }
+
+#undef mvderwin
+int	mvderwin(
+		WINDOW	*win,
+		int	y,
+		int	x)
+		{ return(*(int *)0); }
+
+#undef syncok
+int	syncok(
+		WINDOW	*win,
+		NCURSES_BOOL bf)
+		{ return(*(int *)0); }
+
+#undef wsyncup
+void	wsyncup(
+		WINDOW	*win)
+		{ /* void */ }
+
+#undef wsyncdown
+void	wsyncdown(
+		WINDOW	*win)
+		{ /* void */ }
+
+#undef wcursyncup
+void	wcursyncup(
+		WINDOW	*win)
+		{ /* void */ }
+
+#undef dupwin
+WINDOW	*dupwin(
+		WINDOW	*win)
+		{ return(*(WINDOW **)0); }
+
+/* ./base/nc_panel.c */
+
+#undef _nc_panelhook_sp
+struct panelhook *_nc_panelhook_sp(
+		SCREEN	*sp)
+		{ return(*(struct panelhook **)0); }
+
+#undef _nc_panelhook
+struct panelhook *_nc_panelhook(void)
+		{ return(*(struct panelhook **)0); }
+
+/* ./base/safe_sprintf.c */
+
+#undef _nc_printf_string_sp
+char	*_nc_printf_string_sp(
+		SCREEN	*sp,
+		const char *fmt,
+		va_list	ap)
+		{ return(*(char **)0); }
+
+#undef _nc_printf_string
+char	*_nc_printf_string(
+		const char *fmt,
+		va_list	ap)
+		{ return(*(char **)0); }
+
+/* ./tty/tty_update.c */
+
+#undef doupdate_sp
+int	doupdate_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef doupdate
+int	doupdate(void)
+		{ return(*(int *)0); }
+
+#undef _nc_scrolln_sp
+int	_nc_scrolln_sp(
+		SCREEN	*sp,
+		int	n,
+		int	top,
+		int	bot,
+		int	maxy)
+		{ return(*(int *)0); }
+
+#undef _nc_scrolln
+int	_nc_scrolln(
+		int	n,
+		int	top,
+		int	bot,
+		int	maxy)
+		{ return(*(int *)0); }
+
+#undef _nc_screen_resume_sp
+void	_nc_screen_resume_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_screen_resume
+void	_nc_screen_resume(void)
+		{ /* void */ }
+
+#undef _nc_screen_init_sp
+void	_nc_screen_init_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_screen_init
+void	_nc_screen_init(void)
+		{ /* void */ }
+
+#undef _nc_screen_wrap_sp
+void	_nc_screen_wrap_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_screen_wrap
+void	_nc_screen_wrap(void)
+		{ /* void */ }
+
+#undef _nc_do_xmc_glitch_sp
+void	_nc_do_xmc_glitch_sp(
+		SCREEN	*sp,
+		attr_t	previous)
+		{ /* void */ }
+
+#undef _nc_do_xmc_glitch
+void	_nc_do_xmc_glitch(
+		attr_t	previous)
+		{ /* void */ }
+
+/* ./trace/varargs.c */
+
+#undef _nc_varargs
+char	*_nc_varargs(
+		const char *fmt,
+		va_list	ap)
+		{ return(*(char **)0); }
+
+/* ./base/vsscanf.c */
+
+#undef _nc_vsscanf
+void	_nc_vsscanf(void)
+		{ /* void */ }
+
+/* ./base/lib_freeall.c */
+
+#undef _nc_freeall
+void	_nc_freeall(void)
+		{ /* void */ }
+
+#undef _nc_free_and_exit_sp
+void	_nc_free_and_exit_sp(
+		SCREEN	*sp,
+		int	code)
+		{ /* void */ }
+
+#undef _nc_free_and_exit
+void	_nc_free_and_exit(
+		int	code)
+		{ /* void */ }
+
+#undef exit_curses
+void	exit_curses(
+		int	code)
+		{ /* void */ }
+
+/* ./expanded.c */
+
+#undef _nc_toggle_attr_on
+void	_nc_toggle_attr_on(
+		attr_t	*S,
+		attr_t	at)
+		{ /* void */ }
+
+#undef _nc_toggle_attr_off
+void	_nc_toggle_attr_off(
+		attr_t	*S,
+		attr_t	at)
+		{ /* void */ }
+
+#undef _nc_DelCharCost_sp
+int	_nc_DelCharCost_sp(
+		SCREEN	*sp,
+		int	count)
+		{ return(*(int *)0); }
+
+#undef _nc_InsCharCost_sp
+int	_nc_InsCharCost_sp(
+		SCREEN	*sp,
+		int	count)
+		{ return(*(int *)0); }
+
+#undef _nc_UpdateAttrs_sp
+void	_nc_UpdateAttrs_sp(
+		SCREEN	*sp,
+		chtype	c)
+		{ /* void */ }
+
+#undef _nc_DelCharCost
+int	_nc_DelCharCost(
+		int	count)
+		{ return(*(int *)0); }
+
+#undef _nc_InsCharCost
+int	_nc_InsCharCost(
+		int	count)
+		{ return(*(int *)0); }
+
+#undef _nc_UpdateAttrs
+void	_nc_UpdateAttrs(
+		chtype	c)
+		{ /* void */ }
+
+/* ./base/legacy_coding.c */
+
+#undef use_legacy_coding_sp
+int	use_legacy_coding_sp(
+		SCREEN	*sp,
+		int	level)
+		{ return(*(int *)0); }
+
+#undef use_legacy_coding
+int	use_legacy_coding(
+		int	level)
+		{ return(*(int *)0); }
+
+/* ./base/lib_dft_fgbg.c */
+
+#undef use_default_colors_sp
+int	use_default_colors_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef use_default_colors
+int	use_default_colors(void)
+		{ return(*(int *)0); }
+
+#undef assume_default_colors_sp
+int	assume_default_colors_sp(
+		SCREEN	*sp,
+		int	fg,
+		int	bg)
+		{ return(*(int *)0); }
+
+#undef assume_default_colors
+int	assume_default_colors(
+		int	fg,
+		int	bg)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_print.c */
+
+#undef mcprint_sp
+int	mcprint_sp(
+		SCREEN	*sp,
+		char	*data,
+		int	len)
+		{ return(*(int *)0); }
+
+#undef mcprint
+int	mcprint(
+		char	*data,
+		int	len)
+		{ return(*(int *)0); }
+
+/* ./base/new_pair.c */
+
+#undef _nc_new_pair
+void	_nc_new_pair(void)
+		{ /* void */ }
+
+/* ./base/resizeterm.c */
+
+#undef is_term_resized_sp
+NCURSES_BOOL is_term_resized_sp(
+		SCREEN	*sp,
+		int	ToLines,
+		int	ToCols)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_term_resized
+NCURSES_BOOL is_term_resized(
+		int	ToLines,
+		int	ToCols)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef resize_term_sp
+int	resize_term_sp(
+		SCREEN	*sp,
+		int	ToLines,
+		int	ToCols)
+		{ return(*(int *)0); }
+
+#undef resize_term
+int	resize_term(
+		int	ToLines,
+		int	ToCols)
+		{ return(*(int *)0); }
+
+#undef resizeterm_sp
+int	resizeterm_sp(
+		SCREEN	*sp,
+		int	ToLines,
+		int	ToCols)
+		{ return(*(int *)0); }
+
+#undef resizeterm
+int	resizeterm(
+		int	ToLines,
+		int	ToCols)
+		{ return(*(int *)0); }
+
+/* ./trace/trace_xnames.c */
+
+#undef _nc_trace_xnames
+void	_nc_trace_xnames(
+		TERMTYPE *tp)
+		{ /* void */ }
+
+/* ./tinfo/use_screen.c */
+
+#undef use_screen
+int	use_screen(
+		SCREEN	*screen,
+		NCURSES_SCREEN_CB func,
+		void	*data)
+		{ return(*(int *)0); }
+
+/* ./base/use_window.c */
+
+#undef use_window
+int	use_window(
+		WINDOW	*win,
+		NCURSES_WINDOW_CB func,
+		void	*data)
+		{ return(*(int *)0); }
+
+/* ./base/wresize.c */
+
+#undef wresize
+int	wresize(
+		WINDOW	*win,
+		int	ToLines,
+		int	ToCols)
+		{ return(*(int *)0); }
+
+/* ./tinfo/access.c */
+
+#undef _nc_rootname
+char	*_nc_rootname(
+		char	*path)
+		{ return(*(char **)0); }
+
+#undef _nc_is_abs_path
+NCURSES_BOOL _nc_is_abs_path(
+		const char *path)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_pathlast
+unsigned _nc_pathlast(
+		const char *path)
+		{ return(*(unsigned *)0); }
+
+#undef _nc_basename
+char	*_nc_basename(
+		char	*path)
+		{ return(*(char **)0); }
+
+#undef _nc_access
+int	_nc_access(
+		const char *path,
+		int	mode)
+		{ return(*(int *)0); }
+
+#undef _nc_is_dir_path
+NCURSES_BOOL _nc_is_dir_path(
+		const char *path)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_is_file_path
+NCURSES_BOOL _nc_is_file_path(
+		const char *path)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_env_access
+int	_nc_env_access(void)
+		{ return(*(int *)0); }
+
+#undef _nc_safe_fopen
+FILE	*_nc_safe_fopen(
+		const char *path,
+		const char *mode)
+		{ return(*(FILE **)0); }
+
+#undef _nc_safe_open3
+int	_nc_safe_open3(
+		const char *path,
+		int	flags,
+		mode_t	mode)
+		{ return(*(int *)0); }
+
+/* ./tinfo/add_tries.c */
+
+#undef _nc_add_to_try
+int	_nc_add_to_try(
+		TRIES	**tree,
+		const char *str,
+		unsigned code)
+		{ return(*(int *)0); }
+
+/* ./tinfo/alloc_ttype.c */
+
+#undef _nc_align_termtype
+void	_nc_align_termtype(
+		TERMTYPE *to,
+		TERMTYPE *from)
+		{ /* void */ }
+
+#undef _nc_copy_termtype
+void	_nc_copy_termtype(
+		TERMTYPE *dst,
+		const TERMTYPE *src)
+		{ /* void */ }
+
+/* ./codes.c */
+
+#undef boolcodes
+const char *const boolcodes[] = {0};
+#undef numcodes
+const char *const numcodes[] = {0};
+#undef strcodes
+const char *const strcodes[] = {0};
+
+/* ./comp_captab.c */
+
+#undef _nc_get_table
+const struct name_table_entry *_nc_get_table(
+		NCURSES_BOOL termcap)
+		{ return(*(const struct name_table_entry **)0); }
+
+#undef _nc_get_hash_table
+const HashValue *_nc_get_hash_table(
+		NCURSES_BOOL termcap)
+		{ return(*(const HashValue **)0); }
+
+#undef _nc_get_alias_table
+const struct alias *_nc_get_alias_table(
+		NCURSES_BOOL termcap)
+		{ return(*(const struct alias **)0); }
+
+#undef _nc_get_hash_info
+const HashData *_nc_get_hash_info(
+		NCURSES_BOOL termcap)
+		{ return(*(const HashData **)0); }
+
+/* ./tinfo/comp_error.c */
+
+#undef _nc_suppress_warnings
+NCURSES_BOOL _nc_suppress_warnings;
+#undef _nc_curr_line
+int	_nc_curr_line;
+#undef _nc_curr_col
+int	_nc_curr_col;
+
+#undef _nc_get_source
+const char *_nc_get_source(void)
+		{ return(*(const char **)0); }
+
+#undef _nc_set_source
+void	_nc_set_source(
+		const char *const name)
+		{ /* void */ }
+
+#undef _nc_set_type
+void	_nc_set_type(
+		const char *const name)
+		{ /* void */ }
+
+#undef _nc_get_type
+void	_nc_get_type(
+		char	*name)
+		{ /* void */ }
+
+#undef _nc_warning
+void	_nc_warning(
+		const char *const fmt,
+		...)
+		{ /* void */ }
+
+#undef _nc_err_abort
+void	_nc_err_abort(
+		const char *const fmt,
+		...)
+		{ /* void */ }
+
+#undef _nc_syserr_abort
+void	_nc_syserr_abort(
+		const char *const fmt,
+		...)
+		{ /* void */ }
+
+/* ./tinfo/comp_hash.c */
+
+#undef _nc_find_entry
+struct name_table_entry const *_nc_find_entry(
+		const char *string,
+		const HashValue *hash_table)
+		{ return(*(struct name_table_entry const **)0); }
+
+#undef _nc_find_type_entry
+struct name_table_entry const *_nc_find_type_entry(
+		const char *string,
+		int	type,
+		NCURSES_BOOL termcap)
+		{ return(*(struct name_table_entry const **)0); }
+
+#undef _nc_find_user_entry
+struct user_table_entry const *_nc_find_user_entry(
+		const char *string)
+		{ return(*(struct user_table_entry const **)0); }
+
+/* ./comp_userdefs.c */
+
+#undef _nc_get_userdefs_table
+const struct user_table_entry *_nc_get_userdefs_table(void)
+		{ return(*(const struct user_table_entry **)0); }
+
+#undef _nc_get_hash_user
+const HashData *_nc_get_hash_user(void)
+		{ return(*(const HashData **)0); }
+
+/* ./tinfo/db_iterator.c */
+
+#undef _nc_tic_dir
+const char *_nc_tic_dir(
+		const char *path)
+		{ return(*(const char **)0); }
+
+#undef _nc_keep_tic_dir
+void	_nc_keep_tic_dir(
+		const char *path)
+		{ /* void */ }
+
+#undef _nc_last_db
+void	_nc_last_db(void)
+		{ /* void */ }
+
+#undef _nc_next_db
+const char *_nc_next_db(
+		DBDIRS	*state,
+		int	*offset)
+		{ return(*(const char **)0); }
+
+#undef _nc_first_db
+void	_nc_first_db(
+		DBDIRS	*state,
+		int	*offset)
+		{ /* void */ }
+
+/* ./tinfo/doalloc.c */
+
+#undef _nc_doalloc
+void	*_nc_doalloc(
+		void	*oldp,
+		size_t	amount)
+		{ return(*(void **)0); }
+
+/* ./tinfo/entries.c */
+
+#undef _nc_head
+ENTRY	*_nc_head;
+#undef _nc_tail
+ENTRY	*_nc_tail;
+
+#undef _nc_free_entry
+void	_nc_free_entry(
+		ENTRY	*headp,
+		TERMTYPE *tterm)
+		{ /* void */ }
+
+#undef _nc_free_entries
+void	_nc_free_entries(
+		ENTRY	*headp)
+		{ /* void */ }
+
+#undef _nc_leaks_tinfo
+void	_nc_leaks_tinfo(void)
+		{ /* void */ }
+
+#undef exit_terminfo
+void	exit_terminfo(
+		int	code)
+		{ /* void */ }
+
+/* ./fallback.c */
+
+#undef _nc_fallback
+const TERMTYPE *_nc_fallback(
+		const char *name)
+		{ return(*(const TERMTYPE **)0); }
+
+/* ./tinfo/free_ttype.c */
+
+#undef _nc_free_termtype
+void	_nc_free_termtype(
+		TERMTYPE *ptr)
+		{ /* void */ }
+
+#undef _nc_free_termtype1
+void	_nc_free_termtype1(
+		TERMTYPE *ptr)
+		{ /* void */ }
+
+#undef _nc_user_definable
+NCURSES_BOOL _nc_user_definable;
+
+#undef use_extended_names
+int	use_extended_names(
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+/* ./tinfo/getenv_num.c */
+
+#undef _nc_getenv_num
+int	_nc_getenv_num(
+		const char *name)
+		{ return(*(int *)0); }
+
+#undef _nc_setenv_num
+void	_nc_setenv_num(
+		const char *name,
+		int	value)
+		{ /* void */ }
+
+/* ./tinfo/home_terminfo.c */
+
+#undef _nc_home_terminfo
+char	*_nc_home_terminfo(void)
+		{ return(*(char **)0); }
+
+/* ./tinfo/init_keytry.c */
+
+#undef _nc_init_keytry
+void	_nc_init_keytry(
+		SCREEN	*sp)
+		{ /* void */ }
+
+/* ./tinfo/lib_acs.c */
+
+#undef acs_map
+chtype	acs_map[128];
+
+#undef _nc_init_acs_sp
+void	_nc_init_acs_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_init_acs
+void	_nc_init_acs(void)
+		{ /* void */ }
+
+/* ./tinfo/lib_baudrate.c */
+
+struct speed {
+    int given_speed;
+    int actual_speed;
+};
+
+#undef _nc_baudrate
+int	_nc_baudrate(
+		int	OSpeed)
+		{ return(*(int *)0); }
+
+#undef _nc_ospeed
+int	_nc_ospeed(
+		int	BaudRate)
+		{ return(*(int *)0); }
+
+#undef baudrate_sp
+int	baudrate_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef baudrate
+int	baudrate(void)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_cur_term.c */
+
+#undef cur_term
+TERMINAL *cur_term;
+
+#undef set_curterm_sp
+TERMINAL *set_curterm_sp(
+		SCREEN	*sp,
+		TERMINAL *termp)
+		{ return(*(TERMINAL **)0); }
+
+#undef set_curterm
+TERMINAL *set_curterm(
+		TERMINAL *termp)
+		{ return(*(TERMINAL **)0); }
+
+#undef del_curterm_sp
+int	del_curterm_sp(
+		SCREEN	*sp,
+		TERMINAL *termp)
+		{ return(*(int *)0); }
+
+#undef del_curterm
+int	del_curterm(
+		TERMINAL *termp)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_data.c */
+
+#undef stdscr
+WINDOW	*stdscr;
+#undef curscr
+WINDOW	*curscr;
+#undef newscr
+WINDOW	*newscr;
+#undef _nc_screen_chain
+SCREEN	*_nc_screen_chain;
+#undef SP
+SCREEN	*SP;
+#undef _nc_globals
+NCURSES_GLOBALS _nc_globals;
+#undef _nc_prescreen
+NCURSES_PRESCREEN _nc_prescreen;
+
+#undef _nc_screen_of
+SCREEN	*_nc_screen_of(
+		WINDOW	*win)
+		{ return(*(SCREEN **)0); }
+
+/* ./tinfo/lib_has_cap.c */
+
+#undef has_ic_sp
+NCURSES_BOOL has_ic_sp(
+		SCREEN	*sp)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef has_ic
+NCURSES_BOOL has_ic(void)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef has_il_sp
+NCURSES_BOOL has_il_sp(
+		SCREEN	*sp)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef has_il
+NCURSES_BOOL has_il(void)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./tinfo/lib_kernel.c */
+
+#undef erasechar_sp
+char	erasechar_sp(
+		SCREEN	*sp)
+		{ return(*(char *)0); }
+
+#undef erasechar
+char	erasechar(void)
+		{ return(*(char *)0); }
+
+#undef killchar_sp
+char	killchar_sp(
+		SCREEN	*sp)
+		{ return(*(char *)0); }
+
+#undef killchar
+char	killchar(void)
+		{ return(*(char *)0); }
+
+#undef flushinp_sp
+int	flushinp_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef flushinp
+int	flushinp(void)
+		{ return(*(int *)0); }
+
+/* ./lib_keyname.c */
+
+struct kn { short offset; int code; };
+
+#undef keyname_sp
+const char *keyname_sp(
+		SCREEN	*sp,
+		int	c)
+		{ return(*(const char **)0); }
+
+#undef keyname
+const char *keyname(
+		int	c)
+		{ return(*(const char **)0); }
+
+/* ./tinfo/lib_longname.c */
+
+#undef longname_sp
+char	*longname_sp(
+		SCREEN	*sp)
+		{ return(*(char **)0); }
+
+#undef longname
+char	*longname(void)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_napms.c */
+
+#undef napms_sp
+int	napms_sp(
+		SCREEN	*sp,
+		int	ms)
+		{ return(*(int *)0); }
+
+#undef napms
+int	napms(
+		int	ms)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_options.c */
+
+#undef idlok
+int	idlok(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef idcok
+void	idcok(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ /* void */ }
+
+#undef halfdelay_sp
+int	halfdelay_sp(
+		SCREEN	*sp,
+		int	t)
+		{ return(*(int *)0); }
+
+#undef halfdelay
+int	halfdelay(
+		int	t)
+		{ return(*(int *)0); }
+
+#undef nodelay
+int	nodelay(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef notimeout
+int	notimeout(
+		WINDOW	*win,
+		NCURSES_BOOL f)
+		{ return(*(int *)0); }
+
+#undef wtimeout
+void	wtimeout(
+		WINDOW	*win,
+		int	delay)
+		{ /* void */ }
+
+#undef keypad
+int	keypad(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef meta
+int	meta(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef curs_set_sp
+int	curs_set_sp(
+		SCREEN	*sp,
+		int	vis)
+		{ return(*(int *)0); }
+
+#undef curs_set
+int	curs_set(
+		int	vis)
+		{ return(*(int *)0); }
+
+#undef typeahead_sp
+int	typeahead_sp(
+		SCREEN	*sp,
+		int	fd)
+		{ return(*(int *)0); }
+
+#undef typeahead
+int	typeahead(
+		int	fd)
+		{ return(*(int *)0); }
+
+#undef has_key_sp
+int	has_key_sp(
+		SCREEN	*sp,
+		int	keycode)
+		{ return(*(int *)0); }
+
+#undef has_key
+int	has_key(
+		int	keycode)
+		{ return(*(int *)0); }
+
+#undef _nc_putp_flush_sp
+int	_nc_putp_flush_sp(
+		SCREEN	*sp,
+		const char *name,
+		const char *value)
+		{ return(*(int *)0); }
+
+#undef _nc_keypad
+int	_nc_keypad(
+		SCREEN	*sp,
+		int	flag)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_raw.c */
+
+#undef raw_sp
+int	raw_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef raw
+int	raw(void)
+		{ return(*(int *)0); }
+
+#undef cbreak_sp
+int	cbreak_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef cbreak
+int	cbreak(void)
+		{ return(*(int *)0); }
+
+#undef qiflush_sp
+void	qiflush_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef qiflush
+void	qiflush(void)
+		{ /* void */ }
+
+#undef noraw_sp
+int	noraw_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef noraw
+int	noraw(void)
+		{ return(*(int *)0); }
+
+#undef nocbreak_sp
+int	nocbreak_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef nocbreak
+int	nocbreak(void)
+		{ return(*(int *)0); }
+
+#undef noqiflush_sp
+void	noqiflush_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef noqiflush
+void	noqiflush(void)
+		{ /* void */ }
+
+#undef intrflush_sp
+int	intrflush_sp(
+		SCREEN	*sp,
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef intrflush
+int	intrflush(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_setup.c */
+
+#undef ttytype
+char	ttytype[256];
+#undef LINES
+int	LINES;
+#undef COLS
+int	COLS;
+#undef TABSIZE
+int	TABSIZE;
+
+#undef set_tabsize_sp
+int	set_tabsize_sp(
+		SCREEN	*sp,
+		int	value)
+		{ return(*(int *)0); }
+
+#undef set_tabsize
+int	set_tabsize(
+		int	value)
+		{ return(*(int *)0); }
+
+#undef _nc_handle_sigwinch
+int	_nc_handle_sigwinch(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef use_env_sp
+void	use_env_sp(
+		SCREEN	*sp,
+		NCURSES_BOOL f)
+		{ /* void */ }
+
+#undef use_tioctl_sp
+void	use_tioctl_sp(
+		SCREEN	*sp,
+		NCURSES_BOOL f)
+		{ /* void */ }
+
+#undef use_env
+void	use_env(
+		NCURSES_BOOL f)
+		{ /* void */ }
+
+#undef use_tioctl
+void	use_tioctl(
+		NCURSES_BOOL f)
+		{ /* void */ }
+
+#undef _nc_get_screensize
+void	_nc_get_screensize(
+		SCREEN	*sp,
+		int	*linep,
+		int	*colp)
+		{ /* void */ }
+
+#undef _nc_update_screensize
+void	_nc_update_screensize(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_setup_tinfo
+int	_nc_setup_tinfo(
+		const char *const tn,
+		TERMTYPE *const tp)
+		{ return(*(int *)0); }
+
+#undef _nc_tinfo_cmdch
+void	_nc_tinfo_cmdch(
+		TERMINAL *termp,
+		int	proto)
+		{ /* void */ }
+
+#undef _nc_get_locale
+char	*_nc_get_locale(void)
+		{ return(*(char **)0); }
+
+#undef _nc_unicode_locale
+int	_nc_unicode_locale(void)
+		{ return(*(int *)0); }
+
+#undef _nc_locale_breaks_acs
+int	_nc_locale_breaks_acs(
+		TERMINAL *termp)
+		{ return(*(int *)0); }
+
+#undef _nc_setupterm
+int	_nc_setupterm(
+		const char *tname,
+		int	Filedes,
+		int	*errret,
+		int	reuse)
+		{ return(*(int *)0); }
+
+#undef new_prescr
+SCREEN	*new_prescr(void)
+		{ return(*(SCREEN **)0); }
+
+#undef setupterm
+int	setupterm(
+		const char *tname,
+		int	Filedes,
+		int	*errret)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_termcap.c */
+
+#undef UP
+char	*UP;
+#undef BC
+char	*BC;
+
+#undef tgetent_sp
+int	tgetent_sp(
+		SCREEN	*sp,
+		char	*bufp,
+		const char *name)
+		{ return(*(int *)0); }
+
+#undef tgetent
+int	tgetent(
+		char	*bufp,
+		const char *name)
+		{ return(*(int *)0); }
+
+#undef tgetflag_sp
+int	tgetflag_sp(
+		SCREEN	*sp,
+		const char *id)
+		{ return(*(int *)0); }
+
+#undef tgetflag
+int	tgetflag(
+		const char *id)
+		{ return(*(int *)0); }
+
+#undef tgetnum_sp
+int	tgetnum_sp(
+		SCREEN	*sp,
+		const char *id)
+		{ return(*(int *)0); }
+
+#undef tgetnum
+int	tgetnum(
+		const char *id)
+		{ return(*(int *)0); }
+
+#undef tgetstr_sp
+char	*tgetstr_sp(
+		SCREEN	*sp,
+		const char *id,
+		char	**area)
+		{ return(*(char **)0); }
+
+#undef tgetstr
+char	*tgetstr(
+		const char *id,
+		char	**area)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_termname.c */
+
+#undef termname_sp
+char	*termname_sp(
+		SCREEN	*sp)
+		{ return(*(char **)0); }
+
+#undef termname
+char	*termname(void)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_tgoto.c */
+
+#undef tgoto
+char	*tgoto(
+		const char *string,
+		int	x,
+		int	y)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_ti.c */
+
+#undef tigetflag_sp
+int	tigetflag_sp(
+		SCREEN	*sp,
+		const char *str)
+		{ return(*(int *)0); }
+
+#undef tigetflag
+int	tigetflag(
+		const char *str)
+		{ return(*(int *)0); }
+
+#undef tigetnum_sp
+int	tigetnum_sp(
+		SCREEN	*sp,
+		const char *str)
+		{ return(*(int *)0); }
+
+#undef tigetnum
+int	tigetnum(
+		const char *str)
+		{ return(*(int *)0); }
+
+#undef tigetstr_sp
+char	*tigetstr_sp(
+		SCREEN	*sp,
+		const char *str)
+		{ return(*(char **)0); }
+
+#undef tigetstr
+char	*tigetstr(
+		const char *str)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_tparm.c */
+
+#undef _nc_tparm_err
+int	_nc_tparm_err;
+
+#undef _nc_free_tparm
+void	_nc_free_tparm(
+		TERMINAL *termp)
+		{ /* void */ }
+
+#undef _nc_tparm_analyze
+int	_nc_tparm_analyze(
+		TERMINAL *term,
+		const char *string,
+		char	**p_is_s,
+		int	*_nc_popcount)
+		{ return(*(int *)0); }
+
+#undef tparm
+char	*tparm(
+		const char *string,
+		...)
+		{ return(*(char **)0); }
+
+#undef tiparm
+char	*tiparm(
+		const char *string,
+		...)
+		{ return(*(char **)0); }
+
+#undef _nc_tiparm
+char	*_nc_tiparm(
+		int	expected,
+		const char *string,
+		...)
+		{ return(*(char **)0); }
+
+#undef _nc_reset_tparm
+void	_nc_reset_tparm(
+		TERMINAL *term)
+		{ /* void */ }
+
+/* ./tinfo/lib_tputs.c */
+
+#undef PC
+char	PC;
+#undef ospeed
+short	ospeed;
+#undef _nc_nulls_sent
+int	_nc_nulls_sent;
+
+#undef _nc_set_no_padding
+void	_nc_set_no_padding(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef delay_output_sp
+int	delay_output_sp(
+		SCREEN	*sp,
+		int	ms)
+		{ return(*(int *)0); }
+
+#undef delay_output
+int	delay_output(
+		int	ms)
+		{ return(*(int *)0); }
+
+#undef _nc_flush_sp
+void	_nc_flush_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_flush
+void	_nc_flush(void)
+		{ /* void */ }
+
+#undef _nc_outch_sp
+int	_nc_outch_sp(
+		SCREEN	*sp,
+		int	ch)
+		{ return(*(int *)0); }
+
+#undef _nc_outch
+int	_nc_outch(
+		int	ch)
+		{ return(*(int *)0); }
+
+#undef _nc_putchar_sp
+int	_nc_putchar_sp(
+		SCREEN	*sp,
+		int	ch)
+		{ return(*(int *)0); }
+
+#undef _nc_putchar
+int	_nc_putchar(
+		int	ch)
+		{ return(*(int *)0); }
+
+#undef putp_sp
+int	putp_sp(
+		SCREEN	*sp,
+		const char *string)
+		{ return(*(int *)0); }
+
+#undef putp
+int	putp(
+		const char *string)
+		{ return(*(int *)0); }
+
+#undef _nc_putp_sp
+int	_nc_putp_sp(
+		SCREEN	*sp,
+		const char *name,
+		const char *string)
+		{ return(*(int *)0); }
+
+#undef _nc_putp
+int	_nc_putp(
+		const char *name,
+		const char *string)
+		{ return(*(int *)0); }
+
+#undef tputs_sp
+int	tputs_sp(
+		SCREEN	*sp,
+		const char *string,
+		int	affcnt,
+		NCURSES_OUTC_sp outc)
+		{ return(*(int *)0); }
+
+#undef _nc_outc_wrapper
+int	_nc_outc_wrapper(
+		SCREEN	*sp,
+		int	c)
+		{ return(*(int *)0); }
+
+#undef tputs
+int	tputs(
+		const char *string,
+		int	affcnt,
+		int	(*outc)(
+		int	p1))
+		{ return(*(int *)0); }
+
+/* ./trace/lib_trace.c */
+
+#undef _nc_tracing
+unsigned _nc_tracing;
+#undef _nc_tputs_trace
+const char *_nc_tputs_trace = {0};
+#undef _nc_outchars
+long	_nc_outchars;
+
+#undef curses_trace
+unsigned curses_trace(
+		unsigned tracelevel)
+		{ return(*(unsigned *)0); }
+
+#undef trace
+void	trace(
+		const unsigned int tracelevel)
+		{ /* void */ }
+
+#undef _tracef
+void	_tracef(
+		const char *fmt,
+		...)
+		{ /* void */ }
+
+#undef _nc_retrace_bool
+NCURSES_BOOL _nc_retrace_bool(
+		int	code)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_retrace_char
+char	_nc_retrace_char(
+		int	code)
+		{ return(*(char *)0); }
+
+#undef _nc_retrace_int
+int	_nc_retrace_int(
+		int	code)
+		{ return(*(int *)0); }
+
+#undef _nc_retrace_unsigned
+unsigned _nc_retrace_unsigned(
+		unsigned code)
+		{ return(*(unsigned *)0); }
+
+#undef _nc_retrace_ptr
+char	*_nc_retrace_ptr(
+		char	*code)
+		{ return(*(char **)0); }
+
+#undef _nc_retrace_cptr
+const char *_nc_retrace_cptr(
+		const char *code)
+		{ return(*(const char **)0); }
+
+#undef _nc_retrace_cvoid_ptr
+const void *_nc_retrace_cvoid_ptr(
+		const void *code)
+		{ return(*(const void **)0); }
+
+#undef _nc_retrace_void_ptr
+void	*_nc_retrace_void_ptr(
+		void	*code)
+		{ return(*(void **)0); }
+
+#undef _nc_retrace_sp
+SCREEN	*_nc_retrace_sp(
+		SCREEN	*code)
+		{ return(*(SCREEN **)0); }
+
+#undef _nc_retrace_win
+WINDOW	*_nc_retrace_win(
+		WINDOW	*code)
+		{ return(*(WINDOW **)0); }
+
+#undef _nc_fmt_funcptr
+char	*_nc_fmt_funcptr(
+		char	*target,
+		const char *source,
+		size_t	size)
+		{ return(*(char **)0); }
+
+/* ./trace/lib_traceatr.c */
+
+#undef _traceattr2
+char	*_traceattr2(
+		int	bufnum,
+		chtype	newmode)
+		{ return(*(char **)0); }
+
+#undef _traceattr
+char	*_traceattr(
+		attr_t	newmode)
+		{ return(*(char **)0); }
+
+#undef _nc_retrace_int_attr_t
+int	_nc_retrace_int_attr_t(
+		attr_t	code)
+		{ return(*(int *)0); }
+
+#undef _nc_retrace_attr_t
+attr_t	_nc_retrace_attr_t(
+		attr_t	code)
+		{ return(*(attr_t *)0); }
+
+#undef _nc_altcharset_name
+const char *_nc_altcharset_name(
+		attr_t	attr,
+		chtype	ch)
+		{ return(*(const char **)0); }
+
+#undef _tracechtype2
+char	*_tracechtype2(
+		int	bufnum,
+		chtype	ch)
+		{ return(*(char **)0); }
+
+#undef _tracechtype
+char	*_tracechtype(
+		chtype	ch)
+		{ return(*(char **)0); }
+
+#undef _nc_retrace_chtype
+chtype	_nc_retrace_chtype(
+		chtype	code)
+		{ return(*(chtype *)0); }
+
+/* ./trace/lib_tracebits.c */
+
+#undef _nc_trace_ttymode
+char	*_nc_trace_ttymode(
+		const struct termios *tty)
+		{ return(*(char **)0); }
+
+#undef _nc_tracebits
+char	*_nc_tracebits(void)
+		{ return(*(char **)0); }
+
+/* ./trace/lib_tracechr.c */
+
+#undef _nc_tracechar
+char	*_nc_tracechar(
+		SCREEN	*sp,
+		int	ch)
+		{ return(*(char **)0); }
+
+#undef _tracechar
+char	*_tracechar(
+		int	ch)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_ttyflags.c */
+
+#undef _nc_get_tty_mode_sp
+int	_nc_get_tty_mode_sp(
+		SCREEN	*sp,
+		struct termios *buf)
+		{ return(*(int *)0); }
+
+#undef _nc_get_tty_mode
+int	_nc_get_tty_mode(
+		struct termios *buf)
+		{ return(*(int *)0); }
+
+#undef _nc_set_tty_mode_sp
+int	_nc_set_tty_mode_sp(
+		SCREEN	*sp,
+		struct termios *buf)
+		{ return(*(int *)0); }
+
+#undef _nc_set_tty_mode
+int	_nc_set_tty_mode(
+		struct termios *buf)
+		{ return(*(int *)0); }
+
+#undef def_shell_mode_sp
+int	def_shell_mode_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef def_shell_mode
+int	def_shell_mode(void)
+		{ return(*(int *)0); }
+
+#undef def_prog_mode_sp
+int	def_prog_mode_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef def_prog_mode
+int	def_prog_mode(void)
+		{ return(*(int *)0); }
+
+#undef reset_prog_mode_sp
+int	reset_prog_mode_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef reset_prog_mode
+int	reset_prog_mode(void)
+		{ return(*(int *)0); }
+
+#undef reset_shell_mode_sp
+int	reset_shell_mode_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef reset_shell_mode
+int	reset_shell_mode(void)
+		{ return(*(int *)0); }
+
+#undef savetty_sp
+int	savetty_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef savetty
+int	savetty(void)
+		{ return(*(int *)0); }
+
+#undef resetty_sp
+int	resetty_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef resetty
+int	resetty(void)
+		{ return(*(int *)0); }
+
+/* ./tty/lib_twait.c */
+
+#undef _nc_timed_wait
+int	_nc_timed_wait(
+		SCREEN	*sp,
+		int	mode,
+		int	milliseconds,
+		int	*timeleft)
+		{ return(*(int *)0); }
+
+/* ./tinfo/name_match.c */
+
+#undef _nc_first_name
+char	*_nc_first_name(
+		const char *const sp)
+		{ return(*(char **)0); }
+
+#undef _nc_name_match
+int	_nc_name_match(
+		const char *const namelst,
+		const char *const name,
+		const char *const delim)
+		{ return(*(int *)0); }
+
+/* ./names.c */
+
+#undef boolnames
+const char *const boolnames[] = {0};
+#undef boolfnames
+const char *const boolfnames[] = {0};
+#undef numnames
+const char *const numnames[] = {0};
+#undef numfnames
+const char *const numfnames[] = {0};
+#undef strnames
+const char *const strnames[] = {0};
+#undef strfnames
+const char *const strfnames[] = {0};
+
+/* ./tinfo/obsolete.c */
+
+#undef _nc_set_buffer_sp
+void	_nc_set_buffer_sp(
+		SCREEN	*sp,
+		FILE	*ofp,
+		int	buffered)
+		{ /* void */ }
+
+#undef _nc_set_buffer
+void	_nc_set_buffer(
+		FILE	*ofp,
+		int	buffered)
+		{ /* void */ }
+
+/* ./tinfo/read_entry.c */
+
+#undef _nc_init_termtype
+void	_nc_init_termtype(
+		TERMTYPE *const tp)
+		{ /* void */ }
+
+#undef _nc_read_termtype
+int	_nc_read_termtype(
+		TERMTYPE *ptr,
+		char	*buffer,
+		int	limit)
+		{ return(*(int *)0); }
+
+#undef _nc_read_file_entry
+int	_nc_read_file_entry(
+		const char *const filename,
+		TERMTYPE *ptr)
+		{ return(*(int *)0); }
+
+#undef _nc_read_entry
+int	_nc_read_entry(
+		const char *const name,
+		char	*const filename,
+		TERMTYPE *const tp)
+		{ return(*(int *)0); }
+
+/* ./tinfo/read_termcap.c */
+
+#undef _nc_read_termcap_entry
+int	_nc_read_termcap_entry(
+		const char *const tn,
+		TERMTYPE *const tp)
+		{ return(*(int *)0); }
+
+/* ./tinfo/strings.c */
+
+#undef _nc_str_init
+string_desc *_nc_str_init(
+		string_desc *dst,
+		char	*src,
+		size_t	len)
+		{ return(*(string_desc **)0); }
+
+#undef _nc_str_null
+string_desc *_nc_str_null(
+		string_desc *dst,
+		size_t	len)
+		{ return(*(string_desc **)0); }
+
+#undef _nc_str_copy
+string_desc *_nc_str_copy(
+		string_desc *dst,
+		string_desc *src)
+		{ return(*(string_desc **)0); }
+
+#undef _nc_safe_strcat
+NCURSES_BOOL _nc_safe_strcat(
+		string_desc *dst,
+		const char *src)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_safe_strcpy
+NCURSES_BOOL _nc_safe_strcpy(
+		string_desc *dst,
+		const char *src)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./trace/trace_buf.c */
+
+#undef _nc_trace_buf
+char	*_nc_trace_buf(
+		int	bufnum,
+		size_t	want)
+		{ return(*(char **)0); }
+
+#undef _nc_trace_bufcat
+char	*_nc_trace_bufcat(
+		int	bufnum,
+		const char *value)
+		{ return(*(char **)0); }
+
+/* ./trace/trace_tries.c */
+
+#undef _nc_trace_tries
+void	_nc_trace_tries(
+		TRIES	*tree)
+		{ /* void */ }
+
+/* ./base/tries.c */
+
+#undef _nc_expand_try
+char	*_nc_expand_try(
+		TRIES	*tree,
+		unsigned code,
+		int	*count,
+		size_t	len)
+		{ return(*(char **)0); }
+
+#undef _nc_remove_key
+int	_nc_remove_key(
+		TRIES	**tree,
+		unsigned code)
+		{ return(*(int *)0); }
+
+#undef _nc_remove_string
+int	_nc_remove_string(
+		TRIES	**tree,
+		const char *string)
+		{ return(*(int *)0); }
+
+/* ./tinfo/trim_sgr0.c */
+
+#undef _nc_trim_sgr0
+char	*_nc_trim_sgr0(
+		TERMTYPE *tp)
+		{ return(*(char **)0); }
+
+/* ./unctrl.c */
+
+#undef unctrl_sp
+const char *unctrl_sp(
+		SCREEN	*sp,
+		chtype	ch)
+		{ return(*(const char **)0); }
+
+#undef unctrl
+const char *unctrl(
+		chtype	ch)
+		{ return(*(const char **)0); }
+
+/* ./trace/visbuf.c */
+
+#undef _nc_visbuf2
+const char *_nc_visbuf2(
+		int	bufnum,
+		const char *buf)
+		{ return(*(const char **)0); }
+
+#undef _nc_visbuf
+const char *_nc_visbuf(
+		const char *buf)
+		{ return(*(const char **)0); }
+
+#undef _nc_visbufn
+const char *_nc_visbufn(
+		const char *buf,
+		int	len)
+		{ return(*(const char **)0); }
+
+#undef _nc_viscbuf2
+const char *_nc_viscbuf2(
+		int	bufnum,
+		const chtype *buf,
+		int	len)
+		{ return(*(const char **)0); }
+
+#undef _nc_viscbuf
+const char *_nc_viscbuf(
+		const chtype *buf,
+		int	len)
+		{ return(*(const char **)0); }
+
+/* ./tinfo/alloc_entry.c */
+
+#undef _nc_init_entry
+void	_nc_init_entry(
+		ENTRY	*const tp)
+		{ /* void */ }
+
+#undef _nc_copy_entry
+ENTRY	*_nc_copy_entry(
+		ENTRY	*oldp)
+		{ return(*(ENTRY **)0); }
+
+#undef _nc_save_str
+char	*_nc_save_str(
+		const char *string)
+		{ return(*(char **)0); }
+
+#undef _nc_wrap_entry
+void	_nc_wrap_entry(
+		ENTRY	*const ep,
+		NCURSES_BOOL copy_strings)
+		{ /* void */ }
+
+#undef _nc_merge_entry
+void	_nc_merge_entry(
+		ENTRY	*const target,
+		ENTRY	*const source)
+		{ /* void */ }
+
+/* ./tinfo/captoinfo.c */
+
+#undef _nc_captoinfo
+char	*_nc_captoinfo(
+		const char *cap,
+		const char *s,
+		int const parameterized)
+		{ return(*(char **)0); }
+
+#undef _nc_infotocap
+char	*_nc_infotocap(
+		const char *cap,
+		const char *str,
+		int const parameterized)
+		{ return(*(char **)0); }
+
+/* ./tinfo/comp_expand.c */
+
+#undef _nc_tic_expand
+char	*_nc_tic_expand(
+		const char *srcp,
+		NCURSES_BOOL tic_format,
+		int	numbers)
+		{ return(*(char **)0); }
+
+/* ./tinfo/comp_parse.c */
+
+#undef _nc_check_termtype2
+void	(*_nc_check_termtype2)(
+		TERMTYPE *p1,
+		NCURSES_BOOL p2);
+
+#undef _nc_entry_match
+NCURSES_BOOL _nc_entry_match(
+		char	*n1,
+		char	*n2)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_read_entry_source
+void	_nc_read_entry_source(
+		FILE	*fp,
+		char	*buf,
+		int	literal,
+		NCURSES_BOOL silent,
+		NCURSES_BOOL (*hook)(
+		ENTRY	*p1))
+		{ /* void */ }
+
+#undef _nc_resolve_uses2
+int	_nc_resolve_uses2(
+		NCURSES_BOOL fullresolve,
+		NCURSES_BOOL literal)
+		{ return(*(int *)0); }
+
+/* ./tinfo/comp_scan.c */
+
+#undef _nc_syntax
+int	_nc_syntax;
+#undef _nc_strict_bsd
+int	_nc_strict_bsd;
+#undef _nc_curr_file_pos
+long	_nc_curr_file_pos;
+#undef _nc_comment_start
+long	_nc_comment_start;
+#undef _nc_comment_end
+long	_nc_comment_end;
+#undef _nc_start_line
+long	_nc_start_line;
+#undef _nc_curr_token
+struct token _nc_curr_token;
+#undef _nc_disable_period
+NCURSES_BOOL _nc_disable_period;
+
+#undef _nc_reset_input
+void	_nc_reset_input(
+		FILE	*fp,
+		char	*buf)
+		{ /* void */ }
+
+#undef _nc_get_token
+int	_nc_get_token(
+		NCURSES_BOOL silent)
+		{ return(*(int *)0); }
+
+#undef _nc_trans_string
+int	_nc_trans_string(
+		char	*ptr,
+		char	*last)
+		{ return(*(int *)0); }
+
+#undef _nc_push_token
+void	_nc_push_token(
+		int	tokclass)
+		{ /* void */ }
+
+#undef _nc_panic_mode
+void	_nc_panic_mode(
+		char	ch)
+		{ /* void */ }
+
+/* ./tinfo/parse_entry.c */
+
+#undef _nc_parse_entry
+int	_nc_parse_entry(
+		ENTRY	*entryp,
+		int	literal,
+		NCURSES_BOOL silent)
+		{ return(*(int *)0); }
+
+#undef _nc_capcmp
+int	_nc_capcmp(
+		const char *s,
+		const char *t)
+		{ return(*(int *)0); }
+
+/* ./tinfo/write_entry.c */
+
+#undef _nc_set_writedir
+void	_nc_set_writedir(
+		const char *dir)
+		{ /* void */ }
+
+#undef _nc_write_entry
+void	_nc_write_entry(
+		TERMTYPE *const tp)
+		{ /* void */ }
+
+#undef _nc_write_object
+int	_nc_write_object(
+		TERMTYPE *tp,
+		char	*buffer,
+		unsigned *offset,
+		unsigned limit)
+		{ return(*(int *)0); }
+
+#undef _nc_tic_written
+int	_nc_tic_written(void)
+		{ return(*(int *)0); }
+
+/* ./base/define_key.c */
+
+#undef define_key_sp
+int	define_key_sp(
+		SCREEN	*sp,
+		const char *str,
+		int	keycode)
+		{ return(*(int *)0); }
+
+#undef define_key
+int	define_key(
+		const char *str,
+		int	keycode)
+		{ return(*(int *)0); }
+
+/* ./tinfo/hashed_db.c */
+
+#undef _nc_hashed_db
+void	_nc_hashed_db(void)
+		{ /* void */ }
+
+/* ./base/key_defined.c */
+
+#undef key_defined_sp
+int	key_defined_sp(
+		SCREEN	*sp,
+		const char *str)
+		{ return(*(int *)0); }
+
+#undef key_defined
+int	key_defined(
+		const char *str)
+		{ return(*(int *)0); }
+
+/* ./base/keybound.c */
+
+#undef keybound_sp
+char	*keybound_sp(
+		SCREEN	*sp,
+		int	code,
+		int	count)
+		{ return(*(char **)0); }
+
+#undef keybound
+char	*keybound(
+		int	code,
+		int	count)
+		{ return(*(char **)0); }
+
+/* ./base/keyok.c */
+
+#undef keyok_sp
+int	keyok_sp(
+		SCREEN	*sp,
+		int	c,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef keyok
+int	keyok(
+		int	c,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+/* ./base/version.c */
+
+#undef curses_version
+const char *curses_version(void)
+		{ return(*(const char **)0); }
diff --git a/ncurses/llib-lncursest b/ncurses/llib-lncursest
new file mode 100644
index 0000000..1b09d67
--- /dev/null
+++ b/ncurses/llib-lncursest
@@ -0,0 +1,4576 @@
+/****************************************************************************
+ * Copyright 2019,2021,2022 Thomas E. Dickey                                *
+ * Copyright 2008-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey       2008-on                                  *
+ ****************************************************************************/
+/* LINTLIBRARY */
+
+/* ./tty/hardscroll.c */
+
+#include <curses.priv.h>
+
+#undef _nc_oldnums
+int	*_nc_oldnums;
+
+#undef _nc_scroll_optimize_sp
+void	_nc_scroll_optimize_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_scroll_optimize
+void	_nc_scroll_optimize(void)
+		{ /* void */ }
+
+#undef _nc_linedump_sp
+void	_nc_linedump_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_linedump
+void	_nc_linedump(void)
+		{ /* void */ }
+
+/* ./tty/hashmap.c */
+
+#undef _nc_hash_map_sp
+void	_nc_hash_map_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_hash_map
+void	_nc_hash_map(void)
+		{ /* void */ }
+
+#undef _nc_make_oldhash_sp
+void	_nc_make_oldhash_sp(
+		SCREEN	*sp,
+		int	i)
+		{ /* void */ }
+
+#undef _nc_make_oldhash
+void	_nc_make_oldhash(
+		int	i)
+		{ /* void */ }
+
+#undef _nc_scroll_oldhash_sp
+void	_nc_scroll_oldhash_sp(
+		SCREEN	*sp,
+		int	n,
+		int	top,
+		int	bot)
+		{ /* void */ }
+
+#undef _nc_scroll_oldhash
+void	_nc_scroll_oldhash(
+		int	n,
+		int	top,
+		int	bot)
+		{ /* void */ }
+
+/* ./base/lib_addch.c */
+
+#undef _nc_render
+chtype	_nc_render(
+		WINDOW	*win,
+		chtype	ch)
+		{ return(*(chtype *)0); }
+
+#undef _nc_waddch_nosync
+int	_nc_waddch_nosync(
+		WINDOW	*win,
+		const chtype c)
+		{ return(*(int *)0); }
+
+#undef waddch
+int	waddch(
+		WINDOW	*win,
+		const chtype ch)
+		{ return(*(int *)0); }
+
+#undef wechochar
+int	wechochar(
+		WINDOW	*win,
+		const chtype ch)
+		{ return(*(int *)0); }
+
+/* ./base/lib_addstr.c */
+
+#undef waddnstr
+int	waddnstr(
+		WINDOW	*win,
+		const char *astr,
+		int	n)
+		{ return(*(int *)0); }
+
+#undef waddchnstr
+int	waddchnstr(
+		WINDOW	*win,
+		const chtype *astr,
+		int	n)
+		{ return(*(int *)0); }
+
+/* ./base/lib_beep.c */
+
+#undef beep_sp
+int	beep_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef beep
+int	beep(void)
+		{ return(*(int *)0); }
+
+/* ./base/lib_bkgd.c */
+
+#undef wbkgdset
+void	wbkgdset(
+		WINDOW	*win,
+		chtype	ch)
+		{ /* void */ }
+
+#undef wbkgd
+int	wbkgd(
+		WINDOW	*win,
+		chtype	ch)
+		{ return(*(int *)0); }
+
+/* ./base/lib_box.c */
+
+#undef wborder
+int	wborder(
+		WINDOW	*win,
+		chtype	ls,
+		chtype	rs,
+		chtype	ts,
+		chtype	bs,
+		chtype	tl,
+		chtype	tr,
+		chtype	bl,
+		chtype	br)
+		{ return(*(int *)0); }
+
+/* ./base/lib_chgat.c */
+
+#undef wchgat
+int	wchgat(
+		WINDOW	*win,
+		int	n,
+		attr_t	attr,
+		short	pair_arg,
+		const void *opts)
+		{ return(*(int *)0); }
+
+/* ./base/lib_clear.c */
+
+#undef wclear
+int	wclear(
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+/* ./base/lib_clearok.c */
+
+#undef clearok
+int	clearok(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+/* ./base/lib_clrbot.c */
+
+#undef wclrtobot
+int	wclrtobot(
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+/* ./base/lib_clreol.c */
+
+#undef wclrtoeol
+int	wclrtoeol(
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+/* ./base/lib_color.c */
+
+#undef _nc_COLOR_PAIRS
+int	_nc_COLOR_PAIRS(void)
+		{ return(*(int *)0); }
+
+#undef _nc_COLORS
+int	_nc_COLORS(void)
+		{ return(*(int *)0); }
+
+#undef _nc_reset_colors_sp
+NCURSES_BOOL _nc_reset_colors_sp(
+		SCREEN	*sp)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_reset_colors
+NCURSES_BOOL _nc_reset_colors(void)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef start_color_sp
+int	start_color_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef start_color
+int	start_color(void)
+		{ return(*(int *)0); }
+
+#undef _nc_change_pair
+void	_nc_change_pair(
+		SCREEN	*sp,
+		int	pair)
+		{ /* void */ }
+
+#undef _nc_reserve_pairs
+void	_nc_reserve_pairs(
+		SCREEN	*sp,
+		int	want)
+		{ /* void */ }
+
+#undef _nc_init_pair
+int	_nc_init_pair(
+		SCREEN	*sp,
+		int	pair,
+		int	f,
+		int	b)
+		{ return(*(int *)0); }
+
+#undef init_pair_sp
+int	init_pair_sp(
+		SCREEN	*sp,
+		short	pair,
+		short	f,
+		short	b)
+		{ return(*(int *)0); }
+
+#undef init_pair
+int	init_pair(
+		short	pair,
+		short	f,
+		short	b)
+		{ return(*(int *)0); }
+
+#undef _nc_init_color
+int	_nc_init_color(
+		SCREEN	*sp,
+		int	color,
+		int	r,
+		int	g,
+		int	b)
+		{ return(*(int *)0); }
+
+#undef init_color_sp
+int	init_color_sp(
+		SCREEN	*sp,
+		short	color,
+		short	r,
+		short	g,
+		short	b)
+		{ return(*(int *)0); }
+
+#undef init_color
+int	init_color(
+		short	color,
+		short	r,
+		short	g,
+		short	b)
+		{ return(*(int *)0); }
+
+#undef can_change_color_sp
+NCURSES_BOOL can_change_color_sp(
+		SCREEN	*sp)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef can_change_color
+NCURSES_BOOL can_change_color(void)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef has_colors_sp
+NCURSES_BOOL has_colors_sp(
+		SCREEN	*sp)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef has_colors
+NCURSES_BOOL has_colors(void)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef color_content_sp
+int	color_content_sp(
+		SCREEN	*sp,
+		short	color,
+		short	*r,
+		short	*g,
+		short	*b)
+		{ return(*(int *)0); }
+
+#undef color_content
+int	color_content(
+		short	color,
+		short	*r,
+		short	*g,
+		short	*b)
+		{ return(*(int *)0); }
+
+#undef _nc_pair_content
+int	_nc_pair_content(
+		SCREEN	*sp,
+		int	pair,
+		int	*f,
+		int	*b)
+		{ return(*(int *)0); }
+
+#undef pair_content_sp
+int	pair_content_sp(
+		SCREEN	*sp,
+		short	pair,
+		short	*f,
+		short	*b)
+		{ return(*(int *)0); }
+
+#undef pair_content
+int	pair_content(
+		short	pair,
+		short	*f,
+		short	*b)
+		{ return(*(int *)0); }
+
+#undef _nc_do_color_sp
+void	_nc_do_color_sp(
+		SCREEN	*sp,
+		int	old_pair,
+		int	pair,
+		int	reverse,
+		NCURSES_OUTC_sp outc)
+		{ /* void */ }
+
+#undef _nc_do_color
+void	_nc_do_color(
+		int	old_pair,
+		int	pair,
+		int	reverse,
+		NCURSES_OUTC outc)
+		{ /* void */ }
+
+/* ./base/lib_colorset.c */
+
+#undef wcolor_set
+int	wcolor_set(
+		WINDOW	*win,
+		short	pair_arg,
+		void	*opts)
+		{ return(*(int *)0); }
+
+/* ./base/lib_delch.c */
+
+#undef wdelch
+int	wdelch(
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+/* ./base/lib_delwin.c */
+
+#undef delwin
+int	delwin(
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+/* ./base/lib_echo.c */
+
+#undef echo_sp
+int	echo_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef echo
+int	echo(void)
+		{ return(*(int *)0); }
+
+#undef noecho_sp
+int	noecho_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef noecho
+int	noecho(void)
+		{ return(*(int *)0); }
+
+/* ./base/lib_endwin.c */
+
+#undef endwin_sp
+int	endwin_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef endwin
+int	endwin(void)
+		{ return(*(int *)0); }
+
+/* ./base/lib_erase.c */
+
+#undef werase
+int	werase(
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+/* ./base/lib_flash.c */
+
+#undef flash_sp
+int	flash_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef flash
+int	flash(void)
+		{ return(*(int *)0); }
+
+/* ./lib_gen.c */
+
+#undef addch
+int	addch(
+		const chtype z)
+		{ return(*(int *)0); }
+
+#undef addchnstr
+int	addchnstr(
+		const chtype *a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef addchstr
+int	addchstr(
+		const chtype *z)
+		{ return(*(int *)0); }
+
+#undef addnstr
+int	addnstr(
+		const char *a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef addstr
+int	addstr(
+		const char *z)
+		{ return(*(int *)0); }
+
+#undef attroff
+int	attroff(
+		NCURSES_ATTR_T	z)
+		{ return(*(int *)0); }
+
+#undef attron
+int	attron(
+		NCURSES_ATTR_T	z)
+		{ return(*(int *)0); }
+
+#undef attrset
+int	attrset(
+		NCURSES_ATTR_T	z)
+		{ return(*(int *)0); }
+
+#undef attr_get
+int	attr_get(
+		attr_t	*a1,
+		short	*a2,
+		void	*z)
+		{ return(*(int *)0); }
+
+#undef attr_off
+int	attr_off(
+		attr_t	a1,
+		void	*z)
+		{ return(*(int *)0); }
+
+#undef attr_on
+int	attr_on(
+		attr_t	a1,
+		void	*z)
+		{ return(*(int *)0); }
+
+#undef attr_set
+int	attr_set(
+		attr_t	a1,
+		short	a2,
+		void	*z)
+		{ return(*(int *)0); }
+
+#undef bkgd
+int	bkgd(
+		chtype	z)
+		{ return(*(int *)0); }
+
+#undef bkgdset
+void	bkgdset(
+		chtype	z)
+		{ /* void */ }
+
+#undef border
+int	border(
+		chtype	a1,
+		chtype	a2,
+		chtype	a3,
+		chtype	a4,
+		chtype	a5,
+		chtype	a6,
+		chtype	a7,
+		chtype	z)
+		{ return(*(int *)0); }
+
+#undef box
+int	box(
+		WINDOW	*a1,
+		chtype	a2,
+		chtype	z)
+		{ return(*(int *)0); }
+
+#undef chgat
+int	chgat(
+		int	a1,
+		attr_t	a2,
+		short	a3,
+		const void *z)
+		{ return(*(int *)0); }
+
+#undef clear
+int	clear(void)
+		{ return(*(int *)0); }
+
+#undef clrtobot
+int	clrtobot(void)
+		{ return(*(int *)0); }
+
+#undef clrtoeol
+int	clrtoeol(void)
+		{ return(*(int *)0); }
+
+#undef color_set
+int	color_set(
+		short	a1,
+		void	*z)
+		{ return(*(int *)0); }
+
+#undef COLOR_PAIR
+int	COLOR_PAIR(
+		int	z)
+		{ return(*(int *)0); }
+
+#undef delch
+int	delch(void)
+		{ return(*(int *)0); }
+
+#undef deleteln
+int	deleteln(void)
+		{ return(*(int *)0); }
+
+#undef echochar
+int	echochar(
+		const chtype z)
+		{ return(*(int *)0); }
+
+#undef erase
+int	erase(void)
+		{ return(*(int *)0); }
+
+#undef getbkgd
+chtype	getbkgd(
+		WINDOW	*z)
+		{ return(*(chtype *)0); }
+
+#undef getch
+int	getch(void)
+		{ return(*(int *)0); }
+
+#undef getnstr
+int	getnstr(
+		char	*a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef getstr
+int	getstr(
+		char	*z)
+		{ return(*(int *)0); }
+
+#undef hline
+int	hline(
+		chtype	a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef inch
+chtype	inch(void)
+		{ return(*(chtype *)0); }
+
+#undef inchnstr
+int	inchnstr(
+		chtype	*a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef inchstr
+int	inchstr(
+		chtype	*z)
+		{ return(*(int *)0); }
+
+#undef innstr
+int	innstr(
+		char	*a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef insch
+int	insch(
+		chtype	z)
+		{ return(*(int *)0); }
+
+#undef insdelln
+int	insdelln(
+		int	z)
+		{ return(*(int *)0); }
+
+#undef insertln
+int	insertln(void)
+		{ return(*(int *)0); }
+
+#undef insnstr
+int	insnstr(
+		const char *a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef insstr
+int	insstr(
+		const char *z)
+		{ return(*(int *)0); }
+
+#undef instr
+int	instr(
+		char	*z)
+		{ return(*(int *)0); }
+
+#undef move
+int	move(
+		int	a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvaddch
+int	mvaddch(
+		int	a1,
+		int	a2,
+		const chtype z)
+		{ return(*(int *)0); }
+
+#undef mvaddchnstr
+int	mvaddchnstr(
+		int	a1,
+		int	a2,
+		const chtype *a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvaddchstr
+int	mvaddchstr(
+		int	a1,
+		int	a2,
+		const chtype *z)
+		{ return(*(int *)0); }
+
+#undef mvaddnstr
+int	mvaddnstr(
+		int	a1,
+		int	a2,
+		const char *a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvaddstr
+int	mvaddstr(
+		int	a1,
+		int	a2,
+		const char *z)
+		{ return(*(int *)0); }
+
+#undef mvchgat
+int	mvchgat(
+		int	a1,
+		int	a2,
+		int	a3,
+		attr_t	a4,
+		short	a5,
+		const void *z)
+		{ return(*(int *)0); }
+
+#undef mvdelch
+int	mvdelch(
+		int	a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvgetch
+int	mvgetch(
+		int	a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvgetnstr
+int	mvgetnstr(
+		int	a1,
+		int	a2,
+		char	*a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvgetstr
+int	mvgetstr(
+		int	a1,
+		int	a2,
+		char	*z)
+		{ return(*(int *)0); }
+
+#undef mvhline
+int	mvhline(
+		int	a1,
+		int	a2,
+		chtype	a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvinch
+chtype	mvinch(
+		int	a1,
+		int	z)
+		{ return(*(chtype *)0); }
+
+#undef mvinchnstr
+int	mvinchnstr(
+		int	a1,
+		int	a2,
+		chtype	*a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvinchstr
+int	mvinchstr(
+		int	a1,
+		int	a2,
+		chtype	*z)
+		{ return(*(int *)0); }
+
+#undef mvinnstr
+int	mvinnstr(
+		int	a1,
+		int	a2,
+		char	*a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvinsch
+int	mvinsch(
+		int	a1,
+		int	a2,
+		chtype	z)
+		{ return(*(int *)0); }
+
+#undef mvinsnstr
+int	mvinsnstr(
+		int	a1,
+		int	a2,
+		const char *a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvinsstr
+int	mvinsstr(
+		int	a1,
+		int	a2,
+		const char *z)
+		{ return(*(int *)0); }
+
+#undef mvinstr
+int	mvinstr(
+		int	a1,
+		int	a2,
+		char	*z)
+		{ return(*(int *)0); }
+
+#undef mvvline
+int	mvvline(
+		int	a1,
+		int	a2,
+		chtype	a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwaddch
+int	mvwaddch(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const chtype z)
+		{ return(*(int *)0); }
+
+#undef mvwaddchnstr
+int	mvwaddchnstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const chtype *a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwaddchstr
+int	mvwaddchstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const chtype *z)
+		{ return(*(int *)0); }
+
+#undef mvwaddnstr
+int	mvwaddnstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const char *a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwaddstr
+int	mvwaddstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const char *z)
+		{ return(*(int *)0); }
+
+#undef mvwchgat
+int	mvwchgat(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		int	a4,
+		attr_t	a5,
+		short	a6,
+		const void *z)
+		{ return(*(int *)0); }
+
+#undef mvwdelch
+int	mvwdelch(
+		WINDOW	*a1,
+		int	a2,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwgetch
+int	mvwgetch(
+		WINDOW	*a1,
+		int	a2,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwgetnstr
+int	mvwgetnstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		char	*a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwgetstr
+int	mvwgetstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		char	*z)
+		{ return(*(int *)0); }
+
+#undef mvwhline
+int	mvwhline(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		chtype	a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwinch
+chtype	mvwinch(
+		WINDOW	*a1,
+		int	a2,
+		int	z)
+		{ return(*(chtype *)0); }
+
+#undef mvwinchnstr
+int	mvwinchnstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		chtype	*a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwinchstr
+int	mvwinchstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		chtype	*z)
+		{ return(*(int *)0); }
+
+#undef mvwinnstr
+int	mvwinnstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		char	*a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwinsch
+int	mvwinsch(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		chtype	z)
+		{ return(*(int *)0); }
+
+#undef mvwinsnstr
+int	mvwinsnstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const char *a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwinsstr
+int	mvwinsstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const char *z)
+		{ return(*(int *)0); }
+
+#undef mvwinstr
+int	mvwinstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		char	*z)
+		{ return(*(int *)0); }
+
+#undef mvwvline
+int	mvwvline(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		chtype	a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef PAIR_NUMBER
+int	PAIR_NUMBER(
+		int	z)
+		{ return(*(int *)0); }
+
+#undef redrawwin
+int	redrawwin(
+		WINDOW	*z)
+		{ return(*(int *)0); }
+
+#undef refresh
+int	refresh(void)
+		{ return(*(int *)0); }
+
+#undef scrl
+int	scrl(
+		int	z)
+		{ return(*(int *)0); }
+
+#undef scroll
+int	scroll(
+		WINDOW	*z)
+		{ return(*(int *)0); }
+
+#undef setscrreg
+int	setscrreg(
+		int	a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef standout
+int	standout(void)
+		{ return(*(int *)0); }
+
+#undef standend
+int	standend(void)
+		{ return(*(int *)0); }
+
+#undef timeout
+void	timeout(
+		int	z)
+		{ /* void */ }
+
+#undef touchline
+int	touchline(
+		WINDOW	*a1,
+		int	a2,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef touchwin
+int	touchwin(
+		WINDOW	*z)
+		{ return(*(int *)0); }
+
+#undef untouchwin
+int	untouchwin(
+		WINDOW	*z)
+		{ return(*(int *)0); }
+
+#undef vline
+int	vline(
+		chtype	a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef waddchstr
+int	waddchstr(
+		WINDOW	*a1,
+		const chtype *z)
+		{ return(*(int *)0); }
+
+#undef waddstr
+int	waddstr(
+		WINDOW	*a1,
+		const char *z)
+		{ return(*(int *)0); }
+
+#undef wattron
+int	wattron(
+		WINDOW	*a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef wattroff
+int	wattroff(
+		WINDOW	*a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef wattrset
+int	wattrset(
+		WINDOW	*a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef wattr_get
+int	wattr_get(
+		WINDOW	*a1,
+		attr_t	*a2,
+		short	*a3,
+		void	*z)
+		{ return(*(int *)0); }
+
+#undef wattr_set
+int	wattr_set(
+		WINDOW	*a1,
+		attr_t	a2,
+		short	a3,
+		void	*z)
+		{ return(*(int *)0); }
+
+#undef wdeleteln
+int	wdeleteln(
+		WINDOW	*z)
+		{ return(*(int *)0); }
+
+#undef wgetstr
+int	wgetstr(
+		WINDOW	*a1,
+		char	*z)
+		{ return(*(int *)0); }
+
+#undef winchstr
+int	winchstr(
+		WINDOW	*a1,
+		chtype	*z)
+		{ return(*(int *)0); }
+
+#undef winsertln
+int	winsertln(
+		WINDOW	*z)
+		{ return(*(int *)0); }
+
+#undef winsstr
+int	winsstr(
+		WINDOW	*a1,
+		const char *z)
+		{ return(*(int *)0); }
+
+#undef winstr
+int	winstr(
+		WINDOW	*a1,
+		char	*z)
+		{ return(*(int *)0); }
+
+#undef wstandout
+int	wstandout(
+		WINDOW	*z)
+		{ return(*(int *)0); }
+
+#undef wstandend
+int	wstandend(
+		WINDOW	*z)
+		{ return(*(int *)0); }
+
+#undef getattrs
+int	getattrs(
+		const WINDOW *z)
+		{ return(*(int *)0); }
+
+#undef getcurx
+int	getcurx(
+		const WINDOW *z)
+		{ return(*(int *)0); }
+
+#undef getcury
+int	getcury(
+		const WINDOW *z)
+		{ return(*(int *)0); }
+
+#undef getbegx
+int	getbegx(
+		const WINDOW *z)
+		{ return(*(int *)0); }
+
+#undef getbegy
+int	getbegy(
+		const WINDOW *z)
+		{ return(*(int *)0); }
+
+#undef getmaxx
+int	getmaxx(
+		const WINDOW *z)
+		{ return(*(int *)0); }
+
+#undef getmaxy
+int	getmaxy(
+		const WINDOW *z)
+		{ return(*(int *)0); }
+
+#undef getparx
+int	getparx(
+		const WINDOW *z)
+		{ return(*(int *)0); }
+
+#undef getpary
+int	getpary(
+		const WINDOW *z)
+		{ return(*(int *)0); }
+
+#undef wgetparent
+WINDOW	*wgetparent(
+		const WINDOW *z)
+		{ return(*(WINDOW **)0); }
+
+#undef is_cleared
+NCURSES_BOOL is_cleared(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_idcok
+NCURSES_BOOL is_idcok(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_idlok
+NCURSES_BOOL is_idlok(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_immedok
+NCURSES_BOOL is_immedok(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_keypad
+NCURSES_BOOL is_keypad(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_leaveok
+NCURSES_BOOL is_leaveok(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_nodelay
+NCURSES_BOOL is_nodelay(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_notimeout
+NCURSES_BOOL is_notimeout(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_pad
+NCURSES_BOOL is_pad(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_scrollok
+NCURSES_BOOL is_scrollok(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_subwin
+NCURSES_BOOL is_subwin(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_syncok
+NCURSES_BOOL is_syncok(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef wgetdelay
+int	wgetdelay(
+		const WINDOW *z)
+		{ return(*(int *)0); }
+
+#undef wgetscrreg
+int	wgetscrreg(
+		const WINDOW *a1,
+		int	*a2,
+		int	*z)
+		{ return(*(int *)0); }
+
+#undef mouse_trafo
+NCURSES_BOOL mouse_trafo(
+		int	*a1,
+		int	*a2,
+		NCURSES_BOOL z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./base/lib_getch.c */
+
+#undef _nc_ESCDELAY
+int	_nc_ESCDELAY(void)
+		{ return(*(int *)0); }
+
+#undef _nc_ptr_Escdelay
+int	*_nc_ptr_Escdelay(
+		SCREEN	*sp)
+		{ return(*(int **)0); }
+
+#undef set_escdelay_sp
+int	set_escdelay_sp(
+		SCREEN	*sp,
+		int	value)
+		{ return(*(int *)0); }
+
+#undef set_escdelay
+int	set_escdelay(
+		int	value)
+		{ return(*(int *)0); }
+
+#undef get_escdelay_sp
+int	get_escdelay_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef get_escdelay
+int	get_escdelay(void)
+		{ return(*(int *)0); }
+
+#undef _nc_wgetch
+int	_nc_wgetch(
+		WINDOW	*win,
+		int	*result,
+		int	use_meta)
+		{ return(*(int *)0); }
+
+#undef wgetch
+int	wgetch(
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+/* ./base/lib_getstr.c */
+
+#undef wgetnstr
+int	wgetnstr(
+		WINDOW	*win,
+		char	*str,
+		int	maxlen)
+		{ return(*(int *)0); }
+
+/* ./base/lib_hline.c */
+
+#undef whline
+int	whline(
+		WINDOW	*win,
+		chtype	ch,
+		int	n)
+		{ return(*(int *)0); }
+
+/* ./base/lib_immedok.c */
+
+#undef immedok
+void	immedok(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ /* void */ }
+
+/* ./base/lib_inchstr.c */
+
+#undef winchnstr
+int	winchnstr(
+		WINDOW	*win,
+		chtype	*str,
+		int	n)
+		{ return(*(int *)0); }
+
+/* ./base/lib_initscr.c */
+
+#undef initscr
+WINDOW	*initscr(void)
+		{ return(*(WINDOW **)0); }
+
+/* ./base/lib_insch.c */
+
+#undef _nc_insert_ch
+int	_nc_insert_ch(
+		SCREEN	*sp,
+		WINDOW	*win,
+		chtype	ch)
+		{ return(*(int *)0); }
+
+#undef winsch
+int	winsch(
+		WINDOW	*win,
+		chtype	c)
+		{ return(*(int *)0); }
+
+/* ./base/lib_insdel.c */
+
+#undef winsdelln
+int	winsdelln(
+		WINDOW	*win,
+		int	n)
+		{ return(*(int *)0); }
+
+/* ./base/lib_insnstr.c */
+
+#undef winsnstr
+int	winsnstr(
+		WINDOW	*win,
+		const char *s,
+		int	n)
+		{ return(*(int *)0); }
+
+/* ./base/lib_instr.c */
+
+#undef winnstr
+int	winnstr(
+		WINDOW	*win,
+		char	*str,
+		int	n)
+		{ return(*(int *)0); }
+
+/* ./base/lib_isendwin.c */
+
+#undef isendwin_sp
+NCURSES_BOOL isendwin_sp(
+		SCREEN	*sp)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef isendwin
+NCURSES_BOOL isendwin(void)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./base/lib_leaveok.c */
+
+#undef leaveok
+int	leaveok(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+/* ./base/lib_mouse.c */
+
+#undef getmouse_sp
+int	getmouse_sp(
+		SCREEN	*sp,
+		MEVENT	*aevent)
+		{ return(*(int *)0); }
+
+#undef getmouse
+int	getmouse(
+		MEVENT	*aevent)
+		{ return(*(int *)0); }
+
+#undef ungetmouse_sp
+int	ungetmouse_sp(
+		SCREEN	*sp,
+		MEVENT	*aevent)
+		{ return(*(int *)0); }
+
+#undef ungetmouse
+int	ungetmouse(
+		MEVENT	*aevent)
+		{ return(*(int *)0); }
+
+#undef mousemask_sp
+mmask_t	mousemask_sp(
+		SCREEN	*sp,
+		mmask_t	newmask,
+		mmask_t	*oldmask)
+		{ return(*(mmask_t *)0); }
+
+#undef mousemask
+mmask_t	mousemask(
+		mmask_t	newmask,
+		mmask_t	*oldmask)
+		{ return(*(mmask_t *)0); }
+
+#undef wenclose
+NCURSES_BOOL wenclose(
+		const WINDOW *win,
+		int	y,
+		int	x)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef mouseinterval_sp
+int	mouseinterval_sp(
+		SCREEN	*sp,
+		int	maxclick)
+		{ return(*(int *)0); }
+
+#undef mouseinterval
+int	mouseinterval(
+		int	maxclick)
+		{ return(*(int *)0); }
+
+#undef _nc_has_mouse
+NCURSES_BOOL _nc_has_mouse(
+		SCREEN	*sp)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef has_mouse_sp
+NCURSES_BOOL has_mouse_sp(
+		SCREEN	*sp)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef has_mouse
+NCURSES_BOOL has_mouse(void)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef wmouse_trafo
+NCURSES_BOOL wmouse_trafo(
+		const WINDOW *win,
+		int	*pY,
+		int	*pX,
+		NCURSES_BOOL to_screen)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./base/lib_move.c */
+
+#undef wmove
+int	wmove(
+		WINDOW	*win,
+		int	y,
+		int	x)
+		{ return(*(int *)0); }
+
+/* ./tty/lib_mvcur.c */
+
+#undef _nc_msec_cost_sp
+int	_nc_msec_cost_sp(
+		SCREEN	*sp,
+		const char *const cap,
+		int	affcnt)
+		{ return(*(int *)0); }
+
+#undef _nc_msec_cost
+int	_nc_msec_cost(
+		const char *const cap,
+		int	affcnt)
+		{ return(*(int *)0); }
+
+#undef _nc_mvcur_resume_sp
+void	_nc_mvcur_resume_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_mvcur_resume
+void	_nc_mvcur_resume(void)
+		{ /* void */ }
+
+#undef _nc_mvcur_init_sp
+void	_nc_mvcur_init_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_mvcur_init
+void	_nc_mvcur_init(void)
+		{ /* void */ }
+
+#undef _nc_mvcur_wrap_sp
+void	_nc_mvcur_wrap_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_mvcur_wrap
+void	_nc_mvcur_wrap(void)
+		{ /* void */ }
+
+#undef _nc_mvcur_sp
+int	_nc_mvcur_sp(
+		SCREEN	*sp,
+		int	yold,
+		int	xold,
+		int	ynew,
+		int	xnew)
+		{ return(*(int *)0); }
+
+#undef _nc_mvcur
+int	_nc_mvcur(
+		int	yold,
+		int	xold,
+		int	ynew,
+		int	xnew)
+		{ return(*(int *)0); }
+
+#undef mvcur_sp
+int	mvcur_sp(
+		SCREEN	*sp,
+		int	yold,
+		int	xold,
+		int	ynew,
+		int	xnew)
+		{ return(*(int *)0); }
+
+#undef mvcur
+int	mvcur(
+		int	yold,
+		int	xold,
+		int	ynew,
+		int	xnew)
+		{ return(*(int *)0); }
+
+#undef _nc_optimize_enable
+int	_nc_optimize_enable;
+
+/* ./base/lib_mvwin.c */
+
+#undef mvwin
+int	mvwin(
+		WINDOW	*win,
+		int	by,
+		int	bx)
+		{ return(*(int *)0); }
+
+/* ./base/lib_newterm.c */
+
+#undef filter_sp
+void	filter_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef filter
+void	filter(void)
+		{ /* void */ }
+
+#undef nofilter_sp
+void	nofilter_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef nofilter
+void	nofilter(void)
+		{ /* void */ }
+
+#undef newterm_sp
+SCREEN	*newterm_sp(
+		SCREEN	*sp,
+		const char *name,
+		FILE	*ofp,
+		FILE	*ifp)
+		{ return(*(SCREEN **)0); }
+
+#undef newterm
+SCREEN	*newterm(
+		const char *name,
+		FILE	*ofp,
+		FILE	*ifp)
+		{ return(*(SCREEN **)0); }
+
+/* ./base/lib_newwin.c */
+
+#undef _nc_freewin
+int	_nc_freewin(
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+#undef newwin_sp
+WINDOW	*newwin_sp(
+		SCREEN	*sp,
+		int	num_lines,
+		int	num_columns,
+		int	begy,
+		int	begx)
+		{ return(*(WINDOW **)0); }
+
+#undef newwin
+WINDOW	*newwin(
+		int	num_lines,
+		int	num_columns,
+		int	begy,
+		int	begx)
+		{ return(*(WINDOW **)0); }
+
+#undef derwin
+WINDOW	*derwin(
+		WINDOW	*orig,
+		int	num_lines,
+		int	num_columns,
+		int	begy,
+		int	begx)
+		{ return(*(WINDOW **)0); }
+
+#undef subwin
+WINDOW	*subwin(
+		WINDOW	*w,
+		int	l,
+		int	c,
+		int	y,
+		int	x)
+		{ return(*(WINDOW **)0); }
+
+#undef _nc_makenew_sp
+WINDOW	*_nc_makenew_sp(
+		SCREEN	*sp,
+		int	num_lines,
+		int	num_columns,
+		int	begy,
+		int	begx,
+		int	flags)
+		{ return(*(WINDOW **)0); }
+
+#undef _nc_curscr_of
+WINDOW	*_nc_curscr_of(
+		SCREEN	*sp)
+		{ return(*(WINDOW **)0); }
+
+#undef _nc_newscr_of
+WINDOW	*_nc_newscr_of(
+		SCREEN	*sp)
+		{ return(*(WINDOW **)0); }
+
+#undef _nc_stdscr_of
+WINDOW	*_nc_stdscr_of(
+		SCREEN	*sp)
+		{ return(*(WINDOW **)0); }
+
+/* ./base/lib_nl.c */
+
+#undef nl_sp
+int	nl_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef nl
+int	nl(void)
+		{ return(*(int *)0); }
+
+#undef nonl_sp
+int	nonl_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef nonl
+int	nonl(void)
+		{ return(*(int *)0); }
+
+/* ./base/lib_overlay.c */
+
+#undef overlay
+int	overlay(
+		const WINDOW *win1,
+		WINDOW	*win2)
+		{ return(*(int *)0); }
+
+#undef overwrite
+int	overwrite(
+		const WINDOW *win1,
+		WINDOW	*win2)
+		{ return(*(int *)0); }
+
+#undef copywin
+int	copywin(
+		const WINDOW *src,
+		WINDOW	*dst,
+		int	sminrow,
+		int	smincol,
+		int	dminrow,
+		int	dmincol,
+		int	dmaxrow,
+		int	dmaxcol,
+		int	over)
+		{ return(*(int *)0); }
+
+/* ./base/lib_pad.c */
+
+#undef newpad_sp
+WINDOW	*newpad_sp(
+		SCREEN	*sp,
+		int	l,
+		int	c)
+		{ return(*(WINDOW **)0); }
+
+#undef newpad
+WINDOW	*newpad(
+		int	l,
+		int	c)
+		{ return(*(WINDOW **)0); }
+
+#undef subpad
+WINDOW	*subpad(
+		WINDOW	*orig,
+		int	l,
+		int	c,
+		int	begy,
+		int	begx)
+		{ return(*(WINDOW **)0); }
+
+#undef prefresh
+int	prefresh(
+		WINDOW	*win,
+		int	pminrow,
+		int	pmincol,
+		int	sminrow,
+		int	smincol,
+		int	smaxrow,
+		int	smaxcol)
+		{ return(*(int *)0); }
+
+#undef pnoutrefresh
+int	pnoutrefresh(
+		WINDOW	*win,
+		int	pminrow,
+		int	pmincol,
+		int	sminrow,
+		int	smincol,
+		int	smaxrow,
+		int	smaxcol)
+		{ return(*(int *)0); }
+
+#undef pechochar
+int	pechochar(
+		WINDOW	*pad,
+		const chtype ch)
+		{ return(*(int *)0); }
+
+/* ./base/lib_printw.c */
+
+#undef printw
+int	printw(
+		const char *fmt,
+		...)
+		{ return(*(int *)0); }
+
+#undef wprintw
+int	wprintw(
+		WINDOW	*win,
+		const char *fmt,
+		...)
+		{ return(*(int *)0); }
+
+#undef mvprintw
+int	mvprintw(
+		int	y,
+		int	x,
+		const char *fmt,
+		...)
+		{ return(*(int *)0); }
+
+#undef mvwprintw
+int	mvwprintw(
+		WINDOW	*win,
+		int	y,
+		int	x,
+		const char *fmt,
+		...)
+		{ return(*(int *)0); }
+
+#undef vwprintw
+int	vwprintw(
+		WINDOW	*win,
+		const char *fmt,
+		va_list	argp)
+		{ return(*(int *)0); }
+
+#undef vw_printw
+int	vw_printw(
+		WINDOW	*win,
+		const char *fmt,
+		va_list	argp)
+		{ return(*(int *)0); }
+
+/* ./base/lib_redrawln.c */
+
+#undef wredrawln
+int	wredrawln(
+		WINDOW	*win,
+		int	beg,
+		int	num)
+		{ return(*(int *)0); }
+
+/* ./base/lib_refresh.c */
+
+#undef wrefresh
+int	wrefresh(
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+#undef wnoutrefresh
+int	wnoutrefresh(
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+/* ./base/lib_restart.c */
+
+#undef restartterm_sp
+int	restartterm_sp(
+		SCREEN	*sp,
+		const char *termp,
+		int	filenum,
+		int	*errret)
+		{ return(*(int *)0); }
+
+#undef restartterm
+int	restartterm(
+		const char *termp,
+		int	filenum,
+		int	*errret)
+		{ return(*(int *)0); }
+
+/* ./base/lib_scanw.c */
+
+#undef vwscanw
+int	vwscanw(
+		WINDOW	*win,
+		const char *fmt,
+		va_list	argp)
+		{ return(*(int *)0); }
+
+#undef vw_scanw
+int	vw_scanw(
+		WINDOW	*win,
+		const char *fmt,
+		va_list	argp)
+		{ return(*(int *)0); }
+
+#undef scanw
+int	scanw(
+		const char *fmt,
+		...)
+		{ return(*(int *)0); }
+
+#undef wscanw
+int	wscanw(
+		WINDOW	*win,
+		const char *fmt,
+		...)
+		{ return(*(int *)0); }
+
+#undef mvscanw
+int	mvscanw(
+		int	y,
+		int	x,
+		const char *fmt,
+		...)
+		{ return(*(int *)0); }
+
+#undef mvwscanw
+int	mvwscanw(
+		WINDOW	*win,
+		int	y,
+		int	x,
+		const char *fmt,
+		...)
+		{ return(*(int *)0); }
+
+/* ./base/lib_screen.c */
+
+#undef getwin_sp
+WINDOW	*getwin_sp(
+		SCREEN	*sp,
+		FILE	*filep)
+		{ return(*(WINDOW **)0); }
+
+#undef getwin
+WINDOW	*getwin(
+		FILE	*filep)
+		{ return(*(WINDOW **)0); }
+
+#undef putwin
+int	putwin(
+		WINDOW	*win,
+		FILE	*filep)
+		{ return(*(int *)0); }
+
+#undef scr_restore_sp
+int	scr_restore_sp(
+		SCREEN	*sp,
+		const char *file)
+		{ return(*(int *)0); }
+
+#undef scr_restore
+int	scr_restore(
+		const char *file)
+		{ return(*(int *)0); }
+
+#undef scr_dump
+int	scr_dump(
+		const char *file)
+		{ return(*(int *)0); }
+
+#undef scr_init_sp
+int	scr_init_sp(
+		SCREEN	*sp,
+		const char *file)
+		{ return(*(int *)0); }
+
+#undef scr_init
+int	scr_init(
+		const char *file)
+		{ return(*(int *)0); }
+
+#undef scr_set_sp
+int	scr_set_sp(
+		SCREEN	*sp,
+		const char *file)
+		{ return(*(int *)0); }
+
+#undef scr_set
+int	scr_set(
+		const char *file)
+		{ return(*(int *)0); }
+
+/* ./base/lib_scroll.c */
+
+#undef _nc_scroll_window
+void	_nc_scroll_window(
+		WINDOW	*win,
+		int const n,
+		int const top,
+		int const bottom,
+		chtype	blank)
+		{ /* void */ }
+
+#undef wscrl
+int	wscrl(
+		WINDOW	*win,
+		int	n)
+		{ return(*(int *)0); }
+
+/* ./base/lib_scrollok.c */
+
+#undef scrollok
+int	scrollok(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+/* ./base/lib_scrreg.c */
+
+#undef wsetscrreg
+int	wsetscrreg(
+		WINDOW	*win,
+		int	top,
+		int	bottom)
+		{ return(*(int *)0); }
+
+/* ./base/lib_set_term.c */
+
+#undef set_term
+SCREEN	*set_term(
+		SCREEN	*screenp)
+		{ return(*(SCREEN **)0); }
+
+#undef delscreen
+void	delscreen(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_setupscreen_sp
+int	_nc_setupscreen_sp(
+		SCREEN	**spp,
+		int	slines,
+		int	scolumns,
+		FILE	*output,
+		int	filtered,
+		int	slk_format)
+		{ return(*(int *)0); }
+
+#undef _nc_setupscreen
+int	_nc_setupscreen(
+		int	slines,
+		int	scolumns,
+		FILE	*output,
+		int	filtered,
+		int	slk_format)
+		{ return(*(int *)0); }
+
+#undef _nc_ripoffline_sp
+int	_nc_ripoffline_sp(
+		SCREEN	*sp,
+		int	line,
+		int	(*init)(
+		WINDOW	*p1,
+		int	p2))
+		{ return(*(int *)0); }
+
+#undef _nc_ripoffline
+int	_nc_ripoffline(
+		int	line,
+		int	(*init)(
+		WINDOW	*p1,
+		int	p2))
+		{ return(*(int *)0); }
+
+#undef ripoffline_sp
+int	ripoffline_sp(
+		SCREEN	*sp,
+		int	line,
+		int	(*init)(
+		WINDOW	*p1,
+		int	p2))
+		{ return(*(int *)0); }
+
+#undef ripoffline
+int	ripoffline(
+		int	line,
+		int	(*init)(
+		WINDOW	*p1,
+		int	p2))
+		{ return(*(int *)0); }
+
+/* ./base/lib_slk.c */
+
+#undef _nc_format_slks
+int	_nc_format_slks(
+		SCREEN	*sp,
+		int	cols)
+		{ return(*(int *)0); }
+
+#undef _nc_slk_initialize
+int	_nc_slk_initialize(
+		WINDOW	*stwin,
+		int	cols)
+		{ return(*(int *)0); }
+
+#undef slk_restore_sp
+int	slk_restore_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef slk_restore
+int	slk_restore(void)
+		{ return(*(int *)0); }
+
+/* ./base/lib_slkatr_set.c */
+
+#undef slk_attr_set_sp
+int	slk_attr_set_sp(
+		SCREEN	*sp,
+		const attr_t attr,
+		short	pair_arg,
+		void	*opts)
+		{ return(*(int *)0); }
+
+#undef slk_attr_set
+int	slk_attr_set(
+		const attr_t attr,
+		short	pair_arg,
+		void	*opts)
+		{ return(*(int *)0); }
+
+/* ./base/lib_slkatrof.c */
+
+#undef slk_attroff_sp
+int	slk_attroff_sp(
+		SCREEN	*sp,
+		const chtype attr)
+		{ return(*(int *)0); }
+
+#undef slk_attroff
+int	slk_attroff(
+		const chtype attr)
+		{ return(*(int *)0); }
+
+/* ./base/lib_slkatron.c */
+
+#undef slk_attron_sp
+int	slk_attron_sp(
+		SCREEN	*sp,
+		const chtype attr)
+		{ return(*(int *)0); }
+
+#undef slk_attron
+int	slk_attron(
+		const chtype attr)
+		{ return(*(int *)0); }
+
+/* ./base/lib_slkatrset.c */
+
+#undef slk_attrset_sp
+int	slk_attrset_sp(
+		SCREEN	*sp,
+		const chtype attr)
+		{ return(*(int *)0); }
+
+#undef slk_attrset
+int	slk_attrset(
+		const chtype attr)
+		{ return(*(int *)0); }
+
+/* ./base/lib_slkattr.c */
+
+#undef slk_attr_sp
+attr_t	slk_attr_sp(
+		SCREEN	*sp)
+		{ return(*(attr_t *)0); }
+
+#undef slk_attr
+attr_t	slk_attr(void)
+		{ return(*(attr_t *)0); }
+
+/* ./base/lib_slkclear.c */
+
+#undef slk_clear_sp
+int	slk_clear_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef slk_clear
+int	slk_clear(void)
+		{ return(*(int *)0); }
+
+/* ./base/lib_slkcolor.c */
+
+#undef slk_color_sp
+int	slk_color_sp(
+		SCREEN	*sp,
+		short	pair_arg)
+		{ return(*(int *)0); }
+
+#undef slk_color
+int	slk_color(
+		short	pair_arg)
+		{ return(*(int *)0); }
+
+/* ./base/lib_slkinit.c */
+
+#undef slk_init_sp
+int	slk_init_sp(
+		SCREEN	*sp,
+		int	format)
+		{ return(*(int *)0); }
+
+#undef slk_init
+int	slk_init(
+		int	format)
+		{ return(*(int *)0); }
+
+/* ./base/lib_slklab.c */
+
+#undef slk_label_sp
+char	*slk_label_sp(
+		SCREEN	*sp,
+		int	n)
+		{ return(*(char **)0); }
+
+#undef slk_label
+char	*slk_label(
+		int	n)
+		{ return(*(char **)0); }
+
+/* ./base/lib_slkrefr.c */
+
+#undef slk_noutrefresh_sp
+int	slk_noutrefresh_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef slk_noutrefresh
+int	slk_noutrefresh(void)
+		{ return(*(int *)0); }
+
+#undef slk_refresh_sp
+int	slk_refresh_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef slk_refresh
+int	slk_refresh(void)
+		{ return(*(int *)0); }
+
+/* ./base/lib_slkset.c */
+
+#undef slk_set_sp
+int	slk_set_sp(
+		SCREEN	*sp,
+		int	i,
+		const char *astr,
+		int	format)
+		{ return(*(int *)0); }
+
+#undef slk_set
+int	slk_set(
+		int	i,
+		const char *astr,
+		int	format)
+		{ return(*(int *)0); }
+
+/* ./base/lib_slktouch.c */
+
+#undef slk_touch_sp
+int	slk_touch_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef slk_touch
+int	slk_touch(void)
+		{ return(*(int *)0); }
+
+/* ./base/lib_touch.c */
+
+#undef is_linetouched
+NCURSES_BOOL is_linetouched(
+		WINDOW	*win,
+		int	line)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_wintouched
+NCURSES_BOOL is_wintouched(
+		WINDOW	*win)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef wtouchln
+int	wtouchln(
+		WINDOW	*win,
+		int	y,
+		int	n,
+		int	changed)
+		{ return(*(int *)0); }
+
+/* ./trace/lib_tracedmp.c */
+
+#undef _tracedump
+void	_tracedump(
+		const char *name,
+		WINDOW	*win)
+		{ /* void */ }
+
+/* ./trace/lib_tracemse.c */
+
+#undef _nc_trace_mmask_t
+char	*_nc_trace_mmask_t(
+		SCREEN	*sp,
+		mmask_t	code)
+		{ return(*(char **)0); }
+
+#undef _nc_tracemouse
+char	*_nc_tracemouse(
+		SCREEN	*sp,
+		MEVENT const *ep)
+		{ return(*(char **)0); }
+
+#undef _nc_retrace_mmask_t
+mmask_t	_nc_retrace_mmask_t(
+		SCREEN	*sp,
+		mmask_t	code)
+		{ return(*(mmask_t *)0); }
+
+#undef _tracemouse
+char	*_tracemouse(
+		MEVENT const *ep)
+		{ return(*(char **)0); }
+
+/* ./tty/lib_tstp.c */
+
+#undef _nc_signal_handler
+void	_nc_signal_handler(
+		int	enable)
+		{ /* void */ }
+
+/* ./base/lib_ungetch.c */
+
+#undef _nc_fifo_dump
+void	_nc_fifo_dump(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef ungetch_sp
+int	ungetch_sp(
+		SCREEN	*sp,
+		int	ch)
+		{ return(*(int *)0); }
+
+#undef ungetch
+int	ungetch(
+		int	ch)
+		{ return(*(int *)0); }
+
+/* ./tty/lib_vidattr.c */
+
+#undef vidputs_sp
+int	vidputs_sp(
+		SCREEN	*sp,
+		chtype	newmode,
+		NCURSES_OUTC_sp outc)
+		{ return(*(int *)0); }
+
+#undef vidputs
+int	vidputs(
+		chtype	newmode,
+		NCURSES_OUTC outc)
+		{ return(*(int *)0); }
+
+#undef vidattr_sp
+int	vidattr_sp(
+		SCREEN	*sp,
+		chtype	newmode)
+		{ return(*(int *)0); }
+
+#undef vidattr
+int	vidattr(
+		chtype	newmode)
+		{ return(*(int *)0); }
+
+#undef termattrs_sp
+chtype	termattrs_sp(
+		SCREEN	*sp)
+		{ return(*(chtype *)0); }
+
+#undef termattrs
+chtype	termattrs(void)
+		{ return(*(chtype *)0); }
+
+/* ./base/lib_vline.c */
+
+#undef wvline
+int	wvline(
+		WINDOW	*win,
+		chtype	ch,
+		int	n)
+		{ return(*(int *)0); }
+
+/* ./base/lib_wattroff.c */
+
+#undef wattr_off
+int	wattr_off(
+		WINDOW	*win,
+		attr_t	at,
+		void	*opts)
+		{ return(*(int *)0); }
+
+/* ./base/lib_wattron.c */
+
+#undef wattr_on
+int	wattr_on(
+		WINDOW	*win,
+		attr_t	at,
+		void	*opts)
+		{ return(*(int *)0); }
+
+/* ./base/lib_winch.c */
+
+#undef winch
+chtype	winch(
+		WINDOW	*win)
+		{ return(*(chtype *)0); }
+
+/* ./base/lib_window.c */
+
+#undef _nc_synchook
+void	_nc_synchook(
+		WINDOW	*win)
+		{ /* void */ }
+
+#undef mvderwin
+int	mvderwin(
+		WINDOW	*win,
+		int	y,
+		int	x)
+		{ return(*(int *)0); }
+
+#undef syncok
+int	syncok(
+		WINDOW	*win,
+		NCURSES_BOOL bf)
+		{ return(*(int *)0); }
+
+#undef wsyncup
+void	wsyncup(
+		WINDOW	*win)
+		{ /* void */ }
+
+#undef wsyncdown
+void	wsyncdown(
+		WINDOW	*win)
+		{ /* void */ }
+
+#undef wcursyncup
+void	wcursyncup(
+		WINDOW	*win)
+		{ /* void */ }
+
+#undef dupwin
+WINDOW	*dupwin(
+		WINDOW	*win)
+		{ return(*(WINDOW **)0); }
+
+/* ./base/nc_panel.c */
+
+#undef _nc_panelhook_sp
+struct panelhook *_nc_panelhook_sp(
+		SCREEN	*sp)
+		{ return(*(struct panelhook **)0); }
+
+#undef _nc_panelhook
+struct panelhook *_nc_panelhook(void)
+		{ return(*(struct panelhook **)0); }
+
+/* ./base/safe_sprintf.c */
+
+#undef _nc_printf_string_sp
+char	*_nc_printf_string_sp(
+		SCREEN	*sp,
+		const char *fmt,
+		va_list	ap)
+		{ return(*(char **)0); }
+
+#undef _nc_printf_string
+char	*_nc_printf_string(
+		const char *fmt,
+		va_list	ap)
+		{ return(*(char **)0); }
+
+/* ./tty/tty_update.c */
+
+#undef doupdate_sp
+int	doupdate_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef doupdate
+int	doupdate(void)
+		{ return(*(int *)0); }
+
+#undef _nc_scrolln_sp
+int	_nc_scrolln_sp(
+		SCREEN	*sp,
+		int	n,
+		int	top,
+		int	bot,
+		int	maxy)
+		{ return(*(int *)0); }
+
+#undef _nc_scrolln
+int	_nc_scrolln(
+		int	n,
+		int	top,
+		int	bot,
+		int	maxy)
+		{ return(*(int *)0); }
+
+#undef _nc_screen_resume_sp
+void	_nc_screen_resume_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_screen_resume
+void	_nc_screen_resume(void)
+		{ /* void */ }
+
+#undef _nc_screen_init_sp
+void	_nc_screen_init_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_screen_init
+void	_nc_screen_init(void)
+		{ /* void */ }
+
+#undef _nc_screen_wrap_sp
+void	_nc_screen_wrap_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_screen_wrap
+void	_nc_screen_wrap(void)
+		{ /* void */ }
+
+#undef _nc_do_xmc_glitch_sp
+void	_nc_do_xmc_glitch_sp(
+		SCREEN	*sp,
+		attr_t	previous)
+		{ /* void */ }
+
+#undef _nc_do_xmc_glitch
+void	_nc_do_xmc_glitch(
+		attr_t	previous)
+		{ /* void */ }
+
+/* ./trace/varargs.c */
+
+#undef _nc_varargs
+char	*_nc_varargs(
+		const char *fmt,
+		va_list	ap)
+		{ return(*(char **)0); }
+
+/* ./base/vsscanf.c */
+
+#undef _nc_vsscanf
+void	_nc_vsscanf(void)
+		{ /* void */ }
+
+/* ./base/lib_freeall.c */
+
+#undef _nc_freeall
+void	_nc_freeall(void)
+		{ /* void */ }
+
+#undef _nc_free_and_exit_sp
+void	_nc_free_and_exit_sp(
+		SCREEN	*sp,
+		int	code)
+		{ /* void */ }
+
+#undef _nc_free_and_exit
+void	_nc_free_and_exit(
+		int	code)
+		{ /* void */ }
+
+#undef exit_curses
+void	exit_curses(
+		int	code)
+		{ /* void */ }
+
+/* ./expanded.c */
+
+#undef _nc_toggle_attr_on
+void	_nc_toggle_attr_on(
+		attr_t	*S,
+		attr_t	at)
+		{ /* void */ }
+
+#undef _nc_toggle_attr_off
+void	_nc_toggle_attr_off(
+		attr_t	*S,
+		attr_t	at)
+		{ /* void */ }
+
+#undef _nc_DelCharCost_sp
+int	_nc_DelCharCost_sp(
+		SCREEN	*sp,
+		int	count)
+		{ return(*(int *)0); }
+
+#undef _nc_InsCharCost_sp
+int	_nc_InsCharCost_sp(
+		SCREEN	*sp,
+		int	count)
+		{ return(*(int *)0); }
+
+#undef _nc_UpdateAttrs_sp
+void	_nc_UpdateAttrs_sp(
+		SCREEN	*sp,
+		chtype	c)
+		{ /* void */ }
+
+#undef _nc_DelCharCost
+int	_nc_DelCharCost(
+		int	count)
+		{ return(*(int *)0); }
+
+#undef _nc_InsCharCost
+int	_nc_InsCharCost(
+		int	count)
+		{ return(*(int *)0); }
+
+#undef _nc_UpdateAttrs
+void	_nc_UpdateAttrs(
+		chtype	c)
+		{ /* void */ }
+
+/* ./base/legacy_coding.c */
+
+#undef use_legacy_coding_sp
+int	use_legacy_coding_sp(
+		SCREEN	*sp,
+		int	level)
+		{ return(*(int *)0); }
+
+#undef use_legacy_coding
+int	use_legacy_coding(
+		int	level)
+		{ return(*(int *)0); }
+
+/* ./base/lib_dft_fgbg.c */
+
+#undef use_default_colors_sp
+int	use_default_colors_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef use_default_colors
+int	use_default_colors(void)
+		{ return(*(int *)0); }
+
+#undef assume_default_colors_sp
+int	assume_default_colors_sp(
+		SCREEN	*sp,
+		int	fg,
+		int	bg)
+		{ return(*(int *)0); }
+
+#undef assume_default_colors
+int	assume_default_colors(
+		int	fg,
+		int	bg)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_print.c */
+
+#undef mcprint_sp
+int	mcprint_sp(
+		SCREEN	*sp,
+		char	*data,
+		int	len)
+		{ return(*(int *)0); }
+
+#undef mcprint
+int	mcprint(
+		char	*data,
+		int	len)
+		{ return(*(int *)0); }
+
+/* ./base/new_pair.c */
+
+#undef _nc_new_pair
+void	_nc_new_pair(void)
+		{ /* void */ }
+
+/* ./base/resizeterm.c */
+
+#undef is_term_resized_sp
+NCURSES_BOOL is_term_resized_sp(
+		SCREEN	*sp,
+		int	ToLines,
+		int	ToCols)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_term_resized
+NCURSES_BOOL is_term_resized(
+		int	ToLines,
+		int	ToCols)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef resize_term_sp
+int	resize_term_sp(
+		SCREEN	*sp,
+		int	ToLines,
+		int	ToCols)
+		{ return(*(int *)0); }
+
+#undef resize_term
+int	resize_term(
+		int	ToLines,
+		int	ToCols)
+		{ return(*(int *)0); }
+
+#undef resizeterm_sp
+int	resizeterm_sp(
+		SCREEN	*sp,
+		int	ToLines,
+		int	ToCols)
+		{ return(*(int *)0); }
+
+#undef resizeterm
+int	resizeterm(
+		int	ToLines,
+		int	ToCols)
+		{ return(*(int *)0); }
+
+/* ./trace/trace_xnames.c */
+
+#undef _nc_trace_xnames
+void	_nc_trace_xnames(
+		TERMTYPE *tp)
+		{ /* void */ }
+
+/* ./tinfo/use_screen.c */
+
+#undef use_screen
+int	use_screen(
+		SCREEN	*screen,
+		NCURSES_SCREEN_CB func,
+		void	*data)
+		{ return(*(int *)0); }
+
+/* ./base/use_window.c */
+
+#undef use_window
+int	use_window(
+		WINDOW	*win,
+		NCURSES_WINDOW_CB func,
+		void	*data)
+		{ return(*(int *)0); }
+
+/* ./base/wresize.c */
+
+#undef wresize
+int	wresize(
+		WINDOW	*win,
+		int	ToLines,
+		int	ToCols)
+		{ return(*(int *)0); }
+
+/* ./tinfo/access.c */
+
+#undef _nc_rootname
+char	*_nc_rootname(
+		char	*path)
+		{ return(*(char **)0); }
+
+#undef _nc_is_abs_path
+NCURSES_BOOL _nc_is_abs_path(
+		const char *path)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_pathlast
+unsigned _nc_pathlast(
+		const char *path)
+		{ return(*(unsigned *)0); }
+
+#undef _nc_basename
+char	*_nc_basename(
+		char	*path)
+		{ return(*(char **)0); }
+
+#undef _nc_access
+int	_nc_access(
+		const char *path,
+		int	mode)
+		{ return(*(int *)0); }
+
+#undef _nc_is_dir_path
+NCURSES_BOOL _nc_is_dir_path(
+		const char *path)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_is_file_path
+NCURSES_BOOL _nc_is_file_path(
+		const char *path)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_env_access
+int	_nc_env_access(void)
+		{ return(*(int *)0); }
+
+#undef _nc_safe_fopen
+FILE	*_nc_safe_fopen(
+		const char *path,
+		const char *mode)
+		{ return(*(FILE **)0); }
+
+#undef _nc_safe_open3
+int	_nc_safe_open3(
+		const char *path,
+		int	flags,
+		mode_t	mode)
+		{ return(*(int *)0); }
+
+/* ./tinfo/add_tries.c */
+
+#undef _nc_add_to_try
+int	_nc_add_to_try(
+		TRIES	**tree,
+		const char *str,
+		unsigned code)
+		{ return(*(int *)0); }
+
+/* ./tinfo/alloc_ttype.c */
+
+#undef _nc_align_termtype
+void	_nc_align_termtype(
+		TERMTYPE *to,
+		TERMTYPE *from)
+		{ /* void */ }
+
+#undef _nc_copy_termtype
+void	_nc_copy_termtype(
+		TERMTYPE *dst,
+		const TERMTYPE *src)
+		{ /* void */ }
+
+/* ./codes.c */
+
+#undef _nc_boolcodes
+const char *const *_nc_boolcodes(void)
+		{ return(*(const char **)0); }
+
+#undef _nc_numcodes
+const char *const *_nc_numcodes(void)
+		{ return(*(const char **)0); }
+
+#undef _nc_strcodes
+const char *const *_nc_strcodes(void)
+		{ return(*(const char **)0); }
+
+/* ./comp_captab.c */
+
+#undef _nc_get_table
+const struct name_table_entry *_nc_get_table(
+		NCURSES_BOOL termcap)
+		{ return(*(const struct name_table_entry **)0); }
+
+#undef _nc_get_hash_table
+const HashValue *_nc_get_hash_table(
+		NCURSES_BOOL termcap)
+		{ return(*(const HashValue **)0); }
+
+#undef _nc_get_alias_table
+const struct alias *_nc_get_alias_table(
+		NCURSES_BOOL termcap)
+		{ return(*(const struct alias **)0); }
+
+#undef _nc_get_hash_info
+const HashData *_nc_get_hash_info(
+		NCURSES_BOOL termcap)
+		{ return(*(const HashData **)0); }
+
+/* ./tinfo/comp_error.c */
+
+#undef _nc_suppress_warnings
+NCURSES_BOOL _nc_suppress_warnings;
+#undef _nc_curr_line
+int	_nc_curr_line;
+#undef _nc_curr_col
+int	_nc_curr_col;
+
+#undef _nc_get_source
+const char *_nc_get_source(void)
+		{ return(*(const char **)0); }
+
+#undef _nc_set_source
+void	_nc_set_source(
+		const char *const name)
+		{ /* void */ }
+
+#undef _nc_set_type
+void	_nc_set_type(
+		const char *const name)
+		{ /* void */ }
+
+#undef _nc_get_type
+void	_nc_get_type(
+		char	*name)
+		{ /* void */ }
+
+#undef _nc_warning
+void	_nc_warning(
+		const char *const fmt,
+		...)
+		{ /* void */ }
+
+#undef _nc_err_abort
+void	_nc_err_abort(
+		const char *const fmt,
+		...)
+		{ /* void */ }
+
+#undef _nc_syserr_abort
+void	_nc_syserr_abort(
+		const char *const fmt,
+		...)
+		{ /* void */ }
+
+/* ./tinfo/comp_hash.c */
+
+#undef _nc_find_entry
+struct name_table_entry const *_nc_find_entry(
+		const char *string,
+		const HashValue *hash_table)
+		{ return(*(struct name_table_entry const **)0); }
+
+#undef _nc_find_type_entry
+struct name_table_entry const *_nc_find_type_entry(
+		const char *string,
+		int	type,
+		NCURSES_BOOL termcap)
+		{ return(*(struct name_table_entry const **)0); }
+
+#undef _nc_find_user_entry
+struct user_table_entry const *_nc_find_user_entry(
+		const char *string)
+		{ return(*(struct user_table_entry const **)0); }
+
+/* ./comp_userdefs.c */
+
+#undef _nc_get_userdefs_table
+const struct user_table_entry *_nc_get_userdefs_table(void)
+		{ return(*(const struct user_table_entry **)0); }
+
+#undef _nc_get_hash_user
+const HashData *_nc_get_hash_user(void)
+		{ return(*(const HashData **)0); }
+
+/* ./tinfo/db_iterator.c */
+
+#undef _nc_tic_dir
+const char *_nc_tic_dir(
+		const char *path)
+		{ return(*(const char **)0); }
+
+#undef _nc_keep_tic_dir
+void	_nc_keep_tic_dir(
+		const char *path)
+		{ /* void */ }
+
+#undef _nc_last_db
+void	_nc_last_db(void)
+		{ /* void */ }
+
+#undef _nc_next_db
+const char *_nc_next_db(
+		DBDIRS	*state,
+		int	*offset)
+		{ return(*(const char **)0); }
+
+#undef _nc_first_db
+void	_nc_first_db(
+		DBDIRS	*state,
+		int	*offset)
+		{ /* void */ }
+
+/* ./tinfo/doalloc.c */
+
+#undef _nc_doalloc
+void	*_nc_doalloc(
+		void	*oldp,
+		size_t	amount)
+		{ return(*(void **)0); }
+
+/* ./tinfo/entries.c */
+
+#undef _nc_head
+ENTRY	*_nc_head;
+#undef _nc_tail
+ENTRY	*_nc_tail;
+
+#undef _nc_free_entry
+void	_nc_free_entry(
+		ENTRY	*headp,
+		TERMTYPE *tterm)
+		{ /* void */ }
+
+#undef _nc_free_entries
+void	_nc_free_entries(
+		ENTRY	*headp)
+		{ /* void */ }
+
+#undef _nc_leaks_tinfo
+void	_nc_leaks_tinfo(void)
+		{ /* void */ }
+
+#undef exit_terminfo
+void	exit_terminfo(
+		int	code)
+		{ /* void */ }
+
+/* ./fallback.c */
+
+#undef _nc_fallback
+const TERMTYPE *_nc_fallback(
+		const char *name)
+		{ return(*(const TERMTYPE **)0); }
+
+/* ./tinfo/free_ttype.c */
+
+#undef _nc_free_termtype
+void	_nc_free_termtype(
+		TERMTYPE *ptr)
+		{ /* void */ }
+
+#undef _nc_free_termtype1
+void	_nc_free_termtype1(
+		TERMTYPE *ptr)
+		{ /* void */ }
+
+#undef _nc_user_definable
+NCURSES_BOOL _nc_user_definable;
+
+#undef use_extended_names
+int	use_extended_names(
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+/* ./tinfo/getenv_num.c */
+
+#undef _nc_getenv_num
+int	_nc_getenv_num(
+		const char *name)
+		{ return(*(int *)0); }
+
+#undef _nc_setenv_num
+void	_nc_setenv_num(
+		const char *name,
+		int	value)
+		{ /* void */ }
+
+/* ./tinfo/home_terminfo.c */
+
+#undef _nc_home_terminfo
+char	*_nc_home_terminfo(void)
+		{ return(*(char **)0); }
+
+/* ./tinfo/init_keytry.c */
+
+#undef _nc_init_keytry
+void	_nc_init_keytry(
+		SCREEN	*sp)
+		{ /* void */ }
+
+/* ./tinfo/lib_acs.c */
+
+#undef _nc_acs_map
+chtype	*_nc_acs_map(void)
+		{ return(*(chtype **)0); }
+
+#undef _nc_init_acs_sp
+void	_nc_init_acs_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_init_acs
+void	_nc_init_acs(void)
+		{ /* void */ }
+
+/* ./tinfo/lib_baudrate.c */
+
+struct speed {
+    int given_speed;
+    int actual_speed;
+};
+
+#undef _nc_baudrate
+int	_nc_baudrate(
+		int	OSpeed)
+		{ return(*(int *)0); }
+
+#undef _nc_ospeed
+int	_nc_ospeed(
+		int	BaudRate)
+		{ return(*(int *)0); }
+
+#undef baudrate_sp
+int	baudrate_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef baudrate
+int	baudrate(void)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_cur_term.c */
+
+#undef _nc_get_cur_term_sp
+TERMINAL *_nc_get_cur_term_sp(
+		SCREEN	*sp)
+		{ return(*(TERMINAL **)0); }
+
+#undef _nc_get_cur_term
+TERMINAL *_nc_get_cur_term(void)
+		{ return(*(TERMINAL **)0); }
+
+#undef _nc_cur_term
+TERMINAL *_nc_cur_term(void)
+		{ return(*(TERMINAL **)0); }
+
+#undef set_curterm_sp
+TERMINAL *set_curterm_sp(
+		SCREEN	*sp,
+		TERMINAL *termp)
+		{ return(*(TERMINAL **)0); }
+
+#undef set_curterm
+TERMINAL *set_curterm(
+		TERMINAL *termp)
+		{ return(*(TERMINAL **)0); }
+
+#undef del_curterm_sp
+int	del_curterm_sp(
+		SCREEN	*sp,
+		TERMINAL *termp)
+		{ return(*(int *)0); }
+
+#undef del_curterm
+int	del_curterm(
+		TERMINAL *termp)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_data.c */
+
+#undef _nc_stdscr
+WINDOW	*_nc_stdscr(void)
+		{ return(*(WINDOW **)0); }
+
+#undef _nc_curscr
+WINDOW	*_nc_curscr(void)
+		{ return(*(WINDOW **)0); }
+
+#undef _nc_newscr
+WINDOW	*_nc_newscr(void)
+		{ return(*(WINDOW **)0); }
+
+#undef _nc_screen_chain
+SCREEN	*_nc_screen_chain;
+#undef SP
+SCREEN	*SP;
+#undef _nc_globals
+NCURSES_GLOBALS _nc_globals;
+#undef _nc_prescreen
+NCURSES_PRESCREEN _nc_prescreen;
+
+#undef _nc_screen_of
+SCREEN	*_nc_screen_of(
+		WINDOW	*win)
+		{ return(*(SCREEN **)0); }
+
+#undef _nc_init_pthreads
+void	_nc_init_pthreads(void)
+		{ /* void */ }
+
+#undef _nc_mutex_init
+void	_nc_mutex_init(
+		pthread_mutex_t *obj)
+		{ /* void */ }
+
+#undef _nc_mutex_lock
+int	_nc_mutex_lock(
+		pthread_mutex_t *obj)
+		{ return(*(int *)0); }
+
+#undef _nc_mutex_trylock
+int	_nc_mutex_trylock(
+		pthread_mutex_t *obj)
+		{ return(*(int *)0); }
+
+#undef _nc_mutex_unlock
+int	_nc_mutex_unlock(
+		pthread_mutex_t *obj)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_has_cap.c */
+
+#undef has_ic_sp
+NCURSES_BOOL has_ic_sp(
+		SCREEN	*sp)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef has_ic
+NCURSES_BOOL has_ic(void)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef has_il_sp
+NCURSES_BOOL has_il_sp(
+		SCREEN	*sp)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef has_il
+NCURSES_BOOL has_il(void)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./tinfo/lib_kernel.c */
+
+#undef erasechar_sp
+char	erasechar_sp(
+		SCREEN	*sp)
+		{ return(*(char *)0); }
+
+#undef erasechar
+char	erasechar(void)
+		{ return(*(char *)0); }
+
+#undef killchar_sp
+char	killchar_sp(
+		SCREEN	*sp)
+		{ return(*(char *)0); }
+
+#undef killchar
+char	killchar(void)
+		{ return(*(char *)0); }
+
+#undef flushinp_sp
+int	flushinp_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef flushinp
+int	flushinp(void)
+		{ return(*(int *)0); }
+
+/* ./lib_keyname.c */
+
+struct kn { short offset; int code; };
+
+#undef keyname_sp
+const char *keyname_sp(
+		SCREEN	*sp,
+		int	c)
+		{ return(*(const char **)0); }
+
+#undef keyname
+const char *keyname(
+		int	c)
+		{ return(*(const char **)0); }
+
+/* ./tinfo/lib_longname.c */
+
+#undef longname_sp
+char	*longname_sp(
+		SCREEN	*sp)
+		{ return(*(char **)0); }
+
+#undef longname
+char	*longname(void)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_napms.c */
+
+#undef napms_sp
+int	napms_sp(
+		SCREEN	*sp,
+		int	ms)
+		{ return(*(int *)0); }
+
+#undef napms
+int	napms(
+		int	ms)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_options.c */
+
+#undef idlok
+int	idlok(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef idcok
+void	idcok(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ /* void */ }
+
+#undef halfdelay_sp
+int	halfdelay_sp(
+		SCREEN	*sp,
+		int	t)
+		{ return(*(int *)0); }
+
+#undef halfdelay
+int	halfdelay(
+		int	t)
+		{ return(*(int *)0); }
+
+#undef nodelay
+int	nodelay(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef notimeout
+int	notimeout(
+		WINDOW	*win,
+		NCURSES_BOOL f)
+		{ return(*(int *)0); }
+
+#undef wtimeout
+void	wtimeout(
+		WINDOW	*win,
+		int	delay)
+		{ /* void */ }
+
+#undef keypad
+int	keypad(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef meta
+int	meta(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef curs_set_sp
+int	curs_set_sp(
+		SCREEN	*sp,
+		int	vis)
+		{ return(*(int *)0); }
+
+#undef curs_set
+int	curs_set(
+		int	vis)
+		{ return(*(int *)0); }
+
+#undef typeahead_sp
+int	typeahead_sp(
+		SCREEN	*sp,
+		int	fd)
+		{ return(*(int *)0); }
+
+#undef typeahead
+int	typeahead(
+		int	fd)
+		{ return(*(int *)0); }
+
+#undef has_key_sp
+int	has_key_sp(
+		SCREEN	*sp,
+		int	keycode)
+		{ return(*(int *)0); }
+
+#undef has_key
+int	has_key(
+		int	keycode)
+		{ return(*(int *)0); }
+
+#undef _nc_putp_flush_sp
+int	_nc_putp_flush_sp(
+		SCREEN	*sp,
+		const char *name,
+		const char *value)
+		{ return(*(int *)0); }
+
+#undef _nc_keypad
+int	_nc_keypad(
+		SCREEN	*sp,
+		int	flag)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_raw.c */
+
+#undef raw_sp
+int	raw_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef raw
+int	raw(void)
+		{ return(*(int *)0); }
+
+#undef cbreak_sp
+int	cbreak_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef cbreak
+int	cbreak(void)
+		{ return(*(int *)0); }
+
+#undef qiflush_sp
+void	qiflush_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef qiflush
+void	qiflush(void)
+		{ /* void */ }
+
+#undef noraw_sp
+int	noraw_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef noraw
+int	noraw(void)
+		{ return(*(int *)0); }
+
+#undef nocbreak_sp
+int	nocbreak_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef nocbreak
+int	nocbreak(void)
+		{ return(*(int *)0); }
+
+#undef noqiflush_sp
+void	noqiflush_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef noqiflush
+void	noqiflush(void)
+		{ /* void */ }
+
+#undef intrflush_sp
+int	intrflush_sp(
+		SCREEN	*sp,
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef intrflush
+int	intrflush(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_setup.c */
+
+#undef _nc_ttytype
+char	*_nc_ttytype(void)
+		{ return(*(char **)0); }
+
+#undef _nc_ptr_Lines
+int	*_nc_ptr_Lines(
+		SCREEN	*sp)
+		{ return(*(int **)0); }
+
+#undef _nc_LINES
+int	_nc_LINES(void)
+		{ return(*(int *)0); }
+
+#undef _nc_ptr_Cols
+int	*_nc_ptr_Cols(
+		SCREEN	*sp)
+		{ return(*(int **)0); }
+
+#undef _nc_COLS
+int	_nc_COLS(void)
+		{ return(*(int *)0); }
+
+#undef _nc_ptr_Tabsize
+int	*_nc_ptr_Tabsize(
+		SCREEN	*sp)
+		{ return(*(int **)0); }
+
+#undef _nc_TABSIZE
+int	_nc_TABSIZE(void)
+		{ return(*(int *)0); }
+
+#undef set_tabsize_sp
+int	set_tabsize_sp(
+		SCREEN	*sp,
+		int	value)
+		{ return(*(int *)0); }
+
+#undef set_tabsize
+int	set_tabsize(
+		int	value)
+		{ return(*(int *)0); }
+
+#undef _nc_handle_sigwinch
+int	_nc_handle_sigwinch(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef use_env_sp
+void	use_env_sp(
+		SCREEN	*sp,
+		NCURSES_BOOL f)
+		{ /* void */ }
+
+#undef use_tioctl_sp
+void	use_tioctl_sp(
+		SCREEN	*sp,
+		NCURSES_BOOL f)
+		{ /* void */ }
+
+#undef use_env
+void	use_env(
+		NCURSES_BOOL f)
+		{ /* void */ }
+
+#undef use_tioctl
+void	use_tioctl(
+		NCURSES_BOOL f)
+		{ /* void */ }
+
+#undef _nc_get_screensize
+void	_nc_get_screensize(
+		SCREEN	*sp,
+		int	*linep,
+		int	*colp)
+		{ /* void */ }
+
+#undef _nc_update_screensize
+void	_nc_update_screensize(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_setup_tinfo
+int	_nc_setup_tinfo(
+		const char *const tn,
+		TERMTYPE *const tp)
+		{ return(*(int *)0); }
+
+#undef _nc_tinfo_cmdch
+void	_nc_tinfo_cmdch(
+		TERMINAL *termp,
+		int	proto)
+		{ /* void */ }
+
+#undef _nc_get_locale
+char	*_nc_get_locale(void)
+		{ return(*(char **)0); }
+
+#undef _nc_unicode_locale
+int	_nc_unicode_locale(void)
+		{ return(*(int *)0); }
+
+#undef _nc_locale_breaks_acs
+int	_nc_locale_breaks_acs(
+		TERMINAL *termp)
+		{ return(*(int *)0); }
+
+#undef _nc_setupterm
+int	_nc_setupterm(
+		const char *tname,
+		int	Filedes,
+		int	*errret,
+		int	reuse)
+		{ return(*(int *)0); }
+
+#undef _nc_find_prescr
+SCREEN	*_nc_find_prescr(void)
+		{ return(*(SCREEN **)0); }
+
+#undef _nc_forget_prescr
+void	_nc_forget_prescr(void)
+		{ /* void */ }
+
+#undef new_prescr
+SCREEN	*new_prescr(void)
+		{ return(*(SCREEN **)0); }
+
+#undef setupterm
+int	setupterm(
+		const char *tname,
+		int	Filedes,
+		int	*errret)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_termcap.c */
+
+#undef UP
+char	*UP;
+#undef BC
+char	*BC;
+
+#undef tgetent_sp
+int	tgetent_sp(
+		SCREEN	*sp,
+		char	*bufp,
+		const char *name)
+		{ return(*(int *)0); }
+
+#undef tgetent
+int	tgetent(
+		char	*bufp,
+		const char *name)
+		{ return(*(int *)0); }
+
+#undef tgetflag_sp
+int	tgetflag_sp(
+		SCREEN	*sp,
+		const char *id)
+		{ return(*(int *)0); }
+
+#undef tgetflag
+int	tgetflag(
+		const char *id)
+		{ return(*(int *)0); }
+
+#undef tgetnum_sp
+int	tgetnum_sp(
+		SCREEN	*sp,
+		const char *id)
+		{ return(*(int *)0); }
+
+#undef tgetnum
+int	tgetnum(
+		const char *id)
+		{ return(*(int *)0); }
+
+#undef tgetstr_sp
+char	*tgetstr_sp(
+		SCREEN	*sp,
+		const char *id,
+		char	**area)
+		{ return(*(char **)0); }
+
+#undef tgetstr
+char	*tgetstr(
+		const char *id,
+		char	**area)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_termname.c */
+
+#undef termname_sp
+char	*termname_sp(
+		SCREEN	*sp)
+		{ return(*(char **)0); }
+
+#undef termname
+char	*termname(void)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_tgoto.c */
+
+#undef tgoto
+char	*tgoto(
+		const char *string,
+		int	x,
+		int	y)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_ti.c */
+
+#undef tigetflag_sp
+int	tigetflag_sp(
+		SCREEN	*sp,
+		const char *str)
+		{ return(*(int *)0); }
+
+#undef tigetflag
+int	tigetflag(
+		const char *str)
+		{ return(*(int *)0); }
+
+#undef tigetnum_sp
+int	tigetnum_sp(
+		SCREEN	*sp,
+		const char *str)
+		{ return(*(int *)0); }
+
+#undef tigetnum
+int	tigetnum(
+		const char *str)
+		{ return(*(int *)0); }
+
+#undef tigetstr_sp
+char	*tigetstr_sp(
+		SCREEN	*sp,
+		const char *str)
+		{ return(*(char **)0); }
+
+#undef tigetstr
+char	*tigetstr(
+		const char *str)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_tparm.c */
+
+#undef _nc_tparm_err
+int	_nc_tparm_err;
+
+#undef _nc_free_tparm
+void	_nc_free_tparm(
+		TERMINAL *termp)
+		{ /* void */ }
+
+#undef _nc_tparm_analyze
+int	_nc_tparm_analyze(
+		TERMINAL *term,
+		const char *string,
+		char	**p_is_s,
+		int	*_nc_popcount)
+		{ return(*(int *)0); }
+
+#undef tparm
+char	*tparm(
+		const char *string,
+		...)
+		{ return(*(char **)0); }
+
+#undef tiparm
+char	*tiparm(
+		const char *string,
+		...)
+		{ return(*(char **)0); }
+
+#undef _nc_tiparm
+char	*_nc_tiparm(
+		int	expected,
+		const char *string,
+		...)
+		{ return(*(char **)0); }
+
+#undef _nc_reset_tparm
+void	_nc_reset_tparm(
+		TERMINAL *term)
+		{ /* void */ }
+
+/* ./tinfo/lib_tputs.c */
+
+#undef PC
+char	PC;
+#undef ospeed
+short	ospeed;
+#undef _nc_nulls_sent
+int	_nc_nulls_sent;
+
+#undef _nc_set_no_padding
+void	_nc_set_no_padding(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef delay_output_sp
+int	delay_output_sp(
+		SCREEN	*sp,
+		int	ms)
+		{ return(*(int *)0); }
+
+#undef delay_output
+int	delay_output(
+		int	ms)
+		{ return(*(int *)0); }
+
+#undef _nc_flush_sp
+void	_nc_flush_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_flush
+void	_nc_flush(void)
+		{ /* void */ }
+
+#undef _nc_outch_sp
+int	_nc_outch_sp(
+		SCREEN	*sp,
+		int	ch)
+		{ return(*(int *)0); }
+
+#undef _nc_outch
+int	_nc_outch(
+		int	ch)
+		{ return(*(int *)0); }
+
+#undef _nc_putchar_sp
+int	_nc_putchar_sp(
+		SCREEN	*sp,
+		int	ch)
+		{ return(*(int *)0); }
+
+#undef _nc_putchar
+int	_nc_putchar(
+		int	ch)
+		{ return(*(int *)0); }
+
+#undef putp_sp
+int	putp_sp(
+		SCREEN	*sp,
+		const char *string)
+		{ return(*(int *)0); }
+
+#undef putp
+int	putp(
+		const char *string)
+		{ return(*(int *)0); }
+
+#undef _nc_putp_sp
+int	_nc_putp_sp(
+		SCREEN	*sp,
+		const char *name,
+		const char *string)
+		{ return(*(int *)0); }
+
+#undef _nc_putp
+int	_nc_putp(
+		const char *name,
+		const char *string)
+		{ return(*(int *)0); }
+
+#undef tputs_sp
+int	tputs_sp(
+		SCREEN	*sp,
+		const char *string,
+		int	affcnt,
+		NCURSES_OUTC_sp outc)
+		{ return(*(int *)0); }
+
+#undef _nc_outc_wrapper
+int	_nc_outc_wrapper(
+		SCREEN	*sp,
+		int	c)
+		{ return(*(int *)0); }
+
+#undef tputs
+int	tputs(
+		const char *string,
+		int	affcnt,
+		int	(*outc)(
+		int	p1))
+		{ return(*(int *)0); }
+
+/* ./trace/lib_trace.c */
+
+#undef _nc_tracing
+unsigned _nc_tracing;
+
+#undef _nc__nc_tputs_trace
+const char *_nc__nc_tputs_trace(void)
+		{ return(*(const char **)0); }
+
+#undef _nc__nc_outchars
+long	_nc__nc_outchars(void)
+		{ return(*(long *)0); }
+
+#undef _nc_set_tputs_trace
+void	_nc_set_tputs_trace(
+		const char *s)
+		{ /* void */ }
+
+#undef _nc_count_outchars
+void	_nc_count_outchars(
+		long	increment)
+		{ /* void */ }
+
+#undef curses_trace
+unsigned curses_trace(
+		unsigned tracelevel)
+		{ return(*(unsigned *)0); }
+
+#undef trace
+void	trace(
+		const unsigned int tracelevel)
+		{ /* void */ }
+
+#undef _tracef
+void	_tracef(
+		const char *fmt,
+		...)
+		{ /* void */ }
+
+#undef _nc_retrace_bool
+NCURSES_BOOL _nc_retrace_bool(
+		int	code)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_retrace_char
+char	_nc_retrace_char(
+		int	code)
+		{ return(*(char *)0); }
+
+#undef _nc_retrace_int
+int	_nc_retrace_int(
+		int	code)
+		{ return(*(int *)0); }
+
+#undef _nc_retrace_unsigned
+unsigned _nc_retrace_unsigned(
+		unsigned code)
+		{ return(*(unsigned *)0); }
+
+#undef _nc_retrace_ptr
+char	*_nc_retrace_ptr(
+		char	*code)
+		{ return(*(char **)0); }
+
+#undef _nc_retrace_cptr
+const char *_nc_retrace_cptr(
+		const char *code)
+		{ return(*(const char **)0); }
+
+#undef _nc_retrace_cvoid_ptr
+const void *_nc_retrace_cvoid_ptr(
+		const void *code)
+		{ return(*(const void **)0); }
+
+#undef _nc_retrace_void_ptr
+void	*_nc_retrace_void_ptr(
+		void	*code)
+		{ return(*(void **)0); }
+
+#undef _nc_retrace_sp
+SCREEN	*_nc_retrace_sp(
+		SCREEN	*code)
+		{ return(*(SCREEN **)0); }
+
+#undef _nc_retrace_win
+WINDOW	*_nc_retrace_win(
+		WINDOW	*code)
+		{ return(*(WINDOW **)0); }
+
+#undef _nc_fmt_funcptr
+char	*_nc_fmt_funcptr(
+		char	*target,
+		const char *source,
+		size_t	size)
+		{ return(*(char **)0); }
+
+#undef _nc_use_tracef
+int	_nc_use_tracef(
+		unsigned mask)
+		{ return(*(int *)0); }
+
+#undef _nc_locked_tracef
+void	_nc_locked_tracef(
+		const char *fmt,
+		...)
+		{ /* void */ }
+
+/* ./trace/lib_traceatr.c */
+
+#undef _traceattr2
+char	*_traceattr2(
+		int	bufnum,
+		chtype	newmode)
+		{ return(*(char **)0); }
+
+#undef _traceattr
+char	*_traceattr(
+		attr_t	newmode)
+		{ return(*(char **)0); }
+
+#undef _nc_retrace_int_attr_t
+int	_nc_retrace_int_attr_t(
+		attr_t	code)
+		{ return(*(int *)0); }
+
+#undef _nc_retrace_attr_t
+attr_t	_nc_retrace_attr_t(
+		attr_t	code)
+		{ return(*(attr_t *)0); }
+
+#undef _nc_altcharset_name
+const char *_nc_altcharset_name(
+		attr_t	attr,
+		chtype	ch)
+		{ return(*(const char **)0); }
+
+#undef _tracechtype2
+char	*_tracechtype2(
+		int	bufnum,
+		chtype	ch)
+		{ return(*(char **)0); }
+
+#undef _tracechtype
+char	*_tracechtype(
+		chtype	ch)
+		{ return(*(char **)0); }
+
+#undef _nc_retrace_chtype
+chtype	_nc_retrace_chtype(
+		chtype	code)
+		{ return(*(chtype *)0); }
+
+/* ./trace/lib_tracebits.c */
+
+#undef _nc_trace_ttymode
+char	*_nc_trace_ttymode(
+		const struct termios *tty)
+		{ return(*(char **)0); }
+
+#undef _nc_tracebits
+char	*_nc_tracebits(void)
+		{ return(*(char **)0); }
+
+/* ./trace/lib_tracechr.c */
+
+#undef _nc_tracechar
+char	*_nc_tracechar(
+		SCREEN	*sp,
+		int	ch)
+		{ return(*(char **)0); }
+
+#undef _tracechar
+char	*_tracechar(
+		int	ch)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_ttyflags.c */
+
+#undef _nc_get_tty_mode_sp
+int	_nc_get_tty_mode_sp(
+		SCREEN	*sp,
+		struct termios *buf)
+		{ return(*(int *)0); }
+
+#undef _nc_get_tty_mode
+int	_nc_get_tty_mode(
+		struct termios *buf)
+		{ return(*(int *)0); }
+
+#undef _nc_set_tty_mode_sp
+int	_nc_set_tty_mode_sp(
+		SCREEN	*sp,
+		struct termios *buf)
+		{ return(*(int *)0); }
+
+#undef _nc_set_tty_mode
+int	_nc_set_tty_mode(
+		struct termios *buf)
+		{ return(*(int *)0); }
+
+#undef def_shell_mode_sp
+int	def_shell_mode_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef def_shell_mode
+int	def_shell_mode(void)
+		{ return(*(int *)0); }
+
+#undef def_prog_mode_sp
+int	def_prog_mode_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef def_prog_mode
+int	def_prog_mode(void)
+		{ return(*(int *)0); }
+
+#undef reset_prog_mode_sp
+int	reset_prog_mode_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef reset_prog_mode
+int	reset_prog_mode(void)
+		{ return(*(int *)0); }
+
+#undef reset_shell_mode_sp
+int	reset_shell_mode_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef reset_shell_mode
+int	reset_shell_mode(void)
+		{ return(*(int *)0); }
+
+#undef savetty_sp
+int	savetty_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef savetty
+int	savetty(void)
+		{ return(*(int *)0); }
+
+#undef resetty_sp
+int	resetty_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef resetty
+int	resetty(void)
+		{ return(*(int *)0); }
+
+/* ./tty/lib_twait.c */
+
+#undef _nc_timed_wait
+int	_nc_timed_wait(
+		SCREEN	*sp,
+		int	mode,
+		int	milliseconds,
+		int	*timeleft)
+		{ return(*(int *)0); }
+
+/* ./tinfo/name_match.c */
+
+#undef _nc_first_name
+char	*_nc_first_name(
+		const char *const sp)
+		{ return(*(char **)0); }
+
+#undef _nc_name_match
+int	_nc_name_match(
+		const char *const namelst,
+		const char *const name,
+		const char *const delim)
+		{ return(*(int *)0); }
+
+/* ./names.c */
+
+#undef _nc_boolnames
+const char *const *_nc_boolnames(void)
+		{ return(*(const char **)0); }
+
+#undef _nc_boolfnames
+const char *const *_nc_boolfnames(void)
+		{ return(*(const char **)0); }
+
+#undef _nc_numnames
+const char *const *_nc_numnames(void)
+		{ return(*(const char **)0); }
+
+#undef _nc_numfnames
+const char *const *_nc_numfnames(void)
+		{ return(*(const char **)0); }
+
+#undef _nc_strnames
+const char *const *_nc_strnames(void)
+		{ return(*(const char **)0); }
+
+#undef _nc_strfnames
+const char *const *_nc_strfnames(void)
+		{ return(*(const char **)0); }
+
+/* ./tinfo/obsolete.c */
+
+#undef _nc_set_buffer_sp
+void	_nc_set_buffer_sp(
+		SCREEN	*sp,
+		FILE	*ofp,
+		int	buffered)
+		{ /* void */ }
+
+#undef _nc_set_buffer
+void	_nc_set_buffer(
+		FILE	*ofp,
+		int	buffered)
+		{ /* void */ }
+
+/* ./tinfo/read_entry.c */
+
+#undef _nc_init_termtype
+void	_nc_init_termtype(
+		TERMTYPE *const tp)
+		{ /* void */ }
+
+#undef _nc_read_termtype
+int	_nc_read_termtype(
+		TERMTYPE *ptr,
+		char	*buffer,
+		int	limit)
+		{ return(*(int *)0); }
+
+#undef _nc_read_file_entry
+int	_nc_read_file_entry(
+		const char *const filename,
+		TERMTYPE *ptr)
+		{ return(*(int *)0); }
+
+#undef _nc_read_entry
+int	_nc_read_entry(
+		const char *const name,
+		char	*const filename,
+		TERMTYPE *const tp)
+		{ return(*(int *)0); }
+
+/* ./tinfo/read_termcap.c */
+
+#undef _nc_read_termcap_entry
+int	_nc_read_termcap_entry(
+		const char *const tn,
+		TERMTYPE *const tp)
+		{ return(*(int *)0); }
+
+/* ./tinfo/strings.c */
+
+#undef _nc_str_init
+string_desc *_nc_str_init(
+		string_desc *dst,
+		char	*src,
+		size_t	len)
+		{ return(*(string_desc **)0); }
+
+#undef _nc_str_null
+string_desc *_nc_str_null(
+		string_desc *dst,
+		size_t	len)
+		{ return(*(string_desc **)0); }
+
+#undef _nc_str_copy
+string_desc *_nc_str_copy(
+		string_desc *dst,
+		string_desc *src)
+		{ return(*(string_desc **)0); }
+
+#undef _nc_safe_strcat
+NCURSES_BOOL _nc_safe_strcat(
+		string_desc *dst,
+		const char *src)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_safe_strcpy
+NCURSES_BOOL _nc_safe_strcpy(
+		string_desc *dst,
+		const char *src)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./trace/trace_buf.c */
+
+#undef _nc_trace_buf
+char	*_nc_trace_buf(
+		int	bufnum,
+		size_t	want)
+		{ return(*(char **)0); }
+
+#undef _nc_trace_bufcat
+char	*_nc_trace_bufcat(
+		int	bufnum,
+		const char *value)
+		{ return(*(char **)0); }
+
+/* ./trace/trace_tries.c */
+
+#undef _nc_trace_tries
+void	_nc_trace_tries(
+		TRIES	*tree)
+		{ /* void */ }
+
+/* ./base/tries.c */
+
+#undef _nc_expand_try
+char	*_nc_expand_try(
+		TRIES	*tree,
+		unsigned code,
+		int	*count,
+		size_t	len)
+		{ return(*(char **)0); }
+
+#undef _nc_remove_key
+int	_nc_remove_key(
+		TRIES	**tree,
+		unsigned code)
+		{ return(*(int *)0); }
+
+#undef _nc_remove_string
+int	_nc_remove_string(
+		TRIES	**tree,
+		const char *string)
+		{ return(*(int *)0); }
+
+/* ./tinfo/trim_sgr0.c */
+
+#undef _nc_trim_sgr0
+char	*_nc_trim_sgr0(
+		TERMTYPE *tp)
+		{ return(*(char **)0); }
+
+/* ./unctrl.c */
+
+#undef unctrl_sp
+const char *unctrl_sp(
+		SCREEN	*sp,
+		chtype	ch)
+		{ return(*(const char **)0); }
+
+#undef unctrl
+const char *unctrl(
+		chtype	ch)
+		{ return(*(const char **)0); }
+
+/* ./trace/visbuf.c */
+
+#undef _nc_visbuf2
+const char *_nc_visbuf2(
+		int	bufnum,
+		const char *buf)
+		{ return(*(const char **)0); }
+
+#undef _nc_visbuf
+const char *_nc_visbuf(
+		const char *buf)
+		{ return(*(const char **)0); }
+
+#undef _nc_visbufn
+const char *_nc_visbufn(
+		const char *buf,
+		int	len)
+		{ return(*(const char **)0); }
+
+#undef _nc_viscbuf2
+const char *_nc_viscbuf2(
+		int	bufnum,
+		const chtype *buf,
+		int	len)
+		{ return(*(const char **)0); }
+
+#undef _nc_viscbuf
+const char *_nc_viscbuf(
+		const chtype *buf,
+		int	len)
+		{ return(*(const char **)0); }
+
+/* ./tinfo/alloc_entry.c */
+
+#undef _nc_init_entry
+void	_nc_init_entry(
+		ENTRY	*const tp)
+		{ /* void */ }
+
+#undef _nc_copy_entry
+ENTRY	*_nc_copy_entry(
+		ENTRY	*oldp)
+		{ return(*(ENTRY **)0); }
+
+#undef _nc_save_str
+char	*_nc_save_str(
+		const char *string)
+		{ return(*(char **)0); }
+
+#undef _nc_wrap_entry
+void	_nc_wrap_entry(
+		ENTRY	*const ep,
+		NCURSES_BOOL copy_strings)
+		{ /* void */ }
+
+#undef _nc_merge_entry
+void	_nc_merge_entry(
+		ENTRY	*const target,
+		ENTRY	*const source)
+		{ /* void */ }
+
+/* ./tinfo/captoinfo.c */
+
+#undef _nc_captoinfo
+char	*_nc_captoinfo(
+		const char *cap,
+		const char *s,
+		int const parameterized)
+		{ return(*(char **)0); }
+
+#undef _nc_infotocap
+char	*_nc_infotocap(
+		const char *cap,
+		const char *str,
+		int const parameterized)
+		{ return(*(char **)0); }
+
+/* ./tinfo/comp_expand.c */
+
+#undef _nc_tic_expand
+char	*_nc_tic_expand(
+		const char *srcp,
+		NCURSES_BOOL tic_format,
+		int	numbers)
+		{ return(*(char **)0); }
+
+/* ./tinfo/comp_parse.c */
+
+#undef _nc_check_termtype2
+void	(*_nc_check_termtype2)(
+		TERMTYPE *p1,
+		NCURSES_BOOL p2);
+
+#undef _nc_entry_match
+NCURSES_BOOL _nc_entry_match(
+		char	*n1,
+		char	*n2)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_read_entry_source
+void	_nc_read_entry_source(
+		FILE	*fp,
+		char	*buf,
+		int	literal,
+		NCURSES_BOOL silent,
+		NCURSES_BOOL (*hook)(
+		ENTRY	*p1))
+		{ /* void */ }
+
+#undef _nc_resolve_uses2
+int	_nc_resolve_uses2(
+		NCURSES_BOOL fullresolve,
+		NCURSES_BOOL literal)
+		{ return(*(int *)0); }
+
+/* ./tinfo/comp_scan.c */
+
+#undef _nc_syntax
+int	_nc_syntax;
+#undef _nc_strict_bsd
+int	_nc_strict_bsd;
+#undef _nc_curr_file_pos
+long	_nc_curr_file_pos;
+#undef _nc_comment_start
+long	_nc_comment_start;
+#undef _nc_comment_end
+long	_nc_comment_end;
+#undef _nc_start_line
+long	_nc_start_line;
+#undef _nc_curr_token
+struct token _nc_curr_token;
+#undef _nc_disable_period
+NCURSES_BOOL _nc_disable_period;
+
+#undef _nc_reset_input
+void	_nc_reset_input(
+		FILE	*fp,
+		char	*buf)
+		{ /* void */ }
+
+#undef _nc_get_token
+int	_nc_get_token(
+		NCURSES_BOOL silent)
+		{ return(*(int *)0); }
+
+#undef _nc_trans_string
+int	_nc_trans_string(
+		char	*ptr,
+		char	*last)
+		{ return(*(int *)0); }
+
+#undef _nc_push_token
+void	_nc_push_token(
+		int	tokclass)
+		{ /* void */ }
+
+#undef _nc_panic_mode
+void	_nc_panic_mode(
+		char	ch)
+		{ /* void */ }
+
+/* ./tinfo/parse_entry.c */
+
+#undef _nc_parse_entry
+int	_nc_parse_entry(
+		ENTRY	*entryp,
+		int	literal,
+		NCURSES_BOOL silent)
+		{ return(*(int *)0); }
+
+#undef _nc_capcmp
+int	_nc_capcmp(
+		const char *s,
+		const char *t)
+		{ return(*(int *)0); }
+
+/* ./tinfo/write_entry.c */
+
+#undef _nc_set_writedir
+void	_nc_set_writedir(
+		const char *dir)
+		{ /* void */ }
+
+#undef _nc_write_entry
+void	_nc_write_entry(
+		TERMTYPE *const tp)
+		{ /* void */ }
+
+#undef _nc_write_object
+int	_nc_write_object(
+		TERMTYPE *tp,
+		char	*buffer,
+		unsigned *offset,
+		unsigned limit)
+		{ return(*(int *)0); }
+
+#undef _nc_tic_written
+int	_nc_tic_written(void)
+		{ return(*(int *)0); }
+
+/* ./base/define_key.c */
+
+#undef define_key_sp
+int	define_key_sp(
+		SCREEN	*sp,
+		const char *str,
+		int	keycode)
+		{ return(*(int *)0); }
+
+#undef define_key
+int	define_key(
+		const char *str,
+		int	keycode)
+		{ return(*(int *)0); }
+
+/* ./tinfo/hashed_db.c */
+
+#undef _nc_hashed_db
+void	_nc_hashed_db(void)
+		{ /* void */ }
+
+/* ./base/key_defined.c */
+
+#undef key_defined_sp
+int	key_defined_sp(
+		SCREEN	*sp,
+		const char *str)
+		{ return(*(int *)0); }
+
+#undef key_defined
+int	key_defined(
+		const char *str)
+		{ return(*(int *)0); }
+
+/* ./base/keybound.c */
+
+#undef keybound_sp
+char	*keybound_sp(
+		SCREEN	*sp,
+		int	code,
+		int	count)
+		{ return(*(char **)0); }
+
+#undef keybound
+char	*keybound(
+		int	code,
+		int	count)
+		{ return(*(char **)0); }
+
+/* ./base/keyok.c */
+
+#undef keyok_sp
+int	keyok_sp(
+		SCREEN	*sp,
+		int	c,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef keyok
+int	keyok(
+		int	c,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+/* ./base/version.c */
+
+#undef curses_version
+const char *curses_version(void)
+		{ return(*(const char **)0); }
diff --git a/ncurses/llib-lncursestw b/ncurses/llib-lncursestw
new file mode 100644
index 0000000..4576e0f
--- /dev/null
+++ b/ncurses/llib-lncursestw
@@ -0,0 +1,5577 @@
+/****************************************************************************
+ * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 2009-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey       2009-on                                  *
+ ****************************************************************************/
+/* LINTLIBRARY */
+
+/* ./tty/hardscroll.c */
+
+#include <curses.priv.h>
+
+#undef _nc_oldnums
+int	*_nc_oldnums;
+
+#undef _nc_scroll_optimize_sp
+void	_nc_scroll_optimize_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_scroll_optimize
+void	_nc_scroll_optimize(void)
+		{ /* void */ }
+
+#undef _nc_linedump_sp
+void	_nc_linedump_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_linedump
+void	_nc_linedump(void)
+		{ /* void */ }
+
+/* ./tty/hashmap.c */
+
+#undef _nc_hash_map_sp
+void	_nc_hash_map_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_hash_map
+void	_nc_hash_map(void)
+		{ /* void */ }
+
+#undef _nc_make_oldhash_sp
+void	_nc_make_oldhash_sp(
+		SCREEN	*sp,
+		int	i)
+		{ /* void */ }
+
+#undef _nc_make_oldhash
+void	_nc_make_oldhash(
+		int	i)
+		{ /* void */ }
+
+#undef _nc_scroll_oldhash_sp
+void	_nc_scroll_oldhash_sp(
+		SCREEN	*sp,
+		int	n,
+		int	top,
+		int	bot)
+		{ /* void */ }
+
+#undef _nc_scroll_oldhash
+void	_nc_scroll_oldhash(
+		int	n,
+		int	top,
+		int	bot)
+		{ /* void */ }
+
+/* ./base/lib_addch.c */
+
+#undef _nc_render
+cchar_t	_nc_render(
+		WINDOW	*win,
+		cchar_t	ch)
+		{ return(*(cchar_t *)0); }
+
+#undef _nc_build_wch
+int	_nc_build_wch(
+		WINDOW	*win,
+		cchar_t	*ch)
+		{ return(*(int *)0); }
+
+#undef _nc_waddch_nosync
+int	_nc_waddch_nosync(
+		WINDOW	*win,
+		const cchar_t c)
+		{ return(*(int *)0); }
+
+#undef waddch
+int	waddch(
+		WINDOW	*win,
+		const chtype ch)
+		{ return(*(int *)0); }
+
+#undef wechochar
+int	wechochar(
+		WINDOW	*win,
+		const chtype ch)
+		{ return(*(int *)0); }
+
+/* ./base/lib_addstr.c */
+
+#undef waddnstr
+int	waddnstr(
+		WINDOW	*win,
+		const char *astr,
+		int	n)
+		{ return(*(int *)0); }
+
+#undef waddchnstr
+int	waddchnstr(
+		WINDOW	*win,
+		const chtype *astr,
+		int	n)
+		{ return(*(int *)0); }
+
+#undef _nc_wchstrlen
+int	_nc_wchstrlen(
+		const cchar_t *s)
+		{ return(*(int *)0); }
+
+#undef wadd_wchnstr
+int	wadd_wchnstr(
+		WINDOW	*win,
+		const cchar_t *astr,
+		int	n)
+		{ return(*(int *)0); }
+
+#undef waddnwstr
+int	waddnwstr(
+		WINDOW	*win,
+		const wchar_t *str,
+		int	n)
+		{ return(*(int *)0); }
+
+/* ./base/lib_beep.c */
+
+#undef beep_sp
+int	beep_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef beep
+int	beep(void)
+		{ return(*(int *)0); }
+
+/* ./base/lib_bkgd.c */
+
+#undef wbkgrndset
+void	wbkgrndset(
+		WINDOW	*win,
+		const cchar_t *ch)
+		{ /* void */ }
+
+#undef wbkgdset
+void	wbkgdset(
+		WINDOW	*win,
+		chtype	ch)
+		{ /* void */ }
+
+#undef wbkgrnd
+int	wbkgrnd(
+		WINDOW	*win,
+		const cchar_t *ch)
+		{ return(*(int *)0); }
+
+#undef wbkgd
+int	wbkgd(
+		WINDOW	*win,
+		chtype	ch)
+		{ return(*(int *)0); }
+
+/* ./base/lib_box.c */
+
+#undef wborder
+int	wborder(
+		WINDOW	*win,
+		chtype	ls,
+		chtype	rs,
+		chtype	ts,
+		chtype	bs,
+		chtype	tl,
+		chtype	tr,
+		chtype	bl,
+		chtype	br)
+		{ return(*(int *)0); }
+
+/* ./base/lib_chgat.c */
+
+#undef wchgat
+int	wchgat(
+		WINDOW	*win,
+		int	n,
+		attr_t	attr,
+		short	pair_arg,
+		const void *opts)
+		{ return(*(int *)0); }
+
+/* ./base/lib_clear.c */
+
+#undef wclear
+int	wclear(
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+/* ./base/lib_clearok.c */
+
+#undef clearok
+int	clearok(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+/* ./base/lib_clrbot.c */
+
+#undef wclrtobot
+int	wclrtobot(
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+/* ./base/lib_clreol.c */
+
+#undef wclrtoeol
+int	wclrtoeol(
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+/* ./base/lib_color.c */
+
+#undef _nc_COLOR_PAIRS
+int	_nc_COLOR_PAIRS(void)
+		{ return(*(int *)0); }
+
+#undef _nc_COLORS
+int	_nc_COLORS(void)
+		{ return(*(int *)0); }
+
+#undef _nc_reset_colors_sp
+NCURSES_BOOL _nc_reset_colors_sp(
+		SCREEN	*sp)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_reset_colors
+NCURSES_BOOL _nc_reset_colors(void)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef start_color_sp
+int	start_color_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef start_color
+int	start_color(void)
+		{ return(*(int *)0); }
+
+#undef _nc_change_pair
+void	_nc_change_pair(
+		SCREEN	*sp,
+		int	pair)
+		{ /* void */ }
+
+#undef _nc_reserve_pairs
+void	_nc_reserve_pairs(
+		SCREEN	*sp,
+		int	want)
+		{ /* void */ }
+
+#undef _nc_init_pair
+int	_nc_init_pair(
+		SCREEN	*sp,
+		int	pair,
+		int	f,
+		int	b)
+		{ return(*(int *)0); }
+
+#undef init_pair_sp
+int	init_pair_sp(
+		SCREEN	*sp,
+		short	pair,
+		short	f,
+		short	b)
+		{ return(*(int *)0); }
+
+#undef init_pair
+int	init_pair(
+		short	pair,
+		short	f,
+		short	b)
+		{ return(*(int *)0); }
+
+#undef _nc_init_color
+int	_nc_init_color(
+		SCREEN	*sp,
+		int	color,
+		int	r,
+		int	g,
+		int	b)
+		{ return(*(int *)0); }
+
+#undef init_color_sp
+int	init_color_sp(
+		SCREEN	*sp,
+		short	color,
+		short	r,
+		short	g,
+		short	b)
+		{ return(*(int *)0); }
+
+#undef init_color
+int	init_color(
+		short	color,
+		short	r,
+		short	g,
+		short	b)
+		{ return(*(int *)0); }
+
+#undef can_change_color_sp
+NCURSES_BOOL can_change_color_sp(
+		SCREEN	*sp)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef can_change_color
+NCURSES_BOOL can_change_color(void)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef has_colors_sp
+NCURSES_BOOL has_colors_sp(
+		SCREEN	*sp)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef has_colors
+NCURSES_BOOL has_colors(void)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef color_content_sp
+int	color_content_sp(
+		SCREEN	*sp,
+		short	color,
+		short	*r,
+		short	*g,
+		short	*b)
+		{ return(*(int *)0); }
+
+#undef color_content
+int	color_content(
+		short	color,
+		short	*r,
+		short	*g,
+		short	*b)
+		{ return(*(int *)0); }
+
+#undef _nc_pair_content
+int	_nc_pair_content(
+		SCREEN	*sp,
+		int	pair,
+		int	*f,
+		int	*b)
+		{ return(*(int *)0); }
+
+#undef pair_content_sp
+int	pair_content_sp(
+		SCREEN	*sp,
+		short	pair,
+		short	*f,
+		short	*b)
+		{ return(*(int *)0); }
+
+#undef pair_content
+int	pair_content(
+		short	pair,
+		short	*f,
+		short	*b)
+		{ return(*(int *)0); }
+
+#undef _nc_do_color_sp
+void	_nc_do_color_sp(
+		SCREEN	*sp,
+		int	old_pair,
+		int	pair,
+		int	reverse,
+		NCURSES_OUTC_sp outc)
+		{ /* void */ }
+
+#undef _nc_do_color
+void	_nc_do_color(
+		int	old_pair,
+		int	pair,
+		int	reverse,
+		NCURSES_OUTC outc)
+		{ /* void */ }
+
+#undef init_extended_pair_sp
+int	init_extended_pair_sp(
+		SCREEN	*sp,
+		int	pair,
+		int	f,
+		int	b)
+		{ return(*(int *)0); }
+
+#undef init_extended_color_sp
+int	init_extended_color_sp(
+		SCREEN	*sp,
+		int	color,
+		int	r,
+		int	g,
+		int	b)
+		{ return(*(int *)0); }
+
+#undef extended_color_content_sp
+int	extended_color_content_sp(
+		SCREEN	*sp,
+		int	color,
+		int	*r,
+		int	*g,
+		int	*b)
+		{ return(*(int *)0); }
+
+#undef extended_pair_content_sp
+int	extended_pair_content_sp(
+		SCREEN	*sp,
+		int	pair,
+		int	*f,
+		int	*b)
+		{ return(*(int *)0); }
+
+#undef reset_color_pairs_sp
+void	reset_color_pairs_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef init_extended_pair
+int	init_extended_pair(
+		int	pair,
+		int	f,
+		int	b)
+		{ return(*(int *)0); }
+
+#undef init_extended_color
+int	init_extended_color(
+		int	color,
+		int	r,
+		int	g,
+		int	b)
+		{ return(*(int *)0); }
+
+#undef extended_color_content
+int	extended_color_content(
+		int	color,
+		int	*r,
+		int	*g,
+		int	*b)
+		{ return(*(int *)0); }
+
+#undef extended_pair_content
+int	extended_pair_content(
+		int	pair,
+		int	*f,
+		int	*b)
+		{ return(*(int *)0); }
+
+#undef reset_color_pairs
+void	reset_color_pairs(void)
+		{ /* void */ }
+
+/* ./base/lib_colorset.c */
+
+#undef wcolor_set
+int	wcolor_set(
+		WINDOW	*win,
+		short	pair_arg,
+		void	*opts)
+		{ return(*(int *)0); }
+
+/* ./base/lib_delch.c */
+
+#undef wdelch
+int	wdelch(
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+/* ./base/lib_delwin.c */
+
+#undef delwin
+int	delwin(
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+/* ./base/lib_echo.c */
+
+#undef echo_sp
+int	echo_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef echo
+int	echo(void)
+		{ return(*(int *)0); }
+
+#undef noecho_sp
+int	noecho_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef noecho
+int	noecho(void)
+		{ return(*(int *)0); }
+
+/* ./base/lib_endwin.c */
+
+#undef endwin_sp
+int	endwin_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef endwin
+int	endwin(void)
+		{ return(*(int *)0); }
+
+/* ./base/lib_erase.c */
+
+#undef werase
+int	werase(
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+/* ./base/lib_flash.c */
+
+#undef flash_sp
+int	flash_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef flash
+int	flash(void)
+		{ return(*(int *)0); }
+
+/* ./lib_gen.c */
+
+#undef addch
+int	addch(
+		const chtype z)
+		{ return(*(int *)0); }
+
+#undef addchnstr
+int	addchnstr(
+		const chtype *a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef addchstr
+int	addchstr(
+		const chtype *z)
+		{ return(*(int *)0); }
+
+#undef addnstr
+int	addnstr(
+		const char *a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef addstr
+int	addstr(
+		const char *z)
+		{ return(*(int *)0); }
+
+#undef attroff
+int	attroff(
+		NCURSES_ATTR_T	z)
+		{ return(*(int *)0); }
+
+#undef attron
+int	attron(
+		NCURSES_ATTR_T	z)
+		{ return(*(int *)0); }
+
+#undef attrset
+int	attrset(
+		NCURSES_ATTR_T	z)
+		{ return(*(int *)0); }
+
+#undef attr_get
+int	attr_get(
+		attr_t	*a1,
+		short	*a2,
+		void	*z)
+		{ return(*(int *)0); }
+
+#undef attr_off
+int	attr_off(
+		attr_t	a1,
+		void	*z)
+		{ return(*(int *)0); }
+
+#undef attr_on
+int	attr_on(
+		attr_t	a1,
+		void	*z)
+		{ return(*(int *)0); }
+
+#undef attr_set
+int	attr_set(
+		attr_t	a1,
+		short	a2,
+		void	*z)
+		{ return(*(int *)0); }
+
+#undef bkgd
+int	bkgd(
+		chtype	z)
+		{ return(*(int *)0); }
+
+#undef bkgdset
+void	bkgdset(
+		chtype	z)
+		{ /* void */ }
+
+#undef border
+int	border(
+		chtype	a1,
+		chtype	a2,
+		chtype	a3,
+		chtype	a4,
+		chtype	a5,
+		chtype	a6,
+		chtype	a7,
+		chtype	z)
+		{ return(*(int *)0); }
+
+#undef box
+int	box(
+		WINDOW	*a1,
+		chtype	a2,
+		chtype	z)
+		{ return(*(int *)0); }
+
+#undef chgat
+int	chgat(
+		int	a1,
+		attr_t	a2,
+		short	a3,
+		const void *z)
+		{ return(*(int *)0); }
+
+#undef clear
+int	clear(void)
+		{ return(*(int *)0); }
+
+#undef clrtobot
+int	clrtobot(void)
+		{ return(*(int *)0); }
+
+#undef clrtoeol
+int	clrtoeol(void)
+		{ return(*(int *)0); }
+
+#undef color_set
+int	color_set(
+		short	a1,
+		void	*z)
+		{ return(*(int *)0); }
+
+#undef COLOR_PAIR
+int	COLOR_PAIR(
+		int	z)
+		{ return(*(int *)0); }
+
+#undef delch
+int	delch(void)
+		{ return(*(int *)0); }
+
+#undef deleteln
+int	deleteln(void)
+		{ return(*(int *)0); }
+
+#undef echochar
+int	echochar(
+		const chtype z)
+		{ return(*(int *)0); }
+
+#undef erase
+int	erase(void)
+		{ return(*(int *)0); }
+
+#undef getbkgd
+chtype	getbkgd(
+		WINDOW	*z)
+		{ return(*(chtype *)0); }
+
+#undef getch
+int	getch(void)
+		{ return(*(int *)0); }
+
+#undef getnstr
+int	getnstr(
+		char	*a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef getstr
+int	getstr(
+		char	*z)
+		{ return(*(int *)0); }
+
+#undef hline
+int	hline(
+		chtype	a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef inch
+chtype	inch(void)
+		{ return(*(chtype *)0); }
+
+#undef inchnstr
+int	inchnstr(
+		chtype	*a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef inchstr
+int	inchstr(
+		chtype	*z)
+		{ return(*(int *)0); }
+
+#undef innstr
+int	innstr(
+		char	*a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef insch
+int	insch(
+		chtype	z)
+		{ return(*(int *)0); }
+
+#undef insdelln
+int	insdelln(
+		int	z)
+		{ return(*(int *)0); }
+
+#undef insertln
+int	insertln(void)
+		{ return(*(int *)0); }
+
+#undef insnstr
+int	insnstr(
+		const char *a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef insstr
+int	insstr(
+		const char *z)
+		{ return(*(int *)0); }
+
+#undef instr
+int	instr(
+		char	*z)
+		{ return(*(int *)0); }
+
+#undef move
+int	move(
+		int	a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvaddch
+int	mvaddch(
+		int	a1,
+		int	a2,
+		const chtype z)
+		{ return(*(int *)0); }
+
+#undef mvaddchnstr
+int	mvaddchnstr(
+		int	a1,
+		int	a2,
+		const chtype *a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvaddchstr
+int	mvaddchstr(
+		int	a1,
+		int	a2,
+		const chtype *z)
+		{ return(*(int *)0); }
+
+#undef mvaddnstr
+int	mvaddnstr(
+		int	a1,
+		int	a2,
+		const char *a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvaddstr
+int	mvaddstr(
+		int	a1,
+		int	a2,
+		const char *z)
+		{ return(*(int *)0); }
+
+#undef mvchgat
+int	mvchgat(
+		int	a1,
+		int	a2,
+		int	a3,
+		attr_t	a4,
+		short	a5,
+		const void *z)
+		{ return(*(int *)0); }
+
+#undef mvdelch
+int	mvdelch(
+		int	a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvgetch
+int	mvgetch(
+		int	a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvgetnstr
+int	mvgetnstr(
+		int	a1,
+		int	a2,
+		char	*a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvgetstr
+int	mvgetstr(
+		int	a1,
+		int	a2,
+		char	*z)
+		{ return(*(int *)0); }
+
+#undef mvhline
+int	mvhline(
+		int	a1,
+		int	a2,
+		chtype	a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvinch
+chtype	mvinch(
+		int	a1,
+		int	z)
+		{ return(*(chtype *)0); }
+
+#undef mvinchnstr
+int	mvinchnstr(
+		int	a1,
+		int	a2,
+		chtype	*a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvinchstr
+int	mvinchstr(
+		int	a1,
+		int	a2,
+		chtype	*z)
+		{ return(*(int *)0); }
+
+#undef mvinnstr
+int	mvinnstr(
+		int	a1,
+		int	a2,
+		char	*a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvinsch
+int	mvinsch(
+		int	a1,
+		int	a2,
+		chtype	z)
+		{ return(*(int *)0); }
+
+#undef mvinsnstr
+int	mvinsnstr(
+		int	a1,
+		int	a2,
+		const char *a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvinsstr
+int	mvinsstr(
+		int	a1,
+		int	a2,
+		const char *z)
+		{ return(*(int *)0); }
+
+#undef mvinstr
+int	mvinstr(
+		int	a1,
+		int	a2,
+		char	*z)
+		{ return(*(int *)0); }
+
+#undef mvvline
+int	mvvline(
+		int	a1,
+		int	a2,
+		chtype	a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwaddch
+int	mvwaddch(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const chtype z)
+		{ return(*(int *)0); }
+
+#undef mvwaddchnstr
+int	mvwaddchnstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const chtype *a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwaddchstr
+int	mvwaddchstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const chtype *z)
+		{ return(*(int *)0); }
+
+#undef mvwaddnstr
+int	mvwaddnstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const char *a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwaddstr
+int	mvwaddstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const char *z)
+		{ return(*(int *)0); }
+
+#undef mvwchgat
+int	mvwchgat(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		int	a4,
+		attr_t	a5,
+		short	a6,
+		const void *z)
+		{ return(*(int *)0); }
+
+#undef mvwdelch
+int	mvwdelch(
+		WINDOW	*a1,
+		int	a2,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwgetch
+int	mvwgetch(
+		WINDOW	*a1,
+		int	a2,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwgetnstr
+int	mvwgetnstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		char	*a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwgetstr
+int	mvwgetstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		char	*z)
+		{ return(*(int *)0); }
+
+#undef mvwhline
+int	mvwhline(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		chtype	a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwinch
+chtype	mvwinch(
+		WINDOW	*a1,
+		int	a2,
+		int	z)
+		{ return(*(chtype *)0); }
+
+#undef mvwinchnstr
+int	mvwinchnstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		chtype	*a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwinchstr
+int	mvwinchstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		chtype	*z)
+		{ return(*(int *)0); }
+
+#undef mvwinnstr
+int	mvwinnstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		char	*a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwinsch
+int	mvwinsch(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		chtype	z)
+		{ return(*(int *)0); }
+
+#undef mvwinsnstr
+int	mvwinsnstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const char *a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwinsstr
+int	mvwinsstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const char *z)
+		{ return(*(int *)0); }
+
+#undef mvwinstr
+int	mvwinstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		char	*z)
+		{ return(*(int *)0); }
+
+#undef mvwvline
+int	mvwvline(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		chtype	a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef PAIR_NUMBER
+int	PAIR_NUMBER(
+		int	z)
+		{ return(*(int *)0); }
+
+#undef redrawwin
+int	redrawwin(
+		WINDOW	*z)
+		{ return(*(int *)0); }
+
+#undef refresh
+int	refresh(void)
+		{ return(*(int *)0); }
+
+#undef scrl
+int	scrl(
+		int	z)
+		{ return(*(int *)0); }
+
+#undef scroll
+int	scroll(
+		WINDOW	*z)
+		{ return(*(int *)0); }
+
+#undef setscrreg
+int	setscrreg(
+		int	a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef slk_attr_off
+int	slk_attr_off(
+		const attr_t a1,
+		void	*z)
+		{ return(*(int *)0); }
+
+#undef slk_attr_on
+int	slk_attr_on(
+		attr_t	a1,
+		void	*z)
+		{ return(*(int *)0); }
+
+#undef standout
+int	standout(void)
+		{ return(*(int *)0); }
+
+#undef standend
+int	standend(void)
+		{ return(*(int *)0); }
+
+#undef timeout
+void	timeout(
+		int	z)
+		{ /* void */ }
+
+#undef touchline
+int	touchline(
+		WINDOW	*a1,
+		int	a2,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef touchwin
+int	touchwin(
+		WINDOW	*z)
+		{ return(*(int *)0); }
+
+#undef untouchwin
+int	untouchwin(
+		WINDOW	*z)
+		{ return(*(int *)0); }
+
+#undef vline
+int	vline(
+		chtype	a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef waddchstr
+int	waddchstr(
+		WINDOW	*a1,
+		const chtype *z)
+		{ return(*(int *)0); }
+
+#undef waddstr
+int	waddstr(
+		WINDOW	*a1,
+		const char *z)
+		{ return(*(int *)0); }
+
+#undef wattron
+int	wattron(
+		WINDOW	*a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef wattroff
+int	wattroff(
+		WINDOW	*a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef wattrset
+int	wattrset(
+		WINDOW	*a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef wattr_get
+int	wattr_get(
+		WINDOW	*a1,
+		attr_t	*a2,
+		short	*a3,
+		void	*z)
+		{ return(*(int *)0); }
+
+#undef wattr_set
+int	wattr_set(
+		WINDOW	*a1,
+		attr_t	a2,
+		short	a3,
+		void	*z)
+		{ return(*(int *)0); }
+
+#undef wdeleteln
+int	wdeleteln(
+		WINDOW	*z)
+		{ return(*(int *)0); }
+
+#undef wgetstr
+int	wgetstr(
+		WINDOW	*a1,
+		char	*z)
+		{ return(*(int *)0); }
+
+#undef winchstr
+int	winchstr(
+		WINDOW	*a1,
+		chtype	*z)
+		{ return(*(int *)0); }
+
+#undef winsertln
+int	winsertln(
+		WINDOW	*z)
+		{ return(*(int *)0); }
+
+#undef winsstr
+int	winsstr(
+		WINDOW	*a1,
+		const char *z)
+		{ return(*(int *)0); }
+
+#undef winstr
+int	winstr(
+		WINDOW	*a1,
+		char	*z)
+		{ return(*(int *)0); }
+
+#undef wstandout
+int	wstandout(
+		WINDOW	*z)
+		{ return(*(int *)0); }
+
+#undef wstandend
+int	wstandend(
+		WINDOW	*z)
+		{ return(*(int *)0); }
+
+#undef getattrs
+int	getattrs(
+		const WINDOW *z)
+		{ return(*(int *)0); }
+
+#undef getcurx
+int	getcurx(
+		const WINDOW *z)
+		{ return(*(int *)0); }
+
+#undef getcury
+int	getcury(
+		const WINDOW *z)
+		{ return(*(int *)0); }
+
+#undef getbegx
+int	getbegx(
+		const WINDOW *z)
+		{ return(*(int *)0); }
+
+#undef getbegy
+int	getbegy(
+		const WINDOW *z)
+		{ return(*(int *)0); }
+
+#undef getmaxx
+int	getmaxx(
+		const WINDOW *z)
+		{ return(*(int *)0); }
+
+#undef getmaxy
+int	getmaxy(
+		const WINDOW *z)
+		{ return(*(int *)0); }
+
+#undef getparx
+int	getparx(
+		const WINDOW *z)
+		{ return(*(int *)0); }
+
+#undef getpary
+int	getpary(
+		const WINDOW *z)
+		{ return(*(int *)0); }
+
+#undef wgetparent
+WINDOW	*wgetparent(
+		const WINDOW *z)
+		{ return(*(WINDOW **)0); }
+
+#undef is_cleared
+NCURSES_BOOL is_cleared(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_idcok
+NCURSES_BOOL is_idcok(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_idlok
+NCURSES_BOOL is_idlok(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_immedok
+NCURSES_BOOL is_immedok(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_keypad
+NCURSES_BOOL is_keypad(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_leaveok
+NCURSES_BOOL is_leaveok(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_nodelay
+NCURSES_BOOL is_nodelay(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_notimeout
+NCURSES_BOOL is_notimeout(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_pad
+NCURSES_BOOL is_pad(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_scrollok
+NCURSES_BOOL is_scrollok(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_subwin
+NCURSES_BOOL is_subwin(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_syncok
+NCURSES_BOOL is_syncok(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef wgetdelay
+int	wgetdelay(
+		const WINDOW *z)
+		{ return(*(int *)0); }
+
+#undef wgetscrreg
+int	wgetscrreg(
+		const WINDOW *a1,
+		int	*a2,
+		int	*z)
+		{ return(*(int *)0); }
+
+#undef add_wch
+int	add_wch(
+		const cchar_t *z)
+		{ return(*(int *)0); }
+
+#undef add_wchnstr
+int	add_wchnstr(
+		const cchar_t *a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef add_wchstr
+int	add_wchstr(
+		const cchar_t *z)
+		{ return(*(int *)0); }
+
+#undef addnwstr
+int	addnwstr(
+		const wchar_t *a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef addwstr
+int	addwstr(
+		const wchar_t *z)
+		{ return(*(int *)0); }
+
+#undef bkgrnd
+int	bkgrnd(
+		const cchar_t *z)
+		{ return(*(int *)0); }
+
+#undef bkgrndset
+void	bkgrndset(
+		const cchar_t *z)
+		{ /* void */ }
+
+#undef border_set
+int	border_set(
+		const cchar_t *a1,
+		const cchar_t *a2,
+		const cchar_t *a3,
+		const cchar_t *a4,
+		const cchar_t *a5,
+		const cchar_t *a6,
+		const cchar_t *a7,
+		const cchar_t *z)
+		{ return(*(int *)0); }
+
+#undef box_set
+int	box_set(
+		WINDOW	*a1,
+		const cchar_t *a2,
+		const cchar_t *z)
+		{ return(*(int *)0); }
+
+#undef echo_wchar
+int	echo_wchar(
+		const cchar_t *z)
+		{ return(*(int *)0); }
+
+#undef get_wch
+int	get_wch(
+		wint_t	*z)
+		{ return(*(int *)0); }
+
+#undef get_wstr
+int	get_wstr(
+		wint_t	*z)
+		{ return(*(int *)0); }
+
+#undef getbkgrnd
+int	getbkgrnd(
+		cchar_t	*z)
+		{ return(*(int *)0); }
+
+#undef getn_wstr
+int	getn_wstr(
+		wint_t	*a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef hline_set
+int	hline_set(
+		const cchar_t *a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef in_wch
+int	in_wch(
+		cchar_t	*z)
+		{ return(*(int *)0); }
+
+#undef in_wchnstr
+int	in_wchnstr(
+		cchar_t	*a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef in_wchstr
+int	in_wchstr(
+		cchar_t	*z)
+		{ return(*(int *)0); }
+
+#undef innwstr
+int	innwstr(
+		wchar_t	*a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef ins_nwstr
+int	ins_nwstr(
+		const wchar_t *a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef ins_wch
+int	ins_wch(
+		const cchar_t *z)
+		{ return(*(int *)0); }
+
+#undef ins_wstr
+int	ins_wstr(
+		const wchar_t *z)
+		{ return(*(int *)0); }
+
+#undef inwstr
+int	inwstr(
+		wchar_t	*z)
+		{ return(*(int *)0); }
+
+#undef mvadd_wch
+int	mvadd_wch(
+		int	a1,
+		int	a2,
+		const cchar_t *z)
+		{ return(*(int *)0); }
+
+#undef mvadd_wchnstr
+int	mvadd_wchnstr(
+		int	a1,
+		int	a2,
+		const cchar_t *a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvadd_wchstr
+int	mvadd_wchstr(
+		int	a1,
+		int	a2,
+		const cchar_t *z)
+		{ return(*(int *)0); }
+
+#undef mvaddnwstr
+int	mvaddnwstr(
+		int	a1,
+		int	a2,
+		const wchar_t *a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvaddwstr
+int	mvaddwstr(
+		int	a1,
+		int	a2,
+		const wchar_t *z)
+		{ return(*(int *)0); }
+
+#undef mvget_wch
+int	mvget_wch(
+		int	a1,
+		int	a2,
+		wint_t	*z)
+		{ return(*(int *)0); }
+
+#undef mvget_wstr
+int	mvget_wstr(
+		int	a1,
+		int	a2,
+		wint_t	*z)
+		{ return(*(int *)0); }
+
+#undef mvgetn_wstr
+int	mvgetn_wstr(
+		int	a1,
+		int	a2,
+		wint_t	*a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvhline_set
+int	mvhline_set(
+		int	a1,
+		int	a2,
+		const cchar_t *a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvin_wch
+int	mvin_wch(
+		int	a1,
+		int	a2,
+		cchar_t	*z)
+		{ return(*(int *)0); }
+
+#undef mvin_wchnstr
+int	mvin_wchnstr(
+		int	a1,
+		int	a2,
+		cchar_t	*a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvin_wchstr
+int	mvin_wchstr(
+		int	a1,
+		int	a2,
+		cchar_t	*z)
+		{ return(*(int *)0); }
+
+#undef mvinnwstr
+int	mvinnwstr(
+		int	a1,
+		int	a2,
+		wchar_t	*a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvins_nwstr
+int	mvins_nwstr(
+		int	a1,
+		int	a2,
+		const wchar_t *a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvins_wch
+int	mvins_wch(
+		int	a1,
+		int	a2,
+		const cchar_t *z)
+		{ return(*(int *)0); }
+
+#undef mvins_wstr
+int	mvins_wstr(
+		int	a1,
+		int	a2,
+		const wchar_t *z)
+		{ return(*(int *)0); }
+
+#undef mvinwstr
+int	mvinwstr(
+		int	a1,
+		int	a2,
+		wchar_t	*z)
+		{ return(*(int *)0); }
+
+#undef mvvline_set
+int	mvvline_set(
+		int	a1,
+		int	a2,
+		const cchar_t *a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwadd_wch
+int	mvwadd_wch(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const cchar_t *z)
+		{ return(*(int *)0); }
+
+#undef mvwadd_wchnstr
+int	mvwadd_wchnstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const cchar_t *a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwadd_wchstr
+int	mvwadd_wchstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const cchar_t *z)
+		{ return(*(int *)0); }
+
+#undef mvwaddnwstr
+int	mvwaddnwstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const wchar_t *a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwaddwstr
+int	mvwaddwstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const wchar_t *z)
+		{ return(*(int *)0); }
+
+#undef mvwget_wch
+int	mvwget_wch(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		wint_t	*z)
+		{ return(*(int *)0); }
+
+#undef mvwget_wstr
+int	mvwget_wstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		wint_t	*z)
+		{ return(*(int *)0); }
+
+#undef mvwgetn_wstr
+int	mvwgetn_wstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		wint_t	*a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwhline_set
+int	mvwhline_set(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const cchar_t *a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwin_wch
+int	mvwin_wch(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		cchar_t	*z)
+		{ return(*(int *)0); }
+
+#undef mvwin_wchnstr
+int	mvwin_wchnstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		cchar_t	*a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwin_wchstr
+int	mvwin_wchstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		cchar_t	*z)
+		{ return(*(int *)0); }
+
+#undef mvwinnwstr
+int	mvwinnwstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		wchar_t	*a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwins_nwstr
+int	mvwins_nwstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const wchar_t *a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwins_wch
+int	mvwins_wch(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const cchar_t *z)
+		{ return(*(int *)0); }
+
+#undef mvwins_wstr
+int	mvwins_wstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const wchar_t *z)
+		{ return(*(int *)0); }
+
+#undef mvwinwstr
+int	mvwinwstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		wchar_t	*z)
+		{ return(*(int *)0); }
+
+#undef mvwvline_set
+int	mvwvline_set(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const cchar_t *a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef vline_set
+int	vline_set(
+		const cchar_t *a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef wadd_wchstr
+int	wadd_wchstr(
+		WINDOW	*a1,
+		const cchar_t *z)
+		{ return(*(int *)0); }
+
+#undef waddwstr
+int	waddwstr(
+		WINDOW	*a1,
+		const wchar_t *z)
+		{ return(*(int *)0); }
+
+#undef wget_wstr
+int	wget_wstr(
+		WINDOW	*a1,
+		wint_t	*z)
+		{ return(*(int *)0); }
+
+#undef wgetbkgrnd
+int	wgetbkgrnd(
+		WINDOW	*a1,
+		cchar_t	*z)
+		{ return(*(int *)0); }
+
+#undef win_wchstr
+int	win_wchstr(
+		WINDOW	*a1,
+		cchar_t	*z)
+		{ return(*(int *)0); }
+
+#undef wins_wstr
+int	wins_wstr(
+		WINDOW	*a1,
+		const wchar_t *z)
+		{ return(*(int *)0); }
+
+#undef mouse_trafo
+NCURSES_BOOL mouse_trafo(
+		int	*a1,
+		int	*a2,
+		NCURSES_BOOL z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./base/lib_getch.c */
+
+#undef _nc_ESCDELAY
+int	_nc_ESCDELAY(void)
+		{ return(*(int *)0); }
+
+#undef _nc_ptr_Escdelay
+int	*_nc_ptr_Escdelay(
+		SCREEN	*sp)
+		{ return(*(int **)0); }
+
+#undef set_escdelay_sp
+int	set_escdelay_sp(
+		SCREEN	*sp,
+		int	value)
+		{ return(*(int *)0); }
+
+#undef set_escdelay
+int	set_escdelay(
+		int	value)
+		{ return(*(int *)0); }
+
+#undef get_escdelay_sp
+int	get_escdelay_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef get_escdelay
+int	get_escdelay(void)
+		{ return(*(int *)0); }
+
+#undef _nc_wgetch
+int	_nc_wgetch(
+		WINDOW	*win,
+		int	*result,
+		int	use_meta)
+		{ return(*(int *)0); }
+
+#undef wgetch
+int	wgetch(
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+/* ./base/lib_getstr.c */
+
+#undef wgetnstr
+int	wgetnstr(
+		WINDOW	*win,
+		char	*str,
+		int	maxlen)
+		{ return(*(int *)0); }
+
+/* ./base/lib_hline.c */
+
+#undef whline
+int	whline(
+		WINDOW	*win,
+		chtype	ch,
+		int	n)
+		{ return(*(int *)0); }
+
+/* ./base/lib_immedok.c */
+
+#undef immedok
+void	immedok(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ /* void */ }
+
+/* ./base/lib_inchstr.c */
+
+#undef winchnstr
+int	winchnstr(
+		WINDOW	*win,
+		chtype	*str,
+		int	n)
+		{ return(*(int *)0); }
+
+/* ./base/lib_initscr.c */
+
+#undef initscr
+WINDOW	*initscr(void)
+		{ return(*(WINDOW **)0); }
+
+/* ./base/lib_insch.c */
+
+#undef _nc_insert_ch
+int	_nc_insert_ch(
+		SCREEN	*sp,
+		WINDOW	*win,
+		chtype	ch)
+		{ return(*(int *)0); }
+
+#undef winsch
+int	winsch(
+		WINDOW	*win,
+		chtype	c)
+		{ return(*(int *)0); }
+
+/* ./base/lib_insdel.c */
+
+#undef winsdelln
+int	winsdelln(
+		WINDOW	*win,
+		int	n)
+		{ return(*(int *)0); }
+
+/* ./base/lib_insnstr.c */
+
+#undef winsnstr
+int	winsnstr(
+		WINDOW	*win,
+		const char *s,
+		int	n)
+		{ return(*(int *)0); }
+
+/* ./base/lib_instr.c */
+
+#undef winnstr
+int	winnstr(
+		WINDOW	*win,
+		char	*str,
+		int	n)
+		{ return(*(int *)0); }
+
+/* ./base/lib_isendwin.c */
+
+#undef isendwin_sp
+NCURSES_BOOL isendwin_sp(
+		SCREEN	*sp)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef isendwin
+NCURSES_BOOL isendwin(void)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./base/lib_leaveok.c */
+
+#undef leaveok
+int	leaveok(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+/* ./base/lib_mouse.c */
+
+#undef getmouse_sp
+int	getmouse_sp(
+		SCREEN	*sp,
+		MEVENT	*aevent)
+		{ return(*(int *)0); }
+
+#undef getmouse
+int	getmouse(
+		MEVENT	*aevent)
+		{ return(*(int *)0); }
+
+#undef ungetmouse_sp
+int	ungetmouse_sp(
+		SCREEN	*sp,
+		MEVENT	*aevent)
+		{ return(*(int *)0); }
+
+#undef ungetmouse
+int	ungetmouse(
+		MEVENT	*aevent)
+		{ return(*(int *)0); }
+
+#undef mousemask_sp
+mmask_t	mousemask_sp(
+		SCREEN	*sp,
+		mmask_t	newmask,
+		mmask_t	*oldmask)
+		{ return(*(mmask_t *)0); }
+
+#undef mousemask
+mmask_t	mousemask(
+		mmask_t	newmask,
+		mmask_t	*oldmask)
+		{ return(*(mmask_t *)0); }
+
+#undef wenclose
+NCURSES_BOOL wenclose(
+		const WINDOW *win,
+		int	y,
+		int	x)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef mouseinterval_sp
+int	mouseinterval_sp(
+		SCREEN	*sp,
+		int	maxclick)
+		{ return(*(int *)0); }
+
+#undef mouseinterval
+int	mouseinterval(
+		int	maxclick)
+		{ return(*(int *)0); }
+
+#undef _nc_has_mouse
+NCURSES_BOOL _nc_has_mouse(
+		SCREEN	*sp)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef has_mouse_sp
+NCURSES_BOOL has_mouse_sp(
+		SCREEN	*sp)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef has_mouse
+NCURSES_BOOL has_mouse(void)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef wmouse_trafo
+NCURSES_BOOL wmouse_trafo(
+		const WINDOW *win,
+		int	*pY,
+		int	*pX,
+		NCURSES_BOOL to_screen)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./base/lib_move.c */
+
+#undef wmove
+int	wmove(
+		WINDOW	*win,
+		int	y,
+		int	x)
+		{ return(*(int *)0); }
+
+/* ./tty/lib_mvcur.c */
+
+#undef _nc_msec_cost_sp
+int	_nc_msec_cost_sp(
+		SCREEN	*sp,
+		const char *const cap,
+		int	affcnt)
+		{ return(*(int *)0); }
+
+#undef _nc_msec_cost
+int	_nc_msec_cost(
+		const char *const cap,
+		int	affcnt)
+		{ return(*(int *)0); }
+
+#undef _nc_mvcur_resume_sp
+void	_nc_mvcur_resume_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_mvcur_resume
+void	_nc_mvcur_resume(void)
+		{ /* void */ }
+
+#undef _nc_mvcur_init_sp
+void	_nc_mvcur_init_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_mvcur_init
+void	_nc_mvcur_init(void)
+		{ /* void */ }
+
+#undef _nc_mvcur_wrap_sp
+void	_nc_mvcur_wrap_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_mvcur_wrap
+void	_nc_mvcur_wrap(void)
+		{ /* void */ }
+
+#undef _nc_mvcur_sp
+int	_nc_mvcur_sp(
+		SCREEN	*sp,
+		int	yold,
+		int	xold,
+		int	ynew,
+		int	xnew)
+		{ return(*(int *)0); }
+
+#undef _nc_mvcur
+int	_nc_mvcur(
+		int	yold,
+		int	xold,
+		int	ynew,
+		int	xnew)
+		{ return(*(int *)0); }
+
+#undef mvcur_sp
+int	mvcur_sp(
+		SCREEN	*sp,
+		int	yold,
+		int	xold,
+		int	ynew,
+		int	xnew)
+		{ return(*(int *)0); }
+
+#undef mvcur
+int	mvcur(
+		int	yold,
+		int	xold,
+		int	ynew,
+		int	xnew)
+		{ return(*(int *)0); }
+
+#undef _nc_optimize_enable
+int	_nc_optimize_enable;
+
+/* ./base/lib_mvwin.c */
+
+#undef mvwin
+int	mvwin(
+		WINDOW	*win,
+		int	by,
+		int	bx)
+		{ return(*(int *)0); }
+
+/* ./base/lib_newterm.c */
+
+#undef filter_sp
+void	filter_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef filter
+void	filter(void)
+		{ /* void */ }
+
+#undef nofilter_sp
+void	nofilter_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef nofilter
+void	nofilter(void)
+		{ /* void */ }
+
+#undef newterm_sp
+SCREEN	*newterm_sp(
+		SCREEN	*sp,
+		const char *name,
+		FILE	*ofp,
+		FILE	*ifp)
+		{ return(*(SCREEN **)0); }
+
+#undef newterm
+SCREEN	*newterm(
+		const char *name,
+		FILE	*ofp,
+		FILE	*ifp)
+		{ return(*(SCREEN **)0); }
+
+/* ./base/lib_newwin.c */
+
+#undef _nc_freewin
+int	_nc_freewin(
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+#undef newwin_sp
+WINDOW	*newwin_sp(
+		SCREEN	*sp,
+		int	num_lines,
+		int	num_columns,
+		int	begy,
+		int	begx)
+		{ return(*(WINDOW **)0); }
+
+#undef newwin
+WINDOW	*newwin(
+		int	num_lines,
+		int	num_columns,
+		int	begy,
+		int	begx)
+		{ return(*(WINDOW **)0); }
+
+#undef derwin
+WINDOW	*derwin(
+		WINDOW	*orig,
+		int	num_lines,
+		int	num_columns,
+		int	begy,
+		int	begx)
+		{ return(*(WINDOW **)0); }
+
+#undef subwin
+WINDOW	*subwin(
+		WINDOW	*w,
+		int	l,
+		int	c,
+		int	y,
+		int	x)
+		{ return(*(WINDOW **)0); }
+
+#undef _nc_makenew_sp
+WINDOW	*_nc_makenew_sp(
+		SCREEN	*sp,
+		int	num_lines,
+		int	num_columns,
+		int	begy,
+		int	begx,
+		int	flags)
+		{ return(*(WINDOW **)0); }
+
+#undef _nc_curscr_of
+WINDOW	*_nc_curscr_of(
+		SCREEN	*sp)
+		{ return(*(WINDOW **)0); }
+
+#undef _nc_newscr_of
+WINDOW	*_nc_newscr_of(
+		SCREEN	*sp)
+		{ return(*(WINDOW **)0); }
+
+#undef _nc_stdscr_of
+WINDOW	*_nc_stdscr_of(
+		SCREEN	*sp)
+		{ return(*(WINDOW **)0); }
+
+/* ./base/lib_nl.c */
+
+#undef nl_sp
+int	nl_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef nl
+int	nl(void)
+		{ return(*(int *)0); }
+
+#undef nonl_sp
+int	nonl_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef nonl
+int	nonl(void)
+		{ return(*(int *)0); }
+
+/* ./base/lib_overlay.c */
+
+#undef overlay
+int	overlay(
+		const WINDOW *win1,
+		WINDOW	*win2)
+		{ return(*(int *)0); }
+
+#undef overwrite
+int	overwrite(
+		const WINDOW *win1,
+		WINDOW	*win2)
+		{ return(*(int *)0); }
+
+#undef copywin
+int	copywin(
+		const WINDOW *src,
+		WINDOW	*dst,
+		int	sminrow,
+		int	smincol,
+		int	dminrow,
+		int	dmincol,
+		int	dmaxrow,
+		int	dmaxcol,
+		int	over)
+		{ return(*(int *)0); }
+
+/* ./base/lib_pad.c */
+
+#undef newpad_sp
+WINDOW	*newpad_sp(
+		SCREEN	*sp,
+		int	l,
+		int	c)
+		{ return(*(WINDOW **)0); }
+
+#undef newpad
+WINDOW	*newpad(
+		int	l,
+		int	c)
+		{ return(*(WINDOW **)0); }
+
+#undef subpad
+WINDOW	*subpad(
+		WINDOW	*orig,
+		int	l,
+		int	c,
+		int	begy,
+		int	begx)
+		{ return(*(WINDOW **)0); }
+
+#undef prefresh
+int	prefresh(
+		WINDOW	*win,
+		int	pminrow,
+		int	pmincol,
+		int	sminrow,
+		int	smincol,
+		int	smaxrow,
+		int	smaxcol)
+		{ return(*(int *)0); }
+
+#undef pnoutrefresh
+int	pnoutrefresh(
+		WINDOW	*win,
+		int	pminrow,
+		int	pmincol,
+		int	sminrow,
+		int	smincol,
+		int	smaxrow,
+		int	smaxcol)
+		{ return(*(int *)0); }
+
+#undef pechochar
+int	pechochar(
+		WINDOW	*pad,
+		const chtype ch)
+		{ return(*(int *)0); }
+
+/* ./base/lib_printw.c */
+
+#undef printw
+int	printw(
+		const char *fmt,
+		...)
+		{ return(*(int *)0); }
+
+#undef wprintw
+int	wprintw(
+		WINDOW	*win,
+		const char *fmt,
+		...)
+		{ return(*(int *)0); }
+
+#undef mvprintw
+int	mvprintw(
+		int	y,
+		int	x,
+		const char *fmt,
+		...)
+		{ return(*(int *)0); }
+
+#undef mvwprintw
+int	mvwprintw(
+		WINDOW	*win,
+		int	y,
+		int	x,
+		const char *fmt,
+		...)
+		{ return(*(int *)0); }
+
+#undef vwprintw
+int	vwprintw(
+		WINDOW	*win,
+		const char *fmt,
+		va_list	argp)
+		{ return(*(int *)0); }
+
+#undef vw_printw
+int	vw_printw(
+		WINDOW	*win,
+		const char *fmt,
+		va_list	argp)
+		{ return(*(int *)0); }
+
+/* ./base/lib_redrawln.c */
+
+#undef wredrawln
+int	wredrawln(
+		WINDOW	*win,
+		int	beg,
+		int	num)
+		{ return(*(int *)0); }
+
+/* ./base/lib_refresh.c */
+
+#undef wrefresh
+int	wrefresh(
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+#undef wnoutrefresh
+int	wnoutrefresh(
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+/* ./base/lib_restart.c */
+
+#undef restartterm_sp
+int	restartterm_sp(
+		SCREEN	*sp,
+		const char *termp,
+		int	filenum,
+		int	*errret)
+		{ return(*(int *)0); }
+
+#undef restartterm
+int	restartterm(
+		const char *termp,
+		int	filenum,
+		int	*errret)
+		{ return(*(int *)0); }
+
+/* ./base/lib_scanw.c */
+
+#undef vwscanw
+int	vwscanw(
+		WINDOW	*win,
+		const char *fmt,
+		va_list	argp)
+		{ return(*(int *)0); }
+
+#undef vw_scanw
+int	vw_scanw(
+		WINDOW	*win,
+		const char *fmt,
+		va_list	argp)
+		{ return(*(int *)0); }
+
+#undef scanw
+int	scanw(
+		const char *fmt,
+		...)
+		{ return(*(int *)0); }
+
+#undef wscanw
+int	wscanw(
+		WINDOW	*win,
+		const char *fmt,
+		...)
+		{ return(*(int *)0); }
+
+#undef mvscanw
+int	mvscanw(
+		int	y,
+		int	x,
+		const char *fmt,
+		...)
+		{ return(*(int *)0); }
+
+#undef mvwscanw
+int	mvwscanw(
+		WINDOW	*win,
+		int	y,
+		int	x,
+		const char *fmt,
+		...)
+		{ return(*(int *)0); }
+
+/* ./base/lib_screen.c */
+
+#undef getwin_sp
+WINDOW	*getwin_sp(
+		SCREEN	*sp,
+		FILE	*filep)
+		{ return(*(WINDOW **)0); }
+
+#undef getwin
+WINDOW	*getwin(
+		FILE	*filep)
+		{ return(*(WINDOW **)0); }
+
+#undef putwin
+int	putwin(
+		WINDOW	*win,
+		FILE	*filep)
+		{ return(*(int *)0); }
+
+#undef scr_restore_sp
+int	scr_restore_sp(
+		SCREEN	*sp,
+		const char *file)
+		{ return(*(int *)0); }
+
+#undef scr_restore
+int	scr_restore(
+		const char *file)
+		{ return(*(int *)0); }
+
+#undef scr_dump
+int	scr_dump(
+		const char *file)
+		{ return(*(int *)0); }
+
+#undef scr_init_sp
+int	scr_init_sp(
+		SCREEN	*sp,
+		const char *file)
+		{ return(*(int *)0); }
+
+#undef scr_init
+int	scr_init(
+		const char *file)
+		{ return(*(int *)0); }
+
+#undef scr_set_sp
+int	scr_set_sp(
+		SCREEN	*sp,
+		const char *file)
+		{ return(*(int *)0); }
+
+#undef scr_set
+int	scr_set(
+		const char *file)
+		{ return(*(int *)0); }
+
+/* ./base/lib_scroll.c */
+
+#undef _nc_scroll_window
+void	_nc_scroll_window(
+		WINDOW	*win,
+		int const n,
+		int const top,
+		int const bottom,
+		cchar_t	blank)
+		{ /* void */ }
+
+#undef wscrl
+int	wscrl(
+		WINDOW	*win,
+		int	n)
+		{ return(*(int *)0); }
+
+/* ./base/lib_scrollok.c */
+
+#undef scrollok
+int	scrollok(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+/* ./base/lib_scrreg.c */
+
+#undef wsetscrreg
+int	wsetscrreg(
+		WINDOW	*win,
+		int	top,
+		int	bottom)
+		{ return(*(int *)0); }
+
+/* ./base/lib_set_term.c */
+
+#undef set_term
+SCREEN	*set_term(
+		SCREEN	*screenp)
+		{ return(*(SCREEN **)0); }
+
+#undef delscreen
+void	delscreen(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_setupscreen_sp
+int	_nc_setupscreen_sp(
+		SCREEN	**spp,
+		int	slines,
+		int	scolumns,
+		FILE	*output,
+		int	filtered,
+		int	slk_format)
+		{ return(*(int *)0); }
+
+#undef _nc_setupscreen
+int	_nc_setupscreen(
+		int	slines,
+		int	scolumns,
+		FILE	*output,
+		int	filtered,
+		int	slk_format)
+		{ return(*(int *)0); }
+
+#undef _nc_ripoffline_sp
+int	_nc_ripoffline_sp(
+		SCREEN	*sp,
+		int	line,
+		int	(*init)(
+		WINDOW	*p1,
+		int	p2))
+		{ return(*(int *)0); }
+
+#undef _nc_ripoffline
+int	_nc_ripoffline(
+		int	line,
+		int	(*init)(
+		WINDOW	*p1,
+		int	p2))
+		{ return(*(int *)0); }
+
+#undef ripoffline_sp
+int	ripoffline_sp(
+		SCREEN	*sp,
+		int	line,
+		int	(*init)(
+		WINDOW	*p1,
+		int	p2))
+		{ return(*(int *)0); }
+
+#undef ripoffline
+int	ripoffline(
+		int	line,
+		int	(*init)(
+		WINDOW	*p1,
+		int	p2))
+		{ return(*(int *)0); }
+
+/* ./base/lib_slk.c */
+
+#undef _nc_format_slks
+int	_nc_format_slks(
+		SCREEN	*sp,
+		int	cols)
+		{ return(*(int *)0); }
+
+#undef _nc_slk_initialize
+int	_nc_slk_initialize(
+		WINDOW	*stwin,
+		int	cols)
+		{ return(*(int *)0); }
+
+#undef slk_restore_sp
+int	slk_restore_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef slk_restore
+int	slk_restore(void)
+		{ return(*(int *)0); }
+
+/* ./base/lib_slkatr_set.c */
+
+#undef slk_attr_set_sp
+int	slk_attr_set_sp(
+		SCREEN	*sp,
+		const attr_t attr,
+		short	pair_arg,
+		void	*opts)
+		{ return(*(int *)0); }
+
+#undef slk_attr_set
+int	slk_attr_set(
+		const attr_t attr,
+		short	pair_arg,
+		void	*opts)
+		{ return(*(int *)0); }
+
+/* ./base/lib_slkatrof.c */
+
+#undef slk_attroff_sp
+int	slk_attroff_sp(
+		SCREEN	*sp,
+		const chtype attr)
+		{ return(*(int *)0); }
+
+#undef slk_attroff
+int	slk_attroff(
+		const chtype attr)
+		{ return(*(int *)0); }
+
+/* ./base/lib_slkatron.c */
+
+#undef slk_attron_sp
+int	slk_attron_sp(
+		SCREEN	*sp,
+		const chtype attr)
+		{ return(*(int *)0); }
+
+#undef slk_attron
+int	slk_attron(
+		const chtype attr)
+		{ return(*(int *)0); }
+
+/* ./base/lib_slkatrset.c */
+
+#undef slk_attrset_sp
+int	slk_attrset_sp(
+		SCREEN	*sp,
+		const chtype attr)
+		{ return(*(int *)0); }
+
+#undef slk_attrset
+int	slk_attrset(
+		const chtype attr)
+		{ return(*(int *)0); }
+
+/* ./base/lib_slkattr.c */
+
+#undef slk_attr_sp
+attr_t	slk_attr_sp(
+		SCREEN	*sp)
+		{ return(*(attr_t *)0); }
+
+#undef slk_attr
+attr_t	slk_attr(void)
+		{ return(*(attr_t *)0); }
+
+/* ./base/lib_slkclear.c */
+
+#undef slk_clear_sp
+int	slk_clear_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef slk_clear
+int	slk_clear(void)
+		{ return(*(int *)0); }
+
+/* ./base/lib_slkcolor.c */
+
+#undef slk_color_sp
+int	slk_color_sp(
+		SCREEN	*sp,
+		short	pair_arg)
+		{ return(*(int *)0); }
+
+#undef slk_color
+int	slk_color(
+		short	pair_arg)
+		{ return(*(int *)0); }
+
+#undef extended_slk_color_sp
+int	extended_slk_color_sp(
+		SCREEN	*sp,
+		int	pair_arg)
+		{ return(*(int *)0); }
+
+#undef extended_slk_color
+int	extended_slk_color(
+		int	pair_arg)
+		{ return(*(int *)0); }
+
+/* ./base/lib_slkinit.c */
+
+#undef slk_init_sp
+int	slk_init_sp(
+		SCREEN	*sp,
+		int	format)
+		{ return(*(int *)0); }
+
+#undef slk_init
+int	slk_init(
+		int	format)
+		{ return(*(int *)0); }
+
+/* ./base/lib_slklab.c */
+
+#undef slk_label_sp
+char	*slk_label_sp(
+		SCREEN	*sp,
+		int	n)
+		{ return(*(char **)0); }
+
+#undef slk_label
+char	*slk_label(
+		int	n)
+		{ return(*(char **)0); }
+
+/* ./base/lib_slkrefr.c */
+
+#undef slk_noutrefresh_sp
+int	slk_noutrefresh_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef slk_noutrefresh
+int	slk_noutrefresh(void)
+		{ return(*(int *)0); }
+
+#undef slk_refresh_sp
+int	slk_refresh_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef slk_refresh
+int	slk_refresh(void)
+		{ return(*(int *)0); }
+
+/* ./base/lib_slkset.c */
+
+#undef slk_set_sp
+int	slk_set_sp(
+		SCREEN	*sp,
+		int	i,
+		const char *astr,
+		int	format)
+		{ return(*(int *)0); }
+
+#undef slk_set
+int	slk_set(
+		int	i,
+		const char *astr,
+		int	format)
+		{ return(*(int *)0); }
+
+/* ./base/lib_slktouch.c */
+
+#undef slk_touch_sp
+int	slk_touch_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef slk_touch
+int	slk_touch(void)
+		{ return(*(int *)0); }
+
+/* ./base/lib_touch.c */
+
+#undef is_linetouched
+NCURSES_BOOL is_linetouched(
+		WINDOW	*win,
+		int	line)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_wintouched
+NCURSES_BOOL is_wintouched(
+		WINDOW	*win)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef wtouchln
+int	wtouchln(
+		WINDOW	*win,
+		int	y,
+		int	n,
+		int	changed)
+		{ return(*(int *)0); }
+
+/* ./trace/lib_tracedmp.c */
+
+#undef _tracedump
+void	_tracedump(
+		const char *name,
+		WINDOW	*win)
+		{ /* void */ }
+
+/* ./trace/lib_tracemse.c */
+
+#undef _nc_trace_mmask_t
+char	*_nc_trace_mmask_t(
+		SCREEN	*sp,
+		mmask_t	code)
+		{ return(*(char **)0); }
+
+#undef _nc_tracemouse
+char	*_nc_tracemouse(
+		SCREEN	*sp,
+		MEVENT const *ep)
+		{ return(*(char **)0); }
+
+#undef _nc_retrace_mmask_t
+mmask_t	_nc_retrace_mmask_t(
+		SCREEN	*sp,
+		mmask_t	code)
+		{ return(*(mmask_t *)0); }
+
+#undef _tracemouse
+char	*_tracemouse(
+		MEVENT const *ep)
+		{ return(*(char **)0); }
+
+/* ./tty/lib_tstp.c */
+
+#undef _nc_signal_handler
+void	_nc_signal_handler(
+		int	enable)
+		{ /* void */ }
+
+/* ./base/lib_ungetch.c */
+
+#undef _nc_fifo_dump
+void	_nc_fifo_dump(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef ungetch_sp
+int	ungetch_sp(
+		SCREEN	*sp,
+		int	ch)
+		{ return(*(int *)0); }
+
+#undef ungetch
+int	ungetch(
+		int	ch)
+		{ return(*(int *)0); }
+
+/* ./tty/lib_vidattr.c */
+
+#undef vidputs_sp
+int	vidputs_sp(
+		SCREEN	*sp,
+		chtype	newmode,
+		NCURSES_OUTC_sp outc)
+		{ return(*(int *)0); }
+
+#undef vidputs
+int	vidputs(
+		chtype	newmode,
+		NCURSES_OUTC outc)
+		{ return(*(int *)0); }
+
+#undef vidattr_sp
+int	vidattr_sp(
+		SCREEN	*sp,
+		chtype	newmode)
+		{ return(*(int *)0); }
+
+#undef vidattr
+int	vidattr(
+		chtype	newmode)
+		{ return(*(int *)0); }
+
+#undef termattrs_sp
+chtype	termattrs_sp(
+		SCREEN	*sp)
+		{ return(*(chtype *)0); }
+
+#undef termattrs
+chtype	termattrs(void)
+		{ return(*(chtype *)0); }
+
+/* ./base/lib_vline.c */
+
+#undef wvline
+int	wvline(
+		WINDOW	*win,
+		chtype	ch,
+		int	n)
+		{ return(*(int *)0); }
+
+/* ./base/lib_wattroff.c */
+
+#undef wattr_off
+int	wattr_off(
+		WINDOW	*win,
+		attr_t	at,
+		void	*opts)
+		{ return(*(int *)0); }
+
+/* ./base/lib_wattron.c */
+
+#undef wattr_on
+int	wattr_on(
+		WINDOW	*win,
+		attr_t	at,
+		void	*opts)
+		{ return(*(int *)0); }
+
+/* ./base/lib_winch.c */
+
+#undef winch
+chtype	winch(
+		WINDOW	*win)
+		{ return(*(chtype *)0); }
+
+/* ./base/lib_window.c */
+
+#undef _nc_synchook
+void	_nc_synchook(
+		WINDOW	*win)
+		{ /* void */ }
+
+#undef mvderwin
+int	mvderwin(
+		WINDOW	*win,
+		int	y,
+		int	x)
+		{ return(*(int *)0); }
+
+#undef syncok
+int	syncok(
+		WINDOW	*win,
+		NCURSES_BOOL bf)
+		{ return(*(int *)0); }
+
+#undef wsyncup
+void	wsyncup(
+		WINDOW	*win)
+		{ /* void */ }
+
+#undef wsyncdown
+void	wsyncdown(
+		WINDOW	*win)
+		{ /* void */ }
+
+#undef wcursyncup
+void	wcursyncup(
+		WINDOW	*win)
+		{ /* void */ }
+
+#undef dupwin
+WINDOW	*dupwin(
+		WINDOW	*win)
+		{ return(*(WINDOW **)0); }
+
+/* ./base/nc_panel.c */
+
+#undef _nc_panelhook_sp
+struct panelhook *_nc_panelhook_sp(
+		SCREEN	*sp)
+		{ return(*(struct panelhook **)0); }
+
+#undef _nc_panelhook
+struct panelhook *_nc_panelhook(void)
+		{ return(*(struct panelhook **)0); }
+
+/* ./base/safe_sprintf.c */
+
+#undef _nc_printf_string_sp
+char	*_nc_printf_string_sp(
+		SCREEN	*sp,
+		const char *fmt,
+		va_list	ap)
+		{ return(*(char **)0); }
+
+#undef _nc_printf_string
+char	*_nc_printf_string(
+		const char *fmt,
+		va_list	ap)
+		{ return(*(char **)0); }
+
+/* ./tty/tty_update.c */
+
+#undef doupdate_sp
+int	doupdate_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef doupdate
+int	doupdate(void)
+		{ return(*(int *)0); }
+
+#undef _nc_scrolln_sp
+int	_nc_scrolln_sp(
+		SCREEN	*sp,
+		int	n,
+		int	top,
+		int	bot,
+		int	maxy)
+		{ return(*(int *)0); }
+
+#undef _nc_scrolln
+int	_nc_scrolln(
+		int	n,
+		int	top,
+		int	bot,
+		int	maxy)
+		{ return(*(int *)0); }
+
+#undef _nc_screen_resume_sp
+void	_nc_screen_resume_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_screen_resume
+void	_nc_screen_resume(void)
+		{ /* void */ }
+
+#undef _nc_screen_init_sp
+void	_nc_screen_init_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_screen_init
+void	_nc_screen_init(void)
+		{ /* void */ }
+
+#undef _nc_screen_wrap_sp
+void	_nc_screen_wrap_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_screen_wrap
+void	_nc_screen_wrap(void)
+		{ /* void */ }
+
+#undef _nc_do_xmc_glitch_sp
+void	_nc_do_xmc_glitch_sp(
+		SCREEN	*sp,
+		attr_t	previous)
+		{ /* void */ }
+
+#undef _nc_do_xmc_glitch
+void	_nc_do_xmc_glitch(
+		attr_t	previous)
+		{ /* void */ }
+
+/* ./trace/varargs.c */
+
+#undef _nc_varargs
+char	*_nc_varargs(
+		const char *fmt,
+		va_list	ap)
+		{ return(*(char **)0); }
+
+/* ./base/vsscanf.c */
+
+#undef _nc_vsscanf
+void	_nc_vsscanf(void)
+		{ /* void */ }
+
+/* ./base/lib_freeall.c */
+
+#undef _nc_freeall
+void	_nc_freeall(void)
+		{ /* void */ }
+
+#undef _nc_free_and_exit_sp
+void	_nc_free_and_exit_sp(
+		SCREEN	*sp,
+		int	code)
+		{ /* void */ }
+
+#undef _nc_free_and_exit
+void	_nc_free_and_exit(
+		int	code)
+		{ /* void */ }
+
+#undef exit_curses
+void	exit_curses(
+		int	code)
+		{ /* void */ }
+
+/* ./widechar/charable.c */
+
+#undef _nc_is_charable
+NCURSES_BOOL _nc_is_charable(
+		wchar_t	ch)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_to_char
+int	_nc_to_char(
+		wint_t	ch)
+		{ return(*(int *)0); }
+
+#undef _nc_to_widechar
+wint_t	_nc_to_widechar(
+		int	ch)
+		{ return(*(wint_t *)0); }
+
+/* ./widechar/lib_add_wch.c */
+
+#undef wadd_wch
+int	wadd_wch(
+		WINDOW	*win,
+		const cchar_t *wch)
+		{ return(*(int *)0); }
+
+#undef wecho_wchar
+int	wecho_wchar(
+		WINDOW	*win,
+		const cchar_t *wch)
+		{ return(*(int *)0); }
+
+/* ./widechar/lib_box_set.c */
+
+#undef wborder_set
+int	wborder_set(
+		WINDOW	*win,
+		const cchar_t *ls,
+		const cchar_t *rs,
+		const cchar_t *ts,
+		const cchar_t *bs,
+		const cchar_t *tl,
+		const cchar_t *tr,
+		const cchar_t *bl,
+		const cchar_t *br)
+		{ return(*(int *)0); }
+
+/* ./widechar/lib_cchar.c */
+
+#undef setcchar
+int	setcchar(
+		cchar_t	*wcval,
+		const wchar_t *wch,
+		const attr_t attrs,
+		short	pair_arg,
+		const void *opts)
+		{ return(*(int *)0); }
+
+#undef getcchar
+int	getcchar(
+		const cchar_t *wcval,
+		wchar_t	*wch,
+		attr_t	*attrs,
+		short	*pair_arg,
+		void	*opts)
+		{ return(*(int *)0); }
+
+/* ./widechar/lib_erasewchar.c */
+
+#undef erasewchar_sp
+int	erasewchar_sp(
+		SCREEN	*sp,
+		wchar_t	*wch)
+		{ return(*(int *)0); }
+
+#undef erasewchar
+int	erasewchar(
+		wchar_t	*wch)
+		{ return(*(int *)0); }
+
+#undef killwchar_sp
+int	killwchar_sp(
+		SCREEN	*sp,
+		wchar_t	*wch)
+		{ return(*(int *)0); }
+
+#undef killwchar
+int	killwchar(
+		wchar_t	*wch)
+		{ return(*(int *)0); }
+
+/* ./widechar/lib_get_wch.c */
+
+#undef wget_wch
+int	wget_wch(
+		WINDOW	*win,
+		wint_t	*result)
+		{ return(*(int *)0); }
+
+/* ./widechar/lib_get_wstr.c */
+
+#undef wgetn_wstr
+int	wgetn_wstr(
+		WINDOW	*win,
+		wint_t	*str,
+		int	maxlen)
+		{ return(*(int *)0); }
+
+/* ./widechar/lib_hline_set.c */
+
+#undef whline_set
+int	whline_set(
+		WINDOW	*win,
+		const cchar_t *ch,
+		int	n)
+		{ return(*(int *)0); }
+
+/* ./widechar/lib_in_wch.c */
+
+#undef win_wch
+int	win_wch(
+		WINDOW	*win,
+		cchar_t	*wcval)
+		{ return(*(int *)0); }
+
+/* ./widechar/lib_in_wchnstr.c */
+
+#undef win_wchnstr
+int	win_wchnstr(
+		WINDOW	*win,
+		cchar_t	*wchstr,
+		int	n)
+		{ return(*(int *)0); }
+
+/* ./widechar/lib_ins_wch.c */
+
+#undef _nc_insert_wch
+int	_nc_insert_wch(
+		WINDOW	*win,
+		const cchar_t *wch)
+		{ return(*(int *)0); }
+
+#undef wins_wch
+int	wins_wch(
+		WINDOW	*win,
+		const cchar_t *wch)
+		{ return(*(int *)0); }
+
+#undef wins_nwstr
+int	wins_nwstr(
+		WINDOW	*win,
+		const wchar_t *wstr,
+		int	n)
+		{ return(*(int *)0); }
+
+/* ./widechar/lib_inwstr.c */
+
+#undef winnwstr
+int	winnwstr(
+		WINDOW	*win,
+		wchar_t	*wstr,
+		int	n)
+		{ return(*(int *)0); }
+
+#undef winwstr
+int	winwstr(
+		WINDOW	*win,
+		wchar_t	*wstr)
+		{ return(*(int *)0); }
+
+/* ./widechar/lib_key_name.c */
+
+#undef key_name
+const char *key_name(
+		wchar_t	c)
+		{ return(*(const char **)0); }
+
+/* ./widechar/lib_pecho_wchar.c */
+
+#undef pecho_wchar
+int	pecho_wchar(
+		WINDOW	*pad,
+		const cchar_t *wch)
+		{ return(*(int *)0); }
+
+/* ./widechar/lib_slk_wset.c */
+
+#undef slk_wset
+int	slk_wset(
+		int	i,
+		const wchar_t *astr,
+		int	format)
+		{ return(*(int *)0); }
+
+/* ./widechar/lib_unget_wch.c */
+
+#undef _nc_wcrtomb
+size_t	_nc_wcrtomb(
+		char	*target,
+		wchar_t	source,
+		mbstate_t *state)
+		{ return(*(size_t *)0); }
+
+#undef unget_wch_sp
+int	unget_wch_sp(
+		SCREEN	*sp,
+		const wchar_t wch)
+		{ return(*(int *)0); }
+
+#undef unget_wch
+int	unget_wch(
+		const wchar_t wch)
+		{ return(*(int *)0); }
+
+/* ./widechar/lib_vid_attr.c */
+
+#undef vid_puts_sp
+int	vid_puts_sp(
+		SCREEN	*sp,
+		attr_t	newmode,
+		short	pair_arg,
+		void	*opts,
+		NCURSES_OUTC_sp outc)
+		{ return(*(int *)0); }
+
+#undef vid_puts
+int	vid_puts(
+		attr_t	newmode,
+		short	pair_arg,
+		void	*opts,
+		NCURSES_OUTC outc)
+		{ return(*(int *)0); }
+
+#undef vid_attr_sp
+int	vid_attr_sp(
+		SCREEN	*sp,
+		attr_t	newmode,
+		short	pair_arg,
+		void	*opts)
+		{ return(*(int *)0); }
+
+#undef vid_attr
+int	vid_attr(
+		attr_t	newmode,
+		short	pair_arg,
+		void	*opts)
+		{ return(*(int *)0); }
+
+#undef term_attrs_sp
+attr_t	term_attrs_sp(
+		SCREEN	*sp)
+		{ return(*(attr_t *)0); }
+
+#undef term_attrs
+attr_t	term_attrs(void)
+		{ return(*(attr_t *)0); }
+
+/* ./widechar/lib_vline_set.c */
+
+#undef wvline_set
+int	wvline_set(
+		WINDOW	*win,
+		const cchar_t *ch,
+		int	n)
+		{ return(*(int *)0); }
+
+/* ./widechar/lib_wacs.c */
+
+#undef _nc_wacs
+cchar_t	*_nc_wacs;
+
+#undef _nc_init_wacs
+void	_nc_init_wacs(void)
+		{ /* void */ }
+
+/* ./widechar/lib_wunctrl.c */
+
+#undef wunctrl_sp
+wchar_t	*wunctrl_sp(
+		SCREEN	*sp,
+		cchar_t	*wc)
+		{ return(*(wchar_t **)0); }
+
+#undef wunctrl
+wchar_t	*wunctrl(
+		cchar_t	*wc)
+		{ return(*(wchar_t **)0); }
+
+/* ./expanded.c */
+
+#undef _nc_toggle_attr_on
+void	_nc_toggle_attr_on(
+		attr_t	*S,
+		attr_t	at)
+		{ /* void */ }
+
+#undef _nc_toggle_attr_off
+void	_nc_toggle_attr_off(
+		attr_t	*S,
+		attr_t	at)
+		{ /* void */ }
+
+#undef _nc_DelCharCost_sp
+int	_nc_DelCharCost_sp(
+		SCREEN	*sp,
+		int	count)
+		{ return(*(int *)0); }
+
+#undef _nc_InsCharCost_sp
+int	_nc_InsCharCost_sp(
+		SCREEN	*sp,
+		int	count)
+		{ return(*(int *)0); }
+
+#undef _nc_UpdateAttrs_sp
+void	_nc_UpdateAttrs_sp(
+		SCREEN	*sp,
+		const cchar_t *c)
+		{ /* void */ }
+
+#undef _nc_DelCharCost
+int	_nc_DelCharCost(
+		int	count)
+		{ return(*(int *)0); }
+
+#undef _nc_InsCharCost
+int	_nc_InsCharCost(
+		int	count)
+		{ return(*(int *)0); }
+
+#undef _nc_UpdateAttrs
+void	_nc_UpdateAttrs(
+		const cchar_t *c)
+		{ /* void */ }
+
+/* ./base/legacy_coding.c */
+
+#undef use_legacy_coding_sp
+int	use_legacy_coding_sp(
+		SCREEN	*sp,
+		int	level)
+		{ return(*(int *)0); }
+
+#undef use_legacy_coding
+int	use_legacy_coding(
+		int	level)
+		{ return(*(int *)0); }
+
+/* ./base/lib_dft_fgbg.c */
+
+#undef use_default_colors_sp
+int	use_default_colors_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef use_default_colors
+int	use_default_colors(void)
+		{ return(*(int *)0); }
+
+#undef assume_default_colors_sp
+int	assume_default_colors_sp(
+		SCREEN	*sp,
+		int	fg,
+		int	bg)
+		{ return(*(int *)0); }
+
+#undef assume_default_colors
+int	assume_default_colors(
+		int	fg,
+		int	bg)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_print.c */
+
+#undef mcprint_sp
+int	mcprint_sp(
+		SCREEN	*sp,
+		char	*data,
+		int	len)
+		{ return(*(int *)0); }
+
+#undef mcprint
+int	mcprint(
+		char	*data,
+		int	len)
+		{ return(*(int *)0); }
+
+/* ./base/new_pair.c */
+
+#undef _nc_free_ordered_pairs
+void	_nc_free_ordered_pairs(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_reset_color_pair
+void	_nc_reset_color_pair(
+		SCREEN	*sp,
+		int	pair,
+		colorpair_t *next)
+		{ /* void */ }
+
+#undef _nc_set_color_pair
+void	_nc_set_color_pair(
+		SCREEN	*sp,
+		int	pair,
+		int	mode)
+		{ /* void */ }
+
+#undef _nc_copy_pairs
+void	_nc_copy_pairs(
+		SCREEN	*sp,
+		colorpair_t *target,
+		colorpair_t *source,
+		int	length)
+		{ /* void */ }
+
+#undef alloc_pair_sp
+int	alloc_pair_sp(
+		SCREEN	*sp,
+		int	fg,
+		int	bg)
+		{ return(*(int *)0); }
+
+#undef find_pair_sp
+int	find_pair_sp(
+		SCREEN	*sp,
+		int	fg,
+		int	bg)
+		{ return(*(int *)0); }
+
+#undef free_pair_sp
+int	free_pair_sp(
+		SCREEN	*sp,
+		int	pair)
+		{ return(*(int *)0); }
+
+#undef alloc_pair
+int	alloc_pair(
+		int	f,
+		int	b)
+		{ return(*(int *)0); }
+
+#undef find_pair
+int	find_pair(
+		int	f,
+		int	b)
+		{ return(*(int *)0); }
+
+#undef free_pair
+int	free_pair(
+		int	pair)
+		{ return(*(int *)0); }
+
+/* ./base/resizeterm.c */
+
+#undef is_term_resized_sp
+NCURSES_BOOL is_term_resized_sp(
+		SCREEN	*sp,
+		int	ToLines,
+		int	ToCols)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_term_resized
+NCURSES_BOOL is_term_resized(
+		int	ToLines,
+		int	ToCols)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef resize_term_sp
+int	resize_term_sp(
+		SCREEN	*sp,
+		int	ToLines,
+		int	ToCols)
+		{ return(*(int *)0); }
+
+#undef resize_term
+int	resize_term(
+		int	ToLines,
+		int	ToCols)
+		{ return(*(int *)0); }
+
+#undef resizeterm_sp
+int	resizeterm_sp(
+		SCREEN	*sp,
+		int	ToLines,
+		int	ToCols)
+		{ return(*(int *)0); }
+
+#undef resizeterm
+int	resizeterm(
+		int	ToLines,
+		int	ToCols)
+		{ return(*(int *)0); }
+
+/* ./trace/trace_xnames.c */
+
+#undef _nc_trace_xnames
+void	_nc_trace_xnames(
+		TERMTYPE *tp)
+		{ /* void */ }
+
+/* ./tinfo/use_screen.c */
+
+#undef use_screen
+int	use_screen(
+		SCREEN	*screen,
+		NCURSES_SCREEN_CB func,
+		void	*data)
+		{ return(*(int *)0); }
+
+/* ./base/use_window.c */
+
+#undef use_window
+int	use_window(
+		WINDOW	*win,
+		NCURSES_WINDOW_CB func,
+		void	*data)
+		{ return(*(int *)0); }
+
+/* ./base/wresize.c */
+
+#undef wresize
+int	wresize(
+		WINDOW	*win,
+		int	ToLines,
+		int	ToCols)
+		{ return(*(int *)0); }
+
+/* ./tinfo/access.c */
+
+#undef _nc_rootname
+char	*_nc_rootname(
+		char	*path)
+		{ return(*(char **)0); }
+
+#undef _nc_is_abs_path
+NCURSES_BOOL _nc_is_abs_path(
+		const char *path)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_pathlast
+unsigned _nc_pathlast(
+		const char *path)
+		{ return(*(unsigned *)0); }
+
+#undef _nc_basename
+char	*_nc_basename(
+		char	*path)
+		{ return(*(char **)0); }
+
+#undef _nc_access
+int	_nc_access(
+		const char *path,
+		int	mode)
+		{ return(*(int *)0); }
+
+#undef _nc_is_dir_path
+NCURSES_BOOL _nc_is_dir_path(
+		const char *path)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_is_file_path
+NCURSES_BOOL _nc_is_file_path(
+		const char *path)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_env_access
+int	_nc_env_access(void)
+		{ return(*(int *)0); }
+
+#undef _nc_safe_fopen
+FILE	*_nc_safe_fopen(
+		const char *path,
+		const char *mode)
+		{ return(*(FILE **)0); }
+
+#undef _nc_safe_open3
+int	_nc_safe_open3(
+		const char *path,
+		int	flags,
+		mode_t	mode)
+		{ return(*(int *)0); }
+
+/* ./tinfo/add_tries.c */
+
+#undef _nc_add_to_try
+int	_nc_add_to_try(
+		TRIES	**tree,
+		const char *str,
+		unsigned code)
+		{ return(*(int *)0); }
+
+/* ./tinfo/alloc_ttype.c */
+
+#undef _nc_align_termtype
+void	_nc_align_termtype(
+		TERMTYPE2 *to,
+		TERMTYPE2 *from)
+		{ /* void */ }
+
+#undef _nc_copy_termtype
+void	_nc_copy_termtype(
+		TERMTYPE *dst,
+		const TERMTYPE *src)
+		{ /* void */ }
+
+#undef _nc_copy_termtype2
+void	_nc_copy_termtype2(
+		TERMTYPE2 *dst,
+		const TERMTYPE2 *src)
+		{ /* void */ }
+
+#undef _nc_export_termtype2
+void	_nc_export_termtype2(
+		TERMTYPE *dst,
+		const TERMTYPE2 *src)
+		{ /* void */ }
+
+/* ./codes.c */
+
+#undef _nc_boolcodes
+const char *const *_nc_boolcodes(void)
+		{ return(*(const char **)0); }
+
+#undef _nc_numcodes
+const char *const *_nc_numcodes(void)
+		{ return(*(const char **)0); }
+
+#undef _nc_strcodes
+const char *const *_nc_strcodes(void)
+		{ return(*(const char **)0); }
+
+/* ./comp_captab.c */
+
+#undef _nc_get_table
+const struct name_table_entry *_nc_get_table(
+		NCURSES_BOOL termcap)
+		{ return(*(const struct name_table_entry **)0); }
+
+#undef _nc_get_hash_table
+const HashValue *_nc_get_hash_table(
+		NCURSES_BOOL termcap)
+		{ return(*(const HashValue **)0); }
+
+#undef _nc_get_alias_table
+const struct alias *_nc_get_alias_table(
+		NCURSES_BOOL termcap)
+		{ return(*(const struct alias **)0); }
+
+#undef _nc_get_hash_info
+const HashData *_nc_get_hash_info(
+		NCURSES_BOOL termcap)
+		{ return(*(const HashData **)0); }
+
+/* ./tinfo/comp_error.c */
+
+#undef _nc_suppress_warnings
+NCURSES_BOOL _nc_suppress_warnings;
+#undef _nc_curr_line
+int	_nc_curr_line;
+#undef _nc_curr_col
+int	_nc_curr_col;
+
+#undef _nc_get_source
+const char *_nc_get_source(void)
+		{ return(*(const char **)0); }
+
+#undef _nc_set_source
+void	_nc_set_source(
+		const char *const name)
+		{ /* void */ }
+
+#undef _nc_set_type
+void	_nc_set_type(
+		const char *const name)
+		{ /* void */ }
+
+#undef _nc_get_type
+void	_nc_get_type(
+		char	*name)
+		{ /* void */ }
+
+#undef _nc_warning
+void	_nc_warning(
+		const char *const fmt,
+		...)
+		{ /* void */ }
+
+#undef _nc_err_abort
+void	_nc_err_abort(
+		const char *const fmt,
+		...)
+		{ /* void */ }
+
+#undef _nc_syserr_abort
+void	_nc_syserr_abort(
+		const char *const fmt,
+		...)
+		{ /* void */ }
+
+/* ./tinfo/comp_hash.c */
+
+#undef _nc_find_entry
+struct name_table_entry const *_nc_find_entry(
+		const char *string,
+		const HashValue *hash_table)
+		{ return(*(struct name_table_entry const **)0); }
+
+#undef _nc_find_type_entry
+struct name_table_entry const *_nc_find_type_entry(
+		const char *string,
+		int	type,
+		NCURSES_BOOL termcap)
+		{ return(*(struct name_table_entry const **)0); }
+
+#undef _nc_find_user_entry
+struct user_table_entry const *_nc_find_user_entry(
+		const char *string)
+		{ return(*(struct user_table_entry const **)0); }
+
+/* ./comp_userdefs.c */
+
+#undef _nc_get_userdefs_table
+const struct user_table_entry *_nc_get_userdefs_table(void)
+		{ return(*(const struct user_table_entry **)0); }
+
+#undef _nc_get_hash_user
+const HashData *_nc_get_hash_user(void)
+		{ return(*(const HashData **)0); }
+
+/* ./tinfo/db_iterator.c */
+
+#undef _nc_tic_dir
+const char *_nc_tic_dir(
+		const char *path)
+		{ return(*(const char **)0); }
+
+#undef _nc_keep_tic_dir
+void	_nc_keep_tic_dir(
+		const char *path)
+		{ /* void */ }
+
+#undef _nc_last_db
+void	_nc_last_db(void)
+		{ /* void */ }
+
+#undef _nc_next_db
+const char *_nc_next_db(
+		DBDIRS	*state,
+		int	*offset)
+		{ return(*(const char **)0); }
+
+#undef _nc_first_db
+void	_nc_first_db(
+		DBDIRS	*state,
+		int	*offset)
+		{ /* void */ }
+
+/* ./tinfo/doalloc.c */
+
+#undef _nc_doalloc
+void	*_nc_doalloc(
+		void	*oldp,
+		size_t	amount)
+		{ return(*(void **)0); }
+
+/* ./tinfo/entries.c */
+
+#undef _nc_head
+ENTRY	*_nc_head;
+#undef _nc_tail
+ENTRY	*_nc_tail;
+
+#undef _nc_free_entry
+void	_nc_free_entry(
+		ENTRY	*headp,
+		TERMTYPE2 *tterm)
+		{ /* void */ }
+
+#undef _nc_free_entries
+void	_nc_free_entries(
+		ENTRY	*headp)
+		{ /* void */ }
+
+#undef _nc_leaks_tinfo
+void	_nc_leaks_tinfo(void)
+		{ /* void */ }
+
+#undef exit_terminfo
+void	exit_terminfo(
+		int	code)
+		{ /* void */ }
+
+/* ./fallback.c */
+
+#undef _nc_fallback2
+const TERMTYPE2 *_nc_fallback2(
+		const char *name)
+		{ return(*(const TERMTYPE2 **)0); }
+
+#undef _nc_fallback
+const TERMTYPE *_nc_fallback(
+		const char *name)
+		{ return(*(const TERMTYPE **)0); }
+
+/* ./tinfo/free_ttype.c */
+
+#undef _nc_free_termtype
+void	_nc_free_termtype(
+		TERMTYPE *ptr)
+		{ /* void */ }
+
+#undef _nc_free_termtype1
+void	_nc_free_termtype1(
+		TERMTYPE *ptr)
+		{ /* void */ }
+
+#undef _nc_free_termtype2
+void	_nc_free_termtype2(
+		TERMTYPE2 *ptr)
+		{ /* void */ }
+
+#undef _nc_user_definable
+NCURSES_BOOL _nc_user_definable;
+
+#undef use_extended_names
+int	use_extended_names(
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+/* ./tinfo/getenv_num.c */
+
+#undef _nc_getenv_num
+int	_nc_getenv_num(
+		const char *name)
+		{ return(*(int *)0); }
+
+#undef _nc_setenv_num
+void	_nc_setenv_num(
+		const char *name,
+		int	value)
+		{ /* void */ }
+
+/* ./tinfo/home_terminfo.c */
+
+#undef _nc_home_terminfo
+char	*_nc_home_terminfo(void)
+		{ return(*(char **)0); }
+
+/* ./tinfo/init_keytry.c */
+
+#undef _nc_init_keytry
+void	_nc_init_keytry(
+		SCREEN	*sp)
+		{ /* void */ }
+
+/* ./tinfo/lib_acs.c */
+
+#undef _nc_acs_map
+chtype	*_nc_acs_map(void)
+		{ return(*(chtype **)0); }
+
+#undef _nc_init_acs_sp
+void	_nc_init_acs_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_init_acs
+void	_nc_init_acs(void)
+		{ /* void */ }
+
+/* ./tinfo/lib_baudrate.c */
+
+struct speed {
+    int given_speed;
+    int actual_speed;
+};
+
+#undef _nc_baudrate
+int	_nc_baudrate(
+		int	OSpeed)
+		{ return(*(int *)0); }
+
+#undef _nc_ospeed
+int	_nc_ospeed(
+		int	BaudRate)
+		{ return(*(int *)0); }
+
+#undef baudrate_sp
+int	baudrate_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef baudrate
+int	baudrate(void)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_cur_term.c */
+
+#undef _nc_get_cur_term_sp
+TERMINAL *_nc_get_cur_term_sp(
+		SCREEN	*sp)
+		{ return(*(TERMINAL **)0); }
+
+#undef _nc_get_cur_term
+TERMINAL *_nc_get_cur_term(void)
+		{ return(*(TERMINAL **)0); }
+
+#undef _nc_cur_term
+TERMINAL *_nc_cur_term(void)
+		{ return(*(TERMINAL **)0); }
+
+#undef set_curterm_sp
+TERMINAL *set_curterm_sp(
+		SCREEN	*sp,
+		TERMINAL *termp)
+		{ return(*(TERMINAL **)0); }
+
+#undef set_curterm
+TERMINAL *set_curterm(
+		TERMINAL *termp)
+		{ return(*(TERMINAL **)0); }
+
+#undef del_curterm_sp
+int	del_curterm_sp(
+		SCREEN	*sp,
+		TERMINAL *termp)
+		{ return(*(int *)0); }
+
+#undef del_curterm
+int	del_curterm(
+		TERMINAL *termp)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_data.c */
+
+#undef _nc_stdscr
+WINDOW	*_nc_stdscr(void)
+		{ return(*(WINDOW **)0); }
+
+#undef _nc_curscr
+WINDOW	*_nc_curscr(void)
+		{ return(*(WINDOW **)0); }
+
+#undef _nc_newscr
+WINDOW	*_nc_newscr(void)
+		{ return(*(WINDOW **)0); }
+
+#undef _nc_screen_chain
+SCREEN	*_nc_screen_chain;
+#undef SP
+SCREEN	*SP;
+#undef _nc_globals
+NCURSES_GLOBALS _nc_globals;
+#undef _nc_prescreen
+NCURSES_PRESCREEN _nc_prescreen;
+
+#undef _nc_screen_of
+SCREEN	*_nc_screen_of(
+		WINDOW	*win)
+		{ return(*(SCREEN **)0); }
+
+#undef _nc_init_pthreads
+void	_nc_init_pthreads(void)
+		{ /* void */ }
+
+#undef _nc_mutex_init
+void	_nc_mutex_init(
+		pthread_mutex_t *obj)
+		{ /* void */ }
+
+#undef _nc_mutex_lock
+int	_nc_mutex_lock(
+		pthread_mutex_t *obj)
+		{ return(*(int *)0); }
+
+#undef _nc_mutex_trylock
+int	_nc_mutex_trylock(
+		pthread_mutex_t *obj)
+		{ return(*(int *)0); }
+
+#undef _nc_mutex_unlock
+int	_nc_mutex_unlock(
+		pthread_mutex_t *obj)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_has_cap.c */
+
+#undef has_ic_sp
+NCURSES_BOOL has_ic_sp(
+		SCREEN	*sp)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef has_ic
+NCURSES_BOOL has_ic(void)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef has_il_sp
+NCURSES_BOOL has_il_sp(
+		SCREEN	*sp)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef has_il
+NCURSES_BOOL has_il(void)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./tinfo/lib_kernel.c */
+
+#undef erasechar_sp
+char	erasechar_sp(
+		SCREEN	*sp)
+		{ return(*(char *)0); }
+
+#undef erasechar
+char	erasechar(void)
+		{ return(*(char *)0); }
+
+#undef killchar_sp
+char	killchar_sp(
+		SCREEN	*sp)
+		{ return(*(char *)0); }
+
+#undef killchar
+char	killchar(void)
+		{ return(*(char *)0); }
+
+#undef flushinp_sp
+int	flushinp_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef flushinp
+int	flushinp(void)
+		{ return(*(int *)0); }
+
+/* ./lib_keyname.c */
+
+struct kn { short offset; int code; };
+
+#undef keyname_sp
+const char *keyname_sp(
+		SCREEN	*sp,
+		int	c)
+		{ return(*(const char **)0); }
+
+#undef keyname
+const char *keyname(
+		int	c)
+		{ return(*(const char **)0); }
+
+/* ./tinfo/lib_longname.c */
+
+#undef longname_sp
+char	*longname_sp(
+		SCREEN	*sp)
+		{ return(*(char **)0); }
+
+#undef longname
+char	*longname(void)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_napms.c */
+
+#undef napms_sp
+int	napms_sp(
+		SCREEN	*sp,
+		int	ms)
+		{ return(*(int *)0); }
+
+#undef napms
+int	napms(
+		int	ms)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_options.c */
+
+#undef idlok
+int	idlok(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef idcok
+void	idcok(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ /* void */ }
+
+#undef halfdelay_sp
+int	halfdelay_sp(
+		SCREEN	*sp,
+		int	t)
+		{ return(*(int *)0); }
+
+#undef halfdelay
+int	halfdelay(
+		int	t)
+		{ return(*(int *)0); }
+
+#undef nodelay
+int	nodelay(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef notimeout
+int	notimeout(
+		WINDOW	*win,
+		NCURSES_BOOL f)
+		{ return(*(int *)0); }
+
+#undef wtimeout
+void	wtimeout(
+		WINDOW	*win,
+		int	delay)
+		{ /* void */ }
+
+#undef keypad
+int	keypad(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef meta
+int	meta(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef curs_set_sp
+int	curs_set_sp(
+		SCREEN	*sp,
+		int	vis)
+		{ return(*(int *)0); }
+
+#undef curs_set
+int	curs_set(
+		int	vis)
+		{ return(*(int *)0); }
+
+#undef typeahead_sp
+int	typeahead_sp(
+		SCREEN	*sp,
+		int	fd)
+		{ return(*(int *)0); }
+
+#undef typeahead
+int	typeahead(
+		int	fd)
+		{ return(*(int *)0); }
+
+#undef has_key_sp
+int	has_key_sp(
+		SCREEN	*sp,
+		int	keycode)
+		{ return(*(int *)0); }
+
+#undef has_key
+int	has_key(
+		int	keycode)
+		{ return(*(int *)0); }
+
+#undef _nc_putp_flush_sp
+int	_nc_putp_flush_sp(
+		SCREEN	*sp,
+		const char *name,
+		const char *value)
+		{ return(*(int *)0); }
+
+#undef _nc_keypad
+int	_nc_keypad(
+		SCREEN	*sp,
+		int	flag)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_raw.c */
+
+#undef raw_sp
+int	raw_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef raw
+int	raw(void)
+		{ return(*(int *)0); }
+
+#undef cbreak_sp
+int	cbreak_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef cbreak
+int	cbreak(void)
+		{ return(*(int *)0); }
+
+#undef qiflush_sp
+void	qiflush_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef qiflush
+void	qiflush(void)
+		{ /* void */ }
+
+#undef noraw_sp
+int	noraw_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef noraw
+int	noraw(void)
+		{ return(*(int *)0); }
+
+#undef nocbreak_sp
+int	nocbreak_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef nocbreak
+int	nocbreak(void)
+		{ return(*(int *)0); }
+
+#undef noqiflush_sp
+void	noqiflush_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef noqiflush
+void	noqiflush(void)
+		{ /* void */ }
+
+#undef intrflush_sp
+int	intrflush_sp(
+		SCREEN	*sp,
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef intrflush
+int	intrflush(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_setup.c */
+
+#undef _nc_ttytype
+char	*_nc_ttytype(void)
+		{ return(*(char **)0); }
+
+#undef _nc_ptr_Lines
+int	*_nc_ptr_Lines(
+		SCREEN	*sp)
+		{ return(*(int **)0); }
+
+#undef _nc_LINES
+int	_nc_LINES(void)
+		{ return(*(int *)0); }
+
+#undef _nc_ptr_Cols
+int	*_nc_ptr_Cols(
+		SCREEN	*sp)
+		{ return(*(int **)0); }
+
+#undef _nc_COLS
+int	_nc_COLS(void)
+		{ return(*(int *)0); }
+
+#undef _nc_ptr_Tabsize
+int	*_nc_ptr_Tabsize(
+		SCREEN	*sp)
+		{ return(*(int **)0); }
+
+#undef _nc_TABSIZE
+int	_nc_TABSIZE(void)
+		{ return(*(int *)0); }
+
+#undef set_tabsize_sp
+int	set_tabsize_sp(
+		SCREEN	*sp,
+		int	value)
+		{ return(*(int *)0); }
+
+#undef set_tabsize
+int	set_tabsize(
+		int	value)
+		{ return(*(int *)0); }
+
+#undef _nc_handle_sigwinch
+int	_nc_handle_sigwinch(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef use_env_sp
+void	use_env_sp(
+		SCREEN	*sp,
+		NCURSES_BOOL f)
+		{ /* void */ }
+
+#undef use_tioctl_sp
+void	use_tioctl_sp(
+		SCREEN	*sp,
+		NCURSES_BOOL f)
+		{ /* void */ }
+
+#undef use_env
+void	use_env(
+		NCURSES_BOOL f)
+		{ /* void */ }
+
+#undef use_tioctl
+void	use_tioctl(
+		NCURSES_BOOL f)
+		{ /* void */ }
+
+#undef _nc_get_screensize
+void	_nc_get_screensize(
+		SCREEN	*sp,
+		int	*linep,
+		int	*colp)
+		{ /* void */ }
+
+#undef _nc_update_screensize
+void	_nc_update_screensize(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_setup_tinfo
+int	_nc_setup_tinfo(
+		const char *const tn,
+		TERMTYPE2 *const tp)
+		{ return(*(int *)0); }
+
+#undef _nc_tinfo_cmdch
+void	_nc_tinfo_cmdch(
+		TERMINAL *termp,
+		int	proto)
+		{ /* void */ }
+
+#undef _nc_get_locale
+char	*_nc_get_locale(void)
+		{ return(*(char **)0); }
+
+#undef _nc_unicode_locale
+int	_nc_unicode_locale(void)
+		{ return(*(int *)0); }
+
+#undef _nc_locale_breaks_acs
+int	_nc_locale_breaks_acs(
+		TERMINAL *termp)
+		{ return(*(int *)0); }
+
+#undef _nc_setupterm
+int	_nc_setupterm(
+		const char *tname,
+		int	Filedes,
+		int	*errret,
+		int	reuse)
+		{ return(*(int *)0); }
+
+#undef _nc_find_prescr
+SCREEN	*_nc_find_prescr(void)
+		{ return(*(SCREEN **)0); }
+
+#undef _nc_forget_prescr
+void	_nc_forget_prescr(void)
+		{ /* void */ }
+
+#undef new_prescr
+SCREEN	*new_prescr(void)
+		{ return(*(SCREEN **)0); }
+
+#undef setupterm
+int	setupterm(
+		const char *tname,
+		int	Filedes,
+		int	*errret)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_termcap.c */
+
+#undef UP
+char	*UP;
+#undef BC
+char	*BC;
+
+#undef tgetent_sp
+int	tgetent_sp(
+		SCREEN	*sp,
+		char	*bufp,
+		const char *name)
+		{ return(*(int *)0); }
+
+#undef tgetent
+int	tgetent(
+		char	*bufp,
+		const char *name)
+		{ return(*(int *)0); }
+
+#undef tgetflag_sp
+int	tgetflag_sp(
+		SCREEN	*sp,
+		const char *id)
+		{ return(*(int *)0); }
+
+#undef tgetflag
+int	tgetflag(
+		const char *id)
+		{ return(*(int *)0); }
+
+#undef tgetnum_sp
+int	tgetnum_sp(
+		SCREEN	*sp,
+		const char *id)
+		{ return(*(int *)0); }
+
+#undef tgetnum
+int	tgetnum(
+		const char *id)
+		{ return(*(int *)0); }
+
+#undef tgetstr_sp
+char	*tgetstr_sp(
+		SCREEN	*sp,
+		const char *id,
+		char	**area)
+		{ return(*(char **)0); }
+
+#undef tgetstr
+char	*tgetstr(
+		const char *id,
+		char	**area)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_termname.c */
+
+#undef termname_sp
+char	*termname_sp(
+		SCREEN	*sp)
+		{ return(*(char **)0); }
+
+#undef termname
+char	*termname(void)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_tgoto.c */
+
+#undef tgoto
+char	*tgoto(
+		const char *string,
+		int	x,
+		int	y)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_ti.c */
+
+#undef tigetflag_sp
+int	tigetflag_sp(
+		SCREEN	*sp,
+		const char *str)
+		{ return(*(int *)0); }
+
+#undef tigetflag
+int	tigetflag(
+		const char *str)
+		{ return(*(int *)0); }
+
+#undef tigetnum_sp
+int	tigetnum_sp(
+		SCREEN	*sp,
+		const char *str)
+		{ return(*(int *)0); }
+
+#undef tigetnum
+int	tigetnum(
+		const char *str)
+		{ return(*(int *)0); }
+
+#undef tigetstr_sp
+char	*tigetstr_sp(
+		SCREEN	*sp,
+		const char *str)
+		{ return(*(char **)0); }
+
+#undef tigetstr
+char	*tigetstr(
+		const char *str)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_tparm.c */
+
+#undef _nc_tparm_err
+int	_nc_tparm_err;
+
+#undef _nc_free_tparm
+void	_nc_free_tparm(
+		TERMINAL *termp)
+		{ /* void */ }
+
+#undef _nc_tparm_analyze
+int	_nc_tparm_analyze(
+		TERMINAL *term,
+		const char *string,
+		char	**p_is_s,
+		int	*_nc_popcount)
+		{ return(*(int *)0); }
+
+#undef tparm
+char	*tparm(
+		const char *string,
+		...)
+		{ return(*(char **)0); }
+
+#undef tiparm
+char	*tiparm(
+		const char *string,
+		...)
+		{ return(*(char **)0); }
+
+#undef _nc_tiparm
+char	*_nc_tiparm(
+		int	expected,
+		const char *string,
+		...)
+		{ return(*(char **)0); }
+
+#undef _nc_reset_tparm
+void	_nc_reset_tparm(
+		TERMINAL *term)
+		{ /* void */ }
+
+/* ./tinfo/lib_tputs.c */
+
+#undef PC
+char	PC;
+#undef ospeed
+short	ospeed;
+#undef _nc_nulls_sent
+int	_nc_nulls_sent;
+
+#undef _nc_set_no_padding
+void	_nc_set_no_padding(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef delay_output_sp
+int	delay_output_sp(
+		SCREEN	*sp,
+		int	ms)
+		{ return(*(int *)0); }
+
+#undef delay_output
+int	delay_output(
+		int	ms)
+		{ return(*(int *)0); }
+
+#undef _nc_flush_sp
+void	_nc_flush_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_flush
+void	_nc_flush(void)
+		{ /* void */ }
+
+#undef _nc_outch_sp
+int	_nc_outch_sp(
+		SCREEN	*sp,
+		int	ch)
+		{ return(*(int *)0); }
+
+#undef _nc_outch
+int	_nc_outch(
+		int	ch)
+		{ return(*(int *)0); }
+
+#undef _nc_putchar_sp
+int	_nc_putchar_sp(
+		SCREEN	*sp,
+		int	ch)
+		{ return(*(int *)0); }
+
+#undef _nc_putchar
+int	_nc_putchar(
+		int	ch)
+		{ return(*(int *)0); }
+
+#undef putp_sp
+int	putp_sp(
+		SCREEN	*sp,
+		const char *string)
+		{ return(*(int *)0); }
+
+#undef putp
+int	putp(
+		const char *string)
+		{ return(*(int *)0); }
+
+#undef _nc_putp_sp
+int	_nc_putp_sp(
+		SCREEN	*sp,
+		const char *name,
+		const char *string)
+		{ return(*(int *)0); }
+
+#undef _nc_putp
+int	_nc_putp(
+		const char *name,
+		const char *string)
+		{ return(*(int *)0); }
+
+#undef tputs_sp
+int	tputs_sp(
+		SCREEN	*sp,
+		const char *string,
+		int	affcnt,
+		NCURSES_OUTC_sp outc)
+		{ return(*(int *)0); }
+
+#undef _nc_outc_wrapper
+int	_nc_outc_wrapper(
+		SCREEN	*sp,
+		int	c)
+		{ return(*(int *)0); }
+
+#undef tputs
+int	tputs(
+		const char *string,
+		int	affcnt,
+		int	(*outc)(
+		int	p1))
+		{ return(*(int *)0); }
+
+/* ./trace/lib_trace.c */
+
+#undef _nc_tracing
+unsigned _nc_tracing;
+
+#undef _nc__nc_tputs_trace
+const char *_nc__nc_tputs_trace(void)
+		{ return(*(const char **)0); }
+
+#undef _nc__nc_outchars
+long	_nc__nc_outchars(void)
+		{ return(*(long *)0); }
+
+#undef _nc_set_tputs_trace
+void	_nc_set_tputs_trace(
+		const char *s)
+		{ /* void */ }
+
+#undef _nc_count_outchars
+void	_nc_count_outchars(
+		long	increment)
+		{ /* void */ }
+
+#undef curses_trace
+unsigned curses_trace(
+		unsigned tracelevel)
+		{ return(*(unsigned *)0); }
+
+#undef trace
+void	trace(
+		const unsigned int tracelevel)
+		{ /* void */ }
+
+#undef _tracef
+void	_tracef(
+		const char *fmt,
+		...)
+		{ /* void */ }
+
+#undef _nc_retrace_bool
+NCURSES_BOOL _nc_retrace_bool(
+		int	code)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_retrace_char
+char	_nc_retrace_char(
+		int	code)
+		{ return(*(char *)0); }
+
+#undef _nc_retrace_int
+int	_nc_retrace_int(
+		int	code)
+		{ return(*(int *)0); }
+
+#undef _nc_retrace_unsigned
+unsigned _nc_retrace_unsigned(
+		unsigned code)
+		{ return(*(unsigned *)0); }
+
+#undef _nc_retrace_ptr
+char	*_nc_retrace_ptr(
+		char	*code)
+		{ return(*(char **)0); }
+
+#undef _nc_retrace_cptr
+const char *_nc_retrace_cptr(
+		const char *code)
+		{ return(*(const char **)0); }
+
+#undef _nc_retrace_cvoid_ptr
+const void *_nc_retrace_cvoid_ptr(
+		const void *code)
+		{ return(*(const void **)0); }
+
+#undef _nc_retrace_void_ptr
+void	*_nc_retrace_void_ptr(
+		void	*code)
+		{ return(*(void **)0); }
+
+#undef _nc_retrace_sp
+SCREEN	*_nc_retrace_sp(
+		SCREEN	*code)
+		{ return(*(SCREEN **)0); }
+
+#undef _nc_retrace_win
+WINDOW	*_nc_retrace_win(
+		WINDOW	*code)
+		{ return(*(WINDOW **)0); }
+
+#undef _nc_fmt_funcptr
+char	*_nc_fmt_funcptr(
+		char	*target,
+		const char *source,
+		size_t	size)
+		{ return(*(char **)0); }
+
+#undef _nc_use_tracef
+int	_nc_use_tracef(
+		unsigned mask)
+		{ return(*(int *)0); }
+
+#undef _nc_locked_tracef
+void	_nc_locked_tracef(
+		const char *fmt,
+		...)
+		{ /* void */ }
+
+/* ./trace/lib_traceatr.c */
+
+#undef _traceattr2
+char	*_traceattr2(
+		int	bufnum,
+		chtype	newmode)
+		{ return(*(char **)0); }
+
+#undef _traceattr
+char	*_traceattr(
+		attr_t	newmode)
+		{ return(*(char **)0); }
+
+#undef _nc_retrace_int_attr_t
+int	_nc_retrace_int_attr_t(
+		attr_t	code)
+		{ return(*(int *)0); }
+
+#undef _nc_retrace_attr_t
+attr_t	_nc_retrace_attr_t(
+		attr_t	code)
+		{ return(*(attr_t *)0); }
+
+#undef _nc_altcharset_name
+const char *_nc_altcharset_name(
+		attr_t	attr,
+		chtype	ch)
+		{ return(*(const char **)0); }
+
+#undef _tracechtype2
+char	*_tracechtype2(
+		int	bufnum,
+		chtype	ch)
+		{ return(*(char **)0); }
+
+#undef _tracechtype
+char	*_tracechtype(
+		chtype	ch)
+		{ return(*(char **)0); }
+
+#undef _nc_retrace_chtype
+chtype	_nc_retrace_chtype(
+		chtype	code)
+		{ return(*(chtype *)0); }
+
+#undef _tracecchar_t2
+char	*_tracecchar_t2(
+		int	bufnum,
+		const cchar_t *ch)
+		{ return(*(char **)0); }
+
+#undef _tracecchar_t
+char	*_tracecchar_t(
+		const cchar_t *ch)
+		{ return(*(char **)0); }
+
+/* ./trace/lib_tracebits.c */
+
+#undef _nc_trace_ttymode
+char	*_nc_trace_ttymode(
+		const struct termios *tty)
+		{ return(*(char **)0); }
+
+#undef _nc_tracebits
+char	*_nc_tracebits(void)
+		{ return(*(char **)0); }
+
+/* ./trace/lib_tracechr.c */
+
+#undef _nc_tracechar
+char	*_nc_tracechar(
+		SCREEN	*sp,
+		int	ch)
+		{ return(*(char **)0); }
+
+#undef _tracechar
+char	*_tracechar(
+		int	ch)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_ttyflags.c */
+
+#undef _nc_get_tty_mode_sp
+int	_nc_get_tty_mode_sp(
+		SCREEN	*sp,
+		struct termios *buf)
+		{ return(*(int *)0); }
+
+#undef _nc_get_tty_mode
+int	_nc_get_tty_mode(
+		struct termios *buf)
+		{ return(*(int *)0); }
+
+#undef _nc_set_tty_mode_sp
+int	_nc_set_tty_mode_sp(
+		SCREEN	*sp,
+		struct termios *buf)
+		{ return(*(int *)0); }
+
+#undef _nc_set_tty_mode
+int	_nc_set_tty_mode(
+		struct termios *buf)
+		{ return(*(int *)0); }
+
+#undef def_shell_mode_sp
+int	def_shell_mode_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef def_shell_mode
+int	def_shell_mode(void)
+		{ return(*(int *)0); }
+
+#undef def_prog_mode_sp
+int	def_prog_mode_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef def_prog_mode
+int	def_prog_mode(void)
+		{ return(*(int *)0); }
+
+#undef reset_prog_mode_sp
+int	reset_prog_mode_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef reset_prog_mode
+int	reset_prog_mode(void)
+		{ return(*(int *)0); }
+
+#undef reset_shell_mode_sp
+int	reset_shell_mode_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef reset_shell_mode
+int	reset_shell_mode(void)
+		{ return(*(int *)0); }
+
+#undef savetty_sp
+int	savetty_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef savetty
+int	savetty(void)
+		{ return(*(int *)0); }
+
+#undef resetty_sp
+int	resetty_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef resetty
+int	resetty(void)
+		{ return(*(int *)0); }
+
+/* ./tty/lib_twait.c */
+
+#undef _nc_timed_wait
+int	_nc_timed_wait(
+		SCREEN	*sp,
+		int	mode,
+		int	milliseconds,
+		int	*timeleft)
+		{ return(*(int *)0); }
+
+/* ./tinfo/name_match.c */
+
+#undef _nc_first_name
+char	*_nc_first_name(
+		const char *const sp)
+		{ return(*(char **)0); }
+
+#undef _nc_name_match
+int	_nc_name_match(
+		const char *const namelst,
+		const char *const name,
+		const char *const delim)
+		{ return(*(int *)0); }
+
+/* ./names.c */
+
+#undef _nc_boolnames
+const char *const *_nc_boolnames(void)
+		{ return(*(const char **)0); }
+
+#undef _nc_boolfnames
+const char *const *_nc_boolfnames(void)
+		{ return(*(const char **)0); }
+
+#undef _nc_numnames
+const char *const *_nc_numnames(void)
+		{ return(*(const char **)0); }
+
+#undef _nc_numfnames
+const char *const *_nc_numfnames(void)
+		{ return(*(const char **)0); }
+
+#undef _nc_strnames
+const char *const *_nc_strnames(void)
+		{ return(*(const char **)0); }
+
+#undef _nc_strfnames
+const char *const *_nc_strfnames(void)
+		{ return(*(const char **)0); }
+
+/* ./tinfo/obsolete.c */
+
+#undef _nc_set_buffer_sp
+void	_nc_set_buffer_sp(
+		SCREEN	*sp,
+		FILE	*ofp,
+		int	buffered)
+		{ /* void */ }
+
+#undef _nc_set_buffer
+void	_nc_set_buffer(
+		FILE	*ofp,
+		int	buffered)
+		{ /* void */ }
+
+/* ./tinfo/read_entry.c */
+
+#undef _nc_init_termtype
+void	_nc_init_termtype(
+		TERMTYPE2 *const tp)
+		{ /* void */ }
+
+#undef _nc_read_termtype
+int	_nc_read_termtype(
+		TERMTYPE2 *ptr,
+		char	*buffer,
+		int	limit)
+		{ return(*(int *)0); }
+
+#undef _nc_read_file_entry
+int	_nc_read_file_entry(
+		const char *const filename,
+		TERMTYPE2 *ptr)
+		{ return(*(int *)0); }
+
+#undef _nc_read_entry2
+int	_nc_read_entry2(
+		const char *const name,
+		char	*const filename,
+		TERMTYPE2 *const tp)
+		{ return(*(int *)0); }
+
+#undef _nc_read_entry
+int	_nc_read_entry(
+		const char *const name,
+		char	*const filename,
+		TERMTYPE *const tp)
+		{ return(*(int *)0); }
+
+/* ./tinfo/read_termcap.c */
+
+#undef _nc_read_termcap_entry
+int	_nc_read_termcap_entry(
+		const char *const tn,
+		TERMTYPE2 *const tp)
+		{ return(*(int *)0); }
+
+/* ./tinfo/strings.c */
+
+#undef _nc_str_init
+string_desc *_nc_str_init(
+		string_desc *dst,
+		char	*src,
+		size_t	len)
+		{ return(*(string_desc **)0); }
+
+#undef _nc_str_null
+string_desc *_nc_str_null(
+		string_desc *dst,
+		size_t	len)
+		{ return(*(string_desc **)0); }
+
+#undef _nc_str_copy
+string_desc *_nc_str_copy(
+		string_desc *dst,
+		string_desc *src)
+		{ return(*(string_desc **)0); }
+
+#undef _nc_safe_strcat
+NCURSES_BOOL _nc_safe_strcat(
+		string_desc *dst,
+		const char *src)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_safe_strcpy
+NCURSES_BOOL _nc_safe_strcpy(
+		string_desc *dst,
+		const char *src)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./trace/trace_buf.c */
+
+#undef _nc_trace_buf
+char	*_nc_trace_buf(
+		int	bufnum,
+		size_t	want)
+		{ return(*(char **)0); }
+
+#undef _nc_trace_bufcat
+char	*_nc_trace_bufcat(
+		int	bufnum,
+		const char *value)
+		{ return(*(char **)0); }
+
+/* ./trace/trace_tries.c */
+
+#undef _nc_trace_tries
+void	_nc_trace_tries(
+		TRIES	*tree)
+		{ /* void */ }
+
+/* ./base/tries.c */
+
+#undef _nc_expand_try
+char	*_nc_expand_try(
+		TRIES	*tree,
+		unsigned code,
+		int	*count,
+		size_t	len)
+		{ return(*(char **)0); }
+
+#undef _nc_remove_key
+int	_nc_remove_key(
+		TRIES	**tree,
+		unsigned code)
+		{ return(*(int *)0); }
+
+#undef _nc_remove_string
+int	_nc_remove_string(
+		TRIES	**tree,
+		const char *string)
+		{ return(*(int *)0); }
+
+/* ./tinfo/trim_sgr0.c */
+
+#undef _nc_trim_sgr0
+char	*_nc_trim_sgr0(
+		TERMTYPE2 *tp)
+		{ return(*(char **)0); }
+
+/* ./unctrl.c */
+
+#undef unctrl_sp
+const char *unctrl_sp(
+		SCREEN	*sp,
+		chtype	ch)
+		{ return(*(const char **)0); }
+
+#undef unctrl
+const char *unctrl(
+		chtype	ch)
+		{ return(*(const char **)0); }
+
+/* ./trace/visbuf.c */
+
+#undef _nc_visbuf2
+const char *_nc_visbuf2(
+		int	bufnum,
+		const char *buf)
+		{ return(*(const char **)0); }
+
+#undef _nc_visbuf
+const char *_nc_visbuf(
+		const char *buf)
+		{ return(*(const char **)0); }
+
+#undef _nc_visbufn
+const char *_nc_visbufn(
+		const char *buf,
+		int	len)
+		{ return(*(const char **)0); }
+
+#undef _nc_viswbuf2
+const char *_nc_viswbuf2(
+		int	bufnum,
+		const wchar_t *buf)
+		{ return(*(const char **)0); }
+
+#undef _nc_viswbuf
+const char *_nc_viswbuf(
+		const wchar_t *buf)
+		{ return(*(const char **)0); }
+
+#undef _nc_viswbufn
+const char *_nc_viswbufn(
+		const wchar_t *buf,
+		int	len)
+		{ return(*(const char **)0); }
+
+#undef _nc_viswibuf
+const char *_nc_viswibuf(
+		const wint_t *buf)
+		{ return(*(const char **)0); }
+
+#undef _nc_viscbuf2
+const char *_nc_viscbuf2(
+		int	bufnum,
+		const cchar_t *buf,
+		int	len)
+		{ return(*(const char **)0); }
+
+#undef _nc_viscbuf
+const char *_nc_viscbuf(
+		const cchar_t *buf,
+		int	len)
+		{ return(*(const char **)0); }
+
+/* ./tinfo/alloc_entry.c */
+
+#undef _nc_init_entry
+void	_nc_init_entry(
+		ENTRY	*const tp)
+		{ /* void */ }
+
+#undef _nc_copy_entry
+ENTRY	*_nc_copy_entry(
+		ENTRY	*oldp)
+		{ return(*(ENTRY **)0); }
+
+#undef _nc_save_str
+char	*_nc_save_str(
+		const char *string)
+		{ return(*(char **)0); }
+
+#undef _nc_wrap_entry
+void	_nc_wrap_entry(
+		ENTRY	*const ep,
+		NCURSES_BOOL copy_strings)
+		{ /* void */ }
+
+#undef _nc_merge_entry
+void	_nc_merge_entry(
+		ENTRY	*const target,
+		ENTRY	*const source)
+		{ /* void */ }
+
+/* ./tinfo/captoinfo.c */
+
+#undef _nc_captoinfo
+char	*_nc_captoinfo(
+		const char *cap,
+		const char *s,
+		int const parameterized)
+		{ return(*(char **)0); }
+
+#undef _nc_infotocap
+char	*_nc_infotocap(
+		const char *cap,
+		const char *str,
+		int const parameterized)
+		{ return(*(char **)0); }
+
+/* ./tinfo/comp_expand.c */
+
+#undef _nc_tic_expand
+char	*_nc_tic_expand(
+		const char *srcp,
+		NCURSES_BOOL tic_format,
+		int	numbers)
+		{ return(*(char **)0); }
+
+/* ./tinfo/comp_parse.c */
+
+#undef _nc_check_termtype2
+void	(*_nc_check_termtype2)(
+		TERMTYPE2 *p1,
+		NCURSES_BOOL p2);
+
+#undef _nc_entry_match
+NCURSES_BOOL _nc_entry_match(
+		char	*n1,
+		char	*n2)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_read_entry_source
+void	_nc_read_entry_source(
+		FILE	*fp,
+		char	*buf,
+		int	literal,
+		NCURSES_BOOL silent,
+		NCURSES_BOOL (*hook)(
+		ENTRY	*p1))
+		{ /* void */ }
+
+#undef _nc_resolve_uses2
+int	_nc_resolve_uses2(
+		NCURSES_BOOL fullresolve,
+		NCURSES_BOOL literal)
+		{ return(*(int *)0); }
+
+/* ./tinfo/comp_scan.c */
+
+#undef _nc_syntax
+int	_nc_syntax;
+#undef _nc_strict_bsd
+int	_nc_strict_bsd;
+#undef _nc_curr_file_pos
+long	_nc_curr_file_pos;
+#undef _nc_comment_start
+long	_nc_comment_start;
+#undef _nc_comment_end
+long	_nc_comment_end;
+#undef _nc_start_line
+long	_nc_start_line;
+#undef _nc_curr_token
+struct token _nc_curr_token;
+#undef _nc_disable_period
+NCURSES_BOOL _nc_disable_period;
+
+#undef _nc_reset_input
+void	_nc_reset_input(
+		FILE	*fp,
+		char	*buf)
+		{ /* void */ }
+
+#undef _nc_get_token
+int	_nc_get_token(
+		NCURSES_BOOL silent)
+		{ return(*(int *)0); }
+
+#undef _nc_trans_string
+int	_nc_trans_string(
+		char	*ptr,
+		char	*last)
+		{ return(*(int *)0); }
+
+#undef _nc_push_token
+void	_nc_push_token(
+		int	tokclass)
+		{ /* void */ }
+
+#undef _nc_panic_mode
+void	_nc_panic_mode(
+		char	ch)
+		{ /* void */ }
+
+/* ./tinfo/parse_entry.c */
+
+#undef _nc_parse_entry
+int	_nc_parse_entry(
+		ENTRY	*entryp,
+		int	literal,
+		NCURSES_BOOL silent)
+		{ return(*(int *)0); }
+
+#undef _nc_capcmp
+int	_nc_capcmp(
+		const char *s,
+		const char *t)
+		{ return(*(int *)0); }
+
+/* ./tinfo/write_entry.c */
+
+#undef _nc_set_writedir
+void	_nc_set_writedir(
+		const char *dir)
+		{ /* void */ }
+
+#undef _nc_write_entry
+void	_nc_write_entry(
+		TERMTYPE2 *const tp)
+		{ /* void */ }
+
+#undef _nc_write_object
+int	_nc_write_object(
+		TERMTYPE2 *tp,
+		char	*buffer,
+		unsigned *offset,
+		unsigned limit)
+		{ return(*(int *)0); }
+
+#undef _nc_tic_written
+int	_nc_tic_written(void)
+		{ return(*(int *)0); }
+
+/* ./base/define_key.c */
+
+#undef define_key_sp
+int	define_key_sp(
+		SCREEN	*sp,
+		const char *str,
+		int	keycode)
+		{ return(*(int *)0); }
+
+#undef define_key
+int	define_key(
+		const char *str,
+		int	keycode)
+		{ return(*(int *)0); }
+
+/* ./tinfo/hashed_db.c */
+
+#undef _nc_hashed_db
+void	_nc_hashed_db(void)
+		{ /* void */ }
+
+/* ./base/key_defined.c */
+
+#undef key_defined_sp
+int	key_defined_sp(
+		SCREEN	*sp,
+		const char *str)
+		{ return(*(int *)0); }
+
+#undef key_defined
+int	key_defined(
+		const char *str)
+		{ return(*(int *)0); }
+
+/* ./base/keybound.c */
+
+#undef keybound_sp
+char	*keybound_sp(
+		SCREEN	*sp,
+		int	code,
+		int	count)
+		{ return(*(char **)0); }
+
+#undef keybound
+char	*keybound(
+		int	code,
+		int	count)
+		{ return(*(char **)0); }
+
+/* ./base/keyok.c */
+
+#undef keyok_sp
+int	keyok_sp(
+		SCREEN	*sp,
+		int	c,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef keyok
+int	keyok(
+		int	c,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+/* ./base/version.c */
+
+#undef curses_version
+const char *curses_version(void)
+		{ return(*(const char **)0); }
diff --git a/ncurses/llib-lncursesw b/ncurses/llib-lncursesw
new file mode 100644
index 0000000..127350d
--- /dev/null
+++ b/ncurses/llib-lncursesw
@@ -0,0 +1,5456 @@
+/****************************************************************************
+ * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 2001-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey       2001-on                                  *
+ ****************************************************************************/
+/* LINTLIBRARY */
+
+/* ./tty/hardscroll.c */
+
+#include <curses.priv.h>
+
+#undef _nc_oldnums
+int	*_nc_oldnums;
+
+#undef _nc_scroll_optimize_sp
+void	_nc_scroll_optimize_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_scroll_optimize
+void	_nc_scroll_optimize(void)
+		{ /* void */ }
+
+#undef _nc_linedump_sp
+void	_nc_linedump_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_linedump
+void	_nc_linedump(void)
+		{ /* void */ }
+
+/* ./tty/hashmap.c */
+
+#undef _nc_hash_map_sp
+void	_nc_hash_map_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_hash_map
+void	_nc_hash_map(void)
+		{ /* void */ }
+
+#undef _nc_make_oldhash_sp
+void	_nc_make_oldhash_sp(
+		SCREEN	*sp,
+		int	i)
+		{ /* void */ }
+
+#undef _nc_make_oldhash
+void	_nc_make_oldhash(
+		int	i)
+		{ /* void */ }
+
+#undef _nc_scroll_oldhash_sp
+void	_nc_scroll_oldhash_sp(
+		SCREEN	*sp,
+		int	n,
+		int	top,
+		int	bot)
+		{ /* void */ }
+
+#undef _nc_scroll_oldhash
+void	_nc_scroll_oldhash(
+		int	n,
+		int	top,
+		int	bot)
+		{ /* void */ }
+
+/* ./base/lib_addch.c */
+
+#undef _nc_render
+cchar_t	_nc_render(
+		WINDOW	*win,
+		cchar_t	ch)
+		{ return(*(cchar_t *)0); }
+
+#undef _nc_build_wch
+int	_nc_build_wch(
+		WINDOW	*win,
+		cchar_t	*ch)
+		{ return(*(int *)0); }
+
+#undef _nc_waddch_nosync
+int	_nc_waddch_nosync(
+		WINDOW	*win,
+		const cchar_t c)
+		{ return(*(int *)0); }
+
+#undef waddch
+int	waddch(
+		WINDOW	*win,
+		const chtype ch)
+		{ return(*(int *)0); }
+
+#undef wechochar
+int	wechochar(
+		WINDOW	*win,
+		const chtype ch)
+		{ return(*(int *)0); }
+
+/* ./base/lib_addstr.c */
+
+#undef waddnstr
+int	waddnstr(
+		WINDOW	*win,
+		const char *astr,
+		int	n)
+		{ return(*(int *)0); }
+
+#undef waddchnstr
+int	waddchnstr(
+		WINDOW	*win,
+		const chtype *astr,
+		int	n)
+		{ return(*(int *)0); }
+
+#undef _nc_wchstrlen
+int	_nc_wchstrlen(
+		const cchar_t *s)
+		{ return(*(int *)0); }
+
+#undef wadd_wchnstr
+int	wadd_wchnstr(
+		WINDOW	*win,
+		const cchar_t *astr,
+		int	n)
+		{ return(*(int *)0); }
+
+#undef waddnwstr
+int	waddnwstr(
+		WINDOW	*win,
+		const wchar_t *str,
+		int	n)
+		{ return(*(int *)0); }
+
+/* ./base/lib_beep.c */
+
+#undef beep_sp
+int	beep_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef beep
+int	beep(void)
+		{ return(*(int *)0); }
+
+/* ./base/lib_bkgd.c */
+
+#undef wbkgrndset
+void	wbkgrndset(
+		WINDOW	*win,
+		const cchar_t *ch)
+		{ /* void */ }
+
+#undef wbkgdset
+void	wbkgdset(
+		WINDOW	*win,
+		chtype	ch)
+		{ /* void */ }
+
+#undef wbkgrnd
+int	wbkgrnd(
+		WINDOW	*win,
+		const cchar_t *ch)
+		{ return(*(int *)0); }
+
+#undef wbkgd
+int	wbkgd(
+		WINDOW	*win,
+		chtype	ch)
+		{ return(*(int *)0); }
+
+/* ./base/lib_box.c */
+
+#undef wborder
+int	wborder(
+		WINDOW	*win,
+		chtype	ls,
+		chtype	rs,
+		chtype	ts,
+		chtype	bs,
+		chtype	tl,
+		chtype	tr,
+		chtype	bl,
+		chtype	br)
+		{ return(*(int *)0); }
+
+/* ./base/lib_chgat.c */
+
+#undef wchgat
+int	wchgat(
+		WINDOW	*win,
+		int	n,
+		attr_t	attr,
+		short	pair_arg,
+		const void *opts)
+		{ return(*(int *)0); }
+
+/* ./base/lib_clear.c */
+
+#undef wclear
+int	wclear(
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+/* ./base/lib_clearok.c */
+
+#undef clearok
+int	clearok(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+/* ./base/lib_clrbot.c */
+
+#undef wclrtobot
+int	wclrtobot(
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+/* ./base/lib_clreol.c */
+
+#undef wclrtoeol
+int	wclrtoeol(
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+/* ./base/lib_color.c */
+
+#undef COLOR_PAIRS
+int	COLOR_PAIRS;
+#undef COLORS
+int	COLORS;
+
+#undef _nc_reset_colors_sp
+NCURSES_BOOL _nc_reset_colors_sp(
+		SCREEN	*sp)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_reset_colors
+NCURSES_BOOL _nc_reset_colors(void)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef start_color_sp
+int	start_color_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef start_color
+int	start_color(void)
+		{ return(*(int *)0); }
+
+#undef _nc_change_pair
+void	_nc_change_pair(
+		SCREEN	*sp,
+		int	pair)
+		{ /* void */ }
+
+#undef _nc_reserve_pairs
+void	_nc_reserve_pairs(
+		SCREEN	*sp,
+		int	want)
+		{ /* void */ }
+
+#undef _nc_init_pair
+int	_nc_init_pair(
+		SCREEN	*sp,
+		int	pair,
+		int	f,
+		int	b)
+		{ return(*(int *)0); }
+
+#undef init_pair_sp
+int	init_pair_sp(
+		SCREEN	*sp,
+		short	pair,
+		short	f,
+		short	b)
+		{ return(*(int *)0); }
+
+#undef init_pair
+int	init_pair(
+		short	pair,
+		short	f,
+		short	b)
+		{ return(*(int *)0); }
+
+#undef _nc_init_color
+int	_nc_init_color(
+		SCREEN	*sp,
+		int	color,
+		int	r,
+		int	g,
+		int	b)
+		{ return(*(int *)0); }
+
+#undef init_color_sp
+int	init_color_sp(
+		SCREEN	*sp,
+		short	color,
+		short	r,
+		short	g,
+		short	b)
+		{ return(*(int *)0); }
+
+#undef init_color
+int	init_color(
+		short	color,
+		short	r,
+		short	g,
+		short	b)
+		{ return(*(int *)0); }
+
+#undef can_change_color_sp
+NCURSES_BOOL can_change_color_sp(
+		SCREEN	*sp)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef can_change_color
+NCURSES_BOOL can_change_color(void)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef has_colors_sp
+NCURSES_BOOL has_colors_sp(
+		SCREEN	*sp)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef has_colors
+NCURSES_BOOL has_colors(void)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef color_content_sp
+int	color_content_sp(
+		SCREEN	*sp,
+		short	color,
+		short	*r,
+		short	*g,
+		short	*b)
+		{ return(*(int *)0); }
+
+#undef color_content
+int	color_content(
+		short	color,
+		short	*r,
+		short	*g,
+		short	*b)
+		{ return(*(int *)0); }
+
+#undef _nc_pair_content
+int	_nc_pair_content(
+		SCREEN	*sp,
+		int	pair,
+		int	*f,
+		int	*b)
+		{ return(*(int *)0); }
+
+#undef pair_content_sp
+int	pair_content_sp(
+		SCREEN	*sp,
+		short	pair,
+		short	*f,
+		short	*b)
+		{ return(*(int *)0); }
+
+#undef pair_content
+int	pair_content(
+		short	pair,
+		short	*f,
+		short	*b)
+		{ return(*(int *)0); }
+
+#undef _nc_do_color_sp
+void	_nc_do_color_sp(
+		SCREEN	*sp,
+		int	old_pair,
+		int	pair,
+		int	reverse,
+		NCURSES_OUTC_sp outc)
+		{ /* void */ }
+
+#undef _nc_do_color
+void	_nc_do_color(
+		int	old_pair,
+		int	pair,
+		int	reverse,
+		NCURSES_OUTC outc)
+		{ /* void */ }
+
+#undef init_extended_pair_sp
+int	init_extended_pair_sp(
+		SCREEN	*sp,
+		int	pair,
+		int	f,
+		int	b)
+		{ return(*(int *)0); }
+
+#undef init_extended_color_sp
+int	init_extended_color_sp(
+		SCREEN	*sp,
+		int	color,
+		int	r,
+		int	g,
+		int	b)
+		{ return(*(int *)0); }
+
+#undef extended_color_content_sp
+int	extended_color_content_sp(
+		SCREEN	*sp,
+		int	color,
+		int	*r,
+		int	*g,
+		int	*b)
+		{ return(*(int *)0); }
+
+#undef extended_pair_content_sp
+int	extended_pair_content_sp(
+		SCREEN	*sp,
+		int	pair,
+		int	*f,
+		int	*b)
+		{ return(*(int *)0); }
+
+#undef reset_color_pairs_sp
+void	reset_color_pairs_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef init_extended_pair
+int	init_extended_pair(
+		int	pair,
+		int	f,
+		int	b)
+		{ return(*(int *)0); }
+
+#undef init_extended_color
+int	init_extended_color(
+		int	color,
+		int	r,
+		int	g,
+		int	b)
+		{ return(*(int *)0); }
+
+#undef extended_color_content
+int	extended_color_content(
+		int	color,
+		int	*r,
+		int	*g,
+		int	*b)
+		{ return(*(int *)0); }
+
+#undef extended_pair_content
+int	extended_pair_content(
+		int	pair,
+		int	*f,
+		int	*b)
+		{ return(*(int *)0); }
+
+#undef reset_color_pairs
+void	reset_color_pairs(void)
+		{ /* void */ }
+
+/* ./base/lib_colorset.c */
+
+#undef wcolor_set
+int	wcolor_set(
+		WINDOW	*win,
+		short	pair_arg,
+		void	*opts)
+		{ return(*(int *)0); }
+
+/* ./base/lib_delch.c */
+
+#undef wdelch
+int	wdelch(
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+/* ./base/lib_delwin.c */
+
+#undef delwin
+int	delwin(
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+/* ./base/lib_echo.c */
+
+#undef echo_sp
+int	echo_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef echo
+int	echo(void)
+		{ return(*(int *)0); }
+
+#undef noecho_sp
+int	noecho_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef noecho
+int	noecho(void)
+		{ return(*(int *)0); }
+
+/* ./base/lib_endwin.c */
+
+#undef endwin_sp
+int	endwin_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef endwin
+int	endwin(void)
+		{ return(*(int *)0); }
+
+/* ./base/lib_erase.c */
+
+#undef werase
+int	werase(
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+/* ./base/lib_flash.c */
+
+#undef flash_sp
+int	flash_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef flash
+int	flash(void)
+		{ return(*(int *)0); }
+
+/* ./lib_gen.c */
+
+#undef addch
+int	addch(
+		const chtype z)
+		{ return(*(int *)0); }
+
+#undef addchnstr
+int	addchnstr(
+		const chtype *a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef addchstr
+int	addchstr(
+		const chtype *z)
+		{ return(*(int *)0); }
+
+#undef addnstr
+int	addnstr(
+		const char *a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef addstr
+int	addstr(
+		const char *z)
+		{ return(*(int *)0); }
+
+#undef attroff
+int	attroff(
+		NCURSES_ATTR_T	z)
+		{ return(*(int *)0); }
+
+#undef attron
+int	attron(
+		NCURSES_ATTR_T	z)
+		{ return(*(int *)0); }
+
+#undef attrset
+int	attrset(
+		NCURSES_ATTR_T	z)
+		{ return(*(int *)0); }
+
+#undef attr_get
+int	attr_get(
+		attr_t	*a1,
+		short	*a2,
+		void	*z)
+		{ return(*(int *)0); }
+
+#undef attr_off
+int	attr_off(
+		attr_t	a1,
+		void	*z)
+		{ return(*(int *)0); }
+
+#undef attr_on
+int	attr_on(
+		attr_t	a1,
+		void	*z)
+		{ return(*(int *)0); }
+
+#undef attr_set
+int	attr_set(
+		attr_t	a1,
+		short	a2,
+		void	*z)
+		{ return(*(int *)0); }
+
+#undef bkgd
+int	bkgd(
+		chtype	z)
+		{ return(*(int *)0); }
+
+#undef bkgdset
+void	bkgdset(
+		chtype	z)
+		{ /* void */ }
+
+#undef border
+int	border(
+		chtype	a1,
+		chtype	a2,
+		chtype	a3,
+		chtype	a4,
+		chtype	a5,
+		chtype	a6,
+		chtype	a7,
+		chtype	z)
+		{ return(*(int *)0); }
+
+#undef box
+int	box(
+		WINDOW	*a1,
+		chtype	a2,
+		chtype	z)
+		{ return(*(int *)0); }
+
+#undef chgat
+int	chgat(
+		int	a1,
+		attr_t	a2,
+		short	a3,
+		const void *z)
+		{ return(*(int *)0); }
+
+#undef clear
+int	clear(void)
+		{ return(*(int *)0); }
+
+#undef clrtobot
+int	clrtobot(void)
+		{ return(*(int *)0); }
+
+#undef clrtoeol
+int	clrtoeol(void)
+		{ return(*(int *)0); }
+
+#undef color_set
+int	color_set(
+		short	a1,
+		void	*z)
+		{ return(*(int *)0); }
+
+#undef COLOR_PAIR
+int	COLOR_PAIR(
+		int	z)
+		{ return(*(int *)0); }
+
+#undef delch
+int	delch(void)
+		{ return(*(int *)0); }
+
+#undef deleteln
+int	deleteln(void)
+		{ return(*(int *)0); }
+
+#undef echochar
+int	echochar(
+		const chtype z)
+		{ return(*(int *)0); }
+
+#undef erase
+int	erase(void)
+		{ return(*(int *)0); }
+
+#undef getbkgd
+chtype	getbkgd(
+		WINDOW	*z)
+		{ return(*(chtype *)0); }
+
+#undef getch
+int	getch(void)
+		{ return(*(int *)0); }
+
+#undef getnstr
+int	getnstr(
+		char	*a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef getstr
+int	getstr(
+		char	*z)
+		{ return(*(int *)0); }
+
+#undef hline
+int	hline(
+		chtype	a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef inch
+chtype	inch(void)
+		{ return(*(chtype *)0); }
+
+#undef inchnstr
+int	inchnstr(
+		chtype	*a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef inchstr
+int	inchstr(
+		chtype	*z)
+		{ return(*(int *)0); }
+
+#undef innstr
+int	innstr(
+		char	*a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef insch
+int	insch(
+		chtype	z)
+		{ return(*(int *)0); }
+
+#undef insdelln
+int	insdelln(
+		int	z)
+		{ return(*(int *)0); }
+
+#undef insertln
+int	insertln(void)
+		{ return(*(int *)0); }
+
+#undef insnstr
+int	insnstr(
+		const char *a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef insstr
+int	insstr(
+		const char *z)
+		{ return(*(int *)0); }
+
+#undef instr
+int	instr(
+		char	*z)
+		{ return(*(int *)0); }
+
+#undef move
+int	move(
+		int	a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvaddch
+int	mvaddch(
+		int	a1,
+		int	a2,
+		const chtype z)
+		{ return(*(int *)0); }
+
+#undef mvaddchnstr
+int	mvaddchnstr(
+		int	a1,
+		int	a2,
+		const chtype *a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvaddchstr
+int	mvaddchstr(
+		int	a1,
+		int	a2,
+		const chtype *z)
+		{ return(*(int *)0); }
+
+#undef mvaddnstr
+int	mvaddnstr(
+		int	a1,
+		int	a2,
+		const char *a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvaddstr
+int	mvaddstr(
+		int	a1,
+		int	a2,
+		const char *z)
+		{ return(*(int *)0); }
+
+#undef mvchgat
+int	mvchgat(
+		int	a1,
+		int	a2,
+		int	a3,
+		attr_t	a4,
+		short	a5,
+		const void *z)
+		{ return(*(int *)0); }
+
+#undef mvdelch
+int	mvdelch(
+		int	a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvgetch
+int	mvgetch(
+		int	a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvgetnstr
+int	mvgetnstr(
+		int	a1,
+		int	a2,
+		char	*a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvgetstr
+int	mvgetstr(
+		int	a1,
+		int	a2,
+		char	*z)
+		{ return(*(int *)0); }
+
+#undef mvhline
+int	mvhline(
+		int	a1,
+		int	a2,
+		chtype	a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvinch
+chtype	mvinch(
+		int	a1,
+		int	z)
+		{ return(*(chtype *)0); }
+
+#undef mvinchnstr
+int	mvinchnstr(
+		int	a1,
+		int	a2,
+		chtype	*a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvinchstr
+int	mvinchstr(
+		int	a1,
+		int	a2,
+		chtype	*z)
+		{ return(*(int *)0); }
+
+#undef mvinnstr
+int	mvinnstr(
+		int	a1,
+		int	a2,
+		char	*a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvinsch
+int	mvinsch(
+		int	a1,
+		int	a2,
+		chtype	z)
+		{ return(*(int *)0); }
+
+#undef mvinsnstr
+int	mvinsnstr(
+		int	a1,
+		int	a2,
+		const char *a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvinsstr
+int	mvinsstr(
+		int	a1,
+		int	a2,
+		const char *z)
+		{ return(*(int *)0); }
+
+#undef mvinstr
+int	mvinstr(
+		int	a1,
+		int	a2,
+		char	*z)
+		{ return(*(int *)0); }
+
+#undef mvvline
+int	mvvline(
+		int	a1,
+		int	a2,
+		chtype	a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwaddch
+int	mvwaddch(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const chtype z)
+		{ return(*(int *)0); }
+
+#undef mvwaddchnstr
+int	mvwaddchnstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const chtype *a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwaddchstr
+int	mvwaddchstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const chtype *z)
+		{ return(*(int *)0); }
+
+#undef mvwaddnstr
+int	mvwaddnstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const char *a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwaddstr
+int	mvwaddstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const char *z)
+		{ return(*(int *)0); }
+
+#undef mvwchgat
+int	mvwchgat(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		int	a4,
+		attr_t	a5,
+		short	a6,
+		const void *z)
+		{ return(*(int *)0); }
+
+#undef mvwdelch
+int	mvwdelch(
+		WINDOW	*a1,
+		int	a2,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwgetch
+int	mvwgetch(
+		WINDOW	*a1,
+		int	a2,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwgetnstr
+int	mvwgetnstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		char	*a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwgetstr
+int	mvwgetstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		char	*z)
+		{ return(*(int *)0); }
+
+#undef mvwhline
+int	mvwhline(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		chtype	a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwinch
+chtype	mvwinch(
+		WINDOW	*a1,
+		int	a2,
+		int	z)
+		{ return(*(chtype *)0); }
+
+#undef mvwinchnstr
+int	mvwinchnstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		chtype	*a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwinchstr
+int	mvwinchstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		chtype	*z)
+		{ return(*(int *)0); }
+
+#undef mvwinnstr
+int	mvwinnstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		char	*a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwinsch
+int	mvwinsch(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		chtype	z)
+		{ return(*(int *)0); }
+
+#undef mvwinsnstr
+int	mvwinsnstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const char *a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwinsstr
+int	mvwinsstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const char *z)
+		{ return(*(int *)0); }
+
+#undef mvwinstr
+int	mvwinstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		char	*z)
+		{ return(*(int *)0); }
+
+#undef mvwvline
+int	mvwvline(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		chtype	a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef PAIR_NUMBER
+int	PAIR_NUMBER(
+		int	z)
+		{ return(*(int *)0); }
+
+#undef redrawwin
+int	redrawwin(
+		WINDOW	*z)
+		{ return(*(int *)0); }
+
+#undef refresh
+int	refresh(void)
+		{ return(*(int *)0); }
+
+#undef scrl
+int	scrl(
+		int	z)
+		{ return(*(int *)0); }
+
+#undef scroll
+int	scroll(
+		WINDOW	*z)
+		{ return(*(int *)0); }
+
+#undef setscrreg
+int	setscrreg(
+		int	a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef slk_attr_off
+int	slk_attr_off(
+		const attr_t a1,
+		void	*z)
+		{ return(*(int *)0); }
+
+#undef slk_attr_on
+int	slk_attr_on(
+		attr_t	a1,
+		void	*z)
+		{ return(*(int *)0); }
+
+#undef standout
+int	standout(void)
+		{ return(*(int *)0); }
+
+#undef standend
+int	standend(void)
+		{ return(*(int *)0); }
+
+#undef timeout
+void	timeout(
+		int	z)
+		{ /* void */ }
+
+#undef touchline
+int	touchline(
+		WINDOW	*a1,
+		int	a2,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef touchwin
+int	touchwin(
+		WINDOW	*z)
+		{ return(*(int *)0); }
+
+#undef untouchwin
+int	untouchwin(
+		WINDOW	*z)
+		{ return(*(int *)0); }
+
+#undef vline
+int	vline(
+		chtype	a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef waddchstr
+int	waddchstr(
+		WINDOW	*a1,
+		const chtype *z)
+		{ return(*(int *)0); }
+
+#undef waddstr
+int	waddstr(
+		WINDOW	*a1,
+		const char *z)
+		{ return(*(int *)0); }
+
+#undef wattron
+int	wattron(
+		WINDOW	*a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef wattroff
+int	wattroff(
+		WINDOW	*a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef wattrset
+int	wattrset(
+		WINDOW	*a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef wattr_get
+int	wattr_get(
+		WINDOW	*a1,
+		attr_t	*a2,
+		short	*a3,
+		void	*z)
+		{ return(*(int *)0); }
+
+#undef wattr_set
+int	wattr_set(
+		WINDOW	*a1,
+		attr_t	a2,
+		short	a3,
+		void	*z)
+		{ return(*(int *)0); }
+
+#undef wdeleteln
+int	wdeleteln(
+		WINDOW	*z)
+		{ return(*(int *)0); }
+
+#undef wgetstr
+int	wgetstr(
+		WINDOW	*a1,
+		char	*z)
+		{ return(*(int *)0); }
+
+#undef winchstr
+int	winchstr(
+		WINDOW	*a1,
+		chtype	*z)
+		{ return(*(int *)0); }
+
+#undef winsertln
+int	winsertln(
+		WINDOW	*z)
+		{ return(*(int *)0); }
+
+#undef winsstr
+int	winsstr(
+		WINDOW	*a1,
+		const char *z)
+		{ return(*(int *)0); }
+
+#undef winstr
+int	winstr(
+		WINDOW	*a1,
+		char	*z)
+		{ return(*(int *)0); }
+
+#undef wstandout
+int	wstandout(
+		WINDOW	*z)
+		{ return(*(int *)0); }
+
+#undef wstandend
+int	wstandend(
+		WINDOW	*z)
+		{ return(*(int *)0); }
+
+#undef getattrs
+int	getattrs(
+		const WINDOW *z)
+		{ return(*(int *)0); }
+
+#undef getcurx
+int	getcurx(
+		const WINDOW *z)
+		{ return(*(int *)0); }
+
+#undef getcury
+int	getcury(
+		const WINDOW *z)
+		{ return(*(int *)0); }
+
+#undef getbegx
+int	getbegx(
+		const WINDOW *z)
+		{ return(*(int *)0); }
+
+#undef getbegy
+int	getbegy(
+		const WINDOW *z)
+		{ return(*(int *)0); }
+
+#undef getmaxx
+int	getmaxx(
+		const WINDOW *z)
+		{ return(*(int *)0); }
+
+#undef getmaxy
+int	getmaxy(
+		const WINDOW *z)
+		{ return(*(int *)0); }
+
+#undef getparx
+int	getparx(
+		const WINDOW *z)
+		{ return(*(int *)0); }
+
+#undef getpary
+int	getpary(
+		const WINDOW *z)
+		{ return(*(int *)0); }
+
+#undef wgetparent
+WINDOW	*wgetparent(
+		const WINDOW *z)
+		{ return(*(WINDOW **)0); }
+
+#undef is_cleared
+NCURSES_BOOL is_cleared(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_idcok
+NCURSES_BOOL is_idcok(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_idlok
+NCURSES_BOOL is_idlok(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_immedok
+NCURSES_BOOL is_immedok(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_keypad
+NCURSES_BOOL is_keypad(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_leaveok
+NCURSES_BOOL is_leaveok(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_nodelay
+NCURSES_BOOL is_nodelay(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_notimeout
+NCURSES_BOOL is_notimeout(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_pad
+NCURSES_BOOL is_pad(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_scrollok
+NCURSES_BOOL is_scrollok(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_subwin
+NCURSES_BOOL is_subwin(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_syncok
+NCURSES_BOOL is_syncok(
+		const WINDOW *z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef wgetdelay
+int	wgetdelay(
+		const WINDOW *z)
+		{ return(*(int *)0); }
+
+#undef wgetscrreg
+int	wgetscrreg(
+		const WINDOW *a1,
+		int	*a2,
+		int	*z)
+		{ return(*(int *)0); }
+
+#undef add_wch
+int	add_wch(
+		const cchar_t *z)
+		{ return(*(int *)0); }
+
+#undef add_wchnstr
+int	add_wchnstr(
+		const cchar_t *a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef add_wchstr
+int	add_wchstr(
+		const cchar_t *z)
+		{ return(*(int *)0); }
+
+#undef addnwstr
+int	addnwstr(
+		const wchar_t *a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef addwstr
+int	addwstr(
+		const wchar_t *z)
+		{ return(*(int *)0); }
+
+#undef bkgrnd
+int	bkgrnd(
+		const cchar_t *z)
+		{ return(*(int *)0); }
+
+#undef bkgrndset
+void	bkgrndset(
+		const cchar_t *z)
+		{ /* void */ }
+
+#undef border_set
+int	border_set(
+		const cchar_t *a1,
+		const cchar_t *a2,
+		const cchar_t *a3,
+		const cchar_t *a4,
+		const cchar_t *a5,
+		const cchar_t *a6,
+		const cchar_t *a7,
+		const cchar_t *z)
+		{ return(*(int *)0); }
+
+#undef box_set
+int	box_set(
+		WINDOW	*a1,
+		const cchar_t *a2,
+		const cchar_t *z)
+		{ return(*(int *)0); }
+
+#undef echo_wchar
+int	echo_wchar(
+		const cchar_t *z)
+		{ return(*(int *)0); }
+
+#undef get_wch
+int	get_wch(
+		wint_t	*z)
+		{ return(*(int *)0); }
+
+#undef get_wstr
+int	get_wstr(
+		wint_t	*z)
+		{ return(*(int *)0); }
+
+#undef getbkgrnd
+int	getbkgrnd(
+		cchar_t	*z)
+		{ return(*(int *)0); }
+
+#undef getn_wstr
+int	getn_wstr(
+		wint_t	*a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef hline_set
+int	hline_set(
+		const cchar_t *a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef in_wch
+int	in_wch(
+		cchar_t	*z)
+		{ return(*(int *)0); }
+
+#undef in_wchnstr
+int	in_wchnstr(
+		cchar_t	*a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef in_wchstr
+int	in_wchstr(
+		cchar_t	*z)
+		{ return(*(int *)0); }
+
+#undef innwstr
+int	innwstr(
+		wchar_t	*a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef ins_nwstr
+int	ins_nwstr(
+		const wchar_t *a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef ins_wch
+int	ins_wch(
+		const cchar_t *z)
+		{ return(*(int *)0); }
+
+#undef ins_wstr
+int	ins_wstr(
+		const wchar_t *z)
+		{ return(*(int *)0); }
+
+#undef inwstr
+int	inwstr(
+		wchar_t	*z)
+		{ return(*(int *)0); }
+
+#undef mvadd_wch
+int	mvadd_wch(
+		int	a1,
+		int	a2,
+		const cchar_t *z)
+		{ return(*(int *)0); }
+
+#undef mvadd_wchnstr
+int	mvadd_wchnstr(
+		int	a1,
+		int	a2,
+		const cchar_t *a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvadd_wchstr
+int	mvadd_wchstr(
+		int	a1,
+		int	a2,
+		const cchar_t *z)
+		{ return(*(int *)0); }
+
+#undef mvaddnwstr
+int	mvaddnwstr(
+		int	a1,
+		int	a2,
+		const wchar_t *a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvaddwstr
+int	mvaddwstr(
+		int	a1,
+		int	a2,
+		const wchar_t *z)
+		{ return(*(int *)0); }
+
+#undef mvget_wch
+int	mvget_wch(
+		int	a1,
+		int	a2,
+		wint_t	*z)
+		{ return(*(int *)0); }
+
+#undef mvget_wstr
+int	mvget_wstr(
+		int	a1,
+		int	a2,
+		wint_t	*z)
+		{ return(*(int *)0); }
+
+#undef mvgetn_wstr
+int	mvgetn_wstr(
+		int	a1,
+		int	a2,
+		wint_t	*a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvhline_set
+int	mvhline_set(
+		int	a1,
+		int	a2,
+		const cchar_t *a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvin_wch
+int	mvin_wch(
+		int	a1,
+		int	a2,
+		cchar_t	*z)
+		{ return(*(int *)0); }
+
+#undef mvin_wchnstr
+int	mvin_wchnstr(
+		int	a1,
+		int	a2,
+		cchar_t	*a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvin_wchstr
+int	mvin_wchstr(
+		int	a1,
+		int	a2,
+		cchar_t	*z)
+		{ return(*(int *)0); }
+
+#undef mvinnwstr
+int	mvinnwstr(
+		int	a1,
+		int	a2,
+		wchar_t	*a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvins_nwstr
+int	mvins_nwstr(
+		int	a1,
+		int	a2,
+		const wchar_t *a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvins_wch
+int	mvins_wch(
+		int	a1,
+		int	a2,
+		const cchar_t *z)
+		{ return(*(int *)0); }
+
+#undef mvins_wstr
+int	mvins_wstr(
+		int	a1,
+		int	a2,
+		const wchar_t *z)
+		{ return(*(int *)0); }
+
+#undef mvinwstr
+int	mvinwstr(
+		int	a1,
+		int	a2,
+		wchar_t	*z)
+		{ return(*(int *)0); }
+
+#undef mvvline_set
+int	mvvline_set(
+		int	a1,
+		int	a2,
+		const cchar_t *a3,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwadd_wch
+int	mvwadd_wch(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const cchar_t *z)
+		{ return(*(int *)0); }
+
+#undef mvwadd_wchnstr
+int	mvwadd_wchnstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const cchar_t *a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwadd_wchstr
+int	mvwadd_wchstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const cchar_t *z)
+		{ return(*(int *)0); }
+
+#undef mvwaddnwstr
+int	mvwaddnwstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const wchar_t *a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwaddwstr
+int	mvwaddwstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const wchar_t *z)
+		{ return(*(int *)0); }
+
+#undef mvwget_wch
+int	mvwget_wch(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		wint_t	*z)
+		{ return(*(int *)0); }
+
+#undef mvwget_wstr
+int	mvwget_wstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		wint_t	*z)
+		{ return(*(int *)0); }
+
+#undef mvwgetn_wstr
+int	mvwgetn_wstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		wint_t	*a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwhline_set
+int	mvwhline_set(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const cchar_t *a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwin_wch
+int	mvwin_wch(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		cchar_t	*z)
+		{ return(*(int *)0); }
+
+#undef mvwin_wchnstr
+int	mvwin_wchnstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		cchar_t	*a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwin_wchstr
+int	mvwin_wchstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		cchar_t	*z)
+		{ return(*(int *)0); }
+
+#undef mvwinnwstr
+int	mvwinnwstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		wchar_t	*a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwins_nwstr
+int	mvwins_nwstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const wchar_t *a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef mvwins_wch
+int	mvwins_wch(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const cchar_t *z)
+		{ return(*(int *)0); }
+
+#undef mvwins_wstr
+int	mvwins_wstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const wchar_t *z)
+		{ return(*(int *)0); }
+
+#undef mvwinwstr
+int	mvwinwstr(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		wchar_t	*z)
+		{ return(*(int *)0); }
+
+#undef mvwvline_set
+int	mvwvline_set(
+		WINDOW	*a1,
+		int	a2,
+		int	a3,
+		const cchar_t *a4,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef vline_set
+int	vline_set(
+		const cchar_t *a1,
+		int	z)
+		{ return(*(int *)0); }
+
+#undef wadd_wchstr
+int	wadd_wchstr(
+		WINDOW	*a1,
+		const cchar_t *z)
+		{ return(*(int *)0); }
+
+#undef waddwstr
+int	waddwstr(
+		WINDOW	*a1,
+		const wchar_t *z)
+		{ return(*(int *)0); }
+
+#undef wget_wstr
+int	wget_wstr(
+		WINDOW	*a1,
+		wint_t	*z)
+		{ return(*(int *)0); }
+
+#undef wgetbkgrnd
+int	wgetbkgrnd(
+		WINDOW	*a1,
+		cchar_t	*z)
+		{ return(*(int *)0); }
+
+#undef win_wchstr
+int	win_wchstr(
+		WINDOW	*a1,
+		cchar_t	*z)
+		{ return(*(int *)0); }
+
+#undef wins_wstr
+int	wins_wstr(
+		WINDOW	*a1,
+		const wchar_t *z)
+		{ return(*(int *)0); }
+
+#undef mouse_trafo
+NCURSES_BOOL mouse_trafo(
+		int	*a1,
+		int	*a2,
+		NCURSES_BOOL z)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./base/lib_getch.c */
+
+#undef ESCDELAY
+int	ESCDELAY;
+
+#undef set_escdelay_sp
+int	set_escdelay_sp(
+		SCREEN	*sp,
+		int	value)
+		{ return(*(int *)0); }
+
+#undef set_escdelay
+int	set_escdelay(
+		int	value)
+		{ return(*(int *)0); }
+
+#undef get_escdelay_sp
+int	get_escdelay_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef get_escdelay
+int	get_escdelay(void)
+		{ return(*(int *)0); }
+
+#undef _nc_wgetch
+int	_nc_wgetch(
+		WINDOW	*win,
+		int	*result,
+		int	use_meta)
+		{ return(*(int *)0); }
+
+#undef wgetch
+int	wgetch(
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+/* ./base/lib_getstr.c */
+
+#undef wgetnstr
+int	wgetnstr(
+		WINDOW	*win,
+		char	*str,
+		int	maxlen)
+		{ return(*(int *)0); }
+
+/* ./base/lib_hline.c */
+
+#undef whline
+int	whline(
+		WINDOW	*win,
+		chtype	ch,
+		int	n)
+		{ return(*(int *)0); }
+
+/* ./base/lib_immedok.c */
+
+#undef immedok
+void	immedok(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ /* void */ }
+
+/* ./base/lib_inchstr.c */
+
+#undef winchnstr
+int	winchnstr(
+		WINDOW	*win,
+		chtype	*str,
+		int	n)
+		{ return(*(int *)0); }
+
+/* ./base/lib_initscr.c */
+
+#undef initscr
+WINDOW	*initscr(void)
+		{ return(*(WINDOW **)0); }
+
+/* ./base/lib_insch.c */
+
+#undef _nc_insert_ch
+int	_nc_insert_ch(
+		SCREEN	*sp,
+		WINDOW	*win,
+		chtype	ch)
+		{ return(*(int *)0); }
+
+#undef winsch
+int	winsch(
+		WINDOW	*win,
+		chtype	c)
+		{ return(*(int *)0); }
+
+/* ./base/lib_insdel.c */
+
+#undef winsdelln
+int	winsdelln(
+		WINDOW	*win,
+		int	n)
+		{ return(*(int *)0); }
+
+/* ./base/lib_insnstr.c */
+
+#undef winsnstr
+int	winsnstr(
+		WINDOW	*win,
+		const char *s,
+		int	n)
+		{ return(*(int *)0); }
+
+/* ./base/lib_instr.c */
+
+#undef winnstr
+int	winnstr(
+		WINDOW	*win,
+		char	*str,
+		int	n)
+		{ return(*(int *)0); }
+
+/* ./base/lib_isendwin.c */
+
+#undef isendwin_sp
+NCURSES_BOOL isendwin_sp(
+		SCREEN	*sp)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef isendwin
+NCURSES_BOOL isendwin(void)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./base/lib_leaveok.c */
+
+#undef leaveok
+int	leaveok(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+/* ./base/lib_mouse.c */
+
+#undef getmouse_sp
+int	getmouse_sp(
+		SCREEN	*sp,
+		MEVENT	*aevent)
+		{ return(*(int *)0); }
+
+#undef getmouse
+int	getmouse(
+		MEVENT	*aevent)
+		{ return(*(int *)0); }
+
+#undef ungetmouse_sp
+int	ungetmouse_sp(
+		SCREEN	*sp,
+		MEVENT	*aevent)
+		{ return(*(int *)0); }
+
+#undef ungetmouse
+int	ungetmouse(
+		MEVENT	*aevent)
+		{ return(*(int *)0); }
+
+#undef mousemask_sp
+mmask_t	mousemask_sp(
+		SCREEN	*sp,
+		mmask_t	newmask,
+		mmask_t	*oldmask)
+		{ return(*(mmask_t *)0); }
+
+#undef mousemask
+mmask_t	mousemask(
+		mmask_t	newmask,
+		mmask_t	*oldmask)
+		{ return(*(mmask_t *)0); }
+
+#undef wenclose
+NCURSES_BOOL wenclose(
+		const WINDOW *win,
+		int	y,
+		int	x)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef mouseinterval_sp
+int	mouseinterval_sp(
+		SCREEN	*sp,
+		int	maxclick)
+		{ return(*(int *)0); }
+
+#undef mouseinterval
+int	mouseinterval(
+		int	maxclick)
+		{ return(*(int *)0); }
+
+#undef _nc_has_mouse
+NCURSES_BOOL _nc_has_mouse(
+		SCREEN	*sp)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef has_mouse_sp
+NCURSES_BOOL has_mouse_sp(
+		SCREEN	*sp)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef has_mouse
+NCURSES_BOOL has_mouse(void)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef wmouse_trafo
+NCURSES_BOOL wmouse_trafo(
+		const WINDOW *win,
+		int	*pY,
+		int	*pX,
+		NCURSES_BOOL to_screen)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./base/lib_move.c */
+
+#undef wmove
+int	wmove(
+		WINDOW	*win,
+		int	y,
+		int	x)
+		{ return(*(int *)0); }
+
+/* ./tty/lib_mvcur.c */
+
+#undef _nc_msec_cost_sp
+int	_nc_msec_cost_sp(
+		SCREEN	*sp,
+		const char *const cap,
+		int	affcnt)
+		{ return(*(int *)0); }
+
+#undef _nc_msec_cost
+int	_nc_msec_cost(
+		const char *const cap,
+		int	affcnt)
+		{ return(*(int *)0); }
+
+#undef _nc_mvcur_resume_sp
+void	_nc_mvcur_resume_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_mvcur_resume
+void	_nc_mvcur_resume(void)
+		{ /* void */ }
+
+#undef _nc_mvcur_init_sp
+void	_nc_mvcur_init_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_mvcur_init
+void	_nc_mvcur_init(void)
+		{ /* void */ }
+
+#undef _nc_mvcur_wrap_sp
+void	_nc_mvcur_wrap_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_mvcur_wrap
+void	_nc_mvcur_wrap(void)
+		{ /* void */ }
+
+#undef _nc_mvcur_sp
+int	_nc_mvcur_sp(
+		SCREEN	*sp,
+		int	yold,
+		int	xold,
+		int	ynew,
+		int	xnew)
+		{ return(*(int *)0); }
+
+#undef _nc_mvcur
+int	_nc_mvcur(
+		int	yold,
+		int	xold,
+		int	ynew,
+		int	xnew)
+		{ return(*(int *)0); }
+
+#undef mvcur_sp
+int	mvcur_sp(
+		SCREEN	*sp,
+		int	yold,
+		int	xold,
+		int	ynew,
+		int	xnew)
+		{ return(*(int *)0); }
+
+#undef mvcur
+int	mvcur(
+		int	yold,
+		int	xold,
+		int	ynew,
+		int	xnew)
+		{ return(*(int *)0); }
+
+#undef _nc_optimize_enable
+int	_nc_optimize_enable;
+
+/* ./base/lib_mvwin.c */
+
+#undef mvwin
+int	mvwin(
+		WINDOW	*win,
+		int	by,
+		int	bx)
+		{ return(*(int *)0); }
+
+/* ./base/lib_newterm.c */
+
+#undef filter_sp
+void	filter_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef filter
+void	filter(void)
+		{ /* void */ }
+
+#undef nofilter_sp
+void	nofilter_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef nofilter
+void	nofilter(void)
+		{ /* void */ }
+
+#undef newterm_sp
+SCREEN	*newterm_sp(
+		SCREEN	*sp,
+		const char *name,
+		FILE	*ofp,
+		FILE	*ifp)
+		{ return(*(SCREEN **)0); }
+
+#undef newterm
+SCREEN	*newterm(
+		const char *name,
+		FILE	*ofp,
+		FILE	*ifp)
+		{ return(*(SCREEN **)0); }
+
+/* ./base/lib_newwin.c */
+
+#undef _nc_freewin
+int	_nc_freewin(
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+#undef newwin_sp
+WINDOW	*newwin_sp(
+		SCREEN	*sp,
+		int	num_lines,
+		int	num_columns,
+		int	begy,
+		int	begx)
+		{ return(*(WINDOW **)0); }
+
+#undef newwin
+WINDOW	*newwin(
+		int	num_lines,
+		int	num_columns,
+		int	begy,
+		int	begx)
+		{ return(*(WINDOW **)0); }
+
+#undef derwin
+WINDOW	*derwin(
+		WINDOW	*orig,
+		int	num_lines,
+		int	num_columns,
+		int	begy,
+		int	begx)
+		{ return(*(WINDOW **)0); }
+
+#undef subwin
+WINDOW	*subwin(
+		WINDOW	*w,
+		int	l,
+		int	c,
+		int	y,
+		int	x)
+		{ return(*(WINDOW **)0); }
+
+#undef _nc_makenew_sp
+WINDOW	*_nc_makenew_sp(
+		SCREEN	*sp,
+		int	num_lines,
+		int	num_columns,
+		int	begy,
+		int	begx,
+		int	flags)
+		{ return(*(WINDOW **)0); }
+
+#undef _nc_curscr_of
+WINDOW	*_nc_curscr_of(
+		SCREEN	*sp)
+		{ return(*(WINDOW **)0); }
+
+#undef _nc_newscr_of
+WINDOW	*_nc_newscr_of(
+		SCREEN	*sp)
+		{ return(*(WINDOW **)0); }
+
+#undef _nc_stdscr_of
+WINDOW	*_nc_stdscr_of(
+		SCREEN	*sp)
+		{ return(*(WINDOW **)0); }
+
+/* ./base/lib_nl.c */
+
+#undef nl_sp
+int	nl_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef nl
+int	nl(void)
+		{ return(*(int *)0); }
+
+#undef nonl_sp
+int	nonl_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef nonl
+int	nonl(void)
+		{ return(*(int *)0); }
+
+/* ./base/lib_overlay.c */
+
+#undef overlay
+int	overlay(
+		const WINDOW *win1,
+		WINDOW	*win2)
+		{ return(*(int *)0); }
+
+#undef overwrite
+int	overwrite(
+		const WINDOW *win1,
+		WINDOW	*win2)
+		{ return(*(int *)0); }
+
+#undef copywin
+int	copywin(
+		const WINDOW *src,
+		WINDOW	*dst,
+		int	sminrow,
+		int	smincol,
+		int	dminrow,
+		int	dmincol,
+		int	dmaxrow,
+		int	dmaxcol,
+		int	over)
+		{ return(*(int *)0); }
+
+/* ./base/lib_pad.c */
+
+#undef newpad_sp
+WINDOW	*newpad_sp(
+		SCREEN	*sp,
+		int	l,
+		int	c)
+		{ return(*(WINDOW **)0); }
+
+#undef newpad
+WINDOW	*newpad(
+		int	l,
+		int	c)
+		{ return(*(WINDOW **)0); }
+
+#undef subpad
+WINDOW	*subpad(
+		WINDOW	*orig,
+		int	l,
+		int	c,
+		int	begy,
+		int	begx)
+		{ return(*(WINDOW **)0); }
+
+#undef prefresh
+int	prefresh(
+		WINDOW	*win,
+		int	pminrow,
+		int	pmincol,
+		int	sminrow,
+		int	smincol,
+		int	smaxrow,
+		int	smaxcol)
+		{ return(*(int *)0); }
+
+#undef pnoutrefresh
+int	pnoutrefresh(
+		WINDOW	*win,
+		int	pminrow,
+		int	pmincol,
+		int	sminrow,
+		int	smincol,
+		int	smaxrow,
+		int	smaxcol)
+		{ return(*(int *)0); }
+
+#undef pechochar
+int	pechochar(
+		WINDOW	*pad,
+		const chtype ch)
+		{ return(*(int *)0); }
+
+/* ./base/lib_printw.c */
+
+#undef printw
+int	printw(
+		const char *fmt,
+		...)
+		{ return(*(int *)0); }
+
+#undef wprintw
+int	wprintw(
+		WINDOW	*win,
+		const char *fmt,
+		...)
+		{ return(*(int *)0); }
+
+#undef mvprintw
+int	mvprintw(
+		int	y,
+		int	x,
+		const char *fmt,
+		...)
+		{ return(*(int *)0); }
+
+#undef mvwprintw
+int	mvwprintw(
+		WINDOW	*win,
+		int	y,
+		int	x,
+		const char *fmt,
+		...)
+		{ return(*(int *)0); }
+
+#undef vwprintw
+int	vwprintw(
+		WINDOW	*win,
+		const char *fmt,
+		va_list	argp)
+		{ return(*(int *)0); }
+
+#undef vw_printw
+int	vw_printw(
+		WINDOW	*win,
+		const char *fmt,
+		va_list	argp)
+		{ return(*(int *)0); }
+
+/* ./base/lib_redrawln.c */
+
+#undef wredrawln
+int	wredrawln(
+		WINDOW	*win,
+		int	beg,
+		int	num)
+		{ return(*(int *)0); }
+
+/* ./base/lib_refresh.c */
+
+#undef wrefresh
+int	wrefresh(
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+#undef wnoutrefresh
+int	wnoutrefresh(
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+/* ./base/lib_restart.c */
+
+#undef restartterm_sp
+int	restartterm_sp(
+		SCREEN	*sp,
+		const char *termp,
+		int	filenum,
+		int	*errret)
+		{ return(*(int *)0); }
+
+#undef restartterm
+int	restartterm(
+		const char *termp,
+		int	filenum,
+		int	*errret)
+		{ return(*(int *)0); }
+
+/* ./base/lib_scanw.c */
+
+#undef vwscanw
+int	vwscanw(
+		WINDOW	*win,
+		const char *fmt,
+		va_list	argp)
+		{ return(*(int *)0); }
+
+#undef vw_scanw
+int	vw_scanw(
+		WINDOW	*win,
+		const char *fmt,
+		va_list	argp)
+		{ return(*(int *)0); }
+
+#undef scanw
+int	scanw(
+		const char *fmt,
+		...)
+		{ return(*(int *)0); }
+
+#undef wscanw
+int	wscanw(
+		WINDOW	*win,
+		const char *fmt,
+		...)
+		{ return(*(int *)0); }
+
+#undef mvscanw
+int	mvscanw(
+		int	y,
+		int	x,
+		const char *fmt,
+		...)
+		{ return(*(int *)0); }
+
+#undef mvwscanw
+int	mvwscanw(
+		WINDOW	*win,
+		int	y,
+		int	x,
+		const char *fmt,
+		...)
+		{ return(*(int *)0); }
+
+/* ./base/lib_screen.c */
+
+#undef getwin_sp
+WINDOW	*getwin_sp(
+		SCREEN	*sp,
+		FILE	*filep)
+		{ return(*(WINDOW **)0); }
+
+#undef getwin
+WINDOW	*getwin(
+		FILE	*filep)
+		{ return(*(WINDOW **)0); }
+
+#undef putwin
+int	putwin(
+		WINDOW	*win,
+		FILE	*filep)
+		{ return(*(int *)0); }
+
+#undef scr_restore_sp
+int	scr_restore_sp(
+		SCREEN	*sp,
+		const char *file)
+		{ return(*(int *)0); }
+
+#undef scr_restore
+int	scr_restore(
+		const char *file)
+		{ return(*(int *)0); }
+
+#undef scr_dump
+int	scr_dump(
+		const char *file)
+		{ return(*(int *)0); }
+
+#undef scr_init_sp
+int	scr_init_sp(
+		SCREEN	*sp,
+		const char *file)
+		{ return(*(int *)0); }
+
+#undef scr_init
+int	scr_init(
+		const char *file)
+		{ return(*(int *)0); }
+
+#undef scr_set_sp
+int	scr_set_sp(
+		SCREEN	*sp,
+		const char *file)
+		{ return(*(int *)0); }
+
+#undef scr_set
+int	scr_set(
+		const char *file)
+		{ return(*(int *)0); }
+
+/* ./base/lib_scroll.c */
+
+#undef _nc_scroll_window
+void	_nc_scroll_window(
+		WINDOW	*win,
+		int const n,
+		int const top,
+		int const bottom,
+		cchar_t	blank)
+		{ /* void */ }
+
+#undef wscrl
+int	wscrl(
+		WINDOW	*win,
+		int	n)
+		{ return(*(int *)0); }
+
+/* ./base/lib_scrollok.c */
+
+#undef scrollok
+int	scrollok(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+/* ./base/lib_scrreg.c */
+
+#undef wsetscrreg
+int	wsetscrreg(
+		WINDOW	*win,
+		int	top,
+		int	bottom)
+		{ return(*(int *)0); }
+
+/* ./base/lib_set_term.c */
+
+#undef set_term
+SCREEN	*set_term(
+		SCREEN	*screenp)
+		{ return(*(SCREEN **)0); }
+
+#undef delscreen
+void	delscreen(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_setupscreen_sp
+int	_nc_setupscreen_sp(
+		SCREEN	**spp,
+		int	slines,
+		int	scolumns,
+		FILE	*output,
+		int	filtered,
+		int	slk_format)
+		{ return(*(int *)0); }
+
+#undef _nc_setupscreen
+int	_nc_setupscreen(
+		int	slines,
+		int	scolumns,
+		FILE	*output,
+		int	filtered,
+		int	slk_format)
+		{ return(*(int *)0); }
+
+#undef _nc_ripoffline_sp
+int	_nc_ripoffline_sp(
+		SCREEN	*sp,
+		int	line,
+		int	(*init)(
+		WINDOW	*p1,
+		int	p2))
+		{ return(*(int *)0); }
+
+#undef _nc_ripoffline
+int	_nc_ripoffline(
+		int	line,
+		int	(*init)(
+		WINDOW	*p1,
+		int	p2))
+		{ return(*(int *)0); }
+
+#undef ripoffline_sp
+int	ripoffline_sp(
+		SCREEN	*sp,
+		int	line,
+		int	(*init)(
+		WINDOW	*p1,
+		int	p2))
+		{ return(*(int *)0); }
+
+#undef ripoffline
+int	ripoffline(
+		int	line,
+		int	(*init)(
+		WINDOW	*p1,
+		int	p2))
+		{ return(*(int *)0); }
+
+/* ./base/lib_slk.c */
+
+#undef _nc_format_slks
+int	_nc_format_slks(
+		SCREEN	*sp,
+		int	cols)
+		{ return(*(int *)0); }
+
+#undef _nc_slk_initialize
+int	_nc_slk_initialize(
+		WINDOW	*stwin,
+		int	cols)
+		{ return(*(int *)0); }
+
+#undef slk_restore_sp
+int	slk_restore_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef slk_restore
+int	slk_restore(void)
+		{ return(*(int *)0); }
+
+/* ./base/lib_slkatr_set.c */
+
+#undef slk_attr_set_sp
+int	slk_attr_set_sp(
+		SCREEN	*sp,
+		const attr_t attr,
+		short	pair_arg,
+		void	*opts)
+		{ return(*(int *)0); }
+
+#undef slk_attr_set
+int	slk_attr_set(
+		const attr_t attr,
+		short	pair_arg,
+		void	*opts)
+		{ return(*(int *)0); }
+
+/* ./base/lib_slkatrof.c */
+
+#undef slk_attroff_sp
+int	slk_attroff_sp(
+		SCREEN	*sp,
+		const chtype attr)
+		{ return(*(int *)0); }
+
+#undef slk_attroff
+int	slk_attroff(
+		const chtype attr)
+		{ return(*(int *)0); }
+
+/* ./base/lib_slkatron.c */
+
+#undef slk_attron_sp
+int	slk_attron_sp(
+		SCREEN	*sp,
+		const chtype attr)
+		{ return(*(int *)0); }
+
+#undef slk_attron
+int	slk_attron(
+		const chtype attr)
+		{ return(*(int *)0); }
+
+/* ./base/lib_slkatrset.c */
+
+#undef slk_attrset_sp
+int	slk_attrset_sp(
+		SCREEN	*sp,
+		const chtype attr)
+		{ return(*(int *)0); }
+
+#undef slk_attrset
+int	slk_attrset(
+		const chtype attr)
+		{ return(*(int *)0); }
+
+/* ./base/lib_slkattr.c */
+
+#undef slk_attr_sp
+attr_t	slk_attr_sp(
+		SCREEN	*sp)
+		{ return(*(attr_t *)0); }
+
+#undef slk_attr
+attr_t	slk_attr(void)
+		{ return(*(attr_t *)0); }
+
+/* ./base/lib_slkclear.c */
+
+#undef slk_clear_sp
+int	slk_clear_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef slk_clear
+int	slk_clear(void)
+		{ return(*(int *)0); }
+
+/* ./base/lib_slkcolor.c */
+
+#undef slk_color_sp
+int	slk_color_sp(
+		SCREEN	*sp,
+		short	pair_arg)
+		{ return(*(int *)0); }
+
+#undef slk_color
+int	slk_color(
+		short	pair_arg)
+		{ return(*(int *)0); }
+
+#undef extended_slk_color_sp
+int	extended_slk_color_sp(
+		SCREEN	*sp,
+		int	pair_arg)
+		{ return(*(int *)0); }
+
+#undef extended_slk_color
+int	extended_slk_color(
+		int	pair_arg)
+		{ return(*(int *)0); }
+
+/* ./base/lib_slkinit.c */
+
+#undef slk_init_sp
+int	slk_init_sp(
+		SCREEN	*sp,
+		int	format)
+		{ return(*(int *)0); }
+
+#undef slk_init
+int	slk_init(
+		int	format)
+		{ return(*(int *)0); }
+
+/* ./base/lib_slklab.c */
+
+#undef slk_label_sp
+char	*slk_label_sp(
+		SCREEN	*sp,
+		int	n)
+		{ return(*(char **)0); }
+
+#undef slk_label
+char	*slk_label(
+		int	n)
+		{ return(*(char **)0); }
+
+/* ./base/lib_slkrefr.c */
+
+#undef slk_noutrefresh_sp
+int	slk_noutrefresh_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef slk_noutrefresh
+int	slk_noutrefresh(void)
+		{ return(*(int *)0); }
+
+#undef slk_refresh_sp
+int	slk_refresh_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef slk_refresh
+int	slk_refresh(void)
+		{ return(*(int *)0); }
+
+/* ./base/lib_slkset.c */
+
+#undef slk_set_sp
+int	slk_set_sp(
+		SCREEN	*sp,
+		int	i,
+		const char *astr,
+		int	format)
+		{ return(*(int *)0); }
+
+#undef slk_set
+int	slk_set(
+		int	i,
+		const char *astr,
+		int	format)
+		{ return(*(int *)0); }
+
+/* ./base/lib_slktouch.c */
+
+#undef slk_touch_sp
+int	slk_touch_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef slk_touch
+int	slk_touch(void)
+		{ return(*(int *)0); }
+
+/* ./base/lib_touch.c */
+
+#undef is_linetouched
+NCURSES_BOOL is_linetouched(
+		WINDOW	*win,
+		int	line)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_wintouched
+NCURSES_BOOL is_wintouched(
+		WINDOW	*win)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef wtouchln
+int	wtouchln(
+		WINDOW	*win,
+		int	y,
+		int	n,
+		int	changed)
+		{ return(*(int *)0); }
+
+/* ./trace/lib_tracedmp.c */
+
+#undef _tracedump
+void	_tracedump(
+		const char *name,
+		WINDOW	*win)
+		{ /* void */ }
+
+/* ./trace/lib_tracemse.c */
+
+#undef _nc_trace_mmask_t
+char	*_nc_trace_mmask_t(
+		SCREEN	*sp,
+		mmask_t	code)
+		{ return(*(char **)0); }
+
+#undef _nc_tracemouse
+char	*_nc_tracemouse(
+		SCREEN	*sp,
+		MEVENT const *ep)
+		{ return(*(char **)0); }
+
+#undef _nc_retrace_mmask_t
+mmask_t	_nc_retrace_mmask_t(
+		SCREEN	*sp,
+		mmask_t	code)
+		{ return(*(mmask_t *)0); }
+
+#undef _tracemouse
+char	*_tracemouse(
+		MEVENT const *ep)
+		{ return(*(char **)0); }
+
+/* ./tty/lib_tstp.c */
+
+#undef _nc_signal_handler
+void	_nc_signal_handler(
+		int	enable)
+		{ /* void */ }
+
+/* ./base/lib_ungetch.c */
+
+#undef _nc_fifo_dump
+void	_nc_fifo_dump(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef ungetch_sp
+int	ungetch_sp(
+		SCREEN	*sp,
+		int	ch)
+		{ return(*(int *)0); }
+
+#undef ungetch
+int	ungetch(
+		int	ch)
+		{ return(*(int *)0); }
+
+/* ./tty/lib_vidattr.c */
+
+#undef vidputs_sp
+int	vidputs_sp(
+		SCREEN	*sp,
+		chtype	newmode,
+		NCURSES_OUTC_sp outc)
+		{ return(*(int *)0); }
+
+#undef vidputs
+int	vidputs(
+		chtype	newmode,
+		NCURSES_OUTC outc)
+		{ return(*(int *)0); }
+
+#undef vidattr_sp
+int	vidattr_sp(
+		SCREEN	*sp,
+		chtype	newmode)
+		{ return(*(int *)0); }
+
+#undef vidattr
+int	vidattr(
+		chtype	newmode)
+		{ return(*(int *)0); }
+
+#undef termattrs_sp
+chtype	termattrs_sp(
+		SCREEN	*sp)
+		{ return(*(chtype *)0); }
+
+#undef termattrs
+chtype	termattrs(void)
+		{ return(*(chtype *)0); }
+
+/* ./base/lib_vline.c */
+
+#undef wvline
+int	wvline(
+		WINDOW	*win,
+		chtype	ch,
+		int	n)
+		{ return(*(int *)0); }
+
+/* ./base/lib_wattroff.c */
+
+#undef wattr_off
+int	wattr_off(
+		WINDOW	*win,
+		attr_t	at,
+		void	*opts)
+		{ return(*(int *)0); }
+
+/* ./base/lib_wattron.c */
+
+#undef wattr_on
+int	wattr_on(
+		WINDOW	*win,
+		attr_t	at,
+		void	*opts)
+		{ return(*(int *)0); }
+
+/* ./base/lib_winch.c */
+
+#undef winch
+chtype	winch(
+		WINDOW	*win)
+		{ return(*(chtype *)0); }
+
+/* ./base/lib_window.c */
+
+#undef _nc_synchook
+void	_nc_synchook(
+		WINDOW	*win)
+		{ /* void */ }
+
+#undef mvderwin
+int	mvderwin(
+		WINDOW	*win,
+		int	y,
+		int	x)
+		{ return(*(int *)0); }
+
+#undef syncok
+int	syncok(
+		WINDOW	*win,
+		NCURSES_BOOL bf)
+		{ return(*(int *)0); }
+
+#undef wsyncup
+void	wsyncup(
+		WINDOW	*win)
+		{ /* void */ }
+
+#undef wsyncdown
+void	wsyncdown(
+		WINDOW	*win)
+		{ /* void */ }
+
+#undef wcursyncup
+void	wcursyncup(
+		WINDOW	*win)
+		{ /* void */ }
+
+#undef dupwin
+WINDOW	*dupwin(
+		WINDOW	*win)
+		{ return(*(WINDOW **)0); }
+
+/* ./base/nc_panel.c */
+
+#undef _nc_panelhook_sp
+struct panelhook *_nc_panelhook_sp(
+		SCREEN	*sp)
+		{ return(*(struct panelhook **)0); }
+
+#undef _nc_panelhook
+struct panelhook *_nc_panelhook(void)
+		{ return(*(struct panelhook **)0); }
+
+/* ./base/safe_sprintf.c */
+
+#undef _nc_printf_string_sp
+char	*_nc_printf_string_sp(
+		SCREEN	*sp,
+		const char *fmt,
+		va_list	ap)
+		{ return(*(char **)0); }
+
+#undef _nc_printf_string
+char	*_nc_printf_string(
+		const char *fmt,
+		va_list	ap)
+		{ return(*(char **)0); }
+
+/* ./tty/tty_update.c */
+
+#undef doupdate_sp
+int	doupdate_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef doupdate
+int	doupdate(void)
+		{ return(*(int *)0); }
+
+#undef _nc_scrolln_sp
+int	_nc_scrolln_sp(
+		SCREEN	*sp,
+		int	n,
+		int	top,
+		int	bot,
+		int	maxy)
+		{ return(*(int *)0); }
+
+#undef _nc_scrolln
+int	_nc_scrolln(
+		int	n,
+		int	top,
+		int	bot,
+		int	maxy)
+		{ return(*(int *)0); }
+
+#undef _nc_screen_resume_sp
+void	_nc_screen_resume_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_screen_resume
+void	_nc_screen_resume(void)
+		{ /* void */ }
+
+#undef _nc_screen_init_sp
+void	_nc_screen_init_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_screen_init
+void	_nc_screen_init(void)
+		{ /* void */ }
+
+#undef _nc_screen_wrap_sp
+void	_nc_screen_wrap_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_screen_wrap
+void	_nc_screen_wrap(void)
+		{ /* void */ }
+
+#undef _nc_do_xmc_glitch_sp
+void	_nc_do_xmc_glitch_sp(
+		SCREEN	*sp,
+		attr_t	previous)
+		{ /* void */ }
+
+#undef _nc_do_xmc_glitch
+void	_nc_do_xmc_glitch(
+		attr_t	previous)
+		{ /* void */ }
+
+/* ./trace/varargs.c */
+
+#undef _nc_varargs
+char	*_nc_varargs(
+		const char *fmt,
+		va_list	ap)
+		{ return(*(char **)0); }
+
+/* ./base/vsscanf.c */
+
+#undef _nc_vsscanf
+void	_nc_vsscanf(void)
+		{ /* void */ }
+
+/* ./base/lib_freeall.c */
+
+#undef _nc_freeall
+void	_nc_freeall(void)
+		{ /* void */ }
+
+#undef _nc_free_and_exit_sp
+void	_nc_free_and_exit_sp(
+		SCREEN	*sp,
+		int	code)
+		{ /* void */ }
+
+#undef _nc_free_and_exit
+void	_nc_free_and_exit(
+		int	code)
+		{ /* void */ }
+
+#undef exit_curses
+void	exit_curses(
+		int	code)
+		{ /* void */ }
+
+/* ./widechar/charable.c */
+
+#undef _nc_is_charable
+NCURSES_BOOL _nc_is_charable(
+		wchar_t	ch)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_to_char
+int	_nc_to_char(
+		wint_t	ch)
+		{ return(*(int *)0); }
+
+#undef _nc_to_widechar
+wint_t	_nc_to_widechar(
+		int	ch)
+		{ return(*(wint_t *)0); }
+
+/* ./widechar/lib_add_wch.c */
+
+#undef wadd_wch
+int	wadd_wch(
+		WINDOW	*win,
+		const cchar_t *wch)
+		{ return(*(int *)0); }
+
+#undef wecho_wchar
+int	wecho_wchar(
+		WINDOW	*win,
+		const cchar_t *wch)
+		{ return(*(int *)0); }
+
+/* ./widechar/lib_box_set.c */
+
+#undef wborder_set
+int	wborder_set(
+		WINDOW	*win,
+		const cchar_t *ls,
+		const cchar_t *rs,
+		const cchar_t *ts,
+		const cchar_t *bs,
+		const cchar_t *tl,
+		const cchar_t *tr,
+		const cchar_t *bl,
+		const cchar_t *br)
+		{ return(*(int *)0); }
+
+/* ./widechar/lib_cchar.c */
+
+#undef setcchar
+int	setcchar(
+		cchar_t	*wcval,
+		const wchar_t *wch,
+		const attr_t attrs,
+		short	pair_arg,
+		const void *opts)
+		{ return(*(int *)0); }
+
+#undef getcchar
+int	getcchar(
+		const cchar_t *wcval,
+		wchar_t	*wch,
+		attr_t	*attrs,
+		short	*pair_arg,
+		void	*opts)
+		{ return(*(int *)0); }
+
+/* ./widechar/lib_erasewchar.c */
+
+#undef erasewchar_sp
+int	erasewchar_sp(
+		SCREEN	*sp,
+		wchar_t	*wch)
+		{ return(*(int *)0); }
+
+#undef erasewchar
+int	erasewchar(
+		wchar_t	*wch)
+		{ return(*(int *)0); }
+
+#undef killwchar_sp
+int	killwchar_sp(
+		SCREEN	*sp,
+		wchar_t	*wch)
+		{ return(*(int *)0); }
+
+#undef killwchar
+int	killwchar(
+		wchar_t	*wch)
+		{ return(*(int *)0); }
+
+/* ./widechar/lib_get_wch.c */
+
+#undef wget_wch
+int	wget_wch(
+		WINDOW	*win,
+		wint_t	*result)
+		{ return(*(int *)0); }
+
+/* ./widechar/lib_get_wstr.c */
+
+#undef wgetn_wstr
+int	wgetn_wstr(
+		WINDOW	*win,
+		wint_t	*str,
+		int	maxlen)
+		{ return(*(int *)0); }
+
+/* ./widechar/lib_hline_set.c */
+
+#undef whline_set
+int	whline_set(
+		WINDOW	*win,
+		const cchar_t *ch,
+		int	n)
+		{ return(*(int *)0); }
+
+/* ./widechar/lib_in_wch.c */
+
+#undef win_wch
+int	win_wch(
+		WINDOW	*win,
+		cchar_t	*wcval)
+		{ return(*(int *)0); }
+
+/* ./widechar/lib_in_wchnstr.c */
+
+#undef win_wchnstr
+int	win_wchnstr(
+		WINDOW	*win,
+		cchar_t	*wchstr,
+		int	n)
+		{ return(*(int *)0); }
+
+/* ./widechar/lib_ins_wch.c */
+
+#undef _nc_insert_wch
+int	_nc_insert_wch(
+		WINDOW	*win,
+		const cchar_t *wch)
+		{ return(*(int *)0); }
+
+#undef wins_wch
+int	wins_wch(
+		WINDOW	*win,
+		const cchar_t *wch)
+		{ return(*(int *)0); }
+
+#undef wins_nwstr
+int	wins_nwstr(
+		WINDOW	*win,
+		const wchar_t *wstr,
+		int	n)
+		{ return(*(int *)0); }
+
+/* ./widechar/lib_inwstr.c */
+
+#undef winnwstr
+int	winnwstr(
+		WINDOW	*win,
+		wchar_t	*wstr,
+		int	n)
+		{ return(*(int *)0); }
+
+#undef winwstr
+int	winwstr(
+		WINDOW	*win,
+		wchar_t	*wstr)
+		{ return(*(int *)0); }
+
+/* ./widechar/lib_key_name.c */
+
+#undef key_name
+const char *key_name(
+		wchar_t	c)
+		{ return(*(const char **)0); }
+
+/* ./widechar/lib_pecho_wchar.c */
+
+#undef pecho_wchar
+int	pecho_wchar(
+		WINDOW	*pad,
+		const cchar_t *wch)
+		{ return(*(int *)0); }
+
+/* ./widechar/lib_slk_wset.c */
+
+#undef slk_wset
+int	slk_wset(
+		int	i,
+		const wchar_t *astr,
+		int	format)
+		{ return(*(int *)0); }
+
+/* ./widechar/lib_unget_wch.c */
+
+#undef _nc_wcrtomb
+size_t	_nc_wcrtomb(
+		char	*target,
+		wchar_t	source,
+		mbstate_t *state)
+		{ return(*(size_t *)0); }
+
+#undef unget_wch_sp
+int	unget_wch_sp(
+		SCREEN	*sp,
+		const wchar_t wch)
+		{ return(*(int *)0); }
+
+#undef unget_wch
+int	unget_wch(
+		const wchar_t wch)
+		{ return(*(int *)0); }
+
+/* ./widechar/lib_vid_attr.c */
+
+#undef vid_puts_sp
+int	vid_puts_sp(
+		SCREEN	*sp,
+		attr_t	newmode,
+		short	pair_arg,
+		void	*opts,
+		NCURSES_OUTC_sp outc)
+		{ return(*(int *)0); }
+
+#undef vid_puts
+int	vid_puts(
+		attr_t	newmode,
+		short	pair_arg,
+		void	*opts,
+		NCURSES_OUTC outc)
+		{ return(*(int *)0); }
+
+#undef vid_attr_sp
+int	vid_attr_sp(
+		SCREEN	*sp,
+		attr_t	newmode,
+		short	pair_arg,
+		void	*opts)
+		{ return(*(int *)0); }
+
+#undef vid_attr
+int	vid_attr(
+		attr_t	newmode,
+		short	pair_arg,
+		void	*opts)
+		{ return(*(int *)0); }
+
+#undef term_attrs_sp
+attr_t	term_attrs_sp(
+		SCREEN	*sp)
+		{ return(*(attr_t *)0); }
+
+#undef term_attrs
+attr_t	term_attrs(void)
+		{ return(*(attr_t *)0); }
+
+/* ./widechar/lib_vline_set.c */
+
+#undef wvline_set
+int	wvline_set(
+		WINDOW	*win,
+		const cchar_t *ch,
+		int	n)
+		{ return(*(int *)0); }
+
+/* ./widechar/lib_wacs.c */
+
+#undef _nc_wacs
+cchar_t	*_nc_wacs;
+
+#undef _nc_init_wacs
+void	_nc_init_wacs(void)
+		{ /* void */ }
+
+/* ./widechar/lib_wunctrl.c */
+
+#undef wunctrl_sp
+wchar_t	*wunctrl_sp(
+		SCREEN	*sp,
+		cchar_t	*wc)
+		{ return(*(wchar_t **)0); }
+
+#undef wunctrl
+wchar_t	*wunctrl(
+		cchar_t	*wc)
+		{ return(*(wchar_t **)0); }
+
+/* ./expanded.c */
+
+#undef _nc_toggle_attr_on
+void	_nc_toggle_attr_on(
+		attr_t	*S,
+		attr_t	at)
+		{ /* void */ }
+
+#undef _nc_toggle_attr_off
+void	_nc_toggle_attr_off(
+		attr_t	*S,
+		attr_t	at)
+		{ /* void */ }
+
+#undef _nc_DelCharCost_sp
+int	_nc_DelCharCost_sp(
+		SCREEN	*sp,
+		int	count)
+		{ return(*(int *)0); }
+
+#undef _nc_InsCharCost_sp
+int	_nc_InsCharCost_sp(
+		SCREEN	*sp,
+		int	count)
+		{ return(*(int *)0); }
+
+#undef _nc_UpdateAttrs_sp
+void	_nc_UpdateAttrs_sp(
+		SCREEN	*sp,
+		const cchar_t *c)
+		{ /* void */ }
+
+#undef _nc_DelCharCost
+int	_nc_DelCharCost(
+		int	count)
+		{ return(*(int *)0); }
+
+#undef _nc_InsCharCost
+int	_nc_InsCharCost(
+		int	count)
+		{ return(*(int *)0); }
+
+#undef _nc_UpdateAttrs
+void	_nc_UpdateAttrs(
+		const cchar_t *c)
+		{ /* void */ }
+
+/* ./base/legacy_coding.c */
+
+#undef use_legacy_coding_sp
+int	use_legacy_coding_sp(
+		SCREEN	*sp,
+		int	level)
+		{ return(*(int *)0); }
+
+#undef use_legacy_coding
+int	use_legacy_coding(
+		int	level)
+		{ return(*(int *)0); }
+
+/* ./base/lib_dft_fgbg.c */
+
+#undef use_default_colors_sp
+int	use_default_colors_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef use_default_colors
+int	use_default_colors(void)
+		{ return(*(int *)0); }
+
+#undef assume_default_colors_sp
+int	assume_default_colors_sp(
+		SCREEN	*sp,
+		int	fg,
+		int	bg)
+		{ return(*(int *)0); }
+
+#undef assume_default_colors
+int	assume_default_colors(
+		int	fg,
+		int	bg)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_print.c */
+
+#undef mcprint_sp
+int	mcprint_sp(
+		SCREEN	*sp,
+		char	*data,
+		int	len)
+		{ return(*(int *)0); }
+
+#undef mcprint
+int	mcprint(
+		char	*data,
+		int	len)
+		{ return(*(int *)0); }
+
+/* ./base/new_pair.c */
+
+#undef _nc_free_ordered_pairs
+void	_nc_free_ordered_pairs(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_reset_color_pair
+void	_nc_reset_color_pair(
+		SCREEN	*sp,
+		int	pair,
+		colorpair_t *next)
+		{ /* void */ }
+
+#undef _nc_set_color_pair
+void	_nc_set_color_pair(
+		SCREEN	*sp,
+		int	pair,
+		int	mode)
+		{ /* void */ }
+
+#undef _nc_copy_pairs
+void	_nc_copy_pairs(
+		SCREEN	*sp,
+		colorpair_t *target,
+		colorpair_t *source,
+		int	length)
+		{ /* void */ }
+
+#undef alloc_pair_sp
+int	alloc_pair_sp(
+		SCREEN	*sp,
+		int	fg,
+		int	bg)
+		{ return(*(int *)0); }
+
+#undef find_pair_sp
+int	find_pair_sp(
+		SCREEN	*sp,
+		int	fg,
+		int	bg)
+		{ return(*(int *)0); }
+
+#undef free_pair_sp
+int	free_pair_sp(
+		SCREEN	*sp,
+		int	pair)
+		{ return(*(int *)0); }
+
+#undef alloc_pair
+int	alloc_pair(
+		int	f,
+		int	b)
+		{ return(*(int *)0); }
+
+#undef find_pair
+int	find_pair(
+		int	f,
+		int	b)
+		{ return(*(int *)0); }
+
+#undef free_pair
+int	free_pair(
+		int	pair)
+		{ return(*(int *)0); }
+
+/* ./base/resizeterm.c */
+
+#undef is_term_resized_sp
+NCURSES_BOOL is_term_resized_sp(
+		SCREEN	*sp,
+		int	ToLines,
+		int	ToCols)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef is_term_resized
+NCURSES_BOOL is_term_resized(
+		int	ToLines,
+		int	ToCols)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef resize_term_sp
+int	resize_term_sp(
+		SCREEN	*sp,
+		int	ToLines,
+		int	ToCols)
+		{ return(*(int *)0); }
+
+#undef resize_term
+int	resize_term(
+		int	ToLines,
+		int	ToCols)
+		{ return(*(int *)0); }
+
+#undef resizeterm_sp
+int	resizeterm_sp(
+		SCREEN	*sp,
+		int	ToLines,
+		int	ToCols)
+		{ return(*(int *)0); }
+
+#undef resizeterm
+int	resizeterm(
+		int	ToLines,
+		int	ToCols)
+		{ return(*(int *)0); }
+
+/* ./trace/trace_xnames.c */
+
+#undef _nc_trace_xnames
+void	_nc_trace_xnames(
+		TERMTYPE *tp)
+		{ /* void */ }
+
+/* ./tinfo/use_screen.c */
+
+#undef use_screen
+int	use_screen(
+		SCREEN	*screen,
+		NCURSES_SCREEN_CB func,
+		void	*data)
+		{ return(*(int *)0); }
+
+/* ./base/use_window.c */
+
+#undef use_window
+int	use_window(
+		WINDOW	*win,
+		NCURSES_WINDOW_CB func,
+		void	*data)
+		{ return(*(int *)0); }
+
+/* ./base/wresize.c */
+
+#undef wresize
+int	wresize(
+		WINDOW	*win,
+		int	ToLines,
+		int	ToCols)
+		{ return(*(int *)0); }
+
+/* ./tinfo/access.c */
+
+#undef _nc_rootname
+char	*_nc_rootname(
+		char	*path)
+		{ return(*(char **)0); }
+
+#undef _nc_is_abs_path
+NCURSES_BOOL _nc_is_abs_path(
+		const char *path)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_pathlast
+unsigned _nc_pathlast(
+		const char *path)
+		{ return(*(unsigned *)0); }
+
+#undef _nc_basename
+char	*_nc_basename(
+		char	*path)
+		{ return(*(char **)0); }
+
+#undef _nc_access
+int	_nc_access(
+		const char *path,
+		int	mode)
+		{ return(*(int *)0); }
+
+#undef _nc_is_dir_path
+NCURSES_BOOL _nc_is_dir_path(
+		const char *path)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_is_file_path
+NCURSES_BOOL _nc_is_file_path(
+		const char *path)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_env_access
+int	_nc_env_access(void)
+		{ return(*(int *)0); }
+
+#undef _nc_safe_fopen
+FILE	*_nc_safe_fopen(
+		const char *path,
+		const char *mode)
+		{ return(*(FILE **)0); }
+
+#undef _nc_safe_open3
+int	_nc_safe_open3(
+		const char *path,
+		int	flags,
+		mode_t	mode)
+		{ return(*(int *)0); }
+
+/* ./tinfo/add_tries.c */
+
+#undef _nc_add_to_try
+int	_nc_add_to_try(
+		TRIES	**tree,
+		const char *str,
+		unsigned code)
+		{ return(*(int *)0); }
+
+/* ./tinfo/alloc_ttype.c */
+
+#undef _nc_align_termtype
+void	_nc_align_termtype(
+		TERMTYPE2 *to,
+		TERMTYPE2 *from)
+		{ /* void */ }
+
+#undef _nc_copy_termtype
+void	_nc_copy_termtype(
+		TERMTYPE *dst,
+		const TERMTYPE *src)
+		{ /* void */ }
+
+#undef _nc_copy_termtype2
+void	_nc_copy_termtype2(
+		TERMTYPE2 *dst,
+		const TERMTYPE2 *src)
+		{ /* void */ }
+
+#undef _nc_export_termtype2
+void	_nc_export_termtype2(
+		TERMTYPE *dst,
+		const TERMTYPE2 *src)
+		{ /* void */ }
+
+/* ./codes.c */
+
+#undef boolcodes
+const char *const boolcodes[] = {0};
+#undef numcodes
+const char *const numcodes[] = {0};
+#undef strcodes
+const char *const strcodes[] = {0};
+
+/* ./comp_captab.c */
+
+#undef _nc_get_table
+const struct name_table_entry *_nc_get_table(
+		NCURSES_BOOL termcap)
+		{ return(*(const struct name_table_entry **)0); }
+
+#undef _nc_get_hash_table
+const HashValue *_nc_get_hash_table(
+		NCURSES_BOOL termcap)
+		{ return(*(const HashValue **)0); }
+
+#undef _nc_get_alias_table
+const struct alias *_nc_get_alias_table(
+		NCURSES_BOOL termcap)
+		{ return(*(const struct alias **)0); }
+
+#undef _nc_get_hash_info
+const HashData *_nc_get_hash_info(
+		NCURSES_BOOL termcap)
+		{ return(*(const HashData **)0); }
+
+/* ./tinfo/comp_error.c */
+
+#undef _nc_suppress_warnings
+NCURSES_BOOL _nc_suppress_warnings;
+#undef _nc_curr_line
+int	_nc_curr_line;
+#undef _nc_curr_col
+int	_nc_curr_col;
+
+#undef _nc_get_source
+const char *_nc_get_source(void)
+		{ return(*(const char **)0); }
+
+#undef _nc_set_source
+void	_nc_set_source(
+		const char *const name)
+		{ /* void */ }
+
+#undef _nc_set_type
+void	_nc_set_type(
+		const char *const name)
+		{ /* void */ }
+
+#undef _nc_get_type
+void	_nc_get_type(
+		char	*name)
+		{ /* void */ }
+
+#undef _nc_warning
+void	_nc_warning(
+		const char *const fmt,
+		...)
+		{ /* void */ }
+
+#undef _nc_err_abort
+void	_nc_err_abort(
+		const char *const fmt,
+		...)
+		{ /* void */ }
+
+#undef _nc_syserr_abort
+void	_nc_syserr_abort(
+		const char *const fmt,
+		...)
+		{ /* void */ }
+
+/* ./tinfo/comp_hash.c */
+
+#undef _nc_find_entry
+struct name_table_entry const *_nc_find_entry(
+		const char *string,
+		const HashValue *hash_table)
+		{ return(*(struct name_table_entry const **)0); }
+
+#undef _nc_find_type_entry
+struct name_table_entry const *_nc_find_type_entry(
+		const char *string,
+		int	type,
+		NCURSES_BOOL termcap)
+		{ return(*(struct name_table_entry const **)0); }
+
+#undef _nc_find_user_entry
+struct user_table_entry const *_nc_find_user_entry(
+		const char *string)
+		{ return(*(struct user_table_entry const **)0); }
+
+/* ./comp_userdefs.c */
+
+#undef _nc_get_userdefs_table
+const struct user_table_entry *_nc_get_userdefs_table(void)
+		{ return(*(const struct user_table_entry **)0); }
+
+#undef _nc_get_hash_user
+const HashData *_nc_get_hash_user(void)
+		{ return(*(const HashData **)0); }
+
+/* ./tinfo/db_iterator.c */
+
+#undef _nc_tic_dir
+const char *_nc_tic_dir(
+		const char *path)
+		{ return(*(const char **)0); }
+
+#undef _nc_keep_tic_dir
+void	_nc_keep_tic_dir(
+		const char *path)
+		{ /* void */ }
+
+#undef _nc_last_db
+void	_nc_last_db(void)
+		{ /* void */ }
+
+#undef _nc_next_db
+const char *_nc_next_db(
+		DBDIRS	*state,
+		int	*offset)
+		{ return(*(const char **)0); }
+
+#undef _nc_first_db
+void	_nc_first_db(
+		DBDIRS	*state,
+		int	*offset)
+		{ /* void */ }
+
+/* ./tinfo/doalloc.c */
+
+#undef _nc_doalloc
+void	*_nc_doalloc(
+		void	*oldp,
+		size_t	amount)
+		{ return(*(void **)0); }
+
+/* ./tinfo/entries.c */
+
+#undef _nc_head
+ENTRY	*_nc_head;
+#undef _nc_tail
+ENTRY	*_nc_tail;
+
+#undef _nc_free_entry
+void	_nc_free_entry(
+		ENTRY	*headp,
+		TERMTYPE2 *tterm)
+		{ /* void */ }
+
+#undef _nc_free_entries
+void	_nc_free_entries(
+		ENTRY	*headp)
+		{ /* void */ }
+
+#undef _nc_leaks_tinfo
+void	_nc_leaks_tinfo(void)
+		{ /* void */ }
+
+#undef exit_terminfo
+void	exit_terminfo(
+		int	code)
+		{ /* void */ }
+
+/* ./fallback.c */
+
+#undef _nc_fallback2
+const TERMTYPE2 *_nc_fallback2(
+		const char *name)
+		{ return(*(const TERMTYPE2 **)0); }
+
+#undef _nc_fallback
+const TERMTYPE *_nc_fallback(
+		const char *name)
+		{ return(*(const TERMTYPE **)0); }
+
+/* ./tinfo/free_ttype.c */
+
+#undef _nc_free_termtype
+void	_nc_free_termtype(
+		TERMTYPE *ptr)
+		{ /* void */ }
+
+#undef _nc_free_termtype1
+void	_nc_free_termtype1(
+		TERMTYPE *ptr)
+		{ /* void */ }
+
+#undef _nc_free_termtype2
+void	_nc_free_termtype2(
+		TERMTYPE2 *ptr)
+		{ /* void */ }
+
+#undef _nc_user_definable
+NCURSES_BOOL _nc_user_definable;
+
+#undef use_extended_names
+int	use_extended_names(
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+/* ./tinfo/getenv_num.c */
+
+#undef _nc_getenv_num
+int	_nc_getenv_num(
+		const char *name)
+		{ return(*(int *)0); }
+
+#undef _nc_setenv_num
+void	_nc_setenv_num(
+		const char *name,
+		int	value)
+		{ /* void */ }
+
+/* ./tinfo/home_terminfo.c */
+
+#undef _nc_home_terminfo
+char	*_nc_home_terminfo(void)
+		{ return(*(char **)0); }
+
+/* ./tinfo/init_keytry.c */
+
+#undef _nc_init_keytry
+void	_nc_init_keytry(
+		SCREEN	*sp)
+		{ /* void */ }
+
+/* ./tinfo/lib_acs.c */
+
+#undef acs_map
+chtype	acs_map[128];
+
+#undef _nc_init_acs_sp
+void	_nc_init_acs_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_init_acs
+void	_nc_init_acs(void)
+		{ /* void */ }
+
+/* ./tinfo/lib_baudrate.c */
+
+struct speed {
+    int given_speed;
+    int actual_speed;
+};
+
+#undef _nc_baudrate
+int	_nc_baudrate(
+		int	OSpeed)
+		{ return(*(int *)0); }
+
+#undef _nc_ospeed
+int	_nc_ospeed(
+		int	BaudRate)
+		{ return(*(int *)0); }
+
+#undef baudrate_sp
+int	baudrate_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef baudrate
+int	baudrate(void)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_cur_term.c */
+
+#undef cur_term
+TERMINAL *cur_term;
+
+#undef set_curterm_sp
+TERMINAL *set_curterm_sp(
+		SCREEN	*sp,
+		TERMINAL *termp)
+		{ return(*(TERMINAL **)0); }
+
+#undef set_curterm
+TERMINAL *set_curterm(
+		TERMINAL *termp)
+		{ return(*(TERMINAL **)0); }
+
+#undef del_curterm_sp
+int	del_curterm_sp(
+		SCREEN	*sp,
+		TERMINAL *termp)
+		{ return(*(int *)0); }
+
+#undef del_curterm
+int	del_curterm(
+		TERMINAL *termp)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_data.c */
+
+#undef stdscr
+WINDOW	*stdscr;
+#undef curscr
+WINDOW	*curscr;
+#undef newscr
+WINDOW	*newscr;
+#undef _nc_screen_chain
+SCREEN	*_nc_screen_chain;
+#undef SP
+SCREEN	*SP;
+#undef _nc_globals
+NCURSES_GLOBALS _nc_globals;
+#undef _nc_prescreen
+NCURSES_PRESCREEN _nc_prescreen;
+
+#undef _nc_screen_of
+SCREEN	*_nc_screen_of(
+		WINDOW	*win)
+		{ return(*(SCREEN **)0); }
+
+/* ./tinfo/lib_has_cap.c */
+
+#undef has_ic_sp
+NCURSES_BOOL has_ic_sp(
+		SCREEN	*sp)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef has_ic
+NCURSES_BOOL has_ic(void)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef has_il_sp
+NCURSES_BOOL has_il_sp(
+		SCREEN	*sp)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef has_il
+NCURSES_BOOL has_il(void)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./tinfo/lib_kernel.c */
+
+#undef erasechar_sp
+char	erasechar_sp(
+		SCREEN	*sp)
+		{ return(*(char *)0); }
+
+#undef erasechar
+char	erasechar(void)
+		{ return(*(char *)0); }
+
+#undef killchar_sp
+char	killchar_sp(
+		SCREEN	*sp)
+		{ return(*(char *)0); }
+
+#undef killchar
+char	killchar(void)
+		{ return(*(char *)0); }
+
+#undef flushinp_sp
+int	flushinp_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef flushinp
+int	flushinp(void)
+		{ return(*(int *)0); }
+
+/* ./lib_keyname.c */
+
+struct kn { short offset; int code; };
+
+#undef keyname_sp
+const char *keyname_sp(
+		SCREEN	*sp,
+		int	c)
+		{ return(*(const char **)0); }
+
+#undef keyname
+const char *keyname(
+		int	c)
+		{ return(*(const char **)0); }
+
+/* ./tinfo/lib_longname.c */
+
+#undef longname_sp
+char	*longname_sp(
+		SCREEN	*sp)
+		{ return(*(char **)0); }
+
+#undef longname
+char	*longname(void)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_napms.c */
+
+#undef napms_sp
+int	napms_sp(
+		SCREEN	*sp,
+		int	ms)
+		{ return(*(int *)0); }
+
+#undef napms
+int	napms(
+		int	ms)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_options.c */
+
+#undef idlok
+int	idlok(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef idcok
+void	idcok(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ /* void */ }
+
+#undef halfdelay_sp
+int	halfdelay_sp(
+		SCREEN	*sp,
+		int	t)
+		{ return(*(int *)0); }
+
+#undef halfdelay
+int	halfdelay(
+		int	t)
+		{ return(*(int *)0); }
+
+#undef nodelay
+int	nodelay(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef notimeout
+int	notimeout(
+		WINDOW	*win,
+		NCURSES_BOOL f)
+		{ return(*(int *)0); }
+
+#undef wtimeout
+void	wtimeout(
+		WINDOW	*win,
+		int	delay)
+		{ /* void */ }
+
+#undef keypad
+int	keypad(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef meta
+int	meta(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef curs_set_sp
+int	curs_set_sp(
+		SCREEN	*sp,
+		int	vis)
+		{ return(*(int *)0); }
+
+#undef curs_set
+int	curs_set(
+		int	vis)
+		{ return(*(int *)0); }
+
+#undef typeahead_sp
+int	typeahead_sp(
+		SCREEN	*sp,
+		int	fd)
+		{ return(*(int *)0); }
+
+#undef typeahead
+int	typeahead(
+		int	fd)
+		{ return(*(int *)0); }
+
+#undef has_key_sp
+int	has_key_sp(
+		SCREEN	*sp,
+		int	keycode)
+		{ return(*(int *)0); }
+
+#undef has_key
+int	has_key(
+		int	keycode)
+		{ return(*(int *)0); }
+
+#undef _nc_putp_flush_sp
+int	_nc_putp_flush_sp(
+		SCREEN	*sp,
+		const char *name,
+		const char *value)
+		{ return(*(int *)0); }
+
+#undef _nc_keypad
+int	_nc_keypad(
+		SCREEN	*sp,
+		int	flag)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_raw.c */
+
+#undef raw_sp
+int	raw_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef raw
+int	raw(void)
+		{ return(*(int *)0); }
+
+#undef cbreak_sp
+int	cbreak_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef cbreak
+int	cbreak(void)
+		{ return(*(int *)0); }
+
+#undef qiflush_sp
+void	qiflush_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef qiflush
+void	qiflush(void)
+		{ /* void */ }
+
+#undef noraw_sp
+int	noraw_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef noraw
+int	noraw(void)
+		{ return(*(int *)0); }
+
+#undef nocbreak_sp
+int	nocbreak_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef nocbreak
+int	nocbreak(void)
+		{ return(*(int *)0); }
+
+#undef noqiflush_sp
+void	noqiflush_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef noqiflush
+void	noqiflush(void)
+		{ /* void */ }
+
+#undef intrflush_sp
+int	intrflush_sp(
+		SCREEN	*sp,
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef intrflush
+int	intrflush(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_setup.c */
+
+#undef ttytype
+char	ttytype[256];
+#undef LINES
+int	LINES;
+#undef COLS
+int	COLS;
+#undef TABSIZE
+int	TABSIZE;
+
+#undef set_tabsize_sp
+int	set_tabsize_sp(
+		SCREEN	*sp,
+		int	value)
+		{ return(*(int *)0); }
+
+#undef set_tabsize
+int	set_tabsize(
+		int	value)
+		{ return(*(int *)0); }
+
+#undef _nc_handle_sigwinch
+int	_nc_handle_sigwinch(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef use_env_sp
+void	use_env_sp(
+		SCREEN	*sp,
+		NCURSES_BOOL f)
+		{ /* void */ }
+
+#undef use_tioctl_sp
+void	use_tioctl_sp(
+		SCREEN	*sp,
+		NCURSES_BOOL f)
+		{ /* void */ }
+
+#undef use_env
+void	use_env(
+		NCURSES_BOOL f)
+		{ /* void */ }
+
+#undef use_tioctl
+void	use_tioctl(
+		NCURSES_BOOL f)
+		{ /* void */ }
+
+#undef _nc_get_screensize
+void	_nc_get_screensize(
+		SCREEN	*sp,
+		int	*linep,
+		int	*colp)
+		{ /* void */ }
+
+#undef _nc_update_screensize
+void	_nc_update_screensize(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_setup_tinfo
+int	_nc_setup_tinfo(
+		const char *const tn,
+		TERMTYPE2 *const tp)
+		{ return(*(int *)0); }
+
+#undef _nc_tinfo_cmdch
+void	_nc_tinfo_cmdch(
+		TERMINAL *termp,
+		int	proto)
+		{ /* void */ }
+
+#undef _nc_get_locale
+char	*_nc_get_locale(void)
+		{ return(*(char **)0); }
+
+#undef _nc_unicode_locale
+int	_nc_unicode_locale(void)
+		{ return(*(int *)0); }
+
+#undef _nc_locale_breaks_acs
+int	_nc_locale_breaks_acs(
+		TERMINAL *termp)
+		{ return(*(int *)0); }
+
+#undef _nc_setupterm
+int	_nc_setupterm(
+		const char *tname,
+		int	Filedes,
+		int	*errret,
+		int	reuse)
+		{ return(*(int *)0); }
+
+#undef new_prescr
+SCREEN	*new_prescr(void)
+		{ return(*(SCREEN **)0); }
+
+#undef setupterm
+int	setupterm(
+		const char *tname,
+		int	Filedes,
+		int	*errret)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_termcap.c */
+
+#undef UP
+char	*UP;
+#undef BC
+char	*BC;
+
+#undef tgetent_sp
+int	tgetent_sp(
+		SCREEN	*sp,
+		char	*bufp,
+		const char *name)
+		{ return(*(int *)0); }
+
+#undef tgetent
+int	tgetent(
+		char	*bufp,
+		const char *name)
+		{ return(*(int *)0); }
+
+#undef tgetflag_sp
+int	tgetflag_sp(
+		SCREEN	*sp,
+		const char *id)
+		{ return(*(int *)0); }
+
+#undef tgetflag
+int	tgetflag(
+		const char *id)
+		{ return(*(int *)0); }
+
+#undef tgetnum_sp
+int	tgetnum_sp(
+		SCREEN	*sp,
+		const char *id)
+		{ return(*(int *)0); }
+
+#undef tgetnum
+int	tgetnum(
+		const char *id)
+		{ return(*(int *)0); }
+
+#undef tgetstr_sp
+char	*tgetstr_sp(
+		SCREEN	*sp,
+		const char *id,
+		char	**area)
+		{ return(*(char **)0); }
+
+#undef tgetstr
+char	*tgetstr(
+		const char *id,
+		char	**area)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_termname.c */
+
+#undef termname_sp
+char	*termname_sp(
+		SCREEN	*sp)
+		{ return(*(char **)0); }
+
+#undef termname
+char	*termname(void)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_tgoto.c */
+
+#undef tgoto
+char	*tgoto(
+		const char *string,
+		int	x,
+		int	y)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_ti.c */
+
+#undef tigetflag_sp
+int	tigetflag_sp(
+		SCREEN	*sp,
+		const char *str)
+		{ return(*(int *)0); }
+
+#undef tigetflag
+int	tigetflag(
+		const char *str)
+		{ return(*(int *)0); }
+
+#undef tigetnum_sp
+int	tigetnum_sp(
+		SCREEN	*sp,
+		const char *str)
+		{ return(*(int *)0); }
+
+#undef tigetnum
+int	tigetnum(
+		const char *str)
+		{ return(*(int *)0); }
+
+#undef tigetstr_sp
+char	*tigetstr_sp(
+		SCREEN	*sp,
+		const char *str)
+		{ return(*(char **)0); }
+
+#undef tigetstr
+char	*tigetstr(
+		const char *str)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_tparm.c */
+
+#undef _nc_tparm_err
+int	_nc_tparm_err;
+
+#undef _nc_free_tparm
+void	_nc_free_tparm(
+		TERMINAL *termp)
+		{ /* void */ }
+
+#undef _nc_tparm_analyze
+int	_nc_tparm_analyze(
+		TERMINAL *term,
+		const char *string,
+		char	**p_is_s,
+		int	*_nc_popcount)
+		{ return(*(int *)0); }
+
+#undef tparm
+char	*tparm(
+		const char *string,
+		...)
+		{ return(*(char **)0); }
+
+#undef tiparm
+char	*tiparm(
+		const char *string,
+		...)
+		{ return(*(char **)0); }
+
+#undef _nc_tiparm
+char	*_nc_tiparm(
+		int	expected,
+		const char *string,
+		...)
+		{ return(*(char **)0); }
+
+#undef _nc_reset_tparm
+void	_nc_reset_tparm(
+		TERMINAL *term)
+		{ /* void */ }
+
+/* ./tinfo/lib_tputs.c */
+
+#undef PC
+char	PC;
+#undef ospeed
+short	ospeed;
+#undef _nc_nulls_sent
+int	_nc_nulls_sent;
+
+#undef _nc_set_no_padding
+void	_nc_set_no_padding(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef delay_output_sp
+int	delay_output_sp(
+		SCREEN	*sp,
+		int	ms)
+		{ return(*(int *)0); }
+
+#undef delay_output
+int	delay_output(
+		int	ms)
+		{ return(*(int *)0); }
+
+#undef _nc_flush_sp
+void	_nc_flush_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_flush
+void	_nc_flush(void)
+		{ /* void */ }
+
+#undef _nc_outch_sp
+int	_nc_outch_sp(
+		SCREEN	*sp,
+		int	ch)
+		{ return(*(int *)0); }
+
+#undef _nc_outch
+int	_nc_outch(
+		int	ch)
+		{ return(*(int *)0); }
+
+#undef _nc_putchar_sp
+int	_nc_putchar_sp(
+		SCREEN	*sp,
+		int	ch)
+		{ return(*(int *)0); }
+
+#undef _nc_putchar
+int	_nc_putchar(
+		int	ch)
+		{ return(*(int *)0); }
+
+#undef putp_sp
+int	putp_sp(
+		SCREEN	*sp,
+		const char *string)
+		{ return(*(int *)0); }
+
+#undef putp
+int	putp(
+		const char *string)
+		{ return(*(int *)0); }
+
+#undef _nc_putp_sp
+int	_nc_putp_sp(
+		SCREEN	*sp,
+		const char *name,
+		const char *string)
+		{ return(*(int *)0); }
+
+#undef _nc_putp
+int	_nc_putp(
+		const char *name,
+		const char *string)
+		{ return(*(int *)0); }
+
+#undef tputs_sp
+int	tputs_sp(
+		SCREEN	*sp,
+		const char *string,
+		int	affcnt,
+		NCURSES_OUTC_sp outc)
+		{ return(*(int *)0); }
+
+#undef _nc_outc_wrapper
+int	_nc_outc_wrapper(
+		SCREEN	*sp,
+		int	c)
+		{ return(*(int *)0); }
+
+#undef tputs
+int	tputs(
+		const char *string,
+		int	affcnt,
+		int	(*outc)(
+		int	p1))
+		{ return(*(int *)0); }
+
+/* ./trace/lib_trace.c */
+
+#undef _nc_tracing
+unsigned _nc_tracing;
+#undef _nc_tputs_trace
+const char *_nc_tputs_trace = {0};
+#undef _nc_outchars
+long	_nc_outchars;
+
+#undef curses_trace
+unsigned curses_trace(
+		unsigned tracelevel)
+		{ return(*(unsigned *)0); }
+
+#undef trace
+void	trace(
+		const unsigned int tracelevel)
+		{ /* void */ }
+
+#undef _tracef
+void	_tracef(
+		const char *fmt,
+		...)
+		{ /* void */ }
+
+#undef _nc_retrace_bool
+NCURSES_BOOL _nc_retrace_bool(
+		int	code)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_retrace_char
+char	_nc_retrace_char(
+		int	code)
+		{ return(*(char *)0); }
+
+#undef _nc_retrace_int
+int	_nc_retrace_int(
+		int	code)
+		{ return(*(int *)0); }
+
+#undef _nc_retrace_unsigned
+unsigned _nc_retrace_unsigned(
+		unsigned code)
+		{ return(*(unsigned *)0); }
+
+#undef _nc_retrace_ptr
+char	*_nc_retrace_ptr(
+		char	*code)
+		{ return(*(char **)0); }
+
+#undef _nc_retrace_cptr
+const char *_nc_retrace_cptr(
+		const char *code)
+		{ return(*(const char **)0); }
+
+#undef _nc_retrace_cvoid_ptr
+const void *_nc_retrace_cvoid_ptr(
+		const void *code)
+		{ return(*(const void **)0); }
+
+#undef _nc_retrace_void_ptr
+void	*_nc_retrace_void_ptr(
+		void	*code)
+		{ return(*(void **)0); }
+
+#undef _nc_retrace_sp
+SCREEN	*_nc_retrace_sp(
+		SCREEN	*code)
+		{ return(*(SCREEN **)0); }
+
+#undef _nc_retrace_win
+WINDOW	*_nc_retrace_win(
+		WINDOW	*code)
+		{ return(*(WINDOW **)0); }
+
+#undef _nc_fmt_funcptr
+char	*_nc_fmt_funcptr(
+		char	*target,
+		const char *source,
+		size_t	size)
+		{ return(*(char **)0); }
+
+/* ./trace/lib_traceatr.c */
+
+#undef _traceattr2
+char	*_traceattr2(
+		int	bufnum,
+		chtype	newmode)
+		{ return(*(char **)0); }
+
+#undef _traceattr
+char	*_traceattr(
+		attr_t	newmode)
+		{ return(*(char **)0); }
+
+#undef _nc_retrace_int_attr_t
+int	_nc_retrace_int_attr_t(
+		attr_t	code)
+		{ return(*(int *)0); }
+
+#undef _nc_retrace_attr_t
+attr_t	_nc_retrace_attr_t(
+		attr_t	code)
+		{ return(*(attr_t *)0); }
+
+#undef _nc_altcharset_name
+const char *_nc_altcharset_name(
+		attr_t	attr,
+		chtype	ch)
+		{ return(*(const char **)0); }
+
+#undef _tracechtype2
+char	*_tracechtype2(
+		int	bufnum,
+		chtype	ch)
+		{ return(*(char **)0); }
+
+#undef _tracechtype
+char	*_tracechtype(
+		chtype	ch)
+		{ return(*(char **)0); }
+
+#undef _nc_retrace_chtype
+chtype	_nc_retrace_chtype(
+		chtype	code)
+		{ return(*(chtype *)0); }
+
+#undef _tracecchar_t2
+char	*_tracecchar_t2(
+		int	bufnum,
+		const cchar_t *ch)
+		{ return(*(char **)0); }
+
+#undef _tracecchar_t
+char	*_tracecchar_t(
+		const cchar_t *ch)
+		{ return(*(char **)0); }
+
+/* ./trace/lib_tracebits.c */
+
+#undef _nc_trace_ttymode
+char	*_nc_trace_ttymode(
+		const struct termios *tty)
+		{ return(*(char **)0); }
+
+#undef _nc_tracebits
+char	*_nc_tracebits(void)
+		{ return(*(char **)0); }
+
+/* ./trace/lib_tracechr.c */
+
+#undef _nc_tracechar
+char	*_nc_tracechar(
+		SCREEN	*sp,
+		int	ch)
+		{ return(*(char **)0); }
+
+#undef _tracechar
+char	*_tracechar(
+		int	ch)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_ttyflags.c */
+
+#undef _nc_get_tty_mode_sp
+int	_nc_get_tty_mode_sp(
+		SCREEN	*sp,
+		struct termios *buf)
+		{ return(*(int *)0); }
+
+#undef _nc_get_tty_mode
+int	_nc_get_tty_mode(
+		struct termios *buf)
+		{ return(*(int *)0); }
+
+#undef _nc_set_tty_mode_sp
+int	_nc_set_tty_mode_sp(
+		SCREEN	*sp,
+		struct termios *buf)
+		{ return(*(int *)0); }
+
+#undef _nc_set_tty_mode
+int	_nc_set_tty_mode(
+		struct termios *buf)
+		{ return(*(int *)0); }
+
+#undef def_shell_mode_sp
+int	def_shell_mode_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef def_shell_mode
+int	def_shell_mode(void)
+		{ return(*(int *)0); }
+
+#undef def_prog_mode_sp
+int	def_prog_mode_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef def_prog_mode
+int	def_prog_mode(void)
+		{ return(*(int *)0); }
+
+#undef reset_prog_mode_sp
+int	reset_prog_mode_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef reset_prog_mode
+int	reset_prog_mode(void)
+		{ return(*(int *)0); }
+
+#undef reset_shell_mode_sp
+int	reset_shell_mode_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef reset_shell_mode
+int	reset_shell_mode(void)
+		{ return(*(int *)0); }
+
+#undef savetty_sp
+int	savetty_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef savetty
+int	savetty(void)
+		{ return(*(int *)0); }
+
+#undef resetty_sp
+int	resetty_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef resetty
+int	resetty(void)
+		{ return(*(int *)0); }
+
+/* ./tty/lib_twait.c */
+
+#undef _nc_timed_wait
+int	_nc_timed_wait(
+		SCREEN	*sp,
+		int	mode,
+		int	milliseconds,
+		int	*timeleft)
+		{ return(*(int *)0); }
+
+/* ./tinfo/name_match.c */
+
+#undef _nc_first_name
+char	*_nc_first_name(
+		const char *const sp)
+		{ return(*(char **)0); }
+
+#undef _nc_name_match
+int	_nc_name_match(
+		const char *const namelst,
+		const char *const name,
+		const char *const delim)
+		{ return(*(int *)0); }
+
+/* ./names.c */
+
+#undef boolnames
+const char *const boolnames[] = {0};
+#undef boolfnames
+const char *const boolfnames[] = {0};
+#undef numnames
+const char *const numnames[] = {0};
+#undef numfnames
+const char *const numfnames[] = {0};
+#undef strnames
+const char *const strnames[] = {0};
+#undef strfnames
+const char *const strfnames[] = {0};
+
+/* ./tinfo/obsolete.c */
+
+#undef _nc_set_buffer_sp
+void	_nc_set_buffer_sp(
+		SCREEN	*sp,
+		FILE	*ofp,
+		int	buffered)
+		{ /* void */ }
+
+#undef _nc_set_buffer
+void	_nc_set_buffer(
+		FILE	*ofp,
+		int	buffered)
+		{ /* void */ }
+
+/* ./tinfo/read_entry.c */
+
+#undef _nc_init_termtype
+void	_nc_init_termtype(
+		TERMTYPE2 *const tp)
+		{ /* void */ }
+
+#undef _nc_read_termtype
+int	_nc_read_termtype(
+		TERMTYPE2 *ptr,
+		char	*buffer,
+		int	limit)
+		{ return(*(int *)0); }
+
+#undef _nc_read_file_entry
+int	_nc_read_file_entry(
+		const char *const filename,
+		TERMTYPE2 *ptr)
+		{ return(*(int *)0); }
+
+#undef _nc_read_entry2
+int	_nc_read_entry2(
+		const char *const name,
+		char	*const filename,
+		TERMTYPE2 *const tp)
+		{ return(*(int *)0); }
+
+#undef _nc_read_entry
+int	_nc_read_entry(
+		const char *const name,
+		char	*const filename,
+		TERMTYPE *const tp)
+		{ return(*(int *)0); }
+
+/* ./tinfo/read_termcap.c */
+
+#undef _nc_read_termcap_entry
+int	_nc_read_termcap_entry(
+		const char *const tn,
+		TERMTYPE2 *const tp)
+		{ return(*(int *)0); }
+
+/* ./tinfo/strings.c */
+
+#undef _nc_str_init
+string_desc *_nc_str_init(
+		string_desc *dst,
+		char	*src,
+		size_t	len)
+		{ return(*(string_desc **)0); }
+
+#undef _nc_str_null
+string_desc *_nc_str_null(
+		string_desc *dst,
+		size_t	len)
+		{ return(*(string_desc **)0); }
+
+#undef _nc_str_copy
+string_desc *_nc_str_copy(
+		string_desc *dst,
+		string_desc *src)
+		{ return(*(string_desc **)0); }
+
+#undef _nc_safe_strcat
+NCURSES_BOOL _nc_safe_strcat(
+		string_desc *dst,
+		const char *src)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_safe_strcpy
+NCURSES_BOOL _nc_safe_strcpy(
+		string_desc *dst,
+		const char *src)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./trace/trace_buf.c */
+
+#undef _nc_trace_buf
+char	*_nc_trace_buf(
+		int	bufnum,
+		size_t	want)
+		{ return(*(char **)0); }
+
+#undef _nc_trace_bufcat
+char	*_nc_trace_bufcat(
+		int	bufnum,
+		const char *value)
+		{ return(*(char **)0); }
+
+/* ./trace/trace_tries.c */
+
+#undef _nc_trace_tries
+void	_nc_trace_tries(
+		TRIES	*tree)
+		{ /* void */ }
+
+/* ./base/tries.c */
+
+#undef _nc_expand_try
+char	*_nc_expand_try(
+		TRIES	*tree,
+		unsigned code,
+		int	*count,
+		size_t	len)
+		{ return(*(char **)0); }
+
+#undef _nc_remove_key
+int	_nc_remove_key(
+		TRIES	**tree,
+		unsigned code)
+		{ return(*(int *)0); }
+
+#undef _nc_remove_string
+int	_nc_remove_string(
+		TRIES	**tree,
+		const char *string)
+		{ return(*(int *)0); }
+
+/* ./tinfo/trim_sgr0.c */
+
+#undef _nc_trim_sgr0
+char	*_nc_trim_sgr0(
+		TERMTYPE2 *tp)
+		{ return(*(char **)0); }
+
+/* ./unctrl.c */
+
+#undef unctrl_sp
+const char *unctrl_sp(
+		SCREEN	*sp,
+		chtype	ch)
+		{ return(*(const char **)0); }
+
+#undef unctrl
+const char *unctrl(
+		chtype	ch)
+		{ return(*(const char **)0); }
+
+/* ./trace/visbuf.c */
+
+#undef _nc_visbuf2
+const char *_nc_visbuf2(
+		int	bufnum,
+		const char *buf)
+		{ return(*(const char **)0); }
+
+#undef _nc_visbuf
+const char *_nc_visbuf(
+		const char *buf)
+		{ return(*(const char **)0); }
+
+#undef _nc_visbufn
+const char *_nc_visbufn(
+		const char *buf,
+		int	len)
+		{ return(*(const char **)0); }
+
+#undef _nc_viswbuf2
+const char *_nc_viswbuf2(
+		int	bufnum,
+		const wchar_t *buf)
+		{ return(*(const char **)0); }
+
+#undef _nc_viswbuf
+const char *_nc_viswbuf(
+		const wchar_t *buf)
+		{ return(*(const char **)0); }
+
+#undef _nc_viswbufn
+const char *_nc_viswbufn(
+		const wchar_t *buf,
+		int	len)
+		{ return(*(const char **)0); }
+
+#undef _nc_viswibuf
+const char *_nc_viswibuf(
+		const wint_t *buf)
+		{ return(*(const char **)0); }
+
+#undef _nc_viscbuf2
+const char *_nc_viscbuf2(
+		int	bufnum,
+		const cchar_t *buf,
+		int	len)
+		{ return(*(const char **)0); }
+
+#undef _nc_viscbuf
+const char *_nc_viscbuf(
+		const cchar_t *buf,
+		int	len)
+		{ return(*(const char **)0); }
+
+/* ./tinfo/alloc_entry.c */
+
+#undef _nc_init_entry
+void	_nc_init_entry(
+		ENTRY	*const tp)
+		{ /* void */ }
+
+#undef _nc_copy_entry
+ENTRY	*_nc_copy_entry(
+		ENTRY	*oldp)
+		{ return(*(ENTRY **)0); }
+
+#undef _nc_save_str
+char	*_nc_save_str(
+		const char *string)
+		{ return(*(char **)0); }
+
+#undef _nc_wrap_entry
+void	_nc_wrap_entry(
+		ENTRY	*const ep,
+		NCURSES_BOOL copy_strings)
+		{ /* void */ }
+
+#undef _nc_merge_entry
+void	_nc_merge_entry(
+		ENTRY	*const target,
+		ENTRY	*const source)
+		{ /* void */ }
+
+/* ./tinfo/captoinfo.c */
+
+#undef _nc_captoinfo
+char	*_nc_captoinfo(
+		const char *cap,
+		const char *s,
+		int const parameterized)
+		{ return(*(char **)0); }
+
+#undef _nc_infotocap
+char	*_nc_infotocap(
+		const char *cap,
+		const char *str,
+		int const parameterized)
+		{ return(*(char **)0); }
+
+/* ./tinfo/comp_expand.c */
+
+#undef _nc_tic_expand
+char	*_nc_tic_expand(
+		const char *srcp,
+		NCURSES_BOOL tic_format,
+		int	numbers)
+		{ return(*(char **)0); }
+
+/* ./tinfo/comp_parse.c */
+
+#undef _nc_check_termtype2
+void	(*_nc_check_termtype2)(
+		TERMTYPE2 *p1,
+		NCURSES_BOOL p2);
+
+#undef _nc_entry_match
+NCURSES_BOOL _nc_entry_match(
+		char	*n1,
+		char	*n2)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_read_entry_source
+void	_nc_read_entry_source(
+		FILE	*fp,
+		char	*buf,
+		int	literal,
+		NCURSES_BOOL silent,
+		NCURSES_BOOL (*hook)(
+		ENTRY	*p1))
+		{ /* void */ }
+
+#undef _nc_resolve_uses2
+int	_nc_resolve_uses2(
+		NCURSES_BOOL fullresolve,
+		NCURSES_BOOL literal)
+		{ return(*(int *)0); }
+
+/* ./tinfo/comp_scan.c */
+
+#undef _nc_syntax
+int	_nc_syntax;
+#undef _nc_strict_bsd
+int	_nc_strict_bsd;
+#undef _nc_curr_file_pos
+long	_nc_curr_file_pos;
+#undef _nc_comment_start
+long	_nc_comment_start;
+#undef _nc_comment_end
+long	_nc_comment_end;
+#undef _nc_start_line
+long	_nc_start_line;
+#undef _nc_curr_token
+struct token _nc_curr_token;
+#undef _nc_disable_period
+NCURSES_BOOL _nc_disable_period;
+
+#undef _nc_reset_input
+void	_nc_reset_input(
+		FILE	*fp,
+		char	*buf)
+		{ /* void */ }
+
+#undef _nc_get_token
+int	_nc_get_token(
+		NCURSES_BOOL silent)
+		{ return(*(int *)0); }
+
+#undef _nc_trans_string
+int	_nc_trans_string(
+		char	*ptr,
+		char	*last)
+		{ return(*(int *)0); }
+
+#undef _nc_push_token
+void	_nc_push_token(
+		int	tokclass)
+		{ /* void */ }
+
+#undef _nc_panic_mode
+void	_nc_panic_mode(
+		char	ch)
+		{ /* void */ }
+
+/* ./tinfo/parse_entry.c */
+
+#undef _nc_parse_entry
+int	_nc_parse_entry(
+		ENTRY	*entryp,
+		int	literal,
+		NCURSES_BOOL silent)
+		{ return(*(int *)0); }
+
+#undef _nc_capcmp
+int	_nc_capcmp(
+		const char *s,
+		const char *t)
+		{ return(*(int *)0); }
+
+/* ./tinfo/write_entry.c */
+
+#undef _nc_set_writedir
+void	_nc_set_writedir(
+		const char *dir)
+		{ /* void */ }
+
+#undef _nc_write_entry
+void	_nc_write_entry(
+		TERMTYPE2 *const tp)
+		{ /* void */ }
+
+#undef _nc_write_object
+int	_nc_write_object(
+		TERMTYPE2 *tp,
+		char	*buffer,
+		unsigned *offset,
+		unsigned limit)
+		{ return(*(int *)0); }
+
+#undef _nc_tic_written
+int	_nc_tic_written(void)
+		{ return(*(int *)0); }
+
+/* ./base/define_key.c */
+
+#undef define_key_sp
+int	define_key_sp(
+		SCREEN	*sp,
+		const char *str,
+		int	keycode)
+		{ return(*(int *)0); }
+
+#undef define_key
+int	define_key(
+		const char *str,
+		int	keycode)
+		{ return(*(int *)0); }
+
+/* ./tinfo/hashed_db.c */
+
+#undef _nc_hashed_db
+void	_nc_hashed_db(void)
+		{ /* void */ }
+
+/* ./base/key_defined.c */
+
+#undef key_defined_sp
+int	key_defined_sp(
+		SCREEN	*sp,
+		const char *str)
+		{ return(*(int *)0); }
+
+#undef key_defined
+int	key_defined(
+		const char *str)
+		{ return(*(int *)0); }
+
+/* ./base/keybound.c */
+
+#undef keybound_sp
+char	*keybound_sp(
+		SCREEN	*sp,
+		int	code,
+		int	count)
+		{ return(*(char **)0); }
+
+#undef keybound
+char	*keybound(
+		int	code,
+		int	count)
+		{ return(*(char **)0); }
+
+/* ./base/keyok.c */
+
+#undef keyok_sp
+int	keyok_sp(
+		SCREEN	*sp,
+		int	c,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef keyok
+int	keyok(
+		int	c,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+/* ./base/version.c */
+
+#undef curses_version
+const char *curses_version(void)
+		{ return(*(const char **)0); }
diff --git a/ncurses/llib-ltic b/ncurses/llib-ltic
new file mode 100644
index 0000000..0037884
--- /dev/null
+++ b/ncurses/llib-ltic
@@ -0,0 +1,203 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 2012-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey       2012-on                                  *
+ ****************************************************************************/
+/* LINTLIBRARY */
+
+/* ./tinfo/alloc_entry.c */
+
+#include <curses.priv.h>
+
+#undef _nc_init_entry
+void	_nc_init_entry(
+		ENTRY	*const tp)
+		{ /* void */ }
+
+#undef _nc_copy_entry
+ENTRY	*_nc_copy_entry(
+		ENTRY	*oldp)
+		{ return(*(ENTRY **)0); }
+
+#undef _nc_save_str
+char	*_nc_save_str(
+		const char *string)
+		{ return(*(char **)0); }
+
+#undef _nc_wrap_entry
+void	_nc_wrap_entry(
+		ENTRY	*const ep,
+		NCURSES_BOOL copy_strings)
+		{ /* void */ }
+
+#undef _nc_merge_entry
+void	_nc_merge_entry(
+		ENTRY	*const target,
+		ENTRY	*const source)
+		{ /* void */ }
+
+/* ./tinfo/captoinfo.c */
+
+#undef _nc_captoinfo
+char	*_nc_captoinfo(
+		const char *cap,
+		const char *s,
+		int const parameterized)
+		{ return(*(char **)0); }
+
+#undef _nc_infotocap
+char	*_nc_infotocap(
+		const char *cap,
+		const char *str,
+		int const parameterized)
+		{ return(*(char **)0); }
+
+/* ./tinfo/comp_expand.c */
+
+#undef _nc_tic_expand
+char	*_nc_tic_expand(
+		const char *srcp,
+		NCURSES_BOOL tic_format,
+		int	numbers)
+		{ return(*(char **)0); }
+
+/* ./tinfo/comp_parse.c */
+
+#undef _nc_check_termtype2
+void	(*_nc_check_termtype2)(
+		TERMTYPE *p1,
+		NCURSES_BOOL p2);
+
+#undef _nc_entry_match
+NCURSES_BOOL _nc_entry_match(
+		char	*n1,
+		char	*n2)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_read_entry_source
+void	_nc_read_entry_source(
+		FILE	*fp,
+		char	*buf,
+		int	literal,
+		NCURSES_BOOL silent,
+		NCURSES_BOOL (*hook)(
+		ENTRY	*p1))
+		{ /* void */ }
+
+#undef _nc_resolve_uses2
+int	_nc_resolve_uses2(
+		NCURSES_BOOL fullresolve,
+		NCURSES_BOOL literal)
+		{ return(*(int *)0); }
+
+/* ./tinfo/comp_scan.c */
+
+#undef _nc_syntax
+int	_nc_syntax;
+#undef _nc_strict_bsd
+int	_nc_strict_bsd;
+#undef _nc_curr_file_pos
+long	_nc_curr_file_pos;
+#undef _nc_comment_start
+long	_nc_comment_start;
+#undef _nc_comment_end
+long	_nc_comment_end;
+#undef _nc_start_line
+long	_nc_start_line;
+#undef _nc_curr_token
+struct token _nc_curr_token;
+#undef _nc_disable_period
+NCURSES_BOOL _nc_disable_period;
+
+#undef _nc_reset_input
+void	_nc_reset_input(
+		FILE	*fp,
+		char	*buf)
+		{ /* void */ }
+
+#undef _nc_get_token
+int	_nc_get_token(
+		NCURSES_BOOL silent)
+		{ return(*(int *)0); }
+
+#undef _nc_trans_string
+int	_nc_trans_string(
+		char	*ptr,
+		char	*last)
+		{ return(*(int *)0); }
+
+#undef _nc_push_token
+void	_nc_push_token(
+		int	tokclass)
+		{ /* void */ }
+
+#undef _nc_panic_mode
+void	_nc_panic_mode(
+		char	ch)
+		{ /* void */ }
+
+/* ./tinfo/parse_entry.c */
+
+#undef _nc_parse_entry
+int	_nc_parse_entry(
+		ENTRY	*entryp,
+		int	literal,
+		NCURSES_BOOL silent)
+		{ return(*(int *)0); }
+
+#undef _nc_capcmp
+int	_nc_capcmp(
+		const char *s,
+		const char *t)
+		{ return(*(int *)0); }
+
+/* ./tinfo/write_entry.c */
+
+#undef _nc_set_writedir
+void	_nc_set_writedir(
+		const char *dir)
+		{ /* void */ }
+
+#undef _nc_write_entry
+void	_nc_write_entry(
+		TERMTYPE *const tp)
+		{ /* void */ }
+
+#undef _nc_write_object
+int	_nc_write_object(
+		TERMTYPE *tp,
+		char	*buffer,
+		unsigned *offset,
+		unsigned limit)
+		{ return(*(int *)0); }
+
+#undef _nc_tic_written
+int	_nc_tic_written(void)
+		{ return(*(int *)0); }
diff --git a/ncurses/llib-ltict b/ncurses/llib-ltict
new file mode 100644
index 0000000..b9895bc
--- /dev/null
+++ b/ncurses/llib-ltict
@@ -0,0 +1,203 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 2013-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey       2013-on                                  *
+ ****************************************************************************/
+/* LINTLIBRARY */
+
+/* ./tinfo/alloc_entry.c */
+
+#include <curses.priv.h>
+
+#undef _nc_init_entry
+void	_nc_init_entry(
+		ENTRY	*const tp)
+		{ /* void */ }
+
+#undef _nc_copy_entry
+ENTRY	*_nc_copy_entry(
+		ENTRY	*oldp)
+		{ return(*(ENTRY **)0); }
+
+#undef _nc_save_str
+char	*_nc_save_str(
+		const char *string)
+		{ return(*(char **)0); }
+
+#undef _nc_wrap_entry
+void	_nc_wrap_entry(
+		ENTRY	*const ep,
+		NCURSES_BOOL copy_strings)
+		{ /* void */ }
+
+#undef _nc_merge_entry
+void	_nc_merge_entry(
+		ENTRY	*const target,
+		ENTRY	*const source)
+		{ /* void */ }
+
+/* ./tinfo/captoinfo.c */
+
+#undef _nc_captoinfo
+char	*_nc_captoinfo(
+		const char *cap,
+		const char *s,
+		int const parameterized)
+		{ return(*(char **)0); }
+
+#undef _nc_infotocap
+char	*_nc_infotocap(
+		const char *cap,
+		const char *str,
+		int const parameterized)
+		{ return(*(char **)0); }
+
+/* ./tinfo/comp_expand.c */
+
+#undef _nc_tic_expand
+char	*_nc_tic_expand(
+		const char *srcp,
+		NCURSES_BOOL tic_format,
+		int	numbers)
+		{ return(*(char **)0); }
+
+/* ./tinfo/comp_parse.c */
+
+#undef _nc_check_termtype2
+void	(*_nc_check_termtype2)(
+		TERMTYPE *p1,
+		NCURSES_BOOL p2);
+
+#undef _nc_entry_match
+NCURSES_BOOL _nc_entry_match(
+		char	*n1,
+		char	*n2)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_read_entry_source
+void	_nc_read_entry_source(
+		FILE	*fp,
+		char	*buf,
+		int	literal,
+		NCURSES_BOOL silent,
+		NCURSES_BOOL (*hook)(
+		ENTRY	*p1))
+		{ /* void */ }
+
+#undef _nc_resolve_uses2
+int	_nc_resolve_uses2(
+		NCURSES_BOOL fullresolve,
+		NCURSES_BOOL literal)
+		{ return(*(int *)0); }
+
+/* ./tinfo/comp_scan.c */
+
+#undef _nc_syntax
+int	_nc_syntax;
+#undef _nc_strict_bsd
+int	_nc_strict_bsd;
+#undef _nc_curr_file_pos
+long	_nc_curr_file_pos;
+#undef _nc_comment_start
+long	_nc_comment_start;
+#undef _nc_comment_end
+long	_nc_comment_end;
+#undef _nc_start_line
+long	_nc_start_line;
+#undef _nc_curr_token
+struct token _nc_curr_token;
+#undef _nc_disable_period
+NCURSES_BOOL _nc_disable_period;
+
+#undef _nc_reset_input
+void	_nc_reset_input(
+		FILE	*fp,
+		char	*buf)
+		{ /* void */ }
+
+#undef _nc_get_token
+int	_nc_get_token(
+		NCURSES_BOOL silent)
+		{ return(*(int *)0); }
+
+#undef _nc_trans_string
+int	_nc_trans_string(
+		char	*ptr,
+		char	*last)
+		{ return(*(int *)0); }
+
+#undef _nc_push_token
+void	_nc_push_token(
+		int	tokclass)
+		{ /* void */ }
+
+#undef _nc_panic_mode
+void	_nc_panic_mode(
+		char	ch)
+		{ /* void */ }
+
+/* ./tinfo/parse_entry.c */
+
+#undef _nc_parse_entry
+int	_nc_parse_entry(
+		ENTRY	*entryp,
+		int	literal,
+		NCURSES_BOOL silent)
+		{ return(*(int *)0); }
+
+#undef _nc_capcmp
+int	_nc_capcmp(
+		const char *s,
+		const char *t)
+		{ return(*(int *)0); }
+
+/* ./tinfo/write_entry.c */
+
+#undef _nc_set_writedir
+void	_nc_set_writedir(
+		const char *dir)
+		{ /* void */ }
+
+#undef _nc_write_entry
+void	_nc_write_entry(
+		TERMTYPE *const tp)
+		{ /* void */ }
+
+#undef _nc_write_object
+int	_nc_write_object(
+		TERMTYPE *tp,
+		char	*buffer,
+		unsigned *offset,
+		unsigned limit)
+		{ return(*(int *)0); }
+
+#undef _nc_tic_written
+int	_nc_tic_written(void)
+		{ return(*(int *)0); }
diff --git a/ncurses/llib-ltictw b/ncurses/llib-ltictw
new file mode 100644
index 0000000..2e407fd
--- /dev/null
+++ b/ncurses/llib-ltictw
@@ -0,0 +1,203 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 2012-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey       2012-on                                  *
+ ****************************************************************************/
+/* LINTLIBRARY */
+
+/* ./tinfo/alloc_entry.c */
+
+#include <curses.priv.h>
+
+#undef _nc_init_entry
+void	_nc_init_entry(
+		ENTRY	*const tp)
+		{ /* void */ }
+
+#undef _nc_copy_entry
+ENTRY	*_nc_copy_entry(
+		ENTRY	*oldp)
+		{ return(*(ENTRY **)0); }
+
+#undef _nc_save_str
+char	*_nc_save_str(
+		const char *string)
+		{ return(*(char **)0); }
+
+#undef _nc_wrap_entry
+void	_nc_wrap_entry(
+		ENTRY	*const ep,
+		NCURSES_BOOL copy_strings)
+		{ /* void */ }
+
+#undef _nc_merge_entry
+void	_nc_merge_entry(
+		ENTRY	*const target,
+		ENTRY	*const source)
+		{ /* void */ }
+
+/* ./tinfo/captoinfo.c */
+
+#undef _nc_captoinfo
+char	*_nc_captoinfo(
+		const char *cap,
+		const char *s,
+		int const parameterized)
+		{ return(*(char **)0); }
+
+#undef _nc_infotocap
+char	*_nc_infotocap(
+		const char *cap,
+		const char *str,
+		int const parameterized)
+		{ return(*(char **)0); }
+
+/* ./tinfo/comp_expand.c */
+
+#undef _nc_tic_expand
+char	*_nc_tic_expand(
+		const char *srcp,
+		NCURSES_BOOL tic_format,
+		int	numbers)
+		{ return(*(char **)0); }
+
+/* ./tinfo/comp_parse.c */
+
+#undef _nc_check_termtype2
+void	(*_nc_check_termtype2)(
+		TERMTYPE2 *p1,
+		NCURSES_BOOL p2);
+
+#undef _nc_entry_match
+NCURSES_BOOL _nc_entry_match(
+		char	*n1,
+		char	*n2)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_read_entry_source
+void	_nc_read_entry_source(
+		FILE	*fp,
+		char	*buf,
+		int	literal,
+		NCURSES_BOOL silent,
+		NCURSES_BOOL (*hook)(
+		ENTRY	*p1))
+		{ /* void */ }
+
+#undef _nc_resolve_uses2
+int	_nc_resolve_uses2(
+		NCURSES_BOOL fullresolve,
+		NCURSES_BOOL literal)
+		{ return(*(int *)0); }
+
+/* ./tinfo/comp_scan.c */
+
+#undef _nc_syntax
+int	_nc_syntax;
+#undef _nc_strict_bsd
+int	_nc_strict_bsd;
+#undef _nc_curr_file_pos
+long	_nc_curr_file_pos;
+#undef _nc_comment_start
+long	_nc_comment_start;
+#undef _nc_comment_end
+long	_nc_comment_end;
+#undef _nc_start_line
+long	_nc_start_line;
+#undef _nc_curr_token
+struct token _nc_curr_token;
+#undef _nc_disable_period
+NCURSES_BOOL _nc_disable_period;
+
+#undef _nc_reset_input
+void	_nc_reset_input(
+		FILE	*fp,
+		char	*buf)
+		{ /* void */ }
+
+#undef _nc_get_token
+int	_nc_get_token(
+		NCURSES_BOOL silent)
+		{ return(*(int *)0); }
+
+#undef _nc_trans_string
+int	_nc_trans_string(
+		char	*ptr,
+		char	*last)
+		{ return(*(int *)0); }
+
+#undef _nc_push_token
+void	_nc_push_token(
+		int	tokclass)
+		{ /* void */ }
+
+#undef _nc_panic_mode
+void	_nc_panic_mode(
+		char	ch)
+		{ /* void */ }
+
+/* ./tinfo/parse_entry.c */
+
+#undef _nc_parse_entry
+int	_nc_parse_entry(
+		ENTRY	*entryp,
+		int	literal,
+		NCURSES_BOOL silent)
+		{ return(*(int *)0); }
+
+#undef _nc_capcmp
+int	_nc_capcmp(
+		const char *s,
+		const char *t)
+		{ return(*(int *)0); }
+
+/* ./tinfo/write_entry.c */
+
+#undef _nc_set_writedir
+void	_nc_set_writedir(
+		const char *dir)
+		{ /* void */ }
+
+#undef _nc_write_entry
+void	_nc_write_entry(
+		TERMTYPE2 *const tp)
+		{ /* void */ }
+
+#undef _nc_write_object
+int	_nc_write_object(
+		TERMTYPE2 *tp,
+		char	*buffer,
+		unsigned *offset,
+		unsigned limit)
+		{ return(*(int *)0); }
+
+#undef _nc_tic_written
+int	_nc_tic_written(void)
+		{ return(*(int *)0); }
diff --git a/ncurses/llib-lticw b/ncurses/llib-lticw
new file mode 100644
index 0000000..2e407fd
--- /dev/null
+++ b/ncurses/llib-lticw
@@ -0,0 +1,203 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 2012-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey       2012-on                                  *
+ ****************************************************************************/
+/* LINTLIBRARY */
+
+/* ./tinfo/alloc_entry.c */
+
+#include <curses.priv.h>
+
+#undef _nc_init_entry
+void	_nc_init_entry(
+		ENTRY	*const tp)
+		{ /* void */ }
+
+#undef _nc_copy_entry
+ENTRY	*_nc_copy_entry(
+		ENTRY	*oldp)
+		{ return(*(ENTRY **)0); }
+
+#undef _nc_save_str
+char	*_nc_save_str(
+		const char *string)
+		{ return(*(char **)0); }
+
+#undef _nc_wrap_entry
+void	_nc_wrap_entry(
+		ENTRY	*const ep,
+		NCURSES_BOOL copy_strings)
+		{ /* void */ }
+
+#undef _nc_merge_entry
+void	_nc_merge_entry(
+		ENTRY	*const target,
+		ENTRY	*const source)
+		{ /* void */ }
+
+/* ./tinfo/captoinfo.c */
+
+#undef _nc_captoinfo
+char	*_nc_captoinfo(
+		const char *cap,
+		const char *s,
+		int const parameterized)
+		{ return(*(char **)0); }
+
+#undef _nc_infotocap
+char	*_nc_infotocap(
+		const char *cap,
+		const char *str,
+		int const parameterized)
+		{ return(*(char **)0); }
+
+/* ./tinfo/comp_expand.c */
+
+#undef _nc_tic_expand
+char	*_nc_tic_expand(
+		const char *srcp,
+		NCURSES_BOOL tic_format,
+		int	numbers)
+		{ return(*(char **)0); }
+
+/* ./tinfo/comp_parse.c */
+
+#undef _nc_check_termtype2
+void	(*_nc_check_termtype2)(
+		TERMTYPE2 *p1,
+		NCURSES_BOOL p2);
+
+#undef _nc_entry_match
+NCURSES_BOOL _nc_entry_match(
+		char	*n1,
+		char	*n2)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_read_entry_source
+void	_nc_read_entry_source(
+		FILE	*fp,
+		char	*buf,
+		int	literal,
+		NCURSES_BOOL silent,
+		NCURSES_BOOL (*hook)(
+		ENTRY	*p1))
+		{ /* void */ }
+
+#undef _nc_resolve_uses2
+int	_nc_resolve_uses2(
+		NCURSES_BOOL fullresolve,
+		NCURSES_BOOL literal)
+		{ return(*(int *)0); }
+
+/* ./tinfo/comp_scan.c */
+
+#undef _nc_syntax
+int	_nc_syntax;
+#undef _nc_strict_bsd
+int	_nc_strict_bsd;
+#undef _nc_curr_file_pos
+long	_nc_curr_file_pos;
+#undef _nc_comment_start
+long	_nc_comment_start;
+#undef _nc_comment_end
+long	_nc_comment_end;
+#undef _nc_start_line
+long	_nc_start_line;
+#undef _nc_curr_token
+struct token _nc_curr_token;
+#undef _nc_disable_period
+NCURSES_BOOL _nc_disable_period;
+
+#undef _nc_reset_input
+void	_nc_reset_input(
+		FILE	*fp,
+		char	*buf)
+		{ /* void */ }
+
+#undef _nc_get_token
+int	_nc_get_token(
+		NCURSES_BOOL silent)
+		{ return(*(int *)0); }
+
+#undef _nc_trans_string
+int	_nc_trans_string(
+		char	*ptr,
+		char	*last)
+		{ return(*(int *)0); }
+
+#undef _nc_push_token
+void	_nc_push_token(
+		int	tokclass)
+		{ /* void */ }
+
+#undef _nc_panic_mode
+void	_nc_panic_mode(
+		char	ch)
+		{ /* void */ }
+
+/* ./tinfo/parse_entry.c */
+
+#undef _nc_parse_entry
+int	_nc_parse_entry(
+		ENTRY	*entryp,
+		int	literal,
+		NCURSES_BOOL silent)
+		{ return(*(int *)0); }
+
+#undef _nc_capcmp
+int	_nc_capcmp(
+		const char *s,
+		const char *t)
+		{ return(*(int *)0); }
+
+/* ./tinfo/write_entry.c */
+
+#undef _nc_set_writedir
+void	_nc_set_writedir(
+		const char *dir)
+		{ /* void */ }
+
+#undef _nc_write_entry
+void	_nc_write_entry(
+		TERMTYPE2 *const tp)
+		{ /* void */ }
+
+#undef _nc_write_object
+int	_nc_write_object(
+		TERMTYPE2 *tp,
+		char	*buffer,
+		unsigned *offset,
+		unsigned limit)
+		{ return(*(int *)0); }
+
+#undef _nc_tic_written
+int	_nc_tic_written(void)
+		{ return(*(int *)0); }
diff --git a/ncurses/llib-ltinfo b/ncurses/llib-ltinfo
new file mode 100644
index 0000000..a5cd7cd
--- /dev/null
+++ b/ncurses/llib-ltinfo
@@ -0,0 +1,1556 @@
+/****************************************************************************
+ * Copyright 2019-2021,2022 Thomas E. Dickey                                *
+ * Copyright 2012-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey       2012-on                                  *
+ ****************************************************************************/
+/* LINTLIBRARY */
+
+/* ./tinfo/access.c */
+
+#include <curses.priv.h>
+
+#undef _nc_rootname
+char	*_nc_rootname(
+		char	*path)
+		{ return(*(char **)0); }
+
+#undef _nc_is_abs_path
+NCURSES_BOOL _nc_is_abs_path(
+		const char *path)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_pathlast
+unsigned _nc_pathlast(
+		const char *path)
+		{ return(*(unsigned *)0); }
+
+#undef _nc_basename
+char	*_nc_basename(
+		char	*path)
+		{ return(*(char **)0); }
+
+#undef _nc_access
+int	_nc_access(
+		const char *path,
+		int	mode)
+		{ return(*(int *)0); }
+
+#undef _nc_is_dir_path
+NCURSES_BOOL _nc_is_dir_path(
+		const char *path)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_is_file_path
+NCURSES_BOOL _nc_is_file_path(
+		const char *path)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_env_access
+int	_nc_env_access(void)
+		{ return(*(int *)0); }
+
+#undef _nc_safe_fopen
+FILE	*_nc_safe_fopen(
+		const char *path,
+		const char *mode)
+		{ return(*(FILE **)0); }
+
+#undef _nc_safe_open3
+int	_nc_safe_open3(
+		const char *path,
+		int	flags,
+		mode_t	mode)
+		{ return(*(int *)0); }
+
+/* ./tinfo/add_tries.c */
+
+#undef _nc_add_to_try
+int	_nc_add_to_try(
+		TRIES	**tree,
+		const char *str,
+		unsigned code)
+		{ return(*(int *)0); }
+
+/* ./tinfo/alloc_ttype.c */
+
+#undef _nc_align_termtype
+void	_nc_align_termtype(
+		TERMTYPE *to,
+		TERMTYPE *from)
+		{ /* void */ }
+
+#undef _nc_copy_termtype
+void	_nc_copy_termtype(
+		TERMTYPE *dst,
+		const TERMTYPE *src)
+		{ /* void */ }
+
+/* ./codes.c */
+
+#undef boolcodes
+const char *const boolcodes[] = {0};
+#undef numcodes
+const char *const numcodes[] = {0};
+#undef strcodes
+const char *const strcodes[] = {0};
+
+/* ./comp_captab.c */
+
+#undef _nc_get_table
+const struct name_table_entry *_nc_get_table(
+		NCURSES_BOOL termcap)
+		{ return(*(const struct name_table_entry **)0); }
+
+#undef _nc_get_hash_table
+const HashValue *_nc_get_hash_table(
+		NCURSES_BOOL termcap)
+		{ return(*(const HashValue **)0); }
+
+#undef _nc_get_alias_table
+const struct alias *_nc_get_alias_table(
+		NCURSES_BOOL termcap)
+		{ return(*(const struct alias **)0); }
+
+#undef _nc_get_hash_info
+const HashData *_nc_get_hash_info(
+		NCURSES_BOOL termcap)
+		{ return(*(const HashData **)0); }
+
+/* ./tinfo/comp_error.c */
+
+#undef _nc_suppress_warnings
+NCURSES_BOOL _nc_suppress_warnings;
+#undef _nc_curr_line
+int	_nc_curr_line;
+#undef _nc_curr_col
+int	_nc_curr_col;
+
+#undef _nc_get_source
+const char *_nc_get_source(void)
+		{ return(*(const char **)0); }
+
+#undef _nc_set_source
+void	_nc_set_source(
+		const char *const name)
+		{ /* void */ }
+
+#undef _nc_set_type
+void	_nc_set_type(
+		const char *const name)
+		{ /* void */ }
+
+#undef _nc_get_type
+void	_nc_get_type(
+		char	*name)
+		{ /* void */ }
+
+#undef _nc_warning
+void	_nc_warning(
+		const char *const fmt,
+		...)
+		{ /* void */ }
+
+#undef _nc_err_abort
+void	_nc_err_abort(
+		const char *const fmt,
+		...)
+		{ /* void */ }
+
+#undef _nc_syserr_abort
+void	_nc_syserr_abort(
+		const char *const fmt,
+		...)
+		{ /* void */ }
+
+/* ./tinfo/comp_hash.c */
+
+#undef _nc_find_entry
+struct name_table_entry const *_nc_find_entry(
+		const char *string,
+		const HashValue *hash_table)
+		{ return(*(struct name_table_entry const **)0); }
+
+#undef _nc_find_type_entry
+struct name_table_entry const *_nc_find_type_entry(
+		const char *string,
+		int	type,
+		NCURSES_BOOL termcap)
+		{ return(*(struct name_table_entry const **)0); }
+
+#undef _nc_find_user_entry
+struct user_table_entry const *_nc_find_user_entry(
+		const char *string)
+		{ return(*(struct user_table_entry const **)0); }
+
+/* ./comp_userdefs.c */
+
+#undef _nc_get_userdefs_table
+const struct user_table_entry *_nc_get_userdefs_table(void)
+		{ return(*(const struct user_table_entry **)0); }
+
+#undef _nc_get_hash_user
+const HashData *_nc_get_hash_user(void)
+		{ return(*(const HashData **)0); }
+
+/* ./tinfo/db_iterator.c */
+
+#undef _nc_tic_dir
+const char *_nc_tic_dir(
+		const char *path)
+		{ return(*(const char **)0); }
+
+#undef _nc_keep_tic_dir
+void	_nc_keep_tic_dir(
+		const char *path)
+		{ /* void */ }
+
+#undef _nc_last_db
+void	_nc_last_db(void)
+		{ /* void */ }
+
+#undef _nc_next_db
+const char *_nc_next_db(
+		DBDIRS	*state,
+		int	*offset)
+		{ return(*(const char **)0); }
+
+#undef _nc_first_db
+void	_nc_first_db(
+		DBDIRS	*state,
+		int	*offset)
+		{ /* void */ }
+
+/* ./tinfo/doalloc.c */
+
+#undef _nc_doalloc
+void	*_nc_doalloc(
+		void	*oldp,
+		size_t	amount)
+		{ return(*(void **)0); }
+
+/* ./tinfo/entries.c */
+
+#undef _nc_head
+ENTRY	*_nc_head;
+#undef _nc_tail
+ENTRY	*_nc_tail;
+
+#undef _nc_free_entry
+void	_nc_free_entry(
+		ENTRY	*headp,
+		TERMTYPE *tterm)
+		{ /* void */ }
+
+#undef _nc_free_entries
+void	_nc_free_entries(
+		ENTRY	*headp)
+		{ /* void */ }
+
+#undef _nc_leaks_tinfo
+void	_nc_leaks_tinfo(void)
+		{ /* void */ }
+
+#undef exit_terminfo
+void	exit_terminfo(
+		int	code)
+		{ /* void */ }
+
+/* ./fallback.c */
+
+#undef _nc_fallback
+const TERMTYPE *_nc_fallback(
+		const char *name)
+		{ return(*(const TERMTYPE **)0); }
+
+/* ./tinfo/free_ttype.c */
+
+#undef _nc_free_termtype
+void	_nc_free_termtype(
+		TERMTYPE *ptr)
+		{ /* void */ }
+
+#undef _nc_free_termtype1
+void	_nc_free_termtype1(
+		TERMTYPE *ptr)
+		{ /* void */ }
+
+#undef _nc_user_definable
+NCURSES_BOOL _nc_user_definable;
+
+#undef use_extended_names
+int	use_extended_names(
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+/* ./tinfo/getenv_num.c */
+
+#undef _nc_getenv_num
+int	_nc_getenv_num(
+		const char *name)
+		{ return(*(int *)0); }
+
+#undef _nc_setenv_num
+void	_nc_setenv_num(
+		const char *name,
+		int	value)
+		{ /* void */ }
+
+/* ./tinfo/home_terminfo.c */
+
+#undef _nc_home_terminfo
+char	*_nc_home_terminfo(void)
+		{ return(*(char **)0); }
+
+/* ./tinfo/init_keytry.c */
+
+#undef _nc_init_keytry
+void	_nc_init_keytry(
+		SCREEN	*sp)
+		{ /* void */ }
+
+/* ./tinfo/lib_acs.c */
+
+#undef acs_map
+chtype	acs_map[128];
+
+#undef _nc_init_acs_sp
+void	_nc_init_acs_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_init_acs
+void	_nc_init_acs(void)
+		{ /* void */ }
+
+/* ./tinfo/lib_baudrate.c */
+
+struct speed {
+    int given_speed;
+    int actual_speed;
+};
+
+#undef _nc_baudrate
+int	_nc_baudrate(
+		int	OSpeed)
+		{ return(*(int *)0); }
+
+#undef _nc_ospeed
+int	_nc_ospeed(
+		int	BaudRate)
+		{ return(*(int *)0); }
+
+#undef baudrate_sp
+int	baudrate_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef baudrate
+int	baudrate(void)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_cur_term.c */
+
+#undef cur_term
+TERMINAL *cur_term;
+
+#undef set_curterm_sp
+TERMINAL *set_curterm_sp(
+		SCREEN	*sp,
+		TERMINAL *termp)
+		{ return(*(TERMINAL **)0); }
+
+#undef set_curterm
+TERMINAL *set_curterm(
+		TERMINAL *termp)
+		{ return(*(TERMINAL **)0); }
+
+#undef del_curterm_sp
+int	del_curterm_sp(
+		SCREEN	*sp,
+		TERMINAL *termp)
+		{ return(*(int *)0); }
+
+#undef del_curterm
+int	del_curterm(
+		TERMINAL *termp)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_data.c */
+
+#undef stdscr
+WINDOW	*stdscr;
+#undef curscr
+WINDOW	*curscr;
+#undef newscr
+WINDOW	*newscr;
+#undef _nc_screen_chain
+SCREEN	*_nc_screen_chain;
+#undef SP
+SCREEN	*SP;
+#undef _nc_globals
+NCURSES_GLOBALS _nc_globals;
+#undef _nc_prescreen
+NCURSES_PRESCREEN _nc_prescreen;
+
+#undef _nc_screen_of
+SCREEN	*_nc_screen_of(
+		WINDOW	*win)
+		{ return(*(SCREEN **)0); }
+
+/* ./tinfo/lib_has_cap.c */
+
+#undef has_ic_sp
+NCURSES_BOOL has_ic_sp(
+		SCREEN	*sp)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef has_ic
+NCURSES_BOOL has_ic(void)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef has_il_sp
+NCURSES_BOOL has_il_sp(
+		SCREEN	*sp)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef has_il
+NCURSES_BOOL has_il(void)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./tinfo/lib_kernel.c */
+
+#undef erasechar_sp
+char	erasechar_sp(
+		SCREEN	*sp)
+		{ return(*(char *)0); }
+
+#undef erasechar
+char	erasechar(void)
+		{ return(*(char *)0); }
+
+#undef killchar_sp
+char	killchar_sp(
+		SCREEN	*sp)
+		{ return(*(char *)0); }
+
+#undef killchar
+char	killchar(void)
+		{ return(*(char *)0); }
+
+#undef flushinp_sp
+int	flushinp_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef flushinp
+int	flushinp(void)
+		{ return(*(int *)0); }
+
+/* ./lib_keyname.c */
+
+struct kn { short offset; int code; };
+
+#undef keyname_sp
+const char *keyname_sp(
+		SCREEN	*sp,
+		int	c)
+		{ return(*(const char **)0); }
+
+#undef keyname
+const char *keyname(
+		int	c)
+		{ return(*(const char **)0); }
+
+/* ./tinfo/lib_longname.c */
+
+#undef longname_sp
+char	*longname_sp(
+		SCREEN	*sp)
+		{ return(*(char **)0); }
+
+#undef longname
+char	*longname(void)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_napms.c */
+
+#undef napms_sp
+int	napms_sp(
+		SCREEN	*sp,
+		int	ms)
+		{ return(*(int *)0); }
+
+#undef napms
+int	napms(
+		int	ms)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_options.c */
+
+#undef idlok
+int	idlok(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef idcok
+void	idcok(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ /* void */ }
+
+#undef halfdelay_sp
+int	halfdelay_sp(
+		SCREEN	*sp,
+		int	t)
+		{ return(*(int *)0); }
+
+#undef halfdelay
+int	halfdelay(
+		int	t)
+		{ return(*(int *)0); }
+
+#undef nodelay
+int	nodelay(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef notimeout
+int	notimeout(
+		WINDOW	*win,
+		NCURSES_BOOL f)
+		{ return(*(int *)0); }
+
+#undef wtimeout
+void	wtimeout(
+		WINDOW	*win,
+		int	delay)
+		{ /* void */ }
+
+#undef keypad
+int	keypad(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef meta
+int	meta(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef curs_set_sp
+int	curs_set_sp(
+		SCREEN	*sp,
+		int	vis)
+		{ return(*(int *)0); }
+
+#undef curs_set
+int	curs_set(
+		int	vis)
+		{ return(*(int *)0); }
+
+#undef typeahead_sp
+int	typeahead_sp(
+		SCREEN	*sp,
+		int	fd)
+		{ return(*(int *)0); }
+
+#undef typeahead
+int	typeahead(
+		int	fd)
+		{ return(*(int *)0); }
+
+#undef has_key_sp
+int	has_key_sp(
+		SCREEN	*sp,
+		int	keycode)
+		{ return(*(int *)0); }
+
+#undef has_key
+int	has_key(
+		int	keycode)
+		{ return(*(int *)0); }
+
+#undef _nc_putp_flush_sp
+int	_nc_putp_flush_sp(
+		SCREEN	*sp,
+		const char *name,
+		const char *value)
+		{ return(*(int *)0); }
+
+#undef _nc_keypad
+int	_nc_keypad(
+		SCREEN	*sp,
+		int	flag)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_raw.c */
+
+#undef raw_sp
+int	raw_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef raw
+int	raw(void)
+		{ return(*(int *)0); }
+
+#undef cbreak_sp
+int	cbreak_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef cbreak
+int	cbreak(void)
+		{ return(*(int *)0); }
+
+#undef qiflush_sp
+void	qiflush_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef qiflush
+void	qiflush(void)
+		{ /* void */ }
+
+#undef noraw_sp
+int	noraw_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef noraw
+int	noraw(void)
+		{ return(*(int *)0); }
+
+#undef nocbreak_sp
+int	nocbreak_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef nocbreak
+int	nocbreak(void)
+		{ return(*(int *)0); }
+
+#undef noqiflush_sp
+void	noqiflush_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef noqiflush
+void	noqiflush(void)
+		{ /* void */ }
+
+#undef intrflush_sp
+int	intrflush_sp(
+		SCREEN	*sp,
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef intrflush
+int	intrflush(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_setup.c */
+
+#undef ttytype
+char	ttytype[256];
+#undef LINES
+int	LINES;
+#undef COLS
+int	COLS;
+#undef TABSIZE
+int	TABSIZE;
+
+#undef set_tabsize_sp
+int	set_tabsize_sp(
+		SCREEN	*sp,
+		int	value)
+		{ return(*(int *)0); }
+
+#undef set_tabsize
+int	set_tabsize(
+		int	value)
+		{ return(*(int *)0); }
+
+#undef _nc_handle_sigwinch
+int	_nc_handle_sigwinch(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef use_env_sp
+void	use_env_sp(
+		SCREEN	*sp,
+		NCURSES_BOOL f)
+		{ /* void */ }
+
+#undef use_tioctl_sp
+void	use_tioctl_sp(
+		SCREEN	*sp,
+		NCURSES_BOOL f)
+		{ /* void */ }
+
+#undef use_env
+void	use_env(
+		NCURSES_BOOL f)
+		{ /* void */ }
+
+#undef use_tioctl
+void	use_tioctl(
+		NCURSES_BOOL f)
+		{ /* void */ }
+
+#undef _nc_get_screensize
+void	_nc_get_screensize(
+		SCREEN	*sp,
+		int	*linep,
+		int	*colp)
+		{ /* void */ }
+
+#undef _nc_update_screensize
+void	_nc_update_screensize(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_setup_tinfo
+int	_nc_setup_tinfo(
+		const char *const tn,
+		TERMTYPE *const tp)
+		{ return(*(int *)0); }
+
+#undef _nc_tinfo_cmdch
+void	_nc_tinfo_cmdch(
+		TERMINAL *termp,
+		int	proto)
+		{ /* void */ }
+
+#undef _nc_get_locale
+char	*_nc_get_locale(void)
+		{ return(*(char **)0); }
+
+#undef _nc_unicode_locale
+int	_nc_unicode_locale(void)
+		{ return(*(int *)0); }
+
+#undef _nc_locale_breaks_acs
+int	_nc_locale_breaks_acs(
+		TERMINAL *termp)
+		{ return(*(int *)0); }
+
+#undef _nc_setupterm
+int	_nc_setupterm(
+		const char *tname,
+		int	Filedes,
+		int	*errret,
+		int	reuse)
+		{ return(*(int *)0); }
+
+#undef new_prescr
+SCREEN	*new_prescr(void)
+		{ return(*(SCREEN **)0); }
+
+#undef setupterm
+int	setupterm(
+		const char *tname,
+		int	Filedes,
+		int	*errret)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_termcap.c */
+
+#undef UP
+char	*UP;
+#undef BC
+char	*BC;
+
+#undef tgetent_sp
+int	tgetent_sp(
+		SCREEN	*sp,
+		char	*bufp,
+		const char *name)
+		{ return(*(int *)0); }
+
+#undef tgetent
+int	tgetent(
+		char	*bufp,
+		const char *name)
+		{ return(*(int *)0); }
+
+#undef tgetflag_sp
+int	tgetflag_sp(
+		SCREEN	*sp,
+		const char *id)
+		{ return(*(int *)0); }
+
+#undef tgetflag
+int	tgetflag(
+		const char *id)
+		{ return(*(int *)0); }
+
+#undef tgetnum_sp
+int	tgetnum_sp(
+		SCREEN	*sp,
+		const char *id)
+		{ return(*(int *)0); }
+
+#undef tgetnum
+int	tgetnum(
+		const char *id)
+		{ return(*(int *)0); }
+
+#undef tgetstr_sp
+char	*tgetstr_sp(
+		SCREEN	*sp,
+		const char *id,
+		char	**area)
+		{ return(*(char **)0); }
+
+#undef tgetstr
+char	*tgetstr(
+		const char *id,
+		char	**area)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_termname.c */
+
+#undef termname_sp
+char	*termname_sp(
+		SCREEN	*sp)
+		{ return(*(char **)0); }
+
+#undef termname
+char	*termname(void)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_tgoto.c */
+
+#undef tgoto
+char	*tgoto(
+		const char *string,
+		int	x,
+		int	y)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_ti.c */
+
+#undef tigetflag_sp
+int	tigetflag_sp(
+		SCREEN	*sp,
+		const char *str)
+		{ return(*(int *)0); }
+
+#undef tigetflag
+int	tigetflag(
+		const char *str)
+		{ return(*(int *)0); }
+
+#undef tigetnum_sp
+int	tigetnum_sp(
+		SCREEN	*sp,
+		const char *str)
+		{ return(*(int *)0); }
+
+#undef tigetnum
+int	tigetnum(
+		const char *str)
+		{ return(*(int *)0); }
+
+#undef tigetstr_sp
+char	*tigetstr_sp(
+		SCREEN	*sp,
+		const char *str)
+		{ return(*(char **)0); }
+
+#undef tigetstr
+char	*tigetstr(
+		const char *str)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_tparm.c */
+
+#undef _nc_tparm_err
+int	_nc_tparm_err;
+
+#undef _nc_free_tparm
+void	_nc_free_tparm(
+		TERMINAL *termp)
+		{ /* void */ }
+
+#undef _nc_tparm_analyze
+int	_nc_tparm_analyze(
+		TERMINAL *term,
+		const char *string,
+		char	**p_is_s,
+		int	*_nc_popcount)
+		{ return(*(int *)0); }
+
+#undef tparm
+char	*tparm(
+		const char *string,
+		...)
+		{ return(*(char **)0); }
+
+#undef tiparm
+char	*tiparm(
+		const char *string,
+		...)
+		{ return(*(char **)0); }
+
+#undef _nc_tiparm
+char	*_nc_tiparm(
+		int	expected,
+		const char *string,
+		...)
+		{ return(*(char **)0); }
+
+#undef _nc_reset_tparm
+void	_nc_reset_tparm(
+		TERMINAL *term)
+		{ /* void */ }
+
+/* ./tinfo/lib_tputs.c */
+
+#undef PC
+char	PC;
+#undef ospeed
+short	ospeed;
+#undef _nc_nulls_sent
+int	_nc_nulls_sent;
+
+#undef _nc_set_no_padding
+void	_nc_set_no_padding(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef delay_output_sp
+int	delay_output_sp(
+		SCREEN	*sp,
+		int	ms)
+		{ return(*(int *)0); }
+
+#undef delay_output
+int	delay_output(
+		int	ms)
+		{ return(*(int *)0); }
+
+#undef _nc_flush_sp
+void	_nc_flush_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_flush
+void	_nc_flush(void)
+		{ /* void */ }
+
+#undef _nc_outch_sp
+int	_nc_outch_sp(
+		SCREEN	*sp,
+		int	ch)
+		{ return(*(int *)0); }
+
+#undef _nc_outch
+int	_nc_outch(
+		int	ch)
+		{ return(*(int *)0); }
+
+#undef _nc_putchar_sp
+int	_nc_putchar_sp(
+		SCREEN	*sp,
+		int	ch)
+		{ return(*(int *)0); }
+
+#undef _nc_putchar
+int	_nc_putchar(
+		int	ch)
+		{ return(*(int *)0); }
+
+#undef putp_sp
+int	putp_sp(
+		SCREEN	*sp,
+		const char *string)
+		{ return(*(int *)0); }
+
+#undef putp
+int	putp(
+		const char *string)
+		{ return(*(int *)0); }
+
+#undef _nc_putp_sp
+int	_nc_putp_sp(
+		SCREEN	*sp,
+		const char *name,
+		const char *string)
+		{ return(*(int *)0); }
+
+#undef _nc_putp
+int	_nc_putp(
+		const char *name,
+		const char *string)
+		{ return(*(int *)0); }
+
+#undef tputs_sp
+int	tputs_sp(
+		SCREEN	*sp,
+		const char *string,
+		int	affcnt,
+		NCURSES_OUTC_sp outc)
+		{ return(*(int *)0); }
+
+#undef _nc_outc_wrapper
+int	_nc_outc_wrapper(
+		SCREEN	*sp,
+		int	c)
+		{ return(*(int *)0); }
+
+#undef tputs
+int	tputs(
+		const char *string,
+		int	affcnt,
+		int	(*outc)(
+		int	p1))
+		{ return(*(int *)0); }
+
+/* ./trace/lib_trace.c */
+
+#undef _nc_tracing
+unsigned _nc_tracing;
+#undef _nc_tputs_trace
+const char *_nc_tputs_trace = {0};
+#undef _nc_outchars
+long	_nc_outchars;
+
+#undef curses_trace
+unsigned curses_trace(
+		unsigned tracelevel)
+		{ return(*(unsigned *)0); }
+
+#undef trace
+void	trace(
+		const unsigned int tracelevel)
+		{ /* void */ }
+
+#undef _tracef
+void	_tracef(
+		const char *fmt,
+		...)
+		{ /* void */ }
+
+#undef _nc_retrace_bool
+NCURSES_BOOL _nc_retrace_bool(
+		int	code)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_retrace_char
+char	_nc_retrace_char(
+		int	code)
+		{ return(*(char *)0); }
+
+#undef _nc_retrace_int
+int	_nc_retrace_int(
+		int	code)
+		{ return(*(int *)0); }
+
+#undef _nc_retrace_unsigned
+unsigned _nc_retrace_unsigned(
+		unsigned code)
+		{ return(*(unsigned *)0); }
+
+#undef _nc_retrace_ptr
+char	*_nc_retrace_ptr(
+		char	*code)
+		{ return(*(char **)0); }
+
+#undef _nc_retrace_cptr
+const char *_nc_retrace_cptr(
+		const char *code)
+		{ return(*(const char **)0); }
+
+#undef _nc_retrace_cvoid_ptr
+const void *_nc_retrace_cvoid_ptr(
+		const void *code)
+		{ return(*(const void **)0); }
+
+#undef _nc_retrace_void_ptr
+void	*_nc_retrace_void_ptr(
+		void	*code)
+		{ return(*(void **)0); }
+
+#undef _nc_retrace_sp
+SCREEN	*_nc_retrace_sp(
+		SCREEN	*code)
+		{ return(*(SCREEN **)0); }
+
+#undef _nc_retrace_win
+WINDOW	*_nc_retrace_win(
+		WINDOW	*code)
+		{ return(*(WINDOW **)0); }
+
+#undef _nc_fmt_funcptr
+char	*_nc_fmt_funcptr(
+		char	*target,
+		const char *source,
+		size_t	size)
+		{ return(*(char **)0); }
+
+/* ./trace/lib_traceatr.c */
+
+#undef _traceattr2
+char	*_traceattr2(
+		int	bufnum,
+		chtype	newmode)
+		{ return(*(char **)0); }
+
+#undef _traceattr
+char	*_traceattr(
+		attr_t	newmode)
+		{ return(*(char **)0); }
+
+#undef _nc_retrace_int_attr_t
+int	_nc_retrace_int_attr_t(
+		attr_t	code)
+		{ return(*(int *)0); }
+
+#undef _nc_retrace_attr_t
+attr_t	_nc_retrace_attr_t(
+		attr_t	code)
+		{ return(*(attr_t *)0); }
+
+#undef _nc_altcharset_name
+const char *_nc_altcharset_name(
+		attr_t	attr,
+		chtype	ch)
+		{ return(*(const char **)0); }
+
+#undef _tracechtype2
+char	*_tracechtype2(
+		int	bufnum,
+		chtype	ch)
+		{ return(*(char **)0); }
+
+#undef _tracechtype
+char	*_tracechtype(
+		chtype	ch)
+		{ return(*(char **)0); }
+
+#undef _nc_retrace_chtype
+chtype	_nc_retrace_chtype(
+		chtype	code)
+		{ return(*(chtype *)0); }
+
+/* ./trace/lib_tracebits.c */
+
+#undef _nc_trace_ttymode
+char	*_nc_trace_ttymode(
+		const struct termios *tty)
+		{ return(*(char **)0); }
+
+#undef _nc_tracebits
+char	*_nc_tracebits(void)
+		{ return(*(char **)0); }
+
+/* ./trace/lib_tracechr.c */
+
+#undef _nc_tracechar
+char	*_nc_tracechar(
+		SCREEN	*sp,
+		int	ch)
+		{ return(*(char **)0); }
+
+#undef _tracechar
+char	*_tracechar(
+		int	ch)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_ttyflags.c */
+
+#undef _nc_get_tty_mode_sp
+int	_nc_get_tty_mode_sp(
+		SCREEN	*sp,
+		struct termios *buf)
+		{ return(*(int *)0); }
+
+#undef _nc_get_tty_mode
+int	_nc_get_tty_mode(
+		struct termios *buf)
+		{ return(*(int *)0); }
+
+#undef _nc_set_tty_mode_sp
+int	_nc_set_tty_mode_sp(
+		SCREEN	*sp,
+		struct termios *buf)
+		{ return(*(int *)0); }
+
+#undef _nc_set_tty_mode
+int	_nc_set_tty_mode(
+		struct termios *buf)
+		{ return(*(int *)0); }
+
+#undef def_shell_mode_sp
+int	def_shell_mode_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef def_shell_mode
+int	def_shell_mode(void)
+		{ return(*(int *)0); }
+
+#undef def_prog_mode_sp
+int	def_prog_mode_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef def_prog_mode
+int	def_prog_mode(void)
+		{ return(*(int *)0); }
+
+#undef reset_prog_mode_sp
+int	reset_prog_mode_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef reset_prog_mode
+int	reset_prog_mode(void)
+		{ return(*(int *)0); }
+
+#undef reset_shell_mode_sp
+int	reset_shell_mode_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef reset_shell_mode
+int	reset_shell_mode(void)
+		{ return(*(int *)0); }
+
+#undef savetty_sp
+int	savetty_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef savetty
+int	savetty(void)
+		{ return(*(int *)0); }
+
+#undef resetty_sp
+int	resetty_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef resetty
+int	resetty(void)
+		{ return(*(int *)0); }
+
+/* ./tty/lib_twait.c */
+
+#undef _nc_timed_wait
+int	_nc_timed_wait(
+		SCREEN	*sp,
+		int	mode,
+		int	milliseconds,
+		int	*timeleft)
+		{ return(*(int *)0); }
+
+/* ./tinfo/name_match.c */
+
+#undef _nc_first_name
+char	*_nc_first_name(
+		const char *const sp)
+		{ return(*(char **)0); }
+
+#undef _nc_name_match
+int	_nc_name_match(
+		const char *const namelst,
+		const char *const name,
+		const char *const delim)
+		{ return(*(int *)0); }
+
+/* ./names.c */
+
+#undef boolnames
+const char *const boolnames[] = {0};
+#undef boolfnames
+const char *const boolfnames[] = {0};
+#undef numnames
+const char *const numnames[] = {0};
+#undef numfnames
+const char *const numfnames[] = {0};
+#undef strnames
+const char *const strnames[] = {0};
+#undef strfnames
+const char *const strfnames[] = {0};
+
+/* ./tinfo/obsolete.c */
+
+#undef _nc_set_buffer_sp
+void	_nc_set_buffer_sp(
+		SCREEN	*sp,
+		FILE	*ofp,
+		int	buffered)
+		{ /* void */ }
+
+#undef _nc_set_buffer
+void	_nc_set_buffer(
+		FILE	*ofp,
+		int	buffered)
+		{ /* void */ }
+
+/* ./tinfo/read_entry.c */
+
+#undef _nc_init_termtype
+void	_nc_init_termtype(
+		TERMTYPE *const tp)
+		{ /* void */ }
+
+#undef _nc_read_termtype
+int	_nc_read_termtype(
+		TERMTYPE *ptr,
+		char	*buffer,
+		int	limit)
+		{ return(*(int *)0); }
+
+#undef _nc_read_file_entry
+int	_nc_read_file_entry(
+		const char *const filename,
+		TERMTYPE *ptr)
+		{ return(*(int *)0); }
+
+#undef _nc_read_entry
+int	_nc_read_entry(
+		const char *const name,
+		char	*const filename,
+		TERMTYPE *const tp)
+		{ return(*(int *)0); }
+
+/* ./tinfo/read_termcap.c */
+
+#undef _nc_read_termcap
+void	_nc_read_termcap(void)
+		{ /* void */ }
+
+/* ./tinfo/strings.c */
+
+#undef _nc_str_init
+string_desc *_nc_str_init(
+		string_desc *dst,
+		char	*src,
+		size_t	len)
+		{ return(*(string_desc **)0); }
+
+#undef _nc_str_null
+string_desc *_nc_str_null(
+		string_desc *dst,
+		size_t	len)
+		{ return(*(string_desc **)0); }
+
+#undef _nc_str_copy
+string_desc *_nc_str_copy(
+		string_desc *dst,
+		string_desc *src)
+		{ return(*(string_desc **)0); }
+
+#undef _nc_safe_strcat
+NCURSES_BOOL _nc_safe_strcat(
+		string_desc *dst,
+		const char *src)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_safe_strcpy
+NCURSES_BOOL _nc_safe_strcpy(
+		string_desc *dst,
+		const char *src)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./trace/trace_buf.c */
+
+#undef _nc_trace_buf
+char	*_nc_trace_buf(
+		int	bufnum,
+		size_t	want)
+		{ return(*(char **)0); }
+
+#undef _nc_trace_bufcat
+char	*_nc_trace_bufcat(
+		int	bufnum,
+		const char *value)
+		{ return(*(char **)0); }
+
+/* ./trace/trace_tries.c */
+
+#undef _nc_trace_tries
+void	_nc_trace_tries(
+		TRIES	*tree)
+		{ /* void */ }
+
+/* ./base/tries.c */
+
+#undef _nc_expand_try
+char	*_nc_expand_try(
+		TRIES	*tree,
+		unsigned code,
+		int	*count,
+		size_t	len)
+		{ return(*(char **)0); }
+
+#undef _nc_remove_key
+int	_nc_remove_key(
+		TRIES	**tree,
+		unsigned code)
+		{ return(*(int *)0); }
+
+#undef _nc_remove_string
+int	_nc_remove_string(
+		TRIES	**tree,
+		const char *string)
+		{ return(*(int *)0); }
+
+/* ./tinfo/trim_sgr0.c */
+
+#undef _nc_trim_sgr0
+char	*_nc_trim_sgr0(
+		TERMTYPE *tp)
+		{ return(*(char **)0); }
+
+/* ./unctrl.c */
+
+#undef unctrl_sp
+const char *unctrl_sp(
+		SCREEN	*sp,
+		chtype	ch)
+		{ return(*(const char **)0); }
+
+#undef unctrl
+const char *unctrl(
+		chtype	ch)
+		{ return(*(const char **)0); }
+
+/* ./trace/visbuf.c */
+
+#undef _nc_visbuf2
+const char *_nc_visbuf2(
+		int	bufnum,
+		const char *buf)
+		{ return(*(const char **)0); }
+
+#undef _nc_visbuf
+const char *_nc_visbuf(
+		const char *buf)
+		{ return(*(const char **)0); }
+
+#undef _nc_visbufn
+const char *_nc_visbufn(
+		const char *buf,
+		int	len)
+		{ return(*(const char **)0); }
+
+#undef _nc_viscbuf2
+const char *_nc_viscbuf2(
+		int	bufnum,
+		const chtype *buf,
+		int	len)
+		{ return(*(const char **)0); }
+
+#undef _nc_viscbuf
+const char *_nc_viscbuf(
+		const chtype *buf,
+		int	len)
+		{ return(*(const char **)0); }
+
+/* ./base/define_key.c */
+
+#undef define_key_sp
+int	define_key_sp(
+		SCREEN	*sp,
+		const char *str,
+		int	keycode)
+		{ return(*(int *)0); }
+
+#undef define_key
+int	define_key(
+		const char *str,
+		int	keycode)
+		{ return(*(int *)0); }
+
+/* ./tinfo/hashed_db.c */
+
+#undef _nc_hashed_db
+void	_nc_hashed_db(void)
+		{ /* void */ }
+
+/* ./base/key_defined.c */
+
+#undef key_defined_sp
+int	key_defined_sp(
+		SCREEN	*sp,
+		const char *str)
+		{ return(*(int *)0); }
+
+#undef key_defined
+int	key_defined(
+		const char *str)
+		{ return(*(int *)0); }
+
+/* ./base/keybound.c */
+
+#undef keybound_sp
+char	*keybound_sp(
+		SCREEN	*sp,
+		int	code,
+		int	count)
+		{ return(*(char **)0); }
+
+#undef keybound
+char	*keybound(
+		int	code,
+		int	count)
+		{ return(*(char **)0); }
+
+/* ./base/keyok.c */
+
+#undef keyok_sp
+int	keyok_sp(
+		SCREEN	*sp,
+		int	c,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef keyok
+int	keyok(
+		int	c,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+/* ./base/version.c */
+
+#undef curses_version
+const char *curses_version(void)
+		{ return(*(const char **)0); }
diff --git a/ncurses/llib-ltinfot b/ncurses/llib-ltinfot
new file mode 100644
index 0000000..bd3de81
--- /dev/null
+++ b/ncurses/llib-ltinfot
@@ -0,0 +1,1668 @@
+/****************************************************************************
+ * Copyright 2019-2021,2022 Thomas E. Dickey                                *
+ * Copyright 2013-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey       2013-on                                  *
+ ****************************************************************************/
+/* LINTLIBRARY */
+
+/* ./tinfo/access.c */
+
+#include <curses.priv.h>
+
+#undef _nc_rootname
+char	*_nc_rootname(
+		char	*path)
+		{ return(*(char **)0); }
+
+#undef _nc_is_abs_path
+NCURSES_BOOL _nc_is_abs_path(
+		const char *path)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_pathlast
+unsigned _nc_pathlast(
+		const char *path)
+		{ return(*(unsigned *)0); }
+
+#undef _nc_basename
+char	*_nc_basename(
+		char	*path)
+		{ return(*(char **)0); }
+
+#undef _nc_access
+int	_nc_access(
+		const char *path,
+		int	mode)
+		{ return(*(int *)0); }
+
+#undef _nc_is_dir_path
+NCURSES_BOOL _nc_is_dir_path(
+		const char *path)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_is_file_path
+NCURSES_BOOL _nc_is_file_path(
+		const char *path)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_env_access
+int	_nc_env_access(void)
+		{ return(*(int *)0); }
+
+#undef _nc_safe_fopen
+FILE	*_nc_safe_fopen(
+		const char *path,
+		const char *mode)
+		{ return(*(FILE **)0); }
+
+#undef _nc_safe_open3
+int	_nc_safe_open3(
+		const char *path,
+		int	flags,
+		mode_t	mode)
+		{ return(*(int *)0); }
+
+/* ./tinfo/add_tries.c */
+
+#undef _nc_add_to_try
+int	_nc_add_to_try(
+		TRIES	**tree,
+		const char *str,
+		unsigned code)
+		{ return(*(int *)0); }
+
+/* ./tinfo/alloc_ttype.c */
+
+#undef _nc_align_termtype
+void	_nc_align_termtype(
+		TERMTYPE *to,
+		TERMTYPE *from)
+		{ /* void */ }
+
+#undef _nc_copy_termtype
+void	_nc_copy_termtype(
+		TERMTYPE *dst,
+		const TERMTYPE *src)
+		{ /* void */ }
+
+/* ./codes.c */
+
+#undef _nc_boolcodes
+const char *const *_nc_boolcodes(void)
+		{ return(*(const char **)0); }
+
+#undef _nc_numcodes
+const char *const *_nc_numcodes(void)
+		{ return(*(const char **)0); }
+
+#undef _nc_strcodes
+const char *const *_nc_strcodes(void)
+		{ return(*(const char **)0); }
+
+/* ./comp_captab.c */
+
+#undef _nc_get_table
+const struct name_table_entry *_nc_get_table(
+		NCURSES_BOOL termcap)
+		{ return(*(const struct name_table_entry **)0); }
+
+#undef _nc_get_hash_table
+const HashValue *_nc_get_hash_table(
+		NCURSES_BOOL termcap)
+		{ return(*(const HashValue **)0); }
+
+#undef _nc_get_alias_table
+const struct alias *_nc_get_alias_table(
+		NCURSES_BOOL termcap)
+		{ return(*(const struct alias **)0); }
+
+#undef _nc_get_hash_info
+const HashData *_nc_get_hash_info(
+		NCURSES_BOOL termcap)
+		{ return(*(const HashData **)0); }
+
+/* ./tinfo/comp_error.c */
+
+#undef _nc_suppress_warnings
+NCURSES_BOOL _nc_suppress_warnings;
+#undef _nc_curr_line
+int	_nc_curr_line;
+#undef _nc_curr_col
+int	_nc_curr_col;
+
+#undef _nc_get_source
+const char *_nc_get_source(void)
+		{ return(*(const char **)0); }
+
+#undef _nc_set_source
+void	_nc_set_source(
+		const char *const name)
+		{ /* void */ }
+
+#undef _nc_set_type
+void	_nc_set_type(
+		const char *const name)
+		{ /* void */ }
+
+#undef _nc_get_type
+void	_nc_get_type(
+		char	*name)
+		{ /* void */ }
+
+#undef _nc_warning
+void	_nc_warning(
+		const char *const fmt,
+		...)
+		{ /* void */ }
+
+#undef _nc_err_abort
+void	_nc_err_abort(
+		const char *const fmt,
+		...)
+		{ /* void */ }
+
+#undef _nc_syserr_abort
+void	_nc_syserr_abort(
+		const char *const fmt,
+		...)
+		{ /* void */ }
+
+/* ./tinfo/comp_hash.c */
+
+#undef _nc_find_entry
+struct name_table_entry const *_nc_find_entry(
+		const char *string,
+		const HashValue *hash_table)
+		{ return(*(struct name_table_entry const **)0); }
+
+#undef _nc_find_type_entry
+struct name_table_entry const *_nc_find_type_entry(
+		const char *string,
+		int	type,
+		NCURSES_BOOL termcap)
+		{ return(*(struct name_table_entry const **)0); }
+
+#undef _nc_find_user_entry
+struct user_table_entry const *_nc_find_user_entry(
+		const char *string)
+		{ return(*(struct user_table_entry const **)0); }
+
+/* ./comp_userdefs.c */
+
+#undef _nc_get_userdefs_table
+const struct user_table_entry *_nc_get_userdefs_table(void)
+		{ return(*(const struct user_table_entry **)0); }
+
+#undef _nc_get_hash_user
+const HashData *_nc_get_hash_user(void)
+		{ return(*(const HashData **)0); }
+
+/* ./tinfo/db_iterator.c */
+
+#undef _nc_tic_dir
+const char *_nc_tic_dir(
+		const char *path)
+		{ return(*(const char **)0); }
+
+#undef _nc_keep_tic_dir
+void	_nc_keep_tic_dir(
+		const char *path)
+		{ /* void */ }
+
+#undef _nc_last_db
+void	_nc_last_db(void)
+		{ /* void */ }
+
+#undef _nc_next_db
+const char *_nc_next_db(
+		DBDIRS	*state,
+		int	*offset)
+		{ return(*(const char **)0); }
+
+#undef _nc_first_db
+void	_nc_first_db(
+		DBDIRS	*state,
+		int	*offset)
+		{ /* void */ }
+
+/* ./tinfo/doalloc.c */
+
+#undef _nc_doalloc
+void	*_nc_doalloc(
+		void	*oldp,
+		size_t	amount)
+		{ return(*(void **)0); }
+
+/* ./tinfo/entries.c */
+
+#undef _nc_head
+ENTRY	*_nc_head;
+#undef _nc_tail
+ENTRY	*_nc_tail;
+
+#undef _nc_free_entry
+void	_nc_free_entry(
+		ENTRY	*headp,
+		TERMTYPE *tterm)
+		{ /* void */ }
+
+#undef _nc_free_entries
+void	_nc_free_entries(
+		ENTRY	*headp)
+		{ /* void */ }
+
+#undef _nc_leaks_tinfo
+void	_nc_leaks_tinfo(void)
+		{ /* void */ }
+
+#undef exit_terminfo
+void	exit_terminfo(
+		int	code)
+		{ /* void */ }
+
+/* ./fallback.c */
+
+#undef _nc_fallback
+const TERMTYPE *_nc_fallback(
+		const char *name)
+		{ return(*(const TERMTYPE **)0); }
+
+/* ./tinfo/free_ttype.c */
+
+#undef _nc_free_termtype
+void	_nc_free_termtype(
+		TERMTYPE *ptr)
+		{ /* void */ }
+
+#undef _nc_free_termtype1
+void	_nc_free_termtype1(
+		TERMTYPE *ptr)
+		{ /* void */ }
+
+#undef _nc_user_definable
+NCURSES_BOOL _nc_user_definable;
+
+#undef use_extended_names
+int	use_extended_names(
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+/* ./tinfo/getenv_num.c */
+
+#undef _nc_getenv_num
+int	_nc_getenv_num(
+		const char *name)
+		{ return(*(int *)0); }
+
+#undef _nc_setenv_num
+void	_nc_setenv_num(
+		const char *name,
+		int	value)
+		{ /* void */ }
+
+/* ./tinfo/home_terminfo.c */
+
+#undef _nc_home_terminfo
+char	*_nc_home_terminfo(void)
+		{ return(*(char **)0); }
+
+/* ./tinfo/init_keytry.c */
+
+#undef _nc_init_keytry
+void	_nc_init_keytry(
+		SCREEN	*sp)
+		{ /* void */ }
+
+/* ./tinfo/lib_acs.c */
+
+#undef _nc_acs_map
+chtype	*_nc_acs_map(void)
+		{ return(*(chtype **)0); }
+
+#undef _nc_init_acs_sp
+void	_nc_init_acs_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_init_acs
+void	_nc_init_acs(void)
+		{ /* void */ }
+
+/* ./tinfo/lib_baudrate.c */
+
+struct speed {
+    int given_speed;
+    int actual_speed;
+};
+
+#undef _nc_baudrate
+int	_nc_baudrate(
+		int	OSpeed)
+		{ return(*(int *)0); }
+
+#undef _nc_ospeed
+int	_nc_ospeed(
+		int	BaudRate)
+		{ return(*(int *)0); }
+
+#undef baudrate_sp
+int	baudrate_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef baudrate
+int	baudrate(void)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_cur_term.c */
+
+#undef _nc_get_cur_term_sp
+TERMINAL *_nc_get_cur_term_sp(
+		SCREEN	*sp)
+		{ return(*(TERMINAL **)0); }
+
+#undef _nc_get_cur_term
+TERMINAL *_nc_get_cur_term(void)
+		{ return(*(TERMINAL **)0); }
+
+#undef _nc_cur_term
+TERMINAL *_nc_cur_term(void)
+		{ return(*(TERMINAL **)0); }
+
+#undef set_curterm_sp
+TERMINAL *set_curterm_sp(
+		SCREEN	*sp,
+		TERMINAL *termp)
+		{ return(*(TERMINAL **)0); }
+
+#undef set_curterm
+TERMINAL *set_curterm(
+		TERMINAL *termp)
+		{ return(*(TERMINAL **)0); }
+
+#undef del_curterm_sp
+int	del_curterm_sp(
+		SCREEN	*sp,
+		TERMINAL *termp)
+		{ return(*(int *)0); }
+
+#undef del_curterm
+int	del_curterm(
+		TERMINAL *termp)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_data.c */
+
+#undef _nc_stdscr
+WINDOW	*_nc_stdscr(void)
+		{ return(*(WINDOW **)0); }
+
+#undef _nc_curscr
+WINDOW	*_nc_curscr(void)
+		{ return(*(WINDOW **)0); }
+
+#undef _nc_newscr
+WINDOW	*_nc_newscr(void)
+		{ return(*(WINDOW **)0); }
+
+#undef _nc_screen_chain
+SCREEN	*_nc_screen_chain;
+#undef SP
+SCREEN	*SP;
+#undef _nc_globals
+NCURSES_GLOBALS _nc_globals;
+#undef _nc_prescreen
+NCURSES_PRESCREEN _nc_prescreen;
+
+#undef _nc_screen_of
+SCREEN	*_nc_screen_of(
+		WINDOW	*win)
+		{ return(*(SCREEN **)0); }
+
+#undef _nc_init_pthreads
+void	_nc_init_pthreads(void)
+		{ /* void */ }
+
+#undef _nc_mutex_init
+void	_nc_mutex_init(
+		pthread_mutex_t *obj)
+		{ /* void */ }
+
+#undef _nc_mutex_lock
+int	_nc_mutex_lock(
+		pthread_mutex_t *obj)
+		{ return(*(int *)0); }
+
+#undef _nc_mutex_trylock
+int	_nc_mutex_trylock(
+		pthread_mutex_t *obj)
+		{ return(*(int *)0); }
+
+#undef _nc_mutex_unlock
+int	_nc_mutex_unlock(
+		pthread_mutex_t *obj)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_has_cap.c */
+
+#undef has_ic_sp
+NCURSES_BOOL has_ic_sp(
+		SCREEN	*sp)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef has_ic
+NCURSES_BOOL has_ic(void)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef has_il_sp
+NCURSES_BOOL has_il_sp(
+		SCREEN	*sp)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef has_il
+NCURSES_BOOL has_il(void)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./tinfo/lib_kernel.c */
+
+#undef erasechar_sp
+char	erasechar_sp(
+		SCREEN	*sp)
+		{ return(*(char *)0); }
+
+#undef erasechar
+char	erasechar(void)
+		{ return(*(char *)0); }
+
+#undef killchar_sp
+char	killchar_sp(
+		SCREEN	*sp)
+		{ return(*(char *)0); }
+
+#undef killchar
+char	killchar(void)
+		{ return(*(char *)0); }
+
+#undef flushinp_sp
+int	flushinp_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef flushinp
+int	flushinp(void)
+		{ return(*(int *)0); }
+
+/* ./lib_keyname.c */
+
+struct kn { short offset; int code; };
+
+#undef keyname_sp
+const char *keyname_sp(
+		SCREEN	*sp,
+		int	c)
+		{ return(*(const char **)0); }
+
+#undef keyname
+const char *keyname(
+		int	c)
+		{ return(*(const char **)0); }
+
+/* ./tinfo/lib_longname.c */
+
+#undef longname_sp
+char	*longname_sp(
+		SCREEN	*sp)
+		{ return(*(char **)0); }
+
+#undef longname
+char	*longname(void)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_napms.c */
+
+#undef napms_sp
+int	napms_sp(
+		SCREEN	*sp,
+		int	ms)
+		{ return(*(int *)0); }
+
+#undef napms
+int	napms(
+		int	ms)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_options.c */
+
+#undef idlok
+int	idlok(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef idcok
+void	idcok(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ /* void */ }
+
+#undef halfdelay_sp
+int	halfdelay_sp(
+		SCREEN	*sp,
+		int	t)
+		{ return(*(int *)0); }
+
+#undef halfdelay
+int	halfdelay(
+		int	t)
+		{ return(*(int *)0); }
+
+#undef nodelay
+int	nodelay(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef notimeout
+int	notimeout(
+		WINDOW	*win,
+		NCURSES_BOOL f)
+		{ return(*(int *)0); }
+
+#undef wtimeout
+void	wtimeout(
+		WINDOW	*win,
+		int	delay)
+		{ /* void */ }
+
+#undef keypad
+int	keypad(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef meta
+int	meta(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef curs_set_sp
+int	curs_set_sp(
+		SCREEN	*sp,
+		int	vis)
+		{ return(*(int *)0); }
+
+#undef curs_set
+int	curs_set(
+		int	vis)
+		{ return(*(int *)0); }
+
+#undef typeahead_sp
+int	typeahead_sp(
+		SCREEN	*sp,
+		int	fd)
+		{ return(*(int *)0); }
+
+#undef typeahead
+int	typeahead(
+		int	fd)
+		{ return(*(int *)0); }
+
+#undef has_key_sp
+int	has_key_sp(
+		SCREEN	*sp,
+		int	keycode)
+		{ return(*(int *)0); }
+
+#undef has_key
+int	has_key(
+		int	keycode)
+		{ return(*(int *)0); }
+
+#undef _nc_putp_flush_sp
+int	_nc_putp_flush_sp(
+		SCREEN	*sp,
+		const char *name,
+		const char *value)
+		{ return(*(int *)0); }
+
+#undef _nc_keypad
+int	_nc_keypad(
+		SCREEN	*sp,
+		int	flag)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_raw.c */
+
+#undef raw_sp
+int	raw_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef raw
+int	raw(void)
+		{ return(*(int *)0); }
+
+#undef cbreak_sp
+int	cbreak_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef cbreak
+int	cbreak(void)
+		{ return(*(int *)0); }
+
+#undef qiflush_sp
+void	qiflush_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef qiflush
+void	qiflush(void)
+		{ /* void */ }
+
+#undef noraw_sp
+int	noraw_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef noraw
+int	noraw(void)
+		{ return(*(int *)0); }
+
+#undef nocbreak_sp
+int	nocbreak_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef nocbreak
+int	nocbreak(void)
+		{ return(*(int *)0); }
+
+#undef noqiflush_sp
+void	noqiflush_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef noqiflush
+void	noqiflush(void)
+		{ /* void */ }
+
+#undef intrflush_sp
+int	intrflush_sp(
+		SCREEN	*sp,
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef intrflush
+int	intrflush(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_setup.c */
+
+#undef _nc_ttytype
+char	*_nc_ttytype(void)
+		{ return(*(char **)0); }
+
+#undef _nc_ptr_Lines
+int	*_nc_ptr_Lines(
+		SCREEN	*sp)
+		{ return(*(int **)0); }
+
+#undef _nc_LINES
+int	_nc_LINES(void)
+		{ return(*(int *)0); }
+
+#undef _nc_ptr_Cols
+int	*_nc_ptr_Cols(
+		SCREEN	*sp)
+		{ return(*(int **)0); }
+
+#undef _nc_COLS
+int	_nc_COLS(void)
+		{ return(*(int *)0); }
+
+#undef _nc_ptr_Tabsize
+int	*_nc_ptr_Tabsize(
+		SCREEN	*sp)
+		{ return(*(int **)0); }
+
+#undef _nc_TABSIZE
+int	_nc_TABSIZE(void)
+		{ return(*(int *)0); }
+
+#undef set_tabsize_sp
+int	set_tabsize_sp(
+		SCREEN	*sp,
+		int	value)
+		{ return(*(int *)0); }
+
+#undef set_tabsize
+int	set_tabsize(
+		int	value)
+		{ return(*(int *)0); }
+
+#undef _nc_handle_sigwinch
+int	_nc_handle_sigwinch(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef use_env_sp
+void	use_env_sp(
+		SCREEN	*sp,
+		NCURSES_BOOL f)
+		{ /* void */ }
+
+#undef use_tioctl_sp
+void	use_tioctl_sp(
+		SCREEN	*sp,
+		NCURSES_BOOL f)
+		{ /* void */ }
+
+#undef use_env
+void	use_env(
+		NCURSES_BOOL f)
+		{ /* void */ }
+
+#undef use_tioctl
+void	use_tioctl(
+		NCURSES_BOOL f)
+		{ /* void */ }
+
+#undef _nc_get_screensize
+void	_nc_get_screensize(
+		SCREEN	*sp,
+		int	*linep,
+		int	*colp)
+		{ /* void */ }
+
+#undef _nc_update_screensize
+void	_nc_update_screensize(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_setup_tinfo
+int	_nc_setup_tinfo(
+		const char *const tn,
+		TERMTYPE *const tp)
+		{ return(*(int *)0); }
+
+#undef _nc_tinfo_cmdch
+void	_nc_tinfo_cmdch(
+		TERMINAL *termp,
+		int	proto)
+		{ /* void */ }
+
+#undef _nc_get_locale
+char	*_nc_get_locale(void)
+		{ return(*(char **)0); }
+
+#undef _nc_unicode_locale
+int	_nc_unicode_locale(void)
+		{ return(*(int *)0); }
+
+#undef _nc_locale_breaks_acs
+int	_nc_locale_breaks_acs(
+		TERMINAL *termp)
+		{ return(*(int *)0); }
+
+#undef _nc_setupterm
+int	_nc_setupterm(
+		const char *tname,
+		int	Filedes,
+		int	*errret,
+		int	reuse)
+		{ return(*(int *)0); }
+
+#undef _nc_find_prescr
+SCREEN	*_nc_find_prescr(void)
+		{ return(*(SCREEN **)0); }
+
+#undef _nc_forget_prescr
+void	_nc_forget_prescr(void)
+		{ /* void */ }
+
+#undef new_prescr
+SCREEN	*new_prescr(void)
+		{ return(*(SCREEN **)0); }
+
+#undef setupterm
+int	setupterm(
+		const char *tname,
+		int	Filedes,
+		int	*errret)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_termcap.c */
+
+#undef UP
+char	*UP;
+#undef BC
+char	*BC;
+
+#undef tgetent_sp
+int	tgetent_sp(
+		SCREEN	*sp,
+		char	*bufp,
+		const char *name)
+		{ return(*(int *)0); }
+
+#undef tgetent
+int	tgetent(
+		char	*bufp,
+		const char *name)
+		{ return(*(int *)0); }
+
+#undef tgetflag_sp
+int	tgetflag_sp(
+		SCREEN	*sp,
+		const char *id)
+		{ return(*(int *)0); }
+
+#undef tgetflag
+int	tgetflag(
+		const char *id)
+		{ return(*(int *)0); }
+
+#undef tgetnum_sp
+int	tgetnum_sp(
+		SCREEN	*sp,
+		const char *id)
+		{ return(*(int *)0); }
+
+#undef tgetnum
+int	tgetnum(
+		const char *id)
+		{ return(*(int *)0); }
+
+#undef tgetstr_sp
+char	*tgetstr_sp(
+		SCREEN	*sp,
+		const char *id,
+		char	**area)
+		{ return(*(char **)0); }
+
+#undef tgetstr
+char	*tgetstr(
+		const char *id,
+		char	**area)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_termname.c */
+
+#undef termname_sp
+char	*termname_sp(
+		SCREEN	*sp)
+		{ return(*(char **)0); }
+
+#undef termname
+char	*termname(void)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_tgoto.c */
+
+#undef tgoto
+char	*tgoto(
+		const char *string,
+		int	x,
+		int	y)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_ti.c */
+
+#undef tigetflag_sp
+int	tigetflag_sp(
+		SCREEN	*sp,
+		const char *str)
+		{ return(*(int *)0); }
+
+#undef tigetflag
+int	tigetflag(
+		const char *str)
+		{ return(*(int *)0); }
+
+#undef tigetnum_sp
+int	tigetnum_sp(
+		SCREEN	*sp,
+		const char *str)
+		{ return(*(int *)0); }
+
+#undef tigetnum
+int	tigetnum(
+		const char *str)
+		{ return(*(int *)0); }
+
+#undef tigetstr_sp
+char	*tigetstr_sp(
+		SCREEN	*sp,
+		const char *str)
+		{ return(*(char **)0); }
+
+#undef tigetstr
+char	*tigetstr(
+		const char *str)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_tparm.c */
+
+#undef _nc_tparm_err
+int	_nc_tparm_err;
+
+#undef _nc_free_tparm
+void	_nc_free_tparm(
+		TERMINAL *termp)
+		{ /* void */ }
+
+#undef _nc_tparm_analyze
+int	_nc_tparm_analyze(
+		TERMINAL *term,
+		const char *string,
+		char	**p_is_s,
+		int	*_nc_popcount)
+		{ return(*(int *)0); }
+
+#undef tparm
+char	*tparm(
+		const char *string,
+		...)
+		{ return(*(char **)0); }
+
+#undef tiparm
+char	*tiparm(
+		const char *string,
+		...)
+		{ return(*(char **)0); }
+
+#undef _nc_tiparm
+char	*_nc_tiparm(
+		int	expected,
+		const char *string,
+		...)
+		{ return(*(char **)0); }
+
+#undef _nc_reset_tparm
+void	_nc_reset_tparm(
+		TERMINAL *term)
+		{ /* void */ }
+
+/* ./tinfo/lib_tputs.c */
+
+#undef PC
+char	PC;
+#undef ospeed
+short	ospeed;
+#undef _nc_nulls_sent
+int	_nc_nulls_sent;
+
+#undef _nc_set_no_padding
+void	_nc_set_no_padding(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef delay_output_sp
+int	delay_output_sp(
+		SCREEN	*sp,
+		int	ms)
+		{ return(*(int *)0); }
+
+#undef delay_output
+int	delay_output(
+		int	ms)
+		{ return(*(int *)0); }
+
+#undef _nc_flush_sp
+void	_nc_flush_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_flush
+void	_nc_flush(void)
+		{ /* void */ }
+
+#undef _nc_outch_sp
+int	_nc_outch_sp(
+		SCREEN	*sp,
+		int	ch)
+		{ return(*(int *)0); }
+
+#undef _nc_outch
+int	_nc_outch(
+		int	ch)
+		{ return(*(int *)0); }
+
+#undef _nc_putchar_sp
+int	_nc_putchar_sp(
+		SCREEN	*sp,
+		int	ch)
+		{ return(*(int *)0); }
+
+#undef _nc_putchar
+int	_nc_putchar(
+		int	ch)
+		{ return(*(int *)0); }
+
+#undef putp_sp
+int	putp_sp(
+		SCREEN	*sp,
+		const char *string)
+		{ return(*(int *)0); }
+
+#undef putp
+int	putp(
+		const char *string)
+		{ return(*(int *)0); }
+
+#undef _nc_putp_sp
+int	_nc_putp_sp(
+		SCREEN	*sp,
+		const char *name,
+		const char *string)
+		{ return(*(int *)0); }
+
+#undef _nc_putp
+int	_nc_putp(
+		const char *name,
+		const char *string)
+		{ return(*(int *)0); }
+
+#undef tputs_sp
+int	tputs_sp(
+		SCREEN	*sp,
+		const char *string,
+		int	affcnt,
+		NCURSES_OUTC_sp outc)
+		{ return(*(int *)0); }
+
+#undef _nc_outc_wrapper
+int	_nc_outc_wrapper(
+		SCREEN	*sp,
+		int	c)
+		{ return(*(int *)0); }
+
+#undef tputs
+int	tputs(
+		const char *string,
+		int	affcnt,
+		int	(*outc)(
+		int	p1))
+		{ return(*(int *)0); }
+
+/* ./trace/lib_trace.c */
+
+#undef _nc_tracing
+unsigned _nc_tracing;
+
+#undef _nc__nc_tputs_trace
+const char *_nc__nc_tputs_trace(void)
+		{ return(*(const char **)0); }
+
+#undef _nc__nc_outchars
+long	_nc__nc_outchars(void)
+		{ return(*(long *)0); }
+
+#undef _nc_set_tputs_trace
+void	_nc_set_tputs_trace(
+		const char *s)
+		{ /* void */ }
+
+#undef _nc_count_outchars
+void	_nc_count_outchars(
+		long	increment)
+		{ /* void */ }
+
+#undef curses_trace
+unsigned curses_trace(
+		unsigned tracelevel)
+		{ return(*(unsigned *)0); }
+
+#undef trace
+void	trace(
+		const unsigned int tracelevel)
+		{ /* void */ }
+
+#undef _tracef
+void	_tracef(
+		const char *fmt,
+		...)
+		{ /* void */ }
+
+#undef _nc_retrace_bool
+NCURSES_BOOL _nc_retrace_bool(
+		int	code)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_retrace_char
+char	_nc_retrace_char(
+		int	code)
+		{ return(*(char *)0); }
+
+#undef _nc_retrace_int
+int	_nc_retrace_int(
+		int	code)
+		{ return(*(int *)0); }
+
+#undef _nc_retrace_unsigned
+unsigned _nc_retrace_unsigned(
+		unsigned code)
+		{ return(*(unsigned *)0); }
+
+#undef _nc_retrace_ptr
+char	*_nc_retrace_ptr(
+		char	*code)
+		{ return(*(char **)0); }
+
+#undef _nc_retrace_cptr
+const char *_nc_retrace_cptr(
+		const char *code)
+		{ return(*(const char **)0); }
+
+#undef _nc_retrace_cvoid_ptr
+const void *_nc_retrace_cvoid_ptr(
+		const void *code)
+		{ return(*(const void **)0); }
+
+#undef _nc_retrace_void_ptr
+void	*_nc_retrace_void_ptr(
+		void	*code)
+		{ return(*(void **)0); }
+
+#undef _nc_retrace_sp
+SCREEN	*_nc_retrace_sp(
+		SCREEN	*code)
+		{ return(*(SCREEN **)0); }
+
+#undef _nc_retrace_win
+WINDOW	*_nc_retrace_win(
+		WINDOW	*code)
+		{ return(*(WINDOW **)0); }
+
+#undef _nc_fmt_funcptr
+char	*_nc_fmt_funcptr(
+		char	*target,
+		const char *source,
+		size_t	size)
+		{ return(*(char **)0); }
+
+#undef _nc_use_tracef
+int	_nc_use_tracef(
+		unsigned mask)
+		{ return(*(int *)0); }
+
+#undef _nc_locked_tracef
+void	_nc_locked_tracef(
+		const char *fmt,
+		...)
+		{ /* void */ }
+
+/* ./trace/lib_traceatr.c */
+
+#undef _traceattr2
+char	*_traceattr2(
+		int	bufnum,
+		chtype	newmode)
+		{ return(*(char **)0); }
+
+#undef _traceattr
+char	*_traceattr(
+		attr_t	newmode)
+		{ return(*(char **)0); }
+
+#undef _nc_retrace_int_attr_t
+int	_nc_retrace_int_attr_t(
+		attr_t	code)
+		{ return(*(int *)0); }
+
+#undef _nc_retrace_attr_t
+attr_t	_nc_retrace_attr_t(
+		attr_t	code)
+		{ return(*(attr_t *)0); }
+
+#undef _nc_altcharset_name
+const char *_nc_altcharset_name(
+		attr_t	attr,
+		chtype	ch)
+		{ return(*(const char **)0); }
+
+#undef _tracechtype2
+char	*_tracechtype2(
+		int	bufnum,
+		chtype	ch)
+		{ return(*(char **)0); }
+
+#undef _tracechtype
+char	*_tracechtype(
+		chtype	ch)
+		{ return(*(char **)0); }
+
+#undef _nc_retrace_chtype
+chtype	_nc_retrace_chtype(
+		chtype	code)
+		{ return(*(chtype *)0); }
+
+/* ./trace/lib_tracebits.c */
+
+#undef _nc_trace_ttymode
+char	*_nc_trace_ttymode(
+		const struct termios *tty)
+		{ return(*(char **)0); }
+
+#undef _nc_tracebits
+char	*_nc_tracebits(void)
+		{ return(*(char **)0); }
+
+/* ./trace/lib_tracechr.c */
+
+#undef _nc_tracechar
+char	*_nc_tracechar(
+		SCREEN	*sp,
+		int	ch)
+		{ return(*(char **)0); }
+
+#undef _tracechar
+char	*_tracechar(
+		int	ch)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_ttyflags.c */
+
+#undef _nc_get_tty_mode_sp
+int	_nc_get_tty_mode_sp(
+		SCREEN	*sp,
+		struct termios *buf)
+		{ return(*(int *)0); }
+
+#undef _nc_get_tty_mode
+int	_nc_get_tty_mode(
+		struct termios *buf)
+		{ return(*(int *)0); }
+
+#undef _nc_set_tty_mode_sp
+int	_nc_set_tty_mode_sp(
+		SCREEN	*sp,
+		struct termios *buf)
+		{ return(*(int *)0); }
+
+#undef _nc_set_tty_mode
+int	_nc_set_tty_mode(
+		struct termios *buf)
+		{ return(*(int *)0); }
+
+#undef def_shell_mode_sp
+int	def_shell_mode_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef def_shell_mode
+int	def_shell_mode(void)
+		{ return(*(int *)0); }
+
+#undef def_prog_mode_sp
+int	def_prog_mode_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef def_prog_mode
+int	def_prog_mode(void)
+		{ return(*(int *)0); }
+
+#undef reset_prog_mode_sp
+int	reset_prog_mode_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef reset_prog_mode
+int	reset_prog_mode(void)
+		{ return(*(int *)0); }
+
+#undef reset_shell_mode_sp
+int	reset_shell_mode_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef reset_shell_mode
+int	reset_shell_mode(void)
+		{ return(*(int *)0); }
+
+#undef savetty_sp
+int	savetty_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef savetty
+int	savetty(void)
+		{ return(*(int *)0); }
+
+#undef resetty_sp
+int	resetty_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef resetty
+int	resetty(void)
+		{ return(*(int *)0); }
+
+/* ./tty/lib_twait.c */
+
+#undef _nc_timed_wait
+int	_nc_timed_wait(
+		SCREEN	*sp,
+		int	mode,
+		int	milliseconds,
+		int	*timeleft)
+		{ return(*(int *)0); }
+
+/* ./tinfo/name_match.c */
+
+#undef _nc_first_name
+char	*_nc_first_name(
+		const char *const sp)
+		{ return(*(char **)0); }
+
+#undef _nc_name_match
+int	_nc_name_match(
+		const char *const namelst,
+		const char *const name,
+		const char *const delim)
+		{ return(*(int *)0); }
+
+/* ./names.c */
+
+#undef _nc_boolnames
+const char *const *_nc_boolnames(void)
+		{ return(*(const char **)0); }
+
+#undef _nc_boolfnames
+const char *const *_nc_boolfnames(void)
+		{ return(*(const char **)0); }
+
+#undef _nc_numnames
+const char *const *_nc_numnames(void)
+		{ return(*(const char **)0); }
+
+#undef _nc_numfnames
+const char *const *_nc_numfnames(void)
+		{ return(*(const char **)0); }
+
+#undef _nc_strnames
+const char *const *_nc_strnames(void)
+		{ return(*(const char **)0); }
+
+#undef _nc_strfnames
+const char *const *_nc_strfnames(void)
+		{ return(*(const char **)0); }
+
+/* ./tinfo/obsolete.c */
+
+#undef _nc_set_buffer_sp
+void	_nc_set_buffer_sp(
+		SCREEN	*sp,
+		FILE	*ofp,
+		int	buffered)
+		{ /* void */ }
+
+#undef _nc_set_buffer
+void	_nc_set_buffer(
+		FILE	*ofp,
+		int	buffered)
+		{ /* void */ }
+
+/* ./tinfo/read_entry.c */
+
+#undef _nc_init_termtype
+void	_nc_init_termtype(
+		TERMTYPE *const tp)
+		{ /* void */ }
+
+#undef _nc_read_termtype
+int	_nc_read_termtype(
+		TERMTYPE *ptr,
+		char	*buffer,
+		int	limit)
+		{ return(*(int *)0); }
+
+#undef _nc_read_file_entry
+int	_nc_read_file_entry(
+		const char *const filename,
+		TERMTYPE *ptr)
+		{ return(*(int *)0); }
+
+#undef _nc_read_entry
+int	_nc_read_entry(
+		const char *const name,
+		char	*const filename,
+		TERMTYPE *const tp)
+		{ return(*(int *)0); }
+
+/* ./tinfo/read_termcap.c */
+
+#undef _nc_read_termcap
+void	_nc_read_termcap(void)
+		{ /* void */ }
+
+/* ./tinfo/strings.c */
+
+#undef _nc_str_init
+string_desc *_nc_str_init(
+		string_desc *dst,
+		char	*src,
+		size_t	len)
+		{ return(*(string_desc **)0); }
+
+#undef _nc_str_null
+string_desc *_nc_str_null(
+		string_desc *dst,
+		size_t	len)
+		{ return(*(string_desc **)0); }
+
+#undef _nc_str_copy
+string_desc *_nc_str_copy(
+		string_desc *dst,
+		string_desc *src)
+		{ return(*(string_desc **)0); }
+
+#undef _nc_safe_strcat
+NCURSES_BOOL _nc_safe_strcat(
+		string_desc *dst,
+		const char *src)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_safe_strcpy
+NCURSES_BOOL _nc_safe_strcpy(
+		string_desc *dst,
+		const char *src)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./trace/trace_buf.c */
+
+#undef _nc_trace_buf
+char	*_nc_trace_buf(
+		int	bufnum,
+		size_t	want)
+		{ return(*(char **)0); }
+
+#undef _nc_trace_bufcat
+char	*_nc_trace_bufcat(
+		int	bufnum,
+		const char *value)
+		{ return(*(char **)0); }
+
+/* ./trace/trace_tries.c */
+
+#undef _nc_trace_tries
+void	_nc_trace_tries(
+		TRIES	*tree)
+		{ /* void */ }
+
+/* ./base/tries.c */
+
+#undef _nc_expand_try
+char	*_nc_expand_try(
+		TRIES	*tree,
+		unsigned code,
+		int	*count,
+		size_t	len)
+		{ return(*(char **)0); }
+
+#undef _nc_remove_key
+int	_nc_remove_key(
+		TRIES	**tree,
+		unsigned code)
+		{ return(*(int *)0); }
+
+#undef _nc_remove_string
+int	_nc_remove_string(
+		TRIES	**tree,
+		const char *string)
+		{ return(*(int *)0); }
+
+/* ./tinfo/trim_sgr0.c */
+
+#undef _nc_trim_sgr0
+char	*_nc_trim_sgr0(
+		TERMTYPE *tp)
+		{ return(*(char **)0); }
+
+/* ./unctrl.c */
+
+#undef unctrl_sp
+const char *unctrl_sp(
+		SCREEN	*sp,
+		chtype	ch)
+		{ return(*(const char **)0); }
+
+#undef unctrl
+const char *unctrl(
+		chtype	ch)
+		{ return(*(const char **)0); }
+
+/* ./trace/visbuf.c */
+
+#undef _nc_visbuf2
+const char *_nc_visbuf2(
+		int	bufnum,
+		const char *buf)
+		{ return(*(const char **)0); }
+
+#undef _nc_visbuf
+const char *_nc_visbuf(
+		const char *buf)
+		{ return(*(const char **)0); }
+
+#undef _nc_visbufn
+const char *_nc_visbufn(
+		const char *buf,
+		int	len)
+		{ return(*(const char **)0); }
+
+#undef _nc_viscbuf2
+const char *_nc_viscbuf2(
+		int	bufnum,
+		const chtype *buf,
+		int	len)
+		{ return(*(const char **)0); }
+
+#undef _nc_viscbuf
+const char *_nc_viscbuf(
+		const chtype *buf,
+		int	len)
+		{ return(*(const char **)0); }
+
+/* ./base/define_key.c */
+
+#undef define_key_sp
+int	define_key_sp(
+		SCREEN	*sp,
+		const char *str,
+		int	keycode)
+		{ return(*(int *)0); }
+
+#undef define_key
+int	define_key(
+		const char *str,
+		int	keycode)
+		{ return(*(int *)0); }
+
+/* ./tinfo/hashed_db.c */
+
+#undef _nc_hashed_db
+void	_nc_hashed_db(void)
+		{ /* void */ }
+
+/* ./base/key_defined.c */
+
+#undef key_defined_sp
+int	key_defined_sp(
+		SCREEN	*sp,
+		const char *str)
+		{ return(*(int *)0); }
+
+#undef key_defined
+int	key_defined(
+		const char *str)
+		{ return(*(int *)0); }
+
+/* ./base/keybound.c */
+
+#undef keybound_sp
+char	*keybound_sp(
+		SCREEN	*sp,
+		int	code,
+		int	count)
+		{ return(*(char **)0); }
+
+#undef keybound
+char	*keybound(
+		int	code,
+		int	count)
+		{ return(*(char **)0); }
+
+/* ./base/keyok.c */
+
+#undef keyok_sp
+int	keyok_sp(
+		SCREEN	*sp,
+		int	c,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef keyok
+int	keyok(
+		int	c,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+/* ./base/version.c */
+
+#undef curses_version
+const char *curses_version(void)
+		{ return(*(const char **)0); }
diff --git a/ncurses/llib-ltinfotw b/ncurses/llib-ltinfotw
new file mode 100644
index 0000000..4d35a1e
--- /dev/null
+++ b/ncurses/llib-ltinfotw
@@ -0,0 +1,1730 @@
+/****************************************************************************
+ * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 2012-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey       2012-on                                  *
+ ****************************************************************************/
+/* LINTLIBRARY */
+
+/* ./tinfo/access.c */
+
+#include <curses.priv.h>
+
+#undef _nc_rootname
+char	*_nc_rootname(
+		char	*path)
+		{ return(*(char **)0); }
+
+#undef _nc_is_abs_path
+NCURSES_BOOL _nc_is_abs_path(
+		const char *path)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_pathlast
+unsigned _nc_pathlast(
+		const char *path)
+		{ return(*(unsigned *)0); }
+
+#undef _nc_basename
+char	*_nc_basename(
+		char	*path)
+		{ return(*(char **)0); }
+
+#undef _nc_access
+int	_nc_access(
+		const char *path,
+		int	mode)
+		{ return(*(int *)0); }
+
+#undef _nc_is_dir_path
+NCURSES_BOOL _nc_is_dir_path(
+		const char *path)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_is_file_path
+NCURSES_BOOL _nc_is_file_path(
+		const char *path)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_env_access
+int	_nc_env_access(void)
+		{ return(*(int *)0); }
+
+#undef _nc_safe_fopen
+FILE	*_nc_safe_fopen(
+		const char *path,
+		const char *mode)
+		{ return(*(FILE **)0); }
+
+#undef _nc_safe_open3
+int	_nc_safe_open3(
+		const char *path,
+		int	flags,
+		mode_t	mode)
+		{ return(*(int *)0); }
+
+/* ./tinfo/add_tries.c */
+
+#undef _nc_add_to_try
+int	_nc_add_to_try(
+		TRIES	**tree,
+		const char *str,
+		unsigned code)
+		{ return(*(int *)0); }
+
+/* ./tinfo/alloc_ttype.c */
+
+#undef _nc_align_termtype
+void	_nc_align_termtype(
+		TERMTYPE2 *to,
+		TERMTYPE2 *from)
+		{ /* void */ }
+
+#undef _nc_copy_termtype
+void	_nc_copy_termtype(
+		TERMTYPE *dst,
+		const TERMTYPE *src)
+		{ /* void */ }
+
+#undef _nc_copy_termtype2
+void	_nc_copy_termtype2(
+		TERMTYPE2 *dst,
+		const TERMTYPE2 *src)
+		{ /* void */ }
+
+#undef _nc_export_termtype2
+void	_nc_export_termtype2(
+		TERMTYPE *dst,
+		const TERMTYPE2 *src)
+		{ /* void */ }
+
+/* ./codes.c */
+
+#undef _nc_boolcodes
+const char *const *_nc_boolcodes(void)
+		{ return(*(const char **)0); }
+
+#undef _nc_numcodes
+const char *const *_nc_numcodes(void)
+		{ return(*(const char **)0); }
+
+#undef _nc_strcodes
+const char *const *_nc_strcodes(void)
+		{ return(*(const char **)0); }
+
+/* ./comp_captab.c */
+
+#undef _nc_get_table
+const struct name_table_entry *_nc_get_table(
+		NCURSES_BOOL termcap)
+		{ return(*(const struct name_table_entry **)0); }
+
+#undef _nc_get_hash_table
+const HashValue *_nc_get_hash_table(
+		NCURSES_BOOL termcap)
+		{ return(*(const HashValue **)0); }
+
+#undef _nc_get_alias_table
+const struct alias *_nc_get_alias_table(
+		NCURSES_BOOL termcap)
+		{ return(*(const struct alias **)0); }
+
+#undef _nc_get_hash_info
+const HashData *_nc_get_hash_info(
+		NCURSES_BOOL termcap)
+		{ return(*(const HashData **)0); }
+
+/* ./tinfo/comp_error.c */
+
+#undef _nc_suppress_warnings
+NCURSES_BOOL _nc_suppress_warnings;
+#undef _nc_curr_line
+int	_nc_curr_line;
+#undef _nc_curr_col
+int	_nc_curr_col;
+
+#undef _nc_get_source
+const char *_nc_get_source(void)
+		{ return(*(const char **)0); }
+
+#undef _nc_set_source
+void	_nc_set_source(
+		const char *const name)
+		{ /* void */ }
+
+#undef _nc_set_type
+void	_nc_set_type(
+		const char *const name)
+		{ /* void */ }
+
+#undef _nc_get_type
+void	_nc_get_type(
+		char	*name)
+		{ /* void */ }
+
+#undef _nc_warning
+void	_nc_warning(
+		const char *const fmt,
+		...)
+		{ /* void */ }
+
+#undef _nc_err_abort
+void	_nc_err_abort(
+		const char *const fmt,
+		...)
+		{ /* void */ }
+
+#undef _nc_syserr_abort
+void	_nc_syserr_abort(
+		const char *const fmt,
+		...)
+		{ /* void */ }
+
+/* ./tinfo/comp_hash.c */
+
+#undef _nc_find_entry
+struct name_table_entry const *_nc_find_entry(
+		const char *string,
+		const HashValue *hash_table)
+		{ return(*(struct name_table_entry const **)0); }
+
+#undef _nc_find_type_entry
+struct name_table_entry const *_nc_find_type_entry(
+		const char *string,
+		int	type,
+		NCURSES_BOOL termcap)
+		{ return(*(struct name_table_entry const **)0); }
+
+#undef _nc_find_user_entry
+struct user_table_entry const *_nc_find_user_entry(
+		const char *string)
+		{ return(*(struct user_table_entry const **)0); }
+
+/* ./comp_userdefs.c */
+
+#undef _nc_get_userdefs_table
+const struct user_table_entry *_nc_get_userdefs_table(void)
+		{ return(*(const struct user_table_entry **)0); }
+
+#undef _nc_get_hash_user
+const HashData *_nc_get_hash_user(void)
+		{ return(*(const HashData **)0); }
+
+/* ./tinfo/db_iterator.c */
+
+#undef _nc_tic_dir
+const char *_nc_tic_dir(
+		const char *path)
+		{ return(*(const char **)0); }
+
+#undef _nc_keep_tic_dir
+void	_nc_keep_tic_dir(
+		const char *path)
+		{ /* void */ }
+
+#undef _nc_last_db
+void	_nc_last_db(void)
+		{ /* void */ }
+
+#undef _nc_next_db
+const char *_nc_next_db(
+		DBDIRS	*state,
+		int	*offset)
+		{ return(*(const char **)0); }
+
+#undef _nc_first_db
+void	_nc_first_db(
+		DBDIRS	*state,
+		int	*offset)
+		{ /* void */ }
+
+/* ./tinfo/doalloc.c */
+
+#undef _nc_doalloc
+void	*_nc_doalloc(
+		void	*oldp,
+		size_t	amount)
+		{ return(*(void **)0); }
+
+/* ./tinfo/entries.c */
+
+#undef _nc_head
+ENTRY	*_nc_head;
+#undef _nc_tail
+ENTRY	*_nc_tail;
+
+#undef _nc_free_entry
+void	_nc_free_entry(
+		ENTRY	*headp,
+		TERMTYPE2 *tterm)
+		{ /* void */ }
+
+#undef _nc_free_entries
+void	_nc_free_entries(
+		ENTRY	*headp)
+		{ /* void */ }
+
+#undef _nc_leaks_tinfo
+void	_nc_leaks_tinfo(void)
+		{ /* void */ }
+
+#undef exit_terminfo
+void	exit_terminfo(
+		int	code)
+		{ /* void */ }
+
+/* ./fallback.c */
+
+#undef _nc_fallback2
+const TERMTYPE2 *_nc_fallback2(
+		const char *name)
+		{ return(*(const TERMTYPE2 **)0); }
+
+#undef _nc_fallback
+const TERMTYPE *_nc_fallback(
+		const char *name)
+		{ return(*(const TERMTYPE **)0); }
+
+/* ./tinfo/free_ttype.c */
+
+#undef _nc_free_termtype
+void	_nc_free_termtype(
+		TERMTYPE *ptr)
+		{ /* void */ }
+
+#undef _nc_free_termtype1
+void	_nc_free_termtype1(
+		TERMTYPE *ptr)
+		{ /* void */ }
+
+#undef _nc_free_termtype2
+void	_nc_free_termtype2(
+		TERMTYPE2 *ptr)
+		{ /* void */ }
+
+#undef _nc_user_definable
+NCURSES_BOOL _nc_user_definable;
+
+#undef use_extended_names
+int	use_extended_names(
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+/* ./tinfo/getenv_num.c */
+
+#undef _nc_getenv_num
+int	_nc_getenv_num(
+		const char *name)
+		{ return(*(int *)0); }
+
+#undef _nc_setenv_num
+void	_nc_setenv_num(
+		const char *name,
+		int	value)
+		{ /* void */ }
+
+/* ./tinfo/home_terminfo.c */
+
+#undef _nc_home_terminfo
+char	*_nc_home_terminfo(void)
+		{ return(*(char **)0); }
+
+/* ./tinfo/init_keytry.c */
+
+#undef _nc_init_keytry
+void	_nc_init_keytry(
+		SCREEN	*sp)
+		{ /* void */ }
+
+/* ./tinfo/lib_acs.c */
+
+#undef _nc_acs_map
+chtype	*_nc_acs_map(void)
+		{ return(*(chtype **)0); }
+
+#undef _nc_init_acs_sp
+void	_nc_init_acs_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_init_acs
+void	_nc_init_acs(void)
+		{ /* void */ }
+
+/* ./tinfo/lib_baudrate.c */
+
+struct speed {
+    int given_speed;
+    int actual_speed;
+};
+
+#undef _nc_baudrate
+int	_nc_baudrate(
+		int	OSpeed)
+		{ return(*(int *)0); }
+
+#undef _nc_ospeed
+int	_nc_ospeed(
+		int	BaudRate)
+		{ return(*(int *)0); }
+
+#undef baudrate_sp
+int	baudrate_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef baudrate
+int	baudrate(void)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_cur_term.c */
+
+#undef _nc_get_cur_term_sp
+TERMINAL *_nc_get_cur_term_sp(
+		SCREEN	*sp)
+		{ return(*(TERMINAL **)0); }
+
+#undef _nc_get_cur_term
+TERMINAL *_nc_get_cur_term(void)
+		{ return(*(TERMINAL **)0); }
+
+#undef _nc_cur_term
+TERMINAL *_nc_cur_term(void)
+		{ return(*(TERMINAL **)0); }
+
+#undef set_curterm_sp
+TERMINAL *set_curterm_sp(
+		SCREEN	*sp,
+		TERMINAL *termp)
+		{ return(*(TERMINAL **)0); }
+
+#undef set_curterm
+TERMINAL *set_curterm(
+		TERMINAL *termp)
+		{ return(*(TERMINAL **)0); }
+
+#undef del_curterm_sp
+int	del_curterm_sp(
+		SCREEN	*sp,
+		TERMINAL *termp)
+		{ return(*(int *)0); }
+
+#undef del_curterm
+int	del_curterm(
+		TERMINAL *termp)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_data.c */
+
+#undef _nc_stdscr
+WINDOW	*_nc_stdscr(void)
+		{ return(*(WINDOW **)0); }
+
+#undef _nc_curscr
+WINDOW	*_nc_curscr(void)
+		{ return(*(WINDOW **)0); }
+
+#undef _nc_newscr
+WINDOW	*_nc_newscr(void)
+		{ return(*(WINDOW **)0); }
+
+#undef _nc_screen_chain
+SCREEN	*_nc_screen_chain;
+#undef SP
+SCREEN	*SP;
+#undef _nc_globals
+NCURSES_GLOBALS _nc_globals;
+#undef _nc_prescreen
+NCURSES_PRESCREEN _nc_prescreen;
+
+#undef _nc_screen_of
+SCREEN	*_nc_screen_of(
+		WINDOW	*win)
+		{ return(*(SCREEN **)0); }
+
+#undef _nc_init_pthreads
+void	_nc_init_pthreads(void)
+		{ /* void */ }
+
+#undef _nc_mutex_init
+void	_nc_mutex_init(
+		pthread_mutex_t *obj)
+		{ /* void */ }
+
+#undef _nc_mutex_lock
+int	_nc_mutex_lock(
+		pthread_mutex_t *obj)
+		{ return(*(int *)0); }
+
+#undef _nc_mutex_trylock
+int	_nc_mutex_trylock(
+		pthread_mutex_t *obj)
+		{ return(*(int *)0); }
+
+#undef _nc_mutex_unlock
+int	_nc_mutex_unlock(
+		pthread_mutex_t *obj)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_has_cap.c */
+
+#undef has_ic_sp
+NCURSES_BOOL has_ic_sp(
+		SCREEN	*sp)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef has_ic
+NCURSES_BOOL has_ic(void)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef has_il_sp
+NCURSES_BOOL has_il_sp(
+		SCREEN	*sp)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef has_il
+NCURSES_BOOL has_il(void)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./tinfo/lib_kernel.c */
+
+#undef erasechar_sp
+char	erasechar_sp(
+		SCREEN	*sp)
+		{ return(*(char *)0); }
+
+#undef erasechar
+char	erasechar(void)
+		{ return(*(char *)0); }
+
+#undef killchar_sp
+char	killchar_sp(
+		SCREEN	*sp)
+		{ return(*(char *)0); }
+
+#undef killchar
+char	killchar(void)
+		{ return(*(char *)0); }
+
+#undef flushinp_sp
+int	flushinp_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef flushinp
+int	flushinp(void)
+		{ return(*(int *)0); }
+
+/* ./lib_keyname.c */
+
+struct kn { short offset; int code; };
+
+#undef keyname_sp
+const char *keyname_sp(
+		SCREEN	*sp,
+		int	c)
+		{ return(*(const char **)0); }
+
+#undef keyname
+const char *keyname(
+		int	c)
+		{ return(*(const char **)0); }
+
+/* ./tinfo/lib_longname.c */
+
+#undef longname_sp
+char	*longname_sp(
+		SCREEN	*sp)
+		{ return(*(char **)0); }
+
+#undef longname
+char	*longname(void)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_napms.c */
+
+#undef napms_sp
+int	napms_sp(
+		SCREEN	*sp,
+		int	ms)
+		{ return(*(int *)0); }
+
+#undef napms
+int	napms(
+		int	ms)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_options.c */
+
+#undef idlok
+int	idlok(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef idcok
+void	idcok(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ /* void */ }
+
+#undef halfdelay_sp
+int	halfdelay_sp(
+		SCREEN	*sp,
+		int	t)
+		{ return(*(int *)0); }
+
+#undef halfdelay
+int	halfdelay(
+		int	t)
+		{ return(*(int *)0); }
+
+#undef nodelay
+int	nodelay(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef notimeout
+int	notimeout(
+		WINDOW	*win,
+		NCURSES_BOOL f)
+		{ return(*(int *)0); }
+
+#undef wtimeout
+void	wtimeout(
+		WINDOW	*win,
+		int	delay)
+		{ /* void */ }
+
+#undef keypad
+int	keypad(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef meta
+int	meta(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef curs_set_sp
+int	curs_set_sp(
+		SCREEN	*sp,
+		int	vis)
+		{ return(*(int *)0); }
+
+#undef curs_set
+int	curs_set(
+		int	vis)
+		{ return(*(int *)0); }
+
+#undef typeahead_sp
+int	typeahead_sp(
+		SCREEN	*sp,
+		int	fd)
+		{ return(*(int *)0); }
+
+#undef typeahead
+int	typeahead(
+		int	fd)
+		{ return(*(int *)0); }
+
+#undef has_key_sp
+int	has_key_sp(
+		SCREEN	*sp,
+		int	keycode)
+		{ return(*(int *)0); }
+
+#undef has_key
+int	has_key(
+		int	keycode)
+		{ return(*(int *)0); }
+
+#undef _nc_putp_flush_sp
+int	_nc_putp_flush_sp(
+		SCREEN	*sp,
+		const char *name,
+		const char *value)
+		{ return(*(int *)0); }
+
+#undef _nc_keypad
+int	_nc_keypad(
+		SCREEN	*sp,
+		int	flag)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_raw.c */
+
+#undef raw_sp
+int	raw_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef raw
+int	raw(void)
+		{ return(*(int *)0); }
+
+#undef cbreak_sp
+int	cbreak_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef cbreak
+int	cbreak(void)
+		{ return(*(int *)0); }
+
+#undef qiflush_sp
+void	qiflush_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef qiflush
+void	qiflush(void)
+		{ /* void */ }
+
+#undef noraw_sp
+int	noraw_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef noraw
+int	noraw(void)
+		{ return(*(int *)0); }
+
+#undef nocbreak_sp
+int	nocbreak_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef nocbreak
+int	nocbreak(void)
+		{ return(*(int *)0); }
+
+#undef noqiflush_sp
+void	noqiflush_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef noqiflush
+void	noqiflush(void)
+		{ /* void */ }
+
+#undef intrflush_sp
+int	intrflush_sp(
+		SCREEN	*sp,
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef intrflush
+int	intrflush(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_setup.c */
+
+#undef _nc_ttytype
+char	*_nc_ttytype(void)
+		{ return(*(char **)0); }
+
+#undef _nc_ptr_Lines
+int	*_nc_ptr_Lines(
+		SCREEN	*sp)
+		{ return(*(int **)0); }
+
+#undef _nc_LINES
+int	_nc_LINES(void)
+		{ return(*(int *)0); }
+
+#undef _nc_ptr_Cols
+int	*_nc_ptr_Cols(
+		SCREEN	*sp)
+		{ return(*(int **)0); }
+
+#undef _nc_COLS
+int	_nc_COLS(void)
+		{ return(*(int *)0); }
+
+#undef _nc_ptr_Tabsize
+int	*_nc_ptr_Tabsize(
+		SCREEN	*sp)
+		{ return(*(int **)0); }
+
+#undef _nc_TABSIZE
+int	_nc_TABSIZE(void)
+		{ return(*(int *)0); }
+
+#undef set_tabsize_sp
+int	set_tabsize_sp(
+		SCREEN	*sp,
+		int	value)
+		{ return(*(int *)0); }
+
+#undef set_tabsize
+int	set_tabsize(
+		int	value)
+		{ return(*(int *)0); }
+
+#undef _nc_handle_sigwinch
+int	_nc_handle_sigwinch(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef use_env_sp
+void	use_env_sp(
+		SCREEN	*sp,
+		NCURSES_BOOL f)
+		{ /* void */ }
+
+#undef use_tioctl_sp
+void	use_tioctl_sp(
+		SCREEN	*sp,
+		NCURSES_BOOL f)
+		{ /* void */ }
+
+#undef use_env
+void	use_env(
+		NCURSES_BOOL f)
+		{ /* void */ }
+
+#undef use_tioctl
+void	use_tioctl(
+		NCURSES_BOOL f)
+		{ /* void */ }
+
+#undef _nc_get_screensize
+void	_nc_get_screensize(
+		SCREEN	*sp,
+		int	*linep,
+		int	*colp)
+		{ /* void */ }
+
+#undef _nc_update_screensize
+void	_nc_update_screensize(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_setup_tinfo
+int	_nc_setup_tinfo(
+		const char *const tn,
+		TERMTYPE2 *const tp)
+		{ return(*(int *)0); }
+
+#undef _nc_tinfo_cmdch
+void	_nc_tinfo_cmdch(
+		TERMINAL *termp,
+		int	proto)
+		{ /* void */ }
+
+#undef _nc_get_locale
+char	*_nc_get_locale(void)
+		{ return(*(char **)0); }
+
+#undef _nc_unicode_locale
+int	_nc_unicode_locale(void)
+		{ return(*(int *)0); }
+
+#undef _nc_locale_breaks_acs
+int	_nc_locale_breaks_acs(
+		TERMINAL *termp)
+		{ return(*(int *)0); }
+
+#undef _nc_setupterm
+int	_nc_setupterm(
+		const char *tname,
+		int	Filedes,
+		int	*errret,
+		int	reuse)
+		{ return(*(int *)0); }
+
+#undef _nc_find_prescr
+SCREEN	*_nc_find_prescr(void)
+		{ return(*(SCREEN **)0); }
+
+#undef _nc_forget_prescr
+void	_nc_forget_prescr(void)
+		{ /* void */ }
+
+#undef new_prescr
+SCREEN	*new_prescr(void)
+		{ return(*(SCREEN **)0); }
+
+#undef setupterm
+int	setupterm(
+		const char *tname,
+		int	Filedes,
+		int	*errret)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_termcap.c */
+
+#undef UP
+char	*UP;
+#undef BC
+char	*BC;
+
+#undef tgetent_sp
+int	tgetent_sp(
+		SCREEN	*sp,
+		char	*bufp,
+		const char *name)
+		{ return(*(int *)0); }
+
+#undef tgetent
+int	tgetent(
+		char	*bufp,
+		const char *name)
+		{ return(*(int *)0); }
+
+#undef tgetflag_sp
+int	tgetflag_sp(
+		SCREEN	*sp,
+		const char *id)
+		{ return(*(int *)0); }
+
+#undef tgetflag
+int	tgetflag(
+		const char *id)
+		{ return(*(int *)0); }
+
+#undef tgetnum_sp
+int	tgetnum_sp(
+		SCREEN	*sp,
+		const char *id)
+		{ return(*(int *)0); }
+
+#undef tgetnum
+int	tgetnum(
+		const char *id)
+		{ return(*(int *)0); }
+
+#undef tgetstr_sp
+char	*tgetstr_sp(
+		SCREEN	*sp,
+		const char *id,
+		char	**area)
+		{ return(*(char **)0); }
+
+#undef tgetstr
+char	*tgetstr(
+		const char *id,
+		char	**area)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_termname.c */
+
+#undef termname_sp
+char	*termname_sp(
+		SCREEN	*sp)
+		{ return(*(char **)0); }
+
+#undef termname
+char	*termname(void)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_tgoto.c */
+
+#undef tgoto
+char	*tgoto(
+		const char *string,
+		int	x,
+		int	y)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_ti.c */
+
+#undef tigetflag_sp
+int	tigetflag_sp(
+		SCREEN	*sp,
+		const char *str)
+		{ return(*(int *)0); }
+
+#undef tigetflag
+int	tigetflag(
+		const char *str)
+		{ return(*(int *)0); }
+
+#undef tigetnum_sp
+int	tigetnum_sp(
+		SCREEN	*sp,
+		const char *str)
+		{ return(*(int *)0); }
+
+#undef tigetnum
+int	tigetnum(
+		const char *str)
+		{ return(*(int *)0); }
+
+#undef tigetstr_sp
+char	*tigetstr_sp(
+		SCREEN	*sp,
+		const char *str)
+		{ return(*(char **)0); }
+
+#undef tigetstr
+char	*tigetstr(
+		const char *str)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_tparm.c */
+
+#undef _nc_tparm_err
+int	_nc_tparm_err;
+
+#undef _nc_free_tparm
+void	_nc_free_tparm(
+		TERMINAL *termp)
+		{ /* void */ }
+
+#undef _nc_tparm_analyze
+int	_nc_tparm_analyze(
+		TERMINAL *term,
+		const char *string,
+		char	**p_is_s,
+		int	*_nc_popcount)
+		{ return(*(int *)0); }
+
+#undef tparm
+char	*tparm(
+		const char *string,
+		...)
+		{ return(*(char **)0); }
+
+#undef tiparm
+char	*tiparm(
+		const char *string,
+		...)
+		{ return(*(char **)0); }
+
+#undef _nc_tiparm
+char	*_nc_tiparm(
+		int	expected,
+		const char *string,
+		...)
+		{ return(*(char **)0); }
+
+#undef _nc_reset_tparm
+void	_nc_reset_tparm(
+		TERMINAL *term)
+		{ /* void */ }
+
+/* ./tinfo/lib_tputs.c */
+
+#undef PC
+char	PC;
+#undef ospeed
+short	ospeed;
+#undef _nc_nulls_sent
+int	_nc_nulls_sent;
+
+#undef _nc_set_no_padding
+void	_nc_set_no_padding(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef delay_output_sp
+int	delay_output_sp(
+		SCREEN	*sp,
+		int	ms)
+		{ return(*(int *)0); }
+
+#undef delay_output
+int	delay_output(
+		int	ms)
+		{ return(*(int *)0); }
+
+#undef _nc_flush_sp
+void	_nc_flush_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_flush
+void	_nc_flush(void)
+		{ /* void */ }
+
+#undef _nc_outch_sp
+int	_nc_outch_sp(
+		SCREEN	*sp,
+		int	ch)
+		{ return(*(int *)0); }
+
+#undef _nc_outch
+int	_nc_outch(
+		int	ch)
+		{ return(*(int *)0); }
+
+#undef _nc_putchar_sp
+int	_nc_putchar_sp(
+		SCREEN	*sp,
+		int	ch)
+		{ return(*(int *)0); }
+
+#undef _nc_putchar
+int	_nc_putchar(
+		int	ch)
+		{ return(*(int *)0); }
+
+#undef putp_sp
+int	putp_sp(
+		SCREEN	*sp,
+		const char *string)
+		{ return(*(int *)0); }
+
+#undef putp
+int	putp(
+		const char *string)
+		{ return(*(int *)0); }
+
+#undef _nc_putp_sp
+int	_nc_putp_sp(
+		SCREEN	*sp,
+		const char *name,
+		const char *string)
+		{ return(*(int *)0); }
+
+#undef _nc_putp
+int	_nc_putp(
+		const char *name,
+		const char *string)
+		{ return(*(int *)0); }
+
+#undef tputs_sp
+int	tputs_sp(
+		SCREEN	*sp,
+		const char *string,
+		int	affcnt,
+		NCURSES_OUTC_sp outc)
+		{ return(*(int *)0); }
+
+#undef _nc_outc_wrapper
+int	_nc_outc_wrapper(
+		SCREEN	*sp,
+		int	c)
+		{ return(*(int *)0); }
+
+#undef tputs
+int	tputs(
+		const char *string,
+		int	affcnt,
+		int	(*outc)(
+		int	p1))
+		{ return(*(int *)0); }
+
+/* ./trace/lib_trace.c */
+
+#undef _nc_tracing
+unsigned _nc_tracing;
+
+#undef _nc__nc_tputs_trace
+const char *_nc__nc_tputs_trace(void)
+		{ return(*(const char **)0); }
+
+#undef _nc__nc_outchars
+long	_nc__nc_outchars(void)
+		{ return(*(long *)0); }
+
+#undef _nc_set_tputs_trace
+void	_nc_set_tputs_trace(
+		const char *s)
+		{ /* void */ }
+
+#undef _nc_count_outchars
+void	_nc_count_outchars(
+		long	increment)
+		{ /* void */ }
+
+#undef curses_trace
+unsigned curses_trace(
+		unsigned tracelevel)
+		{ return(*(unsigned *)0); }
+
+#undef trace
+void	trace(
+		const unsigned int tracelevel)
+		{ /* void */ }
+
+#undef _tracef
+void	_tracef(
+		const char *fmt,
+		...)
+		{ /* void */ }
+
+#undef _nc_retrace_bool
+NCURSES_BOOL _nc_retrace_bool(
+		int	code)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_retrace_char
+char	_nc_retrace_char(
+		int	code)
+		{ return(*(char *)0); }
+
+#undef _nc_retrace_int
+int	_nc_retrace_int(
+		int	code)
+		{ return(*(int *)0); }
+
+#undef _nc_retrace_unsigned
+unsigned _nc_retrace_unsigned(
+		unsigned code)
+		{ return(*(unsigned *)0); }
+
+#undef _nc_retrace_ptr
+char	*_nc_retrace_ptr(
+		char	*code)
+		{ return(*(char **)0); }
+
+#undef _nc_retrace_cptr
+const char *_nc_retrace_cptr(
+		const char *code)
+		{ return(*(const char **)0); }
+
+#undef _nc_retrace_cvoid_ptr
+const void *_nc_retrace_cvoid_ptr(
+		const void *code)
+		{ return(*(const void **)0); }
+
+#undef _nc_retrace_void_ptr
+void	*_nc_retrace_void_ptr(
+		void	*code)
+		{ return(*(void **)0); }
+
+#undef _nc_retrace_sp
+SCREEN	*_nc_retrace_sp(
+		SCREEN	*code)
+		{ return(*(SCREEN **)0); }
+
+#undef _nc_retrace_win
+WINDOW	*_nc_retrace_win(
+		WINDOW	*code)
+		{ return(*(WINDOW **)0); }
+
+#undef _nc_fmt_funcptr
+char	*_nc_fmt_funcptr(
+		char	*target,
+		const char *source,
+		size_t	size)
+		{ return(*(char **)0); }
+
+#undef _nc_use_tracef
+int	_nc_use_tracef(
+		unsigned mask)
+		{ return(*(int *)0); }
+
+#undef _nc_locked_tracef
+void	_nc_locked_tracef(
+		const char *fmt,
+		...)
+		{ /* void */ }
+
+/* ./trace/lib_traceatr.c */
+
+#undef _traceattr2
+char	*_traceattr2(
+		int	bufnum,
+		chtype	newmode)
+		{ return(*(char **)0); }
+
+#undef _traceattr
+char	*_traceattr(
+		attr_t	newmode)
+		{ return(*(char **)0); }
+
+#undef _nc_retrace_int_attr_t
+int	_nc_retrace_int_attr_t(
+		attr_t	code)
+		{ return(*(int *)0); }
+
+#undef _nc_retrace_attr_t
+attr_t	_nc_retrace_attr_t(
+		attr_t	code)
+		{ return(*(attr_t *)0); }
+
+#undef _nc_altcharset_name
+const char *_nc_altcharset_name(
+		attr_t	attr,
+		chtype	ch)
+		{ return(*(const char **)0); }
+
+#undef _tracechtype2
+char	*_tracechtype2(
+		int	bufnum,
+		chtype	ch)
+		{ return(*(char **)0); }
+
+#undef _tracechtype
+char	*_tracechtype(
+		chtype	ch)
+		{ return(*(char **)0); }
+
+#undef _nc_retrace_chtype
+chtype	_nc_retrace_chtype(
+		chtype	code)
+		{ return(*(chtype *)0); }
+
+#undef _tracecchar_t2
+char	*_tracecchar_t2(
+		int	bufnum,
+		const cchar_t *ch)
+		{ return(*(char **)0); }
+
+#undef _tracecchar_t
+char	*_tracecchar_t(
+		const cchar_t *ch)
+		{ return(*(char **)0); }
+
+/* ./trace/lib_tracebits.c */
+
+#undef _nc_trace_ttymode
+char	*_nc_trace_ttymode(
+		const struct termios *tty)
+		{ return(*(char **)0); }
+
+#undef _nc_tracebits
+char	*_nc_tracebits(void)
+		{ return(*(char **)0); }
+
+/* ./trace/lib_tracechr.c */
+
+#undef _nc_tracechar
+char	*_nc_tracechar(
+		SCREEN	*sp,
+		int	ch)
+		{ return(*(char **)0); }
+
+#undef _tracechar
+char	*_tracechar(
+		int	ch)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_ttyflags.c */
+
+#undef _nc_get_tty_mode_sp
+int	_nc_get_tty_mode_sp(
+		SCREEN	*sp,
+		struct termios *buf)
+		{ return(*(int *)0); }
+
+#undef _nc_get_tty_mode
+int	_nc_get_tty_mode(
+		struct termios *buf)
+		{ return(*(int *)0); }
+
+#undef _nc_set_tty_mode_sp
+int	_nc_set_tty_mode_sp(
+		SCREEN	*sp,
+		struct termios *buf)
+		{ return(*(int *)0); }
+
+#undef _nc_set_tty_mode
+int	_nc_set_tty_mode(
+		struct termios *buf)
+		{ return(*(int *)0); }
+
+#undef def_shell_mode_sp
+int	def_shell_mode_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef def_shell_mode
+int	def_shell_mode(void)
+		{ return(*(int *)0); }
+
+#undef def_prog_mode_sp
+int	def_prog_mode_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef def_prog_mode
+int	def_prog_mode(void)
+		{ return(*(int *)0); }
+
+#undef reset_prog_mode_sp
+int	reset_prog_mode_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef reset_prog_mode
+int	reset_prog_mode(void)
+		{ return(*(int *)0); }
+
+#undef reset_shell_mode_sp
+int	reset_shell_mode_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef reset_shell_mode
+int	reset_shell_mode(void)
+		{ return(*(int *)0); }
+
+#undef savetty_sp
+int	savetty_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef savetty
+int	savetty(void)
+		{ return(*(int *)0); }
+
+#undef resetty_sp
+int	resetty_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef resetty
+int	resetty(void)
+		{ return(*(int *)0); }
+
+/* ./tty/lib_twait.c */
+
+#undef _nc_timed_wait
+int	_nc_timed_wait(
+		SCREEN	*sp,
+		int	mode,
+		int	milliseconds,
+		int	*timeleft)
+		{ return(*(int *)0); }
+
+/* ./tinfo/name_match.c */
+
+#undef _nc_first_name
+char	*_nc_first_name(
+		const char *const sp)
+		{ return(*(char **)0); }
+
+#undef _nc_name_match
+int	_nc_name_match(
+		const char *const namelst,
+		const char *const name,
+		const char *const delim)
+		{ return(*(int *)0); }
+
+/* ./names.c */
+
+#undef _nc_boolnames
+const char *const *_nc_boolnames(void)
+		{ return(*(const char **)0); }
+
+#undef _nc_boolfnames
+const char *const *_nc_boolfnames(void)
+		{ return(*(const char **)0); }
+
+#undef _nc_numnames
+const char *const *_nc_numnames(void)
+		{ return(*(const char **)0); }
+
+#undef _nc_numfnames
+const char *const *_nc_numfnames(void)
+		{ return(*(const char **)0); }
+
+#undef _nc_strnames
+const char *const *_nc_strnames(void)
+		{ return(*(const char **)0); }
+
+#undef _nc_strfnames
+const char *const *_nc_strfnames(void)
+		{ return(*(const char **)0); }
+
+/* ./tinfo/obsolete.c */
+
+#undef _nc_set_buffer_sp
+void	_nc_set_buffer_sp(
+		SCREEN	*sp,
+		FILE	*ofp,
+		int	buffered)
+		{ /* void */ }
+
+#undef _nc_set_buffer
+void	_nc_set_buffer(
+		FILE	*ofp,
+		int	buffered)
+		{ /* void */ }
+
+/* ./tinfo/read_entry.c */
+
+#undef _nc_init_termtype
+void	_nc_init_termtype(
+		TERMTYPE2 *const tp)
+		{ /* void */ }
+
+#undef _nc_read_termtype
+int	_nc_read_termtype(
+		TERMTYPE2 *ptr,
+		char	*buffer,
+		int	limit)
+		{ return(*(int *)0); }
+
+#undef _nc_read_file_entry
+int	_nc_read_file_entry(
+		const char *const filename,
+		TERMTYPE2 *ptr)
+		{ return(*(int *)0); }
+
+#undef _nc_read_entry2
+int	_nc_read_entry2(
+		const char *const name,
+		char	*const filename,
+		TERMTYPE2 *const tp)
+		{ return(*(int *)0); }
+
+#undef _nc_read_entry
+int	_nc_read_entry(
+		const char *const name,
+		char	*const filename,
+		TERMTYPE *const tp)
+		{ return(*(int *)0); }
+
+/* ./tinfo/read_termcap.c */
+
+#undef _nc_read_termcap
+void	_nc_read_termcap(void)
+		{ /* void */ }
+
+/* ./tinfo/strings.c */
+
+#undef _nc_str_init
+string_desc *_nc_str_init(
+		string_desc *dst,
+		char	*src,
+		size_t	len)
+		{ return(*(string_desc **)0); }
+
+#undef _nc_str_null
+string_desc *_nc_str_null(
+		string_desc *dst,
+		size_t	len)
+		{ return(*(string_desc **)0); }
+
+#undef _nc_str_copy
+string_desc *_nc_str_copy(
+		string_desc *dst,
+		string_desc *src)
+		{ return(*(string_desc **)0); }
+
+#undef _nc_safe_strcat
+NCURSES_BOOL _nc_safe_strcat(
+		string_desc *dst,
+		const char *src)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_safe_strcpy
+NCURSES_BOOL _nc_safe_strcpy(
+		string_desc *dst,
+		const char *src)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./trace/trace_buf.c */
+
+#undef _nc_trace_buf
+char	*_nc_trace_buf(
+		int	bufnum,
+		size_t	want)
+		{ return(*(char **)0); }
+
+#undef _nc_trace_bufcat
+char	*_nc_trace_bufcat(
+		int	bufnum,
+		const char *value)
+		{ return(*(char **)0); }
+
+/* ./trace/trace_tries.c */
+
+#undef _nc_trace_tries
+void	_nc_trace_tries(
+		TRIES	*tree)
+		{ /* void */ }
+
+/* ./base/tries.c */
+
+#undef _nc_expand_try
+char	*_nc_expand_try(
+		TRIES	*tree,
+		unsigned code,
+		int	*count,
+		size_t	len)
+		{ return(*(char **)0); }
+
+#undef _nc_remove_key
+int	_nc_remove_key(
+		TRIES	**tree,
+		unsigned code)
+		{ return(*(int *)0); }
+
+#undef _nc_remove_string
+int	_nc_remove_string(
+		TRIES	**tree,
+		const char *string)
+		{ return(*(int *)0); }
+
+/* ./tinfo/trim_sgr0.c */
+
+#undef _nc_trim_sgr0
+char	*_nc_trim_sgr0(
+		TERMTYPE2 *tp)
+		{ return(*(char **)0); }
+
+/* ./unctrl.c */
+
+#undef unctrl_sp
+const char *unctrl_sp(
+		SCREEN	*sp,
+		chtype	ch)
+		{ return(*(const char **)0); }
+
+#undef unctrl
+const char *unctrl(
+		chtype	ch)
+		{ return(*(const char **)0); }
+
+/* ./trace/visbuf.c */
+
+#undef _nc_visbuf2
+const char *_nc_visbuf2(
+		int	bufnum,
+		const char *buf)
+		{ return(*(const char **)0); }
+
+#undef _nc_visbuf
+const char *_nc_visbuf(
+		const char *buf)
+		{ return(*(const char **)0); }
+
+#undef _nc_visbufn
+const char *_nc_visbufn(
+		const char *buf,
+		int	len)
+		{ return(*(const char **)0); }
+
+#undef _nc_viswbuf2
+const char *_nc_viswbuf2(
+		int	bufnum,
+		const wchar_t *buf)
+		{ return(*(const char **)0); }
+
+#undef _nc_viswbuf
+const char *_nc_viswbuf(
+		const wchar_t *buf)
+		{ return(*(const char **)0); }
+
+#undef _nc_viswbufn
+const char *_nc_viswbufn(
+		const wchar_t *buf,
+		int	len)
+		{ return(*(const char **)0); }
+
+#undef _nc_viswibuf
+const char *_nc_viswibuf(
+		const wint_t *buf)
+		{ return(*(const char **)0); }
+
+#undef _nc_viscbuf2
+const char *_nc_viscbuf2(
+		int	bufnum,
+		const cchar_t *buf,
+		int	len)
+		{ return(*(const char **)0); }
+
+#undef _nc_viscbuf
+const char *_nc_viscbuf(
+		const cchar_t *buf,
+		int	len)
+		{ return(*(const char **)0); }
+
+/* ./base/define_key.c */
+
+#undef define_key_sp
+int	define_key_sp(
+		SCREEN	*sp,
+		const char *str,
+		int	keycode)
+		{ return(*(int *)0); }
+
+#undef define_key
+int	define_key(
+		const char *str,
+		int	keycode)
+		{ return(*(int *)0); }
+
+/* ./tinfo/hashed_db.c */
+
+#undef _nc_hashed_db
+void	_nc_hashed_db(void)
+		{ /* void */ }
+
+/* ./base/key_defined.c */
+
+#undef key_defined_sp
+int	key_defined_sp(
+		SCREEN	*sp,
+		const char *str)
+		{ return(*(int *)0); }
+
+#undef key_defined
+int	key_defined(
+		const char *str)
+		{ return(*(int *)0); }
+
+/* ./base/keybound.c */
+
+#undef keybound_sp
+char	*keybound_sp(
+		SCREEN	*sp,
+		int	code,
+		int	count)
+		{ return(*(char **)0); }
+
+#undef keybound
+char	*keybound(
+		int	code,
+		int	count)
+		{ return(*(char **)0); }
+
+/* ./base/keyok.c */
+
+#undef keyok_sp
+int	keyok_sp(
+		SCREEN	*sp,
+		int	c,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef keyok
+int	keyok(
+		int	c,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+/* ./base/version.c */
+
+#undef curses_version
+const char *curses_version(void)
+		{ return(*(const char **)0); }
diff --git a/ncurses/llib-ltinfow b/ncurses/llib-ltinfow
new file mode 100644
index 0000000..db84676
--- /dev/null
+++ b/ncurses/llib-ltinfow
@@ -0,0 +1,1618 @@
+/****************************************************************************
+ * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 2012-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey       2012-on                                  *
+ ****************************************************************************/
+/* LINTLIBRARY */
+
+/* ./tinfo/access.c */
+
+#include <curses.priv.h>
+
+#undef _nc_rootname
+char	*_nc_rootname(
+		char	*path)
+		{ return(*(char **)0); }
+
+#undef _nc_is_abs_path
+NCURSES_BOOL _nc_is_abs_path(
+		const char *path)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_pathlast
+unsigned _nc_pathlast(
+		const char *path)
+		{ return(*(unsigned *)0); }
+
+#undef _nc_basename
+char	*_nc_basename(
+		char	*path)
+		{ return(*(char **)0); }
+
+#undef _nc_access
+int	_nc_access(
+		const char *path,
+		int	mode)
+		{ return(*(int *)0); }
+
+#undef _nc_is_dir_path
+NCURSES_BOOL _nc_is_dir_path(
+		const char *path)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_is_file_path
+NCURSES_BOOL _nc_is_file_path(
+		const char *path)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_env_access
+int	_nc_env_access(void)
+		{ return(*(int *)0); }
+
+#undef _nc_safe_fopen
+FILE	*_nc_safe_fopen(
+		const char *path,
+		const char *mode)
+		{ return(*(FILE **)0); }
+
+#undef _nc_safe_open3
+int	_nc_safe_open3(
+		const char *path,
+		int	flags,
+		mode_t	mode)
+		{ return(*(int *)0); }
+
+/* ./tinfo/add_tries.c */
+
+#undef _nc_add_to_try
+int	_nc_add_to_try(
+		TRIES	**tree,
+		const char *str,
+		unsigned code)
+		{ return(*(int *)0); }
+
+/* ./tinfo/alloc_ttype.c */
+
+#undef _nc_align_termtype
+void	_nc_align_termtype(
+		TERMTYPE2 *to,
+		TERMTYPE2 *from)
+		{ /* void */ }
+
+#undef _nc_copy_termtype
+void	_nc_copy_termtype(
+		TERMTYPE *dst,
+		const TERMTYPE *src)
+		{ /* void */ }
+
+#undef _nc_copy_termtype2
+void	_nc_copy_termtype2(
+		TERMTYPE2 *dst,
+		const TERMTYPE2 *src)
+		{ /* void */ }
+
+#undef _nc_export_termtype2
+void	_nc_export_termtype2(
+		TERMTYPE *dst,
+		const TERMTYPE2 *src)
+		{ /* void */ }
+
+/* ./codes.c */
+
+#undef boolcodes
+const char *const boolcodes[] = {0};
+#undef numcodes
+const char *const numcodes[] = {0};
+#undef strcodes
+const char *const strcodes[] = {0};
+
+/* ./comp_captab.c */
+
+#undef _nc_get_table
+const struct name_table_entry *_nc_get_table(
+		NCURSES_BOOL termcap)
+		{ return(*(const struct name_table_entry **)0); }
+
+#undef _nc_get_hash_table
+const HashValue *_nc_get_hash_table(
+		NCURSES_BOOL termcap)
+		{ return(*(const HashValue **)0); }
+
+#undef _nc_get_alias_table
+const struct alias *_nc_get_alias_table(
+		NCURSES_BOOL termcap)
+		{ return(*(const struct alias **)0); }
+
+#undef _nc_get_hash_info
+const HashData *_nc_get_hash_info(
+		NCURSES_BOOL termcap)
+		{ return(*(const HashData **)0); }
+
+/* ./tinfo/comp_error.c */
+
+#undef _nc_suppress_warnings
+NCURSES_BOOL _nc_suppress_warnings;
+#undef _nc_curr_line
+int	_nc_curr_line;
+#undef _nc_curr_col
+int	_nc_curr_col;
+
+#undef _nc_get_source
+const char *_nc_get_source(void)
+		{ return(*(const char **)0); }
+
+#undef _nc_set_source
+void	_nc_set_source(
+		const char *const name)
+		{ /* void */ }
+
+#undef _nc_set_type
+void	_nc_set_type(
+		const char *const name)
+		{ /* void */ }
+
+#undef _nc_get_type
+void	_nc_get_type(
+		char	*name)
+		{ /* void */ }
+
+#undef _nc_warning
+void	_nc_warning(
+		const char *const fmt,
+		...)
+		{ /* void */ }
+
+#undef _nc_err_abort
+void	_nc_err_abort(
+		const char *const fmt,
+		...)
+		{ /* void */ }
+
+#undef _nc_syserr_abort
+void	_nc_syserr_abort(
+		const char *const fmt,
+		...)
+		{ /* void */ }
+
+/* ./tinfo/comp_hash.c */
+
+#undef _nc_find_entry
+struct name_table_entry const *_nc_find_entry(
+		const char *string,
+		const HashValue *hash_table)
+		{ return(*(struct name_table_entry const **)0); }
+
+#undef _nc_find_type_entry
+struct name_table_entry const *_nc_find_type_entry(
+		const char *string,
+		int	type,
+		NCURSES_BOOL termcap)
+		{ return(*(struct name_table_entry const **)0); }
+
+#undef _nc_find_user_entry
+struct user_table_entry const *_nc_find_user_entry(
+		const char *string)
+		{ return(*(struct user_table_entry const **)0); }
+
+/* ./comp_userdefs.c */
+
+#undef _nc_get_userdefs_table
+const struct user_table_entry *_nc_get_userdefs_table(void)
+		{ return(*(const struct user_table_entry **)0); }
+
+#undef _nc_get_hash_user
+const HashData *_nc_get_hash_user(void)
+		{ return(*(const HashData **)0); }
+
+/* ./tinfo/db_iterator.c */
+
+#undef _nc_tic_dir
+const char *_nc_tic_dir(
+		const char *path)
+		{ return(*(const char **)0); }
+
+#undef _nc_keep_tic_dir
+void	_nc_keep_tic_dir(
+		const char *path)
+		{ /* void */ }
+
+#undef _nc_last_db
+void	_nc_last_db(void)
+		{ /* void */ }
+
+#undef _nc_next_db
+const char *_nc_next_db(
+		DBDIRS	*state,
+		int	*offset)
+		{ return(*(const char **)0); }
+
+#undef _nc_first_db
+void	_nc_first_db(
+		DBDIRS	*state,
+		int	*offset)
+		{ /* void */ }
+
+/* ./tinfo/doalloc.c */
+
+#undef _nc_doalloc
+void	*_nc_doalloc(
+		void	*oldp,
+		size_t	amount)
+		{ return(*(void **)0); }
+
+/* ./tinfo/entries.c */
+
+#undef _nc_head
+ENTRY	*_nc_head;
+#undef _nc_tail
+ENTRY	*_nc_tail;
+
+#undef _nc_free_entry
+void	_nc_free_entry(
+		ENTRY	*headp,
+		TERMTYPE2 *tterm)
+		{ /* void */ }
+
+#undef _nc_free_entries
+void	_nc_free_entries(
+		ENTRY	*headp)
+		{ /* void */ }
+
+#undef _nc_leaks_tinfo
+void	_nc_leaks_tinfo(void)
+		{ /* void */ }
+
+#undef exit_terminfo
+void	exit_terminfo(
+		int	code)
+		{ /* void */ }
+
+/* ./fallback.c */
+
+#undef _nc_fallback2
+const TERMTYPE2 *_nc_fallback2(
+		const char *name)
+		{ return(*(const TERMTYPE2 **)0); }
+
+#undef _nc_fallback
+const TERMTYPE *_nc_fallback(
+		const char *name)
+		{ return(*(const TERMTYPE **)0); }
+
+/* ./tinfo/free_ttype.c */
+
+#undef _nc_free_termtype
+void	_nc_free_termtype(
+		TERMTYPE *ptr)
+		{ /* void */ }
+
+#undef _nc_free_termtype1
+void	_nc_free_termtype1(
+		TERMTYPE *ptr)
+		{ /* void */ }
+
+#undef _nc_free_termtype2
+void	_nc_free_termtype2(
+		TERMTYPE2 *ptr)
+		{ /* void */ }
+
+#undef _nc_user_definable
+NCURSES_BOOL _nc_user_definable;
+
+#undef use_extended_names
+int	use_extended_names(
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+/* ./tinfo/getenv_num.c */
+
+#undef _nc_getenv_num
+int	_nc_getenv_num(
+		const char *name)
+		{ return(*(int *)0); }
+
+#undef _nc_setenv_num
+void	_nc_setenv_num(
+		const char *name,
+		int	value)
+		{ /* void */ }
+
+/* ./tinfo/home_terminfo.c */
+
+#undef _nc_home_terminfo
+char	*_nc_home_terminfo(void)
+		{ return(*(char **)0); }
+
+/* ./tinfo/init_keytry.c */
+
+#undef _nc_init_keytry
+void	_nc_init_keytry(
+		SCREEN	*sp)
+		{ /* void */ }
+
+/* ./tinfo/lib_acs.c */
+
+#undef acs_map
+chtype	acs_map[128];
+
+#undef _nc_init_acs_sp
+void	_nc_init_acs_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_init_acs
+void	_nc_init_acs(void)
+		{ /* void */ }
+
+/* ./tinfo/lib_baudrate.c */
+
+struct speed {
+    int given_speed;
+    int actual_speed;
+};
+
+#undef _nc_baudrate
+int	_nc_baudrate(
+		int	OSpeed)
+		{ return(*(int *)0); }
+
+#undef _nc_ospeed
+int	_nc_ospeed(
+		int	BaudRate)
+		{ return(*(int *)0); }
+
+#undef baudrate_sp
+int	baudrate_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef baudrate
+int	baudrate(void)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_cur_term.c */
+
+#undef cur_term
+TERMINAL *cur_term;
+
+#undef set_curterm_sp
+TERMINAL *set_curterm_sp(
+		SCREEN	*sp,
+		TERMINAL *termp)
+		{ return(*(TERMINAL **)0); }
+
+#undef set_curterm
+TERMINAL *set_curterm(
+		TERMINAL *termp)
+		{ return(*(TERMINAL **)0); }
+
+#undef del_curterm_sp
+int	del_curterm_sp(
+		SCREEN	*sp,
+		TERMINAL *termp)
+		{ return(*(int *)0); }
+
+#undef del_curterm
+int	del_curterm(
+		TERMINAL *termp)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_data.c */
+
+#undef stdscr
+WINDOW	*stdscr;
+#undef curscr
+WINDOW	*curscr;
+#undef newscr
+WINDOW	*newscr;
+#undef _nc_screen_chain
+SCREEN	*_nc_screen_chain;
+#undef SP
+SCREEN	*SP;
+#undef _nc_globals
+NCURSES_GLOBALS _nc_globals;
+#undef _nc_prescreen
+NCURSES_PRESCREEN _nc_prescreen;
+
+#undef _nc_screen_of
+SCREEN	*_nc_screen_of(
+		WINDOW	*win)
+		{ return(*(SCREEN **)0); }
+
+/* ./tinfo/lib_has_cap.c */
+
+#undef has_ic_sp
+NCURSES_BOOL has_ic_sp(
+		SCREEN	*sp)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef has_ic
+NCURSES_BOOL has_ic(void)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef has_il_sp
+NCURSES_BOOL has_il_sp(
+		SCREEN	*sp)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef has_il
+NCURSES_BOOL has_il(void)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./tinfo/lib_kernel.c */
+
+#undef erasechar_sp
+char	erasechar_sp(
+		SCREEN	*sp)
+		{ return(*(char *)0); }
+
+#undef erasechar
+char	erasechar(void)
+		{ return(*(char *)0); }
+
+#undef killchar_sp
+char	killchar_sp(
+		SCREEN	*sp)
+		{ return(*(char *)0); }
+
+#undef killchar
+char	killchar(void)
+		{ return(*(char *)0); }
+
+#undef flushinp_sp
+int	flushinp_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef flushinp
+int	flushinp(void)
+		{ return(*(int *)0); }
+
+/* ./lib_keyname.c */
+
+struct kn { short offset; int code; };
+
+#undef keyname_sp
+const char *keyname_sp(
+		SCREEN	*sp,
+		int	c)
+		{ return(*(const char **)0); }
+
+#undef keyname
+const char *keyname(
+		int	c)
+		{ return(*(const char **)0); }
+
+/* ./tinfo/lib_longname.c */
+
+#undef longname_sp
+char	*longname_sp(
+		SCREEN	*sp)
+		{ return(*(char **)0); }
+
+#undef longname
+char	*longname(void)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_napms.c */
+
+#undef napms_sp
+int	napms_sp(
+		SCREEN	*sp,
+		int	ms)
+		{ return(*(int *)0); }
+
+#undef napms
+int	napms(
+		int	ms)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_options.c */
+
+#undef idlok
+int	idlok(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef idcok
+void	idcok(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ /* void */ }
+
+#undef halfdelay_sp
+int	halfdelay_sp(
+		SCREEN	*sp,
+		int	t)
+		{ return(*(int *)0); }
+
+#undef halfdelay
+int	halfdelay(
+		int	t)
+		{ return(*(int *)0); }
+
+#undef nodelay
+int	nodelay(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef notimeout
+int	notimeout(
+		WINDOW	*win,
+		NCURSES_BOOL f)
+		{ return(*(int *)0); }
+
+#undef wtimeout
+void	wtimeout(
+		WINDOW	*win,
+		int	delay)
+		{ /* void */ }
+
+#undef keypad
+int	keypad(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef meta
+int	meta(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef curs_set_sp
+int	curs_set_sp(
+		SCREEN	*sp,
+		int	vis)
+		{ return(*(int *)0); }
+
+#undef curs_set
+int	curs_set(
+		int	vis)
+		{ return(*(int *)0); }
+
+#undef typeahead_sp
+int	typeahead_sp(
+		SCREEN	*sp,
+		int	fd)
+		{ return(*(int *)0); }
+
+#undef typeahead
+int	typeahead(
+		int	fd)
+		{ return(*(int *)0); }
+
+#undef has_key_sp
+int	has_key_sp(
+		SCREEN	*sp,
+		int	keycode)
+		{ return(*(int *)0); }
+
+#undef has_key
+int	has_key(
+		int	keycode)
+		{ return(*(int *)0); }
+
+#undef _nc_putp_flush_sp
+int	_nc_putp_flush_sp(
+		SCREEN	*sp,
+		const char *name,
+		const char *value)
+		{ return(*(int *)0); }
+
+#undef _nc_keypad
+int	_nc_keypad(
+		SCREEN	*sp,
+		int	flag)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_raw.c */
+
+#undef raw_sp
+int	raw_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef raw
+int	raw(void)
+		{ return(*(int *)0); }
+
+#undef cbreak_sp
+int	cbreak_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef cbreak
+int	cbreak(void)
+		{ return(*(int *)0); }
+
+#undef qiflush_sp
+void	qiflush_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef qiflush
+void	qiflush(void)
+		{ /* void */ }
+
+#undef noraw_sp
+int	noraw_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef noraw
+int	noraw(void)
+		{ return(*(int *)0); }
+
+#undef nocbreak_sp
+int	nocbreak_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef nocbreak
+int	nocbreak(void)
+		{ return(*(int *)0); }
+
+#undef noqiflush_sp
+void	noqiflush_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef noqiflush
+void	noqiflush(void)
+		{ /* void */ }
+
+#undef intrflush_sp
+int	intrflush_sp(
+		SCREEN	*sp,
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef intrflush
+int	intrflush(
+		WINDOW	*win,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_setup.c */
+
+#undef ttytype
+char	ttytype[256];
+#undef LINES
+int	LINES;
+#undef COLS
+int	COLS;
+#undef TABSIZE
+int	TABSIZE;
+
+#undef set_tabsize_sp
+int	set_tabsize_sp(
+		SCREEN	*sp,
+		int	value)
+		{ return(*(int *)0); }
+
+#undef set_tabsize
+int	set_tabsize(
+		int	value)
+		{ return(*(int *)0); }
+
+#undef _nc_handle_sigwinch
+int	_nc_handle_sigwinch(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef use_env_sp
+void	use_env_sp(
+		SCREEN	*sp,
+		NCURSES_BOOL f)
+		{ /* void */ }
+
+#undef use_tioctl_sp
+void	use_tioctl_sp(
+		SCREEN	*sp,
+		NCURSES_BOOL f)
+		{ /* void */ }
+
+#undef use_env
+void	use_env(
+		NCURSES_BOOL f)
+		{ /* void */ }
+
+#undef use_tioctl
+void	use_tioctl(
+		NCURSES_BOOL f)
+		{ /* void */ }
+
+#undef _nc_get_screensize
+void	_nc_get_screensize(
+		SCREEN	*sp,
+		int	*linep,
+		int	*colp)
+		{ /* void */ }
+
+#undef _nc_update_screensize
+void	_nc_update_screensize(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_setup_tinfo
+int	_nc_setup_tinfo(
+		const char *const tn,
+		TERMTYPE2 *const tp)
+		{ return(*(int *)0); }
+
+#undef _nc_tinfo_cmdch
+void	_nc_tinfo_cmdch(
+		TERMINAL *termp,
+		int	proto)
+		{ /* void */ }
+
+#undef _nc_get_locale
+char	*_nc_get_locale(void)
+		{ return(*(char **)0); }
+
+#undef _nc_unicode_locale
+int	_nc_unicode_locale(void)
+		{ return(*(int *)0); }
+
+#undef _nc_locale_breaks_acs
+int	_nc_locale_breaks_acs(
+		TERMINAL *termp)
+		{ return(*(int *)0); }
+
+#undef _nc_setupterm
+int	_nc_setupterm(
+		const char *tname,
+		int	Filedes,
+		int	*errret,
+		int	reuse)
+		{ return(*(int *)0); }
+
+#undef new_prescr
+SCREEN	*new_prescr(void)
+		{ return(*(SCREEN **)0); }
+
+#undef setupterm
+int	setupterm(
+		const char *tname,
+		int	Filedes,
+		int	*errret)
+		{ return(*(int *)0); }
+
+/* ./tinfo/lib_termcap.c */
+
+#undef UP
+char	*UP;
+#undef BC
+char	*BC;
+
+#undef tgetent_sp
+int	tgetent_sp(
+		SCREEN	*sp,
+		char	*bufp,
+		const char *name)
+		{ return(*(int *)0); }
+
+#undef tgetent
+int	tgetent(
+		char	*bufp,
+		const char *name)
+		{ return(*(int *)0); }
+
+#undef tgetflag_sp
+int	tgetflag_sp(
+		SCREEN	*sp,
+		const char *id)
+		{ return(*(int *)0); }
+
+#undef tgetflag
+int	tgetflag(
+		const char *id)
+		{ return(*(int *)0); }
+
+#undef tgetnum_sp
+int	tgetnum_sp(
+		SCREEN	*sp,
+		const char *id)
+		{ return(*(int *)0); }
+
+#undef tgetnum
+int	tgetnum(
+		const char *id)
+		{ return(*(int *)0); }
+
+#undef tgetstr_sp
+char	*tgetstr_sp(
+		SCREEN	*sp,
+		const char *id,
+		char	**area)
+		{ return(*(char **)0); }
+
+#undef tgetstr
+char	*tgetstr(
+		const char *id,
+		char	**area)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_termname.c */
+
+#undef termname_sp
+char	*termname_sp(
+		SCREEN	*sp)
+		{ return(*(char **)0); }
+
+#undef termname
+char	*termname(void)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_tgoto.c */
+
+#undef tgoto
+char	*tgoto(
+		const char *string,
+		int	x,
+		int	y)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_ti.c */
+
+#undef tigetflag_sp
+int	tigetflag_sp(
+		SCREEN	*sp,
+		const char *str)
+		{ return(*(int *)0); }
+
+#undef tigetflag
+int	tigetflag(
+		const char *str)
+		{ return(*(int *)0); }
+
+#undef tigetnum_sp
+int	tigetnum_sp(
+		SCREEN	*sp,
+		const char *str)
+		{ return(*(int *)0); }
+
+#undef tigetnum
+int	tigetnum(
+		const char *str)
+		{ return(*(int *)0); }
+
+#undef tigetstr_sp
+char	*tigetstr_sp(
+		SCREEN	*sp,
+		const char *str)
+		{ return(*(char **)0); }
+
+#undef tigetstr
+char	*tigetstr(
+		const char *str)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_tparm.c */
+
+#undef _nc_tparm_err
+int	_nc_tparm_err;
+
+#undef _nc_free_tparm
+void	_nc_free_tparm(
+		TERMINAL *termp)
+		{ /* void */ }
+
+#undef _nc_tparm_analyze
+int	_nc_tparm_analyze(
+		TERMINAL *term,
+		const char *string,
+		char	**p_is_s,
+		int	*_nc_popcount)
+		{ return(*(int *)0); }
+
+#undef tparm
+char	*tparm(
+		const char *string,
+		...)
+		{ return(*(char **)0); }
+
+#undef tiparm
+char	*tiparm(
+		const char *string,
+		...)
+		{ return(*(char **)0); }
+
+#undef _nc_tiparm
+char	*_nc_tiparm(
+		int	expected,
+		const char *string,
+		...)
+		{ return(*(char **)0); }
+
+#undef _nc_reset_tparm
+void	_nc_reset_tparm(
+		TERMINAL *term)
+		{ /* void */ }
+
+/* ./tinfo/lib_tputs.c */
+
+#undef PC
+char	PC;
+#undef ospeed
+short	ospeed;
+#undef _nc_nulls_sent
+int	_nc_nulls_sent;
+
+#undef _nc_set_no_padding
+void	_nc_set_no_padding(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef delay_output_sp
+int	delay_output_sp(
+		SCREEN	*sp,
+		int	ms)
+		{ return(*(int *)0); }
+
+#undef delay_output
+int	delay_output(
+		int	ms)
+		{ return(*(int *)0); }
+
+#undef _nc_flush_sp
+void	_nc_flush_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef _nc_flush
+void	_nc_flush(void)
+		{ /* void */ }
+
+#undef _nc_outch_sp
+int	_nc_outch_sp(
+		SCREEN	*sp,
+		int	ch)
+		{ return(*(int *)0); }
+
+#undef _nc_outch
+int	_nc_outch(
+		int	ch)
+		{ return(*(int *)0); }
+
+#undef _nc_putchar_sp
+int	_nc_putchar_sp(
+		SCREEN	*sp,
+		int	ch)
+		{ return(*(int *)0); }
+
+#undef _nc_putchar
+int	_nc_putchar(
+		int	ch)
+		{ return(*(int *)0); }
+
+#undef putp_sp
+int	putp_sp(
+		SCREEN	*sp,
+		const char *string)
+		{ return(*(int *)0); }
+
+#undef putp
+int	putp(
+		const char *string)
+		{ return(*(int *)0); }
+
+#undef _nc_putp_sp
+int	_nc_putp_sp(
+		SCREEN	*sp,
+		const char *name,
+		const char *string)
+		{ return(*(int *)0); }
+
+#undef _nc_putp
+int	_nc_putp(
+		const char *name,
+		const char *string)
+		{ return(*(int *)0); }
+
+#undef tputs_sp
+int	tputs_sp(
+		SCREEN	*sp,
+		const char *string,
+		int	affcnt,
+		NCURSES_OUTC_sp outc)
+		{ return(*(int *)0); }
+
+#undef _nc_outc_wrapper
+int	_nc_outc_wrapper(
+		SCREEN	*sp,
+		int	c)
+		{ return(*(int *)0); }
+
+#undef tputs
+int	tputs(
+		const char *string,
+		int	affcnt,
+		int	(*outc)(
+		int	p1))
+		{ return(*(int *)0); }
+
+/* ./trace/lib_trace.c */
+
+#undef _nc_tracing
+unsigned _nc_tracing;
+#undef _nc_tputs_trace
+const char *_nc_tputs_trace = {0};
+#undef _nc_outchars
+long	_nc_outchars;
+
+#undef curses_trace
+unsigned curses_trace(
+		unsigned tracelevel)
+		{ return(*(unsigned *)0); }
+
+#undef trace
+void	trace(
+		const unsigned int tracelevel)
+		{ /* void */ }
+
+#undef _tracef
+void	_tracef(
+		const char *fmt,
+		...)
+		{ /* void */ }
+
+#undef _nc_retrace_bool
+NCURSES_BOOL _nc_retrace_bool(
+		int	code)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_retrace_char
+char	_nc_retrace_char(
+		int	code)
+		{ return(*(char *)0); }
+
+#undef _nc_retrace_int
+int	_nc_retrace_int(
+		int	code)
+		{ return(*(int *)0); }
+
+#undef _nc_retrace_unsigned
+unsigned _nc_retrace_unsigned(
+		unsigned code)
+		{ return(*(unsigned *)0); }
+
+#undef _nc_retrace_ptr
+char	*_nc_retrace_ptr(
+		char	*code)
+		{ return(*(char **)0); }
+
+#undef _nc_retrace_cptr
+const char *_nc_retrace_cptr(
+		const char *code)
+		{ return(*(const char **)0); }
+
+#undef _nc_retrace_cvoid_ptr
+const void *_nc_retrace_cvoid_ptr(
+		const void *code)
+		{ return(*(const void **)0); }
+
+#undef _nc_retrace_void_ptr
+void	*_nc_retrace_void_ptr(
+		void	*code)
+		{ return(*(void **)0); }
+
+#undef _nc_retrace_sp
+SCREEN	*_nc_retrace_sp(
+		SCREEN	*code)
+		{ return(*(SCREEN **)0); }
+
+#undef _nc_retrace_win
+WINDOW	*_nc_retrace_win(
+		WINDOW	*code)
+		{ return(*(WINDOW **)0); }
+
+#undef _nc_fmt_funcptr
+char	*_nc_fmt_funcptr(
+		char	*target,
+		const char *source,
+		size_t	size)
+		{ return(*(char **)0); }
+
+/* ./trace/lib_traceatr.c */
+
+#undef _traceattr2
+char	*_traceattr2(
+		int	bufnum,
+		chtype	newmode)
+		{ return(*(char **)0); }
+
+#undef _traceattr
+char	*_traceattr(
+		attr_t	newmode)
+		{ return(*(char **)0); }
+
+#undef _nc_retrace_int_attr_t
+int	_nc_retrace_int_attr_t(
+		attr_t	code)
+		{ return(*(int *)0); }
+
+#undef _nc_retrace_attr_t
+attr_t	_nc_retrace_attr_t(
+		attr_t	code)
+		{ return(*(attr_t *)0); }
+
+#undef _nc_altcharset_name
+const char *_nc_altcharset_name(
+		attr_t	attr,
+		chtype	ch)
+		{ return(*(const char **)0); }
+
+#undef _tracechtype2
+char	*_tracechtype2(
+		int	bufnum,
+		chtype	ch)
+		{ return(*(char **)0); }
+
+#undef _tracechtype
+char	*_tracechtype(
+		chtype	ch)
+		{ return(*(char **)0); }
+
+#undef _nc_retrace_chtype
+chtype	_nc_retrace_chtype(
+		chtype	code)
+		{ return(*(chtype *)0); }
+
+#undef _tracecchar_t2
+char	*_tracecchar_t2(
+		int	bufnum,
+		const cchar_t *ch)
+		{ return(*(char **)0); }
+
+#undef _tracecchar_t
+char	*_tracecchar_t(
+		const cchar_t *ch)
+		{ return(*(char **)0); }
+
+/* ./trace/lib_tracebits.c */
+
+#undef _nc_trace_ttymode
+char	*_nc_trace_ttymode(
+		const struct termios *tty)
+		{ return(*(char **)0); }
+
+#undef _nc_tracebits
+char	*_nc_tracebits(void)
+		{ return(*(char **)0); }
+
+/* ./trace/lib_tracechr.c */
+
+#undef _nc_tracechar
+char	*_nc_tracechar(
+		SCREEN	*sp,
+		int	ch)
+		{ return(*(char **)0); }
+
+#undef _tracechar
+char	*_tracechar(
+		int	ch)
+		{ return(*(char **)0); }
+
+/* ./tinfo/lib_ttyflags.c */
+
+#undef _nc_get_tty_mode_sp
+int	_nc_get_tty_mode_sp(
+		SCREEN	*sp,
+		struct termios *buf)
+		{ return(*(int *)0); }
+
+#undef _nc_get_tty_mode
+int	_nc_get_tty_mode(
+		struct termios *buf)
+		{ return(*(int *)0); }
+
+#undef _nc_set_tty_mode_sp
+int	_nc_set_tty_mode_sp(
+		SCREEN	*sp,
+		struct termios *buf)
+		{ return(*(int *)0); }
+
+#undef _nc_set_tty_mode
+int	_nc_set_tty_mode(
+		struct termios *buf)
+		{ return(*(int *)0); }
+
+#undef def_shell_mode_sp
+int	def_shell_mode_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef def_shell_mode
+int	def_shell_mode(void)
+		{ return(*(int *)0); }
+
+#undef def_prog_mode_sp
+int	def_prog_mode_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef def_prog_mode
+int	def_prog_mode(void)
+		{ return(*(int *)0); }
+
+#undef reset_prog_mode_sp
+int	reset_prog_mode_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef reset_prog_mode
+int	reset_prog_mode(void)
+		{ return(*(int *)0); }
+
+#undef reset_shell_mode_sp
+int	reset_shell_mode_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef reset_shell_mode
+int	reset_shell_mode(void)
+		{ return(*(int *)0); }
+
+#undef savetty_sp
+int	savetty_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef savetty
+int	savetty(void)
+		{ return(*(int *)0); }
+
+#undef resetty_sp
+int	resetty_sp(
+		SCREEN	*sp)
+		{ return(*(int *)0); }
+
+#undef resetty
+int	resetty(void)
+		{ return(*(int *)0); }
+
+/* ./tty/lib_twait.c */
+
+#undef _nc_timed_wait
+int	_nc_timed_wait(
+		SCREEN	*sp,
+		int	mode,
+		int	milliseconds,
+		int	*timeleft)
+		{ return(*(int *)0); }
+
+/* ./tinfo/name_match.c */
+
+#undef _nc_first_name
+char	*_nc_first_name(
+		const char *const sp)
+		{ return(*(char **)0); }
+
+#undef _nc_name_match
+int	_nc_name_match(
+		const char *const namelst,
+		const char *const name,
+		const char *const delim)
+		{ return(*(int *)0); }
+
+/* ./names.c */
+
+#undef boolnames
+const char *const boolnames[] = {0};
+#undef boolfnames
+const char *const boolfnames[] = {0};
+#undef numnames
+const char *const numnames[] = {0};
+#undef numfnames
+const char *const numfnames[] = {0};
+#undef strnames
+const char *const strnames[] = {0};
+#undef strfnames
+const char *const strfnames[] = {0};
+
+/* ./tinfo/obsolete.c */
+
+#undef _nc_set_buffer_sp
+void	_nc_set_buffer_sp(
+		SCREEN	*sp,
+		FILE	*ofp,
+		int	buffered)
+		{ /* void */ }
+
+#undef _nc_set_buffer
+void	_nc_set_buffer(
+		FILE	*ofp,
+		int	buffered)
+		{ /* void */ }
+
+/* ./tinfo/read_entry.c */
+
+#undef _nc_init_termtype
+void	_nc_init_termtype(
+		TERMTYPE2 *const tp)
+		{ /* void */ }
+
+#undef _nc_read_termtype
+int	_nc_read_termtype(
+		TERMTYPE2 *ptr,
+		char	*buffer,
+		int	limit)
+		{ return(*(int *)0); }
+
+#undef _nc_read_file_entry
+int	_nc_read_file_entry(
+		const char *const filename,
+		TERMTYPE2 *ptr)
+		{ return(*(int *)0); }
+
+#undef _nc_read_entry2
+int	_nc_read_entry2(
+		const char *const name,
+		char	*const filename,
+		TERMTYPE2 *const tp)
+		{ return(*(int *)0); }
+
+#undef _nc_read_entry
+int	_nc_read_entry(
+		const char *const name,
+		char	*const filename,
+		TERMTYPE *const tp)
+		{ return(*(int *)0); }
+
+/* ./tinfo/read_termcap.c */
+
+#undef _nc_read_termcap
+void	_nc_read_termcap(void)
+		{ /* void */ }
+
+/* ./tinfo/strings.c */
+
+#undef _nc_str_init
+string_desc *_nc_str_init(
+		string_desc *dst,
+		char	*src,
+		size_t	len)
+		{ return(*(string_desc **)0); }
+
+#undef _nc_str_null
+string_desc *_nc_str_null(
+		string_desc *dst,
+		size_t	len)
+		{ return(*(string_desc **)0); }
+
+#undef _nc_str_copy
+string_desc *_nc_str_copy(
+		string_desc *dst,
+		string_desc *src)
+		{ return(*(string_desc **)0); }
+
+#undef _nc_safe_strcat
+NCURSES_BOOL _nc_safe_strcat(
+		string_desc *dst,
+		const char *src)
+		{ return(*(NCURSES_BOOL *)0); }
+
+#undef _nc_safe_strcpy
+NCURSES_BOOL _nc_safe_strcpy(
+		string_desc *dst,
+		const char *src)
+		{ return(*(NCURSES_BOOL *)0); }
+
+/* ./trace/trace_buf.c */
+
+#undef _nc_trace_buf
+char	*_nc_trace_buf(
+		int	bufnum,
+		size_t	want)
+		{ return(*(char **)0); }
+
+#undef _nc_trace_bufcat
+char	*_nc_trace_bufcat(
+		int	bufnum,
+		const char *value)
+		{ return(*(char **)0); }
+
+/* ./trace/trace_tries.c */
+
+#undef _nc_trace_tries
+void	_nc_trace_tries(
+		TRIES	*tree)
+		{ /* void */ }
+
+/* ./base/tries.c */
+
+#undef _nc_expand_try
+char	*_nc_expand_try(
+		TRIES	*tree,
+		unsigned code,
+		int	*count,
+		size_t	len)
+		{ return(*(char **)0); }
+
+#undef _nc_remove_key
+int	_nc_remove_key(
+		TRIES	**tree,
+		unsigned code)
+		{ return(*(int *)0); }
+
+#undef _nc_remove_string
+int	_nc_remove_string(
+		TRIES	**tree,
+		const char *string)
+		{ return(*(int *)0); }
+
+/* ./tinfo/trim_sgr0.c */
+
+#undef _nc_trim_sgr0
+char	*_nc_trim_sgr0(
+		TERMTYPE2 *tp)
+		{ return(*(char **)0); }
+
+/* ./unctrl.c */
+
+#undef unctrl_sp
+const char *unctrl_sp(
+		SCREEN	*sp,
+		chtype	ch)
+		{ return(*(const char **)0); }
+
+#undef unctrl
+const char *unctrl(
+		chtype	ch)
+		{ return(*(const char **)0); }
+
+/* ./trace/visbuf.c */
+
+#undef _nc_visbuf2
+const char *_nc_visbuf2(
+		int	bufnum,
+		const char *buf)
+		{ return(*(const char **)0); }
+
+#undef _nc_visbuf
+const char *_nc_visbuf(
+		const char *buf)
+		{ return(*(const char **)0); }
+
+#undef _nc_visbufn
+const char *_nc_visbufn(
+		const char *buf,
+		int	len)
+		{ return(*(const char **)0); }
+
+#undef _nc_viswbuf2
+const char *_nc_viswbuf2(
+		int	bufnum,
+		const wchar_t *buf)
+		{ return(*(const char **)0); }
+
+#undef _nc_viswbuf
+const char *_nc_viswbuf(
+		const wchar_t *buf)
+		{ return(*(const char **)0); }
+
+#undef _nc_viswbufn
+const char *_nc_viswbufn(
+		const wchar_t *buf,
+		int	len)
+		{ return(*(const char **)0); }
+
+#undef _nc_viswibuf
+const char *_nc_viswibuf(
+		const wint_t *buf)
+		{ return(*(const char **)0); }
+
+#undef _nc_viscbuf2
+const char *_nc_viscbuf2(
+		int	bufnum,
+		const cchar_t *buf,
+		int	len)
+		{ return(*(const char **)0); }
+
+#undef _nc_viscbuf
+const char *_nc_viscbuf(
+		const cchar_t *buf,
+		int	len)
+		{ return(*(const char **)0); }
+
+/* ./base/define_key.c */
+
+#undef define_key_sp
+int	define_key_sp(
+		SCREEN	*sp,
+		const char *str,
+		int	keycode)
+		{ return(*(int *)0); }
+
+#undef define_key
+int	define_key(
+		const char *str,
+		int	keycode)
+		{ return(*(int *)0); }
+
+/* ./tinfo/hashed_db.c */
+
+#undef _nc_hashed_db
+void	_nc_hashed_db(void)
+		{ /* void */ }
+
+/* ./base/key_defined.c */
+
+#undef key_defined_sp
+int	key_defined_sp(
+		SCREEN	*sp,
+		const char *str)
+		{ return(*(int *)0); }
+
+#undef key_defined
+int	key_defined(
+		const char *str)
+		{ return(*(int *)0); }
+
+/* ./base/keybound.c */
+
+#undef keybound_sp
+char	*keybound_sp(
+		SCREEN	*sp,
+		int	code,
+		int	count)
+		{ return(*(char **)0); }
+
+#undef keybound
+char	*keybound(
+		int	code,
+		int	count)
+		{ return(*(char **)0); }
+
+/* ./base/keyok.c */
+
+#undef keyok_sp
+int	keyok_sp(
+		SCREEN	*sp,
+		int	c,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+#undef keyok
+int	keyok(
+		int	c,
+		NCURSES_BOOL flag)
+		{ return(*(int *)0); }
+
+/* ./base/version.c */
+
+#undef curses_version
+const char *curses_version(void)
+		{ return(*(const char **)0); }
diff --git a/ncurses/modules b/ncurses/modules
new file mode 100644
index 0000000..e111712
--- /dev/null
+++ b/ncurses/modules
@@ -0,0 +1,253 @@
+# $Id: modules,v 1.127 2020/09/12 17:58:12 tom Exp $
+##############################################################################
+# Copyright 2019,2020 Thomas E. Dickey                                       #
+# Copyright 1998-2013,2017 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey	1996-on
+#
+
+@ base
+# Library objects
+hardscroll	lib		$(serial)	$(HEADER_DEPS)
+hashmap		lib		$(serial)	$(HEADER_DEPS)
+lib_addch	lib		$(base)		$(HEADER_DEPS)
+lib_addstr	lib		$(base)		$(HEADER_DEPS)
+lib_beep	lib		$(base)		$(HEADER_DEPS)
+lib_bkgd	lib		$(base)		$(HEADER_DEPS)
+lib_box 	lib		$(base)		$(HEADER_DEPS)
+lib_chgat	lib		$(base)		$(HEADER_DEPS)
+lib_clear	lib		$(base)		$(HEADER_DEPS)
+lib_clearok	lib		$(base)		$(HEADER_DEPS)
+lib_clrbot	lib		$(base)		$(HEADER_DEPS)
+lib_clreol	lib		$(base)		$(HEADER_DEPS)
+lib_color	lib		$(base)		$(HEADER_DEPS)	$(INCDIR)/tic.h	$(srcdir)/new_pair.h
+lib_colorset	lib		$(base)		$(HEADER_DEPS)
+lib_delch	lib		$(base)		$(HEADER_DEPS)
+lib_delwin	lib		$(base)		$(HEADER_DEPS)
+lib_echo	lib		$(base)		$(HEADER_DEPS)
+lib_endwin	lib		$(base)		$(HEADER_DEPS)
+lib_erase	lib		$(base)		$(HEADER_DEPS)
+lib_flash	lib		$(base)		$(HEADER_DEPS)
+lib_gen 	lib		.		$(HEADER_DEPS)
+lib_getch	lib		$(base)		$(HEADER_DEPS)	$(srcdir)/fifo_defs.h
+lib_getstr	lib		$(base)		$(HEADER_DEPS)
+lib_hline	lib		$(base)		$(HEADER_DEPS)
+lib_immedok	lib		$(base)		$(HEADER_DEPS)
+lib_inchstr	lib		$(base)		$(HEADER_DEPS)
+lib_initscr	lib		$(base)		$(HEADER_DEPS)
+lib_insch	lib		$(base)		$(HEADER_DEPS)
+lib_insdel	lib		$(base)		$(HEADER_DEPS)
+lib_insnstr	lib		$(base)		$(HEADER_DEPS)
+lib_instr	lib		$(base)		$(HEADER_DEPS)
+lib_isendwin	lib		$(base)		$(HEADER_DEPS)
+lib_leaveok	lib		$(base)		$(HEADER_DEPS)
+lib_mouse	lib		$(base)		$(HEADER_DEPS)	$(INCDIR)/tic.h
+lib_move	lib		$(base)		$(HEADER_DEPS)
+lib_mvcur	lib		$(serial)	$(HEADER_DEPS)	$(INCDIR)/tic.h $(srcdir)/../progs/dump_entry.h
+lib_mvwin	lib		$(base)		$(HEADER_DEPS)
+lib_newterm	lib		$(base)		$(HEADER_DEPS)	$(INCDIR)/tic.h
+lib_newwin	lib		$(base)		$(HEADER_DEPS)
+lib_nl		lib		$(base)		$(HEADER_DEPS)
+lib_overlay	lib		$(base)		$(HEADER_DEPS)
+lib_pad 	lib		$(base)		$(HEADER_DEPS)
+lib_printw	lib		$(base)		$(HEADER_DEPS)
+lib_redrawln	lib		$(base)		$(HEADER_DEPS)
+lib_refresh	lib		$(base)		$(HEADER_DEPS)
+lib_restart	lib		$(base)		$(HEADER_DEPS)
+lib_scanw	lib		$(base)		$(HEADER_DEPS)
+lib_screen	lib		$(base)		$(HEADER_DEPS)
+lib_scroll	lib		$(base)		$(HEADER_DEPS)
+lib_scrollok	lib		$(base)		$(HEADER_DEPS)
+lib_scrreg	lib		$(base)		$(HEADER_DEPS)
+lib_set_term	lib		$(base)		$(HEADER_DEPS)	$(INCDIR)/tic.h
+lib_slk 	lib		$(base)		$(HEADER_DEPS)
+lib_slkatr_set	lib		$(base)		$(HEADER_DEPS)
+lib_slkatrof 	lib		$(base)		$(HEADER_DEPS)
+lib_slkatron 	lib		$(base)		$(HEADER_DEPS)
+lib_slkatrset 	lib		$(base)		$(HEADER_DEPS)
+lib_slkattr 	lib		$(base)		$(HEADER_DEPS)
+lib_slkclear 	lib		$(base)		$(HEADER_DEPS)
+lib_slkcolor 	lib		$(base)		$(HEADER_DEPS)
+lib_slkinit 	lib		$(base)		$(HEADER_DEPS)
+lib_slklab	lib		$(base)		$(HEADER_DEPS)
+lib_slkrefr	lib		$(base)		$(HEADER_DEPS)
+lib_slkset	lib		$(base)		$(HEADER_DEPS)
+lib_slktouch	lib		$(base)		$(HEADER_DEPS)
+lib_touch	lib		$(base)		$(HEADER_DEPS)
+lib_tracedmp	lib		$(trace)	$(HEADER_DEPS)
+lib_tracemse	lib		$(trace)	$(HEADER_DEPS)
+lib_tstp	lib		$(serial)	$(HEADER_DEPS)	$(srcdir)/SigAction.h
+lib_ungetch	lib		$(base)		$(HEADER_DEPS)	$(srcdir)/fifo_defs.h
+lib_vidattr	lib		$(serial)	$(HEADER_DEPS)
+lib_vline	lib		$(base)		$(HEADER_DEPS)
+lib_wattroff	lib		$(base)		$(HEADER_DEPS)
+lib_wattron	lib		$(base)		$(HEADER_DEPS)
+lib_winch	lib		$(base)		$(HEADER_DEPS)
+lib_window	lib		$(base)		$(HEADER_DEPS)
+link_test 	lib		.		$(HEADER_DEPS)
+nc_panel	lib		$(base)		$(HEADER_DEPS)
+safe_sprintf	lib		$(base)		$(HEADER_DEPS)
+tty_update	lib		$(serial)	$(HEADER_DEPS)
+varargs		lib		$(trace)	$(HEADER_DEPS)
+
+# Modules for porting
+vsscanf 	lib		$(base)		$(HEADER_DEPS)
+
+# actually an extension, but with its own configure option (--disable-leaks)
+lib_freeall	lib		$(base)		$(HEADER_DEPS)	$(INCDIR)/tic.h
+
+# XSI extensions to the base library (wide-character)
+@ widechar
+charable	lib		$(wide)		$(HEADER_DEPS)
+lib_add_wch	lib		$(wide)		$(HEADER_DEPS)
+lib_box_set	lib		$(wide)		$(HEADER_DEPS)
+lib_cchar	lib		$(wide)		$(HEADER_DEPS)	$(srcdir)/new_pair.h
+lib_erasewchar	lib		$(wide)		$(HEADER_DEPS)
+lib_get_wch	lib		$(wide)		$(HEADER_DEPS)
+lib_get_wstr	lib		$(wide)		$(HEADER_DEPS)
+lib_hline_set	lib		$(wide)		$(HEADER_DEPS)
+lib_in_wch	lib		$(wide)		$(HEADER_DEPS)
+lib_in_wchnstr	lib		$(wide)		$(HEADER_DEPS)
+lib_ins_wch	lib		$(wide)		$(HEADER_DEPS)
+lib_inwstr	lib		$(wide)		$(HEADER_DEPS)
+lib_key_name	lib		$(wide)		$(HEADER_DEPS)
+lib_pecho_wchar	lib		$(wide)		$(HEADER_DEPS)
+lib_slk_wset	lib		$(wide)		$(HEADER_DEPS)
+lib_unget_wch	lib		$(wide)		$(HEADER_DEPS)
+lib_vid_attr	lib		$(wide)		$(HEADER_DEPS)
+lib_vline_set	lib		$(wide)		$(HEADER_DEPS)
+lib_wacs	lib		$(wide)		$(HEADER_DEPS)
+lib_wunctrl	lib		$(wide)		$(HEADER_DEPS)
+
+# Extensions to the base library
+@ ext_funcs
+expanded	lib		.		$(HEADER_DEPS)
+legacy_coding	lib		$(base)		$(HEADER_DEPS)
+lib_dft_fgbg	lib		$(base)		$(HEADER_DEPS)
+lib_print	lib		$(tinfo)	$(HEADER_DEPS)
+new_pair	lib		$(base)		$(HEADER_DEPS)	$(srcdir)/new_pair.h
+resizeterm	lib		$(base)		$(HEADER_DEPS)
+trace_xnames	lib		$(trace)	$(HEADER_DEPS)
+use_screen	lib		$(tinfo)	$(HEADER_DEPS)
+use_window	lib		$(base)		$(HEADER_DEPS)
+wresize		lib		$(base)		$(HEADER_DEPS)
+
+# Support for termcap (and tic, etc.), which can be a separate library
+@ termlib
+access		lib		$(tinfo)	$(HEADER_DEPS)	$(INCDIR)/tic.h
+add_tries	lib		$(tinfo)	$(HEADER_DEPS)
+alloc_ttype	lib		$(tinfo)	$(HEADER_DEPS)	$(INCDIR)/tic.h
+codes		lib		.		$(HEADER_DEPS)
+comp_captab	lib		.		$(HEADER_DEPS)	$(INCDIR)/tic.h ../include/hashsize.h
+comp_error	lib		$(tinfo)	$(HEADER_DEPS)	$(INCDIR)/tic.h
+comp_hash	lib		$(tinfo)	$(HEADER_DEPS)	$(INCDIR)/tic.h ../include/hashsize.h
+comp_userdefs	lib		.		$(HEADER_DEPS)	$(INCDIR)/tic.h ../include/hashsize.h
+db_iterator	lib		$(tinfo)	$(HEADER_DEPS)	$(INCDIR)/tic.h
+doalloc		lib		$(tinfo)	$(HEADER_DEPS)
+entries		lib		$(tinfo)	$(HEADER_DEPS)	$(INCDIR)/tic.h
+fallback	lib		.		$(HEADER_DEPS)
+free_ttype	lib		$(tinfo)	$(HEADER_DEPS)	$(INCDIR)/tic.h
+getenv_num	lib		$(tinfo)	$(HEADER_DEPS)
+home_terminfo	lib		$(tinfo)	$(HEADER_DEPS)	$(INCDIR)/tic.h
+init_keytry	lib		$(tinfo)	$(HEADER_DEPS)	$(INCDIR)/tic.h init_keytry.h
+lib_acs 	lib		$(tinfo)	$(HEADER_DEPS)
+lib_baudrate	lib		$(tinfo)	$(HEADER_DEPS)	../include/termcap.h
+lib_cur_term	lib		$(tinfo)	$(HEADER_DEPS)	../include/termcap.h
+lib_data	lib		$(tinfo)	$(HEADER_DEPS)
+lib_has_cap	lib		$(tinfo)	$(HEADER_DEPS)
+lib_kernel	lib		$(tinfo)	$(HEADER_DEPS)
+lib_keyname	lib		.		$(HEADER_DEPS)	$(INCDIR)/tic.h
+lib_longname	lib		$(tinfo)	$(HEADER_DEPS)
+lib_napms	lib		$(tinfo)	$(HEADER_DEPS)
+lib_options	lib		$(tinfo)	$(HEADER_DEPS)
+lib_raw 	lib		$(tinfo)	$(HEADER_DEPS)
+lib_setup	lib		$(tinfo)	$(HEADER_DEPS)	$(INCDIR)/tic.h
+lib_termcap	lib		$(tinfo)	$(HEADER_DEPS)	$(INCDIR)/tic.h ../include/termcap.h $(INCDIR)/capdefaults.c
+lib_termname	lib		$(tinfo)	$(HEADER_DEPS)
+lib_tgoto	lib		$(tinfo)	$(HEADER_DEPS)	../include/termcap.h
+lib_ti		lib		$(tinfo)	$(HEADER_DEPS)	$(INCDIR)/tic.h
+lib_tparm	lib		$(tinfo)	$(HEADER_DEPS)	$(INCDIR)/tic.h
+lib_tputs	lib		$(tinfo)	$(HEADER_DEPS)	$(INCDIR)/tic.h ../include/termcap.h
+lib_trace	lib		$(trace)	$(HEADER_DEPS)	$(INCDIR)/tic.h
+lib_traceatr	lib		$(trace)	$(HEADER_DEPS)
+lib_tracebits	lib		$(trace)	$(HEADER_DEPS)
+lib_tracechr	lib		$(trace)	$(HEADER_DEPS)
+lib_ttyflags	lib		$(tinfo)	$(HEADER_DEPS)
+lib_twait	lib		$(serial)	$(HEADER_DEPS)
+name_match	lib		$(tinfo)	$(HEADER_DEPS)	$(INCDIR)/tic.h
+names		lib		.		$(HEADER_DEPS)
+obsolete	lib		$(tinfo)	$(HEADER_DEPS)
+read_entry	lib		$(tinfo)	$(HEADER_DEPS)	$(INCDIR)/tic.h $(INCDIR)/hashed_db.h
+read_termcap	lib		$(tinfo)	$(HEADER_DEPS)	$(INCDIR)/tic.h
+strings		lib		$(tinfo)	$(HEADER_DEPS)
+trace_buf	lib		$(trace)	$(HEADER_DEPS)
+trace_tries	lib		$(trace)	$(HEADER_DEPS)
+tries		lib		$(base)		$(HEADER_DEPS)
+trim_sgr0	lib		$(tinfo)	$(HEADER_DEPS)	$(INCDIR)/tic.h
+unctrl		lib		.		$(HEADER_DEPS)
+visbuf		lib		$(trace)	$(HEADER_DEPS)	$(INCDIR)/tic.h
+
+# Modules used only for tic, other programs using internal interfaces
+@ ticlib
+alloc_entry	lib		$(tinfo)	$(HEADER_DEPS)	$(INCDIR)/tic.h
+captoinfo	lib		$(tinfo)	$(HEADER_DEPS)	$(INCDIR)/tic.h
+comp_expand	lib		$(tinfo)	$(HEADER_DEPS)	$(INCDIR)/tic.h
+comp_parse	lib		$(tinfo)	$(HEADER_DEPS)	$(INCDIR)/tic.h
+comp_scan	lib		$(tinfo)	$(HEADER_DEPS)	$(INCDIR)/tic.h
+parse_entry	lib		$(tinfo)	$(HEADER_DEPS)	$(INCDIR)/tic.h ../include/parametrized.h
+write_entry	lib		$(tinfo)	$(HEADER_DEPS)	$(INCDIR)/tic.h $(INCDIR)/hashed_db.h
+
+# Extensions to the termlib library
+@ ext_tinfo
+define_key	lib		$(base)		$(HEADER_DEPS)
+hashed_db	lib		$(tinfo)	$(HEADER_DEPS)	$(INCDIR)/tic.h $(INCDIR)/hashed_db.h
+key_defined	lib		$(base)		$(HEADER_DEPS)
+keybound	lib		$(base)		$(HEADER_DEPS)
+keyok		lib		$(base)		$(HEADER_DEPS)
+version		lib		$(base)		$(HEADER_DEPS)
+
+# Porting
+@ port_drivers
+lib_driver      lib             $(base)		$(HEADER_DEPS)
+
+@ port_win32con
+gettimeofday	lib		$(win32con)	$(HEADER_DEPS)
+wcwidth		lib             $(win32con)	$(HEADER_DEPS)
+widechars	lib             $(wide)		$(HEADER_DEPS)
+win_driver	lib             $(win32con)	$(HEADER_DEPS)
+
+@ port_win32
+lib_win32con	lib		$(tinfo)	$(HEADER_DEPS)
+lib_win32util	lib		$(tinfo)	$(HEADER_DEPS)
+wcwidth		lib             $(win32con)	$(HEADER_DEPS)
+win32_driver	lib             $(win32con)	$(HEADER_DEPS)
+
+@ port_tinfo
+tinfo_driver	lib		$(tinfo)	$(HEADER_DEPS)	$(INCDIR)/tic.h
+
+# vile:makemode
diff --git a/ncurses/new_pair.h b/ncurses/new_pair.h
new file mode 100644
index 0000000..49d7e8b
--- /dev/null
+++ b/ncurses/new_pair.h
@@ -0,0 +1,139 @@
+/****************************************************************************
+ * Copyright 2018-2020,2021 Thomas E. Dickey                                *
+ * Copyright 2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                                                *
+ ****************************************************************************/
+
+/*
+ * Common type definitions and macros for new_pair.c, lib_color.c
+ *
+ * $Id: new_pair.h,v 1.13 2021/09/24 17:52:01 tom Exp $
+ */
+
+#ifndef NEW_PAIR_H
+#define NEW_PAIR_H 1
+/* *INDENT-OFF* */
+
+#include <ncurses_cfg.h>
+#include <ncurses_dll.h>
+
+#include <sys/types.h>
+
+#undef SCREEN
+#define SCREEN struct screen
+SCREEN;
+
+#define LIMIT_TYPED(n,t) \
+	(t)(((n) > MAX_OF_TYPE(t)) \
+	    ? MAX_OF_TYPE(t) \
+	    : ((n) < -MAX_OF_TYPE(t)) \
+	       ? -MAX_OF_TYPE(t) \
+	       : (n))
+
+#define limit_COLOR(n) LIMIT_TYPED(n,NCURSES_COLOR_T)
+#define limit_PAIRS(n) LIMIT_TYPED(n,NCURSES_PAIRS_T)
+
+#define MAX_XCURSES_PAIR MAX_OF_TYPE(NCURSES_PAIRS_T)
+
+#if NCURSES_EXT_COLORS
+#define OPTIONAL_PAIR	GCC_UNUSED
+#define get_extended_pair(opts, color_pair) \
+	if ((opts) != NULL) { \
+	    *(int*)(opts) = color_pair; \
+	}
+#define set_extended_pair(opts, color_pair) \
+	if ((opts) != NULL) { \
+	    color_pair = *(const int*)(opts); \
+	}
+#else
+#define OPTIONAL_PAIR	/* nothing */
+#define get_extended_pair(opts, color_pair) /* nothing */
+#define set_extended_pair(opts, color_pair) \
+	if ((opts) != NULL) { \
+	    color_pair = -1; \
+	}
+#endif
+
+#ifdef NEW_PAIR_INTERNAL
+
+typedef enum {
+    cpKEEP = -1,		/* color pair 0 */
+    cpFREE = 0,			/* free for use */
+    cpINIT = 1			/* initialized */
+} CPMODE;
+
+typedef struct _color_pairs
+{
+    int fg;
+    int bg;
+#if NCURSES_EXT_COLORS
+    int mode;			/* tells if the entry is allocated or free */
+    int prev;			/* index of previous item */
+    int next;			/* index of next item */
+#endif
+}
+colorpair_t;
+
+#define MakeColorPair(target,f,b) target.fg = f, target.bg = b
+#define isSamePair(a,b)		((a).fg == (b).fg && (a).bg == (b).bg)
+#define FORE_OF(c)		(c).fg
+#define BACK_OF(c)		(c).bg
+
+/*
+ * Ensure that we use color pairs only when colors have been started, and also
+ * that the index is within the limits of the table which we allocated.
+ */
+#define ValidPair(sp,pair) \
+    ((sp != 0) && (pair >= 0) && (pair < sp->_pair_limit) && sp->_coloron)
+
+#if NCURSES_EXT_COLORS
+extern NCURSES_EXPORT(void)     _nc_copy_pairs(SCREEN*, colorpair_t*, colorpair_t*, int);
+extern NCURSES_EXPORT(void)     _nc_free_ordered_pairs(SCREEN*);
+extern NCURSES_EXPORT(void)     _nc_reset_color_pair(SCREEN*, int, colorpair_t*);
+extern NCURSES_EXPORT(void)     _nc_set_color_pair(SCREEN*, int, int);
+#else
+#define _nc_free_ordered_pairs(sp) /* nothing */
+#define _nc_reset_color_pair(sp, pair, data) /* nothing */
+#define _nc_set_color_pair(sp, pair, mode) /* nothing */
+#endif
+
+#else
+
+typedef struct _color_pairs colorpair_t;
+
+#endif /* NEW_PAIR_INTERNAL */
+
+#if NO_LEAKS
+extern NCURSES_EXPORT(void)     _nc_new_pair_leaks(SCREEN*);
+#endif
+
+/* *INDENT-ON* */
+
+#endif /* NEW_PAIR_H */
diff --git a/ncurses/report_hashing.c b/ncurses/report_hashing.c
new file mode 100644
index 0000000..bed96ef
--- /dev/null
+++ b/ncurses/report_hashing.c
@@ -0,0 +1,73 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ *                                                                          *
+ * 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                                                *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+#include <tic.h>
+
+MODULE_ID("$Id: report_hashing.c,v 1.3 2020/02/02 23:34:34 tom Exp $")
+
+static void
+check_names(const char *name, NCURSES_CONST char *const *table, int termcap)
+{
+    int errs = 0;
+    int n;
+    struct name_table_entry const *entry_ptr;
+    const HashValue *hash_table = _nc_get_hash_table(termcap);
+
+    printf("%s:\n", name);
+    for (n = 0; table[n] != NULL; ++n) {
+	entry_ptr = _nc_find_entry(table[n], hash_table);
+	if (entry_ptr == 0) {
+	    printf("  %s\n", table[n]);
+	    errs++;
+	}
+    }
+    if (errs)
+	printf("%d errors\n", errs);
+}
+
+int
+main(void)
+{
+#define CHECK_TI(name) check_names(#name, name, 0)
+#define CHECK_TC(name) check_names(#name, name, 1)
+
+    CHECK_TI(boolnames);
+    CHECK_TI(numnames);
+    CHECK_TI(strnames);
+
+    CHECK_TC(boolcodes);
+    CHECK_TC(numcodes);
+    CHECK_TC(strcodes);
+
+    return EXIT_SUCCESS;
+}
diff --git a/ncurses/report_offsets.c b/ncurses/report_offsets.c
new file mode 100644
index 0000000..83f6f38
--- /dev/null
+++ b/ncurses/report_offsets.c
@@ -0,0 +1,250 @@
+/****************************************************************************
+ * Copyright 2018-2020,2021 Thomas E. Dickey                                *
+ * Copyright 2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                                                *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: report_offsets.c,v 1.22 2021/08/19 19:51:33 tom Exp $")
+
+#define show_size(type) \
+	flag = 0; \
+	last = 0; \
+	printf("%5lu   " #type "\n", (unsigned long)sizeof(type))
+#define show_offset(type,member) \
+	next = (unsigned long)offsetof(type,member); \
+	if (last > next) \
+		printf("?? incorrect order for " #type "." #member "\n"); \
+	printf("%5lu %c " #type "." #member "\n", next, flag ? *flag : ' '); \
+	last = next; \
+	flag = 0
+
+#if NCURSES_WIDECHAR && NCURSES_EXT_COLORS
+#define show_COLORS(type,member) { flag = "c"; show_offset(type,member); }
+#else
+#define show_COLORS(type,member)	/* nothing */
+#endif
+
+#ifdef USE_TERM_DRIVER
+#define show_DRIVER(type,member) { flag = "d"; show_offset(type,member); }
+#else
+#define show_DRIVER(type,member)	/* nothing */
+#endif
+
+#if NO_LEAKS
+#define show_MLEAKS(type,member) { flag = "L"; show_offset(type,member); }
+#else
+#define show_MLEAKS(type,member)	/* nothing */
+#endif
+
+#ifdef USE_TERM_DRIVER
+#define show_NORMAL(type,member)	/* nothing */
+#else
+#define show_NORMAL(type,member) { flag = "n"; show_offset(type,member); }
+#endif
+
+#define show_OPTION(type,member) { flag = "+"; show_offset(type,member); }
+
+#if USE_REENTRANT
+#define show_REENTR(type,member) { flag = "r"; show_offset(type,member); }
+#else
+#define show_REENTR(type,member)	/* nothing */
+#endif
+
+#if NCURSES_SP_FUNCS
+#define show_SPFUNC(type,member) { flag = "s"; show_offset(type,member); }
+#else
+#define show_SPFUNC(type,member)	/* nothing */
+#endif
+
+#ifdef USE_PTHREADS
+#define show_THREAD(type,member) { flag = "t"; show_offset(type,member); }
+#else
+#define show_THREAD(type,member)	/* nothing */
+#endif
+
+#ifdef TRACE
+#define show_TRACES(type,member) { flag = "T"; show_offset(type,member); }
+#else
+#define show_TRACES(type,member)	/* nothing */
+#endif
+
+#if USE_WIDEC_SUPPORT
+#define show_WIDECH(type,member) { flag = "w"; show_offset(type,member); }
+#else
+#define show_WIDECH(type,member)	/* nothing */
+#endif
+
+int
+main(void)
+{
+    const char *flag = 0;
+    unsigned long last, next;
+
+    printf("Size/offsets of data structures:\n");
+
+    show_size(attr_t);
+    show_size(chtype);
+#if USE_WIDEC_SUPPORT
+    show_size(cchar_t);
+#endif
+    show_size(mmask_t);
+    show_size(MEVENT);
+    show_size(NCURSES_BOOL);
+
+    printf("\n");
+    show_size(SCREEN);
+    show_offset(SCREEN, _ifd);
+    show_offset(SCREEN, _fifo);
+    show_offset(SCREEN, _fifohead);
+    show_offset(SCREEN, _direct_color);
+    show_offset(SCREEN, _panelHook);
+    show_offset(SCREEN, jump);
+    show_offset(SCREEN, rsp);
+#if NCURSES_NO_PADDING
+    show_OPTION(SCREEN, _no_padding);
+#endif
+#if USE_HARD_TABS
+    show_OPTION(SCREEN, _ht_cost);
+#endif
+#if USE_ITALIC
+    show_OPTION(SCREEN, _use_ritm);
+#endif
+#if USE_KLIBC_KBD
+    show_OPTION(SCREEN, _extended_key);
+#endif
+#if NCURSES_EXT_FUNCS
+    show_OPTION(SCREEN, _assumed_color);
+#endif
+#if USE_GPM_SUPPORT
+    show_OPTION(SCREEN, _mouse_gpm_loaded);
+#ifdef HAVE_LIBDL
+    show_OPTION(SCREEN, _dlopen_gpm);
+#endif
+#endif
+#if USE_EMX_MOUSE
+    show_OPTION(SCREEN, _emxmouse_wfd);
+#endif
+#if USE_SYSMOUSE
+    show_OPTION(SCREEN, _sysmouse_fifo);
+#endif
+    show_DRIVER(SCREEN, _drv_mouse_fifo);
+#if USE_SIZECHANGE
+    show_OPTION(SCREEN, _resize);
+#endif
+    show_DRIVER(SCREEN, _windowlist);
+    show_REENTR(SCREEN, _ttytype);
+    show_SPFUNC(SCREEN, use_tioctl);
+    show_WIDECH(SCREEN, _screen_acs_fix);
+    show_COLORS(SCREEN, _ordered_pairs);
+    show_TRACES(SCREEN, tracechr_buf);
+
+    printf("\n");
+    show_size(TERMINAL);
+    show_offset(TERMINAL, type);
+    show_offset(TERMINAL, Filedes);
+    show_offset(TERMINAL, Ottyb);
+    show_offset(TERMINAL, Nttyb);
+    show_offset(TERMINAL, _baudrate);
+    show_offset(TERMINAL, _termname);
+    show_offset(TERMINAL, tparm_state);
+#if HAVE_INIT_EXTENDED_COLOR
+    show_COLORS(TERMINAL, type2);
+#endif
+
+    printf("\n");
+    show_size(TERMTYPE);
+#if NCURSES_XNAMES
+    show_OPTION(TERMTYPE, ext_str_table);
+    show_OPTION(TERMTYPE, ext_Strings);
+#endif
+
+    printf("\n");
+    show_size(TPARM_STATE);
+    show_offset(TPARM_STATE, stack);
+    show_offset(TPARM_STATE, stack_ptr);
+    show_offset(TPARM_STATE, out_buff);
+    show_offset(TPARM_STATE, fmt_buff);
+    show_offset(TPARM_STATE, static_vars);
+    show_TRACES(TPARM_STATE, tname);
+
+    printf("\n");
+    show_size(WINDOW);
+    show_WIDECH(WINDOW, _bkgrnd);
+    show_COLORS(WINDOW, _color);
+
+    printf("\n");
+    show_size(NCURSES_GLOBALS);
+    show_offset(NCURSES_GLOBALS, init_signals);
+    show_offset(NCURSES_GLOBALS, tgetent_cache);
+    show_offset(NCURSES_GLOBALS, dbd_vars);
+#if HAVE_TSEARCH
+    show_offset(NCURSES_GLOBALS, cached_tparm);
+#endif
+    show_DRIVER(NCURSES_GLOBALS, term_driver);
+    show_NORMAL(NCURSES_GLOBALS, _nc_windowlist);
+#if USE_HOME_TERMINFO
+    show_OPTION(NCURSES_GLOBALS, home_terminfo);
+#endif
+#if !USE_SAFE_SPRINTF
+    show_OPTION(NCURSES_GLOBALS, safeprint_rows);
+#endif
+    show_THREAD(NCURSES_GLOBALS, mutex_curses);
+#if USE_PTHREADS_EINTR
+    show_THREAD(NCURSES_GLOBALS, read_thread);
+#endif
+    show_WIDECH(NCURSES_GLOBALS, key_name);
+    show_TRACES(NCURSES_GLOBALS, trace_opened);
+    show_MLEAKS(NCURSES_GLOBALS, leak_checking);
+
+    printf("\n");
+    show_size(NCURSES_PRESCREEN);
+    show_offset(NCURSES_PRESCREEN, tparm_state);
+    show_offset(NCURSES_PRESCREEN, saved_tty);
+    show_offset(NCURSES_PRESCREEN, use_tioctl);
+    show_offset(NCURSES_PRESCREEN, _outch);
+#ifndef USE_SP_RIPOFF
+    show_NORMAL(NCURSES_PRESCREEN, rippedoff);
+#endif
+#if NCURSES_NO_PADDING
+    show_OPTION(NCURSES_PRESCREEN, _no_padding);
+#endif
+#if BROKEN_LINKER
+    show_offset(NCURSES_PRESCREEN, real_acs_map);
+#else
+    show_REENTR(NCURSES_PRESCREEN, real_acs_map);
+#endif
+#if BROKEN_LINKER || USE_REENTRANT
+    show_TRACES(NCURSES_PRESCREEN, _outchars);
+#endif
+
+    return EXIT_SUCCESS;
+}
diff --git a/ncurses/term.priv.h b/ncurses/term.priv.h
new file mode 100644
index 0000000..03669cb
--- /dev/null
+++ b/ncurses/term.priv.h
@@ -0,0 +1,335 @@
+/****************************************************************************
+ * Copyright 2021 Thomas E. Dickey                                          *
+ *                                                                          *
+ * 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: term.priv.h,v 1.7 2021/11/20 23:33:33 tom Exp $
+ *
+ *	term.priv.h
+ *
+ *	Header file for terminfo library objects which are private to
+ *	the library.
+ *
+ */
+
+#ifndef _TERM_PRIV_H
+#define _TERM_PRIV_H 1
+/* *INDENT-OFF* */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <ncurses_cfg.h>
+
+#undef NCURSES_OPAQUE
+#define NCURSES_INTERNALS 1
+#define NCURSES_OPAQUE 0
+
+#include <limits.h>		/* PATH_MAX */
+#include <signal.h>		/* sig_atomic_t */
+#include <time.h>		/* time_t */
+#include <term.h>		/* time_t */
+
+#ifdef USE_PTHREADS
+#if USE_REENTRANT
+#include <pthread.h>
+#endif
+#endif
+
+/*
+ * State of tparm().
+ */
+#define STACKSIZE 20
+
+typedef struct {
+	union {
+		int	num;
+		char *	str;
+	} data;
+	bool num_type;
+} STACK_FRAME;
+
+#define NUM_VARS 26
+
+typedef struct {
+	const char *	tparam_base;
+
+	STACK_FRAME	stack[STACKSIZE];
+	int		stack_ptr;
+
+	char *		out_buff;
+	size_t		out_size;
+	size_t		out_used;
+
+	char *		fmt_buff;
+	size_t		fmt_size;
+
+	int		static_vars[NUM_VARS];
+#ifdef TRACE
+	const char *	tname;
+#endif
+} TPARM_STATE;
+
+typedef struct {
+	char *		text;
+	size_t		size;
+} TRACEBUF;
+
+typedef struct {
+	const char *	name;
+	char *		value;
+} ITERATOR_VARS;
+
+/*
+ * Internals for term.h
+ */
+typedef struct term {			/* describe an actual terminal */
+	TERMTYPE	type;		/* terminal type description */
+	short		Filedes;	/* file description being written to */
+	TTY		Ottyb;		/* original state of the terminal */
+	TTY		Nttyb;		/* current state of the terminal */
+	int		_baudrate;	/* used to compute padding */
+	char *		_termname;	/* used for termname() */
+	TPARM_STATE	tparm_state;
+#if NCURSES_EXT_COLORS
+	TERMTYPE2	type2;		/* extended terminal type description */
+#endif
+#undef TERMINAL
+} TERMINAL;
+
+/*
+ * Internals for soft-keys
+ */
+typedef	struct {
+	WINDOW *	win;		/* the window used in the hook      */
+	int		line;		/* lines to take, < 0 => from bottom*/
+	int		(*hook)(WINDOW *, int); /* callback for user	    */
+} ripoff_t;
+
+/*
+ * Internals for tgetent
+ */
+typedef struct {
+	long		sequence;
+	bool		last_used;
+	char *		fix_sgr0;	/* this holds the filtered sgr0 string */
+	char *		last_bufp;	/* help with fix_sgr0 leak */
+	TERMINAL *	last_term;
+} TGETENT_CACHE;
+
+#define TGETENT_MAX 4
+
+#include <term_entry.h>		/* dbdLAST */
+
+#ifdef USE_TERM_DRIVER
+struct DriverTCB; /* Terminal Control Block forward declaration */
+#endif
+
+/*
+ * Global data which is not specific to a screen.
+ */
+typedef struct {
+	SIG_ATOMIC_T	have_sigtstp;
+	SIG_ATOMIC_T	have_sigwinch;
+	SIG_ATOMIC_T	cleanup_nested;
+
+	bool		init_signals;
+	bool		init_screen;
+
+	char *		comp_sourcename;
+	char *		comp_termtype;
+
+	bool		have_tic_directory;
+	bool		keep_tic_directory;
+	const char *	tic_directory;
+
+	char *		dbi_list;
+	int		dbi_size;
+
+	char *		first_name;
+	char **		keyname_table;
+	int		init_keyname;
+
+	int		slk_format;
+
+	int		getstr_limit;	/* getstr_limit based on POSIX LINE_MAX */
+
+	char *		safeprint_buf;
+	size_t		safeprint_used;
+
+	TGETENT_CACHE	tgetent_cache[TGETENT_MAX];
+	int		tgetent_index;
+	long		tgetent_sequence;
+	int		terminal_count;
+
+	char *		dbd_blob;	/* string-heap for dbd_list[] */
+	char **		dbd_list;	/* distinct places to look for data */
+	int		dbd_size;	/* length of dbd_list[] */
+	time_t		dbd_time;	/* cache last updated */
+	ITERATOR_VARS	dbd_vars[dbdLAST];
+
+#if HAVE_TSEARCH
+	void *		cached_tparm;
+	int		count_tparm;
+#endif /* HAVE_TSEARCH */
+
+#ifdef USE_TERM_DRIVER
+	int		(*term_driver)(struct DriverTCB*, const char*, int*);
+#endif
+
+#define WINDOWLIST struct _win_list
+
+#ifndef USE_SP_WINDOWLIST
+	WINDOWLIST *	_nc_windowlist;
+#define WindowList(sp)	_nc_globals._nc_windowlist
+#endif
+
+#if USE_HOME_TERMINFO
+	char *		home_terminfo;
+#endif
+
+#if !USE_SAFE_SPRINTF
+	int		safeprint_cols;
+	int		safeprint_rows;
+#endif
+
+#ifdef USE_PTHREADS
+	pthread_mutex_t	mutex_curses;
+	pthread_mutex_t	mutex_prescreen;
+	pthread_mutex_t	mutex_screen;
+	pthread_mutex_t	mutex_update;
+	pthread_mutex_t	mutex_tst_tracef;
+	pthread_mutex_t	mutex_tracef;
+	int		nested_tracef;
+	int		use_pthreads;
+#define _nc_use_pthreads	_nc_globals.use_pthreads
+#if USE_PTHREADS_EINTR
+	pthread_t	read_thread;	/* The reading thread */
+#endif
+#endif
+#if USE_WIDEC_SUPPORT
+	char		key_name[MB_LEN_MAX + 1];
+#endif
+
+#ifdef TRACE
+	bool		trace_opened;
+	char		trace_fname[PATH_MAX];
+	int		trace_level;
+	FILE *		trace_fp;
+	int		trace_fd;
+
+	char *		tracearg_buf;
+	size_t		tracearg_used;
+
+	TRACEBUF *	tracebuf_ptr;
+	size_t		tracebuf_used;
+
+	char		tracechr_buf[40];
+
+	char *		tracedmp_buf;
+	size_t		tracedmp_used;
+
+	unsigned char *	tracetry_buf;
+	size_t		tracetry_used;
+
+	char		traceatr_color_buf[2][80];
+	int		traceatr_color_sel;
+	int		traceatr_color_last;
+#if !defined(USE_PTHREADS) && USE_REENTRANT
+	int		nested_tracef;
+#endif
+#endif	/* TRACE */
+
+#if NO_LEAKS
+	bool		leak_checking;
+#endif
+} NCURSES_GLOBALS;
+
+extern NCURSES_EXPORT_VAR(NCURSES_GLOBALS) _nc_globals;
+
+#define N_RIPS 5
+
+#ifdef USE_PTHREADS
+typedef struct _prescreen_list {
+	struct _prescreen_list *next;
+	pthread_t	id;
+	struct screen *	sp;
+} PRESCREEN_LIST;
+#endif
+
+/*
+ * Global data which can be swept up into a SCREEN when one is created.
+ * It may be modified before the next SCREEN is created.
+ */
+typedef struct {
+#ifdef USE_PTHREADS
+	PRESCREEN_LIST *allocated;
+#else
+	struct screen * allocated;
+#endif
+	bool		use_env;
+	bool		filter_mode;
+	attr_t		previous_attr;
+	TPARM_STATE	tparm_state;
+	TTY *		saved_tty;	/* savetty/resetty information	  */
+	bool		use_tioctl;
+	NCURSES_SP_OUTC	_outch;		/* output handler if not putc */
+#ifndef USE_SP_RIPOFF
+	ripoff_t	rippedoff[N_RIPS];
+	ripoff_t *	rsp;
+#endif
+#if NCURSES_NO_PADDING
+	bool		_no_padding;	/* flag to set if padding disabled */
+#endif
+#if BROKEN_LINKER || USE_REENTRANT
+	chtype *	real_acs_map;
+	int		_LINES;
+	int		_COLS;
+	int		_TABSIZE;
+	int		_ESCDELAY;
+	TERMINAL *	_cur_term;
+#endif
+#ifdef TRACE
+#if BROKEN_LINKER || USE_REENTRANT
+	long		_outchars;
+	const char *	_tputs_trace;
+#endif
+#endif
+} NCURSES_PRESCREEN;
+
+extern NCURSES_EXPORT_VAR(NCURSES_PRESCREEN) _nc_prescreen;
+
+extern NCURSES_EXPORT(void) _nc_free_tparm(TERMINAL*);
+
+#ifdef __cplusplus
+}
+#endif
+
+/* *INDENT-ON* */
+
+#endif /* _TERM_PRIV_H */
diff --git a/ncurses/tinfo/MKcaptab.awk b/ncurses/tinfo/MKcaptab.awk
new file mode 100644
index 0000000..ee4e2e9
--- /dev/null
+++ b/ncurses/tinfo/MKcaptab.awk
@@ -0,0 +1,95 @@
+##############################################################################
+# Copyright 2020 Thomas E. Dickey                                            #
+# Copyright 1998-2006,2007 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: MKcaptab.awk,v 1.21 2020/02/02 23:34:34 tom Exp $
+function add_string(text) {
+    if (text != "IGNORE") {
+	offsets[num_strings] = offset;
+	offset = offset + length(text) + 1;
+	printf "%s\\0", text;
+    } else {
+	offsets[num_strings] = -1;
+    }
+    num_strings = num_strings + 1;
+    if ((num_strings % 3) == 0) {
+	printf "\\\n";
+    }
+    return offsets[num_strings - 1];
+}
+BEGIN {
+	first = 1;
+	num_aliases = 0;
+	num_strings = 0;
+	offset = 0;
+}
+
+/^[^#]/ {
+	    if (first) {
+		printf "/* generated by MKcaptab.awk %s(%d) */\n", tablename, bigstrings;
+		print ""
+		if (bigstrings) {
+		    printf "static struct alias *_nc_%s_table = 0;\n", tablename;
+		    print "";
+		    printf "static const char %s_text[] = \"\\\n", tablename;
+		} else {
+		    printf "static const struct alias _nc_%s_table[] =\n", tablename;
+		    printf "{\n";
+		}
+		first = 0;
+	    }
+	    if ($1 == tablename) {
+		if ($3 == "IGNORE") {
+		    to = "(char *)NULL";
+		} else {
+		    to = "\"" $3 "\"";
+		}
+		if (bigstrings) {
+		    c1 = add_string($2);
+		    c2 = add_string($3);
+		    c3 = add_string($4);
+		    aliases[num_aliases] = sprintf("\t{%5d, %5d, %5d},\t /* %s */", c1, c2, c3, $5);
+		    num_aliases = num_aliases + 1;
+		} else {
+		    printf "\t{\"%s\", %s, \"%s\"},\t /* %s */\n", $2, to, $4, $5;
+		}
+	    }
+	}
+END	{
+	    if (bigstrings) {
+		printf "\";\n\n";
+		printf "static const alias_table_data %s_data[] = {\n", tablename;
+		for (n = 0; n < num_aliases; ++n) {
+		    printf "%s\n", aliases[n];
+		}
+		printf "};\n\n";
+	    } else {
+		printf "\t{(char *)NULL, (char *)NULL, (char *)NULL}\n";
+		printf "};\n\n";
+	    }
+	}
+# vile:sw=4:
diff --git a/ncurses/tinfo/MKcaptab.sh b/ncurses/tinfo/MKcaptab.sh
new file mode 100644
index 0000000..c800023
--- /dev/null
+++ b/ncurses/tinfo/MKcaptab.sh
@@ -0,0 +1,237 @@
+#!/bin/sh
+##############################################################################
+# Copyright 2019,2020 Thomas E. Dickey                                       #
+# Copyright 2007-2010,2011 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: MKcaptab.sh,v 1.19 2020/02/02 23:34:34 tom Exp $
+
+if test $# != 0
+then
+	AWK="$1"; shift 1
+else
+	AWK=awk
+fi
+
+if test $# != 0
+then
+	OPT1="$1"; shift 1
+else
+	OPT1="-0"
+fi
+
+if test $# != 0
+then
+	OPT2="$1"; shift 1
+else
+	OPT2="tinfo/MKcaptab.awk"
+fi
+
+cat <<EOF
+/*
+ * generated by $0
+ */
+
+EOF
+
+cat <<'EOF'
+/*
+ *	comp_captab.c -- The names of the capabilities indexed via a hash
+ *		         table for the compiler.
+ *
+ */
+
+#include <curses.priv.h>
+#include <tic.h>
+#include <hashsize.h>
+
+/* *INDENT-OFF* */
+EOF
+
+cat "$@" |./make_hash 1 info $OPT1
+cat "$@" |./make_hash 3 cap  $OPT1
+
+cat "$@" |$AWK -f $OPT2 bigstrings=$OPT1 tablename=capalias
+
+cat "$@" |$AWK -f $OPT2 bigstrings=$OPT1 tablename=infoalias
+
+cat <<EOF
+/* *INDENT-ON* */
+
+#if $OPT1
+static void
+next_string(const char *strings, unsigned *offset)
+{
+    *offset += (unsigned) strlen(strings + *offset) + 1;
+}
+
+static const struct name_table_entry *
+_nc_build_names(struct name_table_entry **actual,
+		const name_table_data * source,
+		const char *strings)
+{
+    if (*actual == 0) {
+	*actual = typeCalloc(struct name_table_entry, CAPTABSIZE);
+	if (*actual != 0) {
+	    unsigned n;
+	    unsigned len = 0;
+	    for (n = 0; n < CAPTABSIZE; ++n) {
+		(*actual)[n].nte_name = strings + len;
+		(*actual)[n].nte_type = source[n].nte_type;
+		(*actual)[n].nte_index = source[n].nte_index;
+		(*actual)[n].nte_link = source[n].nte_link;
+		next_string(strings, &len);
+	    }
+	}
+    }
+    return *actual;
+}
+
+#define add_alias(field) \\
+	if (source[n].field >= 0) { \\
+		(*actual)[n].field = strings + source[n].field; \\
+	}
+
+static const struct alias *
+_nc_build_alias(struct alias **actual,
+		const alias_table_data * source,
+		const char *strings,
+		size_t tablesize)
+{
+    if (*actual == 0) {
+	*actual = typeCalloc(struct alias, tablesize + 1);
+	if (*actual != 0) {
+	    size_t n;
+	    for (n = 0; n < tablesize; ++n) {
+		add_alias(from);
+		add_alias(to);
+		add_alias(source);
+	    }
+	}
+    }
+    return *actual;
+}
+
+#define build_names(root) _nc_build_names(&_nc_##root##_table, \\
+					  root##_names_data, \\
+					  root##_names_text)
+#define build_alias(root) _nc_build_alias(&_nc_##root##alias_table, \\
+					  root##alias_data, \\
+					  root##alias_text, \\
+					  SIZEOF(root##alias_data))
+#else
+#define build_names(root) _nc_ ## root ## _table
+#define build_alias(root) _nc_ ## root ## alias_table
+#endif
+
+NCURSES_EXPORT(const struct name_table_entry *)
+_nc_get_table(bool termcap)
+{
+    return termcap ? build_names(cap) : build_names(info);
+}
+
+/* entrypoint used by tack 1.07 */
+NCURSES_EXPORT(const HashValue *)
+_nc_get_hash_table(bool termcap)
+{
+    return termcap ? _nc_cap_hash_table : _nc_info_hash_table;
+}
+
+NCURSES_EXPORT(const struct alias *)
+_nc_get_alias_table(bool termcap)
+{
+    return termcap ? build_alias(cap) : build_alias(info);
+}
+
+static HashValue
+info_hash(const char *string)
+{
+    long sum = 0;
+
+    DEBUG(9, ("hashing %s", string));
+    while (*string) {
+	sum += (long) (UChar(*string) + (UChar(*(string + 1)) << 8));
+	string++;
+    }
+
+    DEBUG(9, ("sum is %ld", sum));
+    return (HashValue) (sum % HASHTABSIZE);
+}
+
+#define TCAP_LEN 2		/* only 1- or 2-character names are used */
+
+static HashValue
+tcap_hash(const char *string)
+{
+    char temp[TCAP_LEN + 1];
+    int limit = 0;
+
+    while (*string) {
+	temp[limit++] = *string++;
+	if (limit >= TCAP_LEN)
+	    break;
+    }
+    temp[limit] = '\0';
+    return info_hash(temp);
+}
+
+static int
+compare_tcap_names(const char *a, const char *b)
+{
+    return !strncmp(a, b, (size_t) TCAP_LEN);
+}
+
+static int
+compare_info_names(const char *a, const char *b)
+{
+    return !strcmp(a, b);
+}
+
+static const HashData hash_data[2] =
+{
+    {HASHTABSIZE, _nc_info_hash_table, info_hash, compare_info_names},
+    {HASHTABSIZE, _nc_cap_hash_table, tcap_hash, compare_tcap_names}
+};
+
+NCURSES_EXPORT(const HashData *)
+_nc_get_hash_info(bool termcap)
+{
+    return &hash_data[(termcap != FALSE)];
+}
+
+#if NO_LEAKS
+NCURSES_EXPORT(void)
+_nc_comp_captab_leaks(void)
+{
+#if $OPT1
+    FreeIfNeeded(_nc_cap_table);
+    FreeIfNeeded(_nc_info_table);
+    FreeIfNeeded(_nc_capalias_table);
+    FreeIfNeeded(_nc_infoalias_table);
+#endif
+}
+#endif /* NO_LEAKS */
+EOF
diff --git a/ncurses/tinfo/MKcodes.awk b/ncurses/tinfo/MKcodes.awk
new file mode 100644
index 0000000..48f4800
--- /dev/null
+++ b/ncurses/tinfo/MKcodes.awk
@@ -0,0 +1,176 @@
+##############################################################################
+# Copyright 2019,2020 Thomas E. Dickey                                       #
+# Copyright 2007-2009,2010 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: MKcodes.awk,v 1.11 2020/02/02 23:34:34 tom Exp $
+function large_item(value) {
+	result = sprintf("%d,", offset);
+	offset = offset + length(value) + 1;
+	offcol = offcol + length(result) + 2;
+	if (offcol > 70) {
+		result = result "\n";
+		offcol = 0;
+	} else {
+		result = result " ";
+	}
+	bigstr = bigstr sprintf("\"%s\\0\" ", value);
+	bigcol = bigcol + length(value) + 5;
+	if (bigcol > 70) {
+		bigstr = bigstr "\\\n";
+		bigcol = 0;
+	}
+	return result;
+}
+
+function small_item(value) {
+	return sprintf("\t\t\"%s\",\n", value);
+}
+
+function print_strings(name,value) {
+	printf  "DCL(%s) = {\n", name
+	print  value
+	print  "\t\t(NCURSES_CONST char *)0,"
+	print  "};"
+	print  ""
+}
+
+function print_offsets(name,value) {
+	printf  "static const short _nc_offset_%s[] = {\n", name
+	printf "%s",  value
+	print  "};"
+	print  ""
+	printf "static NCURSES_CONST char ** ptr_%s = 0;\n", name
+	print  ""
+}
+
+BEGIN	{
+		print  "/* This file was generated by MKcodes.awk */"
+		print  ""
+		print  "#include <curses.priv.h>"
+		print  ""
+		print  "#define IT NCURSES_CONST char * const"
+		print  ""
+		offset = 0;
+		offcol = 0;
+		bigcol = 0;
+	}
+
+$1 ~ /^#/		{next;}
+$1 ~ /^(cap|info)alias/	{next;}
+
+$1 == "userdef"		{next;}
+$1 == "SKIPWARN"	{next;}
+
+$3 == "bool"	{
+			small_boolcodes = small_boolcodes small_item($4);
+			large_boolcodes = large_boolcodes large_item($4);
+		}
+
+$3 == "num"	{
+			small_numcodes = small_numcodes small_item($4);
+			large_numcodes = large_numcodes large_item($4);
+		}
+
+$3 == "str"	{
+			small_strcodes = small_strcodes small_item($4);
+			large_strcodes = large_strcodes large_item($4);
+		}
+
+END	{
+		print  ""
+		print  "#if BROKEN_LINKER || USE_REENTRANT"
+		print  ""
+		if (bigstrings) {
+			printf "static const char _nc_code_blob[] = \n"
+			printf "%s;\n", bigstr;
+			print_offsets("boolcodes", large_boolcodes);
+			print_offsets("numcodes", large_numcodes);
+			print_offsets("strcodes", large_strcodes);
+			print  ""
+			print  "static IT *"
+			print  "alloc_array(NCURSES_CONST char ***value, const short *offsets, unsigned size)"
+			print  "{"
+			print  "	if (*value == 0) {"
+			print  "		if ((*value = typeCalloc(NCURSES_CONST char *, size + 1)) != 0) {"
+			print  "			unsigned n;"
+			print  "			for (n = 0; n < size; ++n) {"
+			print  "				(*value)[n] = (NCURSES_CONST char *) _nc_code_blob + offsets[n];"
+			print  "			}"
+			print  "		}"
+			print  "	}"
+			print  "	return *value;"
+			print  "}"
+			print  ""
+			print  "#define FIX(it) NCURSES_IMPEXP IT * NCURSES_API NCURSES_PUBLIC_VAR(it)(void) { return alloc_array(&ptr_##it, _nc_offset_##it, SIZEOF(_nc_offset_##it)); }"
+		} else {
+			print  "#define DCL(it) static IT data##it[]"
+			print  ""
+			print_strings("boolcodes", small_boolcodes);
+			print_strings("numcodes", small_numcodes);
+			print_strings("strcodes", small_strcodes);
+			print  "#define FIX(it) NCURSES_IMPEXP IT * NCURSES_API NCURSES_PUBLIC_VAR(it)(void) { return data##it; }"
+		}
+		print  ""
+		print  "/* remove public definition which conflicts with FIX() */"
+		print  "#undef boolcodes"
+		print  "#undef numcodes"
+		print  "#undef strcodes"
+		print  ""
+		print  "/* add local definition */"
+		print  "FIX(boolcodes)"
+		print  "FIX(numcodes)"
+		print  "FIX(strcodes)"
+		print  ""
+		print  "/* restore the public definition */"
+		print  ""
+		print  "#define FREE_FIX(it) if (ptr_##it) { FreeAndNull(ptr_##it); }"
+		print  "#define boolcodes  NCURSES_PUBLIC_VAR(boolcodes())"
+		print  "#define numcodes   NCURSES_PUBLIC_VAR(numcodes())"
+		print  "#define strcodes   NCURSES_PUBLIC_VAR(strcodes())"
+		print  ""
+		print  "#if NO_LEAKS"
+		print  "NCURSES_EXPORT(void)"
+		print  "_nc_codes_leaks(void)"
+		print  "{"
+		if (bigstrings) {
+		print  "FREE_FIX(boolcodes)"
+		print  "FREE_FIX(numcodes)"
+		print  "FREE_FIX(strcodes)"
+		}
+		print  "}"
+		print  "#endif"
+		print  ""
+		print  "#else"
+		print  ""
+		print  "#define DCL(it) NCURSES_EXPORT_VAR(IT) it[]"
+		print  ""
+		print_strings("boolcodes", small_boolcodes);
+		print_strings("numcodes", small_numcodes);
+		print_strings("strcodes", small_strcodes);
+		print  ""
+		print  "#endif /* BROKEN_LINKER */"
+	}
diff --git a/ncurses/tinfo/MKfallback.sh b/ncurses/tinfo/MKfallback.sh
new file mode 100644
index 0000000..64c65f1
--- /dev/null
+++ b/ncurses/tinfo/MKfallback.sh
@@ -0,0 +1,170 @@
+#!/bin/sh
+##############################################################################
+# Copyright 2020 Thomas E. Dickey                                            #
+# Copyright 1998-2019,2020 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: MKfallback.sh,v 1.25 2020/08/16 15:58:44 tom Exp $
+#
+# MKfallback.sh -- create fallback table for entry reads
+#
+# This script generates source code for a custom version of read_entry.c
+# that (instead of reading capabilities for an argument terminal type
+# from an on-disk terminfo tree) tries to match the type with one of a
+# specified list of types generated in.
+#
+
+terminfo_dir=$1
+shift
+
+terminfo_src=$1
+shift
+
+tic_path=$1
+test -z "$tic_path" && tic_path=tic
+shift
+
+infocmp_path=$1
+test -z "$infocmp_path" && infocmp_path=infocmp
+shift
+
+case "$tic_path" in #(vi
+/*)
+	tic_head=`echo "$tic_path" | sed -e 's,/[^/]*$,,'`
+	PATH=$tic_head:$PATH
+	export PATH
+	;;
+esac
+
+if test $# != 0 ; then
+	tmp_info=tmp_info
+	echo creating temporary terminfo directory... >&2
+
+	TERMINFO=`pwd`/$tmp_info
+	export TERMINFO
+
+	TERMINFO_DIRS=$TERMINFO:$terminfo_dir
+	export TERMINFO_DIRS
+
+	"$tic_path" -x "$terminfo_src" >&2
+else
+	tmp_info=
+fi
+
+cat <<EOF
+/* This file was generated by $0 */
+
+/*
+ * DO NOT EDIT THIS FILE BY HAND!
+ */
+
+#include <curses.priv.h>
+
+EOF
+
+if [ "$*" ]
+then
+	cat <<EOF
+#include <tic.h>
+
+/* fallback entries for: $* */
+EOF
+	for x in "$@"
+	do
+		echo "/* $x */"
+		"$infocmp_path" -E "$x" | sed -e 's/\<short\>/NCURSES_INT2/g'
+	done
+
+	cat <<EOF
+static const TERMTYPE2 fallbacks[$#] =
+{
+EOF
+	comma=""
+	for x in "$@"
+	do
+		echo "$comma /* $x */"
+		"$infocmp_path" -e "$x"
+		comma=","
+	done
+
+	cat <<EOF
+};
+
+EOF
+fi
+
+cat <<EOF
+NCURSES_EXPORT(const TERMTYPE2 *)
+_nc_fallback2 (const char *name GCC_UNUSED)
+{
+EOF
+
+if [ "$*" ]
+then
+	cat <<EOF
+    const TERMTYPE2	*tp;
+
+    for (tp = fallbacks;
+	 tp < fallbacks + sizeof(fallbacks)/sizeof(TERMTYPE2);
+	 tp++) {
+	if (_nc_name_match(tp->term_names, name, "|")) {
+	    return(tp);
+	}
+    }
+EOF
+else
+	echo "	/* the fallback list is empty */";
+fi
+
+cat <<EOF
+    return((const TERMTYPE2 *)0);
+}
+
+#if NCURSES_EXT_NUMBERS
+#undef _nc_fallback
+
+/*
+ * This entrypoint is used by tack 1.07
+ */
+NCURSES_EXPORT(const TERMTYPE *)
+_nc_fallback (const char *name)
+{
+    const TERMTYPE2 *tp = _nc_fallback2(name);
+    const TERMTYPE *result = 0;
+    if (tp != 0) {
+	static TERMTYPE temp;
+	_nc_export_termtype2(&temp, tp);
+	result = &temp;
+    }
+    return result;
+}
+#endif
+EOF
+
+if test -n "$tmp_info" ; then
+	echo removing temporary terminfo directory... >&2
+	rm -rf $tmp_info
+fi
diff --git a/ncurses/tinfo/MKkeys_list.sh b/ncurses/tinfo/MKkeys_list.sh
new file mode 100755
index 0000000..0facfbb
--- /dev/null
+++ b/ncurses/tinfo/MKkeys_list.sh
@@ -0,0 +1,70 @@
+#! /bin/sh
+# $Id: MKkeys_list.sh,v 1.8 2022/02/05 20:40:20 tom Exp $
+##############################################################################
+# Copyright 2019-2020,2022 Thomas E. Dickey                                  #
+# Copyright 2001-2003,2017 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.                                                             #
+##############################################################################
+#
+# MKkey_defs.sh -- generate list of function-keys for terminfo database
+#
+# Author: Thomas E. Dickey 2001
+#
+# Extract function-key names from the Caps file
+#
+: ${AWK-awk}
+if test $# != 0
+then
+	DATA="$*"
+else
+	DATA=../../include/Caps
+fi
+
+data=data$$
+trap 'rm -f $data; exit 1' 1 2 3 15
+trap 'rm -f $data' 0
+cat $DATA | sed -e 's/[	][	]*/	/g' >$data
+
+cat <<EOF
+# These definitions were generated by $0 $DATA
+KEY_BREAK
+KEY_SRESET
+KEY_RESET
+KEY_RESIZE
+EOF
+
+${AWK-awk} <$data '
+/^#/		{next;}
+/^capalias/	{next;}
+/^infoalias/	{next;}
+/^userdef/	{next;}
+
+$5 != "-" {
+		if (substr($5, 1, 4) == "KEY_" ) {
+			printf "%s	%s\n", $5, $1
+	}
+}
+'
diff --git a/ncurses/tinfo/MKnames.awk b/ncurses/tinfo/MKnames.awk
new file mode 100644
index 0000000..4594c72
--- /dev/null
+++ b/ncurses/tinfo/MKnames.awk
@@ -0,0 +1,203 @@
+##############################################################################
+# Copyright 2019,2020 Thomas E. Dickey                                       #
+# Copyright 1998-2008,2009 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: MKnames.awk,v 1.24 2020/02/02 23:34:34 tom Exp $
+function large_item(value) {
+	result = sprintf("%d,", offset);
+	offset = offset + length(value) + 1;
+	offcol = offcol + length(result) + 2;
+	if (offcol > 70) {
+		result = result "\n";
+		offcol = 0;
+	} else {
+		result = result " ";
+	}
+	bigstr = bigstr sprintf("\"%s\\0\" ", value);
+	bigcol = bigcol + length(value) + 5;
+	if (bigcol > 70) {
+		bigstr = bigstr "\\\n";
+		bigcol = 0;
+	}
+	return result;
+}
+
+function small_item(value) {
+	return sprintf("\t\t\"%s\",\n", value);
+}
+
+function print_strings(name,value) {
+	printf  "DCL(%s) = {\n", name
+	print  value
+	print  "\t\t(NCURSES_CONST char *)0,"
+	print  "};"
+	print  ""
+}
+
+function print_offsets(name,value) {
+	printf  "static const short _nc_offset_%s[] = {\n", name
+	printf "%s",  value
+	print  "};"
+	print  ""
+	printf "static NCURSES_CONST char ** ptr_%s = 0;\n", name
+	print  ""
+}
+
+BEGIN	{
+		print  "/* This file was generated by MKnames.awk */"
+		print  ""
+		print  "#include <curses.priv.h>"
+		print  ""
+		print  "#define IT NCURSES_CONST char * const"
+		print  ""
+		offset = 0;
+		offcol = 0;
+		bigcol = 0;
+	}
+
+$1 ~ /^#/		{next;}
+$1 ~ /^(cap|info)alias/	{next;}
+
+$1 == "userdef"		{next;}
+$1 == "SKIPWARN"	{next;}
+
+$3 == "bool"	{
+			small_boolnames = small_boolnames small_item($2);
+			large_boolnames = large_boolnames large_item($2);
+			small_boolfnames = small_boolfnames small_item($1);
+			large_boolfnames = large_boolfnames large_item($1);
+		}
+
+$3 == "num"	{
+			small_numnames = small_numnames small_item($2);
+			large_numnames = large_numnames large_item($2);
+			small_numfnames = small_numfnames small_item($1);
+			large_numfnames = large_numfnames large_item($1);
+		}
+
+$3 == "str"	{
+			small_strnames = small_strnames small_item($2);
+			large_strnames = large_strnames large_item($2);
+			small_strfnames = small_strfnames small_item($1);
+			large_strfnames = large_strfnames large_item($1);
+		}
+
+END	{
+		print  ""
+		print  "#if BROKEN_LINKER || USE_REENTRANT"
+		print  ""
+		if (bigstrings) {
+			printf "static const char _nc_name_blob[] = \n"
+			printf "%s;\n", bigstr;
+			print_offsets("boolfnames", large_boolfnames);
+			print_offsets("boolnames", large_boolnames);
+			print_offsets("numfnames", large_numfnames);
+			print_offsets("numnames", large_numnames);
+			print_offsets("strfnames", large_strfnames);
+			print_offsets("strnames", large_strnames);
+			print  ""
+			print  "static IT *"
+			print  "alloc_array(NCURSES_CONST char ***value, const short *offsets, unsigned size)"
+			print  "{"
+			print  "	if (*value == 0) {"
+			print  "		if ((*value = typeCalloc(NCURSES_CONST char *, size + 1)) != 0) {"
+			print  "			unsigned n;"
+			print  "			for (n = 0; n < size; ++n) {"
+			print  "				(*value)[n] = (NCURSES_CONST char *) _nc_name_blob + offsets[n];"
+			print  "			}"
+			print  "		}"
+			print  "	}"
+			print  "	return *value;"
+			print  "}"
+			print  ""
+			print  "#define FIX(it) NCURSES_IMPEXP IT * NCURSES_API NCURSES_PUBLIC_VAR(it)(void) { return alloc_array(&ptr_##it, _nc_offset_##it, SIZEOF(_nc_offset_##it)); }"
+		} else {
+			print  "#define DCL(it) static IT data##it[]"
+			print  ""
+			print_strings("boolnames", small_boolnames);
+			print_strings("boolfnames", small_boolfnames);
+			print_strings("numnames", small_numnames);
+			print_strings("numfnames", small_numfnames);
+			print_strings("strnames", small_strnames);
+			print_strings("strfnames", small_strfnames);
+			print  "#define FIX(it) NCURSES_IMPEXP IT * NCURSES_API NCURSES_PUBLIC_VAR(it)(void) { return data##it; }"
+		}
+		print  ""
+		print  "/* remove public definition which conflicts with FIX() */"
+		print  "#undef boolnames"
+		print  "#undef boolfnames"
+		print  "#undef numnames"
+		print  "#undef numfnames"
+		print  "#undef strnames"
+		print  "#undef strfnames"
+		print  ""
+		print  "/* add local definition */"
+		print  "FIX(boolnames)"
+		print  "FIX(boolfnames)"
+		print  "FIX(numnames)"
+		print  "FIX(numfnames)"
+		print  "FIX(strnames)"
+		print  "FIX(strfnames)"
+		print  ""
+		print  "/* restore the public definition */"
+		print  "#define boolnames  NCURSES_PUBLIC_VAR(boolnames())"
+		print  "#define boolfnames NCURSES_PUBLIC_VAR(boolfnames())"
+		print  "#define numnames   NCURSES_PUBLIC_VAR(numnames())"
+		print  "#define numfnames  NCURSES_PUBLIC_VAR(numfnames())"
+		print  "#define strnames   NCURSES_PUBLIC_VAR(strnames())"
+		print  "#define strfnames  NCURSES_PUBLIC_VAR(strfnames())"
+		print  ""
+		print  "#define FREE_FIX(it) if (ptr_##it) { FreeAndNull(ptr_##it); }"
+		print  ""
+		print  "#if NO_LEAKS"
+		print  "NCURSES_EXPORT(void)"
+		print  "_nc_names_leaks(void)"
+		print  "{"
+		if (bigstrings) {
+		print  "FREE_FIX(boolnames)"
+		print  "FREE_FIX(boolfnames)"
+		print  "FREE_FIX(numnames)"
+		print  "FREE_FIX(numfnames)"
+		print  "FREE_FIX(strnames)"
+		print  "FREE_FIX(strfnames)"
+		}
+		print  "}"
+		print  "#endif"
+		print  ""
+		print  "#else"
+		print  ""
+		print  "#define DCL(it) NCURSES_EXPORT_VAR(IT) it[]"
+		print  ""
+		print_strings("boolnames", small_boolnames);
+		print_strings("boolfnames", small_boolfnames);
+		print_strings("numnames", small_numnames);
+		print_strings("numfnames", small_numfnames);
+		print_strings("strnames", small_strnames);
+		print_strings("strfnames", small_strfnames);
+		print  ""
+		print  "#endif /* BROKEN_LINKER */"
+	}
diff --git a/ncurses/tinfo/MKuserdefs.sh b/ncurses/tinfo/MKuserdefs.sh
new file mode 100644
index 0000000..109dd64
--- /dev/null
+++ b/ncurses/tinfo/MKuserdefs.sh
@@ -0,0 +1,146 @@
+#!/bin/sh
+##############################################################################
+# Copyright 2019,2020 Thomas E. Dickey                                       #
+#                                                                            #
+# 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: MKuserdefs.sh,v 1.10 2020/02/02 23:34:34 tom Exp $
+AWK=${1-awk}; shift 1
+OPT1=${1-0}; shift 1
+
+cat <<EOF
+/*
+ * generated by $0
+ */
+
+EOF
+
+cat <<'EOF'
+/*
+ *    comp_userdefs.c -- The names of widely used user-defined capabilities
+ *                       indexed via a hash table for the compiler.
+ *
+ */
+
+#include <curses.priv.h>
+#include <tic.h>
+#include <hashsize.h>
+
+#if NCURSES_XNAMES
+EOF
+
+cat "$@" | ./make_hash 1 user $OPT1
+
+cat <<EOF
+
+#define USERTABSIZE SIZEOF(user_names_data)
+
+#if $OPT1
+static void
+next_string(const char *strings, unsigned *offset)
+{
+    *offset += (unsigned) strlen(strings + *offset) + 1;
+}
+
+static const struct user_table_entry *
+_nc_build_names(struct user_table_entry **actual,
+		const user_table_data *source,
+		const char *strings)
+{
+    if (*actual == 0) {
+	*actual = typeCalloc(struct user_table_entry, USERTABSIZE);
+	if (*actual != 0) {
+	    unsigned n;
+	    unsigned len = 0;
+	    for (n = 0; n < USERTABSIZE; ++n) {
+		(*actual)[n].ute_name = strings + len;
+		(*actual)[n].ute_type = (int) source[n].ute_type;
+		(*actual)[n].ute_argc = source[n].ute_argc;
+		(*actual)[n].ute_args = source[n].ute_args;
+		(*actual)[n].ute_index = source[n].ute_index;
+		(*actual)[n].ute_link = source[n].ute_link;
+		next_string(strings, &len);
+	    }
+	}
+    }
+    return *actual;
+}
+
+#define build_names(root) _nc_build_names(&_nc_##root##_table, \\
+					  root##_names_data, \\
+					  root##_names_text)
+#else
+#define build_names(root) _nc_ ## root ## _table
+#endif
+
+NCURSES_EXPORT(const struct user_table_entry *) _nc_get_userdefs_table (void)
+{
+    return build_names(user) ;
+}
+
+static HashValue
+info_hash(const char *string)
+{
+    long sum = 0;
+
+    DEBUG(9, ("hashing %s", string));
+    while (*string) {
+	sum += (long) (*string + (*(string + 1) << 8));
+	string++;
+    }
+
+    DEBUG(9, ("sum is %ld", sum));
+    return (HashValue) (sum % HASHTABSIZE);
+}
+
+static int
+compare_info_names(const char *a, const char *b)
+{
+    return !strcmp(a, b);
+}
+
+static const HashData hash_data[] = {
+    { HASHTABSIZE, _nc_user_hash_table, info_hash, compare_info_names }
+};
+
+NCURSES_EXPORT(const HashData *) _nc_get_hash_user (void)
+{
+    return hash_data;
+}
+
+#if NO_LEAKS
+NCURSES_EXPORT(void) _nc_comp_userdefs_leaks(void)
+{
+#if $OPT1
+    FreeIfNeeded(_nc_user_table);
+#endif
+}
+#endif /* NO_LEAKS */
+
+#else /*! NCURSES_XNAMES */
+NCURSES_EXPORT(void) _nc_comp_userdefs(void);
+NCURSES_EXPORT(void) _nc_comp_userdefs(void) { }
+#endif /* NCURSES_XNAMES */
+EOF
diff --git a/ncurses/tinfo/README b/ncurses/tinfo/README
new file mode 100644
index 0000000..6157ba1
--- /dev/null
+++ b/ncurses/tinfo/README
@@ -0,0 +1,37 @@
+-------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                           --
+-- Copyright 1998,2006 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: README,v 1.3 2020/02/02 23:34:34 tom Exp $
+-------------------------------------------------------------------------------
+
+The files in this directory (tinfo) are those that support the terminfo
+database and interfaces for ncurses.  The terminfo library can be built
+separately, as a lower-level library for ncurses, but usually is bundled.
+
+In addition to the standard documented interfaces, ncurses uses internal
+functions which reside in tinfo to satisfy linkage requirements.
diff --git a/ncurses/tinfo/access.c b/ncurses/tinfo/access.c
new file mode 100644
index 0000000..a735db2
--- /dev/null
+++ b/ncurses/tinfo/access.c
@@ -0,0 +1,260 @@
+/****************************************************************************
+ * Copyright 2019-2020,2021 Thomas E. Dickey                                *
+ * Copyright 1998-2011,2012 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                                                *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+
+#include <ctype.h>
+
+#ifndef USE_ROOT_ACCESS
+#if HAVE_SETFSUID
+#include <sys/fsuid.h>
+#else
+#include <sys/stat.h>
+#endif
+#endif
+
+#include <tic.h>
+
+MODULE_ID("$Id: access.c,v 1.31 2021/08/29 10:35:17 tom Exp $")
+
+#define LOWERCASE(c) ((isalpha(UChar(c)) && isupper(UChar(c))) ? tolower(UChar(c)) : (c))
+
+#ifdef _NC_MSC
+# define ACCESS(FN, MODE) access((FN), (MODE)&(R_OK|W_OK))
+#else
+# define ACCESS access
+#endif
+
+NCURSES_EXPORT(char *)
+_nc_rootname(char *path)
+{
+    char *result = _nc_basename(path);
+#if !MIXEDCASE_FILENAMES || defined(PROG_EXT)
+    static char *temp;
+    char *s;
+
+    temp = strdup(result);
+    result = temp;
+#if !MIXEDCASE_FILENAMES
+    for (s = result; *s != '\0'; ++s) {
+	*s = (char) LOWERCASE(*s);
+    }
+#endif
+#if defined(PROG_EXT)
+    if ((s = strrchr(result, '.')) != 0) {
+	if (!strcmp(s, PROG_EXT))
+	    *s = '\0';
+    }
+#endif
+#endif
+    return result;
+}
+
+/*
+ * Check if a string appears to be an absolute pathname.
+ */
+NCURSES_EXPORT(bool)
+_nc_is_abs_path(const char *path)
+{
+#if defined(__EMX__) || defined(__DJGPP__)
+#define is_pathname(s) ((((s) != 0) && ((s)[0] == '/')) \
+		  || (((s)[0] != 0) && ((s)[1] == ':')))
+#else
+#define is_pathname(s) ((s) != 0 && (s)[0] == '/')
+#endif
+    return is_pathname(path);
+}
+
+/*
+ * Return index of the basename
+ */
+NCURSES_EXPORT(unsigned)
+_nc_pathlast(const char *path)
+{
+    const char *test = strrchr(path, '/');
+#ifdef __EMX__
+    if (test == 0)
+	test = strrchr(path, '\\');
+#endif
+    if (test == 0)
+	test = path;
+    else
+	test++;
+    return (unsigned) (test - path);
+}
+
+NCURSES_EXPORT(char *)
+_nc_basename(char *path)
+{
+    return path + _nc_pathlast(path);
+}
+
+NCURSES_EXPORT(int)
+_nc_access(const char *path, int mode)
+{
+    int result;
+
+    if (path == 0) {
+	result = -1;
+    } else if (ACCESS(path, mode) < 0) {
+	if ((mode & W_OK) != 0
+	    && errno == ENOENT
+	    && strlen(path) < PATH_MAX) {
+	    char head[PATH_MAX];
+	    char *leaf;
+
+	    _nc_STRCPY(head, path, sizeof(head));
+	    leaf = _nc_basename(head);
+	    if (leaf == 0)
+		leaf = head;
+	    *leaf = '\0';
+	    if (head == leaf)
+		_nc_STRCPY(head, ".", sizeof(head));
+
+	    result = ACCESS(head, R_OK | W_OK | X_OK);
+	} else {
+	    result = -1;
+	}
+    } else {
+	result = 0;
+    }
+    return result;
+}
+
+NCURSES_EXPORT(bool)
+_nc_is_dir_path(const char *path)
+{
+    bool result = FALSE;
+    struct stat sb;
+
+    if (stat(path, &sb) == 0
+	&& S_ISDIR(sb.st_mode)) {
+	result = TRUE;
+    }
+    return result;
+}
+
+NCURSES_EXPORT(bool)
+_nc_is_file_path(const char *path)
+{
+    bool result = FALSE;
+    struct stat sb;
+
+    if (stat(path, &sb) == 0
+	&& S_ISREG(sb.st_mode)) {
+	result = TRUE;
+    }
+    return result;
+}
+
+#if HAVE_ISSETUGID
+#define is_elevated() issetugid()
+#elif HAVE_GETEUID && HAVE_GETEGID
+#define is_elevated() \
+	(getuid() != geteuid() \
+	 || getgid() != getegid())
+#else
+#define is_elevated() FALSE
+#endif
+
+#if HAVE_SETFSUID
+#define lower_privileges() \
+	    int save_err = errno; \
+	    setfsuid(getuid()); \
+	    setfsgid(getgid()); \
+	    errno = save_err
+#define resume_elevation() \
+	    save_err = errno; \
+	    setfsuid(geteuid()); \
+	    setfsgid(getegid()); \
+	    errno = save_err
+#else
+#define lower_privileges()	/* nothing */
+#define resume_elevation()	/* nothing */
+#endif
+
+#ifndef USE_ROOT_ENVIRON
+/*
+ * Returns true if we allow application to use environment variables that are
+ * used for searching lists of directories, etc.
+ */
+NCURSES_EXPORT(int)
+_nc_env_access(void)
+{
+    int result = TRUE;
+
+    if (is_elevated()) {
+	result = FALSE;
+    } else if ((getuid() == ROOT_UID) || (geteuid() == ROOT_UID)) {
+	result = FALSE;
+    }
+    return result;
+}
+#endif /* USE_ROOT_ENVIRON */
+
+#ifndef USE_ROOT_ACCESS
+/*
+ * Limit privileges if possible; otherwise disallow access for updating files.
+ */
+NCURSES_EXPORT(FILE *)
+_nc_safe_fopen(const char *path, const char *mode)
+{
+    FILE *result = NULL;
+#if HAVE_SETFSUID
+    lower_privileges();
+    result = fopen(path, mode);
+    resume_elevation();
+#else
+    if (!is_elevated() || *mode == 'r') {
+	result = fopen(path, mode);
+    }
+#endif
+    return result;
+}
+
+NCURSES_EXPORT(int)
+_nc_safe_open3(const char *path, int flags, mode_t mode)
+{
+    int result = -1;
+#if HAVE_SETFSUID
+    lower_privileges();
+    result = open(path, flags, mode);
+    resume_elevation();
+#else
+    if (!is_elevated() || (flags & O_RDONLY)) {
+	result = open(path, flags, mode);
+    }
+#endif
+    return result;
+}
+#endif /* USE_ROOT_ENVIRON */
diff --git a/ncurses/tinfo/add_tries.c b/ncurses/tinfo/add_tries.c
new file mode 100644
index 0000000..d41f488
--- /dev/null
+++ b/ncurses/tinfo/add_tries.c
@@ -0,0 +1,123 @@
+/****************************************************************************
+ * Copyright 2019,2020 Thomas E. Dickey                                     *
+ * Copyright 1998-2009,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey            1998-on                             *
+ ****************************************************************************/
+
+/*
+**	add_tries.c
+**
+**	Add keycode/string to tries-tree.
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: add_tries.c,v 1.12 2020/02/02 23:34:34 tom Exp $")
+
+#define SET_TRY(dst,src) if ((dst->ch = *src++) == 128) dst->ch = '\0'
+#define CMP_TRY(a,b) ((a)? (a == b) : (b == 128))
+
+NCURSES_EXPORT(int)
+_nc_add_to_try(TRIES ** tree, const char *str, unsigned code)
+{
+    TRIES *ptr, *savedptr;
+    unsigned const char *txt = (unsigned const char *) str;
+
+    T((T_CALLED("_nc_add_to_try(%p, %s, %u)"),
+       (void *) *tree, _nc_visbuf(str), code));
+    if (txt == 0 || *txt == '\0' || code == 0)
+	returnCode(ERR);
+
+    if ((*tree) != 0) {
+	ptr = savedptr = (*tree);
+
+	for (;;) {
+	    unsigned char cmp = *txt;
+
+	    while (!CMP_TRY(ptr->ch, cmp)
+		   && ptr->sibling != 0)
+		ptr = ptr->sibling;
+
+	    if (CMP_TRY(ptr->ch, cmp)) {
+		if (*(++txt) == '\0') {
+		    ptr->value = (unsigned short) code;
+		    returnCode(OK);
+		}
+		if (ptr->child != 0)
+		    ptr = ptr->child;
+		else
+		    break;
+	    } else {
+		if ((ptr->sibling = typeCalloc(TRIES, 1)) == 0) {
+		    returnCode(ERR);
+		}
+
+		savedptr = ptr = ptr->sibling;
+		SET_TRY(ptr, txt);
+		ptr->value = 0;
+
+		break;
+	    }
+	}			/* end for (;;) */
+    } else {			/* (*tree) == 0 :: First sequence to be added */
+	savedptr = ptr = (*tree) = typeCalloc(TRIES, 1);
+
+	if (ptr == 0) {
+	    returnCode(ERR);
+	}
+
+	SET_TRY(ptr, txt);
+	ptr->value = 0;
+    }
+
+    /* at this point, we are adding to the try.  ptr->child == 0 */
+
+    while (*txt) {
+	ptr->child = typeCalloc(TRIES, 1);
+
+	ptr = ptr->child;
+
+	if (ptr == 0) {
+	    while ((ptr = savedptr) != 0) {
+		savedptr = ptr->child;
+		free(ptr);
+	    }
+	    *tree = NULL;
+	    returnCode(ERR);
+	}
+
+	SET_TRY(ptr, txt);
+	ptr->value = 0;
+    }
+
+    ptr->value = (unsigned short) code;
+    returnCode(OK);
+}
diff --git a/ncurses/tinfo/alloc_entry.c b/ncurses/tinfo/alloc_entry.c
new file mode 100644
index 0000000..d5148ca
--- /dev/null
+++ b/ncurses/tinfo/alloc_entry.c
@@ -0,0 +1,405 @@
+/****************************************************************************
+ * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2013,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ ****************************************************************************/
+
+/*
+ * alloc_entry.c -- allocation functions for terminfo entries
+ *
+ *	_nc_copy_entry()
+ *	_nc_init_entry()
+ *	_nc_merge_entry()
+ *	_nc_save_str()
+ *	_nc_wrap_entry()
+ *
+ */
+
+#include <curses.priv.h>
+
+#include <tic.h>
+
+MODULE_ID("$Id: alloc_entry.c,v 1.77 2022/10/15 19:37:33 tom Exp $")
+
+#define ABSENT_OFFSET    -1
+#define CANCELLED_OFFSET -2
+
+static char *stringbuf;		/* buffer for string capabilities */
+static size_t next_free;	/* next free character in stringbuf */
+
+NCURSES_EXPORT(void)
+_nc_init_entry(ENTRY * const tp)
+/* initialize a terminal type data block */
+{
+    DEBUG(2, (T_CALLED("_nc_init_entry(tp=%p)"), (void *) tp));
+
+    if (tp == NULL) {
+#if NO_LEAKS
+	if (stringbuf != NULL) {
+	    FreeAndNull(stringbuf);
+	}
+	return;
+#else
+	_nc_err_abort("_nc_init_entry called without initialization");
+#endif
+    }
+
+    if (stringbuf == NULL)
+	TYPE_CALLOC(char, (size_t) MAX_ENTRY_SIZE, stringbuf);
+
+    next_free = 0;
+
+    _nc_init_termtype(&(tp->tterm));
+
+    DEBUG(2, (T_RETURN("")));
+}
+
+NCURSES_EXPORT(ENTRY *)
+_nc_copy_entry(ENTRY * oldp)
+{
+    ENTRY *newp;
+
+    DEBUG(2, (T_CALLED("_nc_copy_entry(oldp=%p)"), (void *) oldp));
+
+    newp = typeCalloc(ENTRY, 1);
+    if (newp != NULL) {
+	*newp = *oldp;
+	_nc_copy_termtype2(&(newp->tterm), &(oldp->tterm));
+    }
+
+    DEBUG(2, (T_RETURN("%p"), (void *) newp));
+    return (newp);
+}
+
+/* save a copy of string in the string buffer */
+NCURSES_EXPORT(char *)
+_nc_save_str(const char *string)
+{
+    char *result = 0;
+    size_t old_next_free = next_free;
+
+    if (stringbuf != NULL) {
+	size_t len;
+
+	if (!VALID_STRING(string))
+	    string = "";
+	len = strlen(string) + 1;
+
+	if (len == 1 && next_free != 0) {
+	    /*
+	     * Cheat a little by making an empty string point to the end of the
+	     * previous string.
+	     */
+	    if (next_free < MAX_ENTRY_SIZE) {
+		result = (stringbuf + next_free - 1);
+	    }
+	} else if (next_free + len < MAX_ENTRY_SIZE) {
+	    _nc_STRCPY(&stringbuf[next_free], string, MAX_ENTRY_SIZE);
+	    DEBUG(7, ("Saved string %s", _nc_visbuf(string)));
+	    DEBUG(7, ("at location %d", (int) next_free));
+	    next_free += len;
+	    result = (stringbuf + old_next_free);
+	} else {
+	    _nc_warning("Too much data, some is lost: %s", string);
+	}
+    }
+    return result;
+}
+
+NCURSES_EXPORT(void)
+_nc_wrap_entry(ENTRY * const ep, bool copy_strings)
+/* copy the string parts to allocated storage, preserving pointers to it */
+{
+    int offsets[MAX_ENTRY_SIZE / sizeof(short)];
+    int useoffsets[MAX_USES];
+    unsigned i, n;
+    unsigned nuses;
+    TERMTYPE2 *tp;
+
+    DEBUG(2, (T_CALLED("_nc_wrap_entry(ep=%p, copy_strings=%d)"), (void *)
+	      ep, copy_strings));
+    if (ep == NULL || stringbuf == NULL)
+	_nc_err_abort("_nc_wrap_entry called without initialization");
+
+    nuses = ep->nuses;
+    tp = &(ep->tterm);
+    if (copy_strings) {
+	next_free = 0;		/* clear static storage */
+
+	/* copy term_names, Strings, uses */
+	tp->term_names = _nc_save_str(tp->term_names);
+	for_each_string(i, tp) {
+	    if (tp->Strings[i] != ABSENT_STRING &&
+		tp->Strings[i] != CANCELLED_STRING) {
+		tp->Strings[i] = _nc_save_str(tp->Strings[i]);
+	    }
+	}
+
+	for (i = 0; i < nuses; i++) {
+	    if (ep->uses[i].name == 0) {
+		ep->uses[i].name = _nc_save_str(ep->uses[i].name);
+	    }
+	}
+
+	free(tp->str_table);
+    }
+
+    assert(tp->term_names >= stringbuf);
+    n = (unsigned) (tp->term_names - stringbuf);
+    for_each_string(i, &(ep->tterm)) {
+	if (i < SIZEOF(offsets)) {
+	    if (tp->Strings[i] == ABSENT_STRING) {
+		offsets[i] = ABSENT_OFFSET;
+	    } else if (tp->Strings[i] == CANCELLED_STRING) {
+		offsets[i] = CANCELLED_OFFSET;
+	    } else {
+		offsets[i] = (int) (tp->Strings[i] - stringbuf);
+	    }
+	}
+    }
+
+    for (i = 0; i < nuses; i++) {
+	if (ep->uses[i].name == 0)
+	    useoffsets[i] = ABSENT_OFFSET;
+	else
+	    useoffsets[i] = (int) (ep->uses[i].name - stringbuf);
+    }
+
+    TYPE_MALLOC(char, next_free, tp->str_table);
+    (void) memcpy(tp->str_table, stringbuf, next_free);
+
+    tp->term_names = tp->str_table + n;
+    for_each_string(i, &(ep->tterm)) {
+	if (i < SIZEOF(offsets)) {
+	    if (offsets[i] == ABSENT_OFFSET) {
+		tp->Strings[i] = ABSENT_STRING;
+	    } else if (offsets[i] == CANCELLED_OFFSET) {
+		tp->Strings[i] = CANCELLED_STRING;
+	    } else {
+		tp->Strings[i] = tp->str_table + offsets[i];
+	    }
+	}
+    }
+
+#if NCURSES_XNAMES
+    if (!copy_strings) {
+	if ((n = (unsigned) NUM_EXT_NAMES(tp)) != 0) {
+	    if (n < SIZEOF(offsets)) {
+		size_t length = 0;
+		size_t offset;
+		for (i = 0; i < n; i++) {
+		    length += strlen(tp->ext_Names[i]) + 1;
+		    offsets[i] = (int) (tp->ext_Names[i] - stringbuf);
+		}
+		TYPE_MALLOC(char, length, tp->ext_str_table);
+		for (i = 0, offset = 0; i < n; i++) {
+		    tp->ext_Names[i] = tp->ext_str_table + offset;
+		    _nc_STRCPY(tp->ext_Names[i],
+			       stringbuf + offsets[i],
+			       length - offset);
+		    offset += strlen(tp->ext_Names[i]) + 1;
+		}
+	    }
+	}
+    }
+#endif
+
+    for (i = 0; i < nuses; i++) {
+	if (useoffsets[i] == ABSENT_OFFSET) {
+	    ep->uses[i].name = 0;
+	} else {
+	    ep->uses[i].name = strdup(tp->str_table + useoffsets[i]);
+	}
+    }
+    DEBUG(2, (T_RETURN("")));
+}
+
+NCURSES_EXPORT(void)
+_nc_merge_entry(ENTRY * const target, ENTRY * const source)
+/* merge capabilities from `from' entry into `to' entry */
+{
+    TERMTYPE2 *to = &(target->tterm);
+    TERMTYPE2 *from = &(source->tterm);
+#if NCURSES_XNAMES
+    TERMTYPE2 copy;
+    size_t str_size;
+    char *str_table;
+#endif
+    unsigned i;
+
+    if (source == 0 || from == 0 || target == 0 || to == 0)
+	return;
+
+#if NCURSES_XNAMES
+    _nc_copy_termtype2(&copy, from);
+    from = &copy;
+    _nc_align_termtype(to, from);
+    /*
+     * compute the maximum size of the string-table.
+     */
+    str_size = strlen(to->term_names) + 1;
+    for_each_string(i, from) {
+	if (VALID_STRING(from->Strings[i]))
+	    str_size += strlen(from->Strings[i]) + 1;
+    }
+    for_each_string(i, to) {
+	if (VALID_STRING(to->Strings[i]))
+	    str_size += strlen(to->Strings[i]) + 1;
+    }
+    /* allocate a string-table large enough for both source/target, and
+     * copy all of the strings into that table.  In the merge, we will
+     * select from the original source/target lists to construct a new
+     * target list.
+     */
+    if (str_size != 0) {
+	char *str_copied;
+	if ((str_table = malloc(str_size)) == NULL)
+	    _nc_err_abort(MSG_NO_MEMORY);
+	str_copied = str_table;
+	strcpy(str_copied, to->term_names);
+	to->term_names = str_copied;
+	str_copied += strlen(str_copied) + 1;
+	for_each_string(i, from) {
+	    if (VALID_STRING(from->Strings[i])) {
+		strcpy(str_copied, from->Strings[i]);
+		from->Strings[i] = str_copied;
+		str_copied += strlen(str_copied) + 1;
+	    }
+	}
+	for_each_string(i, to) {
+	    if (VALID_STRING(to->Strings[i])) {
+		strcpy(str_copied, to->Strings[i]);
+		to->Strings[i] = str_copied;
+		str_copied += strlen(str_copied) + 1;
+	    }
+	}
+	free(to->str_table);
+	to->str_table = str_table;
+	free(from->str_table);
+    }
+    /*
+     * Do the same for the extended-strings (i.e., lists of capabilities).
+     */
+    str_size = 0;
+    for (i = 0; i < NUM_EXT_NAMES(from); ++i) {
+	if (VALID_STRING(from->ext_Names[i]))
+	    str_size += strlen(from->ext_Names[i]) + 1;
+    }
+    for (i = 0; i < NUM_EXT_NAMES(to); ++i) {
+	if (VALID_STRING(to->ext_Names[i]))
+	    str_size += strlen(to->ext_Names[i]) + 1;
+    }
+    /* allocate a string-table large enough for both source/target, and
+     * copy all of the strings into that table.  In the merge, we will
+     * select from the original source/target lists to construct a new
+     * target list.
+     */
+    if (str_size != 0) {
+	char *str_copied;
+	if ((str_table = malloc(str_size)) == NULL)
+	    _nc_err_abort(MSG_NO_MEMORY);
+	str_copied = str_table;
+	for (i = 0; i < NUM_EXT_NAMES(from); ++i) {
+	    if (VALID_STRING(from->ext_Names[i])) {
+		strcpy(str_copied, from->ext_Names[i]);
+		from->ext_Names[i] = str_copied;
+		str_copied += strlen(str_copied) + 1;
+	    }
+	}
+	for (i = 0; i < NUM_EXT_NAMES(to); ++i) {
+	    if (VALID_STRING(to->ext_Names[i])) {
+		strcpy(str_copied, to->ext_Names[i]);
+		to->ext_Names[i] = str_copied;
+		str_copied += strlen(str_copied) + 1;
+	    }
+	}
+	free(to->ext_str_table);
+	to->ext_str_table = str_table;
+	free(from->ext_str_table);
+    }
+#endif
+    for_each_boolean(i, from) {
+	if (to->Booleans[i] != (NCURSES_SBOOL) CANCELLED_BOOLEAN) {
+	    int mergebool = from->Booleans[i];
+
+	    if (mergebool == CANCELLED_BOOLEAN)
+		to->Booleans[i] = FALSE;
+	    else if (mergebool == TRUE)
+		to->Booleans[i] = (NCURSES_SBOOL) mergebool;
+	}
+    }
+
+    for_each_number(i, from) {
+	if (to->Numbers[i] != CANCELLED_NUMERIC) {
+	    int mergenum = from->Numbers[i];
+
+	    if (mergenum == CANCELLED_NUMERIC)
+		to->Numbers[i] = ABSENT_NUMERIC;
+	    else if (mergenum != ABSENT_NUMERIC)
+		to->Numbers[i] = (NCURSES_INT2) mergenum;
+	}
+    }
+
+    /*
+     * Note: the copies of strings this makes don't have their own
+     * storage.  This is OK right now, but will be a problem if we
+     * we ever want to deallocate entries.
+     */
+    for_each_string(i, from) {
+	if (to->Strings[i] != CANCELLED_STRING) {
+	    char *mergestring = from->Strings[i];
+
+	    if (mergestring == CANCELLED_STRING)
+		to->Strings[i] = ABSENT_STRING;
+	    else if (mergestring != ABSENT_STRING)
+		to->Strings[i] = mergestring;
+	}
+    }
+#if NCURSES_XNAMES
+    /* cleanup */
+    free(copy.Booleans);
+    free(copy.Numbers);
+    free(copy.Strings);
+    free(copy.ext_Names);
+#endif
+}
+
+#if NO_LEAKS
+NCURSES_EXPORT(void)
+_nc_alloc_entry_leaks(void)
+{
+    if (stringbuf != NULL) {
+	FreeAndNull(stringbuf);
+    }
+    next_free = 0;
+}
+#endif
diff --git a/ncurses/tinfo/alloc_ttype.c b/ncurses/tinfo/alloc_ttype.c
new file mode 100644
index 0000000..6220c21
--- /dev/null
+++ b/ncurses/tinfo/alloc_ttype.c
@@ -0,0 +1,702 @@
+/****************************************************************************
+ * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1999-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey <dickey@clark.net> 1999-on                     *
+ ****************************************************************************/
+
+/*
+ * align_ttype.c --  functions for TERMTYPE
+ *
+ *	_nc_align_termtype()
+ *	_nc_copy_termtype()
+ *
+ */
+
+#include <curses.priv.h>
+
+#include <tic.h>
+
+MODULE_ID("$Id: alloc_ttype.c,v 1.46 2022/09/17 21:44:35 tom Exp $")
+
+#if NCURSES_XNAMES
+/*
+ * Merge the a/b lists into dst.  Both a/b are sorted (see _nc_extend_names()),
+ * so we do not have to worry about order dependencies.
+ */
+static int
+merge_names(char **dst, char **a, int na, char **b, int nb)
+{
+    int n = 0;
+    while (na > 0 && nb > 0) {
+	int cmp = strcmp(*a, *b);
+	if (cmp < 0) {
+	    dst[n++] = *a++;
+	    na--;
+	} else if (cmp > 0) {
+	    dst[n++] = *b++;
+	    nb--;
+	} else {
+	    dst[n++] = *a;
+	    a++, b++;
+	    na--, nb--;
+	}
+    }
+    while (na-- > 0) {
+	dst[n++] = *a++;
+    }
+    while (nb-- > 0) {
+	dst[n++] = *b++;
+    }
+    DEBUG(4, ("merge_names -> %d", n));
+    return n;
+}
+
+static bool
+find_name(char **table, int item, int length, const char *name)
+{
+    int n;
+    int result = -1;
+
+    for (n = item; n < length; ++n) {
+	if (!strcmp(table[n], name)) {
+	    DEBUG(4, ("found name '%s' @%d", name, n));
+	    result = n;
+	    break;
+	}
+    }
+    if (result < 0) {
+	DEBUG(4, ("did not find name '%s'", name));
+    }
+    return (result >= 0);
+}
+
+#define EXTEND_NUM(num, ext) \
+	DEBUG(4, ("extending " #num " from %d to %d", \
+	 to->num, (unsigned short) (to->num + (ext - to->ext)))); \
+	to->num = (unsigned short) (to->num + (ext - to->ext))
+
+static void
+realign_data(TERMTYPE2 *to, char **ext_Names,
+	     int ext_Booleans,
+	     int ext_Numbers,
+	     int ext_Strings)
+{
+    int n, m, base;
+    int to_Booleans = to->ext_Booleans;
+    int to_Numbers = to->ext_Numbers;
+    int to_Strings = to->ext_Strings;
+    int to1, to2, from;
+
+    DEBUG(4, ("realign_data %d/%d/%d vs %d/%d/%d",
+	      ext_Booleans,
+	      ext_Numbers,
+	      ext_Strings,
+	      to->ext_Booleans,
+	      to->ext_Numbers,
+	      to->ext_Strings));
+
+    if (to->ext_Booleans != ext_Booleans) {
+	to1 = 0;
+	to2 = to_Booleans + to1;
+	from = 0;
+	EXTEND_NUM(num_Booleans, ext_Booleans);
+	TYPE_REALLOC(NCURSES_SBOOL, to->num_Booleans, to->Booleans);
+	for (n = to->ext_Booleans - 1,
+	     m = ext_Booleans - 1,
+	     base = to->num_Booleans - (m + 1); m >= 0; m--) {
+	    if (find_name(to->ext_Names, to1, to2, ext_Names[m + from])) {
+		to->Booleans[base + m] = to->Booleans[base + n--];
+	    } else {
+		to->Booleans[base + m] = FALSE;
+	    }
+	}
+	to->ext_Booleans = UShort(ext_Booleans);
+    }
+
+    if (to->ext_Numbers != ext_Numbers) {
+	to1 = to_Booleans;
+	to2 = to_Numbers + to1;
+	from = ext_Booleans;
+	EXTEND_NUM(num_Numbers, ext_Numbers);
+	TYPE_REALLOC(NCURSES_INT2, to->num_Numbers, to->Numbers);
+	for (n = to->ext_Numbers - 1,
+	     m = ext_Numbers - 1,
+	     base = to->num_Numbers - (m + 1); m >= 0; m--) {
+	    if (find_name(to->ext_Names, to1, to2, ext_Names[m + from])) {
+		to->Numbers[base + m] = to->Numbers[base + n--];
+	    } else {
+		to->Numbers[base + m] = ABSENT_NUMERIC;
+	    }
+	}
+	to->ext_Numbers = UShort(ext_Numbers);
+    }
+
+    if (to->ext_Strings != ext_Strings) {
+	to1 = to_Booleans + to_Numbers;
+	to2 = to_Strings + to1;
+	from = ext_Booleans + ext_Numbers;
+	EXTEND_NUM(num_Strings, ext_Strings);
+	TYPE_REALLOC(char *, to->num_Strings, to->Strings);
+	for (n = to->ext_Strings - 1,
+	     m = ext_Strings - 1,
+	     base = to->num_Strings - (m + 1); m >= 0; m--) {
+	    if (find_name(to->ext_Names, to1, to2, ext_Names[m + from])) {
+		to->Strings[base + m] = to->Strings[base + n--];
+	    } else {
+		to->Strings[base + m] = ABSENT_STRING;
+	    }
+	}
+	to->ext_Strings = UShort(ext_Strings);
+    }
+}
+
+/*
+ * Returns the first index in ext_Names[] for the given token-type
+ */
+static unsigned
+_nc_first_ext_name(TERMTYPE2 *tp, int token_type)
+{
+    unsigned first;
+
+    switch (token_type) {
+    case BOOLEAN:
+	first = 0;
+	break;
+    case NUMBER:
+	first = tp->ext_Booleans;
+	break;
+    case STRING:
+	first = (unsigned) (tp->ext_Booleans + tp->ext_Numbers);
+	break;
+    default:
+	first = 0;
+	break;
+    }
+    return first;
+}
+
+/*
+ * Returns the last index in ext_Names[] for the given token-type
+ */
+static unsigned
+_nc_last_ext_name(TERMTYPE2 *tp, int token_type)
+{
+    unsigned last;
+
+    switch (token_type) {
+    case BOOLEAN:
+	last = tp->ext_Booleans;
+	break;
+    case NUMBER:
+	last = (unsigned) (tp->ext_Booleans + tp->ext_Numbers);
+	break;
+    default:
+    case STRING:
+	last = NUM_EXT_NAMES(tp);
+	break;
+    }
+    return last;
+}
+
+/*
+ * Lookup an entry from extended-names, returning -1 if not found
+ */
+static int
+_nc_find_ext_name(TERMTYPE2 *tp, char *name, int token_type)
+{
+    unsigned j;
+    unsigned first = _nc_first_ext_name(tp, token_type);
+    unsigned last = _nc_last_ext_name(tp, token_type);
+
+    for (j = first; j < last; j++) {
+	if (!strcmp(name, tp->ext_Names[j])) {
+	    return (int) j;
+	}
+    }
+    return -1;
+}
+
+/*
+ * Translate an index into ext_Names[] into the corresponding index into data
+ * (e.g., Booleans[]).
+ */
+static int
+_nc_ext_data_index(TERMTYPE2 *tp, int n, int token_type)
+{
+    switch (token_type) {
+    case BOOLEAN:
+	n += (tp->num_Booleans - tp->ext_Booleans);
+	break;
+    case NUMBER:
+	n += (tp->num_Numbers - tp->ext_Numbers)
+	    - (tp->ext_Booleans);
+	break;
+    default:
+    case STRING:
+	n += (tp->num_Strings - tp->ext_Strings)
+	    - (tp->ext_Booleans + tp->ext_Numbers);
+    }
+    return n;
+}
+
+/*
+ * Adjust tables to remove (not free) an extended name and its corresponding
+ * data.
+ */
+static bool
+_nc_del_ext_name(TERMTYPE2 *tp, char *name, int token_type)
+{
+    int first;
+
+    if ((first = _nc_find_ext_name(tp, name, token_type)) >= 0) {
+	int j;
+	int last = (int) NUM_EXT_NAMES(tp) - 1;
+
+	for (j = first; j < last; j++) {
+	    tp->ext_Names[j] = tp->ext_Names[j + 1];
+	}
+	first = _nc_ext_data_index(tp, first, token_type);
+	switch (token_type) {
+	case BOOLEAN:
+	    last = tp->num_Booleans - 1;
+	    for (j = first; j < last; j++)
+		tp->Booleans[j] = tp->Booleans[j + 1];
+	    tp->ext_Booleans--;
+	    tp->num_Booleans--;
+	    break;
+	case NUMBER:
+	    last = tp->num_Numbers - 1;
+	    for (j = first; j < last; j++)
+		tp->Numbers[j] = tp->Numbers[j + 1];
+	    tp->ext_Numbers--;
+	    tp->num_Numbers--;
+	    break;
+	case STRING:
+	    last = tp->num_Strings - 1;
+	    for (j = first; j < last; j++)
+		tp->Strings[j] = tp->Strings[j + 1];
+	    tp->ext_Strings--;
+	    tp->num_Strings--;
+	    break;
+	}
+	return TRUE;
+    }
+    return FALSE;
+}
+
+/*
+ * Adjust tables to insert an extended name, making room for new data.  The
+ * index into the corresponding data array is returned.
+ */
+static int
+_nc_ins_ext_name(TERMTYPE2 *tp, char *name, int token_type)
+{
+    unsigned first = _nc_first_ext_name(tp, token_type);
+    unsigned last = _nc_last_ext_name(tp, token_type);
+    unsigned total = NUM_EXT_NAMES(tp) + 1;
+    unsigned j, k;
+
+    for (j = first; j < last; j++) {
+	int cmp = strcmp(name, tp->ext_Names[j]);
+	if (cmp == 0)
+	    /* already present */
+	    return _nc_ext_data_index(tp, (int) j, token_type);
+	if (cmp < 0) {
+	    break;
+	}
+    }
+
+    TYPE_REALLOC(char *, total, tp->ext_Names);
+    for (k = total - 1; k > j; k--)
+	tp->ext_Names[k] = tp->ext_Names[k - 1];
+    tp->ext_Names[j] = name;
+    j = (unsigned) _nc_ext_data_index(tp, (int) j, token_type);
+
+    switch (token_type) {
+    case BOOLEAN:
+	tp->ext_Booleans++;
+	tp->num_Booleans++;
+	TYPE_REALLOC(NCURSES_SBOOL, tp->num_Booleans, tp->Booleans);
+	for (k = (unsigned) (tp->num_Booleans - 1); k > j; k--)
+	    tp->Booleans[k] = tp->Booleans[k - 1];
+	break;
+    case NUMBER:
+	tp->ext_Numbers++;
+	tp->num_Numbers++;
+	TYPE_REALLOC(NCURSES_INT2, tp->num_Numbers, tp->Numbers);
+	for (k = (unsigned) (tp->num_Numbers - 1); k > j; k--)
+	    tp->Numbers[k] = tp->Numbers[k - 1];
+	break;
+    case STRING:
+	tp->ext_Strings++;
+	tp->num_Strings++;
+	TYPE_REALLOC(char *, tp->num_Strings, tp->Strings);
+	for (k = (unsigned) (tp->num_Strings - 1); k > j; k--)
+	    tp->Strings[k] = tp->Strings[k - 1];
+	break;
+    }
+    return (int) j;
+}
+
+/*
+ * Look for strings that are marked cancelled, which happen to be the same name
+ * as a boolean or number.  We'll get this as a special case when we get a
+ * cancellation of a name that is inherited from another entry.
+ */
+static void
+adjust_cancels(TERMTYPE2 *to, TERMTYPE2 *from)
+{
+    int first = to->ext_Booleans + to->ext_Numbers;
+    int last = first + to->ext_Strings;
+    int j, k;
+
+    DEBUG(3, (T_CALLED("adjust_cancels(%s), from(%s)"),
+	      to ? NonNull(to->term_names) : "?",
+	      from ? NonNull(from->term_names) : "?"));
+    for (j = first; j < last;) {
+	char *name = to->ext_Names[j];
+	int j_str = to->num_Strings - first - to->ext_Strings;
+
+	if (to->Strings[j + j_str] == CANCELLED_STRING) {
+	    if (_nc_find_ext_name(from, to->ext_Names[j], BOOLEAN) >= 0) {
+		if (_nc_del_ext_name(to, name, STRING)
+		    || _nc_del_ext_name(to, name, NUMBER)) {
+		    k = _nc_ins_ext_name(to, name, BOOLEAN);
+		    to->Booleans[k] = FALSE;
+		} else {
+		    j++;
+		}
+	    } else if (_nc_find_ext_name(from, to->ext_Names[j], NUMBER) >= 0) {
+		if (_nc_del_ext_name(to, name, STRING)
+		    || _nc_del_ext_name(to, name, BOOLEAN)) {
+		    k = _nc_ins_ext_name(to, name, NUMBER);
+		    to->Numbers[k] = CANCELLED_NUMERIC;
+		} else {
+		    j++;
+		}
+	    } else if (_nc_find_ext_name(from, to->ext_Names[j], STRING) >= 0) {
+		if (_nc_del_ext_name(to, name, NUMBER)
+		    || _nc_del_ext_name(to, name, BOOLEAN)) {
+		    k = _nc_ins_ext_name(to, name, STRING);
+		    to->Strings[k] = CANCELLED_STRING;
+		} else {
+		    j++;
+		}
+	    } else {
+		j++;
+	    }
+	} else {
+	    j++;
+	}
+    }
+    DEBUG(3, (T_RETURN("")));
+}
+
+NCURSES_EXPORT(void)
+_nc_align_termtype(TERMTYPE2 *to, TERMTYPE2 *from)
+{
+    int na;
+    int nb;
+    char **ext_Names;
+
+    na = to ? ((int) NUM_EXT_NAMES(to)) : 0;
+    nb = from ? ((int) NUM_EXT_NAMES(from)) : 0;
+
+    DEBUG(2, (T_CALLED("_nc_align_termtype to(%d:%s), from(%d:%s)"),
+	      na, to ? NonNull(to->term_names) : "?",
+	      nb, from ? NonNull(from->term_names) : "?"));
+
+    if (to != NULL && from != NULL && (na != 0 || nb != 0)) {
+	int ext_Booleans, ext_Numbers, ext_Strings;
+	bool used_ext_Names = FALSE;
+
+	if ((na == nb)		/* check if the arrays are equivalent */
+	    &&(to->ext_Booleans == from->ext_Booleans)
+	    && (to->ext_Numbers == from->ext_Numbers)
+	    && (to->ext_Strings == from->ext_Strings)) {
+	    int n;
+	    bool same;
+
+	    for (n = 0, same = TRUE; n < na; n++) {
+		if (strcmp(to->ext_Names[n], from->ext_Names[n])) {
+		    same = FALSE;
+		    break;
+		}
+	    }
+	    if (same) {
+		DEBUG(2, (T_RETURN("")));
+		return;
+	    }
+	}
+	/*
+	 * This is where we pay for having a simple extension representation.
+	 * Allocate a new ext_Names array and merge the two ext_Names arrays
+	 * into it, updating to's counts for booleans, etc.  Fortunately we do
+	 * this only for the terminfo compiler (tic) and comparer (infocmp).
+	 */
+	TYPE_MALLOC(char *, (size_t)(na + nb), ext_Names);
+
+	if (to->ext_Strings && (from->ext_Booleans + from->ext_Numbers))
+	    adjust_cancels(to, from);
+
+	if (from->ext_Strings && (to->ext_Booleans + to->ext_Numbers))
+	    adjust_cancels(from, to);
+
+	ext_Booleans = merge_names(ext_Names,
+				   to->ext_Names,
+				   to->ext_Booleans,
+				   from->ext_Names,
+				   from->ext_Booleans);
+	ext_Numbers = merge_names(ext_Names + ext_Booleans,
+				  to->ext_Names
+				  + to->ext_Booleans,
+				  to->ext_Numbers,
+				  from->ext_Names
+				  + from->ext_Booleans,
+				  from->ext_Numbers);
+	ext_Strings = merge_names(ext_Names + ext_Numbers + ext_Booleans,
+				  to->ext_Names
+				  + to->ext_Booleans
+				  + to->ext_Numbers,
+				  to->ext_Strings,
+				  from->ext_Names
+				  + from->ext_Booleans
+				  + from->ext_Numbers,
+				  from->ext_Strings);
+	/*
+	 * Now we must reallocate the Booleans, etc., to allow the data to be
+	 * overlaid.
+	 */
+	if (na != (ext_Booleans + ext_Numbers + ext_Strings)) {
+	    realign_data(to, ext_Names, ext_Booleans, ext_Numbers, ext_Strings);
+	    FreeIfNeeded(to->ext_Names);
+	    to->ext_Names = ext_Names;
+	    DEBUG(2, ("realigned %d extended names for '%s' (to)",
+		      NUM_EXT_NAMES(to), to->term_names));
+	    used_ext_Names = TRUE;
+	}
+	if (nb != (ext_Booleans + ext_Numbers + ext_Strings)) {
+	    nb = (ext_Booleans + ext_Numbers + ext_Strings);
+	    realign_data(from, ext_Names, ext_Booleans, ext_Numbers, ext_Strings);
+	    TYPE_REALLOC(char *, (size_t) nb, from->ext_Names);
+	    memcpy(from->ext_Names, ext_Names, sizeof(char *) * (size_t) nb);
+	    DEBUG(2, ("realigned %d extended names for '%s' (from)",
+		      NUM_EXT_NAMES(from), from->term_names));
+	}
+	if (!used_ext_Names)
+	    free(ext_Names);
+    }
+    DEBUG(2, (T_RETURN("")));
+}
+#endif
+
+#define srcINT 1
+#define dstINT 2
+
+/*
+ * TERMTYPE and TERMTYPE2 differ only with regard to the values in Numbers.
+ * Use 'mode' to decide which to use.
+ */
+static void
+copy_termtype(TERMTYPE2 *dst, const TERMTYPE2 *src, int mode)
+{
+    unsigned i;
+    int pass;
+    char *new_table;
+#if NCURSES_EXT_NUMBERS
+    short *oldptr = 0;
+    int *newptr = 0;
+#endif
+
+    DEBUG(2, (T_CALLED("copy_termtype(dst=%p, src=%p, mode=%d)"), (void *)
+	      dst, (const void *) src, mode));
+    *dst = *src;		/* ...to copy the sizes and string-tables */
+
+    TYPE_MALLOC(NCURSES_SBOOL, NUM_BOOLEANS(dst), dst->Booleans);
+    TYPE_MALLOC(char *, NUM_STRINGS(dst), dst->Strings);
+
+    memcpy(dst->Booleans,
+	   src->Booleans,
+	   NUM_BOOLEANS(dst) * sizeof(dst->Booleans[0]));
+    memcpy(dst->Strings,
+	   src->Strings,
+	   NUM_STRINGS(dst) * sizeof(dst->Strings[0]));
+
+    new_table = NULL;
+    for (pass = 0; pass < 2; ++pass) {
+	size_t str_size = 0;
+	if (src->term_names != NULL) {
+	    if (pass) {
+		dst->term_names = new_table + str_size;
+		strcpy(dst->term_names + str_size, src->term_names);
+	    }
+	    str_size += strlen(src->term_names) + 1;
+	}
+	for_each_string(i, src) {
+	    if (VALID_STRING(src->Strings[i])) {
+		if (pass) {
+		    strcpy(new_table + str_size, src->Strings[i]);
+		    dst->Strings[i] = new_table + str_size;
+		}
+		str_size += strlen(src->Strings[i]) + 1;
+	    }
+	}
+	if (pass) {
+	    dst->str_table = new_table;
+	} else {
+	    ++str_size;
+	    if ((new_table = malloc(str_size)) == NULL)
+		_nc_err_abort(MSG_NO_MEMORY);
+	}
+    }
+
+#if NCURSES_EXT_NUMBERS
+    if ((mode & dstINT) == 0) {
+	DEBUG(2, ("...convert int ->short"));
+	TYPE_MALLOC(short, NUM_NUMBERS(dst), oldptr);
+	((TERMTYPE *) dst)->Numbers = oldptr;
+    } else {
+	DEBUG(2, ("...copy without changing size"));
+	TYPE_MALLOC(int, NUM_NUMBERS(dst), newptr);
+	dst->Numbers = newptr;
+    }
+    if ((mode == srcINT) && (oldptr != 0)) {
+	DEBUG(2, ("...copy int ->short"));
+	for (i = 0; i < NUM_NUMBERS(dst); ++i) {
+	    if (src->Numbers[i] > MAX_OF_TYPE(short)) {
+		oldptr[i] = MAX_OF_TYPE(short);
+	    } else {
+		oldptr[i] = (short) src->Numbers[i];
+	    }
+	}
+    } else if ((mode == dstINT) && (newptr != 0)) {
+	DEBUG(2, ("...copy short ->int"));
+	for (i = 0; i < NUM_NUMBERS(dst); ++i) {
+	    newptr[i] = ((const short *) (src->Numbers))[i];
+	}
+    } else {
+	DEBUG(2, ("...copy %s without change",
+		  (mode & dstINT)
+		  ? "int"
+		  : "short"));
+	memcpy(dst->Numbers,
+	       src->Numbers,
+	       NUM_NUMBERS(dst) * ((mode & dstINT)
+				   ? sizeof(int)
+				   : sizeof(short)));
+    }
+#else
+    (void) mode;
+    TYPE_MALLOC(short, NUM_NUMBERS(dst), dst->Numbers);
+    memcpy(dst->Numbers,
+	   src->Numbers,
+	   NUM_NUMBERS(dst) * sizeof(dst->Numbers[0]));
+#endif
+
+#if NCURSES_XNAMES
+    if ((i = NUM_EXT_NAMES(src)) != 0) {
+	TYPE_MALLOC(char *, i, dst->ext_Names);
+	memcpy(dst->ext_Names, src->ext_Names, i * sizeof(char *));
+
+	new_table = NULL;
+	for (pass = 0; pass < 2; ++pass) {
+	    size_t str_size = 0;
+	    char *raw_data = src->ext_str_table;
+	    if (raw_data != NULL) {
+		for (i = 0; i < src->ext_Strings; ++i) {
+		    size_t skip = strlen(raw_data) + 1;
+		    if (skip != 1) {
+			if (pass) {
+			    strcpy(new_table + str_size, raw_data);
+			}
+			str_size += skip;
+			raw_data += skip;
+		    }
+		}
+	    }
+	    for (i = 0; i < NUM_EXT_NAMES(dst); ++i) {
+		if (VALID_STRING(src->ext_Names[i])) {
+		    if (pass) {
+			strcpy(new_table + str_size, src->ext_Names[i]);
+			dst->ext_Names[i] = new_table + str_size;
+		    }
+		    str_size += strlen(src->ext_Names[i]) + 1;
+		}
+	    }
+	    if (pass) {
+		dst->ext_str_table = new_table;
+	    } else {
+		++str_size;
+		if ((new_table = calloc(str_size, 1)) == NULL)
+		    _nc_err_abort(MSG_NO_MEMORY);
+	    }
+	}
+    } else {
+	dst->ext_Names = 0;
+    }
+#endif
+    DEBUG(2, (T_RETURN("")));
+}
+
+/*
+ * This entrypoint is used by tack 1.07
+ */
+NCURSES_EXPORT(void)
+_nc_copy_termtype(TERMTYPE *dst, const TERMTYPE *src)
+{
+    DEBUG(2, (T_CALLED("_nc_copy_termtype(dst=%p, src=%p)"), (void *) dst,
+	      (const void *) src));
+    copy_termtype((TERMTYPE2 *) dst, (const TERMTYPE2 *) src, 0);
+    DEBUG(2, (T_RETURN("")));
+}
+
+#if NCURSES_EXT_NUMBERS
+NCURSES_EXPORT(void)
+_nc_copy_termtype2(TERMTYPE2 *dst, const TERMTYPE2 *src)
+{
+    DEBUG(2, (T_CALLED("_nc_copy_termtype2(dst=%p, src=%p)"), (void *) dst,
+	      (const void *) src));
+    copy_termtype(dst, src, srcINT | dstINT);
+    DEBUG(2, (T_RETURN("")));
+}
+
+/*
+ * Use this for exporting the internal TERMTYPE2 to the legacy format used via
+ * the CUR macro by applications.
+ */
+NCURSES_EXPORT(void)
+_nc_export_termtype2(TERMTYPE *dst, const TERMTYPE2 *src)
+{
+    DEBUG(2, (T_CALLED("_nc_export_termtype2(dst=%p, src=%p)"), (void *)
+	      dst, (const void *) src));
+    copy_termtype((TERMTYPE2 *) dst, src, srcINT);
+    DEBUG(2, (T_RETURN("")));
+}
+#endif /* NCURSES_EXT_NUMBERS */
diff --git a/ncurses/tinfo/captoinfo.c b/ncurses/tinfo/captoinfo.c
new file mode 100644
index 0000000..7e14731
--- /dev/null
+++ b/ncurses/tinfo/captoinfo.c
@@ -0,0 +1,1059 @@
+/****************************************************************************
+ * Copyright 2018-2020,2021 Thomas E. Dickey                                *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ ****************************************************************************/
+
+/*
+ *	captoinfo.c
+ *
+ *	Provide conversion in both directions between termcap and terminfo.
+ *
+ * cap-to-info --- conversion between termcap and terminfo formats
+ *
+ *	The captoinfo() code was swiped from Ross Ridge's mytinfo package,
+ *	adapted to fit ncurses by Eric S. Raymond <esr@snark.thyrsus.com>.
+ *
+ *	It has just one entry point:
+ *
+ *	char *_nc_captoinfo(n, s, parameterized)
+ *
+ *	Convert value s for termcap string capability named n into terminfo
+ *	format.
+ *
+ *	This code recognizes all the standard 4.4BSD %-escapes:
+ *
+ *	%%       output `%'
+ *	%d       output value as in printf %d
+ *	%2       output value as in printf %2d
+ *	%3       output value as in printf %3d
+ *	%.       output value as in printf %c
+ *	%+x      add x to value, then do %.
+ *	%>xy     if value > x then add y, no output
+ *	%r       reverse order of two parameters, no output
+ *	%i       increment by one, no output
+ *	%n       exclusive-or all parameters with 0140 (Datamedia 2500)
+ *	%B       BCD (16*(value/10)) + (value%10), no output
+ *	%D       Reverse coding (value - 2*(value%16)), no output (Delta Data).
+ *
+ *	Also, %02 and %03 are accepted as synonyms for %2 and %3.
+ *
+ *	Besides all the standard termcap escapes, this translator understands
+ *	the following extended escapes:
+ *
+ *	used by GNU Emacs termcap libraries
+ *		%a[+*-/=][cp]x	GNU arithmetic.
+ *		%m		xor the first two parameters by 0177
+ *		%b		backup to previous parameter
+ *		%f		skip this parameter
+ *
+ *	used by the University of Waterloo (MFCF) termcap libraries
+ *		%-x	 subtract parameter FROM char x and output it as a char
+ *		%ax	 add the character x to parameter
+ *
+ *	If #define WATERLOO is on, also enable these translations:
+ *
+ *		%sx	 subtract parameter FROM the character x
+ *
+ *	By default, this Waterloo translations are not compiled in, because
+ *	the Waterloo %s conflicts with the way terminfo uses %s in strings for
+ *	function programming.
+ *
+ *	Note the two definitions of %a: the GNU definition is translated if the
+ *	characters after the 'a' are valid for it, otherwise the UW definition
+ *	is translated.
+ */
+
+#include <curses.priv.h>
+
+#include <ctype.h>
+#include <tic.h>
+
+MODULE_ID("$Id: captoinfo.c,v 1.102 2021/09/04 10:29:15 tom Exp $")
+
+#if 0
+#define DEBUG_THIS(p) DEBUG(9, p)
+#else
+#define DEBUG_THIS(p)		/* nothing */
+#endif
+
+#define MAX_PUSHED	16	/* max # args we can push onto the stack */
+
+static int stack[MAX_PUSHED];	/* the stack */
+static int stackptr;		/* the next empty place on the stack */
+static int onstack;		/* the top of stack */
+static int seenm;		/* seen a %m */
+static int seenn;		/* seen a %n */
+static int seenr;		/* seen a %r */
+static int param;		/* current parameter */
+static char *dp;		/* pointer to end of the converted string */
+
+static char *my_string;
+static size_t my_length;
+
+static char *
+init_string(void)
+/* initialize 'my_string', 'my_length' */
+{
+    if (my_string == 0)
+	TYPE_MALLOC(char, my_length = 256, my_string);
+
+    *my_string = '\0';
+    return my_string;
+}
+
+static char *
+save_string(char *d, const char *const s)
+{
+    size_t have = (size_t) (d - my_string);
+    size_t need = have + strlen(s) + 2;
+    if (need > my_length) {
+	my_string = (char *) _nc_doalloc(my_string, my_length = (need + need));
+	if (my_string == 0)
+	    _nc_err_abort(MSG_NO_MEMORY);
+	d = my_string + have;
+    }
+    _nc_STRCPY(d, s, my_length - have);
+    return d + strlen(d);
+}
+
+static NCURSES_INLINE char *
+save_char(char *s, int c)
+{
+    static char temp[2];
+    temp[0] = (char) c;
+    return save_string(s, temp);
+}
+
+static void
+push(void)
+/* push onstack on to the stack */
+{
+    if (stackptr >= MAX_PUSHED)
+	_nc_warning("string too complex to convert");
+    else
+	stack[stackptr++] = onstack;
+}
+
+static void
+pop(void)
+/* pop the top of the stack into onstack */
+{
+    if (stackptr == 0) {
+	if (onstack == 0)
+	    _nc_warning("I'm confused");
+	else
+	    onstack = 0;
+    } else
+	onstack = stack[--stackptr];
+    param++;
+}
+
+static int
+cvtchar(register const char *sp)
+/* convert a character to a terminfo push */
+{
+    unsigned char c = 0;
+    int len;
+
+    switch (*sp) {
+    case '\\':
+	switch (*++sp) {
+	case '\'':
+	case '$':
+	case '\\':
+	case '%':
+	    c = UChar(*sp);
+	    len = 2;
+	    break;
+	case '\0':
+	    c = '\\';
+	    len = 1;
+	    break;
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	    len = 1;
+	    while (isdigit(UChar(*sp))) {
+		c = UChar(8 * c + (*sp++ - '0'));
+		len++;
+	    }
+	    break;
+	default:
+	    c = UChar(*sp);
+	    len = (c != '\0') ? 2 : 1;
+	    break;
+	}
+	break;
+    case '^':
+	len = 2;
+	c = UChar(*++sp);
+	if (c == '?') {
+	    c = 127;
+	} else if (c == '\0') {
+	    len = 1;
+	} else {
+	    c &= 0x1f;
+	}
+	break;
+    default:
+	c = UChar(*sp);
+	len = (c != '\0') ? 1 : 0;
+    }
+    if (isgraph(c) && c != ',' && c != '\'' && c != '\\' && c != ':') {
+	dp = save_string(dp, "%\'");
+	dp = save_char(dp, c);
+	dp = save_char(dp, '\'');
+    } else if (c != '\0') {
+	dp = save_string(dp, "%{");
+	if (c > 99)
+	    dp = save_char(dp, c / 100 + '0');
+	if (c > 9)
+	    dp = save_char(dp, ((int) (c / 10)) % 10 + '0');
+	dp = save_char(dp, c % 10 + '0');
+	dp = save_char(dp, '}');
+    }
+    return len;
+}
+
+static void
+getparm(int parm, int n)
+/* push n copies of param on the terminfo stack if not already there */
+{
+    int nn;
+
+    if (seenr) {
+	if (parm == 1)
+	    parm = 2;
+	else if (parm == 2)
+	    parm = 1;
+    }
+
+    for (nn = 0; nn < n; ++nn) {
+	dp = save_string(dp, "%p");
+	dp = save_char(dp, '0' + parm);
+    }
+
+    if (onstack == parm) {
+	if (n > 1) {
+	    _nc_warning("string may not be optimal");
+	    dp = save_string(dp, "%Pa");
+	    while (n-- > 0) {
+		dp = save_string(dp, "%ga");
+	    }
+	}
+	return;
+    }
+    if (onstack != 0)
+	push();
+
+    onstack = parm;
+
+    if (seenn && parm < 3) {
+	dp = save_string(dp, "%{96}%^");
+    }
+
+    if (seenm && parm < 3) {
+	dp = save_string(dp, "%{127}%^");
+    }
+}
+
+/*
+ * Convert a termcap string to terminfo format.
+ * 'cap' is the relevant terminfo capability index.
+ * 's' is the string value of the capability.
+ * 'parameterized' tells what type of translations to do:
+ *	% translations if 1
+ *	pad translations if >=0
+ */
+NCURSES_EXPORT(char *)
+_nc_captoinfo(const char *cap, const char *s, int const parameterized)
+{
+    const char *capstart;
+
+    stackptr = 0;
+    onstack = 0;
+    seenm = 0;
+    seenn = 0;
+    seenr = 0;
+    param = 1;
+
+    DEBUG_THIS(("_nc_captoinfo params %d, %s", parameterized, s));
+
+    dp = init_string();
+
+    /* skip the initial padding (if we haven't been told not to) */
+    capstart = 0;
+    if (s == 0)
+	s = "";
+    if (parameterized >= 0 && isdigit(UChar(*s)))
+	for (capstart = s; *s != '\0'; s++)
+	    if (!(isdigit(UChar(*s)) || *s == '*' || *s == '.'))
+		break;
+
+    while (*s != '\0') {
+	switch (*s) {
+	case '%':
+	    s++;
+	    if (parameterized < 1) {
+		dp = save_char(dp, '%');
+		break;
+	    }
+	    switch (*s++) {
+	    case '%':
+		dp = save_string(dp, "%%");
+		break;
+	    case 'r':
+		if (seenr++ == 1) {
+		    _nc_warning("saw %%r twice in %s", cap);
+		}
+		break;
+	    case 'm':
+		if (seenm++ == 1) {
+		    _nc_warning("saw %%m twice in %s", cap);
+		}
+		break;
+	    case 'n':
+		if (seenn++ == 1) {
+		    _nc_warning("saw %%n twice in %s", cap);
+		}
+		break;
+	    case 'i':
+		dp = save_string(dp, "%i");
+		break;
+	    case '6':
+	    case 'B':
+		getparm(param, 1);
+		dp = save_string(dp, "%{10}%/%{16}%*");
+		getparm(param, 1);
+		dp = save_string(dp, "%{10}%m%+");
+		break;
+	    case '8':
+	    case 'D':
+		getparm(param, 2);
+		dp = save_string(dp, "%{2}%*%-");
+		break;
+	    case '>':
+		/* %?%{x}%>%t%{y}%+%; */
+		if (s[0] && s[1]) {
+		    getparm(param, 2);
+		    dp = save_string(dp, "%?");
+		    s += cvtchar(s);
+		    dp = save_string(dp, "%>%t");
+		    s += cvtchar(s);
+		    dp = save_string(dp, "%+%;");
+		} else {
+		    _nc_warning("expected two characters after %%>");
+		    dp = save_string(dp, "%>");
+		}
+		break;
+	    case 'a':
+		if ((*s == '=' || *s == '+' || *s == '-'
+		     || *s == '*' || *s == '/')
+		    && (s[1] == 'p' || s[1] == 'c')
+		    && s[2] != '\0') {
+		    int l;
+		    l = 2;
+		    if (*s != '=')
+			getparm(param, 1);
+		    if (s[1] == 'p') {
+			getparm(param + s[2] - '@', 1);
+			if (param != onstack) {
+			    pop();
+			    param--;
+			}
+			l++;
+		    } else
+			l += cvtchar(s + 2);
+		    switch (*s) {
+		    case '+':
+			dp = save_string(dp, "%+");
+			break;
+		    case '-':
+			dp = save_string(dp, "%-");
+			break;
+		    case '*':
+			dp = save_string(dp, "%*");
+			break;
+		    case '/':
+			dp = save_string(dp, "%/");
+			break;
+		    case '=':
+			if (seenr) {
+			    if (param == 1)
+				onstack = 2;
+			    else if (param == 2)
+				onstack = 1;
+			    else
+				onstack = param;
+			} else
+			    onstack = param;
+			break;
+		    }
+		    s += l;
+		    break;
+		}
+		getparm(param, 1);
+		s += cvtchar(s);
+		dp = save_string(dp, "%+");
+		break;
+	    case '+':
+		getparm(param, 1);
+		s += cvtchar(s);
+		dp = save_string(dp, "%+%c");
+		pop();
+		break;
+	    case 's':
+#ifdef WATERLOO
+		s += cvtchar(s);
+		getparm(param, 1);
+		dp = save_string(dp, "%-");
+#else
+		getparm(param, 1);
+		dp = save_string(dp, "%s");
+		pop();
+#endif /* WATERLOO */
+		break;
+	    case '-':
+		s += cvtchar(s);
+		getparm(param, 1);
+		dp = save_string(dp, "%-%c");
+		pop();
+		break;
+	    case '.':
+		getparm(param, 1);
+		dp = save_string(dp, "%c");
+		pop();
+		break;
+	    case '0':		/* not clear any of the historical termcaps did this */
+		if (*s == '3') {
+		    ++s;
+		    goto see03;
+		}
+		if (*s == '2') {
+		    ++s;
+		    goto see02;
+		}
+		goto invalid;
+	    case '2':
+	      see02:
+		getparm(param, 1);
+		dp = save_string(dp, "%2d");
+		pop();
+		break;
+	    case '3':
+	      see03:
+		getparm(param, 1);
+		dp = save_string(dp, "%3d");
+		pop();
+		break;
+	    case 'd':
+		getparm(param, 1);
+		dp = save_string(dp, "%d");
+		pop();
+		break;
+	    case 'f':
+		param++;
+		break;
+	    case 'b':
+		param--;
+		break;
+	    case '\\':
+		dp = save_string(dp, "%\\");
+		break;
+	    default:
+	      invalid:
+		dp = save_char(dp, '%');
+		s--;
+		_nc_warning("unknown %% code %s (%#x) in %s",
+			    unctrl((chtype) *s), UChar(*s), cap);
+		break;
+	    }
+	    break;
+	default:
+	    if (*s != '\0')
+		dp = save_char(dp, *s++);
+	    break;
+	}
+    }
+
+    /*
+     * Now, if we stripped off some leading padding, add it at the end
+     * of the string as mandatory padding.
+     */
+    if (capstart) {
+	dp = save_string(dp, "$<");
+	for (s = capstart; *s != '\0'; s++)
+	    if (isdigit(UChar(*s)) || *s == '*' || *s == '.')
+		dp = save_char(dp, *s);
+	    else
+		break;
+	dp = save_string(dp, "/>");
+    }
+
+    (void) save_char(dp, '\0');
+
+    DEBUG_THIS(("... _nc_captoinfo %s", NonNull(my_string)));
+
+    return (my_string);
+}
+
+/*
+ * Check for an expression that corresponds to "%B" (BCD):
+ *	(parameter / 10) * 16 + (parameter % 10)
+ */
+static int
+bcd_expression(const char *str)
+{
+    /* leave this non-const for HPUX */
+    static char fmt[] = "%%p%c%%{10}%%/%%{16}%%*%%p%c%%{10}%%m%%+";
+    int len = 0;
+    char ch1, ch2;
+
+    if (sscanf(str, fmt, &ch1, &ch2) == 2
+	&& isdigit(UChar(ch1))
+	&& isdigit(UChar(ch2))
+	&& (ch1 == ch2)) {
+	len = 28;
+#ifndef NDEBUG
+	{
+	    char buffer[80];
+	    int tst;
+	    _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer)) fmt, ch1, ch2);
+	    tst = strlen(buffer) - 1;
+	    assert(len == tst);
+	}
+#endif
+    }
+    return len;
+}
+
+static char *
+save_tc_char(char *bufptr, int c1)
+{
+    if (is7bits(c1) && isprint(c1)) {
+	if (c1 == ':' || c1 == '\\')
+	    bufptr = save_char(bufptr, '\\');
+	bufptr = save_char(bufptr, c1);
+    } else {
+	char temp[80];
+
+	if (c1 == (c1 & 0x1f)) {	/* iscntrl() returns T on 255 */
+	    _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp))
+			"%.20s", unctrl((chtype) c1));
+	} else {
+	    _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp))
+			"\\%03o", c1);
+	}
+	bufptr = save_string(bufptr, temp);
+    }
+    return bufptr;
+}
+
+static char *
+save_tc_inequality(char *bufptr, int c1, int c2)
+{
+    bufptr = save_string(bufptr, "%>");
+    bufptr = save_tc_char(bufptr, c1);
+    bufptr = save_tc_char(bufptr, c2);
+    return bufptr;
+}
+
+/*
+ * info-to-cap --- conversion between terminfo and termcap formats
+ *
+ * Here are the capabilities infotocap assumes it can translate to:
+ *
+ *     %%       output `%'
+ *     %d       output value as in printf %d
+ *     %2       output value as in printf %2d
+ *     %3       output value as in printf %3d
+ *     %.       output value as in printf %c
+ *     %+c      add character c to value, then do %.
+ *     %>xy     if value > x then add y, no output
+ *     %r       reverse order of two parameters, no output
+ *     %i       increment by one, no output
+ *     %n       exclusive-or all parameters with 0140 (Datamedia 2500)
+ *     %B       BCD (16*(value/10)) + (value%10), no output
+ *     %D       Reverse coding (value - 2*(value%16)), no output (Delta Data).
+ *     %m       exclusive-or all parameters with 0177 (not in 4.4BSD)
+ */
+
+#define octal_fixup(n, c) fixups[n].ch = ((fixups[n].ch << 3) | ((c) - '0'))
+
+/*
+ * Convert a terminfo string to termcap format.  Parameters are as in
+ * _nc_captoinfo().
+ */
+NCURSES_EXPORT(char *)
+_nc_infotocap(const char *cap GCC_UNUSED, const char *str, int const parameterized)
+{
+    int seenone = 0, seentwo = 0, saw_m = 0, saw_n = 0;
+    const char *padding;
+    const char *trimmed = 0;
+    int in0, in1, in2;
+    char ch1 = 0, ch2 = 0;
+    char *bufptr = init_string();
+    char octal[4];
+    int len;
+    int digits;
+    bool syntax_error = FALSE;
+    int myfix = 0;
+    struct {
+	int ch;
+	int offset;
+    } fixups[MAX_TC_FIXUPS];
+
+    DEBUG_THIS(("_nc_infotocap %s params %d, %s",
+		_nc_strict_bsd ? "strict" : "loose",
+		parameterized,
+		_nc_visbuf(str)));
+
+    /* we may have to move some trailing mandatory padding up front */
+    padding = str + strlen(str) - 1;
+    if (padding > str && *padding == '>') {
+	if (padding > (str + 1) && *--padding == '/')
+	    --padding;
+	while (isdigit(UChar(*padding)) || *padding == '.' || *padding == '*')
+	    padding--;
+	if (padding > str && *padding == '<' && *--padding == '$')
+	    trimmed = padding;
+	padding += 2;
+
+	while (isdigit(UChar(*padding)) || *padding == '.' || *padding == '*')
+	    bufptr = save_char(bufptr, *padding++);
+    }
+
+    for (; !syntax_error &&
+	 *str &&
+	 ((trimmed == 0) || (str < trimmed)); str++) {
+	int c1, c2;
+	char *cp = 0;
+
+	if (str[0] == '^') {
+	    if (str[1] == '\0' || (str + 1) == trimmed) {
+		bufptr = save_string(bufptr, "\\136");
+		++str;
+	    } else if (str[1] == '?') {
+		/*
+		 * Although the 4.3BSD termcap file has an instance of "kb=^?",
+		 * that appears to be just cut/paste since neither 4.3BSD nor
+		 * 4.4BSD termcap interprets "^?" as DEL.
+		 */
+		bufptr = save_string(bufptr, "\\177");
+		++str;
+	    } else {
+		bufptr = save_char(bufptr, *str++);
+		bufptr = save_char(bufptr, *str);
+	    }
+	} else if (str[0] == ':') {
+	    bufptr = save_char(bufptr, '\\');
+	    bufptr = save_char(bufptr, '0');
+	    bufptr = save_char(bufptr, '7');
+	    bufptr = save_char(bufptr, '2');
+	} else if (str[0] == '\\') {
+	    if (str[1] == '\0' || (str + 1) == trimmed) {
+		bufptr = save_string(bufptr, "\\134");
+		++str;
+	    } else if (str[1] == '^') {
+		bufptr = save_string(bufptr, "\\136");
+		++str;
+	    } else if (str[1] == ',') {
+		bufptr = save_char(bufptr, *++str);
+	    } else {
+		int xx1;
+
+		bufptr = save_char(bufptr, *str++);
+		xx1 = *str;
+		if (_nc_strict_bsd) {
+
+		    if (isoctal(UChar(xx1))) {
+			int pad = 0;
+			int xx2;
+			int fix = 0;
+
+			if (!isoctal(UChar(str[1])))
+			    pad = 2;
+			else if (str[1] && !isoctal(UChar(str[2])))
+			    pad = 1;
+
+			/*
+			 * Test for "\0", "\00" or "\000" and transform those
+			 * into "\200".
+			 */
+			if (xx1 == '0'
+			    && ((pad == 2) || (str[1] == '0'))
+			    && ((pad >= 1) || (str[2] == '0'))) {
+			    xx2 = '2';
+			} else {
+			    xx2 = '0';
+			    pad = 0;	/* FIXME - optionally pad to 3 digits */
+			}
+			if (myfix < MAX_TC_FIXUPS) {
+			    fix = 3 - pad;
+			    fixups[myfix].ch = 0;
+			    fixups[myfix].offset = (int) (bufptr
+							  - my_string
+							  - 1);
+			}
+			while (pad-- > 0) {
+			    bufptr = save_char(bufptr, xx2);
+			    if (myfix < MAX_TC_FIXUPS) {
+				fixups[myfix].ch <<= 3;
+				fixups[myfix].ch |= (xx2 - '0');
+			    }
+			    xx2 = '0';
+			}
+			if (myfix < MAX_TC_FIXUPS) {
+			    int n;
+			    for (n = 0; n < fix; ++n) {
+				fixups[myfix].ch <<= 3;
+				fixups[myfix].ch |= (str[n] - '0');
+			    }
+			    if (fixups[myfix].ch < 32) {
+				++myfix;
+			    }
+			}
+		    } else if (strchr("E\\nrtbf", xx1) == 0) {
+			switch (xx1) {
+			case 'e':
+			    xx1 = 'E';
+			    break;
+			case 'l':
+			    xx1 = 'n';
+			    break;
+			case 's':
+			    bufptr = save_char(bufptr, '0');
+			    bufptr = save_char(bufptr, '4');
+			    xx1 = '0';
+			    break;
+			case ':':
+			    /*
+			     * Note: termcap documentation claims that ":"
+			     * must be escaped as "\072", however the
+			     * documentation is incorrect - read the code.
+			     * The replacement does not work reliably,
+			     * so the advice is not helpful.
+			     */
+			    bufptr = save_char(bufptr, '0');
+			    bufptr = save_char(bufptr, '7');
+			    xx1 = '2';
+			    break;
+			default:
+			    /* should not happen, but handle this anyway */
+			    _nc_SPRINTF(octal, _nc_SLIMIT(sizeof(octal))
+					"%03o", UChar(xx1));
+			    bufptr = save_char(bufptr, octal[0]);
+			    bufptr = save_char(bufptr, octal[1]);
+			    xx1 = octal[2];
+			    break;
+			}
+		    }
+		} else {
+		    if (myfix < MAX_TC_FIXUPS && isoctal(UChar(xx1))) {
+			bool will_fix = TRUE;
+			int n;
+
+			fixups[myfix].ch = 0;
+			fixups[myfix].offset = (int) (bufptr - my_string - 1);
+			for (n = 0; n < 3; ++n) {
+			    if (isoctal(str[n])) {
+				octal_fixup(myfix, str[n]);
+			    } else {
+				will_fix = FALSE;
+				break;
+			    }
+			}
+			if (will_fix && (fixups[myfix].ch < 32))
+			    ++myfix;
+		    }
+		}
+		bufptr = save_char(bufptr, xx1);
+	    }
+	} else if (str[0] == '$' && str[1] == '<') {	/* discard padding */
+	    str += 2;
+	    while (isdigit(UChar(*str))
+		   || *str == '.'
+		   || *str == '*'
+		   || *str == '/'
+		   || *str == '>')
+		str++;
+	    --str;
+	} else if (sscanf(str,
+			  "[%%?%%p1%%{8}%%<%%t%d%%p1%%d%%e%%p1%%{16}%%<%%t%d%%p1%%{8}%%-%%d%%e%d;5;%%p1%%d%%;m",
+			  &in0, &in1, &in2) == 3
+		   && ((in0 == 4 && in1 == 10 && in2 == 48)
+		       || (in0 == 3 && in1 == 9 && in2 == 38))) {
+	    /* dumb-down an optimized case from xterm-256color for termcap */
+	    if ((str = strstr(str, ";m")) == 0)
+		break;		/* cannot happen */
+	    ++str;
+	    if (in2 == 48) {
+		bufptr = save_string(bufptr, "[48;5;%dm");
+	    } else {
+		bufptr = save_string(bufptr, "[38;5;%dm");
+	    }
+	} else if (str[0] == '%' && str[1] == '%') {	/* escaped '%' */
+	    bufptr = save_string(bufptr, "%%");
+	    ++str;
+	} else if (*str != '%' || (parameterized < 1)) {
+	    bufptr = save_char(bufptr, *str);
+	} else if (sscanf(str, "%%?%%{%d}%%>%%t%%{%d}%%+%%;", &c1, &c2) == 2) {
+	    str = strchr(str, ';');
+	    bufptr = save_tc_inequality(bufptr, c1, c2);
+	} else if (sscanf(str, "%%?%%{%d}%%>%%t%%'%c'%%+%%;", &c1, &ch2) == 2) {
+	    str = strchr(str, ';');
+	    bufptr = save_tc_inequality(bufptr, c1, ch2);
+	} else if (sscanf(str, "%%?%%'%c'%%>%%t%%{%d}%%+%%;", &ch1, &c2) == 2) {
+	    str = strchr(str, ';');
+	    bufptr = save_tc_inequality(bufptr, ch1, c2);
+	} else if (sscanf(str, "%%?%%'%c'%%>%%t%%'%c'%%+%%;", &ch1, &ch2) == 2) {
+	    str = strchr(str, ';');
+	    bufptr = save_tc_inequality(bufptr, ch1, ch2);
+	} else if ((len = bcd_expression(str)) != 0) {
+	    str += len;
+	    bufptr = save_string(bufptr, "%B");
+	} else if ((sscanf(str, "%%{%d}%%+%%%c", &c1, &ch2) == 2
+		    || sscanf(str, "%%'%c'%%+%%%c", &ch1, &ch2) == 2)
+		   && ch2 == 'c'
+		   && (cp = strchr(str, '+'))) {
+	    str = cp + 2;
+	    bufptr = save_string(bufptr, "%+");
+
+	    if (ch1)
+		c1 = ch1;
+	    bufptr = save_tc_char(bufptr, c1);
+	}
+	/* FIXME: this "works" for 'delta' */
+	else if (strncmp(str, "%{2}%*%-", (size_t) 8) == 0) {
+	    str += 7;
+	    bufptr = save_string(bufptr, "%D");
+	} else if (strncmp(str, "%{96}%^", (size_t) 7) == 0) {
+	    str += 6;
+	    if (saw_m++ == 0) {
+		bufptr = save_string(bufptr, "%n");
+	    }
+	} else if (strncmp(str, "%{127}%^", (size_t) 8) == 0) {
+	    str += 7;
+	    if (saw_n++ == 0) {
+		bufptr = save_string(bufptr, "%m");
+	    }
+	} else {		/* cm-style format element */
+	    str++;
+	    switch (*str) {
+	    case '%':
+		bufptr = save_char(bufptr, '%');
+		break;
+
+	    case '0':
+	    case '1':
+	    case '2':
+	    case '3':
+	    case '4':
+	    case '5':
+	    case '6':
+	    case '7':
+	    case '8':
+	    case '9':
+		bufptr = save_char(bufptr, '%');
+		ch1 = 0;
+		ch2 = 0;
+		digits = 0;
+		while (isdigit(UChar(*str))) {
+		    if (++digits > 2) {
+			syntax_error = TRUE;
+			break;
+		    }
+		    ch2 = ch1;
+		    ch1 = *str++;
+		    if (digits == 2 && ch2 != '0') {
+			syntax_error = TRUE;
+			break;
+		    } else if (_nc_strict_bsd) {
+			if (ch1 > '3') {
+			    syntax_error = TRUE;
+			    break;
+			}
+		    } else {
+			bufptr = save_char(bufptr, ch1);
+		    }
+		}
+		if (syntax_error)
+		    break;
+		/*
+		 * Convert %02 to %2 and %03 to %3
+		 */
+		if (ch2 == '0' && !_nc_strict_bsd) {
+		    ch2 = 0;
+		    bufptr[-2] = bufptr[-1];
+		    *--bufptr = 0;
+		}
+		if (_nc_strict_bsd) {
+		    if (ch2 != 0 && ch2 != '0') {
+			syntax_error = TRUE;
+		    } else if (ch1 < '2') {
+			ch1 = 'd';
+		    }
+		    bufptr = save_char(bufptr, ch1);
+		}
+		if (strchr("oxX.", *str)) {
+		    syntax_error = TRUE;	/* termcap doesn't have octal, hex */
+		}
+		break;
+
+	    case 'd':
+		bufptr = save_string(bufptr, "%d");
+		break;
+
+	    case 'c':
+		bufptr = save_string(bufptr, "%.");
+		break;
+
+		/*
+		 * %s isn't in termcap, but it is convenient to pass it through
+		 * so we can represent things like terminfo pfkey strings in
+		 * termcap notation.
+		 */
+	    case 's':
+		if (_nc_strict_bsd) {
+		    syntax_error = TRUE;
+		} else {
+		    bufptr = save_string(bufptr, "%s");
+		}
+		break;
+
+	    case 'p':
+		str++;
+		if (*str == '1')
+		    seenone = 1;
+		else if (*str == '2') {
+		    if (!seenone && !seentwo) {
+			bufptr = save_string(bufptr, "%r");
+			seentwo++;
+		    }
+		} else if (*str >= '3') {
+		    syntax_error = TRUE;
+		}
+		break;
+
+	    case 'i':
+		bufptr = save_string(bufptr, "%i");
+		break;
+
+	    default:
+		bufptr = save_char(bufptr, *str);
+		syntax_error = TRUE;
+		break;
+	    }			/* endswitch (*str) */
+	}			/* endelse (*str == '%') */
+
+	/*
+	 * 'str' always points to the end of what was scanned in this step,
+	 * but that may not be the end of the string.
+	 */
+	assert(str != 0);
+	if (str == 0 || *str == '\0')
+	    break;
+
+    }				/* endwhile (*str) */
+
+    if (!syntax_error &&
+	myfix > 0 &&
+	((int) strlen(my_string) - (4 * myfix)) < MIN_TC_FIXUPS) {
+	while (--myfix >= 0) {
+	    char *p = fixups[myfix].offset + my_string;
+	    *p++ = '^';
+	    *p++ = (char) (fixups[myfix].ch | '@');
+	    while ((p[0] = p[2]) != '\0') {
+		++p;
+	    }
+	}
+    }
+
+    DEBUG_THIS(("... _nc_infotocap %s",
+		syntax_error
+		? "<ERR>"
+		: _nc_visbuf(my_string)));
+
+    return (syntax_error ? NULL : my_string);
+}
+
+#ifdef MAIN
+
+int curr_line;
+
+int
+main(int argc, char *argv[])
+{
+    int c, tc = FALSE;
+
+    while ((c = getopt(argc, argv, "c")) != EOF)
+	switch (c) {
+	case 'c':
+	    tc = TRUE;
+	    break;
+	}
+
+    curr_line = 0;
+    for (;;) {
+	char buf[BUFSIZ];
+
+	++curr_line;
+	if (fgets(buf, sizeof(buf), stdin) == 0)
+	    break;
+	buf[strlen(buf) - 1] = '\0';
+	_nc_set_source(buf);
+
+	if (tc) {
+	    char *cp = _nc_infotocap("to termcap", buf, 1);
+
+	    if (cp)
+		(void) fputs(cp, stdout);
+	} else
+	    (void) fputs(_nc_captoinfo("to terminfo", buf, 1), stdout);
+	(void) putchar('\n');
+    }
+    return (0);
+}
+#endif /* MAIN */
+
+#if NO_LEAKS
+NCURSES_EXPORT(void)
+_nc_captoinfo_leaks(void)
+{
+    if (my_string != 0) {
+	FreeAndNull(my_string);
+    }
+    my_length = 0;
+}
+#endif
diff --git a/ncurses/tinfo/comp_error.c b/ncurses/tinfo/comp_error.c
new file mode 100644
index 0000000..48f4878
--- /dev/null
+++ b/ncurses/tinfo/comp_error.c
@@ -0,0 +1,168 @@
+/****************************************************************************
+ * Copyright 2019,2020 Thomas E. Dickey                                     *
+ * Copyright 1998-2012,2016 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ ****************************************************************************/
+
+/*
+ *	comp_error.c -- Error message routines
+ *
+ */
+
+#include <curses.priv.h>
+
+#include <tic.h>
+
+MODULE_ID("$Id: comp_error.c,v 1.40 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT_VAR(bool) _nc_suppress_warnings = FALSE;
+NCURSES_EXPORT_VAR(int) _nc_curr_line = 0; /* current line # in input */
+NCURSES_EXPORT_VAR(int) _nc_curr_col = 0; /* current column # in input */
+
+#define SourceName	_nc_globals.comp_sourcename
+#define TermType	_nc_globals.comp_termtype
+
+NCURSES_EXPORT(const char *)
+_nc_get_source(void)
+{
+    return SourceName;
+}
+
+NCURSES_EXPORT(void)
+_nc_set_source(const char *const name)
+{
+    FreeIfNeeded(SourceName);
+    SourceName = strdup(name);
+}
+
+NCURSES_EXPORT(void)
+_nc_set_type(const char *const name)
+{
+#define MY_SIZE (size_t) MAX_NAME_SIZE
+    if (TermType == 0)
+	TermType = typeMalloc(char, MY_SIZE + 1);
+    if (TermType != 0) {
+	TermType[0] = '\0';
+	if (name) {
+	    _nc_STRNCAT(TermType, name, MY_SIZE, MY_SIZE);
+	}
+    }
+}
+
+NCURSES_EXPORT(void)
+_nc_get_type(char *name)
+{
+#if NO_LEAKS
+    if (name == 0 && TermType != 0) {
+	FreeAndNull(TermType);
+	return;
+    }
+#endif
+    if (name != 0)
+	_nc_STRCPY(name, TermType != 0 ? TermType : "", MAX_NAME_SIZE);
+}
+
+static NCURSES_INLINE void
+where_is_problem(void)
+{
+    fprintf(stderr, "\"%s\"", SourceName ? SourceName : "?");
+    if (_nc_curr_line >= 0)
+	fprintf(stderr, ", line %d", _nc_curr_line);
+    if (_nc_curr_col >= 0)
+	fprintf(stderr, ", col %d", _nc_curr_col);
+    if (TermType != 0 && TermType[0] != '\0')
+	fprintf(stderr, ", terminal '%s'", TermType);
+    fputc(':', stderr);
+    fputc(' ', stderr);
+}
+
+NCURSES_EXPORT(void)
+_nc_warning(const char *const fmt, ...)
+{
+    va_list argp;
+
+    if (_nc_suppress_warnings)
+	return;
+
+    where_is_problem();
+    va_start(argp, fmt);
+    vfprintf(stderr, fmt, argp);
+    fprintf(stderr, "\n");
+    va_end(argp);
+}
+
+NCURSES_EXPORT(void)
+_nc_err_abort(const char *const fmt, ...)
+{
+    va_list argp;
+
+    where_is_problem();
+    va_start(argp, fmt);
+    vfprintf(stderr, fmt, argp);
+    fprintf(stderr, "\n");
+    va_end(argp);
+    exit(EXIT_FAILURE);
+}
+
+NCURSES_EXPORT(void)
+_nc_syserr_abort(const char *const fmt, ...)
+{
+    va_list argp;
+
+    where_is_problem();
+    va_start(argp, fmt);
+    vfprintf(stderr, fmt, argp);
+    fprintf(stderr, "\n");
+    va_end(argp);
+
+#if defined(TRACE) || !defined(NDEBUG)
+    /* If we're debugging, try to show where the problem occurred - this
+     * will dump core.
+     */
+#ifndef USE_ROOT_ENVIRON
+    if (getuid() != ROOT_UID)
+#endif
+	abort();
+#endif
+    /* Dumping core in production code is not a good idea.
+     */
+    exit(EXIT_FAILURE);
+}
+
+#if NO_LEAKS
+NCURSES_EXPORT(void)
+_nc_comp_error_leaks(void)
+{
+    FreeAndNull(SourceName);
+    FreeAndNull(TermType);
+}
+#endif
diff --git a/ncurses/tinfo/comp_expand.c b/ncurses/tinfo/comp_expand.c
new file mode 100644
index 0000000..724283c
--- /dev/null
+++ b/ncurses/tinfo/comp_expand.c
@@ -0,0 +1,228 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                    1998                        *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+
+#include <ctype.h>
+#include <tic.h>
+
+MODULE_ID("$Id: comp_expand.c,v 1.34 2021/09/04 10:29:15 tom Exp $")
+
+#if 0
+#define DEBUG_THIS(p) DEBUG(9, p)
+#else
+#define DEBUG_THIS(p)		/* nothing */
+#endif
+
+static int
+trailing_spaces(const char *src)
+{
+    while (*src == ' ')
+	src++;
+    return *src == 0;
+}
+
+/* this deals with differences over whether 0x7f and 0x80..0x9f are controls */
+#define REALPRINT(s) (UChar(*(s)) < 127 && isprint(UChar(*(s))))
+
+#define P_LIMIT(p)   (length - (size_t)(p))
+
+NCURSES_EXPORT(char *)
+_nc_tic_expand(const char *srcp, bool tic_format, int numbers)
+{
+    static char *buffer;
+    static size_t length;
+
+    int bufp;
+    const char *str = VALID_STRING(srcp) ? srcp : "\0\0";
+    size_t need = (2 + strlen(str)) * 4;
+    int ch;
+    int octals = 0;
+    struct {
+	int ch;
+	int offset;
+    } fixups[MAX_TC_FIXUPS];
+
+    if (srcp == 0) {
+#if NO_LEAKS
+	if (buffer != 0) {
+	    FreeAndNull(buffer);
+	    length = 0;
+	}
+#endif
+	return 0;
+    }
+    if (buffer == 0 || need > length) {
+	if ((buffer = typeRealloc(char, length = need, buffer)) == 0)
+	      return 0;
+    }
+
+    DEBUG_THIS(("_nc_tic_expand %s:%s:%s",
+		tic_format ? "ti" : "tc",
+		numbers ? "#" : "",
+		_nc_visbuf(srcp)));
+    bufp = 0;
+    while ((ch = UChar(*str)) != 0) {
+	if (ch == '%' && REALPRINT(str + 1)) {
+	    buffer[bufp++] = *str++;
+	    /*
+	     * Though the character literals are more compact, most
+	     * terminal descriptions use numbers and are not easy
+	     * to read in character-literal form.
+	     */
+	    switch (numbers) {
+	    case -1:
+		if (str[0] == S_QUOTE
+		    && str[1] != '\\'
+		    && REALPRINT(str + 1)
+		    && str[2] == S_QUOTE) {
+		    _nc_SPRINTF(buffer + bufp, _nc_SLIMIT(P_LIMIT(bufp))
+				"{%d}", str[1]);
+		    bufp += (int) strlen(buffer + bufp);
+		    str += 2;
+		} else {
+		    buffer[bufp++] = *str;
+		}
+		break;
+		/*
+		 * If we have a "%{number}", try to translate it into
+		 * a "%'char'" form, since that will run a little faster
+		 * when we're interpreting it.  Also, having one form
+		 * for the constant makes it simpler to compare terminal
+		 * descriptions.
+		 */
+	    case 1:
+		if (str[0] == L_BRACE
+		    && isdigit(UChar(str[1]))) {
+		    char *dst = 0;
+		    long value = strtol(str + 1, &dst, 0);
+		    if (dst != 0
+			&& *dst == R_BRACE
+			&& value < 127
+			&& value != '\\'	/* FIXME */
+			&& isprint((int) value)) {
+			ch = (int) value;
+			buffer[bufp++] = S_QUOTE;
+			if (ch == '\\'
+			    || ch == S_QUOTE)
+			    buffer[bufp++] = '\\';
+			buffer[bufp++] = (char) ch;
+			buffer[bufp++] = S_QUOTE;
+			str = dst;
+		    } else {
+			buffer[bufp++] = *str;
+		    }
+		} else {
+		    buffer[bufp++] = *str;
+		}
+		break;
+	    default:
+		if (*str == ',')	/* minitel1 uses this */
+		    buffer[bufp++] = '\\';
+		buffer[bufp++] = *str;
+		break;
+	    }
+	} else if (ch == 128) {
+	    buffer[bufp++] = '\\';
+	    buffer[bufp++] = '0';
+	} else if (ch == '\033') {
+	    buffer[bufp++] = '\\';
+	    buffer[bufp++] = 'E';
+	} else if (ch == '\\' && tic_format && (str == srcp || str[-1] != '^')) {
+	    buffer[bufp++] = '\\';
+	    buffer[bufp++] = '\\';
+	} else if (ch == ' ' && tic_format && (str == srcp ||
+					       trailing_spaces(str))) {
+	    buffer[bufp++] = '\\';
+	    buffer[bufp++] = 's';
+	} else if ((ch == ',' || ch == '^') && tic_format) {
+	    buffer[bufp++] = '\\';
+	    buffer[bufp++] = (char) ch;
+	} else if (REALPRINT(str)
+		   && (ch != ','
+		       && !(ch == ':' && !tic_format)
+		       && !(ch == '!' && !tic_format)
+		       && ch != '^'))
+	    buffer[bufp++] = (char) ch;
+	else if (ch == '\r') {
+	    buffer[bufp++] = '\\';
+	    buffer[bufp++] = 'r';
+	} else if (ch == '\n') {
+	    buffer[bufp++] = '\\';
+	    buffer[bufp++] = 'n';
+	}
+#define UnCtl(c) ((c) + '@')
+	else if (UChar(ch) < 32
+		 && isdigit(UChar(str[1]))) {
+	    _nc_SPRINTF(&buffer[bufp], _nc_SLIMIT(P_LIMIT(bufp))
+			"^%c", UnCtl(ch));
+	    bufp += 2;
+	} else {
+	    _nc_SPRINTF(&buffer[bufp], _nc_SLIMIT(P_LIMIT(bufp))
+			"\\%03o", ch);
+	    if ((octals < MAX_TC_FIXUPS) &&
+		((tic_format && (ch == 127)) || ch < 32)) {
+		fixups[octals].ch = UChar(ch);
+		fixups[octals].offset = bufp;
+		++octals;
+	    }
+	    bufp += 4;
+	}
+
+	str++;
+    }
+
+    buffer[bufp] = '\0';
+
+    /*
+     * If most of a short string is ASCII control characters, reformat the
+     * string to show those in up-arrow format.  For longer strings, it is
+     * more likely that the characters are just binary coding.
+     *
+     * If we're formatting termcap, just use the shorter format (up-arrows).
+     */
+    if (octals != 0 && (!tic_format || (bufp - (4 * octals)) < MIN_TC_FIXUPS)) {
+	while (--octals >= 0) {
+	    char *p = buffer + fixups[octals].offset;
+	    *p++ = '^';
+	    *p++ = (char) ((fixups[octals].ch == 127)
+			   ? '?'
+			   : (fixups[octals].ch + (int) '@'));
+	    while ((p[0] = p[2]) != 0) {
+		++p;
+	    }
+	}
+    }
+    DEBUG_THIS(("... %s", _nc_visbuf(buffer)));
+    return (buffer);
+}
diff --git a/ncurses/tinfo/comp_hash.c b/ncurses/tinfo/comp_hash.c
new file mode 100644
index 0000000..80755f2
--- /dev/null
+++ b/ncurses/tinfo/comp_hash.c
@@ -0,0 +1,150 @@
+/****************************************************************************
+ * Copyright 2019,2020 Thomas E. Dickey                                     *
+ * Copyright 1998-2008,2009 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ ****************************************************************************/
+
+/*
+ *	comp_hash.c --- Routines to deal with the hashtable of capability
+ *			names.
+ *
+ */
+
+#define USE_TERMLIB 1
+#include <curses.priv.h>
+
+#include <tic.h>
+#include <hashsize.h>
+
+MODULE_ID("$Id: comp_hash.c,v 1.53 2020/02/02 23:34:34 tom Exp $")
+
+/*
+ * Finds the entry for the given string in the hash table if present.
+ * Returns a pointer to the entry in the table or 0 if not found.
+ */
+/* entrypoint used by tack 1.07 */
+NCURSES_EXPORT(struct name_table_entry const *)
+_nc_find_entry(const char *string,
+	       const HashValue * hash_table)
+{
+    bool termcap = (hash_table != _nc_get_hash_table(FALSE));
+    const HashData *data = _nc_get_hash_info(termcap);
+    int hashvalue;
+    struct name_table_entry const *ptr = 0;
+    struct name_table_entry const *real_table;
+
+    hashvalue = data->hash_of(string);
+
+    if (hashvalue >= 0
+	&& (unsigned) hashvalue < data->table_size
+	&& data->table_data[hashvalue] >= 0) {
+
+	real_table = _nc_get_table(termcap);
+	ptr = real_table + data->table_data[hashvalue];
+	while (!data->compare_names(ptr->nte_name, string)) {
+	    if (ptr->nte_link < 0) {
+		ptr = 0;
+		break;
+	    }
+	    ptr = real_table + (ptr->nte_link
+				+ data->table_data[data->table_size]);
+	}
+    }
+
+    return (ptr);
+}
+
+/*
+ * Finds the entry for the given name with the given type in the given table if
+ * present (as distinct from _nc_find_entry, which finds the last entry
+ * regardless of type).
+ *
+ * Returns a pointer to the entry in the table or 0 if not found.
+ */
+NCURSES_EXPORT(struct name_table_entry const *)
+_nc_find_type_entry(const char *string,
+		    int type,
+		    bool termcap)
+{
+    struct name_table_entry const *ptr = NULL;
+    const HashData *data = _nc_get_hash_info(termcap);
+    int hashvalue = data->hash_of(string);
+
+    if (hashvalue >= 0
+	&& (unsigned) hashvalue < data->table_size
+	&& data->table_data[hashvalue] >= 0) {
+	const struct name_table_entry *const table = _nc_get_table(termcap);
+
+	ptr = table + data->table_data[hashvalue];
+	while (ptr->nte_type != type
+	       || !data->compare_names(ptr->nte_name, string)) {
+	    if (ptr->nte_link < 0) {
+		ptr = 0;
+		break;
+	    }
+	    ptr = table + (ptr->nte_link + data->table_data[data->table_size]);
+	}
+    }
+
+    return ptr;
+}
+
+#if NCURSES_XNAMES
+NCURSES_EXPORT(struct user_table_entry const *)
+_nc_find_user_entry(const char *string)
+{
+    const HashData *data = _nc_get_hash_user();
+    int hashvalue;
+    struct user_table_entry const *ptr = 0;
+    struct user_table_entry const *real_table;
+
+    hashvalue = data->hash_of(string);
+
+    if (hashvalue >= 0
+	&& (unsigned) hashvalue < data->table_size
+	&& data->table_data[hashvalue] >= 0) {
+
+	real_table = _nc_get_userdefs_table();
+	ptr = real_table + data->table_data[hashvalue];
+	while (!data->compare_names(ptr->ute_name, string)) {
+	    if (ptr->ute_link < 0) {
+		ptr = 0;
+		break;
+	    }
+	    ptr = real_table + (ptr->ute_link
+				+ data->table_data[data->table_size]);
+	}
+    }
+
+    return (ptr);
+}
+#endif /* NCURSES_XNAMES */
diff --git a/ncurses/tinfo/comp_parse.c b/ncurses/tinfo/comp_parse.c
new file mode 100644
index 0000000..53bdf8b
--- /dev/null
+++ b/ncurses/tinfo/comp_parse.c
@@ -0,0 +1,771 @@
+/****************************************************************************
+ * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ ****************************************************************************/
+
+/*
+ *	comp_parse.c -- parser driver loop and use handling.
+ *
+ *	Use this code by calling _nc_read_entry_source() on as many source
+ *	files as you like (either terminfo or termcap syntax).  If you
+ *	want use-resolution, call _nc_resolve_uses2().  To free the list
+ *	storage, do _nc_free_entries().
+ */
+
+#include <curses.priv.h>
+
+#include <ctype.h>
+
+#include <tic.h>
+
+MODULE_ID("$Id: comp_parse.c,v 1.131 2022/10/23 13:15:58 tom Exp $")
+
+static void sanity_check2(TERMTYPE2 *, bool);
+NCURSES_IMPEXP void (NCURSES_API *_nc_check_termtype2) (TERMTYPE2 *, bool) = sanity_check2;
+
+static void fixup_acsc(TERMTYPE2 *, int);
+
+static void
+enqueue(ENTRY * ep)
+/* add an entry to the in-core list */
+{
+    ENTRY *newp;
+
+    DEBUG(2, (T_CALLED("enqueue(ep=%p)"), (void *) ep));
+
+    newp = _nc_copy_entry(ep);
+    if (newp == 0)
+	_nc_err_abort(MSG_NO_MEMORY);
+
+    newp->last = _nc_tail;
+    _nc_tail = newp;
+
+    newp->next = 0;
+    if (newp->last)
+	newp->last->next = newp;
+    DEBUG(2, (T_RETURN("")));
+}
+
+#define NAMEBUFFER_SIZE (MAX_NAME_SIZE + 2)
+
+static char *
+force_bar(char *dst, char *src)
+{
+    if (strchr(src, '|') == 0) {
+	size_t len = strlen(src);
+	if (len > MAX_NAME_SIZE)
+	    len = MAX_NAME_SIZE;
+	_nc_STRNCPY(dst, src, MAX_NAME_SIZE);
+	_nc_STRCPY(dst + len, "|", NAMEBUFFER_SIZE - len);
+	src = dst;
+    }
+    return src;
+}
+#define ForceBar(dst, src) ((strchr(src, '|') == 0) ? force_bar(dst, src) : src)
+
+#if NCURSES_USE_TERMCAP && NCURSES_XNAMES
+static char *
+skip_index(char *name)
+{
+    char *bar = strchr(name, '|');
+
+    if (bar != 0 && (bar - name) == 2)
+	name = bar + 1;
+
+    return name;
+}
+#endif
+
+static bool
+check_collisions(char *n1, char *n2, int counter)
+{
+    char *pstart, *qstart, *pend, *qend;
+    char nc1[NAMEBUFFER_SIZE];
+    char nc2[NAMEBUFFER_SIZE];
+
+    n1 = ForceBar(nc1, n1);
+    n2 = ForceBar(nc2, n2);
+
+#if NCURSES_USE_TERMCAP && NCURSES_XNAMES
+    if ((_nc_syntax == SYN_TERMCAP) && _nc_user_definable) {
+	n1 = skip_index(n1);
+	n2 = skip_index(n2);
+    }
+#endif
+
+    for (pstart = n1; (pend = strchr(pstart, '|')); pstart = pend + 1) {
+	for (qstart = n2; (qend = strchr(qstart, '|')); qstart = qend + 1) {
+	    if ((pend - pstart == qend - qstart)
+		&& memcmp(pstart, qstart, (size_t) (pend - pstart)) == 0) {
+		if (counter > 0)
+		    (void) fprintf(stderr, "Name collision '%.*s' between\n",
+				   (int) (pend - pstart), pstart);
+		return (TRUE);
+	    }
+	}
+    }
+
+    return (FALSE);
+}
+
+static char *
+next_name(char *name)
+{
+    if (*name != '\0')
+	++name;
+    return name;
+}
+
+static char *
+name_ending(char *name)
+{
+    if (*name == '\0') {
+	name = 0;
+    } else {
+	while (*name != '\0' && *name != '|')
+	    ++name;
+    }
+    return name;
+}
+
+/*
+ * Essentially, find the conflict reported in check_collisions() and remove
+ * it from the second name, unless that happens to be the last alias.
+ */
+static bool
+remove_collision(char *n1, char *n2)
+{
+    char *p2 = n2;
+    char *pstart, *qstart, *pend, *qend;
+    bool removed = FALSE;
+
+#if NCURSES_USE_TERMCAP && NCURSES_XNAMES
+    if ((_nc_syntax == SYN_TERMCAP) && _nc_user_definable) {
+	n1 = skip_index(n1);
+	p2 = n2 = skip_index(n2);
+    }
+#endif
+
+    for (pstart = n1; (pend = name_ending(pstart)); pstart = next_name(pend)) {
+	for (qstart = n2; (qend = name_ending(qstart)); qstart = next_name(qend)) {
+	    if ((pend - pstart == qend - qstart)
+		&& memcmp(pstart, qstart, (size_t) (pend - pstart)) == 0) {
+		if (qstart != p2 || *qend == '|') {
+		    if (*qend == '|')
+			++qend;
+		    while ((*qstart++ = *qend++) != '\0') ;
+		    fprintf(stderr, "...now\t%s\n", p2);
+		    removed = TRUE;
+		} else {
+		    fprintf(stderr, "Cannot remove alias '%.*s'\n",
+			    (int) (qend - qstart), qstart);
+		}
+		break;
+	    }
+	}
+    }
+
+    return removed;
+}
+
+/* do any of the aliases in a pair of terminal names match? */
+NCURSES_EXPORT(bool)
+_nc_entry_match(char *n1, char *n2)
+{
+    return check_collisions(n1, n2, 0);
+}
+
+/****************************************************************************
+ *
+ * Entry compiler and resolution logic
+ *
+ ****************************************************************************/
+
+NCURSES_EXPORT(void)
+_nc_read_entry_source(FILE *fp, char *buf,
+		      int literal, bool silent,
+		      bool(*hook) (ENTRY *))
+/* slurp all entries in the given file into core */
+{
+    ENTRY thisentry;
+    bool oldsuppress = _nc_suppress_warnings;
+    int immediate = 0;
+
+    DEBUG(2,
+	  (T_CALLED("_nc_read_entry_source("
+		    "file=%p, buf=%p, literal=%d, silent=%d, hook=%#"
+		    PRIxPTR ")"),
+	   (void *) fp, buf, literal, silent, (intptr_t) hook));
+
+    if (silent)
+	_nc_suppress_warnings = TRUE;	/* shut the lexer up, too */
+
+    _nc_reset_input(fp, buf);
+    for (;;) {
+	memset(&thisentry, 0, sizeof(thisentry));
+	if (_nc_parse_entry(&thisentry, literal, silent) == ERR)
+	    break;
+	if (!isalnum(UChar(thisentry.tterm.term_names[0])))
+	    _nc_err_abort("terminal names must start with letter or digit");
+
+	/*
+	 * This can be used for immediate compilation of entries with no "use="
+	 * references to disk.  That avoids consuming a lot of memory when the
+	 * resolution code could fetch entries off disk.
+	 */
+	if (hook != NULLHOOK && (*hook) (&thisentry)) {
+	    immediate++;
+	} else {
+	    enqueue(&thisentry);
+	    /*
+	     * The enqueued entry is copied with _nc_copy_termtype(), so we can
+	     * free some of the data from thisentry, i.e., the arrays.
+	     */
+	    FreeIfNeeded(thisentry.tterm.Booleans);
+	    FreeIfNeeded(thisentry.tterm.Numbers);
+	    FreeIfNeeded(thisentry.tterm.Strings);
+	    FreeIfNeeded(thisentry.tterm.str_table);
+#if NCURSES_XNAMES
+	    FreeIfNeeded(thisentry.tterm.ext_Names);
+	    FreeIfNeeded(thisentry.tterm.ext_str_table);
+#endif
+	}
+    }
+
+    if (_nc_tail) {
+	/* set up the head pointer */
+	for (_nc_head = _nc_tail; _nc_head->last; _nc_head = _nc_head->last)
+	    continue;
+
+	DEBUG(2, ("head = %s", _nc_head->tterm.term_names));
+	DEBUG(2, ("tail = %s", _nc_tail->tterm.term_names));
+    }
+#ifdef TRACE
+    else if (!immediate)
+	DEBUG(2, ("no entries parsed"));
+#endif
+
+    _nc_suppress_warnings = oldsuppress;
+    DEBUG(2, (T_RETURN("")));
+}
+
+#if 0 && NCURSES_XNAMES
+static unsigned
+find_capname(TERMTYPE2 *p, const char *name)
+{
+    unsigned num_names = NUM_EXT_NAMES(p);
+    unsigned n;
+    if (name != 0) {
+	for (n = 0; n < num_names; ++n) {
+	    if (!strcmp(p->ext_Names[n], name))
+		break;
+	}
+    } else {
+	n = num_names + 1;
+    }
+    return n;
+}
+
+static int
+extended_captype(TERMTYPE2 *p, unsigned which)
+{
+    int result = UNDEF;
+    unsigned limit = 0;
+    limit += p->ext_Booleans;
+    if (limit != 0 && which < limit) {
+	result = BOOLEAN;
+    } else {
+	limit += p->ext_Numbers;
+	if (limit != 0 && which < limit) {
+	    result = NUMBER;
+	} else {
+	    limit += p->ext_Strings;
+	    if (limit != 0 && which < limit) {
+		result = ((p->Strings[STRCOUNT + which] != CANCELLED_STRING)
+			  ? STRING
+			  : CANCEL);
+	    } else if (which >= limit) {
+		result = CANCEL;
+	    }
+	}
+    }
+    return result;
+}
+
+static const char *
+name_of_captype(int which)
+{
+    const char *result = "?";
+    switch (which) {
+    case BOOLEAN:
+	result = "boolean";
+	break;
+    case NUMBER:
+	result = "number";
+	break;
+    case STRING:
+	result = "string";
+	break;
+    }
+    return result;
+}
+
+#define valid_TERMTYPE2(p) \
+	((p) != 0 && \
+	 (p)->term_names != 0 && \
+	 (p)->ext_Names != 0)
+
+/*
+ * Disallow changing the type of an extended capability when doing a "use"
+ * if one or the other is a string.
+ */
+static int
+invalid_merge(TERMTYPE2 *to, TERMTYPE2 *from)
+{
+    int rc = FALSE;
+    if (valid_TERMTYPE2(to)
+	&& valid_TERMTYPE2(from)) {
+	char *to_name = _nc_first_name(to->term_names);
+	char *from_name = strdup(_nc_first_name(from->term_names));
+	unsigned num_names = NUM_EXT_NAMES(from);
+	unsigned n;
+
+	for (n = 0; n < num_names; ++n) {
+	    const char *capname = from->ext_Names[n];
+	    int tt = extended_captype(to, find_capname(to, capname));
+	    int tf = extended_captype(from, n);
+
+	    if (tt <= STRING
+		&& tf <= STRING
+		&& (tt == STRING) != (tf == STRING)) {
+		if (from_name != 0 && strcmp(to_name, from_name)) {
+		    _nc_warning("merge of %s to %s changes type of %s from %s to %s",
+				from_name,
+				to_name,
+				from->ext_Names[n],
+				name_of_captype(tf),
+				name_of_captype(tt));
+		} else {
+		    _nc_warning("merge of %s changes type of %s from %s to %s",
+				to_name,
+				from->ext_Names[n],
+				name_of_captype(tf),
+				name_of_captype(tt));
+		}
+		rc = TRUE;
+	    }
+	}
+	free(from_name);
+    }
+    return rc;
+}
+#define validate_merge(p, q) \
+	if (invalid_merge(&((p)->tterm), &((q)->tterm))) \
+		return FALSE
+#else
+#define validate_merge(p, q)	/* nothing */
+#endif
+
+NCURSES_EXPORT(int)
+_nc_resolve_uses2(bool fullresolve, bool literal)
+/* try to resolve all use capabilities */
+{
+    ENTRY *qp, *rp, *lastread = 0;
+    bool keepgoing;
+    unsigned i, j;
+    int unresolved, total_unresolved, multiples;
+
+    DEBUG(2, (T_CALLED("_nc_resolve_uses2")));
+
+    /*
+     * Check for multiple occurrences of the same name.
+     */
+    multiples = 0;
+    for_entry_list(qp) {
+	int matchcount = 0;
+
+	for_entry_list2(rp, qp->next) {
+	    if (qp > rp
+		&& check_collisions(qp->tterm.term_names,
+				    rp->tterm.term_names,
+				    matchcount + 1)) {
+		if (!matchcount++) {
+		    (void) fprintf(stderr, "\t%s\n", rp->tterm.term_names);
+		}
+		(void) fprintf(stderr, "and\t%s\n", qp->tterm.term_names);
+		if (!remove_collision(rp->tterm.term_names,
+				      qp->tterm.term_names)) {
+		    ++multiples;
+		}
+	    }
+	}
+    }
+    if (multiples > 0) {
+	DEBUG(2, (T_RETURN("false")));
+	return (FALSE);
+    }
+
+    DEBUG(2, ("NO MULTIPLE NAME OCCURRENCES"));
+
+    /*
+     * First resolution stage: compute link pointers corresponding to names.
+     */
+    total_unresolved = 0;
+    _nc_curr_col = -1;
+    for_entry_list(qp) {
+	unresolved = 0;
+	for (i = 0; i < qp->nuses; i++) {
+	    bool foundit;
+	    char *child = _nc_first_name(qp->tterm.term_names);
+	    char *lookfor = qp->uses[i].name;
+	    long lookline = qp->uses[i].line;
+
+	    if (lookfor == 0)
+		continue;
+
+	    foundit = FALSE;
+
+	    _nc_set_type(child);
+
+	    /* first, try to resolve from in-core records */
+	    for_entry_list(rp) {
+		if (rp != qp
+		    && _nc_name_match(rp->tterm.term_names, lookfor, "|")) {
+		    DEBUG(2, ("%s: resolving use=%s %p (in core)",
+			      child, lookfor, lookfor));
+
+		    qp->uses[i].link = rp;
+		    foundit = TRUE;
+
+		    /* verify that there are no earlier uses */
+		    for (j = 0; j < i; ++j) {
+			if (qp->uses[j].link != NULL
+			    && !strcmp(qp->uses[j].link->tterm.term_names,
+				       rp->tterm.term_names)) {
+			    _nc_warning("duplicate use=%s", lookfor);
+			    break;
+			}
+		    }
+		}
+	    }
+
+	    /* if that didn't work, try to merge in a compiled entry */
+	    if (!foundit) {
+		TERMTYPE2 thisterm;
+		char filename[PATH_MAX];
+
+		memset(&thisterm, 0, sizeof(thisterm));
+		if (_nc_read_entry2(lookfor, filename, &thisterm) == 1) {
+		    DEBUG(2, ("%s: resolving use=%s (compiled)",
+			      child, lookfor));
+
+		    TYPE_MALLOC(ENTRY, 1, rp);
+		    rp->tterm = thisterm;
+		    rp->nuses = 0;
+		    rp->next = lastread;
+		    lastread = rp;
+
+		    qp->uses[i].link = rp;
+		    foundit = TRUE;
+
+		    /* verify that there are no earlier uses */
+		    for (j = 0; j < i; ++j) {
+			if (qp->uses[j].link != NULL
+			    && !strcmp(qp->uses[j].link->tterm.term_names,
+				       rp->tterm.term_names)) {
+			    _nc_warning("duplicate use=%s", lookfor);
+			    break;
+			}
+		    }
+		}
+	    }
+
+	    /* no good, mark this one unresolvable and complain */
+	    if (!foundit) {
+		unresolved++;
+		total_unresolved++;
+
+		_nc_curr_line = (int) lookline;
+		_nc_warning("resolution of use=%s failed", lookfor);
+		qp->uses[i].link = 0;
+	    }
+	}
+    }
+    if (total_unresolved) {
+	/* free entries read in off disk */
+	_nc_free_entries(lastread);
+	DEBUG(2, (T_RETURN("false")));
+	return (FALSE);
+    }
+
+    DEBUG(2, ("NAME RESOLUTION COMPLETED OK"));
+
+    /*
+     * OK, at this point all (char *) references in `name' members
+     * have been successfully converted to (ENTRY *) pointers in
+     * `link' members.  Time to do the actual merges.
+     */
+    if (fullresolve) {
+	do {
+	    ENTRY merged;
+
+	    keepgoing = FALSE;
+
+	    for_entry_list(qp) {
+		if (qp->nuses > 0) {
+		    DEBUG(2, ("%s: attempting merge of %d entries",
+			      _nc_first_name(qp->tterm.term_names),
+			      qp->nuses));
+		    /*
+		     * If any of the use entries we're looking for is
+		     * incomplete, punt.  We'll catch this entry on a
+		     * subsequent pass.
+		     */
+		    for (i = 0; i < qp->nuses; i++) {
+			if (qp->uses[i].link
+			    && qp->uses[i].link->nuses) {
+			    DEBUG(2, ("%s: use entry %d unresolved",
+				      _nc_first_name(qp->tterm.term_names), i));
+			    goto incomplete;
+			}
+		    }
+
+		    /*
+		     * First, make sure there is no garbage in the
+		     * merge block.  As a side effect, copy into
+		     * the merged entry the name field and string
+		     * table pointer.
+		     */
+		    _nc_copy_termtype2(&(merged.tterm), &(qp->tterm));
+
+		    /*
+		     * Now merge in each use entry in the proper
+		     * (reverse) order.
+		     */
+		    for (; qp->nuses; qp->nuses--) {
+			int n = (int) (qp->nuses - 1);
+			validate_merge(&merged, qp->uses[n].link);
+			_nc_merge_entry(&merged, qp->uses[n].link);
+			free(qp->uses[n].name);
+		    }
+
+		    /*
+		     * Now merge in the original entry.
+		     */
+		    validate_merge(&merged, qp);
+		    _nc_merge_entry(&merged, qp);
+
+		    /*
+		     * Replace the original entry with the merged one.
+		     */
+		    FreeIfNeeded(qp->tterm.Booleans);
+		    FreeIfNeeded(qp->tterm.Numbers);
+		    FreeIfNeeded(qp->tterm.Strings);
+		    FreeIfNeeded(qp->tterm.str_table);
+#if NCURSES_XNAMES
+		    FreeIfNeeded(qp->tterm.ext_Names);
+		    FreeIfNeeded(qp->tterm.ext_str_table);
+#endif
+		    qp->tterm = merged.tterm;
+		    _nc_wrap_entry(qp, TRUE);
+
+		    /*
+		     * We know every entry is resolvable because name resolution
+		     * didn't bomb.  So go back for another pass.
+		     */
+		    /* FALLTHRU */
+		  incomplete:
+		    keepgoing = TRUE;
+		}
+	    }
+	} while
+	    (keepgoing);
+
+	DEBUG(2, ("MERGES COMPLETED OK"));
+    }
+
+    DEBUG(2, ("RESOLUTION FINISHED"));
+
+    if (fullresolve) {
+	_nc_curr_col = -1;
+	for_entry_list(qp) {
+	    _nc_curr_line = (int) qp->startline;
+	    _nc_set_type(_nc_first_name(qp->tterm.term_names));
+	    /*
+	     * tic overrides this function pointer to provide more verbose
+	     * checking.
+	     */
+	    if (_nc_check_termtype2 != sanity_check2) {
+		SCREEN *save_SP = SP;
+		SCREEN fake_sp;
+		TERMINAL fake_tm;
+		TERMINAL *save_tm = cur_term;
+
+		/*
+		 * Setup so that tic can use ordinary terminfo interface to
+		 * obtain capability information.
+		 */
+		memset(&fake_sp, 0, sizeof(fake_sp));
+		memset(&fake_tm, 0, sizeof(fake_tm));
+		fake_sp._term = &fake_tm;
+		TerminalType(&fake_tm) = qp->tterm;
+		_nc_set_screen(&fake_sp);
+		set_curterm(&fake_tm);
+
+		_nc_check_termtype2(&qp->tterm, literal);
+
+		/*
+		 * Checking calls tparm, which can allocate memory.  Fix leaks.
+		 */
+#define TPS(name) fake_tm.tparm_state.name
+		FreeAndNull(TPS(out_buff));
+		FreeAndNull(TPS(fmt_buff));
+#undef TPS
+
+		_nc_set_screen(save_SP);
+		set_curterm(save_tm);
+	    } else {
+		fixup_acsc(&qp->tterm, literal);
+	    }
+	}
+	DEBUG(2, ("SANITY CHECK FINISHED"));
+    }
+
+    DEBUG(2, (T_RETURN("true")));
+    return (TRUE);
+}
+
+/*
+ * This bit of legerdemain turns all the terminfo variable names into
+ * references to locations in the arrays Booleans, Numbers, and Strings ---
+ * precisely what's needed.
+ */
+
+#undef CUR
+#define CUR tp->
+
+static void
+fixup_acsc(TERMTYPE2 *tp, int literal)
+{
+    if (!literal) {
+	if (acs_chars == ABSENT_STRING
+	    && PRESENT(enter_alt_charset_mode)
+	    && PRESENT(exit_alt_charset_mode))
+	    acs_chars = strdup(VT_ACSC);
+    }
+}
+
+static void
+sanity_check2(TERMTYPE2 *tp, bool literal)
+{
+    if (!PRESENT(exit_attribute_mode)) {
+#ifdef __UNUSED__		/* this casts too wide a net */
+	bool terminal_entry = !strchr(tp->term_names, '+');
+	if (terminal_entry &&
+	    (PRESENT(set_attributes)
+	     || PRESENT(enter_standout_mode)
+	     || PRESENT(enter_underline_mode)
+	     || PRESENT(enter_blink_mode)
+	     || PRESENT(enter_bold_mode)
+	     || PRESENT(enter_dim_mode)
+	     || PRESENT(enter_secure_mode)
+	     || PRESENT(enter_protected_mode)
+	     || PRESENT(enter_reverse_mode)))
+	    _nc_warning("no exit_attribute_mode");
+#endif /* __UNUSED__ */
+	PAIRED(enter_standout_mode, exit_standout_mode);
+	PAIRED(enter_underline_mode, exit_underline_mode);
+#if defined(enter_italics_mode) && defined(exit_italics_mode)
+	PAIRED(enter_italics_mode, exit_italics_mode);
+#endif
+    }
+
+    /* we do this check/fix in postprocess_termcap(), but some packagers
+     * prefer to bypass it...
+     */
+    if (!literal) {
+	fixup_acsc(tp, literal);
+	ANDMISSING(enter_alt_charset_mode, acs_chars);
+	ANDMISSING(exit_alt_charset_mode, acs_chars);
+    }
+
+    /* listed in structure-member order of first argument */
+    PAIRED(enter_alt_charset_mode, exit_alt_charset_mode);
+    ANDMISSING(enter_blink_mode, exit_attribute_mode);
+    ANDMISSING(enter_bold_mode, exit_attribute_mode);
+    PAIRED(exit_ca_mode, enter_ca_mode);
+    PAIRED(enter_delete_mode, exit_delete_mode);
+    ANDMISSING(enter_dim_mode, exit_attribute_mode);
+    PAIRED(enter_insert_mode, exit_insert_mode);
+    ANDMISSING(enter_secure_mode, exit_attribute_mode);
+    ANDMISSING(enter_protected_mode, exit_attribute_mode);
+    ANDMISSING(enter_reverse_mode, exit_attribute_mode);
+    PAIRED(from_status_line, to_status_line);
+    PAIRED(meta_off, meta_on);
+
+    PAIRED(prtr_on, prtr_off);
+    PAIRED(save_cursor, restore_cursor);
+    PAIRED(enter_xon_mode, exit_xon_mode);
+    PAIRED(enter_am_mode, exit_am_mode);
+    ANDMISSING(label_off, label_on);
+#if defined(display_clock) && defined(remove_clock)
+    PAIRED(display_clock, remove_clock);
+#endif
+    ANDMISSING(set_color_pair, initialize_pair);
+}
+
+#if NO_LEAKS
+NCURSES_EXPORT(void)
+_nc_leaks_tic(void)
+{
+    T((T_CALLED("_nc_leaks_tic()")));
+    _nc_globals.leak_checking = TRUE;
+    _nc_alloc_entry_leaks();
+    _nc_captoinfo_leaks();
+    _nc_comp_scan_leaks();
+#if BROKEN_LINKER || USE_REENTRANT
+    _nc_names_leaks();
+    _nc_codes_leaks();
+#endif
+    _nc_tic_expand(0, FALSE, 0);
+    T((T_RETURN("")));
+}
+
+NCURSES_EXPORT(void)
+_nc_free_tic(int code)
+{
+    T((T_CALLED("_nc_free_tic(%d)"), code));
+    _nc_leaks_tic();
+    exit_terminfo(code);
+}
+#endif
diff --git a/ncurses/tinfo/comp_scan.c b/ncurses/tinfo/comp_scan.c
new file mode 100644
index 0000000..71361c5
--- /dev/null
+++ b/ncurses/tinfo/comp_scan.c
@@ -0,0 +1,1060 @@
+/****************************************************************************
+,* Copyright 2020-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996 on                 *
+ ****************************************************************************/
+
+/*
+ *	comp_scan.c --- Lexical scanner for terminfo compiler.
+ *
+ *	_nc_reset_input()
+ *	_nc_get_token()
+ *	_nc_panic_mode()
+ *	int _nc_syntax;
+ *	int _nc_curr_line;
+ *	long _nc_curr_file_pos;
+ *	long _nc_comment_start;
+ *	long _nc_comment_end;
+ */
+
+#include <curses.priv.h>
+
+#include <ctype.h>
+#include <tic.h>
+
+MODULE_ID("$Id: comp_scan.c,v 1.119 2022/08/07 00:20:26 tom Exp $")
+
+/*
+ * Maximum length of string capability we'll accept before raising an error.
+ * Yes, there is a real capability in /etc/termcap this long, an "is".
+ */
+#define MAXCAPLEN	600
+
+#define iswhite(ch)	(ch == ' '  ||  ch == '\t')
+
+NCURSES_EXPORT_VAR (int) _nc_syntax = 0;         /* termcap or terminfo? */
+NCURSES_EXPORT_VAR (int) _nc_strict_bsd = 1;  /* ncurses extended termcap? */
+NCURSES_EXPORT_VAR (long) _nc_curr_file_pos = 0; /* file offset of current line */
+NCURSES_EXPORT_VAR (long) _nc_comment_start = 0; /* start of comment range before name */
+NCURSES_EXPORT_VAR (long) _nc_comment_end = 0;   /* end of comment range before name */
+NCURSES_EXPORT_VAR (long) _nc_start_line = 0;    /* start line of current entry */
+
+NCURSES_EXPORT_VAR (struct token) _nc_curr_token =
+{
+    0, 0, 0
+};
+
+/*****************************************************************************
+ *
+ * Token-grabbing machinery
+ *
+ *****************************************************************************/
+
+static bool first_column;	/* See 'next_char()' below */
+static bool had_newline;
+static char separator;		/* capability separator */
+static int pushtype;		/* type of pushback token */
+static char *pushname;
+
+#if NCURSES_EXT_FUNCS
+NCURSES_EXPORT_VAR (bool) _nc_disable_period = FALSE; /* used by tic -a option */
+#endif
+
+/*****************************************************************************
+ *
+ * Character-stream handling
+ *
+ *****************************************************************************/
+
+#define LEXBUFSIZ	1024
+
+static char *bufptr;		/* otherwise, the input buffer pointer */
+static char *bufstart;		/* start of buffer so we can compute offsets */
+static FILE *yyin;		/* scanner's input file descriptor */
+
+/*
+ *	_nc_reset_input()
+ *
+ *	Resets the input-reading routines.  Used on initialization,
+ *	or after a seek has been done.  Exactly one argument must be
+ *	non-null.
+ */
+
+NCURSES_EXPORT(void)
+_nc_reset_input(FILE *fp, char *buf)
+{
+    TR(TRACE_DATABASE,
+       (T_CALLED("_nc_reset_input(fp=%p, buf=%p)"), (void *) fp, buf));
+
+    pushtype = NO_PUSHBACK;
+    if (pushname != 0)
+	pushname[0] = '\0';
+    yyin = fp;
+    bufstart = bufptr = buf;
+    _nc_curr_file_pos = 0L;
+    if (fp != 0)
+	_nc_curr_line = 0;
+    _nc_curr_col = 0;
+
+    returnVoidDB;
+}
+
+/*
+ *	int last_char()
+ *
+ *	Returns the final nonblank character on the current input buffer
+ */
+static int
+last_char(int from_end)
+{
+    size_t len = strlen(bufptr);
+    int result = 0;
+
+    while (len--) {
+	if (!isspace(UChar(bufptr[len]))) {
+	    if (from_end <= (int) len)
+		result = bufptr[(int) len - from_end];
+	    break;
+	}
+    }
+    return result;
+}
+
+/*
+ * Read, like fgets(), but error-out if the input contains nulls.
+ */
+static int
+get_text(char *buffer, int length)
+{
+    int count = 0;
+    int limit = length - 1;
+
+    while (limit-- > 0) {
+	int ch = fgetc(yyin);
+
+	if (ch == '\0') {
+	    _nc_err_abort("This is not a text-file");
+	} else if (ch == EOF) {
+	    break;
+	}
+	++count;
+	*buffer++ = (char) ch;
+	if (ch == '\n')
+	    break;
+    }
+    *buffer = '\0';
+    return count;
+}
+
+/*
+ *	int next_char()
+ *
+ *	Returns the next character in the input stream.  Comments and leading
+ *	white space are stripped.
+ *
+ *	The global state variable 'firstcolumn' is set TRUE if the character
+ *	returned is from the first column of the input line.
+ *
+ *	The global variable _nc_curr_line is incremented for each new line.
+ *	The global variable _nc_curr_file_pos is set to the file offset of the
+ *	beginning of each line.
+ */
+
+static int
+next_char(void)
+{
+    static char *result;
+    static size_t allocated;
+    int the_char;
+
+    if (!yyin) {
+	if (result != 0) {
+	    FreeAndNull(result);
+	    FreeAndNull(pushname);
+	    bufptr = 0;
+	    bufstart = 0;
+	    allocated = 0;
+	}
+	/*
+	 * An string with an embedded null will truncate the input.  This is
+	 * intentional (we don't read binary files here).
+	 */
+	if (bufptr == 0 || *bufptr == '\0')
+	    return (EOF);
+	if (*bufptr == '\n') {
+	    _nc_curr_line++;
+	    _nc_curr_col = 0;
+	} else if (*bufptr == '\t') {
+	    _nc_curr_col = (_nc_curr_col | 7);
+	}
+    } else if (!bufptr || !*bufptr) {
+	/*
+	 * In theory this could be recoded to do its I/O one character at a
+	 * time, saving the buffer space.  In practice, this turns out to be
+	 * quite hard to get completely right.  Try it and see.  If you
+	 * succeed, don't forget to hack push_back() correspondingly.
+	 */
+	size_t len;
+
+	do {
+	    size_t used = 0;
+	    bufstart = 0;
+	    do {
+		if (used + (LEXBUFSIZ / 4) >= allocated) {
+		    allocated += (allocated + LEXBUFSIZ);
+		    result = typeRealloc(char, allocated, result);
+		    if (result == 0)
+			return (EOF);
+		    if (bufstart)
+			bufstart = result;
+		}
+		if (used == 0)
+		    _nc_curr_file_pos = ftell(yyin);
+
+		if (get_text(result + used, (int) (allocated - used))) {
+		    bufstart = result;
+		    if (used == 0) {
+			if (_nc_curr_line == 0
+			    && IS_TIC_MAGIC(result)) {
+			    _nc_err_abort("This is a compiled terminal description, not a source");
+			}
+			_nc_curr_line++;
+			_nc_curr_col = 0;
+		    }
+		} else {
+		    if (used != 0)
+			_nc_STRCAT(result, "\n", allocated);
+		}
+		if ((bufptr = bufstart) != 0) {
+		    used = strlen(bufptr);
+		    if (used == 0)
+			return (EOF);
+		    while (iswhite(*bufptr)) {
+			if (*bufptr == '\t') {
+			    _nc_curr_col = (_nc_curr_col | 7) + 1;
+			} else {
+			    _nc_curr_col++;
+			}
+			bufptr++;
+		    }
+
+		    /*
+		     * Treat a trailing <cr><lf> the same as a <newline> so we
+		     * can read files on OS/2, etc.
+		     */
+		    if ((len = strlen(bufptr)) > 1) {
+			if (bufptr[len - 1] == '\n'
+			    && bufptr[len - 2] == '\r') {
+			    len--;
+			    bufptr[len - 1] = '\n';
+			    bufptr[len] = '\0';
+			}
+		    }
+		} else {
+		    return (EOF);
+		}
+	    } while (bufptr[len - 1] != '\n');	/* complete a line */
+	} while (result[0] == '#');	/* ignore comments */
+    } else if (*bufptr == '\t') {
+	_nc_curr_col = (_nc_curr_col | 7);
+    }
+
+    first_column = (bufptr == bufstart);
+    if (first_column)
+	had_newline = FALSE;
+
+    _nc_curr_col++;
+    the_char = *bufptr++;
+    return UChar(the_char);
+}
+
+static void
+push_back(int c)
+/* push a character back onto the input stream */
+{
+    if (bufptr == bufstart)
+	_nc_syserr_abort("Can't backspace off beginning of line");
+    *--bufptr = (char) c;
+    _nc_curr_col--;
+}
+
+static long
+stream_pos(void)
+/* return our current character position in the input stream */
+{
+    return (yyin ? ftell(yyin) : (bufptr ? bufptr - bufstart : 0));
+}
+
+static bool
+end_of_stream(void)
+/* are we at end of input? */
+{
+    return ((yyin
+	     ? (feof(yyin) && (bufptr == NULL || *bufptr == '\0'))
+	     : (bufptr && *bufptr == '\0'))
+	    ? TRUE : FALSE);
+}
+
+/* Assume we may be looking at a termcap-style continuation */
+static NCURSES_INLINE int
+eat_escaped_newline(int ch)
+{
+    if (ch == '\\')
+	while ((ch = next_char()) == '\n' || iswhite(ch))
+	    continue;
+    return ch;
+}
+
+#define TOK_BUF_SIZE MAX_ENTRY_SIZE
+
+#define OkToAdd() \
+	((tok_ptr - tok_buf) < (TOK_BUF_SIZE - 2))
+
+#define AddCh(ch) \
+	*tok_ptr++ = (char) ch; \
+	*tok_ptr = '\0'
+
+static char *tok_buf;
+
+/*
+ *	int
+ *	get_token()
+ *
+ *	Scans the input for the next token, storing the specifics in the
+ *	global structure 'curr_token' and returning one of the following:
+ *
+ *		NAMES		A line beginning in column 1.  'name'
+ *				will be set to point to everything up to but
+ *				not including the first separator on the line.
+ *		BOOLEAN		An entry consisting of a name followed by
+ *				a separator.  'name' will be set to point to
+ *				the name of the capability.
+ *		NUMBER		An entry of the form
+ *					name#digits,
+ *				'name' will be set to point to the capability
+ *				name and 'valnumber' to the number given.
+ *		STRING		An entry of the form
+ *					name=characters,
+ *				'name' is set to the capability name and
+ *				'valstring' to the string of characters, with
+ *				input translations done.
+ *		CANCEL		An entry of the form
+ *					name@,
+ *				'name' is set to the capability name and
+ *				'valnumber' to -1.
+ *		EOF		The end of the file has been reached.
+ *
+ *	A `separator' is either a comma or a semicolon, depending on whether
+ *	we are in termcap or terminfo mode.
+ *
+ */
+
+NCURSES_EXPORT(int)
+_nc_get_token(bool silent)
+{
+    static const char terminfo_punct[] = "@%&*!#";
+
+    char *after_name;		/* after primary name */
+    char *after_list;		/* after primary and alias list */
+    char *numchk;
+    char *tok_ptr;
+    char *s;
+    char numbuf[80];
+    int ch, c0, c1;
+    int dot_flag = FALSE;
+    int type;
+    long number;
+    long token_start;
+    unsigned found;
+#ifdef TRACE
+    int old_line;
+    int old_col;
+#endif
+
+    DEBUG(3, (T_CALLED("_nc_get_token(silent=%d)"), silent));
+
+    if (pushtype != NO_PUSHBACK) {
+	int retval = pushtype;
+
+	_nc_set_type(pushname != 0 ? pushname : "");
+	DEBUG(3, ("pushed-back token: `%s', class %d",
+		  _nc_curr_token.tk_name, pushtype));
+
+	pushtype = NO_PUSHBACK;
+	if (pushname != 0)
+	    pushname[0] = '\0';
+
+	/* currtok wasn't altered by _nc_push_token() */
+	DEBUG(3, (T_RETURN("%d"), retval));
+	return (retval);
+    }
+
+    if (end_of_stream()) {
+	yyin = 0;
+	(void) next_char();	/* frees its allocated memory */
+	if (tok_buf != 0) {
+	    if (_nc_curr_token.tk_name == tok_buf)
+		_nc_curr_token.tk_name = 0;
+	}
+	DEBUG(3, (T_RETURN("%d"), EOF));
+	return (EOF);
+    }
+
+  start_token:
+    token_start = stream_pos();
+    while ((ch = next_char()) == '\n' || iswhite(ch)) {
+	if (ch == '\n')
+	    had_newline = TRUE;
+	continue;
+    }
+
+    ch = eat_escaped_newline(ch);
+    _nc_curr_token.tk_valstring = 0;
+
+#ifdef TRACE
+    old_line = _nc_curr_line;
+    old_col = _nc_curr_col;
+#endif
+    if (ch == EOF)
+	type = EOF;
+    else {
+	/* if this is a termcap entry, skip a leading separator */
+	if (separator == ':' && ch == ':')
+	    ch = next_char();
+
+	if (ch == '.'
+#if NCURSES_EXT_FUNCS
+	    && !_nc_disable_period
+#endif
+	    ) {
+	    dot_flag = TRUE;
+	    DEBUG(8, ("dot-flag set"));
+
+	    while ((ch = next_char()) == '.' || iswhite(ch))
+		continue;
+	}
+
+	if (ch == EOF) {
+	    type = EOF;
+	    goto end_of_token;
+	}
+
+	/* have to make some punctuation chars legal for terminfo */
+	if (!isalnum(UChar(ch))
+#if NCURSES_EXT_FUNCS
+	    && !(ch == '.' && _nc_disable_period)
+#endif
+	    && ((strchr) (terminfo_punct, (char) ch) == 0)) {
+	    if (!silent)
+		_nc_warning("Illegal character (expected alphanumeric or %s) - '%s'",
+			    terminfo_punct, unctrl(UChar(ch)));
+	    _nc_panic_mode(separator);
+	    goto start_token;
+	}
+
+	if (tok_buf == 0)
+	    tok_buf = typeMalloc(char, TOK_BUF_SIZE);
+
+#ifdef TRACE
+	old_line = _nc_curr_line;
+	old_col = _nc_curr_col;
+#endif
+	tok_ptr = tok_buf;
+	AddCh(ch);
+
+	if (first_column) {
+	    _nc_comment_start = token_start;
+	    _nc_comment_end = _nc_curr_file_pos;
+	    _nc_start_line = _nc_curr_line;
+
+	    _nc_syntax = ERR;
+	    after_name = 0;
+	    after_list = 0;
+	    while ((ch = next_char()) != '\n') {
+		if (ch == EOF) {
+		    _nc_err_abort(MSG_NO_INPUTS);
+		} else if (ch == '|') {
+		    after_list = tok_ptr;
+		    if (after_name == 0)
+			after_name = tok_ptr;
+		} else if (ch == ':' && last_char(0) != ',') {
+		    _nc_syntax = SYN_TERMCAP;
+		    separator = ':';
+		    break;
+		} else if (ch == ',') {
+		    _nc_syntax = SYN_TERMINFO;
+		    separator = ',';
+		    /*
+		     * If we did not see a '|', then we found a name with no
+		     * aliases or description.
+		     */
+		    if (after_name == 0)
+			break;
+		    /*
+		     * We saw a comma, but are not entirely sure this is
+		     * terminfo format, since we can still be parsing the
+		     * description field (for either syntax).
+		     *
+		     * A properly formatted termcap line ends with either a
+		     * colon, or a backslash after a colon.  It is possible
+		     * to have a backslash in the middle of a capability, but
+		     * then there would be no leading whitespace on the next
+		     * line - something we want to discourage.
+		     */
+		    c0 = last_char(0);
+		    c1 = last_char(1);
+		    if (c1 != ':' && c0 != '\\' && c0 != ':') {
+			bool capability = FALSE;
+
+			/*
+			 * Since it is not termcap, assume the line is terminfo
+			 * format.  However, the comma can be embedded in a
+			 * description field.  It also can be a separator
+			 * between a description field and a capability.
+			 *
+			 * Improve the guess by checking if the next word after
+			 * the comma does not look like a capability.  In that
+			 * case, extend the description past the comma.
+			 */
+			for (s = bufptr; isspace(UChar(*s)); ++s) {
+			    ;
+			}
+			if (islower(UChar(*s))) {
+			    char *name = s;
+			    while (isalnum(UChar(*s))) {
+				++s;
+			    }
+			    if (*s == '#' || *s == '=' || *s == '@') {
+				/*
+				 * Checking solely with syntax allows us to
+				 * support extended capabilities with string
+				 * values.
+				 */
+				capability = TRUE;
+			    } else if (*s == ',') {
+				c0 = *s;
+				*s = '\0';
+				/*
+				 * Otherwise, we can handle predefined boolean
+				 * capabilities, still aided by syntax.
+				 */
+				if (_nc_find_entry(name,
+						   _nc_get_hash_table(FALSE))) {
+				    capability = TRUE;
+				}
+				*s = (char) c0;
+			    }
+			}
+			if (capability) {
+			    break;
+			}
+		    }
+		} else
+		    ch = eat_escaped_newline(ch);
+
+		if (OkToAdd()) {
+		    AddCh(ch);
+		} else {
+		    break;
+		}
+	    }
+	    *tok_ptr = '\0';
+	    if (_nc_syntax == ERR) {
+		/*
+		 * Grrr...what we ought to do here is barf, complaining that
+		 * the entry is malformed.  But because a couple of name fields
+		 * in the 8.2 termcap file end with |\, we just have to assume
+		 * it is termcap syntax.
+		 */
+		_nc_syntax = SYN_TERMCAP;
+		separator = ':';
+	    } else if (_nc_syntax == SYN_TERMINFO) {
+		/* throw away trailing /, *$/ */
+		for (--tok_ptr;
+		     iswhite(*tok_ptr) || *tok_ptr == ',';
+		     tok_ptr--)
+		    continue;
+		tok_ptr[1] = '\0';
+	    }
+
+	    /*
+	     * This is the soonest we have the terminal name fetched.  Set up
+	     * for following warning messages.  If there's no '|', then there
+	     * is no description.
+	     */
+	    if (after_name != 0) {
+		ch = *after_name;
+		*after_name = '\0';
+		_nc_set_type(tok_buf);
+		*after_name = (char) ch;
+	    }
+
+	    /*
+	     * Compute the boundary between the aliases and the description
+	     * field for syntax-checking purposes.
+	     */
+	    if (after_list != 0) {
+		if (!silent) {
+		    if (*after_list == '\0' || strchr("|", after_list[1]) != NULL) {
+			_nc_warning("empty longname field");
+		    } else if (strchr(after_list, ' ') == 0) {
+			_nc_warning("older tic versions may treat the description field as an alias");
+		    }
+		}
+	    } else {
+		after_list = tok_buf + strlen(tok_buf);
+		DEBUG(2, ("missing description"));
+	    }
+
+	    /*
+	     * Whitespace in a name field other than the long name can confuse
+	     * rdist and some termcap tools.  Slashes are a no-no.  Other
+	     * special characters can be dangerous due to shell expansion.
+	     */
+	    for (s = tok_buf; s < after_list; ++s) {
+		if (isspace(UChar(*s))) {
+		    if (!silent)
+			_nc_warning("whitespace in name or alias field");
+		    break;
+		} else if (*s == '/') {
+		    if (!silent)
+			_nc_warning("slashes aren't allowed in names or aliases");
+		    break;
+		} else if (strchr("$[]!*?", *s)) {
+		    if (!silent)
+			_nc_warning("dubious character `%c' in name or alias field", *s);
+		    break;
+		}
+	    }
+
+	    _nc_curr_token.tk_name = tok_buf;
+	    type = NAMES;
+	} else {
+	    if (had_newline && _nc_syntax == SYN_TERMCAP) {
+		_nc_warning("Missing backslash before newline");
+		had_newline = FALSE;
+	    }
+	    while ((ch = next_char()) != EOF) {
+		if (!isalnum(UChar(ch))) {
+		    if (_nc_syntax == SYN_TERMINFO) {
+			if (ch != '_')
+			    break;
+		    } else {	/* allow ';' for "k;" */
+			if (ch != ';')
+			    break;
+		    }
+		}
+		if (OkToAdd()) {
+		    AddCh(ch);
+		} else {
+		    ch = EOF;
+		    break;
+		}
+	    }
+
+	    *tok_ptr++ = '\0';	/* separate name/value in buffer */
+	    switch (ch) {
+	    case ',':
+	    case ':':
+		if (ch != separator)
+		    _nc_err_abort("Separator inconsistent with syntax");
+		_nc_curr_token.tk_name = tok_buf;
+		type = BOOLEAN;
+		break;
+	    case '@':
+		if ((ch = next_char()) != separator && !silent)
+		    _nc_warning("Missing separator after `%s', have %s",
+				tok_buf, unctrl(UChar(ch)));
+		_nc_curr_token.tk_name = tok_buf;
+		type = CANCEL;
+		break;
+
+	    case '#':
+		found = 0;
+		while (isalnum(ch = next_char())) {
+		    numbuf[found++] = (char) ch;
+		    if (found >= sizeof(numbuf) - 1)
+			break;
+		}
+		numbuf[found] = '\0';
+		number = strtol(numbuf, &numchk, 0);
+		if (!silent) {
+		    if (numchk == numbuf)
+			_nc_warning("no value given for `%s'", tok_buf);
+		    if ((*numchk != '\0') || (ch != separator))
+			_nc_warning("Missing separator for `%s'", tok_buf);
+		    if (number < 0)
+			_nc_warning("value of `%s' cannot be negative", tok_buf);
+		    if (number > MAX_OF_TYPE(NCURSES_INT2)) {
+			_nc_warning("limiting value of `%s' from %#lx to %#x",
+				    tok_buf,
+				    number, MAX_OF_TYPE(NCURSES_INT2));
+			number = MAX_OF_TYPE(NCURSES_INT2);
+		    }
+		}
+		_nc_curr_token.tk_name = tok_buf;
+		_nc_curr_token.tk_valnumber = (int) number;
+		type = NUMBER;
+		break;
+
+	    case '=':
+		ch = _nc_trans_string(tok_ptr, tok_buf + TOK_BUF_SIZE);
+		if (!silent && ch != separator)
+		    _nc_warning("Missing separator");
+		_nc_curr_token.tk_name = tok_buf;
+		_nc_curr_token.tk_valstring = tok_ptr;
+		type = STRING;
+		break;
+
+	    case EOF:
+		type = EOF;
+		break;
+	    default:
+		/* just to get rid of the compiler warning */
+		type = UNDEF;
+		if (!silent)
+		    _nc_warning("Illegal character - '%s'", unctrl(UChar(ch)));
+	    }
+	}			/* end else (first_column == FALSE) */
+    }				/* end else (ch != EOF) */
+
+  end_of_token:
+
+#ifdef TRACE
+    if (dot_flag == TRUE)
+	DEBUG(8, ("Commented out "));
+
+    if (_nc_tracing >= DEBUG_LEVEL(8)) {
+	_tracef("parsed %d.%d to %d.%d",
+		old_line, old_col,
+		_nc_curr_line, _nc_curr_col);
+    }
+    if (_nc_tracing >= DEBUG_LEVEL(7)) {
+	switch (type) {
+	case BOOLEAN:
+	    _tracef("Token: Boolean; name='%s'",
+		    _nc_curr_token.tk_name);
+	    break;
+
+	case NUMBER:
+	    _tracef("Token: Number;  name='%s', value=%d",
+		    _nc_curr_token.tk_name,
+		    _nc_curr_token.tk_valnumber);
+	    break;
+
+	case STRING:
+	    _tracef("Token: String;  name='%s', value=%s",
+		    _nc_curr_token.tk_name,
+		    _nc_visbuf(_nc_curr_token.tk_valstring));
+	    break;
+
+	case CANCEL:
+	    _tracef("Token: Cancel; name='%s'",
+		    _nc_curr_token.tk_name);
+	    break;
+
+	case NAMES:
+
+	    _tracef("Token: Names; value='%s'",
+		    _nc_curr_token.tk_name);
+	    break;
+
+	case EOF:
+	    _tracef("Token: End of file");
+	    break;
+
+	default:
+	    _nc_warning("Bad token type");
+	}
+    }
+#endif
+
+    if (dot_flag == TRUE)	/* if commented out, use the next one */
+	type = _nc_get_token(silent);
+
+    DEBUG(3, ("token: `%s', class %d",
+	      ((_nc_curr_token.tk_name != 0)
+	       ? _nc_curr_token.tk_name
+	       : "<null>"),
+	      type));
+
+    DEBUG(3, (T_RETURN("%d"), type));
+    return (type);
+}
+
+/*
+ *	char
+ *	trans_string(ptr)
+ *
+ *	Reads characters using next_char() until encountering a separator, nl,
+ *	or end-of-file.  The returned value is the character which caused
+ *	reading to stop.  The following translations are done on the input:
+ *
+ *		^X  goes to  ctrl-X (i.e. X & 037)
+ *		{\E,\n,\r,\b,\t,\f}  go to
+ *			{ESCAPE,newline,carriage-return,backspace,tab,formfeed}
+ *		{\^,\\}  go to  {carat,backslash}
+ *		\ddd (for ddd = up to three octal digits)  goes to the character ddd
+ *
+ *		\e == \E
+ *		\0 == \200
+ *
+ */
+
+NCURSES_EXPORT(int)
+_nc_trans_string(char *ptr, char *last)
+{
+    int count = 0;
+    int number = 0;
+    int i, c;
+    int last_ch = '\0';
+    bool ignored = FALSE;
+    bool long_warning = FALSE;
+
+    while ((c = next_char()) != separator && c != EOF) {
+	if (ptr >= (last - 1)) {
+	    if (c != EOF) {
+		while ((c = next_char()) != separator && c != EOF) {
+		    ;
+		}
+	    }
+	    break;
+	}
+	if ((_nc_syntax == SYN_TERMCAP) && c == '\n')
+	    break;
+	if (c == '^' && last_ch != '%') {
+	    c = next_char();
+	    if (c == EOF)
+		_nc_err_abort(MSG_NO_INPUTS);
+
+	    if (!(is7bits(c) && isprint(c))) {
+		_nc_warning("Illegal ^ character - '%s'", unctrl(UChar(c)));
+	    }
+	    if (c == '?' && (_nc_syntax != SYN_TERMCAP)) {
+		*(ptr++) = '\177';
+	    } else {
+		if ((c &= 037) == 0)
+		    c = 128;
+		*(ptr++) = (char) (c);
+	    }
+	} else if (c == '\\') {
+	    bool strict_bsd = ((_nc_syntax == SYN_TERMCAP) && _nc_strict_bsd);
+
+	    c = next_char();
+	    if (c == EOF)
+		_nc_err_abort(MSG_NO_INPUTS);
+
+	    if (isoctal(c) || (strict_bsd && isdigit(c))) {
+		number = c - '0';
+		for (i = 0; i < 2; i++) {
+		    c = next_char();
+		    if (c == EOF)
+			_nc_err_abort(MSG_NO_INPUTS);
+
+		    if (!isoctal(c)) {
+			if (isdigit(c)) {
+			    if (!strict_bsd) {
+				_nc_warning("Non-octal digit `%c' in \\ sequence", c);
+				/* allow the digit; it'll do less harm */
+			    }
+			} else {
+			    push_back(c);
+			    break;
+			}
+		    }
+
+		    number = number * 8 + c - '0';
+		}
+
+		number = UChar(number);
+		if (number == 0 && !strict_bsd)
+		    number = 0200;
+		*(ptr++) = (char) number;
+	    } else {
+		switch (c) {
+		case 'E':
+		    *(ptr++) = '\033';
+		    break;
+
+		case 'n':
+		    *(ptr++) = '\n';
+		    break;
+
+		case 'r':
+		    *(ptr++) = '\r';
+		    break;
+
+		case 'b':
+		    *(ptr++) = '\010';
+		    break;
+
+		case 'f':
+		    *(ptr++) = '\014';
+		    break;
+
+		case 't':
+		    *(ptr++) = '\t';
+		    break;
+
+		case '\\':
+		    *(ptr++) = '\\';
+		    break;
+
+		case '^':
+		    *(ptr++) = '^';
+		    break;
+
+		case ',':
+		    *(ptr++) = ',';
+		    break;
+
+		case '\n':
+		    continue;
+
+		default:
+		    if ((_nc_syntax == SYN_TERMINFO) || !_nc_strict_bsd) {
+			switch (c) {
+			case 'a':
+			    c = '\007';
+			    break;
+			case 'e':
+			    c = '\033';
+			    break;
+			case 'l':
+			    c = '\n';
+			    break;
+			case 's':
+			    c = ' ';
+			    break;
+			case ':':
+			    c = ':';
+			    break;
+			default:
+			    _nc_warning("Illegal character '%s' in \\ sequence",
+					unctrl(UChar(c)));
+			    break;
+			}
+		    }
+		    /* FALLTHRU */
+		case '|':
+		    *(ptr++) = (char) c;
+		}		/* endswitch (c) */
+	    }			/* endelse (c < '0' ||  c > '7') */
+	}
+	/* end else if (c == '\\') */
+	else if (c == '\n' && (_nc_syntax == SYN_TERMINFO)) {
+	    /*
+	     * Newlines embedded in a terminfo string are ignored, provided
+	     * that the next line begins with whitespace.
+	     */
+	    ignored = TRUE;
+	} else {
+	    *(ptr++) = (char) c;
+	}
+
+	if (!ignored) {
+	    if (_nc_curr_col <= 1) {
+		push_back(c);
+		c = '\n';
+		break;
+	    }
+	    last_ch = c;
+	    count++;
+	}
+	ignored = FALSE;
+
+	if (count > MAXCAPLEN && !long_warning) {
+	    _nc_warning("Very long string found.  Missing separator?");
+	    long_warning = TRUE;
+	}
+    }				/* end while */
+
+    *ptr = '\0';
+
+    return (c);
+}
+
+/*
+ *	_nc_push_token()
+ *
+ *	Push a token of given type so that it will be reread by the next
+ *	get_token() call.
+ */
+
+NCURSES_EXPORT(void)
+_nc_push_token(int tokclass)
+{
+    /*
+     * This implementation is kind of bogus, it will fail if we ever do more
+     * than one pushback at a time between get_token() calls.  It relies on the
+     * fact that _nc_curr_token is static storage that nothing but
+     * _nc_get_token() touches.
+     */
+    pushtype = tokclass;
+    if (pushname == 0)
+	pushname = typeMalloc(char, MAX_NAME_SIZE + 1);
+    _nc_get_type(pushname);
+
+    DEBUG(3, ("pushing token: `%s', class %d",
+	      ((_nc_curr_token.tk_name != 0)
+	       ? _nc_curr_token.tk_name
+	       : "<null>"),
+	      pushtype));
+}
+
+/*
+ * Panic mode error recovery - skip everything until a "ch" is found.
+ */
+NCURSES_EXPORT(void)
+_nc_panic_mode(char ch)
+{
+    for (;;) {
+	int c = next_char();
+	if (c == ch)
+	    return;
+	if (c == EOF)
+	    return;
+    }
+}
+
+#if NO_LEAKS
+NCURSES_EXPORT(void)
+_nc_comp_scan_leaks(void)
+{
+    if (pushname != 0) {
+	FreeAndNull(pushname);
+    }
+    if (tok_buf != 0) {
+	FreeAndNull(tok_buf);
+    }
+}
+#endif
diff --git a/ncurses/tinfo/db_iterator.c b/ncurses/tinfo/db_iterator.c
new file mode 100644
index 0000000..e69e0f3
--- /dev/null
+++ b/ncurses/tinfo/db_iterator.c
@@ -0,0 +1,457 @@
+/****************************************************************************
+ * Copyright 2018-2020,2022 Thomas E. Dickey                                *
+ * Copyright 2006-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                                                *
+ ****************************************************************************/
+
+/*
+ * Iterators for terminal databases.
+ */
+
+#include <curses.priv.h>
+
+#include <time.h>
+#include <tic.h>
+
+#if USE_HASHED_DB
+#include <hashed_db.h>
+#endif
+
+MODULE_ID("$Id: db_iterator.c,v 1.49 2022/04/23 20:03:15 tom Exp $")
+
+#define HaveTicDirectory _nc_globals.have_tic_directory
+#define KeepTicDirectory _nc_globals.keep_tic_directory
+#define TicDirectory     _nc_globals.tic_directory
+#define my_blob          _nc_globals.dbd_blob
+#define my_list          _nc_globals.dbd_list
+#define my_size          _nc_globals.dbd_size
+#define my_time          _nc_globals.dbd_time
+#define my_vars          _nc_globals.dbd_vars
+
+static void
+add_to_blob(const char *text, size_t limit)
+{
+    (void) limit;
+
+    if (*text != '\0') {
+	char *last = my_blob + strlen(my_blob);
+	if (last != my_blob)
+	    *last++ = NCURSES_PATHSEP;
+	_nc_STRCPY(last, text, limit);
+    }
+}
+
+static bool
+check_existence(const char *name, struct stat *sb)
+{
+    bool result = FALSE;
+
+    if (quick_prefix(name)) {
+	result = TRUE;
+    } else if (stat(name, sb) == 0
+	       && (S_ISDIR(sb->st_mode)
+		   || (S_ISREG(sb->st_mode) && sb->st_size))) {
+	result = TRUE;
+    }
+#if USE_HASHED_DB
+    else if (strlen(name) < PATH_MAX - sizeof(DBM_SUFFIX)) {
+	char temp[PATH_MAX];
+	_nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) "%s%s", name, DBM_SUFFIX);
+	if (stat(temp, sb) == 0 && S_ISREG(sb->st_mode) && sb->st_size) {
+	    result = TRUE;
+	}
+    }
+#endif
+    return result;
+}
+
+/*
+ * Trim newlines (and backslashes preceding those) and tab characters to
+ * help simplify scripting of the quick-dump feature.  Leave spaces and
+ * other backslashes alone.
+ */
+static void
+trim_formatting(char *source)
+{
+    char *target = source;
+    char ch;
+
+    while ((ch = *source++) != '\0') {
+	if (ch == '\\' && *source == '\n')
+	    continue;
+	if (ch == '\n' || ch == '\t')
+	    continue;
+	*target++ = ch;
+    }
+    *target = '\0';
+}
+
+/*
+ * Store the latest value of an environment variable in my_vars[] so we can
+ * detect if one changes, invalidating the cached search-list.
+ */
+static bool
+update_getenv(const char *name, DBDIRS which)
+{
+    bool result = FALSE;
+
+    if (which < dbdLAST) {
+	char *value;
+	char *cached_value = my_vars[which].value;
+	bool same_value;
+
+	if ((value = getenv(name)) != 0) {
+	    value = strdup(value);
+	}
+	same_value = ((value == 0 && cached_value == 0) ||
+		      (value != 0 &&
+		       cached_value != 0 &&
+		       strcmp(value, cached_value) == 0));
+
+	/* Set variable name to enable checks in cache_expired(). */
+	my_vars[which].name = name;
+
+	if (!same_value) {
+	    FreeIfNeeded(my_vars[which].value);
+	    my_vars[which].value = value;
+	    result = TRUE;
+	} else {
+	    free(value);
+	}
+    }
+    return result;
+}
+
+#if NCURSES_USE_DATABASE || NCURSES_USE_TERMCAP
+static char *
+cache_getenv(const char *name, DBDIRS which)
+{
+    char *result = 0;
+
+    (void) update_getenv(name, which);
+    if (which < dbdLAST) {
+	result = my_vars[which].value;
+    }
+    return result;
+}
+#endif
+
+/*
+ * The cache expires if at least a second has passed since the initial lookup,
+ * or if one of the environment variables changed.
+ *
+ * Only a few applications use multiple lookups of terminal entries, seems that
+ * aside from bulk I/O such as tic and toe, that leaves interactive programs
+ * which should not be modifying the terminal databases in a way that would
+ * invalidate the search-list.
+ *
+ * The "1-second" is to allow for user-directed changes outside the program.
+ */
+static bool
+cache_expired(void)
+{
+    bool result = FALSE;
+    time_t now = time((time_t *) 0);
+
+    if (now > my_time) {
+	result = TRUE;
+    } else {
+	DBDIRS n;
+	for (n = (DBDIRS) 0; n < dbdLAST; ++n) {
+	    if (my_vars[n].name != 0
+		&& update_getenv(my_vars[n].name, n)) {
+		result = TRUE;
+		break;
+	    }
+	}
+    }
+    return result;
+}
+
+static void
+free_cache(void)
+{
+    FreeAndNull(my_blob);
+    FreeAndNull(my_list);
+}
+
+static void
+update_tic_dir(const char *update)
+{
+    free((char *) TicDirectory);
+    TicDirectory = update;
+}
+
+/*
+ * Record the "official" location of the terminfo directory, according to
+ * the place where we're writing to, or the normal default, if not.
+ */
+NCURSES_EXPORT(const char *)
+_nc_tic_dir(const char *path)
+{
+    T(("_nc_tic_dir %s", NonNull(path)));
+    if (!KeepTicDirectory) {
+	if (path != NULL) {
+	    if (path != TicDirectory)
+		update_tic_dir(strdup(path));
+	    HaveTicDirectory = TRUE;
+	} else if (HaveTicDirectory == 0) {
+	    if (use_terminfo_vars()) {
+		const char *envp;
+		if ((envp = getenv("TERMINFO")) != 0)
+		    return _nc_tic_dir(envp);
+	    }
+	}
+    }
+    return TicDirectory ? TicDirectory : TERMINFO;
+}
+
+/*
+ * Special fix to prevent the terminfo directory from being moved after tic
+ * has chdir'd to it.  If we let it be changed, then if $TERMINFO has a
+ * relative path, we'll lose track of the actual directory.
+ */
+NCURSES_EXPORT(void)
+_nc_keep_tic_dir(const char *path)
+{
+    _nc_tic_dir(path);
+    KeepTicDirectory = TRUE;
+}
+
+/*
+ * Cleanup.
+ */
+NCURSES_EXPORT(void)
+_nc_last_db(void)
+{
+    if (my_blob != 0 && cache_expired()) {
+	free_cache();
+    }
+}
+
+/*
+ * This is a simple iterator which allows the caller to step through the
+ * possible locations for a terminfo directory.  ncurses uses this to find
+ * terminfo files to read.
+ */
+NCURSES_EXPORT(const char *)
+_nc_next_db(DBDIRS * state, int *offset)
+{
+    const char *result;
+
+    (void) offset;
+    if ((int) *state < my_size
+	&& my_list != 0
+	&& my_list[*state] != 0) {
+	result = my_list[*state];
+	(*state)++;
+    } else {
+	result = 0;
+    }
+    if (result != 0) {
+	T(("_nc_next_db %d %s", *state, result));
+    }
+    return result;
+}
+
+NCURSES_EXPORT(void)
+_nc_first_db(DBDIRS * state, int *offset)
+{
+    bool cache_has_expired = FALSE;
+    *state = dbdTIC;
+    *offset = 0;
+
+    T((T_CALLED("_nc_first_db")));
+
+    /* build a blob containing all of the strings we will use for a lookup
+     * table.
+     */
+    if (my_blob == 0 || (cache_has_expired = cache_expired())) {
+	size_t blobsize = 0;
+	const char *values[dbdLAST];
+	struct stat *my_stat;
+	int j;
+
+	if (cache_has_expired)
+	    free_cache();
+
+	for (j = 0; j < dbdLAST; ++j)
+	    values[j] = 0;
+
+	/*
+	 * This is the first item in the list, and is used only when tic is
+	 * writing to the database, as a performance improvement.
+	 */
+	values[dbdTIC] = TicDirectory;
+
+#if NCURSES_USE_DATABASE
+#ifdef TERMINFO_DIRS
+	values[dbdCfgList] = TERMINFO_DIRS;
+#endif
+#ifdef TERMINFO
+	values[dbdCfgOnce] = TERMINFO;
+#endif
+#endif
+
+#if NCURSES_USE_TERMCAP
+	values[dbdCfgList2] = TERMPATH;
+#endif
+
+	if (use_terminfo_vars()) {
+#if NCURSES_USE_DATABASE
+	    values[dbdEnvOnce] = cache_getenv("TERMINFO", dbdEnvOnce);
+	    values[dbdHome] = _nc_home_terminfo();
+	    (void) cache_getenv("HOME", dbdHome);
+	    values[dbdEnvList] = cache_getenv("TERMINFO_DIRS", dbdEnvList);
+
+#endif
+#if NCURSES_USE_TERMCAP
+	    values[dbdEnvOnce2] = cache_getenv("TERMCAP", dbdEnvOnce2);
+	    /* only use $TERMCAP if it is an absolute path */
+	    if (values[dbdEnvOnce2] != 0
+		&& *values[dbdEnvOnce2] != '/') {
+		values[dbdEnvOnce2] = 0;
+	    }
+	    values[dbdEnvList2] = cache_getenv("TERMPATH", dbdEnvList2);
+#endif /* NCURSES_USE_TERMCAP */
+	}
+
+	for (j = 0; j < dbdLAST; ++j) {
+	    if (values[j] == 0)
+		values[j] = "";
+	    blobsize += 2 + strlen(values[j]);
+	}
+
+	my_blob = malloc(blobsize);
+	if (my_blob != 0) {
+	    *my_blob = '\0';
+	    for (j = 0; j < dbdLAST; ++j) {
+		add_to_blob(values[j], blobsize);
+	    }
+
+	    /* Now, build an array which will be pointers to the distinct
+	     * strings in the blob.
+	     */
+	    blobsize = 2;
+	    for (j = 0; my_blob[j] != '\0'; ++j) {
+		if (my_blob[j] == NCURSES_PATHSEP)
+		    ++blobsize;
+	    }
+	    my_list = typeCalloc(char *, blobsize);
+	    my_stat = typeCalloc(struct stat, blobsize);
+	    if (my_list != 0 && my_stat != 0) {
+		int k = 0;
+		my_list[k++] = my_blob;
+		for (j = 0; my_blob[j] != '\0'; ++j) {
+		    if (my_blob[j] == NCURSES_PATHSEP
+			&& ((&my_blob[j] - my_list[k - 1]) != 3
+			    || !quick_prefix(my_list[k - 1]))) {
+			my_blob[j] = '\0';
+			my_list[k++] = &my_blob[j + 1];
+		    }
+		}
+
+		/*
+		 * Eliminate duplicates from the list.
+		 */
+		for (j = 0; my_list[j] != 0; ++j) {
+#ifdef TERMINFO
+		    if (*my_list[j] == '\0')
+			my_list[j] = strdup(TERMINFO);
+#endif
+		    trim_formatting(my_list[j]);
+		    for (k = 0; k < j; ++k) {
+			if (!strcmp(my_list[j], my_list[k])) {
+			    T(("duplicate %s", my_list[j]));
+			    k = j - 1;
+			    while ((my_list[j] = my_list[j + 1]) != 0) {
+				++j;
+			    }
+			    j = k;
+			    break;
+			}
+		    }
+		}
+
+		/*
+		 * Eliminate non-existent databases, and those that happen to
+		 * be symlinked to another location.
+		 */
+		for (j = 0; my_list[j] != 0; ++j) {
+		    bool found = check_existence(my_list[j], &my_stat[j]);
+#if HAVE_LINK
+		    if (found) {
+			for (k = 0; k < j; ++k) {
+			    if (my_stat[j].st_dev == my_stat[k].st_dev
+				&& my_stat[j].st_ino == my_stat[k].st_ino) {
+				found = FALSE;
+				break;
+			    }
+			}
+		    }
+#endif
+		    if (!found) {
+			T(("not found %s", my_list[j]));
+			k = j;
+			while ((my_list[k] = my_list[k + 1]) != 0) {
+			    ++k;
+			}
+			--j;
+		    }
+		}
+		my_size = j;
+		my_time = time((time_t *) 0);
+	    } else {
+		FreeAndNull(my_blob);
+	    }
+	    free(my_stat);
+	}
+    }
+    returnVoid;
+}
+
+#if NO_LEAKS
+void
+_nc_db_iterator_leaks(void)
+{
+    DBDIRS which;
+
+    if (my_blob != 0)
+	FreeAndNull(my_blob);
+    if (my_list != 0)
+	FreeAndNull(my_list);
+    for (which = 0; (int) which < dbdLAST; ++which) {
+	my_vars[which].name = 0;
+	FreeIfNeeded(my_vars[which].value);
+	my_vars[which].value = 0;
+    }
+    update_tic_dir(NULL);
+}
+#endif
diff --git a/ncurses/tinfo/doalloc.c b/ncurses/tinfo/doalloc.c
new file mode 100644
index 0000000..e3b1a2e
--- /dev/null
+++ b/ncurses/tinfo/doalloc.c
@@ -0,0 +1,62 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2002,2012 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey <dickey@clark.net> 1998                        *
+ ****************************************************************************/
+
+/*
+ * Wrapper for malloc/realloc.  Standard implementations allow realloc with
+ * a null pointer, but older libraries may not (e.g., SunOS).
+ *
+ * Also if realloc fails, we discard the old memory to avoid leaks.
+ */
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: doalloc.c,v 1.14 2021/04/24 23:43:39 tom Exp $")
+
+void *
+_nc_doalloc(void *oldp, size_t amount)
+{
+    void *newp;
+
+    if (oldp != NULL) {
+	if (amount == 0) {
+	    free(oldp);
+	    newp = NULL;
+	} else if ((newp = realloc(oldp, amount)) == 0) {
+	    free(oldp);
+	    errno = ENOMEM;	/* just in case 'free' reset */
+	}
+    } else {
+	newp = malloc(amount);
+    }
+    return newp;
+}
diff --git a/ncurses/tinfo/entries.c b/ncurses/tinfo/entries.c
new file mode 100644
index 0000000..8c5e10c
--- /dev/null
+++ b/ncurses/tinfo/entries.c
@@ -0,0 +1,194 @@
+/****************************************************************************
+ * Copyright 2019-2021,2022 Thomas E. Dickey                                *
+ * Copyright 2006-2012,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                                                *
+ *     and: Juergen Pfeifer                                                 *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+
+#include <ctype.h>
+
+#include <tic.h>
+
+MODULE_ID("$Id: entries.c,v 1.34 2022/08/13 16:57:35 tom Exp $")
+
+/****************************************************************************
+ *
+ * Entry queue handling
+ *
+ ****************************************************************************/
+/*
+ *  The entry list is a doubly linked list with NULLs terminating the lists:
+ *
+ *	  ---------   ---------   ---------
+ *	  |       |   |       |   |       |   offset
+ *        |-------|   |-------|   |-------|
+ *	  |   ----+-->|   ----+-->|  NULL |   next
+ *	  |-------|   |-------|   |-------|
+ *	  |  NULL |<--+----   |<--+----   |   last
+ *	  ---------   ---------   ---------
+ *	      ^                       ^
+ *	      |                       |
+ *	      |                       |
+ *	   _nc_head                _nc_tail
+ */
+
+NCURSES_EXPORT_VAR(ENTRY *) _nc_head = 0;
+NCURSES_EXPORT_VAR(ENTRY *) _nc_tail = 0;
+
+static ENTRY *
+_nc_delink_entry(ENTRY * headp, TERMTYPE2 *tterm)
+/* delink the allocated storage for the given list entry */
+{
+    ENTRY *ep, *last;
+
+    for (last = 0, ep = headp; ep != 0; last = ep, ep = ep->next) {
+	if (&(ep->tterm) == tterm) {
+	    if (last != 0) {
+		last->next = ep->next;
+	    }
+	    if (ep->next != 0) {
+		ep->next->last = last;
+	    }
+	    if (ep == _nc_head) {
+		_nc_head = ep->next;
+	    }
+	    if (ep == _nc_tail) {
+		_nc_tail = last;
+	    }
+	    break;
+	}
+    }
+    return ep;
+}
+
+NCURSES_EXPORT(void)
+_nc_free_entry(ENTRY * headp, TERMTYPE2 *tterm)
+/* free the allocated storage consumed by the given list entry */
+{
+    ENTRY *ep;
+
+    if ((ep = _nc_delink_entry(headp, tterm)) != 0) {
+	free(ep);
+    }
+}
+
+NCURSES_EXPORT(void)
+_nc_free_entries(ENTRY * headp)
+/* free the allocated storage consumed by list entries */
+{
+    (void) headp;		/* unused - _nc_head is altered here! */
+
+    while (_nc_head != 0) {
+	_nc_free_termtype2(&(_nc_head->tterm));
+    }
+}
+
+NCURSES_EXPORT(void)
+_nc_leaks_tinfo(void)
+{
+#if NO_LEAKS
+    char *s;
+#endif
+
+    T((T_CALLED("_nc_leaks_tinfo()")));
+#if NO_LEAKS
+    _nc_globals.leak_checking = TRUE;
+    _nc_free_tparm(cur_term);
+    _nc_tgetent_leaks();
+
+#ifdef USE_PTHREADS
+    /*
+     * Discard any prescreen data which is not used for the current screen.
+     */
+    _nc_lock_global(screen);
+    {
+	PRESCREEN_LIST *p;
+	pthread_t id = GetThreadID();
+	for (p = _nc_prescreen.allocated; p != 0; p = p->next) {
+	    if (p->id == id && p->sp != CURRENT_SCREEN) {
+		FreeAndNull(p->sp);
+	    }
+	}
+    }
+    _nc_unlock_global(screen);
+#endif
+    if (TerminalOf(CURRENT_SCREEN) != 0) {
+	del_curterm(TerminalOf(CURRENT_SCREEN));
+    }
+    _nc_forget_prescr();
+
+    _nc_comp_captab_leaks();
+    _nc_comp_userdefs_leaks();
+    _nc_free_entries(_nc_head);
+    _nc_get_type(0);
+    _nc_first_name(0);
+    _nc_db_iterator_leaks();
+    _nc_keyname_leaks();
+#if BROKEN_LINKER || USE_REENTRANT
+    _nc_names_leaks();
+    _nc_codes_leaks();
+    FreeIfNeeded(_nc_prescreen.real_acs_map);
+#endif
+    _nc_comp_error_leaks();
+
+    if ((s = _nc_home_terminfo()) != 0)
+	free(s);
+
+#ifdef TRACE
+    T((T_RETURN("")));
+    curses_trace(0);
+    _nc_trace_buf(-1, (size_t) 0);
+#endif
+
+#endif /* NO_LEAKS */
+    returnVoid;
+}
+
+#if NO_LEAKS
+NCURSES_EXPORT(void)
+_nc_free_tinfo(int code)
+{
+    T((T_CALLED("_nc_free_tinfo(%d)"), code));
+    _nc_leaks_tinfo();
+    exit(code);
+}
+#endif
+
+NCURSES_EXPORT(void)
+exit_terminfo(int code)
+{
+    T((T_CALLED("exit_terminfo(%d)"), code));
+#if NO_LEAKS
+    _nc_leaks_tinfo();
+#endif
+    exit(code);
+}
diff --git a/ncurses/tinfo/free_ttype.c b/ncurses/tinfo/free_ttype.c
new file mode 100644
index 0000000..9622e0e
--- /dev/null
+++ b/ncurses/tinfo/free_ttype.c
@@ -0,0 +1,108 @@
+/****************************************************************************
+ * Copyright 2020,2022 Thomas E. Dickey                                     *
+ * Copyright 1999-2011,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                    1999-on                     *
+ ****************************************************************************/
+
+/*
+ * free_ttype.c -- allocation functions for TERMTYPE
+ *
+ *	_nc_free_termtype()
+ *	use_extended_names()
+ *
+ */
+
+#include <curses.priv.h>
+
+#include <tic.h>
+
+MODULE_ID("$Id: free_ttype.c,v 1.21 2022/05/28 18:02:33 tom Exp $")
+
+static void
+really_free_termtype(TERMTYPE2 *ptr, bool freeStrings)
+{
+    T(("really_free_termtype(%s) %d", ptr->term_names, freeStrings));
+
+    if (freeStrings) {
+	FreeIfNeeded(ptr->str_table);
+    }
+    FreeIfNeeded(ptr->Booleans);
+    FreeIfNeeded(ptr->Numbers);
+    FreeIfNeeded(ptr->Strings);
+#if NCURSES_XNAMES
+    if (freeStrings) {
+	FreeIfNeeded(ptr->ext_str_table);
+    }
+    FreeIfNeeded(ptr->ext_Names);
+#endif
+    memset(ptr, 0, sizeof(TERMTYPE));
+    _nc_free_entry(_nc_head, ptr);
+}
+
+/*
+ * This entrypoint was used by tack 1.07; deprecated with ncurses 6.2
+ */
+NCURSES_EXPORT(void)
+_nc_free_termtype(TERMTYPE *ptr)
+{
+    really_free_termtype((TERMTYPE2 *) ptr, !NCURSES_EXT_NUMBERS);
+}
+
+/*
+ * These similar entrypoints are not used outside of ncurses.
+ */
+NCURSES_EXPORT(void)
+_nc_free_termtype1(TERMTYPE *ptr)
+{
+    really_free_termtype((TERMTYPE2 *) ptr, TRUE);
+}
+
+#if NCURSES_EXT_NUMBERS
+NCURSES_EXPORT(void)
+_nc_free_termtype2(TERMTYPE2 *ptr)
+{
+    really_free_termtype(ptr, TRUE);
+}
+#endif
+
+#if NCURSES_XNAMES
+NCURSES_EXPORT_VAR(bool) _nc_user_definable = TRUE;
+
+NCURSES_EXPORT(int)
+use_extended_names(bool flag)
+{
+    int oldflag = _nc_user_definable;
+
+    START_TRACE();
+    T((T_CALLED("use_extended_names(%d)"), flag));
+    _nc_user_definable = flag;
+    returnBool(oldflag);
+}
+#endif
diff --git a/ncurses/tinfo/getenv_num.c b/ncurses/tinfo/getenv_num.c
new file mode 100644
index 0000000..ca179d3
--- /dev/null
+++ b/ncurses/tinfo/getenv_num.c
@@ -0,0 +1,76 @@
+/****************************************************************************
+ * Copyright 2018,2020 Thomas E. Dickey                                     *
+ * Copyright 1998-2012,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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey <dickey@clark.net> 1998                        *
+ ****************************************************************************/
+
+/*
+ *	getenv_num.c -- obtain a number from the environment
+ */
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: getenv_num.c,v 1.8 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(int)
+_nc_getenv_num(const char *name)
+{
+    char *dst = 0;
+    char *src = getenv(name);
+    long value;
+
+    if ((src == 0)
+	|| (value = strtol(src, &dst, 0)) < 0
+	|| (dst == src)
+	|| (*dst != '\0')
+	|| (int) value < value)
+	value = -1;
+
+    return (int) value;
+}
+
+NCURSES_EXPORT(void)
+_nc_setenv_num(const char *name, int value)
+{
+    if (name != 0 && value >= 0) {
+	char buffer[128];
+#if HAVE_SETENV
+	_nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer)) "%d", value);
+	setenv(name, buffer, 1);
+#elif HAVE_PUTENV
+	char *s;
+	_nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer)) "%s=%d", name, value);
+	if ((s = strdup(buffer)) != 0)
+	    putenv(s);
+#else
+#error expected setenv/putenv functions
+#endif
+    }
+}
diff --git a/ncurses/tinfo/hashed_db.c b/ncurses/tinfo/hashed_db.c
new file mode 100644
index 0000000..b78d98f
--- /dev/null
+++ b/ncurses/tinfo/hashed_db.c
@@ -0,0 +1,342 @@
+/****************************************************************************
+ * Copyright 2019,2020 Thomas E. Dickey                                     *
+ * Copyright 2006-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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                        2006-on                 *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+#include <tic.h>
+#include <hashed_db.h>
+
+#if USE_HASHED_DB
+
+MODULE_ID("$Id: hashed_db.c,v 1.19 2020/02/02 23:34:34 tom Exp $")
+
+#if HASHED_DB_API >= 2
+static DBC *cursor;
+#endif
+
+typedef struct _myconn {
+    struct _myconn *next;
+    DB *db;
+    char *path;
+    bool modify;
+} MYCONN;
+
+static MYCONN *connections;
+
+static void
+cleanup(void)
+{
+    while (connections != 0) {
+	_nc_db_close(connections->db);
+    }
+}
+
+static DB *
+find_connection(const char *path, bool modify)
+{
+    DB *result = 0;
+    MYCONN *p;
+
+    for (p = connections; p != 0; p = p->next) {
+	if (!strcmp(p->path, path) && p->modify == modify) {
+	    result = p->db;
+	    break;
+	}
+    }
+
+    return result;
+}
+
+static void
+drop_connection(DB * db)
+{
+    MYCONN *p, *q;
+
+    for (p = connections, q = 0; p != 0; q = p, p = p->next) {
+	if (p->db == db) {
+	    if (q != 0)
+		q->next = p->next;
+	    else
+		connections = p->next;
+	    free(p->path);
+	    free(p);
+	    break;
+	}
+    }
+}
+
+static void
+make_connection(DB * db, const char *path, bool modify)
+{
+    MYCONN *p = typeCalloc(MYCONN, 1);
+
+    if (p != 0) {
+	p->db = db;
+	p->path = strdup(path);
+	p->modify = modify;
+	if (p->path != 0) {
+	    p->next = connections;
+	    connections = p;
+	} else {
+	    free(p);
+	}
+    }
+}
+
+/*
+ * Open the database.
+ */
+NCURSES_EXPORT(DB *)
+_nc_db_open(const char *path, bool modify)
+{
+    DB *result = 0;
+    int code;
+
+    if (connections == 0)
+	atexit(cleanup);
+
+    if ((result = find_connection(path, modify)) == 0) {
+
+#if HASHED_DB_API >= 4
+	db_create(&result, NULL, 0);
+	if ((code = result->open(result,
+				 NULL,
+				 path,
+				 NULL,
+				 DB_HASH,
+				 modify ? DB_CREATE : DB_RDONLY,
+				 0644)) != 0) {
+	    result = 0;
+	}
+#elif HASHED_DB_API >= 3
+	db_create(&result, NULL, 0);
+	if ((code = result->open(result,
+				 path,
+				 NULL,
+				 DB_HASH,
+				 modify ? DB_CREATE : DB_RDONLY,
+				 0644)) != 0) {
+	    result = 0;
+	}
+#elif HASHED_DB_API >= 2
+	if ((code = db_open(path,
+			    DB_HASH,
+			    modify ? DB_CREATE : DB_RDONLY,
+			    0644,
+			    (DB_ENV *) 0,
+			    (DB_INFO *) 0,
+			    &result)) != 0) {
+	    result = 0;
+	}
+#else
+	if ((result = dbopen(path,
+			     modify ? (O_CREAT | O_RDWR) : O_RDONLY,
+			     0644,
+			     DB_HASH,
+			     NULL)) == 0) {
+	    code = errno;
+	}
+#endif
+	if (result != 0) {
+	    make_connection(result, path, modify);
+	    T(("opened %s", path));
+	} else {
+	    T(("cannot open %s: %s", path, strerror(code)));
+	}
+    }
+    return result;
+}
+
+/*
+ * Close the database.  Do not attempt to use the 'db' handle after this call.
+ */
+NCURSES_EXPORT(int)
+_nc_db_close(DB * db)
+{
+    int result;
+
+    drop_connection(db);
+#if HASHED_DB_API >= 2
+    result = db->close(db, 0);
+#else
+    result = db->close(db);
+#endif
+    return result;
+}
+
+/*
+ * Write a record to the database.
+ *
+ * Returns 0 on success.
+ *
+ * FIXME:  the FreeBSD cap_mkdb program assumes the database could have
+ * duplicates.  There appears to be no good reason for that (review/fix).
+ */
+NCURSES_EXPORT(int)
+_nc_db_put(DB * db, DBT * key, DBT * data)
+{
+    int result;
+#if HASHED_DB_API >= 2
+    /* remove any pre-existing value, since we do not want duplicates */
+    (void) db->del(db, NULL, key, 0);
+    result = db->put(db, NULL, key, data, DB_NOOVERWRITE);
+#else
+    result = db->put(db, key, data, R_NOOVERWRITE);
+#endif
+    return result;
+}
+
+/*
+ * Read a record from the database.
+ *
+ * Returns 0 on success.
+ */
+NCURSES_EXPORT(int)
+_nc_db_get(DB * db, DBT * key, DBT * data)
+{
+    int result;
+
+    memset(data, 0, sizeof(*data));
+#if HASHED_DB_API >= 2
+    result = db->get(db, NULL, key, data, 0);
+#else
+    result = db->get(db, key, data, 0);
+#endif
+    return result;
+}
+
+/*
+ * Read the first record from the database, ignoring order.
+ *
+ * Returns 0 on success.
+ */
+NCURSES_EXPORT(int)
+_nc_db_first(DB * db, DBT * key, DBT * data)
+{
+    int result;
+
+    memset(key, 0, sizeof(*key));
+    memset(data, 0, sizeof(*data));
+#if HASHED_DB_API >= 2
+    if ((result = db->cursor(db, NULL, &cursor, 0)) == 0) {
+	result = cursor->c_get(cursor, key, data, DB_FIRST);
+    }
+#else
+    result = db->seq(db, key, data, 0);
+#endif
+    return result;
+}
+
+/*
+ * Read the next record from the database, ignoring order.
+ *
+ * Returns 0 on success.
+ */
+NCURSES_EXPORT(int)
+_nc_db_next(DB * db, DBT * key, DBT * data)
+{
+    int result;
+
+#if HASHED_DB_API >= 2
+    (void) db;
+    if (cursor != 0) {
+	result = cursor->c_get(cursor, key, data, DB_NEXT);
+    } else {
+	result = -1;
+    }
+#else
+    result = db->seq(db, key, data, R_NEXT);
+#endif
+    return result;
+}
+
+/*
+ * Check if a record is a terminfo index record.  Index records are those that
+ * contain only an alias pointing to a list of aliases.
+ */
+NCURSES_EXPORT(bool)
+_nc_db_have_index(DBT * key, DBT * data, char **buffer, int *size)
+{
+    bool result = FALSE;
+    int used = (int) data->size - 1;
+    char *have = (char *) data->data;
+
+    (void) key;
+    if (*have++ == 2) {
+	result = TRUE;
+    }
+    /*
+     * Update params in any case for consistency with _nc_db_have_data().
+     */
+    *buffer = have;
+    *size = used;
+    return result;
+}
+
+/*
+ * Check if a record is the terminfo data record.  Ignore index records, e.g.,
+ * those that contain only an alias pointing to a list of aliases.
+ */
+NCURSES_EXPORT(bool)
+_nc_db_have_data(DBT * key, DBT * data, char **buffer, int *size)
+{
+    bool result = FALSE;
+    int used = (int) data->size - 1;
+    char *have = (char *) data->data;
+
+    if (*have++ == 0) {
+	if (data->size > key->size
+	    && IS_TIC_MAGIC(have)) {
+	    result = TRUE;
+	}
+    }
+    /*
+     * Update params in any case to make it simple to follow a index record
+     * to the data record.
+     */
+    *buffer = have;
+    *size = used;
+    return result;
+}
+
+#else
+
+extern
+NCURSES_EXPORT(void)
+_nc_hashed_db(void);
+
+NCURSES_EXPORT(void)
+_nc_hashed_db(void)
+{
+}
+
+#endif /* USE_HASHED_DB */
diff --git a/ncurses/tinfo/home_terminfo.c b/ncurses/tinfo/home_terminfo.c
new file mode 100644
index 0000000..7e626df
--- /dev/null
+++ b/ncurses/tinfo/home_terminfo.c
@@ -0,0 +1,67 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2012,2016 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                                                *
+ ****************************************************************************/
+
+/*
+ *	home_terminfo.c -- return the $HOME/.terminfo string, expanded
+ */
+
+#include <curses.priv.h>
+#include <tic.h>
+
+MODULE_ID("$Id: home_terminfo.c,v 1.17 2020/02/02 23:34:34 tom Exp $")
+
+/* ncurses extension...fall back on user's private directory */
+
+#define MyBuffer _nc_globals.home_terminfo
+
+NCURSES_EXPORT(char *)
+_nc_home_terminfo(void)
+{
+    char *result = 0;
+#if USE_HOME_TERMINFO
+    if (use_terminfo_vars()) {
+
+	if (MyBuffer == 0) {
+	    char *home;
+
+	    if ((home = getenv("HOME")) != 0) {
+		size_t want = (strlen(home) + sizeof(PRIVATE_INFO));
+		TYPE_MALLOC(char, want, MyBuffer);
+		_nc_SPRINTF(MyBuffer, _nc_SLIMIT(want) PRIVATE_INFO, home);
+	    }
+	}
+	result = MyBuffer;
+    }
+#endif
+    return result;
+}
diff --git a/ncurses/tinfo/init_keytry.c b/ncurses/tinfo/init_keytry.c
new file mode 100644
index 0000000..1669c64
--- /dev/null
+++ b/ncurses/tinfo/init_keytry.c
@@ -0,0 +1,112 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1999-2010,2016 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.                                                           *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+#include <tic.h>		/* struct tinfo_fkeys */
+
+MODULE_ID("$Id: init_keytry.c,v 1.19 2020/02/02 23:34:34 tom Exp $")
+
+/*
+**      _nc_init_keytry()
+**
+**      Construct the try for the current terminal's keypad keys.
+**
+*/
+
+/*
+ * Internal entrypoints use SCREEN* parameter to obtain capabilities rather
+ * than cur_term.
+ */
+#undef CUR
+#define CUR SP_TERMTYPE
+
+#if	BROKEN_LINKER
+#undef	_nc_tinfo_fkeys
+#endif
+
+/* LINT_PREPRO
+#if 0*/
+#include <init_keytry.h>
+/* LINT_PREPRO
+#endif*/
+
+#if	BROKEN_LINKER
+const struct tinfo_fkeys *
+_nc_tinfo_fkeysf(void)
+{
+    return _nc_tinfo_fkeys;
+}
+#endif
+
+NCURSES_EXPORT(void)
+_nc_init_keytry(SCREEN *sp)
+{
+    /* The sp->_keytry value is initialized in newterm(), where the sp
+     * structure is created, because we can not tell where keypad() or
+     * mouse_activate() (which will call keyok()) are first called.
+     */
+
+    if (sp != 0) {
+	unsigned n;
+
+	for (n = 0; _nc_tinfo_fkeys[n].code; n++) {
+	    if (_nc_tinfo_fkeys[n].offset < STRCOUNT) {
+		(void) _nc_add_to_try(&(sp->_keytry),
+				      CUR Strings[_nc_tinfo_fkeys[n].offset],
+				      _nc_tinfo_fkeys[n].code);
+	    }
+	}
+#if NCURSES_XNAMES
+	/*
+	 * Add any of the extended strings to the tries if their name begins
+	 * with 'k', i.e., they follow the convention of other terminfo key
+	 * names.
+	 */
+	{
+	    TERMTYPE *tp = &(sp->_term->type);
+	    for (n = STRCOUNT; n < NUM_STRINGS(tp); ++n) {
+		const char *name = ExtStrname(tp, (int) n, strnames);
+		char *value = tp->Strings[n];
+		if (name != 0
+		    && *name == 'k'
+		    && value != 0
+		    && NCURSES_SP_NAME(key_defined) (NCURSES_SP_ARGx
+						     value) == 0) {
+		    (void) _nc_add_to_try(&(sp->_keytry),
+					  value,
+					  n - STRCOUNT + KEY_MAX);
+		}
+	    }
+	}
+#endif
+#ifdef TRACE
+	_nc_trace_tries(sp->_keytry);
+#endif
+    }
+}
diff --git a/ncurses/tinfo/lib_acs.c b/ncurses/tinfo/lib_acs.c
new file mode 100644
index 0000000..4ede53f
--- /dev/null
+++ b/ncurses/tinfo/lib_acs.c
@@ -0,0 +1,326 @@
+/****************************************************************************
+ * Copyright 2018-2019,2020 Thomas E. Dickey                                *
+ * Copyright 1998-2014,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ *     and: Juergen Pfeifer                         2008                    *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+
+#ifndef CUR
+#define CUR SP_TERMTYPE
+#endif
+
+MODULE_ID("$Id: lib_acs.c,v 1.50 2020/02/02 23:34:34 tom Exp $")
+
+#if BROKEN_LINKER || USE_REENTRANT
+#define MyBuffer _nc_prescreen.real_acs_map
+NCURSES_EXPORT(chtype *)
+NCURSES_PUBLIC_VAR(acs_map) (void)
+{
+    if (MyBuffer == 0)
+	MyBuffer = typeCalloc(chtype, ACS_LEN);
+    return MyBuffer;
+}
+#undef MyBuffer
+#else
+NCURSES_EXPORT_VAR (chtype) acs_map[ACS_LEN] =
+{
+    0
+};
+#endif
+
+#ifdef USE_TERM_DRIVER
+NCURSES_EXPORT(chtype)
+NCURSES_SP_NAME(_nc_acs_char) (NCURSES_SP_DCLx int c)
+{
+    chtype *map;
+    if (c < 0 || c >= ACS_LEN)
+	return (chtype) 0;
+    map = (SP_PARM != 0) ? SP_PARM->_acs_map :
+#if BROKEN_LINKER || USE_REENTRANT
+	_nc_prescreen.real_acs_map
+#else
+	acs_map
+#endif
+	;
+    return map[c];
+}
+#endif /* USE_TERM_DRIVER */
+
+NCURSES_EXPORT(void)
+NCURSES_SP_NAME(_nc_init_acs) (NCURSES_SP_DCL0)
+{
+    chtype *fake_map = acs_map;
+    chtype *real_map = SP_PARM != 0 ? SP_PARM->_acs_map : fake_map;
+    int j;
+
+    T(("initializing ACS map"));
+
+    /*
+     * If we're using this from curses (rather than terminfo), we are storing
+     * the mapping information in the SCREEN struct so we can decide how to
+     * render it.
+     */
+    if (real_map != fake_map) {
+	for (j = 1; j < ACS_LEN; ++j) {
+	    real_map[j] = 0;
+	    fake_map[j] = A_ALTCHARSET | (chtype) j;
+	    if (SP_PARM)
+		SP_PARM->_screen_acs_map[j] = FALSE;
+	}
+    } else {
+	for (j = 1; j < ACS_LEN; ++j) {
+	    real_map[j] = 0;
+	}
+    }
+
+    /*
+     * Initializations for a UNIX-like multi-terminal environment.  Use
+     * ASCII chars and count on the terminfo description to do better.
+     */
+    real_map['l'] = '+';	/* should be upper left corner */
+    real_map['m'] = '+';	/* should be lower left corner */
+    real_map['k'] = '+';	/* should be upper right corner */
+    real_map['j'] = '+';	/* should be lower right corner */
+    real_map['u'] = '+';	/* should be tee pointing left */
+    real_map['t'] = '+';	/* should be tee pointing right */
+    real_map['v'] = '+';	/* should be tee pointing up */
+    real_map['w'] = '+';	/* should be tee pointing down */
+    real_map['q'] = '-';	/* should be horizontal line */
+    real_map['x'] = '|';	/* should be vertical line */
+    real_map['n'] = '+';	/* should be large plus or crossover */
+    real_map['o'] = '~';	/* should be scan line 1 */
+    real_map['s'] = '_';	/* should be scan line 9 */
+    real_map['`'] = '+';	/* should be diamond */
+    real_map['a'] = ':';	/* should be checker board (stipple) */
+    real_map['f'] = '\'';	/* should be degree symbol */
+    real_map['g'] = '#';	/* should be plus/minus */
+    real_map['~'] = 'o';	/* should be bullet */
+    real_map[','] = '<';	/* should be arrow pointing left */
+    real_map['+'] = '>';	/* should be arrow pointing right */
+    real_map['.'] = 'v';	/* should be arrow pointing down */
+    real_map['-'] = '^';	/* should be arrow pointing up */
+    real_map['h'] = '#';	/* should be board of squares */
+    real_map['i'] = '#';	/* should be lantern symbol */
+    real_map['0'] = '#';	/* should be solid square block */
+    /* these defaults were invented for ncurses */
+    real_map['p'] = '-';	/* should be scan line 3 */
+    real_map['r'] = '-';	/* should be scan line 7 */
+    real_map['y'] = '<';	/* should be less-than-or-equal-to */
+    real_map['z'] = '>';	/* should be greater-than-or-equal-to */
+    real_map['{'] = '*';	/* should be greek pi */
+    real_map['|'] = '!';	/* should be not-equal */
+    real_map['}'] = 'f';	/* should be pound-sterling symbol */
+    /* thick-line-drawing */
+    real_map['L'] = '+';	/* upper left corner */
+    real_map['M'] = '+';	/* lower left corner */
+    real_map['K'] = '+';	/* upper right corner */
+    real_map['J'] = '+';	/* lower right corner */
+    real_map['T'] = '+';	/* tee pointing left */
+    real_map['U'] = '+';	/* tee pointing right */
+    real_map['V'] = '+';	/* tee pointing up */
+    real_map['W'] = '+';	/* tee pointing down */
+    real_map['Q'] = '-';	/* horizontal line */
+    real_map['X'] = '|';	/* vertical line */
+    real_map['N'] = '+';	/* large plus or crossover */
+    /* double-line-drawing */
+    real_map['C'] = '+';	/* upper left corner */
+    real_map['D'] = '+';	/* lower left corner */
+    real_map['B'] = '+';	/* upper right corner */
+    real_map['A'] = '+';	/* lower right corner */
+    real_map['G'] = '+';	/* tee pointing left */
+    real_map['F'] = '+';	/* tee pointing right */
+    real_map['H'] = '+';	/* tee pointing up */
+    real_map['I'] = '+';	/* tee pointing down */
+    real_map['R'] = '-';	/* horizontal line */
+    real_map['Y'] = '|';	/* vertical line */
+    real_map['E'] = '+';	/* large plus or crossover */
+
+#ifdef USE_TERM_DRIVER
+    CallDriver_2(SP_PARM, td_initacs, real_map, fake_map);
+#else
+    if (ena_acs != NULL) {
+	NCURSES_PUTP2("ena_acs", ena_acs);
+    }
+#if NCURSES_EXT_FUNCS && defined(enter_pc_charset_mode) && defined(exit_pc_charset_mode)
+    /*
+     * Linux console "supports" the "PC ROM" character set by the coincidence
+     * that smpch/rmpch and smacs/rmacs have the same values.  ncurses has
+     * no codepage support (see SCO Merge for an example).  Outside of the
+     * values defined in acsc, there are no definitions for the "PC ROM"
+     * character set (assumed by some applications to be codepage 437), but we
+     * allow those applications to use those codepoints.
+     *
+     * test/blue.c uses this feature.
+     */
+#define PCH_KLUDGE(a,b) (a != 0 && b != 0 && !strcmp(a,b))
+    if (PCH_KLUDGE(enter_pc_charset_mode, enter_alt_charset_mode) &&
+	PCH_KLUDGE(exit_pc_charset_mode, exit_alt_charset_mode)) {
+	size_t i;
+	for (i = 1; i < ACS_LEN; ++i) {
+	    if (real_map[i] == 0) {
+		real_map[i] = (chtype) i;
+		if (real_map != fake_map) {
+		    if (SP != 0)
+			SP->_screen_acs_map[i] = TRUE;
+		}
+	    }
+	}
+    }
+#endif
+
+    if (acs_chars != NULL) {
+	size_t i = 0;
+	size_t length = strlen(acs_chars);
+
+	while (i + 1 < length) {
+	    if (acs_chars[i] != 0 && UChar(acs_chars[i]) < ACS_LEN) {
+		real_map[UChar(acs_chars[i])] = UChar(acs_chars[i + 1]) | A_ALTCHARSET;
+		T(("#%d real_map[%s] = %s",
+		   (int) i,
+		   _tracechar(UChar(acs_chars[i])),
+		   _tracechtype(real_map[UChar(acs_chars[i])])));
+		if (SP != 0) {
+		    SP->_screen_acs_map[UChar(acs_chars[i])] = TRUE;
+		}
+	    }
+	    i += 2;
+	}
+    }
+#ifdef TRACE
+    /* Show the equivalent mapping, noting if it does not match the
+     * given attribute, whether by re-ordering or duplication.
+     */
+    if (USE_TRACEF(TRACE_CALLS)) {
+	size_t n, m;
+	char show[ACS_LEN * 2 + 1];
+	for (n = 1, m = 0; n < ACS_LEN; n++) {
+	    if (real_map[n] != 0) {
+		show[m++] = (char) n;
+		show[m++] = (char) ChCharOf(real_map[n]);
+	    }
+	}
+	show[m] = 0;
+	if (acs_chars == NULL || strcmp(acs_chars, show))
+	    _tracef("%s acs_chars %s",
+		    (acs_chars == NULL) ? "NULL" : "READ",
+		    _nc_visbuf(acs_chars));
+	_tracef("%s acs_chars %s",
+		(acs_chars == NULL)
+		? "NULL"
+		: (strcmp(acs_chars, show)
+		   ? "DIFF"
+		   : "SAME"),
+		_nc_visbuf(show));
+	_nc_unlock_global(tracef);
+    }
+#endif /* TRACE */
+#endif
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(void)
+_nc_init_acs(void)
+{
+    NCURSES_SP_NAME(_nc_init_acs) (CURRENT_SCREEN);
+}
+#endif
+
+#if !NCURSES_WCWIDTH_GRAPHICS
+NCURSES_EXPORT(int)
+_nc_wacs_width(unsigned ch)
+{
+    int result;
+    switch (ch) {
+    case 0x00a3:		/* FALLTHRU - ncurses pound-sterling symbol */
+    case 0x00b0:		/* FALLTHRU - VT100 degree symbol */
+    case 0x00b1:		/* FALLTHRU - VT100 plus/minus */
+    case 0x00b7:		/* FALLTHRU - VT100 bullet */
+    case 0x03c0:		/* FALLTHRU - ncurses greek pi */
+    case 0x2190:		/* FALLTHRU - Teletype arrow pointing left */
+    case 0x2191:		/* FALLTHRU - Teletype arrow pointing up */
+    case 0x2192:		/* FALLTHRU - Teletype arrow pointing right */
+    case 0x2193:		/* FALLTHRU - Teletype arrow pointing down */
+    case 0x2260:		/* FALLTHRU - ncurses not-equal */
+    case 0x2264:		/* FALLTHRU - ncurses less-than-or-equal-to */
+    case 0x2265:		/* FALLTHRU - ncurses greater-than-or-equal-to */
+    case 0x23ba:		/* FALLTHRU - VT100 scan line 1 */
+    case 0x23bb:		/* FALLTHRU - ncurses scan line 3 */
+    case 0x23bc:		/* FALLTHRU - ncurses scan line 7 */
+    case 0x23bd:		/* FALLTHRU - VT100 scan line 9 */
+    case 0x2500:		/* FALLTHRU - VT100 horizontal line */
+    case 0x2501:		/* FALLTHRU - thick horizontal line */
+    case 0x2502:		/* FALLTHRU - VT100 vertical line */
+    case 0x2503:		/* FALLTHRU - thick vertical line */
+    case 0x250c:		/* FALLTHRU - VT100 upper left corner */
+    case 0x250f:		/* FALLTHRU - thick upper left corner */
+    case 0x2510:		/* FALLTHRU - VT100 upper right corner */
+    case 0x2513:		/* FALLTHRU - thick upper right corner */
+    case 0x2514:		/* FALLTHRU - VT100 lower left corner */
+    case 0x2517:		/* FALLTHRU - thick lower left corner */
+    case 0x2518:		/* FALLTHRU - VT100 lower right corner */
+    case 0x251b:		/* FALLTHRU - thick lower right corner */
+    case 0x251c:		/* FALLTHRU - VT100 tee pointing left */
+    case 0x2523:		/* FALLTHRU - thick tee pointing left */
+    case 0x2524:		/* FALLTHRU - VT100 tee pointing right */
+    case 0x252b:		/* FALLTHRU - thick tee pointing right */
+    case 0x252c:		/* FALLTHRU - VT100 tee pointing down */
+    case 0x2533:		/* FALLTHRU - thick tee pointing down */
+    case 0x2534:		/* FALLTHRU - VT100 tee pointing up */
+    case 0x253b:		/* FALLTHRU - thick tee pointing up */
+    case 0x253c:		/* FALLTHRU - VT100 large plus or crossover */
+    case 0x254b:		/* FALLTHRU - thick large plus or crossover */
+    case 0x2550:		/* FALLTHRU - double horizontal line */
+    case 0x2551:		/* FALLTHRU - double vertical line */
+    case 0x2554:		/* FALLTHRU - double upper left corner */
+    case 0x2557:		/* FALLTHRU - double upper right corner */
+    case 0x255a:		/* FALLTHRU - double lower left corner */
+    case 0x255d:		/* FALLTHRU - double lower right corner */
+    case 0x2560:		/* FALLTHRU - double tee pointing right */
+    case 0x2563:		/* FALLTHRU - double tee pointing left */
+    case 0x2566:		/* FALLTHRU - double tee pointing down */
+    case 0x2569:		/* FALLTHRU - double tee pointing up */
+    case 0x256c:		/* FALLTHRU - double large plus or crossover */
+    case 0x2592:		/* FALLTHRU - VT100 checker board (stipple) */
+    case 0x25ae:		/* FALLTHRU - Teletype solid square block */
+    case 0x25c6:		/* FALLTHRU - VT100 diamond */
+    case 0x2603:		/* FALLTHRU - Teletype lantern symbol */
+	result = 1;
+	break;
+    default:
+	result = wcwidth(ch);
+	break;
+    }
+    return result;
+}
+#endif /* !NCURSES_WCWIDTH_GRAPHICS */
diff --git a/ncurses/tinfo/lib_baudrate.c b/ncurses/tinfo/lib_baudrate.c
new file mode 100644
index 0000000..311c41a
--- /dev/null
+++ b/ncurses/tinfo/lib_baudrate.c
@@ -0,0 +1,317 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ ****************************************************************************/
+
+/*
+ *	lib_baudrate.c
+ *
+ */
+
+#include <curses.priv.h>
+#include <termcap.h>		/* ospeed */
+#if defined(__FreeBSD__) || defined(__OpenBSD__)
+#include <sys/param.h>
+#endif
+
+/*
+ * These systems use similar header files, which define B1200 as 1200, etc.,
+ * but can be overridden by defining USE_OLD_TTY so B1200 is 9, which makes all
+ * of the indices up to B115200 fit nicely in a 'short', allowing us to retain
+ * ospeed's type for compatibility.
+ */
+#if NCURSES_OSPEED_COMPAT && \
+ 	((defined(__FreeBSD__) && (__FreeBSD_version < 700000)) || \
+	defined(__NetBSD__) || \
+	((defined(__OpenBSD__) && OpenBSD < 201510)) || \
+	defined(__APPLE__))
+#undef B0
+#undef B50
+#undef B75
+#undef B110
+#undef B134
+#undef B150
+#undef B200
+#undef B300
+#undef B600
+#undef B1200
+#undef B1800
+#undef B2400
+#undef B4800
+#undef B9600
+#undef B19200
+#undef EXTA
+#undef B38400
+#undef EXTB
+#undef B57600
+#undef B115200
+#undef B230400
+#undef B460800
+#undef B921600
+#define USE_OLD_TTY
+#include <sys/ttydev.h>
+#else
+#undef USE_OLD_TTY
+#endif /* USE_OLD_TTY */
+
+MODULE_ID("$Id: lib_baudrate.c,v 1.45 2020/09/05 21:15:32 tom Exp $")
+
+/*
+ *	int
+ *	baudrate()
+ *
+ *	Returns the current terminal's baud rate.
+ *
+ */
+
+struct speed {
+    int given_speed;		/* values for 'ospeed' */
+    int actual_speed;		/* the actual speed */
+};
+
+#if !defined(EXP_WIN32_DRIVER)
+#define DATA(number) { B##number, number }
+
+static struct speed const speeds[] =
+{
+    DATA(0),
+    DATA(50),
+    DATA(75),
+    DATA(110),
+    DATA(134),
+    DATA(150),
+    DATA(200),
+    DATA(300),
+    DATA(600),
+    DATA(1200),
+    DATA(1800),
+    DATA(2400),
+    DATA(4800),
+    DATA(9600),
+#ifdef B19200
+    DATA(19200),
+#elif defined(EXTA)
+    {EXTA, 19200},
+#endif
+#ifdef B28800
+    DATA(28800),
+#endif
+#ifdef B38400
+    DATA(38400),
+#elif defined(EXTB)
+    {EXTB, 38400},
+#endif
+#ifdef B57600
+    DATA(57600),
+#endif
+    /* ifdef to prevent overflow when OLD_TTY is not available */
+#if !(NCURSES_OSPEED_COMPAT && defined(__FreeBSD__) && (__FreeBSD_version > 700000))
+#ifdef B76800
+    DATA(76800),
+#endif
+#ifdef B115200
+    DATA(115200),
+#endif
+#ifdef B153600
+    DATA(153600),
+#endif
+#ifdef B230400
+    DATA(230400),
+#endif
+#ifdef B307200
+    DATA(307200),
+#endif
+#ifdef B460800
+    DATA(460800),
+#endif
+#ifdef B500000
+    DATA(500000),
+#endif
+#ifdef B576000
+    DATA(576000),
+#endif
+#ifdef B921600
+    DATA(921600),
+#endif
+#ifdef B1000000
+    DATA(1000000),
+#endif
+#ifdef B1152000
+    DATA(1152000),
+#endif
+#ifdef B1500000
+    DATA(1500000),
+#endif
+#ifdef B2000000
+    DATA(2000000),
+#endif
+#ifdef B2500000
+    DATA(2500000),
+#endif
+#ifdef B3000000
+    DATA(3000000),
+#endif
+#ifdef B3500000
+    DATA(3500000),
+#endif
+#ifdef B4000000
+    DATA(4000000),
+#endif
+#endif
+};
+#endif /* !EXP_WIN32_DRIVER */
+
+NCURSES_EXPORT(int)
+_nc_baudrate(int OSpeed)
+{
+#if defined(EXP_WIN32_DRIVER)
+    /* On Windows this is a noop */
+    (void) OSpeed;
+    return (OK);
+#else
+#if !USE_REENTRANT
+    static int last_OSpeed;
+    static int last_baudrate;
+#endif
+
+    int result = ERR;
+
+    if (OSpeed < 0)
+	OSpeed = (NCURSES_OSPEED) OSpeed;
+    if (OSpeed < 0)
+	OSpeed = (unsigned short) OSpeed;
+#if !USE_REENTRANT
+    if (OSpeed == last_OSpeed) {
+	result = last_baudrate;
+    }
+#endif
+    if (result == ERR) {
+	if (OSpeed >= 0) {
+	    unsigned i;
+
+	    for (i = 0; i < SIZEOF(speeds); i++) {
+		if (speeds[i].given_speed > OSpeed) {
+		    break;
+		}
+		if (speeds[i].given_speed == OSpeed) {
+		    result = speeds[i].actual_speed;
+		    break;
+		}
+	    }
+	}
+#if !USE_REENTRANT
+	if (OSpeed != last_OSpeed) {
+	    last_OSpeed = OSpeed;
+	    last_baudrate = result;
+	}
+#endif
+    }
+    return (result);
+#endif /* !EXP_WIN32_DRIVER */
+}
+
+NCURSES_EXPORT(int)
+_nc_ospeed(int BaudRate)
+{
+    int result = 1;
+#if defined(EXP_WIN32_DRIVER)
+    (void) BaudRate;
+#else
+    if (BaudRate >= 0) {
+	unsigned i;
+
+	for (i = 0; i < SIZEOF(speeds); i++) {
+	    if (speeds[i].actual_speed == BaudRate) {
+		result = speeds[i].given_speed;
+		break;
+	    }
+	}
+    }
+#endif
+    return (result);
+}
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(baudrate) (NCURSES_SP_DCL0)
+{
+    int result;
+
+    T((T_CALLED("baudrate(%p)"), (void *) SP_PARM));
+
+#if defined(EXP_WIN32_DRIVER)
+    result = OK;
+#else
+    /*
+     * In debugging, allow the environment symbol to override when we're
+     * redirecting to a file, so we can construct repeatable test-cases
+     * that take into account costs that depend on baudrate.
+     */
+#ifdef TRACE
+    if (IsValidTIScreen(SP_PARM)
+	&& !NC_ISATTY(fileno((SP_PARM && SP_PARM->_ofp) ? SP_PARM->_ofp : stdout))
+	&& getenv("BAUDRATE") != 0) {
+	int ret;
+	if ((ret = _nc_getenv_num("BAUDRATE")) <= 0)
+	    ret = 9600;
+	ospeed = (NCURSES_OSPEED) _nc_ospeed(ret);
+	returnCode(ret);
+    }
+#endif
+
+    if (IsValidTIScreen(SP_PARM)) {
+#ifdef USE_OLD_TTY
+	result = (int) cfgetospeed(&(TerminalOf(SP_PARM)->Nttyb));
+	ospeed = (NCURSES_OSPEED) _nc_ospeed(result);
+#else /* !USE_OLD_TTY */
+#ifdef TERMIOS
+	ospeed = (NCURSES_OSPEED) cfgetospeed(&(TerminalOf(SP_PARM)->Nttyb));
+#else
+	ospeed = (NCURSES_OSPEED) TerminalOf(SP_PARM)->Nttyb.sg_ospeed;
+#endif
+	result = _nc_baudrate(ospeed);
+#endif
+	TerminalOf(SP_PARM)->_baudrate = result;
+    } else {
+	result = ERR;
+    }
+#endif /* !EXP_WIN32_DRIVER */
+    returnCode(result);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+baudrate(void)
+{
+    return NCURSES_SP_NAME(baudrate) (CURRENT_SCREEN);
+}
+#endif
diff --git a/ncurses/tinfo/lib_cur_term.c b/ncurses/tinfo/lib_cur_term.c
new file mode 100644
index 0000000..1f8db2c
--- /dev/null
+++ b/ncurses/tinfo/lib_cur_term.c
@@ -0,0 +1,200 @@
+/****************************************************************************
+,* Copyright 2020-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey <dickey@clark.net> 1997                        *
+ ****************************************************************************/
+/*
+ * Module that "owns" the 'cur_term' variable:
+ *
+ *	TERMINAL *set_curterm(TERMINAL *)
+ *	int del_curterm(TERMINAL *)
+ */
+
+#include <curses.priv.h>
+#include <termcap.h>		/* ospeed */
+#include <tic.h>		/* VALID_STRING */
+
+MODULE_ID("$Id: lib_cur_term.c,v 1.49 2022/05/28 17:56:55 tom Exp $")
+
+#undef CUR
+#define CUR TerminalType(termp).
+
+#if USE_REENTRANT
+
+NCURSES_EXPORT(TERMINAL *)
+NCURSES_SP_NAME(_nc_get_cur_term) (NCURSES_SP_DCL0)
+{
+    return ((0 != TerminalOf(SP_PARM)) ? TerminalOf(SP_PARM) : CurTerm);
+}
+
+#if NCURSES_SP_FUNCS
+
+NCURSES_EXPORT(TERMINAL *)
+_nc_get_cur_term(void)
+{
+    return NCURSES_SP_NAME(_nc_get_cur_term) (CURRENT_SCREEN);
+}
+#endif
+
+NCURSES_EXPORT(TERMINAL *)
+NCURSES_PUBLIC_VAR(cur_term) (void)
+{
+#if NCURSES_SP_FUNCS
+    return NCURSES_SP_NAME(_nc_get_cur_term) (CURRENT_SCREEN);
+#else
+    return NCURSES_SP_NAME(_nc_get_cur_term) (NCURSES_SP_ARG);
+#endif
+}
+
+#else
+NCURSES_EXPORT_VAR(TERMINAL *) cur_term = 0;
+#endif
+
+NCURSES_EXPORT(TERMINAL *)
+NCURSES_SP_NAME(set_curterm) (NCURSES_SP_DCLx TERMINAL *termp)
+{
+    TERMINAL *oldterm;
+
+    T((T_CALLED("set_curterm(%p)"), (void *) termp));
+
+    _nc_lock_global(curses);
+    oldterm = cur_term;
+    if (SP_PARM)
+	SP_PARM->_term = termp;
+#if USE_REENTRANT
+    CurTerm = termp;
+#else
+    cur_term = termp;
+#endif
+    if (termp != 0) {
+#ifdef USE_TERM_DRIVER
+	TERMINAL_CONTROL_BLOCK *TCB = (TERMINAL_CONTROL_BLOCK *) termp;
+	ospeed = (NCURSES_OSPEED) _nc_ospeed(termp->_baudrate);
+	if (TCB->drv &&
+	    TCB->drv->isTerminfo &&
+	    TerminalType(termp).Strings) {
+	    PC = (char) (VALID_STRING(pad_char) ? pad_char[0] : 0);
+	}
+	TCB->csp = SP_PARM;
+#else
+	ospeed = (NCURSES_OSPEED) _nc_ospeed(termp->_baudrate);
+	if (TerminalType(termp).Strings) {
+	    PC = (char) (VALID_STRING(pad_char) ? pad_char[0] : 0);
+	}
+#endif
+#if !USE_REENTRANT
+	save_ttytype(termp);
+#endif
+    }
+    _nc_unlock_global(curses);
+
+    T((T_RETURN("%p"), (void *) oldterm));
+    return (oldterm);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(TERMINAL *)
+set_curterm(TERMINAL *termp)
+{
+    return NCURSES_SP_NAME(set_curterm) (CURRENT_SCREEN, termp);
+}
+#endif
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(del_curterm) (NCURSES_SP_DCLx TERMINAL *termp)
+{
+    int rc = ERR;
+
+    T((T_CALLED("del_curterm(%p, %p)"), (void *) SP_PARM, (void *) termp));
+
+    if (termp != 0) {
+#ifdef USE_TERM_DRIVER
+	TERMINAL_CONTROL_BLOCK *TCB = (TERMINAL_CONTROL_BLOCK *) termp;
+#endif
+	TERMINAL *cur = (
+#if USE_REENTRANT
+			    NCURSES_SP_NAME(_nc_get_cur_term) (NCURSES_SP_ARG)
+#else
+			    cur_term
+#endif
+	);
+
+#if NCURSES_EXT_NUMBERS
+#if NCURSES_EXT_COLORS
+	_nc_free_termtype1(&termp->type);
+#else
+	_nc_free_termtype2(&termp->type);
+#endif
+#endif
+	_nc_free_termtype2(&TerminalType(termp));
+	if (termp == cur)
+	    NCURSES_SP_NAME(set_curterm) (NCURSES_SP_ARGx 0);
+
+	FreeIfNeeded(termp->_termname);
+#if USE_HOME_TERMINFO
+	if (_nc_globals.home_terminfo != 0) {
+	    FreeAndNull(_nc_globals.home_terminfo);
+	}
+#endif
+#ifdef USE_TERM_DRIVER
+	if (TCB->drv)
+	    TCB->drv->td_release(TCB);
+#endif
+#if NO_LEAKS
+	/* discard memory used in tgetent's cache for this terminal */
+	_nc_tgetent_leak(termp);
+#endif
+	if (--_nc_globals.terminal_count == 0) {
+	    _nc_free_tparm(termp);
+	}
+
+	free(termp->tparm_state.fmt_buff);
+	free(termp->tparm_state.out_buff);
+	free(termp);
+
+	rc = OK;
+    }
+
+    returnCode(rc);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+del_curterm(TERMINAL *termp)
+{
+    int rc;
+
+    _nc_lock_global(curses);
+    rc = NCURSES_SP_NAME(del_curterm) (CURRENT_SCREEN, termp);
+    _nc_unlock_global(curses);
+
+    return (rc);
+}
+#endif
diff --git a/ncurses/tinfo/lib_data.c b/ncurses/tinfo/lib_data.c
new file mode 100644
index 0000000..6f6c583
--- /dev/null
+++ b/ncurses/tinfo/lib_data.c
@@ -0,0 +1,406 @@
+/****************************************************************************
+ * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ *     and: Juergen Pfeifer                                                 *
+ ****************************************************************************/
+
+/*
+**	lib_data.c
+**
+**	Common data that may/may not be allocated, but is referenced globally
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_data.c,v 1.87 2022/07/09 22:03:21 tom Exp $")
+
+/*
+ * OS/2's native linker complains if we don't initialize public data when
+ * constructing a dll (reported by J.J.G.Ripoll).
+ */
+#if USE_REENTRANT
+NCURSES_EXPORT(WINDOW *)
+NCURSES_PUBLIC_VAR(stdscr) (void)
+{
+    return CURRENT_SCREEN ? StdScreen(CURRENT_SCREEN) : 0;
+}
+NCURSES_EXPORT(WINDOW *)
+NCURSES_PUBLIC_VAR(curscr) (void)
+{
+    return CURRENT_SCREEN ? CurScreen(CURRENT_SCREEN) : 0;
+}
+NCURSES_EXPORT(WINDOW *)
+NCURSES_PUBLIC_VAR(newscr) (void)
+{
+    return CURRENT_SCREEN ? NewScreen(CURRENT_SCREEN) : 0;
+}
+#else
+NCURSES_EXPORT_VAR(WINDOW *) stdscr = 0;
+NCURSES_EXPORT_VAR(WINDOW *) curscr = 0;
+NCURSES_EXPORT_VAR(WINDOW *) newscr = 0;
+#endif
+
+NCURSES_EXPORT_VAR(SCREEN *) _nc_screen_chain = 0;
+
+/*
+ * The variable 'SP' will be defined as a function on systems that cannot link
+ * data-only modules, since it is used in a lot of places within ncurses and we
+ * cannot guarantee that any application will use any particular function.  We
+ * put the WINDOW variables in this module, because it appears that any
+ * application that uses them will also use 'SP'.
+ *
+ * This module intentionally does not reference other ncurses modules, to avoid
+ * module coupling that increases the size of the executable.
+ */
+#if BROKEN_LINKER
+static SCREEN *my_screen;
+
+NCURSES_EXPORT(SCREEN *)
+_nc_screen(void)
+{
+    return my_screen;
+}
+
+NCURSES_EXPORT(int)
+_nc_alloc_screen(void)
+{
+    my_screen = _nc_alloc_screen_sp();
+    T(("_nc_alloc_screen_sp %p", my_screen));
+    return (my_screen != 0);
+}
+
+NCURSES_EXPORT(void)
+_nc_set_screen(SCREEN *sp)
+{
+    my_screen = sp;
+}
+
+#else
+
+NCURSES_EXPORT_VAR(SCREEN *) SP = NULL; /* Some linkers require initialized data... */
+#endif
+/* *INDENT-OFF* */
+#define CHARS_0s { '\0' }
+
+#define TGETENT_0 { 0L, FALSE, NULL, NULL, NULL }
+#define TGETENT_0s { TGETENT_0, TGETENT_0, TGETENT_0, TGETENT_0 }
+
+NCURSES_EXPORT_VAR(NCURSES_GLOBALS) _nc_globals = {
+    0,				/* have_sigtstp */
+    0,				/* have_sigwinch */
+    0,				/* cleanup_nested */
+
+    FALSE,			/* init_signals */
+    FALSE,			/* init_screen */
+
+    NULL,			/* comp_sourcename */
+    NULL,			/* comp_termtype */
+
+    FALSE,			/* have_tic_directory */
+    FALSE,			/* keep_tic_directory */
+    0,				/* tic_directory */
+
+    NULL,			/* dbi_list */
+    0,				/* dbi_size */
+
+    NULL,			/* first_name */
+    NULL,			/* keyname_table */
+    0,				/* init_keyname */
+
+    0,				/* slk_format */
+
+    2048,			/* getstr_limit */
+
+    NULL,			/* safeprint_buf */
+    0,				/* safeprint_used */
+
+    TGETENT_0s,			/* tgetent_cache */
+    0,				/* tgetent_index */
+    0,				/* tgetent_sequence */
+    0,				/* terminal_count */
+
+    0,				/* dbd_blob */
+    0,				/* dbd_list */
+    0,				/* dbd_size */
+    0,				/* dbd_time */
+    { { 0, 0 } },		/* dbd_vars */
+
+#if HAVE_TSEARCH
+    NULL,			/* cached_tparm */
+    0,				/* count_tparm */
+#endif /* HAVE_TSEARCH */
+
+#ifdef USE_TERM_DRIVER
+    0,				/* term_driver */
+#endif
+
+#ifndef USE_SP_WINDOWLIST
+    0,				/* _nc_windowlist */
+#endif
+
+#if USE_HOME_TERMINFO
+    NULL,			/* home_terminfo */
+#endif
+
+#if !USE_SAFE_SPRINTF
+    0,				/* safeprint_cols */
+    0,				/* safeprint_rows */
+#endif
+
+#ifdef USE_PTHREADS
+    PTHREAD_MUTEX_INITIALIZER,	/* mutex_curses */
+    PTHREAD_MUTEX_INITIALIZER,	/* mutex_prescreen */
+    PTHREAD_MUTEX_INITIALIZER,	/* mutex_screen */
+    PTHREAD_MUTEX_INITIALIZER,	/* mutex_update */
+    PTHREAD_MUTEX_INITIALIZER,	/* mutex_tst_tracef */
+    PTHREAD_MUTEX_INITIALIZER,	/* mutex_tracef */
+    0,				/* nested_tracef */
+    0,				/* use_pthreads */
+#if USE_PTHREADS_EINTR
+    0,				/* read_thread */
+#endif
+#endif
+#if USE_WIDEC_SUPPORT
+    CHARS_0s,			/* key_name */
+#endif
+#ifdef TRACE
+    FALSE,			/* trace_opened */
+    CHARS_0s,			/* trace_fname */
+    0,				/* trace_level */
+    NULL,			/* trace_fp */
+    -1,				/* trace_fd */
+
+    NULL,			/* tracearg_buf */
+    0,				/* tracearg_used */
+
+    NULL,			/* tracebuf_ptr */
+    0,				/* tracebuf_used */
+
+    CHARS_0s,			/* tracechr_buf */
+
+    NULL,			/* tracedmp_buf */
+    0,				/* tracedmp_used */
+
+    NULL,			/* tracetry_buf */
+    0,				/* tracetry_used */
+
+    { CHARS_0s, CHARS_0s },	/* traceatr_color_buf */
+    0,				/* traceatr_color_sel */
+    -1,				/* traceatr_color_last */
+#if !defined(USE_PTHREADS) && USE_REENTRANT
+    0,				/* nested_tracef */
+#endif
+#endif /* TRACE */
+#if NO_LEAKS
+    FALSE,			/* leak_checking */
+#endif
+};
+
+#define STACK_FRAME_0	{ { 0 }, 0 }
+#define STACK_FRAME_0s	{ STACK_FRAME_0 }
+#define NUM_VARS_0s	{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
+
+#define RIPOFF_0	{ 0,0,0 }
+#define RIPOFF_0s	{ RIPOFF_0 }
+
+NCURSES_EXPORT_VAR(NCURSES_PRESCREEN) _nc_prescreen = {
+    NULL,			/* allocated */
+    TRUE,			/* use_env */
+    FALSE,			/* filter_mode */
+    A_NORMAL,			/* previous_attr */
+    {				/* tparm_state */
+	NULL,			/* tparam_base */
+
+	STACK_FRAME_0s,		/* stack */
+	0,			/* stack_ptr */
+
+	NULL,			/* out_buff */
+	0,			/* out_size */
+	0,			/* out_used */
+
+	NULL,			/* fmt_buff */
+	0,			/* fmt_size */
+
+	NUM_VARS_0s,		/* static_vars */
+#ifdef TRACE
+	NULL,			/* tname */
+#endif
+    },
+    NULL,			/* saved_tty */
+    FALSE,			/* use_tioctl */
+    0,				/* _outch */
+#ifndef USE_SP_RIPOFF
+    RIPOFF_0s,			/* ripoff */
+    NULL,			/* rsp */
+#endif
+#if NCURSES_NO_PADDING
+    FALSE,			/* flag to set if padding disabled  */
+#endif
+#if BROKEN_LINKER || USE_REENTRANT
+    NULL,			/* real_acs_map */
+    0,				/* LINES */
+    0,				/* COLS */
+    8,				/* TABSIZE */
+    1000,			/* ESCDELAY */
+    0,				/* cur_term */
+#endif
+#ifdef TRACE
+#if BROKEN_LINKER || USE_REENTRANT
+    0L,				/* _outchars */
+    NULL,			/* _tputs_trace */
+#endif
+#endif
+};
+/* *INDENT-ON* */
+
+/*
+ * wgetch() and other functions with a WINDOW* parameter may use a SCREEN*
+ * internally, and it is useful to allow those to be invoked without switching
+ * SCREEN's, e.g., for multi-threaded applications.
+ */
+NCURSES_EXPORT(SCREEN *)
+_nc_screen_of(WINDOW *win)
+{
+    SCREEN *sp = 0;
+
+    if (win != 0) {
+	sp = WINDOW_EXT(win, screen);
+    }
+    return (sp);
+}
+
+/******************************************************************************/
+#ifdef USE_PTHREADS
+static void
+init_global_mutexes(void)
+{
+    static bool initialized = FALSE;
+
+    if (!initialized) {
+	initialized = TRUE;
+	_nc_mutex_init(&_nc_globals.mutex_curses);
+	_nc_mutex_init(&_nc_globals.mutex_prescreen);
+	_nc_mutex_init(&_nc_globals.mutex_screen);
+	_nc_mutex_init(&_nc_globals.mutex_update);
+	_nc_mutex_init(&_nc_globals.mutex_tst_tracef);
+	_nc_mutex_init(&_nc_globals.mutex_tracef);
+    }
+}
+
+NCURSES_EXPORT(void)
+_nc_init_pthreads(void)
+{
+    if (_nc_use_pthreads)
+	return;
+# if USE_WEAK_SYMBOLS
+    if ((pthread_mutex_init) == 0)
+	return;
+    if ((pthread_mutex_lock) == 0)
+	return;
+    if ((pthread_mutex_unlock) == 0)
+	return;
+    if ((pthread_mutex_trylock) == 0)
+	return;
+    if ((pthread_mutexattr_settype) == 0)
+	return;
+# endif
+    _nc_use_pthreads = 1;
+    init_global_mutexes();
+}
+
+/*
+ * Use recursive mutexes if we have them - they're part of Unix98.
+ * For the cases where we do not, _nc_mutex_trylock() is used to avoid a
+ * deadlock, at the expense of memory leaks and unexpected failures that
+ * may not be handled by typical clients.
+ *
+ * FIXME - need configure check for PTHREAD_MUTEX_RECURSIVE, define it to
+ * PTHREAD_MUTEX_NORMAL if not supported.
+ */
+NCURSES_EXPORT(void)
+_nc_mutex_init(pthread_mutex_t * obj)
+{
+    pthread_mutexattr_t recattr;
+
+    if (_nc_use_pthreads) {
+	pthread_mutexattr_init(&recattr);
+	pthread_mutexattr_settype(&recattr, PTHREAD_MUTEX_RECURSIVE);
+	pthread_mutex_init(obj, &recattr);
+    }
+}
+
+NCURSES_EXPORT(int)
+_nc_mutex_lock(pthread_mutex_t * obj)
+{
+    int rc = 0;
+    if (_nc_use_pthreads != 0)
+	rc = pthread_mutex_lock(obj);
+    return rc;
+}
+
+NCURSES_EXPORT(int)
+_nc_mutex_trylock(pthread_mutex_t * obj)
+{
+    int rc = 0;
+    if (_nc_use_pthreads != 0)
+	rc = pthread_mutex_trylock(obj);
+    return rc;
+}
+
+NCURSES_EXPORT(int)
+_nc_mutex_unlock(pthread_mutex_t * obj)
+{
+    int rc = 0;
+    if (_nc_use_pthreads != 0)
+	rc = pthread_mutex_unlock(obj);
+    return rc;
+}
+#endif /* USE_PTHREADS */
+
+#if defined(USE_PTHREADS) || USE_PTHREADS_EINTR
+#if USE_WEAK_SYMBOLS
+/*
+ * NB: sigprocmask(2) is global but pthread_sigmask(3p)
+ * only for the calling thread.
+ */
+NCURSES_EXPORT(int)
+_nc_sigprocmask(int how, const sigset_t * newmask, sigset_t * oldmask)
+{
+    if ((pthread_sigmask))
+	return pthread_sigmask(how, newmask, oldmask);
+    else
+	return (sigprocmask) (how, newmask, oldmask);
+}
+#endif
+#endif /* USE_PTHREADS */
diff --git a/ncurses/tinfo/lib_has_cap.c b/ncurses/tinfo/lib_has_cap.c
new file mode 100644
index 0000000..cbf68b3
--- /dev/null
+++ b/ncurses/tinfo/lib_has_cap.c
@@ -0,0 +1,95 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2009,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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-2003               *
+ *     and: Juergen Pfeifer                         2009                    *
+ ****************************************************************************/
+
+/*
+**	lib_has_cap.c
+**
+**	The routines to query terminal capabilities
+**
+*/
+
+#include <curses.priv.h>
+
+#ifndef CUR
+#define CUR SP_TERMTYPE
+#endif
+
+MODULE_ID("$Id: lib_has_cap.c,v 1.11 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(bool)
+NCURSES_SP_NAME(has_ic) (NCURSES_SP_DCL0)
+{
+    bool code = FALSE;
+
+    T((T_CALLED("has_ic(%p)"), (void *) SP_PARM));
+
+    if (HasTInfoTerminal(SP_PARM)) {
+	code = ((insert_character || parm_ich
+		 || (enter_insert_mode && exit_insert_mode))
+		&& (delete_character || parm_dch)) ? TRUE : FALSE;
+    }
+
+    returnCode(code);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(bool)
+has_ic(void)
+{
+    return NCURSES_SP_NAME(has_ic) (CURRENT_SCREEN);
+}
+#endif
+
+NCURSES_EXPORT(bool)
+NCURSES_SP_NAME(has_il) (NCURSES_SP_DCL0)
+{
+    bool code = FALSE;
+    T((T_CALLED("has_il(%p)"), (void *) SP_PARM));
+    if (HasTInfoTerminal(SP_PARM)) {
+	code = ((insert_line || parm_insert_line)
+		&& (delete_line || parm_delete_line)) ? TRUE : FALSE;
+    }
+
+    returnCode(code);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(bool)
+has_il(void)
+{
+    return NCURSES_SP_NAME(has_il) (CURRENT_SCREEN);
+}
+#endif
diff --git a/ncurses/tinfo/lib_kernel.c b/ncurses/tinfo/lib_kernel.c
new file mode 100644
index 0000000..f7cbaba
--- /dev/null
+++ b/ncurses/tinfo/lib_kernel.c
@@ -0,0 +1,195 @@
+/****************************************************************************
+ * Copyright 2020,2022 Thomas E. Dickey                                     *
+ * Copyright 1998-2009,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        2002                    *
+ *     and: Juergen Pfeifer                         2009                    *
+ ****************************************************************************/
+
+/*
+ *	lib_kernel.c
+ *
+ *	Misc. low-level routines:
+ *		erasechar()
+ *		killchar()
+ *		flushinp()
+ *
+ * The baudrate() and delay_output() functions could logically live here,
+ * but are in other modules to reduce the static-link size of programs
+ * that use only these facilities.
+ */
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_kernel.c,v 1.35 2022/07/28 20:14:51 tom Exp $")
+
+#ifdef TERMIOS
+static int
+_nc_vdisable(void)
+{
+    int value = -1;
+#if defined(_POSIX_VDISABLE) && HAVE_UNISTD_H
+    value = _POSIX_VDISABLE;
+#endif
+#if defined(_PC_VDISABLE) && HAVE_FPATHCONF
+    if (value == -1) {
+	value = (int) fpathconf(0, _PC_VDISABLE);
+	if (value == -1) {
+	    value = 0377;
+	}
+    }
+#elif defined(VDISABLE)
+    if (value == -1)
+	value = VDISABLE;
+#endif
+    return value;
+}
+#endif /* TERMIOS */
+
+/*
+ *	erasechar()
+ *
+ *	Return erase character as given in cur_term->Ottyb.
+ *
+ */
+
+NCURSES_EXPORT(char)
+NCURSES_SP_NAME(erasechar) (NCURSES_SP_DCL0)
+{
+    int result = ERR;
+    TERMINAL *termp = TerminalOf(SP_PARM);
+
+    T((T_CALLED("erasechar(%p)"), (void *) SP_PARM));
+
+    if (termp != 0) {
+#ifdef TERMIOS
+	result = termp->Ottyb.c_cc[VERASE];
+	if (result == _nc_vdisable())
+	    result = ERR;
+#elif defined(EXP_WIN32_DRIVER)
+	result = ERR;
+#else
+	result = termp->Ottyb.sg_erase;
+#endif
+    }
+    returnChar((char) result);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(char)
+erasechar(void)
+{
+    return NCURSES_SP_NAME(erasechar) (CURRENT_SCREEN);
+}
+#endif
+
+/*
+ *	killchar()
+ *
+ *	Return kill character as given in cur_term->Ottyb.
+ *
+ */
+
+NCURSES_EXPORT(char)
+NCURSES_SP_NAME(killchar) (NCURSES_SP_DCL0)
+{
+    int result = ERR;
+    TERMINAL *termp = TerminalOf(SP_PARM);
+
+    T((T_CALLED("killchar(%p)"), (void *) SP_PARM));
+
+    if (termp != 0) {
+#ifdef TERMIOS
+	result = termp->Ottyb.c_cc[VKILL];
+	if (result == _nc_vdisable())
+	    result = ERR;
+#elif defined(EXP_WIN32_DRIVER)
+	result = ERR;
+#else
+	result = termp->Ottyb.sg_kill;
+#endif
+    }
+    returnChar((char) result);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(char)
+killchar(void)
+{
+    return NCURSES_SP_NAME(killchar) (CURRENT_SCREEN);
+}
+#endif
+
+/*
+ *	flushinp()
+ *
+ *	Flush any input on cur_term->Filedes
+ *
+ */
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(flushinp) (NCURSES_SP_DCL0)
+{
+    TERMINAL *termp = TerminalOf(SP_PARM);
+
+    T((T_CALLED("flushinp(%p)"), (void *) SP_PARM));
+
+    if (termp != 0) {
+#ifdef TERMIOS
+	tcflush(termp->Filedes, TCIFLUSH);
+#else
+	errno = 0;
+	do {
+#if defined(EXP_WIN32_DRIVER)
+	    _nc_console_flush(_nc_console_fd2handle(termp->Filedes));
+#else
+	    ioctl(termp->Filedes, TIOCFLUSH, 0);
+#endif
+	} while
+	    (errno == EINTR);
+#endif
+	if (SP_PARM) {
+	    SP_PARM->_fifohead = -1;
+	    SP_PARM->_fifotail = 0;
+	    SP_PARM->_fifopeek = 0;
+	}
+	returnCode(OK);
+    }
+    returnCode(ERR);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+flushinp(void)
+{
+    return NCURSES_SP_NAME(flushinp) (CURRENT_SCREEN);
+}
+#endif
diff --git a/ncurses/tinfo/lib_longname.c b/ncurses/tinfo/lib_longname.c
new file mode 100644
index 0000000..9dc6d71
--- /dev/null
+++ b/ncurses/tinfo/lib_longname.c
@@ -0,0 +1,104 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2010,2015 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ *     and: Juergen Pfeifer                         2009                    *
+ ****************************************************************************/
+
+/*
+**	lib_longname.c
+**
+**	The routine longname().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_longname.c,v 1.15 2021/04/03 22:36:21 tom Exp $")
+
+#if USE_REENTRANT
+NCURSES_EXPORT(char *)
+NCURSES_SP_NAME(longname) (NCURSES_SP_DCL0)
+{
+    static char empty[] =
+    {'\0'};
+
+    T((T_CALLED("longname(%p)"), (void *) SP_PARM));
+
+    if (SP_PARM) {
+	char *ptr;
+
+	for (ptr = SP_PARM->_ttytype + strlen(SP_PARM->_ttytype);
+	     ptr > SP_PARM->_ttytype;
+	     ptr--)
+	    if (*ptr == '|')
+		returnPtr(ptr + 1);
+	returnPtr(SP_PARM->_ttytype);
+    }
+    return empty;
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(char *)
+longname(void)
+{
+    return NCURSES_SP_NAME(longname) (CURRENT_SCREEN);
+}
+#endif
+
+#else
+
+/* a dummy entrypoint is simpler than generating a conditional in curses.h */
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(char *)
+NCURSES_SP_NAME(longname) (NCURSES_SP_DCL0)
+{
+    (void) SP_PARM;
+    return longname();
+}
+#endif
+
+NCURSES_EXPORT(char *)
+longname(void)
+{
+    char *ptr;
+
+    T((T_CALLED("longname()")));
+
+    for (ptr = ttytype + strlen(ttytype);
+	 ptr > ttytype;
+	 ptr--)
+	if (*ptr == '|')
+	    returnPtr(ptr + 1);
+    returnPtr(ttytype);
+}
+#endif
diff --git a/ncurses/tinfo/lib_napms.c b/ncurses/tinfo/lib_napms.c
new file mode 100644
index 0000000..3a9fc31
--- /dev/null
+++ b/ncurses/tinfo/lib_napms.c
@@ -0,0 +1,94 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2014,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ *     and: Juergen Pfeifer                         2009                    *
+ ****************************************************************************/
+
+/*
+ *	lib_napms.c
+ *
+ *	The routine napms.
+ *
+ *	(This file was originally written by Eric Raymond; however except for
+ *	comments, none of the original code remains - T.Dickey).
+ */
+
+#include <curses.priv.h>
+
+#if HAVE_NANOSLEEP
+#include <time.h>
+#if HAVE_SYS_TIME_H
+#include <sys/time.h>		/* needed for MacOS X DP3 */
+#endif
+#endif
+
+MODULE_ID("$Id: lib_napms.c,v 1.27 2020/08/15 19:45:23 tom Exp $")
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(napms) (NCURSES_SP_DCLx int ms)
+{
+    T((T_CALLED("napms(%d)"), ms));
+
+#ifdef USE_TERM_DRIVER
+    CallDriver_1(SP_PARM, td_nap, ms);
+#else /* !USE_TERM_DRIVER */
+#if NCURSES_SP_FUNCS
+    (void) sp;
+#endif
+#if HAVE_NANOSLEEP
+    {
+	struct timespec request, remaining;
+	request.tv_sec = ms / 1000;
+	request.tv_nsec = (ms % 1000) * 1000000;
+	while (nanosleep(&request, &remaining) == -1
+	       && errno == EINTR) {
+	    request = remaining;
+	}
+    }
+#elif defined(_NC_WINDOWS)
+    Sleep((DWORD) ms);
+#else
+    _nc_timed_wait(0, 0, ms, (int *) 0 EVENTLIST_2nd(0));
+#endif
+#endif /* !USE_TERM_DRIVER */
+
+    returnCode(OK);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+napms(int ms)
+{
+    return NCURSES_SP_NAME(napms) (CURRENT_SCREEN, ms);
+}
+#endif
diff --git a/ncurses/tinfo/lib_options.c b/ncurses/tinfo/lib_options.c
new file mode 100644
index 0000000..017a34a
--- /dev/null
+++ b/ncurses/tinfo/lib_options.c
@@ -0,0 +1,378 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2014,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ *     and: Juergen Pfeifer                         2009                    *
+ ****************************************************************************/
+
+/*
+**	lib_options.c
+**
+**	The routines to handle option setting.
+**
+*/
+
+#include <curses.priv.h>
+
+#ifndef CUR
+#define CUR SP_TERMTYPE
+#endif
+
+MODULE_ID("$Id: lib_options.c,v 1.82 2021/02/14 00:17:35 tom Exp $")
+
+NCURSES_EXPORT(int)
+idlok(WINDOW *win, bool flag)
+{
+    int res = ERR;
+    T((T_CALLED("idlok(%p,%d)"), (void *) win, flag));
+
+    if (win) {
+	SCREEN *sp = _nc_screen_of(win);
+	if (sp != 0
+#ifdef USE_TERM_DRIVER
+	    && IsTermInfo(sp)
+#endif
+	    ) {
+	    sp->_nc_sp_idlok =
+		win->_idlok = (flag && (NCURSES_SP_NAME(has_il) (NCURSES_SP_ARG)
+					|| change_scroll_region));
+	    res = OK;
+	}
+    }
+    returnCode(res);
+}
+
+NCURSES_EXPORT(void)
+idcok(WINDOW *win, bool flag)
+{
+    T((T_CALLED("idcok(%p,%d)"), (void *) win, flag));
+
+    if (win) {
+	SCREEN *sp = _nc_screen_of(win);
+	sp->_nc_sp_idcok = win->_idcok = (flag && NCURSES_SP_NAME(has_ic) (NCURSES_SP_ARG));
+    }
+    returnVoid;
+}
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(halfdelay) (NCURSES_SP_DCLx int t)
+{
+    T((T_CALLED("halfdelay(%p,%d)"), (void *) SP_PARM, t));
+
+    if (t < 1 || t > 255 || !SP_PARM || !IsValidTIScreen(SP_PARM))
+	returnCode(ERR);
+
+    NCURSES_SP_NAME(cbreak) (NCURSES_SP_ARG);
+    SP_PARM->_cbreak = t + 1;
+    returnCode(OK);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+halfdelay(int t)
+{
+    return NCURSES_SP_NAME(halfdelay) (CURRENT_SCREEN, t);
+}
+#endif
+
+NCURSES_EXPORT(int)
+nodelay(WINDOW *win, bool flag)
+{
+    T((T_CALLED("nodelay(%p,%d)"), (void *) win, flag));
+
+    if (win) {
+	if (flag == TRUE)
+	    win->_delay = 0;
+	else
+	    win->_delay = -1;
+	returnCode(OK);
+    } else
+	returnCode(ERR);
+}
+
+NCURSES_EXPORT(int)
+notimeout(WINDOW *win, bool f)
+{
+    T((T_CALLED("notimeout(%p,%d)"), (void *) win, f));
+
+    if (win) {
+	win->_notimeout = f;
+	returnCode(OK);
+    } else
+	returnCode(ERR);
+}
+
+NCURSES_EXPORT(void)
+wtimeout(WINDOW *win, int delay)
+{
+    T((T_CALLED("wtimeout(%p,%d)"), (void *) win, delay));
+
+    if (win) {
+	win->_delay = delay;
+    }
+    returnVoid;
+}
+
+NCURSES_EXPORT(int)
+keypad(WINDOW *win, bool flag)
+{
+    T((T_CALLED("keypad(%p,%d)"), (void *) win, flag));
+
+    if (win) {
+	win->_use_keypad = flag;
+	returnCode(_nc_keypad(_nc_screen_of(win), flag));
+    } else
+	returnCode(ERR);
+}
+
+NCURSES_EXPORT(int)
+meta(WINDOW *win GCC_UNUSED, bool flag)
+{
+    int result = ERR;
+    SCREEN *sp = (win == 0) ? CURRENT_SCREEN : _nc_screen_of(win);
+
+    /* Ok, we stay relaxed and don't signal an error if win is NULL */
+    T((T_CALLED("meta(%p,%d)"), (void *) win, flag));
+
+    /* Ok, we stay relaxed and don't signal an error if win is NULL */
+
+    if (sp != 0) {
+	sp->_use_meta = flag;
+#ifdef USE_TERM_DRIVER
+	if (IsTermInfo(sp)) {
+	    if (flag) {
+		NCURSES_PUTP2("meta_on", meta_on);
+	    } else {
+		NCURSES_PUTP2("meta_off", meta_off);
+	    }
+	}
+#else
+	if (flag) {
+	    NCURSES_PUTP2("meta_on", meta_on);
+	} else {
+	    NCURSES_PUTP2("meta_off", meta_off);
+	}
+#endif
+	result = OK;
+    }
+    returnCode(result);
+}
+
+/* curs_set() moved here to narrow the kernel interface */
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(curs_set) (NCURSES_SP_DCLx int vis)
+{
+    int code = ERR;
+    T((T_CALLED("curs_set(%p,%d)"), (void *) SP_PARM, vis));
+
+    if (SP_PARM != 0 && vis >= 0 && vis <= 2) {
+	int cursor = SP_PARM->_cursor;
+	if (vis == cursor) {
+	    code = cursor;
+	} else {
+#ifdef USE_TERM_DRIVER
+	    code = CallDriver_1(SP_PARM, td_cursorSet, vis);
+#else
+	    if (IsValidTIScreen(SP_PARM)) {
+		switch (vis) {
+		case 2:
+		    code = NCURSES_PUTP2_FLUSH("cursor_visible",
+					       cursor_visible);
+		    break;
+		case 1:
+		    code = NCURSES_PUTP2_FLUSH("cursor_normal",
+					       cursor_normal);
+		    break;
+		case 0:
+		    code = NCURSES_PUTP2_FLUSH("cursor_invisible",
+					       cursor_invisible);
+		    break;
+		}
+	    } else {
+		code = ERR;
+	    }
+#endif
+	    if (code != ERR)
+		code = (cursor == -1 ? 1 : cursor);
+	    SP_PARM->_cursor = vis;
+	}
+    }
+    returnCode(code);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+curs_set(int vis)
+{
+    return (NCURSES_SP_NAME(curs_set) (CURRENT_SCREEN, vis));
+}
+#endif
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(typeahead) (NCURSES_SP_DCLx int fd)
+{
+    T((T_CALLED("typeahead(%p, %d)"), (void *) SP_PARM, fd));
+    if (SP_PARM && IsValidTIScreen(SP_PARM)) {
+	SP_PARM->_checkfd = fd;
+	returnCode(OK);
+    } else {
+	returnCode(ERR);
+    }
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+typeahead(int fd)
+{
+    return NCURSES_SP_NAME(typeahead) (CURRENT_SCREEN, fd);
+}
+#endif
+
+/*
+**      has_key()
+**
+**      Return TRUE if the current terminal has the given key
+**
+*/
+
+#if NCURSES_EXT_FUNCS
+static int
+has_key_internal(int keycode, TRIES * tp)
+{
+    if (tp == 0)
+	return (FALSE);
+    else if (tp->value == keycode)
+	return (TRUE);
+    else
+	return (has_key_internal(keycode, tp->child)
+		|| has_key_internal(keycode, tp->sibling));
+}
+
+#ifdef USE_TERM_DRIVER
+NCURSES_EXPORT(int)
+TINFO_HAS_KEY(SCREEN *sp, int keycode)
+{
+    return IsValidTIScreen(sp) ?
+	has_key_internal(keycode, sp->_keytry) : 0;
+}
+#else
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(has_key) (NCURSES_SP_DCLx int keycode)
+{
+    T((T_CALLED("has_key(%p,%d)"), (void *) SP_PARM, keycode));
+    returnCode(SP != 0 ? has_key_internal(keycode, SP_PARM->_keytry) : FALSE);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+has_key(int keycode)
+{
+    return NCURSES_SP_NAME(has_key) (CURRENT_SCREEN, keycode);
+}
+#endif
+#endif
+#endif /* NCURSES_EXT_FUNCS */
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(_nc_putp_flush) (NCURSES_SP_DCLx
+				 const char *name, const char *value)
+{
+    int rc = NCURSES_PUTP2(name, value);
+    if (rc != ERR) {
+	_nc_flush();
+    }
+    return rc;
+}
+
+#if 0 && NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+_nc_putp_flush(const char *name, const char *value)
+{
+    return NCURSES_SP_NAME(_nc_putp_flush) (CURRENT_SCREEN, name, value);
+}
+#endif
+
+/* Turn the keypad on/off
+ *
+ * Note:  we flush the output because changing this mode causes some terminals
+ * to emit different escape sequences for cursor and keypad keys.  If we don't
+ * flush, then the next wgetch may get the escape sequence that corresponds to
+ * the terminal state _before_ switching modes.
+ */
+NCURSES_EXPORT(int)
+_nc_keypad(SCREEN *sp, int flag)
+{
+    int rc = ERR;
+
+    if (sp != 0) {
+#ifdef USE_PTHREADS
+	/*
+	 * We might have this situation in a multithreaded application that
+	 * has wgetch() reading in more than one thread.  putp() and below
+	 * may use SP explicitly.
+	 */
+	if (_nc_use_pthreads && sp != CURRENT_SCREEN) {
+	    SCREEN *save_sp;
+
+	    /* cannot use use_screen(), since that is not in tinfo library */
+	    _nc_lock_global(curses);
+	    save_sp = CURRENT_SCREEN;
+	    _nc_set_screen(sp);
+	    rc = _nc_keypad(sp, flag);
+	    _nc_set_screen(save_sp);
+	    _nc_unlock_global(curses);
+	} else
+#endif
+	{
+#ifdef USE_TERM_DRIVER
+	    rc = CallDriver_1(sp, td_kpad, flag);
+	    if (rc == OK)
+		sp->_keypad_on = flag;
+#else
+	    if (flag) {
+		(void) NCURSES_PUTP2_FLUSH("keypad_xmit", keypad_xmit);
+	    } else if (keypad_local) {
+		(void) NCURSES_PUTP2_FLUSH("keypad_local", keypad_local);
+	    }
+
+	    if (flag && !sp->_tried) {
+		_nc_init_keytry(sp);
+		sp->_tried = TRUE;
+	    }
+	    sp->_keypad_on = flag;
+	    rc = OK;
+#endif
+	}
+    }
+    return (rc);
+}
diff --git a/ncurses/tinfo/lib_print.c b/ncurses/tinfo/lib_print.c
new file mode 100644
index 0000000..aa65041
--- /dev/null
+++ b/ncurses/tinfo/lib_print.c
@@ -0,0 +1,113 @@
+/****************************************************************************
+ * Copyright 2018-2020,2021 Thomas E. Dickey                                *
+ * Copyright 1998-2011,2012 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ *     and: Juergen Pfeifer                                                 *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+
+#ifndef CUR
+#define CUR SP_TERMTYPE
+#endif
+
+MODULE_ID("$Id: lib_print.c,v 1.30 2021/04/18 14:58:57 tom Exp $")
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(mcprint) (NCURSES_SP_DCLx char *data, int len)
+/* ship binary character data to the printer via mc4/mc5/mc5p */
+{
+    int result;
+    char *mybuf = NULL, *switchon;
+    size_t onsize, offsize;
+    size_t need;
+
+    errno = 0;
+    if (!HasTInfoTerminal(SP_PARM)
+	|| len <= 0
+	|| (!prtr_non && (!prtr_on || !prtr_off))) {
+	errno = ENODEV;
+	return (ERR);
+    }
+
+    if (prtr_non) {
+	switchon = TIPARM_1(prtr_non, len);
+	onsize = strlen(switchon);
+	offsize = 0;
+    } else {
+	switchon = prtr_on;
+	onsize = strlen(prtr_on);
+	offsize = strlen(prtr_off);
+    }
+
+    need = onsize + (size_t) len + offsize;
+
+    if (switchon == 0
+	|| (mybuf = typeMalloc(char, need + 1)) == 0) {
+	free(mybuf);
+	errno = ENOMEM;
+	return (ERR);
+    }
+
+    _nc_STRCPY(mybuf, switchon, need);
+    memcpy(mybuf + onsize, data, (size_t) len);
+    if (offsize)
+	_nc_STRCPY(mybuf + onsize + len, prtr_off, need);
+
+    /*
+     * We're relying on the atomicity of UNIX writes here.  The
+     * danger is that output from a refresh() might get interspersed
+     * with the printer data after the write call returns but before the
+     * data has actually been shipped to the terminal.  If the write(2)
+     * operation is truly atomic we're protected from this.
+     */
+    result = (int) write(TerminalOf(SP_PARM)->Filedes, mybuf, need);
+
+    /*
+     * By giving up our scheduler slot here we increase the odds that the
+     * kernel will ship the contiguous clist items from the last write
+     * immediately.
+     */
+#ifndef _NC_WINDOWS
+    (void) sleep(0);
+#endif
+    free(mybuf);
+    return (result);
+}
+
+#if NCURSES_SP_FUNCS && !defined(USE_TERM_DRIVER)
+NCURSES_EXPORT(int)
+mcprint(char *data, int len)
+{
+    return NCURSES_SP_NAME(mcprint) (CURRENT_SCREEN, data, len);
+}
+#endif
diff --git a/ncurses/tinfo/lib_raw.c b/ncurses/tinfo/lib_raw.c
new file mode 100644
index 0000000..1e47f3b
--- /dev/null
+++ b/ncurses/tinfo/lib_raw.c
@@ -0,0 +1,397 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1998-on                 *
+ *     and: Juergen Pfeifer                         2009                    *
+ ****************************************************************************/
+
+/*
+ *	raw.c
+ *
+ *	Routines:
+ *		raw()
+ *		cbreak()
+ *		noraw()
+ *		nocbreak()
+ *		qiflush()
+ *		noqiflush()
+ *		intrflush()
+ *
+ */
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_raw.c,v 1.26 2020/11/21 22:07:48 tom Exp $")
+
+#if HAVE_SYS_TERMIO_H
+#include <sys/termio.h>		/* needed for ISC */
+#endif
+
+#ifdef __EMX__
+#include <io.h>
+#define _nc_setmode(mode) setmode(SP_PARM->_ifd, mode)
+#else
+#define _nc_setmode(mode)	/* nothing */
+#endif
+
+#if USE_KLIBC_KBD
+#define INCL_KBD
+#include <os2.h>
+#endif
+
+#define COOKED_INPUT	(IXON|BRKINT|PARMRK)
+
+#ifdef TRACE
+#define BEFORE(N)	if (USE_TRACEF(TRACE_BITS)) _nc_locked_tracef("%s before bits: %s", N, _nc_tracebits())
+#define AFTER(N)	if (USE_TRACEF(TRACE_BITS)) _nc_locked_tracef("%s after bits: %s", N, _nc_tracebits())
+#else
+#define BEFORE(s)
+#define AFTER(s)
+#endif /* TRACE */
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(raw) (NCURSES_SP_DCL0)
+{
+    int result = ERR;
+    TERMINAL *termp;
+
+    T((T_CALLED("raw(%p)"), (void *) SP_PARM));
+    if ((termp = TerminalOf(SP_PARM)) != 0) {
+	TTY buf;
+
+	BEFORE("raw");
+	_nc_setmode(O_BINARY);
+
+	buf = termp->Nttyb;
+#ifdef TERMIOS
+	buf.c_lflag &= (unsigned) ~(ICANON | ISIG | IEXTEN);
+	buf.c_iflag &= (unsigned) ~(COOKED_INPUT);
+	buf.c_cc[VMIN] = 1;
+	buf.c_cc[VTIME] = 0;
+#elif defined(EXP_WIN32_DRIVER)
+	buf.dwFlagIn &= (unsigned long) ~CONMODE_NORAW;
+#else
+	buf.sg_flags |= RAW;
+#endif
+	result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf);
+	if (result == OK) {
+#if USE_KLIBC_KBD
+	    KBDINFO kbdinfo;
+
+	    kbdinfo.cb = sizeof(kbdinfo);
+	    KbdGetStatus(&kbdinfo, 0);
+
+	    kbdinfo.cb = sizeof(kbdinfo);
+	    kbdinfo.fsMask &= ~KEYBOARD_ASCII_MODE;
+	    kbdinfo.fsMask |= KEYBOARD_BINARY_MODE;
+	    KbdSetStatus(&kbdinfo, 0);
+#endif
+	    if (SP_PARM) {
+		SP_PARM->_raw = TRUE;
+		SP_PARM->_cbreak = 1;
+	    }
+	    termp->Nttyb = buf;
+	}
+	AFTER("raw");
+    }
+    returnCode(result);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+raw(void)
+{
+    return NCURSES_SP_NAME(raw) (CURRENT_SCREEN);
+}
+#endif
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(cbreak) (NCURSES_SP_DCL0)
+{
+    int result = ERR;
+    TERMINAL *termp;
+
+    T((T_CALLED("cbreak(%p)"), (void *) SP_PARM));
+    if ((termp = TerminalOf(SP_PARM)) != 0) {
+	TTY buf;
+
+	BEFORE("cbreak");
+	_nc_setmode(O_BINARY);
+
+	buf = termp->Nttyb;
+#ifdef TERMIOS
+	buf.c_lflag &= (unsigned) ~ICANON;
+	buf.c_iflag &= (unsigned) ~ICRNL;
+	buf.c_lflag |= ISIG;
+	buf.c_cc[VMIN] = 1;
+	buf.c_cc[VTIME] = 0;
+#elif defined(EXP_WIN32_DRIVER)
+	buf.dwFlagIn |= CONMODE_NORAW;
+	buf.dwFlagIn &= (unsigned long) ~CONMODE_NOCBREAK;
+#else
+	buf.sg_flags |= CBREAK;
+#endif
+	result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf);
+	if (result == OK) {
+	    if (SP_PARM) {
+		SP_PARM->_cbreak = 1;
+	    }
+	    termp->Nttyb = buf;
+	}
+	AFTER("cbreak");
+    }
+    returnCode(result);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+cbreak(void)
+{
+    return NCURSES_SP_NAME(cbreak) (CURRENT_SCREEN);
+}
+#endif
+
+/*
+ * Note:
+ * this implementation may be wrong.  See the comment under intrflush().
+ */
+NCURSES_EXPORT(void)
+NCURSES_SP_NAME(qiflush) (NCURSES_SP_DCL0)
+{
+    TERMINAL *termp;
+
+    T((T_CALLED("qiflush(%p)"), (void *) SP_PARM));
+    if ((termp = TerminalOf(SP_PARM)) != 0) {
+	TTY buf;
+	int result;
+
+	BEFORE("qiflush");
+	buf = termp->Nttyb;
+#ifdef TERMIOS
+	buf.c_lflag &= (unsigned) ~(NOFLSH);
+	result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf);
+#else
+	result = ERR;
+	/* FIXME */
+#endif
+	if (result == OK)
+	    termp->Nttyb = buf;
+	AFTER("qiflush");
+    }
+    returnVoid;
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(void)
+qiflush(void)
+{
+    NCURSES_SP_NAME(qiflush) (CURRENT_SCREEN);
+}
+#endif
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(noraw) (NCURSES_SP_DCL0)
+{
+    int result = ERR;
+    TERMINAL *termp;
+
+    T((T_CALLED("noraw(%p)"), (void *) SP_PARM));
+    if ((termp = TerminalOf(SP_PARM)) != 0) {
+	TTY buf;
+
+	BEFORE("noraw");
+	_nc_setmode(O_TEXT);
+
+	buf = termp->Nttyb;
+#ifdef TERMIOS
+	buf.c_lflag |= ISIG | ICANON |
+	    (termp->Ottyb.c_lflag & IEXTEN);
+	buf.c_iflag |= COOKED_INPUT;
+#elif defined(EXP_WIN32_DRIVER)
+	buf.dwFlagIn |= CONMODE_NORAW;
+#else
+	buf.sg_flags &= ~(RAW | CBREAK);
+#endif
+	result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf);
+	if (result == OK) {
+#if USE_KLIBC_KBD
+	    KBDINFO kbdinfo;
+
+	    kbdinfo.cb = sizeof(kbdinfo);
+	    KbdGetStatus(&kbdinfo, 0);
+
+	    kbdinfo.cb = sizeof(kbdinfo);
+	    kbdinfo.fsMask &= ~KEYBOARD_BINARY_MODE;
+	    kbdinfo.fsMask |= KEYBOARD_ASCII_MODE;
+	    KbdSetStatus(&kbdinfo, 0);
+#endif
+	    if (SP_PARM) {
+		SP_PARM->_raw = FALSE;
+		SP_PARM->_cbreak = 0;
+	    }
+	    termp->Nttyb = buf;
+	}
+	AFTER("noraw");
+    }
+    returnCode(result);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+noraw(void)
+{
+    return NCURSES_SP_NAME(noraw) (CURRENT_SCREEN);
+}
+#endif
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(nocbreak) (NCURSES_SP_DCL0)
+{
+    int result = ERR;
+    TERMINAL *termp;
+
+    T((T_CALLED("nocbreak(%p)"), (void *) SP_PARM));
+    if ((termp = TerminalOf(SP_PARM)) != 0) {
+	TTY buf;
+
+	BEFORE("nocbreak");
+	_nc_setmode(O_TEXT);
+
+	buf = termp->Nttyb;
+#ifdef TERMIOS
+	buf.c_lflag |= ICANON;
+	buf.c_iflag |= ICRNL;
+#elif defined(EXP_WIN32_DRIVER)
+	buf.dwFlagIn |= (CONMODE_NOCBREAK | CONMODE_NORAW);
+#else
+	buf.sg_flags &= ~CBREAK;
+#endif
+	result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf);
+	if (result == OK) {
+	    if (SP_PARM) {
+		SP_PARM->_cbreak = 0;
+	    }
+	    termp->Nttyb = buf;
+	}
+	AFTER("nocbreak");
+    }
+    returnCode(result);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+nocbreak(void)
+{
+    return NCURSES_SP_NAME(nocbreak) (CURRENT_SCREEN);
+}
+#endif
+
+NCURSES_EXPORT(void)
+NCURSES_SP_NAME(noqiflush) (NCURSES_SP_DCL0)
+{
+    TERMINAL *termp;
+
+    T((T_CALLED("noqiflush(%p)"), (void *) SP_PARM));
+    if ((termp = TerminalOf(SP_PARM)) != 0) {
+	TTY buf;
+	int result;
+
+	BEFORE("noqiflush");
+	buf = termp->Nttyb;
+#ifdef TERMIOS
+	buf.c_lflag |= NOFLSH;
+	result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf);
+#else
+	/* FIXME */
+	result = ERR;
+#endif
+	if (result == OK)
+	    termp->Nttyb = buf;
+	AFTER("noqiflush");
+    }
+    returnVoid;
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(void)
+noqiflush(void)
+{
+    NCURSES_SP_NAME(noqiflush) (CURRENT_SCREEN);
+}
+#endif
+
+/*
+ * This call does the same thing as the qiflush()/noqiflush() pair.  We know
+ * for certain that SVr3 intrflush() tweaks the NOFLSH bit; on the other hand,
+ * the match (in the SVr4 man pages) between the language describing NOFLSH in
+ * termio(7) and the language describing qiflush()/noqiflush() in
+ * curs_inopts(3x) is too exact to be coincidence.
+ */
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(intrflush) (NCURSES_SP_DCLx WINDOW *win GCC_UNUSED, bool flag)
+{
+    int result = ERR;
+    TERMINAL *termp;
+
+    T((T_CALLED("intrflush(%p,%d)"), (void *) SP_PARM, flag));
+    if (SP_PARM == 0)
+	returnCode(ERR);
+
+    if ((termp = TerminalOf(SP_PARM)) != 0) {
+	TTY buf;
+
+	BEFORE("intrflush");
+	buf = termp->Nttyb;
+#ifdef TERMIOS
+	if (flag)
+	    buf.c_lflag &= (unsigned) ~(NOFLSH);
+	else
+	    buf.c_lflag |= (NOFLSH);
+	result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf);
+#else
+	/* FIXME */
+#endif
+	if (result == OK) {
+	    termp->Nttyb = buf;
+	}
+	AFTER("intrflush");
+    }
+    returnCode(result);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+intrflush(WINDOW *win GCC_UNUSED, bool flag)
+{
+    return NCURSES_SP_NAME(intrflush) (CURRENT_SCREEN, win, flag);
+}
+#endif
diff --git a/ncurses/tinfo/lib_setup.c b/ncurses/tinfo/lib_setup.c
new file mode 100644
index 0000000..db93a36
--- /dev/null
+++ b/ncurses/tinfo/lib_setup.c
@@ -0,0 +1,1021 @@
+/****************************************************************************
+ * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ *     and: Juergen Pfeifer                         2009                    *
+ ****************************************************************************/
+
+/*
+ * Terminal setup routines common to termcap and terminfo:
+ *
+ *		use_env(bool)
+ *		use_tioctl(bool)
+ *		setupterm(char *, int, int *)
+ */
+
+#include <curses.priv.h>
+#include <tic.h>		/* for MAX_NAME_SIZE */
+
+#if HAVE_LOCALE_H
+#include <locale.h>
+#endif
+
+MODULE_ID("$Id: lib_setup.c,v 1.218 2022/08/13 18:12:22 tom Exp $")
+
+/****************************************************************************
+ *
+ * Terminal size computation
+ *
+ ****************************************************************************/
+
+#if HAVE_SIZECHANGE
+# if !defined(sun) || !TERMIOS
+#  if HAVE_SYS_IOCTL_H
+#   include <sys/ioctl.h>
+#  endif
+# endif
+#endif
+
+#if NEED_PTEM_H
+ /* On SCO, they neglected to define struct winsize in termios.h -- it is only
+  * in termio.h and ptem.h (the former conflicts with other definitions).
+  */
+# include <sys/stream.h>
+# include <sys/ptem.h>
+#endif
+
+#if HAVE_LANGINFO_CODESET
+#include <langinfo.h>
+#endif
+
+/*
+ * SCO defines TIOCGSIZE and the corresponding struct.  Other systems (SunOS,
+ * Solaris, IRIX) define TIOCGWINSZ and struct winsize.
+ */
+#ifdef TIOCGSIZE
+# define IOCTL_WINSIZE TIOCGSIZE
+# define STRUCT_WINSIZE struct ttysize
+# define WINSIZE_ROWS(n) (int)n.ts_lines
+# define WINSIZE_COLS(n) (int)n.ts_cols
+#else
+# ifdef TIOCGWINSZ
+#  define IOCTL_WINSIZE TIOCGWINSZ
+#  define STRUCT_WINSIZE struct winsize
+#  define WINSIZE_ROWS(n) (int)n.ws_row
+#  define WINSIZE_COLS(n) (int)n.ws_col
+# endif
+#endif
+
+/*
+ * Reduce explicit use of "cur_term" global variable.
+ */
+#undef CUR
+#define CUR TerminalType(termp).
+
+/*
+ * Wrap global variables in this module.
+ */
+#if USE_REENTRANT
+
+NCURSES_EXPORT(char *)
+NCURSES_PUBLIC_VAR(ttytype) (void)
+{
+    static char empty[] = "";
+    char *result = empty;
+
+#if NCURSES_SP_FUNCS
+    if (CURRENT_SCREEN) {
+	TERMINAL *termp = TerminalOf(CURRENT_SCREEN);
+	if (termp != 0) {
+	    result = TerminalType(termp).term_names;
+	}
+    }
+#else
+    if (cur_term != 0) {
+	result = TerminalType(cur_term).term_names;
+    }
+#endif
+    return result;
+}
+
+NCURSES_EXPORT(int *)
+_nc_ptr_Lines(SCREEN *sp)
+{
+    return ptrLines(sp);
+}
+
+NCURSES_EXPORT(int)
+NCURSES_PUBLIC_VAR(LINES) (void)
+{
+    return *_nc_ptr_Lines(CURRENT_SCREEN);
+}
+
+NCURSES_EXPORT(int *)
+_nc_ptr_Cols(SCREEN *sp)
+{
+    return ptrCols(sp);
+}
+
+NCURSES_EXPORT(int)
+NCURSES_PUBLIC_VAR(COLS) (void)
+{
+    return *_nc_ptr_Cols(CURRENT_SCREEN);
+}
+
+NCURSES_EXPORT(int *)
+_nc_ptr_Tabsize(SCREEN *sp)
+{
+    return ptrTabsize(sp);
+}
+
+NCURSES_EXPORT(int)
+NCURSES_PUBLIC_VAR(TABSIZE) (void)
+{
+    return *_nc_ptr_Tabsize(CURRENT_SCREEN);
+}
+#else
+NCURSES_EXPORT_VAR(char) ttytype[NAMESIZE] = "";
+NCURSES_EXPORT_VAR(int) LINES = 0;
+NCURSES_EXPORT_VAR(int) COLS = 0;
+NCURSES_EXPORT_VAR(int) TABSIZE = 8;
+#endif
+
+#if NCURSES_EXT_FUNCS
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(set_tabsize) (NCURSES_SP_DCLx int value)
+{
+    int code = OK;
+    if (value <= 0) {
+	code = ERR;
+    } else {
+#if USE_REENTRANT
+	if (SP_PARM) {
+	    SP_PARM->_TABSIZE = value;
+	} else {
+	    code = ERR;
+	}
+#else
+	(void) SP_PARM;
+	TABSIZE = value;
+#endif
+    }
+    return code;
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+set_tabsize(int value)
+{
+    return NCURSES_SP_NAME(set_tabsize) (CURRENT_SCREEN, value);
+}
+#endif
+#endif /* NCURSES_EXT_FUNCS */
+
+#if USE_SIGWINCH
+/*
+ * If we have a pending SIGWINCH, set the flag in each screen.
+ */
+NCURSES_EXPORT(int)
+_nc_handle_sigwinch(SCREEN *sp)
+{
+    SCREEN *scan;
+
+    if (_nc_globals.have_sigwinch) {
+	_nc_globals.have_sigwinch = 0;
+
+	for (each_screen(scan)) {
+	    scan->_sig_winch = TRUE;
+	}
+    }
+
+    return (sp ? sp->_sig_winch : 0);
+}
+
+#endif
+
+NCURSES_EXPORT(void)
+NCURSES_SP_NAME(use_env) (NCURSES_SP_DCLx bool f)
+{
+    START_TRACE();
+    T((T_CALLED("use_env(%p,%d)"), (void *) SP_PARM, (int) f));
+#if NCURSES_SP_FUNCS
+    if (IsPreScreen(SP_PARM)) {
+	SP_PARM->_use_env = f;
+    }
+#else
+    _nc_prescreen.use_env = f;
+#endif
+    returnVoid;
+}
+
+NCURSES_EXPORT(void)
+NCURSES_SP_NAME(use_tioctl) (NCURSES_SP_DCLx bool f)
+{
+    START_TRACE();
+    T((T_CALLED("use_tioctl(%p,%d)"), (void *) SP_PARM, (int) f));
+#if NCURSES_SP_FUNCS
+    if (IsPreScreen(SP_PARM)) {
+	SP_PARM->use_tioctl = f;
+    }
+#else
+    _nc_prescreen.use_tioctl = f;
+#endif
+    returnVoid;
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(void)
+use_env(bool f)
+{
+    START_TRACE();
+    T((T_CALLED("use_env(%d)"), (int) f));
+    _nc_prescreen.use_env = f;
+    returnVoid;
+}
+
+NCURSES_EXPORT(void)
+use_tioctl(bool f)
+{
+    START_TRACE();
+    T((T_CALLED("use_tioctl(%d)"), (int) f));
+    _nc_prescreen.use_tioctl = f;
+    returnVoid;
+}
+#endif
+
+NCURSES_EXPORT(void)
+_nc_get_screensize(SCREEN *sp,
+#ifdef USE_TERM_DRIVER
+		   TERMINAL *termp,
+#endif
+		   int *linep, int *colp)
+/* Obtain lines/columns values from the environment and/or terminfo entry */
+{
+#ifdef USE_TERM_DRIVER
+    TERMINAL_CONTROL_BLOCK *TCB;
+    int my_tabsize;
+
+    assert(termp != 0 && linep != 0 && colp != 0);
+    TCB = (TERMINAL_CONTROL_BLOCK *) termp;
+
+    my_tabsize = TCB->info.tabsize;
+    TCB->drv->td_size(TCB, linep, colp);
+
+#if USE_REENTRANT
+    if (sp != 0) {
+	sp->_TABSIZE = my_tabsize;
+    }
+#else
+    (void) sp;
+    TABSIZE = my_tabsize;
+#endif
+    T(("TABSIZE = %d", my_tabsize));
+#else /* !USE_TERM_DRIVER */
+    TERMINAL *termp = cur_term;
+    int my_tabsize;
+    bool useEnv = _nc_prescreen.use_env;
+    bool useTioctl = _nc_prescreen.use_tioctl;
+
+#ifdef EXP_WIN32_DRIVER
+    /* If we are here, then Windows console is used in terminfo mode.
+       We need to figure out the size using the console API
+     */
+    _nc_console_size(linep, colp);
+    T(("screen size: winconsole lines = %d columns = %d", *linep, *colp));
+#else
+    /* figure out the size of the screen */
+    T(("screen size: terminfo lines = %d columns = %d", lines, columns));
+
+    *linep = (int) lines;
+    *colp = (int) columns;
+#endif
+
+#if NCURSES_SP_FUNCS
+    if (sp) {
+	useEnv = sp->_use_env;
+	useTioctl = sp->use_tioctl;
+    }
+#endif
+
+    if (useEnv || useTioctl) {
+#ifdef __EMX__
+	{
+	    int screendata[2];
+	    _scrsize(screendata);
+	    *colp = screendata[0];
+	    *linep = ((sp != 0 && sp->_filtered)
+		      ? 1
+		      : screendata[1]);
+	    T(("EMX screen size: environment LINES = %d COLUMNS = %d",
+	       *linep, *colp));
+	}
+#endif
+#if HAVE_SIZECHANGE
+	/* try asking the OS */
+	if (NC_ISATTY(cur_term->Filedes)) {
+	    STRUCT_WINSIZE size;
+
+	    errno = 0;
+	    do {
+		if (ioctl(cur_term->Filedes, IOCTL_WINSIZE, &size) >= 0) {
+		    *linep = ((sp != 0 && sp->_filtered)
+			      ? 1
+			      : WINSIZE_ROWS(size));
+		    *colp = WINSIZE_COLS(size);
+		    T(("SYS screen size: environment LINES = %d COLUMNS = %d",
+		       *linep, *colp));
+		    break;
+		}
+	    } while
+		(errno == EINTR);
+	}
+#endif /* HAVE_SIZECHANGE */
+
+	if (useEnv) {
+	    int value;
+
+	    if (useTioctl) {
+		/*
+		 * If environment variables are used, update them.
+		 */
+		if ((sp == 0 || !sp->_filtered) && _nc_getenv_num("LINES") > 0) {
+		    _nc_setenv_num("LINES", *linep);
+		}
+		if (_nc_getenv_num("COLUMNS") > 0) {
+		    _nc_setenv_num("COLUMNS", *colp);
+		}
+	    }
+
+	    /*
+	     * Finally, look for environment variables.
+	     *
+	     * Solaris lets users override either dimension with an environment
+	     * variable.
+	     */
+	    if ((value = _nc_getenv_num("LINES")) > 0) {
+		*linep = value;
+		T(("screen size: environment LINES = %d", *linep));
+	    }
+	    if ((value = _nc_getenv_num("COLUMNS")) > 0) {
+		*colp = value;
+		T(("screen size: environment COLUMNS = %d", *colp));
+	    }
+	}
+
+	/* if we can't get dynamic info about the size, use static */
+	if (*linep <= 0) {
+	    *linep = (int) lines;
+	}
+	if (*colp <= 0) {
+	    *colp = (int) columns;
+	}
+
+	/* the ultimate fallback, assume fixed 24x80 size */
+	if (*linep <= 0) {
+	    *linep = 24;
+	}
+	if (*colp <= 0) {
+	    *colp = 80;
+	}
+
+	/*
+	 * Put the derived values back in the screen-size caps, so
+	 * tigetnum() and tgetnum() will do the right thing.
+	 */
+	lines = (NCURSES_INT2) (*linep);
+	columns = (NCURSES_INT2) (*colp);
+#if NCURSES_EXT_NUMBERS
+#define OldNumber(termp,name) \
+	(termp)->type.Numbers[(&name - (termp)->type2.Numbers)]
+	OldNumber(termp, lines) = (short) (*linep);
+	OldNumber(termp, columns) = (short) (*colp);
+#endif
+    }
+
+    T(("screen size is %dx%d", *linep, *colp));
+
+    if (VALID_NUMERIC(init_tabs))
+	my_tabsize = (int) init_tabs;
+    else
+	my_tabsize = 8;
+
+#if USE_REENTRANT
+    if (sp != 0)
+	sp->_TABSIZE = my_tabsize;
+#else
+    TABSIZE = my_tabsize;
+#endif
+    T(("TABSIZE = %d", TABSIZE));
+#endif /* USE_TERM_DRIVER */
+}
+
+#if USE_SIZECHANGE
+NCURSES_EXPORT(void)
+_nc_update_screensize(SCREEN *sp)
+{
+    int new_lines;
+    int new_cols;
+
+#ifdef USE_TERM_DRIVER
+    int old_lines;
+    int old_cols;
+
+    assert(sp != 0);
+
+    CallDriver_2(sp, td_getsize, &old_lines, &old_cols);
+
+#else
+    TERMINAL *termp = cur_term;
+    int old_lines = lines;
+    int old_cols = columns;
+#endif
+
+    if (sp != 0) {
+	TINFO_GET_SIZE(sp, sp->_term, &new_lines, &new_cols);
+	/*
+	 * See is_term_resized() and resizeterm().
+	 * We're doing it this way because those functions belong to the upper
+	 * ncurses library, while this resides in the lower terminfo library.
+	 */
+	if (sp->_resize != 0) {
+	    if ((new_lines != old_lines) || (new_cols != old_cols)) {
+		sp->_resize(NCURSES_SP_ARGx new_lines, new_cols);
+	    } else if (sp->_sig_winch && (sp->_ungetch != 0)) {
+		sp->_ungetch(SP_PARM, KEY_RESIZE);	/* so application can know this */
+	    }
+	    sp->_sig_winch = FALSE;
+	}
+    }
+}
+#endif /* USE_SIZECHANGE */
+
+/****************************************************************************
+ *
+ * Terminal setup
+ *
+ ****************************************************************************/
+
+#if NCURSES_USE_DATABASE || NCURSES_USE_TERMCAP
+/*
+ * Return 1 if entry found, 0 if not found, -1 if database not accessible,
+ * just like tgetent().
+ */
+int
+_nc_setup_tinfo(const char *const tn, TERMTYPE2 *const tp)
+{
+    char filename[PATH_MAX];
+    int status = _nc_read_entry2(tn, filename, tp);
+
+    /*
+     * If we have an entry, force all of the cancelled strings to null
+     * pointers so we don't have to test them in the rest of the library.
+     * (The terminfo compiler bypasses this logic, since it must know if
+     * a string is cancelled, for merging entries).
+     */
+    if (status == TGETENT_YES) {
+	unsigned n;
+	for_each_boolean(n, tp) {
+	    if (!VALID_BOOLEAN(tp->Booleans[n]))
+		tp->Booleans[n] = FALSE;
+	}
+	for_each_string(n, tp) {
+	    if (tp->Strings[n] == CANCELLED_STRING)
+		tp->Strings[n] = ABSENT_STRING;
+	}
+    }
+    return (status);
+}
+#endif
+
+/*
+**	Take the real command character out of the CC environment variable
+**	and substitute it in for the prototype given in 'command_character'.
+*/
+void
+_nc_tinfo_cmdch(TERMINAL *termp, int proto)
+{
+    char *tmp;
+
+    /*
+     * Only use the character if the string is a single character,
+     * since it is fairly common for developers to set the C compiler
+     * name as an environment variable - using the same symbol.
+     */
+    if ((tmp = getenv("CC")) != 0 && strlen(tmp) == 1) {
+	unsigned i;
+	char CC = *tmp;
+
+	for_each_string(i, &(termp->type)) {
+	    for (tmp = termp->type.Strings[i]; tmp && *tmp; tmp++) {
+		if (UChar(*tmp) == proto)
+		    *tmp = CC;
+	    }
+	}
+    }
+}
+
+/*
+ * Find the locale which is in effect.
+ */
+NCURSES_EXPORT(char *)
+_nc_get_locale(void)
+{
+    char *env;
+#if HAVE_LOCALE_H
+    /*
+     * This is preferable to using getenv() since it ensures that we are using
+     * the locale which was actually initialized by the application.
+     */
+    env = setlocale(LC_CTYPE, 0);
+#else
+    if (((env = getenv("LANG")) != 0 && *env != '\0')
+	|| ((env = getenv("LC_CTYPE")) != 0 && *env != '\0')
+	|| ((env = getenv("LC_ALL")) != 0 && *env != '\0')) {
+	;
+    }
+#endif
+    T(("_nc_get_locale %s", _nc_visbuf(env)));
+    return env;
+}
+
+/*
+ * Check if we are running in a UTF-8 locale.
+ */
+NCURSES_EXPORT(int)
+_nc_unicode_locale(void)
+{
+    int result = 0;
+#if defined(_NC_WINDOWS) && USE_WIDEC_SUPPORT
+    result = 1;
+#elif HAVE_LANGINFO_CODESET
+    char *env = nl_langinfo(CODESET);
+    result = !strcmp(env, "UTF-8");
+    T(("_nc_unicode_locale(%s) ->%d", env, result));
+#else
+    char *env = _nc_get_locale();
+    if (env != 0) {
+	if (strstr(env, ".UTF-8") != 0) {
+	    result = 1;
+	    T(("_nc_unicode_locale(%s) ->%d", env, result));
+	}
+    }
+#endif
+    return result;
+}
+
+#define CONTROL_N(s) ((s) != 0 && strstr(s, "\016") != 0)
+#define CONTROL_O(s) ((s) != 0 && strstr(s, "\017") != 0)
+
+/*
+ * Check for known broken cases where a UTF-8 locale breaks the alternate
+ * character set.
+ */
+NCURSES_EXPORT(int)
+_nc_locale_breaks_acs(TERMINAL *termp)
+{
+    const char *env_name = "NCURSES_NO_UTF8_ACS";
+    const char *env;
+    int value;
+    int result = 0;
+
+    T((T_CALLED("_nc_locale_breaks_acs:%d"), result));
+    if (getenv(env_name) != 0) {
+	result = _nc_getenv_num(env_name);
+    } else if ((value = tigetnum("U8")) >= 0) {
+	result = value;		/* use extension feature */
+    } else if ((env = getenv("TERM")) != 0) {
+	if (strstr(env, "linux")) {
+	    result = 1;		/* always broken */
+	} else if (strstr(env, "screen") != 0
+		   && ((env = getenv("TERMCAP")) != 0
+		       && strstr(env, "screen") != 0)
+		   && strstr(env, "hhII00") != 0) {
+	    if (CONTROL_N(enter_alt_charset_mode) ||
+		CONTROL_O(enter_alt_charset_mode) ||
+		CONTROL_N(set_attributes) ||
+		CONTROL_O(set_attributes)) {
+		result = 1;
+	    }
+	}
+    }
+    returnCode(result);
+}
+
+NCURSES_EXPORT(int)
+TINFO_SETUP_TERM(TERMINAL **tp,
+		 const char *tname,
+		 int Filedes,
+		 int *errret,
+		 int reuse)
+{
+#ifdef USE_TERM_DRIVER
+    TERMINAL_CONTROL_BLOCK *TCB = 0;
+#endif
+    TERMINAL *termp;
+    SCREEN *sp = 0;
+    char *myname;
+    int code = ERR;
+
+    START_TRACE();
+
+#ifdef USE_TERM_DRIVER
+    T((T_CALLED("_nc_setupterm_ex(%p,%s,%d,%p)"),
+       (void *) tp, _nc_visbuf(tname), Filedes, (void *) errret));
+
+    if (tp == 0) {
+	ret_error0(TGETENT_ERR,
+		   "Invalid parameter, internal error.\n");
+    } else
+	termp = *tp;
+#else
+    termp = cur_term;
+    T((T_CALLED("setupterm(%s,%d,%p)"), _nc_visbuf(tname), Filedes, (void *) errret));
+#endif
+
+    if (tname == 0) {
+	tname = getenv("TERM");
+#if defined(EXP_WIN32_DRIVER)
+	if (!VALID_TERM_ENV(tname, NO_TERMINAL)) {
+	    T(("Failure with TERM=%s", NonNull(tname)));
+	    ret_error0(TGETENT_ERR, "TERM environment variable not set.\n");
+	}
+#elif defined(USE_TERM_DRIVER)
+	if (!NonEmpty(tname))
+	    tname = "unknown";
+#else
+	if (!NonEmpty(tname)) {
+	    T(("Failure with TERM=%s", NonNull(tname)));
+	    ret_error0(TGETENT_ERR, "TERM environment variable not set.\n");
+	}
+#endif
+    }
+    myname = strdup(tname);
+
+    if (strlen(myname) > MAX_NAME_SIZE) {
+	ret_error(TGETENT_ERR,
+		  "TERM environment must be <= %d characters.\n",
+		  MAX_NAME_SIZE,
+		  free(myname));
+    }
+
+    T(("your terminal name is %s", myname));
+
+    /*
+     * Allow output redirection.  This is what SVr3 does.  If stdout is
+     * directed to a file, screen updates go to standard error.
+     */
+    if (Filedes == STDOUT_FILENO && !NC_ISATTY(Filedes))
+	Filedes = STDERR_FILENO;
+#if defined(EXP_WIN32_DRIVER)
+    if (Filedes != STDERR_FILENO && NC_ISATTY(Filedes))
+	_setmode(Filedes, _O_BINARY);
+#endif
+
+    /*
+     * Check if we have already initialized to use this terminal.  If so, we
+     * do not need to re-read the terminfo entry, or obtain TTY settings.
+     *
+     * This is an improvement on SVr4 curses.  If an application mixes curses
+     * and termcap calls, it may call both initscr and tgetent.  This is not
+     * really a good thing to do, but can happen if someone tries using ncurses
+     * with the readline library.  The problem we are fixing is that when
+     * tgetent calls setupterm, the resulting Ottyb struct in cur_term is
+     * zeroed.  A subsequent call to endwin uses the zeroed terminal settings
+     * rather than the ones saved in initscr.  So we check if cur_term appears
+     * to contain terminal settings for the same output file as our current
+     * call - and copy those terminal settings.  (SVr4 curses does not do this,
+     * however applications that are working around the problem will still work
+     * properly with this feature).
+     */
+    if (reuse
+	&& (termp != 0)
+	&& termp->Filedes == Filedes
+	&& termp->_termname != 0
+	&& !strcmp(termp->_termname, myname)
+	&& _nc_name_match(TerminalType(termp).term_names, myname, "|")) {
+	T(("reusing existing terminal information and mode-settings"));
+	code = OK;
+#ifdef USE_TERM_DRIVER
+	TCB = (TERMINAL_CONTROL_BLOCK *) termp;
+#endif
+    } else {
+#ifdef USE_TERM_DRIVER
+	TERMINAL_CONTROL_BLOCK *my_tcb;
+	termp = 0;
+	if ((my_tcb = typeCalloc(TERMINAL_CONTROL_BLOCK, 1)) != 0)
+	    termp = &(my_tcb->term);
+#else
+	int status;
+
+	termp = typeCalloc(TERMINAL, 1);
+#endif
+	if (termp == 0) {
+	    ret_error1(TGETENT_ERR,
+		       "Not enough memory to create terminal structure.\n",
+		       myname, free(myname));
+	}
+	++_nc_globals.terminal_count;
+#if HAVE_SYSCONF
+	{
+	    long limit;
+#ifdef LINE_MAX
+	    limit = LINE_MAX;
+#else
+	    limit = _nc_globals.getstr_limit;
+#endif
+#ifdef _SC_LINE_MAX
+	    if (limit < sysconf(_SC_LINE_MAX))
+		limit = sysconf(_SC_LINE_MAX);
+#endif
+	    if (_nc_globals.getstr_limit < (int) limit)
+		_nc_globals.getstr_limit = (int) limit;
+	}
+#endif /* HAVE_SYSCONF */
+	T(("using %d for getstr limit", _nc_globals.getstr_limit));
+
+#ifdef USE_TERM_DRIVER
+	INIT_TERM_DRIVER();
+	TCB = (TERMINAL_CONTROL_BLOCK *) termp;
+	code = _nc_globals.term_driver(TCB, myname, errret);
+	if (code == OK) {
+	    termp->Filedes = (short) Filedes;
+	    termp->_termname = strdup(myname);
+	} else {
+	    ret_error1(errret ? *errret : TGETENT_ERR,
+		       "Could not find any driver to handle terminal.\n",
+		       myname, free(myname));
+	}
+#else
+#if NCURSES_USE_DATABASE || NCURSES_USE_TERMCAP
+	status = _nc_setup_tinfo(myname, &TerminalType(termp));
+	T(("_nc_setup_tinfo returns %d", status));
+#else
+	T(("no database available"));
+	status = TGETENT_NO;
+#endif
+
+	/* try fallback list if entry on disk */
+	if (status != TGETENT_YES) {
+	    const TERMTYPE2 *fallback = _nc_fallback2(myname);
+
+	    if (fallback) {
+		T(("found fallback entry"));
+		_nc_copy_termtype2(&(TerminalType(termp)), fallback);
+		status = TGETENT_YES;
+	    }
+	}
+
+	if (status != TGETENT_YES) {
+	    del_curterm(termp);
+	    if (status == TGETENT_ERR) {
+		free(myname);
+		ret_error0(status, "terminals database is inaccessible\n");
+	    } else if (status == TGETENT_NO) {
+		ret_error1(status, "unknown terminal type.\n",
+			   myname, free(myname));
+	    } else {
+		free(myname);
+		ret_error0(status, "unexpected return-code\n");
+	    }
+	}
+#if NCURSES_EXT_NUMBERS
+	_nc_export_termtype2(&termp->type, &TerminalType(termp));
+#endif
+#if !USE_REENTRANT
+	save_ttytype(termp);
+#endif
+
+	termp->Filedes = (short) Filedes;
+	termp->_termname = strdup(myname);
+
+	set_curterm(termp);
+
+	if (command_character)
+	    _nc_tinfo_cmdch(termp, UChar(*command_character));
+
+	/*
+	 * If an application calls setupterm() rather than initscr() or
+	 * newterm(), we will not have the def_prog_mode() call in
+	 * _nc_setupscreen().  Do it now anyway, so we can initialize the
+	 * baudrate.  Also get the shell-mode so that erasechar() works.
+	 */
+	if (NC_ISATTY(Filedes)) {
+	    NCURSES_SP_NAME(def_shell_mode) (NCURSES_SP_ARG);
+	    NCURSES_SP_NAME(def_prog_mode) (NCURSES_SP_ARG);
+	    NCURSES_SP_NAME(baudrate) (NCURSES_SP_ARG);
+	}
+	code = OK;
+#endif
+    }
+
+#ifdef USE_TERM_DRIVER
+    *tp = termp;
+    NCURSES_SP_NAME(set_curterm) (sp, termp);
+    TCB->drv->td_init(TCB);
+#else
+    sp = SP;
+#endif
+
+    /*
+     * We should always check the screensize, just in case.
+     */
+    TINFO_GET_SIZE(sp, termp, ptrLines(sp), ptrCols(sp));
+
+    if (errret)
+	*errret = TGETENT_YES;
+
+#ifndef USE_TERM_DRIVER
+    if (generic_type) {
+	/*
+	 * BSD 4.3's termcap contains mis-typed "gn" for wy99.  Do a sanity
+	 * check before giving up.
+	 */
+	if ((VALID_STRING(cursor_address)
+	     || (VALID_STRING(cursor_down) && VALID_STRING(cursor_home)))
+	    && VALID_STRING(clear_screen)) {
+	    ret_error1(TGETENT_YES, "terminal is not really generic.\n",
+		       myname, free(myname));
+	} else {
+	    del_curterm(termp);
+	    ret_error1(TGETENT_NO, "I need something more specific.\n",
+		       myname, free(myname));
+	}
+    } else if (hard_copy) {
+	ret_error1(TGETENT_YES, "I can't handle hardcopy terminals.\n",
+		   myname, free(myname));
+    }
+#endif
+    free(myname);
+    returnCode(code);
+}
+
+#ifdef USE_PTHREADS
+/*
+ * Returns a non-null pointer unless a new screen should be allocated because
+ * no match was found in the pre-screen cache.
+ */
+NCURSES_EXPORT(SCREEN *)
+_nc_find_prescr(void)
+{
+    SCREEN *result = 0;
+    PRESCREEN_LIST *p;
+    pthread_t id = GetThreadID();
+    for (p = _nc_prescreen.allocated; p != 0; p = p->next) {
+	if (p->id == id) {
+	    result = p->sp;
+	    break;
+	}
+    }
+    return result;
+}
+
+/*
+ * Tells ncurses to forget that this thread was associated with the pre-screen
+ * cache.  It does not modify the pre-screen cache itself, since that is used
+ * for creating new screens.
+ */
+NCURSES_EXPORT(void)
+_nc_forget_prescr(void)
+{
+    PRESCREEN_LIST *p, *q;
+    pthread_t id = GetThreadID();
+    _nc_lock_global(screen);
+    for (p = _nc_prescreen.allocated, q = 0; p != 0; q = p, p = p->next) {
+	if (p->id == id) {
+	    if (q) {
+		q->next = p->next;
+	    } else {
+		_nc_prescreen.allocated = p->next;
+	    }
+	    free(p);
+	    break;
+	}
+    }
+    _nc_unlock_global(screen);
+}
+#endif /* USE_PTHREADS */
+
+#if NCURSES_SP_FUNCS
+/*
+ * In case of handling multiple screens, we need to have a screen before
+ * initialization in _nc_setupscreen takes place.  This is to extend the
+ * substitute for some of the stuff in _nc_prescreen, especially for slk and
+ * ripoff handling which should be done per screen.
+ */
+NCURSES_EXPORT(SCREEN *)
+new_prescr(void)
+{
+    SCREEN *sp;
+
+    START_TRACE();
+    T((T_CALLED("new_prescr()")));
+
+    _nc_lock_global(screen);
+    if ((sp = _nc_find_prescr()) == 0) {
+	sp = _nc_alloc_screen_sp();
+	T(("_nc_alloc_screen_sp %p", (void *) sp));
+	if (sp != 0) {
+#ifdef USE_PTHREADS
+	    PRESCREEN_LIST *p = typeCalloc(PRESCREEN_LIST, 1);
+	    if (p != 0) {
+		p->id = GetThreadID();
+		p->sp = sp;
+		p->next = _nc_prescreen.allocated;
+		_nc_prescreen.allocated = p;
+	    }
+#else
+	    _nc_prescreen.allocated = sp;
+#endif
+	    sp->rsp = sp->rippedoff;
+	    sp->_filtered = _nc_prescreen.filter_mode;
+	    sp->_use_env = _nc_prescreen.use_env;
+#if NCURSES_NO_PADDING
+	    sp->_no_padding = _nc_prescreen._no_padding;
+#endif
+	    sp->slk_format = 0;
+	    sp->_slk = 0;
+	    sp->_prescreen = TRUE;
+	    SP_PRE_INIT(sp);
+#if USE_REENTRANT
+	    sp->_TABSIZE = _nc_prescreen._TABSIZE;
+	    sp->_ESCDELAY = _nc_prescreen._ESCDELAY;
+#endif
+	}
+    } else {
+	T(("_nc_alloc_screen_sp %p (reuse)", (void *) sp));
+    }
+    _nc_unlock_global(screen);
+    returnSP(sp);
+}
+#endif
+
+#ifdef USE_TERM_DRIVER
+/*
+ * This entrypoint is called from tgetent() to allow a special case of reusing
+ * the same TERMINAL data (see comment).
+ */
+NCURSES_EXPORT(int)
+_nc_setupterm(const char *tname,
+	      int Filedes,
+	      int *errret,
+	      int reuse)
+{
+    int rc = ERR;
+    TERMINAL *termp = 0;
+
+    _nc_init_pthreads();
+    _nc_lock_global(prescreen);
+    START_TRACE();
+    if (TINFO_SETUP_TERM(&termp, tname, Filedes, errret, reuse) == OK) {
+	_nc_forget_prescr();
+	if (NCURSES_SP_NAME(set_curterm) (CURRENT_SCREEN_PRE, termp) != 0) {
+	    rc = OK;
+	}
+    }
+    _nc_unlock_global(prescreen);
+
+    return rc;
+}
+#endif
+
+/*
+ *	setupterm(termname, Filedes, errret)
+ *
+ *	Find and read the appropriate object file for the terminal
+ *	Make cur_term point to the structure.
+ */
+NCURSES_EXPORT(int)
+setupterm(const char *tname, int Filedes, int *errret)
+{
+    START_TRACE();
+    return _nc_setupterm(tname, Filedes, errret, FALSE);
+}
diff --git a/ncurses/tinfo/lib_termcap.c b/ncurses/tinfo/lib_termcap.c
new file mode 100644
index 0000000..5ce43a3
--- /dev/null
+++ b/ncurses/tinfo/lib_termcap.c
@@ -0,0 +1,429 @@
+/****************************************************************************
+ * Copyright 2018,2020 Thomas E. Dickey                                     *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ *     and: Juergen Pfeifer                                                 *
+ *                                                                          *
+ * some of the code in here was contributed by:                             *
+ * Magnus Bengtsson, d6mbeng@dtek.chalmers.se (Nov'93)                      *
+ * (but it has changed a lot)                                               *
+ ****************************************************************************/
+
+#define __INTERNAL_CAPS_VISIBLE
+#include <curses.priv.h>
+
+#include <termcap.h>
+#include <tic.h>
+#include <ctype.h>
+
+#ifndef CUR
+#define CUR SP_TERMTYPE
+#endif
+
+MODULE_ID("$Id: lib_termcap.c,v 1.88 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT_VAR(char *) UP = 0;
+NCURSES_EXPORT_VAR(char *) BC = 0;
+
+#define MyCache  _nc_globals.tgetent_cache
+#define CacheInx _nc_globals.tgetent_index
+#define CacheSeq _nc_globals.tgetent_sequence
+
+#define FIX_SGR0 MyCache[CacheInx].fix_sgr0
+#define LAST_TRM MyCache[CacheInx].last_term
+#define LAST_BUF MyCache[CacheInx].last_bufp
+#define LAST_USE MyCache[CacheInx].last_used
+#define LAST_SEQ MyCache[CacheInx].sequence
+
+/*
+ * Termcap names are matched only using the first two bytes.
+ * Ignore any extended names longer than two bytes, to avoid problems
+ * with legacy code which passes in parameters whose use is long forgotten.
+ */
+#define ValidCap(cap) (((cap)[0] != '\0') && ((cap)[1] != '\0'))
+#define SameCap(a,b)  (((a)[0] == (b)[0]) && ((a)[1] == (b)[1]))
+#define ValidExt(ext) (ValidCap(ext) && (ext)[2] == '\0')
+
+/***************************************************************************
+ *
+ * tgetent(bufp, term)
+ *
+ * In termcap, this function reads in the entry for terminal `term' into the
+ * buffer pointed to by bufp. It must be called before any of the functions
+ * below are called.
+ * In this terminfo emulation, tgetent() simply calls setupterm() (which
+ * does a bit more than tgetent() in termcap does), and returns its return
+ * value (1 if successful, 0 if no terminal with the given name could be
+ * found, or -1 if no terminal descriptions have been installed on the
+ * system).  The bufp argument is ignored.
+ *
+ ***************************************************************************/
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(tgetent) (NCURSES_SP_DCLx char *bufp, const char *name)
+{
+    int rc = ERR;
+    int n;
+    bool found_cache = FALSE;
+#ifdef USE_TERM_DRIVER
+    TERMINAL *termp = 0;
+#endif
+
+    START_TRACE();
+    T((T_CALLED("tgetent()")));
+
+    TINFO_SETUP_TERM(&termp, name, STDOUT_FILENO, &rc, TRUE);
+
+#ifdef USE_TERM_DRIVER
+    if (termp == 0 ||
+	!((TERMINAL_CONTROL_BLOCK *) termp)->drv->isTerminfo)
+	returnCode(rc);
+#endif
+
+    /*
+     * In general we cannot tell if the fixed sgr0 is still used by the
+     * caller, but if tgetent() is called with the same buffer, that is
+     * good enough, since the previous data would be invalidated by the
+     * current call.
+     *
+     * bufp may be a null pointer, e.g., GNU termcap.  That allocates data,
+     * which is good until the next tgetent() call.  The conventional termcap
+     * is inconvenient because of the fixed buffer size, but because it uses
+     * caller-supplied buffers, can have multiple terminal descriptions in
+     * use at a given time.
+     */
+    for (n = 0; n < TGETENT_MAX; ++n) {
+	bool same_result = (MyCache[n].last_used && MyCache[n].last_bufp == bufp);
+	if (same_result) {
+	    CacheInx = n;
+	    if (FIX_SGR0 != 0) {
+		FreeAndNull(FIX_SGR0);
+	    }
+	    /*
+	     * Also free the terminfo data that we loaded (much bigger leak).
+	     */
+	    if (LAST_TRM != 0 && LAST_TRM != TerminalOf(SP_PARM)) {
+		TERMINAL *trm = LAST_TRM;
+		NCURSES_SP_NAME(del_curterm) (NCURSES_SP_ARGx LAST_TRM);
+		for (CacheInx = 0; CacheInx < TGETENT_MAX; ++CacheInx)
+		    if (LAST_TRM == trm)
+			LAST_TRM = 0;
+		CacheInx = n;
+	    }
+	    found_cache = TRUE;
+	    break;
+	}
+    }
+    if (!found_cache) {
+	int best = 0;
+
+	for (CacheInx = 0; CacheInx < TGETENT_MAX; ++CacheInx) {
+	    if (LAST_SEQ < MyCache[best].sequence) {
+		best = CacheInx;
+	    }
+	}
+	CacheInx = best;
+    }
+    if (rc == 1) {
+	LAST_TRM = TerminalOf(SP_PARM);
+	LAST_SEQ = ++CacheSeq;
+    } else {
+	LAST_TRM = 0;
+    }
+
+    PC = 0;
+    UP = 0;
+    BC = 0;
+    FIX_SGR0 = 0;		/* don't free it - application may still use */
+
+    if (rc == 1) {
+
+	if (cursor_left)
+	    if ((backspaces_with_bs = (char) !strcmp(cursor_left, "\b")) == 0)
+		backspace_if_not_bs = cursor_left;
+
+	/* we're required to export these */
+	if (pad_char != NULL)
+	    PC = pad_char[0];
+	if (cursor_up != NULL)
+	    UP = cursor_up;
+	if (backspace_if_not_bs != NULL)
+	    BC = backspace_if_not_bs;
+
+	if ((FIX_SGR0 = _nc_trim_sgr0(&TerminalType(TerminalOf(SP_PARM))))
+	    != 0) {
+	    if (!strcmp(FIX_SGR0, exit_attribute_mode)) {
+		if (FIX_SGR0 != exit_attribute_mode) {
+		    free(FIX_SGR0);
+		}
+		FIX_SGR0 = 0;
+	    }
+	}
+	LAST_BUF = bufp;
+	LAST_USE = TRUE;
+
+	SetNoPadding(SP_PARM);
+	(void) NCURSES_SP_NAME(baudrate) (NCURSES_SP_ARG);	/* sets ospeed as a side-effect */
+
+/* LINT_PREPRO
+#if 0*/
+#include <capdefaults.c>
+/* LINT_PREPRO
+#endif*/
+
+    }
+    returnCode(rc);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+tgetent(char *bufp, const char *name)
+{
+    return NCURSES_SP_NAME(tgetent) (CURRENT_SCREEN, bufp, name);
+}
+#endif
+
+#if 0
+static bool
+same_tcname(const char *a, const char *b)
+{
+    bool code = SameCap(a, b);
+    fprintf(stderr, "compare(%s,%s) %s\n", a, b, code ? "same" : "diff");
+    return code;
+}
+
+#else
+#define same_tcname(a,b) SameCap(a,b)
+#endif
+
+/***************************************************************************
+ *
+ * tgetflag(str)
+ *
+ * Look up boolean termcap capability str and return its value (TRUE=1 if
+ * present, FALSE=0 if not).
+ *
+ ***************************************************************************/
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(tgetflag) (NCURSES_SP_DCLx const char *id)
+{
+    int result = 0;		/* Solaris returns zero for missing flag */
+
+    T((T_CALLED("tgetflag(%p, %s)"), (void *) SP_PARM, id));
+    if (HasTInfoTerminal(SP_PARM) && ValidCap(id)) {
+	TERMTYPE2 *tp = &TerminalType(TerminalOf(SP_PARM));
+	struct name_table_entry const *entry_ptr;
+	int j = -1;
+
+	entry_ptr = _nc_find_type_entry(id, BOOLEAN, TRUE);
+	if (entry_ptr != 0) {
+	    j = entry_ptr->nte_index;
+	}
+#if NCURSES_XNAMES
+	else {
+	    int i;
+	    for_each_ext_boolean(i, tp) {
+		const char *capname = ExtBoolname(tp, i, boolcodes);
+		if (same_tcname(id, capname) && ValidExt(capname)) {
+		    j = i;
+		    break;
+		}
+	    }
+	}
+#endif
+	if (j >= 0) {
+	    /* note: setupterm forces invalid booleans to false */
+	    result = tp->Booleans[j];
+	}
+    }
+    returnCode(result);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+tgetflag(const char *id)
+{
+    return NCURSES_SP_NAME(tgetflag) (CURRENT_SCREEN, id);
+}
+#endif
+
+/***************************************************************************
+ *
+ * tgetnum(str)
+ *
+ * Look up numeric termcap capability str and return its value, or -1 if
+ * not given.
+ *
+ ***************************************************************************/
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(tgetnum) (NCURSES_SP_DCLx const char *id)
+{
+    int result = ABSENT_NUMERIC;
+
+    T((T_CALLED("tgetnum(%p, %s)"), (void *) SP_PARM, id));
+    if (HasTInfoTerminal(SP_PARM) && ValidCap(id)) {
+	TERMTYPE2 *tp = &TerminalType(TerminalOf(SP_PARM));
+	struct name_table_entry const *entry_ptr;
+	int j = -1;
+
+	entry_ptr = _nc_find_type_entry(id, NUMBER, TRUE);
+	if (entry_ptr != 0) {
+	    j = entry_ptr->nte_index;
+	}
+#if NCURSES_XNAMES
+	else {
+	    int i;
+	    for_each_ext_number(i, tp) {
+		const char *capname = ExtNumname(tp, i, numcodes);
+		if (same_tcname(id, capname) && ValidExt(capname)) {
+		    j = i;
+		    break;
+		}
+	    }
+	}
+#endif
+	if (j >= 0) {
+	    if (VALID_NUMERIC(tp->Numbers[j]))
+		result = tp->Numbers[j];
+	}
+    }
+    returnCode(result);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+tgetnum(const char *id)
+{
+    return NCURSES_SP_NAME(tgetnum) (CURRENT_SCREEN, id);
+}
+#endif
+
+/***************************************************************************
+ *
+ * tgetstr(str, area)
+ *
+ * Look up string termcap capability str and return a pointer to its value,
+ * or NULL if not given.
+ *
+ ***************************************************************************/
+
+NCURSES_EXPORT(char *)
+NCURSES_SP_NAME(tgetstr) (NCURSES_SP_DCLx const char *id, char **area)
+{
+    char *result = NULL;
+
+    T((T_CALLED("tgetstr(%s,%p)"), id, (void *) area));
+    if (HasTInfoTerminal(SP_PARM) && ValidCap(id)) {
+	TERMTYPE2 *tp = &TerminalType(TerminalOf(SP_PARM));
+	struct name_table_entry const *entry_ptr;
+	int j = -1;
+
+	entry_ptr = _nc_find_type_entry(id, STRING, TRUE);
+	if (entry_ptr != 0) {
+	    j = entry_ptr->nte_index;
+	}
+#if NCURSES_XNAMES
+	else {
+	    int i;
+	    for_each_ext_string(i, tp) {
+		const char *capname = ExtStrname(tp, i, strcodes);
+		if (same_tcname(id, capname) && ValidExt(capname)) {
+		    j = i;
+		    break;
+		}
+	    }
+	}
+#endif
+	if (j >= 0) {
+	    result = tp->Strings[j];
+	    TR(TRACE_DATABASE, ("found match %d: %s", j, _nc_visbuf(result)));
+	    /* setupterm forces canceled strings to null */
+	    if (VALID_STRING(result)) {
+		if (result == exit_attribute_mode
+		    && FIX_SGR0 != 0) {
+		    result = FIX_SGR0;
+		    TR(TRACE_DATABASE, ("altered to : %s", _nc_visbuf(result)));
+		}
+		if (area != 0
+		    && *area != 0) {
+		    _nc_STRCPY(*area, result, 1024);
+		    result = *area;
+		    *area += strlen(*area) + 1;
+		}
+	    }
+	}
+    }
+    returnPtr(result);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(char *)
+tgetstr(const char *id, char **area)
+{
+    return NCURSES_SP_NAME(tgetstr) (CURRENT_SCREEN, id, area);
+}
+#endif
+
+#if NO_LEAKS
+#undef CacheInx
+#define CacheInx num
+NCURSES_EXPORT(void)
+_nc_tgetent_leak(TERMINAL *termp)
+{
+    if (termp != 0) {
+	int num;
+	for (CacheInx = 0; CacheInx < TGETENT_MAX; ++CacheInx) {
+	    if (LAST_TRM == termp) {
+		FreeAndNull(FIX_SGR0);
+		if (LAST_TRM != 0) {
+		    LAST_TRM = 0;
+		}
+		break;
+	    }
+	}
+    }
+}
+
+NCURSES_EXPORT(void)
+_nc_tgetent_leaks(void)
+{
+    int num;
+    for (CacheInx = 0; CacheInx < TGETENT_MAX; ++CacheInx) {
+	if (LAST_TRM != 0) {
+	    del_curterm(LAST_TRM);
+	    _nc_tgetent_leak(LAST_TRM);
+	}
+    }
+}
+#endif
diff --git a/ncurses/tinfo/lib_termname.c b/ncurses/tinfo/lib_termname.c
new file mode 100644
index 0000000..2d80bb3
--- /dev/null
+++ b/ncurses/tinfo/lib_termname.c
@@ -0,0 +1,59 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2003,2009 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.                                                           *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_termname.c,v 1.13 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(char *)
+NCURSES_SP_NAME(termname) (NCURSES_SP_DCL0)
+{
+    char *name = 0;
+
+    T((T_CALLED("termname(%p)"), (void *) SP_PARM));
+
+#if NCURSES_SP_FUNCS
+    if (TerminalOf(SP_PARM) != 0) {
+	name = TerminalOf(SP_PARM)->_termname;
+    }
+#else
+    if (cur_term != 0)
+	name = cur_term->_termname;
+#endif
+
+    returnPtr(name);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(char *)
+termname(void)
+{
+    return NCURSES_SP_NAME(termname) (CURRENT_SCREEN);
+}
+#endif
diff --git a/ncurses/tinfo/lib_tgoto.c b/ncurses/tinfo/lib_tgoto.c
new file mode 100644
index 0000000..9cf5e10
--- /dev/null
+++ b/ncurses/tinfo/lib_tgoto.c
@@ -0,0 +1,212 @@
+/****************************************************************************
+ * Copyright 2018-2019,2020 Thomas E. Dickey                                *
+ * Copyright 2000-2008,2012 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                                                *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+
+#include <ctype.h>
+#include <termcap.h>
+
+MODULE_ID("$Id: lib_tgoto.c,v 1.21 2020/05/27 23:55:56 tom Exp $")
+
+#if !PURE_TERMINFO
+static bool
+is_termcap(const char *string)
+{
+    bool result = TRUE;
+
+    if (string == 0 || *string == '\0') {
+	result = FALSE;		/* tparm() handles empty strings */
+    } else {
+	while ((*string != '\0') && result) {
+	    if (*string == '%') {
+		switch (*++string) {
+		case 'p':
+		    result = FALSE;
+		    break;
+		case '\0':
+		    string--;
+		    break;
+		}
+	    } else if (string[0] == '$' && string[1] == '<') {
+		result = FALSE;
+	    }
+	    string++;
+	}
+    }
+    return result;
+}
+
+static char *
+tgoto_internal(const char *string, int x, int y)
+{
+    static char *result;
+    static size_t length;
+
+    int swap_arg;
+    int param[3];
+    size_t used = 0;
+    size_t need = 10;
+    int *value = param;
+    bool need_BC = FALSE;
+
+    if (BC)
+	need += strlen(BC);
+
+    param[0] = y;
+    param[1] = x;
+    param[2] = 0;
+
+    while (*string != 0) {
+	if ((used + need) > length) {
+	    length += (used + need);
+	    if ((result = typeRealloc(char, length, result)) == 0) {
+		length = 0;
+		break;
+	    }
+	}
+	if (*string == '%') {
+	    const char *fmt = 0;
+
+	    switch (*++string) {
+	    case '\0':
+		string--;
+		break;
+	    case 'd':
+		fmt = "%d";
+		break;
+	    case '2':
+		fmt = "%02d";
+		*value %= 100;
+		break;
+	    case '3':
+		fmt = "%03d";
+		*value %= 1000;
+		break;
+	    case '+':
+		*value += UChar(*++string);
+		/* FALLTHRU */
+	    case '.':
+		/*
+		 * Guard against tputs() seeing a truncated string.  The
+		 * termcap documentation refers to a similar fixup for \n
+		 * and \r, but I don't see that it could work -TD
+		 */
+		if (*value == 0) {
+		    if (BC != 0) {
+			*value += 1;
+			need_BC = TRUE;
+		    } else {
+			/* tputs will pretend this is \0, which will almost
+			 * always work since ANSI-compatible terminals ignore
+			 * the character.  ECMA-48 does not document a C1
+			 * control for this value.  A few (obsolete) terminals
+			 * can use this value in special cases, such as cursor
+			 * addressing using single-byte coordinates.
+			 */
+			*value = 0200;
+		    }
+		}
+		result[used++] = (char) *value++;
+		break;
+	    case '%':
+		result[used++] = *string;
+		break;
+	    case 'r':
+		swap_arg = param[0];
+		param[0] = param[1];
+		param[1] = swap_arg;
+		break;
+	    case 'i':
+		param[0] += 1;
+		param[1] += 1;
+		break;
+	    case '>':
+		if (*value > string[1])
+		    *value += string[2];
+		string += 2;
+		break;
+	    case 'n':		/* Datamedia 2500 */
+		param[0] ^= 0140;
+		param[1] ^= 0140;
+		break;
+	    case 'B':		/* BCD */
+		*value = 16 * (*value / 10) + (*value % 10);
+		break;
+	    case 'D':		/* Reverse coding (Delta Data) */
+		*value -= 2 * (*value % 16);
+		break;
+	    }
+	    if (fmt != 0) {
+		_nc_SPRINTF(result + used, _nc_SLIMIT(length - used)
+			    fmt, *value++);
+		used += strlen(result + used);
+		fmt = 0;
+	    }
+	    if (value - param > 2) {
+		value = param + 2;
+		*value = 0;
+	    }
+	} else {
+	    result[used++] = *string;
+	}
+	string++;
+    }
+    if (result != 0) {
+	if (need_BC) {
+	    _nc_STRCPY(result + used, BC, length - used);
+	    used += strlen(BC);
+	}
+	result[used] = '\0';
+    }
+    return result;
+}
+#endif
+
+/*
+ * Retained solely for upward compatibility.  Note the intentional reversing of
+ * the last two arguments when invoking tparm().
+ */
+NCURSES_EXPORT(char *)
+tgoto(const char *string, int x, int y)
+{
+    char *result;
+
+    T((T_CALLED("tgoto(%s, %d, %d)"), _nc_visbuf(string), x, y));
+#if !PURE_TERMINFO
+    if (is_termcap(string))
+	result = tgoto_internal(string, x, y);
+    else
+#endif
+	result = TIPARM_2(string, y, x);
+    returnPtr(result);
+}
diff --git a/ncurses/tinfo/lib_ti.c b/ncurses/tinfo/lib_ti.c
new file mode 100644
index 0000000..5cb77b8
--- /dev/null
+++ b/ncurses/tinfo/lib_ti.c
@@ -0,0 +1,188 @@
+/****************************************************************************
+ * Copyright 2018,2020 Thomas E. Dickey                                     *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+
+#include <tic.h>
+
+MODULE_ID("$Id: lib_ti.c,v 1.34 2020/02/02 23:34:34 tom Exp $")
+
+#if 0
+static bool
+same_name(const char *a, const char *b)
+{
+    fprintf(stderr, "compare(%s,%s)\n", a, b);
+    return !strcmp(a, b);
+}
+#else
+#define same_name(a,b) !strcmp(a,b)
+#endif
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(tigetflag) (NCURSES_SP_DCLx const char *str)
+{
+    int result = ABSENT_BOOLEAN;
+
+    T((T_CALLED("tigetflag(%p, %s)"), (void *) SP_PARM, str));
+
+    if (HasTInfoTerminal(SP_PARM)) {
+	TERMTYPE2 *tp = &TerminalType(TerminalOf(SP_PARM));
+	struct name_table_entry const *entry_ptr;
+	int j = -1;
+
+	entry_ptr = _nc_find_type_entry(str, BOOLEAN, FALSE);
+	if (entry_ptr != 0) {
+	    j = entry_ptr->nte_index;
+	}
+#if NCURSES_XNAMES
+	else {
+	    int i;
+	    for_each_ext_boolean(i, tp) {
+		const char *capname = ExtBoolname(tp, i, boolnames);
+		if (same_name(str, capname)) {
+		    j = i;
+		    break;
+		}
+	    }
+	}
+#endif
+	if (j >= 0) {
+	    /* note: setupterm forces invalid booleans to false */
+	    result = tp->Booleans[j];
+	}
+    }
+
+    returnCode(result);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+tigetflag(const char *str)
+{
+    return NCURSES_SP_NAME(tigetflag) (CURRENT_SCREEN, str);
+}
+#endif
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(tigetnum) (NCURSES_SP_DCLx const char *str)
+{
+    int result = CANCELLED_NUMERIC;	/* Solaris returns a -1 on error */
+
+    T((T_CALLED("tigetnum(%p, %s)"), (void *) SP_PARM, str));
+
+    if (HasTInfoTerminal(SP_PARM)) {
+	TERMTYPE2 *tp = &TerminalType(TerminalOf(SP_PARM));
+	struct name_table_entry const *entry_ptr;
+	int j = -1;
+
+	entry_ptr = _nc_find_type_entry(str, NUMBER, FALSE);
+	if (entry_ptr != 0) {
+	    j = entry_ptr->nte_index;
+	}
+#if NCURSES_XNAMES
+	else {
+	    int i;
+	    for_each_ext_number(i, tp) {
+		const char *capname = ExtNumname(tp, i, numnames);
+		if (same_name(str, capname)) {
+		    j = i;
+		    break;
+		}
+	    }
+	}
+#endif
+	if (j >= 0) {
+	    if (VALID_NUMERIC(tp->Numbers[j]))
+		result = tp->Numbers[j];
+	    else
+		result = ABSENT_NUMERIC;
+	}
+    }
+
+    returnCode(result);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+tigetnum(const char *str)
+{
+    return NCURSES_SP_NAME(tigetnum) (CURRENT_SCREEN, str);
+}
+#endif
+
+NCURSES_EXPORT(char *)
+NCURSES_SP_NAME(tigetstr) (NCURSES_SP_DCLx const char *str)
+{
+    char *result = CANCELLED_STRING;
+
+    T((T_CALLED("tigetstr(%p, %s)"), (void *) SP_PARM, str));
+
+    if (HasTInfoTerminal(SP_PARM)) {
+	TERMTYPE2 *tp = &TerminalType(TerminalOf(SP_PARM));
+	struct name_table_entry const *entry_ptr;
+	int j = -1;
+
+	entry_ptr = _nc_find_type_entry(str, STRING, FALSE);
+	if (entry_ptr != 0) {
+	    j = entry_ptr->nte_index;
+	}
+#if NCURSES_XNAMES
+	else {
+	    int i;
+	    for_each_ext_string(i, tp) {
+		const char *capname = ExtStrname(tp, i, strnames);
+		if (same_name(str, capname)) {
+		    j = i;
+		    break;
+		}
+	    }
+	}
+#endif
+	if (j >= 0) {
+	    /* note: setupterm forces cancelled strings to null */
+	    result = tp->Strings[j];
+	}
+    }
+
+    returnPtr(result);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(char *)
+tigetstr(const char *str)
+{
+    return NCURSES_SP_NAME(tigetstr) (CURRENT_SCREEN, str);
+}
+#endif
diff --git a/ncurses/tinfo/lib_tparm.c b/ncurses/tinfo/lib_tparm.c
new file mode 100644
index 0000000..d9bdfd8
--- /dev/null
+++ b/ncurses/tinfo/lib_tparm.c
@@ -0,0 +1,1219 @@
+/****************************************************************************
+ * Copyright 2018-2020,2021 Thomas E. Dickey                                *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey, 1996 on                                       *
+ ****************************************************************************/
+
+/*
+ *	tparm.c
+ *
+ */
+
+#define entry _ncu_entry
+#define ENTRY _ncu_ENTRY
+
+#include <curses.priv.h>
+
+#undef entry
+#undef ENTRY
+
+#if HAVE_TSEARCH
+#include <search.h>
+#endif
+
+#include <ctype.h>
+#include <tic.h>
+
+MODULE_ID("$Id: lib_tparm.c,v 1.137 2021/11/20 23:29:15 tom Exp $")
+
+/*
+ *	char *
+ *	tparm(string, ...)
+ *
+ *	Substitute the given parameters into the given string by the following
+ *	rules (taken from terminfo(5)):
+ *
+ *	     Cursor addressing and other strings  requiring  parame-
+ *	ters in the terminal are described by a parameterized string
+ *	capability, with escapes like %x in  it.   For  example,  to
+ *	address  the  cursor, the cup capability is given, using two
+ *	parameters: the row and column to  address  to.   (Rows  and
+ *	columns  are  numbered  from  zero and refer to the physical
+ *	screen visible to the user, not to any  unseen  memory.)  If
+ *	the terminal has memory relative cursor addressing, that can
+ *	be indicated by
+ *
+ *	     The parameter mechanism uses  a  stack  and  special  %
+ *	codes  to manipulate it.  Typically a sequence will push one
+ *	of the parameters onto the stack and then print it  in  some
+ *	format.  Often more complex operations are necessary.
+ *
+ *	     The % encodings have the following meanings:
+ *
+ *	     %%        outputs `%'
+ *	     %c        print pop() like %c in printf()
+ *	     %s        print pop() like %s in printf()
+ *           %[[:]flags][width[.precision]][doxXs]
+ *                     as in printf, flags are [-+#] and space
+ *                     The ':' is used to avoid making %+ or %-
+ *                     patterns (see below).
+ *
+ *	     %p[1-9]   push ith parm
+ *	     %P[a-z]   set dynamic variable [a-z] to pop()
+ *	     %g[a-z]   get dynamic variable [a-z] and push it
+ *	     %P[A-Z]   set static variable [A-Z] to pop()
+ *	     %g[A-Z]   get static variable [A-Z] and push it
+ *	     %l        push strlen(pop)
+ *	     %'c'      push char constant c
+ *	     %{nn}     push integer constant nn
+ *
+ *	     %+ %- %* %/ %m
+ *	               arithmetic (%m is mod): push(pop() op pop())
+ *	     %& %| %^  bit operations: push(pop() op pop())
+ *	     %= %> %<  logical operations: push(pop() op pop())
+ *	     %A %O     logical and & or operations for conditionals
+ *	     %! %~     unary operations push(op pop())
+ *	     %i        add 1 to first two parms (for ANSI terminals)
+ *
+ *	     %? expr %t thenpart %e elsepart %;
+ *	               if-then-else, %e elsepart is optional.
+ *	               else-if's are possible ala Algol 68:
+ *	               %? c1 %t b1 %e c2 %t b2 %e c3 %t b3 %e c4 %t b4 %e b5 %;
+ *
+ *	For those of the above operators which are binary and not commutative,
+ *	the stack works in the usual way, with
+ *			%gx %gy %m
+ *	resulting in x mod y, not the reverse.
+ */
+
+NCURSES_EXPORT_VAR(int) _nc_tparm_err = 0;
+
+#define TPS(var) tps->var
+#define popcount _nc_popcount	/* workaround for NetBSD 6.0 defect */
+
+#define get_tparm_state(term) \
+	    (term != NULL \
+	      ? &(term->tparm_state) \
+	      : &(_nc_prescreen.tparm_state))
+
+#define isUPPER(c) ((c) >= 'A' && (c) <= 'Z')
+#define isLOWER(c) ((c) >= 'a' && (c) <= 'z')
+#define tc_BUMP()  if (level < 0 && number < 2) number++
+
+typedef struct {
+    const char *format;		/* format-string can be used as cache-key */
+    int tparm_type;		/* bit-set for each string-parameter */
+    int num_actual;
+    int num_parsed;
+    int num_popped;
+    TPARM_ARG param[NUM_PARM];
+    char *p_is_s[NUM_PARM];
+} TPARM_DATA;
+
+#if HAVE_TSEARCH
+#define MyCache _nc_globals.cached_tparm
+#define MyCount _nc_globals.count_tparm
+static int which_tparm;
+static TPARM_DATA **delete_tparm;
+#endif /* HAVE_TSEARCH */
+
+static char dummy[] = "";	/* avoid const-cast */
+
+#if HAVE_TSEARCH
+static int
+cmp_format(const void *p, const void *q)
+{
+    const char *a = *(char *const *) p;
+    const char *b = *(char *const *) q;
+    return strcmp(a, b);
+}
+#endif
+
+#if HAVE_TSEARCH
+static void
+visit_nodes(const void *nodep, VISIT which, int depth)
+{
+    (void) depth;
+    if (which == preorder || which == leaf) {
+	delete_tparm[which_tparm] = *(TPARM_DATA **) nodep;
+	which_tparm++;
+    }
+}
+#endif
+
+NCURSES_EXPORT(void)
+_nc_free_tparm(TERMINAL *termp)
+{
+    TPARM_STATE *tps = get_tparm_state(termp);
+#if HAVE_TSEARCH
+    if (MyCount != 0) {
+	delete_tparm = typeCalloc(TPARM_DATA *, MyCount);
+	which_tparm = 0;
+	twalk(MyCache, visit_nodes);
+	for (which_tparm = 0; which_tparm < MyCount; ++which_tparm) {
+	    TPARM_DATA *ptr = delete_tparm[which_tparm];
+	    if (ptr != NULL) {
+		tdelete(ptr, &MyCache, cmp_format);
+		free((char *) ptr->format);
+		free(ptr);
+	    }
+	}
+	which_tparm = 0;
+	twalk(MyCache, visit_nodes);
+	FreeAndNull(delete_tparm);
+	MyCount = 0;
+	which_tparm = 0;
+    }
+#endif
+    FreeAndNull(TPS(out_buff));
+    TPS(out_size) = 0;
+    TPS(out_used) = 0;
+
+    FreeAndNull(TPS(fmt_buff));
+    TPS(fmt_size) = 0;
+}
+
+static int
+tparm_error(TPARM_STATE *tps, const char *message)
+{
+    (void) tps;
+    (void) message;
+    DEBUG(2, ("%s: %s", message, _nc_visbuf(TPS(tparam_base))));
+    return ++_nc_tparm_err;
+}
+
+#define get_space(tps, need) \
+{ \
+    size_t need2get = need + TPS(out_used); \
+    if (need2get > TPS(out_size)) { \
+	TPS(out_size) = need2get * 2; \
+	TYPE_REALLOC(char, TPS(out_size), TPS(out_buff)); \
+    } \
+}
+
+#if NCURSES_EXPANDED
+static NCURSES_INLINE void
+  (get_space) (TPARM_STATE *tps, size_t need) {
+    get_space(tps, need);
+}
+
+#undef get_space
+#endif
+
+#define save_text(tps, fmt, s, len) \
+{ \
+    size_t s_len = (size_t) len + strlen(s) + strlen(fmt); \
+    get_space(tps, s_len + 1); \
+    _nc_SPRINTF(TPS(out_buff) + TPS(out_used), \
+		_nc_SLIMIT(TPS(out_size) - TPS(out_used)) \
+		fmt, s); \
+    TPS(out_used) += strlen(TPS(out_buff) + TPS(out_used)); \
+}
+
+#if NCURSES_EXPANDED
+static NCURSES_INLINE void
+  (save_text) (TPARM_STATE *tps, const char *fmt, const char *s, int len) {
+    save_text(tps, fmt, s, len);
+}
+
+#undef save_text
+#endif
+
+#define save_number(tps, fmt, number, len) \
+{ \
+    size_t s_len = (size_t) len + 30 + strlen(fmt); \
+    get_space(tps, s_len + 1); \
+    _nc_SPRINTF(TPS(out_buff) + TPS(out_used), \
+		_nc_SLIMIT(TPS(out_size) - TPS(out_used)) \
+		fmt, number); \
+    TPS(out_used) += strlen(TPS(out_buff) + TPS(out_used)); \
+}
+
+#if NCURSES_EXPANDED
+static NCURSES_INLINE void
+  (save_number) (TPARM_STATE *tps, const char *fmt, int number, int len) {
+    save_number(tps, fmt, number, len);
+}
+
+#undef save_number
+#endif
+
+#define save_char(tps, c) \
+{ \
+    get_space(tps, (size_t) 1); \
+    TPS(out_buff)[TPS(out_used)++] = (char) ((c == 0) ? 0200 : c); \
+}
+
+#if NCURSES_EXPANDED
+static NCURSES_INLINE void
+  (save_char) (TPARM_STATE *tps, int c) {
+    save_char(tps, c);
+}
+
+#undef save_char
+#endif
+
+#define npush(tps, x) \
+{ \
+    if (TPS(stack_ptr) < STACKSIZE) { \
+	TPS(stack)[TPS(stack_ptr)].num_type = TRUE; \
+	TPS(stack)[TPS(stack_ptr)].data.num = x; \
+	TPS(stack_ptr)++; \
+    } else { \
+	(void) tparm_error(tps, "npush: stack overflow"); \
+    } \
+}
+
+#if NCURSES_EXPANDED
+static NCURSES_INLINE void
+  (npush) (TPARM_STATE *tps, int x) {
+    npush(tps, x);
+}
+
+#undef npush
+#endif
+
+#define spush(tps, x) \
+{ \
+    if (TPS(stack_ptr) < STACKSIZE) { \
+	TPS(stack)[TPS(stack_ptr)].num_type = FALSE; \
+	TPS(stack)[TPS(stack_ptr)].data.str = x; \
+	TPS(stack_ptr)++; \
+    } else { \
+	(void) tparm_error(tps, "spush: stack overflow"); \
+    } \
+}
+
+#if NCURSES_EXPANDED
+static NCURSES_INLINE void
+  (spush) (TPARM_STATE *tps, char *x) {
+    spush(tps, x);
+}
+
+#undef spush
+#endif
+
+#define npop(tps) \
+    ((TPS(stack_ptr)-- > 0) \
+     ? ((TPS(stack)[TPS(stack_ptr)].num_type) \
+	 ? TPS(stack)[TPS(stack_ptr)].data.num \
+	 : 0) \
+     : (tparm_error(tps, "npop: stack underflow"), \
+        TPS(stack_ptr) = 0))
+
+#if NCURSES_EXPANDED
+static NCURSES_INLINE int
+  (npop) (TPARM_STATE *tps) {
+    return npop(tps);
+}
+#undef npop
+#endif
+
+#define spop(tps) \
+    ((TPS(stack_ptr)-- > 0) \
+     ? ((!TPS(stack)[TPS(stack_ptr)].num_type \
+        && TPS(stack)[TPS(stack_ptr)].data.str != 0) \
+         ? TPS(stack)[TPS(stack_ptr)].data.str \
+         : dummy) \
+     : (tparm_error(tps, "spop: stack underflow"), \
+        dummy))
+
+#if NCURSES_EXPANDED
+static NCURSES_INLINE char *
+  (spop) (TPARM_STATE *tps) {
+    return spop(tps);
+}
+#undef spop
+#endif
+
+static NCURSES_INLINE const char *
+parse_format(const char *s, char *format, int *len)
+{
+    *len = 0;
+    if (format != 0) {
+	bool done = FALSE;
+	bool allowminus = FALSE;
+	bool dot = FALSE;
+	bool err = FALSE;
+	char *fmt = format;
+	int my_width = 0;
+	int my_prec = 0;
+	int value = 0;
+
+	*len = 0;
+	*format++ = '%';
+	while (*s != '\0' && !done) {
+	    switch (*s) {
+	    case 'c':		/* FALLTHRU */
+	    case 'd':		/* FALLTHRU */
+	    case 'o':		/* FALLTHRU */
+	    case 'x':		/* FALLTHRU */
+	    case 'X':		/* FALLTHRU */
+	    case 's':
+#ifdef EXP_XTERM_1005
+	    case 'u':
+#endif
+		*format++ = *s;
+		done = TRUE;
+		break;
+	    case '.':
+		*format++ = *s++;
+		if (dot) {
+		    err = TRUE;
+		} else {	/* value before '.' is the width */
+		    dot = TRUE;
+		    my_width = value;
+		}
+		value = 0;
+		break;
+	    case '#':
+		*format++ = *s++;
+		break;
+	    case ' ':
+		*format++ = *s++;
+		break;
+	    case ':':
+		s++;
+		allowminus = TRUE;
+		break;
+	    case '-':
+		if (allowminus) {
+		    *format++ = *s++;
+		} else {
+		    done = TRUE;
+		}
+		break;
+	    default:
+		if (isdigit(UChar(*s))) {
+		    value = (value * 10) + (*s - '0');
+		    if (value > 10000)
+			err = TRUE;
+		    *format++ = *s++;
+		} else {
+		    done = TRUE;
+		}
+	    }
+	}
+
+	/*
+	 * If we found an error, ignore (and remove) the flags.
+	 */
+	if (err) {
+	    my_width = my_prec = value = 0;
+	    format = fmt;
+	    *format++ = '%';
+	    *format++ = *s;
+	}
+
+	/*
+	 * Any value after '.' is the precision.  If we did not see '.', then
+	 * the value is the width.
+	 */
+	if (dot)
+	    my_prec = value;
+	else
+	    my_width = value;
+
+	*format = '\0';
+	/* return maximum string length in print */
+	*len = (my_width > my_prec) ? my_width : my_prec;
+    }
+    return s;
+}
+
+/*
+ * Analyze the string to see how many parameters we need from the varargs list,
+ * and what their types are.  We will only accept string parameters if they
+ * appear as a %l or %s format following an explicit parameter reference (e.g.,
+ * %p2%s).  All other parameters are numbers.
+ *
+ * 'number' counts coarsely the number of pop's we see in the string, and
+ * 'popcount' shows the highest parameter number in the string.  We would like
+ * to simply use the latter count, but if we are reading termcap strings, there
+ * may be cases that we cannot see the explicit parameter numbers.
+ */
+NCURSES_EXPORT(int)
+_nc_tparm_analyze(TERMINAL *term, const char *string, char **p_is_s, int *popcount)
+{
+    TPARM_STATE *tps = get_tparm_state(term);
+    size_t len2;
+    int i;
+    int lastpop = -1;
+    int len;
+    int number = 0;
+    int level = -1;
+    const char *cp = string;
+
+    if (cp == 0)
+	return 0;
+
+    if ((len2 = strlen(cp)) + 2 > TPS(fmt_size)) {
+	TPS(fmt_size) += len2 + 2;
+	TPS(fmt_buff) = typeRealloc(char, TPS(fmt_size), TPS(fmt_buff));
+	if (TPS(fmt_buff) == 0)
+	    return 0;
+    }
+
+    memset(p_is_s, 0, sizeof(p_is_s[0]) * NUM_PARM);
+    *popcount = 0;
+
+    while ((cp - string) < (int) len2) {
+	if (*cp == '%') {
+	    cp++;
+	    cp = parse_format(cp, TPS(fmt_buff), &len);
+	    switch (*cp) {
+	    default:
+		break;
+
+	    case 'd':		/* FALLTHRU */
+	    case 'o':		/* FALLTHRU */
+	    case 'x':		/* FALLTHRU */
+	    case 'X':		/* FALLTHRU */
+	    case 'c':		/* FALLTHRU */
+#ifdef EXP_XTERM_1005
+	    case 'u':
+#endif
+		if (lastpop <= 0) {
+		    tc_BUMP();
+		}
+		level -= 1;
+		lastpop = -1;
+		break;
+
+	    case 'l':
+	    case 's':
+		if (lastpop > 0) {
+		    level -= 1;
+		    p_is_s[lastpop - 1] = dummy;
+		}
+		tc_BUMP();
+		break;
+
+	    case 'p':
+		cp++;
+		i = (UChar(*cp) - '0');
+		if (i >= 0 && i <= NUM_PARM) {
+		    ++level;
+		    lastpop = i;
+		    if (lastpop > *popcount)
+			*popcount = lastpop;
+		}
+		break;
+
+	    case 'P':
+		++cp;
+		break;
+
+	    case 'g':
+		++level;
+		cp++;
+		break;
+
+	    case S_QUOTE:
+		++level;
+		cp += 2;
+		lastpop = -1;
+		break;
+
+	    case L_BRACE:
+		++level;
+		cp++;
+		while (isdigit(UChar(*cp))) {
+		    cp++;
+		}
+		break;
+
+	    case '+':
+	    case '-':
+	    case '*':
+	    case '/':
+	    case 'm':
+	    case 'A':
+	    case 'O':
+	    case '&':
+	    case '|':
+	    case '^':
+	    case '=':
+	    case '<':
+	    case '>':
+		tc_BUMP();
+		level -= 1;	/* pop 2, operate, push 1 */
+		lastpop = -1;
+		break;
+
+	    case '!':
+	    case '~':
+		tc_BUMP();
+		lastpop = -1;
+		break;
+
+	    case 'i':
+		/* will add 1 to first (usually two) parameters */
+		break;
+	    }
+	}
+	if (*cp != '\0')
+	    cp++;
+    }
+
+    if (number > NUM_PARM)
+	number = NUM_PARM;
+    return number;
+}
+
+/*
+ * Analyze the capability string, finding the number of parameters and their
+ * types.
+ *
+ * TODO: cache the result so that this is done once per capability per term.
+ */
+static int
+tparm_setup(TERMINAL *term, const char *string, TPARM_DATA *result)
+{
+    TPARM_STATE *tps = get_tparm_state(term);
+    int rc = OK;
+
+    TPS(out_used) = 0;
+    memset(result, 0, sizeof(*result));
+
+    if (string == NULL) {
+	TR(TRACE_CALLS, ("%s: format is null", TPS(tname)));
+	rc = ERR;
+    } else {
+#if HAVE_TSEARCH
+	TPARM_DATA *fs;
+	void *ft;
+
+	result->format = string;
+	if ((ft = tfind(result, &MyCache, cmp_format)) != 0) {
+	    size_t len2;
+	    fs = *(TPARM_DATA **) ft;
+	    *result = *fs;
+	    if ((len2 = strlen(string)) + 2 > TPS(fmt_size)) {
+		TPS(fmt_size) += len2 + 2;
+		TPS(fmt_buff) = typeRealloc(char, TPS(fmt_size), TPS(fmt_buff));
+		if (TPS(fmt_buff) == 0)
+		    return ERR;
+	    }
+	} else
+#endif
+	{
+	    /*
+	     * Find the highest parameter-number referred to in the format
+	     * string.  Use this value to limit the number of arguments copied
+	     * from the variable-length argument list.
+	     */
+	    result->num_parsed = _nc_tparm_analyze(term, string,
+						   result->p_is_s,
+						   &(result->num_popped));
+	    if (TPS(fmt_buff) == 0) {
+		TR(TRACE_CALLS, ("%s: error in analysis", TPS(tname)));
+		rc = ERR;
+	    } else {
+		int n;
+
+		if (result->num_parsed > NUM_PARM)
+		    result->num_parsed = NUM_PARM;
+		if (result->num_popped > NUM_PARM)
+		    result->num_popped = NUM_PARM;
+		result->num_actual = max(result->num_popped, result->num_parsed);
+
+		for (n = 0; n < result->num_actual; ++n) {
+		    if (result->p_is_s[n])
+			result->tparm_type |= (1 << n);
+		}
+#if HAVE_TSEARCH
+		if ((fs = typeCalloc(TPARM_DATA, 1)) != 0) {
+		    *fs = *result;
+		    if ((fs->format = strdup(string)) != 0) {
+			if (tsearch(fs, &MyCache, cmp_format) != 0) {
+			    ++MyCount;
+			} else {
+			    free(fs);
+			    rc = ERR;
+			}
+		    } else {
+			free(fs);
+			rc = ERR;
+		    }
+		} else {
+		    rc = ERR;
+		}
+#endif
+	    }
+	}
+    }
+
+    return rc;
+}
+
+/*
+ * A few caps (such as plab_norm) have string-valued parms.  We'll have to
+ * assume that the caller knows the difference, since a char* and an int may
+ * not be the same size on the stack.  The normal prototype for tparm uses 9
+ * long's, which is consistent with our va_arg() usage.
+ */
+static void
+tparm_copy_valist(TPARM_DATA *data, int use_TPARM_ARG, va_list ap)
+{
+    int i;
+
+    for (i = 0; i < data->num_actual; i++) {
+	if (data->p_is_s[i] != 0) {
+	    char *value = va_arg(ap, char *);
+	    if (value == 0)
+		value = dummy;
+	    data->p_is_s[i] = value;
+	    data->param[i] = 0;
+	} else if (use_TPARM_ARG) {
+	    data->param[i] = va_arg(ap, TPARM_ARG);
+	} else {
+	    data->param[i] = (TPARM_ARG) va_arg(ap, int);
+	}
+    }
+}
+
+/*
+ * This is a termcap compatibility hack.  If there are no explicit pop
+ * operations in the string, load the stack in such a way that successive pops
+ * will grab successive parameters.  That will make the expansion of (for
+ * example) \E[%d;%dH work correctly in termcap style, which means tparam()
+ * will expand termcap strings OK.
+ */
+static bool
+tparm_tc_compat(TPARM_STATE *tps, TPARM_DATA *data)
+{
+    bool termcap_hack = FALSE;
+
+    TPS(stack_ptr) = 0;
+
+    if (data->num_popped == 0) {
+	int i;
+
+	termcap_hack = TRUE;
+	for (i = data->num_parsed - 1; i >= 0; i--) {
+	    if (data->p_is_s[i]) {
+		spush(tps, data->p_is_s[i]);
+	    } else {
+		npush(tps, (int) data->param[i]);
+	    }
+	}
+    }
+    return termcap_hack;
+}
+
+#ifdef TRACE
+static void
+tparm_trace_call(TPARM_STATE *tps, const char *string, TPARM_DATA *data)
+{
+    if (USE_TRACEF(TRACE_CALLS)) {
+	int i;
+	for (i = 0; i < data->num_actual; i++) {
+	    if (data->p_is_s[i] != 0) {
+		save_text(tps, ", %s", _nc_visbuf(data->p_is_s[i]), 0);
+	    } else if ((long) data->param[i] > MAX_OF_TYPE(NCURSES_INT2) ||
+		       (long) data->param[i] < 0) {
+		_tracef("BUG: problem with tparm parameter #%d of %d",
+			i + 1, data->num_actual);
+		break;
+	    } else {
+		save_number(tps, ", %d", (int) data->param[i], 0);
+	    }
+	}
+	_tracef(T_CALLED("%s(%s%s)"), TPS(tname), _nc_visbuf(string), TPS(out_buff));
+	TPS(out_used) = 0;
+	_nc_unlock_global(tracef);
+    }
+}
+
+#else
+#define tparm_trace_call(tps, string, data)	/* nothing */
+#endif /* TRACE */
+
+#define init_vars(name) \
+	if (!name##_used) { \
+	    name##_used = TRUE; \
+	    memset(name##_vars, 0, sizeof(name##_vars)); \
+	}
+
+static NCURSES_INLINE char *
+tparam_internal(TPARM_STATE *tps, const char *string, TPARM_DATA *data)
+{
+    int number;
+    int len;
+    int level;
+    int x, y;
+    int i;
+    const char *s;
+    const char *cp = string;
+    size_t len2 = strlen(cp);
+    bool incremented_two = FALSE;
+    bool termcap_hack = tparm_tc_compat(tps, data);
+    /*
+     * SVr4 curses stores variables 'A' to 'Z' in the TERMINAL structure (so
+     * they are initialized once to zero), and variables 'a' to 'z' on the
+     * stack in tparm, referring to the former as "static" and the latter as
+     * "dynamic".  However, it makes no check to ensure that the "dynamic"
+     * variables are initialized.
+     *
+     * Solaris xpg4 curses makes no distinction between the upper/lower, and
+     * stores the common set of 26 variables on the stack, without initializing
+     * them.
+     *
+     * In ncurses, both sets of variables are initialized on the first use.
+     */
+    bool dynamic_used = FALSE;
+    int dynamic_vars[NUM_VARS];
+
+    tparm_trace_call(tps, string, data);
+
+    while ((cp - string) < (int) len2) {
+	if (*cp != '%') {
+	    save_char(tps, UChar(*cp));
+	} else {
+	    TPS(tparam_base) = cp++;
+	    cp = parse_format(cp, TPS(fmt_buff), &len);
+	    switch (*cp) {
+	    default:
+		break;
+	    case '%':
+		save_char(tps, '%');
+		break;
+
+	    case 'd':		/* FALLTHRU */
+	    case 'o':		/* FALLTHRU */
+	    case 'x':		/* FALLTHRU */
+	    case 'X':		/* FALLTHRU */
+		x = npop(tps);
+		save_number(tps, TPS(fmt_buff), x, len);
+		break;
+
+	    case 'c':		/* FALLTHRU */
+		x = npop(tps);
+		save_char(tps, x);
+		break;
+
+#ifdef EXP_XTERM_1005
+	    case 'u':
+		{
+		    unsigned char target[10];
+		    unsigned source = (unsigned) npop(tps);
+		    int rc = _nc_conv_to_utf8(target, source, (unsigned)
+					      sizeof(target));
+		    int n;
+		    for (n = 0; n < rc; ++n) {
+			save_char(tps, target[n]);
+		    }
+		}
+		break;
+#endif
+	    case 'l':
+		s = spop(tps);
+		npush(tps, (int) strlen(s));
+		break;
+
+	    case 's':
+		s = spop(tps);
+		save_text(tps, TPS(fmt_buff), s, len);
+		break;
+
+	    case 'p':
+		cp++;
+		i = (UChar(*cp) - '1');
+		if (i >= 0 && i < NUM_PARM) {
+		    if (data->p_is_s[i]) {
+			spush(tps, data->p_is_s[i]);
+		    } else {
+			npush(tps, (int) data->param[i]);
+		    }
+		}
+		break;
+
+	    case 'P':
+		cp++;
+		if (isUPPER(*cp)) {
+		    i = (UChar(*cp) - 'A');
+		    TPS(static_vars)[i] = npop(tps);
+		} else if (isLOWER(*cp)) {
+		    i = (UChar(*cp) - 'a');
+		    init_vars(dynamic);
+		    dynamic_vars[i] = npop(tps);
+		}
+		break;
+
+	    case 'g':
+		cp++;
+		if (isUPPER(*cp)) {
+		    i = (UChar(*cp) - 'A');
+		    npush(tps, TPS(static_vars)[i]);
+		} else if (isLOWER(*cp)) {
+		    i = (UChar(*cp) - 'a');
+		    init_vars(dynamic);
+		    npush(tps, dynamic_vars[i]);
+		}
+		break;
+
+	    case S_QUOTE:
+		cp++;
+		npush(tps, UChar(*cp));
+		cp++;
+		break;
+
+	    case L_BRACE:
+		number = 0;
+		cp++;
+		while (isdigit(UChar(*cp))) {
+		    number = (number * 10) + (UChar(*cp) - '0');
+		    cp++;
+		}
+		npush(tps, number);
+		break;
+
+	    case '+':
+		y = npop(tps);
+		x = npop(tps);
+		npush(tps, x + y);
+		break;
+
+	    case '-':
+		y = npop(tps);
+		x = npop(tps);
+		npush(tps, x - y);
+		break;
+
+	    case '*':
+		y = npop(tps);
+		x = npop(tps);
+		npush(tps, x * y);
+		break;
+
+	    case '/':
+		y = npop(tps);
+		x = npop(tps);
+		npush(tps, y ? (x / y) : 0);
+		break;
+
+	    case 'm':
+		y = npop(tps);
+		x = npop(tps);
+		npush(tps, y ? (x % y) : 0);
+		break;
+
+	    case 'A':
+		y = npop(tps);
+		x = npop(tps);
+		npush(tps, y && x);
+		break;
+
+	    case 'O':
+		y = npop(tps);
+		x = npop(tps);
+		npush(tps, y || x);
+		break;
+
+	    case '&':
+		y = npop(tps);
+		x = npop(tps);
+		npush(tps, x & y);
+		break;
+
+	    case '|':
+		y = npop(tps);
+		x = npop(tps);
+		npush(tps, x | y);
+		break;
+
+	    case '^':
+		y = npop(tps);
+		x = npop(tps);
+		npush(tps, x ^ y);
+		break;
+
+	    case '=':
+		y = npop(tps);
+		x = npop(tps);
+		npush(tps, x == y);
+		break;
+
+	    case '<':
+		y = npop(tps);
+		x = npop(tps);
+		npush(tps, x < y);
+		break;
+
+	    case '>':
+		y = npop(tps);
+		x = npop(tps);
+		npush(tps, x > y);
+		break;
+
+	    case '!':
+		x = npop(tps);
+		npush(tps, !x);
+		break;
+
+	    case '~':
+		x = npop(tps);
+		npush(tps, ~x);
+		break;
+
+	    case 'i':
+		/*
+		 * Increment the first two parameters -- if they are numbers
+		 * rather than strings.  As a side effect, assign into the
+		 * stack; if this is termcap, then the stack was populated
+		 * using the termcap hack above rather than via the terminfo
+		 * 'p' case.
+		 */
+		if (!incremented_two) {
+		    incremented_two = TRUE;
+		    if (data->p_is_s[0] == 0) {
+			data->param[0]++;
+			if (termcap_hack)
+			    TPS(stack)[0].data.num = (int) data->param[0];
+		    }
+		    if (data->p_is_s[1] == 0) {
+			data->param[1]++;
+			if (termcap_hack)
+			    TPS(stack)[1].data.num = (int) data->param[1];
+		    }
+		}
+		break;
+
+	    case '?':
+		break;
+
+	    case 't':
+		x = npop(tps);
+		if (!x) {
+		    /* scan forward for %e or %; at level zero */
+		    cp++;
+		    level = 0;
+		    while (*cp) {
+			if (*cp == '%') {
+			    cp++;
+			    if (*cp == '?')
+				level++;
+			    else if (*cp == ';') {
+				if (level > 0)
+				    level--;
+				else
+				    break;
+			    } else if (*cp == 'e' && level == 0)
+				break;
+			}
+
+			if (*cp)
+			    cp++;
+		    }
+		}
+		break;
+
+	    case 'e':
+		/* scan forward for a %; at level zero */
+		cp++;
+		level = 0;
+		while (*cp) {
+		    if (*cp == '%') {
+			cp++;
+			if (*cp == '?')
+			    level++;
+			else if (*cp == ';') {
+			    if (level > 0)
+				level--;
+			    else
+				break;
+			}
+		    }
+
+		    if (*cp)
+			cp++;
+		}
+		break;
+
+	    case ';':
+		break;
+
+	    }			/* endswitch (*cp) */
+	}			/* endelse (*cp == '%') */
+
+	if (*cp == '\0')
+	    break;
+
+	cp++;
+    }				/* endwhile (*cp) */
+
+    get_space(tps, (size_t) 1);
+    TPS(out_buff)[TPS(out_used)] = '\0';
+
+    if (TPS(stack_ptr) && !_nc_tparm_err) {
+	DEBUG(2, ("tparm: stack has %d item%s on return",
+		  TPS(stack_ptr),
+		  TPS(stack_ptr) == 1 ? "" : "s"));
+	_nc_tparm_err++;
+    }
+
+    T((T_RETURN("%s"), _nc_visbuf(TPS(out_buff))));
+    return (TPS(out_buff));
+}
+
+#if NCURSES_TPARM_VARARGS
+
+NCURSES_EXPORT(char *)
+tparm(const char *string, ...)
+{
+    TPARM_STATE *tps = get_tparm_state(cur_term);
+    TPARM_DATA myData;
+    char *result = NULL;
+
+    _nc_tparm_err = 0;
+#ifdef TRACE
+    tps->tname = "tparm";
+#endif /* TRACE */
+
+    if (tparm_setup(cur_term, string, &myData) == OK) {
+	va_list ap;
+
+	va_start(ap, string);
+	tparm_copy_valist(&myData, TRUE, ap);
+	va_end(ap);
+
+	result = tparam_internal(tps, string, &myData);
+    }
+    return result;
+}
+
+#else /* !NCURSES_TPARM_VARARGS */
+
+NCURSES_EXPORT(char *)
+tparm(const char *string,
+      TPARM_ARG a1,
+      TPARM_ARG a2,
+      TPARM_ARG a3,
+      TPARM_ARG a4,
+      TPARM_ARG a5,
+      TPARM_ARG a6,
+      TPARM_ARG a7,
+      TPARM_ARG a8,
+      TPARM_ARG a9)
+{
+    TPARM_STATE *tps = get_tparm_state(cur_term);
+    TPARM_DATA myData;
+    char *result = NULL;
+
+    _nc_tparm_err = 0;
+#ifdef TRACE
+    tps->tname = "tparm";
+#endif /* TRACE */
+
+    if (tparm_setup(cur_term, string, &myData) == OK) {
+
+	myData.param[0] = a1;
+	myData.param[1] = a2;
+	myData.param[2] = a3;
+	myData.param[3] = a4;
+	myData.param[4] = a5;
+	myData.param[5] = a6;
+	myData.param[6] = a7;
+	myData.param[7] = a8;
+	myData.param[8] = a9;
+
+	result = tparam_internal(tps, string, &myData);
+    }
+    return result;
+}
+
+#endif /* NCURSES_TPARM_VARARGS */
+
+NCURSES_EXPORT(char *)
+tiparm(const char *string, ...)
+{
+    TPARM_STATE *tps = get_tparm_state(cur_term);
+    TPARM_DATA myData;
+    char *result = NULL;
+
+    _nc_tparm_err = 0;
+#ifdef TRACE
+    tps->tname = "tiparm";
+#endif /* TRACE */
+
+    if (tparm_setup(cur_term, string, &myData) == OK) {
+	va_list ap;
+
+	va_start(ap, string);
+	tparm_copy_valist(&myData, FALSE, ap);
+	va_end(ap);
+
+	result = tparam_internal(tps, string, &myData);
+    }
+    return result;
+}
+
+/*
+ * The internal-use flavor ensures that the parameters are numbers, not strings
+ */
+NCURSES_EXPORT(char *)
+_nc_tiparm(int expected, const char *string, ...)
+{
+    TPARM_STATE *tps = get_tparm_state(cur_term);
+    TPARM_DATA myData;
+    char *result = NULL;
+
+    _nc_tparm_err = 0;
+#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;
+
+	va_start(ap, string);
+	tparm_copy_valist(&myData, FALSE, ap);
+	va_end(ap);
+
+	result = tparam_internal(tps, string, &myData);
+    }
+    return result;
+}
+
+/*
+ * Improve tic's checks by resetting the terminfo "static variables" before
+ * calling functions which may update them.
+ */
+NCURSES_EXPORT(void)
+_nc_reset_tparm(TERMINAL *term)
+{
+    TPARM_STATE *tps = get_tparm_state(term);
+    memset(TPS(static_vars), 0, sizeof(TPS(static_vars)));
+}
diff --git a/ncurses/tinfo/lib_tputs.c b/ncurses/tinfo/lib_tputs.c
new file mode 100644
index 0000000..0e52a40
--- /dev/null
+++ b/ncurses/tinfo/lib_tputs.c
@@ -0,0 +1,455 @@
+/****************************************************************************
+ * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ *     and: Juergen Pfeifer                         2009                    *
+ ****************************************************************************/
+
+/*
+ *	tputs.c
+ *		delay_output()
+ *		_nc_outch()
+ *		tputs()
+ *
+ */
+
+#include <curses.priv.h>
+
+#ifndef CUR
+#define CUR SP_TERMTYPE
+#endif
+
+#include <ctype.h>
+#include <termcap.h>		/* ospeed */
+#include <tic.h>
+
+MODULE_ID("$Id: lib_tputs.c,v 1.109 2022/07/21 23:26:34 tom Exp $")
+
+NCURSES_EXPORT_VAR(char) PC = 0;              /* used by termcap library */
+NCURSES_EXPORT_VAR(NCURSES_OSPEED) ospeed = 0;        /* used by termcap library */
+
+NCURSES_EXPORT_VAR(int) _nc_nulls_sent = 0;   /* used by 'tack' program */
+
+#if NCURSES_NO_PADDING
+NCURSES_EXPORT(void)
+_nc_set_no_padding(SCREEN *sp)
+{
+    bool no_padding = (getenv("NCURSES_NO_PADDING") != 0);
+
+    if (sp)
+	sp->_no_padding = no_padding;
+    else
+	_nc_prescreen._no_padding = no_padding;
+
+    TR(TRACE_CHARPUT | TRACE_MOVE, ("padding will%s be used",
+				    GetNoPadding(sp) ? " not" : ""));
+}
+#endif
+
+#if NCURSES_SP_FUNCS
+#define SetOutCh(func) if (SP_PARM) SP_PARM->_outch = func; else _nc_prescreen._outch = func
+#define GetOutCh()     (SP_PARM ? SP_PARM->_outch : _nc_prescreen._outch)
+#else
+#define SetOutCh(func) static_outch = func
+#define GetOutCh()     static_outch
+static NCURSES_SP_OUTC static_outch = NCURSES_SP_NAME(_nc_outch);
+#endif
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(delay_output) (NCURSES_SP_DCLx int ms)
+{
+    T((T_CALLED("delay_output(%p,%d)"), (void *) SP_PARM, ms));
+
+    if (!HasTInfoTerminal(SP_PARM))
+	returnCode(ERR);
+
+    if (no_pad_char) {
+	NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_ARG);
+	napms(ms);
+    } else {
+	NCURSES_SP_OUTC my_outch = GetOutCh();
+	register int nullcount;
+
+	nullcount = (ms * _nc_baudrate(ospeed)) / (BAUDBYTE * 1000);
+	for (_nc_nulls_sent += nullcount; nullcount > 0; nullcount--)
+	    my_outch(NCURSES_SP_ARGx PC);
+	if (my_outch == NCURSES_SP_NAME(_nc_outch))
+	    NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_ARG);
+    }
+
+    returnCode(OK);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+delay_output(int ms)
+{
+    return NCURSES_SP_NAME(delay_output) (CURRENT_SCREEN, ms);
+}
+#endif
+
+NCURSES_EXPORT(void)
+NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_DCL0)
+{
+    T((T_CALLED("_nc_flush(%p)"), (void *) SP_PARM));
+    if (SP_PARM != 0 && SP_PARM->_ofd >= 0) {
+	TR(TRACE_CHARPUT, ("ofd:%d inuse:%lu buffer:%p",
+			   SP_PARM->_ofd,
+			   (unsigned long) SP_PARM->out_inuse,
+			   SP_PARM->out_buffer));
+	if (SP_PARM->out_inuse) {
+	    char *buf = SP_PARM->out_buffer;
+	    size_t amount = SP_PARM->out_inuse;
+
+	    TR(TRACE_CHARPUT, ("flushing %ld/%ld bytes",
+			       (unsigned long) amount, _nc_outchars));
+	    while (amount) {
+		ssize_t res = write(SP_PARM->_ofd, buf, amount);
+		if (res > 0) {
+		    /* if the write was incomplete, try again */
+		    amount -= (size_t) res;
+		    buf += res;
+		} else if (errno == EAGAIN) {
+		    continue;
+		} else if (errno == EINTR) {
+		    continue;
+		} else {
+		    break;	/* an error we can not recover from */
+		}
+	    }
+	} else if (SP_PARM->out_buffer == 0) {
+	    TR(TRACE_CHARPUT, ("flushing stdout"));
+	    fflush(stdout);
+	}
+    } else {
+	TR(TRACE_CHARPUT, ("flushing stdout"));
+	fflush(stdout);
+    }
+    if (SP_PARM != 0)
+	SP_PARM->out_inuse = 0;
+    returnVoid;
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(void)
+_nc_flush(void)
+{
+    NCURSES_SP_NAME(_nc_flush) (CURRENT_SCREEN);
+}
+#endif
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(_nc_outch) (NCURSES_SP_DCLx int ch)
+{
+    int rc = OK;
+
+    COUNT_OUTCHARS(1);
+
+    if (HasTInfoTerminal(SP_PARM)
+	&& SP_PARM != 0) {
+	if (SP_PARM->out_buffer != 0) {
+	    if (SP_PARM->out_inuse + 1 >= SP_PARM->out_limit)
+		NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_ARG);
+	    SP_PARM->out_buffer[SP_PARM->out_inuse++] = (char) ch;
+	} else {
+	    char tmp = (char) ch;
+	    /*
+	     * POSIX says write() is safe in a signal handler, but the
+	     * buffered I/O is not.
+	     */
+	    if (write(fileno(NC_OUTPUT(SP_PARM)), &tmp, (size_t) 1) == -1)
+		rc = ERR;
+	}
+    } else {
+	char tmp = (char) ch;
+	if (write(fileno(stdout), &tmp, (size_t) 1) == -1)
+	    rc = ERR;
+    }
+    return rc;
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+_nc_outch(int ch)
+{
+    return NCURSES_SP_NAME(_nc_outch) (CURRENT_SCREEN, ch);
+}
+#endif
+
+/*
+ * This is used for the putp special case.
+ */
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(_nc_putchar) (NCURSES_SP_DCLx int ch)
+{
+    (void) SP_PARM;
+    return putchar(ch);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+_nc_putchar(int ch)
+{
+    return putchar(ch);
+}
+#endif
+
+/*
+ * putp is special - per documentation it calls tputs with putchar as the
+ * parameter for outputting characters.  This means that it uses stdio, which
+ * is not signal-safe.  Applications call this entrypoint; we do not call it
+ * from within the library.
+ */
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(putp) (NCURSES_SP_DCLx const char *string)
+{
+    return NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx
+				   string, 1, NCURSES_SP_NAME(_nc_putchar));
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+putp(const char *string)
+{
+    return NCURSES_SP_NAME(putp) (CURRENT_SCREEN, string);
+}
+#endif
+
+/*
+ * Use these entrypoints rather than "putp" within the library.
+ */
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(_nc_putp) (NCURSES_SP_DCLx
+			   const char *name GCC_UNUSED,
+			   const char *string)
+{
+    int rc = ERR;
+
+    if (string != 0) {
+	TPUTS_TRACE(name);
+	rc = NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx
+				     string, 1, NCURSES_SP_NAME(_nc_outch));
+    }
+    return rc;
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+_nc_putp(const char *name, const char *string)
+{
+    return NCURSES_SP_NAME(_nc_putp) (CURRENT_SCREEN, name, string);
+}
+#endif
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(tputs) (NCURSES_SP_DCLx
+			const char *string,
+			int affcnt,
+			NCURSES_SP_OUTC outc)
+{
+    NCURSES_SP_OUTC my_outch = GetOutCh();
+    bool always_delay = FALSE;
+    bool normal_delay = FALSE;
+    int number;
+#if BSD_TPUTS
+    int trailpad;
+#endif /* BSD_TPUTS */
+
+#ifdef TRACE
+    if (USE_TRACEF(TRACE_TPUTS)) {
+	char addrbuf[32];
+	TR_FUNC_BFR(1);
+
+	if (outc == NCURSES_SP_NAME(_nc_outch)) {
+	    _nc_STRCPY(addrbuf, "_nc_outch", sizeof(addrbuf));
+	} else {
+	    _nc_SPRINTF(addrbuf, _nc_SLIMIT(sizeof(addrbuf)) "%s",
+			TR_FUNC_ARG(0, outc));
+	}
+	if (_nc_tputs_trace) {
+	    _tracef("tputs(%s = %s, %d, %s) called", _nc_tputs_trace,
+		    _nc_visbuf(string), affcnt, addrbuf);
+	} else {
+	    _tracef("tputs(%s, %d, %s) called", _nc_visbuf(string), affcnt, addrbuf);
+	}
+	TPUTS_TRACE(NULL);
+	_nc_unlock_global(tracef);
+    }
+#endif /* TRACE */
+
+    if (!VALID_STRING(string))
+	return ERR;
+
+    if (SP_PARM != 0 && HasTInfoTerminal(SP_PARM)) {
+	if (
+#if NCURSES_SP_FUNCS
+	       (SP_PARM != 0 && SP_PARM->_term == 0)
+#else
+	       cur_term == 0
+#endif
+	    ) {
+	    always_delay = FALSE;
+	    normal_delay = TRUE;
+	} else {
+	    always_delay = (string == bell) || (string == flash_screen);
+	    normal_delay =
+		!xon_xoff
+		&& padding_baud_rate
+#if NCURSES_NO_PADDING
+		&& !GetNoPadding(SP_PARM)
+#endif
+		&& (_nc_baudrate(ospeed) >= padding_baud_rate);
+	}
+    }
+#if BSD_TPUTS
+    /*
+     * This ugly kluge deals with the fact that some ancient BSD programs
+     * (like nethack) actually do the likes of tputs("50") to get delays.
+     */
+    trailpad = 0;
+    if (isdigit(UChar(*string))) {
+	while (isdigit(UChar(*string))) {
+	    trailpad = trailpad * 10 + (*string - '0');
+	    string++;
+	}
+	trailpad *= 10;
+	if (*string == '.') {
+	    string++;
+	    if (isdigit(UChar(*string))) {
+		trailpad += (*string - '0');
+		string++;
+	    }
+	    while (isdigit(UChar(*string)))
+		string++;
+	}
+
+	if (*string == '*') {
+	    trailpad *= affcnt;
+	    string++;
+	}
+    }
+#endif /* BSD_TPUTS */
+
+    SetOutCh(outc);		/* redirect delay_output() */
+    while (*string) {
+	if (*string != '$')
+	    (*outc) (NCURSES_SP_ARGx *string);
+	else {
+	    string++;
+	    if (*string != '<') {
+		(*outc) (NCURSES_SP_ARGx '$');
+		if (*string)
+		    (*outc) (NCURSES_SP_ARGx *string);
+	    } else {
+		bool mandatory;
+
+		string++;
+		if ((!isdigit(UChar(*string)) && *string != '.')
+		    || !strchr(string, '>')) {
+		    (*outc) (NCURSES_SP_ARGx '$');
+		    (*outc) (NCURSES_SP_ARGx '<');
+		    continue;
+		}
+
+		number = 0;
+		while (isdigit(UChar(*string))) {
+		    number = number * 10 + (*string - '0');
+		    string++;
+		}
+		number *= 10;
+		if (*string == '.') {
+		    string++;
+		    if (isdigit(UChar(*string))) {
+			number += (*string - '0');
+			string++;
+		    }
+		    while (isdigit(UChar(*string)))
+			string++;
+		}
+
+		mandatory = FALSE;
+		while (*string == '*' || *string == '/') {
+		    if (*string == '*') {
+			number *= affcnt;
+			string++;
+		    } else {	/* if (*string == '/') */
+			mandatory = TRUE;
+			string++;
+		    }
+		}
+
+		if (number > 0
+		    && (always_delay
+			|| normal_delay
+			|| mandatory))
+		    NCURSES_SP_NAME(delay_output) (NCURSES_SP_ARGx number / 10);
+
+	    }			/* endelse (*string == '<') */
+	}			/* endelse (*string == '$') */
+
+	if (*string == '\0')
+	    break;
+
+	string++;
+    }
+
+#if BSD_TPUTS
+    /*
+     * Emit any BSD-style prefix padding that we've accumulated now.
+     */
+    if (trailpad > 0
+	&& (always_delay || normal_delay))
+	NCURSES_SP_NAME(delay_output) (NCURSES_SP_ARGx trailpad / 10);
+#endif /* BSD_TPUTS */
+
+    SetOutCh(my_outch);
+    return OK;
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+_nc_outc_wrapper(SCREEN *sp, int c)
+{
+    if (0 == sp) {
+	return fputc(c, stdout);
+    } else {
+	return sp->jump(c);
+    }
+}
+
+NCURSES_EXPORT(int)
+tputs(const char *string, int affcnt, int (*outc) (int))
+{
+    SetSafeOutcWrapper(outc);
+    return NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx string, affcnt, _nc_outc_wrapper);
+}
+#endif
diff --git a/ncurses/tinfo/lib_ttyflags.c b/ncurses/tinfo/lib_ttyflags.c
new file mode 100644
index 0000000..6363a80
--- /dev/null
+++ b/ncurses/tinfo/lib_ttyflags.c
@@ -0,0 +1,330 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/*
+ *		def_prog_mode()
+ *		def_shell_mode()
+ *		reset_prog_mode()
+ *		reset_shell_mode()
+ *		savetty()
+ *		resetty()
+ */
+
+#include <curses.priv.h>
+
+#ifndef CUR
+#define CUR SP_TERMTYPE
+#endif
+
+MODULE_ID("$Id: lib_ttyflags.c,v 1.36 2020/09/05 22:54:47 tom Exp $")
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(_nc_get_tty_mode) (NCURSES_SP_DCLx TTY * buf)
+{
+    TERMINAL *termp = TerminalOf(SP_PARM);
+    int result = OK;
+
+    if (buf == 0 || termp == 0) {
+	result = ERR;
+    } else {
+
+#ifdef USE_TERM_DRIVER
+	if (SP_PARM != 0) {
+	    result = CallDriver_2(SP_PARM, td_sgmode, FALSE, buf);
+	} else {
+	    result = ERR;
+	}
+#else
+	for (;;) {
+	    if (GET_TTY(termp->Filedes, buf) != 0) {
+		if (errno == EINTR)
+		    continue;
+		result = ERR;
+	    }
+	    break;
+	}
+#endif
+
+	TR(TRACE_BITS, ("_nc_get_tty_mode(%d): %s",
+			termp ? termp->Filedes : -1,
+			_nc_trace_ttymode(buf)));
+    }
+    if (result == ERR && buf != 0)
+	memset(buf, 0, sizeof(*buf));
+
+    return (result);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+_nc_get_tty_mode(TTY * buf)
+{
+    return NCURSES_SP_NAME(_nc_get_tty_mode) (CURRENT_SCREEN, buf);
+}
+#endif
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_DCLx TTY * buf)
+{
+    int result = OK;
+
+    if (buf == 0 || SP_PARM == 0) {
+	result = ERR;
+    } else {
+	TERMINAL *termp = TerminalOf(SP_PARM);
+
+	if (0 == termp) {
+	    result = ERR;
+	} else {
+#ifdef USE_TERM_DRIVER
+	    result = CallDriver_2(SP_PARM, td_sgmode, TRUE, buf);
+#else
+	    for (;;) {
+		if ((SET_TTY(termp->Filedes, buf) != 0)
+#if USE_KLIBC_KBD
+		    && !NC_ISATTY(termp->Filedes)
+#endif
+		    ) {
+		    if (errno == EINTR)
+			continue;
+		    if ((errno == ENOTTY) && (SP_PARM != 0))
+			SP_PARM->_notty = TRUE;
+		    result = ERR;
+		}
+		break;
+	    }
+#endif
+	}
+	TR(TRACE_BITS, ("_nc_set_tty_mode(%d): %s",
+			termp ? termp->Filedes : -1,
+			_nc_trace_ttymode(buf)));
+    }
+    return (result);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+_nc_set_tty_mode(TTY * buf)
+{
+    return NCURSES_SP_NAME(_nc_set_tty_mode) (CURRENT_SCREEN, buf);
+}
+#endif
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(def_shell_mode) (NCURSES_SP_DCL0)
+{
+    int rc = ERR;
+    TERMINAL *termp = TerminalOf(SP_PARM);
+
+    T((T_CALLED("def_shell_mode(%p) ->term %p"),
+       (void *) SP_PARM, (void *) termp));
+
+    if (termp != 0) {
+#ifdef USE_TERM_DRIVER
+	rc = CallDriver_2(SP_PARM, td_mode, FALSE, TRUE);
+#else
+	/*
+	 * If XTABS was on, remove the tab and backtab capabilities.
+	 */
+	if (_nc_get_tty_mode(&termp->Ottyb) == OK) {
+#ifdef TERMIOS
+	    if (termp->Ottyb.c_oflag & OFLAGS_TABS)
+		tab = back_tab = NULL;
+#elif defined(EXP_WIN32_DRIVER)
+	    /* noop */
+#else
+	    if (termp->Ottyb.sg_flags & XTABS)
+		tab = back_tab = NULL;
+#endif
+	    rc = OK;
+	}
+#endif
+    }
+    returnCode(rc);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+def_shell_mode(void)
+{
+    return NCURSES_SP_NAME(def_shell_mode) (CURRENT_SCREEN);
+}
+#endif
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(def_prog_mode) (NCURSES_SP_DCL0)
+{
+    int rc = ERR;
+    TERMINAL *termp = TerminalOf(SP_PARM);
+
+    T((T_CALLED("def_prog_mode(%p) ->term %p"), (void *) SP_PARM, (void *) termp));
+
+    if (termp != 0) {
+#ifdef USE_TERM_DRIVER
+	rc = CallDriver_2(SP_PARM, td_mode, TRUE, TRUE);
+#else
+	/*
+	 * Turn off the XTABS bit in the tty structure if it was on.
+	 */
+	if (_nc_get_tty_mode(&termp->Nttyb) == OK) {
+#ifdef TERMIOS
+	    termp->Nttyb.c_oflag &= (unsigned) (~OFLAGS_TABS);
+#elif defined(EXP_WIN32_DRIVER)
+	    /* noop */
+#else
+	    termp->Nttyb.sg_flags &= (unsigned) (~XTABS);
+#endif
+	    rc = OK;
+	}
+#endif
+    }
+    returnCode(rc);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+def_prog_mode(void)
+{
+    return NCURSES_SP_NAME(def_prog_mode) (CURRENT_SCREEN);
+}
+#endif
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(reset_prog_mode) (NCURSES_SP_DCL0)
+{
+    int rc = ERR;
+    TERMINAL *termp = TerminalOf(SP_PARM);
+
+    T((T_CALLED("reset_prog_mode(%p) ->term %p"), (void *) SP_PARM, (void *) termp));
+
+    if (termp != 0) {
+#ifdef USE_TERM_DRIVER
+	rc = CallDriver_2(SP_PARM, td_mode, TRUE, FALSE);
+#else
+	if (_nc_set_tty_mode(&termp->Nttyb) == OK) {
+	    if (SP_PARM) {
+		if (SP_PARM->_keypad_on)
+		    _nc_keypad(SP_PARM, TRUE);
+	    }
+	    rc = OK;
+	}
+#endif
+    }
+    returnCode(rc);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+reset_prog_mode(void)
+{
+    return NCURSES_SP_NAME(reset_prog_mode) (CURRENT_SCREEN);
+}
+#endif
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(reset_shell_mode) (NCURSES_SP_DCL0)
+{
+    int rc = ERR;
+    TERMINAL *termp = TerminalOf(SP_PARM);
+
+    T((T_CALLED("reset_shell_mode(%p) ->term %p"),
+       (void *) SP_PARM, (void *) termp));
+
+    if (termp != 0) {
+#ifdef USE_TERM_DRIVER
+	rc = CallDriver_2(SP_PARM, td_mode, FALSE, FALSE);
+#else
+	if (SP_PARM) {
+	    _nc_keypad(SP_PARM, FALSE);
+	    _nc_flush();
+	}
+	rc = _nc_set_tty_mode(&termp->Ottyb);
+#endif
+    }
+    returnCode(rc);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+reset_shell_mode(void)
+{
+    return NCURSES_SP_NAME(reset_shell_mode) (CURRENT_SCREEN);
+}
+#endif
+
+static TTY *
+saved_tty(NCURSES_SP_DCL0)
+{
+    TTY *result = 0;
+
+    if (SP_PARM != 0) {
+	result = (TTY *) & (SP_PARM->_saved_tty);
+    } else {
+	if (_nc_prescreen.saved_tty == 0) {
+	    _nc_prescreen.saved_tty = typeCalloc(TTY, 1);
+	}
+	result = _nc_prescreen.saved_tty;
+    }
+    return result;
+}
+
+/*
+**	savetty()  and  resetty()
+**
+*/
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(savetty) (NCURSES_SP_DCL0)
+{
+    T((T_CALLED("savetty(%p)"), (void *) SP_PARM));
+    returnCode(NCURSES_SP_NAME(_nc_get_tty_mode) (NCURSES_SP_ARGx saved_tty(NCURSES_SP_ARG)));
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+savetty(void)
+{
+    return NCURSES_SP_NAME(savetty) (CURRENT_SCREEN);
+}
+#endif
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(resetty) (NCURSES_SP_DCL0)
+{
+    T((T_CALLED("resetty(%p)"), (void *) SP_PARM));
+    returnCode(NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx saved_tty(NCURSES_SP_ARG)));
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+resetty(void)
+{
+    return NCURSES_SP_NAME(resetty) (CURRENT_SCREEN);
+}
+#endif
diff --git a/ncurses/tinfo/lib_win32con.c b/ncurses/tinfo/lib_win32con.c
new file mode 100644
index 0000000..2bcea39
--- /dev/null
+++ b/ncurses/tinfo/lib_win32con.c
@@ -0,0 +1,1256 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2009,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Juergen Pfeifer                                                 *
+ *     and: Thomas E. Dickey                                                *
+ ****************************************************************************/
+
+/*
+ * TODO - GetMousePos(POINT * result) from ntconio.c
+ */
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_win32con.c,v 1.7 2021/09/04 10:54:35 tom Exp $")
+
+#ifdef _NC_WINDOWS
+
+#ifdef _NC_MINGW
+#include <wchar.h>
+#else
+#include <tchar.h>
+#endif
+
+#include <io.h>
+
+#if USE_WIDEC_SUPPORT
+#define write_screen WriteConsoleOutputW
+#define read_screen  ReadConsoleOutputW
+#else
+#define write_screen WriteConsoleOutput
+#define read_screen  ReadConsoleOutput
+#endif
+
+static BOOL IsConsoleHandle(HANDLE hdl);
+static bool save_original_screen(void);
+static bool restore_original_screen(void) GCC_UNUSED;
+static bool read_screen_data(void);
+static int  Adjust(int milliseconds, int diff);
+static int  decode_mouse(SCREEN *sp, int mask);
+static bool handle_mouse(SCREEN *sp, MOUSE_EVENT_RECORD mer);
+static int  rkeycompare(const void *el1, const void *el2);
+static int  keycompare(const void *el1, const void *el2);
+static int  MapKey(WORD vKey);
+static int  AnsiKey(WORD vKey);
+
+static ULONGLONG tdiff(FILETIME fstart, FILETIME fend);
+
+#define GenMap(vKey,key) MAKELONG(key, vKey)
+static const LONG keylist[] =
+{
+    GenMap(VK_PRIOR, KEY_PPAGE),
+    GenMap(VK_NEXT, KEY_NPAGE),
+    GenMap(VK_END, KEY_END),
+    GenMap(VK_HOME, KEY_HOME),
+    GenMap(VK_LEFT, KEY_LEFT),
+    GenMap(VK_UP, KEY_UP),
+    GenMap(VK_RIGHT, KEY_RIGHT),
+    GenMap(VK_DOWN, KEY_DOWN),
+    GenMap(VK_DELETE, KEY_DC),
+    GenMap(VK_INSERT, KEY_IC)
+};
+static const LONG ansi_keys[] =
+{
+    GenMap(VK_PRIOR, 'I'),
+    GenMap(VK_NEXT, 'Q'),
+    GenMap(VK_END, 'O'),
+    GenMap(VK_HOME, 'H'),
+    GenMap(VK_LEFT, 'K'),
+    GenMap(VK_UP, 'H'),
+    GenMap(VK_RIGHT, 'M'),
+    GenMap(VK_DOWN, 'P'),
+    GenMap(VK_DELETE, 'S'),
+    GenMap(VK_INSERT, 'R')
+};
+#define array_length(a) (sizeof(a)/sizeof(a[0]))
+#define N_INI ((int)array_length(keylist))
+#define FKEYS 24
+#define MAPSIZE (FKEYS + N_INI)
+
+/*   A process can only have a single console, so it is safe
+     to maintain all the information about it in a single
+     static structure.
+ */
+NCURSES_EXPORT_VAR(ConsoleInfo) _nc_CONSOLE;
+static bool console_initialized = FALSE;
+
+#define EnsureInit() (void)(console_initialized ? TRUE : _nc_console_checkinit(TRUE, TRUE))
+
+#define REQUIRED_MAX_V (DWORD)10
+#define REQUIRED_MIN_V (DWORD)0
+#define REQUIRED_BUILD (DWORD)17763
+/*
+  This function returns 0 if the Windows version has no support for
+  the modern Console interface, otherwise it returns 1
+ */
+NCURSES_EXPORT(int)
+_nc_console_vt_supported(void)
+{
+    OSVERSIONINFO osvi;
+    int res = 0;
+
+    T((T_CALLED("lib_win32con::_nc_console_vt_supported")));
+    ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
+    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+
+    GetVersionEx(&osvi);
+    T(("GetVersionEx returnedMajor=%ld, Minor=%ld, Build=%ld",
+       osvi.dwMajorVersion,
+       osvi.dwMinorVersion,
+       osvi.dwBuildNumber));
+    if (osvi.dwMajorVersion >= REQUIRED_MAX_V) {
+      if (osvi.dwMajorVersion == REQUIRED_MAX_V) {
+          if (((osvi.dwMinorVersion == REQUIRED_MIN_V) &&
+               (osvi.dwBuildNumber >= REQUIRED_BUILD)) ||
+              ((osvi.dwMinorVersion > REQUIRED_MIN_V)))
+              res = 1;
+      } else
+          res = 1;
+    }
+    returnCode(res);
+}
+
+NCURSES_EXPORT(void)
+_nc_console_size(int* Lines, int* Cols)
+{
+  EnsureInit();
+  if (Lines != NULL && Cols != NULL) {
+      if (WINCONSOLE.buffered) {
+          *Lines = (int) (WINCONSOLE.SBI.dwSize.Y);
+          *Cols = (int) (WINCONSOLE.SBI.dwSize.X);
+      } else {
+          *Lines = (int) (WINCONSOLE.SBI.srWindow.Bottom + 1 -
+                          WINCONSOLE.SBI.srWindow.Top);
+          *Cols = (int) (WINCONSOLE.SBI.srWindow.Right + 1 -
+                         WINCONSOLE.SBI.srWindow.Left);
+      }
+  }
+}
+
+/* Convert a file descriptor into a HANDLE
+   That's not necessarily a console HANDLE
+*/
+NCURSES_EXPORT(HANDLE)
+_nc_console_handle(int fd)
+{
+    intptr_t value = _get_osfhandle(fd);
+    return (HANDLE) value;
+}
+
+/* Validate that a HANDLE is actually a
+   console HANDLE
+*/
+static BOOL
+IsConsoleHandle(HANDLE hdl)
+{
+    DWORD dwFlag = 0;
+    BOOL result = FALSE;
+
+    T((T_CALLED("lib_win32con::IsConsoleHandle(HANDLE=%p"), hdl));
+
+    EnsureInit();
+
+    if (!GetConsoleMode(hdl, &dwFlag)) {
+        T(("GetConsoleMode failed"));
+    } else {
+        result = TRUE;
+    }
+
+    returnBool(result);
+}
+
+/*   This is used when running in terminfo mode to discover,
+     whether or not the "terminal" is actually a Windows
+     Console. It is the responsibility of the console to deal
+     with the terminal escape sequences that are sent by
+     terminfo.
+ */
+NCURSES_EXPORT(int)
+_nc_console_test(int fd)
+{
+    int code = 0;
+    HANDLE hdl = INVALID_HANDLE_VALUE;
+    T((T_CALLED("lib_win32con::_nc_console_test(%d)"), fd));
+    hdl = _nc_console_handle(fd);
+    code = (int) IsConsoleHandle(hdl);
+    returnCode(code);
+}
+
+#define OutHandle() ((WINCONSOLE.isTermInfoConsole || WINCONSOLE.progMode) ? WINCONSOLE.hdl : WINCONSOLE.out)
+
+NCURSES_EXPORT(void)
+_nc_console_selectActiveHandle(void)
+{
+    if (WINCONSOLE.lastOut != WINCONSOLE.hdl) {
+        WINCONSOLE.lastOut = WINCONSOLE.hdl;
+        SetConsoleActiveScreenBuffer(WINCONSOLE.lastOut);
+    }
+}
+
+NCURSES_EXPORT(HANDLE)
+_nc_console_fd2handle(int fd)
+{
+    HANDLE hdl = _nc_console_handle(fd);
+    if (hdl==WINCONSOLE.inp) {
+        T(("lib_win32con:validateHandle %d -> WINCONSOLE.inp", fd));
+    } else if (hdl==WINCONSOLE.hdl) {
+        T(("lib_win32con:validateHandle %d -> WINCONSOLE.hdl", fd));
+    } else if (hdl==WINCONSOLE.out) {
+        T(("lib_win32con:validateHandle %d -> WINCONSOLE.out", fd));
+    } else {
+        T(("lib_win32con:validateHandle %d maps to unknown HANDLE", fd));
+        hdl = INVALID_HANDLE_VALUE;
+    }
+#if 1
+    assert(hdl != INVALID_HANDLE_VALUE);
+#endif
+    if (hdl != INVALID_HANDLE_VALUE) {
+        if (hdl != WINCONSOLE.inp && (!WINCONSOLE.isTermInfoConsole && WINCONSOLE.progMode)) {
+            if (hdl==WINCONSOLE.out && hdl!=WINCONSOLE.hdl) {
+                T(("lib_win32con:validateHandle forcing WINCONSOLE.out -> WINCONSOLE.hdl"));
+                hdl = WINCONSOLE.hdl;
+            }
+        }
+    }
+    return hdl;
+}
+
+NCURSES_EXPORT(int)
+_nc_console_setmode(HANDLE hdl, const TTY *arg)
+{
+    DWORD dwFlag = 0;
+    int code = ERR;
+    HANDLE alt;
+
+    if (arg) {
+#ifdef TRACE
+        TTY TRCTTY;
+#define TRCTTYOUT(flag) TRCTTY.dwFlagOut = flag
+#define TRCTTYIN(flag)  TRCTTY.dwFlagIn = flag
+#else
+#define TRCTTYOUT(flag)
+#define TRCTTYIN(flag)
+#endif
+        T(("lib_win32con:_nc_console_setmode %s", _nc_trace_ttymode(arg)));
+        if (hdl==WINCONSOLE.inp) {
+            dwFlag = arg->dwFlagIn | ENABLE_MOUSE_INPUT | VT_FLAG_IN;
+            if (WINCONSOLE.isTermInfoConsole)
+                dwFlag |= (VT_FLAG_IN);
+            else
+                dwFlag &= (DWORD) ~(VT_FLAG_IN);
+            TRCTTYIN(dwFlag);
+            SetConsoleMode(hdl, dwFlag);
+
+            alt = OutHandle();
+            dwFlag = arg->dwFlagOut;
+            if (WINCONSOLE.isTermInfoConsole)
+                dwFlag |= (VT_FLAG_OUT);
+            else
+                dwFlag |= (VT_FLAG_OUT);
+            TRCTTYOUT(dwFlag);
+            SetConsoleMode(alt, dwFlag);
+        } else {
+            dwFlag = arg->dwFlagOut;
+            if (WINCONSOLE.isTermInfoConsole)
+                dwFlag |= (VT_FLAG_OUT);
+            else
+                dwFlag |= (VT_FLAG_OUT);
+            TRCTTYOUT(dwFlag);
+            SetConsoleMode(hdl, dwFlag);
+
+            alt = WINCONSOLE.inp;
+            dwFlag = arg->dwFlagIn | ENABLE_MOUSE_INPUT;
+            if (WINCONSOLE.isTermInfoConsole)
+                dwFlag |= (VT_FLAG_IN);
+            else
+                dwFlag &= (DWORD) ~(VT_FLAG_IN);
+            TRCTTYIN(dwFlag);
+            SetConsoleMode(alt, dwFlag);
+            T(("effective mode set %s", _nc_trace_ttymode(&TRCTTY)));
+        }
+        code = OK;
+    }
+    return(code);
+}
+
+NCURSES_EXPORT(int)
+_nc_console_getmode(HANDLE hdl, TTY *arg)
+{
+    int code = ERR;
+
+    if (arg) {
+        DWORD dwFlag = 0;
+        HANDLE alt;
+
+        if (hdl==WINCONSOLE.inp) {
+            if(GetConsoleMode(hdl, &dwFlag)) {
+                arg->dwFlagIn = dwFlag;
+                alt = OutHandle();
+                if (GetConsoleMode(alt, &dwFlag)) {
+                    arg->dwFlagOut = dwFlag;
+                    code = OK;
+                }
+            }
+        } else {
+            if (GetConsoleMode(hdl, &dwFlag)) {
+                arg->dwFlagOut = dwFlag;
+                alt = WINCONSOLE.inp;
+                if (GetConsoleMode(alt, &dwFlag)) {
+                    arg->dwFlagIn = dwFlag;
+                    code = OK;
+                }
+            }
+        }
+    }
+    T(("lib_win32con:_nc_console_getmode %s", _nc_trace_ttymode(arg)));
+    return(code);
+}
+
+NCURSES_EXPORT(int)
+_nc_console_flush(HANDLE hdl)
+{
+    int code = OK;
+
+    T((T_CALLED("lib_win32con::_nc_console_flush(hdl=%p"), hdl));
+
+    if (hdl != INVALID_HANDLE_VALUE) {
+        if (hdl == WINCONSOLE.hdl ||
+            hdl == WINCONSOLE.inp ||
+            hdl == WINCONSOLE.out) {
+            if (!FlushConsoleInputBuffer(WINCONSOLE.inp))
+                code = ERR;
+        } else {
+            code = ERR;
+            T(("_nc_console_flush not requesting a handle owned by console."));
+        }
+    }
+    returnCode(code);
+}
+
+NCURSES_EXPORT(WORD)
+_nc_console_MapColor(bool fore, int color)
+{
+    static const int _cmap[] =
+        {0, 4, 2, 6, 1, 5, 3, 7};
+    int a;
+    if (color < 0 || color > 7)
+        a = fore ? 7 : 0;
+    else
+        a = _cmap[color];
+    if (!fore)
+        a = a << 4;
+    return (WORD) a;
+}
+
+
+/*
+ * Attempt to save the screen contents.  PDCurses does this if
+ * PDC_RESTORE_SCREEN is set, giving the same visual appearance on
+ * restoration as if the library had allocated a console buffer.  MSDN
+ * says that the data which can be read is limited to 64Kb (and may be
+ * less).
+ */
+static bool
+save_original_screen(void)
+{
+    bool result = FALSE;
+
+    WINCONSOLE.save_region.Top = 0;
+    WINCONSOLE.save_region.Left = 0;
+    WINCONSOLE.save_region.Bottom = (SHORT) (WINCONSOLE.SBI.dwSize.Y - 1);
+    WINCONSOLE.save_region.Right = (SHORT) (WINCONSOLE.SBI.dwSize.X - 1);
+
+    if (read_screen_data()) {
+        result = TRUE;
+    } else {
+
+        WINCONSOLE.save_region.Top = WINCONSOLE.SBI.srWindow.Top;
+        WINCONSOLE.save_region.Left = WINCONSOLE.SBI.srWindow.Left;
+        WINCONSOLE.save_region.Bottom = WINCONSOLE.SBI.srWindow.Bottom;
+        WINCONSOLE.save_region.Right = WINCONSOLE.SBI.srWindow.Right;
+
+        WINCONSOLE.window_only = TRUE;
+
+        if (read_screen_data()) {
+            result = TRUE;
+        }
+    }
+
+    T(("... save original screen contents %s", result ? "ok" : "err"));
+    return result;
+}
+
+static bool
+restore_original_screen(void)
+{
+    COORD bufferCoord;
+    bool result = FALSE;
+    SMALL_RECT save_region = WINCONSOLE.save_region;
+
+    T(("... restoring %s",
+       WINCONSOLE.window_only ? "window" : "entire buffer"));
+
+    bufferCoord.X = (SHORT) (WINCONSOLE.window_only ?
+                             WINCONSOLE.SBI.srWindow.Left : 0);
+    bufferCoord.Y = (SHORT) (WINCONSOLE.window_only ?
+                             WINCONSOLE.SBI.srWindow.Top : 0);
+
+    if (write_screen(WINCONSOLE.hdl,
+                     WINCONSOLE.save_screen,
+                     WINCONSOLE.save_size,
+                     bufferCoord,
+                     &save_region)) {
+        result = TRUE;
+        mvcur(-1, -1, LINES - 2, 0);
+        T(("... restore original screen contents ok %dx%d (%d,%d - %d,%d)",
+           WINCONSOLE.save_size.Y,
+           WINCONSOLE.save_size.X,
+           save_region.Top,
+           save_region.Left,
+           save_region.Bottom,
+           save_region.Right));
+    } else {
+        T(("... restore original screen contents err"));
+    }
+    return result;
+}
+
+static bool
+read_screen_data(void)
+{
+    bool result = FALSE;
+    COORD bufferCoord;
+    size_t want;
+
+    WINCONSOLE.save_size.X = (SHORT) (WINCONSOLE.save_region.Right
+                                      - WINCONSOLE.save_region.Left + 1);
+    WINCONSOLE.save_size.Y = (SHORT) (WINCONSOLE.save_region.Bottom
+                                      - WINCONSOLE.save_region.Top + 1);
+
+    want = (size_t) (WINCONSOLE.save_size.X * WINCONSOLE.save_size.Y);
+
+    if ((WINCONSOLE.save_screen = malloc(want * sizeof(CHAR_INFO))) != 0) {
+        bufferCoord.X = (SHORT) (WINCONSOLE.window_only ?
+                                 WINCONSOLE.SBI.srWindow.Left : 0);
+        bufferCoord.Y = (SHORT) (WINCONSOLE.window_only ?
+                                 WINCONSOLE.SBI.srWindow.Top : 0);
+
+        T(("... reading console %s %dx%d into %d,%d - %d,%d at %d,%d",
+           WINCONSOLE.window_only ? "window" : "buffer",
+           WINCONSOLE.save_size.Y, WINCONSOLE.save_size.X,
+           WINCONSOLE.save_region.Top,
+           WINCONSOLE.save_region.Left,
+           WINCONSOLE.save_region.Bottom,
+           WINCONSOLE.save_region.Right,
+           bufferCoord.Y,
+           bufferCoord.X));
+
+        if (read_screen(WINCONSOLE.hdl,
+                        WINCONSOLE.save_screen,
+                        WINCONSOLE.save_size,
+                        bufferCoord,
+                        &WINCONSOLE.save_region)) {
+            result = TRUE;
+        } else {
+            T((" error %#lx", (unsigned long) GetLastError()));
+            FreeAndNull(WINCONSOLE.save_screen);
+        }
+    }
+
+    return result;
+}
+
+NCURSES_EXPORT(bool)
+_nc_console_get_SBI(void)
+{
+    bool rc = FALSE;
+    if (GetConsoleScreenBufferInfo(WINCONSOLE.hdl, &(WINCONSOLE.SBI))) {
+        T(("GetConsoleScreenBufferInfo"));
+        T(("... buffer(X:%d Y:%d)",
+           WINCONSOLE.SBI.dwSize.X,
+           WINCONSOLE.SBI.dwSize.Y));
+        T(("... window(X:%d Y:%d)",
+           WINCONSOLE.SBI.dwMaximumWindowSize.X,
+           WINCONSOLE.SBI.dwMaximumWindowSize.Y));
+        T(("... cursor(X:%d Y:%d)",
+           WINCONSOLE.SBI.dwCursorPosition.X,
+           WINCONSOLE.SBI.dwCursorPosition.Y));
+        T(("... display(Top:%d Bottom:%d Left:%d Right:%d)",
+           WINCONSOLE.SBI.srWindow.Top,
+           WINCONSOLE.SBI.srWindow.Bottom,
+           WINCONSOLE.SBI.srWindow.Left,
+           WINCONSOLE.SBI.srWindow.Right));
+        if (WINCONSOLE.buffered) {
+            WINCONSOLE.origin.X = 0;
+            WINCONSOLE.origin.Y = 0;
+        } else {
+            WINCONSOLE.origin.X = WINCONSOLE.SBI.srWindow.Left;
+            WINCONSOLE.origin.Y = WINCONSOLE.SBI.srWindow.Top;
+        }
+        rc = TRUE;
+    } else {
+        T(("GetConsoleScreenBufferInfo ERR"));
+    }
+    return rc;
+}
+
+#define MIN_WIDE 80
+#define MIN_HIGH 24
+
+/*
+ * In "normal" mode, reset the buffer- and window-sizes back to their original values.
+ */
+NCURSES_EXPORT(void)
+_nc_console_set_scrollback(bool normal, CONSOLE_SCREEN_BUFFER_INFO * info)
+{
+    SMALL_RECT rect;
+    COORD coord;
+    bool changed = FALSE;
+
+    T((T_CALLED("lib_win32con::_nc_console_set_scrollback(%s)"),
+       (normal
+        ? "normal"
+        : "application")));
+
+    T(("... SBI.srWindow %d,%d .. %d,%d",
+       info->srWindow.Top,
+       info->srWindow.Left,
+       info->srWindow.Bottom,
+       info->srWindow.Right));
+    T(("... SBI.dwSize %dx%d",
+       info->dwSize.Y,
+       info->dwSize.X));
+
+    if (normal) {
+        rect = info->srWindow;
+        coord = info->dwSize;
+        if (memcmp(info, &WINCONSOLE.SBI, sizeof(*info)) != 0) {
+            changed = TRUE;
+            WINCONSOLE.SBI = *info;
+        }
+    } else {
+        int high = info->srWindow.Bottom - info->srWindow.Top + 1;
+        int wide = info->srWindow.Right - info->srWindow.Left + 1;
+
+        if (high < MIN_HIGH) {
+            T(("... height %d < %d", high, MIN_HIGH));
+            high = MIN_HIGH;
+            changed = TRUE;
+        }
+        if (wide < MIN_WIDE) {
+            T(("... width %d < %d", wide, MIN_WIDE));
+            wide = MIN_WIDE;
+            changed = TRUE;
+        }
+
+        rect.Left =
+            rect.Top = 0;
+        rect.Right = (SHORT) (wide - 1);
+        rect.Bottom = (SHORT) (high - 1);
+
+        coord.X = (SHORT) wide;
+        coord.Y = (SHORT) high;
+
+        if (info->dwSize.Y != high ||
+            info->dwSize.X != wide ||
+            info->srWindow.Top != 0 ||
+            info->srWindow.Left != 0) {
+            changed = TRUE;
+        }
+
+    }
+
+    if (changed) {
+        T(("... coord %d,%d", coord.Y, coord.X));
+        T(("... rect %d,%d - %d,%d",
+           rect.Top, rect.Left,
+           rect.Bottom, rect.Right));
+        SetConsoleScreenBufferSize(WINCONSOLE.hdl, coord);      /* dwSize */
+        SetConsoleWindowInfo(WINCONSOLE.hdl, TRUE, &rect);      /* srWindow */
+        _nc_console_get_SBI();
+    }
+    returnVoid;
+}
+
+static ULONGLONG
+tdiff(FILETIME fstart, FILETIME fend)
+{
+    ULARGE_INTEGER ustart;
+    ULARGE_INTEGER uend;
+    ULONGLONG diff;
+
+    ustart.LowPart = fstart.dwLowDateTime;
+    ustart.HighPart = fstart.dwHighDateTime;
+    uend.LowPart = fend.dwLowDateTime;
+    uend.HighPart = fend.dwHighDateTime;
+
+    diff = (uend.QuadPart - ustart.QuadPart) / 10000;
+    return diff;
+}
+
+static int
+Adjust(int milliseconds, int diff)
+{
+    if (milliseconds != INFINITY) {
+        milliseconds -= diff;
+        if (milliseconds < 0)
+            milliseconds = 0;
+    }
+    return milliseconds;
+}
+
+#define BUTTON_MASK (FROM_LEFT_1ST_BUTTON_PRESSED | \
+                     FROM_LEFT_2ND_BUTTON_PRESSED | \
+                     FROM_LEFT_3RD_BUTTON_PRESSED | \
+                     FROM_LEFT_4TH_BUTTON_PRESSED | \
+                     RIGHTMOST_BUTTON_PRESSED)
+
+static int
+decode_mouse(SCREEN *sp, int mask)
+{
+    int result = 0;
+
+    (void) sp;
+    assert(sp && console_initialized);
+
+    if (mask & FROM_LEFT_1ST_BUTTON_PRESSED)
+        result |= BUTTON1_PRESSED;
+    if (mask & FROM_LEFT_2ND_BUTTON_PRESSED)
+        result |= BUTTON2_PRESSED;
+    if (mask & FROM_LEFT_3RD_BUTTON_PRESSED)
+        result |= BUTTON3_PRESSED;
+    if (mask & FROM_LEFT_4TH_BUTTON_PRESSED)
+        result |= BUTTON4_PRESSED;
+
+    if (mask & RIGHTMOST_BUTTON_PRESSED) {
+        switch (WINCONSOLE.numButtons) {
+        case 1:
+            result |= BUTTON1_PRESSED;
+            break;
+        case 2:
+            result |= BUTTON2_PRESSED;
+            break;
+        case 3:
+            result |= BUTTON3_PRESSED;
+            break;
+        case 4:
+            result |= BUTTON4_PRESSED;
+            break;
+        }
+    }
+
+    return result;
+}
+
+#define AdjustY() (WINCONSOLE.buffered ? 0 : (int) WINCONSOLE.SBI.srWindow.Top)
+
+static bool
+handle_mouse(SCREEN *sp, MOUSE_EVENT_RECORD mer)
+{
+    MEVENT work;
+    bool result = FALSE;
+
+    assert(sp);
+
+    sp->_drv_mouse_old_buttons = sp->_drv_mouse_new_buttons;
+    sp->_drv_mouse_new_buttons = mer.dwButtonState & BUTTON_MASK;
+
+    /*
+     * We're only interested if the button is pressed or released.
+     * FIXME: implement continuous event-tracking.
+     */
+    if (sp->_drv_mouse_new_buttons != sp->_drv_mouse_old_buttons) {
+        memset(&work, 0, sizeof(work));
+
+        if (sp->_drv_mouse_new_buttons) {
+            work.bstate |=
+                (mmask_t) decode_mouse(sp,
+                                       sp->_drv_mouse_new_buttons);
+        } else {
+            /* cf: BUTTON_PRESSED, BUTTON_RELEASED */
+            work.bstate |=
+                (mmask_t) (decode_mouse(sp,
+                                        sp->_drv_mouse_old_buttons)
+                           >> 1);
+            result = TRUE;
+        }
+
+        work.x = mer.dwMousePosition.X;
+        work.y = mer.dwMousePosition.Y - AdjustY();
+
+        sp->_drv_mouse_fifo[sp->_drv_mouse_tail] = work;
+        sp->_drv_mouse_tail += 1;
+    }
+    return result;
+}
+
+static int
+rkeycompare(const void *el1, const void *el2)
+{
+    WORD key1 = (LOWORD((*((const LONG *) el1)))) & 0x7fff;
+    WORD key2 = (LOWORD((*((const LONG *) el2)))) & 0x7fff;
+
+    return ((key1 < key2) ? -1 : ((key1 == key2) ? 0 : 1));
+}
+
+
+static int
+keycompare(const void *el1, const void *el2)
+{
+    WORD key1 = HIWORD((*((const LONG *) el1)));
+    WORD key2 = HIWORD((*((const LONG *) el2)));
+
+    return ((key1 < key2) ? -1 : ((key1 == key2) ? 0 : 1));
+}
+
+static int
+MapKey(WORD vKey)
+{
+    int code = -1;
+
+    if (!WINCONSOLE.isTermInfoConsole) {
+        WORD nKey = 0;
+        void *res;
+        LONG key = GenMap(vKey, 0);
+
+        res = bsearch(&key,
+                      WINCONSOLE.map,
+                      (size_t) (N_INI + FKEYS),
+                      sizeof(keylist[0]),
+                      keycompare);
+        if (res) {
+            key = *((LONG *) res);
+            nKey = LOWORD(key);
+            code = (int) (nKey & 0x7fff);
+            if (nKey & 0x8000)
+                code = -code;
+        }
+    }
+    return code;
+}
+
+static int
+AnsiKey(WORD vKey)
+{
+    int code = -1;
+
+    if (!WINCONSOLE.isTermInfoConsole) {
+        WORD nKey = 0;
+        void *res;
+        LONG key = GenMap(vKey, 0);
+
+        res = bsearch(&key,
+                      WINCONSOLE.ansi_map,
+                      (size_t) (N_INI + FKEYS),
+                      sizeof(keylist[0]),
+                      keycompare);
+        if (res) {
+            key = *((LONG *) res);
+            nKey = LOWORD(key);
+            code = (int) (nKey & 0x7fff);
+            if (nKey & 0x8000)
+                code = -code;
+        }
+    }
+    return code;
+}
+
+NCURSES_EXPORT(int)
+_nc_console_keyok(int keycode, int flag)
+{
+    int code = ERR;
+    WORD nKey;
+    WORD vKey;
+    void *res;
+    LONG key = GenMap(0, (WORD) keycode);
+
+    T((T_CALLED("lib_win32con::_nc_console_keyok(%d, %d)"), keycode, flag));
+
+    res = bsearch(&key,
+                  WINCONSOLE.rmap,
+                  (size_t) (N_INI + FKEYS),
+                  sizeof(keylist[0]),
+                  rkeycompare);
+    if (res) {
+        key = *((LONG *) res);
+        vKey = HIWORD(key);
+        nKey = (LOWORD(key)) & 0x7fff;
+        if (!flag)
+            nKey |= 0x8000;
+        *(LONG *) res = GenMap(vKey, nKey);
+    }
+    returnCode(code);
+}
+
+NCURSES_EXPORT(bool)
+_nc_console_keyExist(int keycode)
+{
+    WORD nKey;
+    void *res;
+    bool found = FALSE;
+    LONG key = GenMap(0, (WORD) keycode);
+
+    T((T_CALLED("lib_win32con::_nc_console_keyExist(%d)"), keycode));
+    res = bsearch(&key,
+                  WINCONSOLE.rmap,
+                  (size_t) (N_INI + FKEYS),
+                  sizeof(keylist[0]),
+                  rkeycompare);
+    if (res) {
+        key = *((LONG *) res);
+        nKey = LOWORD(key);
+        if (!(nKey & 0x8000))
+            found = TRUE;
+    }
+    returnCode(found);
+}
+
+NCURSES_EXPORT(int)
+_nc_console_twait(
+    SCREEN *sp,
+    HANDLE hdl,
+    int mode,
+    int milliseconds,
+    int *timeleft
+    EVENTLIST_2nd(_nc_eventlist * evl))
+{
+    INPUT_RECORD inp_rec;
+    BOOL b;
+    DWORD nRead = 0, rc = (DWORD) (-1);
+    int code = 0;
+    FILETIME fstart;
+    FILETIME fend;
+    int diff;
+    bool isNoDelay = (milliseconds == 0);
+
+#ifdef NCURSES_WGETCH_EVENTS
+    (void) evl;                 /* TODO: implement wgetch-events */
+#endif
+
+#define IGNORE_CTRL_KEYS (SHIFT_PRESSED|LEFT_ALT_PRESSED|RIGHT_ALT_PRESSED| \
+                          LEFT_CTRL_PRESSED|RIGHT_CTRL_PRESSED)
+#define CONSUME() ReadConsoleInput(hdl, &inp_rec, 1, &nRead)
+
+    assert(sp);
+
+    TR(TRACE_IEVENT, ("start twait: hdl=%p, %d milliseconds, mode: %d",
+                      hdl, milliseconds, mode));
+
+    if (milliseconds < 0)
+        milliseconds = INFINITY;
+
+    memset(&inp_rec, 0, sizeof(inp_rec));
+
+    while (true) {
+        if (!isNoDelay) {
+            GetSystemTimeAsFileTime(&fstart);
+            rc = WaitForSingleObject(hdl, (DWORD) milliseconds);
+            GetSystemTimeAsFileTime(&fend);
+            diff = (int) tdiff(fstart, fend);
+            milliseconds = Adjust(milliseconds, diff);
+            if (milliseconds< 0)
+                break;
+        }
+
+        if (isNoDelay || (rc == WAIT_OBJECT_0)) {
+            if (mode) {
+                nRead = 0;
+                b = GetNumberOfConsoleInputEvents(hdl, &nRead);
+                if (!b) {
+                    T(("twait:err GetNumberOfConsoleInputEvents"));
+                }
+                if (isNoDelay && b) {
+                    T(("twait: Events Available: %ld", nRead));
+                    if (nRead==0) {
+                        code = 0;
+                        goto end;
+                    } else {
+                        DWORD n = 0;
+                        INPUT_RECORD* pInpRec =
+                            TypeAlloca(INPUT_RECORD, nRead);
+                        if (pInpRec != NULL) {
+                            DWORD i;
+                            BOOL f;
+                            memset(pInpRec, 0, sizeof(INPUT_RECORD)*nRead);
+                            f = PeekConsoleInput(hdl, pInpRec, nRead, &n);
+                            if (f) {
+                                for(i = 0; i < n; i++) {
+                                    if (pInpRec[i].EventType==KEY_EVENT) {
+                                        if(pInpRec[i].Event.KeyEvent.bKeyDown) {
+                                          DWORD ctrlMask =
+                                              (pInpRec[i].Event.KeyEvent.dwControlKeyState &
+                                               IGNORE_CTRL_KEYS);
+                                          if (!ctrlMask) {
+                                              code = TW_INPUT;
+                                              goto end;
+                                          }
+                                        }
+                                    }
+                                }
+                            } else {
+                                T(("twait:err PeekConsoleInput"));
+                            }
+                            code = 0;
+                            goto end;
+                        } else {
+                            T(("twait:err could not alloca input records"));
+                        }
+                    }
+                }
+                if (b && nRead > 0) {
+                    b = PeekConsoleInput(hdl, &inp_rec, 1, &nRead);
+                    if (!b) {
+                        T(("twait:err PeekConsoleInput"));
+                    }
+                    if (b && nRead > 0) {
+                        switch (inp_rec.EventType) {
+                        case KEY_EVENT:
+                            if (mode & TW_INPUT) {
+                                WORD vk =
+                                    inp_rec.Event.KeyEvent.wVirtualKeyCode;
+                                char ch =
+                                    inp_rec.Event.KeyEvent.uChar.AsciiChar;
+                                T(("twait:event KEY_EVENT"));
+                                T(("twait vk=%d, ch=%d, keydown=%d",
+                                   vk, ch, inp_rec.Event.KeyEvent.bKeyDown));
+                                if (inp_rec.Event.KeyEvent.bKeyDown) {
+                                    T(("twait:event KeyDown"));
+                                    if (!WINCONSOLE.isTermInfoConsole &&
+                                        (0 == ch)) {
+                                        int nKey = MapKey(vk);
+                                        if (nKey < 0) {
+                                            CONSUME();
+                                            continue;
+                                        }
+                                    }
+                                    code = TW_INPUT;
+                                    goto end;
+                                } else {
+                                    CONSUME();
+                                }
+                            }
+                            continue;
+                        case MOUSE_EVENT:
+                            T(("twait:event MOUSE_EVENT"));
+                            if (decode_mouse(sp,
+                                             (inp_rec.Event.MouseEvent.dwButtonState
+                                              & BUTTON_MASK)) == 0) {
+                                CONSUME();
+                            } else if (mode & TW_MOUSE) {
+                                code = TW_MOUSE;
+                                goto end;
+                            }
+                            continue;
+                            /* e.g., FOCUS_EVENT */
+                        default:
+                            T(("twait:event Tyoe %d", inp_rec.EventType));
+                            CONSUME();
+                            _nc_console_selectActiveHandle();
+                            continue;
+                        }
+                    }
+                }
+            }
+            continue;
+        } else {
+            if (rc != WAIT_TIMEOUT) {
+                code = -1;
+                break;
+            } else {
+                code = 0;
+                break;
+            }
+        }
+    }
+end:
+
+    TR(TRACE_IEVENT, ("end twait: returned %d (%lu), remaining time %d msec",
+                      code, GetLastError(), milliseconds));
+
+    if (timeleft)
+        *timeleft = milliseconds;
+
+    return code;
+}
+
+NCURSES_EXPORT(int)
+_nc_console_testmouse(
+                      SCREEN *sp,
+                      HANDLE hdl,
+                      int delay
+                      EVENTLIST_2nd(_nc_eventlist * evl))
+{
+    int rc = 0;
+
+    assert(sp);
+
+    if (sp->_drv_mouse_head < sp->_drv_mouse_tail) {
+        rc = TW_MOUSE;
+    } else {
+        rc = _nc_console_twait(sp,
+                               hdl,
+                               TWAIT_MASK,
+                               delay,
+                               (int *) 0
+                               EVENTLIST_2nd(evl));
+    }
+    return rc;
+}
+
+NCURSES_EXPORT(int)
+_nc_console_read(
+                 SCREEN *sp,
+                 HANDLE hdl,
+                 int *buf)
+{
+    int rc = -1;
+    INPUT_RECORD inp_rec;
+    BOOL b;
+    DWORD nRead;
+    WORD vk;
+
+    assert(sp);
+    assert(buf);
+
+    memset(&inp_rec, 0, sizeof(inp_rec));
+
+    T((T_CALLED("lib_win32con::_nc_console_read(%p)"), sp));
+
+    while ((b = ReadConsoleInput(hdl, &inp_rec, 1, &nRead))) {
+        if (b && nRead > 0) {
+            if (rc < 0)
+                rc = 0;
+            rc = rc + (int) nRead;
+            if (inp_rec.EventType == KEY_EVENT) {
+                if (!inp_rec.Event.KeyEvent.bKeyDown)
+                    continue;
+                *buf = (int) inp_rec.Event.KeyEvent.uChar.AsciiChar;
+                vk = inp_rec.Event.KeyEvent.wVirtualKeyCode;
+                /*
+                 * There are 24 virtual function-keys, and typically
+                 * 12 function-keys on a keyboard.  Use the shift-modifier
+                 * to provide the remaining 12 keys.
+                 */
+                if (vk >= VK_F1 && vk <= VK_F12) {
+                    if (inp_rec.Event.KeyEvent.dwControlKeyState &
+                        SHIFT_PRESSED) {
+                        vk = (WORD) (vk + 12);
+                    }
+                }
+                if (*buf == 0) {
+                    int key = MapKey(vk);
+                    if (key < 0)
+                        continue;
+                    if (sp->_keypad_on) {
+                        *buf = key;
+                    } else {
+                        ungetch('\0');
+                        *buf = AnsiKey(vk);
+                    }
+                }
+                break;
+            } else if (inp_rec.EventType == MOUSE_EVENT) {
+                if (handle_mouse(sp,
+                                 inp_rec.Event.MouseEvent)) {
+                    *buf = KEY_MOUSE;
+                    break;
+                }
+            }
+            continue;
+        }
+    }
+    returnCode(rc);
+}
+
+/*   Our replacement for the systems _isatty to include also
+     a test for mintty. This is called from the NC_ISATTY macro
+     defined in curses.priv.h
+
+     Return codes:
+     - 0 : Not a TTY
+     - 1 : A Windows character device detected by _isatty
+     - 2 : A future implementation may return 2 for mintty
+ */
+NCURSES_EXPORT(int)
+_nc_console_isatty(int fd)
+{
+    int result = 0;
+    T((T_CALLED("lib_win32con::_nc_console_isatty(%d"), fd));
+
+    if (_isatty(fd))
+        result = 1;
+#ifdef _NC_CHECK_MINTTY
+    else {
+        if (_nc_console_checkmintty(fd, NULL)) {
+            result = 2;
+            fprintf(stderr, "ncurses on Windows must run in a Windows console.\n");
+            fprintf(stderr, "On newer versions of Windows, the calling program should create a PTY-like.\n");
+            fprintf(stderr, "device using the CreatePseudoConsole Windows API call.\n");
+            exit(EXIT_FAILURE);
+        }
+    }
+#endif
+    returnCode(result);
+}
+
+NCURSES_EXPORT(bool)
+_nc_console_checkinit(bool initFlag, bool assumeTermInfo)
+{
+    bool res = FALSE;
+
+    T((T_CALLED("lib_win32con::_nc_console_checkinit(initFlag=%d, assumeTermInfo=%d)"),
+       initFlag, assumeTermInfo));
+
+    if (!initFlag) {
+        res = console_initialized;
+    } else {
+        /* initialize once, or not at all */
+        if (!console_initialized) {
+            int i;
+            DWORD num_buttons;
+            WORD a;
+            BOOL buffered = FALSE;
+            BOOL b;
+
+            START_TRACE();
+            WINCONSOLE.isTermInfoConsole = assumeTermInfo;
+
+            WINCONSOLE.map = (LPDWORD)malloc(sizeof(DWORD)*MAPSIZE);
+            WINCONSOLE.rmap = (LPDWORD)malloc(sizeof(DWORD)*MAPSIZE);
+            WINCONSOLE.ansi_map = (LPDWORD)malloc(sizeof(DWORD)*MAPSIZE);
+
+            for (i = 0; i < (N_INI + FKEYS); i++) {
+                if (i < N_INI) {
+                    WINCONSOLE.rmap[i] = WINCONSOLE.map[i] =
+                        (DWORD) keylist[i];
+                    WINCONSOLE.ansi_map[i] = (DWORD) ansi_keys[i];
+                } else {
+                    WINCONSOLE.rmap[i] = WINCONSOLE.map[i] =
+                        (DWORD) GenMap((VK_F1 + (i - N_INI)),
+                                       (KEY_F(1) + (i - N_INI)));
+                    WINCONSOLE.ansi_map[i] =
+                        (DWORD) GenMap((VK_F1 + (i - N_INI)),
+                                       (';' + (i - N_INI)));
+                }
+            }
+            qsort(WINCONSOLE.ansi_map,
+                  (size_t) (MAPSIZE),
+                  sizeof(keylist[0]),
+                  keycompare);
+            qsort(WINCONSOLE.map,
+                  (size_t) (MAPSIZE),
+                  sizeof(keylist[0]),
+                  keycompare);
+            qsort(WINCONSOLE.rmap,
+                  (size_t) (MAPSIZE),
+                  sizeof(keylist[0]),
+                  rkeycompare);
+
+            if (GetNumberOfConsoleMouseButtons(&num_buttons)) {
+                WINCONSOLE.numButtons = (int) num_buttons;
+            } else {
+                WINCONSOLE.numButtons = 1;
+            }
+
+            a = _nc_console_MapColor(true, COLOR_WHITE) |
+                _nc_console_MapColor(false, COLOR_BLACK);
+            for (i = 0; i < CON_NUMPAIRS; i++)
+                WINCONSOLE.pairs[i] = a;
+
+            WINCONSOLE.inp = GetStdHandle(STD_INPUT_HANDLE);
+            WINCONSOLE.out = GetStdHandle(STD_OUTPUT_HANDLE);
+            WINCONSOLE.hdl = WINCONSOLE.out;
+
+            GetConsoleMode(WINCONSOLE.inp, &WINCONSOLE.originalMode.dwFlagIn);
+            GetConsoleMode(WINCONSOLE.out, &WINCONSOLE.originalMode.dwFlagOut);
+
+            if (!WINCONSOLE.isTermInfoConsole) {
+                b = AllocConsole();
+
+                if (!b)
+                    b = AttachConsole(ATTACH_PARENT_PROCESS);
+
+                if (getenv("NCGDB") || getenv("NCURSES_CONSOLE2")) {
+                    T(("... will not buffer console"));
+                } else {
+                    T(("... creating console buffer"));
+                    WINCONSOLE.hdl =
+                        CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE,
+                                                  0,
+                                                  NULL,
+                                                  CONSOLE_TEXTMODE_BUFFER,
+                                                  NULL);
+                    buffered = TRUE;
+                }
+            }
+
+            /* We set binary I/O even when using the console
+               driver to cover the situation, that the
+               TERM variable is set to #win32con, but actually
+               Windows supports virtual terminal processing.
+               So if terminfo functions are used in this setup,
+               they actually may work.
+            */
+            _setmode(fileno(stdin), _O_BINARY);
+            _setmode(fileno(stdout), _O_BINARY);
+
+            if (WINCONSOLE.hdl != INVALID_HANDLE_VALUE) {
+                WINCONSOLE.buffered = buffered;
+                _nc_console_get_SBI();
+                WINCONSOLE.save_SBI = WINCONSOLE.SBI;
+                if (!buffered) {
+                    save_original_screen();
+                    _nc_console_set_scrollback(FALSE, &WINCONSOLE.SBI);
+                }
+                GetConsoleCursorInfo(WINCONSOLE.hdl, &WINCONSOLE.save_CI);
+                T(("... initial cursor is %svisible, %d%%",
+                   (WINCONSOLE.save_CI.bVisible ? "" : "not-"),
+                   (int) WINCONSOLE.save_CI.dwSize));
+            }
+
+            WINCONSOLE.initialized = TRUE;
+            console_initialized = TRUE;
+        }
+        res = (WINCONSOLE.hdl != INVALID_HANDLE_VALUE);
+    }
+    returnBool(res);
+}
+
+#endif // _NC_WINDOWS
diff --git a/ncurses/tinfo/lib_win32util.c b/ncurses/tinfo/lib_win32util.c
new file mode 100644
index 0000000..1482916
--- /dev/null
+++ b/ncurses/tinfo/lib_win32util.c
@@ -0,0 +1,134 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2009,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Juergen Pfeifer                                                 *
+ *     and: Thomas E. Dickey                                                *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_win32util.c,v 1.2 2021/09/04 10:54:35 tom Exp $")
+
+#ifdef _NC_WINDOWS
+#include <io.h>
+
+#ifdef _NC_CHECK_MINTTY
+#define PSAPI_VERSION 2
+#include <psapi.h>
+#include <tchar.h>
+
+#define array_length(a) (sizeof(a)/sizeof(a[0]))
+
+/*   This function tests, whether or not the ncurses application
+     is running as a descendant of MSYS2/cygwin mintty terminal
+     application. mintty doesn't use Windows Console for its screen
+     I/O, so the native Windows _isatty doesn't recognize it as
+     character device. But we can discover we are at the end of an
+     Pipe and can query the server side of the pipe, looking whether
+     or not this is mintty.
+     For now we terminate the program if we discover that situation.
+     Althogh in theory it would be possible, to remotely manipulate
+     the terminal state of mintty, this is out of scope for now and
+     not worth the significant effort.
+ */
+NCURSES_EXPORT(int)
+_nc_console_checkmintty(int fd, LPHANDLE pMinTTY)
+{
+    HANDLE handle = _nc_console_handle(fd);
+    DWORD dw;
+    int code = 0;
+
+    T((T_CALLED("lib_winhelper::_nc_console_checkmintty(%d, %p)"), fd, pMinTTY));
+
+    if (handle != INVALID_HANDLE_VALUE) {
+        dw = GetFileType(handle);
+	if (dw == FILE_TYPE_PIPE) {
+	    if (GetNamedPipeInfo(handle, 0, 0, 0, 0)) {
+	        ULONG pPid;
+		/* Requires NT6 */
+		if (GetNamedPipeServerProcessId(handle, &pPid)) {
+		    TCHAR buf[MAX_PATH];
+		    DWORD len = 0;
+		    /* These security attributes may allow us to
+		       create a remote thread in mintty to manipulate
+		       the terminal state remotely */
+		    HANDLE pHandle = OpenProcess(
+						 PROCESS_CREATE_THREAD
+						 | PROCESS_QUERY_INFORMATION
+						 | PROCESS_VM_OPERATION
+						 | PROCESS_VM_WRITE
+						 | PROCESS_VM_READ,
+						 FALSE,
+						 pPid);
+		    if (pMinTTY)
+		        *pMinTTY = INVALID_HANDLE_VALUE;
+		    if (pHandle != INVALID_HANDLE_VALUE) {
+		        if ((len = GetProcessImageFileName(
+							   pHandle,
+							   buf,
+							   (DWORD)
+							   array_length(buf)))) {
+			    TCHAR *pos = _tcsrchr(buf, _T('\\'));
+			    if (pos) {
+			        pos++;
+				if (_tcsnicmp(pos, _TEXT("mintty.exe"), 10)
+				    == 0) {
+				    if (pMinTTY)
+				        *pMinTTY = pHandle;
+				    code = 1;
+				}
+			    }
+			}
+		    }
+		}
+	    }
+	}
+    }
+    returnCode(code);
+}
+#endif /* _NC_CHECK_MINTTY */
+
+#define JAN1970 116444736000000000LL	/* the value for 01/01/1970 00:00 */
+
+NCURSES_EXPORT(int)
+_nc_gettimeofday(struct timeval *tv, void *tz GCC_UNUSED)
+{
+    union {
+	FILETIME ft;
+	long long since1601;	/* time since 1 Jan 1601 in 100ns units */
+    } data;
+
+    GetSystemTimeAsFileTime(&data.ft);
+    tv->tv_usec = (long) ((data.since1601 / 10LL) % 1000000LL);
+    tv->tv_sec = (long) ((data.since1601 - JAN1970) / 10000000LL);
+    return (0);
+}
+
+#endif // _NC_WINDOWS
diff --git a/ncurses/tinfo/make_hash.c b/ncurses/tinfo/make_hash.c
new file mode 100644
index 0000000..9980279
--- /dev/null
+++ b/ncurses/tinfo/make_hash.c
@@ -0,0 +1,445 @@
+/****************************************************************************
+ * Copyright 2018-2019,2020 Thomas E. Dickey                                *
+ * Copyright 2009-2013,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ ****************************************************************************/
+
+/*
+ *	make_hash.c --- build-time program for constructing comp_captab.c
+ */
+
+#include <build.priv.h>
+
+#include <tic.h>
+#include <hashsize.h>
+
+#include <ctype.h>
+
+MODULE_ID("$Id: make_hash.c,v 1.33 2020/02/02 23:34:34 tom Exp $")
+
+/*
+ *	_nc_make_hash_table()
+ *
+ *	Takes the entries in table[] and hashes them into hash_table[]
+ *	by name.  There are CAPTABSIZE entries in the predefined table[]
+ *	and HASHTABSIZE slots in hash_table[].
+ *
+ */
+
+#undef MODULE_ID
+#define MODULE_ID(id)		/*nothing */
+#include <tinfo/doalloc.c>
+
+#define L_PAREN "("
+#define R_PAREN ")"
+#define L_BRACE "{"
+#define R_BRACE "}"
+
+static const char *typenames[] =
+{"BOOLEAN", "NUMBER", "STRING"};
+
+static void
+failed(const char *s)
+{
+    perror(s);
+    exit(EXIT_FAILURE);
+}
+
+static char *
+strmalloc(char *s)
+{
+    size_t need = strlen(s) + 1;
+    char *result = malloc(need);
+    if (result == 0)
+	failed("strmalloc");
+    _nc_STRCPY(result, s, need);
+    return result;
+}
+
+/*
+ *	int hash_function(string)
+ *
+ *	Computes the hashing function on the given string.
+ *
+ *	The current hash function is the sum of each consecutive pair
+ *	of characters, taken as two-byte integers, mod HASHTABSIZE.
+ *
+ */
+
+static int
+hash_function(const char *string)
+{
+    long sum = 0;
+
+    while (*string) {
+	sum += (long) (UChar(*string) + (UChar(*(string + 1)) << 8));
+	string++;
+    }
+
+    return (int) (sum % HASHTABSIZE);
+}
+
+#define UNUSED -1
+
+static void
+_nc_make_hash_table(struct user_table_entry *table,
+		    HashValue * hash_table,
+		    unsigned tablesize)
+{
+    unsigned i;
+    int hashvalue;
+    int collisions = 0;
+
+    for (i = 0; i < HASHTABSIZE; i++) {
+	hash_table[i] = UNUSED;
+    }
+    for (i = 0; i < tablesize; i++) {
+	hashvalue = hash_function(table[i].ute_name);
+
+	if (hash_table[hashvalue] >= 0)
+	    collisions++;
+
+	if (hash_table[hashvalue] != UNUSED) {
+	    table[i].ute_link = hash_table[hashvalue];
+	}
+	hash_table[hashvalue] = (HashValue) i;
+    }
+
+    printf("/* %d collisions out of %d entries */\n", collisions, tablesize);
+}
+
+/*
+ * This filter reads from standard input a list of tab-delimited columns,
+ * (e.g., from Caps.filtered) computes the hash-value of a specified column and
+ * writes the hashed tables to standard output.
+ *
+ * By compiling the hash table at build time, we're able to make the entire
+ * set of terminfo and termcap tables readonly (and also provide some runtime
+ * performance enhancement).
+ */
+
+#define MAX_COLUMNS BUFSIZ	/* this _has_ to be worst-case */
+
+static int
+count_columns(char **list)
+{
+    int result = 0;
+    if (list != 0) {
+	while (*list++) {
+	    ++result;
+	}
+    }
+    return result;
+}
+
+static char **
+parse_columns(char *buffer)
+{
+    static char **list;
+
+    int col = 0;
+
+    if (buffer == 0) {
+	free(list);
+	list = 0;
+	return 0;
+    }
+
+    if (*buffer != '#') {
+	if (list == 0) {
+	    list = typeCalloc(char *, (MAX_COLUMNS + 1));
+	    if (list == 0)
+		return (0);
+	}
+	while (*buffer != '\0') {
+	    char *s;
+	    for (s = buffer; (*s != '\0') && !isspace(UChar(*s)); s++)
+		/*EMPTY */ ;
+	    if (s != buffer) {
+		char mark = *s;
+		*s = '\0';
+		if ((s - buffer) > 1
+		    && (*buffer == '"')
+		    && (s[-1] == '"')) {	/* strip the quotes */
+		    assert(s > buffer + 1);
+		    s[-1] = '\0';
+		    buffer++;
+		}
+		list[col] = buffer;
+		col++;
+		if (mark == '\0')
+		    break;
+		while (*++s && isspace(UChar(*s)))
+		    /*EMPTY */ ;
+		buffer = s;
+	    } else
+		break;
+	}
+    }
+    return col ? list : 0;
+}
+
+#define SetType(n,t) \
+	if (is_user) \
+	    name_table[n].ute_type |= (int)(1 << (t)); \
+	else \
+	    name_table[n].ute_type = (t)
+
+#define GetType(n) \
+	(is_user \
+	 ? get_type(name_table[n].ute_type) \
+	 : typenames[name_table[n].ute_type])
+
+static char *
+get_type(int type_mask)
+{
+    static char result[80];
+    unsigned n;
+    _nc_STRCPY(result, L_PAREN, sizeof(result));
+    for (n = 0; n < 3; ++n) {
+	if ((1 << n) & type_mask) {
+	    size_t want = 5 + strlen(typenames[n]);
+	    if (want > sizeof(result)) {
+		fprintf(stderr, "Buffer is not large enough for %s + %s\n",
+			result, typenames[n]);
+		exit(EXIT_FAILURE);
+	    }
+	    if (result[1])
+		_nc_STRCAT(result, "|", sizeof(result));
+	    _nc_STRCAT(result, "1<<", sizeof(result));
+	    _nc_STRCAT(result, typenames[n], sizeof(result));
+	}
+    }
+    _nc_STRCAT(result, R_PAREN, sizeof(result));
+    return result;
+}
+
+int
+main(int argc, char **argv)
+{
+    unsigned tablesize = CAPTABSIZE;
+    struct user_table_entry *name_table = typeCalloc(struct
+						     user_table_entry, tablesize);
+    HashValue *hash_table = typeCalloc(HashValue, HASHTABSIZE);
+    const char *root_name = "";
+    int column = 0;
+    int bigstring = 0;
+    unsigned n;
+    unsigned nn;
+    unsigned tableused = 0;
+    bool is_user;
+    const char *table_name;
+    char buffer[BUFSIZ];
+
+    short BoolCount = 0;
+    short NumCount = 0;
+    short StrCount = 0;
+
+    /* The first argument is the column-number (starting with 0).
+     * The second is the root name of the tables to generate.
+     */
+    if (argc <= 3
+	|| (column = atoi(argv[1])) <= 0
+	|| (column >= MAX_COLUMNS)
+	|| *(root_name = argv[2]) == 0
+	|| (bigstring = atoi(argv[3])) < 0
+	|| name_table == 0
+	|| hash_table == 0) {
+	fprintf(stderr, "usage: make_hash column root_name bigstring\n");
+	exit(EXIT_FAILURE);
+    }
+    is_user = (*root_name == 'u');
+    table_name = (is_user ? "user" : "name");
+
+    /*
+     * Read the table into our arrays.
+     */
+    for (n = 0; (n < tablesize) && fgets(buffer, BUFSIZ, stdin);) {
+	char **list;
+	char *nlp = strchr(buffer, '\n');
+	if (nlp)
+	    *nlp = '\0';
+	else
+	    buffer[sizeof(buffer) - 2] = '\0';
+	list = parse_columns(buffer);
+	if (list == 0)		/* blank or comment */
+	    continue;
+	if (is_user) {
+	    if (strcmp(list[0], "userdef"))
+		continue;
+	} else if (!strcmp(list[0], "userdef")) {
+	    continue;
+	}
+	if (column < 0 || column > count_columns(list)) {
+	    fprintf(stderr, "expected %d columns, have %d:\n%s\n",
+		    column,
+		    count_columns(list),
+		    buffer);
+	    exit(EXIT_FAILURE);
+	}
+	nn = tableused;
+	if (is_user) {
+	    unsigned j;
+	    for (j = 0; j < tableused; ++j) {
+		if (!strcmp(list[column], name_table[j].ute_name)) {
+		    nn = j;
+		    break;
+		}
+	    }
+	}
+	if (nn == tableused) {
+	    name_table[nn].ute_link = -1;	/* end-of-hash */
+	    name_table[nn].ute_name = strmalloc(list[column]);
+	    ++tableused;
+	}
+
+	if (!strcmp(list[2], "bool")) {
+	    SetType(nn, BOOLEAN);
+	    name_table[nn].ute_index = BoolCount++;
+	} else if (!strcmp(list[2], "num")) {
+	    SetType(nn, NUMBER);
+	    name_table[nn].ute_index = NumCount++;
+	} else if (!strcmp(list[2], "str")) {
+	    SetType(nn, STRING);
+	    name_table[nn].ute_index = StrCount++;
+	    if (is_user) {
+		if (*list[3] != '-') {
+		    unsigned j;
+		    name_table[nn].ute_argc = (unsigned) strlen(list[3]);
+		    for (j = 0; j < name_table[nn].ute_argc; ++j) {
+			if (list[3][j] == 's') {
+			    name_table[nn].ute_args |= (1U << j);
+			}
+		    }
+		}
+	    }
+	} else {
+	    fprintf(stderr, "Unknown type: %s\n", list[2]);
+	    exit(EXIT_FAILURE);
+	}
+	n++;
+    }
+    if (tablesize > tableused)
+	tablesize = tableused;
+    _nc_make_hash_table(name_table, hash_table, tablesize);
+
+    /*
+     * Write the compiled tables to standard output
+     */
+    if (bigstring) {
+	int len = 0;
+	int nxt;
+
+	printf("static const char %s_names_text[] = \\\n", root_name);
+	for (n = 0; n < tablesize; n++) {
+	    nxt = (int) strlen(name_table[n].ute_name) + 5;
+	    if (nxt + len > 72) {
+		printf("\\\n");
+		len = 0;
+	    }
+	    printf("\"%s\\0\" ", name_table[n].ute_name);
+	    len += nxt;
+	}
+	printf(";\n\n");
+
+	len = 0;
+	printf("static %s_table_data const %s_names_data[] =\n",
+	       table_name,
+	       root_name);
+	printf("%s\n", L_BRACE);
+	for (n = 0; n < tablesize; n++) {
+	    printf("\t%s %15d,\t%10s,", L_BRACE, len, GetType(n));
+	    if (is_user)
+		printf("\t%d,%d,",
+		       name_table[n].ute_argc,
+		       name_table[n].ute_args);
+	    printf("\t%3d, %3d %s%c\n",
+		   name_table[n].ute_index,
+		   name_table[n].ute_link,
+		   R_BRACE,
+		   n < tablesize - 1 ? ',' : ' ');
+	    len += (int) strlen(name_table[n].ute_name) + 1;
+	}
+	printf("%s;\n\n", R_BRACE);
+	printf("static struct %s_table_entry *_nc_%s_table = 0;\n\n",
+	       table_name,
+	       root_name);
+    } else {
+
+	printf("static struct %s_table_entry const _nc_%s_table[] =\n",
+	       table_name,
+	       root_name);
+	printf("%s\n", L_BRACE);
+	for (n = 0; n < tablesize; n++) {
+	    _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer)) "\"%s\"",
+			name_table[n].ute_name);
+	    printf("\t%s %15s,\t%10s,", L_BRACE, buffer, GetType(n));
+	    if (is_user)
+		printf("\t%d,%d,",
+		       name_table[n].ute_argc,
+		       name_table[n].ute_args);
+	    printf("\t%3d, %3d %s%c\n",
+		   name_table[n].ute_index,
+		   name_table[n].ute_link,
+		   R_BRACE,
+		   n < tablesize - 1 ? ',' : ' ');
+	}
+	printf("%s;\n\n", R_BRACE);
+    }
+
+    printf("static const HashValue _nc_%s_hash_table[%d] =\n",
+	   root_name,
+	   HASHTABSIZE + 1);
+    printf("%s\n", L_BRACE);
+    for (n = 0; n < HASHTABSIZE; n++) {
+	printf("\t%3d,\n", hash_table[n]);
+    }
+    printf("\t0\t/* base-of-table */\n");
+    printf("%s;\n\n", R_BRACE);
+
+    if (!is_user) {
+	printf("#if (BOOLCOUNT!=%d)||(NUMCOUNT!=%d)||(STRCOUNT!=%d)\n",
+	       BoolCount, NumCount, StrCount);
+	printf("#error\t--> term.h and comp_captab.c disagree about the <--\n");
+	printf("#error\t--> numbers of booleans, numbers and/or strings <--\n");
+	printf("#endif\n\n");
+    }
+
+    free(hash_table);
+    for (n = 0; (n < tablesize); ++n) {
+	free((void *) name_table[n].ute_name);
+    }
+    free(name_table);
+    parse_columns(0);
+
+    return EXIT_SUCCESS;
+}
diff --git a/ncurses/tinfo/make_keys.c b/ncurses/tinfo/make_keys.c
new file mode 100644
index 0000000..b8eb934
--- /dev/null
+++ b/ncurses/tinfo/make_keys.c
@@ -0,0 +1,167 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2011,2015 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                    1997-on                     *
+ ****************************************************************************/
+
+/*
+ * This replaces an awk script which translated keys.list into keys.tries by
+ * making the output show the indices into the TERMTYPE Strings array.  Doing
+ * it that way lets us cut down on the size of the init_keytry() function.
+ */
+
+#define USE_TERMLIB 1
+#include <build.priv.h>
+
+MODULE_ID("$Id: make_keys.c,v 1.23 2021/08/18 20:55:25 tom Exp $")
+
+#include <names.c>
+
+static unsigned
+unknown(void)
+{
+    static unsigned result = 0;
+
+    if (result == 0) {
+	unsigned n;
+	for (n = 0; strnames[n] != 0; n++) {
+	    ++result;
+	}
+	for (n = 0; strfnames[n] != 0; n++) {
+	    ++result;
+	}
+    }
+    return result;
+}
+
+static unsigned
+lookup(const char *name)
+{
+    unsigned n;
+    bool found = FALSE;
+    for (n = 0; strnames[n] != 0; n++) {
+	if (!strcmp(name, strnames[n])) {
+	    found = TRUE;
+	    break;
+	}
+    }
+    if (!found) {
+	for (n = 0; strfnames[n] != 0; n++) {
+	    if (!strcmp(name, strfnames[n])) {
+		found = TRUE;
+		break;
+	    }
+	}
+    }
+    return found ? n : unknown();
+}
+
+static void
+make_keys(FILE *ifp, FILE *ofp)
+{
+    char buffer[BUFSIZ];
+    char from[256];
+    char to[256];
+    unsigned ignore = unknown();
+    unsigned maxlen = 16;
+    int scanned;
+
+    while (fgets(buffer, (int) sizeof(buffer), ifp) != 0) {
+	if (*buffer == '#')
+	    continue;
+
+	to[sizeof(to) - 1] = '\0';
+	from[sizeof(from) - 1] = '\0';
+
+	scanned = sscanf(buffer, "%255s %255s", to, from);
+	if (scanned == 2) {
+	    unsigned code = lookup(from);
+	    if (code == ignore)
+		continue;
+	    if (strlen(from) > maxlen)
+		maxlen = (unsigned) strlen(from);
+	    fprintf(ofp, "\t{ %4u, %-*.*s },\t/* %s */\n",
+		    code,
+		    (int) maxlen, (int) maxlen,
+		    to,
+		    from);
+	}
+    }
+}
+
+static void
+write_list(FILE *ofp, const char **list)
+{
+    while (*list != 0)
+	fprintf(ofp, "%s\n", *list++);
+}
+
+int
+main(int argc, char *argv[])
+{
+    static const char *prefix[] =
+    {
+	"#ifndef _INIT_KEYTRY_H",
+	"#define _INIT_KEYTRY_H 1",
+	"",
+	"/* This file was generated by MAKE_KEYS */",
+	"",
+	"#include <tic.h>",
+	"",
+	"#if BROKEN_LINKER",
+	"static",
+	"#endif",
+	"const struct tinfo_fkeys _nc_tinfo_fkeys[] = {",
+	0
+    };
+    static const char *suffix[] =
+    {
+	"\t{ 0, 0} };",
+	"",
+	"#endif /* _INIT_KEYTRY_H */",
+	0
+    };
+
+    write_list(stdout, prefix);
+    if (argc > 1) {
+	int n;
+	for (n = 1; n < argc; n++) {
+	    FILE *fp = fopen(argv[n], "r");
+	    if (fp != 0) {
+		make_keys(fp, stdout);
+		fclose(fp);
+	    }
+	}
+    } else {
+	make_keys(stdin, stdout);
+    }
+    write_list(stdout, suffix);
+    return EXIT_SUCCESS;
+}
diff --git a/ncurses/tinfo/name_match.c b/ncurses/tinfo/name_match.c
new file mode 100644
index 0000000..71e584d
--- /dev/null
+++ b/ncurses/tinfo/name_match.c
@@ -0,0 +1,126 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2013,2016 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                    1999-on                     *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+#include <tic.h>
+
+MODULE_ID("$Id: name_match.c,v 1.25 2020/02/02 23:34:34 tom Exp $")
+
+#define FirstName _nc_globals.first_name
+
+#if NCURSES_USE_TERMCAP && NCURSES_XNAMES
+static const char *
+skip_index(const char *name)
+{
+    if ((_nc_syntax == SYN_TERMCAP) && _nc_user_definable) {
+	const char *bar = strchr(name, '|');
+	if (bar != 0 && (bar - name) == 2)
+	    name = bar + 1;
+    }
+    return name;
+}
+#endif
+
+/*
+ * Get the primary name from the given name list.  For terminfo, this is the
+ * first name.  For termcap, this may be the second name, if the first one
+ * happens to be two characters.
+ */
+NCURSES_EXPORT(char *)
+_nc_first_name(const char *const sp)
+{
+#if NO_LEAKS
+    if (sp == 0) {
+	if (FirstName != 0) {
+	    FreeAndNull(FirstName);
+	}
+    } else
+#endif
+    {
+	if (FirstName == 0)
+	    FirstName = typeMalloc(char, MAX_NAME_SIZE + 1);
+
+	if (FirstName != 0) {
+	    unsigned n;
+	    const char *src = sp;
+#if NCURSES_USE_TERMCAP && NCURSES_XNAMES
+	    src = skip_index(sp);
+#endif
+	    for (n = 0; n < MAX_NAME_SIZE; n++) {
+		if ((FirstName[n] = src[n]) == '\0'
+		    || (FirstName[n] == '|'))
+		    break;
+	    }
+	    FirstName[n] = '\0';
+	}
+    }
+    return (FirstName);
+}
+
+/*
+ * Is the given name matched in namelist?
+ */
+NCURSES_EXPORT(int)
+_nc_name_match(const char *const namelst, const char *const name, const char *const delim)
+{
+    const char *s;
+
+    if ((s = namelst) != 0) {
+	while (*s != '\0') {
+	    const char *d, *t;
+	    int code, found;
+
+	    for (d = name; *d != '\0'; d++) {
+		if (*s != *d)
+		    break;
+		s++;
+	    }
+	    found = FALSE;
+	    for (code = TRUE; *s != '\0'; code = FALSE, s++) {
+		for (t = delim; *t != '\0'; t++) {
+		    if (*s == *t) {
+			found = TRUE;
+			break;
+		    }
+		}
+		if (found)
+		    break;
+	    }
+	    if (code && *d == '\0')
+		return code;
+	    if (*s++ == 0)
+		break;
+	}
+    }
+    return FALSE;
+}
diff --git a/ncurses/tinfo/obsolete.c b/ncurses/tinfo/obsolete.c
new file mode 100644
index 0000000..972a9a1
--- /dev/null
+++ b/ncurses/tinfo/obsolete.c
@@ -0,0 +1,240 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 2013-2014,2016 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                        2013-on                 *
+ ****************************************************************************/
+
+/*
+**	Support for obsolete/unusual features.
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: obsolete.c,v 1.6 2020/02/02 23:34:34 tom Exp $")
+
+/*
+ * Obsolete entrypoint retained for binary compatibility.
+ */
+NCURSES_EXPORT(void)
+NCURSES_SP_NAME(_nc_set_buffer) (NCURSES_SP_DCLx FILE *ofp, int buffered)
+{
+#if NCURSES_SP_FUNCS
+    (void) SP_PARM;
+#endif
+    (void) ofp;
+    (void) buffered;
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(void)
+_nc_set_buffer(FILE *ofp, int buffered)
+{
+    NCURSES_SP_NAME(_nc_set_buffer) (CURRENT_SCREEN, ofp, buffered);
+}
+#endif
+
+#if !HAVE_STRDUP
+NCURSES_EXPORT(char *)
+_nc_strdup(const char *s)
+{
+    char *result = 0;
+    if (s != 0) {
+	size_t need = strlen(s);
+	result = malloc(need + 1);
+	if (result != 0) {
+	    _nc_STRCPY(result, s, need);
+	}
+    }
+    return result;
+}
+#endif
+
+#if USE_MY_MEMMOVE
+#define DST ((char *)s1)
+#define SRC ((const char *)s2)
+NCURSES_EXPORT(void *)
+_nc_memmove(void *s1, const void *s2, size_t n)
+{
+    if (n != 0) {
+	if ((DST + n > SRC) && (SRC + n > DST)) {
+	    static char *bfr;
+	    static size_t length;
+	    register size_t j;
+	    if (length < n) {
+		length = (n * 3) / 2;
+		bfr = typeRealloc(char, length, bfr);
+	    }
+	    for (j = 0; j < n; j++)
+		bfr[j] = SRC[j];
+	    s2 = bfr;
+	}
+	while (n-- != 0)
+	    DST[n] = SRC[n];
+    }
+    return s1;
+}
+#endif /* USE_MY_MEMMOVE */
+
+#ifdef EXP_XTERM_1005
+NCURSES_EXPORT(int)
+_nc_conv_to_utf8(unsigned char *target, unsigned source, unsigned limit)
+{
+#define CH(n) UChar((source) >> ((n) * 8))
+    int rc = 0;
+
+    if (source <= 0x0000007f)
+	rc = 1;
+    else if (source <= 0x000007ff)
+	rc = 2;
+    else if (source <= 0x0000ffff)
+	rc = 3;
+    else if (source <= 0x001fffff)
+	rc = 4;
+    else if (source <= 0x03ffffff)
+	rc = 5;
+    else			/* (source <= 0x7fffffff) */
+	rc = 6;
+
+    if ((unsigned) rc > limit) {	/* whatever it is, we cannot decode it */
+	rc = 0;
+    }
+
+    if (target != 0) {
+	switch (rc) {
+	case 1:
+	    target[0] = CH(0);
+	    break;
+
+	case 2:
+	    target[1] = UChar(0x80 | (CH(0) & 0x3f));
+	    target[0] = UChar(0xc0 | (CH(0) >> 6) | ((CH(1) & 0x07) << 2));
+	    break;
+
+	case 3:
+	    target[2] = UChar(0x80 | (CH(0) & 0x3f));
+	    target[1] = UChar(0x80 | (CH(0) >> 6) | ((CH(1) & 0x0f) << 2));
+	    target[0] = UChar(0xe0 | ((int) (CH(1) & 0xf0) >> 4));
+	    break;
+
+	case 4:
+	    target[3] = UChar(0x80 | (CH(0) & 0x3f));
+	    target[2] = UChar(0x80 | (CH(0) >> 6) | ((CH(1) & 0x0f) << 2));
+	    target[1] = UChar(0x80 |
+			      ((int) (CH(1) & 0xf0) >> 4) |
+			      ((int) (CH(2) & 0x03) << 4));
+	    target[0] = UChar(0xf0 | ((int) (CH(2) & 0x1f) >> 2));
+	    break;
+
+	case 5:
+	    target[4] = UChar(0x80 | (CH(0) & 0x3f));
+	    target[3] = UChar(0x80 | (CH(0) >> 6) | ((CH(1) & 0x0f) << 2));
+	    target[2] = UChar(0x80 |
+			      ((int) (CH(1) & 0xf0) >> 4) |
+			      ((int) (CH(2) & 0x03) << 4));
+	    target[1] = UChar(0x80 | (CH(2) >> 2));
+	    target[0] = UChar(0xf8 | (CH(3) & 0x03));
+	    break;
+
+	case 6:
+	    target[5] = UChar(0x80 | (CH(0) & 0x3f));
+	    target[4] = UChar(0x80 | (CH(0) >> 6) | ((CH(1) & 0x0f) << 2));
+	    target[3] = UChar(0x80 | (CH(1) >> 4) | ((CH(2) & 0x03) << 4));
+	    target[2] = UChar(0x80 | (CH(2) >> 2));
+	    target[1] = UChar(0x80 | (CH(3) & 0x3f));
+	    target[0] = UChar(0xfc | ((int) (CH(3) & 0x40) >> 6));
+	    break;
+	}
+    }
+
+    return rc;			/* number of bytes needed in target */
+#undef CH
+}
+
+NCURSES_EXPORT(int)
+_nc_conv_to_utf32(unsigned *target, const char *source, unsigned limit)
+{
+#define CH(n) UChar((*target) >> ((n) * 8))
+    int rc = 0;
+    int j;
+    unsigned mask = 0;
+
+    /*
+     * Find the number of bytes we will need from the source.
+     */
+    if ((*source & 0x80) == 0) {
+	rc = 1;
+	mask = (unsigned) *source;
+    } else if ((*source & 0xe0) == 0xc0) {
+	rc = 2;
+	mask = (unsigned) (*source & 0x1f);
+    } else if ((*source & 0xf0) == 0xe0) {
+	rc = 3;
+	mask = (unsigned) (*source & 0x0f);
+    } else if ((*source & 0xf8) == 0xf0) {
+	rc = 4;
+	mask = (unsigned) (*source & 0x07);
+    } else if ((*source & 0xfc) == 0xf8) {
+	rc = 5;
+	mask = (unsigned) (*source & 0x03);
+    } else if ((*source & 0xfe) == 0xfc) {
+	rc = 6;
+	mask = (unsigned) (*source & 0x01);
+    }
+
+    if ((unsigned) rc > limit) {	/* whatever it is, we cannot decode it */
+	rc = 0;
+    }
+
+    /*
+     * sanity-check.
+     */
+    if (rc > 1) {
+	for (j = 1; j < rc; j++) {
+	    if ((source[j] & 0xc0) != 0x80)
+		break;
+	}
+	if (j != rc) {
+	    rc = 0;
+	}
+    }
+
+    if (target != 0) {
+	int shift = 0;
+	*target = 0;
+	for (j = 1; j < rc; j++) {
+	    *target |= (unsigned) (source[rc - j] & 0x3f) << shift;
+	    shift += 6;
+	}
+	*target |= mask << shift;
+    }
+    return rc;
+#undef CH
+}
+#endif /* EXP_XTERM_1005 */
diff --git a/ncurses/tinfo/parse_entry.c b/ncurses/tinfo/parse_entry.c
new file mode 100644
index 0000000..14bcb67
--- /dev/null
+++ b/ncurses/tinfo/parse_entry.c
@@ -0,0 +1,1149 @@
+/****************************************************************************
+ * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ ****************************************************************************/
+
+/*
+ *	parse_entry.c -- compile one terminfo or termcap entry
+ *
+ *	Get an exact in-core representation of an entry.  Don't
+ *	try to resolve use or tc capabilities, that is someone
+ *	else's job.  Depends on the lexical analyzer to get tokens
+ *	from the input stream.
+ */
+
+#define __INTERNAL_CAPS_VISIBLE
+#include <curses.priv.h>
+
+#include <ctype.h>
+#include <tic.h>
+
+MODULE_ID("$Id: parse_entry.c,v 1.107 2022/05/08 00:11:44 tom Exp $")
+
+#ifdef LINT
+static short const parametrized[] =
+{0};
+#else
+#include <parametrized.h>
+#endif
+
+static void postprocess_termcap(TERMTYPE2 *, bool);
+static void postprocess_terminfo(TERMTYPE2 *);
+static struct name_table_entry const *lookup_fullname(const char *name);
+
+#if NCURSES_XNAMES
+
+static struct name_table_entry const *
+_nc_extend_names(ENTRY * entryp, const char *name, int token_type)
+{
+    static struct name_table_entry temp;
+    TERMTYPE2 *tp = &(entryp->tterm);
+    unsigned offset = 0;
+    unsigned actual;
+    unsigned tindex;
+    unsigned first, last, n;
+    bool found;
+
+    switch (token_type) {
+    case BOOLEAN:
+	first = 0;
+	last = tp->ext_Booleans;
+	offset = tp->ext_Booleans;
+	tindex = tp->num_Booleans;
+	break;
+    case NUMBER:
+	first = tp->ext_Booleans;
+	last = tp->ext_Numbers + first;
+	offset = (unsigned) (tp->ext_Booleans + tp->ext_Numbers);
+	tindex = tp->num_Numbers;
+	break;
+    case STRING:
+	first = (unsigned) (tp->ext_Booleans + tp->ext_Numbers);
+	last = tp->ext_Strings + first;
+	offset = (unsigned) (tp->ext_Booleans + tp->ext_Numbers + tp->ext_Strings);
+	tindex = tp->num_Strings;
+	break;
+    case CANCEL:
+	actual = NUM_EXT_NAMES(tp);
+	for (n = 0; n < actual; n++) {
+	    if (!strcmp(name, tp->ext_Names[n])) {
+		if (n > (unsigned) (tp->ext_Booleans + tp->ext_Numbers)) {
+		    token_type = STRING;
+		} else if (n > tp->ext_Booleans) {
+		    token_type = NUMBER;
+		} else {
+		    token_type = BOOLEAN;
+		}
+		return _nc_extend_names(entryp, name, token_type);
+	    }
+	}
+	/* Well, we are given a cancel for a name that we don't recognize */
+	return _nc_extend_names(entryp, name, STRING);
+    default:
+	return 0;
+    }
+
+    /* Adjust the 'offset' (insertion-point) to keep the lists of extended
+     * names sorted.
+     */
+    for (n = first, found = FALSE; n < last; n++) {
+	int cmp = strcmp(tp->ext_Names[n], name);
+	if (cmp == 0)
+	    found = TRUE;
+	if (cmp >= 0) {
+	    offset = n;
+	    tindex = n - first;
+	    switch (token_type) {
+	    case BOOLEAN:
+		tindex += BOOLCOUNT;
+		break;
+	    case NUMBER:
+		tindex += NUMCOUNT;
+		break;
+	    case STRING:
+		tindex += STRCOUNT;
+		break;
+	    }
+	    break;
+	}
+    }
+
+#define for_each_value(max) \
+	for (last = (unsigned) (max - 1); last > tindex; last--)
+
+    if (!found) {
+	switch (token_type) {
+	case BOOLEAN:
+	    tp->ext_Booleans++;
+	    tp->num_Booleans++;
+	    TYPE_REALLOC(NCURSES_SBOOL, tp->num_Booleans, tp->Booleans);
+	    for_each_value(tp->num_Booleans)
+		tp->Booleans[last] = tp->Booleans[last - 1];
+	    break;
+	case NUMBER:
+	    tp->ext_Numbers++;
+	    tp->num_Numbers++;
+	    TYPE_REALLOC(NCURSES_INT2, tp->num_Numbers, tp->Numbers);
+	    for_each_value(tp->num_Numbers)
+		tp->Numbers[last] = tp->Numbers[last - 1];
+	    break;
+	case STRING:
+	    tp->ext_Strings++;
+	    tp->num_Strings++;
+	    TYPE_REALLOC(char *, tp->num_Strings, tp->Strings);
+	    for_each_value(tp->num_Strings)
+		tp->Strings[last] = tp->Strings[last - 1];
+	    break;
+	}
+	actual = NUM_EXT_NAMES(tp);
+	TYPE_REALLOC(char *, actual, tp->ext_Names);
+	while (--actual > offset)
+	    tp->ext_Names[actual] = tp->ext_Names[actual - 1];
+	tp->ext_Names[offset] = _nc_save_str(name);
+    }
+
+    temp.nte_name = tp->ext_Names[offset];
+    temp.nte_type = token_type;
+    temp.nte_index = (short) tindex;
+    temp.nte_link = -1;
+
+    return &temp;
+}
+
+static const char *
+usertype2s(int mask)
+{
+    const char *result = "unknown";
+    if (mask & (1 << BOOLEAN)) {
+	result = "boolean";
+    } else if (mask & (1 << NUMBER)) {
+	result = "number";
+    } else if (mask & (1 << STRING)) {
+	result = "string";
+    }
+    return result;
+}
+
+static bool
+expected_type(const char *name, int token_type, bool silent)
+{
+    struct user_table_entry const *entry = _nc_find_user_entry(name);
+    bool result = TRUE;
+    if ((entry != 0) && (token_type != CANCEL)) {
+	int have_type = (1 << token_type);
+	if (!(entry->ute_type & have_type)) {
+	    if (!silent)
+		_nc_warning("expected %s-type for %s, have %s",
+			    usertype2s(entry->ute_type),
+			    name,
+			    usertype2s(have_type));
+	    result = FALSE;
+	}
+    }
+    return result;
+}
+#endif /* NCURSES_XNAMES */
+
+/*
+ * A valid entry name uses characters from the "portable character set"
+ * (more commonly referred to as US-ASCII), and disallows some of the
+ * punctuation characters:
+ *
+ * '/' is a pathname separator
+ * '\' may be a pathname separator, but more important, is an escape
+ * '|' delimits names and description
+ * '#' denotes a numeric value
+ * '=' denotes a string value
+ * '@' denotes a cancelled symbol
+ * ',' separates terminfo capabilities
+ * ':' separates termcap capabilities
+ *
+ * Termcap capability names may begin with a '#' or '@' (since they have
+ * exactly two characters).
+ */
+static bool
+valid_entryname(const char *name)
+{
+    bool result = TRUE;
+    bool first = TRUE;
+    int ch;
+    while ((ch = UChar(*name++)) != '\0') {
+	if (ch <= ' ' || ch > '~' || strchr("/\\|=,:", ch) != NULL) {
+	    result = FALSE;
+	    break;
+	}
+	if (!first && strchr("#@", ch) != NULL) {
+	    result = FALSE;
+	    break;
+	}
+	first = FALSE;
+    }
+    return result;
+}
+
+/*
+ *	int
+ *	_nc_parse_entry(entry, literal, silent)
+ *
+ *	Compile one entry.  Doesn't try to resolve use or tc capabilities.
+ *
+ *	found-forward-use = FALSE
+ *	re-initialise internal arrays
+ *	get_token();
+ *	if the token was not a name in column 1, complain and die
+ *	save names in entry's string table
+ *	while (get_token() is not EOF and not NAMES)
+ *	        check for existence and type-correctness
+ *	        enter cap into structure
+ *	        if STRING
+ *	            save string in entry's string table
+ *	push back token
+ */
+
+#define BAD_TC_USAGE if (!bad_tc_usage) \
+ 	{ bad_tc_usage = TRUE; \
+	 _nc_warning("Legacy termcap allows only a trailing tc= clause"); }
+
+#define MAX_NUMBER MAX_OF_TYPE(NCURSES_INT2)
+
+NCURSES_EXPORT(int)
+_nc_parse_entry(ENTRY * entryp, int literal, bool silent)
+{
+    int token_type;
+    struct name_table_entry const *entry_ptr;
+    char *ptr, *base;
+    const char *name;
+    bool bad_tc_usage = FALSE;
+
+    TR(TRACE_DATABASE,
+       (T_CALLED("_nc_parse_entry(entry=%p, literal=%d, silent=%d)"),
+	(void *) entryp, literal, silent));
+
+    token_type = _nc_get_token(silent);
+
+    if (token_type == EOF)
+	returnDB(EOF);
+    if (token_type != NAMES)
+	_nc_err_abort("Entry does not start with terminal names in column one");
+
+    _nc_init_entry(entryp);
+
+    entryp->cstart = _nc_comment_start;
+    entryp->cend = _nc_comment_end;
+    entryp->startline = _nc_start_line;
+    DEBUG(2, ("Comment range is %ld to %ld", entryp->cstart, entryp->cend));
+
+    /*
+     * Strip off the 2-character termcap name, if present.  Originally termcap
+     * used that as an indexing aid.  We can retain 2-character terminfo names,
+     * but note that they would be lost if we translate to/from termcap.  This
+     * feature is supposedly obsolete since "newer" BSD implementations do not
+     * use it; however our reference for this feature is SunOS 4.x, which
+     * implemented it.  Note that the resulting terminal type was never the
+     * 2-character name, but was instead the first alias after that.
+     */
+#define ok_TC2(s) (isgraph(UChar(s)) && (s) != '|')
+    ptr = _nc_curr_token.tk_name;
+    if (_nc_syntax == SYN_TERMCAP
+#if NCURSES_XNAMES
+	&& !_nc_user_definable
+#endif
+	) {
+	if (ok_TC2(ptr[0]) && ok_TC2(ptr[1]) && (ptr[2] == '|')) {
+	    ptr += 3;
+	    _nc_curr_token.tk_name[2] = '\0';
+	}
+    }
+
+    entryp->tterm.str_table = entryp->tterm.term_names = _nc_save_str(ptr);
+
+    if (entryp->tterm.str_table == 0)
+	returnDB(ERR);
+
+    DEBUG(2, ("Starting '%s'", ptr));
+
+    /*
+     * We do this because the one-token lookahead in the parse loop
+     * results in the terminal type getting prematurely set to correspond
+     * to that of the next entry.
+     */
+    name = _nc_first_name(entryp->tterm.term_names);
+    if (!valid_entryname(name)) {
+	_nc_warning("invalid entry name \"%s\"", name);
+	name = "invalid";
+    }
+    _nc_set_type(name);
+
+    /* check for overly-long names and aliases */
+    for (base = entryp->tterm.term_names; (ptr = strchr(base, '|')) != 0;
+	 base = ptr + 1) {
+	if (ptr - base > MAX_ALIAS) {
+	    _nc_warning("%s `%.*s' may be too long",
+			(base == entryp->tterm.term_names)
+			? "primary name"
+			: "alias",
+			(int) (ptr - base), base);
+	}
+    }
+
+    entryp->nuses = 0;
+
+    for (token_type = _nc_get_token(silent);
+	 token_type != EOF && token_type != NAMES;
+	 token_type = _nc_get_token(silent)) {
+	bool is_use = (strcmp(_nc_curr_token.tk_name, "use") == 0);
+	bool is_tc = !is_use && (strcmp(_nc_curr_token.tk_name, "tc") == 0);
+	if (is_use || is_tc) {
+	    if (!VALID_STRING(_nc_curr_token.tk_valstring)
+		|| _nc_curr_token.tk_valstring[0] == '\0') {
+		_nc_warning("missing name for use-clause");
+		continue;
+	    } else if (!valid_entryname(_nc_curr_token.tk_valstring)) {
+		_nc_warning("invalid name for use-clause \"%s\"",
+			    _nc_curr_token.tk_valstring);
+		continue;
+	    } else if (entryp->nuses >= MAX_USES) {
+		_nc_warning("too many use-clauses, ignored \"%s\"",
+			    _nc_curr_token.tk_valstring);
+		continue;
+	    }
+	    entryp->uses[entryp->nuses].name = _nc_save_str(_nc_curr_token.tk_valstring);
+	    entryp->uses[entryp->nuses].line = _nc_curr_line;
+	    entryp->nuses++;
+	    if (entryp->nuses > 1 && is_tc) {
+		BAD_TC_USAGE
+	    }
+	} else {
+	    /* normal token lookup */
+	    entry_ptr = _nc_find_entry(_nc_curr_token.tk_name,
+				       _nc_get_hash_table(_nc_syntax));
+
+	    /*
+	     * Our kluge to handle aliasing.  The reason it is done
+	     * this ugly way, with a linear search, is so the hashing
+	     * machinery doesn't have to be made really complicated
+	     * (also we get better warnings this way).  No point in
+	     * making this case fast, aliased caps aren't common now
+	     * and will get rarer.
+	     */
+	    if (entry_ptr == NOTFOUND) {
+		const struct alias *ap;
+
+		if (_nc_syntax == SYN_TERMCAP) {
+		    if (entryp->nuses != 0) {
+			BAD_TC_USAGE
+		    }
+		    for (ap = _nc_get_alias_table(TRUE); ap->from; ap++)
+			if (strcmp(ap->from, _nc_curr_token.tk_name) == 0) {
+			    if (ap->to == (char *) 0) {
+				_nc_warning("%s (%s termcap extension) ignored",
+					    ap->from, ap->source);
+				goto nexttok;
+			    }
+
+			    entry_ptr = _nc_find_entry(ap->to,
+						       _nc_get_hash_table(TRUE));
+			    if (entry_ptr && !silent)
+				_nc_warning("%s (%s termcap extension) aliased to %s",
+					    ap->from, ap->source, ap->to);
+			    break;
+			}
+		} else {	/* if (_nc_syntax == SYN_TERMINFO) */
+		    for (ap = _nc_get_alias_table(FALSE); ap->from; ap++)
+			if (strcmp(ap->from, _nc_curr_token.tk_name) == 0) {
+			    if (ap->to == (char *) 0) {
+				_nc_warning("%s (%s terminfo extension) ignored",
+					    ap->from, ap->source);
+				goto nexttok;
+			    }
+
+			    entry_ptr = _nc_find_entry(ap->to,
+						       _nc_get_hash_table(FALSE));
+			    if (entry_ptr && !silent)
+				_nc_warning("%s (%s terminfo extension) aliased to %s",
+					    ap->from, ap->source, ap->to);
+			    break;
+			}
+
+		    if (entry_ptr == NOTFOUND) {
+			entry_ptr = lookup_fullname(_nc_curr_token.tk_name);
+		    }
+		}
+	    }
+#if NCURSES_XNAMES
+	    /*
+	     * If we have extended-names active, we will automatically
+	     * define a name based on its context.
+	     */
+	    if (entry_ptr == NOTFOUND
+		&& _nc_user_definable) {
+		if (expected_type(_nc_curr_token.tk_name, token_type, silent)) {
+		    if ((entry_ptr = _nc_extend_names(entryp,
+						      _nc_curr_token.tk_name,
+						      token_type)) != 0) {
+			if (_nc_tracing >= DEBUG_LEVEL(1)) {
+			    _nc_warning("extended capability '%s'",
+					_nc_curr_token.tk_name);
+			}
+		    }
+		} else {
+		    /* ignore it: we have already printed error message */
+		    continue;
+		}
+	    }
+#endif /* NCURSES_XNAMES */
+
+	    /* can't find this cap name, not even as an alias */
+	    if (entry_ptr == NOTFOUND) {
+		if (!silent)
+		    _nc_warning("unknown capability '%s'",
+				_nc_curr_token.tk_name);
+		continue;
+	    }
+
+	    /* deal with bad type/value combinations. */
+	    if (token_type == CANCEL) {
+		/*
+		 * Prefer terminfo in this (long-obsolete) ambiguity:
+		 */
+		if (!strcmp("ma", _nc_curr_token.tk_name)) {
+		    entry_ptr = _nc_find_type_entry("ma", NUMBER,
+						    _nc_syntax != 0);
+		    assert(entry_ptr != 0);
+		}
+	    } else if (entry_ptr->nte_type != token_type) {
+		/*
+		 * Nasty special cases here handle situations in which type
+		 * information can resolve name clashes.  Normal lookup
+		 * finds the last instance in the capability table of a
+		 * given name, regardless of type.  find_type_entry looks
+		 * for a first matching instance with given type.  So as
+		 * long as all ambiguous names occur in pairs of distinct
+		 * type, this will do the job.
+		 */
+
+		if (token_type == NUMBER
+		    && !strcmp("ma", _nc_curr_token.tk_name)) {
+		    /* tell max_attributes from arrow_key_map */
+		    entry_ptr = _nc_find_type_entry("ma", NUMBER,
+						    _nc_syntax != 0);
+		    assert(entry_ptr != 0);
+
+		} else if (token_type == STRING
+			   && !strcmp("MT", _nc_curr_token.tk_name)) {
+		    /* map terminfo's string MT to MT */
+		    entry_ptr = _nc_find_type_entry("MT", STRING,
+						    _nc_syntax != 0);
+		    assert(entry_ptr != 0);
+
+		} else if (token_type == BOOLEAN
+			   && entry_ptr->nte_type == STRING) {
+		    /* treat strings without following "=" as empty strings */
+		    token_type = STRING;
+		} else {
+		    /* we couldn't recover; skip this token */
+		    if (!silent) {
+			const char *type_name;
+			switch (entry_ptr->nte_type) {
+			case BOOLEAN:
+			    type_name = "boolean";
+			    break;
+			case STRING:
+			    type_name = "string";
+			    break;
+			case NUMBER:
+			    type_name = "numeric";
+			    break;
+			default:
+			    type_name = "unknown";
+			    break;
+			}
+			_nc_warning("wrong type used for %s capability '%s'",
+				    type_name, _nc_curr_token.tk_name);
+		    }
+		    continue;
+		}
+	    }
+
+	    /* now we know that the type/value combination is OK */
+	    switch (token_type) {
+	    case CANCEL:
+		switch (entry_ptr->nte_type) {
+		case BOOLEAN:
+		    entryp->tterm.Booleans[entry_ptr->nte_index] = CANCELLED_BOOLEAN;
+		    break;
+
+		case NUMBER:
+		    entryp->tterm.Numbers[entry_ptr->nte_index] = CANCELLED_NUMERIC;
+		    break;
+
+		case STRING:
+		    entryp->tterm.Strings[entry_ptr->nte_index] = CANCELLED_STRING;
+		    break;
+		}
+		break;
+
+	    case BOOLEAN:
+		entryp->tterm.Booleans[entry_ptr->nte_index] = TRUE;
+		break;
+
+	    case NUMBER:
+#if !NCURSES_EXT_NUMBERS
+		if (_nc_curr_token.tk_valnumber > MAX_NUMBER) {
+		    entryp->tterm.Numbers[entry_ptr->nte_index] = MAX_NUMBER;
+		} else
+#endif
+		{
+		    entryp->tterm.Numbers[entry_ptr->nte_index] =
+			(NCURSES_INT2) _nc_curr_token.tk_valnumber;
+		}
+		break;
+
+	    case STRING:
+		ptr = _nc_curr_token.tk_valstring;
+		if (_nc_syntax == SYN_TERMCAP) {
+		    int n = entry_ptr->nte_index;
+		    ptr = _nc_captoinfo(_nc_curr_token.tk_name,
+					ptr,
+					(n < (int) SIZEOF(parametrized))
+					? parametrized[n]
+					: 0);
+		}
+		entryp->tterm.Strings[entry_ptr->nte_index] = _nc_save_str(ptr);
+		break;
+
+	    default:
+		if (!silent)
+		    _nc_warning("unknown token type");
+		_nc_panic_mode((char) ((_nc_syntax == SYN_TERMCAP) ? ':' : ','));
+		continue;
+	    }
+	}			/* end else cur_token.name != "use" */
+      nexttok:
+	continue;		/* cannot have a label w/o statement */
+    }				/* endwhile (not EOF and not NAMES) */
+
+    _nc_push_token(token_type);
+    _nc_set_type(_nc_first_name(entryp->tterm.term_names));
+
+    /*
+     * Try to deduce as much as possible from extension capabilities
+     * (this includes obsolete BSD capabilities).  Sigh...it would be more
+     * space-efficient to call this after use resolution, but it has
+     * to be done before entry allocation is wrapped up.
+     */
+    if (!literal) {
+	if (_nc_syntax == SYN_TERMCAP) {
+	    bool has_base_entry = FALSE;
+
+	    /*
+	     * Don't insert defaults if this is a `+' entry meant only
+	     * for inclusion in other entries (not sure termcap ever
+	     * had these, actually).
+	     */
+	    if (strchr(entryp->tterm.term_names, '+')) {
+		has_base_entry = TRUE;
+	    } else {
+		unsigned i;
+		/*
+		 * Otherwise, look for a base entry that will already
+		 * have picked up defaults via translation.
+		 */
+		for (i = 0; i < entryp->nuses; i++) {
+		    if (entryp->uses[i].name != 0
+			&& !strchr(entryp->uses[i].name, '+'))
+			has_base_entry = TRUE;
+		}
+	    }
+
+	    postprocess_termcap(&entryp->tterm, has_base_entry);
+	} else
+	    postprocess_terminfo(&entryp->tterm);
+    }
+    _nc_wrap_entry(entryp, FALSE);
+
+    returnDB(OK);
+}
+
+NCURSES_EXPORT(int)
+_nc_capcmp(const char *s, const char *t)
+/* compare two string capabilities, stripping out padding */
+{
+    bool ok_s = VALID_STRING(s);
+    bool ok_t = VALID_STRING(t);
+
+    if (ok_s && ok_t) {
+	for (;;) {
+	    if (s[0] == '$' && s[1] == '<') {
+		for (s += 2;; s++) {
+		    if (!(isdigit(UChar(*s))
+			  || *s == '.'
+			  || *s == '*'
+			  || *s == '/'
+			  || *s == '>')) {
+			break;
+		    }
+		}
+	    }
+
+	    if (t[0] == '$' && t[1] == '<') {
+		for (t += 2;; t++) {
+		    if (!(isdigit(UChar(*t))
+			  || *t == '.'
+			  || *t == '*'
+			  || *t == '/'
+			  || *t == '>')) {
+			break;
+		    }
+		}
+	    }
+
+	    /* we've now pushed s and t past any padding they pointed at */
+
+	    if (*s == '\0' && *t == '\0')
+		return (0);
+
+	    if (*s != *t)
+		return (*t - *s);
+
+	    /* else *s == *t but one is not NUL, so continue */
+	    s++, t++;
+	}
+    } else if (ok_s || ok_t) {
+	return 1;
+    }
+    return 0;
+}
+
+static void
+append_acs0(string_desc * dst, int code, char *src, size_t off)
+{
+    if (src != 0 && off < strlen(src)) {
+	char temp[3];
+	temp[0] = (char) code;
+	temp[1] = src[off];
+	temp[2] = 0;
+	_nc_safe_strcat(dst, temp);
+    }
+}
+
+static void
+append_acs(string_desc * dst, int code, char *src)
+{
+    if (VALID_STRING(src) && strlen(src) == 1) {
+	append_acs0(dst, code, src, 0);
+    }
+}
+
+/*
+ * The ko capability, if present, consists of a comma-separated capability
+ * list.  For each capability, we may assume there is a keycap that sends the
+ * string which is the value of that capability.
+ */
+#define DATA(from, to) { { from }, { to } }
+typedef struct {
+    const char from[3];
+    const char to[6];
+} assoc;
+static assoc const ko_xlate[] =
+{
+    DATA("al", "kil1"),		/* insert line key  -> KEY_IL    */
+    DATA("bt", "kcbt"),		/* back tab         -> KEY_BTAB  */
+    DATA("cd", "ked"),		/* clear-to-eos key -> KEY_EOL   */
+    DATA("ce", "kel"),		/* clear-to-eol key -> KEY_EOS   */
+    DATA("cl", "kclr"),		/* clear key        -> KEY_CLEAR */
+    DATA("ct", "tbc"),		/* clear all tabs   -> KEY_CATAB */
+    DATA("dc", "kdch1"),	/* delete char      -> KEY_DC    */
+    DATA("dl", "kdl1"),		/* delete line      -> KEY_DL    */
+    DATA("do", "kcud1"),	/* down key         -> KEY_DOWN  */
+    DATA("ei", "krmir"),	/* exit insert key  -> KEY_EIC   */
+    DATA("ho", "khome"),	/* home key         -> KEY_HOME  */
+    DATA("ic", "kich1"),	/* insert char key  -> KEY_IC    */
+    DATA("im", "kIC"),		/* insert-mode key  -> KEY_SIC   */
+    DATA("le", "kcub1"),	/* le key           -> KEY_LEFT  */
+    DATA("nd", "kcuf1"),	/* nd key           -> KEY_RIGHT */
+    DATA("nl", "kent"),		/* new line key     -> KEY_ENTER */
+    DATA("st", "khts"),		/* set-tab key      -> KEY_STAB  */
+    DATA("ta", ""),
+    DATA("up", "kcuu1"),	/* up-arrow key     -> KEY_UP    */
+};
+
+/*
+ * This routine fills in string caps that either had defaults under
+ * termcap or can be manufactured from obsolete termcap capabilities.
+ * It was lifted from Ross Ridge's mytinfo package.
+ */
+
+static const char C_CR[] = "\r";
+static const char C_LF[] = "\n";
+static const char C_BS[] = "\b";
+static const char C_HT[] = "\t";
+
+/*
+ * This bit of legerdemain turns all the terminfo variable names into
+ * references to locations in the arrays Booleans, Numbers, and Strings ---
+ * precisely what's needed.
+ */
+
+#undef CUR
+#define CUR tp->
+
+static void
+postprocess_termcap(TERMTYPE2 *tp, bool has_base)
+{
+    char buf[MAX_LINE * 2 + 2];
+    string_desc result;
+
+    TR(TRACE_DATABASE,
+       (T_CALLED("postprocess_termcap(tp=%p, has_base=%d)"),
+	(void *) tp, has_base));
+
+    /*
+     * TERMCAP DEFAULTS AND OBSOLETE-CAPABILITY TRANSLATIONS
+     *
+     * This first part of the code is the functional inverse of the
+     * fragment in capdefaults.c.
+     * ----------------------------------------------------------------------
+     */
+
+    /* if there was a tc entry, assume we picked up defaults via that */
+    if (!has_base) {
+	if (WANTED(init_3string) && PRESENT(termcap_init2))
+	    init_3string = _nc_save_str(termcap_init2);
+
+	if (WANTED(reset_2string) && PRESENT(termcap_reset))
+	    reset_2string = _nc_save_str(termcap_reset);
+
+	if (WANTED(carriage_return)) {
+	    if (carriage_return_delay > 0) {
+		_nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf))
+			    "%s$<%d>", C_CR, carriage_return_delay);
+		carriage_return = _nc_save_str(buf);
+	    } else
+		carriage_return = _nc_save_str(C_CR);
+	}
+	if (WANTED(cursor_left)) {
+	    if (backspace_delay > 0) {
+		_nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf))
+			    "%s$<%d>", C_BS, backspace_delay);
+		cursor_left = _nc_save_str(buf);
+	    } else if (backspaces_with_bs == 1)
+		cursor_left = _nc_save_str(C_BS);
+	    else if (PRESENT(backspace_if_not_bs))
+		cursor_left = backspace_if_not_bs;
+	}
+	/* vi doesn't use "do", but it does seem to use nl (or '\n') instead */
+	if (WANTED(cursor_down)) {
+	    if (PRESENT(linefeed_if_not_lf))
+		cursor_down = linefeed_if_not_lf;
+	    else if (linefeed_is_newline != 1) {
+		if (new_line_delay > 0) {
+		    _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf))
+				"%s$<%d>", C_LF, new_line_delay);
+		    cursor_down = _nc_save_str(buf);
+		} else
+		    cursor_down = _nc_save_str(C_LF);
+	    }
+	}
+	if (WANTED(scroll_forward) && crt_no_scrolling != 1) {
+	    if (PRESENT(linefeed_if_not_lf))
+		cursor_down = linefeed_if_not_lf;
+	    else if (linefeed_is_newline != 1) {
+		if (new_line_delay > 0) {
+		    _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf))
+				"%s$<%d>", C_LF, new_line_delay);
+		    scroll_forward = _nc_save_str(buf);
+		} else
+		    scroll_forward = _nc_save_str(C_LF);
+	    }
+	}
+	if (WANTED(newline)) {
+	    if (linefeed_is_newline == 1) {
+		if (new_line_delay > 0) {
+		    _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf))
+				"%s$<%d>", C_LF, new_line_delay);
+		    newline = _nc_save_str(buf);
+		} else
+		    newline = _nc_save_str(C_LF);
+	    } else if (PRESENT(carriage_return) && PRESENT(scroll_forward)) {
+		_nc_str_init(&result, buf, sizeof(buf));
+		if (_nc_safe_strcat(&result, carriage_return)
+		    && _nc_safe_strcat(&result, scroll_forward))
+		    newline = _nc_save_str(buf);
+	    } else if (PRESENT(carriage_return) && PRESENT(cursor_down)) {
+		_nc_str_init(&result, buf, sizeof(buf));
+		if (_nc_safe_strcat(&result, carriage_return)
+		    && _nc_safe_strcat(&result, cursor_down))
+		    newline = _nc_save_str(buf);
+	    }
+	}
+    }
+
+    /*
+     * Inverse of capdefaults.c code ends here.
+     * ----------------------------------------------------------------------
+     *
+     * TERMCAP-TO TERMINFO MAPPINGS FOR SOURCE TRANSLATION
+     *
+     * These translations will *not* be inverted by tgetent().
+     */
+
+    if (!has_base) {
+	/*
+	 * We wait until now to decide if we've got a working cr because even
+	 * one that doesn't work can be used for newline. Unfortunately the
+	 * space allocated for it is wasted.
+	 */
+	if (return_does_clr_eol == 1 || no_correctly_working_cr == 1)
+	    carriage_return = ABSENT_STRING;
+
+	/*
+	 * Supposedly most termcap entries have ta now and '\t' is no longer a
+	 * default, but it doesn't seem to be true...
+	 */
+	if (WANTED(tab)) {
+	    if (horizontal_tab_delay > 0) {
+		_nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf))
+			    "%s$<%d>", C_HT, horizontal_tab_delay);
+		tab = _nc_save_str(buf);
+	    } else
+		tab = _nc_save_str(C_HT);
+	}
+	if (init_tabs == ABSENT_NUMERIC && has_hardware_tabs == TRUE)
+	    init_tabs = 8;
+
+	/*
+	 * Assume we can beep with ^G unless we're given bl@.
+	 */
+	if (WANTED(bell))
+	    bell = _nc_save_str("\007");
+    }
+
+    /*
+     * Translate the old termcap :pt: capability to it#8 + ht=\t
+     */
+    if (has_hardware_tabs == TRUE) {
+	if (init_tabs != 8 && init_tabs != ABSENT_NUMERIC)
+	    _nc_warning("hardware tabs with a width other than 8: %d", init_tabs);
+	else {
+	    if (PRESENT(tab) && _nc_capcmp(tab, C_HT))
+		_nc_warning("hardware tabs with a non-^I tab string %s",
+			    _nc_visbuf(tab));
+	    else {
+		if (WANTED(tab))
+		    tab = _nc_save_str(C_HT);
+		init_tabs = 8;
+	    }
+	}
+    }
+    /*
+     * Now translate the ko capability, if there is one.  This
+     * isn't from mytinfo...
+     */
+    if (PRESENT(other_non_function_keys)) {
+	char *base;
+	char *bp, *cp, *dp;
+	struct name_table_entry const *from_ptr;
+	struct name_table_entry const *to_ptr;
+	char buf2[MAX_TERMINFO_LENGTH];
+	bool foundim;
+
+	/* we're going to use this for a special case later */
+	dp = strchr(other_non_function_keys, 'i');
+	foundim = (dp != 0) && (dp[1] == 'm');
+
+	/* look at each comma-separated capability in the ko string... */
+	for (base = other_non_function_keys;
+	     (cp = strchr(base, ',')) != 0;
+	     base = cp + 1) {
+	    size_t len = (unsigned) (cp - base);
+	    size_t n;
+	    assoc const *ap = 0;
+
+	    for (n = 0; n < SIZEOF(ko_xlate); ++n) {
+		if (len == strlen(ko_xlate[n].from)
+		    && strncmp(ko_xlate[n].from, base, len) == 0) {
+		    ap = ko_xlate + n;
+		    break;
+		}
+	    }
+	    if (ap == 0) {
+		_nc_warning("unknown capability `%.*s' in ko string",
+			    (int) len, base);
+		continue;
+	    } else if (ap->to[0] == '\0')	/* ignore it */
+		continue;
+
+	    /* now we know we found a match in ko_table, so... */
+
+	    from_ptr = _nc_find_entry(ap->from, _nc_get_hash_table(TRUE));
+	    to_ptr = _nc_find_entry(ap->to, _nc_get_hash_table(FALSE));
+
+	    if (!from_ptr || !to_ptr)	/* should never happen! */
+		_nc_err_abort("ko translation table is invalid, I give up");
+
+	    if (WANTED(tp->Strings[from_ptr->nte_index])) {
+		_nc_warning("no value for ko capability %s", ap->from);
+		continue;
+	    }
+
+	    if (tp->Strings[to_ptr->nte_index]) {
+		const char *s = tp->Strings[from_ptr->nte_index];
+		const char *t = tp->Strings[to_ptr->nte_index];
+		/* There's no point in warning about it if it is the same
+		 * string; that's just an inefficiency.
+		 */
+		if (VALID_STRING(s) && VALID_STRING(t) && strcmp(s, t) != 0)
+		    _nc_warning("%s (%s) already has an explicit value %s, ignoring ko",
+				ap->to, ap->from, t);
+		continue;
+	    }
+
+	    /*
+	     * The magic moment -- copy the mapped key string over,
+	     * stripping out padding.
+	     */
+	    bp = tp->Strings[from_ptr->nte_index];
+	    if (VALID_STRING(bp)) {
+		for (dp = buf2; *bp; bp++) {
+		    if (bp[0] == '$' && bp[1] == '<') {
+			while (*bp && *bp != '>') {
+			    ++bp;
+			}
+		    } else
+			*dp++ = *bp;
+		}
+		*dp = '\0';
+
+		tp->Strings[to_ptr->nte_index] = _nc_save_str(buf2);
+	    } else {
+		tp->Strings[to_ptr->nte_index] = bp;
+	    }
+	}
+
+	/*
+	 * Note: ko=im and ko=ic both want to grab the `Insert'
+	 * keycap.  There's a kich1 but no ksmir, so the ic capability
+	 * got mapped to kich1 and im to kIC to avoid a collision.
+	 * If the description has im but not ic, hack kIC back to kich1.
+	 */
+	if (foundim && WANTED(key_ic) && PRESENT(key_sic)) {
+	    key_ic = key_sic;
+	    key_sic = ABSENT_STRING;
+	}
+    }
+
+    if (!has_base) {
+	if (!hard_copy) {
+	    if (WANTED(key_backspace))
+		key_backspace = _nc_save_str(C_BS);
+	    if (WANTED(key_left))
+		key_left = _nc_save_str(C_BS);
+	    if (WANTED(key_down))
+		key_down = _nc_save_str(C_LF);
+	}
+    }
+
+    /*
+     * Translate XENIX forms characters.
+     */
+    if (PRESENT(acs_ulcorner) ||
+	PRESENT(acs_llcorner) ||
+	PRESENT(acs_urcorner) ||
+	PRESENT(acs_lrcorner) ||
+	PRESENT(acs_ltee) ||
+	PRESENT(acs_rtee) ||
+	PRESENT(acs_btee) ||
+	PRESENT(acs_ttee) ||
+	PRESENT(acs_hline) ||
+	PRESENT(acs_vline) ||
+	PRESENT(acs_plus)) {
+	char buf2[MAX_TERMCAP_LENGTH];
+
+	_nc_str_init(&result, buf2, sizeof(buf2));
+	_nc_safe_strcat(&result, acs_chars);
+
+	append_acs(&result, 'j', acs_lrcorner);
+	append_acs(&result, 'k', acs_urcorner);
+	append_acs(&result, 'l', acs_ulcorner);
+	append_acs(&result, 'm', acs_llcorner);
+	append_acs(&result, 'n', acs_plus);
+	append_acs(&result, 'q', acs_hline);
+	append_acs(&result, 't', acs_ltee);
+	append_acs(&result, 'u', acs_rtee);
+	append_acs(&result, 'v', acs_btee);
+	append_acs(&result, 'w', acs_ttee);
+	append_acs(&result, 'x', acs_vline);
+
+	if (buf2[0]) {
+	    acs_chars = _nc_save_str(buf2);
+	    _nc_warning("acsc string synthesized from XENIX capabilities");
+	}
+    } else if (acs_chars == ABSENT_STRING
+	       && PRESENT(enter_alt_charset_mode)
+	       && PRESENT(exit_alt_charset_mode)) {
+	acs_chars = _nc_save_str(VT_ACSC);
+    }
+    returnVoidDB;
+}
+
+static void
+postprocess_terminfo(TERMTYPE2 *tp)
+{
+    TR(TRACE_DATABASE,
+       (T_CALLED("postprocess_terminfo(tp=%p)"),
+	(void *) tp));
+
+    /*
+     * TERMINFO-TO-TERMINFO MAPPINGS FOR SOURCE TRANSLATION
+     * ----------------------------------------------------------------------
+     */
+
+    /*
+     * Translate AIX forms characters.
+     */
+    if (PRESENT(box_chars_1)) {
+	char buf2[MAX_TERMCAP_LENGTH];
+	string_desc result;
+
+	_nc_str_init(&result, buf2, sizeof(buf2));
+	_nc_safe_strcat(&result, acs_chars);
+
+	append_acs0(&result, 'l', box_chars_1, 0);	/* ACS_ULCORNER */
+	append_acs0(&result, 'q', box_chars_1, 1);	/* ACS_HLINE */
+	append_acs0(&result, 'k', box_chars_1, 2);	/* ACS_URCORNER */
+	append_acs0(&result, 'x', box_chars_1, 3);	/* ACS_VLINE */
+	append_acs0(&result, 'j', box_chars_1, 4);	/* ACS_LRCORNER */
+	append_acs0(&result, 'm', box_chars_1, 5);	/* ACS_LLCORNER */
+	append_acs0(&result, 'w', box_chars_1, 6);	/* ACS_TTEE */
+	append_acs0(&result, 'u', box_chars_1, 7);	/* ACS_RTEE */
+	append_acs0(&result, 'v', box_chars_1, 8);	/* ACS_BTEE */
+	append_acs0(&result, 't', box_chars_1, 9);	/* ACS_LTEE */
+	append_acs0(&result, 'n', box_chars_1, 10);	/* ACS_PLUS */
+
+	if (buf2[0]) {
+	    acs_chars = _nc_save_str(buf2);
+	    _nc_warning("acsc string synthesized from AIX capabilities");
+	    box_chars_1 = ABSENT_STRING;
+	}
+    }
+    /*
+     * ----------------------------------------------------------------------
+     */
+    returnVoidDB;
+}
+
+/*
+ * Do a linear search through the terminfo tables to find a given full-name.
+ * We don't expect to do this often, so there's no hashing function.
+ *
+ * In effect, this scans through the 3 lists of full-names, and looks them
+ * up in _nc_info_table, which is organized so that the nte_index fields are
+ * sorted, but the nte_type fields are not necessarily grouped together.
+ */
+static struct name_table_entry const *
+lookup_fullname(const char *find)
+{
+    int state = -1;
+
+    for (;;) {
+	int count = 0;
+	NCURSES_CONST char *const *names;
+
+	switch (++state) {
+	case BOOLEAN:
+	    names = boolfnames;
+	    break;
+	case STRING:
+	    names = strfnames;
+	    break;
+	case NUMBER:
+	    names = numfnames;
+	    break;
+	default:
+	    return NOTFOUND;
+	}
+
+	for (count = 0; names[count] != 0; count++) {
+	    if (!strcmp(names[count], find)) {
+		struct name_table_entry const *entry_ptr = _nc_get_table(FALSE);
+		while (entry_ptr->nte_type != state
+		       || entry_ptr->nte_index != count)
+		    entry_ptr++;
+		return entry_ptr;
+	    }
+	}
+    }
+}
+
+/* parse_entry.c ends here */
diff --git a/ncurses/tinfo/read_entry.c b/ncurses/tinfo/read_entry.c
new file mode 100644
index 0000000..2b1875e
--- /dev/null
+++ b/ncurses/tinfo/read_entry.c
@@ -0,0 +1,905 @@
+/****************************************************************************
+ * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ ****************************************************************************/
+
+/*
+ *	read_entry.c -- Routine for reading in a compiled terminfo file
+ */
+
+#include <curses.priv.h>
+#include <hashed_db.h>
+
+#include <tic.h>
+
+MODULE_ID("$Id: read_entry.c,v 1.164 2022/05/08 00:11:44 tom Exp $")
+
+#define MyNumber(n) (short) LOW_MSB(n)
+
+#define SIZEOF_32BITS 4
+
+#if NCURSES_USE_DATABASE
+#if NCURSES_EXT_NUMBERS
+static size_t
+convert_16bits(char *buf, NCURSES_INT2 *Numbers, int count)
+{
+    int i;
+    size_t j;
+    size_t size = SIZEOF_SHORT;
+    for (i = 0; i < count; i++) {
+	unsigned mask = 0xff;
+	unsigned char ch = 0;
+	Numbers[i] = 0;
+	for (j = 0; j < size; ++j) {
+	    ch = UChar(*buf++);
+	    Numbers[i] |= (ch << (8 * j));
+	    mask <<= 8;
+	}
+	if (ch & 0x80) {
+	    while (mask != 0) {
+		Numbers[i] |= (int) mask;
+		mask <<= 8;
+	    }
+	}
+	TR(TRACE_DATABASE, ("get Numbers[%d]=%d", i, Numbers[i]));
+    }
+    return size;
+}
+
+static size_t
+convert_32bits(char *buf, NCURSES_INT2 *Numbers, int count)
+{
+    int i;
+    size_t j;
+    size_t size = SIZEOF_INT2;
+    unsigned char ch;
+
+    assert(sizeof(NCURSES_INT2) == size);
+    for (i = 0; i < count; i++) {
+	Numbers[i] = 0;
+	for (j = 0; j < size; ++j) {
+	    ch = UChar(*buf++);
+	    Numbers[i] |= (ch << (8 * j));
+	}
+	/* "unsigned" and NCURSES_INT2 are the same size - no sign-extension */
+	TR(TRACE_DATABASE, ("get Numbers[%d]=%d", i, Numbers[i]));
+    }
+    return size;
+}
+#else
+static size_t
+convert_32bits(char *buf, NCURSES_INT2 *Numbers, int count)
+{
+    int i, j;
+    unsigned char ch;
+    for (i = 0; i < count; i++) {
+	int value = 0;
+	for (j = 0; j < SIZEOF_32BITS; ++j) {
+	    ch = UChar(*buf++);
+	    value |= (ch << (8 * j));
+	}
+	if (value == -1)
+	    Numbers[i] = ABSENT_NUMERIC;
+	else if (value == -2)
+	    Numbers[i] = CANCELLED_NUMERIC;
+	else if (value > MAX_OF_TYPE(NCURSES_INT2))
+	    Numbers[i] = MAX_OF_TYPE(NCURSES_INT2);
+	else
+	    Numbers[i] = (short) value;
+	TR(TRACE_DATABASE, ("get Numbers[%d]=%d", i, Numbers[i]));
+    }
+    return SIZEOF_SHORT;
+}
+
+static size_t
+convert_16bits(char *buf, NCURSES_INT2 *Numbers, int count)
+{
+    int i;
+    for (i = 0; i < count; i++) {
+	if (IS_NEG1(buf + 2 * i))
+	    Numbers[i] = ABSENT_NUMERIC;
+	else if (IS_NEG2(buf + 2 * i))
+	    Numbers[i] = CANCELLED_NUMERIC;
+	else
+	    Numbers[i] = MyNumber(buf + 2 * i);
+	TR(TRACE_DATABASE, ("get Numbers[%d]=%d", i, Numbers[i]));
+    }
+    return SIZEOF_SHORT;
+}
+#endif
+
+static void
+convert_strings(char *buf, char **Strings, int count, int size, char *table)
+{
+    int i;
+    char *p;
+    bool corrupt = FALSE;
+
+    for (i = 0; i < count; i++) {
+	if (IS_NEG1(buf + 2 * i)) {
+	    Strings[i] = ABSENT_STRING;
+	} else if (IS_NEG2(buf + 2 * i)) {
+	    Strings[i] = CANCELLED_STRING;
+	} else if (MyNumber(buf + 2 * i) > size) {
+	    Strings[i] = ABSENT_STRING;
+	} else {
+	    int nn = MyNumber(buf + 2 * i);
+	    if (nn >= 0 && nn < size) {
+		Strings[i] = (nn + table);
+		TR(TRACE_DATABASE, ("Strings[%d] = %s", i,
+				    _nc_visbuf(Strings[i])));
+	    } else {
+		if (!corrupt) {
+		    corrupt = TRUE;
+		    TR(TRACE_DATABASE,
+		       ("ignore out-of-range index %d to Strings[]", nn));
+		    _nc_warning("corrupt data found in convert_strings");
+		}
+		Strings[i] = ABSENT_STRING;
+	    }
+	}
+
+	/* make sure all strings are NUL terminated */
+	if (VALID_STRING(Strings[i])) {
+	    for (p = Strings[i]; p < table + size; p++)
+		if (*p == '\0')
+		    break;
+	    /* if there is no NUL, ignore the string */
+	    if (p >= table + size)
+		Strings[i] = ABSENT_STRING;
+	}
+    }
+}
+
+static int
+fake_read(char *src, int *offset, int limit, char *dst, unsigned want)
+{
+    int have = (limit - *offset);
+
+    if (have > 0) {
+	if ((int) want > have)
+	    want = (unsigned) have;
+	memcpy(dst, src + *offset, (size_t) want);
+	*offset += (int) want;
+    } else {
+	want = 0;
+    }
+    return (int) want;
+}
+
+#define Read(buf, count) fake_read(buffer, &offset, limit, (char *) buf, (unsigned) count)
+
+#define read_shorts(buf, count) \
+	(Read(buf, (count)*SIZEOF_SHORT) == (int) (count)*SIZEOF_SHORT)
+
+#define read_numbers(buf, count) \
+	(Read(buf, (count)*(unsigned)size_of_numbers) == (int) (count)*size_of_numbers)
+
+#define even_boundary(value) \
+    if ((value) % 2 != 0) Read(buf, 1)
+#endif
+
+NCURSES_EXPORT(void)
+_nc_init_termtype(TERMTYPE2 *const tp)
+{
+    unsigned i;
+
+    DEBUG(2, (T_CALLED("_nc_init_termtype(tp=%p)"), (void *) tp));
+
+#if NCURSES_XNAMES
+    tp->num_Booleans = BOOLCOUNT;
+    tp->num_Numbers = NUMCOUNT;
+    tp->num_Strings = STRCOUNT;
+    tp->ext_Booleans = 0;
+    tp->ext_Numbers = 0;
+    tp->ext_Strings = 0;
+#endif
+    if (tp->Booleans == 0)
+	TYPE_MALLOC(NCURSES_SBOOL, BOOLCOUNT, tp->Booleans);
+    if (tp->Numbers == 0)
+	TYPE_MALLOC(NCURSES_INT2, NUMCOUNT, tp->Numbers);
+    if (tp->Strings == 0)
+	TYPE_MALLOC(char *, STRCOUNT, tp->Strings);
+
+    for_each_boolean(i, tp)
+	tp->Booleans[i] = FALSE;
+
+    for_each_number(i, tp)
+	tp->Numbers[i] = ABSENT_NUMERIC;
+
+    for_each_string(i, tp)
+	tp->Strings[i] = ABSENT_STRING;
+
+    DEBUG(2, (T_RETURN("")));
+}
+
+#if NCURSES_USE_DATABASE
+#if NCURSES_XNAMES
+static bool
+valid_shorts(char *buffer, int limit)
+{
+    bool result = FALSE;
+    int n;
+    for (n = 0; n < limit; ++n) {
+	if (MyNumber(buffer + (n * 2)) > 0) {
+	    result = TRUE;
+	    break;
+	}
+    }
+    return result;
+}
+#endif
+
+/*
+ * Return TGETENT_YES if read, TGETENT_NO if not found or garbled.
+ */
+NCURSES_EXPORT(int)
+_nc_read_termtype(TERMTYPE2 *ptr, char *buffer, int limit)
+{
+    int offset = 0;
+    int name_size, bool_count, num_count, str_count, str_size;
+    int i;
+    char buf[MAX_ENTRY_SIZE + 2];
+    char *string_table;
+    unsigned want, have;
+    size_t (*convert_numbers) (char *, NCURSES_INT2 *, int);
+    int size_of_numbers;
+    int max_entry_size = MAX_ENTRY_SIZE;
+
+    TR(TRACE_DATABASE,
+       (T_CALLED("_nc_read_termtype(ptr=%p, buffer=%p, limit=%d)"),
+	(void *) ptr, buffer, limit));
+
+    TR(TRACE_DATABASE, ("READ termtype header @%d", offset));
+
+    memset(ptr, 0, sizeof(*ptr));
+
+    /* grab the header */
+    if (!read_shorts(buf, 6)
+	|| !IS_TIC_MAGIC(buf)) {
+	returnDB(TGETENT_NO);
+    }
+#if NCURSES_EXT_NUMBERS
+    if (LOW_MSB(buf) == MAGIC2) {
+	convert_numbers = convert_32bits;
+	size_of_numbers = SIZEOF_INT2;
+    } else {
+	max_entry_size = MAX_ENTRY_SIZE1;
+	convert_numbers = convert_16bits;
+	size_of_numbers = SIZEOF_SHORT;
+    }
+#else
+    if (LOW_MSB(buf) == MAGIC2) {
+	convert_numbers = convert_32bits;
+	size_of_numbers = SIZEOF_32BITS;
+    } else {
+	convert_numbers = convert_16bits;
+	size_of_numbers = SIZEOF_INT2;
+    }
+#endif
+
+    /* *INDENT-EQLS* */
+    name_size  = MyNumber(buf + 2);
+    bool_count = MyNumber(buf + 4);
+    num_count  = MyNumber(buf + 6);
+    str_count  = MyNumber(buf + 8);
+    str_size   = MyNumber(buf + 10);
+
+    TR(TRACE_DATABASE,
+       ("TERMTYPE name_size=%d, bool=%d/%d, num=%d/%d str=%d/%d(%d)",
+	name_size, bool_count, BOOLCOUNT, num_count, NUMCOUNT,
+	str_count, STRCOUNT, str_size));
+    if (name_size < 0
+	|| bool_count < 0
+	|| num_count < 0
+	|| str_count < 0
+	|| str_size < 0) {
+	returnDB(TGETENT_NO);
+    }
+
+    want = (unsigned) (str_size + name_size + 1);
+    /* try to allocate space for the string table */
+    if (str_count * SIZEOF_SHORT >= max_entry_size
+	|| (string_table = typeMalloc(char, want)) == 0) {
+	returnDB(TGETENT_NO);
+    }
+
+    /* grab the name (a null-terminated string) */
+    want = min(MAX_NAME_SIZE, (unsigned) name_size);
+    ptr->str_table = string_table;
+    ptr->term_names = string_table;
+    if ((have = (unsigned) Read(ptr->term_names, want)) != want) {
+	memset(ptr->term_names + have, 0, (size_t) (want - have));
+    }
+    ptr->term_names[want] = '\0';
+    string_table += (want + 1);
+
+    if (have > MAX_NAME_SIZE)
+	offset = (int) (have - MAX_NAME_SIZE);
+
+    /* grab the booleans */
+    TYPE_CALLOC(NCURSES_SBOOL, max(BOOLCOUNT, bool_count), ptr->Booleans);
+    if (Read(ptr->Booleans, (unsigned) bool_count) < bool_count) {
+	returnDB(TGETENT_NO);
+    }
+
+    /*
+     * If booleans end on an odd byte, skip it.  The machine they
+     * originally wrote terminfo on must have been a 16-bit
+     * word-oriented machine that would trap out if you tried a
+     * word access off a 2-byte boundary.
+     */
+    even_boundary(name_size + bool_count);
+
+    /* grab the numbers */
+    TYPE_CALLOC(NCURSES_INT2, max(NUMCOUNT, num_count), ptr->Numbers);
+    if (!read_numbers(buf, num_count)) {
+	returnDB(TGETENT_NO);
+    }
+    convert_numbers(buf, ptr->Numbers, num_count);
+
+    TYPE_CALLOC(char *, max(STRCOUNT, str_count), ptr->Strings);
+
+    if (str_count) {
+	/* grab the string offsets */
+	if (!read_shorts(buf, str_count)) {
+	    returnDB(TGETENT_NO);
+	}
+	/* finally, grab the string table itself */
+	if (Read(string_table, (unsigned) str_size) != str_size) {
+	    returnDB(TGETENT_NO);
+	}
+	convert_strings(buf, ptr->Strings, str_count, str_size, string_table);
+    }
+#if NCURSES_XNAMES
+
+    ptr->num_Booleans = BOOLCOUNT;
+    ptr->num_Numbers = NUMCOUNT;
+    ptr->num_Strings = STRCOUNT;
+
+    /*
+     * Read extended entries, if any, after the normal end of terminfo data.
+     */
+    even_boundary(str_size);
+    TR(TRACE_DATABASE, ("READ extended_header @%d", offset));
+    if (_nc_user_definable && read_shorts(buf, 5) && valid_shorts(buf, 5)) {
+	int ext_bool_count = MyNumber(buf + 0);
+	int ext_num_count = MyNumber(buf + 2);
+	int ext_str_count = MyNumber(buf + 4);
+	int ext_str_usage = MyNumber(buf + 6);
+	int ext_str_limit = MyNumber(buf + 8);
+	unsigned need = (unsigned) (ext_bool_count + ext_num_count + ext_str_count);
+	int base = 0;
+
+	if ((int) need >= (max_entry_size / 2)
+	    || ext_str_usage >= max_entry_size
+	    || ext_str_limit >= max_entry_size
+	    || ext_bool_count < 0
+	    || ext_num_count < 0
+	    || ext_str_count < 0
+	    || ext_str_usage < 0
+	    || ext_str_limit < 0) {
+	    returnDB(TGETENT_NO);
+	}
+
+	ptr->num_Booleans = UShort(BOOLCOUNT + ext_bool_count);
+	ptr->num_Numbers = UShort(NUMCOUNT + ext_num_count);
+	ptr->num_Strings = UShort(STRCOUNT + ext_str_count);
+
+	TYPE_REALLOC(NCURSES_SBOOL, ptr->num_Booleans, ptr->Booleans);
+	TYPE_REALLOC(NCURSES_INT2, ptr->num_Numbers, ptr->Numbers);
+	TYPE_REALLOC(char *, ptr->num_Strings, ptr->Strings);
+
+	TR(TRACE_DATABASE, ("extended header: "
+			    "bool %d, "
+			    "number %d, "
+			    "string %d(%d:%d)",
+			    ext_bool_count,
+			    ext_num_count,
+			    ext_str_count,
+			    ext_str_usage,
+			    ext_str_limit));
+
+	TR(TRACE_DATABASE, ("READ %d extended-booleans @%d",
+			    ext_bool_count, offset));
+	if ((ptr->ext_Booleans = UShort(ext_bool_count)) != 0) {
+	    if (Read(ptr->Booleans + BOOLCOUNT, (unsigned)
+		     ext_bool_count) != ext_bool_count) {
+		returnDB(TGETENT_NO);
+	    }
+	}
+	even_boundary(ext_bool_count);
+
+	TR(TRACE_DATABASE, ("READ %d extended-numbers @%d",
+			    ext_num_count, offset));
+	if ((ptr->ext_Numbers = UShort(ext_num_count)) != 0) {
+	    if (!read_numbers(buf, ext_num_count)) {
+		returnDB(TGETENT_NO);
+	    }
+	    TR(TRACE_DATABASE, ("Before converting extended-numbers"));
+	    convert_numbers(buf, ptr->Numbers + NUMCOUNT, ext_num_count);
+	}
+
+	TR(TRACE_DATABASE, ("READ extended-offsets @%d", offset));
+	if ((ext_str_count + (int) need) >= (max_entry_size / 2)) {
+	    returnDB(TGETENT_NO);
+	}
+	if ((ext_str_count || need)
+	    && !read_shorts(buf, ext_str_count + (int) need)) {
+	    returnDB(TGETENT_NO);
+	}
+
+	TR(TRACE_DATABASE, ("READ %d bytes of extended-strings @%d",
+			    ext_str_limit, offset));
+
+	if (ext_str_limit) {
+	    ptr->ext_str_table = typeMalloc(char, (size_t) ext_str_limit);
+	    if (ptr->ext_str_table == 0) {
+		returnDB(TGETENT_NO);
+	    }
+	    if (Read(ptr->ext_str_table, (unsigned) ext_str_limit) != ext_str_limit) {
+		returnDB(TGETENT_NO);
+	    }
+	    TR(TRACE_DATABASE, ("first extended-string is %s", _nc_visbuf(ptr->ext_str_table)));
+	}
+
+	if ((ptr->ext_Strings = UShort(ext_str_count)) != 0) {
+	    int check = (ext_bool_count + ext_num_count + ext_str_count);
+
+	    TR(TRACE_DATABASE,
+	       ("Before computing extended-string capabilities "
+		"str_count=%d, ext_str_count=%d",
+		str_count, ext_str_count));
+	    convert_strings(buf, ptr->Strings + str_count, ext_str_count,
+			    ext_str_limit, ptr->ext_str_table);
+	    for (i = ext_str_count - 1; i >= 0; i--) {
+		TR(TRACE_DATABASE, ("MOVE from [%d:%d] %s",
+				    i, i + str_count,
+				    _nc_visbuf(ptr->Strings[i + str_count])));
+		ptr->Strings[i + STRCOUNT] = ptr->Strings[i + str_count];
+		if (VALID_STRING(ptr->Strings[i + STRCOUNT])) {
+		    base += (int) (strlen(ptr->Strings[i + STRCOUNT]) + 1);
+		    ++check;
+		}
+		TR(TRACE_DATABASE, ("... to    [%d] %s",
+				    i + STRCOUNT,
+				    _nc_visbuf(ptr->Strings[i + STRCOUNT])));
+	    }
+	    TR(TRACE_DATABASE, ("Check table-size: %d/%d", check, ext_str_usage));
+#if 0
+	    /*
+	     * Phasing in a proper check will be done "later".
+	     */
+	    if (check != ext_str_usage)
+		returnDB(TGETENT_NO);
+#endif
+	}
+
+	if (need) {
+	    if (ext_str_count >= (max_entry_size / 2)) {
+		returnDB(TGETENT_NO);
+	    }
+	    TYPE_CALLOC(char *, need, ptr->ext_Names);
+	    TR(TRACE_DATABASE,
+	       ("ext_NAMES starting @%d in extended_strings, first = %s",
+		base, _nc_visbuf(ptr->ext_str_table + base)));
+	    convert_strings(buf + (2 * ext_str_count),
+			    ptr->ext_Names,
+			    (int) need,
+			    ext_str_limit, ptr->ext_str_table + base);
+	}
+
+	TR(TRACE_DATABASE,
+	   ("...done reading terminfo bool %d(%d) num %d(%d) str %d(%d)",
+	    ptr->num_Booleans, ptr->ext_Booleans,
+	    ptr->num_Numbers, ptr->ext_Numbers,
+	    ptr->num_Strings, ptr->ext_Strings));
+
+	TR(TRACE_DATABASE, ("extend: num_Booleans:%d", ptr->num_Booleans));
+    } else
+#endif /* NCURSES_XNAMES */
+    {
+	TR(TRACE_DATABASE, ("...done reading terminfo bool %d num %d str %d",
+			    bool_count, num_count, str_count));
+#if NCURSES_XNAMES
+	TR(TRACE_DATABASE, ("normal: num_Booleans:%d", ptr->num_Booleans));
+#endif
+    }
+
+    for (i = bool_count; i < BOOLCOUNT; i++)
+	ptr->Booleans[i] = FALSE;
+    for (i = num_count; i < NUMCOUNT; i++)
+	ptr->Numbers[i] = ABSENT_NUMERIC;
+    for (i = str_count; i < STRCOUNT; i++)
+	ptr->Strings[i] = ABSENT_STRING;
+
+    returnDB(TGETENT_YES);
+}
+
+/*
+ *	int
+ *	_nc_read_file_entry(filename, ptr)
+ *
+ *	Read the compiled terminfo entry in the given file into the
+ *	structure pointed to by ptr, allocating space for the string
+ *	table.
+ */
+NCURSES_EXPORT(int)
+_nc_read_file_entry(const char *const filename, TERMTYPE2 *ptr)
+/* return 1 if read, 0 if not found or garbled */
+{
+    FILE *fp = 0;
+    int code;
+
+    if (_nc_access(filename, R_OK) < 0
+	|| (fp = safe_fopen(filename, BIN_R)) == 0) {
+	TR(TRACE_DATABASE, ("cannot open terminfo %s (errno=%d)", filename, errno));
+	code = TGETENT_NO;
+    } else {
+	int limit;
+	char buffer[MAX_ENTRY_SIZE + 1];
+
+	if ((limit = (int) fread(buffer, sizeof(char), sizeof(buffer), fp))
+	    > 0) {
+
+	    TR(TRACE_DATABASE, ("read terminfo %s", filename));
+	    if ((code = _nc_read_termtype(ptr, buffer, limit)) == TGETENT_NO) {
+		_nc_free_termtype2(ptr);
+	    }
+	} else {
+	    code = TGETENT_NO;
+	}
+	fclose(fp);
+    }
+
+    return (code);
+}
+
+#if USE_HASHED_DB
+/*
+ * Return if if we can build the filename of a ".db" file.
+ */
+static bool
+make_db_filename(char *filename, unsigned limit, const char *const path)
+{
+    static const char suffix[] = DBM_SUFFIX;
+
+    size_t lens = sizeof(suffix) - 1;
+    size_t size = strlen(path);
+    size_t test = lens + size;
+    bool result = FALSE;
+
+    if (test < limit) {
+	if (size >= lens
+	    && !strcmp(path + size - lens, suffix))
+	    _nc_STRCPY(filename, path, limit);
+	else
+	    _nc_SPRINTF(filename, _nc_SLIMIT(limit) "%s%s", path, suffix);
+	result = TRUE;
+    }
+    return result;
+}
+#endif
+
+/*
+ * Return true if we can build the name of a filesystem entry.
+ */
+static bool
+make_dir_filename(char *filename,
+		  unsigned limit,
+		  const char *const path,
+		  const char *name)
+{
+    bool result = FALSE;
+
+#if NCURSES_USE_TERMCAP
+    if (_nc_is_dir_path(path))
+#endif
+    {
+	unsigned need = (unsigned) (LEAF_LEN + 3 + strlen(path) + strlen(name));
+
+	if (need <= limit) {
+	    _nc_SPRINTF(filename, _nc_SLIMIT(limit)
+			"%s/" LEAF_FMT "/%s", path, *name, name);
+	    result = TRUE;
+	}
+    }
+    return result;
+}
+
+static int
+lookup_b64(int *target, const char **source)
+{
+    int result = 3;
+    int j;
+    /*
+     * ncurses' quickdump writes only RFC 4648 "url/filename-safe" encoding,
+     * but accepts RFC-3548
+     */
+    for (j = 0; j < 4; ++j) {
+	int ch = UChar(**source);
+	*source += 1;
+	if (ch >= 'A' && ch <= 'Z') {
+	    target[j] = (ch - 'A');
+	} else if (ch >= 'a' && ch <= 'z') {
+	    target[j] = 26 + (ch - 'a');
+	} else if (ch >= '0' && ch <= '9') {
+	    target[j] = 52 + (ch - '0');
+	} else if (ch == '-' || ch == '+') {
+	    target[j] = 62;
+	} else if (ch == '_' || ch == '/') {
+	    target[j] = 63;
+	} else if (ch == '=') {
+	    target[j] = 64;
+	    result--;
+	} else {
+	    result = -1;
+	    break;
+	}
+    }
+    return result;
+}
+
+static int
+decode_hex(const char **source)
+{
+    int result = 0;
+    int nibble;
+
+    for (nibble = 0; nibble < 2; ++nibble) {
+	int ch = UChar(**source);
+	result <<= 4;
+	*source += 1;
+	if (ch >= '0' && ch <= '9') {
+	    ch -= '0';
+	} else if (ch >= 'A' && ch <= 'F') {
+	    ch -= 'A';
+	    ch += 10;
+	} else if (ch >= 'a' && ch <= 'f') {
+	    ch -= 'a';
+	    ch += 10;
+	} else {
+	    result = -1;
+	    break;
+	}
+	result |= ch;
+    }
+    return result;
+}
+
+static int
+decode_quickdump(char *target, const char *source)
+{
+    char *base = target;
+    int result = 0;
+
+    if (!strncmp(source, "b64:", (size_t) 4)) {
+	source += 4;
+	while (*source != '\0') {
+	    int bits[4];
+	    int ch = lookup_b64(bits, &source);
+	    if (ch < 0 || (ch + target - base) >= MAX_ENTRY_SIZE) {
+		result = 0;
+		break;
+	    }
+	    result += ch;
+	    *target++ = (char) ((bits[0] << 2) | (bits[1] >> 4));
+	    if (bits[2] < 64) {
+		*target++ = (char) ((bits[1] << 4) | (bits[2] >> 2));
+		if (bits[3] < 64) {
+		    *target++ = (char) ((bits[2] << 6) | bits[3]);
+		}
+	    }
+	}
+    } else if (!strncmp(source, "hex:", (size_t) 4)) {
+	source += 4;
+	while (*source != '\0') {
+	    int ch = decode_hex(&source);
+	    if (ch < 0 || (target - base) >= MAX_ENTRY_SIZE) {
+		result = 0;
+		break;
+	    }
+	    *target++ = (char) ch;
+	    ++result;
+	}
+    }
+    return result;
+}
+
+/*
+ * Build a terminfo pathname and try to read the data.  Returns TGETENT_YES on
+ * success, TGETENT_NO on failure.
+ */
+static int
+_nc_read_tic_entry(char *filename,
+		   unsigned limit,
+		   const char *const path,
+		   const char *name,
+		   TERMTYPE2 *const tp)
+{
+    int code = TGETENT_NO;
+#if USE_HASHED_DB
+    DB *capdbp;
+#endif
+    char buffer[MAX_ENTRY_SIZE + 1];
+    int used;
+
+    TR(TRACE_DATABASE,
+       (T_CALLED("_nc_read_tic_entry(file=%p, path=%s, name=%s)"),
+	filename, path, name));
+
+    assert(TGETENT_YES == TRUE);	/* simplify call for _nc_name_match */
+
+    if ((used = decode_quickdump(buffer, path)) != 0
+	&& (code = _nc_read_termtype(tp, buffer, used)) == TGETENT_YES
+	&& (code = _nc_name_match(tp->term_names, name, "|")) == TGETENT_YES) {
+	TR(TRACE_DATABASE, ("loaded quick-dump for %s", name));
+	/* shorten name shown by infocmp */
+	_nc_STRCPY(filename, "$TERMINFO", limit);
+    } else
+#if USE_HASHED_DB
+	if (make_db_filename(filename, limit, path)
+	    && (capdbp = _nc_db_open(filename, FALSE)) != 0) {
+
+	DBT key, data;
+	int reccnt = 0;
+	char *save = strdup(name);
+
+	memset(&key, 0, sizeof(key));
+	key.data = save;
+	key.size = strlen(save);
+
+	/*
+	 * This lookup could return termcap data, which we do not want.  We are
+	 * looking for compiled (binary) terminfo data.
+	 *
+	 * cgetent uses a two-level lookup.  On the first it uses the given
+	 * name to return a record containing only the aliases for an entry.
+	 * On the second (using that list of aliases as a key), it returns the
+	 * content of the terminal description.  We expect second lookup to
+	 * return data beginning with the same set of aliases.
+	 *
+	 * For compiled terminfo, the list of aliases in the second case will
+	 * be null-terminated.  A termcap entry will not be, and will run on
+	 * into the description.  So we can easily distinguish between the two
+	 * (source/binary) by checking the lengths.
+	 */
+	while (_nc_db_get(capdbp, &key, &data) == 0) {
+	    char *have = (char *) data.data;
+	    used = (int) data.size - 1;
+
+	    if (*have++ == 0) {
+		if (data.size > key.size
+		    && IS_TIC_MAGIC(have)) {
+		    code = _nc_read_termtype(tp, have, used);
+		    if (code == TGETENT_NO) {
+			_nc_free_termtype2(tp);
+		    }
+		}
+		break;
+	    }
+
+	    /*
+	     * Just in case we have a corrupt database, do not waste time with
+	     * it.
+	     */
+	    if (++reccnt >= 3)
+		break;
+
+	    /*
+	     * Prepare for the second level.
+	     */
+	    key.data = have;
+	    key.size = used;
+	}
+
+	free(save);
+    } else			/* may be either filesystem or flat file */
+#endif
+    if (make_dir_filename(filename, limit, path, name)) {
+	code = _nc_read_file_entry(filename, tp);
+    }
+#if NCURSES_USE_TERMCAP
+    if (code != TGETENT_YES) {
+	code = _nc_read_termcap_entry(name, tp);
+	_nc_SPRINTF(filename, _nc_SLIMIT(PATH_MAX)
+		    "%.*s", PATH_MAX - 1, _nc_get_source());
+    }
+#endif
+    returnDB(code);
+}
+#endif /* NCURSES_USE_DATABASE */
+
+/*
+ * Find and read the compiled entry for a given terminal type, if it exists.
+ * We take pains here to make sure no combination of environment variables and
+ * terminal type name can be used to overrun the file buffer.
+ */
+NCURSES_EXPORT(int)
+_nc_read_entry2(const char *const name, char *const filename, TERMTYPE2 *const tp)
+{
+    int code = TGETENT_NO;
+
+    if (name == 0)
+	return _nc_read_entry2("", filename, tp);
+
+    _nc_SPRINTF(filename, _nc_SLIMIT(PATH_MAX)
+		"%.*s", PATH_MAX - 1, name);
+
+    if (strlen(name) == 0
+	|| strcmp(name, ".") == 0
+	|| strcmp(name, "..") == 0
+	|| _nc_pathlast(name) != 0
+	|| strchr(name, NCURSES_PATHSEP) != 0) {
+	TR(TRACE_DATABASE, ("illegal or missing entry name '%s'", name));
+    } else {
+#if NCURSES_USE_DATABASE
+	DBDIRS state;
+	int offset;
+	const char *path;
+
+	_nc_first_db(&state, &offset);
+	code = TGETENT_ERR;
+	while ((path = _nc_next_db(&state, &offset)) != 0) {
+	    code = _nc_read_tic_entry(filename, PATH_MAX, path, name, tp);
+	    if (code == TGETENT_YES) {
+		_nc_last_db();
+		break;
+	    }
+	}
+#elif NCURSES_USE_TERMCAP
+	if (code != TGETENT_YES) {
+	    code = _nc_read_termcap_entry(name, tp);
+	    _nc_SPRINTF(filename, _nc_SLIMIT(PATH_MAX)
+			"%.*s", PATH_MAX - 1, _nc_get_source());
+	}
+#endif
+    }
+    return code;
+}
+
+#if NCURSES_EXT_NUMBERS
+/*
+ * This entrypoint is used by tack 1.07
+ */
+NCURSES_EXPORT(int)
+_nc_read_entry(const char *const name, char *const filename, TERMTYPE *const tp)
+{
+    TERMTYPE2 dummy;
+    int rc;
+    rc = _nc_read_entry2(name, filename, &dummy);
+    if (rc == TGETENT_YES)
+	_nc_export_termtype2(tp, &dummy);
+    return rc;
+}
+#endif
diff --git a/ncurses/tinfo/read_termcap.c b/ncurses/tinfo/read_termcap.c
new file mode 100644
index 0000000..c9696b7
--- /dev/null
+++ b/ncurses/tinfo/read_termcap.c
@@ -0,0 +1,1202 @@
+/****************************************************************************
+ * Copyright 2018-2020,2021 Thomas E. Dickey                                *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ ****************************************************************************/
+
+/*
+ * Termcap compatibility support
+ *
+ * If your OS integrator didn't install a terminfo database, you can call
+ * _nc_read_termcap_entry() to support reading and translating capabilities
+ * from the system termcap file.  This is a kludge; it will bulk up and slow
+ * down every program that uses ncurses, and translated termcap entries cannot
+ * use full terminfo capabilities.  Don't use it unless you absolutely have to;
+ * instead, get your system people to run tic(1) from root on the terminfo
+ * master included with ncurses to translate it into a terminfo database.
+ *
+ * If USE_GETCAP is enabled, we use what is effectively a copy of the 4.4BSD
+ * getcap code to fetch entries.  There are disadvantages to this; mainly that
+ * getcap(3) does its own resolution, meaning that entries read in in this way
+ * can't reference the terminfo tree.  The only thing it buys is faster startup
+ * time, getcap(3) is much faster than our tic parser.
+ */
+
+#include <curses.priv.h>
+
+#include <ctype.h>
+#include <sys/types.h>
+#include <tic.h>
+
+MODULE_ID("$Id: read_termcap.c,v 1.102 2021/09/04 10:29:15 tom Exp $")
+
+#if !PURE_TERMINFO
+
+#define TC_SUCCESS     0
+#define TC_NOT_FOUND  -1
+#define TC_SYS_ERR    -2
+#define TC_REF_LOOP   -3
+#define TC_UNRESOLVED -4	/* this is not returned by BSD cgetent */
+
+static const char *
+get_termpath(void)
+{
+    const char *result;
+
+    if (!use_terminfo_vars() || (result = getenv("TERMPATH")) == 0)
+	result = TERMPATH;
+    TR(TRACE_DATABASE, ("TERMPATH is %s", result));
+    return result;
+}
+
+/*
+ * Note:
+ * getcap(), cgetent(), etc., are BSD functions.  A copy of those was added to
+ * this file in November 1995, derived from the BSD4.4 Lite sources.
+ *
+ * The initial adaptation uses 518 lines from that source.
+ * The current source (in 2009) uses 183 lines of BSD4.4 Lite (441 ignoring
+ * whitespace).
+ */
+#if USE_GETCAP
+
+#if HAVE_BSD_CGETENT
+#define _nc_cgetcap   cgetcap
+#define _nc_cgetent(buf, oline, db_array, name) cgetent(buf, db_array, name)
+#define _nc_cgetmatch cgetmatch
+#define _nc_cgetset   cgetset
+#else
+static int _nc_cgetmatch(char *, const char *);
+static int _nc_getent(char **, unsigned *, int *, int, char **, int, const char
+		      *, int, char *);
+static int _nc_nfcmp(const char *, char *);
+
+/*-
+ * Copyright (c) 1992, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Casey Leedom of Lawrence Livermore National Laboratory.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/* static char sccsid[] = "@(#)getcap.c	8.3 (Berkeley) 3/25/94"; */
+
+#define	BFRAG		1024
+#define	BSIZE		1024
+#define	MAX_RECURSION	32	/* maximum getent recursion */
+
+static size_t topreclen;	/* toprec length */
+static char *toprec;		/* Additional record specified by cgetset() */
+static int gottoprec;		/* Flag indicating retrieval of toprecord */
+
+/*
+ * Cgetset() allows the addition of a user specified buffer to be added to the
+ * database array, in effect "pushing" the buffer on top of the virtual
+ * database.  0 is returned on success, -1 on failure.
+ */
+static int
+_nc_cgetset(const char *ent)
+{
+    if (ent == 0) {
+	FreeIfNeeded(toprec);
+	toprec = 0;
+	topreclen = 0;
+	return (0);
+    }
+    topreclen = strlen(ent);
+    if ((toprec = typeMalloc(char, topreclen + 1)) == 0) {
+	errno = ENOMEM;
+	return (-1);
+    }
+    gottoprec = 0;
+    _nc_STRCPY(toprec, ent, topreclen);
+    return (0);
+}
+
+/*
+ * Cgetcap searches the capability record buf for the capability cap with type
+ * `type'.  A pointer to the value of cap is returned on success, 0 if the
+ * requested capability couldn't be found.
+ *
+ * Specifying a type of ':' means that nothing should follow cap (:cap:).  In
+ * this case a pointer to the terminating ':' or NUL will be returned if cap is
+ * found.
+ *
+ * If (cap, '@') or (cap, terminator, '@') is found before (cap, terminator)
+ * return 0.
+ */
+static char *
+_nc_cgetcap(char *buf, const char *cap, int type)
+{
+    register const char *cp;
+    register char *bp;
+
+    bp = buf;
+    for (;;) {
+	/*
+	 * Skip past the current capability field - it is either the
+	 * name field if this is the first time through the loop, or
+	 * the remainder of a field whose name failed to match cap.
+	 */
+	for (;;) {
+	    if (*bp == '\0')
+		return (0);
+	    else if (*bp++ == ':')
+		break;
+	}
+
+	/*
+	 * Try to match (cap, type) in buf.
+	 */
+	for (cp = cap; *cp == *bp && *bp != '\0'; cp++, bp++)
+	    continue;
+	if (*cp != '\0')
+	    continue;
+	if (*bp == '@')
+	    return (0);
+	if (type == ':') {
+	    if (*bp != '\0' && *bp != ':')
+		continue;
+	    return (bp);
+	}
+	if (*bp != type)
+	    continue;
+	bp++;
+	return (*bp == '@' ? 0 : bp);
+    }
+    /* NOTREACHED */
+}
+
+/*
+ * Cgetent extracts the capability record name from the NULL terminated file
+ * array db_array and returns a pointer to a malloc'd copy of it in buf.  Buf
+ * must be retained through all subsequent calls to cgetcap, cgetnum, cgetflag,
+ * and cgetstr, but may then be freed.
+ *
+ * Returns:
+ *
+ * positive #    on success (i.e., the index in db_array)
+ * TC_NOT_FOUND  if the requested record couldn't be found
+ * TC_SYS_ERR    if a system error was encountered (e.g.,couldn't open a file)
+ * TC_REF_LOOP   if a potential reference loop is detected
+ * TC_UNRESOLVED if we had too many recurrences to resolve
+ */
+static int
+_nc_cgetent(char **buf, int *oline, char **db_array, const char *name)
+{
+    unsigned dummy;
+
+    return (_nc_getent(buf, &dummy, oline, 0, db_array, -1, name, 0, 0));
+}
+
+/*
+ * Getent implements the functions of cgetent.  If fd is non-negative,
+ * *db_array has already been opened and fd is the open file descriptor.  We
+ * do this to save time and avoid using up file descriptors for tc=
+ * recursions.
+ *
+ * Getent returns the same success/failure codes as cgetent.  On success, a
+ * pointer to a malloc'd capability record with all tc= capabilities fully
+ * expanded and its length (not including trailing ASCII NUL) are left in
+ * *cap and *len.
+ *
+ * Basic algorithm:
+ *	+ Allocate memory incrementally as needed in chunks of size BFRAG
+ *	  for capability buffer.
+ *	+ Recurse for each tc=name and interpolate result.  Stop when all
+ *	  names interpolated, a name can't be found, or depth exceeds
+ *	  MAX_RECURSION.
+ */
+#define DOALLOC(size) typeRealloc(char, size, record)
+static int
+_nc_getent(
+	      char **cap,	/* termcap-content */
+	      unsigned *len,	/* length, needed for recursion */
+	      int *beginning,	/* line-number at match */
+	      int in_array,	/* index in 'db_array[] */
+	      char **db_array,	/* list of files to search */
+	      int fd,
+	      const char *name,
+	      int depth,
+	      char *nfield)
+{
+    register char *r_end, *rp;
+    int myfd = FALSE;
+    char *record = 0;
+    int tc_not_resolved;
+    int current;
+    int lineno;
+
+    /*
+     * Return with ``loop detected'' error if we've recurred more than
+     * MAX_RECURSION times.
+     */
+    if (depth > MAX_RECURSION)
+	return (TC_REF_LOOP);
+
+    /*
+     * Check if we have a top record from cgetset().
+     */
+    if (depth == 0 && toprec != 0 && _nc_cgetmatch(toprec, name) == 0) {
+	if ((record = DOALLOC(topreclen + BFRAG)) == 0) {
+	    errno = ENOMEM;
+	    return (TC_SYS_ERR);
+	}
+	_nc_STRCPY(record, toprec, topreclen + BFRAG);
+	rp = record + topreclen + 1;
+	r_end = rp + BFRAG;
+	current = in_array;
+    } else {
+	int foundit;
+
+	/*
+	 * Allocate first chunk of memory.
+	 */
+	if ((record = DOALLOC(BFRAG)) == 0) {
+	    errno = ENOMEM;
+	    return (TC_SYS_ERR);
+	}
+	rp = r_end = record + BFRAG;
+	foundit = FALSE;
+
+	/*
+	 * Loop through database array until finding the record.
+	 */
+	for (current = in_array; db_array[current] != 0; current++) {
+	    int eof = FALSE;
+
+	    /*
+	     * Open database if not already open.
+	     */
+	    if (fd >= 0) {
+		(void) lseek(fd, (off_t) 0, SEEK_SET);
+	    } else if ((_nc_access(db_array[current], R_OK) < 0)
+		       || (fd = open(db_array[current], O_RDONLY, 0)) < 0) {
+		/* No error on unfound file. */
+		if (errno == ENOENT)
+		    continue;
+		free(record);
+		return (TC_SYS_ERR);
+	    } else {
+		myfd = TRUE;
+	    }
+	    lineno = 0;
+
+	    /*
+	     * Find the requested capability record ...
+	     */
+	    {
+		char buf[2048];
+		register char *b_end = buf;
+		register char *bp = buf;
+		register int c;
+
+		/*
+		 * Loop invariants:
+		 *      There is always room for one more character in record.
+		 *      R_end always points just past end of record.
+		 *      Rp always points just past last character in record.
+		 *      B_end always points just past last character in buf.
+		 *      Bp always points at next character in buf.
+		 */
+
+		for (;;) {
+		    int first = lineno + 1;
+
+		    /*
+		     * Read in a line implementing (\, newline)
+		     * line continuation.
+		     */
+		    rp = record;
+		    for (;;) {
+			if (bp >= b_end) {
+			    int n;
+
+			    n = (int) read(fd, buf, sizeof(buf));
+			    if (n <= 0) {
+				if (myfd)
+				    (void) close(fd);
+				if (n < 0) {
+				    free(record);
+				    return (TC_SYS_ERR);
+				}
+				fd = -1;
+				eof = TRUE;
+				break;
+			    }
+			    b_end = buf + n;
+			    bp = buf;
+			}
+
+			c = *bp++;
+			if (c == '\n') {
+			    lineno++;
+			    /*
+			     * Unlike BSD 4.3, this ignores a backslash at the
+			     * end of a comment-line.  That makes it consistent
+			     * with the rest of ncurses -TD
+			     */
+			    if (rp == record
+				|| *record == '#'
+				|| *(rp - 1) != '\\')
+				break;
+			}
+			*rp++ = (char) c;
+
+			/*
+			 * Enforce loop invariant: if no room
+			 * left in record buffer, try to get
+			 * some more.
+			 */
+			if (rp >= r_end) {
+			    unsigned pos;
+			    size_t newsize;
+
+			    pos = (unsigned) (rp - record);
+			    newsize = (size_t) (r_end - record + BFRAG);
+			    record = DOALLOC(newsize);
+			    if (record == 0) {
+				if (myfd)
+				    (void) close(fd);
+				errno = ENOMEM;
+				return (TC_SYS_ERR);
+			    }
+			    r_end = record + newsize;
+			    rp = record + pos;
+			}
+		    }
+		    /* loop invariant lets us do this */
+		    *rp++ = '\0';
+
+		    /*
+		     * If encountered eof check next file.
+		     */
+		    if (eof)
+			break;
+
+		    /*
+		     * Toss blank lines and comments.
+		     */
+		    if (*record == '\0' || *record == '#')
+			continue;
+
+		    /*
+		     * See if this is the record we want ...
+		     */
+		    if (_nc_cgetmatch(record, name) == 0
+			&& (nfield == 0
+			    || !_nc_nfcmp(nfield, record))) {
+			foundit = TRUE;
+			*beginning = first;
+			break;	/* found it! */
+		    }
+		}
+	    }
+	    if (foundit)
+		break;
+	}
+
+	if (!foundit) {
+	    free(record);
+	    return (TC_NOT_FOUND);
+	}
+    }
+
+    /*
+     * Got the capability record, but now we have to expand all tc=name
+     * references in it ...
+     */
+    {
+	register char *newicap, *s;
+	register int newilen;
+	unsigned ilen;
+	int diff, iret, tclen, oline;
+	char *icap = 0, *scan, *tc, *tcstart, *tcend;
+
+	/*
+	 * Loop invariants:
+	 *      There is room for one more character in record.
+	 *      R_end points just past end of record.
+	 *      Rp points just past last character in record.
+	 *      Scan points at remainder of record that needs to be
+	 *      scanned for tc=name constructs.
+	 */
+	scan = record;
+	tc_not_resolved = FALSE;
+	for (;;) {
+	    if ((tc = _nc_cgetcap(scan, "tc", '=')) == 0) {
+		break;
+	    }
+
+	    /*
+	     * Find end of tc=name and stomp on the trailing `:'
+	     * (if present) so we can use it to call ourselves.
+	     */
+	    s = tc;
+	    while (*s != '\0') {
+		if (*s++ == ':') {
+		    *(s - 1) = '\0';
+		    break;
+		}
+	    }
+	    tcstart = tc - 3;
+	    tclen = (int) (s - tcstart);
+	    tcend = s;
+
+	    icap = 0;
+	    iret = _nc_getent(&icap, &ilen, &oline, current, db_array, fd,
+			      tc, depth + 1, 0);
+	    newicap = icap;	/* Put into a register. */
+	    newilen = (int) ilen;
+	    if (iret != TC_SUCCESS) {
+		/* an error */
+		if (iret < TC_NOT_FOUND) {
+		    if (myfd)
+			(void) close(fd);
+		    free(record);
+		    FreeIfNeeded(icap);
+		    return (iret);
+		}
+		if (iret == TC_UNRESOLVED) {
+		    tc_not_resolved = TRUE;
+		    /* couldn't resolve tc */
+		} else if (iret == TC_NOT_FOUND) {
+		    *(s - 1) = ':';
+		    scan = s - 1;
+		    tc_not_resolved = TRUE;
+		    continue;
+		}
+	    }
+
+	    /* not interested in name field of tc'ed record */
+	    s = newicap;
+	    while (*s != '\0' && *s++ != ':') ;
+	    newilen -= (int) (s - newicap);
+	    newicap = s;
+
+	    /* make sure interpolated record is `:'-terminated */
+	    s += newilen;
+	    if (*(s - 1) != ':') {
+		*s = ':';	/* overwrite NUL with : */
+		newilen++;
+	    }
+
+	    /*
+	     * Make sure there's enough room to insert the
+	     * new record.
+	     */
+	    diff = newilen - tclen;
+	    if (diff >= r_end - rp) {
+		unsigned pos, tcpos, tcposend;
+		size_t newsize;
+
+		pos = (unsigned) (rp - record);
+		newsize = (size_t) (r_end - record + diff + BFRAG);
+		tcpos = (unsigned) (tcstart - record);
+		tcposend = (unsigned) (tcend - record);
+		record = DOALLOC(newsize);
+		if (record == 0) {
+		    if (myfd)
+			(void) close(fd);
+		    free(icap);
+		    errno = ENOMEM;
+		    return (TC_SYS_ERR);
+		}
+		r_end = record + newsize;
+		rp = record + pos;
+		tcstart = record + tcpos;
+		tcend = record + tcposend;
+	    }
+
+	    /*
+	     * Insert tc'ed record into our record.
+	     */
+	    s = tcstart + newilen;
+	    memmove(s, tcend, (size_t) (rp - tcend));
+	    memmove(tcstart, newicap, (size_t) newilen);
+	    rp += diff;
+	    free(icap);
+
+	    /*
+	     * Start scan on `:' so next cgetcap works properly
+	     * (cgetcap always skips first field).
+	     */
+	    scan = s - 1;
+	}
+    }
+
+    /*
+     * Close file (if we opened it), give back any extra memory, and
+     * return capability, length and success.
+     */
+    if (myfd)
+	(void) close(fd);
+    *len = (unsigned) (rp - record - 1);	/* don't count NUL */
+    if (r_end > rp) {
+	if ((record = DOALLOC((size_t) (rp - record))) == 0) {
+	    errno = ENOMEM;
+	    return (TC_SYS_ERR);
+	}
+    }
+
+    *cap = record;
+    if (tc_not_resolved) {
+	return (TC_UNRESOLVED);
+    }
+    return (current);
+}
+
+/*
+ * Cgetmatch will return 0 if name is one of the names of the capability
+ * record buf, -1 if not.
+ */
+static int
+_nc_cgetmatch(char *buf, const char *name)
+{
+    register const char *np;
+    register char *bp;
+
+    /*
+     * Start search at beginning of record.
+     */
+    bp = buf;
+    for (;;) {
+	/*
+	 * Try to match a record name.
+	 */
+	np = name;
+	for (;;) {
+	    if (*np == '\0') {
+		if (*bp == '|' || *bp == ':' || *bp == '\0')
+		    return (0);
+		else
+		    break;
+	    } else if (*bp++ != *np++) {
+		break;
+	    }
+	}
+
+	/*
+	 * Match failed, skip to next name in record.
+	 */
+	bp--;			/* a '|' or ':' may have stopped the match */
+	for (;;) {
+	    if (*bp == '\0' || *bp == ':')
+		return (-1);	/* match failed totally */
+	    else if (*bp++ == '|')
+		break;		/* found next name */
+	}
+    }
+}
+
+/*
+ * Compare name field of record.
+ */
+static int
+_nc_nfcmp(const char *nf, char *rec)
+{
+    char *cp, tmp;
+    int ret;
+
+    for (cp = rec; *cp != ':'; cp++) ;
+
+    tmp = *(cp + 1);
+    *(cp + 1) = '\0';
+    ret = strcmp(nf, rec);
+    *(cp + 1) = tmp;
+
+    return (ret);
+}
+#endif /* HAVE_BSD_CGETENT */
+
+/*
+ * Since ncurses provides its own 'tgetent()', we cannot use the native one.
+ * So we reproduce the logic to get down to cgetent() -- or our cut-down
+ * version of that -- to circumvent the problem of configuring against the
+ * termcap library.
+ */
+#define USE_BSD_TGETENT 1
+
+#if USE_BSD_TGETENT
+/*
+ * Copyright (c) 1980, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgment:
+ *	This product includes software developed by the University of
+ *	California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/* static char sccsid[] = "@(#)termcap.c	8.1 (Berkeley) 6/4/93" */
+
+#define	PBUFSIZ		512	/* max length of filename path */
+#define	PVECSIZ		32	/* max number of names in path */
+#define TBUFSIZ (2048*2)
+
+/*
+ * On entry, srcp points to a non ':' character which is the beginning of the
+ * token, if any.  We'll try to return a string that doesn't end with a ':'.
+ */
+static char *
+get_tc_token(char **srcp, int *endp)
+{
+    int ch;
+    bool found = FALSE;
+    char *s, *base;
+    char *tok = 0;
+
+    *endp = TRUE;
+    for (s = base = *srcp; *s != '\0';) {
+	ch = *s++;
+	if (ch == '\\') {
+	    if (*s == '\0') {
+		break;
+	    } else if (*s++ == '\n') {
+		while (isspace(UChar(*s)))
+		    s++;
+	    } else {
+		found = TRUE;
+	    }
+	} else if (ch == ':') {
+	    if (found) {
+		tok = base;
+		s[-1] = '\0';
+		*srcp = s;
+		*endp = FALSE;
+		break;
+	    }
+	    base = s;
+	} else if (isgraph(UChar(ch))) {
+	    found = TRUE;
+	}
+    }
+
+    /* malformed entry may end without a ':' */
+    if (tok == 0 && found) {
+	tok = base;
+    }
+
+    return tok;
+}
+
+static char *
+copy_tc_token(char *dst, const char *src, size_t len)
+{
+    int ch;
+
+    while ((ch = *src++) != '\0') {
+	if (ch == '\\' && *src == '\n') {
+	    while (isspace(UChar(*src)))
+		src++;
+	    continue;
+	}
+	if (--len == 0) {
+	    dst = 0;
+	    break;
+	}
+	*dst++ = (char) ch;
+    }
+    return dst;
+}
+
+/*
+ * Get an entry for terminal name in buffer bp from the termcap file.
+ */
+static int
+_nc_tgetent(char *bp, char **sourcename, int *lineno, const char *name)
+{
+    static char *the_source;
+
+    register char *p;
+    register char *cp;
+    char *dummy = NULL;
+    CGETENT_CONST char **fname;
+    char *home;
+    int i;
+    char pathbuf[PBUFSIZ];	/* holds raw path of filenames */
+    CGETENT_CONST char *pathvec[PVECSIZ];	/* point to names in pathbuf */
+    const char *termpath;
+    string_desc desc;
+
+    *lineno = 1;
+    fname = pathvec;
+    p = pathbuf;
+    cp = use_terminfo_vars()? getenv("TERMCAP") : NULL;
+
+    /*
+     * TERMCAP can have one of two things in it.  It can be the name of a file
+     * to use instead of /etc/termcap.  In this case it better start with a
+     * "/".  Or it can be an entry to use so we don't have to read the file.
+     * In this case it has to already have the newlines crunched out.  If
+     * TERMCAP does not hold a file name then a path of names is searched
+     * instead.  The path is found in the TERMPATH variable, or becomes
+     * "$HOME/.termcap /etc/termcap" if no TERMPATH exists.
+     */
+    _nc_str_init(&desc, pathbuf, sizeof(pathbuf));
+    if (cp == NULL) {
+	_nc_safe_strcpy(&desc, get_termpath());
+    } else if (!_nc_is_abs_path(cp)) {	/* TERMCAP holds an entry */
+	if ((termpath = get_termpath()) != 0) {
+	    _nc_safe_strcat(&desc, termpath);
+	} else {
+	    char temp[PBUFSIZ];
+	    temp[0] = 0;
+	    if ((home = getenv("HOME")) != 0 && *home != '\0'
+		&& strchr(home, ' ') == 0
+		&& strlen(home) < sizeof(temp) - 10) {	/* setup path */
+		_nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp))
+			    "%s/", home);	/* $HOME first */
+	    }
+	    /* if no $HOME look in current directory */
+	    _nc_STRCAT(temp, ".termcap", sizeof(temp));
+	    _nc_safe_strcat(&desc, temp);
+	    _nc_safe_strcat(&desc, " ");
+	    _nc_safe_strcat(&desc, get_termpath());
+	}
+    } else {			/* user-defined name in TERMCAP */
+	_nc_safe_strcat(&desc, cp);	/* still can be tokenized */
+    }
+
+    *fname++ = pathbuf;		/* tokenize path into vector of names */
+    while (*++p) {
+	if (*p == ' ' || *p == NCURSES_PATHSEP) {
+	    *p = '\0';
+	    while (*++p)
+		if (*p != ' ' && *p != NCURSES_PATHSEP)
+		    break;
+	    if (*p == '\0')
+		break;
+	    *fname++ = p;
+	    if (fname >= pathvec + PVECSIZ) {
+		fname--;
+		break;
+	    }
+	}
+    }
+    *fname = 0;			/* mark end of vector */
+#if !HAVE_BSD_CGETENT
+    (void) _nc_cgetset(0);
+#endif
+    if (_nc_is_abs_path(cp)) {
+	if (_nc_cgetset(cp) < 0) {
+	    return (TC_SYS_ERR);
+	}
+    }
+
+    i = _nc_cgetent(&dummy, lineno, pathvec, name);
+
+    /* ncurses' termcap-parsing routines cannot handle multiple adjacent
+     * empty fields, and mistakenly use the last valid cap entry instead of
+     * the first (breaks tc= includes)
+     */
+    *bp = '\0';
+    if (i >= 0) {
+	char *pd, *ps, *tok;
+	int endflag = FALSE;
+	char *list[1023];
+	size_t n, count = 0;
+
+	pd = bp;
+	ps = dummy;
+	while (!endflag && (tok = get_tc_token(&ps, &endflag)) != 0) {
+	    bool ignore = FALSE;
+
+	    for (n = 1; n < count; n++) {
+		char *s = list[n];
+		if (s[0] == tok[0]
+		    && s[1] == tok[1]) {
+		    ignore = TRUE;
+		    break;
+		}
+	    }
+	    if (ignore != TRUE) {
+		list[count++] = tok;
+		pd = copy_tc_token(pd, tok, (size_t) (TBUFSIZ - (2 + pd - bp)));
+		if (pd == 0) {
+		    i = -1;
+		    break;
+		}
+		*pd++ = ':';
+		*pd = '\0';
+	    }
+	}
+    }
+
+    FreeIfNeeded(dummy);
+    FreeIfNeeded(the_source);
+    the_source = 0;
+
+    /* This is not related to the BSD cgetent(), but to fake up a suitable
+     * filename for ncurses' error reporting.  (If we are not using BSD
+     * cgetent, then it is the actual filename).
+     */
+    if (i >= 0) {
+#if HAVE_BSD_CGETENT
+	char temp[PATH_MAX];
+
+	_nc_str_init(&desc, temp, sizeof(temp));
+	_nc_safe_strcpy(&desc, pathvec[i]);
+	_nc_safe_strcat(&desc, ".db");
+	if (_nc_access(temp, R_OK) == 0) {
+	    _nc_safe_strcpy(&desc, pathvec[i]);
+	}
+	if ((the_source = strdup(temp)) != 0)
+	    *sourcename = the_source;
+#else
+	if ((the_source = strdup(pathvec[i])) != 0)
+	    *sourcename = the_source;
+#endif
+    }
+
+    return (i);
+}
+#endif /* USE_BSD_TGETENT */
+#endif /* USE_GETCAP */
+
+#define MAXPATHS	32
+
+/*
+ * Add a filename to the list in 'termpaths[]', checking that we really have
+ * a right to open the file.
+ */
+#if !USE_GETCAP
+static int
+add_tc(char *termpaths[], char *path, int count)
+{
+    char *save = strchr(path, NCURSES_PATHSEP);
+    if (save != 0)
+	*save = '\0';
+    if (count < MAXPATHS
+	&& _nc_access(path, R_OK) == 0) {
+	termpaths[count++] = path;
+	TR(TRACE_DATABASE, ("Adding termpath %s", path));
+    }
+    termpaths[count] = 0;
+    if (save != 0)
+	*save = NCURSES_PATHSEP;
+    return count;
+}
+#define ADD_TC(path, count) filecount = add_tc(termpaths, path, count)
+#endif /* !USE_GETCAP */
+
+NCURSES_EXPORT(int)
+_nc_read_termcap_entry(const char *const tn, TERMTYPE2 *const tp)
+{
+    int found = TGETENT_NO;
+    ENTRY *ep;
+#if USE_GETCAP_CACHE
+    char cwd_buf[PATH_MAX];
+#endif
+#if USE_GETCAP
+    char *p, tc[TBUFSIZ];
+    char *tc_buf = 0;
+#define MY_SIZE sizeof(tc) - 1
+    int status;
+    static char *source;
+    static int lineno;
+
+    TR(TRACE_DATABASE, ("read termcap entry for %s", tn));
+
+    if (strlen(tn) == 0
+	|| strcmp(tn, ".") == 0
+	|| strcmp(tn, "..") == 0
+	|| _nc_pathlast(tn) != 0) {
+	TR(TRACE_DATABASE, ("illegal or missing entry name '%s'", tn));
+	return TGETENT_NO;
+    }
+
+    if (use_terminfo_vars() && (p = getenv("TERMCAP")) != 0
+	&& !_nc_is_abs_path(p) && _nc_name_match(p, tn, "|:")) {
+	/* TERMCAP holds a termcap entry */
+	tc_buf = strdup(p);
+	_nc_set_source("TERMCAP");
+    } else {
+	/* we're using getcap(3) */
+	if ((status = _nc_tgetent(tc, &source, &lineno, tn)) < 0)
+	    return (status == TC_NOT_FOUND ? TGETENT_NO : TGETENT_ERR);
+
+	_nc_curr_line = lineno;
+	_nc_set_source(source);
+	tc_buf = tc;
+    }
+    if (tc_buf == 0)
+	return (TGETENT_ERR);
+    _nc_read_entry_source((FILE *) 0, tc_buf, FALSE, TRUE, NULLHOOK);
+    if (tc_buf != tc)
+	free(tc_buf);
+#else
+    /*
+     * Here is what the 4.4BSD termcap(3) page prescribes:
+     *
+     * It will look in the environment for a TERMCAP variable.  If found, and
+     * the value does not begin with a slash, and the terminal type name is the
+     * same as the environment string TERM, the TERMCAP string is used instead
+     * of reading a termcap file.  If it does begin with a slash, the string is
+     * used as a path name of the termcap file to search.  If TERMCAP does not
+     * begin with a slash and name is different from TERM, tgetent() searches
+     * the files $HOME/.termcap and /usr/share/misc/termcap, in that order,
+     * unless the environment variable TERMPATH exists, in which case it
+     * specifies a list of file pathnames (separated by spaces or colons) to be
+     * searched instead.
+     *
+     * It goes on to state:
+     *
+     * Whenever multiple files are searched and a tc field occurs in the
+     * requested entry, the entry it names must be found in the same file or
+     * one of the succeeding files.
+     *
+     * However, this restriction is relaxed in ncurses; tc references to
+     * previous files are permitted.
+     *
+     * This routine returns 1 if an entry is found, 0 if not found, and -1 if
+     * the database is not accessible.
+     */
+    FILE *fp;
+    char *tc, *termpaths[MAXPATHS];
+    int filecount = 0;
+    int j, k;
+    bool use_buffer = FALSE;
+    bool normal = TRUE;
+    char *tc_buf = 0;
+    char pathbuf[PATH_MAX];
+    char *copied = 0;
+    char *cp;
+    struct stat test_stat[MAXPATHS];
+
+    termpaths[filecount] = 0;
+    if (use_terminfo_vars() && (tc = getenv("TERMCAP")) != 0) {
+	if (_nc_is_abs_path(tc)) {	/* interpret as a filename */
+	    ADD_TC(tc, 0);
+	    normal = FALSE;
+	} else if (_nc_name_match(tc, tn, "|:")) {	/* treat as a capability file */
+	    tc_buf = strdup(tc);
+	    use_buffer = (tc_buf != 0);
+	    normal = FALSE;
+	}
+    }
+
+    if (normal) {		/* normal case */
+	char envhome[PATH_MAX], *h;
+
+	copied = strdup(get_termpath());
+	for (cp = copied; *cp; cp++) {
+	    if (*cp == NCURSES_PATHSEP)
+		*cp = '\0';
+	    else if (cp == copied || cp[-1] == '\0') {
+		ADD_TC(cp, filecount);
+	    }
+	}
+
+#define PRIVATE_CAP "%.*s/.termcap"
+
+	if (use_terminfo_vars() && (h = getenv("HOME")) != NULL && *h != '\0'
+	    && (strlen(h) + sizeof(PRIVATE_CAP)) < PATH_MAX) {
+	    /* user's .termcap, if any, should override it */
+	    _nc_STRCPY(envhome, h, sizeof(envhome));
+	    _nc_SPRINTF(pathbuf, _nc_SLIMIT(sizeof(pathbuf))
+			PRIVATE_CAP,
+			(int) (sizeof(pathbuf) - sizeof(PRIVATE_CAP)),
+			envhome);
+	    ADD_TC(pathbuf, filecount);
+	}
+    }
+
+    /*
+     * Probably /etc/termcap is a symlink to /usr/share/misc/termcap.
+     * Avoid reading the same file twice.
+     */
+#if HAVE_LINK
+    for (j = 0; j < filecount; j++) {
+	bool omit = FALSE;
+	if (stat(termpaths[j], &test_stat[j]) != 0
+	    || !S_ISREG(test_stat[j].st_mode)) {
+	    omit = TRUE;
+	} else {
+	    for (k = 0; k < j; k++) {
+		if (test_stat[k].st_dev == test_stat[j].st_dev
+		    && test_stat[k].st_ino == test_stat[j].st_ino) {
+		    omit = TRUE;
+		    break;
+		}
+	    }
+	}
+	if (omit) {
+	    TR(TRACE_DATABASE, ("Path %s is a duplicate", termpaths[j]));
+	    for (k = j + 1; k < filecount; k++) {
+		termpaths[k - 1] = termpaths[k];
+		test_stat[k - 1] = test_stat[k];
+	    }
+	    --filecount;
+	    --j;
+	}
+    }
+#endif
+
+    /* parse the sources */
+    if (use_buffer) {
+	_nc_set_source("TERMCAP");
+
+	/*
+	 * We don't suppress warning messages here.  The presumption is
+	 * that since it is just a single entry, they won't be a pain.
+	 */
+	_nc_read_entry_source((FILE *) 0, tc_buf, FALSE, FALSE, NULLHOOK);
+	free(tc_buf);
+    } else {
+	int i;
+
+	for (i = 0; i < filecount; i++) {
+
+	    TR(TRACE_DATABASE, ("Looking for %s in %s", tn, termpaths[i]));
+	    if (_nc_access(termpaths[i], R_OK) == 0
+		&& (fp = safe_fopen(termpaths[i], "r")) != (FILE *) 0) {
+		_nc_set_source(termpaths[i]);
+
+		/*
+		 * Suppress warning messages.  Otherwise you get 400 lines of
+		 * crap from archaic termcap files as ncurses complains about
+		 * all the obsolete capabilities.
+		 */
+		_nc_read_entry_source(fp, (char *) 0, FALSE, TRUE, NULLHOOK);
+
+		(void) fclose(fp);
+	    }
+	}
+    }
+    if (copied != 0)
+	free(copied);
+#endif /* USE_GETCAP */
+
+    if (_nc_head == 0)
+	return (TGETENT_ERR);
+
+    /* resolve all use references */
+    if (_nc_resolve_uses2(TRUE, FALSE) != TRUE)
+	return (TGETENT_ERR);
+
+    /* find a terminal matching tn, if we can */
+#if USE_GETCAP_CACHE
+    if (getcwd(cwd_buf, sizeof(cwd_buf)) != 0) {
+	_nc_set_writedir((char *) 0);	/* note: this does a chdir */
+#endif
+	for_entry_list(ep) {
+	    if (_nc_name_match(ep->tterm.term_names, tn, "|:")) {
+		/*
+		 * Make a local copy of the terminal capabilities, delinked
+		 * from the list.
+		 */
+		*tp = ep->tterm;
+		_nc_free_entry(_nc_head, &(ep->tterm));
+
+		/*
+		 * OK, now try to write the type to user's terminfo directory.
+		 * Next time he loads this, it will come through terminfo.
+		 *
+		 * Advantage:  Second and subsequent fetches of this entry will
+		 * be very fast.
+		 *
+		 * Disadvantage:  After the first time a termcap type is loaded
+		 * by its user, editing it in the /etc/termcap file, or in
+		 * TERMCAP, or in a local ~/.termcap, will be ineffective
+		 * unless the terminfo entry is explicitly removed.
+		 */
+#if USE_GETCAP_CACHE
+		(void) _nc_write_entry(tp);
+#endif
+		found = TGETENT_YES;
+		break;
+	    }
+	}
+#if USE_GETCAP_CACHE
+	chdir(cwd_buf);
+    }
+#endif
+
+    return (found);
+}
+#else
+extern
+NCURSES_EXPORT(void)
+_nc_read_termcap(void);
+NCURSES_EXPORT(void)
+_nc_read_termcap(void)
+{
+}
+#endif /* PURE_TERMINFO */
diff --git a/ncurses/tinfo/strings.c b/ncurses/tinfo/strings.c
new file mode 100644
index 0000000..a1d8beb
--- /dev/null
+++ b/ncurses/tinfo/strings.c
@@ -0,0 +1,144 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 2000-2012,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                                                *
+ ****************************************************************************/
+
+/*
+**	lib_mvcur.c
+**/
+
+#include <curses.priv.h>
+#include <tic.h>
+
+MODULE_ID("$Id: strings.c,v 1.10 2020/02/02 23:34:34 tom Exp $")
+
+/****************************************************************************
+ * Useful string functions (especially for mvcur)
+ ****************************************************************************/
+
+#if !HAVE_STRSTR
+NCURSES_EXPORT(char *)
+_nc_strstr(const char *haystack, const char *needle)
+{
+    size_t len1 = strlen(haystack);
+    size_t len2 = strlen(needle);
+    char *result = 0;
+
+    while ((len1 != 0) && (len1-- >= len2)) {
+	if (!strncmp(haystack, needle, len2)) {
+	    result = (char *) haystack;
+	    break;
+	}
+	haystack++;
+    }
+    return result;
+}
+#endif
+
+/*
+ * Initialize the descriptor so we can append to it.  Note that 'src' may
+ * be a null pointer (see _nc_str_null), so the corresponding strcat and
+ * strcpy calls have to allow for this.
+ */
+NCURSES_EXPORT(string_desc *)
+_nc_str_init(string_desc * dst, char *src, size_t len)
+{
+    if (dst != 0) {
+	dst->s_head = src;
+	dst->s_tail = src;
+	dst->s_size = len - 1;
+	dst->s_init = dst->s_size;
+	if (src != 0)
+	    *src = 0;
+    }
+    return dst;
+}
+
+/*
+ * Initialize the descriptor for only tracking the amount of memory used.
+ */
+NCURSES_EXPORT(string_desc *)
+_nc_str_null(string_desc * dst, size_t len)
+{
+    return _nc_str_init(dst, 0, len);
+}
+
+/*
+ * Copy a descriptor
+ */
+NCURSES_EXPORT(string_desc *)
+_nc_str_copy(string_desc * dst, string_desc * src)
+{
+    *dst = *src;
+    return dst;
+}
+
+/*
+ * Replaces strcat into a fixed buffer, returning false on failure.
+ */
+NCURSES_EXPORT(bool)
+_nc_safe_strcat(string_desc * dst, const char *src)
+{
+    if (PRESENT(src)) {
+	size_t len = strlen(src);
+
+	if (len < dst->s_size) {
+	    if (dst->s_tail != 0) {
+		_nc_STRCPY(dst->s_tail, src, dst->s_size);
+		dst->s_tail += len;
+	    }
+	    dst->s_size -= len;
+	    return TRUE;
+	}
+    }
+    return FALSE;
+}
+
+/*
+ * Replaces strcpy into a fixed buffer, returning false on failure.
+ */
+NCURSES_EXPORT(bool)
+_nc_safe_strcpy(string_desc * dst, const char *src)
+{
+    if (PRESENT(src)) {
+	size_t len = strlen(src);
+
+	if (len < dst->s_size) {
+	    if (dst->s_head != 0) {
+		_nc_STRCPY(dst->s_head, src, dst->s_size);
+		dst->s_tail = dst->s_head + len;
+	    }
+	    dst->s_size = dst->s_init - len;
+	    return TRUE;
+	}
+    }
+    return FALSE;
+}
diff --git a/ncurses/tinfo/tinfo_driver.c b/ncurses/tinfo/tinfo_driver.c
new file mode 100644
index 0000000..eb4ecb3
--- /dev/null
+++ b/ncurses/tinfo/tinfo_driver.c
@@ -0,0 +1,1554 @@
+/****************************************************************************
+ * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 2008-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Juergen Pfeifer                                                 *
+ *     and: Thomas E. Dickey                                                *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+#define CUR TerminalType((TERMINAL*)TCB).
+#include <tic.h>
+#include <termcap.h>		/* ospeed */
+
+#if HAVE_NANOSLEEP
+#include <time.h>
+#if HAVE_SYS_TIME_H
+#include <sys/time.h>		/* needed for MacOS X DP3 */
+#endif
+#endif
+
+#if HAVE_SIZECHANGE
+# if !defined(sun) || !TERMIOS
+#  if HAVE_SYS_IOCTL_H
+#   include <sys/ioctl.h>
+#  endif
+# endif
+#endif
+
+MODULE_ID("$Id: tinfo_driver.c,v 1.73 2022/08/13 14:36:43 tom Exp $")
+
+/*
+ * SCO defines TIOCGSIZE and the corresponding struct.  Other systems (SunOS,
+ * Solaris, IRIX) define TIOCGWINSZ and struct winsize.
+ */
+#ifdef TIOCGSIZE
+# define IOCTL_WINSIZE TIOCGSIZE
+# define STRUCT_WINSIZE struct ttysize
+# define WINSIZE_ROWS(n) (int)n.ts_lines
+# define WINSIZE_COLS(n) (int)n.ts_cols
+#else
+# ifdef TIOCGWINSZ
+#  define IOCTL_WINSIZE TIOCGWINSZ
+#  define STRUCT_WINSIZE struct winsize
+#  define WINSIZE_ROWS(n) (int)n.ws_row
+#  define WINSIZE_COLS(n) (int)n.ws_col
+# endif
+#endif
+
+/*
+ * These should be screen structure members.  They need to be globals for
+ * historical reasons.  So we assign them in start_color() and also in
+ * set_term()'s screen-switching logic.
+ */
+#if USE_REENTRANT
+NCURSES_EXPORT(int)
+NCURSES_PUBLIC_VAR(COLOR_PAIRS) (void)
+{
+    return CURRENT_SCREEN ? CURRENT_SCREEN->_pair_count : -1;
+}
+NCURSES_EXPORT(int)
+NCURSES_PUBLIC_VAR(COLORS) (void)
+{
+    return CURRENT_SCREEN ? CURRENT_SCREEN->_color_count : -1;
+}
+#else
+NCURSES_EXPORT_VAR(int) COLOR_PAIRS = 0;
+NCURSES_EXPORT_VAR(int) COLORS = 0;
+#endif
+
+#define TCBMAGIC NCDRV_MAGIC(NCDRV_TINFO)
+#define AssertTCB() assert(TCB!=0 && TCB->magic==TCBMAGIC)
+#define SetSP() assert(TCB->csp!=0); sp = TCB->csp; (void) sp
+
+/*
+ * This routine needs to do all the work to make curscr look
+ * like newscr.
+ */
+static int
+drv_doupdate(TERMINAL_CONTROL_BLOCK * TCB)
+{
+    AssertTCB();
+    return TINFO_DOUPDATE(TCB->csp);
+}
+
+static const char *
+drv_Name(TERMINAL_CONTROL_BLOCK * TCB)
+{
+    (void) TCB;
+    return "tinfo";
+}
+
+static void
+get_baudrate(TERMINAL *termp)
+{
+    int my_ospeed;
+    int result;
+    if (GET_TTY(termp->Filedes, &termp->Nttyb) == OK) {
+#ifdef TERMIOS
+	termp->Nttyb.c_oflag &= (unsigned) (~OFLAGS_TABS);
+#elif defined(EXP_WIN32_DRIVER)
+	/* noop */
+#else
+	termp->Nttyb.sg_flags &= (unsigned) (~XTABS);
+#endif
+    }
+#ifdef USE_OLD_TTY
+    result = (int) cfgetospeed(&(termp->Nttyb));
+    my_ospeed = (NCURSES_OSPEED) _nc_ospeed(result);
+#else /* !USE_OLD_TTY */
+#ifdef TERMIOS
+    my_ospeed = (NCURSES_OSPEED) cfgetospeed(&(termp->Nttyb));
+#elif defined(EXP_WIN32_DRIVER)
+    /* noop */
+    my_ospeed = 0;
+#else
+    my_ospeed = (NCURSES_OSPEED) termp->Nttyb.sg_ospeed;
+#endif
+    result = _nc_baudrate(my_ospeed);
+#endif
+    termp->_baudrate = result;
+    ospeed = (NCURSES_OSPEED) my_ospeed;
+}
+
+#undef SETUP_FAIL
+#define SETUP_FAIL FALSE
+
+#define NO_COPY {}
+
+static bool
+drv_CanHandle(TERMINAL_CONTROL_BLOCK * TCB, const char *tname, int *errret)
+{
+    bool result = FALSE;
+    int status;
+    TERMINAL *termp;
+    SCREEN *sp;
+
+    START_TRACE();
+    T((T_CALLED("tinfo::drv_CanHandle(%p)"), (void *) TCB));
+
+    assert(TCB != 0 && tname != 0);
+    termp = (TERMINAL *) TCB;
+    sp = TCB->csp;
+    TCB->magic = TCBMAGIC;
+
+#if (NCURSES_USE_DATABASE || NCURSES_USE_TERMCAP)
+    status = _nc_setup_tinfo(tname, &TerminalType(termp));
+    T(("_nc_setup_tinfo returns %d", status));
+#else
+    T(("no database available"));
+    status = TGETENT_NO;
+#endif
+
+    /* try fallback list if entry on disk */
+    if (status != TGETENT_YES) {
+	const TERMTYPE2 *fallback = _nc_fallback2(tname);
+
+	if (fallback) {
+	    T(("found fallback entry"));
+	    TerminalType(termp) = *fallback;
+	    status = TGETENT_YES;
+	}
+    }
+
+    if (status != TGETENT_YES) {
+	NCURSES_SP_NAME(del_curterm) (NCURSES_SP_ARGx termp);
+	if (status == TGETENT_ERR) {
+	    ret_error0(status, "terminals database is inaccessible\n");
+	} else if (status == TGETENT_NO) {
+	    ret_error1(status, "unknown terminal type.\n",
+		       tname, NO_COPY);
+	} else {
+	    ret_error0(status, "unexpected return-code\n");
+	}
+    }
+    result = TRUE;
+#if NCURSES_EXT_NUMBERS
+    _nc_export_termtype2(&termp->type, &TerminalType(termp));
+#endif
+#if !USE_REENTRANT
+    save_ttytype(termp);
+#endif
+
+    if (command_character)
+	_nc_tinfo_cmdch(termp, *command_character);
+
+    /*
+     * If an application calls setupterm() rather than initscr() or
+     * newterm(), we will not have the def_prog_mode() call in
+     * _nc_setupscreen().  Do it now anyway, so we can initialize the
+     * baudrate.
+     */
+    if (sp == 0 && NC_ISATTY(termp->Filedes)) {
+	get_baudrate(termp);
+    }
+#if NCURSES_EXT_NUMBERS
+#define cleanup_termtype() \
+    _nc_free_termtype2(&TerminalType(termp)); \
+    _nc_free_termtype(&termp->type)
+#else
+#define cleanup_termtype() \
+    _nc_free_termtype2(&TerminalType(termp))
+#endif
+
+    if (generic_type) {
+	/*
+	 * BSD 4.3's termcap contains mis-typed "gn" for wy99.  Do a sanity
+	 * check before giving up.
+	 */
+	if ((VALID_STRING(cursor_address)
+	     || (VALID_STRING(cursor_down) && VALID_STRING(cursor_home)))
+	    && VALID_STRING(clear_screen)) {
+	    cleanup_termtype();
+	    ret_error1(TGETENT_YES, "terminal is not really generic.\n",
+		       tname, NO_COPY);
+	} else {
+	    cleanup_termtype();
+	    ret_error1(TGETENT_NO, "I need something more specific.\n",
+		       tname, NO_COPY);
+	}
+    }
+    if (hard_copy) {
+	cleanup_termtype();
+	ret_error1(TGETENT_YES, "I can't handle hardcopy terminals.\n",
+		   tname, NO_COPY);
+    }
+
+    returnBool(result);
+}
+
+static int
+drv_dobeepflash(TERMINAL_CONTROL_BLOCK * TCB, int beepFlag)
+{
+    SCREEN *sp;
+    int res = ERR;
+
+    AssertTCB();
+    SetSP();
+
+    /* FIXME: should make sure that we are not in altchar mode */
+    if (beepFlag) {
+	if (bell) {
+	    res = NCURSES_PUTP2("bell", bell);
+	    NCURSES_SP_NAME(_nc_flush) (sp);
+	} else if (flash_screen) {
+	    res = NCURSES_PUTP2("flash_screen", flash_screen);
+	    NCURSES_SP_NAME(_nc_flush) (sp);
+	}
+    } else {
+	if (flash_screen) {
+	    res = NCURSES_PUTP2("flash_screen", flash_screen);
+	    NCURSES_SP_NAME(_nc_flush) (sp);
+	} else if (bell) {
+	    res = NCURSES_PUTP2("bell", bell);
+	    NCURSES_SP_NAME(_nc_flush) (sp);
+	}
+    }
+    return res;
+}
+
+/*
+ * SVr4 curses is known to interchange color codes (1,4) and (3,6), possibly
+ * to maintain compatibility with a pre-ANSI scheme.  The same scheme is
+ * also used in the FreeBSD syscons.
+ */
+static int
+toggled_colors(int c)
+{
+    if (c < 16) {
+	static const int table[] =
+	{0, 4, 2, 6, 1, 5, 3, 7,
+	 8, 12, 10, 14, 9, 13, 11, 15};
+	c = table[c];
+    }
+    return c;
+}
+
+static int
+drv_print(TERMINAL_CONTROL_BLOCK * TCB, char *data, int len)
+{
+    SCREEN *sp;
+
+    AssertTCB();
+    SetSP();
+#if NCURSES_EXT_FUNCS
+    return NCURSES_SP_NAME(mcprint) (TCB->csp, data, len);
+#else
+    return ERR;
+#endif
+}
+
+static int
+drv_defaultcolors(TERMINAL_CONTROL_BLOCK * TCB, int fg, int bg)
+{
+    SCREEN *sp;
+    int code = ERR;
+
+    AssertTCB();
+    SetSP();
+
+    if (sp != 0 && orig_pair && orig_colors && (initialize_pair != 0)) {
+#if NCURSES_EXT_FUNCS
+	sp->_default_color = isDefaultColor(fg) || isDefaultColor(bg);
+	sp->_has_sgr_39_49 = (NCURSES_SP_NAME(tigetflag) (NCURSES_SP_ARGx
+							  "AX")
+			      == TRUE);
+	sp->_default_fg = isDefaultColor(fg) ? COLOR_DEFAULT : fg;
+	sp->_default_bg = isDefaultColor(bg) ? COLOR_DEFAULT : bg;
+	if (sp->_color_pairs != 0) {
+	    bool save = sp->_default_color;
+	    sp->_default_color = TRUE;
+	    NCURSES_SP_NAME(init_pair) (NCURSES_SP_ARGx
+					0,
+					(short)fg,
+					(short)bg);
+	    sp->_default_color = save;
+	}
+#endif
+	code = OK;
+    }
+    return (code);
+}
+
+static void
+drv_setcolor(TERMINAL_CONTROL_BLOCK * TCB,
+	     int fore,
+	     int color,
+	     NCURSES_SP_OUTC outc)
+{
+    SCREEN *sp;
+
+    AssertTCB();
+    SetSP();
+
+    if (fore) {
+	if (set_a_foreground) {
+	    TPUTS_TRACE("set_a_foreground");
+	    NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx
+				    TIPARM_1(set_a_foreground, color), 1, outc);
+	} else {
+	    TPUTS_TRACE("set_foreground");
+	    NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx
+				    TIPARM_1(set_foreground,
+					     toggled_colors(color)), 1, outc);
+	}
+    } else {
+	if (set_a_background) {
+	    TPUTS_TRACE("set_a_background");
+	    NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx
+				    TIPARM_1(set_a_background, color), 1, outc);
+	} else {
+	    TPUTS_TRACE("set_background");
+	    NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx
+				    TIPARM_1(set_background,
+					     toggled_colors(color)), 1, outc);
+	}
+    }
+}
+
+static bool
+drv_rescol(TERMINAL_CONTROL_BLOCK * TCB)
+{
+    bool result = FALSE;
+    SCREEN *sp;
+
+    AssertTCB();
+    SetSP();
+
+    if (orig_pair != 0) {
+	NCURSES_PUTP2("orig_pair", orig_pair);
+	result = TRUE;
+    }
+    return result;
+}
+
+static bool
+drv_rescolors(TERMINAL_CONTROL_BLOCK * TCB)
+{
+    int result = FALSE;
+    SCREEN *sp;
+
+    AssertTCB();
+    SetSP();
+
+    if (orig_colors != 0) {
+	NCURSES_PUTP2("orig_colors", orig_colors);
+	result = TRUE;
+    }
+    return result;
+}
+
+static int
+drv_size(TERMINAL_CONTROL_BLOCK * TCB, int *linep, int *colp)
+{
+    SCREEN *sp;
+    bool useEnv = TRUE;
+    bool useTioctl = TRUE;
+
+    AssertTCB();
+    sp = TCB->csp;		/* can be null here */
+
+    if (sp) {
+	useEnv = sp->_use_env;
+	useTioctl = sp->use_tioctl;
+    } else {
+	useEnv = _nc_prescreen.use_env;
+	useTioctl = _nc_prescreen.use_tioctl;
+    }
+
+#ifdef EXP_WIN32_DRIVER
+    /* If we are here, then Windows console is used in terminfo mode.
+       We need to figure out the size using the console API
+     */
+    _nc_console_size(linep, colp);
+    T(("screen size: winconsole lines = %d columns = %d", *linep, *colp));
+#else
+    /* figure out the size of the screen */
+    T(("screen size: terminfo lines = %d columns = %d", lines, columns));
+
+    *linep = (int) lines;
+    *colp = (int) columns;
+#endif
+    if (useEnv || useTioctl) {
+	int value;
+
+#ifdef __EMX__
+	{
+	    int screendata[2];
+	    _scrsize(screendata);
+	    *colp = screendata[0];
+	    *linep = ((sp != 0 && sp->_filtered)
+		      ? 1
+		      : screendata[1]);
+	    T(("EMX screen size: environment LINES = %d COLUMNS = %d",
+	       *linep, *colp));
+	}
+#endif
+#if HAVE_SIZECHANGE
+	/* try asking the OS */
+	{
+	    TERMINAL *termp = (TERMINAL *) TCB;
+	    if (NC_ISATTY(termp->Filedes)) {
+		STRUCT_WINSIZE size;
+
+		errno = 0;
+		do {
+		    if (ioctl(termp->Filedes, IOCTL_WINSIZE, &size) >= 0) {
+			*linep = ((sp != 0 && sp->_filtered)
+				  ? 1
+				  : WINSIZE_ROWS(size));
+			*colp = WINSIZE_COLS(size);
+			T(("SYS screen size: environment LINES = %d COLUMNS = %d",
+			   *linep, *colp));
+			break;
+		    }
+		} while
+		    (errno == EINTR);
+	    }
+	}
+#endif /* HAVE_SIZECHANGE */
+
+	if (useEnv) {
+	    if (useTioctl) {
+		/*
+		 * If environment variables are used, update them.
+		 */
+		if ((sp == 0 || !sp->_filtered) && _nc_getenv_num("LINES") > 0) {
+		    _nc_setenv_num("LINES", *linep);
+		}
+		if (_nc_getenv_num("COLUMNS") > 0) {
+		    _nc_setenv_num("COLUMNS", *colp);
+		}
+	    }
+
+	    /*
+	     * Finally, look for environment variables.
+	     *
+	     * Solaris lets users override either dimension with an environment
+	     * variable.
+	     */
+	    if ((value = _nc_getenv_num("LINES")) > 0) {
+		*linep = value;
+		T(("screen size: environment LINES = %d", *linep));
+	    }
+	    if ((value = _nc_getenv_num("COLUMNS")) > 0) {
+		*colp = value;
+		T(("screen size: environment COLUMNS = %d", *colp));
+	    }
+	}
+
+	/* if we can't get dynamic info about the size, use static */
+	if (*linep <= 0) {
+	    *linep = (int) lines;
+	}
+	if (*colp <= 0) {
+	    *colp = (int) columns;
+	}
+
+	/* the ultimate fallback, assume fixed 24x80 size */
+	if (*linep <= 0) {
+	    *linep = 24;
+	}
+	if (*colp <= 0) {
+	    *colp = 80;
+	}
+
+	/*
+	 * Put the derived values back in the screen-size caps, so
+	 * tigetnum() and tgetnum() will do the right thing.
+	 */
+	lines = (short) (*linep);
+	columns = (short) (*colp);
+    }
+
+    T(("screen size is %dx%d", *linep, *colp));
+    return OK;
+}
+
+static int
+drv_getsize(TERMINAL_CONTROL_BLOCK * TCB, int *l, int *c)
+{
+    AssertTCB();
+    assert(l != 0 && c != 0);
+    *l = lines;
+    *c = columns;
+    return OK;
+}
+
+static int
+drv_setsize(TERMINAL_CONTROL_BLOCK * TCB, int l, int c)
+{
+    AssertTCB();
+    lines = (short) l;
+    columns = (short) c;
+    return OK;
+}
+
+static int
+drv_sgmode(TERMINAL_CONTROL_BLOCK * TCB, int setFlag, TTY * buf)
+{
+    SCREEN *sp = TCB->csp;
+    TERMINAL *_term = (TERMINAL *) TCB;
+    int result = OK;
+
+    AssertTCB();
+    if (setFlag) {
+	for (;;) {
+	    if (SET_TTY(_term->Filedes, buf) != 0) {
+		if (errno == EINTR)
+		    continue;
+		if (errno == ENOTTY) {
+		    if (sp)
+			sp->_notty = TRUE;
+		}
+		result = ERR;
+	    }
+	    break;
+	}
+    } else {
+	for (;;) {
+	    if (GET_TTY(_term->Filedes, buf) != 0) {
+		if (errno == EINTR)
+		    continue;
+		result = ERR;
+	    }
+	    break;
+	}
+    }
+    return result;
+}
+
+static int
+drv_mode(TERMINAL_CONTROL_BLOCK * TCB, int progFlag, int defFlag)
+{
+    SCREEN *sp;
+    TERMINAL *_term = (TERMINAL *) TCB;
+    int code = ERR;
+
+    AssertTCB();
+    sp = TCB->csp;
+
+    if (progFlag)		/* prog mode */
+    {
+	if (defFlag) {
+	    /* def_prog_mode */
+	    /*
+	     * Turn off the XTABS bit in the tty structure if it was on.
+	     */
+	    if ((drv_sgmode(TCB, FALSE, &(_term->Nttyb)) == OK)) {
+#ifdef TERMIOS
+		_term->Nttyb.c_oflag &= (unsigned) ~OFLAGS_TABS;
+#elif defined(EXP_WIN32_DRIVER)
+		/* noop */
+#else
+		_term->Nttyb.sg_flags &= (unsigned) ~XTABS;
+#endif
+		code = OK;
+	    }
+	} else {
+	    /* reset_prog_mode */
+	    if (drv_sgmode(TCB, TRUE, &(_term->Nttyb)) == OK) {
+		if (sp) {
+		    if (sp->_keypad_on)
+			_nc_keypad(sp, TRUE);
+		}
+		code = OK;
+	    }
+	}
+    } else {			/* shell mode */
+	if (defFlag) {
+	    /* def_shell_mode */
+	    /*
+	     * If XTABS was on, remove the tab and backtab capabilities.
+	     */
+	    if (drv_sgmode(TCB, FALSE, &(_term->Ottyb)) == OK) {
+#ifdef TERMIOS
+		if (_term->Ottyb.c_oflag & OFLAGS_TABS)
+		    tab = back_tab = NULL;
+#elif defined(EXP_WIN32_DRIVER)
+		/* noop */
+#else
+		if (_term->Ottyb.sg_flags & XTABS)
+		    tab = back_tab = NULL;
+#endif
+		code = OK;
+	    }
+	} else {
+	    /* reset_shell_mode */
+	    if (sp) {
+		_nc_keypad(sp, FALSE);
+		NCURSES_SP_NAME(_nc_flush) (sp);
+	    }
+	    code = drv_sgmode(TCB, TRUE, &(_term->Ottyb));
+	}
+    }
+    return (code);
+}
+
+static void
+drv_wrap(SCREEN *sp)
+{
+    if (sp) {
+	sp->_mouse_wrap(sp);
+	NCURSES_SP_NAME(_nc_screen_wrap) (sp);
+	NCURSES_SP_NAME(_nc_mvcur_wrap) (sp);	/* wrap up cursor addressing */
+    }
+}
+
+static void
+drv_release(TERMINAL_CONTROL_BLOCK * TCB GCC_UNUSED)
+{
+}
+
+#  define SGR0_TEST(mode) (mode != 0) && (exit_attribute_mode == 0 || strcmp(mode, exit_attribute_mode))
+
+static void
+drv_screen_init(SCREEN *sp)
+{
+    TERMINAL_CONTROL_BLOCK *TCB = TCBOf(sp);
+
+    AssertTCB();
+
+    /*
+     * Check for mismatched graphic-rendition capabilities.  Most SVr4
+     * terminfo trees contain entries that have rmul or rmso equated to
+     * sgr0 (Solaris curses copes with those entries).  We do this only
+     * for curses, since many termcap applications assume that
+     * smso/rmso and smul/rmul are paired, and will not function
+     * properly if we remove rmso or rmul.  Curses applications
+     * shouldn't be looking at this detail.
+     */
+    sp->_use_rmso = SGR0_TEST(exit_standout_mode);
+    sp->_use_rmul = SGR0_TEST(exit_underline_mode);
+
+    /*
+     * Check whether we can optimize scrolling under dumb terminals in
+     * case we do not have any of these capabilities, scrolling
+     * optimization will be useless.
+     */
+    sp->_scrolling = ((scroll_forward && scroll_reverse) ||
+		      ((parm_rindex ||
+			parm_insert_line ||
+			insert_line) &&
+		       (parm_index ||
+			parm_delete_line ||
+			delete_line)));
+
+    NCURSES_SP_NAME(baudrate) (sp);
+
+    NCURSES_SP_NAME(_nc_mvcur_init) (sp);
+    /* initialize terminal to a sane state */
+    NCURSES_SP_NAME(_nc_screen_init) (sp);
+}
+
+static void
+drv_init(TERMINAL_CONTROL_BLOCK * TCB)
+{
+    TERMINAL *trm;
+
+    AssertTCB();
+
+    trm = (TERMINAL *) TCB;
+
+    TCB->info.initcolor = VALID_STRING(initialize_color);
+    TCB->info.canchange = can_change;
+    TCB->info.hascolor = ((VALID_NUMERIC(max_colors) && VALID_NUMERIC(max_pairs)
+			   && (((set_foreground != NULL)
+				&& (set_background != NULL))
+			       || ((set_a_foreground != NULL)
+				   && (set_a_background != NULL))
+			       || set_color_pair)) ? TRUE : FALSE);
+
+    TCB->info.caninit = !(exit_ca_mode && non_rev_rmcup);
+
+    TCB->info.maxpairs = VALID_NUMERIC(max_pairs) ? max_pairs : 0;
+    TCB->info.maxcolors = VALID_NUMERIC(max_colors) ? max_colors : 0;
+    TCB->info.numlabels = VALID_NUMERIC(num_labels) ? num_labels : 0;
+    TCB->info.labelwidth = VALID_NUMERIC(label_width) ? label_width : 0;
+    TCB->info.labelheight = VALID_NUMERIC(label_height) ? label_height : 0;
+    TCB->info.nocolorvideo = VALID_NUMERIC(no_color_video) ? no_color_video
+	: 0;
+    TCB->info.tabsize = VALID_NUMERIC(init_tabs) ? (int) init_tabs : 8;
+
+    TCB->info.defaultPalette = hue_lightness_saturation ? _nc_hls_palette : _nc_cga_palette;
+
+    /*
+     * If an application calls setupterm() rather than initscr() or
+     * newterm(), we will not have the def_prog_mode() call in
+     * _nc_setupscreen().  Do it now anyway, so we can initialize the
+     * baudrate.
+     */
+    if (NC_ISATTY(trm->Filedes)) {
+	TCB->drv->td_mode(TCB, TRUE, TRUE);
+    }
+}
+
+#define MAX_PALETTE	8
+#define InPalette(n)	((n) >= 0 && (n) < MAX_PALETTE)
+
+static void
+drv_initpair(TERMINAL_CONTROL_BLOCK * TCB, int pair, int f, int b)
+{
+    SCREEN *sp;
+
+    AssertTCB();
+    SetSP();
+
+    if ((initialize_pair != NULL) && InPalette(f) && InPalette(b)) {
+	const color_t *tp = InfoOf(sp).defaultPalette;
+
+	TR(TRACE_ATTRS,
+	   ("initializing pair: pair = %d, fg=(%d,%d,%d), bg=(%d,%d,%d)",
+	    pair,
+	    tp[f].red, tp[f].green, tp[f].blue,
+	    tp[b].red, tp[b].green, tp[b].blue));
+
+	NCURSES_PUTP2("initialize_pair",
+		      TIPARM_7(initialize_pair,
+			       pair,
+			       tp[f].red, tp[f].green, tp[f].blue,
+			       tp[b].red, tp[b].green, tp[b].blue));
+    }
+}
+
+static int
+default_fg(SCREEN *sp)
+{
+#if NCURSES_EXT_FUNCS
+    return (sp != 0) ? sp->_default_fg : COLOR_WHITE;
+#else
+    return COLOR_WHITE;
+#endif
+}
+
+static int
+default_bg(SCREEN *sp)
+{
+#if NCURSES_EXT_FUNCS
+    return sp != 0 ? sp->_default_bg : COLOR_BLACK;
+#else
+    return COLOR_BLACK;
+#endif
+}
+
+static void
+drv_initcolor(TERMINAL_CONTROL_BLOCK * TCB,
+	      int color, int r, int g, int b)
+{
+    SCREEN *sp = TCB->csp;
+
+    AssertTCB();
+    if (initialize_color != NULL) {
+	NCURSES_PUTP2("initialize_color",
+		      TIPARM_4(initialize_color, color, r, g, b));
+    }
+}
+
+static void
+drv_do_color(TERMINAL_CONTROL_BLOCK * TCB,
+	     int old_pair,
+	     int pair,
+	     int reverse,
+	     NCURSES_SP_OUTC outc)
+{
+    SCREEN *sp = TCB->csp;
+    int fg = COLOR_DEFAULT;
+    int bg = COLOR_DEFAULT;
+    int old_fg, old_bg;
+
+    AssertTCB();
+    if (sp == 0)
+	return;
+
+    if (pair < 0 || pair >= COLOR_PAIRS) {
+	return;
+    } else if (pair != 0) {
+	if (set_color_pair) {
+	    TPUTS_TRACE("set_color_pair");
+	    NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx
+				    TIPARM_1(set_color_pair, pair), 1, outc);
+	    return;
+	} else if (sp != 0) {
+	    _nc_pair_content(SP_PARM, pair, &fg, &bg);
+	}
+    }
+
+    if (old_pair >= 0
+	&& sp != 0
+	&& _nc_pair_content(SP_PARM, old_pair, &old_fg, &old_bg) != ERR) {
+	if ((isDefaultColor(fg) && !isDefaultColor(old_fg))
+	    || (isDefaultColor(bg) && !isDefaultColor(old_bg))) {
+#if NCURSES_EXT_FUNCS
+	    /*
+	     * A minor optimization - but extension.  If "AX" is specified in
+	     * the terminal description, treat it as screen's indicator of ECMA
+	     * SGR 39 and SGR 49, and assume the two sequences are independent.
+	     */
+	    if (sp->_has_sgr_39_49
+		&& isDefaultColor(old_bg)
+		&& !isDefaultColor(old_fg)) {
+		NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx "\033[39m", 1, outc);
+	    } else if (sp->_has_sgr_39_49
+		       && isDefaultColor(old_fg)
+		       && !isDefaultColor(old_bg)) {
+		NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx "\033[49m", 1, outc);
+	    } else
+#endif
+		drv_rescol(TCB);
+	}
+    } else {
+	drv_rescol(TCB);
+	if (old_pair < 0)
+	    return;
+    }
+
+#if NCURSES_EXT_FUNCS
+    if (isDefaultColor(fg))
+	fg = default_fg(sp);
+    if (isDefaultColor(bg))
+	bg = default_bg(sp);
+#endif
+
+    if (reverse) {
+	int xx = fg;
+	fg = bg;
+	bg = xx;
+    }
+
+    TR(TRACE_ATTRS, ("setting colors: pair = %d, fg = %d, bg = %d", pair,
+		     fg, bg));
+
+    if (!isDefaultColor(fg)) {
+	drv_setcolor(TCB, TRUE, fg, outc);
+    }
+    if (!isDefaultColor(bg)) {
+	drv_setcolor(TCB, FALSE, bg, outc);
+    }
+}
+
+#define xterm_kmous "\033[M"
+static void
+init_xterm_mouse(SCREEN *sp)
+{
+    sp->_mouse_type = M_XTERM;
+    sp->_mouse_xtermcap = NCURSES_SP_NAME(tigetstr) (NCURSES_SP_ARGx "XM");
+    if (!VALID_STRING(sp->_mouse_xtermcap))
+	sp->_mouse_xtermcap = "\033[?1000%?%p1%{1}%=%th%el%;";
+}
+
+static void
+drv_initmouse(TERMINAL_CONTROL_BLOCK * TCB)
+{
+    SCREEN *sp;
+
+    AssertTCB();
+    SetSP();
+
+    /* we know how to recognize mouse events under "xterm" */
+    if (sp != 0) {
+	if (NonEmpty(key_mouse)) {
+	    init_xterm_mouse(sp);
+	} else if (strstr(SP_TERMTYPE term_names, "xterm") != 0) {
+	    if (_nc_add_to_try(&(sp->_keytry), xterm_kmous, KEY_MOUSE) == OK)
+		init_xterm_mouse(sp);
+	}
+    }
+}
+
+static int
+drv_testmouse(TERMINAL_CONTROL_BLOCK * TCB,
+	      int delay
+	      EVENTLIST_2nd(_nc_eventlist * evl))
+{
+    int rc = 0;
+    SCREEN *sp;
+
+    AssertTCB();
+    SetSP();
+
+#if USE_SYSMOUSE
+    if ((sp->_mouse_type == M_SYSMOUSE)
+	&& (sp->_sysmouse_head < sp->_sysmouse_tail)) {
+	rc = TW_MOUSE;
+    } else
+#endif
+    {
+#ifdef EXP_WIN32_DRIVER
+	rc = _nc_console_testmouse(sp,
+				   _nc_console_handle(sp->_ifd),
+				   delay
+				   EVENTLIST_2nd(evl));
+#else
+	rc = TCBOf(sp)->drv->td_twait(TCBOf(sp),
+				      TWAIT_MASK,
+				      delay,
+				      (int *) 0
+				      EVENTLIST_2nd(evl));
+#endif
+#if USE_SYSMOUSE
+	if ((sp->_mouse_type == M_SYSMOUSE)
+	    && (sp->_sysmouse_head < sp->_sysmouse_tail)
+	    && (rc == 0)
+	    && (errno == EINTR)) {
+	    rc |= TW_MOUSE;
+	}
+#endif
+    }
+    return rc;
+}
+
+static int
+drv_mvcur(TERMINAL_CONTROL_BLOCK * TCB, int yold, int xold, int ynew, int xnew)
+{
+    SCREEN *sp = TCB->csp;
+    AssertTCB();
+    return NCURSES_SP_NAME(_nc_mvcur) (sp, yold, xold, ynew, xnew);
+}
+
+static void
+drv_hwlabel(TERMINAL_CONTROL_BLOCK * TCB, int labnum, char *text)
+{
+    SCREEN *sp = TCB->csp;
+
+    AssertTCB();
+    if (labnum > 0 && labnum <= num_labels) {
+	NCURSES_PUTP2("plab_norm",
+		      TPARM_2(plab_norm, labnum, text));
+    }
+}
+
+static void
+drv_hwlabelOnOff(TERMINAL_CONTROL_BLOCK * TCB, int OnFlag)
+{
+    SCREEN *sp = TCB->csp;
+
+    AssertTCB();
+    if (OnFlag) {
+	NCURSES_PUTP2("label_on", label_on);
+    } else {
+	NCURSES_PUTP2("label_off", label_off);
+    }
+}
+
+static chtype
+drv_conattr(TERMINAL_CONTROL_BLOCK * TCB)
+{
+    SCREEN *sp = TCB->csp;
+    chtype attrs = A_NORMAL;
+
+    AssertTCB();
+    if (enter_alt_charset_mode)
+	attrs |= A_ALTCHARSET;
+
+    if (enter_blink_mode)
+	attrs |= A_BLINK;
+
+    if (enter_bold_mode)
+	attrs |= A_BOLD;
+
+    if (enter_dim_mode)
+	attrs |= A_DIM;
+
+    if (enter_reverse_mode)
+	attrs |= A_REVERSE;
+
+    if (enter_standout_mode)
+	attrs |= A_STANDOUT;
+
+    if (enter_protected_mode)
+	attrs |= A_PROTECT;
+
+    if (enter_secure_mode)
+	attrs |= A_INVIS;
+
+    if (enter_underline_mode)
+	attrs |= A_UNDERLINE;
+
+    if (sp && sp->_coloron)
+	attrs |= A_COLOR;
+
+#if USE_ITALIC
+    if (enter_italics_mode)
+	attrs |= A_ITALIC;
+#endif
+
+    return (attrs);
+}
+
+static void
+drv_setfilter(TERMINAL_CONTROL_BLOCK * TCB)
+{
+    AssertTCB();
+
+    /* *INDENT-EQLS* */
+    clear_screen     = ABSENT_STRING;
+    cursor_address   = ABSENT_STRING;
+    cursor_down      = ABSENT_STRING;
+    cursor_up        = ABSENT_STRING;
+    parm_down_cursor = ABSENT_STRING;
+    parm_up_cursor   = ABSENT_STRING;
+    row_address      = ABSENT_STRING;
+    cursor_home      = carriage_return;
+
+    if (back_color_erase)
+	clr_eos = ABSENT_STRING;
+}
+
+static void
+drv_initacs(TERMINAL_CONTROL_BLOCK * TCB, chtype *real_map, chtype *fake_map)
+{
+    SCREEN *sp = TCB->csp;
+
+    AssertTCB();
+    assert(sp != 0);
+    if (ena_acs != NULL) {
+	NCURSES_PUTP2("ena_acs", ena_acs);
+    }
+#if NCURSES_EXT_FUNCS
+    /*
+     * Linux console "supports" the "PC ROM" character set by the coincidence
+     * that smpch/rmpch and smacs/rmacs have the same values.  ncurses has
+     * no codepage support (see SCO Merge for an example).  Outside of the
+     * values defined in acsc, there are no definitions for the "PC ROM"
+     * character set (assumed by some applications to be codepage 437), but we
+     * allow those applications to use those codepoints.
+     *
+     * test/blue.c uses this feature.
+     */
+#define PCH_KLUDGE(a,b) (a != 0 && b != 0 && !strcmp(a,b))
+    if (PCH_KLUDGE(enter_pc_charset_mode, enter_alt_charset_mode) &&
+	PCH_KLUDGE(exit_pc_charset_mode, exit_alt_charset_mode)) {
+	size_t i;
+	for (i = 1; i < ACS_LEN; ++i) {
+	    if (real_map[i] == 0) {
+		real_map[i] = (chtype) i;
+		if (real_map != fake_map) {
+		    if (sp != 0)
+			sp->_screen_acs_map[i] = TRUE;
+		}
+	    }
+	}
+    }
+#endif
+
+    if (acs_chars != NULL) {
+	size_t i = 0;
+	size_t length = strlen(acs_chars);
+
+	while (i + 1 < length) {
+	    if (acs_chars[i] != 0 && UChar(acs_chars[i]) < ACS_LEN) {
+		real_map[UChar(acs_chars[i])] = UChar(acs_chars[i + 1]) | A_ALTCHARSET;
+		T(("#%d real_map[%s] = %s",
+		   (int) i,
+		   _tracechar(UChar(acs_chars[i])),
+		   _tracechtype(real_map[UChar(acs_chars[i])])));
+		if (sp != 0) {
+		    sp->_screen_acs_map[UChar(acs_chars[i])] = TRUE;
+		}
+	    }
+	    i += 2;
+	}
+    }
+#ifdef TRACE
+    /* Show the equivalent mapping, noting if it does not match the
+     * given attribute, whether by re-ordering or duplication.
+     */
+    if (USE_TRACEF(TRACE_CALLS)) {
+	size_t n, m;
+	char show[ACS_LEN * 2 + 1];
+	for (n = 1, m = 0; n < ACS_LEN; n++) {
+	    if (real_map[n] != 0) {
+		show[m++] = (char) n;
+		show[m++] = (char) ChCharOf(real_map[n]);
+	    }
+	}
+	show[m] = 0;
+	if (acs_chars == NULL || strcmp(acs_chars, show))
+	    _tracef("%s acs_chars %s",
+		    (acs_chars == NULL) ? "NULL" : "READ",
+		    _nc_visbuf(acs_chars));
+	_tracef("%s acs_chars %s",
+		(acs_chars == NULL)
+		? "NULL"
+		: (strcmp(acs_chars, show)
+		   ? "DIFF"
+		   : "SAME"),
+		_nc_visbuf(show));
+	_nc_unlock_global(tracef);
+    }
+#endif /* TRACE */
+}
+
+#define ENSURE_TINFO(sp) (TCBOf(sp)->drv->isTerminfo)
+
+NCURSES_EXPORT(void)
+_nc_cookie_init(SCREEN *sp)
+{
+    bool support_cookies = USE_XMC_SUPPORT;
+    TERMINAL_CONTROL_BLOCK *TCB = (TERMINAL_CONTROL_BLOCK *) (sp->_term);
+
+    if (sp == 0 || !ENSURE_TINFO(sp))
+	return;
+
+#if USE_XMC_SUPPORT
+    /*
+     * If we have no magic-cookie support compiled-in, or if it is suppressed
+     * in the environment, reset the support-flag.
+     */
+    if (magic_cookie_glitch >= 0) {
+	if (getenv("NCURSES_NO_MAGIC_COOKIE") != 0) {
+	    support_cookies = FALSE;
+	}
+    }
+#endif
+
+    if (!support_cookies && magic_cookie_glitch >= 0) {
+	T(("will disable attributes to work w/o magic cookies"));
+    }
+
+    if (magic_cookie_glitch > 0) {	/* tvi, wyse */
+
+	sp->_xmc_triggers = sp->_ok_attributes & XMC_CONFLICT;
+#if 0
+	/*
+	 * We "should" treat colors as an attribute.  The wyse350 (and its
+	 * clones) appear to be the only ones that have both colors and magic
+	 * cookies.
+	 */
+	if (has_colors()) {
+	    sp->_xmc_triggers |= A_COLOR;
+	}
+#endif
+	sp->_xmc_suppress = sp->_xmc_triggers & (chtype) ~(A_BOLD);
+
+	T(("magic cookie attributes %s", _traceattr(sp->_xmc_suppress)));
+	/*
+	 * Supporting line-drawing may be possible.  But make the regular
+	 * video attributes work first.
+	 */
+	acs_chars = ABSENT_STRING;
+	ena_acs = ABSENT_STRING;
+	enter_alt_charset_mode = ABSENT_STRING;
+	exit_alt_charset_mode = ABSENT_STRING;
+#if USE_XMC_SUPPORT
+	/*
+	 * To keep the cookie support simple, suppress all of the optimization
+	 * hooks except for clear_screen and the cursor addressing.
+	 */
+	if (support_cookies) {
+	    clr_eol = ABSENT_STRING;
+	    clr_eos = ABSENT_STRING;
+	    set_attributes = ABSENT_STRING;
+	}
+#endif
+    } else if (magic_cookie_glitch == 0) {	/* hpterm */
+    }
+
+    /*
+     * If magic cookies are not supported, cancel the strings that set
+     * video attributes.
+     */
+    if (!support_cookies && magic_cookie_glitch >= 0) {
+	magic_cookie_glitch = ABSENT_NUMERIC;
+	set_attributes = ABSENT_STRING;
+	enter_blink_mode = ABSENT_STRING;
+	enter_bold_mode = ABSENT_STRING;
+	enter_dim_mode = ABSENT_STRING;
+	enter_reverse_mode = ABSENT_STRING;
+	enter_standout_mode = ABSENT_STRING;
+	enter_underline_mode = ABSENT_STRING;
+    }
+
+    /* initialize normal acs before wide, since we use mapping in the latter */
+#if !USE_WIDEC_SUPPORT
+    if (_nc_unicode_locale() && _nc_locale_breaks_acs(sp->_term)) {
+	acs_chars = NULL;
+	ena_acs = NULL;
+	enter_alt_charset_mode = NULL;
+	exit_alt_charset_mode = NULL;
+	set_attributes = NULL;
+    }
+#endif
+}
+
+static int
+drv_twait(TERMINAL_CONTROL_BLOCK * TCB,
+	  int mode,
+	  int milliseconds,
+	  int *timeleft
+	  EVENTLIST_2nd(_nc_eventlist * evl))
+{
+    SCREEN *sp;
+
+    AssertTCB();
+    SetSP();
+#ifdef EXP_WIN32_DRIVER
+    return _nc_console_twait(sp,
+			     _nc_console_handle(sp->_ifd),
+			     mode,
+			     milliseconds,
+			     timeleft EVENTLIST_2nd(evl));
+#else
+    return _nc_timed_wait(sp, mode, milliseconds, timeleft EVENTLIST_2nd(evl));
+#endif
+}
+
+static int
+drv_read(TERMINAL_CONTROL_BLOCK * TCB, int *buf)
+{
+    SCREEN *sp;
+    int n;
+#ifndef EXP_WIN32_DRIVER
+    unsigned char c2 = 0;
+#endif
+
+    AssertTCB();
+    assert(buf);
+    SetSP();
+
+    _nc_set_read_thread(TRUE);
+#ifdef EXP_WIN32_DRIVER
+    n = _nc_console_read(sp,
+			 _nc_console_handle(sp->_ifd),
+			 buf);
+#else
+    n = (int) read(sp->_ifd, &c2, (size_t) 1);
+#endif
+    _nc_set_read_thread(FALSE);
+#ifndef EXP_WIN32_DRIVER
+    *buf = (int) c2;
+#endif
+    return n;
+}
+
+static int
+drv_nap(TERMINAL_CONTROL_BLOCK * TCB GCC_UNUSED, int ms)
+{
+#if HAVE_NANOSLEEP
+    {
+	struct timespec request, remaining;
+	request.tv_sec = ms / 1000;
+	request.tv_nsec = (ms % 1000) * 1000000;
+	while (nanosleep(&request, &remaining) == -1
+	       && errno == EINTR) {
+	    request = remaining;
+	}
+    }
+#elif defined(EXP_WIN32_DRIVER)
+    Sleep((DWORD) ms);
+#else
+    _nc_timed_wait(0, 0, ms, (int *) 0 EVENTLIST_2nd(0));
+#endif
+    return OK;
+}
+
+static int
+__nc_putp(SCREEN *sp, const char *name GCC_UNUSED, const char *value)
+{
+    int rc = ERR;
+
+    if (value) {
+	rc = NCURSES_PUTP2(name, value);
+    }
+    return rc;
+}
+
+static int
+__nc_putp_flush(SCREEN *sp, const char *name, const char *value)
+{
+    int rc = __nc_putp(sp, name, value);
+    if (rc != ERR) {
+	NCURSES_SP_NAME(_nc_flush) (sp);
+    }
+    return rc;
+}
+
+static int
+drv_kpad(TERMINAL_CONTROL_BLOCK * TCB, int flag)
+{
+    int ret = ERR;
+    SCREEN *sp;
+
+    AssertTCB();
+
+    sp = TCB->csp;
+
+    if (sp) {
+	if (flag) {
+	    (void) __nc_putp_flush(sp, "keypad_xmit", keypad_xmit);
+	} else if (!flag && keypad_local) {
+	    (void) __nc_putp_flush(sp, "keypad_local", keypad_local);
+	}
+	if (flag && !sp->_tried) {
+	    _nc_init_keytry(sp);
+	    sp->_tried = TRUE;
+	}
+	ret = OK;
+    }
+
+    return ret;
+}
+
+static int
+drv_keyok(TERMINAL_CONTROL_BLOCK * TCB, int c, int flag)
+{
+    SCREEN *sp;
+    int code = ERR;
+    int count = 0;
+    char *s;
+
+    AssertTCB();
+    SetSP();
+
+    if (c >= 0) {
+	unsigned ch = (unsigned) c;
+	if (flag) {
+	    while ((s = _nc_expand_try(sp->_key_ok,
+				       ch, &count, (size_t) 0)) != 0) {
+		if (_nc_remove_key(&(sp->_key_ok), ch)) {
+		    code = _nc_add_to_try(&(sp->_keytry), s, ch);
+		    free(s);
+		    count = 0;
+		    if (code != OK)
+			break;
+		} else {
+		    free(s);
+		}
+	    }
+	} else {
+	    while ((s = _nc_expand_try(sp->_keytry,
+				       ch, &count, (size_t) 0)) != 0) {
+		if (_nc_remove_key(&(sp->_keytry), ch)) {
+		    code = _nc_add_to_try(&(sp->_key_ok), s, ch);
+		    free(s);
+		    count = 0;
+		    if (code != OK)
+			break;
+		} else {
+		    free(s);
+		}
+	    }
+	}
+    }
+    return (code);
+}
+
+static int
+drv_cursorSet(TERMINAL_CONTROL_BLOCK * TCB, int vis)
+{
+    SCREEN *sp;
+    int code = ERR;
+
+    AssertTCB();
+    SetSP();
+
+    T((T_CALLED("tinfo:drv_cursorSet(%p,%d)"), (void *) SP_PARM, vis));
+
+    if (SP_PARM != 0 && IsTermInfo(SP_PARM)) {
+	switch (vis) {
+	case 2:
+	    code = NCURSES_PUTP2_FLUSH("cursor_visible", cursor_visible);
+	    break;
+	case 1:
+	    code = NCURSES_PUTP2_FLUSH("cursor_normal", cursor_normal);
+	    break;
+	case 0:
+	    code = NCURSES_PUTP2_FLUSH("cursor_invisible", cursor_invisible);
+	    break;
+	}
+    } else {
+	code = ERR;
+    }
+    returnCode(code);
+}
+
+static bool
+drv_kyExist(TERMINAL_CONTROL_BLOCK * TCB, int key)
+{
+    bool res = FALSE;
+
+    AssertTCB();
+    if (TCB->csp)
+	res = TINFO_HAS_KEY(TCB->csp, key) == 0 ? FALSE : TRUE;
+
+    return res;
+}
+
+NCURSES_EXPORT_VAR (TERM_DRIVER) _nc_TINFO_DRIVER = {
+    TRUE,
+	drv_Name,		/* Name */
+	drv_CanHandle,		/* CanHandle */
+	drv_init,		/* init */
+	drv_release,		/* release */
+	drv_size,		/* size */
+	drv_sgmode,		/* sgmode */
+	drv_conattr,		/* conattr */
+	drv_mvcur,		/* hwcur */
+	drv_mode,		/* mode */
+	drv_rescol,		/* rescol */
+	drv_rescolors,		/* rescolors */
+	drv_setcolor,		/* color */
+	drv_dobeepflash,	/* doBeepOrFlash */
+	drv_initpair,		/* initpair */
+	drv_initcolor,		/* initcolor */
+	drv_do_color,		/* docolor */
+	drv_initmouse,		/* initmouse */
+	drv_testmouse,		/* testmouse */
+	drv_setfilter,		/* setfilter */
+	drv_hwlabel,		/* hwlabel */
+	drv_hwlabelOnOff,	/* hwlabelOnOff */
+	drv_doupdate,		/* update */
+	drv_defaultcolors,	/* defaultcolors */
+	drv_print,		/* print */
+	drv_getsize,		/* getsize */
+	drv_setsize,		/* setsize */
+	drv_initacs,		/* initacs */
+	drv_screen_init,	/* scinit */
+	drv_wrap,		/* scexit */
+	drv_twait,		/* twait  */
+	drv_read,		/* read */
+	drv_nap,		/* nap */
+	drv_kpad,		/* kpad */
+	drv_keyok,		/* kyOk */
+	drv_kyExist,		/* kyExist */
+	drv_cursorSet		/* cursorSet */
+};
+
+#ifdef EXP_WIN32_DRIVER
+/*
+ * The terminfo driver is mandatory and must always be present.
+ * So this is the natural place for the driver initialisation
+ * logic.
+ */
+
+typedef struct DriverEntry {
+    const char *name;
+    TERM_DRIVER *driver;
+} DRIVER_ENTRY;
+
+static DRIVER_ENTRY DriverTable[] =
+{
+#ifdef _NC_WINDOWS
+    {"win32console", &_nc_WIN_DRIVER},
+#endif
+    {"tinfo", &_nc_TINFO_DRIVER}	/* must be last */
+};
+
+NCURSES_EXPORT(int)
+_nc_get_driver(TERMINAL_CONTROL_BLOCK * TCB, const char *name, int *errret)
+{
+    int code = ERR;
+    size_t i;
+    TERM_DRIVER *res = (TERM_DRIVER *) 0;
+    TERM_DRIVER *use = 0;
+
+    T((T_CALLED("_nc_get_driver(%p, %s, %p)"),
+       (void *) TCB, NonNull(name), (void *) errret));
+
+    assert(TCB != 0);
+
+    for (i = 0; i < SIZEOF(DriverTable); i++) {
+	res = DriverTable[i].driver;
+#ifdef _NC_WINDOWS
+	if ((i + 1) == SIZEOF(DriverTable)) {
+	    /* For Windows >= 10.0.17763 Windows Console interface implements
+	       virtual Terminal functionality.
+	       If on Windows td_CanHandle returned FALSE although the terminal
+	       name is empty, we default to ms-terminal as tinfo TERM type.
+	     */
+	    if (name == 0 || *name == 0 || (strcmp(name, "unknown") == 0)) {
+		name = MS_TERMINAL;
+		T(("Set TERM=%s", name));
+	    }
+	}
+#endif
+	if (strcmp(DriverTable[i].name, res->td_name(TCB)) == 0) {
+	    if (res->td_CanHandle(TCB, name, errret)) {
+		use = res;
+		break;
+	    }
+	}
+    }
+    if (use != 0) {
+	TCB->drv = use;
+	code = OK;
+    }
+    returnCode(code);
+}
+#endif /* EXP_WIN32_DRIVER */
diff --git a/ncurses/tinfo/trim_sgr0.c b/ncurses/tinfo/trim_sgr0.c
new file mode 100644
index 0000000..22bc82f
--- /dev/null
+++ b/ncurses/tinfo/trim_sgr0.c
@@ -0,0 +1,336 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 2005-2012,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas Dickey                                                   *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+
+#include <ctype.h>
+
+#include <tic.h>
+
+MODULE_ID("$Id: trim_sgr0.c,v 1.21 2021/06/17 21:20:30 tom Exp $")
+
+#undef CUR
+#define CUR tp->
+
+#define CSI       233
+#define ESC       033		/* ^[ */
+#define L_BRACK   '['
+
+static char *
+set_attribute_9(TERMTYPE2 *tp, int flag)
+{
+    const char *value;
+    char *result;
+
+    value = TIPARM_9(set_attributes, 0, 0, 0, 0, 0, 0, 0, 0, flag);
+    if (PRESENT(value))
+	result = strdup(value);
+    else
+	result = 0;
+    return result;
+}
+
+static int
+is_csi(const char *s)
+{
+    int result = 0;
+    if (s != 0) {
+	if (UChar(s[0]) == CSI)
+	    result = 1;
+	else if (s[0] == ESC && s[1] == L_BRACK)
+	    result = 2;
+    }
+    return result;
+}
+
+static char *
+skip_zero(char *s)
+{
+    if (s[0] == '0') {
+	if (s[1] == ';')
+	    s += 2;
+	else if (isalpha(UChar(s[1])))
+	    s += 1;
+    }
+    return s;
+}
+
+static const char *
+skip_delay(const char *s)
+{
+    if (s[0] == '$' && s[1] == '<') {
+	s += 2;
+	while (isdigit(UChar(*s)) || *s == '/')
+	    ++s;
+	if (*s == '>')
+	    ++s;
+    }
+    return s;
+}
+
+/*
+ * Improve similar_sgr a little by moving the attr-string from the beginning
+ * to the end of the s-string.
+ */
+static bool
+rewrite_sgr(char *s, char *attr)
+{
+    if (s != 0) {
+	if (PRESENT(attr)) {
+	    size_t len_s = strlen(s);
+	    size_t len_a = strlen(attr);
+
+	    if (len_s > len_a && !strncmp(attr, s, len_a)) {
+		unsigned n;
+		TR(TRACE_DATABASE, ("rewrite:\n\t%s", s));
+		for (n = 0; n < len_s - len_a; ++n) {
+		    s[n] = s[n + len_a];
+		}
+		_nc_STRCPY(s + n, attr, strlen(s) + 1);
+		TR(TRACE_DATABASE, ("to:\n\t%s", s));
+	    }
+	}
+	return TRUE;
+    }
+    return FALSE;		/* oops */
+}
+
+static bool
+similar_sgr(char *a, char *b)
+{
+    bool result = FALSE;
+    if (a != 0 && b != 0) {
+	int csi_a = is_csi(a);
+	int csi_b = is_csi(b);
+	size_t len_a;
+	size_t len_b;
+
+	TR(TRACE_DATABASE, ("similar_sgr:\n\t%s\n\t%s",
+			    _nc_visbuf2(1, a),
+			    _nc_visbuf2(2, b)));
+	if (csi_a != 0 && csi_b != 0 && csi_a == csi_b) {
+	    a += csi_a;
+	    b += csi_b;
+	    if (*a != *b) {
+		a = skip_zero(a);
+		b = skip_zero(b);
+	    }
+	}
+	len_a = strlen(a);
+	len_b = strlen(b);
+	if (len_a && len_b) {
+	    if (len_a > len_b)
+		result = (strncmp(a, b, len_b) == 0);
+	    else
+		result = (strncmp(a, b, len_a) == 0);
+	}
+	TR(TRACE_DATABASE, ("...similar_sgr: %d\n\t%s\n\t%s", result,
+			    _nc_visbuf2(1, a),
+			    _nc_visbuf2(2, b)));
+    }
+    return result;
+}
+
+static unsigned
+chop_out(char *string, unsigned i, unsigned j)
+{
+    TR(TRACE_DATABASE, ("chop_out %d..%d from %s", i, j, _nc_visbuf(string)));
+    while (string[j] != '\0') {
+	string[i++] = string[j++];
+    }
+    string[i] = '\0';
+    return i;
+}
+
+/*
+ * Compare, ignoring delays.  Some of the delay values are inconsistent, and
+ * we do not want to be stopped by that.
+ *
+ * Returns the number of chars from 'full' that we matched.  If any mismatch
+ * occurs, return zero.
+ */
+static unsigned
+compare_part(const char *part, const char *full)
+{
+    const char *next_part;
+    const char *next_full;
+    unsigned used_full = 0;
+    unsigned used_delay = 0;
+
+    while (*part != 0) {
+	if (*part != *full) {
+	    used_full = 0;
+	    break;
+	}
+
+	/*
+	 * Adjust the return-value to allow the rare case of
+	 *      string<delay>string
+	 * to remove the whole piece.  The most common case is a delay at the
+	 * end of the string.  The adjusted string will retain the delay, which
+	 * is conservative.
+	 */
+	if (used_delay != 0) {
+	    used_full += used_delay;
+	    used_delay = 0;
+	}
+	if (*part == '$' && *full == '$') {
+	    next_part = skip_delay(part);
+	    next_full = skip_delay(full);
+	    if (next_part != part && next_full != full) {
+		used_delay += (unsigned) (next_full - full);
+		full = next_full;
+		part = next_part;
+		continue;
+	    }
+	}
+	++used_full;
+	++part;
+	++full;
+    }
+    return used_full;
+}
+
+/*
+ * While 'sgr0' is the "same" as termcap 'me', there is a compatibility issue.
+ * The sgr/sgr0 capabilities include setting/clearing alternate character set
+ * mode.  A termcap application cannot use sgr, so sgr0 strings that reset
+ * alternate character set mode will be misinterpreted.  Here, we remove those
+ * from the more common ISO/ANSI/VT100 entries, which have sgr0 agreeing with
+ * sgr.
+ *
+ * This function returns the modified sgr0 if it can be modified, a null if
+ * an error occurs, or the original sgr0 if no change is needed.
+ */
+NCURSES_EXPORT(char *)
+_nc_trim_sgr0(TERMTYPE2 *tp)
+{
+    char *result = exit_attribute_mode;
+
+    T((T_CALLED("_nc_trim_sgr0()")));
+
+    if (PRESENT(exit_attribute_mode)
+	&& PRESENT(set_attributes)) {
+	bool found = FALSE;
+	char *on = set_attribute_9(tp, 1);
+	char *off = set_attribute_9(tp, 0);
+	char *end = strdup(exit_attribute_mode);
+	char *tmp;
+	size_t i, j, k;
+
+	TR(TRACE_DATABASE, ("checking if we can trim sgr0 based on sgr"));
+	TR(TRACE_DATABASE, ("sgr0       %s", _nc_visbuf(end)));
+	TR(TRACE_DATABASE, ("sgr(9:off) %s", _nc_visbuf(off)));
+	TR(TRACE_DATABASE, ("sgr(9:on)  %s", _nc_visbuf(on)));
+
+	if (!rewrite_sgr(on, enter_alt_charset_mode)
+	    || !rewrite_sgr(off, exit_alt_charset_mode)
+	    || !rewrite_sgr(end, exit_alt_charset_mode)) {
+	    FreeIfNeeded(off);
+	} else if (similar_sgr(off, end)
+		   && !similar_sgr(off, on)) {
+	    TR(TRACE_DATABASE, ("adjusting sgr(9:off) : %s", _nc_visbuf(off)));
+	    result = off;
+	    /*
+	     * If rmacs is a substring of sgr(0), remove that chunk.
+	     */
+	    if (PRESENT(exit_alt_charset_mode)) {
+		TR(TRACE_DATABASE, ("scan for rmacs %s", _nc_visbuf(exit_alt_charset_mode)));
+		j = strlen(off);
+		k = strlen(exit_alt_charset_mode);
+		if (j > k) {
+		    for (i = 0; i <= (j - k); ++i) {
+			unsigned k2 = compare_part(exit_alt_charset_mode,
+						   off + i);
+			if (k2 != 0) {
+			    found = TRUE;
+			    chop_out(off, (unsigned) i, (unsigned) (i + k2));
+			    break;
+			}
+		    }
+		}
+	    }
+	    /*
+	     * SGR 10 would reset to normal font.
+	     */
+	    if (!found) {
+		if ((i = (size_t) is_csi(off)) != 0
+		    && off[strlen(off) - 1] == 'm') {
+		    TR(TRACE_DATABASE, ("looking for SGR 10 in %s",
+					_nc_visbuf(off)));
+		    tmp = skip_zero(off + i);
+		    if (tmp[0] == '1'
+			&& skip_zero(tmp + 1) != tmp + 1) {
+			i = (size_t) (tmp - off);
+			if (off[i - 1] == ';')
+			    i--;
+			j = (size_t) (skip_zero(tmp + 1) - off);
+			(void) chop_out(off, (unsigned) i, (unsigned) j);
+			found = TRUE;
+		    }
+		}
+	    }
+	    if (!found
+		&& (tmp = strstr(end, off)) != 0
+		&& strcmp(end, off) != 0) {
+		i = (size_t) (tmp - end);
+		j = strlen(off);
+		tmp = strdup(end);
+		chop_out(tmp, (unsigned) i, (unsigned) j);
+		free(off);
+		result = tmp;
+	    }
+	    TR(TRACE_DATABASE, ("...adjusted sgr0 : %s", _nc_visbuf(result)));
+	    if (!strcmp(result, exit_attribute_mode)) {
+		TR(TRACE_DATABASE, ("...same result, discard"));
+		free(result);
+		result = exit_attribute_mode;
+	    }
+	} else {
+	    /*
+	     * Either the sgr does not reference alternate character set,
+	     * or it is incorrect.  That's too hard to decide right now.
+	     */
+	    free(off);
+	}
+	FreeIfNeeded(end);
+	FreeIfNeeded(on);
+    } else {
+	/*
+	 * Possibly some applications are confused if sgr0 contains rmacs,
+	 * but that would be a different bug report -TD
+	 */
+    }
+
+    returnPtr(result);
+}
diff --git a/ncurses/tinfo/use_screen.c b/ncurses/tinfo/use_screen.c
new file mode 100644
index 0000000..a4bf932
--- /dev/null
+++ b/ncurses/tinfo/use_screen.c
@@ -0,0 +1,63 @@
+/****************************************************************************
+ * Copyright 2018,2020 Thomas E. Dickey                                     *
+ * Copyright 2007-2009,2016 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *     Author: Thomas E. Dickey                        2007                 *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: use_screen.c,v 1.12 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(int)
+use_screen(SCREEN *screen, NCURSES_SCREEN_CB func, void *data)
+{
+    SCREEN *save_SP;
+    int code = OK;
+    TR_FUNC_BFR(1);
+
+    T((T_CALLED("use_screen(%p,%s,%p)"),
+       (void *) screen,
+       TR_FUNC_ARG(0, func),
+       (void *) data));
+
+    /*
+     * FIXME - add a flag so a given thread can check if _it_ has already
+     * recurred through this point, return an error if so.
+     */
+    _nc_lock_global(curses);
+    save_SP = CURRENT_SCREEN;
+    set_term(screen);
+
+    code = func(screen, data);
+
+    set_term(save_SP);
+    _nc_unlock_global(curses);
+    returnCode(code);
+}
diff --git a/ncurses/tinfo/write_entry.c b/ncurses/tinfo/write_entry.c
new file mode 100644
index 0000000..e1baf9e
--- /dev/null
+++ b/ncurses/tinfo/write_entry.c
@@ -0,0 +1,945 @@
+/****************************************************************************
+ * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ ****************************************************************************/
+
+/*
+ *	write_entry.c -- write a terminfo structure onto the file system
+ */
+
+#include <curses.priv.h>
+#include <hashed_db.h>
+
+#include <tic.h>
+
+#if 1
+#define TRACE_OUT(p) DEBUG(2, p)
+#define TRACE_NUM(n) if (VALID_NUMERIC(Numbers[n])) { \
+	TRACE_OUT(("put Numbers[%u]=%d", (unsigned) (n), Numbers[n])); }
+#else
+#define TRACE_OUT(p)		/*nothing */
+#define TRACE_NUM(n)		/* nothing */
+#endif
+
+MODULE_ID("$Id: write_entry.c,v 1.120 2022/04/23 19:59:10 tom Exp $")
+
+static int total_written;
+static int total_parts;
+static int total_size;
+
+static int make_db_root(const char *);
+
+#if !USE_HASHED_DB
+static void
+write_file(char *filename, TERMTYPE2 *tp)
+{
+    char buffer[MAX_ENTRY_SIZE];
+    unsigned limit = sizeof(buffer);
+    unsigned offset = 0;
+
+    if (_nc_write_object(tp, buffer, &offset, limit) == ERR) {
+	_nc_warning("entry is larger than %u bytes", limit);
+    } else {
+	FILE *fp = ((_nc_access(filename, W_OK) == 0)
+		    ? safe_fopen(filename, BIN_W)
+		    : 0);
+	size_t actual;
+
+	if (fp == 0) {
+	    perror(filename);
+	    _nc_syserr_abort("can't open %s/%s", _nc_tic_dir(0), filename);
+	}
+
+	actual = fwrite(buffer, sizeof(char), (size_t) offset, fp);
+	if (actual != offset) {
+	    int myerr = ferror(fp) ? errno : 0;
+	    if (myerr) {
+		_nc_syserr_abort("error writing %s/%s: %s",
+				 _nc_tic_dir(0),
+				 filename,
+				 strerror(myerr));
+	    } else {
+		_nc_syserr_abort("error writing %s/%s: %u bytes vs actual %lu",
+				 _nc_tic_dir(0),
+				 filename,
+				 offset,
+				 (unsigned long) actual);
+	    }
+	} else {
+	    fclose(fp);
+	    DEBUG(1, ("Created %s", filename));
+	}
+    }
+}
+
+/*
+ * Check for access rights to destination directories
+ * Create any directories which don't exist.
+ *
+ * Note:  there's no reason to return the result of make_db_root(), since
+ * this function is called only in instances where that has to succeed.
+ */
+static void
+check_writeable(int code)
+{
+    static const char dirnames[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
+    static bool verified[sizeof(dirnames)];
+
+    char dir[sizeof(LEAF_FMT)];
+    char *s = 0;
+
+    if (code == 0 || (s = (strchr) (dirnames, code)) == 0)
+	_nc_err_abort("Illegal terminfo subdirectory \"" LEAF_FMT "\"", code);
+
+    if (verified[s - dirnames])
+	return;
+
+    _nc_SPRINTF(dir, _nc_SLIMIT(sizeof(dir)) LEAF_FMT, code);
+    if (make_db_root(dir) < 0) {
+	_nc_err_abort("%s/%s: permission denied", _nc_tic_dir(0), dir);
+    }
+
+    verified[s - dirnames] = TRUE;
+}
+#endif /* !USE_HASHED_DB */
+
+static int
+make_db_path(char *dst, const char *src, size_t limit)
+{
+    int rc = -1;
+    const char *top = _nc_tic_dir(0);
+
+    if (src == top || _nc_is_abs_path(src)) {
+	if (strlen(src) + 1 <= limit) {
+	    _nc_STRCPY(dst, src, limit);
+	    rc = 0;
+	}
+    } else {
+	if ((strlen(top) + strlen(src) + 6) <= limit) {
+	    _nc_SPRINTF(dst, _nc_SLIMIT(limit) "%s/%s", top, src);
+	    rc = 0;
+	}
+    }
+#if USE_HASHED_DB
+    if (rc == 0) {
+	static const char suffix[] = DBM_SUFFIX;
+	size_t have = strlen(dst);
+	size_t need = strlen(suffix);
+	if (have > need && strcmp(dst + (int) (have - need), suffix)) {
+	    if (have + need <= limit) {
+		_nc_STRCAT(dst, suffix, limit);
+	    } else {
+		rc = -1;
+	    }
+	} else if (_nc_is_dir_path(dst)) {
+	    rc = -1;
+	}
+    }
+#endif
+    return rc;
+}
+
+/*
+ * Make a database-root if it doesn't exist.
+ */
+static int
+make_db_root(const char *path)
+{
+    int rc;
+    char fullpath[PATH_MAX];
+
+    if ((rc = make_db_path(fullpath, path, sizeof(fullpath))) == 0) {
+#if USE_HASHED_DB
+	DB *capdbp;
+
+	if ((capdbp = _nc_db_open(fullpath, TRUE)) == NULL) {
+	    rc = -1;
+	} else if (_nc_db_close(capdbp) < 0) {
+	    rc = -1;
+	}
+#else
+	struct stat statbuf;
+
+	if ((rc = stat(path, &statbuf)) == -1) {
+	    rc = mkdir(path
+#ifndef _NC_WINDOWS
+		       ,0777
+#endif
+		);
+	} else if (_nc_access(path, R_OK | W_OK | X_OK) < 0) {
+	    rc = -1;		/* permission denied */
+	} else if (!(S_ISDIR(statbuf.st_mode))) {
+	    rc = -1;		/* not a directory */
+	}
+#endif
+    }
+    return rc;
+}
+
+/*
+ * Set the write directory for compiled entries.
+ */
+NCURSES_EXPORT(void)
+_nc_set_writedir(const char *dir)
+{
+    const char *destination;
+    char actual[PATH_MAX];
+
+    if (dir == 0
+#ifndef USE_ROOT_ENVIRON
+	&& use_terminfo_vars()
+#endif
+	)
+	dir = getenv("TERMINFO");
+
+    if (dir != 0)
+	(void) _nc_tic_dir(dir);
+
+    destination = _nc_tic_dir(0);
+    if (make_db_root(destination) < 0) {
+	char *home = _nc_home_terminfo();
+
+	if (home != 0) {
+	    destination = home;
+	    if (make_db_root(destination) < 0)
+		_nc_err_abort("%s: permission denied (errno %d)",
+			      destination, errno);
+	}
+    }
+
+    /*
+     * Note: because of this code, this logic should be exercised
+     * *once only* per run.
+     */
+#if USE_HASHED_DB
+    make_db_path(actual, destination, sizeof(actual));
+#else
+    if (chdir(_nc_tic_dir(destination)) < 0
+	|| getcwd(actual, sizeof(actual)) == 0)
+	_nc_err_abort("%s: not a directory", destination);
+#endif
+    _nc_keep_tic_dir(actual);
+}
+
+/*
+ *	Save the compiled version of a description in the filesystem.
+ *
+ *	make a copy of the name-list
+ *	break it up into first-name and all-but-last-name
+ *	creat(first-name)
+ *	write object information to first-name
+ *	close(first-name)
+ *      for each name in all-but-last-name
+ *	    link to first-name
+ *
+ *	Using 'time()' to obtain a reference for file timestamps is unreliable,
+ *	e.g., with NFS, because the filesystem may have a different time
+ *	reference.  We check for pre-existence of links by latching the first
+ *	timestamp from a file that we create.
+ *
+ *	The _nc_warning() calls will report a correct line number only if
+ *	_nc_curr_line is properly set before the write_entry() call.
+ */
+
+NCURSES_EXPORT(void)
+_nc_write_entry(TERMTYPE2 *const tp)
+{
+#if USE_HASHED_DB
+
+    char buffer[MAX_ENTRY_SIZE + 1];
+    unsigned limit = sizeof(buffer);
+    unsigned offset = 0;
+
+#else /* !USE_HASHED_DB */
+
+    struct stat statbuf;
+    char filename[PATH_MAX];
+    char linkname[PATH_MAX];
+#if USE_SYMLINKS
+    char symlinkname[PATH_MAX];
+#if !HAVE_LINK
+#undef HAVE_LINK
+#define HAVE_LINK 1
+#endif
+#endif /* USE_SYMLINKS */
+
+    unsigned limit2 = sizeof(filename) - (2 + LEAF_LEN);
+    char saved = '\0';
+
+    static int call_count;
+    static time_t start_time;	/* time at start of writes */
+
+#endif /* USE_HASHED_DB */
+
+    char name_list[MAX_TERMINFO_LENGTH];
+    char *first_name, *other_names;
+    char *ptr;
+    char *term_names = tp->term_names;
+    size_t name_size = strlen(term_names);
+
+    if (name_size == 0) {
+	_nc_syserr_abort("no terminal name found.");
+    } else if (name_size >= sizeof(name_list) - 1) {
+	_nc_syserr_abort("terminal name too long: %s", term_names);
+    }
+
+    _nc_STRCPY(name_list, term_names, sizeof(name_list));
+    DEBUG(7, ("Name list = '%s'", name_list));
+
+    first_name = name_list;
+
+    ptr = &name_list[name_size - 1];
+    other_names = ptr + 1;
+
+    while (ptr > name_list && *ptr != '|')
+	ptr--;
+
+    if (ptr != name_list) {
+	*ptr = '\0';
+
+	for (ptr = name_list; *ptr != '\0' && *ptr != '|'; ptr++)
+	    continue;
+
+	if (*ptr == '\0')
+	    other_names = ptr;
+	else {
+	    *ptr = '\0';
+	    other_names = ptr + 1;
+	}
+    }
+
+    DEBUG(7, ("First name = '%s'", first_name));
+    DEBUG(7, ("Other names = '%s'", other_names));
+
+    _nc_set_type(first_name);
+
+#if USE_HASHED_DB
+    if (_nc_write_object(tp, buffer + 1, &offset, limit - 1) != ERR) {
+	DB *capdb = _nc_db_open(_nc_tic_dir(0), TRUE);
+	DBT key, data;
+
+	if (capdb != 0) {
+	    buffer[0] = 0;
+
+	    memset(&key, 0, sizeof(key));
+	    key.data = term_names;
+	    key.size = name_size;
+
+	    memset(&data, 0, sizeof(data));
+	    data.data = buffer;
+	    data.size = offset + 1;
+
+	    _nc_db_put(capdb, &key, &data);
+
+	    buffer[0] = 2;
+
+	    key.data = name_list;
+	    key.size = strlen(name_list);
+
+	    _nc_STRCPY(buffer + 1,
+		       term_names,
+		       sizeof(buffer) - 1);
+	    data.size = name_size + 1;
+
+	    total_size += data.size;
+	    total_parts++;
+	    _nc_db_put(capdb, &key, &data);
+
+	    while (*other_names != '\0') {
+		ptr = other_names++;
+		assert(ptr < buffer + sizeof(buffer) - 1);
+		while (*other_names != '|' && *other_names != '\0')
+		    other_names++;
+
+		if (*other_names != '\0')
+		    *(other_names++) = '\0';
+
+		key.data = ptr;
+		key.size = strlen(ptr);
+
+		total_size += data.size;
+		total_parts++;
+		_nc_db_put(capdb, &key, &data);
+	    }
+	}
+    }
+#else /* !USE_HASHED_DB */
+    if (call_count++ == 0) {
+	start_time = 0;
+    }
+
+    if (strlen(first_name) >= limit2) {
+	_nc_warning("terminal name too long.");
+	saved = first_name[limit2];
+	first_name[limit2] = '\0';
+    }
+
+    _nc_SPRINTF(filename, _nc_SLIMIT(sizeof(filename))
+		LEAF_FMT "/%.*s", UChar(first_name[0]),
+		(int) (sizeof(filename) - (LEAF_LEN + 2)),
+		first_name);
+
+    if (saved)
+	first_name[limit2] = saved;
+
+    /*
+     * Has this primary name been written since the first call to
+     * write_entry()?  If so, the newer write will step on the older,
+     * so warn the user.
+     */
+    if (start_time > 0 &&
+	stat(filename, &statbuf) >= 0
+	&& statbuf.st_mtime >= start_time) {
+#if HAVE_LINK && !USE_SYMLINKS
+	/*
+	 * If the file has more than one link, the reason for the previous
+	 * write could be that the current primary name used to be an alias for
+	 * the previous entry.  In that case, unlink the file so that we will
+	 * not modify the previous entry as we write this one.
+	 */
+	if (statbuf.st_nlink > 1) {
+	    _nc_warning("name redefined.");
+	    unlink(filename);
+	} else {
+	    _nc_warning("name multiply defined.");
+	}
+#else
+	_nc_warning("name multiply defined.");
+#endif
+    }
+
+    check_writeable(first_name[0]);
+    write_file(filename, tp);
+
+    if (start_time == 0) {
+	if (stat(filename, &statbuf) == -1
+	    || (start_time = statbuf.st_mtime) == 0) {
+	    _nc_syserr_abort("error obtaining time from %s/%s",
+			     _nc_tic_dir(0), filename);
+	}
+    }
+    while (*other_names != '\0') {
+	ptr = other_names++;
+	while (*other_names != '|' && *other_names != '\0')
+	    other_names++;
+
+	if (*other_names != '\0')
+	    *(other_names++) = '\0';
+
+	if (strlen(ptr) > sizeof(linkname) - (2 + LEAF_LEN)) {
+	    _nc_warning("terminal alias %s too long.", ptr);
+	    continue;
+	}
+	if (strchr(ptr, '/') != 0) {
+	    _nc_warning("cannot link alias %s.", ptr);
+	    continue;
+	}
+
+	check_writeable(ptr[0]);
+	_nc_SPRINTF(linkname, _nc_SLIMIT(sizeof(linkname))
+		    LEAF_FMT "/%.*s", ptr[0],
+		    (int) sizeof(linkname) - (2 + LEAF_LEN), ptr);
+
+	if (strcmp(filename, linkname) == 0) {
+	    _nc_warning("self-synonym ignored");
+	} else if (stat(linkname, &statbuf) >= 0 &&
+		   statbuf.st_mtime < start_time) {
+	    _nc_warning("alias %s multiply defined.", ptr);
+	} else if (_nc_access(linkname, W_OK) == 0)
+#if HAVE_LINK
+	{
+	    int code;
+#if USE_SYMLINKS
+#define MY_SIZE sizeof(symlinkname) - 1
+	    if (first_name[0] == linkname[0]) {
+		_nc_STRNCPY(symlinkname, first_name, MY_SIZE);
+	    } else {
+		_nc_STRCPY(symlinkname, "../", sizeof(symlinkname));
+		_nc_STRNCPY(symlinkname + 3, filename, MY_SIZE - 3);
+	    }
+	    symlinkname[MY_SIZE] = '\0';
+#endif /* USE_SYMLINKS */
+#if HAVE_REMOVE
+	    code = remove(linkname);
+#else
+	    code = unlink(linkname);
+#endif
+	    if (code != 0 && errno == ENOENT)
+		code = 0;
+#if USE_SYMLINKS
+	    if (symlink(symlinkname, linkname) < 0)
+#else
+	    if (link(filename, linkname) < 0)
+#endif /* USE_SYMLINKS */
+	    {
+		/*
+		 * If there wasn't anything there, and we cannot
+		 * link to the target because it is the same as the
+		 * target, then the source must be on a filesystem
+		 * that uses caseless filenames, such as Win32, etc.
+		 */
+		if (code == 0 && errno == EEXIST)
+		    _nc_warning("can't link %s to %s", filename, linkname);
+		else if (code == 0 && (errno == EPERM || errno == ENOENT))
+		    write_file(linkname, tp);
+		else {
+#if MIXEDCASE_FILENAMES
+		    _nc_syserr_abort("can't link %s to %s", filename, linkname);
+#else
+		    _nc_warning("can't link %s to %s (errno=%d)", filename,
+				linkname, errno);
+#endif
+		}
+	    } else {
+		DEBUG(1, ("Linked %s", linkname));
+	    }
+	}
+#else /* just make copies */
+	    write_file(linkname, tp);
+#endif /* HAVE_LINK */
+    }
+#endif /* USE_HASHED_DB */
+}
+
+static size_t
+fake_write(char *dst,
+	   unsigned *offset,
+	   size_t limit,
+	   char *src,
+	   size_t want,
+	   size_t size)
+{
+    size_t have = (limit - *offset);
+
+    want *= size;
+    if (have > 0) {
+	if (want > have)
+	    want = have;
+	memcpy(dst + *offset, src, want);
+	*offset += (unsigned) want;
+    } else {
+	want = 0;
+    }
+    return (want / size);
+}
+
+#define Write(buf, size, count) fake_write(buffer, offset, (size_t) limit, (char *) buf, (size_t) count, (size_t) size)
+
+#undef LITTLE_ENDIAN		/* BSD/OS defines this as a feature macro */
+#define HI(x)			((x) / 256)
+#define LO(x)			((x) % 256)
+#define LITTLE_ENDIAN(p, x)	(p)[0] = (unsigned char)LO(x),  \
+                                (p)[1] = (unsigned char)HI(x)
+
+#define WRITE_STRING(str) (Write(str, sizeof(char), strlen(str) + 1) == strlen(str) + 1)
+
+static int
+compute_offsets(char **Strings, size_t strmax, short *offsets)
+{
+    int nextfree = 0;
+    size_t i;
+
+    for (i = 0; i < strmax; i++) {
+	if (Strings[i] == ABSENT_STRING) {
+	    offsets[i] = -1;
+	} else if (Strings[i] == CANCELLED_STRING) {
+	    offsets[i] = -2;
+	} else {
+	    offsets[i] = (short) nextfree;
+	    nextfree += (int) strlen(Strings[i]) + 1;
+	    TRACE_OUT(("put Strings[%d]=%s(%d)", (int) i,
+		       _nc_visbuf(Strings[i]), (int) nextfree));
+	}
+    }
+    return nextfree;
+}
+
+static size_t
+convert_shorts(unsigned char *buf, short *Numbers, size_t count)
+{
+    size_t i;
+    for (i = 0; i < count; i++) {
+	if (Numbers[i] == ABSENT_NUMERIC) {	/* HI/LO won't work */
+	    buf[2 * i] = buf[2 * i + 1] = 0377;
+	} else if (Numbers[i] == CANCELLED_NUMERIC) {	/* HI/LO won't work */
+	    buf[2 * i] = 0376;
+	    buf[2 * i + 1] = 0377;
+	} else {
+	    LITTLE_ENDIAN(buf + 2 * i, Numbers[i]);
+	    TRACE_OUT(("put Numbers[%u]=%d", (unsigned) i, Numbers[i]));
+	}
+    }
+    return SIZEOF_SHORT;
+}
+
+#if NCURSES_EXT_NUMBERS
+static size_t
+convert_16bit(unsigned char *buf, NCURSES_INT2 *Numbers, size_t count)
+{
+    size_t i, j;
+    size_t size = SIZEOF_SHORT;
+    for (i = 0; i < count; i++) {
+	unsigned value = (unsigned) Numbers[i];
+	TRACE_NUM(i);
+	for (j = 0; j < size; ++j) {
+	    *buf++ = value & 0xff;
+	    value >>= 8;
+	}
+    }
+    return size;
+}
+
+static size_t
+convert_32bit(unsigned char *buf, NCURSES_INT2 *Numbers, size_t count)
+{
+    size_t i, j;
+    size_t size = SIZEOF_INT2;
+    for (i = 0; i < count; i++) {
+	unsigned value = (unsigned) Numbers[i];
+	TRACE_NUM(i);
+	for (j = 0; j < size; ++j) {
+	    *buf++ = value & 0xff;
+	    value >>= 8;
+	}
+    }
+    return size;
+}
+#endif
+
+#define even_boundary(value) \
+	    ((value) % 2 != 0 && Write(&zero, sizeof(char), 1) != 1)
+
+#if NCURSES_XNAMES
+static unsigned
+extended_Booleans(TERMTYPE2 *tp)
+{
+    unsigned result = 0;
+    unsigned i;
+
+    for (i = 0; i < tp->ext_Booleans; ++i) {
+	if (tp->Booleans[BOOLCOUNT + i] == TRUE)
+	    result = (i + 1);
+    }
+    return result;
+}
+
+static unsigned
+extended_Numbers(TERMTYPE2 *tp)
+{
+    unsigned result = 0;
+    unsigned i;
+
+    for (i = 0; i < tp->ext_Numbers; ++i) {
+	if (tp->Numbers[NUMCOUNT + i] != ABSENT_NUMERIC)
+	    result = (i + 1);
+    }
+    return result;
+}
+
+static unsigned
+extended_Strings(TERMTYPE2 *tp)
+{
+    unsigned short result = 0;
+    unsigned short i;
+
+    for (i = 0; i < tp->ext_Strings; ++i) {
+	if (tp->Strings[STRCOUNT + i] != ABSENT_STRING)
+	    result = (unsigned short) (i + 1);
+    }
+    return result;
+}
+
+/*
+ * _nc_align_termtype() will extend entries that are referenced in a use=
+ * clause - discard the unneeded data.
+ */
+static bool
+extended_object(TERMTYPE2 *tp)
+{
+    bool result = FALSE;
+
+    if (_nc_user_definable) {
+	result = ((extended_Booleans(tp)
+		   + extended_Numbers(tp)
+		   + extended_Strings(tp)) != 0);
+    }
+    return result;
+}
+#endif
+
+NCURSES_EXPORT(int)
+_nc_write_object(TERMTYPE2 *tp, char *buffer, unsigned *offset, unsigned limit)
+{
+    char *namelist;
+    size_t namelen, boolmax, nummax, strmax, numlen;
+    char zero = '\0';
+    size_t i;
+    int nextfree;
+    short offsets[MAX_ENTRY_SIZE / 2];
+    unsigned char buf[MAX_ENTRY_SIZE];
+    unsigned last_bool = BOOLWRITE;
+    unsigned last_num = NUMWRITE;
+    unsigned last_str = STRWRITE;
+#if NCURSES_EXT_NUMBERS
+    bool need_ints = FALSE;
+    size_t (*convert_numbers) (unsigned char *, NCURSES_INT2 *, size_t) = convert_32bit;
+#else
+#define convert_numbers convert_shorts
+#endif
+
+#if NCURSES_XNAMES
+    /*
+     * Normally we limit the list of values to exclude the "obsolete"
+     * capabilities.  However, if we are accepting extended names, add
+     * these as well, since they are used for supporting translation
+     * to/from termcap.
+     */
+    if (_nc_user_definable) {
+	last_bool = BOOLCOUNT;
+	last_num = NUMCOUNT;
+	last_str = STRCOUNT;
+    }
+#endif
+
+    namelist = tp->term_names;
+    namelen = strlen(namelist) + 1;
+
+    boolmax = 0;
+    for (i = 0; i < last_bool; i++) {
+	if (tp->Booleans[i] == TRUE) {
+	    boolmax = i + 1;
+	}
+    }
+
+    nummax = 0;
+    for (i = 0; i < last_num; i++) {
+	if (tp->Numbers[i] != ABSENT_NUMERIC) {
+	    nummax = i + 1;
+#if NCURSES_EXT_NUMBERS
+	    if (tp->Numbers[i] > MAX_OF_TYPE(NCURSES_COLOR_T)) {
+		need_ints = TRUE;
+	    }
+#endif
+	}
+    }
+
+    strmax = 0;
+    for (i = 0; i < last_str; i++) {
+	if (tp->Strings[i] != ABSENT_STRING)
+	    strmax = i + 1;
+    }
+
+    nextfree = compute_offsets(tp->Strings, strmax, offsets);
+
+    /* fill in the header */
+#if NCURSES_EXT_NUMBERS
+    if (need_ints) {
+	convert_numbers = convert_32bit;
+	LITTLE_ENDIAN(buf, MAGIC2);
+    } else {
+	convert_numbers = convert_16bit;
+	LITTLE_ENDIAN(buf, MAGIC);
+    }
+#else
+    LITTLE_ENDIAN(buf, MAGIC);
+#endif
+    LITTLE_ENDIAN(buf + 2, min(namelen, MAX_NAME_SIZE + 1));
+    LITTLE_ENDIAN(buf + 4, boolmax);
+    LITTLE_ENDIAN(buf + 6, nummax);
+    LITTLE_ENDIAN(buf + 8, strmax);
+    LITTLE_ENDIAN(buf + 10, nextfree);
+
+    /* write out the header */
+    TRACE_OUT(("Header of %s @%d", namelist, *offset));
+    if (Write(buf, 12, 1) != 1
+	|| Write(namelist, sizeof(char), namelen) != namelen) {
+	return (ERR);
+    }
+
+    for (i = 0; i < boolmax; i++) {
+	if (tp->Booleans[i] == TRUE) {
+	    buf[i] = TRUE;
+	} else {
+	    buf[i] = FALSE;
+	}
+    }
+    if (Write(buf, sizeof(char), boolmax) != boolmax) {
+	return (ERR);
+    }
+
+    if (even_boundary(namelen + boolmax)) {
+	return (ERR);
+    }
+
+    TRACE_OUT(("Numerics begin at %04x", *offset));
+
+    /* the numerics */
+    numlen = convert_numbers(buf, tp->Numbers, nummax);
+    if (Write(buf, numlen, nummax) != nummax) {
+	return (ERR);
+    }
+
+    TRACE_OUT(("String offsets begin at %04x", *offset));
+
+    /* the string offsets */
+    convert_shorts(buf, offsets, strmax);
+    if (Write(buf, SIZEOF_SHORT, strmax) != strmax) {
+	return (ERR);
+    }
+
+    TRACE_OUT(("String table begins at %04x", *offset));
+
+    /* the strings */
+    for (i = 0; i < strmax; i++) {
+	if (VALID_STRING(tp->Strings[i])) {
+	    if (!WRITE_STRING(tp->Strings[i])) {
+		return (ERR);
+	    }
+	}
+    }
+
+#if NCURSES_XNAMES
+    if (extended_object(tp)) {
+	unsigned ext_total = (unsigned) NUM_EXT_NAMES(tp);
+	unsigned ext_usage = ext_total;
+
+	if (even_boundary(nextfree)) {
+	    return (ERR);
+	}
+
+	nextfree = compute_offsets(tp->Strings + STRCOUNT,
+				   (size_t) tp->ext_Strings,
+				   offsets);
+	TRACE_OUT(("after extended string capabilities, nextfree=%d", nextfree));
+
+	if (tp->ext_Strings >= SIZEOF(offsets)) {
+	    return (ERR);
+	}
+
+	nextfree += compute_offsets(tp->ext_Names,
+				    (size_t) ext_total,
+				    offsets + tp->ext_Strings);
+	TRACE_OUT(("after extended capnames, nextfree=%d", nextfree));
+	strmax = tp->ext_Strings + ext_total;
+	for (i = 0; i < tp->ext_Strings; ++i) {
+	    if (VALID_STRING(tp->Strings[i + STRCOUNT])) {
+		ext_usage++;
+	    }
+	}
+	TRACE_OUT(("will write %u/%lu strings", ext_usage, (unsigned long) strmax));
+
+	/*
+	 * Write the extended header
+	 */
+	LITTLE_ENDIAN(buf + 0, tp->ext_Booleans);
+	LITTLE_ENDIAN(buf + 2, tp->ext_Numbers);
+	LITTLE_ENDIAN(buf + 4, tp->ext_Strings);
+	LITTLE_ENDIAN(buf + 6, ext_usage);
+	LITTLE_ENDIAN(buf + 8, nextfree);
+	TRACE_OUT(("WRITE extended-header @%d", *offset));
+	if (Write(buf, 10, 1) != 1) {
+	    return (ERR);
+	}
+
+	TRACE_OUT(("WRITE %d booleans @%d", tp->ext_Booleans, *offset));
+	if (tp->ext_Booleans
+	    && Write(tp->Booleans + BOOLCOUNT, sizeof(char),
+		     tp->ext_Booleans) != tp->ext_Booleans) {
+	    return (ERR);
+	}
+
+	if (even_boundary(tp->ext_Booleans)) {
+	    return (ERR);
+	}
+
+	TRACE_OUT(("WRITE %d numbers @%d", tp->ext_Numbers, *offset));
+	if (tp->ext_Numbers) {
+	    numlen = convert_numbers(buf, tp->Numbers + NUMCOUNT, (size_t) tp->ext_Numbers);
+	    if (Write(buf, numlen, tp->ext_Numbers) != tp->ext_Numbers) {
+		return (ERR);
+	    }
+	}
+
+	/*
+	 * Convert the offsets for the ext_Strings and ext_Names tables,
+	 * in that order.
+	 */
+	convert_shorts(buf, offsets, strmax);
+	TRACE_OUT(("WRITE offsets @%d", *offset));
+	if (Write(buf, SIZEOF_SHORT, strmax) != strmax) {
+	    return (ERR);
+	}
+
+	/*
+	 * Write the string table after the offset tables so we do not
+	 * have to do anything about alignment.
+	 */
+	for (i = 0; i < tp->ext_Strings; i++) {
+	    if (VALID_STRING(tp->Strings[i + STRCOUNT])) {
+		TRACE_OUT(("WRITE ext_Strings[%d]=%s", (int) i,
+			   _nc_visbuf(tp->Strings[i + STRCOUNT])));
+		if (!WRITE_STRING(tp->Strings[i + STRCOUNT])) {
+		    return (ERR);
+		}
+	    }
+	}
+
+	/*
+	 * Write the extended names
+	 */
+	for (i = 0; i < ext_total; i++) {
+	    TRACE_OUT(("WRITE ext_Names[%d]=%s", (int) i, tp->ext_Names[i]));
+	    if (!WRITE_STRING(tp->ext_Names[i])) {
+		return (ERR);
+	    }
+	}
+
+    }
+#endif /* NCURSES_XNAMES */
+
+    total_written++;
+    total_parts++;
+    total_size = total_size + (int) (*offset + 1);
+    return (OK);
+}
+
+/*
+ * Returns the total number of entries written by this process
+ */
+NCURSES_EXPORT(int)
+_nc_tic_written(void)
+{
+    TR(TRACE_DATABASE, ("_nc_tic_written %d entries, %d parts, %d size",
+			total_written, total_parts, total_size));
+    return total_written;
+}
diff --git a/ncurses/trace/README b/ncurses/trace/README
new file mode 100644
index 0000000..0a33300
--- /dev/null
+++ b/ncurses/trace/README
@@ -0,0 +1,34 @@
+-------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                           --
+-- Copyright 1998,2006 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: README,v 1.3 2020/02/02 23:34:34 tom Exp $
+-------------------------------------------------------------------------------
+
+The files in this directory (trace) support both the terminfo and ncurses
+libraries.  Most of the functions are linked in only when the libraries
+are compiled with TRACE defined.
diff --git a/ncurses/trace/lib_trace.c b/ncurses/trace/lib_trace.c
new file mode 100644
index 0000000..effd3c1
--- /dev/null
+++ b/ncurses/trace/lib_trace.c
@@ -0,0 +1,464 @@
+/****************************************************************************
+ * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ *     and: Juergen Pfeifer                                                 *
+ ****************************************************************************/
+
+/*
+ *	lib_trace.c - Tracing/Debugging routines
+ *
+ * The _tracef() function is originally from pcurses (by Pavel Curtis) in 1982.
+ * pcurses allowed one to enable/disable tracing using traceon() and traceoff()
+ * functions.  ncurses provides a trace() function which allows one to
+ * selectively enable or disable several tracing features.
+ */
+
+#include <curses.priv.h>
+#include <tic.h>
+
+#include <ctype.h>
+
+MODULE_ID("$Id: lib_trace.c,v 1.101 2022/09/17 14:57:02 tom Exp $")
+
+NCURSES_EXPORT_VAR(unsigned) _nc_tracing = 0; /* always define this */
+
+#ifdef TRACE
+
+#if USE_REENTRANT
+NCURSES_EXPORT(const char *)
+NCURSES_PUBLIC_VAR(_nc_tputs_trace) (void)
+{
+    return CURRENT_SCREEN ? CURRENT_SCREEN->_tputs_trace : _nc_prescreen._tputs_trace;
+}
+NCURSES_EXPORT(long)
+NCURSES_PUBLIC_VAR(_nc_outchars) (void)
+{
+    return CURRENT_SCREEN ? CURRENT_SCREEN->_outchars : _nc_prescreen._outchars;
+}
+NCURSES_EXPORT(void)
+_nc_set_tputs_trace(const char *s)
+{
+    if (CURRENT_SCREEN)
+	CURRENT_SCREEN->_tputs_trace = s;
+    else
+	_nc_prescreen._tputs_trace = s;
+}
+NCURSES_EXPORT(void)
+_nc_count_outchars(long increment)
+{
+    if (CURRENT_SCREEN)
+	CURRENT_SCREEN->_outchars += increment;
+    else
+	_nc_prescreen._outchars += increment;
+}
+#else
+NCURSES_EXPORT_VAR(const char *) _nc_tputs_trace = "";
+NCURSES_EXPORT_VAR(long) _nc_outchars = 0;
+#endif
+
+#define MyFP		_nc_globals.trace_fp
+#define MyFD		_nc_globals.trace_fd
+#define MyInit		_nc_globals.trace_opened
+#define MyPath		_nc_globals.trace_fname
+#define MyLevel		_nc_globals.trace_level
+#define MyNested	_nc_globals.nested_tracef
+#endif /* TRACE */
+
+#if USE_REENTRANT
+#define Locked(statement) { \
+	_nc_lock_global(tst_tracef); \
+	statement; \
+	_nc_unlock_global(tst_tracef); \
+    }
+#else
+#define Locked(statement) statement
+#endif
+
+NCURSES_EXPORT(unsigned)
+curses_trace(unsigned tracelevel)
+{
+    unsigned result;
+
+#if defined(TRACE)
+    int bit;
+
+#define DATA(name) { name, #name }
+    static struct {
+	unsigned mask;
+	const char *name;
+    } trace_names[] = {
+	DATA(TRACE_TIMES),
+	    DATA(TRACE_TPUTS),
+	    DATA(TRACE_UPDATE),
+	    DATA(TRACE_MOVE),
+	    DATA(TRACE_CHARPUT),
+	    DATA(TRACE_CALLS),
+	    DATA(TRACE_VIRTPUT),
+	    DATA(TRACE_IEVENT),
+	    DATA(TRACE_BITS),
+	    DATA(TRACE_ICALLS),
+	    DATA(TRACE_CCALLS),
+	    DATA(TRACE_DATABASE),
+	    DATA(TRACE_ATTRS)
+    };
+#undef DATA
+
+    Locked(result = _nc_tracing);
+
+    if ((MyFP == 0) && tracelevel) {
+	MyInit = TRUE;
+	if (MyFD >= 0) {
+	    MyFP = fdopen(MyFD, BIN_W);
+	} else {
+	    if (MyPath[0] == '\0') {
+		size_t size = sizeof(MyPath) - 12;
+		if (getcwd(MyPath, size) == 0) {
+		    perror("curses: Can't get working directory");
+		    exit(EXIT_FAILURE);
+		}
+		MyPath[size] = '\0';
+		assert(strlen(MyPath) <= size);
+		_nc_STRCAT(MyPath, "/trace", sizeof(MyPath));
+		if (_nc_is_dir_path(MyPath)) {
+		    _nc_STRCAT(MyPath, ".log", sizeof(MyPath));
+		}
+	    }
+#define SAFE_MODE (O_CREAT | O_EXCL | O_RDWR)
+	    if (_nc_access(MyPath, W_OK) < 0
+		|| (MyFD = safe_open3(MyPath, SAFE_MODE, 0600)) < 0
+		|| (MyFP = fdopen(MyFD, BIN_W)) == 0) {
+		;		/* EMPTY */
+	    }
+	}
+	Locked(_nc_tracing = tracelevel);
+	/* Try to set line-buffered mode, or (failing that) unbuffered,
+	 * so that the trace-output gets flushed automatically at the
+	 * end of each line.  This is useful in case the program dies.
+	 */
+	if (MyFP != 0) {
+#if HAVE_SETVBUF		/* ANSI */
+	    (void) setvbuf(MyFP, (char *) 0, _IOLBF, (size_t) 0);
+#elif HAVE_SETBUF /* POSIX */
+	    (void) setbuffer(MyFP, (char *) 0);
+#endif
+	}
+	_tracef("TRACING NCURSES version %s.%d (tracelevel=%#x)",
+		NCURSES_VERSION,
+		NCURSES_VERSION_PATCH,
+		tracelevel);
+
+#define SPECIAL_MASK(mask) \
+	    if ((tracelevel & mask) == mask) \
+		_tracef("- %s (%u)", #mask, mask)
+
+	for (bit = 0; bit < TRACE_SHIFT; ++bit) {
+	    unsigned mask = (1U << bit) & tracelevel;
+	    if ((mask & trace_names[bit].mask) != 0) {
+		_tracef("- %s (%u)", trace_names[bit].name, mask);
+	    }
+	}
+	SPECIAL_MASK(TRACE_MAXIMUM);
+	else
+	SPECIAL_MASK(TRACE_ORDINARY);
+
+	if (tracelevel > TRACE_MAXIMUM) {
+	    _tracef("- DEBUG_LEVEL(%u)", tracelevel >> TRACE_SHIFT);
+	}
+    } else if (tracelevel == 0) {
+	if (MyFP != 0) {
+	    MyFD = dup(MyFD);	/* allow reopen of same file */
+	    fclose(MyFP);
+	    MyFP = 0;
+	}
+	Locked(_nc_tracing = tracelevel);
+    } else if (_nc_tracing != tracelevel) {
+	Locked(_nc_tracing = tracelevel);
+	_tracef("tracelevel=%#x", tracelevel);
+    }
+#else
+    (void) tracelevel;
+    result = 0;
+#endif
+    return result;
+}
+
+#if defined(TRACE)
+NCURSES_EXPORT(void)
+trace(const unsigned int tracelevel)
+{
+    curses_trace(tracelevel);
+}
+
+static void
+_nc_va_tracef(const char *fmt, va_list ap)
+{
+    static const char Called[] = T_CALLED("");
+    static const char Return[] = T_RETURN("");
+
+    bool before = FALSE;
+    bool after = FALSE;
+    unsigned doit = _nc_tracing;
+    int save_err = errno;
+    FILE *fp = MyFP;
+
+#ifdef TRACE
+    /* verbose-trace in the command-line utilities relies on this */
+    if (fp == 0 && !MyInit && _nc_tracing >= DEBUG_LEVEL(1))
+	fp = stderr;
+#endif
+
+    if (strlen(fmt) >= sizeof(Called) - 1) {
+	if (!strncmp(fmt, Called, sizeof(Called) - 1)) {
+	    before = TRUE;
+	    MyLevel++;
+	} else if (!strncmp(fmt, Return, sizeof(Return) - 1)) {
+	    after = TRUE;
+	}
+	if (before || after) {
+	    if ((MyLevel <= 1)
+		|| (doit & TRACE_ICALLS) != 0)
+		doit &= (TRACE_CALLS | TRACE_CCALLS);
+	    else
+		doit = 0;
+	}
+    }
+
+    if (doit != 0 && fp != 0) {
+#ifdef USE_PTHREADS
+	/*
+	 * TRACE_ICALLS is "really" needed to show normal use with threaded
+	 * applications, since anything can be running during a napms(),
+	 * making it appear in the hierarchical trace as it other functions
+	 * are being called.
+	 *
+	 * Rather than add the complication of a per-thread stack, just
+	 * show the thread-id in each line of the trace.
+	 */
+# if USE_WEAK_SYMBOLS
+	if ((pthread_self))
+# endif
+#ifdef _NC_WINDOWS
+	    fprintf(fp, "%#lx:", (long) (intptr_t) pthread_self().p);
+#else
+	    fprintf(fp, "%#lx:", (long) (intptr_t) pthread_self());
+#endif
+#endif
+	if (before || after) {
+	    int n;
+	    for (n = 1; n < MyLevel; n++)
+		fputs("+ ", fp);
+	}
+	vfprintf(fp, fmt, ap);
+	fputc('\n', fp);
+	fflush(fp);
+    }
+
+    if (after && MyLevel)
+	MyLevel--;
+
+    errno = save_err;
+}
+
+NCURSES_EXPORT(void)
+_tracef(const char *fmt, ...)
+{
+    va_list ap;
+
+    va_start(ap, fmt);
+    _nc_va_tracef(fmt, ap);
+    va_end(ap);
+}
+
+/* Trace 'bool' return-values */
+NCURSES_EXPORT(NCURSES_BOOL)
+_nc_retrace_bool(int code)
+{
+    T((T_RETURN("%s"), code ? "TRUE" : "FALSE"));
+    return code;
+}
+
+/* Trace 'char' return-values */
+NCURSES_EXPORT(char)
+_nc_retrace_char(int code)
+{
+    T((T_RETURN("%c"), code));
+    return (char) code;
+}
+
+/* Trace 'int' return-values */
+NCURSES_EXPORT(int)
+_nc_retrace_int(int code)
+{
+    T((T_RETURN("%d"), code));
+    return code;
+}
+
+/* Trace 'unsigned' return-values */
+NCURSES_EXPORT(unsigned)
+_nc_retrace_unsigned(unsigned code)
+{
+    T((T_RETURN("%#x"), code));
+    return code;
+}
+
+/* Trace 'char*' return-values */
+NCURSES_EXPORT(char *)
+_nc_retrace_ptr(char *code)
+{
+    T((T_RETURN("%s"), _nc_visbuf(code)));
+    return code;
+}
+
+/* Trace 'const char*' return-values */
+NCURSES_EXPORT(const char *)
+_nc_retrace_cptr(const char *code)
+{
+    T((T_RETURN("%s"), _nc_visbuf(code)));
+    return code;
+}
+
+/* Trace 'NCURSES_CONST void*' return-values */
+NCURSES_EXPORT(NCURSES_CONST void *)
+_nc_retrace_cvoid_ptr(NCURSES_CONST void *code)
+{
+    T((T_RETURN("%p"), code));
+    return code;
+}
+
+/* Trace 'void*' return-values */
+NCURSES_EXPORT(void *)
+_nc_retrace_void_ptr(void *code)
+{
+    T((T_RETURN("%p"), code));
+    return code;
+}
+
+/* Trace 'SCREEN *' return-values */
+NCURSES_EXPORT(SCREEN *)
+_nc_retrace_sp(SCREEN *code)
+{
+    T((T_RETURN("%p"), (void *) code));
+    return code;
+}
+
+/* Trace 'WINDOW *' return-values */
+NCURSES_EXPORT(WINDOW *)
+_nc_retrace_win(WINDOW *code)
+{
+    T((T_RETURN("%p"), (void *) code));
+    return code;
+}
+
+NCURSES_EXPORT(char *)
+_nc_fmt_funcptr(char *target, const char *source, size_t size)
+{
+    size_t n;
+    char *dst = target;
+    bool leading = TRUE;
+
+    union {
+	int value;
+	char bytes[sizeof(int)];
+    } byteorder;
+
+    byteorder.value = 0x1234;
+
+    *dst++ = '0';
+    *dst++ = 'x';
+
+    for (n = 0; n < size; ++n) {
+	unsigned ch = ((byteorder.bytes[0] == 0x34)
+		       ? UChar(source[size - n - 1])
+		       : UChar(source[n]));
+	if (ch != 0 || (n + 1) >= size)
+	    leading = FALSE;
+	if (!leading) {
+	    _nc_SPRINTF(dst, _nc_SLIMIT(TR_FUNC_LEN - (size_t) (dst - target))
+			"%02x", ch & 0xff);
+	    dst += 2;
+	}
+    }
+    *dst = '\0';
+    return target;
+}
+
+#if USE_REENTRANT
+/*
+ * Check if the given trace-mask is enabled.
+ *
+ * This function may be called from within one of the functions that fills
+ * in parameters for _tracef(), but in that case we do not want to lock the
+ * mutex, since it is already locked.
+ */
+NCURSES_EXPORT(int)
+_nc_use_tracef(unsigned mask)
+{
+    bool result = FALSE;
+
+    _nc_lock_global(tst_tracef);
+    if (!MyNested++) {
+	if ((result = (_nc_tracing & (mask))) != 0
+	    && _nc_try_global(tracef) == 0) {
+	    /* we will call _nc_locked_tracef(), no nesting so far */
+	} else {
+	    /* we will not call _nc_locked_tracef() */
+	    MyNested = 0;
+	}
+    } else {
+	/* we may call _nc_locked_tracef(), but with nested_tracef > 0 */
+	result = (_nc_tracing & (mask));
+    }
+    _nc_unlock_global(tst_tracef);
+    return result;
+}
+
+/*
+ * We call this if _nc_use_tracef() returns true, which means we must unlock
+ * the tracef mutex.
+ */
+NCURSES_EXPORT(void)
+_nc_locked_tracef(const char *fmt, ...)
+{
+    va_list ap;
+
+    va_start(ap, fmt);
+    _nc_va_tracef(fmt, ap);
+    va_end(ap);
+
+    if (--(MyNested) == 0) {
+	_nc_unlock_global(tracef);
+    }
+}
+#endif /* USE_REENTRANT */
+
+#endif /* TRACE */
diff --git a/ncurses/trace/lib_traceatr.c b/ncurses/trace/lib_traceatr.c
new file mode 100644
index 0000000..d397fb2
--- /dev/null
+++ b/ncurses/trace/lib_traceatr.c
@@ -0,0 +1,417 @@
+/****************************************************************************
+ * Copyright 2018-2020,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2017,2018 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas Dickey                           1996-on                 *
+ *     and: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Juergen Pfeifer                                                 *
+ ****************************************************************************/
+
+/*
+ *	lib_traceatr.c - Tracing/Debugging routines (attributes)
+ */
+
+#include <curses.priv.h>
+
+#ifndef CUR
+#define CUR SP_TERMTYPE
+#endif
+
+MODULE_ID("$Id: lib_traceatr.c,v 1.95 2022/06/11 22:40:56 tom Exp $")
+
+#define COLOR_OF(c) ((c < 0) ? "default" : (c > 7 ? color_of(c) : colors[c].name))
+
+#define TRACE_BUF_SIZE(num) (_nc_globals.tracebuf_ptr[num].size)
+#define COLOR_BUF_SIZE(num) (sizeof(my_buffer[num]))
+
+#ifdef TRACE
+
+static const char l_brace[] = StringOf(L_BRACE);
+static const char r_brace[] = StringOf(R_BRACE);
+
+#ifndef USE_TERMLIB
+
+#define my_buffer _nc_globals.traceatr_color_buf
+#define my_select _nc_globals.traceatr_color_sel
+#define my_cached _nc_globals.traceatr_color_last
+
+static char *
+color_of(int c)
+{
+    if (c != my_cached) {
+	my_cached = c;
+	my_select = !my_select;
+	if (isDefaultColor(c))
+	    _nc_STRCPY(my_buffer[my_select], "default",
+		       COLOR_BUF_SIZE(my_select));
+	else
+	    _nc_SPRINTF(my_buffer[my_select],
+			_nc_SLIMIT(COLOR_BUF_SIZE(my_select))
+			"color%d", c);
+    }
+    return my_buffer[my_select];
+}
+
+#undef my_buffer
+#undef my_select
+#endif /* !USE_TERMLIB */
+
+NCURSES_EXPORT(char *)
+_traceattr2(int bufnum, chtype newmode)
+{
+#define DATA(name) { name, { #name } }
+    static const struct {
+	unsigned int val;
+	const char name[14];
+    } names[] =
+    {
+	DATA(A_STANDOUT),
+	    DATA(A_UNDERLINE),
+	    DATA(A_REVERSE),
+	    DATA(A_BLINK),
+	    DATA(A_DIM),
+	    DATA(A_BOLD),
+	    DATA(A_ALTCHARSET),
+	    DATA(A_INVIS),
+	    DATA(A_PROTECT),
+	    DATA(A_CHARTEXT),
+	    DATA(A_NORMAL),
+	    DATA(A_COLOR),
+#if USE_ITALIC
+	    DATA(A_ITALIC),
+#endif
+    }
+#ifndef USE_TERMLIB
+    ,
+	colors[] =
+    {
+	DATA(COLOR_BLACK),
+	    DATA(COLOR_RED),
+	    DATA(COLOR_GREEN),
+	    DATA(COLOR_YELLOW),
+	    DATA(COLOR_BLUE),
+	    DATA(COLOR_MAGENTA),
+	    DATA(COLOR_CYAN),
+	    DATA(COLOR_WHITE),
+    }
+#endif /* !USE_TERMLIB */
+    ;
+#undef DATA
+    char *result = _nc_trace_buf(bufnum, (size_t) BUFSIZ);
+
+    if (result != 0) {
+	size_t n;
+	unsigned save_nc_tracing = _nc_tracing;
+
+	_nc_tracing = 0;
+
+	_nc_STRCPY(result, l_brace, TRACE_BUF_SIZE(bufnum));
+
+	for (n = 0; n < SIZEOF(names); n++) {
+
+	    if ((newmode & names[n].val) != 0) {
+		if (result[1] != '\0')
+		    (void) _nc_trace_bufcat(bufnum, "|");
+		result = _nc_trace_bufcat(bufnum, names[n].name);
+
+		if (names[n].val == A_COLOR) {
+		    char temp[80];
+		    short pairnum = (short) PairNumber(newmode);
+#ifdef USE_TERMLIB
+		    /* pair_content lives in libncurses */
+		    _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp))
+				"{%d}", pairnum);
+#else
+		    NCURSES_COLOR_T fg, bg;
+
+		    if (pair_content(pairnum, &fg, &bg) == OK) {
+			_nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp))
+				    "{%d = {%s, %s}}",
+				    pairnum,
+				    COLOR_OF(fg),
+				    COLOR_OF(bg));
+		    } else {
+			_nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp))
+				    "{%d}", pairnum);
+		    }
+#endif
+		    result = _nc_trace_bufcat(bufnum, temp);
+		}
+	    }
+	}
+	if (ChAttrOf(newmode) == A_NORMAL) {
+	    if (result != 0 && result[1] != '\0')
+		(void) _nc_trace_bufcat(bufnum, "|");
+	    (void) _nc_trace_bufcat(bufnum, "A_NORMAL");
+	}
+
+	_nc_tracing = save_nc_tracing;
+	result = _nc_trace_bufcat(bufnum, r_brace);
+    }
+    return result;
+}
+
+NCURSES_EXPORT(char *)
+_traceattr(attr_t newmode)
+{
+    return _traceattr2(0, newmode);
+}
+
+/* Trace 'int' return-values */
+NCURSES_EXPORT(int)
+_nc_retrace_int_attr_t(attr_t code)
+{
+    T((T_RETURN("%s"), _traceattr(code)));
+    return (int) code;
+}
+
+/* Trace 'attr_t' return-values */
+NCURSES_EXPORT(attr_t)
+_nc_retrace_attr_t(attr_t code)
+{
+    T((T_RETURN("%s"), _traceattr(code)));
+    return code;
+}
+
+const char *
+_nc_altcharset_name(attr_t attr, chtype ch)
+{
+#define DATA(code, name) { code, { #name } }
+    typedef struct {
+	unsigned int val;
+	const char name[13];
+    } ALT_NAMES;
+#if NCURSES_SP_FUNCS
+    SCREEN *sp = CURRENT_SCREEN;
+#endif
+    static const ALT_NAMES names[] =
+    {
+	DATA('l', ACS_ULCORNER),	/* upper left corner */
+	DATA('m', ACS_LLCORNER),	/* lower left corner */
+	DATA('k', ACS_URCORNER),	/* upper right corner */
+	DATA('j', ACS_LRCORNER),	/* lower right corner */
+	DATA('t', ACS_LTEE),	/* tee pointing right */
+	DATA('u', ACS_RTEE),	/* tee pointing left */
+	DATA('v', ACS_BTEE),	/* tee pointing up */
+	DATA('w', ACS_TTEE),	/* tee pointing down */
+	DATA('q', ACS_HLINE),	/* horizontal line */
+	DATA('x', ACS_VLINE),	/* vertical line */
+	DATA('n', ACS_PLUS),	/* large plus or crossover */
+	DATA('o', ACS_S1),	/* scan line 1 */
+	DATA('s', ACS_S9),	/* scan line 9 */
+	DATA('`', ACS_DIAMOND),	/* diamond */
+	DATA('a', ACS_CKBOARD),	/* checker board (stipple) */
+	DATA('f', ACS_DEGREE),	/* degree symbol */
+	DATA('g', ACS_PLMINUS),	/* plus/minus */
+	DATA('~', ACS_BULLET),	/* bullet */
+	DATA(',', ACS_LARROW),	/* arrow pointing left */
+	DATA('+', ACS_RARROW),	/* arrow pointing right */
+	DATA('.', ACS_DARROW),	/* arrow pointing down */
+	DATA('-', ACS_UARROW),	/* arrow pointing up */
+	DATA('h', ACS_BOARD),	/* board of squares */
+	DATA('i', ACS_LANTERN),	/* lantern symbol */
+	DATA('0', ACS_BLOCK),	/* solid square block */
+	DATA('p', ACS_S3),	/* scan line 3 */
+	DATA('r', ACS_S7),	/* scan line 7 */
+	DATA('y', ACS_LEQUAL),	/* less/equal */
+	DATA('z', ACS_GEQUAL),	/* greater/equal */
+	DATA('{', ACS_PI),	/* Pi */
+	DATA('|', ACS_NEQUAL),	/* not equal */
+	DATA('}', ACS_STERLING),	/* UK pound sign */
+    };
+#undef DATA
+
+    const char *result = 0;
+
+#if NCURSES_SP_FUNCS
+    (void) sp;
+#endif
+    if (SP_PARM != 0 && (attr & A_ALTCHARSET) && (acs_chars != 0)) {
+	char *cp;
+	char *found = 0;
+
+	for (cp = acs_chars; cp[0] && cp[1]; cp += 2) {
+	    if (ChCharOf(UChar(cp[1])) == ChCharOf(ch)) {
+		found = cp;
+		/* don't exit from loop - there may be redefinitions */
+	    }
+	}
+
+	if (found != 0) {
+	    size_t n;
+
+	    ch = ChCharOf(UChar(*found));
+	    for (n = 0; n < SIZEOF(names); ++n) {
+		if (names[n].val == ch) {
+		    result = names[n].name;
+		    break;
+		}
+	    }
+	}
+    }
+    return result;
+}
+
+NCURSES_EXPORT(char *)
+_tracechtype2(int bufnum, chtype ch)
+{
+    char *result = _nc_trace_buf(bufnum, (size_t) BUFSIZ);
+
+    if (result != 0) {
+	const char *found;
+	attr_t attr = ChAttrOf(ch);
+
+	_nc_STRCPY(result, l_brace, TRACE_BUF_SIZE(bufnum));
+	if ((found = _nc_altcharset_name(attr, ch)) != 0) {
+	    (void) _nc_trace_bufcat(bufnum, found);
+	    attr &= ~A_ALTCHARSET;
+	} else
+	    (void) _nc_trace_bufcat(bufnum,
+				    _nc_tracechar(CURRENT_SCREEN,
+						  (int) ChCharOf(ch)));
+
+	if (attr != A_NORMAL) {
+	    (void) _nc_trace_bufcat(bufnum, " | ");
+	    (void) _nc_trace_bufcat(bufnum,
+				    _traceattr2(bufnum + 20, attr));
+	}
+
+	result = _nc_trace_bufcat(bufnum, r_brace);
+    }
+    return result;
+}
+
+NCURSES_EXPORT(char *)
+_tracechtype(chtype ch)
+{
+    return _tracechtype2(0, ch);
+}
+
+/* Trace 'chtype' return-values */
+NCURSES_EXPORT(chtype)
+_nc_retrace_chtype(chtype code)
+{
+    T((T_RETURN("%s"), _tracechtype(code)));
+    return code;
+}
+
+#if USE_WIDEC_SUPPORT
+NCURSES_EXPORT(char *)
+_tracecchar_t2(int bufnum, const cchar_t *ch)
+{
+    char *result = _nc_trace_buf(bufnum, (size_t) BUFSIZ);
+
+    if (result != 0) {
+	_nc_STRCPY(result, l_brace, TRACE_BUF_SIZE(bufnum));
+	if (ch != 0) {
+	    const char *found;
+	    attr_t attr = AttrOfD(ch);
+
+	    if ((found = _nc_altcharset_name(attr, (chtype) CharOfD(ch))) != 0) {
+		(void) _nc_trace_bufcat(bufnum, found);
+		attr &= ~A_ALTCHARSET;
+	    } else if (isWidecExt(CHDEREF(ch))) {
+		(void) _nc_trace_bufcat(bufnum, "{NAC}");
+		attr &= ~A_CHARTEXT;
+	    } else {
+		PUTC_DATA;
+		int n;
+
+		(void) _nc_trace_bufcat(bufnum, "{ ");
+		for (PUTC_i = 0; PUTC_i < CCHARW_MAX; ++PUTC_i) {
+		    PUTC_ch = ch->chars[PUTC_i];
+		    if (PUTC_ch == L'\0') {
+			if (PUTC_i == 0)
+			    (void) _nc_trace_bufcat(bufnum, "\\000");
+			break;
+		    }
+		    PUTC_INIT;
+		    PUTC_n = (int) wcrtomb(PUTC_buf, ch->chars[PUTC_i], &PUT_st);
+		    if (PUTC_n <= 0) {
+			if (PUTC_ch != L'\0') {
+			    /* it could not be a multibyte sequence */
+			    (void) _nc_trace_bufcat(bufnum,
+						    _nc_tracechar(CURRENT_SCREEN,
+								  UChar(ch->chars[PUTC_i])));
+			}
+			break;
+		    } else if (ch->chars[PUTC_i] > 255) {
+			char temp[80];
+			_nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp))
+				    "{%d:\\u%lx}",
+				    _nc_wacs_width(ch->chars[PUTC_i]),
+				    (unsigned long) ch->chars[PUTC_i]);
+			(void) _nc_trace_bufcat(bufnum, temp);
+			attr &= ~A_CHARTEXT;	/* ignore WidecExt(ch) */
+		    } else {
+			for (n = 0; n < PUTC_n; n++) {
+			    if (n)
+				(void) _nc_trace_bufcat(bufnum, ", ");
+			    (void) _nc_trace_bufcat(bufnum,
+						    _nc_tracechar(CURRENT_SCREEN,
+								  UChar(PUTC_buf[n])));
+			}
+		    }
+		}
+		(void) _nc_trace_bufcat(bufnum, " }");
+	    }
+	    if (attr != A_NORMAL) {
+		(void) _nc_trace_bufcat(bufnum, " | ");
+		(void) _nc_trace_bufcat(bufnum, _traceattr2(bufnum + 20, attr));
+	    }
+#if NCURSES_EXT_COLORS
+	    /*
+	     * Just in case the extended color is different from the chtype
+	     * value, trace both.
+	     */
+	    if (ch->ext_color != PairNumber(attr)) {
+		char temp[80];
+		_nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp))
+			    " X_COLOR{%d:%d}", ch->ext_color, PairNumber(attr));
+		(void) _nc_trace_bufcat(bufnum, temp);
+	    }
+#endif
+	}
+
+	result = _nc_trace_bufcat(bufnum, r_brace);
+    }
+    return result;
+}
+
+NCURSES_EXPORT(char *)
+_tracecchar_t(const cchar_t *ch)
+{
+    return _tracecchar_t2(0, ch);
+}
+#endif
+
+#else
+EMPTY_MODULE(_nc_lib_traceatr)
+#endif /* TRACE */
diff --git a/ncurses/trace/lib_tracebits.c b/ncurses/trace/lib_tracebits.c
new file mode 100644
index 0000000..4bc50f3
--- /dev/null
+++ b/ncurses/trace/lib_tracebits.c
@@ -0,0 +1,303 @@
+/****************************************************************************
+ * Copyright 2019,2020 Thomas E. Dickey                                     *
+ * Copyright 1998-2012,2015 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_tracebits.c,v 1.31 2020/11/14 23:38:11 tom Exp $")
+
+#if HAVE_SYS_TERMIO_H
+#include <sys/termio.h>		/* needed for ISC */
+#endif
+
+#ifdef __EMX__
+#include <io.h>
+#endif
+
+/* may be undefined if we're using termio.h */
+#ifndef TOSTOP
+#define TOSTOP 0
+#endif
+
+#ifndef IEXTEN
+#define IEXTEN 0
+#endif
+
+#ifndef ONLCR
+#define ONLCR 0
+#endif
+
+#ifndef OCRNL
+#define OCRNL 0
+#endif
+
+#ifndef ONOCR
+#define ONOCR 0
+#endif
+
+#ifndef ONLRET
+#define ONLRET 0
+#endif
+
+#ifdef TRACE
+
+#if defined(EXP_WIN32_DRIVER)
+#define BITNAMELEN 36
+#else
+#define BITNAMELEN 8
+#endif
+
+typedef struct {
+    unsigned int val;
+    const char name[BITNAMELEN];
+} BITNAMES;
+
+#define TRACE_BUF_SIZE(num) (_nc_globals.tracebuf_ptr[num].size)
+
+static void
+lookup_bits(char *buf, const BITNAMES * table, const char *label, unsigned int val)
+{
+    const BITNAMES *sp;
+
+    _nc_STRCAT(buf, label, TRACE_BUF_SIZE(0));
+    _nc_STRCAT(buf, ": {", TRACE_BUF_SIZE(0));
+    for (sp = table; sp->name[0]; sp++)
+	if (sp->val != 0
+	    && (val & sp->val) == sp->val) {
+	    _nc_STRCAT(buf, sp->name, TRACE_BUF_SIZE(0));
+	    _nc_STRCAT(buf, ", ", TRACE_BUF_SIZE(0));
+	}
+    if (buf[strlen(buf) - 2] == ',')
+	buf[strlen(buf) - 2] = '\0';
+    _nc_STRCAT(buf, "} ", TRACE_BUF_SIZE(0));
+}
+
+NCURSES_EXPORT(char *)
+_nc_trace_ttymode(const TTY * tty)
+/* describe the state of the terminal control bits exactly */
+{
+    char *buf;
+
+#ifdef TERMIOS
+#define DATA(name)        { name, { #name } }
+#define DATA2(name,name2) { name, { #name2 } }
+#define DATAX()           { 0,    { "" } }
+    static const BITNAMES iflags[] =
+    {
+	DATA(BRKINT),
+	DATA(IGNBRK),
+	DATA(IGNPAR),
+	DATA(PARMRK),
+	DATA(INPCK),
+	DATA(ISTRIP),
+	DATA(INLCR),
+	DATA(IGNCR),
+	DATA(ICRNL),
+	DATA(IXON),
+	DATA(IXOFF),
+	DATAX()
+#define ALLIN	(BRKINT|IGNBRK|IGNPAR|PARMRK|INPCK|ISTRIP|INLCR|IGNCR|ICRNL|IXON|IXOFF)
+    }, oflags[] =
+    {
+	DATA(OPOST),
+	DATA2(OFLAGS_TABS, XTABS),
+	DATA(ONLCR),
+	DATA(OCRNL),
+	DATA(ONOCR),
+	DATA(ONLRET),
+	DATAX()
+#define ALLOUT	(OPOST|OFLAGS_TABS|ONLCR|OCRNL|ONOCR|ONLRET|OFLAGS_TABS)
+    }, cflags[] =
+    {
+	DATA(CLOCAL),
+	DATA(CREAD),
+	DATA(CSTOPB),
+#if !defined(CS5) || !defined(CS8)
+	DATA(CSIZE),
+#endif
+	DATA(HUPCL),
+	DATA(PARENB),
+	DATA2(PARODD | PARENB, PARODD),
+	DATAX()
+#define ALLCTRL	(CLOCAL|CREAD|CSIZE|CSTOPB|HUPCL|PARENB|PARODD)
+    }, lflags[] =
+    {
+	DATA(ECHO),
+	DATA2(ECHOE | ECHO, ECHOE),
+	DATA2(ECHOK | ECHO, ECHOK),
+	DATA(ECHONL),
+	DATA(ICANON),
+	DATA(ISIG),
+	DATA(NOFLSH),
+	DATA(TOSTOP),
+	DATA(IEXTEN),
+	DATAX()
+#define ALLLOCAL	(ECHO|ECHONL|ICANON|ISIG|NOFLSH|TOSTOP|IEXTEN)
+    };
+
+    buf = _nc_trace_buf(0,
+			8 + sizeof(iflags) +
+			8 + sizeof(oflags) +
+			8 + sizeof(cflags) +
+			8 + sizeof(lflags) +
+			8);
+    if (buf != 0) {
+
+	if (tty->c_iflag & ALLIN)
+	    lookup_bits(buf, iflags, "iflags", tty->c_iflag);
+
+	if (tty->c_oflag & ALLOUT)
+	    lookup_bits(buf, oflags, "oflags", tty->c_oflag);
+
+	if (tty->c_cflag & ALLCTRL)
+	    lookup_bits(buf, cflags, "cflags", tty->c_cflag);
+
+#if defined(CS5) && defined(CS8)
+	{
+	    static const struct {
+		int value;
+		const char name[5];
+	    } csizes[] = {
+#define CS_DATA(name) { name, { #name " " } }
+		CS_DATA(CS5),
+#ifdef CS6
+		    CS_DATA(CS6),
+#endif
+#ifdef CS7
+		    CS_DATA(CS7),
+#endif
+		    CS_DATA(CS8),
+	    };
+	    const char *result = "CSIZE? ";
+	    int value = (int) (tty->c_cflag & CSIZE);
+	    unsigned n;
+
+	    if (value != 0) {
+		for (n = 0; n < SIZEOF(csizes); n++) {
+		    if (csizes[n].value == value) {
+			result = csizes[n].name;
+			break;
+		    }
+		}
+	    }
+	    _nc_STRCAT(buf, result, TRACE_BUF_SIZE(0));
+	}
+#endif
+
+	if (tty->c_lflag & ALLLOCAL)
+	    lookup_bits(buf, lflags, "lflags", tty->c_lflag);
+    }
+#elif defined(EXP_WIN32_DRIVER)
+#define DATA(name)        { name, { #name } }
+    static const BITNAMES dwFlagsOut[] =
+    {
+	DATA(ENABLE_PROCESSED_OUTPUT),
+	DATA(ENABLE_WRAP_AT_EOL_OUTPUT),
+	DATA(ENABLE_VIRTUAL_TERMINAL_PROCESSING),
+	DATA(DISABLE_NEWLINE_AUTO_RETURN),
+	DATA(ENABLE_LVB_GRID_WORLDWIDE)
+    };
+    static const BITNAMES dwFlagsIn[] =
+    {
+	DATA(ENABLE_PROCESSED_INPUT),
+	DATA(ENABLE_LINE_INPUT),
+	DATA(ENABLE_ECHO_INPUT),
+	DATA(ENABLE_MOUSE_INPUT),
+	DATA(ENABLE_INSERT_MODE),
+	DATA(ENABLE_QUICK_EDIT_MODE),
+	DATA(ENABLE_EXTENDED_FLAGS),
+	DATA(ENABLE_AUTO_POSITION),
+	DATA(ENABLE_VIRTUAL_TERMINAL_INPUT)
+    };
+
+    buf = _nc_trace_buf(0,
+			8 + sizeof(dwFlagsOut) +
+			8 + sizeof(dwFlagsIn));
+    if (buf != 0) {
+	lookup_bits(buf, dwFlagsIn, "dwIn", tty->dwFlagIn);
+	lookup_bits(buf, dwFlagsOut, "dwOut", tty->dwFlagOut);
+    }
+#else
+    /* reference: ttcompat(4M) on SunOS 4.1 */
+#ifndef EVENP
+#define EVENP 0
+#endif
+#ifndef LCASE
+#define LCASE 0
+#endif
+#ifndef LLITOUT
+#define LLITOUT 0
+#endif
+#ifndef ODDP
+#define ODDP 0
+#endif
+#ifndef TANDEM
+#define TANDEM 0
+#endif
+
+    static const BITNAMES cflags[] =
+    {
+	DATA(CBREAK),
+	DATA(CRMOD),
+	DATA(ECHO),
+	DATA(EVENP),
+	DATA(LCASE),
+	DATA(LLITOUT),
+	DATA(ODDP),
+	DATA(RAW),
+	DATA(TANDEM),
+	DATA(XTABS),
+	DATAX()
+#define ALLCTRL	(CBREAK|CRMOD|ECHO|EVENP|LCASE|LLITOUT|ODDP|RAW|TANDEM|XTABS)
+    };
+
+    buf = _nc_trace_buf(0,
+			8 + sizeof(cflags));
+    if (buf != 0) {
+	if (tty->sg_flags & ALLCTRL) {
+	    lookup_bits(buf, cflags, "cflags", tty->sg_flags);
+	}
+    }
+#endif
+    return (buf);
+}
+
+NCURSES_EXPORT(char *)
+_nc_tracebits(void)
+{
+    return _nc_trace_ttymode(&(cur_term->Nttyb));
+}
+#else
+EMPTY_MODULE(_nc_empty_lib_tracebits)
+#endif /* TRACE */
diff --git a/ncurses/trace/lib_tracechr.c b/ncurses/trace/lib_tracechr.c
new file mode 100644
index 0000000..36158d6
--- /dev/null
+++ b/ncurses/trace/lib_tracechr.c
@@ -0,0 +1,88 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2009,2012 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ ****************************************************************************/
+
+/*
+ *	lib_tracechr.c - Tracing/Debugging routines
+ */
+#include <curses.priv.h>
+
+#include <ctype.h>
+
+MODULE_ID("$Id: lib_tracechr.c,v 1.23 2020/02/02 23:34:34 tom Exp $")
+
+#ifdef TRACE
+
+#define MyBufSize sizeof(_nc_globals.tracechr_buf)
+
+NCURSES_EXPORT(char *)
+_nc_tracechar(SCREEN *sp, int ch)
+{
+    NCURSES_CONST char *name;
+    char *MyBuffer = ((sp != 0)
+		      ? sp->tracechr_buf
+		      : _nc_globals.tracechr_buf);
+
+    if (ch > KEY_MIN || ch < 0) {
+	name = safe_keyname(SP_PARM, ch);
+	if (name == 0 || *name == '\0')
+	    name = "NULL";
+	_nc_SPRINTF(MyBuffer, _nc_SLIMIT(MyBufSize)
+		    "'%.30s' = %#03o", name, ch);
+    } else if (!is8bits(ch) || !isprint(UChar(ch))) {
+	/*
+	 * workaround for glibc bug:
+	 * sprintf changes the result from unctrl() to an empty string if it
+	 * does not correspond to a valid multibyte sequence.
+	 */
+	_nc_SPRINTF(MyBuffer, _nc_SLIMIT(MyBufSize)
+		    "%#03o", ch);
+    } else {
+	name = safe_unctrl(SP_PARM, (chtype) ch);
+	if (name == 0 || *name == 0)
+	    name = "null";	/* shouldn't happen */
+	_nc_SPRINTF(MyBuffer, _nc_SLIMIT(MyBufSize)
+		    "'%.30s' = %#03o", name, ch);
+    }
+    return (MyBuffer);
+}
+
+NCURSES_EXPORT(char *)
+_tracechar(int ch)
+{
+    return _nc_tracechar(CURRENT_SCREEN, ch);
+}
+#else
+EMPTY_MODULE(_nc_lib_tracechr)
+#endif
diff --git a/ncurses/trace/lib_tracedmp.c b/ncurses/trace/lib_tracedmp.c
new file mode 100644
index 0000000..3b7ea07
--- /dev/null
+++ b/ncurses/trace/lib_tracedmp.c
@@ -0,0 +1,187 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2012,2016 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey 1996-on                                        *
+ *     and: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ ****************************************************************************/
+
+/*
+ *	lib_tracedmp.c - Tracing/Debugging routines
+ */
+
+#include <curses.priv.h>
+#include <ctype.h>
+
+MODULE_ID("$Id: lib_tracedmp.c,v 1.36 2020/02/02 23:34:34 tom Exp $")
+
+#ifdef TRACE
+
+#define my_buffer _nc_globals.tracedmp_buf
+#define my_length _nc_globals.tracedmp_used
+
+NCURSES_EXPORT(void)
+_tracedump(const char *name, WINDOW *win)
+{
+    int i, j, n, width;
+
+    /* compute narrowest possible display width */
+    for (width = i = 0; i <= win->_maxy; ++i) {
+	n = 0;
+	for (j = 0; j <= win->_maxx; ++j) {
+	    if (CharOf(win->_line[i].text[j]) != L(' ')
+		|| AttrOf(win->_line[i].text[j]) != A_NORMAL
+		|| GetPair(win->_line[i].text[j]) != 0) {
+		n = j;
+	    }
+	}
+
+	if (n > width)
+	    width = n;
+    }
+    if (width < win->_maxx)
+	++width;
+    if (++width + 1 > (int) my_length) {
+	my_length = (unsigned) (2 * (width + 1));
+	my_buffer = typeRealloc(char, my_length, my_buffer);
+	if (my_buffer == 0)
+	    return;
+    }
+
+    for (n = 0; n <= win->_maxy; ++n) {
+	char *ep = my_buffer;
+	bool havecolors;
+
+	/*
+	 * Dump A_CHARTEXT part.  It is more important to make the grid line up
+	 * in the trace file than to represent control- and wide-characters, so
+	 * we map those to '.' and '?' respectively.
+	 */
+	for (j = 0; j < width; ++j) {
+	    chtype test = (chtype) CharOf(win->_line[n].text[j]);
+	    ep[j] = (char) ((UChar(test) == test
+#if USE_WIDEC_SUPPORT
+			     && (win->_line[n].text[j].chars[1] == 0)
+#endif
+			    )
+			    ? (iscntrl(UChar(test))
+			       ? '.'
+			       : UChar(test))
+			    : '?');
+	}
+	ep[j] = '\0';
+	_tracef("%s[%2d] %3ld%3ld ='%s'",
+		name, n,
+		(long) win->_line[n].firstchar,
+		(long) win->_line[n].lastchar,
+		ep);
+
+	/* if there are multi-column characters on the line, print them now */
+	if_WIDEC({
+	    bool multicolumn = FALSE;
+	    for (j = 0; j < width; ++j)
+		if (WidecExt(win->_line[n].text[j]) != 0) {
+		    multicolumn = TRUE;
+		    break;
+		}
+	    if (multicolumn) {
+		ep = my_buffer;
+		for (j = 0; j < width; ++j) {
+		    int test = WidecExt(win->_line[n].text[j]);
+		    if (test) {
+			ep[j] = (char) (test + '0');
+		    } else {
+			ep[j] = ' ';
+		    }
+		}
+		ep[j] = '\0';
+		_tracef("%*s[%2d]%*s='%s'", (int) strlen(name),
+			"widec", n, 8, " ", my_buffer);
+	    }
+	});
+
+	/* dump A_COLOR part, will screw up if there are more than 96 */
+	havecolors = FALSE;
+	for (j = 0; j < width; ++j)
+	    if (GetPair(win->_line[n].text[j]) != 0) {
+		havecolors = TRUE;
+		break;
+	    }
+	if (havecolors) {
+	    ep = my_buffer;
+	    for (j = 0; j < width; ++j) {
+		int pair = GetPair(win->_line[n].text[j]);
+		if (pair >= 52)
+		    ep[j] = '?';
+		else if (pair >= 36)
+		    ep[j] = (char) (pair + 'A');
+		else if (pair >= 10)
+		    ep[j] = (char) (pair + 'a');
+		else if (pair >= 1)
+		    ep[j] = (char) (pair + '0');
+		else
+		    ep[j] = ' ';
+	    }
+	    ep[j] = '\0';
+	    _tracef("%*s[%2d]%*s='%s'", (int) strlen(name),
+		    "colors", n, 8, " ", my_buffer);
+	}
+
+	for (i = 0; i < 4; ++i) {
+	    const char *hex = " 123456789ABCDEF";
+	    attr_t mask = (attr_t) (0xf << ((i + 4) * 4));
+	    bool haveattrs = FALSE;
+
+	    for (j = 0; j < width; ++j)
+		if (AttrOf(win->_line[n].text[j]) & mask) {
+		    haveattrs = TRUE;
+		    break;
+		}
+	    if (haveattrs) {
+		ep = my_buffer;
+		for (j = 0; j < width; ++j)
+		    ep[j] = hex[(AttrOf(win->_line[n].text[j]) & mask) >>
+				((i + 4) * 4)];
+		ep[j] = '\0';
+		_tracef("%*s%d[%2d]%*s='%s'", (int) strlen(name) -
+			1, "attrs", i, n, 8, " ", my_buffer);
+	    }
+	}
+    }
+#if NO_LEAKS
+    free(my_buffer);
+    my_buffer = 0;
+    my_length = 0;
+#endif
+}
+
+#else
+EMPTY_MODULE(_nc_lib_tracedmp)
+#endif /* TRACE */
diff --git a/ncurses/trace/lib_tracemse.c b/ncurses/trace/lib_tracemse.c
new file mode 100644
index 0000000..33d4d3d
--- /dev/null
+++ b/ncurses/trace/lib_tracemse.c
@@ -0,0 +1,158 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2012,2014 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ ****************************************************************************/
+
+/*
+ *	lib_tracemse.c - Tracing/Debugging routines (mouse events)
+ */
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_tracemse.c,v 1.23 2020/02/02 23:34:34 tom Exp $")
+
+#ifdef TRACE
+
+#define my_buffer sp->tracemse_buf
+
+NCURSES_EXPORT(char *)
+_nc_trace_mmask_t(SCREEN *sp, mmask_t code)
+{
+#define SHOW(m, s) \
+    if ((code & m) == m) { \
+	size_t n = strlen(my_buffer); \
+	if (n && (my_buffer[n-1] != '{')) \
+	_nc_STRCAT(my_buffer, ", ", sizeof(my_buffer)); \
+	_nc_STRCAT(my_buffer, s, sizeof(my_buffer)); \
+    }
+
+    SHOW(BUTTON1_RELEASED, "release-1");
+    SHOW(BUTTON1_PRESSED, "press-1");
+    SHOW(BUTTON1_CLICKED, "click-1");
+    SHOW(BUTTON1_DOUBLE_CLICKED, "doubleclick-1");
+    SHOW(BUTTON1_TRIPLE_CLICKED, "tripleclick-1");
+#if NCURSES_MOUSE_VERSION == 1
+    SHOW(BUTTON1_RESERVED_EVENT, "reserved-1");
+#endif
+
+    SHOW(BUTTON2_RELEASED, "release-2");
+    SHOW(BUTTON2_PRESSED, "press-2");
+    SHOW(BUTTON2_CLICKED, "click-2");
+    SHOW(BUTTON2_DOUBLE_CLICKED, "doubleclick-2");
+    SHOW(BUTTON2_TRIPLE_CLICKED, "tripleclick-2");
+#if NCURSES_MOUSE_VERSION == 1
+    SHOW(BUTTON2_RESERVED_EVENT, "reserved-2");
+#endif
+
+    SHOW(BUTTON3_RELEASED, "release-3");
+    SHOW(BUTTON3_PRESSED, "press-3");
+    SHOW(BUTTON3_CLICKED, "click-3");
+    SHOW(BUTTON3_DOUBLE_CLICKED, "doubleclick-3");
+    SHOW(BUTTON3_TRIPLE_CLICKED, "tripleclick-3");
+#if NCURSES_MOUSE_VERSION == 1
+    SHOW(BUTTON3_RESERVED_EVENT, "reserved-3");
+#endif
+
+    SHOW(BUTTON4_RELEASED, "release-4");
+    SHOW(BUTTON4_PRESSED, "press-4");
+    SHOW(BUTTON4_CLICKED, "click-4");
+    SHOW(BUTTON4_DOUBLE_CLICKED, "doubleclick-4");
+    SHOW(BUTTON4_TRIPLE_CLICKED, "tripleclick-4");
+#if NCURSES_MOUSE_VERSION == 1
+    SHOW(BUTTON4_RESERVED_EVENT, "reserved-4");
+#endif
+
+#if NCURSES_MOUSE_VERSION == 2
+    SHOW(BUTTON5_RELEASED, "release-5");
+    SHOW(BUTTON5_PRESSED, "press-5");
+    SHOW(BUTTON5_CLICKED, "click-5");
+    SHOW(BUTTON5_DOUBLE_CLICKED, "doubleclick-5");
+    SHOW(BUTTON5_TRIPLE_CLICKED, "tripleclick-5");
+#endif
+
+    SHOW(BUTTON_CTRL, "ctrl");
+    SHOW(BUTTON_SHIFT, "shift");
+    SHOW(BUTTON_ALT, "alt");
+    SHOW(ALL_MOUSE_EVENTS, "all-events");
+    SHOW(REPORT_MOUSE_POSITION, "position");
+
+#undef SHOW
+
+    if (my_buffer[strlen(my_buffer) - 1] == ' ')
+	my_buffer[strlen(my_buffer) - 2] = '\0';
+
+    return (my_buffer);
+}
+
+NCURSES_EXPORT(char *)
+_nc_tracemouse(SCREEN *sp, MEVENT const *ep)
+{
+    char *result = 0;
+
+    if (sp != 0) {
+	_nc_SPRINTF(my_buffer, _nc_SLIMIT(sizeof(my_buffer))
+		    TRACEMSE_FMT,
+		    ep->id,
+		    ep->x,
+		    ep->y,
+		    ep->z,
+		    (unsigned long) ep->bstate);
+
+	(void) _nc_trace_mmask_t(sp, ep->bstate);
+	_nc_STRCAT(my_buffer, "}", sizeof(my_buffer));
+	result = (my_buffer);
+    }
+    return result;
+}
+
+NCURSES_EXPORT(mmask_t)
+_nc_retrace_mmask_t(SCREEN *sp, mmask_t code)
+{
+    if (sp != 0) {
+	*my_buffer = '\0';
+	T((T_RETURN("{%s}"), _nc_trace_mmask_t(sp, code)));
+    } else {
+	T((T_RETURN("{?}")));
+    }
+    return code;
+}
+
+NCURSES_EXPORT(char *)
+_tracemouse(MEVENT const *ep)
+{
+    return _nc_tracemouse(CURRENT_SCREEN, ep);
+}
+
+#else /* !TRACE */
+EMPTY_MODULE(_nc_lib_tracemouse)
+#endif
diff --git a/ncurses/trace/trace_buf.c b/ncurses/trace/trace_buf.c
new file mode 100644
index 0000000..7e6384b
--- /dev/null
+++ b/ncurses/trace/trace_buf.c
@@ -0,0 +1,121 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2011,2012 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                 1997-on                        *
+ ****************************************************************************/
+/*
+ *	trace_buf.c - Tracing/Debugging buffers (attributes)
+ */
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: trace_buf.c,v 1.21 2020/02/02 23:34:34 tom Exp $")
+
+#ifdef TRACE
+
+#define MyList _nc_globals.tracebuf_ptr
+#define MySize _nc_globals.tracebuf_used
+
+static char *
+_nc_trace_alloc(int bufnum, size_t want)
+{
+    char *result = 0;
+
+    if (bufnum >= 0) {
+	if ((size_t) (bufnum + 1) > MySize) {
+	    size_t need = (size_t) (bufnum + 1) * 2;
+	    if ((MyList = typeRealloc(TRACEBUF, need, MyList)) != 0) {
+		while (need > MySize)
+		    MyList[MySize++].text = 0;
+	    }
+	}
+
+	if (MyList != 0) {
+	    if (MyList[bufnum].text == 0
+		|| want > MyList[bufnum].size) {
+		MyList[bufnum].text = typeRealloc(char, want, MyList[bufnum].text);
+		if (MyList[bufnum].text != 0)
+		    MyList[bufnum].size = want;
+	    }
+	    result = MyList[bufnum].text;
+	}
+    }
+#if NO_LEAKS
+    else {
+	if (MySize) {
+	    if (MyList) {
+		while (MySize--) {
+		    if (MyList[MySize].text != 0) {
+			free(MyList[MySize].text);
+		    }
+		}
+		free(MyList);
+		MyList = 0;
+	    }
+	    MySize = 0;
+	}
+    }
+#endif
+    return result;
+}
+
+/*
+ * (re)Allocate a buffer big enough for the caller's wants.
+ */
+NCURSES_EXPORT(char *)
+_nc_trace_buf(int bufnum, size_t want)
+{
+    char *result = _nc_trace_alloc(bufnum, want);
+    if (result != 0)
+	*result = '\0';
+    return result;
+}
+
+/*
+ * Append a new string to an existing buffer.
+ */
+NCURSES_EXPORT(char *)
+_nc_trace_bufcat(int bufnum, const char *value)
+{
+    char *buffer = _nc_trace_alloc(bufnum, (size_t) 0);
+    if (buffer != 0) {
+	size_t have = strlen(buffer);
+	size_t need = strlen(value) + have;
+
+	buffer = _nc_trace_alloc(bufnum, 1 + need);
+	if (buffer != 0)
+	    _nc_STRCPY(buffer + have, value, need);
+
+    }
+    return buffer;
+}
+#else
+EMPTY_MODULE(_nc_empty_trace_buf)
+#endif /* TRACE */
diff --git a/ncurses/trace/trace_tries.c b/ncurses/trace/trace_tries.c
new file mode 100644
index 0000000..14f704b
--- /dev/null
+++ b/ncurses/trace/trace_tries.c
@@ -0,0 +1,82 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1999-2011,2012 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey 1999                                           *
+ ****************************************************************************/
+/*
+ *	trace_tries.c - Tracing/Debugging buffers (keycode tries-trees)
+ */
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: trace_tries.c,v 1.18 2020/02/02 23:34:34 tom Exp $")
+
+#ifdef TRACE
+#define my_buffer _nc_globals.tracetry_buf
+#define my_length _nc_globals.tracetry_used
+
+static void
+recur_tries(TRIES * tree, unsigned level)
+{
+    if (level > my_length) {
+	my_length = (level + 1) * 4;
+	my_buffer = (unsigned char *) _nc_doalloc(my_buffer, my_length);
+    }
+
+    if (my_buffer != 0) {
+	while (tree != 0) {
+	    if ((my_buffer[level] = tree->ch) == 0)
+		my_buffer[level] = 128;
+	    my_buffer[level + 1] = 0;
+	    if (tree->value != 0) {
+		_tracef("%5d: %s (%s)", tree->value,
+			_nc_visbuf((char *) my_buffer), keyname(tree->value));
+	    }
+	    if (tree->child)
+		recur_tries(tree->child, level + 1);
+	    tree = tree->sibling;
+	}
+    }
+}
+
+NCURSES_EXPORT(void)
+_nc_trace_tries(TRIES * tree)
+{
+    if ((my_buffer = typeMalloc(unsigned char, my_length = 80)) != 0) {
+	_tracef("BEGIN tries %p", (void *) tree);
+	recur_tries(tree, 0);
+	_tracef(". . . tries %p", (void *) tree);
+	free(my_buffer);
+    }
+}
+
+#else
+EMPTY_MODULE(_nc_empty_trace_tries)
+#endif
diff --git a/ncurses/trace/trace_xnames.c b/ncurses/trace/trace_xnames.c
new file mode 100644
index 0000000..2d74336
--- /dev/null
+++ b/ncurses/trace/trace_xnames.c
@@ -0,0 +1,79 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1999-2010,2016 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey <dickey@clark.net> 1999                        *
+ ****************************************************************************/
+/*
+ *	trace_xnames.c - Tracing/Debugging buffers (TERMTYPE extended names)
+ */
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: trace_xnames.c,v 1.8 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(void)
+_nc_trace_xnames(TERMTYPE *tp GCC_UNUSED)
+{
+#ifdef TRACE
+#if NCURSES_XNAMES
+    int limit = tp->ext_Booleans + tp->ext_Numbers + tp->ext_Strings;
+
+    if (limit) {
+	int n;
+	int begin_num = tp->ext_Booleans;
+	int begin_str = tp->ext_Booleans + tp->ext_Numbers;
+
+	_tracef("extended names (%s) %d = %d+%d+%d of %d+%d+%d",
+		tp->term_names,
+		limit,
+		tp->ext_Booleans, tp->ext_Numbers, tp->ext_Strings,
+		tp->num_Booleans, tp->num_Numbers, tp->num_Strings);
+
+	for (n = 0; n < limit; n++) {
+	    int m;
+
+	    if ((m = n - begin_str) >= 0) {
+		_tracef("[%d] %s = %s", n,
+			tp->ext_Names[n],
+			_nc_visbuf(tp->Strings[tp->num_Strings + m - tp->ext_Strings]));
+	    } else if ((m = n - begin_num) >= 0) {
+		_tracef("[%d] %s = %d (num)", n,
+			tp->ext_Names[n],
+			tp->Numbers[tp->num_Numbers + m - tp->ext_Numbers]);
+	    } else {
+		_tracef("[%d] %s = %d (bool)", n,
+			tp->ext_Names[n],
+			tp->Booleans[tp->num_Booleans + n - tp->ext_Booleans]);
+	    }
+	}
+    }
+#endif
+#endif
+}
diff --git a/ncurses/trace/varargs.c b/ncurses/trace/varargs.c
new file mode 100644
index 0000000..9be5fc2
--- /dev/null
+++ b/ncurses/trace/varargs.c
@@ -0,0 +1,192 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 2001-2008,2012 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey 2001                                           *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+
+#include <ctype.h>
+
+MODULE_ID("$Id: varargs.c,v 1.12 2020/02/02 23:34:34 tom Exp $")
+
+#ifdef TRACE
+
+#define MAX_PARMS 10
+
+typedef enum {
+    atUnknown = 0, atInteger, atFloat, atPoint, atString
+} ARGTYPE;
+
+#define VA_INT(type) ival = (int) va_arg(ap, type)
+#define VA_FLT(type) fval = va_arg(ap, type)
+#define VA_PTR(type) pval = (char *)va_arg(ap, type)
+#define VA_STR(type) sval = va_arg(ap, type)
+
+#define MyBuffer _nc_globals.tracearg_buf
+#define MyLength _nc_globals.tracearg_used
+
+/*
+ * Returns a string that represents the parameter list of a printf-style call.
+ */
+NCURSES_EXPORT(char *)
+_nc_varargs(const char *fmt, va_list ap)
+{
+    static char dummy[] = "";
+
+    char buffer[BUFSIZ];
+    const char *param;
+    int n;
+
+    if (fmt == 0 || *fmt == '\0')
+	return dummy;
+    if (MyLength == 0)
+	MyBuffer = typeMalloc(char, MyLength = BUFSIZ);
+    if (MyBuffer == 0)
+	return dummy;
+    *MyBuffer = '\0';
+
+    while (*fmt != '\0') {
+	if (*fmt == '%') {
+	    char *pval = 0;	/* avoid const-cast */
+	    const char *sval = "";
+	    double fval = 0.0;
+	    int done = FALSE;
+	    int ival = 0;
+	    int type = 0;
+	    ARGTYPE parm[MAX_PARMS];
+	    int parms = 0;
+	    ARGTYPE used = atUnknown;
+
+	    while (*++fmt != '\0' && !done) {
+
+		if (*fmt == '*') {
+		    VA_INT(int);
+		    if (parms < MAX_PARMS)
+			parm[parms++] = atInteger;
+		} else if (isalpha(UChar(*fmt))) {
+		    done = TRUE;
+		    switch (*fmt) {
+		    case 'Z':	/* FALLTHRU */
+		    case 'h':	/* FALLTHRU */
+		    case 'l':	/* FALLTHRU */
+			done = FALSE;
+			type = *fmt;
+			break;
+		    case 'i':	/* FALLTHRU */
+		    case 'd':	/* FALLTHRU */
+		    case 'u':	/* FALLTHRU */
+		    case 'x':	/* FALLTHRU */
+		    case 'X':	/* FALLTHRU */
+			if (type == 'l')
+			    VA_INT(long);
+			else if (type == 'Z')
+			    VA_INT(size_t);
+			else
+			    VA_INT(int);
+			used = atInteger;
+			break;
+		    case 'f':	/* FALLTHRU */
+		    case 'e':	/* FALLTHRU */
+		    case 'E':	/* FALLTHRU */
+		    case 'g':	/* FALLTHRU */
+		    case 'G':	/* FALLTHRU */
+			VA_FLT(double);
+			used = atFloat;
+			break;
+		    case 'c':
+			VA_INT(int);
+			used = atInteger;
+			break;
+		    case 's':
+			VA_STR(const char *);
+			used = atString;
+			break;
+		    case 'p':
+			VA_PTR(void *);
+			used = atPoint;
+			break;
+		    case 'n':
+			VA_PTR(int *);
+			used = atPoint;
+			break;
+		    default:
+			break;
+		    }
+		} else if (*fmt == '%') {
+		    done = TRUE;
+		}
+		if (used != atUnknown && parms < MAX_PARMS) {
+		    parm[parms++] = used;
+		    for (n = 0; n < parms; ++n) {
+			used = parm[n];
+			param = buffer;
+			switch (used) {
+			case atInteger:
+			    _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer))
+					"%d", ival);
+			    break;
+			case atFloat:
+			    _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer))
+					"%f", fval);
+			    break;
+			case atPoint:
+			    _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer))
+					"%p", pval);
+			    break;
+			case atString:
+			    param = _nc_visbuf2(1, sval);
+			    break;
+			case atUnknown:
+			default:
+			    _nc_STRCPY(buffer, "?", sizeof(buffer));
+			    break;
+			}
+			MyLength += strlen(param) + 2;
+			MyBuffer = typeRealloc(char, MyLength, MyBuffer);
+			if (MyBuffer != 0) {
+			    _nc_SPRINTF(MyBuffer + strlen(MyBuffer),
+					_nc_SLIMIT(MyLength - strlen(MyBuffer))
+					", %s", param);
+			}
+		    }
+		}
+		used = atUnknown;
+	    }
+	} else {
+	    fmt++;
+	}
+    }
+
+    return (MyBuffer ? MyBuffer : dummy);
+}
+#else
+EMPTY_MODULE(_nc_varargs)
+#endif
diff --git a/ncurses/trace/visbuf.c b/ncurses/trace/visbuf.c
new file mode 100644
index 0000000..aca8aff
--- /dev/null
+++ b/ncurses/trace/visbuf.c
@@ -0,0 +1,378 @@
+/****************************************************************************
+ * Copyright 2019-2020,2021 Thomas E. Dickey                                *
+ * Copyright 2001-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                        1996-on                 *
+ *     and: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ ****************************************************************************/
+
+/*
+ *	visbuf.c - Tracing/Debugging support routines
+ */
+
+#define NEED_NCURSES_CH_T
+#include <curses.priv.h>
+
+#include <tic.h>
+#include <ctype.h>
+
+MODULE_ID("$Id: visbuf.c,v 1.53 2021/02/27 20:07:57 tom Exp $")
+
+#define NUM_VISBUFS 4
+
+#define NormalLen(len) (size_t) (((size_t)(len) + 1) * 4)
+#define WideLen(len)   (size_t) (((size_t)(len) + 1) * 4 * (size_t) MB_CUR_MAX)
+
+#ifdef TRACE
+static const char d_quote[] = StringOf(D_QUOTE);
+static const char l_brace[] = StringOf(L_BRACE);
+static const char r_brace[] = StringOf(R_BRACE);
+#endif
+
+#if USE_STRING_HACKS && HAVE_SNPRINTF
+#define VisChar(tp, chr, limit) _nc_vischar(tp, chr, limit)
+#define LIMIT_ARG ,size_t limit
+#else
+#define VisChar(tp, chr, limit) _nc_vischar(tp, chr)
+#define LIMIT_ARG		/* nothing */
+#endif
+
+static char *
+_nc_vischar(char *tp, unsigned c LIMIT_ARG)
+{
+    if (c == '"' || c == '\\') {
+	*tp++ = '\\';
+	*tp++ = (char) c;
+    } else if (is7bits((int) c) && (isgraph((int) c) || c == ' ')) {
+	*tp++ = (char) c;
+    } else if (c == '\n') {
+	*tp++ = '\\';
+	*tp++ = 'n';
+    } else if (c == '\r') {
+	*tp++ = '\\';
+	*tp++ = 'r';
+    } else if (c == '\b') {
+	*tp++ = '\\';
+	*tp++ = 'b';
+    } else if (c == '\t') {
+	*tp++ = '\\';
+	*tp++ = 't';
+    } else if (c == '\033') {
+	*tp++ = '\\';
+	*tp++ = 'e';
+    } else if (UChar(c) == 0x7f) {
+	*tp++ = '\\';
+	*tp++ = '^';
+	*tp++ = '?';
+    } else if (is7bits(c) && iscntrl(UChar(c))) {
+	*tp++ = '\\';
+	*tp++ = '^';
+	*tp++ = (char) ('@' + c);
+    } else {
+	_nc_SPRINTF(tp, _nc_SLIMIT(limit)
+		    "\\%03lo", (unsigned long) ChCharOf(c));
+	tp += strlen(tp);
+    }
+    *tp = 0;
+    return tp;
+}
+
+static const char *
+_nc_visbuf2n(int bufnum, const char *buf, int len)
+{
+    const char *vbuf = 0;
+    char *tp;
+    int count;
+
+    if (buf == 0)
+	return ("(null)");
+    if (buf == CANCELLED_STRING)
+	return ("(cancelled)");
+
+    if (len < 0)
+	len = (int) strlen(buf);
+
+    count = len;
+#ifdef TRACE
+    vbuf = tp = _nc_trace_buf(bufnum, NormalLen(len));
+#else
+    {
+	static char *mybuf[NUM_VISBUFS];
+	int c;
+
+	if (bufnum < 0) {
+	    for (c = 0; c < NUM_VISBUFS; ++c) {
+		FreeAndNull(mybuf[c]);
+	    }
+	    tp = 0;
+	} else {
+	    mybuf[bufnum] = typeRealloc(char, NormalLen(len), mybuf[bufnum]);
+	    vbuf = tp = mybuf[bufnum];
+	}
+    }
+#endif
+    if (tp != 0) {
+	int c;
+
+	*tp++ = D_QUOTE;
+	while ((--count >= 0) && (c = *buf++) != '\0') {
+	    tp = VisChar(tp, UChar(c), NormalLen(len));
+	}
+	*tp++ = D_QUOTE;
+	*tp = '\0';
+    } else {
+	vbuf = ("(_nc_visbuf2n failed)");
+    }
+    return (vbuf);
+}
+
+NCURSES_EXPORT(const char *)
+_nc_visbuf2(int bufnum, const char *buf)
+{
+    return _nc_visbuf2n(bufnum, buf, -1);
+}
+
+NCURSES_EXPORT(const char *)
+_nc_visbuf(const char *buf)
+{
+    return _nc_visbuf2(0, buf);
+}
+
+NCURSES_EXPORT(const char *)
+_nc_visbufn(const char *buf, int len)
+{
+    return _nc_visbuf2n(0, buf, len);
+}
+
+#ifdef TRACE
+#if USE_WIDEC_SUPPORT
+
+#if defined(USE_TERMLIB)
+#define _nc_wchstrlen _my_wchstrlen
+static int
+_nc_wchstrlen(const cchar_t *s)
+{
+    int result = 0;
+    while (CharOf(s[result]) != L'\0') {
+	result++;
+    }
+    return result;
+}
+#endif
+
+static const char *
+_nc_viswbuf2n(int bufnum, const wchar_t *buf, int len)
+{
+    const char *vbuf;
+    char *tp;
+    int count;
+
+    if (buf == 0)
+	return ("(null)");
+
+    if (len < 0)
+	len = (int) wcslen(buf);
+
+    count = len;
+#ifdef TRACE
+    vbuf = tp = _nc_trace_buf(bufnum, WideLen(len));
+#else
+    {
+	static char *mybuf[NUM_VISBUFS];
+	mybuf[bufnum] = typeRealloc(char, WideLen(len), mybuf[bufnum]);
+	vbuf = tp = mybuf[bufnum];
+    }
+#endif
+    if (tp != 0) {
+	wchar_t c;
+
+	*tp++ = D_QUOTE;
+	while ((--count >= 0) && (c = *buf++) != '\0') {
+	    char temp[CCHARW_MAX + 80];
+	    int j = wctomb(temp, c), k;
+	    if (j <= 0) {
+		_nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp))
+			    "\\u%08X", (unsigned) c);
+		j = (int) strlen(temp);
+	    }
+	    for (k = 0; k < j; ++k) {
+		tp = VisChar(tp, UChar(temp[k]), WideLen(len));
+	    }
+	}
+	*tp++ = D_QUOTE;
+	*tp = '\0';
+    } else {
+	vbuf = ("(_nc_viswbuf2n failed)");
+    }
+    return (vbuf);
+}
+
+NCURSES_EXPORT(const char *)
+_nc_viswbuf2(int bufnum, const wchar_t *buf)
+{
+    return _nc_viswbuf2n(bufnum, buf, -1);
+}
+
+NCURSES_EXPORT(const char *)
+_nc_viswbuf(const wchar_t *buf)
+{
+    return _nc_viswbuf2(0, buf);
+}
+
+NCURSES_EXPORT(const char *)
+_nc_viswbufn(const wchar_t *buf, int len)
+{
+    return _nc_viswbuf2n(0, buf, len);
+}
+
+/* this special case is used for wget_wstr() */
+NCURSES_EXPORT(const char *)
+_nc_viswibuf(const wint_t *buf)
+{
+    static wchar_t *mybuf;
+    static unsigned mylen;
+    unsigned n;
+
+    for (n = 0; buf[n] != 0; ++n) {
+	;			/* empty */
+    }
+    if (mylen < ++n) {
+	mylen = n + 80;
+	if (mybuf != 0)
+	    mybuf = typeRealloc(wchar_t, mylen, mybuf);
+	else
+	    mybuf = typeMalloc(wchar_t, mylen);
+    }
+    if (mybuf != 0) {
+	for (n = 0; buf[n] != 0; ++n) {
+	    mybuf[n] = (wchar_t) buf[n];
+	}
+	mybuf[n] = L'\0';
+    }
+
+    return _nc_viswbuf2(0, mybuf);
+}
+#endif /* USE_WIDEC_SUPPORT */
+
+/* use these functions for displaying parts of a line within a window */
+NCURSES_EXPORT(const char *)
+_nc_viscbuf2(int bufnum, const NCURSES_CH_T *buf, int len)
+{
+    char *result = _nc_trace_buf(bufnum, (size_t) BUFSIZ);
+
+    if (result != 0) {
+	int first = 0;
+
+#if USE_WIDEC_SUPPORT
+	if (len < 0)
+	    len = _nc_wchstrlen(buf);
+#endif /* USE_WIDEC_SUPPORT */
+
+	/*
+	 * Display one or more strings followed by attributes.
+	 */
+	while (first < len) {
+	    attr_t attr = AttrOf(buf[first]);
+	    int last = len - 1;
+	    int j;
+
+	    for (j = first + 1; j < len; ++j) {
+		if (!SameAttrOf(buf[j], buf[first])) {
+		    last = j - 1;
+		    break;
+		}
+	    }
+
+	    (void) _nc_trace_bufcat(bufnum, l_brace);
+	    (void) _nc_trace_bufcat(bufnum, d_quote);
+	    for (j = first; j <= last; ++j) {
+		const char *found = _nc_altcharset_name(attr, (chtype)
+							CharOf(buf[j]));
+		if (found != 0) {
+		    (void) _nc_trace_bufcat(bufnum, found);
+		    attr &= ~A_ALTCHARSET;
+		} else
+#if USE_WIDEC_SUPPORT
+		if (!isWidecExt(buf[j])) {
+		    PUTC_DATA;
+
+		    for (PUTC_i = 0; PUTC_i < CCHARW_MAX; ++PUTC_i) {
+			int k;
+			char temp[80];
+
+			PUTC_ch = buf[j].chars[PUTC_i];
+			if (PUTC_ch == L'\0') {
+			    if (PUTC_i == 0)
+				(void) _nc_trace_bufcat(bufnum, "\\000");
+			    break;
+			}
+			PUTC_INIT;
+			PUTC_n = (int) wcrtomb(PUTC_buf,
+					       buf[j].chars[PUTC_i], &PUT_st);
+			if (PUTC_n <= 0 || buf[j].chars[PUTC_i] > 255) {
+			    _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp))
+					"{%d:\\u%lx}",
+					_nc_wacs_width(buf[j].chars[PUTC_i]),
+					(unsigned long) buf[j].chars[PUTC_i]);
+			    (void) _nc_trace_bufcat(bufnum, temp);
+			    break;
+			}
+			for (k = 0; k < PUTC_n; k++) {
+			    VisChar(temp, UChar(PUTC_buf[k]), sizeof(temp));
+			    (void) _nc_trace_bufcat(bufnum, temp);
+			}
+		    }
+		}
+#else
+		{
+		    char temp[80];
+		    VisChar(temp, UChar(buf[j]), sizeof(temp));
+		    (void) _nc_trace_bufcat(bufnum, temp);
+		}
+#endif /* USE_WIDEC_SUPPORT */
+	    }
+	    (void) _nc_trace_bufcat(bufnum, d_quote);
+	    if (attr != A_NORMAL) {
+		(void) _nc_trace_bufcat(bufnum, " | ");
+		(void) _nc_trace_bufcat(bufnum, _traceattr2(bufnum + 20, attr));
+	    }
+	    result = _nc_trace_bufcat(bufnum, r_brace);
+	    first = last + 1;
+	}
+    }
+    return result;
+}
+
+NCURSES_EXPORT(const char *)
+_nc_viscbuf(const NCURSES_CH_T *buf, int len)
+{
+    return _nc_viscbuf2(0, buf, len);
+}
+#endif /* TRACE */
diff --git a/ncurses/tty/MKexpanded.sh b/ncurses/tty/MKexpanded.sh
new file mode 100755
index 0000000..0072be2
--- /dev/null
+++ b/ncurses/tty/MKexpanded.sh
@@ -0,0 +1,136 @@
+#! /bin/sh
+##############################################################################
+# Copyright 2019-2020,2021 Thomas E. Dickey                                  #
+# Copyright 1998-2015,2017 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey, 1997-on
+#
+# $Id: MKexpanded.sh,v 1.24 2022/02/05 17:27:18 tom Exp $
+#
+# Script to generate 'expanded.c', a dummy source that contains functions
+# corresponding to complex macros used in this library.  By making functions,
+# we simplify analysis and debugging.
+
+if test $# != 0; then
+preprocessor="$1"
+else
+preprocessor="cc -E"
+fi
+shift
+if test $# != 0 ; then
+	preprocessor="$preprocessor $*"
+else
+	preprocessor="$preprocessor -DHAVE_CONFIG_H -I. -I../include"
+fi
+
+TMP=gen$$.c
+trap "rm -f $TMP; exit 1" 1 2 3 15
+trap "rm -f $TMP" 0
+
+cat <<EOF
+/* generated by MKexpanded.sh */
+#define NEED_NCURSES_CH_T 1
+#include <curses.priv.h>
+
+#ifndef CUR
+#define CUR SP_TERMTYPE
+#endif
+
+#if NCURSES_EXPANDED
+EOF
+
+cat >$TMP <<EOF
+#include <ncurses_cfg.h>
+#undef NCURSES_EXPANDED /* this probably is set in ncurses_cfg.h */
+#include <curses.priv.h>
+/* these are names we'd like to see */
+#undef ALL_BUT_COLOR
+#undef PAIR_NUMBER
+#undef TRUE
+#undef FALSE
+/* this is a marker */
+IGNORE
+NCURSES_EXPORT(void)
+_nc_toggle_attr_on (attr_t *S, attr_t at)
+{
+	toggle_attr_on(*S,at);
+}
+
+NCURSES_EXPORT(void)
+_nc_toggle_attr_off (attr_t *S, attr_t at)
+{
+	toggle_attr_off(*S,at);
+}
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(_nc_DelCharCost) (NCURSES_SP_DCLx int count)
+{
+	return DelCharCost(SP_PARM, count);
+}
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(_nc_InsCharCost) (NCURSES_SP_DCLx int count)
+{
+	return InsCharCost(SP_PARM, count);
+}
+
+NCURSES_EXPORT(void)
+NCURSES_SP_NAME(_nc_UpdateAttrs) (NCURSES_SP_DCLx CARG_CH_T c)
+{
+	UpdateAttrs(SP_PARM, CHDEREF(c));
+}
+
+@if_NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+_nc_DelCharCost (int count)
+{
+	return NCURSES_SP_NAME(_nc_DelCharCost) (CURRENT_SCREEN, count);
+}
+
+NCURSES_EXPORT(int)
+_nc_InsCharCost (int count)
+{
+	return NCURSES_SP_NAME(_nc_InsCharCost)(CURRENT_SCREEN, count);
+}
+
+NCURSES_EXPORT(void)
+_nc_UpdateAttrs (CARG_CH_T c)
+{
+	NCURSES_SP_NAME(_nc_UpdateAttrs)(CURRENT_SCREEN,c);
+}
+@endif
+EOF
+
+$preprocessor $TMP 2>/dev/null | \
+	sed -e '1,/^IGNORE$/d' -e 's/^@/#/' -e 's/^#[ 	]*if_/#if /' -e "s,$TMP,expanded.c,"
+
+cat <<EOF
+#else /* ! NCURSES_EXPANDED */
+NCURSES_EXPORT(void) _nc_expanded (void) { }
+#endif /* NCURSES_EXPANDED */
+EOF
diff --git a/ncurses/tty/hardscroll.c b/ncurses/tty/hardscroll.c
new file mode 100644
index 0000000..abb21cf
--- /dev/null
+++ b/ncurses/tty/hardscroll.c
@@ -0,0 +1,373 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2015,2016 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ *     and: Alexander V Lukyanov                    1997-1998               *
+ ****************************************************************************/
+
+/******************************************************************************
+
+NAME
+   hardscroll.c -- hardware-scrolling optimization for ncurses
+
+SYNOPSIS
+   void _nc_scroll_optimize(void)
+
+DESCRIPTION
+			OVERVIEW
+
+This algorithm for computes optimum hardware scrolling to transform an
+old screen (curscr) into a new screen (newscr) via vertical line moves.
+
+Because the screen has a `grain' (there are insert/delete/scroll line
+operations but no insert/delete/scroll column operations), it is efficient
+break the update algorithm into two pieces: a first stage that does only line
+moves, optimizing the end product of user-invoked insertions, deletions, and
+scrolls; and a second phase (corresponding to the present doupdate code in
+ncurses) that does only line transformations.
+
+The common case we want hardware scrolling for is to handle line insertions
+and deletions in screen-oriented text-editors.  This two-stage approach will
+accomplish that at a low computation and code-size cost.
+
+			LINE-MOVE COMPUTATION
+
+Now, to a discussion of the line-move computation.
+
+For expository purposes, consider the screen lines to be represented by
+integers 0..23 (with the understanding that the value of 23 may vary).
+Let a new line introduced by insertion, scrolling, or at the bottom of
+the screen following a line delete be given the index -1.
+
+Assume that the real screen starts with lines 0..23.  Now, we have
+the following possible line-oriented operations on the screen:
+
+Insertion: inserts a line at a given screen row, forcing all lines below
+to scroll forward.  The last screen line is lost.  For example, an insertion
+at line 5 would produce: 0..4 -1 5..23.
+
+Deletion: deletes a line at a given screen row, forcing all lines below
+to scroll forward.  The last screen line is made new.  For example, a deletion
+at line 7 would produce: 0..6 8..23 -1.
+
+Scroll up: move a range of lines up 1.  The bottom line of the range
+becomes new.  For example, scrolling up the region from 9 to 14 will
+produce 0..8 10..14 -1 15..23.
+
+Scroll down: move a range of lines down 1.  The top line of the range
+becomes new.  For example, scrolling down the region from 12 to 16 will produce
+0..11 -1 12..15 17..23.
+
+Now, an obvious property of all these operations is that they preserve the
+order of old lines, though not their position in the sequence.
+
+The key trick of this algorithm is that the original line indices described
+above are actually maintained as _line[].oldindex fields in the window
+structure, and stick to each line through scroll and insert/delete operations.
+
+Thus, it is possible at update time to look at the oldnum fields and compute
+an optimal set of il/dl/scroll operations that will take the real screen
+lines to the virtual screen lines.  Once these vertical moves have been done,
+we can hand off to the second stage of the update algorithm, which does line
+transformations.
+
+Note that the move computation does not need to have the full generality
+of a diff algorithm (which it superficially resembles) because lines cannot
+be moved out of order.
+
+			THE ALGORITHM
+
+The scrolling is done in two passes. The first pass is from top to bottom
+scroling hunks UP. The second one is from bottom to top scrolling hunks DOWN.
+Obviously enough, no lines to be scrolled will be destroyed. (lav)
+
+HOW TO TEST THIS:
+
+Use the following production:
+
+hardscroll: hardscroll.c
+	$(CC) -g -DSCROLLDEBUG hardscroll.c -o hardscroll
+
+Then just type scramble vectors and watch.  The following test loads are
+a representative sample of cases:
+
+-----------------------------  CUT HERE ------------------------------------
+# No lines moved
+ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
+#
+# A scroll up
+ 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 -1
+#
+# A scroll down
+-1  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22
+#
+# An insertion (after line 12)
+ 0  1  2  3  4  5  6  7  8  9 10 11 12 -1 13 14 15 16 17 18 19 20 21 22
+#
+# A simple deletion (line 10)
+ 0  1  2  3  4  5  6  7  8  9  11 12 13 14 15 16 17 18 19 20 21 22 23 -1
+#
+# A more complex case
+-1 -1 -1 -1 -1  3  4  5  6  7  -1 -1  8  9 10 11 12 13 14 15 16 17 -1 -1
+-----------------------------  CUT HERE ------------------------------------
+
+AUTHOR
+    Eric S. Raymond <esr@snark.thyrsus.com>, November 1994
+    New algorithm by Alexander V. Lukyanov <lav@yars.free.net>, Aug 1997
+
+*****************************************************************************/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: hardscroll.c,v 1.54 2020/02/02 23:34:34 tom Exp $")
+
+#if defined(SCROLLDEBUG) || defined(HASHDEBUG)
+
+# undef screen_lines
+# define screen_lines(sp) MAXLINES
+NCURSES_EXPORT_VAR (int)
+  oldnums[MAXLINES];
+# define OLDNUM(sp,n)	oldnums[n]
+# define _tracef	printf
+# undef TR
+# define TR(n, a)	if (_nc_tracing & (n)) { _tracef a ; putchar('\n'); }
+
+extern				NCURSES_EXPORT_VAR(unsigned) _nc_tracing;
+
+#else /* no debug */
+
+/* OLDNUM(n) indicates which line will be shifted to the position n.
+   if OLDNUM(n) == _NEWINDEX, then the line n in new, not shifted from
+   somewhere. */
+NCURSES_EXPORT_VAR (int *)
+  _nc_oldnums = 0;		/* obsolete: keep for ABI compat */
+
+# if USE_HASHMAP
+#  define oldnums(sp)   (sp)->_oldnum_list
+#  define OLDNUM(sp,n)	oldnums(sp)[n]
+# else /* !USE_HASHMAP */
+#  define OLDNUM(sp,n)	NewScreen(sp)->_line[n].oldindex
+# endif	/* !USE_HASHMAP */
+
+#define OLDNUM_SIZE(sp) (sp)->_oldnum_size
+
+#endif /* defined(SCROLLDEBUG) || defined(HASHDEBUG) */
+
+NCURSES_EXPORT(void)
+NCURSES_SP_NAME(_nc_scroll_optimize) (NCURSES_SP_DCL0)
+/* scroll optimization to transform curscr to newscr */
+{
+    int i;
+    int start, end, shift;
+
+    TR(TRACE_ICALLS, (T_CALLED("_nc_scroll_optimize(%p)"), (void *) SP_PARM));
+
+#if !defined(SCROLLDEBUG) && !defined(HASHDEBUG)
+#if USE_HASHMAP
+    /* get enough storage */
+    assert(OLDNUM_SIZE(SP_PARM) >= 0);
+    assert(screen_lines(SP_PARM) > 0);
+    if ((oldnums(SP_PARM) == 0)
+	|| (OLDNUM_SIZE(SP_PARM) < screen_lines(SP_PARM))) {
+	int need_lines = ((OLDNUM_SIZE(SP_PARM) < screen_lines(SP_PARM))
+			  ? screen_lines(SP_PARM)
+			  : OLDNUM_SIZE(SP_PARM));
+	int *new_oldnums = typeRealloc(int,
+				       (size_t) need_lines,
+				       oldnums(SP_PARM));
+	if (!new_oldnums)
+	    return;
+	oldnums(SP_PARM) = new_oldnums;
+	OLDNUM_SIZE(SP_PARM) = need_lines;
+    }
+    /* calculate the indices */
+    NCURSES_SP_NAME(_nc_hash_map) (NCURSES_SP_ARG);
+#endif
+#endif /* !defined(SCROLLDEBUG) && !defined(HASHDEBUG) */
+
+#ifdef TRACE
+    if (USE_TRACEF(TRACE_UPDATE | TRACE_MOVE)) {
+	NCURSES_SP_NAME(_nc_linedump) (NCURSES_SP_ARG);
+	_nc_unlock_global(tracef);
+    }
+#endif /* TRACE */
+
+    /* pass 1 - from top to bottom scrolling up */
+    for (i = 0; i < screen_lines(SP_PARM);) {
+	while (i < screen_lines(SP_PARM)
+	       && (OLDNUM(SP_PARM, i) == _NEWINDEX || OLDNUM(SP_PARM, i) <= i))
+	    i++;
+	if (i >= screen_lines(SP_PARM))
+	    break;
+
+	shift = OLDNUM(SP_PARM, i) - i;		/* shift > 0 */
+	start = i;
+
+	i++;
+	while (i < screen_lines(SP_PARM)
+	       && OLDNUM(SP_PARM, i) != _NEWINDEX
+	       && OLDNUM(SP_PARM, i) - i == shift)
+	    i++;
+	end = i - 1 + shift;
+
+	TR(TRACE_UPDATE | TRACE_MOVE, ("scroll [%d, %d] by %d", start, end, shift));
+#if !defined(SCROLLDEBUG) && !defined(HASHDEBUG)
+	if (NCURSES_SP_NAME(_nc_scrolln) (NCURSES_SP_ARGx
+					  shift,
+					  start,
+					  end,
+					  screen_lines(SP_PARM) - 1) == ERR) {
+	    TR(TRACE_UPDATE | TRACE_MOVE, ("unable to scroll"));
+	    continue;
+	}
+#endif /* !defined(SCROLLDEBUG) && !defined(HASHDEBUG) */
+    }
+
+    /* pass 2 - from bottom to top scrolling down */
+    for (i = screen_lines(SP_PARM) - 1; i >= 0;) {
+	while (i >= 0
+	       && (OLDNUM(SP_PARM, i) == _NEWINDEX
+		   || OLDNUM(SP_PARM, i) >= i)) {
+	    i--;
+	}
+	if (i < 0)
+	    break;
+
+	shift = OLDNUM(SP_PARM, i) - i;		/* shift < 0 */
+	end = i;
+
+	i--;
+	while (i >= 0
+	       && OLDNUM(SP_PARM, i) != _NEWINDEX
+	       && OLDNUM(SP_PARM, i) - i == shift) {
+	    i--;
+	}
+	start = i + 1 - (-shift);
+
+	TR(TRACE_UPDATE | TRACE_MOVE, ("scroll [%d, %d] by %d", start, end, shift));
+#if !defined(SCROLLDEBUG) && !defined(HASHDEBUG)
+	if (NCURSES_SP_NAME(_nc_scrolln) (NCURSES_SP_ARGx
+					  shift,
+					  start,
+					  end,
+					  screen_lines(SP_PARM) - 1) == ERR) {
+	    TR(TRACE_UPDATE | TRACE_MOVE, ("unable to scroll"));
+	    continue;
+	}
+#endif /* !defined(SCROLLDEBUG) && !defined(HASHDEBUG) */
+    }
+    TR(TRACE_ICALLS, (T_RETURN("")));
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(void)
+_nc_scroll_optimize(void)
+{
+    NCURSES_SP_NAME(_nc_scroll_optimize) (CURRENT_SCREEN);
+}
+#endif
+
+#if defined(TRACE) || defined(SCROLLDEBUG) || defined(HASHDEBUG)
+NCURSES_EXPORT(void)
+NCURSES_SP_NAME(_nc_linedump) (NCURSES_SP_DCL0)
+/* dump the state of the real and virtual oldnum fields */
+{
+    char *buf = 0;
+    size_t want = ((size_t) screen_lines(SP_PARM) + 1) * 4;
+    (void) SP_PARM;
+
+    if ((buf = typeMalloc(char, want)) != 0) {
+	int n;
+
+	*buf = '\0';
+	for (n = 0; n < screen_lines(SP_PARM); n++)
+	    _nc_SPRINTF(buf + strlen(buf),
+			_nc_SLIMIT(want - strlen(buf))
+			" %02d", OLDNUM(SP_PARM, n));
+	TR(TRACE_UPDATE | TRACE_MOVE, ("virt %s", buf));
+	free(buf);
+    }
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(void)
+_nc_linedump(void)
+{
+    NCURSES_SP_NAME(_nc_linedump) (CURRENT_SCREEN);
+}
+#endif
+
+#endif /* defined(TRACE) || defined(SCROLLDEBUG) */
+
+#ifdef SCROLLDEBUG
+
+int
+main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED)
+{
+    char line[BUFSIZ], *st;
+
+#ifdef TRACE
+    _nc_tracing = TRACE_MOVE;
+#endif
+    for (;;) {
+	int n;
+
+	for (n = 0; n < screen_lines(sp); n++)
+	    oldnums[n] = _NEWINDEX;
+
+	/* grab the test vector */
+	if (fgets(line, sizeof(line), stdin) == (char *) NULL)
+	    exit(EXIT_SUCCESS);
+
+	/* parse it */
+	n = 0;
+	if (line[0] == '#') {
+	    (void) fputs(line, stderr);
+	    continue;
+	}
+	st = strtok(line, " ");
+	do {
+	    oldnums[n++] = atoi(st);
+	} while
+	    ((st = strtok((char *) NULL, " ")) != 0);
+
+	/* display it */
+	(void) fputs("Initial input:\n", stderr);
+	_nc_linedump();
+
+	_nc_scroll_optimize();
+    }
+}
+
+#endif /* SCROLLDEBUG */
+
+/* hardscroll.c ends here */
diff --git a/ncurses/tty/hashmap.c b/ncurses/tty/hashmap.c
new file mode 100644
index 0000000..3f124c9
--- /dev/null
+++ b/ncurses/tty/hashmap.c
@@ -0,0 +1,592 @@
+/****************************************************************************
+ * Copyright 2019,2020 Thomas E. Dickey                                     *
+ * Copyright 1998-2015,2016 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ ****************************************************************************/
+
+/******************************************************************************
+
+NAME
+   hashmap.c -- fill in scramble vector based on text hashes
+
+SYNOPSIS
+   void _nc_hash_map(void)
+
+DESCRIPTION:
+   This code attempts to recognize pairs of old and new lines in the physical
+and virtual screens.  When a line pair is recognized, the old line index is
+placed in the oldindex member of the virtual screen line, to be used by the
+vertical-motion optimizer portion of the update logic (see hardscroll.c).
+
+   Line pairs are recognized by applying a modified Heckel's algorithm,
+sped up by hashing.  If a line hash is unique in both screens, those
+lines must be a pair. Then if the lines just before or after the pair
+are the same or similar, they are a pair too.
+
+   We don't worry about false pairs produced by hash collisions, on the
+assumption that such cases are rare and will only make the latter stages
+of update less efficient, not introduce errors.
+
+HOW TO TEST THIS:
+
+Use the following production:
+
+hashmap: hashmap.c
+	$(CC) -g -DHASHDEBUG hashmap.c hardscroll.c ../objects/lib_trace.o -o hashmap
+
+AUTHOR
+    Eric S. Raymond <esr@snark.thyrsus.com>, May 1996
+    Bug fixes and improvements by Alexander V. Lukyanov <lav@yars.free.net>, 1997
+
+*****************************************************************************/
+
+#include <curses.priv.h>
+
+#ifndef CUR
+#define CUR SP_TERMTYPE
+#endif
+
+MODULE_ID("$Id: hashmap.c,v 1.69 2020/05/31 17:50:48 tom Exp $")
+
+#ifdef HASHDEBUG
+
+# define _tracef	printf
+# undef TR
+# ifdef TRACE
+# define TR(n, a)	if (_nc_tracing & (n)) { _tracef a ; putchar('\n'); }
+# else
+# define TR(n, a)	{ _tracef a ; putchar('\n'); }
+# endif
+# undef screen_lines
+# define screen_lines(sp) MAXLINES
+# define TEXTWIDTH(sp)	1
+static int oldnums[MAXLINES], reallines[MAXLINES];
+static NCURSES_CH_T oldtext[MAXLINES][TEXTWIDTH(sp)];
+static NCURSES_CH_T newtext[MAXLINES][TEXTWIDTH(sp)];
+# define OLDNUM(sp,n)	oldnums[n]
+# define OLDTEXT(sp,n)	oldtext[n]
+# define NEWTEXT(sp,m)	newtext[m]
+# define PENDING(sp,n)  1
+
+#else /* !HASHDEBUG */
+
+# define OLDNUM(sp,n)	(sp)->_oldnum_list[n]
+# define OLDTEXT(sp,n)	CurScreen(sp)->_line[n].text
+# define NEWTEXT(sp,m)	NewScreen(sp)->_line[m].text
+# define TEXTWIDTH(sp)	(CurScreen(sp)->_maxx + 1)
+# define PENDING(sp,n)  (NewScreen(sp)->_line[n].firstchar != _NOCHANGE)
+
+#endif /* !HASHDEBUG */
+
+#define oldhash(sp)	((sp)->oldhash)
+#define newhash(sp)	((sp)->newhash)
+#define hashtab(sp)	((sp)->hashtab)
+#define lines_alloc(sp)	((sp)->hashtab_len)
+
+#if USE_WIDEC_SUPPORT
+#define HASH_VAL(ch) (ch.chars[0])
+#else
+#define HASH_VAL(ch) (ch)
+#endif
+
+static const NCURSES_CH_T blankchar = NewChar(BLANK_TEXT);
+
+static NCURSES_INLINE unsigned long
+hash(SCREEN *sp, NCURSES_CH_T *text)
+{
+    int i;
+    NCURSES_CH_T ch;
+    unsigned long result = 0;
+    (void) sp;
+
+    for (i = TEXTWIDTH(sp); i > 0; i--) {
+	ch = *text++;
+	result += (result << 5) + (unsigned long) HASH_VAL(ch);
+    }
+    return result;
+}
+
+/* approximate update cost */
+static int
+update_cost(SCREEN *sp, NCURSES_CH_T *from, NCURSES_CH_T *to)
+{
+    int cost = 0;
+    int i;
+    (void) sp;
+
+    for (i = TEXTWIDTH(sp); i > 0; i--, from++, to++)
+	if (!(CharEq(*from, *to)))
+	    cost++;
+
+    return cost;
+}
+
+static int
+update_cost_from_blank(SCREEN *sp, NCURSES_CH_T *to)
+{
+    int cost = 0;
+    int i;
+    NCURSES_CH_T blank = blankchar;
+    (void) sp;
+
+    if (back_color_erase)
+	SetPair(blank, GetPair(stdscr->_nc_bkgd));
+
+    for (i = TEXTWIDTH(sp); i > 0; i--, to++)
+	if (!(CharEq(blank, *to)))
+	    cost++;
+
+    return cost;
+}
+
+/*
+ * Returns true when moving line 'from' to line 'to' seems to be cost
+ * effective. 'blank' indicates whether the line 'to' would become blank.
+ */
+static NCURSES_INLINE bool
+cost_effective(SCREEN *sp, const int from, const int to, const int blank)
+{
+    int new_from;
+
+    if (from == to)
+	return FALSE;
+
+    new_from = OLDNUM(sp, from);
+    if (new_from == _NEWINDEX)
+	new_from = from;
+
+    /*
+     * On the left side of >= is the cost before moving;
+     * on the right side -- cost after moving.
+     */
+    return (((blank ? update_cost_from_blank(sp, NEWTEXT(sp, to))
+	      : update_cost(sp, OLDTEXT(sp, to), NEWTEXT(sp, to)))
+	     + update_cost(sp, OLDTEXT(sp, new_from), NEWTEXT(sp, from)))
+	    >= ((new_from == from ? update_cost_from_blank(sp, NEWTEXT(sp, from))
+		 : update_cost(sp, OLDTEXT(sp, new_from), NEWTEXT(sp, from)))
+		+ update_cost(sp, OLDTEXT(sp, from), NEWTEXT(sp, to))))
+	? TRUE : FALSE;
+}
+
+static void
+grow_hunks(SCREEN *sp)
+{
+    int back_limit;		/* limits for cells to fill */
+    int back_ref_limit;		/* limit for references */
+    int i;
+    int next_hunk;
+
+    /*
+     * This is tricky part.  We have unique pairs to use as anchors.
+     * Use these to deduce the presence of spans of identical lines.
+     */
+    back_limit = 0;
+    back_ref_limit = 0;
+
+    i = 0;
+    while (i < screen_lines(sp) && OLDNUM(sp, i) == _NEWINDEX)
+	i++;
+    for (; i < screen_lines(sp); i = next_hunk) {
+	int forward_limit;
+	int forward_ref_limit;
+	int end;
+	int start = i;
+	int shift = OLDNUM(sp, i) - i;
+
+	/* get forward limit */
+	i = start + 1;
+	while (i < screen_lines(sp)
+	       && OLDNUM(sp, i) != _NEWINDEX
+	       && OLDNUM(sp, i) - i == shift)
+	    i++;
+	end = i;
+	while (i < screen_lines(sp) && OLDNUM(sp, i) == _NEWINDEX)
+	    i++;
+	next_hunk = i;
+	forward_limit = i;
+	if (i >= screen_lines(sp) || OLDNUM(sp, i) >= i)
+	    forward_ref_limit = i;
+	else
+	    forward_ref_limit = OLDNUM(sp, i);
+
+	i = start - 1;
+	/* grow back */
+	if (shift < 0)
+	    back_limit = back_ref_limit + (-shift);
+	while (i >= back_limit) {
+	    if (newhash(sp)[i] == oldhash(sp)[i + shift]
+		|| cost_effective(sp, i + shift, i, shift < 0)) {
+		OLDNUM(sp, i) = i + shift;
+		TR(TRACE_UPDATE | TRACE_MOVE,
+		   ("connected new line %d to old line %d (backward continuation)",
+		    i, i + shift));
+	    } else {
+		TR(TRACE_UPDATE | TRACE_MOVE,
+		   ("not connecting new line %d to old line %d (backward continuation)",
+		    i, i + shift));
+		break;
+	    }
+	    i--;
+	}
+
+	i = end;
+	/* grow forward */
+	if (shift > 0)
+	    forward_limit = forward_ref_limit - shift;
+	while (i < forward_limit) {
+	    if (newhash(sp)[i] == oldhash(sp)[i + shift]
+		|| cost_effective(sp, i + shift, i, shift > 0)) {
+		OLDNUM(sp, i) = i + shift;
+		TR(TRACE_UPDATE | TRACE_MOVE,
+		   ("connected new line %d to old line %d (forward continuation)",
+		    i, i + shift));
+	    } else {
+		TR(TRACE_UPDATE | TRACE_MOVE,
+		   ("not connecting new line %d to old line %d (forward continuation)",
+		    i, i + shift));
+		break;
+	    }
+	    i++;
+	}
+
+	back_ref_limit = back_limit = i;
+	if (shift > 0)
+	    back_ref_limit += shift;
+    }
+}
+
+NCURSES_EXPORT(void)
+NCURSES_SP_NAME(_nc_hash_map) (NCURSES_SP_DCL0)
+{
+    HASHMAP *hsp;
+    register int i;
+
+    if (screen_lines(SP_PARM) > lines_alloc(SP_PARM)) {
+	if (hashtab(SP_PARM))
+	    free(hashtab(SP_PARM));
+	hashtab(SP_PARM) = typeMalloc(HASHMAP,
+				      ((size_t) screen_lines(SP_PARM) + 1) * 2);
+	if (!hashtab(SP_PARM)) {
+	    if (oldhash(SP_PARM)) {
+		FreeAndNull(oldhash(SP_PARM));
+	    }
+	    lines_alloc(SP_PARM) = 0;
+	    return;
+	}
+	lines_alloc(SP_PARM) = screen_lines(SP_PARM);
+    }
+
+    if (oldhash(SP_PARM) && newhash(SP_PARM)) {
+	/* re-hash only changed lines */
+	for (i = 0; i < screen_lines(SP_PARM); i++) {
+	    if (PENDING(SP_PARM, i))
+		newhash(SP_PARM)[i] = hash(SP_PARM, NEWTEXT(SP_PARM, i));
+	}
+    } else {
+	/* re-hash all */
+	if (oldhash(SP_PARM) == 0)
+	    oldhash(SP_PARM) = typeCalloc(unsigned long,
+					    (size_t) screen_lines(SP_PARM));
+	if (newhash(SP_PARM) == 0)
+	    newhash(SP_PARM) = typeCalloc(unsigned long,
+					    (size_t) screen_lines(SP_PARM));
+	if (!oldhash(SP_PARM) || !newhash(SP_PARM))
+	    return;		/* malloc failure */
+	for (i = 0; i < screen_lines(SP_PARM); i++) {
+	    newhash(SP_PARM)[i] = hash(SP_PARM, NEWTEXT(SP_PARM, i));
+	    oldhash(SP_PARM)[i] = hash(SP_PARM, OLDTEXT(SP_PARM, i));
+	}
+    }
+
+#ifdef HASH_VERIFY
+    for (i = 0; i < screen_lines(SP_PARM); i++) {
+	if (newhash(SP_PARM)[i] != hash(SP_PARM, NEWTEXT(SP_PARM, i)))
+	    fprintf(stderr, "error in newhash[%d]\n", i);
+	if (oldhash(SP_PARM)[i] != hash(SP_PARM, OLDTEXT(SP_PARM, i)))
+	    fprintf(stderr, "error in oldhash[%d]\n", i);
+    }
+#endif
+
+    /*
+     * Set up and count line-hash values.
+     */
+    memset(hashtab(SP_PARM), '\0',
+	   sizeof(*(hashtab(SP_PARM)))
+	   * ((size_t) screen_lines(SP_PARM) + 1) * 2);
+    for (i = 0; i < screen_lines(SP_PARM); i++) {
+	unsigned long hashval = oldhash(SP_PARM)[i];
+
+	for (hsp = hashtab(SP_PARM); hsp->hashval; hsp++)
+	    if (hsp->hashval == hashval)
+		break;
+	hsp->hashval = hashval;	/* in case this is a new entry */
+	hsp->oldcount++;
+	hsp->oldindex = i;
+    }
+    for (i = 0; i < screen_lines(SP_PARM); i++) {
+	unsigned long hashval = newhash(SP_PARM)[i];
+
+	for (hsp = hashtab(SP_PARM); hsp->hashval; hsp++)
+	    if (hsp->hashval == hashval)
+		break;
+	hsp->hashval = hashval;	/* in case this is a new entry */
+	hsp->newcount++;
+	hsp->newindex = i;
+
+	OLDNUM(SP_PARM, i) = _NEWINDEX;		/* initialize old indices array */
+    }
+
+    /*
+     * Mark line pairs corresponding to unique hash pairs.
+     *
+     * We don't mark lines with offset 0, because it can make fail
+     * extending hunks by cost_effective. Otherwise, it does not
+     * have any side effects.
+     */
+    for (hsp = hashtab(SP_PARM); hsp->hashval; hsp++)
+	if (hsp->oldcount == 1 && hsp->newcount == 1
+	    && hsp->oldindex != hsp->newindex) {
+	    TR(TRACE_UPDATE | TRACE_MOVE,
+	       ("new line %d is hash-identical to old line %d (unique)",
+		hsp->newindex, hsp->oldindex));
+	    OLDNUM(SP_PARM, hsp->newindex) = hsp->oldindex;
+	}
+
+    grow_hunks(SP_PARM);
+
+    /*
+     * Eliminate bad or impossible shifts -- this includes removing
+     * those hunks which could not grow because of conflicts, as well
+     * those which are to be moved too far, they are likely to destroy
+     * more than carry.
+     */
+    for (i = 0; i < screen_lines(SP_PARM);) {
+	int start, shift, size;
+
+	while (i < screen_lines(SP_PARM) && OLDNUM(SP_PARM, i) == _NEWINDEX)
+	    i++;
+	if (i >= screen_lines(SP_PARM))
+	    break;
+	start = i;
+	shift = OLDNUM(SP_PARM, i) - i;
+	i++;
+	while (i < screen_lines(SP_PARM)
+	       && OLDNUM(SP_PARM, i) != _NEWINDEX
+	       && OLDNUM(SP_PARM, i) - i == shift)
+	    i++;
+	size = i - start;
+	if (size < 3 || size + min(size / 8, 2) < abs(shift)) {
+	    while (start < i) {
+		OLDNUM(SP_PARM, start) = _NEWINDEX;
+		start++;
+	    }
+	}
+    }
+
+    /* After clearing invalid hunks, try grow the rest. */
+    grow_hunks(SP_PARM);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(void)
+_nc_hash_map(void)
+{
+    NCURSES_SP_NAME(_nc_hash_map) (CURRENT_SCREEN);
+}
+#endif
+
+NCURSES_EXPORT(void)
+NCURSES_SP_NAME(_nc_make_oldhash) (NCURSES_SP_DCLx int i)
+{
+    if (oldhash(SP_PARM))
+	oldhash(SP_PARM)[i] = hash(SP_PARM, OLDTEXT(SP_PARM, i));
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(void)
+_nc_make_oldhash(int i)
+{
+    NCURSES_SP_NAME(_nc_make_oldhash) (CURRENT_SCREEN, i);
+}
+#endif
+
+NCURSES_EXPORT(void)
+NCURSES_SP_NAME(_nc_scroll_oldhash) (NCURSES_SP_DCLx int n, int top, int bot)
+{
+    size_t size;
+    int i;
+
+    if (!oldhash(SP_PARM))
+	return;
+
+    size = sizeof(*(oldhash(SP_PARM))) * (size_t) (bot - top + 1 - abs(n));
+    if (n > 0) {
+	memmove(oldhash(SP_PARM) + top, oldhash(SP_PARM) + top + n, size);
+	for (i = bot; i > bot - n; i--)
+	    oldhash(SP_PARM)[i] = hash(SP_PARM, OLDTEXT(SP_PARM, i));
+    } else {
+	memmove(oldhash(SP_PARM) + top - n, oldhash(SP_PARM) + top, size);
+	for (i = top; i < top - n; i++)
+	    oldhash(SP_PARM)[i] = hash(SP_PARM, OLDTEXT(SP_PARM, i));
+    }
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(void)
+_nc_scroll_oldhash(int n, int top, int bot)
+{
+    NCURSES_SP_NAME(_nc_scroll_oldhash) (CURRENT_SCREEN, n, top, bot);
+}
+#endif
+
+#ifdef HASHDEBUG
+static void
+usage(void)
+{
+    static const char *table[] =
+    {
+	"hashmap test-driver",
+	"",
+	"#  comment",
+	"l  get initial line number vector",
+	"n  use following letters as text of new lines",
+	"o  use following letters as text of old lines",
+	"d  dump state of test arrays",
+	"h  apply hash mapper and see scroll optimization",
+	"?  this message"
+    };
+    size_t n;
+    for (n = 0; n < sizeof(table) / sizeof(table[0]); n++)
+	fprintf(stderr, "%s\n", table[n]);
+}
+
+int
+main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED)
+{
+    char line[BUFSIZ], *st;
+    int n;
+
+    if (setupterm(NULL, fileno(stdout), (int *) 0) == ERR)
+	return EXIT_FAILURE;
+    (void) _nc_alloc_screen();
+
+    for (n = 0; n < screen_lines(sp); n++) {
+	reallines[n] = n;
+	oldnums[n] = _NEWINDEX;
+	CharOf(oldtext[n][0]) = CharOf(newtext[n][0]) = '.';
+    }
+
+    if (NC_ISATTY(fileno(stdin)))
+	usage();
+
+#ifdef TRACE
+    _nc_tracing = TRACE_MOVE;
+#endif
+    for (;;) {
+	/* grab a test command */
+	if (fgets(line, sizeof(line), stdin) == (char *) NULL)
+	    break;
+
+	switch (line[0]) {
+	case '#':		/* comment */
+	    (void) fputs(line, stderr);
+	    break;
+
+	case 'l':		/* get initial line number vector */
+	    for (n = 0; n < screen_lines(sp); n++) {
+		reallines[n] = n;
+		oldnums[n] = _NEWINDEX;
+	    }
+	    n = 0;
+	    st = strtok(line, " ");
+	    do {
+		oldnums[n++] = atoi(st);
+	    } while
+		((st = strtok((char *) NULL, " ")) != 0);
+	    break;
+
+	case 'n':		/* use following letters as text of new lines */
+	    for (n = 0; n < screen_lines(sp); n++)
+		CharOf(newtext[n][0]) = '.';
+	    for (n = 0; n < screen_lines(sp); n++)
+		if (line[n + 1] == '\n')
+		    break;
+		else
+		    CharOf(newtext[n][0]) = line[n + 1];
+	    break;
+
+	case 'o':		/* use following letters as text of old lines */
+	    for (n = 0; n < screen_lines(sp); n++)
+		CharOf(oldtext[n][0]) = '.';
+	    for (n = 0; n < screen_lines(sp); n++)
+		if (line[n + 1] == '\n')
+		    break;
+		else
+		    CharOf(oldtext[n][0]) = line[n + 1];
+	    break;
+
+	case 'd':		/* dump state of test arrays */
+#ifdef TRACE
+	    _nc_linedump();
+#endif
+	    (void) fputs("Old lines: [", stdout);
+	    for (n = 0; n < screen_lines(sp); n++)
+		putchar(CharOf(oldtext[n][0]));
+	    putchar(']');
+	    putchar('\n');
+	    (void) fputs("New lines: [", stdout);
+	    for (n = 0; n < screen_lines(sp); n++)
+		putchar(CharOf(newtext[n][0]));
+	    putchar(']');
+	    putchar('\n');
+	    break;
+
+	case 'h':		/* apply hash mapper and see scroll optimization */
+	    _nc_hash_map();
+	    (void) fputs("Result:\n", stderr);
+#ifdef TRACE
+	    _nc_linedump();
+#endif
+	    _nc_scroll_optimize();
+	    (void) fputs("Done.\n", stderr);
+	    break;
+	default:
+	case '?':
+	    usage();
+	    break;
+	}
+    }
+    exit_curses(EXIT_SUCCESS);
+}
+
+#endif /* HASHDEBUG */
+
+/* hashmap.c ends here */
diff --git a/ncurses/tty/lib_mvcur.c b/ncurses/tty/lib_mvcur.c
new file mode 100644
index 0000000..ba3ee08
--- /dev/null
+++ b/ncurses/tty/lib_mvcur.c
@@ -0,0 +1,1416 @@
+/****************************************************************************
+ * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ *     and: Juergen Pfeifer                         2009                    *
+ ****************************************************************************/
+
+/*
+**	lib_mvcur.c
+**
+**	The routines for moving the physical cursor and scrolling:
+**
+**		void _nc_mvcur_init(void)
+**
+**		void _nc_mvcur_resume(void)
+**
+**		int mvcur(int old_y, int old_x, int new_y, int new_x)
+**
+**		void _nc_mvcur_wrap(void)
+**
+** Comparisons with older movement optimizers:
+**    SVr3 curses mvcur() can't use cursor_to_ll or auto_left_margin.
+**    4.4BSD curses can't use cuu/cud/cuf/cub/hpa/vpa/tab/cbt for local
+** motions.  It doesn't use tactics based on auto_left_margin.  Weirdly
+** enough, it doesn't use its own hardware-scrolling routine to scroll up
+** destination lines for out-of-bounds addresses!
+**    old ncurses optimizer: less accurate cost computations (in fact,
+** it was broken and had to be commented out!).
+**
+** Compile with -DMAIN to build an interactive tester/timer for the movement
+** optimizer.  You can use it to investigate the optimizer's behavior.
+** You can also use it for tuning the formulas used to determine whether
+** or not full optimization is attempted.
+**
+** This code has a nasty tendency to find bugs in terminfo entries, because it
+** exercises the non-cup movement capabilities heavily.  If you think you've
+** found a bug, try deleting subsets of the following capabilities (arranged
+** in decreasing order of suspiciousness): it, tab, cbt, hpa, vpa, cuu, cud,
+** cuf, cub, cuu1, cud1, cuf1, cub1.  It may be that one or more are wrong.
+**
+** Note: you should expect this code to look like a resource hog in a profile.
+** That's because it does a lot of I/O, through the tputs() calls.  The I/O
+** cost swamps the computation overhead (and as machines get faster, this
+** will become even more true).  Comments in the test exerciser at the end
+** go into detail about tuning and how you can gauge the optimizer's
+** effectiveness.
+**/
+
+/****************************************************************************
+ *
+ * Constants and macros for optimizer tuning.
+ *
+ ****************************************************************************/
+
+/*
+ * The average overhead of a full optimization computation in character
+ * transmission times.  If it is too high, the algorithm will be a bit
+ * over-biased toward using cup rather than local motions; if it is too
+ * low, the algorithm may spend more time than is strictly optimal
+ * looking for non-cup motions.  Profile the optimizer using the `t'
+ * command of the exerciser (see below), and round to the nearest integer.
+ *
+ * Yes, I (esr) thought about computing expected overhead dynamically, say
+ * by derivation from a running average of optimizer times.  But the
+ * whole point of this optimization is to *decrease* the frequency of
+ * system calls. :-)
+ */
+#define COMPUTE_OVERHEAD	1	/* I use a 90MHz Pentium @ 9.6Kbps */
+
+/*
+ * LONG_DIST is the distance we consider to be just as costly to move over as a
+ * cup sequence is to emit.  In other words, it is the length of a cup sequence
+ * adjusted for average computation overhead.  The magic number is the length
+ * of "\033[yy;xxH", the typical cup sequence these days.
+ */
+#define LONG_DIST		(8 - COMPUTE_OVERHEAD)
+
+/*
+ * Tell whether a motion is optimizable by local motions.  Needs to be cheap to
+ * compute. In general, all the fast moves go to either the right or left edge
+ * of the screen.  So any motion to a location that is (a) further away than
+ * LONG_DIST and (b) further inward from the right or left edge than LONG_DIST,
+ * we'll consider nonlocal.
+ */
+#define NOT_LOCAL(sp, fy, fx, ty, tx)	((tx > LONG_DIST) \
+		 && (tx < screen_columns(sp) - 1 - LONG_DIST) \
+		 && (abs(ty-fy) + abs(tx-fx) > LONG_DIST))
+
+/****************************************************************************
+ *
+ * External interfaces
+ *
+ ****************************************************************************/
+
+/*
+ * For this code to work OK, the following components must live in the
+ * screen structure:
+ *
+ *	int		_char_padding;	// cost of character put
+ *	int		_cr_cost;	// cost of (carriage_return)
+ *	int		_cup_cost;	// cost of (cursor_address)
+ *	int		_home_cost;	// cost of (cursor_home)
+ *	int		_ll_cost;	// cost of (cursor_to_ll)
+ *#if USE_HARD_TABS
+ *	int		_ht_cost;	// cost of (tab)
+ *	int		_cbt_cost;	// cost of (back_tab)
+ *#endif USE_HARD_TABS
+ *	int		_cub1_cost;	// cost of (cursor_left)
+ *	int		_cuf1_cost;	// cost of (cursor_right)
+ *	int		_cud1_cost;	// cost of (cursor_down)
+ *	int		_cuu1_cost;	// cost of (cursor_up)
+ *	int		_cub_cost;	// cost of (parm_cursor_left)
+ *	int		_cuf_cost;	// cost of (parm_cursor_right)
+ *	int		_cud_cost;	// cost of (parm_cursor_down)
+ *	int		_cuu_cost;	// cost of (parm_cursor_up)
+ *	int		_hpa_cost;	// cost of (column_address)
+ *	int		_vpa_cost;	// cost of (row_address)
+ *	int		_ech_cost;	// cost of (erase_chars)
+ *	int		_rep_cost;	// cost of (repeat_char)
+ *
+ * The USE_HARD_TABS switch controls whether it is reliable to use tab/backtabs
+ * for local motions.  On many systems, it is not, due to uncertainties about
+ * tab delays and whether or not tabs will be expanded in raw mode.  If you
+ * have parm_right_cursor, tab motions don't win you a lot anyhow.
+ */
+
+#include <curses.priv.h>
+#include <ctype.h>
+
+#ifndef CUR
+#define CUR SP_TERMTYPE
+#endif
+
+MODULE_ID("$Id: lib_mvcur.c,v 1.157 2022/08/20 18:28:58 tom Exp $")
+
+#define WANT_CHAR(sp, y, x) NewScreen(sp)->_line[y].text[x]	/* desired state */
+
+#if NCURSES_SP_FUNCS
+#define BAUDRATE(sp)	sp->_term->_baudrate	/* bits per second */
+#else
+#define BAUDRATE(sp)	cur_term->_baudrate	/* bits per second */
+#endif
+
+#if defined(MAIN) || defined(NCURSES_TEST)
+#include <sys/time.h>
+
+static bool profiling = FALSE;
+static float diff;
+#endif /* MAIN */
+
+#undef NCURSES_OUTC_FUNC
+#define NCURSES_OUTC_FUNC myOutCh
+
+#define OPT_SIZE 512
+
+static int normalized_cost(NCURSES_SP_DCLx const char *const cap, int affcnt);
+
+/****************************************************************************
+ *
+ * Initialization/wrapup (including cost pre-computation)
+ *
+ ****************************************************************************/
+
+#ifdef TRACE
+static int
+trace_cost_of(NCURSES_SP_DCLx const char *capname, const char *cap, int affcnt)
+{
+    int result = NCURSES_SP_NAME(_nc_msec_cost) (NCURSES_SP_ARGx cap, affcnt);
+    TR(TRACE_CHARPUT | TRACE_MOVE,
+       ("CostOf %s %d %s", capname, result, _nc_visbuf(cap)));
+    return result;
+}
+#define CostOf(cap,affcnt) trace_cost_of(NCURSES_SP_ARGx #cap, cap, affcnt)
+
+static int
+trace_normalized_cost(NCURSES_SP_DCLx const char *capname, const char *cap, int affcnt)
+{
+    int result = normalized_cost(NCURSES_SP_ARGx cap, affcnt);
+    TR(TRACE_CHARPUT | TRACE_MOVE,
+       ("NormalizedCost %s %d %s", capname, result, _nc_visbuf(cap)));
+    return result;
+}
+#define NormalizedCost(cap,affcnt) trace_normalized_cost(NCURSES_SP_ARGx #cap, cap, affcnt)
+
+#else
+
+#define CostOf(cap,affcnt) NCURSES_SP_NAME(_nc_msec_cost)(NCURSES_SP_ARGx cap, affcnt)
+#define NormalizedCost(cap,affcnt) normalized_cost(NCURSES_SP_ARGx cap, affcnt)
+
+#endif
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(_nc_msec_cost) (NCURSES_SP_DCLx const char *const cap, int affcnt)
+/* compute the cost of a given operation */
+{
+    if (cap == 0)
+	return (INFINITY);
+    else {
+	const char *cp;
+	float cum_cost = 0.0;
+
+	for (cp = cap; *cp; cp++) {
+	    /* extract padding, either mandatory or required */
+	    if (cp[0] == '$' && cp[1] == '<' && strchr(cp, '>')) {
+		float number = 0.0;
+
+		for (cp += 2; *cp != '>'; cp++) {
+		    if (isdigit(UChar(*cp)))
+			number = number * 10 + (float) (*cp - '0');
+		    else if (*cp == '*')
+			number *= (float) affcnt;
+		    else if (*cp == '.' && (*++cp != '>') && isdigit(UChar(*cp)))
+			number += (float) ((*cp - '0') / 10.0);
+		}
+
+#if NCURSES_NO_PADDING
+		if (!GetNoPadding(SP_PARM))
+#endif
+		    cum_cost += number * 10;
+	    } else if (SP_PARM) {
+		cum_cost += (float) SP_PARM->_char_padding;
+	    }
+	}
+
+	return ((int) cum_cost);
+    }
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+_nc_msec_cost(const char *const cap, int affcnt)
+{
+    return NCURSES_SP_NAME(_nc_msec_cost) (CURRENT_SCREEN, cap, affcnt);
+}
+#endif
+
+static int
+normalized_cost(NCURSES_SP_DCLx const char *const cap, int affcnt)
+/* compute the effective character-count for an operation (round up) */
+{
+    int cost = NCURSES_SP_NAME(_nc_msec_cost) (NCURSES_SP_ARGx cap, affcnt);
+    if (cost != INFINITY)
+	cost = (cost + SP_PARM->_char_padding - 1) / SP_PARM->_char_padding;
+    return cost;
+}
+
+static void
+reset_scroll_region(NCURSES_SP_DCL0)
+/* Set the scroll-region to a known state (the default) */
+{
+    if (change_scroll_region) {
+	NCURSES_PUTP2("change_scroll_region",
+		      TIPARM_2(change_scroll_region,
+			       0, screen_lines(SP_PARM) - 1));
+    }
+}
+
+NCURSES_EXPORT(void)
+NCURSES_SP_NAME(_nc_mvcur_resume) (NCURSES_SP_DCL0)
+/* what to do at initialization time and after each shellout */
+{
+    if (!SP_PARM || !IsTermInfo(SP_PARM))
+	return;
+
+    /* initialize screen for cursor access */
+    if (enter_ca_mode) {
+	NCURSES_PUTP2("enter_ca_mode", enter_ca_mode);
+    }
+
+    /*
+     * Doing this here rather than in _nc_mvcur_wrap() ensures that
+     * ncurses programs will see a reset scroll region even if a
+     * program that messed with it died ungracefully.
+     *
+     * This also undoes the effects of terminal init strings that assume
+     * they know the screen size.  This is useful when you're running
+     * a vt100 emulation through xterm.
+     */
+    reset_scroll_region(NCURSES_SP_ARG);
+    SP_PARM->_cursrow = SP_PARM->_curscol = -1;
+
+    /* restore cursor shape */
+    if (SP_PARM->_cursor != -1) {
+	int cursor = SP_PARM->_cursor;
+	SP_PARM->_cursor = -1;
+	NCURSES_SP_NAME(curs_set) (NCURSES_SP_ARGx cursor);
+    }
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(void)
+_nc_mvcur_resume(void)
+{
+    NCURSES_SP_NAME(_nc_mvcur_resume) (CURRENT_SCREEN);
+}
+#endif
+
+NCURSES_EXPORT(void)
+NCURSES_SP_NAME(_nc_mvcur_init) (NCURSES_SP_DCL0)
+/* initialize the cost structure */
+{
+    if (SP_PARM->_ofp && NC_ISATTY(fileno(SP_PARM->_ofp))) {
+	SP_PARM->_char_padding = ((BAUDBYTE * 1000 * 10)
+				  / (BAUDRATE(SP_PARM) > 0
+				     ? BAUDRATE(SP_PARM)
+				     : 9600));
+    } else {
+	SP_PARM->_char_padding = 1;	/* must be nonzero */
+    }
+    if (SP_PARM->_char_padding <= 0)
+	SP_PARM->_char_padding = 1;	/* must be nonzero */
+    TR(TRACE_CHARPUT | TRACE_MOVE, ("char_padding %d msecs", SP_PARM->_char_padding));
+
+    /* non-parameterized local-motion strings */
+    SP_PARM->_cr_cost = CostOf(carriage_return, 0);
+    SP_PARM->_home_cost = CostOf(cursor_home, 0);
+    SP_PARM->_ll_cost = CostOf(cursor_to_ll, 0);
+#if USE_HARD_TABS
+    if (getenv("NCURSES_NO_HARD_TABS") == 0
+	&& dest_tabs_magic_smso == 0
+	&& HasHardTabs()) {
+	SP_PARM->_ht_cost = CostOf(tab, 0);
+	SP_PARM->_cbt_cost = CostOf(back_tab, 0);
+    } else {
+	SP_PARM->_ht_cost = INFINITY;
+	SP_PARM->_cbt_cost = INFINITY;
+    }
+#endif /* USE_HARD_TABS */
+    SP_PARM->_cub1_cost = CostOf(cursor_left, 0);
+    SP_PARM->_cuf1_cost = CostOf(cursor_right, 0);
+    SP_PARM->_cud1_cost = CostOf(cursor_down, 0);
+    SP_PARM->_cuu1_cost = CostOf(cursor_up, 0);
+
+    SP_PARM->_smir_cost = CostOf(enter_insert_mode, 0);
+    SP_PARM->_rmir_cost = CostOf(exit_insert_mode, 0);
+    SP_PARM->_ip_cost = 0;
+    if (insert_padding) {
+	SP_PARM->_ip_cost = CostOf(insert_padding, 0);
+    }
+
+    /*
+     * Assumption: if the terminal has memory_relative addressing, the
+     * initialization strings or smcup will set single-page mode so we
+     * can treat it like absolute screen addressing.  This seems to be true
+     * for all cursor_mem_address terminal types in the terminfo database.
+     */
+    SP_PARM->_address_cursor = cursor_address ? cursor_address : cursor_mem_address;
+
+    /*
+     * Parametrized local-motion strings.  This static cost computation
+     * depends on the following assumptions:
+     *
+     * (1) They never have * padding.  In the entire master terminfo database
+     *     as of March 1995, only the obsolete Zenith Z-100 pc violates this.
+     *     (Proportional padding is found mainly in insert, delete and scroll
+     *     capabilities).
+     *
+     * (2) The average case of cup has two two-digit parameters.  Strictly,
+     *     the average case for a 24 * 80 screen has ((10*10*(1 + 1)) +
+     *     (14*10*(1 + 2)) + (10*70*(2 + 1)) + (14*70*4)) / (24*80) = 3.458
+     *     digits of parameters.  On a 25x80 screen the average is 3.6197.
+     *     On larger screens the value gets much closer to 4.
+     *
+     * (3) The average case of cub/cuf/hpa/ech/rep has 2 digits of parameters
+     *     (strictly, (((10 * 1) + (70 * 2)) / 80) = 1.8750).
+     *
+     * (4) The average case of cud/cuu/vpa has 2 digits of parameters
+     *     (strictly, (((10 * 1) + (14 * 2)) / 24) = 1.5833).
+     *
+     * All these averages depend on the assumption that all parameter values
+     * are equally probable.
+     */
+    SP_PARM->_cup_cost = CostOf(TIPARM_2(SP_PARM->_address_cursor, 23, 23), 1);
+    SP_PARM->_cub_cost = CostOf(TIPARM_1(parm_left_cursor, 23), 1);
+    SP_PARM->_cuf_cost = CostOf(TIPARM_1(parm_right_cursor, 23), 1);
+    SP_PARM->_cud_cost = CostOf(TIPARM_1(parm_down_cursor, 23), 1);
+    SP_PARM->_cuu_cost = CostOf(TIPARM_1(parm_up_cursor, 23), 1);
+    SP_PARM->_hpa_cost = CostOf(TIPARM_1(column_address, 23), 1);
+    SP_PARM->_vpa_cost = CostOf(TIPARM_1(row_address, 23), 1);
+
+    /* non-parameterized screen-update strings */
+    SP_PARM->_ed_cost = NormalizedCost(clr_eos, 1);
+    SP_PARM->_el_cost = NormalizedCost(clr_eol, 1);
+    SP_PARM->_el1_cost = NormalizedCost(clr_bol, 1);
+    SP_PARM->_dch1_cost = NormalizedCost(delete_character, 1);
+    SP_PARM->_ich1_cost = NormalizedCost(insert_character, 1);
+
+    /*
+     * If this is a bce-terminal, we want to bias the choice so we use clr_eol
+     * rather than spaces at the end of a line.
+     */
+    if (back_color_erase)
+	SP_PARM->_el_cost = 0;
+
+    /* parameterized screen-update strings */
+    SP_PARM->_dch_cost = NormalizedCost(TIPARM_1(parm_dch, 23), 1);
+    SP_PARM->_ich_cost = NormalizedCost(TIPARM_1(parm_ich, 23), 1);
+    SP_PARM->_ech_cost = NormalizedCost(TIPARM_1(erase_chars, 23), 1);
+    SP_PARM->_rep_cost = NormalizedCost(TIPARM_2(repeat_char, ' ', 23), 1);
+
+    SP_PARM->_cup_ch_cost = NormalizedCost(TIPARM_2(SP_PARM->_address_cursor,
+						    23, 23),
+					   1);
+    SP_PARM->_hpa_ch_cost = NormalizedCost(TIPARM_1(column_address, 23), 1);
+    SP_PARM->_cuf_ch_cost = NormalizedCost(TIPARM_1(parm_right_cursor, 23), 1);
+    SP_PARM->_inline_cost = min(SP_PARM->_cup_ch_cost,
+				min(SP_PARM->_hpa_ch_cost,
+				    SP_PARM->_cuf_ch_cost));
+
+    /*
+     * If save_cursor is used within enter_ca_mode, we should not use it for
+     * scrolling optimization, since the corresponding restore_cursor is not
+     * nested on the various terminals (vt100, xterm, etc.) which use this
+     * feature.
+     */
+    if (save_cursor != 0
+	&& enter_ca_mode != 0
+	&& strstr(enter_ca_mode, save_cursor) != 0) {
+	T(("...suppressed sc/rc capability due to conflict with smcup/rmcup"));
+	save_cursor = 0;
+	restore_cursor = 0;
+    }
+
+    /*
+     * A different, possibly better way to arrange this would be to set the
+     * SCREEN's _endwin at window initialization time and let this be called by
+     * doupdate's return-from-shellout code.
+     */
+    NCURSES_SP_NAME(_nc_mvcur_resume) (NCURSES_SP_ARG);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(void)
+_nc_mvcur_init(void)
+{
+    NCURSES_SP_NAME(_nc_mvcur_init) (CURRENT_SCREEN);
+}
+#endif
+
+NCURSES_EXPORT(void)
+NCURSES_SP_NAME(_nc_mvcur_wrap) (NCURSES_SP_DCL0)
+/* wrap up cursor-addressing mode */
+{
+    if (!SP_PARM || !IsTermInfo(SP_PARM))
+	return;
+
+    /* leave cursor at screen bottom */
+    TINFO_MVCUR(NCURSES_SP_ARGx -1, -1, screen_lines(SP_PARM) - 1, 0);
+
+    /* set cursor to normal mode */
+    if (SP_PARM->_cursor != -1) {
+	int cursor = SP_PARM->_cursor;
+	NCURSES_SP_NAME(curs_set) (NCURSES_SP_ARGx 1);
+	SP_PARM->_cursor = cursor;
+    }
+
+    if (exit_ca_mode) {
+	NCURSES_PUTP2("exit_ca_mode", exit_ca_mode);
+    }
+    /*
+     * Reset terminal's tab counter.  There's a long-time bug that
+     * if you exit a "curses" program such as vi or more, tab
+     * forward, and then backspace, the cursor doesn't go to the
+     * right place.  The problem is that the kernel counts the
+     * escape sequences that reset things as column positions.
+     * Utter a \r to reset this invisibly.
+     */
+    NCURSES_SP_NAME(_nc_outch) (NCURSES_SP_ARGx '\r');
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(void)
+_nc_mvcur_wrap(void)
+{
+    NCURSES_SP_NAME(_nc_mvcur_wrap) (CURRENT_SCREEN);
+}
+#endif
+
+/****************************************************************************
+ *
+ * Optimized cursor movement
+ *
+ ****************************************************************************/
+
+/*
+ * Perform repeated-append, returning cost
+ */
+static NCURSES_INLINE int
+repeated_append(string_desc * target, int total, int num, int repeat, const char *src)
+{
+    size_t need = (size_t) repeat * strlen(src);
+
+    if (need < target->s_size) {
+	while (repeat-- > 0) {
+	    if (_nc_safe_strcat(target, src)) {
+		total += num;
+	    } else {
+		total = INFINITY;
+		break;
+	    }
+	}
+    } else {
+	total = INFINITY;
+    }
+    return total;
+}
+
+#ifndef NO_OPTIMIZE
+#define NEXTTAB(fr)	(fr + init_tabs - (fr % init_tabs))
+
+/*
+ * Assume back_tab (CBT) does not wrap backwards at the left margin, return
+ * a negative value at that point to simplify the loop.
+ */
+#define LASTTAB(fr)	((fr > 0) ? ((fr - 1) / init_tabs) * init_tabs : -1)
+
+static int
+relative_move(NCURSES_SP_DCLx
+	      string_desc * target,
+	      int from_y,
+	      int from_x,
+	      int to_y,
+	      int to_x,
+	      int ovw)
+/* move via local motions (cuu/cuu1/cud/cud1/cub1/cub/cuf1/cuf/vpa/hpa) */
+{
+    string_desc save;
+    int n, vcost = 0, hcost = 0;
+
+    (void) _nc_str_copy(&save, target);
+
+    if (to_y != from_y) {
+	vcost = INFINITY;
+
+	if (row_address != 0
+	    && _nc_safe_strcat(target, TIPARM_1(row_address, to_y))) {
+	    vcost = SP_PARM->_vpa_cost;
+	}
+
+	if (to_y > from_y) {
+	    n = (to_y - from_y);
+
+	    if (parm_down_cursor
+		&& SP_PARM->_cud_cost < vcost
+		&& _nc_safe_strcat(_nc_str_copy(target, &save),
+				   TIPARM_1(parm_down_cursor, n))) {
+		vcost = SP_PARM->_cud_cost;
+	    }
+
+	    if (cursor_down
+		&& (*cursor_down != '\n')
+		&& (n * SP_PARM->_cud1_cost < vcost)) {
+		vcost = repeated_append(_nc_str_copy(target, &save), 0,
+					SP_PARM->_cud1_cost, n, cursor_down);
+	    }
+	} else {		/* (to_y < from_y) */
+	    n = (from_y - to_y);
+
+	    if (parm_up_cursor
+		&& SP_PARM->_cuu_cost < vcost
+		&& _nc_safe_strcat(_nc_str_copy(target, &save),
+				   TIPARM_1(parm_up_cursor, n))) {
+		vcost = SP_PARM->_cuu_cost;
+	    }
+
+	    if (cursor_up && (n * SP_PARM->_cuu1_cost < vcost)) {
+		vcost = repeated_append(_nc_str_copy(target, &save), 0,
+					SP_PARM->_cuu1_cost, n, cursor_up);
+	    }
+	}
+
+	if (vcost == INFINITY)
+	    return (INFINITY);
+    }
+
+    save = *target;
+
+    if (to_x != from_x) {
+	char str[OPT_SIZE];
+	string_desc check;
+
+	hcost = INFINITY;
+
+	if (column_address
+	    && _nc_safe_strcat(_nc_str_copy(target, &save),
+			       TIPARM_1(column_address, to_x))) {
+	    hcost = SP_PARM->_hpa_cost;
+	}
+
+	if (to_x > from_x) {
+	    n = to_x - from_x;
+
+	    if (parm_right_cursor
+		&& SP_PARM->_cuf_cost < hcost
+		&& _nc_safe_strcat(_nc_str_copy(target, &save),
+				   TIPARM_1(parm_right_cursor, n))) {
+		hcost = SP_PARM->_cuf_cost;
+	    }
+
+	    if (cursor_right) {
+		int lhcost = 0;
+
+		(void) _nc_str_init(&check, str, sizeof(str));
+
+#if USE_HARD_TABS
+		/* use hard tabs, if we have them, to do as much as possible */
+		if (init_tabs > 0 && tab) {
+		    int nxt, fr;
+
+		    for (fr = from_x; (nxt = NEXTTAB(fr)) <= to_x; fr = nxt) {
+			lhcost = repeated_append(&check, lhcost,
+						 SP_PARM->_ht_cost, 1, tab);
+			if (lhcost == INFINITY)
+			    break;
+		    }
+
+		    n = to_x - fr;
+		    from_x = fr;
+		}
+#endif /* USE_HARD_TABS */
+
+		if (n <= 0 || n >= (int) check.s_size)
+		    ovw = FALSE;
+#if BSD_TPUTS
+		/*
+		 * If we're allowing BSD-style padding in tputs, don't generate
+		 * a string with a leading digit.  Otherwise, that will be
+		 * interpreted as a padding value rather than sent to the
+		 * screen.
+		 */
+		if (ovw
+		    && n > 0
+		    && n < (int) check.s_size
+		    && vcost == 0
+		    && str[0] == '\0') {
+		    int wanted = CharOf(WANT_CHAR(SP_PARM, to_y, from_x));
+		    if (is8bits(wanted) && isdigit(wanted))
+			ovw = FALSE;
+		}
+#endif
+		/*
+		 * If we have no attribute changes, overwrite is cheaper.
+		 * Note: must suppress this by passing in ovw = FALSE whenever
+		 * WANT_CHAR would return invalid data.  In particular, this
+		 * is true between the time a hardware scroll has been done
+		 * and the time the structure WANT_CHAR would access has been
+		 * updated.
+		 */
+		if (ovw) {
+		    int i;
+
+		    for (i = 0; i < n; i++) {
+			NCURSES_CH_T ch = WANT_CHAR(SP_PARM, to_y, from_x + i);
+			if (!SameAttrOf(ch, SCREEN_ATTRS(SP_PARM))
+#if USE_WIDEC_SUPPORT
+			    || !Charable(ch)
+#endif
+			    ) {
+			    ovw = FALSE;
+			    break;
+			}
+		    }
+		}
+		if (ovw) {
+		    int i;
+
+		    for (i = 0; i < n; i++)
+			*check.s_tail++ = (char) CharOf(WANT_CHAR(SP_PARM, to_y,
+								  from_x + i));
+		    *check.s_tail = '\0';
+		    check.s_size -= (size_t) n;
+		    lhcost += n * SP_PARM->_char_padding;
+		} else {
+		    lhcost = repeated_append(&check, lhcost, SP_PARM->_cuf1_cost,
+					     n, cursor_right);
+		}
+
+		if (lhcost < hcost
+		    && _nc_safe_strcat(_nc_str_copy(target, &save), str)) {
+		    hcost = lhcost;
+		}
+	    }
+	} else {		/* (to_x < from_x) */
+	    n = from_x - to_x;
+
+	    if (parm_left_cursor
+		&& SP_PARM->_cub_cost < hcost
+		&& _nc_safe_strcat(_nc_str_copy(target, &save),
+				   TIPARM_1(parm_left_cursor, n))) {
+		hcost = SP_PARM->_cub_cost;
+	    }
+
+	    if (cursor_left) {
+		int lhcost = 0;
+
+		(void) _nc_str_init(&check, str, sizeof(str));
+
+#if USE_HARD_TABS
+		if (init_tabs > 0 && back_tab) {
+		    int nxt, fr;
+
+		    for (fr = from_x; (nxt = LASTTAB(fr)) >= to_x; fr = nxt) {
+			lhcost = repeated_append(&check, lhcost,
+						 SP_PARM->_cbt_cost,
+						 1, back_tab);
+			if (lhcost == INFINITY)
+			    break;
+		    }
+
+		    n = fr - to_x;
+		}
+#endif /* USE_HARD_TABS */
+
+		lhcost = repeated_append(&check, lhcost,
+					 SP_PARM->_cub1_cost,
+					 n, cursor_left);
+
+		if (lhcost < hcost
+		    && _nc_safe_strcat(_nc_str_copy(target, &save), str)) {
+		    hcost = lhcost;
+		}
+	    }
+	}
+
+	if (hcost == INFINITY)
+	    return (INFINITY);
+    }
+
+    return (vcost + hcost);
+}
+#endif /* !NO_OPTIMIZE */
+
+/*
+ * With the machinery set up above, it is conceivable that
+ * onscreen_mvcur could be modified into a recursive function that does
+ * an alpha-beta search of motion space, as though it were a chess
+ * move tree, with the weight function being boolean and the search
+ * depth equated to length of string.  However, this would jack up the
+ * computation cost a lot, especially on terminals without a cup
+ * capability constraining the search tree depth.  So we settle for
+ * the simpler method below.
+ */
+
+static NCURSES_INLINE int
+onscreen_mvcur(NCURSES_SP_DCLx
+	       int yold, int xold,
+	       int ynew, int xnew, int ovw,
+	       NCURSES_SP_OUTC myOutCh)
+/* onscreen move from (yold, xold) to (ynew, xnew) */
+{
+    string_desc result;
+    char buffer[OPT_SIZE];
+    int tactic = 0, newcost, usecost = INFINITY;
+    int t5_cr_cost;
+
+#if defined(MAIN) || defined(NCURSES_TEST)
+    struct timeval before, after;
+
+    gettimeofday(&before, NULL);
+#endif /* MAIN */
+
+#define NullResult _nc_str_null(&result, sizeof(buffer))
+#define InitResult _nc_str_init(&result, buffer, sizeof(buffer))
+
+    /* tactic #0: use direct cursor addressing */
+    if (_nc_safe_strcpy(InitResult, TIPARM_2(SP_PARM->_address_cursor,
+					     ynew, xnew))) {
+	tactic = 0;
+	usecost = SP_PARM->_cup_cost;
+
+#if defined(TRACE) || defined(NCURSES_TEST)
+	if (!(_nc_optimize_enable & OPTIMIZE_MVCUR))
+	    goto nonlocal;
+#endif /* TRACE */
+
+	/*
+	 * We may be able to tell in advance that the full optimization
+	 * will probably not be worth its overhead.  Also, don't try to
+	 * use local movement if the current attribute is anything but
+	 * A_NORMAL...there are just too many ways this can screw up
+	 * (like, say, local-movement \n getting mapped to some obscure
+	 * character because A_ALTCHARSET is on).
+	 */
+	if (yold == -1 || xold == -1 || NOT_LOCAL(SP_PARM, yold, xold, ynew, xnew)) {
+#if defined(MAIN) || defined(NCURSES_TEST)
+	    if (!profiling) {
+		(void) fputs("nonlocal\n", stderr);
+		goto nonlocal;	/* always run the optimizer if profiling */
+	    }
+#else
+	    goto nonlocal;
+#endif /* MAIN */
+	}
+    }
+#ifndef NO_OPTIMIZE
+    /* tactic #1: use local movement */
+    if (yold != -1 && xold != -1
+	&& ((newcost = relative_move(NCURSES_SP_ARGx
+				     NullResult,
+				     yold, xold,
+				     ynew, xnew, ovw)) != INFINITY)
+	&& newcost < usecost) {
+	tactic = 1;
+	usecost = newcost;
+    }
+
+    /* tactic #2: use carriage-return + local movement */
+    if (yold != -1 && carriage_return
+	&& ((newcost = relative_move(NCURSES_SP_ARGx
+				     NullResult,
+				     yold, 0,
+				     ynew, xnew, ovw)) != INFINITY)
+	&& SP_PARM->_cr_cost + newcost < usecost) {
+	tactic = 2;
+	usecost = SP_PARM->_cr_cost + newcost;
+    }
+
+    /* tactic #3: use home-cursor + local movement */
+    if (cursor_home
+	&& ((newcost = relative_move(NCURSES_SP_ARGx
+				     NullResult,
+				     0, 0,
+				     ynew, xnew, ovw)) != INFINITY)
+	&& SP_PARM->_home_cost + newcost < usecost) {
+	tactic = 3;
+	usecost = SP_PARM->_home_cost + newcost;
+    }
+
+    /* tactic #4: use home-down + local movement */
+    if (cursor_to_ll
+	&& ((newcost = relative_move(NCURSES_SP_ARGx
+				     NullResult,
+				     screen_lines(SP_PARM) - 1, 0,
+				     ynew, xnew, ovw)) != INFINITY)
+	&& SP_PARM->_ll_cost + newcost < usecost) {
+	tactic = 4;
+	usecost = SP_PARM->_ll_cost + newcost;
+    }
+
+    /*
+     * tactic #5: use left margin for wrap to right-hand side,
+     * unless strange wrap behavior indicated by xenl might hose us.
+     */
+    t5_cr_cost = (xold > 0 ? SP_PARM->_cr_cost : 0);
+    if (auto_left_margin && !eat_newline_glitch
+	&& yold > 0 && cursor_left
+	&& ((newcost = relative_move(NCURSES_SP_ARGx
+				     NullResult,
+				     yold - 1, screen_columns(SP_PARM) - 1,
+				     ynew, xnew, ovw)) != INFINITY)
+	&& t5_cr_cost + SP_PARM->_cub1_cost + newcost < usecost) {
+	tactic = 5;
+	usecost = t5_cr_cost + SP_PARM->_cub1_cost + newcost;
+    }
+
+    /*
+     * These cases are ordered by estimated relative frequency.
+     */
+    if (tactic)
+	InitResult;
+    switch (tactic) {
+    case 1:
+	(void) relative_move(NCURSES_SP_ARGx
+			     &result,
+			     yold, xold,
+			     ynew, xnew, ovw);
+	break;
+    case 2:
+	(void) _nc_safe_strcpy(&result, carriage_return);
+	(void) relative_move(NCURSES_SP_ARGx
+			     &result,
+			     yold, 0,
+			     ynew, xnew, ovw);
+	break;
+    case 3:
+	(void) _nc_safe_strcpy(&result, cursor_home);
+	(void) relative_move(NCURSES_SP_ARGx
+			     &result, 0, 0,
+			     ynew, xnew, ovw);
+	break;
+    case 4:
+	(void) _nc_safe_strcpy(&result, cursor_to_ll);
+	(void) relative_move(NCURSES_SP_ARGx
+			     &result,
+			     screen_lines(SP_PARM) - 1, 0,
+			     ynew, xnew, ovw);
+	break;
+    case 5:
+	if (xold > 0)
+	    (void) _nc_safe_strcat(&result, carriage_return);
+	(void) _nc_safe_strcat(&result, cursor_left);
+	(void) relative_move(NCURSES_SP_ARGx
+			     &result,
+			     yold - 1, screen_columns(SP_PARM) - 1,
+			     ynew, xnew, ovw);
+	break;
+    }
+#endif /* !NO_OPTIMIZE */
+
+  nonlocal:
+#if defined(MAIN) || defined(NCURSES_TEST)
+    gettimeofday(&after, NULL);
+    diff = after.tv_usec - before.tv_usec
+	+ (after.tv_sec - before.tv_sec) * 1000000;
+    if (!profiling)
+	(void) fprintf(stderr,
+		       "onscreen: %d microsec, %f 28.8Kbps char-equivalents\n",
+		       (int) diff, diff / 288);
+#endif /* MAIN */
+
+    if (usecost != INFINITY) {
+	TR(TRACE_MOVE, ("mvcur tactic %d", tactic));
+	TPUTS_TRACE("mvcur");
+	NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx
+				buffer, 1, myOutCh);
+	SP_PARM->_cursrow = ynew;
+	SP_PARM->_curscol = xnew;
+	return (OK);
+    } else
+	return (ERR);
+}
+
+/*
+ * optimized cursor move from (yold, xold) to (ynew, xnew)
+ */
+static int
+_nc_real_mvcur(NCURSES_SP_DCLx
+	       int yold, int xold,
+	       int ynew, int xnew,
+	       NCURSES_SP_OUTC myOutCh,
+	       int ovw)
+{
+    NCURSES_CH_T oldattr;
+    int code;
+
+    TR(TRACE_CALLS | TRACE_MOVE, (T_CALLED("_nc_real_mvcur(%p,%d,%d,%d,%d)"),
+				  (void *) SP_PARM, yold, xold, ynew, xnew));
+
+    if (SP_PARM == 0) {
+	code = ERR;
+    } else if (yold == ynew && xold == xnew) {
+	code = OK;
+    } else {
+
+	/*
+	 * Most work here is rounding for terminal boundaries getting the
+	 * column position implied by wraparound or the lack thereof and
+	 * rolling up the screen to get ynew on the screen.
+	 */
+	if (xnew >= screen_columns(SP_PARM)) {
+	    ynew += xnew / screen_columns(SP_PARM);
+	    xnew %= screen_columns(SP_PARM);
+	}
+
+	/*
+	 * Force restore even if msgr is on when we're in an alternate
+	 * character set -- these have a strong tendency to screw up the CR &
+	 * LF used for local character motions!
+	 */
+	oldattr = SCREEN_ATTRS(SP_PARM);
+	if ((AttrOf(oldattr) & A_ALTCHARSET)
+	    || (AttrOf(oldattr) && !move_standout_mode)) {
+	    TR(TRACE_CHARPUT, ("turning off (%#lx) %s before move",
+			       (unsigned long) AttrOf(oldattr),
+			       _traceattr(AttrOf(oldattr))));
+	    VIDPUTS(SP_PARM, A_NORMAL, 0);
+	}
+
+	if (xold >= screen_columns(SP_PARM)) {
+
+	    int l = (xold + 1) / screen_columns(SP_PARM);
+
+	    yold += l;
+	    if (yold >= screen_lines(SP_PARM))
+		l -= (yold - screen_lines(SP_PARM) - 1);
+
+	    if (l > 0) {
+		if (carriage_return) {
+		    NCURSES_PUTP2("carriage_return", carriage_return);
+		} else {
+		    myOutCh(NCURSES_SP_ARGx '\r');
+		}
+		xold = 0;
+
+		while (l > 0) {
+		    if (newline) {
+			NCURSES_PUTP2("newline", newline);
+		    } else {
+			myOutCh(NCURSES_SP_ARGx '\n');
+		    }
+		    l--;
+		}
+	    }
+	}
+
+	if (yold > screen_lines(SP_PARM) - 1)
+	    yold = screen_lines(SP_PARM) - 1;
+	if (ynew > screen_lines(SP_PARM) - 1)
+	    ynew = screen_lines(SP_PARM) - 1;
+
+	/* destination location is on screen now */
+	code = onscreen_mvcur(NCURSES_SP_ARGx yold, xold, ynew, xnew, ovw, myOutCh);
+
+	/*
+	 * Restore attributes if we disabled them before moving.
+	 */
+	if (!SameAttrOf(oldattr, SCREEN_ATTRS(SP_PARM))) {
+	    TR(TRACE_CHARPUT, ("turning on (%#lx) %s after move",
+			       (unsigned long) AttrOf(oldattr),
+			       _traceattr(AttrOf(oldattr))));
+	    VIDPUTS(SP_PARM, AttrOf(oldattr), GetPair(oldattr));
+	}
+    }
+    returnCode(code);
+}
+
+/*
+ * These entrypoints are used within the library.
+ */
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(_nc_mvcur) (NCURSES_SP_DCLx
+			    int yold, int xold,
+			    int ynew, int xnew)
+{
+    int rc;
+    rc = _nc_real_mvcur(NCURSES_SP_ARGx yold, xold, ynew, xnew,
+			NCURSES_SP_NAME(_nc_outch),
+			TRUE);
+    /*
+     * With the terminal-driver, we cannot distinguish between internal and
+     * external calls.  Flush the output if the screen has not been
+     * initialized, e.g., when used from low-level terminfo programs.
+     */
+    if ((SP_PARM != 0) && (SP_PARM->_endwin == ewInitial))
+	NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_ARG);
+    return rc;
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+_nc_mvcur(int yold, int xold,
+	  int ynew, int xnew)
+{
+    return NCURSES_SP_NAME(_nc_mvcur) (CURRENT_SCREEN, yold, xold, ynew, xnew);
+}
+#endif
+
+#if defined(USE_TERM_DRIVER)
+/*
+ * The terminal driver does not support the external "mvcur()".
+ */
+NCURSES_EXPORT(int)
+TINFO_MVCUR(NCURSES_SP_DCLx int yold, int xold, int ynew, int xnew)
+{
+    int rc;
+    rc = _nc_real_mvcur(NCURSES_SP_ARGx
+			yold, xold,
+			ynew, xnew,
+			NCURSES_SP_NAME(_nc_outch),
+			TRUE);
+    if ((SP_PARM != 0) && (SP_PARM->_endwin == ewInitial))
+	NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_ARG);
+    NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_ARG);
+    return rc;
+}
+
+#else /* !USE_TERM_DRIVER */
+
+/*
+ * These entrypoints support users of the library.
+ */
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(mvcur) (NCURSES_SP_DCLx int yold, int xold, int ynew,
+			int xnew)
+{
+    return _nc_real_mvcur(NCURSES_SP_ARGx
+			  yold, xold,
+			  ynew, xnew,
+			  NCURSES_SP_NAME(_nc_putchar),
+			  FALSE);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+mvcur(int yold, int xold, int ynew, int xnew)
+{
+    return NCURSES_SP_NAME(mvcur) (CURRENT_SCREEN, yold, xold, ynew, xnew);
+}
+#endif
+#endif /* USE_TERM_DRIVER */
+
+#if defined(TRACE) || defined(NCURSES_TEST)
+NCURSES_EXPORT_VAR(int) _nc_optimize_enable = OPTIMIZE_ALL;
+#endif
+
+#if defined(MAIN) || defined(NCURSES_TEST)
+/****************************************************************************
+ *
+ * Movement optimizer test code
+ *
+ ****************************************************************************/
+
+#include <tic.h>
+#include <dump_entry.h>
+#include <time.h>
+
+NCURSES_EXPORT_VAR(const char *) _nc_progname = "mvcur";
+
+static unsigned long xmits;
+
+/* these override lib_tputs.c */
+NCURSES_EXPORT(int)
+tputs(const char *string, int affcnt GCC_UNUSED, int (*outc) (int) GCC_UNUSED)
+/* stub tputs() that dumps sequences in a visible form */
+{
+    if (profiling)
+	xmits += strlen(string);
+    else
+	(void) fputs(_nc_visbuf(string), stdout);
+    return (OK);
+}
+
+NCURSES_EXPORT(int)
+putp(const char *string)
+{
+    return (tputs(string, 1, _nc_outch));
+}
+
+NCURSES_EXPORT(int)
+_nc_outch(int ch)
+{
+    putc(ch, stdout);
+    return OK;
+}
+
+NCURSES_EXPORT(int)
+delay_output(int ms GCC_UNUSED)
+{
+    return OK;
+}
+
+static char tname[PATH_MAX];
+
+static void
+load_term(void)
+{
+    (void) setupterm(tname, STDOUT_FILENO, NULL);
+}
+
+static int
+roll(int n)
+{
+    int i, j;
+
+    i = (RAND_MAX / n) * n;
+    while ((j = rand()) >= i)
+	continue;
+    return (j % n);
+}
+
+int
+main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED)
+{
+    _nc_STRCPY(tname, getenv("TERM"), sizeof(tname));
+    load_term();
+    _nc_setupscreen(lines, columns, stdout, FALSE, 0);
+    baudrate();
+
+    _nc_mvcur_init();
+
+    (void) puts("The mvcur tester.  Type ? for help");
+
+    fputs("smcup:", stdout);
+    putchar('\n');
+
+    for (;;) {
+	int fy, fx, ty, tx, n, i;
+	char buf[BUFSIZ], capname[BUFSIZ];
+
+	if (fputs("> ", stdout) == EOF)
+	    break;
+	if (fgets(buf, sizeof(buf), stdin) == 0)
+	    break;
+
+#define PUTS(s)   (void) puts(s)
+#define PUTF(s,t) (void) printf(s,t)
+	if (buf[0] == '?') {
+	    PUTS("?                -- display this help message");
+	    PUTS("fy fx ty tx      -- (4 numbers) display (fy,fx)->(ty,tx) move");
+	    PUTS("s[croll] n t b m -- display scrolling sequence");
+	    PUTF("r[eload]         -- reload terminal info for %s\n",
+		 termname());
+	    PUTS("l[oad] <term>    -- load terminal info for type <term>");
+	    PUTS("d[elete] <cap>   -- delete named capability");
+	    PUTS("i[nspect]        -- display terminal capabilities");
+	    PUTS("c[ost]           -- dump cursor-optimization cost table");
+	    PUTS("o[optimize]      -- toggle movement optimization");
+	    PUTS("t[orture] <num>  -- torture-test with <num> random moves");
+	    PUTS("q[uit]           -- quit the program");
+	} else if (sscanf(buf, "%d %d %d %d", &fy, &fx, &ty, &tx) == 4) {
+	    struct timeval before, after;
+
+	    putchar('"');
+
+	    gettimeofday(&before, NULL);
+	    mvcur(fy, fx, ty, tx);
+	    gettimeofday(&after, NULL);
+
+	    printf("\" (%ld msec)\n",
+		   (long) (after.tv_usec - before.tv_usec
+			   + (after.tv_sec - before.tv_sec)
+			   * 1000000));
+	} else if (sscanf(buf, "s %d %d %d %d", &fy, &fx, &ty, &tx) == 4) {
+	    struct timeval before, after;
+
+	    putchar('"');
+
+	    gettimeofday(&before, NULL);
+	    _nc_scrolln(fy, fx, ty, tx);
+	    gettimeofday(&after, NULL);
+
+	    printf("\" (%ld msec)\n",
+		   (long) (after.tv_usec - before.tv_usec + (after.tv_sec -
+							     before.tv_sec)
+			   * 1000000));
+	} else if (buf[0] == 'r') {
+	    _nc_STRCPY(tname, termname(), sizeof(tname));
+	    load_term();
+	} else if (sscanf(buf, "l %s", tname) == 1) {
+	    load_term();
+	} else if (sscanf(buf, "d %s", capname) == 1) {
+	    struct name_table_entry const *np = _nc_find_entry(capname,
+							       _nc_get_hash_table(FALSE));
+
+	    if (np == NULL)
+		(void) printf("No such capability as \"%s\"\n", capname);
+	    else {
+		switch (np->nte_type) {
+		case BOOLEAN:
+		    cur_term->type.Booleans[np->nte_index] = FALSE;
+		    (void)
+			printf("Boolean capability `%s' (%d) turned off.\n",
+			       np->nte_name, np->nte_index);
+		    break;
+
+		case NUMBER:
+		    cur_term->type.Numbers[np->nte_index] = ABSENT_NUMERIC;
+		    (void) printf("Number capability `%s' (%d) set to -1.\n",
+				  np->nte_name, np->nte_index);
+		    break;
+
+		case STRING:
+		    cur_term->type.Strings[np->nte_index] = ABSENT_STRING;
+		    (void) printf("String capability `%s' (%d) deleted.\n",
+				  np->nte_name, np->nte_index);
+		    break;
+		}
+	    }
+	} else if (buf[0] == 'i') {
+	    dump_init(NULL, F_TERMINFO, S_TERMINFO,
+		      FALSE, 70, 0, 0, FALSE, FALSE, 0);
+	    dump_entry(&TerminalType(cur_term), FALSE, TRUE, 0, 0);
+	    putchar('\n');
+	} else if (buf[0] == 'o') {
+	    if (_nc_optimize_enable & OPTIMIZE_MVCUR) {
+		_nc_optimize_enable &= ~OPTIMIZE_MVCUR;
+		(void) puts("Optimization is now off.");
+	    } else {
+		_nc_optimize_enable |= OPTIMIZE_MVCUR;
+		(void) puts("Optimization is now on.");
+	    }
+	}
+	/*
+	 * You can use the `t' test to profile and tune the movement
+	 * optimizer.  Use iteration values in three digits or more.
+	 * At above 5000 iterations the profile timing averages are stable
+	 * to within a millisecond or three.
+	 *
+	 * The `overhead' field of the report will help you pick a
+	 * COMPUTE_OVERHEAD figure appropriate for your processor and
+	 * expected line speed.  The `total estimated time' is
+	 * computation time plus a character-transmission time
+	 * estimate computed from the number of transmits and the baud
+	 * rate.
+	 *
+	 * Use this together with the `o' command to get a read on the
+	 * optimizer's effectiveness.  Compare the total estimated times
+	 * for `t' runs of the same length in both optimized and un-optimized
+	 * modes.  As long as the optimized times are less, the optimizer
+	 * is winning.
+	 */
+	else if (sscanf(buf, "t %d", &n) == 1) {
+	    float cumtime = 0.0, perchar;
+	    int speeds[] =
+	    {2400, 9600, 14400, 19200, 28800, 38400, 0};
+
+	    srand((unsigned) (getpid() + time((time_t *) 0)));
+	    profiling = TRUE;
+	    xmits = 0;
+	    for (i = 0; i < n; i++) {
+		/*
+		 * This does a move test between two random locations,
+		 * Random moves probably short-change the optimizer,
+		 * which will work better on the short moves probably
+		 * typical of doupdate()'s usage pattern.  Still,
+		 * until we have better data...
+		 */
+#ifdef FIND_COREDUMP
+		int from_y = roll(lines);
+		int to_y = roll(lines);
+		int from_x = roll(columns);
+		int to_x = roll(columns);
+
+		printf("(%d,%d) -> (%d,%d)\n", from_y, from_x, to_y, to_x);
+		mvcur(from_y, from_x, to_y, to_x);
+#else
+		mvcur(roll(lines), roll(columns), roll(lines), roll(columns));
+#endif /* FIND_COREDUMP */
+		if (diff)
+		    cumtime += diff;
+	    }
+	    profiling = FALSE;
+
+	    /*
+	     * Average milliseconds per character optimization time.
+	     * This is the key figure to watch when tuning the optimizer.
+	     */
+	    perchar = cumtime / n;
+
+	    (void) printf("%d moves (%ld chars) in %d msec, %f msec each:\n",
+			  n, xmits, (int) cumtime, perchar);
+
+	    for (i = 0; speeds[i]; i++) {
+		/*
+		 * Total estimated time for the moves, computation and
+		 * transmission both. Transmission time is an estimate
+		 * assuming 9 bits/char, 8 bits + 1 stop bit.
+		 */
+		float totalest = cumtime + xmits * 9 * 1e6 / speeds[i];
+
+		/*
+		 * Per-character optimization overhead in character transmits
+		 * at the current speed.  Round this to the nearest integer
+		 * to figure COMPUTE_OVERHEAD for the speed.
+		 */
+		float overhead = speeds[i] * perchar / 1e6;
+
+		(void)
+		    printf("%6d bps: %3.2f char-xmits overhead; total estimated time %15.2f\n",
+			   speeds[i], overhead, totalest);
+	    }
+	} else if (buf[0] == 'c') {
+	    (void) printf("char padding: %d\n", CURRENT_SCREEN->_char_padding);
+	    (void) printf("cr cost: %d\n", CURRENT_SCREEN->_cr_cost);
+	    (void) printf("cup cost: %d\n", CURRENT_SCREEN->_cup_cost);
+	    (void) printf("home cost: %d\n", CURRENT_SCREEN->_home_cost);
+	    (void) printf("ll cost: %d\n", CURRENT_SCREEN->_ll_cost);
+#if USE_HARD_TABS
+	    (void) printf("ht cost: %d\n", CURRENT_SCREEN->_ht_cost);
+	    (void) printf("cbt cost: %d\n", CURRENT_SCREEN->_cbt_cost);
+#endif /* USE_HARD_TABS */
+	    (void) printf("cub1 cost: %d\n", CURRENT_SCREEN->_cub1_cost);
+	    (void) printf("cuf1 cost: %d\n", CURRENT_SCREEN->_cuf1_cost);
+	    (void) printf("cud1 cost: %d\n", CURRENT_SCREEN->_cud1_cost);
+	    (void) printf("cuu1 cost: %d\n", CURRENT_SCREEN->_cuu1_cost);
+	    (void) printf("cub cost: %d\n", CURRENT_SCREEN->_cub_cost);
+	    (void) printf("cuf cost: %d\n", CURRENT_SCREEN->_cuf_cost);
+	    (void) printf("cud cost: %d\n", CURRENT_SCREEN->_cud_cost);
+	    (void) printf("cuu cost: %d\n", CURRENT_SCREEN->_cuu_cost);
+	    (void) printf("hpa cost: %d\n", CURRENT_SCREEN->_hpa_cost);
+	    (void) printf("vpa cost: %d\n", CURRENT_SCREEN->_vpa_cost);
+	} else if (buf[0] == 'x' || buf[0] == 'q')
+	    break;
+	else
+	    (void) puts("Invalid command.");
+    }
+
+    (void) fputs("rmcup:", stdout);
+    _nc_mvcur_wrap();
+    putchar('\n');
+
+    return (0);
+}
+
+#endif /* MAIN */
+
+/* lib_mvcur.c ends here */
diff --git a/ncurses/tty/lib_tstp.c b/ncurses/tty/lib_tstp.c
new file mode 100644
index 0000000..dd925c7
--- /dev/null
+++ b/ncurses/tty/lib_tstp.c
@@ -0,0 +1,428 @@
+/****************************************************************************
+ * Copyright 2020-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2014,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1995-on                 *
+ ****************************************************************************/
+
+/*
+**	lib_tstp.c
+**
+**	The routine _nc_signal_handler().
+**
+*/
+#include <curses.priv.h>
+
+#include <SigAction.h>
+
+MODULE_ID("$Id: lib_tstp.c,v 1.54 2022/12/24 22:22:10 tom Exp $")
+
+#if defined(SIGTSTP) && (HAVE_SIGACTION || HAVE_SIGVEC)
+#define USE_SIGTSTP 1
+#else
+#define USE_SIGTSTP 0
+#endif
+
+#ifdef TRACE
+static const char *
+signal_name(int sig)
+{
+    switch (sig) {
+#ifdef SIGALRM
+    case SIGALRM:
+	return "SIGALRM";
+#endif
+#ifdef SIGCONT
+    case SIGCONT:
+	return "SIGCONT";
+#endif
+    case SIGINT:
+	return "SIGINT";
+#ifdef SIGQUIT
+    case SIGQUIT:
+	return "SIGQUIT";
+#endif
+    case SIGTERM:
+	return "SIGTERM";
+#ifdef SIGTSTP
+    case SIGTSTP:
+	return "SIGTSTP";
+#endif
+#ifdef SIGTTOU
+    case SIGTTOU:
+	return "SIGTTOU";
+#endif
+#ifdef SIGWINCH
+    case SIGWINCH:
+	return "SIGWINCH";
+#endif
+    default:
+	return "unknown signal";
+    }
+}
+#endif
+
+/*
+ * Note: This code is fragile!  Its problem is that different OSs
+ * handle restart of system calls interrupted by signals differently.
+ * The ncurses code needs signal-call restart to happen -- otherwise,
+ * interrupted wgetch() calls will return FAIL, probably making the
+ * application think the input stream has ended and it should
+ * terminate.  In particular, you know you have this problem if, when
+ * you suspend an ncurses-using lynx with ^Z and resume, it dies
+ * immediately.
+ *
+ * Default behavior of POSIX sigaction(2) is not to restart
+ * interrupted system calls, but Linux's sigaction does it anyway (at
+ * least, on and after the 1.1.47 I (esr) use).  Thus this code works
+ * OK under Linux.  The 4.4BSD sigaction(2) supports a (non-portable)
+ * SA_RESTART flag that forces the right behavior.  Thus, this code
+ * should work OK under BSD/OS, NetBSD, and FreeBSD (let us know if it
+ * does not).
+ *
+ * Stock System Vs (and anything else using a strict-POSIX
+ * sigaction(2) without SA_RESTART) may have a problem.  Possible
+ * solutions:
+ *
+ *    sigvec      restarts by default (SV_INTERRUPT flag to not restart)
+ *    signal      restarts by default in SVr4 (assuming you link with -lucb)
+ *                and BSD, but not SVr3.
+ *    sigset      restarts, but is only available under SVr4/Solaris.
+ *
+ * The signal(3) call is mandated by the ANSI standard, and its
+ * interaction with sigaction(2) is described in the POSIX standard
+ * (3.3.4.2, page 72,line 934).  According to section 8.1, page 191,
+ * however, signal(3) itself is not required by POSIX.1.  And POSIX is
+ * silent on whether it is required to restart signals.
+ *
+ * So.  The present situation is, we use sigaction(2) with no
+ * guarantee of restart anywhere but on Linux and BSD.  We could
+ * switch to signal(3) and collar Linux, BSD, and SVr4.  Any way
+ * we slice it, System V UNIXes older than SVr4 will probably lose
+ * (this may include XENIX).
+ *
+ * This implementation will probably be changed to use signal(3) in
+ * the future.  If nothing else, it is simpler...
+ */
+
+#if USE_SIGTSTP
+static void
+handle_SIGTSTP(int dummy GCC_UNUSED)
+{
+    SCREEN *sp = CURRENT_SCREEN;
+    sigset_t mask, omask;
+    sigaction_t act, oact;
+
+#ifdef SIGTTOU
+    int sigttou_blocked;
+#endif
+
+    _nc_globals.have_sigtstp = 1;
+    T(("handle_SIGTSTP() called"));
+
+    /*
+     * The user may have changed the prog_mode tty bits, so save them.
+     *
+     * But first try to detect whether we still are in the foreground
+     * process group - if not, an interactive shell may already have
+     * taken ownership of the tty and modified the settings when our
+     * parent was stopped before us, and we would likely pick up the
+     * settings already modified by the shell.
+     *
+     * Don't do this if we're not in curses -
+     */
+    if (sp != 0 && (sp->_endwin == ewRunning))
+#if HAVE_TCGETPGRP
+	if (tcgetpgrp(STDIN_FILENO) == getpgrp())
+#endif
+	    NCURSES_SP_NAME(def_prog_mode) (NCURSES_SP_ARG);
+
+    /*
+     * Block window change and timer signals.  The latter
+     * is because applications use timers to decide when
+     * to repaint the screen.
+     */
+    (void) sigemptyset(&mask);
+#ifdef SIGALRM
+    (void) sigaddset(&mask, SIGALRM);
+#endif
+#if USE_SIGWINCH
+    (void) sigaddset(&mask, SIGWINCH);
+#endif
+    (void) sigprocmask(SIG_BLOCK, &mask, &omask);
+
+#ifdef SIGTTOU
+    sigttou_blocked = sigismember(&omask, SIGTTOU);
+    if (!sigttou_blocked) {
+	(void) sigemptyset(&mask);
+	(void) sigaddset(&mask, SIGTTOU);
+	(void) sigprocmask(SIG_BLOCK, &mask, NULL);
+    }
+#endif
+
+    /*
+     * End window mode, which also resets the terminal state to the
+     * original (pre-curses) modes.
+     */
+    NCURSES_SP_NAME(endwin) (NCURSES_SP_ARG);
+
+    /* Unblock SIGTSTP. */
+    (void) sigemptyset(&mask);
+    (void) sigaddset(&mask, SIGTSTP);
+#ifdef SIGTTOU
+    if (!sigttou_blocked) {
+	/* Unblock this too if it wasn't blocked on entry */
+	(void) sigaddset(&mask, SIGTTOU);
+    }
+#endif
+    (void) sigprocmask(SIG_UNBLOCK, &mask, NULL);
+
+    /* Now we want to resend SIGSTP to this process and suspend it */
+    act.sa_handler = SIG_DFL;
+    sigemptyset(&act.sa_mask);
+    act.sa_flags = 0;
+#ifdef SA_RESTART
+    act.sa_flags |= SA_RESTART;
+#endif /* SA_RESTART */
+    sigaction(SIGTSTP, &act, &oact);
+    kill(getpid(), SIGTSTP);
+
+    /* Process gets suspended...time passes...process resumes */
+
+    T(("SIGCONT received"));
+    sigaction(SIGTSTP, &oact, NULL);
+    NCURSES_SP_NAME(flushinp) (NCURSES_SP_ARG);
+
+    /*
+     * If the user modified the tty state while suspended, he wants
+     * those changes to stick.  So save the new "default" terminal state.
+     */
+    NCURSES_SP_NAME(def_shell_mode) (NCURSES_SP_ARG);
+
+    /*
+     * This relies on the fact that doupdate() will restore the
+     * program-mode tty state, and issue enter_ca_mode if need be.
+     */
+    NCURSES_SP_NAME(doupdate) (NCURSES_SP_ARG);
+
+    /* Reset the signals. */
+    (void) sigprocmask(SIG_SETMASK, &omask, NULL);
+}
+#endif /* USE_SIGTSTP */
+
+static void
+handle_SIGINT(int sig)
+{
+    SCREEN *sp = CURRENT_SCREEN;
+
+    /*
+     * Much of this is unsafe from a signal handler.  But we'll _try_ to clean
+     * up the screen and terminal settings on the way out.
+     *
+     * There are at least the following problems:
+     * 1) Walking the SCREEN list is unsafe, since all list management
+     *    is done without any signal blocking.
+     * 2) On systems which have REENTRANT turned on, set_term() uses
+     *    _nc_lock_global() which could deadlock or misbehave in other ways.
+     * 3) endwin() calls all sorts of stuff, many of which use stdio or
+     *    other library functions which are clearly unsafe.
+     */
+    if (!_nc_globals.cleanup_nested++
+	&& (sig == SIGINT || sig == SIGTERM)) {
+#if HAVE_SIGACTION || HAVE_SIGVEC
+	sigaction_t act;
+	sigemptyset(&act.sa_mask);
+	act.sa_flags = 0;
+	act.sa_handler = SIG_IGN;
+	if (sigaction(sig, &act, NULL) == 0)
+#else
+	if (signal(sig, SIG_IGN) != SIG_ERR)
+#endif
+	{
+	    SCREEN *scan;
+	    for (each_screen(scan)) {
+		if (scan->_ofp != 0
+		    && NC_ISATTY(fileno(scan->_ofp))) {
+		    scan->_outch = NCURSES_SP_NAME(_nc_outch);
+		}
+		set_term(scan);
+		NCURSES_SP_NAME(endwin) (NCURSES_SP_ARG);
+		if (sp)
+		    sp->_endwin = ewInitial;	/* in case of reuse */
+	    }
+	}
+    }
+    _exit(EXIT_FAILURE);
+}
+
+# ifndef _nc_set_read_thread
+NCURSES_EXPORT(void)
+_nc_set_read_thread(bool enable)
+{
+    _nc_lock_global(curses);
+    if (enable) {
+#  if USE_WEAK_SYMBOLS
+	if ((pthread_self) && (pthread_kill) && (pthread_equal))
+#  endif
+	    _nc_globals.read_thread = pthread_self();
+    } else {
+	_nc_globals.read_thread = 0;
+    }
+    _nc_unlock_global(curses);
+}
+# endif
+
+#if USE_SIGWINCH
+
+static void
+handle_SIGWINCH(int sig GCC_UNUSED)
+{
+    _nc_globals.have_sigwinch = 1;
+# if USE_PTHREADS_EINTR
+    if (_nc_globals.read_thread) {
+	if (!pthread_equal(pthread_self(), _nc_globals.read_thread))
+	    pthread_kill(_nc_globals.read_thread, SIGWINCH);
+	_nc_globals.read_thread = 0;
+    }
+# endif
+}
+#endif /* USE_SIGWINCH */
+
+/*
+ * If the given signal is still in its default state, set it to the given
+ * handler.
+ */
+static int
+CatchIfDefault(int sig, void (*handler) (int))
+{
+    int result;
+#if HAVE_SIGACTION || HAVE_SIGVEC
+    sigaction_t old_act;
+    sigaction_t new_act;
+
+    memset(&new_act, 0, sizeof(new_act));
+    sigemptyset(&new_act.sa_mask);
+#ifdef SA_RESTART
+#ifdef SIGWINCH
+    if (sig != SIGWINCH)
+#endif
+	new_act.sa_flags |= SA_RESTART;
+#endif /* SA_RESTART */
+    new_act.sa_handler = handler;
+
+    if (sigaction(sig, NULL, &old_act) == 0
+	&& (old_act.sa_handler == SIG_DFL
+	    || old_act.sa_handler == handler
+#if USE_SIGWINCH
+	    || (sig == SIGWINCH && old_act.sa_handler == SIG_IGN)
+#endif
+	)) {
+	(void) sigaction(sig, &new_act, NULL);
+	result = TRUE;
+    } else {
+	result = FALSE;
+    }
+#else /* !HAVE_SIGACTION */
+    void (*ohandler) (int);
+
+    ohandler = signal(sig, SIG_IGN);
+    if (ohandler == SIG_DFL
+	|| ohandler == handler
+#if USE_SIGWINCH
+	|| (sig == SIGWINCH && ohandler == SIG_IGN)
+#endif
+	) {
+	signal(sig, handler);
+	result = TRUE;
+    } else {
+	signal(sig, ohandler);
+	result = FALSE;
+    }
+#endif
+    T(("CatchIfDefault - will %scatch %s",
+       result ? "" : "not ", signal_name(sig)));
+    return result;
+}
+
+/*
+ * This is invoked once at the beginning (e.g., from 'initscr()'), to
+ * initialize the signal catchers, and thereafter when spawning a shell (and
+ * returning) to disable/enable the SIGTSTP (i.e., ^Z) catcher.
+ *
+ * If the application has already set one of the signals, we'll not modify it
+ * (during initialization).
+ *
+ * The XSI document implies that we shouldn't keep the SIGTSTP handler if
+ * the caller later changes its mind, but that doesn't seem correct.
+ */
+NCURSES_EXPORT(void)
+_nc_signal_handler(int enable)
+{
+    T((T_CALLED("_nc_signal_handler(%d)"), enable));
+#if USE_SIGTSTP			/* Xenix 2.x doesn't have SIGTSTP, for example */
+    {
+	static bool ignore_tstp = FALSE;
+
+	if (!ignore_tstp) {
+	    static sigaction_t new_sigaction, old_sigaction;
+
+	    if (!enable) {
+		new_sigaction.sa_handler = SIG_IGN;
+		sigaction(SIGTSTP, &new_sigaction, &old_sigaction);
+	    } else if (new_sigaction.sa_handler != SIG_DFL) {
+		sigaction(SIGTSTP, &old_sigaction, NULL);
+	    } else if (sigaction(SIGTSTP, NULL, &old_sigaction) == 0
+		       && (old_sigaction.sa_handler == SIG_DFL)) {
+		sigemptyset(&new_sigaction.sa_mask);
+#ifdef SA_RESTART
+		new_sigaction.sa_flags |= SA_RESTART;
+#endif /* SA_RESTART */
+		new_sigaction.sa_handler = handle_SIGTSTP;
+		(void) sigaction(SIGTSTP, &new_sigaction, NULL);
+	    } else {
+		ignore_tstp = TRUE;
+	    }
+	}
+    }
+#endif /* !USE_SIGTSTP */
+
+    if (!_nc_globals.init_signals) {
+	if (enable) {
+	    CatchIfDefault(SIGINT, handle_SIGINT);
+	    CatchIfDefault(SIGTERM, handle_SIGINT);
+#if USE_SIGWINCH
+	    CatchIfDefault(SIGWINCH, handle_SIGWINCH);
+#endif
+	    _nc_globals.init_signals = TRUE;
+	}
+    }
+    returnVoid;
+}
diff --git a/ncurses/tty/lib_twait.c b/ncurses/tty/lib_twait.c
new file mode 100644
index 0000000..a7604b3
--- /dev/null
+++ b/ncurses/tty/lib_twait.c
@@ -0,0 +1,518 @@
+/****************************************************************************
+ * Copyright 2018,2020 Thomas E. Dickey                                     *
+ * Copyright 1998-2015,2016 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ ****************************************************************************/
+
+/*
+**	lib_twait.c
+**
+**	The routine _nc_timed_wait().
+**
+**	(This file was originally written by Eric Raymond; however except for
+**	comments, none of the original code remains - T.Dickey).
+*/
+
+#include <curses.priv.h>
+
+#if defined __HAIKU__ && defined __BEOS__
+#undef __BEOS__
+#endif
+
+#ifdef __BEOS__
+#undef false
+#undef true
+#include <OS.h>
+#endif
+
+#if USE_KLIBC_KBD
+#define INCL_KBD
+#include <os2.h>
+#endif
+
+#if USE_FUNC_POLL
+# if HAVE_SYS_TIME_H
+#  include <sys/time.h>
+# endif
+#elif HAVE_SELECT
+# if HAVE_SYS_TIME_H && HAVE_SYS_TIME_SELECT
+#  include <sys/time.h>
+# endif
+# if HAVE_SYS_SELECT_H
+#  include <sys/select.h>
+# endif
+#endif
+#if HAVE_SYS_TIME_H
+#  include <sys/time.h>
+#endif
+#undef CUR
+
+MODULE_ID("$Id: lib_twait.c,v 1.75 2020/02/29 15:46:00 anonymous.maarten Exp $")
+
+static long
+_nc_gettime(TimeType * t0, int first)
+{
+    long res;
+
+#if PRECISE_GETTIME
+    TimeType t1;
+    gettimeofday(&t1, (struct timezone *) 0);
+    if (first) {
+	*t0 = t1;
+	res = 0;
+    } else {
+	/* .tv_sec and .tv_usec are unsigned, be careful when subtracting */
+	if (t0->tv_usec > t1.tv_usec) {
+	    t1.tv_usec += 1000000;	/* Convert 1s in 1e6 microsecs */
+	    t1.tv_sec--;
+	}
+	res = (t1.tv_sec - t0->tv_sec) * 1000
+	    + (t1.tv_usec - t0->tv_usec) / 1000;
+    }
+#else
+    time_t t1 = time((time_t *) 0);
+    if (first) {
+	*t0 = t1;
+    }
+    res = (long) ((t1 - *t0) * 1000);
+#endif
+    TR(TRACE_IEVENT, ("%s time: %ld msec", first ? "get" : "elapsed", res));
+    return res;
+}
+
+#ifdef NCURSES_WGETCH_EVENTS
+NCURSES_EXPORT(int)
+_nc_eventlist_timeout(_nc_eventlist * evl)
+{
+    int event_delay = -1;
+
+    if (evl != 0) {
+	int n;
+
+	for (n = 0; n < evl->count; ++n) {
+	    _nc_event *ev = evl->events[n];
+
+	    if (ev->type == _NC_EVENT_TIMEOUT_MSEC) {
+		event_delay = (int) ev->data.timeout_msec;
+		if (event_delay < 0)
+		    event_delay = INT_MAX;	/* FIXME Is this defined? */
+	    }
+	}
+    }
+    return event_delay;
+}
+#endif /* NCURSES_WGETCH_EVENTS */
+
+#if (USE_FUNC_POLL || HAVE_SELECT)
+#  define MAYBE_UNUSED
+#else
+#  define MAYBE_UNUSED GCC_UNUSED
+#endif
+
+#if (USE_FUNC_POLL || HAVE_SELECT)
+#  define MAYBE_UNUSED
+#else
+#  define MAYBE_UNUSED GCC_UNUSED
+#endif
+
+/*
+ * Wait a specified number of milliseconds, returning nonzero if the timer
+ * didn't expire before there is activity on the specified file descriptors.
+ * The file-descriptors are specified by the mode:
+ *	TW_NONE    0 - none (absolute time)
+ *	TW_INPUT   1 - ncurses' normal input-descriptor
+ *	TW_MOUSE   2 - mouse descriptor, if any
+ *	TW_ANY     3 - either input or mouse.
+ *      TW_EVENT   4 -
+ * Experimental:  if NCURSES_WGETCH_EVENTS is defined, (mode & 4) determines
+ * whether to pay attention to evl argument.  If set, the smallest of
+ * millisecond and of timeout of evl is taken.
+ *
+ * We return a mask that corresponds to the mode (e.g., 2 for mouse activity).
+ *
+ * If the milliseconds given are -1, the wait blocks until activity on the
+ * descriptors.
+ */
+NCURSES_EXPORT(int)
+_nc_timed_wait(SCREEN *sp MAYBE_UNUSED,
+	       int mode MAYBE_UNUSED,
+	       int milliseconds,
+	       int *timeleft
+	       EVENTLIST_2nd(_nc_eventlist * evl))
+{
+    int count;
+    int result = TW_NONE;
+    TimeType t0;
+#if (USE_FUNC_POLL || HAVE_SELECT)
+    int fd;
+#endif
+
+#ifdef NCURSES_WGETCH_EVENTS
+    int timeout_is_event = 0;
+    int n;
+#endif
+
+#if USE_FUNC_POLL
+#define MIN_FDS 2
+    struct pollfd fd_list[MIN_FDS];
+    struct pollfd *fds = fd_list;
+#elif defined(__BEOS__)
+#elif HAVE_SELECT
+    fd_set set;
+#endif
+
+#if USE_KLIBC_KBD
+    fd_set saved_set;
+    KBDKEYINFO ki;
+    struct timeval tv;
+#endif
+
+    long starttime, returntime;
+
+#ifdef NCURSES_WGETCH_EVENTS
+    (void) timeout_is_event;
+#endif
+
+    TR(TRACE_IEVENT, ("start twait: %d milliseconds, mode: %d",
+		      milliseconds, mode));
+
+#ifdef NCURSES_WGETCH_EVENTS
+    if (mode & TW_EVENT) {
+	int event_delay = _nc_eventlist_timeout(evl);
+
+	if (event_delay >= 0
+	    && (milliseconds >= event_delay || milliseconds < 0)) {
+	    milliseconds = event_delay;
+	    timeout_is_event = 1;
+	}
+    }
+#endif
+
+#if PRECISE_GETTIME && HAVE_NANOSLEEP
+  retry:
+#endif
+    starttime = _nc_gettime(&t0, TRUE);
+
+    count = 0;
+    (void) count;
+
+#ifdef NCURSES_WGETCH_EVENTS
+    if ((mode & TW_EVENT) && evl)
+	evl->result_flags = 0;
+#endif
+
+#if USE_FUNC_POLL
+    memset(fd_list, 0, sizeof(fd_list));
+
+#ifdef NCURSES_WGETCH_EVENTS
+    if ((mode & TW_EVENT) && evl) {
+	if (fds == fd_list)
+	    fds = typeMalloc(struct pollfd, MIN_FDS + evl->count);
+	if (fds == 0)
+	    return TW_NONE;
+    }
+#endif
+
+    if (mode & TW_INPUT) {
+	fds[count].fd = sp->_ifd;
+	fds[count].events = POLLIN;
+	count++;
+    }
+    if ((mode & TW_MOUSE)
+	&& (fd = sp->_mouse_fd) >= 0) {
+	fds[count].fd = fd;
+	fds[count].events = POLLIN;
+	count++;
+    }
+#ifdef NCURSES_WGETCH_EVENTS
+    if ((mode & TW_EVENT) && evl) {
+	for (n = 0; n < evl->count; ++n) {
+	    _nc_event *ev = evl->events[n];
+
+	    if (ev->type == _NC_EVENT_FILE
+		&& (ev->data.fev.flags & _NC_EVENT_FILE_READABLE)) {
+		fds[count].fd = ev->data.fev.fd;
+		fds[count].events = POLLIN;
+		count++;
+	    }
+	}
+    }
+#endif
+
+    result = poll(fds, (size_t) count, milliseconds);
+
+#ifdef NCURSES_WGETCH_EVENTS
+    if ((mode & TW_EVENT) && evl) {
+	int c;
+
+	if (!result)
+	    count = 0;
+
+	for (n = 0; n < evl->count; ++n) {
+	    _nc_event *ev = evl->events[n];
+
+	    if (ev->type == _NC_EVENT_FILE
+		&& (ev->data.fev.flags & _NC_EVENT_FILE_READABLE)) {
+		ev->data.fev.result = 0;
+		for (c = 0; c < count; c++)
+		    if (fds[c].fd == ev->data.fev.fd
+			&& fds[c].revents & POLLIN) {
+			ev->data.fev.result |= _NC_EVENT_FILE_READABLE;
+			evl->result_flags |= _NC_EVENT_FILE_READABLE;
+		    }
+	    } else if (ev->type == _NC_EVENT_TIMEOUT_MSEC
+		       && !result && timeout_is_event) {
+		evl->result_flags |= _NC_EVENT_TIMEOUT_MSEC;
+	    }
+	}
+    }
+#endif
+
+#elif defined(__BEOS__)
+    /*
+     * BeOS's select() is declared in socket.h, so the configure script does
+     * not see it.  That's just as well, since that function works only for
+     * sockets.  This (using snooze and ioctl) was distilled from Be's patch
+     * for ncurses which uses a separate thread to simulate select().
+     *
+     * FIXME: the return values from the ioctl aren't very clear if we get
+     * interrupted.
+     *
+     * FIXME: this assumes mode&1 if milliseconds < 0 (see lib_getch.c).
+     */
+    result = TW_NONE;
+    if (mode & TW_INPUT) {
+	int step = (milliseconds < 0) ? 0 : 5000;
+	bigtime_t d;
+	bigtime_t useconds = milliseconds * 1000;
+	int n, howmany;
+
+	if (useconds <= 0)	/* we're here to go _through_ the loop */
+	    useconds = 1;
+
+	for (d = 0; d < useconds; d += step) {
+	    n = 0;
+	    howmany = ioctl(0, 'ichr', &n);
+	    if (howmany >= 0 && n > 0) {
+		result = 1;
+		break;
+	    }
+	    if (useconds > 1 && step > 0) {
+		snooze(step);
+		milliseconds -= (step / 1000);
+		if (milliseconds <= 0) {
+		    milliseconds = 0;
+		    break;
+		}
+	    }
+	}
+    } else if (milliseconds > 0) {
+	snooze(milliseconds * 1000);
+	milliseconds = 0;
+    }
+#elif HAVE_SELECT
+    /*
+     * select() modifies the fd_set arguments; do this in the
+     * loop.
+     */
+    FD_ZERO(&set);
+
+#if !USE_KLIBC_KBD
+    if (mode & TW_INPUT) {
+	FD_SET(sp->_ifd, &set);
+	count = sp->_ifd + 1;
+    }
+#endif
+    if ((mode & TW_MOUSE)
+	&& (fd = sp->_mouse_fd) >= 0) {
+	FD_SET(fd, &set);
+	count = max(fd, count) + 1;
+    }
+#ifdef NCURSES_WGETCH_EVENTS
+    if ((mode & TW_EVENT) && evl) {
+	for (n = 0; n < evl->count; ++n) {
+	    _nc_event *ev = evl->events[n];
+
+	    if (ev->type == _NC_EVENT_FILE
+		&& (ev->data.fev.flags & _NC_EVENT_FILE_READABLE)) {
+		FD_SET(ev->data.fev.fd, &set);
+		count = max(ev->data.fev.fd + 1, count);
+	    }
+	}
+    }
+#endif
+
+#if USE_KLIBC_KBD
+    for (saved_set = set;; set = saved_set) {
+	if ((mode & TW_INPUT)
+	    && (sp->_extended_key
+		|| (KbdPeek(&ki, 0) == 0
+		    && (ki.fbStatus & KBDTRF_FINAL_CHAR_IN)))) {
+	    FD_ZERO(&set);
+	    FD_SET(sp->_ifd, &set);
+	    result = 1;
+	    break;
+	}
+
+	tv.tv_sec = 0;
+	tv.tv_usec = (milliseconds == 0) ? 0 : (10 * 1000);
+
+	if ((result = select(count, &set, NULL, NULL, &tv)) != 0)
+	    break;
+
+	/* Time out ? */
+	if (milliseconds >= 0 && _nc_gettime(&t0, FALSE) >= milliseconds) {
+	    result = 0;
+	    break;
+	}
+    }
+#else
+    if (milliseconds >= 0) {
+	struct timeval ntimeout;
+	ntimeout.tv_sec = milliseconds / 1000;
+	ntimeout.tv_usec = (milliseconds % 1000) * 1000;
+	result = select(count, &set, NULL, NULL, &ntimeout);
+    } else {
+	result = select(count, &set, NULL, NULL, NULL);
+    }
+#endif
+
+#ifdef NCURSES_WGETCH_EVENTS
+    if ((mode & TW_EVENT) && evl) {
+	evl->result_flags = 0;
+	for (n = 0; n < evl->count; ++n) {
+	    _nc_event *ev = evl->events[n];
+
+	    if (ev->type == _NC_EVENT_FILE
+		&& (ev->data.fev.flags & _NC_EVENT_FILE_READABLE)) {
+		ev->data.fev.result = 0;
+		if (FD_ISSET(ev->data.fev.fd, &set)) {
+		    ev->data.fev.result |= _NC_EVENT_FILE_READABLE;
+		    evl->result_flags |= _NC_EVENT_FILE_READABLE;
+		}
+	    } else if (ev->type == _NC_EVENT_TIMEOUT_MSEC
+		       && !result && timeout_is_event)
+		evl->result_flags |= _NC_EVENT_TIMEOUT_MSEC;
+	}
+    }
+#endif
+
+#endif /* USE_FUNC_POLL, etc */
+
+    returntime = _nc_gettime(&t0, FALSE);
+
+    if (milliseconds >= 0)
+	milliseconds -= (int) (returntime - starttime);
+
+#ifdef NCURSES_WGETCH_EVENTS
+    if (evl) {
+	evl->result_flags = 0;
+	for (n = 0; n < evl->count; ++n) {
+	    _nc_event *ev = evl->events[n];
+
+	    if (ev->type == _NC_EVENT_TIMEOUT_MSEC) {
+		long diff = (returntime - starttime);
+		if (ev->data.timeout_msec <= diff)
+		    ev->data.timeout_msec = 0;
+		else
+		    ev->data.timeout_msec -= diff;
+	    }
+
+	}
+    }
+#endif
+
+#if PRECISE_GETTIME && HAVE_NANOSLEEP
+    /*
+     * If the timeout hasn't expired, and we've gotten no data,
+     * this is probably a system where 'select()' needs to be left
+     * alone so that it can complete.  Make this process sleep,
+     * then come back for more.
+     */
+    if (result == 0 && milliseconds > 100) {
+	napms(100);		/* FIXME: this won't be right if I recur! */
+	milliseconds -= 100;
+	goto retry;
+    }
+#endif
+
+    /* return approximate time left in milliseconds */
+    if (timeleft)
+	*timeleft = milliseconds;
+
+    TR(TRACE_IEVENT, ("end twait: returned %d (%d), remaining time %d msec",
+		      result, errno, milliseconds));
+
+    /*
+     * Both 'poll()' and 'select()' return the number of file descriptors
+     * that are active.  Translate this back to the mask that denotes which
+     * file-descriptors, so that we don't need all of this system-specific
+     * code everywhere.
+     */
+    if (result != 0) {
+	if (result > 0) {
+	    result = 0;
+#if USE_FUNC_POLL
+	    for (count = 0; count < MIN_FDS; count++) {
+		if ((mode & (1 << count))
+		    && (fds[count].revents & POLLIN)) {
+		    result |= (1 << count);
+		}
+	    }
+#elif defined(__BEOS__)
+	    result = TW_INPUT;	/* redundant, but simple */
+#elif HAVE_SELECT
+	    if ((mode & TW_MOUSE)
+		&& (fd = sp->_mouse_fd) >= 0
+		&& FD_ISSET(fd, &set))
+		result |= TW_MOUSE;
+	    if ((mode & TW_INPUT)
+		&& FD_ISSET(sp->_ifd, &set))
+		result |= TW_INPUT;
+#endif
+	} else
+	    result = 0;
+    }
+#ifdef NCURSES_WGETCH_EVENTS
+    if ((mode & TW_EVENT) && evl && evl->result_flags)
+	result |= TW_EVENT;
+#endif
+
+#if USE_FUNC_POLL
+#ifdef NCURSES_WGETCH_EVENTS
+    if (fds != fd_list)
+	free((char *) fds);
+#endif
+#endif
+
+    return (result);
+}
diff --git a/ncurses/tty/lib_vidattr.c b/ncurses/tty/lib_vidattr.c
new file mode 100644
index 0000000..15e7397
--- /dev/null
+++ b/ncurses/tty/lib_vidattr.c
@@ -0,0 +1,431 @@
+/****************************************************************************
+ * Copyright 2018-2019,2020 Thomas E. Dickey                                *
+ * Copyright 1998-2014,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ *     and: Juergen Pfeifer                         2009                    *
+ ****************************************************************************/
+
+/*
+ *	vidputs(newmode, outc)
+ *
+ *	newmode is taken to be the logical 'or' of the symbols in curses.h
+ *	representing graphic renditions.  The terminal is set to be in all of
+ *	the given modes, if possible.
+ *
+ *	if the new attribute is normal
+ *		if exit-alt-char-set exists
+ *			emit it
+ *		emit exit-attribute-mode
+ *	else if set-attributes exists
+ *		use it to set exactly what you want
+ *	else
+ *		if exit-attribute-mode exists
+ *			turn off everything
+ *		else
+ *			turn off those which can be turned off and aren't in
+ *			newmode.
+ *		turn on each mode which should be on and isn't, one by one
+ *
+ *	NOTE that this algorithm won't achieve the desired mix of attributes
+ *	in some cases, but those are probably just those cases in which it is
+ *	actually impossible, anyway, so...
+ *
+ * 	NOTE that we cannot assume that there's no interaction between color
+ *	and other attribute resets.  So each time we reset color (or other
+ *	attributes) we'll have to be prepared to restore the other.
+ */
+
+#include <curses.priv.h>
+
+#ifndef CUR
+#define CUR SP_TERMTYPE
+#endif
+
+MODULE_ID("$Id: lib_vidattr.c,v 1.78 2020/05/27 23:56:32 tom Exp $")
+
+#define doPut(mode) \
+	TPUTS_TRACE(#mode); \
+	NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx mode, 1, outc)
+
+#define TurnOn(mask, mode) \
+	if ((turn_on & mask) && mode) { \
+	    TPUTS_TRACE(#mode); \
+	    NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx mode, 1, outc); \
+	}
+
+#define TurnOff(mask, mode) \
+	if ((turn_off & mask) && mode) { \
+	    TPUTS_TRACE(#mode); \
+	    NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx mode, 1, outc); \
+	    turn_off &= ~mask; \
+	}
+
+	/* if there is no current screen, assume we *can* do color */
+#define SetColorsIf(why, old_attr) \
+	if (can_color && (why)) { \
+		int old_pair = PairNumber(old_attr); \
+		TR(TRACE_ATTRS, ("old pair = %d -- new pair = %d", old_pair, pair)); \
+		if ((pair != old_pair) \
+		 || (fix_pair0 && (pair == 0)) \
+		 || (reverse ^ ((old_attr & A_REVERSE) != 0))) { \
+		     NCURSES_SP_NAME(_nc_do_color) (NCURSES_SP_ARGx \
+				     (short) old_pair, \
+				     (short) pair, \
+				     reverse, outc); \
+		} \
+	}
+
+#define PreviousAttr _nc_prescreen.previous_attr
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(vidputs) (NCURSES_SP_DCLx
+			  chtype newmode,
+			  NCURSES_SP_OUTC outc)
+{
+    attr_t turn_on, turn_off;
+    int pair;
+    bool reverse = FALSE;
+    bool can_color = (SP_PARM == 0 || SP_PARM->_coloron);
+#if NCURSES_EXT_FUNCS
+    bool fix_pair0 = (SP_PARM != 0 && SP_PARM->_coloron && !SP_PARM->_default_color);
+#else
+#define fix_pair0 FALSE
+#endif
+
+    newmode &= A_ATTRIBUTES;
+
+    T((T_CALLED("vidputs(%p,%s)"), (void *) SP_PARM, _traceattr(newmode)));
+
+    if (!IsValidTIScreen(SP_PARM))
+	returnCode(ERR);
+
+    /* this allows us to go on whether or not newterm() has been called */
+    if (SP_PARM)
+	PreviousAttr = AttrOf(SCREEN_ATTRS(SP_PARM));
+
+    TR(TRACE_ATTRS, ("previous attribute was %s", _traceattr(PreviousAttr)));
+
+    if ((SP_PARM != 0)
+	&& (magic_cookie_glitch > 0)) {
+#if USE_XMC_SUPPORT
+	static const chtype table[] =
+	{
+	    A_STANDOUT,
+	    A_UNDERLINE,
+	    A_REVERSE,
+	    A_BLINK,
+	    A_DIM,
+	    A_BOLD,
+	    A_INVIS,
+	    A_PROTECT,
+#if USE_ITALIC
+	    A_ITALIC,
+#endif
+	};
+	unsigned n;
+	int used = 0;
+#ifdef max_attributes		/* not in U/Win */
+	int limit = (max_attributes <= 0) ? 1 : max_attributes;
+#else
+	int limit = 1;
+#endif
+	chtype retain = 0;
+
+	/*
+	 * Limit the number of attribute bits set in the newmode according to
+	 * the terminfo max_attributes value.
+	 */
+	for (n = 0; n < SIZEOF(table); ++n) {
+	    if ((table[n] & SP_PARM->_ok_attributes) == 0) {
+		newmode &= ~table[n];
+	    } else if ((table[n] & newmode) != 0) {
+		if (used++ >= limit) {
+		    newmode &= ~table[n];
+		    if (newmode == retain)
+			break;
+		} else {
+		    retain = newmode;
+		}
+	    }
+	}
+#else
+	newmode &= ~(SP_PARM->_xmc_suppress);
+#endif
+	TR(TRACE_ATTRS, ("suppressed attribute is %s", _traceattr(newmode)));
+    }
+
+    /*
+     * If we have a terminal that cannot combine color with video
+     * attributes, use the colors in preference.
+     */
+    if (((newmode & A_COLOR) != 0
+	 || fix_pair0)
+	&& (no_color_video > 0)) {
+	/*
+	 * If we had chosen the A_xxx definitions to correspond to the
+	 * no_color_video mask, we could simply shift it up and mask off the
+	 * attributes.  But we did not (actually copied Solaris' definitions).
+	 * However, this is still simpler/faster than a lookup table.
+	 *
+	 * The 63 corresponds to A_STANDOUT, A_UNDERLINE, A_REVERSE, A_BLINK,
+	 * A_DIM, A_BOLD which are 1:1 with no_color_video.  The bits that
+	 * correspond to A_INVIS, A_PROTECT (192) must be shifted up 1 and
+	 * A_ALTCHARSET (256) down 2 to line up.  We use the NCURSES_BITS
+	 * macro so this will work properly for the wide-character layout.
+	 */
+	unsigned value = (unsigned) no_color_video;
+	attr_t mask = NCURSES_BITS((value & 63)
+				   | ((value & 192) << 1)
+				   | ((value & 256) >> 2), 8);
+
+	if ((mask & A_REVERSE) != 0
+	    && (newmode & A_REVERSE) != 0) {
+	    reverse = TRUE;
+	    mask &= ~A_REVERSE;
+	}
+	newmode &= ~mask;
+    }
+
+    if (newmode == PreviousAttr)
+	returnCode(OK);
+
+    pair = PairNumber(newmode);
+
+    if (reverse) {
+	newmode &= ~A_REVERSE;
+    }
+
+    turn_off = (~newmode & PreviousAttr) & ALL_BUT_COLOR;
+    turn_on = (newmode & ~(PreviousAttr & TPARM_ATTR)) & ALL_BUT_COLOR;
+
+    SetColorsIf(((pair == 0) && !fix_pair0), PreviousAttr);
+
+    if (newmode == A_NORMAL) {
+	if ((PreviousAttr & A_ALTCHARSET) && exit_alt_charset_mode) {
+	    doPut(exit_alt_charset_mode);
+	    PreviousAttr &= ~A_ALTCHARSET;
+	}
+	if (PreviousAttr) {
+	    if (exit_attribute_mode) {
+		doPut(exit_attribute_mode);
+	    } else {
+		if (!SP_PARM || SP_PARM->_use_rmul) {
+		    TurnOff(A_UNDERLINE, exit_underline_mode);
+		}
+		if (!SP_PARM || SP_PARM->_use_rmso) {
+		    TurnOff(A_STANDOUT, exit_standout_mode);
+		}
+#if USE_ITALIC
+		if (!SP_PARM || SP_PARM->_use_ritm) {
+		    TurnOff(A_ITALIC, exit_italics_mode);
+		}
+#endif
+	    }
+	    PreviousAttr &= ALL_BUT_COLOR;
+	}
+
+	SetColorsIf((pair != 0) || fix_pair0, PreviousAttr);
+    } else if (set_attributes) {
+	if (turn_on || turn_off) {
+	    TPUTS_TRACE("set_attributes");
+	    NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx
+				    TIPARM_9(set_attributes,
+					     (newmode & A_STANDOUT) != 0,
+					     (newmode & A_UNDERLINE) != 0,
+					     (newmode & A_REVERSE) != 0,
+					     (newmode & A_BLINK) != 0,
+					     (newmode & A_DIM) != 0,
+					     (newmode & A_BOLD) != 0,
+					     (newmode & A_INVIS) != 0,
+					     (newmode & A_PROTECT) != 0,
+					     (newmode & A_ALTCHARSET) != 0),
+				    1, outc);
+	    PreviousAttr &= ALL_BUT_COLOR;
+	}
+#if USE_ITALIC
+	if (!SP_PARM || SP_PARM->_use_ritm) {
+	    if (turn_on & A_ITALIC) {
+		TurnOn(A_ITALIC, enter_italics_mode);
+	    } else if (turn_off & A_ITALIC) {
+		TurnOff(A_ITALIC, exit_italics_mode);
+	    }
+	}
+#endif
+	SetColorsIf((pair != 0) || fix_pair0, PreviousAttr);
+    } else {
+
+	TR(TRACE_ATTRS, ("turning %s off", _traceattr(turn_off)));
+
+	TurnOff(A_ALTCHARSET, exit_alt_charset_mode);
+
+	if (!SP_PARM || SP_PARM->_use_rmul) {
+	    TurnOff(A_UNDERLINE, exit_underline_mode);
+	}
+
+	if (!SP_PARM || SP_PARM->_use_rmso) {
+	    TurnOff(A_STANDOUT, exit_standout_mode);
+	}
+#if USE_ITALIC
+	if (!SP_PARM || SP_PARM->_use_ritm) {
+	    TurnOff(A_ITALIC, exit_italics_mode);
+	}
+#endif
+	if (turn_off && exit_attribute_mode) {
+	    doPut(exit_attribute_mode);
+	    turn_on |= (newmode & ALL_BUT_COLOR);
+	    PreviousAttr &= ALL_BUT_COLOR;
+	}
+	SetColorsIf((pair != 0) || fix_pair0, PreviousAttr);
+
+	TR(TRACE_ATTRS, ("turning %s on", _traceattr(turn_on)));
+	/* *INDENT-OFF* */
+	TurnOn(A_ALTCHARSET,	enter_alt_charset_mode);
+	TurnOn(A_BLINK,		enter_blink_mode);
+	TurnOn(A_BOLD,		enter_bold_mode);
+	TurnOn(A_DIM,		enter_dim_mode);
+	TurnOn(A_REVERSE,	enter_reverse_mode);
+	TurnOn(A_STANDOUT,	enter_standout_mode);
+	TurnOn(A_PROTECT,	enter_protected_mode);
+	TurnOn(A_INVIS,		enter_secure_mode);
+	TurnOn(A_UNDERLINE,	enter_underline_mode);
+#if USE_ITALIC
+	TurnOn(A_ITALIC,	enter_italics_mode);
+#endif
+#if USE_WIDEC_SUPPORT && defined(enter_horizontal_hl_mode)
+	TurnOn(A_HORIZONTAL,	enter_horizontal_hl_mode);
+	TurnOn(A_LEFT,		enter_left_hl_mode);
+	TurnOn(A_LOW,		enter_low_hl_mode);
+	TurnOn(A_RIGHT,		enter_right_hl_mode);
+	TurnOn(A_TOP,		enter_top_hl_mode);
+	TurnOn(A_VERTICAL,	enter_vertical_hl_mode);
+#endif
+	/* *INDENT-ON* */
+    }
+
+    if (reverse)
+	newmode |= A_REVERSE;
+
+    if (SP_PARM)
+	SetAttr(SCREEN_ATTRS(SP_PARM), newmode);
+    else
+	PreviousAttr = newmode;
+
+    returnCode(OK);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+vidputs(chtype newmode, NCURSES_OUTC outc)
+{
+    SetSafeOutcWrapper(outc);
+    return NCURSES_SP_NAME(vidputs) (CURRENT_SCREEN,
+				     newmode,
+				     _nc_outc_wrapper);
+}
+#endif
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(vidattr) (NCURSES_SP_DCLx chtype newmode)
+{
+    T((T_CALLED("vidattr(%p,%s)"), (void *) SP_PARM, _traceattr(newmode)));
+    returnCode(NCURSES_SP_NAME(vidputs) (NCURSES_SP_ARGx
+					 newmode,
+					 NCURSES_SP_NAME(_nc_putchar)));
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+vidattr(chtype newmode)
+{
+    return NCURSES_SP_NAME(vidattr) (CURRENT_SCREEN, newmode);
+}
+#endif
+
+NCURSES_EXPORT(chtype)
+NCURSES_SP_NAME(termattrs) (NCURSES_SP_DCL0)
+{
+    chtype attrs = A_NORMAL;
+
+    T((T_CALLED("termattrs(%p)"), (void *) SP_PARM));
+
+    if (HasTerminal(SP_PARM)) {
+#ifdef USE_TERM_DRIVER
+	attrs = CallDriver(SP_PARM, td_conattr);
+#else /* ! USE_TERM_DRIVER */
+
+	if (enter_alt_charset_mode)
+	    attrs |= A_ALTCHARSET;
+
+	if (enter_blink_mode)
+	    attrs |= A_BLINK;
+
+	if (enter_bold_mode)
+	    attrs |= A_BOLD;
+
+	if (enter_dim_mode)
+	    attrs |= A_DIM;
+
+	if (enter_reverse_mode)
+	    attrs |= A_REVERSE;
+
+	if (enter_standout_mode)
+	    attrs |= A_STANDOUT;
+
+	if (enter_protected_mode)
+	    attrs |= A_PROTECT;
+
+	if (enter_secure_mode)
+	    attrs |= A_INVIS;
+
+	if (enter_underline_mode)
+	    attrs |= A_UNDERLINE;
+
+	if (SP_PARM->_coloron)
+	    attrs |= A_COLOR;
+
+#if USE_ITALIC
+	if (enter_italics_mode)
+	    attrs |= A_ITALIC;
+#endif
+
+#endif /* USE_TERM_DRIVER */
+    }
+    returnChtype(attrs);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(chtype)
+termattrs(void)
+{
+    return NCURSES_SP_NAME(termattrs) (CURRENT_SCREEN);
+}
+#endif
diff --git a/ncurses/tty/tty_update.c b/ncurses/tty/tty_update.c
new file mode 100644
index 0000000..8081524
--- /dev/null
+++ b/ncurses/tty/tty_update.c
@@ -0,0 +1,2291 @@
+/****************************************************************************
+ * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ *     and: Juergen Pfeifer                         2009                    *
+ ****************************************************************************/
+
+/*-----------------------------------------------------------------
+ *
+ *	lib_doupdate.c
+ *
+ * 	The routine doupdate() and its dependents.
+ * 	All physical output is concentrated here (except _nc_outch()
+ *	in lib_tputs.c).
+ *
+ *-----------------------------------------------------------------*/
+
+#define NEW_PAIR_INTERNAL 1
+
+#include <curses.priv.h>
+
+#ifndef CUR
+#define CUR SP_TERMTYPE
+#endif
+
+#if defined __HAIKU__ && defined __BEOS__
+#undef __BEOS__
+#endif
+
+#ifdef __BEOS__
+#undef false
+#undef true
+#include <OS.h>
+#endif
+
+#if defined(TRACE) && HAVE_SYS_TIMES_H && HAVE_TIMES
+#define USE_TRACE_TIMES 1
+#else
+#define USE_TRACE_TIMES 0
+#endif
+
+#if HAVE_SYS_TIME_H && HAVE_SYS_TIME_SELECT
+#include <sys/time.h>
+#endif
+
+#if USE_TRACE_TIMES
+#include <sys/times.h>
+#endif
+
+#if USE_FUNC_POLL
+#elif HAVE_SELECT
+#if HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
+#endif
+
+#include <ctype.h>
+
+MODULE_ID("$Id: tty_update.c,v 1.314 2022/07/23 22:12:59 tom Exp $")
+
+/*
+ * This define controls the line-breakout optimization.  Every once in a
+ * while during screen refresh, we want to check for input and abort the
+ * update if there's some waiting.  CHECK_INTERVAL controls the number of
+ * changed lines to be emitted between input checks.
+ *
+ * Note: Input-check-and-abort is no longer done if the screen is being
+ * updated from scratch.  This is a feature, not a bug.
+ */
+#define CHECK_INTERVAL	5
+
+#define FILL_BCE(sp) (sp->_coloron && !sp->_default_color && !back_color_erase)
+
+static const NCURSES_CH_T blankchar = NewChar(BLANK_TEXT);
+static NCURSES_CH_T normal = NewChar(BLANK_TEXT);
+
+/*
+ * Enable checking to see if doupdate and friends are tracking the true
+ * cursor position correctly.  NOTE: this is a debugging hack which will
+ * work ONLY on ANSI-compatible terminals!
+ */
+/* #define POSITION_DEBUG */
+
+static NCURSES_INLINE NCURSES_CH_T ClrBlank(NCURSES_SP_DCLx WINDOW *win);
+
+#if NCURSES_SP_FUNCS
+static int ClrBottom(SCREEN *, int total);
+static void ClearScreen(SCREEN *, NCURSES_CH_T blank);
+static void ClrUpdate(SCREEN *);
+static void DelChar(SCREEN *, int count);
+static void InsStr(SCREEN *, NCURSES_CH_T *line, int count);
+static void TransformLine(SCREEN *, int const lineno);
+#else
+static int ClrBottom(int total);
+static void ClearScreen(NCURSES_CH_T blank);
+static void ClrUpdate(void);
+static void DelChar(int count);
+static void InsStr(NCURSES_CH_T *line, int count);
+static void TransformLine(int const lineno);
+#endif
+
+#ifdef POSITION_DEBUG
+/****************************************************************************
+ *
+ * Debugging code.  Only works on ANSI-standard terminals.
+ *
+ ****************************************************************************/
+
+static void
+position_check(NCURSES_SP_DCLx int expected_y, int expected_x, const char *legend)
+/* check to see if the real cursor position matches the virtual */
+{
+    char buf[20];
+    char *s;
+    int y, x;
+
+    if (!_nc_tracing || (expected_y < 0 && expected_x < 0))
+	return;
+
+    NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_ARG);
+    memset(buf, '\0', sizeof(buf));
+    NCURSES_PUTP2_FLUSH("cpr", "\033[6n");	/* only works on ANSI-compatibles */
+    *(s = buf) = 0;
+    do {
+	int ask = sizeof(buf) - 1 - (s - buf);
+	int got = read(0, s, ask);
+	if (got == 0)
+	    break;
+	s += got;
+    } while (strchr(buf, 'R') == 0);
+    _tracef("probe returned %s", _nc_visbuf(buf));
+
+    /* try to interpret as a position report */
+    if (sscanf(buf, "\033[%d;%dR", &y, &x) != 2) {
+	_tracef("position probe failed in %s", legend);
+    } else {
+	if (expected_x < 0)
+	    expected_x = x - 1;
+	if (expected_y < 0)
+	    expected_y = y - 1;
+	if (y - 1 != expected_y || x - 1 != expected_x) {
+	    NCURSES_SP_NAME(beep) (NCURSES_SP_ARG);
+	    NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx
+				    TIPARM_2("\033[%d;%dH",
+					     expected_y + 1,
+					     expected_x + 1),
+				    1, NCURSES_SP_NAME(_nc_outch));
+	    _tracef("position seen (%d, %d) doesn't match expected one (%d, %d) in %s",
+		    y - 1, x - 1, expected_y, expected_x, legend);
+	} else {
+	    _tracef("position matches OK in %s", legend);
+	}
+    }
+}
+#else
+#define position_check(expected_y, expected_x, legend)	/* nothing */
+#endif /* POSITION_DEBUG */
+
+/****************************************************************************
+ *
+ * Optimized update code
+ *
+ ****************************************************************************/
+
+static NCURSES_INLINE void
+GoTo(NCURSES_SP_DCLx int const row, int const col)
+{
+    TR(TRACE_MOVE, ("GoTo(%p, %d, %d) from (%d, %d)",
+		    (void *) SP_PARM, row, col, SP_PARM->_cursrow, SP_PARM->_curscol));
+
+    position_check(NCURSES_SP_ARGx
+		   SP_PARM->_cursrow,
+		   SP_PARM->_curscol, "GoTo");
+
+    TINFO_MVCUR(NCURSES_SP_ARGx
+		SP_PARM->_cursrow,
+		SP_PARM->_curscol,
+		row, col);
+    position_check(NCURSES_SP_ARGx
+		   SP_PARM->_cursrow,
+		   SP_PARM->_curscol, "GoTo2");
+}
+
+#if !NCURSES_WCWIDTH_GRAPHICS
+#define is_wacs_value(ch) (_nc_wacs_width(ch) == 1 && wcwidth(ch) > 1)
+#endif /* !NCURSES_WCWIDTH_GRAPHICS */
+
+static NCURSES_INLINE void
+PutAttrChar(NCURSES_SP_DCLx CARG_CH_T ch)
+{
+    int chlen = 1;
+    NCURSES_CH_T my_ch;
+#if USE_WIDEC_SUPPORT
+    PUTC_DATA;
+#endif
+    NCURSES_CH_T tilde;
+    NCURSES_CH_T attr = CHDEREF(ch);
+
+    TR(TRACE_CHARPUT, ("PutAttrChar(%s) at (%d, %d)",
+		       _tracech_t(ch),
+		       SP_PARM->_cursrow, SP_PARM->_curscol));
+#if USE_WIDEC_SUPPORT
+    /*
+     * If this is not a valid character, there is nothing more to do.
+     */
+    if (isWidecExt(CHDEREF(ch))) {
+	TR(TRACE_CHARPUT, ("...skip"));
+	return;
+    }
+    /*
+     * Determine the number of character cells which the 'ch' value will use
+     * on the screen.  It should be at least one.
+     */
+    if ((chlen = _nc_wacs_width(CharOf(CHDEREF(ch)))) <= 0) {
+	static const NCURSES_CH_T blank = NewChar(BLANK_TEXT);
+
+	/*
+	 * If the character falls into any of these special cases, do
+	 * not force the result to a blank:
+	 *
+	 * a) it is printable (this works around a bug in wcwidth()).
+	 * b) use_legacy_coding() has been called to modify the treatment
+	 *    of codes 128-255.
+	 * c) the acs_map[] has been initialized to allow codes 0-31
+	 *    to be rendered.  This supports Linux console's "PC"
+	 *    characters.  Codes 128-255 are allowed though this is
+	 *    not checked.
+	 */
+	if (is8bits(CharOf(CHDEREF(ch)))
+	    && (isprint(CharOf(CHDEREF(ch)))
+		|| (SP_PARM->_legacy_coding > 0 && CharOf(CHDEREF(ch)) >= 160)
+		|| (SP_PARM->_legacy_coding > 1 && CharOf(CHDEREF(ch)) >= 128)
+		|| (AttrOf(attr) & A_ALTCHARSET
+		    && ((CharOfD(ch) < ACS_LEN
+			 && SP_PARM->_acs_map != 0
+			 && SP_PARM->_acs_map[CharOfD(ch)] != 0)
+			|| (CharOfD(ch) >= 128))))) {
+	    ;
+	} else {
+	    ch = CHREF(blank);
+	    TR(TRACE_CHARPUT, ("forced to blank"));
+	}
+	chlen = 1;
+    }
+#endif
+
+    if ((AttrOf(attr) & A_ALTCHARSET)
+	&& SP_PARM->_acs_map != 0
+	&& ((CharOfD(ch) < ACS_LEN)
+#if !NCURSES_WCWIDTH_GRAPHICS
+	    || is_wacs_value(CharOfD(ch))
+#endif
+	)) {
+	int c8;
+	my_ch = CHDEREF(ch);	/* work around const param */
+	c8 = CharOf(my_ch);
+#if USE_WIDEC_SUPPORT
+	/*
+	 * This is crude & ugly, but works most of the time.  It checks if the
+	 * acs_chars string specified that we have a mapping for this
+	 * character, and uses the wide-character mapping when we expect the
+	 * normal one to be broken (by mis-design ;-).
+	 */
+	if (SP_PARM->_screen_unicode
+	    && _nc_wacs[CharOf(my_ch)].chars[0]) {
+	    if (SP_PARM->_screen_acs_map[CharOf(my_ch)]) {
+		if (SP_PARM->_screen_acs_fix) {
+		    RemAttr(attr, A_ALTCHARSET);
+		    my_ch = _nc_wacs[CharOf(my_ch)];
+		}
+	    } else {
+		RemAttr(attr, A_ALTCHARSET);
+		my_ch = _nc_wacs[CharOf(my_ch)];
+	    }
+#if !NCURSES_WCWIDTH_GRAPHICS
+	    if (!(AttrOf(attr) & A_ALTCHARSET)) {
+		chlen = 1;
+	    }
+#endif /* !NCURSES_WCWIDTH_GRAPHICS */
+	} else
+#endif
+	if (!SP_PARM->_screen_acs_map[c8]) {
+	    /*
+	     * If we found no mapping for a given alternate-character set item
+	     * in the terminal description, attempt to use the ASCII fallback
+	     * code which is populated in the _acs_map[] array.  If that did
+	     * not correspond to a line-drawing, etc., graphics character, the
+	     * array entry would be empty.
+	     */
+	    chtype temp = UChar(SP_PARM->_acs_map[c8]);
+	    if (temp) {
+		RemAttr(attr, A_ALTCHARSET);
+		SetChar(my_ch, temp, AttrOf(attr));
+	    }
+	}
+
+	/*
+	 * If we (still) have alternate character set, it is the normal 8bit
+	 * flavor.  The _screen_acs_map[] array tells if the character was
+	 * really in acs_chars, needed because of the way wide/normal line
+	 * drawing flavors are integrated.
+	 */
+	if (AttrOf(attr) & A_ALTCHARSET) {
+	    int j = CharOfD(ch);
+	    chtype temp = UChar(SP_PARM->_acs_map[j]);
+
+	    if (temp != 0) {
+		SetChar(my_ch, temp, AttrOf(attr));
+	    } else {
+		my_ch = CHDEREF(ch);
+		RemAttr(attr, A_ALTCHARSET);
+	    }
+	}
+	ch = CHREF(my_ch);
+    }
+#if USE_WIDEC_SUPPORT && !NCURSES_WCWIDTH_GRAPHICS
+    else if (chlen > 1 && is_wacs_value(CharOfD(ch))) {
+	chlen = 1;
+    }
+#endif
+    if (tilde_glitch && (CharOfD(ch) == L('~'))) {
+	SetChar(tilde, L('`'), AttrOf(attr));
+	ch = CHREF(tilde);
+    }
+
+    UpdateAttrs(SP_PARM, attr);
+    PUTC(CHDEREF(ch));
+#if !USE_WIDEC_SUPPORT
+    COUNT_OUTCHARS(1);
+#endif
+    SP_PARM->_curscol += chlen;
+    if (char_padding) {
+	NCURSES_PUTP2("char_padding", char_padding);
+    }
+}
+
+static bool
+check_pending(NCURSES_SP_DCL0)
+/* check for pending input */
+{
+    bool have_pending = FALSE;
+
+    /*
+     * Only carry out this check when the flag is zero, otherwise we'll
+     * have the refreshing slow down drastically (or stop) if there's an
+     * unread character available.
+     */
+    if (SP_PARM->_fifohold != 0)
+	return FALSE;
+
+    if (SP_PARM->_checkfd >= 0) {
+#if USE_FUNC_POLL
+	struct pollfd fds[1];
+	fds[0].fd = SP_PARM->_checkfd;
+	fds[0].events = POLLIN;
+	if (poll(fds, (size_t) 1, 0) > 0) {
+	    have_pending = TRUE;
+	}
+#elif defined(__BEOS__)
+	/*
+	 * BeOS's select() is declared in socket.h, so the configure script does
+	 * not see it.  That's just as well, since that function works only for
+	 * sockets.  This (using snooze and ioctl) was distilled from Be's patch
+	 * for ncurses which uses a separate thread to simulate select().
+	 *
+	 * FIXME: the return values from the ioctl aren't very clear if we get
+	 * interrupted.
+	 */
+	int n = 0;
+	int howmany = ioctl(0, 'ichr', &n);
+	if (howmany >= 0 && n > 0) {
+	    have_pending = TRUE;
+	}
+#elif HAVE_SELECT
+	fd_set fdset;
+	struct timeval ktimeout;
+
+	ktimeout.tv_sec =
+	    ktimeout.tv_usec = 0;
+
+	FD_ZERO(&fdset);
+	FD_SET(SP_PARM->_checkfd, &fdset);
+	if (select(SP_PARM->_checkfd + 1, &fdset, NULL, NULL, &ktimeout) != 0) {
+	    have_pending = TRUE;
+	}
+#endif
+    }
+    if (have_pending) {
+	SP_PARM->_fifohold = 5;
+	NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_ARG);
+    }
+    return FALSE;
+}
+
+/* put char at lower right corner */
+static void
+PutCharLR(NCURSES_SP_DCLx const ARG_CH_T ch)
+{
+    if (!auto_right_margin) {
+	/* we can put the char directly */
+	PutAttrChar(NCURSES_SP_ARGx ch);
+    } else if (enter_am_mode && exit_am_mode) {
+	int oldcol = SP_PARM->_curscol;
+	/* we can suppress automargin */
+	NCURSES_PUTP2("exit_am_mode", exit_am_mode);
+
+	PutAttrChar(NCURSES_SP_ARGx ch);
+	SP_PARM->_curscol = oldcol;
+	position_check(NCURSES_SP_ARGx
+		       SP_PARM->_cursrow,
+		       SP_PARM->_curscol,
+		       "exit_am_mode");
+
+	NCURSES_PUTP2("enter_am_mode", enter_am_mode);
+    } else if ((enter_insert_mode && exit_insert_mode)
+	       || insert_character || parm_ich) {
+	GoTo(NCURSES_SP_ARGx
+	     screen_lines(SP_PARM) - 1,
+	     screen_columns(SP_PARM) - 2);
+	PutAttrChar(NCURSES_SP_ARGx ch);
+	GoTo(NCURSES_SP_ARGx
+	     screen_lines(SP_PARM) - 1,
+	     screen_columns(SP_PARM) - 2);
+	InsStr(NCURSES_SP_ARGx
+	       NewScreen(SP_PARM)->_line[screen_lines(SP_PARM) - 1].text +
+	       screen_columns(SP_PARM) - 2, 1);
+    }
+}
+
+/*
+ * Wrap the cursor position, i.e., advance to the beginning of the next line.
+ */
+static void
+wrap_cursor(NCURSES_SP_DCL0)
+{
+    if (eat_newline_glitch) {
+	/*
+	 * xenl can manifest two different ways.  The vt100 way is that, when
+	 * you'd expect the cursor to wrap, it stays hung at the right margin
+	 * (on top of the character just emitted) and doesn't wrap until the
+	 * *next* graphic char is emitted.  The c100 way is to ignore LF
+	 * received just after an am wrap.
+	 *
+	 * An aggressive way to handle this would be to emit CR/LF after the
+	 * char and then assume the wrap is done, you're on the first position
+	 * of the next line, and the terminal out of its weird state.  Here
+	 * it is safe to just tell the code that the cursor is in hyperspace and
+	 * let the next mvcur() call straighten things out.
+	 */
+	SP_PARM->_curscol = -1;
+	SP_PARM->_cursrow = -1;
+    } else if (auto_right_margin) {
+	SP_PARM->_curscol = 0;
+	SP_PARM->_cursrow++;
+	/*
+	 * We've actually moved - but may have to work around problems with
+	 * video attributes not working.
+	 */
+	if (!move_standout_mode && AttrOf(SCREEN_ATTRS(SP_PARM))) {
+	    TR(TRACE_CHARPUT, ("turning off (%#lx) %s before wrapping",
+			       (unsigned long) AttrOf(SCREEN_ATTRS(SP_PARM)),
+			       _traceattr(AttrOf(SCREEN_ATTRS(SP_PARM)))));
+	    VIDPUTS(SP_PARM, A_NORMAL, 0);
+	}
+    } else {
+	SP_PARM->_curscol--;
+    }
+    position_check(NCURSES_SP_ARGx
+		   SP_PARM->_cursrow,
+		   SP_PARM->_curscol,
+		   "wrap_cursor");
+}
+
+static NCURSES_INLINE void
+PutChar(NCURSES_SP_DCLx const ARG_CH_T ch)
+/* insert character, handling automargin stuff */
+{
+    if (SP_PARM->_cursrow == screen_lines(SP_PARM) - 1 &&
+	SP_PARM->_curscol == screen_columns(SP_PARM) - 1) {
+	PutCharLR(NCURSES_SP_ARGx ch);
+    } else {
+	PutAttrChar(NCURSES_SP_ARGx ch);
+    }
+
+    if (SP_PARM->_curscol >= screen_columns(SP_PARM))
+	wrap_cursor(NCURSES_SP_ARG);
+
+    position_check(NCURSES_SP_ARGx
+		   SP_PARM->_cursrow,
+		   SP_PARM->_curscol, "PutChar");
+}
+
+/*
+ * Check whether the given character can be output by clearing commands.  This
+ * includes test for being a space and not including any 'bad' attributes, such
+ * as A_REVERSE.  All attribute flags which don't affect appearance of a space
+ * or can be output by clearing (A_COLOR in case of bce-terminal) are excluded.
+ */
+static NCURSES_INLINE bool
+can_clear_with(NCURSES_SP_DCLx ARG_CH_T ch)
+{
+    if (!back_color_erase && SP_PARM->_coloron) {
+#if NCURSES_EXT_FUNCS
+	int pair;
+
+	if (!SP_PARM->_default_color)
+	    return FALSE;
+	if (!(isDefaultColor(SP_PARM->_default_fg) &&
+	      isDefaultColor(SP_PARM->_default_bg)))
+	    return FALSE;
+	if ((pair = GetPair(CHDEREF(ch))) != 0) {
+	    NCURSES_COLOR_T fg, bg;
+	    if (NCURSES_SP_NAME(pair_content) (NCURSES_SP_ARGx
+					       (short) pair,
+					       &fg, &bg) == ERR
+		|| !(isDefaultColor(fg) && isDefaultColor(bg))) {
+		return FALSE;
+	    }
+	}
+#else
+	if (AttrOfD(ch) & A_COLOR)
+	    return FALSE;
+#endif
+    }
+    return (ISBLANK(CHDEREF(ch)) &&
+	    (AttrOfD(ch) & ~(NONBLANK_ATTR | A_COLOR)) == BLANK_ATTR);
+}
+
+/*
+ * Issue a given span of characters from an array.
+ * Must be functionally equivalent to:
+ *	for (i = 0; i < num; i++)
+ *	    PutChar(ntext[i]);
+ * but can leave the cursor positioned at the middle of the interval.
+ *
+ * Returns: 0 - cursor is at the end of interval
+ *	    1 - cursor is somewhere in the middle
+ *
+ * This code is optimized using ech and rep.
+ */
+static int
+EmitRange(NCURSES_SP_DCLx const NCURSES_CH_T *ntext, int num)
+{
+    int i;
+
+    TR(TRACE_CHARPUT, ("EmitRange %d:%s", num, _nc_viscbuf(ntext, num)));
+
+    if (erase_chars || repeat_char) {
+	while (num > 0) {
+	    int runcount;
+	    NCURSES_CH_T ntext0;
+
+	    while (num > 1 && !CharEq(ntext[0], ntext[1])) {
+		PutChar(NCURSES_SP_ARGx CHREF(ntext[0]));
+		ntext++;
+		num--;
+	    }
+	    ntext0 = ntext[0];
+	    if (num == 1) {
+		PutChar(NCURSES_SP_ARGx CHREF(ntext0));
+		return 0;
+	    }
+	    runcount = 2;
+
+	    while (runcount < num && CharEq(ntext[runcount], ntext0))
+		runcount++;
+
+	    /*
+	     * The cost expression in the middle isn't exactly right.
+	     * _cup_ch_cost is an upper bound on the cost for moving to the
+	     * end of the erased area, but not the cost itself (which we
+	     * can't compute without emitting the move).  This may result
+	     * in erase_chars not getting used in some situations for
+	     * which it would be marginally advantageous.
+	     */
+	    if (erase_chars
+		&& runcount > SP_PARM->_ech_cost + SP_PARM->_cup_ch_cost
+		&& can_clear_with(NCURSES_SP_ARGx CHREF(ntext0))) {
+		UpdateAttrs(SP_PARM, ntext0);
+		NCURSES_PUTP2("erase_chars", TIPARM_1(erase_chars, runcount));
+
+		/*
+		 * If this is the last part of the given interval,
+		 * don't bother moving cursor, since it can be the
+		 * last update on the line.
+		 */
+		if (runcount < num) {
+		    GoTo(NCURSES_SP_ARGx
+			 SP_PARM->_cursrow,
+			 SP_PARM->_curscol + runcount);
+		} else {
+		    return 1;	/* cursor stays in the middle */
+		}
+	    } else if (repeat_char != 0 &&
+#if BSD_TPUTS
+		       !isdigit(UChar(CharOf(ntext0))) &&
+#endif
+#if USE_WIDEC_SUPPORT
+		       (!SP_PARM->_screen_unicode &&
+			(CharOf(ntext0) < ((AttrOf(ntext0) & A_ALTCHARSET)
+					   ? ACS_LEN
+					   : 256))) &&
+#endif
+		       runcount > SP_PARM->_rep_cost) {
+		NCURSES_CH_T temp;
+		bool wrap_possible = (SP_PARM->_curscol + runcount >=
+				      screen_columns(SP_PARM));
+		int rep_count = runcount;
+
+		if (wrap_possible)
+		    rep_count--;
+
+		UpdateAttrs(SP_PARM, ntext0);
+		temp = ntext0;
+		if ((AttrOf(temp) & A_ALTCHARSET) &&
+		    SP_PARM->_acs_map != 0 &&
+		    (SP_PARM->_acs_map[CharOf(temp)] & A_CHARTEXT) != 0) {
+		    SetChar(temp,
+			    (SP_PARM->_acs_map[CharOf(ntext0)] & A_CHARTEXT),
+			    AttrOf(ntext0) | A_ALTCHARSET);
+		}
+		NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx
+					TIPARM_2(repeat_char,
+						 CharOf(temp),
+						 rep_count),
+					1,
+					NCURSES_SP_NAME(_nc_outch));
+		SP_PARM->_curscol += rep_count;
+
+		if (wrap_possible)
+		    PutChar(NCURSES_SP_ARGx CHREF(ntext0));
+	    } else {
+		for (i = 0; i < runcount; i++)
+		    PutChar(NCURSES_SP_ARGx CHREF(ntext[i]));
+	    }
+	    ntext += runcount;
+	    num -= runcount;
+	}
+	return 0;
+    }
+
+    for (i = 0; i < num; i++)
+	PutChar(NCURSES_SP_ARGx CHREF(ntext[i]));
+    return 0;
+}
+
+/*
+ * Output the line in the given range [first .. last]
+ *
+ * If there's a run of identical characters that's long enough to justify
+ * cursor movement, use that also.
+ *
+ * Returns: same as EmitRange
+ */
+static int
+PutRange(NCURSES_SP_DCLx
+	 const NCURSES_CH_T *otext,
+	 const NCURSES_CH_T *ntext,
+	 int row,
+	 int first, int last)
+{
+    int rc;
+
+    TR(TRACE_CHARPUT, ("PutRange(%p, %p, %p, %d, %d, %d)",
+		       (void *) SP_PARM,
+		       (const void *) otext,
+		       (const void *) ntext,
+		       row, first, last));
+
+    if (otext != ntext
+	&& (last - first + 1) > SP_PARM->_inline_cost) {
+	int i, j, same;
+
+	for (j = first, same = 0; j <= last; j++) {
+	    if (!same && isWidecExt(otext[j]))
+		continue;
+	    if (CharEq(otext[j], ntext[j])) {
+		same++;
+	    } else {
+		if (same > SP_PARM->_inline_cost) {
+		    EmitRange(NCURSES_SP_ARGx ntext + first, j - same - first);
+		    GoTo(NCURSES_SP_ARGx row, first = j);
+		}
+		same = 0;
+	    }
+	}
+	i = EmitRange(NCURSES_SP_ARGx ntext + first, j - same - first);
+	/*
+	 * Always return 1 for the next GoTo() after a PutRange() if we found
+	 * identical characters at end of interval
+	 */
+	rc = (same == 0 ? i : 1);
+    } else {
+	rc = EmitRange(NCURSES_SP_ARGx ntext + first, last - first + 1);
+    }
+    return rc;
+}
+
+/* leave unbracketed here so 'indent' works */
+#define MARK_NOCHANGE(win,row) \
+		win->_line[row].firstchar = _NOCHANGE; \
+		win->_line[row].lastchar = _NOCHANGE; \
+		if_USE_SCROLL_HINTS(win->_line[row].oldindex = row)
+
+NCURSES_EXPORT(int)
+TINFO_DOUPDATE(NCURSES_SP_DCL0)
+{
+    int i;
+    int nonempty;
+#if USE_TRACE_TIMES
+    struct tms before, after;
+#endif /* USE_TRACE_TIMES */
+
+    T((T_CALLED("_nc_tinfo:doupdate(%p)"), (void *) SP_PARM));
+
+    _nc_lock_global(update);
+
+    if (SP_PARM == 0) {
+	_nc_unlock_global(update);
+	returnCode(ERR);
+    }
+#if !USE_REENTRANT
+    /*
+     * It is "legal" but unlikely that an application could assign a new
+     * value to one of the standard windows.  Check for that possibility
+     * and try to recover.
+     *
+     * We do not allow applications to assign new values in the reentrant
+     * model.
+     */
+#if NCURSES_SP_FUNCS
+    if (SP_PARM == CURRENT_SCREEN) {
+#endif
+#define SyncScreens(internal,exported) \
+	if (internal == 0) internal = exported; \
+	if (internal != exported) exported = internal
+
+	SyncScreens(CurScreen(SP_PARM), curscr);
+	SyncScreens(NewScreen(SP_PARM), newscr);
+	SyncScreens(StdScreen(SP_PARM), stdscr);
+#if NCURSES_SP_FUNCS
+    }
+#endif
+#endif /* !USE_REENTRANT */
+
+    if (CurScreen(SP_PARM) == 0
+	|| NewScreen(SP_PARM) == 0
+	|| StdScreen(SP_PARM) == 0) {
+	_nc_unlock_global(update);
+	returnCode(ERR);
+    }
+#ifdef TRACE
+    if (USE_TRACEF(TRACE_UPDATE)) {
+	if (CurScreen(SP_PARM)->_clear)
+	    _tracef("curscr is clear");
+	else
+	    _tracedump("curscr", CurScreen(SP_PARM));
+	_tracedump("newscr", NewScreen(SP_PARM));
+	_nc_unlock_global(tracef);
+    }
+#endif /* TRACE */
+
+    _nc_signal_handler(FALSE);
+
+    if (SP_PARM->_fifohold)
+	SP_PARM->_fifohold--;
+
+#if USE_SIZECHANGE
+    if ((SP_PARM->_endwin == ewSuspend)
+	|| _nc_handle_sigwinch(SP_PARM)) {
+	/*
+	 * This is a transparent extension:  XSI does not address it,
+	 * and applications need not know that ncurses can do it.
+	 *
+	 * Check if the terminal size has changed while curses was off
+	 * (this can happen in an xterm, for example), and resize the
+	 * ncurses data structures accordingly.
+	 */
+	_nc_update_screensize(SP_PARM);
+    }
+#endif
+
+    if (SP_PARM->_endwin == ewSuspend) {
+
+	T(("coming back from shell mode"));
+	NCURSES_SP_NAME(reset_prog_mode) (NCURSES_SP_ARG);
+
+	NCURSES_SP_NAME(_nc_mvcur_resume) (NCURSES_SP_ARG);
+	NCURSES_SP_NAME(_nc_screen_resume) (NCURSES_SP_ARG);
+	SP_PARM->_mouse_resume(SP_PARM);
+
+	SP_PARM->_endwin = ewRunning;
+    }
+#if USE_TRACE_TIMES
+    /* zero the metering machinery */
+    RESET_OUTCHARS();
+    (void) times(&before);
+#endif /* USE_TRACE_TIMES */
+
+    /*
+     * This is the support for magic-cookie terminals.  The theory:  we scan
+     * the virtual screen looking for attribute turnons.  Where we find one,
+     * check to make sure it is realizable by seeing if the required number of
+     * un-attributed blanks are present before and after the attributed range;
+     * try to shift the range boundaries over blanks (not changing the screen
+     * display) so this becomes true.  If it is, shift the beginning attribute
+     * change appropriately (the end one, if we've gotten this far, is
+     * guaranteed room for its cookie).  If not, nuke the added attributes out
+     * of the span.
+     */
+#if USE_XMC_SUPPORT
+    if (magic_cookie_glitch > 0) {
+	int j, k;
+	attr_t rattr = A_NORMAL;
+
+	for (i = 0; i < screen_lines(SP_PARM); i++) {
+	    for (j = 0; j < screen_columns(SP_PARM); j++) {
+		bool failed = FALSE;
+		NCURSES_CH_T *thisline = NewScreen(SP_PARM)->_line[i].text;
+		attr_t thisattr = AttrOf(thisline[j]) & SP_PARM->_xmc_triggers;
+		attr_t turnon = thisattr & ~rattr;
+
+		/* is an attribute turned on here? */
+		if (turnon == 0) {
+		    rattr = thisattr;
+		    continue;
+		}
+
+		TR(TRACE_ATTRS, ("At (%d, %d): from %s...", i, j, _traceattr(rattr)));
+		TR(TRACE_ATTRS, ("...to %s", _traceattr(turnon)));
+
+		/*
+		 * If the attribute change location is a blank with a "safe"
+		 * attribute, undo the attribute turnon.  This may ensure
+		 * there's enough room to set the attribute before the first
+		 * non-blank in the run.
+		 */
+#define SAFE(scr,a)	(!((a) & (scr)->_xmc_triggers))
+		if (ISBLANK(thisline[j]) && SAFE(SP_PARM, turnon)) {
+		    RemAttr(thisline[j], turnon);
+		    continue;
+		}
+
+		/* check that there's enough room at start of span */
+		for (k = 1; k <= magic_cookie_glitch; k++) {
+		    if (j - k < 0
+			|| !ISBLANK(thisline[j - k])
+			|| !SAFE(SP_PARM, AttrOf(thisline[j - k]))) {
+			failed = TRUE;
+			TR(TRACE_ATTRS, ("No room at start in %d,%d%s%s",
+					 i, j - k,
+					 (ISBLANK(thisline[j - k])
+					  ? ""
+					  : ":nonblank"),
+					 (SAFE(SP_PARM, AttrOf(thisline[j - k]))
+					  ? ""
+					  : ":unsafe")));
+			break;
+		    }
+		}
+		if (!failed) {
+		    bool end_onscreen = FALSE;
+		    int m, n = j;
+
+		    /* find end of span, if it is onscreen */
+		    for (m = i; m < screen_lines(SP_PARM); m++) {
+			for (; n < screen_columns(SP_PARM); n++) {
+			    attr_t testattr =
+			    AttrOf(NewScreen(SP_PARM)->_line[m].text[n]);
+			    if ((testattr & SP_PARM->_xmc_triggers) == rattr) {
+				end_onscreen = TRUE;
+				TR(TRACE_ATTRS,
+				   ("Range attributed with %s ends at (%d, %d)",
+				    _traceattr(turnon), m, n));
+				goto foundit;
+			    }
+			}
+			n = 0;
+		    }
+		    TR(TRACE_ATTRS,
+		       ("Range attributed with %s ends offscreen",
+			_traceattr(turnon)));
+		  foundit:;
+
+		    if (end_onscreen) {
+			NCURSES_CH_T *lastline =
+			NewScreen(SP_PARM)->_line[m].text;
+
+			/*
+			 * If there are safely-attributed blanks at the end of
+			 * the range, shorten the range.  This will help ensure
+			 * that there is enough room at end of span.
+			 */
+			while (n >= 0
+			       && ISBLANK(lastline[n])
+			       && SAFE(SP_PARM, AttrOf(lastline[n]))) {
+			    RemAttr(lastline[n--], turnon);
+			}
+
+			/* check that there's enough room at end of span */
+			for (k = 1; k <= magic_cookie_glitch; k++) {
+			    if (n + k >= screen_columns(SP_PARM)
+				|| !ISBLANK(lastline[n + k])
+				|| !SAFE(SP_PARM, AttrOf(lastline[n + k]))) {
+				failed = TRUE;
+				TR(TRACE_ATTRS,
+				   ("No room at end in %d,%d%s%s",
+				    i, j - k,
+				    (ISBLANK(lastline[n + k])
+				     ? ""
+				     : ":nonblank"),
+				    (SAFE(SP_PARM, AttrOf(lastline[n + k]))
+				     ? ""
+				     : ":unsafe")));
+				break;
+			    }
+			}
+		    }
+		}
+
+		if (failed) {
+		    int p, q = j;
+
+		    TR(TRACE_ATTRS,
+		       ("Clearing %s beginning at (%d, %d)",
+			_traceattr(turnon), i, j));
+
+		    /* turn off new attributes over span */
+		    for (p = i; p < screen_lines(SP_PARM); p++) {
+			for (; q < screen_columns(SP_PARM); q++) {
+			    attr_t testattr = AttrOf(newscr->_line[p].text[q]);
+			    if ((testattr & SP_PARM->_xmc_triggers) == rattr)
+				goto foundend;
+			    RemAttr(NewScreen(SP_PARM)->_line[p].text[q], turnon);
+			}
+			q = 0;
+		    }
+		  foundend:;
+		} else {
+		    TR(TRACE_ATTRS,
+		       ("Cookie space for %s found before (%d, %d)",
+			_traceattr(turnon), i, j));
+
+		    /*
+		     * Back up the start of range so there's room for cookies
+		     * before the first nonblank character.
+		     */
+		    for (k = 1; k <= magic_cookie_glitch; k++)
+			AddAttr(thisline[j - k], turnon);
+		}
+
+		rattr = thisattr;
+	    }
+	}
+
+#ifdef TRACE
+	/* show altered highlights after magic-cookie check */
+	if (USE_TRACEF(TRACE_UPDATE)) {
+	    _tracef("After magic-cookie check...");
+	    _tracedump("newscr", NewScreen(SP_PARM));
+	    _nc_unlock_global(tracef);
+	}
+#endif /* TRACE */
+    }
+#endif /* USE_XMC_SUPPORT */
+
+    nonempty = 0;
+    if (CurScreen(SP_PARM)->_clear || NewScreen(SP_PARM)->_clear) {	/* force refresh ? */
+	ClrUpdate(NCURSES_SP_ARG);
+	CurScreen(SP_PARM)->_clear = FALSE;	/* reset flag */
+	NewScreen(SP_PARM)->_clear = FALSE;	/* reset flag */
+    } else {
+	int changedlines = CHECK_INTERVAL;
+
+	if (check_pending(NCURSES_SP_ARG))
+	    goto cleanup;
+
+	nonempty = min(screen_lines(SP_PARM), NewScreen(SP_PARM)->_maxy + 1);
+
+	if (SP_PARM->_scrolling) {
+	    NCURSES_SP_NAME(_nc_scroll_optimize) (NCURSES_SP_ARG);
+	}
+
+	nonempty = ClrBottom(NCURSES_SP_ARGx nonempty);
+
+	TR(TRACE_UPDATE, ("Transforming lines, nonempty %d", nonempty));
+	for (i = 0; i < nonempty; i++) {
+	    /*
+	     * Here is our line-breakout optimization.
+	     */
+	    if (changedlines == CHECK_INTERVAL) {
+		if (check_pending(NCURSES_SP_ARG))
+		    goto cleanup;
+		changedlines = 0;
+	    }
+
+	    /*
+	     * newscr->line[i].firstchar is normally set
+	     * by wnoutrefresh.  curscr->line[i].firstchar
+	     * is normally set by _nc_scroll_window in the
+	     * vertical-movement optimization code,
+	     */
+	    if (NewScreen(SP_PARM)->_line[i].firstchar != _NOCHANGE
+		|| CurScreen(SP_PARM)->_line[i].firstchar != _NOCHANGE) {
+		TransformLine(NCURSES_SP_ARGx i);
+		changedlines++;
+	    }
+
+	    /* mark line changed successfully */
+	    if (i <= NewScreen(SP_PARM)->_maxy) {
+		MARK_NOCHANGE(NewScreen(SP_PARM), i);
+	    }
+	    if (i <= CurScreen(SP_PARM)->_maxy) {
+		MARK_NOCHANGE(CurScreen(SP_PARM), i);
+	    }
+	}
+    }
+
+    /* put everything back in sync */
+    for (i = nonempty; i <= NewScreen(SP_PARM)->_maxy; i++) {
+	MARK_NOCHANGE(NewScreen(SP_PARM), i);
+    }
+    for (i = nonempty; i <= CurScreen(SP_PARM)->_maxy; i++) {
+	MARK_NOCHANGE(CurScreen(SP_PARM), i);
+    }
+
+    if (!NewScreen(SP_PARM)->_leaveok) {
+	CurScreen(SP_PARM)->_curx = NewScreen(SP_PARM)->_curx;
+	CurScreen(SP_PARM)->_cury = NewScreen(SP_PARM)->_cury;
+
+	GoTo(NCURSES_SP_ARGx CurScreen(SP_PARM)->_cury, CurScreen(SP_PARM)->_curx);
+    }
+
+  cleanup:
+    /*
+     * We would like to keep the physical screen in normal mode in case we get
+     * other processes writing to the screen.  This goal cannot be met for
+     * magic cookies since it interferes with attributes that may propagate
+     * past the current position.
+     */
+#if USE_XMC_SUPPORT
+    if (magic_cookie_glitch != 0)
+#endif
+	UpdateAttrs(SP_PARM, normal);
+
+    NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_ARG);
+    WINDOW_ATTRS(CurScreen(SP_PARM)) = WINDOW_ATTRS(NewScreen(SP_PARM));
+
+#if USE_TRACE_TIMES
+    (void) times(&after);
+    TR(TRACE_TIMES,
+       ("Update cost: %ld chars, %ld clocks system time, %ld clocks user time",
+	_nc_outchars,
+	(long) (after.tms_stime - before.tms_stime),
+	(long) (after.tms_utime - before.tms_utime)));
+#endif /* USE_TRACE_TIMES */
+
+    _nc_signal_handler(TRUE);
+
+    _nc_unlock_global(update);
+    returnCode(OK);
+}
+
+#if NCURSES_SP_FUNCS && !defined(USE_TERM_DRIVER)
+NCURSES_EXPORT(int)
+doupdate(void)
+{
+    return TINFO_DOUPDATE(CURRENT_SCREEN);
+}
+#endif
+
+/*
+ *	ClrBlank(win)
+ *
+ *	Returns the attributed character that corresponds to the "cleared"
+ *	screen.  If the terminal has the back-color-erase feature, this will be
+ *	colored according to the wbkgd() call.
+ *
+ *	We treat 'curscr' specially because it isn't supposed to be set directly
+ *	in the wbkgd() call.  Assume 'stdscr' for this case.
+ */
+#define BCE_ATTRS (A_NORMAL|A_COLOR)
+#define BCE_BKGD(sp,win) (((win) == CurScreen(sp) ? StdScreen(sp) : (win))->_nc_bkgd)
+
+static NCURSES_INLINE NCURSES_CH_T
+ClrBlank(NCURSES_SP_DCLx WINDOW *win)
+{
+    NCURSES_CH_T blank = blankchar;
+    if (back_color_erase)
+	AddAttr(blank, (AttrOf(BCE_BKGD(SP_PARM, win)) & BCE_ATTRS));
+    return blank;
+}
+
+/*
+**	ClrUpdate()
+**
+**	Update by clearing and redrawing the entire screen.
+**
+*/
+
+static void
+ClrUpdate(NCURSES_SP_DCL0)
+{
+    TR(TRACE_UPDATE, (T_CALLED("ClrUpdate")));
+    if (0 != SP_PARM) {
+	int i;
+	NCURSES_CH_T blank = ClrBlank(NCURSES_SP_ARGx StdScreen(SP_PARM));
+	int nonempty = min(screen_lines(SP_PARM),
+			   NewScreen(SP_PARM)->_maxy + 1);
+
+	ClearScreen(NCURSES_SP_ARGx blank);
+
+	TR(TRACE_UPDATE, ("updating screen from scratch"));
+
+	nonempty = ClrBottom(NCURSES_SP_ARGx nonempty);
+
+	for (i = 0; i < nonempty; i++)
+	    TransformLine(NCURSES_SP_ARGx i);
+    }
+    TR(TRACE_UPDATE, (T_RETURN("")));
+}
+
+/*
+**	ClrToEOL(blank)
+**
+**	Clear to end of current line, starting at the cursor position
+*/
+
+static void
+ClrToEOL(NCURSES_SP_DCLx NCURSES_CH_T blank, int needclear)
+{
+    if (CurScreen(SP_PARM) != 0
+	&& SP_PARM->_cursrow >= 0) {
+	int j;
+
+	for (j = SP_PARM->_curscol; j < screen_columns(SP_PARM); j++) {
+	    if (j >= 0) {
+		NCURSES_CH_T *cp =
+		&(CurScreen(SP_PARM)->_line[SP_PARM->_cursrow].text[j]);
+
+		if (!CharEq(*cp, blank)) {
+		    *cp = blank;
+		    needclear = TRUE;
+		}
+	    }
+	}
+    }
+
+    if (needclear) {
+	UpdateAttrs(SP_PARM, blank);
+	if (clr_eol && SP_PARM->_el_cost <= (screen_columns(SP_PARM) - SP_PARM->_curscol)) {
+	    NCURSES_PUTP2("clr_eol", clr_eol);
+	} else {
+	    int count = (screen_columns(SP_PARM) - SP_PARM->_curscol);
+	    while (count-- > 0)
+		PutChar(NCURSES_SP_ARGx CHREF(blank));
+	}
+    }
+}
+
+/*
+**	ClrToEOS(blank)
+**
+**	Clear to end of screen, starting at the cursor position
+*/
+
+static void
+ClrToEOS(NCURSES_SP_DCLx NCURSES_CH_T blank)
+{
+    int row, col;
+
+    row = SP_PARM->_cursrow;
+    col = SP_PARM->_curscol;
+
+    if (row < 0)
+	row = 0;
+    if (col < 0)
+	col = 0;
+
+    UpdateAttrs(SP_PARM, blank);
+    TPUTS_TRACE("clr_eos");
+    NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx
+			    clr_eos,
+			    screen_lines(SP_PARM) - row,
+			    NCURSES_SP_NAME(_nc_outch));
+
+    while (col < screen_columns(SP_PARM))
+	CurScreen(SP_PARM)->_line[row].text[col++] = blank;
+
+    for (row++; row < screen_lines(SP_PARM); row++) {
+	for (col = 0; col < screen_columns(SP_PARM); col++)
+	    CurScreen(SP_PARM)->_line[row].text[col] = blank;
+    }
+}
+
+/*
+ *	ClrBottom(total)
+ *
+ *	Test if clearing the end of the screen would satisfy part of the
+ *	screen-update.  Do this by scanning backwards through the lines in the
+ *	screen, checking if each is blank, and one or more are changed.
+ */
+static int
+ClrBottom(NCURSES_SP_DCLx int total)
+{
+    int top = total;
+    int last = min(screen_columns(SP_PARM), NewScreen(SP_PARM)->_maxx + 1);
+    NCURSES_CH_T blank = NewScreen(SP_PARM)->_line[total - 1].text[last - 1];
+
+    if (clr_eos && can_clear_with(NCURSES_SP_ARGx CHREF(blank))) {
+	int row;
+
+	for (row = total - 1; row >= 0; row--) {
+	    int col;
+	    bool ok;
+
+	    for (col = 0, ok = TRUE; ok && col < last; col++) {
+		ok = (CharEq(NewScreen(SP_PARM)->_line[row].text[col], blank));
+	    }
+	    if (!ok)
+		break;
+
+	    for (col = 0; ok && col < last; col++) {
+		ok = (CharEq(CurScreen(SP_PARM)->_line[row].text[col], blank));
+	    }
+	    if (!ok)
+		top = row;
+	}
+
+	/* don't use clr_eos for just one line if clr_eol available */
+	if (top < total) {
+	    GoTo(NCURSES_SP_ARGx top, 0);
+	    ClrToEOS(NCURSES_SP_ARGx blank);
+	    if (SP_PARM->oldhash && SP_PARM->newhash) {
+		for (row = top; row < screen_lines(SP_PARM); row++)
+		    SP_PARM->oldhash[row] = SP_PARM->newhash[row];
+	    }
+	}
+    }
+    return top;
+}
+
+#if USE_XMC_SUPPORT
+#if USE_WIDEC_SUPPORT
+#define check_xmc_transition(sp, a, b)					\
+    ((((a)->attr ^ (b)->attr) & ~((a)->attr) & (sp)->_xmc_triggers) != 0)
+#define xmc_turn_on(sp,a,b) check_xmc_transition(sp,&(a), &(b))
+#else
+#define xmc_turn_on(sp,a,b) ((((a)^(b)) & ~(a) & (sp)->_xmc_triggers) != 0)
+#endif
+
+#define xmc_new(sp,r,c) NewScreen(sp)->_line[r].text[c]
+#define xmc_turn_off(sp,a,b) xmc_turn_on(sp,b,a)
+#endif /* USE_XMC_SUPPORT */
+
+/*
+**	TransformLine(lineno)
+**
+**	Transform the given line in curscr to the one in newscr, using
+**	Insert/Delete Character if idcok && has_ic().
+**
+**		firstChar = position of first different character in line
+**		oLastChar = position of last different character in old line
+**		nLastChar = position of last different character in new line
+**
+**		move to firstChar
+**		overwrite chars up to min(oLastChar, nLastChar)
+**		if oLastChar < nLastChar
+**			insert newLine[oLastChar+1..nLastChar]
+**		else
+**			delete oLastChar - nLastChar spaces
+*/
+
+static void
+TransformLine(NCURSES_SP_DCLx int const lineno)
+{
+    int firstChar, oLastChar, nLastChar;
+    NCURSES_CH_T *newLine = NewScreen(SP_PARM)->_line[lineno].text;
+    NCURSES_CH_T *oldLine = CurScreen(SP_PARM)->_line[lineno].text;
+    int n;
+    bool attrchanged = FALSE;
+
+    TR(TRACE_UPDATE, (T_CALLED("TransformLine(%p, %d)"), (void *) SP_PARM, lineno));
+
+    /* copy new hash value to old one */
+    if (SP_PARM->oldhash && SP_PARM->newhash)
+	SP_PARM->oldhash[lineno] = SP_PARM->newhash[lineno];
+
+    /*
+     * If we have colors, there is the possibility of having two color pairs
+     * that display as the same colors.  For instance, Lynx does this.  Check
+     * for this case, and update the old line with the new line's colors when
+     * they are equivalent.
+     */
+    if (SP_PARM->_coloron) {
+	int oldPair;
+	int newPair;
+
+	for (n = 0; n < screen_columns(SP_PARM); n++) {
+	    if (!CharEq(newLine[n], oldLine[n])) {
+		oldPair = GetPair(oldLine[n]);
+		newPair = GetPair(newLine[n]);
+		if (oldPair != newPair
+		    && unColor(oldLine[n]) == unColor(newLine[n])) {
+		    if (oldPair < SP_PARM->_pair_alloc
+			&& newPair < SP_PARM->_pair_alloc
+			&& (isSamePair(SP_PARM->_color_pairs[oldPair],
+				       SP_PARM->_color_pairs[newPair]))) {
+			SetPair(oldLine[n], GetPair(newLine[n]));
+		    }
+		}
+	    }
+	}
+    }
+
+    if (ceol_standout_glitch && clr_eol) {
+	firstChar = 0;
+	while (firstChar < screen_columns(SP_PARM)) {
+	    if (!SameAttrOf(newLine[firstChar], oldLine[firstChar])) {
+		attrchanged = TRUE;
+		break;
+	    }
+	    firstChar++;
+	}
+    }
+
+    firstChar = 0;
+
+    if (attrchanged) {		/* we may have to disregard the whole line */
+	GoTo(NCURSES_SP_ARGx lineno, firstChar);
+	ClrToEOL(NCURSES_SP_ARGx
+		 ClrBlank(NCURSES_SP_ARGx
+			  CurScreen(SP_PARM)), FALSE);
+	PutRange(NCURSES_SP_ARGx
+		 oldLine, newLine, lineno, 0,
+		 screen_columns(SP_PARM) - 1);
+#if USE_XMC_SUPPORT
+
+	/*
+	 * This is a very simple loop to paint characters which may have the
+	 * magic cookie glitch embedded.  It doesn't know much about video
+	 * attributes which are continued from one line to the next.  It
+	 * assumes that we have filtered out requests for attribute changes
+	 * that do not get mapped to blank positions.
+	 *
+	 * FIXME: we are not keeping track of where we put the cookies, so this
+	 * will work properly only once, since we may overwrite a cookie in a
+	 * following operation.
+	 */
+    } else if (magic_cookie_glitch > 0) {
+	GoTo(NCURSES_SP_ARGx lineno, firstChar);
+	for (n = 0; n < screen_columns(SP_PARM); n++) {
+	    int m = n + magic_cookie_glitch;
+
+	    /* check for turn-on:
+	     * If we are writing an attributed blank, where the
+	     * previous cell is not attributed.
+	     */
+	    if (ISBLANK(newLine[n])
+		&& ((n > 0
+		     && xmc_turn_on(SP_PARM, newLine[n - 1], newLine[n]))
+		    || (n == 0
+			&& lineno > 0
+			&& xmc_turn_on(SP_PARM,
+				       xmc_new(SP_PARM, lineno - 1,
+					       screen_columns(SP_PARM) - 1),
+				       newLine[n])))) {
+		n = m;
+	    }
+
+	    PutChar(NCURSES_SP_ARGx CHREF(newLine[n]));
+
+	    /* check for turn-off:
+	     * If we are writing an attributed non-blank, where the
+	     * next cell is blank, and not attributed.
+	     */
+	    if (!ISBLANK(newLine[n])
+		&& ((n + 1 < screen_columns(SP_PARM)
+		     && xmc_turn_off(SP_PARM, newLine[n], newLine[n + 1]))
+		    || (n + 1 >= screen_columns(SP_PARM)
+			&& lineno + 1 < screen_lines(SP_PARM)
+			&& xmc_turn_off(SP_PARM,
+					newLine[n],
+					xmc_new(SP_PARM, lineno + 1, 0))))) {
+		n = m;
+	    }
+
+	}
+#endif
+    } else {
+	NCURSES_CH_T blank;
+
+	/* it may be cheap to clear leading whitespace with clr_bol */
+	blank = newLine[0];
+	if (clr_bol && can_clear_with(NCURSES_SP_ARGx CHREF(blank))) {
+	    int oFirstChar, nFirstChar;
+
+	    for (oFirstChar = 0;
+		 oFirstChar < screen_columns(SP_PARM);
+		 oFirstChar++)
+		if (!CharEq(oldLine[oFirstChar], blank))
+		    break;
+	    for (nFirstChar = 0;
+		 nFirstChar < screen_columns(SP_PARM);
+		 nFirstChar++)
+		if (!CharEq(newLine[nFirstChar], blank))
+		    break;
+
+	    if (nFirstChar == oFirstChar) {
+		firstChar = nFirstChar;
+		/* find the first differing character */
+		while (firstChar < screen_columns(SP_PARM)
+		       && CharEq(newLine[firstChar], oldLine[firstChar]))
+		    firstChar++;
+	    } else if (oFirstChar > nFirstChar) {
+		firstChar = nFirstChar;
+	    } else {		/* oFirstChar < nFirstChar */
+		firstChar = oFirstChar;
+		if (SP_PARM->_el1_cost < nFirstChar - oFirstChar) {
+		    if (nFirstChar >= screen_columns(SP_PARM)
+			&& SP_PARM->_el_cost <= SP_PARM->_el1_cost) {
+			GoTo(NCURSES_SP_ARGx lineno, 0);
+			UpdateAttrs(SP_PARM, blank);
+			NCURSES_PUTP2("clr_eol", clr_eol);
+		    } else {
+			GoTo(NCURSES_SP_ARGx lineno, nFirstChar - 1);
+			UpdateAttrs(SP_PARM, blank);
+			NCURSES_PUTP2("clr_bol", clr_bol);
+		    }
+
+		    while (firstChar < nFirstChar)
+			oldLine[firstChar++] = blank;
+		}
+	    }
+	} else {
+	    /* find the first differing character */
+	    while (firstChar < screen_columns(SP_PARM)
+		   && CharEq(newLine[firstChar], oldLine[firstChar]))
+		firstChar++;
+	}
+	/* if there wasn't one, we're done */
+	if (firstChar >= screen_columns(SP_PARM)) {
+	    TR(TRACE_UPDATE, (T_RETURN("")));
+	    return;
+	}
+
+	blank = newLine[screen_columns(SP_PARM) - 1];
+
+	if (!can_clear_with(NCURSES_SP_ARGx CHREF(blank))) {
+	    /* find the last differing character */
+	    nLastChar = screen_columns(SP_PARM) - 1;
+
+	    while (nLastChar > firstChar
+		   && CharEq(newLine[nLastChar], oldLine[nLastChar]))
+		nLastChar--;
+
+	    if (nLastChar >= firstChar) {
+		GoTo(NCURSES_SP_ARGx lineno, firstChar);
+		PutRange(NCURSES_SP_ARGx
+			 oldLine,
+			 newLine,
+			 lineno,
+			 firstChar,
+			 nLastChar);
+		memcpy(oldLine + firstChar,
+		       newLine + firstChar,
+		       (unsigned) (nLastChar - firstChar + 1) * sizeof(NCURSES_CH_T));
+	    }
+	    TR(TRACE_UPDATE, (T_RETURN("")));
+	    return;
+	}
+
+	/* find last non-blank character on old line */
+	oLastChar = screen_columns(SP_PARM) - 1;
+	while (oLastChar > firstChar && CharEq(oldLine[oLastChar], blank))
+	    oLastChar--;
+
+	/* find last non-blank character on new line */
+	nLastChar = screen_columns(SP_PARM) - 1;
+	while (nLastChar > firstChar && CharEq(newLine[nLastChar], blank))
+	    nLastChar--;
+
+	if ((nLastChar == firstChar)
+	    && (SP_PARM->_el_cost < (oLastChar - nLastChar))) {
+	    GoTo(NCURSES_SP_ARGx lineno, firstChar);
+	    if (!CharEq(newLine[firstChar], blank))
+		PutChar(NCURSES_SP_ARGx CHREF(newLine[firstChar]));
+	    ClrToEOL(NCURSES_SP_ARGx blank, FALSE);
+	} else if ((nLastChar != oLastChar)
+		   && (!CharEq(newLine[nLastChar], oldLine[oLastChar])
+		       || !(SP_PARM->_nc_sp_idcok
+			    && NCURSES_SP_NAME(has_ic) (NCURSES_SP_ARG)))) {
+	    GoTo(NCURSES_SP_ARGx lineno, firstChar);
+	    if ((oLastChar - nLastChar) > SP_PARM->_el_cost) {
+		if (PutRange(NCURSES_SP_ARGx
+			     oldLine,
+			     newLine,
+			     lineno,
+			     firstChar,
+			     nLastChar)) {
+		    GoTo(NCURSES_SP_ARGx lineno, nLastChar + 1);
+		}
+		ClrToEOL(NCURSES_SP_ARGx blank, FALSE);
+	    } else {
+		n = max(nLastChar, oLastChar);
+		PutRange(NCURSES_SP_ARGx
+			 oldLine,
+			 newLine,
+			 lineno,
+			 firstChar,
+			 n);
+	    }
+	} else {
+	    int nLastNonblank = nLastChar;
+	    int oLastNonblank = oLastChar;
+
+	    /* find the last characters that really differ */
+	    /* can be -1 if no characters differ */
+	    while (CharEq(newLine[nLastChar], oldLine[oLastChar])) {
+		/* don't split a wide char */
+		if (isWidecExt(newLine[nLastChar]) &&
+		    !CharEq(newLine[nLastChar - 1], oldLine[oLastChar - 1]))
+		    break;
+		nLastChar--;
+		oLastChar--;
+		if (nLastChar == -1 || oLastChar == -1)
+		    break;
+	    }
+
+	    n = min(oLastChar, nLastChar);
+	    if (n >= firstChar) {
+		GoTo(NCURSES_SP_ARGx lineno, firstChar);
+		PutRange(NCURSES_SP_ARGx
+			 oldLine,
+			 newLine,
+			 lineno,
+			 firstChar,
+			 n);
+	    }
+
+	    if (oLastChar < nLastChar) {
+		int m = max(nLastNonblank, oLastNonblank);
+#if USE_WIDEC_SUPPORT
+		if (n) {
+		    while (isWidecExt(newLine[n + 1]) && n) {
+			--n;
+			--oLastChar;	/* increase cost */
+		    }
+		} else if (n >= firstChar &&
+			   isWidecBase(newLine[n])) {
+		    while (isWidecExt(newLine[n + 1])) {
+			++n;
+			++oLastChar;	/* decrease cost */
+		    }
+		}
+#endif
+		GoTo(NCURSES_SP_ARGx lineno, n + 1);
+		if ((nLastChar < nLastNonblank)
+		    || InsCharCost(SP_PARM, nLastChar - oLastChar) > (m - n)) {
+		    PutRange(NCURSES_SP_ARGx
+			     oldLine,
+			     newLine,
+			     lineno,
+			     n + 1,
+			     m);
+		} else {
+		    InsStr(NCURSES_SP_ARGx &newLine[n + 1], nLastChar - oLastChar);
+		}
+	    } else if (oLastChar > nLastChar) {
+		GoTo(NCURSES_SP_ARGx lineno, n + 1);
+		if (DelCharCost(SP_PARM, oLastChar - nLastChar)
+		    > SP_PARM->_el_cost + nLastNonblank - (n + 1)) {
+		    if (PutRange(NCURSES_SP_ARGx oldLine, newLine, lineno,
+				 n + 1, nLastNonblank)) {
+			GoTo(NCURSES_SP_ARGx lineno, nLastNonblank + 1);
+		    }
+		    ClrToEOL(NCURSES_SP_ARGx blank, FALSE);
+		} else {
+		    /*
+		     * The delete-char sequence will
+		     * effectively shift in blanks from the
+		     * right margin of the screen.  Ensure
+		     * that they are the right color by
+		     * setting the video attributes from
+		     * the last character on the row.
+		     */
+		    UpdateAttrs(SP_PARM, blank);
+		    DelChar(NCURSES_SP_ARGx oLastChar - nLastChar);
+		}
+	    }
+	}
+    }
+
+    /* update the code's internal representation */
+    if (screen_columns(SP_PARM) > firstChar)
+	memcpy(oldLine + firstChar,
+	       newLine + firstChar,
+	       (unsigned) (screen_columns(SP_PARM) - firstChar) * sizeof(NCURSES_CH_T));
+    TR(TRACE_UPDATE, (T_RETURN("")));
+    return;
+}
+
+/*
+**	ClearScreen(blank)
+**
+**	Clear the physical screen and put cursor at home
+**
+*/
+
+static void
+ClearScreen(NCURSES_SP_DCLx NCURSES_CH_T blank)
+{
+    int i, j;
+    bool fast_clear = (clear_screen || clr_eos || clr_eol);
+
+    TR(TRACE_UPDATE, ("ClearScreen() called"));
+
+#if NCURSES_EXT_FUNCS
+    if (SP_PARM->_coloron
+	&& !SP_PARM->_default_color) {
+	NCURSES_SP_NAME(_nc_do_color) (NCURSES_SP_ARGx
+				       (short) GET_SCREEN_PAIR(SP_PARM),
+				       0,
+				       FALSE,
+				       NCURSES_SP_NAME(_nc_outch));
+	if (!back_color_erase) {
+	    fast_clear = FALSE;
+	}
+    }
+#endif
+
+    if (fast_clear) {
+	if (clear_screen) {
+	    UpdateAttrs(SP_PARM, blank);
+	    NCURSES_PUTP2("clear_screen", clear_screen);
+	    SP_PARM->_cursrow = SP_PARM->_curscol = 0;
+	    position_check(NCURSES_SP_ARGx
+			   SP_PARM->_cursrow,
+			   SP_PARM->_curscol,
+			   "ClearScreen");
+	} else if (clr_eos) {
+	    SP_PARM->_cursrow = SP_PARM->_curscol = -1;
+	    GoTo(NCURSES_SP_ARGx 0, 0);
+	    UpdateAttrs(SP_PARM, blank);
+	    TPUTS_TRACE("clr_eos");
+	    NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx
+				    clr_eos,
+				    screen_lines(SP_PARM),
+				    NCURSES_SP_NAME(_nc_outch));
+	} else if (clr_eol) {
+	    SP_PARM->_cursrow = SP_PARM->_curscol = -1;
+	    UpdateAttrs(SP_PARM, blank);
+	    for (i = 0; i < screen_lines(SP_PARM); i++) {
+		GoTo(NCURSES_SP_ARGx i, 0);
+		NCURSES_PUTP2("clr_eol", clr_eol);
+	    }
+	    GoTo(NCURSES_SP_ARGx 0, 0);
+	}
+    } else {
+	UpdateAttrs(SP_PARM, blank);
+	for (i = 0; i < screen_lines(SP_PARM); i++) {
+	    GoTo(NCURSES_SP_ARGx i, 0);
+	    for (j = 0; j < screen_columns(SP_PARM); j++)
+		PutChar(NCURSES_SP_ARGx CHREF(blank));
+	}
+	GoTo(NCURSES_SP_ARGx 0, 0);
+    }
+
+    for (i = 0; i < screen_lines(SP_PARM); i++) {
+	for (j = 0; j < screen_columns(SP_PARM); j++)
+	    CurScreen(SP_PARM)->_line[i].text[j] = blank;
+    }
+
+    TR(TRACE_UPDATE, ("screen cleared"));
+}
+
+/*
+**	InsStr(line, count)
+**
+**	Insert the count characters pointed to by line.
+**
+*/
+
+static void
+InsStr(NCURSES_SP_DCLx NCURSES_CH_T *line, int count)
+{
+    TR(TRACE_UPDATE, ("InsStr(%p, %p,%d) called",
+		      (void *) SP_PARM,
+		      (void *) line, count));
+
+    /* Prefer parm_ich as it has the smallest cost - no need to shift
+     * the whole line on each character. */
+    /* The order must match that of InsCharCost. */
+    if (parm_ich) {
+	TPUTS_TRACE("parm_ich");
+	NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx
+				TIPARM_1(parm_ich, count),
+				1,
+				NCURSES_SP_NAME(_nc_outch));
+	while (count > 0) {
+	    PutAttrChar(NCURSES_SP_ARGx CHREF(*line));
+	    line++;
+	    count--;
+	}
+    } else if (enter_insert_mode && exit_insert_mode) {
+	NCURSES_PUTP2("enter_insert_mode", enter_insert_mode);
+	while (count > 0) {
+	    PutAttrChar(NCURSES_SP_ARGx CHREF(*line));
+	    if (insert_padding) {
+		NCURSES_PUTP2("insert_padding", insert_padding);
+	    }
+	    line++;
+	    count--;
+	}
+	NCURSES_PUTP2("exit_insert_mode", exit_insert_mode);
+    } else {
+	while (count > 0) {
+	    NCURSES_PUTP2("insert_character", insert_character);
+	    PutAttrChar(NCURSES_SP_ARGx CHREF(*line));
+	    if (insert_padding) {
+		NCURSES_PUTP2("insert_padding", insert_padding);
+	    }
+	    line++;
+	    count--;
+	}
+    }
+    position_check(NCURSES_SP_ARGx
+		   SP_PARM->_cursrow,
+		   SP_PARM->_curscol, "InsStr");
+}
+
+/*
+**	DelChar(count)
+**
+**	Delete count characters at current position
+**
+*/
+
+static void
+DelChar(NCURSES_SP_DCLx int count)
+{
+    TR(TRACE_UPDATE, ("DelChar(%p, %d) called, position = (%ld,%ld)",
+		      (void *) SP_PARM, count,
+		      (long) NewScreen(SP_PARM)->_cury,
+		      (long) NewScreen(SP_PARM)->_curx));
+
+    if (parm_dch) {
+	TPUTS_TRACE("parm_dch");
+	NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx
+				TIPARM_1(parm_dch, count),
+				1,
+				NCURSES_SP_NAME(_nc_outch));
+    } else {
+	int n;
+
+	for (n = 0; n < count; n++) {
+	    NCURSES_PUTP2("delete_character", delete_character);
+	}
+    }
+}
+
+/*
+ * Physical-scrolling support
+ *
+ * This code was adapted from Keith Bostic's hardware scrolling
+ * support for 4.4BSD curses.  I (esr) translated it to use terminfo
+ * capabilities, narrowed the call interface slightly, and cleaned
+ * up some convoluted tests.  I also added support for the memory_above
+ * memory_below, and non_dest_scroll_region capabilities.
+ *
+ * For this code to work, we must have either
+ * change_scroll_region and scroll forward/reverse commands, or
+ * insert and delete line capabilities.
+ * When the scrolling region has been set, the cursor has to
+ * be at the last line of the region to make the scroll up
+ * happen, or on the first line of region to scroll down.
+ *
+ * This code makes one aesthetic decision in the opposite way from
+ * BSD curses.  BSD curses preferred pairs of il/dl operations
+ * over scrolls, allegedly because il/dl looked faster.  We, on
+ * the other hand, prefer scrolls because (a) they're just as fast
+ * on many terminals and (b) using them avoids bouncing an
+ * unchanged bottom section of the screen up and down, which is
+ * visually nasty.
+ *
+ * (lav): added more cases, used dl/il when bot==maxy and in csr case.
+ *
+ * I used assumption that capabilities il/il1/dl/dl1 work inside
+ * changed scroll region not shifting screen contents outside of it.
+ * If there are any terminals behaving different way, it would be
+ * necessary to add some conditions to scroll_csr_forward/backward.
+ */
+
+/* Try to scroll up assuming given csr (miny, maxy). Returns ERR on failure */
+static int
+scroll_csr_forward(NCURSES_SP_DCLx
+		   int n,
+		   int top,
+		   int bot,
+		   int miny,
+		   int maxy,
+		   NCURSES_CH_T blank)
+{
+    int i;
+
+    if (n == 1 && scroll_forward && top == miny && bot == maxy) {
+	GoTo(NCURSES_SP_ARGx bot, 0);
+	UpdateAttrs(SP_PARM, blank);
+	NCURSES_PUTP2("scroll_forward", scroll_forward);
+    } else if (n == 1 && delete_line && bot == maxy) {
+	GoTo(NCURSES_SP_ARGx top, 0);
+	UpdateAttrs(SP_PARM, blank);
+	NCURSES_PUTP2("delete_line", delete_line);
+    } else if (parm_index && top == miny && bot == maxy) {
+	GoTo(NCURSES_SP_ARGx bot, 0);
+	UpdateAttrs(SP_PARM, blank);
+	TPUTS_TRACE("parm_index");
+	NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx
+				TIPARM_1(parm_index, n),
+				n,
+				NCURSES_SP_NAME(_nc_outch));
+    } else if (parm_delete_line && bot == maxy) {
+	GoTo(NCURSES_SP_ARGx top, 0);
+	UpdateAttrs(SP_PARM, blank);
+	TPUTS_TRACE("parm_delete_line");
+	NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx
+				TIPARM_1(parm_delete_line, n),
+				n,
+				NCURSES_SP_NAME(_nc_outch));
+    } else if (scroll_forward && top == miny && bot == maxy) {
+	GoTo(NCURSES_SP_ARGx bot, 0);
+	UpdateAttrs(SP_PARM, blank);
+	for (i = 0; i < n; i++) {
+	    NCURSES_PUTP2("scroll_forward", scroll_forward);
+	}
+    } else if (delete_line && bot == maxy) {
+	GoTo(NCURSES_SP_ARGx top, 0);
+	UpdateAttrs(SP_PARM, blank);
+	for (i = 0; i < n; i++) {
+	    NCURSES_PUTP2("delete_line", delete_line);
+	}
+    } else
+	return ERR;
+
+#if NCURSES_EXT_FUNCS
+    if (FILL_BCE(SP_PARM)) {
+	int j;
+	for (i = 0; i < n; i++) {
+	    GoTo(NCURSES_SP_ARGx bot - i, 0);
+	    for (j = 0; j < screen_columns(SP_PARM); j++)
+		PutChar(NCURSES_SP_ARGx CHREF(blank));
+	}
+    }
+#endif
+    return OK;
+}
+
+/* Try to scroll down assuming given csr (miny, maxy). Returns ERR on failure */
+/* n > 0 */
+static int
+scroll_csr_backward(NCURSES_SP_DCLx
+		    int n,
+		    int top,
+		    int bot,
+		    int miny,
+		    int maxy,
+		    NCURSES_CH_T blank)
+{
+    int i;
+
+    if (n == 1 && scroll_reverse && top == miny && bot == maxy) {
+	GoTo(NCURSES_SP_ARGx top, 0);
+	UpdateAttrs(SP_PARM, blank);
+	NCURSES_PUTP2("scroll_reverse", scroll_reverse);
+    } else if (n == 1 && insert_line && bot == maxy) {
+	GoTo(NCURSES_SP_ARGx top, 0);
+	UpdateAttrs(SP_PARM, blank);
+	NCURSES_PUTP2("insert_line", insert_line);
+    } else if (parm_rindex && top == miny && bot == maxy) {
+	GoTo(NCURSES_SP_ARGx top, 0);
+	UpdateAttrs(SP_PARM, blank);
+	TPUTS_TRACE("parm_rindex");
+	NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx
+				TIPARM_1(parm_rindex, n),
+				n,
+				NCURSES_SP_NAME(_nc_outch));
+    } else if (parm_insert_line && bot == maxy) {
+	GoTo(NCURSES_SP_ARGx top, 0);
+	UpdateAttrs(SP_PARM, blank);
+	TPUTS_TRACE("parm_insert_line");
+	NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx
+				TIPARM_1(parm_insert_line, n),
+				n,
+				NCURSES_SP_NAME(_nc_outch));
+    } else if (scroll_reverse && top == miny && bot == maxy) {
+	GoTo(NCURSES_SP_ARGx top, 0);
+	UpdateAttrs(SP_PARM, blank);
+	for (i = 0; i < n; i++) {
+	    NCURSES_PUTP2("scroll_reverse", scroll_reverse);
+	}
+    } else if (insert_line && bot == maxy) {
+	GoTo(NCURSES_SP_ARGx top, 0);
+	UpdateAttrs(SP_PARM, blank);
+	for (i = 0; i < n; i++) {
+	    NCURSES_PUTP2("insert_line", insert_line);
+	}
+    } else
+	return ERR;
+
+#if NCURSES_EXT_FUNCS
+    if (FILL_BCE(SP_PARM)) {
+	int j;
+	for (i = 0; i < n; i++) {
+	    GoTo(NCURSES_SP_ARGx top + i, 0);
+	    for (j = 0; j < screen_columns(SP_PARM); j++)
+		PutChar(NCURSES_SP_ARGx CHREF(blank));
+	}
+    }
+#endif
+    return OK;
+}
+
+/* scroll by using delete_line at del and insert_line at ins */
+/* n > 0 */
+static int
+scroll_idl(NCURSES_SP_DCLx int n, int del, int ins, NCURSES_CH_T blank)
+{
+    int i;
+
+    if (!((parm_delete_line || delete_line) && (parm_insert_line || insert_line)))
+	return ERR;
+
+    GoTo(NCURSES_SP_ARGx del, 0);
+    UpdateAttrs(SP_PARM, blank);
+    if (n == 1 && delete_line) {
+	NCURSES_PUTP2("delete_line", delete_line);
+    } else if (parm_delete_line) {
+	TPUTS_TRACE("parm_delete_line");
+	NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx
+				TIPARM_1(parm_delete_line, n),
+				n,
+				NCURSES_SP_NAME(_nc_outch));
+    } else {			/* if (delete_line) */
+	for (i = 0; i < n; i++) {
+	    NCURSES_PUTP2("delete_line", delete_line);
+	}
+    }
+
+    GoTo(NCURSES_SP_ARGx ins, 0);
+    UpdateAttrs(SP_PARM, blank);
+    if (n == 1 && insert_line) {
+	NCURSES_PUTP2("insert_line", insert_line);
+    } else if (parm_insert_line) {
+	TPUTS_TRACE("parm_insert_line");
+	NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx
+				TIPARM_1(parm_insert_line, n),
+				n,
+				NCURSES_SP_NAME(_nc_outch));
+    } else {			/* if (insert_line) */
+	for (i = 0; i < n; i++) {
+	    NCURSES_PUTP2("insert_line", insert_line);
+	}
+    }
+
+    return OK;
+}
+
+/*
+ * Note:  some terminals require the cursor to be within the scrolling margins
+ * before setting them.  Generally, the cursor must be at the appropriate end
+ * of the scrolling margins when issuing an indexing operation (it is not
+ * apparent whether it must also be at the left margin; we do this just to be
+ * safe).  To make the related cursor movement a little faster, we use the
+ * save/restore cursor capabilities if the terminal has them.
+ */
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(_nc_scrolln) (NCURSES_SP_DCLx
+			      int n,
+			      int top,
+			      int bot,
+			      int maxy)
+/* scroll region from top to bot by n lines */
+{
+    NCURSES_CH_T blank;
+    int i;
+    bool cursor_saved = FALSE;
+    int res;
+
+    TR(TRACE_MOVE, ("_nc_scrolln(%p, %d, %d, %d, %d)",
+		    (void *) SP_PARM, n, top, bot, maxy));
+
+    if (!IsValidScreen(SP_PARM))
+	return (ERR);
+
+    blank = ClrBlank(NCURSES_SP_ARGx StdScreen(SP_PARM));
+
+#if USE_XMC_SUPPORT
+    /*
+     * If we scroll, we might remove a cookie.
+     */
+    if (magic_cookie_glitch > 0) {
+	return (ERR);
+    }
+#endif
+
+    if (n > 0) {		/* scroll up (forward) */
+	/*
+	 * Explicitly clear if stuff pushed off top of region might
+	 * be saved by the terminal.
+	 */
+	res = scroll_csr_forward(NCURSES_SP_ARGx n, top, bot, 0, maxy, blank);
+
+	if (res == ERR && change_scroll_region) {
+	    if ((((n == 1 && scroll_forward) || parm_index)
+		 && (SP_PARM->_cursrow == bot || SP_PARM->_cursrow == bot - 1))
+		&& save_cursor && restore_cursor) {
+		cursor_saved = TRUE;
+		NCURSES_PUTP2("save_cursor", save_cursor);
+	    }
+	    NCURSES_PUTP2("change_scroll_region",
+			  TIPARM_2(change_scroll_region, top, bot));
+	    if (cursor_saved) {
+		NCURSES_PUTP2("restore_cursor", restore_cursor);
+	    } else {
+		SP_PARM->_cursrow = SP_PARM->_curscol = -1;
+	    }
+
+	    res = scroll_csr_forward(NCURSES_SP_ARGx n, top, bot, top, bot, blank);
+
+	    NCURSES_PUTP2("change_scroll_region",
+			  TIPARM_2(change_scroll_region, 0, maxy));
+	    SP_PARM->_cursrow = SP_PARM->_curscol = -1;
+	}
+
+	if (res == ERR && SP_PARM->_nc_sp_idlok)
+	    res = scroll_idl(NCURSES_SP_ARGx n, top, bot - n + 1, blank);
+
+	/*
+	 * Clear the newly shifted-in text.
+	 */
+	if (res != ERR
+	    && (non_dest_scroll_region || (memory_below && bot == maxy))) {
+	    static const NCURSES_CH_T blank2 = NewChar(BLANK_TEXT);
+	    if (bot == maxy && clr_eos) {
+		GoTo(NCURSES_SP_ARGx bot - n + 1, 0);
+		ClrToEOS(NCURSES_SP_ARGx blank2);
+	    } else {
+		for (i = 0; i < n; i++) {
+		    GoTo(NCURSES_SP_ARGx bot - i, 0);
+		    ClrToEOL(NCURSES_SP_ARGx blank2, FALSE);
+		}
+	    }
+	}
+
+    } else {			/* (n < 0) - scroll down (backward) */
+	res = scroll_csr_backward(NCURSES_SP_ARGx -n, top, bot, 0, maxy, blank);
+
+	if (res == ERR && change_scroll_region) {
+	    if (top != 0
+		&& (SP_PARM->_cursrow == top ||
+		    SP_PARM->_cursrow == top - 1)
+		&& save_cursor && restore_cursor) {
+		cursor_saved = TRUE;
+		NCURSES_PUTP2("save_cursor", save_cursor);
+	    }
+	    NCURSES_PUTP2("change_scroll_region",
+			  TIPARM_2(change_scroll_region, top, bot));
+	    if (cursor_saved) {
+		NCURSES_PUTP2("restore_cursor", restore_cursor);
+	    } else {
+		SP_PARM->_cursrow = SP_PARM->_curscol = -1;
+	    }
+
+	    res = scroll_csr_backward(NCURSES_SP_ARGx
+				      -n, top, bot, top, bot, blank);
+
+	    NCURSES_PUTP2("change_scroll_region",
+			  TIPARM_2(change_scroll_region, 0, maxy));
+	    SP_PARM->_cursrow = SP_PARM->_curscol = -1;
+	}
+
+	if (res == ERR && SP_PARM->_nc_sp_idlok)
+	    res = scroll_idl(NCURSES_SP_ARGx -n, bot + n + 1, top, blank);
+
+	/*
+	 * Clear the newly shifted-in text.
+	 */
+	if (res != ERR
+	    && (non_dest_scroll_region || (memory_above && top == 0))) {
+	    static const NCURSES_CH_T blank2 = NewChar(BLANK_TEXT);
+	    for (i = 0; i < -n; i++) {
+		GoTo(NCURSES_SP_ARGx i + top, 0);
+		ClrToEOL(NCURSES_SP_ARGx blank2, FALSE);
+	    }
+	}
+    }
+
+    if (res == ERR)
+	return (ERR);
+
+    _nc_scroll_window(CurScreen(SP_PARM), n,
+		      (NCURSES_SIZE_T) top,
+		      (NCURSES_SIZE_T) bot,
+		      blank);
+
+    /* shift hash values too - they can be reused */
+    NCURSES_SP_NAME(_nc_scroll_oldhash) (NCURSES_SP_ARGx n, top, bot);
+
+    return (OK);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+_nc_scrolln(int n, int top, int bot, int maxy)
+{
+    return NCURSES_SP_NAME(_nc_scrolln) (CURRENT_SCREEN, n, top, bot, maxy);
+}
+#endif
+
+NCURSES_EXPORT(void)
+NCURSES_SP_NAME(_nc_screen_resume) (NCURSES_SP_DCL0)
+{
+    assert(SP_PARM);
+
+    /* make sure terminal is in a sane known state */
+    SetAttr(SCREEN_ATTRS(SP_PARM), A_NORMAL);
+    NewScreen(SP_PARM)->_clear = TRUE;
+
+    /* reset color pairs and definitions */
+    if (SP_PARM->_coloron || SP_PARM->_color_defs)
+	NCURSES_SP_NAME(_nc_reset_colors) (NCURSES_SP_ARG);
+
+    /* restore user-defined colors, if any */
+    if (SP_PARM->_color_defs < 0 && !SP_PARM->_direct_color.value) {
+	int n;
+	SP_PARM->_color_defs = -(SP_PARM->_color_defs);
+	for (n = 0; n < SP_PARM->_color_defs; ++n) {
+	    if (SP_PARM->_color_table[n].init) {
+		_nc_init_color(SP_PARM,
+			       n,
+			       SP_PARM->_color_table[n].r,
+			       SP_PARM->_color_table[n].g,
+			       SP_PARM->_color_table[n].b);
+	    }
+	}
+    }
+
+    if (exit_attribute_mode)
+	NCURSES_PUTP2("exit_attribute_mode", exit_attribute_mode);
+    else {
+	/* turn off attributes */
+	if (exit_alt_charset_mode)
+	    NCURSES_PUTP2("exit_alt_charset_mode", exit_alt_charset_mode);
+	if (exit_standout_mode)
+	    NCURSES_PUTP2("exit_standout_mode", exit_standout_mode);
+	if (exit_underline_mode)
+	    NCURSES_PUTP2("exit_underline_mode", exit_underline_mode);
+    }
+    if (exit_insert_mode)
+	NCURSES_PUTP2("exit_insert_mode", exit_insert_mode);
+    if (enter_am_mode && exit_am_mode) {
+	if (auto_right_margin) {
+	    NCURSES_PUTP2("enter_am_mode", enter_am_mode);
+	} else {
+	    NCURSES_PUTP2("exit_am_mode", exit_am_mode);
+	}
+    }
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(void)
+_nc_screen_resume(void)
+{
+    NCURSES_SP_NAME(_nc_screen_resume) (CURRENT_SCREEN);
+}
+#endif
+
+NCURSES_EXPORT(void)
+NCURSES_SP_NAME(_nc_screen_init) (NCURSES_SP_DCL0)
+{
+    NCURSES_SP_NAME(_nc_screen_resume) (NCURSES_SP_ARG);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(void)
+_nc_screen_init(void)
+{
+    NCURSES_SP_NAME(_nc_screen_init) (CURRENT_SCREEN);
+}
+#endif
+
+/* wrap up screen handling */
+NCURSES_EXPORT(void)
+NCURSES_SP_NAME(_nc_screen_wrap) (NCURSES_SP_DCL0)
+{
+    if (SP_PARM != 0) {
+
+	UpdateAttrs(SP_PARM, normal);
+#if NCURSES_EXT_FUNCS
+	if (SP_PARM->_coloron
+	    && !SP_PARM->_default_color) {
+	    static const NCURSES_CH_T blank = NewChar(BLANK_TEXT);
+	    SP_PARM->_default_color = TRUE;
+	    NCURSES_SP_NAME(_nc_do_color) (NCURSES_SP_ARGx
+					   -1,
+					   0,
+					   FALSE,
+					   NCURSES_SP_NAME(_nc_outch));
+	    SP_PARM->_default_color = FALSE;
+
+	    TINFO_MVCUR(NCURSES_SP_ARGx
+			SP_PARM->_cursrow,
+			SP_PARM->_curscol,
+			screen_lines(SP_PARM) - 1,
+			0);
+
+	    ClrToEOL(NCURSES_SP_ARGx blank, TRUE);
+	}
+#endif
+	if (SP_PARM->_color_defs) {
+	    NCURSES_SP_NAME(_nc_reset_colors) (NCURSES_SP_ARG);
+	}
+    }
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(void)
+_nc_screen_wrap(void)
+{
+    NCURSES_SP_NAME(_nc_screen_wrap) (CURRENT_SCREEN);
+}
+#endif
+
+#if USE_XMC_SUPPORT
+NCURSES_EXPORT(void)
+NCURSES_SP_NAME(_nc_do_xmc_glitch) (NCURSES_SP_DCLx attr_t previous)
+{
+    if (SP_PARM != 0) {
+	attr_t chg = XMC_CHANGES(previous ^ AttrOf(SCREEN_ATTRS(SP_PARM)));
+
+	while (chg != 0) {
+	    if (chg & 1) {
+		SP_PARM->_curscol += magic_cookie_glitch;
+		if (SP_PARM->_curscol >= SP_PARM->_columns)
+		    wrap_cursor(NCURSES_SP_ARG);
+		TR(TRACE_UPDATE, ("bumped to %d,%d after cookie",
+				  SP_PARM->_cursrow, SP_PARM->_curscol));
+	    }
+	    chg >>= 1;
+	}
+    }
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(void)
+_nc_do_xmc_glitch(attr_t previous)
+{
+    NCURSES_SP_NAME(_nc_do_xmc_glitch) (CURRENT_SCREEN, previous);
+}
+#endif
+
+#endif /* USE_XMC_SUPPORT */
diff --git a/ncurses/wcwidth.h b/ncurses/wcwidth.h
new file mode 100644
index 0000000..76673da
--- /dev/null
+++ b/ncurses/wcwidth.h
@@ -0,0 +1,328 @@
+/*
+ * This is an implementation of wcwidth() and wcswidth() (defined in
+ * IEEE Std 1002.1-2001) for Unicode.
+ *
+ * http://www.opengroup.org/onlinepubs/007904975/functions/wcwidth.html
+ * http://www.opengroup.org/onlinepubs/007904975/functions/wcswidth.html
+ *
+ * In fixed-width output devices, Latin characters all occupy a single
+ * "cell" position of equal width, whereas ideographic CJK characters
+ * occupy two such cells. Interoperability between terminal-line
+ * applications and (teletype-style) character terminals using the
+ * UTF-8 encoding requires agreement on which character should advance
+ * the cursor by how many cell positions. No established formal
+ * standards exist at present on which Unicode character shall occupy
+ * how many cell positions on character terminals. These routines are
+ * a first attempt of defining such behavior based on simple rules
+ * applied to data provided by the Unicode Consortium.
+ *
+ * For some graphical characters, the Unicode standard explicitly
+ * defines a character-cell width via the definition of the East Asian
+ * FullWidth (F), Wide (W), Half-width (H), and Narrow (Na) classes.
+ * In all these cases, there is no ambiguity about which width a
+ * terminal shall use. For characters in the East Asian Ambiguous (A)
+ * class, the width choice depends purely on a preference of backward
+ * compatibility with either historic CJK or Western practice.
+ * Choosing single-width for these characters is easy to justify as
+ * the appropriate long-term solution, as the CJK practice of
+ * displaying these characters as double-width comes from historic
+ * implementation simplicity (8-bit encoded characters were displayed
+ * single-width and 16-bit ones double-width, even for Greek,
+ * Cyrillic, etc.) and not any typographic considerations.
+ *
+ * Much less clear is the choice of width for the Not East Asian
+ * (Neutral) class. Existing practice does not dictate a width for any
+ * of these characters. It would nevertheless make sense
+ * typographically to allocate two character cells to characters such
+ * as for instance EM SPACE or VOLUME INTEGRAL, which cannot be
+ * represented adequately with a single-width glyph. The following
+ * routines at present merely assign a single-cell width to all
+ * neutral characters, in the interest of simplicity. This is not
+ * entirely satisfactory and should be reconsidered before
+ * establishing a formal standard in this area. At the moment, the
+ * decision which Not East Asian (Neutral) characters should be
+ * represented by double-width glyphs cannot yet be answered by
+ * applying a simple rule from the Unicode database content. Setting
+ * up a proper standard for the behavior of UTF-8 character terminals
+ * will require a careful analysis not only of each Unicode character,
+ * but also of each presentation form, something the author of these
+ * routines has avoided to do so far.
+ *
+ * http://www.unicode.org/unicode/reports/tr11/
+ *
+ * Markus Kuhn -- 2007-05-26 (Unicode 5.0)
+ *
+ * Permission to use, copy, modify, and distribute this software
+ * for any purpose and without fee is hereby granted. The author
+ * disclaims all warranties with regard to this software.
+ *
+ * Latest version: http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c
+ */
+
+#ifndef _WCWIDTH_H_incl
+#define _WCWIDTH_H_incl 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <ncurses_cfg.h>
+#include <ncurses_dll.h>
+
+#include <wchar.h>
+
+struct interval {
+  int first;
+  int last;
+};
+
+/* auxiliary function for binary search in interval table */
+static int bisearch(wchar_t ucs, const struct interval *table, int max) {
+  int min = 0;
+  int mid;
+
+  if (ucs < table[0].first || ucs > table[max].last)
+    return 0;
+  while (max >= min) {
+    mid = (min + max) / 2;
+    if (ucs > table[mid].last)
+      min = mid + 1;
+    else if (ucs < table[mid].first)
+      max = mid - 1;
+    else
+      return 1;
+  }
+
+  return 0;
+}
+
+
+/* The following two functions define the column width of an ISO 10646
+ * character as follows:
+ *
+ *    - The null character (U+0000) has a column width of 0.
+ *
+ *    - Other C0/C1 control characters and DEL will lead to a return
+ *      value of -1.
+ *
+ *    - Non-spacing and enclosing combining characters (general
+ *      category code Mn or Me in the Unicode database) have a
+ *      column width of 0.
+ *
+ *    - SOFT HYPHEN (U+00AD) has a column width of 1.
+ *
+ *    - Other format characters (general category code Cf in the Unicode
+ *      database) and ZERO WIDTH SPACE (U+200B) have a column width of 0.
+ *
+ *    - Hangul Jamo medial vowels and final consonants (U+1160-U+11FF)
+ *      have a column width of 0.
+ *
+ *    - Spacing characters in the East Asian Wide (W) or East Asian
+ *      Full-width (F) category as defined in Unicode Technical
+ *      Report #11 have a column width of 2.
+ *
+ *    - All remaining characters (including all printable
+ *      ISO 8859-1 and WGL4 characters, Unicode control characters,
+ *      etc.) have a column width of 1.
+ *
+ * This implementation assumes that wchar_t characters are encoded
+ * in ISO 10646.
+ */
+
+NCURSES_EXPORT(int) mk_wcwidth(wchar_t ucs)
+{
+  /* sorted list of non-overlapping intervals of non-spacing characters */
+  /* generated by "uniset +cat=Me +cat=Mn +cat=Cf -00AD +1160-11FF +200B c" */
+  static const struct interval combining[] = {
+    { 0x0300, 0x036F }, { 0x0483, 0x0486 }, { 0x0488, 0x0489 },
+    { 0x0591, 0x05BD }, { 0x05BF, 0x05BF }, { 0x05C1, 0x05C2 },
+    { 0x05C4, 0x05C5 }, { 0x05C7, 0x05C7 }, { 0x0600, 0x0603 },
+    { 0x0610, 0x0615 }, { 0x064B, 0x065E }, { 0x0670, 0x0670 },
+    { 0x06D6, 0x06E4 }, { 0x06E7, 0x06E8 }, { 0x06EA, 0x06ED },
+    { 0x070F, 0x070F }, { 0x0711, 0x0711 }, { 0x0730, 0x074A },
+    { 0x07A6, 0x07B0 }, { 0x07EB, 0x07F3 }, { 0x0901, 0x0902 },
+    { 0x093C, 0x093C }, { 0x0941, 0x0948 }, { 0x094D, 0x094D },
+    { 0x0951, 0x0954 }, { 0x0962, 0x0963 }, { 0x0981, 0x0981 },
+    { 0x09BC, 0x09BC }, { 0x09C1, 0x09C4 }, { 0x09CD, 0x09CD },
+    { 0x09E2, 0x09E3 }, { 0x0A01, 0x0A02 }, { 0x0A3C, 0x0A3C },
+    { 0x0A41, 0x0A42 }, { 0x0A47, 0x0A48 }, { 0x0A4B, 0x0A4D },
+    { 0x0A70, 0x0A71 }, { 0x0A81, 0x0A82 }, { 0x0ABC, 0x0ABC },
+    { 0x0AC1, 0x0AC5 }, { 0x0AC7, 0x0AC8 }, { 0x0ACD, 0x0ACD },
+    { 0x0AE2, 0x0AE3 }, { 0x0B01, 0x0B01 }, { 0x0B3C, 0x0B3C },
+    { 0x0B3F, 0x0B3F }, { 0x0B41, 0x0B43 }, { 0x0B4D, 0x0B4D },
+    { 0x0B56, 0x0B56 }, { 0x0B82, 0x0B82 }, { 0x0BC0, 0x0BC0 },
+    { 0x0BCD, 0x0BCD }, { 0x0C3E, 0x0C40 }, { 0x0C46, 0x0C48 },
+    { 0x0C4A, 0x0C4D }, { 0x0C55, 0x0C56 }, { 0x0CBC, 0x0CBC },
+    { 0x0CBF, 0x0CBF }, { 0x0CC6, 0x0CC6 }, { 0x0CCC, 0x0CCD },
+    { 0x0CE2, 0x0CE3 }, { 0x0D41, 0x0D43 }, { 0x0D4D, 0x0D4D },
+    { 0x0DCA, 0x0DCA }, { 0x0DD2, 0x0DD4 }, { 0x0DD6, 0x0DD6 },
+    { 0x0E31, 0x0E31 }, { 0x0E34, 0x0E3A }, { 0x0E47, 0x0E4E },
+    { 0x0EB1, 0x0EB1 }, { 0x0EB4, 0x0EB9 }, { 0x0EBB, 0x0EBC },
+    { 0x0EC8, 0x0ECD }, { 0x0F18, 0x0F19 }, { 0x0F35, 0x0F35 },
+    { 0x0F37, 0x0F37 }, { 0x0F39, 0x0F39 }, { 0x0F71, 0x0F7E },
+    { 0x0F80, 0x0F84 }, { 0x0F86, 0x0F87 }, { 0x0F90, 0x0F97 },
+    { 0x0F99, 0x0FBC }, { 0x0FC6, 0x0FC6 }, { 0x102D, 0x1030 },
+    { 0x1032, 0x1032 }, { 0x1036, 0x1037 }, { 0x1039, 0x1039 },
+    { 0x1058, 0x1059 }, { 0x1160, 0x11FF }, { 0x135F, 0x135F },
+    { 0x1712, 0x1714 }, { 0x1732, 0x1734 }, { 0x1752, 0x1753 },
+    { 0x1772, 0x1773 }, { 0x17B4, 0x17B5 }, { 0x17B7, 0x17BD },
+    { 0x17C6, 0x17C6 }, { 0x17C9, 0x17D3 }, { 0x17DD, 0x17DD },
+    { 0x180B, 0x180D }, { 0x18A9, 0x18A9 }, { 0x1920, 0x1922 },
+    { 0x1927, 0x1928 }, { 0x1932, 0x1932 }, { 0x1939, 0x193B },
+    { 0x1A17, 0x1A18 }, { 0x1B00, 0x1B03 }, { 0x1B34, 0x1B34 },
+    { 0x1B36, 0x1B3A }, { 0x1B3C, 0x1B3C }, { 0x1B42, 0x1B42 },
+    { 0x1B6B, 0x1B73 }, { 0x1DC0, 0x1DCA }, { 0x1DFE, 0x1DFF },
+    { 0x200B, 0x200F }, { 0x202A, 0x202E }, { 0x2060, 0x2063 },
+    { 0x206A, 0x206F }, { 0x20D0, 0x20EF }, { 0x302A, 0x302F },
+    { 0x3099, 0x309A }, { 0xA806, 0xA806 }, { 0xA80B, 0xA80B },
+    { 0xA825, 0xA826 }, { 0xFB1E, 0xFB1E }, { 0xFE00, 0xFE0F },
+    { 0xFE20, 0xFE23 }, { 0xFEFF, 0xFEFF }, { 0xFFF9, 0xFFFB },
+    { 0x10A01, 0x10A03 }, { 0x10A05, 0x10A06 }, { 0x10A0C, 0x10A0F },
+    { 0x10A38, 0x10A3A }, { 0x10A3F, 0x10A3F }, { 0x1D167, 0x1D169 },
+    { 0x1D173, 0x1D182 }, { 0x1D185, 0x1D18B }, { 0x1D1AA, 0x1D1AD },
+    { 0x1D242, 0x1D244 }, { 0xE0001, 0xE0001 }, { 0xE0020, 0xE007F },
+    { 0xE0100, 0xE01EF }
+  };
+
+  /* test for 8-bit control characters */
+  if (ucs == 0)
+    return 0;
+  if (ucs < 32 || (ucs >= 0x7f && ucs < 0xa0))
+    return -1;
+
+  /* binary search in table of non-spacing characters */
+  if (bisearch(ucs, combining,
+	       sizeof(combining) / sizeof(struct interval) - 1))
+    return 0;
+
+  /* if we arrive here, ucs is not a combining or C0/C1 control character */
+
+  return 1 +
+    (ucs >= 0x1100 &&
+     (ucs <= 0x115f ||                    /* Hangul Jamo init. consonants */
+      ucs == 0x2329 || ucs == 0x232a ||
+      (ucs >= 0x2e80 && ucs <= 0xa4cf &&
+       ucs != 0x303f)                     /* CJK ... Yi */
+      || (ucs >= 0xac00 && ucs <= 0xd7a3) /* Hangul Syllables */
+      || (ucs >= 0xf900 && ucs <= 0xfaff) /* CJK Compatibility Ideographs */
+      || (ucs >= 0xfe10 && ucs <= 0xfe19) /* Vertical forms */
+      || (ucs >= 0xfe30 && ucs <= 0xfe6f) /* CJK Compatibility Forms */
+      || (ucs >= 0xff00 && ucs <= 0xff60) /* Fullwidth Forms */
+      || (ucs >= 0xffe0 && ucs <= 0xffe6)
+#if !defined(SIZEOF_WCHAR_T) || (SIZEOF_WCHAR_T >= 4)
+      || (ucs >= 0x20000 && ucs <= 0x2fffd)
+      || (ucs >= 0x30000 && ucs <= 0x3fffd)
+#endif
+      ));
+}
+
+
+NCURSES_EXPORT(int) mk_wcswidth(const wchar_t *pwcs, size_t n)
+{
+  int w, width = 0;
+
+  for (;*pwcs && n-- > 0; pwcs++)
+    if ((w = mk_wcwidth(*pwcs)) < 0)
+      return -1;
+    else
+      width += w;
+
+  return width;
+}
+
+
+/*
+ * The following functions are the same as mk_wcwidth() and
+ * mk_wcswidth(), except that spacing characters in the East Asian
+ * Ambiguous (A) category as defined in Unicode Technical Report #11
+ * have a column width of 2. This variant might be useful for users of
+ * CJK legacy encodings who want to migrate to UCS without changing
+ * the traditional terminal character-width behaviour. It is not
+ * otherwise recommended for general use.
+ */
+NCURSES_EXPORT(int) mk_wcwidth_cjk(wchar_t ucs)
+{
+  /* sorted list of non-overlapping intervals of East Asian Ambiguous
+   * characters, generated by "uniset +WIDTH-A -cat=Me -cat=Mn -cat=Cf c" */
+  static const struct interval ambiguous[] = {
+    { 0x00A1, 0x00A1 }, { 0x00A4, 0x00A4 }, { 0x00A7, 0x00A8 },
+    { 0x00AA, 0x00AA }, { 0x00AE, 0x00AE }, { 0x00B0, 0x00B4 },
+    { 0x00B6, 0x00BA }, { 0x00BC, 0x00BF }, { 0x00C6, 0x00C6 },
+    { 0x00D0, 0x00D0 }, { 0x00D7, 0x00D8 }, { 0x00DE, 0x00E1 },
+    { 0x00E6, 0x00E6 }, { 0x00E8, 0x00EA }, { 0x00EC, 0x00ED },
+    { 0x00F0, 0x00F0 }, { 0x00F2, 0x00F3 }, { 0x00F7, 0x00FA },
+    { 0x00FC, 0x00FC }, { 0x00FE, 0x00FE }, { 0x0101, 0x0101 },
+    { 0x0111, 0x0111 }, { 0x0113, 0x0113 }, { 0x011B, 0x011B },
+    { 0x0126, 0x0127 }, { 0x012B, 0x012B }, { 0x0131, 0x0133 },
+    { 0x0138, 0x0138 }, { 0x013F, 0x0142 }, { 0x0144, 0x0144 },
+    { 0x0148, 0x014B }, { 0x014D, 0x014D }, { 0x0152, 0x0153 },
+    { 0x0166, 0x0167 }, { 0x016B, 0x016B }, { 0x01CE, 0x01CE },
+    { 0x01D0, 0x01D0 }, { 0x01D2, 0x01D2 }, { 0x01D4, 0x01D4 },
+    { 0x01D6, 0x01D6 }, { 0x01D8, 0x01D8 }, { 0x01DA, 0x01DA },
+    { 0x01DC, 0x01DC }, { 0x0251, 0x0251 }, { 0x0261, 0x0261 },
+    { 0x02C4, 0x02C4 }, { 0x02C7, 0x02C7 }, { 0x02C9, 0x02CB },
+    { 0x02CD, 0x02CD }, { 0x02D0, 0x02D0 }, { 0x02D8, 0x02DB },
+    { 0x02DD, 0x02DD }, { 0x02DF, 0x02DF }, { 0x0391, 0x03A1 },
+    { 0x03A3, 0x03A9 }, { 0x03B1, 0x03C1 }, { 0x03C3, 0x03C9 },
+    { 0x0401, 0x0401 }, { 0x0410, 0x044F }, { 0x0451, 0x0451 },
+    { 0x2010, 0x2010 }, { 0x2013, 0x2016 }, { 0x2018, 0x2019 },
+    { 0x201C, 0x201D }, { 0x2020, 0x2022 }, { 0x2024, 0x2027 },
+    { 0x2030, 0x2030 }, { 0x2032, 0x2033 }, { 0x2035, 0x2035 },
+    { 0x203B, 0x203B }, { 0x203E, 0x203E }, { 0x2074, 0x2074 },
+    { 0x207F, 0x207F }, { 0x2081, 0x2084 }, { 0x20AC, 0x20AC },
+    { 0x2103, 0x2103 }, { 0x2105, 0x2105 }, { 0x2109, 0x2109 },
+    { 0x2113, 0x2113 }, { 0x2116, 0x2116 }, { 0x2121, 0x2122 },
+    { 0x2126, 0x2126 }, { 0x212B, 0x212B }, { 0x2153, 0x2154 },
+    { 0x215B, 0x215E }, { 0x2160, 0x216B }, { 0x2170, 0x2179 },
+    { 0x2190, 0x2199 }, { 0x21B8, 0x21B9 }, { 0x21D2, 0x21D2 },
+    { 0x21D4, 0x21D4 }, { 0x21E7, 0x21E7 }, { 0x2200, 0x2200 },
+    { 0x2202, 0x2203 }, { 0x2207, 0x2208 }, { 0x220B, 0x220B },
+    { 0x220F, 0x220F }, { 0x2211, 0x2211 }, { 0x2215, 0x2215 },
+    { 0x221A, 0x221A }, { 0x221D, 0x2220 }, { 0x2223, 0x2223 },
+    { 0x2225, 0x2225 }, { 0x2227, 0x222C }, { 0x222E, 0x222E },
+    { 0x2234, 0x2237 }, { 0x223C, 0x223D }, { 0x2248, 0x2248 },
+    { 0x224C, 0x224C }, { 0x2252, 0x2252 }, { 0x2260, 0x2261 },
+    { 0x2264, 0x2267 }, { 0x226A, 0x226B }, { 0x226E, 0x226F },
+    { 0x2282, 0x2283 }, { 0x2286, 0x2287 }, { 0x2295, 0x2295 },
+    { 0x2299, 0x2299 }, { 0x22A5, 0x22A5 }, { 0x22BF, 0x22BF },
+    { 0x2312, 0x2312 }, { 0x2460, 0x24E9 }, { 0x24EB, 0x254B },
+    { 0x2550, 0x2573 }, { 0x2580, 0x258F }, { 0x2592, 0x2595 },
+    { 0x25A0, 0x25A1 }, { 0x25A3, 0x25A9 }, { 0x25B2, 0x25B3 },
+    { 0x25B6, 0x25B7 }, { 0x25BC, 0x25BD }, { 0x25C0, 0x25C1 },
+    { 0x25C6, 0x25C8 }, { 0x25CB, 0x25CB }, { 0x25CE, 0x25D1 },
+    { 0x25E2, 0x25E5 }, { 0x25EF, 0x25EF }, { 0x2605, 0x2606 },
+    { 0x2609, 0x2609 }, { 0x260E, 0x260F }, { 0x2614, 0x2615 },
+    { 0x261C, 0x261C }, { 0x261E, 0x261E }, { 0x2640, 0x2640 },
+    { 0x2642, 0x2642 }, { 0x2660, 0x2661 }, { 0x2663, 0x2665 },
+    { 0x2667, 0x266A }, { 0x266C, 0x266D }, { 0x266F, 0x266F },
+    { 0x273D, 0x273D }, { 0x2776, 0x277F }, { 0xE000, 0xF8FF },
+    { 0xFFFD, 0xFFFD }, { 0xF0000, 0xFFFFD }, { 0x100000, 0x10FFFD }
+  };
+
+  /* binary search in table of non-spacing characters */
+  if (bisearch(ucs, ambiguous,
+	       sizeof(ambiguous) / sizeof(struct interval) - 1))
+    return 2;
+
+  return mk_wcwidth(ucs);
+}
+
+
+NCURSES_EXPORT(int) mk_wcswidth_cjk(const wchar_t *pwcs, size_t n)
+{
+  int w, width = 0;
+
+  for (;*pwcs && n-- > 0; pwcs++)
+    if ((w = mk_wcwidth_cjk(*pwcs)) < 0)
+      return -1;
+    else
+      width += w;
+
+  return width;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _WCWIDTH_H_incl 1 */
diff --git a/ncurses/widechar/charable.c b/ncurses/widechar/charable.c
new file mode 100644
index 0000000..55d4890
--- /dev/null
+++ b/ncurses/widechar/charable.c
@@ -0,0 +1,85 @@
+/****************************************************************************
+ * Copyright 2018,2020 Thomas E. Dickey                                     *
+ * Copyright 2003-2005,2008 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.                                                           *
+ ****************************************************************************/
+
+/*
+**	Support functions for wide/narrow conversion.
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: charable.c,v 1.8 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(bool) _nc_is_charable(wchar_t ch)
+{
+    bool result;
+#if HAVE_WCTOB
+    result = (wctob((wint_t) ch) == (int) ch);
+#else
+    result = (_nc_to_char(ch) >= 0);
+#endif
+    return result;
+}
+
+NCURSES_EXPORT(int) _nc_to_char(wint_t ch)
+{
+    int result;
+#if HAVE_WCTOB
+    result = wctob(ch);
+#elif HAVE_WCTOMB
+    char temp[MB_LEN_MAX];
+    result = wctomb(temp, ch);
+    if (strlen(temp) == 1)
+	result = UChar(temp[0]);
+    else
+	result = -1;
+#else
+#error expected either wctob/wctomb
+#endif
+    return result;
+}
+
+NCURSES_EXPORT(wint_t) _nc_to_widechar(int ch)
+{
+    wint_t result;
+#if HAVE_BTOWC
+    result = btowc(ch);
+#elif HAVE_MBTOWC
+    wchar_t convert;
+    char temp[2];
+    temp[0] = ch;
+    temp[1] = '\0';
+    if (mbtowc(&convert, temp, 1) >= 0)
+	result = convert;
+    else
+	result = WEOF;
+#else
+#error expected either btowc/mbtowc
+#endif
+    return result;
+}
diff --git a/ncurses/widechar/lib_add_wch.c b/ncurses/widechar/lib_add_wch.c
new file mode 100644
index 0000000..b817647
--- /dev/null
+++ b/ncurses/widechar/lib_add_wch.c
@@ -0,0 +1,444 @@
+/****************************************************************************
+ * Copyright 2019-2020,2021 Thomas E. Dickey                                *
+ * Copyright 2004-2011,2016 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.                                                           *
+ ****************************************************************************/
+
+/*
+**	lib_add_wch.c
+**
+**	The routine wadd_wch().
+**
+*/
+
+#include <curses.priv.h>
+
+#if HAVE_WCTYPE_H
+#include <wctype.h>
+#endif
+
+MODULE_ID("$Id: lib_add_wch.c,v 1.17 2021/06/17 21:26:02 tom Exp $")
+
+/* clone/adapt lib_addch.c */
+static const cchar_t blankchar = NewChar(BLANK_TEXT);
+
+/*
+ * Ugly microtweaking alert.  Everything from here to end of module is
+ * likely to be speed-critical -- profiling data sure says it is!
+ * Most of the important screen-painting functions are shells around
+ * wadd_wch().  So we make every effort to reduce function-call overhead
+ * by inlining stuff, even at the cost of making wrapped copies for
+ * export.  Also we supply some internal versions that don't call the
+ * window sync hook, for use by string-put functions.
+ */
+
+/* Return bit mask for clearing color pair number if given ch has color */
+#define COLOR_MASK(ch) (~(attr_t)(((ch) & A_COLOR) ? A_COLOR : 0))
+
+static NCURSES_INLINE cchar_t
+render_char(WINDOW *win, cchar_t ch)
+/* compute a rendition of the given char correct for the current context */
+{
+    attr_t a = WINDOW_ATTRS(win);
+    int pair = GetPair(ch);
+
+    if (ISBLANK(ch)
+	&& AttrOf(ch) == A_NORMAL
+	&& pair == 0) {
+	/* color/pair in attrs has precedence over bkgrnd */
+	ch = win->_nc_bkgd;
+	SetAttr(ch, a | AttrOf(win->_nc_bkgd));
+	if ((pair = GET_WINDOW_PAIR(win)) == 0)
+	    pair = GetPair(win->_nc_bkgd);
+	SetPair(ch, pair);
+    } else {
+	/* color in attrs has precedence over bkgrnd */
+	a |= AttrOf(win->_nc_bkgd) & COLOR_MASK(a);
+	/* color in ch has precedence */
+	if (pair == 0) {
+	    if ((pair = GET_WINDOW_PAIR(win)) == 0)
+		pair = GetPair(win->_nc_bkgd);
+	}
+	AddAttr(ch, (a & COLOR_MASK(AttrOf(ch))));
+	SetPair(ch, pair);
+    }
+
+    TR(TRACE_VIRTPUT,
+       ("render_char bkg %s (%d), attrs %s (%d) -> ch %s (%d)",
+	_tracech_t2(1, CHREF(win->_nc_bkgd)),
+	GetPair(win->_nc_bkgd),
+	_traceattr(WINDOW_ATTRS(win)),
+	GET_WINDOW_PAIR(win),
+	_tracech_t2(3, CHREF(ch)),
+	GetPair(ch)));
+
+    return (ch);
+}
+
+/* check if position is legal; if not, return error */
+#ifndef NDEBUG			/* treat this like an assertion */
+#define CHECK_POSITION(win, x, y) \
+	if (y > win->_maxy \
+	 || x > win->_maxx \
+	 || y < 0 \
+	 || x < 0) { \
+		TR(TRACE_VIRTPUT, ("Alert! Win=%p _curx = %d, _cury = %d " \
+				   "(_maxx = %d, _maxy = %d)", win, x, y, \
+				   win->_maxx, win->_maxy)); \
+		return(ERR); \
+	}
+#else
+#define CHECK_POSITION(win, x, y)	/* nothing */
+#endif
+
+static bool
+newline_forces_scroll(WINDOW *win, NCURSES_SIZE_T *ypos)
+{
+    bool result = FALSE;
+
+    if (*ypos >= win->_regtop && *ypos == win->_regbottom) {
+	*ypos = win->_regbottom;
+	result = TRUE;
+    } else {
+	*ypos = (NCURSES_SIZE_T) (*ypos + 1);
+    }
+    return result;
+}
+
+/*
+ * The _WRAPPED flag is useful only for telling an application that we've just
+ * wrapped the cursor.  We don't do anything with this flag except set it when
+ * wrapping, and clear it whenever we move the cursor.  If we try to wrap at
+ * the lower-right corner of a window, we cannot move the cursor (since that
+ * wouldn't be legal).  So we return an error (which is what SVr4 does).
+ * Unlike SVr4, we can successfully add a character to the lower-right corner
+ * (Solaris 2.6 does this also, however).
+ */
+static int
+wrap_to_next_line(WINDOW *win)
+{
+    win->_flags |= _WRAPPED;
+    if (newline_forces_scroll(win, &(win->_cury))) {
+	win->_curx = win->_maxx;
+	if (!win->_scroll)
+	    return (ERR);
+	scroll(win);
+    }
+    win->_curx = 0;
+    return (OK);
+}
+
+static int wadd_wch_literal(WINDOW *, cchar_t);
+/*
+ * Fill the given number of cells with blanks using the current background
+ * rendition.  This saves/restores the current x-position.
+ */
+static void
+fill_cells(WINDOW *win, int count)
+{
+    cchar_t blank = blankchar;
+    int save_x = win->_curx;
+    int save_y = win->_cury;
+
+    while (count-- > 0) {
+	if (wadd_wch_literal(win, blank) == ERR)
+	    break;
+    }
+    win->_curx = (NCURSES_SIZE_T) save_x;
+    win->_cury = (NCURSES_SIZE_T) save_y;
+}
+
+static int
+wadd_wch_literal(WINDOW *win, cchar_t ch)
+{
+    int x;
+    int y;
+    struct ldat *line;
+
+    x = win->_curx;
+    y = win->_cury;
+
+    CHECK_POSITION(win, x, y);
+
+    ch = render_char(win, ch);
+
+    line = win->_line + y;
+
+    CHANGED_CELL(line, x);
+
+    /*
+     * Non-spacing characters are added to the current cell.
+     *
+     * Spacing characters that are wider than one column require some display
+     * adjustments.
+     */
+    {
+	int len = _nc_wacs_width(CharOf(ch));
+	int i;
+	int j;
+	wchar_t *chars;
+
+	if (len == 0) {		/* non-spacing */
+	    if ((x > 0 && y >= 0)
+		|| (win->_maxx >= 0 && win->_cury >= 1)) {
+		if (x > 0 && y >= 0)
+		    chars = (win->_line[y].text[x - 1].chars);
+		else
+		    chars = (win->_line[y - 1].text[win->_maxx].chars);
+		for (i = 0; i < CCHARW_MAX; ++i) {
+		    if (chars[i] == 0) {
+			TR(TRACE_VIRTPUT,
+			   ("added non-spacing %d: %x",
+			    x, (int) CharOf(ch)));
+			chars[i] = CharOf(ch);
+			break;
+		    }
+		}
+	    }
+	    goto testwrapping;
+	} else if (len > 1) {	/* multi-column characters */
+	    /*
+	     * Check if the character will fit on the current line.  If it does
+	     * not fit, fill in the remainder of the line with blanks.  and
+	     * move to the next line.
+	     */
+	    if (len > win->_maxx + 1) {
+		TR(TRACE_VIRTPUT, ("character will not fit"));
+		return ERR;
+	    } else if (x + len > win->_maxx + 1) {
+		int count = win->_maxx + 1 - x;
+		TR(TRACE_VIRTPUT, ("fill %d remaining cells", count));
+		fill_cells(win, count);
+		if (wrap_to_next_line(win) == ERR)
+		    return ERR;
+		x = win->_curx;
+		y = win->_cury;
+		line = win->_line + y;
+	    }
+	    /*
+	     * Check for cells which are orphaned by adding this character, set
+	     * those to blanks.
+	     *
+	     * FIXME: this actually could fill j-i cells, more complicated to
+	     * setup though.
+	     */
+	    for (i = 0; i < len; ++i) {
+		if (isWidecBase(win->_line[y].text[x + i])) {
+		    break;
+		} else if (isWidecExt(win->_line[y].text[x + i])) {
+		    for (j = i; x + j <= win->_maxx; ++j) {
+			if (!isWidecExt(win->_line[y].text[x + j])) {
+			    TR(TRACE_VIRTPUT, ("fill %d orphan cells", j));
+			    fill_cells(win, j);
+			    break;
+			}
+		    }
+		    break;
+		}
+	    }
+	    /*
+	     * Finally, add the cells for this character.
+	     */
+	    for (i = 0; i < len; ++i) {
+		cchar_t value = ch;
+		SetWidecExt(value, i);
+		TR(TRACE_VIRTPUT, ("multicolumn %d:%d (%d,%d)",
+				   i + 1, len,
+				   win->_begy + y, win->_begx + x));
+		line->text[x] = value;
+		CHANGED_CELL(line, x);
+		++x;
+	    }
+	    goto testwrapping;
+	}
+    }
+
+    /*
+     * Single-column characters.
+     */
+    line->text[x++] = ch;
+    /*
+     * This label is used only for wide-characters.
+     */
+  testwrapping:
+
+    TR(TRACE_VIRTPUT, ("cell (%ld, %ld..%d) = %s",
+		       (long) win->_cury, (long) win->_curx, x - 1,
+		       _tracech_t(CHREF(ch))));
+
+    if (x > win->_maxx) {
+	return wrap_to_next_line(win);
+    }
+    win->_curx = (NCURSES_SIZE_T) x;
+    return OK;
+}
+
+static NCURSES_INLINE int
+wadd_wch_nosync(WINDOW *win, cchar_t ch)
+/* the workhorse function -- add a character to the given window */
+{
+    NCURSES_SIZE_T x, y;
+    wchar_t *s;
+    int tabsize = 8;
+#if USE_REENTRANT
+    SCREEN *sp = _nc_screen_of(win);
+#endif
+
+    /*
+     * If we are using the alternate character set, forget about locale.
+     * Otherwise, if the locale claims the code is printable, treat it that
+     * way.
+     */
+    if ((AttrOf(ch) & A_ALTCHARSET)
+	|| iswprint((wint_t) CharOf(ch)))
+	return wadd_wch_literal(win, ch);
+
+    /*
+     * Handle carriage control and other codes that are not printable, or are
+     * known to expand to more than one character according to unctrl().
+     */
+    x = win->_curx;
+    y = win->_cury;
+
+    switch (CharOf(ch)) {
+    case '\t':
+#if USE_REENTRANT
+	tabsize = *ptrTabsize(sp);
+#else
+	tabsize = TABSIZE;
+#endif
+	x = (NCURSES_SIZE_T) (x + (tabsize - (x % tabsize)));
+	/*
+	 * Space-fill the tab on the bottom line so that we'll get the
+	 * "correct" cursor position.
+	 */
+	if ((!win->_scroll && (y == win->_regbottom))
+	    || (x <= win->_maxx)) {
+	    cchar_t blank = blankchar;
+	    AddAttr(blank, AttrOf(ch));
+	    while (win->_curx < x) {
+		if (wadd_wch_literal(win, blank) == ERR)
+		    return (ERR);
+	    }
+	    break;
+	} else {
+	    wclrtoeol(win);
+	    win->_flags |= _WRAPPED;
+	    if (newline_forces_scroll(win, &y)) {
+		x = win->_maxx;
+		if (win->_scroll) {
+		    scroll(win);
+		    x = 0;
+		}
+	    } else {
+		x = 0;
+	    }
+	}
+	break;
+    case '\n':
+	wclrtoeol(win);
+	if (newline_forces_scroll(win, &y)) {
+	    if (win->_scroll)
+		scroll(win);
+	    else
+		return (ERR);
+	}
+	/* FALLTHRU */
+    case '\r':
+	x = 0;
+	win->_flags &= ~_WRAPPED;
+	break;
+    case '\b':
+	if (x == 0)
+	    return (OK);
+	x--;
+	win->_flags &= ~_WRAPPED;
+	break;
+    default:
+	if ((s = wunctrl(&ch)) != 0) {
+	    while (*s) {
+		cchar_t sch;
+		SetChar(sch, *s++, AttrOf(ch));
+		if_EXT_COLORS(SetPair(sch, GetPair(ch)));
+		if (wadd_wch_literal(win, sch) == ERR)
+		    return ERR;
+	    }
+	    return OK;
+	}
+	return ERR;
+    }
+
+    win->_curx = x;
+    win->_cury = y;
+
+    return OK;
+}
+
+/*
+ * The versions below call _nc_synchook().  We wanted to avoid this in the
+ * version exported for string puts; they'll call _nc_synchook once at end
+ * of run.
+ */
+
+/* These are actual entry points */
+
+NCURSES_EXPORT(int)
+wadd_wch(WINDOW *win, const cchar_t *wch)
+{
+    int code = ERR;
+
+    TR(TRACE_VIRTPUT | TRACE_CCALLS, (T_CALLED("wadd_wch(%p, %s)"),
+				      (void *) win,
+				      _tracecchar_t(wch)));
+
+    if (win && (wadd_wch_nosync(win, *wch) != ERR)) {
+	_nc_synchook(win);
+	code = OK;
+    }
+
+    TR(TRACE_VIRTPUT | TRACE_CCALLS, (T_RETURN("%d"), code));
+    return (code);
+}
+
+NCURSES_EXPORT(int)
+wecho_wchar(WINDOW *win, const cchar_t *wch)
+{
+    int code = ERR;
+
+    TR(TRACE_VIRTPUT | TRACE_CCALLS, (T_CALLED("wechochar(%p, %s)"),
+				      (void *) win,
+				      _tracecchar_t(wch)));
+
+    if (win && (wadd_wch_nosync(win, *wch) != ERR)) {
+	bool save_immed = win->_immed;
+	win->_immed = TRUE;
+	_nc_synchook(win);
+	win->_immed = save_immed;
+	code = OK;
+    }
+    TR(TRACE_VIRTPUT | TRACE_CCALLS, (T_RETURN("%d"), code));
+    return (code);
+}
diff --git a/ncurses/widechar/lib_box_set.c b/ncurses/widechar/lib_box_set.c
new file mode 100644
index 0000000..ef2e1a7
--- /dev/null
+++ b/ncurses/widechar/lib_box_set.c
@@ -0,0 +1,114 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 2002-2009,2011 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Authors: Sven Verdoolaege and Thomas Dickey 2001,2002                    *
+ ****************************************************************************/
+
+/*
+**	lib_box_set.c
+**
+**	The routine wborder_set().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_box_set.c,v 1.7 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(int)
+wborder_set(WINDOW *win,
+	    const ARG_CH_T ls, const ARG_CH_T rs,
+	    const ARG_CH_T ts, const ARG_CH_T bs,
+	    const ARG_CH_T tl, const ARG_CH_T tr,
+	    const ARG_CH_T bl, const ARG_CH_T br)
+{
+    NCURSES_SIZE_T i;
+    NCURSES_SIZE_T endx, endy;
+    NCURSES_CH_T wls, wrs, wts, wbs, wtl, wtr, wbl, wbr;
+
+    T((T_CALLED("wborder_set(%p,%s,%s,%s,%s,%s,%s,%s,%s)"),
+       (void *) win,
+       _tracech_t2(1, ls),
+       _tracech_t2(2, rs),
+       _tracech_t2(3, ts),
+       _tracech_t2(4, bs),
+       _tracech_t2(5, tl),
+       _tracech_t2(6, tr),
+       _tracech_t2(7, bl),
+       _tracech_t2(8, br)));
+
+    if (!win)
+	returnCode(ERR);
+
+#define RENDER_WITH_DEFAULT(ch,def) w ##ch = _nc_render(win, (ch == 0) ? *(const ARG_CH_T)def : *ch)
+
+    RENDER_WITH_DEFAULT(ls, WACS_VLINE);
+    RENDER_WITH_DEFAULT(rs, WACS_VLINE);
+    RENDER_WITH_DEFAULT(ts, WACS_HLINE);
+    RENDER_WITH_DEFAULT(bs, WACS_HLINE);
+    RENDER_WITH_DEFAULT(tl, WACS_ULCORNER);
+    RENDER_WITH_DEFAULT(tr, WACS_URCORNER);
+    RENDER_WITH_DEFAULT(bl, WACS_LLCORNER);
+    RENDER_WITH_DEFAULT(br, WACS_LRCORNER);
+
+    T(("using %s, %s, %s, %s, %s, %s, %s, %s",
+       _tracech_t2(1, CHREF(wls)),
+       _tracech_t2(2, CHREF(wrs)),
+       _tracech_t2(3, CHREF(wts)),
+       _tracech_t2(4, CHREF(wbs)),
+       _tracech_t2(5, CHREF(wtl)),
+       _tracech_t2(6, CHREF(wtr)),
+       _tracech_t2(7, CHREF(wbl)),
+       _tracech_t2(8, CHREF(wbr))));
+
+    endx = win->_maxx;
+    endy = win->_maxy;
+
+    for (i = 0; i <= endx; i++) {
+	win->_line[0].text[i] = wts;
+	win->_line[endy].text[i] = wbs;
+    }
+    win->_line[endy].firstchar = win->_line[0].firstchar = 0;
+    win->_line[endy].lastchar = win->_line[0].lastchar = endx;
+
+    for (i = 0; i <= endy; i++) {
+	win->_line[i].text[0] = wls;
+	win->_line[i].text[endx] = wrs;
+	win->_line[i].firstchar = 0;
+	win->_line[i].lastchar = endx;
+    }
+    win->_line[0].text[0] = wtl;
+    win->_line[0].text[endx] = wtr;
+    win->_line[endy].text[0] = wbl;
+    win->_line[endy].text[endx] = wbr;
+
+    _nc_synchook(win);
+    returnCode(OK);
+}
diff --git a/ncurses/widechar/lib_cchar.c b/ncurses/widechar/lib_cchar.c
new file mode 100644
index 0000000..451c5dc
--- /dev/null
+++ b/ncurses/widechar/lib_cchar.c
@@ -0,0 +1,158 @@
+/****************************************************************************
+ * Copyright 2019-2021,2022 Thomas E. Dickey                                *
+ * Copyright 2001-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/*
+**	lib_cchar.c
+**
+**	The routines setcchar() and getcchar().
+**
+*/
+
+#include <curses.priv.h>
+#include <wchar.h>
+
+MODULE_ID("$Id: lib_cchar.c,v 1.38 2022/07/27 08:03:16 tom Exp $")
+
+/*
+ * The SuSv2 description leaves some room for interpretation.  We'll assume wch
+ * points to a string which is L'\0' terminated, contains at least one
+ * character with strictly positive width, which must be the first, and
+ * contains no characters of negative width.
+ */
+NCURSES_EXPORT(int)
+setcchar(cchar_t *wcval,
+	 const wchar_t *wch,
+	 const attr_t attrs,
+	 NCURSES_PAIRS_T pair_arg,
+	 const void *opts)
+{
+    int code = OK;
+    int color_pair = pair_arg;
+    unsigned len;
+
+    TR(TRACE_CCALLS, (T_CALLED("setcchar(%p,%s,attrs=%lu,pair=%d,%p)"),
+		      (void *) wcval, _nc_viswbuf(wch),
+		      (unsigned long) attrs, color_pair, opts));
+
+    set_extended_pair(opts, color_pair);
+    if (wch == NULL
+	|| ((len = (unsigned) wcslen(wch)) > 1 && _nc_wacs_width(wch[0]) < 0)
+	|| color_pair < 0) {
+	code = ERR;
+    } else {
+	unsigned i;
+
+	if (len > CCHARW_MAX)
+	    len = CCHARW_MAX;
+
+	/*
+	 * If we have a following spacing-character, stop at that point.  We
+	 * are only interested in adding non-spacing characters.
+	 */
+	for (i = 1; i < len; ++i) {
+	    if (_nc_wacs_width(wch[i]) != 0) {
+		len = i;
+		break;
+	    }
+	}
+
+	memset(wcval, 0, sizeof(*wcval));
+
+	if (len != 0) {
+	    SetAttr(*wcval, attrs);
+	    SetPair(CHDEREF(wcval), color_pair);
+	    memcpy(&wcval->chars, wch, len * sizeof(wchar_t));
+	    TR(TRACE_CCALLS, ("copy %d wchars, first is %s", len,
+			      _tracecchar_t(wcval)));
+	}
+    }
+
+    TR(TRACE_CCALLS, (T_RETURN("%d"), code));
+    return (code);
+}
+
+NCURSES_EXPORT(int)
+getcchar(const cchar_t *wcval,
+	 wchar_t *wch,
+	 attr_t *attrs,
+	 NCURSES_PAIRS_T *pair_arg,
+	 void *opts)
+{
+    int code = ERR;
+
+    TR(TRACE_CCALLS, (T_CALLED("getcchar(%p,%p,%p,%p,%p)"),
+		      (const void *) wcval,
+		      (void *) wch,
+		      (void *) attrs,
+		      (void *) pair_arg,
+		      opts));
+
+#if !NCURSES_EXT_COLORS
+    if (opts != NULL) {
+	;			/* empty */
+    } else
+#endif
+    if (wcval != NULL) {
+	wchar_t *wp;
+	int len;
+
+#if HAVE_WMEMCHR
+	len = ((wp = wmemchr(wcval->chars, L'\0', (size_t) CCHARW_MAX))
+	       ? (int) (wp - wcval->chars)
+	       : CCHARW_MAX);
+#else
+	len = wcsnlen(wcval->chars, CCHARW_MAX);
+#endif
+	if (wch == NULL) {
+	    /*
+	     * If the value is a null, set the length to 1.
+	     * If the value is not a null, return the length plus 1 for null.
+	     */
+	    code = (len < CCHARW_MAX) ? (len + 1) : CCHARW_MAX;
+	} else if (attrs == 0 || pair_arg == 0) {
+	    code = ERR;
+	} else if (len >= 0) {
+	    int color_pair;
+
+	    TR(TRACE_CCALLS, ("copy %d wchars, first is %s", len,
+			      _tracecchar_t(wcval)));
+	    *attrs = AttrOf(*wcval) & A_ATTRIBUTES;
+	    color_pair = GetPair(*wcval);
+	    get_extended_pair(opts, color_pair);
+	    *pair_arg = limit_PAIRS(color_pair);
+	    wmemcpy(wch, wcval->chars, (size_t) len);
+	    wch[len] = L'\0';
+	    if (*pair_arg >= 0)
+		code = OK;
+	}
+    }
+
+    TR(TRACE_CCALLS, (T_RETURN("%d"), code));
+    return (code);
+}
diff --git a/ncurses/widechar/lib_erasewchar.c b/ncurses/widechar/lib_erasewchar.c
new file mode 100644
index 0000000..197f80b
--- /dev/null
+++ b/ncurses/widechar/lib_erasewchar.c
@@ -0,0 +1,96 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 2002-2010,2014 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey 2002                                           *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_erasewchar.c,v 1.5 2021/05/22 23:51:14 tom Exp $")
+
+/*
+ *	erasewchar()
+ *
+ *	Return erase character as given in cur_term->Ottyb.
+ */
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(erasewchar) (NCURSES_SP_DCLx wchar_t *wch);
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(erasewchar) (NCURSES_SP_DCLx wchar_t *wch)
+{
+    int value;
+    int result = ERR;
+
+    T((T_CALLED("erasewchar()")));
+    if ((value = NCURSES_SP_NAME(erasechar) (NCURSES_SP_ARG)) != ERR) {
+	*wch = (wchar_t) value;
+	result = OK;
+    }
+    returnCode(result);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+erasewchar(wchar_t *wch)
+{
+    return NCURSES_SP_NAME(erasewchar) (CURRENT_SCREEN, wch);
+}
+#endif
+
+/*
+ *	killwchar()
+ *
+ *	Return kill character as given in cur_term->Ottyb.
+ */
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(killwchar) (NCURSES_SP_DCLx wchar_t *wch);
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(killwchar) (NCURSES_SP_DCLx wchar_t *wch)
+{
+    int value;
+    int result = ERR;
+
+    T((T_CALLED("killwchar()")));
+    if ((value = NCURSES_SP_NAME(killchar) (NCURSES_SP_ARG)) != ERR) {
+	*wch = (wchar_t) value;
+	result = OK;
+    }
+    returnCode(result);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+killwchar(wchar_t *wch)
+{
+    return NCURSES_SP_NAME(killwchar) (CURRENT_SCREEN, wch);
+}
+#endif
diff --git a/ncurses/widechar/lib_get_wch.c b/ncurses/widechar/lib_get_wch.c
new file mode 100644
index 0000000..9f10d3b
--- /dev/null
+++ b/ncurses/widechar/lib_get_wch.c
@@ -0,0 +1,121 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 2002-2011,2016 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey 2002-on                                        *
+ ****************************************************************************/
+
+/*
+**	lib_get_wch.c
+**
+**	The routine get_wch().
+**
+*/
+
+#include <curses.priv.h>
+#include <ctype.h>
+
+MODULE_ID("$Id: lib_get_wch.c,v 1.26 2021/04/17 16:12:54 tom Exp $")
+
+NCURSES_EXPORT(int)
+wget_wch(WINDOW *win, wint_t *result)
+{
+    SCREEN *sp;
+    int code;
+    int value = 0;
+#ifndef state_unused
+    mbstate_t state;
+#endif
+
+    T((T_CALLED("wget_wch(%p)"), (void *) win));
+
+    /*
+     * We can get a stream of single-byte characters and KEY_xxx codes from
+     * _nc_wgetch(), while we want to return a wide character or KEY_xxx code.
+     */
+    _nc_lock_global(curses);
+    sp = _nc_screen_of(win);
+
+    if (sp != 0) {
+	size_t count = 0;
+
+	for (;;) {
+	    char buffer[(MB_LEN_MAX * 9) + 1];	/* allow some redundant shifts */
+
+	    T(("reading %d of %d", (int) count + 1, (int) sizeof(buffer)));
+	    code = _nc_wgetch(win, &value, TRUE EVENTLIST_2nd((_nc_eventlist
+							       *) 0));
+	    if (code == ERR) {
+		break;
+	    } else if (code == KEY_CODE_YES) {
+		/*
+		 * If we were processing an incomplete multibyte character,
+		 * return an error since we have a KEY_xxx code which
+		 * interrupts it.  For some cases, we could improve this by
+		 * writing a new version of lib_getch.c(!), but it is not clear
+		 * whether the improvement would be worth the effort.
+		 */
+		if (count != 0) {
+		    safe_ungetch(SP_PARM, value);
+		    code = ERR;
+		}
+		break;
+	    } else if (count + 1 >= sizeof(buffer)) {
+		safe_ungetch(SP_PARM, value);
+		code = ERR;
+		break;
+	    } else {
+		int status;
+
+		buffer[count++] = (char) UChar(value);
+		reset_mbytes(state);
+		status = count_mbytes(buffer, count, state);
+		if (status >= 0) {
+		    wchar_t wch;
+		    reset_mbytes(state);
+		    if (check_mbytes(wch, buffer, count, state) != status) {
+			code = ERR;	/* the two calls should match */
+			safe_ungetch(SP_PARM, value);
+		    }
+		    value = wch;
+		    break;
+		}
+	    }
+	}
+    } else {
+	code = ERR;
+    }
+
+    if (result != 0)
+	*result = (wint_t) value;
+
+    _nc_unlock_global(curses);
+    T(("result %#o", value));
+    returnCode(code);
+}
diff --git a/ncurses/widechar/lib_get_wstr.c b/ncurses/widechar/lib_get_wstr.c
new file mode 100644
index 0000000..c4dec5c
--- /dev/null
+++ b/ncurses/widechar/lib_get_wstr.c
@@ -0,0 +1,233 @@
+/****************************************************************************
+ * Copyright 2018-2020,2021 Thomas E. Dickey                                *
+ * Copyright 2002-2009,2011 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                                                *
+ ****************************************************************************/
+
+/*
+**	lib_get_wstr.c
+**
+**	The routine wgetn_wstr().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_get_wstr.c,v 1.20 2021/10/23 19:02:59 tom Exp $")
+
+static int
+wadd_wint(WINDOW *win, wint_t *src)
+{
+    cchar_t tmp;
+    wchar_t wch[2];
+
+    wch[0] = (wchar_t) (*src);
+    wch[1] = 0;
+    setcchar(&tmp, wch, A_NORMAL, (short) 0, NULL);
+    return wadd_wch(win, &tmp);
+}
+
+/*
+ * This wipes out the last character, no matter whether it was a tab, control
+ * or other character, and handles reverse wraparound.
+ */
+static wint_t *
+WipeOut(WINDOW *win, int y, int x, wint_t *first, wint_t *last, int echoed)
+{
+    if (last > first) {
+	*--last = '\0';
+	if (echoed) {
+	    int y1 = win->_cury;
+	    int x1 = win->_curx;
+	    int n;
+
+	    wmove(win, y, x);
+	    for (n = 0; first[n] != 0; ++n) {
+		wadd_wint(win, first + n);
+	    }
+	    getyx(win, y, x);
+	    while (win->_cury < y1
+		   || (win->_cury == y1 && win->_curx < x1))
+		waddch(win, (chtype) ' ');
+
+	    wmove(win, y, x);
+	}
+    }
+    return last;
+}
+
+NCURSES_EXPORT(int)
+wgetn_wstr(WINDOW *win, wint_t *str, int maxlen)
+{
+    SCREEN *sp = _nc_screen_of(win);
+    TTY buf;
+    bool oldnl, oldecho, oldraw, oldcbreak;
+    wchar_t erasec = 0;
+    wchar_t killc = 0;
+    wint_t *oldstr = str;
+    wint_t *tmpstr = str;
+    wint_t ch;
+    int y, x, code;
+
+    T((T_CALLED("wgetn_wstr(%p,%p, %d)"), (void *) win, (void *) str, maxlen));
+
+    if (!win)
+	returnCode(ERR);
+
+    maxlen = _nc_getstr_limit(maxlen);
+
+    _nc_get_tty_mode(&buf);
+
+    oldnl = sp->_nl;
+    oldecho = sp->_echo;
+    oldraw = sp->_raw;
+    oldcbreak = sp->_cbreak;
+    NCURSES_SP_NAME(nl) (NCURSES_SP_ARG);
+    NCURSES_SP_NAME(noecho) (NCURSES_SP_ARG);
+    NCURSES_SP_NAME(raw) (NCURSES_SP_ARG);
+
+    NCURSES_SP_NAME(erasewchar) (NCURSES_SP_ARGx &erasec);
+    NCURSES_SP_NAME(killwchar) (NCURSES_SP_ARGx &killc);
+
+    getyx(win, y, x);
+
+    if (is_wintouched(win) || (win->_flags & _HASMOVED))
+	wrefresh(win);
+
+    while ((code = wget_wch(win, &ch)) != ERR) {
+	/*
+	 * Map special characters into key-codes.
+	 */
+	if (ch == '\r')
+	    ch = '\n';
+	if (ch == '\n') {
+	    code = KEY_CODE_YES;
+	    ch = KEY_ENTER;
+	}
+	if (ch != 0 && ch < KEY_MIN) {
+	    if (ch == (wint_t) erasec) {
+		ch = KEY_BACKSPACE;
+		code = KEY_CODE_YES;
+	    }
+	    if (ch == (wint_t) killc) {
+		ch = KEY_EOL;
+		code = KEY_CODE_YES;
+	    }
+	}
+	if (code == KEY_CODE_YES) {
+	    /*
+	     * Some terminals (the Wyse-50 is the most common) generate a \n
+	     * from the down-arrow key.  With this logic, it is the user's
+	     * choice whether to set kcud=\n for wget_wch(); terminating
+	     * *getn_wstr() with \n should work either way.
+	     */
+	    if (ch == KEY_DOWN || ch == KEY_ENTER) {
+		if (oldecho == TRUE
+		    && win->_cury == win->_maxy
+		    && win->_scroll)
+		    wechochar(win, (chtype) '\n');
+		break;
+	    }
+	    if (ch == KEY_LEFT || ch == KEY_BACKSPACE) {
+		if (tmpstr > oldstr) {
+		    tmpstr = WipeOut(win, y, x, oldstr, tmpstr, oldecho);
+		}
+	    } else if (ch == KEY_EOL) {
+		while (tmpstr > oldstr) {
+		    tmpstr = WipeOut(win, y, x, oldstr, tmpstr, oldecho);
+		}
+	    } else {
+		beep();
+	    }
+	} else if (tmpstr - oldstr >= maxlen) {
+	    beep();
+	} else {
+	    *tmpstr++ = ch;
+	    *tmpstr = 0;
+	    if (oldecho == TRUE) {
+		int oldy = win->_cury;
+
+		if (wadd_wint(win, tmpstr - 1) == ERR) {
+		    /*
+		     * We can't really use the lower-right corner for input,
+		     * since it'll mess up bookkeeping for erases.
+		     */
+		    win->_flags &= ~_WRAPPED;
+		    waddch(win, (chtype) ' ');
+		    tmpstr = WipeOut(win, y, x, oldstr, tmpstr, oldecho);
+		    continue;
+		} else if (IS_WRAPPED(win)) {
+		    /*
+		     * If the last waddch forced a wrap & scroll, adjust our
+		     * reference point for erasures.
+		     */
+		    if (win->_scroll
+			&& oldy == win->_maxy
+			&& win->_cury == win->_maxy) {
+			if (--y <= 0) {
+			    y = 0;
+			}
+		    }
+		    win->_flags &= ~_WRAPPED;
+		}
+		wrefresh(win);
+	    }
+	}
+    }
+
+    win->_curx = 0;
+    win->_flags &= ~_WRAPPED;
+    if (win->_cury < win->_maxy)
+	win->_cury++;
+    wrefresh(win);
+
+    /* Restore with a single I/O call, to fix minor asymmetry between
+     * raw/noraw, etc.
+     */
+    sp->_nl = oldnl;
+    sp->_echo = oldecho;
+    sp->_raw = oldraw;
+    sp->_cbreak = oldcbreak;
+
+    (void) _nc_set_tty_mode(&buf);
+
+    *tmpstr = 0;
+    if (code == ERR) {
+	if (tmpstr == oldstr) {
+	    *tmpstr++ = WEOF;
+	    *tmpstr = 0;
+	}
+	returnCode(ERR);
+    }
+
+    T(("wgetn_wstr returns %s", _nc_viswibuf(oldstr)));
+
+    returnCode(OK);
+}
diff --git a/ncurses/widechar/lib_hline_set.c b/ncurses/widechar/lib_hline_set.c
new file mode 100644
index 0000000..8d5e026
--- /dev/null
+++ b/ncurses/widechar/lib_hline_set.c
@@ -0,0 +1,78 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 2002-2010,2016 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas Dickey 2002                                              *
+ ****************************************************************************/
+
+/*
+**	lib_hline_set.c
+**
+**	The routine whline_set().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_hline_set.c,v 1.6 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(int)
+whline_set(WINDOW *win, const cchar_t *ch, int n)
+{
+    int code = ERR;
+
+    T((T_CALLED("whline_set(%p,%s,%d)"), (void *) win, _tracecchar_t(ch), n));
+
+    if (win) {
+	struct ldat *line = &(win->_line[win->_cury]);
+	NCURSES_CH_T wch;
+	int start = win->_curx;
+	int end = start + n - 1;
+
+	if (end > win->_maxx)
+	    end = win->_maxx;
+
+	CHANGED_RANGE(line, start, end);
+
+	if (ch == 0)
+	    wch = *WACS_HLINE;
+	else
+	    wch = *ch;
+	wch = _nc_render(win, wch);
+
+	while (end >= start) {
+	    line->text[end] = wch;
+	    end--;
+	}
+
+	_nc_synchook(win);
+	code = OK;
+    }
+    returnCode(code);
+}
diff --git a/ncurses/widechar/lib_in_wch.c b/ncurses/widechar/lib_in_wch.c
new file mode 100644
index 0000000..1d27332
--- /dev/null
+++ b/ncurses/widechar/lib_in_wch.c
@@ -0,0 +1,65 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 2002-2009,2016 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Author: Thomas Dickey                                                    *
+ ****************************************************************************/
+
+/*
+**	lib_in_wch.c
+**
+**	The routine win_wch().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_in_wch.c,v 1.7 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(int)
+win_wch(WINDOW *win, cchar_t *wcval)
+{
+    int code = OK;
+
+    TR(TRACE_CCALLS, (T_CALLED("win_wch(%p,%p)"), (void *) win, (void *) wcval));
+
+    if (win != 0
+	&& wcval != 0) {
+	int row, col;
+
+	getyx(win, row, col);
+
+	*wcval = win->_line[row].text[col];
+	TR(TRACE_CCALLS, ("data %s", _tracecchar_t(wcval)));
+    } else {
+	code = ERR;
+    }
+    TR(TRACE_CCALLS, (T_RETURN("%d"), code));
+    return (code);
+}
diff --git a/ncurses/widechar/lib_in_wchnstr.c b/ncurses/widechar/lib_in_wchnstr.c
new file mode 100644
index 0000000..40a2bb6
--- /dev/null
+++ b/ncurses/widechar/lib_in_wchnstr.c
@@ -0,0 +1,77 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 2002-2007,2009 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Author: Thomas Dickey                                                    *
+ ****************************************************************************/
+
+/*
+**	lib_in_wchnstr.c
+**
+**	The routine win_wchnstr().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_in_wchnstr.c,v 1.9 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(int)
+win_wchnstr(WINDOW *win, cchar_t *wchstr, int n)
+{
+    int code = OK;
+
+    T((T_CALLED("win_wchnstr(%p,%p,%d)"), (void *) win, (void *) wchstr, n));
+    if (win != 0
+	&& wchstr != 0) {
+	NCURSES_CH_T *src;
+	int row, col;
+	int j, k, limit;
+
+	getyx(win, row, col);
+	limit = getmaxx(win) - col;
+	src = &(win->_line[row].text[col]);
+
+	if (n < 0) {
+	    n = limit;
+	} else if (n > limit) {
+	    n = limit;
+	}
+	for (j = k = 0; j < n; ++j) {
+	    if (j == 0 || !WidecExt(src[j]) || isWidecBase(src[j])) {
+		wchstr[k++] = src[j];
+	    }
+	}
+	memset(&(wchstr[k]), 0, sizeof(*wchstr));
+	T(("result = %s", _nc_viscbuf(wchstr, n)));
+    } else {
+	code = ERR;
+    }
+    returnCode(code);
+}
diff --git a/ncurses/widechar/lib_ins_wch.c b/ncurses/widechar/lib_ins_wch.c
new file mode 100644
index 0000000..f753610
--- /dev/null
+++ b/ncurses/widechar/lib_ins_wch.c
@@ -0,0 +1,150 @@
+/****************************************************************************
+ * Copyright 2019,2020 Thomas E. Dickey                                     *
+ * Copyright 2002-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas Dickey 2002                                              *
+ ****************************************************************************/
+
+/*
+**	lib_ins_wch.c
+**
+**	The routine wins_wch().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_ins_wch.c,v 1.25 2020/12/05 20:04:59 tom Exp $")
+
+/*
+ * Insert the given character, updating the current location to simplify
+ * inserting a string.
+ */
+NCURSES_EXPORT(int)
+_nc_insert_wch(WINDOW *win, const cchar_t *wch)
+{
+    int cells = _nc_wacs_width(CharOf(CHDEREF(wch)));
+    int code = OK;
+
+    if (cells < 0) {
+	code = winsch(win, (chtype) CharOf(CHDEREF(wch)));
+    } else {
+	if (cells == 0)
+	    cells = 1;
+
+	if (win->_curx <= win->_maxx) {
+	    int cell;
+	    struct ldat *line = &(win->_line[win->_cury]);
+	    NCURSES_CH_T *end = &(line->text[win->_curx]);
+	    NCURSES_CH_T *temp1 = &(line->text[win->_maxx]);
+	    NCURSES_CH_T *temp2 = temp1 - cells;
+
+	    CHANGED_TO_EOL(line, win->_curx, win->_maxx);
+	    while (temp1 > end)
+		*temp1-- = *temp2--;
+
+	    *temp1 = _nc_render(win, *wch);
+	    for (cell = 1; cell < cells; ++cell) {
+		SetWidecExt(temp1[cell], cell);
+	    }
+
+	    win->_curx = (NCURSES_SIZE_T) (win->_curx + cells);
+	}
+    }
+    return code;
+}
+
+NCURSES_EXPORT(int)
+wins_wch(WINDOW *win, const cchar_t *wch)
+{
+    int code = ERR;
+
+    T((T_CALLED("wins_wch(%p, %s)"), (void *) win, _tracecchar_t(wch)));
+
+    if (win != 0) {
+	NCURSES_SIZE_T oy = win->_cury;
+	NCURSES_SIZE_T ox = win->_curx;
+
+	code = _nc_insert_wch(win, wch);
+
+	win->_curx = ox;
+	win->_cury = oy;
+	_nc_synchook(win);
+    }
+    returnCode(code);
+}
+
+NCURSES_EXPORT(int)
+wins_nwstr(WINDOW *win, const wchar_t *wstr, int n)
+{
+    int code = ERR;
+
+    T((T_CALLED("wins_nwstr(%p,%s,%d)"),
+       (void *) win, _nc_viswbufn(wstr, n), n));
+
+    if (win != 0
+	&& wstr != 0) {
+	if (n < 1)
+	    n = INT_MAX;
+	code = OK;
+
+	if (n > 0) {
+	    const wchar_t *cp;
+	    SCREEN *sp = _nc_screen_of(win);
+	    NCURSES_SIZE_T oy = win->_cury;
+	    NCURSES_SIZE_T ox = win->_curx;
+
+	    for (cp = wstr; (*cp != L'\0') && ((cp - wstr) < n); cp++) {
+		int len = _nc_wacs_width(*cp);
+
+		if ((len >= 0 && len != 1) || !is7bits(*cp)) {
+		    cchar_t tmp_cchar;
+		    wchar_t tmp_wchar = *cp;
+		    memset(&tmp_cchar, 0, sizeof(tmp_cchar));
+		    (void) setcchar(&tmp_cchar,
+				    &tmp_wchar,
+				    WA_NORMAL,
+				    (short) 0,
+				    (void *) 0);
+		    code = _nc_insert_wch(win, &tmp_cchar);
+		} else {
+		    /* tabs, other ASCII stuff */
+		    code = _nc_insert_ch(sp, win, (chtype) (*cp));
+		}
+		if (code != OK)
+		    break;
+	    }
+
+	    win->_curx = ox;
+	    win->_cury = oy;
+	    _nc_synchook(win);
+	}
+    }
+    returnCode(code);
+}
diff --git a/ncurses/widechar/lib_inwstr.c b/ncurses/widechar/lib_inwstr.c
new file mode 100644
index 0000000..b2fdaea
--- /dev/null
+++ b/ncurses/widechar/lib_inwstr.c
@@ -0,0 +1,114 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 2002-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Author: Thomas Dickey                                                    *
+ ****************************************************************************/
+
+/*
+**	lib_inwstr.c
+**
+**	The routines winnwstr() and winwstr().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_inwstr.c,v 1.9 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(int)
+winnwstr(WINDOW *win, wchar_t *wstr, int n)
+{
+    int count = 0;
+    cchar_t *text;
+
+    T((T_CALLED("winnwstr(%p,%p,%d)"), (void *) win, (void *) wstr, n));
+    if (wstr != 0) {
+	if (win) {
+	    int row, col;
+	    int last = 0;
+	    bool done = FALSE;
+
+	    getyx(win, row, col);
+
+	    text = win->_line[row].text;
+	    while (count < n && !done && count != ERR) {
+
+		if (!isWidecExt(text[col])) {
+		    int inx;
+		    wchar_t wch;
+
+		    for (inx = 0; (inx < CCHARW_MAX)
+			 && ((wch = text[col].chars[inx]) != 0);
+			 ++inx) {
+			if (count + 1 > n) {
+			    done = TRUE;
+			    if (last == 0) {
+				count = ERR;	/* error if we store nothing */
+			    } else {
+				count = last;	/* only store complete chars */
+			    }
+			    break;
+			}
+			wstr[count++] = wch;
+		    }
+		}
+		last = count;
+		if (++col > win->_maxx) {
+		    break;
+		}
+	    }
+	}
+	if (count > 0) {
+	    wstr[count] = '\0';
+	    T(("winnwstr returns %s", _nc_viswbuf(wstr)));
+	}
+    }
+    returnCode(count);
+}
+
+/*
+ * X/Open says winwstr() returns OK if not ERR.  If that is not a blunder, it
+ * must have a null termination on the string (see above).  Unlike winnstr(),
+ * it does not define what happens for a negative count with winnwstr().
+ */
+NCURSES_EXPORT(int)
+winwstr(WINDOW *win, wchar_t *wstr)
+{
+    int result = OK;
+
+    T((T_CALLED("winwstr(%p,%p)"), (void *) win, (void *) wstr));
+    if (win == 0) {
+	result = ERR;
+    } else if (winnwstr(win, wstr,
+			CCHARW_MAX * (win->_maxx - win->_curx + 1)) == ERR) {
+	result = ERR;
+    }
+    returnCode(result);
+}
diff --git a/ncurses/widechar/lib_key_name.c b/ncurses/widechar/lib_key_name.c
new file mode 100644
index 0000000..8acfe7a
--- /dev/null
+++ b/ncurses/widechar/lib_key_name.c
@@ -0,0 +1,62 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 2007-2008,2017 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.                                                           *
+ ****************************************************************************/
+
+/*
+**	lib_key_name.c
+**
+**	The routine key_name().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_key_name.c,v 1.5 2020/02/02 23:34:34 tom Exp $")
+
+#define MyData _nc_globals.key_name
+
+NCURSES_EXPORT(NCURSES_CONST char *)
+key_name(wchar_t c)
+{
+    cchar_t my_cchar;
+    wchar_t *my_wchars;
+    size_t len;
+
+    memset(&my_cchar, 0, sizeof(my_cchar));
+    my_cchar.chars[0] = c;
+    my_cchar.chars[1] = L'\0';
+
+    my_wchars = wunctrl(&my_cchar);
+    len = wcstombs(MyData, my_wchars, sizeof(MyData) - 1);
+    if (isEILSEQ(len) || (len == 0)) {
+	return 0;
+    }
+
+    MyData[len] = '\0';
+    return MyData;
+}
diff --git a/ncurses/widechar/lib_pecho_wchar.c b/ncurses/widechar/lib_pecho_wchar.c
new file mode 100644
index 0000000..502967f
--- /dev/null
+++ b/ncurses/widechar/lib_pecho_wchar.c
@@ -0,0 +1,58 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 2004,2009 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                                                *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_pecho_wchar.c,v 1.4 2021/10/23 17:07:56 tom Exp $")
+
+NCURSES_EXPORT(int)
+pecho_wchar(WINDOW *pad, const cchar_t *wch)
+{
+    T((T_CALLED("pecho_wchar(%p, %s)"), (void *) pad, _tracech_t(wch)));
+
+    if (pad == 0)
+	returnCode(ERR);
+
+    if (!IS_PAD(pad))
+	returnCode(wecho_wchar(pad, wch));
+
+    wadd_wch(pad, wch);
+    prefresh(pad, pad->_pad._pad_y,
+	     pad->_pad._pad_x,
+	     pad->_pad._pad_top,
+	     pad->_pad._pad_left,
+	     pad->_pad._pad_bottom,
+	     pad->_pad._pad_right);
+
+    returnCode(OK);
+}
diff --git a/ncurses/widechar/lib_slk_wset.c b/ncurses/widechar/lib_slk_wset.c
new file mode 100644
index 0000000..5aa75ff
--- /dev/null
+++ b/ncurses/widechar/lib_slk_wset.c
@@ -0,0 +1,78 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 2003-2011,2016 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                                                *
+ ****************************************************************************/
+
+/*
+ *	lib_slk_wset.c
+ *      Set soft label text.
+ */
+#include <curses.priv.h>
+
+#if HAVE_WCTYPE_H
+#include <wctype.h>
+#endif
+
+MODULE_ID("$Id: lib_slk_wset.c,v 1.15 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(int)
+slk_wset(int i, const wchar_t *astr, int format)
+{
+    int result = ERR;
+    const wchar_t *str;
+    mbstate_t state;
+
+    T((T_CALLED("slk_wset(%d, %s, %d)"), i, _nc_viswbuf(astr), format));
+
+    if (astr != 0) {
+	size_t arglen;
+
+	init_mb(state);
+	str = astr;
+
+	if ((arglen = wcsrtombs(NULL, &str, (size_t) 0, &state)) != (size_t) -1) {
+	    char *mystr;
+
+	    if ((mystr = (char *) _nc_doalloc(0, arglen + 1)) != 0) {
+		str = astr;
+		if (wcsrtombs(mystr, &str, arglen, &state) != (size_t) -1) {
+		    /* glibc documentation claims that the terminating L'\0'
+		     * is written, but it is not...
+		     */
+		    mystr[arglen] = 0;
+		    result = slk_set(i, mystr, format);
+		}
+		free(mystr);
+	    }
+	}
+    }
+    returnCode(result);
+}
diff --git a/ncurses/widechar/lib_unget_wch.c b/ncurses/widechar/lib_unget_wch.c
new file mode 100644
index 0000000..4ea26b6
--- /dev/null
+++ b/ncurses/widechar/lib_unget_wch.c
@@ -0,0 +1,115 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 2002-2011,2016 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey 2002                                           *
+ ****************************************************************************/
+
+/*
+**	lib_unget_wch.c
+**
+**	The routine unget_wch().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_unget_wch.c,v 1.17 2020/02/02 23:34:34 tom Exp $")
+
+/*
+ * Wrapper for wcrtomb() which obtains the length needed for the given
+ * wide-character 'source'.
+ */
+NCURSES_EXPORT(size_t)
+_nc_wcrtomb(char *target, wchar_t source, mbstate_t * state)
+{
+    int result;
+
+    if (target == 0) {
+	wchar_t temp[2];
+	const wchar_t *tempp = temp;
+	temp[0] = source;
+	temp[1] = 0;
+	result = (int) wcsrtombs(NULL, &tempp, (size_t) 0, state);
+    } else {
+	result = (int) wcrtomb(target, source, state);
+    }
+    if (!isEILSEQ(result) && (result == 0))
+	result = 1;
+    return (size_t) result;
+}
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(unget_wch) (NCURSES_SP_DCLx const wchar_t wch)
+{
+    int result = OK;
+    mbstate_t state;
+    size_t length;
+
+    T((T_CALLED("unget_wch(%p, %#lx)"), (void *) SP_PARM, (unsigned long) wch));
+
+    init_mb(state);
+    length = _nc_wcrtomb(0, wch, &state);
+
+    if (length != (size_t) (-1)
+	&& length != 0) {
+	char *string;
+
+	if ((string = (char *) malloc(length)) != 0) {
+	    int n;
+
+	    init_mb(state);
+	    /* ignore the result, since we already validated the character */
+	    IGNORE_RC((int) wcrtomb(string, wch, &state));
+
+	    for (n = (int) (length - 1); n >= 0; --n) {
+		if (NCURSES_SP_NAME(ungetch) (NCURSES_SP_ARGx
+					      UChar(string[n])) !=OK) {
+		    result = ERR;
+		    break;
+		}
+	    }
+	    free(string);
+	} else {
+	    result = ERR;
+	}
+    } else {
+	result = ERR;
+    }
+
+    returnCode(result);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+unget_wch(const wchar_t wch)
+{
+    return NCURSES_SP_NAME(unget_wch) (CURRENT_SCREEN, wch);
+}
+#endif
diff --git a/ncurses/widechar/lib_vid_attr.c b/ncurses/widechar/lib_vid_attr.c
new file mode 100644
index 0000000..2d9531f
--- /dev/null
+++ b/ncurses/widechar/lib_vid_attr.c
@@ -0,0 +1,367 @@
+/****************************************************************************
+ * Copyright 2018-2019,2020 Thomas E. Dickey                                *
+ * Copyright 2002-2014,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                                                *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+
+#ifndef CUR
+#define CUR SP_TERMTYPE
+#endif
+
+MODULE_ID("$Id: lib_vid_attr.c,v 1.30 2020/05/27 23:54:31 tom Exp $")
+
+#define doPut(mode) \
+	TPUTS_TRACE(#mode); \
+	NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx mode, 1, outc)
+
+#define TurnOn(mask, mode) \
+	if ((turn_on & mask) && mode) { \
+	    TPUTS_TRACE(#mode); \
+	    NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx mode, 1, outc); \
+	}
+
+#define TurnOff(mask, mode) \
+	if ((turn_off & mask) && mode) { \
+	    TPUTS_TRACE(#mode); \
+	    NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx mode, 1, outc); \
+	    turn_off &= ~mask; \
+	}
+
+	/* if there is no current screen, assume we *can* do color */
+#define SetColorsIf(why, old_attr, old_pair) \
+	if (can_color && (why)) { \
+		TR(TRACE_ATTRS, ("old pair = %d -- new pair = %d", old_pair, color_pair)); \
+		if ((color_pair != old_pair) \
+		 || (fix_pair0 && (color_pair == 0)) \
+		 || (reverse ^ ((old_attr & A_REVERSE) != 0))) { \
+		    NCURSES_SP_NAME(_nc_do_color) (NCURSES_SP_ARGx \
+						   old_pair, color_pair, \
+						   reverse, outc); \
+		} \
+	}
+
+#define set_color(mode, pair) \
+	mode &= ALL_BUT_COLOR; \
+	mode |= (attr_t) ColorPair(pair)
+
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(vid_puts) (NCURSES_SP_DCLx
+			   attr_t newmode,
+			   NCURSES_PAIRS_T pair_arg,
+			   void *opts OPTIONAL_PAIR,
+			   NCURSES_SP_OUTC outc)
+{
+    int color_pair = pair_arg;
+#if NCURSES_EXT_COLORS
+    static attr_t previous_attr = A_NORMAL;
+    static int previous_pair = 0;
+
+    attr_t turn_on, turn_off;
+    bool reverse = FALSE;
+    bool can_color = (SP_PARM == 0 || SP_PARM->_coloron);
+#if NCURSES_EXT_FUNCS
+    bool fix_pair0 = (SP_PARM != 0 && SP_PARM->_coloron && !SP_PARM->_default_color);
+#else
+#define fix_pair0 FALSE
+#endif
+
+    if (!IsValidTIScreen(SP_PARM))
+	returnCode(ERR);
+
+    newmode &= A_ATTRIBUTES;
+    set_extended_pair(opts, color_pair);
+    T((T_CALLED("vid_puts(%s,%d)"), _traceattr(newmode), color_pair));
+
+    /* this allows us to go on whether or not newterm() has been called */
+    if (SP_PARM) {
+	previous_attr = AttrOf(SCREEN_ATTRS(SP_PARM));
+	previous_pair = GetPair(SCREEN_ATTRS(SP_PARM));
+    }
+
+    TR(TRACE_ATTRS, ("previous attribute was %s, %d",
+		     _traceattr(previous_attr), previous_pair));
+
+#if !USE_XMC_SUPPORT
+    if ((SP_PARM != 0)
+	&& (magic_cookie_glitch > 0))
+	newmode &= ~(SP_PARM->_xmc_suppress);
+#endif
+
+    /*
+     * If we have a terminal that cannot combine color with video
+     * attributes, use the colors in preference.
+     */
+    if ((color_pair != 0
+	 || fix_pair0)
+	&& (no_color_video > 0)) {
+	/*
+	 * If we had chosen the A_xxx definitions to correspond to the
+	 * no_color_video mask, we could simply shift it up and mask off the
+	 * attributes.  But we did not (actually copied Solaris' definitions).
+	 * However, this is still simpler/faster than a lookup table.
+	 *
+	 * The 63 corresponds to A_STANDOUT, A_UNDERLINE, A_REVERSE, A_BLINK,
+	 * A_DIM, A_BOLD which are 1:1 with no_color_video.  The bits that
+	 * correspond to A_INVIS, A_PROTECT (192) must be shifted up 1 and
+	 * A_ALTCHARSET (256) down 2 to line up.  We use the NCURSES_BITS
+	 * macro so this will work properly for the wide-character layout.
+	 */
+	unsigned value = (unsigned) no_color_video;
+	attr_t mask = NCURSES_BITS((value & 63)
+				   | ((value & 192) << 1)
+				   | ((value & 256) >> 2), 8);
+
+	if ((mask & A_REVERSE) != 0
+	    && (newmode & A_REVERSE) != 0) {
+	    reverse = TRUE;
+	    mask &= ~A_REVERSE;
+	}
+	newmode &= ~mask;
+    }
+
+    if (newmode == previous_attr
+	&& color_pair == previous_pair)
+	returnCode(OK);
+
+    if (reverse) {
+	newmode &= ~A_REVERSE;
+    }
+
+    turn_off = (~newmode & previous_attr) & ALL_BUT_COLOR;
+    turn_on = (newmode & ~(previous_attr & TPARM_ATTR)) & ALL_BUT_COLOR;
+
+    SetColorsIf(((color_pair == 0) && !fix_pair0), previous_attr, previous_pair);
+
+    if (newmode == A_NORMAL) {
+	if ((previous_attr & A_ALTCHARSET) && exit_alt_charset_mode) {
+	    doPut(exit_alt_charset_mode);
+	    previous_attr &= ~A_ALTCHARSET;
+	}
+	if (previous_attr) {
+	    if (exit_attribute_mode) {
+		doPut(exit_attribute_mode);
+	    } else {
+		if (!SP_PARM || SP_PARM->_use_rmul) {
+		    TurnOff(A_UNDERLINE, exit_underline_mode);
+		}
+		if (!SP_PARM || SP_PARM->_use_rmso) {
+		    TurnOff(A_STANDOUT, exit_standout_mode);
+		}
+#if USE_ITALIC
+		if (!SP_PARM || SP_PARM->_use_ritm) {
+		    TurnOff(A_ITALIC, exit_italics_mode);
+		}
+#endif
+	    }
+	    previous_attr &= ALL_BUT_COLOR;
+	    previous_pair = 0;
+	}
+
+	SetColorsIf((color_pair != 0) || fix_pair0, previous_attr, previous_pair);
+    } else if (set_attributes) {
+	if (turn_on || turn_off) {
+	    TPUTS_TRACE("set_attributes");
+	    NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx
+				    TIPARM_9(set_attributes,
+					       (newmode & A_STANDOUT) != 0,
+					       (newmode & A_UNDERLINE) != 0,
+					       (newmode & A_REVERSE) != 0,
+					       (newmode & A_BLINK) != 0,
+					       (newmode & A_DIM) != 0,
+					       (newmode & A_BOLD) != 0,
+					       (newmode & A_INVIS) != 0,
+					       (newmode & A_PROTECT) != 0,
+					       (newmode & A_ALTCHARSET) != 0),
+				    1, outc);
+	    previous_attr &= ALL_BUT_COLOR;
+	    previous_pair = 0;
+	}
+#if USE_ITALIC
+	if (!SP_PARM || SP_PARM->_use_ritm) {
+	    if (turn_on & A_ITALIC) {
+		TurnOn(A_ITALIC, enter_italics_mode);
+	    } else if (turn_off & A_ITALIC) {
+		TurnOff(A_ITALIC, exit_italics_mode);
+	    }
+	}
+#endif
+	SetColorsIf((color_pair != 0) || fix_pair0, previous_attr, previous_pair);
+    } else {
+
+	TR(TRACE_ATTRS, ("turning %s off", _traceattr(turn_off)));
+
+	TurnOff(A_ALTCHARSET, exit_alt_charset_mode);
+
+	if (!SP_PARM || SP_PARM->_use_rmul) {
+	    TurnOff(A_UNDERLINE, exit_underline_mode);
+	}
+
+	if (!SP_PARM || SP_PARM->_use_rmso) {
+	    TurnOff(A_STANDOUT, exit_standout_mode);
+	}
+#if USE_ITALIC
+	if (!SP_PARM || SP_PARM->_use_ritm) {
+	    TurnOff(A_ITALIC, exit_italics_mode);
+	}
+#endif
+	if (turn_off && exit_attribute_mode) {
+	    doPut(exit_attribute_mode);
+	    turn_on |= (newmode & ALL_BUT_COLOR);
+	    previous_attr &= ALL_BUT_COLOR;
+	    previous_pair = 0;
+	}
+	SetColorsIf((color_pair != 0) || fix_pair0, previous_attr, previous_pair);
+
+	TR(TRACE_ATTRS, ("turning %s on", _traceattr(turn_on)));
+	/* *INDENT-OFF* */
+	TurnOn(A_ALTCHARSET,	enter_alt_charset_mode);
+	TurnOn(A_BLINK,		enter_blink_mode);
+	TurnOn(A_BOLD,		enter_bold_mode);
+	TurnOn(A_DIM,		enter_dim_mode);
+	TurnOn(A_REVERSE,	enter_reverse_mode);
+	TurnOn(A_STANDOUT,	enter_standout_mode);
+	TurnOn(A_PROTECT,	enter_protected_mode);
+	TurnOn(A_INVIS,		enter_secure_mode);
+	TurnOn(A_UNDERLINE,	enter_underline_mode);
+#if USE_ITALIC
+	TurnOn(A_ITALIC,	enter_italics_mode);
+#endif
+#if USE_WIDEC_SUPPORT && defined(enter_horizontal_hl_mode)
+	TurnOn(A_HORIZONTAL,	enter_horizontal_hl_mode);
+	TurnOn(A_LEFT,		enter_left_hl_mode);
+	TurnOn(A_LOW,		enter_low_hl_mode);
+	TurnOn(A_RIGHT,		enter_right_hl_mode);
+	TurnOn(A_TOP,		enter_top_hl_mode);
+	TurnOn(A_VERTICAL,	enter_vertical_hl_mode);
+#endif
+	/* *INDENT-ON* */
+    }
+
+    if (reverse)
+	newmode |= A_REVERSE;
+
+    if (SP_PARM) {
+	SetAttr(SCREEN_ATTRS(SP_PARM), newmode);
+	SetPair(SCREEN_ATTRS(SP_PARM), color_pair);
+    } else {
+	previous_attr = newmode;
+	previous_pair = color_pair;
+    }
+
+    returnCode(OK);
+#else
+    T((T_CALLED("vid_puts(%s,%d)"), _traceattr(newmode), color_pair));
+    (void) opts;
+    set_color(newmode, color_pair);
+    returnCode(NCURSES_SP_NAME(vidputs) (NCURSES_SP_ARGx newmode, outc));
+#endif
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+vid_puts(attr_t newmode,
+	 NCURSES_PAIRS_T pair_arg,
+	 void *opts GCC_UNUSED,
+	 NCURSES_OUTC outc)
+{
+    SetSafeOutcWrapper(outc);
+    return NCURSES_SP_NAME(vid_puts) (CURRENT_SCREEN,
+				      newmode,
+				      pair_arg,
+				      opts,
+				      _nc_outc_wrapper);
+}
+#endif
+
+#undef vid_attr
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(vid_attr) (NCURSES_SP_DCLx
+			   attr_t newmode,
+			   NCURSES_PAIRS_T pair_arg,
+			   void *opts)
+{
+    T((T_CALLED("vid_attr(%s,%d)"), _traceattr(newmode), (int) pair_arg));
+    returnCode(NCURSES_SP_NAME(vid_puts) (NCURSES_SP_ARGx
+					  newmode,
+					  pair_arg,
+					  opts,
+					  NCURSES_SP_NAME(_nc_putchar)));
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+vid_attr(attr_t newmode, NCURSES_PAIRS_T pair_arg, void *opts)
+{
+    return NCURSES_SP_NAME(vid_attr) (CURRENT_SCREEN, newmode, pair_arg, opts);
+}
+#endif
+
+/*
+ * This implementation uses the same mask values for A_xxx and WA_xxx, so
+ * we can use termattrs() for part of the logic.
+ */
+NCURSES_EXPORT(attr_t)
+NCURSES_SP_NAME(term_attrs) (NCURSES_SP_DCL0)
+{
+    attr_t attrs = 0;
+
+    T((T_CALLED("term_attrs()")));
+    if (SP_PARM) {
+	attrs = NCURSES_SP_NAME(termattrs) (NCURSES_SP_ARG);
+
+#if USE_WIDEC_SUPPORT && defined(enter_horizontal_hl_mode)
+	/* these are only supported for wide-character mode */
+	if (enter_horizontal_hl_mode)
+	    attrs |= WA_HORIZONTAL;
+	if (enter_left_hl_mode)
+	    attrs |= WA_LEFT;
+	if (enter_low_hl_mode)
+	    attrs |= WA_LOW;
+	if (enter_right_hl_mode)
+	    attrs |= WA_RIGHT;
+	if (enter_top_hl_mode)
+	    attrs |= WA_TOP;
+	if (enter_vertical_hl_mode)
+	    attrs |= WA_VERTICAL;
+#endif
+    }
+
+    returnAttr(attrs);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(attr_t)
+term_attrs(void)
+{
+    return NCURSES_SP_NAME(term_attrs) (CURRENT_SCREEN);
+}
+#endif
diff --git a/ncurses/widechar/lib_vline_set.c b/ncurses/widechar/lib_vline_set.c
new file mode 100644
index 0000000..f7bb581
--- /dev/null
+++ b/ncurses/widechar/lib_vline_set.c
@@ -0,0 +1,78 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 2002-2010,2016 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas Dickey 2002                                              *
+ ****************************************************************************/
+
+/*
+**	lib_vline_set.c
+**
+**	The routine wvline_set().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_vline_set.c,v 1.6 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(int)
+wvline_set(WINDOW *win, const cchar_t *ch, int n)
+{
+    int code = ERR;
+
+    T((T_CALLED("wvline(%p,%s,%d)"), (void *) win, _tracecchar_t(ch), n));
+
+    if (win) {
+	NCURSES_CH_T wch;
+	int row = win->_cury;
+	int col = win->_curx;
+	int end = row + n - 1;
+
+	if (end > win->_maxy)
+	    end = win->_maxy;
+
+	if (ch == 0)
+	    wch = *WACS_VLINE;
+	else
+	    wch = *ch;
+	wch = _nc_render(win, wch);
+
+	while (end >= row) {
+	    struct ldat *line = &(win->_line[end]);
+	    line->text[col] = wch;
+	    CHANGED_CELL(line, col);
+	    end--;
+	}
+
+	_nc_synchook(win);
+	code = OK;
+    }
+    returnCode(code);
+}
diff --git a/ncurses/widechar/lib_wacs.c b/ncurses/widechar/lib_wacs.c
new file mode 100644
index 0000000..5b6f6da
--- /dev/null
+++ b/ncurses/widechar/lib_wacs.c
@@ -0,0 +1,148 @@
+/****************************************************************************
+ * Copyright 2018,2020 Thomas E. Dickey                                     *
+ * Copyright 2002-2015,2016 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas Dickey 2002                                              *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_wacs.c,v 1.20 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT_VAR(cchar_t) * _nc_wacs = 0;
+
+NCURSES_EXPORT(void)
+_nc_init_wacs(void)
+{
+    /* *INDENT-OFF* */
+    static const struct {
+	unsigned map;
+	int	value[2];
+    } table[] = {
+	/* VT100 symbols */
+	{ 'l',	{ '+',	0x250c }},	/* upper left corner */
+	{ 'm',	{ '+',	0x2514 }},	/* lower left corner */
+	{ 'k',	{ '+',	0x2510 }},	/* upper right corner */
+	{ 'j',	{ '+',	0x2518 }},	/* lower right corner */
+	{ 't',	{ '+',	0x251c }},	/* tee pointing left */
+	{ 'u',	{ '+',	0x2524 }},	/* tee pointing right */
+	{ 'v',	{ '+',	0x2534 }},	/* tee pointing up */
+	{ 'w',	{ '+',	0x252c }},	/* tee pointing down */
+	{ 'q',	{ '-',	0x2500 }},	/* horizontal line */
+	{ 'x',	{ '|',	0x2502 }},	/* vertical line */
+	{ 'n',	{ '+',	0x253c }},	/* large plus or crossover */
+	{ 'o',	{ '~',	0x23ba }},	/* scan line 1 */
+	{ 's',	{ '_',	0x23bd }},	/* scan line 9 */
+	{ '`',	{ '+',	0x25c6 }},	/* diamond */
+	{ 'a',	{ ':',	0x2592 }},	/* checker board (stipple) */
+	{ 'f',	{ '\'',	0x00b0 }},	/* degree symbol */
+	{ 'g',	{ '#',	0x00b1 }},	/* plus/minus */
+	{ '~',	{ 'o',	0x00b7 }},	/* bullet */
+	/* Teletype 5410v1 symbols */
+	{ ',',	{ '<',	0x2190 }},	/* arrow pointing left */
+	{ '+',	{ '>',	0x2192 }},	/* arrow pointing right */
+	{ '.',	{ 'v',	0x2193 }},	/* arrow pointing down */
+	{ '-',	{ '^',	0x2191 }},	/* arrow pointing up */
+	{ 'h',	{ '#',	0x2592 }},	/* board of squares */
+	{ 'i',	{ '#',	0x2603 }},	/* lantern symbol */
+	{ '0',	{ '#',	0x25ae }},	/* solid square block */
+	/* these defaults were invented for ncurses */
+	{ 'p',	{ '-',	0x23bb }},	/* scan line 3 */
+	{ 'r',	{ '-',	0x23bc }},	/* scan line 7 */
+	{ 'y',	{ '<',	0x2264 }},	/* less-than-or-equal-to */
+	{ 'z',	{ '>',	0x2265 }},	/* greater-than-or-equal-to */
+	{ '{',	{ '*',	0x03c0 }},	/* greek pi */
+	{ '|',	{ '!',	0x2260 }},	/* not-equal */
+	{ '}',	{ 'f',	0x00a3 }},	/* pound-sterling symbol */
+	/* thick-line-drawing */
+	{ 'L',	{ '+',	0x250f }},	/* upper left corner */
+	{ 'M',	{ '+',	0x2517 }},	/* lower left corner */
+	{ 'K',	{ '+',	0x2513 }},	/* upper right corner */
+	{ 'J',	{ '+',	0x251b }},	/* lower right corner */
+	{ 'T',	{ '+',	0x2523 }},	/* tee pointing left */
+	{ 'U',	{ '+',	0x252b }},	/* tee pointing right */
+	{ 'V',	{ '+',	0x253b }},	/* tee pointing up */
+	{ 'W',	{ '+',	0x2533 }},	/* tee pointing down */
+	{ 'Q',	{ '-',	0x2501 }},	/* horizontal line */
+	{ 'X',	{ '|',	0x2503 }},	/* vertical line */
+	{ 'N',	{ '+',	0x254b }},	/* large plus or crossover */
+	/* double-line-drawing */
+	{ 'C',	{ '+',	0x2554 }},	/* upper left corner */
+	{ 'D',	{ '+',	0x255a }},	/* lower left corner */
+	{ 'B',	{ '+',	0x2557 }},	/* upper right corner */
+	{ 'A',	{ '+',	0x255d }},	/* lower right corner */
+	{ 'G',	{ '+',	0x2563 }},	/* tee pointing left */
+	{ 'F',	{ '+',	0x2560 }},	/* tee pointing right */
+	{ 'H',	{ '+',	0x2569 }},	/* tee pointing up */
+	{ 'I',	{ '+',	0x2566 }},	/* tee pointing down */
+	{ 'R',	{ '-',	0x2550 }},	/* horizontal line */
+	{ 'Y',	{ '|',	0x2551 }},	/* vertical line */
+	{ 'E',	{ '+',	0x256c }},	/* large plus or crossover */
+    };
+    /* *INDENT-ON* */
+
+    int active = _nc_unicode_locale();
+
+    /*
+     * If we're running in a UTF-8 locale, will use the Unicode equivalents
+     * rather than the terminfo information.  Actually the terminfo should
+     * be the rule, but there are people who are offended by the notion that
+     * a Unicode-capable terminal would have something resembling a mode.
+     * So the smacs/rmacs may be disabled -- sometime.
+     */
+    T(("initializing WIDE-ACS map (Unicode is%s active)",
+       active ? "" : " not"));
+
+    if ((_nc_wacs = typeCalloc(cchar_t, ACS_LEN)) != 0) {
+	unsigned n;
+
+	for (n = 0; n < SIZEOF(table); ++n) {
+	    unsigned m;
+#if NCURSES_WCWIDTH_GRAPHICS
+	    int wide = wcwidth((wchar_t) table[n].value[active]);
+#else
+	    int wide = 1;
+#endif
+
+	    m = table[n].map;
+	    if (active && (wide == 1)) {
+		SetChar(_nc_wacs[m], table[n].value[1], A_NORMAL);
+	    } else if (acs_map[m] & A_ALTCHARSET) {
+		SetChar(_nc_wacs[m], m, A_ALTCHARSET);
+	    } else {
+		SetChar(_nc_wacs[m], table[n].value[0], A_NORMAL);
+	    }
+
+	    T(("#%d, width:%d SetChar(%c, %s) = %s",
+	       n, wide, m,
+	       _tracechar(table[n].value[active]),
+	       _tracecchar_t(&_nc_wacs[m])));
+	}
+    }
+}
diff --git a/ncurses/widechar/lib_wunctrl.c b/ncurses/widechar/lib_wunctrl.c
new file mode 100644
index 0000000..155da22
--- /dev/null
+++ b/ncurses/widechar/lib_wunctrl.c
@@ -0,0 +1,71 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 2001-2011,2012 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.                                                           *
+ ****************************************************************************/
+
+/*
+**	lib_wunctrl.c
+**
+**	The routine wunctrl().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_wunctrl.c,v 1.17 2020/02/02 23:34:34 tom Exp $")
+
+NCURSES_EXPORT(wchar_t *)
+NCURSES_SP_NAME(wunctrl) (NCURSES_SP_DCLx cchar_t *wc)
+{
+    static wchar_t str[CCHARW_MAX + 1], *wsp;
+    wchar_t *result;
+
+    if (wc == 0) {
+	result = 0;
+    } else if (SP_PARM != 0 && Charable(*wc)) {
+	const char *p =
+	NCURSES_SP_NAME(unctrl) (NCURSES_SP_ARGx
+				 (unsigned) _nc_to_char((wint_t)CharOf(*wc)));
+
+	for (wsp = str; *p; ++p) {
+	    *wsp++ = (wchar_t) _nc_to_widechar(*p);
+	}
+	*wsp = 0;
+	result = str;
+    } else {
+	result = wc->chars;
+    }
+    return result;
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(wchar_t *)
+wunctrl(cchar_t *wc)
+{
+    return NCURSES_SP_NAME(wunctrl) (CURRENT_SCREEN, wc);
+}
+#endif
diff --git a/ncurses/widechar/widechars.c b/ncurses/widechar/widechars.c
new file mode 100644
index 0000000..d05ba98
--- /dev/null
+++ b/ncurses/widechar/widechars.c
@@ -0,0 +1,153 @@
+/****************************************************************************
+ * Copyright 2018,2020 Thomas E. Dickey                                     *
+ * Copyright 2012,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.                                                           *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+
+#if USE_WIDEC_SUPPORT
+
+MODULE_ID("$Id: widechars.c,v 1.9 2020/08/29 16:22:03 juergen Exp $")
+
+#if (defined(_NC_WINDOWS)) && !defined(_NC_MSC)
+/*
+ * MinGW has wide-character functions, but they do not work correctly.
+ */
+
+int
+_nc_mbtowc(wchar_t *pwc, const char *s, size_t n)
+{
+    int result;
+    int count;
+    int try;
+
+    if (s != 0 && n != 0) {
+	/*
+	 * MultiByteToWideChar() can decide to return more than one
+	 * wide-character.  We want only one.  Ignore any trailing null, both
+	 * in the initial count and in the conversion.
+	 */
+	count = 0;
+	for (try = 1; try <= (int) n; ++try) {
+	    count = MultiByteToWideChar(CP_UTF8,
+					MB_ERR_INVALID_CHARS,
+					s,
+					try,
+					pwc,
+					0);
+	    TR(TRACE_BITS, ("...try %d:%d", try, count));
+	    if (count > 0) {
+		break;
+	    }
+	}
+	if (count < 1 || count > 2) {
+	    result = -1;
+	} else {
+	    wchar_t actual[2];
+	    memset(&actual, 0, sizeof(actual));
+	    count = MultiByteToWideChar(CP_UTF8,
+					MB_ERR_INVALID_CHARS,
+					s,
+					try,
+					actual,
+					2);
+	    TR(TRACE_BITS, ("\twin32 ->%#x, %#x", actual[0], actual[1]));
+	    *pwc = actual[0];
+	    if (actual[1] != 0)
+		result = -1;
+	    else
+		result = try;
+	}
+    } else {
+	result = 0;
+    }
+
+    return result;
+}
+
+int
+_nc_mblen(const char *s, size_t n)
+{
+    int result = -1;
+    int count;
+    wchar_t temp;
+
+    if (s != 0 && n != 0) {
+	count = _nc_mbtowc(&temp, s, n);
+	if (count == 1) {
+	    int check = WideCharToMultiByte(CP_UTF8,
+					    0,
+					    &temp,
+					    1,
+					    NULL,
+					    0,	/* compute length only */
+					    NULL,
+					    NULL);
+	    TR(TRACE_BITS, ("\tcheck ->%d\n", check));
+	    if (check > 0 && (size_t) check <= n) {
+		result = check;
+	    }
+	}
+    } else {
+	result = 0;
+    }
+
+    return result;
+}
+
+int __MINGW_NOTHROW
+_nc_wctomb(char *s, wchar_t wc)
+{
+    int result;
+    int check;
+
+    check = WideCharToMultiByte(CP_UTF8,
+				0,
+				&wc,
+				1,
+				NULL,
+				0,	/* compute length only */
+				NULL,
+				NULL);
+    if (check > 0) {
+	result = WideCharToMultiByte(CP_UTF8,
+				     0,
+				     &wc,
+				     1,
+				     s,
+				     check + 1,
+				     NULL,
+				     NULL);
+    } else {
+	result = -1;
+    }
+    return result;
+}
+
+#endif /* _NC_WINDOWS */
+
+#endif /* USE_WIDEC_SUPPORT */
diff --git a/ncurses/win32con/gettimeofday.c b/ncurses/win32con/gettimeofday.c
new file mode 100644
index 0000000..94be7b5
--- /dev/null
+++ b/ncurses/win32con/gettimeofday.c
@@ -0,0 +1,55 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 2008-2010,2014 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.                                                           *
+ ****************************************************************************/
+
+#ifdef WINVER
+#  undef WINVER
+#endif
+#define WINVER 0x0501
+
+#include <curses.priv.h>
+
+#include <windows.h>
+
+MODULE_ID("$Id: gettimeofday.c,v 1.6 2020/07/11 21:03:53 tom Exp $")
+
+#define JAN1970 116444736000000000LL	/* the value for 01/01/1970 00:00 */
+
+NCURSES_EXPORT(int)
+gettimeofday(struct timeval *tv, void *tz GCC_UNUSED)
+{
+    union {
+	FILETIME ft;
+	long long since1601;	/* time since 1 Jan 1601 in 100ns units */
+    } data;
+
+    GetSystemTimeAsFileTime(&data.ft);
+    tv->tv_usec = (long) ((data.since1601 / 10LL) % 1000000LL);
+    tv->tv_sec = (long) ((data.since1601 - JAN1970) / 10000000LL);
+    return (0);
+}
diff --git a/ncurses/win32con/wcwidth.c b/ncurses/win32con/wcwidth.c
new file mode 100644
index 0000000..5584366
--- /dev/null
+++ b/ncurses/win32con/wcwidth.c
@@ -0,0 +1,51 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 2010 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.                                                           *
+ ****************************************************************************/
+#include <curses.priv.h>
+
+MODULE_ID("$Id: wcwidth.c,v 1.4 2020/07/11 21:02:10 tom Exp $")
+
+#if USE_WIDEC_SUPPORT
+#define mk_wcwidth(ucs)          _nc_wcwidth(ucs)
+#define mk_wcswidth(pwcs, n)     _nc_wcswidth(pwcs, n)
+#define mk_wcwidth_cjk(ucs)      _nc_wcwidth_cjk(ucs)
+#define mk_wcswidth_cjk(pwcs, n) _nc_wcswidth_cjk(pwcs, n)
+
+NCURSES_EXPORT(int) mk_wcwidth(wchar_t);
+NCURSES_EXPORT(int) mk_wcswidth(const wchar_t *, size_t);
+NCURSES_EXPORT(int) mk_wcwidth_cjk(wchar_t);
+NCURSES_EXPORT(int) mk_wcswidth_cjk(const wchar_t *, size_t);
+
+#include <wcwidth.h>
+#else
+void _nc_empty_wcwidth(void);
+void
+_nc_empty_wcwidth(void)
+{
+}
+#endif
diff --git a/ncurses/win32con/win32_driver.c b/ncurses/win32con/win32_driver.c
new file mode 100644
index 0000000..45aadf2
--- /dev/null
+++ b/ncurses/win32con/win32_driver.c
@@ -0,0 +1,1221 @@
+/****************************************************************************
+ * Copyright 2018,2020 Thomas E. Dickey                                     *
+ * Copyright 2008-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Juergen Pfeifer                                                 *
+ *     and: Thomas E. Dickey                                                *
+ ****************************************************************************/
+
+/*
+ * TODO - improve screen-repainting performance, using implied wraparound to reduce write's
+ * TODO - make it optional whether screen is restored or not when non-buffered
+ */
+
+#include <curses.priv.h>
+#ifdef _NC_WINDOWS
+#if (defined(__MINGW32__) || defined(__MINGW64__))
+#include <wchar.h>
+#else
+#include <tchar.h>
+#endif
+#include <io.h>
+
+#define CUR TerminalType(my_term).
+
+MODULE_ID("$Id: win32_driver.c,v 1.2 2020/11/21 23:35:56 tom Exp $")
+
+#define WINMAGIC NCDRV_MAGIC(NCDRV_WINCONSOLE)
+#define EXP_OPTIMIZE 0
+
+static bool console_initialized = FALSE;
+
+#define AssertTCB() assert(TCB != 0 && (TCB->magic == WINMAGIC))
+#define validateConsoleHandle() (AssertTCB() , console_initialized ||\
+                                 (console_initialized=\
+                                  _nc_console_checkinit(TRUE,FALSE)))
+#define SetSP() assert(TCB->csp != 0); sp = TCB->csp; (void) sp
+#define AdjustY() (WINCONSOLE.buffered ?\
+                   0 : (int) WINCONSOLE.SBI.srWindow.Top)
+#define RevAttr(attr) (WORD) (((attr) & 0xff00) |   \
+                              ((((attr) & 0x07) << 4) | \
+                               (((attr) & 0x70) >> 4)))
+
+#if USE_WIDEC_SUPPORT
+#define write_screen WriteConsoleOutputW
+#define read_screen  ReadConsoleOutputW
+#else
+#define write_screen WriteConsoleOutput
+#define read_screen  ReadConsoleOutput
+#endif
+
+static WORD
+MapAttr(WORD res, attr_t ch)
+{
+    if (ch & A_COLOR) {
+	int p;
+
+	p = PairNumber(ch);
+	if (p > 0 && p < CON_NUMPAIRS) {
+	    WORD a;
+	    a = WINCONSOLE.pairs[p];
+	    res = (WORD) ((res & 0xff00) | a);
+	}
+    }
+
+    if (ch & A_REVERSE) {
+	res = RevAttr(res);
+    }
+
+    if (ch & A_STANDOUT) {
+	res = RevAttr(res) | BACKGROUND_INTENSITY;
+    }
+
+    if (ch & A_BOLD)
+	res |= FOREGROUND_INTENSITY;
+
+    if (ch & A_DIM)
+	res |= BACKGROUND_INTENSITY;
+
+    return res;
+}
+
+#if 0				/* def TRACE */
+static void
+dump_screen(const char *fn, int ln)
+{
+    int max_cells = (WINCONSOLE.SBI.dwSize.Y *
+		     (1 + WINCONSOLE.SBI.dwSize.X)) + 1;
+    char output[max_cells];
+    CHAR_INFO save_screen[max_cells];
+    COORD save_size;
+    SMALL_RECT save_region;
+    COORD bufferCoord;
+
+    T(("dump_screen %s@%d", fn, ln));
+
+    save_region.Top = WINCONSOLE.SBI.srWindow.Top;
+    save_region.Left = WINCONSOLE.SBI.srWindow.Left;
+    save_region.Bottom = WINCONSOLE.SBI.srWindow.Bottom;
+    save_region.Right = WINCONSOLE.SBI.srWindow.Right;
+
+    save_size.X = (SHORT) (save_region.Right - save_region.Left + 1);
+    save_size.Y = (SHORT) (save_region.Bottom - save_region.Top + 1);
+
+    bufferCoord.X = bufferCoord.Y = 0;
+
+    if (read_screen(WINCONSOLE.hdl,
+		    save_screen,
+		    save_size,
+		    bufferCoord,
+		    &save_region)) {
+	int i, j;
+	int ij = 0;
+	int k = 0;
+
+	for (i = save_region.Top; i <= save_region.Bottom; ++i) {
+	    for (j = save_region.Left; j <= save_region.Right; ++j) {
+		output[k++] = save_screen[ij++].Char.AsciiChar;
+	    }
+	    output[k++] = '\n';
+	}
+	output[k] = 0;
+
+	T(("DUMP: %d,%d - %d,%d",
+	   save_region.Top,
+	   save_region.Left,
+	   save_region.Bottom,
+	   save_region.Right));
+	T(("%s", output));
+    }
+}
+
+#else
+#define dump_screen(fn,ln)	/* nothing */
+#endif
+
+#if USE_WIDEC_SUPPORT
+/*
+ * TODO: support surrogate pairs
+ * TODO: support combining characters
+ * TODO: support acsc
+ * TODO: _nc_wacs should be part of sp.
+ */
+static BOOL
+con_write16(TERMINAL_CONTROL_BLOCK * TCB,
+	    int y, int x, cchar_t *str, int limit)
+{
+    int actual = 0;
+    CHAR_INFO *ci = TypeAlloca(CHAR_INFO, limit);
+    COORD loc, siz;
+    SMALL_RECT rec;
+    int i;
+    cchar_t ch;
+    SCREEN *sp;
+
+    AssertTCB();
+    SetSP();
+
+    for (i = actual = 0; i < limit; i++) {
+	ch = str[i];
+	if (isWidecExt(ch))
+	    continue;
+	ci[actual].Char.UnicodeChar = CharOf(ch);
+	ci[actual].Attributes = MapAttr(WINCONSOLE.SBI.wAttributes,
+					AttrOf(ch));
+	if (AttrOf(ch) & A_ALTCHARSET) {
+	    if (_nc_wacs) {
+		int which = CharOf(ch);
+		if (which > 0
+		    && which < ACS_LEN
+		    && CharOf(_nc_wacs[which]) != 0) {
+		    ci[actual].Char.UnicodeChar = CharOf(_nc_wacs[which]);
+		} else {
+		    ci[actual].Char.UnicodeChar = ' ';
+		}
+	    }
+	}
+	++actual;
+    }
+
+    loc.X = (SHORT) 0;
+    loc.Y = (SHORT) 0;
+    siz.X = (SHORT) actual;
+    siz.Y = 1;
+
+    rec.Left = (SHORT) x;
+    rec.Top = (SHORT) (y + AdjustY());
+    rec.Right = (SHORT) (x + limit - 1);
+    rec.Bottom = rec.Top;
+
+    return write_screen(WINCONSOLE.hdl, ci, siz, loc, &rec);
+}
+#define con_write(tcb, y, x, str, n) con_write16(tcb, y, x, str, n)
+#else
+static BOOL
+con_write8(TERMINAL_CONTROL_BLOCK * TCB, int y, int x, chtype *str, int n)
+{
+    CHAR_INFO *ci = TypeAlloca(CHAR_INFO, n);
+    COORD loc, siz;
+    SMALL_RECT rec;
+    int i;
+    chtype ch;
+    SCREEN *sp;
+
+    AssertTCB();
+    SetSP();
+
+    for (i = 0; i < n; i++) {
+	ch = str[i];
+	ci[i].Char.AsciiChar = ChCharOf(ch);
+	ci[i].Attributes = MapAttr(WINCONSOLE.SBI.wAttributes,
+				   ChAttrOf(ch));
+	if (ChAttrOf(ch) & A_ALTCHARSET) {
+	    if (sp->_acs_map)
+		ci[i].Char.AsciiChar =
+		ChCharOf(NCURSES_SP_NAME(_nc_acs_char) (sp, ChCharOf(ch)));
+	}
+    }
+
+    loc.X = (short) 0;
+    loc.Y = (short) 0;
+    siz.X = (short) n;
+    siz.Y = 1;
+
+    rec.Left = (short) x;
+    rec.Top = (short) y;
+    rec.Right = (short) (x + n - 1);
+    rec.Bottom = rec.Top;
+
+    return write_screen(WINCONSOLE.hdl, ci, siz, loc, &rec);
+}
+#define con_write(tcb, y, x, str, n) con_write8(tcb, y, x, str, n)
+#endif
+
+#if EXP_OPTIMIZE
+/*
+ * Comparing new/current screens, determine the last column-index for a change
+ * beginning on the given row,col position.  Unlike a serial terminal, there is
+ * no cost for "moving" the "cursor" on the line as we update it.
+ */
+static int
+find_end_of_change(SCREEN *sp, int row, int col)
+{
+    int result = col;
+    struct ldat *curdat = CurScreen(sp)->_line + row;
+    struct ldat *newdat = NewScreen(sp)->_line + row;
+
+    while (col <= newdat->lastchar) {
+#if USE_WIDEC_SUPPORT
+	if (isWidecExt(curdat->text[col]) ||
+	    isWidecExt(newdat->text[col])) {
+	    result = col;
+	} else if (memcmp(&curdat->text[col],
+			  &newdat->text[col],
+			  sizeof(curdat->text[0]))) {
+	    result = col;
+	} else {
+	    break;
+	}
+#else
+	if (curdat->text[col] != newdat->text[col]) {
+	    result = col;
+	} else {
+	    break;
+	}
+#endif
+	++col;
+    }
+    return result;
+}
+
+/*
+ * Given a row,col position at the end of a change-chunk, look for the
+ * beginning of the next change-chunk.
+ */
+static int
+find_next_change(SCREEN *sp, int row, int col)
+{
+    struct ldat *curdat = CurScreen(sp)->_line + row;
+    struct ldat *newdat = NewScreen(sp)->_line + row;
+    int result = newdat->lastchar + 1;
+
+    while (++col <= newdat->lastchar) {
+#if USE_WIDEC_SUPPORT
+	if (isWidecExt(curdat->text[col]) !=
+	    isWidecExt(newdat->text[col])) {
+	    result = col;
+	    break;
+	} else if (memcmp(&curdat->text[col],
+			  &newdat->text[col],
+			  sizeof(curdat->text[0]))) {
+	    result = col;
+	    break;
+	}
+#else
+	if (curdat->text[col] != newdat->text[col]) {
+	    result = col;
+	    break;
+	}
+#endif
+    }
+    return result;
+}
+
+#define EndChange(first) \
+	find_end_of_change(sp, y, first)
+#define NextChange(last)                        \
+	find_next_change(sp, y, last)
+
+#endif /* EXP_OPTIMIZE */
+
+#define MARK_NOCHANGE(win,row)                 \
+    win->_line[row].firstchar = _NOCHANGE;     \
+    win->_line[row].lastchar  = _NOCHANGE
+
+static bool
+restore_original_screen(void)
+{
+    COORD bufferCoord;
+    bool result = FALSE;
+    SMALL_RECT save_region = WINCONSOLE.save_region;
+
+    T(("... restoring %s", WINCONSOLE.window_only ?
+       "window" : "entire buffer"));
+
+    bufferCoord.X = (SHORT) (WINCONSOLE.window_only ?
+			     WINCONSOLE.SBI.srWindow.Left : 0);
+    bufferCoord.Y = (SHORT) (WINCONSOLE.window_only ?
+			     WINCONSOLE.SBI.srWindow.Top : 0);
+
+    if (write_screen(WINCONSOLE.hdl,
+		     WINCONSOLE.save_screen,
+		     WINCONSOLE.save_size,
+		     bufferCoord,
+		     &save_region)) {
+	result = TRUE;
+	mvcur(-1, -1, LINES - 2, 0);
+	T(("... restore original screen contents ok %dx%d (%d,%d - %d,%d)",
+	   WINCONSOLE.save_size.Y,
+	   WINCONSOLE.save_size.X,
+	   save_region.Top,
+	   save_region.Left,
+	   save_region.Bottom,
+	   save_region.Right));
+    } else {
+	T(("... restore original screen contents err"));
+    }
+    return result;
+}
+
+static const char *
+wcon_name(TERMINAL_CONTROL_BLOCK * TCB)
+{
+    (void) TCB;
+    return "win32console";
+}
+
+static int
+wcon_doupdate(TERMINAL_CONTROL_BLOCK * TCB)
+{
+    int result = ERR;
+    int y, nonempty, n, x0, x1, Width, Height;
+    SCREEN *sp;
+
+    T((T_CALLED("win32con::wcon_doupdate(%p)"), TCB));
+    if (validateConsoleHandle()) {
+	SetSP();
+
+	Width = screen_columns(sp);
+	Height = screen_lines(sp);
+	nonempty = min(Height, NewScreen(sp)->_maxy + 1);
+
+	T(("... %dx%d clear cur:%d new:%d",
+	   Height, Width,
+	   CurScreen(sp)->_clear,
+	   NewScreen(sp)->_clear));
+
+	if (SP_PARM->_endwin == ewSuspend) {
+
+	    T(("coming back from shell mode"));
+	    NCURSES_SP_NAME(reset_prog_mode) (NCURSES_SP_ARG);
+
+	    NCURSES_SP_NAME(_nc_mvcur_resume) (NCURSES_SP_ARG);
+	    NCURSES_SP_NAME(_nc_screen_resume) (NCURSES_SP_ARG);
+	    SP_PARM->_mouse_resume(SP_PARM);
+
+	    SP_PARM->_endwin = ewRunning;
+	}
+
+	if ((CurScreen(sp)->_clear || NewScreen(sp)->_clear)) {
+	    int x;
+#if USE_WIDEC_SUPPORT
+	    cchar_t *empty = TypeAlloca(cchar_t, Width);
+	    wchar_t blank[2] =
+	    {
+		L' ', L'\0'
+	    };
+
+	    for (x = 0; x < Width; x++)
+		setcchar(&empty[x], blank, 0, 0, 0);
+#else
+	    chtype *empty = TypeAlloca(chtype, Width);
+
+	    for (x = 0; x < Width; x++)
+		empty[x] = ' ';
+#endif
+
+	    for (y = 0; y < nonempty; y++) {
+		con_write(TCB, y, 0, empty, Width);
+		memcpy(empty,
+		       CurScreen(sp)->_line[y].text,
+		       (size_t) Width * sizeof(empty[0]));
+	    }
+	    CurScreen(sp)->_clear = FALSE;
+	    NewScreen(sp)->_clear = FALSE;
+	    touchwin(NewScreen(sp));
+	    T(("... cleared %dx%d lines @%d of screen", nonempty, Width,
+	       AdjustY()));
+	}
+
+	for (y = 0; y < nonempty; y++) {
+	    x0 = NewScreen(sp)->_line[y].firstchar;
+	    if (x0 != _NOCHANGE) {
+#if EXP_OPTIMIZE
+		int x2;
+		int limit = NewScreen(sp)->_line[y].lastchar;
+		while ((x1 = EndChange(x0)) <= limit) {
+		    while ((x2 = NextChange(x1)) <=
+			   limit && x2 <= (x1 + 2)) {
+			x1 = x2;
+		    }
+		    n = x1 - x0 + 1;
+		    memcpy(&CurScreen(sp)->_line[y].text[x0],
+			   &NewScreen(sp)->_line[y].text[x0],
+			   n * sizeof(CurScreen(sp)->_line[y].text[x0]));
+		    con_write(TCB,
+			      y,
+			      x0,
+			      &CurScreen(sp)->_line[y].text[x0], n);
+		    x0 = NextChange(x1);
+		}
+
+		/* mark line changed successfully */
+		if (y <= NewScreen(sp)->_maxy) {
+		    MARK_NOCHANGE(NewScreen(sp), y);
+		}
+		if (y <= CurScreen(sp)->_maxy) {
+		    MARK_NOCHANGE(CurScreen(sp), y);
+		}
+#else
+		x1 = NewScreen(sp)->_line[y].lastchar;
+		n = x1 - x0 + 1;
+		if (n > 0) {
+		    memcpy(&CurScreen(sp)->_line[y].text[x0],
+			   &NewScreen(sp)->_line[y].text[x0],
+			   (size_t) n *
+			   sizeof(CurScreen(sp)->_line[y].text[x0]));
+		    con_write(TCB,
+			      y,
+			      x0,
+			      &CurScreen(sp)->_line[y].text[x0], n);
+
+		    /* mark line changed successfully */
+		    if (y <= NewScreen(sp)->_maxy) {
+			MARK_NOCHANGE(NewScreen(sp), y);
+		    }
+		    if (y <= CurScreen(sp)->_maxy) {
+			MARK_NOCHANGE(CurScreen(sp), y);
+		    }
+		}
+#endif
+	    }
+	}
+
+	/* put everything back in sync */
+	for (y = nonempty; y <= NewScreen(sp)->_maxy; y++) {
+	    MARK_NOCHANGE(NewScreen(sp), y);
+	}
+	for (y = nonempty; y <= CurScreen(sp)->_maxy; y++) {
+	    MARK_NOCHANGE(CurScreen(sp), y);
+	}
+
+	if (!NewScreen(sp)->_leaveok) {
+	    CurScreen(sp)->_curx = NewScreen(sp)->_curx;
+	    CurScreen(sp)->_cury = NewScreen(sp)->_cury;
+
+	    TCB->drv->td_hwcur(TCB,
+			       0,
+			       0,
+			       CurScreen(sp)->_cury,
+			       CurScreen(sp)->_curx);
+	}
+	_nc_console_selectActiveHandle();
+	result = OK;
+    }
+    returnCode(result);
+}
+
+static bool
+wcon_CanHandle(TERMINAL_CONTROL_BLOCK * TCB,
+	       const char *tname,
+	       int *errret GCC_UNUSED)
+{
+    bool code = FALSE;
+
+    T((T_CALLED("win32con::wcon_CanHandle(%p)"), TCB));
+
+    assert((TCB != 0) && (tname != 0));
+
+    TCB->magic = WINMAGIC;
+
+    if (tname == 0 || *tname == 0) {
+	if (!_nc_console_vt_supported())
+	    code = TRUE;
+    } else if (tname != 0 && *tname == '#') {
+	/*
+	 * Use "#" (a character which cannot begin a terminal's name) to
+	 * select specific driver from the table.
+	 *
+	 * In principle, we could have more than one non-terminfo driver,
+	 * e.g., "win32gui".
+	 */
+	size_t n = strlen(tname + 1);
+	if (n != 0
+	    && ((strncmp(tname + 1, "win32console", n) == 0)
+		|| (strncmp(tname + 1, "win32con", n) == 0))) {
+	    code = TRUE;
+	}
+    } else if (tname != 0 && stricmp(tname, "unknown") == 0) {
+	code = TRUE;
+    }
+
+    /*
+     * This is intentional, to avoid unnecessary breakage of applications
+     * using <term.h> symbols.
+     */
+    if (code && (TerminalType(&TCB->term).Booleans == 0)) {
+	_nc_init_termtype(&TerminalType(&TCB->term));
+#if NCURSES_EXT_NUMBERS
+	_nc_export_termtype2(&TCB->term.type, &TerminalType(&TCB->term));
+#endif
+    }
+
+    if (!code) {
+	if (_nc_console_test(0)) {
+	    T(("isTermInfoConsole=TRUE"));
+	    WINCONSOLE.isTermInfoConsole = TRUE;
+	}
+    }
+    returnBool(code);
+}
+
+static int
+wcon_dobeepflash(TERMINAL_CONTROL_BLOCK * TCB,
+		 int beepFlag)
+{
+    SCREEN *sp;
+    int res = ERR;
+
+    int high = (WINCONSOLE.SBI.srWindow.Bottom -
+		WINCONSOLE.SBI.srWindow.Top + 1);
+    int wide = (WINCONSOLE.SBI.srWindow.Right -
+		WINCONSOLE.SBI.srWindow.Left + 1);
+    int max_cells = (high * wide);
+    int i;
+
+    CHAR_INFO *this_screen = TypeAlloca(CHAR_INFO, max_cells);
+    CHAR_INFO *that_screen = TypeAlloca(CHAR_INFO, max_cells);
+    COORD this_size;
+    SMALL_RECT this_region;
+    COORD bufferCoord;
+
+    if (validateConsoleHandle()) {
+	SetSP();
+	this_region.Top = WINCONSOLE.SBI.srWindow.Top;
+	this_region.Left = WINCONSOLE.SBI.srWindow.Left;
+	this_region.Bottom = WINCONSOLE.SBI.srWindow.Bottom;
+	this_region.Right = WINCONSOLE.SBI.srWindow.Right;
+
+	this_size.X = (SHORT) wide;
+	this_size.Y = (SHORT) high;
+
+	bufferCoord.X = this_region.Left;
+	bufferCoord.Y = this_region.Top;
+
+	if (!beepFlag &&
+	    read_screen(WINCONSOLE.hdl,
+			this_screen,
+			this_size,
+			bufferCoord,
+			&this_region)) {
+
+	    memcpy(that_screen,
+		   this_screen,
+		   sizeof(CHAR_INFO) * (size_t) max_cells);
+
+	    for (i = 0; i < max_cells; i++) {
+		that_screen[i].Attributes =
+		    RevAttr(that_screen[i].Attributes);
+	    }
+
+	    write_screen(WINCONSOLE.hdl, that_screen, this_size,
+			 bufferCoord, &this_region);
+	    Sleep(200);
+	    write_screen(WINCONSOLE.hdl, this_screen, this_size,
+			 bufferCoord, &this_region);
+
+	} else {
+	    MessageBeep(MB_ICONWARNING);	/* MB_OK might be better */
+	}
+	res = OK;
+    }
+    return res;
+}
+
+static int
+wcon_print(TERMINAL_CONTROL_BLOCK * TCB,
+	   char *data GCC_UNUSED,
+	   int len GCC_UNUSED)
+{
+    SCREEN *sp;
+
+    AssertTCB();
+    SetSP();
+
+    return ERR;
+}
+
+static int
+wcon_defaultcolors(TERMINAL_CONTROL_BLOCK * TCB,
+		   int fg GCC_UNUSED,
+		   int bg GCC_UNUSED)
+{
+    SCREEN *sp;
+    int code = ERR;
+
+    AssertTCB();
+    SetSP();
+
+    return (code);
+}
+
+static void
+wcon_setcolor(TERMINAL_CONTROL_BLOCK * TCB,
+	      int fore,
+	      int color,
+	      int (*outc) (SCREEN *, int) GCC_UNUSED)
+{
+    (void) TCB;
+    if (validateConsoleHandle()) {
+	WORD a = _nc_console_MapColor(fore, color);
+	a |= (WORD) ((WINCONSOLE.SBI.wAttributes) & (fore ? 0xfff8 : 0xff8f));
+	SetConsoleTextAttribute(WINCONSOLE.hdl, a);
+	_nc_console_get_SBI();
+    }
+}
+
+static bool
+wcon_rescol(TERMINAL_CONTROL_BLOCK * TCB)
+{
+    bool res = FALSE;
+
+    (void) TCB;
+    if (validateConsoleHandle()) {
+	WORD a = FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN;
+	SetConsoleTextAttribute(WINCONSOLE.hdl, a);
+	_nc_console_get_SBI();
+	res = TRUE;
+    }
+    return res;
+}
+
+static bool
+wcon_rescolors(TERMINAL_CONTROL_BLOCK * TCB)
+{
+    int result = FALSE;
+    SCREEN *sp;
+
+    AssertTCB();
+    SetSP();
+
+    return result;
+}
+
+static int
+wcon_size(TERMINAL_CONTROL_BLOCK * TCB, int *Lines, int *Cols)
+{
+    int result = ERR;
+
+    T((T_CALLED("win32con::wcon_size(%p)"), TCB));
+
+    if (validateConsoleHandle() &&
+	(Lines != NULL) && (Cols != NULL)) {
+	_nc_console_size(Lines, Cols);
+	result = OK;
+    }
+    returnCode(result);
+}
+
+static int
+wcon_setsize(TERMINAL_CONTROL_BLOCK * TCB GCC_UNUSED,
+	     int l GCC_UNUSED,
+	     int c GCC_UNUSED)
+{
+    AssertTCB();
+    return ERR;
+}
+
+static int
+wcon_sgmode(TERMINAL_CONTROL_BLOCK * TCB, int setFlag, TTY * buf)
+{
+    int result = ERR;
+
+    T((T_CALLED("win32con::wcon_sgmode(TCB=(%p),setFlag=%d,TTY=(%p)"),
+       TCB, setFlag, buf));
+    if (buf != NULL && validateConsoleHandle()) {
+
+	if (setFlag) {
+	    _nc_console_setmode(WINCONSOLE.hdl, buf);
+	    TCB->term.Nttyb = *buf;
+	} else {
+	    _nc_console_getmode(WINCONSOLE.hdl, &(TCB->term.Nttyb));
+	    *buf = TCB->term.Nttyb;
+	}
+	result = OK;
+    }
+    returnCode(result);
+}
+
+#define MIN_WIDE 80
+#define MIN_HIGH 24
+
+static int
+wcon_mode(TERMINAL_CONTROL_BLOCK * TCB, int progFlag, int defFlag)
+{
+    SCREEN *sp;
+    TERMINAL *_term = (TERMINAL *) TCB;
+    int code = ERR;
+
+    if (validateConsoleHandle()) {
+	sp = TCB->csp;
+
+	T((T_CALLED("win32con::wcon_mode(%p, progFlag=%d, defFlag=%d)"),
+	   TCB, progFlag, defFlag));
+
+	WINCONSOLE.progMode = progFlag;
+	WINCONSOLE.lastOut = progFlag ? WINCONSOLE.hdl : WINCONSOLE.out;
+	SetConsoleActiveScreenBuffer(WINCONSOLE.lastOut);
+
+	if (progFlag) /* prog mode */  {
+	    if (defFlag) {
+		if ((wcon_sgmode(TCB, FALSE, &(_term->Nttyb)) == OK)) {
+		    code = OK;
+		}
+	    } else {
+		/* reset_prog_mode */
+		if (wcon_sgmode(TCB, TRUE, &(_term->Nttyb)) == OK) {
+		    if (sp) {
+			if (sp->_keypad_on)
+			    _nc_keypad(sp, TRUE);
+		    }
+		    if (!WINCONSOLE.buffered) {
+			_nc_console_set_scrollback(FALSE, &WINCONSOLE.SBI);
+		    }
+		    code = OK;
+		}
+	    }
+	    T(("... buffered:%d, clear:%d",
+	       WINCONSOLE.buffered, CurScreen(sp)->_clear));
+	} else {		/* shell mode */
+	    if (defFlag) {
+		/* def_shell_mode */
+		if (wcon_sgmode(TCB, FALSE, &(_term->Ottyb)) == OK) {
+		    code = OK;
+		}
+	    } else {
+		/* reset_shell_mode */
+		if (sp) {
+		    _nc_keypad(sp, FALSE);
+		    NCURSES_SP_NAME(_nc_flush) (sp);
+		}
+		code = wcon_sgmode(TCB, TRUE, &(_term->Ottyb));
+		if (!WINCONSOLE.buffered) {
+		    _nc_console_set_scrollback(TRUE, &WINCONSOLE.save_SBI);
+		    if (!restore_original_screen())
+			code = ERR;
+		}
+		SetConsoleCursorInfo(WINCONSOLE.hdl, &WINCONSOLE.save_CI);
+	    }
+	}
+
+    }
+    returnCode(code);
+}
+
+static void
+wcon_screen_init(SCREEN *sp GCC_UNUSED)
+{
+}
+
+static void
+wcon_wrap(SCREEN *sp GCC_UNUSED)
+{
+}
+
+static void
+wcon_release(TERMINAL_CONTROL_BLOCK * TCB)
+{
+    T((T_CALLED("win32con::wcon_release(%p)"), TCB));
+
+    AssertTCB();
+    if (TCB->prop)
+	free(TCB->prop);
+
+    returnVoid;
+}
+
+static void
+wcon_init(TERMINAL_CONTROL_BLOCK * TCB)
+{
+    T((T_CALLED("win32con::wcon_init(%p)"), TCB));
+
+    AssertTCB();
+
+    if (!(console_initialized = _nc_console_checkinit(TRUE, FALSE))) {
+	returnVoid;
+    }
+
+    if (TCB) {
+	TCB->info.initcolor = TRUE;
+	TCB->info.canchange = FALSE;
+	TCB->info.hascolor = TRUE;
+	TCB->info.caninit = TRUE;
+
+	TCB->info.maxpairs = CON_NUMPAIRS;
+	TCB->info.maxcolors = 8;
+	TCB->info.numlabels = 0;
+	TCB->info.labelwidth = 0;
+	TCB->info.labelheight = 0;
+	TCB->info.nocolorvideo = 1;
+	TCB->info.tabsize = 8;
+
+	TCB->info.numbuttons = WINCONSOLE.numButtons;
+	TCB->info.defaultPalette = _nc_cga_palette;
+
+    }
+    returnVoid;
+}
+
+static void
+wcon_initpair(TERMINAL_CONTROL_BLOCK * TCB,
+	      int pair,
+	      int f,
+	      int b)
+{
+    SCREEN *sp;
+
+    if (validateConsoleHandle()) {
+	SetSP();
+
+	if ((pair > 0) && (pair < CON_NUMPAIRS) && (f >= 0) && (f < 8)
+	    && (b >= 0) && (b < 8)) {
+	    WINCONSOLE.pairs[pair] =
+		_nc_console_MapColor(true, f) |
+		_nc_console_MapColor(false, b);
+	}
+    }
+}
+
+static void
+wcon_initcolor(TERMINAL_CONTROL_BLOCK * TCB,
+	       int color GCC_UNUSED,
+	       int r GCC_UNUSED,
+	       int g GCC_UNUSED,
+	       int b GCC_UNUSED)
+{
+    SCREEN *sp;
+
+    AssertTCB();
+    SetSP();
+}
+
+static void
+wcon_do_color(TERMINAL_CONTROL_BLOCK * TCB,
+	      int old_pair GCC_UNUSED,
+	      int pair GCC_UNUSED,
+	      int reverse GCC_UNUSED,
+	      int (*outc) (SCREEN *, int) GCC_UNUSED
+)
+{
+    SCREEN *sp;
+
+    AssertTCB();
+    SetSP();
+}
+
+static void
+wcon_initmouse(TERMINAL_CONTROL_BLOCK * TCB)
+{
+    SCREEN *sp;
+
+    if (validateConsoleHandle()) {
+	SetSP();
+
+	sp->_mouse_type = M_TERM_DRIVER;
+    }
+}
+
+static int
+wcon_testmouse(TERMINAL_CONTROL_BLOCK * TCB,
+	       int delay
+	       EVENTLIST_2nd(_nc_eventlist * evl))
+{
+    int rc = 0;
+    SCREEN *sp;
+
+    if (validateConsoleHandle()) {
+	SetSP();
+
+	if (sp->_drv_mouse_head < sp->_drv_mouse_tail) {
+	    rc = TW_MOUSE;
+	} else {
+	    rc = TCBOf(sp)->drv->td_twait(TCBOf(sp),
+					  TWAIT_MASK,
+					  delay,
+					  (int *) 0
+					  EVENTLIST_2nd(evl));
+	}
+    }
+
+    return rc;
+}
+
+static int
+wcon_mvcur(TERMINAL_CONTROL_BLOCK * TCB,
+	   int yold GCC_UNUSED, int xold GCC_UNUSED,
+	   int y, int x)
+{
+    int ret = ERR;
+
+    (void) TCB;
+    if (validateConsoleHandle()) {
+	COORD loc;
+	loc.X = (short) x;
+	loc.Y = (short) (y + AdjustY());
+	SetConsoleCursorPosition(WINCONSOLE.hdl, loc);
+	ret = OK;
+    }
+    return ret;
+}
+
+static void
+wcon_hwlabel(TERMINAL_CONTROL_BLOCK * TCB,
+	     int labnum GCC_UNUSED,
+	     char *text GCC_UNUSED)
+{
+    SCREEN *sp;
+
+    AssertTCB();
+    SetSP();
+}
+
+static void
+wcon_hwlabelOnOff(TERMINAL_CONTROL_BLOCK * TCB,
+		  int OnFlag GCC_UNUSED)
+{
+    SCREEN *sp;
+
+    AssertTCB();
+    SetSP();
+}
+
+static chtype
+wcon_conattr(TERMINAL_CONTROL_BLOCK * TCB GCC_UNUSED)
+{
+    chtype res = A_NORMAL;
+    res |= (A_BOLD | A_DIM | A_REVERSE | A_STANDOUT | A_COLOR);
+    return res;
+}
+
+static void
+wcon_setfilter(TERMINAL_CONTROL_BLOCK * TCB)
+{
+    SCREEN *sp;
+
+    AssertTCB();
+    SetSP();
+}
+
+static void
+wcon_initacs(TERMINAL_CONTROL_BLOCK * TCB,
+	     chtype *real_map GCC_UNUSED,
+	     chtype *fake_map GCC_UNUSED)
+{
+#define DATA(a,b) { a, b }
+    static struct {
+	int acs_code;
+	int use_code;
+    } table[] = {
+	DATA('a', 0xb1),	/* ACS_CKBOARD  */
+	    DATA('f', 0xf8),	/* ACS_DEGREE   */
+	    DATA('g', 0xf1),	/* ACS_PLMINUS  */
+	    DATA('j', 0xd9),	/* ACS_LRCORNER */
+	    DATA('l', 0xda),	/* ACS_ULCORNER */
+	    DATA('k', 0xbf),	/* ACS_URCORNER */
+	    DATA('m', 0xc0),	/* ACS_LLCORNER */
+	    DATA('n', 0xc5),	/* ACS_PLUS     */
+	    DATA('q', 0xc4),	/* ACS_HLINE    */
+	    DATA('t', 0xc3),	/* ACS_LTEE     */
+	    DATA('u', 0xb4),	/* ACS_RTEE     */
+	    DATA('v', 0xc1),	/* ACS_BTEE     */
+	    DATA('w', 0xc2),	/* ACS_TTEE     */
+	    DATA('x', 0xb3),	/* ACS_VLINE    */
+	    DATA('y', 0xf3),	/* ACS_LEQUAL   */
+	    DATA('z', 0xf2),	/* ACS_GEQUAL   */
+	    DATA('0', 0xdb),	/* ACS_BLOCK    */
+	    DATA('{', 0xe3),	/* ACS_PI       */
+	    DATA('}', 0x9c),	/* ACS_STERLING */
+	    DATA(',', 0xae),	/* ACS_LARROW   */
+	    DATA('+', 0xaf),	/* ACS_RARROW   */
+	    DATA('~', 0xf9),	/* ACS_BULLET   */
+    };
+#undef DATA
+    unsigned n;
+
+    SCREEN *sp;
+    if (validateConsoleHandle()) {
+	SetSP();
+
+	for (n = 0; n < SIZEOF(table); ++n) {
+	    real_map[table[n].acs_code] =
+		(chtype) table[n].use_code | A_ALTCHARSET;
+	    if (sp != 0)
+		sp->_screen_acs_map[table[n].acs_code] = TRUE;
+	}
+    }
+}
+
+static int
+wcon_twait(TERMINAL_CONTROL_BLOCK * TCB,
+	   int mode,
+	   int milliseconds,
+	   int *timeleft
+	   EVENTLIST_2nd(_nc_eventlist * evl))
+{
+    SCREEN *sp;
+    int code = 0;
+
+    if (validateConsoleHandle()) {
+	SetSP();
+
+	code = _nc_console_twait(sp,
+				 WINCONSOLE.inp,
+				 mode,
+				 milliseconds,
+				 timeleft EVENTLIST_2nd(evl));
+    }
+    return code;
+}
+
+static int
+wcon_read(TERMINAL_CONTROL_BLOCK * TCB, int *buf)
+{
+    SCREEN *sp;
+    int n = -1;
+
+    T((T_CALLED("win32con::wcon_read(%p)"), TCB));
+
+    assert(buf);
+    if (validateConsoleHandle()) {
+	SetSP();
+
+	n = _nc_console_read(sp, WINCONSOLE.inp, buf);
+    }
+    returnCode(n);
+}
+
+static int
+wcon_nap(TERMINAL_CONTROL_BLOCK * TCB GCC_UNUSED, int ms)
+{
+    T((T_CALLED("win32con::wcon_nap(%p, %d)"), TCB, ms));
+    Sleep((DWORD) ms);
+    returnCode(OK);
+}
+
+static int
+wcon_cursorSet(TERMINAL_CONTROL_BLOCK * TCB GCC_UNUSED, int mode)
+{
+    int res = -1;
+
+    T((T_CALLED("win32con:wcon_cursorSet(%d)"), mode));
+    if (validateConsoleHandle()) {
+	CONSOLE_CURSOR_INFO this_CI = WINCONSOLE.save_CI;
+	switch (mode) {
+	case 0:
+	    this_CI.bVisible = FALSE;
+	    break;
+	case 1:
+	    break;
+	case 2:
+	    this_CI.dwSize = 100;
+	    break;
+	}
+	SetConsoleCursorInfo(WINCONSOLE.hdl, &this_CI);
+    }
+    returnCode(res);
+}
+
+static bool
+wcon_kyExist(TERMINAL_CONTROL_BLOCK * TCB GCC_UNUSED, int keycode)
+{
+    bool found = FALSE;
+
+    T((T_CALLED("win32con::wcon_kyExist(%d)"), keycode));
+    found = _nc_console_keyExist(keycode);
+    returnBool(found);
+}
+
+static int
+wcon_kpad(TERMINAL_CONTROL_BLOCK * TCB, int flag GCC_UNUSED)
+{
+    SCREEN *sp;
+    int code = ERR;
+
+    T((T_CALLED("win32con::wcon_kpad(%p, %d)"), TCB, flag));
+
+    if (validateConsoleHandle()) {
+	SetSP();
+
+	if (sp) {
+	    code = OK;
+	}
+    }
+    returnCode(code);
+}
+
+static int
+wcon_keyok(TERMINAL_CONTROL_BLOCK * TCB,
+	   int keycode,
+	   int flag)
+{
+    int code = ERR;
+    SCREEN *sp;
+
+    T((T_CALLED("win32con::wcon_keyok(%p, %d, %d)"), TCB, keycode, flag));
+
+    if (validateConsoleHandle()) {
+	SetSP();
+	if (sp) {
+	    code = _nc_console_keyok(keycode, flag);
+	}
+    }
+    returnCode(code);
+}
+
+NCURSES_EXPORT_VAR (TERM_DRIVER) _nc_WIN_DRIVER = {
+    FALSE,
+	wcon_name,		/* Name          */
+	wcon_CanHandle,		/* CanHandle     */
+	wcon_init,		/* init          */
+	wcon_release,		/* release       */
+	wcon_size,		/* size          */
+	wcon_sgmode,		/* sgmode        */
+	wcon_conattr,		/* conattr       */
+	wcon_mvcur,		/* hwcur         */
+	wcon_mode,		/* mode          */
+	wcon_rescol,		/* rescol        */
+	wcon_rescolors,		/* rescolors     */
+	wcon_setcolor,		/* color         */
+	wcon_dobeepflash,	/* DoBeepFlash   */
+	wcon_initpair,		/* initpair      */
+	wcon_initcolor,		/* initcolor     */
+	wcon_do_color,		/* docolor       */
+	wcon_initmouse,		/* initmouse     */
+	wcon_testmouse,		/* testmouse     */
+	wcon_setfilter,		/* setfilter     */
+	wcon_hwlabel,		/* hwlabel       */
+	wcon_hwlabelOnOff,	/* hwlabelOnOff  */
+	wcon_doupdate,		/* update        */
+	wcon_defaultcolors,	/* defaultcolors */
+	wcon_print,		/* print         */
+	wcon_size,		/* getsize       */
+	wcon_setsize,		/* setsize       */
+	wcon_initacs,		/* initacs       */
+	wcon_screen_init,	/* scinit        */
+	wcon_wrap,		/* scexit        */
+	wcon_twait,		/* twait         */
+	wcon_read,		/* read          */
+	wcon_nap,		/* nap           */
+	wcon_kpad,		/* kpad          */
+	wcon_keyok,		/* kyOk          */
+	wcon_kyExist,		/* kyExist       */
+	wcon_cursorSet		/* cursorSet     */
+};
+
+#endif /* _NC_WINDOWS */
diff --git a/ncurses/win32con/win_driver.c b/ncurses/win32con/win_driver.c
new file mode 100644
index 0000000..ad9e629
--- /dev/null
+++ b/ncurses/win32con/win_driver.c
@@ -0,0 +1,2275 @@
+/****************************************************************************
+ * Copyright 2018-2020,2021 Thomas E. Dickey                                *
+ * Copyright 2008-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Juergen Pfeifer                                                 *
+ *     and: Thomas E. Dickey                                                *
+ ****************************************************************************/
+
+/*
+ * TODO - GetMousePos(POINT * result) from ntconio.c
+ * TODO - implement nodelay
+ * TODO - improve screen-repainting performance, using implied wraparound to reduce write's
+ * TODO - make it optional whether screen is restored or not when non-buffered
+ */
+
+#include <curses.priv.h>
+
+#ifdef _WIN32
+#include <tchar.h>
+#else
+#include <windows.h>
+#include <wchar.h>
+#endif
+
+#include <io.h>
+
+#define PSAPI_VERSION 2
+#include <psapi.h>
+
+#define CUR TerminalType(my_term).
+
+MODULE_ID("$Id: win_driver.c,v 1.67 2021/09/04 10:54:35 tom Exp $")
+
+#define TypeAlloca(type,count) (type*) _alloca(sizeof(type) * (size_t) (count))
+
+#define WINMAGIC NCDRV_MAGIC(NCDRV_WINCONSOLE)
+
+#define EXP_OPTIMIZE 0
+
+#define array_length(a) (sizeof(a)/sizeof(a[0]))
+
+static bool InitConsole(void);
+static bool okConsoleHandle(TERMINAL_CONTROL_BLOCK *);
+
+#define AssertTCB() assert(TCB != 0 && (TCB->magic == WINMAGIC))
+#define SetSP()     assert(TCB->csp != 0); sp = TCB->csp; (void) sp
+
+#define GenMap(vKey,key) MAKELONG(key, vKey)
+
+#define AdjustY() (CON.buffered ? 0 : (int) CON.SBI.srWindow.Top)
+
+#if USE_WIDEC_SUPPORT
+#define write_screen WriteConsoleOutputW
+#define read_screen  ReadConsoleOutputW
+#else
+#define write_screen WriteConsoleOutput
+#define read_screen  ReadConsoleOutput
+#endif
+
+static const LONG keylist[] =
+{
+    GenMap(VK_PRIOR, KEY_PPAGE),
+    GenMap(VK_NEXT, KEY_NPAGE),
+    GenMap(VK_END, KEY_END),
+    GenMap(VK_HOME, KEY_HOME),
+    GenMap(VK_LEFT, KEY_LEFT),
+    GenMap(VK_UP, KEY_UP),
+    GenMap(VK_RIGHT, KEY_RIGHT),
+    GenMap(VK_DOWN, KEY_DOWN),
+    GenMap(VK_DELETE, KEY_DC),
+    GenMap(VK_INSERT, KEY_IC)
+};
+static const LONG ansi_keys[] =
+{
+    GenMap(VK_PRIOR, 'I'),
+    GenMap(VK_NEXT, 'Q'),
+    GenMap(VK_END, 'O'),
+    GenMap(VK_HOME, 'H'),
+    GenMap(VK_LEFT, 'K'),
+    GenMap(VK_UP, 'H'),
+    GenMap(VK_RIGHT, 'M'),
+    GenMap(VK_DOWN, 'P'),
+    GenMap(VK_DELETE, 'S'),
+    GenMap(VK_INSERT, 'R')
+};
+#define N_INI ((int)array_length(keylist))
+#define FKEYS 24
+#define MAPSIZE (FKEYS + N_INI)
+#define NUMPAIRS 64
+
+/*   A process can only have a single console, so it is safe
+     to maintain all the information about it in a single
+     static structure.
+ */
+static struct {
+    BOOL initialized;
+    BOOL buffered;
+    BOOL window_only;
+    BOOL progMode;
+    BOOL isMinTTY;
+    BOOL isTermInfoConsole;
+    HANDLE out;
+    HANDLE inp;
+    HANDLE hdl;
+    HANDLE lastOut;
+    int numButtons;
+    DWORD ansi_map[MAPSIZE];
+    DWORD map[MAPSIZE];
+    DWORD rmap[MAPSIZE];
+    WORD pairs[NUMPAIRS];
+    COORD origin;
+    CHAR_INFO *save_screen;
+    COORD save_size;
+    SMALL_RECT save_region;
+    CONSOLE_SCREEN_BUFFER_INFO SBI;
+    CONSOLE_SCREEN_BUFFER_INFO save_SBI;
+    CONSOLE_CURSOR_INFO save_CI;
+} CON;
+
+static BOOL console_initialized = FALSE;
+
+static WORD
+MapColor(bool fore, int color)
+{
+    static const int _cmap[] =
+    {0, 4, 2, 6, 1, 5, 3, 7};
+    int a;
+    if (color < 0 || color > 7)
+	a = fore ? 7 : 0;
+    else
+	a = _cmap[color];
+    if (!fore)
+	a = a << 4;
+    return (WORD) a;
+}
+
+#define RevAttr(attr) \
+	       (WORD) (((attr) & 0xff00) | \
+		      ((((attr) & 0x07) << 4) | \
+		       (((attr) & 0x70) >> 4)))
+
+static WORD
+MapAttr(WORD res, attr_t ch)
+{
+    if (ch & A_COLOR) {
+	int p;
+
+	p = PairNumber(ch);
+	if (p > 0 && p < NUMPAIRS) {
+	    WORD a;
+	    a = CON.pairs[p];
+	    res = (WORD) ((res & 0xff00) | a);
+	}
+    }
+
+    if (ch & A_REVERSE) {
+	res = RevAttr(res);
+    }
+
+    if (ch & A_STANDOUT) {
+	res = RevAttr(res) | BACKGROUND_INTENSITY;
+    }
+
+    if (ch & A_BOLD)
+	res |= FOREGROUND_INTENSITY;
+
+    if (ch & A_DIM)
+	res |= BACKGROUND_INTENSITY;
+
+    return res;
+}
+
+#if 0				/* def TRACE */
+static void
+dump_screen(const char *fn, int ln)
+{
+    int max_cells = (CON.SBI.dwSize.Y * (1 + CON.SBI.dwSize.X)) + 1;
+    char output[max_cells];
+    CHAR_INFO save_screen[max_cells];
+    COORD save_size;
+    SMALL_RECT save_region;
+    COORD bufferCoord;
+
+    T(("dump_screen %s@%d", fn, ln));
+
+    save_region.Top = CON.SBI.srWindow.Top;
+    save_region.Left = CON.SBI.srWindow.Left;
+    save_region.Bottom = CON.SBI.srWindow.Bottom;
+    save_region.Right = CON.SBI.srWindow.Right;
+
+    save_size.X = (SHORT) (save_region.Right - save_region.Left + 1);
+    save_size.Y = (SHORT) (save_region.Bottom - save_region.Top + 1);
+
+    bufferCoord.X = bufferCoord.Y = 0;
+
+    if (read_screen(CON.hdl,
+		    save_screen,
+		    save_size,
+		    bufferCoord,
+		    &save_region)) {
+	int i, j;
+	int ij = 0;
+	int k = 0;
+
+	for (i = save_region.Top; i <= save_region.Bottom; ++i) {
+	    for (j = save_region.Left; j <= save_region.Right; ++j) {
+		output[k++] = save_screen[ij++].Char.AsciiChar;
+	    }
+	    output[k++] = '\n';
+	}
+	output[k] = 0;
+
+	T(("DUMP: %d,%d - %d,%d",
+	   save_region.Top,
+	   save_region.Left,
+	   save_region.Bottom,
+	   save_region.Right));
+	T(("%s", output));
+    }
+}
+
+#else
+#define dump_screen(fn,ln)	/* nothing */
+#endif
+
+#if USE_WIDEC_SUPPORT
+/*
+ * TODO: support surrogate pairs
+ * TODO: support combining characters
+ * TODO: support acsc
+ * TODO: _nc_wacs should be part of sp.
+ */
+static BOOL
+con_write16(TERMINAL_CONTROL_BLOCK * TCB, int y, int x, cchar_t *str, int limit)
+{
+    int actual = 0;
+    CHAR_INFO *ci = TypeAlloca(CHAR_INFO, limit);
+    COORD loc, siz;
+    SMALL_RECT rec;
+    int i;
+    cchar_t ch;
+    SCREEN *sp;
+
+    AssertTCB();
+    SetSP();
+
+    for (i = actual = 0; i < limit; i++) {
+	ch = str[i];
+	if (isWidecExt(ch))
+	    continue;
+	ci[actual].Char.UnicodeChar = CharOf(ch);
+	ci[actual].Attributes = MapAttr(CON.SBI.wAttributes,
+					AttrOf(ch));
+	if (AttrOf(ch) & A_ALTCHARSET) {
+	    if (_nc_wacs) {
+		int which = CharOf(ch);
+		if (which > 0
+		    && which < ACS_LEN
+		    && CharOf(_nc_wacs[which]) != 0) {
+		    ci[actual].Char.UnicodeChar = CharOf(_nc_wacs[which]);
+		} else {
+		    ci[actual].Char.UnicodeChar = ' ';
+		}
+	    }
+	}
+	++actual;
+    }
+
+    loc.X = (SHORT) 0;
+    loc.Y = (SHORT) 0;
+    siz.X = (SHORT) actual;
+    siz.Y = 1;
+
+    rec.Left = (SHORT) x;
+    rec.Top = (SHORT) (y + AdjustY());
+    rec.Right = (SHORT) (x + limit - 1);
+    rec.Bottom = rec.Top;
+
+    return write_screen(CON.hdl, ci, siz, loc, &rec);
+}
+#define con_write(tcb, y, x, str, n) con_write16(tcb, y, x, str, n)
+#else
+static BOOL
+con_write8(TERMINAL_CONTROL_BLOCK * TCB, int y, int x, chtype *str, int n)
+{
+    CHAR_INFO *ci = TypeAlloca(CHAR_INFO, n);
+    COORD loc, siz;
+    SMALL_RECT rec;
+    int i;
+    chtype ch;
+    SCREEN *sp;
+
+    AssertTCB();
+    SetSP();
+
+    for (i = 0; i < n; i++) {
+	ch = str[i];
+	ci[i].Char.AsciiChar = ChCharOf(ch);
+	ci[i].Attributes = MapAttr(CON.SBI.wAttributes,
+				   ChAttrOf(ch));
+	if (ChAttrOf(ch) & A_ALTCHARSET) {
+	    if (sp->_acs_map)
+		ci[i].Char.AsciiChar =
+		ChCharOf(NCURSES_SP_NAME(_nc_acs_char) (sp, ChCharOf(ch)));
+	}
+    }
+
+    loc.X = (short) 0;
+    loc.Y = (short) 0;
+    siz.X = (short) n;
+    siz.Y = 1;
+
+    rec.Left = (short) x;
+    rec.Top = (short) y;
+    rec.Right = (short) (x + n - 1);
+    rec.Bottom = rec.Top;
+
+    return write_screen(CON.hdl, ci, siz, loc, &rec);
+}
+#define con_write(tcb, y, x, str, n) con_write8(tcb, y, x, str, n)
+#endif
+
+#if EXP_OPTIMIZE
+/*
+ * Comparing new/current screens, determine the last column-index for a change
+ * beginning on the given row,col position.  Unlike a serial terminal, there is
+ * no cost for "moving" the "cursor" on the line as we update it.
+ */
+static int
+find_end_of_change(SCREEN *sp, int row, int col)
+{
+    int result = col;
+    struct ldat *curdat = CurScreen(sp)->_line + row;
+    struct ldat *newdat = NewScreen(sp)->_line + row;
+
+    while (col <= newdat->lastchar) {
+#if USE_WIDEC_SUPPORT
+	if (isWidecExt(curdat->text[col]) || isWidecExt(newdat->text[col])) {
+	    result = col;
+	} else if (memcmp(&curdat->text[col],
+			  &newdat->text[col],
+			  sizeof(curdat->text[0]))) {
+	    result = col;
+	} else {
+	    break;
+	}
+#else
+	if (curdat->text[col] != newdat->text[col]) {
+	    result = col;
+	} else {
+	    break;
+	}
+#endif
+	++col;
+    }
+    return result;
+}
+
+/*
+ * Given a row,col position at the end of a change-chunk, look for the
+ * beginning of the next change-chunk.
+ */
+static int
+find_next_change(SCREEN *sp, int row, int col)
+{
+    struct ldat *curdat = CurScreen(sp)->_line + row;
+    struct ldat *newdat = NewScreen(sp)->_line + row;
+    int result = newdat->lastchar + 1;
+
+    while (++col <= newdat->lastchar) {
+#if USE_WIDEC_SUPPORT
+	if (isWidecExt(curdat->text[col]) != isWidecExt(newdat->text[col])) {
+	    result = col;
+	    break;
+	} else if (memcmp(&curdat->text[col],
+			  &newdat->text[col],
+			  sizeof(curdat->text[0]))) {
+	    result = col;
+	    break;
+	}
+#else
+	if (curdat->text[col] != newdat->text[col]) {
+	    result = col;
+	    break;
+	}
+#endif
+    }
+    return result;
+}
+
+#define EndChange(first) \
+	find_end_of_change(sp, y, first)
+#define NextChange(last) \
+	find_next_change(sp, y, last)
+
+#endif /* EXP_OPTIMIZE */
+
+#define MARK_NOCHANGE(win,row) \
+		win->_line[row].firstchar = _NOCHANGE; \
+		win->_line[row].lastchar  = _NOCHANGE
+
+static void
+selectActiveHandle(void)
+{
+    if (CON.lastOut != CON.hdl) {
+	CON.lastOut = CON.hdl;
+	SetConsoleActiveScreenBuffer(CON.lastOut);
+    }
+}
+
+static bool
+restore_original_screen(void)
+{
+    COORD bufferCoord;
+    bool result = FALSE;
+    SMALL_RECT save_region = CON.save_region;
+
+    T(("... restoring %s", CON.window_only ? "window" : "entire buffer"));
+
+    bufferCoord.X = (SHORT) (CON.window_only ? CON.SBI.srWindow.Left : 0);
+    bufferCoord.Y = (SHORT) (CON.window_only ? CON.SBI.srWindow.Top : 0);
+
+    if (write_screen(CON.hdl,
+		     CON.save_screen,
+		     CON.save_size,
+		     bufferCoord,
+		     &save_region)) {
+	result = TRUE;
+	mvcur(-1, -1, LINES - 2, 0);
+	T(("... restore original screen contents ok %dx%d (%d,%d - %d,%d)",
+	   CON.save_size.Y,
+	   CON.save_size.X,
+	   save_region.Top,
+	   save_region.Left,
+	   save_region.Bottom,
+	   save_region.Right));
+    } else {
+	T(("... restore original screen contents err"));
+    }
+    return result;
+}
+
+static const char *
+wcon_name(TERMINAL_CONTROL_BLOCK * TCB)
+{
+    (void) TCB;
+    return "win32console";
+}
+
+static int
+wcon_doupdate(TERMINAL_CONTROL_BLOCK * TCB)
+{
+    int result = ERR;
+    int y, nonempty, n, x0, x1, Width, Height;
+    SCREEN *sp;
+
+    T((T_CALLED("win32con::wcon_doupdate(%p)"), TCB));
+    if (okConsoleHandle(TCB)) {
+	SetSP();
+
+	Width = screen_columns(sp);
+	Height = screen_lines(sp);
+	nonempty = min(Height, NewScreen(sp)->_maxy + 1);
+
+	T(("... %dx%d clear cur:%d new:%d",
+	   Height, Width,
+	   CurScreen(sp)->_clear,
+	   NewScreen(sp)->_clear));
+
+	if (SP_PARM->_endwin == ewSuspend) {
+
+	    T(("coming back from shell mode"));
+	    NCURSES_SP_NAME(reset_prog_mode) (NCURSES_SP_ARG);
+
+	    NCURSES_SP_NAME(_nc_mvcur_resume) (NCURSES_SP_ARG);
+	    NCURSES_SP_NAME(_nc_screen_resume) (NCURSES_SP_ARG);
+	    SP_PARM->_mouse_resume(SP_PARM);
+
+	    SP_PARM->_endwin = ewRunning;
+	}
+
+	if ((CurScreen(sp)->_clear || NewScreen(sp)->_clear)) {
+	    int x;
+#if USE_WIDEC_SUPPORT
+	    cchar_t *empty = TypeAlloca(cchar_t, Width);
+	    wchar_t blank[2] =
+	    {
+		L' ', L'\0'
+	    };
+
+	    for (x = 0; x < Width; x++)
+		setcchar(&empty[x], blank, 0, 0, 0);
+#else
+	    chtype *empty = TypeAlloca(chtype, Width);
+
+	    for (x = 0; x < Width; x++)
+		empty[x] = ' ';
+#endif
+
+	    for (y = 0; y < nonempty; y++) {
+		con_write(TCB, y, 0, empty, Width);
+		memcpy(empty,
+		       CurScreen(sp)->_line[y].text,
+		       (size_t) Width * sizeof(empty[0]));
+	    }
+	    CurScreen(sp)->_clear = FALSE;
+	    NewScreen(sp)->_clear = FALSE;
+	    touchwin(NewScreen(sp));
+	    T(("... cleared %dx%d lines @%d of screen", nonempty, Width,
+	       AdjustY()));
+	}
+
+	for (y = 0; y < nonempty; y++) {
+	    x0 = NewScreen(sp)->_line[y].firstchar;
+	    if (x0 != _NOCHANGE) {
+#if EXP_OPTIMIZE
+		int x2;
+		int limit = NewScreen(sp)->_line[y].lastchar;
+		while ((x1 = EndChange(x0)) <= limit) {
+		    while ((x2 = NextChange(x1)) <= limit && x2 <= (x1 + 2)) {
+			x1 = x2;
+		    }
+		    n = x1 - x0 + 1;
+		    memcpy(&CurScreen(sp)->_line[y].text[x0],
+			   &NewScreen(sp)->_line[y].text[x0],
+			   n * sizeof(CurScreen(sp)->_line[y].text[x0]));
+		    con_write(TCB,
+			      y,
+			      x0,
+			      &CurScreen(sp)->_line[y].text[x0], n);
+		    x0 = NextChange(x1);
+		}
+
+		/* mark line changed successfully */
+		if (y <= NewScreen(sp)->_maxy) {
+		    MARK_NOCHANGE(NewScreen(sp), y);
+		}
+		if (y <= CurScreen(sp)->_maxy) {
+		    MARK_NOCHANGE(CurScreen(sp), y);
+		}
+#else
+		x1 = NewScreen(sp)->_line[y].lastchar;
+		n = x1 - x0 + 1;
+		if (n > 0) {
+		    memcpy(&CurScreen(sp)->_line[y].text[x0],
+			   &NewScreen(sp)->_line[y].text[x0],
+			   (size_t) n * sizeof(CurScreen(sp)->_line[y].text[x0]));
+		    con_write(TCB,
+			      y,
+			      x0,
+			      &CurScreen(sp)->_line[y].text[x0], n);
+
+		    /* mark line changed successfully */
+		    if (y <= NewScreen(sp)->_maxy) {
+			MARK_NOCHANGE(NewScreen(sp), y);
+		    }
+		    if (y <= CurScreen(sp)->_maxy) {
+			MARK_NOCHANGE(CurScreen(sp), y);
+		    }
+		}
+#endif
+	    }
+	}
+
+	/* put everything back in sync */
+	for (y = nonempty; y <= NewScreen(sp)->_maxy; y++) {
+	    MARK_NOCHANGE(NewScreen(sp), y);
+	}
+	for (y = nonempty; y <= CurScreen(sp)->_maxy; y++) {
+	    MARK_NOCHANGE(CurScreen(sp), y);
+	}
+
+	if (!NewScreen(sp)->_leaveok) {
+	    CurScreen(sp)->_curx = NewScreen(sp)->_curx;
+	    CurScreen(sp)->_cury = NewScreen(sp)->_cury;
+
+	    TCB->drv->td_hwcur(TCB,
+			       0, 0,
+			       CurScreen(sp)->_cury, CurScreen(sp)->_curx);
+	}
+	selectActiveHandle();
+	result = OK;
+    }
+    returnCode(result);
+}
+
+static bool
+wcon_CanHandle(TERMINAL_CONTROL_BLOCK * TCB,
+	       const char *tname,
+	       int *errret GCC_UNUSED)
+{
+    bool code = FALSE;
+
+    T((T_CALLED("win32con::wcon_CanHandle(%p)"), TCB));
+
+    assert((TCB != 0) && (tname != 0));
+
+    TCB->magic = WINMAGIC;
+
+    if (tname == 0 || *tname == 0)
+	code = TRUE;
+    else if (tname != 0 && *tname == '#') {
+	/*
+	 * Use "#" (a character which cannot begin a terminal's name) to
+	 * select specific driver from the table.
+	 *
+	 * In principle, we could have more than one non-terminfo driver,
+	 * e.g., "win32gui".
+	 */
+	size_t n = strlen(tname + 1);
+	if (n != 0
+	    && ((strncmp(tname + 1, "win32console", n) == 0)
+		|| (strncmp(tname + 1, "win32con", n) == 0))) {
+	    code = TRUE;
+	}
+    } else if (tname != 0 && stricmp(tname, "unknown") == 0) {
+	code = TRUE;
+    }
+
+    /*
+     * This is intentional, to avoid unnecessary breakage of applications
+     * using <term.h> symbols.
+     */
+    if (code && (TerminalType(&TCB->term).Booleans == 0)) {
+	_nc_init_termtype(&TerminalType(&TCB->term));
+#if NCURSES_EXT_NUMBERS
+	_nc_export_termtype2(&TCB->term.type, &TerminalType(&TCB->term));
+#endif
+    }
+
+    if (!code) {
+	if (_nc_mingw_isconsole(0))
+	    CON.isTermInfoConsole = TRUE;
+    }
+    returnBool(code);
+}
+
+static int
+wcon_dobeepflash(TERMINAL_CONTROL_BLOCK * TCB,
+		 int beepFlag)
+{
+    SCREEN *sp;
+    int res = ERR;
+
+    int high = (CON.SBI.srWindow.Bottom - CON.SBI.srWindow.Top + 1);
+    int wide = (CON.SBI.srWindow.Right - CON.SBI.srWindow.Left + 1);
+    int max_cells = (high * wide);
+    int i;
+
+    CHAR_INFO *this_screen = TypeAlloca(CHAR_INFO, max_cells);
+    CHAR_INFO *that_screen = TypeAlloca(CHAR_INFO, max_cells);
+    COORD this_size;
+    SMALL_RECT this_region;
+    COORD bufferCoord;
+
+    if (okConsoleHandle(TCB)) {
+	SetSP();
+	this_region.Top = CON.SBI.srWindow.Top;
+	this_region.Left = CON.SBI.srWindow.Left;
+	this_region.Bottom = CON.SBI.srWindow.Bottom;
+	this_region.Right = CON.SBI.srWindow.Right;
+
+	this_size.X = (SHORT) wide;
+	this_size.Y = (SHORT) high;
+
+	bufferCoord.X = this_region.Left;
+	bufferCoord.Y = this_region.Top;
+
+	if (!beepFlag &&
+	    read_screen(CON.hdl,
+			this_screen,
+			this_size,
+			bufferCoord,
+			&this_region)) {
+
+	    memcpy(that_screen,
+		   this_screen,
+		   sizeof(CHAR_INFO) * (size_t) max_cells);
+
+	    for (i = 0; i < max_cells; i++) {
+		that_screen[i].Attributes = RevAttr(that_screen[i].Attributes);
+	    }
+
+	    write_screen(CON.hdl, that_screen, this_size, bufferCoord, &this_region);
+	    Sleep(200);
+	    write_screen(CON.hdl, this_screen, this_size, bufferCoord, &this_region);
+
+	} else {
+	    MessageBeep(MB_ICONWARNING);	/* MB_OK might be better */
+	}
+	res = OK;
+    }
+    return res;
+}
+
+static int
+wcon_print(TERMINAL_CONTROL_BLOCK * TCB,
+	   char *data GCC_UNUSED,
+	   int len GCC_UNUSED)
+{
+    SCREEN *sp;
+
+    AssertTCB();
+    SetSP();
+
+    return ERR;
+}
+
+static int
+wcon_defaultcolors(TERMINAL_CONTROL_BLOCK * TCB,
+		   int fg GCC_UNUSED,
+		   int bg GCC_UNUSED)
+{
+    SCREEN *sp;
+    int code = ERR;
+
+    AssertTCB();
+    SetSP();
+
+    return (code);
+}
+
+static bool
+get_SBI(void)
+{
+    bool rc = FALSE;
+    if (GetConsoleScreenBufferInfo(CON.hdl, &(CON.SBI))) {
+	T(("GetConsoleScreenBufferInfo"));
+	T(("... buffer(X:%d Y:%d)",
+	   CON.SBI.dwSize.X,
+	   CON.SBI.dwSize.Y));
+	T(("... window(X:%d Y:%d)",
+	   CON.SBI.dwMaximumWindowSize.X,
+	   CON.SBI.dwMaximumWindowSize.Y));
+	T(("... cursor(X:%d Y:%d)",
+	   CON.SBI.dwCursorPosition.X,
+	   CON.SBI.dwCursorPosition.Y));
+	T(("... display(Top:%d Bottom:%d Left:%d Right:%d)",
+	   CON.SBI.srWindow.Top,
+	   CON.SBI.srWindow.Bottom,
+	   CON.SBI.srWindow.Left,
+	   CON.SBI.srWindow.Right));
+	if (CON.buffered) {
+	    CON.origin.X = 0;
+	    CON.origin.Y = 0;
+	} else {
+	    CON.origin.X = CON.SBI.srWindow.Left;
+	    CON.origin.Y = CON.SBI.srWindow.Top;
+	}
+	rc = TRUE;
+    } else {
+	T(("GetConsoleScreenBufferInfo ERR"));
+    }
+    return rc;
+}
+
+static void
+wcon_setcolor(TERMINAL_CONTROL_BLOCK * TCB,
+	      int fore,
+	      int color,
+	      int (*outc) (SCREEN *, int) GCC_UNUSED)
+{
+    if (okConsoleHandle(TCB)) {
+	WORD a = MapColor(fore, color);
+	a |= (WORD) ((CON.SBI.wAttributes) & (fore ? 0xfff8 : 0xff8f));
+	SetConsoleTextAttribute(CON.hdl, a);
+	get_SBI();
+    }
+}
+
+static bool
+wcon_rescol(TERMINAL_CONTROL_BLOCK * TCB)
+{
+    bool res = FALSE;
+
+    if (okConsoleHandle(TCB)) {
+	WORD a = FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN;
+	SetConsoleTextAttribute(CON.hdl, a);
+	get_SBI();
+	res = TRUE;
+    }
+    return res;
+}
+
+static bool
+wcon_rescolors(TERMINAL_CONTROL_BLOCK * TCB)
+{
+    int result = FALSE;
+    SCREEN *sp;
+
+    AssertTCB();
+    SetSP();
+
+    return result;
+}
+
+static int
+wcon_size(TERMINAL_CONTROL_BLOCK * TCB, int *Lines, int *Cols)
+{
+    int result = ERR;
+
+    T((T_CALLED("win32con::wcon_size(%p)"), TCB));
+
+    if (okConsoleHandle(TCB) &&
+	Lines != NULL &&
+	Cols != NULL) {
+	if (CON.buffered) {
+	    *Lines = (int) (CON.SBI.dwSize.Y);
+	    *Cols = (int) (CON.SBI.dwSize.X);
+	} else {
+	    *Lines = (int) (CON.SBI.srWindow.Bottom + 1 -
+			    CON.SBI.srWindow.Top);
+	    *Cols = (int) (CON.SBI.srWindow.Right + 1 -
+			   CON.SBI.srWindow.Left);
+	}
+	result = OK;
+    }
+    returnCode(result);
+}
+
+static int
+wcon_setsize(TERMINAL_CONTROL_BLOCK * TCB GCC_UNUSED,
+	     int l GCC_UNUSED,
+	     int c GCC_UNUSED)
+{
+    AssertTCB();
+    return ERR;
+}
+
+static int
+wcon_sgmode(TERMINAL_CONTROL_BLOCK * TCB, int setFlag, TTY * buf)
+{
+    DWORD dwFlag = 0;
+    tcflag_t iflag;
+    tcflag_t lflag;
+    int result = ERR;
+
+    if (buf != NULL && okConsoleHandle(TCB)) {
+
+	if (setFlag) {
+	    iflag = buf->c_iflag;
+	    lflag = buf->c_lflag;
+
+	    GetConsoleMode(CON.inp, &dwFlag);
+
+	    if (lflag & ICANON)
+		dwFlag |= ENABLE_LINE_INPUT;
+	    else
+		dwFlag &= (DWORD) (~ENABLE_LINE_INPUT);
+
+	    if (lflag & ECHO)
+		dwFlag |= ENABLE_ECHO_INPUT;
+	    else
+		dwFlag &= (DWORD) (~ENABLE_ECHO_INPUT);
+
+	    if (iflag & BRKINT)
+		dwFlag |= ENABLE_PROCESSED_INPUT;
+	    else
+		dwFlag &= (DWORD) (~ENABLE_PROCESSED_INPUT);
+
+	    dwFlag |= ENABLE_MOUSE_INPUT;
+
+	    buf->c_iflag = iflag;
+	    buf->c_lflag = lflag;
+	    SetConsoleMode(CON.inp, dwFlag);
+	    TCB->term.Nttyb = *buf;
+	} else {
+	    iflag = TCB->term.Nttyb.c_iflag;
+	    lflag = TCB->term.Nttyb.c_lflag;
+	    GetConsoleMode(CON.inp, &dwFlag);
+
+	    if (dwFlag & ENABLE_LINE_INPUT)
+		lflag |= ICANON;
+	    else
+		lflag &= (tcflag_t) (~ICANON);
+
+	    if (dwFlag & ENABLE_ECHO_INPUT)
+		lflag |= ECHO;
+	    else
+		lflag &= (tcflag_t) (~ECHO);
+
+	    if (dwFlag & ENABLE_PROCESSED_INPUT)
+		iflag |= BRKINT;
+	    else
+		iflag &= (tcflag_t) (~BRKINT);
+
+	    TCB->term.Nttyb.c_iflag = iflag;
+	    TCB->term.Nttyb.c_lflag = lflag;
+
+	    *buf = TCB->term.Nttyb;
+	}
+	result = OK;
+    }
+    return result;
+}
+
+#define MIN_WIDE 80
+#define MIN_HIGH 24
+
+/*
+ * In "normal" mode, reset the buffer- and window-sizes back to their original values.
+ */
+static void
+set_scrollback(bool normal, CONSOLE_SCREEN_BUFFER_INFO * info)
+{
+    SMALL_RECT rect;
+    COORD coord;
+    bool changed = FALSE;
+
+    T((T_CALLED("win32con::set_scrollback(%s)"),
+       (normal
+	? "normal"
+	: "application")));
+
+    T(("... SBI.srWindow %d,%d .. %d,%d",
+       info->srWindow.Top,
+       info->srWindow.Left,
+       info->srWindow.Bottom,
+       info->srWindow.Right));
+    T(("... SBI.dwSize %dx%d",
+       info->dwSize.Y,
+       info->dwSize.X));
+
+    if (normal) {
+	rect = info->srWindow;
+	coord = info->dwSize;
+	if (memcmp(info, &CON.SBI, sizeof(*info)) != 0) {
+	    changed = TRUE;
+	    CON.SBI = *info;
+	}
+    } else {
+	int high = info->srWindow.Bottom - info->srWindow.Top + 1;
+	int wide = info->srWindow.Right - info->srWindow.Left + 1;
+
+	if (high < MIN_HIGH) {
+	    T(("... height %d < %d", high, MIN_HIGH));
+	    high = MIN_HIGH;
+	    changed = TRUE;
+	}
+	if (wide < MIN_WIDE) {
+	    T(("... width %d < %d", wide, MIN_WIDE));
+	    wide = MIN_WIDE;
+	    changed = TRUE;
+	}
+
+	rect.Left =
+	    rect.Top = 0;
+	rect.Right = (SHORT) (wide - 1);
+	rect.Bottom = (SHORT) (high - 1);
+
+	coord.X = (SHORT) wide;
+	coord.Y = (SHORT) high;
+
+	if (info->dwSize.Y != high ||
+	    info->dwSize.X != wide ||
+	    info->srWindow.Top != 0 ||
+	    info->srWindow.Left != 0) {
+	    changed = TRUE;
+	}
+
+    }
+
+    if (changed) {
+	T(("... coord %d,%d", coord.Y, coord.X));
+	T(("... rect %d,%d - %d,%d",
+	   rect.Top, rect.Left,
+	   rect.Bottom, rect.Right));
+	SetConsoleScreenBufferSize(CON.hdl, coord);	/* dwSize */
+	SetConsoleWindowInfo(CON.hdl, TRUE, &rect);	/* srWindow */
+	get_SBI();
+    }
+    returnVoid;
+}
+
+static int
+wcon_mode(TERMINAL_CONTROL_BLOCK * TCB, int progFlag, int defFlag)
+{
+    SCREEN *sp;
+    TERMINAL *_term = (TERMINAL *) TCB;
+    int code = ERR;
+
+    if (okConsoleHandle(TCB)) {
+	sp = TCB->csp;
+
+	T((T_CALLED("win32con::wcon_mode(%p, prog=%d, def=%d)"),
+	   TCB, progFlag, defFlag));
+
+	CON.progMode = progFlag;
+	CON.lastOut = progFlag ? CON.hdl : CON.out;
+	SetConsoleActiveScreenBuffer(CON.lastOut);
+
+	if (progFlag) /* prog mode */  {
+	    if (defFlag) {
+		if ((wcon_sgmode(TCB, FALSE, &(_term->Nttyb)) == OK)) {
+		    _term->Nttyb.c_oflag &= (tcflag_t) (~OFLAGS_TABS);
+		    code = OK;
+		}
+	    } else {
+		/* reset_prog_mode */
+		if (wcon_sgmode(TCB, TRUE, &(_term->Nttyb)) == OK) {
+		    if (sp) {
+			if (sp->_keypad_on)
+			    _nc_keypad(sp, TRUE);
+		    }
+		    if (!CON.buffered) {
+			set_scrollback(FALSE, &CON.SBI);
+		    }
+		    code = OK;
+		}
+	    }
+	    T(("... buffered:%d, clear:%d", CON.buffered, CurScreen(sp)->_clear));
+	} else {		/* shell mode */
+	    if (defFlag) {
+		/* def_shell_mode */
+		if (wcon_sgmode(TCB, FALSE, &(_term->Ottyb)) == OK) {
+		    code = OK;
+		}
+	    } else {
+		/* reset_shell_mode */
+		if (sp) {
+		    _nc_keypad(sp, FALSE);
+		    NCURSES_SP_NAME(_nc_flush) (sp);
+		}
+		code = wcon_sgmode(TCB, TRUE, &(_term->Ottyb));
+		if (!CON.buffered) {
+		    set_scrollback(TRUE, &CON.save_SBI);
+		    if (!restore_original_screen())
+			code = ERR;
+		}
+		SetConsoleCursorInfo(CON.hdl, &CON.save_CI);
+	    }
+	}
+
+    }
+    returnCode(code);
+}
+
+static void
+wcon_screen_init(SCREEN *sp GCC_UNUSED)
+{
+}
+
+static void
+wcon_wrap(SCREEN *sp GCC_UNUSED)
+{
+}
+
+static int
+rkeycompare(const void *el1, const void *el2)
+{
+    WORD key1 = (LOWORD((*((const LONG *) el1)))) & 0x7fff;
+    WORD key2 = (LOWORD((*((const LONG *) el2)))) & 0x7fff;
+
+    return ((key1 < key2) ? -1 : ((key1 == key2) ? 0 : 1));
+}
+
+static int
+keycompare(const void *el1, const void *el2)
+{
+    WORD key1 = HIWORD((*((const LONG *) el1)));
+    WORD key2 = HIWORD((*((const LONG *) el2)));
+
+    return ((key1 < key2) ? -1 : ((key1 == key2) ? 0 : 1));
+}
+
+static int
+MapKey(WORD vKey)
+{
+    WORD nKey = 0;
+    void *res;
+    LONG key = GenMap(vKey, 0);
+    int code = -1;
+
+    res = bsearch(&key,
+		  CON.map,
+		  (size_t) (N_INI + FKEYS),
+		  sizeof(keylist[0]),
+		  keycompare);
+    if (res) {
+	key = *((LONG *) res);
+	nKey = LOWORD(key);
+	code = (int) (nKey & 0x7fff);
+	if (nKey & 0x8000)
+	    code = -code;
+    }
+    return code;
+}
+
+static int
+AnsiKey(WORD vKey)
+{
+    WORD nKey = 0;
+    void *res;
+    LONG key = GenMap(vKey, 0);
+    int code = -1;
+
+    res = bsearch(&key,
+		  CON.ansi_map,
+		  (size_t) (N_INI + FKEYS),
+		  sizeof(keylist[0]),
+		  keycompare);
+    if (res) {
+	key = *((LONG *) res);
+	nKey = LOWORD(key);
+	code = (int) (nKey & 0x7fff);
+	if (nKey & 0x8000)
+	    code = -code;
+    }
+    return code;
+}
+
+static void
+wcon_release(TERMINAL_CONTROL_BLOCK * TCB)
+{
+    T((T_CALLED("win32con::wcon_release(%p)"), TCB));
+
+    AssertTCB();
+    if (TCB->prop)
+	free(TCB->prop);
+
+    returnVoid;
+}
+
+static bool
+read_screen_data(void)
+{
+    bool result = FALSE;
+    COORD bufferCoord;
+    size_t want;
+
+    CON.save_size.X = (SHORT) (CON.save_region.Right
+			       - CON.save_region.Left + 1);
+    CON.save_size.Y = (SHORT) (CON.save_region.Bottom
+			       - CON.save_region.Top + 1);
+
+    want = (size_t) (CON.save_size.X * CON.save_size.Y);
+
+    if ((CON.save_screen = malloc(want * sizeof(CHAR_INFO))) != 0) {
+	bufferCoord.X = (SHORT) (CON.window_only ? CON.SBI.srWindow.Left : 0);
+	bufferCoord.Y = (SHORT) (CON.window_only ? CON.SBI.srWindow.Top : 0);
+
+	T(("... reading console %s %dx%d into %d,%d - %d,%d at %d,%d",
+	   CON.window_only ? "window" : "buffer",
+	   CON.save_size.Y, CON.save_size.X,
+	   CON.save_region.Top,
+	   CON.save_region.Left,
+	   CON.save_region.Bottom,
+	   CON.save_region.Right,
+	   bufferCoord.Y,
+	   bufferCoord.X));
+
+	if (read_screen(CON.hdl,
+			CON.save_screen,
+			CON.save_size,
+			bufferCoord,
+			&CON.save_region)) {
+	    result = TRUE;
+	} else {
+	    T((" error %#lx", (unsigned long) GetLastError()));
+	    FreeAndNull(CON.save_screen);
+	}
+    }
+
+    return result;
+}
+
+/*
+ * Attempt to save the screen contents.  PDCurses does this if
+ * PDC_RESTORE_SCREEN is set, giving the same visual appearance on
+ * restoration as if the library had allocated a console buffer.  MSDN
+ * says that the data which can be read is limited to 64Kb (and may be
+ * less).
+ */
+static bool
+save_original_screen(void)
+{
+    bool result = FALSE;
+
+    CON.save_region.Top = 0;
+    CON.save_region.Left = 0;
+    CON.save_region.Bottom = (SHORT) (CON.SBI.dwSize.Y - 1);
+    CON.save_region.Right = (SHORT) (CON.SBI.dwSize.X - 1);
+
+    if (read_screen_data()) {
+	result = TRUE;
+    } else {
+
+	CON.save_region.Top = CON.SBI.srWindow.Top;
+	CON.save_region.Left = CON.SBI.srWindow.Left;
+	CON.save_region.Bottom = CON.SBI.srWindow.Bottom;
+	CON.save_region.Right = CON.SBI.srWindow.Right;
+
+	CON.window_only = TRUE;
+
+	if (read_screen_data()) {
+	    result = TRUE;
+	}
+    }
+
+    T(("... save original screen contents %s", result ? "ok" : "err"));
+    return result;
+}
+
+static void
+wcon_init(TERMINAL_CONTROL_BLOCK * TCB)
+{
+    T((T_CALLED("win32con::wcon_init(%p)"), TCB));
+
+    AssertTCB();
+
+    if (TCB) {
+	if (!InitConsole()) {
+	    returnVoid;
+	}
+
+	TCB->info.initcolor = TRUE;
+	TCB->info.canchange = FALSE;
+	TCB->info.hascolor = TRUE;
+	TCB->info.caninit = TRUE;
+
+	TCB->info.maxpairs = NUMPAIRS;
+	TCB->info.maxcolors = 8;
+	TCB->info.numlabels = 0;
+	TCB->info.labelwidth = 0;
+	TCB->info.labelheight = 0;
+	TCB->info.nocolorvideo = 1;
+	TCB->info.tabsize = 8;
+
+	TCB->info.numbuttons = CON.numButtons;
+	TCB->info.defaultPalette = _nc_cga_palette;
+
+    }
+    returnVoid;
+}
+
+static void
+wcon_initpair(TERMINAL_CONTROL_BLOCK * TCB,
+	      int pair,
+	      int f,
+	      int b)
+{
+    SCREEN *sp;
+
+    if (okConsoleHandle(TCB)) {
+	SetSP();
+
+	if ((pair > 0) && (pair < NUMPAIRS) && (f >= 0) && (f < 8)
+	    && (b >= 0) && (b < 8)) {
+	    CON.pairs[pair] = MapColor(true, f) | MapColor(false, b);
+	}
+    }
+}
+
+static void
+wcon_initcolor(TERMINAL_CONTROL_BLOCK * TCB,
+	       int color GCC_UNUSED,
+	       int r GCC_UNUSED,
+	       int g GCC_UNUSED,
+	       int b GCC_UNUSED)
+{
+    SCREEN *sp;
+
+    AssertTCB();
+    SetSP();
+}
+
+static void
+wcon_do_color(TERMINAL_CONTROL_BLOCK * TCB,
+	      int old_pair GCC_UNUSED,
+	      int pair GCC_UNUSED,
+	      int reverse GCC_UNUSED,
+	      int (*outc) (SCREEN *, int) GCC_UNUSED
+)
+{
+    SCREEN *sp;
+
+    AssertTCB();
+    SetSP();
+}
+
+static void
+wcon_initmouse(TERMINAL_CONTROL_BLOCK * TCB)
+{
+    SCREEN *sp;
+
+    if (okConsoleHandle(TCB)) {
+	SetSP();
+
+	sp->_mouse_type = M_TERM_DRIVER;
+    }
+}
+
+static int
+wcon_testmouse(TERMINAL_CONTROL_BLOCK * TCB,
+	       int delay
+	       EVENTLIST_2nd(_nc_eventlist * evl))
+{
+    int rc = 0;
+    SCREEN *sp;
+
+    if (okConsoleHandle(TCB)) {
+	SetSP();
+
+	if (sp->_drv_mouse_head < sp->_drv_mouse_tail) {
+	    rc = TW_MOUSE;
+	} else {
+	    rc = TCBOf(sp)->drv->td_twait(TCBOf(sp),
+					  TWAIT_MASK,
+					  delay,
+					  (int *) 0
+					  EVENTLIST_2nd(evl));
+	}
+    }
+
+    return rc;
+}
+
+static int
+wcon_mvcur(TERMINAL_CONTROL_BLOCK * TCB,
+	   int yold GCC_UNUSED, int xold GCC_UNUSED,
+	   int y, int x)
+{
+    int ret = ERR;
+    if (okConsoleHandle(TCB)) {
+	COORD loc;
+	loc.X = (short) x;
+	loc.Y = (short) (y + AdjustY());
+	SetConsoleCursorPosition(CON.hdl, loc);
+	ret = OK;
+    }
+    return ret;
+}
+
+static void
+wcon_hwlabel(TERMINAL_CONTROL_BLOCK * TCB,
+	     int labnum GCC_UNUSED,
+	     char *text GCC_UNUSED)
+{
+    SCREEN *sp;
+
+    AssertTCB();
+    SetSP();
+}
+
+static void
+wcon_hwlabelOnOff(TERMINAL_CONTROL_BLOCK * TCB,
+		  int OnFlag GCC_UNUSED)
+{
+    SCREEN *sp;
+
+    AssertTCB();
+    SetSP();
+}
+
+static chtype
+wcon_conattr(TERMINAL_CONTROL_BLOCK * TCB GCC_UNUSED)
+{
+    chtype res = A_NORMAL;
+    res |= (A_BOLD | A_DIM | A_REVERSE | A_STANDOUT | A_COLOR);
+    return res;
+}
+
+static void
+wcon_setfilter(TERMINAL_CONTROL_BLOCK * TCB)
+{
+    SCREEN *sp;
+
+    AssertTCB();
+    SetSP();
+}
+
+static void
+wcon_initacs(TERMINAL_CONTROL_BLOCK * TCB,
+	     chtype *real_map GCC_UNUSED,
+	     chtype *fake_map GCC_UNUSED)
+{
+#define DATA(a,b) { a, b }
+    static struct {
+	int acs_code;
+	int use_code;
+    } table[] = {
+	DATA('a', 0xb1),	/* ACS_CKBOARD  */
+	    DATA('f', 0xf8),	/* ACS_DEGREE   */
+	    DATA('g', 0xf1),	/* ACS_PLMINUS  */
+	    DATA('j', 0xd9),	/* ACS_LRCORNER */
+	    DATA('l', 0xda),	/* ACS_ULCORNER */
+	    DATA('k', 0xbf),	/* ACS_URCORNER */
+	    DATA('m', 0xc0),	/* ACS_LLCORNER */
+	    DATA('n', 0xc5),	/* ACS_PLUS     */
+	    DATA('q', 0xc4),	/* ACS_HLINE    */
+	    DATA('t', 0xc3),	/* ACS_LTEE     */
+	    DATA('u', 0xb4),	/* ACS_RTEE     */
+	    DATA('v', 0xc1),	/* ACS_BTEE     */
+	    DATA('w', 0xc2),	/* ACS_TTEE     */
+	    DATA('x', 0xb3),	/* ACS_VLINE    */
+	    DATA('y', 0xf3),	/* ACS_LEQUAL   */
+	    DATA('z', 0xf2),	/* ACS_GEQUAL   */
+	    DATA('0', 0xdb),	/* ACS_BLOCK    */
+	    DATA('{', 0xe3),	/* ACS_PI       */
+	    DATA('}', 0x9c),	/* ACS_STERLING */
+	    DATA(',', 0xae),	/* ACS_LARROW   */
+	    DATA('+', 0xaf),	/* ACS_RARROW   */
+	    DATA('~', 0xf9),	/* ACS_BULLET   */
+    };
+#undef DATA
+    unsigned n;
+
+    SCREEN *sp;
+    if (okConsoleHandle(TCB)) {
+	SetSP();
+
+	for (n = 0; n < SIZEOF(table); ++n) {
+	    real_map[table[n].acs_code] = (chtype) table[n].use_code | A_ALTCHARSET;
+	    if (sp != 0)
+		sp->_screen_acs_map[table[n].acs_code] = TRUE;
+	}
+    }
+}
+
+static ULONGLONG
+tdiff(FILETIME fstart, FILETIME fend)
+{
+    ULARGE_INTEGER ustart;
+    ULARGE_INTEGER uend;
+    ULONGLONG diff;
+
+    ustart.LowPart = fstart.dwLowDateTime;
+    ustart.HighPart = fstart.dwHighDateTime;
+    uend.LowPart = fend.dwLowDateTime;
+    uend.HighPart = fend.dwHighDateTime;
+
+    diff = (uend.QuadPart - ustart.QuadPart) / 10000;
+    return diff;
+}
+
+static int
+Adjust(int milliseconds, int diff)
+{
+    if (milliseconds != INFINITY) {
+	milliseconds -= diff;
+	if (milliseconds < 0)
+	    milliseconds = 0;
+    }
+    return milliseconds;
+}
+
+#define BUTTON_MASK (FROM_LEFT_1ST_BUTTON_PRESSED | \
+		     FROM_LEFT_2ND_BUTTON_PRESSED | \
+		     FROM_LEFT_3RD_BUTTON_PRESSED | \
+		     FROM_LEFT_4TH_BUTTON_PRESSED | \
+		     RIGHTMOST_BUTTON_PRESSED)
+
+static int
+decode_mouse(SCREEN *sp, int mask)
+{
+    int result = 0;
+
+    (void) sp;
+    assert(sp && console_initialized);
+
+    if (mask & FROM_LEFT_1ST_BUTTON_PRESSED)
+	result |= BUTTON1_PRESSED;
+    if (mask & FROM_LEFT_2ND_BUTTON_PRESSED)
+	result |= BUTTON2_PRESSED;
+    if (mask & FROM_LEFT_3RD_BUTTON_PRESSED)
+	result |= BUTTON3_PRESSED;
+    if (mask & FROM_LEFT_4TH_BUTTON_PRESSED)
+	result |= BUTTON4_PRESSED;
+
+    if (mask & RIGHTMOST_BUTTON_PRESSED) {
+	switch (CON.numButtons) {
+	case 1:
+	    result |= BUTTON1_PRESSED;
+	    break;
+	case 2:
+	    result |= BUTTON2_PRESSED;
+	    break;
+	case 3:
+	    result |= BUTTON3_PRESSED;
+	    break;
+	case 4:
+	    result |= BUTTON4_PRESSED;
+	    break;
+	}
+    }
+
+    return result;
+}
+
+static int
+console_twait(
+		 SCREEN *sp,
+		 HANDLE fd,
+		 int mode,
+		 int milliseconds,
+		 int *timeleft
+		 EVENTLIST_2nd(_nc_eventlist * evl))
+{
+    INPUT_RECORD inp_rec;
+    BOOL b;
+    DWORD nRead = 0, rc = (DWORD) (-1);
+    int code = 0;
+    FILETIME fstart;
+    FILETIME fend;
+    int diff;
+    bool isImmed = (milliseconds == 0);
+
+#ifdef NCURSES_WGETCH_EVENTS
+    (void) evl;			/* TODO: implement wgetch-events */
+#endif
+
+#define CONSUME() ReadConsoleInput(fd,&inp_rec,1,&nRead)
+
+    assert(sp);
+
+    TR(TRACE_IEVENT, ("start twait: %d milliseconds, mode: %d",
+		      milliseconds, mode));
+
+    if (milliseconds < 0)
+	milliseconds = INFINITY;
+
+    memset(&inp_rec, 0, sizeof(inp_rec));
+
+    while (true) {
+	GetSystemTimeAsFileTime(&fstart);
+	rc = WaitForSingleObject(fd, (DWORD) milliseconds);
+	GetSystemTimeAsFileTime(&fend);
+	diff = (int) tdiff(fstart, fend);
+	milliseconds = Adjust(milliseconds, diff);
+
+	if (!isImmed && milliseconds <= 0)
+	    break;
+
+	if (rc == WAIT_OBJECT_0) {
+	    if (mode) {
+		b = GetNumberOfConsoleInputEvents(fd, &nRead);
+		if (b && nRead > 0) {
+		    b = PeekConsoleInput(fd, &inp_rec, 1, &nRead);
+		    if (b && nRead > 0) {
+			switch (inp_rec.EventType) {
+			case KEY_EVENT:
+			    if (mode & TW_INPUT) {
+				WORD vk = inp_rec.Event.KeyEvent.wVirtualKeyCode;
+				char ch = inp_rec.Event.KeyEvent.uChar.AsciiChar;
+
+				if (inp_rec.Event.KeyEvent.bKeyDown) {
+				    if (0 == ch) {
+					int nKey = MapKey(vk);
+					if (nKey < 0) {
+					    CONSUME();
+					    continue;
+					}
+				    }
+				    code = TW_INPUT;
+				    goto end;
+				} else {
+				    CONSUME();
+				}
+			    }
+			    continue;
+			case MOUSE_EVENT:
+			    if (decode_mouse(sp,
+					     (inp_rec.Event.MouseEvent.dwButtonState
+					      & BUTTON_MASK)) == 0) {
+				CONSUME();
+			    } else if (mode & TW_MOUSE) {
+				code = TW_MOUSE;
+				goto end;
+			    }
+			    continue;
+			    /* e.g., FOCUS_EVENT */
+			default:
+			    CONSUME();
+			    selectActiveHandle();
+			    continue;
+			}
+		    }
+		}
+	    }
+	    continue;
+	} else {
+	    if (rc != WAIT_TIMEOUT) {
+		code = -1;
+		break;
+	    } else {
+		code = 0;
+		break;
+	    }
+	}
+    }
+  end:
+
+    TR(TRACE_IEVENT, ("end twait: returned %d (%d), remaining time %d msec",
+		      code, errno, milliseconds));
+
+    if (timeleft)
+	*timeleft = milliseconds;
+
+    return code;
+}
+
+static int
+wcon_twait(TERMINAL_CONTROL_BLOCK * TCB,
+	   int mode,
+	   int milliseconds,
+	   int *timeleft
+	   EVENTLIST_2nd(_nc_eventlist * evl))
+{
+    SCREEN *sp;
+    int code = 0;
+
+    if (okConsoleHandle(TCB)) {
+	SetSP();
+
+	code = console_twait(sp,
+			     CON.inp,
+			     mode,
+			     milliseconds,
+			     timeleft EVENTLIST_2nd(evl));
+    }
+    return code;
+}
+
+static bool
+handle_mouse(SCREEN *sp, MOUSE_EVENT_RECORD mer)
+{
+    MEVENT work;
+    bool result = FALSE;
+
+    assert(sp);
+
+    sp->_drv_mouse_old_buttons = sp->_drv_mouse_new_buttons;
+    sp->_drv_mouse_new_buttons = mer.dwButtonState & BUTTON_MASK;
+
+    /*
+     * We're only interested if the button is pressed or released.
+     * FIXME: implement continuous event-tracking.
+     */
+    if (sp->_drv_mouse_new_buttons != sp->_drv_mouse_old_buttons) {
+
+	memset(&work, 0, sizeof(work));
+
+	if (sp->_drv_mouse_new_buttons) {
+
+	    work.bstate |= (mmask_t) decode_mouse(sp, sp->_drv_mouse_new_buttons);
+
+	} else {
+
+	    /* cf: BUTTON_PRESSED, BUTTON_RELEASED */
+	    work.bstate |= (mmask_t) (decode_mouse(sp,
+						   sp->_drv_mouse_old_buttons)
+				      >> 1);
+
+	    result = TRUE;
+	}
+
+	work.x = mer.dwMousePosition.X;
+	work.y = mer.dwMousePosition.Y - AdjustY();
+
+	sp->_drv_mouse_fifo[sp->_drv_mouse_tail] = work;
+	sp->_drv_mouse_tail += 1;
+    }
+
+    return result;
+}
+
+static int
+wcon_read(TERMINAL_CONTROL_BLOCK * TCB, int *buf)
+{
+    SCREEN *sp;
+    int n = -1;
+
+    T((T_CALLED("win32con::wcon_read(%p)"), TCB));
+
+    assert(buf);
+    if (okConsoleHandle(TCB)) {
+	SetSP();
+
+	n = _nc_mingw_console_read(sp, CON.inp, buf);
+    }
+    returnCode(n);
+}
+
+static int
+wcon_nap(TERMINAL_CONTROL_BLOCK * TCB GCC_UNUSED, int ms)
+{
+    T((T_CALLED("win32con::wcon_nap(%p, %d)"), TCB, ms));
+    Sleep((DWORD) ms);
+    returnCode(OK);
+}
+
+static int
+wcon_cursorSet(TERMINAL_CONTROL_BLOCK * TCB GCC_UNUSED, int mode)
+{
+    int res = -1;
+
+    T((T_CALLED("win32con:wcon_cursorSet(%d)"), mode));
+    if (okConsoleHandle(TCB)) {
+	CONSOLE_CURSOR_INFO this_CI = CON.save_CI;
+	switch (mode) {
+	case 0:
+	    this_CI.bVisible = FALSE;
+	    break;
+	case 1:
+	    break;
+	case 2:
+	    this_CI.dwSize = 100;
+	    break;
+	}
+	SetConsoleCursorInfo(CON.hdl, &this_CI);
+    }
+    returnCode(res);
+}
+
+static bool
+wcon_kyExist(TERMINAL_CONTROL_BLOCK * TCB GCC_UNUSED, int keycode)
+{
+    WORD nKey;
+    void *res;
+    bool found = FALSE;
+    LONG key = GenMap(0, (WORD) keycode);
+
+    T((T_CALLED("win32con::wcon_kyExist(%d)"), keycode));
+    res = bsearch(&key,
+		  CON.rmap,
+		  (size_t) (N_INI + FKEYS),
+		  sizeof(keylist[0]),
+		  rkeycompare);
+    if (res) {
+	key = *((LONG *) res);
+	nKey = LOWORD(key);
+	if (!(nKey & 0x8000))
+	    found = TRUE;
+    }
+    returnCode(found);
+}
+
+static int
+wcon_kpad(TERMINAL_CONTROL_BLOCK * TCB, int flag GCC_UNUSED)
+{
+    SCREEN *sp;
+    int code = ERR;
+
+    T((T_CALLED("win32con::wcon_kpad(%p, %d)"), TCB, flag));
+
+    if (okConsoleHandle(TCB)) {
+	SetSP();
+
+	if (sp) {
+	    code = OK;
+	}
+    }
+    returnCode(code);
+}
+
+static int
+wcon_keyok(TERMINAL_CONTROL_BLOCK * TCB,
+	   int keycode,
+	   int flag)
+{
+    int code = ERR;
+    SCREEN *sp;
+    WORD nKey;
+    WORD vKey;
+    void *res;
+    LONG key = GenMap(0, (WORD) keycode);
+
+    T((T_CALLED("win32con::wcon_keyok(%p, %d, %d)"), TCB, keycode, flag));
+
+    if (okConsoleHandle(TCB)) {
+	SetSP();
+
+	if (sp) {
+	    res = bsearch(&key,
+			  CON.rmap,
+			  (size_t) (N_INI + FKEYS),
+			  sizeof(keylist[0]),
+			  rkeycompare);
+	    if (res) {
+		key = *((LONG *) res);
+		vKey = HIWORD(key);
+		nKey = (LOWORD(key)) & 0x7fff;
+		if (!flag)
+		    nKey |= 0x8000;
+		*(LONG *) res = GenMap(vKey, nKey);
+	    }
+	}
+    }
+    returnCode(code);
+}
+
+NCURSES_EXPORT_VAR (TERM_DRIVER) _nc_WIN_DRIVER = {
+    FALSE,
+	wcon_name,		/* Name */
+	wcon_CanHandle,		/* CanHandle */
+	wcon_init,		/* init */
+	wcon_release,		/* release */
+	wcon_size,		/* size */
+	wcon_sgmode,		/* sgmode */
+	wcon_conattr,		/* conattr */
+	wcon_mvcur,		/* hwcur */
+	wcon_mode,		/* mode */
+	wcon_rescol,		/* rescol */
+	wcon_rescolors,		/* rescolors */
+	wcon_setcolor,		/* color */
+	wcon_dobeepflash,	/* DoBeepFlash */
+	wcon_initpair,		/* initpair */
+	wcon_initcolor,		/* initcolor */
+	wcon_do_color,		/* docolor */
+	wcon_initmouse,		/* initmouse */
+	wcon_testmouse,		/* testmouse */
+	wcon_setfilter,		/* setfilter */
+	wcon_hwlabel,		/* hwlabel */
+	wcon_hwlabelOnOff,	/* hwlabelOnOff */
+	wcon_doupdate,		/* update */
+	wcon_defaultcolors,	/* defaultcolors */
+	wcon_print,		/* print */
+	wcon_size,		/* getsize */
+	wcon_setsize,		/* setsize */
+	wcon_initacs,		/* initacs */
+	wcon_screen_init,	/* scinit */
+	wcon_wrap,		/* scexit */
+	wcon_twait,		/* twait */
+	wcon_read,		/* read */
+	wcon_nap,		/* nap */
+	wcon_kpad,		/* kpad */
+	wcon_keyok,		/* kyOk */
+	wcon_kyExist,		/* kyExist */
+	wcon_cursorSet		/* cursorSet */
+};
+
+/* --------------------------------------------------------- */
+
+static HANDLE
+get_handle(int fd)
+{
+    intptr_t value = _get_osfhandle(fd);
+    return (HANDLE) value;
+}
+
+#if WINVER >= 0x0600
+/*   This function tests, whether or not the ncurses application
+     is running as a descendant of MSYS2/cygwin mintty terminal
+     application. mintty doesn't use Windows Console for its screen
+     I/O, so the native Windows _isatty doesn't recognize it as
+     character device. But we can discover we are at the end of an
+     Pipe and can query to server side of the pipe, looking whether
+     or not this is mintty.
+ */
+static int
+_ismintty(int fd, LPHANDLE pMinTTY)
+{
+    HANDLE handle = get_handle(fd);
+    DWORD dw;
+    int code = 0;
+
+    T((T_CALLED("win32con::_ismintty(%d, %p)"), fd, pMinTTY));
+
+    if (handle != INVALID_HANDLE_VALUE) {
+	dw = GetFileType(handle);
+	if (dw == FILE_TYPE_PIPE) {
+	    if (GetNamedPipeInfo(handle, 0, 0, 0, 0)) {
+		ULONG pPid;
+		/* Requires NT6 */
+		if (GetNamedPipeServerProcessId(handle, &pPid)) {
+		    TCHAR buf[MAX_PATH];
+		    DWORD len = 0;
+		    /* These security attributes may allow us to
+		       create a remote thread in mintty to manipulate
+		       the terminal state remotely */
+		    HANDLE pHandle = OpenProcess(
+						    PROCESS_CREATE_THREAD
+						    | PROCESS_QUERY_INFORMATION
+						    | PROCESS_VM_OPERATION
+						    | PROCESS_VM_WRITE
+						    | PROCESS_VM_READ,
+						    FALSE,
+						    pPid);
+		    if (pMinTTY)
+			*pMinTTY = INVALID_HANDLE_VALUE;
+		    if (pHandle != INVALID_HANDLE_VALUE) {
+			if ((len = GetProcessImageFileName(
+							      pHandle,
+							      buf,
+							      (DWORD)
+							      array_length(buf)))) {
+			    TCHAR *pos = _tcsrchr(buf, _T('\\'));
+			    if (pos) {
+				pos++;
+				if (_tcsnicmp(pos, _TEXT("mintty.exe"), 10)
+				    == 0) {
+				    if (pMinTTY)
+					*pMinTTY = pHandle;
+				    code = 1;
+				}
+			    }
+			}
+		    }
+		}
+	    }
+	}
+    }
+    returnCode(code);
+}
+#endif
+
+/*   Borrowed from ansicon project.
+     Check whether or not an I/O handle is associated with
+     a Windows console.
+*/
+static BOOL
+IsConsoleHandle(HANDLE hdl)
+{
+    DWORD dwFlag = 0;
+    BOOL result;
+
+    if (!GetConsoleMode(hdl, &dwFlag)) {
+	result = (int) WriteConsoleA(hdl, NULL, 0, &dwFlag, NULL);
+    } else {
+	result = (int) (dwFlag & ENABLE_PROCESSED_OUTPUT);
+    }
+    return result;
+}
+
+/*   Our replacement for the systems _isatty to include also
+     a test for mintty. This is called from the NC_ISATTY macro
+     defined in curses.priv.h
+ */
+int
+_nc_mingw_isatty(int fd)
+{
+    int result = 0;
+
+#ifdef __MING32__
+#define SysISATTY(fd) _isatty(fd)
+#else
+#define SysISATTY(fd) isatty(fd)
+#endif
+    if (SysISATTY(fd)) {
+	result = 1;
+    } else {
+#if WINVER >= 0x0600
+	result = _ismintty(fd, NULL);
+#endif
+    }
+    return result;
+}
+
+/*   This is used when running in terminfo mode to discover,
+     whether or not the "terminal" is actually a Windows
+     Console. It is the responsibility of the console to deal
+     with the terminal escape sequences that are sent by
+     terminfo.
+ */
+int
+_nc_mingw_isconsole(int fd)
+{
+    HANDLE hdl = get_handle(fd);
+    int code = 0;
+
+    T((T_CALLED("win32con::_nc_mingw_isconsole(%d)"), fd));
+
+    code = (int) IsConsoleHandle(hdl);
+
+    returnCode(code);
+}
+
+#define TC_PROLOGUE(fd) \
+    SCREEN *sp;                                               \
+    TERMINAL *term = 0;                                       \
+    int code = ERR;                                           \
+    if (_nc_screen_chain == 0)                                \
+        return 0;                                             \
+    for (each_screen(sp)) {                                   \
+        if (sp->_term && (sp->_term->Filedes == fd)) {        \
+            term = sp->_term;                                 \
+            break;                                            \
+        }                                                     \
+    }                                                         \
+    assert(term != 0)
+
+int
+_nc_mingw_tcsetattr(
+		       int fd,
+		       int optional_action GCC_UNUSED,
+		       const struct termios *arg)
+{
+    TC_PROLOGUE(fd);
+
+    if (_nc_mingw_isconsole(fd)) {
+	DWORD dwFlag = 0;
+	HANDLE ofd = get_handle(fd);
+	if (ofd != INVALID_HANDLE_VALUE) {
+	    if (arg) {
+		if (arg->c_lflag & ICANON)
+		    dwFlag |= ENABLE_LINE_INPUT;
+		else
+		    dwFlag = dwFlag & (DWORD) (~ENABLE_LINE_INPUT);
+
+		if (arg->c_lflag & ECHO)
+		    dwFlag = dwFlag | ENABLE_ECHO_INPUT;
+		else
+		    dwFlag = dwFlag & (DWORD) (~ENABLE_ECHO_INPUT);
+
+		if (arg->c_iflag & BRKINT)
+		    dwFlag |= ENABLE_PROCESSED_INPUT;
+		else
+		    dwFlag = dwFlag & (DWORD) (~ENABLE_PROCESSED_INPUT);
+	    }
+	    dwFlag |= ENABLE_MOUSE_INPUT;
+	    SetConsoleMode(ofd, dwFlag);
+	    code = OK;
+	}
+    }
+    if (arg)
+	term->Nttyb = *arg;
+
+    return code;
+}
+
+int
+_nc_mingw_tcgetattr(int fd, struct termios *arg)
+{
+    TC_PROLOGUE(fd);
+
+    if (_nc_mingw_isconsole(fd)) {
+	if (arg)
+	    *arg = term->Nttyb;
+    }
+    return code;
+}
+
+int
+_nc_mingw_tcflush(int fd, int queue)
+{
+    TC_PROLOGUE(fd);
+    (void) term;
+
+    if (_nc_mingw_isconsole(fd)) {
+	if (queue == TCIFLUSH) {
+	    BOOL b = FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE));
+	    if (!b)
+		return (int) GetLastError();
+	}
+    }
+    return code;
+}
+
+int
+_nc_mingw_testmouse(
+		       SCREEN *sp,
+		       HANDLE fd,
+		       int delay
+		       EVENTLIST_2nd(_nc_eventlist * evl))
+{
+    int rc = 0;
+
+    assert(sp);
+
+    if (sp->_drv_mouse_head < sp->_drv_mouse_tail) {
+	rc = TW_MOUSE;
+    } else {
+	rc = console_twait(sp,
+			   fd,
+			   TWAIT_MASK,
+			   delay,
+			   (int *) 0
+			   EVENTLIST_2nd(evl));
+    }
+    return rc;
+}
+
+int
+_nc_mingw_console_read(
+			  SCREEN *sp,
+			  HANDLE fd,
+			  int *buf)
+{
+    int rc = -1;
+    INPUT_RECORD inp_rec;
+    BOOL b;
+    DWORD nRead;
+    WORD vk;
+
+    assert(sp);
+    assert(buf);
+
+    memset(&inp_rec, 0, sizeof(inp_rec));
+
+    T((T_CALLED("_nc_mingw_console_read(%p)"), sp));
+
+    while ((b = ReadConsoleInput(fd, &inp_rec, 1, &nRead))) {
+	if (b && nRead > 0) {
+	    if (rc < 0)
+		rc = 0;
+	    rc = rc + (int) nRead;
+	    if (inp_rec.EventType == KEY_EVENT) {
+		if (!inp_rec.Event.KeyEvent.bKeyDown)
+		    continue;
+		*buf = (int) inp_rec.Event.KeyEvent.uChar.AsciiChar;
+		vk = inp_rec.Event.KeyEvent.wVirtualKeyCode;
+		/*
+		 * There are 24 virtual function-keys, and typically
+		 * 12 function-keys on a keyboard.  Use the shift-modifier
+		 * to provide the remaining 12 keys.
+		 */
+		if (vk >= VK_F1 && vk <= VK_F12) {
+		    if (inp_rec.Event.KeyEvent.dwControlKeyState & SHIFT_PRESSED) {
+			vk = (WORD) (vk + 12);
+		    }
+		}
+		if (*buf == 0) {
+		    int key = MapKey(vk);
+		    if (key < 0)
+			continue;
+		    if (sp->_keypad_on) {
+			*buf = key;
+		    } else {
+			ungetch('\0');
+			*buf = AnsiKey(vk);
+		    }
+		}
+		break;
+	    } else if (inp_rec.EventType == MOUSE_EVENT) {
+		if (handle_mouse(sp,
+				 inp_rec.Event.MouseEvent)) {
+		    *buf = KEY_MOUSE;
+		    break;
+		}
+	    }
+	    continue;
+	}
+    }
+    returnCode(rc);
+}
+
+static bool
+InitConsole(void)
+{
+    /* initialize once, or not at all */
+    if (!console_initialized) {
+	int i;
+	DWORD num_buttons;
+	WORD a;
+	BOOL buffered = TRUE;
+	BOOL b;
+
+	START_TRACE();
+	if (_nc_mingw_isatty(0)) {
+	    CON.isMinTTY = TRUE;
+	}
+
+	for (i = 0; i < (N_INI + FKEYS); i++) {
+	    if (i < N_INI) {
+		CON.rmap[i] = CON.map[i] =
+		    (DWORD) keylist[i];
+		CON.ansi_map[i] = (DWORD) ansi_keys[i];
+	    } else {
+		CON.rmap[i] = CON.map[i] =
+		    (DWORD) GenMap((VK_F1 + (i - N_INI)),
+				   (KEY_F(1) + (i - N_INI)));
+		CON.ansi_map[i] =
+		    (DWORD) GenMap((VK_F1 + (i - N_INI)),
+				   (';' + (i - N_INI)));
+	    }
+	}
+	qsort(CON.ansi_map,
+	      (size_t) (MAPSIZE),
+	      sizeof(keylist[0]),
+	      keycompare);
+	qsort(CON.map,
+	      (size_t) (MAPSIZE),
+	      sizeof(keylist[0]),
+	      keycompare);
+	qsort(CON.rmap,
+	      (size_t) (MAPSIZE),
+	      sizeof(keylist[0]),
+	      rkeycompare);
+
+	if (GetNumberOfConsoleMouseButtons(&num_buttons)) {
+	    CON.numButtons = (int) num_buttons;
+	} else {
+	    CON.numButtons = 1;
+	}
+
+	a = MapColor(true, COLOR_WHITE) | MapColor(false, COLOR_BLACK);
+	for (i = 0; i < NUMPAIRS; i++)
+	    CON.pairs[i] = a;
+
+	CON.inp = GetStdHandle(STD_INPUT_HANDLE);
+	CON.out = GetStdHandle(STD_OUTPUT_HANDLE);
+
+	b = AllocConsole();
+
+	if (!b)
+	    b = AttachConsole(ATTACH_PARENT_PROCESS);
+
+	if (getenv("NCGDB") || getenv("NCURSES_CONSOLE2")) {
+	    T(("... will not buffer console"));
+	    buffered = FALSE;
+	    CON.hdl = CON.out;
+	} else {
+	    T(("... creating console buffer"));
+	    CON.hdl = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE,
+						0,
+						NULL,
+						CONSOLE_TEXTMODE_BUFFER,
+						NULL);
+	}
+
+	if (CON.hdl != INVALID_HANDLE_VALUE) {
+	    CON.buffered = buffered;
+	    get_SBI();
+	    CON.save_SBI = CON.SBI;
+	    if (!buffered) {
+		save_original_screen();
+		set_scrollback(FALSE, &CON.SBI);
+	    }
+	    GetConsoleCursorInfo(CON.hdl, &CON.save_CI);
+	    T(("... initial cursor is %svisible, %d%%",
+	       (CON.save_CI.bVisible ? "" : "not-"),
+	       (int) CON.save_CI.dwSize));
+	}
+
+	console_initialized = TRUE;
+    }
+    return (CON.hdl != INVALID_HANDLE_VALUE);
+}
+
+static bool
+okConsoleHandle(TERMINAL_CONTROL_BLOCK * TCB)
+{
+    return ((TCB != 0) &&
+	    (TCB->magic == WINMAGIC) &&
+	    InitConsole());
+}
+
+/*
+ * While a constructor would ensure that this module is initialized, that will
+ * interfere with applications that may combine this with GUI interfaces.
+ */
+#if 0
+static
+__attribute__((constructor))
+     void _enter_console(void)
+{
+    (void) InitConsole();
+}
+#endif
diff --git a/package/debian-mingw/changelog b/package/debian-mingw/changelog
new file mode 100644
index 0000000..42dba03
--- /dev/null
+++ b/package/debian-mingw/changelog
@@ -0,0 +1,11 @@
+ncurses6 (6.4+20221231) unstable; urgency=low
+
+  * latest weekly patch
+
+ -- Thomas E. Dickey <dickey@invisible-island.net>  Thu, 29 Dec 2022 15:15:31 -0500
+
+ncurses6 (5.9+20131005) unstable; urgency=low
+
+  * initial release
+
+ -- Thomas E. Dickey <dickey@invisible-island.net>  Sat, 05 Oct 2013 13:35:29 -0400
diff --git a/package/debian-mingw/compat b/package/debian-mingw/compat
new file mode 100644
index 0000000..48082f7
--- /dev/null
+++ b/package/debian-mingw/compat
@@ -0,0 +1 @@
+12
diff --git a/package/debian-mingw/control b/package/debian-mingw/control
new file mode 100644
index 0000000..6fb213f
--- /dev/null
+++ b/package/debian-mingw/control
@@ -0,0 +1,19 @@
+Source: ncurses6
+Section: libdevel
+Priority: optional
+Maintainer: Thomas E. Dickey <dickey@invisible-island.net>
+Homepage: https://invisible-island.net/ncurses/
+Build-Depends: debhelper (>= 7),
+  gcc-mingw-w64-i686,
+  g++-mingw-w64-i686,
+  binutils-mingw-w64-i686
+Standards-Version: 4.6.1.0
+
+Package: mingw32-ncurses6
+Architecture: any
+Depends: ${misc:Depends}
+Description: shared libraries for terminal handling
+ The ncurses library routines are a terminal-independent method of
+ updating character screens with reasonable optimization.
+ .
+ This package is used for testing ABI 6 with the MinGW 32-bit port.
diff --git a/package/debian-mingw/copyright b/package/debian-mingw/copyright
new file mode 100644
index 0000000..5ec77fa
--- /dev/null
+++ b/package/debian-mingw/copyright
@@ -0,0 +1,100 @@
+Upstream source https://invisible-island.net/ncurses/ncurses.html
+This package is used for testing builds of ncurses.
+
+Current ncurses maintainer: Thomas Dickey <dickey@invisible-island.net>
+
+-------------------------------------------------------------------------------
+Files: *
+Copyright: 2017-2021,2022 by Thomas E. Dickey
+Copyright: 1998-2016,2017 Free Software Foundation, Inc.
+License: X11
+
+Files: aclocal.m4 package
+Copyright: 1996-2020,2021 by Thomas E. Dickey
+License: X11
+
+Files: doc/html/NCURSES-Programming-HOWTO.html
+Copyright: 2001 by Pradeep Padala
+License: X11
+
+    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.
+
+-------------------------------------------------------------------------------
+Files: install-sh
+Copyright:  1994 X Consortium
+License: X11
+
+    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, 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
+    X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+    AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+    TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+    Except as contained in this notice, the name of the X Consortium shall not
+    be used in advertising or otherwise to promote the sale, use or other deal-
+    ings in this Software without prior written authorization from the X Consor-
+    tium.
+
+-------------------------------------------------------------------------------
+Files: progs/tset.c ncurses/tinfo/read_termcap.c
+Copyright: 1980,1991,1992,1993 The Regents of the University of California.
+License: BSD
+
+    Redistribution and use in source and binary forms, with or without
+    modification, are permitted provided that the following conditions
+    are met:
+    1. Redistributions of source code must retain the above copyright
+       notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright
+       notice, this list of conditions and the following disclaimer in the
+       documentation and/or other materials provided with the distribution.
+    3. Neither the name of the University nor the names of its contributors
+       may be used to endorse or promote products derived from this software
+       without specific prior written permission.
+
+    THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+    ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+    SUCH DAMAGE.
+
+-- vile: txtmode file-encoding=utf-8
diff --git a/package/debian-mingw/mingw32-ncurses6.lintian-overrides b/package/debian-mingw/mingw32-ncurses6.lintian-overrides
new file mode 100644
index 0000000..ed565e4
--- /dev/null
+++ b/package/debian-mingw/mingw32-ncurses6.lintian-overrides
@@ -0,0 +1,7 @@
+mingw32-ncurses6: latest-debian-changelog-entry-changed-to-native
+
+mingw32-ncurses6: non-standard-dir-in-usr
+mingw32-ncurses6: file-in-unusual-dir
+
+mingw32-ncurses6: binary-without-manpage
+mingw32-ncurses6: executable-not-elf-or-script
diff --git a/package/debian-mingw/rules b/package/debian-mingw/rules
new file mode 100755
index 0000000..e5365f9
--- /dev/null
+++ b/package/debian-mingw/rules
@@ -0,0 +1,149 @@
+#!/usr/bin/make -f
+# Made with the aid of dh_make, by Craig Small
+# Sample debian/rules that uses debhelper. GNU copyright 1997 by Joey Hess.
+# Some lines taken from debmake, by Cristoph Lameter.
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+# These are used for cross-compiling and for saving the configure script
+# from having to guess our platform (since we know it already)
+DEB_HOST_GNU_TYPE   ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
+DEB_BUILD_GNU_TYPE  ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
+
+MY_ABI=6
+
+BUILD_CC = gcc
+
+CC_NORMAL = -Wall -Wstrict-prototypes -Wmissing-prototypes -Wshadow -Wconversion
+CC_STRICT = $(CC_NORMAL) -W -Wbad-function-cast -Wcast-align -Wcast-qual -Wmissing-declarations -Wnested-externs -Wpointer-arith -Wwrite-strings -ansi -pedantic
+
+TARGET    = i686-w64-mingw32
+MINGW_BIN = /usr/bin
+MINGW_TOP = /usr/$(TARGET)
+MINGW_TMP = $(CURDIR)/debian/mingw32-ncurses$(MY_ABI)
+
+CFLAGS = $(CC_NORMAL)
+
+verbose = # -v
+
+CONFIG_OPTIONS = \
+	--disable-db-install \
+	--disable-echo \
+	--disable-getcap \
+	--disable-hard-tabs \
+	--disable-leaks \
+	--disable-macros \
+	--disable-overwrite \
+	--disable-termcap \
+	--enable-interop \
+	--enable-opaque-curses \
+	--enable-opaque-form \
+	--enable-opaque-menu \
+	--enable-opaque-panel \
+	--enable-pc-files \
+	--enable-term-driver \
+	--enable-warnings \
+	--enable-widec \
+	--verbose \
+	--with-abi-version=$(MY_ABI) \
+	--with-cxx-shared \
+	--with-develop \
+	--with-fallbacks=unknown,rxvt \
+	--with-tic-path=/usr/bin/tic$(MY_ABI) \
+	--with-infocmp-path=/usr/bin/infocmp$(MY_ABI) \
+	--with-shared \
+	--with-trace \
+	--with-xterm-kbs=DEL \
+	--without-ada \
+	--without-debug \
+	--without-manpages \
+	--without-progs \
+	--without-tests
+
+export CFLAGS BUILD_CC
+
+ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
+        CFLAGS += -O0
+else
+        CFLAGS += -O2
+endif
+ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS)))
+        INSTALL_PROGRAM += -s
+endif
+
+configure: configure-stamp
+configure-stamp:
+	dh_testdir
+
+	CC=$(TARGET)-gcc \
+	CFLAGS="$(CFLAGS)" \
+	./configure \
+		--host=$(TARGET) \
+		--target=$(TARGET) \
+		--prefix=$(MINGW_TOP) \
+		--with-build-cc=$(BUILD_CC) \
+		--with-pc-suffix=$(MY_ABI) \
+		--with-pkg-config-libdir=/usr/$(TARGET)/lib/pkgconfig \
+		$(CONFIG_OPTIONS)
+
+	touch configure-stamp
+
+build: build-stamp
+build-stamp: configure-stamp
+	dh_testdir
+
+	$(MAKE)
+
+	touch build-stamp
+
+clean:
+	dh_testdir
+	dh_testroot
+
+	[ ! -f makefile ] || $(MAKE) distclean
+
+	rm -f configure-stamp build-stamp install-stamp
+
+	dh_clean
+
+install: install-stamp
+install-stamp: build-stamp
+	dh_testdir
+	dh_testroot
+	dh_prep
+	dh_installdirs      $(verbose)
+
+	$(MAKE) install.libs DESTDIR=$(MINGW_TMP)
+
+	mkdir -p $(MINGW_TMP)$(MINGW_BIN)
+	for name in $(MINGW_TMP)$(MINGW_TOP)/bin/*-config; \
+	do \
+		base=`basename $$name`; \
+		ln -v $$name $(MINGW_TMP)$(MINGW_BIN)/$(TARGET)-$$base; \
+	done
+
+	touch install-stamp
+
+# Build architecture-independent files here.
+binary-indep: build install
+# No binary-indep target.
+
+# Build architecture-dependent files here.
+binary-arch: build install
+	dh_testdir
+	dh_testroot          $(verbose)
+	dh_lintian           $(verbose)
+	dh_installdocs       $(verbose)
+	dh_installchangelogs $(verbose) NEWS
+	# dh_strip
+	dh_compress          $(verbose)
+	dh_fixperms          $(verbose)
+	dh_installdeb        $(verbose)
+	dh_shlibdeps         $(verbose)
+	dh_gencontrol        $(verbose)
+	dh_md5sums           $(verbose)
+	dh_builddeb          $(verbose)
+
+binary: binary-indep binary-arch
+.PHONY: build clean binary-indep binary-arch binary install install-stamp
diff --git a/package/debian-mingw/source/format b/package/debian-mingw/source/format
new file mode 100644
index 0000000..89ae9db
--- /dev/null
+++ b/package/debian-mingw/source/format
@@ -0,0 +1 @@
+3.0 (native)
diff --git a/package/debian-mingw/watch b/package/debian-mingw/watch
new file mode 100644
index 0000000..f6b3987
--- /dev/null
+++ b/package/debian-mingw/watch
@@ -0,0 +1,4 @@
+version=3
+
+opts=passive ftp://ftp.invisible-island.net/ncurses/current/ncurses\.tar.gz \
+ debian  uupdate
diff --git a/package/debian-mingw64/changelog b/package/debian-mingw64/changelog
new file mode 100644
index 0000000..42dba03
--- /dev/null
+++ b/package/debian-mingw64/changelog
@@ -0,0 +1,11 @@
+ncurses6 (6.4+20221231) unstable; urgency=low
+
+  * latest weekly patch
+
+ -- Thomas E. Dickey <dickey@invisible-island.net>  Thu, 29 Dec 2022 15:15:31 -0500
+
+ncurses6 (5.9+20131005) unstable; urgency=low
+
+  * initial release
+
+ -- Thomas E. Dickey <dickey@invisible-island.net>  Sat, 05 Oct 2013 13:35:29 -0400
diff --git a/package/debian-mingw64/compat b/package/debian-mingw64/compat
new file mode 100644
index 0000000..48082f7
--- /dev/null
+++ b/package/debian-mingw64/compat
@@ -0,0 +1 @@
+12
diff --git a/package/debian-mingw64/control b/package/debian-mingw64/control
new file mode 100644
index 0000000..74e8136
--- /dev/null
+++ b/package/debian-mingw64/control
@@ -0,0 +1,19 @@
+Source: ncurses6
+Section: libdevel
+Priority: optional
+Maintainer: Thomas E. Dickey <dickey@invisible-island.net>
+Homepage: https://invisible-island.net/ncurses/
+Build-Depends: debhelper (>= 7),
+  gcc-mingw-w64-x86-64,
+  g++-mingw-w64-x86-64,
+  binutils-mingw-w64-x86-64
+Standards-Version: 4.6.1.0
+
+Package: mingw64-ncurses6
+Architecture: any
+Depends: ${misc:Depends}
+Description: shared libraries for terminal handling
+ The ncurses library routines are a terminal-independent method of
+ updating character screens with reasonable optimization.
+ .
+ This package is used for testing ABI 6 with the MinGW 64-bit port.
diff --git a/package/debian-mingw64/copyright b/package/debian-mingw64/copyright
new file mode 100644
index 0000000..5ec77fa
--- /dev/null
+++ b/package/debian-mingw64/copyright
@@ -0,0 +1,100 @@
+Upstream source https://invisible-island.net/ncurses/ncurses.html
+This package is used for testing builds of ncurses.
+
+Current ncurses maintainer: Thomas Dickey <dickey@invisible-island.net>
+
+-------------------------------------------------------------------------------
+Files: *
+Copyright: 2017-2021,2022 by Thomas E. Dickey
+Copyright: 1998-2016,2017 Free Software Foundation, Inc.
+License: X11
+
+Files: aclocal.m4 package
+Copyright: 1996-2020,2021 by Thomas E. Dickey
+License: X11
+
+Files: doc/html/NCURSES-Programming-HOWTO.html
+Copyright: 2001 by Pradeep Padala
+License: X11
+
+    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.
+
+-------------------------------------------------------------------------------
+Files: install-sh
+Copyright:  1994 X Consortium
+License: X11
+
+    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, 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
+    X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+    AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+    TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+    Except as contained in this notice, the name of the X Consortium shall not
+    be used in advertising or otherwise to promote the sale, use or other deal-
+    ings in this Software without prior written authorization from the X Consor-
+    tium.
+
+-------------------------------------------------------------------------------
+Files: progs/tset.c ncurses/tinfo/read_termcap.c
+Copyright: 1980,1991,1992,1993 The Regents of the University of California.
+License: BSD
+
+    Redistribution and use in source and binary forms, with or without
+    modification, are permitted provided that the following conditions
+    are met:
+    1. Redistributions of source code must retain the above copyright
+       notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright
+       notice, this list of conditions and the following disclaimer in the
+       documentation and/or other materials provided with the distribution.
+    3. Neither the name of the University nor the names of its contributors
+       may be used to endorse or promote products derived from this software
+       without specific prior written permission.
+
+    THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+    ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+    SUCH DAMAGE.
+
+-- vile: txtmode file-encoding=utf-8
diff --git a/package/debian-mingw64/mingw64-ncurses6.lintian-overrides b/package/debian-mingw64/mingw64-ncurses6.lintian-overrides
new file mode 100644
index 0000000..9e8f854
--- /dev/null
+++ b/package/debian-mingw64/mingw64-ncurses6.lintian-overrides
@@ -0,0 +1,7 @@
+mingw64-ncurses6: latest-debian-changelog-entry-changed-to-native
+
+mingw64-ncurses6: non-standard-dir-in-usr
+mingw64-ncurses6: file-in-unusual-dir
+
+mingw64-ncurses6: binary-without-manpage
+mingw64-ncurses6: executable-not-elf-or-script
diff --git a/package/debian-mingw64/rules b/package/debian-mingw64/rules
new file mode 100755
index 0000000..d0c4ed8
--- /dev/null
+++ b/package/debian-mingw64/rules
@@ -0,0 +1,149 @@
+#!/usr/bin/make -f
+# Made with the aid of dh_make, by Craig Small
+# Sample debian/rules that uses debhelper. GNU copyright 1997 by Joey Hess.
+# Some lines taken from debmake, by Cristoph Lameter.
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+# These are used for cross-compiling and for saving the configure script
+# from having to guess our platform (since we know it already)
+DEB_HOST_GNU_TYPE   ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
+DEB_BUILD_GNU_TYPE  ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
+
+MY_ABI=6
+
+BUILD_CC = gcc
+
+CC_NORMAL = -Wall -Wstrict-prototypes -Wmissing-prototypes -Wshadow -Wconversion
+CC_STRICT = $(CC_NORMAL) -W -Wbad-function-cast -Wcast-align -Wcast-qual -Wmissing-declarations -Wnested-externs -Wpointer-arith -Wwrite-strings -ansi -pedantic
+
+TARGET    = x86_64-w64-mingw32
+MINGW_BIN = /usr/bin
+MINGW_TOP = /usr/$(TARGET)
+MINGW_TMP = $(CURDIR)/debian/mingw64-ncurses$(MY_ABI)
+
+CFLAGS = $(CC_NORMAL)
+
+verbose = # -v
+
+CONFIG_OPTIONS = \
+	--disable-db-install \
+	--disable-echo \
+	--disable-getcap \
+	--disable-hard-tabs \
+	--disable-leaks \
+	--disable-macros \
+	--disable-overwrite \
+	--disable-termcap \
+	--enable-interop \
+	--enable-opaque-curses \
+	--enable-opaque-form \
+	--enable-opaque-menu \
+	--enable-opaque-panel \
+	--enable-pc-files \
+	--enable-term-driver \
+	--enable-warnings \
+	--enable-widec \
+	--verbose \
+	--with-abi-version=$(MY_ABI) \
+	--with-cxx-shared \
+	--with-develop \
+	--with-fallbacks=unknown,rxvt \
+	--with-tic-path=/usr/bin/tic$(MY_ABI) \
+	--with-infocmp-path=/usr/bin/infocmp$(MY_ABI) \
+	--with-shared \
+	--with-trace \
+	--with-xterm-kbs=DEL \
+	--without-ada \
+	--without-debug \
+	--without-manpages \
+	--without-progs \
+	--without-tests
+
+export CFLAGS BUILD_CC
+
+ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
+        CFLAGS += -O0
+else
+        CFLAGS += -O2
+endif
+ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS)))
+        INSTALL_PROGRAM += -s
+endif
+
+configure: configure-stamp
+configure-stamp:
+	dh_testdir
+
+	CC=$(TARGET)-gcc \
+	CFLAGS="$(CFLAGS)" \
+	./configure \
+		--host=$(TARGET) \
+		--target=$(TARGET) \
+		--prefix=$(MINGW_TOP) \
+		--with-build-cc=$(BUILD_CC) \
+		--with-pc-suffix=$(MY_ABI) \
+		--with-pkg-config-libdir=/usr/$(TARGET)/lib/pkgconfig \
+		$(CONFIG_OPTIONS)
+
+	touch configure-stamp
+
+build: build-stamp
+build-stamp: configure-stamp
+	dh_testdir
+
+	$(MAKE)
+
+	touch build-stamp
+
+clean:
+	dh_testdir
+	dh_testroot
+
+	[ ! -f makefile ] || $(MAKE) distclean
+
+	rm -f configure-stamp build-stamp install-stamp
+
+	dh_clean
+
+install: install-stamp
+install-stamp: build-stamp
+	dh_testdir
+	dh_testroot
+	dh_prep
+	dh_installdirs      $(verbose)
+
+	$(MAKE) install.libs DESTDIR=$(MINGW_TMP)
+
+	mkdir -p $(MINGW_TMP)$(MINGW_BIN)
+	for name in $(MINGW_TMP)$(MINGW_TOP)/bin/*-config; \
+	do \
+		base=`basename $$name`; \
+		ln -v $$name $(MINGW_TMP)$(MINGW_BIN)/$(TARGET)-$$base; \
+	done
+
+	touch install-stamp
+
+# Build architecture-independent files here.
+binary-indep: build install
+# No binary-indep target.
+
+# Build architecture-dependent files here.
+binary-arch: build install
+	dh_testdir
+	dh_testroot          $(verbose)
+	dh_lintian           $(verbose)
+	dh_installdocs       $(verbose)
+	dh_installchangelogs $(verbose) NEWS
+	# dh_strip
+	dh_compress          $(verbose)
+	dh_fixperms          $(verbose)
+	dh_installdeb        $(verbose)
+	dh_shlibdeps         $(verbose)
+	dh_gencontrol        $(verbose)
+	dh_md5sums           $(verbose)
+	dh_builddeb          $(verbose)
+
+binary: binary-indep binary-arch
+.PHONY: build clean binary-indep binary-arch binary install install-stamp
diff --git a/package/debian-mingw64/source/format b/package/debian-mingw64/source/format
new file mode 100644
index 0000000..89ae9db
--- /dev/null
+++ b/package/debian-mingw64/source/format
@@ -0,0 +1 @@
+3.0 (native)
diff --git a/package/debian-mingw64/watch b/package/debian-mingw64/watch
new file mode 100644
index 0000000..f6b3987
--- /dev/null
+++ b/package/debian-mingw64/watch
@@ -0,0 +1,4 @@
+version=3
+
+opts=passive ftp://ftp.invisible-island.net/ncurses/current/ncurses\.tar.gz \
+ debian  uupdate
diff --git a/package/debian/changelog b/package/debian/changelog
new file mode 100644
index 0000000..d7ed89e
--- /dev/null
+++ b/package/debian/changelog
@@ -0,0 +1,11 @@
+ncurses6 (6.4+20221231) unstable; urgency=low
+
+  * latest weekly patch
+
+ -- Thomas E. Dickey <dickey@invisible-island.net>  Thu, 29 Dec 2022 15:15:31 -0500
+
+ncurses6 (5.9+20120608) unstable; urgency=low
+
+  * initial release
+
+ -- Thomas E. Dickey <dickey@invisible-island.net>  Fri, 08 Jun 2012 07:54:29 -0400
diff --git a/package/debian/compat b/package/debian/compat
new file mode 100644
index 0000000..48082f7
--- /dev/null
+++ b/package/debian/compat
@@ -0,0 +1 @@
+12
diff --git a/package/debian/control b/package/debian/control
new file mode 100644
index 0000000..3592191
--- /dev/null
+++ b/package/debian/control
@@ -0,0 +1,44 @@
+Source: ncurses6
+Section: libdevel
+Priority: optional
+Maintainer: Thomas E. Dickey <dickey@invisible-island.net>
+Homepage: https://invisible-island.net/ncurses/
+Build-Depends: debhelper (>= 8.1.3)
+Standards-Version: 4.6.1.0
+
+Package: ncurses6
+Architecture: any
+Depends: ${misc:Depends}, libc6 (>= 2.4)
+Description: shared libraries for terminal handling
+ The ncurses library routines are a terminal-independent method of
+ updating character screens with reasonable optimization.
+ .
+ This package is used for testing ABI 6.
+
+Package: ncursest6
+Architecture: any
+Depends: ${misc:Depends}, libc6 (>= 2.4)
+Description: shared libraries for terminal handling
+ The ncurses library routines are a terminal-independent method of
+ updating character screens with reasonable optimization.
+ .
+ This package is used for testing ABI 6 with pthreads.
+
+Package: ncurses6-doc
+Section: doc
+Architecture: all
+Depends: groff-base
+Description: shared libraries for terminal handling
+ The ncurses library routines are a terminal-independent method of
+ updating character screens with reasonable optimization.
+ .
+ This package is used for testing ncurses6 document packaging.
+
+Package: ncurses6-doc-html
+Section: doc
+Architecture: all
+Description: shared libraries for terminal handling
+ The ncurses library routines are a terminal-independent method of
+ updating character screens with reasonable optimization.
+ .
+ This package is used for testing ncurses6 document packaging.
diff --git a/package/debian/copyright b/package/debian/copyright
new file mode 100644
index 0000000..5ec77fa
--- /dev/null
+++ b/package/debian/copyright
@@ -0,0 +1,100 @@
+Upstream source https://invisible-island.net/ncurses/ncurses.html
+This package is used for testing builds of ncurses.
+
+Current ncurses maintainer: Thomas Dickey <dickey@invisible-island.net>
+
+-------------------------------------------------------------------------------
+Files: *
+Copyright: 2017-2021,2022 by Thomas E. Dickey
+Copyright: 1998-2016,2017 Free Software Foundation, Inc.
+License: X11
+
+Files: aclocal.m4 package
+Copyright: 1996-2020,2021 by Thomas E. Dickey
+License: X11
+
+Files: doc/html/NCURSES-Programming-HOWTO.html
+Copyright: 2001 by Pradeep Padala
+License: X11
+
+    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.
+
+-------------------------------------------------------------------------------
+Files: install-sh
+Copyright:  1994 X Consortium
+License: X11
+
+    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, 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
+    X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+    AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+    TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+    Except as contained in this notice, the name of the X Consortium shall not
+    be used in advertising or otherwise to promote the sale, use or other deal-
+    ings in this Software without prior written authorization from the X Consor-
+    tium.
+
+-------------------------------------------------------------------------------
+Files: progs/tset.c ncurses/tinfo/read_termcap.c
+Copyright: 1980,1991,1992,1993 The Regents of the University of California.
+License: BSD
+
+    Redistribution and use in source and binary forms, with or without
+    modification, are permitted provided that the following conditions
+    are met:
+    1. Redistributions of source code must retain the above copyright
+       notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright
+       notice, this list of conditions and the following disclaimer in the
+       documentation and/or other materials provided with the distribution.
+    3. Neither the name of the University nor the names of its contributors
+       may be used to endorse or promote products derived from this software
+       without specific prior written permission.
+
+    THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+    ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+    SUCH DAMAGE.
+
+-- vile: txtmode file-encoding=utf-8
diff --git a/package/debian/ncurses6.lintian-overrides b/package/debian/ncurses6.lintian-overrides
new file mode 100644
index 0000000..2ce22e4
--- /dev/null
+++ b/package/debian/ncurses6.lintian-overrides
@@ -0,0 +1,17 @@
+# This is intentional.
+ncurses6: package-name-doesnt-match-sonames libformw6-6 libmenuw6-6 libncurses++w6-6 libncursesw6-6 libpanelw6-6 libticw6-6 libtinfow6-6
+
+# This worked around a bug in Debian's build-scripts.
+#ncurses6: latest-debian-changelog-entry-changed-to-native
+
+ncurses6: hardening-no-fortify-functions usr/lib/libncurses++w6.so.6.1
+#ncurses6: hardening-no-fortify-functions usr/lib/libformw6.so.6.1
+ncurses6: hardening-no-fortify-functions usr/lib/libmenuw6.so.6.1
+
+# This is intentional.
+ncurses6: binary-without-manpage
+ncurses6: non-dev-pkg-with-shlib-symlink
+ncurses6: embedded-library ncurses usr/lib/libtinfow6.so.6.1
+#ncurses6: postinst-must-call-ldconfig usr/lib/libtinfow6.so.6.1
+
+# vile: confmode
diff --git a/package/debian/ncurses6.triggers b/package/debian/ncurses6.triggers
new file mode 100644
index 0000000..dd86603
--- /dev/null
+++ b/package/debian/ncurses6.triggers
@@ -0,0 +1 @@
+activate-noawait ldconfig
diff --git a/package/debian/ncursest6.lintian-overrides b/package/debian/ncursest6.lintian-overrides
new file mode 100644
index 0000000..b3ecaa8
--- /dev/null
+++ b/package/debian/ncursest6.lintian-overrides
@@ -0,0 +1,17 @@
+# This is intentional.
+ncursest6: package-name-doesnt-match-sonames libformtw6-6 libmenutw6-6 libncurses++tw6-6 libncursestw6-6 libpaneltw6-6 libtictw6-6 libtinfotw6-6
+
+# This worked around a bug in Debian's build-scripts.
+#ncursest6: latest-debian-changelog-entry-changed-to-native
+
+ncursest6: hardening-no-fortify-functions usr/lib/libncurses++tw6.so.6.1
+#ncursest6: hardening-no-fortify-functions usr/lib/libformtw6.so.6.1
+ncursest6: hardening-no-fortify-functions usr/lib/libmenutw6.so.6.1
+
+# This is intentional.
+ncursest6: binary-without-manpage
+ncursest6: non-dev-pkg-with-shlib-symlink
+ncursest6: embedded-library ncurses usr/lib/libtinfotw6.so.6.1
+#ncursest6: postinst-must-call-ldconfig usr/lib/libtinfotw6.so.6.1
+
+# vile: confmode
diff --git a/package/debian/ncursest6.triggers b/package/debian/ncursest6.triggers
new file mode 100644
index 0000000..dd86603
--- /dev/null
+++ b/package/debian/ncursest6.triggers
@@ -0,0 +1 @@
+activate-noawait ldconfig
diff --git a/package/debian/rules b/package/debian/rules
new file mode 100755
index 0000000..8bd2135
--- /dev/null
+++ b/package/debian/rules
@@ -0,0 +1,276 @@
+#!/usr/bin/make -f
+# $Id: rules,v 1.45 2022/10/22 18:35:38 tom Exp $
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+# packages
+PACKAGES.indep = ncurses6-doc ncurses6-doc-html
+PACKAGES.arch  = ncurses6 ncursest6
+
+# These are used for cross-compiling and for saving the configure script
+# from having to guess our platform (since we know it already)
+DEB_HOST_GNU_TYPE   ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
+DEB_BUILD_GNU_TYPE  ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
+DEB_HOST_MULTIARCH  ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH)
+
+CC_NORMAL = -Wall -Wstrict-prototypes -Wmissing-prototypes -Wshadow -Wconversion
+CC_STRICT = $(CC_NORMAL) -W -Wbad-function-cast -Wcast-align -Wcast-qual -Wmissing-declarations -Wnested-externs -Wpointer-arith -Wwrite-strings -ansi -pedantic
+
+MY_ABI=6
+MY_DIR=/usr
+BINDIR=$(MY_DIR)/bin
+LIBDIR=$(MY_DIR)/lib/$(DEB_HOST_MULTIARCH)
+MYDATA=/usr/local/ncurses/share/terminfo
+NORMAL_DIR=$(CURDIR)/debian/ncurses$(MY_ABI)
+THREAD_DIR=$(CURDIR)/debian/ncursest$(MY_ABI)
+
+CFLAGS   = $(shell dpkg-buildflags --get CFLAGS) $(CC_NORMAL)
+CXXFLAGS = $(shell dpkg-buildflags --get CXXFLAGS)
+CPPFLAGS = $(shell dpkg-buildflags --get CPPFLAGS)
+LDFLAGS  = $(shell dpkg-buildflags --get LDFLAGS)
+
+ifneq ($(MY_DIR),/usr)
+	RPATH_ENV = RPATH_LIST=../lib:$(LIBDIR)
+	RPATH_OPT = --enable-rpath
+else
+	RPATH_ENV =
+	RPATH_OPT = --disable-rpath --disable-rpath-hack
+endif
+
+ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
+        CFLAGS += -O0
+else
+        CFLAGS += -O2
+endif
+ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS)))
+        INSTALL_PROGRAM += -s
+endif
+
+verbose = # -v
+
+configure = \
+	$(RPATH_ENV) \
+	CFLAGS="$(CFLAGS)" \
+	CPPFLAGS="$(CPPFLAGS)" \
+	LDFLAGS="$(LDFLAGS)" ../../configure $(RPATH_OPT) \
+		--host=$(DEB_HOST_GNU_TYPE) \
+		--build=$(DEB_BUILD_GNU_TYPE) \
+		--prefix=$(MY_DIR) \
+		--libdir=\$${prefix}/lib/$(DEB_HOST_MULTIARCH) \
+		--disable-echo \
+		--disable-getcap \
+		--disable-leaks \
+		--disable-macros  \
+		--disable-overwrite  \
+		--disable-relink \
+		--disable-termcap \
+		--enable-hard-tabs \
+		--enable-opaque-curses \
+		--enable-opaque-form \
+		--enable-opaque-menu \
+		--enable-opaque-panel \
+		--enable-pc-files \
+		--enable-stdnoreturn \
+		--enable-warnings \
+		--enable-wgetch-events \
+		--enable-widec \
+		--enable-xmc-glitch \
+		--program-suffix=$(MY_ABI) \
+		--verbose \
+		--with-abi-version=$(MY_ABI) \
+		--with-config-suffix=dev \
+		--with-cxx-shared \
+		--with-default-terminfo-dir=$(MYDATA) \
+		--with-develop \
+		--with-extra-suffix=$(MY_ABI) \
+		--with-shared \
+		--with-terminfo-dirs=$(MYDATA):/lib/terminfo:/usr/share/terminfo \
+		--with-termlib \
+		--with-ticlib \
+		--with-trace \
+		--with-versioned-syms \
+		--with-xterm-kbs=DEL \
+		--without-ada \
+		--without-debug \
+		--without-manpage-aliases \
+		--without-normal
+
+NCURSES6_DIR = $(CURDIR)/debian/ncurses6
+NCURSEST6_DIR = $(CURDIR)/debian/ncursest6
+
+.PHONY: all config build install binary clean config-indep config-arch \
+    build-indep build-arch install-indep install-arch binary-indep \
+    binary-arch
+
+all: build
+
+config: config-indep config-arch
+build: build-indep build-arch
+install: install-indep install-arch
+binary: binary-indep binary-arch
+clean:
+	dh_testdir
+	dh_testroot
+	dh_clean $(verbose)
+	rm -rf t
+
+config-indep: $(PACKAGES.indep:%=config-%-stamp)
+config-arch: $(PACKAGES.arch:%=config-%-stamp)
+
+build-indep: $(PACKAGES.indep:%=build-%-stamp)
+build-arch: $(PACKAGES.arch:%=build-%-stamp)
+
+install-indep: $(PACKAGES.indep:%=install-%-stamp)
+install-arch: $(PACKAGES.arch:%=install-%-stamp)
+
+# make the doc-package installable by renaming everything to avoid clashing
+patch-ncurses6-stamp:
+	dh_testdir
+	sed -i.bak \
+		-e 's/-config\.1$$/dev-config.1/;t' \
+		-e 's/\.3ncurses$$/.3ncurses6/' \
+		-e 's/\.3curses$$/.3curses6/' \
+		-e 's/\.3form$$/.3form6/' \
+		-e 's/\.3menu$$/.3menu6/' \
+		-e 's/\.3panel$$/.3panel6/' \
+		-e 's/\.\([157]\)$$/6.\1/' \
+		man/man_db.renames.in
+	diff -u man/man_db.renames.in.bak man/man_db.renames.in || true
+	touch $@
+
+config-ncurses6-stamp: patch-ncurses6-stamp
+	dh_testdir
+	rm -rf t/ncurses6
+	mkdir -p t/ncurses6
+	cd t/ncurses6; $(configure)
+	touch $@
+
+config-ncursest6-stamp: patch-ncurses6-stamp
+	dh_testdir
+	rm -rf t/ncursest6
+	mkdir -p t/ncursest6
+	cd t/ncursest6; $(configure) \
+		--enable-interop \
+		--enable-sp-funcs \
+		--program-suffix=t$(MY_ABI) \
+		--with-pthread
+	touch $@
+
+config-ncurses6-doc-stamp \
+config-ncurses6-doc-html-stamp: config-ncurses6-stamp
+	touch $@
+
+build-ncurses6-stamp: config-ncurses6-stamp
+	dh_testdir
+
+	$(MAKE) -C t/ncurses6
+
+	touch $@
+
+build-ncursest6-stamp: config-ncursest6-stamp
+	dh_testdir
+
+	$(MAKE) -C t/ncursest6
+
+	touch $@
+
+build-ncurses6-doc-stamp \
+build-ncurses6-doc-html-stamp: build-ncurses6-stamp
+	touch $@
+
+install-ncurses6-stamp: build-ncurses6-stamp
+	dh_testdir
+	dh_testroot
+	dh_installdirs $(verbose)
+	dh_prep        $(verbose) -pncurses6
+
+	$(MAKE) -C t/ncurses6 install.libs install.progs DESTDIR=$(NCURSES6_DIR)
+	$(MAKE) -C t/ncurses6/test ncurses LOCAL_LIBDIR=$(LIBDIR)
+
+	mv t/ncurses6/test/ncurses $(NCURSES6_DIR)$(BINDIR)/ncurses$(MY_ABI)
+
+	touch $@
+
+install-ncursest6-stamp: build-ncursest6-stamp
+	dh_testdir
+	dh_testroot
+	dh_installdirs $(verbose)
+	dh_prep        $(verbose) -pncursest6
+
+	$(MAKE) -C t/ncursest6 install.libs install.progs DESTDIR=$(NCURSEST6_DIR)
+	$(MAKE) -C t/ncursest6/test ncurses LOCAL_LIBDIR=$(LIBDIR)
+
+	mv t/ncursest6/test/ncurses $(NCURSEST6_DIR)$(BINDIR)/ncursest$(MY_ABI)
+
+	touch $@
+
+install-ncurses6-doc-stamp: build-ncurses6-stamp
+	dh_testdir
+	dh_testroot
+	dh_installdirs $(verbose)
+	dh_prep        $(verbose) -pncurses6-doc
+
+	$(MAKE) -C t/ncurses6 install.man DESTDIR=$(NCURSES6_DIR)-doc
+
+	cd $(NCURSES6_DIR)-doc/usr/share/man/man1 && ln -sf tset6.1.gz reset6.1.gz
+
+	touch $@
+
+HTML_DESTDIR=$(NCURSES6_DIR)-doc-html/usr/share/ncurses6-doc-html
+install-ncurses6-doc-html-stamp: build-ncurses6-stamp
+	dh_testdir
+	dh_testroot
+	dh_installdirs $(verbose)
+	dh_prep        $(verbose) -pncurses6-doc-html
+
+	cd doc/html && find * -type d | sort | xargs -I{} mkdir -p -v $(HTML_DESTDIR)/{}
+	cd doc/html && find * -type f -name '*.html' | sort | xargs -I{} install -m 644 -p -v -T {} $(HTML_DESTDIR)/{}
+
+	touch $@
+
+# Build architecture-independent files here.
+binary-indep: install-indep
+ifneq ($(PACKAGES.indep),)
+	rm -f $(PACKAGES.indep:%=install-%-stamp)
+	dh_testdir
+	dh_testroot
+	dh_lintian           $(verbose) $(PACKAGES.arch:%=-p%)
+	dh_installdocs       $(verbose) $(PACKAGES.indep:%=-p%)
+	dh_installman        $(verbose) $(PACKAGES.indep:%=-p%)
+	dh_installexamples   $(verbose) $(PACKAGES.indep:%=-p%)
+	dh_installchangelogs $(verbose) $(PACKAGES.indep:%=-p%) NEWS
+	dh_compress          $(verbose) $(PACKAGES.indep:%=-p%)
+	dh_fixperms          $(verbose) $(PACKAGES.indep:%=-p%)
+	dh_installdeb        $(verbose) $(PACKAGES.indep:%=-p%)
+	dh_gencontrol        $(verbose) $(PACKAGES.indep:%=-p%)
+	dh_md5sums           $(verbose) $(PACKAGES.indep:%=-p%)
+	dh_builddeb          $(verbose) $(PACKAGES.indep:%=-p%)
+endif
+
+# Build architecture-dependent files here.
+binary-arch: install-arch
+ifneq ($(PACKAGES.arch),)
+	rm -f $(PACKAGES.arch:%=install-%-stamp)
+	dh_testdir
+	dh_testroot
+
+	version=`set -x; awk 'BEGIN{major=minor=0} /^NCURSES_MAJOR/{major=$$3} /^NCURSES_MINOR/{minor=$$3} END{print major "." minor}' < dist.mk`; \
+	sed -i \
+		-e "s, usr/lib, usr/lib/$(DEB_HOST_MULTIARCH)," \
+		-e "s,6\.1,$${version}," \
+		debian/*.lintian-overrides
+
+	dh_lintian           $(verbose) $(PACKAGES.arch:%=-p%)
+	dh_installdocs       $(verbose) $(PACKAGES.arch:%=-p%)
+	dh_installchangelogs $(verbose) $(PACKAGES.arch:%=-p%)  NEWS
+	dh_strip             $(verbose) $(PACKAGES.arch:%=-p%)
+	dh_compress          $(verbose) $(PACKAGES.arch:%=-p%)
+	dh_fixperms          $(verbose) $(PACKAGES.arch:%=-p%)
+	dh_installdeb        $(verbose) $(PACKAGES.arch:%=-p%)
+	dh_makeshlibs        $(verbose) $(PACKAGES.arch:%=-p%)
+	dh_shlibdeps         $(verbose) $(PACKAGES.arch:%=-p%)
+	dh_gencontrol        $(verbose) $(PACKAGES.arch:%=-p%)
+	dh_md5sums           $(verbose) $(PACKAGES.arch:%=-p%)
+	dh_builddeb          $(verbose) $(PACKAGES.arch:%=-p%)
+endif
diff --git a/package/debian/source/format b/package/debian/source/format
new file mode 100644
index 0000000..89ae9db
--- /dev/null
+++ b/package/debian/source/format
@@ -0,0 +1 @@
+3.0 (native)
diff --git a/package/debian/watch b/package/debian/watch
new file mode 100644
index 0000000..f6b3987
--- /dev/null
+++ b/package/debian/watch
@@ -0,0 +1,4 @@
+version=3
+
+opts=passive ftp://ftp.invisible-island.net/ncurses/current/ncurses\.tar.gz \
+ debian  uupdate
diff --git a/package/mingw-ncurses.nsi b/package/mingw-ncurses.nsi
new file mode 100644
index 0000000..51e04a7
--- /dev/null
+++ b/package/mingw-ncurses.nsi
@@ -0,0 +1,190 @@
+; $Id: mingw-ncurses.nsi,v 1.559 2022/12/29 20:15:31 tom Exp $

+

+; TODO add examples

+; TODO bump ABI to 6

+

+; Define the application name

+!define APPNAME "ncurses"

+!define EXENAME "ncurses.exe"

+

+!define VERSION_MAJOR "6"

+!define VERSION_MINOR "4"

+!define VERSION_YYYY  "2022"

+!define VERSION_MMDD  "1231"

+!define VERSION_PATCH ${VERSION_YYYY}${VERSION_MMDD}

+

+!define MY_ABI   "5"

+!define MY_MODEL "w"

+

+!define SUBKEY "ncurses"

+

+!define INSTALL "${APPNAME} (Console)"

+!define VERSION ${VERSION_MAJOR}.${VERSION_MINOR}

+!define VERSION_FULL  ${VERSION}-${VERSION_PATCH}

+

+; Main Install settings

+Name "${INSTALL}"

+InstallDir "c:\mingw"

+InstallDirRegKey HKLM "Software\${SUBKEY}" "$INSTDIR\bin"

+OutFile "NSIS-Output\${APPNAME}-${VERSION_FULL}-setup.exe"

+

+CRCCheck on

+SetCompressor /SOLID lzma

+

+VIAddVersionKey ProductName "${SUBKEY}"

+VIAddVersionKey CompanyName "https://invisible-island.net"

+VIAddVersionKey FileDescription "NCurses Installer (MinGW)"

+VIAddVersionKey FileVersion ${VERSION_FULL}

+VIAddVersionKey ProductVersion ${VERSION_FULL}

+VIAddVersionKey Comments "This installer was built with NSIS and cross-compiling to MinGW."

+VIAddVersionKey InternalName "${APPNAME}-${VERSION_FULL}-setup.exe"

+; This is a dotted set of numbers limited to 16-bits each

+VIProductVersion "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_YYYY}.${VERSION_MMDD}"

+

+; Modern interface settings

+!include "MUI.nsh"

+

+!define MUI_ABORTWARNING

+;!define MUI_FINISHPAGE_RUN

+;"$INSTDIR\bin\${EXENAME}"

+

+!insertmacro MUI_PAGE_WELCOME

+!insertmacro MUI_PAGE_LICENSE "..\COPYING"

+!insertmacro MUI_PAGE_COMPONENTS

+!insertmacro MUI_PAGE_DIRECTORY

+!insertmacro MUI_PAGE_INSTFILES

+!insertmacro MUI_PAGE_FINISH

+

+!insertmacro MUI_UNPAGE_CONFIRM

+!insertmacro MUI_UNPAGE_INSTFILES

+

+; Set languages (first is default language)

+!insertmacro MUI_LANGUAGE "English"

+!insertmacro MUI_RESERVEFILE_LANGDLL

+

+InstType "Full"		; SectionIn 1

+InstType "Typical"	; SectionIn 2

+InstType "Minimal"	; SectionIn 3

+

+Section "${APPNAME}" Section1

+

+	SectionIn 1 2 3

+

+	; Set Section properties

+	SetOverwrite on

+

+	; Set Section Files and Shortcuts

+	SetOutPath "$INSTDIR\bin"

+

+	File ".\bin\*.dll"

+

+	SetOutPath "$INSTDIR\share\${APPNAME}"

+	File /oname=README.txt "..\README"

+	File /oname=README-mingw.txt "..\README.mingw"

+

+	CreateDirectory "$SMPROGRAMS\${INSTALL}"

+	CreateShortCut "$SMPROGRAMS\${INSTALL}\${APPNAME}.lnk" "$INSTDIR\bin\${EXENAME}"

+	CreateShortCut "$SMPROGRAMS\${INSTALL}\Uninstall.lnk" "$INSTDIR\uninstall.exe"

+

+SectionEnd

+

+Section "development" Section2

+

+	SectionIn 1 2

+

+	; Set Section properties

+	SetOverwrite on

+

+	; Set Section Files and Shortcuts

+	SetOutPath "$INSTDIR\share\${APPNAME}"

+

+	SetOutPath "$INSTDIR\include\${APPNAME}${MY_MODEL}"

+

+	File ".\include\${APPNAME}${MY_MODEL}\*.h"

+

+	SetOutPath "$INSTDIR\lib"

+

+	File ".\lib\*.a"

+

+SectionEnd

+

+Section "examples" Section3

+

+	SectionIn 1

+

+	; Set Section properties

+	SetOverwrite on

+

+	; Set Section Files and Shortcuts

+	SetOutPath "$INSTDIR\lib\${APPNAME}"

+

+SectionEnd

+

+Section -FinishSection

+

+	WriteRegStr HKLM "Software\${SUBKEY}" "" "$INSTDIR"

+	WriteRegStr HKLM "Software\${SUBKEY}" "Environment" ""

+	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${INSTALL}" "DisplayName" "${APPNAME} ${VERSION_FULL} (Console)"

+	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${INSTALL}" "UninstallString" "$INSTDIR\uninstall.exe"

+	WriteUninstaller "$INSTDIR\uninstall.exe"

+

+SectionEnd

+

+; Modern install component descriptions

+!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN

+	!insertmacro MUI_DESCRIPTION_TEXT ${Section1} "${SUBKEY} runtime"

+	!insertmacro MUI_DESCRIPTION_TEXT ${Section2} "Development headers and libraries"

+	!insertmacro MUI_DESCRIPTION_TEXT ${Section3} "Examples"

+!insertmacro MUI_FUNCTION_DESCRIPTION_END

+

+;Uninstall section

+Section Uninstall

+

+	;Remove from registry...

+	DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${INSTALL}"

+	DeleteRegKey HKLM "SOFTWARE\${SUBKEY}"

+

+	; Delete self

+	Delete "$INSTDIR\uninstall.exe"

+

+	; Delete Shortcuts

+	Delete "$SMPROGRAMS\${INSTALL}\${APPNAME}.lnk"

+	Delete "$SMPROGRAMS\${INSTALL}\Uninstall.lnk"

+

+	; Clean up application

+	Delete "$INSTDIR\bin\libform${MY_MODEL}${MY_ABI}.dll"

+	Delete "$INSTDIR\bin\libmenu${MY_MODEL}${MY_ABI}.dll"

+	Delete "$INSTDIR\bin\libncurses++${MY_MODEL}${MY_ABI}.dll"

+	Delete "$INSTDIR\bin\libncurses${MY_MODEL}${MY_ABI}.dll"

+	Delete "$INSTDIR\bin\libpanel${MY_MODEL}${MY_ABI}.dll"

+

+	Delete "$INSTDIR\include\${APPNAME}${MY_MODEL}\*.h"

+

+	Delete "$INSTDIR\lib\libform${MY_MODEL}.a"

+	Delete "$INSTDIR\lib\libmenu${MY_MODEL}.a"

+	Delete "$INSTDIR\lib\libncurses++${MY_MODEL}.a"

+	Delete "$INSTDIR\lib\libncurses${MY_MODEL}.a"

+	Delete "$INSTDIR\lib\libpanel${MY_MODEL}.a"

+

+	Delete "$INSTDIR\lib\libform${MY_MODEL}.dll.a"

+	Delete "$INSTDIR\lib\libmenu${MY_MODEL}.dll.a"

+	Delete "$INSTDIR\lib\libncurses++${MY_MODEL}.dll.a"

+	Delete "$INSTDIR\lib\libncurses${MY_MODEL}.dll.a"

+	Delete "$INSTDIR\lib\libpanel${MY_MODEL}.dll.a"

+

+	Delete "$INSTDIR\lib\${APPNAME}\*.exe"

+

+	Delete "$INSTDIR\share\${APPNAME}\*.*"

+

+	; Remove remaining directories

+	RMDir "$SMPROGRAMS\${INSTALL}"

+	RMDir "$INSTDIR\share\${APPNAME}"

+	RMDir "$INSTDIR\share"

+	RMDir "$INSTDIR\lib\${APPNAME}"

+	RMDir "$INSTDIR\lib"

+	RMDir "$INSTDIR\include\${APPNAME}${MY_MODEL}"

+	RMDir "$INSTDIR\include"

+	RMDir "$INSTDIR\bin"

+	RMDir "$INSTDIR\"

+

+SectionEnd
\ No newline at end of file
diff --git a/package/mingw-ncurses.spec b/package/mingw-ncurses.spec
new file mode 100644
index 0000000..5e225d1
--- /dev/null
+++ b/package/mingw-ncurses.spec
@@ -0,0 +1,163 @@
+%?mingw_package_header
+
+Summary: shared libraries for terminal handling
+Name: mingw32-ncurses6
+Version: 6.4
+Release: 20221231
+License: X11
+Group: Development/Libraries
+Source: ncurses-%{version}-%{release}.tgz
+# URL: https://invisible-island.net/ncurses/
+
+BuildRequires:  mingw32-filesystem >= 95
+BuildRequires:  mingw32-gcc
+BuildRequires:  mingw32-binutils
+
+BuildRequires:  mingw64-filesystem >= 95
+BuildRequires:  mingw64-gcc
+BuildRequires:  mingw64-binutils
+
+%global MY_ABI 6
+
+%define CC_NORMAL -Wall -Wstrict-prototypes -Wmissing-prototypes -Wshadow -Wconversion
+%define CC_STRICT %{CC_NORMAL} -W -Wbad-function-cast -Wcast-align -Wcast-qual -Wmissing-declarations -Wnested-externs -Wpointer-arith -Wwrite-strings -ansi -pedantic
+
+%description -n mingw32-ncurses6
+Cross-compiling support for ncurses to mingw32.
+
+The ncurses library routines are a terminal-independent method of
+updating character screens with reasonable optimization.
+
+This package is used for testing ABI 6 with cross-compiles to MinGW.
+
+%package -n mingw64-ncurses6
+Summary:        Curses library for MinGW64
+
+%description -n mingw64-ncurses6
+Cross-compiling support for ncurses to mingw64.
+
+The ncurses library routines are a terminal-independent method of
+updating character screens with reasonable optimization.
+
+This package is used for testing ABI %{MY_ABI} with cross-compiles to MinGW.
+
+%prep
+
+%define CFG_OPTS \\\
+	--disable-db-install \\\
+	--disable-echo \\\
+	--disable-getcap \\\
+	--disable-hard-tabs \\\
+	--disable-leaks \\\
+	--disable-macros \\\
+	--disable-overwrite \\\
+	--disable-termcap \\\
+	--enable-interop \\\
+	--enable-opaque-curses \\\
+	--enable-opaque-form \\\
+	--enable-opaque-menu \\\
+	--enable-opaque-panel \\\
+	--enable-pc-files \\\
+	--enable-sp-funcs \\\
+	--enable-term-driver \\\
+	--enable-warnings \\\
+	--enable-wgetch-events \\\
+	--enable-widec \\\
+	--with-config-suffix=dev \\\
+	--verbose \\\
+	--with-cxx-shared \\\
+	--with-develop \\\
+	--with-fallbacks=unknown,xterm \\\
+	--with-tic-path=/usr/bin/tic%{MY_ABI} \\\
+	--with-infocmp-path=/usr/bin/infocmp%{MY_ABI} \\\
+	--with-install-prefix=$RPM_BUILD_ROOT \\\
+	--with-pc-suffix=%{MY_ABI} \\\
+	--with-pcre2 \\\
+	--with-shared \\\
+	--with-tparm-arg=intptr_t \\\
+	--with-trace \\\
+	--with-xterm-kbs=DEL \\\
+	--without-ada \\\
+	--without-debug \\\
+	--without-manpages \\\
+	--without-progs \\\
+	--without-tests
+
+%define debug_package %{nil}
+%setup -q -n ncurses-%{version}-%{release}
+
+%build
+mkdir BUILD-W32
+pushd BUILD-W32
+CFLAGS="%{CC_NORMAL}" \
+CC=%{mingw32_cc} \
+%mingw32_configure %{CFG_OPTS} \
+	--with-pkg-config-libdir=%{mingw32_libdir}/pkgconfig
+make
+popd
+
+mkdir BUILD-W64
+pushd BUILD-W64
+CFLAGS="%{CC_NORMAL}" \
+CC=%{mingw64_cc} \
+%mingw64_configure %{CFG_OPTS} \
+	--with-pkg-config-libdir=%{mingw64_libdir}/pkgconfig
+make
+popd
+
+%install
+rm -rf $RPM_BUILD_ROOT
+
+mkdir -p $RPM_BUILD_ROOT%{_bindir}
+
+pushd BUILD-W32
+%{mingw32_make} install.libs
+for name in $RPM_BUILD_ROOT%{mingw32_bindir}/*-config; \
+	do \
+		base=`basename $name`; \
+		ln -v $name $RPM_BUILD_ROOT%{_bindir}/%{mingw32_target}-$base; \
+	done
+popd
+
+pushd BUILD-W64
+%{mingw64_make} install.libs
+for name in $RPM_BUILD_ROOT%{mingw64_bindir}/*-config; \
+	do \
+		base=`basename $name`; \
+		ln -v $name $RPM_BUILD_ROOT%{_bindir}/%{mingw64_target}-$base; \
+	done
+popd
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%files -n mingw32-ncurses6
+%defattr(-,root,root,-)
+%{_bindir}/%{mingw32_target}-*
+%{mingw32_bindir}/*
+%{mingw32_includedir}/*
+%{mingw32_libdir}/*
+
+%files -n mingw64-ncurses6
+%defattr(-,root,root,-)
+%{_bindir}/%{mingw64_target}-*
+%{mingw64_bindir}/*
+%{mingw64_includedir}/*
+%{mingw64_libdir}/*
+
+%changelog
+
+* Sun Jun 30 2019 Thomas E. Dickey
+- use tic-path and infocmp-path options for fallbacks
+
+* Sat Feb 10 2018 Thomas E. Dickey
+- add several development features
+
+* Tue Dec 26 2017 Thomas E. Dickey
+- add --with-config-suffix option
+
+* Sat Sep 20 2014 Thomas E. Dickey
+- adjust install-rules for ncurses*-config
+
+* Sat Aug 03 2013 Thomas E. Dickey
+- initial version, using mingw-pdcurses package as a guide.
diff --git a/package/ncurses.map b/package/ncurses.map
new file mode 100644
index 0000000..7eb1ed1
--- /dev/null
+++ b/package/ncurses.map
@@ -0,0 +1,1219 @@
+# $Id: ncurses.map,v 1.55 2021/10/10 15:22:33 tom Exp $
+# script for shared library symbol-versioning using ld
+#
+# This file was generated by ncu-mapsyms
+# Configure options (5.0.19991023)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.1.20000708)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.2.20001021)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.3.20021019)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.4.20040208)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.5.20051010)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.6.20061217)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --with-hashed-db --with-termlib --with-ticlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.7.20081102)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --with-hashed-db --with-termlib --with-ticlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.8.20110226)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --with-broken_linker --with-hashed-db --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --with-hashed-db --with-termlib --with-ticlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.9.20110404)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --with-broken_linker --with-hashed-db --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --with-hashed-db --with-termlib --with-ticlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.9.20150530)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --with-broken_linker --with-hashed-db --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --with-hashed-db --with-termlib --with-ticlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace
+# Configure options (6.0.current)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --with-broken_linker --with-hashed-db --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --with-hashed-db --with-termlib --with-ticlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace
+
+NCURSES_5.0.19991023 {
+	global:
+		COLORS;
+		COLOR_PAIR;
+		COLOR_PAIRS;
+		ESCDELAY;
+		PAIR_NUMBER;
+		TYPE_ALNUM;
+		TYPE_ALPHA;
+		TYPE_ENUM;
+		TYPE_INTEGER;
+		TYPE_IPV4;
+		TYPE_NUMERIC;
+		TYPE_REGEXP;
+		_nc_Default_Field;	# deprecated in ABI6
+		_nc_Default_Form;	# deprecated in ABI6
+		_nc_free_and_exit;
+		_nc_has_mouse;	# deprecated in ABI6
+		_nc_panelhook;
+		_nc_ripoffline;
+		addch;
+		addchnstr;
+		addchstr;
+		addnstr;
+		addstr;
+		attr_get;
+		attr_off;
+		attr_on;
+		attr_set;
+		attroff;
+		attron;
+		attrset;
+		beep;
+		bkgd;
+		bkgdset;
+		border;
+		bottom_panel;
+		box;
+		can_change_color;
+		chgat;
+		clear;
+		clearok;
+		clrtobot;
+		clrtoeol;
+		color_content;
+		color_set;
+		copywin;
+		current_field;
+		current_item;
+		data_ahead;
+		data_behind;
+		del_panel;
+		delch;
+		deleteln;
+		delscreen;
+		delwin;
+		derwin;
+		doupdate;
+		dup_field;
+		dupwin;
+		dynamic_field_info;
+		echo;
+		echochar;
+		endwin;
+		field_arg;
+		field_back;
+		field_buffer;
+		field_count;
+		field_fore;
+		field_index;
+		field_info;
+		field_init;
+		field_just;
+		field_opts;
+		field_opts_off;
+		field_opts_on;
+		field_pad;
+		field_status;
+		field_term;
+		field_type;
+		field_userptr;
+		filter;
+		flash;
+		form_driver;
+		form_fields;
+		form_init;
+		form_opts;
+		form_opts_off;
+		form_opts_on;
+		form_page;
+		form_request_by_name;
+		form_request_name;
+		form_sub;
+		form_term;
+		form_userptr;
+		form_win;
+		free_field;
+		free_fieldtype;
+		free_form;
+		free_item;
+		free_menu;
+		getbkgd;
+		getch;
+		getmouse;
+		getnstr;
+		getstr;
+		getwin;
+		has_colors;
+		hide_panel;
+		hline;
+		immedok;
+		inch;
+		inchnstr;
+		inchstr;
+		init_color;
+		init_pair;
+		initscr;
+		innstr;
+		insch;
+		insdelln;
+		insertln;
+		insnstr;
+		insstr;
+		instr;
+		is_linetouched;
+		is_wintouched;
+		isendwin;
+		item_count;
+		item_description;
+		item_index;
+		item_init;
+		item_name;
+		item_opts;
+		item_opts_off;
+		item_opts_on;
+		item_term;
+		item_userptr;
+		item_value;
+		item_visible;
+		leaveok;
+		link_field;
+		link_fieldtype;
+		mcprint;
+		menu_back;
+		menu_driver;
+		menu_fore;
+		menu_format;
+		menu_grey;
+		menu_init;
+		menu_items;
+		menu_mark;
+		menu_opts;
+		menu_opts_off;
+		menu_opts_on;
+		menu_pad;
+		menu_pattern;
+		menu_request_by_name;
+		menu_request_name;
+		menu_spacing;
+		menu_sub;
+		menu_term;
+		menu_userptr;
+		menu_win;
+		mouse_trafo;
+		mouseinterval;
+		mousemask;
+		move;
+		move_field;
+		move_panel;
+		mvaddch;
+		mvaddchnstr;
+		mvaddchstr;
+		mvaddnstr;
+		mvaddstr;
+		mvchgat;
+		mvcur;
+		mvdelch;
+		mvderwin;
+		mvgetch;
+		mvgetnstr;
+		mvgetstr;
+		mvhline;
+		mvinch;
+		mvinchnstr;
+		mvinchstr;
+		mvinnstr;
+		mvinsch;
+		mvinsnstr;
+		mvinsstr;
+		mvinstr;
+		mvprintw;
+		mvscanw;
+		mvvline;
+		mvwaddch;
+		mvwaddchnstr;
+		mvwaddchstr;
+		mvwaddnstr;
+		mvwaddstr;
+		mvwchgat;
+		mvwdelch;
+		mvwgetch;
+		mvwgetnstr;
+		mvwgetstr;
+		mvwhline;
+		mvwin;
+		mvwinch;
+		mvwinchnstr;
+		mvwinchstr;
+		mvwinnstr;
+		mvwinsch;
+		mvwinsnstr;
+		mvwinsstr;
+		mvwinstr;
+		mvwprintw;
+		mvwscanw;
+		mvwvline;
+		new_field;
+		new_fieldtype;
+		new_form;
+		new_item;
+		new_menu;
+		new_page;
+		new_panel;
+		newpad;
+		newterm;
+		newwin;
+		nl;
+		noecho;
+		nonl;
+		overlay;
+		overwrite;
+		pair_content;
+		panel_above;
+		panel_below;
+		panel_hidden;
+		panel_userptr;
+		panel_window;
+		pechochar;
+		pnoutrefresh;
+		pos_form_cursor;
+		pos_menu_cursor;
+		post_form;
+		post_menu;
+		prefresh;
+		printw;
+		putwin;
+		redrawwin;
+		refresh;
+		replace_panel;
+		resizeterm;
+		restartterm;
+		ripoffline;
+		scale_form;
+		scale_menu;
+		scanw;
+		scr_dump;
+		scr_init;
+		scr_restore;
+		scr_set;
+		scrl;
+		scroll;
+		scrollok;
+		set_current_field;
+		set_current_item;
+		set_field_back;
+		set_field_buffer;
+		set_field_fore;
+		set_field_init;
+		set_field_just;
+		set_field_opts;
+		set_field_pad;
+		set_field_status;
+		set_field_term;
+		set_field_type;
+		set_field_userptr;
+		set_fieldtype_arg;
+		set_fieldtype_choice;
+		set_form_fields;
+		set_form_init;
+		set_form_opts;
+		set_form_page;
+		set_form_sub;
+		set_form_term;
+		set_form_userptr;
+		set_form_win;
+		set_item_init;
+		set_item_opts;
+		set_item_term;
+		set_item_userptr;
+		set_item_value;
+		set_max_field;
+		set_menu_back;
+		set_menu_fore;
+		set_menu_format;
+		set_menu_grey;
+		set_menu_init;
+		set_menu_items;
+		set_menu_mark;
+		set_menu_opts;
+		set_menu_pad;
+		set_menu_pattern;
+		set_menu_spacing;
+		set_menu_sub;
+		set_menu_term;
+		set_menu_userptr;
+		set_menu_win;
+		set_new_page;
+		set_panel_userptr;
+		set_term;
+		set_top_row;
+		setscrreg;
+		show_panel;
+		slk_attr;
+		slk_attr_off;
+		slk_attr_on;
+		slk_attr_set;
+		slk_attroff;
+		slk_attron;
+		slk_attrset;
+		slk_clear;
+		slk_color;
+		slk_init;
+		slk_label;
+		slk_noutrefresh;
+		slk_refresh;
+		slk_restore;
+		slk_set;
+		slk_touch;
+		standend;
+		standout;
+		start_color;
+		subpad;
+		subwin;
+		syncok;
+		termattrs;
+		timeout;
+		top_panel;
+		top_row;
+		ungetch;
+		ungetmouse;
+		unpost_form;
+		unpost_menu;
+		untouchwin;
+		update_panels;
+		use_default_colors;
+		vid_attr;
+		vidattr;
+		vidputs;
+		vline;
+		vw_printw;
+		vw_scanw;
+		vwprintw;
+		vwscanw;
+		waddch;
+		waddchnstr;
+		waddchstr;
+		waddnstr;
+		waddstr;
+		wattr_get;
+		wattr_off;
+		wattr_on;
+		wattr_set;
+		wattroff;
+		wattron;
+		wattrset;
+		wbkgd;
+		wbkgdset;
+		wborder;
+		wchgat;
+		wclear;
+		wclrtobot;
+		wclrtoeol;
+		wcolor_set;
+		wcursyncup;
+		wdelch;
+		wdeleteln;
+		wechochar;
+		wenclose;
+		werase;
+		wgetch;
+		wgetnstr;
+		wgetstr;
+		whline;
+		winch;
+		winchnstr;
+		winchstr;
+		winnstr;
+		winsch;
+		winsdelln;
+		winsertln;
+		winsnstr;
+		winsstr;
+		winstr;
+		wmouse_trafo;
+		wmove;
+		wnoutrefresh;
+		wprintw;
+		wredrawln;
+		wrefresh;
+		wresize;
+		wscanw;
+		wscrl;
+		wsetscrreg;
+		wstandend;
+		wstandout;
+		wsyncdown;
+		wsyncup;
+		wtouchln;
+		wvline;
+	local:
+		_nc_Calculate_Item_Length_and_Width;
+		_nc_Connect_Items;
+		_nc_Copy_Argument;
+		_nc_Copy_Type;
+		_nc_Default_FieldType;
+		_nc_Default_Item;
+		_nc_Default_Menu;
+		_nc_Disconnect_Items;
+		_nc_Draw_Menu;
+		_nc_First_Active_Field;
+		_nc_Free_Argument;
+		_nc_Free_Type;
+		_nc_Internal_Validation;
+		_nc_Link_Items;
+		_nc_Make_Argument;
+		_nc_Match_Next_Character_In_Item_Name;
+		_nc_New_TopRow_and_CurrentItem;
+		_nc_Position_Form_Cursor;
+		_nc_Post_Item;
+		_nc_Refresh_Current_Field;
+		_nc_Set_Current_Field;
+		_nc_Set_Form_Page;
+		_nc_Show_Menu;
+		_nc_Synchronize_Attributes;
+		_nc_Synchronize_Options;
+		_nc_background;
+		_nc_do_color;
+		_nc_expanded;
+		_nc_freewin;
+		_nc_hash_map;
+		_nc_lib_traceatr;
+		_nc_lib_tracedmp;
+		_nc_lib_tracemouse;
+		_nc_make_oldhash;
+		_nc_makenew;
+		_nc_memmove;
+		_nc_menu_cursor_pos;
+		_nc_msec_cost;
+		_nc_mvcur_init;
+		_nc_mvcur_resume;
+		_nc_mvcur_wrap;
+		_nc_oldnums;
+		_nc_outstr;
+		_nc_printf_string;
+		_nc_render;
+		_nc_screen_init;
+		_nc_screen_resume;
+		_nc_screen_wrap;
+		_nc_scroll_oldhash;
+		_nc_scroll_optimize;
+		_nc_scroll_window;
+		_nc_scrolln;
+		_nc_setupscreen;
+		_nc_sigaction;
+		_nc_signal_handler;
+		_nc_slk_format;
+		_nc_slk_initialize;
+		_nc_synchook;
+		_nc_trace_xnames;
+		_nc_vsscanf;
+		_nc_waddch_nosync;
+};
+
+NCURSES_5.1.20000708 {
+	global:
+		assume_default_colors;
+		erase;
+		touchline;
+		touchwin;
+} NCURSES_5.0.19991023;
+
+NCURSES_5.3.20021019 {
+	global:
+		is_term_resized;
+		resize_term;
+	local:
+		_nc_reset_colors;
+		_nc_varargs;
+		_nc_wgetch;
+} NCURSES_5.1.20000708;
+
+NCURSES_5.4.20040208 {
+	global:
+		_nc_optimize_enable;
+	local:
+		_nc_Touchline;
+		_nc_Touchpan;
+		_nc_Wnoutrefresh;
+		_nc_dPanel;
+		_nc_dStack;
+		_nc_fifo_dump;
+		_nc_insert_ch;
+		_nc_linedump;
+		_nc_my_visbuf;
+		_tracedump;
+		_tracemouse;
+} NCURSES_5.3.20021019;
+
+NCURSES_5.5.20051010 {
+	local:
+		_nc_Calculate_Text_Width;
+		_nc_retrace_field;
+		_nc_retrace_field_ptr;
+		_nc_retrace_field_type;
+		_nc_retrace_form;
+		_nc_retrace_form_hook;
+		_nc_retrace_item;
+		_nc_retrace_item_opts;
+		_nc_retrace_item_ptr;
+		_nc_retrace_menu;
+		_nc_retrace_menu_hook;
+		_nc_retrace_menu_opts;
+		_nc_retrace_panel;
+} NCURSES_5.4.20040208;
+
+NCURSES_5.6.20061217 {
+	global:
+		getbegx;
+		getbegy;
+		getcurx;
+		getcury;
+		getmaxx;
+		getmaxy;
+		getparx;
+		getpary;
+		nofilter;
+		use_legacy_coding;
+		wgetch_events;
+		wgetnstr_events;
+} NCURSES_5.5.20051010;
+
+NCURSES_5.7.20081102 {
+	global:
+		getattrs;
+		is_cleared;
+		is_idcok;
+		is_idlok;
+		is_immedok;
+		is_keypad;
+		is_leaveok;
+		is_nodelay;
+		is_notimeout;
+		is_scrollok;
+		is_syncok;
+		set_escdelay;
+		use_screen;
+		use_window;
+		wgetparent;
+		wgetscrreg;
+	local:
+		_nc_tracemouse;
+		_nc_ungetch;
+} NCURSES_5.6.20061217;
+
+NCURSES_5.8.20110226 {
+	global:
+		_nc_panelhook_sp;
+		assume_default_colors_sp;
+		beep_sp;
+		can_change_color_sp;
+		ceiling_panel;
+		color_content_sp;
+		doupdate_sp;
+		echo_sp;
+		endwin_sp;
+		filter_sp;
+		flash_sp;
+		get_escdelay;
+		get_escdelay_sp;
+		getmouse_sp;
+		getwin_sp;
+		ground_panel;
+		has_colors_sp;
+		has_mouse;
+		has_mouse_sp;
+		init_color_sp;
+		init_pair_sp;
+		is_pad;
+		is_subwin;
+		is_term_resized_sp;
+		isendwin_sp;
+		mcprint_sp;
+		mouseinterval_sp;
+		mousemask_sp;
+		mvcur_sp;
+		new_form_sp;
+		new_menu_sp;
+		newpad_sp;
+		newterm_sp;
+		newwin_sp;
+		nl_sp;
+		noecho_sp;
+		nofilter_sp;
+		nonl_sp;
+		pair_content_sp;
+		resize_term_sp;
+		resizeterm_sp;
+		restartterm_sp;
+		ripoffline_sp;
+		scr_init_sp;
+		scr_restore_sp;
+		scr_set_sp;
+		set_escdelay_sp;
+		slk_attr_set_sp;
+		slk_attr_sp;
+		slk_attroff_sp;
+		slk_attron_sp;
+		slk_attrset_sp;
+		slk_clear_sp;
+		slk_color_sp;
+		slk_init_sp;
+		slk_label_sp;
+		slk_noutrefresh_sp;
+		slk_refresh_sp;
+		slk_restore_sp;
+		slk_set_sp;
+		slk_touch_sp;
+		start_color_sp;
+		termattrs_sp;
+		ungetch_sp;
+		ungetmouse_sp;
+		update_panels_sp;
+		use_default_colors_sp;
+		use_legacy_coding_sp;
+		vidattr_sp;
+		vidputs_sp;
+	local:
+		_nc_TYPE_ALNUM;
+		_nc_TYPE_ALPHA;
+		_nc_TYPE_ENUM;
+		_nc_TYPE_INTEGER;
+		_nc_TYPE_IPV4;
+		_nc_TYPE_NUMERIC;
+		_nc_TYPE_REGEXP;
+		_nc_curscr_of;
+		_nc_do_color_sp;
+		_nc_form_cursor;
+		_nc_format_slks;
+		_nc_free_and_exit_sp;
+		_nc_freeall_sp;
+		_nc_fty_generic;
+		_nc_generic_fieldtype;
+		_nc_get_fieldbuffer;
+		_nc_hash_map_sp;
+		_nc_linedump_sp;
+		_nc_make_oldhash_sp;
+		_nc_makenew_sp;
+		_nc_msec_cost_sp;
+		_nc_mvcur_init_sp;
+		_nc_mvcur_resume_sp;
+		_nc_mvcur_wrap_sp;
+		_nc_newscr_of;
+		_nc_printf_string_sp;
+		_nc_reset_colors_sp;
+		_nc_retrace_mmask_t;
+		_nc_ripoffline_sp;
+		_nc_screen_init_sp;
+		_nc_screen_resume_sp;
+		_nc_screen_wrap_sp;
+		_nc_scroll_oldhash_sp;
+		_nc_scroll_optimize_sp;
+		_nc_scrolln_sp;
+		_nc_set_generic_fieldtype;
+		_nc_setupscreen_sp;
+		_nc_stdscr_of;
+} NCURSES_5.7.20081102;
+
+NCURSES_5.9.20150530 {
+	global:
+		wgetdelay;
+	local:
+		_nc_mvcur;
+		_nc_mvcur_sp;
+		_nc_trace_mmask_t;
+} NCURSES_5.8.20110226;
+
+NCURSES_6.1.20171230 {
+	global:
+		alloc_pair;
+		alloc_pair_sp;
+		extended_color_content;
+		extended_color_content_sp;
+		extended_pair_content;
+		extended_pair_content_sp;
+		find_pair;
+		find_pair_sp;
+		free_pair;
+		free_pair_sp;
+		init_extended_color;
+		init_extended_color_sp;
+		init_extended_pair;
+		init_extended_pair_sp;
+		reset_color_pairs;
+		reset_color_pairs_sp;
+		unfocus_current_field;
+	local:
+		_nc_Unset_Current_Field;
+		_nc_change_pair;
+		_nc_init_color;
+		_nc_init_pair;
+		_nc_pair_content;
+		_nc_reset_color_pair;
+		_nc_set_color_pair;
+} NCURSES_5.9.20150530;
+
+NCURSES_6.2.20200212 {
+	global:
+		exit_curses;
+	local:
+		_*;
+} NCURSES_6.1.20171230;
+
+NCURSES_TIC_5.0.19991023 {
+	global:
+		_nc_capcmp;
+		_nc_check_termtype;
+		_nc_entry_match;
+		_nc_infotocap;
+		_nc_read_entry_source;
+		_nc_reset_input;
+		_nc_resolve_uses;
+		_nc_set_writedir;
+		_nc_syntax;
+		_nc_tic_expand;
+		_nc_tic_written;
+		_nc_trans_string;
+		_nc_write_entry;
+	local:
+		_nc_captoinfo;
+		_nc_comment_end;
+		_nc_comment_start;
+		_nc_copy_entry;
+		_nc_curr_file_pos;
+		_nc_curr_token;
+		_nc_get_token;
+		_nc_init_entry;
+		_nc_merge_entry;
+		_nc_panic_mode;
+		_nc_parse_entry;
+		_nc_push_token;
+		_nc_save_str;
+		_nc_start_line;
+		_nc_wrap_entry;
+};
+
+NCURSES_TIC_5.1.20000708 {
+	global:
+		_nc_disable_period;
+} NCURSES_TIC_5.0.19991023;
+
+NCURSES_TIC_5.5.20051010 {
+	global:
+		_nc_alloc_entry_leaks;
+		_nc_captoinfo_leaks;
+		_nc_check_termtype2;
+		_nc_comp_scan_leaks;
+		_nc_resolve_uses2;
+} NCURSES_TIC_5.1.20000708;
+
+NCURSES_TIC_5.7.20081102 {
+	global:
+		_nc_free_tic;
+	local:
+		_nc_comp_captab_leaks;
+		_nc_leaks_tic;
+} NCURSES_TIC_5.5.20051010;
+
+NCURSES_TIC_5.9.20150530 {
+	global:
+		_nc_strict_bsd;
+} NCURSES_TIC_5.7.20081102;
+
+NCURSES_TIC_6.1.20171230 {
+	global:
+		_nc_read_entry2;
+		_nc_write_object;
+	local:
+		_*;
+} NCURSES_TIC_5.9.20150530;
+
+NCURSES_TINFO_5.0.19991023 {
+	global:
+		BC;
+		COLS;
+		LINES;
+		PC;
+		SP;
+		TABSIZE;
+		UP;
+		_nc_access;
+		_nc_add_to_try;
+		_nc_copy_termtype;
+		_nc_curr_col;
+		_nc_curr_line;
+		_nc_doalloc;
+		_nc_err_abort;
+		_nc_fallback;
+		_nc_find_entry;
+		_nc_find_type_entry;
+		_nc_first_name;
+		_nc_free_entries;
+		_nc_free_termtype;
+		_nc_free_tparm;
+		_nc_freeall;
+		_nc_get_hash_table;
+		_nc_get_table;
+		_nc_get_tty_mode;
+		_nc_get_type;
+		_nc_getenv_num;
+		_nc_head;
+		_nc_home_terminfo;
+		_nc_info_hash_table;
+		_nc_init_acs;
+		_nc_keep_tic_dir;
+		_nc_keypad;
+		_nc_name_match;
+		_nc_outch;
+		_nc_read_entry;
+		_nc_read_file_entry;
+		_nc_screen_chain;
+		_nc_set_buffer;
+		_nc_set_source;
+		_nc_set_tty_mode;
+		_nc_set_type;
+		_nc_suppress_warnings;
+		_nc_syserr_abort;
+		_nc_tail;
+		_nc_tic_dir;
+		_nc_timed_wait;
+		_nc_tinfo_fkeysf;
+		_nc_trace_buf;
+		_nc_tracing;
+		_nc_update_screensize;
+		_nc_visbuf;
+		_nc_visbuf2;
+		_nc_warning;
+		_tracechar;
+		acs_map;
+		baudrate;
+		boolcodes;
+		boolfnames;
+		boolnames;
+		cbreak;
+		cur_term;
+		curs_set;
+		curscr;
+		curses_version;
+		def_prog_mode;
+		def_shell_mode;
+		define_key;
+		del_curterm;
+		delay_output;
+		erasechar;
+		flushinp;
+		halfdelay;
+		has_ic;
+		has_il;
+		has_key;
+		idcok;
+		idlok;
+		intrflush;
+		keybound;
+		keyname;
+		keyok;
+		keypad;
+		killchar;
+		longname;
+		meta;
+		napms;
+		newscr;
+		nocbreak;
+		nodelay;
+		noqiflush;
+		noraw;
+		notimeout;
+		numcodes;
+		numfnames;
+		numnames;
+		ospeed;
+		putp;
+		qiflush;
+		raw;
+		reset_prog_mode;
+		reset_shell_mode;
+		resetty;
+		savetty;
+		set_curterm;
+		setupterm;
+		stdscr;
+		strcodes;
+		strfnames;
+		strnames;
+		termname;
+		tgetent;
+		tgetflag;
+		tgetnum;
+		tgetstr;
+		tgoto;
+		tigetflag;
+		tigetnum;
+		tigetstr;
+		tparm;
+		tputs;
+		trace;
+		ttytype;
+		typeahead;
+		unctrl;
+		use_env;
+		wtimeout;
+	local:
+		_nc_baudrate;
+		_nc_cap_hash_table;
+		_nc_capalias_table;
+		_nc_expand_try;
+		_nc_infoalias_table;
+		_nc_init_keytry;
+		_nc_key_names;
+		_nc_nulls_sent;
+		_nc_ospeed;
+		_nc_read_termcap;
+		_nc_read_termcap_entry;
+		_nc_remove_key;
+		_nc_remove_string;
+		_nc_trace_tries;
+		_nc_tracebits;
+};
+
+NCURSES_TINFO_5.1.20000708 {
+	global:
+		_nc_align_termtype;
+		_nc_flush;
+		_nc_tinfo_fkeys;
+		_nc_user_definable;
+		use_extended_names;
+} NCURSES_TINFO_5.0.19991023;
+
+NCURSES_TINFO_5.2.20001021 {
+	global:
+		_nc_basename;
+		_nc_env_access;
+		_nc_safe_strcat;
+		_nc_safe_strcpy;
+		_nc_str_copy;
+		_nc_str_init;
+		_nc_str_null;
+} NCURSES_TINFO_5.1.20000708;
+
+NCURSES_TINFO_5.3.20021019 {
+	global:
+		_nc_rootname;
+		_nc_tparm_err;
+		_nc_visbufn;
+} NCURSES_TINFO_5.2.20001021;
+
+NCURSES_TINFO_5.4.20040208 {
+	global:
+		_nc_get_locale;
+		_nc_locale_breaks_acs;
+		_nc_outchars;
+		_nc_pathlast;
+		_nc_retrace_attr_t;
+		_nc_retrace_bool;
+		_nc_retrace_chtype;
+		_nc_retrace_int;
+		_nc_retrace_ptr;
+		_nc_retrace_sp;
+		_nc_retrace_unsigned;
+		_nc_retrace_win;
+		_nc_tparm_analyze;
+		_nc_tputs_trace;
+		_nc_trace_bufcat;
+		_nc_unicode_locale;
+		_traceattr;
+		_traceattr2;
+		_tracechtype;
+		_tracechtype2;
+		_tracef;
+		key_defined;
+	local:
+		_nc_altcharset_name;
+		_nc_trace_ttymode;
+} NCURSES_TINFO_5.3.20021019;
+
+NCURSES_TINFO_5.5.20051010 {
+	global:
+		_nc_get_source;
+		_nc_retrace_cptr;
+		_nc_retrace_cvoid_ptr;
+		_nc_retrace_void_ptr;
+		_nc_setupterm;
+		_nc_trim_sgr0;
+	local:
+		_nc_delink_entry;
+		_nc_free_entry;
+} NCURSES_TINFO_5.4.20040208;
+
+NCURSES_TINFO_5.6.20061217 {
+	global:
+		_nc_db_close;
+		_nc_db_first;
+		_nc_db_have_data;
+		_nc_db_next;
+		_nc_db_open;
+		_nc_db_put;
+		_nc_eventlist_timeout;
+		_nc_first_db;
+		_nc_handle_sigwinch;
+		_nc_is_abs_path;
+		_nc_is_dir_path;
+		_nc_is_file_path;
+		_nc_keyname_leaks;
+		_nc_last_db;
+		_nc_next_db;
+		_nc_read_termtype;
+		_nc_tgetent_leaks;
+		_nc_viscbuf;
+	local:
+		_nc_db_get;
+		_nc_db_have_index;
+		_nc_hashed_db;
+		_nc_viscbuf2;
+} NCURSES_TINFO_5.5.20051010;
+
+NCURSES_TINFO_5.7.20081102 {
+	global:
+		_nc_free_tinfo;
+		_nc_get_alias_table;
+		_nc_get_screensize;
+		_nc_globals;
+		_nc_leaks_tinfo;
+		_nc_prescreen;
+		_nc_screen_of;
+		_nc_set_no_padding;
+		_nc_tracechar;
+		set_tabsize;
+	local:
+		_nc_keyname;
+		_nc_unctrl;
+} NCURSES_TINFO_5.6.20061217;
+
+NCURSES_TINFO_5.8.20110226 {
+	global:
+		_nc_flush_sp;
+		_nc_get_tty_mode_sp;
+		_nc_init_acs_sp;
+		_nc_outc_wrapper;
+		_nc_outch_sp;
+		_nc_putp;
+		_nc_putp_flush;
+		_nc_putp_flush_sp;
+		_nc_putp_sp;
+		_nc_retrace_int_attr_t;
+		_nc_set_buffer_sp;
+		_nc_set_tty_mode_sp;
+		baudrate_sp;
+		cbreak_sp;
+		curs_set_sp;
+		def_prog_mode_sp;
+		def_shell_mode_sp;
+		define_key_sp;
+		del_curterm_sp;
+		delay_output_sp;
+		erasechar_sp;
+		flushinp_sp;
+		halfdelay_sp;
+		has_ic_sp;
+		has_il_sp;
+		has_key_sp;
+		intrflush_sp;
+		key_defined_sp;
+		keybound_sp;
+		keyname_sp;
+		keyok_sp;
+		killchar_sp;
+		longname_sp;
+		napms_sp;
+		new_prescr;
+		nocbreak_sp;
+		noqiflush_sp;
+		noraw_sp;
+		putp_sp;
+		qiflush_sp;
+		raw_sp;
+		reset_prog_mode_sp;
+		reset_shell_mode_sp;
+		resetty_sp;
+		savetty_sp;
+		set_curterm_sp;
+		set_tabsize_sp;
+		termname_sp;
+		tgetent_sp;
+		tgetflag_sp;
+		tgetnum_sp;
+		tgetstr_sp;
+		tigetflag_sp;
+		tigetnum_sp;
+		tigetstr_sp;
+		tiparm;
+		tputs_sp;
+		typeahead_sp;
+		unctrl_sp;
+		use_env_sp;
+	local:
+		_nc_get_hash_info;
+		_nc_retrace_char;
+		_nc_setup_tinfo;
+		_nc_tinfo_cmdch;
+} NCURSES_TINFO_5.7.20081102;
+
+NCURSES_TINFO_5.9.20150530 {
+	global:
+		_nc_init_termtype;
+		_nc_putchar;
+		_nc_putchar_sp;
+		use_tioctl;
+		use_tioctl_sp;
+	local:
+		_nc_comp_error_leaks;
+		_nc_db_iterator_leaks;
+		_nc_setenv_num;
+} NCURSES_TINFO_5.8.20110226;
+
+NCURSES_TINFO_6.1.20171230 {
+	global:
+		_nc_copy_termtype2;
+		_nc_export_termtype2;
+		_nc_fallback2;
+		_nc_free_termtype2;
+} NCURSES_TINFO_5.9.20150530;
+
+NCURSES_TINFO_6.2.20200212 {
+	global:
+		_nc_find_user_entry;
+		_nc_fmt_funcptr;
+		_nc_wacs_width;
+		curses_trace;
+		exit_terminfo;
+} NCURSES_TINFO_6.1.20171230;
+
+NCURSES_TINFO_6.2.20211010 {
+	global:
+		_nc_reset_tparm;
+		_nc_safe_fopen;
+		_nc_safe_open3;
+		_nc_tiparm;
+	local:
+		_*;
+} NCURSES_TINFO_6.2.20200212;
diff --git a/package/ncurses.spec b/package/ncurses.spec
new file mode 100644
index 0000000..72d4e24
--- /dev/null
+++ b/package/ncurses.spec
@@ -0,0 +1,188 @@
+Summary: shared libraries for terminal handling
+Name: ncurses6
+Version: 6.4
+Release: 20221231
+License: X11
+Group: Development/Libraries
+Source: ncurses-%{version}-%{release}.tgz
+# URL: https://invisible-island.net/ncurses/
+
+%global MY_ABI 6
+
+# save value before redefining
+%global sys_libdir %{_libdir}
+
+# was redefined...
+#global _prefix /usr/local/ncurses#{MY_ABI}
+
+%global MY_PKG %{sys_libdir}/pkgconfig
+%define MYDATA /usr/local/ncurses/share/terminfo
+
+%description
+The ncurses library routines are a terminal-independent method of
+updating character screens with reasonable optimization.
+
+This package is used for testing ABI %{MY_ABI}.
+
+%prep
+
+%global is_mandriva %(test -f /etc/mandriva-release && echo 1 || echo 0)
+%global is_fedora   %(test -f /usr/bin/dnf && echo 1 || echo 0)
+%global is_centos   %(test -f /etc/centos-release && echo 1 || echo 0)
+%global is_redhat   %(test -f /etc/redhat-release && echo 1 || echo 0)
+%global is_scilinux %(test -f /etc/sl-release && echo 1 || echo 0)
+%global is_suse     %(test -f /etc/SuSE-release && echo 1 || echo 0)
+
+%if %{is_redhat}
+# generate debug/debug-source packages.
+%else
+%define debug_package %{nil}
+%endif
+
+%if %{is_mandriva}
+%define _disable_ld_as_needed 1
+%define _disable_ld_no_undefined 1
+# libtool is not used here...
+%define _disable_libtoolize 1
+%define _disable_ld_build_id 1
+%endif
+
+%if %{is_fedora} || %{is_scilinux} || %{is_centos}
+# workaround for toolset breakage in Fedora 28
+%define _test_relink --enable-relink
+%else
+%define _test_relink --disable-relink
+%endif
+
+%setup -q -n ncurses-%{version}-%{release}
+
+%build
+%define CFG_OPTS \\\
+	--target %{_target_platform} \\\
+	--prefix=%{_prefix} \\\
+	--bindir=%{_bindir} \\\
+	--includedir=%{_includedir} \\\
+	--libdir=%{_libdir} \\\
+	--includedir='${prefix}/include' \\\
+	--disable-echo \\\
+	--disable-getcap \\\
+	--disable-leaks \\\
+	--disable-macros  \\\
+	--disable-overwrite  \\\
+	%{_test_relink}  \\\
+	--disable-termcap \\\
+	--enable-hard-tabs \\\
+	--enable-opaque-curses \\\
+	--enable-opaque-form \\\
+	--enable-opaque-menu \\\
+	--enable-opaque-panel \\\
+	--enable-pc-files \\\
+	--disable-rpath \\\
+	--enable-stdnoreturn \\\
+	--enable-warnings \\\
+	--enable-wgetch-events \\\
+	--enable-widec \\\
+	--enable-xmc-glitch \\\
+	--program-suffix=%{MY_ABI} \\\
+	--verbose \\\
+	--with-abi-version=%{MY_ABI} \\\
+	--with-config-suffix=dev \\\
+	--with-cxx-shared \\\
+	--with-default-terminfo-dir=%{MYDATA} \\\
+	--with-develop \\\
+	--with-extra-suffix=%{MY_ABI} \\\
+	--with-install-prefix=$RPM_BUILD_ROOT \\\
+	--with-pkg-config-libdir=%{MY_PKG} \\\
+	--with-shared \\\
+	--with-terminfo-dirs=%{MYDATA}:/usr/share/terminfo \\\
+	--with-termlib \\\
+	--with-ticlib \\\
+	--with-trace \\\
+	--with-versioned-syms \\\
+	--with-xterm-kbs=DEL \\\
+	--without-ada \\\
+	--without-debug \\\
+	--without-normal
+
+%configure %{CFG_OPTS}
+
+make
+
+%install
+rm -rf $RPM_BUILD_ROOT
+
+make install.libs install.progs
+rm -f test/ncurses
+( cd test && make ncurses LOCAL_LIBDIR=%{_libdir} && mv ncurses $RPM_BUILD_ROOT/%{_bindir}/ncurses%{MY_ABI} )
+
+%if %{is_mandriva}
+# check this first because Mageia has the /etc/redhat-release file...
+%else
+%if %{is_fedora}
+%ldconfig_scriptlets libs
+%ldconfig_scriptlets c++-libs
+%endif
+%endif
+
+%clean
+if rm -rf $RPM_BUILD_ROOT; then
+  echo OK
+else
+  find $RPM_BUILD_ROOT -type f | grep -F -v /.nfs && exit 1
+fi
+exit 0
+
+%files
+%defattr(-,root,root,-)
+%{_bindir}/*
+%{_includedir}/*
+%{_libdir}/*
+
+%changelog
+
+* Sat Oct 16 2021 Thomas Dickey
+- disable rpath to address QA_RPATHS=1 warning.
+
+* Tue Dec 24 2019 Thomas Dickey
+- drop custom CC_NORMAL warning flags because setting CFLAGS interferes with
+  matching Fedora's PIE/PIC configuration.  Also, generate debug/debug-source
+  packages.
+
+* Sat Nov 16 2019 Thomas Dickey
+- modify clean-rule to work around Fedora NFS bugs.
+
+* Sat Aug 25 2018 Thomas E. Dickey
+- split spec-file into ncurses6 and ncursest6 to work around toolset breakage
+  in Fedora 28
+
+* Sat Jun 02 2018 Thomas E. Dickey
+- build-fix for Mageia
+
+* Sat May 26 2018 Thomas E. Dickey
+- use predefined configure-macro
+- separate ncurses6/ncursest6 packages
+
+* Sat Feb 10 2018 Thomas E. Dickey
+- add ncursest6 package
+- add several development features
+
+* Mon Jan 01 2018 Thomas E. Dickey
+- drop redundant files pattern for "*.pc"
+
+* Tue Dec 26 2017 Thomas E. Dickey
+- add --with-config-suffix option
+
+* Sun Apr 26 2015 Thomas E. Dickey
+- move package to /usr
+
+* Sun Apr 12 2015 Thomas E. Dickey
+- factor-out MY_ABI
+
+* Sat Mar 09 2013 Thomas E. Dickey
+- add --with-cxx-shared option to demonstrate c++ binding as shared library
+
+* Sat Oct 27 2012 Thomas E. Dickey
+- add ncurses program as "ncurses6" to provide demonstration.
+
+* Fri Jun 08 2012 Thomas E. Dickey
+- initial version.
diff --git a/package/ncurses.sym b/package/ncurses.sym
new file mode 100644
index 0000000..d2f6fbc
--- /dev/null
+++ b/package/ncurses.sym
@@ -0,0 +1,890 @@
+# $Id: ncurses.sym,v 1.37 2021/08/19 23:50:26 tom Exp $
+# script for shared library symbol-visibility using libtool
+#
+# This file was generated by ncu-mapsyms
+# Configure options (5.0.19991023)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.1.20000708)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.2.20001021)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.3.20021019)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.4.20040208)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.5.20051010)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.6.20061217)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --with-hashed-db --with-termlib --with-ticlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.7.20081102)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --with-hashed-db --with-termlib --with-ticlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.8.20110226)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --with-broken_linker --with-hashed-db --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --with-hashed-db --with-termlib --with-ticlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.9.20110404)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --with-broken_linker --with-hashed-db --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --with-hashed-db --with-termlib --with-ticlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.9.20150530)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --with-broken_linker --with-hashed-db --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --with-hashed-db --with-termlib --with-ticlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace
+# Configure options (6.0.20161029)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --with-broken_linker --with-hashed-db --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --with-hashed-db --with-termlib --with-ticlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace
+BC
+COLORS
+COLOR_PAIR
+COLOR_PAIRS
+COLS
+ESCDELAY
+LINES
+PAIR_NUMBER
+PC
+SP
+TABSIZE
+TYPE_ALNUM
+TYPE_ALPHA
+TYPE_ENUM
+TYPE_INTEGER
+TYPE_IPV4
+TYPE_NUMERIC
+TYPE_REGEXP
+UP
+_nc_Default_Field
+_nc_Default_Form
+_nc_access
+_nc_add_to_try
+_nc_align_termtype
+_nc_alloc_entry_leaks
+_nc_basename
+_nc_capcmp
+_nc_captoinfo_leaks
+_nc_check_termtype
+_nc_check_termtype2
+_nc_comp_scan_leaks
+_nc_copy_termtype
+_nc_copy_termtype2
+_nc_curr_col
+_nc_curr_line
+_nc_db_close
+_nc_db_first
+_nc_db_have_data
+_nc_db_next
+_nc_db_open
+_nc_db_put
+_nc_disable_period
+_nc_doalloc
+_nc_entry_match
+_nc_env_access
+_nc_err_abort
+_nc_eventlist_timeout
+_nc_export_termtype2
+_nc_fallback
+_nc_fallback2
+_nc_find_entry
+_nc_find_type_entry
+_nc_find_user_entry
+_nc_first_db
+_nc_first_name
+_nc_flush
+_nc_flush_sp
+_nc_fmt_funcptr
+_nc_free_and_exit
+_nc_free_entries
+_nc_free_termtype
+_nc_free_termtype2
+_nc_free_tic
+_nc_free_tinfo
+_nc_free_tparm
+_nc_freeall
+_nc_get_alias_table
+_nc_get_hash_table
+_nc_get_locale
+_nc_get_screensize
+_nc_get_source
+_nc_get_table
+_nc_get_tty_mode
+_nc_get_tty_mode_sp
+_nc_get_type
+_nc_getenv_num
+_nc_globals
+_nc_handle_sigwinch
+_nc_has_mouse
+_nc_head
+_nc_home_terminfo
+_nc_info_hash_table
+_nc_infotocap
+_nc_init_acs
+_nc_init_acs_sp
+_nc_init_termtype
+_nc_is_abs_path
+_nc_is_dir_path
+_nc_is_file_path
+_nc_keep_tic_dir
+_nc_keyname_leaks
+_nc_keypad
+_nc_last_db
+_nc_leaks_tinfo
+_nc_locale_breaks_acs
+_nc_name_match
+_nc_next_db
+_nc_optimize_enable
+_nc_outc_wrapper
+_nc_outch
+_nc_outch_sp
+_nc_outchars
+_nc_panelhook
+_nc_panelhook_sp
+_nc_pathlast
+_nc_prescreen
+_nc_putchar
+_nc_putchar_sp
+_nc_putp
+_nc_putp_flush
+_nc_putp_flush_sp
+_nc_putp_sp
+_nc_read_entry
+_nc_read_entry2
+_nc_read_entry_source
+_nc_read_file_entry
+_nc_read_termtype
+_nc_reset_input
+_nc_reset_tparm
+_nc_resolve_uses
+_nc_resolve_uses2
+_nc_retrace_attr_t
+_nc_retrace_bool
+_nc_retrace_chtype
+_nc_retrace_cptr
+_nc_retrace_cvoid_ptr
+_nc_retrace_int
+_nc_retrace_int_attr_t
+_nc_retrace_ptr
+_nc_retrace_sp
+_nc_retrace_unsigned
+_nc_retrace_void_ptr
+_nc_retrace_win
+_nc_ripoffline
+_nc_rootname
+_nc_safe_fopen
+_nc_safe_open3
+_nc_safe_strcat
+_nc_safe_strcpy
+_nc_screen_chain
+_nc_screen_of
+_nc_set_buffer
+_nc_set_buffer_sp
+_nc_set_no_padding
+_nc_set_source
+_nc_set_tty_mode
+_nc_set_tty_mode_sp
+_nc_set_type
+_nc_set_writedir
+_nc_setupterm
+_nc_str_copy
+_nc_str_init
+_nc_str_null
+_nc_strict_bsd
+_nc_suppress_warnings
+_nc_syntax
+_nc_syserr_abort
+_nc_tail
+_nc_tgetent_leaks
+_nc_tic_dir
+_nc_tic_expand
+_nc_tic_written
+_nc_timed_wait
+_nc_tinfo_fkeys
+_nc_tinfo_fkeysf
+_nc_tiparm
+_nc_tparm_analyze
+_nc_tparm_err
+_nc_tputs_trace
+_nc_trace_buf
+_nc_trace_bufcat
+_nc_tracechar
+_nc_tracing
+_nc_trans_string
+_nc_trim_sgr0
+_nc_unicode_locale
+_nc_update_screensize
+_nc_user_definable
+_nc_visbuf
+_nc_visbuf2
+_nc_visbufn
+_nc_viscbuf
+_nc_wacs_width
+_nc_warning
+_nc_write_entry
+_nc_write_object
+_traceattr
+_traceattr2
+_tracechar
+_tracechtype
+_tracechtype2
+_tracef
+acs_map
+addch
+addchnstr
+addchstr
+addnstr
+addstr
+alloc_pair
+alloc_pair_sp
+assume_default_colors
+assume_default_colors_sp
+attr_get
+attr_off
+attr_on
+attr_set
+attroff
+attron
+attrset
+baudrate
+baudrate_sp
+beep
+beep_sp
+bkgd
+bkgdset
+boolcodes
+boolfnames
+boolnames
+border
+bottom_panel
+box
+can_change_color
+can_change_color_sp
+cbreak
+cbreak_sp
+ceiling_panel
+chgat
+clear
+clearok
+clrtobot
+clrtoeol
+color_content
+color_content_sp
+color_set
+copywin
+cur_term
+current_field
+current_item
+curs_set
+curs_set_sp
+curscr
+curses_trace
+curses_version
+data_ahead
+data_behind
+def_prog_mode
+def_prog_mode_sp
+def_shell_mode
+def_shell_mode_sp
+define_key
+define_key_sp
+del_curterm
+del_curterm_sp
+del_panel
+delay_output
+delay_output_sp
+delch
+deleteln
+delscreen
+delwin
+derwin
+doupdate
+doupdate_sp
+dup_field
+dupwin
+dynamic_field_info
+echo
+echo_sp
+echochar
+endwin
+endwin_sp
+erase
+erasechar
+erasechar_sp
+exit_curses
+exit_terminfo
+extended_color_content
+extended_color_content_sp
+extended_pair_content
+extended_pair_content_sp
+field_arg
+field_back
+field_buffer
+field_count
+field_fore
+field_index
+field_info
+field_init
+field_just
+field_opts
+field_opts_off
+field_opts_on
+field_pad
+field_status
+field_term
+field_type
+field_userptr
+filter
+filter_sp
+find_pair
+find_pair_sp
+flash
+flash_sp
+flushinp
+flushinp_sp
+form_driver
+form_fields
+form_init
+form_opts
+form_opts_off
+form_opts_on
+form_page
+form_request_by_name
+form_request_name
+form_sub
+form_term
+form_userptr
+form_win
+free_field
+free_fieldtype
+free_form
+free_item
+free_menu
+free_pair
+free_pair_sp
+get_escdelay
+get_escdelay_sp
+getattrs
+getbegx
+getbegy
+getbkgd
+getch
+getcurx
+getcury
+getmaxx
+getmaxy
+getmouse
+getmouse_sp
+getnstr
+getparx
+getpary
+getstr
+getwin
+getwin_sp
+ground_panel
+halfdelay
+halfdelay_sp
+has_colors
+has_colors_sp
+has_ic
+has_ic_sp
+has_il
+has_il_sp
+has_key
+has_key_sp
+has_mouse
+has_mouse_sp
+hide_panel
+hline
+idcok
+idlok
+immedok
+inch
+inchnstr
+inchstr
+init_color
+init_color_sp
+init_extended_color
+init_extended_color_sp
+init_extended_pair
+init_extended_pair_sp
+init_pair
+init_pair_sp
+initscr
+innstr
+insch
+insdelln
+insertln
+insnstr
+insstr
+instr
+intrflush
+intrflush_sp
+is_cleared
+is_idcok
+is_idlok
+is_immedok
+is_keypad
+is_leaveok
+is_linetouched
+is_nodelay
+is_notimeout
+is_pad
+is_scrollok
+is_subwin
+is_syncok
+is_term_resized
+is_term_resized_sp
+is_wintouched
+isendwin
+isendwin_sp
+item_count
+item_description
+item_index
+item_init
+item_name
+item_opts
+item_opts_off
+item_opts_on
+item_term
+item_userptr
+item_value
+item_visible
+key_defined
+key_defined_sp
+keybound
+keybound_sp
+keyname
+keyname_sp
+keyok
+keyok_sp
+keypad
+killchar
+killchar_sp
+leaveok
+link_field
+link_fieldtype
+longname
+longname_sp
+mcprint
+mcprint_sp
+menu_back
+menu_driver
+menu_fore
+menu_format
+menu_grey
+menu_init
+menu_items
+menu_mark
+menu_opts
+menu_opts_off
+menu_opts_on
+menu_pad
+menu_pattern
+menu_request_by_name
+menu_request_name
+menu_spacing
+menu_sub
+menu_term
+menu_userptr
+menu_win
+meta
+mouse_trafo
+mouseinterval
+mouseinterval_sp
+mousemask
+mousemask_sp
+move
+move_field
+move_panel
+mvaddch
+mvaddchnstr
+mvaddchstr
+mvaddnstr
+mvaddstr
+mvchgat
+mvcur
+mvcur_sp
+mvdelch
+mvderwin
+mvgetch
+mvgetnstr
+mvgetstr
+mvhline
+mvinch
+mvinchnstr
+mvinchstr
+mvinnstr
+mvinsch
+mvinsnstr
+mvinsstr
+mvinstr
+mvprintw
+mvscanw
+mvvline
+mvwaddch
+mvwaddchnstr
+mvwaddchstr
+mvwaddnstr
+mvwaddstr
+mvwchgat
+mvwdelch
+mvwgetch
+mvwgetnstr
+mvwgetstr
+mvwhline
+mvwin
+mvwinch
+mvwinchnstr
+mvwinchstr
+mvwinnstr
+mvwinsch
+mvwinsnstr
+mvwinsstr
+mvwinstr
+mvwprintw
+mvwscanw
+mvwvline
+napms
+napms_sp
+new_field
+new_fieldtype
+new_form
+new_form_sp
+new_item
+new_menu
+new_menu_sp
+new_page
+new_panel
+new_prescr
+newpad
+newpad_sp
+newscr
+newterm
+newterm_sp
+newwin
+newwin_sp
+nl
+nl_sp
+nocbreak
+nocbreak_sp
+nodelay
+noecho
+noecho_sp
+nofilter
+nofilter_sp
+nonl
+nonl_sp
+noqiflush
+noqiflush_sp
+noraw
+noraw_sp
+notimeout
+numcodes
+numfnames
+numnames
+ospeed
+overlay
+overwrite
+pair_content
+pair_content_sp
+panel_above
+panel_below
+panel_hidden
+panel_userptr
+panel_window
+pechochar
+pnoutrefresh
+pos_form_cursor
+pos_menu_cursor
+post_form
+post_menu
+prefresh
+printw
+putp
+putp_sp
+putwin
+qiflush
+qiflush_sp
+raw
+raw_sp
+redrawwin
+refresh
+replace_panel
+reset_color_pairs
+reset_color_pairs_sp
+reset_prog_mode
+reset_prog_mode_sp
+reset_shell_mode
+reset_shell_mode_sp
+resetty
+resetty_sp
+resize_term
+resize_term_sp
+resizeterm
+resizeterm_sp
+restartterm
+restartterm_sp
+ripoffline
+ripoffline_sp
+savetty
+savetty_sp
+scale_form
+scale_menu
+scanw
+scr_dump
+scr_init
+scr_init_sp
+scr_restore
+scr_restore_sp
+scr_set
+scr_set_sp
+scrl
+scroll
+scrollok
+set_current_field
+set_current_item
+set_curterm
+set_curterm_sp
+set_escdelay
+set_escdelay_sp
+set_field_back
+set_field_buffer
+set_field_fore
+set_field_init
+set_field_just
+set_field_opts
+set_field_pad
+set_field_status
+set_field_term
+set_field_type
+set_field_userptr
+set_fieldtype_arg
+set_fieldtype_choice
+set_form_fields
+set_form_init
+set_form_opts
+set_form_page
+set_form_sub
+set_form_term
+set_form_userptr
+set_form_win
+set_item_init
+set_item_opts
+set_item_term
+set_item_userptr
+set_item_value
+set_max_field
+set_menu_back
+set_menu_fore
+set_menu_format
+set_menu_grey
+set_menu_init
+set_menu_items
+set_menu_mark
+set_menu_opts
+set_menu_pad
+set_menu_pattern
+set_menu_spacing
+set_menu_sub
+set_menu_term
+set_menu_userptr
+set_menu_win
+set_new_page
+set_panel_userptr
+set_tabsize
+set_tabsize_sp
+set_term
+set_top_row
+setscrreg
+setupterm
+show_panel
+slk_attr
+slk_attr_off
+slk_attr_on
+slk_attr_set
+slk_attr_set_sp
+slk_attr_sp
+slk_attroff
+slk_attroff_sp
+slk_attron
+slk_attron_sp
+slk_attrset
+slk_attrset_sp
+slk_clear
+slk_clear_sp
+slk_color
+slk_color_sp
+slk_init
+slk_init_sp
+slk_label
+slk_label_sp
+slk_noutrefresh
+slk_noutrefresh_sp
+slk_refresh
+slk_refresh_sp
+slk_restore
+slk_restore_sp
+slk_set
+slk_set_sp
+slk_touch
+slk_touch_sp
+standend
+standout
+start_color
+start_color_sp
+stdscr
+strcodes
+strfnames
+strnames
+subpad
+subwin
+syncok
+termattrs
+termattrs_sp
+termname
+termname_sp
+tgetent
+tgetent_sp
+tgetflag
+tgetflag_sp
+tgetnum
+tgetnum_sp
+tgetstr
+tgetstr_sp
+tgoto
+tigetflag
+tigetflag_sp
+tigetnum
+tigetnum_sp
+tigetstr
+tigetstr_sp
+timeout
+tiparm
+top_panel
+top_row
+touchline
+touchwin
+tparm
+tputs
+tputs_sp
+trace
+ttytype
+typeahead
+typeahead_sp
+unctrl
+unctrl_sp
+unfocus_current_field
+ungetch
+ungetch_sp
+ungetmouse
+ungetmouse_sp
+unpost_form
+unpost_menu
+untouchwin
+update_panels
+update_panels_sp
+use_default_colors
+use_default_colors_sp
+use_env
+use_env_sp
+use_extended_names
+use_legacy_coding
+use_legacy_coding_sp
+use_screen
+use_tioctl
+use_tioctl_sp
+use_window
+vid_attr
+vidattr
+vidattr_sp
+vidputs
+vidputs_sp
+vline
+vw_printw
+vw_scanw
+vwprintw
+vwscanw
+waddch
+waddchnstr
+waddchstr
+waddnstr
+waddstr
+wattr_get
+wattr_off
+wattr_on
+wattr_set
+wattroff
+wattron
+wattrset
+wbkgd
+wbkgdset
+wborder
+wchgat
+wclear
+wclrtobot
+wclrtoeol
+wcolor_set
+wcursyncup
+wdelch
+wdeleteln
+wechochar
+wenclose
+werase
+wgetch
+wgetch_events
+wgetdelay
+wgetnstr
+wgetnstr_events
+wgetparent
+wgetscrreg
+wgetstr
+whline
+winch
+winchnstr
+winchstr
+winnstr
+winsch
+winsdelln
+winsertln
+winsnstr
+winsstr
+winstr
+wmouse_trafo
+wmove
+wnoutrefresh
+wprintw
+wredrawln
+wrefresh
+wresize
+wscanw
+wscrl
+wsetscrreg
+wstandend
+wstandout
+wsyncdown
+wsyncup
+wtimeout
+wtouchln
+wvline
diff --git a/package/ncursest.map b/package/ncursest.map
new file mode 100644
index 0000000..205265d
--- /dev/null
+++ b/package/ncursest.map
@@ -0,0 +1,1185 @@
+# $Id: ncursest.map,v 1.53 2021/10/10 15:22:33 tom Exp $
+# script for shared library symbol-versioning using ld
+#
+# This file was generated by ncu-mapsyms
+# Configure options (5.7.20081102)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --with-hashed-db --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.8.20110226)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-weak-symbols --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-weak-symbols --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-weak-symbols --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --with-broken_linker --with-hashed-db --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-wgetch-events --with-hashed-db --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --with-broken_linker --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.9.20110404)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-weak-symbols --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-weak-symbols --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-weak-symbols --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --with-broken_linker --with-hashed-db --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-wgetch-events --with-hashed-db --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --with-broken_linker --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.9.20150530)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-weak-symbols --with-pthread --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-weak-symbols --with-pthread --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-weak-symbols --with-pthread --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --with-broken_linker --with-hashed-db --with-pthread --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --with-pthread --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-wgetch-events --with-hashed-db --with-pthread --with-termlib --with-ticlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --with-broken_linker --with-pthread --with-termlib --with-ticlib --with-trace
+# Configure options (6.0.current)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-weak-symbols --with-pthread --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-weak-symbols --with-pthread --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-weak-symbols --with-pthread --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --with-broken_linker --with-hashed-db --with-pthread --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --with-pthread --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-wgetch-events --with-hashed-db --with-pthread --with-termlib --with-ticlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --with-broken_linker --with-pthread --with-termlib --with-ticlib --with-trace
+
+NCURSES_TIC_5.0.19991023 {
+	global:
+		_nc_capcmp;
+		_nc_check_termtype;
+		_nc_entry_match;
+		_nc_infotocap;
+		_nc_read_entry_source;
+		_nc_reset_input;
+		_nc_resolve_uses;
+		_nc_screen;
+		_nc_set_writedir;
+		_nc_syntax;
+		_nc_tic_expand;
+		_nc_tic_written;
+		_nc_trans_string;
+		_nc_write_entry;
+	local:
+		_nc_captoinfo;
+		_nc_comment_end;
+		_nc_comment_start;
+		_nc_copy_entry;
+		_nc_curr_file_pos;
+		_nc_curr_token;
+		_nc_get_token;
+		_nc_init_entry;
+		_nc_merge_entry;
+		_nc_panic_mode;
+		_nc_parse_entry;
+		_nc_push_token;
+		_nc_save_str;
+		_nc_start_line;
+		_nc_wrap_entry;
+};
+
+NCURSES_TIC_5.1.20000708 {
+	global:
+		_nc_disable_period;
+} NCURSES_TIC_5.0.19991023;
+
+NCURSES_TIC_5.5.20051010 {
+	global:
+		_nc_alloc_entry_leaks;
+		_nc_captoinfo_leaks;
+		_nc_check_termtype2;
+		_nc_comp_scan_leaks;
+		_nc_resolve_uses2;
+} NCURSES_TIC_5.1.20000708;
+
+NCURSES_TIC_5.7.20081102 {
+	global:
+		_nc_free_tic;
+	local:
+		_nc_comp_captab_leaks;
+		_nc_leaks_tic;
+} NCURSES_TIC_5.5.20051010;
+
+NCURSES_TIC_5.9.20150530 {
+	global:
+		_nc_strict_bsd;
+} NCURSES_TIC_5.7.20081102;
+
+NCURSES_TIC_6.1.20171230 {
+	global:
+		_nc_read_entry2;
+		_nc_write_object;
+	local:
+		_*;
+} NCURSES_TIC_5.9.20150530;
+
+NCURSES_TINFO_5.0.19991023 {
+	global:
+		BC;
+		PC;
+		SP;
+		UP;
+		_nc_access;
+		_nc_add_to_try;
+		_nc_copy_termtype;
+		_nc_curr_col;
+		_nc_curr_line;
+		_nc_doalloc;
+		_nc_err_abort;
+		_nc_fallback;
+		_nc_find_entry;
+		_nc_find_type_entry;
+		_nc_first_name;
+		_nc_free_entries;
+		_nc_free_termtype;
+		_nc_free_tparm;
+		_nc_freeall;
+		_nc_get_hash_table;
+		_nc_get_table;
+		_nc_get_tty_mode;
+		_nc_get_type;
+		_nc_getenv_num;
+		_nc_head;
+		_nc_home_terminfo;
+		_nc_init_acs;
+		_nc_keep_tic_dir;
+		_nc_keypad;
+		_nc_name_match;
+		_nc_outch;
+		_nc_read_entry;
+		_nc_read_file_entry;
+		_nc_screen_chain;
+		_nc_set_buffer;
+		_nc_set_source;
+		_nc_set_tty_mode;
+		_nc_set_type;
+		_nc_suppress_warnings;
+		_nc_syserr_abort;
+		_nc_tail;
+		_nc_tic_dir;
+		_nc_timed_wait;
+		_nc_tinfo_fkeysf;
+		_nc_trace_buf;
+		_nc_tracing;
+		_nc_update_screensize;
+		_nc_visbuf;
+		_nc_visbuf2;
+		_nc_warning;
+		_tracechar;
+		baudrate;
+		cbreak;
+		curs_set;
+		curses_version;
+		def_prog_mode;
+		def_shell_mode;
+		define_key;
+		del_curterm;
+		delay_output;
+		erasechar;
+		flushinp;
+		halfdelay;
+		has_ic;
+		has_il;
+		has_key;
+		idcok;
+		idlok;
+		intrflush;
+		keybound;
+		keyname;
+		keyok;
+		keypad;
+		killchar;
+		longname;
+		meta;
+		napms;
+		nocbreak;
+		nodelay;
+		noqiflush;
+		noraw;
+		notimeout;
+		ospeed;
+		putp;
+		qiflush;
+		raw;
+		reset_prog_mode;
+		reset_shell_mode;
+		resetty;
+		savetty;
+		set_curterm;
+		setupterm;
+		termname;
+		tgetent;
+		tgetflag;
+		tgetnum;
+		tgetstr;
+		tgoto;
+		tigetflag;
+		tigetnum;
+		tigetstr;
+		tparm;
+		tputs;
+		trace;
+		typeahead;
+		unctrl;
+		use_env;
+		wtimeout;
+	local:
+		_nc_baudrate;
+		_nc_expand_try;
+		_nc_init_keytry;
+		_nc_nulls_sent;
+		_nc_ospeed;
+		_nc_read_termcap;
+		_nc_read_termcap_entry;
+		_nc_remove_key;
+		_nc_remove_string;
+		_nc_trace_tries;
+		_nc_tracebits;
+};
+
+NCURSES_TINFO_5.1.20000708 {
+	global:
+		_nc_align_termtype;
+		_nc_flush;
+		_nc_tinfo_fkeys;
+		_nc_user_definable;
+		use_extended_names;
+} NCURSES_TINFO_5.0.19991023;
+
+NCURSES_TINFO_5.2.20001021 {
+	global:
+		_nc_basename;
+		_nc_env_access;
+		_nc_safe_strcat;
+		_nc_safe_strcpy;
+		_nc_str_copy;
+		_nc_str_init;
+		_nc_str_null;
+} NCURSES_TINFO_5.1.20000708;
+
+NCURSES_TINFO_5.3.20021019 {
+	global:
+		_nc_rootname;
+		_nc_tparm_err;
+		_nc_visbufn;
+} NCURSES_TINFO_5.2.20001021;
+
+NCURSES_TINFO_5.4.20040208 {
+	global:
+		_nc_get_locale;
+		_nc_locale_breaks_acs;
+		_nc_pathlast;
+		_nc_retrace_attr_t;
+		_nc_retrace_bool;
+		_nc_retrace_chtype;
+		_nc_retrace_int;
+		_nc_retrace_ptr;
+		_nc_retrace_sp;
+		_nc_retrace_unsigned;
+		_nc_retrace_win;
+		_nc_tparm_analyze;
+		_nc_trace_bufcat;
+		_nc_unicode_locale;
+		_traceattr;
+		_traceattr2;
+		_tracechtype;
+		_tracechtype2;
+		_tracef;
+		key_defined;
+	local:
+		_nc_altcharset_name;
+		_nc_trace_ttymode;
+} NCURSES_TINFO_5.3.20021019;
+
+NCURSES_TINFO_5.5.20051010 {
+	global:
+		_nc_get_source;
+		_nc_retrace_cptr;
+		_nc_retrace_cvoid_ptr;
+		_nc_retrace_void_ptr;
+		_nc_setupterm;
+		_nc_trim_sgr0;
+	local:
+		_nc_delink_entry;
+		_nc_free_entry;
+} NCURSES_TINFO_5.4.20040208;
+
+NCURSES_TINFO_5.6.20061217 {
+	global:
+		_nc_db_close;
+		_nc_db_first;
+		_nc_db_have_data;
+		_nc_db_next;
+		_nc_db_open;
+		_nc_db_put;
+		_nc_eventlist_timeout;
+		_nc_first_db;
+		_nc_handle_sigwinch;
+		_nc_is_abs_path;
+		_nc_is_dir_path;
+		_nc_is_file_path;
+		_nc_keyname_leaks;
+		_nc_last_db;
+		_nc_next_db;
+		_nc_read_termtype;
+		_nc_tgetent_leaks;
+		_nc_viscbuf;
+	local:
+		_nc_db_get;
+		_nc_db_have_index;
+		_nc_hashed_db;
+		_nc_viscbuf2;
+} NCURSES_TINFO_5.5.20051010;
+
+NCURSES_TINFO_5.7.20081102 {
+	global:
+		_nc_COLS;
+		_nc_LINES;
+		_nc_TABSIZE;
+		_nc__nc_outchars;
+		_nc_acs_map;
+		_nc_boolcodes;
+		_nc_boolfnames;
+		_nc_boolnames;
+		_nc_codes_leaks;
+		_nc_count_outchars;
+		_nc_cur_term;
+		_nc_curscr;
+		_nc_free_tinfo;
+		_nc_get_alias_table;
+		_nc_get_screensize;
+		_nc_globals;
+		_nc_init_pthreads;
+		_nc_leaks_tinfo;
+		_nc_locked_tracef;
+		_nc_mutex_lock;
+		_nc_mutex_trylock;
+		_nc_mutex_unlock;
+		_nc_names_leaks;
+		_nc_newscr;
+		_nc_numcodes;
+		_nc_numfnames;
+		_nc_numnames;
+		_nc_prescreen;
+		_nc_ptr_Cols;
+		_nc_ptr_Lines;
+		_nc_screen_of;
+		_nc_set_no_padding;
+		_nc_set_tputs_trace;
+		_nc_stdscr;
+		_nc_strcodes;
+		_nc_strfnames;
+		_nc_strnames;
+		_nc_tracechar;
+		_nc_ttytype;
+		_nc_use_tracef;
+		set_tabsize;
+	local:
+		_nc__nc_tputs_trace;
+		_nc_keyname;
+		_nc_mutex_init;
+		_nc_unctrl;
+} NCURSES_TINFO_5.6.20061217;
+
+NCURSES_TINFO_5.8.20110226 {
+	global:
+		_nc_flush_sp;
+		_nc_get_tty_mode_sp;
+		_nc_init_acs_sp;
+		_nc_outc_wrapper;
+		_nc_outch_sp;
+		_nc_putp;
+		_nc_putp_flush;
+		_nc_putp_flush_sp;
+		_nc_putp_sp;
+		_nc_retrace_int_attr_t;
+		_nc_set_buffer_sp;
+		_nc_set_tty_mode_sp;
+		_nc_sigprocmask;
+		baudrate_sp;
+		cbreak_sp;
+		curs_set_sp;
+		def_prog_mode_sp;
+		def_shell_mode_sp;
+		define_key_sp;
+		del_curterm_sp;
+		delay_output_sp;
+		erasechar_sp;
+		flushinp_sp;
+		halfdelay_sp;
+		has_ic_sp;
+		has_il_sp;
+		has_key_sp;
+		intrflush_sp;
+		key_defined_sp;
+		keybound_sp;
+		keyname_sp;
+		keyok_sp;
+		killchar_sp;
+		longname_sp;
+		napms_sp;
+		new_prescr;
+		nocbreak_sp;
+		noqiflush_sp;
+		noraw_sp;
+		putp_sp;
+		qiflush_sp;
+		raw_sp;
+		reset_prog_mode_sp;
+		reset_shell_mode_sp;
+		resetty_sp;
+		savetty_sp;
+		set_curterm_sp;
+		set_tabsize_sp;
+		termname_sp;
+		tgetent_sp;
+		tgetflag_sp;
+		tgetnum_sp;
+		tgetstr_sp;
+		tigetflag_sp;
+		tigetnum_sp;
+		tigetstr_sp;
+		tiparm;
+		tputs_sp;
+		typeahead_sp;
+		unctrl_sp;
+		use_env_sp;
+	local:
+		_nc_get_cur_term;
+		_nc_get_cur_term_sp;
+		_nc_get_hash_info;
+		_nc_ptr_Tabsize;
+		_nc_retrace_char;
+		_nc_setup_tinfo;
+		_nc_tinfo_cmdch;
+} NCURSES_TINFO_5.7.20081102;
+
+NCURSES_TINFO_5.9.20150530 {
+	global:
+		_nc_init_termtype;
+		_nc_putchar;
+		_nc_putchar_sp;
+		use_tioctl;
+		use_tioctl_sp;
+	local:
+		_nc_comp_error_leaks;
+		_nc_db_iterator_leaks;
+		_nc_setenv_num;
+} NCURSES_TINFO_5.8.20110226;
+
+NCURSES_TINFO_6.1.20171230 {
+	global:
+		_nc_copy_termtype2;
+		_nc_export_termtype2;
+		_nc_fallback2;
+		_nc_find_prescr;
+		_nc_forget_prescr;
+		_nc_free_termtype2;
+} NCURSES_TINFO_5.9.20150530;
+
+NCURSES_TINFO_6.2.20200212 {
+	global:
+		_nc_find_user_entry;
+		_nc_fmt_funcptr;
+		_nc_wacs_width;
+		curses_trace;
+		exit_terminfo;
+} NCURSES_TINFO_6.1.20171230;
+
+NCURSES_TINFO_6.2.20211010 {
+	global:
+		_nc_reset_tparm;
+		_nc_safe_fopen;
+		_nc_safe_open3;
+		_nc_tiparm;
+	local:
+		_*;
+} NCURSES_TINFO_6.2.20200212;
+
+NCURSEST_5.7.20081102 {
+	global:
+		COLOR_PAIR;
+		PAIR_NUMBER;
+		TYPE_ALNUM;
+		TYPE_ALPHA;
+		TYPE_ENUM;
+		TYPE_INTEGER;
+		TYPE_IPV4;
+		TYPE_NUMERIC;
+		TYPE_REGEXP;
+		_nc_COLORS;
+		_nc_COLOR_PAIRS;
+		_nc_Default_Field;	# deprecated in ABI6
+		_nc_Default_Form;	# deprecated in ABI6
+		_nc_ESCDELAY;
+		_nc_free_and_exit;
+		_nc_has_mouse;	# deprecated in ABI6
+		_nc_optimize_enable;
+		_nc_panelhook;
+		_nc_ripoffline;
+		addch;
+		addchnstr;
+		addchstr;
+		addnstr;
+		addstr;
+		assume_default_colors;
+		attr_get;
+		attr_off;
+		attr_on;
+		attr_set;
+		attroff;
+		attron;
+		attrset;
+		beep;
+		bkgd;
+		bkgdset;
+		border;
+		bottom_panel;
+		box;
+		can_change_color;
+		chgat;
+		clear;
+		clearok;
+		clrtobot;
+		clrtoeol;
+		color_content;
+		color_set;
+		copywin;
+		current_field;
+		current_item;
+		data_ahead;
+		data_behind;
+		del_panel;
+		delch;
+		deleteln;
+		delscreen;
+		delwin;
+		derwin;
+		doupdate;
+		dup_field;
+		dupwin;
+		dynamic_field_info;
+		echo;
+		echochar;
+		endwin;
+		erase;
+		field_arg;
+		field_back;
+		field_buffer;
+		field_count;
+		field_fore;
+		field_index;
+		field_info;
+		field_init;
+		field_just;
+		field_opts;
+		field_opts_off;
+		field_opts_on;
+		field_pad;
+		field_status;
+		field_term;
+		field_type;
+		field_userptr;
+		filter;
+		flash;
+		form_driver;
+		form_fields;
+		form_init;
+		form_opts;
+		form_opts_off;
+		form_opts_on;
+		form_page;
+		form_request_by_name;
+		form_request_name;
+		form_sub;
+		form_term;
+		form_userptr;
+		form_win;
+		free_field;
+		free_fieldtype;
+		free_form;
+		free_item;
+		free_menu;
+		getattrs;
+		getbegx;
+		getbegy;
+		getbkgd;
+		getch;
+		getcurx;
+		getcury;
+		getmaxx;
+		getmaxy;
+		getmouse;
+		getnstr;
+		getparx;
+		getpary;
+		getstr;
+		getwin;
+		has_colors;
+		hide_panel;
+		hline;
+		immedok;
+		inch;
+		inchnstr;
+		inchstr;
+		init_color;
+		init_pair;
+		initscr;
+		innstr;
+		insch;
+		insdelln;
+		insertln;
+		insnstr;
+		insstr;
+		instr;
+		is_cleared;
+		is_idcok;
+		is_idlok;
+		is_immedok;
+		is_keypad;
+		is_leaveok;
+		is_linetouched;
+		is_nodelay;
+		is_notimeout;
+		is_scrollok;
+		is_syncok;
+		is_term_resized;
+		is_wintouched;
+		isendwin;
+		item_count;
+		item_description;
+		item_index;
+		item_init;
+		item_name;
+		item_opts;
+		item_opts_off;
+		item_opts_on;
+		item_term;
+		item_userptr;
+		item_value;
+		item_visible;
+		leaveok;
+		link_field;
+		link_fieldtype;
+		mcprint;
+		menu_back;
+		menu_driver;
+		menu_fore;
+		menu_format;
+		menu_grey;
+		menu_init;
+		menu_items;
+		menu_mark;
+		menu_opts;
+		menu_opts_off;
+		menu_opts_on;
+		menu_pad;
+		menu_pattern;
+		menu_request_by_name;
+		menu_request_name;
+		menu_spacing;
+		menu_sub;
+		menu_term;
+		menu_userptr;
+		menu_win;
+		mouse_trafo;
+		mouseinterval;
+		mousemask;
+		move;
+		move_field;
+		move_panel;
+		mvaddch;
+		mvaddchnstr;
+		mvaddchstr;
+		mvaddnstr;
+		mvaddstr;
+		mvchgat;
+		mvcur;
+		mvdelch;
+		mvderwin;
+		mvgetch;
+		mvgetnstr;
+		mvgetstr;
+		mvhline;
+		mvinch;
+		mvinchnstr;
+		mvinchstr;
+		mvinnstr;
+		mvinsch;
+		mvinsnstr;
+		mvinsstr;
+		mvinstr;
+		mvprintw;
+		mvscanw;
+		mvvline;
+		mvwaddch;
+		mvwaddchnstr;
+		mvwaddchstr;
+		mvwaddnstr;
+		mvwaddstr;
+		mvwchgat;
+		mvwdelch;
+		mvwgetch;
+		mvwgetnstr;
+		mvwgetstr;
+		mvwhline;
+		mvwin;
+		mvwinch;
+		mvwinchnstr;
+		mvwinchstr;
+		mvwinnstr;
+		mvwinsch;
+		mvwinsnstr;
+		mvwinsstr;
+		mvwinstr;
+		mvwprintw;
+		mvwscanw;
+		mvwvline;
+		new_field;
+		new_fieldtype;
+		new_form;
+		new_item;
+		new_menu;
+		new_page;
+		new_panel;
+		newpad;
+		newterm;
+		newwin;
+		nl;
+		noecho;
+		nofilter;
+		nonl;
+		overlay;
+		overwrite;
+		pair_content;
+		panel_above;
+		panel_below;
+		panel_hidden;
+		panel_userptr;
+		panel_window;
+		pechochar;
+		pnoutrefresh;
+		pos_form_cursor;
+		pos_menu_cursor;
+		post_form;
+		post_menu;
+		prefresh;
+		printw;
+		putwin;
+		redrawwin;
+		refresh;
+		replace_panel;
+		resize_term;
+		resizeterm;
+		restartterm;
+		ripoffline;
+		scale_form;
+		scale_menu;
+		scanw;
+		scr_dump;
+		scr_init;
+		scr_restore;
+		scr_set;
+		scrl;
+		scroll;
+		scrollok;
+		set_current_field;
+		set_current_item;
+		set_escdelay;
+		set_field_back;
+		set_field_buffer;
+		set_field_fore;
+		set_field_init;
+		set_field_just;
+		set_field_opts;
+		set_field_pad;
+		set_field_status;
+		set_field_term;
+		set_field_type;
+		set_field_userptr;
+		set_fieldtype_arg;
+		set_fieldtype_choice;
+		set_form_fields;
+		set_form_init;
+		set_form_opts;
+		set_form_page;
+		set_form_sub;
+		set_form_term;
+		set_form_userptr;
+		set_form_win;
+		set_item_init;
+		set_item_opts;
+		set_item_term;
+		set_item_userptr;
+		set_item_value;
+		set_max_field;
+		set_menu_back;
+		set_menu_fore;
+		set_menu_format;
+		set_menu_grey;
+		set_menu_init;
+		set_menu_items;
+		set_menu_mark;
+		set_menu_opts;
+		set_menu_pad;
+		set_menu_pattern;
+		set_menu_spacing;
+		set_menu_sub;
+		set_menu_term;
+		set_menu_userptr;
+		set_menu_win;
+		set_new_page;
+		set_panel_userptr;
+		set_term;
+		set_top_row;
+		setscrreg;
+		show_panel;
+		slk_attr;
+		slk_attr_set;
+		slk_attroff;
+		slk_attron;
+		slk_attrset;
+		slk_clear;
+		slk_color;
+		slk_init;
+		slk_label;
+		slk_noutrefresh;
+		slk_refresh;
+		slk_restore;
+		slk_set;
+		slk_touch;
+		standend;
+		standout;
+		start_color;
+		subpad;
+		subwin;
+		syncok;
+		termattrs;
+		timeout;
+		top_panel;
+		top_row;
+		touchline;
+		touchwin;
+		ungetch;
+		ungetmouse;
+		unpost_form;
+		unpost_menu;
+		untouchwin;
+		update_panels;
+		use_default_colors;
+		use_legacy_coding;
+		use_screen;
+		use_window;
+		vidattr;
+		vidputs;
+		vline;
+		vw_printw;
+		vw_scanw;
+		vwprintw;
+		vwscanw;
+		waddch;
+		waddchnstr;
+		waddchstr;
+		waddnstr;
+		waddstr;
+		wattr_get;
+		wattr_off;
+		wattr_on;
+		wattr_set;
+		wattroff;
+		wattron;
+		wattrset;
+		wbkgd;
+		wbkgdset;
+		wborder;
+		wchgat;
+		wclear;
+		wclrtobot;
+		wclrtoeol;
+		wcolor_set;
+		wcursyncup;
+		wdelch;
+		wdeleteln;
+		wechochar;
+		wenclose;
+		werase;
+		wgetch;
+		wgetch_events;
+		wgetnstr;
+		wgetnstr_events;
+		wgetparent;
+		wgetscrreg;
+		wgetstr;
+		whline;
+		winch;
+		winchnstr;
+		winchstr;
+		winnstr;
+		winsch;
+		winsdelln;
+		winsertln;
+		winsnstr;
+		winsstr;
+		winstr;
+		wmouse_trafo;
+		wmove;
+		wnoutrefresh;
+		wprintw;
+		wredrawln;
+		wrefresh;
+		wresize;
+		wscanw;
+		wscrl;
+		wsetscrreg;
+		wstandend;
+		wstandout;
+		wsyncdown;
+		wsyncup;
+		wtouchln;
+		wvline;
+	local:
+		_nc_Calculate_Item_Length_and_Width;
+		_nc_Calculate_Text_Width;
+		_nc_Connect_Items;
+		_nc_Copy_Argument;
+		_nc_Copy_Type;
+		_nc_Default_FieldType;
+		_nc_Default_Item;
+		_nc_Default_Menu;
+		_nc_Disconnect_Items;
+		_nc_Draw_Menu;
+		_nc_First_Active_Field;
+		_nc_Free_Argument;
+		_nc_Free_Type;
+		_nc_Internal_Validation;
+		_nc_Link_Items;
+		_nc_Make_Argument;
+		_nc_Match_Next_Character_In_Item_Name;
+		_nc_New_TopRow_and_CurrentItem;
+		_nc_Position_Form_Cursor;
+		_nc_Post_Item;
+		_nc_Refresh_Current_Field;
+		_nc_Set_Current_Field;
+		_nc_Set_Form_Page;
+		_nc_Show_Menu;
+		_nc_Synchronize_Attributes;
+		_nc_Synchronize_Options;
+		_nc_Touchline;
+		_nc_Touchpan;
+		_nc_Wnoutrefresh;
+		_nc_dPanel;
+		_nc_dStack;
+		_nc_do_color;
+		_nc_expanded;
+		_nc_fifo_dump;
+		_nc_freewin;
+		_nc_hash_map;
+		_nc_insert_ch;
+		_nc_linedump;
+		_nc_make_oldhash;
+		_nc_makenew;
+		_nc_memmove;
+		_nc_menu_cursor_pos;
+		_nc_msec_cost;
+		_nc_mvcur_init;
+		_nc_mvcur_resume;
+		_nc_mvcur_wrap;
+		_nc_my_visbuf;
+		_nc_oldnums;
+		_nc_printf_string;
+		_nc_render;
+		_nc_reset_colors;
+		_nc_retrace_field;
+		_nc_retrace_field_ptr;
+		_nc_retrace_field_type;
+		_nc_retrace_form;
+		_nc_retrace_form_hook;
+		_nc_retrace_item;
+		_nc_retrace_item_opts;
+		_nc_retrace_item_ptr;
+		_nc_retrace_menu;
+		_nc_retrace_menu_hook;
+		_nc_retrace_menu_opts;
+		_nc_retrace_panel;
+		_nc_screen_init;
+		_nc_screen_resume;
+		_nc_screen_wrap;
+		_nc_scroll_oldhash;
+		_nc_scroll_optimize;
+		_nc_scroll_window;
+		_nc_scrolln;
+		_nc_setupscreen;
+		_nc_signal_handler;
+		_nc_slk_initialize;
+		_nc_synchook;
+		_nc_trace_xnames;
+		_nc_tracemouse;
+		_nc_ungetch;
+		_nc_varargs;
+		_nc_vsscanf;
+		_nc_waddch_nosync;
+		_nc_wgetch;
+		_tracedump;
+		_tracemouse;
+};
+
+NCURSEST_5.8.20110226 {
+	global:
+		_nc_panelhook_sp;
+		assume_default_colors_sp;
+		beep_sp;
+		can_change_color_sp;
+		ceiling_panel;
+		color_content_sp;
+		doupdate_sp;
+		echo_sp;
+		endwin_sp;
+		filter_sp;
+		flash_sp;
+		get_escdelay;
+		get_escdelay_sp;
+		getmouse_sp;
+		getwin_sp;
+		ground_panel;
+		has_colors_sp;
+		has_mouse;
+		has_mouse_sp;
+		init_color_sp;
+		init_pair_sp;
+		is_pad;
+		is_subwin;
+		is_term_resized_sp;
+		isendwin_sp;
+		mcprint_sp;
+		mouseinterval_sp;
+		mousemask_sp;
+		mvcur_sp;
+		new_form_sp;
+		new_menu_sp;
+		newpad_sp;
+		newterm_sp;
+		newwin_sp;
+		nl_sp;
+		noecho_sp;
+		nofilter_sp;
+		nonl_sp;
+		pair_content_sp;
+		resize_term_sp;
+		resizeterm_sp;
+		restartterm_sp;
+		ripoffline_sp;
+		scr_init_sp;
+		scr_restore_sp;
+		scr_set_sp;
+		set_escdelay_sp;
+		slk_attr_set_sp;
+		slk_attr_sp;
+		slk_attroff_sp;
+		slk_attron_sp;
+		slk_attrset_sp;
+		slk_clear_sp;
+		slk_color_sp;
+		slk_init_sp;
+		slk_label_sp;
+		slk_noutrefresh_sp;
+		slk_refresh_sp;
+		slk_restore_sp;
+		slk_set_sp;
+		slk_touch_sp;
+		start_color_sp;
+		termattrs_sp;
+		ungetch_sp;
+		ungetmouse_sp;
+		update_panels_sp;
+		use_default_colors_sp;
+		use_legacy_coding_sp;
+		vidattr_sp;
+		vidputs_sp;
+	local:
+		_nc_TYPE_ALNUM;
+		_nc_TYPE_ALPHA;
+		_nc_TYPE_ENUM;
+		_nc_TYPE_INTEGER;
+		_nc_TYPE_IPV4;
+		_nc_TYPE_NUMERIC;
+		_nc_TYPE_REGEXP;
+		_nc_curscr_of;
+		_nc_do_color_sp;
+		_nc_form_cursor;
+		_nc_format_slks;
+		_nc_free_and_exit_sp;
+		_nc_freeall_sp;
+		_nc_fty_generic;
+		_nc_generic_fieldtype;
+		_nc_get_fieldbuffer;
+		_nc_hash_map_sp;
+		_nc_linedump_sp;
+		_nc_make_oldhash_sp;
+		_nc_makenew_sp;
+		_nc_msec_cost_sp;
+		_nc_mvcur_init_sp;
+		_nc_mvcur_resume_sp;
+		_nc_mvcur_wrap_sp;
+		_nc_newscr_of;
+		_nc_printf_string_sp;
+		_nc_ptr_Escdelay;
+		_nc_reset_colors_sp;
+		_nc_retrace_mmask_t;
+		_nc_ripoffline_sp;
+		_nc_screen_init_sp;
+		_nc_screen_resume_sp;
+		_nc_screen_wrap_sp;
+		_nc_scroll_oldhash_sp;
+		_nc_scroll_optimize_sp;
+		_nc_scrolln_sp;
+		_nc_set_generic_fieldtype;
+		_nc_setupscreen_sp;
+		_nc_stdscr_of;
+} NCURSEST_5.7.20081102;
+
+NCURSEST_5.9.20150530 {
+	global:
+		wgetdelay;
+	local:
+		_nc_mvcur;
+		_nc_mvcur_sp;
+		_nc_trace_mmask_t;
+} NCURSEST_5.8.20110226;
+
+NCURSEST_6.1.20171230 {
+	global:
+		alloc_pair;
+		alloc_pair_sp;
+		extended_color_content;
+		extended_color_content_sp;
+		extended_pair_content;
+		extended_pair_content_sp;
+		find_pair;
+		find_pair_sp;
+		free_pair;
+		free_pair_sp;
+		init_extended_color;
+		init_extended_color_sp;
+		init_extended_pair;
+		init_extended_pair_sp;
+		reset_color_pairs;
+		reset_color_pairs_sp;
+		unfocus_current_field;
+	local:
+		_nc_Unset_Current_Field;
+		_nc_change_pair;
+		_nc_init_color;
+		_nc_init_pair;
+		_nc_pair_content;
+		_nc_reset_color_pair;
+		_nc_set_color_pair;
+} NCURSEST_5.9.20150530;
+
+NCURSEST_6.2.20200212 {
+	global:
+		exit_curses;
+	local:
+		_*;
+} NCURSEST_6.1.20171230;
+
diff --git a/package/ncursest.spec b/package/ncursest.spec
new file mode 100644
index 0000000..8729842
--- /dev/null
+++ b/package/ncursest.spec
@@ -0,0 +1,187 @@
+Summary: Curses library with POSIX thread support.
+Name: ncursest6
+Version: 6.4
+Release: 20221231
+License: X11
+Group: Development/Libraries
+Source: ncurses-%{version}-%{release}.tgz
+# URL: https://invisible-island.net/ncurses/
+
+%global MY_ABI 6
+
+# save value before redefining
+%global sys_libdir %{_libdir}
+
+# was redefined...
+#global _prefix /usr/local/ncurses#{MY_ABI}
+
+%global MY_PKG %{sys_libdir}/pkgconfig
+%define MYDATA /usr/local/ncurses/share/terminfo
+
+%description
+The ncurses library routines are a terminal-independent method of
+updating character screens with reasonable optimization.
+
+This package is used for testing ABI %{MY_ABI} with POSIX threads.
+
+%prep
+
+%global is_mandriva %(test -f /etc/mandriva-release && echo 1 || echo 0)
+%global is_fedora   %(test -f /usr/bin/dnf && echo 1 || echo 0)
+%global is_centos   %(test -f /etc/centos-release && echo 1 || echo 0)
+%global is_redhat   %(test -f /etc/redhat-release && echo 1 || echo 0)
+%global is_scilinux %(test -f /etc/sl-release && echo 1 || echo 0)
+%global is_suse     %(test -f /etc/SuSE-release && echo 1 || echo 0)
+
+%if %{is_redhat}
+# generate debug/debug-source packages.
+%else
+%define debug_package %{nil}
+%endif
+
+%if %{is_mandriva}
+%define _disable_ld_as_needed 1
+%define _disable_ld_no_undefined 1
+# libtool is not used here...
+%define _disable_libtoolize 1
+%define _disable_ld_build_id 1
+%endif
+
+%if %{is_fedora} || %{is_scilinux} || %{is_centos}
+# workaround for toolset breakage in Fedora 28
+%define _test_relink --enable-relink
+%else
+%define _test_relink --disable-relink
+%endif
+
+%setup -q -n ncurses-%{version}-%{release}
+
+%build
+%define CFG_OPTS \\\
+	--target %{_target_platform} \\\
+	--prefix=%{_prefix} \\\
+	--bindir=%{_bindir} \\\
+	--includedir=%{_includedir} \\\
+	--libdir=%{_libdir} \\\
+	--includedir='${prefix}/include' \\\
+	--disable-echo \\\
+	--disable-getcap \\\
+	--disable-leaks \\\
+	--disable-macros  \\\
+	--disable-overwrite  \\\
+	%{_test_relink}  \\\
+	--disable-termcap \\\
+	--enable-hard-tabs \\\
+	--enable-opaque-curses \\\
+	--enable-opaque-form \\\
+	--enable-opaque-menu \\\
+	--enable-opaque-panel \\\
+	--enable-pc-files \\\
+	--enable-rpath \\\
+	--enable-warnings \\\
+	--enable-wgetch-events \\\
+	--enable-widec \\\
+	--enable-xmc-glitch \\\
+	--program-suffix=%{MY_ABI} \\\
+	--verbose \\\
+	--with-abi-version=%{MY_ABI} \\\
+	--with-config-suffix=dev \\\
+	--with-cxx-shared \\\
+	--with-default-terminfo-dir=%{MYDATA} \\\
+	--with-develop \\\
+	--with-extra-suffix=%{MY_ABI} \\\
+	--with-install-prefix=$RPM_BUILD_ROOT \\\
+	--with-pkg-config-libdir=%{MY_PKG} \\\
+	--with-shared \\\
+	--with-terminfo-dirs=%{MYDATA}:/usr/share/terminfo \\\
+	--with-termlib \\\
+	--with-ticlib \\\
+	--with-trace \\\
+	--with-versioned-syms \\\
+	--with-xterm-kbs=DEL \\\
+	--without-ada \\\
+	--without-debug \\\
+	--without-normal
+
+%configure %{CFG_OPTS} \
+	--enable-interop \
+	--enable-sp-funcs \
+	--program-suffix=t%{MY_ABI} \
+	--with-pthread
+make
+
+%install
+rm -rf $RPM_BUILD_ROOT
+
+make install.libs install.progs
+rm -f test/ncurses
+( cd test && make ncurses LOCAL_LIBDIR=%{_libdir} && mv ncurses $RPM_BUILD_ROOT/%{_bindir}/ncursest%{MY_ABI} )
+
+%if %{is_mandriva}
+# check this first because Mageia has the /etc/redhat-release file...
+%else
+%if %{is_fedora}
+%ldconfig_scriptlets libs
+%ldconfig_scriptlets c++-libs
+%endif
+%endif
+
+%clean
+if rm -rf $RPM_BUILD_ROOT; then
+  echo OK
+else
+  find $RPM_BUILD_ROOT -type f | grep -F -v /.nfs && exit 1
+fi
+exit 0
+
+%files
+%defattr(-,root,root,-)
+%{_bindir}/*
+%{_includedir}/*
+%{_libdir}/*
+
+%changelog
+
+* Tue Dec 24 2019 Thomas Dickey
+- drop custom CC_NORMAL warning flags because setting CFLAGS interferes with
+  matching Fedora's PIE/PIC configuration.  Also, generate debug/debug-source
+  packages.
+
+* Sat Nov 16 2019 Thomas Dickey
+- modify clean-rule to work around Fedora NFS bugs.
+
+* Sat Aug 25 2018 Thomas E. Dickey
+- split spec-file into ncurses6 and ncursest6 to work around toolset breakage
+  in Fedora 28
+
+* Sat Jun 02 2018 Thomas E. Dickey
+- build-fix for Mageia
+
+* Sat May 26 2018 Thomas E. Dickey
+- use predefined configure-macro
+- separate ncurses6/ncursest6 packages
+
+* Sat Feb 10 2018 Thomas E. Dickey
+- add ncursest6 package
+- add several development features
+
+* Mon Jan 01 2018 Thomas E. Dickey
+- drop redundant files pattern for "*.pc"
+
+* Tue Dec 26 2017 Thomas E. Dickey
+- add --with-config-suffix option
+
+* Sun Apr 26 2015 Thomas E. Dickey
+- move package to /usr
+
+* Sun Apr 12 2015 Thomas E. Dickey
+- factor-out MY_ABI
+
+* Sat Mar 09 2013 Thomas E. Dickey
+- add --with-cxx-shared option to demonstrate c++ binding as shared library
+
+* Sat Oct 27 2012 Thomas E. Dickey
+- add ncurses program as "ncurses6" to provide demonstration.
+
+* Fri Jun 08 2012 Thomas E. Dickey
+- initial version.
diff --git a/package/ncursest.sym b/package/ncursest.sym
new file mode 100644
index 0000000..f50ce3d
--- /dev/null
+++ b/package/ncursest.sym
@@ -0,0 +1,887 @@
+# $Id: ncursest.sym,v 1.41 2021/08/19 23:50:26 tom Exp $
+# script for shared library symbol-visibility using libtool
+#
+# This file was generated by ncu-mapsyms
+# Configure options (5.7.20081102)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --with-hashed-db --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.8.20110226)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-weak-symbols --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-weak-symbols --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-weak-symbols --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --with-broken_linker --with-hashed-db --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-wgetch-events --with-hashed-db --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --with-broken_linker --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.9.20110404)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-weak-symbols --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-weak-symbols --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-weak-symbols --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --with-broken_linker --with-hashed-db --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-wgetch-events --with-hashed-db --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --with-broken_linker --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.9.20150530)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-weak-symbols --with-pthread --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-weak-symbols --with-pthread --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-weak-symbols --with-pthread --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --with-broken_linker --with-hashed-db --with-pthread --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --with-pthread --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-wgetch-events --with-hashed-db --with-pthread --with-termlib --with-ticlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --with-broken_linker --with-pthread --with-termlib --with-ticlib --with-trace
+# Configure options (6.0.20161029)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-weak-symbols --with-pthread --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-weak-symbols --with-pthread --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-weak-symbols --with-pthread --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --with-broken_linker --with-hashed-db --with-pthread --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --with-pthread --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-wgetch-events --with-hashed-db --with-pthread --with-termlib --with-ticlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --with-broken_linker --with-pthread --with-termlib --with-ticlib --with-trace
+BC
+COLOR_PAIR
+PAIR_NUMBER
+PC
+SP
+TYPE_ALNUM
+TYPE_ALPHA
+TYPE_ENUM
+TYPE_INTEGER
+TYPE_IPV4
+TYPE_NUMERIC
+TYPE_REGEXP
+UP
+_nc_COLORS
+_nc_COLOR_PAIRS
+_nc_COLS
+_nc_Default_Field
+_nc_Default_Form
+_nc_ESCDELAY
+_nc_LINES
+_nc_TABSIZE
+_nc__nc_outchars
+_nc_access
+_nc_acs_map
+_nc_add_to_try
+_nc_align_termtype
+_nc_alloc_entry_leaks
+_nc_basename
+_nc_boolcodes
+_nc_boolfnames
+_nc_boolnames
+_nc_capcmp
+_nc_captoinfo_leaks
+_nc_check_termtype
+_nc_check_termtype2
+_nc_codes_leaks
+_nc_comp_scan_leaks
+_nc_copy_termtype
+_nc_copy_termtype2
+_nc_count_outchars
+_nc_cur_term
+_nc_curr_col
+_nc_curr_line
+_nc_curscr
+_nc_db_close
+_nc_db_first
+_nc_db_have_data
+_nc_db_next
+_nc_db_open
+_nc_db_put
+_nc_disable_period
+_nc_doalloc
+_nc_entry_match
+_nc_env_access
+_nc_err_abort
+_nc_eventlist_timeout
+_nc_export_termtype2
+_nc_fallback
+_nc_fallback2
+_nc_find_entry
+_nc_find_prescr
+_nc_find_type_entry
+_nc_find_user_entry
+_nc_first_db
+_nc_first_name
+_nc_flush
+_nc_flush_sp
+_nc_fmt_funcptr
+_nc_forget_prescr
+_nc_free_and_exit
+_nc_free_entries
+_nc_free_termtype
+_nc_free_termtype2
+_nc_free_tic
+_nc_free_tinfo
+_nc_free_tparm
+_nc_freeall
+_nc_get_alias_table
+_nc_get_hash_table
+_nc_get_locale
+_nc_get_screensize
+_nc_get_source
+_nc_get_table
+_nc_get_tty_mode
+_nc_get_tty_mode_sp
+_nc_get_type
+_nc_getenv_num
+_nc_globals
+_nc_handle_sigwinch
+_nc_has_mouse
+_nc_head
+_nc_home_terminfo
+_nc_infotocap
+_nc_init_acs
+_nc_init_acs_sp
+_nc_init_pthreads
+_nc_init_termtype
+_nc_is_abs_path
+_nc_is_dir_path
+_nc_is_file_path
+_nc_keep_tic_dir
+_nc_keyname_leaks
+_nc_keypad
+_nc_last_db
+_nc_leaks_tinfo
+_nc_locale_breaks_acs
+_nc_locked_tracef
+_nc_mutex_lock
+_nc_mutex_trylock
+_nc_mutex_unlock
+_nc_name_match
+_nc_names_leaks
+_nc_newscr
+_nc_next_db
+_nc_numcodes
+_nc_numfnames
+_nc_numnames
+_nc_optimize_enable
+_nc_outc_wrapper
+_nc_outch
+_nc_outch_sp
+_nc_panelhook
+_nc_panelhook_sp
+_nc_pathlast
+_nc_prescreen
+_nc_ptr_Cols
+_nc_ptr_Lines
+_nc_putchar
+_nc_putchar_sp
+_nc_putp
+_nc_putp_flush
+_nc_putp_flush_sp
+_nc_putp_sp
+_nc_read_entry
+_nc_read_entry2
+_nc_read_entry_source
+_nc_read_file_entry
+_nc_read_termtype
+_nc_reset_input
+_nc_reset_tparm
+_nc_resolve_uses
+_nc_resolve_uses2
+_nc_retrace_attr_t
+_nc_retrace_bool
+_nc_retrace_chtype
+_nc_retrace_cptr
+_nc_retrace_cvoid_ptr
+_nc_retrace_int
+_nc_retrace_int_attr_t
+_nc_retrace_ptr
+_nc_retrace_sp
+_nc_retrace_unsigned
+_nc_retrace_void_ptr
+_nc_retrace_win
+_nc_ripoffline
+_nc_rootname
+_nc_safe_fopen
+_nc_safe_open3
+_nc_safe_strcat
+_nc_safe_strcpy
+_nc_screen
+_nc_screen_chain
+_nc_screen_of
+_nc_set_buffer
+_nc_set_buffer_sp
+_nc_set_no_padding
+_nc_set_source
+_nc_set_tputs_trace
+_nc_set_tty_mode
+_nc_set_tty_mode_sp
+_nc_set_type
+_nc_set_writedir
+_nc_setupterm
+_nc_sigprocmask
+_nc_stdscr
+_nc_str_copy
+_nc_str_init
+_nc_str_null
+_nc_strcodes
+_nc_strfnames
+_nc_strict_bsd
+_nc_strnames
+_nc_suppress_warnings
+_nc_syntax
+_nc_syserr_abort
+_nc_tail
+_nc_tgetent_leaks
+_nc_tic_dir
+_nc_tic_expand
+_nc_tic_written
+_nc_timed_wait
+_nc_tinfo_fkeys
+_nc_tinfo_fkeysf
+_nc_tiparm
+_nc_tparm_analyze
+_nc_tparm_err
+_nc_trace_buf
+_nc_trace_bufcat
+_nc_tracechar
+_nc_tracing
+_nc_trans_string
+_nc_trim_sgr0
+_nc_ttytype
+_nc_unicode_locale
+_nc_update_screensize
+_nc_use_tracef
+_nc_user_definable
+_nc_visbuf
+_nc_visbuf2
+_nc_visbufn
+_nc_viscbuf
+_nc_wacs_width
+_nc_warning
+_nc_write_entry
+_nc_write_object
+_traceattr
+_traceattr2
+_tracechar
+_tracechtype
+_tracechtype2
+_tracef
+addch
+addchnstr
+addchstr
+addnstr
+addstr
+alloc_pair
+alloc_pair_sp
+assume_default_colors
+assume_default_colors_sp
+attr_get
+attr_off
+attr_on
+attr_set
+attroff
+attron
+attrset
+baudrate
+baudrate_sp
+beep
+beep_sp
+bkgd
+bkgdset
+border
+bottom_panel
+box
+can_change_color
+can_change_color_sp
+cbreak
+cbreak_sp
+ceiling_panel
+chgat
+clear
+clearok
+clrtobot
+clrtoeol
+color_content
+color_content_sp
+color_set
+copywin
+current_field
+current_item
+curs_set
+curs_set_sp
+curses_trace
+curses_version
+data_ahead
+data_behind
+def_prog_mode
+def_prog_mode_sp
+def_shell_mode
+def_shell_mode_sp
+define_key
+define_key_sp
+del_curterm
+del_curterm_sp
+del_panel
+delay_output
+delay_output_sp
+delch
+deleteln
+delscreen
+delwin
+derwin
+doupdate
+doupdate_sp
+dup_field
+dupwin
+dynamic_field_info
+echo
+echo_sp
+echochar
+endwin
+endwin_sp
+erase
+erasechar
+erasechar_sp
+exit_curses
+exit_terminfo
+extended_color_content
+extended_color_content_sp
+extended_pair_content
+extended_pair_content_sp
+field_arg
+field_back
+field_buffer
+field_count
+field_fore
+field_index
+field_info
+field_init
+field_just
+field_opts
+field_opts_off
+field_opts_on
+field_pad
+field_status
+field_term
+field_type
+field_userptr
+filter
+filter_sp
+find_pair
+find_pair_sp
+flash
+flash_sp
+flushinp
+flushinp_sp
+form_driver
+form_fields
+form_init
+form_opts
+form_opts_off
+form_opts_on
+form_page
+form_request_by_name
+form_request_name
+form_sub
+form_term
+form_userptr
+form_win
+free_field
+free_fieldtype
+free_form
+free_item
+free_menu
+free_pair
+free_pair_sp
+get_escdelay
+get_escdelay_sp
+getattrs
+getbegx
+getbegy
+getbkgd
+getch
+getcurx
+getcury
+getmaxx
+getmaxy
+getmouse
+getmouse_sp
+getnstr
+getparx
+getpary
+getstr
+getwin
+getwin_sp
+ground_panel
+halfdelay
+halfdelay_sp
+has_colors
+has_colors_sp
+has_ic
+has_ic_sp
+has_il
+has_il_sp
+has_key
+has_key_sp
+has_mouse
+has_mouse_sp
+hide_panel
+hline
+idcok
+idlok
+immedok
+inch
+inchnstr
+inchstr
+init_color
+init_color_sp
+init_extended_color
+init_extended_color_sp
+init_extended_pair
+init_extended_pair_sp
+init_pair
+init_pair_sp
+initscr
+innstr
+insch
+insdelln
+insertln
+insnstr
+insstr
+instr
+intrflush
+intrflush_sp
+is_cleared
+is_idcok
+is_idlok
+is_immedok
+is_keypad
+is_leaveok
+is_linetouched
+is_nodelay
+is_notimeout
+is_pad
+is_scrollok
+is_subwin
+is_syncok
+is_term_resized
+is_term_resized_sp
+is_wintouched
+isendwin
+isendwin_sp
+item_count
+item_description
+item_index
+item_init
+item_name
+item_opts
+item_opts_off
+item_opts_on
+item_term
+item_userptr
+item_value
+item_visible
+key_defined
+key_defined_sp
+keybound
+keybound_sp
+keyname
+keyname_sp
+keyok
+keyok_sp
+keypad
+killchar
+killchar_sp
+leaveok
+link_field
+link_fieldtype
+longname
+longname_sp
+mcprint
+mcprint_sp
+menu_back
+menu_driver
+menu_fore
+menu_format
+menu_grey
+menu_init
+menu_items
+menu_mark
+menu_opts
+menu_opts_off
+menu_opts_on
+menu_pad
+menu_pattern
+menu_request_by_name
+menu_request_name
+menu_spacing
+menu_sub
+menu_term
+menu_userptr
+menu_win
+meta
+mouse_trafo
+mouseinterval
+mouseinterval_sp
+mousemask
+mousemask_sp
+move
+move_field
+move_panel
+mvaddch
+mvaddchnstr
+mvaddchstr
+mvaddnstr
+mvaddstr
+mvchgat
+mvcur
+mvcur_sp
+mvdelch
+mvderwin
+mvgetch
+mvgetnstr
+mvgetstr
+mvhline
+mvinch
+mvinchnstr
+mvinchstr
+mvinnstr
+mvinsch
+mvinsnstr
+mvinsstr
+mvinstr
+mvprintw
+mvscanw
+mvvline
+mvwaddch
+mvwaddchnstr
+mvwaddchstr
+mvwaddnstr
+mvwaddstr
+mvwchgat
+mvwdelch
+mvwgetch
+mvwgetnstr
+mvwgetstr
+mvwhline
+mvwin
+mvwinch
+mvwinchnstr
+mvwinchstr
+mvwinnstr
+mvwinsch
+mvwinsnstr
+mvwinsstr
+mvwinstr
+mvwprintw
+mvwscanw
+mvwvline
+napms
+napms_sp
+new_field
+new_fieldtype
+new_form
+new_form_sp
+new_item
+new_menu
+new_menu_sp
+new_page
+new_panel
+new_prescr
+newpad
+newpad_sp
+newterm
+newterm_sp
+newwin
+newwin_sp
+nl
+nl_sp
+nocbreak
+nocbreak_sp
+nodelay
+noecho
+noecho_sp
+nofilter
+nofilter_sp
+nonl
+nonl_sp
+noqiflush
+noqiflush_sp
+noraw
+noraw_sp
+notimeout
+ospeed
+overlay
+overwrite
+pair_content
+pair_content_sp
+panel_above
+panel_below
+panel_hidden
+panel_userptr
+panel_window
+pechochar
+pnoutrefresh
+pos_form_cursor
+pos_menu_cursor
+post_form
+post_menu
+prefresh
+printw
+putp
+putp_sp
+putwin
+qiflush
+qiflush_sp
+raw
+raw_sp
+redrawwin
+refresh
+replace_panel
+reset_color_pairs
+reset_color_pairs_sp
+reset_prog_mode
+reset_prog_mode_sp
+reset_shell_mode
+reset_shell_mode_sp
+resetty
+resetty_sp
+resize_term
+resize_term_sp
+resizeterm
+resizeterm_sp
+restartterm
+restartterm_sp
+ripoffline
+ripoffline_sp
+savetty
+savetty_sp
+scale_form
+scale_menu
+scanw
+scr_dump
+scr_init
+scr_init_sp
+scr_restore
+scr_restore_sp
+scr_set
+scr_set_sp
+scrl
+scroll
+scrollok
+set_current_field
+set_current_item
+set_curterm
+set_curterm_sp
+set_escdelay
+set_escdelay_sp
+set_field_back
+set_field_buffer
+set_field_fore
+set_field_init
+set_field_just
+set_field_opts
+set_field_pad
+set_field_status
+set_field_term
+set_field_type
+set_field_userptr
+set_fieldtype_arg
+set_fieldtype_choice
+set_form_fields
+set_form_init
+set_form_opts
+set_form_page
+set_form_sub
+set_form_term
+set_form_userptr
+set_form_win
+set_item_init
+set_item_opts
+set_item_term
+set_item_userptr
+set_item_value
+set_max_field
+set_menu_back
+set_menu_fore
+set_menu_format
+set_menu_grey
+set_menu_init
+set_menu_items
+set_menu_mark
+set_menu_opts
+set_menu_pad
+set_menu_pattern
+set_menu_spacing
+set_menu_sub
+set_menu_term
+set_menu_userptr
+set_menu_win
+set_new_page
+set_panel_userptr
+set_tabsize
+set_tabsize_sp
+set_term
+set_top_row
+setscrreg
+setupterm
+show_panel
+slk_attr
+slk_attr_set
+slk_attr_set_sp
+slk_attr_sp
+slk_attroff
+slk_attroff_sp
+slk_attron
+slk_attron_sp
+slk_attrset
+slk_attrset_sp
+slk_clear
+slk_clear_sp
+slk_color
+slk_color_sp
+slk_init
+slk_init_sp
+slk_label
+slk_label_sp
+slk_noutrefresh
+slk_noutrefresh_sp
+slk_refresh
+slk_refresh_sp
+slk_restore
+slk_restore_sp
+slk_set
+slk_set_sp
+slk_touch
+slk_touch_sp
+standend
+standout
+start_color
+start_color_sp
+subpad
+subwin
+syncok
+termattrs
+termattrs_sp
+termname
+termname_sp
+tgetent
+tgetent_sp
+tgetflag
+tgetflag_sp
+tgetnum
+tgetnum_sp
+tgetstr
+tgetstr_sp
+tgoto
+tigetflag
+tigetflag_sp
+tigetnum
+tigetnum_sp
+tigetstr
+tigetstr_sp
+timeout
+tiparm
+top_panel
+top_row
+touchline
+touchwin
+tparm
+tputs
+tputs_sp
+trace
+typeahead
+typeahead_sp
+unctrl
+unctrl_sp
+unfocus_current_field
+ungetch
+ungetch_sp
+ungetmouse
+ungetmouse_sp
+unpost_form
+unpost_menu
+untouchwin
+update_panels
+update_panels_sp
+use_default_colors
+use_default_colors_sp
+use_env
+use_env_sp
+use_extended_names
+use_legacy_coding
+use_legacy_coding_sp
+use_screen
+use_tioctl
+use_tioctl_sp
+use_window
+vidattr
+vidattr_sp
+vidputs
+vidputs_sp
+vline
+vw_printw
+vw_scanw
+vwprintw
+vwscanw
+waddch
+waddchnstr
+waddchstr
+waddnstr
+waddstr
+wattr_get
+wattr_off
+wattr_on
+wattr_set
+wattroff
+wattron
+wattrset
+wbkgd
+wbkgdset
+wborder
+wchgat
+wclear
+wclrtobot
+wclrtoeol
+wcolor_set
+wcursyncup
+wdelch
+wdeleteln
+wechochar
+wenclose
+werase
+wgetch
+wgetch_events
+wgetdelay
+wgetnstr
+wgetnstr_events
+wgetparent
+wgetscrreg
+wgetstr
+whline
+winch
+winchnstr
+winchstr
+winnstr
+winsch
+winsdelln
+winsertln
+winsnstr
+winsstr
+winstr
+wmouse_trafo
+wmove
+wnoutrefresh
+wprintw
+wredrawln
+wrefresh
+wresize
+wscanw
+wscrl
+wsetscrreg
+wstandend
+wstandout
+wsyncdown
+wsyncup
+wtimeout
+wtouchln
+wvline
diff --git a/package/ncursestw.map b/package/ncursestw.map
new file mode 100644
index 0000000..f514b97
--- /dev/null
+++ b/package/ncursestw.map
@@ -0,0 +1,1307 @@
+# $Id: ncursestw.map,v 1.56 2021/10/10 15:22:33 tom Exp $
+# script for shared library symbol-versioning using ld
+#
+# This file was generated by ncu-mapsyms
+# Configure options (5.7.20081102)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-widec --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-widec --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --enable-widec --with-hashed-db --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.8.20110226)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-widec --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --enable-widec --with-broken_linker --with-hashed-db --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-wgetch-events --enable-widec --with-hashed-db --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-widec --with-broken_linker --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.9.20110404)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-widec --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --enable-widec --with-broken_linker --with-hashed-db --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-wgetch-events --enable-widec --with-hashed-db --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-widec --with-broken_linker --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.9.20150530)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-widec --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --enable-widec --with-broken_linker --with-hashed-db --with-pthread --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-wgetch-events --enable-widec --with-hashed-db --with-pthread --with-termlib --with-ticlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-widec --with-broken_linker --with-pthread --with-termlib --with-ticlib --with-trace
+# Configure options (6.0.current)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-widec --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --enable-widec --with-broken_linker --with-hashed-db --with-pthread --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-wgetch-events --enable-widec --with-hashed-db --with-pthread --with-termlib --with-ticlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-widec --with-broken_linker --with-pthread --with-termlib --with-ticlib --with-trace
+
+NCURSES_TIC_5.0.19991023 {
+	global:
+		_nc_capcmp;
+		_nc_check_termtype;
+		_nc_entry_match;
+		_nc_infotocap;
+		_nc_read_entry_source;
+		_nc_reset_input;
+		_nc_resolve_uses;
+		_nc_screen;
+		_nc_set_writedir;
+		_nc_syntax;
+		_nc_tic_expand;
+		_nc_tic_written;
+		_nc_trans_string;
+		_nc_write_entry;
+	local:
+		_nc_captoinfo;
+		_nc_comment_end;
+		_nc_comment_start;
+		_nc_copy_entry;
+		_nc_curr_file_pos;
+		_nc_curr_token;
+		_nc_get_token;
+		_nc_init_entry;
+		_nc_merge_entry;
+		_nc_panic_mode;
+		_nc_parse_entry;
+		_nc_push_token;
+		_nc_save_str;
+		_nc_start_line;
+		_nc_wrap_entry;
+};
+
+NCURSES_TIC_5.1.20000708 {
+	global:
+		_nc_disable_period;
+} NCURSES_TIC_5.0.19991023;
+
+NCURSES_TIC_5.5.20051010 {
+	global:
+		_nc_alloc_entry_leaks;
+		_nc_captoinfo_leaks;
+		_nc_check_termtype2;
+		_nc_comp_scan_leaks;
+		_nc_resolve_uses2;
+} NCURSES_TIC_5.1.20000708;
+
+NCURSES_TIC_5.7.20081102 {
+	global:
+		_nc_free_tic;
+	local:
+		_nc_comp_captab_leaks;
+		_nc_leaks_tic;
+} NCURSES_TIC_5.5.20051010;
+
+NCURSES_TIC_5.9.20150530 {
+	global:
+		_nc_strict_bsd;
+} NCURSES_TIC_5.7.20081102;
+
+NCURSES_TIC_6.1.20171230 {
+	global:
+		_nc_read_entry2;
+		_nc_write_object;
+	local:
+		_*;
+} NCURSES_TIC_5.9.20150530;
+
+NCURSES_TINFO_5.0.19991023 {
+	global:
+		BC;
+		PC;
+		SP;
+		UP;
+		_nc_access;
+		_nc_add_to_try;
+		_nc_copy_termtype;
+		_nc_curr_col;
+		_nc_curr_line;
+		_nc_doalloc;
+		_nc_err_abort;
+		_nc_fallback;
+		_nc_find_entry;
+		_nc_find_type_entry;
+		_nc_first_name;
+		_nc_free_entries;
+		_nc_free_termtype;
+		_nc_free_tparm;
+		_nc_freeall;
+		_nc_get_hash_table;
+		_nc_get_table;
+		_nc_get_tty_mode;
+		_nc_get_type;
+		_nc_getenv_num;
+		_nc_head;
+		_nc_home_terminfo;
+		_nc_init_acs;
+		_nc_keep_tic_dir;
+		_nc_keypad;
+		_nc_name_match;
+		_nc_outch;
+		_nc_read_entry;
+		_nc_read_file_entry;
+		_nc_screen_chain;
+		_nc_set_buffer;
+		_nc_set_source;
+		_nc_set_tty_mode;
+		_nc_set_type;
+		_nc_suppress_warnings;
+		_nc_syserr_abort;
+		_nc_tail;
+		_nc_tic_dir;
+		_nc_timed_wait;
+		_nc_tinfo_fkeysf;
+		_nc_trace_buf;
+		_nc_tracing;
+		_nc_update_screensize;
+		_nc_visbuf;
+		_nc_visbuf2;
+		_nc_warning;
+		_tracechar;
+		baudrate;
+		cbreak;
+		curs_set;
+		curses_version;
+		def_prog_mode;
+		def_shell_mode;
+		define_key;
+		del_curterm;
+		delay_output;
+		erasechar;
+		flushinp;
+		halfdelay;
+		has_ic;
+		has_il;
+		has_key;
+		idcok;
+		idlok;
+		intrflush;
+		keybound;
+		keyname;
+		keyok;
+		keypad;
+		killchar;
+		longname;
+		meta;
+		napms;
+		nocbreak;
+		nodelay;
+		noqiflush;
+		noraw;
+		notimeout;
+		ospeed;
+		putp;
+		qiflush;
+		raw;
+		reset_prog_mode;
+		reset_shell_mode;
+		resetty;
+		savetty;
+		set_curterm;
+		setupterm;
+		termname;
+		tgetent;
+		tgetflag;
+		tgetnum;
+		tgetstr;
+		tgoto;
+		tigetflag;
+		tigetnum;
+		tigetstr;
+		tparm;
+		tputs;
+		trace;
+		typeahead;
+		unctrl;
+		use_env;
+		wtimeout;
+	local:
+		_nc_baudrate;
+		_nc_expand_try;
+		_nc_init_keytry;
+		_nc_nulls_sent;
+		_nc_ospeed;
+		_nc_read_termcap;
+		_nc_read_termcap_entry;
+		_nc_remove_key;
+		_nc_remove_string;
+		_nc_trace_tries;
+		_nc_tracebits;
+};
+
+NCURSES_TINFO_5.1.20000708 {
+	global:
+		_nc_align_termtype;
+		_nc_flush;
+		_nc_tinfo_fkeys;
+		_nc_user_definable;
+		use_extended_names;
+} NCURSES_TINFO_5.0.19991023;
+
+NCURSES_TINFO_5.2.20001021 {
+	global:
+		_nc_basename;
+		_nc_env_access;
+		_nc_safe_strcat;
+		_nc_safe_strcpy;
+		_nc_str_copy;
+		_nc_str_init;
+		_nc_str_null;
+} NCURSES_TINFO_5.1.20000708;
+
+NCURSES_TINFO_5.3.20021019 {
+	global:
+		_nc_rootname;
+		_nc_tparm_err;
+		_nc_visbufn;
+} NCURSES_TINFO_5.2.20001021;
+
+NCURSES_TINFO_5.4.20040208 {
+	global:
+		_nc_get_locale;
+		_nc_locale_breaks_acs;
+		_nc_pathlast;
+		_nc_retrace_attr_t;
+		_nc_retrace_bool;
+		_nc_retrace_chtype;
+		_nc_retrace_int;
+		_nc_retrace_ptr;
+		_nc_retrace_sp;
+		_nc_retrace_unsigned;
+		_nc_retrace_win;
+		_nc_tparm_analyze;
+		_nc_trace_bufcat;
+		_nc_unicode_locale;
+		_traceattr;
+		_traceattr2;
+		_tracechtype;
+		_tracechtype2;
+		_tracef;
+		key_defined;
+	local:
+		_nc_altcharset_name;
+		_nc_trace_ttymode;
+} NCURSES_TINFO_5.3.20021019;
+
+NCURSES_TINFO_5.5.20051010 {
+	global:
+		_nc_get_source;
+		_nc_retrace_cptr;
+		_nc_retrace_cvoid_ptr;
+		_nc_retrace_void_ptr;
+		_nc_setupterm;
+		_nc_trim_sgr0;
+	local:
+		_nc_delink_entry;
+		_nc_free_entry;
+} NCURSES_TINFO_5.4.20040208;
+
+NCURSES_TINFO_5.6.20061217 {
+	global:
+		_nc_db_close;
+		_nc_db_first;
+		_nc_db_have_data;
+		_nc_db_next;
+		_nc_db_open;
+		_nc_db_put;
+		_nc_eventlist_timeout;
+		_nc_first_db;
+		_nc_handle_sigwinch;
+		_nc_is_abs_path;
+		_nc_is_dir_path;
+		_nc_is_file_path;
+		_nc_keyname_leaks;
+		_nc_last_db;
+		_nc_next_db;
+		_nc_read_termtype;
+		_nc_tgetent_leaks;
+		_nc_viscbuf;
+	local:
+		_nc_db_get;
+		_nc_db_have_index;
+		_nc_hashed_db;
+		_nc_viscbuf2;
+} NCURSES_TINFO_5.5.20051010;
+
+NCURSES_TINFO_5.7.20081102 {
+	global:
+		_nc_COLS;
+		_nc_LINES;
+		_nc_TABSIZE;
+		_nc__nc_outchars;
+		_nc_acs_map;
+		_nc_boolcodes;
+		_nc_boolfnames;
+		_nc_boolnames;
+		_nc_codes_leaks;
+		_nc_count_outchars;
+		_nc_cur_term;
+		_nc_curscr;
+		_nc_free_tinfo;
+		_nc_get_alias_table;
+		_nc_get_screensize;
+		_nc_globals;
+		_nc_init_pthreads;
+		_nc_leaks_tinfo;
+		_nc_locked_tracef;
+		_nc_mutex_lock;
+		_nc_mutex_trylock;
+		_nc_mutex_unlock;
+		_nc_names_leaks;
+		_nc_newscr;
+		_nc_numcodes;
+		_nc_numfnames;
+		_nc_numnames;
+		_nc_prescreen;
+		_nc_ptr_Cols;
+		_nc_ptr_Lines;
+		_nc_screen_of;
+		_nc_set_no_padding;
+		_nc_set_tputs_trace;
+		_nc_stdscr;
+		_nc_strcodes;
+		_nc_strfnames;
+		_nc_strnames;
+		_nc_tracechar;
+		_nc_ttytype;
+		_nc_use_tracef;
+		_nc_viswbuf;
+		_nc_viswbufn;
+		_nc_viswibuf;
+		_tracecchar_t;
+		_tracecchar_t2;
+		set_tabsize;
+	local:
+		_nc__nc_tputs_trace;
+		_nc_keyname;
+		_nc_mutex_init;
+		_nc_unctrl;
+		_nc_viswbuf2;
+} NCURSES_TINFO_5.6.20061217;
+
+NCURSES_TINFO_5.8.20110226 {
+	global:
+		_nc_flush_sp;
+		_nc_get_tty_mode_sp;
+		_nc_init_acs_sp;
+		_nc_outc_wrapper;
+		_nc_outch_sp;
+		_nc_putp;
+		_nc_putp_flush;
+		_nc_putp_flush_sp;
+		_nc_putp_sp;
+		_nc_retrace_int_attr_t;
+		_nc_set_buffer_sp;
+		_nc_set_tty_mode_sp;
+		_nc_sigprocmask;
+		baudrate_sp;
+		cbreak_sp;
+		curs_set_sp;
+		def_prog_mode_sp;
+		def_shell_mode_sp;
+		define_key_sp;
+		del_curterm_sp;
+		delay_output_sp;
+		erasechar_sp;
+		flushinp_sp;
+		halfdelay_sp;
+		has_ic_sp;
+		has_il_sp;
+		has_key_sp;
+		intrflush_sp;
+		key_defined_sp;
+		keybound_sp;
+		keyname_sp;
+		keyok_sp;
+		killchar_sp;
+		longname_sp;
+		napms_sp;
+		new_prescr;
+		nocbreak_sp;
+		noqiflush_sp;
+		noraw_sp;
+		putp_sp;
+		qiflush_sp;
+		raw_sp;
+		reset_prog_mode_sp;
+		reset_shell_mode_sp;
+		resetty_sp;
+		savetty_sp;
+		set_curterm_sp;
+		set_tabsize_sp;
+		termname_sp;
+		tgetent_sp;
+		tgetflag_sp;
+		tgetnum_sp;
+		tgetstr_sp;
+		tigetflag_sp;
+		tigetnum_sp;
+		tigetstr_sp;
+		tiparm;
+		tputs_sp;
+		typeahead_sp;
+		unctrl_sp;
+		use_env_sp;
+	local:
+		_nc_get_cur_term;
+		_nc_get_cur_term_sp;
+		_nc_get_hash_info;
+		_nc_ptr_Tabsize;
+		_nc_retrace_char;
+		_nc_setup_tinfo;
+		_nc_tinfo_cmdch;
+} NCURSES_TINFO_5.7.20081102;
+
+NCURSES_TINFO_5.9.20150530 {
+	global:
+		_nc_init_termtype;
+		_nc_putchar;
+		_nc_putchar_sp;
+		use_tioctl;
+		use_tioctl_sp;
+	local:
+		_nc_comp_error_leaks;
+		_nc_db_iterator_leaks;
+		_nc_setenv_num;
+} NCURSES_TINFO_5.8.20110226;
+
+NCURSES_TINFO_6.1.20171230 {
+	global:
+		_nc_copy_termtype2;
+		_nc_export_termtype2;
+		_nc_fallback2;
+		_nc_find_prescr;
+		_nc_forget_prescr;
+		_nc_free_termtype2;
+} NCURSES_TINFO_5.9.20150530;
+
+NCURSES_TINFO_6.2.20200212 {
+	global:
+		_nc_find_user_entry;
+		_nc_fmt_funcptr;
+		_nc_wacs_width;
+		curses_trace;
+		exit_terminfo;
+} NCURSES_TINFO_6.1.20171230;
+
+NCURSES_TINFO_6.2.20211010 {
+	global:
+		_nc_reset_tparm;
+		_nc_tiparm;
+		_nc_safe_fopen;
+		_nc_safe_open3;
+		erasewchar_sp;
+		killwchar_sp;
+	local:
+		_*;
+} NCURSES_TINFO_6.2.20200212;
+
+NCURSESTW_5.7.20081102 {
+	global:
+		COLOR_PAIR;
+		PAIR_NUMBER;
+		TYPE_ALNUM;
+		TYPE_ALPHA;
+		TYPE_ENUM;
+		TYPE_INTEGER;
+		TYPE_IPV4;
+		TYPE_NUMERIC;
+		TYPE_REGEXP;
+		_nc_COLORS;
+		_nc_COLOR_PAIRS;
+		_nc_Default_Field;	# deprecated in ABI6
+		_nc_Default_Form;	# deprecated in ABI6
+		_nc_ESCDELAY;
+		_nc_free_and_exit;
+		_nc_has_mouse;	# deprecated in ABI6
+		_nc_optimize_enable;
+		_nc_panelhook;
+		_nc_ripoffline;
+		_nc_wacs;
+		_nc_wcrtomb;
+		add_wch;
+		add_wchnstr;
+		add_wchstr;
+		addch;
+		addchnstr;
+		addchstr;
+		addnstr;
+		addnwstr;
+		addstr;
+		addwstr;
+		assume_default_colors;
+		attr_get;
+		attr_off;
+		attr_on;
+		attr_set;
+		attroff;
+		attron;
+		attrset;
+		beep;
+		bkgd;
+		bkgdset;
+		bkgrnd;
+		bkgrndset;
+		border;
+		border_set;
+		bottom_panel;
+		box;
+		box_set;
+		can_change_color;
+		chgat;
+		clear;
+		clearok;
+		clrtobot;
+		clrtoeol;
+		color_content;
+		color_set;
+		copywin;
+		current_field;
+		current_item;
+		data_ahead;
+		data_behind;
+		del_panel;
+		delch;
+		deleteln;
+		delscreen;
+		delwin;
+		derwin;
+		doupdate;
+		dup_field;
+		dupwin;
+		dynamic_field_info;
+		echo;
+		echo_wchar;
+		echochar;
+		endwin;
+		erase;
+		erasewchar;
+		field_arg;
+		field_back;
+		field_buffer;
+		field_count;
+		field_fore;
+		field_index;
+		field_info;
+		field_init;
+		field_just;
+		field_opts;
+		field_opts_off;
+		field_opts_on;
+		field_pad;
+		field_status;
+		field_term;
+		field_type;
+		field_userptr;
+		filter;
+		flash;
+		form_driver;
+		form_fields;
+		form_init;
+		form_opts;
+		form_opts_off;
+		form_opts_on;
+		form_page;
+		form_request_by_name;
+		form_request_name;
+		form_sub;
+		form_term;
+		form_userptr;
+		form_win;
+		free_field;
+		free_fieldtype;
+		free_form;
+		free_item;
+		free_menu;
+		get_wch;
+		get_wstr;
+		getattrs;
+		getbegx;
+		getbegy;
+		getbkgd;
+		getbkgrnd;
+		getcchar;
+		getch;
+		getcurx;
+		getcury;
+		getmaxx;
+		getmaxy;
+		getmouse;
+		getn_wstr;
+		getnstr;
+		getparx;
+		getpary;
+		getstr;
+		getwin;
+		has_colors;
+		hide_panel;
+		hline;
+		hline_set;
+		immedok;
+		in_wch;
+		in_wchnstr;
+		in_wchstr;
+		inch;
+		inchnstr;
+		inchstr;
+		init_color;
+		init_pair;
+		initscr;
+		innstr;
+		innwstr;
+		ins_nwstr;
+		ins_wch;
+		ins_wstr;
+		insch;
+		insdelln;
+		insertln;
+		insnstr;
+		insstr;
+		instr;
+		inwstr;
+		is_cleared;
+		is_idcok;
+		is_idlok;
+		is_immedok;
+		is_keypad;
+		is_leaveok;
+		is_linetouched;
+		is_nodelay;
+		is_notimeout;
+		is_scrollok;
+		is_syncok;
+		is_term_resized;
+		is_wintouched;
+		isendwin;
+		item_count;
+		item_description;
+		item_index;
+		item_init;
+		item_name;
+		item_opts;
+		item_opts_off;
+		item_opts_on;
+		item_term;
+		item_userptr;
+		item_value;
+		item_visible;
+		key_name;
+		killwchar;
+		leaveok;
+		link_field;
+		link_fieldtype;
+		mcprint;
+		menu_back;
+		menu_driver;
+		menu_fore;
+		menu_format;
+		menu_grey;
+		menu_init;
+		menu_items;
+		menu_mark;
+		menu_opts;
+		menu_opts_off;
+		menu_opts_on;
+		menu_pad;
+		menu_pattern;
+		menu_request_by_name;
+		menu_request_name;
+		menu_spacing;
+		menu_sub;
+		menu_term;
+		menu_userptr;
+		menu_win;
+		mouse_trafo;
+		mouseinterval;
+		mousemask;
+		move;
+		move_field;
+		move_panel;
+		mvadd_wch;
+		mvadd_wchnstr;
+		mvadd_wchstr;
+		mvaddch;
+		mvaddchnstr;
+		mvaddchstr;
+		mvaddnstr;
+		mvaddnwstr;
+		mvaddstr;
+		mvaddwstr;
+		mvchgat;
+		mvcur;
+		mvdelch;
+		mvderwin;
+		mvget_wch;
+		mvget_wstr;
+		mvgetch;
+		mvgetn_wstr;
+		mvgetnstr;
+		mvgetstr;
+		mvhline;
+		mvhline_set;
+		mvin_wch;
+		mvin_wchnstr;
+		mvin_wchstr;
+		mvinch;
+		mvinchnstr;
+		mvinchstr;
+		mvinnstr;
+		mvinnwstr;
+		mvins_nwstr;
+		mvins_wch;
+		mvins_wstr;
+		mvinsch;
+		mvinsnstr;
+		mvinsstr;
+		mvinstr;
+		mvinwstr;
+		mvprintw;
+		mvscanw;
+		mvvline;
+		mvvline_set;
+		mvwadd_wch;
+		mvwadd_wchnstr;
+		mvwadd_wchstr;
+		mvwaddch;
+		mvwaddchnstr;
+		mvwaddchstr;
+		mvwaddnstr;
+		mvwaddnwstr;
+		mvwaddstr;
+		mvwaddwstr;
+		mvwchgat;
+		mvwdelch;
+		mvwget_wch;
+		mvwget_wstr;
+		mvwgetch;
+		mvwgetn_wstr;
+		mvwgetnstr;
+		mvwgetstr;
+		mvwhline;
+		mvwhline_set;
+		mvwin;
+		mvwin_wch;
+		mvwin_wchnstr;
+		mvwin_wchstr;
+		mvwinch;
+		mvwinchnstr;
+		mvwinchstr;
+		mvwinnstr;
+		mvwinnwstr;
+		mvwins_nwstr;
+		mvwins_wch;
+		mvwins_wstr;
+		mvwinsch;
+		mvwinsnstr;
+		mvwinsstr;
+		mvwinstr;
+		mvwinwstr;
+		mvwprintw;
+		mvwscanw;
+		mvwvline;
+		mvwvline_set;
+		new_field;
+		new_fieldtype;
+		new_form;
+		new_item;
+		new_menu;
+		new_page;
+		new_panel;
+		newpad;
+		newterm;
+		newwin;
+		nl;
+		noecho;
+		nofilter;
+		nonl;
+		overlay;
+		overwrite;
+		pair_content;
+		panel_above;
+		panel_below;
+		panel_hidden;
+		panel_userptr;
+		panel_window;
+		pecho_wchar;
+		pechochar;
+		pnoutrefresh;
+		pos_form_cursor;
+		pos_menu_cursor;
+		post_form;
+		post_menu;
+		prefresh;
+		printw;
+		putwin;
+		redrawwin;
+		refresh;
+		replace_panel;
+		resize_term;
+		resizeterm;
+		restartterm;
+		ripoffline;
+		scale_form;
+		scale_menu;
+		scanw;
+		scr_dump;
+		scr_init;
+		scr_restore;
+		scr_set;
+		scrl;
+		scroll;
+		scrollok;
+		set_current_field;
+		set_current_item;
+		set_escdelay;
+		set_field_back;
+		set_field_buffer;
+		set_field_fore;
+		set_field_init;
+		set_field_just;
+		set_field_opts;
+		set_field_pad;
+		set_field_status;
+		set_field_term;
+		set_field_type;
+		set_field_userptr;
+		set_fieldtype_arg;
+		set_fieldtype_choice;
+		set_form_fields;
+		set_form_init;
+		set_form_opts;
+		set_form_page;
+		set_form_sub;
+		set_form_term;
+		set_form_userptr;
+		set_form_win;
+		set_item_init;
+		set_item_opts;
+		set_item_term;
+		set_item_userptr;
+		set_item_value;
+		set_max_field;
+		set_menu_back;
+		set_menu_fore;
+		set_menu_format;
+		set_menu_grey;
+		set_menu_init;
+		set_menu_items;
+		set_menu_mark;
+		set_menu_opts;
+		set_menu_pad;
+		set_menu_pattern;
+		set_menu_spacing;
+		set_menu_sub;
+		set_menu_term;
+		set_menu_userptr;
+		set_menu_win;
+		set_new_page;
+		set_panel_userptr;
+		set_term;
+		set_top_row;
+		setcchar;
+		setscrreg;
+		show_panel;
+		slk_attr;
+		slk_attr_off;
+		slk_attr_on;
+		slk_attr_set;
+		slk_attroff;
+		slk_attron;
+		slk_attrset;
+		slk_clear;
+		slk_color;
+		slk_init;
+		slk_label;
+		slk_noutrefresh;
+		slk_refresh;
+		slk_restore;
+		slk_set;
+		slk_touch;
+		slk_wset;
+		standend;
+		standout;
+		start_color;
+		subpad;
+		subwin;
+		syncok;
+		term_attrs;
+		termattrs;
+		timeout;
+		top_panel;
+		top_row;
+		touchline;
+		touchwin;
+		unget_wch;
+		ungetch;
+		ungetmouse;
+		unpost_form;
+		unpost_menu;
+		untouchwin;
+		update_panels;
+		use_default_colors;
+		use_legacy_coding;
+		use_screen;
+		use_window;
+		vid_attr;
+		vid_puts;
+		vidattr;
+		vidputs;
+		vline;
+		vline_set;
+		vw_printw;
+		vw_scanw;
+		vwprintw;
+		vwscanw;
+		wadd_wch;
+		wadd_wchnstr;
+		wadd_wchstr;
+		waddch;
+		waddchnstr;
+		waddchstr;
+		waddnstr;
+		waddnwstr;
+		waddstr;
+		waddwstr;
+		wattr_get;
+		wattr_off;
+		wattr_on;
+		wattr_set;
+		wattroff;
+		wattron;
+		wattrset;
+		wbkgd;
+		wbkgdset;
+		wbkgrnd;
+		wbkgrndset;
+		wborder;
+		wborder_set;
+		wchgat;
+		wclear;
+		wclrtobot;
+		wclrtoeol;
+		wcolor_set;
+		wcursyncup;
+		wdelch;
+		wdeleteln;
+		wecho_wchar;
+		wechochar;
+		wenclose;
+		werase;
+		wget_wch;
+		wget_wstr;
+		wgetbkgrnd;
+		wgetch;
+		wgetch_events;
+		wgetn_wstr;
+		wgetnstr;
+		wgetnstr_events;
+		wgetparent;
+		wgetscrreg;
+		wgetstr;
+		whline;
+		whline_set;
+		win_wch;
+		win_wchnstr;
+		win_wchstr;
+		winch;
+		winchnstr;
+		winchstr;
+		winnstr;
+		winnwstr;
+		wins_nwstr;
+		wins_wch;
+		wins_wstr;
+		winsch;
+		winsdelln;
+		winsertln;
+		winsnstr;
+		winsstr;
+		winstr;
+		winwstr;
+		wmouse_trafo;
+		wmove;
+		wnoutrefresh;
+		wprintw;
+		wredrawln;
+		wrefresh;
+		wresize;
+		wscanw;
+		wscrl;
+		wsetscrreg;
+		wstandend;
+		wstandout;
+		wsyncdown;
+		wsyncup;
+		wtouchln;
+		wunctrl;
+		wvline;
+		wvline_set;
+	local:
+		_nc_Calculate_Item_Length_and_Width;
+		_nc_Calculate_Text_Width;
+		_nc_Connect_Items;
+		_nc_Copy_Argument;
+		_nc_Copy_Type;
+		_nc_Default_FieldType;
+		_nc_Default_Item;
+		_nc_Default_Menu;
+		_nc_Disconnect_Items;
+		_nc_Draw_Menu;
+		_nc_First_Active_Field;
+		_nc_Free_Argument;
+		_nc_Free_Type;
+		_nc_Internal_Validation;
+		_nc_Link_Items;
+		_nc_Make_Argument;
+		_nc_Match_Next_Character_In_Item_Name;
+		_nc_New_TopRow_and_CurrentItem;
+		_nc_Position_Form_Cursor;
+		_nc_Post_Item;
+		_nc_Refresh_Current_Field;
+		_nc_Set_Current_Field;
+		_nc_Set_Form_Page;
+		_nc_Show_Menu;
+		_nc_Synchronize_Attributes;
+		_nc_Synchronize_Options;
+		_nc_Touchline;
+		_nc_Touchpan;
+		_nc_Widen_String;
+		_nc_Wnoutrefresh;
+		_nc_build_wch;
+		_nc_dPanel;
+		_nc_dStack;
+		_nc_do_color;
+		_nc_expanded;
+		_nc_fifo_dump;
+		_nc_freewin;
+		_nc_hash_map;
+		_nc_init_wacs;
+		_nc_insert_ch;
+		_nc_is_charable;
+		_nc_linedump;
+		_nc_make_oldhash;
+		_nc_makenew;
+		_nc_memmove;
+		_nc_menu_cursor_pos;
+		_nc_msec_cost;
+		_nc_mvcur_init;
+		_nc_mvcur_resume;
+		_nc_mvcur_wrap;
+		_nc_my_visbuf;
+		_nc_oldnums;
+		_nc_printf_string;
+		_nc_render;
+		_nc_reset_colors;
+		_nc_retrace_field;
+		_nc_retrace_field_ptr;
+		_nc_retrace_field_type;
+		_nc_retrace_form;
+		_nc_retrace_form_hook;
+		_nc_retrace_item;
+		_nc_retrace_item_opts;
+		_nc_retrace_item_ptr;
+		_nc_retrace_menu;
+		_nc_retrace_menu_hook;
+		_nc_retrace_menu_opts;
+		_nc_retrace_panel;
+		_nc_screen_init;
+		_nc_screen_resume;
+		_nc_screen_wrap;
+		_nc_scroll_oldhash;
+		_nc_scroll_optimize;
+		_nc_scroll_window;
+		_nc_scrolln;
+		_nc_setupscreen;
+		_nc_signal_handler;
+		_nc_slk_initialize;
+		_nc_synchook;
+		_nc_to_char;
+		_nc_to_widechar;
+		_nc_trace_xnames;
+		_nc_tracemouse;
+		_nc_ungetch;
+		_nc_varargs;
+		_nc_vsscanf;
+		_nc_waddch_nosync;
+		_nc_wchstrlen;
+		_nc_wgetch;
+		_tracedump;
+		_tracemouse;
+};
+
+NCURSESTW_5.8.20110226 {
+	global:
+		_nc_panelhook_sp;
+		assume_default_colors_sp;
+		beep_sp;
+		can_change_color_sp;
+		ceiling_panel;
+		color_content_sp;
+		doupdate_sp;
+		echo_sp;
+		endwin_sp;
+		filter_sp;
+		flash_sp;
+		get_escdelay;
+		get_escdelay_sp;
+		getmouse_sp;
+		getwin_sp;
+		ground_panel;
+		has_colors_sp;
+		has_mouse;
+		has_mouse_sp;
+		init_color_sp;
+		init_pair_sp;
+		is_pad;
+		is_subwin;
+		is_term_resized_sp;
+		isendwin_sp;
+		mcprint_sp;
+		mouseinterval_sp;
+		mousemask_sp;
+		mvcur_sp;
+		new_form_sp;
+		new_menu_sp;
+		newpad_sp;
+		newterm_sp;
+		newwin_sp;
+		nl_sp;
+		noecho_sp;
+		nofilter_sp;
+		nonl_sp;
+		pair_content_sp;
+		resize_term_sp;
+		resizeterm_sp;
+		restartterm_sp;
+		ripoffline_sp;
+		scr_init_sp;
+		scr_restore_sp;
+		scr_set_sp;
+		set_escdelay_sp;
+		slk_attr_set_sp;
+		slk_attr_sp;
+		slk_attroff_sp;
+		slk_attron_sp;
+		slk_attrset_sp;
+		slk_clear_sp;
+		slk_color_sp;
+		slk_init_sp;
+		slk_label_sp;
+		slk_noutrefresh_sp;
+		slk_refresh_sp;
+		slk_restore_sp;
+		slk_set_sp;
+		slk_touch_sp;
+		start_color_sp;
+		term_attrs_sp;
+		termattrs_sp;
+		unget_wch_sp;
+		ungetch_sp;
+		ungetmouse_sp;
+		update_panels_sp;
+		use_default_colors_sp;
+		use_legacy_coding_sp;
+		vid_attr_sp;
+		vid_puts_sp;
+		vidattr_sp;
+		vidputs_sp;
+		wunctrl_sp;
+	local:
+		_nc_TYPE_ALNUM;
+		_nc_TYPE_ALPHA;
+		_nc_TYPE_ENUM;
+		_nc_TYPE_INTEGER;
+		_nc_TYPE_IPV4;
+		_nc_TYPE_NUMERIC;
+		_nc_TYPE_REGEXP;
+		_nc_curscr_of;
+		_nc_do_color_sp;
+		_nc_form_cursor;
+		_nc_format_slks;
+		_nc_free_and_exit_sp;
+		_nc_freeall_sp;
+		_nc_fty_generic;
+		_nc_generic_fieldtype;
+		_nc_get_fieldbuffer;
+		_nc_hash_map_sp;
+		_nc_insert_wch;
+		_nc_linedump_sp;
+		_nc_make_oldhash_sp;
+		_nc_makenew_sp;
+		_nc_msec_cost_sp;
+		_nc_mvcur_init_sp;
+		_nc_mvcur_resume_sp;
+		_nc_mvcur_wrap_sp;
+		_nc_newscr_of;
+		_nc_printf_string_sp;
+		_nc_ptr_Escdelay;
+		_nc_reset_colors_sp;
+		_nc_retrace_mmask_t;
+		_nc_ripoffline_sp;
+		_nc_screen_init_sp;
+		_nc_screen_resume_sp;
+		_nc_screen_wrap_sp;
+		_nc_scroll_oldhash_sp;
+		_nc_scroll_optimize_sp;
+		_nc_scrolln_sp;
+		_nc_set_generic_fieldtype;
+		_nc_setupscreen_sp;
+		_nc_stdscr_of;
+} NCURSESTW_5.7.20081102;
+
+NCURSESTW_5.9.20150530 {
+	global:
+		form_driver_w;
+		wgetdelay;
+	local:
+		_nc_mvcur;
+		_nc_mvcur_sp;
+		_nc_trace_mmask_t;
+} NCURSESTW_5.8.20110226;
+
+NCURSESTW_6.1.20171230 {
+	global:
+		alloc_pair;
+		alloc_pair_sp;
+		extended_color_content;
+		extended_color_content_sp;
+		extended_pair_content;
+		extended_pair_content_sp;
+		extended_slk_color;
+		extended_slk_color_sp;
+		find_pair;
+		find_pair_sp;
+		free_pair;
+		free_pair_sp;
+		init_extended_color;
+		init_extended_color_sp;
+		init_extended_pair;
+		init_extended_pair_sp;
+		reset_color_pairs;
+		reset_color_pairs_sp;
+		unfocus_current_field;
+	local:
+		_nc_Unset_Current_Field;
+		_nc_change_pair;
+		_nc_init_color;
+		_nc_init_pair;
+		_nc_pair_content;
+		_nc_reset_color_pair;
+		_nc_set_color_pair;
+} NCURSESTW_5.9.20150530;
+
+NCURSESTW_6.2.20200212 {
+	global:
+		exit_curses;
+	local:
+		_*;
+} NCURSESTW_6.1.20171230;
diff --git a/package/ncursestw.sym b/package/ncursestw.sym
new file mode 100644
index 0000000..1668f40
--- /dev/null
+++ b/package/ncursestw.sym
@@ -0,0 +1,1001 @@
+# $Id: ncursestw.sym,v 1.41 2021/08/19 23:50:26 tom Exp $
+# script for shared library symbol-visibility using libtool
+#
+# This file was generated by ncu-mapsyms
+# Configure options (5.7.20081102)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-widec --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-widec --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --enable-widec --with-hashed-db --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.8.20110226)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-widec --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --enable-widec --with-broken_linker --with-hashed-db --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-wgetch-events --enable-widec --with-hashed-db --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-widec --with-broken_linker --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.9.20110404)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-widec --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --enable-widec --with-broken_linker --with-hashed-db --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-wgetch-events --enable-widec --with-hashed-db --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-widec --with-broken_linker --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.9.20150530)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-widec --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --enable-widec --with-broken_linker --with-hashed-db --with-pthread --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-wgetch-events --enable-widec --with-hashed-db --with-pthread --with-termlib --with-ticlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-widec --with-broken_linker --with-pthread --with-termlib --with-ticlib --with-trace
+# Configure options (6.0.20161029)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-widec --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --enable-widec --with-broken_linker --with-hashed-db --with-pthread --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-wgetch-events --enable-widec --with-hashed-db --with-pthread --with-termlib --with-ticlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-widec --with-broken_linker --with-pthread --with-termlib --with-ticlib --with-trace
+BC
+COLOR_PAIR
+PAIR_NUMBER
+PC
+SP
+TYPE_ALNUM
+TYPE_ALPHA
+TYPE_ENUM
+TYPE_INTEGER
+TYPE_IPV4
+TYPE_NUMERIC
+TYPE_REGEXP
+UP
+_nc_COLORS
+_nc_COLOR_PAIRS
+_nc_COLS
+_nc_Default_Field
+_nc_Default_Form
+_nc_ESCDELAY
+_nc_LINES
+_nc_TABSIZE
+_nc__nc_outchars
+_nc_access
+_nc_acs_map
+_nc_add_to_try
+_nc_align_termtype
+_nc_alloc_entry_leaks
+_nc_basename
+_nc_boolcodes
+_nc_boolfnames
+_nc_boolnames
+_nc_capcmp
+_nc_captoinfo_leaks
+_nc_check_termtype
+_nc_check_termtype2
+_nc_codes_leaks
+_nc_comp_scan_leaks
+_nc_copy_termtype
+_nc_copy_termtype2
+_nc_count_outchars
+_nc_cur_term
+_nc_curr_col
+_nc_curr_line
+_nc_curscr
+_nc_db_close
+_nc_db_first
+_nc_db_have_data
+_nc_db_next
+_nc_db_open
+_nc_db_put
+_nc_disable_period
+_nc_doalloc
+_nc_entry_match
+_nc_env_access
+_nc_err_abort
+_nc_eventlist_timeout
+_nc_export_termtype2
+_nc_fallback
+_nc_fallback2
+_nc_find_entry
+_nc_find_prescr
+_nc_find_type_entry
+_nc_find_user_entry
+_nc_first_db
+_nc_first_name
+_nc_flush
+_nc_flush_sp
+_nc_fmt_funcptr
+_nc_forget_prescr
+_nc_free_and_exit
+_nc_free_entries
+_nc_free_termtype
+_nc_free_termtype2
+_nc_free_tic
+_nc_free_tinfo
+_nc_free_tparm
+_nc_freeall
+_nc_get_alias_table
+_nc_get_hash_table
+_nc_get_locale
+_nc_get_screensize
+_nc_get_source
+_nc_get_table
+_nc_get_tty_mode
+_nc_get_tty_mode_sp
+_nc_get_type
+_nc_getenv_num
+_nc_globals
+_nc_handle_sigwinch
+_nc_has_mouse
+_nc_head
+_nc_home_terminfo
+_nc_infotocap
+_nc_init_acs
+_nc_init_acs_sp
+_nc_init_pthreads
+_nc_init_termtype
+_nc_is_abs_path
+_nc_is_dir_path
+_nc_is_file_path
+_nc_keep_tic_dir
+_nc_keyname_leaks
+_nc_keypad
+_nc_last_db
+_nc_leaks_tinfo
+_nc_locale_breaks_acs
+_nc_locked_tracef
+_nc_mutex_lock
+_nc_mutex_trylock
+_nc_mutex_unlock
+_nc_name_match
+_nc_names_leaks
+_nc_newscr
+_nc_next_db
+_nc_numcodes
+_nc_numfnames
+_nc_numnames
+_nc_optimize_enable
+_nc_outc_wrapper
+_nc_outch
+_nc_outch_sp
+_nc_panelhook
+_nc_panelhook_sp
+_nc_pathlast
+_nc_prescreen
+_nc_ptr_Cols
+_nc_ptr_Lines
+_nc_putchar
+_nc_putchar_sp
+_nc_putp
+_nc_putp_flush
+_nc_putp_flush_sp
+_nc_putp_sp
+_nc_read_entry
+_nc_read_entry2
+_nc_read_entry_source
+_nc_read_file_entry
+_nc_read_termtype
+_nc_reset_input
+_nc_reset_tparm
+_nc_resolve_uses
+_nc_resolve_uses2
+_nc_retrace_attr_t
+_nc_retrace_bool
+_nc_retrace_chtype
+_nc_retrace_cptr
+_nc_retrace_cvoid_ptr
+_nc_retrace_int
+_nc_retrace_int_attr_t
+_nc_retrace_ptr
+_nc_retrace_sp
+_nc_retrace_unsigned
+_nc_retrace_void_ptr
+_nc_retrace_win
+_nc_ripoffline
+_nc_rootname
+_nc_safe_fopen
+_nc_safe_open3
+_nc_safe_strcat
+_nc_safe_strcpy
+_nc_screen
+_nc_screen_chain
+_nc_screen_of
+_nc_set_buffer
+_nc_set_buffer_sp
+_nc_set_no_padding
+_nc_set_source
+_nc_set_tputs_trace
+_nc_set_tty_mode
+_nc_set_tty_mode_sp
+_nc_set_type
+_nc_set_writedir
+_nc_setupterm
+_nc_sigprocmask
+_nc_stdscr
+_nc_str_copy
+_nc_str_init
+_nc_str_null
+_nc_strcodes
+_nc_strfnames
+_nc_strict_bsd
+_nc_strnames
+_nc_suppress_warnings
+_nc_syntax
+_nc_syserr_abort
+_nc_tail
+_nc_tgetent_leaks
+_nc_tic_dir
+_nc_tic_expand
+_nc_tic_written
+_nc_timed_wait
+_nc_tinfo_fkeys
+_nc_tinfo_fkeysf
+_nc_tiparm
+_nc_tparm_analyze
+_nc_tparm_err
+_nc_trace_buf
+_nc_trace_bufcat
+_nc_tracechar
+_nc_tracing
+_nc_trans_string
+_nc_trim_sgr0
+_nc_ttytype
+_nc_unicode_locale
+_nc_update_screensize
+_nc_use_tracef
+_nc_user_definable
+_nc_visbuf
+_nc_visbuf2
+_nc_visbufn
+_nc_viscbuf
+_nc_viswbuf
+_nc_viswbufn
+_nc_viswibuf
+_nc_wacs
+_nc_wacs_width
+_nc_warning
+_nc_wcrtomb
+_nc_write_entry
+_nc_write_object
+_traceattr
+_traceattr2
+_tracecchar_t
+_tracecchar_t2
+_tracechar
+_tracechtype
+_tracechtype2
+_tracef
+add_wch
+add_wchnstr
+add_wchstr
+addch
+addchnstr
+addchstr
+addnstr
+addnwstr
+addstr
+addwstr
+alloc_pair
+alloc_pair_sp
+assume_default_colors
+assume_default_colors_sp
+attr_get
+attr_off
+attr_on
+attr_set
+attroff
+attron
+attrset
+baudrate
+baudrate_sp
+beep
+beep_sp
+bkgd
+bkgdset
+bkgrnd
+bkgrndset
+border
+border_set
+bottom_panel
+box
+box_set
+can_change_color
+can_change_color_sp
+cbreak
+cbreak_sp
+ceiling_panel
+chgat
+clear
+clearok
+clrtobot
+clrtoeol
+color_content
+color_content_sp
+color_set
+copywin
+current_field
+current_item
+curs_set
+curs_set_sp
+curses_trace
+curses_version
+data_ahead
+data_behind
+def_prog_mode
+def_prog_mode_sp
+def_shell_mode
+def_shell_mode_sp
+define_key
+define_key_sp
+del_curterm
+del_curterm_sp
+del_panel
+delay_output
+delay_output_sp
+delch
+deleteln
+delscreen
+delwin
+derwin
+doupdate
+doupdate_sp
+dup_field
+dupwin
+dynamic_field_info
+echo
+echo_sp
+echo_wchar
+echochar
+endwin
+endwin_sp
+erase
+erasechar
+erasechar_sp
+erasewchar
+erasewchar_sp
+exit_curses
+exit_terminfo
+extended_color_content
+extended_color_content_sp
+extended_pair_content
+extended_pair_content_sp
+extended_slk_color
+extended_slk_color_sp
+field_arg
+field_back
+field_buffer
+field_count
+field_fore
+field_index
+field_info
+field_init
+field_just
+field_opts
+field_opts_off
+field_opts_on
+field_pad
+field_status
+field_term
+field_type
+field_userptr
+filter
+filter_sp
+find_pair
+find_pair_sp
+flash
+flash_sp
+flushinp
+flushinp_sp
+form_driver
+form_driver_w
+form_fields
+form_init
+form_opts
+form_opts_off
+form_opts_on
+form_page
+form_request_by_name
+form_request_name
+form_sub
+form_term
+form_userptr
+form_win
+free_field
+free_fieldtype
+free_form
+free_item
+free_menu
+free_pair
+free_pair_sp
+get_escdelay
+get_escdelay_sp
+get_wch
+get_wstr
+getattrs
+getbegx
+getbegy
+getbkgd
+getbkgrnd
+getcchar
+getch
+getcurx
+getcury
+getmaxx
+getmaxy
+getmouse
+getmouse_sp
+getn_wstr
+getnstr
+getparx
+getpary
+getstr
+getwin
+getwin_sp
+ground_panel
+halfdelay
+halfdelay_sp
+has_colors
+has_colors_sp
+has_ic
+has_ic_sp
+has_il
+has_il_sp
+has_key
+has_key_sp
+has_mouse
+has_mouse_sp
+hide_panel
+hline
+hline_set
+idcok
+idlok
+immedok
+in_wch
+in_wchnstr
+in_wchstr
+inch
+inchnstr
+inchstr
+init_color
+init_color_sp
+init_extended_color
+init_extended_color_sp
+init_extended_pair
+init_extended_pair_sp
+init_pair
+init_pair_sp
+initscr
+innstr
+innwstr
+ins_nwstr
+ins_wch
+ins_wstr
+insch
+insdelln
+insertln
+insnstr
+insstr
+instr
+intrflush
+intrflush_sp
+inwstr
+is_cleared
+is_idcok
+is_idlok
+is_immedok
+is_keypad
+is_leaveok
+is_linetouched
+is_nodelay
+is_notimeout
+is_pad
+is_scrollok
+is_subwin
+is_syncok
+is_term_resized
+is_term_resized_sp
+is_wintouched
+isendwin
+isendwin_sp
+item_count
+item_description
+item_index
+item_init
+item_name
+item_opts
+item_opts_off
+item_opts_on
+item_term
+item_userptr
+item_value
+item_visible
+key_defined
+key_defined_sp
+key_name
+keybound
+keybound_sp
+keyname
+keyname_sp
+keyok
+keyok_sp
+keypad
+killchar
+killchar_sp
+killwchar
+killwchar_sp
+leaveok
+link_field
+link_fieldtype
+longname
+longname_sp
+mcprint
+mcprint_sp
+menu_back
+menu_driver
+menu_fore
+menu_format
+menu_grey
+menu_init
+menu_items
+menu_mark
+menu_opts
+menu_opts_off
+menu_opts_on
+menu_pad
+menu_pattern
+menu_request_by_name
+menu_request_name
+menu_spacing
+menu_sub
+menu_term
+menu_userptr
+menu_win
+meta
+mouse_trafo
+mouseinterval
+mouseinterval_sp
+mousemask
+mousemask_sp
+move
+move_field
+move_panel
+mvadd_wch
+mvadd_wchnstr
+mvadd_wchstr
+mvaddch
+mvaddchnstr
+mvaddchstr
+mvaddnstr
+mvaddnwstr
+mvaddstr
+mvaddwstr
+mvchgat
+mvcur
+mvcur_sp
+mvdelch
+mvderwin
+mvget_wch
+mvget_wstr
+mvgetch
+mvgetn_wstr
+mvgetnstr
+mvgetstr
+mvhline
+mvhline_set
+mvin_wch
+mvin_wchnstr
+mvin_wchstr
+mvinch
+mvinchnstr
+mvinchstr
+mvinnstr
+mvinnwstr
+mvins_nwstr
+mvins_wch
+mvins_wstr
+mvinsch
+mvinsnstr
+mvinsstr
+mvinstr
+mvinwstr
+mvprintw
+mvscanw
+mvvline
+mvvline_set
+mvwadd_wch
+mvwadd_wchnstr
+mvwadd_wchstr
+mvwaddch
+mvwaddchnstr
+mvwaddchstr
+mvwaddnstr
+mvwaddnwstr
+mvwaddstr
+mvwaddwstr
+mvwchgat
+mvwdelch
+mvwget_wch
+mvwget_wstr
+mvwgetch
+mvwgetn_wstr
+mvwgetnstr
+mvwgetstr
+mvwhline
+mvwhline_set
+mvwin
+mvwin_wch
+mvwin_wchnstr
+mvwin_wchstr
+mvwinch
+mvwinchnstr
+mvwinchstr
+mvwinnstr
+mvwinnwstr
+mvwins_nwstr
+mvwins_wch
+mvwins_wstr
+mvwinsch
+mvwinsnstr
+mvwinsstr
+mvwinstr
+mvwinwstr
+mvwprintw
+mvwscanw
+mvwvline
+mvwvline_set
+napms
+napms_sp
+new_field
+new_fieldtype
+new_form
+new_form_sp
+new_item
+new_menu
+new_menu_sp
+new_page
+new_panel
+new_prescr
+newpad
+newpad_sp
+newterm
+newterm_sp
+newwin
+newwin_sp
+nl
+nl_sp
+nocbreak
+nocbreak_sp
+nodelay
+noecho
+noecho_sp
+nofilter
+nofilter_sp
+nonl
+nonl_sp
+noqiflush
+noqiflush_sp
+noraw
+noraw_sp
+notimeout
+ospeed
+overlay
+overwrite
+pair_content
+pair_content_sp
+panel_above
+panel_below
+panel_hidden
+panel_userptr
+panel_window
+pecho_wchar
+pechochar
+pnoutrefresh
+pos_form_cursor
+pos_menu_cursor
+post_form
+post_menu
+prefresh
+printw
+putp
+putp_sp
+putwin
+qiflush
+qiflush_sp
+raw
+raw_sp
+redrawwin
+refresh
+replace_panel
+reset_color_pairs
+reset_color_pairs_sp
+reset_prog_mode
+reset_prog_mode_sp
+reset_shell_mode
+reset_shell_mode_sp
+resetty
+resetty_sp
+resize_term
+resize_term_sp
+resizeterm
+resizeterm_sp
+restartterm
+restartterm_sp
+ripoffline
+ripoffline_sp
+savetty
+savetty_sp
+scale_form
+scale_menu
+scanw
+scr_dump
+scr_init
+scr_init_sp
+scr_restore
+scr_restore_sp
+scr_set
+scr_set_sp
+scrl
+scroll
+scrollok
+set_current_field
+set_current_item
+set_curterm
+set_curterm_sp
+set_escdelay
+set_escdelay_sp
+set_field_back
+set_field_buffer
+set_field_fore
+set_field_init
+set_field_just
+set_field_opts
+set_field_pad
+set_field_status
+set_field_term
+set_field_type
+set_field_userptr
+set_fieldtype_arg
+set_fieldtype_choice
+set_form_fields
+set_form_init
+set_form_opts
+set_form_page
+set_form_sub
+set_form_term
+set_form_userptr
+set_form_win
+set_item_init
+set_item_opts
+set_item_term
+set_item_userptr
+set_item_value
+set_max_field
+set_menu_back
+set_menu_fore
+set_menu_format
+set_menu_grey
+set_menu_init
+set_menu_items
+set_menu_mark
+set_menu_opts
+set_menu_pad
+set_menu_pattern
+set_menu_spacing
+set_menu_sub
+set_menu_term
+set_menu_userptr
+set_menu_win
+set_new_page
+set_panel_userptr
+set_tabsize
+set_tabsize_sp
+set_term
+set_top_row
+setcchar
+setscrreg
+setupterm
+show_panel
+slk_attr
+slk_attr_off
+slk_attr_on
+slk_attr_set
+slk_attr_set_sp
+slk_attr_sp
+slk_attroff
+slk_attroff_sp
+slk_attron
+slk_attron_sp
+slk_attrset
+slk_attrset_sp
+slk_clear
+slk_clear_sp
+slk_color
+slk_color_sp
+slk_init
+slk_init_sp
+slk_label
+slk_label_sp
+slk_noutrefresh
+slk_noutrefresh_sp
+slk_refresh
+slk_refresh_sp
+slk_restore
+slk_restore_sp
+slk_set
+slk_set_sp
+slk_touch
+slk_touch_sp
+slk_wset
+standend
+standout
+start_color
+start_color_sp
+subpad
+subwin
+syncok
+term_attrs
+term_attrs_sp
+termattrs
+termattrs_sp
+termname
+termname_sp
+tgetent
+tgetent_sp
+tgetflag
+tgetflag_sp
+tgetnum
+tgetnum_sp
+tgetstr
+tgetstr_sp
+tgoto
+tigetflag
+tigetflag_sp
+tigetnum
+tigetnum_sp
+tigetstr
+tigetstr_sp
+timeout
+tiparm
+top_panel
+top_row
+touchline
+touchwin
+tparm
+tputs
+tputs_sp
+trace
+typeahead
+typeahead_sp
+unctrl
+unctrl_sp
+unfocus_current_field
+unget_wch
+unget_wch_sp
+ungetch
+ungetch_sp
+ungetmouse
+ungetmouse_sp
+unpost_form
+unpost_menu
+untouchwin
+update_panels
+update_panels_sp
+use_default_colors
+use_default_colors_sp
+use_env
+use_env_sp
+use_extended_names
+use_legacy_coding
+use_legacy_coding_sp
+use_screen
+use_tioctl
+use_tioctl_sp
+use_window
+vid_attr
+vid_attr_sp
+vid_puts
+vid_puts_sp
+vidattr
+vidattr_sp
+vidputs
+vidputs_sp
+vline
+vline_set
+vw_printw
+vw_scanw
+vwprintw
+vwscanw
+wadd_wch
+wadd_wchnstr
+wadd_wchstr
+waddch
+waddchnstr
+waddchstr
+waddnstr
+waddnwstr
+waddstr
+waddwstr
+wattr_get
+wattr_off
+wattr_on
+wattr_set
+wattroff
+wattron
+wattrset
+wbkgd
+wbkgdset
+wbkgrnd
+wbkgrndset
+wborder
+wborder_set
+wchgat
+wclear
+wclrtobot
+wclrtoeol
+wcolor_set
+wcursyncup
+wdelch
+wdeleteln
+wecho_wchar
+wechochar
+wenclose
+werase
+wget_wch
+wget_wstr
+wgetbkgrnd
+wgetch
+wgetch_events
+wgetdelay
+wgetn_wstr
+wgetnstr
+wgetnstr_events
+wgetparent
+wgetscrreg
+wgetstr
+whline
+whline_set
+win_wch
+win_wchnstr
+win_wchstr
+winch
+winchnstr
+winchstr
+winnstr
+winnwstr
+wins_nwstr
+wins_wch
+wins_wstr
+winsch
+winsdelln
+winsertln
+winsnstr
+winsstr
+winstr
+winwstr
+wmouse_trafo
+wmove
+wnoutrefresh
+wprintw
+wredrawln
+wrefresh
+wresize
+wscanw
+wscrl
+wsetscrreg
+wstandend
+wstandout
+wsyncdown
+wsyncup
+wtimeout
+wtouchln
+wunctrl
+wunctrl_sp
+wvline
+wvline_set
diff --git a/package/ncursesw.map b/package/ncursesw.map
new file mode 100644
index 0000000..13e8faf
--- /dev/null
+++ b/package/ncursesw.map
@@ -0,0 +1,1328 @@
+# $Id: ncursesw.map,v 1.59 2021/10/10 15:22:33 tom Exp $
+# script for shared library symbol-versioning using ld
+#
+# This file was generated by ncu-mapsyms
+# Configure options (5.1.20000708)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.2.20001021)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.3.20021019)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.4.20040208)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.5.20051010)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.6.20061217)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --enable-widec --with-hashed-db --with-termlib --with-ticlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.7.20081102)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --enable-widec --with-hashed-db --with-termlib --with-ticlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.8.20110226)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-widec --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-widec --with-broken_linker --with-hashed-db --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-widec --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --enable-widec --with-hashed-db --with-termlib --with-ticlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.9.20110404)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-widec --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-widec --with-broken_linker --with-hashed-db --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-widec --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --enable-widec --with-hashed-db --with-termlib --with-ticlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.9.20150530)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-widec --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-widec --with-broken_linker --with-hashed-db --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-widec --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --enable-widec --with-hashed-db --with-termlib --with-ticlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace
+# Configure options (6.0.current)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-widec --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-widec --with-broken_linker --with-hashed-db --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-widec --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --enable-widec --with-hashed-db --with-termlib --with-ticlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace
+
+NCURSES_TIC_5.0.19991023 {
+	global:
+		_nc_capcmp;
+		_nc_check_termtype;
+		_nc_entry_match;
+		_nc_infotocap;
+		_nc_read_entry_source;
+		_nc_reset_input;
+		_nc_resolve_uses;
+		_nc_set_writedir;
+		_nc_syntax;
+		_nc_tic_expand;
+		_nc_tic_written;
+		_nc_trans_string;
+		_nc_write_entry;
+	local:
+		_nc_captoinfo;
+		_nc_comment_end;
+		_nc_comment_start;
+		_nc_copy_entry;
+		_nc_curr_file_pos;
+		_nc_curr_token;
+		_nc_get_token;
+		_nc_init_entry;
+		_nc_merge_entry;
+		_nc_panic_mode;
+		_nc_parse_entry;
+		_nc_push_token;
+		_nc_save_str;
+		_nc_start_line;
+		_nc_wrap_entry;
+};
+
+NCURSES_TIC_5.1.20000708 {
+	global:
+		_nc_disable_period;
+} NCURSES_TIC_5.0.19991023;
+
+NCURSES_TIC_5.5.20051010 {
+	global:
+		_nc_alloc_entry_leaks;
+		_nc_captoinfo_leaks;
+		_nc_check_termtype2;
+		_nc_comp_scan_leaks;
+		_nc_resolve_uses2;
+} NCURSES_TIC_5.1.20000708;
+
+NCURSES_TIC_5.7.20081102 {
+	global:
+		_nc_free_tic;
+	local:
+		_nc_comp_captab_leaks;
+		_nc_leaks_tic;
+} NCURSES_TIC_5.5.20051010;
+
+NCURSES_TIC_5.9.20150530 {
+	global:
+		_nc_strict_bsd;
+} NCURSES_TIC_5.7.20081102;
+
+NCURSES_TIC_6.1.20171230 {
+	global:
+		_nc_read_entry2;
+		_nc_write_object;
+	local:
+		_*;
+} NCURSES_TIC_5.9.20150530;
+
+NCURSES_TINFO_5.0.19991023 {
+	global:
+		BC;
+		COLS;
+		LINES;
+		PC;
+		SP;
+		TABSIZE;
+		UP;
+		_nc_access;
+		_nc_add_to_try;
+		_nc_copy_termtype;
+		_nc_curr_col;
+		_nc_curr_line;
+		_nc_doalloc;
+		_nc_err_abort;
+		_nc_fallback;
+		_nc_find_entry;
+		_nc_find_type_entry;
+		_nc_first_name;
+		_nc_free_entries;
+		_nc_free_termtype;
+		_nc_free_tparm;
+		_nc_freeall;
+		_nc_get_hash_table;
+		_nc_get_table;
+		_nc_get_tty_mode;
+		_nc_get_type;
+		_nc_getenv_num;
+		_nc_head;
+		_nc_home_terminfo;
+		_nc_info_hash_table;
+		_nc_init_acs;
+		_nc_keep_tic_dir;
+		_nc_keypad;
+		_nc_name_match;
+		_nc_outch;
+		_nc_read_entry;
+		_nc_read_file_entry;
+		_nc_screen_chain;
+		_nc_set_buffer;
+		_nc_set_source;
+		_nc_set_tty_mode;
+		_nc_set_type;
+		_nc_suppress_warnings;
+		_nc_syserr_abort;
+		_nc_tail;
+		_nc_tic_dir;
+		_nc_timed_wait;
+		_nc_trace_buf;
+		_nc_tracing;
+		_nc_update_screensize;
+		_nc_visbuf;
+		_nc_visbuf2;
+		_nc_warning;
+		_tracechar;
+		acs_map;
+		baudrate;
+		boolcodes;
+		boolfnames;
+		boolnames;
+		cbreak;
+		cur_term;
+		curs_set;
+		curscr;
+		curses_version;
+		def_prog_mode;
+		def_shell_mode;
+		define_key;
+		del_curterm;
+		delay_output;
+		erasechar;
+		flushinp;
+		halfdelay;
+		has_ic;
+		has_il;
+		has_key;
+		idcok;
+		idlok;
+		intrflush;
+		keybound;
+		keyname;
+		keyok;
+		keypad;
+		killchar;
+		longname;
+		meta;
+		napms;
+		newscr;
+		nocbreak;
+		nodelay;
+		noqiflush;
+		noraw;
+		notimeout;
+		numcodes;
+		numfnames;
+		numnames;
+		ospeed;
+		putp;
+		qiflush;
+		raw;
+		reset_prog_mode;
+		reset_shell_mode;
+		resetty;
+		savetty;
+		set_curterm;
+		setupterm;
+		stdscr;
+		strcodes;
+		strfnames;
+		strnames;
+		termname;
+		tgetent;
+		tgetflag;
+		tgetnum;
+		tgetstr;
+		tgoto;
+		tigetflag;
+		tigetnum;
+		tigetstr;
+		tparm;
+		tputs;
+		trace;
+		ttytype;
+		typeahead;
+		unctrl;
+		use_env;
+		wtimeout;
+	local:
+		_nc_baudrate;
+		_nc_cap_hash_table;
+		_nc_capalias_table;
+		_nc_expand_try;
+		_nc_infoalias_table;
+		_nc_init_keytry;
+		_nc_key_names;
+		_nc_nulls_sent;
+		_nc_ospeed;
+		_nc_read_termcap;
+		_nc_read_termcap_entry;
+		_nc_remove_key;
+		_nc_remove_string;
+		_nc_trace_tries;
+		_nc_tracebits;
+};
+
+NCURSES_TINFO_5.1.20000708 {
+	global:
+		_nc_align_termtype;
+		_nc_flush;
+		_nc_tinfo_fkeys;
+		_nc_user_definable;
+		_nc_utf8_outch;
+		use_extended_names;
+} NCURSES_TINFO_5.0.19991023;
+
+NCURSES_TINFO_5.2.20001021 {
+	global:
+		_nc_basename;
+		_nc_env_access;
+		_nc_safe_strcat;
+		_nc_safe_strcpy;
+		_nc_str_copy;
+		_nc_str_init;
+		_nc_str_null;
+} NCURSES_TINFO_5.1.20000708;
+
+NCURSES_TINFO_5.3.20021019 {
+	global:
+		_nc_rootname;
+		_nc_tparm_err;
+		_nc_visbufn;
+} NCURSES_TINFO_5.2.20001021;
+
+NCURSES_TINFO_5.4.20040208 {
+	global:
+		_nc_altcharset_name;
+		_nc_get_locale;
+		_nc_locale_breaks_acs;
+		_nc_outchars;
+		_nc_pathlast;
+		_nc_retrace_attr_t;
+		_nc_retrace_bool;
+		_nc_retrace_chtype;
+		_nc_retrace_int;
+		_nc_retrace_ptr;
+		_nc_retrace_sp;
+		_nc_retrace_unsigned;
+		_nc_retrace_win;
+		_nc_tparm_analyze;
+		_nc_tputs_trace;
+		_nc_trace_bufcat;
+		_nc_unicode_locale;
+		_nc_viswbuf;
+		_nc_viswbufn;
+		_traceattr;
+		_traceattr2;
+		_tracecchar_t;
+		_tracecchar_t2;
+		_tracechtype;
+		_tracechtype2;
+		_tracef;
+		key_defined;
+	local:
+		_nc_trace_ttymode;
+		_nc_viswbuf2;
+} NCURSES_TINFO_5.3.20021019;
+
+NCURSES_TINFO_5.5.20051010 {
+	global:
+		_nc_get_source;
+		_nc_retrace_cptr;
+		_nc_retrace_cvoid_ptr;
+		_nc_retrace_void_ptr;
+		_nc_setupterm;
+		_nc_trim_sgr0;
+		_nc_viswibuf;
+	local:
+		_nc_delink_entry;
+		_nc_free_entry;
+} NCURSES_TINFO_5.4.20040208;
+
+NCURSES_TINFO_5.6.20061217 {
+	global:
+		_nc_db_close;
+		_nc_db_first;
+		_nc_db_have_data;
+		_nc_db_next;
+		_nc_db_open;
+		_nc_db_put;
+		_nc_eventlist_timeout;
+		_nc_first_db;
+		_nc_handle_sigwinch;
+		_nc_is_abs_path;
+		_nc_is_dir_path;
+		_nc_is_file_path;
+		_nc_keyname_leaks;
+		_nc_last_db;
+		_nc_next_db;
+		_nc_read_termtype;
+		_nc_tgetent_leaks;
+		_nc_viscbuf;
+	local:
+		_nc_db_get;
+		_nc_db_have_index;
+		_nc_hashed_db;
+		_nc_viscbuf2;
+} NCURSES_TINFO_5.5.20051010;
+
+NCURSES_TINFO_5.7.20081102 {
+	global:
+		_nc_free_tinfo;
+		_nc_get_alias_table;
+		_nc_get_screensize;
+		_nc_globals;
+		_nc_leaks_tinfo;
+		_nc_prescreen;
+		_nc_screen_of;
+		_nc_set_no_padding;
+		_nc_tracechar;
+		set_tabsize;
+	local:
+		_nc_keyname;
+		_nc_unctrl;
+} NCURSES_TINFO_5.6.20061217;
+
+NCURSES_TINFO_5.8.20110226 {
+	global:
+		_nc_flush_sp;
+		_nc_get_tty_mode_sp;
+		_nc_init_acs_sp;
+		_nc_outc_wrapper;
+		_nc_outch_sp;
+		_nc_putp;
+		_nc_putp_flush;
+		_nc_putp_flush_sp;
+		_nc_putp_sp;
+		_nc_retrace_int_attr_t;
+		_nc_set_buffer_sp;
+		_nc_set_tty_mode_sp;
+		baudrate_sp;
+		cbreak_sp;
+		curs_set_sp;
+		def_prog_mode_sp;
+		def_shell_mode_sp;
+		define_key_sp;
+		del_curterm_sp;
+		delay_output_sp;
+		erasechar_sp;
+		flushinp_sp;
+		halfdelay_sp;
+		has_ic_sp;
+		has_il_sp;
+		has_key_sp;
+		intrflush_sp;
+		key_defined_sp;
+		keybound_sp;
+		keyname_sp;
+		keyok_sp;
+		killchar_sp;
+		longname_sp;
+		napms_sp;
+		new_prescr;
+		nocbreak_sp;
+		noqiflush_sp;
+		noraw_sp;
+		putp_sp;
+		qiflush_sp;
+		raw_sp;
+		reset_prog_mode_sp;
+		reset_shell_mode_sp;
+		resetty_sp;
+		savetty_sp;
+		set_curterm_sp;
+		set_tabsize_sp;
+		termname_sp;
+		tgetent_sp;
+		tgetflag_sp;
+		tgetnum_sp;
+		tgetstr_sp;
+		tigetflag_sp;
+		tigetnum_sp;
+		tigetstr_sp;
+		tiparm;
+		tputs_sp;
+		typeahead_sp;
+		unctrl_sp;
+		use_env_sp;
+	local:
+		_nc_get_hash_info;
+		_nc_retrace_char;
+		_nc_setup_tinfo;
+		_nc_tinfo_cmdch;
+} NCURSES_TINFO_5.7.20081102;
+
+NCURSES_TINFO_5.9.20150530 {
+	global:
+		_nc_init_termtype;
+		_nc_putchar;
+		_nc_putchar_sp;
+		use_tioctl;
+		use_tioctl_sp;
+	local:
+		_nc_comp_error_leaks;
+		_nc_db_iterator_leaks;
+		_nc_setenv_num;
+} NCURSES_TINFO_5.8.20110226;
+
+NCURSES_TINFO_6.1.20171230 {
+	global:
+		_nc_copy_termtype2;
+		_nc_export_termtype2;
+		_nc_fallback2;
+		_nc_free_termtype2;
+} NCURSES_TINFO_5.9.20150530;
+
+NCURSES_TINFO_6.2.20200212 {
+	global:
+		_nc_find_user_entry;
+		_nc_fmt_funcptr;
+		_nc_wacs_width;
+		curses_trace;
+		exit_terminfo;
+} NCURSES_TINFO_6.1.20171230;
+
+NCURSES_TINFO_6.2.20211010 {
+	global:
+		_nc_reset_tparm;
+		_nc_tiparm;
+		_nc_safe_fopen;
+		_nc_safe_open3;
+		erasewchar_sp;
+		killwchar_sp;
+	local:
+		_*;
+} NCURSES_TINFO_6.2.20200212;
+
+NCURSESW_5.1.20000708 {
+	global:
+		COLORS;
+		COLOR_PAIR;
+		COLOR_PAIRS;
+		ESCDELAY;
+		PAIR_NUMBER;
+		TYPE_ALNUM;
+		TYPE_ALPHA;
+		TYPE_ENUM;
+		TYPE_INTEGER;
+		TYPE_IPV4;
+		TYPE_NUMERIC;
+		TYPE_REGEXP;
+		_nc_Default_Field;	# deprecated in ABI6
+		_nc_Default_Form;	# deprecated in ABI6
+		_nc_free_and_exit;
+		_nc_has_mouse;	# deprecated in ABI6
+		_nc_panelhook;
+		_nc_ripoffline;
+		addch;
+		addchnstr;
+		addchstr;
+		addnstr;
+		addstr;
+		assume_default_colors;
+		attr_get;
+		attr_off;
+		attr_on;
+		attr_set;
+		attroff;
+		attron;
+		attrset;
+		beep;
+		bkgd;
+		bkgdset;
+		border;
+		bottom_panel;
+		box;
+		can_change_color;
+		chgat;
+		clear;
+		clearok;
+		clrtobot;
+		clrtoeol;
+		color_content;
+		color_set;
+		copywin;
+		current_field;
+		current_item;
+		data_ahead;
+		data_behind;
+		del_panel;
+		delch;
+		deleteln;
+		delscreen;
+		delwin;
+		derwin;
+		doupdate;
+		dup_field;
+		dupwin;
+		dynamic_field_info;
+		echo;
+		echochar;
+		endwin;
+		erase;
+		field_arg;
+		field_back;
+		field_buffer;
+		field_count;
+		field_fore;
+		field_index;
+		field_info;
+		field_init;
+		field_just;
+		field_opts;
+		field_opts_off;
+		field_opts_on;
+		field_pad;
+		field_status;
+		field_term;
+		field_type;
+		field_userptr;
+		filter;
+		flash;
+		form_driver;
+		form_fields;
+		form_init;
+		form_opts;
+		form_opts_off;
+		form_opts_on;
+		form_page;
+		form_request_by_name;
+		form_request_name;
+		form_sub;
+		form_term;
+		form_userptr;
+		form_win;
+		free_field;
+		free_fieldtype;
+		free_form;
+		free_item;
+		free_menu;
+		getbkgd;
+		getch;
+		getmouse;
+		getnstr;
+		getstr;
+		getwin;
+		has_colors;
+		hide_panel;
+		hline;
+		immedok;
+		inch;
+		inchnstr;
+		inchstr;
+		init_color;
+		init_pair;
+		initscr;
+		innstr;
+		insch;
+		insdelln;
+		insertln;
+		insnstr;
+		insstr;
+		instr;
+		is_linetouched;
+		is_wintouched;
+		isendwin;
+		item_count;
+		item_description;
+		item_index;
+		item_init;
+		item_name;
+		item_opts;
+		item_opts_off;
+		item_opts_on;
+		item_term;
+		item_userptr;
+		item_value;
+		item_visible;
+		leaveok;
+		link_field;
+		link_fieldtype;
+		mcprint;
+		menu_back;
+		menu_driver;
+		menu_fore;
+		menu_format;
+		menu_grey;
+		menu_init;
+		menu_items;
+		menu_mark;
+		menu_opts;
+		menu_opts_off;
+		menu_opts_on;
+		menu_pad;
+		menu_pattern;
+		menu_request_by_name;
+		menu_request_name;
+		menu_spacing;
+		menu_sub;
+		menu_term;
+		menu_userptr;
+		menu_win;
+		mouse_trafo;
+		mouseinterval;
+		mousemask;
+		move;
+		move_field;
+		move_panel;
+		mvaddch;
+		mvaddchnstr;
+		mvaddchstr;
+		mvaddnstr;
+		mvaddstr;
+		mvchgat;
+		mvcur;
+		mvdelch;
+		mvderwin;
+		mvgetch;
+		mvgetnstr;
+		mvgetstr;
+		mvhline;
+		mvinch;
+		mvinchnstr;
+		mvinchstr;
+		mvinnstr;
+		mvinsch;
+		mvinsnstr;
+		mvinsstr;
+		mvinstr;
+		mvprintw;
+		mvscanw;
+		mvvline;
+		mvwaddch;
+		mvwaddchnstr;
+		mvwaddchstr;
+		mvwaddnstr;
+		mvwaddstr;
+		mvwchgat;
+		mvwdelch;
+		mvwgetch;
+		mvwgetnstr;
+		mvwgetstr;
+		mvwhline;
+		mvwin;
+		mvwinch;
+		mvwinchnstr;
+		mvwinchstr;
+		mvwinnstr;
+		mvwinsch;
+		mvwinsnstr;
+		mvwinsstr;
+		mvwinstr;
+		mvwprintw;
+		mvwscanw;
+		mvwvline;
+		new_field;
+		new_fieldtype;
+		new_form;
+		new_item;
+		new_menu;
+		new_page;
+		new_panel;
+		newpad;
+		newterm;
+		newwin;
+		nl;
+		noecho;
+		nonl;
+		overlay;
+		overwrite;
+		pair_content;
+		panel_above;
+		panel_below;
+		panel_hidden;
+		panel_userptr;
+		panel_window;
+		pechochar;
+		pnoutrefresh;
+		pos_form_cursor;
+		pos_menu_cursor;
+		post_form;
+		post_menu;
+		prefresh;
+		printw;
+		putwin;
+		redrawwin;
+		refresh;
+		replace_panel;
+		resizeterm;
+		restartterm;
+		ripoffline;
+		scale_form;
+		scale_menu;
+		scanw;
+		scr_dump;
+		scr_init;
+		scr_restore;
+		scr_set;
+		scrl;
+		scroll;
+		scrollok;
+		set_current_field;
+		set_current_item;
+		set_field_back;
+		set_field_buffer;
+		set_field_fore;
+		set_field_init;
+		set_field_just;
+		set_field_opts;
+		set_field_pad;
+		set_field_status;
+		set_field_term;
+		set_field_type;
+		set_field_userptr;
+		set_fieldtype_arg;
+		set_fieldtype_choice;
+		set_form_fields;
+		set_form_init;
+		set_form_opts;
+		set_form_page;
+		set_form_sub;
+		set_form_term;
+		set_form_userptr;
+		set_form_win;
+		set_item_init;
+		set_item_opts;
+		set_item_term;
+		set_item_userptr;
+		set_item_value;
+		set_max_field;
+		set_menu_back;
+		set_menu_fore;
+		set_menu_format;
+		set_menu_grey;
+		set_menu_init;
+		set_menu_items;
+		set_menu_mark;
+		set_menu_opts;
+		set_menu_pad;
+		set_menu_pattern;
+		set_menu_spacing;
+		set_menu_sub;
+		set_menu_term;
+		set_menu_userptr;
+		set_menu_win;
+		set_new_page;
+		set_panel_userptr;
+		set_term;
+		set_top_row;
+		setscrreg;
+		show_panel;
+		slk_attr;
+		slk_attr_off;
+		slk_attr_on;
+		slk_attr_set;
+		slk_attroff;
+		slk_attron;
+		slk_attrset;
+		slk_clear;
+		slk_color;
+		slk_init;
+		slk_label;
+		slk_noutrefresh;
+		slk_refresh;
+		slk_restore;
+		slk_set;
+		slk_touch;
+		standend;
+		standout;
+		start_color;
+		subpad;
+		subwin;
+		syncok;
+		termattrs;
+		timeout;
+		top_panel;
+		top_row;
+		touchline;
+		touchwin;
+		ungetch;
+		ungetmouse;
+		unpost_form;
+		unpost_menu;
+		untouchwin;
+		update_panels;
+		use_default_colors;
+		vid_attr;
+		vidattr;
+		vidputs;
+		vline;
+		vw_printw;
+		vw_scanw;
+		vwprintw;
+		vwscanw;
+		waddch;
+		waddchnstr;
+		waddchstr;
+		waddnstr;
+		waddstr;
+		wattr_get;
+		wattr_off;
+		wattr_on;
+		wattr_set;
+		wattroff;
+		wattron;
+		wattrset;
+		wbkgd;
+		wbkgdset;
+		wborder;
+		wchgat;
+		wclear;
+		wclrtobot;
+		wclrtoeol;
+		wcolor_set;
+		wcursyncup;
+		wdelch;
+		wdeleteln;
+		wechochar;
+		wenclose;
+		werase;
+		wgetch;
+		wgetnstr;
+		wgetstr;
+		whline;
+		winch;
+		winchnstr;
+		winchstr;
+		winnstr;
+		winsch;
+		winsdelln;
+		winsertln;
+		winsnstr;
+		winsstr;
+		winstr;
+		wmouse_trafo;
+		wmove;
+		wnoutrefresh;
+		wprintw;
+		wredrawln;
+		wrefresh;
+		wresize;
+		wscanw;
+		wscrl;
+		wsetscrreg;
+		wstandend;
+		wstandout;
+		wsyncdown;
+		wsyncup;
+		wtouchln;
+		wvline;
+	local:
+		_nc_Calculate_Item_Length_and_Width;
+		_nc_Connect_Items;
+		_nc_Copy_Argument;
+		_nc_Copy_Type;
+		_nc_Default_FieldType;
+		_nc_Default_Item;
+		_nc_Default_Menu;
+		_nc_Disconnect_Items;
+		_nc_Draw_Menu;
+		_nc_First_Active_Field;
+		_nc_Free_Argument;
+		_nc_Free_Type;
+		_nc_Internal_Validation;
+		_nc_Link_Items;
+		_nc_Make_Argument;
+		_nc_Match_Next_Character_In_Item_Name;
+		_nc_New_TopRow_and_CurrentItem;
+		_nc_Position_Form_Cursor;
+		_nc_Post_Item;
+		_nc_Refresh_Current_Field;
+		_nc_Set_Current_Field;
+		_nc_Set_Form_Page;
+		_nc_Show_Menu;
+		_nc_Synchronize_Attributes;
+		_nc_Synchronize_Options;
+		_nc_background;
+		_nc_do_color;
+		_nc_expanded;
+		_nc_freewin;
+		_nc_hash_map;
+		_nc_make_oldhash;
+		_nc_makenew;
+		_nc_memmove;
+		_nc_menu_cursor_pos;
+		_nc_msec_cost;
+		_nc_mvcur_init;
+		_nc_mvcur_resume;
+		_nc_mvcur_wrap;
+		_nc_oldnums;
+		_nc_outstr;
+		_nc_printf_string;
+		_nc_render;
+		_nc_screen_init;
+		_nc_screen_resume;
+		_nc_screen_wrap;
+		_nc_scroll_oldhash;
+		_nc_scroll_optimize;
+		_nc_scroll_window;
+		_nc_scrolln;
+		_nc_setupscreen;
+		_nc_sigaction;
+		_nc_signal_handler;
+		_nc_slk_format;
+		_nc_slk_initialize;
+		_nc_synchook;
+		_nc_vsscanf;
+		_nc_waddch_nosync;
+};
+
+NCURSESW_5.3.20021019 {
+	global:
+		_nc_wacs;
+		_nc_wchstrlen;
+		add_wch;
+		add_wchnstr;
+		add_wchstr;
+		addnwstr;
+		addwstr;
+		bkgrnd;
+		bkgrndset;
+		border_set;
+		box_set;
+		echo_wchar;
+		erasewchar;
+		get_wch;
+		get_wstr;
+		getbkgrnd;
+		getcchar;
+		getn_wstr;
+		hline_set;
+		in_wch;
+		in_wchnstr;
+		in_wchstr;
+		innwstr;
+		ins_nwstr;
+		ins_wch;
+		ins_wstr;
+		inwstr;
+		is_term_resized;
+		key_name;
+		killwchar;
+		mvadd_wch;
+		mvadd_wchnstr;
+		mvadd_wchstr;
+		mvaddnwstr;
+		mvaddwstr;
+		mvget_wch;
+		mvget_wstr;
+		mvgetn_wstr;
+		mvhline_set;
+		mvin_wch;
+		mvin_wchnstr;
+		mvin_wchstr;
+		mvinnwstr;
+		mvins_nwstr;
+		mvins_wch;
+		mvins_wstr;
+		mvinwstr;
+		mvvline_set;
+		mvwadd_wch;
+		mvwadd_wchnstr;
+		mvwadd_wchstr;
+		mvwaddnwstr;
+		mvwaddwstr;
+		mvwget_wch;
+		mvwget_wstr;
+		mvwgetn_wstr;
+		mvwhline_set;
+		mvwin_wch;
+		mvwin_wchnstr;
+		mvwin_wchstr;
+		mvwinnwstr;
+		mvwins_nwstr;
+		mvwins_wch;
+		mvwins_wstr;
+		mvwinwstr;
+		mvwvline_set;
+		resize_term;
+		setcchar;
+		term_attrs;
+		unget_wch;
+		vid_puts;
+		vline_set;
+		wadd_wch;
+		wadd_wchnstr;
+		wadd_wchstr;
+		waddnwstr;
+		waddwstr;
+		wbkgrnd;
+		wbkgrndset;
+		wborder_set;
+		wecho_wchar;
+		wget_wch;
+		wget_wstr;
+		wgetn_wstr;
+		whline_set;
+		win_wch;
+		win_wchnstr;
+		win_wchstr;
+		winnwstr;
+		wins_nwstr;
+		wins_wch;
+		wins_wstr;
+		winwstr;
+		wunctrl;
+		wvline_set;
+	local:
+		_nc_init_wacs;
+		_nc_reset_colors;
+		_nc_varargs;
+		_nc_wgetch;
+} NCURSESW_5.1.20000708;
+
+NCURSESW_5.4.20040208 {
+	global:
+		_nc_optimize_enable;
+		pecho_wchar;
+		slk_wset;
+	local:
+		_nc_Touchline;
+		_nc_Touchpan;
+		_nc_Wnoutrefresh;
+		_nc_dPanel;
+		_nc_dStack;
+		_nc_fifo_dump;
+		_nc_insert_ch;
+		_nc_is_charable;
+		_nc_linedump;
+		_nc_my_visbuf;
+		_nc_to_char;
+		_nc_to_widechar;
+		_nc_trace_xnames;
+		_tracedump;
+		_tracemouse;
+} NCURSESW_5.3.20021019;
+
+NCURSESW_5.5.20051010 {
+	global:
+		_nc_wcrtomb;
+	local:
+		_nc_Calculate_Text_Width;
+		_nc_Widen_String;
+		_nc_build_wch;
+		_nc_retrace_field;
+		_nc_retrace_field_ptr;
+		_nc_retrace_field_type;
+		_nc_retrace_form;
+		_nc_retrace_form_hook;
+		_nc_retrace_item;
+		_nc_retrace_item_opts;
+		_nc_retrace_item_ptr;
+		_nc_retrace_menu;
+		_nc_retrace_menu_hook;
+		_nc_retrace_menu_opts;
+		_nc_retrace_panel;
+} NCURSESW_5.4.20040208;
+
+NCURSESW_5.6.20061217 {
+	global:
+		getbegx;
+		getbegy;
+		getcurx;
+		getcury;
+		getmaxx;
+		getmaxy;
+		getparx;
+		getpary;
+		nofilter;
+		use_legacy_coding;
+		wgetbkgrnd;
+		wgetch_events;
+		wgetnstr_events;
+} NCURSESW_5.5.20051010;
+
+NCURSESW_5.7.20081102 {
+	global:
+		getattrs;
+		is_cleared;
+		is_idcok;
+		is_idlok;
+		is_immedok;
+		is_keypad;
+		is_leaveok;
+		is_nodelay;
+		is_notimeout;
+		is_scrollok;
+		is_syncok;
+		set_escdelay;
+		use_screen;
+		use_window;
+		wgetparent;
+		wgetscrreg;
+	local:
+		_nc_tracemouse;
+		_nc_ungetch;
+} NCURSESW_5.6.20061217;
+
+NCURSESW_5.8.20110226 {
+	global:
+		_nc_panelhook_sp;
+		assume_default_colors_sp;
+		beep_sp;
+		can_change_color_sp;
+		ceiling_panel;
+		color_content_sp;
+		doupdate_sp;
+		echo_sp;
+		endwin_sp;
+		filter_sp;
+		flash_sp;
+		get_escdelay;
+		get_escdelay_sp;
+		getmouse_sp;
+		getwin_sp;
+		ground_panel;
+		has_colors_sp;
+		has_mouse;
+		has_mouse_sp;
+		init_color_sp;
+		init_pair_sp;
+		is_pad;
+		is_subwin;
+		is_term_resized_sp;
+		isendwin_sp;
+		mcprint_sp;
+		mouseinterval_sp;
+		mousemask_sp;
+		mvcur_sp;
+		new_form_sp;
+		new_menu_sp;
+		newpad_sp;
+		newterm_sp;
+		newwin_sp;
+		nl_sp;
+		noecho_sp;
+		nofilter_sp;
+		nonl_sp;
+		pair_content_sp;
+		resize_term_sp;
+		resizeterm_sp;
+		restartterm_sp;
+		ripoffline_sp;
+		scr_init_sp;
+		scr_restore_sp;
+		scr_set_sp;
+		set_escdelay_sp;
+		slk_attr_set_sp;
+		slk_attr_sp;
+		slk_attroff_sp;
+		slk_attron_sp;
+		slk_attrset_sp;
+		slk_clear_sp;
+		slk_color_sp;
+		slk_init_sp;
+		slk_label_sp;
+		slk_noutrefresh_sp;
+		slk_refresh_sp;
+		slk_restore_sp;
+		slk_set_sp;
+		slk_touch_sp;
+		start_color_sp;
+		term_attrs_sp;
+		termattrs_sp;
+		unget_wch_sp;
+		ungetch_sp;
+		ungetmouse_sp;
+		update_panels_sp;
+		use_default_colors_sp;
+		use_legacy_coding_sp;
+		vid_attr_sp;
+		vid_puts_sp;
+		vidattr_sp;
+		vidputs_sp;
+		wunctrl_sp;
+	local:
+		_nc_TYPE_ALNUM;
+		_nc_TYPE_ALPHA;
+		_nc_TYPE_ENUM;
+		_nc_TYPE_INTEGER;
+		_nc_TYPE_IPV4;
+		_nc_TYPE_NUMERIC;
+		_nc_TYPE_REGEXP;
+		_nc_curscr_of;
+		_nc_do_color_sp;
+		_nc_form_cursor;
+		_nc_format_slks;
+		_nc_free_and_exit_sp;
+		_nc_freeall_sp;
+		_nc_fty_generic;
+		_nc_generic_fieldtype;
+		_nc_get_fieldbuffer;
+		_nc_hash_map_sp;
+		_nc_insert_wch;
+		_nc_linedump_sp;
+		_nc_make_oldhash_sp;
+		_nc_makenew_sp;
+		_nc_msec_cost_sp;
+		_nc_mvcur_init_sp;
+		_nc_mvcur_resume_sp;
+		_nc_mvcur_wrap_sp;
+		_nc_newscr_of;
+		_nc_printf_string_sp;
+		_nc_reset_colors_sp;
+		_nc_retrace_mmask_t;
+		_nc_ripoffline_sp;
+		_nc_screen_init_sp;
+		_nc_screen_resume_sp;
+		_nc_screen_wrap_sp;
+		_nc_scroll_oldhash_sp;
+		_nc_scroll_optimize_sp;
+		_nc_scrolln_sp;
+		_nc_set_generic_fieldtype;
+		_nc_setupscreen_sp;
+		_nc_stdscr_of;
+} NCURSESW_5.7.20081102;
+
+NCURSESW_5.9.20150530 {
+	global:
+		form_driver_w;
+		wgetdelay;
+	local:
+		_nc_mvcur;
+		_nc_mvcur_sp;
+		_nc_trace_mmask_t;
+} NCURSESW_5.8.20110226;
+
+NCURSESW_6.1.20171230 {
+	global:
+		alloc_pair;
+		alloc_pair_sp;
+		extended_color_content;
+		extended_color_content_sp;
+		extended_pair_content;
+		extended_pair_content_sp;
+		extended_slk_color;
+		extended_slk_color_sp;
+		find_pair;
+		find_pair_sp;
+		free_pair;
+		free_pair_sp;
+		init_extended_color;
+		init_extended_color_sp;
+		init_extended_pair;
+		init_extended_pair_sp;
+		reset_color_pairs;
+		reset_color_pairs_sp;
+		unfocus_current_field;
+	local:
+		_nc_Unset_Current_Field;
+		_nc_change_pair;
+		_nc_init_color;
+		_nc_init_pair;
+		_nc_pair_content;
+		_nc_reset_color_pair;
+		_nc_set_color_pair;
+} NCURSESW_5.9.20150530;
+
+NCURSESW_6.2.20200212 {
+	global:
+		exit_curses;
+	local:
+		_*;
+} NCURSESW_6.1.20171230;
diff --git a/package/ncursesw.sym b/package/ncursesw.sym
new file mode 100644
index 0000000..a17fd79
--- /dev/null
+++ b/package/ncursesw.sym
@@ -0,0 +1,998 @@
+# $Id: ncursesw.sym,v 1.40 2021/08/19 23:50:26 tom Exp $
+# script for shared library symbol-visibility using libtool
+#
+# This file was generated by ncu-mapsyms
+# Configure options (5.1.20000708)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.2.20001021)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.3.20021019)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.4.20040208)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.5.20051010)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.6.20061217)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --enable-widec --with-hashed-db --with-termlib --with-ticlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.7.20081102)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --enable-widec --with-hashed-db --with-termlib --with-ticlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.8.20110226)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-widec --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-widec --with-broken_linker --with-hashed-db --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-widec --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --enable-widec --with-hashed-db --with-termlib --with-ticlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.9.20110404)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-widec --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-widec --with-broken_linker --with-hashed-db --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-widec --with-termlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --enable-widec --with-hashed-db --with-termlib --with-ticlib --with-trace --without-cxx-binding
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding
+# Configure options (5.9.20150530)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-widec --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-widec --with-broken_linker --with-hashed-db --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-widec --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --enable-widec --with-hashed-db --with-termlib --with-ticlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace
+# Configure options (6.0.20161029)
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-widec --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-widec --with-broken_linker --with-hashed-db --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-widec --with-termlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --enable-widec --with-hashed-db --with-termlib --with-ticlib --with-trace
+#	--disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace
+BC
+COLORS
+COLOR_PAIR
+COLOR_PAIRS
+COLS
+ESCDELAY
+LINES
+PAIR_NUMBER
+PC
+SP
+TABSIZE
+TYPE_ALNUM
+TYPE_ALPHA
+TYPE_ENUM
+TYPE_INTEGER
+TYPE_IPV4
+TYPE_NUMERIC
+TYPE_REGEXP
+UP
+_nc_Default_Field
+_nc_Default_Form
+_nc_access
+_nc_add_to_try
+_nc_align_termtype
+_nc_alloc_entry_leaks
+_nc_altcharset_name
+_nc_basename
+_nc_capcmp
+_nc_captoinfo_leaks
+_nc_check_termtype
+_nc_check_termtype2
+_nc_comp_scan_leaks
+_nc_copy_termtype
+_nc_copy_termtype2
+_nc_curr_col
+_nc_curr_line
+_nc_db_close
+_nc_db_first
+_nc_db_have_data
+_nc_db_next
+_nc_db_open
+_nc_db_put
+_nc_disable_period
+_nc_doalloc
+_nc_entry_match
+_nc_env_access
+_nc_err_abort
+_nc_eventlist_timeout
+_nc_export_termtype2
+_nc_fallback
+_nc_fallback2
+_nc_find_entry
+_nc_find_type_entry
+_nc_find_user_entry
+_nc_first_db
+_nc_first_name
+_nc_flush
+_nc_flush_sp
+_nc_fmt_funcptr
+_nc_free_and_exit
+_nc_free_entries
+_nc_free_termtype
+_nc_free_termtype2
+_nc_free_tic
+_nc_free_tinfo
+_nc_free_tparm
+_nc_freeall
+_nc_get_alias_table
+_nc_get_hash_table
+_nc_get_locale
+_nc_get_screensize
+_nc_get_source
+_nc_get_table
+_nc_get_tty_mode
+_nc_get_tty_mode_sp
+_nc_get_type
+_nc_getenv_num
+_nc_globals
+_nc_handle_sigwinch
+_nc_has_mouse
+_nc_head
+_nc_home_terminfo
+_nc_info_hash_table
+_nc_infotocap
+_nc_init_acs
+_nc_init_acs_sp
+_nc_init_termtype
+_nc_is_abs_path
+_nc_is_dir_path
+_nc_is_file_path
+_nc_keep_tic_dir
+_nc_keyname_leaks
+_nc_keypad
+_nc_last_db
+_nc_leaks_tinfo
+_nc_locale_breaks_acs
+_nc_name_match
+_nc_next_db
+_nc_optimize_enable
+_nc_outc_wrapper
+_nc_outch
+_nc_outch_sp
+_nc_outchars
+_nc_panelhook
+_nc_panelhook_sp
+_nc_pathlast
+_nc_prescreen
+_nc_putchar
+_nc_putchar_sp
+_nc_putp
+_nc_putp_flush
+_nc_putp_flush_sp
+_nc_putp_sp
+_nc_read_entry
+_nc_read_entry2
+_nc_read_entry_source
+_nc_read_file_entry
+_nc_read_termtype
+_nc_reset_input
+_nc_reset_tparm
+_nc_resolve_uses
+_nc_resolve_uses2
+_nc_retrace_attr_t
+_nc_retrace_bool
+_nc_retrace_chtype
+_nc_retrace_cptr
+_nc_retrace_cvoid_ptr
+_nc_retrace_int
+_nc_retrace_int_attr_t
+_nc_retrace_ptr
+_nc_retrace_sp
+_nc_retrace_unsigned
+_nc_retrace_void_ptr
+_nc_retrace_win
+_nc_ripoffline
+_nc_rootname
+_nc_safe_fopen
+_nc_safe_open3
+_nc_safe_strcat
+_nc_safe_strcpy
+_nc_screen_chain
+_nc_screen_of
+_nc_set_buffer
+_nc_set_buffer_sp
+_nc_set_no_padding
+_nc_set_source
+_nc_set_tty_mode
+_nc_set_tty_mode_sp
+_nc_set_type
+_nc_set_writedir
+_nc_setupterm
+_nc_str_copy
+_nc_str_init
+_nc_str_null
+_nc_strict_bsd
+_nc_suppress_warnings
+_nc_syntax
+_nc_syserr_abort
+_nc_tail
+_nc_tgetent_leaks
+_nc_tic_dir
+_nc_tic_expand
+_nc_tic_written
+_nc_timed_wait
+_nc_tinfo_fkeys
+_nc_tiparm
+_nc_tparm_analyze
+_nc_tparm_err
+_nc_tputs_trace
+_nc_trace_buf
+_nc_trace_bufcat
+_nc_tracechar
+_nc_tracing
+_nc_trans_string
+_nc_trim_sgr0
+_nc_unicode_locale
+_nc_update_screensize
+_nc_user_definable
+_nc_utf8_outch
+_nc_visbuf
+_nc_visbuf2
+_nc_visbufn
+_nc_viscbuf
+_nc_viswbuf
+_nc_viswbufn
+_nc_viswibuf
+_nc_wacs
+_nc_wacs_width
+_nc_warning
+_nc_wchstrlen
+_nc_wcrtomb
+_nc_write_entry
+_nc_write_object
+_traceattr
+_traceattr2
+_tracecchar_t
+_tracecchar_t2
+_tracechar
+_tracechtype
+_tracechtype2
+_tracef
+acs_map
+add_wch
+add_wchnstr
+add_wchstr
+addch
+addchnstr
+addchstr
+addnstr
+addnwstr
+addstr
+addwstr
+alloc_pair
+alloc_pair_sp
+assume_default_colors
+assume_default_colors_sp
+attr_get
+attr_off
+attr_on
+attr_set
+attroff
+attron
+attrset
+baudrate
+baudrate_sp
+beep
+beep_sp
+bkgd
+bkgdset
+bkgrnd
+bkgrndset
+boolcodes
+boolfnames
+boolnames
+border
+border_set
+bottom_panel
+box
+box_set
+can_change_color
+can_change_color_sp
+cbreak
+cbreak_sp
+ceiling_panel
+chgat
+clear
+clearok
+clrtobot
+clrtoeol
+color_content
+color_content_sp
+color_set
+copywin
+cur_term
+current_field
+current_item
+curs_set
+curs_set_sp
+curscr
+curses_trace
+curses_version
+data_ahead
+data_behind
+def_prog_mode
+def_prog_mode_sp
+def_shell_mode
+def_shell_mode_sp
+define_key
+define_key_sp
+del_curterm
+del_curterm_sp
+del_panel
+delay_output
+delay_output_sp
+delch
+deleteln
+delscreen
+delwin
+derwin
+doupdate
+doupdate_sp
+dup_field
+dupwin
+dynamic_field_info
+echo
+echo_sp
+echo_wchar
+echochar
+endwin
+endwin_sp
+erase
+erasechar
+erasechar_sp
+erasewchar
+erasewchar_sp
+exit_curses
+exit_terminfo
+extended_color_content
+extended_color_content_sp
+extended_pair_content
+extended_pair_content_sp
+extended_slk_color
+extended_slk_color_sp
+field_arg
+field_back
+field_buffer
+field_count
+field_fore
+field_index
+field_info
+field_init
+field_just
+field_opts
+field_opts_off
+field_opts_on
+field_pad
+field_status
+field_term
+field_type
+field_userptr
+filter
+filter_sp
+find_pair
+find_pair_sp
+flash
+flash_sp
+flushinp
+flushinp_sp
+form_driver
+form_driver_w
+form_fields
+form_init
+form_opts
+form_opts_off
+form_opts_on
+form_page
+form_request_by_name
+form_request_name
+form_sub
+form_term
+form_userptr
+form_win
+free_field
+free_fieldtype
+free_form
+free_item
+free_menu
+free_pair
+free_pair_sp
+get_escdelay
+get_escdelay_sp
+get_wch
+get_wstr
+getattrs
+getbegx
+getbegy
+getbkgd
+getbkgrnd
+getcchar
+getch
+getcurx
+getcury
+getmaxx
+getmaxy
+getmouse
+getmouse_sp
+getn_wstr
+getnstr
+getparx
+getpary
+getstr
+getwin
+getwin_sp
+ground_panel
+halfdelay
+halfdelay_sp
+has_colors
+has_colors_sp
+has_ic
+has_ic_sp
+has_il
+has_il_sp
+has_key
+has_key_sp
+has_mouse
+has_mouse_sp
+hide_panel
+hline
+hline_set
+idcok
+idlok
+immedok
+in_wch
+in_wchnstr
+in_wchstr
+inch
+inchnstr
+inchstr
+init_color
+init_color_sp
+init_extended_color
+init_extended_color_sp
+init_extended_pair
+init_extended_pair_sp
+init_pair
+init_pair_sp
+initscr
+innstr
+innwstr
+ins_nwstr
+ins_wch
+ins_wstr
+insch
+insdelln
+insertln
+insnstr
+insstr
+instr
+intrflush
+intrflush_sp
+inwstr
+is_cleared
+is_idcok
+is_idlok
+is_immedok
+is_keypad
+is_leaveok
+is_linetouched
+is_nodelay
+is_notimeout
+is_pad
+is_scrollok
+is_subwin
+is_syncok
+is_term_resized
+is_term_resized_sp
+is_wintouched
+isendwin
+isendwin_sp
+item_count
+item_description
+item_index
+item_init
+item_name
+item_opts
+item_opts_off
+item_opts_on
+item_term
+item_userptr
+item_value
+item_visible
+key_defined
+key_defined_sp
+key_name
+keybound
+keybound_sp
+keyname
+keyname_sp
+keyok
+keyok_sp
+keypad
+killchar
+killchar_sp
+killwchar
+killwchar_sp
+leaveok
+link_field
+link_fieldtype
+longname
+longname_sp
+mcprint
+mcprint_sp
+menu_back
+menu_driver
+menu_fore
+menu_format
+menu_grey
+menu_init
+menu_items
+menu_mark
+menu_opts
+menu_opts_off
+menu_opts_on
+menu_pad
+menu_pattern
+menu_request_by_name
+menu_request_name
+menu_spacing
+menu_sub
+menu_term
+menu_userptr
+menu_win
+meta
+mouse_trafo
+mouseinterval
+mouseinterval_sp
+mousemask
+mousemask_sp
+move
+move_field
+move_panel
+mvadd_wch
+mvadd_wchnstr
+mvadd_wchstr
+mvaddch
+mvaddchnstr
+mvaddchstr
+mvaddnstr
+mvaddnwstr
+mvaddstr
+mvaddwstr
+mvchgat
+mvcur
+mvcur_sp
+mvdelch
+mvderwin
+mvget_wch
+mvget_wstr
+mvgetch
+mvgetn_wstr
+mvgetnstr
+mvgetstr
+mvhline
+mvhline_set
+mvin_wch
+mvin_wchnstr
+mvin_wchstr
+mvinch
+mvinchnstr
+mvinchstr
+mvinnstr
+mvinnwstr
+mvins_nwstr
+mvins_wch
+mvins_wstr
+mvinsch
+mvinsnstr
+mvinsstr
+mvinstr
+mvinwstr
+mvprintw
+mvscanw
+mvvline
+mvvline_set
+mvwadd_wch
+mvwadd_wchnstr
+mvwadd_wchstr
+mvwaddch
+mvwaddchnstr
+mvwaddchstr
+mvwaddnstr
+mvwaddnwstr
+mvwaddstr
+mvwaddwstr
+mvwchgat
+mvwdelch
+mvwget_wch
+mvwget_wstr
+mvwgetch
+mvwgetn_wstr
+mvwgetnstr
+mvwgetstr
+mvwhline
+mvwhline_set
+mvwin
+mvwin_wch
+mvwin_wchnstr
+mvwin_wchstr
+mvwinch
+mvwinchnstr
+mvwinchstr
+mvwinnstr
+mvwinnwstr
+mvwins_nwstr
+mvwins_wch
+mvwins_wstr
+mvwinsch
+mvwinsnstr
+mvwinsstr
+mvwinstr
+mvwinwstr
+mvwprintw
+mvwscanw
+mvwvline
+mvwvline_set
+napms
+napms_sp
+new_field
+new_fieldtype
+new_form
+new_form_sp
+new_item
+new_menu
+new_menu_sp
+new_page
+new_panel
+new_prescr
+newpad
+newpad_sp
+newscr
+newterm
+newterm_sp
+newwin
+newwin_sp
+nl
+nl_sp
+nocbreak
+nocbreak_sp
+nodelay
+noecho
+noecho_sp
+nofilter
+nofilter_sp
+nonl
+nonl_sp
+noqiflush
+noqiflush_sp
+noraw
+noraw_sp
+notimeout
+numcodes
+numfnames
+numnames
+ospeed
+overlay
+overwrite
+pair_content
+pair_content_sp
+panel_above
+panel_below
+panel_hidden
+panel_userptr
+panel_window
+pecho_wchar
+pechochar
+pnoutrefresh
+pos_form_cursor
+pos_menu_cursor
+post_form
+post_menu
+prefresh
+printw
+putp
+putp_sp
+putwin
+qiflush
+qiflush_sp
+raw
+raw_sp
+redrawwin
+refresh
+replace_panel
+reset_color_pairs
+reset_color_pairs_sp
+reset_prog_mode
+reset_prog_mode_sp
+reset_shell_mode
+reset_shell_mode_sp
+resetty
+resetty_sp
+resize_term
+resize_term_sp
+resizeterm
+resizeterm_sp
+restartterm
+restartterm_sp
+ripoffline
+ripoffline_sp
+savetty
+savetty_sp
+scale_form
+scale_menu
+scanw
+scr_dump
+scr_init
+scr_init_sp
+scr_restore
+scr_restore_sp
+scr_set
+scr_set_sp
+scrl
+scroll
+scrollok
+set_current_field
+set_current_item
+set_curterm
+set_curterm_sp
+set_escdelay
+set_escdelay_sp
+set_field_back
+set_field_buffer
+set_field_fore
+set_field_init
+set_field_just
+set_field_opts
+set_field_pad
+set_field_status
+set_field_term
+set_field_type
+set_field_userptr
+set_fieldtype_arg
+set_fieldtype_choice
+set_form_fields
+set_form_init
+set_form_opts
+set_form_page
+set_form_sub
+set_form_term
+set_form_userptr
+set_form_win
+set_item_init
+set_item_opts
+set_item_term
+set_item_userptr
+set_item_value
+set_max_field
+set_menu_back
+set_menu_fore
+set_menu_format
+set_menu_grey
+set_menu_init
+set_menu_items
+set_menu_mark
+set_menu_opts
+set_menu_pad
+set_menu_pattern
+set_menu_spacing
+set_menu_sub
+set_menu_term
+set_menu_userptr
+set_menu_win
+set_new_page
+set_panel_userptr
+set_tabsize
+set_tabsize_sp
+set_term
+set_top_row
+setcchar
+setscrreg
+setupterm
+show_panel
+slk_attr
+slk_attr_off
+slk_attr_on
+slk_attr_set
+slk_attr_set_sp
+slk_attr_sp
+slk_attroff
+slk_attroff_sp
+slk_attron
+slk_attron_sp
+slk_attrset
+slk_attrset_sp
+slk_clear
+slk_clear_sp
+slk_color
+slk_color_sp
+slk_init
+slk_init_sp
+slk_label
+slk_label_sp
+slk_noutrefresh
+slk_noutrefresh_sp
+slk_refresh
+slk_refresh_sp
+slk_restore
+slk_restore_sp
+slk_set
+slk_set_sp
+slk_touch
+slk_touch_sp
+slk_wset
+standend
+standout
+start_color
+start_color_sp
+stdscr
+strcodes
+strfnames
+strnames
+subpad
+subwin
+syncok
+term_attrs
+term_attrs_sp
+termattrs
+termattrs_sp
+termname
+termname_sp
+tgetent
+tgetent_sp
+tgetflag
+tgetflag_sp
+tgetnum
+tgetnum_sp
+tgetstr
+tgetstr_sp
+tgoto
+tigetflag
+tigetflag_sp
+tigetnum
+tigetnum_sp
+tigetstr
+tigetstr_sp
+timeout
+tiparm
+top_panel
+top_row
+touchline
+touchwin
+tparm
+tputs
+tputs_sp
+trace
+ttytype
+typeahead
+typeahead_sp
+unctrl
+unctrl_sp
+unfocus_current_field
+unget_wch
+unget_wch_sp
+ungetch
+ungetch_sp
+ungetmouse
+ungetmouse_sp
+unpost_form
+unpost_menu
+untouchwin
+update_panels
+update_panels_sp
+use_default_colors
+use_default_colors_sp
+use_env
+use_env_sp
+use_extended_names
+use_legacy_coding
+use_legacy_coding_sp
+use_screen
+use_tioctl
+use_tioctl_sp
+use_window
+vid_attr
+vid_attr_sp
+vid_puts
+vid_puts_sp
+vidattr
+vidattr_sp
+vidputs
+vidputs_sp
+vline
+vline_set
+vw_printw
+vw_scanw
+vwprintw
+vwscanw
+wadd_wch
+wadd_wchnstr
+wadd_wchstr
+waddch
+waddchnstr
+waddchstr
+waddnstr
+waddnwstr
+waddstr
+waddwstr
+wattr_get
+wattr_off
+wattr_on
+wattr_set
+wattroff
+wattron
+wattrset
+wbkgd
+wbkgdset
+wbkgrnd
+wbkgrndset
+wborder
+wborder_set
+wchgat
+wclear
+wclrtobot
+wclrtoeol
+wcolor_set
+wcursyncup
+wdelch
+wdeleteln
+wecho_wchar
+wechochar
+wenclose
+werase
+wget_wch
+wget_wstr
+wgetbkgrnd
+wgetch
+wgetch_events
+wgetdelay
+wgetn_wstr
+wgetnstr
+wgetnstr_events
+wgetparent
+wgetscrreg
+wgetstr
+whline
+whline_set
+win_wch
+win_wchnstr
+win_wchstr
+winch
+winchnstr
+winchstr
+winnstr
+winnwstr
+wins_nwstr
+wins_wch
+wins_wstr
+winsch
+winsdelln
+winsertln
+winsnstr
+winsstr
+winstr
+winwstr
+wmouse_trafo
+wmove
+wnoutrefresh
+wprintw
+wredrawln
+wrefresh
+wresize
+wscanw
+wscrl
+wsetscrreg
+wstandend
+wstandout
+wsyncdown
+wsyncup
+wtimeout
+wtouchln
+wunctrl
+wunctrl_sp
+wvline
+wvline_set
diff --git a/panel/Makefile.in b/panel/Makefile.in
new file mode 100644
index 0000000..380f80c
--- /dev/null
+++ b/panel/Makefile.in
@@ -0,0 +1,206 @@
+# $Id: Makefile.in,v 1.76 2021/07/03 15:45:33 tom Exp $
+##############################################################################
+# Copyright 2020,2021 Thomas E. Dickey                                       #
+# Copyright 1998-2015,2018 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey 1996-on
+#
+# Makefile for panels source code.
+#
+# This makes the following:
+#	libraries (normal/debug/profile/shared)
+#
+# The variable 'srcdir' refers to the source-distribution, and can be set with
+# the configure script by "--srcdir=DIR".
+#
+# The rules are organized to produce the libraries for the configured models,
+
+# turn off _all_ suffix rules; we'll generate our own
+.SUFFIXES:
+
+SHELL		= @SHELL@
+VPATH		= @srcdir@
+THIS		= Makefile
+
+x		= @EXEEXT@
+o		= .@OBJEXT@
+
+MODEL		= @DFT_LWR_MODEL@
+DESTDIR		= @DESTDIR@
+top_srcdir	= @top_srcdir@
+srcdir		= @srcdir@
+prefix		= @prefix@
+exec_prefix	= @exec_prefix@
+bindir		= @bindir@
+libdir		= @libdir@
+includedir	= @includedir@
+datarootdir	= @datarootdir@
+datadir		= @datadir@
+includesubdir	= @includesubdir@
+
+INCLUDEDIR	= $(DESTDIR)$(includedir)$(includesubdir)
+
+PACKAGE		= @PACKAGE@
+
+LIBTOOL		= @LIBTOOL@
+LIBTOOL_OPTS	= @LIBTOOL_OPTS@ @EXPORT_SYMS@
+LIBTOOL_CLEAN	= @LIB_CLEAN@
+LIBTOOL_COMPILE	= @LIB_COMPILE@
+LIBTOOL_LINK	= @LIB_LINK@
+LIBTOOL_INSTALL	= @LIB_INSTALL@
+LIBTOOL_UNINSTALL = @LIB_UNINSTALL@
+LT_UNDEF	= @LT_UNDEF@
+
+INSTALL		= @INSTALL@
+INSTALL_LIB	= @INSTALL@ @INSTALL_LIB@
+INSTALL_PROG	= @INSTALL_PROGRAM@ @INSTALL_OPT_S@
+INSTALL_DATA	= @INSTALL_DATA@
+
+AR		= @AR@
+ARFLAGS		= @ARFLAGS@
+AWK		= @AWK@
+LD		= @LD@
+LN_S		= @LN_S@
+
+CTAGS		= @CTAGS@
+ETAGS		= @ETAGS@
+
+CC		= @CC@
+CPP		= @CPP@
+CFLAGS		= @CFLAGS@ @EXTRA_CFLAGS@
+
+INCDIR		= $(top_srcdir)/include
+BASE_DIR 	= $(top_srcdir)/ncurses
+CPPFLAGS	= -I$(BASE_DIR) -DHAVE_CONFIG_H -DBUILDING_PANEL @CPPFLAGS@
+
+CCFLAGS		= $(CPPFLAGS) $(CFLAGS)
+
+CFLAGS_LIBTOOL	= $(CCFLAGS)
+CFLAGS_NORMAL	= $(CCFLAGS) -DNCURSES_STATIC
+CFLAGS_DEBUG	= $(CCFLAGS) -DNCURSES_STATIC @CC_G_OPT@ -DTRACE
+CFLAGS_PROFILE	= $(CCFLAGS) -DNCURSES_STATIC -pg
+CFLAGS_SHARED	= $(CCFLAGS) @CC_SHARED_OPTS@
+
+CFLAGS_DEFAULT	= $(CFLAGS_@DFT_UPR_MODEL@)
+
+LINK		= $(LIBTOOL_LINK)
+LDFLAGS		= @LDFLAGS@ @LD_MODEL@ @LIBS@
+
+SHLIB_DIRS	= -L../lib
+SHLIB_LIST	= $(SHLIB_DIRS) -lncurses@USE_LIB_SUFFIX@ @SHLIB_LIST@
+
+RPATH_LIST	= @RPATH_LIST@
+RESULTING_SYMS	= @RESULTING_SYMS@
+VERSIONED_SYMS	= @VERSIONED_SYMS@
+MK_SHARED_LIB	= @MK_SHARED_LIB@
+
+NCURSES_MAJOR	= @NCURSES_MAJOR@
+NCURSES_MINOR	= @NCURSES_MINOR@
+REL_VERSION	= @cf_cv_rel_version@
+ABI_VERSION	= @cf_cv_abi_version@
+
+RANLIB		= @LIB_PREP@
+
+LIBRARIES	= @Libs_To_Make@
+
+LINT		= @LINT@
+LINT_OPTS	= @LINT_OPTS@
+LINT_LIBS	= -lpanel -lncurses @LIBS@
+
+AUTO_SRC	= \
+		../include/panel.h
+
+################################################################################
+
+@MAKE_PHONY@.PHONY :	all
+@MAKE_PHONY@.PHONY :	clean
+@MAKE_PHONY@.PHONY :	distclean
+@MAKE_PHONY@.PHONY :	install
+@MAKE_PHONY@.PHONY :	install.libs
+@MAKE_PHONY@.PHONY :	libs
+@MAKE_PHONY@.PHONY :	mostlyclean
+@MAKE_PHONY@.PHONY :	realclean
+@MAKE_PHONY@.PHONY :	sources
+@MAKE_PHONY@.PHONY :	uninstall
+@MAKE_PHONY@.PHONY :	uninstall.libs
+
+all \
+libs \
+install ::	$(AUTO_SRC) $(LIBRARIES)
+
+sources:	$(AUTO_SRC)
+
+$(DESTDIR)$(bindir) \
+$(DESTDIR)$(libdir) :
+	mkdir -p $@
+
+# make a copy to simplify include-paths while still keeping panel's include
+# file in this directory.
+../include/panel.h : $(srcdir)/panel.h
+	-rm -f $@
+	cp $(srcdir)/panel.h $@
+
+HEADER_DEPS = \
+	../include/curses.h \
+	../include/ncurses_cfg.h \
+	../include/ncurses_def.h \
+	../include/ncurses_dll.h \
+	../include/term.h \
+	../include/unctrl.h \
+	$(BASE_DIR)/curses.priv.h \
+	$(BASE_DIR)/new_pair.h \
+	$(INCDIR)/nc_alloc.h \
+	$(INCDIR)/nc_panel.h \
+	$(INCDIR)/nc_string.h \
+	$(INCDIR)/nc_termios.h \
+	$(INCDIR)/nc_tparm.h \
+	$(INCDIR)/term_entry.h \
+	$(srcdir)/panel.priv.h \
+	$(srcdir)/panel.h
+
+tags:
+	$(CTAGS) *.[ch]
+
+@MAKE_UPPER_TAGS@TAGS:
+@MAKE_UPPER_TAGS@	$(ETAGS) *.[ch]
+
+mostlyclean ::
+	-rm -f core tags TAGS *~ *.bak *.i *.ln *.atac trace
+
+clean :: mostlyclean
+	-rm -f $(AUTO_SRC)
+	-rm -rf .libs *.dSYM
+
+distclean :: clean
+	-rm -f Makefile
+
+realclean :: distclean
+
+###############################################################################
+# The remainder of this file is automatically generated during configuration
+###############################################################################
diff --git a/panel/headers b/panel/headers
new file mode 100644
index 0000000..b598d13
--- /dev/null
+++ b/panel/headers
@@ -0,0 +1,33 @@
+##############################################################################
+# Copyright 2020 Thomas E. Dickey                                            #
+# Copyright 1998,2006 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey <dickey@clark.net> 1996
+#
+$(srcdir)/panel.h
+# vile:makemode
diff --git a/panel/llib-lpanel b/panel/llib-lpanel
new file mode 100644
index 0000000..afdea20
--- /dev/null
+++ b/panel/llib-lpanel
@@ -0,0 +1,199 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2010,2015 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey       1996-on                                  *
+ ****************************************************************************/
+/* LINTLIBRARY */
+
+/* ./panel.c */
+
+#include <panel.priv.h>
+
+#undef _nc_retrace_panel
+PANEL	*_nc_retrace_panel(
+		PANEL	*pan)
+		{ return(*(PANEL **)0); }
+
+#undef _nc_my_visbuf
+const char *_nc_my_visbuf(
+		const void *ptr,
+		int	n)
+		{ return(*(const char **)0); }
+
+#undef _nc_dPanel
+void	_nc_dPanel(
+		const char *text,
+		const PANEL *pan)
+		{ /* void */ }
+
+#undef _nc_dStack
+void	_nc_dStack(
+		const char *fmt,
+		int	num,
+		const PANEL *pan)
+		{ /* void */ }
+
+#undef _nc_Wnoutrefresh
+void	_nc_Wnoutrefresh(
+		const PANEL *pan)
+		{ /* void */ }
+
+#undef _nc_Touchpan
+void	_nc_Touchpan(
+		const PANEL *pan)
+		{ /* void */ }
+
+#undef _nc_Touchline
+void	_nc_Touchline(
+		const PANEL *pan,
+		int	start,
+		int	count)
+		{ /* void */ }
+
+/* ./p_above.c */
+
+#undef ground_panel
+PANEL	*ground_panel(
+		SCREEN	*sp)
+		{ return(*(PANEL **)0); }
+
+#undef panel_above
+PANEL	*panel_above(
+		const PANEL *pan)
+		{ return(*(PANEL **)0); }
+
+/* ./p_below.c */
+
+#undef ceiling_panel
+PANEL	*ceiling_panel(
+		SCREEN	*sp)
+		{ return(*(PANEL **)0); }
+
+#undef panel_below
+PANEL	*panel_below(
+		const PANEL *pan)
+		{ return(*(PANEL **)0); }
+
+/* ./p_bottom.c */
+
+#undef bottom_panel
+int	bottom_panel(
+		PANEL	*pan)
+		{ return(*(int *)0); }
+
+/* ./p_delete.c */
+
+#undef del_panel
+int	del_panel(
+		PANEL	*pan)
+		{ return(*(int *)0); }
+
+/* ./p_hide.c */
+
+#undef hide_panel
+int	hide_panel(
+		 PANEL	*pan)
+		{ return(*(int *)0); }
+
+/* ./p_hidden.c */
+
+#undef panel_hidden
+int	panel_hidden(
+		const PANEL *pan)
+		{ return(*(int *)0); }
+
+/* ./p_move.c */
+
+#undef move_panel
+int	move_panel(
+		PANEL	*pan,
+		int	starty,
+		int	startx)
+		{ return(*(int *)0); }
+
+/* ./p_new.c */
+
+#undef new_panel
+PANEL	*new_panel(
+		WINDOW	*win)
+		{ return(*(PANEL **)0); }
+
+/* ./p_replace.c */
+
+#undef replace_panel
+int	replace_panel(
+		PANEL	*pan,
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+/* ./p_show.c */
+
+#undef show_panel
+int	show_panel(
+		PANEL	*pan)
+		{ return(*(int *)0); }
+
+/* ./p_top.c */
+
+#undef top_panel
+int	top_panel(
+		PANEL	*pan)
+		{ return(*(int *)0); }
+
+/* ./p_update.c */
+
+#undef update_panels_sp
+void	update_panels_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef update_panels
+void	update_panels(void)
+		{ /* void */ }
+
+/* ./p_user.c */
+
+#undef set_panel_userptr
+int	set_panel_userptr(
+		PANEL	*pan,
+		const void *uptr)
+		{ return(*(int *)0); }
+
+#undef panel_userptr
+const void *panel_userptr(
+		const PANEL *pan)
+		{ return(*(const void **)0); }
+
+/* ./p_win.c */
+
+#undef panel_window
+WINDOW	*panel_window(
+		const PANEL *pan)
+		{ return(*(WINDOW **)0); }
diff --git a/panel/llib-lpanelt b/panel/llib-lpanelt
new file mode 100644
index 0000000..0b99683
--- /dev/null
+++ b/panel/llib-lpanelt
@@ -0,0 +1,199 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 2010,2015 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey       2010-on                                  *
+ ****************************************************************************/
+/* LINTLIBRARY */
+
+/* ./panel.c */
+
+#include <panel.priv.h>
+
+#undef _nc_retrace_panel
+PANEL	*_nc_retrace_panel(
+		PANEL	*pan)
+		{ return(*(PANEL **)0); }
+
+#undef _nc_my_visbuf
+const char *_nc_my_visbuf(
+		const void *ptr,
+		int	n)
+		{ return(*(const char **)0); }
+
+#undef _nc_dPanel
+void	_nc_dPanel(
+		const char *text,
+		const PANEL *pan)
+		{ /* void */ }
+
+#undef _nc_dStack
+void	_nc_dStack(
+		const char *fmt,
+		int	num,
+		const PANEL *pan)
+		{ /* void */ }
+
+#undef _nc_Wnoutrefresh
+void	_nc_Wnoutrefresh(
+		const PANEL *pan)
+		{ /* void */ }
+
+#undef _nc_Touchpan
+void	_nc_Touchpan(
+		const PANEL *pan)
+		{ /* void */ }
+
+#undef _nc_Touchline
+void	_nc_Touchline(
+		const PANEL *pan,
+		int	start,
+		int	count)
+		{ /* void */ }
+
+/* ./p_above.c */
+
+#undef ground_panel
+PANEL	*ground_panel(
+		SCREEN	*sp)
+		{ return(*(PANEL **)0); }
+
+#undef panel_above
+PANEL	*panel_above(
+		const PANEL *pan)
+		{ return(*(PANEL **)0); }
+
+/* ./p_below.c */
+
+#undef ceiling_panel
+PANEL	*ceiling_panel(
+		SCREEN	*sp)
+		{ return(*(PANEL **)0); }
+
+#undef panel_below
+PANEL	*panel_below(
+		const PANEL *pan)
+		{ return(*(PANEL **)0); }
+
+/* ./p_bottom.c */
+
+#undef bottom_panel
+int	bottom_panel(
+		PANEL	*pan)
+		{ return(*(int *)0); }
+
+/* ./p_delete.c */
+
+#undef del_panel
+int	del_panel(
+		PANEL	*pan)
+		{ return(*(int *)0); }
+
+/* ./p_hide.c */
+
+#undef hide_panel
+int	hide_panel(
+		 PANEL	*pan)
+		{ return(*(int *)0); }
+
+/* ./p_hidden.c */
+
+#undef panel_hidden
+int	panel_hidden(
+		const PANEL *pan)
+		{ return(*(int *)0); }
+
+/* ./p_move.c */
+
+#undef move_panel
+int	move_panel(
+		PANEL	*pan,
+		int	starty,
+		int	startx)
+		{ return(*(int *)0); }
+
+/* ./p_new.c */
+
+#undef new_panel
+PANEL	*new_panel(
+		WINDOW	*win)
+		{ return(*(PANEL **)0); }
+
+/* ./p_replace.c */
+
+#undef replace_panel
+int	replace_panel(
+		PANEL	*pan,
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+/* ./p_show.c */
+
+#undef show_panel
+int	show_panel(
+		PANEL	*pan)
+		{ return(*(int *)0); }
+
+/* ./p_top.c */
+
+#undef top_panel
+int	top_panel(
+		PANEL	*pan)
+		{ return(*(int *)0); }
+
+/* ./p_update.c */
+
+#undef update_panels_sp
+void	update_panels_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef update_panels
+void	update_panels(void)
+		{ /* void */ }
+
+/* ./p_user.c */
+
+#undef set_panel_userptr
+int	set_panel_userptr(
+		PANEL	*pan,
+		const void *uptr)
+		{ return(*(int *)0); }
+
+#undef panel_userptr
+const void *panel_userptr(
+		const PANEL *pan)
+		{ return(*(const void **)0); }
+
+/* ./p_win.c */
+
+#undef panel_window
+WINDOW	*panel_window(
+		const PANEL *pan)
+		{ return(*(WINDOW **)0); }
diff --git a/panel/llib-lpaneltw b/panel/llib-lpaneltw
new file mode 100644
index 0000000..0b99683
--- /dev/null
+++ b/panel/llib-lpaneltw
@@ -0,0 +1,199 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 2010,2015 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey       2010-on                                  *
+ ****************************************************************************/
+/* LINTLIBRARY */
+
+/* ./panel.c */
+
+#include <panel.priv.h>
+
+#undef _nc_retrace_panel
+PANEL	*_nc_retrace_panel(
+		PANEL	*pan)
+		{ return(*(PANEL **)0); }
+
+#undef _nc_my_visbuf
+const char *_nc_my_visbuf(
+		const void *ptr,
+		int	n)
+		{ return(*(const char **)0); }
+
+#undef _nc_dPanel
+void	_nc_dPanel(
+		const char *text,
+		const PANEL *pan)
+		{ /* void */ }
+
+#undef _nc_dStack
+void	_nc_dStack(
+		const char *fmt,
+		int	num,
+		const PANEL *pan)
+		{ /* void */ }
+
+#undef _nc_Wnoutrefresh
+void	_nc_Wnoutrefresh(
+		const PANEL *pan)
+		{ /* void */ }
+
+#undef _nc_Touchpan
+void	_nc_Touchpan(
+		const PANEL *pan)
+		{ /* void */ }
+
+#undef _nc_Touchline
+void	_nc_Touchline(
+		const PANEL *pan,
+		int	start,
+		int	count)
+		{ /* void */ }
+
+/* ./p_above.c */
+
+#undef ground_panel
+PANEL	*ground_panel(
+		SCREEN	*sp)
+		{ return(*(PANEL **)0); }
+
+#undef panel_above
+PANEL	*panel_above(
+		const PANEL *pan)
+		{ return(*(PANEL **)0); }
+
+/* ./p_below.c */
+
+#undef ceiling_panel
+PANEL	*ceiling_panel(
+		SCREEN	*sp)
+		{ return(*(PANEL **)0); }
+
+#undef panel_below
+PANEL	*panel_below(
+		const PANEL *pan)
+		{ return(*(PANEL **)0); }
+
+/* ./p_bottom.c */
+
+#undef bottom_panel
+int	bottom_panel(
+		PANEL	*pan)
+		{ return(*(int *)0); }
+
+/* ./p_delete.c */
+
+#undef del_panel
+int	del_panel(
+		PANEL	*pan)
+		{ return(*(int *)0); }
+
+/* ./p_hide.c */
+
+#undef hide_panel
+int	hide_panel(
+		 PANEL	*pan)
+		{ return(*(int *)0); }
+
+/* ./p_hidden.c */
+
+#undef panel_hidden
+int	panel_hidden(
+		const PANEL *pan)
+		{ return(*(int *)0); }
+
+/* ./p_move.c */
+
+#undef move_panel
+int	move_panel(
+		PANEL	*pan,
+		int	starty,
+		int	startx)
+		{ return(*(int *)0); }
+
+/* ./p_new.c */
+
+#undef new_panel
+PANEL	*new_panel(
+		WINDOW	*win)
+		{ return(*(PANEL **)0); }
+
+/* ./p_replace.c */
+
+#undef replace_panel
+int	replace_panel(
+		PANEL	*pan,
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+/* ./p_show.c */
+
+#undef show_panel
+int	show_panel(
+		PANEL	*pan)
+		{ return(*(int *)0); }
+
+/* ./p_top.c */
+
+#undef top_panel
+int	top_panel(
+		PANEL	*pan)
+		{ return(*(int *)0); }
+
+/* ./p_update.c */
+
+#undef update_panels_sp
+void	update_panels_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef update_panels
+void	update_panels(void)
+		{ /* void */ }
+
+/* ./p_user.c */
+
+#undef set_panel_userptr
+int	set_panel_userptr(
+		PANEL	*pan,
+		const void *uptr)
+		{ return(*(int *)0); }
+
+#undef panel_userptr
+const void *panel_userptr(
+		const PANEL *pan)
+		{ return(*(const void **)0); }
+
+/* ./p_win.c */
+
+#undef panel_window
+WINDOW	*panel_window(
+		const PANEL *pan)
+		{ return(*(WINDOW **)0); }
diff --git a/panel/llib-lpanelw b/panel/llib-lpanelw
new file mode 100644
index 0000000..7ed8b3c
--- /dev/null
+++ b/panel/llib-lpanelw
@@ -0,0 +1,199 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 2002-2010,2015 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey       2002-on                                  *
+ ****************************************************************************/
+/* LINTLIBRARY */
+
+/* ./panel.c */
+
+#include <panel.priv.h>
+
+#undef _nc_retrace_panel
+PANEL	*_nc_retrace_panel(
+		PANEL	*pan)
+		{ return(*(PANEL **)0); }
+
+#undef _nc_my_visbuf
+const char *_nc_my_visbuf(
+		const void *ptr,
+		int	n)
+		{ return(*(const char **)0); }
+
+#undef _nc_dPanel
+void	_nc_dPanel(
+		const char *text,
+		const PANEL *pan)
+		{ /* void */ }
+
+#undef _nc_dStack
+void	_nc_dStack(
+		const char *fmt,
+		int	num,
+		const PANEL *pan)
+		{ /* void */ }
+
+#undef _nc_Wnoutrefresh
+void	_nc_Wnoutrefresh(
+		const PANEL *pan)
+		{ /* void */ }
+
+#undef _nc_Touchpan
+void	_nc_Touchpan(
+		const PANEL *pan)
+		{ /* void */ }
+
+#undef _nc_Touchline
+void	_nc_Touchline(
+		const PANEL *pan,
+		int	start,
+		int	count)
+		{ /* void */ }
+
+/* ./p_above.c */
+
+#undef ground_panel
+PANEL	*ground_panel(
+		SCREEN	*sp)
+		{ return(*(PANEL **)0); }
+
+#undef panel_above
+PANEL	*panel_above(
+		const PANEL *pan)
+		{ return(*(PANEL **)0); }
+
+/* ./p_below.c */
+
+#undef ceiling_panel
+PANEL	*ceiling_panel(
+		SCREEN	*sp)
+		{ return(*(PANEL **)0); }
+
+#undef panel_below
+PANEL	*panel_below(
+		const PANEL *pan)
+		{ return(*(PANEL **)0); }
+
+/* ./p_bottom.c */
+
+#undef bottom_panel
+int	bottom_panel(
+		PANEL	*pan)
+		{ return(*(int *)0); }
+
+/* ./p_delete.c */
+
+#undef del_panel
+int	del_panel(
+		PANEL	*pan)
+		{ return(*(int *)0); }
+
+/* ./p_hide.c */
+
+#undef hide_panel
+int	hide_panel(
+		 PANEL	*pan)
+		{ return(*(int *)0); }
+
+/* ./p_hidden.c */
+
+#undef panel_hidden
+int	panel_hidden(
+		const PANEL *pan)
+		{ return(*(int *)0); }
+
+/* ./p_move.c */
+
+#undef move_panel
+int	move_panel(
+		PANEL	*pan,
+		int	starty,
+		int	startx)
+		{ return(*(int *)0); }
+
+/* ./p_new.c */
+
+#undef new_panel
+PANEL	*new_panel(
+		WINDOW	*win)
+		{ return(*(PANEL **)0); }
+
+/* ./p_replace.c */
+
+#undef replace_panel
+int	replace_panel(
+		PANEL	*pan,
+		WINDOW	*win)
+		{ return(*(int *)0); }
+
+/* ./p_show.c */
+
+#undef show_panel
+int	show_panel(
+		PANEL	*pan)
+		{ return(*(int *)0); }
+
+/* ./p_top.c */
+
+#undef top_panel
+int	top_panel(
+		PANEL	*pan)
+		{ return(*(int *)0); }
+
+/* ./p_update.c */
+
+#undef update_panels_sp
+void	update_panels_sp(
+		SCREEN	*sp)
+		{ /* void */ }
+
+#undef update_panels
+void	update_panels(void)
+		{ /* void */ }
+
+/* ./p_user.c */
+
+#undef set_panel_userptr
+int	set_panel_userptr(
+		PANEL	*pan,
+		const void *uptr)
+		{ return(*(int *)0); }
+
+#undef panel_userptr
+const void *panel_userptr(
+		const PANEL *pan)
+		{ return(*(const void **)0); }
+
+/* ./p_win.c */
+
+#undef panel_window
+WINDOW	*panel_window(
+		const PANEL *pan)
+		{ return(*(WINDOW **)0); }
diff --git a/panel/modules b/panel/modules
new file mode 100644
index 0000000..4b0c9d8
--- /dev/null
+++ b/panel/modules
@@ -0,0 +1,52 @@
+# $Id: modules,v 1.11 2020/02/02 23:34:34 tom Exp $
+##############################################################################
+# Copyright 2020 Thomas E. Dickey                                            #
+# Copyright 1998-2006,2010 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey	1995-on
+#
+
+@ base
+# Library objects
+panel		lib		$(srcdir)	$(HEADER_DEPS)
+p_above		lib		$(srcdir)	$(HEADER_DEPS)
+p_below		lib		$(srcdir)	$(HEADER_DEPS)
+p_bottom	lib		$(srcdir)	$(HEADER_DEPS)
+p_delete	lib		$(srcdir)	$(HEADER_DEPS)
+p_hide		lib		$(srcdir)	$(HEADER_DEPS)
+p_hidden	lib		$(srcdir)	$(HEADER_DEPS)
+p_move		lib		$(srcdir)	$(HEADER_DEPS)
+p_new		lib		$(srcdir)	$(HEADER_DEPS)
+p_replace	lib		$(srcdir)	$(HEADER_DEPS)
+p_show		lib		$(srcdir)	$(HEADER_DEPS)
+p_top		lib		$(srcdir)	$(HEADER_DEPS)
+p_update	lib		$(srcdir)	$(HEADER_DEPS)
+p_user		lib		$(srcdir)	$(HEADER_DEPS)
+p_win		lib		$(srcdir)	$(HEADER_DEPS)
+
+# vile:makemode
diff --git a/panel/p_above.c b/panel/p_above.c
new file mode 100644
index 0000000..2a6fde5
--- /dev/null
+++ b/panel/p_above.c
@@ -0,0 +1,85 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2010,2012 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1995                    *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Juergen Pfeifer                         1997-1999,2008          *
+ ****************************************************************************/
+
+/* p_above.c
+ */
+#include "panel.priv.h"
+
+MODULE_ID("$Id: p_above.c,v 1.11 2020/05/24 01:40:20 anonymous.maarten Exp $")
+
+#if NCURSES_SP_FUNCS
+PANEL_EXPORT(PANEL *)
+ground_panel(SCREEN * sp)
+{
+  T((T_CALLED("ground_panel(%p)"), (void *)sp));
+  if (sp)
+    {
+      struct panelhook *ph = NCURSES_SP_NAME(_nc_panelhook) (sp);
+
+      if (_nc_bottom_panel)	/* this is the pseudo panel */
+	returnPanel(_nc_bottom_panel->above);
+      else
+	returnPanel(0);
+    }
+  else
+    {
+      if (0 == CURRENT_SCREEN)
+	returnPanel(0);
+      else
+	returnPanel(ground_panel(CURRENT_SCREEN));
+    }
+}
+#endif
+
+PANEL_EXPORT(PANEL *)
+panel_above(const PANEL * pan)
+{
+  PANEL *result;
+
+  T((T_CALLED("panel_above(%p)"), (const void *)pan));
+  if (pan)
+    result = pan->above;
+  else
+    {
+#if NCURSES_SP_FUNCS
+      result = ground_panel(CURRENT_SCREEN);
+#else
+      /* if top and bottom are equal, we have no or only the pseudo panel;
+         if not, we return the panel above the pseudo panel */
+      result = EMPTY_STACK()? (PANEL *) 0 : _nc_bottom_panel->above;
+#endif
+    }
+  returnPanel(result);
+}
diff --git a/panel/p_below.c b/panel/p_below.c
new file mode 100644
index 0000000..100393d
--- /dev/null
+++ b/panel/p_below.c
@@ -0,0 +1,86 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2010,2012 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1995                    *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Juergen Pfeifer                         1997-1999,2008          *
+ ****************************************************************************/
+
+/* p_below.c
+ */
+#include "panel.priv.h"
+
+MODULE_ID("$Id: p_below.c,v 1.11 2020/05/24 01:40:20 anonymous.maarten Exp $")
+
+#if NCURSES_SP_FUNCS
+PANEL_EXPORT(PANEL *)
+ceiling_panel(SCREEN * sp)
+{
+  T((T_CALLED("ceiling_panel(%p)"), (void *)sp));
+  if (sp)
+    {
+      struct panelhook *ph = NCURSES_SP_NAME(_nc_panelhook) (sp);
+
+      /* if top and bottom are equal, we have no or only the pseudo panel */
+      returnPanel(EMPTY_STACK()? (PANEL *) 0 : _nc_top_panel);
+    }
+  else
+    {
+      if (0 == CURRENT_SCREEN)
+	returnPanel(0);
+      else
+	returnPanel(ceiling_panel(CURRENT_SCREEN));
+    }
+}
+#endif
+
+PANEL_EXPORT(PANEL *)
+panel_below(const PANEL * pan)
+{
+  PANEL *result;
+
+  T((T_CALLED("panel_below(%p)"), (const void *)pan));
+  if (pan)
+    {
+      GetHook(pan);
+      /* we must not return the pseudo panel */
+      result = Is_Pseudo(pan->below) ? (PANEL *) 0 : pan->below;
+    }
+  else
+    {
+#if NCURSES_SP_FUNCS
+      result = ceiling_panel(CURRENT_SCREEN);
+#else
+      /* if top and bottom are equal, we have no or only the pseudo panel */
+      result = EMPTY_STACK()? (PANEL *) 0 : _nc_top_panel;
+#endif
+    }
+  returnPanel(result);
+}
diff --git a/panel/p_bottom.c b/panel/p_bottom.c
new file mode 100644
index 0000000..3ca9c77
--- /dev/null
+++ b/panel/p_bottom.c
@@ -0,0 +1,75 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2008,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1995                    *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Juergen Pfeifer                         1997-1999,2008          *
+ ****************************************************************************/
+
+/* p_bottom.c
+ * Place a panel on bottom of the stack; may already be in the stack
+ */
+#include "panel.priv.h"
+
+MODULE_ID("$Id: p_bottom.c,v 1.17 2021/06/17 21:20:30 tom Exp $")
+
+PANEL_EXPORT(int)
+bottom_panel(PANEL * pan)
+{
+  int err = OK;
+
+  T((T_CALLED("bottom_panel(%p)"), (void *)pan));
+  if (pan)
+    {
+      GetHook(pan);
+      if (!Is_Bottom(pan))
+	{
+
+	  dBug(("--> bottom_panel %s", USER_PTR(pan->user, 1)));
+
+	  HIDE_PANEL(pan, err, OK);
+	  assert(_nc_bottom_panel == _nc_stdscr_pseudo_panel);
+
+	  dStack("<lb%d>", 1, pan);
+
+	  pan->below = _nc_bottom_panel;
+	  pan->above = _nc_bottom_panel->above;
+	  if (pan->above)
+	    pan->above->below = pan;
+	  _nc_bottom_panel->above = pan;
+
+	  dStack("<lb%d>", 9, pan);
+	}
+    }
+  else
+    err = ERR;
+
+  returnCode(err);
+}
diff --git a/panel/p_delete.c b/panel/p_delete.c
new file mode 100644
index 0000000..da3dcdf
--- /dev/null
+++ b/panel/p_delete.c
@@ -0,0 +1,61 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2009,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1995                    *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Juergen Pfeifer                         1999,2008               *
+ ****************************************************************************/
+
+/* p_delete.c
+ * Remove a panel from stack, if in it, and free struct
+ */
+#include "panel.priv.h"
+
+MODULE_ID("$Id: p_delete.c,v 1.17 2020/12/26 18:25:34 tom Exp $")
+
+PANEL_EXPORT(int)
+del_panel(PANEL *pan)
+{
+  int err = OK;
+
+  T((T_CALLED("del_panel(%p)"), (void *)pan));
+  if (pan)
+    {
+      GetHook(pan);
+      HIDE_PANEL(pan, err, OK);
+      dBug(("...discard ptr=%s", USER_PTR(pan->user, 1)));
+      dBug(("...deleted pan=%p", (void *)pan));
+      free((void *)pan);
+    }
+  else
+    err = ERR;
+
+  returnCode(err);
+}
diff --git a/panel/p_hidden.c b/panel/p_hidden.c
new file mode 100644
index 0000000..43057fa
--- /dev/null
+++ b/panel/p_hidden.c
@@ -0,0 +1,55 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2009,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1995                    *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Juergen Pfeifer                         1997-1999,2008          *
+ ****************************************************************************/
+
+/* p_hidden.c
+ * Test whether or not panel is hidden
+ */
+#include "panel.priv.h"
+
+MODULE_ID("$Id: p_hidden.c,v 1.11 2020/05/24 01:40:20 anonymous.maarten Exp $")
+
+PANEL_EXPORT(int)
+panel_hidden(const PANEL * pan)
+{
+  int rc = ERR;
+
+  T((T_CALLED("panel_hidden(%p)"), (const void *)pan));
+  if (pan)
+    {
+      GetHook(pan);
+      rc = (IS_LINKED(pan) ? FALSE : TRUE);
+    }
+  returnCode(rc);
+}
diff --git a/panel/p_hide.c b/panel/p_hide.c
new file mode 100644
index 0000000..6a372ac
--- /dev/null
+++ b/panel/p_hide.c
@@ -0,0 +1,63 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2009,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1995                    *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ ****************************************************************************/
+
+/* p_hide.c
+ * Remove a panel from the stack
+ */
+#include "panel.priv.h"
+
+MODULE_ID("$Id: p_hide.c,v 1.14 2020/09/26 18:02:35 tom Exp $")
+
+PANEL_EXPORT(int)
+hide_panel(register PANEL * pan)
+{
+  int err = ERR;
+
+  T((T_CALLED("hide_panel(%p)"), (void *)pan));
+
+  if (pan)
+    {
+      GetHook(pan);
+
+      dBug(("--> hide_panel %s", USER_PTR(pan->user, 1)));
+      dStack("<u%d>", 1, pan);
+
+      HIDE_PANEL(pan, err, ERR);
+
+      err = OK;
+
+      dStack("<u%d>", 9, pan);
+    }
+  returnCode(err);
+}
diff --git a/panel/p_move.c b/panel/p_move.c
new file mode 100644
index 0000000..7ff6fa7
--- /dev/null
+++ b/panel/p_move.c
@@ -0,0 +1,61 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2008,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1995                    *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Juergen Pfeifer                         1997-1999,2009          *
+ ****************************************************************************/
+
+/* p_move.c
+ * Move a panel to a new location
+ */
+#include "panel.priv.h"
+
+MODULE_ID("$Id: p_move.c,v 1.13 2020/05/24 01:40:20 anonymous.maarten Exp $")
+
+PANEL_EXPORT(int)
+move_panel(PANEL * pan, int starty, int startx)
+{
+  int rc = ERR;
+
+  T((T_CALLED("move_panel(%p,%d,%d)"), (void *)pan, starty, startx));
+
+  if (pan)
+    {
+      GetHook(pan);
+      if (IS_LINKED(pan))
+	{
+	  Touchpan(pan);
+	  PANEL_UPDATE(pan, (PANEL *) 0);
+	}
+      rc = mvwin(pan->win, starty, startx);
+    }
+  returnCode(rc);
+}
diff --git a/panel/p_new.c b/panel/p_new.c
new file mode 100644
index 0000000..cf11640
--- /dev/null
+++ b/panel/p_new.c
@@ -0,0 +1,129 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2009,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1995                    *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Juergen Pfeifer                         1997-1999               *
+ *     and: Thomas E. Dickey                        2000-on                 *
+ ****************************************************************************/
+
+/* p_new.c
+ * Creation of a new panel
+ */
+#include "panel.priv.h"
+
+MODULE_ID("$Id: p_new.c,v 1.24 2021/10/23 15:12:06 tom Exp $")
+
+#ifdef TRACE
+static char *stdscr_id;
+static char *new_id;
+
+static PANEL *
+AllocPanel(const char *name)
+{
+  PANEL *result = typeMalloc(PANEL, 1);
+
+  _tracef("create :%s %p", name, (void *)result);
+  return result;
+}
+#define InitUser(name) \
+	if (!name ## _id) \
+	    name ## _id = strdup(#name); \
+	pan->user = name ## _id; \
+	_tracef("create :user_ptr %p", pan->user)
+#else
+#define AllocPanel(name) typeMalloc(PANEL, 1)
+#define InitUser(name) \
+	  pan->user = (void *)0
+#endif
+
+/*+-------------------------------------------------------------------------
+  Get root (i.e. stdscr's) panel.
+  Establish the pseudo panel for stdscr if necessary.
+--------------------------------------------------------------------------*/
+static PANEL *
+root_panel(NCURSES_SP_DCL0)
+{
+#if NCURSES_SP_FUNCS
+  struct panelhook *ph = NCURSES_SP_NAME(_nc_panelhook) (sp);
+
+#elif NO_LEAKS
+  struct panelhook *ph = _nc_panelhook();
+#endif
+
+  if (_nc_stdscr_pseudo_panel == (PANEL *)0)
+    {
+
+      assert(SP_PARM && SP_PARM->_stdscr && !_nc_bottom_panel && !_nc_top_panel);
+#if NO_LEAKS
+      ph->destroy = del_panel;
+#endif
+      _nc_stdscr_pseudo_panel = AllocPanel("root_panel");
+      if (_nc_stdscr_pseudo_panel != 0)
+	{
+	  PANEL *pan = _nc_stdscr_pseudo_panel;
+	  WINDOW *win = SP_PARM->_stdscr;
+
+	  pan->win = win;
+	  pan->below = (PANEL *)0;
+	  pan->above = (PANEL *)0;
+	  InitUser(stdscr);
+	  _nc_bottom_panel = _nc_top_panel = pan;
+	}
+    }
+  return _nc_stdscr_pseudo_panel;
+}
+
+PANEL_EXPORT(PANEL *)
+new_panel(WINDOW *win)
+{
+  PANEL *pan = (PANEL *)0;
+
+  GetWindowHook(win);
+
+  T((T_CALLED("new_panel(%p)"), (void *)win));
+
+  if (!win)
+    returnPanel(pan);
+
+  if (!_nc_stdscr_pseudo_panel)
+    (void)root_panel(NCURSES_SP_ARG);
+  assert(_nc_stdscr_pseudo_panel);
+
+  if ((pan = AllocPanel("new_panel")) != NULL)
+    {
+      pan->win = win;
+      pan->above = (PANEL *)0;
+      pan->below = (PANEL *)0;
+      InitUser(new);
+      (void)show_panel(pan);
+    }
+  returnPanel(pan);
+}
diff --git a/panel/p_replace.c b/panel/p_replace.c
new file mode 100644
index 0000000..a2d56ae
--- /dev/null
+++ b/panel/p_replace.c
@@ -0,0 +1,61 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2009,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1995                    *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ ****************************************************************************/
+
+/* p_replace.c
+ * Replace a panels window.
+ */
+#include "panel.priv.h"
+
+MODULE_ID("$Id: p_replace.c,v 1.13 2020/05/24 01:40:20 anonymous.maarten Exp $")
+
+PANEL_EXPORT(int)
+replace_panel(PANEL * pan, WINDOW *win)
+{
+  int rc = ERR;
+
+  T((T_CALLED("replace_panel(%p,%p)"), (void *)pan, (void *)win));
+
+  if (pan)
+    {
+      GetHook(pan);
+      if (IS_LINKED(pan))
+	{
+	  Touchpan(pan);
+	  PANEL_UPDATE(pan, (PANEL *) 0);
+	}
+      pan->win = win;
+      rc = OK;
+    }
+  returnCode(rc);
+}
diff --git a/panel/p_show.c b/panel/p_show.c
new file mode 100644
index 0000000..3503bec
--- /dev/null
+++ b/panel/p_show.c
@@ -0,0 +1,73 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2009,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1995                    *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ ****************************************************************************/
+
+/* p_show.c
+ * Place a panel on top of the stack; may already be in the stack
+ */
+#include "panel.priv.h"
+
+MODULE_ID("$Id: p_show.c,v 1.17 2021/06/17 21:20:30 tom Exp $")
+
+PANEL_EXPORT(int)
+show_panel(PANEL * pan)
+{
+  int err = ERR;
+
+  T((T_CALLED("show_panel(%p)"), (void *)pan));
+
+  if (pan)
+    {
+      GetHook(pan);
+
+      if (Is_Top(pan))
+	returnCode(OK);
+
+      dBug(("--> show_panel %s", USER_PTR(pan->user, 1)));
+
+      HIDE_PANEL(pan, err, OK);
+
+      dStack("<lt%d>", 1, pan);
+      assert(_nc_bottom_panel == _nc_stdscr_pseudo_panel);
+
+      _nc_top_panel->above = pan;
+      pan->below = _nc_top_panel;
+      pan->above = (PANEL *) 0;
+      _nc_top_panel = pan;
+
+      err = OK;
+
+      dStack("<lt%d>", 9, pan);
+    }
+  returnCode(err);
+}
diff --git a/panel/p_top.c b/panel/p_top.c
new file mode 100644
index 0000000..17abd76
--- /dev/null
+++ b/panel/p_top.c
@@ -0,0 +1,47 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2005,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1995                    *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ ****************************************************************************/
+
+/* p_top.c
+ * Place a panel on top of the stack.
+ */
+#include "panel.priv.h"
+
+MODULE_ID("$Id: p_top.c,v 1.8 2020/05/24 01:40:20 anonymous.maarten Exp $")
+
+PANEL_EXPORT(int)
+top_panel(PANEL * pan)
+{
+  T((T_CALLED("top_panel(%p)"), (void *)pan));
+  returnCode(show_panel(pan));
+}
diff --git a/panel/p_update.c b/panel/p_update.c
new file mode 100644
index 0000000..4021296
--- /dev/null
+++ b/panel/p_update.c
@@ -0,0 +1,79 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2009,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1995                    *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Juergen Pfeifer                         1997-1999,2008          *
+ ****************************************************************************/
+
+/* p_update.c
+ * wnoutrefresh windows in an orderly fashion
+ */
+#include "panel.priv.h"
+
+MODULE_ID("$Id: p_update.c,v 1.13 2020/05/24 01:40:20 anonymous.maarten Exp $")
+
+PANEL_EXPORT(void)
+NCURSES_SP_NAME(update_panels) (NCURSES_SP_DCL0)
+{
+  PANEL *pan;
+
+  T((T_CALLED("update_panels(%p)"), (void *)SP_PARM));
+  dBug(("--> update_panels"));
+
+  if (SP_PARM)
+    {
+      GetScreenHook(SP_PARM);
+
+      pan = _nc_bottom_panel;
+      while (pan && pan->above)
+	{
+	  PANEL_UPDATE(pan, pan->above);
+	  pan = pan->above;
+	}
+
+      pan = _nc_bottom_panel;
+      while (pan)
+	{
+	  Wnoutrefresh(pan);
+	  pan = pan->above;
+	}
+    }
+
+  returnVoid;
+}
+
+#if NCURSES_SP_FUNCS
+PANEL_EXPORT(void)
+update_panels(void)
+{
+  NCURSES_SP_NAME(update_panels) (CURRENT_SCREEN);
+}
+#endif
diff --git a/panel/p_user.c b/panel/p_user.c
new file mode 100644
index 0000000..8d65097
--- /dev/null
+++ b/panel/p_user.c
@@ -0,0 +1,57 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2005,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1995                    *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ ****************************************************************************/
+
+/* p_user.c
+ * Set/Get panels user pointer
+ */
+#include "panel.priv.h"
+
+MODULE_ID("$Id: p_user.c,v 1.11 2021/06/17 21:20:30 tom Exp $")
+
+PANEL_EXPORT(int)
+set_panel_userptr(PANEL * pan, NCURSES_CONST void *uptr)
+{
+  T((T_CALLED("set_panel_userptr(%p,%p)"), (void *)pan, (NCURSES_CONST void *)uptr));
+  if (!pan)
+    returnCode(ERR);
+  pan->user = uptr;
+  returnCode(OK);
+}
+
+PANEL_EXPORT(NCURSES_CONST void *)
+panel_userptr(const PANEL * pan)
+{
+  T((T_CALLED("panel_userptr(%p)"), (const void *)pan));
+  returnCVoidPtr(pan ? pan->user : (NCURSES_CONST void *)0);
+}
diff --git a/panel/p_win.c b/panel/p_win.c
new file mode 100644
index 0000000..d188988
--- /dev/null
+++ b/panel/p_win.c
@@ -0,0 +1,47 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2005,2010 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1995                    *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ ****************************************************************************/
+
+/* p_win.c
+ * Return a panels window.
+ */
+#include "panel.priv.h"
+
+MODULE_ID("$Id: p_win.c,v 1.8 2020/05/24 01:40:20 anonymous.maarten Exp $")
+
+PANEL_EXPORT(WINDOW *)
+panel_window(const PANEL * pan)
+{
+  T((T_CALLED("panel_window(%p)"), (const void *)pan));
+  returnWin(pan ? pan->win : (WINDOW *)0);
+}
diff --git a/panel/panel.c b/panel/panel.c
new file mode 100644
index 0000000..1b2d6e8
--- /dev/null
+++ b/panel/panel.c
@@ -0,0 +1,162 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2010,2012 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1995                    *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Juergen Pfeifer                         1996-1999,2008          *
+ *     and: Thomas E. Dickey                                                *
+ ****************************************************************************/
+
+/* panel.c -- implementation of panels library, some core routines */
+#include "panel.priv.h"
+
+MODULE_ID("$Id: panel.c,v 1.30 2020/09/26 18:05:17 tom Exp $")
+
+/*+-------------------------------------------------------------------------
+	_nc_retrace_panel (pan)
+--------------------------------------------------------------------------*/
+#ifdef TRACE
+PANEL_EXPORT(PANEL *)
+_nc_retrace_panel(PANEL * pan)
+{
+  T((T_RETURN("%p"), (void *)pan));
+  return pan;
+}
+#endif
+
+/*+-------------------------------------------------------------------------
+	_nc_my_visbuf(ptr)
+--------------------------------------------------------------------------*/
+#ifdef TRACE
+#ifndef TRACE_TXT
+PANEL_EXPORT(const char *)
+_nc_my_visbuf(const void *ptr, int n)
+{
+  char temp[32];
+
+  if (ptr != 0)
+    _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) "%p", ptr);
+  else
+    _nc_STRCPY(temp, "<null>", sizeof(temp));
+  return _nc_visbuf2(n, temp);
+}
+#endif
+#endif
+
+/*+-------------------------------------------------------------------------
+	dPanel(text,pan)
+--------------------------------------------------------------------------*/
+#ifdef TRACE
+PANEL_EXPORT(void)
+_nc_dPanel(const char *text, const PANEL * pan)
+{
+  _tracef("%s id=%s b=%s a=%s y=%d x=%d",
+	  text, USER_PTR(pan->user, 1),
+	  (pan->below) ? USER_PTR(pan->below->user, 2) : "--",
+	  (pan->above) ? USER_PTR(pan->above->user, 3) : "--",
+	  PSTARTY(pan), PSTARTX(pan));
+}
+#endif
+
+/*+-------------------------------------------------------------------------
+	dStack(fmt,num,pan)
+--------------------------------------------------------------------------*/
+#ifdef TRACE
+PANEL_EXPORT(void)
+_nc_dStack(const char *fmt, int num, const PANEL * pan)
+{
+  char s80[80];
+
+  GetPanelHook(pan);
+
+  _nc_SPRINTF(s80, _nc_SLIMIT(sizeof(s80)) fmt, num, pan);
+  _tracef("%s b=%s t=%s", s80,
+	  (_nc_bottom_panel) ? USER_PTR(_nc_bottom_panel->user, 1) : "--",
+	  (_nc_top_panel) ? USER_PTR(_nc_top_panel->user, 2) : "--");
+  if (pan)
+    _tracef("pan id=%s", USER_PTR(pan->user, 1));
+  pan = _nc_bottom_panel;
+  while (pan)
+    {
+      dPanel("stk", pan);
+      pan = pan->above;
+    }
+}
+#endif
+
+/*+-------------------------------------------------------------------------
+	Wnoutrefresh(pan) - debugging hook for wnoutrefresh
+--------------------------------------------------------------------------*/
+#ifdef TRACE
+PANEL_EXPORT(void)
+_nc_Wnoutrefresh(const PANEL * pan)
+{
+  dPanel("wnoutrefresh", pan);
+  wnoutrefresh(pan->win);
+}
+#endif
+
+/*+-------------------------------------------------------------------------
+	Touchpan(pan)
+--------------------------------------------------------------------------*/
+#ifdef TRACE
+PANEL_EXPORT(void)
+_nc_Touchpan(const PANEL * pan)
+{
+  dPanel("Touchpan", pan);
+  touchwin(pan->win);
+}
+#endif
+
+/*+-------------------------------------------------------------------------
+	Touchline(pan,start,count)
+--------------------------------------------------------------------------*/
+#ifdef TRACE
+PANEL_EXPORT(void)
+_nc_Touchline(const PANEL * pan, int start, int count)
+{
+  char s80[80];
+
+  _nc_SPRINTF(s80, _nc_SLIMIT(sizeof(s80)) "Touchline s=%d c=%d", start, count);
+  dPanel(s80, pan);
+  touchline(pan->win, start, count);
+}
+#endif
+
+#ifndef TRACE
+#  ifndef __GNUC__
+     /* Some C compilers need something defined in a source file */
+extern void _nc_dummy_panel(void);
+void
+_nc_dummy_panel(void)
+{
+}
+#  endif
+#endif
diff --git a/panel/panel.h b/panel/panel.h
new file mode 100644
index 0000000..62acc8f
--- /dev/null
+++ b/panel/panel.h
@@ -0,0 +1,100 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2009,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1995                    *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Juergen Pfeifer                         1996-1999,2008          *
+ ****************************************************************************/
+
+/* $Id: panel.h,v 1.14 2020/07/04 20:38:43 tom Exp $ */
+
+/* panel.h -- interface file for panels library */
+
+#ifndef NCURSES_PANEL_H_incl
+#define NCURSES_PANEL_H_incl 1
+
+#include <curses.h>
+
+typedef struct panel
+#if !NCURSES_OPAQUE_PANEL
+{
+  WINDOW *win;
+  struct panel *below;
+  struct panel *above;
+  NCURSES_CONST void *user;
+}
+#endif /* !NCURSES_OPAQUE_PANEL */
+PANEL;
+
+#if	defined(__cplusplus)
+extern "C" {
+#endif
+
+#if defined(BUILDING_PANEL)
+# define PANEL_IMPEXP NCURSES_EXPORT_GENERAL_EXPORT
+#else
+# define PANEL_IMPEXP NCURSES_EXPORT_GENERAL_IMPORT
+#endif
+
+#define PANEL_WRAPPED_VAR(type,name) extern PANEL_IMPEXP type NCURSES_PUBLIC_VAR(name)(void)
+
+#define PANEL_EXPORT(type) PANEL_IMPEXP type NCURSES_API
+#define PANEL_EXPORT_VAR(type) PANEL_IMPEXP type
+
+extern PANEL_EXPORT(WINDOW*) panel_window (const PANEL *);
+extern PANEL_EXPORT(void)    update_panels (void);
+extern PANEL_EXPORT(int)     hide_panel (PANEL *);
+extern PANEL_EXPORT(int)     show_panel (PANEL *);
+extern PANEL_EXPORT(int)     del_panel (PANEL *);
+extern PANEL_EXPORT(int)     top_panel (PANEL *);
+extern PANEL_EXPORT(int)     bottom_panel (PANEL *);
+extern PANEL_EXPORT(PANEL*)  new_panel (WINDOW *);
+extern PANEL_EXPORT(PANEL*)  panel_above (const PANEL *);
+extern PANEL_EXPORT(PANEL*)  panel_below (const PANEL *);
+extern PANEL_EXPORT(int)     set_panel_userptr (PANEL *, NCURSES_CONST void *);
+extern PANEL_EXPORT(NCURSES_CONST void*) panel_userptr (const PANEL *);
+extern PANEL_EXPORT(int)     move_panel (PANEL *, int, int);
+extern PANEL_EXPORT(int)     replace_panel (PANEL *,WINDOW *);
+extern PANEL_EXPORT(int)     panel_hidden (const PANEL *);
+
+#if NCURSES_SP_FUNCS
+extern PANEL_EXPORT(PANEL *) ground_panel(SCREEN *);
+extern PANEL_EXPORT(PANEL *) ceiling_panel(SCREEN *);
+
+extern PANEL_EXPORT(void)    NCURSES_SP_NAME(update_panels) (SCREEN*);
+#endif
+
+#if	defined(__cplusplus)
+}
+#endif
+
+#endif /* NCURSES_PANEL_H_incl */
+
+/* end of panel.h */
diff --git a/panel/panel.priv.h b/panel/panel.priv.h
new file mode 100644
index 0000000..029a4f3
--- /dev/null
+++ b/panel/panel.priv.h
@@ -0,0 +1,212 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998-2014,2017 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: panel.priv.h,v 1.30 2020/09/26 18:05:32 tom Exp $ */
+
+#ifndef NCURSES_PANEL_PRIV_H
+#define NCURSES_PANEL_PRIV_H 1
+/* *INDENT-OFF* */
+
+#if HAVE_CONFIG_H
+#  include <ncurses_cfg.h>
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+struct screen;              /* forward declaration */
+
+#include "curses.priv.h"    /* includes nc_panel.h */
+
+#define NCURSES_OPAQUE_PANEL 0
+
+#include "panel.h"
+
+#ifdef TRACE
+   extern PANEL_EXPORT(const char *) _nc_my_visbuf (const void *, int);
+#  ifdef TRACE_TXT
+#    define USER_PTR(ptr,n) _nc_visbuf2(n, (const char *)ptr)
+#  else
+#    define USER_PTR(ptr,n) _nc_my_visbuf((const char *)ptr, n)
+#  endif
+
+#  define returnPanel(code)	TRACE_RETURN1(code,panel)
+
+   extern PANEL_EXPORT(PANEL *) _nc_retrace_panel (PANEL *);
+   extern PANEL_EXPORT(void) _nc_dPanel (const char*, const PANEL*);
+   extern PANEL_EXPORT(void) _nc_dStack (const char*, int, const PANEL*);
+   extern PANEL_EXPORT(void) _nc_Wnoutrefresh (const PANEL*);
+   extern PANEL_EXPORT(void) _nc_Touchpan (const PANEL*);
+   extern PANEL_EXPORT(void) _nc_Touchline (const PANEL*, int, int);
+
+#  define dBug(x) _tracef x
+#  define dPanel(text,pan) _nc_dPanel(text,pan)
+#  define dStack(fmt,num,pan) _nc_dStack(fmt,num,pan)
+#  define Wnoutrefresh(pan) _nc_Wnoutrefresh(pan)
+#  define Touchpan(pan) _nc_Touchpan(pan)
+#  define Touchline(pan,start,count) _nc_Touchline(pan,start,count)
+#else /* !TRACE */
+#  define returnPanel(code)	return code
+#  define dBug(x)
+#  define dPanel(text,pan)
+#  define dStack(fmt,num,pan)
+#  define Wnoutrefresh(pan) wnoutrefresh((pan)->win)
+#  define Touchpan(pan) touchwin((pan)->win)
+#  define Touchline(pan,start,count) touchline((pan)->win,start,count)
+#endif
+
+#if NCURSES_SP_FUNCS
+#define GetScreenHook(sp) \
+			struct panelhook* ph = NCURSES_SP_NAME(_nc_panelhook)(sp)
+#define GetPanelHook(pan) \
+			GetScreenHook(pan ? _nc_screen_of((pan)->win) : 0)
+#define GetWindowHook(win) \
+			SCREEN* sp = _nc_screen_of(win); \
+			GetScreenHook(sp)
+#define GetHook(pan)	SCREEN* sp = _nc_screen_of(pan->win); \
+			GetScreenHook(sp)
+
+#define _nc_stdscr_pseudo_panel ((ph)->stdscr_pseudo_panel)
+#define _nc_top_panel           ((ph)->top_panel)
+#define _nc_bottom_panel        ((ph)->bottom_panel)
+
+#else	/* !NCURSES_SP_FUNCS */
+
+#define GetScreenHook(sp) /* nothing */
+#define GetPanelHook(pan) /* nothing */
+#define GetWindowHook(win) /* nothing */
+#define GetHook(pan) /* nothing */
+
+#define _nc_stdscr_pseudo_panel _nc_panelhook()->stdscr_pseudo_panel
+#define _nc_top_panel           _nc_panelhook()->top_panel
+#define _nc_bottom_panel        _nc_panelhook()->bottom_panel
+
+#endif	/* NCURSES_SP_FUNCS */
+
+#define EMPTY_STACK() (_nc_top_panel == _nc_bottom_panel)
+#define Is_Bottom(p)  (((p) != (PANEL*)0) && !EMPTY_STACK() && (_nc_bottom_panel->above == (p)))
+#define Is_Top(p)     (((p) != (PANEL*)0) && !EMPTY_STACK() && (_nc_top_panel == (p)))
+#define Is_Pseudo(p)  (((p) != (PANEL*)0) && ((p) == _nc_bottom_panel))
+
+/*+-------------------------------------------------------------------------
+	IS_LINKED(pan) - check to see if panel is in the stack
+--------------------------------------------------------------------------*/
+/* This works! The only case where it would fail is, when the list has
+   only one element. But this could only be the pseudo panel at the bottom */
+#define IS_LINKED(p) (((p)->above || (p)->below ||((p)==_nc_bottom_panel)) ? TRUE : FALSE)
+
+#define PSTARTX(pan) ((pan)->win->_begx)
+#define PENDX(pan)   ((pan)->win->_begx + getmaxx((pan)->win) - 1)
+#define PSTARTY(pan) ((pan)->win->_begy)
+#define PENDY(pan)   ((pan)->win->_begy + getmaxy((pan)->win) - 1)
+
+/*+-------------------------------------------------------------------------
+	PANELS_OVERLAPPED(pan1,pan2) - check panel overlapped
+---------------------------------------------------------------------------*/
+#define PANELS_OVERLAPPED(pan1,pan2) \
+(( !(pan1) || !(pan2) || \
+       PSTARTY(pan1) > PENDY(pan2) || PENDY(pan1) < PSTARTY(pan2) ||\
+       PSTARTX(pan1) > PENDX(pan2) || PENDX(pan1) < PSTARTX(pan2) ) \
+     ? FALSE : TRUE)
+
+
+/*+-------------------------------------------------------------------------
+	Compute the intersection rectangle of two overlapping rectangles
+---------------------------------------------------------------------------*/
+#define COMPUTE_INTERSECTION(pan1,pan2,ix1,ix2,iy1,iy2)\
+   ix1 = (PSTARTX(pan1) < PSTARTX(pan2)) ? PSTARTX(pan2) : PSTARTX(pan1);\
+   ix2 = (PENDX(pan1)   < PENDX(pan2))   ? PENDX(pan1)   : PENDX(pan2);\
+   iy1 = (PSTARTY(pan1) < PSTARTY(pan2)) ? PSTARTY(pan2) : PSTARTY(pan1);\
+   iy2 = (PENDY(pan1)   < PENDY(pan2))   ? PENDY(pan1)   : PENDY(pan2);\
+   assert((ix1<=ix2) && (iy1<=iy2))
+
+
+/*+-------------------------------------------------------------------------
+	Walk through the panel stack starting at the given location and
+        check for intersections; overlapping panels are "touched", so they
+        are incrementally overwriting cells that should be hidden.
+        If the "touch" flag is set, the panel gets touched before it is
+        updated.
+---------------------------------------------------------------------------*/
+#define PANEL_UPDATE(pan,panstart)\
+{  PANEL* pan2 = ((panstart) ? (panstart) : _nc_bottom_panel);\
+   while(pan2 && pan2->win) {\
+      if ((pan2 != pan) && PANELS_OVERLAPPED(pan,pan2)) {\
+        int y, ix1, ix2, iy1, iy2;\
+        COMPUTE_INTERSECTION(pan, pan2, ix1, ix2, iy1, iy2);\
+	for(y = iy1; y <= iy2; y++) {\
+	  if (is_linetouched(pan->win,y - PSTARTY(pan))) {\
+            struct ldat* line = &(pan2->win->_line[y - PSTARTY(pan2)]);\
+            CHANGED_RANGE(line, ix1 - PSTARTX(pan2), ix2 - PSTARTX(pan2));\
+          }\
+	}\
+      }\
+      pan2 = pan2->above;\
+   }\
+}
+
+/*+-------------------------------------------------------------------------
+	Remove panel from stack.
+---------------------------------------------------------------------------*/
+#define PANEL_UNLINK(pan,err) \
+{  err = ERR;\
+   if (pan) {\
+     if (IS_LINKED(pan)) {\
+       if ((pan)->below)\
+         (pan)->below->above = (pan)->above;\
+       if ((pan)->above)\
+         (pan)->above->below = (pan)->below;\
+       if ((pan) == _nc_bottom_panel) \
+         _nc_bottom_panel = (pan)->above;\
+       if ((pan) == _nc_top_panel) \
+         _nc_top_panel = (pan)->below;\
+       err = OK;\
+     }\
+     (pan)->above = (pan)->below = (PANEL*)0;\
+   }\
+}
+
+#define HIDE_PANEL(pan,err,err_if_unlinked)\
+  if (IS_LINKED(pan)) {\
+    Touchpan(pan);\
+    PANEL_UPDATE(pan,(PANEL*)0);\
+    PANEL_UNLINK(pan,err);\
+  } \
+  else {\
+      err = err_if_unlinked;\
+  }
+
+#if NCURSES_SP_FUNCS
+/* These may become later renamed and part of panel.h and the public API */
+extern PANEL_EXPORT(void) NCURSES_SP_NAME(_nc_update_panels)(SCREEN*);
+#endif
+/* *INDENT-ON* */
+
+#endif /* NCURSES_PANEL_PRIV_H */
diff --git a/progs/MKtermsort.sh b/progs/MKtermsort.sh
new file mode 100755
index 0000000..4e58c50
--- /dev/null
+++ b/progs/MKtermsort.sh
@@ -0,0 +1,186 @@
+#!/bin/sh
+# $Id: MKtermsort.sh,v 1.17 2022/02/05 20:39:41 tom Exp $
+#
+# MKtermsort.sh -- generate indirection vectors for the various sort methods
+#
+##############################################################################
+# Copyright 2020-2021,2022 Thomas E. Dickey                                  #
+# Copyright 1998-2015,2017 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.                                                             #
+##############################################################################
+#
+# The output of this script is C source for nine arrays that list three sort
+# orders for each of the three different classes of terminfo capabilities.
+#
+# keep the order independent of locale:
+if test "${LANGUAGE+set}"    = set; then LANGUAGE=C;    export LANGUAGE;    fi
+if test "${LANG+set}"        = set; then LANG=C;        export LANG;        fi
+if test "${LC_ALL+set}"      = set; then LC_ALL=C;      export LC_ALL;      fi
+if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+if test "${LC_CTYPE+set}"    = set; then LC_CTYPE=C;    export LC_CTYPE;    fi
+if test "${LC_COLLATE+set}"  = set; then LC_COLLATE=C;  export LC_COLLATE;  fi
+#
+AWK=${1-awk}
+DATA=${2-../include/Caps}
+
+data=data$$
+trap 'rm -f $data; exit 1' 1 2 3 15
+sed -e 's/[	][	]*/	/g' < "$DATA" >$data
+DATA=$data
+
+cat <<EOF
+/*
+ * termsort.h --- sort order arrays for use by infocmp.
+ *
+ * Note: this file is generated using MKtermsort.sh, do not edit by hand.
+ */
+#ifndef _TERMSORT_H
+#define _TERMSORT_H 1
+#include <curses.h>
+
+#ifndef DUMP_ENTRY_H
+typedef unsigned PredType;
+typedef unsigned PredIdx;
+#endif
+
+EOF
+
+echo "static const PredIdx bool_terminfo_sort[] = {";
+$AWK <$DATA '
+BEGIN           {i = 0;}
+/^#/            {next;}
+$3 == "bool"    {printf("%s\t%d\n", $2, i++);}
+' | sort | $AWK '{print "\t", $2, ",\t/* ", $1, " */";}';
+echo "};";
+echo "";
+
+echo "static const PredIdx num_terminfo_sort[] = {";
+$AWK <$DATA '
+BEGIN           {i = 0;}
+/^#/            {next;}
+$3 == "num"     {printf("%s\t%d\n", $2, i++);}
+' | sort | $AWK '{print "\t", $2, ",\t/* ", $1, " */";}';
+echo "};";
+echo "";
+
+echo "static const PredIdx str_terminfo_sort[] = {";
+$AWK <$DATA '
+BEGIN           {i = 0;}
+/^#/            {next;}
+$3 == "str"     {printf("%s\t%d\n", $2, i++);}
+' | sort | $AWK '{print "\t", $2, ",\t/* ", $1, " */";}';
+echo "};";
+echo "";
+
+echo "static const PredIdx bool_variable_sort[] = {";
+$AWK <$DATA '
+BEGIN           {i = 0;}
+/^#/            {next;}
+$3 == "bool"    {printf("%s\t%d\n", $1, i++);}
+' | sort | $AWK '{print "\t", $2, ",\t/* ", $1, " */";}';
+echo "};";
+echo "";
+
+echo "static const PredIdx num_variable_sort[] = {";
+$AWK <$DATA '
+BEGIN           {i = 0;}
+/^#/            {next;}
+$3 == "num"     {printf("%s\t%d\n", $1, i++);}
+' | sort | $AWK '{print "\t", $2, ",\t/* ", $1, " */";}';
+echo "};";
+echo "";
+
+echo "static const PredIdx str_variable_sort[] = {";
+$AWK <$DATA '
+BEGIN           {i = 0;}
+/^#/            {next;}
+$3 == "str"     {printf("%s\t%d\n", $1, i++);}
+' | sort | $AWK '{print "\t", $2, ",\t/* ", $1, " */";}';
+echo "};";
+echo "";
+
+echo "static const PredIdx bool_termcap_sort[] = {";
+$AWK <$DATA '
+BEGIN           {i = 0;}
+/^#/            {next;}
+$3 == "bool"    {printf("%s\t%d\n", $4, i++);}
+' | sort | $AWK '{print "\t", $2, ",\t/* ", $1, " */";}';
+echo "};";
+echo "";
+
+echo "static const PredIdx num_termcap_sort[] = {";
+$AWK <$DATA '
+BEGIN           {i = 0;}
+/^#/            {next;}
+$3 == "num"     {printf("%s\t%d\n", $4, i++);}
+' | sort | $AWK '{print "\t", $2, ",\t/* ", $1, " */";}';
+echo "};";
+echo "";
+
+echo "static const PredIdx str_termcap_sort[] = {";
+$AWK <$DATA '
+BEGIN           {i = 0;}
+/^#/            {next;}
+$3 == "str"     {printf("%s\t%d\n", $4, i++);}
+' | sort | $AWK '{print "\t", $2, ",\t/* ", $1, " */";}';
+echo "};";
+echo "";
+
+echo "static const bool bool_from_termcap[] = {";
+$AWK <$DATA '
+BEGIN { count = 0; valid = 0; }
+$3 == "bool" && substr($7, 1, 1) == "-"       {print "\tFALSE,\t/* ", $2, " */"; count++; }
+$3 == "bool" && substr($7, 1, 1) == "Y"       {print "\tTRUE,\t/* ", $2, " */"; valid = count++; }
+END { printf "#define OK_bool_from_termcap %d\n", valid; }
+'
+echo "};";
+echo "";
+
+echo "static const bool num_from_termcap[] = {";
+$AWK <$DATA '
+BEGIN { count = 0; valid = 0; }
+$3 == "num" && substr($7, 1, 1) == "-"        {print "\tFALSE,\t/* ", $2, " */"; count++; }
+$3 == "num" && substr($7, 1, 1) == "Y"        {print "\tTRUE,\t/* ", $2, " */"; valid = count++; }
+END { printf "#define OK_num_from_termcap %d\n", valid; }
+'
+echo "};";
+echo "";
+
+echo "static const bool str_from_termcap[] = {";
+$AWK <$DATA '
+BEGIN { count = 0; valid = 0; }
+$3 == "str" && substr($7, 1, 1) == "-"        {print "\tFALSE,\t/* ", $2, " */"; count++; }
+$3 == "str" && substr($7, 1, 1) == "Y"        {print "\tTRUE,\t/* ", $2, " */"; valid = count++; }
+END { printf "#define OK_str_from_termcap %d\n", valid; }
+'
+
+cat <<EOF
+};
+
+#endif /* _TERMSORT_H */
+EOF
+
+rm -f $data
diff --git a/progs/Makefile.in b/progs/Makefile.in
new file mode 100644
index 0000000..d818af4
--- /dev/null
+++ b/progs/Makefile.in
@@ -0,0 +1,369 @@
+# $Id: Makefile.in,v 1.111 2021/07/03 15:45:33 tom Exp $
+##############################################################################
+# Copyright 2020,2021 Thomas E. Dickey                                       #
+# Copyright 1998-2016,2018 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey 1996-on
+#
+# Makefile for ncurses source code.
+#
+# This makes the ncurses utility programs.
+#
+# The variable 'srcdir' refers to the source-distribution, and can be set with
+# the configure script by "--srcdir=DIR".
+#
+# The rules are organized to produce the libraries for the configured models,
+# and the programs with the configured default model.
+
+# turn off _all_ suffix rules; we'll generate our own
+.SUFFIXES:
+
+SHELL		= @SHELL@
+VPATH		= @srcdir@
+THIS		= Makefile
+
+TOP_MFLAGS	= @cf_cv_makeflags@ DESTDIR="$(DESTDIR)" RPATH_LIST="$(RPATH_LIST)"
+@SET_MAKE@
+
+x		= @EXEEXT@
+o		= .@OBJEXT@
+
+MODEL		= ../@DFT_OBJ_SUBDIR@
+DESTDIR		= @DESTDIR@
+top_srcdir	= @top_srcdir@
+srcdir		= @srcdir@
+prefix		= @prefix@
+exec_prefix	= @exec_prefix@
+bindir		= @bindir@
+libdir		= @libdir@
+includedir	= @includedir@
+datarootdir	= @datarootdir@
+datadir		= @datadir@
+includesubdir	= @includesubdir@
+
+INCLUDEDIR	= $(DESTDIR)$(includedir)$(includesubdir)
+
+PACKAGE		= @PACKAGE@
+
+LIBTOOL		= @LIBTOOL@
+LIBTOOL_OPTS	= @LIBTOOL_OPTS@
+LIBTOOL_CLEAN	= @LIB_CLEAN@
+LIBTOOL_COMPILE	= @LIB_COMPILE@
+LIBTOOL_LINK	= @LIB_LINK@
+LIBTOOL_INSTALL	= @LIB_INSTALL@
+LIBTOOL_UNINSTALL = @LIB_UNINSTALL@
+
+INSTALL		= @INSTALL@
+INSTALL_PROG	= @INSTALL_PROGRAM@ @INSTALL_OPT_S@
+transform	= @program_transform_name@
+
+AWK		= @AWK@
+LN_S		= @LN_S@
+
+CTAGS		= @CTAGS@
+ETAGS		= @ETAGS@
+
+CC		= @CC@
+CPP		= @CPP@
+CFLAGS		= @CFLAGS@ @EXTRA_CFLAGS@
+
+INCDIR		= $(top_srcdir)/include
+CPPFLAGS	= -DHAVE_CONFIG_H -I../progs @CPPFLAGS@
+
+CCFLAGS		= $(CPPFLAGS) $(CFLAGS)
+
+CFLAGS_LIBTOOL	= $(CCFLAGS)
+CFLAGS_NORMAL	= $(CCFLAGS) -DNCURSES_STATIC
+CFLAGS_DEBUG	= $(CCFLAGS) -DNCURSES_STATIC @CC_G_OPT@ -DTRACE
+CFLAGS_PROFILE	= $(CCFLAGS) -DNCURSES_STATIC -pg
+CFLAGS_SHARED	= $(CCFLAGS) @CC_SHARED_OPTS@
+
+CFLAGS_DEFAULT	= $(CFLAGS_@DFT_UPR_MODEL@)
+
+REL_VERSION	= @cf_cv_rel_version@
+ABI_VERSION	= @cf_cv_abi_version@
+LOCAL_LIBDIR	= @top_builddir@/lib
+
+LD		= @LD@
+LINK		= @LINK_PROGS@ $(LIBTOOL_LINK)
+LDFLAGS		= @EXTRA_LDFLAGS@ @LDFLAGS@
+RPATH_LIST	= @RPATH_LIST@
+
+LDFLAGS_LIBTOOL	= $(LDFLAGS) $(CFLAGS_LIBTOOL)
+LDFLAGS_NORMAL	= $(LDFLAGS) $(CFLAGS_NORMAL)
+LDFLAGS_DEBUG	= $(LDFLAGS) $(CFLAGS_DEBUG)
+LDFLAGS_PROFILE	= $(LDFLAGS) $(CFLAGS_PROFILE)
+LDFLAGS_SHARED	= $(LDFLAGS) $(CFLAGS_SHARED) @LD_SHARED_OPTS@
+
+LDFLAGS_DEFAULT	= $(LDFLAGS_@DFT_UPR_MODEL@)
+
+LIBS_TIC	= @TINFO_LDFLAGS@ @LDFLAGS_STATIC@ @TICS_LIBS@ @TINFO_LIBS@ @LDFLAGS_SHARED@ @LD_MODEL@ @LIBS@
+LDFLAGS_TIC	= @TICS_LDFLAGS@ $(LDFLAGS_@DFT_UPR_MODEL@) $(LIBS_TIC)
+
+LIBS_TINFO	= @LDFLAGS_STATIC@ @TINFO_LIBS@ @LDFLAGS_SHARED@ @LD_MODEL@ @LIBS@
+LDFLAGS_TINFO	= @TINFO_LDFLAGS@ $(LDFLAGS_@DFT_UPR_MODEL@) $(LIBS_TINFO)
+
+LINT		= @LINT@
+LINT_OPTS	= @LINT_OPTS@
+LINT_LIBS	= -lncurses @LIBS@
+
+AUTO_SRC = \
+	termsort.h \
+	transform.h
+
+# tic relies on direct access to the terminfo database
+GET_PROGS = infocmp$x clear$x tabs$x tput$x tset$x toe$x
+PUT_PROGS = @MAKE_TERMINFO@ tic$x
+PROGS = $(PUT_PROGS) $(GET_PROGS)
+
+# Default library, for linking applications
+DEPS_CURSES = ../lib/@LIB_PREFIX@ncurses@DFT_DEP_SUFFIX@
+
+HEADER_DEPS	= \
+	../include/curses.h \
+	$(INCDIR)/term_entry.h \
+	$(INCDIR)/tic.h \
+	$(INCDIR)/nc_alloc.h
+
+################################################################################
+
+@MAKE_PHONY@.PHONY :	all
+@MAKE_PHONY@.PHONY :	check
+@MAKE_PHONY@.PHONY :	clean
+@MAKE_PHONY@.PHONY :	distclean
+@MAKE_PHONY@.PHONY :	install
+@MAKE_PHONY@.PHONY :	install.libs
+@MAKE_PHONY@.PHONY :	install.progs
+@MAKE_PHONY@.PHONY :	libs
+@MAKE_PHONY@.PHONY :	lint
+@MAKE_PHONY@.PHONY :	mostlyclean
+@MAKE_PHONY@.PHONY :	realclean
+@MAKE_PHONY@.PHONY :	sources
+@MAKE_PHONY@.PHONY :	uninstall
+@MAKE_PHONY@.PHONY :	uninstall.libs
+@MAKE_PHONY@.PHONY :	uninstall.progs
+
+all:		$(AUTO_SRC) $(PROGS)
+
+sources:	$(AUTO_SRC)
+
+install: 	$(AUTO_SRC) install.progs
+uninstall: uninstall.progs
+
+# this line simplifies the configure-script
+libs \
+install.libs \
+uninstall.libs:
+
+TRANSFORM = sed 's/$x$$//'|sed '$(transform)'|sed 's/$$/$x/'
+
+# transformed names for installing files
+actual_captoinfo = `echo captoinfo$x| $(TRANSFORM)`
+actual_clear     = `echo clear$x|     $(TRANSFORM)`
+actual_infocmp   = `echo infocmp$x|   $(TRANSFORM)`
+actual_infotocap = `echo infotocap$x| $(TRANSFORM)`
+actual_init      = `echo init$x|      $(TRANSFORM)`
+actual_reset     = `echo reset$x|     $(TRANSFORM)`
+actual_tabs      = `echo tabs$x|      $(TRANSFORM)`
+actual_tic       = `echo tic$x|       $(TRANSFORM)`
+actual_toe       = `echo toe$x|       $(TRANSFORM)`
+actual_tput      = `echo tput$x|      $(TRANSFORM)`
+actual_tset      = `echo tset$x|      $(TRANSFORM)`
+
+# transformed names for comparing at runtime
+define_captoinfo = `echo captoinfo|   $(TRANSFORM)`
+define_clear     = `echo clear|       $(TRANSFORM)`
+define_infotocap = `echo infotocap|   $(TRANSFORM)`
+define_init      = `echo init|        $(TRANSFORM)`
+define_reset     = `echo reset|       $(TRANSFORM)`
+
+transform.h :
+	echo "#ifndef __TRANSFORM_H"					>$@
+	echo "#define __TRANSFORM_H 1"					>>$@
+	echo "#include <progs.priv.h>"					>>$@
+	echo "extern bool same_program(const char *, const char *);"	>>$@
+	-$(SHELL) -c 'if test -n "$x" ; then echo "#define SUFFIX_IGNORED \"$x\"">>$@; fi'
+	echo "#define PROG_CAPTOINFO \"$(define_captoinfo)\""		>>$@
+	echo "#define PROG_INFOTOCAP \"$(define_infotocap)\""		>>$@
+	echo "#define PROG_CLEAR     \"$(define_clear)\""		>>$@
+	echo "#define PROG_RESET     \"$(define_reset)\""		>>$@
+	echo "#define PROG_INIT      \"$(define_init)\""		>>$@
+	echo "#endif /* __TRANSFORM_H */"				>>$@
+
+install.progs: $(AUTO_SRC) $(PROGS) $(DESTDIR)$(bindir)
+@MAKE_TERMINFO@	$(LIBTOOL_INSTALL) $(INSTALL_PROG) tic$x     $(DESTDIR)$(bindir)/$(actual_tic)
+@MAKE_TERMINFO@	$(LIBTOOL_INSTALL) $(INSTALL_PROG) toe$x     $(DESTDIR)$(bindir)/$(actual_toe)
+@MAKE_TERMINFO@	@echo "linking $(actual_infotocap) to $(actual_tic)"
+@MAKE_TERMINFO@	-@rm -f $(DESTDIR)$(bindir)/$(actual_infotocap)
+@MAKE_TERMINFO@	( cd $(DESTDIR)$(bindir) && $(LN_S) $(actual_tic) $(actual_infotocap) )
+@MAKE_TERMINFO@	@echo "linking $(actual_captoinfo) to $(actual_tic)"
+@MAKE_TERMINFO@	-@rm -f $(DESTDIR)$(bindir)/$(actual_captoinfo)
+@MAKE_TERMINFO@	( cd $(DESTDIR)$(bindir) && $(LN_S) $(actual_tic) $(actual_captoinfo) )
+	$(LIBTOOL_INSTALL) $(INSTALL_PROG) infocmp$x $(DESTDIR)$(bindir)/$(actual_infocmp)
+	$(LIBTOOL_INSTALL) $(INSTALL_PROG) clear$x   $(DESTDIR)$(bindir)/$(actual_clear)
+	$(LIBTOOL_INSTALL) $(INSTALL_PROG) tabs$x    $(DESTDIR)$(bindir)/$(actual_tabs)
+	$(LIBTOOL_INSTALL) $(INSTALL_PROG) tput$x    $(DESTDIR)$(bindir)/$(actual_tput)
+	$(LIBTOOL_INSTALL) $(INSTALL_PROG) tset$x    $(DESTDIR)$(bindir)/$(actual_tset)
+	@echo "linking $(actual_reset) to $(actual_tset)"
+	-@rm -f $(DESTDIR)$(bindir)/$(actual_reset)
+	( cd $(DESTDIR)$(bindir) && $(LN_S) $(actual_tset) $(actual_reset) )
+
+uninstall.progs:
+@MAKE_TERMINFO@	-@$(LIBTOOL_CLEAN) rm -f $(DESTDIR)$(bindir)/$(actual_tic)
+@MAKE_TERMINFO@	-@$(LIBTOOL_CLEAN) rm -f $(DESTDIR)$(bindir)/$(actual_toe)
+@MAKE_TERMINFO@	-@rm -f $(DESTDIR)$(bindir)/$(actual_captoinfo)
+@MAKE_TERMINFO@	-@rm -f $(DESTDIR)$(bindir)/$(actual_infotocap)
+	-@$(LIBTOOL_CLEAN) rm -f $(DESTDIR)$(bindir)/$(actual_infocmp)
+	-@$(LIBTOOL_CLEAN) rm -f $(DESTDIR)$(bindir)/$(actual_clear)
+	-@$(LIBTOOL_CLEAN) rm -f $(DESTDIR)$(bindir)/$(actual_tabs)
+	-@$(LIBTOOL_CLEAN) rm -f $(DESTDIR)$(bindir)/$(actual_tput)
+	-@$(LIBTOOL_CLEAN) rm -f $(DESTDIR)$(bindir)/$(actual_tset)
+	-@rm -f $(DESTDIR)$(bindir)/$(actual_reset)
+
+$(DESTDIR)$(bindir) :
+	mkdir -p $@
+
+#
+# Utilities normally built by make all start here
+#
+
+DEPS_TIC = \
+	$(MODEL)/tic$o \
+	$(MODEL)/dump_entry$o \
+	$(MODEL)/tparm_type$o \
+	$(MODEL)/transform$o
+
+tic$x: $(DEPS_TIC) $(DEPS_CURSES) transform.h
+	@ECHO_LD@ $(LINK) $(DEPS_TIC) $(LDFLAGS_TIC) -o $@
+
+DEPS_TOE = \
+	$(MODEL)/toe$o
+
+toe$x: $(DEPS_TOE) $(DEPS_CURSES)
+	@ECHO_LD@ $(LINK) $(DEPS_TOE) $(LDFLAGS_TIC) -o $@
+
+DEPS_CLEAR = \
+	$(MODEL)/clear$o \
+	$(MODEL)/clear_cmd$o \
+	$(MODEL)/tty_settings$o
+
+clear$x: $(DEPS_CLEAR) $(DEPS_CURSES)
+	@ECHO_LD@ $(LINK) $(DEPS_CLEAR) $(LDFLAGS_TINFO) -o $@
+
+DEPS_TABS = \
+	$(MODEL)/tabs$o \
+	$(MODEL)/tty_settings$o
+
+tabs$x: $(DEPS_TABS) $(DEPS_TABS)
+	@ECHO_LD@ $(LINK) $(DEPS_TABS) $(LDFLAGS_TINFO) -o $@
+
+DEPS_TPUT = \
+	$(MODEL)/tput$o \
+	$(MODEL)/clear_cmd$o \
+	$(MODEL)/reset_cmd$o \
+	$(MODEL)/tparm_type$o \
+	$(MODEL)/transform$o \
+	$(MODEL)/tty_settings$o
+
+tput$x: $(DEPS_TPUT) $(DEPS_CURSES) transform.h
+	@ECHO_LD@ $(LINK) $(DEPS_TPUT) $(LDFLAGS_TINFO) -o $@
+
+DEPS_INFOCMP = \
+	$(MODEL)/infocmp$o \
+	$(MODEL)/dump_entry$o
+
+infocmp$x: $(DEPS_INFOCMP) $(DEPS_CURSES)
+	@ECHO_LD@ $(LINK) $(DEPS_INFOCMP) $(LDFLAGS_TIC) -o $@
+
+DEPS_TSET = \
+	$(MODEL)/tset$o \
+	$(MODEL)/reset_cmd$o \
+	$(MODEL)/transform$o \
+	$(MODEL)/tty_settings$o
+
+tset$x: $(DEPS_TSET) $(DEPS_CURSES) transform.h
+	@ECHO_LD@ $(LINK) $(DEPS_TSET) $(LDFLAGS_TINFO) -o $@
+
+termsort.h: $(srcdir)/MKtermsort.sh
+	$(SHELL) $(srcdir)/MKtermsort.sh $(AWK) $(srcdir)/../include/@TERMINFO_CAPS@ >$@
+
+#
+# Utility productions start here
+#
+
+tags:
+	$(CTAGS) *.[ch]
+
+@MAKE_UPPER_TAGS@TAGS:
+@MAKE_UPPER_TAGS@	$(ETAGS) *.[ch]
+
+mostlyclean ::
+	-rm -f core tags TAGS *~ *.bak *.i *.ln *.atac trace
+
+clean :: mostlyclean
+	-$(SHELL) -c "if test -n '$x' ; then $(MAKE) clean x=''; fi"
+	-rm -f $(AUTO_SRC)
+	-rm -f $(PROGS)
+	-rm -rf .libs *.dSYM
+
+distclean :: clean
+	-rm -f Makefile
+
+realclean :: distclean
+
+# These rules are used to allow "make -n" to work on a clean directory-tree
+../include/hashsize.h \
+../include/parametrized.h \
+../include/term.h :
+	( cd ../include && $(MAKE) $(TOP_MFLAGS) )
+$(DEPS_CURSES) :
+	( cd ../ncurses && $(MAKE) $(TOP_MFLAGS) )
+
+lint:
+@MAKE_TERMINFO@	$(LINT) $(LINT_OPTS) $(CPPFLAGS) $(srcdir)/tic.c     $(srcdir)/dump_entry.c $(LINT_LIBS)
+@MAKE_TERMINFO@	$(LINT) $(LINT_OPTS) $(CPPFLAGS) $(srcdir)/toe.c                    $(LINT_LIBS)
+	$(LINT) $(LINT_OPTS) $(CPPFLAGS) $(srcdir)/clear.c                          $(LINT_LIBS)
+	$(LINT) $(LINT_OPTS) $(CPPFLAGS) $(srcdir)/infocmp.c $(srcdir)/dump_entry.c $(LINT_LIBS)
+	$(LINT) $(LINT_OPTS) $(CPPFLAGS) $(srcdir)/tabs.c                           $(LINT_LIBS)
+	$(LINT) $(LINT_OPTS) $(CPPFLAGS) $(srcdir)/tput.c                           $(LINT_LIBS)
+	$(LINT) $(LINT_OPTS) $(CPPFLAGS) $(srcdir)/tset.c                           $(LINT_LIBS)
+
+# Verify that each header-file can be compiled without including another.
+check:
+	@$(SHELL) -c "for header in *.h;\
+		do \
+			echo \"** testing \$${header}\" ; \
+			echo \"#include <\$${header}>\" >headers.c; \
+			echo \"int main(void) { return 0; }\" >>headers.c; \
+			$(CC) -c $(CFLAGS) $(CPPFLAGS) headers.c; \
+		done"
+	-@rm -f headers.*
+
+###############################################################################
+# The remainder of this file is automatically generated during configuration
+###############################################################################
diff --git a/progs/capconvert b/progs/capconvert
new file mode 100755
index 0000000..4b5b321
--- /dev/null
+++ b/progs/capconvert
@@ -0,0 +1,260 @@
+#!/bin/sh
+##############################################################################
+# Copyright 2019-2021,2022 Thomas E. Dickey                                  #
+# Copyright 1998-2011,2017 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: capconvert,v 1.12 2022/07/16 21:00:27 tom Exp $
+#
+# capconvert -- automated conversion from termcap to terminfo
+#
+
+echo "This script tries to automatically set you up so that your applications"
+echo "that now use termcap can use terminfo and the ncurses library."
+echo ""
+
+# Note, except for telling if we're running under xterm we don't use TERM at
+# all.  This is because BSD users not infrequently have multiple termtypes
+# selected by conditionals in tset -- unless they're xterm users, in which
+# case they're on a workstation and probably don't.
+
+# Check to make sure TERMINFO is not already defined
+if test -n "$TERMINFO"
+then
+	echo "TERMINFO is already defined in your environment.  This means"
+	echo "you already have a local terminfo tree, so you do not need any"
+	echo "conversion."
+	if test ! -d "$TERMINFO" ; then
+		echo "Caution: TERMINFO does not point to a directory!"
+	fi
+	exit;
+fi
+
+# Check to see if terminfo is present in one of the standard locations.
+terminfo=no
+for p in $TERMINFO \
+	/usr/lib/terminfo \
+	/usr/share/lib/terminfo \
+	/usr/share/terminfo \
+	/usr/local/lib/terminfo \
+	/usr/local/share/terminfo
+do
+	if test -d "$p" ; then
+		terminfo=yes
+		break
+	fi
+done
+
+if test $terminfo = yes
+then
+	echo "Your system already has a system-wide terminfo tree."
+	echo ""
+	if test -z "$TERMCAP"
+	then
+		echo "You have no TERMCAP variable set, so we are done."
+		# Assumes the terminfo master covers all canned terminal types
+		exit;
+	fi
+	case $TERM in
+	xterm | xterm-*)
+		echo "You are running xterm, which usually sets TERMCAP itself."
+		echo "We can ignore this, because terminfo knows about xterm."
+		echo "So you will just use the system-wide terminfo tree."
+		exit
+		;;
+	*)
+		echo "We will have to make a local one for you anyway, to capture the effect"
+		echo "of your TERMCAP variable."
+		;;
+	esac
+else
+	echo "No system-wide terminfo tree.  We will make you a local one."
+fi
+echo "";
+
+# Check if test -x works (it is not portable, but useful)
+OPT="-x"
+TMP=test$$; touch $TMP && chmod 755 $TMP
+if test $OPT $TMP ; then
+	chmod 644 $TMP
+	test $OPT $TMP && OPT="-f"
+else
+	OPT="-f"
+fi
+rm -f $TMP
+
+# First step -- go find tic
+TIC=
+IFS="${IFS= 	}"; save_ifs="$IFS"; IFS="${IFS}:"
+for x in $PATH .
+do
+	if test "$OPT" "$x"/tic
+	then
+		TIC=$x/tic
+		break
+	fi
+done
+IFS="$save_ifs"
+
+if test -n "$TIC"
+then
+	echo "I see tic at $TIC."
+	case $TIC in # (vi
+	./tic)
+		if test $OPT ../misc/shlib ; then
+			TIC="../misc/shlib $TIC"
+		fi
+		;;
+	esac
+else
+	echo "You do not have tic installed anywhere I can see, please fix that."
+	exit;
+fi
+echo "";
+
+# We have tic.  Either there's no system terminfo tree or there is one but
+# the user has a TERMCAP variable that may modify a stock description.
+#
+
+# Make the user a terminfo directory
+if test -d "$HOME"/.terminfo
+then
+	echo "It appears you already have a private terminfo directory"
+	echo "at $HOME/.terminfo; this seems odd, because TERMINFO"
+	echo "is not defined.  I am not going to second-guess this -- if you"
+	echo "really want me to try auto-configuring for you, remove or"
+	echo "rename $HOME/terminfo and run me again."
+	exit;
+else
+	echo "I am creating your private terminfo directory at $HOME/.terminfo"
+	mkdir "$HOME"/.terminfo
+	# Ensure that that's where tic's compilation results.
+	# This isn't strictly necessary with a 1.9.7 or later tic.
+	TERMINFO="$HOME/.terminfo"; export TERMINFO
+fi
+echo "";
+
+# Find a terminfo source to work from
+if test -f ../misc/terminfo.src
+then
+	echo "I see the terminfo master source is handy; I will use that."
+	master=../misc/terminfo.src
+else
+	# Ooops...looks like we're running from somewhere other than the
+	# progs directory of an ncurses source tree.
+	master=`find "$HOME" -name "*terminfo.src" -print`
+	mcount=`find "$HOME" -name "*terminfo.src" | wc -l`
+	case $mcount in
+	0)
+		echo "I can not find a terminfo source file anywhere under your home directory."
+		echo "There should be a file called terminfo.src somewhere in your"
+		echo "ncurses distribution; please put it in your home directotry"
+		echo "and run me again (it does not have to live there permanently)."
+		exit;
+	;;
+	1)
+		echo "I see a file called $master."
+		echo "I am going to assume this is the terminfo source included with"
+		echo "the ncurses distribution.  If this assumption is wrong, please"
+		echo "interrupt me now!  OK to continue?"
+		read answer;
+	;;
+	2)
+		echo "I see more than one possible terminfo source.  Here they are:"
+		echo "$master" | sed "/^/s//	/";
+		while :
+		do
+			echo "Please tell me which one to use:"
+			read master;
+			if test -f "$master"
+			then
+				break
+			else
+				echo "That file does not exist. Try again?";
+			fi
+		done
+	;;
+	esac
+fi
+echo "";
+
+# Now that we have a master, compile it into the local tree
+echo "OK, now I will make your private terminfo tree.  This may take a bit..."
+#
+# Kluge alert: we compile terminfo.src in two pieces because a lot of machines
+# with < 16MB RAM choke on tic's core-hog habits.
+trap 'rm -f tsplit$$.*; exit 1' 1 2 3 15
+trap 'rm -f tsplit$$.*' 0
+sed -n "$master" \
+	-e '1,/SPLIT HERE/w 'tsplit$$.01 \
+	-e '/SPLIT HERE/,$w 'tsplit$$.02 \
+	2>/dev/null
+for x in tsplit$$.*; do eval $TIC "$x"; done
+rm tsplit$$.*
+trap EXIT INT QUIT TERM HUP
+#
+echo "You now have a private tree under $HOME/.terminfo;"
+echo "the ncurses library will automatically read from it,"
+echo "and ncurses tic will automatically compile entries to it."
+
+# We're done unless user has a .termcap file or equivalent named by TERMCAP
+if test -z "$TERMCAP"
+then
+	echo "You have no TERMCAP set, so we are done."
+fi
+
+# OK, here comes the nasty case...user has a TERMCAP.  Instead of
+# trying to follow all the convolutions of the relationship between
+# TERM and TERMCAP (partly because it is too painful, and partly because
+# we don't actually know what TERM will be nor even if it always has
+# the same value for this user) we do the following three steps...
+
+if test -f "$HOME"/.termcap
+then
+	echo "I see you have a \$HOME/.termcap file.  I will compile that."
+	eval $TIC "$HOME"/.termcap
+	echo "Done."
+	echo "Note that editing $HOME/.termcap will no longer change the data curses sees."
+elif test -f "$TERMCAP"
+then
+	echo "Your TERMCAP names the file $TERMCAP.  I will compile that."
+	eval $TIC "$TERMCAP"
+	echo "Done."
+	echo "Note that editing $TERMCAP will no longer change the data curses sees."
+else
+	echo "Your TERMCAP value appears to be an entry in termcap format."
+	echo "I will compile it."
+	echo "$TERMCAP" >myterm$$
+	eval $TIC myterm$$
+	rm myterm$$
+	echo "Done."
+	echo "Note that editing TERMCAP will no longer change the data curses sees."
+fi
+echo "To do that, decompile the terminal description you want with infocmp(1),"
+echo "edit to taste, and recompile using tic(1)."
+
+# capconvert ends here
+
diff --git a/progs/clear.c b/progs/clear.c
new file mode 100644
index 0000000..97cb0f3
--- /dev/null
+++ b/progs/clear.c
@@ -0,0 +1,108 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ ****************************************************************************/
+
+/*
+ * clear.c --  clears the terminal's screen
+ */
+
+#define USE_LIBTINFO
+#include <clear_cmd.h>
+#include <tty_settings.h>
+
+MODULE_ID("$Id: clear.c,v 1.24 2021/03/20 18:23:14 tom Exp $")
+
+const char *_nc_progname = "clear";
+
+static GCC_NORETURN void
+usage(void)
+{
+#define KEEP(s) s "\n"
+    static const char msg[] =
+    {
+	KEEP("")
+	KEEP("Options:")
+	KEEP("  -T TERM     use this instead of $TERM")
+	KEEP("  -V          print curses-version")
+	KEEP("  -x          do not try to clear scrollback")
+    };
+#undef KEEP
+    (void) fprintf(stderr, "Usage: %s [options]\n", _nc_progname);
+    fputs(msg, stderr);
+    ExitProgram(EXIT_FAILURE);
+}
+
+int
+main(
+	int argc GCC_UNUSED,
+	char *argv[]GCC_UNUSED)
+{
+    TTY tty_settings;
+    int fd;
+    int c;
+    char *term;
+    bool opt_x = FALSE;		/* clear scrollback if possible */
+
+    _nc_progname = _nc_rootname(argv[0]);
+    term = getenv("TERM");
+
+    while ((c = getopt(argc, argv, "T:Vx")) != -1) {
+	switch (c) {
+	case 'T':
+	    use_env(FALSE);
+	    use_tioctl(TRUE);
+	    term = optarg;
+	    break;
+	case 'V':
+	    puts(curses_version());
+	    ExitProgram(EXIT_SUCCESS);
+	case 'x':		/* do not try to clear scrollback */
+	    opt_x = TRUE;
+	    break;
+	default:
+	    usage();
+	    /* NOTREACHED */
+	}
+    }
+    if (optind < argc)
+	usage();
+
+    fd = save_tty_settings(&tty_settings, FALSE);
+
+    setupterm(term, fd, (int *) 0);
+
+    ExitProgram((clear_cmd(opt_x) == ERR)
+		? EXIT_FAILURE
+		: EXIT_SUCCESS);
+}
diff --git a/progs/clear.sh b/progs/clear.sh
new file mode 100644
index 0000000..1d899f1
--- /dev/null
+++ b/progs/clear.sh
@@ -0,0 +1,30 @@
+#!/bin/sh
+##############################################################################
+# Copyright 2020 Thomas E. Dickey                                            #
+# Copyright 1998,2006 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.                                                             #
+##############################################################################
+exec tput clear
diff --git a/progs/clear_cmd.c b/progs/clear_cmd.c
new file mode 100644
index 0000000..3d80515
--- /dev/null
+++ b/progs/clear_cmd.c
@@ -0,0 +1,60 @@
+/****************************************************************************
+ * Copyright 2018,2020 Thomas E. Dickey                                     *
+ * Copyright 2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                                                *
+ ****************************************************************************/
+
+/*
+ * clear.c --  clears the terminal's screen
+ */
+
+#define USE_LIBTINFO
+#include <clear_cmd.h>
+
+MODULE_ID("$Id: clear_cmd.c,v 1.5 2020/02/02 23:34:34 tom Exp $")
+
+static int
+putch(int c)
+{
+    return putchar(c);
+}
+
+int
+clear_cmd(bool legacy)
+{
+    int retval = tputs(clear_screen, lines > 0 ? lines : 1, putch);
+    if (!legacy) {
+	/* Clear the scrollback buffer if possible. */
+	char *E3 = tigetstr("E3");
+	if (E3)
+	    (void) tputs(E3, lines > 0 ? lines : 1, putch);
+    }
+    return retval;
+}
diff --git a/progs/clear_cmd.h b/progs/clear_cmd.h
new file mode 100644
index 0000000..b1de814
--- /dev/null
+++ b/progs/clear_cmd.h
@@ -0,0 +1,45 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                                                *
+ ****************************************************************************/
+
+/*
+ * $Id: clear_cmd.h,v 1.3 2020/02/02 23:34:34 tom Exp $
+ *
+ * Utility functions for clearing terminal.
+ */
+#ifndef CLEAR_CMD_H
+#define CLEAR_CMD_H 1
+
+#include <progs.priv.h>
+extern int clear_cmd(bool);
+
+#endif /* CLEAR_CMD_H */
diff --git a/progs/dump_entry.c b/progs/dump_entry.c
new file mode 100644
index 0000000..664df32
--- /dev/null
+++ b/progs/dump_entry.c
@@ -0,0 +1,1816 @@
+/****************************************************************************
+ * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996 on                 *
+ ****************************************************************************/
+
+#define __INTERNAL_CAPS_VISIBLE
+#include <progs.priv.h>
+
+#include <dump_entry.h>
+#include <termsort.h>		/* this C file is generated */
+#include <parametrized.h>	/* so is this */
+
+MODULE_ID("$Id: dump_entry.c,v 1.190 2022/01/22 21:23:58 tom Exp $")
+
+#define DISCARD(string) string = ABSENT_STRING
+#define PRINTF (void) printf
+#define WRAPPED 32
+
+#define OkIndex(index,array) ((int)(index) >= 0 && (int)(index) < (int) SIZEOF(array))
+#define TcOutput() (outform == F_TERMCAP || outform == F_TCONVERR)
+
+typedef struct {
+    char *text;
+    size_t used;
+    size_t size;
+} DYNBUF;
+
+static int tversion;		/* terminfo version */
+static int outform;		/* output format to use */
+static int sortmode;		/* sort mode to use */
+static int width = 60;		/* max line width for listings */
+static int height = 65535;	/* max number of lines for listings */
+static int column;		/* current column, limited by 'width' */
+static int oldcol;		/* last value of column before wrap */
+static bool pretty;		/* true if we format if-then-else strings */
+static bool wrapped;		/* true if we wrap too-long strings */
+static bool did_wrap;		/* true if last wrap_concat did wrapping */
+static bool checking;		/* true if we are checking for tic */
+static int quickdump;		/* true if we are dumping compiled data */
+
+static char *save_sgr;
+
+static DYNBUF outbuf;
+static DYNBUF tmpbuf;
+
+/* indirection pointers for implementing sort and display modes */
+static const PredIdx *bool_indirect, *num_indirect, *str_indirect;
+static NCURSES_CONST char *const *bool_names;
+static NCURSES_CONST char *const *num_names;
+static NCURSES_CONST char *const *str_names;
+
+static const char *separator = "", *trailer = "";
+static int indent = 8;
+
+/* cover various ports and variants of terminfo */
+#define V_ALLCAPS	0	/* all capabilities (SVr4, XSI, ncurses) */
+#define V_SVR1		1	/* SVR1, Ultrix */
+#define V_HPUX		2	/* HP-UX */
+#define V_AIX		3	/* AIX */
+#define V_BSD		4	/* BSD */
+
+#if NCURSES_XNAMES
+#define OBSOLETE(n) (!_nc_user_definable && (n[0] == 'O' && n[1] == 'T'))
+#else
+#define OBSOLETE(n) (n[0] == 'O' && n[1] == 'T')
+#endif
+
+#define isObsolete(f,n) ((f == F_TERMINFO || f == F_VARIABLE) && (sortmode != S_VARIABLE) && OBSOLETE(n))
+
+#if NCURSES_XNAMES
+#define BoolIndirect(j) ((j >= BOOLCOUNT) ? (j) : ((sortmode == S_NOSORT) ? j : bool_indirect[j]))
+#define NumIndirect(j)  ((j >= NUMCOUNT)  ? (j) : ((sortmode == S_NOSORT) ? j : num_indirect[j]))
+#define StrIndirect(j)  ((j >= STRCOUNT)  ? (j) : ((sortmode == S_NOSORT) ? j : str_indirect[j]))
+#else
+#define BoolIndirect(j) ((sortmode == S_NOSORT) ? (j) : bool_indirect[j])
+#define NumIndirect(j)  ((sortmode == S_NOSORT) ? (j) : num_indirect[j])
+#define StrIndirect(j)  ((sortmode == S_NOSORT) ? (j) : str_indirect[j])
+#endif
+
+static GCC_NORETURN void
+failed(const char *s)
+{
+    perror(s);
+    ExitProgram(EXIT_FAILURE);
+}
+
+static void
+strncpy_DYN(DYNBUF * dst, const char *src, size_t need)
+{
+    size_t want = need + dst->used + 1;
+    if (want > dst->size) {
+	dst->size += (want + 1024);	/* be generous */
+	dst->text = typeRealloc(char, dst->size, dst->text);
+	if (dst->text == 0)
+	    failed("strncpy_DYN");
+    }
+    _nc_STRNCPY(dst->text + dst->used, src, need + 1);
+    dst->used += need;
+    dst->text[dst->used] = 0;
+}
+
+static void
+strcpy_DYN(DYNBUF * dst, const char *src)
+{
+    if (src == 0) {
+	dst->used = 0;
+	strcpy_DYN(dst, "");
+    } else {
+	strncpy_DYN(dst, src, strlen(src));
+    }
+}
+
+#if NO_LEAKS
+static void
+free_DYN(DYNBUF * p)
+{
+    if (p->text != 0)
+	free(p->text);
+    p->text = 0;
+    p->size = 0;
+    p->used = 0;
+}
+
+void
+_nc_leaks_dump_entry(void)
+{
+    free_DYN(&outbuf);
+    free_DYN(&tmpbuf);
+}
+#endif
+
+#define NameTrans(check,result) \
+	    if ((np->nte_index <= OK_ ## check) \
+		&& check[np->nte_index]) \
+		return (result[np->nte_index])
+
+NCURSES_CONST char *
+nametrans(const char *name)
+/* translate a capability name to termcap from terminfo */
+{
+    const struct name_table_entry *np;
+
+    if ((np = _nc_find_entry(name, _nc_get_hash_table(0))) != 0) {
+	switch (np->nte_type) {
+	case BOOLEAN:
+	    NameTrans(bool_from_termcap, boolcodes);
+	    break;
+
+	case NUMBER:
+	    NameTrans(num_from_termcap, numcodes);
+	    break;
+
+	case STRING:
+	    NameTrans(str_from_termcap, strcodes);
+	    break;
+	}
+    }
+
+    return (0);
+}
+
+void
+dump_init(const char *version,
+	  int mode,
+	  int sort,
+	  bool wrap_strings,
+	  int twidth,
+	  int theight,
+	  unsigned traceval,
+	  bool formatted,
+	  bool check,
+	  int quick)
+/* set up for entry display */
+{
+    width = twidth;
+    height = theight;
+    pretty = formatted;
+    wrapped = wrap_strings;
+    checking = check;
+    quickdump = (quick & 3);
+
+    did_wrap = (width <= 0);
+
+    /* versions */
+    if (version == 0)
+	tversion = V_ALLCAPS;
+    else if (!strcmp(version, "SVr1") || !strcmp(version, "SVR1")
+	     || !strcmp(version, "Ultrix"))
+	tversion = V_SVR1;
+    else if (!strcmp(version, "HP"))
+	tversion = V_HPUX;
+    else if (!strcmp(version, "AIX"))
+	tversion = V_AIX;
+    else if (!strcmp(version, "BSD"))
+	tversion = V_BSD;
+    else
+	tversion = V_ALLCAPS;
+
+    /* implement display modes */
+    switch (outform = mode) {
+    case F_LITERAL:
+    case F_TERMINFO:
+	bool_names = boolnames;
+	num_names = numnames;
+	str_names = strnames;
+	separator = (twidth > 0 && theight > 1) ? ", " : ",";
+	trailer = "\n\t";
+	break;
+
+    case F_VARIABLE:
+	bool_names = boolfnames;
+	num_names = numfnames;
+	str_names = strfnames;
+	separator = (twidth > 0 && theight > 1) ? ", " : ",";
+	trailer = "\n\t";
+	break;
+
+    case F_TERMCAP:
+    case F_TCONVERR:
+	bool_names = boolcodes;
+	num_names = numcodes;
+	str_names = strcodes;
+	separator = ":";
+	trailer = "\\\n\t:";
+	break;
+    }
+    indent = 8;
+
+    /* implement sort modes */
+    switch (sortmode = sort) {
+    case S_NOSORT:
+	if (traceval)
+	    (void) fprintf(stderr,
+			   "%s: sorting by term structure order\n", _nc_progname);
+	break;
+
+    case S_TERMINFO:
+	if (traceval)
+	    (void) fprintf(stderr,
+			   "%s: sorting by terminfo name order\n", _nc_progname);
+	bool_indirect = bool_terminfo_sort;
+	num_indirect = num_terminfo_sort;
+	str_indirect = str_terminfo_sort;
+	break;
+
+    case S_VARIABLE:
+	if (traceval)
+	    (void) fprintf(stderr,
+			   "%s: sorting by C variable order\n", _nc_progname);
+	bool_indirect = bool_variable_sort;
+	num_indirect = num_variable_sort;
+	str_indirect = str_variable_sort;
+	break;
+
+    case S_TERMCAP:
+	if (traceval)
+	    (void) fprintf(stderr,
+			   "%s: sorting by termcap name order\n", _nc_progname);
+	bool_indirect = bool_termcap_sort;
+	num_indirect = num_termcap_sort;
+	str_indirect = str_termcap_sort;
+	break;
+    }
+
+    if (traceval)
+	(void) fprintf(stderr,
+		       "%s: width = %d, tversion = %d, outform = %d\n",
+		       _nc_progname, width, tversion, outform);
+}
+
+static TERMTYPE2 *cur_type;
+
+static int
+dump_predicate(PredType type, PredIdx idx)
+/* predicate function to use for ordinary decompilation */
+{
+    switch (type) {
+    case BOOLEAN:
+	return (cur_type->Booleans[idx] == FALSE)
+	    ? FAIL : cur_type->Booleans[idx];
+
+    case NUMBER:
+	return (cur_type->Numbers[idx] == ABSENT_NUMERIC)
+	    ? FAIL : cur_type->Numbers[idx];
+
+    case STRING:
+	return (cur_type->Strings[idx] != ABSENT_STRING)
+	    ? (int) TRUE : FAIL;
+    }
+
+    return (FALSE);		/* pacify compiler */
+}
+
+static void set_obsolete_termcaps(TERMTYPE2 *tp);
+
+/* is this the index of a function key string? */
+#define FNKEY(i) \
+    (((i) >= STR_IDX(key_f0) && \
+      (i) <= STR_IDX(key_f9)) || \
+     ((i) >= STR_IDX(key_f11) && \
+      (i) <= STR_IDX(key_f63)))
+
+/*
+ * If we configure with a different Caps file, the offsets into the arrays
+ * will change.  So we use an address expression.
+ */
+#define BOOL_IDX(name) (PredType) (&(name) - &(CUR Booleans[0]))
+#define NUM_IDX(name)  (PredType) (&(name) - &(CUR Numbers[0]))
+#define STR_IDX(name)  (PredType) (&(name) - &(CUR Strings[0]))
+
+static bool
+version_filter(PredType type, PredIdx idx)
+/* filter out capabilities we may want to suppress */
+{
+    switch (tversion) {
+    case V_ALLCAPS:		/* SVr4, XSI Curses */
+	return (TRUE);
+
+    case V_SVR1:		/* System V Release 1, Ultrix */
+	switch (type) {
+	case BOOLEAN:
+	    return ((idx <= BOOL_IDX(xon_xoff)) ? TRUE : FALSE);
+	case NUMBER:
+	    return ((idx <= NUM_IDX(width_status_line)) ? TRUE : FALSE);
+	case STRING:
+	    return ((idx <= STR_IDX(prtr_non)) ? TRUE : FALSE);
+	}
+	break;
+
+    case V_HPUX:		/* Hewlett-Packard */
+	switch (type) {
+	case BOOLEAN:
+	    return ((idx <= BOOL_IDX(xon_xoff)) ? TRUE : FALSE);
+	case NUMBER:
+	    return ((idx <= NUM_IDX(label_width)) ? TRUE : FALSE);
+	case STRING:
+	    if (idx <= STR_IDX(prtr_non))
+		return (TRUE);
+	    else if (FNKEY(idx))	/* function keys */
+		return (TRUE);
+	    else if (idx == STR_IDX(plab_norm)
+		     || idx == STR_IDX(label_on)
+		     || idx == STR_IDX(label_off))
+		return (TRUE);
+	    else
+		return (FALSE);
+	}
+	break;
+
+    case V_AIX:		/* AIX */
+	switch (type) {
+	case BOOLEAN:
+	    return ((idx <= BOOL_IDX(xon_xoff)) ? TRUE : FALSE);
+	case NUMBER:
+	    return ((idx <= NUM_IDX(width_status_line)) ? TRUE : FALSE);
+	case STRING:
+	    if (idx <= STR_IDX(prtr_non))
+		return (TRUE);
+	    else if (FNKEY(idx))	/* function keys */
+		return (TRUE);
+	    else
+		return (FALSE);
+	}
+	break;
+
+#define is_termcap(type) (OkIndex(idx, type##_from_termcap) && \
+			  type##_from_termcap[idx])
+
+    case V_BSD:		/* BSD */
+	switch (type) {
+	case BOOLEAN:
+	    return is_termcap(bool);
+	case NUMBER:
+	    return is_termcap(num);
+	case STRING:
+	    return is_termcap(str);
+	}
+	break;
+    }
+
+    return (FALSE);		/* pacify the compiler */
+}
+
+static void
+trim_trailing(void)
+{
+    while (outbuf.used > 0 && outbuf.text[outbuf.used - 1] == ' ')
+	outbuf.text[--outbuf.used] = '\0';
+}
+
+static void
+force_wrap(void)
+{
+    oldcol = column;
+    trim_trailing();
+    strcpy_DYN(&outbuf, trailer);
+    column = indent;
+}
+
+static int
+op_length(const char *src, int offset)
+{
+    int result = 0;
+
+    if (offset > 0 && src[offset - 1] == '\\') {
+	result = 0;
+    } else {
+	int ch;
+
+	result++;		/* for '%' mark */
+	ch = src[offset + result];
+	if (TcOutput()) {
+	    if (ch == '>') {
+		result += 3;
+	    } else if (ch == '+') {
+		result += 2;
+	    } else {
+		result++;
+	    }
+	} else if (ch == '\'') {
+	    result += 3;
+	} else if (ch == L_CURL[0]) {
+	    int n = result;
+	    while ((ch = src[offset + n]) != '\0') {
+		if (ch == R_CURL[0]) {
+		    result = ++n;
+		    break;
+		}
+		n++;
+	    }
+	} else if (strchr("pPg", ch) != 0) {
+	    result += 2;
+	} else {
+	    result++;		/* ordinary operator */
+	}
+    }
+    return result;
+}
+
+/*
+ * When wrapping too-long strings, avoid splitting a backslash sequence, or
+ * a terminfo '%' operator.  That will leave things a little ragged, but avoids
+ * a stray backslash at the end of the line, as well as making the result a
+ * little more readable.
+ */
+static int
+find_split(const char *src, int step, int size)
+{
+    int result = size;
+
+    if (size > 0) {
+	/* check if that would split a backslash-sequence */
+	int mark = size;
+	int n;
+
+	for (n = size - 1; n > 0; --n) {
+	    int ch = UChar(src[step + n]);
+	    if (ch == '\\') {
+		if (n > 0 && src[step + n - 1] == ch)
+		    --n;
+		mark = n;
+		break;
+	    } else if (!isalnum(ch)) {
+		break;
+	    }
+	}
+	if (mark < size) {
+	    result = mark;
+	} else {
+	    /* check if that would split a backslash-sequence */
+	    for (n = size - 1; n > 0; --n) {
+		int ch = UChar(src[step + n]);
+		if (ch == '%') {
+		    int need = op_length(src, step + n);
+		    if ((n + need) > size) {
+			mark = n;
+		    }
+		    break;
+		}
+	    }
+	    if (mark < size) {
+		result = mark;
+	    }
+	}
+    }
+    return result;
+}
+
+/*
+ * If we are going to wrap lines, we cannot leave literal spaces because that
+ * would be ambiguous if we split on that space.
+ */
+static char *
+fill_spaces(const char *src)
+{
+    const char *fill = "\\s";
+    size_t need = strlen(src);
+    size_t size = strlen(fill);
+    char *result = 0;
+    int pass;
+    size_t s, d;
+    for (pass = 0; pass < 2; ++pass) {
+	for (s = d = 0; src[s] != '\0'; ++s) {
+	    if (src[s] == ' ') {
+		if (pass) {
+		    _nc_STRCPY(&result[d], fill, need + 1 - d);
+		    d += size;
+		} else {
+		    need += size;
+		}
+	    } else {
+		if (pass) {
+		    result[d++] = src[s];
+		} else {
+		    ++d;
+		}
+	    }
+	}
+	if (pass) {
+	    result[d] = '\0';
+	} else {
+	    result = calloc(need + 1, sizeof(char));
+	    if (result == 0)
+		failed("fill_spaces");
+	}
+    }
+    return result;
+}
+
+typedef enum {
+    wOFF = 0
+    ,w1ST = 1
+    ,w2ND = 2
+    ,wEND = 4
+    ,wERR = 8
+} WRAPMODE;
+
+#define wrap_1ST(mode) ((mode)&w1ST)
+#define wrap_END(mode) ((mode)&wEND)
+#define wrap_ERR(mode) ((mode)&wERR)
+
+static void
+wrap_concat(const char *src, int need, unsigned mode)
+{
+    int gaps = (int) strlen(separator);
+    int want = gaps + need;
+
+    did_wrap = (width <= 0);
+    if (wrap_1ST(mode)
+	&& column > indent
+	&& column + want > width) {
+	force_wrap();
+    }
+    if ((wrap_END(mode) && !wrap_ERR(mode)) &&
+	wrapped &&
+	(width >= 0) &&
+	(column + want) > width) {
+	int step = 0;
+	int used = width > WRAPPED ? width : WRAPPED;
+	int base = 0;
+	char *p, align[9];
+	const char *my_t = trailer;
+	char *fill = fill_spaces(src);
+	int last = (int) strlen(fill);
+
+	need = last;
+
+	if (TcOutput())
+	    trailer = "\\\n\t ";
+
+	if (!TcOutput() && (p = strchr(fill, '=')) != 0) {
+	    base = (int) (p + 1 - fill);
+	    if (base > 8)
+		base = 8;
+	    _nc_SPRINTF(align, _nc_SLIMIT(align) "%*s", base, " ");
+	} else if (column > 8) {
+	    base = column - 8;
+	    if (base > 8)
+		base = 8;
+	    _nc_SPRINTF(align, _nc_SLIMIT(align) "%*s", base, " ");
+	} else {
+	    align[base] = '\0';
+	}
+	/* "pretty" overrides wrapping if it already split the line */
+	if (!pretty || strchr(fill, '\n') == 0) {
+	    int tag = 0;
+
+	    if (TcOutput() && outbuf.used && !wrap_1ST(mode)) {
+		tag = 3;
+	    }
+
+	    while ((column + (need + gaps)) > used) {
+		int size = used - tag;
+		if (step) {
+		    strcpy_DYN(&outbuf, align);
+		    size -= base;
+		}
+		if (size > (last - step)) {
+		    size = (last - step);
+		}
+		size = find_split(fill, step, size);
+		strncpy_DYN(&outbuf, fill + step, (size_t) size);
+		step += size;
+		need -= size;
+		if (need > 0) {
+		    force_wrap();
+		    did_wrap = TRUE;
+		    tag = 0;
+		}
+	    }
+	}
+	if (need > 0) {
+	    if (step)
+		strcpy_DYN(&outbuf, align);
+	    strcpy_DYN(&outbuf, fill + step);
+	}
+	if (wrap_END(mode))
+	    strcpy_DYN(&outbuf, separator);
+	trailer = my_t;
+	force_wrap();
+
+	free(fill);
+    } else {
+	strcpy_DYN(&outbuf, src);
+	if (wrap_END(mode))
+	    strcpy_DYN(&outbuf, separator);
+	column += (int) strlen(src);
+    }
+}
+
+static void
+wrap_concat1(const char *src)
+{
+    int need = (int) strlen(src);
+    wrap_concat(src, need, w1ST | wEND);
+}
+
+static void
+wrap_concat3(const char *name, const char *eqls, const char *value)
+{
+    int nlen = (int) strlen(name);
+    int elen = (int) strlen(eqls);
+    int vlen = (int) strlen(value);
+
+    wrap_concat(name, nlen + elen + vlen, w1ST);
+    wrap_concat(eqls, elen + vlen, w2ND);
+    wrap_concat(value, vlen, wEND);
+}
+
+#define IGNORE_SEP_TRAIL(first,last,sep_trail) \
+	if ((size_t)(last - first) > sizeof(sep_trail)-1 \
+	 && !strncmp(first, sep_trail, sizeof(sep_trail)-1)) \
+		first += sizeof(sep_trail)-2
+
+/* Returns the nominal length of the buffer assuming it is termcap format,
+ * i.e., the continuation sequence is treated as a single character ":".
+ *
+ * There are several implementations of termcap which read the text into a
+ * fixed-size buffer.  Generally they strip the newlines from the text, but may
+ * not do it until after the buffer is read.  Also, "tc=" resolution may be
+ * expanded in the same buffer.  This function is useful for measuring the size
+ * of the best fixed-buffer implementation; the worst case may be much worse.
+ */
+#ifdef TEST_TERMCAP_LENGTH
+static int
+termcap_length(const char *src)
+{
+    static const char pattern[] = ":\\\n\t:";
+
+    int len = 0;
+    const char *const t = src + strlen(src);
+
+    while (*src != '\0') {
+	IGNORE_SEP_TRAIL(src, t, pattern);
+	src++;
+	len++;
+    }
+    return len;
+}
+#else
+#define termcap_length(src) strlen(src)
+#endif
+
+static void
+indent_DYN(DYNBUF * buffer, int level)
+{
+    int n;
+
+    for (n = 0; n < level; n++)
+	strncpy_DYN(buffer, "\t", (size_t) 1);
+}
+
+/*
+ * Check if the current line which was begun consists only of a tab and the
+ * given leading text.
+ */
+static bool
+leading_DYN(DYNBUF * buffer, const char *leading)
+{
+    bool result = FALSE;
+    size_t need = strlen(leading);
+    if (buffer->used > need) {
+	need = buffer->used - need;
+	if (!strcmp(buffer->text + need, leading)) {
+	    result = TRUE;
+	    while (--need != 0) {
+		if (buffer->text[need] == '\n') {
+		    break;
+		}
+		if (buffer->text[need] != '\t') {
+		    result = FALSE;
+		    break;
+		}
+	    }
+	}
+    }
+    return result;
+}
+
+bool
+has_params(const char *src, bool formatting)
+{
+    bool result = FALSE;
+    int len = (int) strlen(src);
+    int n;
+    bool ifthen = FALSE;
+    bool params = FALSE;
+
+    for (n = 0; n < len - 1; ++n) {
+	if (!strncmp(src + n, "%p", (size_t) 2)) {
+	    params = TRUE;
+	} else if (!strncmp(src + n, "%;", (size_t) 2)) {
+	    ifthen = TRUE;
+	    result = params;
+	    break;
+	}
+    }
+    if (!ifthen) {
+	if (formatting) {
+	    result = ((len > 50) && params);
+	} else {
+	    result = params;
+	}
+    }
+    return result;
+}
+
+static char *
+fmt_complex(TERMTYPE2 *tterm, const char *capability, char *src, int level)
+{
+    bool percent = FALSE;
+    bool params = has_params(src, TRUE);
+
+    while (*src != '\0') {
+	switch (*src) {
+	case '^':
+	    percent = FALSE;
+	    strncpy_DYN(&tmpbuf, src++, (size_t) 1);
+	    break;
+	case '\\':
+	    percent = FALSE;
+	    strncpy_DYN(&tmpbuf, src++, (size_t) 1);
+	    break;
+	case '%':
+	    percent = TRUE;
+	    break;
+	case '?':		/* "if" */
+	case 't':		/* "then" */
+	case 'e':		/* "else" */
+	    if (percent) {
+		percent = FALSE;
+		tmpbuf.text[tmpbuf.used - 1] = '\n';
+		/* treat a "%e" as else-if, on the same level */
+		if (*src == 'e') {
+		    indent_DYN(&tmpbuf, level);
+		    strncpy_DYN(&tmpbuf, "%", (size_t) 1);
+		    strncpy_DYN(&tmpbuf, src, (size_t) 1);
+		    src++;
+		    params = has_params(src, TRUE);
+		    if (!params && *src != '\0' && *src != '%') {
+			strncpy_DYN(&tmpbuf, "\n", (size_t) 1);
+			indent_DYN(&tmpbuf, level + 1);
+		    }
+		} else {
+		    indent_DYN(&tmpbuf, level + 1);
+		    strncpy_DYN(&tmpbuf, "%", (size_t) 1);
+		    strncpy_DYN(&tmpbuf, src, (size_t) 1);
+		    if (*src++ == '?') {
+			src = fmt_complex(tterm, capability, src, level + 1);
+			if (*src != '\0' && *src != '%') {
+			    strncpy_DYN(&tmpbuf, "\n", (size_t) 1);
+			    indent_DYN(&tmpbuf, level + 1);
+			}
+		    } else if (level == 1) {
+			if (checking)
+			    _nc_warning("%s: %%%c without %%? in %s",
+					_nc_first_name(tterm->term_names),
+					*src, capability);
+		    }
+		}
+		continue;
+	    }
+	    break;
+	case ';':		/* "endif" */
+	    if (percent) {
+		percent = FALSE;
+		if (level > 1) {
+		    tmpbuf.text[tmpbuf.used - 1] = '\n';
+		    indent_DYN(&tmpbuf, level);
+		    strncpy_DYN(&tmpbuf, "%", (size_t) 1);
+		    strncpy_DYN(&tmpbuf, src++, (size_t) 1);
+		    if (src[0] == '%'
+			&& src[1] != '\0'
+			&& (strchr("?e;", src[1])) == 0) {
+			tmpbuf.text[tmpbuf.used++] = '\n';
+			indent_DYN(&tmpbuf, level);
+		    }
+		    return src;
+		}
+		if (checking)
+		    _nc_warning("%s: %%; without %%? in %s",
+				_nc_first_name(tterm->term_names),
+				capability);
+	    }
+	    break;
+	case 'p':
+	    if (percent && params && !leading_DYN(&tmpbuf, "%")) {
+		tmpbuf.text[tmpbuf.used - 1] = '\n';
+		indent_DYN(&tmpbuf, level + 1);
+		strncpy_DYN(&tmpbuf, "%", (size_t) 1);
+	    }
+	    percent = FALSE;
+	    break;
+	case ' ':
+	    strncpy_DYN(&tmpbuf, "\\s", (size_t) 2);
+	    ++src;
+	    continue;
+	default:
+	    percent = FALSE;
+	    break;
+	}
+	strncpy_DYN(&tmpbuf, src++, (size_t) 1);
+    }
+    return src;
+}
+
+/*
+ * Make "large" numbers a little easier to read by showing them in hexadecimal
+ * if they are "close" to a power of two.
+ */
+static const char *
+number_format(int value)
+{
+    const char *result = "%d";
+
+    if ((outform != F_TERMCAP) && (value > 255)) {
+	unsigned long lv = (unsigned long) value;
+	int bits = sizeof(unsigned long) * 8;
+	int nn;
+
+	for (nn = 8; nn < bits; ++nn) {
+	    unsigned long mm;
+
+	    mm = 1UL << nn;
+	    if ((mm - 16) <= lv && (mm + 16) > lv) {
+		result = "%#x";
+		break;
+	    }
+	}
+    }
+    return result;
+}
+
+#define SAME_CAP(n,cap) (&tterm->Strings[n] == &cap)
+#define EXTRA_CAP 20
+
+int
+fmt_entry(TERMTYPE2 *tterm,
+	  PredFunc pred,
+	  int content_only,
+	  int suppress_untranslatable,
+	  int infodump,
+	  int numbers)
+{
+    PredIdx i, j;
+    char buffer[MAX_TERMINFO_LENGTH + EXTRA_CAP];
+    NCURSES_CONST char *name;
+    int predval, len;
+    PredIdx num_bools = 0;
+    PredIdx num_values = 0;
+    PredIdx num_strings = 0;
+    bool outcount = 0;
+
+#define WRAP_CONCAT1(s)		wrap_concat1(s); outcount = TRUE
+#define WRAP_CONCAT		WRAP_CONCAT1(buffer)
+
+    len = 12;			/* terminfo file-header */
+
+    if (pred == 0) {
+	cur_type = tterm;
+	pred = dump_predicate;
+    }
+
+    strcpy_DYN(&outbuf, 0);
+    if (content_only) {
+	column = indent;	/* FIXME: workaround to prevent empty lines */
+    } else {
+	strcpy_DYN(&outbuf, tterm->term_names);
+
+	/*
+	 * Colon is legal in terminfo descriptions, but not in termcap.
+	 */
+	if (!infodump) {
+	    char *p = outbuf.text;
+	    while (*p) {
+		if (*p == ':') {
+		    *p = '=';
+		}
+		++p;
+	    }
+	}
+	strcpy_DYN(&outbuf, separator);
+	column = (int) outbuf.used;
+	if (height > 1)
+	    force_wrap();
+    }
+
+    for_each_boolean(j, tterm) {
+	i = BoolIndirect(j);
+	name = ExtBoolname(tterm, (int) i, bool_names);
+	assert(strlen(name) < sizeof(buffer) - EXTRA_CAP);
+
+	if (!version_filter(BOOLEAN, i))
+	    continue;
+	else if (isObsolete(outform, name))
+	    continue;
+
+	predval = pred(BOOLEAN, i);
+	if (predval != FAIL) {
+	    _nc_STRCPY(buffer, name, sizeof(buffer));
+	    if (predval <= 0)
+		_nc_STRCAT(buffer, "@", sizeof(buffer));
+	    else if (i + 1 > num_bools)
+		num_bools = i + 1;
+	    WRAP_CONCAT;
+	}
+    }
+
+    if (column != indent && height > 1)
+	force_wrap();
+
+    for_each_number(j, tterm) {
+	i = NumIndirect(j);
+	name = ExtNumname(tterm, (int) i, num_names);
+	assert(strlen(name) < sizeof(buffer) - EXTRA_CAP);
+
+	if (!version_filter(NUMBER, i))
+	    continue;
+	else if (isObsolete(outform, name))
+	    continue;
+
+	predval = pred(NUMBER, i);
+	if (predval != FAIL) {
+	    if (tterm->Numbers[i] < 0) {
+		_nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer))
+			    "%s@", name);
+	    } else {
+		size_t nn;
+		_nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer))
+			    "%s#", name);
+		nn = strlen(buffer);
+		_nc_SPRINTF(buffer + nn, _nc_SLIMIT(sizeof(buffer) - nn)
+			    number_format(tterm->Numbers[i]),
+			    tterm->Numbers[i]);
+		if (i + 1 > num_values)
+		    num_values = i + 1;
+	    }
+	    WRAP_CONCAT;
+	}
+    }
+
+    if (column != indent && height > 1)
+	force_wrap();
+
+    len += (int) (num_bools
+		  + num_values * 2
+		  + strlen(tterm->term_names) + 1);
+    if (len & 1)
+	len++;
+
+#undef CUR
+#define CUR tterm->
+    if (outform == F_TERMCAP) {
+	if (VALID_STRING(termcap_reset)) {
+	    if (VALID_STRING(init_3string)
+		&& !strcmp(init_3string, termcap_reset))
+		DISCARD(init_3string);
+
+	    if (VALID_STRING(reset_2string)
+		&& !strcmp(reset_2string, termcap_reset))
+		DISCARD(reset_2string);
+	}
+    }
+
+    for_each_string(j, tterm) {
+	char *capability;
+	i = StrIndirect(j);
+	name = ExtStrname(tterm, (int) i, str_names);
+	assert(strlen(name) < sizeof(buffer) - EXTRA_CAP);
+
+	capability = tterm->Strings[i];
+
+	if (!version_filter(STRING, i))
+	    continue;
+	else if (isObsolete(outform, name))
+	    continue;
+
+#if NCURSES_XNAMES
+	/*
+	 * Extended names can be longer than 2 characters, but termcap programs
+	 * cannot read those (filter them out).
+	 */
+	if (outform == F_TERMCAP && (strlen(name) > 2))
+	    continue;
+#endif
+
+	if (outform == F_TERMCAP) {
+	    /*
+	     * Some older versions of vi want rmir/smir to be defined
+	     * for ich/ich1 to work.  If they're not defined, force
+	     * them to be output as defined and empty.
+	     */
+	    if (PRESENT(insert_character) || PRESENT(parm_ich)) {
+		if (SAME_CAP(i, enter_insert_mode)
+		    && enter_insert_mode == ABSENT_STRING) {
+		    _nc_STRCPY(buffer, "im=", sizeof(buffer));
+		    WRAP_CONCAT;
+		    continue;
+		}
+
+		if (SAME_CAP(i, exit_insert_mode)
+		    && exit_insert_mode == ABSENT_STRING) {
+		    _nc_STRCPY(buffer, "ei=", sizeof(buffer));
+		    WRAP_CONCAT;
+		    continue;
+		}
+	    }
+	    /*
+	     * termcap applications such as screen will be confused if sgr0
+	     * is translated to a string containing rmacs.  Filter that out.
+	     */
+	    if (PRESENT(exit_attribute_mode)) {
+		if (SAME_CAP(i, exit_attribute_mode)) {
+		    char *trimmed_sgr0;
+		    char *my_sgr = set_attributes;
+
+		    set_attributes = save_sgr;
+
+		    trimmed_sgr0 = _nc_trim_sgr0(tterm);
+		    if (strcmp(capability, trimmed_sgr0)) {
+			capability = trimmed_sgr0;
+		    } else {
+			if (trimmed_sgr0 != exit_attribute_mode)
+			    free(trimmed_sgr0);
+		    }
+
+		    set_attributes = my_sgr;
+		}
+	    }
+	}
+
+	predval = pred(STRING, i);
+	buffer[0] = '\0';
+
+	if (predval != FAIL) {
+	    if (VALID_STRING(capability)
+		&& i + 1 > num_strings)
+		num_strings = i + 1;
+
+	    if (!VALID_STRING(capability)) {
+		_nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer))
+			    "%s@", name);
+		WRAP_CONCAT;
+	    } else if (TcOutput()) {
+		char *srccap = _nc_tic_expand(capability, TRUE, numbers);
+		int params = ((i < (int) SIZEOF(parametrized))
+			      ? parametrized[i]
+			      : ((*srccap == 'k')
+				 ? 0
+				 : has_params(srccap, FALSE)));
+		char *cv = _nc_infotocap(name, srccap, params);
+
+		if (cv == 0) {
+		    if (outform == F_TCONVERR) {
+			_nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer))
+				    "%s=!!! %s WILL NOT CONVERT !!!",
+				    name, srccap);
+			WRAP_CONCAT;
+		    } else if (suppress_untranslatable) {
+			continue;
+		    } else {
+			char *s = srccap, *d = buffer;
+			int need = 3 + (int) strlen(name);
+			while ((*d = *s++) != 0) {
+			    if ((d - buffer + 2) >= (int) sizeof(buffer)) {
+				fprintf(stderr,
+					"%s: value for %s is too long\n",
+					_nc_progname,
+					name);
+				*d = '\0';
+				break;
+			    }
+			    if (*d == ':') {
+				*d++ = '\\';
+				*d = ':';
+			    } else if (*d == '\\') {
+				if ((*++d = *s++) == '\0')
+				    break;
+			    }
+			    d++;
+			    *d = '\0';
+			}
+			need += (int) (d - buffer);
+			wrap_concat("..", need, w1ST | wERR);
+			need -= 2;
+			wrap_concat(name, need, wOFF | wERR);
+			need -= (int) strlen(name);
+			wrap_concat("=", need, w2ND | wERR);
+			need -= 1;
+			wrap_concat(buffer, need, wEND | wERR);
+			outcount = TRUE;
+		    }
+		} else {
+		    wrap_concat3(name, "=", cv);
+		}
+		len += (int) strlen(capability) + 1;
+	    } else {
+		char *src = _nc_tic_expand(capability,
+					   outform == F_TERMINFO, numbers);
+
+		strcpy_DYN(&tmpbuf, 0);
+		strcpy_DYN(&tmpbuf, name);
+		strcpy_DYN(&tmpbuf, "=");
+		if (pretty
+		    && (outform == F_TERMINFO
+			|| outform == F_VARIABLE)) {
+		    fmt_complex(tterm, name, src, 1);
+		} else {
+		    strcpy_DYN(&tmpbuf, src);
+		}
+		len += (int) strlen(capability) + 1;
+		WRAP_CONCAT1(tmpbuf.text);
+	    }
+	}
+	/* e.g., trimmed_sgr0 */
+	if (VALID_STRING(capability) &&
+	    capability != tterm->Strings[i])
+	    free(capability);
+    }
+    len += (int) (num_strings * 2);
+
+    /*
+     * This piece of code should be an effective inverse of the functions
+     * postprocess_terminfo() and postprocess_terminfo() in parse_entry.c.
+     * Much more work should be done on this to support dumping termcaps.
+     */
+    if (tversion == V_HPUX) {
+	if (VALID_STRING(memory_lock)) {
+	    _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer))
+			"meml=%s", memory_lock);
+	    WRAP_CONCAT;
+	}
+	if (VALID_STRING(memory_unlock)) {
+	    _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer))
+			"memu=%s", memory_unlock);
+	    WRAP_CONCAT;
+	}
+    } else if (tversion == V_AIX) {
+	if (VALID_STRING(acs_chars)) {
+	    bool box_ok = TRUE;
+	    const char *acstrans = "lqkxjmwuvtn";
+	    const char *cp;
+	    char *tp, *sp, boxchars[11];
+
+	    tp = boxchars;
+	    for (cp = acstrans; *cp; cp++) {
+		sp = (strchr) (acs_chars, *cp);
+		if (sp)
+		    *tp++ = sp[1];
+		else {
+		    box_ok = FALSE;
+		    break;
+		}
+	    }
+	    tp[0] = '\0';
+
+	    if (box_ok) {
+		char *tmp = _nc_tic_expand(boxchars,
+					   (outform == F_TERMINFO),
+					   numbers);
+		_nc_STRCPY(buffer, "box1=", sizeof(buffer));
+		while (*tmp != '\0') {
+		    size_t have = strlen(buffer);
+		    size_t next = strlen(tmp);
+		    size_t want = have + next + 1;
+		    size_t last = next;
+		    char save = '\0';
+
+		    /*
+		     * If the expanded string is too long for the buffer,
+		     * chop it off and save the location where we chopped it.
+		     */
+		    if (want >= sizeof(buffer)) {
+			save = tmp[last];
+			tmp[last] = '\0';
+		    }
+		    _nc_STRCAT(buffer, tmp, sizeof(buffer));
+
+		    /*
+		     * If we chopped the buffer, replace the missing piece and
+		     * shift everything to append the remainder.
+		     */
+		    if (save != '\0') {
+			next = 0;
+			tmp[last] = save;
+			while ((tmp[next] = tmp[last + next]) != '\0') {
+			    ++next;
+			}
+		    } else {
+			break;
+		    }
+		}
+		WRAP_CONCAT;
+	    }
+	}
+    }
+
+    /*
+     * kludge: trim off trailer to avoid an extra blank line
+     * in infocmp -u output when there are no string differences
+     */
+    if (outcount) {
+	bool trimmed = FALSE;
+	j = (PredIdx) outbuf.used;
+	if (wrapped && did_wrap) {
+	    /* EMPTY */ ;
+	} else if (j >= 2
+		   && outbuf.text[j - 1] == '\t'
+		   && outbuf.text[j - 2] == '\n') {
+	    outbuf.used -= 2;
+	    trimmed = TRUE;
+	} else if (j >= 4
+		   && outbuf.text[j - 1] == ':'
+		   && outbuf.text[j - 2] == '\t'
+		   && outbuf.text[j - 3] == '\n'
+		   && outbuf.text[j - 4] == '\\') {
+	    outbuf.used -= 4;
+	    trimmed = TRUE;
+	}
+	if (trimmed) {
+	    outbuf.text[outbuf.used] = '\0';
+	    column = oldcol;
+	    strcpy_DYN(&outbuf, " ");
+	}
+    }
+#if 0
+    fprintf(stderr, "num_bools = %d\n", num_bools);
+    fprintf(stderr, "num_values = %d\n", num_values);
+    fprintf(stderr, "num_strings = %d\n", num_strings);
+    fprintf(stderr, "term_names=%s, len=%d, strlen(outbuf)=%d, outbuf=%s\n",
+	    tterm->term_names, len, outbuf.used, outbuf.text);
+#endif
+    /*
+     * Here's where we use infodump to trigger a more stringent length check
+     * for termcap-translation purposes.
+     * Return the length of the raw entry, without tc= expansions,
+     * It gives an idea of which entries are deadly to even *scan past*,
+     * as opposed to *use*.
+     */
+    return (infodump ? len : (int) termcap_length(outbuf.text));
+}
+
+static bool
+kill_string(TERMTYPE2 *tterm, char *cap)
+{
+    unsigned n;
+    for (n = 0; n < NUM_STRINGS(tterm); ++n) {
+	if (cap == tterm->Strings[n]) {
+	    tterm->Strings[n] = ABSENT_STRING;
+	    return TRUE;
+	}
+    }
+    return FALSE;
+}
+
+static char *
+find_string(TERMTYPE2 *tterm, char *name)
+{
+    PredIdx n;
+    for (n = 0; n < NUM_STRINGS(tterm); ++n) {
+	if (version_filter(STRING, n)
+	    && !strcmp(name, strnames[n])) {
+	    char *cap = tterm->Strings[n];
+	    if (VALID_STRING(cap)) {
+		return cap;
+	    }
+	    break;
+	}
+    }
+    return ABSENT_STRING;
+}
+
+/*
+ * This is used to remove function-key labels from a termcap entry to
+ * make it smaller.
+ */
+static int
+kill_labels(TERMTYPE2 *tterm, int target)
+{
+    int n;
+    int result = 0;
+    char name[20];
+
+    for (n = 0; n <= 10; ++n) {
+	char *cap;
+
+	_nc_SPRINTF(name, _nc_SLIMIT(sizeof(name)) "lf%d", n);
+	cap = find_string(tterm, name);
+	if (VALID_STRING(cap)
+	    && kill_string(tterm, cap)) {
+	    target -= (int) (strlen(cap) + 5);
+	    ++result;
+	    if (target < 0)
+		break;
+	}
+    }
+    return result;
+}
+
+/*
+ * This is used to remove function-key definitions from a termcap entry to
+ * make it smaller.
+ */
+static int
+kill_fkeys(TERMTYPE2 *tterm, int target)
+{
+    int n;
+    int result = 0;
+    char name[20];
+
+    for (n = 60; n >= 0; --n) {
+	char *cap;
+
+	_nc_SPRINTF(name, _nc_SLIMIT(sizeof(name)) "kf%d", n);
+	cap = find_string(tterm, name);
+	if (VALID_STRING(cap)
+	    && kill_string(tterm, cap)) {
+	    target -= (int) (strlen(cap) + 5);
+	    ++result;
+	    if (target < 0)
+		break;
+	}
+    }
+    return result;
+}
+
+/*
+ * Check if the given acsc string is a 1-1 mapping, i.e., just-like-vt100.
+ * Also, since this is for termcap, we only care about the line-drawing map.
+ */
+#define isLine(c) (strchr("lmkjtuvwqxn", c) != 0)
+
+static bool
+one_one_mapping(const char *mapping)
+{
+    bool result = TRUE;
+
+    if (VALID_STRING(mapping)) {
+	int n = 0;
+	while (mapping[n] != '\0' && mapping[n + 1] != '\0') {
+	    if (isLine(mapping[n]) &&
+		mapping[n] != mapping[n + 1]) {
+		result = FALSE;
+		break;
+	    }
+	    n += 2;
+	}
+    }
+    return result;
+}
+
+#define FMT_ENTRY() \
+		fmt_entry(tterm, pred, \
+			0, \
+			suppress_untranslatable, \
+			infodump, numbers)
+
+#define SHOW_WHY PRINTF
+
+static bool
+purged_acs(TERMTYPE2 *tterm)
+{
+    bool result = FALSE;
+
+    if (VALID_STRING(acs_chars)) {
+	if (!one_one_mapping(acs_chars)) {
+	    enter_alt_charset_mode = ABSENT_STRING;
+	    exit_alt_charset_mode = ABSENT_STRING;
+	    SHOW_WHY("# (rmacs/smacs removed for consistency)\n");
+	}
+	result = TRUE;
+    }
+    return result;
+}
+
+static void
+encode_b64(char *target, char *source, unsigned state, int *saved)
+{
+    /* RFC-4648 */
+    static const char data[] =
+    "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+    "abcdefghijklmnopqrstuvwxyz"
+    "0123456789" "-_";
+    int ch = UChar(source[state]);
+
+    switch (state % 3) {
+    case 0:
+	*target++ = data[(ch >> 2) & 077];
+	*saved = (ch << 4);
+	break;
+    case 1:
+	*target++ = data[((ch >> 4) | *saved) & 077];
+	*saved = (ch << 2);
+	break;
+    case 2:
+	*target++ = data[((ch >> 6) | *saved) & 077];
+	*target++ = data[ch & 077];
+	*saved = 0;
+	break;
+    }
+    *target = '\0';
+}
+
+/*
+ * Dump a single entry.
+ */
+void
+dump_entry(TERMTYPE2 *tterm,
+	   int suppress_untranslatable,
+	   int limited,
+	   int numbers,
+	   PredFunc pred)
+{
+    TERMTYPE2 save_tterm;
+    int critlen;
+    const char *legend;
+    bool infodump;
+
+    if (quickdump) {
+	char bigbuf[65536];
+	unsigned offset = 0;
+
+	separator = "";
+	trailer = "\n";
+	indent = 0;
+
+	if (_nc_write_object(tterm, bigbuf, &offset, sizeof(bigbuf)) == OK) {
+	    char numbuf[80];
+	    unsigned n;
+
+	    if (quickdump & 1) {
+		if (outbuf.used)
+		    wrap_concat1("\n");
+		wrap_concat1("hex:");
+		for (n = 0; n < offset; ++n) {
+		    _nc_SPRINTF(numbuf, _nc_SLIMIT(sizeof(numbuf))
+				"%02X", UChar(bigbuf[n]));
+		    wrap_concat1(numbuf);
+		}
+	    }
+	    if (quickdump & 2) {
+		static char padding[] =
+		{0, 0};
+		int value = 0;
+
+		if (outbuf.used)
+		    wrap_concat1("\n");
+		wrap_concat1("b64:");
+		for (n = 0; n < offset; ++n) {
+		    encode_b64(numbuf, bigbuf, n, &value);
+		    wrap_concat1(numbuf);
+		}
+		switch (n % 3) {
+		case 0:
+		    break;
+		case 1:
+		    encode_b64(numbuf, padding, 1, &value);
+		    wrap_concat1(numbuf);
+		    wrap_concat1("==");
+		    break;
+		case 2:
+		    encode_b64(numbuf, padding, 1, &value);
+		    wrap_concat1(numbuf);
+		    wrap_concat1("=");
+		    break;
+		}
+	    }
+	}
+	return;
+    }
+
+    if (TcOutput()) {
+	critlen = MAX_TERMCAP_LENGTH;
+	legend = "older termcap";
+	infodump = FALSE;
+	set_obsolete_termcaps(tterm);
+    } else {
+	critlen = MAX_TERMINFO_LENGTH;
+	legend = "terminfo";
+	infodump = TRUE;
+    }
+
+    save_sgr = set_attributes;
+
+    if ((FMT_ENTRY() > critlen)
+	&& limited) {
+
+	save_tterm = *tterm;
+	if (!suppress_untranslatable) {
+	    SHOW_WHY("# (untranslatable capabilities removed to fit entry within %d bytes)\n",
+		     critlen);
+	    suppress_untranslatable = TRUE;
+	}
+	if (FMT_ENTRY() > critlen) {
+	    /*
+	     * We pick on sgr because it is a nice long string capability that
+	     * is really just an optimization hack.  Another good candidate is
+	     * acsc since it is both long and unused by BSD termcap.
+	     */
+	    bool changed = FALSE;
+
+#if NCURSES_XNAMES
+	    /*
+	     * Extended names are most likely function-key definitions.  Drop
+	     * those first.
+	     */
+	    unsigned n;
+	    for (n = STRCOUNT; n < NUM_STRINGS(tterm); n++) {
+		const char *name = ExtStrname(tterm, (int) n, strnames);
+
+		if (VALID_STRING(tterm->Strings[n])) {
+		    set_attributes = ABSENT_STRING;
+		    /* we remove long names anyway - only report the short */
+		    if (strlen(name) <= 2) {
+			SHOW_WHY("# (%s removed to fit entry within %d bytes)\n",
+				 name,
+				 critlen);
+		    }
+		    changed = TRUE;
+		    if (FMT_ENTRY() <= critlen)
+			break;
+		}
+	    }
+#endif
+	    if (VALID_STRING(set_attributes)) {
+		set_attributes = ABSENT_STRING;
+		SHOW_WHY("# (sgr removed to fit entry within %d bytes)\n",
+			 critlen);
+		changed = TRUE;
+	    }
+	    if (!changed || (FMT_ENTRY() > critlen)) {
+		if (purged_acs(tterm)) {
+		    acs_chars = ABSENT_STRING;
+		    SHOW_WHY("# (acsc removed to fit entry within %d bytes)\n",
+			     critlen);
+		    changed = TRUE;
+		}
+	    }
+	    if (!changed || (FMT_ENTRY() > critlen)) {
+		int oldversion = tversion;
+		int len;
+
+		tversion = V_BSD;
+		SHOW_WHY("# (terminfo-only capabilities suppressed to fit entry within %d bytes)\n",
+			 critlen);
+
+		len = FMT_ENTRY();
+		if (len > critlen
+		    && kill_labels(tterm, len - critlen)) {
+		    SHOW_WHY("# (some labels capabilities suppressed to fit entry within %d bytes)\n",
+			     critlen);
+		    len = FMT_ENTRY();
+		}
+		if (len > critlen
+		    && kill_fkeys(tterm, len - critlen)) {
+		    SHOW_WHY("# (some function-key capabilities suppressed to fit entry within %d bytes)\n",
+			     critlen);
+		    len = FMT_ENTRY();
+		}
+		if (len > critlen) {
+		    (void) fprintf(stderr,
+				   "%s: %s entry is %d bytes long\n",
+				   _nc_progname,
+				   _nc_first_name(tterm->term_names),
+				   len);
+		    SHOW_WHY("# WARNING: this entry, %d bytes long, may core-dump %s libraries!\n",
+			     len, legend);
+		}
+		tversion = oldversion;
+	    }
+	    set_attributes = save_sgr;
+	    *tterm = save_tterm;
+	}
+    } else if (!version_filter(STRING, STR_IDX(acs_chars))) {
+	save_tterm = *tterm;
+	if (purged_acs(tterm)) {
+	    (void) FMT_ENTRY();
+	}
+	*tterm = save_tterm;
+    }
+}
+
+void
+dump_uses(const char *name, bool infodump)
+/* dump "use=" clauses in the appropriate format */
+{
+    char buffer[MAX_TERMINFO_LENGTH];
+
+    if (TcOutput())
+	trim_trailing();
+    _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer))
+		"%s%s", infodump ? "use=" : "tc=", name);
+    wrap_concat1(buffer);
+}
+
+int
+show_entry(void)
+{
+    /*
+     * Trim any remaining whitespace.
+     */
+    if (outbuf.used != 0) {
+	bool infodump = !TcOutput();
+	char delim = (char) (infodump ? ',' : ':');
+	int j;
+
+	for (j = (int) outbuf.used - 1; j > 0; --j) {
+	    char ch = outbuf.text[j];
+	    if (ch == '\n') {
+		;
+	    } else if (isspace(UChar(ch))) {
+		outbuf.used = (size_t) j;
+	    } else if (!infodump && ch == '\\') {
+		outbuf.used = (size_t) j;
+	    } else if (ch == delim && (j == 0 || outbuf.text[j - 1] != '\\')) {
+		outbuf.used = (size_t) (j + 1);
+	    } else {
+		break;
+	    }
+	}
+	outbuf.text[outbuf.used] = '\0';
+    }
+    if (outbuf.text != 0) {
+	(void) fputs(outbuf.text, stdout);
+	putchar('\n');
+    }
+    return (int) outbuf.used;
+}
+
+void
+compare_entry(PredHook hook,
+	      TERMTYPE2 *tp GCC_UNUSED,
+	      bool quiet)
+/* compare two entries */
+{
+    PredIdx i, j;
+    NCURSES_CONST char *name;
+
+    if (!quiet)
+	fputs("    comparing booleans.\n", stdout);
+    for_each_boolean(j, tp) {
+	i = BoolIndirect(j);
+	name = ExtBoolname(tp, (int) i, bool_names);
+
+	if (isObsolete(outform, name))
+	    continue;
+
+	(*hook) (CMP_BOOLEAN, i, name);
+    }
+
+    if (!quiet)
+	fputs("    comparing numbers.\n", stdout);
+    for_each_number(j, tp) {
+	i = NumIndirect(j);
+	name = ExtNumname(tp, (int) i, num_names);
+
+	if (isObsolete(outform, name))
+	    continue;
+
+	(*hook) (CMP_NUMBER, i, name);
+    }
+
+    if (!quiet)
+	fputs("    comparing strings.\n", stdout);
+    for_each_string(j, tp) {
+	i = StrIndirect(j);
+	name = ExtStrname(tp, (int) i, str_names);
+
+	if (isObsolete(outform, name))
+	    continue;
+
+	(*hook) (CMP_STRING, i, name);
+    }
+
+    /* (void) fputs("    comparing use entries.\n", stdout); */
+    (*hook) (CMP_USE, 0, "use");
+
+}
+
+#define NOTSET(s)	((s) == 0)
+
+/*
+ * This bit of legerdemain turns all the terminfo variable names into
+ * references to locations in the arrays Booleans, Numbers, and Strings ---
+ * precisely what's needed.
+ */
+#undef CUR
+#define CUR tp->
+
+static void
+set_obsolete_termcaps(TERMTYPE2 *tp)
+{
+#include "capdefaults.c"
+}
+
+/*
+ * Convert an alternate-character-set string to canonical form: sorted and
+ * unique.
+ */
+void
+repair_acsc(TERMTYPE2 *tp)
+{
+    if (VALID_STRING(acs_chars)) {
+	size_t n;
+	char mapped[256];
+	unsigned source;
+	unsigned target;
+	bool fix_needed = FALSE;
+
+	for (n = 0, source = 0; acs_chars[n] != 0; n++) {
+	    target = UChar(acs_chars[n]);
+	    if (source >= target) {
+		fix_needed = TRUE;
+		break;
+	    }
+	    source = target;
+	    if (acs_chars[n + 1])
+		n++;
+	}
+
+	if (fix_needed) {
+	    size_t m;
+	    char extra = 0;
+
+	    memset(mapped, 0, sizeof(mapped));
+	    for (n = 0; acs_chars[n] != 0; n++) {
+		source = UChar(acs_chars[n]);
+		if ((target = (unsigned char) acs_chars[n + 1]) != 0) {
+		    mapped[source] = (char) target;
+		    n++;
+		} else {
+		    extra = (char) source;
+		}
+	    }
+	    for (n = m = 0; n < sizeof(mapped); n++) {
+		if (mapped[n]) {
+		    acs_chars[m++] = (char) n;
+		    acs_chars[m++] = mapped[n];
+		}
+	    }
+	    if (extra)
+		acs_chars[m++] = extra;		/* garbage in, garbage out */
+	    acs_chars[m] = 0;
+	}
+    }
+}
diff --git a/progs/dump_entry.h b/progs/dump_entry.h
new file mode 100644
index 0000000..39e856f
--- /dev/null
+++ b/progs/dump_entry.h
@@ -0,0 +1,94 @@
+/****************************************************************************
+ * Copyright 2018-2020,2021 Thomas E. Dickey                                *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ ****************************************************************************/
+
+/*
+ * $Id: dump_entry.h,v 1.44 2021/04/18 19:56:09 tom Exp $
+ *
+ * Dump control definitions and variables
+ */
+
+#ifndef DUMP_ENTRY_H
+#define DUMP_ENTRY_H 1
+
+#define NCURSES_OPAQUE    0
+#define NCURSES_INTERNALS 1
+#include <curses.h>
+#include <term.h>
+
+/* capability output formats */
+#define F_TERMINFO	0	/* use terminfo names */
+#define F_VARIABLE	1	/* use C variable names */
+#define F_TERMCAP	2	/* termcap names with capability conversion */
+#define F_TCONVERR	3	/* as T_TERMCAP, no skip of untranslatables */
+#define F_LITERAL	4	/* like F_TERMINFO, but no smart defaults */
+
+/* capability sort modes */
+#define S_DEFAULT	0	/* sort by terminfo name (implicit) */
+#define S_NOSORT	1	/* don't sort */
+#define S_TERMINFO	2	/* sort by terminfo names (explicit) */
+#define S_VARIABLE	3	/* sort by C variable names */
+#define S_TERMCAP	4	/* sort by termcap names */
+
+/* capability types for the comparison hook */
+#define CMP_BOOLEAN	0	/* comparison on booleans */
+#define CMP_NUMBER	1	/* comparison on numerics */
+#define CMP_STRING	2	/* comparison on strings */
+#define CMP_USE		3	/* comparison on use capabilities */
+
+#ifndef _TERMSORT_H
+typedef unsigned PredType;
+typedef unsigned PredIdx;
+#endif
+
+typedef int (*PredFunc) (PredType, PredIdx);
+typedef void (*PredHook) (PredType, PredIdx, const char *);
+
+extern NCURSES_CONST char *nametrans(const char *);
+extern bool has_params(const char *, bool);
+extern int fmt_entry(TERMTYPE2 *, PredFunc, int, int, int, int);
+extern int show_entry(void);
+extern void compare_entry(PredHook, TERMTYPE2 *, bool);
+extern void dump_entry(TERMTYPE2 *, int, int, int, PredFunc);
+extern void dump_init(const char *, int, int, bool, int, int, unsigned, bool,
+		      bool, int);
+extern void dump_uses(const char *, bool);
+extern void repair_acsc(TERMTYPE2 *tp);
+
+#define L_CURL "{"
+#define R_CURL "}"
+
+#define FAIL	-1
+
+#endif /* DUMP_ENTRY_H */
diff --git a/progs/infocmp.c b/progs/infocmp.c
new file mode 100644
index 0000000..171d794
--- /dev/null
+++ b/progs/infocmp.c
@@ -0,0 +1,1963 @@
+/****************************************************************************
+ * Copyright 2020-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ ****************************************************************************/
+
+/*
+ *	infocmp.c -- decompile an entry, or compare two entries
+ *		written by Eric S. Raymond
+ *		and Thomas E Dickey
+ */
+
+#include <progs.priv.h>
+
+#include <dump_entry.h>
+
+MODULE_ID("$Id: infocmp.c,v 1.156 2022/09/24 10:13:06 tom Exp $")
+
+#define MAX_STRING	1024	/* maximum formatted string */
+
+const char *_nc_progname = "infocmp";
+
+typedef char path[PATH_MAX];
+
+/***************************************************************************
+ *
+ * The following control variables, together with the contents of the
+ * terminfo entries, completely determine the actions of the program.
+ *
+ ***************************************************************************/
+
+static ENTRY *entries;		/* terminfo entries */
+static int termcount;		/* count of terminal entries */
+
+static bool limited = TRUE;	/* "-r" option is not set */
+static bool quiet = FALSE;
+static bool literal = FALSE;
+static const char *bool_sep = ":";
+static const char *s_absent = "NULL";
+static const char *s_cancel = "NULL";
+static const char *tversion;	/* terminfo version selected */
+static unsigned itrace;		/* trace flag for debugging */
+static int mwidth = 60;
+static int mheight = 65535;
+static int numbers = 0;		/* format "%'char'" to/from "%{number}" */
+static int outform = F_TERMINFO;	/* output format */
+static int sortmode;		/* sort_mode */
+
+/* main comparison mode */
+static int compare;
+#define C_DEFAULT	0	/* don't force comparison mode */
+#define C_DIFFERENCE	1	/* list differences between two terminals */
+#define C_COMMON	2	/* list common capabilities */
+#define C_NAND		3	/* list capabilities in neither terminal */
+#define C_USEALL	4	/* generate relative use-form entry */
+static bool ignorepads;		/* ignore pad prefixes when diffing */
+
+#if NO_LEAKS
+
+typedef struct {
+    ENTRY *head;
+    ENTRY *tail;
+} ENTERED;
+
+static ENTERED *entered;
+
+#undef ExitProgram
+static GCC_NORETURN void ExitProgram(int code);
+/* prototype is to get gcc to accept the noreturn attribute */
+static void
+ExitProgram(int code)
+{
+    int n;
+
+    for (n = 0; n < termcount; ++n) {
+	ENTRY *new_head = _nc_head;
+	ENTRY *new_tail = _nc_tail;
+	_nc_head = entered[n].head;
+	_nc_tail = entered[n].tail;
+	_nc_free_entries(entered[n].head);
+	_nc_head = new_head;
+	_nc_tail = new_tail;
+    }
+    _nc_leaks_dump_entry();
+    free(entries);
+    free(entered);
+    _nc_free_tic(code);
+}
+#endif
+
+static void
+failed(const char *s)
+{
+    perror(s);
+    ExitProgram(EXIT_FAILURE);
+}
+
+static void
+canonical_name(char *source, char *target)
+/* extract the terminal type's primary name */
+{
+    int limit = NAMESIZE;
+
+    while (--limit > 0) {
+	char ch = *source++;
+	if (ch == '|')
+	    break;
+	*target++ = ch;
+    }
+    *target = '\0';
+}
+
+static bool
+no_boolean(int value)
+{
+    bool result = (value == ABSENT_BOOLEAN);
+    if (!strcmp(s_absent, s_cancel))
+	result = !VALID_BOOLEAN(value);
+    return result;
+}
+
+static bool
+no_numeric(int value)
+{
+    bool result = (value == ABSENT_NUMERIC);
+    if (!strcmp(s_absent, s_cancel))
+	result = !VALID_NUMERIC(value);
+    return result;
+}
+
+static bool
+no_string(char *value)
+{
+    bool result = (value == ABSENT_STRING);
+    if (!strcmp(s_absent, s_cancel))
+	result = !VALID_STRING(value);
+    return result;
+}
+
+/***************************************************************************
+ *
+ * Predicates for dump function
+ *
+ ***************************************************************************/
+
+static int
+capcmp(PredIdx idx, const char *s, const char *t)
+/* capability comparison function */
+{
+    if (!VALID_STRING(s) && !VALID_STRING(t))
+	return (s != t);
+    else if (!VALID_STRING(s) || !VALID_STRING(t))
+	return (1);
+
+    if ((idx == acs_chars_index) || !ignorepads)
+	return (strcmp(s, t));
+    else
+	return (_nc_capcmp(s, t));
+}
+
+static int
+use_predicate(unsigned type, PredIdx idx)
+/* predicate function to use for use decompilation */
+{
+    ENTRY *ep;
+
+    switch (type) {
+    case BOOLEAN:
+	{
+	    int is_set = FALSE;
+
+	    /*
+	     * This assumes that multiple use entries are supposed
+	     * to contribute the logical or of their boolean capabilities.
+	     * This is true if we take the semantics of multiple uses to
+	     * be 'each capability gets the first non-default value found
+	     * in the sequence of use entries'.
+	     *
+	     * Note that cancelled or absent booleans are stored as FALSE,
+	     * unlike numbers and strings, whose cancelled/absent state is
+	     * recorded in the terminfo database.
+	     */
+	    for (ep = &entries[1]; ep < entries + termcount; ep++)
+		if (ep->tterm.Booleans[idx] == TRUE) {
+		    is_set = entries[0].tterm.Booleans[idx];
+		    break;
+		}
+	    if (is_set != entries[0].tterm.Booleans[idx])
+		return (!is_set);
+	    else
+		return (FAIL);
+	}
+
+    case NUMBER:
+	{
+	    int value = ABSENT_NUMERIC;
+
+	    /*
+	     * We take the semantics of multiple uses to be 'each
+	     * capability gets the first non-default value found
+	     * in the sequence of use entries'.
+	     */
+	    for (ep = &entries[1]; ep < entries + termcount; ep++)
+		if (VALID_NUMERIC(ep->tterm.Numbers[idx])) {
+		    value = ep->tterm.Numbers[idx];
+		    break;
+		}
+
+	    if (value != entries[0].tterm.Numbers[idx])
+		return (value != ABSENT_NUMERIC);
+	    else
+		return (FAIL);
+	}
+
+    case STRING:
+	{
+	    char *termstr, *usestr = ABSENT_STRING;
+
+	    termstr = entries[0].tterm.Strings[idx];
+
+	    /*
+	     * We take the semantics of multiple uses to be 'each
+	     * capability gets the first non-default value found
+	     * in the sequence of use entries'.
+	     */
+	    for (ep = &entries[1]; ep < entries + termcount; ep++)
+		if (ep->tterm.Strings[idx]) {
+		    usestr = ep->tterm.Strings[idx];
+		    break;
+		}
+
+	    if (usestr == ABSENT_STRING && termstr == ABSENT_STRING)
+		return (FAIL);
+	    else if (!usestr || !termstr || capcmp(idx, usestr, termstr))
+		return (TRUE);
+	    else
+		return (FAIL);
+	}
+    }
+
+    return (FALSE);		/* pacify compiler */
+}
+
+static bool
+useeq(ENTRY * e1, ENTRY * e2)
+/* are the use references in two entries equivalent? */
+{
+    unsigned i, j;
+
+    if (e1->nuses != e2->nuses)
+	return (FALSE);
+
+    /* Ugh...this is quadratic again */
+    for (i = 0; i < e1->nuses; i++) {
+	bool foundmatch = FALSE;
+
+	/* search second entry for given use reference */
+	for (j = 0; j < e2->nuses; j++)
+	    if (!strcmp(e1->uses[i].name, e2->uses[j].name)) {
+		foundmatch = TRUE;
+		break;
+	    }
+
+	if (!foundmatch)
+	    return (FALSE);
+    }
+
+    return (TRUE);
+}
+
+static bool
+entryeq(TERMTYPE2 *t1, TERMTYPE2 *t2)
+/* are two entries equivalent? */
+{
+    unsigned i;
+
+    for (i = 0; i < NUM_BOOLEANS(t1); i++)
+	if (t1->Booleans[i] != t2->Booleans[i])
+	    return (FALSE);
+
+    for (i = 0; i < NUM_NUMBERS(t1); i++)
+	if (t1->Numbers[i] != t2->Numbers[i])
+	    return (FALSE);
+
+    for (i = 0; i < NUM_STRINGS(t1); i++)
+	if (capcmp((PredIdx) i, t1->Strings[i], t2->Strings[i]))
+	    return (FALSE);
+
+    return (TRUE);
+}
+
+#define TIC_EXPAND(result) _nc_tic_expand(result, outform==F_TERMINFO, numbers)
+
+static void
+print_uses(ENTRY * ep, FILE *fp)
+/* print an entry's use references */
+{
+    if (!ep->nuses) {
+	fputs("NULL", fp);
+    } else {
+	unsigned i;
+
+	for (i = 0; i < ep->nuses; i++) {
+	    fputs(ep->uses[i].name, fp);
+	    if (i < ep->nuses - 1)
+		fputs(" ", fp);
+	}
+    }
+}
+
+static const char *
+dump_boolean(int val)
+/* display the value of a boolean capability */
+{
+    switch (val) {
+    case ABSENT_BOOLEAN:
+	return (s_absent);
+    case CANCELLED_BOOLEAN:
+	return (s_cancel);
+    case FALSE:
+	return ("F");
+    case TRUE:
+	return ("T");
+    default:
+	return ("?");
+    }
+}
+
+static void
+dump_numeric(int val, char *buf)
+/* display the value of a numeric capability */
+{
+    switch (val) {
+    case ABSENT_NUMERIC:
+	_nc_STRCPY(buf, s_absent, MAX_STRING);
+	break;
+    case CANCELLED_NUMERIC:
+	_nc_STRCPY(buf, s_cancel, MAX_STRING);
+	break;
+    default:
+	_nc_SPRINTF(buf, _nc_SLIMIT(MAX_STRING) "%d", val);
+	break;
+    }
+}
+
+static void
+dump_string(char *val, char *buf)
+/* display the value of a string capability */
+{
+    if (val == ABSENT_STRING)
+	_nc_STRCPY(buf, s_absent, MAX_STRING);
+    else if (val == CANCELLED_STRING)
+	_nc_STRCPY(buf, s_cancel, MAX_STRING);
+    else {
+	_nc_SPRINTF(buf, _nc_SLIMIT(MAX_STRING)
+		    "'%.*s'", MAX_STRING - 3, TIC_EXPAND(val));
+    }
+}
+
+/*
+ * Show "comparing..." message for the given terminal names.
+ */
+static void
+show_comparing(char **names)
+{
+    if (itrace) {
+	switch (compare) {
+	case C_DIFFERENCE:
+	    (void) fprintf(stderr, "%s: dumping differences\n", _nc_progname);
+	    break;
+
+	case C_COMMON:
+	    (void) fprintf(stderr, "%s: dumping common capabilities\n", _nc_progname);
+	    break;
+
+	case C_NAND:
+	    (void) fprintf(stderr, "%s: dumping differences\n", _nc_progname);
+	    break;
+	}
+    }
+    if (*names) {
+	printf("comparing %s", *names++);
+	if (*names) {
+	    printf(" to %s", *names++);
+	    while (*names) {
+		printf(", %s", *names++);
+	    }
+	}
+	printf(".\n");
+    }
+}
+
+/*
+ * ncurses stores two types of non-standard capabilities:
+ * a) capabilities listed past the "STOP-HERE" comment in the Caps file.
+ *    These are used in the terminfo source file to provide data for termcaps,
+ *    e.g., when there is no equivalent capability in terminfo, as well as for
+ *    widely-used non-standard capabilities.
+ * b) user-definable capabilities, via "tic -x".
+ *
+ * However, if "-x" is omitted from the tic command, both types of
+ * non-standard capability are not loaded into the terminfo database.  This
+ * macro is used for limit-checks against the symbols that tic uses to omit
+ * the two types of non-standard entry.
+ */
+#if NCURSES_XNAMES
+#define check_user_definable(n,limit) if (!_nc_user_definable && (n) > (limit)) break
+#else
+#define check_user_definable(n,limit) if ((n) > (limit)) break
+#endif
+
+/*
+ * Use these macros to simplify loops on C_COMMON and C_NAND:
+ */
+#define for_each_entry() while (entries[extra].tterm.term_names)
+#define next_entry           (&(entries[extra++].tterm))
+
+static void
+compare_predicate(PredType type, PredIdx idx, const char *name)
+/* predicate function to use for entry difference reports */
+{
+    ENTRY *e1 = &entries[0];
+    ENTRY *e2 = &entries[1];
+    char buf1[MAX_STRING];
+    char buf2[MAX_STRING];
+    int b1, b2;
+    int n1, n2;
+    char *s1, *s2;
+    bool found;
+    int extra = 1;
+
+    switch (type) {
+    case CMP_BOOLEAN:
+	check_user_definable(idx, BOOLWRITE);
+	b1 = e1->tterm.Booleans[idx];
+	switch (compare) {
+	case C_DIFFERENCE:
+	    b2 = next_entry->Booleans[idx];
+	    if (!(no_boolean(b1) && no_boolean(b2)) && (b1 != b2))
+		(void) printf("\t%s: %s%s%s.\n",
+			      name,
+			      dump_boolean(b1),
+			      bool_sep,
+			      dump_boolean(b2));
+	    break;
+
+	case C_COMMON:
+	    if (b1 != ABSENT_BOOLEAN) {
+		found = TRUE;
+		for_each_entry() {
+		    b2 = next_entry->Booleans[idx];
+		    if (b1 != b2) {
+			found = FALSE;
+			break;
+		    }
+		}
+		if (found) {
+		    (void) printf("\t%s= %s.\n", name, dump_boolean(b1));
+		}
+	    }
+	    break;
+
+	case C_NAND:
+	    if (b1 == ABSENT_BOOLEAN) {
+		found = TRUE;
+		for_each_entry() {
+		    b2 = next_entry->Booleans[idx];
+		    if (b1 != b2) {
+			found = FALSE;
+			break;
+		    }
+		}
+		if (found) {
+		    (void) printf("\t!%s.\n", name);
+		}
+	    }
+	    break;
+	}
+	break;
+
+    case CMP_NUMBER:
+	check_user_definable(idx, NUMWRITE);
+	n1 = e1->tterm.Numbers[idx];
+	switch (compare) {
+	case C_DIFFERENCE:
+	    n2 = next_entry->Numbers[idx];
+	    if (!(no_numeric(n1) && no_numeric(n2)) && n1 != n2) {
+		dump_numeric(n1, buf1);
+		dump_numeric(n2, buf2);
+		(void) printf("\t%s: %s, %s.\n", name, buf1, buf2);
+	    }
+	    break;
+
+	case C_COMMON:
+	    if (n1 != ABSENT_NUMERIC) {
+		found = TRUE;
+		for_each_entry() {
+		    n2 = next_entry->Numbers[idx];
+		    if (n1 != n2) {
+			found = FALSE;
+			break;
+		    }
+		}
+		if (found) {
+		    dump_numeric(n1, buf1);
+		    (void) printf("\t%s= %s.\n", name, buf1);
+		}
+	    }
+	    break;
+
+	case C_NAND:
+	    if (n1 == ABSENT_NUMERIC) {
+		found = TRUE;
+		for_each_entry() {
+		    n2 = next_entry->Numbers[idx];
+		    if (n1 != n2) {
+			found = FALSE;
+			break;
+		    }
+		}
+		if (found) {
+		    (void) printf("\t!%s.\n", name);
+		}
+	    }
+	    break;
+	}
+	break;
+
+    case CMP_STRING:
+	check_user_definable(idx, STRWRITE);
+	s1 = e1->tterm.Strings[idx];
+	switch (compare) {
+	case C_DIFFERENCE:
+	    s2 = next_entry->Strings[idx];
+	    if (!(no_string(s1) && no_string(s2)) && capcmp(idx, s1, s2)) {
+		dump_string(s1, buf1);
+		dump_string(s2, buf2);
+		if (strcmp(buf1, buf2))
+		    (void) printf("\t%s: %s, %s.\n", name, buf1, buf2);
+	    }
+	    break;
+
+	case C_COMMON:
+	    if (s1 != ABSENT_STRING) {
+		found = TRUE;
+		for_each_entry() {
+		    s2 = next_entry->Strings[idx];
+		    if (capcmp(idx, s1, s2) != 0) {
+			found = FALSE;
+			break;
+		    }
+		}
+		if (found) {
+		    (void) printf("\t%s= '%s'.\n", name, TIC_EXPAND(s1));
+		}
+	    }
+	    break;
+
+	case C_NAND:
+	    if (s1 == ABSENT_STRING) {
+		found = TRUE;
+		for_each_entry() {
+		    s2 = next_entry->Strings[idx];
+		    if (s2 != s1) {
+			found = FALSE;
+			break;
+		    }
+		}
+		if (found) {
+		    (void) printf("\t!%s.\n", name);
+		}
+	    }
+	    break;
+	}
+	break;
+
+    case CMP_USE:
+	/* unlike the other modes, this compares *all* use entries */
+	switch (compare) {
+	case C_DIFFERENCE:
+	    if (!useeq(e1, e2)) {
+		(void) fputs("\tuse: ", stdout);
+		print_uses(e1, stdout);
+		fputs(", ", stdout);
+		print_uses(e2, stdout);
+		fputs(".\n", stdout);
+	    }
+	    break;
+
+	case C_COMMON:
+	    if (e1->nuses) {
+		found = TRUE;
+		for_each_entry() {
+		    e2 = &entries[extra++];
+		    if (e2->nuses != e1->nuses || !useeq(e1, e2)) {
+			found = FALSE;
+			break;
+		    }
+		}
+		if (found) {
+		    (void) fputs("\tuse: ", stdout);
+		    print_uses(e1, stdout);
+		    fputs(".\n", stdout);
+		}
+	    }
+	    break;
+
+	case C_NAND:
+	    if (!e1->nuses) {
+		found = TRUE;
+		for_each_entry() {
+		    e2 = &entries[extra++];
+		    if (e2->nuses != e1->nuses) {
+			found = FALSE;
+			break;
+		    }
+		}
+		if (found) {
+		    (void) printf("\t!use.\n");
+		}
+	    }
+	    break;
+	}
+    }
+}
+
+/***************************************************************************
+ *
+ * Init string analysis
+ *
+ ***************************************************************************/
+
+#define DATA(from, to) { { from }, { to } }
+#define DATAX()        DATA("", "")
+
+typedef struct {
+    const char from[4];
+    const char to[12];
+} assoc;
+
+static const assoc std_caps[] =
+{
+    /* these are specified by X.364 and iBCS2 */
+    DATA("\033c", "RIS"),	/* full reset */
+    DATA("\0337", "SC"),	/* save cursor */
+    DATA("\0338", "RC"),	/* restore cursor */
+    DATA("\033[r", "RSR"),	/* not an X.364 mnemonic */
+    DATA("\033[m", "SGR0"),	/* not an X.364 mnemonic */
+    DATA("\033[2J", "ED2"),	/* clear page */
+
+    /* this group is specified by ISO 2022 */
+    DATA("\033(0", "ISO DEC G0"),	/* enable DEC graphics for G0 */
+    DATA("\033(A", "ISO UK G0"),	/* enable UK chars for G0 */
+    DATA("\033(B", "ISO US G0"),	/* enable US chars for G0 */
+    DATA("\033)0", "ISO DEC G1"),	/* enable DEC graphics for G1 */
+    DATA("\033)A", "ISO UK G1"),	/* enable UK chars for G1 */
+    DATA("\033)B", "ISO US G1"),	/* enable US chars for G1 */
+
+    /* these are DEC private controls widely supported by emulators */
+    DATA("\033=", "DECPAM"),	/* application keypad mode */
+    DATA("\033>", "DECPNM"),	/* normal keypad mode */
+    DATA("\033<", "DECANSI"),	/* enter ANSI mode */
+    DATA("\033[!p", "DECSTR"),	/* soft reset */
+    DATA("\033 F", "S7C1T"),	/* 7-bit controls */
+
+    DATAX()
+};
+
+static const assoc std_modes[] =
+/* ECMA \E[ ... [hl] modes recognized by many emulators */
+{
+    DATA("2", "AM"),		/* keyboard action mode */
+    DATA("4", "IRM"),		/* insert/replace mode */
+    DATA("12", "SRM"),		/* send/receive mode */
+    DATA("20", "LNM"),		/* linefeed mode */
+    DATAX()
+};
+
+static const assoc private_modes[] =
+/* DEC \E[ ... [hl] modes recognized by many emulators */
+{
+    DATA("1", "CKM"),		/* application cursor keys */
+    DATA("2", "ANM"),		/* set VT52 mode */
+    DATA("3", "COLM"),		/* 132-column mode */
+    DATA("4", "SCLM"),		/* smooth scroll */
+    DATA("5", "SCNM"),		/* reverse video mode */
+    DATA("6", "OM"),		/* origin mode */
+    DATA("7", "AWM"),		/* wraparound mode */
+    DATA("8", "ARM"),		/* auto-repeat mode */
+    DATAX()
+};
+
+static const assoc ecma_highlights[] =
+/* recognize ECMA attribute sequences */
+{
+    DATA("0", "NORMAL"),	/* normal */
+    DATA("1", "+BOLD"),		/* bold on */
+    DATA("2", "+DIM"),		/* dim on */
+    DATA("3", "+ITALIC"),	/* italic on */
+    DATA("4", "+UNDERLINE"),	/* underline on */
+    DATA("5", "+BLINK"),	/* blink on */
+    DATA("6", "+FASTBLINK"),	/* fastblink on */
+    DATA("7", "+REVERSE"),	/* reverse on */
+    DATA("8", "+INVISIBLE"),	/* invisible on */
+    DATA("9", "+DELETED"),	/* deleted on */
+    DATA("10", "MAIN-FONT"),	/* select primary font */
+    DATA("11", "ALT-FONT-1"),	/* select alternate font 1 */
+    DATA("12", "ALT-FONT-2"),	/* select alternate font 2 */
+    DATA("13", "ALT-FONT-3"),	/* select alternate font 3 */
+    DATA("14", "ALT-FONT-4"),	/* select alternate font 4 */
+    DATA("15", "ALT-FONT-5"),	/* select alternate font 5 */
+    DATA("16", "ALT-FONT-6"),	/* select alternate font 6 */
+    DATA("17", "ALT-FONT-7"),	/* select alternate font 7 */
+    DATA("18", "ALT-FONT-1"),	/* select alternate font 1 */
+    DATA("19", "ALT-FONT-1"),	/* select alternate font 1 */
+    DATA("20", "FRAKTUR"),	/* Fraktur font */
+    DATA("21", "DOUBLEUNDER"),	/* double underline */
+    DATA("22", "-DIM"),		/* dim off */
+    DATA("23", "-ITALIC"),	/* italic off */
+    DATA("24", "-UNDERLINE"),	/* underline off */
+    DATA("25", "-BLINK"),	/* blink off */
+    DATA("26", "-FASTBLINK"),	/* fastblink off */
+    DATA("27", "-REVERSE"),	/* reverse off */
+    DATA("28", "-INVISIBLE"),	/* invisible off */
+    DATA("29", "-DELETED"),	/* deleted off */
+    DATAX()
+};
+
+#undef DATA
+
+static int
+skip_csi(const char *cap)
+{
+    int result = 0;
+    if (cap[0] == '\033' && cap[1] == '[')
+	result = 2;
+    else if (UChar(cap[0]) == 0233)
+	result = 1;
+    return result;
+}
+
+static bool
+same_param(const char *table, const char *param, size_t length)
+{
+    bool result = FALSE;
+    if (strncmp(table, param, length) == 0) {
+	result = !isdigit(UChar(param[length]));
+    }
+    return result;
+}
+
+static char *
+lookup_params(const assoc * table, char *dst, char *src)
+{
+    char *result = 0;
+    const char *ep = strtok(src, ";");
+
+    if (ep != 0) {
+	const assoc *ap;
+
+	do {
+	    bool found = FALSE;
+
+	    for (ap = table; ap->from[0]; ap++) {
+		size_t tlen = strlen(ap->from);
+
+		if (same_param(ap->from, ep, tlen)) {
+		    _nc_STRCAT(dst, ap->to, MAX_TERMINFO_LENGTH);
+		    found = TRUE;
+		    break;
+		}
+	    }
+
+	    if (!found)
+		_nc_STRCAT(dst, ep, MAX_TERMINFO_LENGTH);
+	    _nc_STRCAT(dst, ";", MAX_TERMINFO_LENGTH);
+	} while
+	    ((ep = strtok((char *) 0, ";")));
+
+	dst[strlen(dst) - 1] = '\0';
+
+	result = dst;
+    }
+    return result;
+}
+
+static void
+analyze_string(const char *name, const char *cap, TERMTYPE2 *tp)
+{
+    char buf2[MAX_TERMINFO_LENGTH];
+    const char *sp;
+    const assoc *ap;
+    int tp_lines = tp->Numbers[2];
+
+    if (!VALID_STRING(cap))
+	return;
+    (void) printf("%s: ", name);
+
+    for (sp = cap; *sp; sp++) {
+	int i;
+	int csi;
+	size_t len = 0;
+	size_t next;
+	const char *expansion = 0;
+	char buf3[MAX_TERMINFO_LENGTH];
+
+	/* first, check other capabilities in this entry */
+	for (i = 0; i < STRCOUNT; i++) {
+	    char *cp = tp->Strings[i];
+
+	    /* don't use function-key capabilities */
+	    if (strnames[i] == NULL)
+		continue;
+	    if (strnames[i][0] == 'k' && strnames[i][1] == 'f')
+		continue;
+
+	    if (VALID_STRING(cp) &&
+		cp[0] != '\0' &&
+		cp != cap) {
+		len = strlen(cp);
+		_nc_STRNCPY(buf2, sp, len);
+		buf2[len] = '\0';
+
+		if (_nc_capcmp(cp, buf2))
+		    continue;
+
+#define ISRS(s)	(!strncmp((s), "is", (size_t) 2) || !strncmp((s), "rs", (size_t) 2))
+		/*
+		 * Theoretically we just passed the test for translation
+		 * (equality once the padding is stripped).  However, there
+		 * are a few more hoops that need to be jumped so that
+		 * identical pairs of initialization and reset strings
+		 * don't just refer to each other.
+		 */
+		if (ISRS(name) || ISRS(strnames[i]))
+		    if (cap < cp)
+			continue;
+#undef ISRS
+
+		expansion = strnames[i];
+		break;
+	    }
+	}
+
+	/* now check the standard capabilities */
+	if (!expansion) {
+	    csi = skip_csi(sp);
+	    for (ap = std_caps; ap->from[0]; ap++) {
+		size_t adj = (size_t) (csi ? 2 : 0);
+
+		len = strlen(ap->from);
+		if (csi && skip_csi(ap->from) != csi)
+		    continue;
+		if (len > adj
+		    && strncmp(ap->from + adj, sp + csi, len - adj) == 0) {
+		    expansion = ap->to;
+		    len -= adj;
+		    len += (size_t) csi;
+		    break;
+		}
+	    }
+	}
+
+	/* now check for standard-mode sequences */
+	if (!expansion
+	    && (csi = skip_csi(sp)) != 0
+	    && (len = (strspn) (sp + csi, "0123456789;"))
+	    && (len < sizeof(buf3))
+	    && (next = (size_t) csi + len)
+	    && ((sp[next] == 'h') || (sp[next] == 'l'))) {
+
+	    _nc_STRCPY(buf2,
+		       ((sp[next] == 'h')
+			? "ECMA+"
+			: "ECMA-"),
+		       sizeof(buf2));
+	    _nc_STRNCPY(buf3, sp + csi, len);
+	    buf3[len] = '\0';
+
+	    expansion = lookup_params(std_modes, buf2, buf3);
+	}
+
+	/* now check for private-mode sequences */
+	if (!expansion
+	    && (csi = skip_csi(sp)) != 0
+	    && sp[csi] == '?'
+	    && (len = (strspn) (sp + csi + 1, "0123456789;"))
+	    && (len < sizeof(buf3))
+	    && (next = (size_t) csi + 1 + len)
+	    && ((sp[next] == 'h') || (sp[next] == 'l'))) {
+
+	    _nc_STRCPY(buf2,
+		       ((sp[next] == 'h')
+			? "DEC+"
+			: "DEC-"),
+		       sizeof(buf2));
+	    _nc_STRNCPY(buf3, sp + csi + 1, len);
+	    buf3[len] = '\0';
+
+	    expansion = lookup_params(private_modes, buf2, buf3);
+	}
+
+	/* now check for ECMA highlight sequences */
+	if (!expansion
+	    && (csi = skip_csi(sp)) != 0
+	    && (len = (strspn) (sp + csi, "0123456789;")) != 0
+	    && (len < sizeof(buf3))
+	    && (next = (size_t) csi + len)
+	    && sp[next] == 'm') {
+
+	    _nc_STRCPY(buf2, "SGR:", sizeof(buf2));
+	    _nc_STRNCPY(buf3, sp + csi, len);
+	    buf3[len] = '\0';
+	    len += (size_t) csi + 1;
+
+	    expansion = lookup_params(ecma_highlights, buf2, buf3);
+	}
+
+	if (!expansion
+	    && (csi = skip_csi(sp)) != 0
+	    && sp[csi] == 'm') {
+	    len = (size_t) csi + 1;
+	    _nc_STRCPY(buf2, "SGR:", sizeof(buf2));
+	    _nc_STRCAT(buf2, ecma_highlights[0].to, sizeof(buf2));
+	    expansion = buf2;
+	}
+
+	/* now check for scroll region reset */
+	if (!expansion
+	    && (csi = skip_csi(sp)) != 0) {
+	    if (sp[csi] == 'r') {
+		expansion = "RSR";
+		len = 1;
+	    } else {
+		_nc_SPRINTF(buf2, _nc_SLIMIT(sizeof(buf2)) "1;%dr", tp_lines);
+		len = strlen(buf2);
+		if (strncmp(buf2, sp + csi, len) == 0)
+		    expansion = "RSR";
+	    }
+	    len += (size_t) csi;
+	}
+
+	/* now check for home-down */
+	if (!expansion
+	    && (csi = skip_csi(sp)) != 0) {
+	    _nc_SPRINTF(buf2, _nc_SLIMIT(sizeof(buf2)) "%d;1H", tp_lines);
+	    len = strlen(buf2);
+	    if (strncmp(buf2, sp + csi, len) == 0) {
+		expansion = "LL";
+	    } else {
+		_nc_SPRINTF(buf2, _nc_SLIMIT(sizeof(buf2)) "%dH", tp_lines);
+		len = strlen(buf2);
+		if (strncmp(buf2, sp + csi, len) == 0) {
+		    expansion = "LL";
+		}
+	    }
+	    len += (size_t) csi;
+	}
+
+	/* now look at the expansion we got, if any */
+	if (expansion) {
+	    printf("{%s}", expansion);
+	    sp += len - 1;
+	} else {
+	    /* couldn't match anything */
+	    buf2[0] = *sp;
+	    buf2[1] = '\0';
+	    fputs(TIC_EXPAND(buf2), stdout);
+	}
+    }
+    putchar('\n');
+}
+
+/***************************************************************************
+ *
+ * File comparison
+ *
+ ***************************************************************************/
+
+static void
+file_comparison(int argc, char *argv[])
+{
+#define MAXCOMPARE	2
+    /* someday we may allow comparisons on more files */
+    int filecount = 0;
+    ENTRY *heads[MAXCOMPARE];
+    ENTRY *qp, *rp;
+    int i, n;
+
+    memset(heads, 0, sizeof(heads));
+    dump_init((char *) 0, F_LITERAL, S_TERMINFO,
+	      FALSE, 0, 65535, itrace, FALSE, FALSE, FALSE);
+
+    for (n = 0; n < argc && n < MAXCOMPARE; n++) {
+	if (freopen(argv[n], "r", stdin) == 0)
+	    _nc_err_abort("Can't open %s", argv[n]);
+
+#if NO_LEAKS
+	entered[n].head = _nc_head;
+	entered[n].tail = _nc_tail;
+#endif
+	_nc_head = _nc_tail = 0;
+
+	/* parse entries out of the source file */
+	_nc_set_source(argv[n]);
+	_nc_read_entry_source(stdin, NULL, TRUE, literal, NULLHOOK);
+
+	if (itrace)
+	    (void) fprintf(stderr, "Resolving file %d...\n", n - 0);
+
+	/* maybe do use resolution */
+	if (!_nc_resolve_uses2(!limited, literal)) {
+	    (void) fprintf(stderr,
+			   "There are unresolved use entries in %s:\n",
+			   argv[n]);
+	    for_entry_list(qp) {
+		if (qp->nuses) {
+		    (void) fputs(qp->tterm.term_names, stderr);
+		    (void) fputc('\n', stderr);
+		}
+	    }
+	    ExitProgram(EXIT_FAILURE);
+	}
+
+	heads[filecount] = _nc_head;
+	filecount++;
+    }
+
+    /* OK, all entries are in core.  Ready to do the comparison */
+    if (itrace)
+	(void) fprintf(stderr, "Entries are now in core...\n");
+
+    /* The entry-matching loop. Sigh, this is intrinsically quadratic. */
+    for (qp = heads[0]; qp; qp = qp->next) {
+	for (rp = heads[1]; rp; rp = rp->next)
+	    if (_nc_entry_match(qp->tterm.term_names, rp->tterm.term_names)) {
+		if (qp->ncrosslinks < MAX_CROSSLINKS)
+		    qp->crosslinks[qp->ncrosslinks] = rp;
+		qp->ncrosslinks++;
+
+		if (rp->ncrosslinks < MAX_CROSSLINKS)
+		    rp->crosslinks[rp->ncrosslinks] = qp;
+		rp->ncrosslinks++;
+	    }
+    }
+
+    /* now we have two circular lists with crosslinks */
+    if (itrace)
+	(void) fprintf(stderr, "Name matches are done...\n");
+
+    for (qp = heads[0]; qp; qp = qp->next) {
+	if (qp->ncrosslinks > 1) {
+	    (void) fprintf(stderr,
+			   "%s in file 1 (%s) has %d matches in file 2 (%s):\n",
+			   _nc_first_name(qp->tterm.term_names),
+			   argv[0],
+			   qp->ncrosslinks,
+			   argv[1]);
+	    for (i = 0; i < qp->ncrosslinks; i++)
+		(void) fprintf(stderr,
+			       "\t%s\n",
+			       _nc_first_name((qp->crosslinks[i])->tterm.term_names));
+	}
+    }
+
+    for (rp = heads[1]; rp; rp = rp->next) {
+	if (rp->ncrosslinks > 1) {
+	    (void) fprintf(stderr,
+			   "%s in file 2 (%s) has %d matches in file 1 (%s):\n",
+			   _nc_first_name(rp->tterm.term_names),
+			   argv[1],
+			   rp->ncrosslinks,
+			   argv[0]);
+	    for (i = 0; i < rp->ncrosslinks; i++)
+		(void) fprintf(stderr,
+			       "\t%s\n",
+			       _nc_first_name((rp->crosslinks[i])->tterm.term_names));
+	}
+    }
+
+    (void) printf("In file 1 (%s) only:\n", argv[0]);
+    for (qp = heads[0]; qp; qp = qp->next)
+	if (qp->ncrosslinks == 0)
+	    (void) printf("\t%s\n",
+			  _nc_first_name(qp->tterm.term_names));
+
+    (void) printf("In file 2 (%s) only:\n", argv[1]);
+    for (rp = heads[1]; rp; rp = rp->next)
+	if (rp->ncrosslinks == 0)
+	    (void) printf("\t%s\n",
+			  _nc_first_name(rp->tterm.term_names));
+
+    (void) printf("The following entries are equivalent:\n");
+    for (qp = heads[0]; qp; qp = qp->next) {
+	if (qp->ncrosslinks == 1) {
+	    rp = qp->crosslinks[0];
+
+	    repair_acsc(&qp->tterm);
+	    repair_acsc(&rp->tterm);
+#if NCURSES_XNAMES
+	    _nc_align_termtype(&qp->tterm, &rp->tterm);
+#endif
+	    if (entryeq(&qp->tterm, &rp->tterm) && useeq(qp, rp)) {
+		char name1[NAMESIZE], name2[NAMESIZE];
+
+		canonical_name(qp->tterm.term_names, name1);
+		canonical_name(rp->tterm.term_names, name2);
+
+		(void) printf("%s = %s\n", name1, name2);
+	    }
+	}
+    }
+
+    (void) printf("Differing entries:\n");
+    termcount = 2;
+    for (qp = heads[0]; qp; qp = qp->next) {
+
+	if (qp->ncrosslinks == 1) {
+	    rp = qp->crosslinks[0];
+#if NCURSES_XNAMES
+	    /* sorry - we have to do this on each pass */
+	    _nc_align_termtype(&qp->tterm, &rp->tterm);
+#endif
+	    if (!(entryeq(&qp->tterm, &rp->tterm) && useeq(qp, rp))) {
+		char name1[NAMESIZE], name2[NAMESIZE];
+		char *names[3];
+
+		names[0] = name1;
+		names[1] = name2;
+		names[2] = 0;
+
+		entries[0] = *qp;
+		entries[1] = *rp;
+
+		canonical_name(qp->tterm.term_names, name1);
+		canonical_name(rp->tterm.term_names, name2);
+
+		switch (compare) {
+		case C_DIFFERENCE:
+		    show_comparing(names);
+		    compare_entry(compare_predicate, &entries->tterm, quiet);
+		    break;
+
+		case C_COMMON:
+		    show_comparing(names);
+		    compare_entry(compare_predicate, &entries->tterm, quiet);
+		    break;
+
+		case C_NAND:
+		    show_comparing(names);
+		    compare_entry(compare_predicate, &entries->tterm, quiet);
+		    break;
+
+		}
+	    }
+	}
+    }
+}
+
+static void
+usage(void)
+{
+#define DATA(s) s "\n"
+    static const char head[] =
+    {
+	DATA("Usage: infocmp [options] [-A directory] [-B directory] [termname...]")
+	DATA("")
+	DATA("Options:")
+    };
+#undef DATA
+    /* length is given here so the compiler can make everything readonly */
+#define DATA(s) s
+    static const char options[][46] =
+    {
+	"  -0    print single-row"
+	,"  -1    print single-column"
+	,"  -C    use termcap-names"
+	,"  -D    print database locations"
+	,"  -E    format output as C tables"
+	,"  -F    compare terminfo-files"
+	,"  -G    format %{number} to %'char'"
+	,"  -I    use terminfo-names"
+	,"  -K    use termcap-names and BSD syntax"
+	,"  -L    use long names"
+	,"  -R subset (see manpage)"
+	,"  -T    eliminate size limits (test)"
+	,"  -U    do not post-process entries"
+	,"  -V    print version"
+	,"  -W    wrap long strings per -w[n]"
+#if NCURSES_XNAMES
+	,"  -a    with -F, list commented-out caps"
+#endif
+	,"  -c    list common capabilities"
+	,"  -d    list different capabilities"
+	,"  -e    format output for C initializer"
+	,"  -f    with -1, format complex strings"
+	,"  -g    format %'char' to %{number}"
+	,"  -i    analyze initialization/reset"
+	,"  -l    output terminfo names"
+	,"  -n    list capabilities in neither"
+	,"  -p    ignore padding specifiers"
+	,"  -Q number  dump compiled description"
+	,"  -q    brief listing, removes headers"
+	,"  -r    with -C, output in termcap form"
+	,"  -r    with -F, resolve use-references"
+	,"  -s [d|i|l|c] sort fields"
+#if NCURSES_XNAMES
+	,"  -t    suppress commented-out capabilities"
+#endif
+	,"  -u    produce source with 'use='"
+	,"  -v number  (verbose)"
+	,"  -w number  (width)"
+#if NCURSES_XNAMES
+	,"  -x    unknown capabilities are user-defined"
+#endif
+    };
+#undef DATA
+    const size_t last = SIZEOF(options);
+    const size_t left = (last + 1) / 2;
+    size_t n;
+
+    fputs(head, stderr);
+    for (n = 0; n < left; n++) {
+	size_t m = n + left;
+	if (m < last)
+	    fprintf(stderr, "%-40.40s%s\n", options[n], options[m]);
+	else
+	    fprintf(stderr, "%s\n", options[n]);
+    }
+    ExitProgram(EXIT_FAILURE);
+}
+
+static char *
+any_initializer(const char *fmt, const char *type)
+{
+    static char *initializer;
+    static size_t need;
+    char *s;
+
+    if (initializer == 0) {
+	need = (strlen(entries->tterm.term_names)
+		+ strlen(type)
+		+ strlen(fmt));
+	initializer = (char *) malloc(need + 1);
+	if (initializer == 0)
+	    failed("any_initializer");
+    }
+
+    _nc_STRCPY(initializer, entries->tterm.term_names, need);
+    for (s = initializer; *s != 0 && *s != '|'; s++) {
+	if (!isalnum(UChar(*s)))
+	    *s = '_';
+    }
+    *s = 0;
+    _nc_SPRINTF(s, _nc_SLIMIT(need) fmt, type);
+    return initializer;
+}
+
+static char *
+name_initializer(const char *type)
+{
+    return any_initializer("_%s_data", type);
+}
+
+static char *
+string_variable(const char *type)
+{
+    return any_initializer("_s_%s", type);
+}
+
+/* dump C initializers for the terminal type */
+static void
+dump_initializers(TERMTYPE2 *term)
+{
+    unsigned n;
+    const char *str = 0;
+
+    printf("\nstatic char %s[] = \"%s\";\n\n",
+	   name_initializer("alias"), entries->tterm.term_names);
+
+    for_each_string(n, term) {
+	if (VALID_STRING(term->Strings[n])) {
+	    char buf[MAX_STRING], *sp, *tp;
+
+	    tp = buf;
+#define TP_LIMIT	((MAX_STRING - 5) - (size_t)(tp - buf))
+	    *tp++ = '"';
+	    for (sp = term->Strings[n];
+		 *sp != 0 && TP_LIMIT > 2;
+		 sp++) {
+		if (isascii(UChar(*sp))
+		    && isprint(UChar(*sp))
+		    && *sp != '\\'
+		    && *sp != '"')
+		    *tp++ = *sp;
+		else {
+		    _nc_SPRINTF(tp, _nc_SLIMIT(TP_LIMIT) "\\%03o", UChar(*sp));
+		    tp += 4;
+		}
+	    }
+	    *tp++ = '"';
+	    *tp = '\0';
+	    (void) printf("static char %-20s[] = %s;\n",
+			  string_variable(ExtStrname(term, (int) n, strnames)),
+			  buf);
+	}
+    }
+    printf("\n");
+
+    (void) printf("static char %s[] = %s\n", name_initializer("bool"), L_CURL);
+
+    for_each_boolean(n, term) {
+	switch ((int) (term->Booleans[n])) {
+	case TRUE:
+	    str = "TRUE";
+	    break;
+
+	case FALSE:
+	    str = "FALSE";
+	    break;
+
+	case ABSENT_BOOLEAN:
+	    str = "ABSENT_BOOLEAN";
+	    break;
+
+	case CANCELLED_BOOLEAN:
+	    str = "CANCELLED_BOOLEAN";
+	    break;
+	}
+	(void) printf("\t/* %3u: %-8s */\t%s,\n",
+		      n, ExtBoolname(term, (int) n, boolnames), str);
+    }
+    (void) printf("%s;\n", R_CURL);
+
+    (void) printf("static short %s[] = %s\n", name_initializer("number"), L_CURL);
+
+    for_each_number(n, term) {
+	char buf[BUFSIZ];
+	switch (term->Numbers[n]) {
+	case ABSENT_NUMERIC:
+	    str = "ABSENT_NUMERIC";
+	    break;
+	case CANCELLED_NUMERIC:
+	    str = "CANCELLED_NUMERIC";
+	    break;
+	default:
+	    _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf)) "%d", term->Numbers[n]);
+	    str = buf;
+	    break;
+	}
+	(void) printf("\t/* %3u: %-8s */\t%s,\n", n,
+		      ExtNumname(term, (int) n, numnames), str);
+    }
+    (void) printf("%s;\n", R_CURL);
+
+    (void) printf("static char * %s[] = %s\n", name_initializer("string"), L_CURL);
+
+    for_each_string(n, term) {
+
+	if (term->Strings[n] == ABSENT_STRING)
+	    str = "ABSENT_STRING";
+	else if (term->Strings[n] == CANCELLED_STRING)
+	    str = "CANCELLED_STRING";
+	else {
+	    str = string_variable(ExtStrname(term, (int) n, strnames));
+	}
+	(void) printf("\t/* %3u: %-8s */\t%s,\n", n,
+		      ExtStrname(term, (int) n, strnames), str);
+    }
+    (void) printf("%s;\n", R_CURL);
+
+#if NCURSES_XNAMES
+    if ((NUM_BOOLEANS(term) != BOOLCOUNT)
+	|| (NUM_NUMBERS(term) != NUMCOUNT)
+	|| (NUM_STRINGS(term) != STRCOUNT)) {
+	(void) printf("static char * %s[] = %s\n",
+		      name_initializer("string_ext"), L_CURL);
+	for (n = BOOLCOUNT; n < NUM_BOOLEANS(term); ++n) {
+	    (void) printf("\t/* %3u: bool */\t\"%s\",\n",
+			  n, ExtBoolname(term, (int) n, boolnames));
+	}
+	for (n = NUMCOUNT; n < NUM_NUMBERS(term); ++n) {
+	    (void) printf("\t/* %3u: num */\t\"%s\",\n",
+			  n, ExtNumname(term, (int) n, numnames));
+	}
+	for (n = STRCOUNT; n < NUM_STRINGS(term); ++n) {
+	    (void) printf("\t/* %3u: str */\t\"%s\",\n",
+			  n, ExtStrname(term, (int) n, strnames));
+	}
+	(void) printf("%s;\n", R_CURL);
+    }
+#endif
+}
+
+/* dump C initializers for the terminal type */
+static void
+dump_termtype(TERMTYPE2 *term)
+{
+    (void) printf("\t%s\n\t\t%s,\n", L_CURL, name_initializer("alias"));
+    (void) printf("\t\t(char *)0,\t/* pointer to string table */\n");
+
+    (void) printf("\t\t%s,\n", name_initializer("bool"));
+    (void) printf("\t\t%s,\n", name_initializer("number"));
+
+    (void) printf("\t\t%s,\n", name_initializer("string"));
+
+#if NCURSES_XNAMES
+    (void) printf("#if NCURSES_XNAMES\n");
+    (void) printf("\t\t(char *)0,\t/* pointer to extended string table */\n");
+    (void) printf("\t\t%s,\t/* ...corresponding names */\n",
+		  ((NUM_BOOLEANS(term) != BOOLCOUNT)
+		   || (NUM_NUMBERS(term) != NUMCOUNT)
+		   || (NUM_STRINGS(term) != STRCOUNT))
+		  ? name_initializer("string_ext")
+		  : "(char **)0");
+
+    (void) printf("\t\t%d,\t\t/* count total Booleans */\n", NUM_BOOLEANS(term));
+    (void) printf("\t\t%d,\t\t/* count total Numbers */\n", NUM_NUMBERS(term));
+    (void) printf("\t\t%d,\t\t/* count total Strings */\n", NUM_STRINGS(term));
+
+    (void) printf("\t\t%d,\t\t/* count extensions to Booleans */\n",
+		  NUM_BOOLEANS(term) - BOOLCOUNT);
+    (void) printf("\t\t%d,\t\t/* count extensions to Numbers */\n",
+		  NUM_NUMBERS(term) - NUMCOUNT);
+    (void) printf("\t\t%d,\t\t/* count extensions to Strings */\n",
+		  NUM_STRINGS(term) - STRCOUNT);
+
+    (void) printf("#endif /* NCURSES_XNAMES */\n");
+#else
+    (void) term;
+#endif /* NCURSES_XNAMES */
+    (void) printf("\t%s\n", R_CURL);
+}
+
+static int
+optarg_to_number(void)
+{
+    char *temp = 0;
+    long value = strtol(optarg, &temp, 0);
+
+    if (temp == 0 || temp == optarg || *temp != 0) {
+	fprintf(stderr, "Expected a number, not \"%s\"\n", optarg);
+	ExitProgram(EXIT_FAILURE);
+    }
+    return (int) value;
+}
+
+static char *
+terminal_env(void)
+{
+    char *terminal;
+
+    if ((terminal = getenv("TERM")) == 0) {
+	(void) fprintf(stderr,
+		       "%s: environment variable TERM not set\n",
+		       _nc_progname);
+	exit(EXIT_FAILURE);
+    }
+    return terminal;
+}
+
+/*
+ * Show the databases that infocmp knows about.  The location to which it writes is
+ */
+static void
+show_databases(void)
+{
+    DBDIRS state;
+    int offset;
+    const char *path2;
+
+    _nc_first_db(&state, &offset);
+    while ((path2 = _nc_next_db(&state, &offset)) != 0) {
+	printf("%s\n", path2);
+    }
+    _nc_last_db();
+}
+
+/***************************************************************************
+ *
+ * Main sequence
+ *
+ ***************************************************************************/
+
+#if NO_LEAKS
+#define MAIN_LEAKS() \
+    _nc_free_termtype2(&entries[0].tterm); \
+    _nc_free_termtype2(&entries[1].tterm); \
+    free(myargv); \
+    free(tfile); \
+    free(tname)
+#else
+#define MAIN_LEAKS()		/* nothing */
+#endif
+
+int
+main(int argc, char *argv[])
+{
+    /* Avoid "local data >32k" error with mwcc */
+    /* Also avoid overflowing smaller stacks on systems like AmigaOS */
+    path *tfile = 0;
+    char **tname = 0;
+    size_t maxterms;
+
+    char **myargv;
+
+    char *firstdir, *restdir;
+    int c;
+    bool formatted = FALSE;
+    bool filecompare = FALSE;
+    int initdump = 0;
+    bool init_analyze = FALSE;
+    bool suppress_untranslatable = FALSE;
+    int quickdump = 0;
+    bool wrap_strings = FALSE;
+
+    /* where is the terminfo database location going to default to? */
+    restdir = firstdir = 0;
+
+#if NCURSES_XNAMES
+    use_extended_names(FALSE);
+#endif
+    _nc_strict_bsd = 0;
+
+    _nc_progname = _nc_rootname(argv[0]);
+
+    /* make sure we have enough space to add two terminal entries */
+    myargv = typeCalloc(char *, (size_t) (argc + 3));
+    if (myargv == 0)
+	failed("myargv");
+
+    memcpy(myargv, argv, (sizeof(char *) * (size_t) argc));
+    argv = myargv;
+
+    while ((c = getopt(argc,
+		       argv,
+		       "01A:aB:CcDdEeFfGgIiKLlnpQ:qR:rs:TtUuVv:Ww:x")) != -1) {
+	switch (c) {
+	case '0':
+	    mwidth = 65535;
+	    mheight = 1;
+	    break;
+
+	case '1':
+	    mwidth = 0;
+	    break;
+
+	case 'A':
+	    firstdir = optarg;
+	    break;
+
+#if NCURSES_XNAMES
+	case 'a':
+	    _nc_disable_period = TRUE;
+	    use_extended_names(TRUE);
+	    break;
+#endif
+	case 'B':
+	    restdir = optarg;
+	    break;
+
+	case 'K':
+	    _nc_strict_bsd = 1;
+	    /* FALLTHRU */
+	case 'C':
+	    outform = F_TERMCAP;
+	    tversion = "BSD";
+	    if (sortmode == S_DEFAULT)
+		sortmode = S_TERMCAP;
+	    break;
+
+	case 'D':
+	    show_databases();
+	    ExitProgram(EXIT_SUCCESS);
+	    break;
+
+	case 'c':
+	    compare = C_COMMON;
+	    break;
+
+	case 'd':
+	    compare = C_DIFFERENCE;
+	    break;
+
+	case 'E':
+	    initdump |= 2;
+	    break;
+
+	case 'e':
+	    initdump |= 1;
+	    break;
+
+	case 'F':
+	    filecompare = TRUE;
+	    break;
+
+	case 'f':
+	    formatted = TRUE;
+	    break;
+
+	case 'G':
+	    numbers = 1;
+	    break;
+
+	case 'g':
+	    numbers = -1;
+	    break;
+
+	case 'I':
+	    outform = F_TERMINFO;
+	    if (sortmode == S_DEFAULT)
+		sortmode = S_VARIABLE;
+	    tversion = 0;
+	    break;
+
+	case 'i':
+	    init_analyze = TRUE;
+	    break;
+
+	case 'L':
+	    outform = F_VARIABLE;
+	    if (sortmode == S_DEFAULT)
+		sortmode = S_VARIABLE;
+	    break;
+
+	case 'l':
+	    outform = F_TERMINFO;
+	    break;
+
+	case 'n':
+	    compare = C_NAND;
+	    break;
+
+	case 'p':
+	    ignorepads = TRUE;
+	    break;
+
+	case 'Q':
+	    quickdump = optarg_to_number();
+	    break;
+
+	case 'q':
+	    quiet = TRUE;
+	    s_absent = "-";
+	    s_cancel = "@";
+	    bool_sep = ", ";
+	    break;
+
+	case 'R':
+	    tversion = optarg;
+	    break;
+
+	case 'r':
+	    tversion = 0;
+	    break;
+
+	case 's':
+	    if (*optarg == 'd')
+		sortmode = S_NOSORT;
+	    else if (*optarg == 'i')
+		sortmode = S_TERMINFO;
+	    else if (*optarg == 'l')
+		sortmode = S_VARIABLE;
+	    else if (*optarg == 'c')
+		sortmode = S_TERMCAP;
+	    else {
+		(void) fprintf(stderr,
+			       "%s: unknown sort mode\n",
+			       _nc_progname);
+		ExitProgram(EXIT_FAILURE);
+	    }
+	    break;
+
+	case 'T':
+	    limited = FALSE;
+	    break;
+
+#if NCURSES_XNAMES
+	case 't':
+	    _nc_disable_period = FALSE;
+	    suppress_untranslatable = TRUE;
+	    break;
+#endif
+
+	case 'U':
+	    literal = TRUE;
+	    break;
+
+	case 'u':
+	    compare = C_USEALL;
+	    break;
+
+	case 'V':
+	    puts(curses_version());
+	    ExitProgram(EXIT_SUCCESS);
+
+	case 'v':
+	    itrace = (unsigned) optarg_to_number();
+	    use_verbosity(itrace);
+	    break;
+
+	case 'W':
+	    wrap_strings = TRUE;
+	    break;
+
+	case 'w':
+	    mwidth = optarg_to_number();
+	    break;
+
+#if NCURSES_XNAMES
+	case 'x':
+	    use_extended_names(TRUE);
+	    break;
+#endif
+
+	default:
+	    usage();
+	}
+    }
+
+    maxterms = (size_t) (argc + 2 - optind);
+    if ((tfile = typeMalloc(path, maxterms)) == 0)
+	failed("tfile");
+    if ((tname = typeCalloc(char *, maxterms)) == 0)
+	  failed("tname");
+    if ((entries = typeCalloc(ENTRY, maxterms)) == 0)
+	failed("entries");
+#if NO_LEAKS
+    if ((entered = typeCalloc(ENTERED, maxterms)) == 0)
+	failed("entered");
+#endif
+
+    if (tfile == 0
+	|| tname == 0
+	|| entries == 0) {
+	fprintf(stderr, "%s: not enough memory\n", _nc_progname);
+	ExitProgram(EXIT_FAILURE);
+    }
+
+    /* by default, sort by terminfo name */
+    if (sortmode == S_DEFAULT)
+	sortmode = S_TERMINFO;
+
+    /* make sure we have at least one terminal name to work with */
+    if (optind >= argc)
+	argv[argc++] = terminal_env();
+
+    /* if user is after a comparison, make sure we have two entries */
+    if (compare != C_DEFAULT && optind >= argc - 1)
+	argv[argc++] = terminal_env();
+
+    /* exactly one terminal name with no options means display it */
+    /* exactly two terminal names with no options means do -d */
+    if (compare == C_DEFAULT) {
+	switch (argc - optind) {
+	default:
+	    fprintf(stderr, "%s: too many names to compare\n", _nc_progname);
+	    ExitProgram(EXIT_FAILURE);
+	case 1:
+	    break;
+	case 2:
+	    compare = C_DIFFERENCE;
+	    break;
+	}
+    }
+
+    /* set up for display */
+    dump_init(tversion, outform, sortmode,
+	      wrap_strings, mwidth, mheight, itrace,
+	      formatted, FALSE, quickdump);
+
+    if (!filecompare) {
+	/* grab the entries */
+	termcount = 0;
+	for (; optind < argc; optind++) {
+	    const char *directory = termcount ? restdir : firstdir;
+	    int status;
+
+	    tname[termcount] = argv[optind];
+
+	    if (directory) {
+#if NCURSES_USE_DATABASE
+#if MIXEDCASE_FILENAMES
+#define LEAF_FMT "%c"
+#else
+#define LEAF_FMT "%02x"
+#endif
+		_nc_SPRINTF(tfile[termcount],
+			    _nc_SLIMIT(sizeof(path))
+			    "%s/" LEAF_FMT "/%s",
+			    directory,
+			    UChar(*argv[optind]), argv[optind]);
+		if (itrace)
+		    (void) fprintf(stderr,
+				   "%s: reading entry %s from file %s\n",
+				   _nc_progname,
+				   argv[optind], tfile[termcount]);
+
+		status = _nc_read_file_entry(tfile[termcount],
+					     &entries[termcount].tterm);
+#else
+		(void) fprintf(stderr, "%s: terminfo files not supported\n",
+			       _nc_progname);
+		MAIN_LEAKS();
+		ExitProgram(EXIT_FAILURE);
+#endif
+	    } else {
+		if (itrace)
+		    (void) fprintf(stderr,
+				   "%s: reading entry %s from database\n",
+				   _nc_progname,
+				   tname[termcount]);
+
+		status = _nc_read_entry2(tname[termcount],
+					 tfile[termcount],
+					 &entries[termcount].tterm);
+	    }
+
+	    if (status <= 0) {
+		(void) fprintf(stderr,
+			       "%s: couldn't open terminfo file %s.\n",
+			       _nc_progname,
+			       tfile[termcount]);
+		MAIN_LEAKS();
+		ExitProgram(EXIT_FAILURE);
+	    }
+	    repair_acsc(&entries[termcount].tterm);
+	    termcount++;
+	}
+
+#if NCURSES_XNAMES
+	if (termcount > 1)
+	    _nc_align_termtype(&entries[0].tterm, &entries[1].tterm);
+#endif
+
+	/* dump as C initializer for the terminal type */
+	if (initdump) {
+	    if (initdump & 1)
+		dump_termtype(&entries[0].tterm);
+	    if (initdump & 2)
+		dump_initializers(&entries[0].tterm);
+	}
+
+	/* analyze the init strings */
+	else if (init_analyze) {
+#undef CUR
+#define CUR	entries[0].tterm.
+	    analyze_string("is1", init_1string, &entries[0].tterm);
+	    analyze_string("is2", init_2string, &entries[0].tterm);
+	    analyze_string("is3", init_3string, &entries[0].tterm);
+	    analyze_string("rs1", reset_1string, &entries[0].tterm);
+	    analyze_string("rs2", reset_2string, &entries[0].tterm);
+	    analyze_string("rs3", reset_3string, &entries[0].tterm);
+	    analyze_string("smcup", enter_ca_mode, &entries[0].tterm);
+	    analyze_string("rmcup", exit_ca_mode, &entries[0].tterm);
+	    analyze_string("smkx", keypad_xmit, &entries[0].tterm);
+	    analyze_string("rmkx", keypad_local, &entries[0].tterm);
+#undef CUR
+	} else {
+	    int i;
+	    int len;
+
+	    /*
+	     * Here's where the real work gets done
+	     */
+	    switch (compare) {
+	    case C_DEFAULT:
+		if (itrace)
+		    (void) fprintf(stderr,
+				   "%s: about to dump %s\n",
+				   _nc_progname,
+				   tname[0]);
+		if (!quiet)
+		    (void)
+			printf("#\tReconstructed via infocmp from file: %s\n",
+			       tfile[0]);
+		dump_entry(&entries[0].tterm,
+			   suppress_untranslatable,
+			   limited,
+			   numbers,
+			   NULL);
+		len = show_entry();
+		if (itrace)
+		    (void) fprintf(stderr, "%s: length %d\n", _nc_progname, len);
+		break;
+
+	    case C_DIFFERENCE:
+		show_comparing(tname);
+		compare_entry(compare_predicate, &entries->tterm, quiet);
+		break;
+
+	    case C_COMMON:
+		show_comparing(tname);
+		compare_entry(compare_predicate, &entries->tterm, quiet);
+		break;
+
+	    case C_NAND:
+		show_comparing(tname);
+		compare_entry(compare_predicate, &entries->tterm, quiet);
+		break;
+
+	    case C_USEALL:
+		if (itrace)
+		    (void) fprintf(stderr, "%s: dumping use entry\n", _nc_progname);
+		dump_entry(&entries[0].tterm,
+			   suppress_untranslatable,
+			   limited,
+			   numbers,
+			   use_predicate);
+		for (i = 1; i < termcount; i++)
+		    dump_uses(tname[i], !(outform == F_TERMCAP
+					  || outform == F_TCONVERR));
+		len = show_entry();
+		if (itrace)
+		    (void) fprintf(stderr, "%s: length %d\n", _nc_progname, len);
+		break;
+	    }
+	}
+    } else if (compare == C_USEALL) {
+	(void) fprintf(stderr, "Sorry, -u doesn't work with -F\n");
+    } else if (compare == C_DEFAULT) {
+	(void) fprintf(stderr, "Use `tic -[CI] <file>' for this.\n");
+    } else if (argc - optind != 2) {
+	(void) fprintf(stderr,
+		       "File comparison needs exactly two file arguments.\n");
+    } else {
+	file_comparison(argc - optind, argv + optind);
+    }
+
+    MAIN_LEAKS();
+    ExitProgram(EXIT_SUCCESS);
+}
+
+/* infocmp.c ends here */
diff --git a/progs/modules b/progs/modules
new file mode 100644
index 0000000..349061f
--- /dev/null
+++ b/progs/modules
@@ -0,0 +1,50 @@
+# $Id: modules,v 1.25 2021/04/18 17:21:03 tom Exp $
+# Program modules (some are in ncurses lib!)
+##############################################################################
+# Copyright 2020,2021 Thomas E. Dickey                                       #
+# Copyright 1998-2014,2016 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey	1995-on
+#
+
+@ base
+clear		progs		$(srcdir)	$(HEADER_DEPS) tty_settings.h
+tic		progs		$(srcdir)	$(HEADER_DEPS) transform.h $(srcdir)/dump_entry.h $(srcdir)/tparm_type.h
+toe		progs		$(srcdir)	$(HEADER_DEPS)             $(INCDIR)/hashed_db.h
+clear_cmd	progs		$(srcdir)	$(HEADER_DEPS) clear_cmd.h
+dump_entry	progs		$(srcdir)	$(HEADER_DEPS)             $(srcdir)/dump_entry.h ../include/parametrized.h $(INCDIR)/capdefaults.c termsort.h
+infocmp		progs		$(srcdir)	$(HEADER_DEPS)             $(srcdir)/dump_entry.h
+reset_cmd	progs		$(srcdir)	$(HEADER_DEPS) reset_cmd.h tty_settings.h
+tabs		progs		$(srcdir)	$(HEADER_DEPS)
+tparm_type	progs		$(srcdir)	$(HEADER_DEPS)             $(srcdir)/tparm_type.h
+tput		progs		$(srcdir)	$(HEADER_DEPS) transform.h $(srcdir)/tparm_type.h reset_cmd.h tty_settings.h
+tset		progs		$(srcdir)	$(HEADER_DEPS) transform.h ../include/termcap.h reset_cmd.h  tty_settings.h
+transform	progs		$(srcdir)	$(HEADER_DEPS) transform.h
+tty_settings	progs		$(srcdir)	$(HEADER_DEPS) tty_settings.h
+
+# vile:makemode
diff --git a/progs/progs.priv.h b/progs/progs.priv.h
new file mode 100644
index 0000000..00b98d0
--- /dev/null
+++ b/progs/progs.priv.h
@@ -0,0 +1,263 @@
+/****************************************************************************
+ * Copyright 2019-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2015,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                    1997-on                     *
+ ****************************************************************************/
+/*
+ * $Id: progs.priv.h,v 1.59 2022/09/17 18:58:05 tom Exp $
+ *
+ *	progs.priv.h
+ *
+ *	Header file for curses utility programs
+ */
+
+#ifndef PROGS_PRIV_H
+#define PROGS_PRIV_H 1
+
+#include <ncurses_cfg.h>
+
+#if USE_RCS_IDS
+#define MODULE_ID(id) static const char Ident[] = id;
+#else
+#define MODULE_ID(id)		/*nothing */
+#endif
+
+#include <stdlib.h>
+#include <ctype.h>
+#include <string.h>
+#include <sys/types.h>
+
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#if HAVE_LIMITS_H
+# include <limits.h>
+#elif HAVE_SYS_PARAM_H
+# include <sys/param.h>
+#endif
+
+#if HAVE_DIRENT_H
+# include <dirent.h>
+# define NAMLEN(dirent) strlen((dirent)->d_name)
+# if defined(_FILE_OFFSET_BITS) && defined(HAVE_STRUCT_DIRENT64)
+#  if !defined(_LP64) && (_FILE_OFFSET_BITS == 64)
+#   define	DIRENT	struct dirent64
+#  else
+#   define	DIRENT	struct dirent
+#  endif
+# else
+#  define	DIRENT	struct dirent
+# endif
+#else
+# define DIRENT struct direct
+# define NAMLEN(dirent) (dirent)->d_namlen
+# if HAVE_SYS_NDIR_H
+#  include <sys/ndir.h>
+# endif
+# if HAVE_SYS_DIR_H
+#  include <sys/dir.h>
+# endif
+# if HAVE_NDIR_H
+#  include <ndir.h>
+# endif
+#endif
+
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#else
+# if HAVE_STDINT_H
+#  include <stdint.h>
+# endif
+#endif
+
+#include <assert.h>
+#include <errno.h>
+
+#if DECL_ERRNO
+extern int errno;
+#endif
+
+#if HAVE_GETOPT_H
+#include <getopt.h>
+#elif !defined(HAVE_GETOPT_HEADER)
+/* 'getopt()' may be prototyped in <stdlib.h>, but declaring its
+ * variables doesn't hurt.
+ */
+extern char *optarg;
+extern int optind;
+#endif /* HAVE_GETOPT_H */
+
+#undef _NC_WINDOWS
+#if (defined(_WIN32) || defined(_WIN64))
+#define _NC_WINDOWS 1
+#endif
+
+#define NCURSES_INTERNALS 1
+#define NCURSES_OPAQUE    0
+
+#include <curses.h>
+
+#if !(defined(NCURSES_WGETCH_EVENTS) && defined(NEED_KEY_EVENT))
+#undef KEY_EVENT		/* reduce compiler-warnings with Visual C++ */
+#endif
+
+#include <term_entry.h>
+#include <nc_termios.h>
+#include <tic.h>
+#include <nc_tparm.h>
+
+#include <nc_string.h>
+#include <nc_alloc.h>
+#include <nc_access.h>
+
+#if HAVE_NC_FREEALL
+#undef ExitProgram
+#ifdef USE_LIBTINFO
+#define ExitProgram(code) exit_terminfo(code)
+#else
+#define ExitProgram(code) _nc_free_tic(code)
+#endif
+#endif
+
+/* error-returns for tput */
+#define ErrUsage	2
+#define ErrTermType	3
+#define ErrCapName	4
+#define ErrSystem(n)	(4 + (n))
+
+#if defined(__GNUC__) && defined(_FORTIFY_SOURCE)
+#define IGNORE_RC(func) errno = (int) func
+#else
+#define IGNORE_RC(func) (void) func
+#endif /* gcc workarounds */
+
+/* usually in <unistd.h> */
+#ifndef STDIN_FILENO
+#define STDIN_FILENO 0
+#endif
+
+#ifndef STDOUT_FILENO
+#define STDOUT_FILENO 1
+#endif
+
+#ifndef STDERR_FILENO
+#define STDERR_FILENO 2
+#endif
+
+#ifndef EXIT_SUCCESS
+#define EXIT_SUCCESS 0
+#endif
+
+#ifndef EXIT_FAILURE
+#define EXIT_FAILURE 1
+#endif
+
+#ifndef R_OK
+#define	R_OK	4		/* Test for readable.  */
+#endif
+
+#ifndef W_OK
+#define	W_OK	2		/* Test for writable.  */
+#endif
+
+#ifndef X_OK
+#define	X_OK	1		/* Test for executable.  */
+#endif
+
+#ifndef F_OK
+#define	F_OK	0		/* Test for existence.  */
+#endif
+
+/* usually in <unistd.h> */
+#ifndef STDOUT_FILENO
+#define STDOUT_FILENO 1
+#endif
+
+#ifndef STDERR_FILENO
+#define STDERR_FILENO 2
+#endif
+
+/* may be in limits.h, included from various places */
+#ifndef PATH_MAX
+# if defined(_POSIX_PATH_MAX)
+#  define PATH_MAX _POSIX_PATH_MAX
+# elif defined(MAXPATHLEN)
+#  define PATH_MAX MAXPATHLEN
+# else
+#  define PATH_MAX 255		/* the Posix minimum pathsize */
+# endif
+#endif
+
+/* We use isascii only to guard against use of 7-bit ctype tables in the
+ * isprint test in infocmp.
+ */
+#if !HAVE_ISASCII
+# undef isascii
+# if ('z'-'a' == 25) && ('z' < 127) && ('Z'-'A' == 25) && ('Z' < 127) && ('9' < 127)
+#  define isascii(c) (UChar(c) <= 127)
+# else
+#  define isascii(c) 1		/* not really ascii anyway */
+# endif
+#endif
+
+#define UChar(c)    ((unsigned char)(c))
+
+#define SIZEOF(v) (sizeof(v)/sizeof(v[0]))
+
+#define VtoTrace(opt) (unsigned) ((opt > 0) ? opt : (opt == 0))
+
+/*
+ * If configured for tracing, the debug- and trace-output are merged together
+ * in the trace file for "upper" levels of the verbose option.
+ */
+#ifdef TRACE
+#define use_verbosity(level) do { \
+ 		set_trace_level(level); \
+		if (_nc_tracing > DEBUG_LEVEL(2)) \
+		    _nc_tracing |= TRACE_MAXIMUM; \
+		else if (_nc_tracing == DEBUG_LEVEL(2)) \
+		    _nc_tracing |= TRACE_ORDINARY; \
+		if (level >= 2) \
+		    curses_trace(_nc_tracing); \
+	} while (0)
+#else
+#define use_verbosity(level) do { set_trace_level(level); } while (0)
+#endif
+
+#define NCURSES_EXT_NUMBERS (NCURSES_EXT_COLORS && HAVE_INIT_EXTENDED_COLOR)
+
+#if NCURSES_EXT_NUMBERS
+#else
+#define _nc_free_termtype2(t) _nc_free_termtype(t)
+#define _nc_read_entry2(n,f,t) _nc_read_entry(n,f,t)
+#endif
+
+#endif /* PROGS_PRIV_H */
diff --git a/progs/reset_cmd.c b/progs/reset_cmd.c
new file mode 100644
index 0000000..eff3af7
--- /dev/null
+++ b/progs/reset_cmd.c
@@ -0,0 +1,660 @@
+/****************************************************************************
+ * Copyright 2019-2020,2021 Thomas E. Dickey                                *
+ * Copyright 2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                                                *
+ ****************************************************************************/
+
+#include <reset_cmd.h>
+#include <tty_settings.h>
+
+#include <errno.h>
+#include <stdio.h>
+#include <fcntl.h>
+
+#if HAVE_SIZECHANGE
+# if !defined(sun) || !TERMIOS
+#  if HAVE_SYS_IOCTL_H
+#   include <sys/ioctl.h>
+#  endif
+# endif
+#endif
+
+#if NEED_PTEM_H
+/* they neglected to define struct winsize in termios.h -- it is only
+   in termio.h	*/
+#include <sys/stream.h>
+#include <sys/ptem.h>
+#endif
+
+MODULE_ID("$Id: reset_cmd.c,v 1.28 2021/10/02 18:08:44 tom Exp $")
+
+/*
+ * SCO defines TIOCGSIZE and the corresponding struct.  Other systems (SunOS,
+ * Solaris, IRIX) define TIOCGWINSZ and struct winsize.
+ */
+#ifdef TIOCGSIZE
+# define IOCTL_GET_WINSIZE TIOCGSIZE
+# define IOCTL_SET_WINSIZE TIOCSSIZE
+# define STRUCT_WINSIZE struct ttysize
+# define WINSIZE_ROWS(n) n.ts_lines
+# define WINSIZE_COLS(n) n.ts_cols
+#else
+# ifdef TIOCGWINSZ
+#  define IOCTL_GET_WINSIZE TIOCGWINSZ
+#  define IOCTL_SET_WINSIZE TIOCSWINSZ
+#  define STRUCT_WINSIZE struct winsize
+#  define WINSIZE_ROWS(n) n.ws_row
+#  define WINSIZE_COLS(n) n.ws_col
+# endif
+#endif
+
+static FILE *my_file;
+
+static bool use_reset = FALSE;	/* invoked as reset */
+static bool use_init = FALSE;	/* invoked as init */
+
+static GCC_NORETURN void
+failed(const char *msg)
+{
+    int code = errno;
+
+    (void) fprintf(stderr, "%s: %s: %s\n", _nc_progname, msg, strerror(code));
+    restore_tty_settings();
+    (void) fprintf(my_file, "\n");
+    fflush(my_file);
+    ExitProgram(ErrSystem(code));
+    /* NOTREACHED */
+}
+
+static bool
+cat_file(char *file)
+{
+    FILE *fp;
+    size_t nr;
+    char buf[BUFSIZ];
+    bool sent = FALSE;
+
+    if (file != 0) {
+	if ((fp = safe_fopen(file, "r")) == 0)
+	    failed(file);
+
+	while ((nr = fread(buf, sizeof(char), sizeof(buf), fp)) != 0) {
+	    if (fwrite(buf, sizeof(char), nr, my_file) != nr) {
+		failed(file);
+	    }
+	    sent = TRUE;
+	}
+	fclose(fp);
+    }
+    return sent;
+}
+
+static int
+out_char(int c)
+{
+    return putc(c, my_file);
+}
+
+/**************************************************************************
+ * Mode-setting logic
+ **************************************************************************/
+
+/* some BSD systems have these built in, some systems are missing
+ * one or more definitions. The safest solution is to override unless the
+ * commonly-altered ones are defined.
+ */
+#if !(defined(CERASE) && defined(CINTR) && defined(CKILL) && defined(CQUIT))
+#undef CEOF
+#undef CERASE
+#undef CINTR
+#undef CKILL
+#undef CLNEXT
+#undef CRPRNT
+#undef CQUIT
+#undef CSTART
+#undef CSTOP
+#undef CSUSP
+#endif
+
+/* control-character defaults */
+#ifndef CEOF
+#define CEOF	CTRL('D')
+#endif
+#ifndef CERASE
+#define CERASE	CTRL('H')
+#endif
+#ifndef CINTR
+#define CINTR	127		/* ^? */
+#endif
+#ifndef CKILL
+#define CKILL	CTRL('U')
+#endif
+#ifndef CLNEXT
+#define CLNEXT  CTRL('v')
+#endif
+#ifndef CRPRNT
+#define CRPRNT  CTRL('r')
+#endif
+#ifndef CQUIT
+#define CQUIT	CTRL('\\')
+#endif
+#ifndef CSTART
+#define CSTART	CTRL('Q')
+#endif
+#ifndef CSTOP
+#define CSTOP	CTRL('S')
+#endif
+#ifndef CSUSP
+#define CSUSP	CTRL('Z')
+#endif
+
+#if defined(_POSIX_VDISABLE)
+#define DISABLED(val)   (((_POSIX_VDISABLE != -1) \
+		       && ((val) == _POSIX_VDISABLE)) \
+		      || ((val) <= 0))
+#else
+#define DISABLED(val)   ((int)(val) <= 0)
+#endif
+
+#define CHK(val, dft)   (unsigned char) (DISABLED(val) ? dft : val)
+
+#define reset_char(item, value) \
+    tty_settings->c_cc[item] = CHK(tty_settings->c_cc[item], value)
+
+/*
+ * Reset the terminal mode bits to a sensible state.  Very useful after
+ * a child program dies in raw mode.
+ */
+void
+reset_tty_settings(int fd, TTY * tty_settings, int noset)
+{
+    GET_TTY(fd, tty_settings);
+
+#ifdef TERMIOS
+#if defined(VDISCARD) && defined(CDISCARD)
+    reset_char(VDISCARD, CDISCARD);
+#endif
+    reset_char(VEOF, CEOF);
+    reset_char(VERASE, CERASE);
+#if defined(VFLUSH) && defined(CFLUSH)
+    reset_char(VFLUSH, CFLUSH);
+#endif
+    reset_char(VINTR, CINTR);
+    reset_char(VKILL, CKILL);
+#if defined(VLNEXT) && defined(CLNEXT)
+    reset_char(VLNEXT, CLNEXT);
+#endif
+    reset_char(VQUIT, CQUIT);
+#if defined(VREPRINT) && defined(CRPRNT)
+    reset_char(VREPRINT, CRPRNT);
+#endif
+#if defined(VSTART) && defined(CSTART)
+    reset_char(VSTART, CSTART);
+#endif
+#if defined(VSTOP) && defined(CSTOP)
+    reset_char(VSTOP, CSTOP);
+#endif
+#if defined(VSUSP) && defined(CSUSP)
+    reset_char(VSUSP, CSUSP);
+#endif
+#if defined(VWERASE) && defined(CWERASE)
+    reset_char(VWERASE, CWERASE);
+#endif
+
+    tty_settings->c_iflag &= ~((unsigned) (IGNBRK
+					   | PARMRK
+					   | INPCK
+					   | ISTRIP
+					   | INLCR
+					   | IGNCR
+#ifdef IUCLC
+					   | IUCLC
+#endif
+#ifdef IXANY
+					   | IXANY
+#endif
+					   | IXOFF));
+
+    tty_settings->c_iflag |= (BRKINT
+			      | IGNPAR
+			      | ICRNL
+			      | IXON
+#ifdef IMAXBEL
+			      | IMAXBEL
+#endif
+	);
+
+    tty_settings->c_oflag &= ~((unsigned) (0
+#ifdef OLCUC
+					   | OLCUC
+#endif
+#ifdef OCRNL
+					   | OCRNL
+#endif
+#ifdef ONOCR
+					   | ONOCR
+#endif
+#ifdef ONLRET
+					   | ONLRET
+#endif
+#ifdef OFILL
+					   | OFILL
+#endif
+#ifdef OFDEL
+					   | OFDEL
+#endif
+#ifdef NLDLY
+					   | NLDLY
+#endif
+#ifdef CRDLY
+					   | CRDLY
+#endif
+#ifdef TABDLY
+					   | TABDLY
+#endif
+#ifdef BSDLY
+					   | BSDLY
+#endif
+#ifdef VTDLY
+					   | VTDLY
+#endif
+#ifdef FFDLY
+					   | FFDLY
+#endif
+			       ));
+
+    tty_settings->c_oflag |= (OPOST
+#ifdef ONLCR
+			      | ONLCR
+#endif
+	);
+
+    tty_settings->c_cflag &= ~((unsigned) (CSIZE
+					   | CSTOPB
+					   | PARENB
+					   | PARODD
+					   | CLOCAL));
+    tty_settings->c_cflag |= (CS8 | CREAD);
+    tty_settings->c_lflag &= ~((unsigned) (ECHONL
+					   | NOFLSH
+#ifdef TOSTOP
+					   | TOSTOP
+#endif
+#ifdef ECHOPTR
+					   | ECHOPRT
+#endif
+#ifdef XCASE
+					   | XCASE
+#endif
+			       ));
+
+    tty_settings->c_lflag |= (ISIG
+			      | ICANON
+			      | ECHO
+			      | ECHOE
+			      | ECHOK
+#ifdef ECHOCTL
+			      | ECHOCTL
+#endif
+#ifdef ECHOKE
+			      | ECHOKE
+#endif
+	);
+#endif
+
+    if (!noset) {
+	SET_TTY(fd, tty_settings);
+    }
+}
+
+/*
+ * Returns a "good" value for the erase character.  This is loosely based on
+ * the BSD4.4 logic.
+ */
+static int
+default_erase(void)
+{
+    int result;
+
+    if (over_strike
+	&& VALID_STRING(key_backspace)
+	&& strlen(key_backspace) == 1) {
+	result = key_backspace[0];
+    } else {
+	result = CERASE;
+    }
+
+    return result;
+}
+
+/*
+ * Update the values of the erase, interrupt, and kill characters in the TTY
+ * parameter.
+ *
+ * SVr4 tset (e.g., Solaris 2.5) only modifies the intr, quit or erase
+ * characters if they're unset, or if we specify them as options.  This differs
+ * from BSD 4.4 tset, which always sets erase.
+ */
+void
+set_control_chars(TTY * tty_settings, int my_erase, int my_intr, int my_kill)
+{
+#if defined(EXP_WIN32_DRIVER)
+    /* noop */
+    (void) tty_settings;
+    (void) my_erase;
+    (void) my_intr;
+    (void) my_kill;
+#else
+    if (DISABLED(tty_settings->c_cc[VERASE]) || my_erase >= 0) {
+	tty_settings->c_cc[VERASE] = UChar((my_erase >= 0)
+					   ? my_erase
+					   : default_erase());
+    }
+
+    if (DISABLED(tty_settings->c_cc[VINTR]) || my_intr >= 0) {
+	tty_settings->c_cc[VINTR] = UChar((my_intr >= 0)
+					  ? my_intr
+					  : CINTR);
+    }
+
+    if (DISABLED(tty_settings->c_cc[VKILL]) || my_kill >= 0) {
+	tty_settings->c_cc[VKILL] = UChar((my_kill >= 0)
+					  ? my_kill
+					  : CKILL);
+    }
+#endif
+}
+
+/*
+ * Set up various conversions in the TTY parameter, including parity, tabs,
+ * returns, echo, and case, according to the termcap entry.
+ */
+void
+set_conversions(TTY * tty_settings)
+{
+#if defined(EXP_WIN32_DRIVER)
+    /* FIXME */
+#else
+#ifdef ONLCR
+    tty_settings->c_oflag |= ONLCR;
+#endif
+    tty_settings->c_iflag |= ICRNL;
+    tty_settings->c_lflag |= ECHO;
+#ifdef OXTABS
+    tty_settings->c_oflag |= OXTABS;
+#endif /* OXTABS */
+
+    /* test used to be tgetflag("NL") */
+    if (VALID_STRING(newline) && newline[0] == '\n' && !newline[1]) {
+	/* Newline, not linefeed. */
+#ifdef ONLCR
+	tty_settings->c_oflag &= ~((unsigned) ONLCR);
+#endif
+	tty_settings->c_iflag &= ~((unsigned) ICRNL);
+    }
+#ifdef OXTABS
+    /* test used to be tgetflag("pt") */
+    if (VALID_STRING(set_tab) && VALID_STRING(clear_all_tabs))
+	tty_settings->c_oflag &= ~OXTABS;
+#endif /* OXTABS */
+    tty_settings->c_lflag |= (ECHOE | ECHOK);
+#endif
+}
+
+static bool
+sent_string(const char *s)
+{
+    bool sent = FALSE;
+    if (VALID_STRING(s)) {
+	tputs(s, 0, out_char);
+	sent = TRUE;
+    }
+    return sent;
+}
+
+static bool
+to_left_margin(void)
+{
+    if (VALID_STRING(carriage_return)) {
+	sent_string(carriage_return);
+    } else {
+	out_char('\r');
+    }
+    return TRUE;
+}
+
+/*
+ * Set the hardware tabs on the terminal, using the 'ct' (clear all tabs),
+ * 'st' (set one tab) and 'ch' (horizontal cursor addressing) capabilities.
+ * This is done before 'if' and 'is', so they can recover in case of error.
+ *
+ * Return TRUE if we set any tab stops, FALSE if not.
+ */
+static bool
+reset_tabstops(int wide)
+{
+    if ((init_tabs != 8)
+	&& VALID_NUMERIC(init_tabs)
+	&& VALID_STRING(set_tab)
+	&& VALID_STRING(clear_all_tabs)) {
+	int c;
+
+	to_left_margin();
+	tputs(clear_all_tabs, 0, out_char);
+	if (init_tabs > 1) {
+	    if (init_tabs > wide)
+		init_tabs = (short) wide;
+	    for (c = init_tabs; c < wide; c += init_tabs) {
+		fprintf(my_file, "%*s", init_tabs, " ");
+		tputs(set_tab, 0, out_char);
+	    }
+	    to_left_margin();
+	}
+	return (TRUE);
+    }
+    return (FALSE);
+}
+
+/* Output startup string. */
+bool
+send_init_strings(int fd GCC_UNUSED, TTY * old_settings)
+{
+    int i;
+    bool need_flush = FALSE;
+
+    (void) old_settings;
+#ifdef TAB3
+    if (old_settings != 0 &&
+	old_settings->c_oflag & (TAB3 | ONLCR | OCRNL | ONLRET)) {
+	old_settings->c_oflag &= (TAB3 | ONLCR | OCRNL | ONLRET);
+	SET_TTY(fd, old_settings);
+    }
+#endif
+    if (use_reset || use_init) {
+	if (VALID_STRING(init_prog)) {
+	    IGNORE_RC(system(init_prog));
+	}
+
+	need_flush |= sent_string((use_reset && (reset_1string != 0))
+				  ? reset_1string
+				  : init_1string);
+
+	need_flush |= sent_string((use_reset && (reset_2string != 0))
+				  ? reset_2string
+				  : init_2string);
+
+	if (VALID_STRING(clear_margins)) {
+	    need_flush |= sent_string(clear_margins);
+	} else
+#if defined(set_lr_margin)
+	if (VALID_STRING(set_lr_margin)) {
+	    need_flush |= sent_string(TIPARM_2(set_lr_margin, 0, columns - 1));
+	} else
+#endif
+#if defined(set_left_margin_parm) && defined(set_right_margin_parm)
+	    if (VALID_STRING(set_left_margin_parm)
+		&& VALID_STRING(set_right_margin_parm)) {
+	    need_flush |= sent_string(TIPARM_1(set_left_margin_parm, 0));
+	    need_flush |= sent_string(TIPARM_1(set_right_margin_parm,
+					       columns - 1));
+	} else
+#endif
+	    if (VALID_STRING(set_left_margin)
+		&& VALID_STRING(set_right_margin)) {
+	    need_flush |= to_left_margin();
+	    need_flush |= sent_string(set_left_margin);
+	    if (VALID_STRING(parm_right_cursor)) {
+		need_flush |= sent_string(TIPARM_1(parm_right_cursor,
+						   columns - 1));
+	    } else {
+		for (i = 0; i < columns - 1; i++) {
+		    out_char(' ');
+		    need_flush = TRUE;
+		}
+	    }
+	    need_flush |= sent_string(set_right_margin);
+	    need_flush |= to_left_margin();
+	}
+
+	need_flush |= reset_tabstops(columns);
+
+	need_flush |= cat_file((use_reset && reset_file) ? reset_file : init_file);
+
+	need_flush |= sent_string((use_reset && (reset_3string != 0))
+				  ? reset_3string
+				  : init_3string);
+    }
+
+    return need_flush;
+}
+
+/*
+ * Tell the user if a control key has been changed from the default value.
+ */
+static void
+show_tty_change(TTY * old_settings,
+		TTY * new_settings,
+		const char *name,
+		int which,
+		unsigned def)
+{
+    unsigned older = 0, newer = 0;
+    char *p;
+
+#if defined(EXP_WIN32_DRIVER)
+    /* noop */
+    (void) old_settings;
+    (void) new_settings;
+    (void) name;
+    (void) which;
+    (void) def;
+#else
+    newer = new_settings->c_cc[which];
+    older = old_settings->c_cc[which];
+
+    if (older == newer && older == def)
+	return;
+#endif
+    (void) fprintf(stderr, "%s %s ", name, older == newer ? "is" : "set to");
+
+    if (DISABLED(newer)) {
+	(void) fprintf(stderr, "undef.\n");
+	/*
+	 * Check 'delete' before 'backspace', since the key_backspace value
+	 * is ambiguous.
+	 */
+    } else if (newer == 0177) {
+	(void) fprintf(stderr, "delete.\n");
+    } else if ((p = key_backspace) != 0
+	       && newer == (unsigned char) p[0]
+	       && p[1] == '\0') {
+	(void) fprintf(stderr, "backspace.\n");
+    } else if (newer < 040) {
+	newer ^= 0100;
+	(void) fprintf(stderr, "control-%c (^%c).\n", UChar(newer), UChar(newer));
+    } else
+	(void) fprintf(stderr, "%c.\n", UChar(newer));
+}
+
+/**************************************************************************
+ * Miscellaneous.
+ **************************************************************************/
+
+void
+reset_start(FILE *fp, bool is_reset, bool is_init)
+{
+    my_file = fp;
+    use_reset = is_reset;
+    use_init = is_init;
+}
+
+void
+reset_flush(void)
+{
+    if (my_file != 0)
+	fflush(my_file);
+}
+
+void
+print_tty_chars(TTY * old_settings, TTY * new_settings)
+{
+#if defined(EXP_WIN32_DRIVER)
+    /* noop */
+#else
+    show_tty_change(old_settings, new_settings, "Erase", VERASE, CERASE);
+    show_tty_change(old_settings, new_settings, "Kill", VKILL, CKILL);
+    show_tty_change(old_settings, new_settings, "Interrupt", VINTR, CINTR);
+#endif
+}
+
+#if HAVE_SIZECHANGE
+/*
+ * Set window size if not set already, but update our copy of the values if the
+ * size was set.
+ */
+void
+set_window_size(int fd, short *high, short *wide)
+{
+    STRUCT_WINSIZE win;
+    (void) ioctl(fd, IOCTL_GET_WINSIZE, &win);
+    if (WINSIZE_ROWS(win) == 0 &&
+	WINSIZE_COLS(win) == 0) {
+	if (*high > 0 && *wide > 0) {
+	    WINSIZE_ROWS(win) = (unsigned short) *high;
+	    WINSIZE_COLS(win) = (unsigned short) *wide;
+	    (void) ioctl(fd, IOCTL_SET_WINSIZE, &win);
+	}
+    } else if (WINSIZE_ROWS(win) > 0 &&
+	       WINSIZE_COLS(win) > 0) {
+	*high = (short) WINSIZE_ROWS(win);
+	*wide = (short) WINSIZE_COLS(win);
+    }
+}
+#endif
diff --git a/progs/reset_cmd.h b/progs/reset_cmd.h
new file mode 100644
index 0000000..91a637c
--- /dev/null
+++ b/progs/reset_cmd.h
@@ -0,0 +1,66 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 2016 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E Dickey                                                 *
+ ****************************************************************************/
+
+/*
+ * $Id: reset_cmd.h,v 1.9 2021/10/02 20:58:58 tom Exp $
+ *
+ * Utility functions for resetting terminal.
+ */
+#ifndef RESET_CMD_H
+#define RESET_CMD_H 1
+/* *INDENT-OFF* */
+
+#define USE_LIBTINFO
+#define __INTERNAL_CAPS_VISIBLE	/* we need to see has_hardware_tabs */
+#include <progs.priv.h>
+
+#undef CTRL
+#define CTRL(x)	((x) & 0x1f)
+
+extern bool send_init_strings(int /* fd */, TTY * /* old_settings */);
+extern void print_tty_chars(TTY * /* old_settings */, TTY * /* new_settings */);
+extern void reset_flush(void);
+extern void reset_start(FILE * /* fp */, bool /* is_reset */, bool /* is_init */ );
+extern void reset_tty_settings(int /* fd */, TTY * /* tty_settings */, int /* noset */);
+extern void set_control_chars(TTY * /* tty_settings */, int /* erase */, int /* intr */, int /* kill */);
+extern void set_conversions(TTY * /* tty_settings */);
+
+#if HAVE_SIZECHANGE
+extern void set_window_size(int /* fd */, short * /* high */, short * /* wide */);
+#endif
+
+extern const char *_nc_progname;
+
+/* *INDENT-ON* */
+
+#endif /* RESET_CMD_H */
diff --git a/progs/tabs.c b/progs/tabs.c
new file mode 100644
index 0000000..7378d11
--- /dev/null
+++ b/progs/tabs.c
@@ -0,0 +1,703 @@
+/****************************************************************************
+ * Copyright 2020-2021,2022 Thomas E. Dickey                                *
+ * Copyright 2008-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                        2008                    *
+ ****************************************************************************/
+
+/*
+ * tabs.c --  set terminal hard-tabstops
+ */
+
+#define USE_LIBTINFO
+#include <progs.priv.h>
+#include <tty_settings.h>
+
+MODULE_ID("$Id: tabs.c,v 1.51 2022/02/26 22:44:44 tom Exp $")
+
+static GCC_NORETURN void usage(void);
+
+const char *_nc_progname;
+static int max_cols;
+
+static void
+failed(const char *s)
+{
+    perror(s);
+    ExitProgram(EXIT_FAILURE);
+}
+
+static int
+putch(int c)
+{
+    return putchar(c);
+}
+
+static char *
+skip_csi(char *value)
+{
+    if (UChar(*value) == 0x9b)
+	++value;
+    else if (!strncmp(value, "\033[", 2))
+	value += 2;
+    return value;
+}
+
+/*
+ * If the terminal uses ANSI clear_all_tabs, then it is not necessary to first
+ * move to the left margin before clearing tabs.
+ */
+static bool
+ansi_clear_tabs(void)
+{
+    bool result = FALSE;
+    if (VALID_STRING(clear_all_tabs)) {
+	char *param = skip_csi(clear_all_tabs);
+	if (!strcmp(param, "3g"))
+	    result = TRUE;
+    }
+    return result;
+}
+
+static void
+do_tabs(int *tab_list)
+{
+    int last = 1;
+    int stop;
+    bool first = TRUE;
+
+    while ((stop = *tab_list++) > 0) {
+	if (first) {
+	    first = FALSE;
+	    putchar('\r');
+	}
+	if (last < stop) {
+	    while (last++ < stop) {
+		if (last > max_cols)
+		    break;
+		putchar(' ');
+	    }
+	}
+	if (stop <= max_cols) {
+	    tputs(set_tab, 1, putch);
+	    last = stop;
+	} else {
+	    break;
+	}
+    }
+    putchar('\r');
+}
+
+/*
+ * Decode a list of tab-stops from a string, returning an array of integers.
+ * If the margin is positive (because the terminal does not support margins),
+ * work around this by adding the margin to the decoded values.
+ */
+static int *
+decode_tabs(const char *tab_list, int margin)
+{
+    int *result = typeCalloc(int, strlen(tab_list) + (unsigned) max_cols);
+    int n = 0;
+    int value = 0;
+    int prior = 0;
+    int ch;
+
+    if (result == NULL)
+	failed("decode_tabs");
+
+    if (margin < 0)
+	margin = 0;
+
+    while ((ch = *tab_list++) != '\0') {
+	if (isdigit(UChar(ch))) {
+	    value *= 10;
+	    value += (ch - '0');
+	    if (value > max_cols)
+		value = max_cols;
+	} else if (ch == ',') {
+	    result[n] = value + prior + margin;
+	    if (n > 0 && result[n] <= result[n - 1]) {
+		fprintf(stderr,
+			"%s: tab-stops are not in increasing order: %d %d\n",
+			_nc_progname, value, result[n - 1]);
+		free(result);
+		result = 0;
+		break;
+	    }
+	    ++n;
+	    value = 0;
+	    prior = 0;
+	} else if (ch == '+') {
+	    if (n)
+		prior = result[n - 1];
+	}
+    }
+
+    if (result != 0) {
+	/*
+	 * If there is only one value, then it is an option such as "-8".
+	 */
+	if ((n == 0) && (value > 0)) {
+	    int step = value;
+	    value = 1;
+	    while (n < max_cols - 1) {
+		result[n++] = value + margin;
+		value += step;
+	    }
+	}
+
+	/*
+	 * Add the last value, if any.
+	 */
+	result[n++] = value + prior + margin;
+	result[n] = 0;
+    }
+
+    return result;
+}
+
+static void
+print_ruler(int *tab_list, const char *new_line)
+{
+    int last = 0;
+    int n;
+
+    /* first print a readable ruler */
+    for (n = 0; n < max_cols; n += 10) {
+	int ch = 1 + (n / 10);
+	char buffer[20];
+	_nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer))
+		    "----+----%c",
+		    ((ch < 10)
+		     ? (ch + '0')
+		     : (ch + 'A' - 10)));
+	printf("%.*s", ((max_cols - n) > 10) ? 10 : (max_cols - n), buffer);
+    }
+    printf("%s", new_line);
+
+    /* now, print '*' for each stop */
+    for (n = 0, last = 0; (tab_list[n] > 0) && (last < max_cols); ++n) {
+	int stop = tab_list[n];
+
+	while (++last < stop) {
+	    if (last <= max_cols) {
+		putchar('-');
+	    } else {
+		break;
+	    }
+	}
+	if (last <= max_cols) {
+	    putchar('*');
+	    last = stop;
+	} else {
+	    break;
+	}
+    }
+    while (++last <= max_cols)
+	putchar('-');
+    printf("%s", new_line);
+}
+
+/*
+ * Write an '*' on each tabstop, to demonstrate whether it lines up with the
+ * ruler.
+ */
+static void
+write_tabs(int *tab_list, const char *new_line)
+{
+    int stop;
+
+    while ((stop = *tab_list++) > 0 && stop <= max_cols) {
+	fputs((stop == 1) ? "*" : "\t*", stdout);
+    };
+    /* also show a tab _past_ the stops */
+    if (stop < max_cols)
+	fputs("\t+", stdout);
+    fputs(new_line, stdout);
+}
+
+/*
+ * Trim leading/trailing blanks, as well as blanks after a comma.
+ * Convert embedded blanks to commas.
+ */
+static char *
+trimmed_tab_list(const char *source)
+{
+    char *result = strdup(source);
+    if (result != 0) {
+	int j, k, last;
+
+	for (j = k = last = 0; result[j] != 0; ++j) {
+	    int ch = UChar(result[j]);
+	    if (isspace(ch)) {
+		if (last == '\0') {
+		    continue;
+		} else if (isdigit(last) || last == ',') {
+		    ch = ',';
+		}
+	    } else if (ch == ',') {
+		;
+	    } else {
+		if (last == ',')
+		    result[k++] = (char) last;
+		result[k++] = (char) ch;
+	    }
+	    last = ch;
+	}
+	result[k] = '\0';
+    }
+    return result;
+}
+
+static bool
+comma_is_needed(const char *source)
+{
+    bool result = FALSE;
+
+    if (source != 0) {
+	size_t len = strlen(source);
+	if (len != 0)
+	    result = (source[len - 1] != ',');
+    } else {
+	result = FALSE;
+    }
+    return result;
+}
+
+/*
+ * Add a command-line parameter to the tab-list.  It can be blank- or comma-
+ * separated (or a mixture).  For simplicity, empty tabs are ignored, e.g.,
+ *	tabs 1,,6,11
+ *	tabs 1,6,11
+ * are treated the same.
+ */
+static const char *
+add_to_tab_list(char **append, const char *value)
+{
+    char *result = *append;
+    char *copied = trimmed_tab_list(value);
+
+    if (copied != 0 && *copied != '\0') {
+	const char *comma = ",";
+	size_t need = 1 + strlen(copied);
+
+	if (*copied == ',')
+	    comma = "";
+	else if (!comma_is_needed(*append))
+	    comma = "";
+
+	need += strlen(comma);
+	if (*append != 0)
+	    need += strlen(*append);
+
+	result = malloc(need);
+	if (result == 0)
+	    failed("add_to_tab_list");
+
+	*result = '\0';
+	if (*append != 0) {
+	    _nc_STRCPY(result, *append, need);
+	    free(*append);
+	}
+	_nc_STRCAT(result, comma, need);
+	_nc_STRCAT(result, copied, need);
+
+	*append = result;
+    }
+    free(copied);
+    return result;
+}
+
+/*
+ * If the terminal supports it, (re)set the left margin and return true.
+ * Otherwise, return false.
+ */
+static bool
+do_set_margin(int margin, bool no_op)
+{
+    bool result = FALSE;
+
+    if (margin == 0) {		/* 0 is special case for resetting */
+	if (VALID_STRING(clear_margins)) {
+	    result = TRUE;
+	    if (!no_op)
+		tputs(clear_margins, 1, putch);
+	}
+    } else if (margin-- < 0) {	/* margin will be 0-based from here on */
+	result = TRUE;
+    } else if (VALID_STRING(set_left_margin)) {
+	result = TRUE;
+	if (!no_op) {
+	    /*
+	     * assuming we're on the first column of the line, move the cursor
+	     * to the column at which we will set a margin.
+	     */
+	    if (VALID_STRING(column_address)) {
+		tputs(TIPARM_1(column_address, margin), 1, putch);
+	    } else if (margin >= 1) {
+		if (VALID_STRING(parm_right_cursor)) {
+		    tputs(TIPARM_1(parm_right_cursor, margin), 1, putch);
+		} else {
+		    while (margin-- > 0)
+			putch(' ');
+		}
+	    }
+	    tputs(set_left_margin, 1, putch);
+	}
+    } else if (VALID_STRING(set_left_margin_parm)) {
+	result = TRUE;
+	if (!no_op) {
+	    if (VALID_STRING(set_right_margin_parm)) {
+		tputs(TIPARM_1(set_left_margin_parm, margin), 1, putch);
+	    } else {
+		tputs(TIPARM_2(set_left_margin_parm, margin, max_cols), 1, putch);
+	    }
+	}
+    } else if (VALID_STRING(set_lr_margin)) {
+	result = TRUE;
+	if (!no_op) {
+	    tputs(TIPARM_2(set_lr_margin, margin, max_cols), 1, putch);
+	}
+    }
+    return result;
+}
+
+/*
+ * Check for illegal characters in the tab-list.
+ */
+static bool
+legal_tab_list(const char *tab_list)
+{
+    bool result = TRUE;
+
+    if (tab_list != 0 && *tab_list != '\0') {
+	if (comma_is_needed(tab_list)) {
+	    int n;
+
+	    for (n = 0; tab_list[n] != '\0'; ++n) {
+		int ch = UChar(tab_list[n]);
+
+		if (!(isdigit(ch) || ch == ',' || ch == '+')) {
+		    fprintf(stderr,
+			    "%s: unexpected character found '%c'\n",
+			    _nc_progname, ch);
+		    result = FALSE;
+		    break;
+		}
+	    }
+	} else {
+	    fprintf(stderr, "%s: trailing comma found '%s'\n", _nc_progname, tab_list);
+	    result = FALSE;
+	}
+    } else {
+	/* if no list given, default to "tabs -8" */
+    }
+    return result;
+}
+
+static char *
+skip_list(char *value)
+{
+    while (*value != '\0' &&
+	   (isdigit(UChar(*value)) ||
+	    isspace(UChar(*value)) ||
+	    strchr("+,", UChar(*value)) != 0)) {
+	++value;
+    }
+    return value;
+}
+
+static void
+usage(void)
+{
+#define DATA(s) s "\n"
+    static const char msg[] =
+    {
+	DATA("Usage: tabs [options] [tabstop-list]")
+	DATA("")
+	DATA("Options:")
+	DATA("  -0       reset tabs")
+	DATA("  -8       set tabs to standard interval")
+	DATA("  -a       Assembler, IBM S/370, first format")
+	DATA("  -a2      Assembler, IBM S/370, second format")
+	DATA("  -c       COBOL, normal format")
+	DATA("  -c2      COBOL compact format")
+	DATA("  -c3      COBOL compact format extended")
+	DATA("  -d       debug (show ruler with expected/actual tab positions)")
+	DATA("  -f       FORTRAN")
+	DATA("  -n       no-op (do not modify terminal settings)")
+	DATA("  -p       PL/I")
+	DATA("  -s       SNOBOL")
+	DATA("  -u       UNIVAC 1100 Assembler")
+	DATA("  -T name  use terminal type 'name'")
+	DATA("  -V       print version")
+	DATA("")
+	DATA("A tabstop-list is an ordered list of column numbers, e.g., 1,11,21")
+	DATA("or 1,+10,+10 which is the same.")
+    };
+#undef DATA
+
+    fflush(stdout);
+    fputs(msg, stderr);
+    ExitProgram(EXIT_FAILURE);
+}
+
+int
+main(int argc, char *argv[])
+{
+    int rc = EXIT_FAILURE;
+    bool debug = FALSE;
+    bool no_op = FALSE;
+    bool change_tty = FALSE;
+    int n, ch;
+    NCURSES_CONST char *term_name = 0;
+    char *append = 0;
+    const char *tab_list = 0;
+    const char *new_line = "\n";
+    int margin = -1;
+    TTY tty_settings;
+    int fd;
+
+    _nc_progname = _nc_rootname(argv[0]);
+
+    if ((term_name = getenv("TERM")) == 0)
+	term_name = "ansi+tabs";
+
+    /* cannot use getopt, since some options are two-character */
+    for (n = 1; n < argc; ++n) {
+	char *option = argv[n];
+	switch (option[0]) {
+	case '-':
+	    while ((ch = *++option) != '\0') {
+		switch (ch) {
+		case 'a':
+		    switch (*++option) {
+		    default:
+		    case '\0':
+			tab_list = "1,10,16,36,72";
+			option--;
+			/* Assembler, IBM S/370, first format */
+			break;
+		    case '2':
+			tab_list = "1,10,16,40,72";
+			/* Assembler, IBM S/370, second format */
+			break;
+		    }
+		    break;
+		case 'c':
+		    switch (*++option) {
+		    default:
+		    case '\0':
+			tab_list = "1,8,12,16,20,55";
+			option--;
+			/* COBOL, normal format */
+			break;
+		    case '2':
+			tab_list = "1,6,10,14,49";
+			/* COBOL compact format */
+			break;
+		    case '3':
+			tab_list = "1,6,10,14,18,22,26,30,34,38,42,46,50,54,58,62,67";
+			/* COBOL compact format extended */
+			break;
+		    }
+		    break;
+		case 'd':	/* ncurses extension */
+		    debug = TRUE;
+		    break;
+		case 'f':
+		    tab_list = "1,7,11,15,19,23";
+		    /* FORTRAN */
+		    break;
+		case 'n':	/* ncurses extension */
+		    no_op = TRUE;
+		    break;
+		case 'p':
+		    tab_list = "1,5,9,13,17,21,25,29,33,37,41,45,49,53,57,61";
+		    /* PL/I */
+		    break;
+		case 's':
+		    tab_list = "1,10,55";
+		    /* SNOBOL */
+		    break;
+		case 'u':
+		    tab_list = "1,12,20,44";
+		    /* UNIVAC 1100 Assembler */
+		    break;
+		case 'T':
+		    ++n;
+		    if (*++option != '\0') {
+			term_name = option;
+		    } else {
+			term_name = argv[n];
+			option--;
+		    }
+		    option += ((int) strlen(option)) - 1;
+		    continue;
+		case 'V':
+		    puts(curses_version());
+		    ExitProgram(EXIT_SUCCESS);
+		default:
+		    if (isdigit(UChar(*option))) {
+			char *copy = strdup(option);
+			*skip_list(copy) = '\0';
+			tab_list = copy;
+			option = skip_list(option) - 1;
+		    } else {
+			usage();
+		    }
+		    break;
+		}
+	    }
+	    break;
+	case '+':
+	    if ((ch = *++option) != '\0') {
+		int digits = 0;
+		int number = 0;
+
+		switch (ch) {
+		case 'm':
+		    /*
+		     * The "+mXXX" option is unimplemented because only the long-obsolete
+		     * att510d implements smgl, which is needed to support
+		     * this option.
+		     */
+		    while ((ch = *++option) != '\0') {
+			if (isdigit(UChar(ch))) {
+			    ++digits;
+			    number = number * 10 + (ch - '0');
+			} else {
+			    usage();
+			}
+		    }
+		    if (digits == 0)
+			number = 10;
+		    margin = number;
+		    break;
+		default:
+		    /* special case of relative stops separated by spaces? */
+		    if (option == argv[n] + 1) {
+			tab_list = add_to_tab_list(&append, argv[n]);
+		    }
+		    break;
+		}
+	    }
+	    break;
+	default:
+	    if (append != 0) {
+		if (tab_list != (const char *) append) {
+		    /* one of the predefined options was used */
+		    free(append);
+		    append = 0;
+		}
+	    }
+	    tab_list = add_to_tab_list(&append, option);
+	    break;
+	}
+    }
+
+    fd = save_tty_settings(&tty_settings, FALSE);
+
+    setupterm(term_name, fd, (int *) 0);
+
+    max_cols = (columns > 0) ? columns : 80;
+    if (margin > 0)
+	max_cols -= margin;
+
+    if (!VALID_STRING(clear_all_tabs)) {
+	fprintf(stderr,
+		"%s: terminal type '%s' cannot reset tabs\n",
+		_nc_progname, term_name);
+    } else if (!VALID_STRING(set_tab)) {
+	fprintf(stderr,
+		"%s: terminal type '%s' cannot set tabs\n",
+		_nc_progname, term_name);
+    } else if (legal_tab_list(tab_list)) {
+	int *list;
+
+	if (tab_list == NULL)
+	    tab_list = add_to_tab_list(&append, "8");
+
+	if (!no_op) {
+#if defined(TERMIOS) && defined(OCRNL)
+	    /* set tty modes to -ocrnl to allow \r */
+	    if (isatty(STDOUT_FILENO)) {
+		TTY new_settings = tty_settings;
+		new_settings.c_oflag &= (unsigned)~OCRNL;
+		update_tty_settings(&tty_settings, &new_settings);
+		change_tty = TRUE;
+		new_line = "\r\n";
+	    }
+#endif
+
+	    if (!ansi_clear_tabs())
+		putch('\r');
+	    tputs(clear_all_tabs, 1, putch);
+	}
+
+	if (margin >= 0) {
+	    putch('\r');
+	    if (margin > 0) {
+		/* reset existing margin before setting margin, to reduce
+		 * problems moving left of the current margin.
+		 */
+		if (do_set_margin(0, no_op))
+		    putch('\r');
+	    }
+	    if (do_set_margin(margin, no_op))
+		margin = -1;
+	}
+
+	list = decode_tabs(tab_list, margin);
+
+	if (list != 0) {
+	    if (!no_op)
+		do_tabs(list);
+	    if (debug) {
+		fflush(stderr);
+		printf("tabs %s%s", tab_list, new_line);
+		print_ruler(list, new_line);
+		write_tabs(list, new_line);
+	    }
+	    free(list);
+	} else if (debug) {
+	    fflush(stderr);
+	    printf("tabs %s%s", tab_list, new_line);
+	}
+	if (!no_op) {
+	    if (change_tty) {
+		restore_tty_settings();
+	    }
+	}
+	rc = EXIT_SUCCESS;
+    }
+    if (append != 0)
+	free(append);
+    ExitProgram(rc);
+}
diff --git a/progs/tic.c b/progs/tic.c
new file mode 100644
index 0000000..93a0b49
--- /dev/null
+++ b/progs/tic.c
@@ -0,0 +1,3354 @@
+/****************************************************************************
+ * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2017,2018 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996 on                 *
+ ****************************************************************************/
+
+/*
+ *	tic.c --- Main program for terminfo compiler
+ *			by Eric S. Raymond
+ *			and Thomas E Dickey
+ *
+ */
+
+#include <progs.priv.h>
+#include <sys/stat.h>
+
+#include <dump_entry.h>
+#include <tparm_type.h>
+#include <hashed_db.h>
+#include <parametrized.h>
+#include <transform.h>
+
+MODULE_ID("$Id: tic.c,v 1.320 2022/09/17 18:55:28 tom Exp $")
+
+#define STDIN_NAME "<stdin>"
+
+const char *_nc_progname = "tic";
+
+static FILE *log_fp;
+static FILE *tmp_fp;
+static bool capdump = FALSE;	/* running as infotocap? */
+static bool infodump = FALSE;	/* running as captoinfo? */
+static bool showsummary = FALSE;
+static unsigned debug_level;
+static char **namelst = 0;
+static const char *to_remove;
+
+#if NCURSES_XNAMES
+static bool using_extensions = FALSE;
+#endif
+
+static void (*save_check_termtype) (TERMTYPE2 *, bool);
+static void check_termtype(TERMTYPE2 *tt, bool);
+
+static const char usage_string[] = "\
+[-e names] \
+[-o dir] \
+[-R name] \
+[-v[n]] \
+[-V] \
+[-w[n]] \
+[-\
+1\
+a\
+C\
+D\
+c\
+f\
+G\
+g\
+I\
+K\
+L\
+N\
+r\
+s\
+T\
+t\
+U\
+x\
+] \
+source-file\n";
+
+#if NO_LEAKS
+static void
+free_namelist(char **src)
+{
+    if (src != 0) {
+	int n;
+	for (n = 0; src[n] != 0; ++n)
+	    free(src[n]);
+	free(src);
+    }
+}
+#endif
+
+static void
+cleanup(void)
+{
+#if NO_LEAKS
+    free_namelist(namelst);
+    _nc_leaks_dump_entry();
+#endif
+    if (tmp_fp != 0)
+	fclose(tmp_fp);
+    if (to_remove != 0) {
+	int rc;
+
+#if HAVE_REMOVE
+	rc = remove(to_remove);
+#else
+	rc = unlink(to_remove);
+#endif
+	if (rc != 0)
+	    perror(to_remove);
+    }
+}
+
+static void
+failed(const char *msg)
+{
+    perror(msg);
+    ExitProgram(EXIT_FAILURE);
+}
+
+static void
+usage(void)
+{
+#define DATA(s) s "\n"
+    static const char options_string[] =
+    {
+	DATA("Options:")
+	DATA("  -0         format translation output all capabilities on one line")
+	DATA("  -1         format translation output one capability per line")
+#if NCURSES_XNAMES
+	DATA("  -a         retain commented-out capabilities (sets -x also)")
+#endif
+	DATA("  -C         translate entries to termcap source form")
+	DATA("  -D         print list of tic's database locations (first must be writable)")
+	DATA("  -c         check only, validate input without compiling or translating")
+	DATA("  -e<names>  translate/compile only entries named by comma-separated list")
+	DATA("  -f         format complex strings for readability")
+	DATA("  -G         format %{number} to %'char'")
+	DATA("  -g         format %'char' to %{number}")
+	DATA("  -I         translate entries to terminfo source form")
+	DATA("  -K         translate entries to termcap source form with BSD syntax")
+	DATA("  -L         translate entries to full terminfo source form")
+	DATA("  -N         disable smart defaults for source translation")
+	DATA("  -o<dir>    set output directory for compiled entry writes")
+	DATA("  -Q[n]      dump compiled description")
+	DATA("  -q    brief listing, removes headers")
+	DATA("  -R<name>   restrict translation to given terminfo/termcap version")
+	DATA("  -r         force resolution of all use entries in source translation")
+	DATA("  -s         print summary statistics")
+	DATA("  -T         remove size-restrictions on compiled description")
+#if NCURSES_XNAMES
+	DATA("  -t         suppress commented-out capabilities")
+#endif
+	DATA("  -U         suppress post-processing of entries")
+	DATA("  -V         print version")
+	DATA("  -W         wrap long strings according to -w[n] option")
+	DATA("  -v[n]      set verbosity level")
+	DATA("  -w[n]      set format width for translation output")
+#if NCURSES_XNAMES
+	DATA("  -x         treat unknown capabilities as user-defined")
+#endif
+	DATA("")
+	DATA("Parameters:")
+	DATA("  <file>     file to translate or compile")
+    };
+#undef DATA
+
+    fprintf(stderr, "Usage: %s %s\n", _nc_progname, usage_string);
+    fputs(options_string, stderr);
+    ExitProgram(EXIT_FAILURE);
+}
+
+#define L_BRACE '{'
+#define R_BRACE '}'
+#define S_QUOTE '\''
+
+static void
+write_it(ENTRY * ep)
+{
+    unsigned n;
+    int ch;
+    char *s, *d, *t;
+    char result[MAX_ENTRY_SIZE];
+
+    /*
+     * Look for strings that contain %{number}, convert them to %'char',
+     * which is shorter and runs a little faster.
+     */
+    for (n = 0; n < STRCOUNT; n++) {
+	s = ep->tterm.Strings[n];
+	if (VALID_STRING(s)
+	    && strchr(s, L_BRACE) != 0) {
+	    d = result;
+	    t = s;
+	    while ((ch = *t++) != 0) {
+		*d++ = (char) ch;
+		if (ch == '\\') {
+		    if ((*d++ = *t++) == '\0')
+			break;
+		} else if ((ch == '%')
+			   && (*t == L_BRACE)) {
+		    char *v = 0;
+		    long value = strtol(t + 1, &v, 0);
+		    if (v != 0
+			&& *v == R_BRACE
+			&& value > 0
+			&& value != '\\'	/* FIXME */
+			&& value < 127
+			&& isprint((int) value)) {
+			*d++ = S_QUOTE;
+			*d++ = (char) value;
+			*d++ = S_QUOTE;
+			t = (v + 1);
+		    }
+		}
+	    }
+	    *d = 0;
+	    if (strlen(result) < strlen(s))
+		_nc_STRCPY(s, result, strlen(s) + 1);
+	}
+    }
+
+    _nc_set_type(_nc_first_name(ep->tterm.term_names));
+    _nc_curr_line = (int) ep->startline;
+    _nc_write_entry(&ep->tterm);
+}
+
+static bool
+immedhook(ENTRY * ep GCC_UNUSED)
+/* write out entries with no use capabilities immediately to save storage */
+{
+#if !HAVE_BIG_CORE
+    /*
+     * This is strictly a core-economy kluge.  The really clean way to handle
+     * compilation is to slurp the whole file into core and then do all the
+     * name-collision checks and entry writes in one swell foop.  But the
+     * terminfo master file is large enough that some core-poor systems swap
+     * like crazy when you compile it this way...there have been reports of
+     * this process taking *three hours*, rather than the twenty seconds or
+     * less typical on my development box.
+     *
+     * So.  This hook *immediately* writes out the referenced entry if it
+     * has no use capabilities.  The compiler main loop refrains from
+     * adding the entry to the in-core list when this hook fires.  If some
+     * other entry later needs to reference an entry that got written
+     * immediately, that's OK; the resolution code will fetch it off disk
+     * when it can't find it in core.
+     *
+     * Name collisions will still be detected, just not as cleanly.  The
+     * write_entry() code complains before overwriting an entry that
+     * postdates the time of tic's first call to write_entry().  Thus
+     * it will complain about overwriting entries newly made during the
+     * tic run, but not about overwriting ones that predate it.
+     *
+     * The reason this is a hook, and not in line with the rest of the
+     * compiler code, is that the support for termcap fallback cannot assume
+     * it has anywhere to spool out these entries!
+     *
+     * The _nc_set_type() call here requires a compensating one in
+     * _nc_parse_entry().
+     *
+     * If you define HAVE_BIG_CORE, you'll disable this kluge.  This will
+     * make tic a bit faster (because the resolution code won't have to do
+     * disk I/O nearly as often).
+     */
+    if (ep->nuses == 0) {
+	int oldline = _nc_curr_line;
+
+	write_it(ep);
+	_nc_curr_line = oldline;
+	free(ep->tterm.str_table);
+	return (TRUE);
+    }
+#endif /* HAVE_BIG_CORE */
+    return (FALSE);
+}
+
+static void
+put_translate(int c)
+/* emit a comment char, translating terminfo names to termcap names */
+{
+    static bool in_name = FALSE;
+    static size_t used;
+
+    if (in_name) {
+	static size_t have;
+	static char *namebuf, *suffix;
+
+	if (used + 1 >= have) {
+	    have += 132;
+	    if ((namebuf = typeRealloc(char, have, namebuf)) == NULL)
+		  failed("put_translate namebuf");
+	    if ((suffix = typeRealloc(char, have, suffix)) == NULL)
+		  failed("put_translate suffix");
+	}
+	if (c == '\n' || c == '@') {
+	    namebuf[used++] = '\0';
+	    (void) putchar('<');
+	    (void) fputs(namebuf, stdout);
+	    putchar(c);
+	    in_name = FALSE;
+	} else if (c != '>') {
+	    namebuf[used++] = (char) c;
+	} else {		/* ah! candidate name! */
+	    char *up;
+	    NCURSES_CONST char *tp;
+
+	    namebuf[used++] = '\0';
+	    in_name = FALSE;
+
+	    suffix[0] = '\0';
+	    if ((up = strchr(namebuf, '#')) != 0
+		|| (up = strchr(namebuf, '=')) != 0
+		|| ((up = strchr(namebuf, '@')) != 0 && up[1] == '>')) {
+		_nc_STRCPY(suffix, up, have);
+		*up = '\0';
+	    }
+
+	    if ((tp = nametrans(namebuf)) != 0) {
+		(void) putchar(':');
+		(void) fputs(tp, stdout);
+		(void) fputs(suffix, stdout);
+		(void) putchar(':');
+	    } else {
+		/* couldn't find a translation, just dump the name */
+		(void) putchar('<');
+		(void) fputs(namebuf, stdout);
+		(void) fputs(suffix, stdout);
+		(void) putchar('>');
+	    }
+	}
+    } else {
+	used = 0;
+	if (c == '<') {
+	    in_name = TRUE;
+	} else {
+	    putchar(c);
+	}
+    }
+}
+
+/* Returns a string, stripped of leading/trailing whitespace */
+static char *
+stripped(char *src)
+{
+    char *dst = 0;
+
+    while (isspace(UChar(*src)))
+	src++;
+
+    if (*src != '\0') {
+	if ((dst = strdup(src)) == NULL) {
+	    failed("strdup");
+	} else {
+	    size_t len = strlen(dst);
+	    while (--len != 0 && isspace(UChar(dst[len])))
+		dst[len] = '\0';
+	}
+    }
+    return dst;
+}
+
+static FILE *
+open_tempfile(char *filename)
+{
+    FILE *result = 0;
+
+    _nc_STRCPY(filename, "/tmp/XXXXXX", PATH_MAX);
+#if HAVE_MKSTEMP
+    {
+	int oldmask = (int) umask(077);
+	int fd = mkstemp(filename);
+	if (fd >= 0)
+	    result = fdopen(fd, "w");
+	umask((mode_t) oldmask);
+    }
+#else
+    if (tmpnam(filename) != 0)
+	result = safe_fopen(filename, "w");
+#endif
+    return result;
+}
+
+static FILE *
+copy_input(FILE *source, const char *filename, char *alt_file)
+{
+    char my_altfile[PATH_MAX];
+    FILE *result = 0;
+    FILE *target;
+    int ch;
+
+    if (alt_file == NULL)
+	alt_file = my_altfile;
+
+    if (source == NULL) {
+	failed("copy_input (source)");
+    } else if ((target = open_tempfile(alt_file)) == NULL) {
+	failed("copy_input (target)");
+    } else {
+	clearerr(source);
+	for (;;) {
+	    ch = fgetc(source);
+	    if (feof(source)) {
+		break;
+	    } else if (ferror(source)) {
+		failed(filename);
+	    } else if (ch == 0) {
+		/* don't loop in case someone wants to convert /dev/zero */
+		fprintf(stderr, "%s: %s is not a text-file\n", _nc_progname, filename);
+		ExitProgram(EXIT_FAILURE);
+	    }
+	    fputc(ch, target);
+	}
+	fclose(source);
+	/*
+	 * rewind() does not force the target file's data to disk (not does
+	 * fflush()...).  So open a second stream on the data and then close
+	 * the one that we were writing on before starting to read from the
+	 * second stream.
+	 */
+	result = safe_fopen(alt_file, "r+");
+	fclose(target);
+	to_remove = strdup(alt_file);
+    }
+    return result;
+}
+
+static FILE *
+open_input(const char *filename, char *alt_file)
+{
+    FILE *fp;
+    struct stat sb;
+    int mode;
+
+    if (!strcmp(filename, "-")) {
+	fp = copy_input(stdin, STDIN_NAME, alt_file);
+    } else if (stat(filename, &sb) == -1) {
+	fprintf(stderr, "%s: %s %s\n", _nc_progname, filename, strerror(errno));
+	ExitProgram(EXIT_FAILURE);
+    } else if ((mode = (sb.st_mode & S_IFMT)) == S_IFDIR
+	       || (mode != S_IFREG && mode != S_IFCHR && mode != S_IFIFO)) {
+	fprintf(stderr, "%s: %s is not a file\n", _nc_progname, filename);
+	ExitProgram(EXIT_FAILURE);
+    } else {
+	fp = safe_fopen(filename, "r");
+
+	if (fp == NULL) {
+	    fprintf(stderr, "%s: Can't open %s\n", _nc_progname, filename);
+	    ExitProgram(EXIT_FAILURE);
+	}
+	if (mode != S_IFREG) {
+	    if (alt_file != 0) {
+		FILE *fp2 = copy_input(fp, filename, alt_file);
+		fp = fp2;
+	    } else {
+		fprintf(stderr, "%s: %s is not a file\n", _nc_progname, filename);
+		ExitProgram(EXIT_FAILURE);
+	    }
+	}
+    }
+    return fp;
+}
+
+/* Parse the "-e" option-value into a list of names */
+static char **
+make_namelist(char *src)
+{
+    char **dst = 0;
+
+    char *s, *base;
+    unsigned pass, n, nn;
+    char buffer[BUFSIZ];
+
+    if (src == NULL) {
+	/* EMPTY */ ;
+    } else if (strchr(src, '/') != 0) {		/* a filename */
+	FILE *fp = open_input(src, (char *) 0);
+
+	for (pass = 1; pass <= 2; pass++) {
+	    nn = 0;
+	    while (fgets(buffer, sizeof(buffer), fp) != 0) {
+		if ((s = stripped(buffer)) != 0) {
+		    if (dst != 0)
+			dst[nn] = s;
+		    else
+			free(s);
+		    nn++;
+		}
+	    }
+	    if (pass == 1) {
+		if ((dst = typeCalloc(char *, nn + 1)) == NULL)
+		      failed("make_namelist");
+		rewind(fp);
+	    }
+	}
+	fclose(fp);
+    } else {			/* literal list of names */
+	for (pass = 1; pass <= 2; pass++) {
+	    for (n = nn = 0, base = src;; n++) {
+		int mark = src[n];
+		if (mark == ',' || mark == '\0') {
+		    if (pass == 1) {
+			nn++;
+		    } else {
+			src[n] = '\0';
+			if ((s = stripped(base)) != 0)
+			    dst[nn++] = s;
+			base = &src[n + 1];
+		    }
+		}
+		if (mark == '\0')
+		    break;
+	    }
+	    if (pass == 1) {
+		if ((dst = typeCalloc(char *, nn + 1)) == NULL)
+		      failed("make_namelist");
+	    }
+	}
+    }
+    if (showsummary && (dst != 0)) {
+	fprintf(log_fp, "Entries that will be compiled:\n");
+	for (n = 0; dst[n] != 0; n++)
+	    fprintf(log_fp, "%u:%s\n", n + 1, dst[n]);
+    }
+    return dst;
+}
+
+static bool
+matches(char **needle, const char *haystack)
+/* does entry in needle list match |-separated field in haystack? */
+{
+    bool code = FALSE;
+
+    if (needle != 0) {
+	size_t n;
+
+	for (n = 0; needle[n] != 0; n++) {
+	    if (_nc_name_match(haystack, needle[n], "|")) {
+		code = TRUE;
+		break;
+	    }
+	}
+    } else
+	code = TRUE;
+    return (code);
+}
+
+static char *
+valid_db_path(const char *nominal)
+{
+    struct stat sb;
+#if USE_HASHED_DB
+    char suffix[] = DBM_SUFFIX;
+    size_t need = strlen(nominal) + sizeof(suffix);
+    char *result = malloc(need);
+
+    if (result == NULL)
+	failed("valid_db_path");
+    _nc_STRCPY(result, nominal, need);
+    if (strcmp(result + need - sizeof(suffix), suffix)) {
+	_nc_STRCAT(result, suffix, need);
+    }
+#else
+    char *result = strdup(nominal);
+#endif
+
+    DEBUG(1, ("** stat(%s)", result));
+    if (stat(result, &sb) >= 0) {
+#if USE_HASHED_DB
+	if (!S_ISREG(sb.st_mode)
+	    || access(result, R_OK | W_OK) != 0) {
+	    DEBUG(1, ("...not a writable file"));
+	    free(result);
+	    result = 0;
+	}
+#else
+	if (!S_ISDIR(sb.st_mode)
+	    || access(result, R_OK | W_OK | X_OK) != 0) {
+	    DEBUG(1, ("...not a writable directory"));
+	    free(result);
+	    result = 0;
+	}
+#endif
+    } else {
+	/* check if parent is directory and is writable */
+	unsigned leaf = _nc_pathlast(result);
+
+	DEBUG(1, ("...not found"));
+	if (leaf) {
+	    char save = result[leaf];
+	    result[leaf] = 0;
+	    if (stat(result, &sb) >= 0
+		&& S_ISDIR(sb.st_mode)
+		&& access(result, R_OK | W_OK | X_OK) == 0) {
+		result[leaf] = save;
+	    } else {
+		DEBUG(1, ("...parent directory %s is not writable", result));
+		free(result);
+		result = 0;
+	    }
+	} else {
+	    DEBUG(1, ("... no parent directory"));
+	    free(result);
+	    result = 0;
+	}
+    }
+    return result;
+}
+
+/*
+ * Show the databases to which tic could write.  The location to which it
+ * writes is always the first one.  If none are writable, print an error
+ * message.
+ */
+static void
+show_databases(const char *outdir)
+{
+    bool specific = (outdir != 0) || getenv("TERMINFO") != 0;
+    char *result;
+    const char *tried = 0;
+
+    if (outdir == NULL) {
+	outdir = _nc_tic_dir(NULL);
+    }
+    if ((result = valid_db_path(outdir)) != 0) {
+	printf("%s\n", result);
+	free(result);
+    } else {
+	tried = outdir;
+    }
+
+    if ((outdir = _nc_home_terminfo())) {
+	if ((result = valid_db_path(outdir)) != 0) {
+	    printf("%s\n", result);
+	    free(result);
+	} else if (!specific) {
+	    tried = outdir;
+	}
+    }
+
+    /*
+     * If we can write in neither location, give an error message.
+     */
+    if (tried) {
+	fflush(stdout);
+	fprintf(stderr, "%s: %s (no permission)\n", _nc_progname, tried);
+	ExitProgram(EXIT_FAILURE);
+    }
+}
+
+static void
+add_digit(int *target, int source)
+{
+    *target = (*target * 10) + (source - '0');
+}
+
+int
+main(int argc, char *argv[])
+{
+    char my_tmpname[PATH_MAX];
+    int v_opt = -1;
+    int smart_defaults = TRUE;
+    char *termcap;
+    ENTRY *qp;
+
+    int this_opt, last_opt = '?';
+
+    int outform = F_TERMINFO;	/* output format */
+    int sortmode = S_TERMINFO;	/* sort_mode */
+
+    int width = 60;
+    int height = 65535;
+    bool formatted = FALSE;	/* reformat complex strings? */
+    bool literal = FALSE;	/* suppress post-processing? */
+    int numbers = 0;		/* format "%'char'" to/from "%{number}" */
+    bool forceresolve = FALSE;	/* force resolution */
+    bool limited = TRUE;
+    char *tversion = (char *) NULL;
+    const char *source_file = "terminfo";
+    char *outdir = (char *) NULL;
+    bool check_only = FALSE;
+    bool suppress_untranslatable = FALSE;
+    int quickdump = 0;
+    bool quiet = FALSE;
+    bool wrap_strings = FALSE;
+
+    log_fp = stderr;
+
+    _nc_progname = _nc_rootname(argv[0]);
+    atexit(cleanup);
+
+    if ((infodump = same_program(_nc_progname, PROG_CAPTOINFO)) != FALSE) {
+	outform = F_TERMINFO;
+	sortmode = S_TERMINFO;
+    }
+    if ((capdump = same_program(_nc_progname, PROG_INFOTOCAP)) != FALSE) {
+	outform = F_TERMCAP;
+	sortmode = S_TERMCAP;
+    }
+#if NCURSES_XNAMES
+    /* set this directly to avoid interaction with -v and -D options */
+    _nc_user_definable = FALSE;
+#endif
+    _nc_strict_bsd = 0;
+
+    /*
+     * Processing arguments is a little complicated, since someone made a
+     * design decision to allow the numeric values for -w, -v options to
+     * be optional.
+     */
+    while ((this_opt = getopt(argc, argv,
+			      "0123456789CDIKLNQR:TUVWace:fGgo:qrstvwx")) != -1) {
+	if (isdigit(this_opt)) {
+	    switch (last_opt) {
+	    case 'Q':
+		add_digit(&quickdump, this_opt);
+		break;
+	    case 'v':
+		add_digit(&v_opt, this_opt);
+		break;
+	    case 'w':
+		add_digit(&width, this_opt);
+		break;
+	    default:
+		switch (this_opt) {
+		case '0':
+		    last_opt = this_opt;
+		    width = 65535;
+		    height = 1;
+		    break;
+		case '1':
+		    last_opt = this_opt;
+		    width = 0;
+		    break;
+		default:
+		    usage();
+		}
+	    }
+	    continue;
+	}
+	switch (this_opt) {
+	case 'K':
+	    _nc_strict_bsd = 1;
+	    /* the initial version of -K in 20110730 fell-thru here, but the
+	     * same flag is useful when reading sources -TD
+	     */
+	    break;
+	case 'C':
+	    capdump = TRUE;
+	    outform = F_TERMCAP;
+	    sortmode = S_TERMCAP;
+	    break;
+	case 'D':
+	    debug_level = VtoTrace(v_opt);
+	    use_verbosity(debug_level);
+	    show_databases(outdir);
+	    ExitProgram(EXIT_SUCCESS);
+	    break;
+	case 'I':
+	    infodump = TRUE;
+	    outform = F_TERMINFO;
+	    sortmode = S_TERMINFO;
+	    break;
+	case 'L':
+	    infodump = TRUE;
+	    outform = F_VARIABLE;
+	    sortmode = S_VARIABLE;
+	    break;
+	case 'N':
+	    smart_defaults = FALSE;
+	    literal = TRUE;
+	    break;
+	case 'Q':
+	    quickdump = 0;
+	    break;
+	case 'R':
+	    tversion = optarg;
+	    break;
+	case 'T':
+	    limited = FALSE;
+	    break;
+	case 'U':
+	    literal = TRUE;
+	    break;
+	case 'V':
+	    puts(curses_version());
+	    ExitProgram(EXIT_SUCCESS);
+	case 'W':
+	    wrap_strings = TRUE;
+	    break;
+	case 'c':
+	    check_only = TRUE;
+	    break;
+	case 'e':
+	    namelst = make_namelist(optarg);
+	    break;
+	case 'f':
+	    formatted = TRUE;
+	    break;
+	case 'G':
+	    numbers = 1;
+	    break;
+	case 'g':
+	    numbers = -1;
+	    break;
+	case 'o':
+	    outdir = optarg;
+	    break;
+	case 'q':
+	    quiet = TRUE;
+	    break;
+	case 'r':
+	    forceresolve = TRUE;
+	    break;
+	case 's':
+	    showsummary = TRUE;
+	    break;
+	case 'v':
+	    v_opt = 0;
+	    break;
+	case 'w':
+	    width = 0;
+	    break;
+#if NCURSES_XNAMES
+	case 't':
+	    _nc_disable_period = FALSE;
+	    suppress_untranslatable = TRUE;
+	    break;
+	case 'a':
+	    _nc_disable_period = TRUE;
+	    /* FALLTHRU */
+	case 'x':
+	    using_extensions = TRUE;
+	    break;
+#endif
+	default:
+	    usage();
+	}
+	last_opt = this_opt;
+    }
+
+    /*
+     * If the -v option is set, it may override the $NCURSES_TRACE environment
+     * variable, e.g., for -v3 and up.
+     */
+    debug_level = VtoTrace(v_opt);
+    use_verbosity(debug_level);
+
+    /*
+     * Do this after setting debug_level, since the function calls START_TRACE,
+     * which uses the $NCURSES_TRACE environment variable if _nc_tracing bits
+     * for tracing are zero.
+     */
+#if NCURSES_XNAMES
+    if (using_extensions) {
+	use_extended_names(TRUE);
+    }
+#endif
+
+    if (_nc_tracing) {
+	save_check_termtype = _nc_check_termtype2;
+	_nc_check_termtype2 = check_termtype;
+    }
+#if !HAVE_BIG_CORE
+    /*
+     * Aaargh! immedhook seriously hoses us!
+     *
+     * One problem with immedhook is it means we can't do -e.  Problem
+     * is that we can't guarantee that for each terminal listed, all the
+     * terminals it depends on will have been kept in core for reference
+     * resolution -- in fact it is certain the primitive types at the end
+     * of reference chains *won't* be in core unless they were explicitly
+     * in the select list themselves.
+     */
+    if (namelst && (!infodump && !capdump)) {
+	(void) fprintf(stderr,
+		       "%s: Sorry, -e can't be used without -I or -C\n",
+		       _nc_progname);
+	ExitProgram(EXIT_FAILURE);
+    }
+#endif /* HAVE_BIG_CORE */
+
+    if (optind < argc) {
+	source_file = argv[optind++];
+	if (optind < argc) {
+	    fprintf(stderr,
+		    "%s: Too many file names.  Usage:\n\t%s %s",
+		    _nc_progname,
+		    _nc_progname,
+		    usage_string);
+	    ExitProgram(EXIT_FAILURE);
+	}
+    } else {
+	if (infodump == TRUE) {
+	    /* captoinfo's no-argument case */
+	    source_file = "/etc/termcap";
+	    if ((termcap = getenv("TERMCAP")) != 0
+		&& (namelst = make_namelist(getenv("TERM"))) != 0) {
+		if (access(termcap, F_OK) == 0) {
+		    /* file exists */
+		    source_file = termcap;
+		} else {
+		    if ((tmp_fp = open_tempfile(my_tmpname)) != 0) {
+			source_file = my_tmpname;
+			fprintf(tmp_fp, "%s\n", termcap);
+			fclose(tmp_fp);
+			tmp_fp = open_input(source_file, (char *) 0);
+			to_remove = source_file;
+		    } else {
+			failed("tmpnam");
+		    }
+		}
+	    }
+	} else {
+	    /* tic */
+	    fprintf(stderr,
+		    "%s: File name needed.  Usage:\n\t%s %s",
+		    _nc_progname,
+		    _nc_progname,
+		    usage_string);
+	    ExitProgram(EXIT_FAILURE);
+	}
+    }
+
+    if (tmp_fp == NULL) {
+	char my_altfile[PATH_MAX];
+	tmp_fp = open_input(source_file, my_altfile);
+	if (!strcmp(source_file, "-")) {
+	    source_file = STDIN_NAME;
+	}
+    }
+
+    if (infodump || check_only) {
+	dump_init(tversion,
+		  (smart_defaults
+		   ? outform
+		   : F_LITERAL),
+		  sortmode,
+		  wrap_strings, width, height,
+		  debug_level, formatted || check_only, check_only, quickdump);
+    } else if (capdump) {
+	dump_init(tversion,
+		  outform,
+		  sortmode,
+		  wrap_strings, width, height,
+		  debug_level, FALSE, FALSE, FALSE);
+    }
+
+    /* parse entries out of the source file */
+    _nc_set_source(source_file);
+#if !HAVE_BIG_CORE
+    if (!(check_only || infodump || capdump))
+	_nc_set_writedir(outdir);
+#endif /* HAVE_BIG_CORE */
+    _nc_read_entry_source(tmp_fp, (char *) NULL,
+			  !smart_defaults || literal, FALSE,
+			  ((check_only || infodump || capdump)
+			   ? NULLHOOK
+			   : immedhook));
+
+    /* do use resolution */
+    if (check_only || (!infodump && !capdump) || forceresolve) {
+	if (!_nc_resolve_uses2(TRUE, literal) && !check_only) {
+	    ExitProgram(EXIT_FAILURE);
+	}
+    }
+
+    /* length check */
+    if (check_only && limited && (capdump || infodump)) {
+	for_entry_list(qp) {
+	    if (matches(namelst, qp->tterm.term_names)) {
+		int len = fmt_entry(&qp->tterm, NULL, FALSE, TRUE, infodump, numbers);
+
+		if (len > (infodump ? MAX_TERMINFO_LENGTH : MAX_TERMCAP_LENGTH))
+		    (void) fprintf(stderr,
+				   "%s: resolved %s entry is %d bytes long\n",
+				   _nc_progname,
+				   _nc_first_name(qp->tterm.term_names),
+				   len);
+	    }
+	}
+    }
+
+    /* write or dump all entries */
+    if (check_only) {
+	/* this is in case infotocap() generates warnings */
+	_nc_curr_col = _nc_curr_line = -1;
+
+	for_entry_list(qp) {
+	    if (matches(namelst, qp->tterm.term_names)) {
+		/* this is in case infotocap() generates warnings */
+		_nc_set_type(_nc_first_name(qp->tterm.term_names));
+		_nc_curr_line = (int) qp->startline;
+		repair_acsc(&qp->tterm);
+		dump_entry(&qp->tterm, suppress_untranslatable,
+			   limited, numbers, NULL);
+	    }
+	}
+    } else {
+	if (!infodump && !capdump) {
+	    _nc_set_writedir(outdir);
+	    for_entry_list(qp) {
+		if (matches(namelst, qp->tterm.term_names))
+		    write_it(qp);
+	    }
+	} else {
+	    /* this is in case infotocap() generates warnings */
+	    _nc_curr_col = _nc_curr_line = -1;
+
+	    for_entry_list(qp) {
+		if (matches(namelst, qp->tterm.term_names)) {
+		    long j = qp->cend - qp->cstart;
+		    int len = 0;
+
+		    /* this is in case infotocap() generates warnings */
+		    _nc_set_type(_nc_first_name(qp->tterm.term_names));
+
+		    if (!quiet) {
+			(void) fseek(tmp_fp, qp->cstart, SEEK_SET);
+			while (j-- > 0) {
+			    int ch = fgetc(tmp_fp);
+			    if (ch == EOF || ferror(tmp_fp)) {
+				break;
+			    } else if (infodump) {
+				(void) putchar(ch);
+			    } else {
+				put_translate(ch);
+			    }
+			}
+		    }
+
+		    repair_acsc(&qp->tterm);
+		    dump_entry(&qp->tterm, suppress_untranslatable,
+			       limited, numbers, NULL);
+		    for (j = 0; j < (long) qp->nuses; j++)
+			dump_uses(qp->uses[j].name, !capdump);
+		    len = show_entry();
+		    if (debug_level != 0 && !limited)
+			printf("# length=%d\n", len);
+		}
+	    }
+	    if (!namelst && _nc_tail && !quiet) {
+		int c, oldc = '\0';
+		bool in_comment = FALSE;
+		bool trailing_comment = FALSE;
+
+		(void) fseek(tmp_fp, _nc_tail->cend, SEEK_SET);
+		while ((c = fgetc(tmp_fp)) != EOF) {
+		    if (oldc == '\n') {
+			if (c == '#') {
+			    trailing_comment = TRUE;
+			    in_comment = TRUE;
+			} else {
+			    in_comment = FALSE;
+			}
+		    }
+		    if (trailing_comment
+			&& (in_comment || (oldc == '\n' && c == '\n')))
+			putchar(c);
+		    oldc = c;
+		}
+	    }
+	}
+    }
+
+    /* Show the directory into which entries were written, and the total
+     * number of entries
+     */
+    if (showsummary
+	&& (!(check_only || infodump || capdump))) {
+	int total = _nc_tic_written();
+	if (total != 0)
+	    fprintf(log_fp, "%d entries written to %s\n",
+		    total,
+		    _nc_tic_dir(NULL));
+	else
+	    fprintf(log_fp, "No entries written\n");
+    }
+    ExitProgram(EXIT_SUCCESS);
+}
+
+/*
+ * This bit of legerdemain turns all the terminfo variable names into
+ * references to locations in the arrays Booleans, Numbers, and Strings ---
+ * precisely what's needed (see comp_parse.c).
+ */
+#undef CUR
+#define CUR tp->
+
+/*
+ * Check if the alternate character-set capabilities are consistent.
+ */
+static void
+check_acs(TERMTYPE2 *tp)
+{
+    int vt100_smacs = 0;
+    int vt100_rmacs = 0;
+    int vt100_enacs = 0;
+
+    /*
+     * ena_acs is not always necessary, but if it is present, the enter/exit
+     * capabilities should be.
+     */
+    ANDMISSING(ena_acs, enter_alt_charset_mode);
+    ANDMISSING(ena_acs, exit_alt_charset_mode);
+    PAIRED(exit_alt_charset_mode, exit_alt_charset_mode);
+
+    /*
+     * vt100-like is frequently used, but perhaps ena_acs is missing, etc.
+     */
+    if (VALID_STRING(enter_alt_charset_mode)) {
+	vt100_smacs = (!strcmp("\033(0", enter_alt_charset_mode)
+		       ? 2
+		       : (!strcmp("\016", enter_alt_charset_mode)
+			  ? 1
+			  : 0));
+    }
+    if (VALID_STRING(exit_alt_charset_mode)) {
+	vt100_rmacs = (!strcmp("\033(B", exit_alt_charset_mode)
+		       ? 2
+		       : (!strcmp("\017", exit_alt_charset_mode)
+			  ? 1
+			  : 0));
+    }
+    if (VALID_STRING(ena_acs)) {
+	vt100_enacs = (!strcmp("\033(B\033)0", ena_acs)
+		       ? 2
+		       : 0);
+    }
+    if (vt100_rmacs && vt100_smacs && (vt100_rmacs != vt100_smacs)) {
+	_nc_warning("rmacs/smacs are inconsistent");
+    }
+    if ((vt100_rmacs == 2) && (vt100_smacs == 2) && vt100_enacs) {
+	_nc_warning("rmacs/smacs make enacs redundant");
+    }
+    if ((vt100_rmacs == 1) && (vt100_smacs == 1) && !vt100_enacs) {
+	_nc_warning("VT100-style rmacs/smacs require enacs");
+    }
+
+    if (VALID_STRING(acs_chars)) {
+	const char *boxes = "lmkjtuvwqxn";
+	char mapped[256];
+	char missing[256];
+	const char *p;
+	char *q;
+
+	memset(mapped, 0, sizeof(mapped));
+	for (p = acs_chars; *p != '\0'; p += 2) {
+	    if (p[1] == '\0') {
+		_nc_warning("acsc has odd number of characters");
+		break;
+	    }
+	    mapped[UChar(p[0])] = p[1];
+	}
+
+	if (mapped[UChar('I')] && !mapped[UChar('i')]) {
+	    _nc_warning("acsc refers to 'I', which is probably an error");
+	}
+
+	for (p = boxes, q = missing; *p != '\0'; ++p) {
+	    if (!mapped[UChar(p[0])]) {
+		*q++ = p[0];
+	    }
+	}
+	*q = '\0';
+
+	assert(strlen(missing) <= strlen(boxes));
+	if (*missing != '\0' && strcmp(missing, boxes)) {
+	    _nc_warning("acsc is missing some line-drawing mapping: %s", missing);
+	}
+    }
+}
+
+static char *
+safe_strdup(const char *value)
+{
+    if (value == NULL)
+	value = "";
+    return strdup(value);
+}
+
+static bool
+same_color(NCURSES_CONST char *oldcap, NCURSES_CONST char *newcap, int limit)
+{
+    bool result = FALSE;
+    if (limit > 16)
+	limit = 16;
+    if (limit >= 8) {
+	int n;
+	int same;
+	for (n = same = 0; n < limit; ++n) {
+	    char *oldvalue = safe_strdup(TIPARM_1(oldcap, n));
+	    char *newvalue = safe_strdup(TIPARM_1(newcap, n));
+	    same += !strcmp(oldvalue, newvalue);
+	    free(oldvalue);
+	    free(newvalue);
+	}
+	result = (same == limit);
+    }
+    return result;
+}
+
+/*
+ * Check if the color capabilities are consistent
+ */
+static void
+check_colors(TERMTYPE2 *tp)
+{
+    char *value;
+
+    if ((max_colors > 0) != (max_pairs > 0)
+	|| ((max_colors > max_pairs) && !VALID_STRING(initialize_pair)))
+	_nc_warning("inconsistent values for max_colors (%d) and max_pairs (%d)",
+		    max_colors, max_pairs);
+
+    PAIRED(set_foreground, set_background);
+    PAIRED(set_a_foreground, set_a_background);
+    PAIRED(set_color_pair, initialize_pair);
+
+    if (VALID_STRING(set_foreground)
+	&& VALID_STRING(set_a_foreground)) {
+	if (!_nc_capcmp(set_foreground, set_a_foreground)) {
+	    _nc_warning("expected setf/setaf to be different");
+	} else if (same_color(set_foreground, set_a_foreground, max_colors)) {
+	    _nc_warning("setf/setaf are equivalent");
+	}
+    }
+
+    if (VALID_STRING(set_background)
+	&& VALID_STRING(set_a_background)) {
+	if (!_nc_capcmp(set_background, set_a_background)) {
+	    _nc_warning("expected setb/setab to be different");
+	} else if (same_color(set_background, set_a_background, max_colors)) {
+	    _nc_warning("setb/setab are equivalent");
+	}
+    }
+
+    /* see: has_colors() */
+    if (VALID_NUMERIC(max_colors) && VALID_NUMERIC(max_pairs)
+	&& ((VALID_STRING(set_foreground)
+	     && VALID_STRING(set_background))
+	    || (VALID_STRING(set_a_foreground)
+		&& VALID_STRING(set_a_background))
+	    || set_color_pair)) {
+	if (!VALID_STRING(orig_pair) && !VALID_STRING(orig_colors))
+	    _nc_warning("expected either op/oc string for resetting colors");
+    }
+    if (can_change) {
+	if (!VALID_STRING(initialize_pair) &&
+	    !VALID_STRING(initialize_color)) {
+	    _nc_warning("expected initc or initp because ccc is given");
+	}
+    } else {
+	if (VALID_STRING(initialize_pair) ||
+	    VALID_STRING(initialize_color)) {
+	    _nc_warning("expected ccc because initc is given");
+	}
+    }
+    value = tigetstr("RGB");
+    if (VALID_STRING(value)) {
+	int r, g, b;
+	char bad;
+	int code = sscanf(value, "%d/%d/%d%c", &r, &g, &b, &bad);
+	if (code != 3 || r <= 0 || g <= 0 || b <= 0) {
+	    _nc_warning("unexpected value for RGB capability: %s", value);
+	}
+    }
+}
+
+static int
+csi_length(const char *value)
+{
+    int result = 0;
+
+    if (value[0] == '\033' && value[1] == '[') {
+	result = 2;
+    } else if (UChar(value[0]) == 0x9a) {
+	result = 1;
+    }
+    return result;
+}
+
+static char
+keypad_final(const char *string)
+{
+    char result = '\0';
+
+    if (VALID_STRING(string)
+	&& *string++ == '\033'
+	&& *string++ == 'O'
+	&& strlen(string) == 1) {
+	result = *string;
+    }
+
+    return result;
+}
+
+static long
+keypad_index(const char *string)
+{
+    int ch;
+    long result = -1;
+
+    if ((ch = keypad_final(string)) != '\0') {
+	const char *list = "PQRSwxymtuvlqrsPpn";	/* app-keypad except "Enter" */
+	char *test = (strchr) (list, ch);
+	if (test != 0)
+	    result = (long) (test - list);
+    }
+    return result;
+}
+
+/*
+ * list[] is down, up, left, right
+ * "left" may be ^H rather than \E[D
+ * "down" may be ^J rather than \E[B
+ * But up/right are generally consistently escape sequences for ANSI terminals.
+ */
+static void
+check_ansi_cursor(char *list[4])
+{
+    int j, k;
+    bool skip[4];
+    bool repeated = FALSE;
+
+    for (j = 0; j < 4; ++j) {
+	skip[j] = FALSE;
+	for (k = 0; k < j; ++k) {
+	    if (j != k
+		&& !strcmp(list[j], list[k])) {
+		char *value = _nc_tic_expand(list[k], TRUE, 0);
+		_nc_warning("repeated cursor control %s", value);
+		repeated = TRUE;
+	    }
+	}
+    }
+    if (!repeated) {
+	char *up = list[1];
+	size_t prefix = (size_t) csi_length(up);
+	size_t suffix;
+
+	if (prefix) {
+	    suffix = prefix;
+	    while (up[suffix] && isdigit(UChar(up[suffix])))
+		++suffix;
+	}
+	if (prefix && up[suffix] == 'A') {
+	    skip[1] = TRUE;
+	    if (!strcmp(list[0], "\n"))
+		skip[0] = TRUE;
+	    if (!strcmp(list[2], "\b"))
+		skip[2] = TRUE;
+
+	    for (j = 0; j < 4; ++j) {
+		int want;
+
+		if (skip[j] || strlen(list[j]) == 1)
+		    continue;
+		if (memcmp(list[j], up, prefix)) {
+		    char *value = _nc_tic_expand(list[j], TRUE, 0);
+		    _nc_warning("inconsistent prefix for %s", value);
+		    continue;
+		}
+		if (strlen(list[j]) < suffix) {
+		    char *value = _nc_tic_expand(list[j], TRUE, 0);
+		    _nc_warning("inconsistent length for %s, expected %d",
+				value, (int) suffix + 1);
+		    continue;
+		}
+		want = "BADC"[j];
+		if (list[j][suffix] != want) {
+		    char *value = _nc_tic_expand(list[j], TRUE, 0);
+		    _nc_warning("inconsistent suffix for %s, expected %c, have %c",
+				value, want, list[j][suffix]);
+		}
+	    }
+	}
+    }
+}
+
+#define EXPECTED(name) if (!PRESENT(name)) _nc_warning("expected " #name)
+#define UNEXPECTED(name) if (PRESENT(name)) _nc_warning("unexpected " #name ", for %s", why)
+
+static void
+check_noaddress(TERMTYPE2 *tp, const char *why)
+{
+    UNEXPECTED(column_address);
+    UNEXPECTED(cursor_address);
+    UNEXPECTED(cursor_home);
+    UNEXPECTED(cursor_mem_address);
+    UNEXPECTED(cursor_to_ll);
+    UNEXPECTED(row_address);
+    UNEXPECTED(row_address);
+}
+
+static void
+check_cursor(TERMTYPE2 *tp)
+{
+    int count;
+    char *list[4];
+
+    if (hard_copy) {
+	check_noaddress(tp, "hard_copy");
+    } else if (generic_type) {
+	check_noaddress(tp, "generic_type");
+    } else if (strchr(tp->term_names, '+') == NULL) {
+	int y = 0;
+	int x = 0;
+	if (PRESENT(column_address))
+	    ++y;
+	if (PRESENT(cursor_address))
+	    y = x = 10;
+	if (PRESENT(cursor_home))
+	    ++y, ++x;
+	if (PRESENT(cursor_mem_address))
+	    y = x = 10;
+	if (PRESENT(cursor_to_ll))
+	    ++y, ++x;
+	if (PRESENT(row_address))
+	    ++x;
+	if (PRESENT(cursor_down))
+	    ++y;
+	if (PRESENT(cursor_up))
+	    ++y;
+	if (PRESENT(cursor_left))
+	    ++x;
+	if (PRESENT(cursor_right))
+	    ++x;
+	if (x < 2 && y < 2) {
+	    _nc_warning("terminal lacks cursor addressing");
+	} else {
+	    if (x < 2)
+		_nc_warning("terminal lacks cursor column-addressing");
+	    if (y < 2)
+		_nc_warning("terminal lacks cursor row-addressing");
+	}
+    }
+
+    /* it is rare to have an insert-line feature without a matching delete */
+    ANDMISSING(parm_insert_line, insert_line);
+    ANDMISSING(parm_delete_line, delete_line);
+    ANDMISSING(parm_insert_line, parm_delete_line);
+
+    /* if we have a parameterized form, then the non-parameterized is easy */
+    ANDMISSING(parm_down_cursor, cursor_down);
+    ANDMISSING(parm_up_cursor, cursor_up);
+    ANDMISSING(parm_left_cursor, cursor_left);
+    ANDMISSING(parm_right_cursor, cursor_right);
+
+    /* Given any of a set of cursor movement, the whole set should be present.
+     * Technically this is not true (we could use cursor_address to fill in
+     * unsupported controls), but it is likely.
+     */
+    count = 0;
+    if (PRESENT(parm_down_cursor)) {
+	list[count++] = parm_down_cursor;
+    }
+    if (PRESENT(parm_up_cursor)) {
+	list[count++] = parm_up_cursor;
+    }
+    if (PRESENT(parm_left_cursor)) {
+	list[count++] = parm_left_cursor;
+    }
+    if (PRESENT(parm_right_cursor)) {
+	list[count++] = parm_right_cursor;
+    }
+    if (count == 4) {
+	check_ansi_cursor(list);
+    } else if (count != 0) {
+	EXPECTED(parm_down_cursor);
+	EXPECTED(parm_up_cursor);
+	EXPECTED(parm_left_cursor);
+	EXPECTED(parm_right_cursor);
+    }
+
+    count = 0;
+    if (PRESENT(cursor_down)) {
+	list[count++] = cursor_down;
+    }
+    if (PRESENT(cursor_up)) {
+	list[count++] = cursor_up;
+    }
+    if (PRESENT(cursor_left)) {
+	list[count++] = cursor_left;
+    }
+    if (PRESENT(cursor_right)) {
+	list[count++] = cursor_right;
+    }
+    if (count == 4) {
+	check_ansi_cursor(list);
+    } else if (count != 0) {
+	count = 0;
+	if (PRESENT(cursor_down) && strcmp(cursor_down, "\n"))
+	    ++count;
+	if (PRESENT(cursor_left) && strcmp(cursor_left, "\b"))
+	    ++count;
+	if (PRESENT(cursor_up) && strlen(cursor_up) > 1)
+	    ++count;
+	if (PRESENT(cursor_right) && strlen(cursor_right) > 1)
+	    ++count;
+	if (count) {
+	    EXPECTED(cursor_down);
+	    EXPECTED(cursor_up);
+	    EXPECTED(cursor_left);
+	    EXPECTED(cursor_right);
+	}
+    }
+}
+
+#define MAX_KP 5
+/*
+ * Do a quick sanity-check for vt100-style keypads to see if the 5-key keypad
+ * is mapped inconsistently.
+ */
+static void
+check_keypad(TERMTYPE2 *tp)
+{
+    char show[80];
+
+    if (VALID_STRING(key_a1) &&
+	VALID_STRING(key_a3) &&
+	VALID_STRING(key_b2) &&
+	VALID_STRING(key_c1) &&
+	VALID_STRING(key_c3)) {
+	char final[MAX_KP + 1];
+	long list[MAX_KP];
+	int increase = 0;
+	int j;
+
+	final[0] = keypad_final(key_a1);
+	final[1] = keypad_final(key_a3);
+	final[2] = keypad_final(key_b2);
+	final[3] = keypad_final(key_c1);
+	final[4] = keypad_final(key_c3);
+	final[5] = '\0';
+
+	/* special case: legacy coding using 1,2,3,0,. on the bottom */
+	assert(strlen(final) <= MAX_KP);
+	if (!strcmp(final, "qsrpn"))
+	    return;
+
+	list[0] = keypad_index(key_a1);
+	list[1] = keypad_index(key_a3);
+	list[2] = keypad_index(key_b2);
+	list[3] = keypad_index(key_c1);
+	list[4] = keypad_index(key_c3);
+
+	/* check that they're all vt100 keys */
+	for (j = 0; j < MAX_KP; ++j) {
+	    if (list[j] < 0) {
+		return;
+	    }
+	}
+
+	/* check if they're all in increasing order */
+	for (j = 1; j < MAX_KP; ++j) {
+	    if (list[j] > list[j - 1]) {
+		++increase;
+	    }
+	}
+
+	if (increase != (MAX_KP - 1)) {
+	    long last;
+
+	    show[0] = '\0';
+
+	    for (j = 0, last = -1; j < MAX_KP; ++j) {
+		int k;
+		int kk;
+		long test;
+
+		for (k = 0, kk = -1, test = 100; k < 5; ++k) {
+		    if (list[k] > last &&
+			list[k] < test) {
+			test = list[k];
+			kk = k;
+		    }
+		}
+		last = test;
+		assert(strlen(show) < (MAX_KP * 4));
+		switch (kk) {
+		case 0:
+		    _nc_STRCAT(show, " ka1", sizeof(show));
+		    break;
+		case 1:
+		    _nc_STRCAT(show, " ka3", sizeof(show));
+		    break;
+		case 2:
+		    _nc_STRCAT(show, " kb2", sizeof(show));
+		    break;
+		case 3:
+		    _nc_STRCAT(show, " kc1", sizeof(show));
+		    break;
+		case 4:
+		    _nc_STRCAT(show, " kc3", sizeof(show));
+		    break;
+		}
+	    }
+
+	    _nc_warning("vt100 keypad order inconsistent: %s", show);
+	}
+
+    } else if (VALID_STRING(key_a1) ||
+	       VALID_STRING(key_a3) ||
+	       VALID_STRING(key_b2) ||
+	       VALID_STRING(key_c1) ||
+	       VALID_STRING(key_c3)) {
+	show[0] = '\0';
+	if (keypad_index(key_a1) >= 0)
+	    _nc_STRCAT(show, " ka1", sizeof(show));
+	if (keypad_index(key_a3) >= 0)
+	    _nc_STRCAT(show, " ka3", sizeof(show));
+	if (keypad_index(key_b2) >= 0)
+	    _nc_STRCAT(show, " kb2", sizeof(show));
+	if (keypad_index(key_c1) >= 0)
+	    _nc_STRCAT(show, " kc1", sizeof(show));
+	if (keypad_index(key_c3) >= 0)
+	    _nc_STRCAT(show, " kc3", sizeof(show));
+	if (*show != '\0')
+	    _nc_warning("vt100 keypad map incomplete:%s", show);
+    }
+
+    /*
+     * These warnings are useful for consistency checks - it is possible that
+     * there are real terminals with mismatches in these
+     */
+    ANDMISSING(key_ic, key_dc);
+}
+
+static void
+check_printer(TERMTYPE2 *tp)
+{
+    (void) tp;
+#if defined(enter_doublewide_mode) && defined(exit_doublewide_mode)
+    PAIRED(enter_doublewide_mode, exit_doublewide_mode);
+#endif
+#if defined(enter_italics_mode) && defined(exit_italics_mode)
+    PAIRED(enter_italics_mode, exit_italics_mode);
+#endif
+#if defined(enter_leftward_mode) && defined(exit_leftward_mode)
+    PAIRED(enter_leftward_mode, exit_leftward_mode);
+#endif
+#if defined(enter_micro_mode) && defined(exit_micro_mode)
+    PAIRED(enter_micro_mode, exit_micro_mode);
+#endif
+#if defined(enter_shadow_mode) && defined(exit_shadow_mode)
+    PAIRED(enter_shadow_mode, exit_shadow_mode);
+#endif
+#if defined(enter_subscript_mode) && defined(exit_subscript_mode)
+    PAIRED(enter_subscript_mode, exit_subscript_mode);
+#endif
+#if defined(enter_superscript_mode) && defined(exit_superscript_mode)
+    PAIRED(enter_superscript_mode, exit_superscript_mode);
+#endif
+#if defined(enter_upward_mode) && defined(exit_upward_mode)
+    PAIRED(enter_upward_mode, exit_upward_mode);
+#endif
+
+#if defined(start_char_set_def) && defined(stop_char_set_def)
+    ANDMISSING(start_char_set_def, stop_char_set_def);
+#endif
+
+    /*
+     * If we have a parameterized form, then the non-parameterized is easy.
+     * note: parameterized/non-parameterized margin settings are unrelated.
+     */
+#if defined(parm_down_micro) && defined(micro_down)
+    ANDMISSING(parm_down_micro, micro_down);
+#endif
+#if defined(parm_left_micro) && defined(micro_left)
+    ANDMISSING(parm_left_micro, micro_left);
+#endif
+#if defined(parm_right_micro) && defined(micro_right)
+    ANDMISSING(parm_right_micro, micro_right);
+#endif
+#if defined(parm_up_micro) && defined(micro_up)
+    ANDMISSING(parm_up_micro, micro_up);
+#endif
+}
+
+#if NCURSES_XNAMES
+static bool
+uses_SGR_39_49(const char *value)
+{
+    return (strstr(value, "39;49") != 0
+	    || strstr(value, "49;39") != 0);
+}
+
+/*
+ * Check consistency of termcap extensions related to "screen".
+ */
+static void
+check_screen(TERMTYPE2 *tp)
+{
+    if (_nc_user_definable) {
+	int have_XT = tigetflag("XT");
+	int have_XM = tigetflag("XM");
+	int have_bce = back_color_erase;
+	bool have_kmouse = FALSE;
+	bool use_sgr_39_49 = FALSE;
+	const char *name_39_49 = "orig_pair or orig_colors";
+	char *name = _nc_first_name(tp->term_names);
+	bool is_screen = !strncmp(name, "screen", 6);
+	bool screen_base = (is_screen
+			    && strchr(name, '.') == NULL);
+
+	if (!VALID_BOOLEAN(have_bce)) {
+	    have_bce = FALSE;
+	}
+	if (!VALID_BOOLEAN(have_XM)) {
+	    have_XM = FALSE;
+	}
+	if (!VALID_BOOLEAN(have_XT)) {
+	    have_XT = FALSE;
+	}
+	if (VALID_STRING(key_mouse)) {
+	    have_kmouse = !strcmp("\033[M", key_mouse);
+	}
+	if (have_bce) {
+	    if (VALID_STRING(orig_pair)) {
+		name_39_49 = "orig_pair";
+		use_sgr_39_49 = uses_SGR_39_49(orig_pair);
+	    }
+	    if (!use_sgr_39_49 && VALID_STRING(orig_colors)) {
+		name_39_49 = "orig_colors";
+		use_sgr_39_49 = uses_SGR_39_49(orig_colors);
+	    }
+	}
+
+	if (have_XM && have_XT) {
+	    _nc_warning("screen's XT capability conflicts with XM");
+	} else if (have_XT && screen_base) {
+	    _nc_warning("screen's \"screen\" entries should not have XT set");
+	} else if (have_XT) {
+	    char *s;
+
+	    if (!have_kmouse && is_screen) {
+		if (VALID_STRING(key_mouse)) {
+		    _nc_warning("value of kmous inconsistent with screen's usage");
+		} else {
+		    _nc_warning("expected kmous capability with XT");
+		}
+	    }
+	    if (max_colors > 0) {
+		if (!have_bce) {
+		    _nc_warning("expected bce capability with XT");
+		} else if (!use_sgr_39_49) {
+		    _nc_warning("expected %s capability with XT "
+				"to have 39/49 parameters", name_39_49);
+		}
+	    }
+	    if (VALID_STRING(to_status_line)
+		&& (s = strchr(to_status_line, ';')) != NULL
+		&& *++s == '\0')
+		_nc_warning("\"tsl\" capability is redundant, given XT");
+	} else {
+	    if (have_kmouse
+		&& !have_XM
+		&& !screen_base && strchr(name, '+') == NULL) {
+		_nc_warning("expected XT to be set, given kmous");
+	    }
+	}
+    }
+}
+#else
+#define check_screen(tp)	/* nothing */
+#endif
+
+/*
+ * Returns the expected number of parameters for the given capability.
+ */
+static int
+expected_params(const char *name)
+{
+#define DATA(name,count) { { name }, count }
+    /* *INDENT-OFF* */
+    static const struct {
+	const char name[9];
+	int count;
+    } table[] = {
+	DATA( "S0",		1 ),	/* 'screen' extension */
+	DATA( "birep",		2 ),
+	DATA( "chr",		1 ),
+	DATA( "colornm",	1 ),
+	DATA( "cpi",		1 ),
+	DATA( "csnm",		1 ),
+	DATA( "csr",		2 ),
+	DATA( "cub",		1 ),
+	DATA( "cud",		1 ),
+	DATA( "cuf",		1 ),
+	DATA( "cup",		2 ),
+	DATA( "cuu",		1 ),
+	DATA( "cvr",		1 ),
+	DATA( "cwin",		5 ),
+	DATA( "dch",		1 ),
+	DATA( "defc",		3 ),
+	DATA( "dial",		1 ),
+	DATA( "dispc",		1 ),
+	DATA( "dl",		1 ),
+	DATA( "ech",		1 ),
+	DATA( "getm",		1 ),
+	DATA( "hpa",		1 ),
+	DATA( "ich",		1 ),
+	DATA( "il",		1 ),
+	DATA( "indn",		1 ),
+	DATA( "initc",		4 ),
+	DATA( "initp",		7 ),
+	DATA( "lpi",		1 ),
+	DATA( "mc5p",		1 ),
+	DATA( "mrcup",		2 ),
+	DATA( "mvpa",		1 ),
+	DATA( "pfkey",		2 ),
+	DATA( "pfloc",		2 ),
+	DATA( "pfx",		2 ),
+	DATA( "pfxl",		3 ),
+	DATA( "pln",		2 ),
+	DATA( "qdial",		1 ),
+	DATA( "rcsd",		1 ),
+	DATA( "rep",		2 ),
+	DATA( "rin",		1 ),
+	DATA( "sclk",		3 ),
+	DATA( "scp",		1 ),
+	DATA( "scs",		1 ),
+	DATA( "scsd",		2 ),
+	DATA( "setab",		1 ),
+	DATA( "setaf",		1 ),
+	DATA( "setb",		1 ),
+	DATA( "setcolor",	1 ),
+	DATA( "setf",		1 ),
+	DATA( "sgr",		9 ),
+	DATA( "sgr1",		6 ),
+	DATA( "slength",	1 ),
+	DATA( "slines",		1 ),
+	DATA( "smgbp",		1 ),	/* 2 if smgtp is not given */
+	DATA( "smglp",		1 ),
+	DATA( "smglr",		2 ),
+	DATA( "smgrp",		1 ),
+	DATA( "smgtb",		2 ),
+	DATA( "smgtp",		1 ),
+	DATA( "tsl",		1 ),
+	DATA( "u6",		-1 ),
+	DATA( "vpa",		1 ),
+	DATA( "wind",		4 ),
+	DATA( "wingo",		1 ),
+    };
+    /* *INDENT-ON* */
+#undef DATA
+
+    unsigned n;
+    int result = 0;		/* function-keys, etc., use none */
+
+    for (n = 0; n < SIZEOF(table); n++) {
+	if (!strcmp(name, table[n].name)) {
+	    result = table[n].count;
+	    break;
+	}
+    }
+
+    return result;
+}
+
+/*
+ * Check for user-capabilities that happen to be used in ncurses' terminal
+ * database.
+ */
+#if NCURSES_XNAMES
+static struct user_table_entry const *
+lookup_user_capability(const char *name)
+{
+    struct user_table_entry const *result = 0;
+    if (*name != 'k') {
+	result = _nc_find_user_entry(name);
+    }
+    return result;
+}
+#endif
+
+/*
+ * If a given name is likely to be a user-capability, return the number of
+ * parameters it would be used with.  If not, return -1.
+ *
+ * ncurses assumes that u6 could be used for getting the cursor-position, but
+ * that is not implemented.  Make a special case for that, to quiet needless
+ * warnings.
+ *
+ * The other string-capability extensions (see terminfo.src) which could have
+ * parameters such as "Ss", "%u", are not used by ncurses.  But we check those
+ * anyway, to validate the terminfo database.
+ */
+static int
+is_user_capability(const char *name)
+{
+    int result = -1;
+    if (name[0] == 'u' &&
+	(name[1] >= '0' && name[1] <= '9') &&
+	name[2] == '\0') {
+	result = (name[1] == '6') ? 2 : 0;
+    }
+#if NCURSES_XNAMES
+    else if (using_extensions) {
+	struct user_table_entry const *p = lookup_user_capability(name);
+	if (p != 0) {
+	    result = (int) p->ute_argc;
+	}
+    }
+#endif
+    return result;
+}
+
+static bool
+line_capability(const char *name)
+{
+    bool result = FALSE;
+    static const char *table[] =
+    {
+	"csr",			/* change_scroll_region          */
+	"clear",		/* clear_screen                  */
+	"ed",			/* clr_eos                       */
+	"cwin",			/* create_window                 */
+	"cup",			/* cursor_address                */
+	"cud1",			/* cursor_down                   */
+	"home",			/* cursor_home                   */
+	"mrcup",		/* cursor_mem_address            */
+	"ll",			/* cursor_to_ll                  */
+	"cuu1",			/* cursor_up                     */
+	"dl1",			/* delete_line                   */
+	"hd",			/* down_half_line                */
+	"flash",		/* flash_screen                  */
+	"ff",			/* form_feed                     */
+	"il1",			/* insert_line                   */
+	"nel",			/* newline                       */
+	"dl",			/* parm_delete_line              */
+	"cud",			/* parm_down_cursor              */
+	"indn",			/* parm_index                    */
+	"il",			/* parm_insert_line              */
+	"rin",			/* parm_rindex                   */
+	"cuu",			/* parm_up_cursor                */
+	"mc0",			/* print_screen                  */
+	"vpa",			/* row_address                   */
+	"ind",			/* scroll_forward                */
+	"ri",			/* scroll_reverse                */
+	"hu",			/* up_half_line                  */
+    };
+    size_t n;
+    for (n = 0; n < SIZEOF(table); ++n) {
+	if (!strcmp(name, table[n])) {
+	    result = TRUE;
+	    break;
+	}
+    }
+    return result;
+}
+
+/*
+ * Make a quick sanity check for the parameters which are used in the given
+ * strings.  If there are no "%p" tokens, then there should be no other "%"
+ * markers.
+ */
+static void
+check_params(TERMTYPE2 *tp, const char *name, const char *value, int extended)
+{
+    int expected = expected_params(name);
+    int actual = 0;
+    int n;
+    bool params[1 + NUM_PARM];
+    const char *s = value;
+
+#ifdef set_left_margin_parm
+    if (!strcmp(name, "smgrp")
+	&& !VALID_STRING(set_left_margin_parm))
+	expected = 2;
+#endif
+#ifdef set_right_margin_parm
+    if (!strcmp(name, "smglp")
+	&& !VALID_STRING(set_right_margin_parm))
+	expected = 2;
+#endif
+#ifdef set_top_margin_parm
+    if (!strcmp(name, "smgbp")
+	&& !VALID_STRING(set_top_margin_parm))
+	expected = 2;
+#endif
+#ifdef set_bottom_margin_parm
+    if (!strcmp(name, "smgtp")
+	&& !VALID_STRING(set_bottom_margin_parm))
+	expected = 2;
+#endif
+
+    for (n = 0; n <= NUM_PARM; n++)
+	params[n] = FALSE;
+
+    while (*s != 0) {
+	if (*s == '%') {
+	    if (*++s == '\0') {
+		_nc_warning("expected character after %% in %s", name);
+		break;
+	    } else if (*s == 'p') {
+		if (*++s == '\0' || !isdigit((int) *s)) {
+		    _nc_warning("expected digit after %%p in %s", name);
+		    return;
+		} else {
+		    n = (*s - '0');
+		    if (n > actual)
+			actual = n;
+		    params[n] = TRUE;
+		}
+	    }
+	}
+	s++;
+    }
+
+#if NCURSES_XNAMES
+    if (extended) {
+	int check = is_user_capability(name);
+	if (check != actual && (check >= 0 && actual >= 0)) {
+	    _nc_warning("extended %s capability has %d parameters, expected %d",
+			name, actual, check);
+	} else if (debug_level > 1) {
+	    _nc_warning("extended %s capability has %d parameters, as expected",
+			name, actual);
+	}
+	expected = actual;
+    }
+#else
+    (void) extended;
+#endif
+
+    if (params[0]) {
+	_nc_warning("%s refers to parameter 0 (%%p0), which is not allowed", name);
+    }
+    if (value == set_attributes || expected < 0) {
+	;
+    } else if (expected != actual) {
+	_nc_warning("%s uses %d parameters, expected %d", name,
+		    actual, expected);
+	for (n = 1; n < actual; n++) {
+	    if (!params[n])
+		_nc_warning("%s omits parameter %d", name, n);
+	}
+    }
+
+    /*
+     * Counting "%p" markers does not account for termcap expressions which
+     * may not have been fully translated.  Also, tparm does its own analysis.
+     * Report differences here.
+     */
+    _nc_reset_tparm(NULL);
+    if (actual >= 0) {
+	char *p_is_s[NUM_PARM];
+	int popcount;
+	int analyzed = _nc_tparm_analyze(NULL, value, p_is_s, &popcount);
+	if (analyzed < popcount) {
+	    analyzed = popcount;
+	}
+	if (actual != analyzed && expected != analyzed) {
+#if NCURSES_XNAMES
+	    int user_cap = is_user_capability(name);
+	    if ((user_cap == analyzed) && using_extensions) {
+		;		/* ignore */
+	    } else if (user_cap >= 0) {
+		_nc_warning("tparm will use %d parameters for %s, expected %d",
+			    analyzed, name, user_cap);
+	    } else
+#endif
+	    {
+		_nc_warning("tparm analyzed %d parameters for %s, expected %d",
+			    analyzed, name, actual);
+	    }
+	} else if (expected > 0
+		   && actual == expected
+		   && guess_tparm_type(expected, p_is_s) == Numbers) {
+	    int limit = 1;
+
+	    if (!strcmp(name, "setf")
+		|| !strcmp(name, "setb")
+		|| !strcmp(name, "setaf")
+		|| !strcmp(name, "setab")) {
+		if ((limit = max_colors) > 256)
+		    limit = 256;
+	    } else if (line_capability(name)) {
+		limit = 24;
+	    } else if (is_user_capability(name) < 0) {
+		limit = 80;
+	    }
+	    for (n = 0; n < limit; ++n) {
+		_nc_reset_tparm(NULL);
+		(void) TPARM_9(value, n, n, n, n, n, n, n, n, n);
+		if (_nc_tparm_err) {
+		    _nc_warning("problem%s in tparm(%s, %d, ...)",
+				(_nc_tparm_err == 1) ? "" : "s",
+				name, n);
+		    if (debug_level < 2)
+			break;
+		}
+	    }
+	}
+    }
+}
+
+/*
+ * Check for DEC VT100 private mode for reverse video.
+ */
+static const char *
+skip_DECSCNM(const char *value, int *flag)
+{
+    *flag = -1;
+    if (value != 0) {
+	int skip = csi_length(value);
+	if (skip > 0 &&
+	    value[skip++] == '?' &&
+	    value[skip++] == '5') {
+	    if (value[skip] == 'h') {
+		*flag = 1;
+	    } else if (value[skip] == 'l') {
+		*flag = 0;
+	    }
+	    value += skip + 1;
+	}
+    }
+    return value;
+}
+
+static void
+check_delays(TERMTYPE2 *tp, const char *name, const char *value)
+{
+    const char *p, *q;
+    const char *first = 0;
+    const char *last = 0;
+
+    for (p = value; *p != '\0'; ++p) {
+	if (p[0] == '$' && p[1] == '<') {
+	    const char *base = p + 2;
+	    const char *mark = 0;
+	    bool mixed = FALSE;
+	    int proportional = 0;
+	    int mandatory = 0;
+
+	    first = p;
+
+	    for (q = base; *q != '\0'; ++q) {
+		if (*q == '>') {
+		    if (mark == NULL)
+			mark = q;
+		    break;
+		} else if (*q == '*' || *q == '/') {
+		    if (*q == '*')
+			++proportional;
+		    if (*q == '/')
+			++mandatory;
+		    if (mark == NULL)
+			mark = q;
+		} else if (!(isalnum(UChar(*q)) || strchr("+-.", *q) != 0)) {
+		    break;
+		} else if (proportional || mandatory) {
+		    mixed = TRUE;
+		}
+	    }
+	    last = *q ? (q + 1) : q;
+	    if (*q != '\0') {
+		float check_f;
+		char check_c;
+		int rc = sscanf(base, "%f%c", &check_f, &check_c);
+		if ((rc != 2) || (mark != NULL && (check_c != *mark)) || mixed) {
+		    _nc_warning("syntax error in %s delay '%.*s'", name,
+				(int) (q - base), base);
+		} else if (*name == 'k') {
+		    _nc_warning("function-key %s has delay", name);
+		} else if (proportional && !line_capability(name)) {
+		    _nc_warning("non-line capability using proportional delay: %s", name);
+		} else if (!xon_xoff &&
+			   !mandatory &&
+			   strchr(_nc_first_name(tp->term_names), '+') == NULL) {
+		    _nc_warning("%s in %s is used since no xon/xoff",
+				(proportional
+				 ? "proportional delay"
+				 : "delay"),
+				name);
+		}
+	    } else {
+		p = q - 1;	/* restart scan */
+	    }
+	}
+    }
+
+    if (!strcmp(name, "flash") ||
+	!strcmp(name, "beep")) {
+
+	if (first != 0) {
+	    if (first == value || *last == 0) {
+		/*
+		 * Delay is on one end or the other.
+		 */
+		_nc_warning("expected delay embedded within %s", name);
+	    }
+	} else {
+	    int flag;
+
+	    /*
+	     * Check for missing delay when using VT100 reverse-video.
+	     * A real VT100 might not need this, but terminal emulators do.
+	     */
+	    if ((p = skip_DECSCNM(value, &flag)) != 0 &&
+		flag > 0 &&
+		skip_DECSCNM(p, &flag) != 0 &&
+		flag == 0) {
+		_nc_warning("expected a delay in %s", name);
+	    }
+	}
+    }
+}
+
+static char *
+check_1_infotocap(const char *name, NCURSES_CONST char *value, int count)
+{
+    int k;
+    int ignored;
+    long numbers[1 + NUM_PARM];
+    char *strings[1 + NUM_PARM];
+    char *p_is_s[NUM_PARM];
+    char *result;
+    char blob[NUM_PARM * 10];
+    char *next = blob;
+    TParams expect;
+    TParams actual;
+    int nparam;
+
+    *next++ = '\0';
+    for (k = 1; k <= NUM_PARM; k++) {
+	numbers[k] = count;
+	_nc_SPRINTF(next,
+		    _nc_SLIMIT(sizeof(blob) - (size_t) (next - blob))
+		    "XYZ%d", count);
+	strings[k] = next;
+	next += strlen(next) + 1;
+    }
+
+    _nc_reset_tparm(NULL);
+    expect = tparm_type(name);
+    nparam = _nc_tparm_analyze(NULL, value, p_is_s, &ignored);
+    actual = guess_tparm_type(nparam, p_is_s);
+
+    if (expect != actual) {
+	_nc_warning("%s has mismatched parameters", name);
+	actual = Other;
+    }
+
+    _nc_reset_tparm(NULL);
+    switch (actual) {
+    case Num_Str:
+	result = TPARM_2(value, numbers[1], strings[2]);
+	break;
+    case Num_Str_Str:
+	result = TPARM_3(value, numbers[1], strings[2], strings[3]);
+	break;
+    case Numbers:
+#define myParam(n) numbers[n]
+	result = TIPARM_9(value,
+			  myParam(1),
+			  myParam(2),
+			  myParam(3),
+			  myParam(4),
+			  myParam(5),
+			  myParam(6),
+			  myParam(7),
+			  myParam(8),
+			  myParam(9));
+#undef myParam
+	break;
+    case Other:
+    default:
+#define myParam(n) (p_is_s[n - 1] != 0 ? ((TPARM_ARG) strings[n]) : numbers[n])
+	result = TPARM_9(value,
+			 myParam(1),
+			 myParam(2),
+			 myParam(3),
+			 myParam(4),
+			 myParam(5),
+			 myParam(6),
+			 myParam(7),
+			 myParam(8),
+			 myParam(9));
+#undef myParam
+	break;
+    }
+    return strdup(result);
+}
+
+#define IsDelay(ch) ((ch) == '.' || isdigit(UChar(ch)))
+
+static const char *
+parse_delay_value(const char *src, double *delays, int *always)
+{
+    int star = 0;
+
+    *delays = 0.0;
+    if (always)
+	*always = 0;
+
+    while (isdigit(UChar(*src))) {
+	(*delays) = (*delays) * 10 + (*src++ - '0');
+    }
+    if (*src == '.') {
+	int gotdot = 1;
+
+	++src;
+	while (isdigit(UChar(*src))) {
+	    gotdot *= 10;
+	    (*delays) += (*src++ - '0') / gotdot;
+	}
+    }
+    while (*src == '*' || *src == '/') {
+	if (always == NULL && *src == '/')
+	    break;
+	if (*src++ == '*') {
+	    star = 1;
+	} else {
+	    *always = 1;
+	}
+    }
+    if (star)
+	*delays = -(*delays);
+    return src;
+}
+
+static const char *
+parse_ti_delay(const char *ti, double *delays)
+{
+    *delays = 0.0;
+    while (*ti != '\0') {
+	if (*ti == '\\') {
+	    ++ti;
+	}
+	if (ti[0] == '$'
+	    && ti[1] == '<'
+	    && IsDelay(UChar(ti[2]))) {
+	    int ignored;
+	    const char *last = parse_delay_value(ti + 2, delays, &ignored);
+	    if (*last == '>') {
+		ti = last;
+	    }
+	} else {
+	    ++ti;
+	}
+    }
+    return ti;
+}
+
+static const char *
+parse_tc_delay(const char *tc, double *delays)
+{
+    return parse_delay_value(tc, delays, (int *) 0);
+}
+
+/*
+ * Compare terminfo- and termcap-strings, factoring out delays.
+ */
+static bool
+same_ti_tc(const char *ti, const char *tc, bool * embedded)
+{
+    bool same = TRUE;
+    double ti_delay = 0.0;
+    double tc_delay = 0.0;
+    const char *ti_last;
+
+    *embedded = FALSE;
+    ti_last = parse_ti_delay(ti, &ti_delay);
+    tc = parse_tc_delay(tc, &tc_delay);
+
+    while ((ti < ti_last) && *tc) {
+	if (*ti == '\\' && ispunct(UChar(ti[1]))) {
+	    ++ti;
+	    if ((*ti == '^') && !strncmp(tc, "\\136", 4)) {
+		ti += 1;
+		tc += 4;
+		continue;
+	    }
+	} else if (ti[0] == '$' && ti[1] == '<') {
+	    double no_delay;
+	    const char *ss = parse_ti_delay(ti, &no_delay);
+	    if (ss != ti) {
+		*embedded = TRUE;
+		ti = ss;
+		continue;
+	    }
+	}
+	if (*tc == '\\' && ispunct(UChar(tc[1]))) {
+	    ++tc;
+	}
+	if (*ti++ != *tc++) {
+	    same = FALSE;
+	    break;
+	}
+    }
+
+    if (*embedded) {
+	if (same) {
+	    same = FALSE;
+	} else {
+	    *embedded = FALSE;	/* report only one problem */
+	}
+    }
+
+    return same;
+}
+
+/*
+ * Check terminfo to termcap translation.
+ */
+static void
+check_infotocap(TERMTYPE2 *tp, int i, const char *value)
+{
+    const char *name = ExtStrname(tp, i, strnames);
+    int params = ((i < (int) SIZEOF(parametrized))
+		  ? parametrized[i]
+		  : ((*value == 'k')
+		     ? 0
+		     : has_params(value, FALSE)));
+    char *ti_value = NULL;
+    char *tc_value;
+    bool embedded;
+
+    assert(SIZEOF(parametrized) == STRCOUNT);
+    if (!VALID_STRING(value) || (ti_value = strdup(value)) == NULL) {
+	_nc_warning("tic-expansion of %s failed", name);
+    } else if ((tc_value = _nc_infotocap(name, ti_value, params)) == ABSENT_STRING) {
+	_nc_warning("tic-conversion of %s failed", name);
+    } else if (params > 0) {
+	int limit = 5;
+	int count;
+	bool first = TRUE;
+
+	if (!strcmp(name, "setf")
+	    || !strcmp(name, "setb")
+	    || !strcmp(name, "setaf")
+	    || !strcmp(name, "setab")) {
+	    if ((limit = max_colors) > 256)
+		limit = 256;
+	}
+	for (count = 0; count < limit; ++count) {
+	    char *ti_check = check_1_infotocap(name, ti_value, count);
+	    char *tc_check = check_1_infotocap(name, tc_value, count);
+
+	    if (strcmp(ti_check, tc_check)) {
+		if (first) {
+		    fprintf(stderr, "check_infotocap(%s)\n", name);
+		    fprintf(stderr, "...ti '%s'\n", _nc_visbuf2(0, ti_value));
+		    fprintf(stderr, "...tc '%s'\n", _nc_visbuf2(0, tc_value));
+		    first = FALSE;
+		}
+		_nc_warning("tparm-conversion of %s(%d) differs between\n\tterminfo %s\n\ttermcap  %s",
+			    name, count,
+			    _nc_visbuf2(0, ti_check),
+			    _nc_visbuf2(1, tc_check));
+	    }
+	    free(ti_check);
+	    free(tc_check);
+	}
+    } else if (params == 0 && !same_ti_tc(ti_value, tc_value, &embedded)) {
+	if (embedded) {
+	    _nc_warning("termcap equivalent of %s cannot use embedded delay", name);
+	} else {
+	    _nc_warning("tic-conversion of %s changed value\n\tfrom %s\n\tto   %s",
+			name, ti_value, tc_value);
+	}
+    }
+    free(ti_value);
+}
+
+static char *
+skip_delay(char *s)
+{
+    while (*s == '/' || isdigit(UChar(*s)))
+	++s;
+    return s;
+}
+
+/*
+ * Skip a delay altogether, e.g., when comparing a simple string to sgr,
+ * the latter may have a worst-case delay on the end.
+ */
+static char *
+ignore_delays(char *s)
+{
+    int delaying = 0;
+
+    do {
+	switch (*s) {
+	case '$':
+	    if (delaying == 0)
+		delaying = 1;
+	    break;
+	case '<':
+	    if (delaying == 1)
+		delaying = 2;
+	    break;
+	case '\0':
+	    delaying = 0;
+	    break;
+	default:
+	    if (delaying) {
+		s = skip_delay(s);
+		if (*s == '>')
+		    ++s;
+		delaying = 0;
+	    }
+	    break;
+	}
+	if (delaying)
+	    ++s;
+    } while (delaying);
+    return s;
+}
+
+#define DATA(name) { #name }
+static const char sgr_names[][11] =
+{
+    DATA(none),
+    DATA(standout),
+    DATA(underline),
+    DATA(reverse),
+    DATA(blink),
+    DATA(dim),
+    DATA(bold),
+    DATA(invis),
+    DATA(protect),
+    DATA(altcharset),
+    ""
+};
+#undef DATA
+
+/*
+ * An sgr string may contain several settings other than the one we're
+ * interested in, essentially sgr0 + rmacs + whatever.  As long as the
+ * "whatever" is contained in the sgr string, that is close enough for our
+ * sanity check.
+ */
+static bool
+similar_sgr(int num, char *a, char *b)
+{
+    char *base_a = a;
+    char *base_b = b;
+    int delaying = 0;
+
+    while (*b != 0) {
+	while (*a != *b) {
+	    if (*a == 0) {
+		if (num < 0) {
+		    ;
+		} else if (b[0] == '$'
+			   && b[1] == '<') {
+		    _nc_warning("did not find delay %s", _nc_visbuf(b));
+		} else {
+		    _nc_warning("checking sgr(%s) %s\n\tcompare to %s\n\tunmatched %s",
+				sgr_names[num], _nc_visbuf2(1, base_a),
+				_nc_visbuf2(2, base_b),
+				_nc_visbuf2(3, b));
+		}
+		return FALSE;
+	    } else if (delaying) {
+		a = skip_delay(a);
+		b = skip_delay(b);
+	    } else if ((*b == '0' || (*b == ';')) && *a == 'm') {
+		b++;
+	    } else {
+		a++;
+	    }
+	}
+	switch (*a) {
+	case '$':
+	    if (delaying == 0)
+		delaying = 1;
+	    break;
+	case '<':
+	    if (delaying == 1)
+		delaying = 2;
+	    break;
+	default:
+	    delaying = 0;
+	    break;
+	}
+	a++;
+	b++;
+    }
+    /* ignore delays on the end of the string */
+    a = ignore_delays(a);
+    return ((num != 0) || (*a == 0));
+}
+
+static void
+check_tparm_err(int num)
+{
+    if (_nc_tparm_err)
+	_nc_warning("tparam error in sgr(%d): %s", num, sgr_names[num]);
+}
+
+static char *
+check_sgr(TERMTYPE2 *tp, char *zero, int num, char *cap, const char *name)
+{
+    char *test;
+
+    _nc_tparm_err = 0;
+    test = TIPARM_9(set_attributes,
+		    num == 1,
+		    num == 2,
+		    num == 3,
+		    num == 4,
+		    num == 5,
+		    num == 6,
+		    num == 7,
+		    num == 8,
+		    num == 9);
+    if (test != 0) {
+	if (PRESENT(cap)) {
+	    if (!similar_sgr(num, test, cap)) {
+		_nc_warning("%s differs from sgr(%d)\n\t%s=%s\n\tsgr(%d)=%s",
+			    name, num,
+			    name, _nc_visbuf2(1, cap),
+			    num, _nc_visbuf2(2, test));
+	    }
+	} else if (_nc_capcmp(test, zero)) {
+	    _nc_warning("sgr(%d) present, but not %s", num, name);
+	}
+    } else if (PRESENT(cap)) {
+	_nc_warning("sgr(%d) missing, but %s present", num, name);
+    }
+    check_tparm_err(num);
+    return test;
+}
+
+#define CHECK_SGR(num,name) check_sgr(tp, zero, num, name, #name)
+
+#ifdef TRACE
+/*
+ * If tic is compiled with TRACE, we'll be able to see the output from the
+ * DEBUG() macro.  But since it doesn't use traceon(), it always goes to
+ * the standard error.  Use this function to make it simpler to follow the
+ * resulting debug traces.
+ */
+static void
+show_where(unsigned level)
+{
+    if (_nc_tracing >= DEBUG_LEVEL(level)) {
+	char my_name[MAX_NAME_SIZE];
+	_nc_get_type(my_name);
+	_tracef("\"%s\", line %d, '%s'",
+		_nc_get_source(),
+		_nc_curr_line, my_name);
+    }
+}
+
+#else
+#define show_where(level)	/* nothing */
+#endif
+
+typedef struct {
+    int keycode;
+    const char *name;
+    const char *value;
+} NAME_VALUE;
+
+static NAME_VALUE *
+get_fkey_list(TERMTYPE2 *tp)
+{
+    NAME_VALUE *result = typeMalloc(NAME_VALUE, NUM_STRINGS(tp) + 1);
+    const struct tinfo_fkeys *all_fkeys = _nc_tinfo_fkeys;
+    int used = 0;
+    unsigned j;
+
+    if (result == NULL)
+	failed("get_fkey_list");
+
+    for (j = 0; all_fkeys[j].code; j++) {
+	char *a = tp->Strings[all_fkeys[j].offset];
+	if (VALID_STRING(a)) {
+	    result[used].keycode = (int) all_fkeys[j].code;
+	    result[used].name = strnames[all_fkeys[j].offset];
+	    result[used].value = a;
+	    ++used;
+	}
+    }
+#if NCURSES_XNAMES
+    for (j = STRCOUNT; j < NUM_STRINGS(tp); ++j) {
+	const char *name = ExtStrname(tp, (int) j, strnames);
+	if (*name == 'k') {
+	    result[used].keycode = -1;
+	    result[used].name = name;
+	    result[used].value = tp->Strings[j];
+	    ++used;
+	}
+    }
+#endif
+    result[used].keycode = 0;
+    return result;
+}
+
+static void
+show_fkey_name(NAME_VALUE * data)
+{
+    if (data->keycode > 0) {
+	fprintf(stderr, " %s", keyname(data->keycode));
+	fprintf(stderr, " (capability \"%s\")", data->name);
+    } else {
+	fprintf(stderr, " capability \"%s\"", data->name);
+    }
+}
+
+/*
+ * A terminal entry may contain more than one keycode assigned to a given
+ * string (e.g., KEY_END and KEY_LL).  But curses will only return one (the
+ * last one assigned).
+ */
+static void
+check_conflict(TERMTYPE2 *tp)
+{
+    if (!(_nc_syntax == SYN_TERMCAP && capdump)) {
+	char *check = calloc((size_t) (NUM_STRINGS(tp) + 1), sizeof(char));
+	NAME_VALUE *given = get_fkey_list(tp);
+	unsigned j, k;
+	bool conflict = FALSE;
+
+	if (check == NULL)
+	    failed("check_conflict");
+
+	for (j = 0; given[j].keycode; ++j) {
+	    const char *a = given[j].value;
+	    bool first = TRUE;
+
+	    if (!VALID_STRING(a))
+		continue;
+
+	    for (k = j + 1; given[k].keycode; k++) {
+		const char *b = given[k].value;
+
+		if (!VALID_STRING(b))
+		    continue;
+		if (check[k])
+		    continue;
+
+		if (!_nc_capcmp(a, b)) {
+		    check[j] = 1;
+		    check[k] = 1;
+		    if (first) {
+			if (!conflict) {
+			    _nc_warning("conflicting key definitions (using the last)");
+			    conflict = TRUE;
+			}
+			fprintf(stderr, "...");
+			show_fkey_name(given + j);
+			fprintf(stderr, " is the same as");
+			show_fkey_name(given + k);
+			first = FALSE;
+		    } else {
+			fprintf(stderr, ", ");
+			show_fkey_name(given + k);
+		    }
+		}
+	    }
+	    if (!first)
+		fprintf(stderr, "\n");
+	}
+#if NCURSES_XNAMES
+	if (using_extensions) {
+	    /* *INDENT-OFF* */
+	    static struct {
+		const char *xcurses;
+		const char *shifted;
+	    } table[] = {
+		{ "kDC",  NULL },
+		{ "kDN",  "kind" },
+		{ "kEND", NULL },
+		{ "kHOM", NULL },
+		{ "kLFT", NULL },
+		{ "kNXT", NULL },
+		{ "kPRV", NULL },
+		{ "kRIT", NULL },
+		{ "kUP",  "kri" },
+		{ NULL,   NULL },
+	    };
+	    /* *INDENT-ON* */
+	    /*
+	     * SVr4 curses defines the "xcurses" names listed above except for
+	     * the special cases in the "shifted" column.  When using these
+	     * names for xterm's extensions, that was confusing, and resulted
+	     * in adding extended capabilities with "2" (shift) suffix.  This
+	     * check warns about unnecessary use of extensions for this quirk.
+	     */
+	    for (j = 0; given[j].keycode; ++j) {
+		const char *find = given[j].name;
+		int value;
+		char ch;
+
+		if (!VALID_STRING(given[j].value))
+		    continue;
+
+		for (k = 0; table[k].xcurses; ++k) {
+		    const char *test = table[k].xcurses;
+		    size_t size = strlen(test);
+
+		    if (!strncmp(find, test, size) && strcmp(find, test)) {
+			switch (sscanf(find + size, "%d%c", &value, &ch)) {
+			case 1:
+			    if (value == 2) {
+				_nc_warning("expected '%s' rather than '%s'",
+					    (table[k].shifted
+					     ? table[k].shifted
+					     : test), find);
+			    } else if (value < 2 || value > 15) {
+				_nc_warning("expected numeric 2..15 '%s'", find);
+			    }
+			    break;
+			default:
+			    _nc_warning("expected numeric suffix for '%s'", find);
+			    break;
+			}
+			break;
+		    }
+		}
+	    }
+	}
+#endif
+	free(given);
+	free(check);
+    }
+}
+
+/*
+ * Exiting a video mode should not duplicate sgr0
+ */
+static void
+check_exit_attribute(const char *name, char *test, char *trimmed, char *untrimmed)
+{
+    if (VALID_STRING(test) && (trimmed != 0)) {
+	if (similar_sgr(-1, trimmed, test) ||
+	    similar_sgr(-1, untrimmed, test)) {
+	    _nc_warning("%s matches exit_attribute_mode", name);
+	}
+    }
+}
+
+/*
+ * Returns true if the string looks like a standard SGR string.
+ */
+static bool
+is_sgr_string(char *value)
+{
+    bool result = FALSE;
+
+    if (VALID_STRING(value)) {
+	int skip = csi_length(value);
+
+	if (skip) {
+	    int ch;
+
+	    result = TRUE;
+	    value += skip;
+	    while ((ch = UChar(*value++)) != '\0') {
+		if (isdigit(ch) || ch == ';') {
+		    ;
+		} else if (ch == 'm' && *value == '\0') {
+		    ;
+		} else {
+		    result = FALSE;
+		    break;
+		}
+	    }
+	}
+    }
+    return result;
+}
+
+/*
+ * Check if the given capability contains a given SGR attribute.
+ */
+static void
+check_sgr_param(TERMTYPE2 *tp, int code, const char *name, char *value)
+{
+    if (VALID_STRING(value)) {
+	int ncv = ((code != 0) ? (1 << (code - 1)) : 0);
+	char *test = tgoto(value, 0, 0);
+	if (is_sgr_string(test)) {
+	    int param = 0;
+	    int count = 0;
+	    int skips = 0;
+	    int color = (value == set_a_foreground ||
+			 value == set_a_background ||
+			 value == set_foreground ||
+			 value == set_background);
+	    while (*test != 0) {
+		if (isdigit(UChar(*test))) {
+		    param = 10 * param + (*test - '0');
+		    ++count;
+		} else {
+		    if (count) {
+			/*
+			 * Avoid unnecessary warning for xterm 256color codes.
+			 */
+			if (color && (param == 38 || param == 48))
+			    skips = 3;
+			if ((skips-- <= 0) && (param == code))
+			    break;
+		    }
+		    count = 0;
+		    param = 0;
+		}
+		++test;
+	    }
+	    if (count != 0 && param == code) {
+		if (code == 0 ||
+		    no_color_video < 0 ||
+		    !(no_color_video & ncv)) {
+		    _nc_warning("\"%s\" SGR-attribute used in %s",
+				sgr_names[code],
+				name);
+		}
+	    }
+	}
+    }
+}
+
+#if NCURSES_XNAMES
+static int
+standard_type(const char *name)
+{
+    int result = -1;
+    const struct name_table_entry *np;
+
+    if ((np = _nc_find_entry(name, _nc_get_hash_table(0))) != 0) {
+	result = np->nte_type;
+    }
+    return result;
+}
+
+static const char *
+name_of_type(int type)
+{
+    const char *result = "unknown";
+    switch (type) {
+    case BOOLEAN:
+	result = "boolean";
+	break;
+    case NUMBER:
+	result = "number";
+	break;
+    case STRING:
+	result = "string";
+	break;
+    }
+    return result;
+}
+
+static void
+check_user_capability_type(const char *name, int actual)
+{
+    if (lookup_user_capability(name) == 0) {
+	int expected = standard_type(name);
+	if (expected >= 0) {
+	    _nc_warning("expected %s to be %s, but actually %s",
+			name,
+			name_of_type(actual),
+			name_of_type(expected)
+		);
+	} else if (*name != 'k') {
+	    _nc_warning("undocumented %s capability %s",
+			name_of_type(actual),
+			name);
+	}
+    }
+}
+#endif
+
+#define IN_DELAY "0123456789*/."
+
+static bool
+check_ANSI_cap(const char *value, int nparams, char final)
+{
+    bool result = FALSE;
+    if (VALID_STRING(value) && csi_length(value) > 0) {
+	char *p_is_s[NUM_PARM];
+	int popcount;
+	int analyzed = _nc_tparm_analyze(NULL, value, p_is_s, &popcount);
+	if (analyzed < popcount) {
+	    analyzed = popcount;
+	}
+	if (analyzed == nparams) {
+	    bool numbers = TRUE;
+	    int p;
+	    for (p = 0; p < nparams; ++p) {
+		if (p_is_s[p]) {
+		    numbers = FALSE;
+		    break;
+		}
+	    }
+	    if (numbers) {
+		int in_delay = 0;
+		p = (int) strlen(value);
+		while (p-- > 0) {
+		    char ch = value[p];
+		    if (ch == final) {
+			result = TRUE;
+			break;
+		    }
+		    switch (in_delay) {
+		    case 0:
+			if (ch == '>')
+			    in_delay = 1;
+			break;
+		    case 1:
+			if (strchr(IN_DELAY, value[p]) != NULL)
+			    break;
+			if (ch != '<')
+			    p = 0;
+			in_delay = 2;
+			break;
+		    case 2:
+			if (ch != '$')
+			    p = 0;
+			in_delay = 0;
+			break;
+		    }
+		}
+	    }
+	}
+    }
+    return result;
+}
+
+static const char *
+skip_Delay(const char *value)
+{
+    const char *result = value;
+
+    if (*value == '$') {
+	++result;
+	if (*result++ == '<') {
+	    while (strchr(IN_DELAY, *result) != NULL)
+		++result;
+	    if (*result++ != '>') {
+		result = value;
+	    }
+	} else {
+	    result = value;
+	}
+    }
+    return result;
+}
+
+static bool
+isValidString(const char *value, const char *expect)
+{
+    bool result = FALSE;
+    if (VALID_STRING(value)) {
+	if (!strcmp(value, expect))
+	    result = TRUE;
+    }
+    return result;
+}
+
+static bool
+isValidEscape(const char *value, const char *expect)
+{
+    bool result = FALSE;
+    if (VALID_STRING(value)) {
+	if (*value == '\033') {
+	    size_t need = strlen(expect);
+	    size_t have = strlen(value) - 1;
+	    if (have >= need && !strncmp(value + 1, expect, need)) {
+		if (*skip_Delay(value + need + 1) == '\0') {
+		    result = TRUE;
+		}
+	    }
+	}
+    }
+    return result;
+}
+
+static int
+guess_ANSI_VTxx(TERMTYPE2 *tp)
+{
+    int result = -1;
+    int checks = 0;
+
+    /* VT100s have scrolling region, but ANSI (ECMA-48) does not specify */
+    if (check_ANSI_cap(change_scroll_region, 2, 'r') &&
+	(isValidEscape(scroll_forward, "D") ||
+	 isValidString(scroll_forward, "\n") ||
+	 isValidEscape(scroll_forward, "6")) &&
+	(isValidEscape(scroll_reverse, "M") ||
+	 isValidEscape(scroll_reverse, "9"))) {
+	checks |= 2;
+    }
+    if (check_ANSI_cap(cursor_address, 2, 'H') &&
+	check_ANSI_cap(cursor_up, 0, 'A') &&
+	(check_ANSI_cap(cursor_down, 0, 'B') ||
+	 isValidString(cursor_down, "\n")) &&
+	check_ANSI_cap(cursor_right, 0, 'C') &&
+	(check_ANSI_cap(cursor_left, 0, 'D') ||
+	 isValidString(cursor_left, "\b")) &&
+	check_ANSI_cap(clr_eos, 0, 'J') &&
+	check_ANSI_cap(clr_bol, 0, 'K') &&
+	check_ANSI_cap(clr_eol, 0, 'K')) {
+	checks |= 1;
+    }
+    if (checks == 3)
+	result = 1;
+    if (checks == 1)
+	result = 0;
+    return result;
+}
+
+/*
+ * u6/u7 and u8/u9 are query/response extensions which most terminals support.
+ * In particular, any ECMA-48 terminal should support these, though the details
+ * for u9 are implementation dependent.
+ */
+static void
+check_user_6789(TERMTYPE2 *tp)
+{
+    /*
+     * Check if the terminal is known to not 
+     */
+#define NO_QUERY(longname,shortname) \
+	if (PRESENT(longname)) _nc_warning(#shortname " is not supported")
+    if (tigetflag("NQ") > 0) {
+	NO_QUERY(user6, u6);
+	NO_QUERY(user7, u7);
+	NO_QUERY(user8, u8);
+	NO_QUERY(user9, u9);
+	return;
+    }
+
+    PAIRED(user6, user7);
+    PAIRED(user8, user9);
+
+    if (strchr(tp->term_names, '+') != NULL)
+	return;
+
+    switch (guess_ANSI_VTxx(tp)) {
+    case 1:
+	if (!PRESENT(user8)) {
+	    _nc_warning("expected u8/u9 for device-attributes");
+	}
+	/* FALLTHRU */
+    case 0:
+	if (!PRESENT(user6)) {
+	    _nc_warning("expected u6/u7 for cursor-position");
+	}
+	break;
+    }
+}
+
+/* other sanity-checks (things that we don't want in the normal
+ * logic that reads a terminfo entry)
+ */
+static void
+check_termtype(TERMTYPE2 *tp, bool literal)
+{
+    unsigned j;
+
+    check_conflict(tp);
+
+    for_each_string(j, tp) {
+	char *a = tp->Strings[j];
+	if (VALID_STRING(a)) {
+	    const char *name = ExtStrname(tp, (int) j, strnames);
+	    /*
+	     * If we expect parameters, or if there might be parameters,
+	     * check for consistent number of parameters.
+	     */
+	    if (j >= SIZEOF(parametrized) ||
+		is_user_capability(name) >= 0 ||
+		parametrized[j] > 0) {
+		check_params(tp, name, a, (j >= STRCOUNT));
+	    }
+	    check_delays(tp, ExtStrname(tp, (int) j, strnames), a);
+	    if (capdump) {
+		check_infotocap(tp, (int) j, a);
+	    }
+	}
+    }
+#if NCURSES_XNAMES
+    /* in extended mode, verify that each extension is expected type */
+    for_each_ext_boolean(j, tp) {
+	check_user_capability_type(ExtBoolname(tp, (int) j, strnames), BOOLEAN);
+    }
+    for_each_ext_number(j, tp) {
+	check_user_capability_type(ExtNumname(tp, (int) j, strnames), NUMBER);
+    }
+    for_each_ext_string(j, tp) {
+	check_user_capability_type(ExtStrname(tp, (int) j, strnames), STRING);
+    }
+#endif /* NCURSES_XNAMES */
+
+    check_acs(tp);
+    check_colors(tp);
+    check_cursor(tp);
+    check_keypad(tp);
+    check_printer(tp);
+    check_screen(tp);
+    check_user_6789(tp);
+
+    /*
+     * These are probably both or none.
+     */
+    PAIRED(parm_index, parm_rindex);
+    PAIRED(parm_ich, parm_dch);
+
+    /*
+     * These may be mismatched because the terminal description relies on
+     * restoring the cursor visibility by resetting it.
+     */
+    ANDMISSING(cursor_invisible, cursor_normal);
+    ANDMISSING(cursor_visible, cursor_normal);
+
+    if (PRESENT(cursor_visible) && PRESENT(cursor_normal)
+	&& !_nc_capcmp(cursor_visible, cursor_normal))
+	_nc_warning("cursor_visible is same as cursor_normal");
+
+    /*
+     * From XSI & O'Reilly, we gather that sc/rc are required if csr is
+     * given, because the cursor position after the scrolling operation is
+     * performed is undefined.
+     */
+    ANDMISSING(change_scroll_region, save_cursor);
+    ANDMISSING(change_scroll_region, restore_cursor);
+
+    /*
+     * If we can clear tabs, we should be able to initialize them.
+     */
+    ANDMISSING(clear_all_tabs, set_tab);
+
+    if (PRESENT(set_attributes)) {
+	char *zero = 0;
+
+	_nc_tparm_err = 0;
+	if (PRESENT(exit_attribute_mode)) {
+	    zero = strdup(CHECK_SGR(0, exit_attribute_mode));
+	} else {
+	    zero = strdup(TIPARM_9(set_attributes, 0, 0, 0, 0, 0, 0, 0, 0, 0));
+	}
+	check_tparm_err(0);
+
+	if (zero != 0) {
+	    CHECK_SGR(1, enter_standout_mode);
+	    CHECK_SGR(2, enter_underline_mode);
+	    CHECK_SGR(3, enter_reverse_mode);
+	    CHECK_SGR(4, enter_blink_mode);
+	    CHECK_SGR(5, enter_dim_mode);
+	    CHECK_SGR(6, enter_bold_mode);
+	    CHECK_SGR(7, enter_secure_mode);
+	    CHECK_SGR(8, enter_protected_mode);
+	    CHECK_SGR(9, enter_alt_charset_mode);
+	    free(zero);
+	} else {
+	    _nc_warning("sgr(0) did not return a value");
+	}
+    } else if (PRESENT(exit_attribute_mode) &&
+	       set_attributes != CANCELLED_STRING) {
+	if (_nc_syntax == SYN_TERMINFO)
+	    _nc_warning("missing sgr string");
+    }
+#define CHECK_SGR0(name) check_exit_attribute(#name, name, check_sgr0, exit_attribute_mode)
+    if (PRESENT(exit_attribute_mode)) {
+	char *check_sgr0 = _nc_trim_sgr0(tp);
+
+	if (check_sgr0 == NULL || *check_sgr0 == '\0') {
+	    _nc_warning("trimmed sgr0 is empty");
+	} else {
+	    show_where(2);
+	    if (check_sgr0 != exit_attribute_mode) {
+		DEBUG(2,
+		      ("will trim sgr0\n\toriginal sgr0=%s\n\ttrimmed  sgr0=%s",
+		       _nc_visbuf2(1, exit_attribute_mode),
+		       _nc_visbuf2(2, check_sgr0)));
+	    } else {
+		DEBUG(2,
+		      ("will not trim sgr0\n\toriginal sgr0=%s",
+		       _nc_visbuf(exit_attribute_mode)));
+	    }
+	}
+#if defined(exit_italics_mode)
+	CHECK_SGR0(exit_italics_mode);
+#endif
+	CHECK_SGR0(exit_standout_mode);
+	CHECK_SGR0(exit_underline_mode);
+	if (check_sgr0 != exit_attribute_mode) {
+	    free(check_sgr0);
+	}
+    }
+#define CHECK_SGR_PARAM(code, name) check_sgr_param(tp, (int)code, #name, name)
+    for (j = 0; *sgr_names[j] != '\0'; ++j) {
+	CHECK_SGR_PARAM(j, set_a_foreground);
+	CHECK_SGR_PARAM(j, set_a_background);
+	CHECK_SGR_PARAM(j, set_foreground);
+	CHECK_SGR_PARAM(j, set_background);
+    }
+#ifdef TRACE
+    show_where(2);
+    if (!auto_right_margin) {
+	DEBUG(2,
+	      ("can write to lower-right directly"));
+    } else if (PRESENT(enter_am_mode) && PRESENT(exit_am_mode)) {
+	DEBUG(2,
+	      ("can write to lower-right by suppressing automargin"));
+    } else if ((PRESENT(enter_insert_mode) && PRESENT(exit_insert_mode))
+	       || PRESENT(insert_character) || PRESENT(parm_ich)) {
+	DEBUG(2,
+	      ("can write to lower-right by using inserts"));
+    } else {
+	DEBUG(2,
+	      ("cannot write to lower-right"));
+    }
+#endif
+
+    /*
+     * Some standard applications (e.g., vi) and some non-curses
+     * applications (e.g., jove) get confused if we have both ich1 and
+     * smir/rmir.  Let's be nice and warn about that, too, even though
+     * ncurses handles it.
+     */
+    if ((PRESENT(enter_insert_mode) || PRESENT(exit_insert_mode))
+	&& PRESENT(insert_character)) {
+	_nc_warning("non-curses applications may be confused by ich1 with smir/rmir");
+    }
+
+    /*
+     * Finally, do the non-verbose checks
+     */
+    if (save_check_termtype != 0)
+	save_check_termtype(tp, literal);
+}
diff --git a/progs/toe.c b/progs/toe.c
new file mode 100644
index 0000000..7599cfe
--- /dev/null
+++ b/progs/toe.c
@@ -0,0 +1,779 @@
+/****************************************************************************
+ * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2013,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ ****************************************************************************/
+
+/*
+ *	toe.c --- table of entries report generator
+ */
+
+#include <progs.priv.h>
+
+#include <sys/stat.h>
+
+#if USE_HASHED_DB
+#include <hashed_db.h>
+#endif
+
+MODULE_ID("$Id: toe.c,v 1.88 2022/09/03 23:29:32 tom Exp $")
+
+#define isDotname(name) (!strcmp(name, ".") || !strcmp(name, ".."))
+
+typedef struct {
+    int db_index;
+    unsigned long checksum;
+    char *term_name;
+    char *description;
+} TERMDATA;
+
+const char *_nc_progname;
+
+static TERMDATA *ptr_termdata;	/* array of terminal data */
+static size_t use_termdata;	/* actual usage in ptr_termdata[] */
+static size_t len_termdata;	/* allocated size of ptr_termdata[] */
+
+#if NO_LEAKS
+#undef ExitProgram
+static GCC_NORETURN void ExitProgram(int code);
+static void
+ExitProgram(int code)
+{
+    _nc_free_entries(_nc_head);
+    _nc_free_tic(code);
+}
+#endif
+
+static GCC_NORETURN void failed(const char *);
+
+static void
+failed(const char *msg)
+{
+    perror(msg);
+    ExitProgram(EXIT_FAILURE);
+}
+
+static char *
+strmalloc(const char *value)
+{
+    char *result = strdup(value);
+    if (result == 0) {
+	failed("strmalloc");
+    }
+    return result;
+}
+
+static TERMDATA *
+new_termdata(void)
+{
+    size_t want = use_termdata + 1;
+
+    if (want >= len_termdata) {
+	len_termdata = (2 * want) + 10;
+	ptr_termdata = typeRealloc(TERMDATA, len_termdata, ptr_termdata);
+	if (ptr_termdata == 0)
+	    failed("ptr_termdata");
+    }
+
+    return ptr_termdata + use_termdata++;
+}
+
+static int
+compare_termdata(const void *a, const void *b)
+{
+    const TERMDATA *p = (const TERMDATA *) a;
+    const TERMDATA *q = (const TERMDATA *) b;
+    int result = strcmp(p->term_name, q->term_name);
+
+    if (result == 0) {
+	result = (p->db_index - q->db_index);
+    }
+    return result;
+}
+
+/*
+ * Sort the array of TERMDATA and print it.  If more than one database is being
+ * reported, add a column to show which database has a given entry.
+ */
+static void
+show_termdata(int eargc, char **eargv)
+{
+    if (use_termdata) {
+	size_t n;
+
+	if (eargc > 1) {
+	    int j;
+
+	    for (j = 0; j < eargc; ++j) {
+		int k;
+
+		for (k = 0; k <= j; ++k) {
+		    printf("--");
+		}
+		printf("> ");
+		printf("%s\n", eargv[j]);
+	    }
+	}
+	if (use_termdata > 1)
+	    qsort(ptr_termdata, use_termdata, sizeof(TERMDATA), compare_termdata);
+	for (n = 0; n < use_termdata; ++n) {
+	    int nk = -1;
+
+	    /*
+	     * If there is more than one database, show how they differ.
+	     */
+	    if (eargc > 1) {
+		unsigned long check = 0;
+		int k = 0;
+		for (;;) {
+		    char mark = ((check == 0
+				  || (check != ptr_termdata[n].checksum))
+				 ? '*'
+				 : '+');
+
+		    for (; k < ptr_termdata[n].db_index; ++k) {
+			printf("--");
+		    }
+
+		    /*
+		     * If this is the first entry, or its checksum differs
+		     * from the first entry's checksum, print "*". Otherwise
+		     * it looks enough like a duplicate to print "+".
+		     */
+		    printf("%c-", mark);
+		    check = ptr_termdata[n].checksum;
+		    if (mark == '*' && nk < 0)
+			nk = (int) n;
+
+		    ++k;
+		    if ((n + 1) >= use_termdata
+			|| strcmp(ptr_termdata[n].term_name,
+				  ptr_termdata[n + 1].term_name)) {
+			break;
+		    }
+		    ++n;
+		}
+		for (; k < eargc; ++k) {
+		    printf("--");
+		}
+		printf(":\t");
+	    }
+	    if (nk < 0)
+		nk = (int) n;
+
+	    (void) printf("%-10s\t%s\n",
+			  ptr_termdata[n].term_name,
+			  ptr_termdata[nk].description);
+	}
+    }
+}
+
+static void
+free_termdata(void)
+{
+    if (ptr_termdata != 0) {
+	while (use_termdata != 0) {
+	    --use_termdata;
+	    free(ptr_termdata[use_termdata].term_name);
+	    free(ptr_termdata[use_termdata].description);
+	}
+	free(ptr_termdata);
+	ptr_termdata = 0;
+    }
+    use_termdata = 0;
+    len_termdata = 0;
+}
+
+static char **
+allocArgv(size_t count)
+{
+    char **result = typeCalloc(char *, count + 1);
+    if (result == 0)
+	failed("realloc eargv");
+
+    assert(result != 0);
+    return result;
+}
+
+static void
+freeArgv(char **argv)
+{
+    if (argv) {
+	int count = 0;
+	while (argv[count]) {
+	    free(argv[count++]);
+	}
+	free(argv);
+    }
+}
+
+#if USE_HASHED_DB
+static bool
+make_db_name(char *dst, const char *src, unsigned limit)
+{
+    static const char suffix[] = DBM_SUFFIX;
+
+    bool result = FALSE;
+    size_t lens = sizeof(suffix) - 1;
+    size_t size = strlen(src);
+    size_t need = lens + size;
+
+    if (need <= limit) {
+	if (size >= lens
+	    && !strcmp(src + size - lens, suffix)) {
+	    _nc_STRCPY(dst, src, PATH_MAX);
+	} else {
+	    _nc_SPRINTF(dst, _nc_SLIMIT(PATH_MAX) "%.*s%s",
+			(int) (PATH_MAX - sizeof(suffix)),
+			src, suffix);
+	}
+	result = TRUE;
+    }
+    return result;
+}
+#endif
+
+typedef void (DescHook) (int /* db_index */ ,
+			 int /* db_limit */ ,
+			 const char * /* term_name */ ,
+			 TERMTYPE2 * /* term */ );
+
+static const char *
+term_description(TERMTYPE2 *tp)
+{
+    const char *desc;
+
+    if (tp->term_names == 0
+	|| (desc = strrchr(tp->term_names, '|')) == 0
+	|| (*++desc == '\0')) {
+	desc = "(No description)";
+    }
+
+    return desc;
+}
+
+/* display a description for the type */
+static void
+deschook(int db_index, int db_limit, const char *term_name, TERMTYPE2 *tp)
+{
+    (void) db_index;
+    (void) db_limit;
+    (void) printf("%-10s\t%s\n", term_name, term_description(tp));
+}
+
+static unsigned long
+string_sum(const char *value)
+{
+    unsigned long result = 0;
+
+    if ((intptr_t) value == (intptr_t) (-1)) {
+	result = ~result;
+    } else if (value) {
+	while (*value) {
+	    result += UChar(*value);
+	    ++value;
+	}
+    }
+    return result;
+}
+
+static unsigned long
+checksum_of(TERMTYPE2 *tp)
+{
+    unsigned long result = string_sum(tp->term_names);
+    unsigned i;
+
+    for (i = 0; i < NUM_BOOLEANS(tp); i++) {
+	result += (unsigned long) (tp->Booleans[i]);
+    }
+    for (i = 0; i < NUM_NUMBERS(tp); i++) {
+	result += (unsigned long) (tp->Numbers[i]);
+    }
+    for (i = 0; i < NUM_STRINGS(tp); i++) {
+	result += string_sum(tp->Strings[i]);
+    }
+    return result;
+}
+
+/* collect data, to sort before display */
+static void
+sorthook(int db_index, int db_limit, const char *term_name, TERMTYPE2 *tp)
+{
+    TERMDATA *data = new_termdata();
+
+    data->db_index = db_index;
+    data->checksum = ((db_limit > 1) ? checksum_of(tp) : 0);
+    data->term_name = strmalloc(term_name);
+    data->description = strmalloc(term_description(tp));
+}
+
+#if NCURSES_USE_TERMCAP
+/*
+ * Check if the buffer contents are printable ASCII, ensuring that we do not
+ * accidentally pick up incompatible binary content from a hashed database.
+ */
+static bool
+is_termcap(char *buffer)
+{
+    bool result = TRUE;
+    while (*buffer != '\0') {
+	int ch = UChar(*buffer++);
+	if (ch == '\t')
+	    continue;
+	if (ch < ' ' || ch > '~') {
+	    result = FALSE;
+	    break;
+	}
+    }
+    return result;
+}
+
+static void
+show_termcap(int db_index, int db_limit, char *buffer, DescHook hook)
+{
+    TERMTYPE2 data;
+    char *next = strchr(buffer, ':');
+    char *last;
+    char *list = buffer;
+
+    if (next)
+	*next = '\0';
+
+    last = strrchr(buffer, '|');
+    if (last)
+	++last;
+
+    memset(&data, 0, sizeof(data));
+    data.term_names = strmalloc(buffer);
+    while ((next = strtok(list, "|")) != 0) {
+	if (next != last)
+	    hook(db_index, db_limit, next, &data);
+	list = 0;
+    }
+    free(data.term_names);
+}
+#endif
+
+#if NCURSES_USE_DATABASE
+static char *
+copy_entryname(DIRENT * src)
+{
+    size_t len = NAMLEN(src);
+    char *result = malloc(len + 1);
+    if (result == 0)
+	failed("copy entryname");
+    memcpy(result, src->d_name, len);
+    result[len] = '\0';
+
+    return result;
+}
+#endif
+
+static int
+typelist(int eargc, char *eargv[],
+	 int verbosity,
+	 DescHook hook)
+/* apply a function to each entry in given terminfo directories */
+{
+    int i;
+
+    for (i = 0; i < eargc; i++) {
+#if NCURSES_USE_DATABASE
+	if (_nc_is_dir_path(eargv[i])) {
+	    char *cwd_buf = 0;
+	    DIR *termdir;
+	    DIRENT *subdir;
+
+	    if ((termdir = opendir(eargv[i])) == 0) {
+		(void) fflush(stdout);
+		(void) fprintf(stderr,
+			       "%s: can't open terminfo directory %s\n",
+			       _nc_progname, eargv[i]);
+		continue;
+	    }
+
+	    if (verbosity)
+		(void) printf("#\n#%s:\n#\n", eargv[i]);
+
+	    while ((subdir = readdir(termdir)) != 0) {
+		size_t cwd_len;
+		char *name_1;
+		DIR *entrydir;
+		DIRENT *entry;
+
+		name_1 = copy_entryname(subdir);
+		if (isDotname(name_1)) {
+		    free(name_1);
+		    continue;
+		}
+
+		cwd_len = NAMLEN(subdir) + strlen(eargv[i]) + 3;
+		cwd_buf = typeRealloc(char, cwd_len, cwd_buf);
+		if (cwd_buf == 0)
+		    failed("realloc cwd_buf");
+
+		assert(cwd_buf != 0);
+
+		_nc_SPRINTF(cwd_buf, _nc_SLIMIT(cwd_len)
+			    "%s/%s/", eargv[i], name_1);
+		free(name_1);
+
+		if (chdir(cwd_buf) != 0)
+		    continue;
+
+		entrydir = opendir(".");
+		if (entrydir == 0) {
+		    perror(cwd_buf);
+		    continue;
+		}
+		while ((entry = readdir(entrydir)) != 0) {
+		    char *name_2;
+		    TERMTYPE2 lterm;
+		    char *cn;
+		    int status;
+
+		    name_2 = copy_entryname(entry);
+		    if (isDotname(name_2) || !_nc_is_file_path(name_2)) {
+			free(name_2);
+			continue;
+		    }
+
+		    status = _nc_read_file_entry(name_2, &lterm);
+		    if (status <= 0) {
+			(void) fflush(stdout);
+			(void) fprintf(stderr,
+				       "%s: couldn't open terminfo file %s.\n",
+				       _nc_progname, name_2);
+			free(name_2);
+			continue;
+		    }
+
+		    /* only visit things once, by primary name */
+		    cn = _nc_first_name(lterm.term_names);
+		    if (!strcmp(cn, name_2)) {
+			/* apply the selected hook function */
+			hook(i, eargc, cn, &lterm);
+		    }
+		    _nc_free_termtype2(&lterm);
+		    free(name_2);
+		}
+		closedir(entrydir);
+	    }
+	    closedir(termdir);
+	    if (cwd_buf != 0)
+		free(cwd_buf);
+	    continue;
+	}
+#if USE_HASHED_DB
+	else {
+	    DB *capdbp;
+	    char filename[PATH_MAX];
+
+	    if (verbosity)
+		(void) printf("#\n#%s:\n#\n", eargv[i]);
+
+	    if (make_db_name(filename, eargv[i], sizeof(filename))) {
+		if ((capdbp = _nc_db_open(filename, FALSE)) != 0) {
+		    DBT key, data;
+		    int code;
+
+		    code = _nc_db_first(capdbp, &key, &data);
+		    while (code == 0) {
+			TERMTYPE2 lterm;
+			int used;
+			char *have;
+			char *cn;
+
+			if (_nc_db_have_data(&key, &data, &have, &used)) {
+			    if (_nc_read_termtype(&lterm, have, used) > 0) {
+				/* only visit things once, by primary name */
+				cn = _nc_first_name(lterm.term_names);
+				/* apply the selected hook function */
+				hook(i, eargc, cn, &lterm);
+				_nc_free_termtype2(&lterm);
+			    }
+			}
+			code = _nc_db_next(capdbp, &key, &data);
+		    }
+
+		    _nc_db_close(capdbp);
+		    continue;
+		}
+	    }
+	}
+#endif /* USE_HASHED_DB */
+#endif /* NCURSES_USE_DATABASE */
+#if NCURSES_USE_TERMCAP
+#if HAVE_BSD_CGETENT
+	{
+	    CGETENT_CONST char *db_array[2];
+	    char *buffer = 0;
+
+	    if (verbosity)
+		(void) printf("#\n#%s:\n#\n", eargv[i]);
+
+	    db_array[0] = eargv[i];
+	    db_array[1] = 0;
+
+	    if (cgetfirst(&buffer, db_array) > 0) {
+		if (is_termcap(buffer)) {
+		    show_termcap(i, eargc, buffer, hook);
+		    free(buffer);
+		    while (cgetnext(&buffer, db_array) > 0) {
+			show_termcap(i, eargc, buffer, hook);
+			free(buffer);
+		    }
+		}
+		cgetclose();
+		continue;
+	    }
+	}
+#else
+	/* scan termcap text-file only */
+	if (_nc_is_file_path(eargv[i])) {
+	    char buffer[2048];
+	    FILE *fp;
+
+	    if (verbosity)
+		(void) printf("#\n#%s:\n#\n", eargv[i]);
+
+	    if ((fp = safe_fopen(eargv[i], "r")) != 0) {
+		while (fgets(buffer, sizeof(buffer), fp) != 0) {
+		    if (!is_termcap(buffer))
+			break;
+		    if (*buffer == '#')
+			continue;
+		    if (isspace(*buffer))
+			continue;
+		    show_termcap(i, eargc, buffer, hook);
+		}
+		fclose(fp);
+	    }
+	}
+#endif
+#endif
+    }
+
+    if (hook == sorthook) {
+	show_termdata(eargc, eargv);
+	free_termdata();
+    }
+
+    return (EXIT_SUCCESS);
+}
+
+static void
+usage(void)
+{
+    (void) fprintf(stderr, "usage: %s [-ahsuUV] [-v n] [file...]\n", _nc_progname);
+    ExitProgram(EXIT_FAILURE);
+}
+
+int
+main(int argc, char *argv[])
+{
+    bool all_dirs = FALSE;
+    bool direct_dependencies = FALSE;
+    bool invert_dependencies = FALSE;
+    bool header = FALSE;
+    char *report_file = 0;
+    int code;
+    int this_opt, last_opt = '?';
+    unsigned v_opt = 0;
+    DescHook *hook = deschook;
+
+    _nc_progname = _nc_rootname(argv[0]);
+
+    while ((this_opt = getopt(argc, argv, "0123456789ahsu:vU:V")) != -1) {
+	/* handle optional parameter */
+	if (isdigit(this_opt)) {
+	    switch (last_opt) {
+	    case 'v':
+		v_opt = (unsigned) (this_opt - '0');
+		break;
+	    default:
+		if (isdigit(last_opt))
+		    v_opt *= 10;
+		else
+		    v_opt = 0;
+		v_opt += (unsigned) (this_opt - '0');
+		last_opt = this_opt;
+	    }
+	    continue;
+	}
+	switch (this_opt) {
+	case 'a':
+	    all_dirs = TRUE;
+	    break;
+	case 'h':
+	    header = TRUE;
+	    break;
+	case 's':
+	    hook = sorthook;
+	    break;
+	case 'u':
+	    direct_dependencies = TRUE;
+	    report_file = optarg;
+	    break;
+	case 'v':
+	    v_opt = 1;
+	    break;
+	case 'U':
+	    invert_dependencies = TRUE;
+	    report_file = optarg;
+	    break;
+	case 'V':
+	    puts(curses_version());
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage();
+	}
+    }
+    use_verbosity(v_opt);
+
+    if (report_file != 0) {
+	if (freopen(report_file, "r", stdin) == 0) {
+	    (void) fflush(stdout);
+	    fprintf(stderr, "%s: can't open %s\n", _nc_progname, report_file);
+	    ExitProgram(EXIT_FAILURE);
+	}
+
+	/* parse entries out of the source file */
+	_nc_set_source(report_file);
+	_nc_read_entry_source(stdin, 0, FALSE, FALSE, NULLHOOK);
+    }
+
+    /* maybe we want a direct-dependency listing? */
+    if (direct_dependencies) {
+	ENTRY *qp;
+
+	for_entry_list(qp) {
+	    if (qp->nuses) {
+		unsigned j;
+
+		(void) printf("%s:", _nc_first_name(qp->tterm.term_names));
+		for (j = 0; j < qp->nuses; j++)
+		    (void) printf(" %s", qp->uses[j].name);
+		putchar('\n');
+	    }
+	}
+
+	ExitProgram(EXIT_SUCCESS);
+    }
+
+    /* maybe we want a reverse-dependency listing? */
+    if (invert_dependencies) {
+	ENTRY *qp, *rp;
+
+	for_entry_list(qp) {
+	    int matchcount = 0;
+
+	    for_entry_list(rp) {
+		unsigned i;
+
+		if (rp->nuses == 0)
+		    continue;
+
+		for (i = 0; i < rp->nuses; i++)
+		    if (_nc_name_match(qp->tterm.term_names,
+				       rp->uses[i].name, "|")) {
+			if (matchcount++ == 0)
+			    (void) printf("%s:",
+					  _nc_first_name(qp->tterm.term_names));
+			(void) printf(" %s",
+				      _nc_first_name(rp->tterm.term_names));
+		    }
+	    }
+	    if (matchcount)
+		putchar('\n');
+	}
+
+	ExitProgram(EXIT_SUCCESS);
+    }
+
+    /*
+     * If we get this far, user wants a simple terminal type listing.
+     */
+    if (optind < argc) {
+	code = typelist(argc - optind, argv + optind, header, hook);
+    } else if (all_dirs) {
+	DBDIRS state;
+	int offset;
+	int pass;
+	char **eargv = 0;
+
+	code = EXIT_FAILURE;
+	for (pass = 0; pass < 2; ++pass) {
+	    size_t count = 0;
+	    const char *path;
+
+	    _nc_first_db(&state, &offset);
+	    while ((path = _nc_next_db(&state, &offset)) != 0) {
+		if (quick_prefix(path))
+		    continue;
+		if (pass) {
+		    eargv[count] = strmalloc(path);
+		}
+		++count;
+	    }
+	    if (!pass) {
+		eargv = allocArgv(count);
+		if (eargv == 0)
+		    failed("eargv");
+	    } else {
+		code = typelist((int) count, eargv, header, hook);
+		freeArgv(eargv);
+	    }
+	}
+    } else {
+	DBDIRS state;
+	int offset;
+	const char *path;
+	char **eargv = allocArgv((size_t) 2);
+	size_t count = 0;
+
+	if (eargv == 0)
+	    failed("eargv");
+	_nc_first_db(&state, &offset);
+	if ((path = _nc_next_db(&state, &offset)) != 0) {
+	    if (!quick_prefix(path))
+		eargv[count++] = strmalloc(path);
+	}
+
+	code = typelist((int) count, eargv, header, hook);
+
+	freeArgv(eargv);
+    }
+    _nc_last_db();
+
+    ExitProgram(code);
+}
diff --git a/progs/tparm_type.c b/progs/tparm_type.c
new file mode 100644
index 0000000..3da4a07
--- /dev/null
+++ b/progs/tparm_type.c
@@ -0,0 +1,100 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 2014,2015 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                                                *
+ ****************************************************************************/
+
+#include <tparm_type.h>
+
+MODULE_ID("$Id: tparm_type.c,v 1.4 2020/10/24 17:30:32 tom Exp $")
+
+/*
+ * Lookup the type of call we should make to tparm().  This ignores the actual
+ * terminfo capability (bad, because it is not extensible), but makes this
+ * code portable to platforms where sizeof(int) != sizeof(char *).
+ */
+TParams
+tparm_type(const char *name)
+{
+#define TD(code, longname, ti, tc) \
+    	{code, {longname} }, \
+	{code, {ti} }, \
+	{code, {tc} }
+    TParams result = Numbers;
+    /* *INDENT-OFF* */
+    static const struct {
+	TParams code;
+	const char name[12];
+    } table[] = {
+	TD(Num_Str,	"pkey_key",	"pfkey",	"pk"),
+	TD(Num_Str,	"pkey_local",	"pfloc",	"pl"),
+	TD(Num_Str,	"pkey_xmit",	"pfx",		"px"),
+	TD(Num_Str,	"plab_norm",	"pln",		"pn"),
+	TD(Num_Str_Str, "pkey_plab",	"pfxl",		"xl"),
+    };
+    /* *INDENT-ON* */
+
+    unsigned n;
+    for (n = 0; n < SIZEOF(table); n++) {
+	if (!strcmp(name, table[n].name)) {
+	    result = table[n].code;
+	    break;
+	}
+    }
+    return result;
+}
+
+TParams
+guess_tparm_type(int nparam, char **p_is_s)
+{
+    TParams result = Other;
+    switch (nparam) {
+    case 0:
+    case 1:
+	if (!p_is_s[0])
+	    result = Numbers;
+	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;
+	break;
+    case 3:
+	if (!p_is_s[0] && !p_is_s[1] && !p_is_s[2])
+	    result = Numbers;
+	if (!p_is_s[0] && p_is_s[1] && p_is_s[2])
+	    result = Num_Str_Str;
+	break;
+    default:
+	break;
+    }
+    return result;
+}
diff --git a/progs/tparm_type.h b/progs/tparm_type.h
new file mode 100644
index 0000000..7c102a3
--- /dev/null
+++ b/progs/tparm_type.h
@@ -0,0 +1,55 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 2014 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                                                *
+ ****************************************************************************/
+
+/*
+ * $Id: tparm_type.h,v 1.3 2020/10/24 17:11:33 tom Exp $
+ *
+ * determine expected/actual number of parameters to setup for tparm
+ */
+#ifndef TPARM_TYPE_H
+#define TPARM_TYPE_H 1
+
+#define USE_LIBTINFO
+#include <progs.priv.h>
+
+typedef enum {
+    Other = -1
+    ,Numbers = 0
+    ,Num_Str
+    ,Num_Str_Str
+} TParams;
+
+extern TParams tparm_type(const char *name);
+extern TParams guess_tparm_type(int nparam, char **p_is_s);
+
+#endif /* TPARM_TYPE_H */
diff --git a/progs/tput.c b/progs/tput.c
new file mode 100644
index 0000000..4cd0c5b
--- /dev/null
+++ b/progs/tput.c
@@ -0,0 +1,455 @@
+/****************************************************************************
+ * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ ****************************************************************************/
+
+/*
+ * tput.c -- shellscript access to terminal capabilities
+ *
+ * by Eric S. Raymond <esr@snark.thyrsus.com>, portions based on code from
+ * Ross Ridge's mytinfo package.
+ */
+
+#include <tparm_type.h>
+#include <clear_cmd.h>
+#include <reset_cmd.h>
+
+#include <transform.h>
+#include <tty_settings.h>
+
+MODULE_ID("$Id: tput.c,v 1.99 2022/02/26 23:19:31 tom Exp $")
+
+#define PUTS(s)		fputs(s, stdout)
+
+const char *_nc_progname = "tput";
+
+static bool is_init = FALSE;
+static bool is_reset = FALSE;
+static bool is_clear = FALSE;
+
+static GCC_NORETURN void
+quit(int status, const char *fmt, ...)
+{
+    va_list argp;
+
+    va_start(argp, fmt);
+    fprintf(stderr, "%s: ", _nc_progname);
+    vfprintf(stderr, fmt, argp);
+    fprintf(stderr, "\n");
+    va_end(argp);
+    ExitProgram(status);
+}
+
+static GCC_NORETURN void
+usage(const char *optstring)
+{
+#define KEEP(s) s "\n"
+    static const char msg[] =
+    {
+	KEEP("")
+	KEEP("Options:")
+	KEEP("  -S <<       read commands from standard input")
+	KEEP("  -T TERM     use this instead of $TERM")
+	KEEP("  -V          print curses-version")
+	KEEP("  -x          do not try to clear scrollback")
+	KEEP("")
+	KEEP("Commands:")
+	KEEP("  clear       clear the screen")
+	KEEP("  init        initialize the terminal")
+	KEEP("  reset       reinitialize the terminal")
+	KEEP("  capname     unlike clear/init/reset, print value for capability \"capname\"")
+    };
+#undef KEEP
+    (void) fprintf(stderr, "Usage: %s [options] [command]\n", _nc_progname);
+    if (optstring != NULL) {
+	const char *s = msg;
+	while (*s != '\0') {
+	    fputc(UChar(*s), stderr);
+	    if (!strncmp(s, "  -", 3)) {
+		if (strchr(optstring, s[3]) == NULL)
+		    s = strchr(s, '\n') + 1;
+	    } else if (!strncmp(s, "\n\nC", 3))
+		break;
+	    ++s;
+	}
+    } else {
+	fputs(msg, stderr);
+    }
+    ExitProgram(ErrUsage);
+}
+
+static char *
+check_aliases(char *name, bool program)
+{
+    static char my_init[] = "init";
+    static char my_reset[] = "reset";
+    static char my_clear[] = "clear";
+
+    char *result = name;
+    if ((is_init = same_program(name, program ? PROG_INIT : my_init)))
+	result = my_init;
+    if ((is_reset = same_program(name, program ? PROG_RESET : my_reset)))
+	result = my_reset;
+    if ((is_clear = same_program(name, program ? PROG_CLEAR : my_clear)))
+	result = my_clear;
+    return result;
+}
+
+static int
+exit_code(int token, int value)
+{
+    int result = 99;
+
+    switch (token) {
+    case BOOLEAN:
+	result = !value;	/* TRUE=0, FALSE=1 */
+	break;
+    case NUMBER:
+	result = 0;		/* always zero */
+	break;
+    case STRING:
+	result = value;		/* 0=normal, 1=missing */
+	break;
+    }
+    return result;
+}
+
+/*
+ * Returns nonzero on error.
+ */
+static int
+tput_cmd(int fd, TTY * settings, bool opt_x, int argc, char **argv, int *used)
+{
+    NCURSES_CONST char *name;
+    char *s;
+    int status;
+#if !PURE_TERMINFO
+    bool termcap = FALSE;
+#endif
+
+    name = check_aliases(argv[0], FALSE);
+    *used = 1;
+    if (is_reset || is_init) {
+	TTY oldmode = *settings;
+
+	int terasechar = -1;	/* new erase character */
+	int intrchar = -1;	/* new interrupt character */
+	int tkillchar = -1;	/* new kill character */
+
+	if (is_reset) {
+	    reset_start(stdout, TRUE, FALSE);
+	    reset_tty_settings(fd, settings, FALSE);
+	} else {
+	    reset_start(stdout, FALSE, TRUE);
+	}
+
+#if HAVE_SIZECHANGE
+	set_window_size(fd, &lines, &columns);
+#else
+	(void) fd;
+#endif
+	set_control_chars(settings, terasechar, intrchar, tkillchar);
+	set_conversions(settings);
+
+	if (send_init_strings(fd, &oldmode)) {
+	    reset_flush();
+	}
+
+	update_tty_settings(&oldmode, settings);
+	return 0;
+    }
+
+    if (strcmp(name, "longname") == 0) {
+	PUTS(longname());
+	return 0;
+    }
+#if !PURE_TERMINFO
+  retry:
+#endif
+    if (strcmp(name, "clear") == 0) {
+	return (clear_cmd(opt_x) == ERR) ? ErrUsage : 0;
+    } else if ((status = tigetflag(name)) != -1) {
+	return exit_code(BOOLEAN, status);
+    } else if ((status = tigetnum(name)) != CANCELLED_NUMERIC) {
+	(void) printf("%d\n", status);
+	return exit_code(NUMBER, 0);
+    } else if ((s = tigetstr(name)) == CANCELLED_STRING) {
+#if !PURE_TERMINFO
+	if (!termcap) {
+	    const struct name_table_entry *np;
+
+	    termcap = TRUE;
+	    if ((np = _nc_find_entry(name, _nc_get_hash_table(termcap))) != 0) {
+		switch (np->nte_type) {
+		case BOOLEAN:
+		    name = boolnames[np->nte_index];
+		    break;
+
+		case NUMBER:
+		    name = numnames[np->nte_index];
+		    break;
+
+		case STRING:
+		    name = strnames[np->nte_index];
+		    break;
+		}
+		goto retry;
+	    }
+	}
+#endif
+	quit(ErrCapName, "unknown terminfo capability '%s'", name);
+    } else if (VALID_STRING(s)) {
+	if (argc > 1) {
+	    int k;
+	    int analyzed;
+	    int popcount;
+	    long numbers[1 + NUM_PARM];
+	    char *strings[1 + NUM_PARM];
+	    char *p_is_s[NUM_PARM];
+	    TParams paramType;
+
+	    /* Nasty hack time. The tparm function needs to see numeric
+	     * parameters as numbers, not as pointers to their string
+	     * representations
+	     */
+
+	    for (k = 1; (k < argc) && (k <= NUM_PARM); k++) {
+		char *tmp = 0;
+		strings[k] = argv[k];
+		numbers[k] = strtol(argv[k], &tmp, 0);
+		if (tmp == 0 || *tmp != 0)
+		    numbers[k] = 0;
+	    }
+	    for (k = argc; k <= NUM_PARM; k++) {
+		numbers[k] = 0;
+		strings[k] = 0;
+	    }
+
+	    paramType = tparm_type(name);
+#if NCURSES_XNAMES
+	    /*
+	     * If the capability is an extended one, analyze the string.
+	     */
+	    if (paramType == Numbers) {
+		struct name_table_entry const *entry_ptr;
+		entry_ptr = _nc_find_type_entry(name, STRING, FALSE);
+		if (entry_ptr == NULL) {
+		    paramType = Other;
+		}
+	    }
+#endif
+
+	    popcount = 0;
+	    _nc_reset_tparm(NULL);
+	    switch (paramType) {
+	    case Num_Str:
+		s = TPARM_2(s, numbers[1], strings[2]);
+		analyzed = 2;
+		break;
+	    case Num_Str_Str:
+		s = TPARM_3(s, numbers[1], strings[2], strings[3]);
+		analyzed = 3;
+		break;
+	    case Numbers:
+		analyzed = _nc_tparm_analyze(NULL, s, p_is_s, &popcount);
+#define myParam(n) numbers[n]
+		s = TIPARM_9(s,
+			     myParam(1),
+			     myParam(2),
+			     myParam(3),
+			     myParam(4),
+			     myParam(5),
+			     myParam(6),
+			     myParam(7),
+			     myParam(8),
+			     myParam(9));
+#undef myParam
+		break;
+	    case Other:
+		/* FALLTHRU */
+	    default:
+		analyzed = _nc_tparm_analyze(NULL, s, p_is_s, &popcount);
+#define myParam(n) (p_is_s[n - 1] != 0 ? ((TPARM_ARG) strings[n]) : numbers[n])
+		s = TPARM_9(s,
+			    myParam(1),
+			    myParam(2),
+			    myParam(3),
+			    myParam(4),
+			    myParam(5),
+			    myParam(6),
+			    myParam(7),
+			    myParam(8),
+			    myParam(9));
+#undef myParam
+		break;
+	    }
+	    if (analyzed < popcount) {
+		analyzed = popcount;
+	    }
+	    *used += analyzed;
+	}
+
+	/* use putp() in order to perform padding */
+	putp(s);
+	return exit_code(STRING, 0);
+    }
+    return exit_code(STRING, 1);
+}
+
+int
+main(int argc, char **argv)
+{
+    char *term;
+    int errret;
+    bool cmdline = TRUE;
+    int c;
+    char buf[BUFSIZ];
+    int result = 0;
+    int fd;
+    int used;
+    TTY old_settings;
+    TTY tty_settings;
+    bool opt_x = FALSE;		/* clear scrollback if possible */
+    bool is_alias;
+    bool need_tty;
+
+    _nc_progname = check_aliases(_nc_rootname(argv[0]), TRUE);
+    is_alias = (is_clear || is_reset || is_init);
+
+    term = getenv("TERM");
+
+    while ((c = getopt(argc, argv, is_alias ? "T:Vx" : "ST:Vx")) != -1) {
+	switch (c) {
+	case 'S':
+	    cmdline = FALSE;
+	    break;
+	case 'T':
+	    use_env(FALSE);
+	    use_tioctl(TRUE);
+	    term = optarg;
+	    break;
+	case 'V':
+	    puts(curses_version());
+	    ExitProgram(EXIT_SUCCESS);
+	case 'x':		/* do not try to clear scrollback */
+	    opt_x = TRUE;
+	    break;
+	default:
+	    usage(is_alias ? "TVx" : NULL);
+	    /* NOTREACHED */
+	}
+    }
+
+    need_tty = ((is_reset || is_init) ||
+		(optind < argc &&
+		 (!strcmp(argv[optind], "reset") ||
+		  !strcmp(argv[optind], "init"))));
+
+    /*
+     * Modify the argument list to omit the options we processed.
+     */
+    if (is_alias) {
+	if (optind-- < argc) {
+	    argc -= optind;
+	    argv += optind;
+	}
+	argv[0] = strdup(_nc_progname);
+    } else {
+	argc -= optind;
+	argv += optind;
+    }
+
+    if (term == 0 || *term == '\0')
+	quit(ErrUsage, "No value for $TERM and no -T specified");
+
+    fd = save_tty_settings(&tty_settings, need_tty);
+    old_settings = tty_settings;
+
+    if (setupterm(term, fd, &errret) != OK && errret <= 0)
+	quit(ErrTermType, "unknown terminal \"%s\"", term);
+
+    if (cmdline) {
+	int code = 0;
+	if ((argc <= 0) && !is_alias)
+	    usage(NULL);
+	while (argc > 0) {
+	    tty_settings = old_settings;
+	    code = tput_cmd(fd, &tty_settings, opt_x, argc, argv, &used);
+	    if (code != 0)
+		break;
+	    argc -= used;
+	    argv += used;
+	}
+	ExitProgram(code);
+    }
+
+    while (fgets(buf, sizeof(buf), stdin) != 0) {
+	size_t need = strlen(buf);
+	char **argvec = typeCalloc(char *, need + 1);
+	char **argnow;
+	int argnum = 0;
+	char *cp;
+
+	if (argvec == NULL) {
+	    quit(ErrSystem(1), strerror(errno));
+	}
+
+	/* split the buffer into tokens */
+	for (cp = buf; *cp; cp++) {
+	    if (isspace(UChar(*cp))) {
+		*cp = '\0';
+	    } else if (cp == buf || cp[-1] == '\0') {
+		argvec[argnum++] = cp;
+		if (argnum >= (int) need)
+		    break;
+	    }
+	}
+
+	argnow = argvec;
+	while (argnum > 0) {
+	    int code;
+	    tty_settings = old_settings;
+	    code = tput_cmd(fd, &tty_settings, opt_x, argnum, argnow, &used);
+	    if (code != 0) {
+		if (result == 0)
+		    result = ErrSystem(0);	/* will return value >4 */
+		++result;
+	    }
+	    argnum -= used;
+	    argnow += used;
+	}
+	free(argvec);
+    }
+
+    ExitProgram(result);
+}
diff --git a/progs/transform.c b/progs/transform.c
new file mode 100644
index 0000000..67caf2d
--- /dev/null
+++ b/progs/transform.c
@@ -0,0 +1,80 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 2009-2010,2011 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                                                *
+ ****************************************************************************/
+#include <progs.priv.h>
+#include <string.h>
+
+#include <transform.h>
+
+MODULE_ID("$Id: transform.c,v 1.4 2020/02/02 23:34:34 tom Exp $")
+
+#ifdef SUFFIX_IGNORED
+static void
+trim_suffix(const char *a, size_t *len)
+{
+    const char ignore[] = SUFFIX_IGNORED;
+
+    if (sizeof(ignore) != 0) {
+	bool trim = FALSE;
+	size_t need = (sizeof(ignore) - 1);
+
+	if (*len > need) {
+	    size_t first = *len - need;
+	    size_t n;
+	    trim = TRUE;
+	    for (n = first; n < *len; ++n) {
+		if (tolower(UChar(a[n])) != tolower(UChar(ignore[n - first]))) {
+		    trim = FALSE;
+		    break;
+		}
+	    }
+	    if (trim) {
+		*len -= need;
+	    }
+	}
+    }
+}
+#else
+#define trim_suffix(a, len)	/* nothing */
+#endif
+
+bool
+same_program(const char *a, const char *b)
+{
+    size_t len_a = strlen(a);
+    size_t len_b = strlen(b);
+
+    trim_suffix(a, &len_a);
+    trim_suffix(b, &len_b);
+
+    return (len_a == len_b) && (strncmp(a, b, len_a) == 0);
+}
diff --git a/progs/tset.c b/progs/tset.c
new file mode 100644
index 0000000..0ba522c
--- /dev/null
+++ b/progs/tset.c
@@ -0,0 +1,913 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
+ *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ ****************************************************************************/
+
+/*
+ * Notes:
+ * The initial adaptation from 4.4BSD Lite sources in September 1995 used 686
+ * lines from that version, and made changes/additions for 150 lines.  There
+ * was no reformatting, so with/without ignoring whitespace, the amount of
+ * change is the same.
+ *
+ * Comparing with current (2009) source, excluding this comment:
+ * a) 209 lines match identically to the 4.4BSD Lite sources, with 771 lines
+ *    changed/added.
+ * a) Ignoring whitespace, the current version still uses 516 lines from the
+ *    4.4BSD Lite sources, with 402 lines changed/added.
+ *
+ * Raymond's original comment on this follows...
+ */
+
+/*
+ * tset.c - terminal initialization utility
+ *
+ * This code was mostly swiped from 4.4BSD tset, with some obsolescent
+ * cruft removed and substantial portions rewritten.  A Regents of the
+ * University of California copyright applies to some portions of the
+ * code, and is reproduced below:
+ */
+/*-
+ * Copyright (c) 1980, 1991, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <reset_cmd.h>
+#include <termcap.h>
+#include <transform.h>
+#include <tty_settings.h>
+
+#if HAVE_GETTTYNAM
+#include <ttyent.h>
+#endif
+#ifdef NeXT
+char *ttyname(int fd);
+#endif
+
+MODULE_ID("$Id: tset.c,v 1.131 2021/12/04 23:02:13 tom Exp $")
+
+#ifndef environ
+extern char **environ;
+#endif
+
+const char *_nc_progname = "tset";
+
+#define LOWERCASE(c) ((isalpha(UChar(c)) && isupper(UChar(c))) ? tolower(UChar(c)) : (c))
+
+static GCC_NORETURN void exit_error(void);
+
+static int
+CaselessCmp(const char *a, const char *b)
+{				/* strcasecmp isn't portable */
+    while (*a && *b) {
+	int cmp = LOWERCASE(*a) - LOWERCASE(*b);
+	if (cmp != 0)
+	    break;
+	a++, b++;
+    }
+    return LOWERCASE(*a) - LOWERCASE(*b);
+}
+
+static GCC_NORETURN void
+exit_error(void)
+{
+    restore_tty_settings();
+    (void) fprintf(stderr, "\n");
+    fflush(stderr);
+    ExitProgram(EXIT_FAILURE);
+    /* NOTREACHED */
+}
+
+static GCC_NORETURN void
+err(const char *fmt, ...)
+{
+    va_list ap;
+    va_start(ap, fmt);
+    (void) fprintf(stderr, "%s: ", _nc_progname);
+    (void) vfprintf(stderr, fmt, ap);
+    va_end(ap);
+    exit_error();
+    /* NOTREACHED */
+}
+
+static GCC_NORETURN void
+failed(const char *msg)
+{
+    char temp[BUFSIZ];
+    size_t len = strlen(_nc_progname) + 2;
+
+    if ((int) len < (int) sizeof(temp) - 12) {
+	_nc_STRCPY(temp, _nc_progname, sizeof(temp));
+	_nc_STRCAT(temp, ": ", sizeof(temp));
+    } else {
+	_nc_STRCPY(temp, "tset: ", sizeof(temp));
+    }
+    _nc_STRNCAT(temp, msg, sizeof(temp), sizeof(temp) - strlen(temp) - 2);
+    perror(temp);
+    exit_error();
+    /* NOTREACHED */
+}
+
+/* Prompt the user for a terminal type. */
+static const char *
+askuser(const char *dflt)
+{
+    static char answer[256];
+
+    /* We can get recalled; if so, don't continue uselessly. */
+    clearerr(stdin);
+    if (feof(stdin) || ferror(stdin)) {
+	(void) fprintf(stderr, "\n");
+	exit_error();
+	/* NOTREACHED */
+    }
+
+    for (;;) {
+	char *p;
+
+	if (dflt)
+	    (void) fprintf(stderr, "Terminal type? [%s] ", dflt);
+	else
+	    (void) fprintf(stderr, "Terminal type? ");
+	(void) fflush(stderr);
+
+	if (fgets(answer, sizeof(answer), stdin) == 0) {
+	    if (dflt == 0) {
+		exit_error();
+		/* NOTREACHED */
+	    }
+	    return (dflt);
+	}
+
+	if ((p = strchr(answer, '\n')) != 0)
+	    *p = '\0';
+	if (answer[0])
+	    return (answer);
+	if (dflt != 0)
+	    return (dflt);
+    }
+}
+
+/**************************************************************************
+ *
+ * Mapping logic begins here
+ *
+ **************************************************************************/
+
+/* Baud rate conditionals for mapping. */
+#define	GT		0x01
+#define	EQ		0x02
+#define	LT		0x04
+#define	NOT		0x08
+#define	GE		(GT | EQ)
+#define	LE		(LT | EQ)
+
+typedef struct map {
+    struct map *next;		/* Linked list of maps. */
+    const char *porttype;	/* Port type, or "" for any. */
+    const char *type;		/* Terminal type to select. */
+    int conditional;		/* Baud rate conditionals bitmask. */
+    int speed;			/* Baud rate to compare against. */
+} MAP;
+
+static MAP *cur, *maplist;
+
+#define DATA(name,value) { { name }, value }
+
+typedef struct speeds {
+    const char string[8];
+    int speed;
+} SPEEDS;
+
+#if defined(EXP_WIN32_DRIVER)
+static const SPEEDS speeds[] =
+{
+    {"0", 0}
+};
+#else
+static const SPEEDS speeds[] =
+{
+    DATA("0", B0),
+    DATA("50", B50),
+    DATA("75", B75),
+    DATA("110", B110),
+    DATA("134", B134),
+    DATA("134.5", B134),
+    DATA("150", B150),
+    DATA("200", B200),
+    DATA("300", B300),
+    DATA("600", B600),
+    DATA("1200", B1200),
+    DATA("1800", B1800),
+    DATA("2400", B2400),
+    DATA("4800", B4800),
+    DATA("9600", B9600),
+    /* sgttyb may define up to this point */
+#ifdef B19200
+    DATA("19200", B19200),
+#endif
+#ifdef B38400
+    DATA("38400", B38400),
+#endif
+#ifdef B19200
+    DATA("19200", B19200),
+#endif
+#ifdef B38400
+    DATA("38400", B38400),
+#endif
+#ifdef B19200
+    DATA("19200", B19200),
+#else
+#ifdef EXTA
+    DATA("19200", EXTA),
+#endif
+#endif
+#ifdef B38400
+    DATA("38400", B38400),
+#else
+#ifdef EXTB
+    DATA("38400", EXTB),
+#endif
+#endif
+#ifdef B57600
+    DATA("57600", B57600),
+#endif
+#ifdef B76800
+    DATA("76800", B57600),
+#endif
+#ifdef B115200
+    DATA("115200", B115200),
+#endif
+#ifdef B153600
+    DATA("153600", B153600),
+#endif
+#ifdef B230400
+    DATA("230400", B230400),
+#endif
+#ifdef B307200
+    DATA("307200", B307200),
+#endif
+#ifdef B460800
+    DATA("460800", B460800),
+#endif
+#ifdef B500000
+    DATA("500000", B500000),
+#endif
+#ifdef B576000
+    DATA("576000", B576000),
+#endif
+#ifdef B921600
+    DATA("921600", B921600),
+#endif
+#ifdef B1000000
+    DATA("1000000", B1000000),
+#endif
+#ifdef B1152000
+    DATA("1152000", B1152000),
+#endif
+#ifdef B1500000
+    DATA("1500000", B1500000),
+#endif
+#ifdef B2000000
+    DATA("2000000", B2000000),
+#endif
+#ifdef B2500000
+    DATA("2500000", B2500000),
+#endif
+#ifdef B3000000
+    DATA("3000000", B3000000),
+#endif
+#ifdef B3500000
+    DATA("3500000", B3500000),
+#endif
+#ifdef B4000000
+    DATA("4000000", B4000000),
+#endif
+};
+#undef DATA
+#endif
+
+static int
+tbaudrate(char *rate)
+{
+    const SPEEDS *sp = 0;
+    size_t n;
+
+    /* The baudrate number can be preceded by a 'B', which is ignored. */
+    if (*rate == 'B')
+	++rate;
+
+    for (n = 0; n < SIZEOF(speeds); ++n) {
+	if (n > 0 && (speeds[n].speed <= speeds[n - 1].speed)) {
+	    /* if the speeds are not increasing, likely a numeric overflow */
+	    break;
+	}
+	if (!CaselessCmp(rate, speeds[n].string)) {
+	    sp = speeds + n;
+	    break;
+	}
+    }
+    if (sp == 0)
+	err("unknown baud rate %s", rate);
+    return (sp->speed);
+}
+
+/*
+ * Syntax for -m:
+ * [port-type][test baudrate]:terminal-type
+ * The baud rate tests are: >, <, @, =, !
+ */
+static void
+add_mapping(const char *port, char *arg)
+{
+    MAP *mapp;
+    char *copy, *p;
+    const char *termp;
+    char *base = 0;
+
+    copy = strdup(arg);
+    mapp = typeMalloc(MAP, 1);
+    if (copy == 0 || mapp == 0)
+	failed("malloc");
+
+    assert(copy != 0);
+    assert(mapp != 0);
+
+    mapp->next = 0;
+    if (maplist == 0)
+	cur = maplist = mapp;
+    else {
+	cur->next = mapp;
+	cur = mapp;
+    }
+
+    mapp->porttype = arg;
+    mapp->conditional = 0;
+
+    arg = strpbrk(arg, "><@=!:");
+
+    if (arg == 0) {		/* [?]term */
+	mapp->type = mapp->porttype;
+	mapp->porttype = 0;
+	goto done;
+    }
+
+    if (arg == mapp->porttype)	/* [><@=! baud]:term */
+	termp = mapp->porttype = 0;
+    else
+	termp = base = arg;
+
+    for (;; ++arg) {		/* Optional conditionals. */
+	switch (*arg) {
+	case '<':
+	    if (mapp->conditional & GT)
+		goto badmopt;
+	    mapp->conditional |= LT;
+	    break;
+	case '>':
+	    if (mapp->conditional & LT)
+		goto badmopt;
+	    mapp->conditional |= GT;
+	    break;
+	case '@':
+	case '=':		/* Not documented. */
+	    mapp->conditional |= EQ;
+	    break;
+	case '!':
+	    mapp->conditional |= NOT;
+	    break;
+	default:
+	    goto next;
+	}
+    }
+
+  next:
+    if (*arg == ':') {
+	if (mapp->conditional)
+	    goto badmopt;
+	++arg;
+    } else {			/* Optional baudrate. */
+	arg = strchr(p = arg, ':');
+	if (arg == 0)
+	    goto badmopt;
+	*arg++ = '\0';
+	mapp->speed = tbaudrate(p);
+    }
+
+    mapp->type = arg;
+
+    /* Terminate porttype, if specified. */
+    if (termp != 0)
+	*base = '\0';
+
+    /* If a NOT conditional, reverse the test. */
+    if (mapp->conditional & NOT)
+	mapp->conditional = ~mapp->conditional & (EQ | GT | LT);
+
+    /* If user specified a port with an option flag, set it. */
+  done:
+    if (port) {
+	if (mapp->porttype) {
+	  badmopt:
+	    err("illegal -m option format: %s", copy);
+	}
+	mapp->porttype = port;
+    }
+    free(copy);
+#ifdef MAPDEBUG
+    (void) printf("port: %s\n", mapp->porttype ? mapp->porttype : "ANY");
+    (void) printf("type: %s\n", mapp->type);
+    (void) printf("conditional: ");
+    p = "";
+    if (mapp->conditional & GT) {
+	(void) printf("GT");
+	p = "/";
+    }
+    if (mapp->conditional & EQ) {
+	(void) printf("%sEQ", p);
+	p = "/";
+    }
+    if (mapp->conditional & LT)
+	(void) printf("%sLT", p);
+    (void) printf("\nspeed: %d\n", mapp->speed);
+#endif
+}
+
+/*
+ * Return the type of terminal to use for a port of type 'type', as specified
+ * by the first applicable mapping in 'map'.  If no mappings apply, return
+ * 'type'.
+ */
+static const char *
+mapped(const char *type)
+{
+    MAP *mapp;
+    int match;
+
+    for (mapp = maplist; mapp; mapp = mapp->next)
+	if (mapp->porttype == 0 || !strcmp(mapp->porttype, type)) {
+	    switch (mapp->conditional) {
+	    case 0:		/* No test specified. */
+		match = TRUE;
+		break;
+	    case EQ:
+		match = ((int) ospeed == mapp->speed);
+		break;
+	    case GE:
+		match = ((int) ospeed >= mapp->speed);
+		break;
+	    case GT:
+		match = ((int) ospeed > mapp->speed);
+		break;
+	    case LE:
+		match = ((int) ospeed <= mapp->speed);
+		break;
+	    case LT:
+		match = ((int) ospeed < mapp->speed);
+		break;
+	    default:
+		match = FALSE;
+	    }
+	    if (match)
+		return (mapp->type);
+	}
+    /* No match found; return given type. */
+    return (type);
+}
+
+/**************************************************************************
+ *
+ * Entry fetching
+ *
+ **************************************************************************/
+
+/*
+ * Figure out what kind of terminal we're dealing with, and then read in
+ * its termcap entry.
+ */
+static const char *
+get_termcap_entry(int fd, char *userarg)
+{
+    int errret;
+    char *p;
+    const char *ttype;
+#if HAVE_PATH_TTYS
+#if HAVE_GETTTYNAM
+    struct ttyent *t;
+#else
+    FILE *fp;
+#endif
+    char *ttypath;
+#endif /* HAVE_PATH_TTYS */
+
+    (void) fd;
+
+    if (userarg) {
+	ttype = userarg;
+	goto found;
+    }
+
+    /* Try the environment. */
+    if ((ttype = getenv("TERM")) != 0)
+	goto map;
+
+#if HAVE_PATH_TTYS
+    if ((ttypath = ttyname(fd)) != 0) {
+	p = _nc_basename(ttypath);
+#if HAVE_GETTTYNAM
+	/*
+	 * We have the 4.3BSD library call getttynam(3); that means
+	 * there's an /etc/ttys to look up device-to-type mappings in.
+	 * Try ttyname(3); check for dialup or other mapping.
+	 */
+	if ((t = getttynam(p))) {
+	    ttype = t->ty_type;
+	    goto map;
+	}
+#else
+	if ((fp = fopen("/etc/ttytype", "r")) != 0
+	    || (fp = fopen("/etc/ttys", "r")) != 0) {
+	    char buffer[BUFSIZ];
+	    char *s, *t, *d;
+
+	    while (fgets(buffer, sizeof(buffer) - 1, fp) != 0) {
+		for (s = buffer, t = d = 0; *s; s++) {
+		    if (isspace(UChar(*s)))
+			*s = '\0';
+		    else if (t == 0)
+			t = s;
+		    else if (d == 0 && s != buffer && s[-1] == '\0')
+			d = s;
+		}
+		if (t != 0 && d != 0 && !strcmp(d, p)) {
+		    ttype = strdup(t);
+		    fclose(fp);
+		    goto map;
+		}
+	    }
+	    fclose(fp);
+	}
+#endif /* HAVE_GETTTYNAM */
+    }
+#endif /* HAVE_PATH_TTYS */
+
+    /* If still undefined, use "unknown". */
+    ttype = "unknown";
+
+  map:ttype = mapped(ttype);
+
+    /*
+     * If not a path, remove TERMCAP from the environment so we get a
+     * real entry from /etc/termcap.  This prevents us from being fooled
+     * by out of date stuff in the environment.
+     */
+  found:
+    if ((p = getenv("TERMCAP")) != 0 && !_nc_is_abs_path(p)) {
+	/* 'unsetenv("TERMCAP")' is not portable.
+	 * The 'environ' array is better.
+	 */
+	int n;
+	for (n = 0; environ[n] != 0; n++) {
+	    if (!strncmp("TERMCAP=", environ[n], (size_t) 8)) {
+		while ((environ[n] = environ[n + 1]) != 0) {
+		    n++;
+		}
+		break;
+	    }
+	}
+    }
+
+    /*
+     * ttype now contains a pointer to the type of the terminal.
+     * If the first character is '?', ask the user.
+     */
+    if (ttype[0] == '?') {
+	if (ttype[1] != '\0')
+	    ttype = askuser(ttype + 1);
+	else
+	    ttype = askuser(0);
+    }
+    /* Find the terminfo entry.  If it doesn't exist, ask the user. */
+    while (setupterm((NCURSES_CONST char *) ttype, fd, &errret)
+	   != OK) {
+	if (errret == 0) {
+	    (void) fprintf(stderr, "%s: unknown terminal type %s\n",
+			   _nc_progname, ttype);
+	    ttype = 0;
+	} else {
+	    (void) fprintf(stderr,
+			   "%s: can't initialize terminal type %s (error %d)\n",
+			   _nc_progname, ttype, errret);
+	    ttype = 0;
+	}
+	ttype = askuser(ttype);
+    }
+#if BROKEN_LINKER
+    tgetflag("am");		/* force lib_termcap.o to be linked for 'ospeed' */
+#endif
+    return (ttype);
+}
+
+/**************************************************************************
+ *
+ * Main sequence
+ *
+ **************************************************************************/
+
+/*
+ * Convert the obsolete argument forms into something that getopt can handle.
+ * This means that -e, -i and -k get default arguments supplied for them.
+ */
+static void
+obsolete(char **argv)
+{
+    for (; *argv; ++argv) {
+	char *parm = argv[0];
+
+	if (parm[0] == '-' && parm[1] == '\0') {
+	    argv[0] = strdup("-q");
+	    continue;
+	}
+
+	if ((parm[0] != '-')
+	    || (argv[1] && argv[1][0] != '-')
+	    || (parm[1] != 'e' && parm[1] != 'i' && parm[1] != 'k')
+	    || (parm[2] != '\0'))
+	    continue;
+	switch (argv[0][1]) {
+	case 'e':
+	    argv[0] = strdup("-e^H");
+	    break;
+	case 'i':
+	    argv[0] = strdup("-i^C");
+	    break;
+	case 'k':
+	    argv[0] = strdup("-k^U");
+	    break;
+	}
+    }
+}
+
+static void
+print_shell_commands(const char *ttype)
+{
+    const char *p;
+    int len;
+    char *var;
+    char *leaf;
+    /*
+     * Figure out what shell we're using.  A hack, we look for an
+     * environmental variable SHELL ending in "csh".
+     */
+    if ((var = getenv("SHELL")) != 0
+	&& ((len = (int) strlen(leaf = _nc_basename(var))) >= 3)
+	&& !strcmp(leaf + len - 3, "csh"))
+	p = "set noglob;\nsetenv TERM %s;\nunset noglob;\n";
+    else
+	p = "TERM=%s;\n";
+    (void) printf(p, ttype);
+}
+
+static void
+usage(void)
+{
+#define SKIP(s)			/* nothing */
+#define KEEP(s) s "\n"
+    static const char msg[] =
+    {
+	KEEP("")
+	KEEP("Options:")
+	SKIP("  -a arpanet  (obsolete)")
+	KEEP("  -c          set control characters")
+	SKIP("  -d dialup   (obsolete)")
+	KEEP("  -e ch       erase character")
+	KEEP("  -I          no initialization strings")
+	KEEP("  -i ch       interrupt character")
+	KEEP("  -k ch       kill character")
+	KEEP("  -m mapping  map identifier to type")
+	SKIP("  -p plugboard (obsolete)")
+	KEEP("  -Q          do not output control key settings")
+	KEEP("  -q          display term only, do no changes")
+	KEEP("  -r          display term on stderr")
+	SKIP("  -S          (obsolete)")
+	KEEP("  -s          output TERM set command")
+	KEEP("  -V          print curses-version")
+	KEEP("  -w          set window-size")
+	KEEP("")
+	KEEP("If neither -c/-w are given, both are assumed.")
+    };
+#undef KEEP
+#undef SKIP
+    (void) fprintf(stderr, "Usage: %s [options] [terminal]\n", _nc_progname);
+    fputs(msg, stderr);
+    ExitProgram(EXIT_FAILURE);
+    /* NOTREACHED */
+}
+
+static char
+arg_to_char(void)
+{
+    return (char) ((optarg[0] == '^' && optarg[1] != '\0')
+		   ? ((optarg[1] == '?') ? '\177' : CTRL(optarg[1]))
+		   : optarg[0]);
+}
+
+int
+main(int argc, char **argv)
+{
+    int ch, noinit, noset, quiet, Sflag, sflag, showterm;
+    const char *ttype;
+    int terasechar = -1;	/* new erase character */
+    int intrchar = -1;		/* new interrupt character */
+    int tkillchar = -1;		/* new kill character */
+    int my_fd;
+    bool opt_c = FALSE;		/* set control-chars */
+    bool opt_w = FALSE;		/* set window-size */
+    TTY mode, oldmode;
+
+    _nc_progname = _nc_rootname(*argv);
+    obsolete(argv);
+    noinit = noset = quiet = Sflag = sflag = showterm = 0;
+    while ((ch = getopt(argc, argv, "a:cd:e:Ii:k:m:p:qQrSsVw")) != -1) {
+	switch (ch) {
+	case 'c':		/* set control-chars */
+	    opt_c = TRUE;
+	    break;
+	case 'a':		/* OBSOLETE: map identifier to type */
+	    add_mapping("arpanet", optarg);
+	    break;
+	case 'd':		/* OBSOLETE: map identifier to type */
+	    add_mapping("dialup", optarg);
+	    break;
+	case 'e':		/* erase character */
+	    terasechar = arg_to_char();
+	    break;
+	case 'I':		/* no initialization strings */
+	    noinit = 1;
+	    break;
+	case 'i':		/* interrupt character */
+	    intrchar = arg_to_char();
+	    break;
+	case 'k':		/* kill character */
+	    tkillchar = arg_to_char();
+	    break;
+	case 'm':		/* map identifier to type */
+	    add_mapping(0, optarg);
+	    break;
+	case 'p':		/* OBSOLETE: map identifier to type */
+	    add_mapping("plugboard", optarg);
+	    break;
+	case 'Q':		/* don't output control key settings */
+	    quiet = 1;
+	    break;
+	case 'q':		/* display term only */
+	    noset = 1;
+	    break;
+	case 'r':		/* display term on stderr */
+	    showterm = 1;
+	    break;
+	case 'S':		/* OBSOLETE: output TERM & TERMCAP */
+	    Sflag = 1;
+	    break;
+	case 's':		/* output TERM set command */
+	    sflag = 1;
+	    break;
+	case 'V':		/* print curses-version */
+	    puts(curses_version());
+	    ExitProgram(EXIT_SUCCESS);
+	case 'w':		/* set window-size */
+	    opt_w = TRUE;
+	    break;
+	case '?':
+	default:
+	    usage();
+	}
+    }
+
+    argc -= optind;
+    argv += optind;
+
+    if (argc > 1)
+	usage();
+
+    if (!opt_c && !opt_w)
+	opt_c = opt_w = TRUE;
+
+    my_fd = save_tty_settings(&mode, TRUE);
+    oldmode = mode;
+#ifdef TERMIOS
+    ospeed = (NCURSES_OSPEED) cfgetospeed(&mode);
+#elif defined(EXP_WIN32_DRIVER)
+    ospeed = 0;
+#else
+    ospeed = (NCURSES_OSPEED) mode.sg_ospeed;
+#endif
+
+    if (same_program(_nc_progname, PROG_RESET)) {
+	reset_start(stderr, TRUE, FALSE);
+	reset_tty_settings(my_fd, &mode, noset);
+    } else {
+	reset_start(stderr, FALSE, TRUE);
+    }
+
+    ttype = get_termcap_entry(my_fd, *argv);
+
+    if (!noset) {
+#if HAVE_SIZECHANGE
+	if (opt_w) {
+	    set_window_size(my_fd, &lines, &columns);
+	}
+#endif
+	if (opt_c) {
+	    set_control_chars(&mode, terasechar, intrchar, tkillchar);
+	    set_conversions(&mode);
+
+	    if (!noinit) {
+		if (send_init_strings(my_fd, &oldmode)) {
+		    (void) putc('\r', stderr);
+		    (void) fflush(stderr);
+		    (void) napms(1000);		/* Settle the terminal. */
+		}
+	    }
+
+	    update_tty_settings(&oldmode, &mode);
+	}
+    }
+
+    if (noset) {
+	(void) printf("%s\n", ttype);
+    } else {
+	if (showterm)
+	    (void) fprintf(stderr, "Terminal type is %s.\n", ttype);
+	/*
+	 * If erase, kill and interrupt characters could have been
+	 * modified and not -Q, display the changes.
+	 */
+	if (!quiet) {
+	    print_tty_chars(&oldmode, &mode);
+	}
+    }
+
+    if (Sflag)
+	err("The -S option is not supported under terminfo.");
+
+    if (sflag) {
+	print_shell_commands(ttype);
+    }
+
+    ExitProgram(EXIT_SUCCESS);
+}
diff --git a/progs/tty_settings.c b/progs/tty_settings.c
new file mode 100644
index 0000000..a9eb8cd
--- /dev/null
+++ b/progs/tty_settings.c
@@ -0,0 +1,107 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                                                *
+ ****************************************************************************/
+
+#define USE_LIBTINFO
+#include <tty_settings.h>
+
+#include <fcntl.h>
+
+MODULE_ID("$Id: tty_settings.c,v 1.7 2021/10/08 23:53:32 tom Exp $")
+
+static int my_fd;
+static TTY original_settings;
+static bool can_restore = FALSE;
+
+static void
+failed(const char *msg)
+{
+    int code = errno;
+
+    (void) fprintf(stderr, "%s: %s: %s\n", _nc_progname, msg, strerror(code));
+    restore_tty_settings();
+    (void) fprintf(stderr, "\n");
+    ExitProgram(ErrSystem(code));
+    /* NOTREACHED */
+}
+
+static bool
+get_tty_settings(int fd, TTY * tty_settings)
+{
+    bool success = TRUE;
+    my_fd = fd;
+    if (fd < 0 || GET_TTY(my_fd, tty_settings) < 0) {
+	success = FALSE;
+    }
+    return success;
+}
+
+/*
+ * Open a file descriptor on the current terminal, to obtain its settings.
+ * stderr is less likely to be redirected than stdout; try that first.
+ */
+int
+save_tty_settings(TTY * tty_settings, bool need_tty)
+{
+    if (!get_tty_settings(STDERR_FILENO, tty_settings) &&
+	!get_tty_settings(STDOUT_FILENO, tty_settings) &&
+	!get_tty_settings(STDIN_FILENO, tty_settings)) {
+	if (need_tty) {
+	    int fd = open("/dev/tty", O_RDWR);
+	    if (!get_tty_settings(fd, tty_settings)) {
+		failed("terminal attributes");
+	    }
+	} else {
+	    my_fd = fileno(stdout);
+	}
+    } else {
+	can_restore = TRUE;
+	original_settings = *tty_settings;
+    }
+    return my_fd;
+}
+
+void
+restore_tty_settings(void)
+{
+    if (can_restore)
+	SET_TTY(my_fd, &original_settings);
+}
+
+/* Set the modes if they've changed. */
+void
+update_tty_settings(TTY * old_settings, TTY * new_settings)
+{
+    if (memcmp(new_settings, old_settings, sizeof(TTY))) {
+	SET_TTY(my_fd, new_settings);
+    }
+}
diff --git a/progs/tty_settings.h b/progs/tty_settings.h
new file mode 100644
index 0000000..bd3bcdb
--- /dev/null
+++ b/progs/tty_settings.h
@@ -0,0 +1,51 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E Dickey                                                 *
+ ****************************************************************************/
+
+/*
+ * $Id: tty_settings.h,v 1.3 2020/02/02 23:34:34 tom Exp $
+ *
+ * Utility functions for saving/restoring terminal settings.
+ */
+#ifndef TTY_SETTINGS_H
+#define TTY_SETTINGS_H 1
+/* *INDENT-OFF* */
+
+#include <progs.priv.h>
+
+extern int save_tty_settings(TTY * /* tty_settings */, bool /* need_tty */ );
+extern void restore_tty_settings(void);
+extern void update_tty_settings(TTY * /* old_settings */, TTY * /* new_settings */ );
+
+/* *INDENT-ON* */
+
+#endif /* TTY_SETTINGS_H */
diff --git a/test/Makefile.in b/test/Makefile.in
new file mode 100644
index 0000000..1d54628
--- /dev/null
+++ b/test/Makefile.in
@@ -0,0 +1,177 @@
+# $Id: Makefile.in,v 1.130 2021/12/18 23:00:28 tom Exp $
+##############################################################################
+# Copyright 2020,2021 Thomas E. Dickey                                       #
+# Copyright 1998-2017,2018 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey 1996-on
+#
+# Makefile for ncurses tests.
+
+# turn off _all_ suffix rules; we'll generate our own
+.SUFFIXES:
+
+SHELL		= @SHELL@
+VPATH		= @srcdir@
+
+@SET_MAKE@
+
+destdir		=
+x		= @EXEEXT@
+o		= .@OBJEXT@
+
+PACKAGE		= @PACKAGE@
+
+MODEL		= ../@DFT_OBJ_SUBDIR@
+top_srcdir	= @top_srcdir@
+srcdir		= @srcdir@
+prefix		= @prefix@
+exec_prefix	= @exec_prefix@
+datarootdir	= @datarootdir@
+
+bindir		= @bindir@
+libexecdir	= @libexecdir@
+libdir		= @libdir@
+datarootdir	= @datarootdir@
+datadir		= @datadir@
+
+real_bindir	= $(libexecdir)/$(PACKAGE)
+
+BINDIR		= $(DESTDIR)$(bindir)
+LIBEXECDIR	= $(DESTDIR)$(libexecdir)
+LIBDIR		= $(DESTDIR)$(libdir)
+DATADIR		= $(DESTDIR)$(datadir)
+
+REAL_BINDIR	= $(LIBEXECDIR)/$(PACKAGE)
+
+LIBTOOL		= @LIBTOOL@
+LIBTOOL_OPTS	= @LIBTOOL_OPTS@
+LIBTOOL_CLEAN	= @LIB_CLEAN@
+LIBTOOL_COMPILE	= @LIB_COMPILE@
+LIBTOOL_LINK	= @LIB_LINK@
+
+INSTALL		= @INSTALL@ @INSTALL_OPT_O@
+INSTALL_PROG	= @INSTALL_PROGRAM@ @INSTALL_OPT_S@
+INSTALL_SCRIPT	= @INSTALL_SCRIPT@
+INSTALL_DATA	= @INSTALL_DATA@
+transform	= @program_transform_name@
+TRANSFORM	= sed 's/$x$$//'|sed '$(transform)'|sed 's/$$/$x/'
+
+CTAGS		= @CTAGS@
+ETAGS		= @ETAGS@
+
+CC		= @CC@
+CPP		= @CPP@
+
+CFLAGS		= @CFLAGS@ @EXTRA_CFLAGS@
+CPPFLAGS	= -I. -I$(srcdir) -I../test -DHAVE_CONFIG_H -DDATA_DIR=\"$(datadir)\" @CPPFLAGS@
+
+CCFLAGS		= $(CPPFLAGS) $(CFLAGS)
+
+CFLAGS_LIBTOOL	= $(CCFLAGS)
+CFLAGS_NORMAL	= $(CCFLAGS) -DNCURSES_STATIC
+CFLAGS_DEBUG	= $(CCFLAGS) -DNCURSES_STATIC @CC_G_OPT@ -DTRACE
+CFLAGS_PROFILE	= $(CCFLAGS) -DNCURSES_STATIC -pg
+CFLAGS_SHARED	= $(CCFLAGS) @CC_SHARED_OPTS@
+
+CFLAGS_DEFAULT	= $(CFLAGS_@DFT_UPR_MODEL@)
+
+REL_VERSION	= @cf_cv_rel_version@
+ABI_VERSION	= @cf_cv_abi_version@
+LOCAL_LIBDIR	= @top_builddir@/lib
+LOCAL_LIBS	= @TEST_DEPS@
+MATH_LIB	= @MATH_LIB@
+TEST_LIBS	= @TEST_LIBS@
+
+LD		= @LD@
+LINK		= @LINK_TESTS@ $(LIBTOOL_LINK) $(CFLAGS)
+
+LDFLAGS		= @LD_MODEL@ @LOCAL_LDFLAGS@ @LDFLAGS@
+
+LDFLAGS_LIBTOOL	= $(LDFLAGS) $(CFLAGS_LIBTOOL)
+LDFLAGS_NORMAL	= $(LDFLAGS) $(CFLAGS_NORMAL)
+LDFLAGS_DEBUG	= $(LDFLAGS) $(CFLAGS_DEBUG)
+LDFLAGS_PROFILE	= $(LDFLAGS) $(CFLAGS_PROFILE)
+LDFLAGS_SHARED	= $(LDFLAGS) $(CFLAGS_SHARED) @LD_SHARED_OPTS@
+
+TEST_ARGS	= @LDFLAGS_STATIC@ @TEST_ARGS@ @LDFLAGS_SHARED@
+
+# use these for linking with all of the libraries
+LIBS_DEFAULT	= $(TEST_ARGS) @LIBS@ $(TEST_LIBS)
+LDFLAGS_DEFAULT	= $(LDFLAGS_@DFT_UPR_MODEL@) $(LIBS_DEFAULT)
+
+# use these for linking with the (n)curses library and possibly pthreads
+LIBS_THREADS	= `echo "$(TEST_ARGS) @LIBS@" | sed -e 's/-l@FORM_NAME@.*-l@PANEL_NAME@[^ ]*//'` $(TEST_LIBS) @PTHREAD@
+LDFLAGS_THREADS	= $(LDFLAGS_@DFT_UPR_MODEL@) $(LIBS_THREADS)
+
+# use these for linking with the (n)curses library
+LIBS_CURSES	= `echo "$(TEST_ARGS) @LIBS@" | sed -e 's/-l@FORM_NAME@.*-l@PANEL_NAME@[^ ]*//'` $(TEST_LIBS)
+LDFLAGS_CURSES	= $(LDFLAGS_@DFT_UPR_MODEL@) $(LIBS_CURSES)
+
+# use these when we need the math library
+LDFLAGS_CURSES_M= $(LDFLAGS_CURSES) $(MATH_LIB)
+
+# use these for linking with the tinfo library if we have it, or curses library if not
+LIBS_TINFO	= @LDFLAGS_STATIC@ @TINFO_LIBS@ @LDFLAGS_SHARED@ @LIBS@ $(TEST_LIBS)
+LDFLAGS_TINFO	= @TINFO_LDFLAGS@ $(LDFLAGS_@DFT_UPR_MODEL@) $(LIBS_TINFO)
+
+LINT		= @LINT@
+LINT_OPTS	= @LINT_OPTS@
+LINT_LIBS	= -lform -lmenu -lpanel -lncurses @LIBS@
+
+INCDIR		= $(top_srcdir)/include
+incdir		= ../include
+
+HEADER_DEPS	= \
+	$(incdir)/curses.h \
+	$(incdir)/term.h \
+	$(incdir)/ncurses_cfg.h \
+	$(incdir)/ncurses_def.h \
+	$(incdir)/ncurses_dll.h \
+	$(incdir)/term.h \
+	$(incdir)/unctrl.h \
+	$(INCDIR)/nc_alloc.h
+
+################################################################################
+
+@MAKE_PHONY@.PHONY :	all
+@MAKE_PHONY@.PHONY :	check
+
+all::
+
+# Verify that each header-file can be compiled without including another.
+check::
+	@$(SHELL) -c "for header in *.h;\
+		do \
+			echo \"** testing \$${header}\" ; \
+			echo \"#include <\$${header}>\" >headers.c; \
+			echo \"int main(void) { return 0; }\" >>headers.c; \
+			$(CC) -c $(CFLAGS) $(CPPFLAGS) headers.c; \
+		done"
+	-@rm -f headers.*
+
+# The rest is generated from the "programs" and "modules" files...
diff --git a/test/README b/test/README
new file mode 100644
index 0000000..7844aa7
--- /dev/null
+++ b/test/README
@@ -0,0 +1,848 @@
+-------------------------------------------------------------------------------
+-- Copyright 2018-2021,2022 Thomas E. Dickey                                 --
+-- Copyright 1998-2017,2018 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: README,v 1.77 2022/08/13 23:34:33 tom Exp $
+-------------------------------------------------------------------------------
+
+The programs in this directory are used to test and demonstrate ncurses.
+Some are interesting in themselves, while others merely show how some of
+the library calls are used.  Some date back to the initial releases of
+ncurses during the mid-1990s, such as:
+
+	blue       - Blue Moon, a nifty solitaire (uses color)
+	bs.c       - the game of Battleships (uses color)
+	firework.c - multi-colored fireworks (uses color)
+	gdc.c      - Great Digital Clock (uses color)
+	hanoi.c    - the game of hanoi (uses color essentially)
+	knight.c   - the game of Knight's Tour (uses color)
+	lrtest.c   - test of access to the lower-right corner
+	ncurses.c  - multi-test program (uses color)
+	newdemo.c  - another test from PDCurses (uses color)
+	rain.c     - rain drops keep falling on my head...
+	tclock.c   - analog/digital clock
+	testcurs.c - a test from the PDCurses people (uses color)
+	tracemunch - Perl script to make trace scripts easier to read
+	worm.c     - worms run all over your screen (uses color)
+	xmas.c     - Xmas greeting card
+
+Besides being built as part of ncurses, the programs are also packaged as
+"ncurses-examples".  Despite the name, the programs have been adjusted to
+allow them to build with other curses implementations, to provide a way to
+compare those with ncurses.
+
+You can build the programs by
+
+	./configure
+	make
+
+The configure script has several options which allow you to tell it more
+about the curses implementation for which you are building the examples.
+Use
+
+	./configure --help
+
+to list the options.
+
+-------------------------------------------------------------------------------
+-------------------------------------------------------------------------------
+
+These programs provide examples of use, but do not comprise a complete set of
+tests.  Here is a list of library externals, noting those that are used:
+
+libform:
+-------
+TYPE_ALNUM			test: demo_forms
+TYPE_ALPHA			test: demo_forms dup_field move_field ncurses
+TYPE_ENUM			test: demo_forms
+TYPE_INTEGER			test: demo_forms
+TYPE_IPV4			test: demo_forms
+TYPE_NUMERIC			test: demo_forms
+TYPE_REGEXP			test: demo_forms
+current_field			test: demo_forms dup_field edit_field move_field ncurses
+data_ahead			test: demo_forms
+data_behind			test: demo_forms
+dup_field			test: dup_field
+dynamic_field_info		test: demo_forms
+field_arg			test: demo_forms
+field_back			test: demo_forms edit_field
+field_buffer			test: cardfile demo_forms ncurses
+field_count			test: demo_forms dup_field move_field
+field_fore			test: demo_forms
+field_index			test: demo_forms
+field_info			test: edit_field ncurses
+field_init			-
+field_just			-
+field_opts			test: demo_forms dup_field move_field ncurses
+field_opts_off			test: cardfile demo_forms form_driver_w
+field_opts_on			test: demo_forms
+field_pad			test: demo_forms
+field_status			test: demo_forms
+field_term			-
+field_type			test: demo_forms
+field_userptr			test: dup_field edit_field move_field ncurses
+form_driver			test: cardfile demo_forms dup_field edit_field move_field ncurses
+form_driver_w			test: form_driver_w
+form_fields			test: cardfile demo_forms dup_field move_field
+form_init			-
+form_opts			-
+form_opts_off			-
+form_opts_on			-
+form_page			test: demo_forms
+form_request_by_name		-
+form_request_name		test: dup_field edit_field move_field
+form_sub			test: cardfile demo_forms dup_field move_field ncurses
+form_term			-
+form_userptr			-
+form_win			test: cardfile demo_forms dup_field edit_field form_driver_w move_field ncurses
+free_field			test: cardfile demo_forms dup_field form_driver_w move_field ncurses
+free_fieldtype			test: ncurses
+free_form			test: cardfile demo_forms dup_field form_driver_w move_field ncurses
+link_field			-
+link_fieldtype			-
+move_field			test: move_field
+new_field			test: cardfile demo_forms dup_field form_driver_w move_field ncurses
+new_fieldtype			test: ncurses
+new_form			test: cardfile demo_forms dup_field form_driver_w move_field ncurses
+new_form_sp			-
+new_page			test: demo_forms
+pos_form_cursor			-
+post_form			test: cardfile demo_forms dup_field form_driver_w move_field ncurses
+scale_form			test: demo_forms ncurses
+set_current_field		test: demo_forms
+set_field_back			test: cardfile demo_forms dup_field edit_field form_driver_w move_field ncurses
+set_field_buffer		test: cardfile demo_forms dup_field edit_field move_field ncurses
+set_field_fore			test: demo_forms
+set_field_init			-
+set_field_just			test: cardfile demo_forms
+set_field_opts			test: demo_forms dup_field move_field ncurses
+set_field_pad			test: demo_forms
+set_field_status		test: demo_forms
+set_field_term			-
+set_field_type			test: demo_forms dup_field move_field ncurses
+set_field_userptr		test: edit_field ncurses
+set_fieldtype_arg		-
+set_fieldtype_choice		-
+set_form_fields			test: dup_field move_field
+set_form_init			-
+set_form_opts			-
+set_form_page			-
+set_form_sub			test: cardfile demo_forms ncurses
+set_form_term			-
+set_form_userptr		-
+set_form_win			test: cardfile demo_forms ncurses
+set_max_field			test: demo_forms
+set_new_page			test: demo_forms
+unfocus_current_field		-
+unpost_form			test: cardfile demo_forms dup_field form_driver_w move_field ncurses
+
+libmenu:
+-------
+current_item			test: demo_menus ncurses
+free_item			test: demo_menus ncurses
+free_menu			test: demo_menus ncurses
+item_count			test: demo_menus
+item_description		-
+item_index			test: demo_menus ncurses
+item_init			-
+item_name			test: demo_menus ncurses
+item_opts			-
+item_opts_off			-
+item_opts_on			-
+item_term			-
+item_userptr			test: demo_menus
+item_value			test: demo_menus ncurses
+item_visible			-
+menu_back			-
+menu_driver			test: demo_menus ncurses
+menu_fore			-
+menu_format			-
+menu_grey			-
+menu_init			-
+menu_items			test: demo_menus ncurses
+menu_mark			test: demo_menus
+menu_opts			-
+menu_opts_off			test: demo_menus ncurses
+menu_opts_on			test: demo_menus
+menu_pad			-
+menu_pattern			test: demo_menus
+menu_request_by_name		-
+menu_request_name		-
+menu_spacing			test: demo_menus
+menu_sub			test: demo_menus
+menu_term			-
+menu_userptr			-
+menu_win			test: demo_menus ncurses
+new_item			test: demo_menus ncurses
+new_menu			test: demo_menus ncurses
+new_menu_sp			-
+pos_menu_cursor			lib: menu
+post_menu			test: demo_menus ncurses
+scale_menu			test: demo_menus ncurses
+set_current_item		-
+set_item_init			test: demo_menus
+set_item_opts			-
+set_item_term			test: demo_menus
+set_item_userptr		test: demo_menus
+set_item_value			test: demo_menus ncurses
+set_menu_back			test: demo_menus
+set_menu_fore			test: demo_menus
+set_menu_format			test: demo_menus ncurses
+set_menu_grey			-
+set_menu_init			test: demo_menus
+set_menu_items			-
+set_menu_mark			test: demo_menus
+set_menu_opts			-
+set_menu_pad			-
+set_menu_pattern		-
+set_menu_spacing		-
+set_menu_sub			test: demo_menus ncurses
+set_menu_term			test: demo_menus
+set_menu_userptr		-
+set_menu_win			test: demo_menus ncurses
+set_top_row			-
+top_row				-
+unpost_menu			test: demo_menus ncurses
+
+libncurses:
+----------
+BC				test: demo_termcap
+COLORS				test: color_content demo_new_pair dots_curses dots_xcurses echochar ncurses pair_content picsmap savescreen xmas
+COLOR_PAIR			test: background blue bs cardfile clip_printw demo_forms demo_menus demo_panels dots_curses dup_field echochar filter firework gdc hanoi ins_wide insdelln inserts knight move_field ncurses newdemo padview picsmap rain savescreen tclock test_add_wchstr test_addchstr test_addstr test_addwstr testaddch testcurs view worm xmas
+COLOR_PAIRS			test: demo_new_pair dots_curses dots_xcurses echochar ncurses newdemo pair_content
+COLS				test: cardfile combine demo_altkeys demo_defkey demo_forms demo_keyok demo_menus demo_panels demo_tabs ditto dots_curses dots_xcurses echochar filter firework foldkeys hashtest inch_wide inchs ins_wide inserts lrtest movewindow ncurses newdemo padview picsmap rain savescreen tclock test_add_wchstr test_addchstr test_addstr test_addwstr test_delwin test_get_wstr test_getstr test_instr test_inwstr test_opaque testcurs view worm
+ESCDELAY			test: test_opaque
+LINES				test: cardfile combine demo_defkey demo_keyok demo_menus demo_panels demo_tabs ditto dots_curses dots_xcurses echochar firework hanoi hashtest inch_wide inchs ins_wide inserts lrtest move_field movewindow ncurses newdemo padview picsmap rain savescreen tclock test_add_wchstr test_addchstr test_addstr test_addwstr test_delwin test_get_wstr test_getstr test_instr test_inwstr test_opaque testcurs view worm xmas
+PAIR_NUMBER			test: dump_window ncurses
+PC				test: demo_termcap
+SP				lib: form
+TABSIZE				test: test_opaque
+UP				test: demo_termcap
+acs_map				test: back_ground background gdc ins_wide inserts knight movewindow ncurses newdemo savescreen test_add_wchstr test_addchstr test_addstr test_addwstr testcurs
+add_wch				test: combine demo_new_pair demo_panels ncurses picsmap savescreen test_add_wchstr test_addwstr
+add_wchnstr			test: test_add_wchstr
+add_wchstr			test: test_add_wchstr view
+addch				test: back_ground background blue bs color_content demo_tabs dots_curses echochar hashtest ncurses padview pair_content picsmap savescreen test_add_wchstr test_addchstr test_addstr test_addwstr test_opaque testaddch view worm
+addchnstr			test: test_addchstr
+addchstr			test: test_addchstr
+addnstr				test: test_addstr
+addnwstr			test: dots_xcurses ncurses test_addwstr
+addstr				test: blue bs cardfile filter gdc hanoi lrtest ncurses test_addstr
+addwstr				test: blue combine test_addwstr
+alloc_pair			test: demo_new_pair dots_xcurses
+alloc_pair_sp			-
+assume_default_colors		test: back_ground background ncurses
+assume_default_colors_sp	-
+attr_get			-
+attr_off			test: combine dots_xcurses ncurses
+attr_on				test: combine dots_xcurses ncurses
+attr_set			test: ncurses
+attroff				test: blue dots_curses echochar filter gdc ncurses tclock
+attron				test: blue bs dots_curses echochar filter gdc ncurses
+attrset				test: bs filter firework gdc hanoi insdelln ncurses picsmap rain tclock testaddch testcurs
+baudrate			test: ncurses
+baudrate_sp			test: sp_tinfo
+beep				test: blue bs cardfile chgat clip_printw demo_forms demo_menus demo_new_pair demo_panels dup_field edit_field firstlast hanoi inch_wide inchs ins_wide insdelln inserts knight move_field movewindow ncurses padview popup_msg rain savescreen tclock test_add_wchstr test_addchstr test_addstr test_addwstr test_get_wstr test_getstr test_instr test_inwstr test_opaque testcurs view xmas
+beep_sp				lib: ncurses
+bkgd				test: background cardfile demo_forms dup_field move_field ncurses padview savescreen tclock view
+bkgdset				test: background ncurses testaddch
+bkgrnd				test: ncurses
+bkgrndset			test: back_ground ncurses
+boolcodes			test: demo_termcap test_arrays progs: dump_entry
+boolfnames			test: demo_terminfo test_arrays progs: dump_entry
+boolnames			test: demo_terminfo test_arrays progs: dump_entry infocmp
+border				-
+border_set			-
+box				test: cardfile chgat clip_printw demo_forms demo_menus demo_panels ditto inch_wide inchs ins_wide insdelln inserts lrtest ncurses newdemo popup_msg redraw test_add_wchstr test_addchstr test_addstr test_addwstr test_delwin test_get_wstr test_getstr test_instr test_inwstr test_opaque testcurs
+box_set				test: ncurses
+can_change_color		test: color_content extended_color ncurses
+can_change_color_sp		test: extended_color
+cbreak				test: back_ground background blue bs cardfile chgat clip_printw color_content color_set combine demo_altkeys demo_defkey demo_forms demo_keyok demo_menus demo_new_pair demo_panels demo_tabs ditto dup_field extended_color filter firework foldkeys form_driver_w gdc hanoi hashtest inch_wide inchs ins_wide insdelln inserts knight lrtest move_field movewindow ncurses newdemo padview pair_content picsmap savescreen tclock test_add_wchstr test_addchstr test_addstr test_addwstr test_delwin test_get_wstr test_getstr test_instr test_inwstr test_mouse test_opaque test_unget_wch testcurs view worm xmas
+cbreak_sp			test: sp_tinfo
+chgat				test: chgat
+clear				test: blue bs filter gdc ncurses padview testcurs xmas
+clearok				test: bs knight
+clrtobot			test: demo_menus move_field ncurses view
+clrtoeol			test: blue bs demo_altkeys filter foldkeys form_driver_w hanoi hashtest movewindow ncurses padview test_mouse view
+color_content			test: color_content ncurses picsmap
+color_content_sp		-
+color_set			test: color_set dots_xcurses extended_color ncurses
+copywin				test: ncurses testcurs
+cur_term			test: demo_termcap demo_terminfo dots dots_mvcur filter list_keys lrtest sp_tinfo test_sgr test_tparm test_vid_puts test_vidputs progs: clear_cmd reset_cmd tabs tput tset
+curs_set			test: demo_new_pair echochar firework gdc hanoi lrtest ncurses newdemo picsmap rain savescreen tclock testcurs worm xmas
+curs_set_sp			test: sp_tinfo
+curscr				test: demo_panels knight lrtest ncurses popup_msg savescreen tclock
+curses_trace			test: demo_menus hashtest lrtest ncurses padview redraw test_sgr test_termattrs test_vid_puts test_vidputs testcurs view worm
+curses_version			test: ncurses progs: clear infocmp tabs tic toe tput tset
+def_prog_mode			test: bs ncurses
+def_prog_mode_sp		test: sp_tinfo
+def_shell_mode			-
+def_shell_mode_sp		test: sp_tinfo
+define_key			test: demo_altkeys demo_defkey foldkeys
+define_key_sp			test: sp_tinfo
+del_curterm			test: demo_terminfo sp_tinfo test_sgr test_tparm
+del_curterm_sp			lib: ncurses
+delay_output			test: newdemo
+delay_output_sp			test: sp_tinfo
+delch				-
+deleteln			test: insdelln
+delscreen			test: ditto dots_mvcur test_delwin
+delwin				test: cardfile chgat clip_printw demo_forms demo_panels dup_field inch_wide inchs ins_wide insdelln inserts move_field ncurses newdemo padview popup_msg redraw test_add_wchstr test_addchstr test_addstr test_addwstr test_delwin test_get_wstr test_getstr test_instr test_inwstr test_opaque testcurs view
+derwin				test: cardfile chgat clip_printw demo_forms demo_menus ditto inch_wide inchs ins_wide insdelln inserts movewindow ncurses test_add_wchstr test_addchstr test_addstr test_addwstr test_delwin test_get_wstr test_getstr test_instr test_inwstr test_opaque
+doupdate			test: cardfile demo_menus demo_panels ditto ins_wide inserts knight movewindow ncurses padview popup_msg redraw savescreen test_add_wchstr test_addchstr test_addstr test_addwstr test_get_wstr test_getstr
+doupdate_sp			lib: ncurses
+dupwin				test: popup_msg
+echo				test: bs hanoi ncurses test_get_wstr test_getstr testcurs testscanw
+echo_sp				lib: ncurses
+echo_wchar			test: ncurses
+echochar			test: echochar ncurses
+endwin				test: back_ground background blue bs cardfile chgat clip_printw color_content color_set combine demo_altkeys demo_defkey demo_forms demo_keyok demo_menus demo_new_pair demo_panels demo_tabs ditto dots_curses dots_mvcur dots_xcurses dup_field echochar extended_color filter firework firstlast foldkeys form_driver_w gdc hanoi hashtest inch_wide inchs ins_wide insdelln inserts key_names keynames knight lrtest move_field movewindow ncurses newdemo padview pair_content picsmap rain redraw savescreen tclock test_add_wchstr test_addchstr test_addstr test_addwstr test_delwin test_get_wstr test_getstr test_instr test_inwstr test_mouse test_opaque test_unget_wch testaddch testcurs testscanw view worm xmas
+endwin_sp			lib: ncurses
+erase				test: cardfile demo_menus filter firework firstlast hanoi lrtest ncurses picsmap tclock test_opaque testcurs
+erasechar			test: ncurses
+erasechar_sp			test: sp_tinfo
+erasewchar			test: ncurses
+erasewchar_sp			lib: ncurses
+exit_curses			test: back_ground background blue bs cardfile chgat clip_printw color_content color_set combine demo_altkeys demo_defkey demo_forms demo_keyok demo_menus demo_new_pair demo_panels demo_tabs ditto dots_curses dots_xcurses dup_field echochar extended_color filter firework firstlast foldkeys form_driver_w gdc hanoi hashtest inch_wide inchs ins_wide insdelln inserts key_names keynames knight lrtest move_field movewindow ncurses newdemo padview pair_content picsmap rain redraw savescreen tclock test_add_wchstr test_addchstr test_addstr test_addwstr test_delwin test_get_wstr test_getstr test_instr test_inwstr test_mouse test_opaque test_setupterm test_termattrs test_unget_wch testaddch testcurs testscanw view worm xmas
+exit_terminfo			test: demo_termcap demo_terminfo dots dots_mvcur dots_termcap list_keys railroad sp_tinfo test_arrays test_sgr test_tparm test_vid_puts test_vidputs
+extended_color_content		test: color_content extended_color
+extended_color_content_sp	test: extended_color
+extended_pair_content		test: extended_color pair_content
+extended_pair_content_sp	test: extended_color
+extended_slk_color		test: extended_color
+extended_slk_color_sp		test: extended_color
+filter				test: filter
+filter_sp			-
+find_pair			test: demo_new_pair
+find_pair_sp			-
+flash				test: cardfile filter lrtest movewindow ncurses tclock testcurs
+flash_sp			-
+flushinp			test: ncurses newdemo testcurs
+flushinp_sp			test: sp_tinfo
+free_pair			test: demo_new_pair
+free_pair_sp			-
+get_escdelay			-
+get_escdelay_sp			-
+get_wch				test: form_driver_w test_unget_wch
+get_wstr			test: test_get_wstr
+getattrs			-
+getbegx				test: chgat clip_printw demo_menus demo_panels dump_window insdelln move_field movewindow ncurses newdemo redraw testcurs
+getbegy				test: chgat clip_printw demo_menus demo_panels dump_window insdelln move_field movewindow ncurses newdemo redraw testcurs
+getbkgd				test: ncurses
+getbkgrnd			test: ncurses
+getcchar			test: demo_new_pair ncurses savescreen view
+getch				test: back_ground background blue bs chgat color_content color_set combine demo_altkeys demo_new_pair demo_tabs extended_color filter firework firstlast foldkeys hanoi hashtest insdelln lrtest padview pair_content picsmap savescreen tclock test_mouse test_opaque test_unget_wch testaddch testcurs view xmas
+getcurx				test: bs chgat clip_printw combine demo_altkeys demo_defkey demo_panels dump_window extended_color filter firstlast foldkeys insdelln move_field movewindow ncurses redraw savescreen test_get_wstr test_getstr test_opaque testcurs view
+getcury				test: bs chgat clip_printw demo_altkeys demo_defkey demo_panels dump_window extended_color filter firstlast foldkeys insdelln move_field movewindow ncurses popup_msg redraw savescreen test_mouse test_opaque testcurs view
+getmaxx				test: chgat clip_printw demo_panels dump_window firstlast inch_wide inchs insdelln movewindow ncurses newdemo popup_msg redraw test_get_wstr test_getstr test_instr test_inwstr test_opaque testcurs
+getmaxy				test: chgat clip_printw demo_forms demo_panels dump_window firstlast inch_wide inchs insdelln movewindow ncurses newdemo popup_msg redraw test_get_wstr test_getstr test_instr test_inwstr test_mouse test_opaque testcurs
+getmouse			test: bs demo_menus knight movewindow ncurses test_mouse testcurs
+getmouse_sp			-
+getn_wstr			test: test_get_wstr
+getnstr				test: filter ncurses test_getstr
+getparx				test: movewindow
+getpary				test: movewindow
+getstr				test: test_getstr
+getwin				test: ncurses
+getwin_sp			-
+halfdelay			test: padview view
+halfdelay_sp			test: sp_tinfo
+has_colors			test: back_ground background bs cardfile chgat clip_printw color_content color_set demo_forms demo_menus demo_new_pair demo_panels dots_curses dots_xcurses dup_field echochar extended_color filter firework gdc hanoi ins_wide insdelln inserts knight move_field ncurses newdemo padview pair_content picsmap rain savescreen tclock test_add_wchstr test_addchstr test_addstr test_addwstr testcurs view worm xmas
+has_colors_sp			lib: ncurses
+has_ic				test: lrtest ncurses
+has_ic_sp			test: sp_tinfo
+has_il				test: ncurses
+has_il_sp			test: sp_tinfo
+has_key				-
+has_key_sp			test: sp_tinfo
+has_mouse			-
+has_mouse_sp			-
+hline				test: gdc ncurses
+hline_set			-
+idcok				test: test_opaque
+idlok				test: ncurses padview test_opaque testscanw view
+immedok				test: test_opaque
+in_wch				test: inch_wide
+in_wchnstr			test: inch_wide
+in_wchstr			test: inch_wide
+inch				test: inchs
+inchnstr			test: inchs
+inchstr				test: inchs
+init_color			test: color_content ncurses
+init_color_sp			-
+init_extended_color		test: color_content extended_color
+init_extended_color_sp		test: extended_color
+init_extended_pair		test: extended_color ncurses pair_content picsmap
+init_extended_pair_sp		test: extended_color
+init_pair			test: back_ground background blue bs cardfile chgat clip_printw color_set demo_forms demo_menus demo_new_pair demo_panels dots_curses dots_xcurses dup_field echochar filter firework gdc hanoi ins_wide insdelln inserts knight move_field ncurses newdemo padview pair_content picsmap rain savescreen tclock test_add_wchstr test_addchstr test_addstr test_addwstr testaddch testcurs view worm xmas
+init_pair_sp			lib: ncurses
+initscr				test: back_ground background blue bs cardfile chgat clip_printw color_content color_set combine demo_defkey demo_forms demo_keyok demo_menus demo_panels demo_tabs dots_curses dots_xcurses dup_field echochar filter firework firstlast form_driver_w gdc hanoi hashtest inch_wide inchs ins_wide insdelln inserts knight lrtest move_field movewindow ncurses newdemo padview pair_content picsmap rain savescreen tclock test_add_wchstr test_addchstr test_addstr test_addwstr test_get_wstr test_getstr test_instr test_inwstr test_mouse test_opaque test_unget_wch testaddch testcurs testscanw view worm xmas
+innstr				test: test_instr
+innwstr				test: test_inwstr
+ins_nwstr			test: ins_wide
+ins_wch				test: ins_wide
+ins_wstr			test: ins_wide
+insch				test: ins_wide inserts
+insdelln			test: insdelln
+insertln			test: insdelln
+insnstr				test: inserts
+insstr				test: inserts
+instr				test: test_instr
+intrflush			test: demo_forms dup_field move_field movewindow
+intrflush_sp			test: sp_tinfo
+inwstr				test: test_inwstr
+is_cleared			test: test_opaque
+is_idcok			test: test_opaque
+is_idlok			test: test_opaque
+is_immedok			test: test_opaque
+is_keypad			test: ncurses test_opaque
+is_leaveok			test: test_opaque
+is_linetouched			lib: form
+is_nodelay			test: test_opaque
+is_notimeout			test: test_opaque
+is_pad				test: test_opaque
+is_scrollok			test: ncurses test_opaque
+is_subwin			test: test_opaque
+is_syncok			test: test_opaque
+is_term_resized			-
+is_term_resized_sp		-
+is_wintouched			lib: ncurses
+isendwin			-
+isendwin_sp			-
+key_defined			test: demo_defkey foldkeys
+key_defined_sp			test: sp_tinfo
+key_name			test: key_names ncurses test_unget_wch
+keybound			test: demo_altkeys demo_defkey
+keybound_sp			test: sp_tinfo
+keyname				test: combine demo_altkeys demo_defkey demo_keyok demo_menus dup_field edit_field foldkeys keynames move_field movewindow ncurses padview redraw test_getstr test_unget_wch testcurs view progs: tic
+keyname_sp			test: sp_tinfo
+keyok				test: demo_keyok foldkeys
+keyok_sp			test: sp_tinfo
+keypad				test: bs cardfile chgat clip_printw combine demo_altkeys demo_defkey demo_forms demo_keyok demo_menus demo_new_pair demo_panels ditto dup_field filter firework foldkeys form_driver_w hashtest inch_wide inchs ins_wide insdelln inserts key_names keynames knight lrtest move_field movewindow ncurses padview popup_msg redraw savescreen tclock test_add_wchstr test_addchstr test_addstr test_addwstr test_get_wstr test_getstr test_instr test_inwstr test_mouse test_opaque test_unget_wch testcurs testscanw view
+killchar			test: ncurses
+killchar_sp			test: sp_tinfo
+killwchar			test: ncurses
+killwchar_sp			lib: ncurses
+leaveok				test: hanoi test_opaque
+longname			test: ncurses testcurs progs: tput
+longname_sp			test: sp_tinfo
+mcprint				-
+mcprint_sp			-
+meta				test: key_names keynames ncurses
+mouse_trafo			lib: form
+mouseinterval			test: test_mouse
+mouseinterval_sp		-
+mousemask			test: bs demo_forms demo_menus knight movewindow ncurses test_mouse testcurs
+mousemask_sp			-
+move				test: blue bs cardfile chgat combine demo_altkeys demo_menus demo_new_pair demo_tabs dots_curses dots_xcurses echochar filter foldkeys gdc hanoi hashtest inch_wide inchs ins_wide inserts knight lrtest move_field movewindow ncurses picsmap savescreen test_add_wchstr test_addchstr test_addstr test_addwstr test_get_wstr test_getstr test_instr test_inwstr test_opaque testscanw view xmas
+mvadd_wch			test: ncurses test_add_wchstr test_addwstr
+mvadd_wchnstr			test: test_add_wchstr
+mvadd_wchstr			test: test_add_wchstr
+mvaddch				test: bs gdc hanoi lrtest ncurses rain tclock test_add_wchstr test_addchstr test_addstr test_addwstr xmas
+mvaddchnstr			test: gdc test_addchstr
+mvaddchstr			test: test_addchstr
+mvaddnstr			test: test_addstr
+mvaddnwstr			test: test_addwstr
+mvaddstr			test: bs demo_forms gdc hanoi knight ncurses rain tclock test_addstr testcurs xmas
+mvaddwstr			test: test_addwstr
+mvchgat				test: chgat
+mvcur				test: dots_mvcur redraw
+mvcur_sp			-
+mvdelch				-
+mvderwin			test: movewindow
+mvget_wch			-
+mvget_wstr			test: test_get_wstr
+mvgetch				-
+mvgetn_wstr			test: test_get_wstr
+mvgetnstr			test: test_getstr
+mvgetstr			test: test_getstr
+mvhline				test: ncurses
+mvhline_set			test: ncurses
+mvin_wch			test: inch_wide
+mvin_wchnstr			test: inch_wide
+mvin_wchstr			test: inch_wide
+mvinch				test: inchs
+mvinchnstr			test: gdc inchs
+mvinchstr			test: inchs
+mvinnstr			test: test_instr
+mvinnwstr			test: test_inwstr
+mvins_nwstr			test: ins_wide
+mvins_wch			test: ins_wide
+mvins_wstr			test: ins_wide
+mvinsch				test: ins_wide inserts
+mvinsnstr			test: inserts
+mvinsstr			test: inserts
+mvinstr				test: test_instr
+mvinwstr			test: test_inwstr
+mvprintw			test: back_ground background bs firework form_driver_w hanoi move_field ncurses padview savescreen tclock view
+mvscanw				-
+mvvline				test: ncurses
+mvvline_set			test: ncurses
+mvwadd_wch			test: test_add_wchstr test_addwstr
+mvwadd_wchnstr			test: test_add_wchstr
+mvwadd_wchstr			test: inch_wide test_add_wchstr
+mvwaddch			test: movewindow ncurses newdemo test_add_wchstr test_addchstr test_addstr test_addwstr testcurs xmas
+mvwaddchnstr			test: test_addchstr
+mvwaddchstr			test: inchs test_addchstr
+mvwaddnstr			test: newdemo test_addstr testcurs
+mvwaddnwstr			test: test_addwstr
+mvwaddstr			test: ditto firstlast ins_wide inserts knight ncurses newdemo test_addstr test_addwstr test_instr testcurs xmas
+mvwaddwstr			test: test_addwstr test_inwstr
+mvwchgat			test: chgat
+mvwdelch			test: ncurses
+mvwget_wch			-
+mvwget_wstr			test: test_get_wstr
+mvwgetch			test: inch_wide inchs test_get_wstr test_getstr test_instr test_inwstr test_opaque
+mvwgetn_wstr			test: test_get_wstr
+mvwgetnstr			test: test_getstr
+mvwgetstr			test: test_getstr
+mvwhline			test: movewindow ncurses
+mvwhline_set			-
+mvwin				test: cardfile demo_menus movewindow ncurses testcurs xmas
+mvwin_wch			test: inch_wide
+mvwin_wchnstr			test: inch_wide
+mvwin_wchstr			test: inch_wide
+mvwinch				test: dump_window inchs newdemo testcurs
+mvwinchnstr			test: inchs
+mvwinchstr			test: inchs
+mvwinnstr			test: test_instr testcurs
+mvwinnwstr			test: test_inwstr
+mvwins_nwstr			test: ins_wide
+mvwins_wch			test: ins_wide
+mvwins_wstr			test: ins_wide
+mvwinsch			test: ins_wide inserts
+mvwinsnstr			test: inserts
+mvwinsstr			test: inserts testcurs
+mvwinstr			test: test_instr
+mvwinwstr			test: test_inwstr
+mvwprintw			test: demo_menus demo_panels inch_wide inchs ncurses test_delwin test_instr test_inwstr testcurs
+mvwscanw			test: testcurs
+mvwvline			test: ins_wide inserts movewindow ncurses test_add_wchstr test_addchstr test_addstr test_addwstr
+mvwvline_set			-
+napms				test: demo_panels ditto dots dots_curses dots_mvcur dots_xcurses echochar extended_color firework firstlast gdc hanoi lrtest ncurses padview picsmap railroad rain tclock test_opaque testcurs view worm xmas progs: tset
+napms_sp			test: sp_tinfo
+new_prescr			test: sp_tinfo
+newpad				test: ncurses padview popup_msg testcurs
+newpad_sp			lib: ncurses
+newscr				lib: ncurses
+newterm				test: demo_altkeys demo_new_pair ditto dots_mvcur extended_color filter foldkeys gdc key_names keynames redraw test_delwin test_setupterm test_termattrs
+newterm_sp			-
+newwin				test: cardfile chgat clip_printw demo_defkey demo_forms demo_keyok demo_menus demo_panels ditto firstlast inch_wide inchs ins_wide insdelln inserts knight movewindow ncurses newdemo popup_msg redraw test_add_wchstr test_addchstr test_addstr test_addwstr test_delwin test_get_wstr test_getstr test_instr test_inwstr test_opaque testcurs view xmas
+newwin_sp			lib: ncurses
+nl				test: demo_forms dup_field move_field ncurses rain testcurs
+nl_sp				lib: ncurses
+nocbreak			test: testcurs
+nocbreak_sp			test: sp_tinfo
+nodelay				test: demo_new_pair ditto extended_color firework gdc lrtest ncurses newdemo padview rain tclock test_opaque view worm xmas
+noecho				test: back_ground background bs cardfile chgat clip_printw color_content color_set combine demo_altkeys demo_defkey demo_forms demo_keyok demo_menus demo_new_pair demo_panels demo_tabs ditto dup_field extended_color firework firstlast foldkeys form_driver_w gdc hanoi hashtest inch_wide inchs ins_wide insdelln inserts knight lrtest move_field movewindow ncurses padview pair_content picsmap rain redraw savescreen tclock test_add_wchstr test_addchstr test_addstr test_addwstr test_delwin test_get_wstr test_getstr test_instr test_inwstr test_mouse test_opaque test_unget_wch testcurs view worm xmas
+noecho_sp			lib: ncurses
+nofilter			-
+nofilter_sp			-
+nonl				test: bs demo_forms dup_field hashtest move_field movewindow ncurses padview test_mouse view worm xmas
+nonl_sp				lib: ncurses
+noqiflush			-
+noqiflush_sp			test: sp_tinfo
+noraw				test: demo_forms demo_menus dup_field move_field ncurses testcurs
+noraw_sp			test: sp_tinfo
+notimeout			test: ncurses test_opaque
+numcodes			test: demo_termcap test_arrays progs: dump_entry
+numfnames			test: demo_terminfo test_arrays progs: dump_entry
+numnames			test: demo_terminfo test_arrays progs: dump_entry infocmp
+ospeed				test: demo_termcap progs: tset
+overlay				test: ncurses testcurs xmas
+overwrite			test: ncurses savescreen
+pair_content			test: back_ground background color_set pair_content
+pair_content_sp			lib: ncurses
+pecho_wchar			-
+pechochar			-
+pnoutrefresh			test: ncurses padview popup_msg
+prefresh			test: testcurs
+printw				test: back_ground background blue bs color_content color_set combine demo_altkeys demo_defkey demo_keyok demo_tabs extended_color filter foldkeys ncurses pair_content savescreen test_delwin test_unget_wch testcurs testscanw view
+putp				test: filter test_mouse test_sgr progs: tput
+putp_sp				test: sp_tinfo
+putwin				test: ncurses
+qiflush				-
+qiflush_sp			test: sp_tinfo
+raw				test: demo_forms dup_field move_field ncurses redraw testcurs
+raw_sp				test: sp_tinfo
+redrawwin			test: combine padview redraw view
+refresh				test: blue bs color_content demo_defkey demo_forms demo_keyok demo_menus demo_panels demo_tabs dots_curses dots_mvcur dots_xcurses dup_field echochar filter firstlast form_driver_w gdc hanoi hashtest lrtest move_field movewindow ncurses pair_content picsmap savescreen tclock test_delwin test_mouse testcurs view xmas
+reset_color_pairs		test: picsmap
+reset_color_pairs_sp		-
+reset_prog_mode			test: filter ncurses
+reset_prog_mode_sp		test: sp_tinfo
+reset_shell_mode		test: bs filter savescreen test_setupterm
+reset_shell_mode_sp		test: sp_tinfo
+resetty				-
+resetty_sp			test: sp_tinfo
+resize_term			-
+resize_term_sp			-
+resizeterm			-
+resizeterm_sp			lib: ncurses
+restartterm			test: test_setupterm
+restartterm_sp			-
+ripoffline			test: demo_menus ncurses
+ripoffline_sp			-
+savetty				-
+savetty_sp			test: sp_tinfo
+scanw				test: testcurs testscanw
+scr_dump			test: combine savescreen
+scr_init			test: savescreen
+scr_init_sp			-
+scr_restore			test: savescreen
+scr_restore_sp			-
+scr_set				test: savescreen
+scr_set_sp			-
+scrl				test: view
+scroll				test: testcurs
+scrollok			test: clip_printw color_content demo_altkeys demo_defkey demo_keyok demo_new_pair demo_panels ditto foldkeys hashtest knight ncurses pair_content picsmap redraw test_delwin test_opaque test_unget_wch testcurs testscanw view
+set_curterm			test: list_keys sp_tinfo
+set_curterm_sp			test: sp_tinfo
+set_escdelay			test: test_opaque
+set_escdelay_sp			lib: ncurses
+set_tabsize			test: demo_tabs test_opaque
+set_tabsize_sp			test: sp_tinfo
+set_term			lib: ncurses
+setcchar			test: back_ground combine demo_new_pair demo_panels ins_wide ncurses picsmap savescreen test_add_wchstr test_addwstr
+setscrreg			test: view
+setupterm			test: demo_terminfo dots list_keys sp_tinfo test_mouse test_setupterm test_sgr test_termattrs test_tparm test_vid_puts test_vidputs progs: clear tabs tput tset
+slk_attr			-
+slk_attr_off			-
+slk_attr_on			-
+slk_attr_set			test: ncurses
+slk_attr_set_sp			-
+slk_attr_sp			-
+slk_attroff			lib: ncurses
+slk_attroff_sp			-
+slk_attron			lib: ncurses
+slk_attron_sp			-
+slk_attrset			test: extended_color ncurses
+slk_attrset_sp			-
+slk_clear			test: ncurses
+slk_clear_sp			-
+slk_color			test: ncurses
+slk_color_sp			-
+slk_init			test: extended_color ncurses
+slk_init_sp			-
+slk_label			test: ncurses
+slk_label_sp			-
+slk_noutrefresh			test: extended_color ncurses
+slk_noutrefresh_sp		-
+slk_refresh			test: ncurses
+slk_refresh_sp			lib: ncurses
+slk_restore			test: ncurses
+slk_restore_sp			lib: ncurses
+slk_set				test: extended_color ncurses
+slk_set_sp			-
+slk_touch			test: extended_color ncurses
+slk_touch_sp			lib: ncurses
+slk_wset			test: ncurses
+standend			test: blue gdc ncurses
+standout			test: blue ncurses
+start_color			test: back_ground background blue bs cardfile chgat clip_printw color_content color_set demo_forms demo_menus demo_new_pair demo_panels dots_curses dots_xcurses dup_field echochar extended_color filter firework gdc hanoi ins_wide insdelln inserts knight move_field ncurses newdemo padview pair_content picsmap rain savescreen tclock test_add_wchstr test_addchstr test_addstr test_addwstr testaddch testcurs view worm xmas
+start_color_sp			-
+stdscr				test: back_ground background bs chgat clip_printw color_content combine demo_altkeys demo_forms demo_menus demo_new_pair demo_panels ditto dup_field edit_field extended_color filter firework foldkeys form_driver_w gdc hanoi hashtest inch_wide inchs ins_wide insdelln inserts key_names keynames knight lrtest move_field movewindow ncurses padview pair_content picsmap rain redraw savescreen tclock test_add_wchstr test_addchstr test_addstr test_addwstr test_delwin test_get_wstr test_getstr test_instr test_inwstr test_mouse test_opaque test_unget_wch testcurs testscanw view worm xmas
+strcodes			test: demo_termcap test_arrays progs: dump_entry
+strfnames			test: demo_terminfo list_keys test_arrays progs: dump_entry
+strnames			test: demo_terminfo foldkeys list_keys test_arrays test_tparm progs: dump_entry infocmp tic
+subpad				test: testcurs
+subwin				test: movewindow ncurses newdemo testcurs
+syncok				test: test_opaque
+term_attrs			test: ncurses test_termattrs
+term_attrs_sp			-
+termattrs			test: ncurses test_termattrs testcurs
+termattrs_sp			lib: ncurses
+termname			test: list_keys ncurses testcurs
+termname_sp			test: sp_tinfo
+tgetent				test: demo_termcap dots_termcap railroad
+tgetent_sp			test: sp_tinfo
+tgetflag			test: demo_termcap
+tgetflag_sp			test: sp_tinfo
+tgetnum				test: demo_termcap dots_termcap railroad
+tgetnum_sp			test: sp_tinfo
+tgetstr				test: demo_termcap dots_termcap railroad
+tgetstr_sp			test: sp_tinfo
+tgoto				test: dots_termcap railroad progs: tic
+tigetflag			test: demo_terminfo savescreen progs: tic tput
+tigetflag_sp			test: sp_tinfo
+tigetnum			test: demo_tabs demo_terminfo dots dots_mvcur ncurses savescreen progs: tput
+tigetnum_sp			test: sp_tinfo
+tigetstr			test: blue demo_defkey demo_new_pair demo_terminfo foldkeys list_keys savescreen test_mouse test_sgr test_tparm testcurs progs: clear_cmd tic tput
+tigetstr_sp			test: sp_tinfo
+timeout				test: filter rain savescreen
+tiparm				-
+touchline			test: chgat clip_printw insdelln
+touchwin			test: chgat clip_printw demo_menus filter firstlast inch_wide inchs ins_wide insdelln inserts movewindow ncurses popup_msg redraw test_add_wchstr test_addchstr test_addstr test_addwstr test_delwin test_get_wstr test_getstr test_instr test_inwstr test_opaque xmas
+tparm				test: dots dots_mvcur test_mouse test_sgr test_tparm progs: tic tput
+tputs				test: dots dots_mvcur dots_termcap railroad test_tparm test_vid_puts test_vidputs progs: clear_cmd reset_cmd tabs
+tputs_sp			test: sp_tinfo
+trace				-
+ttytype				test: demo_terminfo test_sgr
+typeahead			test: testcurs
+typeahead_sp			test: sp_tinfo
+unctrl				test: ncurses redraw test_add_wchstr test_addchstr test_mouse testcurs
+unctrl_sp			test: sp_tinfo
+unget_wch			test: test_unget_wch
+unget_wch_sp			-
+ungetch				test: bs knight test_unget_wch
+ungetch_sp			lib: ncurses
+ungetmouse			lib: menu
+ungetmouse_sp			-
+untouchwin			lib: form
+use_default_colors		test: back_ground background dots_curses dots_xcurses filter firework gdc hanoi knight ncurses picsmap rain tclock worm xmas
+use_default_colors_sp		-
+use_env				test: dots dots_curses dots_mvcur dots_xcurses ncurses progs: clear tput
+use_env_sp			test: sp_tinfo
+use_extended_names		test: demo_termcap demo_terminfo list_keys progs: infocmp tic
+use_legacy_coding		-
+use_legacy_coding_sp		-
+use_screen			test: ditto
+use_tioctl			test: ncurses progs: clear tput
+use_tioctl_sp			test: sp_tinfo
+use_window			test: rain worm
+vid_attr			test: test_vid_puts
+vid_attr_sp			-
+vid_puts			test: test_vid_puts
+vid_puts_sp			lib: ncurses
+vidattr				test: test_vidputs
+vidattr_sp			-
+vidputs				test: test_vidputs
+vidputs_sp			-
+vline				test: gdc ncurses
+vline_set			-
+vw_printw			test: clip_printw movewindow test_mouse
+vw_scanw			-
+vwprintw			-
+vwscanw				-
+wadd_wch			test: inch_wide ncurses test_add_wchstr test_addwstr
+wadd_wchnstr			test: savescreen test_add_wchstr
+wadd_wchstr			test: test_add_wchstr
+waddch				test: demo_forms demo_panels ditto firstlast inch_wide inchs knight ncurses padview popup_msg redraw test_add_wchstr test_addchstr test_addstr test_addwstr test_get_wstr test_getstr test_instr test_inwstr test_opaque view worm
+waddchnstr			test: test_addchstr
+waddchstr			test: test_addchstr
+waddnstr			test: demo_forms test_addstr
+waddnwstr			test: ncurses test_addwstr
+waddstr				test: chgat clip_printw demo_forms demo_panels firstlast ins_wide insdelln knight ncurses popup_msg redraw test_add_wchstr test_addstr test_addwstr testcurs
+waddwstr			test: ins_wide ncurses padview test_add_wchstr test_addwstr test_get_wstr view
+wattr_get			test: ncurses
+wattr_off			lib: ncurses
+wattr_on			lib: ncurses
+wattr_set			test: ncurses
+wattroff			test: demo_forms ncurses testcurs xmas
+wattron				test: testcurs xmas
+wattrset			test: clip_printw demo_forms insdelln ncurses newdemo padview test_get_wstr test_getstr testcurs xmas
+wbkgd				test: cardfile demo_forms demo_menus ncurses newdemo padview testcurs
+wbkgdset			test: demo_panels ins_wide inserts ncurses test_add_wchstr test_addchstr test_addstr test_addwstr
+wbkgrnd				lib: ncurses
+wbkgrndset			lib: ncurses
+wborder				test: ncurses
+wborder_set			test: ncurses
+wchgat				test: chgat test_get_wstr test_getstr view
+wclear				test: ncurses test_opaque testcurs
+wclrtobot			test: firstlast inch_wide inchs ncurses test_delwin test_instr test_inwstr testcurs
+wclrtoeol			test: chgat clip_printw demo_defkey demo_keyok demo_menus demo_panels firstlast inch_wide inchs ins_wide insdelln inserts knight ncurses test_add_wchstr test_addchstr test_addstr test_addwstr test_instr test_inwstr testcurs
+wcolor_set			lib: ncurses
+wcursyncup			lib: form
+wdelch				test: ncurses testcurs
+wdeleteln			test: insdelln testcurs
+wecho_wchar			lib: ncurses
+wechochar			lib: ncurses
+wenclose			test: ncurses
+werase				test: cardfile demo_forms demo_menus demo_panels dup_field firstlast knight move_field ncurses newdemo popup_msg test_get_wstr test_getstr test_opaque testcurs view xmas
+wget_wch			test: ins_wide ncurses test_add_wchstr test_addwstr
+wget_wstr			test: test_get_wstr
+wgetbkgrnd			lib: ncurses
+wgetch				test: cardfile chgat clip_printw demo_defkey demo_keyok demo_menus demo_panels ditto dump_window dup_field edit_field gdc insdelln inserts knight move_field movewindow ncurses newdemo popup_msg rain redraw test_addchstr test_addstr test_delwin test_opaque testcurs worm
+wgetdelay			test: test_opaque
+wgetn_wstr			test: ncurses test_get_wstr
+wgetnstr			test: ncurses test_getstr
+wgetparent			test: test_opaque
+wgetscrreg			test: test_opaque
+wgetstr				test: test_getstr
+whline				test: testcurs
+whline_set			lib: ncurses
+win_wch				test: inch_wide savescreen
+win_wchnstr			test: inch_wide view
+win_wchstr			test: inch_wide
+winch				test: inchs knight testcurs
+winchnstr			test: inchs
+winchstr			test: inchs
+winnstr				test: demo_altkeys demo_defkey foldkeys test_instr
+winnwstr			test: test_inwstr
+wins_nwstr			test: ins_wide
+wins_wch			test: ins_wide
+wins_wstr			test: ins_wide
+winsch				test: ins_wide inserts testcurs
+winsdelln			test: insdelln
+winsertln			test: insdelln testcurs
+winsnstr			test: inserts
+winsstr				test: inserts
+winstr				test: test_instr
+winwstr				test: test_inwstr
+wmouse_trafo			test: ncurses
+wmove				test: chgat clip_printw demo_altkeys demo_defkey demo_keyok demo_menus demo_panels dump_window extended_color firstlast foldkeys inch_wide inchs ins_wide insdelln inserts knight movewindow ncurses newdemo padview picsmap redraw savescreen test_add_wchstr test_addchstr test_addstr test_addwstr test_get_wstr test_getstr test_instr test_inwstr test_mouse test_opaque testcurs view worm
+wnoutrefresh			test: demo_menus ditto inch_wide inchs ins_wide inserts knight movewindow ncurses padview popup_msg redraw test_add_wchstr test_addchstr test_addstr test_addwstr test_get_wstr test_getstr test_instr test_inwstr test_opaque
+wprintw				test: chgat clip_printw demo_defkey demo_forms demo_keyok demo_menus demo_panels inch_wide inchs ins_wide insdelln inserts knight ncurses test_add_wchstr test_addchstr test_addstr test_addwstr test_get_wstr test_getstr test_instr test_inwstr test_mouse test_opaque testcurs
+wredrawln			test: redraw
+wrefresh			test: chgat clip_printw demo_forms demo_keyok demo_menus demo_panels dup_field firstlast ins_wide insdelln inserts knight lrtest move_field movewindow ncurses newdemo popup_msg redraw savescreen tclock test_add_wchstr test_addchstr test_addstr test_addwstr test_delwin testcurs worm xmas
+wresize				test: cardfile demo_menus ncurses
+wscanw				test: testcurs
+wscrl				test: ncurses testcurs
+wsetscrreg			test: ncurses test_delwin testcurs
+wstandend			test: ncurses test_opaque xmas
+wstandout			test: ncurses test_opaque xmas
+wsyncdown			test: movewindow
+wsyncup				lib: form
+wtimeout			test: ncurses
+wtouchln			lib: ncurses
+wunctrl				lib: ncurses
+wunctrl_sp			-
+wvline				test: testcurs
+wvline_set			lib: ncurses
+
+libpanel:
+--------
+bottom_panel			test: demo_panels ncurses
+ceiling_panel			-
+del_panel			test: demo_panels ncurses
+ground_panel			-
+hide_panel			test: demo_panels ncurses
+move_panel			test: demo_panels ncurses
+new_panel			test: cardfile demo_panels ncurses
+panel_above			test: demo_panels
+panel_below			test: demo_panels
+panel_hidden			test: demo_panels
+panel_userptr			test: demo_panels ncurses
+panel_window			test: cardfile demo_panels ncurses
+replace_panel			test: demo_panels
+set_panel_userptr		test: demo_panels ncurses
+show_panel			test: demo_panels ncurses
+top_panel			test: cardfile demo_panels ncurses
+update_panels			test: cardfile demo_panels ncurses
+update_panels_sp		-
+
+-- vile:txtmode
diff --git a/test/aclocal.m4 b/test/aclocal.m4
new file mode 100644
index 0000000..88df01a
--- /dev/null
+++ b/test/aclocal.m4
@@ -0,0 +1,4881 @@
+dnl***************************************************************************
+dnl Copyright 2018-2021,2022 Thomas E. Dickey                                *
+dnl Copyright 2003-2017,2018 Free Software Foundation, Inc.                  *
+dnl                                                                          *
+dnl Permission is hereby granted, free of charge, to any person obtaining a  *
+dnl copy of this software and associated documentation files (the            *
+dnl "Software"), to deal in the Software without restriction, including      *
+dnl without limitation the rights to use, copy, modify, merge, publish,      *
+dnl distribute, distribute with modifications, sublicense, and/or sell       *
+dnl copies of the Software, and to permit persons to whom the Software is    *
+dnl furnished to do so, subject to the following conditions:                 *
+dnl                                                                          *
+dnl The above copyright notice and this permission notice shall be included  *
+dnl in all copies or substantial portions of the Software.                   *
+dnl                                                                          *
+dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
+dnl OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
+dnl MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
+dnl IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
+dnl DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
+dnl OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
+dnl THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
+dnl                                                                          *
+dnl Except as contained in this notice, the name(s) of the above copyright   *
+dnl holders shall not be used in advertising or otherwise to promote the     *
+dnl sale, use or other dealings in this Software without prior written       *
+dnl authorization.                                                           *
+dnl***************************************************************************
+dnl
+dnl $Id: aclocal.m4,v 1.208 2022/10/02 23:55:56 tom Exp $
+dnl
+dnl Author: Thomas E. Dickey
+dnl
+dnl Macros used in NCURSES test programs auto-configuration script.
+dnl
+dnl These macros are maintained separately from NCURSES.  The copyright on
+dnl this file applies to the aggregation of macros and does not affect use of
+dnl these macros in other applications.
+dnl
+dnl See these pages for additional information:
+dnl		https://invisible-island.net/autoconf/
+dnl		https://invisible-island.net/autoconf/my-autoconf.html
+dnl
+dnl ---------------------------------------------------------------------------
+dnl ---------------------------------------------------------------------------
+dnl AM_LANGINFO_CODESET version: 6 updated: 2021/01/01 16:53:59
+dnl -------------------
+dnl Inserted as requested by gettext 0.10.40
+dnl File from /usr/share/aclocal
+dnl codeset.m4
+dnl ====================
+dnl serial AM1
+dnl
+dnl From Bruno Haible.
+AC_DEFUN([AM_LANGINFO_CODESET],
+[
+AC_CACHE_CHECK([for nl_langinfo and CODESET], am_cv_langinfo_codeset,
+	[AC_TRY_LINK([#include <langinfo.h>],
+	[char* cs = nl_langinfo(CODESET); (void)cs],
+	am_cv_langinfo_codeset=yes,
+	am_cv_langinfo_codeset=no)
+	])
+	if test "$am_cv_langinfo_codeset" = yes; then
+		AC_DEFINE(HAVE_LANGINFO_CODESET, 1,
+		[Define if you have <langinfo.h> and nl_langinfo(CODESET).])
+	fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ACVERSION_CHECK version: 5 updated: 2014/06/04 19:11:49
+dnl ------------------
+dnl Conditionally generate script according to whether we're using a given autoconf.
+dnl
+dnl $1 = version to compare against
+dnl $2 = code to use if AC_ACVERSION is at least as high as $1.
+dnl $3 = code to use if AC_ACVERSION is older than $1.
+define([CF_ACVERSION_CHECK],
+[
+ifdef([AC_ACVERSION], ,[ifdef([AC_AUTOCONF_VERSION],[m4_copy([AC_AUTOCONF_VERSION],[AC_ACVERSION])],[m4_copy([m4_PACKAGE_VERSION],[AC_ACVERSION])])])dnl
+ifdef([m4_version_compare],
+[m4_if(m4_version_compare(m4_defn([AC_ACVERSION]), [$1]), -1, [$3], [$2])],
+[CF_ACVERSION_COMPARE(
+AC_PREREQ_CANON(AC_PREREQ_SPLIT([$1])),
+AC_PREREQ_CANON(AC_PREREQ_SPLIT(AC_ACVERSION)), AC_ACVERSION, [$2], [$3])])])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ACVERSION_COMPARE version: 3 updated: 2012/10/03 18:39:53
+dnl --------------------
+dnl CF_ACVERSION_COMPARE(MAJOR1, MINOR1, TERNARY1,
+dnl                      MAJOR2, MINOR2, TERNARY2,
+dnl                      PRINTABLE2, not FOUND, FOUND)
+define([CF_ACVERSION_COMPARE],
+[ifelse(builtin([eval], [$2 < $5]), 1,
+[ifelse([$8], , ,[$8])],
+[ifelse([$9], , ,[$9])])])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ADD_CFLAGS version: 15 updated: 2020/12/31 10:54:15
+dnl -------------
+dnl Copy non-preprocessor flags to $CFLAGS, preprocessor flags to $CPPFLAGS
+dnl $1 = flags to add
+dnl $2 = if given makes this macro verbose.
+dnl
+dnl Put any preprocessor definitions that use quoted strings in $EXTRA_CPPFLAGS,
+dnl to simplify use of $CPPFLAGS in compiler checks, etc., that are easily
+dnl confused by the quotes (which require backslashes to keep them usable).
+AC_DEFUN([CF_ADD_CFLAGS],
+[
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $1
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[[^=]]*='\''\"[[^"]]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+				CF_APPEND_TEXT(cf_new_extra_cppflags,$cf_add_cflags)
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+				CF_APPEND_TEXT(cf_new_extra_cppflags,$cf_add_cflags)
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+				CF_REMOVE_DEFINE(CPPFLAGS,$CPPFLAGS,$cf_tst_cppflags)
+				;;
+			esac
+			CF_APPEND_TEXT(cf_new_cppflags,$cf_add_cflags)
+			;;
+		esac
+		;;
+	(*)
+		CF_APPEND_TEXT(cf_new_cflags,$cf_add_cflags)
+		;;
+	esac
+	;;
+(yes)
+	CF_APPEND_TEXT(cf_new_extra_cppflags,$cf_add_cflags)
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[[^"]]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+	ifelse([$2],,,[CF_VERBOSE(add to \$CFLAGS $cf_new_cflags)])
+	CF_APPEND_TEXT(CFLAGS,$cf_new_cflags)
+fi
+
+if test -n "$cf_new_cppflags" ; then
+	ifelse([$2],,,[CF_VERBOSE(add to \$CPPFLAGS $cf_new_cppflags)])
+	CF_APPEND_TEXT(CPPFLAGS,$cf_new_cppflags)
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+	ifelse([$2],,,[CF_VERBOSE(add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags)])
+	CF_APPEND_TEXT(EXTRA_CPPFLAGS,$cf_new_extra_cppflags)
+fi
+
+AC_SUBST(EXTRA_CPPFLAGS)
+
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ADD_INCDIR version: 17 updated: 2021/09/04 06:35:04
+dnl -------------
+dnl Add an include-directory to $CPPFLAGS.  Don't add /usr/include, since it is
+dnl redundant.  We don't normally need to add -I/usr/local/include for gcc,
+dnl but old versions (and some misinstalled ones) need that.  To make things
+dnl worse, gcc 3.x may give error messages if -I/usr/local/include is added to
+dnl the include-path).
+AC_DEFUN([CF_ADD_INCDIR],
+[
+if test -n "$1" ; then
+  for cf_add_incdir in $1
+  do
+	while test "$cf_add_incdir" != /usr/include
+	do
+	  if test -d "$cf_add_incdir"
+	  then
+		cf_have_incdir=no
+		if test -n "$CFLAGS$CPPFLAGS" ; then
+		  # a loop is needed to ensure we can add subdirs of existing dirs
+		  for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+			if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+			  cf_have_incdir=yes; break
+			fi
+		  done
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  if test "$cf_add_incdir" = /usr/local/include ; then
+			if test "$GCC" = yes
+			then
+			  cf_save_CPPFLAGS=$CPPFLAGS
+			  CF_APPEND_TEXT(CPPFLAGS,-I$cf_add_incdir)
+			  AC_TRY_COMPILE([#include <stdio.h>],
+				  [printf("Hello")],
+				  [],
+				  [cf_have_incdir=yes])
+			  CPPFLAGS=$cf_save_CPPFLAGS
+			fi
+		  fi
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  CF_VERBOSE(adding $cf_add_incdir to include-path)
+		  ifelse([$2],,CPPFLAGS,[$2])="$ifelse([$2],,CPPFLAGS,[$2]) -I$cf_add_incdir"
+
+		  cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+		  test "$cf_top_incdir" = "$cf_add_incdir" && break
+		  cf_add_incdir="$cf_top_incdir"
+		else
+		  break
+		fi
+	  else
+		break
+	  fi
+	done
+  done
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ADD_LIB version: 2 updated: 2010/06/02 05:03:05
+dnl ----------
+dnl Add a library, used to enforce consistency.
+dnl
+dnl $1 = library to add, without the "-l"
+dnl $2 = variable to update (default $LIBS)
+AC_DEFUN([CF_ADD_LIB],[CF_ADD_LIBS(-l$1,ifelse($2,,LIBS,[$2]))])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ADD_LIBDIR version: 11 updated: 2020/12/31 20:19:42
+dnl -------------
+dnl	Adds to the library-path
+dnl
+dnl	Some machines have trouble with multiple -L options.
+dnl
+dnl $1 is the (list of) directory(s) to add
+dnl $2 is the optional name of the variable to update (default LDFLAGS)
+dnl
+AC_DEFUN([CF_ADD_LIBDIR],
+[
+if test -n "$1" ; then
+	for cf_add_libdir in $1
+	do
+		if test "$cf_add_libdir" = /usr/lib ; then
+			:
+		elif test -d "$cf_add_libdir"
+		then
+			cf_have_libdir=no
+			if test -n "$LDFLAGS$LIBS" ; then
+				# a loop is needed to ensure we can add subdirs of existing dirs
+				for cf_test_libdir in $LDFLAGS $LIBS ; do
+					if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+						cf_have_libdir=yes; break
+					fi
+				done
+			fi
+			if test "$cf_have_libdir" = no ; then
+				CF_VERBOSE(adding $cf_add_libdir to library-path)
+				ifelse([$2],,LDFLAGS,[$2])="-L$cf_add_libdir $ifelse([$2],,LDFLAGS,[$2])"
+			fi
+		fi
+	done
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ADD_LIBS version: 3 updated: 2019/11/02 16:47:33
+dnl -----------
+dnl Add one or more libraries, used to enforce consistency.  Libraries are
+dnl prepended to an existing list, since their dependencies are assumed to
+dnl already exist in the list.
+dnl
+dnl $1 = libraries to add, with the "-l", etc.
+dnl $2 = variable to update (default $LIBS)
+AC_DEFUN([CF_ADD_LIBS],[
+cf_add_libs="[$]ifelse($2,,LIBS,[$2])"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $1; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+ifelse($2,,LIBS,[$2])="$cf_add_libs"
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ADD_LIB_AFTER version: 3 updated: 2013/07/09 21:27:22
+dnl ----------------
+dnl Add a given library after another, e.g., following the one it satisfies a
+dnl dependency for.
+dnl
+dnl $1 = the first library
+dnl $2 = its dependency
+AC_DEFUN([CF_ADD_LIB_AFTER],[
+CF_VERBOSE(...before $LIBS)
+LIBS=`echo "$LIBS" | sed -e "s/[[ 	]][[ 	]]*/ /g" -e "s%$1 %$1 $2 %" -e 's%  % %g'`
+CF_VERBOSE(...after  $LIBS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ADD_SUBDIR_PATH version: 5 updated: 2020/12/31 20:19:42
+dnl ------------------
+dnl Append to a search-list for a nonstandard header/lib-file
+dnl	$1 = the variable to return as result
+dnl	$2 = the package name
+dnl	$3 = the subdirectory, e.g., bin, include or lib
+dnl $4 = the directory under which we will test for subdirectories
+dnl $5 = a directory that we do not want $4 to match
+AC_DEFUN([CF_ADD_SUBDIR_PATH],
+[
+test "x$4" != "x$5" && \
+test -d "$4" && \
+ifelse([$5],NONE,,[{ test -z "$5" || test "x$5" = xNONE || test "x$4" != "x$5"; } &&]) {
+	test -n "$verbose" && echo "	... testing for $3-directories under $4"
+	test -d "$4/$3" &&          $1="[$]$1 $4/$3"
+	test -d "$4/$3/$2" &&       $1="[$]$1 $4/$3/$2"
+	test -d "$4/$3/$2/$3" &&    $1="[$]$1 $4/$3/$2/$3"
+	test -d "$4/$2/$3" &&       $1="[$]$1 $4/$2/$3"
+	test -d "$4/$2/$3/$2" &&    $1="[$]$1 $4/$2/$3/$2"
+}
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_APPEND_CFLAGS version: 3 updated: 2021/09/05 17:25:40
+dnl ----------------
+dnl Use CF_ADD_CFLAGS after first checking for potential redefinitions.
+dnl $1 = flags to add
+dnl $2 = if given makes this macro verbose.
+define([CF_APPEND_CFLAGS],
+[
+for cf_add_cflags in $1
+do
+	case "x$cf_add_cflags" in
+	(x-[[DU]]*)
+		CF_REMOVE_CFLAGS($cf_add_cflags,CFLAGS,[$2])
+		CF_REMOVE_CFLAGS($cf_add_cflags,CPPFLAGS,[$2])
+		;;
+	esac
+	CF_ADD_CFLAGS([$cf_add_cflags],[$2])
+done
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_APPEND_TEXT version: 1 updated: 2017/02/25 18:58:55
+dnl --------------
+dnl use this macro for appending text without introducing an extra blank at
+dnl the beginning
+define([CF_APPEND_TEXT],
+[
+	test -n "[$]$1" && $1="[$]$1 "
+	$1="[$]{$1}$2"
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ARG_DISABLE version: 3 updated: 1999/03/30 17:24:31
+dnl --------------
+dnl Allow user to disable a normally-on option.
+AC_DEFUN([CF_ARG_DISABLE],
+[CF_ARG_OPTION($1,[$2],[$3],[$4],yes)])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ARG_ENABLE version: 3 updated: 1999/03/30 17:24:31
+dnl -------------
+dnl Allow user to enable a normally-off option.
+AC_DEFUN([CF_ARG_ENABLE],
+[CF_ARG_OPTION($1,[$2],[$3],[$4],no)])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ARG_OPTION version: 5 updated: 2015/05/10 19:52:14
+dnl -------------
+dnl Restricted form of AC_ARG_ENABLE that ensures user doesn't give bogus
+dnl values.
+dnl
+dnl Parameters:
+dnl $1 = option name
+dnl $2 = help-string
+dnl $3 = action to perform if option is not default
+dnl $4 = action if perform if option is default
+dnl $5 = default option value (either 'yes' or 'no')
+AC_DEFUN([CF_ARG_OPTION],
+[AC_ARG_ENABLE([$1],[$2],[test "$enableval" != ifelse([$5],no,yes,no) && enableval=ifelse([$5],no,no,yes)
+	if test "$enableval" != "$5" ; then
+ifelse([$3],,[    :]dnl
+,[    $3]) ifelse([$4],,,[
+	else
+		$4])
+	fi],[enableval=$5 ifelse([$4],,,[
+	$4
+])dnl
+])])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_C11_NORETURN version: 3 updated: 2021/03/28 11:36:23
+dnl ---------------
+AC_DEFUN([CF_C11_NORETURN],
+[
+AC_MSG_CHECKING(if you want to use C11 _Noreturn feature)
+CF_ARG_ENABLE(stdnoreturn,
+	[  --enable-stdnoreturn    enable C11 _Noreturn feature for diagnostics],
+	[enable_stdnoreturn=yes],
+	[enable_stdnoreturn=no])
+AC_MSG_RESULT($enable_stdnoreturn)
+
+if test $enable_stdnoreturn = yes; then
+AC_CACHE_CHECK([for C11 _Noreturn feature], cf_cv_c11_noreturn,
+	[AC_TRY_COMPILE([
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdnoreturn.h>
+static _Noreturn void giveup(void) { exit(0); }
+	],
+	[if (feof(stdin)) giveup()],
+	cf_cv_c11_noreturn=yes,
+	cf_cv_c11_noreturn=no)
+	])
+else
+	cf_cv_c11_noreturn=no,
+fi
+
+if test "$cf_cv_c11_noreturn" = yes; then
+	AC_DEFINE(HAVE_STDNORETURN_H, 1,[Define if <stdnoreturn.h> header is available and working])
+	AC_DEFINE_UNQUOTED(STDC_NORETURN,_Noreturn,[Define if C11 _Noreturn keyword is supported])
+	HAVE_STDNORETURN_H=1
+else
+	HAVE_STDNORETURN_H=0
+fi
+
+AC_SUBST(HAVE_STDNORETURN_H)
+AC_SUBST(STDC_NORETURN)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CC_ENV_FLAGS version: 10 updated: 2020/12/31 18:40:20
+dnl ---------------
+dnl Check for user's environment-breakage by stuffing CFLAGS/CPPFLAGS content
+dnl into CC.  This will not help with broken scripts that wrap the compiler
+dnl with options, but eliminates a more common category of user confusion.
+dnl
+dnl In particular, it addresses the problem of being able to run the C
+dnl preprocessor in a consistent manner.
+dnl
+dnl Caveat: this also disallows blanks in the pathname for the compiler, but
+dnl the nuisance of having inconsistent settings for compiler and preprocessor
+dnl outweighs that limitation.
+AC_DEFUN([CF_CC_ENV_FLAGS],
+[
+# This should have been defined by AC_PROG_CC
+: "${CC:=cc}"
+
+AC_MSG_CHECKING(\$CFLAGS variable)
+case "x$CFLAGS" in
+(*-[[IUD]]*)
+	AC_MSG_RESULT(broken)
+	AC_MSG_WARN(your environment uses the CFLAGS variable to hold CPPFLAGS options)
+	cf_flags="$CFLAGS"
+	CFLAGS=
+	for cf_arg in $cf_flags
+	do
+		CF_ADD_CFLAGS($cf_arg)
+	done
+	;;
+(*)
+	AC_MSG_RESULT(ok)
+	;;
+esac
+
+AC_MSG_CHECKING(\$CC variable)
+case "$CC" in
+(*[[\ \	]]-*)
+	AC_MSG_RESULT(broken)
+	AC_MSG_WARN(your environment uses the CC variable to hold CFLAGS/CPPFLAGS options)
+	# humor him...
+	cf_prog=`echo "$CC" | sed -e 's/	/ /g' -e 's/[[ ]]* / /g' -e 's/[[ ]]*[[ ]]-[[^ ]].*//'`
+	cf_flags=`echo "$CC" | ${AWK:-awk} -v prog="$cf_prog" '{ printf("%s", [substr]([$]0,1+length(prog))); }'`
+	CC="$cf_prog"
+	for cf_arg in $cf_flags
+	do
+		case "x$cf_arg" in
+		(x-[[IUDfgOW]]*)
+			CF_ADD_CFLAGS($cf_arg)
+			;;
+		(*)
+			CC="$CC $cf_arg"
+			;;
+		esac
+	done
+	CF_VERBOSE(resulting CC: '$CC')
+	CF_VERBOSE(resulting CFLAGS: '$CFLAGS')
+	CF_VERBOSE(resulting CPPFLAGS: '$CPPFLAGS')
+	;;
+(*)
+	AC_MSG_RESULT(ok)
+	;;
+esac
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CHECK_CACHE version: 13 updated: 2020/12/31 10:54:15
+dnl --------------
+dnl Check if we're accidentally using a cache from a different machine.
+dnl Derive the system name, as a check for reusing the autoconf cache.
+dnl
+dnl If we've packaged config.guess and config.sub, run that (since it does a
+dnl better job than uname).  Normally we'll use AC_CANONICAL_HOST, but allow
+dnl an extra parameter that we may override, e.g., for AC_CANONICAL_SYSTEM
+dnl which is useful in cross-compiles.
+dnl
+dnl Note: we would use $ac_config_sub, but that is one of the places where
+dnl autoconf 2.5x broke compatibility with autoconf 2.13
+AC_DEFUN([CF_CHECK_CACHE],
+[
+if test -f "$srcdir/config.guess" || test -f "$ac_aux_dir/config.guess" ; then
+	ifelse([$1],,[AC_CANONICAL_HOST],[$1])
+	system_name="$host_os"
+else
+	system_name="`(uname -s -r) 2>/dev/null`"
+	if test -z "$system_name" ; then
+		system_name="`(hostname) 2>/dev/null`"
+	fi
+fi
+test -n "$system_name" && AC_DEFINE_UNQUOTED(SYSTEM_NAME,"$system_name",[Define to the system name.])
+AC_CACHE_VAL(cf_cv_system_name,[cf_cv_system_name="$system_name"])
+
+test -z "$system_name" && system_name="$cf_cv_system_name"
+test -n "$cf_cv_system_name" && AC_MSG_RESULT(Configuring for $cf_cv_system_name)
+
+if test ".$system_name" != ".$cf_cv_system_name" ; then
+	AC_MSG_RESULT(Cached system name ($system_name) does not agree with actual ($cf_cv_system_name))
+	AC_MSG_ERROR("Please remove config.cache and try again.")
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CHECK_CFLAGS version: 4 updated: 2021/01/02 19:22:58
+dnl ---------------
+dnl Conditionally add to $CFLAGS and $CPPFLAGS values which are derived from
+dnl a build-configuration such as imake.  These have the pitfall that they
+dnl often contain compiler-specific options which we cannot use, mixed with
+dnl preprocessor options that we usually can.
+AC_DEFUN([CF_CHECK_CFLAGS],
+[
+CF_VERBOSE(checking additions to CFLAGS)
+cf_check_cflags="$CFLAGS"
+cf_check_cppflags="$CPPFLAGS"
+CF_ADD_CFLAGS($1,yes)
+if test "x$cf_check_cflags" != "x$CFLAGS" ; then
+AC_TRY_LINK([#include <stdio.h>],[printf("Hello world");],,
+	[CF_VERBOSE(test-compile failed.  Undoing change to \$CFLAGS)
+	 if test "x$cf_check_cppflags" != "x$CPPFLAGS" ; then
+		 CF_VERBOSE(but keeping change to \$CPPFLAGS)
+	 fi
+	 CFLAGS="$cf_check_cflags"])
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CHECK_CURSES_LIB version: 4 updated: 2021/09/05 17:25:40
+dnl -------------------
+dnl $1 = nominal library name, used also for header lookup
+dnl $2 = suffix to append to library name
+dnl $3 = function to check for using AC_CHECK_LIB
+dnl $4 = optional parameter list for $3
+AC_DEFUN([CF_CHECK_CURSES_LIB],
+[
+AC_REQUIRE([CF_PKG_CONFIG])
+
+cf_have_curses_lib=no
+
+: ${NCURSES_CONFIG_PKG:=none}
+if test "x${NCURSES_CONFIG_PKG}" = xnone; then
+	:
+elif test "x${PKG_CONFIG:=none}" != xnone; then
+	AC_MSG_CHECKING(pkg-config for $1$2)
+	if "$PKG_CONFIG" --exists "$1$2" ; then
+		AC_MSG_RESULT(yes)
+
+		AC_MSG_CHECKING(if the $1$2 package files work)
+
+		cf_save_CFLAGS="$CFLAGS"
+		cf_save_CPPFLAGS="$CPPFLAGS"
+		cf_save_LIBS="$LIBS"
+
+		CF_APPEND_CFLAGS(`$PKG_CONFIG --cflags "$1$2"`)
+		CF_ADD_LIBS(`$PKG_CONFIG --libs "$1$2"`)
+
+		AC_TRY_LINK([#include <$1.h>],
+			[(void) $3 ( ]ifelse([$4],,,[[$4]])[ );],
+			[AC_TRY_RUN([#include <$1.h>
+				int main(void)
+				{ (void) $3 ( ]ifelse([$4],,,[[$4]])[ ); return 0; }],
+				[cf_have_curses_lib=yes],
+				[cf_have_curses_lib=no],
+				[cf_have_curses_lib=maybe])],
+			[cf_have_curses_lib=no])
+		AC_MSG_RESULT($cf_have_curses_lib)
+		test "$cf_have_curses_lib" = maybe && cf_have_curses_lib=yes
+		if test "$cf_have_curses_lib" = "yes"
+		then
+			CF_UPPER(cf_upper,have_lib$1)
+			AC_DEFINE_UNQUOTED($cf_upper,1)
+		else
+			CFLAGS="$cf_save_CFLAGS"
+			CPPFLAGS="$cf_save_CPPFLAGS"
+			LIBS="$cf_save_LIBS"
+		fi
+	fi
+fi
+if test "$cf_have_curses_lib" = no; then
+	AC_CHECK_LIB($1$2,$3,[
+		CF_UPPER(cf_upper,have_lib$1)
+		CF_ADD_LIBS(-l$1$2)
+		AC_DEFINE_UNQUOTED($cf_upper,1)])
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CLANG_COMPILER version: 8 updated: 2021/01/01 13:31:04
+dnl -----------------
+dnl Check if the given compiler is really clang.  clang's C driver defines
+dnl __GNUC__ (fooling the configure script into setting $GCC to yes) but does
+dnl not ignore some gcc options.
+dnl
+dnl This macro should be run "soon" after AC_PROG_CC or AC_PROG_CPLUSPLUS, to
+dnl ensure that it is not mistaken for gcc/g++.  It is normally invoked from
+dnl the wrappers for gcc and g++ warnings.
+dnl
+dnl $1 = GCC (default) or GXX
+dnl $2 = CLANG_COMPILER (default)
+dnl $3 = CFLAGS (default) or CXXFLAGS
+AC_DEFUN([CF_CLANG_COMPILER],[
+ifelse([$2],,CLANG_COMPILER,[$2])=no
+
+if test "$ifelse([$1],,[$1],GCC)" = yes ; then
+	AC_MSG_CHECKING(if this is really Clang ifelse([$1],GXX,C++,C) compiler)
+	cf_save_CFLAGS="$ifelse([$3],,CFLAGS,[$3])"
+	AC_TRY_COMPILE([],[
+#ifdef __clang__
+#else
+make an error
+#endif
+],[ifelse([$2],,CLANG_COMPILER,[$2])=yes
+],[])
+	ifelse([$3],,CFLAGS,[$3])="$cf_save_CFLAGS"
+	AC_MSG_RESULT($ifelse([$2],,CLANG_COMPILER,[$2]))
+fi
+
+CLANG_VERSION=none
+
+if test "x$ifelse([$2],,CLANG_COMPILER,[$2])" = "xyes" ; then
+	case "$CC" in
+	(c[[1-9]][[0-9]]|*/c[[1-9]][[0-9]])
+		AC_MSG_WARN(replacing broken compiler alias $CC)
+		CFLAGS="$CFLAGS -std=`echo "$CC" | sed -e 's%.*/%%'`"
+		CC=clang
+		;;
+	esac
+
+	AC_MSG_CHECKING(version of $CC)
+	CLANG_VERSION="`$CC --version 2>/dev/null | sed -e '2,$d' -e 's/^.*(CLANG[[^)]]*) //' -e 's/^.*(Debian[[^)]]*) //' -e 's/^[[^0-9.]]*//' -e 's/[[^0-9.]].*//'`"
+	test -z "$CLANG_VERSION" && CLANG_VERSION=unknown
+	AC_MSG_RESULT($CLANG_VERSION)
+
+	for cf_clang_opt in \
+		-Qunused-arguments \
+		-Wno-error=implicit-function-declaration
+	do
+		AC_MSG_CHECKING(if option $cf_clang_opt works)
+		cf_save_CFLAGS="$CFLAGS"
+		CFLAGS="$CFLAGS $cf_clang_opt"
+		AC_TRY_LINK([
+			#include <stdio.h>],[
+			printf("hello!\\n");],[
+			cf_clang_optok=yes],[
+			cf_clang_optok=no])
+		AC_MSG_RESULT($cf_clang_optok)
+		CFLAGS="$cf_save_CFLAGS"
+		if test "$cf_clang_optok" = yes; then
+			CF_VERBOSE(adding option $cf_clang_opt)
+			CF_APPEND_TEXT(CFLAGS,$cf_clang_opt)
+		fi
+	done
+fi
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_CONST_X_STRING version: 7 updated: 2021/06/07 17:39:17
+dnl -----------------
+dnl The X11R4-X11R6 Xt specification uses an ambiguous String type for most
+dnl character-strings.
+dnl
+dnl It is ambiguous because the specification accommodated the pre-ANSI
+dnl compilers bundled by more than one vendor in lieu of providing a standard C
+dnl compiler other than by costly add-ons.  Because of this, the specification
+dnl did not take into account the use of const for telling the compiler that
+dnl string literals would be in readonly memory.
+dnl
+dnl As a workaround, one could (starting with X11R5) define XTSTRINGDEFINES, to
+dnl let the compiler decide how to represent Xt's strings which were #define'd.
+dnl That does not solve the problem of using the block of Xt's strings which
+dnl are compiled into the library (and is less efficient than one might want).
+dnl
+dnl Xt specification 7 introduces the _CONST_X_STRING symbol which is used both
+dnl when compiling the library and compiling using the library, to tell the
+dnl compiler that String is const.
+AC_DEFUN([CF_CONST_X_STRING],
+[
+AC_REQUIRE([AC_PATH_XTRA])
+
+CF_SAVE_XTRA_FLAGS([CF_CONST_X_STRING])
+
+AC_TRY_COMPILE(
+[
+#include <stdlib.h>
+#include <X11/Intrinsic.h>
+],
+[String foo = malloc(1); free((void*)foo)],[
+
+AC_CACHE_CHECK(for X11/Xt const-feature,cf_cv_const_x_string,[
+	AC_TRY_COMPILE(
+		[
+#define _CONST_X_STRING	/* X11R7.8 (perhaps) */
+#undef  XTSTRINGDEFINES	/* X11R5 and later */
+#include <stdlib.h>
+#include <X11/Intrinsic.h>
+		],[String foo = malloc(1); *foo = 0],[
+			cf_cv_const_x_string=no
+		],[
+			cf_cv_const_x_string=yes
+		])
+])
+
+CF_RESTORE_XTRA_FLAGS([CF_CONST_X_STRING])
+
+case "$cf_cv_const_x_string" in
+(no)
+	CF_APPEND_TEXT(CPPFLAGS,-DXTSTRINGDEFINES)
+	;;
+(*)
+	CF_APPEND_TEXT(CPPFLAGS,-D_CONST_X_STRING)
+	;;
+esac
+
+])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CURSES_ACS_MAP version: 8 updated: 2021/01/04 19:45:09
+dnl -----------------
+dnl Check for likely values of acs_map[]:
+AC_DEFUN([CF_CURSES_ACS_MAP],
+[
+AC_REQUIRE([CF_NCURSES_WRAP_PREFIX])dnl
+AC_CACHE_CHECK(for alternate character set array, cf_cv_curses_acs_map,[
+cf_cv_curses_acs_map=unknown
+for name in acs_map _acs_map __acs_map ${NCURSES_WRAP_PREFIX}acs_map
+do
+AC_TRY_LINK([
+#include <${cf_cv_ncurses_header:-curses.h}>
+],[
+${name}['k'] = ACS_PLUS
+],[cf_cv_curses_acs_map=$name; break])
+done
+])
+
+test "$cf_cv_curses_acs_map" != unknown && AC_DEFINE_UNQUOTED(CURSES_ACS_ARRAY,$cf_cv_curses_acs_map,[Define as needed to override ncurses prefix _nc_])
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_CURSES_CHECK_DATA version: 10 updated: 2021/01/04 19:45:09
+dnl --------------------
+dnl Check if curses.h defines the given data/variable.
+dnl Use this after CF_NCURSES_CONFIG or CF_CURSES_CONFIG.
+dnl
+dnl $1 = data item(s) to check for
+dnl $2 = action on success, e.g., "break" to quit checking a series of choices
+AC_DEFUN([CF_CURSES_CHECK_DATA],
+[
+for cf_data in $1
+do
+AC_MSG_CHECKING(for data $cf_data declaration in ${cf_cv_ncurses_header:-curses.h})
+
+AC_TRY_COMPILE(CF__CURSES_HEAD,
+CF__CURSES_DATA(foo,$cf_data)
+,[cf_result=yes
+],[cf_result=no])
+AC_MSG_RESULT($cf_result)
+
+if test "$cf_result" = yes ; then
+	CF_UPPER(cf_result,have_curses_data_$cf_data)
+	AC_DEFINE_UNQUOTED($cf_result)
+	ifelse($2,,,[$2])
+else
+	AC_MSG_CHECKING(for data $cf_data in library)
+	# BSD linkers insist on making weak linkage, but resolve at runtime.
+	AC_TRY_RUN(CF__CURSES_HEAD
+[
+extern char $cf_data;
+int main(void)
+{
+	]CF__CURSES_DATA(foo,$cf_data)[
+	${cf_cv_main_return:-return}(foo == 0);
+}],[cf_result=yes
+],[cf_result=no],[
+	# cross-compiling
+	AC_TRY_LINK(CF__CURSES_HEAD
+[extern char $cf_data;],[
+	do {
+		]CF__CURSES_DATA(foo,$cf_data)[
+		${cf_cv_main_return:-return}(foo == 0);
+	} while (0)
+],[cf_result=yes],[cf_result=no])
+])
+	AC_MSG_RESULT($cf_result)
+	if test "$cf_result" = yes ; then
+		CF_UPPER(cf_result,decl_curses_data_$cf_data)
+		AC_DEFINE_UNQUOTED($cf_result)
+		# do not exit loop here, since we prefer system's declarations
+	fi
+fi
+done
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CURSES_CHECK_TYPE version: 5 updated: 2021/01/04 19:45:09
+dnl --------------------
+dnl Check if curses.h defines the given type
+AC_DEFUN([CF_CURSES_CHECK_TYPE],
+[
+AC_MSG_CHECKING(for type $1 in ${cf_cv_ncurses_header:-curses.h})
+AC_TRY_COMPILE([
+#ifndef _XOPEN_SOURCE_EXTENDED
+#define _XOPEN_SOURCE_EXTENDED
+#endif
+#include <${cf_cv_ncurses_header:-curses.h}>],[
+$1 foo
+],cf_result=yes,cf_result=no)
+AC_MSG_RESULT($cf_result)
+if test "$cf_result" = yes ; then
+	CF_UPPER(cf_result,have_type_$1)
+	AC_DEFINE_UNQUOTED($cf_result,1,[Define to 1 if we have type $1])
+else
+	AC_DEFINE_UNQUOTED($1,$2,[Define to appropriate type if $1 is not declared])
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CURSES_CONFIG version: 2 updated: 2006/10/29 11:06:27
+dnl ----------------
+dnl Tie together the configure-script macros for curses.  It may be ncurses,
+dnl but unless asked, we do not make a special search for ncurses.  However,
+dnl still check for the ncurses version number, for use in other macros.
+AC_DEFUN([CF_CURSES_CONFIG],
+[
+CF_CURSES_CPPFLAGS
+CF_NCURSES_VERSION
+CF_CURSES_LIBS
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CURSES_CPPFLAGS version: 14 updated: 2021/01/02 09:31:20
+dnl ------------------
+dnl Look for the curses headers.
+AC_DEFUN([CF_CURSES_CPPFLAGS],[
+
+AC_CACHE_CHECK(for extra include directories,cf_cv_curses_incdir,[
+cf_cv_curses_incdir=no
+case "$host_os" in
+(hpux10.*)
+	if test "x$cf_cv_screen" = "xcurses_colr"
+	then
+		test -d /usr/include/curses_colr && \
+		cf_cv_curses_incdir="-I/usr/include/curses_colr"
+	fi
+	;;
+(sunos3*|sunos4*)
+	if test "x$cf_cv_screen" = "xcurses_5lib"
+	then
+		test -d /usr/5lib && \
+		test -d /usr/5include && \
+		cf_cv_curses_incdir="-I/usr/5include"
+	fi
+	;;
+esac
+])
+if test "$cf_cv_curses_incdir" != no
+then
+	CF_APPEND_TEXT(CPPFLAGS,$cf_cv_curses_incdir)
+fi
+
+CF_CURSES_HEADER
+CF_TERM_HEADER
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CURSES_FUNCS version: 20 updated: 2020/12/31 20:19:42
+dnl ---------------
+dnl Curses-functions are a little complicated, since a lot of them are macros.
+AC_DEFUN([CF_CURSES_FUNCS],
+[
+AC_REQUIRE([CF_CURSES_CPPFLAGS])dnl
+AC_REQUIRE([CF_XOPEN_CURSES])
+AC_REQUIRE([CF_CURSES_TERM_H])
+AC_REQUIRE([CF_CURSES_UNCTRL_H])
+for cf_func in $1
+do
+	CF_UPPER(cf_tr_func,$cf_func)
+	AC_MSG_CHECKING(for ${cf_func})
+	CF_MSG_LOG(${cf_func})
+	AC_CACHE_VAL(cf_cv_func_$cf_func,[
+		eval cf_result='$ac_cv_func_'$cf_func
+		if test ".$cf_result" != ".no"; then
+			AC_TRY_LINK(CF__CURSES_HEAD,
+			[
+#ifndef ${cf_func}
+long foo = (long)(&${cf_func});
+fprintf(stderr, "testing linkage of $cf_func:%p\\n", (void *)foo);
+if (foo + 1234L > 5678L)
+	${cf_cv_main_return:-return}(foo != 0);
+#endif
+			],
+			[cf_result=yes],
+			[cf_result=no])
+		fi
+		eval 'cf_cv_func_'$cf_func'="$cf_result"'
+	])
+	# use the computed/retrieved cache-value:
+	eval 'cf_result=$cf_cv_func_'$cf_func
+	AC_MSG_RESULT($cf_result)
+	if test "$cf_result" != no; then
+		AC_DEFINE_UNQUOTED(HAVE_${cf_tr_func})
+	fi
+done
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CURSES_HEADER version: 5 updated: 2015/04/23 20:35:30
+dnl ----------------
+dnl Find a "curses" header file, e.g,. "curses.h", or one of the more common
+dnl variations of ncurses' installs.
+dnl
+dnl $1 = ncurses when looking for ncurses, or is empty
+AC_DEFUN([CF_CURSES_HEADER],[
+AC_CACHE_CHECK(if we have identified curses headers,cf_cv_ncurses_header,[
+cf_cv_ncurses_header=none
+for cf_header in \
+	ncurses.h ifelse($1,,,[$1/ncurses.h]) \
+	curses.h ifelse($1,,,[$1/curses.h]) ifelse($1,,[ncurses/ncurses.h ncurses/curses.h])
+do
+AC_TRY_COMPILE([#include <${cf_header}>],
+	[initscr(); tgoto("?", 0,0)],
+	[cf_cv_ncurses_header=$cf_header; break],[])
+done
+])
+
+if test "$cf_cv_ncurses_header" = none ; then
+	AC_MSG_ERROR(No curses header-files found)
+fi
+
+# cheat, to get the right #define's for HAVE_NCURSES_H, etc.
+AC_CHECK_HEADERS($cf_cv_ncurses_header)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CURSES_LIBS version: 44 updated: 2021/01/02 09:31:20
+dnl --------------
+dnl Look for the curses libraries.  Older curses implementations may require
+dnl termcap/termlib to be linked as well.  Call CF_CURSES_CPPFLAGS first.
+AC_DEFUN([CF_CURSES_LIBS],[
+
+AC_REQUIRE([CF_CURSES_CPPFLAGS])dnl
+AC_MSG_CHECKING(if we have identified curses libraries)
+AC_TRY_LINK([#include <${cf_cv_ncurses_header:-curses.h}>],
+	[initscr(); tgoto("?", 0,0)],
+	cf_result=yes,
+	cf_result=no)
+AC_MSG_RESULT($cf_result)
+
+if test "$cf_result" = no ; then
+case "$host_os" in
+(freebsd*)
+	AC_CHECK_LIB(mytinfo,tgoto,[CF_ADD_LIBS(-lmytinfo)])
+	;;
+(hpux10.*)
+	# Looking at HPUX 10.20, the Hcurses library is the oldest (1997), cur_colr
+	# next (1998), and xcurses "newer" (2000).  There is no header file for
+	# Hcurses; the subdirectory curses_colr has the headers (curses.h and
+	# term.h) for cur_colr
+	if test "x$cf_cv_screen" = "xcurses_colr"
+	then
+		AC_CHECK_LIB(cur_colr,initscr,[
+			CF_ADD_LIBS(-lcur_colr)
+			ac_cv_func_initscr=yes
+			],[
+		AC_CHECK_LIB(Hcurses,initscr,[
+			# HP's header uses __HP_CURSES, but user claims _HP_CURSES.
+			CF_ADD_LIBS(-lHcurses)
+			CF_APPEND_TEXT(CPPFLAGS,-D__HP_CURSES -D_HP_CURSES)
+			ac_cv_func_initscr=yes
+			])])
+	fi
+	;;
+(linux*)
+	case `arch 2>/dev/null` in
+	(x86_64)
+		if test -d /lib64
+		then
+			CF_ADD_LIBDIR(/lib64)
+		else
+			CF_ADD_LIBDIR(/lib)
+		fi
+		;;
+	(*)
+		CF_ADD_LIBDIR(/lib)
+		;;
+	esac
+	;;
+(sunos3*|sunos4*)
+	if test "x$cf_cv_screen" = "xcurses_5lib"
+	then
+		if test -d /usr/5lib ; then
+			CF_ADD_LIBDIR(/usr/5lib)
+			CF_ADD_LIBS(-lcurses -ltermcap)
+		fi
+	fi
+	ac_cv_func_initscr=yes
+	;;
+esac
+
+if test ".$ac_cv_func_initscr" != .yes ; then
+	cf_save_LIBS="$LIBS"
+
+	if test ".${cf_cv_ncurses_version:-no}" != .no
+	then
+		cf_check_list="ncurses curses cursesX"
+	else
+		cf_check_list="cursesX curses ncurses"
+	fi
+
+	# Check for library containing tgoto.  Do this before curses library
+	# because it may be needed to link the test-case for initscr.
+	if test "x$cf_term_lib" = x
+	then
+		AC_CHECK_FUNC(tgoto,[cf_term_lib=predefined],[
+			for cf_term_lib in $cf_check_list otermcap termcap tinfo termlib unknown
+			do
+				AC_CHECK_LIB($cf_term_lib,tgoto,[
+					: "${cf_nculib_root:=$cf_term_lib}"
+					break
+				])
+			done
+		])
+	fi
+
+	# Check for library containing initscr
+	test "$cf_term_lib" != predefined && test "$cf_term_lib" != unknown && LIBS="-l$cf_term_lib $cf_save_LIBS"
+	if test "x$cf_curs_lib" = x
+	then
+		for cf_curs_lib in $cf_check_list xcurses jcurses pdcurses unknown
+		do
+			LIBS="-l$cf_curs_lib $cf_save_LIBS"
+			if test "$cf_term_lib" = unknown || test "$cf_term_lib" = "$cf_curs_lib" ; then
+				AC_MSG_CHECKING(if we can link with $cf_curs_lib library)
+				AC_TRY_LINK([#include <${cf_cv_ncurses_header:-curses.h}>],
+					[initscr()],
+					[cf_result=yes],
+					[cf_result=no])
+				AC_MSG_RESULT($cf_result)
+				test "$cf_result" = yes && break
+			elif test "$cf_curs_lib" = "$cf_term_lib" ; then
+				cf_result=no
+			elif test "$cf_term_lib" != predefined ; then
+				AC_MSG_CHECKING(if we need both $cf_curs_lib and $cf_term_lib libraries)
+				AC_TRY_LINK([#include <${cf_cv_ncurses_header:-curses.h}>],
+					[initscr(); tgoto((char *)0, 0, 0);],
+					[cf_result=no],
+					[
+					LIBS="-l$cf_curs_lib -l$cf_term_lib $cf_save_LIBS"
+					AC_TRY_LINK([#include <${cf_cv_ncurses_header:-curses.h}>],
+						[initscr()],
+						[cf_result=yes],
+						[cf_result=error])
+					])
+				AC_MSG_RESULT($cf_result)
+				test "$cf_result" != error && break
+			fi
+		done
+	fi
+	test "$cf_curs_lib" = unknown && AC_MSG_ERROR(no curses library found)
+fi
+fi
+
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CURSES_TERM_H version: 15 updated: 2021/01/02 09:31:20
+dnl ----------------
+dnl SVr4 curses should have term.h as well (where it puts the definitions of
+dnl the low-level interface).  This may not be true in old/broken implementations,
+dnl as well as in misconfigured systems (e.g., gcc configured for Solaris 2.4
+dnl running with Solaris 2.5.1).
+AC_DEFUN([CF_CURSES_TERM_H],
+[
+AC_REQUIRE([CF_CURSES_CPPFLAGS])dnl
+
+AC_CACHE_CHECK(for term.h, cf_cv_term_header,[
+
+# If we found <ncurses/curses.h>, look for <ncurses/term.h>, but always look
+# for <term.h> if we do not find the variant.
+
+cf_header_list="term.h ncurses/term.h ncursesw/term.h"
+
+case "${cf_cv_ncurses_header:-curses.h}" in
+(*/*)
+	cf_header_item=`echo "${cf_cv_ncurses_header:-curses.h}" | sed -e 's%\..*%%' -e 's%/.*%/%'`term.h
+	cf_header_list="$cf_header_item $cf_header_list"
+	;;
+esac
+
+for cf_header in $cf_header_list
+do
+	AC_TRY_COMPILE([
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <${cf_header}>],
+	[WINDOW *x; (void)x],
+	[cf_cv_term_header=$cf_header
+	 break],
+	[cf_cv_term_header=no])
+done
+
+case "$cf_cv_term_header" in
+(no)
+	# If curses is ncurses, some packagers still mess it up by trying to make
+	# us use GNU termcap.  This handles the most common case.
+	for cf_header in ncurses/term.h ncursesw/term.h
+	do
+		AC_TRY_COMPILE([
+#include <${cf_cv_ncurses_header:-curses.h}>
+#ifdef NCURSES_VERSION
+#include <${cf_header}>
+#else
+make an error
+#endif],
+			[WINDOW *x; (void)x],
+			[cf_cv_term_header=$cf_header
+			 break],
+			[cf_cv_term_header=no])
+	done
+	;;
+esac
+])
+
+case "$cf_cv_term_header" in
+(term.h)
+	AC_DEFINE(HAVE_TERM_H,1,[Define to 1 if we have term.h])
+	;;
+(ncurses/term.h)
+	AC_DEFINE(HAVE_NCURSES_TERM_H,1,[Define to 1 if we have ncurses/term.h])
+	;;
+(ncursesw/term.h)
+	AC_DEFINE(HAVE_NCURSESW_TERM_H,1,[Define to 1 if we have ncursesw/term.h])
+	;;
+esac
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CURSES_UNCTRL_H version: 8 updated: 2021/01/02 09:31:20
+dnl ------------------
+dnl Any X/Open curses implementation must have unctrl.h, but ncurses packages
+dnl may put it in a subdirectory (along with ncurses' other headers, of
+dnl course).  Packages which put the headers in inconsistent locations are
+dnl broken).
+AC_DEFUN([CF_CURSES_UNCTRL_H],
+[
+AC_REQUIRE([CF_CURSES_CPPFLAGS])dnl
+
+AC_CACHE_CHECK(for unctrl.h, cf_cv_unctrl_header,[
+
+# If we found <ncurses/curses.h>, look for <ncurses/unctrl.h>, but always look
+# for <unctrl.h> if we do not find the variant.
+
+cf_header_list="unctrl.h ncurses/unctrl.h ncursesw/unctrl.h"
+
+case "${cf_cv_ncurses_header:-curses.h}" in
+(*/*)
+	cf_header_item=`echo "${cf_cv_ncurses_header:-curses.h}" | sed -e 's%\..*%%' -e 's%/.*%/%'`unctrl.h
+	cf_header_list="$cf_header_item $cf_header_list"
+	;;
+esac
+
+for cf_header in $cf_header_list
+do
+	AC_TRY_COMPILE([
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <${cf_header}>],
+	[WINDOW *x; (void)x],
+	[cf_cv_unctrl_header=$cf_header
+	 break],
+	[cf_cv_unctrl_header=no])
+done
+])
+
+case "$cf_cv_unctrl_header" in
+(no)
+	AC_MSG_WARN(unctrl.h header not found)
+	;;
+esac
+
+case "$cf_cv_unctrl_header" in
+(unctrl.h)
+	AC_DEFINE(HAVE_UNCTRL_H,1,[Define to 1 if we have unctrl.h])
+	;;
+(ncurses/unctrl.h)
+	AC_DEFINE(HAVE_NCURSES_UNCTRL_H,1,[Define to 1 if we have ncurses/unctrl.h])
+	;;
+(ncursesw/unctrl.h)
+	AC_DEFINE(HAVE_NCURSESW_UNCTRL_H,1,[Define to 1 if we have ncursesw/unctrl.h])
+	;;
+esac
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CURSES_WACS_MAP version: 8 updated: 2021/01/04 19:45:09
+dnl ------------------
+dnl Check for likely values of wacs_map[].
+AC_DEFUN([CF_CURSES_WACS_MAP],
+[
+AC_CACHE_CHECK(for wide alternate character set array, cf_cv_curses_wacs_map,[
+	cf_cv_curses_wacs_map=unknown
+	for name in wacs_map _wacs_map __wacs_map _nc_wacs _wacs_char
+	do
+	AC_TRY_LINK([
+#ifndef _XOPEN_SOURCE_EXTENDED
+#define _XOPEN_SOURCE_EXTENDED
+#endif
+#include <${cf_cv_ncurses_header:-curses.h}>],
+	[void *foo = &(${name}['k']); (void)foo],
+	[cf_cv_curses_wacs_map=$name
+	 break])
+	done])
+
+test "$cf_cv_curses_wacs_map" != unknown && AC_DEFINE_UNQUOTED(CURSES_WACS_ARRAY,$cf_cv_curses_wacs_map,[Define to name of (n)curses wide-character array])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_CURSES_WACS_SYMBOLS version: 4 updated: 2021/01/04 19:45:09
+dnl ----------------------
+dnl Do a check to see if the WACS_xxx constants are defined compatibly with
+dnl X/Open Curses.  In particular, NetBSD's implementation of the WACS_xxx
+dnl constants is broken since those constants do not point to cchar_t's.
+AC_DEFUN([CF_CURSES_WACS_SYMBOLS],
+[
+AC_REQUIRE([CF_CURSES_WACS_MAP])
+
+AC_CACHE_CHECK(for wide alternate character constants, cf_cv_curses_wacs_symbols,[
+cf_cv_curses_wacs_symbols=no
+if test "$cf_cv_curses_wacs_map" != unknown
+then
+	AC_TRY_LINK([
+#ifndef _XOPEN_SOURCE_EXTENDED
+#define _XOPEN_SOURCE_EXTENDED
+#endif
+#include <${cf_cv_ncurses_header:-curses.h}>],
+	[cchar_t *foo = WACS_PLUS;
+	 ${cf_cv_curses_wacs_map}['k'] = *WACS_PLUS; (void)foo],
+	[cf_cv_curses_wacs_symbols=yes])
+else
+	AC_TRY_LINK([
+#ifndef _XOPEN_SOURCE_EXTENDED
+#define _XOPEN_SOURCE_EXTENDED
+#endif
+#include <${cf_cv_ncurses_header:-curses.h}>],
+	[cchar_t *foo = WACS_PLUS; (void)foo],
+	[cf_cv_curses_wacs_symbols=yes])
+fi
+])
+
+test "$cf_cv_curses_wacs_symbols" != no && AC_DEFINE(CURSES_WACS_SYMBOLS,1,[Define to 1 if (n)curses supports wide-character WACS_ symbols])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_DIRNAME version: 5 updated: 2020/12/31 20:19:42
+dnl ----------
+dnl "dirname" is not portable, so we fake it with a shell script.
+AC_DEFUN([CF_DIRNAME],[$1=`echo "$2" | sed -e 's%/[[^/]]*$%%'`])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_DISABLE_ECHO version: 14 updated: 2021/09/04 06:35:04
+dnl ---------------
+dnl You can always use "make -n" to see the actual options, but it is hard to
+dnl pick out/analyze warning messages when the compile-line is long.
+dnl
+dnl Sets:
+dnl	ECHO_LT - symbol to control if libtool is verbose
+dnl	ECHO_LD - symbol to prefix "cc -o" lines
+dnl	RULE_CC - symbol to put before implicit "cc -c" lines (e.g., .c.o)
+dnl	SHOW_CC - symbol to put before explicit "cc -c" lines
+dnl	ECHO_CC - symbol to put before any "cc" line
+dnl
+AC_DEFUN([CF_DISABLE_ECHO],[
+AC_MSG_CHECKING(if you want to see long compiling messages)
+CF_ARG_DISABLE(echo,
+	[  --disable-echo          do not display "compiling" commands],
+	[
+	ECHO_LT='--silent'
+	ECHO_LD='@echo linking [$]@;'
+	RULE_CC='@echo compiling [$]<'
+	SHOW_CC='@echo compiling [$]@'
+	ECHO_CC='@'
+],[
+	ECHO_LT=''
+	ECHO_LD=''
+	RULE_CC=''
+	SHOW_CC=''
+	ECHO_CC=''
+])
+AC_MSG_RESULT($enableval)
+AC_SUBST(ECHO_LT)
+AC_SUBST(ECHO_LD)
+AC_SUBST(RULE_CC)
+AC_SUBST(SHOW_CC)
+AC_SUBST(ECHO_CC)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_DISABLE_LEAKS version: 9 updated: 2021/04/03 16:41:50
+dnl ----------------
+dnl Combine no-leak checks with the libraries or tools that are used for the
+dnl checks.
+AC_DEFUN([CF_DISABLE_LEAKS],[
+
+AC_REQUIRE([CF_WITH_DMALLOC])
+AC_REQUIRE([CF_WITH_DBMALLOC])
+AC_REQUIRE([CF_WITH_VALGRIND])
+
+AC_MSG_CHECKING(if you want to perform memory-leak testing)
+AC_ARG_ENABLE(leaks,
+	[  --disable-leaks         test: free permanent memory, analyze leaks],
+	[enable_leaks=$enableval],
+	[enable_leaks=yes])
+dnl with_no_leaks is more readable...
+if test "x$enable_leaks" = xno; then with_no_leaks=yes; else with_no_leaks=no; fi
+AC_MSG_RESULT($with_no_leaks)
+
+if test "$enable_leaks" = no ; then
+	AC_DEFINE(NO_LEAKS,1,[Define to 1 if you want to perform memory-leak testing.])
+	AC_DEFINE(YY_NO_LEAKS,1,[Define to 1 if you want to perform memory-leak testing.])
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_DISABLE_RPATH_HACK version: 3 updated: 2021/01/05 20:14:44
+dnl ---------------------
+dnl The rpath-hack makes it simpler to build programs, particularly with the
+dnl *BSD ports which may have essential libraries in unusual places.  But it
+dnl can interfere with building an executable for the base system.  Use this
+dnl option in that case.
+AC_DEFUN([CF_DISABLE_RPATH_HACK],
+[
+AC_MSG_CHECKING(if rpath-hack should be disabled)
+CF_ARG_DISABLE(rpath-hack,
+	[  --disable-rpath-hack    don't add rpath options for additional libraries],
+	[enable_rpath_hack=no],
+	[enable_rpath_hack=yes])
+dnl TODO - drop cf_disable_rpath_hack
+if test "x$enable_rpath_hack" = xno; then cf_disable_rpath_hack=yes; else cf_disable_rpath_hack=no; fi
+AC_MSG_RESULT($cf_disable_rpath_hack)
+
+if test "$enable_rpath_hack" = yes ; then
+	CF_RPATH_HACK
+fi
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_ENABLE_STRING_HACKS version: 6 updated: 2021/01/05 19:23:48
+dnl ----------------------
+dnl On a few platforms, the compiler and/or loader nags with untruthful
+dnl comments stating that "most" uses of strcat/strcpy/sprintf are incorrect,
+dnl and implying that most uses of the recommended alternatives are correct.
+dnl
+dnl Factually speaking, no one has actually counted the number of uses of these
+dnl functions versus the total of incorrect uses.  Samples of a few thousand
+dnl instances are meaningless compared to the hundreds of millions of lines of
+dnl existing C code.
+dnl
+dnl strlcat/strlcpy are (as of 2012) non-standard, and are available on some
+dnl platforms, in implementations of varying quality.  Likewise, snprintf is
+dnl standard - but evolved through phases, and older implementations are likely
+dnl to yield surprising results, as documented in manpages on various systems.
+AC_DEFUN([CF_ENABLE_STRING_HACKS],
+[
+AC_MSG_CHECKING(if you want to work around bogus compiler/loader warnings)
+AC_ARG_ENABLE(string-hacks,
+	[  --enable-string-hacks   work around bogus compiler/loader warnings],
+	[enable_string_hacks=$enableval],
+	[enable_string_hacks=no])
+AC_MSG_RESULT($enable_string_hacks)
+
+if test "x$enable_string_hacks" = "xyes"; then
+ 	AC_DEFINE(USE_STRING_HACKS,1,[Define to 1 to work around bogus compiler/loader warnings])
+	AC_MSG_WARN(enabling string-hacks to work around bogus compiler/loader warnings)
+	AC_CHECK_FUNC(strlcat,[
+		AC_DEFINE(HAVE_STRLCAT,1,[Define to 1 if we have strlcat function])
+		],[
+		AC_CHECK_LIB(bsd,strlcat,[
+			CF_ADD_LIB(bsd)
+			AC_CHECK_HEADERS(bsd/string.h)
+			AC_DEFINE(HAVE_STRLCAT,1,[Define to 1 if we have strlcat function])
+			])
+		])
+	AC_CHECK_FUNCS( strlcpy snprintf )
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_ENABLE_WARNINGS version: 9 updated: 2021/01/05 19:40:50
+dnl ------------------
+dnl Configure-option to enable gcc warnings
+dnl
+dnl $1 = extra options to add, if supported
+dnl $2 = option for checking attributes.  By default, this is done when
+dnl      warnings are enabled.  For other values:
+dnl      yes: always do this, e.g., to use in generated library-headers
+dnl      no: never do this
+AC_DEFUN([CF_ENABLE_WARNINGS],[
+if test "$GCC" = yes || test "$GXX" = yes
+then
+CF_FIX_WARNINGS(CFLAGS)
+CF_FIX_WARNINGS(CPPFLAGS)
+CF_FIX_WARNINGS(LDFLAGS)
+AC_MSG_CHECKING(if you want to turn on gcc warnings)
+CF_ARG_ENABLE(warnings,
+	[  --enable-warnings       test: turn on gcc compiler warnings],
+	[enable_warnings=yes],
+	[enable_warnings=no])
+AC_MSG_RESULT($enable_warnings)
+if test "$enable_warnings" = "yes"
+then
+	ifelse($2,,[CF_GCC_ATTRIBUTES])
+	CF_GCC_WARNINGS($1)
+fi
+ifelse($2,yes,[CF_GCC_ATTRIBUTES])
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_FIND_LIBRARY version: 11 updated: 2021/01/02 09:31:20
+dnl ---------------
+dnl Look for a non-standard library, given parameters for AC_TRY_LINK.  We
+dnl prefer a standard location, and use -L options only if we do not find the
+dnl library in the standard library location(s).
+dnl	$1 = library name
+dnl	$2 = library class, usually the same as library name
+dnl	$3 = includes
+dnl	$4 = code fragment to compile/link
+dnl	$5 = corresponding function-name
+dnl	$6 = flag, nonnull if failure should not cause an error-exit
+dnl
+dnl Sets the variable "$cf_libdir" as a side-effect, so we can see if we had
+dnl to use a -L option.
+AC_DEFUN([CF_FIND_LIBRARY],
+[
+	eval 'cf_cv_have_lib_'"$1"'=no'
+	cf_libdir=""
+	AC_CHECK_FUNC($5,
+		eval 'cf_cv_have_lib_'"$1"'=yes',[
+		cf_save_LIBS="$LIBS"
+		AC_MSG_CHECKING(for $5 in -l$1)
+		LIBS="-l$1 $LIBS"
+		AC_TRY_LINK([$3],[$4],
+			[AC_MSG_RESULT(yes)
+			 eval 'cf_cv_have_lib_'"$1"'=yes'
+			],
+			[AC_MSG_RESULT(no)
+			CF_LIBRARY_PATH(cf_search,$2)
+			for cf_libdir in $cf_search
+			do
+				AC_MSG_CHECKING(for -l$1 in $cf_libdir)
+				LIBS="-L$cf_libdir -l$1 $cf_save_LIBS"
+				AC_TRY_LINK([$3],[$4],
+					[AC_MSG_RESULT(yes)
+			 		 eval 'cf_cv_have_lib_'"$1"'=yes'
+					 break],
+					[AC_MSG_RESULT(no)
+					 LIBS="$cf_save_LIBS"])
+			done
+			])
+		])
+eval 'cf_found_library="[$]cf_cv_have_lib_'"$1"\"
+ifelse($6,,[
+if test "$cf_found_library" = no ; then
+	AC_MSG_ERROR(Cannot link $1 library)
+fi
+])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_FIND_LINKAGE version: 22 updated: 2020/12/31 20:19:42
+dnl ---------------
+dnl Find a library (specifically the linkage used in the code fragment),
+dnl searching for it if it is not already in the library path.
+dnl See also CF_ADD_SEARCHPATH.
+dnl
+dnl Parameters (4-on are optional):
+dnl     $1 = headers for library entrypoint
+dnl     $2 = code fragment for library entrypoint
+dnl     $3 = the library name without the "-l" option or ".so" suffix.
+dnl     $4 = action to perform if successful (default: update CPPFLAGS, etc)
+dnl     $5 = action to perform if not successful
+dnl     $6 = module name, if not the same as the library name
+dnl     $7 = extra libraries
+dnl
+dnl Sets these variables:
+dnl     $cf_cv_find_linkage_$3 - yes/no according to whether linkage is found
+dnl     $cf_cv_header_path_$3 - include-directory if needed
+dnl     $cf_cv_library_path_$3 - library-directory if needed
+dnl     $cf_cv_library_file_$3 - library-file if needed, e.g., -l$3
+AC_DEFUN([CF_FIND_LINKAGE],[
+
+# If the linkage is not already in the $CPPFLAGS/$LDFLAGS configuration, these
+# will be set on completion of the AC_TRY_LINK below.
+cf_cv_header_path_$3=
+cf_cv_library_path_$3=
+
+CF_MSG_LOG([Starting [FIND_LINKAGE]($3,$6)])
+
+cf_save_LIBS="$LIBS"
+
+AC_TRY_LINK([$1],[$2],[
+	cf_cv_find_linkage_$3=yes
+	cf_cv_header_path_$3=/usr/include
+	cf_cv_library_path_$3=/usr/lib
+],[
+
+LIBS="-l$3 $7 $cf_save_LIBS"
+
+AC_TRY_LINK([$1],[$2],[
+	cf_cv_find_linkage_$3=yes
+	cf_cv_header_path_$3=/usr/include
+	cf_cv_library_path_$3=/usr/lib
+	cf_cv_library_file_$3="-l$3"
+],[
+	cf_cv_find_linkage_$3=no
+	LIBS="$cf_save_LIBS"
+
+	CF_VERBOSE(find linkage for $3 library)
+	CF_MSG_LOG([Searching for headers in [FIND_LINKAGE]($3,$6)])
+
+	cf_save_CPPFLAGS="$CPPFLAGS"
+	cf_test_CPPFLAGS="$CPPFLAGS"
+
+	CF_HEADER_PATH(cf_search,ifelse([$6],,[$3],[$6]))
+	for cf_cv_header_path_$3 in $cf_search
+	do
+		if test -d "$cf_cv_header_path_$3" ; then
+			CF_VERBOSE(... testing $cf_cv_header_path_$3)
+			CPPFLAGS="$cf_save_CPPFLAGS"
+			CF_APPEND_TEXT(CPPFLAGS,-I$cf_cv_header_path_$3)
+			AC_TRY_COMPILE([$1],[$2],[
+				CF_VERBOSE(... found $3 headers in $cf_cv_header_path_$3)
+				cf_cv_find_linkage_$3=maybe
+				cf_test_CPPFLAGS="$CPPFLAGS"
+				break],[
+				CPPFLAGS="$cf_save_CPPFLAGS"
+				])
+		fi
+	done
+
+	if test "$cf_cv_find_linkage_$3" = maybe ; then
+
+		CF_MSG_LOG([Searching for $3 library in [FIND_LINKAGE]($3,$6)])
+
+		cf_save_LIBS="$LIBS"
+		cf_save_LDFLAGS="$LDFLAGS"
+
+		ifelse([$6],,,[
+		CPPFLAGS="$cf_test_CPPFLAGS"
+		LIBS="-l$3 $7 $cf_save_LIBS"
+		AC_TRY_LINK([$1],[$2],[
+			CF_VERBOSE(... found $3 library in system)
+			cf_cv_find_linkage_$3=yes])
+			CPPFLAGS="$cf_save_CPPFLAGS"
+			LIBS="$cf_save_LIBS"
+			])
+
+		if test "$cf_cv_find_linkage_$3" != yes ; then
+			CF_LIBRARY_PATH(cf_search,$3)
+			for cf_cv_library_path_$3 in $cf_search
+			do
+				if test -d "$cf_cv_library_path_$3" ; then
+					CF_VERBOSE(... testing $cf_cv_library_path_$3)
+					CPPFLAGS="$cf_test_CPPFLAGS"
+					LIBS="-l$3 $7 $cf_save_LIBS"
+					LDFLAGS="$cf_save_LDFLAGS -L$cf_cv_library_path_$3"
+					AC_TRY_LINK([$1],[$2],[
+					CF_VERBOSE(... found $3 library in $cf_cv_library_path_$3)
+					cf_cv_find_linkage_$3=yes
+					cf_cv_library_file_$3="-l$3"
+					break],[
+					CPPFLAGS="$cf_save_CPPFLAGS"
+					LIBS="$cf_save_LIBS"
+					LDFLAGS="$cf_save_LDFLAGS"
+					])
+				fi
+			done
+			CPPFLAGS="$cf_save_CPPFLAGS"
+			LDFLAGS="$cf_save_LDFLAGS"
+		fi
+
+	else
+		cf_cv_find_linkage_$3=no
+	fi
+	],$7)
+])
+
+LIBS="$cf_save_LIBS"
+
+if test "$cf_cv_find_linkage_$3" = yes ; then
+ifelse([$4],,[
+	CF_ADD_INCDIR($cf_cv_header_path_$3)
+	CF_ADD_LIBDIR($cf_cv_library_path_$3)
+	CF_ADD_LIB($3)
+],[$4])
+else
+ifelse([$5],,AC_MSG_WARN(Cannot find $3 library),[$5])
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_FIX_WARNINGS version: 4 updated: 2021/12/16 18:22:31
+dnl ---------------
+dnl Warning flags do not belong in CFLAGS, CPPFLAGS, etc.  Any of gcc's
+dnl "-Werror" flags can interfere with configure-checks.  Those go into
+dnl EXTRA_CFLAGS.
+dnl
+dnl $1 = variable name to repair
+define([CF_FIX_WARNINGS],[
+if test "$GCC" = yes || test "$GXX" = yes
+then
+	case [$]$1 in
+	(*-Werror=*)
+		cf_temp_flags=
+		for cf_temp_scan in [$]$1
+		do
+			case "x$cf_temp_scan" in
+			(x-Werror=format*)
+				CF_APPEND_TEXT(cf_temp_flags,$cf_temp_scan)
+				;;
+			(x-Werror=*)
+				CF_APPEND_TEXT(EXTRA_CFLAGS,$cf_temp_scan)
+				;;
+			(*)
+				CF_APPEND_TEXT(cf_temp_flags,$cf_temp_scan)
+				;;
+			esac
+		done
+		if test "x[$]$1" != "x$cf_temp_flags"
+		then
+			CF_VERBOSE(repairing $1: [$]$1)
+			$1="$cf_temp_flags"
+			CF_VERBOSE(... fixed [$]$1)
+			CF_VERBOSE(... extra $EXTRA_CFLAGS)
+		fi
+		;;
+	esac
+fi
+AC_SUBST(EXTRA_CFLAGS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_FUNC_CURSES_VERSION version: 8 updated: 2021/01/02 09:31:20
+dnl ----------------------
+dnl Solaris has a data item 'curses_version', which confuses AC_CHECK_FUNCS.
+dnl It's a character string "SVR4", not documented.
+AC_DEFUN([CF_FUNC_CURSES_VERSION],
+[
+AC_CACHE_CHECK(for function curses_version, cf_cv_func_curses_version,[
+AC_TRY_RUN([
+#include <${cf_cv_ncurses_header:-curses.h}>
+int main(void)
+{
+	char temp[1024];
+	sprintf(temp, "%s\\n", curses_version());
+	${cf_cv_main_return:-return}(0);
+}]
+,[cf_cv_func_curses_version=yes]
+,[cf_cv_func_curses_version=no]
+,[cf_cv_func_curses_version=unknown])
+rm -f core])
+test "$cf_cv_func_curses_version" = yes && AC_DEFINE(HAVE_CURSES_VERSION,1,[Define to 1 if we have curses_version function])
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_FUNC_OPENPTY version: 6 updated: 2021/01/01 13:31:04
+dnl ---------------
+dnl Check for openpty() function, along with <pty.h> header.  It may need the
+dnl "util" library as well.
+AC_DEFUN([CF_FUNC_OPENPTY],
+[
+AC_CHECK_LIB(util,openpty,cf_cv_lib_util=yes,cf_cv_lib_util=no)
+AC_CACHE_CHECK(for openpty header,cf_cv_func_openpty,[
+	cf_save_LIBS="$LIBS"
+	test "$cf_cv_lib_util" = yes && { CF_ADD_LIB(util) }
+	for cf_header in pty.h libutil.h util.h
+	do
+	AC_TRY_LINK([
+#include <$cf_header>
+],[
+	int x = openpty((int *)0, (int *)0, (char *)0,
+				   (struct termios *)0, (struct winsize *)0);
+],[
+		cf_cv_func_openpty=$cf_header
+		break
+],[
+		cf_cv_func_openpty=no
+])
+	done
+	LIBS="$cf_save_LIBS"
+])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_GCC_ATTRIBUTES version: 24 updated: 2021/03/20 12:00:25
+dnl -----------------
+dnl Test for availability of useful gcc __attribute__ directives to quiet
+dnl compiler warnings.  Though useful, not all are supported -- and contrary
+dnl to documentation, unrecognized directives cause older compilers to barf.
+AC_DEFUN([CF_GCC_ATTRIBUTES],
+[AC_REQUIRE([AC_PROG_FGREP])dnl
+AC_REQUIRE([CF_C11_NORETURN])dnl
+
+if test "$GCC" = yes || test "$GXX" = yes
+then
+cat > conftest.i <<EOF
+#ifndef GCC_PRINTF
+#define GCC_PRINTF 0
+#endif
+#ifndef GCC_SCANF
+#define GCC_SCANF 0
+#endif
+#ifndef GCC_NORETURN
+#define GCC_NORETURN /* nothing */
+#endif
+#ifndef GCC_UNUSED
+#define GCC_UNUSED /* nothing */
+#endif
+EOF
+if test "$GCC" = yes
+then
+	AC_CHECKING([for $CC __attribute__ directives])
+cat > "conftest.$ac_ext" <<EOF
+#line __oline__ "${as_me:-configure}"
+#include "confdefs.h"
+#include "conftest.h"
+#include "conftest.i"
+#if	GCC_PRINTF
+#define GCC_PRINTFLIKE(fmt,var) __attribute__((format(printf,fmt,var)))
+#else
+#define GCC_PRINTFLIKE(fmt,var) /*nothing*/
+#endif
+#if	GCC_SCANF
+#define GCC_SCANFLIKE(fmt,var)  __attribute__((format(scanf,fmt,var)))
+#else
+#define GCC_SCANFLIKE(fmt,var)  /*nothing*/
+#endif
+extern void wow(char *,...) GCC_SCANFLIKE(1,2);
+extern GCC_NORETURN void oops(char *,...) GCC_PRINTFLIKE(1,2);
+extern GCC_NORETURN void foo(void);
+int main(int argc GCC_UNUSED, char *argv[[]] GCC_UNUSED) { (void)argc; (void)argv; return 0; }
+EOF
+	cf_printf_attribute=no
+	cf_scanf_attribute=no
+	for cf_attribute in scanf printf unused noreturn
+	do
+		CF_UPPER(cf_ATTRIBUTE,$cf_attribute)
+		cf_directive="__attribute__(($cf_attribute))"
+		echo "checking for $CC $cf_directive" 1>&AC_FD_CC
+
+		case "$cf_attribute" in
+		(printf)
+			cf_printf_attribute=yes
+			cat >conftest.h <<EOF
+#define GCC_$cf_ATTRIBUTE 1
+EOF
+			;;
+		(scanf)
+			cf_scanf_attribute=yes
+			cat >conftest.h <<EOF
+#define GCC_$cf_ATTRIBUTE 1
+EOF
+			;;
+		(*)
+			cat >conftest.h <<EOF
+#define GCC_$cf_ATTRIBUTE $cf_directive
+EOF
+			;;
+		esac
+
+		if AC_TRY_EVAL(ac_compile); then
+			test -n "$verbose" && AC_MSG_RESULT(... $cf_attribute)
+			cat conftest.h >>confdefs.h
+			case "$cf_attribute" in
+			(noreturn)
+				AC_DEFINE_UNQUOTED(GCC_NORETURN,$cf_directive,[Define to noreturn-attribute for gcc])
+				;;
+			(printf)
+				cf_value='/* nothing */'
+				if test "$cf_printf_attribute" != no ; then
+					cf_value='__attribute__((format(printf,fmt,var)))'
+					AC_DEFINE(GCC_PRINTF,1,[Define to 1 if the compiler supports gcc-like printf attribute.])
+				fi
+				AC_DEFINE_UNQUOTED(GCC_PRINTFLIKE(fmt,var),$cf_value,[Define to printf-attribute for gcc])
+				;;
+			(scanf)
+				cf_value='/* nothing */'
+				if test "$cf_scanf_attribute" != no ; then
+					cf_value='__attribute__((format(scanf,fmt,var)))'
+					AC_DEFINE(GCC_SCANF,1,[Define to 1 if the compiler supports gcc-like scanf attribute.])
+				fi
+				AC_DEFINE_UNQUOTED(GCC_SCANFLIKE(fmt,var),$cf_value,[Define to sscanf-attribute for gcc])
+				;;
+			(unused)
+				AC_DEFINE_UNQUOTED(GCC_UNUSED,$cf_directive,[Define to unused-attribute for gcc])
+				;;
+			esac
+		fi
+	done
+else
+	${FGREP-fgrep} define conftest.i >>confdefs.h
+fi
+rm -rf ./conftest*
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_GCC_VERSION version: 8 updated: 2019/09/07 13:38:36
+dnl --------------
+dnl Find version of gcc, and (because icc/clang pretend to be gcc without being
+dnl compatible), attempt to determine if icc/clang is actually used.
+AC_DEFUN([CF_GCC_VERSION],[
+AC_REQUIRE([AC_PROG_CC])
+GCC_VERSION=none
+if test "$GCC" = yes ; then
+	AC_MSG_CHECKING(version of $CC)
+	GCC_VERSION="`${CC} --version 2>/dev/null | sed -e '2,$d' -e 's/^.*(GCC[[^)]]*) //' -e 's/^.*(Debian[[^)]]*) //' -e 's/^[[^0-9.]]*//' -e 's/[[^0-9.]].*//'`"
+	test -z "$GCC_VERSION" && GCC_VERSION=unknown
+	AC_MSG_RESULT($GCC_VERSION)
+fi
+CF_INTEL_COMPILER(GCC,INTEL_COMPILER,CFLAGS)
+CF_CLANG_COMPILER(GCC,CLANG_COMPILER,CFLAGS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_GCC_WARNINGS version: 41 updated: 2021/01/01 16:53:59
+dnl ---------------
+dnl Check if the compiler supports useful warning options.  There's a few that
+dnl we don't use, simply because they're too noisy:
+dnl
+dnl	-Wconversion (useful in older versions of gcc, but not in gcc 2.7.x)
+dnl	-Winline (usually not worthwhile)
+dnl	-Wredundant-decls (system headers make this too noisy)
+dnl	-Wtraditional (combines too many unrelated messages, only a few useful)
+dnl	-Wwrite-strings (too noisy, but should review occasionally).  This
+dnl		is enabled for ncurses using "--enable-const".
+dnl	-pedantic
+dnl
+dnl Parameter:
+dnl	$1 is an optional list of gcc warning flags that a particular
+dnl		application might want to use, e.g., "no-unused" for
+dnl		-Wno-unused
+dnl Special:
+dnl	If $with_ext_const is "yes", add a check for -Wwrite-strings
+dnl
+AC_DEFUN([CF_GCC_WARNINGS],
+[
+AC_REQUIRE([CF_GCC_VERSION])
+if test "x$have_x" = xyes; then CF_CONST_X_STRING fi
+cat > "conftest.$ac_ext" <<EOF
+#line __oline__ "${as_me:-configure}"
+int main(int argc, char *argv[[]]) { return (argv[[argc-1]] == 0) ; }
+EOF
+if test "$INTEL_COMPILER" = yes
+then
+# The "-wdXXX" options suppress warnings:
+# remark #1419: external declaration in primary source file
+# remark #1683: explicit conversion of a 64-bit integral type to a smaller integral type (potential portability problem)
+# remark #1684: conversion from pointer to same-sized integral type (potential portability problem)
+# remark #193: zero used for undefined preprocessing identifier
+# remark #593: variable "curs_sb_left_arrow" was set but never used
+# remark #810: conversion from "int" to "Dimension={unsigned short}" may lose significant bits
+# remark #869: parameter "tw" was never referenced
+# remark #981: operands are evaluated in unspecified order
+# warning #279: controlling expression is constant
+
+	AC_CHECKING([for $CC warning options])
+	cf_save_CFLAGS="$CFLAGS"
+	EXTRA_CFLAGS="$EXTRA_CFLAGS -Wall"
+	for cf_opt in \
+		wd1419 \
+		wd1683 \
+		wd1684 \
+		wd193 \
+		wd593 \
+		wd279 \
+		wd810 \
+		wd869 \
+		wd981
+	do
+		CFLAGS="$cf_save_CFLAGS $EXTRA_CFLAGS -$cf_opt"
+		if AC_TRY_EVAL(ac_compile); then
+			test -n "$verbose" && AC_MSG_RESULT(... -$cf_opt)
+			EXTRA_CFLAGS="$EXTRA_CFLAGS -$cf_opt"
+		fi
+	done
+	CFLAGS="$cf_save_CFLAGS"
+elif test "$GCC" = yes && test "$GCC_VERSION" != "unknown"
+then
+	AC_CHECKING([for $CC warning options])
+	cf_save_CFLAGS="$CFLAGS"
+	cf_warn_CONST=""
+	test "$with_ext_const" = yes && cf_warn_CONST="Wwrite-strings"
+	cf_gcc_warnings="Wignored-qualifiers Wlogical-op Wvarargs"
+	test "x$CLANG_COMPILER" = xyes && cf_gcc_warnings=
+	for cf_opt in W Wall \
+		Wbad-function-cast \
+		Wcast-align \
+		Wcast-qual \
+		Wdeclaration-after-statement \
+		Wextra \
+		Winline \
+		Wmissing-declarations \
+		Wmissing-prototypes \
+		Wnested-externs \
+		Wpointer-arith \
+		Wshadow \
+		Wstrict-prototypes \
+		Wundef Wno-inline $cf_gcc_warnings $cf_warn_CONST $1
+	do
+		CFLAGS="$cf_save_CFLAGS $EXTRA_CFLAGS -$cf_opt"
+		if AC_TRY_EVAL(ac_compile); then
+			test -n "$verbose" && AC_MSG_RESULT(... -$cf_opt)
+			case "$cf_opt" in
+			(Winline)
+				case "$GCC_VERSION" in
+				([[34]].*)
+					CF_VERBOSE(feature is broken in gcc $GCC_VERSION)
+					continue;;
+				esac
+				;;
+			(Wpointer-arith)
+				case "$GCC_VERSION" in
+				([[12]].*)
+					CF_VERBOSE(feature is broken in gcc $GCC_VERSION)
+					continue;;
+				esac
+				;;
+			esac
+			EXTRA_CFLAGS="$EXTRA_CFLAGS -$cf_opt"
+		fi
+	done
+	CFLAGS="$cf_save_CFLAGS"
+fi
+rm -rf ./conftest*
+
+AC_SUBST(EXTRA_CFLAGS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_GETOPT_HEADER version: 8 updated: 2021/06/19 19:16:16
+dnl ----------------
+dnl Check for getopt's variables which are commonly defined in stdlib.h,
+dnl unistd.h or (nonstandard) in getopt.h
+AC_DEFUN([CF_GETOPT_HEADER],
+[
+AC_HAVE_HEADERS(unistd.h getopt.h)
+AC_CACHE_CHECK(for header declaring getopt variables,cf_cv_getopt_header,[
+cf_cv_getopt_header=none
+for cf_header in stdio.h stdlib.h unistd.h getopt.h
+do
+AC_TRY_COMPILE([
+#include <$cf_header>],
+[int x = optind; char *y = optarg; (void)x; (void)y],
+[cf_cv_getopt_header=$cf_header
+ break])
+done
+])
+if test "$cf_cv_getopt_header" != none ; then
+	AC_DEFINE(HAVE_GETOPT_HEADER,1,[Define to 1 if getopt variables are declared in header])
+fi
+if test "$cf_cv_getopt_header" = getopt.h ; then
+	AC_DEFINE(NEED_GETOPT_H,1,[Define to 1 if we must include getopt.h])
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_GNU_SOURCE version: 10 updated: 2018/12/10 20:09:41
+dnl -------------
+dnl Check if we must define _GNU_SOURCE to get a reasonable value for
+dnl _XOPEN_SOURCE, upon which many POSIX definitions depend.  This is a defect
+dnl (or misfeature) of glibc2, which breaks portability of many applications,
+dnl since it is interwoven with GNU extensions.
+dnl
+dnl Well, yes we could work around it...
+dnl
+dnl Parameters:
+dnl	$1 is the nominal value for _XOPEN_SOURCE
+AC_DEFUN([CF_GNU_SOURCE],
+[
+cf_gnu_xopen_source=ifelse($1,,500,$1)
+
+AC_CACHE_CHECK(if this is the GNU C library,cf_cv_gnu_library,[
+AC_TRY_COMPILE([#include <sys/types.h>],[
+	#if __GLIBC__ > 0 && __GLIBC_MINOR__ >= 0
+		return 0;
+	#elif __NEWLIB__ > 0 && __NEWLIB_MINOR__ >= 0
+		return 0;
+	#else
+	#	error not GNU C library
+	#endif],
+	[cf_cv_gnu_library=yes],
+	[cf_cv_gnu_library=no])
+])
+
+if test x$cf_cv_gnu_library = xyes; then
+
+	# With glibc 2.19 (13 years after this check was begun), _DEFAULT_SOURCE
+	# was changed to help a little.  newlib incorporated the change about 4
+	# years later.
+	AC_CACHE_CHECK(if _DEFAULT_SOURCE can be used as a basis,cf_cv_gnu_library_219,[
+		cf_save="$CPPFLAGS"
+		CF_APPEND_TEXT(CPPFLAGS,-D_DEFAULT_SOURCE)
+		AC_TRY_COMPILE([#include <sys/types.h>],[
+			#if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 19) || (__GLIBC__ > 2)
+				return 0;
+			#elif (__NEWLIB__ == 2 && __NEWLIB_MINOR__ >= 4) || (__GLIBC__ > 3)
+				return 0;
+			#else
+			#	error GNU C library __GLIBC__.__GLIBC_MINOR__ is too old
+			#endif],
+			[cf_cv_gnu_library_219=yes],
+			[cf_cv_gnu_library_219=no])
+		CPPFLAGS="$cf_save"
+	])
+
+	if test "x$cf_cv_gnu_library_219" = xyes; then
+		cf_save="$CPPFLAGS"
+		AC_CACHE_CHECK(if _XOPEN_SOURCE=$cf_gnu_xopen_source works with _DEFAULT_SOURCE,cf_cv_gnu_dftsrc_219,[
+			CF_ADD_CFLAGS(-D_DEFAULT_SOURCE -D_XOPEN_SOURCE=$cf_gnu_xopen_source)
+			AC_TRY_COMPILE([
+				#include <limits.h>
+				#include <sys/types.h>
+				],[
+				#if (_XOPEN_SOURCE >= $cf_gnu_xopen_source) && (MB_LEN_MAX > 1)
+					return 0;
+				#else
+				#	error GNU C library is too old
+				#endif],
+				[cf_cv_gnu_dftsrc_219=yes],
+				[cf_cv_gnu_dftsrc_219=no])
+			])
+		test "x$cf_cv_gnu_dftsrc_219" = "xyes" || CPPFLAGS="$cf_save"
+	else
+		cf_cv_gnu_dftsrc_219=maybe
+	fi
+
+	if test "x$cf_cv_gnu_dftsrc_219" != xyes; then
+
+		AC_CACHE_CHECK(if we must define _GNU_SOURCE,cf_cv_gnu_source,[
+		AC_TRY_COMPILE([#include <sys/types.h>],[
+			#ifndef _XOPEN_SOURCE
+			#error	expected _XOPEN_SOURCE to be defined
+			#endif],
+			[cf_cv_gnu_source=no],
+			[cf_save="$CPPFLAGS"
+			 CF_ADD_CFLAGS(-D_GNU_SOURCE)
+			 AC_TRY_COMPILE([#include <sys/types.h>],[
+				#ifdef _XOPEN_SOURCE
+				#error	expected _XOPEN_SOURCE to be undefined
+				#endif],
+				[cf_cv_gnu_source=no],
+				[cf_cv_gnu_source=yes])
+			CPPFLAGS="$cf_save"
+			])
+		])
+
+		if test "$cf_cv_gnu_source" = yes
+		then
+		AC_CACHE_CHECK(if we should also define _DEFAULT_SOURCE,cf_cv_default_source,[
+			CF_APPEND_TEXT(CPPFLAGS,-D_GNU_SOURCE)
+			AC_TRY_COMPILE([#include <sys/types.h>],[
+				#ifdef _DEFAULT_SOURCE
+				#error	expected _DEFAULT_SOURCE to be undefined
+				#endif],
+				[cf_cv_default_source=no],
+				[cf_cv_default_source=yes])
+			])
+			if test "$cf_cv_default_source" = yes
+			then
+				CF_APPEND_TEXT(CPPFLAGS,-D_DEFAULT_SOURCE)
+			fi
+		fi
+	fi
+
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_HEADER_PATH version: 15 updated: 2021/01/01 13:31:04
+dnl --------------
+dnl Construct a search-list of directories for a nonstandard header-file
+dnl
+dnl Parameters
+dnl	$1 = the variable to return as result
+dnl	$2 = the package name
+AC_DEFUN([CF_HEADER_PATH],
+[
+$1=
+
+# collect the current set of include-directories from compiler flags
+cf_header_path_list=""
+if test -n "${CFLAGS}${CPPFLAGS}" ; then
+	for cf_header_path in $CPPFLAGS $CFLAGS
+	do
+		case "$cf_header_path" in
+		(-I*)
+			cf_header_path=`echo ".$cf_header_path" |sed -e 's/^...//' -e 's,/include$,,'`
+			CF_ADD_SUBDIR_PATH($1,$2,include,$cf_header_path,NONE)
+			cf_header_path_list="$cf_header_path_list [$]$1"
+			;;
+		esac
+	done
+fi
+
+# add the variations for the package we are looking for
+CF_SUBDIR_PATH($1,$2,include)
+
+test "$includedir" != NONE && \
+test "$includedir" != "/usr/include" && \
+test -d "$includedir" && {
+	test -d "$includedir" &&    $1="[$]$1 $includedir"
+	test -d "$includedir/$2" && $1="[$]$1 $includedir/$2"
+}
+
+test "$oldincludedir" != NONE && \
+test "$oldincludedir" != "/usr/include" && \
+test -d "$oldincludedir" && {
+	test -d "$oldincludedir"    && $1="[$]$1 $oldincludedir"
+	test -d "$oldincludedir/$2" && $1="[$]$1 $oldincludedir/$2"
+}
+
+$1="[$]$1 $cf_header_path_list"
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_HELP_MESSAGE version: 4 updated: 2019/12/31 08:53:54
+dnl ---------------
+dnl Insert text into the help-message, for readability, from AC_ARG_WITH.
+AC_DEFUN([CF_HELP_MESSAGE],
+[CF_ACVERSION_CHECK(2.53,[],[
+AC_DIVERT_HELP($1)])dnl
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_INHERIT_SCRIPT version: 2 updated: 2003/03/01 23:50:42
+dnl -----------------
+dnl If we do not have a given script, look for it in the parent directory.
+AC_DEFUN([CF_INHERIT_SCRIPT],
+[
+test -f $1 || ( test -f ../$1 && cp ../$1 ./ )
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_INSTALL_OPTS version: 2 updated: 2018/08/18 12:19:21
+dnl ---------------
+dnl prompt for/fill-in useful install-program options
+AC_DEFUN([CF_INSTALL_OPTS],
+[
+CF_INSTALL_OPT_S
+CF_INSTALL_OPT_P
+CF_INSTALL_OPT_O
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_INSTALL_OPT_O version: 3 updated: 2020/12/31 20:19:42
+dnl ----------------
+dnl Almost all "install" programs default to the current user's ownership.
+dnl Almost - MINIX is an exception.
+AC_DEFUN([CF_INSTALL_OPT_O],
+[
+AC_MSG_CHECKING(if install needs to be told about ownership)
+case `$ac_config_guess` in
+(*minix)
+	with_install_o=yes
+	;;
+(*)
+	with_install_o=no
+	;;
+esac
+
+AC_MSG_RESULT($with_install_o)
+if test "x$with_install_o" = xyes
+then
+	INSTALL_OPT_O="`id root|sed -e 's/uid=[[0-9]]*(/ -o /' -e 's/gid=[[0-9]]*(/ -g /' -e 's/ [[^=[:space:]]][[^=[:space:]]]*=.*/ /' -e 's/)//g'`"
+else
+	INSTALL_OPT_O=
+fi
+
+AC_SUBST(INSTALL_OPT_O)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_INSTALL_OPT_P version: 3 updated: 2021/01/01 13:31:04
+dnl ----------------
+dnl Some install-programs accept a "-p" option to preserve file modification
+dnl timestamps.  That can be useful as an install option, as well as a way to
+dnl avoid the need for ranlib after copying a static archive.
+AC_DEFUN([CF_INSTALL_OPT_P],
+[
+: "${INSTALL:=install}"
+AC_CACHE_CHECK(if install accepts -p option, cf_cv_install_p,[
+	rm -rf ./conftest*
+	date >conftest.in
+	mkdir conftest.out
+	sleep 3
+	if $INSTALL -p conftest.in conftest.out 2>/dev/null
+	then
+		if test -f conftest.out/conftest.in
+		then
+			test conftest.in -nt conftest.out/conftest.in 2>conftest.err && \
+			test conftest.out/conftest.in -nt conftest.in 2>conftest.err
+			if test -s conftest.err
+			then
+				cf_cv_install_p=no
+			else
+				cf_cv_install_p=yes
+			fi
+		else
+			cf_cv_install_p=no
+		fi
+	else
+		cf_cv_install_p=no
+	fi
+	rm -rf ./conftest*
+])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_INSTALL_OPT_S version: 3 updated: 2021/01/05 19:23:48
+dnl ----------------
+dnl By default, we should strip executables which are installed, but leave the
+dnl ability to suppress that for unit-testing.
+AC_DEFUN([CF_INSTALL_OPT_S],
+[
+AC_MSG_CHECKING(if you want to install stripped executables)
+CF_ARG_DISABLE(stripping,
+	[  --disable-stripping     do not strip (debug info) installed executables],
+	[enable_stripping=no],
+	[enable_stripping=yes])
+AC_MSG_RESULT($enable_stripping)
+
+if test "$enable_stripping" = yes
+then
+	INSTALL_OPT_S="-s"
+else
+	INSTALL_OPT_S=
+fi
+AC_SUBST(INSTALL_OPT_S)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_INTEL_COMPILER version: 8 updated: 2021/01/01 16:53:59
+dnl -----------------
+dnl Check if the given compiler is really the Intel compiler for Linux.  It
+dnl tries to imitate gcc, but does not return an error when it finds a mismatch
+dnl between prototypes, e.g., as exercised by CF_MISSING_CHECK.
+dnl
+dnl This macro should be run "soon" after AC_PROG_CC or AC_PROG_CPLUSPLUS, to
+dnl ensure that it is not mistaken for gcc/g++.  It is normally invoked from
+dnl the wrappers for gcc and g++ warnings.
+dnl
+dnl $1 = GCC (default) or GXX
+dnl $2 = INTEL_COMPILER (default) or INTEL_CPLUSPLUS
+dnl $3 = CFLAGS (default) or CXXFLAGS
+AC_DEFUN([CF_INTEL_COMPILER],[
+AC_REQUIRE([AC_CANONICAL_HOST])
+ifelse([$2],,INTEL_COMPILER,[$2])=no
+
+if test "$ifelse([$1],,[$1],GCC)" = yes ; then
+	case "$host_os" in
+	(linux*|gnu*)
+		AC_MSG_CHECKING(if this is really Intel ifelse([$1],GXX,C++,C) compiler)
+		cf_save_CFLAGS="$ifelse([$3],,CFLAGS,[$3])"
+		ifelse([$3],,CFLAGS,[$3])="$ifelse([$3],,CFLAGS,[$3]) -no-gcc"
+		AC_TRY_COMPILE([],[
+#ifdef __INTEL_COMPILER
+#else
+make an error
+#endif
+],[ifelse([$2],,INTEL_COMPILER,[$2])=yes
+cf_save_CFLAGS="$cf_save_CFLAGS -we147"
+],[])
+		ifelse([$3],,CFLAGS,[$3])="$cf_save_CFLAGS"
+		AC_MSG_RESULT($ifelse([$2],,INTEL_COMPILER,[$2]))
+		;;
+	esac
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_LD_RPATH_OPT version: 9 updated: 2021/01/01 13:31:04
+dnl ---------------
+dnl For the given system and compiler, find the compiler flags to pass to the
+dnl loader to use the "rpath" feature.
+AC_DEFUN([CF_LD_RPATH_OPT],
+[
+AC_REQUIRE([CF_CHECK_CACHE])
+
+LD_RPATH_OPT=
+if test "x$cf_cv_enable_rpath" != xno
+then
+	AC_MSG_CHECKING(for an rpath option)
+	case "$cf_cv_system_name" in
+	(irix*)
+		if test "$GCC" = yes; then
+			LD_RPATH_OPT="-Wl,-rpath,"
+		else
+			LD_RPATH_OPT="-rpath "
+		fi
+		;;
+	(linux*|gnu*|k*bsd*-gnu|freebsd*)
+		LD_RPATH_OPT="-Wl,-rpath,"
+		;;
+	(openbsd[[2-9]].*|mirbsd*)
+		LD_RPATH_OPT="-Wl,-rpath,"
+		;;
+	(dragonfly*)
+		LD_RPATH_OPT="-rpath "
+		;;
+	(netbsd*)
+		LD_RPATH_OPT="-Wl,-rpath,"
+		;;
+	(osf*|mls+*)
+		LD_RPATH_OPT="-rpath "
+		;;
+	(solaris2*)
+		LD_RPATH_OPT="-R"
+		;;
+	(*)
+		;;
+	esac
+	AC_MSG_RESULT($LD_RPATH_OPT)
+
+	case "x$LD_RPATH_OPT" in
+	(x-R*)
+		AC_MSG_CHECKING(if we need a space after rpath option)
+		cf_save_LIBS="$LIBS"
+		CF_ADD_LIBS(${LD_RPATH_OPT}$libdir)
+		AC_TRY_LINK(, , cf_rpath_space=no, cf_rpath_space=yes)
+		LIBS="$cf_save_LIBS"
+		AC_MSG_RESULT($cf_rpath_space)
+		test "$cf_rpath_space" = yes && LD_RPATH_OPT="$LD_RPATH_OPT "
+		;;
+	esac
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_LIBRARY_PATH version: 11 updated: 2021/01/01 13:31:04
+dnl ---------------
+dnl Construct a search-list of directories for a nonstandard library-file
+dnl
+dnl Parameters
+dnl	$1 = the variable to return as result
+dnl	$2 = the package name
+AC_DEFUN([CF_LIBRARY_PATH],
+[
+$1=
+cf_library_path_list=""
+if test -n "${LDFLAGS}${LIBS}" ; then
+	for cf_library_path in $LDFLAGS $LIBS
+	do
+		case "$cf_library_path" in
+		(-L*)
+			cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'`
+			CF_ADD_SUBDIR_PATH($1,$2,lib,$cf_library_path,NONE)
+			cf_library_path_list="$cf_library_path_list [$]$1"
+			;;
+		esac
+	done
+fi
+
+CF_SUBDIR_PATH($1,$2,lib)
+
+$1="$cf_library_path_list [$]$1"
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_MAKE_PHONY version: 3 updated: 2021/01/08 16:08:21
+dnl -------------
+dnl Check if the make-program handles a ".PHONY" target, e.g,. a target which
+dnl acts as a placeholder.
+dnl
+dnl The ".PHONY" feature was proposed in 2011 here
+dnl     https://www.austingroupbugs.net/view.php?id=523
+dnl and is scheduled for release in P1003.1 Issue 8 (late 2022).
+dnl
+dnl This is not supported by SVr4 make (or SunOS 4, 4.3SD, etc), but works with
+dnl a few others (i.e., GNU make and the non-POSIX "BSD" make):
+dnl
+dnl + This is a GNU make feature (since April 1988, but in turn from binutils,
+dnl   date unspecified).
+dnl
+dnl + It was adopted in NetBSD make in June 1995.
+dnl
+dnl + The other BSD make programs are derived from the NetBSD make (and for
+dnl   that reason are not actually different "implementations").
+dnl
+dnl + Some features of NetBSD make were actually adapted from pmake, which
+dnl   began as a modified GNU make starting in 1993.
+dnl
+dnl + Version 3.8 of the dmake program in January 1992 also implemented this
+dnl   GNU make extension, but is less well known than the BSD make.
+AC_DEFUN([CF_MAKE_PHONY],[
+AC_CACHE_CHECK(for \".PHONY\" make-support, cf_cv_make_PHONY,[
+	rm -rf conftest*
+	(
+		mkdir conftest || exit 1
+		cd conftest
+		cat >makefile <<'CF_EOF'
+.PHONY: always
+DATA=0
+always:	always.out
+	@echo "** making [$]@ [$](DATA)"
+once: once.out
+	@echo "** making [$]@ [$](DATA)"
+always.out:
+	@echo "** making [$]@ [$](DATA)"
+	echo [$](DATA) > [$]@
+once.out:
+	@echo "** making [$]@ [$](DATA)"
+	echo [$](DATA) > [$]@
+CF_EOF
+		for cf_data in 1 2 3
+		do
+			${MAKE:-make} always DATA=$cf_data
+			${MAKE:-make} once   DATA=$cf_data
+			${MAKE:-make} -t always once
+			if test -f always ; then
+				echo "no (case 1)" > ../conftest.tmp
+			elif test ! -f always.out ; then
+				echo "no (case 2)" > ../conftest.tmp
+			elif test ! -f once.out ; then
+				echo "no (case 3)" > ../conftest.tmp
+			elif ! cmp -s always.out once.out ; then
+				echo "no (case 4)" > ../conftest.tmp
+				diff always.out once.out
+			else
+				cf_check="`cat always.out`"
+				if test "x$cf_check" != "x$cf_data" ; then
+					echo "no (case 5)" > ../conftest.tmp
+				else
+					echo yes > ../conftest.tmp
+					rm -f ./*.out
+					continue
+				fi
+			fi
+			break
+		done
+	) >&AC_FD_CC 2>&1
+	cf_cv_make_PHONY="`cat conftest.tmp`"
+	rm -rf conftest*
+])
+MAKE_NO_PHONY="#"
+MAKE_PHONY="#"
+test "x$cf_cv_make_PHONY" = xyes && MAKE_PHONY=
+test "x$cf_cv_make_PHONY" != xyes && MAKE_NO_PHONY=
+AC_SUBST(MAKE_NO_PHONY)
+AC_SUBST(MAKE_PHONY)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_MAKE_TAGS version: 6 updated: 2010/10/23 15:52:32
+dnl ------------
+dnl Generate tags/TAGS targets for makefiles.  Do not generate TAGS if we have
+dnl a monocase filesystem.
+AC_DEFUN([CF_MAKE_TAGS],[
+AC_REQUIRE([CF_MIXEDCASE_FILENAMES])
+
+AC_CHECK_PROGS(CTAGS, exctags ctags)
+AC_CHECK_PROGS(ETAGS, exetags etags)
+
+AC_CHECK_PROG(MAKE_LOWER_TAGS, ${CTAGS:-ctags}, yes, no)
+
+if test "$cf_cv_mixedcase" = yes ; then
+	AC_CHECK_PROG(MAKE_UPPER_TAGS, ${ETAGS:-etags}, yes, no)
+else
+	MAKE_UPPER_TAGS=no
+fi
+
+if test "$MAKE_UPPER_TAGS" = yes ; then
+	MAKE_UPPER_TAGS=
+else
+	MAKE_UPPER_TAGS="#"
+fi
+
+if test "$MAKE_LOWER_TAGS" = yes ; then
+	MAKE_LOWER_TAGS=
+else
+	MAKE_LOWER_TAGS="#"
+fi
+
+AC_SUBST(CTAGS)
+AC_SUBST(ETAGS)
+
+AC_SUBST(MAKE_UPPER_TAGS)
+AC_SUBST(MAKE_LOWER_TAGS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_MATH_LIB version: 11 updated: 2022/07/27 19:01:48
+dnl -----------
+dnl Checks for libraries.  At least one UNIX system, Apple Macintosh
+dnl Rhapsody 5.5, does not have -lm.  We cannot use the simpler
+dnl AC_CHECK_LIB(m,sin), because that fails for C++.
+AC_DEFUN([CF_MATH_LIB],
+[
+AC_CACHE_CHECK(if -lm needed for math functions,
+	cf_cv_need_libm,[
+	AC_TRY_LINK([
+		#include <stdio.h>
+		#include <stdlib.h>
+		#include <math.h>
+	],
+	[double x = rand(); printf("result = %g\\n", ]ifelse([$2],,sin(x),$2)[)],
+	[cf_cv_need_libm=no],
+	[cf_cv_need_libm=yes])])
+
+if test "$cf_cv_need_libm" = yes
+then
+
+	cf_save_LIBS="$LIBS"
+	LIBS="$LIBS -lm"
+	AC_CACHE_CHECK(if -lm is available for math functions,
+	cf_cv_have_libm,[
+	AC_TRY_LINK([
+		#include <stdio.h>
+		#include <stdlib.h>
+		#include <math.h>
+	],
+	[double x = rand(); printf("result = %g\\n", ]ifelse([$2],,sin(x),$2)[)],
+	[cf_cv_have_libm=yes],
+	[cf_cv_have_libm=no])])
+	LIBS="$cf_save_LIBS"
+
+	if test "$cf_cv_have_libm" = yes
+	then
+		ifelse($1,,[CF_ADD_LIB(m)],[$1=-lm])
+	fi
+else
+	cf_cv_have_libm=yes
+fi
+
+if test "$cf_cv_have_libm" = yes
+then
+	AC_DEFINE(HAVE_MATH_FUNCS,1,[Define to 1 if math functions are available])
+fi
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_MIXEDCASE_FILENAMES version: 9 updated: 2021/01/01 16:53:59
+dnl ----------------------
+dnl Check if the file-system supports mixed-case filenames.  If we're able to
+dnl create a lowercase name and see it as uppercase, it doesn't support that.
+AC_DEFUN([CF_MIXEDCASE_FILENAMES],
+[
+AC_CACHE_CHECK(if filesystem supports mixed-case filenames,cf_cv_mixedcase,[
+if test "$cross_compiling" = yes ; then
+	case "$target_alias" in
+	(*-os2-emx*|*-msdosdjgpp*|*-cygwin*|*-msys*|*-mingw*|*-uwin*|darwin*)
+		cf_cv_mixedcase=no
+		;;
+	(*)
+		cf_cv_mixedcase=yes
+		;;
+	esac
+else
+	rm -f conftest CONFTEST
+	echo test >conftest
+	if test -f CONFTEST ; then
+		cf_cv_mixedcase=no
+	else
+		cf_cv_mixedcase=yes
+	fi
+	rm -f conftest CONFTEST
+fi
+])
+test "$cf_cv_mixedcase" = yes && AC_DEFINE(MIXEDCASE_FILENAMES,1,[Define to 1 if filesystem supports mixed-case filenames.])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_MSG_LOG version: 5 updated: 2010/10/23 15:52:32
+dnl ----------
+dnl Write a debug message to config.log, along with the line number in the
+dnl configure script.
+AC_DEFUN([CF_MSG_LOG],[
+echo "${as_me:-configure}:__oline__: testing $* ..." 1>&AC_FD_CC
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_NCURSES_CC_CHECK version: 5 updated: 2020/12/31 20:19:42
+dnl -------------------
+dnl Check if we can compile with ncurses' header file
+dnl $1 is the cache variable to set
+dnl $2 is the header-file to include
+dnl $3 is the root name (ncurses or ncursesw)
+AC_DEFUN([CF_NCURSES_CC_CHECK],[
+	AC_TRY_COMPILE([
+]ifelse($3,ncursesw,[
+#define _XOPEN_SOURCE_EXTENDED
+#undef  HAVE_LIBUTF8_H	/* in case we used CF_UTF8_LIB */
+#define HAVE_LIBUTF8_H	/* to force ncurses' header file to use cchar_t */
+])[
+#include <$2>],[
+#ifdef NCURSES_VERSION
+]ifelse($3,ncursesw,[
+#ifndef WACS_BSSB
+	make an error
+#endif
+])[
+printf("%s\\n", NCURSES_VERSION);
+#else
+#ifdef __NCURSES_H
+printf("old\\n");
+#else
+	make an error
+#endif
+#endif
+	]
+	,[$1=$2]
+	,[$1=no])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_NCURSES_CONFIG version: 28 updated: 2021/08/28 15:20:37
+dnl -----------------
+dnl Tie together the configure-script macros for ncurses, preferring these in
+dnl order:
+dnl a) ".pc" files for pkg-config, using $NCURSES_CONFIG_PKG
+dnl b) the "-config" script from ncurses, using $NCURSES_CONFIG
+dnl c) just plain libraries
+dnl
+dnl $1 is the root library name (default: "ncurses")
+AC_DEFUN([CF_NCURSES_CONFIG],[
+AC_REQUIRE([CF_PKG_CONFIG])
+cf_ncuconfig_root=ifelse($1,,ncurses,$1)
+cf_have_ncuconfig=no
+
+if test "x${PKG_CONFIG:=none}" != xnone; then
+	AC_MSG_CHECKING(pkg-config for $cf_ncuconfig_root)
+	if "$PKG_CONFIG" --exists $cf_ncuconfig_root ; then
+		AC_MSG_RESULT(yes)
+
+		AC_MSG_CHECKING(if the $cf_ncuconfig_root package files work)
+		cf_have_ncuconfig=unknown
+
+		cf_save_CFLAGS="$CFLAGS"
+		cf_save_CPPFLAGS="$CPPFLAGS"
+		cf_save_LIBS="$LIBS"
+
+		cf_pkg_cflags="`$PKG_CONFIG --cflags $cf_ncuconfig_root`"
+		cf_pkg_libs="`$PKG_CONFIG --libs $cf_ncuconfig_root`"
+
+		# while -W for passing linker flags is prevalent, it is not "standard".
+		# At least one wrapper for c89/c99 (in Apple's xcode) has its own
+		# incompatible _and_ non-standard -W option which gives an error.  Work
+		# around that pitfall.
+		case "x${CC}@@${cf_pkg_libs}@${cf_pkg_cflags}" in
+		(x*c[[89]]9@@*-W*)
+			CF_ADD_CFLAGS($cf_pkg_cflags)
+			CF_ADD_LIBS($cf_pkg_libs)
+
+			AC_TRY_LINK([#include <${cf_cv_ncurses_header:-curses.h}>],
+				[initscr(); mousemask(0,0); tigetstr((char *)0);],
+				[AC_TRY_RUN([#include <${cf_cv_ncurses_header:-curses.h}>
+					int main(void)
+					{ const char *xx = curses_version(); return (xx == 0); }],
+					[cf_test_ncuconfig=yes],
+					[cf_test_ncuconfig=no],
+					[cf_test_ncuconfig=maybe])],
+				[cf_test_ncuconfig=no])
+
+			CFLAGS="$cf_save_CFLAGS"
+			CPPFLAGS="$cf_save_CPPFLAGS"
+			LIBS="$cf_save_LIBS"
+
+			if test "x$cf_test_ncuconfig" != xyes; then
+				cf_temp=`echo "x$cf_pkg_cflags" | sed -e s/^x// -e 's/-W[[^ 	]]*//g'`
+				cf_pkg_cflags="$cf_temp"
+				cf_temp=`echo "x$cf_pkg_libs" | sed -e s/^x// -e 's/-W[[^ 	]]*//g'`
+				cf_pkg_libs="$cf_temp"
+			fi
+			;;
+		esac
+
+		CF_APPEND_CFLAGS($cf_pkg_cflags)
+		CF_ADD_LIBS($cf_pkg_libs)
+
+		AC_TRY_LINK([#include <${cf_cv_ncurses_header:-curses.h}>],
+			[initscr(); mousemask(0,0); tigetstr((char *)0);],
+			[AC_TRY_RUN([#include <${cf_cv_ncurses_header:-curses.h}>
+				int main(void)
+				{ const char *xx = curses_version(); return (xx == 0); }],
+				[cf_have_ncuconfig=yes],
+				[cf_have_ncuconfig=no],
+				[cf_have_ncuconfig=maybe])],
+			[cf_have_ncuconfig=no])
+		AC_MSG_RESULT($cf_have_ncuconfig)
+		test "$cf_have_ncuconfig" = maybe && cf_have_ncuconfig=yes
+		if test "$cf_have_ncuconfig" != "yes"
+		then
+			CPPFLAGS="$cf_save_CPPFLAGS"
+			LIBS="$cf_save_LIBS"
+			NCURSES_CONFIG_PKG=none
+		else
+			AC_DEFINE(NCURSES,1,[Define to 1 if we are using ncurses headers/libraries])
+			NCURSES_CONFIG_PKG=$cf_ncuconfig_root
+			CF_TERM_HEADER
+		fi
+
+	else
+		AC_MSG_RESULT(no)
+		NCURSES_CONFIG_PKG=none
+	fi
+else
+	NCURSES_CONFIG_PKG=none
+fi
+
+if test "x$cf_have_ncuconfig" = "xno"; then
+	cf_ncurses_config="${cf_ncuconfig_root}${NCURSES_CONFIG_SUFFIX}-config"; echo "Looking for ${cf_ncurses_config}"
+
+	CF_ACVERSION_CHECK(2.52,
+		[AC_CHECK_TOOLS(NCURSES_CONFIG, ${cf_ncurses_config} ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}5-config, none)],
+		[AC_PATH_PROGS(NCURSES_CONFIG,  ${cf_ncurses_config} ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}5-config, none)])
+
+	if test "$NCURSES_CONFIG" != none ; then
+
+		CF_APPEND_CFLAGS(`$NCURSES_CONFIG --cflags`)
+		CF_ADD_LIBS(`$NCURSES_CONFIG --libs`)
+
+		# even with config script, some packages use no-override for curses.h
+		CF_CURSES_HEADER(ifelse($1,,ncurses,$1))
+
+		dnl like CF_NCURSES_CPPFLAGS
+		AC_DEFINE(NCURSES,1,[Define to 1 if we are using ncurses headers/libraries])
+
+		dnl like CF_NCURSES_LIBS
+		CF_UPPER(cf_nculib_ROOT,HAVE_LIB$cf_ncuconfig_root)
+		AC_DEFINE_UNQUOTED($cf_nculib_ROOT)
+
+		dnl like CF_NCURSES_VERSION
+		cf_cv_ncurses_version="`$NCURSES_CONFIG --version`"
+
+	else
+
+		CF_NCURSES_CPPFLAGS(ifelse($1,,ncurses,$1))
+		CF_NCURSES_LIBS(ifelse($1,,ncurses,$1))
+
+	fi
+else
+	NCURSES_CONFIG=none
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_NCURSES_CPPFLAGS version: 22 updated: 2021/01/02 09:31:20
+dnl -------------------
+dnl Look for the SVr4 curses clone 'ncurses' in the standard places, adjusting
+dnl the CPPFLAGS variable so we can include its header.
+dnl
+dnl The header files may be installed as either curses.h, or ncurses.h (would
+dnl be obsolete, except that some packagers prefer this name to distinguish it
+dnl from a "native" curses implementation).  If not installed for overwrite,
+dnl the curses.h file would be in an ncurses subdirectory (e.g.,
+dnl /usr/include/ncurses), but someone may have installed overwriting the
+dnl vendor's curses.  Only very old versions (pre-1.9.2d, the first autoconf'd
+dnl version) of ncurses don't define either __NCURSES_H or NCURSES_VERSION in
+dnl the header.
+dnl
+dnl If the installer has set $CFLAGS or $CPPFLAGS so that the ncurses header
+dnl is already in the include-path, don't even bother with this, since we cannot
+dnl easily determine which file it is.  In this case, it has to be <curses.h>.
+dnl
+dnl The optional parameter gives the root name of the library, in case it is
+dnl not installed as the default curses library.  That is how the
+dnl wide-character version of ncurses is installed.
+AC_DEFUN([CF_NCURSES_CPPFLAGS],
+[AC_REQUIRE([CF_WITH_CURSES_DIR])
+
+AC_PROVIDE([CF_CURSES_CPPFLAGS])dnl
+cf_ncuhdr_root=ifelse($1,,ncurses,$1)
+
+test -n "$cf_cv_curses_dir" && \
+test "$cf_cv_curses_dir" != "no" && { \
+  CF_ADD_INCDIR($cf_cv_curses_dir/include/$cf_ncuhdr_root)
+}
+
+AC_CACHE_CHECK(for $cf_ncuhdr_root header in include-path, cf_cv_ncurses_h,[
+	cf_header_list="$cf_ncuhdr_root/curses.h $cf_ncuhdr_root/ncurses.h"
+	{ test "$cf_ncuhdr_root" = ncurses || test "$cf_ncuhdr_root" = ncursesw; } && cf_header_list="$cf_header_list curses.h ncurses.h"
+	for cf_header in $cf_header_list
+	do
+		CF_NCURSES_CC_CHECK(cf_cv_ncurses_h,$cf_header,$1)
+		test "$cf_cv_ncurses_h" != no && break
+	done
+])
+
+CF_NCURSES_HEADER
+CF_TERM_HEADER
+
+# some applications need this, but should check for NCURSES_VERSION
+AC_DEFINE(NCURSES,1,[Define to 1 if we are using ncurses headers/libraries])
+
+CF_NCURSES_VERSION
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_NCURSES_EXT_FUNCS version: 4 updated: 2012/10/06 16:39:58
+dnl --------------------
+dnl Since 2007/11/17, ncurses has defined NCURSES_EXT_FUNCS; earlier versions
+dnl may provide these functions.  Define the symbol if it is not defined, and
+dnl if it is valid.
+AC_DEFUN([CF_NCURSES_EXT_FUNCS],
+[
+AC_CACHE_CHECK(for ncurses extended functions,cf_cv_ncurses_ext_funcs,[
+AC_TRY_COMPILE([
+#include <${cf_cv_ncurses_header:-curses.h}>],
+[
+int x = NCURSES_EXT_FUNCS
+],[cf_cv_ncurses_ext_funcs=defined],[
+AC_TRY_LINK([
+#include <${cf_cv_ncurses_header:-curses.h}>],
+[
+	(void) assume_default_colors (0, 0);
+	(void) curses_version ();
+	(void) define_key (0, 0);
+	(void) is_term_resized (0, 0);
+	(void) key_defined (0);
+	(void) keybound (0, 0);
+	(void) keyok (0, 0);
+	(void) resize_term (0, 0);
+	(void) resizeterm (0, 0);
+	(void) use_default_colors ();
+	(void) use_extended_names (0);
+	(void) wresize (0, 0, 0);],
+	[cf_cv_ncurses_ext_funcs=yes],
+	[cf_cv_ncurses_ext_funcs=no])
+])
+])
+test "$cf_cv_ncurses_ext_funcs" = yes && AC_DEFINE(NCURSES_EXT_FUNCS,1,[Define to 1 if we have ncurses extensions])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_NCURSES_HEADER version: 7 updated: 2021/01/04 19:33:05
+dnl -----------------
+dnl Find a "curses" header file, e.g,. "curses.h", or one of the more common
+dnl variations of ncurses' installs.
+dnl
+dnl See also CF_CURSES_HEADER, which sets the same cache variable.
+AC_DEFUN([CF_NCURSES_HEADER],[
+
+if test "$cf_cv_ncurses_h" != no ; then
+	cf_cv_ncurses_header=$cf_cv_ncurses_h
+else
+
+AC_CACHE_CHECK(for $cf_ncuhdr_root include-path, cf_cv_ncurses_h2,[
+	test -n "$verbose" && echo
+	CF_HEADER_PATH(cf_search,$cf_ncuhdr_root)
+	test -n "$verbose" && echo "search path $cf_search"
+	cf_save2_CPPFLAGS="$CPPFLAGS"
+	for cf_incdir in $cf_search
+	do
+		CF_ADD_INCDIR($cf_incdir)
+		for cf_header in \
+			ncurses.h \
+			curses.h
+		do
+			CF_NCURSES_CC_CHECK(cf_cv_ncurses_h2,$cf_header,$1)
+			if test "$cf_cv_ncurses_h2" != no ; then
+				cf_cv_ncurses_h2=$cf_incdir/$cf_header
+				test -n "$verbose" && echo $ECHO_N "	... found $ECHO_C" 1>&AC_FD_MSG
+				break
+			fi
+			test -n "$verbose" && echo "	... tested $cf_incdir/$cf_header" 1>&AC_FD_MSG
+		done
+		CPPFLAGS="$cf_save2_CPPFLAGS"
+		test "$cf_cv_ncurses_h2" != no && break
+	done
+	test "$cf_cv_ncurses_h2" = no && AC_MSG_ERROR(not found)
+	])
+
+	CF_DIRNAME(cf_1st_incdir,$cf_cv_ncurses_h2)
+	cf_cv_ncurses_header="`basename "$cf_cv_ncurses_h2"`"
+	if test "`basename "$cf_1st_incdir"`" = "$cf_ncuhdr_root" ; then
+		cf_cv_ncurses_header="$cf_ncuhdr_root/$cf_cv_ncurses_header"
+	fi
+	CF_ADD_INCDIR($cf_1st_incdir)
+
+fi
+
+# Set definitions to allow ifdef'ing for ncurses.h
+
+case "$cf_cv_ncurses_header" in
+(*ncurses.h)
+	AC_DEFINE(HAVE_NCURSES_H,1,[Define to 1 if we have ncurses.h])
+	;;
+esac
+
+case "$cf_cv_ncurses_header" in
+(ncurses/curses.h|ncurses/ncurses.h)
+	AC_DEFINE(HAVE_NCURSES_NCURSES_H,1,[Define to 1 if we have ncurses/ncurses.h])
+	;;
+(ncursesw/curses.h|ncursesw/ncurses.h)
+	AC_DEFINE(HAVE_NCURSESW_NCURSES_H,1,[Define to 1 if we have ncursesw/ncurses.h])
+	;;
+esac
+
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_NCURSES_LIBS version: 21 updated: 2021/09/04 06:37:12
+dnl ---------------
+dnl Look for the ncurses library.  This is a little complicated on Linux,
+dnl because it may be linked with the gpm (general purpose mouse) library.
+dnl Some distributions have gpm linked with (bsd) curses, which makes it
+dnl unusable with ncurses.  However, we don't want to link with gpm unless
+dnl ncurses has a dependency, since gpm is normally set up as a shared library,
+dnl and the linker will record a dependency.
+dnl
+dnl The optional parameter gives the root name of the library, in case it is
+dnl not installed as the default curses library.  That is how the
+dnl wide-character version of ncurses is installed.
+AC_DEFUN([CF_NCURSES_LIBS],
+[AC_REQUIRE([CF_NCURSES_CPPFLAGS])
+
+cf_nculib_root=ifelse($1,,ncurses,$1)
+	# This works, except for the special case where we find gpm, but
+	# ncurses is in a nonstandard location via $LIBS, and we really want
+	# to link gpm.
+cf_ncurses_LIBS=""
+cf_ncurses_SAVE="$LIBS"
+AC_CHECK_LIB(gpm,Gpm_Open,
+	[AC_CHECK_LIB(gpm,initscr,
+		[LIBS="$cf_ncurses_SAVE"],
+		[cf_ncurses_LIBS="-lgpm"])])
+
+case "$host_os" in
+(freebsd*)
+	# This is only necessary if you are linking against an obsolete
+	# version of ncurses (but it should do no harm, since it is static).
+	if test "$cf_nculib_root" = ncurses ; then
+		AC_CHECK_LIB(mytinfo,tgoto,[cf_ncurses_LIBS="-lmytinfo $cf_ncurses_LIBS"])
+	fi
+	;;
+esac
+
+CF_ADD_LIBS($cf_ncurses_LIBS)
+
+if test -n "$cf_cv_curses_dir" && test "$cf_cv_curses_dir" != "no"
+then
+	CF_ADD_LIBS(-l$cf_nculib_root)
+else
+	CF_FIND_LIBRARY($cf_nculib_root,$cf_nculib_root,
+		[#include <${cf_cv_ncurses_header:-curses.h}>],
+		[initscr()],
+		initscr)
+fi
+
+if test -n "$cf_ncurses_LIBS" ; then
+	AC_MSG_CHECKING(if we can link $cf_nculib_root without $cf_ncurses_LIBS)
+	cf_ncurses_SAVE="$LIBS"
+	for p in $cf_ncurses_LIBS ; do
+		q=`echo "$LIBS" | sed -e "s%$p %%" -e "s%$p$%%"`
+		if test "$q" != "$LIBS" ; then
+			LIBS="$q"
+		fi
+	done
+	AC_TRY_LINK([#include <${cf_cv_ncurses_header:-curses.h}>],
+		[initscr(); mousemask(0,0); tigetstr((char *)0);],
+		[AC_MSG_RESULT(yes)],
+		[AC_MSG_RESULT(no)
+		 LIBS="$cf_ncurses_SAVE"])
+fi
+
+CF_UPPER(cf_nculib_ROOT,HAVE_LIB$cf_nculib_root)
+AC_DEFINE_UNQUOTED($cf_nculib_ROOT)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_NCURSES_PTHREADS version: 2 updated: 2016/04/22 05:07:41
+dnl -------------------
+dnl Use this followup check to ensure that we link with pthreads if ncurses
+dnl uses it.
+AC_DEFUN([CF_NCURSES_PTHREADS],[
+: ${cf_nculib_root:=ifelse($1,,ncurses,$1)}
+AC_CHECK_LIB($cf_nculib_root,_nc_init_pthreads,
+	cf_cv_ncurses_pthreads=yes,
+	cf_cv_ncurses_pthreads=no)
+if test "$cf_cv_ncurses_pthreads" = yes
+then
+	CF_ADD_LIBS(-lpthread)
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_NCURSES_VERSION version: 16 updated: 2020/12/31 20:19:42
+dnl ------------------
+dnl Check for the version of ncurses, to aid in reporting bugs, etc.
+dnl Call CF_CURSES_CPPFLAGS first, or CF_NCURSES_CPPFLAGS.  We don't use
+dnl AC_REQUIRE since that does not work with the shell's if/then/else/fi.
+AC_DEFUN([CF_NCURSES_VERSION],
+[
+AC_REQUIRE([CF_CURSES_CPPFLAGS])dnl
+AC_CACHE_CHECK(for ncurses version, cf_cv_ncurses_version,[
+	cf_cv_ncurses_version=no
+	cf_tempfile=out$$
+	rm -f "$cf_tempfile"
+	AC_TRY_RUN([
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <stdio.h>
+int main(void)
+{
+	FILE *fp = fopen("$cf_tempfile", "w");
+#ifdef NCURSES_VERSION
+# ifdef NCURSES_VERSION_PATCH
+	fprintf(fp, "%s.%d\\n", NCURSES_VERSION, NCURSES_VERSION_PATCH);
+# else
+	fprintf(fp, "%s\\n", NCURSES_VERSION);
+# endif
+#else
+# ifdef __NCURSES_H
+	fprintf(fp, "old\\n");
+# else
+	make an error
+# endif
+#endif
+	${cf_cv_main_return:-return}(0);
+}],[
+	cf_cv_ncurses_version=`cat $cf_tempfile`],,[
+
+	# This will not work if the preprocessor splits the line after the
+	# Autoconf token.  The 'unproto' program does that.
+	cat > "conftest.$ac_ext" <<EOF
+#include <${cf_cv_ncurses_header:-curses.h}>
+#undef Autoconf
+#ifdef NCURSES_VERSION
+Autoconf NCURSES_VERSION
+#else
+#ifdef __NCURSES_H
+Autoconf "old"
+#endif
+;
+#endif
+EOF
+	cf_try="$ac_cpp conftest.$ac_ext 2>&AC_FD_CC | grep '^Autoconf ' >conftest.out"
+	AC_TRY_EVAL(cf_try)
+	if test -f conftest.out ; then
+		cf_out=`sed -e 's%^Autoconf %%' -e 's%^[[^"]]*"%%' -e 's%".*%%' conftest.out`
+		test -n "$cf_out" && cf_cv_ncurses_version="$cf_out"
+		rm -f conftest.out
+	fi
+])
+	rm -f "$cf_tempfile"
+])
+test "$cf_cv_ncurses_version" = no || AC_DEFINE(NCURSES,1,[Define to 1 if we are using ncurses headers/libraries])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_NCURSES_WRAP_PREFIX version: 1 updated: 2009/03/28 16:08:10
+dnl ----------------------
+dnl Check for ncurses "wrap-prefix" used for public variables which have been
+dnl wrapped with a function to help with concurrency control.
+AC_DEFUN([CF_NCURSES_WRAP_PREFIX],
+[
+AC_MSG_CHECKING(for ncurses wrap-prefix)
+AC_ARG_WITH(ncurses-wrap-prefix,
+	[  --with-ncurses-wrap-prefix naming-prefix for ncurses wrapped-variables],
+	[NCURSES_WRAP_PREFIX=$withval],
+	[NCURSES_WRAP_PREFIX=_nc_])
+AC_MSG_RESULT($NCURSES_WRAP_PREFIX)
+
+AC_SUBST(NCURSES_WRAP_PREFIX)
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_NETBSD_FORM_H version: 2 updated: 2012/10/06 16:39:58
+dnl ----------------
+dnl Check for NetBSD's form.h, which is incompatible with SVr4 and ncurses.
+dnl Some workarounds are needed in client programs to allow them to compile.
+AC_DEFUN([CF_NETBSD_FORM_H],[
+AC_CACHE_CHECK(for NetBSD form.h,cf_cv_netbsd_form_h,[
+AC_TRY_COMPILE([
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <form.h>
+],[
+	FORM *form;
+	int y = current_field(form)->cursor_ypos;
+	int x = current_field(form)->cursor_xpos;
+],[cf_cv_netbsd_form_h=yes
+],[cf_cv_netbsd_form_h=no])
+])
+
+test "$cf_cv_netbsd_form_h" = yes && AC_DEFINE(HAVE_NETBSD_FORM_H,1,[Define to 1 if we appear to be using NetBSD form.h])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_NETBSD_MENU_H version: 2 updated: 2012/10/06 16:39:58
+dnl ----------------
+dnl Check for NetBSD's menu.h, which is incompatible with SVr4 and ncurses.
+dnl Some workarounds are needed in client programs to allow them to compile.
+AC_DEFUN([CF_NETBSD_MENU_H],[
+AC_CACHE_CHECK(for NetBSD menu.h,cf_cv_netbsd_menu_h,[
+AC_TRY_COMPILE([
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <menu.h>
+],[
+	MENU *menu;
+	int y = menu->max_item_width;
+],[cf_cv_netbsd_menu_h=yes
+],[cf_cv_netbsd_menu_h=no])
+])
+
+test "$cf_cv_netbsd_menu_h" = yes && AC_DEFINE(HAVE_NETBSD_MENU_H,1,[Define to 1 if we appear to be using NetBSD menu.h])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_NO_LEAKS_OPTION version: 9 updated: 2021/06/13 19:45:41
+dnl ------------------
+dnl see CF_WITH_NO_LEAKS
+dnl
+dnl $1 = option/name
+dnl $2 = help-text
+dnl $3 = symbol to define if the option is set
+dnl $4 = additional actions to take if the option is set
+AC_DEFUN([CF_NO_LEAKS_OPTION],[
+AC_MSG_CHECKING(if you want to use $1 for testing)
+AC_ARG_WITH($1,
+	[$2],
+	[case "x$withval" in
+	(x|xno) ;;
+	(*)
+		: "${with_cflags:=-g}"
+		: "${enable_leaks:=no}"
+		with_$1=yes
+		AC_DEFINE_UNQUOTED($3,1,"Define to 1 if you want to use $1 for testing.")ifelse([$4],,[
+	 $4
+])
+		;;
+	esac],
+	[with_$1=])
+AC_MSG_RESULT(${with_$1:-no})
+
+case ".$with_cflags" in
+(.*-g*)
+	case .$CFLAGS in
+	(.*-g*)
+		;;
+	(*)
+		CF_ADD_CFLAGS([-g])
+		;;
+	esac
+	;;
+esac
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PATH_SYNTAX version: 18 updated: 2020/12/31 18:40:20
+dnl --------------
+dnl Check the argument to see that it looks like a pathname.  Rewrite it if it
+dnl begins with one of the prefix/exec_prefix variables, and then again if the
+dnl result begins with 'NONE'.  This is necessary to work around autoconf's
+dnl delayed evaluation of those symbols.
+AC_DEFUN([CF_PATH_SYNTAX],[
+if test "x$prefix" != xNONE; then
+	cf_path_syntax="$prefix"
+else
+	cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".[$]$1" in
+(.\[$]\(*\)*|.\'*\'*)
+	;;
+(..|./*|.\\*)
+	;;
+(.[[a-zA-Z]]:[[\\/]]*) # OS/2 EMX
+	;;
+(.\[$]\{*prefix\}*|.\[$]\{*dir\}*)
+	eval $1="[$]$1"
+	case ".[$]$1" in
+	(.NONE/*)
+		$1=`echo "[$]$1" | sed -e s%NONE%$cf_path_syntax%`
+		;;
+	esac
+	;;
+(.no|.NONE/*)
+	$1=`echo "[$]$1" | sed -e s%NONE%$cf_path_syntax%`
+	;;
+(*)
+	ifelse([$2],,[AC_MSG_ERROR([expected a pathname, not \"[$]$1\"])],$2)
+	;;
+esac
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PDCURSES_X11 version: 15 updated: 2021/01/02 09:31:20
+dnl ---------------
+dnl Configure for PDCurses' X11 library
+AC_DEFUN([CF_PDCURSES_X11],[
+AC_REQUIRE([CF_X_ATHENA])
+
+CF_ACVERSION_CHECK(2.52,
+	[AC_CHECK_TOOLS(XCURSES_CONFIG, xcurses-config, none)],
+	[AC_PATH_PROGS(XCURSES_CONFIG, xcurses-config, none)])
+
+if test "$XCURSES_CONFIG" != none ; then
+
+CF_ADD_CFLAGS(`$XCURSES_CONFIG --cflags`)
+CF_ADD_LIBS(`$XCURSES_CONFIG --libs`)
+
+cf_cv_lib_XCurses=yes
+
+else
+
+LDFLAGS="$LDFLAGS $X_LIBS"
+CF_CHECK_CFLAGS($X_CFLAGS)
+AC_CHECK_LIB(X11,XOpenDisplay,
+	[CF_ADD_LIBS(-lX11)],,
+	[$X_PRE_LIBS $LIBS $X_EXTRA_LIBS])
+AC_CACHE_CHECK(for XCurses library,cf_cv_lib_XCurses,[
+CF_ADD_LIBS(-lXCurses)
+AC_TRY_LINK([
+#include <xcurses.h>
+char *XCursesProgramName = "test";
+],[XCursesExit();],
+[cf_cv_lib_XCurses=yes],
+[cf_cv_lib_XCurses=no])
+])
+
+fi
+
+if test "$cf_cv_lib_XCurses" = yes ; then
+	AC_DEFINE(UNIX,1,[Define to 1 if using PDCurses on Unix])
+	AC_DEFINE(XCURSES,1,[Define to 1 if using PDCurses on Unix])
+	AC_CHECK_HEADER(xcurses.h, AC_DEFINE(HAVE_XCURSES,1,[Define to 1 if using PDCurses on Unix]))
+else
+	AC_MSG_ERROR(Cannot link with XCurses)
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PKG_CONFIG version: 12 updated: 2021/10/10 20:18:09
+dnl -------------
+dnl Check for the package-config program, unless disabled by command-line.
+dnl
+dnl Sets $PKG_CONFIG to the pathname of the pkg-config program.
+AC_DEFUN([CF_PKG_CONFIG],
+[
+AC_MSG_CHECKING(if you want to use pkg-config)
+AC_ARG_WITH(pkg-config,
+	[  --with-pkg-config{=path} enable/disable use of pkg-config],
+	[cf_pkg_config=$withval],
+	[cf_pkg_config=yes])
+AC_MSG_RESULT($cf_pkg_config)
+
+case "$cf_pkg_config" in
+(no)
+	PKG_CONFIG=none
+	;;
+(yes)
+	CF_ACVERSION_CHECK(2.52,
+		[AC_PATH_TOOL(PKG_CONFIG, pkg-config, none)],
+		[AC_PATH_PROG(PKG_CONFIG, pkg-config, none)])
+	;;
+(*)
+	PKG_CONFIG=$withval
+	;;
+esac
+
+test -z "$PKG_CONFIG" && PKG_CONFIG=none
+if test "$PKG_CONFIG" != none ; then
+	CF_PATH_SYNTAX(PKG_CONFIG)
+elif test "x$cf_pkg_config" != xno ; then
+	AC_MSG_WARN(pkg-config is not installed)
+fi
+
+AC_SUBST(PKG_CONFIG)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_POSIX_C_SOURCE version: 11 updated: 2018/12/31 20:46:17
+dnl -----------------
+dnl Define _POSIX_C_SOURCE to the given level, and _POSIX_SOURCE if needed.
+dnl
+dnl	POSIX.1-1990				_POSIX_SOURCE
+dnl	POSIX.1-1990 and			_POSIX_SOURCE and
+dnl		POSIX.2-1992 C-Language			_POSIX_C_SOURCE=2
+dnl		Bindings Option
+dnl	POSIX.1b-1993				_POSIX_C_SOURCE=199309L
+dnl	POSIX.1c-1996				_POSIX_C_SOURCE=199506L
+dnl	X/Open 2000				_POSIX_C_SOURCE=200112L
+dnl
+dnl Parameters:
+dnl	$1 is the nominal value for _POSIX_C_SOURCE
+AC_DEFUN([CF_POSIX_C_SOURCE],
+[AC_REQUIRE([CF_POSIX_VISIBLE])dnl
+
+if test "$cf_cv_posix_visible" = no; then
+
+cf_POSIX_C_SOURCE=ifelse([$1],,199506L,[$1])
+
+cf_save_CFLAGS="$CFLAGS"
+cf_save_CPPFLAGS="$CPPFLAGS"
+
+CF_REMOVE_DEFINE(cf_trim_CFLAGS,$cf_save_CFLAGS,_POSIX_C_SOURCE)
+CF_REMOVE_DEFINE(cf_trim_CPPFLAGS,$cf_save_CPPFLAGS,_POSIX_C_SOURCE)
+
+AC_CACHE_CHECK(if we should define _POSIX_C_SOURCE,cf_cv_posix_c_source,[
+	CF_MSG_LOG(if the symbol is already defined go no further)
+	AC_TRY_COMPILE([#include <sys/types.h>],[
+#ifndef _POSIX_C_SOURCE
+make an error
+#endif],
+	[cf_cv_posix_c_source=no],
+	[cf_want_posix_source=no
+	 case .$cf_POSIX_C_SOURCE in
+	 (.[[12]]??*)
+		cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE"
+		;;
+	 (.2)
+		cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE"
+		cf_want_posix_source=yes
+		;;
+	 (.*)
+		cf_want_posix_source=yes
+		;;
+	 esac
+	 if test "$cf_want_posix_source" = yes ; then
+		AC_TRY_COMPILE([#include <sys/types.h>],[
+#ifdef _POSIX_SOURCE
+make an error
+#endif],[],
+		cf_cv_posix_c_source="$cf_cv_posix_c_source -D_POSIX_SOURCE")
+	 fi
+	 CF_MSG_LOG(ifdef from value $cf_POSIX_C_SOURCE)
+	 CFLAGS="$cf_trim_CFLAGS"
+	 CPPFLAGS="$cf_trim_CPPFLAGS"
+	 CF_APPEND_TEXT(CPPFLAGS,$cf_cv_posix_c_source)
+	 CF_MSG_LOG(if the second compile does not leave our definition intact error)
+	 AC_TRY_COMPILE([#include <sys/types.h>],[
+#ifndef _POSIX_C_SOURCE
+make an error
+#endif],,
+	 [cf_cv_posix_c_source=no])
+	 CFLAGS="$cf_save_CFLAGS"
+	 CPPFLAGS="$cf_save_CPPFLAGS"
+	])
+])
+
+if test "$cf_cv_posix_c_source" != no ; then
+	CFLAGS="$cf_trim_CFLAGS"
+	CPPFLAGS="$cf_trim_CPPFLAGS"
+	CF_ADD_CFLAGS($cf_cv_posix_c_source)
+fi
+
+fi # cf_cv_posix_visible
+
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_POSIX_VISIBLE version: 1 updated: 2018/12/31 20:46:17
+dnl ----------------
+dnl POSIX documents test-macros which an application may set before any system
+dnl headers are included to make features available.
+dnl
+dnl Some BSD platforms (originally FreeBSD, but copied by a few others)
+dnl diverged from POSIX in 2002 by setting symbols which make all of the most
+dnl recent features visible in the system header files unless the application
+dnl overrides the corresponding test-macros.  Doing that introduces portability
+dnl problems.
+dnl
+dnl This macro makes a special check for the symbols used for this, to avoid a
+dnl conflicting definition.
+AC_DEFUN([CF_POSIX_VISIBLE],
+[
+AC_CACHE_CHECK(if the POSIX test-macros are already defined,cf_cv_posix_visible,[
+AC_TRY_COMPILE([#include <stdio.h>],[
+#if defined(__POSIX_VISIBLE) && ((__POSIX_VISIBLE - 0L) > 0) \
+	&& defined(__XSI_VISIBLE) && ((__XSI_VISIBLE - 0L) > 0) \
+	&& defined(__BSD_VISIBLE) && ((__BSD_VISIBLE - 0L) > 0) \
+	&& defined(__ISO_C_VISIBLE) && ((__ISO_C_VISIBLE - 0L) > 0)
+#error conflicting symbols found
+#endif
+],[cf_cv_posix_visible=no],[cf_cv_posix_visible=yes])
+])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PRG_RULES version: 2 updated: 2021/01/01 13:31:04
+dnl ------------
+dnl Append definitions and rules for the given programs to the subdirectory
+dnl Makefiles, and the recursion rule for the top-level Makefile.
+dnl
+dnl parameters
+dnl	$1 = script to run
+dnl	$2 = list of subdirectories
+dnl
+dnl variables
+dnl	$AWK
+AC_DEFUN([CF_PRG_RULES],
+[
+for cf_dir in $2
+do
+	if test ! -d "$srcdir/$cf_dir" ; then
+		continue
+	elif test -f "$srcdir/$cf_dir/programs" ; then
+		$AWK -f $1 "$srcdir/$cf_dir/programs" >>$cf_dir/Makefile
+	fi
+done
+
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PROG_CC version: 5 updated: 2019/12/31 08:53:54
+dnl ----------
+dnl standard check for CC, plus followup sanity checks
+dnl $1 = optional parameter to pass to AC_PROG_CC to specify compiler name
+AC_DEFUN([CF_PROG_CC],[
+CF_ACVERSION_CHECK(2.53,
+	[AC_MSG_WARN(this will incorrectly handle gnatgcc choice)
+	 AC_REQUIRE([AC_PROG_CC])],
+	[])
+ifelse($1,,[AC_PROG_CC],[AC_PROG_CC($1)])
+CF_GCC_VERSION
+CF_ACVERSION_CHECK(2.52,
+	[AC_PROG_CC_STDC],
+	[CF_ANSI_CC_REQD])
+CF_CC_ENV_FLAGS
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PROG_INSTALL version: 10 updated: 2021/01/04 19:33:05
+dnl ---------------
+dnl Force $INSTALL to be an absolute-path.  Otherwise, edit_man.sh and the
+dnl misc/tabset install won't work properly.  Usually this happens only when
+dnl using the fallback mkinstalldirs script
+AC_DEFUN([CF_PROG_INSTALL],
+[AC_PROG_INSTALL
+case $INSTALL in
+(/*)
+	;;
+(*)
+	CF_DIRNAME(cf_dir,$INSTALL)
+	test -z "$cf_dir" && cf_dir=.
+	INSTALL="`cd \"$cf_dir\" && pwd`"/"`echo "$INSTALL" | sed -e 's%^.*/%%'`"
+	;;
+esac
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PROG_LINT version: 5 updated: 2022/08/20 15:44:13
+dnl ------------
+AC_DEFUN([CF_PROG_LINT],
+[
+AC_CHECK_PROGS(LINT, lint cppcheck splint)
+case "x$LINT" in
+(xcppcheck|x*/cppcheck)
+	test -z "$LINT_OPTS" && LINT_OPTS="--enable=all"
+	;;
+esac
+AC_SUBST(LINT_OPTS)
+AC_SUBST(LINT_LIBS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_REMOVE_CFLAGS version: 3 updated: 2021/09/05 17:25:40
+dnl ----------------
+dnl Remove a given option from CFLAGS/CPPFLAGS
+dnl $1 = option to remove
+dnl $2 = variable to update
+dnl $3 = nonempty to allow verbose message
+define([CF_REMOVE_CFLAGS],
+[
+cf_tmp_cflag=`echo "x$1" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x[$]$2" | sed -e 's/^.//' -e 's/[[ 	]][[ 	]]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[[^ 	]][[^ 	]]*\\)\?%%" -e 's/^[[ 	]]*//' -e 's%[[ ]][[ ]]*-D% -D%g' -e 's%[[ ]][[ ]]*-I% -I%g'`
+	test "[$]$2" != "$cf_old_cflag" || break
+	ifelse([$3],,,[CF_VERBOSE(removing old option $1 from $2)])
+	$2="$cf_old_cflag"
+done
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_REMOVE_DEFINE version: 3 updated: 2010/01/09 11:05:50
+dnl ----------------
+dnl Remove all -U and -D options that refer to the given symbol from a list
+dnl of C compiler options.  This works around the problem that not all
+dnl compilers process -U and -D options from left-to-right, so a -U option
+dnl cannot be used to cancel the effect of a preceding -D option.
+dnl
+dnl $1 = target (which could be the same as the source variable)
+dnl $2 = source (including '$')
+dnl $3 = symbol to remove
+define([CF_REMOVE_DEFINE],
+[
+$1=`echo "$2" | \
+	sed	-e 's/-[[UD]]'"$3"'\(=[[^ 	]]*\)\?[[ 	]]/ /g' \
+		-e 's/-[[UD]]'"$3"'\(=[[^ 	]]*\)\?[$]//g'`
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_RESTORE_XTRA_FLAGS version: 1 updated: 2020/01/11 16:47:45
+dnl ---------------------
+dnl Restore flags saved in CF_SAVE_XTRA_FLAGS
+dnl $1 = name of current macro
+define([CF_RESTORE_XTRA_FLAGS],
+[
+LIBS="$cf_save_LIBS_$1"
+CFLAGS="$cf_save_CFLAGS_$1"
+CPPFLAGS="$cf_save_CPPFLAGS_$1"
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_RPATH_HACK version: 13 updated: 2021/01/03 18:30:50
+dnl -------------
+AC_DEFUN([CF_RPATH_HACK],
+[AC_REQUIRE([AC_PROG_FGREP])dnl
+AC_REQUIRE([CF_LD_RPATH_OPT])dnl
+
+AC_MSG_CHECKING(for updated LDFLAGS)
+if test -n "$LD_RPATH_OPT" ; then
+	AC_MSG_RESULT(maybe)
+
+	AC_CHECK_PROGS(cf_ldd_prog,ldd,no)
+	cf_rpath_list="/usr/lib /lib"
+	if test "$cf_ldd_prog" != no
+	then
+		cf_rpath_oops=
+
+AC_TRY_LINK([#include <stdio.h>],
+		[printf("Hello");],
+		[cf_rpath_oops=`"$cf_ldd_prog" "conftest$ac_exeext" | ${FGREP-fgrep} ' not found' | sed -e 's% =>.*$%%' |sort | uniq`
+		 cf_rpath_list=`"$cf_ldd_prog" "conftest$ac_exeext" | ${FGREP-fgrep} / | sed -e 's%^.*[[ 	]]/%/%' -e 's%/[[^/]][[^/]]*$%%' |sort | uniq`])
+
+		# If we passed the link-test, but get a "not found" on a given library,
+		# this could be due to inept reconfiguration of gcc to make it only
+		# partly honor /usr/local/lib (or whatever).  Sometimes this behavior
+		# is intentional, e.g., installing gcc in /usr/bin and suppressing the
+		# /usr/local libraries.
+		if test -n "$cf_rpath_oops"
+		then
+			for cf_rpath_src in $cf_rpath_oops
+			do
+				for cf_rpath_dir in \
+					/usr/local \
+					/usr/pkg \
+					/opt/sfw
+				do
+					if test -f "$cf_rpath_dir/lib/$cf_rpath_src"
+					then
+						CF_VERBOSE(...adding -L$cf_rpath_dir/lib to LDFLAGS for $cf_rpath_src)
+						LDFLAGS="$LDFLAGS -L$cf_rpath_dir/lib"
+						break
+					fi
+				done
+			done
+		fi
+	fi
+
+	CF_VERBOSE(...checking EXTRA_LDFLAGS $EXTRA_LDFLAGS)
+
+	CF_RPATH_HACK_2(LDFLAGS)
+	CF_RPATH_HACK_2(LIBS)
+
+	CF_VERBOSE(...checked EXTRA_LDFLAGS $EXTRA_LDFLAGS)
+else
+	AC_MSG_RESULT(no)
+fi
+AC_SUBST(EXTRA_LDFLAGS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_RPATH_HACK_2 version: 8 updated: 2021/01/01 13:31:04
+dnl ---------------
+dnl Do one set of substitutions for CF_RPATH_HACK, adding an rpath option to
+dnl EXTRA_LDFLAGS for each -L option found.
+dnl
+dnl $cf_rpath_list contains a list of directories to ignore.
+dnl
+dnl $1 = variable name to update.  The LDFLAGS variable should be the only one,
+dnl      but LIBS often has misplaced -L options.
+AC_DEFUN([CF_RPATH_HACK_2],
+[
+CF_VERBOSE(...checking $1 [$]$1)
+
+cf_rpath_dst=
+for cf_rpath_src in [$]$1
+do
+	case "$cf_rpath_src" in
+	(-L*)
+
+		# check if this refers to a directory which we will ignore
+		cf_rpath_skip=no
+		if test -n "$cf_rpath_list"
+		then
+			for cf_rpath_item in $cf_rpath_list
+			do
+				if test "x$cf_rpath_src" = "x-L$cf_rpath_item"
+				then
+					cf_rpath_skip=yes
+					break
+				fi
+			done
+		fi
+
+		if test "$cf_rpath_skip" = no
+		then
+			# transform the option
+			if test "$LD_RPATH_OPT" = "-R " ; then
+				cf_rpath_tmp=`echo "$cf_rpath_src" |sed -e "s%-L%-R %"`
+			else
+				cf_rpath_tmp=`echo "$cf_rpath_src" |sed -e "s%-L%$LD_RPATH_OPT%"`
+			fi
+
+			# if we have not already added this, add it now
+			cf_rpath_tst=`echo "$EXTRA_LDFLAGS" | sed -e "s%$cf_rpath_tmp %%"`
+			if test "x$cf_rpath_tst" = "x$EXTRA_LDFLAGS"
+			then
+				CF_VERBOSE(...Filter $cf_rpath_src ->$cf_rpath_tmp)
+				EXTRA_LDFLAGS="$cf_rpath_tmp $EXTRA_LDFLAGS"
+			fi
+		fi
+		;;
+	esac
+	cf_rpath_dst="$cf_rpath_dst $cf_rpath_src"
+done
+$1=$cf_rpath_dst
+
+CF_VERBOSE(...checked $1 [$]$1)
+AC_SUBST(EXTRA_LDFLAGS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_SAVE_XTRA_FLAGS version: 1 updated: 2020/01/11 16:46:44
+dnl ------------------
+dnl Use this macro to save CFLAGS/CPPFLAGS/LIBS before checks against X headers
+dnl and libraries which do not update those variables.
+dnl
+dnl $1 = name of current macro
+define([CF_SAVE_XTRA_FLAGS],
+[
+cf_save_LIBS_$1="$LIBS"
+cf_save_CFLAGS_$1="$CFLAGS"
+cf_save_CPPFLAGS_$1="$CPPFLAGS"
+LIBS="$LIBS ${X_PRE_LIBS} ${X_LIBS} ${X_EXTRA_LIBS}"
+for cf_X_CFLAGS in $X_CFLAGS
+do
+	case "x$cf_X_CFLAGS" in
+	x-[[IUD]]*)
+		CPPFLAGS="$CPPFLAGS $cf_X_CFLAGS"
+		;;
+	*)
+		CFLAGS="$CFLAGS $cf_X_CFLAGS"
+		;;
+	esac
+done
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_SIGWINCH version: 6 updated: 2021/01/01 13:31:04
+dnl -----------
+dnl Use this macro after CF_XOPEN_SOURCE, but do not require it (not all
+dnl programs need this test).
+dnl
+dnl This is really a Mac OS X 10.4.3 workaround.  Defining _POSIX_C_SOURCE
+dnl forces SIGWINCH to be undefined (breaks xterm, ncurses).  Oddly, the struct
+dnl winsize declaration is left alone - we may revisit this if Apple choose to
+dnl break that part of the interface as well.
+AC_DEFUN([CF_SIGWINCH],
+[
+AC_CACHE_CHECK(if SIGWINCH is defined,cf_cv_define_sigwinch,[
+	AC_TRY_COMPILE([
+#include <sys/types.h>
+#include <sys/signal.h>
+],[int x = SIGWINCH; (void)x],
+	[cf_cv_define_sigwinch=yes],
+	[AC_TRY_COMPILE([
+#undef _XOPEN_SOURCE
+#undef _POSIX_SOURCE
+#undef _POSIX_C_SOURCE
+#include <sys/types.h>
+#include <sys/signal.h>
+],[int x = SIGWINCH; (void)x],
+	[cf_cv_define_sigwinch=maybe],
+	[cf_cv_define_sigwinch=no])
+])
+])
+
+if test "$cf_cv_define_sigwinch" = maybe ; then
+AC_CACHE_CHECK(for actual SIGWINCH definition,cf_cv_fixup_sigwinch,[
+cf_cv_fixup_sigwinch=unknown
+cf_sigwinch=32
+while test "$cf_sigwinch" != 1
+do
+	AC_TRY_COMPILE([
+#undef _XOPEN_SOURCE
+#undef _POSIX_SOURCE
+#undef _POSIX_C_SOURCE
+#include <sys/types.h>
+#include <sys/signal.h>
+],[
+#if SIGWINCH != $cf_sigwinch
+make an error
+#endif
+int x = SIGWINCH; (void)x],
+	[cf_cv_fixup_sigwinch=$cf_sigwinch
+	 break])
+
+cf_sigwinch="`expr "$cf_sigwinch" - 1`"
+done
+])
+
+	if test "$cf_cv_fixup_sigwinch" != unknown ; then
+		CPPFLAGS="$CPPFLAGS -DSIGWINCH=$cf_cv_fixup_sigwinch"
+	fi
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_SIG_ATOMIC_T version: 5 updated: 2020/03/10 18:53:47
+dnl ---------------
+dnl signal handler, but there are some gcc dependencies in that recommendation.
+dnl Try anyway.
+AC_DEFUN([CF_SIG_ATOMIC_T],
+[
+AC_MSG_CHECKING(for signal global datatype)
+AC_CACHE_VAL(cf_cv_sig_atomic_t,[
+	for cf_type in \
+		"volatile sig_atomic_t" \
+		"sig_atomic_t" \
+		"int"
+	do
+	AC_TRY_COMPILE([
+#include <sys/types.h>
+#include <signal.h>
+#include <stdio.h>
+
+extern $cf_type x;
+$cf_type x;
+static void handler(int sig)
+{
+	(void)sig;
+	x = 5;
+}],
+		[signal(SIGINT, handler);
+		 x = 1],
+		[cf_cv_sig_atomic_t=$cf_type],
+		[cf_cv_sig_atomic_t=no])
+		test "$cf_cv_sig_atomic_t" != no && break
+	done
+	])
+AC_MSG_RESULT($cf_cv_sig_atomic_t)
+test "$cf_cv_sig_atomic_t" != no && AC_DEFINE_UNQUOTED(SIG_ATOMIC_T, $cf_cv_sig_atomic_t,[Define to signal global datatype])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_SUBDIR_PATH version: 7 updated: 2014/12/04 04:33:06
+dnl --------------
+dnl Construct a search-list for a nonstandard header/lib-file
+dnl	$1 = the variable to return as result
+dnl	$2 = the package name
+dnl	$3 = the subdirectory, e.g., bin, include or lib
+AC_DEFUN([CF_SUBDIR_PATH],
+[
+$1=
+
+CF_ADD_SUBDIR_PATH($1,$2,$3,$prefix,NONE)
+
+for cf_subdir_prefix in \
+	/usr \
+	/usr/local \
+	/usr/pkg \
+	/opt \
+	/opt/local \
+	[$]HOME
+do
+	CF_ADD_SUBDIR_PATH($1,$2,$3,$cf_subdir_prefix,$prefix)
+done
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_SYS_TIME_SELECT version: 6 updated: 2015/04/18 08:56:57
+dnl ------------------
+dnl Check if we can include <sys/time.h> with <sys/select.h>; this breaks on
+dnl older SCO configurations.
+AC_DEFUN([CF_SYS_TIME_SELECT],
+[
+AC_MSG_CHECKING(if sys/time.h works with sys/select.h)
+AC_CACHE_VAL(cf_cv_sys_time_select,[
+AC_TRY_COMPILE([
+#include <sys/types.h>
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#ifdef HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
+],[],[cf_cv_sys_time_select=yes],
+	 [cf_cv_sys_time_select=no])
+	 ])
+AC_MSG_RESULT($cf_cv_sys_time_select)
+test "$cf_cv_sys_time_select" = yes && AC_DEFINE(HAVE_SYS_TIME_SELECT,1,[Define to 1 if we can include <sys/time.h> with <sys/select.h>])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_TERM_HEADER version: 6 updated: 2021/01/02 09:31:20
+dnl --------------
+dnl Look for term.h, which is part of X/Open curses.  It defines the interface
+dnl to terminfo database.  Usually it is in the same include-path as curses.h,
+dnl but some packagers change this, breaking various applications.
+AC_DEFUN([CF_TERM_HEADER],[
+AC_CACHE_CHECK(for terminfo header, cf_cv_term_header,[
+case "${cf_cv_ncurses_header}" in
+(*/ncurses.h|*/ncursesw.h)
+	cf_term_header=`echo "$cf_cv_ncurses_header" | sed -e 's%ncurses[[^.]]*\.h$%term.h%'`
+	;;
+(*)
+	cf_term_header=term.h
+	;;
+esac
+
+for cf_test in $cf_term_header "ncurses/term.h" "ncursesw/term.h"
+do
+AC_TRY_COMPILE([#include <stdio.h>
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <$cf_test>
+],[int x = auto_left_margin; (void)x],[
+	cf_cv_term_header="$cf_test"],[
+	cf_cv_term_header=unknown
+	])
+	test "$cf_cv_term_header" != unknown && break
+done
+])
+
+# Set definitions to allow ifdef'ing to accommodate subdirectories
+
+case "$cf_cv_term_header" in
+(*term.h)
+	AC_DEFINE(HAVE_TERM_H,1,[Define to 1 if we have term.h])
+	;;
+esac
+
+case "$cf_cv_term_header" in
+(ncurses/term.h)
+	AC_DEFINE(HAVE_NCURSES_TERM_H,1,[Define to 1 if we have ncurses/term.h])
+	;;
+(ncursesw/term.h)
+	AC_DEFINE(HAVE_NCURSESW_TERM_H,1,[Define to 1 if we have ncursesw/term.h])
+	;;
+esac
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_TOP_BUILDDIR version: 2 updated: 2013/07/27 17:38:32
+dnl ---------------
+dnl Define a top_builddir symbol, for applications that need an absolute path.
+AC_DEFUN([CF_TOP_BUILDDIR],
+[
+top_builddir=ifelse($1,,`pwd`,$1)
+AC_SUBST(top_builddir)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_TPUTS_PROTO version: 4 updated: 2021/01/04 19:45:09
+dnl --------------
+dnl Check for type of function-pointer passed to tputs.  Some old
+dnl implementations used functions that had different prototypes, making it
+dnl hard to compile portable programs using tputs.
+AC_DEFUN([CF_TPUTS_PROTO],[
+CF_CURSES_FUNCS(tputs)
+if test "x$cf_cv_func_tputs" = xyes
+then
+	cf_done=no
+	for cf_arg in int char
+	do
+		for cf_ret in int void
+		do
+			if test "$cf_ret" = void
+			then
+				cf_return="/* nothing */"
+			else
+				cf_return="return value"
+			fi
+			AC_TRY_COMPILE([
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <$cf_cv_term_header>
+
+static $cf_ret outc($cf_arg value) { $cf_return; }
+],[
+	tputs("hello", 0, outc);
+	${cf_cv_main_return:-return}(0);
+],[
+		CF_VERBOSE([prototype $cf_ret func($cf_arg value)])
+		cat >>confdefs.h <<EOF
+#define TPUTS_ARG               $cf_arg
+#define TPUTS_PROTO(func,value) $cf_ret func(TPUTS_ARG value)
+#define TPUTS_RETURN(value)     $cf_return
+EOF
+		cf_done=yes
+		break
+])
+		done
+		test "$cf_done" = yes && break
+	done
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_TRIM_X_LIBS version: 3 updated: 2015/04/12 15:39:00
+dnl --------------
+dnl Trim extra base X libraries added as a workaround for inconsistent library
+dnl dependencies returned by "new" pkg-config files.
+AC_DEFUN([CF_TRIM_X_LIBS],[
+	for cf_trim_lib in Xmu Xt X11
+	do
+		case "$LIBS" in
+		(*-l$cf_trim_lib\ *-l$cf_trim_lib*)
+			LIBS=`echo "$LIBS " | sed -e 's/  / /g' -e 's%-l'"$cf_trim_lib"' %%' -e 's/ $//'`
+			CF_VERBOSE(..trimmed $LIBS)
+			;;
+		esac
+	done
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_TRY_PKG_CONFIG version: 6 updated: 2020/12/31 10:54:15
+dnl -----------------
+dnl This is a simple wrapper to use for pkg-config, for libraries which may be
+dnl available in that form.
+dnl
+dnl $1 = package name, which may be a shell variable
+dnl $2 = extra logic to use, if any, after updating CFLAGS and LIBS
+dnl $3 = logic to use if pkg-config does not have the package
+AC_DEFUN([CF_TRY_PKG_CONFIG],[
+AC_REQUIRE([CF_PKG_CONFIG])
+
+if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists "$1"; then
+	CF_VERBOSE(found package $1)
+	cf_pkgconfig_incs="`$PKG_CONFIG --cflags "$1" 2>/dev/null`"
+	cf_pkgconfig_libs="`$PKG_CONFIG --libs   "$1" 2>/dev/null`"
+	CF_VERBOSE(package $1 CFLAGS: $cf_pkgconfig_incs)
+	CF_VERBOSE(package $1 LIBS: $cf_pkgconfig_libs)
+	CF_ADD_CFLAGS($cf_pkgconfig_incs)
+	CF_ADD_LIBS($cf_pkgconfig_libs)
+	ifelse([$2],,:,[$2])
+else
+	cf_pkgconfig_incs=
+	cf_pkgconfig_libs=
+	ifelse([$3],,:,[$3])
+fi
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_TRY_XOPEN_SOURCE version: 4 updated: 2022/09/10 15:16:16
+dnl -------------------
+dnl If _XOPEN_SOURCE is not defined in the compile environment, check if we
+dnl can define it successfully.
+AC_DEFUN([CF_TRY_XOPEN_SOURCE],[
+AC_CACHE_CHECK(if we should define _XOPEN_SOURCE,cf_cv_xopen_source,[
+	AC_TRY_COMPILE(CF__XOPEN_SOURCE_HEAD,CF__XOPEN_SOURCE_BODY,
+	[cf_cv_xopen_source=no],
+	[cf_save="$CPPFLAGS"
+	 CF_APPEND_TEXT(CPPFLAGS,-D_XOPEN_SOURCE=$cf_XOPEN_SOURCE)
+	 AC_TRY_COMPILE(CF__XOPEN_SOURCE_HEAD,CF__XOPEN_SOURCE_BODY,
+		[cf_cv_xopen_source=no],
+		[cf_cv_xopen_source=$cf_XOPEN_SOURCE])
+		CPPFLAGS="$cf_save"
+	])
+])
+
+if test "$cf_cv_xopen_source" != no ; then
+	CF_REMOVE_DEFINE(CFLAGS,$CFLAGS,_XOPEN_SOURCE)
+	CF_REMOVE_DEFINE(CPPFLAGS,$CPPFLAGS,_XOPEN_SOURCE)
+	cf_temp_xopen_source="-D_XOPEN_SOURCE=$cf_cv_xopen_source"
+	CF_APPEND_CFLAGS($cf_temp_xopen_source)
+fi
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_UPPER version: 5 updated: 2001/01/29 23:40:59
+dnl --------
+dnl Make an uppercase version of a variable
+dnl $1=uppercase($2)
+AC_DEFUN([CF_UPPER],
+[
+$1=`echo "$2" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_UTF8_LIB version: 9 updated: 2021/05/19 19:35:25
+dnl -----------
+dnl Check for multibyte support, and if not found, utf8 compatibility library
+AC_DEFUN([CF_UTF8_LIB],
+[
+AC_HAVE_HEADERS(wchar.h)
+AC_CACHE_CHECK(for multibyte character support,cf_cv_utf8_lib,[
+	cf_save_LIBS="$LIBS"
+	AC_TRY_LINK([
+#include <stdlib.h>
+#include <stdio.h>
+#ifdef HAVE_WCHAR_H
+#include <wchar.h>
+#endif
+],[putwc(0,0);],
+	[cf_cv_utf8_lib=yes],
+	[CF_FIND_LINKAGE([
+#include <libutf8.h>],[putwc(0,0);],utf8,
+		[cf_cv_utf8_lib=add-on],
+		[cf_cv_utf8_lib=no])
+])])
+
+# HAVE_LIBUTF8_H is used by ncurses if curses.h is shared between
+# ncurses/ncursesw:
+if test "$cf_cv_utf8_lib" = "add-on" ; then
+	AC_DEFINE(HAVE_LIBUTF8_H,1,[Define to 1 if we should include libutf8.h])
+	CF_ADD_INCDIR($cf_cv_header_path_utf8)
+	CF_ADD_LIBDIR($cf_cv_library_path_utf8)
+	CF_ADD_LIBS($cf_cv_library_file_utf8)
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_VERBOSE version: 3 updated: 2007/07/29 09:55:12
+dnl ----------
+dnl Use AC_VERBOSE w/o the warnings
+AC_DEFUN([CF_VERBOSE],
+[test -n "$verbose" && echo "	$1" 1>&AC_FD_MSG
+CF_MSG_LOG([$1])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WCHAR_TYPE version: 4 updated: 2012/10/06 16:39:58
+dnl -------------
+dnl Check if type wide-character type $1 is declared, and if so, which header
+dnl file is needed.  The second parameter is used to set a shell variable when
+dnl the type is not found.  The first parameter sets a shell variable for the
+dnl opposite sense.
+AC_DEFUN([CF_WCHAR_TYPE],
+[
+# This is needed on Tru64 5.0 to declare $1
+AC_CACHE_CHECK(if we must include wchar.h to declare $1,cf_cv_$1,[
+AC_TRY_COMPILE([
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stdio.h>
+#ifdef HAVE_LIBUTF8_H
+#include <libutf8.h>
+#endif],
+	[$1 state],
+	[cf_cv_$1=no],
+	[AC_TRY_COMPILE([
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <wchar.h>
+#ifdef HAVE_LIBUTF8_H
+#include <libutf8.h>
+#endif],
+	[$1 value],
+	[cf_cv_$1=yes],
+	[cf_cv_$1=unknown])])])
+
+if test "$cf_cv_$1" = yes ; then
+	AC_DEFINE(NEED_WCHAR_H,1,[Define to 1 if we must include wchar.h])
+	NEED_WCHAR_H=1
+fi
+
+ifelse([$2],,,[
+# if we do not find $1 in either place, use substitution to provide a fallback.
+if test "$cf_cv_$1" = unknown ; then
+	$2=1
+fi
+])
+ifelse($3,,,[
+# if we find $1 in either place, use substitution to provide a fallback.
+if test "$cf_cv_$1" != unknown ; then
+	$3=1
+fi
+])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_CURSES_DIR version: 4 updated: 2021/01/02 19:22:58
+dnl ------------------
+dnl Wrapper for AC_ARG_WITH to specify directory under which to look for curses
+dnl libraries.
+AC_DEFUN([CF_WITH_CURSES_DIR],[
+
+AC_MSG_CHECKING(for specific curses-directory)
+AC_ARG_WITH(curses-dir,
+	[  --with-curses-dir=DIR   directory in which (n)curses is installed],
+	[cf_cv_curses_dir=$withval],
+	[cf_cv_curses_dir=no])
+AC_MSG_RESULT($cf_cv_curses_dir)
+
+if test -n "$cf_cv_curses_dir" && test "$cf_cv_curses_dir" != "no"
+then
+	CF_PATH_SYNTAX(withval)
+	if test -d "$cf_cv_curses_dir"
+	then
+		CF_ADD_INCDIR($cf_cv_curses_dir/include)
+		CF_ADD_LIBDIR($cf_cv_curses_dir/lib)
+	fi
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_DBMALLOC version: 7 updated: 2010/06/21 17:26:47
+dnl ----------------
+dnl Configure-option for dbmalloc.  The optional parameter is used to override
+dnl the updating of $LIBS, e.g., to avoid conflict with subsequent tests.
+AC_DEFUN([CF_WITH_DBMALLOC],[
+CF_NO_LEAKS_OPTION(dbmalloc,
+	[  --with-dbmalloc         test: use Conor Cahill's dbmalloc library],
+	[USE_DBMALLOC])
+
+if test "$with_dbmalloc" = yes ; then
+	AC_CHECK_HEADER(dbmalloc.h,
+		[AC_CHECK_LIB(dbmalloc,[debug_malloc]ifelse([$1],,[],[,$1]))])
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_DMALLOC version: 7 updated: 2010/06/21 17:26:47
+dnl ---------------
+dnl Configure-option for dmalloc.  The optional parameter is used to override
+dnl the updating of $LIBS, e.g., to avoid conflict with subsequent tests.
+AC_DEFUN([CF_WITH_DMALLOC],[
+CF_NO_LEAKS_OPTION(dmalloc,
+	[  --with-dmalloc          test: use Gray Watson's dmalloc library],
+	[USE_DMALLOC])
+
+if test "$with_dmalloc" = yes ; then
+	AC_CHECK_HEADER(dmalloc.h,
+		[AC_CHECK_LIB(dmalloc,[dmalloc_debug]ifelse([$1],,[],[,$1]))])
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_LIB_BASENAME version: 1 updated: 2020/03/07 20:05:14
+dnl --------------------
+dnl Allow for overriding the basename of a library, i.e., the part to which
+dnl prefixes/suffixes are attached.
+dnl
+dnl $1 = variable to set
+dnl $2 = option name
+dnl $3 = default basename for library, if omitted use $2
+AC_DEFUN([CF_WITH_LIB_BASENAME],
+[
+AC_MSG_CHECKING(for desired basename for $2 library)
+AC_ARG_WITH($2-libname,
+	[  --with-$2-libname=XXX override ifelse($3,,$2,$3) basename of library],
+	[with_lib_basename=$withval],
+	[with_lib_basename=ifelse($3,,$2,$3)])
+$1="$with_lib_basename"
+
+case "x[$]$1" in
+(x|xno|xnone|xyes)
+	$1=ifelse($3,,$2,$3)
+	;;
+(*)
+	;;
+esac
+
+AC_MSG_RESULT([$]$1)
+AC_SUBST($1)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_NCURSES_ETC version: 5 updated: 2016/02/20 19:23:20
+dnl -------------------
+dnl Use this macro for programs which use any variant of "curses", e.g.,
+dnl "ncurses", and "PDCurses".  Programs that can use curses and some unrelated
+dnl library (such as slang) should use a "--with-screen=XXX" option.
+dnl
+dnl This does not use AC_DEFUN, because that would tell autoconf to run each
+dnl of the macros inside this one - before this macro.
+define([CF_WITH_NCURSES_ETC],[
+CF_WITH_CURSES_DIR
+
+cf_cv_screen=curses
+
+AC_MSG_CHECKING(for specified curses library type)
+AC_ARG_WITH(screen,
+	[  --with-screen=XXX       use specified curses-libraries],
+	[cf_cv_screen=$withval],[
+
+AC_ARG_WITH(ncursesw,
+	[  --with-ncursesw         use wide ncurses-libraries],
+	[cf_cv_screen=ncursesw],[
+
+AC_ARG_WITH(ncurses,
+	[  --with-ncurses          use ncurses-libraries],
+	[cf_cv_screen=ncurses],[
+
+AC_ARG_WITH(pdcurses,
+	[  --with-pdcurses         compile/link with pdcurses X11 library],
+	[cf_cv_screen=pdcurses],[
+
+AC_ARG_WITH(curses-colr,
+	[  --with-curses-colr      compile/link with HPUX 10.x color-curses],
+	[cf_cv_screen=curses_colr],[
+
+AC_ARG_WITH(curses-5lib,
+	[  --with-curses-5lib      compile/link with SunOS 5lib curses],
+	[cf_cv_screen=curses_5lib])])])])])])
+
+AC_MSG_RESULT($cf_cv_screen)
+
+case $cf_cv_screen in
+(curses|curses_*)
+	CF_CURSES_CONFIG
+	;;
+(ncursesw*)
+	CF_UTF8_LIB
+	CF_NCURSES_CONFIG($cf_cv_screen)
+	;;
+(ncurses*)
+	CF_NCURSES_CONFIG($cf_cv_screen)
+	;;
+(pdcurses)
+	CF_PDCURSES_X11
+	;;
+(*)
+	AC_MSG_ERROR(unexpected screen-value: $cf_cv_screen)
+	;;
+esac
+
+CF_NCURSES_PTHREADS($cf_cv_screen)
+
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_SCREEN_PDCURSES version: 1 updated: 2020/08/28 16:56:27
+dnl -----------------------
+dnl Call this macro before CF_ENABLE_WARNINGS for configure scripts which use
+dnl the "--with-screen=pdcurses" selection.  Doing that allows the configure
+dnl script to search for the X11/Xt header files to declare (or not) the
+dnl symbol needed to enable "const" in those header files.  If that configure
+dnl option is not used, then those checks are unnecessary.
+AC_DEFUN([CF_WITH_SCREEN_PDCURSES],[
+AC_PROVIDE([AC_PATH_XTRA])
+AC_PROVIDE([AC_PATH_X])
+if test -n "$with_screen" && test "x$with_screen" = "xpdcurses"
+then
+	AC_PATH_X
+	AC_PATH_XTRA
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_VALGRIND version: 1 updated: 2006/12/14 18:00:21
+dnl ----------------
+AC_DEFUN([CF_WITH_VALGRIND],[
+CF_NO_LEAKS_OPTION(valgrind,
+	[  --with-valgrind         test: use valgrind],
+	[USE_VALGRIND])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_WITH_X11_RGB version: 2 updated: 2019/12/31 08:53:54
+dnl ---------------
+dnl Handle configure option "--with-x11-rgb", setting these shell
+dnl variables:
+dnl
+dnl $RGB_PATH is the option value, used for finding the X11 rgb file.
+dnl $no_x11_rgb is a "#" (comment) if "--without-x11-rgb" is given.
+dnl
+dnl Most Linux's use this:
+dnl 	/usr/share/X11/rgb.txt
+dnl Debian uses this:
+dnl 	/etc/X11/rgb.txt
+dnl DragonFlyBSD ports uses this:
+dnl 	/usr/pkg/lib/X11/rgb.txt
+dnl FreeBSD ports use these:
+dnl 	/usr/local/lib/X11/rgb.txt
+dnl 	/usr/local/share/X11/rgb.txt
+dnl Mandriva has these:
+dnl 	/usr/lib/X11/rgb.txt
+dnl 	/usr/lib64/X11/rgb.txt
+dnl NetBSD has these
+dnl 	/usr/X11R7/lib/X11/rgb.txt
+dnl OpenSolaris uses
+dnl 	32-bit:
+dnl 	/usr/X11/etc/X11/rgb.txt
+dnl 	/usr/X11/share/X11/rgb.txt
+dnl 	/usr/X11/lib/X11/rgb.txt
+dnl OSX uses
+dnl		/opt/local/share/X11/rgb.txt (MacPorts)
+dnl		/opt/X11/share/X11/rgb.txt (non-ports)
+dnl	64-bit:
+dnl 	/usr/X11/etc/X11/rgb.txt
+dnl 	/usr/X11/share/X11/rgb.txt (perhaps)
+dnl 	/usr/X11/lib/amd64/X11/rgb.txt
+dnl Solaris10 uses (in this order):
+dnl 	/usr/openwin/lib/X11/rgb.txt
+dnl 	/usr/X11/lib/X11/rgb.txt
+AC_DEFUN([CF_WITH_X11_RGB],[
+AC_MSG_CHECKING(for X11 rgb file)
+AC_ARG_WITH(x11-rgb,
+	[  --with-x11-rgb=FILE   file containing X11 rgb information (EPREFIX/lib/X11/rgb.txt)],
+	[RGB_PATH=$withval],
+	[RGB_PATH=auto])
+
+if test "x[$]RGB_PATH" = xauto
+then
+	RGB_PATH='${exec_prefix}/lib/X11/rgb.txt'
+	for cf_path in \
+		/opt/local/share/X11/rgb.txt \
+		/opt/X11/share/X11/rgb.txt \
+		/usr/share/X11/rgb.txt \
+		/usr/X11/share/X11/rgb.txt \
+		/usr/X11/lib/X11/rgb.txt \
+		/usr/lib/X11/rgb.txt \
+		/etc/X11/rgb.txt \
+		/usr/pkg/lib/X11/rgb.txt \
+		/usr/X11R7/lib/X11/rgb.txt \
+		/usr/X11R6/lib/X11/rgb.txt \
+		/usr/X11R5/lib/X11/rgb.txt \
+		/usr/X11R4/lib/X11/rgb.txt \
+		/usr/local/lib/X11/rgb.txt \
+		/usr/local/share/X11/rgb.txt \
+		/usr/lib64/X11/rgb.txt
+	do
+		if test -f "$cf_path" ; then
+			RGB_PATH="$cf_path"
+			break
+		fi
+	done
+else
+	cf_path=$RGB_PATH
+	CF_PATH_SYNTAX(cf_path)
+fi
+
+AC_MSG_RESULT($RGB_PATH)
+AC_SUBST(RGB_PATH)
+AC_DEFINE_UNQUOTED(RGB_PATH,"$cf_path",[Define to the full pathname of rgb.txt])
+
+no_x11_rgb=
+if test "$RGB_PATH" = no
+then
+	no_x11_rgb="#"
+fi
+AC_SUBST(no_x11_rgb)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_XOPEN_CURSES version: 17 updated: 2021/07/10 12:22:27
+dnl ---------------
+dnl Test if we should define X/Open source for curses, needed on Digital Unix
+dnl 4.x, to see the extended functions, but breaks on IRIX 6.x.
+dnl
+dnl The getbegyx() check is needed for HPUX, which omits legacy macros such
+dnl as getbegy().  The latter is better design, but the former is standard.
+AC_DEFUN([CF_XOPEN_CURSES],
+[
+AC_REQUIRE([CF_CURSES_CPPFLAGS])dnl
+AC_CACHE_CHECK(definition to turn on extended curses functions,cf_cv_need_xopen_extension,[
+cf_cv_need_xopen_extension=unknown
+AC_TRY_LINK([
+#include <stdlib.h>
+#include <${cf_cv_ncurses_header:-curses.h}>],[
+#if defined(NCURSES_VERSION_PATCH)
+#if (NCURSES_VERSION_PATCH < 20100501) && (NCURSES_VERSION_PATCH >= 20100403)
+	make an error
+#endif
+#endif
+#ifdef NCURSES_WIDECHAR
+make an error	/* prefer to fall-through on the second checks */
+#endif
+	cchar_t check;
+	int check2 = curs_set((int)sizeof(check));
+	long x = winnstr(stdscr, "", 0);
+	int x1, y1;
+	(void)check2;
+	getbegyx(stdscr, y1, x1);
+	(void)x;
+	(void)y1;
+	(void)x1;
+	],
+	[cf_cv_need_xopen_extension=none],
+	[
+	for cf_try_xopen_extension in _XOPEN_SOURCE_EXTENDED NCURSES_WIDECHAR
+	do
+		AC_TRY_LINK([
+#define $cf_try_xopen_extension 1
+#include <stdlib.h>
+#include <${cf_cv_ncurses_header:-curses.h}>],[
+		cchar_t check;
+		int check2 = curs_set((int)sizeof(check));
+		long x = winnstr(stdscr, "", 0);
+		int x1, y1;
+		getbegyx(stdscr, y1, x1);
+		(void)check2;
+		(void)x;
+		(void)y1;
+		(void)x1;
+		],
+		[cf_cv_need_xopen_extension=$cf_try_xopen_extension; break])
+	done
+	])
+])
+
+case "$cf_cv_need_xopen_extension" in
+(*_*)
+	CF_APPEND_TEXT(CPPFLAGS,-D$cf_cv_need_xopen_extension)
+	;;
+esac
+
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_XOPEN_SOURCE version: 62 updated: 2022/10/02 19:55:56
+dnl ---------------
+dnl Try to get _XOPEN_SOURCE defined properly that we can use POSIX functions,
+dnl or adapt to the vendor's definitions to get equivalent functionality,
+dnl without losing the common non-POSIX features.
+dnl
+dnl Parameters:
+dnl	$1 is the nominal value for _XOPEN_SOURCE
+dnl	$2 is the nominal value for _POSIX_C_SOURCE
+AC_DEFUN([CF_XOPEN_SOURCE],[
+AC_REQUIRE([AC_CANONICAL_HOST])
+AC_REQUIRE([CF_POSIX_VISIBLE])
+
+if test "$cf_cv_posix_visible" = no; then
+
+cf_XOPEN_SOURCE=ifelse([$1],,500,[$1])
+cf_POSIX_C_SOURCE=ifelse([$2],,199506L,[$2])
+cf_xopen_source=
+
+case "$host_os" in
+(aix[[4-7]]*)
+	cf_xopen_source="-D_ALL_SOURCE"
+	;;
+(msys)
+	cf_XOPEN_SOURCE=600
+	;;
+(darwin[[0-8]].*)
+	cf_xopen_source="-D_APPLE_C_SOURCE"
+	;;
+(darwin*)
+	cf_xopen_source="-D_DARWIN_C_SOURCE"
+	cf_XOPEN_SOURCE=
+	;;
+(freebsd*|dragonfly*|midnightbsd*)
+	# 5.x headers associate
+	#	_XOPEN_SOURCE=600 with _POSIX_C_SOURCE=200112L
+	#	_XOPEN_SOURCE=500 with _POSIX_C_SOURCE=199506L
+	cf_POSIX_C_SOURCE=200112L
+	cf_XOPEN_SOURCE=600
+	cf_xopen_source="-D_BSD_TYPES -D__BSD_VISIBLE -D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE -D_XOPEN_SOURCE=$cf_XOPEN_SOURCE"
+	;;
+(hpux11*)
+	cf_xopen_source="-D_HPUX_SOURCE -D_XOPEN_SOURCE=500"
+	;;
+(hpux*)
+	cf_xopen_source="-D_HPUX_SOURCE"
+	;;
+(irix[[56]].*)
+	cf_xopen_source="-D_SGI_SOURCE"
+	cf_XOPEN_SOURCE=
+	;;
+(linux*gnu|linux*gnuabi64|linux*gnuabin32|linux*gnueabi|linux*gnueabihf|linux*gnux32|uclinux*|gnu*|mint*|k*bsd*-gnu|cygwin)
+	CF_GNU_SOURCE($cf_XOPEN_SOURCE)
+	;;
+(minix*)
+	cf_xopen_source="-D_NETBSD_SOURCE" # POSIX.1-2001 features are ifdef'd with this...
+	;;
+(mirbsd*)
+	# setting _XOPEN_SOURCE or _POSIX_SOURCE breaks <sys/select.h> and other headers which use u_int / u_short types
+	cf_XOPEN_SOURCE=
+	CF_POSIX_C_SOURCE($cf_POSIX_C_SOURCE)
+	;;
+(netbsd*)
+	cf_xopen_source="-D_NETBSD_SOURCE" # setting _XOPEN_SOURCE breaks IPv6 for lynx on NetBSD 1.6, breaks xterm, is not needed for ncursesw
+	;;
+(openbsd[[6-9]]*)
+	# OpenBSD 6.x has broken locale support, both compile-time and runtime.
+	# see https://www.mail-archive.com/bugs@openbsd.org/msg13200.html
+	# Abusing the conformance level is a workaround.
+	AC_MSG_WARN(this system does not provide usable locale support)
+	cf_xopen_source="-D_BSD_SOURCE"
+	cf_XOPEN_SOURCE=700
+	;;
+(openbsd[[4-5]]*)
+	# setting _XOPEN_SOURCE lower than 500 breaks g++ compile with wchar.h, needed for ncursesw
+	cf_xopen_source="-D_BSD_SOURCE"
+	cf_XOPEN_SOURCE=600
+	;;
+(openbsd*)
+	# setting _XOPEN_SOURCE breaks xterm on OpenBSD 2.8, is not needed for ncursesw
+	;;
+(osf[[45]]*)
+	cf_xopen_source="-D_OSF_SOURCE"
+	;;
+(nto-qnx*)
+	cf_xopen_source="-D_QNX_SOURCE"
+	;;
+(sco*)
+	# setting _XOPEN_SOURCE breaks Lynx on SCO Unix / OpenServer
+	;;
+(solaris2.*)
+	cf_xopen_source="-D__EXTENSIONS__"
+	cf_cv_xopen_source=broken
+	;;
+(sysv4.2uw2.*) # Novell/SCO UnixWare 2.x (tested on 2.1.2)
+	cf_XOPEN_SOURCE=
+	cf_POSIX_C_SOURCE=
+	;;
+(*)
+	CF_TRY_XOPEN_SOURCE
+	cf_save_xopen_cppflags="$CPPFLAGS"
+	CF_POSIX_C_SOURCE($cf_POSIX_C_SOURCE)
+	# Some of these niche implementations use copy/paste, double-check...
+	CF_VERBOSE(checking if _POSIX_C_SOURCE inteferes)
+	AC_TRY_COMPILE(CF__XOPEN_SOURCE_HEAD,CF__XOPEN_SOURCE_BODY,,[
+		AC_MSG_WARN(_POSIX_C_SOURCE definition is not usable)
+		CPPFLAGS="$cf_save_xopen_cppflags"])
+	;;
+esac
+
+if test -n "$cf_xopen_source" ; then
+	CF_APPEND_CFLAGS($cf_xopen_source,true)
+fi
+
+dnl In anything but the default case, we may have system-specific setting
+dnl which is still not guaranteed to provide all of the entrypoints that
+dnl _XOPEN_SOURCE would yield.
+if test -n "$cf_XOPEN_SOURCE" && test -z "$cf_cv_xopen_source" ; then
+	AC_MSG_CHECKING(if _XOPEN_SOURCE really is set)
+	AC_TRY_COMPILE([#include <stdlib.h>],[
+#ifndef _XOPEN_SOURCE
+make an error
+#endif],
+	[cf_XOPEN_SOURCE_set=yes],
+	[cf_XOPEN_SOURCE_set=no])
+	AC_MSG_RESULT($cf_XOPEN_SOURCE_set)
+	if test "$cf_XOPEN_SOURCE_set" = yes
+	then
+		AC_TRY_COMPILE([#include <stdlib.h>],[
+#if (_XOPEN_SOURCE - 0) < $cf_XOPEN_SOURCE
+make an error
+#endif],
+		[cf_XOPEN_SOURCE_set_ok=yes],
+		[cf_XOPEN_SOURCE_set_ok=no])
+		if test "$cf_XOPEN_SOURCE_set_ok" = no
+		then
+			AC_MSG_WARN(_XOPEN_SOURCE is lower than requested)
+		fi
+	else
+		CF_TRY_XOPEN_SOURCE
+	fi
+fi
+fi # cf_cv_posix_visible
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_X_ATHENA version: 24 updated: 2020/03/10 18:53:47
+dnl -----------
+dnl Check for Xaw (Athena) libraries
+dnl
+dnl Sets $cf_x_athena according to the flavor of Xaw which is used.
+AC_DEFUN([CF_X_ATHENA],
+[
+cf_x_athena=${cf_x_athena:-Xaw}
+
+AC_MSG_CHECKING(if you want to link with Xaw 3d library)
+withval=
+AC_ARG_WITH(Xaw3d,
+	[  --with-Xaw3d            link with Xaw 3d library])
+if test "$withval" = yes ; then
+	cf_x_athena=Xaw3d
+	AC_MSG_RESULT(yes)
+else
+	AC_MSG_RESULT(no)
+fi
+
+AC_MSG_CHECKING(if you want to link with Xaw 3d xft library)
+withval=
+AC_ARG_WITH(Xaw3dxft,
+	[  --with-Xaw3dxft         link with Xaw 3d xft library])
+if test "$withval" = yes ; then
+	cf_x_athena=Xaw3dxft
+	AC_MSG_RESULT(yes)
+else
+	AC_MSG_RESULT(no)
+fi
+
+AC_MSG_CHECKING(if you want to link with neXT Athena library)
+withval=
+AC_ARG_WITH(neXtaw,
+	[  --with-neXtaw           link with neXT Athena library])
+if test "$withval" = yes ; then
+	cf_x_athena=neXtaw
+	AC_MSG_RESULT(yes)
+else
+	AC_MSG_RESULT(no)
+fi
+
+AC_MSG_CHECKING(if you want to link with Athena-Plus library)
+withval=
+AC_ARG_WITH(XawPlus,
+	[  --with-XawPlus          link with Athena-Plus library])
+if test "$withval" = yes ; then
+	cf_x_athena=XawPlus
+	AC_MSG_RESULT(yes)
+else
+	AC_MSG_RESULT(no)
+fi
+
+cf_x_athena_lib=""
+
+if test "$PKG_CONFIG" != none ; then
+	cf_athena_list=
+	test "$cf_x_athena" = Xaw && cf_athena_list="xaw8 xaw7 xaw6"
+	for cf_athena_pkg in \
+		$cf_athena_list \
+		${cf_x_athena} \
+		${cf_x_athena}-devel \
+		lib${cf_x_athena} \
+		lib${cf_x_athena}-devel
+	do
+		CF_TRY_PKG_CONFIG($cf_athena_pkg,[
+			cf_x_athena_lib="$cf_pkgconfig_libs"
+			CF_UPPER(cf_x_athena_LIBS,HAVE_LIB_$cf_x_athena)
+			AC_DEFINE_UNQUOTED($cf_x_athena_LIBS)
+
+			CF_TRIM_X_LIBS
+
+AC_CACHE_CHECK(for usable $cf_x_athena/Xmu package,cf_cv_xaw_compat,[
+AC_TRY_LINK([
+#include <X11/Xmu/CharSet.h>
+],[
+int check = XmuCompareISOLatin1("big", "small");
+(void)check;
+],[cf_cv_xaw_compat=yes],[cf_cv_xaw_compat=no])])
+
+			if test "$cf_cv_xaw_compat" = no
+			then
+				# workaround for broken ".pc" files...
+				case "$cf_x_athena_lib" in
+				(*-lXmu*)
+					;;
+				(*)
+					CF_VERBOSE(work around broken package)
+					cf_save_xmu="$LIBS"
+					cf_first_lib=`echo "$cf_save_xmu" | sed -e 's/^[ ][ ]*//' -e 's/ .*//'`
+					CF_TRY_PKG_CONFIG(xmu,[
+							LIBS="$cf_save_xmu"
+							CF_ADD_LIB_AFTER($cf_first_lib,$cf_pkgconfig_libs)
+						],[
+							CF_ADD_LIB_AFTER($cf_first_lib,-lXmu)
+						])
+					CF_TRIM_X_LIBS
+					;;
+				esac
+			fi
+
+			break])
+	done
+fi
+
+if test -z "$cf_x_athena_lib" ; then
+	CF_X_EXT
+	CF_X_TOOLKIT
+	CF_X_ATHENA_CPPFLAGS($cf_x_athena)
+	CF_X_ATHENA_LIBS($cf_x_athena)
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_X_ATHENA_CPPFLAGS version: 9 updated: 2020/12/31 10:54:15
+dnl --------------------
+dnl Normally invoked by CF_X_ATHENA, with $1 set to the appropriate flavor of
+dnl the Athena widgets, e.g., Xaw, Xaw3d, neXtaw.
+AC_DEFUN([CF_X_ATHENA_CPPFLAGS],
+[
+AC_REQUIRE([AC_PATH_XTRA])
+cf_x_athena_root=ifelse([$1],,Xaw,[$1])
+cf_x_athena_inc=""
+
+for cf_path in default \
+	/usr/contrib/X11R6 \
+	/usr/contrib/X11R5 \
+	/usr/lib/X11R5 \
+	/usr/local
+do
+	if test -z "$cf_x_athena_inc" ; then
+		CF_SAVE_XTRA_FLAGS([CF_X_ATHENA_CPPFLAGS])
+		cf_test=X11/$cf_x_athena_root/SimpleMenu.h
+		if test "$cf_path" != default ; then
+			CF_APPEND_TEXT(CPPFLAGS,-I$cf_path/include)
+			AC_MSG_CHECKING(for $cf_test in $cf_path)
+		else
+			AC_MSG_CHECKING(for $cf_test)
+		fi
+		AC_TRY_COMPILE([
+#include <X11/Intrinsic.h>
+#include <$cf_test>],[],
+			[cf_result=yes],
+			[cf_result=no])
+		AC_MSG_RESULT($cf_result)
+		CF_RESTORE_XTRA_FLAGS([CF_X_ATHENA_CPPFLAGS])
+		if test "$cf_result" = yes ; then
+			test "$cf_path"  = default && cf_x_athena_inc=default
+			test "$cf_path" != default && cf_x_athena_inc="$cf_path/include"
+			break
+		fi
+	fi
+done
+
+if test -z "$cf_x_athena_inc" ; then
+	AC_MSG_WARN([Unable to find Athena header files])
+elif test "$cf_x_athena_inc" != default ; then
+	CF_APPEND_TEXT(CPPFLAGS,-I$cf_x_athena_inc)
+fi
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_X_ATHENA_LIBS version: 13 updated: 2020/01/11 18:16:10
+dnl ----------------
+dnl Normally invoked by CF_X_ATHENA, with $1 set to the appropriate flavor of
+dnl the Athena widgets, e.g., Xaw, Xaw3d, neXtaw.
+AC_DEFUN([CF_X_ATHENA_LIBS],
+[AC_REQUIRE([CF_X_TOOLKIT])
+cf_x_athena_root=ifelse([$1],,Xaw,[$1])
+cf_x_athena_lib=""
+
+for cf_path in default \
+	/usr/contrib/X11R6 \
+	/usr/contrib/X11R5 \
+	/usr/lib/X11R5 \
+	/usr/local
+do
+	for cf_lib in \
+		${cf_x_athena_root} \
+		${cf_x_athena_root}7 \
+		${cf_x_athena_root}6
+	do
+	for cf_libs in \
+		"-l$cf_lib -lXmu" \
+		"-l$cf_lib -lXpm -lXmu" \
+		"-l${cf_lib}_s -lXmu_s"
+	do
+		test -n "$cf_x_athena_lib" && break
+
+		CF_SAVE_XTRA_FLAGS([CF_X_ATHENA_LIBS])
+		cf_test=XawSimpleMenuAddGlobalActions
+		test "$cf_path" != default && cf_libs="-L$cf_path/lib $cf_libs"
+		CF_ADD_LIBS($cf_libs)
+		AC_MSG_CHECKING(for $cf_test in $cf_libs)
+		AC_TRY_LINK([
+#include <X11/Intrinsic.h>
+#include <X11/$cf_x_athena_root/SimpleMenu.h>
+],[
+$cf_test((XtAppContext) 0)],
+			[cf_result=yes],
+			[cf_result=no])
+		AC_MSG_RESULT($cf_result)
+		CF_RESTORE_XTRA_FLAGS([CF_X_ATHENA_LIBS])
+
+		if test "$cf_result" = yes ; then
+			cf_x_athena_lib="$cf_libs"
+			break
+		fi
+	done # cf_libs
+		test -n "$cf_x_athena_lib" && break
+	done # cf_lib
+done
+
+if test -z "$cf_x_athena_lib" ; then
+	AC_MSG_ERROR(
+[Unable to successfully link Athena library (-l$cf_x_athena_root) with test program])
+fi
+
+CF_ADD_LIBS($cf_x_athena_lib)
+CF_UPPER(cf_x_athena_LIBS,HAVE_LIB_$cf_x_athena)
+AC_DEFINE_UNQUOTED($cf_x_athena_LIBS)
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_X_EXT version: 3 updated: 2010/06/02 05:03:05
+dnl --------
+AC_DEFUN([CF_X_EXT],[
+CF_TRY_PKG_CONFIG(Xext,,[
+	AC_CHECK_LIB(Xext,XextCreateExtension,
+		[CF_ADD_LIB(Xext)])])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_X_TOOLKIT version: 26 updated: 2021/01/02 09:31:20
+dnl ------------
+dnl Check for X Toolkit libraries
+AC_DEFUN([CF_X_TOOLKIT],
+[
+AC_REQUIRE([AC_PATH_XTRA])
+AC_REQUIRE([CF_CHECK_CACHE])
+
+# OSX is schizoid about who owns /usr/X11 (old) versus /opt/X11 (new) (and
+# in some cases has installed dummy files in the former, other cases replaced
+# it with a link to the new location).  This complicates the configure script.
+# Check for that pitfall, and recover using pkg-config
+#
+# If none of these are set, the configuration is almost certainly broken.
+if test -z "${X_CFLAGS}${X_PRE_LIBS}${X_LIBS}${X_EXTRA_LIBS}"
+then
+	CF_TRY_PKG_CONFIG(x11,,[AC_MSG_WARN(unable to find X11 library)])
+	CF_TRY_PKG_CONFIG(ice,,[AC_MSG_WARN(unable to find ICE library)])
+	CF_TRY_PKG_CONFIG(sm,,[AC_MSG_WARN(unable to find SM library)])
+	CF_TRY_PKG_CONFIG(xt,,[AC_MSG_WARN(unable to find Xt library)])
+else
+	LIBS="$X_PRE_LIBS $LIBS $X_EXTRA_LIBS"
+fi
+
+cf_have_X_LIBS=no
+
+CF_TRY_PKG_CONFIG(xt,[
+
+	case "x$LIBS" in
+	(*-lX11*)
+		;;
+	(*)
+# we have an "xt" package, but it may omit Xt's dependency on X11
+AC_CACHE_CHECK(for usable X dependency,cf_cv_xt_x11_compat,[
+AC_TRY_LINK([
+#include <X11/Xlib.h>
+],[
+	int rc1 = XDrawLine((Display*) 0, (Drawable) 0, (GC) 0, 0, 0, 0, 0);
+	int rc2 = XClearWindow((Display*) 0, (Window) 0);
+	int rc3 = XMoveWindow((Display*) 0, (Window) 0, 0, 0);
+	int rc4 = XMoveResizeWindow((Display*)0, (Window)0, 0, 0, 0, 0);
+],[cf_cv_xt_x11_compat=yes],[cf_cv_xt_x11_compat=no])])
+		if test "$cf_cv_xt_x11_compat" = no
+		then
+			CF_VERBOSE(work around broken X11 dependency)
+			# 2010/11/19 - good enough until a working Xt on Xcb is delivered.
+			CF_TRY_PKG_CONFIG(x11,,[CF_ADD_LIB_AFTER(-lXt,-lX11)])
+		fi
+		;;
+	esac
+
+AC_CACHE_CHECK(for usable X Toolkit package,cf_cv_xt_ice_compat,[
+AC_TRY_LINK([
+#include <X11/Shell.h>
+],[int num = IceConnectionNumber(0); (void) num
+],[cf_cv_xt_ice_compat=yes],[cf_cv_xt_ice_compat=no])])
+
+	if test "$cf_cv_xt_ice_compat" = no
+	then
+		# workaround for broken ".pc" files used for X Toolkit.
+		case "x$X_PRE_LIBS" in
+		(*-lICE*)
+			case "x$LIBS" in
+			(*-lICE*)
+				;;
+			(*)
+				CF_VERBOSE(work around broken ICE dependency)
+				CF_TRY_PKG_CONFIG(ice,
+					[CF_TRY_PKG_CONFIG(sm)],
+					[CF_ADD_LIB_AFTER(-lXt,$X_PRE_LIBS)])
+				;;
+			esac
+			;;
+		esac
+	fi
+
+	cf_have_X_LIBS=yes
+],[
+
+	LDFLAGS="$X_LIBS $LDFLAGS"
+	CF_CHECK_CFLAGS($X_CFLAGS)
+
+	AC_CHECK_FUNC(XOpenDisplay,,[
+	AC_CHECK_LIB(X11,XOpenDisplay,
+		[CF_ADD_LIB(X11)])])
+
+	AC_CHECK_FUNC(XtAppInitialize,,[
+	AC_CHECK_LIB(Xt, XtAppInitialize,
+		[AC_DEFINE(HAVE_LIBXT,1,[Define to 1 if we can compile with the Xt library])
+		 cf_have_X_LIBS=Xt
+		 LIBS="-lXt $LIBS"])])
+])
+
+if test "$cf_have_X_LIBS" = no ; then
+	AC_MSG_WARN(
+[Unable to successfully link X Toolkit library (-lXt) with
+test program.  You will have to check and add the proper libraries by hand
+to makefile.])
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF__CURSES_DATA version: 3 updated: 2021/01/04 19:45:09
+dnl ---------------
+dnl Attempt to make a copy of a curses data item.  This is needed in the
+dnl check-data configure tests when using ncurses, because the symbol may be
+dnl actually a function return-value.  That could happen if the linker is
+dnl broken (does not resolve data-only references), or if ncurses is configured
+dnl to support re-entrant code.
+dnl $1 = target
+dnl $2 = source
+define([CF__CURSES_DATA],[
+#if defined($2) && ((defined(NCURSES_WRAPPED_VAR) && (NCURSES_VERSION_PATCH < 20200208)) || defined(NCURSES_BROKEN_LINKER) || defined(NCURSES_REENTRANT))
+	const void *$1 = (const void *)($2);
+#else
+	const void *$1 = &($2);
+#endif
+	fprintf(stderr, "testing linkage of $2:%p\\n", (const void *)$1);
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF__CURSES_HEAD version: 2 updated: 2010/10/23 15:54:49
+dnl ---------------
+dnl Define a reusable chunk which includes <curses.h> and <term.h> when they
+dnl are both available.
+define([CF__CURSES_HEAD],[
+#ifdef HAVE_XCURSES
+#include <xcurses.h>
+char * XCursesProgramName = "test";
+#else
+#include <${cf_cv_ncurses_header:-curses.h}>
+#if defined(NCURSES_VERSION) && defined(HAVE_NCURSESW_TERM_H)
+#include <ncursesw/term.h>
+#elif defined(NCURSES_VERSION) && defined(HAVE_NCURSES_TERM_H)
+#include <ncurses/term.h>
+#elif defined(HAVE_TERM_H)
+#include <term.h>
+#endif
+#endif
+])
+dnl ---------------------------------------------------------------------------
+dnl CF__XOPEN_SOURCE_BODY version: 1 updated: 2022/09/10 15:17:35
+dnl ---------------------
+dnl body of test when test-compiling for _XOPEN_SOURCE check
+define([CF__XOPEN_SOURCE_BODY],
+[
+#ifndef _XOPEN_SOURCE
+make an error
+#endif
+])
+dnl ---------------------------------------------------------------------------
+dnl CF__XOPEN_SOURCE_HEAD version: 1 updated: 2022/09/10 15:17:03
+dnl ---------------------
+dnl headers to include when test-compiling for _XOPEN_SOURCE check
+define([CF__XOPEN_SOURCE_HEAD],
+[
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+])
diff --git a/test/back_ground.c b/test/back_ground.c
new file mode 100644
index 0000000..c53c2a3
--- /dev/null
+++ b/test/back_ground.c
@@ -0,0 +1,308 @@
+/****************************************************************************
+ * Copyright 2021,2022 Thomas E. Dickey                                     *
+ *                                                                          *
+ * 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: back_ground.c,v 1.9 2022/12/10 22:28:50 tom Exp $
+ */
+
+#include <test.priv.h>
+
+#if USE_WIDEC_SUPPORT
+
+#define NEED_COLOR_CODE 1
+#define NEED_COLOR_NAME 1
+#include <color_name.h>
+#include <dump_window.h>
+
+static int default_bg = COLOR_BLACK;
+static int default_fg = COLOR_WHITE;
+static wchar_t wide_fill = L' ';
+
+static wchar_t
+decode_wchar(const char *value)
+{
+    long result;
+    char *next = NULL;
+    int radix = 0;
+
+    if (!strncmp(value, "U+", 2)) {
+	value += 2;
+	radix = 16;
+    }
+    result = strtol(value, &next, radix);
+    if (next == value || (next == NULL || *next != '\0')) {
+	fprintf(stderr, "decoding wchar_t: %s\n", value);
+	exit(EXIT_FAILURE);
+    }
+    return (wchar_t) result;
+}
+
+static void
+test_background(void)
+{
+    NCURSES_COLOR_T f, b;
+    int row;
+    int chr;
+    wchar_t blank[2];
+    wchar_t graphics[2];
+    cchar_t data;
+
+    if (pair_content(0, &f, &b) == ERR) {
+	printw("pair 0 contains no data\n");
+    } else {
+	printw("pair 0 contains (%d,%d)\n", (int) f, (int) b);
+    }
+    dump_window(stdscr);
+
+    blank[0] = wide_fill;
+    blank[1] = L'\0';
+
+    printw("Initializing pair 1 to red/%s\n", color_name(default_bg));
+    init_pair(1, COLOR_RED, (NCURSES_COLOR_T) default_bg);
+    setcchar(&data, blank, A_NORMAL, 1, NULL);
+    bkgrndset(&data);
+    printw("RED/BLACK\n");
+    dump_window(stdscr);
+
+    printw("Initializing pair 2 to %s/blue\n", color_name(default_fg));
+    init_pair(2, (NCURSES_COLOR_T) default_fg, COLOR_BLUE);
+    setcchar(&data, blank, A_NORMAL, 2, NULL);
+    bkgrndset(&data);
+    printw("This line should be %s/blue\n", color_name(default_fg));
+    dump_window(stdscr);
+
+    printw("Initializing pair 3 to %s/cyan (ACS_HLINE)\n", color_name(default_fg));
+    init_pair(3, (NCURSES_COLOR_T) default_fg, COLOR_CYAN);
+    printw("...and drawing a box which should be followed by lines\n");
+    graphics[0] = ACS_HLINE & A_CHARTEXT;
+    graphics[1] = L'\0';
+    setcchar(&data, graphics, A_ALTCHARSET, 3, NULL);
+    bkgrndset(&data);
+    /*
+     * Characters from vt100 line-drawing should be mapped to line-drawing,
+     * since A_ALTCHARSET is set in the background, and the character part
+     * of the background is replaced by the nonblank characters written.
+     *
+     * Characters not in the line-drawing range are usually sent as-is.
+     *
+     * With SVr4 curses it is possible to rely on this to mix uppercase text
+     * with the (lowercase) line-drawing characters.  ncurses uses some of
+     * the uppercase characters for encoding thick- and double-lines.
+     */
+    row = 7;
+    mvprintw(row++, 10, "l");
+    for (chr = 0; chr < 32; ++chr)
+	AddCh(' ');
+    printw("x\n");
+    chr = 32;
+    while (chr < 128) {
+	if ((chr % 32) == 0)
+	    mvprintw(row++, 10, "x");
+	AddCh((chr == 127) ? ' ' : chr);
+	if ((++chr % 32) == 0)
+	    printw("x\n");
+    }
+    mvprintw(row++, 10, "m");
+    for (chr = 0; chr < 32; ++chr)
+	AddCh(' ');
+    printw("j\n");
+    dump_window(stdscr);
+
+    setcchar(&data, blank, A_NORMAL, 0, NULL);
+    bkgrndset(&data);
+    printw("Default Colors\n");
+    dump_window(stdscr);
+
+    printw("Resetting colors to pair 1\n");
+    setcchar(&data, blank, A_NORMAL, 1, NULL);
+    bkgrndset(&data);
+    printw("This line should be red/%s\n", color_name(default_bg));
+    dump_window(stdscr);
+
+    printw("Setting screen to pair 0\n");
+    setcchar(&data, blank, A_NORMAL, 0, NULL);
+    bkgrndset(&data);
+    dump_window(stdscr);
+
+    printw("Setting screen to pair 1\n");
+    setcchar(&data, blank, A_NORMAL, 1, NULL);
+    bkgrndset(&data);
+    dump_window(stdscr);
+
+    printw("Setting screen to pair 2\n");
+    setcchar(&data, blank, A_NORMAL, 2, NULL);
+    bkgrndset(&data);
+    dump_window(stdscr);
+
+    printw("Setting screen to pair 3\n");
+    setcchar(&data, blank, A_NORMAL, 3, NULL);
+    bkgrndset(&data);
+    dump_window(stdscr);
+
+    printw("Setting screen to pair 0\n");
+    setcchar(&data, blank, A_NORMAL, 0, NULL);
+    bkgrndset(&data);
+    dump_window(stdscr);
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: background [options]"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+#if HAVE_ASSUME_DEFAULT_COLORS
+	," -a       invoke assume_default_colors, repeat to use in init_pair"
+#endif
+	," -b XXX   specify background color"
+#if HAVE_USE_DEFAULT_COLORS
+	," -d       invoke use_default_colors, repeat to use in init_pair"
+#endif
+	," -f XXX   specify foreground color"
+	," -l FILE  log window-dumps to this file"
+	," -w       fill background with stipple pattern"
+	," -W CODE  fill background with this Unicode value"
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+#if HAVE_ASSUME_DEFAULT_COLORS
+    int a_option = 0;
+#endif
+#if HAVE_USE_DEFAULT_COLORS
+    int d_option = 0;
+#endif
+    int ch;
+
+    setlocale(LC_ALL, "");
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "ab:df:l:wW:")) != -1) {
+	switch (ch) {
+#if HAVE_ASSUME_DEFAULT_COLORS
+	case 'a':
+	    ++a_option;
+	    break;
+#endif
+	case 'b':
+	    default_bg = color_code(optarg);
+	    break;
+#if HAVE_USE_DEFAULT_COLORS
+	case 'd':
+	    ++d_option;
+	    break;
+#endif
+	case 'f':
+	    default_fg = color_code(optarg);
+	    break;
+	case 'l':
+	    if (!open_dump(optarg))
+		usage(FALSE);
+	    break;
+	case 'w':
+	    wide_fill = L'\u2591';
+	    break;
+	case 'W':
+	    wide_fill = decode_wchar(optarg);
+	    break;
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+#if HAVE_USE_DEFAULT_COLORS && HAVE_ASSUME_DEFAULT_COLORS
+    if (a_option && d_option) {
+	fprintf(stderr, "Use either -a or -d option, but not both\n");
+	ExitProgram(EXIT_FAILURE);
+    }
+#endif
+
+    initscr();
+    cbreak();
+    noecho();
+
+    if (has_colors()) {
+	start_color();
+
+#if HAVE_USE_DEFAULT_COLORS
+	if (d_option) {
+	    printw("Using default colors...\n");
+	    use_default_colors();
+	    if (d_option > 1) {
+		default_fg = -1;
+		default_bg = -1;
+	    }
+	}
+#endif
+#if HAVE_ASSUME_DEFAULT_COLORS
+	if (a_option) {
+	    printw("Using assumed colors %s/%s...\n",
+		   color_name(default_fg),
+		   color_name(default_bg));
+	    assume_default_colors(default_fg, default_bg);
+	    if (a_option > 1) {
+		default_fg = -1;
+		default_bg = -1;
+	    }
+	}
+#endif
+
+	test_background();
+
+    } else {
+	printw("This demo requires a color terminal");
+	getch();
+    }
+    endwin();
+    close_dump();
+    ExitProgram(EXIT_SUCCESS);
+}
+
+#else
+int
+main(void)
+{
+    printf("This program requires the wide-curses library\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif /* USE_WIDEC_SUPPORT */
diff --git a/test/background.c b/test/background.c
new file mode 100644
index 0000000..5942deb
--- /dev/null
+++ b/test/background.c
@@ -0,0 +1,250 @@
+/****************************************************************************
+ * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 2003-2014,2017 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: background.c,v 1.24 2022/12/10 22:28:50 tom Exp $
+ */
+
+#define NEED_COLOR_CODE 1
+#define NEED_COLOR_NAME 1
+#include <color_name.h>
+#include <dump_window.h>
+
+static int default_bg = COLOR_BLACK;
+static int default_fg = COLOR_WHITE;
+
+static void
+test_background(void)
+{
+    NCURSES_COLOR_T f, b;
+    int row;
+    int chr;
+
+    if (pair_content(0, &f, &b) == ERR) {
+	printw("pair 0 contains no data\n");
+    } else {
+	printw("pair 0 contains (%d,%d)\n", (int) f, (int) b);
+    }
+    dump_window(stdscr);
+
+    printw("Initializing pair 1 to red/%s\n", color_name(default_bg));
+    init_pair(1, COLOR_RED, (NCURSES_COLOR_T) default_bg);
+    bkgdset((chtype) (' ' | COLOR_PAIR(1)));
+    printw("RED/BLACK\n");
+    dump_window(stdscr);
+
+    printw("Initializing pair 2 to %s/blue\n", color_name(default_fg));
+    init_pair(2, (NCURSES_COLOR_T) default_fg, COLOR_BLUE);
+    bkgdset((chtype) (' ' | COLOR_PAIR(2)));
+    printw("This line should be %s/blue\n", color_name(default_fg));
+    dump_window(stdscr);
+
+    printw("Initializing pair 3 to %s/cyan (ACS_HLINE)\n", color_name(default_fg));
+    init_pair(3, (NCURSES_COLOR_T) default_fg, COLOR_CYAN);
+    printw("...and drawing a box which should be followed by lines\n");
+    bkgdset(ACS_HLINE | (chtype) COLOR_PAIR(3));
+    /*
+     * Characters from vt100 line-drawing should be mapped to line-drawing,
+     * since A_ALTCHARSET is set in the background, and the character part
+     * of the background is replaced by the nonblank characters written.
+     *
+     * Characters not in the line-drawing range are usually sent as-is.
+     *
+     * With SVr4 curses it is possible to rely on this to mix uppercase text
+     * with the (lowercase) line-drawing characters.  ncurses uses some of
+     * the uppercase characters for encoding thick- and double-lines.
+     */
+    row = 7;
+    mvprintw(row++, 10, "l");
+    for (chr = 0; chr < 32; ++chr)
+	AddCh(' ');
+    printw("x\n");
+    chr = 32;
+    while (chr < 128) {
+	if ((chr % 32) == 0)
+	    mvprintw(row++, 10, "x");
+	AddCh((chr == 127) ? ' ' : chr);
+	if ((++chr % 32) == 0)
+	    printw("x\n");
+    }
+    mvprintw(row++, 10, "m");
+    for (chr = 0; chr < 32; ++chr)
+	AddCh(' ');
+    printw("j\n");
+    dump_window(stdscr);
+
+    bkgdset((chtype) (' ' | COLOR_PAIR(0)));
+    printw("Default Colors\n");
+    dump_window(stdscr);
+
+    printw("Resetting colors to pair 1\n");
+    bkgdset((chtype) (' ' | COLOR_PAIR(1)));
+    printw("This line should be red/%s\n", color_name(default_bg));
+    dump_window(stdscr);
+
+    printw("Setting screen to pair 0\n");
+    bkgd((chtype) (' ' | COLOR_PAIR(0)));
+    dump_window(stdscr);
+
+    printw("Setting screen to pair 1\n");
+    bkgd((chtype) (' ' | COLOR_PAIR(1)));
+    dump_window(stdscr);
+
+    printw("Setting screen to pair 2\n");
+    bkgd((chtype) (' ' | COLOR_PAIR(2)));
+    dump_window(stdscr);
+
+    printw("Setting screen to pair 3\n");
+    bkgd((chtype) (' ' | COLOR_PAIR(3)));
+    dump_window(stdscr);
+
+    printw("Setting screen to pair 0\n");
+    bkgd((chtype) (' ' | COLOR_PAIR(0)));
+    dump_window(stdscr);
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: background [options]"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+#if HAVE_ASSUME_DEFAULT_COLORS
+	," -a       invoke assume_default_colors, repeat to use in init_pair"
+#endif
+	," -b XXX   specify background color"
+#if HAVE_USE_DEFAULT_COLORS
+	," -d       invoke use_default_colors, repeat to use in init_pair"
+#endif
+	," -f XXX   specify foreground color"
+	," -l FILE  log window-dumps to this file"
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+#if HAVE_ASSUME_DEFAULT_COLORS
+    int a_option = 0;
+#endif
+#if HAVE_USE_DEFAULT_COLORS
+    int d_option = 0;
+#endif
+    int ch;
+
+    setlocale(LC_ALL, "");
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "ab:df:l:")) != -1) {
+	switch (ch) {
+#if HAVE_ASSUME_DEFAULT_COLORS
+	case 'a':
+	    ++a_option;
+	    break;
+#endif
+	case 'b':
+	    default_bg = color_code(optarg);
+	    break;
+#if HAVE_USE_DEFAULT_COLORS
+	case 'd':
+	    ++d_option;
+	    break;
+#endif
+	case 'f':
+	    default_fg = color_code(optarg);
+	    break;
+	case 'l':
+	    if (!open_dump(optarg))
+		usage(FALSE);
+	    break;
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+#if HAVE_USE_DEFAULT_COLORS && HAVE_ASSUME_DEFAULT_COLORS
+    if (a_option && d_option) {
+	fprintf(stderr, "Use either -a or -d option, but not both\n");
+	ExitProgram(EXIT_FAILURE);
+    }
+#endif
+
+    initscr();
+    cbreak();
+    noecho();
+
+    if (has_colors()) {
+	start_color();
+
+#if HAVE_USE_DEFAULT_COLORS
+	if (d_option) {
+	    printw("Using default colors...\n");
+	    use_default_colors();
+	    if (d_option > 1) {
+		default_fg = -1;
+		default_bg = -1;
+	    }
+	}
+#endif
+#if HAVE_ASSUME_DEFAULT_COLORS
+	if (a_option) {
+	    printw("Using assumed colors %s/%s...\n",
+		   color_name(default_fg),
+		   color_name(default_bg));
+	    assume_default_colors(default_fg, default_bg);
+	    if (a_option > 1) {
+		default_fg = -1;
+		default_bg = -1;
+	    }
+	}
+#endif
+
+	test_background();
+
+    } else {
+	printw("This demo requires a color terminal");
+	getch();
+    }
+    endwin();
+    close_dump();
+    ExitProgram(EXIT_SUCCESS);
+}
diff --git a/test/blue.c b/test/blue.c
new file mode 100644
index 0000000..90f240b
--- /dev/null
+++ b/test/blue.c
@@ -0,0 +1,542 @@
+/****************************************************************************
+ * Copyright 2019-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+/*****************************************************************************
+ *                                                                           *
+ *                         B l u e   M o o n                                 *
+ *                         =================                                 *
+ *                               V2.2                                        *
+ *                   A patience game by T.A.Lister                           *
+ *            Integral screen support by Eric S. Raymond                     *
+ *                                                                           *
+ *****************************************************************************/
+
+/*
+ * $Id: blue.c,v 1.55 2022/12/10 23:31:31 tom Exp $
+ */
+
+#include <test.priv.h>
+
+#include <time.h>
+
+#if HAVE_LANGINFO_CODESET
+#include <langinfo.h>
+#endif
+
+#define NOCARD		(-1)
+
+#define ACE		0
+#define KING		12
+#define SUIT_LENGTH	13
+
+#define HEARTS		0
+#define SPADES		1
+#define DIAMONDS	2
+#define CLUBS		3
+#define NSUITS		4
+
+#define GRID_WIDTH	14	/*    13+1  */
+#define GRID_LENGTH	56	/* 4*(13+1) */
+#define PACK_SIZE	52
+
+#define BASEROW		1
+#define PROMPTROW	11
+
+#define RED_ON_WHITE    1
+#define BLACK_ON_WHITE  2
+#define BLUE_ON_WHITE   3
+
+static GCC_NORETURN void die(int onsig);
+
+static int deck_size = PACK_SIZE;	/* initial deck */
+static int deck[PACK_SIZE];
+
+static int grid[GRID_LENGTH];	/* card layout grid */
+static int freeptr[4];		/* free card space pointers */
+
+static int deal_number = 0;
+
+static chtype ranks[SUIT_LENGTH][2] =
+{
+    {' ', 'A'},
+    {' ', '2'},
+    {' ', '3'},
+    {' ', '4'},
+    {' ', '5'},
+    {' ', '6'},
+    {' ', '7'},
+    {' ', '8'},
+    {' ', '9'},
+    {'1', '0'},
+    {' ', 'J'},
+    {' ', 'Q'},
+    {' ', 'K'}
+};
+
+static int letters[4] =
+{
+    'h',			/* hearts */
+    's',			/* spades */
+    'd',			/* diamonds */
+    'c',			/* clubs */
+};
+
+#if HAVE_LANGINFO_CODESET
+
+#if HAVE_TIGETSTR
+static int glyphs[] =
+{
+    '\003',			/* hearts */
+    '\006',			/* spades */
+    '\004',			/* diamonds */
+    '\005',			/* clubs */
+};
+#endif
+
+#if USE_WIDEC_SUPPORT
+static int uglyphs[] =
+{
+    0x2665,			/* hearts */
+    0x2660,			/* spades */
+    0x2666,			/* diamonds */
+    0x2663			/* clubs */
+};
+#endif
+#endif /* HAVE_LANGINFO_CODESET */
+
+static int *suits = letters;	/* this may change to glyphs below */
+
+static void
+die(int onsig)
+{
+    (void) signal(onsig, SIG_IGN);
+    endwin();
+    ExitProgram(EXIT_SUCCESS);
+}
+
+static void
+init_vars(void)
+{
+    int i;
+
+    deck_size = PACK_SIZE;
+    for (i = 0; i < PACK_SIZE; i++)
+	deck[i] = i;
+    for (i = 0; i < 4; i++)
+	freeptr[i] = i * GRID_WIDTH;
+}
+
+static void
+shuffle(int size)
+{
+    int numswaps, swapnum;
+
+    numswaps = size * 10;	/* an arbitrary figure */
+
+    for (swapnum = 0; swapnum < numswaps; swapnum++) {
+	int i = rand() % size;
+	int j = rand() % size;
+	int temp = deck[i];
+	deck[i] = deck[j];
+	deck[j] = temp;
+    }
+}
+
+static void
+deal_cards(void)
+{
+    int card = 0, value, csuit, crank, suit, aces[4];
+
+    memset(aces, 0, sizeof(aces));
+    for (suit = HEARTS; suit <= CLUBS; suit++) {
+	int ptr = freeptr[suit];
+	grid[ptr++] = NOCARD;	/* 1st card space is blank */
+	while ((ptr % GRID_WIDTH) != 0) {
+	    value = deck[card++];
+	    crank = value % SUIT_LENGTH;
+	    csuit = value / SUIT_LENGTH;
+	    if (crank == ACE)
+		aces[csuit] = ptr;
+	    grid[ptr++] = value;
+	}
+    }
+
+    if (deal_number == 1)	/* shift the aces down to the 1st column */
+	for (suit = HEARTS; suit <= CLUBS; suit++) {
+	    grid[suit * GRID_WIDTH] = suit * SUIT_LENGTH;
+	    grid[aces[suit]] = NOCARD;
+	    freeptr[suit] = aces[suit];
+	}
+}
+
+static void
+printcard(int value)
+{
+    AddCh(' ');
+    if (value == NOCARD) {
+	(void) addstr("   ");
+    } else {
+	int which = (value / SUIT_LENGTH);
+	int isuit = (value % SUIT_LENGTH);
+	chtype color = (chtype) COLOR_PAIR(((which % 2) == 0)
+					   ? RED_ON_WHITE
+					   : BLACK_ON_WHITE);
+
+	AddCh(ranks[isuit][0] | (chtype) COLOR_PAIR(BLUE_ON_WHITE));
+	AddCh(ranks[isuit][1] | (chtype) COLOR_PAIR(BLUE_ON_WHITE));
+
+#ifdef NCURSES_VERSION
+	(attron) ((int) color);	/* quieter compiler warnings */
+#else
+	attron(color);		/* PDCurses, etc., either no macro or wrong */
+#endif
+#if USE_WIDEC_SUPPORT
+	{
+	    wchar_t values[2];
+	    values[0] = (wchar_t) suits[which];
+	    values[1] = 0;
+	    addwstr(values);
+	}
+#else
+	AddCh(suits[which]);
+#endif
+#ifdef NCURSES_VERSION
+	(attroff) ((int) color);
+#else
+	attroff(color);
+#endif
+    }
+    AddCh(' ');
+}
+
+static void
+display_cards(int deal)
+{
+    int row, card;
+
+    clear();
+    (void) printw(
+		     "Blue Moon 2.1 - by Tim Lister & Eric Raymond - Deal %d.\n",
+		     deal);
+    for (row = HEARTS; row <= CLUBS; row++) {
+	move(BASEROW + row + row + 2, 1);
+	for (card = 0; card < GRID_WIDTH; card++)
+	    printcard(grid[row * GRID_WIDTH + card]);
+    }
+
+    move(PROMPTROW + 2, 0);
+    refresh();
+#define P(x)	(void)printw("%s\n", x)
+    P("   This 52-card solitaire starts with  the entire deck shuffled and dealt");
+    P("out in four rows.  The aces are then moved to the left end of the layout,");
+    P("making 4 initial free spaces.  You may move to a space only the card that");
+    P("matches the left neighbor in suit, and is one greater in rank.  Kings are");
+    P("high, so no cards may be placed to their right (they create dead spaces).");
+    P("  When no moves can be made,  cards still out of sequence are  reshuffled");
+    P("and dealt face up after the ends of the partial sequences, leaving a card");
+    P("space after each sequence, so that each row looks like a partial sequence");
+    P("followed by a space, followed by enough cards to make a row of 14.       ");
+    P("  A moment's reflection will show that this game cannot take more than 13");
+    P("deals. A good score is 1-3 deals, 4-7 is average, 8 or more is poor.     ");
+#undef P
+    refresh();
+}
+
+static int
+find(int card)
+{
+    int i;
+
+    if ((card < 0) || (card >= PACK_SIZE))
+	return (NOCARD);
+    for (i = 0; i < GRID_LENGTH; i++)
+	if (grid[i] == card)
+	    return i;
+    return (NOCARD);
+}
+
+static void
+movecard(int src, int dst)
+{
+    grid[dst] = grid[src];
+    grid[src] = NOCARD;
+
+    move(BASEROW + (dst / GRID_WIDTH) * 2 + 2, (dst % GRID_WIDTH) * 5 + 1);
+    printcard(grid[dst]);
+
+    move(BASEROW + (src / GRID_WIDTH) * 2 + 2, (src % GRID_WIDTH) * 5 + 1);
+    printcard(grid[src]);
+
+    refresh();
+}
+
+static void
+play_game(void)
+{
+    int dead = 0, i, j;
+    char c;
+    int selection[4], card;
+
+    while (dead < 4) {
+	dead = 0;
+	for (i = 0; i < 4; i++) {
+	    card = grid[freeptr[i] - 1];
+
+	    if (((card % SUIT_LENGTH) == KING)
+		||
+		(card == NOCARD))
+		selection[i] = NOCARD;
+	    else
+		selection[i] = find(card + 1);
+
+	    if (selection[i] == NOCARD)
+		dead++;
+	};
+
+	if (dead < 4) {
+	    char live[NSUITS + 1], *lp = live;
+
+	    for (i = 0; i < 4; i++) {
+		if (selection[i] != NOCARD) {
+		    move(BASEROW + (selection[i] / GRID_WIDTH) * 2 + 3,
+			 (selection[i] % GRID_WIDTH) * 5);
+		    (void) printw("   %c ", (*lp++ = (char) ('a' + i)));
+		}
+	    };
+	    *lp = '\0';
+
+	    if (strlen(live) == 1) {
+		move(PROMPTROW, 0);
+		(void) printw(
+				 "Making forced moves...                                 ");
+		refresh();
+		(void) sleep(1);
+		c = live[0];
+	    } else {
+		char buf[BUFSIZ];
+
+		_nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf))
+			    "Type [%s] to move, r to redraw, q or INTR to quit: ",
+			    live);
+
+		do {
+		    move(PROMPTROW, 0);
+		    (void) addstr(buf);
+		    move(PROMPTROW, (int) strlen(buf));
+		    clrtoeol();
+		    AddCh(' ');
+		} while
+		    (((c = (char) getch()) < 'a' || c > 'd')
+		     && (c != 'r')
+		     && (c != 'q'));
+	    }
+
+	    for (j = 0; j < 4; j++)
+		if (selection[j] != NOCARD) {
+		    move(BASEROW + (selection[j] / GRID_WIDTH) * 2 + 3,
+			 (selection[j] % GRID_WIDTH) * 5);
+		    (void) printw("     ");
+		}
+
+	    if (c == 'r')
+		display_cards(deal_number);
+	    else if (c == 'q')
+		die(SIGINT);
+	    else {
+		i = c - 'a';
+		if (selection[i] == NOCARD)
+		    beep();
+		else {
+		    movecard(selection[i], freeptr[i]);
+		    freeptr[i] = selection[i];
+		}
+	    }
+	}
+    }
+
+    move(PROMPTROW, 0);
+    (void) standout();
+    (void) printw("Finished deal %d - type any character to continue...", deal_number);
+    (void) standend();
+    (void) getch();
+}
+
+static int
+collect_discards(void)
+{
+    int row, col, cardno = 0, gridno;
+
+    for (row = HEARTS; row <= CLUBS; row++) {
+	int finish = 0;
+	for (col = 1; col < GRID_WIDTH; col++) {
+	    gridno = row * GRID_WIDTH + col;
+
+	    if ((grid[gridno] != (grid[gridno - 1] + 1)) && (finish == 0)) {
+		finish = 1;
+		freeptr[row] = gridno;
+	    };
+
+	    if ((finish != 0) && (grid[gridno] != NOCARD))
+		deck[cardno++] = grid[gridno];
+	}
+    }
+    return cardno;
+}
+
+static void
+game_finished(int deal)
+{
+    clear();
+    (void) printw("You finished the game in %d deals. This is ", deal);
+    (void) standout();
+    if (deal < 2)
+	(void) addstr("excellent");
+    else if (deal < 4)
+	(void) addstr("good");
+    else if (deal < 8)
+	(void) addstr("average");
+    else
+	(void) addstr("poor");
+    (void) standend();
+    (void) addstr(".         ");
+    refresh();
+}
+
+#if HAVE_LANGINFO_CODESET
+/*
+ * This program first appeared in ncurses in January 1995.  At that point, the
+ * Linux console was able to display CP437 graphic characters, e.g., in the
+ * range 0-31.  As of 2016, most Linux consoles are running with the UTF-8
+ * (partial) support.  Incidentally, that makes all of the cards diamonds.
+ */
+static void
+use_pc_display(void)
+{
+    char *check = nl_langinfo(CODESET);
+    if (!strcmp(check, "UTF-8")) {
+#if USE_WIDEC_SUPPORT
+	suits = uglyphs;
+#endif
+    } else {
+#if HAVE_TIGETSTR
+	if (!strcmp(check, "IBM437") ||
+	    !strcmp(check, "CP437") ||
+	    !strcmp(check, "IBM850") ||
+	    !strcmp(check, "CP850")) {
+	    char *smacs = tigetstr("smacs");
+	    char *smpch = tigetstr("smpch");
+	    /*
+	     * The ncurses library makes this check to decide whether to allow
+	     * the alternate character set for the (normally) nonprinting codes.
+	     */
+	    if (smacs != 0 && smpch != 0 && !strcmp(smacs, smpch)) {
+		suits = glyphs;
+	    }
+	}
+#endif
+    }
+}
+#else
+#define use_pc_display()	/* nothing */
+#endif /* HAVE_LANGINFO_CODESET */
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: blue [options]"
+	,""
+	,USAGE_COMMON
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) {
+	switch (ch) {
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind < argc)
+	usage(FALSE);
+
+    setlocale(LC_ALL, "");
+
+    use_pc_display();
+
+    InitAndCatch(initscr(), die);
+
+    start_color();
+    init_pair(RED_ON_WHITE, COLOR_RED, COLOR_WHITE);
+    init_pair(BLUE_ON_WHITE, COLOR_BLUE, COLOR_WHITE);
+    init_pair(BLACK_ON_WHITE, COLOR_BLACK, COLOR_WHITE);
+
+    cbreak();
+
+    if (argc == 2)
+	srand((unsigned) atoi(argv[1]));
+    else
+	srand((unsigned) time((time_t *) 0));
+
+    init_vars();
+
+    do {
+	deal_number++;
+	shuffle(deck_size);
+	deal_cards();
+	display_cards(deal_number);
+	play_game();
+    }
+    while
+	((deck_size = collect_discards()) != 0);
+
+    game_finished(deal_number);
+
+    die(SIGINT);
+    /*NOTREACHED */
+}
+
+/* blue.c ends here */
diff --git a/test/bs.6 b/test/bs.6
new file mode 100644
index 0000000..3bb1f10
--- /dev/null
+++ b/test/bs.6
@@ -0,0 +1,72 @@
+.\"***************************************************************************
+.\" Copyright 2020,2021 Thomas E. Dickey                                     *
+.\" Copyright 1998,2006 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: bs.6,v 1.4 2021/06/17 21:20:30 tom Exp $
+.TH BATTLESHIPS 6 "Aug 23, 1989"
+.SH NAME
+bs \- battleships game
+.SH SYNOPSIS
+battle [ -b | -s ] [ -c ]
+.SH DESCRIPTION
+This program allows you to play the familiar Battleships game against the
+computer on a 10x10 board. The interface is visual and largely
+self-explanatory; you place your ships and pick your shots by moving the
+cursor around the `sea' with the rogue/hack motion keys hjklyubn.
+.PP
+Note that when selecting a ship to place, you must type the capital letter
+(these are, after all, capital ships). During ship placement, the `r' command
+may be used to ignore the current position and randomly place your currently
+selected ship. The `R' command will place all remaining ships randomly. The ^L
+command (form feed, ASCII 12) will force a screen redraw).
+.PP
+The command-line arguments control game modes.
+
+.nf
+	-b selects a `blitz' variant
+	-s selects a `salvo' variant
+	-c permits ships to be placed adjacently
+.fi
+
+The `blitz' variant allows a side to shoot for as long as it continues to
+score hits.
+.PP
+The `salvo' game allows a player one shot per turn for each of his/her ships
+still afloat.  This puts a premium scoring hits early and knocking out some
+ships and also makes much harder the situation where you face a superior force
+with only your PT-boat.
+.PP
+Normally, ships must be separated by at least one square of open water. The
+-c option disables this check and allows them to close-pack.
+.PP
+The algorithm the computer uses once it has found a ship to sink is provably
+optimal. The dispersion criterion for the random-fire algorithm may not be.
+.SH AUTHORS
+Originally written by one Bruce Holloway in 1986. Salvo mode added by Chuck A.
+DeGaul (cbosgd!cad). Visual user interface, `closepack' option, code rewrite
+and manual page by Eric S. Raymond <esr@snark.thyrsus.com> August 1989.
diff --git a/test/bs.c b/test/bs.c
new file mode 100644
index 0000000..3e77331
--- /dev/null
+++ b/test/bs.c
@@ -0,0 +1,1283 @@
+/****************************************************************************
+ * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+/*
+ * bs.c - original author: Bruce Holloway
+ *		salvo option by: Chuck A DeGaul
+ * with improved user interface, autoconfiguration and code cleanup
+ *		by Eric S. Raymond <esr@snark.thyrsus.com>
+ * v1.2 with color support and minor portability fixes, November 1990
+ * v2.0 featuring strict ANSI/POSIX conformance, November 1993.
+ * v2.1 with ncurses mouse support, September 1995
+ *
+ * $Id: bs.c,v 1.78 2022/12/11 00:18:37 tom Exp $
+ */
+
+#include <test.priv.h>
+
+#include <time.h>
+
+#ifndef SIGIOT
+#define SIGIOT SIGABRT
+#endif
+
+static int getcoord(int);
+
+/*
+ * Constants for tuning the random-fire algorithm. It prefers moves that
+ * diagonal-stripe the board with a stripe separation of srchstep. If
+ * no such preferred moves are found, srchstep is decremented.
+ */
+#define BEGINSTEP	3	/* initial value of srchstep */
+
+/* miscellaneous constants */
+#define SHIPTYPES	5
+#define	OTHER		(1-turn)
+#define PLAYER		0
+#define COMPUTER	1
+#define MARK_HIT	'H'
+#define MARK_MISS	'o'
+#define CTRLC		'\003'	/* used as terminate command */
+#define FF		'\014'	/* used as redraw command */
+
+#define is_QUIT(c) ((c) == CTRLC || (c) == QUIT)
+
+/* coordinate handling */
+#define BWIDTH		10
+#define BDEPTH		10
+
+/* display symbols */
+#define SHOWHIT		'*'
+#define SHOWSPLASH	' '
+#define IS_SHIP(c)	(isupper(UChar(c)) ? TRUE : FALSE)
+
+/* how to position us on player board */
+#define PYBASE	3
+#define PXBASE	3
+#define PY(y)	(PYBASE + (y))
+#define PX(x)	(PXBASE + (x)*3)
+#define pgoto(y, x)	(void)move(PY(y), PX(x))
+
+/* how to position us on cpu board */
+#define CYBASE	3
+#define CXBASE	48
+#define CY(y)	(CYBASE + (y))
+#define CX(x)	(CXBASE + (x)*3)
+#define CYINV(y)	((y) - CYBASE)
+#define CXINV(x)	(((x) - CXBASE) / 3)
+#define cgoto(y, x)	(void)move(CY(y), CX(x))
+
+#define ONBOARD(x, y)	(x >= 0 && x < BWIDTH && y >= 0 && y < BDEPTH)
+
+/* other board locations */
+#define COLWIDTH	80
+#define PROMPTLINE	21	/* prompt line */
+#define SYBASE		CYBASE + BDEPTH + 3	/* move key diagram */
+#define SXBASE		63
+#define MYBASE		SYBASE - 1	/* diagram caption */
+#define MXBASE		64
+#define HYBASE		SYBASE - 1	/* help area */
+#define HXBASE		0
+
+/* this will need to be changed if BWIDTH changes */
+static char numbers[] = "   0  1  2  3  4  5  6  7  8  9";
+
+static char carrier[] = "Aircraft Carrier";
+static char battle[] = "Battleship";
+static char sub[] = "Submarine";
+static char destroy[] = "Destroyer";
+static char ptboat[] = "PT Boat";
+
+static char *your_name;
+static char dftname[] = "stranger";
+
+/* direction constants */
+typedef enum {
+    dir_E = 0
+    ,dir_SE
+    ,dir_S
+    ,dir_SW
+    ,dir_W
+    ,dir_NW
+    ,dir_N
+    ,dir_NE
+    ,dir_MAX
+} DIRECTIONS;
+static int xincr[dir_MAX + 2] =
+{1, 1, 0, -1, -1, -1, 0, 1};
+static int yincr[dir_MAX + 2] =
+{0, 1, 1, 1, 0, -1, -1, -1};
+
+/* current ship position and direction */
+static int curx = (BWIDTH / 2);
+static int cury = (BDEPTH / 2);
+
+typedef struct {
+    char *name;			/* name of the ship type */
+    int hits;			/* how many times has this ship been hit? */
+    char symbol;		/* symbol for game purposes */
+    int length;			/* length of ship */
+    int x, y;			/* coordinates of ship start point */
+    int dir;			/* direction of `bow' */
+    bool placed;		/* has it been placed on the board? */
+} ship_t;
+
+static bool checkplace(int b, ship_t * ss, int vis);
+
+#define SHIPIT(name, symbol, length) { name, 0, symbol, length, 0,0, 0, FALSE }
+
+/* "ply=player", "cpu=computer" */
+static ship_t plyship[SHIPTYPES] =
+{
+    SHIPIT(carrier, 'A', 5),
+    SHIPIT(battle, 'B', 4),
+    SHIPIT(destroy, 'D', 3),
+    SHIPIT(sub, 'S', 3),
+    SHIPIT(ptboat, 'P', 2),
+};
+
+static ship_t cpuship[SHIPTYPES] =
+{
+    SHIPIT(carrier, 'A', 5),
+    SHIPIT(battle, 'B', 4),
+    SHIPIT(destroy, 'D', 3),
+    SHIPIT(sub, 'S', 3),
+    SHIPIT(ptboat, 'P', 2),
+};
+
+/* "Hits" board, and main board. */
+static char hits[2][BWIDTH][BDEPTH];
+static char board[2][BWIDTH][BDEPTH];
+
+static int turn;		/* 0=player, 1=computer */
+static int plywon = 0, cpuwon = 0;	/* How many games has each won? */
+
+static int salvo, blitz, closepack;
+
+#define	PR	(void)addstr
+
+static GCC_NORETURN void uninitgame(int sig);
+
+static void
+uninitgame(int sig GCC_UNUSED)
+/* end the game, either normally or due to signal */
+{
+    clear();
+    (void) refresh();
+    (void) reset_shell_mode();
+    (void) echo();
+    (void) endwin();
+    free(your_name);
+    ExitProgram(sig ? EXIT_FAILURE : EXIT_SUCCESS);
+}
+
+static void
+announceopts(void)
+/* announce which game options are enabled */
+{
+    if (salvo || blitz || closepack) {
+	(void) printw("Playing optional game (");
+	if (salvo)
+	    (void) printw("salvo, ");
+	else
+	    (void) printw("nosalvo, ");
+	if (blitz)
+	    (void) printw("blitz ");
+	else
+	    (void) printw("noblitz, ");
+	if (closepack)
+	    (void) printw("closepack)");
+	else
+	    (void) printw("noclosepack)");
+    } else
+	(void) printw(
+			 "Playing standard game (noblitz, nosalvo, noclosepack)");
+}
+
+static void
+intro(void)
+{
+    const char *tmpname;
+
+    srand((unsigned) (time(0L) + getpid()));	/* Kick the random number generator */
+
+    InitAndCatch(initscr(), uninitgame);
+
+    if ((tmpname = getlogin()) != 0 &&
+	(your_name = strdup(tmpname)) != 0) {
+	your_name[0] = (char) toupper(UChar(your_name[0]));
+    } else {
+	your_name = strdup(dftname);
+    }
+
+    keypad(stdscr, TRUE);
+    (void) def_prog_mode();
+    (void) nonl();
+    (void) cbreak();
+    (void) noecho();
+
+#ifdef PENGUIN
+    (void) clear();
+    MvAddStr(4, 29, "Welcome to Battleship!");
+    (void) move(8, 0);
+    PR("                                                  \\\n");
+    PR("                           \\                     \\ \\\n");
+    PR("                          \\ \\                   \\ \\ \\_____________\n");
+    PR("                         \\ \\ \\_____________      \\ \\/            |\n");
+    PR("                          \\ \\/             \\      \\/             |\n");
+    PR("                           \\/               \\_____/              |__\n");
+    PR("           ________________/                                       |\n");
+    PR("           \\  S.S. Penguin                                         |\n");
+    PR("            \\                                                     /\n");
+    PR("             \\___________________________________________________/\n");
+
+    MvAddStr(22, 27, "Hit any key to continue...");
+    (void) refresh();
+    (void) getch();
+#endif /* PENGUIN */
+
+#ifdef A_COLOR
+    start_color();
+
+    init_pair(COLOR_BLACK, COLOR_BLACK, COLOR_BLACK);
+    init_pair(COLOR_GREEN, COLOR_GREEN, COLOR_BLACK);
+    init_pair(COLOR_RED, COLOR_RED, COLOR_BLACK);
+    init_pair(COLOR_CYAN, COLOR_CYAN, COLOR_BLACK);
+    init_pair(COLOR_WHITE, COLOR_WHITE, COLOR_BLACK);
+    init_pair(COLOR_MAGENTA, COLOR_MAGENTA, COLOR_BLACK);
+    init_pair(COLOR_BLUE, COLOR_BLUE, COLOR_BLACK);
+    init_pair(COLOR_YELLOW, COLOR_YELLOW, COLOR_BLACK);
+#endif /* A_COLOR */
+
+#ifdef NCURSES_MOUSE_VERSION
+    (void) mousemask(BUTTON1_CLICKED, (mmask_t *) NULL);
+#endif /* NCURSES_MOUSE_VERSION */
+}
+
+/* VARARGS1 */
+static void
+prompt(int n, NCURSES_CONST char *f, const char *s)
+/* print a message at the prompt line */
+{
+    (void) move(PROMPTLINE + n, 0);
+    (void) clrtoeol();
+    (void) printw(f, s);
+    (void) refresh();
+}
+
+static void
+error(NCURSES_CONST char *s)
+{
+    (void) move(PROMPTLINE + 2, 0);
+    (void) clrtoeol();
+    if (s) {
+	(void) addstr(s);
+	(void) beep();
+    }
+}
+
+static void
+placeship(int b, ship_t * ss, int vis)
+{
+    int l;
+
+    for (l = 0; l < ss->length; ++l) {
+	int newx = ss->x + l * xincr[ss->dir];
+	int newy = ss->y + l * yincr[ss->dir];
+
+	board[b][newx][newy] = ss->symbol;
+	if (vis) {
+	    pgoto(newy, newx);
+	    AddCh(ss->symbol);
+	}
+    }
+    ss->hits = 0;
+}
+
+static int
+rnd(int n)
+{
+    return (((rand() & 0x7FFF) % n));
+}
+
+static void
+randomplace(int b, ship_t * ss)
+/* generate a valid random ship placement into px,py */
+{
+
+    do {
+	ss->dir = rnd(2) ? dir_E : dir_S;
+	ss->x = rnd(BWIDTH - (ss->dir == dir_E ? ss->length : 0));
+	ss->y = rnd(BDEPTH - (ss->dir == dir_S ? ss->length : 0));
+    } while
+	(!checkplace(b, ss, FALSE));
+}
+
+static void
+initgame(void)
+{
+    int i, j, unplaced;
+    ship_t *ss;
+
+    (void) clear();
+    MvAddStr(0, 35, "BATTLESHIPS");
+    (void) move(PROMPTLINE + 2, 0);
+    announceopts();
+
+    memset(board, 0, sizeof(char) * BWIDTH * BDEPTH * 2);
+    memset(hits, 0, sizeof(char) * BWIDTH * BDEPTH * 2);
+    for (i = 0; i < SHIPTYPES; i++) {
+	ss = cpuship + i;
+
+	ss->x =
+	    ss->y =
+	    ss->dir =
+	    ss->hits = 0;
+	ss->placed = FALSE;
+
+	ss = plyship + i;
+
+	ss->x =
+	    ss->y =
+	    ss->dir =
+	    ss->hits = 0;
+	ss->placed = FALSE;
+    }
+
+    /* draw empty boards */
+    MvAddStr(PYBASE - 2, PXBASE + 5, "Main Board");
+    MvAddStr(PYBASE - 1, PXBASE - 3, numbers);
+    for (i = 0; i < BDEPTH; ++i) {
+	MvAddCh(PYBASE + i, PXBASE - 3, (chtype) (i + 'A'));
+#ifdef A_COLOR
+	if (has_colors())
+	    attron(COLOR_PAIR(COLOR_BLUE));
+#endif /* A_COLOR */
+	AddCh(' ');
+	for (j = 0; j < BWIDTH; j++)
+	    (void) addstr(" . ");
+#ifdef A_COLOR
+	(void) attrset(0);
+#endif /* A_COLOR */
+	AddCh(' ');
+	AddCh(i + 'A');
+    }
+    MvAddStr(PYBASE + BDEPTH, PXBASE - 3, numbers);
+    MvAddStr(CYBASE - 2, CXBASE + 7, "Hit/Miss Board");
+    MvAddStr(CYBASE - 1, CXBASE - 3, numbers);
+    for (i = 0; i < BDEPTH; ++i) {
+	MvAddCh(CYBASE + i, CXBASE - 3, (chtype) (i + 'A'));
+#ifdef A_COLOR
+	if (has_colors())
+	    attron(COLOR_PAIR(COLOR_BLUE));
+#endif /* A_COLOR */
+	AddCh(' ');
+	for (j = 0; j < BWIDTH; j++)
+	    (void) addstr(" . ");
+#ifdef A_COLOR
+	(void) attrset(0);
+#endif /* A_COLOR */
+	AddCh(' ');
+	AddCh(i + 'A');
+    }
+
+    MvAddStr(CYBASE + BDEPTH, CXBASE - 3, numbers);
+
+    MvPrintw(HYBASE, HXBASE,
+	     "To position your ships: move the cursor to a spot, then");
+    MvPrintw(HYBASE + 1, HXBASE,
+	     "type the first letter of a ship type to select it, then");
+    MvPrintw(HYBASE + 2, HXBASE,
+	     "type a direction ([hjkl] or [4862]), indicating how the");
+    MvPrintw(HYBASE + 3, HXBASE,
+	     "ship should be pointed. You may also type a ship letter");
+    MvPrintw(HYBASE + 4, HXBASE,
+	     "followed by `r' to position it randomly, or type `R' to");
+    MvPrintw(HYBASE + 5, HXBASE,
+	     "place all remaining ships randomly.");
+
+    MvAddStr(MYBASE, MXBASE, "Aiming keys:");
+    MvAddStr(SYBASE, SXBASE, "y k u    7 8 9");
+    MvAddStr(SYBASE + 1, SXBASE, " \\|/      \\|/ ");
+    MvAddStr(SYBASE + 2, SXBASE, "h-+-l    4-+-6");
+    MvAddStr(SYBASE + 3, SXBASE, " /|\\      /|\\ ");
+    MvAddStr(SYBASE + 4, SXBASE, "b j n    1 2 3");
+
+    /* have the computer place ships */
+    for (ss = cpuship; ss < cpuship + SHIPTYPES; ss++) {
+	randomplace(COMPUTER, ss);
+	placeship(COMPUTER, ss, FALSE);
+    }
+
+    do {
+	char c, docked[SHIPTYPES + 2], *cp = docked;
+
+	ss = (ship_t *) NULL;
+
+	/* figure which ships still wait to be placed */
+	*cp++ = 'R';
+	for (i = 0; i < SHIPTYPES; i++)
+	    if (!plyship[i].placed)
+		*cp++ = plyship[i].symbol;
+	*cp = '\0';
+
+	/* get a command letter */
+	prompt(1, "Type one of [%s] to pick a ship.", docked + 1);
+	do {
+	    c = (char) getcoord(PLAYER);
+	} while
+	    (!(strchr) (docked, c));
+
+	if (c == 'R')
+	    (void) ungetch('R');
+	else {
+	    /* map that into the corresponding symbol */
+	    for (ss = plyship; ss < plyship + SHIPTYPES; ss++)
+		if (ss->symbol == c)
+		    break;
+
+	    prompt(1, "Type one of [hjklrR] to place your %s.", ss->name);
+	    pgoto(cury, curx);
+	}
+
+	do {
+	    c = (char) getch();
+	} while
+	    (!(strchr("hjkl8462rR", c) || c == FF || is_QUIT(c)));
+
+	if (is_QUIT(c)) {
+	    uninitgame(0);
+	} else if (c == FF) {
+	    (void) clearok(stdscr, TRUE);
+	    (void) refresh();
+	} else if (ss == 0) {
+	    beep();		/* simple to verify, unlikely to happen */
+	} else if (c == 'r') {
+	    prompt(1, "Random-placing your %s", ss->name);
+	    randomplace(PLAYER, ss);
+	    placeship(PLAYER, ss, TRUE);
+	    error((char *) NULL);
+	    ss->placed = TRUE;
+	} else if (c == 'R') {
+	    prompt(1, "Placing the rest of your fleet at random...", "");
+	    for (ss = plyship; ss < plyship + SHIPTYPES; ss++)
+		if (!ss->placed) {
+		    randomplace(PLAYER, ss);
+		    placeship(PLAYER, ss, TRUE);
+		    ss->placed = TRUE;
+		}
+	    error((char *) NULL);
+	} else if (strchr("hjkl8462", c)) {
+	    ss->x = curx;
+	    ss->y = cury;
+
+	    switch (c) {
+	    case 'k':
+	    case '8':
+		ss->dir = dir_N;
+		break;
+	    case 'j':
+	    case '2':
+		ss->dir = dir_S;
+		break;
+	    case 'h':
+	    case '4':
+		ss->dir = dir_W;
+		break;
+	    case 'l':
+	    case '6':
+		ss->dir = dir_E;
+		break;
+	    }
+
+	    if (checkplace(PLAYER, ss, TRUE)) {
+		placeship(PLAYER, ss, TRUE);
+		error((char *) NULL);
+		ss->placed = TRUE;
+	    }
+	}
+
+	for (unplaced = i = 0; i < SHIPTYPES; i++)
+	    unplaced += !plyship[i].placed;
+    } while
+	(unplaced);
+
+    turn = rnd(2);
+
+    MvPrintw(HYBASE, HXBASE,
+	     "To fire, move the cursor to your chosen aiming point   ");
+    MvPrintw(HYBASE + 1, HXBASE,
+	     "and strike any key other than a motion key.            ");
+    MvPrintw(HYBASE + 2, HXBASE,
+	     "                                                       ");
+    MvPrintw(HYBASE + 3, HXBASE,
+	     "                                                       ");
+    MvPrintw(HYBASE + 4, HXBASE,
+	     "                                                       ");
+    MvPrintw(HYBASE + 5, HXBASE,
+	     "                                                       ");
+
+    (void) prompt(0, "Press any key to start...", "");
+    (void) getch();
+}
+
+static int
+getcoord(int atcpu)
+{
+    if (atcpu)
+	cgoto(cury, curx);
+    else
+	pgoto(cury, curx);
+    (void) refresh();
+
+    for (;;) {
+	int ny, nx, c;
+
+	if (atcpu) {
+	    MvPrintw(CYBASE + BDEPTH + 1, CXBASE + 11, "(%d, %c)",
+		     curx, 'A' + cury);
+	    cgoto(cury, curx);
+	} else {
+	    MvPrintw(PYBASE + BDEPTH + 1, PXBASE + 11, "(%d, %c)",
+		     curx, 'A' + cury);
+	    pgoto(cury, curx);
+	}
+
+	switch (c = getch()) {
+	case 'k':
+	case '8':
+	case KEY_UP:
+	    ny = cury + BDEPTH - 1;
+	    nx = curx;
+	    break;
+	case 'j':
+	case '2':
+	case KEY_DOWN:
+	    ny = cury + 1;
+	    nx = curx;
+	    break;
+	case 'h':
+	case '4':
+	case KEY_LEFT:
+	    ny = cury;
+	    nx = curx + BWIDTH - 1;
+	    break;
+	case 'l':
+	case '6':
+	case KEY_RIGHT:
+	    ny = cury;
+	    nx = curx + 1;
+	    break;
+	case 'y':
+	case '7':
+	case KEY_A1:
+	    ny = cury + BDEPTH - 1;
+	    nx = curx + BWIDTH - 1;
+	    break;
+	case 'b':
+	case '1':
+	case KEY_C1:
+	    ny = cury + 1;
+	    nx = curx + BWIDTH - 1;
+	    break;
+	case 'u':
+	case '9':
+	case KEY_A3:
+	    ny = cury + BDEPTH - 1;
+	    nx = curx + 1;
+	    break;
+	case 'n':
+	case '3':
+	case KEY_C3:
+	    ny = cury + 1;
+	    nx = curx + 1;
+	    break;
+	case FF:
+	    nx = curx;
+	    ny = cury;
+	    (void) clearok(stdscr, TRUE);
+	    (void) refresh();
+	    break;
+#ifdef NCURSES_MOUSE_VERSION
+	case KEY_MOUSE:
+	    {
+		MEVENT myevent;
+
+		getmouse(&myevent);
+		if (atcpu
+		    && myevent.y >= CY(0) && myevent.y <= CY(BDEPTH)
+		    && myevent.x >= CX(0) && myevent.x <= CX(BDEPTH)) {
+		    curx = CXINV(myevent.x);
+		    cury = CYINV(myevent.y);
+		    return (' ');
+		} else {
+		    beep();
+		    continue;
+		}
+	    }
+	    /* no fall through */
+#endif /* NCURSES_MOUSE_VERSION */
+
+	default:
+	    if (atcpu)
+		MvAddStr(CYBASE + BDEPTH + 1, CXBASE + 11, "      ");
+	    else
+		MvAddStr(PYBASE + BDEPTH + 1, PXBASE + 11, "      ");
+	    return (c);
+	}
+
+	curx = nx % BWIDTH;
+	cury = ny % BDEPTH;
+    }
+}
+
+static bool
+collidecheck(int b, int y, int x)
+/* is this location on the selected zboard adjacent to a ship? */
+{
+    bool collide;
+
+    /* anything on the square */
+    if ((collide = IS_SHIP(board[b][x][y])) != FALSE)
+	return (collide);
+
+    /* anything on the neighbors */
+    if (!closepack) {
+	int i;
+
+	for (i = 0; i < dir_MAX; i++) {
+	    int xend, yend;
+
+	    yend = y + yincr[i];
+	    xend = x + xincr[i];
+	    if (ONBOARD(xend, yend)
+		&& IS_SHIP(board[b][xend][yend])) {
+		collide = TRUE;
+		break;
+	    }
+	}
+    }
+    return (collide);
+}
+
+static bool
+checkplace(int b, ship_t * ss, int vis)
+{
+    int l, xend, yend;
+
+    /* first, check for board edges */
+    xend = ss->x + (ss->length - 1) * xincr[ss->dir];
+    yend = ss->y + (ss->length - 1) * yincr[ss->dir];
+    if (!ONBOARD(xend, yend)) {
+	if (vis)
+	    switch (rnd(3)) {
+	    case 0:
+		error("Ship is hanging from the edge of the world");
+		break;
+	    case 1:
+		error("Try fitting it on the board");
+		break;
+	    case 2:
+		error("Figure I won't find it if you put it there?");
+		break;
+	    }
+	return (FALSE);
+    }
+
+    for (l = 0; l < ss->length; ++l) {
+	if (collidecheck(b, ss->y + l * yincr[ss->dir], ss->x + l * xincr[ss->dir])) {
+	    if (vis)
+		switch (rnd(3)) {
+		case 0:
+		    error("There's already a ship there");
+		    break;
+		case 1:
+		    error("Collision alert!  Aaaaaagh!");
+		    break;
+		case 2:
+		    error("Er, Admiral, what about the other ship?");
+		    break;
+		}
+	    return (FALSE);
+	}
+    }
+    return (TRUE);
+}
+
+static int
+awinna(void)
+{
+    int i, j;
+
+    for (i = 0; i < 2; ++i) {
+	ship_t *ss = (i) ? cpuship : plyship;
+	for (j = 0; j < SHIPTYPES; ++j, ++ss)
+	    if (ss->length > ss->hits)
+		break;
+	if (j == SHIPTYPES)
+	    return (OTHER);
+    }
+    return (-1);
+}
+
+static ship_t *
+hitship(int x, int y)
+/* register a hit on the targeted ship */
+{
+    ship_t *sb, *ss;
+    char sym;
+    int oldx, oldy;
+
+    getyx(stdscr, oldy, oldx);
+    sb = (turn) ? plyship : cpuship;
+    if ((sym = board[OTHER][x][y]) == 0)
+	return ((ship_t *) NULL);
+    for (ss = sb; ss < sb + SHIPTYPES; ++ss)
+	if (ss->symbol == sym) {
+	    if (++ss->hits < ss->length)	/* still afloat? */
+		return ((ship_t *) NULL);
+	    else {		/* sunk! */
+		int i;
+
+		if (!closepack) {
+		    int j;
+
+		    for (j = -1; j <= 1; j++) {
+			int bx = ss->x + j * xincr[(ss->dir + 2) % dir_MAX];
+			int by = ss->y + j * yincr[(ss->dir + 2) % dir_MAX];
+
+			for (i = -1; i <= ss->length; ++i) {
+			    int x1, y1;
+
+			    x1 = bx + i * xincr[ss->dir];
+			    y1 = by + i * yincr[ss->dir];
+			    if (ONBOARD(x1, y1)) {
+				hits[turn][x1][y1] = MARK_MISS;
+				if (turn % 2 == PLAYER) {
+				    cgoto(y1, x1);
+#ifdef A_COLOR
+				    if (has_colors())
+					attron(COLOR_PAIR(COLOR_GREEN));
+#endif /* A_COLOR */
+				    AddCh(MARK_MISS);
+#ifdef A_COLOR
+				    (void) attrset(0);
+#endif /* A_COLOR */
+				} else {
+				    pgoto(y1, x1);
+				    AddCh(SHOWSPLASH);
+				}
+			    }
+			}
+		    }
+		}
+
+		for (i = 0; i < ss->length; ++i) {
+		    int x1 = ss->x + i * xincr[ss->dir];
+		    int y1 = ss->y + i * yincr[ss->dir];
+
+		    hits[turn][x1][y1] = ss->symbol;
+		    if (turn % 2 == PLAYER) {
+			cgoto(y1, x1);
+			AddCh(ss->symbol);
+		    } else {
+			pgoto(y1, x1);
+#ifdef A_COLOR
+			if (has_colors())
+			    attron(COLOR_PAIR(COLOR_RED));
+#endif /* A_COLOR */
+			AddCh(SHOWHIT);
+#ifdef A_COLOR
+			(void) attrset(0);
+#endif /* A_COLOR */
+		    }
+		}
+
+		(void) move(oldy, oldx);
+		return (ss);
+	    }
+	}
+    (void) move(oldy, oldx);
+    return ((ship_t *) NULL);
+}
+
+static bool
+plyturn(void)
+{
+    ship_t *ss;
+    bool hit;
+    NCURSES_CONST char *m = NULL;
+
+    prompt(1, "Where do you want to shoot? ", "");
+    for (;;) {
+	(void) getcoord(COMPUTER);
+	if (hits[PLAYER][curx][cury]) {
+	    prompt(1, "You shelled this spot already! Try again.", "");
+	    beep();
+	} else
+	    break;
+    }
+    hit = IS_SHIP(board[COMPUTER][curx][cury]);
+    hits[PLAYER][curx][cury] = (char) (hit ? MARK_HIT : MARK_MISS);
+    cgoto(cury, curx);
+#ifdef A_COLOR
+    if (has_colors()) {
+	if (hit)
+	    attron(COLOR_PAIR(COLOR_RED));
+	else
+	    attron(COLOR_PAIR(COLOR_GREEN));
+    }
+#endif /* A_COLOR */
+    AddCh(hits[PLAYER][curx][cury]);
+#ifdef A_COLOR
+    (void) attrset(0);
+#endif /* A_COLOR */
+
+    prompt(1, "You %s.", hit ? "scored a hit" : "missed");
+    if (hit && (ss = hitship(curx, cury))) {
+	switch (rnd(5)) {
+	case 0:
+	    m = " You sank my %s!";
+	    break;
+	case 1:
+	    m = " I have this sinking feeling about my %s....";
+	    break;
+	case 2:
+	    m = " My %s has gone to Davy Jones's locker!";
+	    break;
+	case 3:
+	    m = " Glub, glub -- my %s is headed for the bottom!";
+	    break;
+	case 4:
+	    m = " You'll pick up survivors from my %s, I hope...!";
+	    break;
+	}
+	if (m != 0) {
+	    (void) printw(m, ss->name);
+	}
+	(void) beep();
+    }
+    return (hit);
+}
+
+static int
+sgetc(const char *s)
+{
+    (void) refresh();
+
+    for (;;) {
+	int ch = getch();
+	const char *s1;
+
+	if (islower(ch))
+	    ch = toupper(ch);
+	if (is_QUIT(ch))
+	    uninitgame(0);
+	for (s1 = s; *s1 && ch != *s1; ++s1)
+	    continue;
+	if (*s1) {
+	    AddCh(ch);
+	    (void) refresh();
+	    return (ch);
+	}
+    }
+}
+
+static void
+randomfire(int *px, int *py)
+/* random-fire routine -- implements simple diagonal-striping strategy */
+{
+    static int turncount = 0;
+    static int srchstep = BEGINSTEP;
+    static int huntoffs;	/* Offset on search strategy */
+    int ypossible[BWIDTH * BDEPTH], xpossible[BWIDTH * BDEPTH], nposs;
+    int ypreferred[BWIDTH * BDEPTH], xpreferred[BWIDTH * BDEPTH], npref;
+    int x, y, i;
+
+    if (turncount++ == 0)
+	huntoffs = rnd(srchstep);
+
+    /* first, list all possible moves */
+    nposs = npref = 0;
+    for (x = 0; x < BWIDTH; x++)
+	for (y = 0; y < BDEPTH; y++)
+	    if (!hits[COMPUTER][x][y]) {
+		xpossible[nposs] = x;
+		ypossible[nposs] = y;
+		nposs++;
+		if (((x + huntoffs) % srchstep) != (y % srchstep)) {
+		    xpreferred[npref] = x;
+		    ypreferred[npref] = y;
+		    npref++;
+		}
+	    }
+
+    if (npref) {
+	i = rnd(npref);
+
+	*px = xpreferred[i];
+	*py = ypreferred[i];
+    } else if (nposs) {
+	i = rnd(nposs);
+
+	*px = xpossible[i];
+	*py = ypossible[i];
+
+	if (srchstep > 1)
+	    --srchstep;
+    } else {
+	error("No moves possible?? Help!");
+	ExitProgram(EXIT_FAILURE);
+	/*NOTREACHED */
+    }
+}
+
+#define S_MISS	0
+#define S_HIT	1
+#define S_SUNK	-1
+
+static int
+cpufire(int x, int y)
+/* fire away at given location */
+{
+    bool hit, sunk;
+    ship_t *ss = NULL;
+
+    hit = (bool) board[PLAYER][x][y];
+    hits[COMPUTER][x][y] = (hit ? MARK_HIT : MARK_MISS);
+    MvPrintw(PROMPTLINE, 0,
+	     "I shoot at %c%d. I %s!", y + 'A', x, hit ? "hit" :
+	     "miss");
+    if ((sunk = (hit && (ss = hitship(x, y)))) != 0)
+	(void) printw(" I've sunk your %s", ss->name);
+    (void) clrtoeol();
+
+    pgoto(y, x);
+#ifdef A_COLOR
+    if (has_colors()) {
+	if (hit)
+	    attron(COLOR_PAIR(COLOR_RED));
+	else
+	    attron(COLOR_PAIR(COLOR_GREEN));
+    }
+#endif /* A_COLOR */
+    AddCh((hit ? SHOWHIT : SHOWSPLASH));
+#ifdef A_COLOR
+    (void) attrset(0);
+#endif /* A_COLOR */
+
+    return hit ? (sunk ? S_SUNK : S_HIT) : S_MISS;
+}
+
+/*
+ * This code implements a fairly irregular FSM, so please forgive the rampant
+ * unstructuredness below. The five labels are states which need to be held
+ * between computer turns.
+ *
+ * The FSM is not externally reset to RANDOM_FIRE if the player wins. Instead,
+ * the other states check for "impossible" conditions which signify a new
+ * game, then if found transition to RANDOM_FIRE.
+ */
+static bool
+cputurn(void)
+{
+#define POSSIBLE(x, y)	(ONBOARD(x, y) && !hits[COMPUTER][x][y])
+#define RANDOM_FIRE	0
+#define RANDOM_HIT	1
+#define HUNT_DIRECT	2
+#define FIRST_PASS	3
+#define REVERSE_JUMP	4
+#define SECOND_PASS	5
+    static int next = RANDOM_FIRE;
+    static bool used[5];
+    static ship_t ts;
+    int navail, x, y, d, n;
+    int hit = S_MISS;
+
+    switch (next) {
+    case RANDOM_FIRE:		/* last shot was random and missed */
+      refire:
+	randomfire(&x, &y);
+	if (!(hit = cpufire(x, y)))
+	    next = RANDOM_FIRE;
+	else {
+	    ts.x = x;
+	    ts.y = y;
+	    ts.hits = 1;
+	    next = (hit == S_SUNK) ? RANDOM_FIRE : RANDOM_HIT;
+	}
+	break;
+
+    case RANDOM_HIT:		/* last shot was random and hit */
+	used[dir_E / 2] =
+	    used[dir_S / 2] =
+	    used[dir_W / 2] =
+	    used[dir_N / 2] = FALSE;
+	/* FALLTHROUGH */
+
+    case HUNT_DIRECT:		/* last shot hit, we're looking for ship's long axis */
+	for (d = navail = 0; d < (dir_MAX) / 2; d++) {
+	    x = ts.x + xincr[d * 2];
+	    y = ts.y + yincr[d * 2];
+	    if (!used[d] && POSSIBLE(x, y))
+		navail++;
+	    else
+		used[d] = TRUE;
+	}
+	if (navail == 0)	/* no valid places for shots adjacent... */
+	    goto refire;	/* ...so we must random-fire */
+	else {
+	    n = rnd(navail) + 1;
+	    for (d = 0; d < (dir_MAX) / 2 && used[d]; d++) ;
+	    /* used[d] is first that == 0 */
+	    for (; n > 1; n--)
+		while (d < (dir_MAX) / 2 && used[++d]) ;
+	    /* used[d] is next that == 0 */
+
+	    assert(d < (dir_MAX) / 2);
+	    assert(used[d] == FALSE);
+
+	    used[d] = TRUE;
+	    x = ts.x + xincr[d * 2];
+	    y = ts.y + yincr[d * 2];
+
+	    assert(POSSIBLE(x, y));
+
+	    if (!(hit = cpufire(x, y)))
+		next = HUNT_DIRECT;
+	    else {
+		ts.x = x;
+		ts.y = y;
+		ts.dir = d * 2;
+		ts.hits++;
+		next = (hit == S_SUNK) ? RANDOM_FIRE : FIRST_PASS;
+	    }
+	}
+	break;
+
+    case FIRST_PASS:		/* we have a start and a direction now */
+	x = ts.x + xincr[ts.dir];
+	y = ts.y + yincr[ts.dir];
+	if (POSSIBLE(x, y) && (hit = cpufire(x, y))) {
+	    ts.x = x;
+	    ts.y = y;
+	    ts.hits++;
+	    next = (hit == S_SUNK) ? RANDOM_FIRE : FIRST_PASS;
+	} else
+	    next = REVERSE_JUMP;
+	break;
+
+    case REVERSE_JUMP:		/* nail down the ship's other end */
+	d = (ts.dir + (dir_MAX) / 2) % dir_MAX;
+	x = ts.x + ts.hits * xincr[d];
+	y = ts.y + ts.hits * yincr[d];
+	if (POSSIBLE(x, y) && (hit = cpufire(x, y))) {
+	    ts.x = x;
+	    ts.y = y;
+	    ts.dir = d;
+	    ts.hits++;
+	    next = (hit == S_SUNK) ? RANDOM_FIRE : SECOND_PASS;
+	} else
+	    next = RANDOM_FIRE;
+	break;
+
+    case SECOND_PASS:		/* continue shooting after reversing */
+	x = ts.x + xincr[ts.dir];
+	y = ts.y + yincr[ts.dir];
+	if (POSSIBLE(x, y) && (hit = cpufire(x, y))) {
+	    ts.x = x;
+	    ts.y = y;
+	    ts.hits++;
+	    next = (hit == S_SUNK) ? RANDOM_FIRE : SECOND_PASS;
+	    break;
+	} else
+	    next = RANDOM_FIRE;
+	break;
+    }
+
+    /* pause between shots in salvo */
+    if (salvo) {
+	(void) refresh();
+	(void) sleep(1);
+    }
+#ifdef DEBUG
+    MvPrintw(PROMPTLINE + 2, 0,
+	     "New state %d, x=%d, y=%d, d=%d",
+	     next, x, y, d);
+#endif /* DEBUG */
+    return ((hit) ? TRUE : FALSE);
+}
+
+static int
+playagain(void)
+{
+    int j;
+    ship_t *ss;
+
+    for (ss = cpuship; ss < cpuship + SHIPTYPES; ss++)
+	for (j = 0; j < ss->length; j++) {
+	    cgoto(ss->y + j * yincr[ss->dir], ss->x + j * xincr[ss->dir]);
+	    AddCh(ss->symbol);
+	}
+
+    if (awinna())
+	++cpuwon;
+    else
+	++plywon;
+    j = 18 + (int) strlen(your_name);
+    if (plywon >= 10)
+	++j;
+    if (cpuwon >= 10)
+	++j;
+    MvPrintw(1, (COLWIDTH - j) / 2,
+	     "%s: %d     Computer: %d", your_name, plywon, cpuwon);
+
+    prompt(2, (awinna())? "Want to be humiliated again, %s [yn]? "
+	   : "Going to give me a chance for revenge, %s [yn]? ", your_name);
+    return (sgetc("YN") == 'Y');
+}
+
+static int
+scount(int who)
+{
+    register int i, shots;
+    register ship_t *sp;
+
+    if (who)
+	sp = cpuship;		/* count cpu shots */
+    else
+	sp = plyship;		/* count player shots */
+
+    for (i = 0, shots = 0; i < SHIPTYPES; i++, sp++) {
+	if (sp->hits >= sp->length)
+	    continue;		/* dead ship */
+	else
+	    shots++;
+    }
+    return (shots);
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: bs [options]"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+	," -b       play a blitz game"
+	," -c       ships may be adjacent"
+	," -s       play a salvo game"
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "bcs")) != -1) {
+	switch (ch) {
+	case 'b':
+	    blitz = 1;
+	    if (salvo == 1) {
+		(void) fprintf(stderr,
+			       "Bad Arg: -b and -s are mutually exclusive\n");
+		ExitProgram(EXIT_FAILURE);
+	    }
+	    break;
+	case 's':
+	    salvo = 1;
+	    if (blitz == 1) {
+		(void) fprintf(stderr,
+			       "Bad Arg: -s and -b are mutually exclusive\n");
+		ExitProgram(EXIT_FAILURE);
+	    }
+	    break;
+	case 'c':
+	    closepack = 1;
+	    break;
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind < argc)
+	usage(FALSE);
+
+    setlocale(LC_ALL, "");
+
+    intro();
+    do {
+	initgame();
+	while (awinna() == -1) {
+	    if (!blitz) {
+		if (!salvo) {
+		    if (turn)
+			(void) cputurn();
+		    else
+			(void) plyturn();
+		} else {
+		    register int i;
+
+		    i = scount(turn);
+		    while (i--) {
+			if (turn) {
+			    if (cputurn() && awinna() != -1)
+				i = 0;
+			} else {
+			    if (plyturn() && awinna() != -1)
+				i = 0;
+			}
+		    }
+		}
+	    } else
+		while ((turn ? cputurn() : plyturn()) && awinna() == -1)
+		    continue;
+	    turn = OTHER;
+	}
+    } while
+	(playagain());
+    uninitgame(0);
+    /*NOTREACHED */
+}
+
+/* bs.c ends here */
diff --git a/test/bulgarian-utf8-tabs.txt b/test/bulgarian-utf8-tabs.txt
new file mode 100644
index 0000000..65e42bb
--- /dev/null
+++ b/test/bulgarian-utf8-tabs.txt
@@ -0,0 +1,6 @@
+Показване на помощна информация	-- 1
+Създаване на дялове		-- 2
+Избор на дял и форматиране	-- 3
+Записване в избрания дял	-- 4
+Инсталиране на LILO		-- 5
+Изход от програмата		-- 6
diff --git a/test/bulgarian-utf8.txt b/test/bulgarian-utf8.txt
new file mode 100644
index 0000000..046c059
--- /dev/null
+++ b/test/bulgarian-utf8.txt
@@ -0,0 +1,6 @@
+Показване на помощна информация -- 1
+Създаване на дялове             -- 2
+Избор на дял и форматиране      -- 3
+Записване в избрания дял        -- 4
+Инсталиране на LILO             -- 5
+Изход от програмата             -- 6
diff --git a/test/cardfile.c b/test/cardfile.c
new file mode 100644
index 0000000..092483b
--- /dev/null
+++ b/test/cardfile.c
@@ -0,0 +1,635 @@
+/****************************************************************************
+ * Copyright 2019-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1999-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/*
+ * Author: Thomas E. Dickey
+ *
+ * $Id: cardfile.c,v 1.51 2022/12/04 00:40:11 tom Exp $
+ *
+ * File format: text beginning in column 1 is a title; other text is content.
+ */
+
+#include <test.priv.h>
+
+#if USE_LIBFORM && USE_LIBPANEL
+
+#include <form.h>
+#include <panel.h>
+
+#define VISIBLE_CARDS 10
+#define OFFSET_CARD 2
+#define pair_1 1
+#define pair_2 2
+
+#define isVisible(cardp) ((cardp)->panel != 0)
+
+enum {
+    MY_CTRL_x = MAX_FORM_COMMAND
+    ,MY_CTRL_N
+    ,MY_CTRL_P
+    ,MY_CTRL_Q
+    ,MY_CTRL_W
+};
+
+typedef struct _card {
+    struct _card *link;
+    PANEL *panel;
+    FORM *form;
+    char *title;
+    char *content;
+} CARD;
+
+static CARD *all_cards;
+static bool try_color = FALSE;
+static char default_name[] = "cardfile.dat";
+
+static void
+failed(const char *s)
+{
+    perror(s);
+    endwin();
+    ExitProgram(EXIT_FAILURE);
+}
+
+static const char *
+skip(const char *buffer)
+{
+    while (isspace(UChar(*buffer)))
+	buffer++;
+    return buffer;
+}
+
+static void
+trim(char *buffer)
+{
+    size_t n = strlen(buffer);
+    while (n-- && isspace(UChar(buffer[n])))
+	buffer[n] = 0;
+}
+
+/*******************************************************************************/
+
+static CARD *
+add_title(const char *title)
+{
+    CARD *card, *p, *q;
+
+    for (p = all_cards, q = 0; p != 0; q = p, p = p->link) {
+	int cmp = strcmp(p->title, title);
+	if (cmp == 0)
+	    return p;
+	if (cmp > 0)
+	    break;
+    }
+
+    card = typeCalloc(CARD, (size_t) 1);
+    card->title = strdup(title);
+    card->content = strdup("");
+
+    if (q == 0) {
+	card->link = all_cards;
+	all_cards = card;
+    } else {
+	card->link = q->link;
+	q->link = card;
+    }
+
+    return card;
+}
+
+static void
+add_content(CARD * card, const char *content)
+{
+    size_t total;
+
+    content = skip(content);
+    if ((total = strlen(content)) != 0) {
+	size_t offset;
+
+	if (card->content != 0 && (offset = strlen(card->content)) != 0) {
+	    total += 1 + offset;
+	    card->content = typeRealloc(char, total + 1, card->content);
+	    if (card->content) {
+		_nc_STRCPY(card->content + offset, " ", total + 1 - offset);
+		offset++;
+	    }
+	} else {
+	    offset = 0;
+	    if (card->content != 0)
+		free(card->content);
+	    card->content = typeMalloc(char, total + 1);
+	}
+	if (card->content)
+	    _nc_STRCPY(card->content + offset, content, total + 1 - offset);
+	else
+	    failed("add_content");
+    }
+}
+
+static CARD *
+new_card(void)
+{
+    CARD *card = add_title("");
+    add_content(card, "");
+    return card;
+}
+
+static CARD *
+find_card(char *title)
+{
+    CARD *card;
+
+    for (card = all_cards; card != 0; card = card->link)
+	if (!strcmp(card->title, title))
+	    break;
+
+    return card;
+}
+
+static void
+read_data(char *fname)
+{
+    FILE *fp;
+
+    if ((fp = fopen(fname, "r")) != 0) {
+	CARD *card = 0;
+	char buffer[BUFSIZ];
+
+	while (fgets(buffer, sizeof(buffer), fp)) {
+	    trim(buffer);
+	    if (isspace(UChar(*buffer))) {
+		if (card == 0)
+		    card = add_title("");
+		add_content(card, buffer);
+	    } else if ((card = find_card(buffer)) == 0) {
+		card = add_title(buffer);
+	    }
+	}
+	fclose(fp);
+    }
+}
+
+/*******************************************************************************/
+
+static void
+write_data(const char *fname)
+{
+    FILE *fp;
+
+    if (!strcmp(fname, default_name))
+	fname = "cardfile.out";
+
+    if ((fp = fopen(fname, "w")) != 0) {
+	CARD *p = 0;
+
+	for (p = all_cards; p != 0; p = p->link) {
+	    FIELD **f = form_fields(p->form);
+	    int n;
+
+	    for (n = 0; f[n] != 0; n++) {
+		char *s = field_buffer(f[n], 0);
+		if (s != 0
+		    && (s = strdup(s)) != 0) {
+		    trim(s);
+		    fprintf(fp, "%s%s\n", n ? "\t" : "", s);
+		    free(s);
+		}
+	    }
+	}
+	fclose(fp);
+    }
+}
+
+/*******************************************************************************/
+
+/*
+ * Count the cards
+ */
+static int
+count_cards(void)
+{
+    CARD *p;
+    int count = 0;
+
+    for (p = all_cards; p != 0; p = p->link)
+	count++;
+
+    return count;
+}
+
+/*
+ * Shuffle the panels to keep them in a natural hierarchy.
+ */
+static void
+order_cards(CARD * first, int depth)
+{
+    if (first) {
+	if (depth && first->link)
+	    order_cards(first->link, depth - 1);
+	if (isVisible(first))
+	    top_panel(first->panel);
+    }
+}
+
+/*
+ * Return the next card in the list
+ */
+static CARD *
+next_card(CARD * now)
+{
+    if (now->link != 0) {
+	CARD *tst = now->link;
+	if (isVisible(tst))
+	    now = tst;
+	else
+	    (void) next_card(tst);
+    }
+    return now;
+}
+
+/*
+ * Return the previous card in the list
+ */
+static CARD *
+prev_card(CARD * now)
+{
+    CARD *p;
+    for (p = all_cards; p != 0; p = p->link) {
+	if (p->link == now) {
+	    if (!isVisible(p))
+		p = prev_card(p);
+	    return p;
+	}
+    }
+    return now;
+}
+
+/*
+ * Returns the first card in the list that we will display.
+ */
+static CARD *
+first_card(CARD * now)
+{
+    if (now != NULL && !isVisible(now))
+	now = next_card(now);
+    return now;
+}
+
+/*******************************************************************************/
+
+static int
+form_virtualize(WINDOW *w)
+{
+    int c = wgetch(w);
+
+    switch (c) {
+    case CTRL('W'):
+	return (MY_CTRL_W);
+    case CTRL('N'):
+	return (MY_CTRL_N);
+    case CTRL('P'):
+	return (MY_CTRL_P);
+    case QUIT:
+    case ESCAPE:
+	return (MY_CTRL_Q);
+
+    case KEY_BACKSPACE:
+	return (REQ_DEL_PREV);
+    case KEY_DC:
+	return (REQ_DEL_CHAR);
+    case KEY_LEFT:
+	return (REQ_LEFT_CHAR);
+    case KEY_RIGHT:
+	return (REQ_RIGHT_CHAR);
+
+    case KEY_DOWN:
+    case KEY_NEXT:
+	return (REQ_NEXT_FIELD);
+    case KEY_UP:
+    case KEY_PREVIOUS:
+	return (REQ_PREV_FIELD);
+
+    default:
+	return (c);
+    }
+}
+
+static FIELD **
+make_fields(CARD * p, int form_high, int form_wide)
+{
+    FIELD **f = typeCalloc(FIELD *, (size_t) 3);
+
+    f[0] = new_field(1, form_wide, 0, 0, 0, 0);
+    set_field_back(f[0], A_REVERSE);
+    set_field_buffer(f[0], 0, p->title);
+    field_opts_off(f[0], O_BLANK);
+
+    f[1] = new_field(form_high - 1, form_wide, 1, 0, 0, 0);
+    set_field_buffer(f[1], 0, p->content);
+    set_field_just(f[1], JUSTIFY_LEFT);
+    field_opts_off(f[1], O_BLANK);
+
+    f[2] = 0;
+    return f;
+}
+
+static void
+show_legend(void)
+{
+    erase();
+    move(LINES - 3, 0);
+    addstr("^Q/ESC -- exit form            ^W   -- writes data to file\n");
+    addstr("^N   -- go to next card        ^P   -- go to previous card\n");
+    addstr("Arrow keys move left/right within a field, up/down between fields");
+}
+
+#if (defined(KEY_RESIZE) && HAVE_WRESIZE) || NO_LEAKS
+static void
+free_form_fields(FIELD **f)
+{
+    int n;
+
+    for (n = 0; f[n] != 0; ++n) {
+	free_field(f[n]);
+    }
+    free(f);
+}
+#endif
+
+/*******************************************************************************/
+
+static void
+cardfile(char *fname)
+{
+    WINDOW *win;
+    CARD *p;
+    CARD *top_card;
+    int visible_cards;
+    int panel_wide;
+    int panel_high;
+    int form_wide;
+    int form_high;
+    int y;
+    int x;
+    int finished = FALSE;
+
+    show_legend();
+
+    /* decide how many cards we can display */
+    visible_cards = count_cards();
+    while (
+	      (panel_wide = COLS - (visible_cards * OFFSET_CARD)) < 10 ||
+	      (panel_high = LINES - (visible_cards * OFFSET_CARD) - 5) < 5) {
+	--visible_cards;
+    }
+    form_wide = panel_wide - 2;
+    form_high = panel_high - 2;
+    y = (visible_cards - 1) * OFFSET_CARD;
+    x = 0;
+
+    /* make a panel for each CARD */
+    for (p = all_cards; p != 0; p = p->link) {
+
+	if ((win = newwin(panel_high, panel_wide, y, x)) == 0)
+	    break;
+
+	wbkgd(win, (chtype) COLOR_PAIR(pair_2));
+	keypad(win, TRUE);
+	p->panel = new_panel(win);
+	box(win, 0, 0);
+
+	p->form = new_form(make_fields(p, form_high, form_wide));
+	set_form_win(p->form, win);
+	set_form_sub(p->form, derwin(win, form_high, form_wide, 1, 1));
+	post_form(p->form);
+
+	y -= OFFSET_CARD;
+	x += OFFSET_CARD;
+    }
+
+    top_card = first_card(all_cards);
+    order_cards(top_card, visible_cards);
+
+    while (!finished) {
+	int ch = ERR;
+
+	update_panels();
+	doupdate();
+
+	ch = form_virtualize(panel_window(top_card->panel));
+	switch (form_driver(top_card->form, ch)) {
+	case E_OK:
+	    break;
+	case E_UNKNOWN_COMMAND:
+	    switch (ch) {
+	    case MY_CTRL_Q:
+		finished = TRUE;
+		break;
+	    case MY_CTRL_P:
+		top_card = prev_card(top_card);
+		order_cards(top_card, visible_cards);
+		break;
+	    case MY_CTRL_N:
+		top_card = next_card(top_card);
+		order_cards(top_card, visible_cards);
+		break;
+	    case MY_CTRL_W:
+		form_driver(top_card->form, REQ_VALIDATION);
+		write_data(fname);
+		break;
+#if defined(KEY_RESIZE) && HAVE_WRESIZE
+	    case KEY_RESIZE:
+		/* resizeterm already did "something" reasonable, but it cannot
+		 * know much about layout.  So let's make it nicer.
+		 */
+		panel_wide = COLS - (visible_cards * OFFSET_CARD);
+		panel_high = LINES - (visible_cards * OFFSET_CARD) - 5;
+
+		form_wide = panel_wide - 2;
+		form_high = panel_high - 2;
+
+		y = (visible_cards - 1) * OFFSET_CARD;
+		x = 0;
+
+		show_legend();
+		for (p = all_cards; p != 0; p = p->link) {
+		    FIELD **oldf = form_fields(p->form);
+		    WINDOW *olds = form_sub(p->form);
+
+		    if (!isVisible(p))
+			continue;
+		    win = form_win(p->form);
+
+		    /* move and resize the card as needed
+		     * FIXME: if the windows are shrunk too much, this won't do
+		     */
+		    mvwin(win, y, x);
+		    wresize(win, panel_high, panel_wide);
+
+		    /* reconstruct each form.  Forms are not resizable, and
+		     * there appears to be no good way to reload the text in
+		     * a resized window.
+		     */
+		    werase(win);
+
+		    unpost_form(p->form);
+		    free_form(p->form);
+
+		    p->form = new_form(make_fields(p, form_high, form_wide));
+		    set_form_win(p->form, win);
+		    set_form_sub(p->form, derwin(win, form_high, form_wide,
+						 1, 1));
+		    post_form(p->form);
+
+		    free_form_fields(oldf);
+		    delwin(olds);
+
+		    box(win, 0, 0);
+
+		    y -= OFFSET_CARD;
+		    x += OFFSET_CARD;
+		}
+		break;
+#endif
+	    default:
+		beep();
+		break;
+	    }
+	    break;
+	default:
+	    flash();
+	    break;
+	}
+    }
+#if NO_LEAKS
+    while (all_cards != 0) {
+	p = all_cards;
+	all_cards = all_cards->link;
+
+	if (isVisible(p)) {
+	    FIELD **f = form_fields(p->form);
+
+	    unpost_form(p->form);	/* ...so we can free it */
+	    free_form(p->form);	/* this also disconnects the fields */
+
+	    free_form_fields(f);
+
+	    del_panel(p->panel);
+	}
+	free(p->title);
+	free(p->content);
+	free(p);
+    }
+#endif
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: cardfile [options] file"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+	," -c       use color if terminal supports it"
+    };
+    size_t n;
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+
+/*******************************************************************************/
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+
+    setlocale(LC_ALL, "");
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "c")) != -1) {
+	switch (ch) {
+	case 'c':
+	    try_color = TRUE;
+	    break;
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+
+    initscr();
+    cbreak();
+    noecho();
+
+    if (try_color) {
+	if (has_colors()) {
+	    start_color();
+	    init_pair(pair_1, COLOR_WHITE, COLOR_BLUE);
+	    init_pair(pair_2, COLOR_WHITE, COLOR_CYAN);
+	    bkgd((chtype) COLOR_PAIR(pair_1));
+	} else {
+	    try_color = FALSE;
+	}
+    }
+
+    if (optind + 1 == argc) {
+	int n;
+	for (n = 1; n < argc; n++)
+	    read_data(argv[n]);
+	if (count_cards() == 0)
+	    new_card();
+	cardfile(argv[1]);
+    } else {
+	read_data(default_name);
+	if (count_cards() == 0)
+	    new_card();
+	cardfile(default_name);
+    }
+
+    endwin();
+
+    ExitProgram(EXIT_SUCCESS);
+}
+#else
+int
+main(void)
+{
+    printf("This program requires the curses form and panel libraries\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif
diff --git a/test/cardfile.dat b/test/cardfile.dat
new file mode 100644
index 0000000..deb4b76
--- /dev/null
+++ b/test/cardfile.dat
@@ -0,0 +1,13 @@
+title 1
+	Some text for title1
+	and some more text
+title 2
+	The quicker brown fox ran all over the lazy dog.
+put a card before the first two
+	This is an example of a simple cardfile.
+show a fourth card
+	The fourth card
+	has a large amount of data,
+	more than the other cards.
+	At least, that is what I thought it should do, since I want to see how well
+	the forms package handles justification.
diff --git a/test/chgat.c b/test/chgat.c
new file mode 100644
index 0000000..2c2b539
--- /dev/null
+++ b/test/chgat.c
@@ -0,0 +1,406 @@
+/****************************************************************************
+ * Copyright 2019-2020,2022 Thomas E. Dickey                                *
+ * Copyright 2006-2012,2017 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: chgat.c,v 1.20 2022/12/10 23:31:31 tom Exp $
+ *
+ * test-driver for chgat/wchgat/mvchgat/mvwchgat
+ */
+
+#include <test.priv.h>
+#include <popup_msg.h>
+
+#if HAVE_CHGAT
+
+#define SHOW(n) ((n) == ERR ? "ERR" : "OK")
+#define COLOR_DEFAULT (-1)
+
+#if defined(NCURSES_VERSION_PATCH) && NCURSES_VERSION_PATCH < 20060715
+#define touch_if_needed(win, row) touchline(win, row, 1)
+#else
+#define touch_if_needed(win, row)	/* nothing */
+#endif
+
+typedef struct {
+    size_t c;
+    size_t v;
+    short pair;
+    attr_t attr;
+    int count;
+    int ch;
+    const char *c_msg;
+    const char *v_msg;
+    int y_val;
+    int x_val;
+    int y_beg, x_beg;
+    int y_max, x_max;
+} STATUS;
+
+static const char *
+color_params(size_t state, short *pair)
+{
+    /* *INDENT-OFF* */
+    static struct {
+	short pair;
+	short fg, bg;
+	const char *msg;
+    } table[] = {
+	{ 0, COLOR_DEFAULT, COLOR_DEFAULT, "default" },
+	{ 1, COLOR_RED,     COLOR_BLACK,   "red/black" },
+	{ 2, COLOR_WHITE,   COLOR_BLUE,    "white/blue" },
+    };
+    /* *INDENT-ON* */
+
+    const char *result = 0;
+
+    if (has_colors()) {
+	static bool first = TRUE;
+
+	if (first) {
+	    size_t n;
+
+	    start_color();
+	    for (n = 0; n < SIZEOF(table); ++n) {
+		init_pair(table[n].pair, table[n].fg, table[n].bg);
+	    }
+	}
+	if (state < SIZEOF(table)) {
+	    *pair = table[state].pair;
+	    result = table[state].msg;
+	}
+    }
+    return result;
+}
+
+static const char *
+video_params(size_t state, attr_t *attr)
+{
+    /* *INDENT-OFF* */
+    static struct {
+	attr_t attr;
+	const char *msg;
+    } table[] = {
+	{ WA_NORMAL,	"normal" },
+	{ WA_BOLD,	"bold" },
+	{ WA_REVERSE,	"reverse" },
+	{ WA_UNDERLINE,	"underline" },
+	{ WA_BLINK, 	"blink" },
+    };
+    /* *INDENT-ON* */
+
+    const char *result = 0;
+
+    if (state < SIZEOF(table)) {
+	*attr = table[state].attr;
+	result = table[state].msg;
+    }
+    return result;
+}
+
+/* fill the window with a test-pattern */
+static void
+fill_window(WINDOW *win)
+{
+    int y, x;
+    int y0 = -1, x0 = -1;
+
+    getyx(win, y, x);
+    wmove(win, 0, 0);
+    while (waddstr(win, "0123456789 abcdefghijklmnopqrstuvwxyz ") != ERR) {
+	int y1, x1;
+	getyx(win, y1, x1);
+	if (y1 == y0 && x1 == x0)
+	    break;
+	x0 = x1;
+	y0 = y1;
+    }
+    wmove(win, y, x);
+}
+
+static void
+show_status(WINDOW *win, STATUS * sp)
+{
+    int y, x;
+
+    getyx(win, y, x);
+    wmove(win, 0, 0);
+    wprintw(win, "Count %d", sp->count);
+    if (sp->v_msg != 0)
+	wprintw(win, " Video %s", sp->v_msg);
+    if (sp->c_msg != 0)
+	wprintw(win, " Color %s", sp->c_msg);
+    wclrtoeol(win);
+    wmove(win, y, x);
+}
+
+static void
+do_subwindow(WINDOW *win, STATUS * sp, void func(WINDOW *))
+{
+    WINDOW *win1 = newwin(sp->y_max - 2, sp->x_max - 2,
+			  sp->y_beg + 1, sp->x_beg + 1);
+
+    if (win1 != 0 && sp->y_max > 4 && sp->x_max > 4) {
+	WINDOW *win2 = derwin(win1, sp->y_max - 4, sp->x_max - 4, 1, 1);
+
+	if (win2 != 0) {
+	    box(win1, 0, 0);
+	    wrefresh(win1);
+	    func(win2);
+
+	    delwin(win2);
+	} else {
+	    beep();
+	}
+	delwin(win1);
+	touchwin(win);
+    } else {
+	if (win1 != 0)
+	    delwin(win1);
+	beep();
+    }
+}
+
+static void
+init_status(WINDOW *win, STATUS * sp)
+{
+    memset(sp, 0, sizeof(*sp));
+    sp->c = 99;
+    sp->v = 99;
+    sp->ch = ' ';
+
+    keypad(win, TRUE);
+    fill_window(win);
+
+    getbegyx(win, sp->y_beg, sp->x_beg);
+    getmaxyx(win, sp->y_max, sp->x_max);
+}
+
+static void
+show_help(WINDOW *win)
+{
+    static const char *msgs[] =
+    {
+	"Basic commands:"
+	,"Use h/j/k/l or arrow keys to move the cursor."
+	,"Set the count parameter for chgat by entering digits 0-9."
+	,""
+	,"Other commands:"
+	,"space toggles through the set of video attributes and colors."
+	,"t     touches (forces repaint) of the current line."
+	,".     calls *chgat at the current position with the given count."
+	,",     calls *chgat at the window beginning with the given count."
+	,"=     resets count to zero."
+	,"-     negates count."
+	,"?     shows this help-window"
+	,0
+    };
+
+    popup_msg(win, msgs);
+}
+
+static void
+update_status(WINDOW *win, STATUS * sp)
+{
+    switch (sp->ch) {
+    case ' ':			/* next test-iteration */
+	if (has_colors()) {
+	    if ((sp->c_msg = color_params(++(sp->c), &(sp->pair))) == 0) {
+		sp->c_msg = color_params(sp->c = 0, &(sp->pair));
+		if ((sp->v_msg = video_params(++(sp->v), &(sp->attr))) == 0) {
+		    sp->v_msg = video_params(sp->v = 0, &(sp->attr));
+		}
+	    }
+	} else {
+	    if ((sp->v_msg = video_params(++(sp->v), &(sp->attr))) == 0) {
+		sp->v_msg = video_params(sp->v = 0, &(sp->attr));
+	    }
+	}
+	sp->count = 0;
+	show_status(win, sp);
+	break;
+    case KEY_LEFT:
+    case 'h':
+	if (sp->x_val > 0)
+	    wmove(win, sp->y_val, --(sp->x_val));
+	break;
+    case KEY_DOWN:
+    case 'j':
+	if (sp->y_val < sp->y_max)
+	    wmove(win, ++(sp->y_val), sp->x_val);
+	break;
+    case KEY_UP:
+    case 'k':
+	if (sp->y_val > 0)
+	    wmove(win, --(sp->y_val), sp->x_val);
+	break;
+    case KEY_RIGHT:
+    case 'l':
+	if (sp->x_val < sp->x_max)
+	    wmove(win, sp->y_val, ++(sp->x_val));
+	break;
+    case 't':
+	touchline(win, sp->y_val, 1);
+	break;
+    case '=':
+	sp->count = 0;
+	show_status(win, sp);
+	break;
+    case '-':
+	sp->count = -(sp->count);
+	show_status(win, sp);
+	break;
+    case HELP_KEY_1:
+	show_help(win);
+	break;
+    default:
+	if (isdigit(sp->ch)) {
+	    sp->count = (sp->count * 10) + (sp->ch - '0');
+	    show_status(win, sp);
+	} else {
+	    beep();
+	}
+	break;
+    }
+}
+
+static void
+test_wchgat(WINDOW *win)
+{
+    STATUS st;
+
+    init_status(win, &st);
+
+    do {
+	switch (st.ch) {
+	case '.':		/* change from current position */
+	    wchgat(win, st.count, st.attr, st.pair, (void *) 0);
+	    touch_if_needed(win, st.y_val);
+	    break;
+	case ',':		/* change from beginning of window */
+	    mvwchgat(win, 0, 0, st.count, st.attr, st.pair, (void *) 0);
+	    touch_if_needed(win, 0);
+	    wmove(win, st.y_val, st.x_val);
+	    break;
+	case 'w':
+	    do_subwindow(win, &st, test_wchgat);
+	    break;
+	case 'q':
+	    return;
+	default:
+	    update_status(win, &st);
+	    break;
+	}
+    } while ((st.ch = wgetch(win)) != ERR);
+}
+
+static void
+test_chgat(void)
+{
+    STATUS st;
+
+    init_status(stdscr, &st);
+
+    do {
+	switch (st.ch) {
+	case '.':		/* change from current position */
+	    chgat(st.count, st.attr, st.pair, (void *) 0);
+	    touch_if_needed(stdscr, st.y_val);
+	    break;
+	case ',':		/* change from beginning of window */
+	    mvchgat(0, 0, st.count, st.attr, st.pair, (void *) 0);
+	    touch_if_needed(stdscr, 0);
+	    move(st.y_val, st.x_val);
+	    break;
+	case 'w':
+	    do_subwindow(stdscr, &st, test_wchgat);
+	    break;
+	case 'q':
+	    return;
+	default:
+	    update_status(stdscr, &st);
+	    break;
+	}
+    } while ((st.ch = getch()) != ERR);
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: chgat [options]"
+	,""
+	,USAGE_COMMON
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) {
+	switch (ch) {
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind < argc)
+	usage(FALSE);
+
+    initscr();
+    cbreak();
+    noecho();
+
+    test_chgat();
+    endwin();
+
+    ExitProgram(EXIT_SUCCESS);
+}
+
+#else
+int
+main(void)
+{
+    printf("This program requires the curses chgat function\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif
diff --git a/test/clip_printw.c b/test/clip_printw.c
new file mode 100644
index 0000000..49d67c5
--- /dev/null
+++ b/test/clip_printw.c
@@ -0,0 +1,417 @@
+/****************************************************************************
+ * Copyright 2019-2020,2022 Thomas E. Dickey                                *
+ * Copyright 2008-2016,2017 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: clip_printw.c,v 1.21 2022/12/10 23:31:31 tom Exp $
+ *
+ * demonstrate how to use printw without wrapping.
+ */
+
+#include <test.priv.h>
+#include <popup_msg.h>
+
+#ifdef HAVE_VW_PRINTW
+
+#define SHOW(n) ((n) == ERR ? "ERR" : "OK")
+#define COLOR_DEFAULT (-1)
+
+typedef struct {
+    unsigned c;
+    unsigned v;
+    int status;
+    int pair;
+    attr_t attr;
+    int count;
+    int ch;
+    const char *c_msg;
+    const char *v_msg;
+    int y_val;
+    int x_val;
+    int y_beg, x_beg;
+    int y_max, x_max;
+} STATUS;
+
+static int
+clip_wprintw(WINDOW *win, NCURSES_CONST char *fmt, ...)
+{
+    int y0, x0, y1, x1, width;
+    WINDOW *sub;
+    va_list ap;
+    int rc;
+
+    /*
+     * Allocate a single-line derived window extending from the current
+     * cursor position to the end of the current line in the given window.
+     * Disable scrolling in the derived window.
+     */
+    getyx(win, y0, x0);
+    width = getmaxx(win) - x0;
+    sub = derwin(win, 1, width, y0, x0);
+    scrollok(sub, FALSE);
+
+    /*
+     * Print the text.
+     */
+    va_start(ap, fmt);
+    rc = vw_printw(sub, fmt, ap);
+    va_end(ap);
+
+    getyx(sub, y1, x1);
+    delwin(sub);
+
+    wmove(win, y1 + y0, x1 + x0);
+
+    return rc;
+}
+
+static const char *
+color_params(unsigned state, int *pair)
+{
+    /* *INDENT-OFF* */
+    static struct {
+	int pair;
+	int fg, bg;
+	const char *msg;
+    } table[] = {
+	{ 0, COLOR_DEFAULT, COLOR_DEFAULT, "default" },
+	{ 1, COLOR_RED,     COLOR_BLACK,   "red/black" },
+	{ 2, COLOR_WHITE,   COLOR_BLUE,    "white/blue" },
+    };
+    /* *INDENT-ON* */
+
+    const char *result = 0;
+
+    if (has_colors()) {
+	static bool first = TRUE;
+
+	if (first) {
+	    unsigned n;
+
+	    start_color();
+	    for (n = 0; n < SIZEOF(table); ++n) {
+		init_pair((short) table[n].pair,
+			  (short) table[n].fg,
+			  (short) table[n].bg);
+	    }
+	}
+	if (state < SIZEOF(table)) {
+	    *pair = table[state].pair;
+	    result = table[state].msg;
+	}
+    }
+    return result;
+}
+
+static const char *
+video_params(unsigned state, attr_t *attr)
+{
+    /* *INDENT-OFF* */
+    static struct {
+	attr_t attr;
+	const char *msg;
+    } table[] = {
+	{ WA_NORMAL,	"normal" },
+	{ WA_BOLD,	"bold" },
+	{ WA_REVERSE,	"reverse" },
+	{ WA_UNDERLINE,	"underline" },
+	{ WA_BLINK, 	"blink" },
+    };
+    /* *INDENT-ON* */
+
+    const char *result = 0;
+
+    if (state < SIZEOF(table)) {
+	*attr = table[state].attr;
+	result = table[state].msg;
+    }
+    return result;
+}
+
+/* fill the window with a test-pattern */
+static void
+fill_window(WINDOW *win)
+{
+    int y, x;
+    int y0 = -1, x0 = -1;
+
+    getyx(win, y, x);
+    wmove(win, 0, 0);
+    while (waddstr(win, "0123456789 abcdefghijklmnopqrstuvwxyz ") != ERR) {
+	int y1, x1;
+	getyx(win, y1, x1);
+	if (y1 == y0 && x1 == x0)
+	    break;
+	x0 = x1;
+	y0 = y1;
+    }
+    wmove(win, y, x);
+}
+
+static void
+show_status(WINDOW *win, STATUS * sp)
+{
+    int y, x;
+
+    getyx(win, y, x);
+    wmove(win, 0, 0);
+    wprintw(win, "Count %d", sp->count);
+    if (sp->v_msg != 0)
+	wprintw(win, " Video %s", sp->v_msg);
+    if (sp->c_msg != 0)
+	wprintw(win, " Color %s", sp->c_msg);
+    wprintw(win, " (%d)", sp->status);
+    wclrtoeol(win);
+    wmove(win, y, x);
+}
+
+static void
+do_subwindow(WINDOW *win, STATUS * sp, void func(WINDOW *))
+{
+    WINDOW *win1 = newwin(sp->y_max - 2, sp->x_max - 2,
+			  sp->y_beg + 1, sp->x_beg + 1);
+
+    if (win1 != 0 && sp->y_max > 4 && sp->x_max > 4) {
+	WINDOW *win2 = derwin(win1, sp->y_max - 4, sp->x_max - 4, 1, 1);
+
+	if (win2 != 0) {
+	    box(win1, 0, 0);
+	    wrefresh(win1);
+	    func(win2);
+
+	    delwin(win2);
+	} else {
+	    beep();
+	}
+	delwin(win1);
+	touchwin(win);
+    } else {
+	if (win1)
+	    delwin(win1);
+	beep();
+    }
+}
+
+static void
+init_status(WINDOW *win, STATUS * sp)
+{
+    memset(sp, 0, sizeof(*sp));
+    sp->c = 99;
+    sp->v = 99;
+    sp->ch = ' ';
+
+    keypad(win, TRUE);
+    fill_window(win);
+
+    getbegyx(win, sp->y_beg, sp->x_beg);
+    getmaxyx(win, sp->y_max, sp->x_max);
+}
+
+static void
+show_help(WINDOW *win)
+{
+    static const char *msgs[] =
+    {
+	"Basic commands:"
+	,"Use h/j/k/l or arrow keys to move the cursor."
+	,"Set the count parameter for clip_wprintw by entering digits 0-9."
+	,""
+	,"Other commands:"
+	,"space toggles through the set of video attributes and colors."
+	,"t     touches (forces repaint) of the current line."
+	,".     calls vw_printw at the current position with the given count."
+	,"=     resets count to zero."
+	,"?     shows this help-window"
+	,0
+    };
+
+    popup_msg(win, msgs);
+}
+
+static void
+update_status(WINDOW *win, STATUS * sp)
+{
+    switch (sp->ch) {
+    case ' ':			/* next test-iteration */
+	if (has_colors()) {
+	    if ((sp->c_msg = color_params(++(sp->c), &(sp->pair))) == 0) {
+		sp->c_msg = color_params(sp->c = 0, &(sp->pair));
+		if ((sp->v_msg = video_params(++(sp->v), &(sp->attr))) == 0) {
+		    sp->v_msg = video_params(sp->v = 0, &(sp->attr));
+		}
+	    }
+	} else {
+	    if ((sp->v_msg = video_params(++(sp->v), &(sp->attr))) == 0) {
+		sp->v_msg = video_params(sp->v = 0, &(sp->attr));
+	    }
+	}
+	sp->count = 0;
+	show_status(win, sp);
+	break;
+    case KEY_LEFT:
+    case 'h':
+	if (sp->x_val > 0)
+	    wmove(win, sp->y_val, --(sp->x_val));
+	break;
+    case KEY_DOWN:
+    case 'j':
+	if (sp->y_val < sp->y_max)
+	    wmove(win, ++(sp->y_val), sp->x_val);
+	break;
+    case KEY_UP:
+    case 'k':
+	if (sp->y_val > 0)
+	    wmove(win, --(sp->y_val), sp->x_val);
+	break;
+    case KEY_RIGHT:
+    case 'l':
+	if (sp->x_val < sp->x_max)
+	    wmove(win, sp->y_val, ++(sp->x_val));
+	break;
+    case 't':
+	touchline(win, sp->y_val, 1);
+	break;
+    case '=':
+	sp->count = 0;
+	show_status(win, sp);
+	break;
+    case HELP_KEY_1:
+	show_help(win);
+	break;
+    default:
+	if (isdigit(sp->ch)) {
+	    sp->count = (sp->count * 10) + (sp->ch - '0');
+	    show_status(win, sp);
+	} else {
+	    beep();
+	}
+	break;
+    }
+}
+
+static void
+test_clipping(WINDOW *win)
+{
+    STATUS st;
+    char fmt[80];
+    char *buffer;
+    unsigned j, need;
+
+    init_status(win, &st);
+
+    do {
+	switch (st.ch) {
+	case '.':		/* change from current position */
+	    (void) wattrset(win, AttrArg(COLOR_PAIR(st.pair), st.attr));
+	    if (st.count > 0) {
+		need = (unsigned) st.count + 1;
+		_nc_SPRINTF(fmt, _nc_SLIMIT(sizeof(fmt)) "%%c%%%ds%%c", st.count);
+	    } else {
+		int want = getmaxx(win);
+		if (want < 10)
+		    want = 10;
+		need = (unsigned) want - 1;
+		_nc_STRCPY(fmt, "%c%s%c", sizeof(fmt));
+	    }
+	    if ((buffer = typeMalloc(char, need + 1)) != 0) {
+		for (j = 0; j < need; ++j) {
+		    buffer[j] = (char) ('A' + (j % 26));
+		}
+		buffer[need - 1] = '\0';
+		st.status = clip_wprintw(win, fmt, '[', buffer, ']');
+		free(buffer);
+	    }
+	    break;
+	case 'w':
+	    do_subwindow(win, &st, test_clipping);
+	    break;
+	case 'q':
+	    return;
+	default:
+	    update_status(win, &st);
+	    break;
+	}
+    } while ((st.ch = wgetch(win)) != ERR);
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: clip_printw [options]"
+	,""
+	,USAGE_COMMON
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) {
+	switch (ch) {
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind < argc)
+	usage(FALSE);
+
+    setlocale(LC_ALL, "");
+    initscr();
+    cbreak();
+    noecho();
+
+    test_clipping(stdscr);
+    endwin();
+
+    ExitProgram(EXIT_SUCCESS);
+}
+
+#else
+int
+main(void)
+{
+    printf("This program requires the curses vw_printw function\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif
diff --git a/test/color_content.c b/test/color_content.c
new file mode 100644
index 0000000..c9aaf2f
--- /dev/null
+++ b/test/color_content.c
@@ -0,0 +1,342 @@
+/****************************************************************************
+ * Copyright 2018-2020,2022 Thomas E. Dickey                                *
+ *                                                                          *
+ * 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: color_content.c,v 1.18 2022/12/10 22:28:50 tom Exp $
+ */
+
+#define NEED_TIME_H
+#include <test.priv.h>
+
+#if USE_EXTENDED_COLOR
+typedef int my_color_t;
+#else
+typedef NCURSES_COLOR_T my_color_t;
+#endif
+
+typedef struct {
+    my_color_t r;
+    my_color_t g;
+    my_color_t b;
+} MYCOLOR;
+
+static int f_opt;
+static int i_opt;
+static int l_opt;
+static int n_opt;
+static int p_opt;
+static int r_opt;
+static int s_opt;
+
+#if USE_EXTENDED_COLOR
+static int x_opt;
+#endif
+
+static MYCOLOR *expected;
+
+#if HAVE_GETTIMEOFDAY
+static struct timeval initial_time;
+static struct timeval finish_time;
+#endif
+
+static void
+failed(const char *msg)
+{
+    printw("%s", msg);
+    getch();
+    endwin();
+    ExitProgram(EXIT_FAILURE);
+}
+
+#if USE_EXTENDED_COLOR
+static int
+InitColor(int pair, int r, int g, int b)
+{
+    int rc;
+    if (x_opt) {
+	rc = init_extended_color(pair, r, g, b);
+    } else {
+	rc = init_color((NCURSES_PAIRS_T) pair,
+			(NCURSES_COLOR_T) r,
+			(NCURSES_COLOR_T) g,
+			(NCURSES_COLOR_T) b);
+    }
+    return rc;
+}
+
+static int
+ColorContent(int color, int *rp, int *gp, int *bp)
+{
+    int rc;
+    if (x_opt) {
+	rc = extended_color_content(color, rp, gp, bp);
+    } else {
+	NCURSES_COLOR_T r, g, b;
+	if ((rc = color_content((NCURSES_COLOR_T) color, &r, &g, &b)) == OK) {
+	    *rp = r;
+	    *gp = g;
+	    *bp = b;
+	}
+    }
+    return rc;
+}
+#else
+#define InitColor(color,r,g,b)       init_color((NCURSES_COLOR_T)color,(NCURSES_COLOR_T)r,(NCURSES_COLOR_T)g,(NCURSES_COLOR_T)b)
+#define ColorContent(color,rp,gp,bp) color_content((NCURSES_COLOR_T)color,rp,gp,bp)
+#endif
+
+static my_color_t
+random_color(void)
+{
+    return (my_color_t) (rand() % 1000);
+}
+
+static void
+setup_test(void)
+{
+    setlocale(LC_ALL, "");
+    initscr();
+    cbreak();
+    noecho();
+    scrollok(stdscr, TRUE);
+    if (has_colors()) {
+	start_color();
+	if (!can_change_color() && !p_opt)
+	    failed("this terminal cannot initialize colors");
+
+	if (!f_opt)
+	    f_opt = 0;
+	if (!l_opt)
+	    l_opt = COLORS;
+	if (l_opt <= 0)
+	    failed("color limit must be greater than zero");
+
+	if (!n_opt) {
+	    int color;
+	    size_t need = (size_t) ((l_opt > COLORS) ? l_opt : COLORS) + 1;
+
+	    expected = typeCalloc(MYCOLOR, need);
+	    if (s_opt) {
+		int r;
+		int g;
+		int b;
+		color = f_opt;
+		for (r = 0; r < 1000; ++r) {
+		    for (g = 0; g < 1000; ++g) {
+			for (b = 0; b < 1000; ++b) {
+			    if (color < l_opt) {
+				InitColor(color, r, g, b);
+				expected[color].r = (my_color_t) r;
+				expected[color].g = (my_color_t) g;
+				expected[color].b = (my_color_t) b;
+				++color;
+			    } else {
+				break;
+			    }
+			}
+		    }
+		}
+	    } else {
+		for (color = f_opt; color < l_opt; ++color) {
+		    expected[color].r = random_color();
+		    expected[color].g = random_color();
+		    expected[color].b = random_color();
+		    InitColor(color,
+			      expected[color].r,
+			      expected[color].g,
+			      expected[color].b);
+		}
+	    }
+	}
+    } else {
+	failed("This demo requires a color terminal");
+    }
+#if HAVE_GETTIMEOFDAY
+    gettimeofday(&initial_time, 0);
+#endif
+}
+
+static void
+run_test(void)
+{
+    int color;
+    bool success = TRUE;
+    for (color = f_opt; color < l_opt; ++color) {
+	my_color_t r;
+	my_color_t g;
+	my_color_t b;
+	if (ColorContent(color, &r, &g, &b) == OK) {
+	    if (expected != 0) {
+		if (r != expected[color].r)
+		    success = FALSE;
+		if (g != expected[color].g)
+		    success = FALSE;
+		if (b != expected[color].b)
+		    success = FALSE;
+	    }
+	}
+    }
+    if (i_opt) {
+	addch(success ? '.' : '?');
+	refresh();
+    }
+}
+
+static void
+finish_test(void)
+{
+    getch();
+    endwin();
+}
+
+#if HAVE_GETTIMEOFDAY
+static double
+seconds(struct timeval *mark)
+{
+    double result = (double) mark->tv_sec;
+    result += ((double) mark->tv_usec / 1e6);
+    return result;
+}
+#endif
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: color_content [options]"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+	," -f COLOR first color value to test (default: 0)"
+	," -i       interactive, showing test-progress"
+	," -l COLOR last color value to test (default: max_colors-1)"
+	," -n       do not initialize color pairs"
+	," -p       print data for color content instead of testing"
+	," -r COUNT repeat for given count"
+	," -s       initialize pairs sequentially rather than random"
+#if USE_EXTENDED_COLOR
+	," -x       use extended color pairs/values"
+#endif
+    };
+    size_t n;
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "f:il:npr:sx")) != -1) {
+	switch (ch) {
+	case 'f':
+	    if ((f_opt = atoi(optarg)) <= 0)
+		usage(FALSE);
+	    break;
+	case 'i':
+	    i_opt = 1;
+	    break;
+	case 'l':
+	    if ((l_opt = atoi(optarg)) <= 0)
+		usage(FALSE);
+	    break;
+	case 'n':
+	    n_opt = 1;
+	    break;
+	case 'p':
+	    p_opt = 1;
+	    break;
+	case 'r':
+	    if ((r_opt = atoi(optarg)) <= 0)
+		usage(FALSE);
+	    break;
+	case 's':
+	    s_opt = 1;
+	    break;
+#if USE_EXTENDED_COLOR
+	case 'x':
+	    x_opt = 1;
+	    break;
+#endif
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind < argc)
+	usage(FALSE);
+    if (r_opt <= 0)
+	r_opt = 1;
+
+    setup_test();
+    if (p_opt) {
+	int i;
+	endwin();
+	for (i = 0; i < COLORS; ++i) {
+	    my_color_t r, g, b;
+	    if (ColorContent(i, &r, &g, &b) == OK) {
+		printf("%d: %d %d %d\n", i, r, g, b);
+	    } else {
+		printf("%d: ? ?\n", i);
+	    }
+	}
+    } else {
+	int repeat;
+
+	for (repeat = 0; repeat < r_opt; ++repeat) {
+	    run_test();
+	    if (i_opt) {
+		addch('.');
+		refresh();
+	    }
+	}
+
+	if (i_opt) {
+	    addch('\n');
+	}
+	printw("DONE: ");
+#if HAVE_GETTIMEOFDAY
+	gettimeofday(&finish_time, 0);
+	printw("%.03f seconds",
+	       seconds(&finish_time)
+	       - seconds(&initial_time));
+#endif
+	finish_test();
+    }
+
+    free(expected);
+    ExitProgram(EXIT_SUCCESS);
+}
diff --git a/test/color_name.h b/test/color_name.h
new file mode 100644
index 0000000..867396c
--- /dev/null
+++ b/test/color_name.h
@@ -0,0 +1,104 @@
+/****************************************************************************
+ * Copyright 2018-2020,2021 Thomas E. Dickey                                *
+ * Copyright 2011-2012,2016 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: color_name.h,v 1.9 2021/04/24 23:25:29 tom Exp $
+ */
+
+#ifndef __COLORNAME_H
+#define __COLORNAME_H 1
+
+#ifndef __TEST_PRIV_H
+#include <test.priv.h>
+#endif
+
+static NCURSES_CONST char *const the_color_names[] =
+{
+    "black",
+    "red",
+    "green",
+    "yellow",
+    "blue",
+    "magenta",
+    "cyan",
+    "white",
+    "BLACK",
+    "RED",
+    "GREEN",
+    "YELLOW",
+    "BLUE",
+    "MAGENTA",
+    "CYAN",
+    "WHITE"
+};
+
+#ifdef NEED_COLOR_CODE
+static int
+color_code(const char *color)
+{
+    int result = 0;
+    char *endp = 0;
+    size_t n;
+
+    if ((result = (int) strtol(color, &endp, 0)) >= 0
+	&& (endp == 0 || *endp == 0)) {
+	;
+    } else if (!strcmp(color, "default")) {
+	result = -1;
+    } else {
+	for (n = 0; n < SIZEOF(the_color_names); ++n) {
+	    if (!strcmp(the_color_names[n], color)) {
+		result = (int) n;
+		break;
+	    }
+	}
+    }
+    return result;
+}
+#endif /* NEED_COLOR_CODE */
+
+#ifdef NEED_COLOR_NAME
+static const char *
+color_name(int color)
+{
+    static char temp[20];
+    const char *result = 0;
+
+    if (color >= (int) SIZEOF(the_color_names)) {
+	_nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) "%d", color);
+	result = temp;
+    } else if (color < 0) {
+	result = "default";
+    } else {
+	result = the_color_names[color];
+    }
+    return result;
+}
+#endif /* NEED_COLOR_NAME */
+
+#endif /* __COLORNAME_H */
diff --git a/test/color_set.c b/test/color_set.c
new file mode 100644
index 0000000..5510a0f
--- /dev/null
+++ b/test/color_set.c
@@ -0,0 +1,129 @@
+/****************************************************************************
+ * Copyright 2020,2020,2022 Thomas E. Dickey                                *
+ * Copyright 2003-2012,2014 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: color_set.c,v 1.12 2022/12/10 23:36:59 tom Exp $
+ */
+
+#include <test.priv.h>
+
+#if HAVE_COLOR_SET
+
+#define SHOW(n) ((n) == ERR ? "ERR" : "OK")
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: color_set [options]"
+	,""
+	,USAGE_COMMON
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    NCURSES_COLOR_T f, b;
+    int ch;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) {
+	switch (ch) {
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind < argc)
+	usage(FALSE);
+
+    setlocale(LC_ALL, "");
+    initscr();
+    cbreak();
+    noecho();
+
+    if (has_colors()) {
+	int i;
+
+	start_color();
+
+	(void) pair_content(0, &f, &b);
+	printw("pair 0 contains (%d,%d)\n", (int) f, (int) b);
+	getch();
+
+	printw("Initializing pair 1 to red/black\n");
+	init_pair(1, COLOR_RED, COLOR_BLACK);
+	i = color_set(1, NULL);
+	printw("RED/BLACK (%s)\n", SHOW(i));
+	getch();
+
+	printw("Initializing pair 2 to white/blue\n");
+	init_pair(2, COLOR_WHITE, COLOR_BLUE);
+	i = color_set(2, NULL);
+	printw("WHITE/BLUE (%s)\n", SHOW(i));
+	getch();
+
+	printw("Resetting colors to pair 0\n");
+	i = color_set(0, NULL);
+	printw("Default Colors (%s)\n", SHOW(i));
+	getch();
+
+	printw("Resetting colors to pair 1\n");
+	i = color_set(1, NULL);
+	printw("RED/BLACK (%s)\n", SHOW(i));
+	getch();
+
+    } else {
+	printw("This demo requires a color terminal");
+	getch();
+    }
+    endwin();
+
+    ExitProgram(EXIT_SUCCESS);
+}
+#else
+int
+main(void)
+{
+    printf("This program requires the curses color_set function\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif
diff --git a/test/combine.c b/test/combine.c
new file mode 100644
index 0000000..eca72b8
--- /dev/null
+++ b/test/combine.c
@@ -0,0 +1,313 @@
+/****************************************************************************
+ * Copyright 2021,2022 Thomas E. Dickey                                     *
+ *                                                                          *
+ * 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: combine.c,v 1.23 2022/12/10 22:28:50 tom Exp $
+ */
+
+#include <test.priv.h>
+
+#if USE_WIDEC_SUPPORT
+
+#include <wctype.h>
+#include <dump_window.h>
+#include <popup_msg.h>
+
+static int c_opt;
+static int r_opt;
+
+static int
+next_char(int value)
+{
+    do {
+	++value;
+    } while (!iswprint((wint_t) value));
+    return value;
+}
+
+static int
+prev_char(int value)
+{
+    do {
+	--value;
+    } while (!iswprint((wint_t) value));
+    return value;
+}
+
+static void
+do_row(int row, int base_ch, int over_ch)
+{
+    int col = 0;
+    bool done = FALSE;
+    bool reverse = (r_opt && !(row % 2));
+
+    move(row, col);
+    printw("[U+%04X]", over_ch);
+    do {
+	if (c_opt) {
+	    wchar_t source[2];
+	    cchar_t target;
+	    attr_t attr = reverse ? A_REVERSE : A_NORMAL;
+
+	    source[1] = 0;
+
+	    source[0] = (wchar_t) base_ch;
+	    setcchar(&target, source, attr, 0, NULL);
+	    add_wch(&target);
+
+	    source[0] = (wchar_t) over_ch;
+	    setcchar(&target, source, attr, 0, NULL);
+	    add_wch(&target);
+	} else {
+	    wchar_t data[3];
+
+	    data[0] = (wchar_t) base_ch;
+	    data[1] = (wchar_t) over_ch;
+	    data[2] = 0;
+	    if (reverse)
+		attr_on(A_REVERSE, NULL);
+	    addwstr(data);
+	    if (reverse)
+		attr_off(A_REVERSE, NULL);
+	}
+	col = getcurx(stdscr);
+	base_ch = next_char(base_ch);
+	done = (col + 1 >= COLS);
+    } while (!done);
+}
+
+#define LAST_OVER 0x6f
+
+static int
+next_over(int value)
+{
+    if (++value > LAST_OVER)
+	value = 0;
+    return value;
+}
+
+static int
+prev_over(int value)
+{
+    if (--value < 0)
+	value = LAST_OVER;
+    return value;
+}
+
+static void
+do_all(int left_at, int over_it)
+{
+    int row;
+
+    for (row = 0; row < LINES; ++row) {
+	do_row(row, left_at, 0x300 + over_it);
+	over_it = next_over(over_it);
+    }
+}
+
+static void
+show_help(WINDOW *current)
+{
+    /* *INDENT-OFF* */
+    static struct {
+	int	key;
+	CONST_FMT char * msg;
+    } help[] = {
+	{ HELP_KEY_1,	"Show this screen" },
+	{ CTRL('L'),	"Repaint screen" },
+	{ '$',		"Scroll to end of combining-character range" },
+	{ '+',		"Scroll to next combining-character in range" },
+	{ KEY_DOWN,	"(same as \"+\")" },
+	{ '-',		"Scroll to previous combining-character in range" },
+	{ KEY_UP,	"(same as \"-\")" },
+	{ '0',		"Scroll to beginning of combining-character range" },
+	{ 'c',		"Toggle command-line option \"-c\"" },
+	{ 'd',		"Dump screen using scr_dump unless \"-l\" option used" },
+	{ 'h',		"Scroll test-data left one column" },
+	{ 'j',		"Scroll test-data down one row" },
+	{ 'k',		"Scroll test-data up one row" },
+	{ 'l',		"Scroll test-data right one column" },
+	{ 'q',		"Quit" },
+	{ ESCAPE,	"(same as \"q\")" },
+	{ QUIT,		"(same as \"q\")" },
+	{ 'r',		"Toggle command-line option \"-r\"" },
+    };
+    /* *INDENT-ON* */
+
+    char **msgs = typeCalloc(char *, SIZEOF(help) + 3);
+    size_t s;
+    int d = 0;
+
+    msgs[d++] = strdup("Test diacritic combining-characters range "
+		       "U+0300..U+036F");
+    msgs[d++] = strdup("");
+    for (s = 0; s < SIZEOF(help); ++s) {
+	char *name = strdup(keyname(help[s].key));
+	size_t need = (11 + strlen(name) + strlen(help[s].msg));
+	msgs[d] = typeMalloc(char, need);
+	_nc_SPRINTF(msgs[d], _nc_SLIMIT(need) "%-10s%s", name, help[s].msg);
+	free(name);
+	++d;
+    }
+    popup_msg2(current, msgs);
+    for (s = 0; msgs[s] != 0; ++s) {
+	free(msgs[s]);
+    }
+    free(msgs);
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: combine [options]"
+	,""
+	,USAGE_COMMON
+	,"Demonstrate combining-characters."
+	,""
+	,"Options:"
+	," -c       use cchar_t data rather than wchar_t string"
+	," -l FILE  log window-dumps to this file"
+	," -r       draw even-numbered rows in reverse-video"
+    };
+    unsigned n;
+    for (n = 0; n < SIZEOF(msg); ++n) {
+	fprintf(stderr, "%s\n", msg[n]);
+    }
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+    int left_at = ' ';
+    int over_it = 0;
+    bool done = FALSE;
+    bool log_option = FALSE;
+    const char *dump_log = "combine.log";
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "cl:r")) != -1) {
+	switch (ch) {
+	case 'c':
+	    c_opt = TRUE;
+	    break;
+	case 'l':
+	    log_option = TRUE;
+	    if (!open_dump(optarg))
+		usage(FALSE);
+	    break;
+	case 'r':
+	    r_opt = TRUE;
+	    break;
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+
+    setlocale(LC_ALL, "");
+    initscr();
+    cbreak();
+    noecho();
+    keypad(stdscr, TRUE);
+
+    do {
+	do_all(left_at, over_it);
+	switch (getch()) {
+	case HELP_KEY_1:
+	    show_help(stdscr);
+	    break;
+	case 'q':
+	case QUIT:
+	case ESCAPE:
+	    done = TRUE;
+	    break;
+	case CTRL('L'):
+	    redrawwin(stdscr);
+	    break;
+	case 'd':
+	    if (log_option)
+		dump_window(stdscr);
+#if HAVE_SCR_DUMP
+	    else
+		scr_dump(dump_log);
+#endif
+	    break;
+	case 'h':
+	    if (left_at > ' ')
+		left_at = prev_char(left_at);
+	    break;
+	case 'l':
+	    left_at = next_char(left_at);
+	    break;
+	case 'c':
+	    c_opt = !c_opt;
+	    break;
+	case 'r':
+	    r_opt = !r_opt;
+	    break;
+	case KEY_HOME:
+	case '0':
+	    over_it = 0;
+	    break;
+	case KEY_END:
+	case '$':
+	    over_it = LAST_OVER;
+	    break;
+	case KEY_UP:
+	case 'k':
+	case '-':
+	    over_it = prev_over(over_it);
+	    break;
+	case KEY_DOWN:
+	case 'j':
+	case '+':
+	    over_it = next_over(over_it);
+	    break;
+	}
+    } while (!done);
+
+    endwin();
+
+    ExitProgram(EXIT_SUCCESS);
+}
+#else
+int
+main(void)
+{
+    printf("This program requires wide-curses functions\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif
diff --git a/test/configure b/test/configure
new file mode 100755
index 0000000..2471c49
--- /dev/null
+++ b/test/configure
@@ -0,0 +1,24506 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by Autoconf 2.52.20221009.
+#
+# Copyright 2003-2021,2022	Thomas E. Dickey
+# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
+# Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g"
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+
+# Name of the executable.
+as_me=`echo "$0" |sed 's,.*[\\/],,'`
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr="expr"
+else
+  as_expr="false"
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s='ln'
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+as_executable_p="test -f"
+
+# Support unset when possible.
+if (FOO=FOO; unset FOO) >/dev/null 2>&1; then
+  as_unset="unset"
+else
+  as_unset="false"
+fi
+
+# NLS nuisances.
+$as_unset LANG || test "${LANG+set}" != set || { LANG=C; export LANG; }
+$as_unset LC_ALL || test "${LC_ALL+set}" != set || { LC_ALL=C; export LC_ALL; }
+$as_unset LC_TIME || test "${LC_TIME+set}" != set || { LC_TIME=C; export LC_TIME; }
+$as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set || { LC_CTYPE=C; export LC_CTYPE; }
+$as_unset LANGUAGE || test "${LANGUAGE+set}" != set || { LANGUAGE=C; export LANGUAGE; }
+$as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set || { LC_COLLATE=C; export LC_COLLATE; }
+$as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set || { LC_NUMERIC=C; export LC_NUMERIC; }
+$as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set || { LC_MESSAGES=C; export LC_MESSAGES; }
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" 	$as_nl"
+
+# CDPATH.
+$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=:; export CDPATH; }
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+exec 6>&1
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Maximum number of lines to put in a shell here document.
+# This variable seems obsolete.  It should probably be removed, and
+# only ac_max_sed_lines should be used.
+: "${ac_max_here_lines=38}"
+
+ac_unique_file="ncurses.c"
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+runstatedir='${localstatedir}/run'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${datarootdir}/info'
+mandir='${datarootdir}/man'
+
+# Identity of this package.
+PACKAGE_NAME=
+PACKAGE_TARNAME=
+PACKAGE_VERSION=
+PACKAGE_STRING=
+PACKAGE_BUGREPORT=
+
+ac_prev=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval "$ac_prev=\$ac_option"
+    ac_prev=
+    continue
+  fi
+
+  ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case "$ac_option" in
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+  | --da=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo "$ac_feature" | sed 's/-/_/g'`
+    eval "enable_$ac_feature=no" ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo "$ac_feature" | sed 's/-/_/g'`
+    case "$ac_option" in
+      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "enable_$ac_feature='$ac_optarg'" ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst \
+  | --locals | --local | --loca | --loc | --lo)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+    localstatedir=$ac_optarg ;;
+
+  -runstatedir | --runstatedir | --runstatedi | --runstated \
+  | --runstate | --runstat | --runsta | --runst \
+  | --runs | --run | --ru)
+    ac_prev=runstatedir ;;
+  -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
+  | --runstate=* | --runstat=* | --runsta=* | --runst=* \
+  | --runs=* | --run=* | --ru=*)
+    runstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo "$ac_package" | sed 's/-/_/g'`
+    case "$ac_option" in
+      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "with_$ac_package='$ac_optarg'" ;;
+
+  -without-* | --without-*)
+    ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo "$ac_package" | sed 's/-/_/g'`
+    eval "with_$ac_package=no" ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; }
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+   { (exit 1); exit 1; }; }
+    ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
+    eval "$ac_envvar='$ac_optarg'"
+    export "$ac_envvar" ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : "${build_alias=$ac_option}" "${host_alias=$ac_option}" "${target_alias=$ac_option}"
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo "$ac_prev" | sed 's/_/-/g'`
+  { echo "$as_me: error: missing argument to $ac_option" >&2
+   { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute paths.
+for ac_var in exec_prefix prefix
+do
+  eval ac_val=$`echo "$ac_var"`
+  case "$ac_val" in
+    [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
+    *)  { echo "$as_me: error: expected an absolute path for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# Be sure to have absolute paths.
+for ac_var in bindir sbindir libexecdir datarootdir datadir sysconfdir sharedstatedir \
+              localstatedir libdir includedir oldincludedir infodir mandir
+do
+  eval ac_val=$`echo "$ac_var"`
+  case "$ac_val" in
+    [\\/$]* | ?:[\\/]* ) ;;
+    *)  { echo "$as_me: error: expected an absolute path for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: should be removed in autoconf 3.0.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used." >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then its parent.
+  ac_prog=$0
+  ac_confdir=`echo "$ac_prog" | sed 's%[\\/][^\\/][^\\/]*$%%'`
+  test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  if test "$ac_srcdir_defaulted" = yes; then
+    { echo "$as_me: error: cannot find sources in $ac_confdir or .." >&2
+   { (exit 1); exit 1; }; }
+  else
+    { echo "$as_me: error: cannot find sources in $srcdir" >&2
+   { (exit 1); exit 1; }; }
+  fi
+fi
+srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
+ac_env_build_alias_set=${build_alias+set}
+ac_env_build_alias_value=$build_alias
+ac_cv_env_build_alias_set=${build_alias+set}
+ac_cv_env_build_alias_value=$build_alias
+ac_env_host_alias_set=${host_alias+set}
+ac_env_host_alias_value=$host_alias
+ac_cv_env_host_alias_set=${host_alias+set}
+ac_cv_env_host_alias_value=$host_alias
+ac_env_target_alias_set=${target_alias+set}
+ac_env_target_alias_value=$target_alias
+ac_cv_env_target_alias_set=${target_alias+set}
+ac_cv_env_target_alias_value=$target_alias
+ac_env_CC_set=${CC+set}
+ac_env_CC_value=$CC
+ac_cv_env_CC_set=${CC+set}
+ac_cv_env_CC_value=$CC
+ac_env_CFLAGS_set=${CFLAGS+set}
+ac_env_CFLAGS_value=$CFLAGS
+ac_cv_env_CFLAGS_set=${CFLAGS+set}
+ac_cv_env_CFLAGS_value=$CFLAGS
+ac_env_LDFLAGS_set=${LDFLAGS+set}
+ac_env_LDFLAGS_value=$LDFLAGS
+ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
+ac_cv_env_LDFLAGS_value=$LDFLAGS
+ac_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_env_CPPFLAGS_value=$CPPFLAGS
+ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_cv_env_CPPFLAGS_value=$CPPFLAGS
+ac_env_CPP_set=${CPP+set}
+ac_env_CPP_value=$CPP
+ac_cv_env_CPP_set=${CPP+set}
+ac_cv_env_CPP_value=$CPP
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<EOF
+\`configure' configures this package to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+EOF
+
+  cat <<EOF
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR            user executables [EPREFIX/bin]
+  --sbindir=DIR           system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR        program executables [EPREFIX/libexec]
+  --datarootdir=DIR       read-only architecture-independent data [PREFIX/share]
+  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
+  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --runstatedir=DIR       extra definition of runtime data [LOCALSTATEDIR/run]
+  --libdir=DIR            object code libraries [EPREFIX/lib]
+  --includedir=DIR        C header files [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
+  --infodir=DIR           info documentation [DATAROOTDIR/info]
+  --mandir=DIR            man documentation [DATAROOTDIR/man]
+EOF
+
+  cat <<\EOF
+
+Program names:
+  --program-prefix=PREFIX            prepend PREFIX to installed program names
+  --program-suffix=SUFFIX            append SUFFIX to installed program names
+  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
+
+X features:
+  --x-includes=DIR    X include files are in DIR
+  --x-libraries=DIR   X library files are in DIR
+
+System types:
+  --build=BUILD           configure for building on BUILD [guessed]
+  --host=HOST       build programs to run on HOST [BUILD]
+EOF
+fi
+
+if test -n "$ac_init_help"; then
+
+  cat <<\EOF
+
+Optional Features:
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+
+Optional Packages:
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+
+General Options:
+  --disable-stripping     do not strip (debug info) installed executables
+  --enable-stdnoreturn    enable C11 _Noreturn feature for diagnostics
+  --enable-string-hacks   work around bogus compiler/loader warnings
+  --with-pkg-config{=path} enable/disable use of pkg-config
+  --disable-echo          do not display "compiling" commands
+Curses Version-dependent Options:
+  --with-ncurses-wrap-prefix naming-prefix for ncurses wrapped-variables
+  --disable-widec         disable checks for wide-character functions
+  --with-curses-dir=DIR   directory in which (n)curses is installed
+  --with-screen=XXX       use specified curses-libraries
+  --with-ncursesw         use wide ncurses-libraries
+  --with-ncurses          use ncurses-libraries
+  --with-pdcurses         compile/link with pdcurses X11 library
+  --with-curses-colr      compile/link with HPUX 10.x color-curses
+  --with-curses-5lib      compile/link with SunOS 5lib curses
+  --with-Xaw3d            link with Xaw 3d library
+  --with-Xaw3dxft         link with Xaw 3d xft library
+  --with-neXtaw           link with neXT Athena library
+  --with-XawPlus          link with Athena-Plus library
+  --with-x                use the X Window System
+  --with-x11-rgb=FILE   file containing X11 rgb information (EPREFIX/lib/X11/rgb.txt)
+  --with-form-libname=XXX override form basename of library
+  --with-menu-libname=XXX override menu basename of library
+  --with-panel-libname=XXX override panel basename of library
+  --disable-panel         disable checks for panel functions
+  --disable-menu          disable checks for menu functions
+  --disable-form          disable checks for form functions
+Testing/development Options:
+  --enable-warnings       test: turn on gcc compiler warnings
+  --with-dmalloc          test: use Gray Watson's dmalloc library
+  --with-dbmalloc         test: use Conor Cahill's dbmalloc library
+  --with-valgrind         test: use valgrind
+  --disable-leaks         test: free permanent memory, analyze leaks
+  --disable-rpath-hack    don't add rpath options for additional libraries
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  CPPFLAGS    C/C++ preprocessor flags, e.g. -I<include dir> if you have
+              headers in a nonstandard directory <include dir>
+  CPP         C preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+EOF
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  ac_popdir=`pwd`
+  for ac_subdir in : $ac_subdirs_all; do test "x$ac_subdir" = x: && continue
+    cd "$ac_subdir"
+    # A "../" for each directory in /$ac_subdir.
+    ac_dots=`echo "$ac_subdir" |
+             sed 's,^\./,,;s,[^/]$,&/,;s,[^/]*/,../,g'`
+
+    case "$srcdir" in
+    .) # No --srcdir option.  We are building in place.
+      ac_sub_srcdir="$srcdir" ;;
+    [\\/]* | ?:[\\/]* ) # Absolute path.
+      ac_sub_srcdir="$srcdir/$ac_subdir" ;;
+    *) # Relative path.
+      ac_sub_srcdir="$ac_dots$srcdir/$ac_subdir" ;;
+    esac
+
+    # Check for guested configure; otherwise get Cygnus style configure.
+    if test -f "$ac_sub_srcdir/configure.gnu"; then
+      echo
+      $SHELL "$ac_sub_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_sub_srcdir/configure"; then
+      echo
+      $SHELL "$ac_sub_srcdir/configure" --help=recursive
+    elif test -f "$ac_sub_srcdir/configure.ac" ||
+           test -f "$ac_sub_srcdir/configure.in"; then
+      echo
+      "$ac_configure" --help
+    else
+      echo "$as_me: WARNING: no configuration information is in $ac_subdir" >&2
+    fi
+    cd "$ac_popdir"
+  done
+fi
+
+test -n "$ac_init_help" && exit 0
+if "$ac_init_version"; then
+  cat <<\EOF
+
+Copyright 2003-2021,2022	Thomas E. Dickey
+Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+EOF
+  exit 0
+fi
+exec 5>config.log
+cat >&5 <<EOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by $as_me, which was
+generated by GNU Autoconf 2.52.20221009.  Invocation command line was
+
+  $ $0 $@
+
+EOF
+{
+cat <<_ASUNAME
+## ---------- ##
+## Platform.  ##
+## ---------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+hostinfo               = `(hostinfo) 2>/dev/null               || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+PATH = $PATH
+
+_ASUNAME
+} >&5
+
+cat >&5 <<EOF
+## ------------ ##
+## Core tests.  ##
+## ------------ ##
+
+EOF
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell meta-characters.
+ac_configure_args=
+ac_sep=
+for ac_arg
+do
+  case "$ac_arg" in
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c) ;;
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+  *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+    ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"`
+    ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
+    ac_sep=" " ;;
+  *) ac_configure_args="$ac_configure_args$ac_sep$ac_arg"
+     ac_sep=" " ;;
+  esac
+  # Get rid of the leading space.
+done
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  echo >&5
+  echo "## ----------------- ##" >&5
+  echo "## Cache variables.  ##" >&5
+  echo "## ----------------- ##" >&5
+  echo >&5
+  # The following way of writing the cache mishandles newlines in values,
+{
+  (set) 2>&1 |
+    case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
+    *ac_space=\ *)
+      sed -n \
+        "s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
+    	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
+      ;;
+    *)
+      sed -n \
+        "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      ;;
+    esac;
+} >&5
+  sed "/^$/d" confdefs.h >conftest.log
+  if test -s conftest.log; then
+    echo >&5
+    echo "## ------------ ##" >&5
+    echo "## confdefs.h.  ##" >&5
+    echo "## ------------ ##" >&5
+    echo >&5
+    cat conftest.log >&5
+  fi
+  (echo; echo) >&5
+  test "$ac_signal" != 0 &&
+    echo "$as_me: caught signal $ac_signal" >&5
+  echo "$as_me: exit $exit_status" >&5
+  rm -rf conftest* confdefs* core core.* *.core conf$$* $ac_clean_files &&
+    exit $exit_status
+     ' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' "$ac_signal"
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo >confdefs.h
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+  if test "x$prefix" != xNONE; then
+    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+  else
+    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+  fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+  if test -r "$ac_site_file"; then
+    { echo "$as_me:899: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+    cat "$ac_site_file" >&5
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special
+  # files actually), so we avoid doing that.
+  if test -f "$cache_file"; then
+    { echo "$as_me:910: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . $cache_file;;
+      *)                      . ./$cache_file;;
+    esac
+  fi
+else
+  { echo "$as_me:918: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in `(set) 2>&1 |
+               sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val="\$ac_cv_env_${ac_var}_value"
+  eval ac_new_val="\$ac_env_${ac_var}_value"
+  case "$ac_old_set,$ac_new_set" in
+    set,)
+      { echo "$as_me:934: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { echo "$as_me:938: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+        { echo "$as_me:944: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+        { echo "$as_me:946:   former value:  $ac_old_val" >&5
+echo "$as_me:   former value:  $ac_old_val" >&2;}
+        { echo "$as_me:948:   current value: $ac_new_val" >&5
+echo "$as_me:   current value: $ac_new_val" >&2;}
+        ac_cache_corrupted=:
+      fi;;
+  esac
+  # Pass precious variables to config.status.  It doesn't matter if
+  # we pass some twice (in addition to the command line arguments).
+  if test "$ac_new_set" = set; then
+    case "$ac_new_val" in
+    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+      ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"`
+      ac_configure_args="$ac_configure_args '$ac_arg'"
+      ;;
+    *) ac_configure_args="$ac_configure_args $ac_var=$ac_new_val"
+       ;;
+    esac
+  fi
+done
+if "$ac_cache_corrupted"; then
+  { echo "$as_me:967: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  { { echo "$as_me:969: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
+ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_main_return="return"
+
+case `echo "testing\c" 2>/dev/null; echo 1,2,3`,`echo -n testing 2>/dev/null; echo 1,2,3` in
+  *c*,-n*) ECHO_N=
+           ECHO_C=      # newlines do not sed ;-) only broken shells would use this case anyway
+           ECHO_T='	'
+           ;;
+  *c*,*  ) ECHO_N=-n
+           ECHO_C=
+           ECHO_T=
+           ;;
+  *)       ECHO_N=
+           ECHO_C='\c'
+           ECHO_T=
+           ;;
+esac
+echo "#! $SHELL" >conftest.sh
+echo  "exit 0"   >>conftest.sh
+chmod +x conftest.sh
+if { (echo "$as_me:998: PATH=\".;.\"; conftest.sh") >&5
+  (PATH=".;."; conftest.sh) 2>&5
+  ac_status=$?
+  echo "$as_me:1001: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; then
+  ac_path_separator=';'
+else
+  ac_path_separator=:
+fi
+PATH_SEPARATOR="$ac_path_separator"
+rm -f conftest.sh
+
+ac_config_headers="$ac_config_headers ncurses_cfg.h:ncurses_tst.hin"
+
+test -f config.guess || ( test -f ../config.guess && cp ../config.guess ./ )
+
+test -f config.sub || ( test -f ../config.sub && cp ../config.sub ./ )
+
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+  if test -f "$ac_dir/install-sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f "$ac_dir/install.sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f "$ac_dir/shtool"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  { { echo "$as_me:1033: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5
+echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"
+ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
+
+# Make sure we can run config.sub.
+$ac_config_sub sun4 >/dev/null 2>&1 ||
+  { { echo "$as_me:1043: error: cannot run $ac_config_sub" >&5
+echo "$as_me: error: cannot run $ac_config_sub" >&2;}
+   { (exit 1); exit 1; }; }
+
+echo "$as_me:1047: checking build system type" >&5
+echo $ECHO_N "checking build system type... $ECHO_C" >&6
+if test "${ac_cv_build+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_build_alias=$build_alias
+test -z "$ac_cv_build_alias" &&
+  ac_cv_build_alias=`$ac_config_guess`
+test -z "$ac_cv_build_alias" &&
+  { { echo "$as_me:1056: error: cannot guess build type; you must specify one" >&5
+echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
+   { (exit 1); exit 1; }; }
+ac_cv_build=`$ac_config_sub "$ac_cv_build_alias"` ||
+  { { echo "$as_me:1060: error: $ac_config_sub $ac_cv_build_alias failed." >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed." >&2;}
+   { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:1065: result: $ac_cv_build" >&5
+echo "${ECHO_T}$ac_cv_build" >&6
+build=$ac_cv_build
+build_cpu=`echo "$ac_cv_build" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo "$ac_cv_build" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo "$ac_cv_build" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+if test -f "$srcdir/config.guess" || test -f "$ac_aux_dir/config.guess" ; then
+	echo "$as_me:1073: checking host system type" >&5
+echo $ECHO_N "checking host system type... $ECHO_C" >&6
+if test "${ac_cv_host+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_host_alias=$host_alias
+test -z "$ac_cv_host_alias" &&
+  ac_cv_host_alias=$ac_cv_build_alias
+ac_cv_host=`$ac_config_sub "$ac_cv_host_alias"` ||
+  { { echo "$as_me:1082: error: $ac_config_sub $ac_cv_host_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;}
+   { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:1087: result: $ac_cv_host" >&5
+echo "${ECHO_T}$ac_cv_host" >&6
+host=$ac_cv_host
+host_cpu=`echo "$ac_cv_host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo "$ac_cv_host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo "$ac_cv_host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+	system_name="$host_os"
+else
+	system_name="`(uname -s -r) 2>/dev/null`"
+	if test -z "$system_name" ; then
+		system_name="`(hostname) 2>/dev/null`"
+	fi
+fi
+test -n "$system_name" &&
+cat >>confdefs.h <<EOF
+#define SYSTEM_NAME "$system_name"
+EOF
+
+if test "${cf_cv_system_name+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cf_cv_system_name="$system_name"
+fi
+
+test -z "$system_name" && system_name="$cf_cv_system_name"
+test -n "$cf_cv_system_name" && echo "$as_me:1113: result: Configuring for $cf_cv_system_name" >&5
+echo "${ECHO_T}Configuring for $cf_cv_system_name" >&6
+
+if test ".$system_name" != ".$cf_cv_system_name" ; then
+	echo "$as_me:1117: result: Cached system name ($system_name) does not agree with actual ($cf_cv_system_name)" >&5
+echo "${ECHO_T}Cached system name ($system_name) does not agree with actual ($cf_cv_system_name)" >&6
+	{ { echo "$as_me:1119: error: \"Please remove config.cache and try again.\"" >&5
+echo "$as_me: error: \"Please remove config.cache and try again.\"" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+test "$program_prefix" != NONE &&
+  program_transform_name="s,^,$program_prefix,;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s,\$,$program_suffix,;$program_transform_name"
+# Double any \ or $.  echo might interpret backslashes.
+# By default was `s,x,x', remove it if useless.
+cat <<\_ACEOF >conftest.sed
+s/[\\$]/&&/g;s/;s,x,x,$//
+_ACEOF
+program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
+rm conftest.sed
+
+echo "$as_me:1137: checking whether ${MAKE-make} sets \${MAKE}" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \${MAKE}... $ECHO_C" >&6
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,./+-,__p_,'`
+if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.make <<\EOF
+all:
+	@echo 'ac_maketemp="${MAKE}"'
+EOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+  eval ac_cv_prog_make_${ac_make}_set=yes
+else
+  eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftest.make
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+  echo "$as_me:1157: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+  SET_MAKE=
+else
+  echo "$as_me:1161: result: no" >&5
+echo "${ECHO_T}no" >&6
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
+ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_main_return="return"
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+echo "$as_me:1175: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_CC="${ac_tool_prefix}gcc"
+echo "$as_me:1190: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:1198: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:1201: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo "$as_me:1210: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ac_ct_CC="gcc"
+echo "$as_me:1225: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:1233: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:1236: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  CC=$ac_ct_CC
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+echo "$as_me:1249: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_CC="${ac_tool_prefix}cc"
+echo "$as_me:1264: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:1272: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:1275: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:1284: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ac_ct_CC="cc"
+echo "$as_me:1299: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:1307: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:1310: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  CC=$ac_ct_CC
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:1323: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+  ac_prog_rejected=yes
+  continue
+fi
+ac_cv_prog_CC="cc"
+echo "$as_me:1343: found $ac_dir/$ac_word" >&5
+break
+done
+
+if test "$ac_prog_rejected" = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    set dummy "$ac_dir/$ac_word" ${1+"$@"}
+    shift
+    ac_cv_prog_CC="$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:1365: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:1368: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:1379: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+echo "$as_me:1394: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:1402: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:1405: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:1418: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ac_ct_CC="$ac_prog"
+echo "$as_me:1433: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:1441: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:1444: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$ac_ct_CC" && break
+done
+
+  CC=$ac_ct_CC
+fi
+
+fi
+
+test -z "$CC" && { { echo "$as_me:1456: error: no acceptable cc found in \$PATH" >&5
+echo "$as_me: error: no acceptable cc found in \$PATH" >&2;}
+   { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:1461:" \
+     "checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo "$2"`
+{ (eval echo "$as_me:1464: \"$ac_compiler --version </dev/null >&5\"") >&5
+  (eval $ac_compiler --version </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:1467: \$? = $ac_status" >&5
+  (exit "$ac_status"); }
+{ (eval echo "$as_me:1469: \"$ac_compiler -v </dev/null >&5\"") >&5
+  (eval $ac_compiler -v </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:1472: \$? = $ac_status" >&5
+  (exit "$ac_status"); }
+{ (eval echo "$as_me:1474: \"$ac_compiler -V </dev/null >&5\"") >&5
+  (eval $ac_compiler -V </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:1477: \$? = $ac_status" >&5
+  (exit "$ac_status"); }
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 1481 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+echo "$as_me:1497: checking for C compiler default output" >&5
+echo $ECHO_N "checking for C compiler default output... $ECHO_C" >&6
+ac_link_default=`echo "$ac_link" | sed 's/ -o *"conftest[^"]*"//'`
+if { (eval echo "$as_me:1500: \"$ac_link_default\"") >&5
+  (eval $ac_link_default) 2>&5
+  ac_status=$?
+  echo "$as_me:1503: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; then
+  # Find the output, starting from the most likely.  This scheme is
+# not robust to junk in `.', hence go to wildcards (a.*) only as a last
+# resort.
+for ac_file in `ls a.exe conftest.exe 2>/dev/null;
+                ls a.out conftest 2>/dev/null;
+                ls a.* conftest.* 2>/dev/null`; do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.dbg | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+    a.out ) # We found the default executable, but exeext='' is most
+            # certainly right.
+            break;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+          # FIXME: I believe we export ac_cv_exeext for Libtool --akim.
+          export ac_cv_exeext
+          break;;
+    * ) break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+{ { echo "$as_me:1526: error: C compiler cannot create executables" >&5
+echo "$as_me: error: C compiler cannot create executables" >&2;}
+   { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+echo "$as_me:1532: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6
+
+# Check the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:1537: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+  if { ac_try='./$ac_file'
+  { (eval echo "$as_me:1543: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:1546: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+	cross_compiling=yes
+    else
+	{ { echo "$as_me:1553: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'." >&5
+echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'." >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+  fi
+fi
+echo "$as_me:1561: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+rm -f a.out a.exe "conftest$ac_cv_exeext"
+ac_clean_files=$ac_clean_files_save
+# Check the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:1568: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
+echo "$as_me:1570: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6
+
+echo "$as_me:1573: checking for executable suffix" >&5
+echo $ECHO_N "checking for executable suffix... $ECHO_C" >&6
+if { (eval echo "$as_me:1575: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:1578: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; then
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in `(ls conftest.exe; ls conftest; ls conftest.*) 2>/dev/null`; do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.dbg | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+          export ac_cv_exeext
+          break;;
+    * ) break;;
+  esac
+done
+else
+  { { echo "$as_me:1594: error: cannot compute EXEEXT: cannot compile and link" >&5
+echo "$as_me: error: cannot compute EXEEXT: cannot compile and link" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f "conftest$ac_cv_exeext"
+echo "$as_me:1600: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6
+
+rm -f "conftest.$ac_ext"
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+echo "$as_me:1606: checking for object suffix" >&5
+echo $ECHO_N "checking for object suffix... $ECHO_C" >&6
+if test "${ac_cv_objext+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 1612 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (eval echo "$as_me:1624: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:1627: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; then
+  for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.dbg | *.pdb | *.xSYM | *.map | *.inf ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+{ { echo "$as_me:1639: error: cannot compute OBJEXT: cannot compile" >&5
+echo "$as_me: error: cannot compute OBJEXT: cannot compile" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f "conftest.$ac_cv_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:1646: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+echo "$as_me:1650: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 1656 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:1671: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:1674: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:1677: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:1680: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_compiler_gnu=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:1692: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+CFLAGS="-g"
+echo "$as_me:1698: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 1704 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:1716: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:1719: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:1722: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:1725: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_prog_cc_g=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:1735: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+# Some people use a C++ compiler to compile C.  Since we use `exit',
+# in C++ we need to declare it.  In case someone uses the same compiler
+# for both compiling C and C++ we need to have the C++ compiler decide
+# the declaration of exit, since it's the most demanding environment.
+cat >"conftest.$ac_ext" <<_ACEOF
+#ifndef __cplusplus
+  choke me
+#endif
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:1762: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:1765: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:1768: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:1771: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  for ac_declaration in \
+   ''\
+   '#include <stdlib.h>' \
+   'extern "C" void std::exit (int) throw (); using std::exit;' \
+   'extern "C" void std::exit (int); using std::exit;' \
+   'extern "C" void exit (int) throw ();' \
+   'extern "C" void exit (int);' \
+   'void exit (int);'
+do
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 1783 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+$ac_declaration
+int
+main (void)
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:1796: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:1799: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:1802: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:1805: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+continue
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 1815 "configure"
+#include "confdefs.h"
+$ac_declaration
+int
+main (void)
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:1827: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:1830: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:1833: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:1836: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+done
+rm -rf conftest*
+if test -n "$ac_declaration"; then
+  echo '#ifdef __cplusplus' >>confdefs.h
+  echo "$ac_declaration"    >>confdefs.h
+  echo '#endif'             >>confdefs.h
+fi
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
+ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_main_return="return"
+
+GCC_VERSION=none
+if test "$GCC" = yes ; then
+	echo "$as_me:1866: checking version of $CC" >&5
+echo $ECHO_N "checking version of $CC... $ECHO_C" >&6
+	GCC_VERSION="`${CC} --version 2>/dev/null | sed -e '2,$d' -e 's/^.*(GCC[^)]*) //' -e 's/^.*(Debian[^)]*) //' -e 's/^[^0-9.]*//' -e 's/[^0-9.].*//'`"
+	test -z "$GCC_VERSION" && GCC_VERSION=unknown
+	echo "$as_me:1870: result: $GCC_VERSION" >&5
+echo "${ECHO_T}$GCC_VERSION" >&6
+fi
+
+INTEL_COMPILER=no
+
+if test "$GCC" = yes ; then
+	case "$host_os" in
+	(linux*|gnu*)
+		echo "$as_me:1879: checking if this is really Intel C compiler" >&5
+echo $ECHO_N "checking if this is really Intel C compiler... $ECHO_C" >&6
+		cf_save_CFLAGS="$CFLAGS"
+		CFLAGS="$CFLAGS -no-gcc"
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 1884 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+
+#ifdef __INTEL_COMPILER
+#else
+make an error
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:1901: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:1904: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:1907: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:1910: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  INTEL_COMPILER=yes
+cf_save_CFLAGS="$cf_save_CFLAGS -we147"
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+		CFLAGS="$cf_save_CFLAGS"
+		echo "$as_me:1921: result: $INTEL_COMPILER" >&5
+echo "${ECHO_T}$INTEL_COMPILER" >&6
+		;;
+	esac
+fi
+
+CLANG_COMPILER=no
+
+if test "$GCC" = yes ; then
+	echo "$as_me:1930: checking if this is really Clang C compiler" >&5
+echo $ECHO_N "checking if this is really Clang C compiler... $ECHO_C" >&6
+	cf_save_CFLAGS="$CFLAGS"
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 1934 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+
+#ifdef __clang__
+#else
+make an error
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:1951: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:1954: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:1957: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:1960: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  CLANG_COMPILER=yes
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+	CFLAGS="$cf_save_CFLAGS"
+	echo "$as_me:1970: result: $CLANG_COMPILER" >&5
+echo "${ECHO_T}$CLANG_COMPILER" >&6
+fi
+
+CLANG_VERSION=none
+
+if test "x$CLANG_COMPILER" = "xyes" ; then
+	case "$CC" in
+	(c[1-9][0-9]|*/c[1-9][0-9])
+		{ echo "$as_me:1979: WARNING: replacing broken compiler alias $CC" >&5
+echo "$as_me: WARNING: replacing broken compiler alias $CC" >&2;}
+		CFLAGS="$CFLAGS -std=`echo "$CC" | sed -e 's%.*/%%'`"
+		CC=clang
+		;;
+	esac
+
+	echo "$as_me:1986: checking version of $CC" >&5
+echo $ECHO_N "checking version of $CC... $ECHO_C" >&6
+	CLANG_VERSION="`$CC --version 2>/dev/null | sed -e '2,$d' -e 's/^.*(CLANG[^)]*) //' -e 's/^.*(Debian[^)]*) //' -e 's/^[^0-9.]*//' -e 's/[^0-9.].*//'`"
+	test -z "$CLANG_VERSION" && CLANG_VERSION=unknown
+	echo "$as_me:1990: result: $CLANG_VERSION" >&5
+echo "${ECHO_T}$CLANG_VERSION" >&6
+
+	for cf_clang_opt in \
+		-Qunused-arguments \
+		-Wno-error=implicit-function-declaration
+	do
+		echo "$as_me:1997: checking if option $cf_clang_opt works" >&5
+echo $ECHO_N "checking if option $cf_clang_opt works... $ECHO_C" >&6
+		cf_save_CFLAGS="$CFLAGS"
+		CFLAGS="$CFLAGS $cf_clang_opt"
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 2002 "configure"
+#include "confdefs.h"
+
+			#include <stdio.h>
+int
+main (void)
+{
+
+			printf("hello!\\n");
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:2016: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:2019: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:2022: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:2025: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+			cf_clang_optok=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+			cf_clang_optok=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+		echo "$as_me:2036: result: $cf_clang_optok" >&5
+echo "${ECHO_T}$cf_clang_optok" >&6
+		CFLAGS="$cf_save_CFLAGS"
+		if test "$cf_clang_optok" = yes; then
+			test -n "$verbose" && echo "	adding option $cf_clang_opt" 1>&6
+
+echo "${as_me:-configure}:2042: testing adding option $cf_clang_opt ..." 1>&5
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_clang_opt"
+
+		fi
+	done
+fi
+
+echo "$as_me:2051: checking for $CC option to accept ANSI C" >&5
+echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_stdc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_prog_cc_stdc=no
+ac_save_CC=$CC
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 2059 "configure"
+#include "confdefs.h"
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main (void)
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX			-qlanglvl=ansi
+# Ultrix and OSF/1	-std1
+# HP-UX 10.20 and later	-Ae
+# HP-UX older versions	-Aa -D_HPUX_SOURCE
+# SVR4			-Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:2108: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:2111: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:2114: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:2117: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_prog_cc_stdc=$ac_arg
+break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext"
+done
+rm -f "conftest.$ac_ext" "conftest.$ac_objext"
+CC=$ac_save_CC
+
+fi
+
+case "x$ac_cv_prog_cc_stdc" in
+  x|xno)
+    echo "$as_me:2134: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6 ;;
+  *)
+    echo "$as_me:2137: result: $ac_cv_prog_cc_stdc" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
+    CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+
+# This should have been defined by AC_PROG_CC
+: "${CC:=cc}"
+
+echo "$as_me:2145: checking \$CFLAGS variable" >&5
+echo $ECHO_N "checking \$CFLAGS variable... $ECHO_C" >&6
+case "x$CFLAGS" in
+(*-[IUD]*)
+	echo "$as_me:2149: result: broken" >&5
+echo "${ECHO_T}broken" >&6
+	{ echo "$as_me:2151: WARNING: your environment uses the CFLAGS variable to hold CPPFLAGS options" >&5
+echo "$as_me: WARNING: your environment uses the CFLAGS variable to hold CPPFLAGS options" >&2;}
+	cf_flags="$CFLAGS"
+	CFLAGS=
+	for cf_arg in $cf_flags
+	do
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_arg
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+	done
+	;;
+(*)
+	echo "$as_me:2259: result: ok" >&5
+echo "${ECHO_T}ok" >&6
+	;;
+esac
+
+echo "$as_me:2264: checking \$CC variable" >&5
+echo $ECHO_N "checking \$CC variable... $ECHO_C" >&6
+case "$CC" in
+(*[\ \	]-*)
+	echo "$as_me:2268: result: broken" >&5
+echo "${ECHO_T}broken" >&6
+	{ echo "$as_me:2270: WARNING: your environment uses the CC variable to hold CFLAGS/CPPFLAGS options" >&5
+echo "$as_me: WARNING: your environment uses the CC variable to hold CFLAGS/CPPFLAGS options" >&2;}
+	# humor him...
+	cf_prog=`echo "$CC" | sed -e 's/	/ /g' -e 's/[ ]* / /g' -e 's/[ ]*[ ]-[^ ].*//'`
+	cf_flags=`echo "$CC" | ${AWK:-awk} -v prog="$cf_prog" '{ printf("%s", substr($0,1+length(prog))); }'`
+	CC="$cf_prog"
+	for cf_arg in $cf_flags
+	do
+		case "x$cf_arg" in
+		(x-[IUDfgOW]*)
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_arg
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+			;;
+		(*)
+			CC="$CC $cf_arg"
+			;;
+		esac
+	done
+	test -n "$verbose" && echo "	resulting CC: '$CC'" 1>&6
+
+echo "${as_me:-configure}:2387: testing resulting CC: '$CC' ..." 1>&5
+
+	test -n "$verbose" && echo "	resulting CFLAGS: '$CFLAGS'" 1>&6
+
+echo "${as_me:-configure}:2391: testing resulting CFLAGS: '$CFLAGS' ..." 1>&5
+
+	test -n "$verbose" && echo "	resulting CPPFLAGS: '$CPPFLAGS'" 1>&6
+
+echo "${as_me:-configure}:2395: testing resulting CPPFLAGS: '$CPPFLAGS' ..." 1>&5
+
+	;;
+(*)
+	echo "$as_me:2399: result: ok" >&5
+echo "${ECHO_T}ok" >&6
+	;;
+esac
+
+echo "$as_me:2404: checking for inline" >&5
+echo $ECHO_N "checking for inline... $ECHO_C" >&6
+if test "${ac_cv_c_inline+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 2412 "configure"
+#include "confdefs.h"
+#ifndef __cplusplus
+static $ac_kw int static_foo () {return 0; }
+$ac_kw int foo () {return 0; }
+#endif
+
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:2421: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:2424: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:2427: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:2430: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_c_inline=$ac_kw; break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+done
+
+fi
+echo "$as_me:2441: result: $ac_cv_c_inline" >&5
+echo "${ECHO_T}$ac_cv_c_inline" >&6
+case $ac_cv_c_inline in
+  inline | yes) ;;
+  no)
+cat >>confdefs.h <<\EOF
+#define inline
+EOF
+ ;;
+  *)  cat >>confdefs.h <<EOF
+#define inline $ac_cv_c_inline
+EOF
+ ;;
+esac
+
+for ac_prog in ggrep grep
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:2460: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_GREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$GREP"; then
+  ac_cv_prog_GREP="$GREP" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_GREP="$ac_prog"
+echo "$as_me:2475: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+GREP=$ac_cv_prog_GREP
+if test -n "$GREP"; then
+  echo "$as_me:2483: result: $GREP" >&5
+echo "${ECHO_T}$GREP" >&6
+else
+  echo "$as_me:2486: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$GREP" && break
+done
+test -n "$GREP" || GREP=": "
+
+echo "$as_me:2494: checking for egrep" >&5
+echo $ECHO_N "checking for egrep... $ECHO_C" >&6
+if test "${ac_cv_path_EGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     for ac_prog in gegrep egrep
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:2506: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_EGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $EGREP in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_EGREP="$EGREP" # Let the user override the test with a path.
+  ;;
+  *)
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  if $as_executable_p "$ac_dir/$ac_word"; then
+   ac_cv_path_EGREP="$ac_dir/$ac_word"
+   echo "$as_me:2523: found $ac_dir/$ac_word" >&5
+   break
+fi
+done
+
+  ;;
+esac
+fi
+EGREP=$ac_cv_path_EGREP
+
+if test -n "$EGREP"; then
+  echo "$as_me:2534: result: $EGREP" >&5
+echo "${ECHO_T}$EGREP" >&6
+else
+  echo "$as_me:2537: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$EGREP" && break
+done
+test -n "$EGREP" || EGREP=": "
+
+     test "x$ac_cv_path_EGREP" = "x:" && { { echo "$as_me:2545: error: cannot find workable egrep" >&5
+echo "$as_me: error: cannot find workable egrep" >&2;}
+   { (exit 1); exit 1; }; }
+   fi
+fi
+echo "$as_me:2550: result: $ac_cv_path_EGREP" >&5
+echo "${ECHO_T}$ac_cv_path_EGREP" >&6
+ EGREP="$ac_cv_path_EGREP"
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
+ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_main_return="return"
+echo "$as_me:2560: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if test "${ac_cv_prog_CPP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 2581 "configure"
+#include "confdefs.h"
+#include <assert.h>
+                     Syntax error
+_ACEOF
+if { (eval echo "$as_me:2586: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:2592: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err "conftest.$ac_ext"
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 2615 "configure"
+#include "confdefs.h"
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:2619: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:2625: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err "conftest.$ac_ext"
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err "conftest.$ac_ext"
+if $ac_preproc_ok; then
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+echo "$as_me:2662: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 2672 "configure"
+#include "confdefs.h"
+#include <assert.h>
+                     Syntax error
+_ACEOF
+if { (eval echo "$as_me:2677: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:2683: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err "conftest.$ac_ext"
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 2706 "configure"
+#include "confdefs.h"
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:2710: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:2716: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err "conftest.$ac_ext"
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err "conftest.$ac_ext"
+if $ac_preproc_ok; then
+  :
+else
+  { { echo "$as_me:2744: error: C preprocessor \"$CPP\" fails sanity check" >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5'
+ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_main_return="return"
+
+for ac_prog in mawk gawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:2760: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_AWK+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_AWK="$ac_prog"
+echo "$as_me:2775: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  echo "$as_me:2783: result: $AWK" >&5
+echo "${ECHO_T}$AWK" >&6
+else
+  echo "$as_me:2786: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$AWK" && break
+done
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo "$as_me:2805: checking for a BSD compatible install" >&5
+echo $ECHO_N "checking for a BSD compatible install... $ECHO_C" >&6
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+    ac_save_IFS=$IFS; IFS=$ac_path_separator
+  for ac_dir in $PATH; do
+    IFS=$ac_save_IFS
+    # Account for people who put trailing slashes in PATH elements.
+    case $ac_dir/ in
+    / | ./ | .// | /cC/* \
+    | /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* \
+    | /usr/ucb/* ) ;;
+    *)
+      # OSF1 and SCO ODT 3.0 have their own names for install.
+      # Don't use installbsd from OSF since it installs stuff as root
+      # by default.
+      for ac_prog in ginstall scoinst install; do
+        if $as_executable_p "$ac_dir/$ac_prog"; then
+	  if test $ac_prog = install &&
+            grep dspmsg "$ac_dir/$ac_prog" >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    :
+	  elif test $ac_prog = install &&
+	    grep pwplus "$ac_dir/$ac_prog" >/dev/null 2>&1; then
+	    # program-specific install script used by HP pwplus--don't use.
+	    :
+	  else
+	    ac_cv_path_install="$ac_dir/$ac_prog -c"
+	    break 2
+	  fi
+	fi
+      done
+      ;;
+    esac
+  done
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  We don't cache a
+    # path for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the path is relative.
+    INSTALL=$ac_install_sh
+  fi
+fi
+echo "$as_me:2854: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+case $INSTALL in
+(/*)
+	;;
+(*)
+	cf_dir=`echo "$INSTALL" | sed -e 's%/[^/]*$%%'`
+	test -z "$cf_dir" && cf_dir=.
+	INSTALL="`cd \"$cf_dir\" && pwd`"/"`echo "$INSTALL" | sed -e 's%^.*/%%'`"
+	;;
+esac
+
+echo "$as_me:2875: checking if you want to install stripped executables" >&5
+echo $ECHO_N "checking if you want to install stripped executables... $ECHO_C" >&6
+
+# Check whether --enable-stripping or --disable-stripping was given.
+if test "${enable_stripping+set}" = set; then
+  enableval="$enable_stripping"
+  test "$enableval" != no && enableval=yes
+	if test "$enableval" != "yes" ; then
+    enable_stripping=no
+	else
+		enable_stripping=yes
+	fi
+else
+  enableval=yes
+	enable_stripping=yes
+
+fi;
+echo "$as_me:2892: result: $enable_stripping" >&5
+echo "${ECHO_T}$enable_stripping" >&6
+
+if test "$enable_stripping" = yes
+then
+	INSTALL_OPT_S="-s"
+else
+	INSTALL_OPT_S=
+fi
+
+: "${INSTALL:=install}"
+echo "$as_me:2903: checking if install accepts -p option" >&5
+echo $ECHO_N "checking if install accepts -p option... $ECHO_C" >&6
+if test "${cf_cv_install_p+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	rm -rf ./conftest*
+	date >conftest.in
+	mkdir conftest.out
+	sleep 3
+	if $INSTALL -p conftest.in conftest.out 2>/dev/null
+	then
+		if test -f conftest.out/conftest.in
+		then
+			test conftest.in -nt conftest.out/conftest.in 2>conftest.err && \
+			test conftest.out/conftest.in -nt conftest.in 2>conftest.err
+			if test -s conftest.err
+			then
+				cf_cv_install_p=no
+			else
+				cf_cv_install_p=yes
+			fi
+		else
+			cf_cv_install_p=no
+		fi
+	else
+		cf_cv_install_p=no
+	fi
+	rm -rf ./conftest*
+
+fi
+echo "$as_me:2934: result: $cf_cv_install_p" >&5
+echo "${ECHO_T}$cf_cv_install_p" >&6
+
+echo "$as_me:2937: checking if install needs to be told about ownership" >&5
+echo $ECHO_N "checking if install needs to be told about ownership... $ECHO_C" >&6
+case `$ac_config_guess` in
+(*minix)
+	with_install_o=yes
+	;;
+(*)
+	with_install_o=no
+	;;
+esac
+
+echo "$as_me:2948: result: $with_install_o" >&5
+echo "${ECHO_T}$with_install_o" >&6
+if test "x$with_install_o" = xyes
+then
+	INSTALL_OPT_O="`id root|sed -e 's/uid=[0-9]*(/ -o /' -e 's/gid=[0-9]*(/ -g /' -e 's/ [^=[:space:]][^=[:space:]]*=.*/ /' -e 's/)//g'`"
+else
+	INSTALL_OPT_O=
+fi
+
+for ac_prog in lint cppcheck splint
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:2961: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_LINT+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$LINT"; then
+  ac_cv_prog_LINT="$LINT" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_LINT="$ac_prog"
+echo "$as_me:2976: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+LINT=$ac_cv_prog_LINT
+if test -n "$LINT"; then
+  echo "$as_me:2984: result: $LINT" >&5
+echo "${ECHO_T}$LINT" >&6
+else
+  echo "$as_me:2987: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$LINT" && break
+done
+
+case "x$LINT" in
+(xcppcheck|x*/cppcheck)
+	test -z "$LINT_OPTS" && LINT_OPTS="--enable=all"
+	;;
+esac
+
+echo "$as_me:3000: checking for \".PHONY\" make-support" >&5
+echo $ECHO_N "checking for \".PHONY\" make-support... $ECHO_C" >&6
+if test "${cf_cv_make_PHONY+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	rm -rf conftest*
+	(
+		mkdir conftest || exit 1
+		cd conftest
+		cat >makefile <<'CF_EOF'
+.PHONY: always
+DATA=0
+always:	always.out
+	@echo "** making $@ $(DATA)"
+once: once.out
+	@echo "** making $@ $(DATA)"
+always.out:
+	@echo "** making $@ $(DATA)"
+	echo $(DATA) > $@
+once.out:
+	@echo "** making $@ $(DATA)"
+	echo $(DATA) > $@
+CF_EOF
+		for cf_data in 1 2 3
+		do
+			${MAKE:-make} always DATA=$cf_data
+			${MAKE:-make} once   DATA=$cf_data
+			${MAKE:-make} -t always once
+			if test -f always ; then
+				echo "no (case 1)" > ../conftest.tmp
+			elif test ! -f always.out ; then
+				echo "no (case 2)" > ../conftest.tmp
+			elif test ! -f once.out ; then
+				echo "no (case 3)" > ../conftest.tmp
+			elif ! cmp -s always.out once.out ; then
+				echo "no (case 4)" > ../conftest.tmp
+				diff always.out once.out
+			else
+				cf_check="`cat always.out`"
+				if test "x$cf_check" != "x$cf_data" ; then
+					echo "no (case 5)" > ../conftest.tmp
+				else
+					echo yes > ../conftest.tmp
+					rm -f ./*.out
+					continue
+				fi
+			fi
+			break
+		done
+	) >&5 2>&1
+	cf_cv_make_PHONY="`cat conftest.tmp`"
+	rm -rf conftest*
+
+fi
+echo "$as_me:3055: result: $cf_cv_make_PHONY" >&5
+echo "${ECHO_T}$cf_cv_make_PHONY" >&6
+MAKE_NO_PHONY="#"
+MAKE_PHONY="#"
+test "x$cf_cv_make_PHONY" = xyes && MAKE_PHONY=
+test "x$cf_cv_make_PHONY" != xyes && MAKE_NO_PHONY=
+
+echo "$as_me:3062: checking if filesystem supports mixed-case filenames" >&5
+echo $ECHO_N "checking if filesystem supports mixed-case filenames... $ECHO_C" >&6
+if test "${cf_cv_mixedcase+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+if test "$cross_compiling" = yes ; then
+	case "$target_alias" in
+	(*-os2-emx*|*-msdosdjgpp*|*-cygwin*|*-msys*|*-mingw*|*-uwin*|darwin*)
+		cf_cv_mixedcase=no
+		;;
+	(*)
+		cf_cv_mixedcase=yes
+		;;
+	esac
+else
+	rm -f conftest CONFTEST
+	echo test >conftest
+	if test -f CONFTEST ; then
+		cf_cv_mixedcase=no
+	else
+		cf_cv_mixedcase=yes
+	fi
+	rm -f conftest CONFTEST
+fi
+
+fi
+echo "$as_me:3089: result: $cf_cv_mixedcase" >&5
+echo "${ECHO_T}$cf_cv_mixedcase" >&6
+test "$cf_cv_mixedcase" = yes &&
+cat >>confdefs.h <<\EOF
+#define MIXEDCASE_FILENAMES 1
+EOF
+
+for ac_prog in exctags ctags
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:3100: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CTAGS+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CTAGS"; then
+  ac_cv_prog_CTAGS="$CTAGS" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_CTAGS="$ac_prog"
+echo "$as_me:3115: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+CTAGS=$ac_cv_prog_CTAGS
+if test -n "$CTAGS"; then
+  echo "$as_me:3123: result: $CTAGS" >&5
+echo "${ECHO_T}$CTAGS" >&6
+else
+  echo "$as_me:3126: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$CTAGS" && break
+done
+
+for ac_prog in exetags etags
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:3137: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ETAGS+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ETAGS"; then
+  ac_cv_prog_ETAGS="$ETAGS" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ETAGS="$ac_prog"
+echo "$as_me:3152: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+ETAGS=$ac_cv_prog_ETAGS
+if test -n "$ETAGS"; then
+  echo "$as_me:3160: result: $ETAGS" >&5
+echo "${ECHO_T}$ETAGS" >&6
+else
+  echo "$as_me:3163: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$ETAGS" && break
+done
+
+# Extract the first word of "${CTAGS:-ctags}", so it can be a program name with args.
+set dummy ${CTAGS:-ctags}; ac_word=$2
+echo "$as_me:3172: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_MAKE_LOWER_TAGS+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$MAKE_LOWER_TAGS"; then
+  ac_cv_prog_MAKE_LOWER_TAGS="$MAKE_LOWER_TAGS" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_MAKE_LOWER_TAGS="yes"
+echo "$as_me:3187: found $ac_dir/$ac_word" >&5
+break
+done
+
+  test -z "$ac_cv_prog_MAKE_LOWER_TAGS" && ac_cv_prog_MAKE_LOWER_TAGS="no"
+fi
+fi
+MAKE_LOWER_TAGS=$ac_cv_prog_MAKE_LOWER_TAGS
+if test -n "$MAKE_LOWER_TAGS"; then
+  echo "$as_me:3196: result: $MAKE_LOWER_TAGS" >&5
+echo "${ECHO_T}$MAKE_LOWER_TAGS" >&6
+else
+  echo "$as_me:3199: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+if test "$cf_cv_mixedcase" = yes ; then
+	# Extract the first word of "${ETAGS:-etags}", so it can be a program name with args.
+set dummy ${ETAGS:-etags}; ac_word=$2
+echo "$as_me:3206: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_MAKE_UPPER_TAGS+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$MAKE_UPPER_TAGS"; then
+  ac_cv_prog_MAKE_UPPER_TAGS="$MAKE_UPPER_TAGS" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_MAKE_UPPER_TAGS="yes"
+echo "$as_me:3221: found $ac_dir/$ac_word" >&5
+break
+done
+
+  test -z "$ac_cv_prog_MAKE_UPPER_TAGS" && ac_cv_prog_MAKE_UPPER_TAGS="no"
+fi
+fi
+MAKE_UPPER_TAGS=$ac_cv_prog_MAKE_UPPER_TAGS
+if test -n "$MAKE_UPPER_TAGS"; then
+  echo "$as_me:3230: result: $MAKE_UPPER_TAGS" >&5
+echo "${ECHO_T}$MAKE_UPPER_TAGS" >&6
+else
+  echo "$as_me:3233: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+else
+	MAKE_UPPER_TAGS=no
+fi
+
+if test "$MAKE_UPPER_TAGS" = yes ; then
+	MAKE_UPPER_TAGS=
+else
+	MAKE_UPPER_TAGS="#"
+fi
+
+if test "$MAKE_LOWER_TAGS" = yes ; then
+	MAKE_LOWER_TAGS=
+else
+	MAKE_LOWER_TAGS="#"
+fi
+
+echo "$as_me:3253: checking if -lm needed for math functions" >&5
+echo $ECHO_N "checking if -lm needed for math functions... $ECHO_C" >&6
+if test "${cf_cv_need_libm+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 3260 "configure"
+#include "confdefs.h"
+
+		#include <stdio.h>
+		#include <stdlib.h>
+		#include <math.h>
+
+int
+main (void)
+{
+double x = rand(); printf("result = %g\\n", pow(sin(x),x))
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:3276: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:3279: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:3282: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:3285: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_need_libm=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_need_libm=yes
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:3295: result: $cf_cv_need_libm" >&5
+echo "${ECHO_T}$cf_cv_need_libm" >&6
+
+if test "$cf_cv_need_libm" = yes
+then
+
+	cf_save_LIBS="$LIBS"
+	LIBS="$LIBS -lm"
+	echo "$as_me:3303: checking if -lm is available for math functions" >&5
+echo $ECHO_N "checking if -lm is available for math functions... $ECHO_C" >&6
+if test "${cf_cv_have_libm+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 3310 "configure"
+#include "confdefs.h"
+
+		#include <stdio.h>
+		#include <stdlib.h>
+		#include <math.h>
+
+int
+main (void)
+{
+double x = rand(); printf("result = %g\\n", pow(sin(x),x))
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:3326: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:3329: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:3332: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:3335: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_have_libm=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_have_libm=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:3345: result: $cf_cv_have_libm" >&5
+echo "${ECHO_T}$cf_cv_have_libm" >&6
+	LIBS="$cf_save_LIBS"
+
+	if test "$cf_cv_have_libm" = yes
+	then
+		MATH_LIB=-lm
+	fi
+else
+	cf_cv_have_libm=yes
+fi
+
+if test "$cf_cv_have_libm" = yes
+then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_MATH_FUNCS 1
+EOF
+
+fi
+
+top_builddir=`pwd`
+
+CC_G_OPT="-g"
+CC_SHARED_OPTS=unknown
+CPPFLAGS="$CPPFLAGS"
+DFT_DEP_SUFFIX=""
+DFT_OBJ_SUBDIR=`pwd|sed -e's:.*/::'`
+DFT_UPR_MODEL="NORMAL"
+LD="ld"
+LDFLAGS_SHARED=""
+LDFLAGS_STATIC=""
+LD_MODEL=""
+LD_SHARED_OPTS=""
+LIBTOOL=""
+LIBTOOL_OPTS=""
+LIB_CLEAN=""
+LIB_COMPILE=""
+LIB_LINK='${CC}'
+LINK_TESTS=""
+LOCAL_LDFLAGS=""
+PACKAGE="ncurses-examples"
+PTHREAD="-lm"
+TEST_ARGS=""
+TEST_DEPS=""
+TEST_LIBS=""
+TINFO_LDFLAGS=''
+TINFO_LIBS='$(LIBS_CURSES)'
+cf_cv_abi_version=""
+cf_cv_rel_version=""
+includesubdir=""
+
+cf_cv_screen=curses
+cf_cv_libtype=
+
+echo "$as_me:3400: checking for fgrep" >&5
+echo $ECHO_N "checking for fgrep... $ECHO_C" >&6
+if test "${ac_cv_path_FGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
+   then ac_cv_path_FGREP="$GREP -F"
+   else
+     for ac_prog in gfgrep fgrep
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:3412: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_FGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $FGREP in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_FGREP="$FGREP" # Let the user override the test with a path.
+  ;;
+  *)
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  if $as_executable_p "$ac_dir/$ac_word"; then
+   ac_cv_path_FGREP="$ac_dir/$ac_word"
+   echo "$as_me:3429: found $ac_dir/$ac_word" >&5
+   break
+fi
+done
+
+  ;;
+esac
+fi
+FGREP=$ac_cv_path_FGREP
+
+if test -n "$FGREP"; then
+  echo "$as_me:3440: result: $FGREP" >&5
+echo "${ECHO_T}$FGREP" >&6
+else
+  echo "$as_me:3443: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$FGREP" && break
+done
+test -n "$FGREP" || FGREP=": "
+
+     test "x$ac_cv_path_FGREP" = "x:" && { { echo "$as_me:3451: error: cannot find workable fgrep" >&5
+echo "$as_me: error: cannot find workable fgrep" >&2;}
+   { (exit 1); exit 1; }; }
+   fi
+fi
+echo "$as_me:3456: result: $ac_cv_path_FGREP" >&5
+echo "${ECHO_T}$ac_cv_path_FGREP" >&6
+ FGREP="$ac_cv_path_FGREP"
+
+echo "$as_me:3460: checking if you want to use C11 _Noreturn feature" >&5
+echo $ECHO_N "checking if you want to use C11 _Noreturn feature... $ECHO_C" >&6
+
+# Check whether --enable-stdnoreturn or --disable-stdnoreturn was given.
+if test "${enable_stdnoreturn+set}" = set; then
+  enableval="$enable_stdnoreturn"
+  test "$enableval" != yes && enableval=no
+	if test "$enableval" != "no" ; then
+    enable_stdnoreturn=yes
+	else
+		enable_stdnoreturn=no
+	fi
+else
+  enableval=no
+	enable_stdnoreturn=no
+
+fi;
+echo "$as_me:3477: result: $enable_stdnoreturn" >&5
+echo "${ECHO_T}$enable_stdnoreturn" >&6
+
+if test $enable_stdnoreturn = yes; then
+echo "$as_me:3481: checking for C11 _Noreturn feature" >&5
+echo $ECHO_N "checking for C11 _Noreturn feature... $ECHO_C" >&6
+if test "${cf_cv_c11_noreturn+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 3487 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdnoreturn.h>
+static _Noreturn void giveup(void) { exit(0); }
+
+int
+main (void)
+{
+if (feof(stdin)) giveup()
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:3504: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:3507: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:3510: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:3513: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_c11_noreturn=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_c11_noreturn=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:3524: result: $cf_cv_c11_noreturn" >&5
+echo "${ECHO_T}$cf_cv_c11_noreturn" >&6
+else
+	cf_cv_c11_noreturn=no,
+fi
+
+if test "$cf_cv_c11_noreturn" = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_STDNORETURN_H 1
+EOF
+
+cat >>confdefs.h <<EOF
+#define STDC_NORETURN _Noreturn
+EOF
+
+	HAVE_STDNORETURN_H=1
+else
+	HAVE_STDNORETURN_H=0
+fi
+
+if test "$GCC" = yes || test "$GXX" = yes
+then
+cat > conftest.i <<EOF
+#ifndef GCC_PRINTF
+#define GCC_PRINTF 0
+#endif
+#ifndef GCC_SCANF
+#define GCC_SCANF 0
+#endif
+#ifndef GCC_NORETURN
+#define GCC_NORETURN /* nothing */
+#endif
+#ifndef GCC_UNUSED
+#define GCC_UNUSED /* nothing */
+#endif
+EOF
+if test "$GCC" = yes
+then
+	{ echo "$as_me:3563: checking for $CC __attribute__ directives..." >&5
+echo "$as_me: checking for $CC __attribute__ directives..." >&6;}
+cat > "conftest.$ac_ext" <<EOF
+#line 3566 "${as_me:-configure}"
+#include "confdefs.h"
+#include "conftest.h"
+#include "conftest.i"
+#if	GCC_PRINTF
+#define GCC_PRINTFLIKE(fmt,var) __attribute__((format(printf,fmt,var)))
+#else
+#define GCC_PRINTFLIKE(fmt,var) /*nothing*/
+#endif
+#if	GCC_SCANF
+#define GCC_SCANFLIKE(fmt,var)  __attribute__((format(scanf,fmt,var)))
+#else
+#define GCC_SCANFLIKE(fmt,var)  /*nothing*/
+#endif
+extern void wow(char *,...) GCC_SCANFLIKE(1,2);
+extern GCC_NORETURN void oops(char *,...) GCC_PRINTFLIKE(1,2);
+extern GCC_NORETURN void foo(void);
+int main(int argc GCC_UNUSED, char *argv[] GCC_UNUSED) { (void)argc; (void)argv; return 0; }
+EOF
+	cf_printf_attribute=no
+	cf_scanf_attribute=no
+	for cf_attribute in scanf printf unused noreturn
+	do
+
+cf_ATTRIBUTE=`echo "$cf_attribute" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+		cf_directive="__attribute__(($cf_attribute))"
+		echo "checking for $CC $cf_directive" 1>&5
+
+		case "$cf_attribute" in
+		(printf)
+			cf_printf_attribute=yes
+			cat >conftest.h <<EOF
+#define GCC_$cf_ATTRIBUTE 1
+EOF
+			;;
+		(scanf)
+			cf_scanf_attribute=yes
+			cat >conftest.h <<EOF
+#define GCC_$cf_ATTRIBUTE 1
+EOF
+			;;
+		(*)
+			cat >conftest.h <<EOF
+#define GCC_$cf_ATTRIBUTE $cf_directive
+EOF
+			;;
+		esac
+
+		if { (eval echo "$as_me:3615: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:3618: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; then
+			test -n "$verbose" && echo "$as_me:3620: result: ... $cf_attribute" >&5
+echo "${ECHO_T}... $cf_attribute" >&6
+			cat conftest.h >>confdefs.h
+			case "$cf_attribute" in
+			(noreturn)
+
+cat >>confdefs.h <<EOF
+#define GCC_NORETURN $cf_directive
+EOF
+
+				;;
+			(printf)
+				cf_value='/* nothing */'
+				if test "$cf_printf_attribute" != no ; then
+					cf_value='__attribute__((format(printf,fmt,var)))'
+
+cat >>confdefs.h <<\EOF
+#define GCC_PRINTF 1
+EOF
+
+				fi
+
+cat >>confdefs.h <<EOF
+#define GCC_PRINTFLIKE(fmt,var) $cf_value
+EOF
+
+				;;
+			(scanf)
+				cf_value='/* nothing */'
+				if test "$cf_scanf_attribute" != no ; then
+					cf_value='__attribute__((format(scanf,fmt,var)))'
+
+cat >>confdefs.h <<\EOF
+#define GCC_SCANF 1
+EOF
+
+				fi
+
+cat >>confdefs.h <<EOF
+#define GCC_SCANFLIKE(fmt,var) $cf_value
+EOF
+
+				;;
+			(unused)
+
+cat >>confdefs.h <<EOF
+#define GCC_UNUSED $cf_directive
+EOF
+
+				;;
+			esac
+		fi
+	done
+else
+	${FGREP-fgrep} define conftest.i >>confdefs.h
+fi
+rm -rf ./conftest*
+fi
+
+echo "$as_me:3679: checking if you want to work around bogus compiler/loader warnings" >&5
+echo $ECHO_N "checking if you want to work around bogus compiler/loader warnings... $ECHO_C" >&6
+
+# Check whether --enable-string-hacks or --disable-string-hacks was given.
+if test "${enable_string_hacks+set}" = set; then
+  enableval="$enable_string_hacks"
+  enable_string_hacks=$enableval
+else
+  enable_string_hacks=no
+fi;
+echo "$as_me:3689: result: $enable_string_hacks" >&5
+echo "${ECHO_T}$enable_string_hacks" >&6
+
+if test "x$enable_string_hacks" = "xyes"; then
+
+cat >>confdefs.h <<\EOF
+#define USE_STRING_HACKS 1
+EOF
+
+	{ echo "$as_me:3698: WARNING: enabling string-hacks to work around bogus compiler/loader warnings" >&5
+echo "$as_me: WARNING: enabling string-hacks to work around bogus compiler/loader warnings" >&2;}
+	echo "$as_me:3700: checking for strlcat" >&5
+echo $ECHO_N "checking for strlcat... $ECHO_C" >&6
+if test "${ac_cv_func_strlcat+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 3706 "configure"
+#include "confdefs.h"
+#define strlcat autoconf_temporary
+#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
+#undef strlcat
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char strlcat (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_strlcat) || defined (__stub___strlcat)
+#error found stub for strlcat
+#endif
+
+	return strlcat ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:3737: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:3740: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:3743: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:3746: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_func_strlcat=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_strlcat=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:3756: result: $ac_cv_func_strlcat" >&5
+echo "${ECHO_T}$ac_cv_func_strlcat" >&6
+if test "$ac_cv_func_strlcat" = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_STRLCAT 1
+EOF
+
+else
+
+		echo "$as_me:3766: checking for strlcat in -lbsd" >&5
+echo $ECHO_N "checking for strlcat in -lbsd... $ECHO_C" >&6
+if test "${ac_cv_lib_bsd_strlcat+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lbsd  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 3774 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char strlcat ();
+int
+main (void)
+{
+strlcat ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:3793: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:3796: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:3799: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:3802: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_bsd_strlcat=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_bsd_strlcat=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:3813: result: $ac_cv_lib_bsd_strlcat" >&5
+echo "${ECHO_T}$ac_cv_lib_bsd_strlcat" >&6
+if test "$ac_cv_lib_bsd_strlcat" = yes; then
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lbsd; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+for ac_header in bsd/string.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:3836: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 3842 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:3846: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:3852: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:3871: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+cat >>confdefs.h <<\EOF
+#define HAVE_STRLCAT 1
+EOF
+
+fi
+
+fi
+
+for ac_func in strlcpy snprintf
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:3892: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 3898 "configure"
+#include "confdefs.h"
+#define $ac_func autoconf_temporary
+#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
+#undef $ac_func
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char $ac_func (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+#error found stub for $ac_func
+#endif
+
+	return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:3929: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:3932: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:3935: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:3938: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_var=no"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:3948: result: `eval echo '${'"$as_ac_var"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6
+if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+fi
+
+echo "$as_me:3960: checking if the POSIX test-macros are already defined" >&5
+echo $ECHO_N "checking if the POSIX test-macros are already defined... $ECHO_C" >&6
+if test "${cf_cv_posix_visible+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 3967 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+
+#if defined(__POSIX_VISIBLE) && ((__POSIX_VISIBLE - 0L) > 0) \
+	&& defined(__XSI_VISIBLE) && ((__XSI_VISIBLE - 0L) > 0) \
+	&& defined(__BSD_VISIBLE) && ((__BSD_VISIBLE - 0L) > 0) \
+	&& defined(__ISO_C_VISIBLE) && ((__ISO_C_VISIBLE - 0L) > 0)
+#error conflicting symbols found
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:3986: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:3989: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:3992: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:3995: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_posix_visible=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_posix_visible=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:4006: result: $cf_cv_posix_visible" >&5
+echo "${ECHO_T}$cf_cv_posix_visible" >&6
+
+if test "$cf_cv_posix_visible" = no; then
+
+cf_XOPEN_SOURCE=600
+cf_POSIX_C_SOURCE=199506L
+cf_xopen_source=
+
+case "$host_os" in
+(aix[4-7]*)
+	cf_xopen_source="-D_ALL_SOURCE"
+	;;
+(msys)
+	cf_XOPEN_SOURCE=600
+	;;
+(darwin[0-8].*)
+	cf_xopen_source="-D_APPLE_C_SOURCE"
+	;;
+(darwin*)
+	cf_xopen_source="-D_DARWIN_C_SOURCE"
+	cf_XOPEN_SOURCE=
+	;;
+(freebsd*|dragonfly*|midnightbsd*)
+	# 5.x headers associate
+	#	_XOPEN_SOURCE=600 with _POSIX_C_SOURCE=200112L
+	#	_XOPEN_SOURCE=500 with _POSIX_C_SOURCE=199506L
+	cf_POSIX_C_SOURCE=200112L
+	cf_XOPEN_SOURCE=600
+	cf_xopen_source="-D_BSD_TYPES -D__BSD_VISIBLE -D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE -D_XOPEN_SOURCE=$cf_XOPEN_SOURCE"
+	;;
+(hpux11*)
+	cf_xopen_source="-D_HPUX_SOURCE -D_XOPEN_SOURCE=500"
+	;;
+(hpux*)
+	cf_xopen_source="-D_HPUX_SOURCE"
+	;;
+(irix[56].*)
+	cf_xopen_source="-D_SGI_SOURCE"
+	cf_XOPEN_SOURCE=
+	;;
+(linux*gnu|linux*gnuabi64|linux*gnuabin32|linux*gnueabi|linux*gnueabihf|linux*gnux32|uclinux*|gnu*|mint*|k*bsd*-gnu|cygwin)
+
+cf_gnu_xopen_source=$cf_XOPEN_SOURCE
+
+echo "$as_me:4051: checking if this is the GNU C library" >&5
+echo $ECHO_N "checking if this is the GNU C library... $ECHO_C" >&6
+if test "${cf_cv_gnu_library+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 4058 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+	#if __GLIBC__ > 0 && __GLIBC_MINOR__ >= 0
+		return 0;
+	#elif __NEWLIB__ > 0 && __NEWLIB_MINOR__ >= 0
+		return 0;
+	#else
+	#	error not GNU C library
+	#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:4077: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:4080: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:4083: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:4086: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_gnu_library=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_gnu_library=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:4097: result: $cf_cv_gnu_library" >&5
+echo "${ECHO_T}$cf_cv_gnu_library" >&6
+
+if test x$cf_cv_gnu_library = xyes; then
+
+	# With glibc 2.19 (13 years after this check was begun), _DEFAULT_SOURCE
+	# was changed to help a little.  newlib incorporated the change about 4
+	# years later.
+	echo "$as_me:4105: checking if _DEFAULT_SOURCE can be used as a basis" >&5
+echo $ECHO_N "checking if _DEFAULT_SOURCE can be used as a basis... $ECHO_C" >&6
+if test "${cf_cv_gnu_library_219+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+		cf_save="$CPPFLAGS"
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-D_DEFAULT_SOURCE"
+
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 4117 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+			#if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 19) || (__GLIBC__ > 2)
+				return 0;
+			#elif (__NEWLIB__ == 2 && __NEWLIB_MINOR__ >= 4) || (__GLIBC__ > 3)
+				return 0;
+			#else
+			#	error GNU C library __GLIBC__.__GLIBC_MINOR__ is too old
+			#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:4136: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:4139: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:4142: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:4145: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_gnu_library_219=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_gnu_library_219=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+		CPPFLAGS="$cf_save"
+
+fi
+echo "$as_me:4157: result: $cf_cv_gnu_library_219" >&5
+echo "${ECHO_T}$cf_cv_gnu_library_219" >&6
+
+	if test "x$cf_cv_gnu_library_219" = xyes; then
+		cf_save="$CPPFLAGS"
+		echo "$as_me:4162: checking if _XOPEN_SOURCE=$cf_gnu_xopen_source works with _DEFAULT_SOURCE" >&5
+echo $ECHO_N "checking if _XOPEN_SOURCE=$cf_gnu_xopen_source works with _DEFAULT_SOURCE... $ECHO_C" >&6
+if test "${cf_cv_gnu_dftsrc_219+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=$cf_gnu_xopen_source
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+			cat >"conftest.$ac_ext" <<_ACEOF
+#line 4267 "configure"
+#include "confdefs.h"
+
+				#include <limits.h>
+				#include <sys/types.h>
+
+int
+main (void)
+{
+
+				#if (_XOPEN_SOURCE >= $cf_gnu_xopen_source) && (MB_LEN_MAX > 1)
+					return 0;
+				#else
+				#	error GNU C library is too old
+				#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:4287: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:4290: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:4293: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:4296: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_gnu_dftsrc_219=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_gnu_dftsrc_219=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:4307: result: $cf_cv_gnu_dftsrc_219" >&5
+echo "${ECHO_T}$cf_cv_gnu_dftsrc_219" >&6
+		test "x$cf_cv_gnu_dftsrc_219" = "xyes" || CPPFLAGS="$cf_save"
+	else
+		cf_cv_gnu_dftsrc_219=maybe
+	fi
+
+	if test "x$cf_cv_gnu_dftsrc_219" != xyes; then
+
+		echo "$as_me:4316: checking if we must define _GNU_SOURCE" >&5
+echo $ECHO_N "checking if we must define _GNU_SOURCE... $ECHO_C" >&6
+if test "${cf_cv_gnu_source+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 4323 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+			#ifndef _XOPEN_SOURCE
+			#error	expected _XOPEN_SOURCE to be defined
+			#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:4338: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:4341: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:4344: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:4347: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_gnu_source=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_save="$CPPFLAGS"
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in -D_GNU_SOURCE
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+			 cat >"conftest.$ac_ext" <<_ACEOF
+#line 4454 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+				#ifdef _XOPEN_SOURCE
+				#error	expected _XOPEN_SOURCE to be undefined
+				#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:4469: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:4472: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:4475: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:4478: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_gnu_source=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_gnu_source=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+			CPPFLAGS="$cf_save"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:4493: result: $cf_cv_gnu_source" >&5
+echo "${ECHO_T}$cf_cv_gnu_source" >&6
+
+		if test "$cf_cv_gnu_source" = yes
+		then
+		echo "$as_me:4498: checking if we should also define _DEFAULT_SOURCE" >&5
+echo $ECHO_N "checking if we should also define _DEFAULT_SOURCE... $ECHO_C" >&6
+if test "${cf_cv_default_source+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-D_GNU_SOURCE"
+
+			cat >"conftest.$ac_ext" <<_ACEOF
+#line 4508 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+				#ifdef _DEFAULT_SOURCE
+				#error	expected _DEFAULT_SOURCE to be undefined
+				#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:4523: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:4526: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:4529: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:4532: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_default_source=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_default_source=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:4543: result: $cf_cv_default_source" >&5
+echo "${ECHO_T}$cf_cv_default_source" >&6
+			if test "$cf_cv_default_source" = yes
+			then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-D_DEFAULT_SOURCE"
+
+			fi
+		fi
+	fi
+
+fi
+
+	;;
+(minix*)
+	cf_xopen_source="-D_NETBSD_SOURCE" # POSIX.1-2001 features are ifdef'd with this...
+	;;
+(mirbsd*)
+	# setting _XOPEN_SOURCE or _POSIX_SOURCE breaks <sys/select.h> and other headers which use u_int / u_short types
+	cf_XOPEN_SOURCE=
+
+if test "$cf_cv_posix_visible" = no; then
+
+cf_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE
+
+cf_save_CFLAGS="$CFLAGS"
+cf_save_CPPFLAGS="$CPPFLAGS"
+
+cf_trim_CFLAGS=`echo "$cf_save_CFLAGS" | \
+	sed	-e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ 	]*\)\?$//g'`
+
+cf_trim_CPPFLAGS=`echo "$cf_save_CPPFLAGS" | \
+	sed	-e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ 	]*\)\?$//g'`
+
+echo "$as_me:4580: checking if we should define _POSIX_C_SOURCE" >&5
+echo $ECHO_N "checking if we should define _POSIX_C_SOURCE... $ECHO_C" >&6
+if test "${cf_cv_posix_c_source+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+echo "${as_me:-configure}:4586: testing if the symbol is already defined go no further ..." 1>&5
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 4589 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+#ifndef _POSIX_C_SOURCE
+make an error
+#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:4604: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:4607: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:4610: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:4613: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_posix_c_source=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_want_posix_source=no
+	 case .$cf_POSIX_C_SOURCE in
+	 (.[12]??*)
+		cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE"
+		;;
+	 (.2)
+		cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE"
+		cf_want_posix_source=yes
+		;;
+	 (.*)
+		cf_want_posix_source=yes
+		;;
+	 esac
+	 if test "$cf_want_posix_source" = yes ; then
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 4634 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+#ifdef _POSIX_SOURCE
+make an error
+#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:4649: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:4652: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:4655: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:4658: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_posix_c_source="$cf_cv_posix_c_source -D_POSIX_SOURCE"
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+	 fi
+
+echo "${as_me:-configure}:4669: testing ifdef from value $cf_POSIX_C_SOURCE ..." 1>&5
+
+	 CFLAGS="$cf_trim_CFLAGS"
+	 CPPFLAGS="$cf_trim_CPPFLAGS"
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_cv_posix_c_source"
+
+echo "${as_me:-configure}:4677: testing if the second compile does not leave our definition intact error ..." 1>&5
+
+	 cat >"conftest.$ac_ext" <<_ACEOF
+#line 4680 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+#ifndef _POSIX_C_SOURCE
+make an error
+#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:4695: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:4698: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:4701: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:4704: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_posix_c_source=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+	 CFLAGS="$cf_save_CFLAGS"
+	 CPPFLAGS="$cf_save_CPPFLAGS"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:4720: result: $cf_cv_posix_c_source" >&5
+echo "${ECHO_T}$cf_cv_posix_c_source" >&6
+
+if test "$cf_cv_posix_c_source" != no ; then
+	CFLAGS="$cf_trim_CFLAGS"
+	CPPFLAGS="$cf_trim_CPPFLAGS"
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_cv_posix_c_source
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+fi
+
+fi # cf_cv_posix_visible
+
+	;;
+(netbsd*)
+	cf_xopen_source="-D_NETBSD_SOURCE" # setting _XOPEN_SOURCE breaks IPv6 for lynx on NetBSD 1.6, breaks xterm, is not needed for ncursesw
+	;;
+(openbsd[6-9]*)
+	# OpenBSD 6.x has broken locale support, both compile-time and runtime.
+	# see https://www.mail-archive.com/bugs@openbsd.org/msg13200.html
+	# Abusing the conformance level is a workaround.
+	{ echo "$as_me:4837: WARNING: this system does not provide usable locale support" >&5
+echo "$as_me: WARNING: this system does not provide usable locale support" >&2;}
+	cf_xopen_source="-D_BSD_SOURCE"
+	cf_XOPEN_SOURCE=700
+	;;
+(openbsd[4-5]*)
+	# setting _XOPEN_SOURCE lower than 500 breaks g++ compile with wchar.h, needed for ncursesw
+	cf_xopen_source="-D_BSD_SOURCE"
+	cf_XOPEN_SOURCE=600
+	;;
+(openbsd*)
+	# setting _XOPEN_SOURCE breaks xterm on OpenBSD 2.8, is not needed for ncursesw
+	;;
+(osf[45]*)
+	cf_xopen_source="-D_OSF_SOURCE"
+	;;
+(nto-qnx*)
+	cf_xopen_source="-D_QNX_SOURCE"
+	;;
+(sco*)
+	# setting _XOPEN_SOURCE breaks Lynx on SCO Unix / OpenServer
+	;;
+(solaris2.*)
+	cf_xopen_source="-D__EXTENSIONS__"
+	cf_cv_xopen_source=broken
+	;;
+(sysv4.2uw2.*) # Novell/SCO UnixWare 2.x (tested on 2.1.2)
+	cf_XOPEN_SOURCE=
+	cf_POSIX_C_SOURCE=
+	;;
+(*)
+
+echo "$as_me:4869: checking if we should define _XOPEN_SOURCE" >&5
+echo $ECHO_N "checking if we should define _XOPEN_SOURCE... $ECHO_C" >&6
+if test "${cf_cv_xopen_source+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 4876 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+int
+main (void)
+{
+
+#ifndef _XOPEN_SOURCE
+make an error
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:4896: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:4899: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:4902: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:4905: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_xopen_source=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_save="$CPPFLAGS"
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-D_XOPEN_SOURCE=$cf_XOPEN_SOURCE"
+
+	 cat >"conftest.$ac_ext" <<_ACEOF
+#line 4917 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+int
+main (void)
+{
+
+#ifndef _XOPEN_SOURCE
+make an error
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:4937: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:4940: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:4943: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:4946: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_xopen_source=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_xopen_source=$cf_XOPEN_SOURCE
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+		CPPFLAGS="$cf_save"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:4961: result: $cf_cv_xopen_source" >&5
+echo "${ECHO_T}$cf_cv_xopen_source" >&6
+
+if test "$cf_cv_xopen_source" != no ; then
+
+CFLAGS=`echo "$CFLAGS" | \
+	sed	-e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ 	]*\)\?$//g'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ 	]*\)\?$//g'`
+
+	cf_temp_xopen_source="-D_XOPEN_SOURCE=$cf_cv_xopen_source"
+
+for cf_add_cflags in $cf_temp_xopen_source
+do
+	case "x$cf_add_cflags" in
+	(x-[DU]*)
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CFLAGS" != "$cf_old_cflag" || break
+
+	CFLAGS="$cf_old_cflag"
+done
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CPPFLAGS" != "$cf_old_cflag" || break
+
+	CPPFLAGS="$cf_old_cflag"
+done
+
+		;;
+	esac
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_add_cflags
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+done
+
+fi
+
+	cf_save_xopen_cppflags="$CPPFLAGS"
+
+if test "$cf_cv_posix_visible" = no; then
+
+cf_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE
+
+cf_save_CFLAGS="$CFLAGS"
+cf_save_CPPFLAGS="$CPPFLAGS"
+
+cf_trim_CFLAGS=`echo "$cf_save_CFLAGS" | \
+	sed	-e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ 	]*\)\?$//g'`
+
+cf_trim_CPPFLAGS=`echo "$cf_save_CPPFLAGS" | \
+	sed	-e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ 	]*\)\?$//g'`
+
+echo "$as_me:5121: checking if we should define _POSIX_C_SOURCE" >&5
+echo $ECHO_N "checking if we should define _POSIX_C_SOURCE... $ECHO_C" >&6
+if test "${cf_cv_posix_c_source+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+echo "${as_me:-configure}:5127: testing if the symbol is already defined go no further ..." 1>&5
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 5130 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+#ifndef _POSIX_C_SOURCE
+make an error
+#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:5145: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:5148: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:5151: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:5154: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_posix_c_source=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_want_posix_source=no
+	 case .$cf_POSIX_C_SOURCE in
+	 (.[12]??*)
+		cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE"
+		;;
+	 (.2)
+		cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE"
+		cf_want_posix_source=yes
+		;;
+	 (.*)
+		cf_want_posix_source=yes
+		;;
+	 esac
+	 if test "$cf_want_posix_source" = yes ; then
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 5175 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+#ifdef _POSIX_SOURCE
+make an error
+#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:5190: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:5193: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:5196: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:5199: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_posix_c_source="$cf_cv_posix_c_source -D_POSIX_SOURCE"
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+	 fi
+
+echo "${as_me:-configure}:5210: testing ifdef from value $cf_POSIX_C_SOURCE ..." 1>&5
+
+	 CFLAGS="$cf_trim_CFLAGS"
+	 CPPFLAGS="$cf_trim_CPPFLAGS"
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_cv_posix_c_source"
+
+echo "${as_me:-configure}:5218: testing if the second compile does not leave our definition intact error ..." 1>&5
+
+	 cat >"conftest.$ac_ext" <<_ACEOF
+#line 5221 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int
+main (void)
+{
+
+#ifndef _POSIX_C_SOURCE
+make an error
+#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:5236: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:5239: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:5242: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:5245: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_posix_c_source=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+	 CFLAGS="$cf_save_CFLAGS"
+	 CPPFLAGS="$cf_save_CPPFLAGS"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:5261: result: $cf_cv_posix_c_source" >&5
+echo "${ECHO_T}$cf_cv_posix_c_source" >&6
+
+if test "$cf_cv_posix_c_source" != no ; then
+	CFLAGS="$cf_trim_CFLAGS"
+	CPPFLAGS="$cf_trim_CPPFLAGS"
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_cv_posix_c_source
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+fi
+
+fi # cf_cv_posix_visible
+
+	# Some of these niche implementations use copy/paste, double-check...
+	test -n "$verbose" && echo "	checking if _POSIX_C_SOURCE inteferes" 1>&6
+
+echo "${as_me:-configure}:5373: testing checking if _POSIX_C_SOURCE inteferes ..." 1>&5
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 5376 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+int
+main (void)
+{
+
+#ifndef _XOPEN_SOURCE
+make an error
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:5396: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:5399: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:5402: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:5405: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+		{ echo "$as_me:5412: WARNING: _POSIX_C_SOURCE definition is not usable" >&5
+echo "$as_me: WARNING: _POSIX_C_SOURCE definition is not usable" >&2;}
+		CPPFLAGS="$cf_save_xopen_cppflags"
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+	;;
+esac
+
+if test -n "$cf_xopen_source" ; then
+
+for cf_add_cflags in $cf_xopen_source
+do
+	case "x$cf_add_cflags" in
+	(x-[DU]*)
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CFLAGS" != "$cf_old_cflag" || break
+	test -n "$verbose" && echo "	removing old option $cf_add_cflags from CFLAGS" 1>&6
+
+echo "${as_me:-configure}:5434: testing removing old option $cf_add_cflags from CFLAGS ..." 1>&5
+
+	CFLAGS="$cf_old_cflag"
+done
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CPPFLAGS" != "$cf_old_cflag" || break
+	test -n "$verbose" && echo "	removing old option $cf_add_cflags from CPPFLAGS" 1>&6
+
+echo "${as_me:-configure}:5446: testing removing old option $cf_add_cflags from CPPFLAGS ..." 1>&5
+
+	CPPFLAGS="$cf_old_cflag"
+done
+
+		;;
+	esac
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_add_cflags
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+	test -n "$verbose" && echo "	add to \$CFLAGS $cf_new_cflags" 1>&6
+
+echo "${as_me:-configure}:5534: testing add to \$CFLAGS $cf_new_cflags ..." 1>&5
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+	test -n "$verbose" && echo "	add to \$CPPFLAGS $cf_new_cppflags" 1>&6
+
+echo "${as_me:-configure}:5544: testing add to \$CPPFLAGS $cf_new_cppflags ..." 1>&5
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+	test -n "$verbose" && echo "	add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags" 1>&6
+
+echo "${as_me:-configure}:5554: testing add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags ..." 1>&5
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+done
+
+fi
+
+if test -n "$cf_XOPEN_SOURCE" && test -z "$cf_cv_xopen_source" ; then
+	echo "$as_me:5566: checking if _XOPEN_SOURCE really is set" >&5
+echo $ECHO_N "checking if _XOPEN_SOURCE really is set... $ECHO_C" >&6
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 5569 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+int
+main (void)
+{
+
+#ifndef _XOPEN_SOURCE
+make an error
+#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:5584: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:5587: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:5590: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:5593: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_XOPEN_SOURCE_set=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_XOPEN_SOURCE_set=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+	echo "$as_me:5602: result: $cf_XOPEN_SOURCE_set" >&5
+echo "${ECHO_T}$cf_XOPEN_SOURCE_set" >&6
+	if test "$cf_XOPEN_SOURCE_set" = yes
+	then
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 5607 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+int
+main (void)
+{
+
+#if (_XOPEN_SOURCE - 0) < $cf_XOPEN_SOURCE
+make an error
+#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:5622: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:5625: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:5628: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:5631: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_XOPEN_SOURCE_set_ok=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_XOPEN_SOURCE_set_ok=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+		if test "$cf_XOPEN_SOURCE_set_ok" = no
+		then
+			{ echo "$as_me:5642: WARNING: _XOPEN_SOURCE is lower than requested" >&5
+echo "$as_me: WARNING: _XOPEN_SOURCE is lower than requested" >&2;}
+		fi
+	else
+
+echo "$as_me:5647: checking if we should define _XOPEN_SOURCE" >&5
+echo $ECHO_N "checking if we should define _XOPEN_SOURCE... $ECHO_C" >&6
+if test "${cf_cv_xopen_source+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 5654 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+int
+main (void)
+{
+
+#ifndef _XOPEN_SOURCE
+make an error
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:5674: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:5677: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:5680: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:5683: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_xopen_source=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_save="$CPPFLAGS"
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-D_XOPEN_SOURCE=$cf_XOPEN_SOURCE"
+
+	 cat >"conftest.$ac_ext" <<_ACEOF
+#line 5695 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+int
+main (void)
+{
+
+#ifndef _XOPEN_SOURCE
+make an error
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:5715: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:5718: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:5721: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:5724: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_xopen_source=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_xopen_source=$cf_XOPEN_SOURCE
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+		CPPFLAGS="$cf_save"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:5739: result: $cf_cv_xopen_source" >&5
+echo "${ECHO_T}$cf_cv_xopen_source" >&6
+
+if test "$cf_cv_xopen_source" != no ; then
+
+CFLAGS=`echo "$CFLAGS" | \
+	sed	-e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ 	]*\)\?$//g'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ 	]*\)\?$//g'`
+
+	cf_temp_xopen_source="-D_XOPEN_SOURCE=$cf_cv_xopen_source"
+
+for cf_add_cflags in $cf_temp_xopen_source
+do
+	case "x$cf_add_cflags" in
+	(x-[DU]*)
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CFLAGS" != "$cf_old_cflag" || break
+
+	CFLAGS="$cf_old_cflag"
+done
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CPPFLAGS" != "$cf_old_cflag" || break
+
+	CPPFLAGS="$cf_old_cflag"
+done
+
+		;;
+	esac
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_add_cflags
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+done
+
+fi
+
+	fi
+fi
+fi # cf_cv_posix_visible
+
+echo "$as_me:5886: checking for signal global datatype" >&5
+echo $ECHO_N "checking for signal global datatype... $ECHO_C" >&6
+if test "${cf_cv_sig_atomic_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	for cf_type in \
+		"volatile sig_atomic_t" \
+		"sig_atomic_t" \
+		"int"
+	do
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 5898 "configure"
+#include "confdefs.h"
+
+#include <sys/types.h>
+#include <signal.h>
+#include <stdio.h>
+
+extern $cf_type x;
+$cf_type x;
+static void handler(int sig)
+{
+	(void)sig;
+	x = 5;
+}
+int
+main (void)
+{
+signal(SIGINT, handler);
+		 x = 1
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:5922: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:5925: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:5928: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:5931: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_sig_atomic_t=$cf_type
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_sig_atomic_t=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+		test "$cf_cv_sig_atomic_t" != no && break
+	done
+
+fi
+
+echo "$as_me:5945: result: $cf_cv_sig_atomic_t" >&5
+echo "${ECHO_T}$cf_cv_sig_atomic_t" >&6
+test "$cf_cv_sig_atomic_t" != no &&
+cat >>confdefs.h <<EOF
+#define SIG_ATOMIC_T $cf_cv_sig_atomic_t
+EOF
+
+# Work around breakage on OS X
+
+echo "$as_me:5954: checking if SIGWINCH is defined" >&5
+echo $ECHO_N "checking if SIGWINCH is defined... $ECHO_C" >&6
+if test "${cf_cv_define_sigwinch+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 5961 "configure"
+#include "confdefs.h"
+
+#include <sys/types.h>
+#include <sys/signal.h>
+
+int
+main (void)
+{
+int x = SIGWINCH; (void)x
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:5976: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:5979: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:5982: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:5985: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_define_sigwinch=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 5992 "configure"
+#include "confdefs.h"
+
+#undef _XOPEN_SOURCE
+#undef _POSIX_SOURCE
+#undef _POSIX_C_SOURCE
+#include <sys/types.h>
+#include <sys/signal.h>
+
+int
+main (void)
+{
+int x = SIGWINCH; (void)x
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:6010: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:6013: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:6016: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:6019: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_define_sigwinch=maybe
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_define_sigwinch=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:6033: result: $cf_cv_define_sigwinch" >&5
+echo "${ECHO_T}$cf_cv_define_sigwinch" >&6
+
+if test "$cf_cv_define_sigwinch" = maybe ; then
+echo "$as_me:6037: checking for actual SIGWINCH definition" >&5
+echo $ECHO_N "checking for actual SIGWINCH definition... $ECHO_C" >&6
+if test "${cf_cv_fixup_sigwinch+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cf_cv_fixup_sigwinch=unknown
+cf_sigwinch=32
+while test "$cf_sigwinch" != 1
+do
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 6048 "configure"
+#include "confdefs.h"
+
+#undef _XOPEN_SOURCE
+#undef _POSIX_SOURCE
+#undef _POSIX_C_SOURCE
+#include <sys/types.h>
+#include <sys/signal.h>
+
+int
+main (void)
+{
+
+#if SIGWINCH != $cf_sigwinch
+make an error
+#endif
+int x = SIGWINCH; (void)x
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:6070: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:6073: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:6076: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:6079: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_fixup_sigwinch=$cf_sigwinch
+	 break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+cf_sigwinch="`expr "$cf_sigwinch" - 1`"
+done
+
+fi
+echo "$as_me:6093: result: $cf_cv_fixup_sigwinch" >&5
+echo "${ECHO_T}$cf_cv_fixup_sigwinch" >&6
+
+	if test "$cf_cv_fixup_sigwinch" != unknown ; then
+		CPPFLAGS="$CPPFLAGS -DSIGWINCH=$cf_cv_fixup_sigwinch"
+	fi
+fi
+
+# Checks for CODESET support.
+
+echo "$as_me:6103: checking for nl_langinfo and CODESET" >&5
+echo $ECHO_N "checking for nl_langinfo and CODESET... $ECHO_C" >&6
+if test "${am_cv_langinfo_codeset+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 6109 "configure"
+#include "confdefs.h"
+#include <langinfo.h>
+int
+main (void)
+{
+char* cs = nl_langinfo(CODESET); (void)cs
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:6121: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:6124: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:6127: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:6130: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  am_cv_langinfo_codeset=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+am_cv_langinfo_codeset=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:6141: result: $am_cv_langinfo_codeset" >&5
+echo "${ECHO_T}$am_cv_langinfo_codeset" >&6
+	if test "$am_cv_langinfo_codeset" = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_LANGINFO_CODESET 1
+EOF
+
+	fi
+
+echo "$as_me:6151: checking if you want to use pkg-config" >&5
+echo $ECHO_N "checking if you want to use pkg-config... $ECHO_C" >&6
+
+# Check whether --with-pkg-config or --without-pkg-config was given.
+if test "${with_pkg_config+set}" = set; then
+  withval="$with_pkg_config"
+  cf_pkg_config=$withval
+else
+  cf_pkg_config=yes
+fi;
+echo "$as_me:6161: result: $cf_pkg_config" >&5
+echo "${ECHO_T}$cf_pkg_config" >&6
+
+case "$cf_pkg_config" in
+(no)
+	PKG_CONFIG=none
+	;;
+(yes)
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+echo "$as_me:6173: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_PKG_CONFIG+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  if $as_executable_p "$ac_dir/$ac_word"; then
+   ac_cv_path_PKG_CONFIG="$ac_dir/$ac_word"
+   echo "$as_me:6190: found $ac_dir/$ac_word" >&5
+   break
+fi
+done
+
+  ;;
+esac
+fi
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+
+if test -n "$PKG_CONFIG"; then
+  echo "$as_me:6201: result: $PKG_CONFIG" >&5
+echo "${ECHO_T}$PKG_CONFIG" >&6
+else
+  echo "$as_me:6204: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_path_PKG_CONFIG"; then
+  ac_pt_PKG_CONFIG=$PKG_CONFIG
+  # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+echo "$as_me:6213: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $ac_pt_PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  if $as_executable_p "$ac_dir/$ac_word"; then
+   ac_cv_path_ac_pt_PKG_CONFIG="$ac_dir/$ac_word"
+   echo "$as_me:6230: found $ac_dir/$ac_word" >&5
+   break
+fi
+done
+
+  test -z "$ac_cv_path_ac_pt_PKG_CONFIG" && ac_cv_path_ac_pt_PKG_CONFIG="none"
+  ;;
+esac
+fi
+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
+
+if test -n "$ac_pt_PKG_CONFIG"; then
+  echo "$as_me:6242: result: $ac_pt_PKG_CONFIG" >&5
+echo "${ECHO_T}$ac_pt_PKG_CONFIG" >&6
+else
+  echo "$as_me:6245: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  PKG_CONFIG=$ac_pt_PKG_CONFIG
+else
+  PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
+fi
+
+	;;
+(*)
+	PKG_CONFIG=$withval
+	;;
+esac
+
+test -z "$PKG_CONFIG" && PKG_CONFIG=none
+if test "$PKG_CONFIG" != none ; then
+
+if test "x$prefix" != xNONE; then
+	cf_path_syntax="$prefix"
+else
+	cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$PKG_CONFIG" in
+(.\$\(*\)*|.\'*\'*)
+	;;
+(..|./*|.\\*)
+	;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+	;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+	eval PKG_CONFIG="$PKG_CONFIG"
+	case ".$PKG_CONFIG" in
+	(.NONE/*)
+		PKG_CONFIG=`echo "$PKG_CONFIG" | sed -e s%NONE%$cf_path_syntax%`
+		;;
+	esac
+	;;
+(.no|.NONE/*)
+	PKG_CONFIG=`echo "$PKG_CONFIG" | sed -e s%NONE%$cf_path_syntax%`
+	;;
+(*)
+	{ { echo "$as_me:6288: error: expected a pathname, not \"$PKG_CONFIG\"" >&5
+echo "$as_me: error: expected a pathname, not \"$PKG_CONFIG\"" >&2;}
+   { (exit 1); exit 1; }; }
+	;;
+esac
+
+elif test "x$cf_pkg_config" != xno ; then
+	{ echo "$as_me:6295: WARNING: pkg-config is not installed" >&5
+echo "$as_me: WARNING: pkg-config is not installed" >&2;}
+fi
+
+echo "$as_me:6299: checking if you want to see long compiling messages" >&5
+echo $ECHO_N "checking if you want to see long compiling messages... $ECHO_C" >&6
+
+# Check whether --enable-echo or --disable-echo was given.
+if test "${enable_echo+set}" = set; then
+  enableval="$enable_echo"
+  test "$enableval" != no && enableval=yes
+	if test "$enableval" != "yes" ; then
+
+	ECHO_LT='--silent'
+	ECHO_LD='@echo linking $@;'
+	RULE_CC='@echo compiling $<'
+	SHOW_CC='@echo compiling $@'
+	ECHO_CC='@'
+
+	else
+
+	ECHO_LT=''
+	ECHO_LD=''
+	RULE_CC=''
+	SHOW_CC=''
+	ECHO_CC=''
+
+	fi
+else
+  enableval=yes
+
+	ECHO_LT=''
+	ECHO_LD=''
+	RULE_CC=''
+	SHOW_CC=''
+	ECHO_CC=''
+
+fi;
+echo "$as_me:6333: result: $enableval" >&5
+echo "${ECHO_T}$enableval" >&6
+
+echo "$as_me:6336: checking for ncurses wrap-prefix" >&5
+echo $ECHO_N "checking for ncurses wrap-prefix... $ECHO_C" >&6
+
+# Check whether --with-ncurses-wrap-prefix or --without-ncurses-wrap-prefix was given.
+if test "${with_ncurses_wrap_prefix+set}" = set; then
+  withval="$with_ncurses_wrap_prefix"
+  NCURSES_WRAP_PREFIX=$withval
+else
+  NCURSES_WRAP_PREFIX=_nc_
+fi;
+echo "$as_me:6346: result: $NCURSES_WRAP_PREFIX" >&5
+echo "${ECHO_T}$NCURSES_WRAP_PREFIX" >&6
+
+echo "$as_me:6349: checking if you want to check for wide-character functions" >&5
+echo $ECHO_N "checking if you want to check for wide-character functions... $ECHO_C" >&6
+
+# Check whether --enable-widec or --disable-widec was given.
+if test "${enable_widec+set}" = set; then
+  enableval="$enable_widec"
+  test "$enableval" != no && enableval=yes
+	if test "$enableval" != "yes" ; then
+    cf_enable_widec=no
+	else
+		cf_enable_widec=yes
+	fi
+else
+  enableval=yes
+	cf_enable_widec=yes
+
+fi;
+echo "$as_me:6366: result: $cf_enable_widec" >&5
+echo "${ECHO_T}$cf_enable_widec" >&6
+
+echo "$as_me:6369: checking for specific curses-directory" >&5
+echo $ECHO_N "checking for specific curses-directory... $ECHO_C" >&6
+
+# Check whether --with-curses-dir or --without-curses-dir was given.
+if test "${with_curses_dir+set}" = set; then
+  withval="$with_curses_dir"
+  cf_cv_curses_dir=$withval
+else
+  cf_cv_curses_dir=no
+fi;
+echo "$as_me:6379: result: $cf_cv_curses_dir" >&5
+echo "${ECHO_T}$cf_cv_curses_dir" >&6
+
+if test -n "$cf_cv_curses_dir" && test "$cf_cv_curses_dir" != "no"
+then
+
+if test "x$prefix" != xNONE; then
+	cf_path_syntax="$prefix"
+else
+	cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$withval" in
+(.\$\(*\)*|.\'*\'*)
+	;;
+(..|./*|.\\*)
+	;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+	;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+	eval withval="$withval"
+	case ".$withval" in
+	(.NONE/*)
+		withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%`
+		;;
+	esac
+	;;
+(.no|.NONE/*)
+	withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%`
+	;;
+(*)
+	{ { echo "$as_me:6410: error: expected a pathname, not \"$withval\"" >&5
+echo "$as_me: error: expected a pathname, not \"$withval\"" >&2;}
+   { (exit 1); exit 1; }; }
+	;;
+esac
+
+	if test -d "$cf_cv_curses_dir"
+	then
+
+if test -n "$cf_cv_curses_dir/include" ; then
+  for cf_add_incdir in $cf_cv_curses_dir/include
+  do
+	while test "$cf_add_incdir" != /usr/include
+	do
+	  if test -d "$cf_add_incdir"
+	  then
+		cf_have_incdir=no
+		if test -n "$CFLAGS$CPPFLAGS" ; then
+		  # a loop is needed to ensure we can add subdirs of existing dirs
+		  for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+			if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+			  cf_have_incdir=yes; break
+			fi
+		  done
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  if test "$cf_add_incdir" = /usr/local/include ; then
+			if test "$GCC" = yes
+			then
+			  cf_save_CPPFLAGS=$CPPFLAGS
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+			  cat >"conftest.$ac_ext" <<_ACEOF
+#line 6446 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:6458: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:6461: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:6464: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:6467: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+			  CPPFLAGS=$cf_save_CPPFLAGS
+			fi
+		  fi
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  test -n "$verbose" && echo "	adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:6484: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+		  CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+		  cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+		  test "$cf_top_incdir" = "$cf_add_incdir" && break
+		  cf_add_incdir="$cf_top_incdir"
+		else
+		  break
+		fi
+	  else
+		break
+	  fi
+	done
+  done
+fi
+
+if test -n "$cf_cv_curses_dir/lib" ; then
+	for cf_add_libdir in $cf_cv_curses_dir/lib
+	do
+		if test "$cf_add_libdir" = /usr/lib ; then
+			:
+		elif test -d "$cf_add_libdir"
+		then
+			cf_have_libdir=no
+			if test -n "$LDFLAGS$LIBS" ; then
+				# a loop is needed to ensure we can add subdirs of existing dirs
+				for cf_test_libdir in $LDFLAGS $LIBS ; do
+					if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+						cf_have_libdir=yes; break
+					fi
+				done
+			fi
+			if test "$cf_have_libdir" = no ; then
+				test -n "$verbose" && echo "	adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:6520: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+				LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+			fi
+		fi
+	done
+fi
+
+	fi
+fi
+
+cf_cv_screen=curses
+
+echo "$as_me:6533: checking for specified curses library type" >&5
+echo $ECHO_N "checking for specified curses library type... $ECHO_C" >&6
+
+# Check whether --with-screen or --without-screen was given.
+if test "${with_screen+set}" = set; then
+  withval="$with_screen"
+  cf_cv_screen=$withval
+else
+
+# Check whether --with-ncursesw or --without-ncursesw was given.
+if test "${with_ncursesw+set}" = set; then
+  withval="$with_ncursesw"
+  cf_cv_screen=ncursesw
+else
+
+# Check whether --with-ncurses or --without-ncurses was given.
+if test "${with_ncurses+set}" = set; then
+  withval="$with_ncurses"
+  cf_cv_screen=ncurses
+else
+
+# Check whether --with-pdcurses or --without-pdcurses was given.
+if test "${with_pdcurses+set}" = set; then
+  withval="$with_pdcurses"
+  cf_cv_screen=pdcurses
+else
+
+# Check whether --with-curses-colr or --without-curses-colr was given.
+if test "${with_curses_colr+set}" = set; then
+  withval="$with_curses_colr"
+  cf_cv_screen=curses_colr
+else
+
+# Check whether --with-curses-5lib or --without-curses-5lib was given.
+if test "${with_curses_5lib+set}" = set; then
+  withval="$with_curses_5lib"
+  cf_cv_screen=curses_5lib
+fi;
+fi;
+fi;
+fi;
+fi;
+fi;
+
+echo "$as_me:6577: result: $cf_cv_screen" >&5
+echo "${ECHO_T}$cf_cv_screen" >&6
+
+case $cf_cv_screen in
+(curses|curses_*)
+
+echo "$as_me:6583: checking for extra include directories" >&5
+echo $ECHO_N "checking for extra include directories... $ECHO_C" >&6
+if test "${cf_cv_curses_incdir+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cf_cv_curses_incdir=no
+case "$host_os" in
+(hpux10.*)
+	if test "x$cf_cv_screen" = "xcurses_colr"
+	then
+		test -d /usr/include/curses_colr && \
+		cf_cv_curses_incdir="-I/usr/include/curses_colr"
+	fi
+	;;
+(sunos3*|sunos4*)
+	if test "x$cf_cv_screen" = "xcurses_5lib"
+	then
+		test -d /usr/5lib && \
+		test -d /usr/5include && \
+		cf_cv_curses_incdir="-I/usr/5include"
+	fi
+	;;
+esac
+
+fi
+echo "$as_me:6609: result: $cf_cv_curses_incdir" >&5
+echo "${ECHO_T}$cf_cv_curses_incdir" >&6
+if test "$cf_cv_curses_incdir" != no
+then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_cv_curses_incdir"
+
+fi
+
+echo "$as_me:6619: checking if we have identified curses headers" >&5
+echo $ECHO_N "checking if we have identified curses headers... $ECHO_C" >&6
+if test "${cf_cv_ncurses_header+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cf_cv_ncurses_header=none
+for cf_header in \
+	ncurses.h  \
+	curses.h  ncurses/ncurses.h ncurses/curses.h
+do
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 6631 "configure"
+#include "confdefs.h"
+#include <${cf_header}>
+int
+main (void)
+{
+initscr(); tgoto("?", 0,0)
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:6643: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:6646: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:6649: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:6652: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_ncurses_header=$cf_header; break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+done
+
+fi
+echo "$as_me:6663: result: $cf_cv_ncurses_header" >&5
+echo "${ECHO_T}$cf_cv_ncurses_header" >&6
+
+if test "$cf_cv_ncurses_header" = none ; then
+	{ { echo "$as_me:6667: error: No curses header-files found" >&5
+echo "$as_me: error: No curses header-files found" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+# cheat, to get the right #define's for HAVE_NCURSES_H, etc.
+
+for ac_header in $cf_cv_ncurses_header
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:6677: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 6683 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:6687: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:6693: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:6712: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+echo "$as_me:6722: checking for terminfo header" >&5
+echo $ECHO_N "checking for terminfo header... $ECHO_C" >&6
+if test "${cf_cv_term_header+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+case "${cf_cv_ncurses_header}" in
+(*/ncurses.h|*/ncursesw.h)
+	cf_term_header=`echo "$cf_cv_ncurses_header" | sed -e 's%ncurses[^.]*\.h$%term.h%'`
+	;;
+(*)
+	cf_term_header=term.h
+	;;
+esac
+
+for cf_test in $cf_term_header "ncurses/term.h" "ncursesw/term.h"
+do
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 6740 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <$cf_test>
+
+int
+main (void)
+{
+int x = auto_left_margin; (void)x
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:6755: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:6758: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:6761: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:6764: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+	cf_cv_term_header="$cf_test"
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+	cf_cv_term_header=unknown
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+	test "$cf_cv_term_header" != unknown && break
+done
+
+fi
+echo "$as_me:6780: result: $cf_cv_term_header" >&5
+echo "${ECHO_T}$cf_cv_term_header" >&6
+
+# Set definitions to allow ifdef'ing to accommodate subdirectories
+
+case "$cf_cv_term_header" in
+(*term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_TERM_H 1
+EOF
+
+	;;
+esac
+
+case "$cf_cv_term_header" in
+(ncurses/term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSES_TERM_H 1
+EOF
+
+	;;
+(ncursesw/term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSESW_TERM_H 1
+EOF
+
+	;;
+esac
+
+echo "$as_me:6812: checking for ncurses version" >&5
+echo $ECHO_N "checking for ncurses version... $ECHO_C" >&6
+if test "${cf_cv_ncurses_version+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cf_cv_ncurses_version=no
+	cf_tempfile=out$$
+	rm -f "$cf_tempfile"
+	if test "$cross_compiling" = yes; then
+
+	# This will not work if the preprocessor splits the line after the
+	# Autoconf token.  The 'unproto' program does that.
+	cat > "conftest.$ac_ext" <<EOF
+#include <${cf_cv_ncurses_header:-curses.h}>
+#undef Autoconf
+#ifdef NCURSES_VERSION
+Autoconf NCURSES_VERSION
+#else
+#ifdef __NCURSES_H
+Autoconf "old"
+#endif
+;
+#endif
+EOF
+	cf_try="$ac_cpp conftest.$ac_ext 2>&5 | grep '^Autoconf ' >conftest.out"
+	{ (eval echo "$as_me:6838: \"$cf_try\"") >&5
+  (eval $cf_try) 2>&5
+  ac_status=$?
+  echo "$as_me:6841: \$? = $ac_status" >&5
+  (exit "$ac_status"); }
+	if test -f conftest.out ; then
+		cf_out=`sed -e 's%^Autoconf %%' -e 's%^[^"]*"%%' -e 's%".*%%' conftest.out`
+		test -n "$cf_out" && cf_cv_ncurses_version="$cf_out"
+		rm -f conftest.out
+	fi
+
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 6851 "configure"
+#include "confdefs.h"
+
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <stdio.h>
+int main(void)
+{
+	FILE *fp = fopen("$cf_tempfile", "w");
+#ifdef NCURSES_VERSION
+# ifdef NCURSES_VERSION_PATCH
+	fprintf(fp, "%s.%d\\n", NCURSES_VERSION, NCURSES_VERSION_PATCH);
+# else
+	fprintf(fp, "%s\\n", NCURSES_VERSION);
+# endif
+#else
+# ifdef __NCURSES_H
+	fprintf(fp, "old\\n");
+# else
+	make an error
+# endif
+#endif
+	${cf_cv_main_return:-return}(0);
+}
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:6876: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:6879: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:6881: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:6884: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+	cf_cv_ncurses_version=`cat $cf_tempfile`
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+	rm -f "$cf_tempfile"
+
+fi
+echo "$as_me:6898: result: $cf_cv_ncurses_version" >&5
+echo "${ECHO_T}$cf_cv_ncurses_version" >&6
+test "$cf_cv_ncurses_version" = no ||
+cat >>confdefs.h <<\EOF
+#define NCURSES 1
+EOF
+
+echo "$as_me:6905: checking if we have identified curses libraries" >&5
+echo $ECHO_N "checking if we have identified curses libraries... $ECHO_C" >&6
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 6908 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+initscr(); tgoto("?", 0,0)
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:6920: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:6923: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:6926: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:6929: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_result=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_result=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+echo "$as_me:6938: result: $cf_result" >&5
+echo "${ECHO_T}$cf_result" >&6
+
+if test "$cf_result" = no ; then
+case "$host_os" in
+(freebsd*)
+	echo "$as_me:6944: checking for tgoto in -lmytinfo" >&5
+echo $ECHO_N "checking for tgoto in -lmytinfo... $ECHO_C" >&6
+if test "${ac_cv_lib_mytinfo_tgoto+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lmytinfo  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 6952 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char tgoto ();
+int
+main (void)
+{
+tgoto ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:6971: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:6974: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:6977: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:6980: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_mytinfo_tgoto=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_mytinfo_tgoto=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:6991: result: $ac_cv_lib_mytinfo_tgoto" >&5
+echo "${ECHO_T}$ac_cv_lib_mytinfo_tgoto" >&6
+if test "$ac_cv_lib_mytinfo_tgoto" = yes; then
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lmytinfo; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+fi
+
+	;;
+(hpux10.*)
+	# Looking at HPUX 10.20, the Hcurses library is the oldest (1997), cur_colr
+	# next (1998), and xcurses "newer" (2000).  There is no header file for
+	# Hcurses; the subdirectory curses_colr has the headers (curses.h and
+	# term.h) for cur_colr
+	if test "x$cf_cv_screen" = "xcurses_colr"
+	then
+		echo "$as_me:7021: checking for initscr in -lcur_colr" >&5
+echo $ECHO_N "checking for initscr in -lcur_colr... $ECHO_C" >&6
+if test "${ac_cv_lib_cur_colr_initscr+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcur_colr  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 7029 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char initscr ();
+int
+main (void)
+{
+initscr ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:7048: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:7051: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:7054: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:7057: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_cur_colr_initscr=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_cur_colr_initscr=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:7068: result: $ac_cv_lib_cur_colr_initscr" >&5
+echo "${ECHO_T}$ac_cv_lib_cur_colr_initscr" >&6
+if test "$ac_cv_lib_cur_colr_initscr" = yes; then
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lcur_colr; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+			ac_cv_func_initscr=yes
+
+else
+
+		echo "$as_me:7092: checking for initscr in -lHcurses" >&5
+echo $ECHO_N "checking for initscr in -lHcurses... $ECHO_C" >&6
+if test "${ac_cv_lib_Hcurses_initscr+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lHcurses  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 7100 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char initscr ();
+int
+main (void)
+{
+initscr ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:7119: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:7122: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:7125: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:7128: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_Hcurses_initscr=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_Hcurses_initscr=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:7139: result: $ac_cv_lib_Hcurses_initscr" >&5
+echo "${ECHO_T}$ac_cv_lib_Hcurses_initscr" >&6
+if test "$ac_cv_lib_Hcurses_initscr" = yes; then
+
+			# HP's header uses __HP_CURSES, but user claims _HP_CURSES.
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lHcurses; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-D__HP_CURSES -D_HP_CURSES"
+
+			ac_cv_func_initscr=yes
+
+fi
+
+fi
+
+	fi
+	;;
+(linux*)
+	case `arch 2>/dev/null` in
+	(x86_64)
+		if test -d /lib64
+		then
+
+if test -n "/lib64" ; then
+	for cf_add_libdir in /lib64
+	do
+		if test "$cf_add_libdir" = /usr/lib ; then
+			:
+		elif test -d "$cf_add_libdir"
+		then
+			cf_have_libdir=no
+			if test -n "$LDFLAGS$LIBS" ; then
+				# a loop is needed to ensure we can add subdirs of existing dirs
+				for cf_test_libdir in $LDFLAGS $LIBS ; do
+					if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+						cf_have_libdir=yes; break
+					fi
+				done
+			fi
+			if test "$cf_have_libdir" = no ; then
+				test -n "$verbose" && echo "	adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:7197: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+				LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+			fi
+		fi
+	done
+fi
+
+		else
+
+if test -n "/lib" ; then
+	for cf_add_libdir in /lib
+	do
+		if test "$cf_add_libdir" = /usr/lib ; then
+			:
+		elif test -d "$cf_add_libdir"
+		then
+			cf_have_libdir=no
+			if test -n "$LDFLAGS$LIBS" ; then
+				# a loop is needed to ensure we can add subdirs of existing dirs
+				for cf_test_libdir in $LDFLAGS $LIBS ; do
+					if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+						cf_have_libdir=yes; break
+					fi
+				done
+			fi
+			if test "$cf_have_libdir" = no ; then
+				test -n "$verbose" && echo "	adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:7226: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+				LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+			fi
+		fi
+	done
+fi
+
+		fi
+		;;
+	(*)
+
+if test -n "/lib" ; then
+	for cf_add_libdir in /lib
+	do
+		if test "$cf_add_libdir" = /usr/lib ; then
+			:
+		elif test -d "$cf_add_libdir"
+		then
+			cf_have_libdir=no
+			if test -n "$LDFLAGS$LIBS" ; then
+				# a loop is needed to ensure we can add subdirs of existing dirs
+				for cf_test_libdir in $LDFLAGS $LIBS ; do
+					if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+						cf_have_libdir=yes; break
+					fi
+				done
+			fi
+			if test "$cf_have_libdir" = no ; then
+				test -n "$verbose" && echo "	adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:7257: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+				LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+			fi
+		fi
+	done
+fi
+
+		;;
+	esac
+	;;
+(sunos3*|sunos4*)
+	if test "x$cf_cv_screen" = "xcurses_5lib"
+	then
+		if test -d /usr/5lib ; then
+
+if test -n "/usr/5lib" ; then
+	for cf_add_libdir in /usr/5lib
+	do
+		if test "$cf_add_libdir" = /usr/lib ; then
+			:
+		elif test -d "$cf_add_libdir"
+		then
+			cf_have_libdir=no
+			if test -n "$LDFLAGS$LIBS" ; then
+				# a loop is needed to ensure we can add subdirs of existing dirs
+				for cf_test_libdir in $LDFLAGS $LIBS ; do
+					if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+						cf_have_libdir=yes; break
+					fi
+				done
+			fi
+			if test "$cf_have_libdir" = no ; then
+				test -n "$verbose" && echo "	adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:7292: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+				LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+			fi
+		fi
+	done
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lcurses -ltermcap; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+		fi
+	fi
+	ac_cv_func_initscr=yes
+	;;
+esac
+
+if test ".$ac_cv_func_initscr" != .yes ; then
+	cf_save_LIBS="$LIBS"
+
+	if test ".${cf_cv_ncurses_version:-no}" != .no
+	then
+		cf_check_list="ncurses curses cursesX"
+	else
+		cf_check_list="cursesX curses ncurses"
+	fi
+
+	# Check for library containing tgoto.  Do this before curses library
+	# because it may be needed to link the test-case for initscr.
+	if test "x$cf_term_lib" = x
+	then
+		echo "$as_me:7336: checking for tgoto" >&5
+echo $ECHO_N "checking for tgoto... $ECHO_C" >&6
+if test "${ac_cv_func_tgoto+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 7342 "configure"
+#include "confdefs.h"
+#define tgoto autoconf_temporary
+#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
+#undef tgoto
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char tgoto (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_tgoto) || defined (__stub___tgoto)
+#error found stub for tgoto
+#endif
+
+	return tgoto ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:7373: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:7376: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:7379: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:7382: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_func_tgoto=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_tgoto=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:7392: result: $ac_cv_func_tgoto" >&5
+echo "${ECHO_T}$ac_cv_func_tgoto" >&6
+if test "$ac_cv_func_tgoto" = yes; then
+  cf_term_lib=predefined
+else
+
+			for cf_term_lib in $cf_check_list otermcap termcap tinfo termlib unknown
+			do
+				as_ac_Lib=`echo "ac_cv_lib_$cf_term_lib''_tgoto" | $as_tr_sh`
+echo "$as_me:7401: checking for tgoto in -l$cf_term_lib" >&5
+echo $ECHO_N "checking for tgoto in -l$cf_term_lib... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Lib+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$cf_term_lib  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 7409 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char tgoto ();
+int
+main (void)
+{
+tgoto ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:7428: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:7431: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:7434: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:7437: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  eval "$as_ac_Lib=yes"
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_Lib=no"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:7448: result: `eval echo '${'"$as_ac_Lib"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Lib"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Lib"'}'`" = yes; then
+
+					: "${cf_nculib_root:=$cf_term_lib}"
+					break
+
+fi
+
+			done
+
+fi
+
+	fi
+
+	# Check for library containing initscr
+	test "$cf_term_lib" != predefined && test "$cf_term_lib" != unknown && LIBS="-l$cf_term_lib $cf_save_LIBS"
+	if test "x$cf_curs_lib" = x
+	then
+		for cf_curs_lib in $cf_check_list xcurses jcurses pdcurses unknown
+		do
+			LIBS="-l$cf_curs_lib $cf_save_LIBS"
+			if test "$cf_term_lib" = unknown || test "$cf_term_lib" = "$cf_curs_lib" ; then
+				echo "$as_me:7471: checking if we can link with $cf_curs_lib library" >&5
+echo $ECHO_N "checking if we can link with $cf_curs_lib library... $ECHO_C" >&6
+				cat >"conftest.$ac_ext" <<_ACEOF
+#line 7474 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+initscr()
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:7486: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:7489: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:7492: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:7495: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_result=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_result=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+				echo "$as_me:7504: result: $cf_result" >&5
+echo "${ECHO_T}$cf_result" >&6
+				test "$cf_result" = yes && break
+			elif test "$cf_curs_lib" = "$cf_term_lib" ; then
+				cf_result=no
+			elif test "$cf_term_lib" != predefined ; then
+				echo "$as_me:7510: checking if we need both $cf_curs_lib and $cf_term_lib libraries" >&5
+echo $ECHO_N "checking if we need both $cf_curs_lib and $cf_term_lib libraries... $ECHO_C" >&6
+				cat >"conftest.$ac_ext" <<_ACEOF
+#line 7513 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+initscr(); tgoto((char *)0, 0, 0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:7525: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:7528: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:7531: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:7534: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_result=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+					LIBS="-l$cf_curs_lib -l$cf_term_lib $cf_save_LIBS"
+					cat >"conftest.$ac_ext" <<_ACEOF
+#line 7543 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+initscr()
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:7555: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:7558: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:7561: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:7564: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_result=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_result=error
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+				echo "$as_me:7576: result: $cf_result" >&5
+echo "${ECHO_T}$cf_result" >&6
+				test "$cf_result" != error && break
+			fi
+		done
+	fi
+	test "$cf_curs_lib" = unknown && { { echo "$as_me:7582: error: no curses library found" >&5
+echo "$as_me: error: no curses library found" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+fi
+
+	;;
+(ncursesw*)
+
+for ac_header in wchar.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:7594: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 7600 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:7604: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:7610: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:7629: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+echo "$as_me:7639: checking for multibyte character support" >&5
+echo $ECHO_N "checking for multibyte character support... $ECHO_C" >&6
+if test "${cf_cv_utf8_lib+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cf_save_LIBS="$LIBS"
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 7647 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#ifdef HAVE_WCHAR_H
+#include <wchar.h>
+#endif
+
+int
+main (void)
+{
+putwc(0,0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:7665: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:7668: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:7671: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:7674: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_utf8_lib=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+# If the linkage is not already in the $CPPFLAGS/$LDFLAGS configuration, these
+# will be set on completion of the AC_TRY_LINK below.
+cf_cv_header_path_utf8=
+cf_cv_library_path_utf8=
+
+echo "${as_me:-configure}:7686: testing Starting FIND_LINKAGE(utf8,) ..." 1>&5
+
+cf_save_LIBS="$LIBS"
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 7691 "configure"
+#include "confdefs.h"
+
+#include <libutf8.h>
+int
+main (void)
+{
+putwc(0,0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:7704: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:7707: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:7710: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:7713: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+	cf_cv_find_linkage_utf8=yes
+	cf_cv_header_path_utf8=/usr/include
+	cf_cv_library_path_utf8=/usr/lib
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+LIBS="-lutf8  $cf_save_LIBS"
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 7727 "configure"
+#include "confdefs.h"
+
+#include <libutf8.h>
+int
+main (void)
+{
+putwc(0,0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:7740: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:7743: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:7746: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:7749: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+	cf_cv_find_linkage_utf8=yes
+	cf_cv_header_path_utf8=/usr/include
+	cf_cv_library_path_utf8=/usr/lib
+	cf_cv_library_file_utf8="-lutf8"
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+	cf_cv_find_linkage_utf8=no
+	LIBS="$cf_save_LIBS"
+
+	test -n "$verbose" && echo "	find linkage for utf8 library" 1>&6
+
+echo "${as_me:-configure}:7766: testing find linkage for utf8 library ..." 1>&5
+
+echo "${as_me:-configure}:7768: testing Searching for headers in FIND_LINKAGE(utf8,) ..." 1>&5
+
+	cf_save_CPPFLAGS="$CPPFLAGS"
+	cf_test_CPPFLAGS="$CPPFLAGS"
+
+cf_search=
+
+# collect the current set of include-directories from compiler flags
+cf_header_path_list=""
+if test -n "${CFLAGS}${CPPFLAGS}" ; then
+	for cf_header_path in $CPPFLAGS $CFLAGS
+	do
+		case "$cf_header_path" in
+		(-I*)
+			cf_header_path=`echo ".$cf_header_path" |sed -e 's/^...//' -e 's,/include$,,'`
+
+test "x$cf_header_path" != "xNONE" && \
+test -d "$cf_header_path" && \
+ {
+	test -n "$verbose" && echo "	... testing for include-directories under $cf_header_path"
+	test -d "$cf_header_path/include" &&          cf_search="$cf_search $cf_header_path/include"
+	test -d "$cf_header_path/include/utf8" &&       cf_search="$cf_search $cf_header_path/include/utf8"
+	test -d "$cf_header_path/include/utf8/include" &&    cf_search="$cf_search $cf_header_path/include/utf8/include"
+	test -d "$cf_header_path/utf8/include" &&       cf_search="$cf_search $cf_header_path/utf8/include"
+	test -d "$cf_header_path/utf8/include/utf8" &&    cf_search="$cf_search $cf_header_path/utf8/include/utf8"
+}
+
+			cf_header_path_list="$cf_header_path_list $cf_search"
+			;;
+		esac
+	done
+fi
+
+# add the variations for the package we are looking for
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+	test -n "$verbose" && echo "	... testing for include-directories under $prefix"
+	test -d "$prefix/include" &&          cf_search="$cf_search $prefix/include"
+	test -d "$prefix/include/utf8" &&       cf_search="$cf_search $prefix/include/utf8"
+	test -d "$prefix/include/utf8/include" &&    cf_search="$cf_search $prefix/include/utf8/include"
+	test -d "$prefix/utf8/include" &&       cf_search="$cf_search $prefix/utf8/include"
+	test -d "$prefix/utf8/include/utf8" &&    cf_search="$cf_search $prefix/utf8/include/utf8"
+}
+
+for cf_subdir_prefix in \
+	/usr \
+	/usr/local \
+	/usr/pkg \
+	/opt \
+	/opt/local \
+	$HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+	test -n "$verbose" && echo "	... testing for include-directories under $cf_subdir_prefix"
+	test -d "$cf_subdir_prefix/include" &&          cf_search="$cf_search $cf_subdir_prefix/include"
+	test -d "$cf_subdir_prefix/include/utf8" &&       cf_search="$cf_search $cf_subdir_prefix/include/utf8"
+	test -d "$cf_subdir_prefix/include/utf8/include" &&    cf_search="$cf_search $cf_subdir_prefix/include/utf8/include"
+	test -d "$cf_subdir_prefix/utf8/include" &&       cf_search="$cf_search $cf_subdir_prefix/utf8/include"
+	test -d "$cf_subdir_prefix/utf8/include/utf8" &&    cf_search="$cf_search $cf_subdir_prefix/utf8/include/utf8"
+}
+
+done
+
+test "$includedir" != NONE && \
+test "$includedir" != "/usr/include" && \
+test -d "$includedir" && {
+	test -d "$includedir" &&    cf_search="$cf_search $includedir"
+	test -d "$includedir/utf8" && cf_search="$cf_search $includedir/utf8"
+}
+
+test "$oldincludedir" != NONE && \
+test "$oldincludedir" != "/usr/include" && \
+test -d "$oldincludedir" && {
+	test -d "$oldincludedir"    && cf_search="$cf_search $oldincludedir"
+	test -d "$oldincludedir/utf8" && cf_search="$cf_search $oldincludedir/utf8"
+}
+
+cf_search="$cf_search $cf_header_path_list"
+
+	for cf_cv_header_path_utf8 in $cf_search
+	do
+		if test -d "$cf_cv_header_path_utf8" ; then
+			test -n "$verbose" && echo "	... testing $cf_cv_header_path_utf8" 1>&6
+
+echo "${as_me:-configure}:7859: testing ... testing $cf_cv_header_path_utf8 ..." 1>&5
+
+			CPPFLAGS="$cf_save_CPPFLAGS"
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-I$cf_cv_header_path_utf8"
+
+			cat >"conftest.$ac_ext" <<_ACEOF
+#line 7867 "configure"
+#include "confdefs.h"
+
+#include <libutf8.h>
+int
+main (void)
+{
+putwc(0,0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:7880: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:7883: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:7886: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:7889: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+				test -n "$verbose" && echo "	... found utf8 headers in $cf_cv_header_path_utf8" 1>&6
+
+echo "${as_me:-configure}:7894: testing ... found utf8 headers in $cf_cv_header_path_utf8 ..." 1>&5
+
+				cf_cv_find_linkage_utf8=maybe
+				cf_test_CPPFLAGS="$CPPFLAGS"
+				break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+				CPPFLAGS="$cf_save_CPPFLAGS"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+		fi
+	done
+
+	if test "$cf_cv_find_linkage_utf8" = maybe ; then
+
+echo "${as_me:-configure}:7912: testing Searching for utf8 library in FIND_LINKAGE(utf8,) ..." 1>&5
+
+		cf_save_LIBS="$LIBS"
+		cf_save_LDFLAGS="$LDFLAGS"
+
+		if test "$cf_cv_find_linkage_utf8" != yes ; then
+
+cf_search=
+cf_library_path_list=""
+if test -n "${LDFLAGS}${LIBS}" ; then
+	for cf_library_path in $LDFLAGS $LIBS
+	do
+		case "$cf_library_path" in
+		(-L*)
+			cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'`
+
+test "x$cf_library_path" != "xNONE" && \
+test -d "$cf_library_path" && \
+ {
+	test -n "$verbose" && echo "	... testing for lib-directories under $cf_library_path"
+	test -d "$cf_library_path/lib" &&          cf_search="$cf_search $cf_library_path/lib"
+	test -d "$cf_library_path/lib/utf8" &&       cf_search="$cf_search $cf_library_path/lib/utf8"
+	test -d "$cf_library_path/lib/utf8/lib" &&    cf_search="$cf_search $cf_library_path/lib/utf8/lib"
+	test -d "$cf_library_path/utf8/lib" &&       cf_search="$cf_search $cf_library_path/utf8/lib"
+	test -d "$cf_library_path/utf8/lib/utf8" &&    cf_search="$cf_search $cf_library_path/utf8/lib/utf8"
+}
+
+			cf_library_path_list="$cf_library_path_list $cf_search"
+			;;
+		esac
+	done
+fi
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+	test -n "$verbose" && echo "	... testing for lib-directories under $prefix"
+	test -d "$prefix/lib" &&          cf_search="$cf_search $prefix/lib"
+	test -d "$prefix/lib/utf8" &&       cf_search="$cf_search $prefix/lib/utf8"
+	test -d "$prefix/lib/utf8/lib" &&    cf_search="$cf_search $prefix/lib/utf8/lib"
+	test -d "$prefix/utf8/lib" &&       cf_search="$cf_search $prefix/utf8/lib"
+	test -d "$prefix/utf8/lib/utf8" &&    cf_search="$cf_search $prefix/utf8/lib/utf8"
+}
+
+for cf_subdir_prefix in \
+	/usr \
+	/usr/local \
+	/usr/pkg \
+	/opt \
+	/opt/local \
+	$HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+	test -n "$verbose" && echo "	... testing for lib-directories under $cf_subdir_prefix"
+	test -d "$cf_subdir_prefix/lib" &&          cf_search="$cf_search $cf_subdir_prefix/lib"
+	test -d "$cf_subdir_prefix/lib/utf8" &&       cf_search="$cf_search $cf_subdir_prefix/lib/utf8"
+	test -d "$cf_subdir_prefix/lib/utf8/lib" &&    cf_search="$cf_search $cf_subdir_prefix/lib/utf8/lib"
+	test -d "$cf_subdir_prefix/utf8/lib" &&       cf_search="$cf_search $cf_subdir_prefix/utf8/lib"
+	test -d "$cf_subdir_prefix/utf8/lib/utf8" &&    cf_search="$cf_search $cf_subdir_prefix/utf8/lib/utf8"
+}
+
+done
+
+cf_search="$cf_library_path_list $cf_search"
+
+			for cf_cv_library_path_utf8 in $cf_search
+			do
+				if test -d "$cf_cv_library_path_utf8" ; then
+					test -n "$verbose" && echo "	... testing $cf_cv_library_path_utf8" 1>&6
+
+echo "${as_me:-configure}:7987: testing ... testing $cf_cv_library_path_utf8 ..." 1>&5
+
+					CPPFLAGS="$cf_test_CPPFLAGS"
+					LIBS="-lutf8  $cf_save_LIBS"
+					LDFLAGS="$cf_save_LDFLAGS -L$cf_cv_library_path_utf8"
+					cat >"conftest.$ac_ext" <<_ACEOF
+#line 7993 "configure"
+#include "confdefs.h"
+
+#include <libutf8.h>
+int
+main (void)
+{
+putwc(0,0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:8006: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:8009: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:8012: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:8015: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+					test -n "$verbose" && echo "	... found utf8 library in $cf_cv_library_path_utf8" 1>&6
+
+echo "${as_me:-configure}:8020: testing ... found utf8 library in $cf_cv_library_path_utf8 ..." 1>&5
+
+					cf_cv_find_linkage_utf8=yes
+					cf_cv_library_file_utf8="-lutf8"
+					break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+					CPPFLAGS="$cf_save_CPPFLAGS"
+					LIBS="$cf_save_LIBS"
+					LDFLAGS="$cf_save_LDFLAGS"
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+				fi
+			done
+			CPPFLAGS="$cf_save_CPPFLAGS"
+			LDFLAGS="$cf_save_LDFLAGS"
+		fi
+
+	else
+		cf_cv_find_linkage_utf8=no
+	fi
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+LIBS="$cf_save_LIBS"
+
+if test "$cf_cv_find_linkage_utf8" = yes ; then
+cf_cv_utf8_lib=add-on
+else
+cf_cv_utf8_lib=no
+fi
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:8062: result: $cf_cv_utf8_lib" >&5
+echo "${ECHO_T}$cf_cv_utf8_lib" >&6
+
+# HAVE_LIBUTF8_H is used by ncurses if curses.h is shared between
+# ncurses/ncursesw:
+if test "$cf_cv_utf8_lib" = "add-on" ; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_LIBUTF8_H 1
+EOF
+
+if test -n "$cf_cv_header_path_utf8" ; then
+  for cf_add_incdir in $cf_cv_header_path_utf8
+  do
+	while test "$cf_add_incdir" != /usr/include
+	do
+	  if test -d "$cf_add_incdir"
+	  then
+		cf_have_incdir=no
+		if test -n "$CFLAGS$CPPFLAGS" ; then
+		  # a loop is needed to ensure we can add subdirs of existing dirs
+		  for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+			if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+			  cf_have_incdir=yes; break
+			fi
+		  done
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  if test "$cf_add_incdir" = /usr/local/include ; then
+			if test "$GCC" = yes
+			then
+			  cf_save_CPPFLAGS=$CPPFLAGS
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+			  cat >"conftest.$ac_ext" <<_ACEOF
+#line 8100 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:8112: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:8115: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:8118: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:8121: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+			  CPPFLAGS=$cf_save_CPPFLAGS
+			fi
+		  fi
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  test -n "$verbose" && echo "	adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:8138: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+		  CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+		  cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+		  test "$cf_top_incdir" = "$cf_add_incdir" && break
+		  cf_add_incdir="$cf_top_incdir"
+		else
+		  break
+		fi
+	  else
+		break
+	  fi
+	done
+  done
+fi
+
+if test -n "$cf_cv_library_path_utf8" ; then
+	for cf_add_libdir in $cf_cv_library_path_utf8
+	do
+		if test "$cf_add_libdir" = /usr/lib ; then
+			:
+		elif test -d "$cf_add_libdir"
+		then
+			cf_have_libdir=no
+			if test -n "$LDFLAGS$LIBS" ; then
+				# a loop is needed to ensure we can add subdirs of existing dirs
+				for cf_test_libdir in $LDFLAGS $LIBS ; do
+					if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then
+						cf_have_libdir=yes; break
+					fi
+				done
+			fi
+			if test "$cf_have_libdir" = no ; then
+				test -n "$verbose" && echo "	adding $cf_add_libdir to library-path" 1>&6
+
+echo "${as_me:-configure}:8174: testing adding $cf_add_libdir to library-path ..." 1>&5
+
+				LDFLAGS="-L$cf_add_libdir $LDFLAGS"
+			fi
+		fi
+	done
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_cv_library_file_utf8; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+fi
+
+cf_ncuconfig_root=$cf_cv_screen
+cf_have_ncuconfig=no
+
+if test "x${PKG_CONFIG:=none}" != xnone; then
+	echo "$as_me:8204: checking pkg-config for $cf_ncuconfig_root" >&5
+echo $ECHO_N "checking pkg-config for $cf_ncuconfig_root... $ECHO_C" >&6
+	if "$PKG_CONFIG" --exists $cf_ncuconfig_root ; then
+		echo "$as_me:8207: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+		echo "$as_me:8210: checking if the $cf_ncuconfig_root package files work" >&5
+echo $ECHO_N "checking if the $cf_ncuconfig_root package files work... $ECHO_C" >&6
+		cf_have_ncuconfig=unknown
+
+		cf_save_CFLAGS="$CFLAGS"
+		cf_save_CPPFLAGS="$CPPFLAGS"
+		cf_save_LIBS="$LIBS"
+
+		cf_pkg_cflags="`$PKG_CONFIG --cflags $cf_ncuconfig_root`"
+		cf_pkg_libs="`$PKG_CONFIG --libs $cf_ncuconfig_root`"
+
+		# while -W for passing linker flags is prevalent, it is not "standard".
+		# At least one wrapper for c89/c99 (in Apple's xcode) has its own
+		# incompatible _and_ non-standard -W option which gives an error.  Work
+		# around that pitfall.
+		case "x${CC}@@${cf_pkg_libs}@${cf_pkg_cflags}" in
+		(x*c[89]9@@*-W*)
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_pkg_cflags
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_pkg_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+			cat >"conftest.$ac_ext" <<_ACEOF
+#line 8343 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+initscr(); mousemask(0,0); tigetstr((char *)0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:8355: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:8358: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:8361: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:8364: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  if test "$cross_compiling" = yes; then
+  cf_test_ncuconfig=maybe
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 8370 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+					int main(void)
+					{ const char *xx = curses_version(); return (xx == 0); }
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:8377: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:8380: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:8382: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:8385: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_test_ncuconfig=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_test_ncuconfig=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_test_ncuconfig=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+			CFLAGS="$cf_save_CFLAGS"
+			CPPFLAGS="$cf_save_CPPFLAGS"
+			LIBS="$cf_save_LIBS"
+
+			if test "x$cf_test_ncuconfig" != xyes; then
+				cf_temp=`echo "x$cf_pkg_cflags" | sed -e s/^x// -e 's/-W[^ 	]*//g'`
+				cf_pkg_cflags="$cf_temp"
+				cf_temp=`echo "x$cf_pkg_libs" | sed -e s/^x// -e 's/-W[^ 	]*//g'`
+				cf_pkg_libs="$cf_temp"
+			fi
+			;;
+		esac
+
+for cf_add_cflags in $cf_pkg_cflags
+do
+	case "x$cf_add_cflags" in
+	(x-[DU]*)
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CFLAGS" != "$cf_old_cflag" || break
+
+	CFLAGS="$cf_old_cflag"
+done
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CPPFLAGS" != "$cf_old_cflag" || break
+
+	CPPFLAGS="$cf_old_cflag"
+done
+
+		;;
+	esac
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_add_cflags
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+done
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_pkg_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 8559 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+initscr(); mousemask(0,0); tigetstr((char *)0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:8571: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:8574: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:8577: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:8580: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  if test "$cross_compiling" = yes; then
+  cf_have_ncuconfig=maybe
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 8586 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+				int main(void)
+				{ const char *xx = curses_version(); return (xx == 0); }
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:8593: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:8596: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:8598: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:8601: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_have_ncuconfig=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_ncuconfig=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_ncuconfig=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+		echo "$as_me:8618: result: $cf_have_ncuconfig" >&5
+echo "${ECHO_T}$cf_have_ncuconfig" >&6
+		test "$cf_have_ncuconfig" = maybe && cf_have_ncuconfig=yes
+		if test "$cf_have_ncuconfig" != "yes"
+		then
+			CPPFLAGS="$cf_save_CPPFLAGS"
+			LIBS="$cf_save_LIBS"
+			NCURSES_CONFIG_PKG=none
+		else
+
+cat >>confdefs.h <<\EOF
+#define NCURSES 1
+EOF
+
+			NCURSES_CONFIG_PKG=$cf_ncuconfig_root
+
+echo "$as_me:8634: checking for terminfo header" >&5
+echo $ECHO_N "checking for terminfo header... $ECHO_C" >&6
+if test "${cf_cv_term_header+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+case "${cf_cv_ncurses_header}" in
+(*/ncurses.h|*/ncursesw.h)
+	cf_term_header=`echo "$cf_cv_ncurses_header" | sed -e 's%ncurses[^.]*\.h$%term.h%'`
+	;;
+(*)
+	cf_term_header=term.h
+	;;
+esac
+
+for cf_test in $cf_term_header "ncurses/term.h" "ncursesw/term.h"
+do
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 8652 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <$cf_test>
+
+int
+main (void)
+{
+int x = auto_left_margin; (void)x
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:8667: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:8670: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:8673: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:8676: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+	cf_cv_term_header="$cf_test"
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+	cf_cv_term_header=unknown
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+	test "$cf_cv_term_header" != unknown && break
+done
+
+fi
+echo "$as_me:8692: result: $cf_cv_term_header" >&5
+echo "${ECHO_T}$cf_cv_term_header" >&6
+
+# Set definitions to allow ifdef'ing to accommodate subdirectories
+
+case "$cf_cv_term_header" in
+(*term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_TERM_H 1
+EOF
+
+	;;
+esac
+
+case "$cf_cv_term_header" in
+(ncurses/term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSES_TERM_H 1
+EOF
+
+	;;
+(ncursesw/term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSESW_TERM_H 1
+EOF
+
+	;;
+esac
+
+		fi
+
+	else
+		echo "$as_me:8727: result: no" >&5
+echo "${ECHO_T}no" >&6
+		NCURSES_CONFIG_PKG=none
+	fi
+else
+	NCURSES_CONFIG_PKG=none
+fi
+
+if test "x$cf_have_ncuconfig" = "xno"; then
+	cf_ncurses_config="${cf_ncuconfig_root}${NCURSES_CONFIG_SUFFIX}-config"; echo "Looking for ${cf_ncurses_config}"
+
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in ${cf_ncurses_config} ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}5-config
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:8743: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_NCURSES_CONFIG+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$NCURSES_CONFIG"; then
+  ac_cv_prog_NCURSES_CONFIG="$NCURSES_CONFIG" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_NCURSES_CONFIG="$ac_tool_prefix$ac_prog"
+echo "$as_me:8758: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+NCURSES_CONFIG=$ac_cv_prog_NCURSES_CONFIG
+if test -n "$NCURSES_CONFIG"; then
+  echo "$as_me:8766: result: $NCURSES_CONFIG" >&5
+echo "${ECHO_T}$NCURSES_CONFIG" >&6
+else
+  echo "$as_me:8769: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    test -n "$NCURSES_CONFIG" && break
+  done
+fi
+if test -z "$NCURSES_CONFIG"; then
+  ac_ct_NCURSES_CONFIG=$NCURSES_CONFIG
+  for ac_prog in ${cf_ncurses_config} ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}5-config
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:8782: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_NCURSES_CONFIG+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_NCURSES_CONFIG"; then
+  ac_cv_prog_ac_ct_NCURSES_CONFIG="$ac_ct_NCURSES_CONFIG" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ac_ct_NCURSES_CONFIG="$ac_prog"
+echo "$as_me:8797: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+ac_ct_NCURSES_CONFIG=$ac_cv_prog_ac_ct_NCURSES_CONFIG
+if test -n "$ac_ct_NCURSES_CONFIG"; then
+  echo "$as_me:8805: result: $ac_ct_NCURSES_CONFIG" >&5
+echo "${ECHO_T}$ac_ct_NCURSES_CONFIG" >&6
+else
+  echo "$as_me:8808: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$ac_ct_NCURSES_CONFIG" && break
+done
+test -n "$ac_ct_NCURSES_CONFIG" || ac_ct_NCURSES_CONFIG="none"
+
+  NCURSES_CONFIG=$ac_ct_NCURSES_CONFIG
+fi
+
+	if test "$NCURSES_CONFIG" != none ; then
+
+for cf_add_cflags in `$NCURSES_CONFIG --cflags`
+do
+	case "x$cf_add_cflags" in
+	(x-[DU]*)
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CFLAGS" != "$cf_old_cflag" || break
+
+	CFLAGS="$cf_old_cflag"
+done
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CPPFLAGS" != "$cf_old_cflag" || break
+
+	CPPFLAGS="$cf_old_cflag"
+done
+
+		;;
+	esac
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_add_cflags
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+done
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in `$NCURSES_CONFIG --libs`; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+		# even with config script, some packages use no-override for curses.h
+
+echo "$as_me:8965: checking if we have identified curses headers" >&5
+echo $ECHO_N "checking if we have identified curses headers... $ECHO_C" >&6
+if test "${cf_cv_ncurses_header+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cf_cv_ncurses_header=none
+for cf_header in \
+	ncurses.h $cf_cv_screen/ncurses.h \
+	curses.h $cf_cv_screen/curses.h
+do
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 8977 "configure"
+#include "confdefs.h"
+#include <${cf_header}>
+int
+main (void)
+{
+initscr(); tgoto("?", 0,0)
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:8989: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:8992: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:8995: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:8998: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_ncurses_header=$cf_header; break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+done
+
+fi
+echo "$as_me:9009: result: $cf_cv_ncurses_header" >&5
+echo "${ECHO_T}$cf_cv_ncurses_header" >&6
+
+if test "$cf_cv_ncurses_header" = none ; then
+	{ { echo "$as_me:9013: error: No curses header-files found" >&5
+echo "$as_me: error: No curses header-files found" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+# cheat, to get the right #define's for HAVE_NCURSES_H, etc.
+
+for ac_header in $cf_cv_ncurses_header
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:9023: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 9029 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:9033: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:9039: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:9058: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+cat >>confdefs.h <<\EOF
+#define NCURSES 1
+EOF
+
+cf_nculib_ROOT=`echo "HAVE_LIB$cf_ncuconfig_root" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+		cat >>confdefs.h <<EOF
+#define $cf_nculib_ROOT 1
+EOF
+
+				cf_cv_ncurses_version="`$NCURSES_CONFIG --version`"
+
+	else
+
+cf_ncuhdr_root=$cf_cv_screen
+
+test -n "$cf_cv_curses_dir" && \
+test "$cf_cv_curses_dir" != "no" && { \
+
+if test -n "$cf_cv_curses_dir/include/$cf_ncuhdr_root" ; then
+  for cf_add_incdir in $cf_cv_curses_dir/include/$cf_ncuhdr_root
+  do
+	while test "$cf_add_incdir" != /usr/include
+	do
+	  if test -d "$cf_add_incdir"
+	  then
+		cf_have_incdir=no
+		if test -n "$CFLAGS$CPPFLAGS" ; then
+		  # a loop is needed to ensure we can add subdirs of existing dirs
+		  for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+			if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+			  cf_have_incdir=yes; break
+			fi
+		  done
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  if test "$cf_add_incdir" = /usr/local/include ; then
+			if test "$GCC" = yes
+			then
+			  cf_save_CPPFLAGS=$CPPFLAGS
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+			  cat >"conftest.$ac_ext" <<_ACEOF
+#line 9114 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:9126: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:9129: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:9132: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:9135: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+			  CPPFLAGS=$cf_save_CPPFLAGS
+			fi
+		  fi
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  test -n "$verbose" && echo "	adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:9152: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+		  CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+		  cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+		  test "$cf_top_incdir" = "$cf_add_incdir" && break
+		  cf_add_incdir="$cf_top_incdir"
+		else
+		  break
+		fi
+	  else
+		break
+	  fi
+	done
+  done
+fi
+
+}
+
+echo "$as_me:9171: checking for $cf_ncuhdr_root header in include-path" >&5
+echo $ECHO_N "checking for $cf_ncuhdr_root header in include-path... $ECHO_C" >&6
+if test "${cf_cv_ncurses_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cf_header_list="$cf_ncuhdr_root/curses.h $cf_ncuhdr_root/ncurses.h"
+	{ test "$cf_ncuhdr_root" = ncurses || test "$cf_ncuhdr_root" = ncursesw; } && cf_header_list="$cf_header_list curses.h ncurses.h"
+	for cf_header in $cf_header_list
+	do
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 9183 "configure"
+#include "confdefs.h"
+
+#include <$cf_header>
+int
+main (void)
+{
+
+#ifdef NCURSES_VERSION
+
+printf("%s\\n", NCURSES_VERSION);
+#else
+#ifdef __NCURSES_H
+printf("old\\n");
+#else
+	make an error
+#endif
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:9207: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:9210: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:9213: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:9216: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_ncurses_h=$cf_header
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_ncurses_h=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+		test "$cf_cv_ncurses_h" != no && break
+	done
+
+fi
+echo "$as_me:9231: result: $cf_cv_ncurses_h" >&5
+echo "${ECHO_T}$cf_cv_ncurses_h" >&6
+
+if test "$cf_cv_ncurses_h" != no ; then
+	cf_cv_ncurses_header=$cf_cv_ncurses_h
+else
+
+echo "$as_me:9238: checking for $cf_ncuhdr_root include-path" >&5
+echo $ECHO_N "checking for $cf_ncuhdr_root include-path... $ECHO_C" >&6
+if test "${cf_cv_ncurses_h2+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	test -n "$verbose" && echo
+
+cf_search=
+
+# collect the current set of include-directories from compiler flags
+cf_header_path_list=""
+if test -n "${CFLAGS}${CPPFLAGS}" ; then
+	for cf_header_path in $CPPFLAGS $CFLAGS
+	do
+		case "$cf_header_path" in
+		(-I*)
+			cf_header_path=`echo ".$cf_header_path" |sed -e 's/^...//' -e 's,/include$,,'`
+
+test "x$cf_header_path" != "xNONE" && \
+test -d "$cf_header_path" && \
+ {
+	test -n "$verbose" && echo "	... testing for include-directories under $cf_header_path"
+	test -d "$cf_header_path/include" &&          cf_search="$cf_search $cf_header_path/include"
+	test -d "$cf_header_path/include/$cf_ncuhdr_root" &&       cf_search="$cf_search $cf_header_path/include/$cf_ncuhdr_root"
+	test -d "$cf_header_path/include/$cf_ncuhdr_root/include" &&    cf_search="$cf_search $cf_header_path/include/$cf_ncuhdr_root/include"
+	test -d "$cf_header_path/$cf_ncuhdr_root/include" &&       cf_search="$cf_search $cf_header_path/$cf_ncuhdr_root/include"
+	test -d "$cf_header_path/$cf_ncuhdr_root/include/$cf_ncuhdr_root" &&    cf_search="$cf_search $cf_header_path/$cf_ncuhdr_root/include/$cf_ncuhdr_root"
+}
+
+			cf_header_path_list="$cf_header_path_list $cf_search"
+			;;
+		esac
+	done
+fi
+
+# add the variations for the package we are looking for
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+	test -n "$verbose" && echo "	... testing for include-directories under $prefix"
+	test -d "$prefix/include" &&          cf_search="$cf_search $prefix/include"
+	test -d "$prefix/include/$cf_ncuhdr_root" &&       cf_search="$cf_search $prefix/include/$cf_ncuhdr_root"
+	test -d "$prefix/include/$cf_ncuhdr_root/include" &&    cf_search="$cf_search $prefix/include/$cf_ncuhdr_root/include"
+	test -d "$prefix/$cf_ncuhdr_root/include" &&       cf_search="$cf_search $prefix/$cf_ncuhdr_root/include"
+	test -d "$prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root" &&    cf_search="$cf_search $prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root"
+}
+
+for cf_subdir_prefix in \
+	/usr \
+	/usr/local \
+	/usr/pkg \
+	/opt \
+	/opt/local \
+	$HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+	test -n "$verbose" && echo "	... testing for include-directories under $cf_subdir_prefix"
+	test -d "$cf_subdir_prefix/include" &&          cf_search="$cf_search $cf_subdir_prefix/include"
+	test -d "$cf_subdir_prefix/include/$cf_ncuhdr_root" &&       cf_search="$cf_search $cf_subdir_prefix/include/$cf_ncuhdr_root"
+	test -d "$cf_subdir_prefix/include/$cf_ncuhdr_root/include" &&    cf_search="$cf_search $cf_subdir_prefix/include/$cf_ncuhdr_root/include"
+	test -d "$cf_subdir_prefix/$cf_ncuhdr_root/include" &&       cf_search="$cf_search $cf_subdir_prefix/$cf_ncuhdr_root/include"
+	test -d "$cf_subdir_prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root" &&    cf_search="$cf_search $cf_subdir_prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root"
+}
+
+done
+
+test "$includedir" != NONE && \
+test "$includedir" != "/usr/include" && \
+test -d "$includedir" && {
+	test -d "$includedir" &&    cf_search="$cf_search $includedir"
+	test -d "$includedir/$cf_ncuhdr_root" && cf_search="$cf_search $includedir/$cf_ncuhdr_root"
+}
+
+test "$oldincludedir" != NONE && \
+test "$oldincludedir" != "/usr/include" && \
+test -d "$oldincludedir" && {
+	test -d "$oldincludedir"    && cf_search="$cf_search $oldincludedir"
+	test -d "$oldincludedir/$cf_ncuhdr_root" && cf_search="$cf_search $oldincludedir/$cf_ncuhdr_root"
+}
+
+cf_search="$cf_search $cf_header_path_list"
+
+	test -n "$verbose" && echo "search path $cf_search"
+	cf_save2_CPPFLAGS="$CPPFLAGS"
+	for cf_incdir in $cf_search
+	do
+
+if test -n "$cf_incdir" ; then
+  for cf_add_incdir in $cf_incdir
+  do
+	while test "$cf_add_incdir" != /usr/include
+	do
+	  if test -d "$cf_add_incdir"
+	  then
+		cf_have_incdir=no
+		if test -n "$CFLAGS$CPPFLAGS" ; then
+		  # a loop is needed to ensure we can add subdirs of existing dirs
+		  for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+			if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+			  cf_have_incdir=yes; break
+			fi
+		  done
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  if test "$cf_add_incdir" = /usr/local/include ; then
+			if test "$GCC" = yes
+			then
+			  cf_save_CPPFLAGS=$CPPFLAGS
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+			  cat >"conftest.$ac_ext" <<_ACEOF
+#line 9359 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:9371: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:9374: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:9377: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:9380: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+			  CPPFLAGS=$cf_save_CPPFLAGS
+			fi
+		  fi
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  test -n "$verbose" && echo "	adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:9397: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+		  CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+		  cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+		  test "$cf_top_incdir" = "$cf_add_incdir" && break
+		  cf_add_incdir="$cf_top_incdir"
+		else
+		  break
+		fi
+	  else
+		break
+	  fi
+	done
+  done
+fi
+
+		for cf_header in \
+			ncurses.h \
+			curses.h
+		do
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 9420 "configure"
+#include "confdefs.h"
+
+#include <$cf_header>
+int
+main (void)
+{
+
+#ifdef NCURSES_VERSION
+
+printf("%s\\n", NCURSES_VERSION);
+#else
+#ifdef __NCURSES_H
+printf("old\\n");
+#else
+	make an error
+#endif
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:9444: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:9447: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:9450: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:9453: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_ncurses_h2=$cf_header
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_ncurses_h2=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+			if test "$cf_cv_ncurses_h2" != no ; then
+				cf_cv_ncurses_h2=$cf_incdir/$cf_header
+				test -n "$verbose" && echo $ECHO_N "	... found $ECHO_C" 1>&6
+				break
+			fi
+			test -n "$verbose" && echo "	... tested $cf_incdir/$cf_header" 1>&6
+		done
+		CPPFLAGS="$cf_save2_CPPFLAGS"
+		test "$cf_cv_ncurses_h2" != no && break
+	done
+	test "$cf_cv_ncurses_h2" = no && { { echo "$as_me:9474: error: not found" >&5
+echo "$as_me: error: not found" >&2;}
+   { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:9479: result: $cf_cv_ncurses_h2" >&5
+echo "${ECHO_T}$cf_cv_ncurses_h2" >&6
+
+	cf_1st_incdir=`echo "$cf_cv_ncurses_h2" | sed -e 's%/[^/]*$%%'`
+	cf_cv_ncurses_header="`basename "$cf_cv_ncurses_h2"`"
+	if test "`basename "$cf_1st_incdir"`" = "$cf_ncuhdr_root" ; then
+		cf_cv_ncurses_header="$cf_ncuhdr_root/$cf_cv_ncurses_header"
+	fi
+
+if test -n "$cf_1st_incdir" ; then
+  for cf_add_incdir in $cf_1st_incdir
+  do
+	while test "$cf_add_incdir" != /usr/include
+	do
+	  if test -d "$cf_add_incdir"
+	  then
+		cf_have_incdir=no
+		if test -n "$CFLAGS$CPPFLAGS" ; then
+		  # a loop is needed to ensure we can add subdirs of existing dirs
+		  for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+			if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+			  cf_have_incdir=yes; break
+			fi
+		  done
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  if test "$cf_add_incdir" = /usr/local/include ; then
+			if test "$GCC" = yes
+			then
+			  cf_save_CPPFLAGS=$CPPFLAGS
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+			  cat >"conftest.$ac_ext" <<_ACEOF
+#line 9515 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:9527: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:9530: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:9533: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:9536: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+			  CPPFLAGS=$cf_save_CPPFLAGS
+			fi
+		  fi
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  test -n "$verbose" && echo "	adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:9553: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+		  CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+		  cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+		  test "$cf_top_incdir" = "$cf_add_incdir" && break
+		  cf_add_incdir="$cf_top_incdir"
+		else
+		  break
+		fi
+	  else
+		break
+	  fi
+	done
+  done
+fi
+
+fi
+
+# Set definitions to allow ifdef'ing for ncurses.h
+
+case "$cf_cv_ncurses_header" in
+(*ncurses.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSES_H 1
+EOF
+
+	;;
+esac
+
+case "$cf_cv_ncurses_header" in
+(ncurses/curses.h|ncurses/ncurses.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSES_NCURSES_H 1
+EOF
+
+	;;
+(ncursesw/curses.h|ncursesw/ncurses.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSESW_NCURSES_H 1
+EOF
+
+	;;
+esac
+
+echo "$as_me:9601: checking for terminfo header" >&5
+echo $ECHO_N "checking for terminfo header... $ECHO_C" >&6
+if test "${cf_cv_term_header+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+case "${cf_cv_ncurses_header}" in
+(*/ncurses.h|*/ncursesw.h)
+	cf_term_header=`echo "$cf_cv_ncurses_header" | sed -e 's%ncurses[^.]*\.h$%term.h%'`
+	;;
+(*)
+	cf_term_header=term.h
+	;;
+esac
+
+for cf_test in $cf_term_header "ncurses/term.h" "ncursesw/term.h"
+do
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 9619 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <$cf_test>
+
+int
+main (void)
+{
+int x = auto_left_margin; (void)x
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:9634: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:9637: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:9640: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:9643: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+	cf_cv_term_header="$cf_test"
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+	cf_cv_term_header=unknown
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+	test "$cf_cv_term_header" != unknown && break
+done
+
+fi
+echo "$as_me:9659: result: $cf_cv_term_header" >&5
+echo "${ECHO_T}$cf_cv_term_header" >&6
+
+# Set definitions to allow ifdef'ing to accommodate subdirectories
+
+case "$cf_cv_term_header" in
+(*term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_TERM_H 1
+EOF
+
+	;;
+esac
+
+case "$cf_cv_term_header" in
+(ncurses/term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSES_TERM_H 1
+EOF
+
+	;;
+(ncursesw/term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSESW_TERM_H 1
+EOF
+
+	;;
+esac
+
+# some applications need this, but should check for NCURSES_VERSION
+
+cat >>confdefs.h <<\EOF
+#define NCURSES 1
+EOF
+
+echo "$as_me:9697: checking for ncurses version" >&5
+echo $ECHO_N "checking for ncurses version... $ECHO_C" >&6
+if test "${cf_cv_ncurses_version+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cf_cv_ncurses_version=no
+	cf_tempfile=out$$
+	rm -f "$cf_tempfile"
+	if test "$cross_compiling" = yes; then
+
+	# This will not work if the preprocessor splits the line after the
+	# Autoconf token.  The 'unproto' program does that.
+	cat > "conftest.$ac_ext" <<EOF
+#include <${cf_cv_ncurses_header:-curses.h}>
+#undef Autoconf
+#ifdef NCURSES_VERSION
+Autoconf NCURSES_VERSION
+#else
+#ifdef __NCURSES_H
+Autoconf "old"
+#endif
+;
+#endif
+EOF
+	cf_try="$ac_cpp conftest.$ac_ext 2>&5 | grep '^Autoconf ' >conftest.out"
+	{ (eval echo "$as_me:9723: \"$cf_try\"") >&5
+  (eval $cf_try) 2>&5
+  ac_status=$?
+  echo "$as_me:9726: \$? = $ac_status" >&5
+  (exit "$ac_status"); }
+	if test -f conftest.out ; then
+		cf_out=`sed -e 's%^Autoconf %%' -e 's%^[^"]*"%%' -e 's%".*%%' conftest.out`
+		test -n "$cf_out" && cf_cv_ncurses_version="$cf_out"
+		rm -f conftest.out
+	fi
+
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 9736 "configure"
+#include "confdefs.h"
+
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <stdio.h>
+int main(void)
+{
+	FILE *fp = fopen("$cf_tempfile", "w");
+#ifdef NCURSES_VERSION
+# ifdef NCURSES_VERSION_PATCH
+	fprintf(fp, "%s.%d\\n", NCURSES_VERSION, NCURSES_VERSION_PATCH);
+# else
+	fprintf(fp, "%s\\n", NCURSES_VERSION);
+# endif
+#else
+# ifdef __NCURSES_H
+	fprintf(fp, "old\\n");
+# else
+	make an error
+# endif
+#endif
+	${cf_cv_main_return:-return}(0);
+}
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:9761: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:9764: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:9766: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:9769: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+	cf_cv_ncurses_version=`cat $cf_tempfile`
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+	rm -f "$cf_tempfile"
+
+fi
+echo "$as_me:9783: result: $cf_cv_ncurses_version" >&5
+echo "${ECHO_T}$cf_cv_ncurses_version" >&6
+test "$cf_cv_ncurses_version" = no ||
+cat >>confdefs.h <<\EOF
+#define NCURSES 1
+EOF
+
+cf_nculib_root=$cf_cv_screen
+	# This works, except for the special case where we find gpm, but
+	# ncurses is in a nonstandard location via $LIBS, and we really want
+	# to link gpm.
+cf_ncurses_LIBS=""
+cf_ncurses_SAVE="$LIBS"
+echo "$as_me:9796: checking for Gpm_Open in -lgpm" >&5
+echo $ECHO_N "checking for Gpm_Open in -lgpm... $ECHO_C" >&6
+if test "${ac_cv_lib_gpm_Gpm_Open+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lgpm  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 9804 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char Gpm_Open ();
+int
+main (void)
+{
+Gpm_Open ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:9823: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:9826: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:9829: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:9832: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_gpm_Gpm_Open=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_gpm_Gpm_Open=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:9843: result: $ac_cv_lib_gpm_Gpm_Open" >&5
+echo "${ECHO_T}$ac_cv_lib_gpm_Gpm_Open" >&6
+if test "$ac_cv_lib_gpm_Gpm_Open" = yes; then
+  echo "$as_me:9846: checking for initscr in -lgpm" >&5
+echo $ECHO_N "checking for initscr in -lgpm... $ECHO_C" >&6
+if test "${ac_cv_lib_gpm_initscr+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lgpm  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 9854 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char initscr ();
+int
+main (void)
+{
+initscr ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:9873: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:9876: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:9879: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:9882: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_gpm_initscr=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_gpm_initscr=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:9893: result: $ac_cv_lib_gpm_initscr" >&5
+echo "${ECHO_T}$ac_cv_lib_gpm_initscr" >&6
+if test "$ac_cv_lib_gpm_initscr" = yes; then
+  LIBS="$cf_ncurses_SAVE"
+else
+  cf_ncurses_LIBS="-lgpm"
+fi
+
+fi
+
+case "$host_os" in
+(freebsd*)
+	# This is only necessary if you are linking against an obsolete
+	# version of ncurses (but it should do no harm, since it is static).
+	if test "$cf_nculib_root" = ncurses ; then
+		echo "$as_me:9908: checking for tgoto in -lmytinfo" >&5
+echo $ECHO_N "checking for tgoto in -lmytinfo... $ECHO_C" >&6
+if test "${ac_cv_lib_mytinfo_tgoto+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lmytinfo  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 9916 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char tgoto ();
+int
+main (void)
+{
+tgoto ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:9935: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:9938: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:9941: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:9944: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_mytinfo_tgoto=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_mytinfo_tgoto=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:9955: result: $ac_cv_lib_mytinfo_tgoto" >&5
+echo "${ECHO_T}$ac_cv_lib_mytinfo_tgoto" >&6
+if test "$ac_cv_lib_mytinfo_tgoto" = yes; then
+  cf_ncurses_LIBS="-lmytinfo $cf_ncurses_LIBS"
+fi
+
+	fi
+	;;
+esac
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_ncurses_LIBS; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+if test -n "$cf_cv_curses_dir" && test "$cf_cv_curses_dir" != "no"
+then
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -l$cf_nculib_root; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+else
+
+	eval 'cf_cv_have_lib_'"$cf_nculib_root"'=no'
+	cf_libdir=""
+	echo "$as_me:10004: checking for initscr" >&5
+echo $ECHO_N "checking for initscr... $ECHO_C" >&6
+if test "${ac_cv_func_initscr+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 10010 "configure"
+#include "confdefs.h"
+#define initscr autoconf_temporary
+#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
+#undef initscr
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char initscr (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_initscr) || defined (__stub___initscr)
+#error found stub for initscr
+#endif
+
+	return initscr ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:10041: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:10044: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:10047: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:10050: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_func_initscr=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_initscr=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:10060: result: $ac_cv_func_initscr" >&5
+echo "${ECHO_T}$ac_cv_func_initscr" >&6
+if test "$ac_cv_func_initscr" = yes; then
+  eval 'cf_cv_have_lib_'"$cf_nculib_root"'=yes'
+else
+
+		cf_save_LIBS="$LIBS"
+		echo "$as_me:10067: checking for initscr in -l$cf_nculib_root" >&5
+echo $ECHO_N "checking for initscr in -l$cf_nculib_root... $ECHO_C" >&6
+		LIBS="-l$cf_nculib_root $LIBS"
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 10071 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+initscr()
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:10083: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:10086: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:10089: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:10092: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  echo "$as_me:10094: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+			 eval 'cf_cv_have_lib_'"$cf_nculib_root"'=yes'
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+echo "$as_me:10101: result: no" >&5
+echo "${ECHO_T}no" >&6
+
+cf_search=
+cf_library_path_list=""
+if test -n "${LDFLAGS}${LIBS}" ; then
+	for cf_library_path in $LDFLAGS $LIBS
+	do
+		case "$cf_library_path" in
+		(-L*)
+			cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'`
+
+test "x$cf_library_path" != "xNONE" && \
+test -d "$cf_library_path" && \
+ {
+	test -n "$verbose" && echo "	... testing for lib-directories under $cf_library_path"
+	test -d "$cf_library_path/lib" &&          cf_search="$cf_search $cf_library_path/lib"
+	test -d "$cf_library_path/lib/$cf_nculib_root" &&       cf_search="$cf_search $cf_library_path/lib/$cf_nculib_root"
+	test -d "$cf_library_path/lib/$cf_nculib_root/lib" &&    cf_search="$cf_search $cf_library_path/lib/$cf_nculib_root/lib"
+	test -d "$cf_library_path/$cf_nculib_root/lib" &&       cf_search="$cf_search $cf_library_path/$cf_nculib_root/lib"
+	test -d "$cf_library_path/$cf_nculib_root/lib/$cf_nculib_root" &&    cf_search="$cf_search $cf_library_path/$cf_nculib_root/lib/$cf_nculib_root"
+}
+
+			cf_library_path_list="$cf_library_path_list $cf_search"
+			;;
+		esac
+	done
+fi
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+	test -n "$verbose" && echo "	... testing for lib-directories under $prefix"
+	test -d "$prefix/lib" &&          cf_search="$cf_search $prefix/lib"
+	test -d "$prefix/lib/$cf_nculib_root" &&       cf_search="$cf_search $prefix/lib/$cf_nculib_root"
+	test -d "$prefix/lib/$cf_nculib_root/lib" &&    cf_search="$cf_search $prefix/lib/$cf_nculib_root/lib"
+	test -d "$prefix/$cf_nculib_root/lib" &&       cf_search="$cf_search $prefix/$cf_nculib_root/lib"
+	test -d "$prefix/$cf_nculib_root/lib/$cf_nculib_root" &&    cf_search="$cf_search $prefix/$cf_nculib_root/lib/$cf_nculib_root"
+}
+
+for cf_subdir_prefix in \
+	/usr \
+	/usr/local \
+	/usr/pkg \
+	/opt \
+	/opt/local \
+	$HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+	test -n "$verbose" && echo "	... testing for lib-directories under $cf_subdir_prefix"
+	test -d "$cf_subdir_prefix/lib" &&          cf_search="$cf_search $cf_subdir_prefix/lib"
+	test -d "$cf_subdir_prefix/lib/$cf_nculib_root" &&       cf_search="$cf_search $cf_subdir_prefix/lib/$cf_nculib_root"
+	test -d "$cf_subdir_prefix/lib/$cf_nculib_root/lib" &&    cf_search="$cf_search $cf_subdir_prefix/lib/$cf_nculib_root/lib"
+	test -d "$cf_subdir_prefix/$cf_nculib_root/lib" &&       cf_search="$cf_search $cf_subdir_prefix/$cf_nculib_root/lib"
+	test -d "$cf_subdir_prefix/$cf_nculib_root/lib/$cf_nculib_root" &&    cf_search="$cf_search $cf_subdir_prefix/$cf_nculib_root/lib/$cf_nculib_root"
+}
+
+done
+
+cf_search="$cf_library_path_list $cf_search"
+
+			for cf_libdir in $cf_search
+			do
+				echo "$as_me:10169: checking for -l$cf_nculib_root in $cf_libdir" >&5
+echo $ECHO_N "checking for -l$cf_nculib_root in $cf_libdir... $ECHO_C" >&6
+				LIBS="-L$cf_libdir -l$cf_nculib_root $cf_save_LIBS"
+				cat >"conftest.$ac_ext" <<_ACEOF
+#line 10173 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+initscr()
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:10185: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:10188: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:10191: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:10194: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  echo "$as_me:10196: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+			 		 eval 'cf_cv_have_lib_'"$cf_nculib_root"'=yes'
+					 break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+echo "$as_me:10203: result: no" >&5
+echo "${ECHO_T}no" >&6
+					 LIBS="$cf_save_LIBS"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+			done
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+
+eval 'cf_found_library="$cf_cv_have_lib_'"$cf_nculib_root"\"
+
+if test "$cf_found_library" = no ; then
+	{ { echo "$as_me:10218: error: Cannot link $cf_nculib_root library" >&5
+echo "$as_me: error: Cannot link $cf_nculib_root library" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+fi
+
+if test -n "$cf_ncurses_LIBS" ; then
+	echo "$as_me:10226: checking if we can link $cf_nculib_root without $cf_ncurses_LIBS" >&5
+echo $ECHO_N "checking if we can link $cf_nculib_root without $cf_ncurses_LIBS... $ECHO_C" >&6
+	cf_ncurses_SAVE="$LIBS"
+	for p in $cf_ncurses_LIBS ; do
+		q=`echo "$LIBS" | sed -e "s%$p %%" -e "s%$p$%%"`
+		if test "$q" != "$LIBS" ; then
+			LIBS="$q"
+		fi
+	done
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 10236 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+initscr(); mousemask(0,0); tigetstr((char *)0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:10248: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:10251: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:10254: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:10257: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  echo "$as_me:10259: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+echo "$as_me:10264: result: no" >&5
+echo "${ECHO_T}no" >&6
+		 LIBS="$cf_ncurses_SAVE"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+
+cf_nculib_ROOT=`echo "HAVE_LIB$cf_nculib_root" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+cat >>confdefs.h <<EOF
+#define $cf_nculib_ROOT 1
+EOF
+
+	fi
+else
+	NCURSES_CONFIG=none
+fi
+
+	;;
+(ncurses*)
+
+cf_ncuconfig_root=$cf_cv_screen
+cf_have_ncuconfig=no
+
+if test "x${PKG_CONFIG:=none}" != xnone; then
+	echo "$as_me:10289: checking pkg-config for $cf_ncuconfig_root" >&5
+echo $ECHO_N "checking pkg-config for $cf_ncuconfig_root... $ECHO_C" >&6
+	if "$PKG_CONFIG" --exists $cf_ncuconfig_root ; then
+		echo "$as_me:10292: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+		echo "$as_me:10295: checking if the $cf_ncuconfig_root package files work" >&5
+echo $ECHO_N "checking if the $cf_ncuconfig_root package files work... $ECHO_C" >&6
+		cf_have_ncuconfig=unknown
+
+		cf_save_CFLAGS="$CFLAGS"
+		cf_save_CPPFLAGS="$CPPFLAGS"
+		cf_save_LIBS="$LIBS"
+
+		cf_pkg_cflags="`$PKG_CONFIG --cflags $cf_ncuconfig_root`"
+		cf_pkg_libs="`$PKG_CONFIG --libs $cf_ncuconfig_root`"
+
+		# while -W for passing linker flags is prevalent, it is not "standard".
+		# At least one wrapper for c89/c99 (in Apple's xcode) has its own
+		# incompatible _and_ non-standard -W option which gives an error.  Work
+		# around that pitfall.
+		case "x${CC}@@${cf_pkg_libs}@${cf_pkg_cflags}" in
+		(x*c[89]9@@*-W*)
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_pkg_cflags
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_pkg_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+			cat >"conftest.$ac_ext" <<_ACEOF
+#line 10428 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+initscr(); mousemask(0,0); tigetstr((char *)0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:10440: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:10443: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:10446: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:10449: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  if test "$cross_compiling" = yes; then
+  cf_test_ncuconfig=maybe
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 10455 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+					int main(void)
+					{ const char *xx = curses_version(); return (xx == 0); }
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:10462: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:10465: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:10467: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:10470: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_test_ncuconfig=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_test_ncuconfig=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_test_ncuconfig=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+			CFLAGS="$cf_save_CFLAGS"
+			CPPFLAGS="$cf_save_CPPFLAGS"
+			LIBS="$cf_save_LIBS"
+
+			if test "x$cf_test_ncuconfig" != xyes; then
+				cf_temp=`echo "x$cf_pkg_cflags" | sed -e s/^x// -e 's/-W[^ 	]*//g'`
+				cf_pkg_cflags="$cf_temp"
+				cf_temp=`echo "x$cf_pkg_libs" | sed -e s/^x// -e 's/-W[^ 	]*//g'`
+				cf_pkg_libs="$cf_temp"
+			fi
+			;;
+		esac
+
+for cf_add_cflags in $cf_pkg_cflags
+do
+	case "x$cf_add_cflags" in
+	(x-[DU]*)
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CFLAGS" != "$cf_old_cflag" || break
+
+	CFLAGS="$cf_old_cflag"
+done
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CPPFLAGS" != "$cf_old_cflag" || break
+
+	CPPFLAGS="$cf_old_cflag"
+done
+
+		;;
+	esac
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_add_cflags
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+done
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_pkg_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 10644 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+initscr(); mousemask(0,0); tigetstr((char *)0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:10656: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:10659: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:10662: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:10665: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  if test "$cross_compiling" = yes; then
+  cf_have_ncuconfig=maybe
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 10671 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+				int main(void)
+				{ const char *xx = curses_version(); return (xx == 0); }
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:10678: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:10681: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:10683: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:10686: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_have_ncuconfig=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_ncuconfig=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_ncuconfig=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+		echo "$as_me:10703: result: $cf_have_ncuconfig" >&5
+echo "${ECHO_T}$cf_have_ncuconfig" >&6
+		test "$cf_have_ncuconfig" = maybe && cf_have_ncuconfig=yes
+		if test "$cf_have_ncuconfig" != "yes"
+		then
+			CPPFLAGS="$cf_save_CPPFLAGS"
+			LIBS="$cf_save_LIBS"
+			NCURSES_CONFIG_PKG=none
+		else
+
+cat >>confdefs.h <<\EOF
+#define NCURSES 1
+EOF
+
+			NCURSES_CONFIG_PKG=$cf_ncuconfig_root
+
+echo "$as_me:10719: checking for terminfo header" >&5
+echo $ECHO_N "checking for terminfo header... $ECHO_C" >&6
+if test "${cf_cv_term_header+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+case "${cf_cv_ncurses_header}" in
+(*/ncurses.h|*/ncursesw.h)
+	cf_term_header=`echo "$cf_cv_ncurses_header" | sed -e 's%ncurses[^.]*\.h$%term.h%'`
+	;;
+(*)
+	cf_term_header=term.h
+	;;
+esac
+
+for cf_test in $cf_term_header "ncurses/term.h" "ncursesw/term.h"
+do
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 10737 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <$cf_test>
+
+int
+main (void)
+{
+int x = auto_left_margin; (void)x
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:10752: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:10755: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:10758: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:10761: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+	cf_cv_term_header="$cf_test"
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+	cf_cv_term_header=unknown
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+	test "$cf_cv_term_header" != unknown && break
+done
+
+fi
+echo "$as_me:10777: result: $cf_cv_term_header" >&5
+echo "${ECHO_T}$cf_cv_term_header" >&6
+
+# Set definitions to allow ifdef'ing to accommodate subdirectories
+
+case "$cf_cv_term_header" in
+(*term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_TERM_H 1
+EOF
+
+	;;
+esac
+
+case "$cf_cv_term_header" in
+(ncurses/term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSES_TERM_H 1
+EOF
+
+	;;
+(ncursesw/term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSESW_TERM_H 1
+EOF
+
+	;;
+esac
+
+		fi
+
+	else
+		echo "$as_me:10812: result: no" >&5
+echo "${ECHO_T}no" >&6
+		NCURSES_CONFIG_PKG=none
+	fi
+else
+	NCURSES_CONFIG_PKG=none
+fi
+
+if test "x$cf_have_ncuconfig" = "xno"; then
+	cf_ncurses_config="${cf_ncuconfig_root}${NCURSES_CONFIG_SUFFIX}-config"; echo "Looking for ${cf_ncurses_config}"
+
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in ${cf_ncurses_config} ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}5-config
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:10828: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_NCURSES_CONFIG+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$NCURSES_CONFIG"; then
+  ac_cv_prog_NCURSES_CONFIG="$NCURSES_CONFIG" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_NCURSES_CONFIG="$ac_tool_prefix$ac_prog"
+echo "$as_me:10843: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+NCURSES_CONFIG=$ac_cv_prog_NCURSES_CONFIG
+if test -n "$NCURSES_CONFIG"; then
+  echo "$as_me:10851: result: $NCURSES_CONFIG" >&5
+echo "${ECHO_T}$NCURSES_CONFIG" >&6
+else
+  echo "$as_me:10854: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    test -n "$NCURSES_CONFIG" && break
+  done
+fi
+if test -z "$NCURSES_CONFIG"; then
+  ac_ct_NCURSES_CONFIG=$NCURSES_CONFIG
+  for ac_prog in ${cf_ncurses_config} ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}5-config
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:10867: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_NCURSES_CONFIG+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_NCURSES_CONFIG"; then
+  ac_cv_prog_ac_ct_NCURSES_CONFIG="$ac_ct_NCURSES_CONFIG" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ac_ct_NCURSES_CONFIG="$ac_prog"
+echo "$as_me:10882: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+ac_ct_NCURSES_CONFIG=$ac_cv_prog_ac_ct_NCURSES_CONFIG
+if test -n "$ac_ct_NCURSES_CONFIG"; then
+  echo "$as_me:10890: result: $ac_ct_NCURSES_CONFIG" >&5
+echo "${ECHO_T}$ac_ct_NCURSES_CONFIG" >&6
+else
+  echo "$as_me:10893: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$ac_ct_NCURSES_CONFIG" && break
+done
+test -n "$ac_ct_NCURSES_CONFIG" || ac_ct_NCURSES_CONFIG="none"
+
+  NCURSES_CONFIG=$ac_ct_NCURSES_CONFIG
+fi
+
+	if test "$NCURSES_CONFIG" != none ; then
+
+for cf_add_cflags in `$NCURSES_CONFIG --cflags`
+do
+	case "x$cf_add_cflags" in
+	(x-[DU]*)
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CFLAGS" != "$cf_old_cflag" || break
+
+	CFLAGS="$cf_old_cflag"
+done
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CPPFLAGS" != "$cf_old_cflag" || break
+
+	CPPFLAGS="$cf_old_cflag"
+done
+
+		;;
+	esac
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_add_cflags
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+done
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in `$NCURSES_CONFIG --libs`; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+		# even with config script, some packages use no-override for curses.h
+
+echo "$as_me:11050: checking if we have identified curses headers" >&5
+echo $ECHO_N "checking if we have identified curses headers... $ECHO_C" >&6
+if test "${cf_cv_ncurses_header+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cf_cv_ncurses_header=none
+for cf_header in \
+	ncurses.h $cf_cv_screen/ncurses.h \
+	curses.h $cf_cv_screen/curses.h
+do
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 11062 "configure"
+#include "confdefs.h"
+#include <${cf_header}>
+int
+main (void)
+{
+initscr(); tgoto("?", 0,0)
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:11074: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:11077: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:11080: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:11083: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_ncurses_header=$cf_header; break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+done
+
+fi
+echo "$as_me:11094: result: $cf_cv_ncurses_header" >&5
+echo "${ECHO_T}$cf_cv_ncurses_header" >&6
+
+if test "$cf_cv_ncurses_header" = none ; then
+	{ { echo "$as_me:11098: error: No curses header-files found" >&5
+echo "$as_me: error: No curses header-files found" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+# cheat, to get the right #define's for HAVE_NCURSES_H, etc.
+
+for ac_header in $cf_cv_ncurses_header
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:11108: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 11114 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:11118: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:11124: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:11143: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+cat >>confdefs.h <<\EOF
+#define NCURSES 1
+EOF
+
+cf_nculib_ROOT=`echo "HAVE_LIB$cf_ncuconfig_root" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+		cat >>confdefs.h <<EOF
+#define $cf_nculib_ROOT 1
+EOF
+
+				cf_cv_ncurses_version="`$NCURSES_CONFIG --version`"
+
+	else
+
+cf_ncuhdr_root=$cf_cv_screen
+
+test -n "$cf_cv_curses_dir" && \
+test "$cf_cv_curses_dir" != "no" && { \
+
+if test -n "$cf_cv_curses_dir/include/$cf_ncuhdr_root" ; then
+  for cf_add_incdir in $cf_cv_curses_dir/include/$cf_ncuhdr_root
+  do
+	while test "$cf_add_incdir" != /usr/include
+	do
+	  if test -d "$cf_add_incdir"
+	  then
+		cf_have_incdir=no
+		if test -n "$CFLAGS$CPPFLAGS" ; then
+		  # a loop is needed to ensure we can add subdirs of existing dirs
+		  for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+			if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+			  cf_have_incdir=yes; break
+			fi
+		  done
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  if test "$cf_add_incdir" = /usr/local/include ; then
+			if test "$GCC" = yes
+			then
+			  cf_save_CPPFLAGS=$CPPFLAGS
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+			  cat >"conftest.$ac_ext" <<_ACEOF
+#line 11199 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:11211: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:11214: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:11217: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:11220: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+			  CPPFLAGS=$cf_save_CPPFLAGS
+			fi
+		  fi
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  test -n "$verbose" && echo "	adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:11237: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+		  CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+		  cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+		  test "$cf_top_incdir" = "$cf_add_incdir" && break
+		  cf_add_incdir="$cf_top_incdir"
+		else
+		  break
+		fi
+	  else
+		break
+	  fi
+	done
+  done
+fi
+
+}
+
+echo "$as_me:11256: checking for $cf_ncuhdr_root header in include-path" >&5
+echo $ECHO_N "checking for $cf_ncuhdr_root header in include-path... $ECHO_C" >&6
+if test "${cf_cv_ncurses_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cf_header_list="$cf_ncuhdr_root/curses.h $cf_ncuhdr_root/ncurses.h"
+	{ test "$cf_ncuhdr_root" = ncurses || test "$cf_ncuhdr_root" = ncursesw; } && cf_header_list="$cf_header_list curses.h ncurses.h"
+	for cf_header in $cf_header_list
+	do
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 11268 "configure"
+#include "confdefs.h"
+
+#include <$cf_header>
+int
+main (void)
+{
+
+#ifdef NCURSES_VERSION
+
+printf("%s\\n", NCURSES_VERSION);
+#else
+#ifdef __NCURSES_H
+printf("old\\n");
+#else
+	make an error
+#endif
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:11292: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:11295: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:11298: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:11301: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_ncurses_h=$cf_header
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_ncurses_h=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+		test "$cf_cv_ncurses_h" != no && break
+	done
+
+fi
+echo "$as_me:11316: result: $cf_cv_ncurses_h" >&5
+echo "${ECHO_T}$cf_cv_ncurses_h" >&6
+
+if test "$cf_cv_ncurses_h" != no ; then
+	cf_cv_ncurses_header=$cf_cv_ncurses_h
+else
+
+echo "$as_me:11323: checking for $cf_ncuhdr_root include-path" >&5
+echo $ECHO_N "checking for $cf_ncuhdr_root include-path... $ECHO_C" >&6
+if test "${cf_cv_ncurses_h2+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	test -n "$verbose" && echo
+
+cf_search=
+
+# collect the current set of include-directories from compiler flags
+cf_header_path_list=""
+if test -n "${CFLAGS}${CPPFLAGS}" ; then
+	for cf_header_path in $CPPFLAGS $CFLAGS
+	do
+		case "$cf_header_path" in
+		(-I*)
+			cf_header_path=`echo ".$cf_header_path" |sed -e 's/^...//' -e 's,/include$,,'`
+
+test "x$cf_header_path" != "xNONE" && \
+test -d "$cf_header_path" && \
+ {
+	test -n "$verbose" && echo "	... testing for include-directories under $cf_header_path"
+	test -d "$cf_header_path/include" &&          cf_search="$cf_search $cf_header_path/include"
+	test -d "$cf_header_path/include/$cf_ncuhdr_root" &&       cf_search="$cf_search $cf_header_path/include/$cf_ncuhdr_root"
+	test -d "$cf_header_path/include/$cf_ncuhdr_root/include" &&    cf_search="$cf_search $cf_header_path/include/$cf_ncuhdr_root/include"
+	test -d "$cf_header_path/$cf_ncuhdr_root/include" &&       cf_search="$cf_search $cf_header_path/$cf_ncuhdr_root/include"
+	test -d "$cf_header_path/$cf_ncuhdr_root/include/$cf_ncuhdr_root" &&    cf_search="$cf_search $cf_header_path/$cf_ncuhdr_root/include/$cf_ncuhdr_root"
+}
+
+			cf_header_path_list="$cf_header_path_list $cf_search"
+			;;
+		esac
+	done
+fi
+
+# add the variations for the package we are looking for
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+	test -n "$verbose" && echo "	... testing for include-directories under $prefix"
+	test -d "$prefix/include" &&          cf_search="$cf_search $prefix/include"
+	test -d "$prefix/include/$cf_ncuhdr_root" &&       cf_search="$cf_search $prefix/include/$cf_ncuhdr_root"
+	test -d "$prefix/include/$cf_ncuhdr_root/include" &&    cf_search="$cf_search $prefix/include/$cf_ncuhdr_root/include"
+	test -d "$prefix/$cf_ncuhdr_root/include" &&       cf_search="$cf_search $prefix/$cf_ncuhdr_root/include"
+	test -d "$prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root" &&    cf_search="$cf_search $prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root"
+}
+
+for cf_subdir_prefix in \
+	/usr \
+	/usr/local \
+	/usr/pkg \
+	/opt \
+	/opt/local \
+	$HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+	test -n "$verbose" && echo "	... testing for include-directories under $cf_subdir_prefix"
+	test -d "$cf_subdir_prefix/include" &&          cf_search="$cf_search $cf_subdir_prefix/include"
+	test -d "$cf_subdir_prefix/include/$cf_ncuhdr_root" &&       cf_search="$cf_search $cf_subdir_prefix/include/$cf_ncuhdr_root"
+	test -d "$cf_subdir_prefix/include/$cf_ncuhdr_root/include" &&    cf_search="$cf_search $cf_subdir_prefix/include/$cf_ncuhdr_root/include"
+	test -d "$cf_subdir_prefix/$cf_ncuhdr_root/include" &&       cf_search="$cf_search $cf_subdir_prefix/$cf_ncuhdr_root/include"
+	test -d "$cf_subdir_prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root" &&    cf_search="$cf_search $cf_subdir_prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root"
+}
+
+done
+
+test "$includedir" != NONE && \
+test "$includedir" != "/usr/include" && \
+test -d "$includedir" && {
+	test -d "$includedir" &&    cf_search="$cf_search $includedir"
+	test -d "$includedir/$cf_ncuhdr_root" && cf_search="$cf_search $includedir/$cf_ncuhdr_root"
+}
+
+test "$oldincludedir" != NONE && \
+test "$oldincludedir" != "/usr/include" && \
+test -d "$oldincludedir" && {
+	test -d "$oldincludedir"    && cf_search="$cf_search $oldincludedir"
+	test -d "$oldincludedir/$cf_ncuhdr_root" && cf_search="$cf_search $oldincludedir/$cf_ncuhdr_root"
+}
+
+cf_search="$cf_search $cf_header_path_list"
+
+	test -n "$verbose" && echo "search path $cf_search"
+	cf_save2_CPPFLAGS="$CPPFLAGS"
+	for cf_incdir in $cf_search
+	do
+
+if test -n "$cf_incdir" ; then
+  for cf_add_incdir in $cf_incdir
+  do
+	while test "$cf_add_incdir" != /usr/include
+	do
+	  if test -d "$cf_add_incdir"
+	  then
+		cf_have_incdir=no
+		if test -n "$CFLAGS$CPPFLAGS" ; then
+		  # a loop is needed to ensure we can add subdirs of existing dirs
+		  for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+			if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+			  cf_have_incdir=yes; break
+			fi
+		  done
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  if test "$cf_add_incdir" = /usr/local/include ; then
+			if test "$GCC" = yes
+			then
+			  cf_save_CPPFLAGS=$CPPFLAGS
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+			  cat >"conftest.$ac_ext" <<_ACEOF
+#line 11444 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:11456: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:11459: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:11462: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:11465: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+			  CPPFLAGS=$cf_save_CPPFLAGS
+			fi
+		  fi
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  test -n "$verbose" && echo "	adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:11482: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+		  CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+		  cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+		  test "$cf_top_incdir" = "$cf_add_incdir" && break
+		  cf_add_incdir="$cf_top_incdir"
+		else
+		  break
+		fi
+	  else
+		break
+	  fi
+	done
+  done
+fi
+
+		for cf_header in \
+			ncurses.h \
+			curses.h
+		do
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 11505 "configure"
+#include "confdefs.h"
+
+#include <$cf_header>
+int
+main (void)
+{
+
+#ifdef NCURSES_VERSION
+
+printf("%s\\n", NCURSES_VERSION);
+#else
+#ifdef __NCURSES_H
+printf("old\\n");
+#else
+	make an error
+#endif
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:11529: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:11532: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:11535: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:11538: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_ncurses_h2=$cf_header
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_ncurses_h2=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+			if test "$cf_cv_ncurses_h2" != no ; then
+				cf_cv_ncurses_h2=$cf_incdir/$cf_header
+				test -n "$verbose" && echo $ECHO_N "	... found $ECHO_C" 1>&6
+				break
+			fi
+			test -n "$verbose" && echo "	... tested $cf_incdir/$cf_header" 1>&6
+		done
+		CPPFLAGS="$cf_save2_CPPFLAGS"
+		test "$cf_cv_ncurses_h2" != no && break
+	done
+	test "$cf_cv_ncurses_h2" = no && { { echo "$as_me:11559: error: not found" >&5
+echo "$as_me: error: not found" >&2;}
+   { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:11564: result: $cf_cv_ncurses_h2" >&5
+echo "${ECHO_T}$cf_cv_ncurses_h2" >&6
+
+	cf_1st_incdir=`echo "$cf_cv_ncurses_h2" | sed -e 's%/[^/]*$%%'`
+	cf_cv_ncurses_header="`basename "$cf_cv_ncurses_h2"`"
+	if test "`basename "$cf_1st_incdir"`" = "$cf_ncuhdr_root" ; then
+		cf_cv_ncurses_header="$cf_ncuhdr_root/$cf_cv_ncurses_header"
+	fi
+
+if test -n "$cf_1st_incdir" ; then
+  for cf_add_incdir in $cf_1st_incdir
+  do
+	while test "$cf_add_incdir" != /usr/include
+	do
+	  if test -d "$cf_add_incdir"
+	  then
+		cf_have_incdir=no
+		if test -n "$CFLAGS$CPPFLAGS" ; then
+		  # a loop is needed to ensure we can add subdirs of existing dirs
+		  for cf_test_incdir in $CFLAGS $CPPFLAGS ; do
+			if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then
+			  cf_have_incdir=yes; break
+			fi
+		  done
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  if test "$cf_add_incdir" = /usr/local/include ; then
+			if test "$GCC" = yes
+			then
+			  cf_save_CPPFLAGS=$CPPFLAGS
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir"
+
+			  cat >"conftest.$ac_ext" <<_ACEOF
+#line 11600 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello")
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:11612: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:11615: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:11618: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:11621: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_incdir=yes
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+			  CPPFLAGS=$cf_save_CPPFLAGS
+			fi
+		  fi
+		fi
+
+		if test "$cf_have_incdir" = no ; then
+		  test -n "$verbose" && echo "	adding $cf_add_incdir to include-path" 1>&6
+
+echo "${as_me:-configure}:11638: testing adding $cf_add_incdir to include-path ..." 1>&5
+
+		  CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
+
+		  cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'`
+		  test "$cf_top_incdir" = "$cf_add_incdir" && break
+		  cf_add_incdir="$cf_top_incdir"
+		else
+		  break
+		fi
+	  else
+		break
+	  fi
+	done
+  done
+fi
+
+fi
+
+# Set definitions to allow ifdef'ing for ncurses.h
+
+case "$cf_cv_ncurses_header" in
+(*ncurses.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSES_H 1
+EOF
+
+	;;
+esac
+
+case "$cf_cv_ncurses_header" in
+(ncurses/curses.h|ncurses/ncurses.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSES_NCURSES_H 1
+EOF
+
+	;;
+(ncursesw/curses.h|ncursesw/ncurses.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSESW_NCURSES_H 1
+EOF
+
+	;;
+esac
+
+echo "$as_me:11686: checking for terminfo header" >&5
+echo $ECHO_N "checking for terminfo header... $ECHO_C" >&6
+if test "${cf_cv_term_header+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+case "${cf_cv_ncurses_header}" in
+(*/ncurses.h|*/ncursesw.h)
+	cf_term_header=`echo "$cf_cv_ncurses_header" | sed -e 's%ncurses[^.]*\.h$%term.h%'`
+	;;
+(*)
+	cf_term_header=term.h
+	;;
+esac
+
+for cf_test in $cf_term_header "ncurses/term.h" "ncursesw/term.h"
+do
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 11704 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <$cf_test>
+
+int
+main (void)
+{
+int x = auto_left_margin; (void)x
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:11719: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:11722: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:11725: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:11728: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+	cf_cv_term_header="$cf_test"
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+	cf_cv_term_header=unknown
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+	test "$cf_cv_term_header" != unknown && break
+done
+
+fi
+echo "$as_me:11744: result: $cf_cv_term_header" >&5
+echo "${ECHO_T}$cf_cv_term_header" >&6
+
+# Set definitions to allow ifdef'ing to accommodate subdirectories
+
+case "$cf_cv_term_header" in
+(*term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_TERM_H 1
+EOF
+
+	;;
+esac
+
+case "$cf_cv_term_header" in
+(ncurses/term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSES_TERM_H 1
+EOF
+
+	;;
+(ncursesw/term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSESW_TERM_H 1
+EOF
+
+	;;
+esac
+
+# some applications need this, but should check for NCURSES_VERSION
+
+cat >>confdefs.h <<\EOF
+#define NCURSES 1
+EOF
+
+echo "$as_me:11782: checking for ncurses version" >&5
+echo $ECHO_N "checking for ncurses version... $ECHO_C" >&6
+if test "${cf_cv_ncurses_version+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cf_cv_ncurses_version=no
+	cf_tempfile=out$$
+	rm -f "$cf_tempfile"
+	if test "$cross_compiling" = yes; then
+
+	# This will not work if the preprocessor splits the line after the
+	# Autoconf token.  The 'unproto' program does that.
+	cat > "conftest.$ac_ext" <<EOF
+#include <${cf_cv_ncurses_header:-curses.h}>
+#undef Autoconf
+#ifdef NCURSES_VERSION
+Autoconf NCURSES_VERSION
+#else
+#ifdef __NCURSES_H
+Autoconf "old"
+#endif
+;
+#endif
+EOF
+	cf_try="$ac_cpp conftest.$ac_ext 2>&5 | grep '^Autoconf ' >conftest.out"
+	{ (eval echo "$as_me:11808: \"$cf_try\"") >&5
+  (eval $cf_try) 2>&5
+  ac_status=$?
+  echo "$as_me:11811: \$? = $ac_status" >&5
+  (exit "$ac_status"); }
+	if test -f conftest.out ; then
+		cf_out=`sed -e 's%^Autoconf %%' -e 's%^[^"]*"%%' -e 's%".*%%' conftest.out`
+		test -n "$cf_out" && cf_cv_ncurses_version="$cf_out"
+		rm -f conftest.out
+	fi
+
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 11821 "configure"
+#include "confdefs.h"
+
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <stdio.h>
+int main(void)
+{
+	FILE *fp = fopen("$cf_tempfile", "w");
+#ifdef NCURSES_VERSION
+# ifdef NCURSES_VERSION_PATCH
+	fprintf(fp, "%s.%d\\n", NCURSES_VERSION, NCURSES_VERSION_PATCH);
+# else
+	fprintf(fp, "%s\\n", NCURSES_VERSION);
+# endif
+#else
+# ifdef __NCURSES_H
+	fprintf(fp, "old\\n");
+# else
+	make an error
+# endif
+#endif
+	${cf_cv_main_return:-return}(0);
+}
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:11846: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:11849: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:11851: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:11854: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+	cf_cv_ncurses_version=`cat $cf_tempfile`
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+	rm -f "$cf_tempfile"
+
+fi
+echo "$as_me:11868: result: $cf_cv_ncurses_version" >&5
+echo "${ECHO_T}$cf_cv_ncurses_version" >&6
+test "$cf_cv_ncurses_version" = no ||
+cat >>confdefs.h <<\EOF
+#define NCURSES 1
+EOF
+
+cf_nculib_root=$cf_cv_screen
+	# This works, except for the special case where we find gpm, but
+	# ncurses is in a nonstandard location via $LIBS, and we really want
+	# to link gpm.
+cf_ncurses_LIBS=""
+cf_ncurses_SAVE="$LIBS"
+echo "$as_me:11881: checking for Gpm_Open in -lgpm" >&5
+echo $ECHO_N "checking for Gpm_Open in -lgpm... $ECHO_C" >&6
+if test "${ac_cv_lib_gpm_Gpm_Open+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lgpm  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 11889 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char Gpm_Open ();
+int
+main (void)
+{
+Gpm_Open ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:11908: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:11911: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:11914: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:11917: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_gpm_Gpm_Open=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_gpm_Gpm_Open=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:11928: result: $ac_cv_lib_gpm_Gpm_Open" >&5
+echo "${ECHO_T}$ac_cv_lib_gpm_Gpm_Open" >&6
+if test "$ac_cv_lib_gpm_Gpm_Open" = yes; then
+  echo "$as_me:11931: checking for initscr in -lgpm" >&5
+echo $ECHO_N "checking for initscr in -lgpm... $ECHO_C" >&6
+if test "${ac_cv_lib_gpm_initscr+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lgpm  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 11939 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char initscr ();
+int
+main (void)
+{
+initscr ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:11958: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:11961: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:11964: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:11967: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_gpm_initscr=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_gpm_initscr=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:11978: result: $ac_cv_lib_gpm_initscr" >&5
+echo "${ECHO_T}$ac_cv_lib_gpm_initscr" >&6
+if test "$ac_cv_lib_gpm_initscr" = yes; then
+  LIBS="$cf_ncurses_SAVE"
+else
+  cf_ncurses_LIBS="-lgpm"
+fi
+
+fi
+
+case "$host_os" in
+(freebsd*)
+	# This is only necessary if you are linking against an obsolete
+	# version of ncurses (but it should do no harm, since it is static).
+	if test "$cf_nculib_root" = ncurses ; then
+		echo "$as_me:11993: checking for tgoto in -lmytinfo" >&5
+echo $ECHO_N "checking for tgoto in -lmytinfo... $ECHO_C" >&6
+if test "${ac_cv_lib_mytinfo_tgoto+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lmytinfo  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 12001 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char tgoto ();
+int
+main (void)
+{
+tgoto ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:12020: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:12023: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:12026: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:12029: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_mytinfo_tgoto=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_mytinfo_tgoto=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:12040: result: $ac_cv_lib_mytinfo_tgoto" >&5
+echo "${ECHO_T}$ac_cv_lib_mytinfo_tgoto" >&6
+if test "$ac_cv_lib_mytinfo_tgoto" = yes; then
+  cf_ncurses_LIBS="-lmytinfo $cf_ncurses_LIBS"
+fi
+
+	fi
+	;;
+esac
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_ncurses_LIBS; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+if test -n "$cf_cv_curses_dir" && test "$cf_cv_curses_dir" != "no"
+then
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -l$cf_nculib_root; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+else
+
+	eval 'cf_cv_have_lib_'"$cf_nculib_root"'=no'
+	cf_libdir=""
+	echo "$as_me:12089: checking for initscr" >&5
+echo $ECHO_N "checking for initscr... $ECHO_C" >&6
+if test "${ac_cv_func_initscr+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 12095 "configure"
+#include "confdefs.h"
+#define initscr autoconf_temporary
+#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
+#undef initscr
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char initscr (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_initscr) || defined (__stub___initscr)
+#error found stub for initscr
+#endif
+
+	return initscr ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:12126: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:12129: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:12132: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:12135: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_func_initscr=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_initscr=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:12145: result: $ac_cv_func_initscr" >&5
+echo "${ECHO_T}$ac_cv_func_initscr" >&6
+if test "$ac_cv_func_initscr" = yes; then
+  eval 'cf_cv_have_lib_'"$cf_nculib_root"'=yes'
+else
+
+		cf_save_LIBS="$LIBS"
+		echo "$as_me:12152: checking for initscr in -l$cf_nculib_root" >&5
+echo $ECHO_N "checking for initscr in -l$cf_nculib_root... $ECHO_C" >&6
+		LIBS="-l$cf_nculib_root $LIBS"
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 12156 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+initscr()
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:12168: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:12171: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:12174: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:12177: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  echo "$as_me:12179: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+			 eval 'cf_cv_have_lib_'"$cf_nculib_root"'=yes'
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+echo "$as_me:12186: result: no" >&5
+echo "${ECHO_T}no" >&6
+
+cf_search=
+cf_library_path_list=""
+if test -n "${LDFLAGS}${LIBS}" ; then
+	for cf_library_path in $LDFLAGS $LIBS
+	do
+		case "$cf_library_path" in
+		(-L*)
+			cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'`
+
+test "x$cf_library_path" != "xNONE" && \
+test -d "$cf_library_path" && \
+ {
+	test -n "$verbose" && echo "	... testing for lib-directories under $cf_library_path"
+	test -d "$cf_library_path/lib" &&          cf_search="$cf_search $cf_library_path/lib"
+	test -d "$cf_library_path/lib/$cf_nculib_root" &&       cf_search="$cf_search $cf_library_path/lib/$cf_nculib_root"
+	test -d "$cf_library_path/lib/$cf_nculib_root/lib" &&    cf_search="$cf_search $cf_library_path/lib/$cf_nculib_root/lib"
+	test -d "$cf_library_path/$cf_nculib_root/lib" &&       cf_search="$cf_search $cf_library_path/$cf_nculib_root/lib"
+	test -d "$cf_library_path/$cf_nculib_root/lib/$cf_nculib_root" &&    cf_search="$cf_search $cf_library_path/$cf_nculib_root/lib/$cf_nculib_root"
+}
+
+			cf_library_path_list="$cf_library_path_list $cf_search"
+			;;
+		esac
+	done
+fi
+
+cf_search=
+
+test "x$prefix" != "xNONE" && \
+test -d "$prefix" && \
+ {
+	test -n "$verbose" && echo "	... testing for lib-directories under $prefix"
+	test -d "$prefix/lib" &&          cf_search="$cf_search $prefix/lib"
+	test -d "$prefix/lib/$cf_nculib_root" &&       cf_search="$cf_search $prefix/lib/$cf_nculib_root"
+	test -d "$prefix/lib/$cf_nculib_root/lib" &&    cf_search="$cf_search $prefix/lib/$cf_nculib_root/lib"
+	test -d "$prefix/$cf_nculib_root/lib" &&       cf_search="$cf_search $prefix/$cf_nculib_root/lib"
+	test -d "$prefix/$cf_nculib_root/lib/$cf_nculib_root" &&    cf_search="$cf_search $prefix/$cf_nculib_root/lib/$cf_nculib_root"
+}
+
+for cf_subdir_prefix in \
+	/usr \
+	/usr/local \
+	/usr/pkg \
+	/opt \
+	/opt/local \
+	$HOME
+do
+
+test "x$cf_subdir_prefix" != "x$prefix" && \
+test -d "$cf_subdir_prefix" && \
+{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && {
+	test -n "$verbose" && echo "	... testing for lib-directories under $cf_subdir_prefix"
+	test -d "$cf_subdir_prefix/lib" &&          cf_search="$cf_search $cf_subdir_prefix/lib"
+	test -d "$cf_subdir_prefix/lib/$cf_nculib_root" &&       cf_search="$cf_search $cf_subdir_prefix/lib/$cf_nculib_root"
+	test -d "$cf_subdir_prefix/lib/$cf_nculib_root/lib" &&    cf_search="$cf_search $cf_subdir_prefix/lib/$cf_nculib_root/lib"
+	test -d "$cf_subdir_prefix/$cf_nculib_root/lib" &&       cf_search="$cf_search $cf_subdir_prefix/$cf_nculib_root/lib"
+	test -d "$cf_subdir_prefix/$cf_nculib_root/lib/$cf_nculib_root" &&    cf_search="$cf_search $cf_subdir_prefix/$cf_nculib_root/lib/$cf_nculib_root"
+}
+
+done
+
+cf_search="$cf_library_path_list $cf_search"
+
+			for cf_libdir in $cf_search
+			do
+				echo "$as_me:12254: checking for -l$cf_nculib_root in $cf_libdir" >&5
+echo $ECHO_N "checking for -l$cf_nculib_root in $cf_libdir... $ECHO_C" >&6
+				LIBS="-L$cf_libdir -l$cf_nculib_root $cf_save_LIBS"
+				cat >"conftest.$ac_ext" <<_ACEOF
+#line 12258 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+initscr()
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:12270: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:12273: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:12276: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:12279: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  echo "$as_me:12281: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+			 		 eval 'cf_cv_have_lib_'"$cf_nculib_root"'=yes'
+					 break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+echo "$as_me:12288: result: no" >&5
+echo "${ECHO_T}no" >&6
+					 LIBS="$cf_save_LIBS"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+			done
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+
+eval 'cf_found_library="$cf_cv_have_lib_'"$cf_nculib_root"\"
+
+if test "$cf_found_library" = no ; then
+	{ { echo "$as_me:12303: error: Cannot link $cf_nculib_root library" >&5
+echo "$as_me: error: Cannot link $cf_nculib_root library" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+fi
+
+if test -n "$cf_ncurses_LIBS" ; then
+	echo "$as_me:12311: checking if we can link $cf_nculib_root without $cf_ncurses_LIBS" >&5
+echo $ECHO_N "checking if we can link $cf_nculib_root without $cf_ncurses_LIBS... $ECHO_C" >&6
+	cf_ncurses_SAVE="$LIBS"
+	for p in $cf_ncurses_LIBS ; do
+		q=`echo "$LIBS" | sed -e "s%$p %%" -e "s%$p$%%"`
+		if test "$q" != "$LIBS" ; then
+			LIBS="$q"
+		fi
+	done
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 12321 "configure"
+#include "confdefs.h"
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+initscr(); mousemask(0,0); tigetstr((char *)0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:12333: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:12336: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:12339: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:12342: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  echo "$as_me:12344: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+echo "$as_me:12349: result: no" >&5
+echo "${ECHO_T}no" >&6
+		 LIBS="$cf_ncurses_SAVE"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+
+cf_nculib_ROOT=`echo "HAVE_LIB$cf_nculib_root" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+cat >>confdefs.h <<EOF
+#define $cf_nculib_ROOT 1
+EOF
+
+	fi
+else
+	NCURSES_CONFIG=none
+fi
+
+	;;
+(pdcurses)
+	echo "$as_me:12369: checking for X" >&5
+echo $ECHO_N "checking for X... $ECHO_C" >&6
+
+# Check whether --with-x or --without-x was given.
+if test "${with_x+set}" = set; then
+  withval="$with_x"
+
+fi;
+# $have_x is `yes', `no', `disabled', or empty when we do not yet know.
+if test "x$with_x" = xno; then
+  # The user explicitly disabled X.
+  have_x=disabled
+else
+  if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then
+    # Both variables are already set.
+    have_x=yes
+  else
+    if test "${ac_cv_have_x+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  # One or both of the vars are not set, and there is no cached value.
+ac_x_includes=no ac_x_libraries=no
+rm -fr conftest.dir
+if mkdir conftest.dir; then
+  cd conftest.dir
+  # Make sure to not put "make" in the Imakefile rules, since we grep it out.
+  cat >Imakefile <<'EOF'
+acfindx:
+	@echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"'
+EOF
+  if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then
+    # GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+    eval "`${MAKE-make} acfindx 2>/dev/null | grep -v make`"
+    # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR.
+    for ac_extension in a so sl dylib dll; do
+      if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" &&
+         test -f "$ac_im_libdir/libX11.$ac_extension"; then
+        ac_im_usrlibdir=$ac_im_libdir; break
+      fi
+    done
+    # Screen out bogus values from the imake configuration.  They are
+    # bogus both because they are the default anyway, and because
+    # using them would break gcc on systems where it needs fixed includes.
+    case $ac_im_incroot in
+	/usr/include) ;;
+	*) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;;
+    esac
+    case $ac_im_usrlibdir in
+	/usr/lib | /lib) ;;
+	*) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;;
+    esac
+  fi
+  cd ..
+  rm -fr conftest.dir
+fi
+
+# Standard set of common directories for X headers.
+# Check X11 before X11Rn because it is often a symlink to the current release.
+ac_x_header_dirs='
+/usr/X11/include
+/usr/X11R7/include
+/usr/X11R6/include
+/usr/X11R5/include
+/usr/X11R4/include
+
+/opt/local/include
+/opt/X11/include
+
+/usr/include/X11
+/usr/include/X11R7
+/usr/include/X11R6
+/usr/include/X11R5
+/usr/include/X11R4
+
+/usr/local/X11/include
+/usr/local/X11R7/include
+/usr/local/X11R6/include
+/usr/local/X11R5/include
+/usr/local/X11R4/include
+
+/usr/local/include/X11
+/usr/local/include/X11R7
+/usr/local/include/X11R6
+/usr/local/include/X11R5
+/usr/local/include/X11R4
+
+/usr/X386/include
+/usr/x386/include
+/usr/XFree86/include/X11
+
+/usr/include
+/usr/local/include
+/usr/unsupported/include
+/usr/athena/include
+/usr/local/x11r5/include
+/usr/lpp/Xamples/include
+
+/usr/openwin/include
+/usr/openwin/share/include'
+
+if test "$ac_x_includes" = no; then
+  # Guess where to find include files, by looking for Intrinsic.h.
+  # First, try using that file with no special directory specified.
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 12473 "configure"
+#include "confdefs.h"
+#include <X11/Intrinsic.h>
+_ACEOF
+if { (eval echo "$as_me:12477: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:12483: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # We can compile using X headers with no special include directory.
+ac_x_includes=
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  for ac_dir in $ac_x_header_dirs; do
+  if test -r "$ac_dir/X11/Intrinsic.h"; then
+    ac_x_includes=$ac_dir
+    break
+  fi
+done
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi # $ac_x_includes = no
+
+if test "$ac_x_libraries" = no; then
+  # Check for the libraries.
+  # See if we find them without any special options.
+  # Don't add to $LIBS permanently.
+  ac_save_LIBS=$LIBS
+  LIBS="-lXt $LIBS"
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 12516 "configure"
+#include "confdefs.h"
+#include <X11/Intrinsic.h>
+int
+main (void)
+{
+XtMalloc (0)
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:12528: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:12531: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:12534: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:12537: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  LIBS=$ac_save_LIBS
+# We can link X programs with no special library path.
+ac_x_libraries=
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+LIBS=$ac_save_LIBS
+for ac_dir in `echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g`
+do
+  # Don't even attempt the hair of trying to link an X program!
+  for ac_extension in a so sl dylib dll; do
+    if test -r "$ac_dir/libXt.$ac_extension"; then
+      ac_x_libraries=$ac_dir
+      break 2
+    fi
+  done
+done
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi # $ac_x_libraries = no
+
+if test "$ac_x_includes" = no || test "$ac_x_libraries" = no; then
+  # Didn't find X anywhere.  Cache the known absence of X.
+  ac_cv_have_x="have_x=no"
+else
+  # Record where we found X for the cache.
+  ac_cv_have_x="have_x=yes \
+	        ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries"
+fi
+fi
+
+  fi
+  eval "$ac_cv_have_x"
+fi # $with_x != no
+
+if test "$have_x" != yes; then
+  echo "$as_me:12575: result: $have_x" >&5
+echo "${ECHO_T}$have_x" >&6
+  no_x=yes
+else
+  # If each of the values was on the command line, it overrides each guess.
+  test "x$x_includes" = xNONE && x_includes=$ac_x_includes
+  test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries
+  # Update the cache value to reflect the command line values.
+  ac_cv_have_x="have_x=yes \
+		ac_x_includes=$x_includes ac_x_libraries=$x_libraries"
+  echo "$as_me:12585: result: libraries $x_libraries, headers $x_includes" >&5
+echo "${ECHO_T}libraries $x_libraries, headers $x_includes" >&6
+fi
+
+if test "$no_x" = yes; then
+  # Not all programs may use this symbol, but it does not hurt to define it.
+
+cat >>confdefs.h <<\EOF
+#define X_DISPLAY_MISSING 1
+EOF
+
+  X_CFLAGS=
+  X_PRE_LIBS=
+  X_LIBS=
+  X_EXTRA_LIBS=
+else
+  if test -n "$x_includes"; then
+    X_CFLAGS="$X_CFLAGS -I$x_includes"
+  fi
+
+  # It would also be nice to do this for all -L options, not just this one.
+  if test -n "$x_libraries"; then
+    X_LIBS="$X_LIBS -L$x_libraries"
+    # For Solaris; some versions of Sun CC require a space after -R and
+    # others require no space.  Words are not sufficient . . . .
+    case `(uname -sr) 2>/dev/null` in
+    "SunOS 5"*)
+      echo "$as_me:12612: checking whether -R must be followed by a space" >&5
+echo $ECHO_N "checking whether -R must be followed by a space... $ECHO_C" >&6
+      ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries"
+      cat >"conftest.$ac_ext" <<_ACEOF
+#line 12616 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:12628: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:12631: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:12634: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:12637: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_R_nospace=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_R_nospace=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+      if test $ac_R_nospace = yes; then
+	echo "$as_me:12647: result: no" >&5
+echo "${ECHO_T}no" >&6
+	X_LIBS="$X_LIBS -R$x_libraries"
+      else
+	LIBS="$ac_xsave_LIBS -R $x_libraries"
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 12653 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:12665: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:12668: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:12671: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:12674: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_R_space=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_R_space=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+	if test $ac_R_space = yes; then
+	  echo "$as_me:12684: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+	  X_LIBS="$X_LIBS -R $x_libraries"
+	else
+	  echo "$as_me:12688: result: neither works" >&5
+echo "${ECHO_T}neither works" >&6
+	fi
+      fi
+      LIBS=$ac_xsave_LIBS
+    esac
+  fi
+
+  # Check for system-dependent libraries X programs must link with.
+  # Do this before checking for the system-independent R6 libraries
+  # (-lICE), since we may need -lsocket or whatever for X linking.
+
+  if test "$ISC" = yes; then
+    X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet"
+  else
+    # Martyn Johnson says this is needed for Ultrix, if the X
+    # libraries were built with DECnet support.  And Karl Berry says
+    # the Alpha needs dnet_stub (dnet does not exist).
+    ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11"
+    cat >"conftest.$ac_ext" <<_ACEOF
+#line 12708 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char XOpenDisplay ();
+int
+main (void)
+{
+XOpenDisplay ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:12727: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:12730: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:12733: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:12736: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+echo "$as_me:12742: checking for dnet_ntoa in -ldnet" >&5
+echo $ECHO_N "checking for dnet_ntoa in -ldnet... $ECHO_C" >&6
+if test "${ac_cv_lib_dnet_dnet_ntoa+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldnet  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 12750 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char dnet_ntoa ();
+int
+main (void)
+{
+dnet_ntoa ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:12769: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:12772: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:12775: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:12778: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_dnet_dnet_ntoa=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_dnet_dnet_ntoa=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:12789: result: $ac_cv_lib_dnet_dnet_ntoa" >&5
+echo "${ECHO_T}$ac_cv_lib_dnet_dnet_ntoa" >&6
+if test "$ac_cv_lib_dnet_dnet_ntoa" = yes; then
+  X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet"
+fi
+
+    if test $ac_cv_lib_dnet_dnet_ntoa = no; then
+      echo "$as_me:12796: checking for dnet_ntoa in -ldnet_stub" >&5
+echo $ECHO_N "checking for dnet_ntoa in -ldnet_stub... $ECHO_C" >&6
+if test "${ac_cv_lib_dnet_stub_dnet_ntoa+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldnet_stub  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 12804 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char dnet_ntoa ();
+int
+main (void)
+{
+dnet_ntoa ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:12823: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:12826: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:12829: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:12832: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_dnet_stub_dnet_ntoa=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_dnet_stub_dnet_ntoa=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:12843: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5
+echo "${ECHO_T}$ac_cv_lib_dnet_stub_dnet_ntoa" >&6
+if test "$ac_cv_lib_dnet_stub_dnet_ntoa" = yes; then
+  X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub"
+fi
+
+    fi
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+    LIBS="$ac_xsave_LIBS"
+
+    # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT,
+    # to get the SysV transport functions.
+    # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4)
+    # needs -lnsl.
+    # The nsl library prevents programs from opening the X display
+    # on Irix 5.2, according to T.E. Dickey.
+    # The functions gethostbyname, getservbyname, and inet_addr are
+    # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking.
+    echo "$as_me:12862: checking for gethostbyname" >&5
+echo $ECHO_N "checking for gethostbyname... $ECHO_C" >&6
+if test "${ac_cv_func_gethostbyname+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 12868 "configure"
+#include "confdefs.h"
+#define gethostbyname autoconf_temporary
+#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
+#undef gethostbyname
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char gethostbyname (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_gethostbyname) || defined (__stub___gethostbyname)
+#error found stub for gethostbyname
+#endif
+
+	return gethostbyname ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:12899: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:12902: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:12905: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:12908: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_func_gethostbyname=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_gethostbyname=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:12918: result: $ac_cv_func_gethostbyname" >&5
+echo "${ECHO_T}$ac_cv_func_gethostbyname" >&6
+
+    if test $ac_cv_func_gethostbyname = no; then
+      echo "$as_me:12922: checking for gethostbyname in -lnsl" >&5
+echo $ECHO_N "checking for gethostbyname in -lnsl... $ECHO_C" >&6
+if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lnsl  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 12930 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char gethostbyname ();
+int
+main (void)
+{
+gethostbyname ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:12949: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:12952: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:12955: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:12958: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_nsl_gethostbyname=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_nsl_gethostbyname=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:12969: result: $ac_cv_lib_nsl_gethostbyname" >&5
+echo "${ECHO_T}$ac_cv_lib_nsl_gethostbyname" >&6
+if test "$ac_cv_lib_nsl_gethostbyname" = yes; then
+  X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl"
+fi
+
+      if test $ac_cv_lib_nsl_gethostbyname = no; then
+        echo "$as_me:12976: checking for gethostbyname in -lbsd" >&5
+echo $ECHO_N "checking for gethostbyname in -lbsd... $ECHO_C" >&6
+if test "${ac_cv_lib_bsd_gethostbyname+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lbsd  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 12984 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char gethostbyname ();
+int
+main (void)
+{
+gethostbyname ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:13003: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:13006: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:13009: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:13012: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_bsd_gethostbyname=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_bsd_gethostbyname=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:13023: result: $ac_cv_lib_bsd_gethostbyname" >&5
+echo "${ECHO_T}$ac_cv_lib_bsd_gethostbyname" >&6
+if test "$ac_cv_lib_bsd_gethostbyname" = yes; then
+  X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd"
+fi
+
+      fi
+    fi
+
+    # lieder@skyler.mavd.honeywell.com says without -lsocket,
+    # socket/setsockopt and other routines are undefined under SCO ODT
+    # 2.0.  But -lsocket is broken on IRIX 5.2 (and is not necessary
+    # on later versions), says Simon Leinen: it contains gethostby*
+    # variants that don't use the nameserver (or something).  -lsocket
+    # must be given before -lnsl if both are needed.  We assume that
+    # if connect needs -lnsl, so does gethostbyname.
+    echo "$as_me:13039: checking for connect" >&5
+echo $ECHO_N "checking for connect... $ECHO_C" >&6
+if test "${ac_cv_func_connect+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 13045 "configure"
+#include "confdefs.h"
+#define connect autoconf_temporary
+#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
+#undef connect
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char connect (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_connect) || defined (__stub___connect)
+#error found stub for connect
+#endif
+
+	return connect ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:13076: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:13079: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:13082: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:13085: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_func_connect=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_connect=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:13095: result: $ac_cv_func_connect" >&5
+echo "${ECHO_T}$ac_cv_func_connect" >&6
+
+    if test $ac_cv_func_connect = no; then
+      echo "$as_me:13099: checking for connect in -lsocket" >&5
+echo $ECHO_N "checking for connect in -lsocket... $ECHO_C" >&6
+if test "${ac_cv_lib_socket_connect+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsocket $X_EXTRA_LIBS $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 13107 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char connect ();
+int
+main (void)
+{
+connect ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:13126: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:13129: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:13132: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:13135: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_socket_connect=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_socket_connect=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:13146: result: $ac_cv_lib_socket_connect" >&5
+echo "${ECHO_T}$ac_cv_lib_socket_connect" >&6
+if test "$ac_cv_lib_socket_connect" = yes; then
+  X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS"
+fi
+
+    fi
+
+    # Guillermo Gomez says -lposix is necessary on A/UX.
+    echo "$as_me:13155: checking for remove" >&5
+echo $ECHO_N "checking for remove... $ECHO_C" >&6
+if test "${ac_cv_func_remove+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 13161 "configure"
+#include "confdefs.h"
+#define remove autoconf_temporary
+#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
+#undef remove
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char remove (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_remove) || defined (__stub___remove)
+#error found stub for remove
+#endif
+
+	return remove ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:13192: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:13195: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:13198: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:13201: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_func_remove=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_remove=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:13211: result: $ac_cv_func_remove" >&5
+echo "${ECHO_T}$ac_cv_func_remove" >&6
+
+    if test $ac_cv_func_remove = no; then
+      echo "$as_me:13215: checking for remove in -lposix" >&5
+echo $ECHO_N "checking for remove in -lposix... $ECHO_C" >&6
+if test "${ac_cv_lib_posix_remove+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lposix  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 13223 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char remove ();
+int
+main (void)
+{
+remove ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:13242: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:13245: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:13248: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:13251: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_posix_remove=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_posix_remove=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:13262: result: $ac_cv_lib_posix_remove" >&5
+echo "${ECHO_T}$ac_cv_lib_posix_remove" >&6
+if test "$ac_cv_lib_posix_remove" = yes; then
+  X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix"
+fi
+
+    fi
+
+    # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay.
+    echo "$as_me:13271: checking for shmat" >&5
+echo $ECHO_N "checking for shmat... $ECHO_C" >&6
+if test "${ac_cv_func_shmat+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 13277 "configure"
+#include "confdefs.h"
+#define shmat autoconf_temporary
+#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
+#undef shmat
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char shmat (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_shmat) || defined (__stub___shmat)
+#error found stub for shmat
+#endif
+
+	return shmat ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:13308: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:13311: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:13314: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:13317: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_func_shmat=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_shmat=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:13327: result: $ac_cv_func_shmat" >&5
+echo "${ECHO_T}$ac_cv_func_shmat" >&6
+
+    if test $ac_cv_func_shmat = no; then
+      echo "$as_me:13331: checking for shmat in -lipc" >&5
+echo $ECHO_N "checking for shmat in -lipc... $ECHO_C" >&6
+if test "${ac_cv_lib_ipc_shmat+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lipc  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 13339 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char shmat ();
+int
+main (void)
+{
+shmat ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:13358: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:13361: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:13364: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:13367: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_ipc_shmat=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_ipc_shmat=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:13378: result: $ac_cv_lib_ipc_shmat" >&5
+echo "${ECHO_T}$ac_cv_lib_ipc_shmat" >&6
+if test "$ac_cv_lib_ipc_shmat" = yes; then
+  X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc"
+fi
+
+    fi
+  fi
+
+  # Check for libraries that X11R6 Xt/Xaw programs need.
+  ac_save_LDFLAGS=$LDFLAGS
+  test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries"
+  # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to
+  # check for ICE first), but we must link in the order -lSM -lICE or
+  # we get undefined symbols.  So assume we have SM if we have ICE.
+  # These have to be linked with before -lX11, unlike the other
+  # libraries we check for below, so use a different variable.
+  # John Interrante, Karl Berry
+  echo "$as_me:13396: checking for IceConnectionNumber in -lICE" >&5
+echo $ECHO_N "checking for IceConnectionNumber in -lICE... $ECHO_C" >&6
+if test "${ac_cv_lib_ICE_IceConnectionNumber+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lICE $X_EXTRA_LIBS $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 13404 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char IceConnectionNumber ();
+int
+main (void)
+{
+IceConnectionNumber ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:13423: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:13426: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:13429: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:13432: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_ICE_IceConnectionNumber=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_ICE_IceConnectionNumber=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:13443: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5
+echo "${ECHO_T}$ac_cv_lib_ICE_IceConnectionNumber" >&6
+if test "$ac_cv_lib_ICE_IceConnectionNumber" = yes; then
+  X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE"
+fi
+
+  LDFLAGS=$ac_save_LDFLAGS
+
+fi
+
+cf_x_athena=${cf_x_athena:-Xaw}
+
+echo "$as_me:13455: checking if you want to link with Xaw 3d library" >&5
+echo $ECHO_N "checking if you want to link with Xaw 3d library... $ECHO_C" >&6
+withval=
+
+# Check whether --with-Xaw3d or --without-Xaw3d was given.
+if test "${with_Xaw3d+set}" = set; then
+  withval="$with_Xaw3d"
+
+fi;
+if test "$withval" = yes ; then
+	cf_x_athena=Xaw3d
+	echo "$as_me:13466: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+	echo "$as_me:13469: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+echo "$as_me:13473: checking if you want to link with Xaw 3d xft library" >&5
+echo $ECHO_N "checking if you want to link with Xaw 3d xft library... $ECHO_C" >&6
+withval=
+
+# Check whether --with-Xaw3dxft or --without-Xaw3dxft was given.
+if test "${with_Xaw3dxft+set}" = set; then
+  withval="$with_Xaw3dxft"
+
+fi;
+if test "$withval" = yes ; then
+	cf_x_athena=Xaw3dxft
+	echo "$as_me:13484: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+	echo "$as_me:13487: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+echo "$as_me:13491: checking if you want to link with neXT Athena library" >&5
+echo $ECHO_N "checking if you want to link with neXT Athena library... $ECHO_C" >&6
+withval=
+
+# Check whether --with-neXtaw or --without-neXtaw was given.
+if test "${with_neXtaw+set}" = set; then
+  withval="$with_neXtaw"
+
+fi;
+if test "$withval" = yes ; then
+	cf_x_athena=neXtaw
+	echo "$as_me:13502: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+	echo "$as_me:13505: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+echo "$as_me:13509: checking if you want to link with Athena-Plus library" >&5
+echo $ECHO_N "checking if you want to link with Athena-Plus library... $ECHO_C" >&6
+withval=
+
+# Check whether --with-XawPlus or --without-XawPlus was given.
+if test "${with_XawPlus+set}" = set; then
+  withval="$with_XawPlus"
+
+fi;
+if test "$withval" = yes ; then
+	cf_x_athena=XawPlus
+	echo "$as_me:13520: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+	echo "$as_me:13523: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+cf_x_athena_lib=""
+
+if test "$PKG_CONFIG" != none ; then
+	cf_athena_list=
+	test "$cf_x_athena" = Xaw && cf_athena_list="xaw8 xaw7 xaw6"
+	for cf_athena_pkg in \
+		$cf_athena_list \
+		${cf_x_athena} \
+		${cf_x_athena}-devel \
+		lib${cf_x_athena} \
+		lib${cf_x_athena}-devel
+	do
+
+if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists "$cf_athena_pkg"; then
+	test -n "$verbose" && echo "	found package $cf_athena_pkg" 1>&6
+
+echo "${as_me:-configure}:13543: testing found package $cf_athena_pkg ..." 1>&5
+
+	cf_pkgconfig_incs="`$PKG_CONFIG --cflags "$cf_athena_pkg" 2>/dev/null`"
+	cf_pkgconfig_libs="`$PKG_CONFIG --libs   "$cf_athena_pkg" 2>/dev/null`"
+	test -n "$verbose" && echo "	package $cf_athena_pkg CFLAGS: $cf_pkgconfig_incs" 1>&6
+
+echo "${as_me:-configure}:13549: testing package $cf_athena_pkg CFLAGS: $cf_pkgconfig_incs ..." 1>&5
+
+	test -n "$verbose" && echo "	package $cf_athena_pkg LIBS: $cf_pkgconfig_libs" 1>&6
+
+echo "${as_me:-configure}:13553: testing package $cf_athena_pkg LIBS: $cf_pkgconfig_libs ..." 1>&5
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_pkgconfig_incs
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+			cf_x_athena_lib="$cf_pkgconfig_libs"
+
+cf_x_athena_LIBS=`echo "HAVE_LIB_$cf_x_athena" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+			cat >>confdefs.h <<EOF
+#define $cf_x_athena_LIBS 1
+EOF
+
+	for cf_trim_lib in Xmu Xt X11
+	do
+		case "$LIBS" in
+		(*-l$cf_trim_lib\ *-l$cf_trim_lib*)
+			LIBS=`echo "$LIBS " | sed -e 's/  / /g' -e 's%-l'"$cf_trim_lib"' %%' -e 's/ $//'`
+			test -n "$verbose" && echo "	..trimmed $LIBS" 1>&6
+
+echo "${as_me:-configure}:13684: testing ..trimmed $LIBS ..." 1>&5
+
+			;;
+		esac
+	done
+
+echo "$as_me:13690: checking for usable $cf_x_athena/Xmu package" >&5
+echo $ECHO_N "checking for usable $cf_x_athena/Xmu package... $ECHO_C" >&6
+if test "${cf_cv_xaw_compat+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 13697 "configure"
+#include "confdefs.h"
+
+#include <X11/Xmu/CharSet.h>
+
+int
+main (void)
+{
+
+int check = XmuCompareISOLatin1("big", "small");
+(void)check;
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:13714: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:13717: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:13720: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:13723: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_xaw_compat=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_xaw_compat=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:13733: result: $cf_cv_xaw_compat" >&5
+echo "${ECHO_T}$cf_cv_xaw_compat" >&6
+
+			if test "$cf_cv_xaw_compat" = no
+			then
+				# workaround for broken ".pc" files...
+				case "$cf_x_athena_lib" in
+				(*-lXmu*)
+					;;
+				(*)
+					test -n "$verbose" && echo "	work around broken package" 1>&6
+
+echo "${as_me:-configure}:13745: testing work around broken package ..." 1>&5
+
+					cf_save_xmu="$LIBS"
+					cf_first_lib=`echo "$cf_save_xmu" | sed -e 's/^  *//' -e 's/ .*//'`
+
+if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists "xmu"; then
+	test -n "$verbose" && echo "	found package xmu" 1>&6
+
+echo "${as_me:-configure}:13753: testing found package xmu ..." 1>&5
+
+	cf_pkgconfig_incs="`$PKG_CONFIG --cflags "xmu" 2>/dev/null`"
+	cf_pkgconfig_libs="`$PKG_CONFIG --libs   "xmu" 2>/dev/null`"
+	test -n "$verbose" && echo "	package xmu CFLAGS: $cf_pkgconfig_incs" 1>&6
+
+echo "${as_me:-configure}:13759: testing package xmu CFLAGS: $cf_pkgconfig_incs ..." 1>&5
+
+	test -n "$verbose" && echo "	package xmu LIBS: $cf_pkgconfig_libs" 1>&6
+
+echo "${as_me:-configure}:13763: testing package xmu LIBS: $cf_pkgconfig_libs ..." 1>&5
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_pkgconfig_incs
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+							LIBS="$cf_save_xmu"
+
+test -n "$verbose" && echo "	...before $LIBS" 1>&6
+
+echo "${as_me:-configure}:13883: testing ...before $LIBS ..." 1>&5
+
+LIBS=`echo "$LIBS" | sed -e "s/[ 	][ 	]*/ /g" -e "s%$cf_first_lib %$cf_first_lib $cf_pkgconfig_libs %" -e 's%  % %g'`
+test -n "$verbose" && echo "	...after  $LIBS" 1>&6
+
+echo "${as_me:-configure}:13888: testing ...after  $LIBS ..." 1>&5
+
+else
+	cf_pkgconfig_incs=
+	cf_pkgconfig_libs=
+
+test -n "$verbose" && echo "	...before $LIBS" 1>&6
+
+echo "${as_me:-configure}:13896: testing ...before $LIBS ..." 1>&5
+
+LIBS=`echo "$LIBS" | sed -e "s/[ 	][ 	]*/ /g" -e "s%$cf_first_lib %$cf_first_lib -lXmu %" -e 's%  % %g'`
+test -n "$verbose" && echo "	...after  $LIBS" 1>&6
+
+echo "${as_me:-configure}:13901: testing ...after  $LIBS ..." 1>&5
+
+fi
+
+	for cf_trim_lib in Xmu Xt X11
+	do
+		case "$LIBS" in
+		(*-l$cf_trim_lib\ *-l$cf_trim_lib*)
+			LIBS=`echo "$LIBS " | sed -e 's/  / /g' -e 's%-l'"$cf_trim_lib"' %%' -e 's/ $//'`
+			test -n "$verbose" && echo "	..trimmed $LIBS" 1>&6
+
+echo "${as_me:-configure}:13912: testing ..trimmed $LIBS ..." 1>&5
+
+			;;
+		esac
+	done
+
+					;;
+				esac
+			fi
+
+			break
+else
+	cf_pkgconfig_incs=
+	cf_pkgconfig_libs=
+	:
+fi
+
+	done
+fi
+
+if test -z "$cf_x_athena_lib" ; then
+
+if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists "Xext"; then
+	test -n "$verbose" && echo "	found package Xext" 1>&6
+
+echo "${as_me:-configure}:13937: testing found package Xext ..." 1>&5
+
+	cf_pkgconfig_incs="`$PKG_CONFIG --cflags "Xext" 2>/dev/null`"
+	cf_pkgconfig_libs="`$PKG_CONFIG --libs   "Xext" 2>/dev/null`"
+	test -n "$verbose" && echo "	package Xext CFLAGS: $cf_pkgconfig_incs" 1>&6
+
+echo "${as_me:-configure}:13943: testing package Xext CFLAGS: $cf_pkgconfig_incs ..." 1>&5
+
+	test -n "$verbose" && echo "	package Xext LIBS: $cf_pkgconfig_libs" 1>&6
+
+echo "${as_me:-configure}:13947: testing package Xext LIBS: $cf_pkgconfig_libs ..." 1>&5
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_pkgconfig_incs
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+	:
+else
+	cf_pkgconfig_incs=
+	cf_pkgconfig_libs=
+
+	echo "$as_me:14068: checking for XextCreateExtension in -lXext" >&5
+echo $ECHO_N "checking for XextCreateExtension in -lXext... $ECHO_C" >&6
+if test "${ac_cv_lib_Xext_XextCreateExtension+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lXext  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 14076 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char XextCreateExtension ();
+int
+main (void)
+{
+XextCreateExtension ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:14095: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:14098: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:14101: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:14104: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_Xext_XextCreateExtension=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_Xext_XextCreateExtension=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:14115: result: $ac_cv_lib_Xext_XextCreateExtension" >&5
+echo "${ECHO_T}$ac_cv_lib_Xext_XextCreateExtension" >&6
+if test "$ac_cv_lib_Xext_XextCreateExtension" = yes; then
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lXext; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+fi
+
+fi
+
+# OSX is schizoid about who owns /usr/X11 (old) versus /opt/X11 (new) (and
+# in some cases has installed dummy files in the former, other cases replaced
+# it with a link to the new location).  This complicates the configure script.
+# Check for that pitfall, and recover using pkg-config
+#
+# If none of these are set, the configuration is almost certainly broken.
+if test -z "${X_CFLAGS}${X_PRE_LIBS}${X_LIBS}${X_EXTRA_LIBS}"
+then
+
+if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists "x11"; then
+	test -n "$verbose" && echo "	found package x11" 1>&6
+
+echo "${as_me:-configure}:14151: testing found package x11 ..." 1>&5
+
+	cf_pkgconfig_incs="`$PKG_CONFIG --cflags "x11" 2>/dev/null`"
+	cf_pkgconfig_libs="`$PKG_CONFIG --libs   "x11" 2>/dev/null`"
+	test -n "$verbose" && echo "	package x11 CFLAGS: $cf_pkgconfig_incs" 1>&6
+
+echo "${as_me:-configure}:14157: testing package x11 CFLAGS: $cf_pkgconfig_incs ..." 1>&5
+
+	test -n "$verbose" && echo "	package x11 LIBS: $cf_pkgconfig_libs" 1>&6
+
+echo "${as_me:-configure}:14161: testing package x11 LIBS: $cf_pkgconfig_libs ..." 1>&5
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_pkgconfig_incs
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+	:
+else
+	cf_pkgconfig_incs=
+	cf_pkgconfig_libs=
+	{ echo "$as_me:14281: WARNING: unable to find X11 library" >&5
+echo "$as_me: WARNING: unable to find X11 library" >&2;}
+fi
+
+if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists "ice"; then
+	test -n "$verbose" && echo "	found package ice" 1>&6
+
+echo "${as_me:-configure}:14288: testing found package ice ..." 1>&5
+
+	cf_pkgconfig_incs="`$PKG_CONFIG --cflags "ice" 2>/dev/null`"
+	cf_pkgconfig_libs="`$PKG_CONFIG --libs   "ice" 2>/dev/null`"
+	test -n "$verbose" && echo "	package ice CFLAGS: $cf_pkgconfig_incs" 1>&6
+
+echo "${as_me:-configure}:14294: testing package ice CFLAGS: $cf_pkgconfig_incs ..." 1>&5
+
+	test -n "$verbose" && echo "	package ice LIBS: $cf_pkgconfig_libs" 1>&6
+
+echo "${as_me:-configure}:14298: testing package ice LIBS: $cf_pkgconfig_libs ..." 1>&5
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_pkgconfig_incs
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+	:
+else
+	cf_pkgconfig_incs=
+	cf_pkgconfig_libs=
+	{ echo "$as_me:14418: WARNING: unable to find ICE library" >&5
+echo "$as_me: WARNING: unable to find ICE library" >&2;}
+fi
+
+if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists "sm"; then
+	test -n "$verbose" && echo "	found package sm" 1>&6
+
+echo "${as_me:-configure}:14425: testing found package sm ..." 1>&5
+
+	cf_pkgconfig_incs="`$PKG_CONFIG --cflags "sm" 2>/dev/null`"
+	cf_pkgconfig_libs="`$PKG_CONFIG --libs   "sm" 2>/dev/null`"
+	test -n "$verbose" && echo "	package sm CFLAGS: $cf_pkgconfig_incs" 1>&6
+
+echo "${as_me:-configure}:14431: testing package sm CFLAGS: $cf_pkgconfig_incs ..." 1>&5
+
+	test -n "$verbose" && echo "	package sm LIBS: $cf_pkgconfig_libs" 1>&6
+
+echo "${as_me:-configure}:14435: testing package sm LIBS: $cf_pkgconfig_libs ..." 1>&5
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_pkgconfig_incs
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+	:
+else
+	cf_pkgconfig_incs=
+	cf_pkgconfig_libs=
+	{ echo "$as_me:14555: WARNING: unable to find SM library" >&5
+echo "$as_me: WARNING: unable to find SM library" >&2;}
+fi
+
+if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists "xt"; then
+	test -n "$verbose" && echo "	found package xt" 1>&6
+
+echo "${as_me:-configure}:14562: testing found package xt ..." 1>&5
+
+	cf_pkgconfig_incs="`$PKG_CONFIG --cflags "xt" 2>/dev/null`"
+	cf_pkgconfig_libs="`$PKG_CONFIG --libs   "xt" 2>/dev/null`"
+	test -n "$verbose" && echo "	package xt CFLAGS: $cf_pkgconfig_incs" 1>&6
+
+echo "${as_me:-configure}:14568: testing package xt CFLAGS: $cf_pkgconfig_incs ..." 1>&5
+
+	test -n "$verbose" && echo "	package xt LIBS: $cf_pkgconfig_libs" 1>&6
+
+echo "${as_me:-configure}:14572: testing package xt LIBS: $cf_pkgconfig_libs ..." 1>&5
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_pkgconfig_incs
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+	:
+else
+	cf_pkgconfig_incs=
+	cf_pkgconfig_libs=
+	{ echo "$as_me:14692: WARNING: unable to find Xt library" >&5
+echo "$as_me: WARNING: unable to find Xt library" >&2;}
+fi
+
+else
+	LIBS="$X_PRE_LIBS $LIBS $X_EXTRA_LIBS"
+fi
+
+cf_have_X_LIBS=no
+
+if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists "xt"; then
+	test -n "$verbose" && echo "	found package xt" 1>&6
+
+echo "${as_me:-configure}:14705: testing found package xt ..." 1>&5
+
+	cf_pkgconfig_incs="`$PKG_CONFIG --cflags "xt" 2>/dev/null`"
+	cf_pkgconfig_libs="`$PKG_CONFIG --libs   "xt" 2>/dev/null`"
+	test -n "$verbose" && echo "	package xt CFLAGS: $cf_pkgconfig_incs" 1>&6
+
+echo "${as_me:-configure}:14711: testing package xt CFLAGS: $cf_pkgconfig_incs ..." 1>&5
+
+	test -n "$verbose" && echo "	package xt LIBS: $cf_pkgconfig_libs" 1>&6
+
+echo "${as_me:-configure}:14715: testing package xt LIBS: $cf_pkgconfig_libs ..." 1>&5
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_pkgconfig_incs
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+	case "x$LIBS" in
+	(*-lX11*)
+		;;
+	(*)
+# we have an "xt" package, but it may omit Xt's dependency on X11
+echo "$as_me:14836: checking for usable X dependency" >&5
+echo $ECHO_N "checking for usable X dependency... $ECHO_C" >&6
+if test "${cf_cv_xt_x11_compat+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 14843 "configure"
+#include "confdefs.h"
+
+#include <X11/Xlib.h>
+
+int
+main (void)
+{
+
+	int rc1 = XDrawLine((Display*) 0, (Drawable) 0, (GC) 0, 0, 0, 0, 0);
+	int rc2 = XClearWindow((Display*) 0, (Window) 0);
+	int rc3 = XMoveWindow((Display*) 0, (Window) 0, 0, 0);
+	int rc4 = XMoveResizeWindow((Display*)0, (Window)0, 0, 0, 0, 0);
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:14862: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:14865: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:14868: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:14871: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_xt_x11_compat=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_xt_x11_compat=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:14881: result: $cf_cv_xt_x11_compat" >&5
+echo "${ECHO_T}$cf_cv_xt_x11_compat" >&6
+		if test "$cf_cv_xt_x11_compat" = no
+		then
+			test -n "$verbose" && echo "	work around broken X11 dependency" 1>&6
+
+echo "${as_me:-configure}:14887: testing work around broken X11 dependency ..." 1>&5
+
+			# 2010/11/19 - good enough until a working Xt on Xcb is delivered.
+
+if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists "x11"; then
+	test -n "$verbose" && echo "	found package x11" 1>&6
+
+echo "${as_me:-configure}:14894: testing found package x11 ..." 1>&5
+
+	cf_pkgconfig_incs="`$PKG_CONFIG --cflags "x11" 2>/dev/null`"
+	cf_pkgconfig_libs="`$PKG_CONFIG --libs   "x11" 2>/dev/null`"
+	test -n "$verbose" && echo "	package x11 CFLAGS: $cf_pkgconfig_incs" 1>&6
+
+echo "${as_me:-configure}:14900: testing package x11 CFLAGS: $cf_pkgconfig_incs ..." 1>&5
+
+	test -n "$verbose" && echo "	package x11 LIBS: $cf_pkgconfig_libs" 1>&6
+
+echo "${as_me:-configure}:14904: testing package x11 LIBS: $cf_pkgconfig_libs ..." 1>&5
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_pkgconfig_incs
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+	:
+else
+	cf_pkgconfig_incs=
+	cf_pkgconfig_libs=
+
+test -n "$verbose" && echo "	...before $LIBS" 1>&6
+
+echo "${as_me:-configure}:15027: testing ...before $LIBS ..." 1>&5
+
+LIBS=`echo "$LIBS" | sed -e "s/[ 	][ 	]*/ /g" -e "s%-lXt %-lXt -lX11 %" -e 's%  % %g'`
+test -n "$verbose" && echo "	...after  $LIBS" 1>&6
+
+echo "${as_me:-configure}:15032: testing ...after  $LIBS ..." 1>&5
+
+fi
+
+		fi
+		;;
+	esac
+
+echo "$as_me:15040: checking for usable X Toolkit package" >&5
+echo $ECHO_N "checking for usable X Toolkit package... $ECHO_C" >&6
+if test "${cf_cv_xt_ice_compat+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 15047 "configure"
+#include "confdefs.h"
+
+#include <X11/Shell.h>
+
+int
+main (void)
+{
+int num = IceConnectionNumber(0); (void) num
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:15062: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:15065: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:15068: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:15071: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_xt_ice_compat=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_xt_ice_compat=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:15081: result: $cf_cv_xt_ice_compat" >&5
+echo "${ECHO_T}$cf_cv_xt_ice_compat" >&6
+
+	if test "$cf_cv_xt_ice_compat" = no
+	then
+		# workaround for broken ".pc" files used for X Toolkit.
+		case "x$X_PRE_LIBS" in
+		(*-lICE*)
+			case "x$LIBS" in
+			(*-lICE*)
+				;;
+			(*)
+				test -n "$verbose" && echo "	work around broken ICE dependency" 1>&6
+
+echo "${as_me:-configure}:15095: testing work around broken ICE dependency ..." 1>&5
+
+if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists "ice"; then
+	test -n "$verbose" && echo "	found package ice" 1>&6
+
+echo "${as_me:-configure}:15100: testing found package ice ..." 1>&5
+
+	cf_pkgconfig_incs="`$PKG_CONFIG --cflags "ice" 2>/dev/null`"
+	cf_pkgconfig_libs="`$PKG_CONFIG --libs   "ice" 2>/dev/null`"
+	test -n "$verbose" && echo "	package ice CFLAGS: $cf_pkgconfig_incs" 1>&6
+
+echo "${as_me:-configure}:15106: testing package ice CFLAGS: $cf_pkgconfig_incs ..." 1>&5
+
+	test -n "$verbose" && echo "	package ice LIBS: $cf_pkgconfig_libs" 1>&6
+
+echo "${as_me:-configure}:15110: testing package ice LIBS: $cf_pkgconfig_libs ..." 1>&5
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_pkgconfig_incs
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists "sm"; then
+	test -n "$verbose" && echo "	found package sm" 1>&6
+
+echo "${as_me:-configure}:15229: testing found package sm ..." 1>&5
+
+	cf_pkgconfig_incs="`$PKG_CONFIG --cflags "sm" 2>/dev/null`"
+	cf_pkgconfig_libs="`$PKG_CONFIG --libs   "sm" 2>/dev/null`"
+	test -n "$verbose" && echo "	package sm CFLAGS: $cf_pkgconfig_incs" 1>&6
+
+echo "${as_me:-configure}:15235: testing package sm CFLAGS: $cf_pkgconfig_incs ..." 1>&5
+
+	test -n "$verbose" && echo "	package sm LIBS: $cf_pkgconfig_libs" 1>&6
+
+echo "${as_me:-configure}:15239: testing package sm LIBS: $cf_pkgconfig_libs ..." 1>&5
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_pkgconfig_incs
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+	:
+else
+	cf_pkgconfig_incs=
+	cf_pkgconfig_libs=
+	:
+fi
+
+else
+	cf_pkgconfig_incs=
+	cf_pkgconfig_libs=
+
+test -n "$verbose" && echo "	...before $LIBS" 1>&6
+
+echo "${as_me:-configure}:15368: testing ...before $LIBS ..." 1>&5
+
+LIBS=`echo "$LIBS" | sed -e "s/[ 	][ 	]*/ /g" -e "s%-lXt %-lXt $X_PRE_LIBS %" -e 's%  % %g'`
+test -n "$verbose" && echo "	...after  $LIBS" 1>&6
+
+echo "${as_me:-configure}:15373: testing ...after  $LIBS ..." 1>&5
+
+fi
+
+				;;
+			esac
+			;;
+		esac
+	fi
+
+	cf_have_X_LIBS=yes
+
+else
+	cf_pkgconfig_incs=
+	cf_pkgconfig_libs=
+
+	LDFLAGS="$X_LIBS $LDFLAGS"
+
+test -n "$verbose" && echo "	checking additions to CFLAGS" 1>&6
+
+echo "${as_me:-configure}:15393: testing checking additions to CFLAGS ..." 1>&5
+
+cf_check_cflags="$CFLAGS"
+cf_check_cppflags="$CPPFLAGS"
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $X_CFLAGS
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+	test -n "$verbose" && echo "	add to \$CFLAGS $cf_new_cflags" 1>&6
+
+echo "${as_me:-configure}:15478: testing add to \$CFLAGS $cf_new_cflags ..." 1>&5
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+	test -n "$verbose" && echo "	add to \$CPPFLAGS $cf_new_cppflags" 1>&6
+
+echo "${as_me:-configure}:15488: testing add to \$CPPFLAGS $cf_new_cppflags ..." 1>&5
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+	test -n "$verbose" && echo "	add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags" 1>&6
+
+echo "${as_me:-configure}:15498: testing add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags ..." 1>&5
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+if test "x$cf_check_cflags" != "x$CFLAGS" ; then
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 15507 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello world");
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:15519: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:15522: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:15525: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:15528: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+test -n "$verbose" && echo "	test-compile failed.  Undoing change to \$CFLAGS" 1>&6
+
+echo "${as_me:-configure}:15536: testing test-compile failed.  Undoing change to \$CFLAGS ..." 1>&5
+
+	 if test "x$cf_check_cppflags" != "x$CPPFLAGS" ; then
+		 test -n "$verbose" && echo "	but keeping change to \$CPPFLAGS" 1>&6
+
+echo "${as_me:-configure}:15541: testing but keeping change to \$CPPFLAGS ..." 1>&5
+
+	 fi
+	 CFLAGS="$cf_check_cflags"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+
+	echo "$as_me:15549: checking for XOpenDisplay" >&5
+echo $ECHO_N "checking for XOpenDisplay... $ECHO_C" >&6
+if test "${ac_cv_func_XOpenDisplay+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 15555 "configure"
+#include "confdefs.h"
+#define XOpenDisplay autoconf_temporary
+#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
+#undef XOpenDisplay
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char XOpenDisplay (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_XOpenDisplay) || defined (__stub___XOpenDisplay)
+#error found stub for XOpenDisplay
+#endif
+
+	return XOpenDisplay ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:15586: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:15589: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:15592: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:15595: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_func_XOpenDisplay=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_XOpenDisplay=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:15605: result: $ac_cv_func_XOpenDisplay" >&5
+echo "${ECHO_T}$ac_cv_func_XOpenDisplay" >&6
+if test "$ac_cv_func_XOpenDisplay" = yes; then
+  :
+else
+
+	echo "$as_me:15611: checking for XOpenDisplay in -lX11" >&5
+echo $ECHO_N "checking for XOpenDisplay in -lX11... $ECHO_C" >&6
+if test "${ac_cv_lib_X11_XOpenDisplay+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lX11  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 15619 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char XOpenDisplay ();
+int
+main (void)
+{
+XOpenDisplay ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:15638: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:15641: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:15644: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:15647: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_X11_XOpenDisplay=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_X11_XOpenDisplay=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:15658: result: $ac_cv_lib_X11_XOpenDisplay" >&5
+echo "${ECHO_T}$ac_cv_lib_X11_XOpenDisplay" >&6
+if test "$ac_cv_lib_X11_XOpenDisplay" = yes; then
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lX11; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+fi
+
+fi
+
+	echo "$as_me:15682: checking for XtAppInitialize" >&5
+echo $ECHO_N "checking for XtAppInitialize... $ECHO_C" >&6
+if test "${ac_cv_func_XtAppInitialize+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 15688 "configure"
+#include "confdefs.h"
+#define XtAppInitialize autoconf_temporary
+#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
+#undef XtAppInitialize
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char XtAppInitialize (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_XtAppInitialize) || defined (__stub___XtAppInitialize)
+#error found stub for XtAppInitialize
+#endif
+
+	return XtAppInitialize ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:15719: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:15722: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:15725: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:15728: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_func_XtAppInitialize=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_XtAppInitialize=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:15738: result: $ac_cv_func_XtAppInitialize" >&5
+echo "${ECHO_T}$ac_cv_func_XtAppInitialize" >&6
+if test "$ac_cv_func_XtAppInitialize" = yes; then
+  :
+else
+
+	echo "$as_me:15744: checking for XtAppInitialize in -lXt" >&5
+echo $ECHO_N "checking for XtAppInitialize in -lXt... $ECHO_C" >&6
+if test "${ac_cv_lib_Xt_XtAppInitialize+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lXt  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 15752 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char XtAppInitialize ();
+int
+main (void)
+{
+XtAppInitialize ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:15771: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:15774: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:15777: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:15780: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_Xt_XtAppInitialize=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_Xt_XtAppInitialize=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:15791: result: $ac_cv_lib_Xt_XtAppInitialize" >&5
+echo "${ECHO_T}$ac_cv_lib_Xt_XtAppInitialize" >&6
+if test "$ac_cv_lib_Xt_XtAppInitialize" = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_LIBXT 1
+EOF
+
+		 cf_have_X_LIBS=Xt
+		 LIBS="-lXt $LIBS"
+fi
+
+fi
+
+fi
+
+if test "$cf_have_X_LIBS" = no ; then
+	{ echo "$as_me:15808: WARNING: Unable to successfully link X Toolkit library (-lXt) with
+test program.  You will have to check and add the proper libraries by hand
+to makefile." >&5
+echo "$as_me: WARNING: Unable to successfully link X Toolkit library (-lXt) with
+test program.  You will have to check and add the proper libraries by hand
+to makefile." >&2;}
+fi
+
+cf_x_athena_root=$cf_x_athena
+cf_x_athena_inc=""
+
+for cf_path in default \
+	/usr/contrib/X11R6 \
+	/usr/contrib/X11R5 \
+	/usr/lib/X11R5 \
+	/usr/local
+do
+	if test -z "$cf_x_athena_inc" ; then
+
+cf_save_LIBS_CF_X_ATHENA_CPPFLAGS="$LIBS"
+cf_save_CFLAGS_CF_X_ATHENA_CPPFLAGS="$CFLAGS"
+cf_save_CPPFLAGS_CF_X_ATHENA_CPPFLAGS="$CPPFLAGS"
+LIBS="$LIBS ${X_PRE_LIBS} ${X_LIBS} ${X_EXTRA_LIBS}"
+for cf_X_CFLAGS in $X_CFLAGS
+do
+	case "x$cf_X_CFLAGS" in
+	x-[IUD]*)
+		CPPFLAGS="$CPPFLAGS $cf_X_CFLAGS"
+		;;
+	*)
+		CFLAGS="$CFLAGS $cf_X_CFLAGS"
+		;;
+	esac
+done
+
+		cf_test=X11/$cf_x_athena_root/SimpleMenu.h
+		if test "$cf_path" != default ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-I$cf_path/include"
+
+			echo "$as_me:15849: checking for $cf_test in $cf_path" >&5
+echo $ECHO_N "checking for $cf_test in $cf_path... $ECHO_C" >&6
+		else
+			echo "$as_me:15852: checking for $cf_test" >&5
+echo $ECHO_N "checking for $cf_test... $ECHO_C" >&6
+		fi
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 15856 "configure"
+#include "confdefs.h"
+
+#include <X11/Intrinsic.h>
+#include <$cf_test>
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:15870: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:15873: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:15876: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:15879: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_result=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_result=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+		echo "$as_me:15888: result: $cf_result" >&5
+echo "${ECHO_T}$cf_result" >&6
+
+LIBS="$cf_save_LIBS_CF_X_ATHENA_CPPFLAGS"
+CFLAGS="$cf_save_CFLAGS_CF_X_ATHENA_CPPFLAGS"
+CPPFLAGS="$cf_save_CPPFLAGS_CF_X_ATHENA_CPPFLAGS"
+
+		if test "$cf_result" = yes ; then
+			test "$cf_path"  = default && cf_x_athena_inc=default
+			test "$cf_path" != default && cf_x_athena_inc="$cf_path/include"
+			break
+		fi
+	fi
+done
+
+if test -z "$cf_x_athena_inc" ; then
+	{ echo "$as_me:15904: WARNING: Unable to find Athena header files" >&5
+echo "$as_me: WARNING: Unable to find Athena header files" >&2;}
+elif test "$cf_x_athena_inc" != default ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-I$cf_x_athena_inc"
+
+fi
+
+cf_x_athena_root=$cf_x_athena
+cf_x_athena_lib=""
+
+for cf_path in default \
+	/usr/contrib/X11R6 \
+	/usr/contrib/X11R5 \
+	/usr/lib/X11R5 \
+	/usr/local
+do
+	for cf_lib in \
+		${cf_x_athena_root} \
+		${cf_x_athena_root}7 \
+		${cf_x_athena_root}6
+	do
+	for cf_libs in \
+		"-l$cf_lib -lXmu" \
+		"-l$cf_lib -lXpm -lXmu" \
+		"-l${cf_lib}_s -lXmu_s"
+	do
+		test -n "$cf_x_athena_lib" && break
+
+cf_save_LIBS_CF_X_ATHENA_LIBS="$LIBS"
+cf_save_CFLAGS_CF_X_ATHENA_LIBS="$CFLAGS"
+cf_save_CPPFLAGS_CF_X_ATHENA_LIBS="$CPPFLAGS"
+LIBS="$LIBS ${X_PRE_LIBS} ${X_LIBS} ${X_EXTRA_LIBS}"
+for cf_X_CFLAGS in $X_CFLAGS
+do
+	case "x$cf_X_CFLAGS" in
+	x-[IUD]*)
+		CPPFLAGS="$CPPFLAGS $cf_X_CFLAGS"
+		;;
+	*)
+		CFLAGS="$CFLAGS $cf_X_CFLAGS"
+		;;
+	esac
+done
+
+		cf_test=XawSimpleMenuAddGlobalActions
+		test "$cf_path" != default && cf_libs="-L$cf_path/lib $cf_libs"
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+		echo "$as_me:15969: checking for $cf_test in $cf_libs" >&5
+echo $ECHO_N "checking for $cf_test in $cf_libs... $ECHO_C" >&6
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 15972 "configure"
+#include "confdefs.h"
+
+#include <X11/Intrinsic.h>
+#include <X11/$cf_x_athena_root/SimpleMenu.h>
+
+int
+main (void)
+{
+
+$cf_test((XtAppContext) 0)
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:15988: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:15991: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:15994: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:15997: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_result=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_result=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+		echo "$as_me:16006: result: $cf_result" >&5
+echo "${ECHO_T}$cf_result" >&6
+
+LIBS="$cf_save_LIBS_CF_X_ATHENA_LIBS"
+CFLAGS="$cf_save_CFLAGS_CF_X_ATHENA_LIBS"
+CPPFLAGS="$cf_save_CPPFLAGS_CF_X_ATHENA_LIBS"
+
+		if test "$cf_result" = yes ; then
+			cf_x_athena_lib="$cf_libs"
+			break
+		fi
+	done # cf_libs
+		test -n "$cf_x_athena_lib" && break
+	done # cf_lib
+done
+
+if test -z "$cf_x_athena_lib" ; then
+	{ { echo "$as_me:16023: error: Unable to successfully link Athena library (-l$cf_x_athena_root) with test program" >&5
+echo "$as_me: error: Unable to successfully link Athena library (-l$cf_x_athena_root) with test program" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in $cf_x_athena_lib; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+cf_x_athena_LIBS=`echo "HAVE_LIB_$cf_x_athena" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+cat >>confdefs.h <<EOF
+#define $cf_x_athena_LIBS 1
+EOF
+
+fi
+
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in xcurses-config
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:16057: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_XCURSES_CONFIG+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$XCURSES_CONFIG"; then
+  ac_cv_prog_XCURSES_CONFIG="$XCURSES_CONFIG" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_XCURSES_CONFIG="$ac_tool_prefix$ac_prog"
+echo "$as_me:16072: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+XCURSES_CONFIG=$ac_cv_prog_XCURSES_CONFIG
+if test -n "$XCURSES_CONFIG"; then
+  echo "$as_me:16080: result: $XCURSES_CONFIG" >&5
+echo "${ECHO_T}$XCURSES_CONFIG" >&6
+else
+  echo "$as_me:16083: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    test -n "$XCURSES_CONFIG" && break
+  done
+fi
+if test -z "$XCURSES_CONFIG"; then
+  ac_ct_XCURSES_CONFIG=$XCURSES_CONFIG
+  for ac_prog in xcurses-config
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:16096: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_XCURSES_CONFIG+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_XCURSES_CONFIG"; then
+  ac_cv_prog_ac_ct_XCURSES_CONFIG="$ac_ct_XCURSES_CONFIG" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ac_ct_XCURSES_CONFIG="$ac_prog"
+echo "$as_me:16111: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+ac_ct_XCURSES_CONFIG=$ac_cv_prog_ac_ct_XCURSES_CONFIG
+if test -n "$ac_ct_XCURSES_CONFIG"; then
+  echo "$as_me:16119: result: $ac_ct_XCURSES_CONFIG" >&5
+echo "${ECHO_T}$ac_ct_XCURSES_CONFIG" >&6
+else
+  echo "$as_me:16122: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$ac_ct_XCURSES_CONFIG" && break
+done
+test -n "$ac_ct_XCURSES_CONFIG" || ac_ct_XCURSES_CONFIG="none"
+
+  XCURSES_CONFIG=$ac_ct_XCURSES_CONFIG
+fi
+
+if test "$XCURSES_CONFIG" != none ; then
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in `$XCURSES_CONFIG --cflags`
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in `$XCURSES_CONFIG --libs`; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+cf_cv_lib_XCurses=yes
+
+else
+
+LDFLAGS="$LDFLAGS $X_LIBS"
+
+test -n "$verbose" && echo "	checking additions to CFLAGS" 1>&6
+
+echo "${as_me:-configure}:16257: testing checking additions to CFLAGS ..." 1>&5
+
+cf_check_cflags="$CFLAGS"
+cf_check_cppflags="$CPPFLAGS"
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $X_CFLAGS
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+	test -n "$verbose" && echo "	add to \$CFLAGS $cf_new_cflags" 1>&6
+
+echo "${as_me:-configure}:16342: testing add to \$CFLAGS $cf_new_cflags ..." 1>&5
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+	test -n "$verbose" && echo "	add to \$CPPFLAGS $cf_new_cppflags" 1>&6
+
+echo "${as_me:-configure}:16352: testing add to \$CPPFLAGS $cf_new_cppflags ..." 1>&5
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+	test -n "$verbose" && echo "	add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags" 1>&6
+
+echo "${as_me:-configure}:16362: testing add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags ..." 1>&5
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+if test "x$cf_check_cflags" != "x$CFLAGS" ; then
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 16371 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello world");
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:16383: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:16386: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:16389: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:16392: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+test -n "$verbose" && echo "	test-compile failed.  Undoing change to \$CFLAGS" 1>&6
+
+echo "${as_me:-configure}:16400: testing test-compile failed.  Undoing change to \$CFLAGS ..." 1>&5
+
+	 if test "x$cf_check_cppflags" != "x$CPPFLAGS" ; then
+		 test -n "$verbose" && echo "	but keeping change to \$CPPFLAGS" 1>&6
+
+echo "${as_me:-configure}:16405: testing but keeping change to \$CPPFLAGS ..." 1>&5
+
+	 fi
+	 CFLAGS="$cf_check_cflags"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+
+echo "$as_me:16413: checking for XOpenDisplay in -lX11" >&5
+echo $ECHO_N "checking for XOpenDisplay in -lX11... $ECHO_C" >&6
+if test "${ac_cv_lib_X11_XOpenDisplay+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lX11 $X_PRE_LIBS $LIBS $X_EXTRA_LIBS $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 16421 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char XOpenDisplay ();
+int
+main (void)
+{
+XOpenDisplay ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:16440: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:16443: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:16446: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:16449: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_X11_XOpenDisplay=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_X11_XOpenDisplay=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:16460: result: $ac_cv_lib_X11_XOpenDisplay" >&5
+echo "${ECHO_T}$ac_cv_lib_X11_XOpenDisplay" >&6
+if test "$ac_cv_lib_X11_XOpenDisplay" = yes; then
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lX11; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+fi
+
+echo "$as_me:16482: checking for XCurses library" >&5
+echo $ECHO_N "checking for XCurses library... $ECHO_C" >&6
+if test "${cf_cv_lib_XCurses+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lXCurses; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 16505 "configure"
+#include "confdefs.h"
+
+#include <xcurses.h>
+char *XCursesProgramName = "test";
+
+int
+main (void)
+{
+XCursesExit();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:16520: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:16523: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:16526: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:16529: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_lib_XCurses=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_lib_XCurses=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:16540: result: $cf_cv_lib_XCurses" >&5
+echo "${ECHO_T}$cf_cv_lib_XCurses" >&6
+
+fi
+
+if test "$cf_cv_lib_XCurses" = yes ; then
+
+cat >>confdefs.h <<\EOF
+#define UNIX 1
+EOF
+
+cat >>confdefs.h <<\EOF
+#define XCURSES 1
+EOF
+
+	echo "$as_me:16555: checking for xcurses.h" >&5
+echo $ECHO_N "checking for xcurses.h... $ECHO_C" >&6
+if test "${ac_cv_header_xcurses_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 16561 "configure"
+#include "confdefs.h"
+#include <xcurses.h>
+_ACEOF
+if { (eval echo "$as_me:16565: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:16571: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_cv_header_xcurses_h=yes
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  ac_cv_header_xcurses_h=no
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:16590: result: $ac_cv_header_xcurses_h" >&5
+echo "${ECHO_T}$ac_cv_header_xcurses_h" >&6
+if test "$ac_cv_header_xcurses_h" = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_XCURSES 1
+EOF
+
+fi
+
+else
+	{ { echo "$as_me:16601: error: Cannot link with XCurses" >&5
+echo "$as_me: error: Cannot link with XCurses" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+	;;
+(*)
+	{ { echo "$as_me:16608: error: unexpected screen-value: $cf_cv_screen" >&5
+echo "$as_me: error: unexpected screen-value: $cf_cv_screen" >&2;}
+   { (exit 1); exit 1; }; }
+	;;
+esac
+
+: ${cf_nculib_root:=$cf_cv_screen}
+as_ac_Lib=`echo "ac_cv_lib_$cf_nculib_root''__nc_init_pthreads" | $as_tr_sh`
+echo "$as_me:16616: checking for _nc_init_pthreads in -l$cf_nculib_root" >&5
+echo $ECHO_N "checking for _nc_init_pthreads in -l$cf_nculib_root... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Lib+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$cf_nculib_root  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 16624 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char _nc_init_pthreads ();
+int
+main (void)
+{
+_nc_init_pthreads ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:16643: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:16646: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:16649: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:16652: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  eval "$as_ac_Lib=yes"
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_Lib=no"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:16663: result: `eval echo '${'"$as_ac_Lib"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Lib"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Lib"'}'`" = yes; then
+  cf_cv_ncurses_pthreads=yes
+else
+  cf_cv_ncurses_pthreads=no
+fi
+
+if test "$cf_cv_ncurses_pthreads" = yes
+then
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lpthread; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+fi
+
+case $cf_cv_screen in
+(ncurses*)
+	cf_cv_libtype=`echo "$cf_cv_screen" | sed -e 's/^ncurses//'`
+	;;
+esac
+
+echo "$as_me:16698: checking for X11 rgb file" >&5
+echo $ECHO_N "checking for X11 rgb file... $ECHO_C" >&6
+
+# Check whether --with-x11-rgb or --without-x11-rgb was given.
+if test "${with_x11_rgb+set}" = set; then
+  withval="$with_x11_rgb"
+  RGB_PATH=$withval
+else
+  RGB_PATH=auto
+fi;
+
+if test "x$RGB_PATH" = xauto
+then
+	RGB_PATH='${exec_prefix}/lib/X11/rgb.txt'
+	for cf_path in \
+		/opt/local/share/X11/rgb.txt \
+		/opt/X11/share/X11/rgb.txt \
+		/usr/share/X11/rgb.txt \
+		/usr/X11/share/X11/rgb.txt \
+		/usr/X11/lib/X11/rgb.txt \
+		/usr/lib/X11/rgb.txt \
+		/etc/X11/rgb.txt \
+		/usr/pkg/lib/X11/rgb.txt \
+		/usr/X11R7/lib/X11/rgb.txt \
+		/usr/X11R6/lib/X11/rgb.txt \
+		/usr/X11R5/lib/X11/rgb.txt \
+		/usr/X11R4/lib/X11/rgb.txt \
+		/usr/local/lib/X11/rgb.txt \
+		/usr/local/share/X11/rgb.txt \
+		/usr/lib64/X11/rgb.txt
+	do
+		if test -f "$cf_path" ; then
+			RGB_PATH="$cf_path"
+			break
+		fi
+	done
+else
+	cf_path=$RGB_PATH
+
+if test "x$prefix" != xNONE; then
+	cf_path_syntax="$prefix"
+else
+	cf_path_syntax="$ac_default_prefix"
+fi
+
+case ".$cf_path" in
+(.\$\(*\)*|.\'*\'*)
+	;;
+(..|./*|.\\*)
+	;;
+(.[a-zA-Z]:[\\/]*) # OS/2 EMX
+	;;
+(.\$\{*prefix\}*|.\$\{*dir\}*)
+	eval cf_path="$cf_path"
+	case ".$cf_path" in
+	(.NONE/*)
+		cf_path=`echo "$cf_path" | sed -e s%NONE%$cf_path_syntax%`
+		;;
+	esac
+	;;
+(.no|.NONE/*)
+	cf_path=`echo "$cf_path" | sed -e s%NONE%$cf_path_syntax%`
+	;;
+(*)
+	{ { echo "$as_me:16762: error: expected a pathname, not \"$cf_path\"" >&5
+echo "$as_me: error: expected a pathname, not \"$cf_path\"" >&2;}
+   { (exit 1); exit 1; }; }
+	;;
+esac
+
+fi
+
+echo "$as_me:16770: result: $RGB_PATH" >&5
+echo "${ECHO_T}$RGB_PATH" >&6
+
+cat >>confdefs.h <<EOF
+#define RGB_PATH "$cf_path"
+EOF
+
+no_x11_rgb=
+if test "$RGB_PATH" = no
+then
+	no_x11_rgb="#"
+fi
+
+cf_curses_headers=
+
+case $cf_cv_screen in
+(pdcurses)
+	cf_default_panel=no
+	cf_default_form=no
+	cf_default_menu=no
+	cf_default_tinfo=no
+	;;
+(xcurses|bsdcurses)
+	cf_default_panel=no
+	cf_default_form=no
+	cf_default_menu=no
+	cf_default_tinfo=yes
+	;;
+(*)
+	cf_default_panel=yes
+	cf_default_form=yes
+	cf_default_menu=yes
+	cf_default_tinfo=yes
+	case $cf_cv_screen in
+	(ncurses*)
+		cf_curses_headers="nc_alloc.h nomacros.h term_entry.h"
+		;;
+	esac
+	;;
+esac
+
+echo "$as_me:16811: checking for desired basename for form library" >&5
+echo $ECHO_N "checking for desired basename for form library... $ECHO_C" >&6
+
+# Check whether --with-form-libname or --without-form-libname was given.
+if test "${with_form_libname+set}" = set; then
+  withval="$with_form_libname"
+  with_lib_basename=$withval
+else
+  with_lib_basename=form
+fi;
+FORM_NAME="$with_lib_basename"
+
+case "x$FORM_NAME" in
+(x|xno|xnone|xyes)
+	FORM_NAME=form
+	;;
+(*)
+	;;
+esac
+
+echo "$as_me:16831: result: $FORM_NAME" >&5
+echo "${ECHO_T}$FORM_NAME" >&6
+
+echo "$as_me:16834: checking for desired basename for menu library" >&5
+echo $ECHO_N "checking for desired basename for menu library... $ECHO_C" >&6
+
+# Check whether --with-menu-libname or --without-menu-libname was given.
+if test "${with_menu_libname+set}" = set; then
+  withval="$with_menu_libname"
+  with_lib_basename=$withval
+else
+  with_lib_basename=menu
+fi;
+MENU_NAME="$with_lib_basename"
+
+case "x$MENU_NAME" in
+(x|xno|xnone|xyes)
+	MENU_NAME=menu
+	;;
+(*)
+	;;
+esac
+
+echo "$as_me:16854: result: $MENU_NAME" >&5
+echo "${ECHO_T}$MENU_NAME" >&6
+
+echo "$as_me:16857: checking for desired basename for panel library" >&5
+echo $ECHO_N "checking for desired basename for panel library... $ECHO_C" >&6
+
+# Check whether --with-panel-libname or --without-panel-libname was given.
+if test "${with_panel_libname+set}" = set; then
+  withval="$with_panel_libname"
+  with_lib_basename=$withval
+else
+  with_lib_basename=panel
+fi;
+PANEL_NAME="$with_lib_basename"
+
+case "x$PANEL_NAME" in
+(x|xno|xnone|xyes)
+	PANEL_NAME=panel
+	;;
+(*)
+	;;
+esac
+
+echo "$as_me:16877: result: $PANEL_NAME" >&5
+echo "${ECHO_T}$PANEL_NAME" >&6
+
+echo "$as_me:16880: checking if you want to check for panel functions" >&5
+echo $ECHO_N "checking if you want to check for panel functions... $ECHO_C" >&6
+
+# Check whether --enable-panel or --disable-panel was given.
+if test "${enable_panel+set}" = set; then
+  enableval="$enable_panel"
+  test "$enableval" != no && enableval=yes
+	if test "$enableval" != "yes" ; then
+    cf_enable_panel=no
+	else
+		cf_enable_panel=$cf_default_panel
+	fi
+else
+  enableval=yes
+	cf_enable_panel=$cf_default_panel
+
+fi;
+echo "$as_me:16897: result: $cf_enable_panel" >&5
+echo "${ECHO_T}$cf_enable_panel" >&6
+if test $cf_enable_panel = yes
+then
+
+cf_have_curses_lib=no
+
+: ${NCURSES_CONFIG_PKG:=none}
+if test "x${NCURSES_CONFIG_PKG}" = xnone; then
+	:
+elif test "x${PKG_CONFIG:=none}" != xnone; then
+	echo "$as_me:16908: checking pkg-config for $PANEL_NAME$cf_cv_libtype" >&5
+echo $ECHO_N "checking pkg-config for $PANEL_NAME$cf_cv_libtype... $ECHO_C" >&6
+	if "$PKG_CONFIG" --exists "$PANEL_NAME$cf_cv_libtype" ; then
+		echo "$as_me:16911: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+		echo "$as_me:16914: checking if the $PANEL_NAME$cf_cv_libtype package files work" >&5
+echo $ECHO_N "checking if the $PANEL_NAME$cf_cv_libtype package files work... $ECHO_C" >&6
+
+		cf_save_CFLAGS="$CFLAGS"
+		cf_save_CPPFLAGS="$CPPFLAGS"
+		cf_save_LIBS="$LIBS"
+
+for cf_add_cflags in `$PKG_CONFIG --cflags "$PANEL_NAME$cf_cv_libtype"`
+do
+	case "x$cf_add_cflags" in
+	(x-[DU]*)
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CFLAGS" != "$cf_old_cflag" || break
+
+	CFLAGS="$cf_old_cflag"
+done
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CPPFLAGS" != "$cf_old_cflag" || break
+
+	CPPFLAGS="$cf_old_cflag"
+done
+
+		;;
+	esac
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_add_cflags
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+done
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in `$PKG_CONFIG --libs "$PANEL_NAME$cf_cv_libtype"`; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 17064 "configure"
+#include "confdefs.h"
+#include <$PANEL_NAME.h>
+int
+main (void)
+{
+(void) new_panel ( 0 );
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:17076: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:17079: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:17082: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:17085: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  if test "$cross_compiling" = yes; then
+  cf_have_curses_lib=maybe
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 17091 "configure"
+#include "confdefs.h"
+#include <$PANEL_NAME.h>
+				int main(void)
+				{ (void) new_panel ( 0 ); return 0; }
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:17098: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:17101: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:17103: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:17106: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_have_curses_lib=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_curses_lib=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_curses_lib=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+		echo "$as_me:17123: result: $cf_have_curses_lib" >&5
+echo "${ECHO_T}$cf_have_curses_lib" >&6
+		test "$cf_have_curses_lib" = maybe && cf_have_curses_lib=yes
+		if test "$cf_have_curses_lib" = "yes"
+		then
+
+cf_upper=`echo "have_lib$PANEL_NAME" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+			cat >>confdefs.h <<EOF
+#define $cf_upper 1
+EOF
+
+		else
+			CFLAGS="$cf_save_CFLAGS"
+			CPPFLAGS="$cf_save_CPPFLAGS"
+			LIBS="$cf_save_LIBS"
+		fi
+	fi
+fi
+if test "$cf_have_curses_lib" = no; then
+	as_ac_Lib=`echo "ac_cv_lib_$PANEL_NAME$cf_cv_libtype''_new_panel" | $as_tr_sh`
+echo "$as_me:17144: checking for new_panel in -l$PANEL_NAME$cf_cv_libtype" >&5
+echo $ECHO_N "checking for new_panel in -l$PANEL_NAME$cf_cv_libtype... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Lib+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$PANEL_NAME$cf_cv_libtype  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 17152 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char new_panel ();
+int
+main (void)
+{
+new_panel ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:17171: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:17174: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:17177: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:17180: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  eval "$as_ac_Lib=yes"
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_Lib=no"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:17191: result: `eval echo '${'"$as_ac_Lib"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Lib"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Lib"'}'`" = yes; then
+
+cf_upper=`echo "have_lib$PANEL_NAME" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -l$PANEL_NAME$cf_cv_libtype; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+		cat >>confdefs.h <<EOF
+#define $cf_upper 1
+EOF
+
+fi
+
+fi
+
+	cf_curses_headers="$cf_curses_headers panel.h"
+fi
+
+echo "$as_me:17224: checking if you want to check for menu functions" >&5
+echo $ECHO_N "checking if you want to check for menu functions... $ECHO_C" >&6
+
+# Check whether --enable-menu or --disable-menu was given.
+if test "${enable_menu+set}" = set; then
+  enableval="$enable_menu"
+  test "$enableval" != no && enableval=yes
+	if test "$enableval" != "yes" ; then
+    cf_enable_menu=no
+	else
+		cf_enable_menu=$cf_default_menu
+	fi
+else
+  enableval=yes
+	cf_enable_menu=$cf_default_menu
+
+fi;
+echo "$as_me:17241: result: $cf_enable_menu" >&5
+echo "${ECHO_T}$cf_enable_menu" >&6
+if test $cf_enable_menu = yes
+then
+	case $cf_cv_screen in
+	(ncurses*)
+		;;
+	(curses*)
+
+echo "$as_me:17250: checking for NetBSD menu.h" >&5
+echo $ECHO_N "checking for NetBSD menu.h... $ECHO_C" >&6
+if test "${cf_cv_netbsd_menu_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 17257 "configure"
+#include "confdefs.h"
+
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <menu.h>
+
+int
+main (void)
+{
+
+	MENU *menu;
+	int y = menu->max_item_width;
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:17275: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:17278: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:17281: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:17284: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_netbsd_menu_h=yes
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_netbsd_menu_h=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:17296: result: $cf_cv_netbsd_menu_h" >&5
+echo "${ECHO_T}$cf_cv_netbsd_menu_h" >&6
+
+test "$cf_cv_netbsd_menu_h" = yes &&
+cat >>confdefs.h <<\EOF
+#define HAVE_NETBSD_MENU_H 1
+EOF
+
+		;;
+	esac
+
+cf_have_curses_lib=no
+
+: ${NCURSES_CONFIG_PKG:=none}
+if test "x${NCURSES_CONFIG_PKG}" = xnone; then
+	:
+elif test "x${PKG_CONFIG:=none}" != xnone; then
+	echo "$as_me:17313: checking pkg-config for $MENU_NAME$cf_cv_libtype" >&5
+echo $ECHO_N "checking pkg-config for $MENU_NAME$cf_cv_libtype... $ECHO_C" >&6
+	if "$PKG_CONFIG" --exists "$MENU_NAME$cf_cv_libtype" ; then
+		echo "$as_me:17316: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+		echo "$as_me:17319: checking if the $MENU_NAME$cf_cv_libtype package files work" >&5
+echo $ECHO_N "checking if the $MENU_NAME$cf_cv_libtype package files work... $ECHO_C" >&6
+
+		cf_save_CFLAGS="$CFLAGS"
+		cf_save_CPPFLAGS="$CPPFLAGS"
+		cf_save_LIBS="$LIBS"
+
+for cf_add_cflags in `$PKG_CONFIG --cflags "$MENU_NAME$cf_cv_libtype"`
+do
+	case "x$cf_add_cflags" in
+	(x-[DU]*)
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CFLAGS" != "$cf_old_cflag" || break
+
+	CFLAGS="$cf_old_cflag"
+done
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CPPFLAGS" != "$cf_old_cflag" || break
+
+	CPPFLAGS="$cf_old_cflag"
+done
+
+		;;
+	esac
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_add_cflags
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+done
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in `$PKG_CONFIG --libs "$MENU_NAME$cf_cv_libtype"`; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 17469 "configure"
+#include "confdefs.h"
+#include <$MENU_NAME.h>
+int
+main (void)
+{
+(void) menu_driver ( 0,0 );
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:17481: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:17484: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:17487: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:17490: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  if test "$cross_compiling" = yes; then
+  cf_have_curses_lib=maybe
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 17496 "configure"
+#include "confdefs.h"
+#include <$MENU_NAME.h>
+				int main(void)
+				{ (void) menu_driver ( 0,0 ); return 0; }
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:17503: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:17506: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:17508: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:17511: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_have_curses_lib=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_curses_lib=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_curses_lib=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+		echo "$as_me:17528: result: $cf_have_curses_lib" >&5
+echo "${ECHO_T}$cf_have_curses_lib" >&6
+		test "$cf_have_curses_lib" = maybe && cf_have_curses_lib=yes
+		if test "$cf_have_curses_lib" = "yes"
+		then
+
+cf_upper=`echo "have_lib$MENU_NAME" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+			cat >>confdefs.h <<EOF
+#define $cf_upper 1
+EOF
+
+		else
+			CFLAGS="$cf_save_CFLAGS"
+			CPPFLAGS="$cf_save_CPPFLAGS"
+			LIBS="$cf_save_LIBS"
+		fi
+	fi
+fi
+if test "$cf_have_curses_lib" = no; then
+	as_ac_Lib=`echo "ac_cv_lib_$MENU_NAME$cf_cv_libtype''_menu_driver" | $as_tr_sh`
+echo "$as_me:17549: checking for menu_driver in -l$MENU_NAME$cf_cv_libtype" >&5
+echo $ECHO_N "checking for menu_driver in -l$MENU_NAME$cf_cv_libtype... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Lib+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$MENU_NAME$cf_cv_libtype  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 17557 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char menu_driver ();
+int
+main (void)
+{
+menu_driver ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:17576: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:17579: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:17582: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:17585: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  eval "$as_ac_Lib=yes"
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_Lib=no"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:17596: result: `eval echo '${'"$as_ac_Lib"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Lib"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Lib"'}'`" = yes; then
+
+cf_upper=`echo "have_lib$MENU_NAME" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -l$MENU_NAME$cf_cv_libtype; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+		cat >>confdefs.h <<EOF
+#define $cf_upper 1
+EOF
+
+fi
+
+fi
+
+	cf_curses_headers="$cf_curses_headers menu.h"
+fi
+
+echo "$as_me:17629: checking if you want to check for form functions" >&5
+echo $ECHO_N "checking if you want to check for form functions... $ECHO_C" >&6
+
+# Check whether --enable-form or --disable-form was given.
+if test "${enable_form+set}" = set; then
+  enableval="$enable_form"
+  test "$enableval" != no && enableval=yes
+	if test "$enableval" != "yes" ; then
+    cf_enable_form=no
+	else
+		cf_enable_form=$cf_default_form
+	fi
+else
+  enableval=yes
+	cf_enable_form=$cf_default_form
+
+fi;
+echo "$as_me:17646: result: $cf_enable_form" >&5
+echo "${ECHO_T}$cf_enable_form" >&6
+if test $cf_enable_form = yes
+then
+	case $cf_cv_screen in
+	(ncurses*)
+		;;
+	(curses*)
+
+echo "$as_me:17655: checking for NetBSD form.h" >&5
+echo $ECHO_N "checking for NetBSD form.h... $ECHO_C" >&6
+if test "${cf_cv_netbsd_form_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 17662 "configure"
+#include "confdefs.h"
+
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <form.h>
+
+int
+main (void)
+{
+
+	FORM *form;
+	int y = current_field(form)->cursor_ypos;
+	int x = current_field(form)->cursor_xpos;
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:17681: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:17684: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:17687: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:17690: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_netbsd_form_h=yes
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_netbsd_form_h=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:17702: result: $cf_cv_netbsd_form_h" >&5
+echo "${ECHO_T}$cf_cv_netbsd_form_h" >&6
+
+test "$cf_cv_netbsd_form_h" = yes &&
+cat >>confdefs.h <<\EOF
+#define HAVE_NETBSD_FORM_H 1
+EOF
+
+		;;
+	esac
+
+cf_have_curses_lib=no
+
+: ${NCURSES_CONFIG_PKG:=none}
+if test "x${NCURSES_CONFIG_PKG}" = xnone; then
+	:
+elif test "x${PKG_CONFIG:=none}" != xnone; then
+	echo "$as_me:17719: checking pkg-config for $FORM_NAME$cf_cv_libtype" >&5
+echo $ECHO_N "checking pkg-config for $FORM_NAME$cf_cv_libtype... $ECHO_C" >&6
+	if "$PKG_CONFIG" --exists "$FORM_NAME$cf_cv_libtype" ; then
+		echo "$as_me:17722: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+		echo "$as_me:17725: checking if the $FORM_NAME$cf_cv_libtype package files work" >&5
+echo $ECHO_N "checking if the $FORM_NAME$cf_cv_libtype package files work... $ECHO_C" >&6
+
+		cf_save_CFLAGS="$CFLAGS"
+		cf_save_CPPFLAGS="$CPPFLAGS"
+		cf_save_LIBS="$LIBS"
+
+for cf_add_cflags in `$PKG_CONFIG --cflags "$FORM_NAME$cf_cv_libtype"`
+do
+	case "x$cf_add_cflags" in
+	(x-[DU]*)
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CFLAGS" != "$cf_old_cflag" || break
+
+	CFLAGS="$cf_old_cflag"
+done
+
+cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'`
+while true
+do
+	cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ 	][ 	]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ 	][^ 	]*\\)\?%%" -e 's/^[ 	]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'`
+	test "$CPPFLAGS" != "$cf_old_cflag" || break
+
+	CPPFLAGS="$cf_old_cflag"
+done
+
+		;;
+	esac
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in $cf_add_cflags
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+done
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in `$PKG_CONFIG --libs "$FORM_NAME$cf_cv_libtype"`; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 17875 "configure"
+#include "confdefs.h"
+#include <$FORM_NAME.h>
+int
+main (void)
+{
+(void) form_driver ( 0,0 );
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:17887: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:17890: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:17893: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:17896: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  if test "$cross_compiling" = yes; then
+  cf_have_curses_lib=maybe
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 17902 "configure"
+#include "confdefs.h"
+#include <$FORM_NAME.h>
+				int main(void)
+				{ (void) form_driver ( 0,0 ); return 0; }
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:17909: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:17912: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:17914: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:17917: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_have_curses_lib=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_curses_lib=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_have_curses_lib=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+		echo "$as_me:17934: result: $cf_have_curses_lib" >&5
+echo "${ECHO_T}$cf_have_curses_lib" >&6
+		test "$cf_have_curses_lib" = maybe && cf_have_curses_lib=yes
+		if test "$cf_have_curses_lib" = "yes"
+		then
+
+cf_upper=`echo "have_lib$FORM_NAME" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+			cat >>confdefs.h <<EOF
+#define $cf_upper 1
+EOF
+
+		else
+			CFLAGS="$cf_save_CFLAGS"
+			CPPFLAGS="$cf_save_CPPFLAGS"
+			LIBS="$cf_save_LIBS"
+		fi
+	fi
+fi
+if test "$cf_have_curses_lib" = no; then
+	as_ac_Lib=`echo "ac_cv_lib_$FORM_NAME$cf_cv_libtype''_form_driver" | $as_tr_sh`
+echo "$as_me:17955: checking for form_driver in -l$FORM_NAME$cf_cv_libtype" >&5
+echo $ECHO_N "checking for form_driver in -l$FORM_NAME$cf_cv_libtype... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Lib+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$FORM_NAME$cf_cv_libtype  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 17963 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char form_driver ();
+int
+main (void)
+{
+form_driver ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:17982: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:17985: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:17988: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:17991: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  eval "$as_ac_Lib=yes"
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_Lib=no"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:18002: result: `eval echo '${'"$as_ac_Lib"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Lib"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Lib"'}'`" = yes; then
+
+cf_upper=`echo "have_lib$FORM_NAME" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -l$FORM_NAME$cf_cv_libtype; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+		cat >>confdefs.h <<EOF
+#define $cf_upper 1
+EOF
+
+fi
+
+fi
+
+	cf_curses_headers="$cf_curses_headers form.h"
+fi
+
+# look for curses-related headers
+
+for ac_header in $cf_curses_headers
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:18040: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 18046 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:18050: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:18056: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:18075: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+echo "$as_me:18085: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
+if test "${ac_cv_header_stdc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 18091 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+_ACEOF
+if { (eval echo "$as_me:18099: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:18105: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_cv_header_stdc=yes
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  ac_cv_header_stdc=no
+fi
+rm -f conftest.err "conftest.$ac_ext"
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 18127 "configure"
+#include "confdefs.h"
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -rf conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 18145 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -rf conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then
+  :
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 18166 "configure"
+#include "confdefs.h"
+#include <ctype.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) (('a' <= (c) && (c) <= 'i') \
+                     || ('j' <= (c) && (c) <= 'r') \
+                     || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main (void)
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+        || toupper (i) != TOUPPER (i))
+      $ac_main_return(2);
+  $ac_main_return (0);
+}
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:18192: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:18195: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:18197: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:18200: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_header_stdc=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+fi
+fi
+echo "$as_me:18213: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6
+if test $ac_cv_header_stdc = yes; then
+
+cat >>confdefs.h <<\EOF
+#define STDC_HEADERS 1
+EOF
+
+fi
+
+echo "$as_me:18223: checking whether time.h and sys/time.h may both be included" >&5
+echo $ECHO_N "checking whether time.h and sys/time.h may both be included... $ECHO_C" >&6
+if test "${ac_cv_header_time+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 18229 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <sys/time.h>
+#include <time.h>
+
+int
+main (void)
+{
+if ((struct tm *) 0)
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:18245: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:18248: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:18251: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:18254: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_header_time=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_header_time=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:18264: result: $ac_cv_header_time" >&5
+echo "${ECHO_T}$ac_cv_header_time" >&6
+if test $ac_cv_header_time = yes; then
+
+cat >>confdefs.h <<\EOF
+#define TIME_WITH_SYS_TIME 1
+EOF
+
+fi
+
+for ac_header in \
+getopt.h \
+locale.h \
+math.h \
+stdarg.h \
+stdint.h \
+sys/ioctl.h \
+sys/select.h \
+sys/time.h \
+termios.h \
+unistd.h \
+
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:18288: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 18294 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:18298: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:18304: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:18323: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+for ac_header in unistd.h getopt.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:18336: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 18342 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:18346: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:18352: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  eval "$as_ac_Header=no"
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:18371: result: `eval echo '${'"$as_ac_Header"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6
+if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+echo "$as_me:18381: checking for header declaring getopt variables" >&5
+echo $ECHO_N "checking for header declaring getopt variables... $ECHO_C" >&6
+if test "${cf_cv_getopt_header+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cf_cv_getopt_header=none
+for cf_header in stdio.h stdlib.h unistd.h getopt.h
+do
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 18391 "configure"
+#include "confdefs.h"
+
+#include <$cf_header>
+int
+main (void)
+{
+int x = optind; char *y = optarg; (void)x; (void)y
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:18404: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:18407: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:18410: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:18413: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_getopt_header=$cf_header
+ break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+done
+
+fi
+echo "$as_me:18425: result: $cf_cv_getopt_header" >&5
+echo "${ECHO_T}$cf_cv_getopt_header" >&6
+if test "$cf_cv_getopt_header" != none ; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_GETOPT_HEADER 1
+EOF
+
+fi
+if test "$cf_cv_getopt_header" = getopt.h ; then
+
+cat >>confdefs.h <<\EOF
+#define NEED_GETOPT_H 1
+EOF
+
+fi
+
+for ac_func in \
+cfmakeraw \
+getopt \
+gettimeofday \
+snprintf \
+strdup \
+strstr \
+tsearch \
+
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:18453: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 18459 "configure"
+#include "confdefs.h"
+#define $ac_func autoconf_temporary
+#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
+#undef $ac_func
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char $ac_func (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+#error found stub for $ac_func
+#endif
+
+	return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:18490: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:18493: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:18496: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:18499: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_var=no"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:18509: result: `eval echo '${'"$as_ac_var"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6
+if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+# use a compile-check to work with ncurses*-config and subdirectory includes
+echo "$as_me:18520: checking if we can use termcap.h" >&5
+echo $ECHO_N "checking if we can use termcap.h... $ECHO_C" >&6
+if test "${cf_cv_have_termcap_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 18527 "configure"
+#include "confdefs.h"
+
+#include <curses.h>
+#ifdef NCURSES_VERSION
+#undef NCURSES_VERSION
+#endif
+#include <termcap.h>
+#ifndef NCURSES_VERSION
+#error wrong header
+#endif
+
+int
+main (void)
+{
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:18548: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:18551: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:18554: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:18557: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_have_termcap_h=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_have_termcap_h=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:18567: result: $cf_cv_have_termcap_h" >&5
+echo "${ECHO_T}$cf_cv_have_termcap_h" >&6
+if test "x$cf_cv_have_termcap_h" = xyes
+then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_TERMCAP_H 1
+EOF
+
+else
+echo "$as_me:18577: checking if we can use ncurses/termcap.h" >&5
+echo $ECHO_N "checking if we can use ncurses/termcap.h... $ECHO_C" >&6
+if test "${cf_cv_have_ncurses_termcap_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 18584 "configure"
+#include "confdefs.h"
+
+#include <ncurses/curses.h>
+#ifdef NCURSES_VERSION
+#undef NCURSES_VERSION
+#endif
+#include <ncurses/termcap.h>
+#ifndef NCURSES_VERSION
+#error wrong header
+#endif
+
+int
+main (void)
+{
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:18605: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:18608: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:18611: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:18614: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_have_ncurses_termcap_h=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_have_ncurses_termcap_h=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:18624: result: $cf_cv_have_ncurses_termcap_h" >&5
+echo "${ECHO_T}$cf_cv_have_ncurses_termcap_h" >&6
+test "x$cf_cv_have_ncurses_termcap_h" = xyes &&
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSES_TERMCAP_H 1
+EOF
+
+fi
+
+if test "x$ac_cv_func_getopt" = xno; then
+	{ { echo "$as_me:18634: error: getopt is required for building programs" >&5
+echo "$as_me: error: getopt is required for building programs" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+if test "$cf_enable_widec" = yes; then
+
+for ac_func in \
+mblen \
+mbrlen \
+mbrtowc \
+mbsrtowcs \
+mbstowcs \
+mbtowc \
+wcsrtombs \
+wcstombs \
+
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:18653: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 18659 "configure"
+#include "confdefs.h"
+#define $ac_func autoconf_temporary
+#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
+#undef $ac_func
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char $ac_func (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+#error found stub for $ac_func
+#endif
+
+	return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:18690: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:18693: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:18696: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:18699: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+eval "$as_ac_var=no"
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:18709: result: `eval echo '${'"$as_ac_var"'}'`" >&5
+echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6
+if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+fi
+
+echo "$as_me:18721: checking definition to turn on extended curses functions" >&5
+echo $ECHO_N "checking definition to turn on extended curses functions... $ECHO_C" >&6
+if test "${cf_cv_need_xopen_extension+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cf_cv_need_xopen_extension=unknown
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 18729 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+
+#if defined(NCURSES_VERSION_PATCH)
+#if (NCURSES_VERSION_PATCH < 20100501) && (NCURSES_VERSION_PATCH >= 20100403)
+	make an error
+#endif
+#endif
+#ifdef NCURSES_WIDECHAR
+make an error	/* prefer to fall-through on the second checks */
+#endif
+	cchar_t check;
+	int check2 = curs_set((int)sizeof(check));
+	long x = winnstr(stdscr, "", 0);
+	int x1, y1;
+	(void)check2;
+	getbegyx(stdscr, y1, x1);
+	(void)x;
+	(void)y1;
+	(void)x1;
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:18761: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:18764: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:18767: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:18770: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_need_xopen_extension=none
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+	for cf_try_xopen_extension in _XOPEN_SOURCE_EXTENDED NCURSES_WIDECHAR
+	do
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 18780 "configure"
+#include "confdefs.h"
+
+#define $cf_try_xopen_extension 1
+#include <stdlib.h>
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+
+		cchar_t check;
+		int check2 = curs_set((int)sizeof(check));
+		long x = winnstr(stdscr, "", 0);
+		int x1, y1;
+		getbegyx(stdscr, y1, x1);
+		(void)check2;
+		(void)x;
+		(void)y1;
+		(void)x1;
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:18805: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:18808: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:18811: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:18814: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_need_xopen_extension=$cf_try_xopen_extension; break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+	done
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:18828: result: $cf_cv_need_xopen_extension" >&5
+echo "${ECHO_T}$cf_cv_need_xopen_extension" >&6
+
+case "$cf_cv_need_xopen_extension" in
+(*_*)
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-D$cf_cv_need_xopen_extension"
+
+	;;
+esac
+
+echo "$as_me:18840: checking for term.h" >&5
+echo $ECHO_N "checking for term.h... $ECHO_C" >&6
+if test "${cf_cv_term_header+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+# If we found <ncurses/curses.h>, look for <ncurses/term.h>, but always look
+# for <term.h> if we do not find the variant.
+
+cf_header_list="term.h ncurses/term.h ncursesw/term.h"
+
+case "${cf_cv_ncurses_header:-curses.h}" in
+(*/*)
+	cf_header_item=`echo "${cf_cv_ncurses_header:-curses.h}" | sed -e 's%\..*%%' -e 's%/.*%/%'`term.h
+	cf_header_list="$cf_header_item $cf_header_list"
+	;;
+esac
+
+for cf_header in $cf_header_list
+do
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 18861 "configure"
+#include "confdefs.h"
+
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <${cf_header}>
+int
+main (void)
+{
+WINDOW *x; (void)x
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:18875: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:18878: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:18881: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:18884: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_term_header=$cf_header
+	 break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_term_header=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+done
+
+case "$cf_cv_term_header" in
+(no)
+	# If curses is ncurses, some packagers still mess it up by trying to make
+	# us use GNU termcap.  This handles the most common case.
+	for cf_header in ncurses/term.h ncursesw/term.h
+	do
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 18903 "configure"
+#include "confdefs.h"
+
+#include <${cf_cv_ncurses_header:-curses.h}>
+#ifdef NCURSES_VERSION
+#include <${cf_header}>
+#else
+make an error
+#endif
+int
+main (void)
+{
+WINDOW *x; (void)x
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:18921: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:18924: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:18927: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:18930: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_term_header=$cf_header
+			 break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_term_header=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+	done
+	;;
+esac
+
+fi
+echo "$as_me:18945: result: $cf_cv_term_header" >&5
+echo "${ECHO_T}$cf_cv_term_header" >&6
+
+case "$cf_cv_term_header" in
+(term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_TERM_H 1
+EOF
+
+	;;
+(ncurses/term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSES_TERM_H 1
+EOF
+
+	;;
+(ncursesw/term.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSESW_TERM_H 1
+EOF
+
+	;;
+esac
+
+echo "$as_me:18972: checking for unctrl.h" >&5
+echo $ECHO_N "checking for unctrl.h... $ECHO_C" >&6
+if test "${cf_cv_unctrl_header+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+# If we found <ncurses/curses.h>, look for <ncurses/unctrl.h>, but always look
+# for <unctrl.h> if we do not find the variant.
+
+cf_header_list="unctrl.h ncurses/unctrl.h ncursesw/unctrl.h"
+
+case "${cf_cv_ncurses_header:-curses.h}" in
+(*/*)
+	cf_header_item=`echo "${cf_cv_ncurses_header:-curses.h}" | sed -e 's%\..*%%' -e 's%/.*%/%'`unctrl.h
+	cf_header_list="$cf_header_item $cf_header_list"
+	;;
+esac
+
+for cf_header in $cf_header_list
+do
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 18993 "configure"
+#include "confdefs.h"
+
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <${cf_header}>
+int
+main (void)
+{
+WINDOW *x; (void)x
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:19007: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:19010: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:19013: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:19016: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_unctrl_header=$cf_header
+	 break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_unctrl_header=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+done
+
+fi
+echo "$as_me:19029: result: $cf_cv_unctrl_header" >&5
+echo "${ECHO_T}$cf_cv_unctrl_header" >&6
+
+case "$cf_cv_unctrl_header" in
+(no)
+	{ echo "$as_me:19034: WARNING: unctrl.h header not found" >&5
+echo "$as_me: WARNING: unctrl.h header not found" >&2;}
+	;;
+esac
+
+case "$cf_cv_unctrl_header" in
+(unctrl.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_UNCTRL_H 1
+EOF
+
+	;;
+(ncurses/unctrl.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSES_UNCTRL_H 1
+EOF
+
+	;;
+(ncursesw/unctrl.h)
+
+cat >>confdefs.h <<\EOF
+#define HAVE_NCURSESW_UNCTRL_H 1
+EOF
+
+	;;
+esac
+
+for cf_func in \
+alloc_pair \
+assume_default_colors \
+chgat \
+color_content \
+color_set \
+copywin \
+curses_trace \
+delscreen \
+dupwin \
+exit_curses \
+exit_terminfo \
+filter \
+getbegx \
+getcurx \
+getmaxx \
+getnstr \
+getparx \
+getwin \
+halfdelay \
+init_extended_color \
+mvderwin \
+mvvline \
+mvwin \
+mvwvline \
+napms \
+newpad \
+putwin \
+reset_color_pairs \
+resize_term \
+resizeterm \
+restartterm \
+ripoffline \
+scr_dump \
+setupterm \
+slk_color \
+slk_init \
+termattrs \
+termname \
+tgetent \
+tigetnum \
+tigetstr \
+tputs_sp \
+typeahead \
+unget_wch \
+use_default_colors \
+use_env \
+use_extended_names \
+use_screen \
+use_window \
+vid_puts \
+vidputs \
+vsscanf \
+vw_printw \
+wchgat \
+winsdelln \
+winsstr \
+wresize \
+wsyncdown \
+_tracef \
+
+do
+
+cf_tr_func=`echo "$cf_func" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+	echo "$as_me:19128: checking for ${cf_func}" >&5
+echo $ECHO_N "checking for ${cf_func}... $ECHO_C" >&6
+
+echo "${as_me:-configure}:19131: testing ${cf_func} ..." 1>&5
+
+	if eval "test \"\${cf_cv_func_$cf_func+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+		eval cf_result='$ac_cv_func_'$cf_func
+		if test ".$cf_result" != ".no"; then
+			cat >"conftest.$ac_ext" <<_ACEOF
+#line 19140 "configure"
+#include "confdefs.h"
+
+#ifdef HAVE_XCURSES
+#include <xcurses.h>
+char * XCursesProgramName = "test";
+#else
+#include <${cf_cv_ncurses_header:-curses.h}>
+#if defined(NCURSES_VERSION) && defined(HAVE_NCURSESW_TERM_H)
+#include <ncursesw/term.h>
+#elif defined(NCURSES_VERSION) && defined(HAVE_NCURSES_TERM_H)
+#include <ncurses/term.h>
+#elif defined(HAVE_TERM_H)
+#include <term.h>
+#endif
+#endif
+
+int
+main (void)
+{
+
+#ifndef ${cf_func}
+long foo = (long)(&${cf_func});
+fprintf(stderr, "testing linkage of $cf_func:%p\\n", (void *)foo);
+if (foo + 1234L > 5678L)
+	${cf_cv_main_return:-return}(foo != 0);
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:19173: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:19176: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:19179: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:19182: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_result=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_result=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+		fi
+		eval 'cf_cv_func_'$cf_func'="$cf_result"'
+
+fi
+
+	# use the computed/retrieved cache-value:
+	eval 'cf_result=$cf_cv_func_'$cf_func
+	echo "$as_me:19198: result: $cf_result" >&5
+echo "${ECHO_T}$cf_result" >&6
+	if test "$cf_result" != no; then
+		cat >>confdefs.h <<EOF
+#define HAVE_${cf_tr_func} 1
+EOF
+
+	fi
+done
+
+for cf_func in tputs
+do
+
+cf_tr_func=`echo "$cf_func" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+	echo "$as_me:19213: checking for ${cf_func}" >&5
+echo $ECHO_N "checking for ${cf_func}... $ECHO_C" >&6
+
+echo "${as_me:-configure}:19216: testing ${cf_func} ..." 1>&5
+
+	if eval "test \"\${cf_cv_func_$cf_func+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+		eval cf_result='$ac_cv_func_'$cf_func
+		if test ".$cf_result" != ".no"; then
+			cat >"conftest.$ac_ext" <<_ACEOF
+#line 19225 "configure"
+#include "confdefs.h"
+
+#ifdef HAVE_XCURSES
+#include <xcurses.h>
+char * XCursesProgramName = "test";
+#else
+#include <${cf_cv_ncurses_header:-curses.h}>
+#if defined(NCURSES_VERSION) && defined(HAVE_NCURSESW_TERM_H)
+#include <ncursesw/term.h>
+#elif defined(NCURSES_VERSION) && defined(HAVE_NCURSES_TERM_H)
+#include <ncurses/term.h>
+#elif defined(HAVE_TERM_H)
+#include <term.h>
+#endif
+#endif
+
+int
+main (void)
+{
+
+#ifndef ${cf_func}
+long foo = (long)(&${cf_func});
+fprintf(stderr, "testing linkage of $cf_func:%p\\n", (void *)foo);
+if (foo + 1234L > 5678L)
+	${cf_cv_main_return:-return}(foo != 0);
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:19258: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:19261: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:19264: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:19267: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_result=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_result=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+		fi
+		eval 'cf_cv_func_'$cf_func'="$cf_result"'
+
+fi
+
+	# use the computed/retrieved cache-value:
+	eval 'cf_result=$cf_cv_func_'$cf_func
+	echo "$as_me:19283: result: $cf_result" >&5
+echo "${ECHO_T}$cf_result" >&6
+	if test "$cf_result" != no; then
+		cat >>confdefs.h <<EOF
+#define HAVE_${cf_tr_func} 1
+EOF
+
+	fi
+done
+
+if test "x$cf_cv_func_tputs" = xyes
+then
+	cf_done=no
+	for cf_arg in int char
+	do
+		for cf_ret in int void
+		do
+			if test "$cf_ret" = void
+			then
+				cf_return="/* nothing */"
+			else
+				cf_return="return value"
+			fi
+			cat >"conftest.$ac_ext" <<_ACEOF
+#line 19307 "configure"
+#include "confdefs.h"
+
+#include <${cf_cv_ncurses_header:-curses.h}>
+#include <$cf_cv_term_header>
+
+static $cf_ret outc($cf_arg value) { $cf_return; }
+
+int
+main (void)
+{
+
+	tputs("hello", 0, outc);
+	${cf_cv_main_return:-return}(0);
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:19327: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:19330: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:19333: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:19336: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+		test -n "$verbose" && echo "	prototype $cf_ret func($cf_arg value)" 1>&6
+
+echo "${as_me:-configure}:19341: testing prototype $cf_ret func($cf_arg value) ..." 1>&5
+
+		cat >>confdefs.h <<EOF
+#define TPUTS_ARG               $cf_arg
+#define TPUTS_PROTO(func,value) $cf_ret func(TPUTS_ARG value)
+#define TPUTS_RETURN(value)     $cf_return
+EOF
+		cf_done=yes
+		break
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+		done
+		test "$cf_done" = yes && break
+	done
+fi
+
+echo "$as_me:19361: checking for ncurses extended functions" >&5
+echo $ECHO_N "checking for ncurses extended functions... $ECHO_C" >&6
+if test "${cf_cv_ncurses_ext_funcs+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 19368 "configure"
+#include "confdefs.h"
+
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+
+int x = NCURSES_EXT_FUNCS
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:19383: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:19386: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:19389: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:19392: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_ncurses_ext_funcs=defined
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 19400 "configure"
+#include "confdefs.h"
+
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+
+	(void) assume_default_colors (0, 0);
+	(void) curses_version ();
+	(void) define_key (0, 0);
+	(void) is_term_resized (0, 0);
+	(void) key_defined (0);
+	(void) keybound (0, 0);
+	(void) keyok (0, 0);
+	(void) resize_term (0, 0);
+	(void) resizeterm (0, 0);
+	(void) use_default_colors ();
+	(void) use_extended_names (0);
+	(void) wresize (0, 0, 0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:19425: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:19428: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:19431: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:19434: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_ncurses_ext_funcs=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_ncurses_ext_funcs=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:19448: result: $cf_cv_ncurses_ext_funcs" >&5
+echo "${ECHO_T}$cf_cv_ncurses_ext_funcs" >&6
+test "$cf_cv_ncurses_ext_funcs" = yes &&
+cat >>confdefs.h <<\EOF
+#define NCURSES_EXT_FUNCS 1
+EOF
+
+if test "$cf_enable_widec" = yes
+then
+	# workaround for systems with ncurses before 20111029, due to change of
+	# feature test macro from _XPG5 to _XOPEN_SOURCE
+	if test -n "$cf_cv_ncurses_version" && test "x$cf_cv_ncurses_version" != xno
+	then
+		cf_define_xpg5=no
+		echo "$as_me:19462: checking if _XPG5 should be defined to enable wide-characters" >&5
+echo $ECHO_N "checking if _XPG5 should be defined to enable wide-characters... $ECHO_C" >&6
+
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 19466 "configure"
+#include "confdefs.h"
+
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+int x = _XPG5
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:19479: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:19482: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:19485: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:19488: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_save_cppflags="$CPPFLAGS"
+			 CPPFLAGS="$CPPFLAGS -D_XPG5"
+			 cat >"conftest.$ac_ext" <<_ACEOF
+#line 19497 "configure"
+#include "confdefs.h"
+
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+int x = _XPG5
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:19510: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:19513: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:19516: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:19519: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_define_xpg5=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+			 CPPFLAGS="$cf_save_cppflags"
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+		echo "$as_me:19530: result: $cf_define_xpg5" >&5
+echo "${ECHO_T}$cf_define_xpg5" >&6
+
+		if test "$cf_define_xpg5" = yes
+		then
+			CPPFLAGS="$CPPFLAGS -D_XPG5"
+		fi
+	fi
+
+	echo "$as_me:19539: checking for wide-character functions" >&5
+echo $ECHO_N "checking for wide-character functions... $ECHO_C" >&6
+if test "${cf_cv_widechar_funcs+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 19546 "configure"
+#include "confdefs.h"
+
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+
+		static wchar_t src_wchar[2];
+		static cchar_t dst_cchar;
+		setcchar(&dst_cchar, src_wchar, A_NORMAL, 0, (void *) 0);
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:19563: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:19566: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:19569: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:19572: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_widechar_funcs=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_widechar_funcs=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:19583: result: $cf_cv_widechar_funcs" >&5
+echo "${ECHO_T}$cf_cv_widechar_funcs" >&6
+	if test "$cf_cv_widechar_funcs" != no ; then
+
+cat >>confdefs.h <<\EOF
+#define USE_WIDEC_SUPPORT 1
+EOF
+
+	else
+		cat >>confdefs.h <<\EOF
+#define USE_WIDEC_SUPPORT 0
+EOF
+
+	fi
+else
+	cat >>confdefs.h <<\EOF
+#define USE_WIDEC_SUPPORT 0
+EOF
+
+fi
+
+echo "$as_me:19604: checking if $cf_cv_screen library uses pthreads" >&5
+echo $ECHO_N "checking if $cf_cv_screen library uses pthreads... $ECHO_C" >&6
+if test "${cf_cv_use_pthreads+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 19611 "configure"
+#include "confdefs.h"
+
+#include <${cf_cv_ncurses_header:-curses.h}>
+extern void _nc_init_pthreads(void);
+
+int
+main (void)
+{
+
+	initscr();
+	_nc_init_pthreads();
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:19629: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:19632: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:19635: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:19638: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_use_pthreads=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_use_pthreads=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:19649: result: $cf_cv_use_pthreads" >&5
+echo "${ECHO_T}$cf_cv_use_pthreads" >&6
+test $cf_cv_use_pthreads = yes &&
+cat >>confdefs.h <<\EOF
+#define USE_PTHREADS 1
+EOF
+
+echo "$as_me:19656: checking if sys/time.h works with sys/select.h" >&5
+echo $ECHO_N "checking if sys/time.h works with sys/select.h... $ECHO_C" >&6
+if test "${cf_cv_sys_time_select+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 19663 "configure"
+#include "confdefs.h"
+
+#include <sys/types.h>
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#ifdef HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:19683: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:19686: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:19689: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:19692: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_sys_time_select=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_sys_time_select=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+
+echo "$as_me:19704: result: $cf_cv_sys_time_select" >&5
+echo "${ECHO_T}$cf_cv_sys_time_select" >&6
+test "$cf_cv_sys_time_select" = yes &&
+cat >>confdefs.h <<\EOF
+#define HAVE_SYS_TIME_SELECT 1
+EOF
+
+# special check for test/ditto.c
+
+echo "$as_me:19713: checking for openpty in -lutil" >&5
+echo $ECHO_N "checking for openpty in -lutil... $ECHO_C" >&6
+if test "${ac_cv_lib_util_openpty+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lutil  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 19721 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char openpty ();
+int
+main (void)
+{
+openpty ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:19740: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:19743: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:19746: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:19749: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_util_openpty=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_util_openpty=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:19760: result: $ac_cv_lib_util_openpty" >&5
+echo "${ECHO_T}$ac_cv_lib_util_openpty" >&6
+if test "$ac_cv_lib_util_openpty" = yes; then
+  cf_cv_lib_util=yes
+else
+  cf_cv_lib_util=no
+fi
+
+echo "$as_me:19768: checking for openpty header" >&5
+echo $ECHO_N "checking for openpty header... $ECHO_C" >&6
+if test "${cf_cv_func_openpty+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cf_save_LIBS="$LIBS"
+	test "$cf_cv_lib_util" = yes && {
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lutil; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+ }
+	for cf_header in pty.h libutil.h util.h
+	do
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 19795 "configure"
+#include "confdefs.h"
+
+#include <$cf_header>
+
+int
+main (void)
+{
+
+	int x = openpty((int *)0, (int *)0, (char *)0,
+				   (struct termios *)0, (struct winsize *)0);
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:19812: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:19815: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:19818: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:19821: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+		cf_cv_func_openpty=$cf_header
+		break
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+		cf_cv_func_openpty=no
+
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+	done
+	LIBS="$cf_save_LIBS"
+
+fi
+echo "$as_me:19839: result: $cf_cv_func_openpty" >&5
+echo "${ECHO_T}$cf_cv_func_openpty" >&6
+
+if test "$cf_cv_func_openpty" != no ; then
+
+cat >>confdefs.h <<EOF
+#define USE_OPENPTY_HEADER <$cf_cv_func_openpty>
+EOF
+
+cat >>confdefs.h <<\EOF
+#define USE_XTERM_PTY 1
+EOF
+
+	if test "x$cf_cv_lib_util" = xyes ; then
+
+cf_add_libs="$TEST_LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in -lutil; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+TEST_LIBS="$cf_add_libs"
+
+	fi
+fi
+
+echo "$as_me:19873: checking for function curses_version" >&5
+echo $ECHO_N "checking for function curses_version... $ECHO_C" >&6
+if test "${cf_cv_func_curses_version+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+if test "$cross_compiling" = yes; then
+  cf_cv_func_curses_version=unknown
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 19883 "configure"
+#include "confdefs.h"
+
+#include <${cf_cv_ncurses_header:-curses.h}>
+int main(void)
+{
+	char temp[1024];
+	sprintf(temp, "%s\\n", curses_version());
+	${cf_cv_main_return:-return}(0);
+}
+
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:19896: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:19899: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:19901: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:19904: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_func_curses_version=yes
+
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_func_curses_version=no
+
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+rm -f core
+fi
+echo "$as_me:19919: result: $cf_cv_func_curses_version" >&5
+echo "${ECHO_T}$cf_cv_func_curses_version" >&6
+test "$cf_cv_func_curses_version" = yes &&
+cat >>confdefs.h <<\EOF
+#define HAVE_CURSES_VERSION 1
+EOF
+
+echo "$as_me:19926: checking for alternate character set array" >&5
+echo $ECHO_N "checking for alternate character set array... $ECHO_C" >&6
+if test "${cf_cv_curses_acs_map+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cf_cv_curses_acs_map=unknown
+for name in acs_map _acs_map __acs_map ${NCURSES_WRAP_PREFIX}acs_map
+do
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 19936 "configure"
+#include "confdefs.h"
+
+#include <${cf_cv_ncurses_header:-curses.h}>
+
+int
+main (void)
+{
+
+${name}['k'] = ACS_PLUS
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:19952: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:19955: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:19958: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:19961: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_curses_acs_map=$name; break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+done
+
+fi
+echo "$as_me:19972: result: $cf_cv_curses_acs_map" >&5
+echo "${ECHO_T}$cf_cv_curses_acs_map" >&6
+
+test "$cf_cv_curses_acs_map" != unknown &&
+cat >>confdefs.h <<EOF
+#define CURSES_ACS_ARRAY $cf_cv_curses_acs_map
+EOF
+
+if test "$cf_enable_widec" = yes; then
+
+echo "$as_me:19982: checking for wide alternate character set array" >&5
+echo $ECHO_N "checking for wide alternate character set array... $ECHO_C" >&6
+if test "${cf_cv_curses_wacs_map+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cf_cv_curses_wacs_map=unknown
+	for name in wacs_map _wacs_map __wacs_map _nc_wacs _wacs_char
+	do
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 19992 "configure"
+#include "confdefs.h"
+
+#ifndef _XOPEN_SOURCE_EXTENDED
+#define _XOPEN_SOURCE_EXTENDED
+#endif
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+void *foo = &(${name}['k']); (void)foo
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:20008: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:20011: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:20014: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:20017: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_curses_wacs_map=$name
+	 break
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+	done
+fi
+echo "$as_me:20028: result: $cf_cv_curses_wacs_map" >&5
+echo "${ECHO_T}$cf_cv_curses_wacs_map" >&6
+
+test "$cf_cv_curses_wacs_map" != unknown &&
+cat >>confdefs.h <<EOF
+#define CURSES_WACS_ARRAY $cf_cv_curses_wacs_map
+EOF
+
+echo "$as_me:20036: checking for wide alternate character constants" >&5
+echo $ECHO_N "checking for wide alternate character constants... $ECHO_C" >&6
+if test "${cf_cv_curses_wacs_symbols+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cf_cv_curses_wacs_symbols=no
+if test "$cf_cv_curses_wacs_map" != unknown
+then
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 20046 "configure"
+#include "confdefs.h"
+
+#ifndef _XOPEN_SOURCE_EXTENDED
+#define _XOPEN_SOURCE_EXTENDED
+#endif
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+cchar_t *foo = WACS_PLUS;
+	 ${cf_cv_curses_wacs_map}['k'] = *WACS_PLUS; (void)foo
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:20063: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:20066: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:20069: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:20072: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_curses_wacs_symbols=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+else
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 20082 "configure"
+#include "confdefs.h"
+
+#ifndef _XOPEN_SOURCE_EXTENDED
+#define _XOPEN_SOURCE_EXTENDED
+#endif
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+cchar_t *foo = WACS_PLUS; (void)foo
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:20098: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:20101: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:20104: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:20107: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_curses_wacs_symbols=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+
+fi
+echo "$as_me:20118: result: $cf_cv_curses_wacs_symbols" >&5
+echo "${ECHO_T}$cf_cv_curses_wacs_symbols" >&6
+
+test "$cf_cv_curses_wacs_symbols" != no &&
+cat >>confdefs.h <<\EOF
+#define CURSES_WACS_SYMBOLS 1
+EOF
+
+fi
+
+echo "$as_me:20128: checking for type attr_t in ${cf_cv_ncurses_header:-curses.h}" >&5
+echo $ECHO_N "checking for type attr_t in ${cf_cv_ncurses_header:-curses.h}... $ECHO_C" >&6
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 20131 "configure"
+#include "confdefs.h"
+
+#ifndef _XOPEN_SOURCE_EXTENDED
+#define _XOPEN_SOURCE_EXTENDED
+#endif
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+
+attr_t foo
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:20149: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:20152: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:20155: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:20158: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_result=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_result=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+echo "$as_me:20167: result: $cf_result" >&5
+echo "${ECHO_T}$cf_result" >&6
+if test "$cf_result" = yes ; then
+
+cf_result=`echo "have_type_attr_t" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+cat >>confdefs.h <<EOF
+#define $cf_result 1
+EOF
+
+else
+
+cat >>confdefs.h <<EOF
+#define attr_t long
+EOF
+
+fi
+
+if test "$cf_enable_widec" = yes; then
+
+# This is needed on Tru64 5.0 to declare mbstate_t
+echo "$as_me:20188: checking if we must include wchar.h to declare mbstate_t" >&5
+echo $ECHO_N "checking if we must include wchar.h to declare mbstate_t... $ECHO_C" >&6
+if test "${cf_cv_mbstate_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 20195 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stdio.h>
+#ifdef HAVE_LIBUTF8_H
+#include <libutf8.h>
+#endif
+int
+main (void)
+{
+mbstate_t state
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:20213: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:20216: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:20219: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:20222: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_mbstate_t=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 20229 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <wchar.h>
+#ifdef HAVE_LIBUTF8_H
+#include <libutf8.h>
+#endif
+int
+main (void)
+{
+mbstate_t value
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:20248: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:20251: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:20254: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:20257: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_mbstate_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_mbstate_t=unknown
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:20269: result: $cf_cv_mbstate_t" >&5
+echo "${ECHO_T}$cf_cv_mbstate_t" >&6
+
+if test "$cf_cv_mbstate_t" = yes ; then
+
+cat >>confdefs.h <<\EOF
+#define NEED_WCHAR_H 1
+EOF
+
+	NEED_WCHAR_H=1
+fi
+
+# if we do not find mbstate_t in either place, use substitution to provide a fallback.
+if test "$cf_cv_mbstate_t" = unknown ; then
+	NCURSES_MBSTATE_T=1
+fi
+
+# if we find mbstate_t in either place, use substitution to provide a fallback.
+if test "$cf_cv_mbstate_t" != unknown ; then
+	NCURSES_OK_MBSTATE_T=1
+fi
+
+# This is needed on Tru64 5.0 to declare wchar_t
+echo "$as_me:20292: checking if we must include wchar.h to declare wchar_t" >&5
+echo $ECHO_N "checking if we must include wchar.h to declare wchar_t... $ECHO_C" >&6
+if test "${cf_cv_wchar_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 20299 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stdio.h>
+#ifdef HAVE_LIBUTF8_H
+#include <libutf8.h>
+#endif
+int
+main (void)
+{
+wchar_t state
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:20317: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:20320: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:20323: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:20326: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_wchar_t=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 20333 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <wchar.h>
+#ifdef HAVE_LIBUTF8_H
+#include <libutf8.h>
+#endif
+int
+main (void)
+{
+wchar_t value
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:20352: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:20355: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:20358: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:20361: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_wchar_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_wchar_t=unknown
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:20373: result: $cf_cv_wchar_t" >&5
+echo "${ECHO_T}$cf_cv_wchar_t" >&6
+
+if test "$cf_cv_wchar_t" = yes ; then
+
+cat >>confdefs.h <<\EOF
+#define NEED_WCHAR_H 1
+EOF
+
+	NEED_WCHAR_H=1
+fi
+
+# if we do not find wchar_t in either place, use substitution to provide a fallback.
+if test "$cf_cv_wchar_t" = unknown ; then
+	NCURSES_WCHAR_T=1
+fi
+
+# if we find wchar_t in either place, use substitution to provide a fallback.
+if test "$cf_cv_wchar_t" != unknown ; then
+	NCURSES_OK_WCHAR_T=1
+fi
+
+# This is needed on Tru64 5.0 to declare wint_t
+echo "$as_me:20396: checking if we must include wchar.h to declare wint_t" >&5
+echo $ECHO_N "checking if we must include wchar.h to declare wint_t... $ECHO_C" >&6
+if test "${cf_cv_wint_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 20403 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stdio.h>
+#ifdef HAVE_LIBUTF8_H
+#include <libutf8.h>
+#endif
+int
+main (void)
+{
+wint_t state
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:20421: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:20424: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:20427: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:20430: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_wint_t=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 20437 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <wchar.h>
+#ifdef HAVE_LIBUTF8_H
+#include <libutf8.h>
+#endif
+int
+main (void)
+{
+wint_t value
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:20456: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:20459: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:20462: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:20465: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_cv_wint_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_cv_wint_t=unknown
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+echo "$as_me:20477: result: $cf_cv_wint_t" >&5
+echo "${ECHO_T}$cf_cv_wint_t" >&6
+
+if test "$cf_cv_wint_t" = yes ; then
+
+cat >>confdefs.h <<\EOF
+#define NEED_WCHAR_H 1
+EOF
+
+	NEED_WCHAR_H=1
+fi
+
+# if we do not find wint_t in either place, use substitution to provide a fallback.
+if test "$cf_cv_wint_t" = unknown ; then
+	NCURSES_WINT_T=1
+fi
+
+# if we find wint_t in either place, use substitution to provide a fallback.
+if test "$cf_cv_wint_t" != unknown ; then
+	NCURSES_OK_WINT_T=1
+fi
+
+	if test "$NCURSES_OK_MBSTATE_T" = 0 ; then
+
+echo "$as_me:20501: checking for type mbstate_t in ${cf_cv_ncurses_header:-curses.h}" >&5
+echo $ECHO_N "checking for type mbstate_t in ${cf_cv_ncurses_header:-curses.h}... $ECHO_C" >&6
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 20504 "configure"
+#include "confdefs.h"
+
+#ifndef _XOPEN_SOURCE_EXTENDED
+#define _XOPEN_SOURCE_EXTENDED
+#endif
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+
+mbstate_t foo
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:20522: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:20525: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:20528: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:20531: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_result=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_result=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+echo "$as_me:20540: result: $cf_result" >&5
+echo "${ECHO_T}$cf_result" >&6
+if test "$cf_result" = yes ; then
+
+cf_result=`echo "have_type_mbstate_t" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+cat >>confdefs.h <<EOF
+#define $cf_result 1
+EOF
+
+else
+
+cat >>confdefs.h <<EOF
+#define mbstate_t long
+EOF
+
+fi
+
+	fi
+
+	if test "$NCURSES_OK_WCHAR_T" = 0 ; then
+
+echo "$as_me:20562: checking for type wchar_t in ${cf_cv_ncurses_header:-curses.h}" >&5
+echo $ECHO_N "checking for type wchar_t in ${cf_cv_ncurses_header:-curses.h}... $ECHO_C" >&6
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 20565 "configure"
+#include "confdefs.h"
+
+#ifndef _XOPEN_SOURCE_EXTENDED
+#define _XOPEN_SOURCE_EXTENDED
+#endif
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+
+wchar_t foo
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:20583: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:20586: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:20589: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:20592: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_result=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_result=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+echo "$as_me:20601: result: $cf_result" >&5
+echo "${ECHO_T}$cf_result" >&6
+if test "$cf_result" = yes ; then
+
+cf_result=`echo "have_type_wchar_t" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+cat >>confdefs.h <<EOF
+#define $cf_result 1
+EOF
+
+else
+
+cat >>confdefs.h <<EOF
+#define wchar_t long
+EOF
+
+fi
+
+	fi
+
+	if test "$NCURSES_OK_WINT_T" = 0 ; then
+
+echo "$as_me:20623: checking for type wint_t in ${cf_cv_ncurses_header:-curses.h}" >&5
+echo $ECHO_N "checking for type wint_t in ${cf_cv_ncurses_header:-curses.h}... $ECHO_C" >&6
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 20626 "configure"
+#include "confdefs.h"
+
+#ifndef _XOPEN_SOURCE_EXTENDED
+#define _XOPEN_SOURCE_EXTENDED
+#endif
+#include <${cf_cv_ncurses_header:-curses.h}>
+int
+main (void)
+{
+
+wint_t foo
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:20644: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:20647: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:20650: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:20653: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_result=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_result=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+echo "$as_me:20662: result: $cf_result" >&5
+echo "${ECHO_T}$cf_result" >&6
+if test "$cf_result" = yes ; then
+
+cf_result=`echo "have_type_wint_t" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+cat >>confdefs.h <<EOF
+#define $cf_result 1
+EOF
+
+else
+
+cat >>confdefs.h <<EOF
+#define wint_t long
+EOF
+
+fi
+
+	fi
+fi
+
+for cf_data in \
+TABSIZE \
+curscr \
+ospeed \
+boolnames \
+boolfnames \
+ttytype
+do
+echo "$as_me:20691: checking for data $cf_data declaration in ${cf_cv_ncurses_header:-curses.h}" >&5
+echo $ECHO_N "checking for data $cf_data declaration in ${cf_cv_ncurses_header:-curses.h}... $ECHO_C" >&6
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 20695 "configure"
+#include "confdefs.h"
+
+#ifdef HAVE_XCURSES
+#include <xcurses.h>
+char * XCursesProgramName = "test";
+#else
+#include <${cf_cv_ncurses_header:-curses.h}>
+#if defined(NCURSES_VERSION) && defined(HAVE_NCURSESW_TERM_H)
+#include <ncursesw/term.h>
+#elif defined(NCURSES_VERSION) && defined(HAVE_NCURSES_TERM_H)
+#include <ncurses/term.h>
+#elif defined(HAVE_TERM_H)
+#include <term.h>
+#endif
+#endif
+
+int
+main (void)
+{
+
+#if defined($cf_data) && ((defined(NCURSES_WRAPPED_VAR) && (NCURSES_VERSION_PATCH < 20200208)) || defined(NCURSES_BROKEN_LINKER) || defined(NCURSES_REENTRANT))
+	const void *foo = (const void *)($cf_data);
+#else
+	const void *foo = &($cf_data);
+#endif
+	fprintf(stderr, "testing linkage of $cf_data:%p\\n", (const void *)foo);
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:20728: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:20731: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:20734: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:20737: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_result=yes
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_result=no
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+echo "$as_me:20747: result: $cf_result" >&5
+echo "${ECHO_T}$cf_result" >&6
+
+if test "$cf_result" = yes ; then
+
+cf_result=`echo "have_curses_data_$cf_data" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+	cat >>confdefs.h <<EOF
+#define $cf_result 1
+EOF
+
+else
+	echo "$as_me:20759: checking for data $cf_data in library" >&5
+echo $ECHO_N "checking for data $cf_data in library... $ECHO_C" >&6
+	# BSD linkers insist on making weak linkage, but resolve at runtime.
+	if test "$cross_compiling" = yes; then
+
+	# cross-compiling
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 20766 "configure"
+#include "confdefs.h"
+
+#ifdef HAVE_XCURSES
+#include <xcurses.h>
+char * XCursesProgramName = "test";
+#else
+#include <${cf_cv_ncurses_header:-curses.h}>
+#if defined(NCURSES_VERSION) && defined(HAVE_NCURSESW_TERM_H)
+#include <ncursesw/term.h>
+#elif defined(NCURSES_VERSION) && defined(HAVE_NCURSES_TERM_H)
+#include <ncurses/term.h>
+#elif defined(HAVE_TERM_H)
+#include <term.h>
+#endif
+#endif
+
+extern char $cf_data;
+int
+main (void)
+{
+
+	do {
+
+#if defined($cf_data) && ((defined(NCURSES_WRAPPED_VAR) && (NCURSES_VERSION_PATCH < 20200208)) || defined(NCURSES_BROKEN_LINKER) || defined(NCURSES_REENTRANT))
+	const void *foo = (const void *)($cf_data);
+#else
+	const void *foo = &($cf_data);
+#endif
+	fprintf(stderr, "testing linkage of $cf_data:%p\\n", (const void *)foo);
+
+		${cf_cv_main_return:-return}(foo == 0);
+	} while (0)
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:20805: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:20808: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:20811: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:20814: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_result=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_result=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 20826 "configure"
+#include "confdefs.h"
+
+#ifdef HAVE_XCURSES
+#include <xcurses.h>
+char * XCursesProgramName = "test";
+#else
+#include <${cf_cv_ncurses_header:-curses.h}>
+#if defined(NCURSES_VERSION) && defined(HAVE_NCURSESW_TERM_H)
+#include <ncursesw/term.h>
+#elif defined(NCURSES_VERSION) && defined(HAVE_NCURSES_TERM_H)
+#include <ncurses/term.h>
+#elif defined(HAVE_TERM_H)
+#include <term.h>
+#endif
+#endif
+
+extern char $cf_data;
+int main(void)
+{
+
+#if defined($cf_data) && ((defined(NCURSES_WRAPPED_VAR) && (NCURSES_VERSION_PATCH < 20200208)) || defined(NCURSES_BROKEN_LINKER) || defined(NCURSES_REENTRANT))
+	const void *foo = (const void *)($cf_data);
+#else
+	const void *foo = &($cf_data);
+#endif
+	fprintf(stderr, "testing linkage of $cf_data:%p\\n", (const void *)foo);
+
+	${cf_cv_main_return:-return}(foo == 0);
+}
+_ACEOF
+rm -f "conftest$ac_exeext"
+if { (eval echo "$as_me:20858: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:20861: \$? = $ac_status" >&5
+  (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"'
+  { (eval echo "$as_me:20863: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:20866: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_result=yes
+
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_result=no
+fi
+rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext"
+fi
+	echo "$as_me:20878: result: $cf_result" >&5
+echo "${ECHO_T}$cf_result" >&6
+	if test "$cf_result" = yes ; then
+
+cf_result=`echo "decl_curses_data_$cf_data" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+		cat >>confdefs.h <<EOF
+#define $cf_result 1
+EOF
+
+		# do not exit loop here, since we prefer system's declarations
+	fi
+fi
+done
+
+if test -n "$with_screen" && test "x$with_screen" = "xpdcurses"
+then
+	echo "$as_me:20895: checking for X" >&5
+echo $ECHO_N "checking for X... $ECHO_C" >&6
+
+# Check whether --with-x or --without-x was given.
+if test "${with_x+set}" = set; then
+  withval="$with_x"
+
+fi;
+# $have_x is `yes', `no', `disabled', or empty when we do not yet know.
+if test "x$with_x" = xno; then
+  # The user explicitly disabled X.
+  have_x=disabled
+else
+  if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then
+    # Both variables are already set.
+    have_x=yes
+  else
+    if test "${ac_cv_have_x+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  # One or both of the vars are not set, and there is no cached value.
+ac_x_includes=no ac_x_libraries=no
+rm -fr conftest.dir
+if mkdir conftest.dir; then
+  cd conftest.dir
+  # Make sure to not put "make" in the Imakefile rules, since we grep it out.
+  cat >Imakefile <<'EOF'
+acfindx:
+	@echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"'
+EOF
+  if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then
+    # GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+    eval "`${MAKE-make} acfindx 2>/dev/null | grep -v make`"
+    # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR.
+    for ac_extension in a so sl dylib dll; do
+      if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" &&
+         test -f "$ac_im_libdir/libX11.$ac_extension"; then
+        ac_im_usrlibdir=$ac_im_libdir; break
+      fi
+    done
+    # Screen out bogus values from the imake configuration.  They are
+    # bogus both because they are the default anyway, and because
+    # using them would break gcc on systems where it needs fixed includes.
+    case $ac_im_incroot in
+	/usr/include) ;;
+	*) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;;
+    esac
+    case $ac_im_usrlibdir in
+	/usr/lib | /lib) ;;
+	*) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;;
+    esac
+  fi
+  cd ..
+  rm -fr conftest.dir
+fi
+
+# Standard set of common directories for X headers.
+# Check X11 before X11Rn because it is often a symlink to the current release.
+ac_x_header_dirs='
+/usr/X11/include
+/usr/X11R7/include
+/usr/X11R6/include
+/usr/X11R5/include
+/usr/X11R4/include
+
+/opt/local/include
+/opt/X11/include
+
+/usr/include/X11
+/usr/include/X11R7
+/usr/include/X11R6
+/usr/include/X11R5
+/usr/include/X11R4
+
+/usr/local/X11/include
+/usr/local/X11R7/include
+/usr/local/X11R6/include
+/usr/local/X11R5/include
+/usr/local/X11R4/include
+
+/usr/local/include/X11
+/usr/local/include/X11R7
+/usr/local/include/X11R6
+/usr/local/include/X11R5
+/usr/local/include/X11R4
+
+/usr/X386/include
+/usr/x386/include
+/usr/XFree86/include/X11
+
+/usr/include
+/usr/local/include
+/usr/unsupported/include
+/usr/athena/include
+/usr/local/x11r5/include
+/usr/lpp/Xamples/include
+
+/usr/openwin/include
+/usr/openwin/share/include'
+
+if test "$ac_x_includes" = no; then
+  # Guess where to find include files, by looking for Intrinsic.h.
+  # First, try using that file with no special directory specified.
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 20999 "configure"
+#include "confdefs.h"
+#include <X11/Intrinsic.h>
+_ACEOF
+if { (eval echo "$as_me:21003: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:21009: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # We can compile using X headers with no special include directory.
+ac_x_includes=
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  for ac_dir in $ac_x_header_dirs; do
+  if test -r "$ac_dir/X11/Intrinsic.h"; then
+    ac_x_includes=$ac_dir
+    break
+  fi
+done
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi # $ac_x_includes = no
+
+if test "$ac_x_libraries" = no; then
+  # Check for the libraries.
+  # See if we find them without any special options.
+  # Don't add to $LIBS permanently.
+  ac_save_LIBS=$LIBS
+  LIBS="-lXt $LIBS"
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 21042 "configure"
+#include "confdefs.h"
+#include <X11/Intrinsic.h>
+int
+main (void)
+{
+XtMalloc (0)
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:21054: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:21057: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:21060: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:21063: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  LIBS=$ac_save_LIBS
+# We can link X programs with no special library path.
+ac_x_libraries=
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+LIBS=$ac_save_LIBS
+for ac_dir in `echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g`
+do
+  # Don't even attempt the hair of trying to link an X program!
+  for ac_extension in a so sl dylib dll; do
+    if test -r "$ac_dir/libXt.$ac_extension"; then
+      ac_x_libraries=$ac_dir
+      break 2
+    fi
+  done
+done
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi # $ac_x_libraries = no
+
+if test "$ac_x_includes" = no || test "$ac_x_libraries" = no; then
+  # Didn't find X anywhere.  Cache the known absence of X.
+  ac_cv_have_x="have_x=no"
+else
+  # Record where we found X for the cache.
+  ac_cv_have_x="have_x=yes \
+	        ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries"
+fi
+fi
+
+  fi
+  eval "$ac_cv_have_x"
+fi # $with_x != no
+
+if test "$have_x" != yes; then
+  echo "$as_me:21101: result: $have_x" >&5
+echo "${ECHO_T}$have_x" >&6
+  no_x=yes
+else
+  # If each of the values was on the command line, it overrides each guess.
+  test "x$x_includes" = xNONE && x_includes=$ac_x_includes
+  test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries
+  # Update the cache value to reflect the command line values.
+  ac_cv_have_x="have_x=yes \
+		ac_x_includes=$x_includes ac_x_libraries=$x_libraries"
+  echo "$as_me:21111: result: libraries $x_libraries, headers $x_includes" >&5
+echo "${ECHO_T}libraries $x_libraries, headers $x_includes" >&6
+fi
+
+	if test "$no_x" = yes; then
+  # Not all programs may use this symbol, but it does not hurt to define it.
+
+cat >>confdefs.h <<\EOF
+#define X_DISPLAY_MISSING 1
+EOF
+
+  X_CFLAGS=
+  X_PRE_LIBS=
+  X_LIBS=
+  X_EXTRA_LIBS=
+else
+  if test -n "$x_includes"; then
+    X_CFLAGS="$X_CFLAGS -I$x_includes"
+  fi
+
+  # It would also be nice to do this for all -L options, not just this one.
+  if test -n "$x_libraries"; then
+    X_LIBS="$X_LIBS -L$x_libraries"
+    # For Solaris; some versions of Sun CC require a space after -R and
+    # others require no space.  Words are not sufficient . . . .
+    case `(uname -sr) 2>/dev/null` in
+    "SunOS 5"*)
+      echo "$as_me:21138: checking whether -R must be followed by a space" >&5
+echo $ECHO_N "checking whether -R must be followed by a space... $ECHO_C" >&6
+      ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries"
+      cat >"conftest.$ac_ext" <<_ACEOF
+#line 21142 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:21154: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:21157: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:21160: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:21163: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_R_nospace=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_R_nospace=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+      if test $ac_R_nospace = yes; then
+	echo "$as_me:21173: result: no" >&5
+echo "${ECHO_T}no" >&6
+	X_LIBS="$X_LIBS -R$x_libraries"
+      else
+	LIBS="$ac_xsave_LIBS -R $x_libraries"
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 21179 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:21191: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:21194: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:21197: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:21200: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_R_space=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_R_space=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+	if test $ac_R_space = yes; then
+	  echo "$as_me:21210: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+	  X_LIBS="$X_LIBS -R $x_libraries"
+	else
+	  echo "$as_me:21214: result: neither works" >&5
+echo "${ECHO_T}neither works" >&6
+	fi
+      fi
+      LIBS=$ac_xsave_LIBS
+    esac
+  fi
+
+  # Check for system-dependent libraries X programs must link with.
+  # Do this before checking for the system-independent R6 libraries
+  # (-lICE), since we may need -lsocket or whatever for X linking.
+
+  if test "$ISC" = yes; then
+    X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet"
+  else
+    # Martyn Johnson says this is needed for Ultrix, if the X
+    # libraries were built with DECnet support.  And Karl Berry says
+    # the Alpha needs dnet_stub (dnet does not exist).
+    ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11"
+    cat >"conftest.$ac_ext" <<_ACEOF
+#line 21234 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char XOpenDisplay ();
+int
+main (void)
+{
+XOpenDisplay ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:21253: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:21256: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:21259: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:21262: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+echo "$as_me:21268: checking for dnet_ntoa in -ldnet" >&5
+echo $ECHO_N "checking for dnet_ntoa in -ldnet... $ECHO_C" >&6
+if test "${ac_cv_lib_dnet_dnet_ntoa+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldnet  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 21276 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char dnet_ntoa ();
+int
+main (void)
+{
+dnet_ntoa ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:21295: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:21298: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:21301: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:21304: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_dnet_dnet_ntoa=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_dnet_dnet_ntoa=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:21315: result: $ac_cv_lib_dnet_dnet_ntoa" >&5
+echo "${ECHO_T}$ac_cv_lib_dnet_dnet_ntoa" >&6
+if test "$ac_cv_lib_dnet_dnet_ntoa" = yes; then
+  X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet"
+fi
+
+    if test $ac_cv_lib_dnet_dnet_ntoa = no; then
+      echo "$as_me:21322: checking for dnet_ntoa in -ldnet_stub" >&5
+echo $ECHO_N "checking for dnet_ntoa in -ldnet_stub... $ECHO_C" >&6
+if test "${ac_cv_lib_dnet_stub_dnet_ntoa+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldnet_stub  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 21330 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char dnet_ntoa ();
+int
+main (void)
+{
+dnet_ntoa ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:21349: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:21352: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:21355: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:21358: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_dnet_stub_dnet_ntoa=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_dnet_stub_dnet_ntoa=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:21369: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5
+echo "${ECHO_T}$ac_cv_lib_dnet_stub_dnet_ntoa" >&6
+if test "$ac_cv_lib_dnet_stub_dnet_ntoa" = yes; then
+  X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub"
+fi
+
+    fi
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+    LIBS="$ac_xsave_LIBS"
+
+    # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT,
+    # to get the SysV transport functions.
+    # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4)
+    # needs -lnsl.
+    # The nsl library prevents programs from opening the X display
+    # on Irix 5.2, according to T.E. Dickey.
+    # The functions gethostbyname, getservbyname, and inet_addr are
+    # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking.
+    echo "$as_me:21388: checking for gethostbyname" >&5
+echo $ECHO_N "checking for gethostbyname... $ECHO_C" >&6
+if test "${ac_cv_func_gethostbyname+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 21394 "configure"
+#include "confdefs.h"
+#define gethostbyname autoconf_temporary
+#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
+#undef gethostbyname
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char gethostbyname (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_gethostbyname) || defined (__stub___gethostbyname)
+#error found stub for gethostbyname
+#endif
+
+	return gethostbyname ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:21425: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:21428: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:21431: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:21434: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_func_gethostbyname=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_gethostbyname=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:21444: result: $ac_cv_func_gethostbyname" >&5
+echo "${ECHO_T}$ac_cv_func_gethostbyname" >&6
+
+    if test $ac_cv_func_gethostbyname = no; then
+      echo "$as_me:21448: checking for gethostbyname in -lnsl" >&5
+echo $ECHO_N "checking for gethostbyname in -lnsl... $ECHO_C" >&6
+if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lnsl  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 21456 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char gethostbyname ();
+int
+main (void)
+{
+gethostbyname ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:21475: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:21478: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:21481: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:21484: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_nsl_gethostbyname=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_nsl_gethostbyname=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:21495: result: $ac_cv_lib_nsl_gethostbyname" >&5
+echo "${ECHO_T}$ac_cv_lib_nsl_gethostbyname" >&6
+if test "$ac_cv_lib_nsl_gethostbyname" = yes; then
+  X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl"
+fi
+
+      if test $ac_cv_lib_nsl_gethostbyname = no; then
+        echo "$as_me:21502: checking for gethostbyname in -lbsd" >&5
+echo $ECHO_N "checking for gethostbyname in -lbsd... $ECHO_C" >&6
+if test "${ac_cv_lib_bsd_gethostbyname+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lbsd  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 21510 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char gethostbyname ();
+int
+main (void)
+{
+gethostbyname ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:21529: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:21532: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:21535: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:21538: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_bsd_gethostbyname=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_bsd_gethostbyname=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:21549: result: $ac_cv_lib_bsd_gethostbyname" >&5
+echo "${ECHO_T}$ac_cv_lib_bsd_gethostbyname" >&6
+if test "$ac_cv_lib_bsd_gethostbyname" = yes; then
+  X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd"
+fi
+
+      fi
+    fi
+
+    # lieder@skyler.mavd.honeywell.com says without -lsocket,
+    # socket/setsockopt and other routines are undefined under SCO ODT
+    # 2.0.  But -lsocket is broken on IRIX 5.2 (and is not necessary
+    # on later versions), says Simon Leinen: it contains gethostby*
+    # variants that don't use the nameserver (or something).  -lsocket
+    # must be given before -lnsl if both are needed.  We assume that
+    # if connect needs -lnsl, so does gethostbyname.
+    echo "$as_me:21565: checking for connect" >&5
+echo $ECHO_N "checking for connect... $ECHO_C" >&6
+if test "${ac_cv_func_connect+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 21571 "configure"
+#include "confdefs.h"
+#define connect autoconf_temporary
+#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
+#undef connect
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char connect (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_connect) || defined (__stub___connect)
+#error found stub for connect
+#endif
+
+	return connect ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:21602: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:21605: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:21608: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:21611: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_func_connect=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_connect=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:21621: result: $ac_cv_func_connect" >&5
+echo "${ECHO_T}$ac_cv_func_connect" >&6
+
+    if test $ac_cv_func_connect = no; then
+      echo "$as_me:21625: checking for connect in -lsocket" >&5
+echo $ECHO_N "checking for connect in -lsocket... $ECHO_C" >&6
+if test "${ac_cv_lib_socket_connect+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsocket $X_EXTRA_LIBS $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 21633 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char connect ();
+int
+main (void)
+{
+connect ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:21652: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:21655: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:21658: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:21661: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_socket_connect=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_socket_connect=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:21672: result: $ac_cv_lib_socket_connect" >&5
+echo "${ECHO_T}$ac_cv_lib_socket_connect" >&6
+if test "$ac_cv_lib_socket_connect" = yes; then
+  X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS"
+fi
+
+    fi
+
+    # Guillermo Gomez says -lposix is necessary on A/UX.
+    echo "$as_me:21681: checking for remove" >&5
+echo $ECHO_N "checking for remove... $ECHO_C" >&6
+if test "${ac_cv_func_remove+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 21687 "configure"
+#include "confdefs.h"
+#define remove autoconf_temporary
+#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
+#undef remove
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char remove (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_remove) || defined (__stub___remove)
+#error found stub for remove
+#endif
+
+	return remove ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:21718: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:21721: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:21724: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:21727: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_func_remove=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_remove=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:21737: result: $ac_cv_func_remove" >&5
+echo "${ECHO_T}$ac_cv_func_remove" >&6
+
+    if test $ac_cv_func_remove = no; then
+      echo "$as_me:21741: checking for remove in -lposix" >&5
+echo $ECHO_N "checking for remove in -lposix... $ECHO_C" >&6
+if test "${ac_cv_lib_posix_remove+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lposix  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 21749 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char remove ();
+int
+main (void)
+{
+remove ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:21768: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:21771: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:21774: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:21777: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_posix_remove=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_posix_remove=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:21788: result: $ac_cv_lib_posix_remove" >&5
+echo "${ECHO_T}$ac_cv_lib_posix_remove" >&6
+if test "$ac_cv_lib_posix_remove" = yes; then
+  X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix"
+fi
+
+    fi
+
+    # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay.
+    echo "$as_me:21797: checking for shmat" >&5
+echo $ECHO_N "checking for shmat... $ECHO_C" >&6
+if test "${ac_cv_func_shmat+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 21803 "configure"
+#include "confdefs.h"
+#define shmat autoconf_temporary
+#include <limits.h>	/* least-intrusive standard header which defines gcc2 __stub macros */
+#undef shmat
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char shmat (void);
+
+int
+main (void)
+{
+
+/* The GNU C library defines stubs for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_shmat) || defined (__stub___shmat)
+#error found stub for shmat
+#endif
+
+	return shmat ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:21834: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:21837: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:21840: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:21843: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_func_shmat=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_func_shmat=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+fi
+echo "$as_me:21853: result: $ac_cv_func_shmat" >&5
+echo "${ECHO_T}$ac_cv_func_shmat" >&6
+
+    if test $ac_cv_func_shmat = no; then
+      echo "$as_me:21857: checking for shmat in -lipc" >&5
+echo $ECHO_N "checking for shmat in -lipc... $ECHO_C" >&6
+if test "${ac_cv_lib_ipc_shmat+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lipc  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 21865 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char shmat ();
+int
+main (void)
+{
+shmat ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:21884: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:21887: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:21890: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:21893: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_ipc_shmat=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_ipc_shmat=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:21904: result: $ac_cv_lib_ipc_shmat" >&5
+echo "${ECHO_T}$ac_cv_lib_ipc_shmat" >&6
+if test "$ac_cv_lib_ipc_shmat" = yes; then
+  X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc"
+fi
+
+    fi
+  fi
+
+  # Check for libraries that X11R6 Xt/Xaw programs need.
+  ac_save_LDFLAGS=$LDFLAGS
+  test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries"
+  # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to
+  # check for ICE first), but we must link in the order -lSM -lICE or
+  # we get undefined symbols.  So assume we have SM if we have ICE.
+  # These have to be linked with before -lX11, unlike the other
+  # libraries we check for below, so use a different variable.
+  # John Interrante, Karl Berry
+  echo "$as_me:21922: checking for IceConnectionNumber in -lICE" >&5
+echo $ECHO_N "checking for IceConnectionNumber in -lICE... $ECHO_C" >&6
+if test "${ac_cv_lib_ICE_IceConnectionNumber+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lICE $X_EXTRA_LIBS $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 21930 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char IceConnectionNumber ();
+int
+main (void)
+{
+IceConnectionNumber ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:21949: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:21952: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:21955: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:21958: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_ICE_IceConnectionNumber=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_ICE_IceConnectionNumber=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:21969: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5
+echo "${ECHO_T}$ac_cv_lib_ICE_IceConnectionNumber" >&6
+if test "$ac_cv_lib_ICE_IceConnectionNumber" = yes; then
+  X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE"
+fi
+
+  LDFLAGS=$ac_save_LDFLAGS
+
+fi
+
+fi
+
+if test "$GCC" = yes || test "$GXX" = yes
+then
+
+if test "$GCC" = yes || test "$GXX" = yes
+then
+	case $CFLAGS in
+	(*-Werror=*)
+		cf_temp_flags=
+		for cf_temp_scan in $CFLAGS
+		do
+			case "x$cf_temp_scan" in
+			(x-Werror=format*)
+
+	test -n "$cf_temp_flags" && cf_temp_flags="$cf_temp_flags "
+	cf_temp_flags="${cf_temp_flags}$cf_temp_scan"
+
+				;;
+			(x-Werror=*)
+
+	test -n "$EXTRA_CFLAGS" && EXTRA_CFLAGS="$EXTRA_CFLAGS "
+	EXTRA_CFLAGS="${EXTRA_CFLAGS}$cf_temp_scan"
+
+				;;
+			(*)
+
+	test -n "$cf_temp_flags" && cf_temp_flags="$cf_temp_flags "
+	cf_temp_flags="${cf_temp_flags}$cf_temp_scan"
+
+				;;
+			esac
+		done
+		if test "x$CFLAGS" != "x$cf_temp_flags"
+		then
+			test -n "$verbose" && echo "	repairing CFLAGS: $CFLAGS" 1>&6
+
+echo "${as_me:-configure}:22016: testing repairing CFLAGS: $CFLAGS ..." 1>&5
+
+			CFLAGS="$cf_temp_flags"
+			test -n "$verbose" && echo "	... fixed $CFLAGS" 1>&6
+
+echo "${as_me:-configure}:22021: testing ... fixed $CFLAGS ..." 1>&5
+
+			test -n "$verbose" && echo "	... extra $EXTRA_CFLAGS" 1>&6
+
+echo "${as_me:-configure}:22025: testing ... extra $EXTRA_CFLAGS ..." 1>&5
+
+		fi
+		;;
+	esac
+fi
+
+if test "$GCC" = yes || test "$GXX" = yes
+then
+	case $CPPFLAGS in
+	(*-Werror=*)
+		cf_temp_flags=
+		for cf_temp_scan in $CPPFLAGS
+		do
+			case "x$cf_temp_scan" in
+			(x-Werror=format*)
+
+	test -n "$cf_temp_flags" && cf_temp_flags="$cf_temp_flags "
+	cf_temp_flags="${cf_temp_flags}$cf_temp_scan"
+
+				;;
+			(x-Werror=*)
+
+	test -n "$EXTRA_CFLAGS" && EXTRA_CFLAGS="$EXTRA_CFLAGS "
+	EXTRA_CFLAGS="${EXTRA_CFLAGS}$cf_temp_scan"
+
+				;;
+			(*)
+
+	test -n "$cf_temp_flags" && cf_temp_flags="$cf_temp_flags "
+	cf_temp_flags="${cf_temp_flags}$cf_temp_scan"
+
+				;;
+			esac
+		done
+		if test "x$CPPFLAGS" != "x$cf_temp_flags"
+		then
+			test -n "$verbose" && echo "	repairing CPPFLAGS: $CPPFLAGS" 1>&6
+
+echo "${as_me:-configure}:22064: testing repairing CPPFLAGS: $CPPFLAGS ..." 1>&5
+
+			CPPFLAGS="$cf_temp_flags"
+			test -n "$verbose" && echo "	... fixed $CPPFLAGS" 1>&6
+
+echo "${as_me:-configure}:22069: testing ... fixed $CPPFLAGS ..." 1>&5
+
+			test -n "$verbose" && echo "	... extra $EXTRA_CFLAGS" 1>&6
+
+echo "${as_me:-configure}:22073: testing ... extra $EXTRA_CFLAGS ..." 1>&5
+
+		fi
+		;;
+	esac
+fi
+
+if test "$GCC" = yes || test "$GXX" = yes
+then
+	case $LDFLAGS in
+	(*-Werror=*)
+		cf_temp_flags=
+		for cf_temp_scan in $LDFLAGS
+		do
+			case "x$cf_temp_scan" in
+			(x-Werror=format*)
+
+	test -n "$cf_temp_flags" && cf_temp_flags="$cf_temp_flags "
+	cf_temp_flags="${cf_temp_flags}$cf_temp_scan"
+
+				;;
+			(x-Werror=*)
+
+	test -n "$EXTRA_CFLAGS" && EXTRA_CFLAGS="$EXTRA_CFLAGS "
+	EXTRA_CFLAGS="${EXTRA_CFLAGS}$cf_temp_scan"
+
+				;;
+			(*)
+
+	test -n "$cf_temp_flags" && cf_temp_flags="$cf_temp_flags "
+	cf_temp_flags="${cf_temp_flags}$cf_temp_scan"
+
+				;;
+			esac
+		done
+		if test "x$LDFLAGS" != "x$cf_temp_flags"
+		then
+			test -n "$verbose" && echo "	repairing LDFLAGS: $LDFLAGS" 1>&6
+
+echo "${as_me:-configure}:22112: testing repairing LDFLAGS: $LDFLAGS ..." 1>&5
+
+			LDFLAGS="$cf_temp_flags"
+			test -n "$verbose" && echo "	... fixed $LDFLAGS" 1>&6
+
+echo "${as_me:-configure}:22117: testing ... fixed $LDFLAGS ..." 1>&5
+
+			test -n "$verbose" && echo "	... extra $EXTRA_CFLAGS" 1>&6
+
+echo "${as_me:-configure}:22121: testing ... extra $EXTRA_CFLAGS ..." 1>&5
+
+		fi
+		;;
+	esac
+fi
+
+echo "$as_me:22128: checking if you want to turn on gcc warnings" >&5
+echo $ECHO_N "checking if you want to turn on gcc warnings... $ECHO_C" >&6
+
+# Check whether --enable-warnings or --disable-warnings was given.
+if test "${enable_warnings+set}" = set; then
+  enableval="$enable_warnings"
+  test "$enableval" != yes && enableval=no
+	if test "$enableval" != "no" ; then
+    enable_warnings=yes
+	else
+		enable_warnings=no
+	fi
+else
+  enableval=no
+	enable_warnings=no
+
+fi;
+echo "$as_me:22145: result: $enable_warnings" >&5
+echo "${ECHO_T}$enable_warnings" >&6
+if test "$enable_warnings" = "yes"
+then
+
+if test "$GCC" = yes || test "$GXX" = yes
+then
+cat > conftest.i <<EOF
+#ifndef GCC_PRINTF
+#define GCC_PRINTF 0
+#endif
+#ifndef GCC_SCANF
+#define GCC_SCANF 0
+#endif
+#ifndef GCC_NORETURN
+#define GCC_NORETURN /* nothing */
+#endif
+#ifndef GCC_UNUSED
+#define GCC_UNUSED /* nothing */
+#endif
+EOF
+if test "$GCC" = yes
+then
+	{ echo "$as_me:22168: checking for $CC __attribute__ directives..." >&5
+echo "$as_me: checking for $CC __attribute__ directives..." >&6;}
+cat > "conftest.$ac_ext" <<EOF
+#line 22171 "${as_me:-configure}"
+#include "confdefs.h"
+#include "conftest.h"
+#include "conftest.i"
+#if	GCC_PRINTF
+#define GCC_PRINTFLIKE(fmt,var) __attribute__((format(printf,fmt,var)))
+#else
+#define GCC_PRINTFLIKE(fmt,var) /*nothing*/
+#endif
+#if	GCC_SCANF
+#define GCC_SCANFLIKE(fmt,var)  __attribute__((format(scanf,fmt,var)))
+#else
+#define GCC_SCANFLIKE(fmt,var)  /*nothing*/
+#endif
+extern void wow(char *,...) GCC_SCANFLIKE(1,2);
+extern GCC_NORETURN void oops(char *,...) GCC_PRINTFLIKE(1,2);
+extern GCC_NORETURN void foo(void);
+int main(int argc GCC_UNUSED, char *argv[] GCC_UNUSED) { (void)argc; (void)argv; return 0; }
+EOF
+	cf_printf_attribute=no
+	cf_scanf_attribute=no
+	for cf_attribute in scanf printf unused noreturn
+	do
+
+cf_ATTRIBUTE=`echo "$cf_attribute" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
+
+		cf_directive="__attribute__(($cf_attribute))"
+		echo "checking for $CC $cf_directive" 1>&5
+
+		case "$cf_attribute" in
+		(printf)
+			cf_printf_attribute=yes
+			cat >conftest.h <<EOF
+#define GCC_$cf_ATTRIBUTE 1
+EOF
+			;;
+		(scanf)
+			cf_scanf_attribute=yes
+			cat >conftest.h <<EOF
+#define GCC_$cf_ATTRIBUTE 1
+EOF
+			;;
+		(*)
+			cat >conftest.h <<EOF
+#define GCC_$cf_ATTRIBUTE $cf_directive
+EOF
+			;;
+		esac
+
+		if { (eval echo "$as_me:22220: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:22223: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; then
+			test -n "$verbose" && echo "$as_me:22225: result: ... $cf_attribute" >&5
+echo "${ECHO_T}... $cf_attribute" >&6
+			cat conftest.h >>confdefs.h
+			case "$cf_attribute" in
+			(noreturn)
+
+cat >>confdefs.h <<EOF
+#define GCC_NORETURN $cf_directive
+EOF
+
+				;;
+			(printf)
+				cf_value='/* nothing */'
+				if test "$cf_printf_attribute" != no ; then
+					cf_value='__attribute__((format(printf,fmt,var)))'
+
+cat >>confdefs.h <<\EOF
+#define GCC_PRINTF 1
+EOF
+
+				fi
+
+cat >>confdefs.h <<EOF
+#define GCC_PRINTFLIKE(fmt,var) $cf_value
+EOF
+
+				;;
+			(scanf)
+				cf_value='/* nothing */'
+				if test "$cf_scanf_attribute" != no ; then
+					cf_value='__attribute__((format(scanf,fmt,var)))'
+
+cat >>confdefs.h <<\EOF
+#define GCC_SCANF 1
+EOF
+
+				fi
+
+cat >>confdefs.h <<EOF
+#define GCC_SCANFLIKE(fmt,var) $cf_value
+EOF
+
+				;;
+			(unused)
+
+cat >>confdefs.h <<EOF
+#define GCC_UNUSED $cf_directive
+EOF
+
+				;;
+			esac
+		fi
+	done
+else
+	${FGREP-fgrep} define conftest.i >>confdefs.h
+fi
+rm -rf ./conftest*
+fi
+
+if test "x$have_x" = xyes; then
+
+cf_save_LIBS_CF_CONST_X_STRING="$LIBS"
+cf_save_CFLAGS_CF_CONST_X_STRING="$CFLAGS"
+cf_save_CPPFLAGS_CF_CONST_X_STRING="$CPPFLAGS"
+LIBS="$LIBS ${X_PRE_LIBS} ${X_LIBS} ${X_EXTRA_LIBS}"
+for cf_X_CFLAGS in $X_CFLAGS
+do
+	case "x$cf_X_CFLAGS" in
+	x-[IUD]*)
+		CPPFLAGS="$CPPFLAGS $cf_X_CFLAGS"
+		;;
+	*)
+		CFLAGS="$CFLAGS $cf_X_CFLAGS"
+		;;
+	esac
+done
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 22303 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <X11/Intrinsic.h>
+
+int
+main (void)
+{
+String foo = malloc(1); free((void*)foo)
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:22318: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:22321: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:22324: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:22327: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+echo "$as_me:22330: checking for X11/Xt const-feature" >&5
+echo $ECHO_N "checking for X11/Xt const-feature... $ECHO_C" >&6
+if test "${cf_cv_const_x_string+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+	cat >"conftest.$ac_ext" <<_ACEOF
+#line 22337 "configure"
+#include "confdefs.h"
+
+#define _CONST_X_STRING	/* X11R7.8 (perhaps) */
+#undef  XTSTRINGDEFINES	/* X11R5 and later */
+#include <stdlib.h>
+#include <X11/Intrinsic.h>
+
+int
+main (void)
+{
+String foo = malloc(1); *foo = 0
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext"
+if { (eval echo "$as_me:22354: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:22357: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest.$ac_objext"'
+  { (eval echo "$as_me:22360: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:22363: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+
+			cf_cv_const_x_string=no
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+
+			cf_cv_const_x_string=yes
+
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+
+fi
+echo "$as_me:22378: result: $cf_cv_const_x_string" >&5
+echo "${ECHO_T}$cf_cv_const_x_string" >&6
+
+LIBS="$cf_save_LIBS_CF_CONST_X_STRING"
+CFLAGS="$cf_save_CFLAGS_CF_CONST_X_STRING"
+CPPFLAGS="$cf_save_CPPFLAGS_CF_CONST_X_STRING"
+
+case "$cf_cv_const_x_string" in
+(no)
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-DXTSTRINGDEFINES"
+
+	;;
+(*)
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}-D_CONST_X_STRING"
+
+	;;
+esac
+
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest.$ac_ext"
+ fi
+cat > "conftest.$ac_ext" <<EOF
+#line 22407 "${as_me:-configure}"
+int main(int argc, char *argv[]) { return (argv[argc-1] == 0) ; }
+EOF
+if test "$INTEL_COMPILER" = yes
+then
+# The "-wdXXX" options suppress warnings:
+# remark #1419: external declaration in primary source file
+# remark #1683: explicit conversion of a 64-bit integral type to a smaller integral type (potential portability problem)
+# remark #1684: conversion from pointer to same-sized integral type (potential portability problem)
+# remark #193: zero used for undefined preprocessing identifier
+# remark #593: variable "curs_sb_left_arrow" was set but never used
+# remark #810: conversion from "int" to "Dimension={unsigned short}" may lose significant bits
+# remark #869: parameter "tw" was never referenced
+# remark #981: operands are evaluated in unspecified order
+# warning #279: controlling expression is constant
+
+	{ echo "$as_me:22423: checking for $CC warning options..." >&5
+echo "$as_me: checking for $CC warning options..." >&6;}
+	cf_save_CFLAGS="$CFLAGS"
+	EXTRA_CFLAGS="$EXTRA_CFLAGS -Wall"
+	for cf_opt in \
+		wd1419 \
+		wd1683 \
+		wd1684 \
+		wd193 \
+		wd593 \
+		wd279 \
+		wd810 \
+		wd869 \
+		wd981
+	do
+		CFLAGS="$cf_save_CFLAGS $EXTRA_CFLAGS -$cf_opt"
+		if { (eval echo "$as_me:22439: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:22442: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; then
+			test -n "$verbose" && echo "$as_me:22444: result: ... -$cf_opt" >&5
+echo "${ECHO_T}... -$cf_opt" >&6
+			EXTRA_CFLAGS="$EXTRA_CFLAGS -$cf_opt"
+		fi
+	done
+	CFLAGS="$cf_save_CFLAGS"
+elif test "$GCC" = yes && test "$GCC_VERSION" != "unknown"
+then
+	{ echo "$as_me:22452: checking for $CC warning options..." >&5
+echo "$as_me: checking for $CC warning options..." >&6;}
+	cf_save_CFLAGS="$CFLAGS"
+	cf_warn_CONST=""
+	test "$with_ext_const" = yes && cf_warn_CONST="Wwrite-strings"
+	cf_gcc_warnings="Wignored-qualifiers Wlogical-op Wvarargs"
+	test "x$CLANG_COMPILER" = xyes && cf_gcc_warnings=
+	for cf_opt in W Wall \
+		Wbad-function-cast \
+		Wcast-align \
+		Wcast-qual \
+		Wdeclaration-after-statement \
+		Wextra \
+		Winline \
+		Wmissing-declarations \
+		Wmissing-prototypes \
+		Wnested-externs \
+		Wpointer-arith \
+		Wshadow \
+		Wstrict-prototypes \
+		Wundef Wno-inline $cf_gcc_warnings $cf_warn_CONST Wno-unknown-pragmas
+	do
+		CFLAGS="$cf_save_CFLAGS $EXTRA_CFLAGS -$cf_opt"
+		if { (eval echo "$as_me:22475: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:22478: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; then
+			test -n "$verbose" && echo "$as_me:22480: result: ... -$cf_opt" >&5
+echo "${ECHO_T}... -$cf_opt" >&6
+			case "$cf_opt" in
+			(Winline)
+				case "$GCC_VERSION" in
+				([34].*)
+					test -n "$verbose" && echo "	feature is broken in gcc $GCC_VERSION" 1>&6
+
+echo "${as_me:-configure}:22488: testing feature is broken in gcc $GCC_VERSION ..." 1>&5
+
+					continue;;
+				esac
+				;;
+			(Wpointer-arith)
+				case "$GCC_VERSION" in
+				([12].*)
+					test -n "$verbose" && echo "	feature is broken in gcc $GCC_VERSION" 1>&6
+
+echo "${as_me:-configure}:22498: testing feature is broken in gcc $GCC_VERSION ..." 1>&5
+
+					continue;;
+				esac
+				;;
+			esac
+			EXTRA_CFLAGS="$EXTRA_CFLAGS -$cf_opt"
+		fi
+	done
+	CFLAGS="$cf_save_CFLAGS"
+fi
+rm -rf ./conftest*
+
+fi
+
+fi
+
+echo "$as_me:22515: checking if you want to use dmalloc for testing" >&5
+echo $ECHO_N "checking if you want to use dmalloc for testing... $ECHO_C" >&6
+
+# Check whether --with-dmalloc or --without-dmalloc was given.
+if test "${with_dmalloc+set}" = set; then
+  withval="$with_dmalloc"
+  case "x$withval" in
+	(x|xno) ;;
+	(*)
+		: "${with_cflags:=-g}"
+		: "${enable_leaks:=no}"
+		with_dmalloc=yes
+
+cat >>confdefs.h <<EOF
+#define USE_DMALLOC 1
+EOF
+
+		;;
+	esac
+else
+  with_dmalloc=
+fi;
+echo "$as_me:22537: result: ${with_dmalloc:-no}" >&5
+echo "${ECHO_T}${with_dmalloc:-no}" >&6
+
+case ".$with_cflags" in
+(.*-g*)
+	case .$CFLAGS in
+	(.*-g*)
+		;;
+	(*)
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in -g
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+		;;
+	esac
+	;;
+esac
+
+if test "$with_dmalloc" = yes ; then
+	echo "$as_me:22651: checking for dmalloc.h" >&5
+echo $ECHO_N "checking for dmalloc.h... $ECHO_C" >&6
+if test "${ac_cv_header_dmalloc_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 22657 "configure"
+#include "confdefs.h"
+#include <dmalloc.h>
+_ACEOF
+if { (eval echo "$as_me:22661: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:22667: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_cv_header_dmalloc_h=yes
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  ac_cv_header_dmalloc_h=no
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:22686: result: $ac_cv_header_dmalloc_h" >&5
+echo "${ECHO_T}$ac_cv_header_dmalloc_h" >&6
+if test "$ac_cv_header_dmalloc_h" = yes; then
+
+echo "$as_me:22690: checking for dmalloc_debug in -ldmalloc" >&5
+echo $ECHO_N "checking for dmalloc_debug in -ldmalloc... $ECHO_C" >&6
+if test "${ac_cv_lib_dmalloc_dmalloc_debug+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldmalloc  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 22698 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char dmalloc_debug ();
+int
+main (void)
+{
+dmalloc_debug ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:22717: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:22720: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:22723: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:22726: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_dmalloc_dmalloc_debug=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_dmalloc_dmalloc_debug=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:22737: result: $ac_cv_lib_dmalloc_dmalloc_debug" >&5
+echo "${ECHO_T}$ac_cv_lib_dmalloc_dmalloc_debug" >&6
+if test "$ac_cv_lib_dmalloc_dmalloc_debug" = yes; then
+  cat >>confdefs.h <<EOF
+#define HAVE_LIBDMALLOC 1
+EOF
+
+  LIBS="-ldmalloc $LIBS"
+
+fi
+
+fi
+
+fi
+
+echo "$as_me:22752: checking if you want to use dbmalloc for testing" >&5
+echo $ECHO_N "checking if you want to use dbmalloc for testing... $ECHO_C" >&6
+
+# Check whether --with-dbmalloc or --without-dbmalloc was given.
+if test "${with_dbmalloc+set}" = set; then
+  withval="$with_dbmalloc"
+  case "x$withval" in
+	(x|xno) ;;
+	(*)
+		: "${with_cflags:=-g}"
+		: "${enable_leaks:=no}"
+		with_dbmalloc=yes
+
+cat >>confdefs.h <<EOF
+#define USE_DBMALLOC 1
+EOF
+
+		;;
+	esac
+else
+  with_dbmalloc=
+fi;
+echo "$as_me:22774: result: ${with_dbmalloc:-no}" >&5
+echo "${ECHO_T}${with_dbmalloc:-no}" >&6
+
+case ".$with_cflags" in
+(.*-g*)
+	case .$CFLAGS in
+	(.*-g*)
+		;;
+	(*)
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in -g
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+		;;
+	esac
+	;;
+esac
+
+if test "$with_dbmalloc" = yes ; then
+	echo "$as_me:22888: checking for dbmalloc.h" >&5
+echo $ECHO_N "checking for dbmalloc.h... $ECHO_C" >&6
+if test "${ac_cv_header_dbmalloc_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >"conftest.$ac_ext" <<_ACEOF
+#line 22894 "configure"
+#include "confdefs.h"
+#include <dbmalloc.h>
+_ACEOF
+if { (eval echo "$as_me:22898: \"$ac_cpp "conftest.$ac_ext"\"") >&5
+  (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  $EGREP -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:22904: \$? = $ac_status" >&5
+  (exit "$ac_status"); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_cv_header_dbmalloc_h=yes
+else
+  echo "$as_me: failed program was:" >&5
+  cat "conftest.$ac_ext" >&5
+  ac_cv_header_dbmalloc_h=no
+fi
+rm -f conftest.err "conftest.$ac_ext"
+fi
+echo "$as_me:22923: result: $ac_cv_header_dbmalloc_h" >&5
+echo "${ECHO_T}$ac_cv_header_dbmalloc_h" >&6
+if test "$ac_cv_header_dbmalloc_h" = yes; then
+
+echo "$as_me:22927: checking for debug_malloc in -ldbmalloc" >&5
+echo $ECHO_N "checking for debug_malloc in -ldbmalloc... $ECHO_C" >&6
+if test "${ac_cv_lib_dbmalloc_debug_malloc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldbmalloc  $LIBS"
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 22935 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char debug_malloc ();
+int
+main (void)
+{
+debug_malloc ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:22954: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:22957: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:22960: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:22963: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  ac_cv_lib_dbmalloc_debug_malloc=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+ac_cv_lib_dbmalloc_debug_malloc=no
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:22974: result: $ac_cv_lib_dbmalloc_debug_malloc" >&5
+echo "${ECHO_T}$ac_cv_lib_dbmalloc_debug_malloc" >&6
+if test "$ac_cv_lib_dbmalloc_debug_malloc" = yes; then
+  cat >>confdefs.h <<EOF
+#define HAVE_LIBDBMALLOC 1
+EOF
+
+  LIBS="-ldbmalloc $LIBS"
+
+fi
+
+fi
+
+fi
+
+echo "$as_me:22989: checking if you want to use valgrind for testing" >&5
+echo $ECHO_N "checking if you want to use valgrind for testing... $ECHO_C" >&6
+
+# Check whether --with-valgrind or --without-valgrind was given.
+if test "${with_valgrind+set}" = set; then
+  withval="$with_valgrind"
+  case "x$withval" in
+	(x|xno) ;;
+	(*)
+		: "${with_cflags:=-g}"
+		: "${enable_leaks:=no}"
+		with_valgrind=yes
+
+cat >>confdefs.h <<EOF
+#define USE_VALGRIND 1
+EOF
+
+		;;
+	esac
+else
+  with_valgrind=
+fi;
+echo "$as_me:23011: result: ${with_valgrind:-no}" >&5
+echo "${ECHO_T}${with_valgrind:-no}" >&6
+
+case ".$with_cflags" in
+(.*-g*)
+	case .$CFLAGS in
+	(.*-g*)
+		;;
+	(*)
+
+cf_fix_cppflags=no
+cf_new_cflags=
+cf_new_cppflags=
+cf_new_extra_cppflags=
+
+for cf_add_cflags in -g
+do
+case "$cf_fix_cppflags" in
+(no)
+	case "$cf_add_cflags" in
+	(-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C)
+		case "$cf_add_cflags" in
+		(-D*)
+			cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+				&& test -z "${cf_tst_cflags}" \
+				&& cf_fix_cppflags=yes
+
+			if test "$cf_fix_cppflags" = yes ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+				continue
+			fi
+			;;
+		esac
+		case "$CPPFLAGS" in
+		(*$cf_add_cflags)
+			;;
+		(*)
+			case "$cf_add_cflags" in
+			(-D*)
+				cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'`
+
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ 	]*\)\?$//g'`
+
+				;;
+			esac
+
+	test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags "
+	cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags"
+
+			;;
+		esac
+		;;
+	(*)
+
+	test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags "
+	cf_new_cflags="${cf_new_cflags}$cf_add_cflags"
+
+		;;
+	esac
+	;;
+(yes)
+
+	test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags "
+	cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags"
+
+	cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'`
+
+	test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \
+		&& test -z "${cf_tst_cflags}" \
+		&& cf_fix_cppflags=no
+	;;
+esac
+done
+
+if test -n "$cf_new_cflags" ; then
+
+	test -n "$CFLAGS" && CFLAGS="$CFLAGS "
+	CFLAGS="${CFLAGS}$cf_new_cflags"
+
+fi
+
+if test -n "$cf_new_cppflags" ; then
+
+	test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS "
+	CPPFLAGS="${CPPFLAGS}$cf_new_cppflags"
+
+fi
+
+if test -n "$cf_new_extra_cppflags" ; then
+
+	test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS "
+	EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags"
+
+fi
+
+		;;
+	esac
+	;;
+esac
+
+echo "$as_me:23124: checking if you want to perform memory-leak testing" >&5
+echo $ECHO_N "checking if you want to perform memory-leak testing... $ECHO_C" >&6
+
+# Check whether --enable-leaks or --disable-leaks was given.
+if test "${enable_leaks+set}" = set; then
+  enableval="$enable_leaks"
+  enable_leaks=$enableval
+else
+  enable_leaks=yes
+fi;
+if test "x$enable_leaks" = xno; then with_no_leaks=yes; else with_no_leaks=no; fi
+echo "$as_me:23135: result: $with_no_leaks" >&5
+echo "${ECHO_T}$with_no_leaks" >&6
+
+if test "$enable_leaks" = no ; then
+
+cat >>confdefs.h <<\EOF
+#define NO_LEAKS 1
+EOF
+
+cat >>confdefs.h <<\EOF
+#define YY_NO_LEAKS 1
+EOF
+
+fi
+
+LD_RPATH_OPT=
+if test "x$cf_cv_enable_rpath" != xno
+then
+	echo "$as_me:23153: checking for an rpath option" >&5
+echo $ECHO_N "checking for an rpath option... $ECHO_C" >&6
+	case "$cf_cv_system_name" in
+	(irix*)
+		if test "$GCC" = yes; then
+			LD_RPATH_OPT="-Wl,-rpath,"
+		else
+			LD_RPATH_OPT="-rpath "
+		fi
+		;;
+	(linux*|gnu*|k*bsd*-gnu|freebsd*)
+		LD_RPATH_OPT="-Wl,-rpath,"
+		;;
+	(openbsd[2-9].*|mirbsd*)
+		LD_RPATH_OPT="-Wl,-rpath,"
+		;;
+	(dragonfly*)
+		LD_RPATH_OPT="-rpath "
+		;;
+	(netbsd*)
+		LD_RPATH_OPT="-Wl,-rpath,"
+		;;
+	(osf*|mls+*)
+		LD_RPATH_OPT="-rpath "
+		;;
+	(solaris2*)
+		LD_RPATH_OPT="-R"
+		;;
+	(*)
+		;;
+	esac
+	echo "$as_me:23184: result: $LD_RPATH_OPT" >&5
+echo "${ECHO_T}$LD_RPATH_OPT" >&6
+
+	case "x$LD_RPATH_OPT" in
+	(x-R*)
+		echo "$as_me:23189: checking if we need a space after rpath option" >&5
+echo $ECHO_N "checking if we need a space after rpath option... $ECHO_C" >&6
+		cf_save_LIBS="$LIBS"
+
+cf_add_libs="$LIBS"
+# reverse order
+cf_add_0lib=
+for cf_add_1lib in ${LD_RPATH_OPT}$libdir; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done
+# filter duplicates
+for cf_add_1lib in $cf_add_0lib; do
+	for cf_add_2lib in $cf_add_libs; do
+		if test "x$cf_add_1lib" = "x$cf_add_2lib"; then
+			cf_add_1lib=
+			break
+		fi
+	done
+	test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs"
+done
+LIBS="$cf_add_libs"
+
+		cat >"conftest.$ac_ext" <<_ACEOF
+#line 23210 "configure"
+#include "confdefs.h"
+
+int
+main (void)
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:23222: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:23225: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:23228: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:23231: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_rpath_space=no
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+cf_rpath_space=yes
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+		LIBS="$cf_save_LIBS"
+		echo "$as_me:23241: result: $cf_rpath_space" >&5
+echo "${ECHO_T}$cf_rpath_space" >&6
+		test "$cf_rpath_space" = yes && LD_RPATH_OPT="$LD_RPATH_OPT "
+		;;
+	esac
+fi
+
+echo "$as_me:23248: checking if rpath-hack should be disabled" >&5
+echo $ECHO_N "checking if rpath-hack should be disabled... $ECHO_C" >&6
+
+# Check whether --enable-rpath-hack or --disable-rpath-hack was given.
+if test "${enable_rpath_hack+set}" = set; then
+  enableval="$enable_rpath_hack"
+  test "$enableval" != no && enableval=yes
+	if test "$enableval" != "yes" ; then
+    enable_rpath_hack=no
+	else
+		enable_rpath_hack=yes
+	fi
+else
+  enableval=yes
+	enable_rpath_hack=yes
+
+fi;
+if test "x$enable_rpath_hack" = xno; then cf_disable_rpath_hack=yes; else cf_disable_rpath_hack=no; fi
+echo "$as_me:23266: result: $cf_disable_rpath_hack" >&5
+echo "${ECHO_T}$cf_disable_rpath_hack" >&6
+
+if test "$enable_rpath_hack" = yes ; then
+
+echo "$as_me:23271: checking for updated LDFLAGS" >&5
+echo $ECHO_N "checking for updated LDFLAGS... $ECHO_C" >&6
+if test -n "$LD_RPATH_OPT" ; then
+	echo "$as_me:23274: result: maybe" >&5
+echo "${ECHO_T}maybe" >&6
+
+	for ac_prog in ldd
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:23281: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_cf_ldd_prog+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$cf_ldd_prog"; then
+  ac_cv_prog_cf_ldd_prog="$cf_ldd_prog" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_cf_ldd_prog="$ac_prog"
+echo "$as_me:23296: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+cf_ldd_prog=$ac_cv_prog_cf_ldd_prog
+if test -n "$cf_ldd_prog"; then
+  echo "$as_me:23304: result: $cf_ldd_prog" >&5
+echo "${ECHO_T}$cf_ldd_prog" >&6
+else
+  echo "$as_me:23307: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$cf_ldd_prog" && break
+done
+test -n "$cf_ldd_prog" || cf_ldd_prog="no"
+
+	cf_rpath_list="/usr/lib /lib"
+	if test "$cf_ldd_prog" != no
+	then
+		cf_rpath_oops=
+
+cat >"conftest.$ac_ext" <<_ACEOF
+#line 23321 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+int
+main (void)
+{
+printf("Hello");
+  ;
+  return 0;
+}
+_ACEOF
+rm -f "conftest.$ac_objext" "conftest$ac_exeext"
+if { (eval echo "$as_me:23333: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:23336: \$? = $ac_status" >&5
+  (exit "$ac_status"); } &&
+         { ac_try='test -s "conftest$ac_exeext"'
+  { (eval echo "$as_me:23339: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:23342: \$? = $ac_status" >&5
+  (exit "$ac_status"); }; }; then
+  cf_rpath_oops=`"$cf_ldd_prog" "conftest$ac_exeext" | ${FGREP-fgrep} ' not found' | sed -e 's% =>.*$%%' |sort | uniq`
+		 cf_rpath_list=`"$cf_ldd_prog" "conftest$ac_exeext" | ${FGREP-fgrep} / | sed -e 's%^.*[ 	]/%/%' -e 's%/[^/][^/]*$%%' |sort | uniq`
+else
+  echo "$as_me: failed program was:" >&5
+cat "conftest.$ac_ext" >&5
+fi
+rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext"
+
+		# If we passed the link-test, but get a "not found" on a given library,
+		# this could be due to inept reconfiguration of gcc to make it only
+		# partly honor /usr/local/lib (or whatever).  Sometimes this behavior
+		# is intentional, e.g., installing gcc in /usr/bin and suppressing the
+		# /usr/local libraries.
+		if test -n "$cf_rpath_oops"
+		then
+			for cf_rpath_src in $cf_rpath_oops
+			do
+				for cf_rpath_dir in \
+					/usr/local \
+					/usr/pkg \
+					/opt/sfw
+				do
+					if test -f "$cf_rpath_dir/lib/$cf_rpath_src"
+					then
+						test -n "$verbose" && echo "	...adding -L$cf_rpath_dir/lib to LDFLAGS for $cf_rpath_src" 1>&6
+
+echo "${as_me:-configure}:23370: testing ...adding -L$cf_rpath_dir/lib to LDFLAGS for $cf_rpath_src ..." 1>&5
+
+						LDFLAGS="$LDFLAGS -L$cf_rpath_dir/lib"
+						break
+					fi
+				done
+			done
+		fi
+	fi
+
+	test -n "$verbose" && echo "	...checking EXTRA_LDFLAGS $EXTRA_LDFLAGS" 1>&6
+
+echo "${as_me:-configure}:23382: testing ...checking EXTRA_LDFLAGS $EXTRA_LDFLAGS ..." 1>&5
+
+test -n "$verbose" && echo "	...checking LDFLAGS $LDFLAGS" 1>&6
+
+echo "${as_me:-configure}:23386: testing ...checking LDFLAGS $LDFLAGS ..." 1>&5
+
+cf_rpath_dst=
+for cf_rpath_src in $LDFLAGS
+do
+	case "$cf_rpath_src" in
+	(-L*)
+
+		# check if this refers to a directory which we will ignore
+		cf_rpath_skip=no
+		if test -n "$cf_rpath_list"
+		then
+			for cf_rpath_item in $cf_rpath_list
+			do
+				if test "x$cf_rpath_src" = "x-L$cf_rpath_item"
+				then
+					cf_rpath_skip=yes
+					break
+				fi
+			done
+		fi
+
+		if test "$cf_rpath_skip" = no
+		then
+			# transform the option
+			if test "$LD_RPATH_OPT" = "-R " ; then
+				cf_rpath_tmp=`echo "$cf_rpath_src" |sed -e "s%-L%-R %"`
+			else
+				cf_rpath_tmp=`echo "$cf_rpath_src" |sed -e "s%-L%$LD_RPATH_OPT%"`
+			fi
+
+			# if we have not already added this, add it now
+			cf_rpath_tst=`echo "$EXTRA_LDFLAGS" | sed -e "s%$cf_rpath_tmp %%"`
+			if test "x$cf_rpath_tst" = "x$EXTRA_LDFLAGS"
+			then
+				test -n "$verbose" && echo "	...Filter $cf_rpath_src ->$cf_rpath_tmp" 1>&6
+
+echo "${as_me:-configure}:23423: testing ...Filter $cf_rpath_src ->$cf_rpath_tmp ..." 1>&5
+
+				EXTRA_LDFLAGS="$cf_rpath_tmp $EXTRA_LDFLAGS"
+			fi
+		fi
+		;;
+	esac
+	cf_rpath_dst="$cf_rpath_dst $cf_rpath_src"
+done
+LDFLAGS=$cf_rpath_dst
+
+test -n "$verbose" && echo "	...checked LDFLAGS $LDFLAGS" 1>&6
+
+echo "${as_me:-configure}:23436: testing ...checked LDFLAGS $LDFLAGS ..." 1>&5
+
+test -n "$verbose" && echo "	...checking LIBS $LIBS" 1>&6
+
+echo "${as_me:-configure}:23440: testing ...checking LIBS $LIBS ..." 1>&5
+
+cf_rpath_dst=
+for cf_rpath_src in $LIBS
+do
+	case "$cf_rpath_src" in
+	(-L*)
+
+		# check if this refers to a directory which we will ignore
+		cf_rpath_skip=no
+		if test -n "$cf_rpath_list"
+		then
+			for cf_rpath_item in $cf_rpath_list
+			do
+				if test "x$cf_rpath_src" = "x-L$cf_rpath_item"
+				then
+					cf_rpath_skip=yes
+					break
+				fi
+			done
+		fi
+
+		if test "$cf_rpath_skip" = no
+		then
+			# transform the option
+			if test "$LD_RPATH_OPT" = "-R " ; then
+				cf_rpath_tmp=`echo "$cf_rpath_src" |sed -e "s%-L%-R %"`
+			else
+				cf_rpath_tmp=`echo "$cf_rpath_src" |sed -e "s%-L%$LD_RPATH_OPT%"`
+			fi
+
+			# if we have not already added this, add it now
+			cf_rpath_tst=`echo "$EXTRA_LDFLAGS" | sed -e "s%$cf_rpath_tmp %%"`
+			if test "x$cf_rpath_tst" = "x$EXTRA_LDFLAGS"
+			then
+				test -n "$verbose" && echo "	...Filter $cf_rpath_src ->$cf_rpath_tmp" 1>&6
+
+echo "${as_me:-configure}:23477: testing ...Filter $cf_rpath_src ->$cf_rpath_tmp ..." 1>&5
+
+				EXTRA_LDFLAGS="$cf_rpath_tmp $EXTRA_LDFLAGS"
+			fi
+		fi
+		;;
+	esac
+	cf_rpath_dst="$cf_rpath_dst $cf_rpath_src"
+done
+LIBS=$cf_rpath_dst
+
+test -n "$verbose" && echo "	...checked LIBS $LIBS" 1>&6
+
+echo "${as_me:-configure}:23490: testing ...checked LIBS $LIBS ..." 1>&5
+
+	test -n "$verbose" && echo "	...checked EXTRA_LDFLAGS $EXTRA_LDFLAGS" 1>&6
+
+echo "${as_me:-configure}:23494: testing ...checked EXTRA_LDFLAGS $EXTRA_LDFLAGS ..." 1>&5
+
+else
+	echo "$as_me:23497: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+
+TEST_ARGS="$LIBS"
+LIBS=
+
+ac_config_files="$ac_config_files Makefile"
+ac_config_commands="$ac_config_commands default"
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overriden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+{
+  (set) 2>&1 |
+    case `(ac_space=' '; set | grep ac_space) 2>&1` in
+    *ac_space=\ *)
+      # `set' does not quote correctly, so add quotes (double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \).
+      sed -n \
+        "s/'/'\\\\''/g;
+    	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;;
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n \
+        "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      ;;
+    esac;
+} |
+  sed '
+     t clear
+     : clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     : end' >>confcache
+if cmp -s $cache_file confcache; then :; else
+  if test -w $cache_file; then
+    test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
+    cat confcache >$cache_file
+  else
+    echo "not updating unwritable cache $cache_file"
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[ 	]*VPATH[ 	]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[ 	]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[ 	]*$//;
+}'
+fi
+
+DEFS=-DHAVE_CONFIG_H
+
+: "${CONFIG_STATUS=./config.status}"
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:23587: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >"$CONFIG_STATUS" <<_ACEOF
+#! $SHELL
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+me=\`echo "\$0" | sed -e 's,.*\\/,,'\`
+
+debug=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+ac_cs_invocation="\$0 \$@"
+
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+_ACEOF
+
+cat >>"$CONFIG_STATUS" <<\_ACEOF
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+
+# Name of the executable.
+as_me=`echo "$0" |sed 's,.*[\\/],,'`
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr="expr"
+else
+  as_expr="false"
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s='ln'
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+as_executable_p="test -f"
+
+# Support unset when possible.
+if (FOO=FOO; unset FOO) >/dev/null 2>&1; then
+  as_unset="unset"
+else
+  as_unset="false"
+fi
+
+# NLS nuisances.
+$as_unset LANG || test "${LANG+set}" != set || { LANG=C; export LANG; }
+$as_unset LC_ALL || test "${LC_ALL+set}" != set || { LC_ALL=C; export LC_ALL; }
+$as_unset LC_TIME || test "${LC_TIME+set}" != set || { LC_TIME=C; export LC_TIME; }
+$as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set || { LC_CTYPE=C; export LC_CTYPE; }
+$as_unset LANGUAGE || test "${LANGUAGE+set}" != set || { LANGUAGE=C; export LANGUAGE; }
+$as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set || { LC_COLLATE=C; export LC_COLLATE; }
+$as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set || { LC_NUMERIC=C; export LC_NUMERIC; }
+$as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set || { LC_MESSAGES=C; export LC_MESSAGES; }
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" 	$as_nl"
+
+# CDPATH.
+$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=:; export CDPATH; }
+
+exec 6>&1
+
+_ACEOF
+
+# Files that config.status was made for.
+if test -n "$ac_config_files"; then
+  echo "config_files=\"$ac_config_files\"" >>"$CONFIG_STATUS"
+fi
+
+if test -n "$ac_config_headers"; then
+  echo "config_headers=\"$ac_config_headers\"" >>"$CONFIG_STATUS"
+fi
+
+if test -n "$ac_config_links"; then
+  echo "config_links=\"$ac_config_links\"" >>"$CONFIG_STATUS"
+fi
+
+if test -n "$ac_config_commands"; then
+  echo "config_commands=\"$ac_config_commands\"" >>"$CONFIG_STATUS"
+fi
+
+cat >>"$CONFIG_STATUS" <<\EOF
+
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number, then exit
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+  --file=FILE[:TEMPLATE]
+                   instantiate the configuration file FILE
+  --header=FILE[:TEMPLATE]
+                   instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <dickey@invisible-island.net>."
+EOF
+
+cat >>"$CONFIG_STATUS" <<EOF
+ac_cs_version="\\
+config.status
+configured by $0, generated by GNU Autoconf 2.52.20221009,
+  with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright 2003-2021,2022	Thomas E. Dickey
+Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir="$srcdir"
+INSTALL="$INSTALL"
+EOF
+
+cat >>"$CONFIG_STATUS" <<\EOF
+# If no file are specified by the user, then we need to provide default
+# value.  By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=*)
+    ac_option=`expr "x$1" : 'x\([^=]*\)='`
+    ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+    shift
+    set dummy "$ac_option" "$ac_optarg" ${1+"$@"}
+    shift
+    ;;
+  -*);;
+  *) # This is not an option, so the user has probably given explicit
+     # arguments.
+     ac_need_defaults=false;;
+  esac
+
+  case $1 in
+  # Handling of the options.
+EOF
+cat >>"$CONFIG_STATUS" <<EOF
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    echo "running $SHELL $0 " $ac_configure_args " --no-create --no-recursion"
+    exec $SHELL $0 $ac_configure_args --no-create --no-recursion ;;
+EOF
+cat >>"$CONFIG_STATUS" <<\EOF
+  --version | --vers* | -V )
+    echo "$ac_cs_version"; exit 0 ;;
+  --he | --h)
+    # Conflict between --help and --header
+    { { echo "$as_me:23768: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; };;
+  --help | --hel | -h )
+    echo "$ac_cs_usage"; exit 0 ;;
+  --debug | --d* | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    shift
+    CONFIG_FILES="$CONFIG_FILES $1"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    shift
+    CONFIG_HEADERS="$CONFIG_HEADERS $1"
+    ac_need_defaults=false;;
+
+  # This is an error.
+  -*) { { echo "$as_me:23787: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; } ;;
+
+  *) ac_config_targets="$ac_config_targets $1" ;;
+
+  esac
+  shift
+done
+
+exec 5>>config.log
+cat >&5 << _ACEOF
+
+## ----------------------- ##
+## Running config.status.  ##
+## ----------------------- ##
+
+This file was extended by $as_me 2.52.20221009, executed with
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  > "$ac_cs_invocation"
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+
+_ACEOF
+EOF
+
+cat >>"$CONFIG_STATUS" <<EOF
+#
+# INIT-COMMANDS section.
+#
+
+AWK="$AWK"
+ECHO_CC="$ECHO_CC"
+ECHO_LD="$ECHO_LD"
+SHOW_CC="$SHOW_LD"
+
+EOF
+
+cat >>"$CONFIG_STATUS" <<\EOF
+for ac_config_target in $ac_config_targets
+do
+  case "$ac_config_target" in
+  # Handling of arguments.
+  "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+  "default" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;;
+  "ncurses_cfg.h" ) CONFIG_HEADERS="$CONFIG_HEADERS ncurses_cfg.h:ncurses_tst.hin" ;;
+  *) { { echo "$as_me:23837: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if "$ac_need_defaults"; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+  trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+  trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+: "${TMPDIR=/tmp}"
+{
+  tmp=`(umask 077 && mktemp -d -q "$TMPDIR/csXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=$TMPDIR/cs$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} ||
+{
+   echo "$me: cannot create a temporary directory in $TMPDIR" >&2
+   { (exit 1); exit 1; }
+}
+
+EOF
+
+cat >>"$CONFIG_STATUS" <<EOF
+
+#
+# CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "\$CONFIG_FILES"; then
+  # Protect against being on the right side of a sed subst in config.status.
+  sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
+   s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >"\$tmp"/subs.sed <<\\CEOF
+s,@SHELL@,$SHELL,;t t
+s,@exec_prefix@,$exec_prefix,;t t
+s,@prefix@,$prefix,;t t
+s,@program_transform_name@,$program_transform_name,;t t
+s,@bindir@,$bindir,;t t
+s,@sbindir@,$sbindir,;t t
+s,@libexecdir@,$libexecdir,;t t
+s,@datarootdir@,$datarootdir,;t t
+s,@datadir@,$datadir,;t t
+s,@sysconfdir@,$sysconfdir,;t t
+s,@sharedstatedir@,$sharedstatedir,;t t
+s,@localstatedir@,$localstatedir,;t t
+s,@runstatedir@,$runstatedir,;t t
+s,@libdir@,$libdir,;t t
+s,@includedir@,$includedir,;t t
+s,@oldincludedir@,$oldincludedir,;t t
+s,@infodir@,$infodir,;t t
+s,@mandir@,$mandir,;t t
+s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t
+s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
+s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
+s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t
+s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
+s,@build_alias@,$build_alias,;t t
+s,@host_alias@,$host_alias,;t t
+s,@target_alias@,$target_alias,;t t
+s,@ECHO_C@,$ECHO_C,;t t
+s,@ECHO_N@,$ECHO_N,;t t
+s,@ECHO_T@,$ECHO_T,;t t
+s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
+s,@DEFS@,$DEFS,;t t
+s,@LIBS@,$LIBS,;t t
+s,@build@,$build,;t t
+s,@build_cpu@,$build_cpu,;t t
+s,@build_vendor@,$build_vendor,;t t
+s,@build_os@,$build_os,;t t
+s,@host@,$host,;t t
+s,@host_cpu@,$host_cpu,;t t
+s,@host_vendor@,$host_vendor,;t t
+s,@host_os@,$host_os,;t t
+s,@SET_MAKE@,$SET_MAKE,;t t
+s,@CC@,$CC,;t t
+s,@CFLAGS@,$CFLAGS,;t t
+s,@LDFLAGS@,$LDFLAGS,;t t
+s,@CPPFLAGS@,$CPPFLAGS,;t t
+s,@ac_ct_CC@,$ac_ct_CC,;t t
+s,@EXEEXT@,$EXEEXT,;t t
+s,@OBJEXT@,$OBJEXT,;t t
+s,@EXTRA_CPPFLAGS@,$EXTRA_CPPFLAGS,;t t
+s,@CPP@,$CPP,;t t
+s,@GREP@,$GREP,;t t
+s,@EGREP@,$EGREP,;t t
+s,@AWK@,$AWK,;t t
+s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
+s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
+s,@INSTALL_DATA@,$INSTALL_DATA,;t t
+s,@INSTALL_OPT_S@,$INSTALL_OPT_S,;t t
+s,@INSTALL_OPT_O@,$INSTALL_OPT_O,;t t
+s,@LINT@,$LINT,;t t
+s,@LINT_OPTS@,$LINT_OPTS,;t t
+s,@LINT_LIBS@,$LINT_LIBS,;t t
+s,@MAKE_NO_PHONY@,$MAKE_NO_PHONY,;t t
+s,@MAKE_PHONY@,$MAKE_PHONY,;t t
+s,@CTAGS@,$CTAGS,;t t
+s,@ETAGS@,$ETAGS,;t t
+s,@MAKE_LOWER_TAGS@,$MAKE_LOWER_TAGS,;t t
+s,@MAKE_UPPER_TAGS@,$MAKE_UPPER_TAGS,;t t
+s,@MATH_LIB@,$MATH_LIB,;t t
+s,@top_builddir@,$top_builddir,;t t
+s,@CC_G_OPT@,$CC_G_OPT,;t t
+s,@CC_SHARED_OPTS@,$CC_SHARED_OPTS,;t t
+s,@DFT_DEP_SUFFIX@,$DFT_DEP_SUFFIX,;t t
+s,@DFT_OBJ_SUBDIR@,$DFT_OBJ_SUBDIR,;t t
+s,@DFT_UPR_MODEL@,$DFT_UPR_MODEL,;t t
+s,@LD@,$LD,;t t
+s,@LDFLAGS_SHARED@,$LDFLAGS_SHARED,;t t
+s,@LDFLAGS_STATIC@,$LDFLAGS_STATIC,;t t
+s,@LD_MODEL@,$LD_MODEL,;t t
+s,@LD_SHARED_OPTS@,$LD_SHARED_OPTS,;t t
+s,@LIBTOOL@,$LIBTOOL,;t t
+s,@LIBTOOL_OPTS@,$LIBTOOL_OPTS,;t t
+s,@LIB_CLEAN@,$LIB_CLEAN,;t t
+s,@LIB_COMPILE@,$LIB_COMPILE,;t t
+s,@LIB_LINK@,$LIB_LINK,;t t
+s,@LINK_TESTS@,$LINK_TESTS,;t t
+s,@LOCAL_LDFLAGS@,$LOCAL_LDFLAGS,;t t
+s,@PACKAGE@,$PACKAGE,;t t
+s,@PTHREAD@,$PTHREAD,;t t
+s,@TEST_ARGS@,$TEST_ARGS,;t t
+s,@TEST_DEPS@,$TEST_DEPS,;t t
+s,@TEST_LIBS@,$TEST_LIBS,;t t
+s,@TINFO_LDFLAGS@,$TINFO_LDFLAGS,;t t
+s,@TINFO_LIBS@,$TINFO_LIBS,;t t
+s,@cf_cv_abi_version@,$cf_cv_abi_version,;t t
+s,@cf_cv_rel_version@,$cf_cv_rel_version,;t t
+s,@includesubdir@,$includesubdir,;t t
+s,@FGREP@,$FGREP,;t t
+s,@HAVE_STDNORETURN_H@,$HAVE_STDNORETURN_H,;t t
+s,@STDC_NORETURN@,$STDC_NORETURN,;t t
+s,@PKG_CONFIG@,$PKG_CONFIG,;t t
+s,@ac_pt_PKG_CONFIG@,$ac_pt_PKG_CONFIG,;t t
+s,@ECHO_LT@,$ECHO_LT,;t t
+s,@ECHO_LD@,$ECHO_LD,;t t
+s,@RULE_CC@,$RULE_CC,;t t
+s,@SHOW_CC@,$SHOW_CC,;t t
+s,@ECHO_CC@,$ECHO_CC,;t t
+s,@NCURSES_WRAP_PREFIX@,$NCURSES_WRAP_PREFIX,;t t
+s,@NCURSES_CONFIG@,$NCURSES_CONFIG,;t t
+s,@ac_ct_NCURSES_CONFIG@,$ac_ct_NCURSES_CONFIG,;t t
+s,@X_CFLAGS@,$X_CFLAGS,;t t
+s,@X_PRE_LIBS@,$X_PRE_LIBS,;t t
+s,@X_LIBS@,$X_LIBS,;t t
+s,@X_EXTRA_LIBS@,$X_EXTRA_LIBS,;t t
+s,@XCURSES_CONFIG@,$XCURSES_CONFIG,;t t
+s,@ac_ct_XCURSES_CONFIG@,$ac_ct_XCURSES_CONFIG,;t t
+s,@RGB_PATH@,$RGB_PATH,;t t
+s,@no_x11_rgb@,$no_x11_rgb,;t t
+s,@FORM_NAME@,$FORM_NAME,;t t
+s,@MENU_NAME@,$MENU_NAME,;t t
+s,@PANEL_NAME@,$PANEL_NAME,;t t
+s,@EXTRA_CFLAGS@,$EXTRA_CFLAGS,;t t
+s,@cf_ldd_prog@,$cf_ldd_prog,;t t
+s,@EXTRA_LDFLAGS@,$EXTRA_LDFLAGS,;t t
+CEOF
+
+EOF
+
+  cat >>"$CONFIG_STATUS" <<\EOF
+  # Split the substitutions into bite-sized pieces for seds with
+  # small command number limits, like on Digital OSF/1 and HP-UX.
+  ac_max_sed_lines=48
+  ac_sed_frag=1 # Number of current file.
+  ac_beg=1 # First line for current file.
+  ac_end=$ac_max_sed_lines # Line after last line for current file.
+  ac_more_lines=:
+  ac_sed_cmds=
+  while "$ac_more_lines"; do
+    if test "$ac_beg" -gt 1; then
+      sed "1,${ac_beg}d; ${ac_end}q" "$tmp"/subs.sed >"$tmp"/subs.frag
+    else
+      sed "${ac_end}q" "$tmp"/subs.sed >"$tmp"/subs.frag
+    fi
+    if test ! -s "$tmp"/subs.frag; then
+      ac_more_lines=false
+    else
+      # The purpose of the label and of the branching condition is to
+      # speed up the sed processing (if there are no `@' at all, there
+      # is no need to browse any of the substitutions).
+      # These are the two extra sed commands mentioned above.
+      (echo ':t
+  /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat "$tmp"/subs.frag) >"$tmp"/subs-$ac_sed_frag.sed
+      # It is possible to make a multiline substitution using escaped newlines.
+      # Ensure that we do not split the substitution between script fragments.
+      ac_BEG=$ac_end
+      ac_END=`expr "$ac_end" + "$ac_max_sed_lines"`
+      sed "1,${ac_BEG}d; ${ac_END}p; q" "$tmp"/subs.sed >"$tmp"/subs.next
+      if test -s "$tmp"/subs.next; then
+        grep '^s,@[^@,][^@,]*@,.*\\$' "$tmp"/subs.next >"$tmp"/subs.edit
+        if test ! -s "$tmp"/subs.edit; then
+          grep "^s,@[^@,][^@,]*@,.*,;t t$" "$tmp"/subs.next >"$tmp"/subs.edit
+          if test ! -s "$tmp"/subs.edit; then
+            if test "$ac_beg" -gt 1; then
+              ac_end=`expr "$ac_end" - 1`
+              continue
+            fi
+          fi
+        fi
+      fi
+
+      if test -z "$ac_sed_cmds"; then
+        ac_sed_cmds="sed -f \"$tmp\"/subs-$ac_sed_frag.sed"
+      else
+        ac_sed_cmds="$ac_sed_cmds | sed -f \"$tmp\"/subs-$ac_sed_frag.sed"
+      fi
+      ac_sed_frag=`expr "$ac_sed_frag" + 1`
+      ac_beg=$ac_end
+      ac_end=`expr "$ac_end" + "$ac_max_sed_lines"`
+    fi
+  done
+  if test -z "$ac_sed_cmds"; then
+    ac_sed_cmds="cat"
+  fi
+fi # test -n "$CONFIG_FILES"
+
+EOF
+cat >>"$CONFIG_STATUS" <<\EOF
+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case "$ac_file" in
+  - | *:- | *:-:* ) # input from stdin
+        cat >"$tmp"/stdin
+        ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+        ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+        ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  * )   ac_file_in=$ac_file.in ;;
+  esac
+
+  # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
+  ac_dir=`$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+         X"$ac_file" : 'X\(//\)[^/]' \| \
+         X"$ac_file" : 'X\(//\)$' \| \
+         X"$ac_file" : 'X\(/\)' \| \
+         .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+    { case "$ac_dir" in
+  [\\/]* | ?:[\\/]* ) as_incr_dir=;;
+  *)                      as_incr_dir=.;;
+esac
+as_dummy="$ac_dir"
+for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do
+  case $as_mkdir_dir in
+    # Skip DOS drivespec
+    ?:) as_incr_dir=$as_mkdir_dir ;;
+    *)
+      as_incr_dir=$as_incr_dir/$as_mkdir_dir
+      test -d "$as_incr_dir" || mkdir "$as_incr_dir"
+    ;;
+  esac
+done; }
+
+    ac_dir_suffix="/`echo "$ac_dir"|sed 's,^\./,,'`"
+    # A "../" for each directory in $ac_dir_suffix.
+    ac_dots=`echo "$ac_dir_suffix" | sed 's,/[^/]*,../,g'`
+  else
+    ac_dir_suffix= ac_dots=
+  fi
+
+  case "$srcdir" in
+  .)  ac_srcdir=.
+      if test -z "$ac_dots"; then
+         ac_top_srcdir=.
+      else
+         ac_top_srcdir=`echo "$ac_dots" | sed 's,/$,,'`
+      fi ;;
+  [\\/]* | ?:[\\/]* )
+      ac_srcdir="$srcdir$ac_dir_suffix";
+      ac_top_srcdir="$srcdir" ;;
+  *) # Relative path.
+    ac_srcdir="$ac_dots$srcdir$ac_dir_suffix"
+    ac_top_srcdir="$ac_dots$srcdir" ;;
+  esac
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_dots$INSTALL ;;
+  esac
+
+  if test x"$ac_file" != x-; then
+    { echo "$as_me:24144: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+    rm -f "$ac_file"
+  fi
+  # Let's still pretend it is `configure' which instantiates (i.e., don't
+  # use $as_me), people would be surprised to read:
+  #    /* config.h.  Generated automatically by config.status.  */
+  configure_input="Generated automatically from `echo $ac_file_in |
+                                                 sed 's,.*/,,'` by configure."
+
+  # First look for the input files in the build tree, otherwise in the
+  # src tree.
+  ac_file_inputs=`IFS=:
+    for f in $ac_file_in; do
+      case $f in
+      -) echo "$tmp"/stdin ;;
+      [\\/$]*)
+         # Absolute (can't be DOS-style, as IFS=:)
+         test -f "$f" || { { echo "$as_me:24162: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+         echo "$f";;
+      *) # Relative
+         if test -f "$f"; then
+           # Build tree
+           echo "$f"
+         elif test -f "$srcdir/$f"; then
+           # Source tree
+           echo "$srcdir/$f"
+         else
+           # /dev/null tree
+           { { echo "$as_me:24175: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+         fi;;
+      esac
+    done` || { (exit 1); exit 1; }
+EOF
+cat >>"$CONFIG_STATUS" <<\EOF
+  ac_warn_datarootdir=no
+  if test x"$ac_file" != x-; then
+    for ac_item in $ac_file_inputs
+    do
+      ac_seen=`grep '@\(datadir\|mandir\|infodir\)@' "$ac_item"`
+      if test -n "$ac_seen"; then
+        ac_used=`grep '@datarootdir@' "$ac_item"`
+        if test -z "$ac_used"; then
+          { echo "$as_me:24191: WARNING: datarootdir was used implicitly but not set:
+$ac_seen" >&5
+echo "$as_me: WARNING: datarootdir was used implicitly but not set:
+$ac_seen" >&2;}
+          ac_warn_datarootdir=yes
+        fi
+      fi
+      ac_seen=`grep '${datarootdir}' "$ac_item"`
+      if test -n "$ac_seen"; then
+        { echo "$as_me:24200: WARNING: datarootdir was used explicitly but not set:
+$ac_seen" >&5
+echo "$as_me: WARNING: datarootdir was used explicitly but not set:
+$ac_seen" >&2;}
+        ac_warn_datarootdir=yes
+      fi
+    done
+  fi
+
+if test "x$ac_warn_datarootdir" = xyes; then
+  ac_sed_cmds="$ac_sed_cmds | sed -e 's,@datarootdir@,\${prefix}/share,g' -e 's,\${datarootdir},\${prefix}/share,g'"
+fi
+
+EOF
+cat >>"$CONFIG_STATUS" <<EOF
+  sed "$ac_vpsub
+$extrasub
+EOF
+cat >>"$CONFIG_STATUS" <<\EOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s,@configure_input@,$configure_input,;t t
+s,@srcdir@,$ac_srcdir,;t t
+s,@top_srcdir@,$ac_top_srcdir,;t t
+s,@INSTALL@,$ac_INSTALL,;t t
+" $ac_file_inputs | (eval "$ac_sed_cmds") >"$tmp"/out
+  rm -f "$tmp"/stdin
+EOF
+: "${FGREP:=grep -F}"
+: "${EGREP:=grep -E}"
+cat >>"$CONFIG_STATUS" <<EOF
+  : "\${FGREP:=$FGREP}"
+  : "\${EGREP:=$EGREP}"
+EOF
+cat >>"$CONFIG_STATUS" <<\EOF
+  if test x"$ac_file" != x-; then
+    cp "$tmp/out" "$ac_file"
+
+    for ac_name in prefix exec_prefix datarootdir
+    do
+        ac_seen=`$FGREP -n '${'$ac_name'[:=].*}' "$ac_file"`
+        if test -n "$ac_seen"; then
+            ac_init=`$EGREP '[ 	]*'$ac_name'[ 	]*=' "$ac_file"`
+            if test -z "$ac_init"; then
+              ac_seen=`echo "$ac_seen" |sed -e 's,^,'"$ac_file"':,'`
+              { echo "$as_me:24245: WARNING: Variable $ac_name is used but was not set:
+$ac_seen" >&5
+echo "$as_me: WARNING: Variable $ac_name is used but was not set:
+$ac_seen" >&2;}
+            fi
+        fi
+    done
+    $EGREP -n '@[a-z_][a-z_0-9]+@' "$ac_file" >"$tmp"/out
+    $EGREP -n '@[A-Z_][A-Z_0-9]+@' "$ac_file" >>"$tmp"/out
+    if test -s "$tmp"/out; then
+      ac_seen=`sed -e 's,^,'"$ac_file"':,' < "$tmp"/out`
+      { echo "$as_me:24256: WARNING: Some variables may not be substituted:
+$ac_seen" >&5
+echo "$as_me: WARNING: Some variables may not be substituted:
+$ac_seen" >&2;}
+    fi
+  else
+    cat "$tmp"/out
+  fi
+  rm -f "$tmp"/out
+
+done
+EOF
+cat >>"$CONFIG_STATUS" <<\EOF
+
+#
+# CONFIG_HEADER section.
+#
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s,^\([ 	]*\)#\([ 	]*define[ 	][ 	]*\)'
+ac_dB='[ 	].*$,\1#\2'
+ac_dC=' '
+ac_dD=',;t'
+# ac_i turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
+ac_iA='s,^\([ 	]*\)#\([ 	]*\)undef\([ 	][ 	]*\)'
+ac_iB='\([ 	]\),\1#\2define\3'
+ac_iC=' '
+ac_iD='\4,;t'
+# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_uA='s,^\([ 	]*\)#\([ 	]*\)undef\([ 	][ 	]*\)'
+ac_uB='$,\1#\2define\3'
+ac_uC=' '
+ac_uD=',;t'
+
+for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case "$ac_file" in
+  - | *:- | *:-:* ) # input from stdin
+        cat >"$tmp"/stdin
+        ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+        ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+        ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  * )   ac_file_in=$ac_file.in ;;
+  esac
+
+  test x"$ac_file" != x- && { echo "$as_me:24305: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+
+  # First look for the input files in the build tree, otherwise in the
+  # src tree.
+  ac_file_inputs=`IFS=:
+    for f in $ac_file_in; do
+      case $f in
+      -) echo "$tmp"/stdin ;;
+      [\\/$]*)
+         # Absolute (can't be DOS-style, as IFS=:)
+         test -f "$f" || { { echo "$as_me:24316: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+         echo $f;;
+      *) # Relative
+         if test -f "$f"; then
+           # Build tree
+           echo $f
+         elif test -f "$srcdir/$f"; then
+           # Source tree
+           echo "$srcdir/$f"
+         else
+           # /dev/null tree
+           { { echo "$as_me:24329: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+         fi;;
+      esac
+    done` || { (exit 1); exit 1; }
+  # Remove the trailing spaces.
+  sed 's/[ 	]*$//' $ac_file_inputs >"$tmp"/in
+
+EOF
+
+# Transform confdefs.h into a list of #define's.  We won't use it as a sed
+# script, but as data to insert where we see @DEFS@.  We expect AC_SAVE_DEFS to
+# be either 'cat' or 'sort'.
+cat confdefs.h | uniq >conftest.vals
+
+# Break up conftest.vals because some shells have a limit on
+# the size of here documents, and old seds have small limits too.
+
+rm -f conftest.tail
+echo '  rm -f conftest.frag' >> "$CONFIG_STATUS"
+while grep . conftest.vals >/dev/null
+do
+  # Write chunks of a limited-size here document to conftest.frag.
+  echo '  cat >> conftest.frag <<CEOF' >> "$CONFIG_STATUS"
+  sed "${ac_max_here_lines}q" conftest.vals | sed -e 's/#ifdef.*/#if 0/' >> "$CONFIG_STATUS"
+  echo 'CEOF' >> "$CONFIG_STATUS"
+  sed "1,${ac_max_here_lines}d" conftest.vals > conftest.tail
+  rm -f conftest.vals
+  mv conftest.tail conftest.vals
+done
+rm -f conftest.vals
+
+# Run sed to substitute the contents of conftest.frag into $tmp/in at the
+# marker @DEFS@.
+echo '  cat >> conftest.edit <<CEOF
+/@DEFS@/r conftest.frag
+/@DEFS@/d
+CEOF
+sed -f conftest.edit "$tmp"/in > "$tmp"/out
+rm -f "$tmp"/in
+mv "$tmp"/out "$tmp"/in
+rm -f conftest.edit conftest.frag
+' >> "$CONFIG_STATUS"
+
+cat >>"$CONFIG_STATUS" <<\EOF
+  # Let's still pretend it is `configure' which instantiates (i.e., don't
+  # use $as_me), people would be surprised to read:
+  #    /* config.h.  Generated automatically by config.status.  */
+  if test x"$ac_file" = x-; then
+    echo "/* Generated automatically by configure.  */" >"$tmp"/config.h
+  else
+    echo "/* $ac_file.  Generated automatically by configure.  */" >"$tmp"/config.h
+  fi
+  cat "$tmp"/in >>"$tmp"/config.h
+  rm -f "$tmp"/in
+  if test x"$ac_file" != x-; then
+    if cmp -s "$ac_file" "$tmp/config.h" 2>/dev/null; then
+      { echo "$as_me:24387: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      ac_dir=`$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+         X"$ac_file" : 'X\(//\)[^/]' \| \
+         X"$ac_file" : 'X\(//\)$' \| \
+         X"$ac_file" : 'X\(/\)' \| \
+         .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+      if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+        { case "$ac_dir" in
+  [\\/]* | ?:[\\/]* ) as_incr_dir=;;
+  *)                      as_incr_dir=.;;
+esac
+as_dummy="$ac_dir"
+for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do
+  case $as_mkdir_dir in
+    # Skip DOS drivespec
+    ?:) as_incr_dir=$as_mkdir_dir ;;
+    *)
+      as_incr_dir=$as_incr_dir/$as_mkdir_dir
+      test -d "$as_incr_dir" || mkdir "$as_incr_dir"
+    ;;
+  esac
+done; }
+
+      fi
+      rm -f "$ac_file"
+      mv "$tmp/config.h" "$ac_file"
+    fi
+  else
+    cat "$tmp"/config.h
+    rm -f "$tmp"/config.h
+  fi
+done
+EOF
+cat >>"$CONFIG_STATUS" <<\EOF
+#
+# CONFIG_COMMANDS section.
+#
+for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
+  ac_dest=`echo "$ac_file" | sed 's,:.*,,'`
+  ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
+
+  case "$ac_dest" in
+    default )
+
+for cf_dir in .
+do
+	if test ! -d "$srcdir/$cf_dir" ; then
+		continue
+	elif test -f "$srcdir/$cf_dir/programs" ; then
+		$AWK -f $srcdir/mk-test.awk INSTALL=yes ECHO_LINK="$ECHO_LD" "$srcdir/$cf_dir/programs" >>$cf_dir/Makefile
+	fi
+done
+
+	cat >>Makefile <<TEST_EOF
+
+# These rules are generated so we do not rely on suffix rules, which do not
+# work consistently for different make-programs (the '\$(MODEL)/' confuses
+# some, and the '\$x' confuses others).
+TEST_EOF
+
+LIST=`sed -e 's/[ 	].*//' -e '/^[#@]/d' $srcdir/modules`
+for N in $LIST
+do
+	cat >>Makefile <<TEST_EOF
+
+\$(MODEL)/$N.o : \$(srcdir)/$N.c \\
+	\$(srcdir)/test.priv.h \\
+	ncurses_cfg.h
+	$SHOW_CC
+	$ECHO_CC\$(CC) -c \$(CFLAGS_DEFAULT) -DMODULE_NAME="$N" \$(srcdir)/$N.c
+TEST_EOF
+done
+
+if test -f ../config.guess && test -f ../config.sub
+then
+	cat >>Makefile <<TEST_EOF
+
+# if we used CF_INHERIT for getting these files, we can remove them
+distclean::
+	rm -f config.guess config.sub
+TEST_EOF
+fi
+ ;;
+  esac
+done
+EOF
+
+cat >>"$CONFIG_STATUS" <<\EOF
+
+{ (exit 0); exit 0; }
+EOF
+chmod +x "$CONFIG_STATUS"
+ac_clean_files=$ac_clean_files_save
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  exec 5>/dev/null
+  $SHELL "$CONFIG_STATUS" || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  "$ac_cs_success" || { (exit 1); exit 1; }
+fi
+
diff --git a/test/configure.in b/test/configure.in
new file mode 100644
index 0000000..6405dea
--- /dev/null
+++ b/test/configure.in
@@ -0,0 +1,542 @@
+dnl***************************************************************************
+dnl Copyright 2018-2021,2022 Thomas E. Dickey                                *
+dnl Copyright 1998-2017,2018 Free Software Foundation, Inc.                  *
+dnl                                                                          *
+dnl Permission is hereby granted, free of charge, to any person obtaining a  *
+dnl copy of this software and associated documentation files (the            *
+dnl "Software"), to deal in the Software without restriction, including      *
+dnl without limitation the rights to use, copy, modify, merge, publish,      *
+dnl distribute, distribute with modifications, sublicense, and/or sell       *
+dnl copies of the Software, and to permit persons to whom the Software is    *
+dnl furnished to do so, subject to the following conditions:                 *
+dnl                                                                          *
+dnl The above copyright notice and this permission notice shall be included  *
+dnl in all copies or substantial portions of the Software.                   *
+dnl                                                                          *
+dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
+dnl OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
+dnl MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
+dnl IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
+dnl DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
+dnl OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
+dnl THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
+dnl                                                                          *
+dnl Except as contained in this notice, the name(s) of the above copyright   *
+dnl holders shall not be used in advertising or otherwise to promote the     *
+dnl sale, use or other dealings in this Software without prior written       *
+dnl authorization.                                                           *
+dnl***************************************************************************
+dnl
+dnl Author: Thomas E. Dickey 1996-on
+dnl
+dnl $Id: configure.in,v 1.168 2022/11/05 22:13:12 tom Exp $
+dnl This is a simple configuration-script for the ncurses test programs that
+dnl allows the test-directory to be separately configured against a reference
+dnl system (i.e., sysvr4 curses)
+dnl
+dnl If you're configuring ncurses, you shouldn't need to use this script.
+dnl It's only for testing purposes.
+dnl
+dnl For additional information, see
+dnl		https://invisible-island.net/autoconf/
+dnl		https://invisible-island.net/autoconf/my-autoconf.html
+dnl		https://invisible-island.net/ncurses/ncurses-examples.html
+dnl ---------------------------------------------------------------------------
+AC_PREREQ(2.52.20210509)
+AC_INIT(ncurses.c)
+AC_CONFIG_HEADER(ncurses_cfg.h:ncurses_tst.hin)
+
+CF_INHERIT_SCRIPT(config.guess)
+CF_INHERIT_SCRIPT(config.sub)
+CF_CHECK_CACHE
+
+AC_ARG_PROGRAM
+
+CF_HELP_MESSAGE(General Options:)
+
+AC_PROG_MAKE_SET
+CF_PROG_CC
+AC_C_INLINE
+AC_PROG_CPP
+AC_PROG_AWK
+CF_PROG_INSTALL
+CF_INSTALL_OPTS
+CF_PROG_LINT
+CF_MAKE_PHONY
+CF_MAKE_TAGS
+
+CF_MATH_LIB(MATH_LIB,pow(sin(x),x))
+AC_SUBST(MATH_LIB)
+
+dnl Things that we don't need (or must override) if we're not building ncurses
+CF_TOP_BUILDDIR
+CC_G_OPT="-g"					AC_SUBST(CC_G_OPT)
+CC_SHARED_OPTS=unknown			AC_SUBST(CC_SHARED_OPTS)
+CPPFLAGS="$CPPFLAGS"			AC_SUBST(CPPFLAGS)
+DFT_DEP_SUFFIX=""				AC_SUBST(DFT_DEP_SUFFIX)
+DFT_OBJ_SUBDIR=`pwd|sed -e's:.*/::'`	AC_SUBST(DFT_OBJ_SUBDIR)
+DFT_UPR_MODEL="NORMAL"			AC_SUBST(DFT_UPR_MODEL)
+LD="ld"							AC_SUBST(LD)
+LDFLAGS_SHARED=""				AC_SUBST(LDFLAGS_SHARED)
+LDFLAGS_STATIC=""				AC_SUBST(LDFLAGS_STATIC)
+LD_MODEL=""						AC_SUBST(LD_MODEL)
+LD_SHARED_OPTS=""				AC_SUBST(LD_SHARED_OPTS)
+LIBTOOL=""						AC_SUBST(LIBTOOL)
+LIBTOOL_OPTS=""					AC_SUBST(LIBTOOL_OPTS)
+LIB_CLEAN=""					AC_SUBST(LIB_CLEAN)
+LIB_COMPILE=""					AC_SUBST(LIB_COMPILE)
+LIB_LINK='${CC}'				AC_SUBST(LIB_LINK)
+LINK_TESTS=""					AC_SUBST(LINK_TESTS)
+LOCAL_LDFLAGS=""				AC_SUBST(LOCAL_LDFLAGS)
+PACKAGE="ncurses-examples"		AC_SUBST(PACKAGE)
+PTHREAD="-lm"					AC_SUBST(PTHREAD)
+TEST_ARGS=""					AC_SUBST(TEST_ARGS)
+TEST_DEPS=""					AC_SUBST(TEST_DEPS)
+TEST_LIBS=""					AC_SUBST(TEST_LIBS)
+TINFO_LDFLAGS=''				AC_SUBST(TINFO_LDFLAGS)
+TINFO_LIBS='$(LIBS_CURSES)'		AC_SUBST(TINFO_LIBS)
+cf_cv_abi_version=""			AC_SUBST(cf_cv_abi_version)
+cf_cv_rel_version=""			AC_SUBST(cf_cv_rel_version)
+includesubdir=""				AC_SUBST(includesubdir)
+
+cf_cv_screen=curses
+cf_cv_libtype=
+
+AC_EXEEXT
+AC_OBJEXT
+
+CF_GCC_ATTRIBUTES
+CF_ENABLE_STRING_HACKS
+CF_XOPEN_SOURCE(600)
+CF_SIG_ATOMIC_T
+
+# Work around breakage on OS X
+CF_SIGWINCH
+
+# Checks for CODESET support.
+AM_LANGINFO_CODESET
+
+dnl ---------------------------------------------------------------------------
+CF_PKG_CONFIG
+CF_DISABLE_ECHO
+
+dnl ---------------------------------------------------------------------------
+CF_HELP_MESSAGE(Curses Version-dependent Options:)
+CF_NCURSES_WRAP_PREFIX
+
+AC_MSG_CHECKING(if you want to check for wide-character functions)
+CF_ARG_DISABLE(widec,
+	[  --disable-widec         disable checks for wide-character functions],
+	cf_enable_widec=no,
+	cf_enable_widec=yes,
+	yes)
+AC_MSG_RESULT($cf_enable_widec)
+
+dnl ---------------------------------------------------------------------------
+CF_HELP_MESSAGE(Curses Version-dependent Options:)
+CF_WITH_NCURSES_ETC
+
+case $cf_cv_screen in
+(ncurses*)
+	cf_cv_libtype=`echo "$cf_cv_screen" | sed -e 's/^ncurses//'`
+	;;
+esac
+
+CF_WITH_X11_RGB
+
+dnl If we've not specified a library, assume we're using sysvr4 libraries
+dnl installed conventionally (e.g., SunOS 5.x - solaris).
+
+dnl Autoconf builds up the $LIBS in reverse order
+
+cf_curses_headers=
+
+case $cf_cv_screen in
+(pdcurses)
+	cf_default_panel=no
+	cf_default_form=no
+	cf_default_menu=no
+	cf_default_tinfo=no
+	;;
+(xcurses|bsdcurses)
+	cf_default_panel=no
+	cf_default_form=no
+	cf_default_menu=no
+	cf_default_tinfo=yes
+	;;
+(*)
+	cf_default_panel=yes
+	cf_default_form=yes
+	cf_default_menu=yes
+	cf_default_tinfo=yes
+	case $cf_cv_screen in
+	(ncurses*)
+		cf_curses_headers="nc_alloc.h nomacros.h term_entry.h"
+		;;
+	esac
+	;;
+esac
+
+CF_WITH_LIB_BASENAME(FORM_NAME,form)
+CF_WITH_LIB_BASENAME(MENU_NAME,menu)
+CF_WITH_LIB_BASENAME(PANEL_NAME,panel)
+
+AC_MSG_CHECKING(if you want to check for panel functions)
+CF_ARG_DISABLE(panel,
+	[  --disable-panel         disable checks for panel functions],
+	cf_enable_panel=no,
+	cf_enable_panel=$cf_default_panel,
+	yes)
+AC_MSG_RESULT($cf_enable_panel)
+if test $cf_enable_panel = yes
+then
+	CF_CHECK_CURSES_LIB($PANEL_NAME,$cf_cv_libtype,new_panel,0)
+	cf_curses_headers="$cf_curses_headers panel.h"
+fi
+
+AC_MSG_CHECKING(if you want to check for menu functions)
+CF_ARG_DISABLE(menu,
+	[  --disable-menu          disable checks for menu functions],
+	cf_enable_menu=no,
+	cf_enable_menu=$cf_default_menu,
+	yes)
+AC_MSG_RESULT($cf_enable_menu)
+if test $cf_enable_menu = yes
+then
+	case $cf_cv_screen in
+	(ncurses*)
+		;;
+	(curses*)
+		CF_NETBSD_MENU_H
+		;;
+	esac
+	CF_CHECK_CURSES_LIB($MENU_NAME,$cf_cv_libtype,menu_driver,[0,0])
+	cf_curses_headers="$cf_curses_headers menu.h"
+fi
+
+AC_MSG_CHECKING(if you want to check for form functions)
+CF_ARG_DISABLE(form,
+	[  --disable-form          disable checks for form functions],
+	cf_enable_form=no,
+	cf_enable_form=$cf_default_form,
+	yes)
+AC_MSG_RESULT($cf_enable_form)
+if test $cf_enable_form = yes
+then
+	case $cf_cv_screen in
+	(ncurses*)
+		;;
+	(curses*)
+		CF_NETBSD_FORM_H
+		;;
+	esac
+	CF_CHECK_CURSES_LIB($FORM_NAME,$cf_cv_libtype,form_driver,[0,0])
+	cf_curses_headers="$cf_curses_headers form.h"
+fi
+
+# look for curses-related headers
+AC_CHECK_HEADERS( $cf_curses_headers )
+
+AC_STDC_HEADERS
+AC_HEADER_TIME
+AC_CHECK_HEADERS( \
+getopt.h \
+locale.h \
+math.h \
+stdarg.h \
+stdint.h \
+sys/ioctl.h \
+sys/select.h \
+sys/time.h \
+termios.h \
+unistd.h \
+)
+
+CF_GETOPT_HEADER
+
+AC_CHECK_FUNCS( \
+cfmakeraw \
+getopt \
+gettimeofday \
+snprintf \
+strdup \
+strstr \
+tsearch \
+)
+
+# use a compile-check to work with ncurses*-config and subdirectory includes
+AC_CACHE_CHECK(if we can use termcap.h,cf_cv_have_termcap_h,[
+	AC_TRY_COMPILE([
+#include <curses.h>
+#ifdef NCURSES_VERSION
+#undef NCURSES_VERSION
+#endif
+#include <termcap.h>
+#ifndef NCURSES_VERSION
+#error wrong header
+#endif
+],
+	[return 0;],
+	[cf_cv_have_termcap_h=yes],
+	[cf_cv_have_termcap_h=no])])
+if test "x$cf_cv_have_termcap_h" = xyes
+then
+	AC_DEFINE(HAVE_TERMCAP_H,1,[Define to 1 if we can use termcap.h])
+else
+AC_CACHE_CHECK(if we can use ncurses/termcap.h,cf_cv_have_ncurses_termcap_h,[
+	AC_TRY_COMPILE([
+#include <ncurses/curses.h>
+#ifdef NCURSES_VERSION
+#undef NCURSES_VERSION
+#endif
+#include <ncurses/termcap.h>
+#ifndef NCURSES_VERSION
+#error wrong header
+#endif
+],
+	[return 0;],
+	[cf_cv_have_ncurses_termcap_h=yes],
+	[cf_cv_have_ncurses_termcap_h=no])])
+test "x$cf_cv_have_ncurses_termcap_h" = xyes && AC_DEFINE(HAVE_NCURSES_TERMCAP_H,1,[Define to 1 if we can use ncurses/termcap.h])
+fi
+
+if test "x$ac_cv_func_getopt" = xno; then
+	AC_MSG_ERROR(getopt is required for building programs)
+fi
+
+if test "$cf_enable_widec" = yes; then
+AC_CHECK_FUNCS( \
+mblen \
+mbrlen \
+mbrtowc \
+mbsrtowcs \
+mbstowcs \
+mbtowc \
+wcsrtombs \
+wcstombs \
+)
+fi
+
+CF_CURSES_FUNCS( \
+alloc_pair \
+assume_default_colors \
+chgat \
+color_content \
+color_set \
+copywin \
+curses_trace \
+delscreen \
+dupwin \
+exit_curses \
+exit_terminfo \
+filter \
+getbegx \
+getcurx \
+getmaxx \
+getnstr \
+getparx \
+getwin \
+halfdelay \
+init_extended_color \
+mvderwin \
+mvvline \
+mvwin \
+mvwvline \
+napms \
+newpad \
+putwin \
+reset_color_pairs \
+resize_term \
+resizeterm \
+restartterm \
+ripoffline \
+scr_dump \
+setupterm \
+slk_color \
+slk_init \
+termattrs \
+termname \
+tgetent \
+tigetnum \
+tigetstr \
+tputs_sp \
+typeahead \
+unget_wch \
+use_default_colors \
+use_env \
+use_extended_names \
+use_screen \
+use_window \
+vid_puts \
+vidputs \
+vsscanf \
+vw_printw \
+wchgat \
+winsdelln \
+winsstr \
+wresize \
+wsyncdown \
+_tracef \
+)
+
+CF_TPUTS_PROTO
+CF_NCURSES_EXT_FUNCS
+
+if test "$cf_enable_widec" = yes
+then
+	# workaround for systems with ncurses before 20111029, due to change of
+	# feature test macro from _XPG5 to _XOPEN_SOURCE
+	if test -n "$cf_cv_ncurses_version" && test "x$cf_cv_ncurses_version" != xno
+	then
+		cf_define_xpg5=no
+		AC_MSG_CHECKING(if _XPG5 should be defined to enable wide-characters)
+
+		AC_TRY_COMPILE([
+#include <${cf_cv_ncurses_header:-curses.h}>],
+			[int x = _XPG5],,
+			[cf_save_cppflags="$CPPFLAGS"
+			 CPPFLAGS="$CPPFLAGS -D_XPG5"
+			 AC_TRY_COMPILE([
+#include <${cf_cv_ncurses_header:-curses.h}>],
+				[int x = _XPG5],
+				[cf_define_xpg5=yes])
+			 CPPFLAGS="$cf_save_cppflags"])
+		AC_MSG_RESULT($cf_define_xpg5)
+
+		if test "$cf_define_xpg5" = yes
+		then
+			CPPFLAGS="$CPPFLAGS -D_XPG5"
+		fi
+	fi
+
+	AC_CACHE_CHECK(for wide-character functions,cf_cv_widechar_funcs,[
+	AC_TRY_LINK([
+#include <${cf_cv_ncurses_header:-curses.h}>],
+	[
+		static wchar_t src_wchar[2];
+		static cchar_t dst_cchar;
+		setcchar(&dst_cchar, src_wchar, A_NORMAL, 0, (void *) 0);
+		],
+		[cf_cv_widechar_funcs=yes],
+		[cf_cv_widechar_funcs=no])
+	])
+	if test "$cf_cv_widechar_funcs" != no ; then
+		AC_DEFINE(USE_WIDEC_SUPPORT,1,[Define to 1 to enable wide-character support in (n)curses])
+	else
+		AC_DEFINE(USE_WIDEC_SUPPORT,0)
+	fi
+else
+	AC_DEFINE(USE_WIDEC_SUPPORT,0)
+fi
+
+AC_CACHE_CHECK(if $cf_cv_screen library uses pthreads,cf_cv_use_pthreads,[
+AC_TRY_LINK([
+#include <${cf_cv_ncurses_header:-curses.h}>
+extern void _nc_init_pthreads(void);
+],
+[
+	initscr();
+	_nc_init_pthreads();
+	],
+	[cf_cv_use_pthreads=yes],
+	[cf_cv_use_pthreads=no])
+])
+test $cf_cv_use_pthreads = yes && AC_DEFINE(USE_PTHREADS,1,[Define to 1 if $cf_cv_screen library uses pthreads])
+
+CF_SYS_TIME_SELECT
+
+# special check for test/ditto.c
+CF_FUNC_OPENPTY
+if test "$cf_cv_func_openpty" != no ; then
+	AC_DEFINE_UNQUOTED(USE_OPENPTY_HEADER,<$cf_cv_func_openpty>,[Define to actual header for openpty function])
+	AC_DEFINE(USE_XTERM_PTY,1,[Define to 1 if we should assume xterm pseudoterminal interface])
+	if test "x$cf_cv_lib_util" = xyes ; then
+		CF_ADD_LIB(util,TEST_LIBS)
+	fi
+fi
+
+CF_FUNC_CURSES_VERSION
+
+CF_CURSES_ACS_MAP
+if test "$cf_enable_widec" = yes; then
+	CF_CURSES_WACS_MAP
+	CF_CURSES_WACS_SYMBOLS
+fi
+
+CF_CURSES_CHECK_TYPE(attr_t,long)
+
+if test "$cf_enable_widec" = yes; then
+	CF_WCHAR_TYPE(mbstate_t, NCURSES_MBSTATE_T, NCURSES_OK_MBSTATE_T)
+	CF_WCHAR_TYPE(wchar_t,   NCURSES_WCHAR_T,   NCURSES_OK_WCHAR_T)
+	CF_WCHAR_TYPE(wint_t,    NCURSES_WINT_T,    NCURSES_OK_WINT_T)
+
+	if test "$NCURSES_OK_MBSTATE_T" = 0 ; then
+		CF_CURSES_CHECK_TYPE(mbstate_t,long)
+	fi
+
+	if test "$NCURSES_OK_WCHAR_T" = 0 ; then
+		CF_CURSES_CHECK_TYPE(wchar_t,long)
+	fi
+
+	if test "$NCURSES_OK_WINT_T" = 0 ; then
+		CF_CURSES_CHECK_TYPE(wint_t,long)
+	fi
+fi
+
+CF_CURSES_CHECK_DATA(\
+TABSIZE \
+curscr \
+ospeed \
+boolnames \
+boolfnames \
+ttytype)
+
+dnl ---------------------------------------------------------------------------
+CF_HELP_MESSAGE(Testing/development Options:)
+CF_WITH_SCREEN_PDCURSES
+CF_ENABLE_WARNINGS(Wno-unknown-pragmas)
+CF_DISABLE_LEAKS
+CF_DISABLE_RPATH_HACK
+
+TEST_ARGS="$LIBS"
+LIBS=
+
+dnl ---------------------------------------------------------------------------
+
+AC_OUTPUT(Makefile,[
+CF_PRG_RULES([$srcdir/mk-test.awk INSTALL=yes ECHO_LINK="$ECHO_LD"], .)
+	cat >>Makefile <<TEST_EOF
+
+# These rules are generated so we do not rely on suffix rules, which do not
+# work consistently for different make-programs (the '\$(MODEL)/' confuses
+# some, and the '\$x' confuses others).
+TEST_EOF
+
+LIST=`sed -e 's/[[ 	]].*//' -e '/^[[#@]]/d' $srcdir/modules`
+for N in $LIST
+do
+	cat >>Makefile <<TEST_EOF
+
+\$(MODEL)/$N.o : \$(srcdir)/$N.c \\
+	\$(srcdir)/test.priv.h \\
+	ncurses_cfg.h
+	$SHOW_CC
+	$ECHO_CC\$(CC) -c \$(CFLAGS_DEFAULT) -DMODULE_NAME="$N" \$(srcdir)/$N.c
+TEST_EOF
+done
+
+if test -f ../config.guess && test -f ../config.sub
+then
+	cat >>Makefile <<TEST_EOF
+
+# if we used CF_INHERIT for getting these files, we can remove them
+distclean::
+	rm -f config.guess config.sub
+TEST_EOF
+fi
+],[
+AWK="$AWK"
+ECHO_CC="$ECHO_CC"
+ECHO_LD="$ECHO_LD"
+SHOW_CC="$SHOW_LD"
+],cat)
diff --git a/test/demo_altkeys.c b/test/demo_altkeys.c
new file mode 100644
index 0000000..ed36b4c
--- /dev/null
+++ b/test/demo_altkeys.c
@@ -0,0 +1,194 @@
+/****************************************************************************
+ * Copyright 2018-2020,2022 Thomas E. Dickey                                *
+ * Copyright 2005-2016,2017 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: demo_altkeys.c,v 1.16 2022/12/10 23:31:31 tom Exp $
+ *
+ * Demonstrate the define_key() function.
+ * Thomas Dickey - 2005/10/22
+ */
+
+#define NEED_TIME_H
+#include <test.priv.h>
+
+#if defined(NCURSES_VERSION) && NCURSES_EXT_FUNCS
+
+#define MY_LOGFILE "demo_altkeys.log"
+#define MY_KEYS (KEY_MAX + 1)
+
+/*
+ * Log the most recently-written line to our logfile
+ */
+static void
+log_last_line(WINDOW *win)
+{
+    FILE *fp;
+
+    if ((fp = fopen(MY_LOGFILE, "a")) != 0) {
+	char temp[256];
+	int y, x, n;
+	int need = sizeof(temp) - 1;
+
+	if (need > COLS)
+	    need = COLS;
+	getyx(win, y, x);
+	wmove(win, y - 1, 0);
+	n = winnstr(win, temp, need);
+	while (n-- > 0) {
+	    if (isspace(UChar(temp[n])))
+		temp[n] = '\0';
+	    else
+		break;
+	}
+	wmove(win, y, x);
+	fprintf(fp, "%s\n", temp);
+	fclose(fp);
+    }
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: demo_altkeys [options]"
+	,""
+	,USAGE_COMMON
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int n;
+    int ch;
+#if HAVE_GETTIMEOFDAY
+    struct timeval previous;
+#endif
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) {
+	switch (ch) {
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind < argc)
+	usage(FALSE);
+
+    unlink(MY_LOGFILE);
+
+    setlocale(LC_ALL, "");
+    if (newterm(0, stdout, stdin) == 0) {
+	fprintf(stderr, "Cannot initialize terminal\n");
+	ExitProgram(EXIT_FAILURE);
+    }
+    (void) cbreak();		/* take input chars one at a time, no wait for \n */
+    (void) noecho();		/* don't echo input */
+
+    scrollok(stdscr, TRUE);
+    keypad(stdscr, TRUE);
+    move(0, 0);
+
+    /* we do the define_key() calls after keypad(), since the first call to
+     * keypad() initializes the corresponding data.
+     */
+    for (n = 0; n < 255; ++n) {
+	char temp[10];
+	_nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) "\033%c", n);
+	define_key(temp, n + MY_KEYS);
+    }
+    for (n = KEY_MIN; n < KEY_MAX; ++n) {
+	char *value;
+	if ((value = keybound(n, 0)) != 0) {
+	    size_t need = strlen(value) + 2;
+	    char *temp = typeMalloc(char, need);
+	    _nc_SPRINTF(temp, _nc_SLIMIT(need) "\033%s", value);
+	    define_key(temp, n + MY_KEYS);
+	    free(temp);
+	    free(value);
+	}
+    }
+
+#if HAVE_GETTIMEOFDAY
+    gettimeofday(&previous, 0);
+#endif
+
+    while ((ch = getch()) != ERR) {
+	bool escaped = (ch >= MY_KEYS);
+	const char *name = keyname(escaped ? (ch - MY_KEYS) : ch);
+#if HAVE_GETTIMEOFDAY
+	int secs, msecs;
+	struct timeval current;
+
+	gettimeofday(&current, 0);
+	secs = (int) (current.tv_sec - previous.tv_sec);
+	msecs = (int) ((current.tv_usec - previous.tv_usec) / 1000);
+	if (msecs < 0) {
+	    msecs += 1000;
+	    --secs;
+	}
+	if (msecs >= 1000) {
+	    secs += msecs / 1000;
+	    msecs %= 1000;
+	}
+	printw("%6d.%03d ", secs, msecs);
+	previous = current;
+#endif
+	printw("Keycode %d, name %s%s\n",
+	       ch,
+	       escaped ? "ESC-" : "",
+	       name != 0 ? name : "<null>");
+	log_last_line(stdscr);
+	clrtoeol();
+	if (ch == 'q')
+	    break;
+    }
+    endwin();
+    ExitProgram(EXIT_SUCCESS);
+}
+#else
+int
+main(void)
+{
+    printf("This program requires the ncurses library\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif
diff --git a/test/demo_defkey.c b/test/demo_defkey.c
new file mode 100644
index 0000000..44d60dc
--- /dev/null
+++ b/test/demo_defkey.c
@@ -0,0 +1,320 @@
+/****************************************************************************
+ * Copyright 2018-2020,2022 Thomas E. Dickey                                *
+ * Copyright 2002-2016,2017 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: demo_defkey.c,v 1.33 2022/12/10 23:31:31 tom Exp $
+ *
+ * Demonstrate the define_key() function.
+ * Thomas Dickey - 2002/11/23
+ */
+
+#include <test.priv.h>
+
+#if defined(NCURSES_VERSION) && NCURSES_EXT_FUNCS
+
+#define MY_LOGFILE "demo_defkey.log"
+
+/*
+ * Log the most recently-written line to our logfile
+ */
+static void
+log_last_line(WINDOW *win)
+{
+    FILE *fp;
+
+    if ((fp = fopen(MY_LOGFILE, "a")) != 0) {
+	char temp[256];
+	int y, x, n;
+	int need = sizeof(temp) - 1;
+	if (need > COLS)
+	    need = COLS;
+	getyx(win, y, x);
+	wmove(win, y - 1, 0);
+	n = winnstr(win, temp, need);
+	while (n-- > 0) {
+	    if (isspace(UChar(temp[n])))
+		temp[n] = '\0';
+	    else
+		break;
+	}
+	wmove(win, y, x);
+	fprintf(fp, "%s\n", temp);
+	fclose(fp);
+    }
+}
+
+/*
+ * Convert a character to visible form.
+ */
+static char *
+visichar(int ch)
+{
+    static char temp[20];
+
+    ch = UChar(ch);
+    assert(ch >= 0 && ch < 256);
+    if (ch == '\\') {
+	_nc_STRCPY(temp, "\\\\", sizeof(temp));
+    } else if (ch == '\033') {
+	_nc_STRCPY(temp, "\\E", sizeof(temp));
+    } else if (ch < ' ') {
+	_nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) "\\%03o", ch);
+    } else if (ch >= 127) {
+	_nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) "\\%03o", ch);
+    } else {
+	_nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) "%c", ch);
+    }
+    return temp;
+}
+
+/*
+ * Convert a string to visible form.
+ */
+static char *
+visible(const char *string)
+{
+    char *result = 0;
+
+    if (string != 0 && *string != '\0') {
+	int pass;
+	int n;
+	size_t need = 1;
+
+	for (pass = 0; pass < 2; ++pass) {
+	    for (n = 0; string[n] != '\0'; ++n) {
+		char temp[80];
+		_nc_STRNCPY(temp, visichar(string[n]), sizeof(temp) - 2);
+		if (pass) {
+		    _nc_STRCAT(result, temp, need);
+		} else {
+		    need += strlen(temp);
+		}
+	    }
+	    if (!pass)
+		result = typeCalloc(char, need);
+	}
+    } else {
+	result = typeCalloc(char, (size_t) 1);
+    }
+    return result;
+}
+
+static void
+really_define_key(WINDOW *win, const char *new_string, int code)
+{
+    int rc;
+    const char *code_name = keyname(code);
+    char *old_string;
+    char *vis_string = 0;
+    char temp[80];
+
+    if (code_name == 0) {
+	_nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) "Keycode %d", code);
+	code_name = temp;
+    }
+
+    if ((old_string = keybound(code, 0)) != 0) {
+	wprintw(win, "%s is %s\n",
+		code_name,
+		vis_string = visible(old_string));
+    } else {
+	wprintw(win, "%s is not bound\n",
+		code_name);
+    }
+    log_last_line(win);
+
+    if (vis_string != 0) {
+	free(vis_string);
+	vis_string = 0;
+    }
+
+    vis_string = visible(new_string);
+    if ((rc = key_defined(new_string)) > 0) {
+	wprintw(win, "%s was bound to %s\n", vis_string, keyname(rc));
+	log_last_line(win);
+    } else if (new_string != 0 && rc < 0) {
+	wprintw(win, "%s conflicts with longer strings\n", vis_string);
+	log_last_line(win);
+    }
+    rc = define_key(new_string, code);
+    if (rc == ERR) {
+	wprintw(win, "%s unchanged\n", code_name);
+	log_last_line(win);
+    } else if (new_string != 0) {
+	wprintw(win, "%s is now bound to %s\n",
+		vis_string,
+		code_name);
+	log_last_line(win);
+    } else if (old_string != 0) {
+	wprintw(win, "%s deleted\n", code_name);
+	log_last_line(win);
+    }
+    if (vis_string != 0)
+	free(vis_string);
+    if (old_string != 0)
+	free(old_string);
+}
+
+static void
+duplicate(WINDOW *win, NCURSES_CONST char *name, int code)
+{
+    char *value = tigetstr(name);
+
+    if (value != 0) {
+	const char *prefix = 0;
+
+	if (!(strncmp) (value, "\033[", (size_t) 2)) {
+	    prefix = "\033O";
+	} else if (!(strncmp) (value, "\033O", (size_t) 2)) {
+	    prefix = "\033[";
+	}
+	if (prefix != 0) {
+	    char temp[BUFSIZ];
+	    _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp))
+			"%s%s", prefix, value + 2);
+	    really_define_key(win, temp, code);
+	}
+    }
+}
+
+static void
+redefine(WINDOW *win, char *string, int code)
+{
+    really_define_key(win, string, code);
+}
+
+static void
+remove_definition(WINDOW *win, int code)
+{
+    really_define_key(win, 0, code);
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: demo_defkey [options]"
+	,""
+	,USAGE_COMMON
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    char *fkeys[12];
+    int n;
+    int ch;
+    WINDOW *win;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) {
+	switch (ch) {
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind < argc)
+	usage(FALSE);
+
+    unlink(MY_LOGFILE);
+
+    setlocale(LC_ALL, "");
+    initscr();
+    (void) cbreak();		/* take input chars one at a time, no wait for \n */
+    (void) noecho();		/* don't echo input */
+
+    printw("This demo is best on xterm: it reverses the definitions for f1-f12,\n");
+    printw("adds duplicate definitions for cursor application and normal modes,\n");
+    printw("and removes any definitions for the mini keypad.  Type any of those:\n");
+    refresh();
+
+    win = newwin(LINES - 3, COLS, 3, 0);
+    scrollok(win, TRUE);
+    keypad(win, TRUE);
+    wmove(win, 0, 0);
+
+    /* we do the define_key() calls after keypad(), since the first call to
+     * keypad() initializes the corresponding data.
+     */
+    for (n = 0; n < 12; ++n) {
+	char name[20];
+	_nc_SPRINTF(name, _nc_SLIMIT(sizeof(name)) "kf%d", n + 1);
+	fkeys[n] = tigetstr(name);
+    }
+    for (n = 0; n < 12; ++n) {
+	redefine(win, fkeys[11 - n], KEY_F(n + 1));
+    }
+
+    duplicate(win, "kcub1", KEY_LEFT);
+    duplicate(win, "kcuu1", KEY_UP);
+    duplicate(win, "kcud1", KEY_DOWN);
+    duplicate(win, "kcuf1", KEY_RIGHT);
+
+    remove_definition(win, KEY_A1);
+    remove_definition(win, KEY_A3);
+    remove_definition(win, KEY_B2);
+    remove_definition(win, KEY_C1);
+    remove_definition(win, KEY_C3);
+
+    really_define_key(win, "\033O", 1023);
+
+    while ((ch = wgetch(win)) != ERR) {
+	const char *name = keyname(ch);
+	wprintw(win, "Keycode %d, name %s\n",
+		ch,
+		name != 0 ? name : "<null>");
+	log_last_line(win);
+	wclrtoeol(win);
+	if (ch == 'q')
+	    break;
+    }
+    endwin();
+    ExitProgram(EXIT_SUCCESS);
+}
+#else
+int
+main(void)
+{
+    printf("This program requires the ncurses library\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif
diff --git a/test/demo_forms.c b/test/demo_forms.c
new file mode 100644
index 0000000..8e83125
--- /dev/null
+++ b/test/demo_forms.c
@@ -0,0 +1,651 @@
+/****************************************************************************
+ * Copyright 2018-2020,2022 Thomas E. Dickey                                *
+ * Copyright 2003-2016,2017 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: demo_forms.c,v 1.61 2022/12/04 00:40:11 tom Exp $
+ *
+ * Demonstrate a variety of functions from the form library.
+ * Thomas Dickey - 2003/4/26
+ */
+
+#include <test.priv.h>
+
+#if USE_LIBFORM
+
+#include <edit_field.h>
+
+typedef struct {
+    char *name;
+    char *value;
+} MY_DATA;
+
+static MY_DATA *my_data;
+
+static int d_option = 0;
+static int j_value = 0;
+static int m_value = 0;
+static int o_value = 0;
+static char *t_value = 0;
+
+static void
+failed(const char *s)
+{
+    perror(s);
+    ExitProgram(EXIT_FAILURE);
+}
+
+static void
+chomp(char *value)
+{
+    size_t have = strlen(value);
+    while (have != 0 && (value[have - 1] == '\n' || value[have - 1] == '\r')) {
+	value[--have] = '\0';
+    }
+}
+
+static int
+trimmed(const char *value)
+{
+    int result = (int) strlen(value);
+    while (result > 0 && isspace(UChar(value[result - 1]))) {
+	--result;
+    }
+    return result;
+}
+
+static char *
+get_data(const char *name)
+{
+    char *result = t_value;
+    if (my_data != 0) {
+	int n;
+	for (n = 0; my_data[n].name != 0; ++n) {
+	    if (!strcmp(name, my_data[n].name)) {
+		result = my_data[n].value;
+		break;
+	    }
+	}
+    }
+    return result;
+}
+
+/*
+ * Read (possibly) multi-line data with name+value pairs.
+ */
+static void
+read_data(const char *filename)
+{
+    FILE *fp = fopen(filename, "r");
+
+    if (fp != 0) {
+	char buffer[BUFSIZ];
+	char *colon;
+	int more = 0;
+	int item = 0;
+
+	my_data = typeCalloc(MY_DATA, (size_t) 100);	/* FIXME */
+	while (fgets(buffer, sizeof(buffer), fp) != 0) {
+	    chomp(buffer);
+	    if (more) {
+		if (strcmp(buffer, ".")) {
+		    char *prior = my_data[more - 1].value;
+		    size_t need = strlen(buffer) + 2 + strlen(prior);
+		    char *value = typeRealloc(char, need, prior);
+		    if (value == 0)
+			failed("realloc");
+		    _nc_STRCAT(value, "\n", need);
+		    _nc_STRCAT(value, buffer, need);
+		    my_data[more - 1].value = value;
+		} else {
+		    more = 0;
+		}
+	    } else if (*buffer == '#') {
+		continue;
+	    } else if ((colon = strchr(buffer, ':')) != 0) {
+		char *name;
+		char *value;
+		*colon++ = '\0';
+		name = strdup(buffer);
+		value = strdup(colon);
+		if (name == 0 || value == 0)
+		    failed("strdup");
+		my_data[item].name = name;
+		my_data[item].value = value;
+		more = ++item;
+	    } else {
+		failed("expected a colon");
+	    }
+	}
+	fclose(fp);
+    } else {
+	failed(filename);
+    }
+}
+
+static FIELD *
+make_label(const char *label, int frow, int fcol)
+{
+    FIELD *f = new_field(1, (int) strlen(label), frow, fcol, 0, 0);
+
+    if (f) {
+	set_field_buffer(f, 0, label);
+	set_field_opts(f, (int) ((unsigned) field_opts(f) & ~O_ACTIVE));
+    }
+    return (f);
+}
+
+/*
+ * Define each field with an extra one, for reflecting "actual" text.
+ */
+static FIELD *
+make_field(const char *label, int frow, int fcol, int rows, int cols)
+{
+    FIELD *f = new_field(rows, cols, frow, fcol, o_value, 1);
+
+    if (f) {
+	set_field_back(f, A_UNDERLINE);
+	/*
+	 * If -j and -d options are combined, -j loses.  It is documented in
+	 * "Character User Interface Programming", page 12-15 that setting
+	 * O_STATIC off makes the form library ignore justification.
+	 */
+	set_field_just(f, j_value);
+	if (d_option) {
+	    if (has_colors()) {
+		set_field_fore(f, (chtype) COLOR_PAIR(2));
+		set_field_back(f, (A_UNDERLINE | (chtype) COLOR_PAIR(3)));
+	    } else {
+		set_field_fore(f, A_BOLD);
+	    }
+	    /*
+	     * The field_opts_off() call dumps core with Solaris curses,
+	     * but that is a known bug in Solaris' form library -TD
+	     */
+	    field_opts_off(f, O_STATIC);
+	    set_max_field(f, m_value);
+	}
+
+	init_edit_field(f, get_data(label));
+    }
+    return (f);
+}
+
+static void
+display_form(FORM *f)
+{
+    WINDOW *w;
+    int rows, cols;
+
+    scale_form(f, &rows, &cols);
+
+    /*
+     * Put the form at the upper-left corner of the display, with just a box
+     * around it.
+     */
+    if ((w = newwin(rows + 2, cols + 4, 0, 0)) != (WINDOW *) 0) {
+	set_form_win(f, w);
+	set_form_sub(f, derwin(w, rows, cols, 1, 2));
+	box(w, 0, 0);
+	keypad(w, TRUE);
+
+	if (post_form(f) != E_OK)
+	    wrefresh(w);
+    }
+}
+
+static void
+erase_form(FORM *f)
+{
+    WINDOW *w = form_win(f);
+    WINDOW *s = form_sub(f);
+
+    unpost_form(f);
+    werase(w);
+    wrefresh(w);
+    delwin(s);
+    delwin(w);
+}
+
+static void
+show_insert_mode(bool insert_mode)
+{
+    MvAddStr(5, 57, (insert_mode
+		     ? "form_status: insert "
+		     : "form_status: overlay"));
+}
+
+#define O_SELECTABLE (O_ACTIVE | O_VISIBLE)
+
+static FIELD *
+another_field(FORM *form, FIELD *field)
+{
+    FIELD **f = form_fields(form);
+    FIELD *result = 0;
+    int n;
+
+    for (n = 0; f[n] != 0; ++n) {
+	if (f[n] != field) {
+	    result = f[n];
+	    field_opts_on(result, O_SELECTABLE);
+	    break;
+	}
+    }
+    return result;
+}
+
+static int
+my_form_driver(FORM *form, int c)
+{
+    static bool insert_mode = TRUE;
+    FIELD *field;
+
+    switch (c) {
+    case MY_QUIT:
+	if (form_driver(form, REQ_VALIDATION) == E_OK)
+	    return (TRUE);
+	break;
+    case MY_HELP:
+	help_edit_field();
+	break;
+    case MY_EDT_MODE:
+	if ((field = current_field(form)) != 0) {
+	    set_current_field(form, another_field(form, field));
+	    if ((unsigned) field_opts(field) & O_EDIT) {
+		field_opts_off(field, O_EDIT);
+		set_field_status(field, 0);
+	    } else {
+		field_opts_on(field, O_EDIT);
+	    }
+	    set_current_field(form, field);
+	}
+	break;
+    case MY_INS_MODE:
+	/* there should be a form_status() function, but there is none */
+	if (!insert_mode) {
+	    if (form_driver(form, REQ_INS_MODE) == E_OK) {
+		insert_mode = TRUE;
+	    }
+	} else {
+	    if (form_driver(form, REQ_OVL_MODE) == E_OK) {
+		insert_mode = FALSE;
+	    }
+	}
+	show_insert_mode(insert_mode);
+	refresh();
+	break;
+    default:
+	beep();
+	break;
+    }
+    return (FALSE);
+}
+
+static void
+show_current_field(WINDOW *win, FORM *form)
+{
+    FIELD *field;
+    int field_rows, field_cols, field_max;
+    int currow, curcol;
+
+    if (has_colors()) {
+	wbkgd(win, (chtype) COLOR_PAIR(1));
+    }
+    werase(win);
+    form_getyx(form, currow, curcol);
+    wprintw(win, "Cursor: %d,%d", currow, curcol);
+    if (data_ahead(form))
+	waddstr(win, " ahead");
+    if (data_behind(form))
+	waddstr(win, " behind");
+    waddch(win, '\n');
+
+    if ((field = current_field(form)) != 0) {
+	FIELDTYPE *type;
+	int nbuf;
+
+	wprintw(win, "Page %d%s, Field %d/%d%s:",
+		form_page(form),
+		new_page(field) ? "*" : "",
+		field_index(field), field_count(form),
+		field_arg(field) ? "(arg)" : "");
+	if ((type = field_type(field)) != 0) {
+	    if (type == TYPE_ALNUM)
+		waddstr(win, "ALNUM");
+	    else if (type == TYPE_ALPHA)
+		waddstr(win, "ALPHA");
+	    else if (type == TYPE_ENUM)
+		waddstr(win, "ENUM");
+	    else if (type == TYPE_INTEGER)
+		waddstr(win, "INTEGER");
+#ifdef NCURSES_VERSION
+	    else if (type == TYPE_IPV4)
+		waddstr(win, "IPV4");
+#endif
+	    else if (type == TYPE_NUMERIC)
+		waddstr(win, "NUMERIC");
+	    else if (type == TYPE_REGEXP)
+		waddstr(win, "REGEXP");
+	    else
+		waddstr(win, "other");
+	}
+
+	if ((unsigned) field_opts(field) & O_EDIT)
+	    waddstr(win, " editable");
+	else
+	    waddstr(win, " readonly");
+
+	if (field_status(field))
+	    waddstr(win, " modified");
+
+	if (dynamic_field_info(field, &field_rows, &field_cols, &field_max)
+	    != ERR) {
+	    wprintw(win, " size %dx%d (max %d)",
+		    field_rows, field_cols, field_max);
+	}
+
+	waddch(win, ' ');
+	(void) wattrset(win, AttrArg(field_fore(field), 0));
+	waddstr(win, "fore");
+	wattroff(win, (int) field_fore(field));
+
+	waddch(win, '/');
+
+	(void) wattrset(win, AttrArg(field_back(field), 0));
+	waddstr(win, "back");
+	wattroff(win, (int) field_back(field));
+
+	wprintw(win, ", pad '%c'", field_pad(field));
+
+	waddstr(win, "\n");
+	for (nbuf = 0; nbuf <= 2; ++nbuf) {
+	    char *buffer;
+	    if ((buffer = field_buffer(field, nbuf)) != 0) {
+		wprintw(win, "buffer %d:", nbuf);
+		(void) wattrset(win, A_REVERSE);
+		if (nbuf) {
+		    waddnstr(win, buffer, trimmed(buffer));
+		} else {
+		    waddstr(win, buffer);
+		}
+		wattroff(win, A_REVERSE);
+		waddstr(win, "\n");
+	    }
+	}
+    }
+    wrefresh(win);
+}
+
+static void
+demo_forms(void)
+{
+    FORM *form;
+    FIELD *f[100];		/* will memset to zero */
+    int c;
+    unsigned n = 0;
+    int pg;
+    const char *fname;
+    static const char *my_enum[] =
+    {"first", "second", "third", 0};
+
+#ifdef NCURSES_MOUSE_VERSION
+    mousemask(ALL_MOUSE_EVENTS, (mmask_t *) 0);
+#endif
+
+    help_edit_field();
+
+    MvAddStr(4, 57, "Forms Entry Test");
+    show_insert_mode(TRUE);
+
+    refresh();
+
+    /* describe the form */
+    memset(f, 0, sizeof(f));
+    for (pg = 0; pg < 4; ++pg) {
+	char label[80];
+	_nc_SPRINTF(label, _nc_SLIMIT(sizeof(label))
+		    "Sample Form Page %d", pg + 1);
+	f[n++] = make_label(label, 0, 15);
+	set_new_page(f[n - 1], TRUE);
+
+	switch (pg) {
+	default:
+	    fname = "Last Name";
+	    f[n++] = make_label(fname, 2, 0);
+	    f[n++] = make_field(fname, 3, 0, 1, 18);
+	    set_field_type(f[n - 1], TYPE_ALPHA, 1);
+
+	    fname = "First Name";
+	    f[n++] = make_label(fname, 2, 20);
+	    f[n++] = make_field(fname, 3, 20, 1, 12);
+	    set_field_type(f[n - 1], TYPE_ALPHA, 1);
+
+	    fname = "Middle Name";
+	    f[n++] = make_label(fname, 2, 34);
+	    f[n++] = make_field(fname, 3, 34, 1, 12);
+	    set_field_type(f[n - 1], TYPE_ALPHA, 1);
+	    break;
+
+	case 1:
+	    fname = "Last Name";
+	    f[n++] = make_label(fname, 2, 0);
+	    f[n++] = make_field(fname, 3, 0, 1, 12);
+	    set_field_type(f[n - 1], TYPE_ALPHA, 1);
+
+	    fname = "First Name";
+	    f[n++] = make_label(fname, 2, 14);
+	    f[n++] = make_field(fname, 3, 14, 1, 12);
+	    set_field_type(f[n - 1], TYPE_ALPHA, 1);
+
+	    fname = "MI";
+	    f[n++] = make_label(fname, 2, 28);
+	    f[n++] = make_field(fname, 3, 28, 1, 1);
+	    set_field_pad(f[n - 1], '?');
+	    set_field_type(f[n - 1], TYPE_ALPHA, 1);
+
+	    fname = "First/Second/Third";
+	    f[n++] = make_label(fname, 2, 32);
+	    f[n++] = make_field(fname, 3, 32, 1, 12);
+	    set_field_type(f[n - 1], TYPE_ENUM, my_enum, 0, 0);
+	    break;
+
+	case 2:
+	    fname = "Host Name";
+	    f[n++] = make_label(fname, 2, 0);
+	    f[n++] = make_field(fname, 3, 0, 1, 24);
+	    set_field_type(f[n - 1], TYPE_ALNUM, 1);
+
+#ifdef NCURSES_VERSION
+	    fname = "IP Address";
+	    f[n++] = make_label(fname, 2, 26);
+	    f[n++] = make_field(fname, 3, 26, 1, 16);
+	    set_field_type(f[n - 1], TYPE_IPV4, 1);
+#endif
+	    break;
+
+	case 3:
+	    fname = "Four digits";
+	    f[n++] = make_label(fname, 2, 0);
+	    f[n++] = make_field(fname, 3, 0, 1, 10);
+	    set_field_type(f[n - 1], TYPE_INTEGER, 4, 0, 0);
+
+	    fname = "Numeric";
+	    f[n++] = make_label(fname, 2, 13);
+	    f[n++] = make_field(fname, 3, 13, 1, 12);
+	    set_field_type(f[n - 1], TYPE_NUMERIC, 3, -10000.0, 100000000.0);
+
+	    fname = "Phone number";
+	    f[n++] = make_label(fname, 2, 27);
+	    f[n++] = make_field(fname, 3, 27, 1, 16);
+	    set_field_type(f[n - 1], TYPE_REGEXP,
+			   "^([0-9]-)?[0-9]{3}-[0-9]{3}-[0-9]{4} *$");;
+	    break;
+	}
+
+	fname = "Comments";
+	f[n++] = make_label(fname, 5, 0);
+	f[n++] = make_field(fname, 6, 0, 4, 46);
+	init_edit_field(f[n - 1], get_data(fname));
+    }
+
+    f[n] = (FIELD *) 0;
+
+    if ((form = new_form(f)) != 0) {
+	WINDOW *w;
+	WINDOW *also;
+	int finished = 0;
+
+	display_form(form);
+
+	w = form_win(form);
+	also = newwin(getmaxy(stdscr) - getmaxy(w), COLS, getmaxy(w), 0);
+	show_current_field(also, form);
+
+	while (!finished) {
+	    switch (edit_field(form, &c)) {
+	    case E_OK:
+		break;
+	    case E_UNKNOWN_COMMAND:
+		finished = my_form_driver(form, c);
+		break;
+	    default:
+		beep();
+		break;
+	    }
+	    show_current_field(also, form);
+	}
+
+	erase_form(form);
+
+	free_form(form);
+    }
+    for (c = 0; f[c] != 0; c++) {
+	free_edit_field(f[c]);
+	free_field(f[c]);
+    }
+    noraw();
+    nl();
+
+#ifdef NCURSES_MOUSE_VERSION
+    mousemask(0, (mmask_t *) 0);
+#endif
+}
+
+static void
+usage(int ok)
+{
+    static const char *tbl[] =
+    {
+	"Usage: demo_forms [options] [data file]"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+	," -d       make fields dynamic"
+	," -j NUM   justify (1=left, 2=center, 3=right)"
+	," -m NUM   set maximum size of dynamic fields"
+	," -o NUM   specify number of offscreen rows in new_field()"
+	," -t NUM   specify text to fill fields initially"
+    };
+    unsigned int j;
+    for (j = 0; j < SIZEOF(tbl); ++j)
+	fprintf(stderr, "%s\n", tbl[j]);
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+
+    setlocale(LC_ALL, "");
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "dj:m:o:t:")) != -1) {
+	switch (ch) {
+	case 'd':
+	    d_option = TRUE;
+	    break;
+	case 'j':
+	    j_value = atoi(optarg);
+	    if (j_value < NO_JUSTIFICATION
+		|| j_value > JUSTIFY_RIGHT)
+		usage(FALSE);
+	    break;
+	case 'm':
+	    m_value = atoi(optarg);
+	    break;
+	case 'o':
+	    o_value = atoi(optarg);
+	    break;
+	case 't':
+	    t_value = optarg;
+	    break;
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    while (optind < argc) {
+	read_data(argv[optind++]);
+    }
+
+    initscr();
+    cbreak();
+    noecho();
+    raw();
+    nonl();			/* lets us read ^M's */
+    intrflush(stdscr, FALSE);
+    keypad(stdscr, TRUE);
+
+    if (has_colors()) {
+	start_color();
+	init_pair(1, COLOR_WHITE, COLOR_BLUE);
+	init_pair(2, COLOR_GREEN, COLOR_BLACK);
+	init_pair(3, COLOR_CYAN, COLOR_BLACK);
+	bkgd((chtype) COLOR_PAIR(1));
+	refresh();
+    }
+
+    demo_forms();
+
+    endwin();
+    ExitProgram(EXIT_SUCCESS);
+}
+
+#else
+int
+main(void)
+{
+    printf("This program requires the curses form library\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif
diff --git a/test/demo_forms.txt b/test/demo_forms.txt
new file mode 100644
index 0000000..0763fc0
--- /dev/null
+++ b/test/demo_forms.txt
@@ -0,0 +1,20 @@
+# $Id: demo_forms.txt,v 1.3 2013/06/08 14:10:15 tom Exp $
+First Name:John
+.
+Middle Name:Don
+.
+MI:D
+.
+Last Name:Smith
+.
+Comments:Hello
+World!
+.
+Host Name:localhost@localdomain
+.
+IP Address:192.168.1.100
+.
+Four digits:1234
+.
+Numeric:32768
+.
diff --git a/test/demo_keyok.c b/test/demo_keyok.c
new file mode 100644
index 0000000..8f4ae90
--- /dev/null
+++ b/test/demo_keyok.c
@@ -0,0 +1,121 @@
+/****************************************************************************
+ * Copyright 2020,2022 Thomas E. Dickey                                     *
+ * Copyright 2002-2006,2017 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: demo_keyok.c,v 1.9 2022/12/10 23:31:31 tom Exp $
+ *
+ * Demonstrate the keyok() function.
+ * Thomas Dickey - 2002/11/23
+ */
+
+#include <test.priv.h>
+
+#if defined(NCURSES_VERSION) && NCURSES_EXT_FUNCS
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: demo_keyok [options]"
+	,""
+	,USAGE_COMMON
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int lastch = ERR;
+    int prior = ERR;
+    int ch;
+    WINDOW *win;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) {
+	switch (ch) {
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind < argc)
+	usage(FALSE);
+
+    setlocale(LC_ALL, "");
+    initscr();
+    (void) cbreak();		/* take input chars one at a time, no wait for \n */
+    (void) noecho();		/* don't echo input */
+
+    printw("Typing any function key will disable it, but typing it twice in\n");
+    printw("a row will turn it back on (just for a demo).");
+    refresh();
+
+    win = newwin(LINES - 2, COLS, 2, 0);
+    scrollok(win, TRUE);
+    keypad(win, TRUE);
+    wmove(win, 0, 0);
+
+    while ((ch = wgetch(win)) != ERR) {
+	const char *name = keyname(ch);
+	if (ch == ESCAPE && prior == ch)
+	    break;
+	prior = ch;
+	wprintw(win, "Keycode %d, name %s\n",
+		ch,
+		name != 0 ? name : "<null>");
+	wclrtoeol(win);
+	wrefresh(win);
+	if (ch >= KEY_MIN) {
+	    keyok(ch, FALSE);
+	    lastch = ch;
+	} else if (lastch >= KEY_MIN) {
+	    keyok(lastch, TRUE);
+	}
+    }
+    endwin();
+    ExitProgram(EXIT_SUCCESS);
+}
+#else
+int
+main(void)
+{
+    printf("This program requires the ncurses library\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif
diff --git a/test/demo_menus.c b/test/demo_menus.c
new file mode 100644
index 0000000..ab3880c
--- /dev/null
+++ b/test/demo_menus.c
@@ -0,0 +1,1062 @@
+/****************************************************************************
+ * Copyright 2019-2021,2022 Thomas E. Dickey                                *
+ * Copyright 2003-2016,2017 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: demo_menus.c,v 1.79 2022/12/04 00:40:11 tom Exp $
+ *
+ * Demonstrate a variety of functions from the menu library.
+ * Thomas Dickey - 2005/4/9
+ */
+/*
+item_description		-
+item_init			-
+item_opts			-
+item_opts_off			-
+item_opts_on			-
+item_term			-
+item_visible			-
+menu_back			-
+menu_fore			-
+menu_format			-
+menu_grey			-
+menu_init			-
+menu_opts			-
+menu_pad			-
+menu_request_by_name		-
+menu_request_name		-
+menu_term			-
+menu_userptr			-
+set_current_item		-
+set_item_opts			-
+set_menu_grey			-
+set_menu_items			-
+set_menu_opts			-
+set_menu_pad			-
+set_menu_pattern		-
+set_menu_spacing		-
+set_menu_userptr		-
+set_top_row			-
+top_row				-
+*/
+
+#include <test.priv.h>
+
+#if USE_LIBMENU
+
+#include <menu.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#ifdef NCURSES_VERSION
+#ifdef TRACE
+static unsigned save_trace = TRACE_ORDINARY | TRACE_CALLS;
+static MENU *mpTrace;
+#endif
+#endif
+
+typedef enum {
+    eBanner = -1
+    ,eFile
+    ,eSelect
+#ifdef TRACE
+    ,eTrace
+#endif
+    ,eMAX
+} MenuNo;
+
+#define okMenuNo(n) (((n) > eBanner) && ((n) < eMAX))
+
+#define MENU_Y	1
+
+typedef struct {
+    NCURSES_CONST char *name;
+    void (*func) (int);
+    unsigned mask;
+} MENU_DATA;
+
+static void call_files(int);
+
+static MENU *mpBanner;
+static MENU *mpFile;
+static MENU *mpSelect;
+
+static WINDOW *status;
+
+static bool loaded_file = FALSE;
+
+static char empty[1];
+
+#ifdef TRACE
+static GCC_NORETURN void failed(const char *s);
+
+static void
+failed(const char *s)
+{
+    perror(s);
+    endwin();
+    ExitProgram(EXIT_FAILURE);
+}
+#endif
+
+/* Common function to allow ^T to toggle trace-mode in the middle of a test
+ * so that trace-files can be made smaller.
+ */
+static int
+wGetchar(WINDOW *win)
+{
+    int c;
+#ifdef TRACE
+    while ((c = wgetch(win)) == CTRL('T')) {
+	if (_nc_tracing) {
+	    save_trace = _nc_tracing;
+	    Trace(("TOGGLE-TRACING OFF"));
+	    _nc_tracing = 0;
+	} else {
+	    _nc_tracing = save_trace;
+	}
+	curses_trace(_nc_tracing);
+	if (_nc_tracing)
+	    Trace(("TOGGLE-TRACING ON"));
+    }
+#else
+    c = wgetch(win);
+#endif
+    return c;
+}
+#define Getchar() wGetchar(stdscr)
+
+static int
+menu_virtualize(int c)
+{
+    int result;
+
+    if (c == '\n' || c == KEY_EXIT)
+	result = (MAX_COMMAND + 1);
+    else if (c == 'u')
+	result = (REQ_SCR_ULINE);
+    else if (c == 'd')
+	result = (REQ_SCR_DLINE);
+    else if (c == 'b' || c == KEY_NPAGE)
+	result = (REQ_SCR_UPAGE);
+    else if (c == 'f' || c == KEY_PPAGE)
+	result = (REQ_SCR_DPAGE);
+    else if (c == 'l' || c == KEY_LEFT || c == KEY_BTAB)
+	result = (REQ_LEFT_ITEM);
+    else if (c == 'n' || c == KEY_DOWN)
+	result = (REQ_NEXT_ITEM);
+    else if (c == 'p' || c == KEY_UP)
+	result = (REQ_PREV_ITEM);
+    else if (c == 'r' || c == KEY_RIGHT || c == '\t')
+	result = (REQ_RIGHT_ITEM);
+    else if (c == ' ')
+	result = (REQ_TOGGLE_ITEM);
+    else {
+	if (c != KEY_MOUSE)
+	    beep();
+	result = (c);
+    }
+    return result;
+}
+
+static int
+menu_getc(MENU * m)
+{
+    return wGetchar(menu_win(m));
+}
+
+static int
+menu_offset(MenuNo number)
+{
+    int result = 0;
+
+    if (okMenuNo(number)) {
+	int spc_rows;
+#ifdef NCURSES_VERSION
+	int spc_desc, spc_cols;
+	menu_spacing(mpBanner, &spc_desc, &spc_rows, &spc_cols);
+#else
+	spc_rows = 0;
+#endif
+
+	/* FIXME: MENU.itemlen seems the only way to get actual width of items */
+	result = (number - (eBanner + 1)) * (menu_itemwidth(mpBanner) + spc_rows);
+    }
+    return result;
+}
+
+static void
+my_menu_init(MENU * menu)
+{
+    Trace(("called MenuHook my_menu_init"));
+    mvwprintw(status, 2, 0, "menu_init %p", (void *) menu);
+    wclrtoeol(status);
+    wrefresh(status);
+}
+
+static void
+my_menu_term(MENU * menu)
+{
+    Trace(("called MenuHook my_menu_term"));
+    mvwprintw(status, 2, 0, "menu_term %p", (void *) menu);
+    wclrtoeol(status);
+    wrefresh(status);
+}
+
+static void
+my_item_init(MENU * menu)
+{
+    ITEM *item = current_item(menu);
+    const char *name = item_name(item);
+
+    Trace(("called MenuHook my_item_init (%s)", name));
+    mvwprintw(status, 2, 0, "item_init %s", name);
+    wclrtoeol(status);
+    wrefresh(status);
+}
+
+static void
+my_item_term(MENU * menu)
+{
+    ITEM *item = current_item(menu);
+    const char *name = item_name(item);
+
+    Trace(("called MenuHook my_item_term (%s)", name));
+    mvwprintw(status, 2, 0, "item_term %s", name);
+    wclrtoeol(status);
+    wrefresh(status);
+}
+
+static MENU *
+menu_create(ITEM ** items, int count, int ncols, MenuNo number)
+{
+    MENU *result;
+    WINDOW *menuwin;
+    int mrows, mcols;
+    int y = okMenuNo(number) ? MENU_Y : 0;
+    int x = menu_offset(number);
+    int margin = (y == MENU_Y) ? 1 : 0;
+    int maxcol = (ncols + x) < COLS ? ncols : (COLS - x - 1);
+    int maxrow = (count + 1) / ncols;
+
+    if ((maxrow + y) >= (LINES - 4))
+	maxrow = LINES - 4 - y;
+
+    result = new_menu(items);
+
+    if (has_colors()) {
+	set_menu_fore(result, (chtype) COLOR_PAIR(1));
+	set_menu_back(result, (chtype) COLOR_PAIR(2));
+    }
+
+    set_menu_format(result, maxrow, maxcol);
+    scale_menu(result, &mrows, &mcols);
+
+    if (mcols + (2 * margin + x) >= COLS)
+	mcols = COLS - (2 * margin + x);
+
+    menuwin = newwin(mrows + (2 * margin), mcols + (2 * margin), y, x);
+    set_menu_win(result, menuwin);
+    keypad(menuwin, TRUE);
+    if (margin)
+	box(menuwin, 0, 0);
+
+    set_menu_sub(result, derwin(menuwin, mrows, mcols, margin, margin));
+
+#ifdef TRACE
+    if (number == eTrace)
+	menu_opts_off(result, O_ONEVALUE);
+    else
+	menu_opts_on(result, O_ONEVALUE);
+#endif
+#if defined(NCURSES_MOUSE_VERSION) && defined(O_MOUSE_MENU)
+    menu_opts_on(result, O_MOUSE_MENU);
+#endif
+
+    post_menu(result);
+
+    set_menu_init(result, my_menu_init);
+    set_menu_term(result, my_menu_term);
+    set_item_init(result, my_item_init);
+    set_item_term(result, my_item_term);
+    return result;
+}
+
+static void
+menu_destroy(MENU * m, int itemsToo)
+{
+    Trace(("menu_destroy %p", (void *) m));
+    if (m != 0) {
+	ITEM **items = menu_items(m);
+	const char *blob = 0;
+	int count;
+
+	count = item_count(m);
+	Trace(("menu_destroy %p count %d", (void *) m, count));
+	if ((count > 0) && (m == mpSelect)) {
+	    blob = item_name(*items);
+	}
+
+	unpost_menu(m);
+	free_menu(m);
+
+	/* free the extra data allocated in build_select_menu() */
+	if ((count > 0) && (m == mpSelect)) {
+	    if (blob && loaded_file) {
+		Trace(("freeing blob %p", blob));
+		free((void *) blob);
+	    }
+	}
+	if (count > 0 && itemsToo) {
+	    if (itemsToo & 1) {
+		ITEM **ip = items;
+		if (ip != 0) {
+		    while (*ip)
+			free_item(*ip++);
+		}
+	    }
+	    if (itemsToo & 2)
+		free(items);
+	}
+    }
+}
+
+/* force the given menu to appear */
+static void
+menu_display(MENU * m)
+{
+    touchwin(menu_win(m));
+    wrefresh(menu_win(m));
+}
+
+/*****************************************************************************/
+
+static void
+build_file_menu(MenuNo number)
+{
+    static MENU_DATA table[] =
+    {
+	{"Exit", call_files, 0},
+	{(char *) 0, 0, 0}
+    };
+    static ITEM *items[SIZEOF(table)];
+
+    ITEM **ip = items;
+    int n;
+
+    for (n = 0; table[n].name != 0; ++n) {
+	*ip = new_item(table[n].name, empty);
+	set_item_userptr(*ip, (void *) &table[n]);
+	++ip;
+    }
+    *ip = (ITEM *) 0;
+
+    mpFile = menu_create(items, SIZEOF(table) - 1, 1, number);
+}
+
+static int
+perform_file_menu(int cmd)
+{
+    return menu_driver(mpFile, cmd);
+}
+
+/*****************************************************************************/
+
+static void
+call_select(int code)
+{
+    (void) code;
+    Trace(("Selected item %d", code));
+}
+
+static void
+build_select_menu(MenuNo number, char *filename)
+{
+#define MY_DATA(name) { name, call_select, 0 }
+    static MENU_DATA table[] =
+    {
+	MY_DATA("Lions"),
+	MY_DATA("Tigers"),
+	MY_DATA("Bears"),
+	MY_DATA("(Oh my!)"),
+	MY_DATA("Newts"),
+	MY_DATA("Platypi"),
+	MY_DATA("Lemurs"),
+	MY_DATA("(Oh really?!)"),
+	MY_DATA("Leopards"),
+	MY_DATA("Panthers"),
+	MY_DATA("Pumas"),
+	MY_DATA("Lions, Tigers, Bears, (Oh my!), Newts, Platypi, Lemurs"),
+	MY_DATA("Lions, Tigers, Bears, (Oh my!), Newts, Platypi, Lemurs, Lions, Tigers, Bears, (Oh my!), Newts, Platypi, Lemurs"),
+	{(char *) 0, 0, 0}
+    };
+    static ITEM **items;
+
+    ITEM **ip;
+    MENU_DATA *ap = 0;
+    MENU_DATA *myList = 0;
+    int i;
+    size_t count = 0;
+
+    if (filename != 0) {
+	struct stat sb;
+	if (stat(filename, &sb) == 0
+	    && (sb.st_mode & S_IFMT) == S_IFREG
+	    && sb.st_size != 0) {
+	    size_t size = (size_t) sb.st_size;
+	    char *blob = typeMalloc(char, size + 1);
+	    MENU_DATA *list = typeCalloc(MENU_DATA, size + 1);
+
+	    items = typeCalloc(ITEM *, size + 1);
+	    Trace(("build_select_menu blob=%p, items=%p",
+		   (void *) blob,
+		   (void *) items));
+	    if (blob != 0 && list != 0) {
+		FILE *fp = fopen(filename, "r");
+		if (fp != 0) {
+		    if (fread(blob, sizeof(char), size, fp) == size) {
+			bool mark = TRUE;
+			unsigned j, k;
+			for (j = k = 0; j < size; ++j) {
+			    if (mark) {
+				list[k++].name = blob + j;
+				mark = FALSE;
+			    }
+			    if (blob[j] == '\n') {
+				blob[j] = '\0';
+				if (k > 0 && *list[k - 1].name == '\0')
+				    --k;
+				mark = TRUE;
+			    } else if (blob[j] == '\t') {
+				blob[j] = ' ';	/* menu items are printable */
+			    }
+			}
+			list[k].name = 0;
+			count = k;
+			ap = myList = list;
+		    }
+		    fclose(fp);
+		}
+		loaded_file = TRUE;
+	    }
+	    if (ap == 0)
+		free(items);
+	}
+    }
+    if (ap == 0) {
+	count = SIZEOF(table) - 1;
+	items = typeCalloc(ITEM *, count + 1);
+	ap = table;
+    }
+
+    ip = items;
+    for (i = 0; ap[i].name != 0; ++i) {
+	ap[i].func = call_select;
+	ap[i].mask = (unsigned) i;
+	*ip = new_item(ap[i].name, empty);
+	set_item_userptr(*ip, (void *) &table[i]);
+	++ip;
+    }
+    *ip = 0;
+
+    mpSelect = menu_create(items, (int) count, 1, number);
+    if (myList != 0)
+	free(myList);
+}
+
+static int
+perform_select_menu(int cmd)
+{
+    return menu_driver(mpSelect, cmd);
+}
+
+/*****************************************************************************/
+
+#ifdef TRACE
+
+static void
+call_trace(int code)
+{
+    (void) code;
+    Trace(("Updating trace mask %d", code));
+}
+
+#define T_TBL(name) { #name, call_trace, name }
+static MENU_DATA t_tbl[] =
+{
+
+    T_TBL(TRACE_DISABLE),
+    T_TBL(TRACE_TIMES),
+    T_TBL(TRACE_TPUTS),
+    T_TBL(TRACE_UPDATE),
+    T_TBL(TRACE_MOVE),
+    T_TBL(TRACE_CHARPUT),
+    T_TBL(TRACE_ORDINARY),
+    T_TBL(TRACE_CALLS),
+    T_TBL(TRACE_VIRTPUT),
+    T_TBL(TRACE_IEVENT),
+    T_TBL(TRACE_BITS),
+    T_TBL(TRACE_ICALLS),
+    T_TBL(TRACE_CCALLS),
+    T_TBL(TRACE_DATABASE),
+    T_TBL(TRACE_ATTRS),
+    T_TBL(TRACE_MAXIMUM),
+    {
+	(char *) 0, 0, 0
+    }
+};
+
+static void
+build_trace_menu(MenuNo number)
+{
+    static ITEM *items[SIZEOF(t_tbl)];
+
+    ITEM **ip = items;
+    int n;
+
+    for (n = 0; t_tbl[n].name != 0; n++) {
+	*ip = new_item(t_tbl[n].name, empty);
+	set_item_userptr(*ip, (void *) &t_tbl[n]);
+	++ip;
+    }
+    *ip = (ITEM *) 0;
+
+    mpTrace = menu_create(items, SIZEOF(t_tbl) - 1, 2, number);
+}
+
+static char *
+tracetrace(unsigned tlevel)
+{
+    static char *buf;
+    static size_t need = 12;
+    int n;
+
+    if (buf == 0) {
+	for (n = 0; t_tbl[n].name != 0; n++)
+	    need += strlen(t_tbl[n].name) + 2;
+	buf = typeMalloc(char, need);
+	if (!buf)
+	    failed("tracetrace");
+    }
+    _nc_SPRINTF(buf, _nc_SLIMIT(need) "0x%02x = {", tlevel);
+    if (tlevel == 0) {
+	_nc_STRCAT(buf, t_tbl[0].name ? t_tbl[0].name : "", need);
+	_nc_STRCAT(buf, ", ", need);
+    } else {
+	for (n = 1; t_tbl[n].name != 0; n++)
+	    if ((tlevel & t_tbl[n].mask) == t_tbl[n].mask) {
+		_nc_STRCAT(buf, t_tbl[n].name, need);
+		_nc_STRCAT(buf, ", ", need);
+	    }
+    }
+    if (buf[strlen(buf) - 2] == ',')
+	buf[strlen(buf) - 2] = '\0';
+    _nc_STRCAT(buf, "}", need);
+    return buf;
+}
+
+/* fake a dynamically reconfigurable menu using the 0th entry to deselect
+ * the others
+ */
+static bool
+update_trace_menu(MENU * m)
+{
+    ITEM **items;
+    ITEM *i;
+    bool changed = FALSE;
+
+    items = menu_items(m);
+    i = current_item(m);
+    if (i == items[0]) {
+	if (item_value(i)) {
+	    ITEM **p;
+	    for (p = items + 1; *p != 0; p++)
+		if (item_value(*p)) {
+		    set_item_value(*p, FALSE);
+		    changed = TRUE;
+		}
+	}
+    }
+    return changed;
+}
+
+static int
+perform_trace_menu(int cmd)
+/* interactively set the trace level */
+{
+    ITEM **ip;
+    int result;
+
+    for (ip = menu_items(mpTrace); *ip; ip++) {
+	MENU_DATA *td = (MENU_DATA *) item_userptr(*ip);
+	unsigned mask = td->mask;
+	if (mask == 0)
+	    set_item_value(*ip, _nc_tracing == 0);
+	else if ((mask & _nc_tracing) == mask)
+	    set_item_value(*ip, TRUE);
+    }
+
+    result = menu_driver(mpTrace, cmd);
+
+    if (result == E_OK) {
+	if (update_trace_menu(mpTrace) || cmd == REQ_TOGGLE_ITEM) {
+	    unsigned newtrace = 0;
+	    for (ip = menu_items(mpTrace); *ip; ip++) {
+		if (item_value(*ip)) {
+		    MENU_DATA *td = (MENU_DATA *) item_userptr(*ip);
+		    newtrace |= td->mask;
+		}
+	    }
+	    curses_trace(newtrace);
+	    Trace(("trace level interactively set to %s", tracetrace(_nc_tracing)));
+
+	    MvWPrintw(status, 1, 0,
+		      "Trace level is %s\n", tracetrace(_nc_tracing));
+	    wrefresh(status);
+	}
+    }
+    return result;
+}
+#endif /* TRACE */
+
+/*****************************************************************************/
+
+static int
+menu_number(void)
+{
+    return item_index(current_item(mpBanner)) - (eBanner + 1);
+}
+
+static MENU *
+current_menu(void)
+{
+    MENU *result;
+
+    switch (menu_number()) {
+    case eFile:
+	result = mpFile;
+	break;
+    case eSelect:
+	result = mpSelect;
+	break;
+#ifdef TRACE
+    case eTrace:
+	result = mpTrace;
+	break;
+#endif
+    default:
+	result = 0;
+	break;
+    }
+    return result;
+}
+
+static void
+call_menus(int code)
+{
+    (void) code;
+    Trace(("Activated menu %d\n", code));
+}
+
+static void
+build_menus(char *filename)
+{
+    static MENU_DATA table[] =
+    {
+	{"File", call_menus, 0},
+	{"Select", call_menus, 1},
+#ifdef TRACE
+	{"Trace", call_menus, 2},
+#endif
+	{(char *) 0, 0, 0}
+    };
+    static ITEM *items[SIZEOF(table)];
+
+    ITEM **ip = items;
+    int n;
+
+    for (n = 0; table[n].name != 0; ++n) {
+	*ip = new_item(table[n].name, empty);
+	set_item_userptr(*ip, (void *) &table[n]);
+	++ip;
+    }
+    *ip = (ITEM *) 0;
+
+    mpBanner = menu_create(items, SIZEOF(table) - 1, SIZEOF(table) - 1, eBanner);
+    set_menu_mark(mpBanner, ">");
+
+    build_file_menu(eFile);
+    build_select_menu(eSelect, filename);
+#ifdef TRACE
+    build_trace_menu(eTrace);
+#endif
+}
+
+static int
+move_menu(MENU * menu, MENU * current, int by_y, int by_x)
+{
+    WINDOW *top_win = menu_win(menu);
+    WINDOW *sub_win = menu_sub(menu);
+    int y0, x0;
+    int y1, x1;
+    int result;
+
+    getbegyx(top_win, y0, x0);
+    y0 += by_y;
+    x0 += by_x;
+
+    getbegyx(sub_win, y1, x1);
+    y1 += by_y;
+    x1 += by_x;
+
+    if ((result = mvwin(top_win, y0, x0)) != ERR) {
+#if defined(NCURSES_VERSION_PATCH) && (NCURSES_VERSION_PATCH < 20060218)
+	sub_win->_begy = y1;
+	sub_win->_begx = x1;
+#else
+	mvwin(sub_win, y1, x1);
+#endif
+	if (menu == current) {
+	    touchwin(top_win);
+	    wnoutrefresh(top_win);
+	}
+    }
+    return result;
+}
+
+/*
+ * Move the menus around on the screen, to test mvwin().
+ */
+static void
+move_menus(MENU * current, int by_y, int by_x)
+{
+    if (move_menu(mpBanner, current, by_y, by_x) != ERR) {
+	erase();
+	wnoutrefresh(stdscr);
+	move_menu(mpFile, current, by_y, by_x);
+	move_menu(mpSelect, current, by_y, by_x);
+#ifdef TRACE
+	move_menu(mpTrace, current, by_y, by_x);
+#endif
+	doupdate();
+    }
+}
+
+#if defined(KEY_RESIZE) && NCURSES_EXT_FUNCS
+static void
+resize_menu(MENU ** menu)
+{
+#if 0
+    WINDOW *win = menu_win(*menu);
+    WINDOW *sub = menu_sub(*menu);
+#endif
+    (void) menu;
+}
+
+static void
+resize_menus(MENU * current)
+{
+    (void) current;
+
+    werase(status);
+    wnoutrefresh(status);
+    wresize(status, 1, COLS);
+    mvwin(status, LINES - 1, 0);
+
+    resize_menu(&mpBanner);
+    resize_menu(&mpFile);
+    resize_menu(&mpSelect);
+#ifdef TRACE
+    resize_menu(&mpTrace);
+#endif
+}
+#endif /* defined(KEY_RESIZE) && NCURSES_EXT_FUNCS */
+
+static void
+show_status(int ch, MENU * menu)
+{
+    wmove(status, 0, 0);
+    wprintw(status, "key %s, menu %d, mark %s, match %s",
+	    keyname(ch),
+	    menu_number(),
+	    menu_mark(menu),
+	    menu_pattern(menu));
+    wclrtoeol(status);
+    wrefresh(status);
+}
+
+static void
+perform_menus(void)
+{
+    MENU *this_menu;
+    MENU *last_menu = mpFile;
+    int code = E_UNKNOWN_COMMAND;
+    int cmd;
+    int ch = ERR;
+
+#ifdef NCURSES_MOUSE_VERSION
+    mousemask(BUTTON1_CLICKED, (mmask_t *) 0);
+#endif
+
+    menu_display(last_menu);
+
+    for (;;) {
+
+	if (ch != ERR)
+	    show_status(ch, last_menu);
+
+	ch = menu_getc(mpBanner);
+
+	/*
+	 * Provide for moving the menu around in the screen using shifted
+	 * cursor keys.
+	 */
+	switch (ch) {
+	case KEY_SF:
+	    move_menus(last_menu, 1, 0);
+	    continue;
+	case KEY_SR:
+	    move_menus(last_menu, -1, 0);
+	    continue;
+	case KEY_SLEFT:
+	    move_menus(last_menu, 0, -1);
+	    continue;
+	case KEY_SRIGHT:
+	    move_menus(last_menu, 0, 1);
+	    continue;
+#if defined(KEY_RESIZE) && NCURSES_EXT_FUNCS
+	case KEY_RESIZE:
+	    resize_menus(last_menu);
+	    continue;
+#endif
+	}
+	cmd = menu_virtualize(ch);
+
+	switch (cmd) {
+	    /*
+	     * The banner menu acts solely to select one of the other menus.
+	     * Move between its items, wrapping at the left/right limits.
+	     */
+	case REQ_LEFT_ITEM:
+	case REQ_RIGHT_ITEM:
+	    code = menu_driver(mpBanner, cmd);
+	    if (code == E_REQUEST_DENIED) {
+		if (menu_number() > 0)
+		    code = menu_driver(mpBanner, REQ_FIRST_ITEM);
+		else
+		    code = menu_driver(mpBanner, REQ_LAST_ITEM);
+	    }
+	    break;
+	default:
+	    switch (menu_number()) {
+	    case eFile:
+		code = perform_file_menu(cmd);
+		break;
+	    case eSelect:
+		code = perform_select_menu(cmd);
+		break;
+#ifdef TRACE
+	    case eTrace:
+		code = perform_trace_menu(cmd);
+		break;
+#endif
+	    }
+
+#if defined(NCURSES_MOUSE_VERSION) && defined(O_MOUSE_MENU)
+	    if ((code == E_REQUEST_DENIED) && (cmd == KEY_MOUSE)) {
+		(void) menu_getc(mpBanner);
+		code = menu_driver(mpBanner, cmd);
+		if (code == E_REQUEST_DENIED) {
+		    MEVENT event;
+		    if (menu_getc(mpBanner) == KEY_MOUSE)
+			getmouse(&event);	/* give up */
+		}
+	    }
+#endif
+
+	    break;
+	}
+
+	if (code == E_OK) {
+	    this_menu = current_menu();
+	    if (this_menu != last_menu) {
+		move(1, 0);
+		clrtobot();
+		box(menu_win(this_menu), 0, 0);
+		refresh();
+
+		/* force the current menu to appear */
+		menu_display(this_menu);
+
+		last_menu = this_menu;
+	    }
+	}
+	wrefresh(menu_win(last_menu));
+	if (code == E_UNKNOWN_COMMAND
+	    || code == E_NOT_POSTED) {
+	    ITEM *item = current_item(last_menu);
+	    MENU_DATA *td = (MENU_DATA *) item_userptr(item);
+	    td->func((int) td->mask);
+	}
+	if (code == E_REQUEST_DENIED)
+	    beep();
+	continue;
+    }
+}
+
+static void
+destroy_menus(void)
+{
+    menu_destroy(mpFile, 1);
+    menu_destroy(mpSelect, 3);
+#ifdef TRACE
+    menu_destroy(mpTrace, 1);
+#endif
+    menu_destroy(mpBanner, 1);
+}
+
+#if HAVE_RIPOFFLINE
+static int
+rip_footer(WINDOW *win, int cols)
+{
+    wbkgd(win, A_REVERSE);
+    werase(win);
+    wmove(win, 0, 0);
+    wprintw(win, "footer: %d columns", cols);
+    wnoutrefresh(win);
+    return OK;
+}
+
+static int
+rip_header(WINDOW *win, int cols)
+{
+    wbkgd(win, A_REVERSE);
+    werase(win);
+    wmove(win, 0, 0);
+    wprintw(win, "header: %d columns", cols);
+    wnoutrefresh(win);
+    return OK;
+}
+#endif /* HAVE_RIPOFFLINE */
+
+static void
+call_files(int code)
+{
+    switch (code) {
+    case 0:
+	destroy_menus();
+	endwin();
+	printf("DONE!\n");
+	ExitProgram(EXIT_SUCCESS);
+    }
+}
+
+static void
+usage(int ok)
+{
+    static const char *const tbl[] =
+    {
+	"Usage: demo_menus [options] [menu-file]"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+#if HAVE_RIPOFFLINE
+	," -F       rip-off footer line (can repeat)"
+	," -H       rip-off header line (can repeat)"
+#endif
+#ifdef TRACE
+	," -t mask  specify default trace-level (may toggle with ^T)"
+#endif
+    };
+    size_t n;
+    for (n = 0; n < SIZEOF(tbl); n++)
+	fprintf(stderr, "%s\n", tbl[n]);
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+
+    setlocale(LC_ALL, "");
+    START_TRACE();
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "FHt:")) != -1) {
+	switch (ch) {
+#if HAVE_RIPOFFLINE
+	case 'F':
+	    ripoffline(-1, rip_footer);
+	    break;
+	case 'H':
+	    ripoffline(1, rip_header);
+	    break;
+#endif /* HAVE_RIPOFFLINE */
+#ifdef TRACE
+	case 't':
+	    curses_trace((unsigned) strtoul(optarg, 0, 0));
+	    break;
+#endif
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+
+    initscr();
+    noraw();
+    cbreak();
+    noecho();
+
+    if (has_colors()) {
+	start_color();
+	init_pair(1, COLOR_RED, COLOR_BLACK);
+	init_pair(2, COLOR_BLUE, COLOR_WHITE);
+    }
+    status = newwin(3, COLS, LINES - 3, 0);
+    build_menus(argc > 1 ? argv[1] : 0);
+    perform_menus();
+    destroy_menus();
+
+    endwin();
+    ExitProgram(EXIT_SUCCESS);
+}
+#else
+int
+main(void)
+{
+    printf("This program requires the curses menu library\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif
diff --git a/test/demo_new_pair.c b/test/demo_new_pair.c
new file mode 100644
index 0000000..bc41d44
--- /dev/null
+++ b/test/demo_new_pair.c
@@ -0,0 +1,401 @@
+/****************************************************************************
+ * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 2017 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: demo_new_pair.c,v 1.27 2022/12/04 00:40:11 tom Exp $
+ *
+ * Demonstrate the alloc_pair() function.
+ */
+
+#include <test.priv.h>
+#include <time.h>
+#include <popup_msg.h>
+
+#if HAVE_ALLOC_PAIR && USE_WIDEC_SUPPORT
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#define MAX_BITS 8		/* all but A_ALTCHARSET */
+#define MAX_ATTR ((1<<MAX_BITS)-1)
+
+static bool
+valid_cap(NCURSES_CONST char *name)
+{
+    char *value = tigetstr(name);
+    return (value != 0 && value != (char *) -1) ? TRUE : FALSE;
+}
+
+static attr_t
+next_attr(int now)
+{
+    static bool init = FALSE;
+    static attr_t table[MAX_BITS * MAX_BITS];
+    static int limit = 0;
+
+    if (!init) {
+	int j, k;
+	attr_t bits[MAX_BITS];
+
+	init = TRUE;
+	bits[limit++] = WA_NORMAL;
+	if (valid_cap("smso"))
+	    bits[limit++] = WA_STANDOUT;
+	if (valid_cap("smul"))
+	    bits[limit++] = WA_UNDERLINE;
+	if (valid_cap("rev"))
+	    bits[limit++] = WA_REVERSE;
+	if (valid_cap("blink"))
+	    bits[limit++] = WA_BLINK;
+	if (valid_cap("dim"))
+	    bits[limit++] = WA_DIM;
+	if (valid_cap("bold"))
+	    bits[limit++] = WA_BOLD;
+	for (j = 0; j < limit; ++j) {
+	    for (k = 0; k < limit; ++k) {
+		table[j * limit + k] = bits[j] | bits[k];
+	    }
+	}
+    }
+    return table[now % limit];
+}
+
+static void
+our_content(int pair, int *fg, int *bg)
+{
+    pair %= COLOR_PAIRS;
+    *fg = (pair / COLORS) % COLORS;
+    *bg = (pair % COLORS);
+}
+
+static int
+make_color(int now)
+{
+    int fg, bg;
+    our_content(now, &fg, &bg);
+    return alloc_pair(fg, bg);
+}
+
+static int
+next_color(int now)
+{
+    int result = 0;
+    if ((short) now > 0) {
+	if (now < COLOR_PAIRS) {
+	    int fg, bg;
+	    our_content(now, &fg, &bg);
+	    if (init_pair((short) now, (short) fg, (short) bg) != OK)
+		now = ERR;
+	} else {
+	    now %= COLOR_PAIRS;
+	}
+	result = now;
+    }
+    return result;
+}
+
+static time_t
+now(void)
+{
+    return time((time_t *) 0);
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: demo_new_pair [options]"
+	,""
+	,"Repeatedly print using all possible color combinations."
+	,""
+	,USAGE_COMMON
+	,"Options:"
+	," -g       use getcchar to check setcchar"
+	," -i       use init_pair rather than alloc_pair"
+	," -p       start in paged-mode"
+	," -s       start in single-step mode"
+	," -w       print a wide-character cell"
+    };
+    unsigned n;
+    for (n = 0; n < SIZEOF(msg); ++n) {
+	fprintf(stderr, "%s\n", msg[n]);
+    }
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+
+#define use_pages() \
+	paged_mode = TRUE, single_mode = TRUE
+
+#define use_single() \
+	paged_mode = FALSE, single_mode = TRUE
+
+#define update_modes() \
+	    scrollok(stdscr, !paged_mode); \
+	    nodelay(stdscr, !single_mode || paged_mode)
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    static const char *help[] =
+    {
+	"This program iterates over the possible color combinations,",
+	"allocating or initializing color pairs.  For best results,",
+	"choose screen-width dividing evenly into the number of colors,",
+	"e.g.,",
+	"",
+	"  32x64,32x128  256 colors",
+	"  24x44,24x88   88 colors",
+	"  32x64,24x128  16 colors",
+	"",
+	"Keys:",
+	"  c      toggle between coloring and de-coloring cells",
+	"  p      show one page at a time",
+	"  s      show one character at a time",
+	" <space> display char/page without pausing",
+	"  v/V    cycle through video attributes",
+	"  w      toggle between \"#\" and a double-width equivalent",
+	"  ?      print this screen (exit on any character).",
+	"",
+	"To exit this program, press ^Q, ^[ or \"q\".",
+	0
+    };
+
+    bool done = FALSE;
+    bool check_set = FALSE;
+    bool clobber = FALSE;
+    bool hascolor = FALSE;
+    bool use_init = FALSE;
+    bool use_wide = FALSE;
+    bool paged_mode = FALSE;
+    bool single_mode = FALSE;
+    int video_mode = 0;
+    int current;
+    int ch;
+    wchar_t wch[2];
+    time_t start = now();
+    long total_cells = 0;
+    FILE *output = 0;
+
+    setlocale(LC_ALL, "");
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "gipsw")) != -1) {
+	switch (ch) {
+	case 'g':
+	    check_set = TRUE;
+	    break;
+	case 'i':
+	    use_init = TRUE;
+	    break;
+	case 'p':
+	    use_pages();
+	    break;
+	case 's':
+	    use_single();
+	    break;
+	case 'w':
+	    use_wide = TRUE;
+	    break;
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+
+    if (isatty(fileno(stderr))) {
+	output = stderr;
+    } else if ((ch = open("/dev/tty", O_WRONLY)) >= 0) {
+	output = fdopen(ch, "w");
+    } else {
+	fprintf(stderr, "cannot open terminal for output\n");
+	ExitProgram(EXIT_FAILURE);
+    }
+    if (newterm(NULL, output, stdin) == 0) {
+	fprintf(stderr, "Cannot initialize terminal\n");
+	fclose(output);
+	ExitProgram(EXIT_FAILURE);
+    }
+    (void) cbreak();		/* read chars without wait for \n */
+    (void) noecho();		/* don't echo input */
+    update_modes();
+    curs_set(0);
+
+    keypad(stdscr, TRUE);
+
+    if ((hascolor = has_colors())) {
+	start_color();
+	current = 1;
+    } else {
+	current = 0;
+    }
+
+    /*
+     * Repeatedly cycle through all colors, initializing pairs as needed.
+     * Provide for single-stepping, or page-at-a-time, as well as quitting.
+     */
+    while (!done) {
+	cchar_t temp;
+	attr_t my_attrs;
+	int my_pair;
+
+	switch (getch()) {
+	case HELP_KEY_1:
+	    popup_msg(stdscr, help);
+	    break;
+	case 'p':
+	    /* step-by-page */
+	    use_pages();
+	    update_modes();
+	    break;
+	case 's':
+	    /* step-by-char */
+	    use_single();
+	    update_modes();
+	    break;
+	case ' ':
+	    single_mode = FALSE;
+	    update_modes();
+	    break;
+	case QUIT:
+	case ESCAPE:
+	case 'q':
+	    done = TRUE;
+	    continue;
+	case 'c':
+	    clobber = !clobber;
+	    continue;
+	case 'v':
+	    if (--video_mode < 0)
+		video_mode = MAX_ATTR;
+	    continue;
+	case 'V':
+	    if (video_mode > MAX_ATTR)
+		video_mode = 0;
+	    continue;
+	case 'w':
+	    use_wide = !use_wide;
+	    continue;
+	case ERR:
+	    break;
+	default:
+	    beep();
+	    break;
+	}
+	if (hascolor) {
+	    my_attrs = next_attr(video_mode);
+	    if (clobber) {
+		int fg, bg;
+		our_content(current, &fg, &bg);
+		my_pair = find_pair(fg, bg);
+		if (my_pair > 0) {
+		    free_pair(my_pair);
+		}
+		my_pair = 0;
+	    } else {
+		my_pair = (use_init
+			   ? next_color(current)
+			   : make_color(current));
+	    }
+	} else {
+	    my_attrs = next_attr(current);
+	    my_pair = 0;
+	}
+	if (my_pair < 0)
+	    break;
+	wch[0] = use_wide ? 0xff03 : '#';
+	wch[1] = 0;
+	setcchar(&temp, wch, my_attrs,
+		 (short) my_pair,
+		 (use_init ? NULL : (void *) &my_pair));
+
+	if (check_set) {
+	    int problem = 0;
+	    wchar_t chk_wch[2];
+	    attr_t chk_attrs = 0;
+	    short chk_pair = 0;
+	    int chk_pair2 = 0;
+
+#define AllButColor(a) ((a) & (A_ATTRIBUTES & ~A_COLOR))
+
+	    if (getcchar(&temp, NULL, &chk_attrs, &chk_pair,
+			 (use_init ? NULL : (void *) &chk_pair2)) != 2) {
+		problem = 1;
+	    } else if (getcchar(&temp, chk_wch, &chk_attrs, &chk_pair,
+				(use_init ? NULL : (void *) &chk_pair2)) != OK) {
+		problem = 2;
+	    } else if (chk_wch[0] != wch[0]) {
+		problem = 3;
+	    } else if (AllButColor(my_attrs) != AllButColor(chk_attrs)) {
+		problem = 4;
+	    } else if (my_pair != chk_pair) {
+		problem = 4;
+	    } else if (!use_init && (my_pair != chk_pair2)) {
+		problem = 5;
+	    }
+	    if (problem) {
+		wch[0] = (wchar_t) (problem + '0');
+		setcchar(&temp, wch, my_attrs,
+			 (short) my_pair,
+			 (use_init ? NULL : (void *) &my_pair));
+	    }
+	}
+
+	/*
+	 * At the end of a page, move the cursor to the home position.
+	 */
+	if ((add_wch(&temp) == ERR) && paged_mode) {
+	    nodelay(stdscr, !single_mode);
+	    move(0, 0);
+	}
+	total_cells += 1 + (use_wide ? 1 : 0);
+	++current;
+    }
+    stop_curses();
+    fclose(output);
+
+    printf("%.1f cells/second\n",
+	   (double) (total_cells) / (double) (now() - start));
+
+    ExitProgram(EXIT_SUCCESS);
+}
+
+#else
+int
+main(void)
+{
+    printf("This program requires the ncurses alloc_pair function\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif
diff --git a/test/demo_panels.c b/test/demo_panels.c
new file mode 100644
index 0000000..6c82589
--- /dev/null
+++ b/test/demo_panels.c
@@ -0,0 +1,834 @@
+/****************************************************************************
+ * Copyright 2018-2020,2022 Thomas E. Dickey                                *
+ * Copyright 2003-2016,2017 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: demo_panels.c,v 1.48 2022/12/04 00:40:11 tom Exp $
+ *
+ * Demonstrate a variety of functions from the panel library.
+ */
+
+#include <test.priv.h>
+
+#if USE_LIBPANEL
+
+#include <panel.h>
+
+#define LAST_POS '@'
+#define TEMP_POS '>'
+
+typedef void (*InitPanel) (void);
+typedef void (*FillPanel) (PANEL *);
+
+static bool use_colors = FALSE;
+static bool unboxed = FALSE;
+static FILE *log_in;
+static FILE *log_out;
+
+static void
+close_input(void)
+{
+    if (log_in != 0) {
+	fclose(log_in);
+	log_in = 0;
+    }
+}
+
+static void
+close_output(void)
+{
+    if (log_out != 0) {
+	fclose(log_out);
+	log_out = 0;
+    }
+}
+
+static WINDOW *
+statusline(void)
+{
+    WINDOW *result = stdscr;
+
+    wmove(result, LINES - 1, 0);
+    wclrtoeol(result);
+    return result;
+}
+
+static void
+pflush(void)
+{
+    update_panels();
+    doupdate();
+}
+
+static void
+saywhat(NCURSES_CONST char *text)
+{
+    WINDOW *win = statusline();
+    if (text != 0 && *text != '\0') {
+	waddstr(win, text);
+	waddstr(win, "; ");
+    }
+    waddstr(win, "press any key to continue");
+}
+
+static void
+show_position(NCURSES_CONST char *text,
+	      NCURSES_CONST char *also,
+	      int which,
+	      int ypos,
+	      int xpos)
+{
+    WINDOW *win = statusline();
+
+    wprintw(win, "%s for panel %d now %d,%d%s", text, which, ypos, xpos, also);
+    wmove(stdscr, ypos, xpos);
+}
+
+static int
+get_position(NCURSES_CONST char *text,
+	     NCURSES_CONST char *also,
+	     int which,
+	     int *xpos,
+	     int *ypos)
+{
+    int result = 0;
+    int x1, y1;
+    char cmd;
+
+    getyx(stdscr, y1, x1);
+    (void) statusline();
+
+    show_position(text, also, which, y1, x1);
+
+    if (log_in != 0) {
+	if (fscanf(log_in, "%c%d,%d\n", &cmd, &y1, &x1) == 3) {
+	    switch (cmd) {
+	    case LAST_POS:
+		result = 1;
+		(void) wgetch(stdscr);
+		break;
+	    case TEMP_POS:
+		result = 0;
+		wrefresh(stdscr);
+		napms(100);
+		break;
+	    default:
+		result = -1;
+		break;
+	    }
+	} else {
+	    result = -1;
+	}
+    } else {
+
+	switch (wgetch(stdscr)) {
+	case QUIT:
+	case ESCAPE:
+	case ERR:
+	    result = -1;
+	    break;
+	case ' ':
+	    result = 1;
+	    break;
+	case KEY_UP:
+	    if (y1 > 0) {
+		--y1;
+	    } else {
+		beep();
+	    }
+	    break;
+	case KEY_DOWN:
+	    if (y1 < getmaxy(stdscr)) {
+		++y1;
+	    } else {
+		beep();
+	    }
+	    break;
+	case KEY_LEFT:
+	    if (x1 > 0) {
+		--x1;
+	    } else {
+		beep();
+	    }
+	    break;
+	case KEY_RIGHT:
+	    if (x1 < getmaxx(stdscr)) {
+		++x1;
+	    } else {
+		beep();
+	    }
+	    break;
+	}
+    }
+
+    wmove(stdscr, y1, x1);
+    *ypos = y1;
+    *xpos = x1;
+
+    if (result >= 0) {
+	if (log_out)
+	    fprintf(log_out, "%c%d,%d\n",
+		    ((result > 0)
+		     ? LAST_POS
+		     : TEMP_POS),
+		    y1, x1);
+    }
+    return result;
+}
+
+static PANEL *
+mkpanel(short color, int rows, int cols, int tly, int tlx)
+{
+    WINDOW *win;
+    PANEL *pan = 0;
+    char *userdata = typeMalloc(char, 6);
+
+    if ((win = newwin(rows, cols, tly, tlx)) != 0) {
+	keypad(win, TRUE);
+	if ((pan = new_panel(win)) == 0) {
+	    delwin(win);
+	} else if (use_colors) {
+	    short fg = (short) ((color == COLOR_BLUE)
+				? COLOR_WHITE
+				: COLOR_BLACK);
+	    short bg = color;
+
+	    init_pair(color, fg, bg);
+	    wbkgdset(win, (chtype) (COLOR_PAIR(color) | ' '));
+	} else if (!unboxed) {
+	    wbkgdset(win, A_BOLD | ' ');
+	}
+    }
+    _nc_SPRINTF(userdata, _nc_SLIMIT(4) "p%d", color % 8);
+    set_panel_userptr(pan, (NCURSES_CONST void *) userdata);
+    return pan;
+}
+
+static void
+my_remove_panel(PANEL **pans, int which)
+{
+    if (pans[which] != 0) {
+	PANEL *pan = pans[which];
+	WINDOW *win = panel_window(pan);
+	char *user = (char *) panel_userptr(pan);
+
+	free(user);
+	del_panel(pan);
+	delwin(win);
+
+	pans[which] = 0;
+    }
+}
+
+#undef MIN
+#define MIN(a,b) ((a) < (b) ? (a) : (b))
+#define ABS(a)   ((a) < 0 ? -(a) : (a))
+
+static void
+my_create_panel(PANEL **pans, int which, FillPanel myFill)
+{
+    int code;
+    short pair = (short) which;
+    short fg = (short) ((pair == COLOR_BLUE) ? COLOR_WHITE : COLOR_BLACK);
+    short bg = pair;
+    int x0, y0, x1, y1;
+
+    init_pair(pair, fg, bg);
+
+    /* remove the old panel, if any */
+    my_remove_panel(pans, which);
+
+    /* get the position of one corner */
+    wmove(stdscr, getmaxy(stdscr) / 2, getmaxx(stdscr) / 2);
+    getyx(stdscr, y0, x0);
+    while ((code = get_position("First corner", "", which, &x0, &y0)) == 0) {
+	;
+    }
+
+    if (code > 0) {
+	char also[80];
+	_nc_SPRINTF(also, _nc_SLIMIT(sizeof(also)) " (first %d,%d)", y0, x0);
+	/* get the position of the opposite corner */
+	while ((code = get_position("Opposite corner",
+				    also, which, &x1, &y1)) == 0) {
+	    ;
+	}
+
+	if (code > 0) {
+	    int tly = MIN(y0, y1);
+	    int tlx = MIN(x0, x1);
+	    PANEL *pan = mkpanel(pair,
+				 ABS(y1 - y0) + 1,
+				 ABS(x1 - x0) + 1,
+				 tly, tlx);
+	    /* finish */
+	    myFill(pan);
+	    pans[which] = pan;
+	    pflush();
+	    wmove(stdscr, y1, x1);
+	}
+    }
+}
+
+static void
+my_move_panel(PANEL **pans, int which, bool continuous)
+{
+    if (pans[which] != 0) {
+	int code;
+	int y0, x0;
+	int y1, x1;
+	WINDOW *win = panel_window(pans[which]);
+	char also[80];
+
+	getbegyx(win, y0, x0);
+	_nc_SPRINTF(also, _nc_SLIMIT(sizeof(also)) " (start %d,%d)", y0, x0);
+	wmove(stdscr, y0, x0);
+	while ((code = get_position("Move panel", also, which, &x1, &y1)) == 0) {
+	    if (continuous) {
+		move_panel(pans[which], y1, x1);
+		pflush();
+	    }
+	}
+	if (code > 0) {
+	    move_panel(pans[which], y1, x1);
+	}
+    }
+}
+
+static void
+my_resize_panel(PANEL **pans, int which, FillPanel myFill)
+{
+    if (pans[which] != 0) {
+	int code;
+	int y0, x0;
+	int y1, x1;
+	WINDOW *win = panel_window(pans[which]);
+	char also[80];
+
+	getbegyx(win, y0, x0);
+	_nc_SPRINTF(also, _nc_SLIMIT(sizeof(also)) " (start %d,%d)", y0, x0);
+	wmove(stdscr, y0, x0);
+	while ((code = get_position("Resize panel",
+				    also, which, &x1, &y1)) == 0) {
+	    ;
+	}
+	if (code > 0) {
+	    WINDOW *next = newwin(ABS(y1 - y0) + 1,
+				  ABS(x1 - x0) + 1,
+				  MIN(y0, y1),
+				  MIN(x0, x1));
+	    if (next != 0) {
+		keypad(next, TRUE);
+		if (use_colors) {
+		    wbkgdset(next, (chtype) (COLOR_PAIR(which) | ' '));
+		} else if (!unboxed) {
+		    wbkgdset(next, A_BOLD | ' ');
+		}
+		replace_panel(pans[which], next);
+		myFill(pans[which]);
+		delwin(win);
+	    }
+	}
+    }
+}
+
+static void
+init_panel(void)
+{
+    register int y, x;
+
+    for (y = 0; y < LINES - 1; y++) {
+	for (x = 0; x < COLS; x++)
+	    wprintw(stdscr, "%d", (y + x) % 10);
+    }
+}
+
+static void
+fill_panel(PANEL *pan)
+{
+    WINDOW *win = panel_window(pan);
+    const char *userptr = (const char *) panel_userptr(pan);
+    int num = (userptr && *userptr) ? userptr[1] : '?';
+    int y, x;
+
+    wmove(win, 1, 1);
+    wprintw(win, "-pan%c-", num);
+    wclrtoeol(win);
+    box(win, 0, 0);
+    for (y = 2; y < getmaxy(win) - 1; y++) {
+	for (x = 1; x < getmaxx(win) - 1; x++) {
+	    wmove(win, y, x);
+	    waddch(win, UChar(num));
+	}
+    }
+}
+
+static void
+fill_unboxed(PANEL *pan)
+{
+    WINDOW *win = panel_window(pan);
+    const char *userptr = (const char *) panel_userptr(pan);
+    int num = (userptr && *userptr) ? userptr[1] : '?';
+    int y, x;
+
+    for (y = 0; y < getmaxy(win); y++) {
+	for (x = 0; x < getmaxx(win); x++) {
+	    wmove(win, y, x);
+	    waddch(win, UChar(num));
+	}
+    }
+}
+
+#if USE_WIDEC_SUPPORT
+static void
+make_fullwidth_digit(cchar_t *target, int digit)
+{
+    wchar_t source[2];
+
+    source[0] = (wchar_t) (digit + 0xff10);
+    source[1] = 0;
+    setcchar(target, source, A_NORMAL, 0, 0);
+}
+
+static void
+init_wide_panel(void)
+{
+    int digit;
+    cchar_t temp[10];
+
+    for (digit = 0; digit < 10; ++digit)
+	make_fullwidth_digit(&temp[digit], digit);
+
+    do {
+	int y, x;
+	getyx(stdscr, y, x);
+	digit = (y + x / 2) % 10;
+    } while (add_wch(&temp[digit]) != ERR);
+}
+
+static void
+fill_wide_panel(PANEL *pan)
+{
+    WINDOW *win = panel_window(pan);
+    int num = ((const char *) panel_userptr(pan))[1];
+    int y, x;
+
+    wmove(win, 1, 1);
+    wprintw(win, "-pan%c-", num);
+    wclrtoeol(win);
+    box(win, 0, 0);
+    for (y = 2; y < getmaxy(win) - 1; y++) {
+	for (x = 1; x < getmaxx(win) - 1; x++) {
+	    wmove(win, y, x);
+	    waddch(win, UChar(num));
+	}
+    }
+}
+#endif
+
+#define MAX_PANELS 5
+
+static int
+which_panel(PANEL *px[MAX_PANELS + 1], PANEL *pan)
+{
+    int result = 0;
+    int j;
+
+    for (j = 1; j <= MAX_PANELS; ++j) {
+	if (px[j] == pan) {
+	    result = j;
+	    break;
+	}
+    }
+    return result;
+}
+
+static void
+show_help(WINDOW *win)
+{
+    static const char *help[] =
+    {
+	"",
+	"Commands are letter/digit pairs.  Digits are the panel number.",
+	"",
+	"  b - put the panel on the bottom of the stack",
+	"  c - create the panel",
+	"  d - delete the panel",
+	"  h - hide the panel",
+	"  m - move the panel (M for continuous move)",
+	"  r - resize the panel",
+	"  s - show the panel",
+	"  t - put the panel on the top of the stack"
+    };
+    int j;
+
+    for (j = 0; j < (int) SIZEOF(help); ++j) {
+	if (wprintw(win, "%s\n", help[j]) == ERR)
+	    break;
+    }
+}
+
+static void
+show_panels(PANEL *px[MAX_PANELS + 1])
+{
+    struct {
+	bool valid;
+	bool hidden;
+	PANEL *above;
+	PANEL *below;
+    } table[MAX_PANELS + 1];
+
+    WINDOW *win;
+    int j;
+
+    memset(table, 0, sizeof(table));
+    for (j = 1; j <= MAX_PANELS; ++j) {
+	table[j].valid = (px[j] != 0);
+	if (table[j].valid) {
+	    table[j].hidden = panel_hidden(px[j]);
+	    table[j].above = panel_above(px[j]);
+	    table[j].below = panel_below(px[j]);
+	}
+    }
+
+    if ((win = newwin(LINES - 1, COLS, 0, 0)) != 0) {
+	PANEL *pan;
+
+	keypad(win, TRUE);
+	if ((pan = new_panel(win)) != 0) {
+	    werase(win);
+	    MvWPrintw(win, 0, 0, "Panels:\n");
+	    for (j = 1; j <= MAX_PANELS; ++j) {
+		if (table[j].valid) {
+		    wprintw(win, " %d:", j);
+		    if (table[j].hidden) {
+			waddstr(win, " hidden");
+		    } else {
+			if (table[j].above) {
+			    wprintw(win, " above %d",
+				    which_panel(px, table[j].above));
+			}
+			if (table[j].below) {
+			    wprintw(win, "%s below %d",
+				    table[j].above ? "," : "",
+				    which_panel(px, table[j].below));
+			}
+		    }
+		    waddch(win, '\n');
+		}
+	    }
+	    show_help(win);
+	    wgetch(win);
+	    del_panel(pan);
+	    pflush();
+	}
+	delwin(win);
+    }
+}
+
+#define wrapper(func) \
+static int my_##func(PANEL *pan) \
+{ \
+    int code = ERR; \
+    if (pan != 0) { \
+	code = func(pan); \
+    } \
+    return code; \
+}
+/* *INDENT-OFF* */
+wrapper(bottom_panel)
+wrapper(hide_panel)
+wrapper(show_panel)
+wrapper(top_panel)
+/* *INDENT-ON* */
+
+static void
+do_panel(PANEL *px[MAX_PANELS + 1],
+	 NCURSES_CONST char *cmd,
+	 FillPanel myFill)
+{
+    int which = cmd[1] - '0';
+
+    if (which < 1 || which > MAX_PANELS) {
+	beep();
+	return;
+    }
+
+    if (log_in != 0) {
+	pflush();
+    }
+
+    saywhat(cmd);
+    switch (*cmd) {
+    case 'b':
+	my_bottom_panel(px[which]);
+	break;
+    case 'c':
+	my_create_panel(px, which, myFill);
+	break;
+    case 'd':
+	my_remove_panel(px, which);
+	break;
+    case 'h':
+	my_hide_panel(px[which]);
+	break;
+    case 'm':
+	my_move_panel(px, which, FALSE);
+	break;
+    case 'M':
+	my_move_panel(px, which, TRUE);
+	break;
+    case 'r':
+	my_resize_panel(px, which, myFill);
+	break;
+    case 's':
+	my_show_panel(px[which]);
+	break;
+    case 't':
+	my_top_panel(px[which]);
+	break;
+    }
+}
+
+static bool
+ok_letter(int ch)
+{
+    return isalpha(UChar(ch)) && strchr("bcdhmMrst", ch) != 0;
+}
+
+static bool
+ok_digit(int ch)
+{
+    return isdigit(UChar(ch)) && (ch >= '1') && (ch - '0' <= MAX_PANELS);
+}
+
+/*
+ * A command consists of one or more letter/digit pairs separated by a space.
+ * Digits are limited to 1..MAX_PANELS.
+ *
+ * End the command with a newline.  Reject other characters.
+ */
+static bool
+get_command(PANEL *px[MAX_PANELS + 1], char *buffer, int limit)
+{
+    int length = 0;
+    int y0, x0;
+    WINDOW *win;
+
+    getyx(stdscr, y0, x0);
+    win = statusline();
+    waddstr(win, "Command:");
+    buffer[length = 0] = '\0';
+
+    if (log_in != 0) {
+	if (fgets(buffer, limit - 3, log_in) != 0) {
+	    length = (int) strlen(buffer);
+	    while (length > 0 && isspace(UChar(buffer[length - 1])))
+		buffer[--length] = '\0';
+	    waddstr(win, buffer);
+	} else {
+	    close_input();
+	}
+	(void) wgetch(win);
+    } else {
+	int c0 = 0;
+	for (;;) {
+	    int ch = wgetch(win);
+	    if (ch == ERR || ch == QUIT || ch == ESCAPE) {
+		buffer[0] = '\0';
+		break;
+	    } else if (ch == CTRL('L')) {
+		wrefresh(curscr);
+	    } else if (ch == '\n' || ch == KEY_ENTER) {
+		break;
+	    } else if (ch == HELP_KEY_1) {
+		show_panels(px);
+	    } else if (length + 3 < limit) {
+		if (ch >= KEY_MIN) {
+		    beep();
+		} else if (ok_letter(UChar(ch))) {
+		    if (isalpha(UChar(c0))) {
+			beep();
+		    } else if (isdigit(UChar(c0))) {
+			wprintw(win, " %c", ch);
+			buffer[length++] = ' ';
+			buffer[length++] = (char) (c0 = ch);
+		    } else {
+			wprintw(win, "%c", ch);
+			buffer[length++] = (char) (c0 = ch);
+		    }
+		} else if (ok_digit(ch)) {
+		    if (isalpha(UChar(c0))) {
+			wprintw(win, "%c", ch);
+			buffer[length++] = (char) (c0 = ch);
+		    } else {
+			beep();
+		    }
+		} else if (ch == ' ') {
+		    if (isdigit(UChar(c0))) {
+			wprintw(win, "%c", ch);
+			buffer[length++] = (char) (c0 = ch);
+		    } else {
+			beep();
+		    }
+		} else {
+		    beep();
+		}
+	    } else {
+		beep();
+	    }
+	}
+    }
+
+    wmove(stdscr, y0, x0);
+
+    buffer[length] = '\0';
+    if (log_out && length) {
+	fprintf(log_out, "%s\n", buffer);
+    }
+    return (length != 0);
+}
+
+static void
+demo_panels(InitPanel myInit, FillPanel myFill)
+{
+    int itmp;
+    PANEL *px[MAX_PANELS + 1];
+    char buffer[BUFSIZ];
+
+    scrollok(stdscr, FALSE);	/* we don't want stdscr to scroll! */
+    refresh();
+
+    myInit();
+    memset(px, 0, sizeof(px));
+
+    while (get_command(px, buffer, sizeof(buffer))) {
+	int limit = (int) strlen(buffer);
+	for (itmp = 0; itmp < limit; itmp += 3) {
+	    do_panel(px, buffer + itmp, myFill);
+	}
+	pflush();
+    }
+#if NO_LEAKS
+    for (itmp = 1; itmp <= MAX_PANELS; ++itmp) {
+	my_remove_panel(px, itmp);
+    }
+#endif
+}
+
+static void
+usage(int ok)
+{
+    static const char *const tbl[] =
+    {
+	"Usage: demo_panels [options]"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+	," -i file  read commands from file"
+	," -o file  record commands in file"
+	," -m       do not use colors"
+#if USE_WIDEC_SUPPORT
+	," -w       use wide-characters in panels and background"
+#endif
+	," -x       do not enclose panels in boxes"
+    };
+    size_t n;
+    for (n = 0; n < SIZEOF(tbl); n++)
+	fprintf(stderr, "%s\n", tbl[n]);
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+    bool monochrome = FALSE;
+    InitPanel myInit = init_panel;
+    FillPanel myFill = fill_panel;
+
+    setlocale(LC_ALL, "");
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "i:o:mwx")) != -1) {
+	switch (ch) {
+	case 'i':
+	    log_in = fopen(optarg, "r");
+	    break;
+	case 'o':
+	    log_out = fopen(optarg, "w");
+	    break;
+	case 'm':
+	    monochrome = TRUE;
+	    break;
+#if USE_WIDEC_SUPPORT
+	case 'w':
+	    myInit = init_wide_panel;
+	    myFill = fill_wide_panel;
+	    break;
+#endif
+	case 'x':
+	    unboxed = TRUE;
+	    break;
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (unboxed)
+	myFill = fill_unboxed;
+
+    initscr();
+    cbreak();
+    noecho();
+    keypad(stdscr, TRUE);
+
+    use_colors = monochrome ? FALSE : has_colors();
+    if (use_colors)
+	start_color();
+
+    demo_panels(myInit, myFill);
+    endwin();
+
+    close_input();
+    close_output();
+
+    ExitProgram(EXIT_SUCCESS);
+}
+#else
+int
+main(void)
+{
+    printf("This program requires the curses panel library\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif
diff --git a/test/demo_tabs.c b/test/demo_tabs.c
new file mode 100644
index 0000000..16c1ad5
--- /dev/null
+++ b/test/demo_tabs.c
@@ -0,0 +1,127 @@
+/****************************************************************************
+ * Copyright 2019-2020,2022 Thomas E. Dickey                                *
+ *                                                                          *
+ * 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.                                                           *
+ ****************************************************************************/
+
+/*
+ * Author: Thomas E. Dickey
+ *
+ * $Id: demo_tabs.c,v 1.10 2022/12/04 00:40:11 tom Exp $
+ *
+ * A simple demo of tabs in curses.
+ */
+#define USE_CURSES
+#define USE_TINFO
+#include <test.priv.h>
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: demo_tabs [options]"
+	,""
+	,"Print a grid to test tab-stops with the curses interface"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+	," -l COUNT total number of lines to show"
+	," -t NUM   set TABSIZE variable to the given value"
+    };
+    unsigned n;
+    for (n = 0; n < SIZEOF(msg); ++n) {
+	fprintf(stderr, "%s\n", msg[n]);
+    }
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int tabstop;
+    int ch, col, row, step;
+    int line_limit = -1;
+    int curses_stops = -1;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "l:t:")) != -1) {
+	switch (ch) {
+	case 'l':
+	    line_limit = atoi(optarg);
+	    break;
+	case 't':
+	    curses_stops = atoi(optarg);
+	    break;
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+
+    initscr();
+    noecho();
+    cbreak();
+    if (curses_stops > 0)
+	set_tabsize(curses_stops);
+#if HAVE_TIGETNUM
+    tabstop = tigetnum("it");
+    if (tabstop <= 0)
+#endif
+	tabstop = 8;
+    for (row = 0; row < LINES; ++row) {
+	move(row, 0);
+	for (col = step = 0; col < COLS - 1; ++col) {
+	    if (row == 0) {
+		chtype ct = '-';
+		if ((col % tabstop) == 0)
+		    ct = '+';
+		addch(ct);
+	    } else if (col + 1 < row) {
+		addch('*');
+	    } else {
+		printw("%x", step);
+		col = (row + (tabstop * ++step));
+		col /= tabstop;
+		col *= tabstop;
+		col -= 1;
+		if ((col + tabstop) < COLS)
+		    addch('\t');
+		refresh();
+	    }
+	}
+	addch('\n');
+	if (line_limit > 0 && row >= line_limit)
+	    break;
+    }
+    getch();
+    endwin();
+    ExitProgram(EXIT_SUCCESS);
+}
diff --git a/test/demo_termcap.c b/test/demo_termcap.c
new file mode 100644
index 0000000..468bd97
--- /dev/null
+++ b/test/demo_termcap.c
@@ -0,0 +1,930 @@
+/****************************************************************************
+ * Copyright 2019-2021,2022 Thomas E. Dickey                                *
+ * Copyright 2005-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/*
+ * Author: Thomas E. Dickey
+ *
+ * $Id: demo_termcap.c,v 1.64 2022/12/10 23:22:09 tom Exp $
+ *
+ * A simple demo of the termcap interface.
+ */
+#define USE_TINFO
+#include <test.priv.h>
+#include <sys/stat.h>
+
+#if NCURSES_XNAMES
+#if HAVE_TERM_ENTRY_H
+#include <term_entry.h>
+#else
+#undef NCURSES_XNAMES
+#define NCURSES_XNAMES 0
+#endif
+#endif
+
+#if defined(NCURSES_VERSION)
+#if HAVE_NCURSES_TERMCAP_H
+#include <ncurses/termcap.h>
+#elif HAVE_TERMCAP_H
+#include <termcap.h>
+#endif
+#endif
+
+static GCC_NORETURN void failed(const char *);
+
+static void
+failed(const char *msg)
+{
+    fprintf(stderr, "%s\n", msg);
+    ExitProgram(EXIT_FAILURE);
+}
+
+#if HAVE_TGETENT
+
+#if defined(HAVE_CURSES_DATA_BOOLNAMES) || defined(DECL_CURSES_DATA_BOOLNAMES)
+#define USE_CODE_LISTS 1
+#else
+#define USE_CODE_LISTS 0
+#endif
+
+#define FCOLS 8
+#define FNAME(type) "%s %-*s = ", #type, FCOLS
+
+static bool b_opt = FALSE;
+static bool n_opt = FALSE;
+static bool s_opt = FALSE;
+static bool q_opt = FALSE;
+#ifdef NCURSES_VERSION
+static bool x_opt = FALSE;
+static bool y_opt = FALSE;
+#endif
+
+static char *d_opt;
+static char *e_opt;
+static char **db_list;
+static int db_item;
+
+static char *my_blob;
+static char **my_boolcodes;
+static char **my_numcodes;
+static char **my_numvalues;
+static char **my_strcodes;
+static char **my_strvalues;
+
+static long total_values;
+static long total_b_values;
+static long total_n_values;
+static long total_s_values;
+
+#define isCapName(c) (isgraph(c) && strchr("^=:\\", c) == 0)
+#define EachCapName(n) n = 33; n < 127; ++n
+
+static char *
+make_dbitem(char *p, char *q)
+{
+    size_t need = strlen(e_opt) + 2 + (size_t) (p - q);
+    char *result = malloc(need);
+    _nc_SPRINTF(result, _nc_SLIMIT(need) "%s=%.*s", e_opt, (int) (p - q), q);
+    return result;
+}
+
+static void
+make_dblist(void)
+{
+    if (d_opt && e_opt) {
+	int pass;
+
+	for (pass = 0; pass < 2; ++pass) {
+	    char *p, *q;
+	    size_t count = 0;
+
+	    for (p = q = d_opt; *p != '\0'; ++p) {
+		if (*p == ':') {
+		    if (p != q + 1) {
+			if (pass) {
+			    db_list[count] = make_dbitem(p, q);
+			}
+			count++;
+		    }
+		    q = p + 1;
+		}
+	    }
+	    if (p != q + 1) {
+		if (pass) {
+		    db_list[count] = make_dbitem(p, q);
+		}
+		count++;
+	    }
+	    if (!pass) {
+		db_list = typeCalloc(char *, count + 1);
+	    }
+	}
+    }
+}
+
+static char *
+next_dbitem(void)
+{
+    char *result = 0;
+
+    if (db_list) {
+	if ((result = db_list[db_item]) == 0) {
+	    db_item = 0;
+	    result = db_list[0];
+	} else {
+	    db_item++;
+	}
+    }
+    if (result != 0)
+	printf("** %s\n", result);
+    return result;
+}
+
+#if NO_LEAKS
+static void
+free_dblist(void)
+{
+    if (db_list) {
+	int n;
+	for (n = 0; db_list[n]; ++n)
+	    free(db_list[n]);
+	free(db_list);
+	db_list = 0;
+    }
+}
+#endif /* NO_LEAKS */
+
+static void
+show_string(const char *name, const char *value)
+{
+    printf(FNAME(str), name);
+    if (value == ((char *) -1)) {
+	printf("CANCELLED");
+    } else if (value == ((char *) 0)) {
+	printf("ABSENT");
+    } else {
+	while (*value != 0) {
+	    int ch = UChar(*value++);
+	    switch (ch) {
+	    case '\177':
+		fputs("^?", stdout);
+		break;
+	    case '\033':
+		fputs("\\E", stdout);
+		break;
+	    case '\b':
+		fputs("\\b", stdout);
+		break;
+	    case '\f':
+		fputs("\\f", stdout);
+		break;
+	    case '\n':
+		fputs("\\n", stdout);
+		break;
+	    case '\r':
+		fputs("\\r", stdout);
+		break;
+	    case ' ':
+		fputs("\\s", stdout);
+		break;
+	    case '\t':
+		fputs("\\t", stdout);
+		break;
+	    case '^':
+		fputs("\\^", stdout);
+		break;
+	    case ':':
+		fputs("\\072", stdout);
+		break;
+	    case '\\':
+		fputs("\\\\", stdout);
+		break;
+	    default:
+		if (isgraph(ch))
+		    fputc(ch, stdout);
+		else if (ch < 32)
+		    printf("^%c", ch + '@');
+		else
+		    printf("\\%03o", ch);
+		break;
+	    }
+	}
+    }
+    printf("\n");
+}
+
+static void
+show_number(const char *name, int value)
+{
+    printf(FNAME(num), name);
+    printf(" %d\n", value);
+}
+
+static void
+dumpit(NCURSES_CONST char *cap)
+{
+    /*
+     * One of the limitations of the termcap interface is that the library
+     * cannot determine the size of the buffer passed via tgetstr(), nor the
+     * amount of space remaining.  This demo simply reuses the whole buffer
+     * for each call; a normal termcap application would try to use the buffer
+     * to hold all of the strings extracted from the terminal entry.
+     */
+    char area[1024], *ap = area;
+    char *str;
+    int num;
+
+    if ((str = tgetstr(cap, &ap)) != 0) {
+	total_values++;
+	total_s_values++;
+	if (!q_opt) {
+	    /*
+	     * Note that the strings returned are mostly terminfo format, since
+	     * ncurses does not convert except for a handful of special cases.
+	     */
+	    show_string(cap, str);
+	}
+    } else if ((num = tgetnum(cap)) >= 0) {
+	total_values++;
+	total_n_values++;
+	if (!q_opt) {
+	    show_number(cap, num);
+	}
+    } else if (tgetflag(cap) > 0) {
+	total_values++;
+	total_b_values++;
+	if (!q_opt) {
+	    printf(FNAME(flg), cap);
+	    printf("%s\n", "true");
+	}
+    }
+
+    if (!q_opt)
+	fflush(stdout);
+}
+
+static void
+brute_force(const char *name)
+{
+    char buffer[1024];
+
+    if (db_list) {
+	putenv(next_dbitem());
+    }
+    if (!q_opt)
+	printf("Terminal type \"%s\"\n", name);
+    if (tgetent(buffer, name) >= 0) {
+	char cap[3];
+	int c1, c2;
+
+	cap[2] = 0;
+	for (EachCapName(c1)) {
+	    cap[0] = (char) c1;
+	    if (isCapName(c1)) {
+		for (EachCapName(c2)) {
+		    cap[1] = (char) c2;
+		    if (isCapName(c2)) {
+			dumpit(cap);
+		    }
+		}
+	    }
+	}
+    }
+}
+
+#if NCURSES_XNAMES
+static void
+dump_xname(NCURSES_CONST char *cap)
+{
+    if (strlen(cap) == 2)
+	dumpit(cap);
+}
+#endif
+
+static void
+demo_termcap(NCURSES_CONST char *name)
+{
+    char buffer[1024];
+
+    if (db_list) {
+	putenv(next_dbitem());
+    }
+    if (!q_opt)
+	printf("Terminal type \"%s\"\n", name);
+    if (tgetent(buffer, name) >= 0) {
+	NCURSES_CONST char *cap;
+	unsigned n;
+
+	if (b_opt) {
+	    for (n = 0;; ++n) {
+		cap = my_boolcodes[n];
+		if (cap == 0)
+		    break;
+		dumpit(cap);
+	    }
+	}
+
+	if (n_opt) {
+	    for (n = 0;; ++n) {
+		cap = my_numcodes[n];
+		if (cap == 0)
+		    break;
+		dumpit(cap);
+	    }
+	}
+
+	if (s_opt) {
+	    for (n = 0;; ++n) {
+		cap = my_strcodes[n];
+		if (cap == 0)
+		    break;
+		dumpit(cap);
+	    }
+	}
+#ifdef NCURSES_VERSION
+	if (x_opt && (my_blob == 0) && y_opt) {
+#if NCURSES_XNAMES
+	    TERMTYPE *term = (TERMTYPE *) cur_term;
+	    if (term != 0
+		&& ((NUM_BOOLEANS(term) != BOOLCOUNT)
+		    || (NUM_NUMBERS(term) != NUMCOUNT)
+		    || (NUM_STRINGS(term) != STRCOUNT))) {
+		for (n = BOOLCOUNT; n < NUM_BOOLEANS(term); ++n) {
+		    dump_xname(ExtBoolname(term, (int) n, boolnames));
+		}
+		for (n = NUMCOUNT; n < NUM_NUMBERS(term); ++n) {
+		    dump_xname(ExtNumname(term, (int) n, numnames));
+		}
+		for (n = STRCOUNT; n < NUM_STRINGS(term); ++n) {
+		    dump_xname(ExtStrname(term, (int) n, strnames));
+		}
+	    }
+#endif
+	}
+#endif
+    }
+}
+
+typedef enum {
+    pDefault = 0
+    ,pComment
+    ,pDescription
+    ,pEscaped
+    ,pNewline
+    ,pName
+    ,pNumber
+    ,pString
+} STATE;
+
+static void
+parse_description(const char *input_name)
+{
+    static char empty[1];
+
+    FILE *fp;
+    struct stat sb;
+    size_t count_bools = 0;
+    size_t count_nums = 0;
+    size_t count_strs = 0;
+    size_t len;
+    size_t j, k;
+    STATE state;
+
+    if (stat(input_name, &sb) != 0
+	|| (sb.st_mode & S_IFMT) != S_IFREG) {
+	failed("input is not a file");
+    }
+
+    if (sb.st_size == 0) {
+	failed("input is empty");
+    }
+
+    /*
+     * None of the arrays could be larger than the input-file, and since it
+     * is small, just allocate the maximum for simplicity.
+     */
+    if ((my_blob = malloc((size_t) sb.st_size + 1)) == 0 ||
+	(my_boolcodes = typeCalloc(char *, sb.st_size)) == 0 ||
+	  (my_numcodes = typeCalloc(char *, sb.st_size)) == 0 ||
+	  (my_numvalues = typeCalloc(char *, sb.st_size)) == 0 ||
+	  (my_strcodes = typeCalloc(char *, sb.st_size)) == 0 ||
+	  (my_strvalues = typeCalloc(char *, sb.st_size)) == 0) {
+	failed("cannot allocate memory for input-file");
+    }
+
+    if ((fp = fopen(input_name, "r")) == 0)
+	failed("cannot open input-file");
+    len = fread(my_blob, sizeof(char), (size_t) sb.st_size, fp);
+    my_blob[sb.st_size] = '\0';
+    fclose(fp);
+
+    /*
+     * First, get rid of comments and escaped newlines, as well as repeated
+     * colons to construct a canonical entry.
+     *
+     * FIXME: actually this should make an additional pass just to strip
+     * comment-lines and escaped newlines.  But it is workable for infocmp
+     * output.
+     */
+    state = pNewline;
+    for (j = k = 0; j < len; ++j) {
+	int ch = my_blob[j];
+	if (ch == '\t') {
+	    ch = ' ';
+	}
+	switch (state) {
+	case pNewline:
+	    if (ch == ' ') {
+		continue;
+	    }
+	    if (ch == '#') {
+		state = pComment;
+		continue;
+	    }
+	    state = pDefault;
+	    /* FALLTHRU */
+	case pDefault:
+	    switch (ch) {
+	    case '|':
+		state = pDescription;
+		continue;
+	    case '\\':
+		state = pEscaped;
+		continue;
+	    case '\n':
+		state = pNewline;
+		continue;
+	    case ' ':
+	    case ':':
+		break;
+	    default:
+		state = pName;
+		break;
+	    }
+	    my_blob[k++] = (char) ch;
+	    break;
+	case pComment:
+	    if (ch == '\n')
+		state = pNewline;
+	    break;
+	case pDescription:
+	    switch (ch) {
+	    case ':':
+		state = pDefault;
+		break;
+	    case '\n':
+		state = pNewline;
+		break;
+	    }
+	    break;
+	case pEscaped:
+	    if (ch != '\n') {
+		my_blob[k++] = (char) ch;
+		state = pDefault;
+	    } else {
+		state = pNewline;
+	    }
+	    break;
+	case pName:
+	    switch (ch) {
+	    case '\n':
+		state = pNewline;
+		continue;
+	    case ' ':
+	    case ':':
+		state = pDefault;
+		break;
+	    case '#':
+		state = pNumber;
+		break;
+	    case '|':
+		state = pDescription;
+		continue;
+	    }
+	    my_blob[k++] = (char) ch;
+	    break;
+	case pNumber:
+	    switch (ch) {
+	    case '\n':
+		state = pNewline;
+		continue;
+	    case ':':
+		state = pDefault;
+		break;
+	    case ' ':
+		state = pDefault;
+		continue;
+	    }
+	    my_blob[k++] = (char) ch;
+	    break;
+	case pString:
+	    switch (ch) {
+	    case '\\':
+		if (my_blob[j + 1] == '\0') {
+		    state = pDefault;
+		    continue;
+		}
+		break;
+	    case '\n':
+		state = pNewline;
+		continue;
+	    case ':':
+		state = pDefault;
+		break;
+	    }
+	    my_blob[k++] = (char) ch;
+	    break;
+	default:
+	    /* not used */
+	    break;
+	}
+    }
+    my_blob[k] = '\0';
+
+    /*
+     * Then, parse what's left, making indexes of the names and values.
+     */
+    state = pDefault;
+    for (j = 0; my_blob[j] != '\0'; ++j) {
+	switch (state) {
+	case pDefault:
+	    switch (my_blob[j]) {
+	    case '\\':
+		state = pEscaped;
+		break;
+	    case ':':
+		my_blob[j] = '\0';
+		if (my_blob[j + 1] != '\0' && my_blob[j + 1] != ':')
+		    state = pName;
+		break;
+	    case ' ':
+		break;
+	    default:
+		break;
+	    }
+	case pEscaped:
+	    break;
+	case pName:
+	    state = pDefault;
+	    /*
+	     * Commented-out capabilities might be accessible (they are in
+	     * ncurses).
+	     */
+	    if (my_blob[j] == '.' && my_blob[j + 1] == '.') {
+		j += 2;
+	    }
+	    if (my_blob[j + 1] != '\0') {
+		switch (my_blob[j + 2]) {
+		case '#':
+		    my_numvalues[count_nums] = &my_blob[j + 3];
+		    my_numcodes[count_nums++] = &my_blob[j];
+		    my_blob[j + 2] = '\0';
+		    state = pNumber;
+		    j += 2;
+		    break;
+		case '=':
+		    my_strvalues[count_strs] = &my_blob[j + 3];
+		    my_strcodes[count_strs++] = &my_blob[j];
+		    my_blob[j + 2] = '\0';
+		    state = pString;
+		    j += 2;
+		    break;
+		default:
+		    if (my_blob[j + 2] == '@') {
+			/*
+			 * We cannot get the type for a cancelled item
+			 * directly, but can infer it assuming the input
+			 * came from infocmp, which puts the data in a
+			 * known order.
+			 */
+			if (count_strs) {
+			    my_strvalues[count_strs] = empty;
+			    my_strcodes[count_strs++] = &my_blob[j];
+			} else if (count_nums) {
+			    my_numvalues[count_nums] = empty;
+			    my_numcodes[count_nums++] = &my_blob[j];
+			} else {
+			    my_boolcodes[count_bools++] = &my_blob[j];
+			}
+		    } else {
+			my_boolcodes[count_bools++] = &my_blob[j];
+		    }
+		    j++;
+		    break;
+		}
+	    }
+	    break;
+	case pNumber:
+	    if (!isdigit(UChar(my_blob[j]))) {
+		--j;
+		state = pDefault;
+	    }
+	    break;
+	case pString:
+	    switch (my_blob[j]) {
+	    case '\\':
+		if (my_blob[j + 1] == '\0') {
+		    state = pDefault;
+		    continue;
+		} else {
+		    ++j;
+		}
+		break;
+	    case '\n':
+		state = pNewline;
+		continue;
+	    case ':':
+		--j;
+		state = pDefault;
+		break;
+	    }
+	    break;
+	case pNewline:
+	case pComment:
+	case pDescription:
+	default:
+	    break;
+	}
+    }
+    my_boolcodes[count_bools] = 0;
+    my_numcodes[count_nums] = 0;
+    my_numvalues[count_nums] = 0;
+    my_strcodes[count_strs] = 0;
+    my_strvalues[count_strs] = 0;
+
+#if 0
+    printf("bools:%d\n", (int) count_bools);
+    for (j = 0; my_boolcodes[j]; ++j)
+	printf("%5d:%s\n", (int) j, my_boolcodes[j]);
+
+    printf("numbers:%d\n", (int) count_nums);
+    for (j = 0; my_numcodes[j]; ++j)
+	printf("%5d:%s(%s)\n", (int) j, my_numcodes[j], my_numvalues[j]);
+
+    printf("strings:%d\n", (int) count_strs);
+    for (j = 0; my_strcodes[j]; ++j)
+	printf("%5d:%s(%s)\n", (int) j, my_strcodes[j], my_strvalues[j]);
+#endif
+}
+
+#if USE_CODE_LISTS
+static char **
+copy_code_list(NCURSES_CONST char *const *list)
+{
+    int pass;
+    size_t count;
+    size_t length = 1;
+    char **result = 0;
+    char *unused = 0;
+
+    for (pass = 0; pass < 2; ++pass) {
+	for (count = 0; list[count] != 0; ++count) {
+	    size_t chunk = strlen(list[count]) + 1;
+	    if (pass == 0) {
+		length += chunk;
+	    } else {
+		result[count] = unused;
+		_nc_STRCPY(unused, list[count], length);
+		unused += chunk;
+	    }
+	}
+	if (pass == 0) {
+	    char *blob = malloc(length);
+	    result = typeCalloc(char *, count + 1);
+	    unused = blob;
+	    if (blob == 0 || result == 0)
+		failed("copy_code_list failed");
+	}
+    }
+
+    return result;
+}
+
+#if NO_LEAKS
+static void
+free_code_list(char **list)
+{
+    if (list) {
+	free(list[0]);
+	free(list);
+    }
+}
+#endif /* NO_LEAKS */
+#endif /* USE_CODE_LISTS */
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: demo_termcap [options] [terminal]"
+	,""
+	,"If no options are given, print all (boolean, numeric, string)"
+	,"capabilities for the given terminal, using short names."
+	,""
+	,USAGE_COMMON
+	,"Options:"
+	," -a       try all names, print capabilities found"
+	," -b       print boolean-capabilities"
+	," -d LIST  colon-separated list of databases to use"
+	," -e NAME  environment variable to set with -d option"
+	," -i NAME  terminal description to use as names for \"-a\" option, etc."
+	," -n       print numeric-capabilities"
+	," -q       quiet (prints only counts)"
+	," -r COUNT repeat for given count"
+	," -s       print string-capabilities"
+	," -v       print termcap-variables"
+#ifdef NCURSES_VERSION
+	," -x       print extended capabilities"
+#endif
+    };
+    unsigned n;
+    for (n = 0; n < SIZEOF(msg); ++n) {
+	fprintf(stderr, "%s\n", msg[n]);
+    }
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+    int n;
+    char *name;
+    bool a_opt = FALSE;
+#if defined(NCURSES_VERSION) || defined(HAVE_CURSES_DATA_OSPEED)
+    bool v_opt = FALSE;
+#endif
+    char *input_name = 0;
+
+    int repeat;
+    int r_opt = 1;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "abd:e:i:nqr:svxy")) != -1) {
+	switch (ch) {
+	case 'a':
+	    a_opt = TRUE;
+	    break;
+	case 'b':
+	    b_opt = TRUE;
+	    break;
+	case 'd':
+	    d_opt = optarg;
+	    break;
+	case 'e':
+	    e_opt = optarg;
+	    break;
+	case 'i':
+	    input_name = optarg;
+	    break;
+	case 'n':
+	    n_opt = TRUE;
+	    break;
+	case 'q':
+	    q_opt = TRUE;
+	    break;
+	case 'r':
+	    if ((r_opt = atoi(optarg)) <= 0)
+		usage(FALSE);
+	    break;
+	case 's':
+	    s_opt = TRUE;
+	    break;
+#if defined(NCURSES_VERSION) || defined(HAVE_CURSES_DATA_OSPEED)
+	case 'v':
+	    v_opt = TRUE;
+	    break;
+#endif
+#ifdef NCURSES_VERSION
+#if NCURSES_XNAMES
+	case 'x':
+	    x_opt = TRUE;
+	    break;
+	case 'y':
+	    y_opt = TRUE;
+	    x_opt = TRUE;
+	    break;
+#endif
+#endif
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+
+#if HAVE_USE_EXTENDED_NAMES
+    use_extended_names(x_opt);
+#endif
+
+    if (!(b_opt || n_opt || s_opt)) {
+	b_opt = TRUE;
+	n_opt = TRUE;
+	s_opt = TRUE;
+    }
+
+    make_dblist();
+
+    if (a_opt) {
+	for (repeat = 0; repeat < r_opt; ++repeat) {
+	    if (optind < argc) {
+		for (n = optind; n < argc; ++n) {
+		    brute_force(argv[n]);
+		}
+	    } else if ((name = getenv("TERM")) != 0) {
+		brute_force(name);
+	    } else {
+		static char dumb[] = "dumb";
+		brute_force(dumb);
+	    }
+	}
+    } else {
+	if (input_name != 0) {
+	    parse_description(input_name);
+	}
+#if USE_CODE_LISTS
+	else {
+	    my_boolcodes = copy_code_list(boolcodes);
+	    my_numcodes = copy_code_list(numcodes);
+	    my_strcodes = copy_code_list(strcodes);
+	}
+#else
+	else {
+	    failed("no capability-lists available (use -i option)");
+	}
+#endif /* USE_CODE_LISTS */
+	for (repeat = 0; repeat < r_opt; ++repeat) {
+	    if (optind < argc) {
+		for (n = optind; n < argc; ++n) {
+		    demo_termcap(argv[n]);
+		}
+	    } else if ((name = getenv("TERM")) != 0) {
+		demo_termcap(name);
+	    } else {
+		static char dumb[] = "dumb";
+		demo_termcap(dumb);
+	    }
+	}
+    }
+
+    printf("%ld values (%ld booleans, %ld numbers, %ld strings)\n",
+	   total_values, total_b_values, total_n_values, total_s_values);
+
+#if defined(NCURSES_VERSION) || defined(HAVE_CURSES_DATA_OSPEED)
+    if (v_opt) {
+	show_number("PC", PC);
+	show_string("UP", UP);
+	show_string("BC", BC);
+	show_number("ospeed", (int) ospeed);
+    }
+#endif
+
+#if NO_LEAKS
+    free_dblist();
+#if USE_CODE_LISTS
+    free_code_list(my_boolcodes);
+    free_code_list(my_numcodes);
+    free_code_list(my_strcodes);
+#endif
+#endif /* NO_LEAKS */
+
+    ExitProgram(EXIT_SUCCESS);
+}
+
+#else
+int
+main(void)
+{
+    failed("This program requires termcap");
+}
+#endif
diff --git a/test/demo_terminfo.c b/test/demo_terminfo.c
new file mode 100644
index 0000000..1b2d426
--- /dev/null
+++ b/test/demo_terminfo.c
@@ -0,0 +1,962 @@
+/****************************************************************************
+ * Copyright 2019-2021,2022 Thomas E. Dickey                                *
+ * Copyright 2009-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/*
+ * Author: Thomas E. Dickey
+ *
+ * $Id: demo_terminfo.c,v 1.56 2022/12/10 23:22:09 tom Exp $
+ *
+ * A simple demo of the terminfo interface.
+ */
+#define USE_TINFO
+#include <test.priv.h>
+#include <sys/stat.h>
+
+#if NCURSES_XNAMES
+#if HAVE_TERM_ENTRY_H
+#include <term_entry.h>
+#else
+#undef NCURSES_XNAMES
+#define NCURSES_XNAMES 0
+#endif
+#endif
+
+static GCC_NORETURN void failed(const char *);
+
+static void
+failed(const char *msg)
+{
+    fprintf(stderr, "%s\n", msg);
+    ExitProgram(EXIT_FAILURE);
+}
+
+#if HAVE_TIGETSTR
+
+#if defined(HAVE_CURSES_DATA_BOOLNAMES) || defined(DECL_CURSES_DATA_BOOLNAMES)
+#define USE_CODE_LISTS 1
+#else
+#define USE_CODE_LISTS 0
+#endif
+
+static bool a_opt = FALSE;
+static bool b_opt = FALSE;
+static bool f_opt = FALSE;
+static bool n_opt = FALSE;
+static bool q_opt = FALSE;
+static bool s_opt = FALSE;
+#ifdef NCURSES_VERSION
+static bool x_opt = FALSE;
+static bool y_opt = FALSE;
+#endif
+
+static char *d_opt;
+static char *e_opt;
+static char **db_list;
+static int db_item;
+
+static char *my_blob;
+static char **my_boolcodes;
+static char **my_numcodes;
+static char **my_numvalues;
+static char **my_strcodes;
+static char **my_strvalues;
+
+static long total_values;
+static long total_b_values;
+static long total_n_values;
+static long total_s_values;
+
+#define FCOLS 8
+#define FNAME(type) "%s %-*s = ", #type, f_opt ? 24 : FCOLS
+
+static char *
+make_dbitem(char *p, char *q)
+{
+    size_t need = strlen(e_opt) + 2 + (size_t) (p - q);
+    char *result = malloc(need);
+    _nc_SPRINTF(result, _nc_SLIMIT(need) "%s=%.*s", e_opt, (int) (p - q), q);
+    return result;
+}
+
+static void
+make_dblist(void)
+{
+    if (d_opt && e_opt) {
+	int pass;
+
+	for (pass = 0; pass < 2; ++pass) {
+	    char *p, *q;
+	    size_t count = 0;
+
+	    for (p = q = d_opt; *p != '\0'; ++p) {
+		if (*p == ':') {
+		    if (p != q + 1) {
+			if (pass) {
+			    db_list[count] = make_dbitem(p, q);
+			}
+			count++;
+		    }
+		    q = p + 1;
+		}
+	    }
+	    if (p != q + 1) {
+		if (pass) {
+		    db_list[count] = make_dbitem(p, q);
+		}
+		count++;
+	    }
+	    if (!pass) {
+		db_list = typeCalloc(char *, count + 1);
+	    }
+	}
+    }
+}
+
+static char *
+next_dbitem(void)
+{
+    char *result = 0;
+
+    if (db_list) {
+	if ((result = db_list[db_item]) == 0) {
+	    db_item = 0;
+	    result = db_list[0];
+	} else {
+	    db_item++;
+	}
+    }
+    if (result != 0)
+	printf("** %s\n", result);
+    return result;
+}
+
+#if NO_LEAKS
+static void
+free_dblist(void)
+{
+    if (db_list) {
+	int n;
+	for (n = 0; db_list[n]; ++n)
+	    free(db_list[n]);
+	free(db_list);
+	db_list = 0;
+    }
+}
+#endif
+
+static void
+dumpit(NCURSES_CONST char *cap, const char *show)
+{
+    const char *str;
+    int num;
+
+    if ((str = tigetstr(cap)) != 0 && (str != (char *) -1)) {
+	total_values++;
+	total_s_values++;
+	if (!q_opt) {
+	    printf(FNAME(str), show ? show : cap);
+	    while (*str != 0) {
+		int ch = UChar(*str++);
+		switch (ch) {
+		case '\177':
+		    fputs("^?", stdout);
+		    break;
+		case '\033':
+		    fputs("\\E", stdout);
+		    break;
+		case '\b':
+		    fputs("\\b", stdout);
+		    break;
+		case '\f':
+		    fputs("\\f", stdout);
+		    break;
+		case '\n':
+		    fputs("\\n", stdout);
+		    break;
+		case '\r':
+		    fputs("\\r", stdout);
+		    break;
+		case ' ':
+		    fputs("\\s", stdout);
+		    break;
+		case '\t':
+		    fputs("\\t", stdout);
+		    break;
+		case '^':
+		    fputs("\\^", stdout);
+		    break;
+		case ':':
+		    fputs("\\072", stdout);
+		    break;
+		case '\\':
+		    fputs("\\\\", stdout);
+		    break;
+		default:
+		    if (isgraph(ch))
+			fputc(ch, stdout);
+		    else if (ch < 32)
+			printf("^%c", ch + '@');
+		    else
+			printf("\\%03o", ch);
+		    break;
+		}
+	    }
+	    printf("\n");
+	}
+    } else if ((num = tigetnum(cap)) >= 0) {
+	total_values++;
+	total_n_values++;
+	if (!q_opt) {
+	    printf(FNAME(num), show ? show : cap);
+	    printf(" %d\n", num);
+	}
+    } else if ((num = tigetflag(cap)) >= 0) {
+	total_values++;
+	total_b_values++;
+	if (!q_opt) {
+	    printf(FNAME(flg), show ? show : cap);
+	    printf("%s\n", num ? "true" : "false");
+	}
+    }
+
+    if (!q_opt)
+	fflush(stdout);
+}
+
+#define isCapName(c) (isalnum(UChar(c)) || ((c) == '_'))
+#define LegalItem(c,n) (n)
+
+static void
+brute_force(const char *name)
+{
+#define MAX_FORCE 5		/* omit "colors", since CPU-time is a problem */
+    static const char legal[] = "\
+0123456789\
+ABCDEFGHIJKLMNOPQRSTUVWXYZ\
+abcdefghijklmnopqrstuvwxyz_";
+    int length;
+    int j, k;
+    bool carry;
+    bool changed;
+    char cap[MAX_FORCE + 1];
+    int item[MAX_FORCE + 1];
+
+    if (db_list) {
+	putenv(next_dbitem());
+    }
+    if (!q_opt)
+	printf("Terminal type \"%s\"\n", name);
+    setupterm((NCURSES_CONST char *) name, 1, (int *) 0);
+    if (!q_opt) {
+	if (strcmp(name, ttytype))
+	    printf("... actual \"%s\"\n", ttytype);
+    }
+
+    for (length = 1; length <= MAX_FORCE; ++length) {
+	/* set all digits to zeros */
+	for (j = 0; j < length; ++j) {
+	    item[j] = LegalItem(j, 0);
+	}
+
+	do {
+	    changed = FALSE;
+	    /* copy digits to cap-name */
+	    for (j = 0; j < length; ++j) {
+		cap[j] = legal[item[j]];
+	    }
+	    cap[length] = '\0';
+	    dumpit(cap, NULL);
+
+	    k = length - 1;
+	    do {
+		carry = FALSE;
+		for (; k >= 0; --k) {
+		    item[k] += 1;
+		    if (legal[item[k]]) {
+			changed = TRUE;
+			break;
+		    }
+		    if (k > 0 &&
+			legal[item[k - 1] + 1]) {
+			for (j = k; j < length; ++j) {
+			    item[j] = LegalItem(j, 0);
+			}
+			carry = TRUE;
+			changed = TRUE;
+		    }
+		}
+	    } while (carry);
+	} while (changed);
+    }
+    del_curterm(cur_term);
+}
+
+#if USE_CODE_LISTS
+#define fullname(type,n) f_opt ? type##fnames[n] : cap
+#else
+#define fullname(type,n) cap
+#endif
+
+static void
+demo_terminfo(char *name)
+{
+    unsigned n;
+    NCURSES_CONST char *cap;
+
+    if (db_list) {
+	putenv(next_dbitem());
+    }
+    if (!q_opt)
+	printf("Terminal type \"%s\"\n", name);
+    setupterm(name, 1, (int *) 0);
+
+    if (b_opt) {
+	for (n = 0;; ++n) {
+	    cap = my_boolcodes[n];
+	    if (cap == 0)
+		break;
+	    dumpit(cap, fullname(bool, n));
+	}
+    }
+
+    if (n_opt) {
+	for (n = 0;; ++n) {
+	    cap = my_numcodes[n];
+	    if (cap == 0)
+		break;
+	    dumpit(cap, fullname(num, n));
+	}
+    }
+
+    if (s_opt) {
+	for (n = 0;; ++n) {
+	    cap = my_strcodes[n];
+	    if (cap == 0)
+		break;
+	    dumpit(cap, fullname(str, n));
+	}
+    }
+#ifdef NCURSES_VERSION
+    if (x_opt && (my_blob == 0)) {
+	if (y_opt) {
+#if NCURSES_XNAMES
+	    TERMTYPE *term = (TERMTYPE *) cur_term;
+	    if (term != 0
+		&& ((NUM_BOOLEANS(term) != BOOLCOUNT)
+		    || (NUM_NUMBERS(term) != NUMCOUNT)
+		    || (NUM_STRINGS(term) != STRCOUNT))) {
+		for (n = BOOLCOUNT; n < NUM_BOOLEANS(term); ++n) {
+		    dumpit(ExtBoolname(term, (int) n, boolnames), NULL);
+		}
+		for (n = NUMCOUNT; n < NUM_NUMBERS(term); ++n) {
+		    dumpit(ExtNumname(term, (int) n, numnames), NULL);
+		}
+		for (n = STRCOUNT; n < NUM_STRINGS(term); ++n) {
+		    dumpit(ExtStrname(term, (int) n, strnames), NULL);
+		}
+	    }
+#endif
+	} else {
+	    char temp[80];
+	    static const char *xterm_keys[] =
+	    {
+		"kDC", "kDN", "kEND", "kHOM", "kIC",
+		"kLFT", "kNXT", "kPRV", "kRIT", "kUP",
+	    };
+	    for (n = 0; n < SIZEOF(xterm_keys); ++n) {
+		int mod;
+		for (mod = 0; mod < 8; ++mod) {
+		    if (mod == 0) {
+			/* these happen to be standard - avoid duplicates */
+			if (!strcmp(xterm_keys[n], "kDC") ||
+			    !strcmp(xterm_keys[n], "kEND") ||
+			    !strcmp(xterm_keys[n], "kHOM") ||
+			    !strcmp(xterm_keys[n], "kLFT") ||
+			    !strcmp(xterm_keys[n], "kRIT")) {
+			    continue;
+			}
+			_nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp))
+				    "%.*s", 8, xterm_keys[n]);
+		    } else {
+			_nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp))
+				    "%.*s%d", 8, xterm_keys[n], mod);
+		    }
+		    dumpit(temp, NULL);
+		}
+	    }
+	}
+    }
+#endif
+    del_curterm(cur_term);
+}
+
+typedef enum {
+    pDefault = 0
+    ,pComment
+    ,pDescription
+    ,pEscaped
+    ,pNewline
+    ,pName
+    ,pNumber
+    ,pString
+} STATE;
+
+static void
+parse_description(const char *input_name)
+{
+    static char empty[1];
+
+    FILE *fp;
+    struct stat sb;
+    size_t count_bools = 0;
+    size_t count_nums = 0;
+    size_t count_strs = 0;
+    size_t len;
+    size_t j, k, jl;
+    STATE state;
+
+    if (stat(input_name, &sb) != 0
+	|| (sb.st_mode & S_IFMT) != S_IFREG) {
+	failed("input is not a file");
+    }
+
+    if (sb.st_size == 0) {
+	failed("input is empty");
+    }
+
+    /*
+     * None of the arrays could be larger than the input-file, and since it
+     * is small, just allocate the maximum for simplicity.
+     */
+    if ((my_blob = malloc((size_t) sb.st_size + 1)) == 0 ||
+	(my_boolcodes = typeCalloc(char *, sb.st_size)) == 0 ||
+	  (my_numcodes = typeCalloc(char *, sb.st_size)) == 0 ||
+	  (my_numvalues = typeCalloc(char *, sb.st_size)) == 0 ||
+	  (my_strcodes = typeCalloc(char *, sb.st_size)) == 0 ||
+	  (my_strvalues = typeCalloc(char *, sb.st_size)) == 0) {
+	failed("cannot allocate memory for input-file");
+    }
+
+    if ((fp = fopen(input_name, "r")) == 0)
+	failed("cannot open input-file");
+    len = fread(my_blob, sizeof(char), (size_t) sb.st_size, fp);
+    my_blob[sb.st_size] = '\0';
+    fclose(fp);
+
+    /*
+     * First, get rid of comments and escaped newlines, as well as repeated
+     * colons to construct a canonical entry.
+     */
+    state = pNewline;
+    for (j = k = 0; j < len; ++j) {
+	int ch = my_blob[j];
+	if (ch == '\t') {
+	    ch = ' ';
+	}
+	switch (state) {
+	case pNewline:
+	    if (ch == ' ') {
+		continue;
+	    }
+	    if (ch == '#') {
+		state = pComment;
+		continue;
+	    }
+	    state = pDefault;
+	    /* FALLTHRU */
+	case pDefault:
+	    switch (ch) {
+	    case '|':
+		state = pDescription;
+		continue;
+	    case '\\':
+		state = pEscaped;
+		continue;
+	    case '\n':
+		state = pNewline;
+		continue;
+	    case ' ':
+		break;
+	    case ',':
+		my_blob[k++] = (char) ch;
+		break;
+	    default:
+		if (isalpha(UChar(ch)))
+		    state = pName;
+		else
+		    fprintf(stderr, "OOPS @%d:%.20s\n", __LINE__, my_blob + j);
+		my_blob[k++] = (char) ch;
+		break;
+	    }
+	    break;
+	case pComment:
+	    if (ch == '\n')
+		state = pNewline;
+	    break;
+	case pDescription:
+	    switch (ch) {
+	    case ',':
+		state = pDefault;
+		break;
+	    case '\n':
+		state = pNewline;
+		break;
+	    }
+	    break;
+	case pEscaped:
+	    if (ch != '\n') {
+		my_blob[k++] = (char) ch;
+		state = pDefault;
+	    } else {
+		state = pNewline;
+	    }
+	    break;
+	case pName:
+	    switch (ch) {
+	    case '\n':
+		state = pNewline;
+		continue;
+	    case ' ':
+	    case ',':
+		state = pDefault;
+		break;
+	    case '#':
+		state = pNumber;
+		break;
+	    case '=':
+		state = pString;
+		break;
+	    case '|':
+		state = pDescription;
+		continue;
+	    }
+	    my_blob[k++] = (char) ch;
+	    break;
+	case pNumber:
+	    switch (ch) {
+	    case '\n':
+		state = pNewline;
+		continue;
+	    case ',':
+		state = pDefault;
+		break;
+	    case ' ':
+		state = pDefault;
+		continue;
+	    }
+	    my_blob[k++] = (char) ch;
+	    break;
+	case pString:
+	    switch (ch) {
+	    case '\n':
+		state = pNewline;
+		break;
+	    case ',':
+		state = pDefault;
+		my_blob[k++] = (char) ch;
+		break;
+	    default:
+		my_blob[k++] = (char) ch;
+		break;
+	    }
+	    break;
+	default:
+	    /* not used */
+	    break;
+	}
+    }
+    my_blob[k] = '\0';
+
+    /*
+     * Then, parse what's left, making indexes of the names and values.
+     */
+    state = pDefault;
+    for (j = 0; my_blob[j] != '\0'; ++j) {
+	switch (state) {
+	case pDefault:
+	    switch (my_blob[j]) {
+	    case '\\':
+		state = pEscaped;
+		break;
+	    case ',':
+		my_blob[j] = '\0';
+		if (my_blob[j + 1] != '\0' && my_blob[j + 1] != ',')
+		    state = pName;
+		break;
+	    case ' ':
+		break;
+	    default:
+		break;
+	    }
+	case pEscaped:
+	    break;
+	case pName:
+	    state = pDefault;
+	    if (isalpha(UChar(my_blob[j]))) {
+		for (jl = 1; isalnum(UChar(my_blob[j + jl])); ++jl) {
+		    ;
+		}
+	    } else {
+		jl = 0;
+	    }
+	    if (jl != 0) {
+		switch (my_blob[j + jl]) {
+		case '#':
+		    my_numvalues[count_nums] = &my_blob[j + jl + 1];
+		    my_numcodes[count_nums++] = &my_blob[j];
+		    my_blob[j + jl] = '\0';
+		    state = pNumber;
+		    j += jl;
+		    break;
+		case '=':
+		    my_strvalues[count_strs] = &my_blob[j + jl + 1];
+		    my_strcodes[count_strs++] = &my_blob[j];
+		    my_blob[j + jl] = '\0';
+		    state = pString;
+		    j += jl;
+		    break;
+		default:
+		    if (my_blob[j + jl] == '@') {
+			/*
+			 * We cannot get the type for a cancelled item
+			 * directly, but can infer it assuming the input
+			 * came from infocmp, which puts the data in a
+			 * known order.
+			 */
+			if (count_strs) {
+			    my_strvalues[count_strs] = empty;
+			    my_strcodes[count_strs++] = &my_blob[j];
+			} else if (count_nums) {
+			    my_numvalues[count_nums] = empty;
+			    my_numcodes[count_nums++] = &my_blob[j];
+			} else {
+			    my_boolcodes[count_bools++] = &my_blob[j];
+			}
+			my_blob[j + jl] = '\0';
+			j += jl + 1;
+		    } else {
+			my_boolcodes[count_bools++] = &my_blob[j];
+			my_blob[j + jl] = '\0';
+			j += jl;
+		    }
+		    state = (isCapName(my_blob[j + 1])
+			     ? pName
+			     : pDefault);
+		    break;
+		}
+	    }
+	    break;
+	case pNumber:
+	    if (!isdigit(UChar(my_blob[j]))) {
+		--j;
+		state = pDefault;
+	    }
+	    break;
+	case pString:
+	    switch (my_blob[j]) {
+	    case '\\':
+		if (my_blob[j + 1] != '\0') {
+		    ++j;
+		} else {
+		    --j;
+		    state = pDefault;
+		}
+		break;
+	    case ',':
+		--j;
+		state = pDefault;
+		break;
+	    }
+	    break;
+	case pNewline:
+	case pComment:
+	case pDescription:
+	default:
+	    break;
+	}
+    }
+    my_boolcodes[count_bools] = 0;
+    my_numcodes[count_nums] = 0;
+    my_numvalues[count_nums] = 0;
+    my_strcodes[count_strs] = 0;
+    my_strvalues[count_strs] = 0;
+
+#if 0
+    printf("# bools:%d\n", (int) count_bools);
+    for (j = 0; my_boolcodes[j]; ++j)
+	printf("\t%s,\n", my_boolcodes[j]);
+
+    printf("# numbers:%d\n", (int) count_nums);
+    for (j = 0; my_numcodes[j]; ++j)
+	printf("\t%s#%s,\n", my_numcodes[j], my_numvalues[j]);
+
+    printf("# strings:%d\n", (int) count_strs);
+    for (j = 0; my_strcodes[j]; ++j)
+	printf("\t%s=%s,\n", my_strcodes[j], my_strvalues[j]);
+#endif
+}
+
+#if USE_CODE_LISTS
+static char **
+copy_code_list(NCURSES_CONST char *const *list)
+{
+    int pass;
+    size_t count;
+    size_t length = 1;
+    char **result = 0;
+    char *unused = 0;
+
+    for (pass = 0; pass < 2; ++pass) {
+	for (count = 0; list[count] != 0; ++count) {
+	    size_t chunk = strlen(list[count]) + 1;
+	    if (pass == 0) {
+		length += chunk;
+	    } else {
+		result[count] = unused;
+		_nc_STRCPY(unused, list[count], length);
+		unused += chunk;
+	    }
+	}
+	if (pass == 0) {
+	    char *blob = malloc(length);
+	    result = typeCalloc(char *, count + 1);
+	    unused = blob;
+	    if (blob == 0 || result == 0)
+		failed("copy_code_list failed");
+	}
+    }
+
+    return result;
+}
+
+#if NO_LEAKS
+static void
+free_code_list(char **list)
+{
+    if (list) {
+	free(list[0]);
+	free(list);
+    }
+}
+#endif
+#endif /* USE_CODE_LISTS */
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: demo_terminfo [options] [terminal]"
+	,""
+	,"If no options are given, print all (boolean, numeric, string)"
+	,"capabilities for the given terminal, using short names."
+	,""
+	,USAGE_COMMON
+	,"Options:"
+	," -a       try all names, print capabilities found"
+	," -b       print boolean-capabilities"
+	," -d LIST  colon-separated list of databases to use"
+	," -e NAME  environment variable to set with -d option"
+	," -f       print full names"
+	," -i NAME  terminal description to use as names for \"-a\" option"
+	," -n       print numeric-capabilities"
+	," -q       quiet (prints only counts)"
+	," -r COUNT repeat for given count"
+	," -s       print string-capabilities"
+#ifdef NCURSES_VERSION
+	," -x       print extended capabilities"
+	," -y       direct-lookup names of extended capabilities"
+#endif
+    };
+    unsigned n;
+    for (n = 0; n < SIZEOF(msg); ++n) {
+	fprintf(stderr, "%s\n", msg[n]);
+    }
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+    int n;
+    int repeat;
+    char *name;
+    int r_opt = 1;
+    char *input_name = 0;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "abd:e:fi:nqr:sxy")) != -1) {
+	switch (ch) {
+	case 'a':
+	    a_opt = TRUE;
+	    break;
+	case 'b':
+	    b_opt = TRUE;
+	    break;
+	case 'd':
+	    d_opt = optarg;
+	    break;
+	case 'e':
+	    e_opt = optarg;
+	    break;
+	case 'f':
+	    f_opt = TRUE;
+	    break;
+	case 'i':
+	    input_name = optarg;
+	    break;
+	case 'n':
+	    n_opt = TRUE;
+	    break;
+	case 'q':
+	    q_opt = TRUE;
+	    break;
+	case 'r':
+	    if ((r_opt = atoi(optarg)) <= 0)
+		usage(FALSE);
+	    break;
+	case 's':
+	    s_opt = TRUE;
+	    break;
+	case 'x':
+#ifdef NCURSES_VERSION
+	    x_opt = TRUE;
+#endif
+	    break;
+#ifdef NCURSES_VERSION
+	case 'y':
+	    y_opt = TRUE;
+	    x_opt = TRUE;
+	    break;
+#endif
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+
+#if HAVE_USE_EXTENDED_NAMES
+    use_extended_names(x_opt);
+#endif
+
+    if (!(b_opt || n_opt || s_opt)) {
+	b_opt = TRUE;
+	n_opt = TRUE;
+	s_opt = TRUE;
+    }
+
+    make_dblist();
+
+    if (a_opt) {
+	for (repeat = 0; repeat < r_opt; ++repeat) {
+	    if (optind < argc) {
+		for (n = optind; n < argc; ++n) {
+		    brute_force(argv[n]);
+		}
+	    } else if ((name = getenv("TERM")) != 0) {
+		brute_force(name);
+	    } else {
+		static char dumb[] = "dumb";
+		brute_force(dumb);
+	    }
+	}
+    } else {
+	if (input_name != 0) {
+	    parse_description(input_name);
+	}
+#if USE_CODE_LISTS
+	else {
+	    my_boolcodes = copy_code_list(boolnames);
+	    my_numcodes = copy_code_list(numnames);
+	    my_strcodes = copy_code_list(strnames);
+	}
+#else
+	else {
+	    failed("no capability-lists available (use -i option)");
+	}
+#endif /* USE_CODE_LISTS */
+	for (repeat = 0; repeat < r_opt; ++repeat) {
+	    if (optind < argc) {
+		for (n = optind; n < argc; ++n) {
+		    demo_terminfo(argv[n]);
+		}
+	    } else if ((name = getenv("TERM")) != 0) {
+		demo_terminfo(name);
+	    } else {
+		static char dumb[] = "dumb";
+		demo_terminfo(dumb);
+	    }
+	}
+    }
+
+#define PLURAL(n) n, (n != 1) ? "s" : ""
+    printf("%ld value%s (%ld boolean%s, %ld number%s, %ld string%s)\n",
+	   PLURAL(total_values),
+	   PLURAL(total_b_values),
+	   PLURAL(total_n_values),
+	   PLURAL(total_s_values));
+
+#if NO_LEAKS
+    free_dblist();
+    if (input_name != 0) {
+	if (my_blob != 0) {
+	    free(my_blob);
+	    free(my_boolcodes);
+	    free(my_numcodes);
+	    free(my_numvalues);
+	    free(my_strcodes);
+	    free(my_strvalues);
+	}
+    }
+#if USE_CODE_LISTS
+    else {
+	free_code_list(my_boolcodes);
+	free_code_list(my_numcodes);
+	free_code_list(my_strcodes);
+    }
+#endif
+#endif /* NO_LEAKS */
+
+    ExitProgram(EXIT_SUCCESS);
+}
+
+#else /* !HAVE_TIGETSTR */
+int
+main(void)
+{
+    failed("This program requires the terminfo functions such as tigetstr");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif /* HAVE_TIGETSTR */
diff --git a/test/ditto.c b/test/ditto.c
new file mode 100644
index 0000000..390eb3c
--- /dev/null
+++ b/test/ditto.c
@@ -0,0 +1,494 @@
+/****************************************************************************
+ * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/*
+ * Author: Thomas E. Dickey (1998-on)
+ *
+ * $Id: ditto.c,v 1.58 2022/12/24 23:53:08 tom Exp $
+ *
+ * The program illustrates how to set up multiple screens from a single
+ * program.
+ *
+ * If openpty() is supported, the command line parameters are titles for
+ * the windows showing each screen's data.
+ *
+ * If openpty() is not supported, you must invoke the program by specifying
+ * another terminal on the same machine by specifying its device, e.g.,
+ *	ditto /dev/ttyp1
+ */
+#include <test.priv.h>
+#include <sys/stat.h>
+
+#if HAVE_DELSCREEN
+
+#ifdef USE_PTHREADS
+#include <pthread.h>
+#endif
+
+#ifdef USE_XTERM_PTY
+#include USE_OPENPTY_HEADER
+#endif
+
+#define MAX_FIFO 256
+
+#define THIS_FIFO(n) ((n) % MAX_FIFO)
+#define NEXT_FIFO(n) THIS_FIFO((n) + 1)
+
+typedef struct {
+    unsigned long sequence;
+    int head;
+    int tail;
+    int data[MAX_FIFO];
+} FIFO;
+
+typedef struct {
+    unsigned long sequence;
+} PEEK;
+
+/*
+ * Data "owned" for a single screen.  Each screen is divided into windows that
+ * show the text read from each terminal.  Input from a given screen will also
+ * be read into one window per screen.
+ */
+typedef struct {
+    FILE *input;
+    FILE *output;
+    SCREEN *screen;		/* this screen - curses internal data */
+    int which1;			/* this screen's index in DITTO[] array */
+    int length;			/* length of windows[] and peeks[] */
+    char **titles;		/* per-window titles */
+    WINDOW **parents;		/* display boxes around each screen's data */
+    WINDOW **windows;		/* display data from each screen */
+    PEEK *peeks;		/* indices for each screen's fifo */
+    FIFO fifo;			/* fifo for this screen */
+#ifdef USE_PTHREADS
+    pthread_t thread;
+#endif
+} DITTO;
+
+#ifdef USE_PTHREADS
+#define LockIt()                pthread_mutex_lock(&pending_mutex)
+#define UnlockIt()              pthread_mutex_unlock(&pending_mutex)
+pthread_mutex_t pending_mutex;
+#else
+#define LockIt()		/* nothing */
+#define UnlockIt()		/* nothing */
+#endif
+
+/*
+ * Structure used to pass multiple parameters via the use_screen()
+ * single-parameter interface.
+ */
+typedef struct {
+    int source;			/* which screen did character come from */
+    int target;			/* which screen is character going to */
+    DITTO *ditto;		/* data for all screens */
+} DDATA;
+
+static void
+failed(const char *s)
+{
+    perror(s);
+    ExitProgram(EXIT_FAILURE);
+}
+
+/* Add to the head of the fifo, checking for overflow. */
+static void
+put_fifo(FIFO * fifo, int value)
+{
+    int next = NEXT_FIFO(fifo->head);
+    if (next == fifo->tail)
+	fifo->tail = NEXT_FIFO(fifo->tail);
+    fifo->data[next] = value;
+    fifo->head = next;
+    fifo->sequence += 1;
+}
+
+/* Get data from the tail (oldest part) of the fifo, returning -1 if no data.
+ * Since each screen can peek into the fifo, we do not update the tail index,
+ * but modify the peek-index.
+ *
+ * FIXME - test/workaround for case where fifo gets more than a buffer
+ * ahead of peek.
+ */
+static int
+peek_fifo(FIFO * fifo, PEEK * peek)
+{
+    int result = -1;
+    if (peek->sequence < fifo->sequence) {
+	result = fifo->data[THIS_FIFO(peek->sequence)];
+	peek->sequence += 1;
+    }
+    return result;
+}
+
+static FILE *
+open_tty(char *path)
+{
+    FILE *fp;
+#ifdef USE_XTERM_PTY
+    int amaster;
+    int aslave;
+    char slave_name[1024];
+    char s_option[sizeof(slave_name) + 80];
+    const char *xterm_prog = 0;
+
+    if ((xterm_prog = getenv("XTERM_PROG")) == 0)
+	xterm_prog = "xterm";
+
+    if (openpty(&amaster, &aslave, slave_name, 0, 0) != 0
+	|| strlen(slave_name) > sizeof(slave_name) - 1)
+	failed("openpty");
+    if (strrchr(slave_name, '/') == 0) {
+	errno = EISDIR;
+	failed(slave_name);
+    }
+    _nc_SPRINTF(s_option, _nc_SLIMIT(sizeof(s_option))
+		"-S%s/%d", slave_name, aslave);
+    if (fork()) {
+	execlp(xterm_prog, xterm_prog, s_option, "-title", path, (char *) 0);
+	_exit(0);
+    }
+    fp = fdopen(amaster, "r+");
+    if (fp == 0)
+	failed(path);
+#else
+    struct stat sb;
+
+    if (stat(path, &sb) == -1)
+	failed(path);
+    if ((sb.st_mode & S_IFMT) != S_IFCHR) {
+	errno = ENOTTY;
+	failed(path);
+    }
+    fp = fopen(path, "r+");
+    if (fp == 0)
+	failed(path);
+    printf("opened %s\n", path);
+#endif
+    assert(fp != 0);
+    return fp;
+}
+
+static int
+init_screen(
+#if HAVE_USE_WINDOW
+	       SCREEN *sp GCC_UNUSED,
+#endif
+	       void *arg)
+{
+    DITTO *target = (DITTO *) arg;
+    int high, wide;
+    int k;
+
+    cbreak();
+    noecho();
+    scrollok(stdscr, TRUE);
+    box(stdscr, 0, 0);
+
+    target->parents = typeCalloc(WINDOW *, (size_t) target->length);
+    target->windows = typeCalloc(WINDOW *, (size_t) target->length);
+    target->peeks = typeCalloc(PEEK, (size_t) target->length);
+
+    high = (LINES - 2) / target->length;
+    wide = (COLS - 2);
+    for (k = 0; k < target->length; ++k) {
+	WINDOW *outer = newwin(high, wide, 1 + (high * k), 1);
+	WINDOW *inner = derwin(outer, high - 2, wide - 2, 1, 1);
+
+	box(outer, 0, 0);
+	MvWAddStr(outer, 0, 2, target->titles[k]);
+	wnoutrefresh(outer);
+
+	scrollok(inner, TRUE);
+	keypad(inner, TRUE);
+#ifndef USE_PTHREADS
+	nodelay(inner, TRUE);
+#endif
+
+	target->parents[k] = outer;
+	target->windows[k] = inner;
+    }
+    doupdate();
+    return TRUE;
+}
+
+static void
+open_screen(DITTO * target, char **source, int length, int which1)
+{
+    if (which1 != 0) {
+	target->input =
+	    target->output = open_tty(source[which1]);
+    } else {
+	target->input = stdin;
+	target->output = stdout;
+    }
+
+    target->which1 = which1;
+    target->titles = source;
+    target->length = length;
+    target->fifo.head = -1;
+    target->screen = newterm((char *) 0,	/* assume $TERM is the same */
+			     target->output,
+			     target->input);
+
+    if (target->screen == 0)
+	failed("newterm");
+
+    (void) USING_SCREEN(target->screen, init_screen, target);
+}
+
+static int
+close_screen(
+#if HAVE_USE_WINDOW
+		SCREEN *sp GCC_UNUSED,
+#endif
+		void *arg GCC_UNUSED)
+{
+#if HAVE_USE_WINDOW
+    (void) sp;
+#endif
+    (void) arg;
+    return endwin();
+}
+
+/*
+ * Read data from the 'source' screen.
+ */
+static int
+read_screen(
+#if HAVE_USE_WINDOW
+	       SCREEN *sp GCC_UNUSED,
+#endif
+	       void *arg)
+{
+    DDATA *data = (DDATA *) arg;
+    DITTO *ditto = &(data->ditto[data->source]);
+    WINDOW *win = ditto->windows[data->source];
+    int ch = wgetch(win);
+
+    if (ch > 0 && ch < 256)
+	put_fifo(&(ditto->fifo), ch);
+    else
+	ch = ERR;
+
+    return ch;
+}
+
+/*
+ * Write all of the data that's in fifos for the 'target' screen.
+ */
+static int
+write_screen(
+#if HAVE_USE_WINDOW
+		SCREEN *sp GCC_UNUSED,
+#endif
+		void *arg GCC_UNUSED)
+{
+    DDATA *data = (DDATA *) arg;
+    DITTO *ditto = &(data->ditto[data->target]);
+    bool changed = FALSE;
+    int which;
+
+    for (which = 0; which < ditto->length; ++which) {
+	WINDOW *win = ditto->windows[which];
+	FIFO *fifo = &(data->ditto[which].fifo);
+	PEEK *peek = &(ditto->peeks[which]);
+	int ch;
+
+	while ((ch = peek_fifo(fifo, peek)) > 0) {
+	    changed = TRUE;
+
+	    waddch(win, (chtype) ch);
+	    wnoutrefresh(win);
+	}
+    }
+
+    if (changed)
+	doupdate();
+    return OK;
+}
+
+static void
+show_ditto(DITTO * data, int count, DDATA * ddata)
+{
+    int n;
+
+    (void) data;
+    for (n = 0; n < count; n++) {
+	ddata->target = n;
+	USING_SCREEN(data[n].screen, write_screen, (void *) ddata);
+    }
+}
+
+#ifdef USE_PTHREADS
+static void *
+handle_screen(void *arg)
+{
+    DDATA ddata;
+
+    memset(&ddata, 0, sizeof(ddata));
+    ddata.ditto = (DITTO *) arg;
+    ddata.source = ddata.ditto->which1;
+    ddata.ditto -= ddata.source;	/* -> base of array */
+
+    for (;;) {
+	int ch = read_screen(ddata.ditto->screen, &ddata);
+	if (ch == CTRL('D')) {
+	    int later = (ddata.source ? ddata.source : -1);
+	    int j;
+
+	    for (j = ddata.ditto->length - 1; j > 0; --j) {
+		if (j != later) {
+		    pthread_cancel(ddata.ditto[j].thread);
+		}
+	    }
+	    if (later > 0) {
+		pthread_cancel(ddata.ditto[later].thread);
+	    }
+	    break;
+	}
+	show_ditto(ddata.ditto, ddata.ditto->length, &ddata);
+    }
+    return NULL;
+}
+#endif
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: ditto [terminal [terminal2 ...]]"
+	,""
+	,USAGE_COMMON
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int j;
+    int ch;
+    DITTO *data;
+#ifndef USE_PTHREADS
+    int count;
+#endif
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) {
+	switch (ch) {
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+
+    if ((data = typeCalloc(DITTO, (size_t) argc)) == 0)
+	failed("calloc data");
+
+    assert(data != 0);
+
+    for (j = 0; j < argc; j++) {
+	open_screen(&data[j], argv, argc, j);
+    }
+
+#ifdef USE_PTHREADS
+    pthread_mutex_init(&pending_mutex, NULL);
+    /*
+     * For multi-threaded operation, set up a reader for each of the screens.
+     * That uses blocking I/O rather than polling for input, so no calls to
+     * napms() are needed.
+     */
+    for (j = 0; j < argc; j++) {
+	(void) pthread_create(&(data[j].thread), NULL, handle_screen,
+			      &data[j]);
+    }
+    pthread_join(data[1].thread, NULL);
+#else
+    /*
+     * Loop, reading characters from any of the inputs and writing to all
+     * of the screens.
+     */
+    for (count = 0;; ++count) {
+	DDATA ddata;
+	int which = (count % argc);
+
+	napms(20);
+
+	ddata.source = which;
+	ddata.ditto = data;
+
+	ch = USING_SCREEN(data[which].screen, read_screen, &ddata);
+	if (ch == CTRL('D')) {
+	    break;
+	} else if (ch != ERR) {
+	    show_ditto(data, argc, &ddata);
+	}
+    }
+#endif
+
+    /*
+     * Cleanup and exit
+     */
+    for (j = argc - 1; j >= 0; j--) {
+	LockIt();
+	USING_SCREEN(data[j].screen, close_screen, 0);
+	fprintf(data[j].output, "**Closed\r\n");
+
+	/*
+	 * Closing before a delscreen() helps ncurses determine that there
+	 * is no valid output buffer, and can remove the setbuf() data.
+	 */
+	fflush(data[j].output);
+	fclose(data[j].output);
+	delscreen(data[j].screen);
+	UnlockIt();
+    }
+    ExitProgram(EXIT_SUCCESS);
+}
+#else
+int
+main(void)
+{
+    printf("This program requires the curses delscreen function\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif
diff --git a/test/dots.c b/test/dots.c
new file mode 100644
index 0000000..372b76f
--- /dev/null
+++ b/test/dots.c
@@ -0,0 +1,250 @@
+/****************************************************************************
+ * Copyright 2019-2020,2022 Thomas E. Dickey                                *
+ * Copyright 1999-2013,2017 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.                                                           *
+ ****************************************************************************/
+
+/*
+ * Author: Thomas E. Dickey <dickey@clark.net> 1999
+ *
+ * $Id: dots.c,v 1.44 2022/12/10 23:22:09 tom Exp $
+ *
+ * A simple demo of the terminfo interface.
+ */
+#define USE_TINFO
+#include <test.priv.h>
+
+#if HAVE_SETUPTERM
+
+#include <time.h>
+
+static bool interrupted = FALSE;
+static long total_chars = 0;
+static time_t started;
+
+static
+TPUTS_PROTO(outc, c)
+{
+    int rc = c;
+
+    if (interrupted) {
+	char tmp = (char) c;
+	if (write(STDOUT_FILENO, &tmp, (size_t) 1) == -1)
+	    rc = EOF;
+    } else {
+	rc = putc(c, stdout);
+    }
+    TPUTS_RETURN(rc);
+}
+
+static bool
+outs(const char *s)
+{
+    if (VALID_STRING(s)) {
+	tputs(s, 1, outc);
+	return TRUE;
+    }
+    return FALSE;
+}
+
+static void
+cleanup(void)
+{
+    outs(exit_attribute_mode);
+    if (!outs(orig_colors))
+	outs(orig_pair);
+    outs(clear_screen);
+    outs(cursor_normal);
+
+    fflush(stdout);
+    fprintf(stderr, "\n\n%ld total cells, rate %.2f/sec\n",
+	    total_chars,
+	    ((double) (total_chars) / (double) (time((time_t *) 0) - started)));
+}
+
+static void
+onsig(int n GCC_UNUSED)
+{
+    interrupted = TRUE;
+}
+
+static double
+ranf(void)
+{
+    long r = (rand() & 077777);
+    return ((double) r / 32768.);
+}
+
+static int
+get_number(NCURSES_CONST char *cap, int map)
+{
+    int result = map;
+    if (cap != 0) {
+	int check = tigetnum(cap);
+	if (check > 0)
+	    result = check;
+    }
+    return result;
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: dots [options]"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+	," -T TERM  override $TERM"
+#if HAVE_USE_ENV
+	," -e       allow environment $LINES / $COLUMNS"
+#endif
+	," -f       use tigetnum rather than <term.h> mapping"
+	," -m SIZE  set margin (default: 2)"
+	," -r SECS  self-interrupt/exit after specified number of seconds"
+	," -s MSECS delay 1% of the time (default: 1 msecs)"
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+    double r;
+    double c;
+    int my_colors;
+    int f_option = 0;
+    int m_option = 2;
+    int r_option = 0;
+    int s_option = 1;
+    size_t need;
+    char *my_env;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "T:efm:r:s:")) != -1) {
+	switch (ch) {
+	case 'T':
+	    need = 6 + strlen(optarg);
+	    my_env = malloc(need);
+	    _nc_SPRINTF(my_env, _nc_SLIMIT(need) "TERM=%s", optarg);
+	    putenv(my_env);
+	    break;
+#if HAVE_USE_ENV
+	case 'e':
+	    use_env(TRUE);
+	    break;
+#endif
+	case 'f':
+	    f_option = 1;
+	    break;
+	case 'm':
+	    m_option = atoi(optarg);
+	    break;
+	case 'r':
+	    r_option = atoi(optarg);
+	    break;
+	case 's':
+	    s_option = atoi(optarg);
+	    break;
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+
+    SetupAlarm(r_option);
+    InitAndCatch(setupterm((char *) 0, 1, (int *) 0), onsig);
+
+    srand((unsigned) time(0));
+
+    outs(clear_screen);
+    outs(cursor_invisible);
+
+#define GetNumber(ln,sn) get_number(f_option ? #sn : 0, ln)
+    my_colors = GetNumber(max_colors, colors);
+    if (my_colors > 1) {
+	if (!VALID_STRING(set_a_foreground)
+	    || !VALID_STRING(set_a_background)
+	    || (!VALID_STRING(orig_colors) && !VALID_STRING(orig_pair)))
+	    my_colors = -1;
+    }
+
+    r = (double) (GetNumber(lines, lines) - (m_option * 2));
+    c = (double) (GetNumber(columns, cols) - (m_option * 2));
+    started = time((time_t *) 0);
+
+    while (!interrupted) {
+	int x = (int) (c * ranf()) + m_option;
+	int y = (int) (r * ranf()) + m_option;
+	int p = (ranf() > 0.9) ? '*' : ' ';
+
+	tputs(tparm3(cursor_address, y, x), 1, outc);
+	if (my_colors > 0) {
+	    int z = (int) (ranf() * my_colors);
+	    if (ranf() > 0.01) {
+		tputs(tparm2(set_a_foreground, z), 1, outc);
+	    } else {
+		tputs(tparm2(set_a_background, z), 1, outc);
+		if (s_option)
+		    napms(s_option);
+	    }
+	} else if (VALID_STRING(exit_attribute_mode)
+		   && VALID_STRING(enter_reverse_mode)) {
+	    if (ranf() <= 0.01) {
+		outs((ranf() > 0.6)
+		     ? enter_reverse_mode
+		     : exit_attribute_mode);
+		if (s_option)
+		    napms(s_option);
+	    }
+	}
+	outc(p);
+	fflush(stdout);
+	++total_chars;
+    }
+    cleanup();
+    ExitProgram(EXIT_SUCCESS);
+}
+#else
+int
+main(void)
+{
+    fprintf(stderr, "This program requires terminfo\n");
+    exit(EXIT_FAILURE);
+}
+#endif
diff --git a/test/dots_curses.c b/test/dots_curses.c
new file mode 100644
index 0000000..2fb7a83
--- /dev/null
+++ b/test/dots_curses.c
@@ -0,0 +1,236 @@
+/****************************************************************************
+ * Copyright 2018-2020,2022 Thomas E. Dickey                                *
+ * Copyright 2014,2017 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.                                                           *
+ ****************************************************************************/
+
+/*
+ * Author: Thomas E. Dickey
+ *
+ * $Id: dots_curses.c,v 1.24 2022/12/04 00:40:11 tom Exp $
+ *
+ * A simple demo of the curses interface used for comparison with termcap.
+ */
+#include <test.priv.h>
+
+#if !defined(_NC_WINDOWS)
+#include <sys/time.h>
+#endif
+
+#include <time.h>
+
+static bool interrupted = FALSE;
+static long total_chars = 0;
+static time_t started;
+
+static void
+cleanup(void)
+{
+    endwin();
+
+    fflush(stdout);
+    fprintf(stderr, "\n\n%ld total cells, rate %.2f/sec\n",
+	    total_chars,
+	    ((double) (total_chars) / (double) (time((time_t *) 0) - started)));
+}
+
+static void
+onsig(int n GCC_UNUSED)
+{
+    interrupted = TRUE;
+}
+
+static double
+ranf(void)
+{
+    long r = (rand() & 077777);
+    return ((double) r / 32768.);
+}
+
+static int
+mypair(int fg, int bg)
+{
+    int pair = (fg * COLORS) + bg;
+    return (pair >= COLOR_PAIRS) ? -1 : pair;
+}
+
+static void
+set_colors(int fg, int bg)
+{
+    int pair = mypair(fg, bg);
+    if (pair > 0) {
+	attron(COLOR_PAIR(mypair(fg, bg)));
+    }
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: dots_curses [options]"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+	," -T TERM  override $TERM"
+#if HAVE_USE_DEFAULT_COLORS
+	," -d       invoke use_default_colors()"
+#endif
+#if HAVE_USE_ENV
+	," -e       allow environment $LINES / $COLUMNS"
+#endif
+	," -m SIZE  set margin (default: 2)"
+	," -r SECS  self-interrupt/exit after specified number of seconds"
+	," -s MSECS delay 1% of the time (default: 1 msecs)"
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+    int fg, bg;
+    double r;
+    double c;
+#if HAVE_USE_DEFAULT_COLORS
+    bool d_option = FALSE;
+#endif
+    int m_option = 2;
+    int r_option = 0;
+    int s_option = 1;
+    size_t need;
+    char *my_env;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "T:dem:r:s:")) != -1) {
+	switch (ch) {
+	case 'T':
+	    need = 6 + strlen(optarg);
+	    my_env = malloc(need);
+	    _nc_SPRINTF(my_env, _nc_SLIMIT(need) "TERM=%s", optarg);
+	    putenv(my_env);
+	    break;
+#if HAVE_USE_DEFAULT_COLORS
+	case 'd':
+	    d_option = TRUE;
+	    break;
+#endif
+#if HAVE_USE_ENV
+	case 'e':
+	    use_env(TRUE);
+	    break;
+#endif
+	case 'm':
+	    m_option = atoi(optarg);
+	    break;
+	case 'r':
+	    r_option = atoi(optarg);
+	    break;
+	case 's':
+	    s_option = atoi(optarg);
+	    break;
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+
+    srand((unsigned) time(0));
+
+    SetupAlarm(r_option);
+    InitAndCatch(initscr(), onsig);
+
+    if (has_colors()) {
+	start_color();
+#if HAVE_USE_DEFAULT_COLORS
+	if (d_option)
+	    use_default_colors();
+#endif
+	for (fg = 0; fg < COLORS; fg++) {
+	    for (bg = 0; bg < COLORS; bg++) {
+		int pair;
+		if (interrupted) {
+		    cleanup();
+		    ExitProgram(EXIT_FAILURE);
+		}
+		pair = mypair(fg, bg);
+		if (pair > 0)
+		    init_pair((short) pair, (short) fg, (short) bg);
+	    }
+	}
+    }
+
+    r = (double) (LINES - (m_option * 2));
+    c = (double) (COLS - (m_option * 2));
+    started = time((time_t *) 0);
+
+    fg = COLOR_WHITE;
+    bg = COLOR_BLACK;
+    while (!interrupted) {
+	int x = (int) (c * ranf()) + m_option;
+	int y = (int) (r * ranf()) + m_option;
+	int p = (ranf() > 0.9) ? '*' : ' ';
+
+	move(y, x);
+	if (has_colors()) {
+	    int z = (int) (ranf() * COLORS);
+	    if (ranf() > 0.01) {
+		set_colors(fg = z, bg);
+		attron(COLOR_PAIR(mypair(fg, bg)));
+	    } else {
+		set_colors(fg, bg = z);
+		if (s_option)
+		    napms(s_option);
+	    }
+	} else {
+	    if (ranf() <= 0.01) {
+		if (ranf() > 0.6) {
+		    attron(A_REVERSE);
+		} else {
+		    attroff(A_REVERSE);
+		}
+		if (s_option)
+		    napms(s_option);
+	    }
+	}
+	AddCh(p);
+	refresh();
+	++total_chars;
+    }
+    cleanup();
+    ExitProgram(EXIT_SUCCESS);
+}
diff --git a/test/dots_mvcur.c b/test/dots_mvcur.c
new file mode 100644
index 0000000..de1e066
--- /dev/null
+++ b/test/dots_mvcur.c
@@ -0,0 +1,267 @@
+/****************************************************************************
+ * Copyright 2019-2020,2022 Thomas E. Dickey                                *
+ * Copyright 2007-2013,2017 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.                                                           *
+ ****************************************************************************/
+
+/*
+ * Author: Thomas E. Dickey - 2007
+ *
+ * $Id: dots_mvcur.c,v 1.30 2022/12/10 23:22:09 tom Exp $
+ *
+ * A simple demo of the terminfo interface, and mvcur.
+ */
+#define USE_TINFO
+#include <test.priv.h>
+
+#if HAVE_SETUPTERM
+
+#include <time.h>
+
+static bool interrupted = FALSE;
+static long total_chars = 0;
+static time_t started;
+
+static
+TPUTS_PROTO(outc, c)
+{
+    int rc = c;
+
+    if (interrupted) {
+	char tmp = (char) c;
+	if (write(STDOUT_FILENO, &tmp, (size_t) 1) == -1)
+	    rc = EOF;
+    } else {
+	if (putc(c, stdout) == EOF)
+	    rc = EOF;
+    }
+    TPUTS_RETURN(rc);
+}
+
+static bool
+outs(const char *s)
+{
+    if (VALID_STRING(s)) {
+	tputs(s, 1, outc);
+	return TRUE;
+    }
+    return FALSE;
+}
+
+static void
+cleanup(void)
+{
+    outs(exit_attribute_mode);
+    if (!outs(orig_colors))
+	outs(orig_pair);
+    outs(clear_screen);
+    outs(cursor_normal);
+
+    fflush(stdout);
+    fprintf(stderr, "\n\n%ld total cells, rate %.2f/sec\n",
+	    total_chars,
+	    ((double) (total_chars) / (double) (time((time_t *) 0) - started)));
+}
+
+static void
+onsig(int n GCC_UNUSED)
+{
+    interrupted = TRUE;
+}
+
+static double
+ranf(void)
+{
+    long r = (rand() & 077777);
+    return ((double) r / 32768.);
+}
+
+static int
+get_number(NCURSES_CONST char *cap, int map)
+{
+    int result = map;
+    if (cap != 0) {
+	int check = tigetnum(cap);
+	if (check > 0)
+	    result = check;
+    }
+    return result;
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: dots_termcap [options]"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+	," -T TERM  override $TERM"
+#if HAVE_USE_ENV
+	," -e       allow environment $LINES / $COLUMNS"
+#endif
+	," -f       use tigetnum rather than <term.h> mapping"
+	," -m SIZE  set margin (default: 2)"
+	," -r SECS  self-interrupt/exit after specified number of seconds"
+	," -s MSECS delay 1% of the time (default: 1 msecs)"
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int x0 = 1, y0 = 1;
+    int ch;
+    double r;
+    double c;
+    SCREEN *sp;
+    int my_colors;
+    int f_option = 0;
+    int m_option = 2;
+    int r_option = 0;
+    int s_option = 1;
+    size_t need;
+    char *my_env;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "T:efm:r:s:")) != -1) {
+	switch (ch) {
+	case 'T':
+	    need = 6 + strlen(optarg);
+	    my_env = malloc(need);
+	    _nc_SPRINTF(my_env, _nc_SLIMIT(need) "TERM=%s", optarg);
+	    putenv(my_env);
+	    break;
+#if HAVE_USE_ENV
+	case 'e':
+	    use_env(TRUE);
+	    break;
+#endif
+	case 'f':
+	    f_option = 1;
+	    break;
+	case 'm':
+	    m_option = atoi(optarg);
+	    break;
+	case 'r':
+	    r_option = atoi(optarg);
+	    break;
+	case 's':
+	    s_option = atoi(optarg);
+	    break;
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+
+    SetupAlarm(r_option);
+    InitAndCatch((sp = newterm((char *) 0, stdout, stdin)), onsig);
+    refresh();			/* needed with Solaris curses to cancel endwin */
+
+    if (sp == 0) {
+	fprintf(stderr, "Cannot initialize terminal\n");
+	ExitProgram(EXIT_FAILURE);
+    }
+
+    srand((unsigned) time(0));
+
+    outs(clear_screen);
+    outs(cursor_home);
+    outs(cursor_invisible);
+
+#define GetNumber(ln,sn) get_number(f_option ? #sn : 0, ln)
+    my_colors = GetNumber(max_colors, colors);
+    if (my_colors > 1) {
+	if (!VALID_STRING(set_a_foreground)
+	    || !VALID_STRING(set_a_background)
+	    || (!VALID_STRING(orig_colors) && !VALID_STRING(orig_pair)))
+	    my_colors = -1;
+    }
+
+    r = (double) (GetNumber(lines, lines) - (m_option * 2));
+    c = (double) (GetNumber(columns, cols) - (m_option * 2));
+    started = time((time_t *) 0);
+
+    while (!interrupted) {
+	int x = (int) (c * ranf()) + m_option;
+	int y = (int) (r * ranf()) + m_option;
+	int p = (ranf() > 0.9) ? '*' : ' ';
+
+	if (mvcur(y0, x0, y, x) != ERR) {
+	    x0 = x;
+	    y0 = y;
+	}
+
+	if (my_colors > 0) {
+	    int z = (int) (ranf() * my_colors);
+	    if (ranf() > 0.01) {
+		tputs(tparm2(set_a_foreground, z), 1, outc);
+	    } else {
+		tputs(tparm2(set_a_background, z), 1, outc);
+		if (s_option)
+		    napms(s_option);
+	    }
+	} else if (VALID_STRING(exit_attribute_mode)
+		   && VALID_STRING(enter_reverse_mode)) {
+	    if (ranf() <= 0.01) {
+		outs((ranf() > 0.6)
+		     ? enter_reverse_mode
+		     : exit_attribute_mode);
+		if (s_option)
+		    napms(s_option);
+	    }
+	}
+	outc(p);
+	++x0;
+	fflush(stdout);
+	++total_chars;
+    }
+    cleanup();
+    endwin();
+    delscreen(sp);
+    ExitProgram(EXIT_SUCCESS);
+}
+#else
+int
+main(void)
+{
+    fprintf(stderr, "This program requires terminfo\n");
+    exit(EXIT_FAILURE);
+}
+#endif
diff --git a/test/dots_termcap.c b/test/dots_termcap.c
new file mode 100644
index 0000000..041465e
--- /dev/null
+++ b/test/dots_termcap.c
@@ -0,0 +1,334 @@
+/****************************************************************************
+ * Copyright 2018-2020,2022 Thomas E. Dickey                                *
+ * Copyright 2013-2014,2017 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.                                                           *
+ ****************************************************************************/
+
+/*
+ * Author: Thomas E. Dickey
+ *
+ * $Id: dots_termcap.c,v 1.30 2022/12/10 23:22:09 tom Exp $
+ *
+ * A simple demo of the termcap interface.
+ */
+#define USE_TINFO
+#include <test.priv.h>
+
+#if !defined(_NC_WINDOWS)
+#include <sys/time.h>
+#endif
+
+#if HAVE_TGETENT
+
+#include <time.h>
+
+static bool interrupted = FALSE;
+static long total_chars = 0;
+static time_t started;
+
+static char *t_AB;
+static char *t_AF;
+static char *t_cl;
+static char *t_cm;
+static char *t_me;
+static char *t_mr;
+static char *t_oc;
+static char *t_op;
+static char *t_ve;
+static char *t_vi;
+
+static struct {
+    NCURSES_CONST char *name;
+    char **value;
+} my_caps[] = {
+
+    {
+	"AB", &t_AB
+    },
+    {
+	"AF", &t_AF
+    },
+    {
+	"cl", &t_cl
+    },
+    {
+	"cm", &t_cm
+    },
+    {
+	"me", &t_me
+    },
+    {
+	"mr", &t_mr
+    },
+    {
+	"oc", &t_oc
+    },
+    {
+	"op", &t_op
+    },
+    {
+	"ve", &t_ve
+    },
+    {
+	"vi", &t_vi
+    },
+};
+
+static
+TPUTS_PROTO(outc, c)
+{
+    int rc = c;
+
+    if (interrupted) {
+	char tmp = (char) c;
+	if (write(STDOUT_FILENO, &tmp, (size_t) 1) == -1)
+	    rc = EOF;
+    } else {
+	rc = putc(c, stdout);
+    }
+    TPUTS_RETURN(rc);
+}
+
+static bool
+outs(char *s)
+{
+    if (VALID_STRING(s)) {
+	tputs(s, 1, outc);
+	return TRUE;
+    }
+    return FALSE;
+}
+
+static void
+cleanup(void)
+{
+    outs(t_me);
+    if (!outs(t_oc))
+	outs(t_op);
+    outs(t_cl);
+    outs(t_ve);
+
+    fflush(stdout);
+    fprintf(stderr, "\n\n%ld total cells, rate %.2f/sec\n",
+	    total_chars,
+	    ((double) (total_chars) / (double) (time((time_t *) 0) - started)));
+}
+
+static void
+onsig(int n GCC_UNUSED)
+{
+    interrupted = TRUE;
+}
+
+static double
+ranf(void)
+{
+    long r = (rand() & 077777);
+    return ((double) r / 32768.);
+}
+
+static void
+my_napms(int ms)
+{
+    if (ms > 0) {
+#if defined(_NC_WINDOWS) || !HAVE_GETTIMEOFDAY
+	Sleep((unsigned int) ms);
+#else
+	struct timeval data;
+	data.tv_sec = 0;
+	data.tv_usec = ms * 1000;
+	select(0, NULL, NULL, NULL, &data);
+#endif
+    }
+}
+
+static int
+get_number(NCURSES_CONST char *cap, const char *env)
+{
+    int result = tgetnum(cap);
+    char *value = env ? getenv(env) : 0;
+    if (value != 0 && *value != 0) {
+	char *next = 0;
+	long check = strtol(value, &next, 10);
+	if (check > 0 && *next == '\0')
+	    result = (int) check;
+    }
+    return result;
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: dots_termcap [options]"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+	," -T TERM  override $TERM"
+	," -e       allow environment $LINES / $COLUMNS"
+	," -m SIZE  set margin (default: 2)"
+	," -r SECS  self-interrupt/exit after specified number of seconds"
+	," -s MSECS delay 1% of the time (default: 1 msecs)"
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+    int num_colors;
+    int num_lines;
+    int num_columns;
+    int e_option = 0;
+    int m_option = 2;
+    int r_option = 0;
+    int s_option = 1;
+    double r;
+    double c;
+    char buffer[1024];
+    char area[1024];
+    char *name;
+    size_t need;
+    char *my_env;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "T:em:r:s:")) != -1) {
+	switch (ch) {
+	case 'T':
+	    need = 6 + strlen(optarg);
+	    my_env = malloc(need);
+	    _nc_SPRINTF(my_env, _nc_SLIMIT(need) "TERM=%s", optarg);
+	    putenv(my_env);
+	    break;
+	case 'e':
+	    e_option = 1;
+	    break;
+	case 'm':
+	    m_option = atoi(optarg);
+	    break;
+	case 'r':
+	    r_option = atoi(optarg);
+	    break;
+	case 's':
+	    s_option = atoi(optarg);
+	    break;
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+
+    if ((name = getenv("TERM")) == 0) {
+	fprintf(stderr, "TERM is not set\n");
+	ExitProgram(EXIT_FAILURE);
+    }
+
+    srand((unsigned) time(0));
+
+    SetupAlarm((unsigned) r_option);
+    InitAndCatch(ch = tgetent(buffer, name), onsig);
+    if (ch < 0) {
+	fprintf(stderr, "terminal description not found\n");
+	ExitProgram(EXIT_FAILURE);
+    } else {
+	size_t t;
+	char *ap = area;
+	for (t = 0; t < SIZEOF(my_caps); ++t) {
+	    *(my_caps[t].value) = tgetstr((NCURSES_CONST char *)
+					  my_caps[t].name, &ap);
+	}
+    }
+
+    num_colors = tgetnum("Co");
+#define GetNumber(cap,env) get_number(cap, e_option ? env : 0)
+    num_lines = GetNumber("li", "LINES");
+    num_columns = GetNumber("co", "COLUMNS");
+
+    outs(t_cl);
+    outs(t_vi);
+    if (num_colors > 1) {
+	if (!VALID_STRING(t_AF)
+	    || !VALID_STRING(t_AB)
+	    || (!VALID_STRING(t_oc) && !VALID_STRING(t_op)))
+	    num_colors = -1;
+    }
+
+    r = (double) (num_lines - (2 * m_option));
+    c = (double) (num_columns - (2 * m_option));
+    started = time((time_t *) 0);
+
+    while (!interrupted) {
+	int x = (int) (c * ranf()) + m_option;
+	int y = (int) (r * ranf()) + m_option;
+	int p = (ranf() > 0.9) ? '*' : ' ';
+
+	tputs(tgoto(t_cm, x, y), 1, outc);
+	if (num_colors > 0) {
+	    int z = (int) (ranf() * num_colors);
+	    if (ranf() > 0.01) {
+		tputs(tgoto(t_AF, 0, z), 1, outc);
+	    } else {
+		tputs(tgoto(t_AB, 0, z), 1, outc);
+		if (s_option)
+		    my_napms(s_option);
+	    }
+	} else if (VALID_STRING(t_me)
+		   && VALID_STRING(t_mr)) {
+	    if (ranf() <= 0.01) {
+		outs((ranf() > 0.6)
+		     ? t_mr
+		     : t_me);
+		if (s_option)
+		    my_napms(s_option);
+	    }
+	}
+	outc(p);
+	fflush(stdout);
+	++total_chars;
+    }
+    cleanup();
+    ExitProgram(EXIT_SUCCESS);
+}
+#else
+int
+main(void)
+{
+    fprintf(stderr, "This program requires termcap\n");
+    exit(EXIT_FAILURE);
+}
+#endif
diff --git a/test/dots_xcurses.c b/test/dots_xcurses.c
new file mode 100644
index 0000000..3244824
--- /dev/null
+++ b/test/dots_xcurses.c
@@ -0,0 +1,285 @@
+/****************************************************************************
+ * Copyright 2018-2020,2022 Thomas E. Dickey                                *
+ * Copyright 2017 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.                                                           *
+ ****************************************************************************/
+
+/*
+ * Author: Thomas E. Dickey
+ *
+ * $Id: dots_xcurses.c,v 1.28 2022/12/04 00:40:11 tom Exp $
+ *
+ * A simple demo of the wide-curses interface used for comparison with termcap.
+ */
+#include <test.priv.h>
+
+#if !defined(_NC_WINDOWS)
+#include <sys/time.h>
+#endif
+
+#include <time.h>
+
+#if USE_WIDEC_SUPPORT
+
+#if HAVE_ALLOC_PAIR
+#define NewPair(n) x_option ? ((void *)&(n)) : NULL
+#else
+#define NewPair(n) NULL
+#endif
+
+#define InitPair(p,fg,bg) init_pair((short) (p), (short) (fg), (short) (bg))
+
+static bool interrupted = FALSE;
+static long total_chars = 0;
+static time_t started;
+
+#if HAVE_ALLOC_PAIR
+static bool x_option = FALSE;
+#endif
+
+static void
+cleanup(void)
+{
+    endwin();
+
+    fflush(stdout);
+    fprintf(stderr, "\n\n%ld total cells, rate %.2f/sec\n",
+	    total_chars,
+	    ((double) (total_chars) / (double) (time((time_t *) 0) - started)));
+}
+
+static void
+onsig(int n GCC_UNUSED)
+{
+    interrupted = TRUE;
+}
+
+static double
+ranf(void)
+{
+    long r = (rand() & 077777);
+    return ((double) r / 32768.);
+}
+
+static int
+mypair(int fg, int bg)
+{
+    int result;
+#if HAVE_ALLOC_PAIR
+    if (x_option) {
+	result = alloc_pair(fg, bg);
+    } else
+#endif
+    {
+	int pair = (fg * COLORS) + bg;
+	result = (pair >= COLOR_PAIRS) ? -1 : pair;
+    }
+    return result;
+}
+
+static void
+set_colors(int fg, int bg)
+{
+    int pair = mypair(fg, bg);
+    if (pair > 0) {
+	(void) color_set((short) pair, NewPair(pair));
+    }
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: dots_xcurses [options]"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+	," -T TERM  override $TERM"
+#if HAVE_USE_DEFAULT_COLORS
+	," -d       invoke use_default_colors()"
+#endif
+#if HAVE_USE_ENV
+	," -e       allow environment $LINES / $COLUMNS"
+#endif
+	," -m SIZE  set margin (default: 2)"
+	," -r SECS  self-interrupt/exit after specified number of seconds"
+	," -s MSECS delay 1% of the time (default: 1 msecs)"
+#if HAVE_ALLOC_PAIR
+	," -x       use alloc_pair() rather than init_pair()"
+#endif
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int fg, bg, ch;
+    wchar_t wch[2];
+    double r;
+    double c;
+#if HAVE_USE_DEFAULT_COLORS
+    bool d_option = FALSE;
+#endif
+    int m_option = 2;
+    int r_option = 0;
+    int s_option = 1;
+    size_t need;
+    char *my_env;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "T:dem:r:s:x")) != -1) {
+	switch (ch) {
+	case 'T':
+	    need = 6 + strlen(optarg);
+	    my_env = malloc(need);
+	    _nc_SPRINTF(my_env, _nc_SLIMIT(need) "TERM=%s", optarg);
+	    putenv(my_env);
+	    break;
+#if HAVE_USE_DEFAULT_COLORS
+	case 'd':
+	    d_option = TRUE;
+	    break;
+#endif
+#if HAVE_USE_ENV
+	case 'e':
+	    use_env(TRUE);
+	    break;
+#endif
+	case 'm':
+	    m_option = atoi(optarg);
+	    break;
+	case 'r':
+	    r_option = atoi(optarg);
+	    break;
+	case 's':
+	    s_option = atoi(optarg);
+	    break;
+#if HAVE_ALLOC_PAIR
+	case 'x':
+	    x_option = TRUE;
+	    break;
+#endif
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+
+    setlocale(LC_ALL, "");
+    srand((unsigned) time(0));
+
+    SetupAlarm(r_option);
+    InitAndCatch(initscr(), onsig);
+    if (has_colors()) {
+	start_color();
+#if HAVE_USE_DEFAULT_COLORS
+	if (d_option)
+	    use_default_colors();
+#endif
+#if HAVE_ALLOC_PAIR
+	if (x_option) {
+	    ;			/* nothing */
+	} else
+#endif
+	{
+	    for (fg = 0; fg < COLORS; fg++) {
+		for (bg = 0; bg < COLORS; bg++) {
+		    int pair;
+		    if (interrupted) {
+			cleanup();
+			ExitProgram(EXIT_FAILURE);
+		    }
+		    pair = mypair(fg, bg);
+		    if (pair > 0) {
+			InitPair(pair, fg, bg);
+		    }
+		}
+	    }
+	}
+    }
+
+    r = (double) (LINES - (2 * m_option));
+    c = (double) (COLS - (2 * m_option));
+    started = time((time_t *) 0);
+
+    fg = COLOR_WHITE;
+    bg = COLOR_BLACK;
+    wch[1] = 0;
+    while (!interrupted) {
+	int x = (int) (c * ranf()) + m_option;
+	int y = (int) (r * ranf()) + m_option;
+	int p = (ranf() > 0.9) ? '*' : ' ';
+
+	move(y, x);
+	if (has_colors()) {
+	    int z = (int) (ranf() * COLORS);
+	    if (ranf() > 0.01) {
+		set_colors(fg = z, bg);
+	    } else {
+		set_colors(fg, bg = z);
+		if (s_option)
+		    napms(s_option);
+	    }
+	} else {
+	    if (ranf() <= 0.01) {
+		if (ranf() > 0.6) {
+		    attr_on(WA_REVERSE, NULL);
+		} else {
+		    attr_off(WA_REVERSE, NULL);
+		}
+		if (s_option)
+		    napms(s_option);
+	    }
+	}
+	wch[0] = (wchar_t) p;
+	addnwstr(wch, 1);
+	refresh();
+	++total_chars;
+    }
+    cleanup();
+    ExitProgram(EXIT_SUCCESS);
+}
+
+#else
+int
+main(void)
+{
+    printf("This program requires the wide-ncurses library\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif
diff --git a/test/dump_window.c b/test/dump_window.c
new file mode 100644
index 0000000..14a8c9f
--- /dev/null
+++ b/test/dump_window.c
@@ -0,0 +1,179 @@
+/****************************************************************************
+ * Copyright 2018,2020 Thomas E. Dickey                                     *
+ *                                                                          *
+ * 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: dump_window.c,v 1.4 2020/02/02 23:34:34 tom Exp $
+ */
+#include <dump_window.h>
+
+static FILE *dumpfp;
+
+int
+open_dump(const char *fn)
+{
+    int result = 0;
+    close_dump();
+    if ((dumpfp = fopen(fn, "a")) != 0)
+	result = 1;
+    return result;
+}
+
+void
+close_dump(void)
+{
+    if (dumpfp != 0) {
+	fclose(dumpfp);
+	dumpfp = 0;
+    }
+}
+
+void
+dump_window(WINDOW *w)
+{
+    wgetch(w);
+    if (dumpfp != 0) {
+	int y, x;
+	int oldy, oldx;
+	int maxy, maxx;
+	int pass;
+	char *cvec = 0;
+	char *avec = 0;
+	char *pvec = 0;
+	int ccnt = 0;
+	int acnt = 0;
+	int pcnt = 0;
+	int endy = -1;
+	int endx = -1;
+
+	fprintf(dumpfp, "Window %p\n", (void *) w);
+
+	getyx(w, oldy, oldx);
+	getmaxyx(w, maxy, maxx);
+	fprintf(dumpfp, "size     (%dx%d)\n", maxy, maxx);
+	getbegyx(w, y, x);
+	fprintf(dumpfp, "begin    (%dx%d)\n", maxy, maxx);
+	getyx(w, y, x);
+	fprintf(dumpfp, "position (%d,%d)\n", y, x);
+
+	if (maxy > 0 && maxx > 0) {
+	    for (pass = 0; pass < 2; ++pass) {
+		for (y = 0; y < maxy; ++y) {
+
+		    if (cvec)
+			memset(cvec, 0, (size_t) maxx + 1);
+		    if (avec)
+			memset(avec, 0, (size_t) maxx + 1);
+		    if (pvec)
+			memset(pvec, 0, (size_t) maxx + 1);
+
+		    for (x = 0; x < maxx; ++x) {
+			chtype data = mvwinch(w, y, x);
+			chtype temp;
+			char cc = (char) ((data & 0xff) ? (data & 0xff) : ' ');
+			char aa;
+			char pp;
+
+			temp = ((data & A_ATTRIBUTES) & (~A_COLOR));
+			if (temp) {
+			    if (temp & A_ALTCHARSET) {
+				aa = (temp & A_BOLD) ? 'A' : 'a';
+			    } else if (temp & A_STANDOUT) {
+				aa = (temp & A_BOLD) ? 'S' : 's';
+			    } else if (temp & A_REVERSE) {
+				aa = (temp & A_BOLD) ? 'R' : 'r';
+			    } else if (temp & A_UNDERLINE) {
+				aa = (temp & A_BOLD) ? 'U' : 'u';
+			    } else {
+				aa = (temp & A_BOLD) ? 'b' : '?';
+			    }
+			} else {
+			    aa = ' ';
+			}
+			if (data & A_COLOR) {
+			    if (PAIR_NUMBER((int) data) < 8) {
+				pp = (char) ('0' + PAIR_NUMBER((int) data));
+			    } else {
+				pp = '*';
+			    }
+			} else {
+			    pp = ' ';
+			}
+
+			if (pass) {
+			    if (cvec)
+				cvec[x] = cc;
+			    if (avec)
+				avec[x] = aa;
+			    if (pvec)
+				pvec[x] = pp;
+			} else {
+			    if (cc != ' ' || aa != ' ' || pp != ' ') {
+				if (endx < x)
+				    endx = x;
+				if (endy < y)
+				    endy = y;
+			    }
+			    ccnt += (cc != ' ');
+			    acnt += (aa != ' ');
+			    pcnt += (pp != ' ');
+			}
+		    }
+		    if (pass) {
+			fprintf(dumpfp, "%3d", y + 1);
+			if (cvec)
+			    fprintf(dumpfp, "\tc|%.*s|\n", maxx, cvec);
+			if (avec)
+			    fprintf(dumpfp, "\ta|%.*s|\n", maxx, avec);
+			if (pvec)
+			    fprintf(dumpfp, "\tp|%.*s|\n", maxx, pvec);
+		    }
+		}
+		if (pass) {
+		    free(cvec);
+		    free(avec);
+		    free(pvec);
+		} else {
+		    fprintf(dumpfp, "%d cells with characters\n", ccnt);
+		    fprintf(dumpfp, "%d cells with video-attributes\n", acnt);
+		    fprintf(dumpfp, "%d cells with color-attributes\n", pcnt);
+		    if (endy < 0 || endx < 0)
+			break;
+		    /* reduce the dump a little, ignore really blank cells */
+		    maxx = endx + 1;
+		    maxy = endy + 1;
+		    if (ccnt)
+			cvec = malloc((size_t) maxx + 1);
+		    if (acnt)
+			avec = malloc((size_t) maxx + 1);
+		    if (pcnt)
+			pvec = malloc((size_t) maxx + 1);
+		}
+	    }
+	}
+	wmove(w, oldy, oldx);
+    }
+}
diff --git a/test/dump_window.h b/test/dump_window.h
new file mode 100644
index 0000000..865249e
--- /dev/null
+++ b/test/dump_window.h
@@ -0,0 +1,40 @@
+/****************************************************************************
+ * Copyright 2018,2020 Thomas E. Dickey                                     *
+ *                                                                          *
+ * 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: dump_window.h,v 1.2 2020/02/02 23:34:34 tom Exp $
+ */
+#ifndef DUMP_WINDOW_H_incl
+#define DUMP_WINDOW_H_incl 1
+
+#include <test.priv.h>
+
+extern int open_dump(const char *fn);
+extern void close_dump(void);
+extern void dump_window(WINDOW *w);
+
+#endif /* DUMP_WINDOW_H_incl */
diff --git a/test/dup_field.c b/test/dup_field.c
new file mode 100644
index 0000000..3e0b769
--- /dev/null
+++ b/test/dup_field.c
@@ -0,0 +1,450 @@
+/****************************************************************************
+ * Copyright 2020-2021,2022 Thomas E. Dickey                                *
+ *                                                                          *
+ * 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: dup_field.c,v 1.7 2022/12/10 23:31:31 tom Exp $
+ *
+ * Demonstrate dup_field().
+ */
+
+#include <test.priv.h>
+
+#if USE_LIBFORM
+
+#include <edit_field.h>
+#include <popup_msg.h>
+
+#define DO_DEMO	CTRL('F')	/* actual key for toggling demo-mode */
+#define MY_DEMO	EDIT_FIELD('f')	/* internal request-code */
+
+static char empty[] = "";
+static FIELD *all_fields[100];
+/* *INDENT-OFF* */
+static struct {
+    int code;
+    int result;
+    const char *help;
+} commands[] = {
+    { CTRL('A'),     REQ_BEG_FIELD,   "go to beginning of field" },
+    { CTRL('D'),     REQ_DOWN_FIELD,  "move downward to field" },
+    { CTRL('E'),     REQ_END_FIELD,   "go to end of field" },
+    { CTRL('H'),     REQ_DEL_PREV,    "delete previous character" },
+    { CTRL('I'),     REQ_NEXT_FIELD,  "go to next field" },
+    { CTRL('K'),     REQ_CLR_EOF,     "clear to end of field" },
+    { CTRL('N'),     REQ_NEXT_FIELD,  "go to next field" },
+    { CTRL('P'),     REQ_PREV_FIELD,  "go to previous field" },
+    { CTRL('Q'),     MY_QUIT,         "exit form" },
+    { CTRL('U'),     REQ_UP_FIELD,    "move upward to field" },
+    { CTRL('W'),     REQ_NEXT_WORD,   "go to next word" },
+    { CTRL('X'),     REQ_CLR_FIELD,   "clear field" },
+    { CTRL('['),     MY_QUIT,         "exit form" },
+    { KEY_F(1),      MY_HELP,         "show this screen", },
+    { KEY_BACKSPACE, REQ_DEL_PREV,    "delete previous character" },
+    { KEY_BTAB,      REQ_PREV_FIELD,  "go to previous field" },
+    { KEY_DOWN,      REQ_DOWN_CHAR,   "move down 1 character" },
+    { KEY_END,       REQ_LAST_FIELD,  "go to last field" },
+    { KEY_HOME,      REQ_FIRST_FIELD, "go to first field" },
+    { KEY_LEFT,      REQ_LEFT_CHAR,   "move left 1 character" },
+    { KEY_NEXT,      REQ_NEXT_FIELD,  "go to next field" },
+    { KEY_PREVIOUS,  REQ_PREV_FIELD,  "go to previous field" },
+    { KEY_RIGHT,     REQ_RIGHT_CHAR,  "move right 1 character" },
+    { KEY_UP,        REQ_UP_CHAR,     "move up 1 character" },
+    { DO_DEMO,       MY_DEMO,         "duplicate current field" }
+};
+/* *INDENT-ON* */
+
+static void
+my_help_edit_field(void)
+{
+    int used = 0;
+    unsigned n;
+    char **msgs = typeCalloc(char *, 3 + SIZEOF(commands));
+
+    msgs[used++] = strdup("Defined form edit/traversal keys:");
+    for (n = 0; n < SIZEOF(commands); ++n) {
+	char *msg;
+	const char *name;
+	const char *code = keyname(commands[n].code);
+	size_t need = 5;
+#ifdef NCURSES_VERSION
+	if ((name = form_request_name(commands[n].result)) == 0)
+#endif
+	    name = commands[n].help;
+	need = 5 + strlen(code) + strlen(name);
+	msg = typeMalloc(char, need);
+	_nc_SPRINTF(msg, _nc_SLIMIT(need) "%s -- %s", code, name);
+	msgs[used++] = msg;
+    }
+    msgs[used++] =
+	strdup("Arrow keys move within a field as you would expect.");
+    msgs[used] = 0;
+    popup_msg2(stdscr, msgs);
+    for (n = 0; msgs[n] != 0; ++n) {
+	free(msgs[n]);
+    }
+    free(msgs);
+}
+
+static FIELD *
+make_label(const char *label, int frow, int fcol)
+{
+    FIELD *f = new_field(1, (int) strlen(label), frow, fcol, 0, 0);
+
+    if (f) {
+	set_field_buffer(f, 0, label);
+	set_field_opts(f, (int) ((unsigned) field_opts(f) & ~O_ACTIVE));
+    }
+    return (f);
+}
+
+static FIELD *
+make_field(int frow, int fcol, int rows, int cols)
+{
+    FIELD *f = new_field(rows, cols, frow, fcol, 0, 1);
+
+    if (f) {
+	set_field_back(f, A_UNDERLINE);
+	init_edit_field(f, empty);
+    }
+    return (f);
+}
+
+static void
+erase_form(FORM *f)
+{
+    WINDOW *w = form_win(f);
+    WINDOW *s = form_sub(f);
+
+    unpost_form(f);
+    werase(w);
+    wrefresh(w);
+    delwin(s);
+}
+
+static FieldAttrs *
+my_field_attrs(FIELD *f)
+{
+    return (FieldAttrs *) field_userptr(f);
+}
+
+static int
+buffer_length(FIELD *f)
+{
+    return my_field_attrs(f)->row_lengths[0];
+}
+
+static void
+set_buffer_length(FIELD *f, int length)
+{
+    my_field_attrs(f)->row_lengths[0] = length;
+}
+
+static int
+offset_in_field(FORM *form)
+{
+    FIELD *field = current_field(form);
+    int currow, curcol;
+
+    form_getyx(form, currow, curcol);
+    return curcol + currow * (int) field->dcols;
+}
+
+static void
+inactive_field(FIELD *f)
+{
+    set_field_back(f, my_field_attrs(f)->background);
+}
+
+static int
+my_edit_field(FORM *form, int *result)
+{
+    int ch = wgetch(form_win(form));
+    int status;
+    FIELD *before;
+    unsigned n;
+    int before_row;
+    int before_col;
+    int before_off = offset_in_field(form);
+
+    form_getyx(form, before_row, before_col);
+    before = current_field(form);
+    set_field_back(before, A_NORMAL);
+    if (ch <= KEY_MAX) {
+	set_field_back(before, A_REVERSE);
+    } else if (ch <= MAX_FORM_COMMAND) {
+	inactive_field(before);
+    }
+
+    *result = ch;
+    for (n = 0; n < SIZEOF(commands); ++n) {
+	if (commands[n].code == ch) {
+	    *result = commands[n].result;
+	    break;
+	}
+    }
+
+    status = form_driver(form, *result);
+
+    if (status == E_OK) {
+	bool modified = TRUE;
+	int length = buffer_length(before);
+
+	if (length < before_off)
+	    length = before_off;
+	switch (*result) {
+	case REQ_CLR_EOF:
+	    length = before_off;
+	    break;
+	case REQ_CLR_EOL:
+	    if ((int) (before_row + 1) == (int) (before->rows))
+		length = before_off;
+	    break;
+	case REQ_CLR_FIELD:
+	    length = 0;
+	    break;
+	case REQ_DEL_CHAR:
+	    if (length > before_off)
+		--length;
+	    break;
+	case REQ_DEL_PREV:
+	    if (length > 0) {
+		if (before_col > 0) {
+		    --length;
+		} else if (before_row > 0) {
+		    length -= (int) before->cols + before_col;
+		}
+	    }
+	    break;
+	case REQ_NEW_LINE:
+	    length += (int) before->cols;
+	    break;
+
+	default:
+	    modified = (ch < MIN_FORM_COMMAND
+			&& isprint(ch));
+	    break;
+	}
+
+	/*
+	 * If we do not force a re-validation, then field_buffer 0 will
+	 * be lagging by one character.
+	 */
+	if (modified && form_driver(form, REQ_VALIDATION) == E_OK && *result
+	    < MIN_FORM_COMMAND)
+	    ++length;
+
+	set_buffer_length(before, length);
+    }
+
+    if (current_field(form) != before)
+	inactive_field(before);
+    return status;
+}
+
+static FIELD **
+copy_fields(FIELD **source, FIELD *extra, size_t length)
+{
+    FIELD **target = typeCalloc(FIELD *, length + 1);
+    memcpy(target, source, length * sizeof(FIELD *));
+    target[length] = extra;
+    return target;
+}
+
+static void
+do_demo(FORM *form)
+{
+    int count = field_count(form);
+    FIELD *my_field = current_field(form);
+    FIELD **old_fields = form_fields(form);
+
+    if (count > 0 && old_fields != NULL && my_field != NULL) {
+	FIELD **new_fields = copy_fields(old_fields,
+					 dup_field(my_field,
+						   form_field_row(my_field)
+						   + 1,
+						   form_field_col(my_field)),
+					 (size_t) count);
+	if (new_fields != NULL)
+	    set_form_fields(form, new_fields);
+    }
+}
+
+static int
+my_form_driver(FORM *form, int c)
+{
+    switch (c) {
+    case MY_QUIT:
+	if (form_driver(form, REQ_VALIDATION) == E_OK)
+	    return (TRUE);
+	break;
+    case MY_HELP:
+	my_help_edit_field();
+	break;
+    case MY_DEMO:
+	do_demo(form);
+	break;
+    default:
+	beep();
+	break;
+    }
+    return (FALSE);
+}
+
+static void
+demo_forms(void)
+{
+    FORM *form;
+    int c;
+    unsigned n = 0;
+    const char *fname;
+
+    /* describe the form */
+    all_fields[n++] = make_label("Sample Form", 0, 15);
+
+    fname = "Last Name";
+    all_fields[n++] = make_label(fname, 2, 0);
+    all_fields[n++] = make_field(3, 0, 1, 18);
+    set_field_type(all_fields[n - 1], TYPE_ALPHA, 1);
+
+    fname = "First Name";
+    all_fields[n++] = make_label(fname, 2, 20);
+    all_fields[n++] = make_field(3, 20, 1, 12);
+    set_field_type(all_fields[n - 1], TYPE_ALPHA, 1);
+
+    fname = "Middle Name";
+    all_fields[n++] = make_label(fname, 2, 34);
+    all_fields[n++] = make_field(3, 34, 1, 12);
+    set_field_type(all_fields[n - 1], TYPE_ALPHA, 1);
+
+    fname = "Comments";
+    all_fields[n++] = make_label(fname, 5, 0);
+    all_fields[n++] = make_field(6, 0, 4, 46);
+    init_edit_field(all_fields[n - 1], empty);
+
+    all_fields[n] = (FIELD *) 0;
+
+    if ((form = new_form(all_fields)) != 0) {
+	int finished = 0;
+
+	post_form(form);
+
+	while (!finished) {
+	    switch (my_edit_field(form, &c)) {
+	    case E_OK:
+		break;
+	    case E_UNKNOWN_COMMAND:
+		finished = my_form_driver(form, c);
+		break;
+	    default:
+		beep();
+		break;
+	    }
+	}
+
+	erase_form(form);
+
+	free_form(form);
+    }
+    for (c = 0; all_fields[c] != 0; c++) {
+	free_edit_field(all_fields[c]);
+	free_field(all_fields[c]);
+    }
+    noraw();
+    nl();
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: dup_field [options]"
+	,""
+	,USAGE_COMMON
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) {
+	switch (ch) {
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind < argc)
+	usage(FALSE);
+
+    setlocale(LC_ALL, "");
+
+    initscr();
+    cbreak();
+    noecho();
+    raw();
+    nonl();			/* lets us read ^M's */
+    intrflush(stdscr, FALSE);
+    keypad(stdscr, TRUE);
+
+    if (has_colors()) {
+	start_color();
+	init_pair(1, COLOR_WHITE, COLOR_BLUE);
+	init_pair(2, COLOR_GREEN, COLOR_BLACK);
+	init_pair(3, COLOR_CYAN, COLOR_BLACK);
+	bkgd((chtype) COLOR_PAIR(1));
+	refresh();
+    }
+
+    demo_forms();
+
+    endwin();
+    ExitProgram(EXIT_SUCCESS);
+}
+
+#else
+int
+main(void)
+{
+    printf("This program requires the curses form library\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif
diff --git a/test/echochar.c b/test/echochar.c
new file mode 100644
index 0000000..1d98157
--- /dev/null
+++ b/test/echochar.c
@@ -0,0 +1,184 @@
+/****************************************************************************
+ * Copyright 2019-2020,2022 Thomas E. Dickey                                *
+ * Copyright 2006-2014,2017 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: echochar.c,v 1.25 2022/12/10 22:28:50 tom Exp $
+ *
+ * Demonstrate the echochar function (compare to dots.c).
+ * Thomas Dickey - 2006/11/4
+ */
+
+#include <test.priv.h>
+
+#include <time.h>
+
+static bool interrupted = FALSE;
+static long total_chars = 0;
+static time_t started;
+
+static void
+cleanup(void)
+{
+    stop_curses();
+
+    printf("\n\n%ld total cells, rate %.2f/sec\n",
+	   total_chars,
+	   ((double) (total_chars) / (double) (time((time_t *) 0) - started)));
+}
+
+static void
+onsig(int n GCC_UNUSED)
+{
+    interrupted = TRUE;
+}
+
+static double
+ranf(void)
+{
+    long r = (rand() & 077777);
+    return ((double) r / 32768.);
+}
+
+static void
+set_color(char *my_pairs, int fg, int bg)
+{
+    int pair = (fg * COLORS) + bg;
+    if (pair < COLOR_PAIRS) {
+	if (!my_pairs[pair]) {
+	    init_pair((short) pair,
+		      (short) fg,
+		      (short) bg);
+	}
+	attron(COLOR_PAIR(pair));
+    }
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: echochar"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+	," -r       use addch/refresh rather than echochar()"
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+    double r;
+    double c;
+    bool use_colors;
+    bool opt_r = FALSE;
+    char *my_pairs = 0;
+    int last_fg = 0;
+    int last_bg = 0;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "r")) != -1) {
+	switch (ch) {
+	case 'r':
+	    opt_r = TRUE;
+	    break;
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+
+    InitAndCatch(initscr(), onsig);
+
+    use_colors = has_colors();
+    if (use_colors) {
+	start_color();
+	if (COLOR_PAIRS > 0) {
+	    my_pairs = typeCalloc(char, (size_t) COLOR_PAIRS);
+	}
+	use_colors = (my_pairs != 0);
+    }
+
+    srand((unsigned) time(0));
+
+    curs_set(0);
+
+    r = (double) (LINES - 4);
+    c = (double) (COLS - 4);
+    started = time((time_t *) 0);
+
+    while (!interrupted) {
+	int x = (int) (c * ranf()) + 2;
+	int y = (int) (r * ranf()) + 2;
+	int p = (ranf() > 0.9) ? '*' : ' ';
+
+	move(y, x);
+	if (use_colors > 0) {
+	    int z = (int) (ranf() * COLORS);
+	    if (ranf() > 0.01) {
+		set_color(my_pairs, z, last_bg);
+		last_fg = z;
+	    } else {
+		set_color(my_pairs, last_fg, z);
+		last_bg = z;
+		napms(1);
+	    }
+	} else {
+	    if (ranf() <= 0.01) {
+		if (ranf() > 0.6)
+		    attron(A_REVERSE);
+		else
+		    attroff(A_REVERSE);
+		napms(1);
+	    }
+	}
+	if (opt_r) {
+	    AddCh(UChar(p));
+	    refresh();
+	} else {
+	    echochar(UChar(p));
+	}
+	++total_chars;
+    }
+    cleanup();
+    free(my_pairs);
+    ExitProgram(EXIT_SUCCESS);
+}
diff --git a/test/edit_field.c b/test/edit_field.c
new file mode 100644
index 0000000..b2b2084
--- /dev/null
+++ b/test/edit_field.c
@@ -0,0 +1,438 @@
+/****************************************************************************
+ * Copyright 2019,2020 Thomas E. Dickey                                     *
+ * Copyright 2003-2014,2017 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: edit_field.c,v 1.31 2020/02/02 23:34:34 tom Exp $
+ *
+ * A wrapper for form_driver() which keeps track of the user's editing changes
+ * for each field, and makes the resulting length available as a
+ * null-terminated string in field_buffer(field,1).
+ *
+ * Thomas Dickey - 2003/4/26.
+ */
+
+#include <test.priv.h>
+
+#if USE_LIBFORM
+
+#include <edit_field.h>
+#include <popup_msg.h>
+
+static struct {
+    int code;
+    int result;
+    const char *help;
+} commands[] = {
+
+    {
+	CTRL('A'), REQ_NEXT_CHOICE, ""
+    },
+    {
+	CTRL('B'), REQ_PREV_WORD, "go to previous word"
+    },
+    {
+	CTRL('C'), REQ_CLR_EOL, "clear to end of line"
+    },
+    {
+	CTRL('D'), REQ_DOWN_FIELD, "move downward to field"
+    },
+    {
+	CTRL('E'), REQ_END_FIELD, "go to end of field"
+    },
+    {
+	CTRL('F'), REQ_NEXT_PAGE, "go to next page"
+    },
+    {
+	CTRL('G'), REQ_DEL_WORD, "delete current word"
+    },
+    {
+	CTRL('H'), REQ_DEL_PREV, "delete previous character"
+    },
+    {
+	CTRL('I'), REQ_INS_CHAR, "insert character"
+    },
+    {
+	CTRL('K'), REQ_CLR_EOF, "clear to end of field"
+    },
+    {
+	CTRL('L'), REQ_LEFT_FIELD, "go to field to left"
+    },
+    {
+	CTRL('M'), REQ_NEW_LINE, "insert/overlay new line"
+    },
+    {
+	CTRL('N'), REQ_NEXT_FIELD, "go to next field"
+    },
+    {
+	CTRL('O'), REQ_INS_LINE, "insert blank line at cursor"
+    },
+    {
+	CTRL('P'), REQ_PREV_FIELD, "go to previous field"
+    },
+    {
+	CTRL('Q'), MY_QUIT, "exit form"
+    },
+    {
+	CTRL('R'), REQ_RIGHT_FIELD, "go to field to right"
+    },
+    {
+	CTRL('S'), REQ_BEG_FIELD, "go to beginning of field"
+    },
+    {
+	CTRL('T'), MY_EDT_MODE, "toggle O_EDIT mode, clear field status",
+    },
+    {
+	CTRL('U'), REQ_UP_FIELD, "move upward to field"
+    },
+    {
+	CTRL('V'), REQ_DEL_CHAR, "delete character"
+    },
+    {
+	CTRL('W'), REQ_NEXT_WORD, "go to next word"
+    },
+    {
+	CTRL('X'), REQ_CLR_FIELD, "clear field"
+    },
+    {
+	CTRL('Y'), REQ_DEL_LINE, "delete line"
+    },
+    {
+	CTRL('Z'), REQ_PREV_CHOICE, ""
+    },
+    {
+	CTRL('['), MY_QUIT, "exit form"
+    },
+    {
+	CTRL(']'), MY_INS_MODE, "toggle REQ_INS_MODE/REQ_OVL_MODE",
+    },
+    {
+	KEY_F(1), MY_HELP, "show this screen",
+    },
+    {
+	KEY_BACKSPACE, REQ_DEL_PREV, "delete previous character"
+    },
+    {
+	KEY_DOWN, REQ_DOWN_CHAR, "move down 1 character"
+    },
+    {
+	KEY_END, REQ_LAST_FIELD, "go to last field"
+    },
+    {
+	KEY_HOME, REQ_FIRST_FIELD, "go to first field"
+    },
+    {
+	KEY_LEFT, REQ_LEFT_CHAR, "move left 1 character"
+    },
+    {
+	KEY_LL, REQ_LAST_FIELD, "go to last field"
+    },
+    {
+	KEY_NEXT, REQ_NEXT_FIELD, "go to next field"
+    },
+    {
+	KEY_NPAGE, REQ_NEXT_PAGE, "go to next page"
+    },
+    {
+	KEY_PPAGE, REQ_PREV_PAGE, "go to previous page"
+    },
+    {
+	KEY_PREVIOUS, REQ_PREV_FIELD, "go to previous field"
+    },
+    {
+	KEY_RIGHT, REQ_RIGHT_CHAR, "move right 1 character"
+    },
+    {
+	KEY_UP, REQ_UP_CHAR, "move up 1 character"
+    }
+};
+
+/*
+ * Display a temporary window listing the keystroke-commands we recognize.
+ */
+void
+help_edit_field(void)
+{
+    int used = 0;
+    unsigned n;
+    char **msgs = typeCalloc(char *, 3 + SIZEOF(commands));
+
+    msgs[used++] = strdup("Defined form edit/traversal keys:");
+    for (n = 0; n < SIZEOF(commands); ++n) {
+	char *msg;
+	const char *name;
+	const char *code = keyname(commands[n].code);
+	size_t need = 5;
+#ifdef NCURSES_VERSION
+	if ((name = form_request_name(commands[n].result)) == 0)
+#endif
+	    name = commands[n].help;
+	need = 5 + strlen(code) + strlen(name);
+	msg = typeMalloc(char, need);
+	_nc_SPRINTF(msg, _nc_SLIMIT(need) "%s -- %s", code, name);
+	msgs[used++] = msg;
+    }
+    msgs[used++] =
+	strdup("Arrow keys move within a field as you would expect.");
+    msgs[used] = 0;
+    popup_msg2(stdscr, msgs);
+    for (n = 0; msgs[n] != 0; ++n) {
+	free(msgs[n]);
+    }
+    free(msgs);
+}
+
+static int
+offset_in_field(FORM *form)
+{
+    FIELD *field = current_field(form);
+    int currow, curcol;
+
+    form_getyx(form, currow, curcol);
+    return curcol + currow * (int) field->dcols;
+}
+
+static void
+inactive_field(FIELD *f)
+{
+    set_field_back(f, field_attrs(f)->background);
+}
+
+FieldAttrs *
+field_attrs(FIELD *f)
+{
+    return (FieldAttrs *) field_userptr(f);
+}
+
+static int
+buffer_length(FIELD *f)
+{
+    return field_attrs(f)->row_lengths[0];
+}
+
+static void
+set_buffer_length(FIELD *f, int length)
+{
+    field_attrs(f)->row_lengths[0] = length;
+}
+
+/*
+ * The userptr is used in edit_field.c's inactive_field(), as well as for
+ * keeping track of the actual lengths of lines in a multiline field.
+ */
+void
+init_edit_field(FIELD *f, char *value)
+{
+    char empty[1];
+    FieldAttrs *ptr = field_attrs(f);
+    if (ptr == 0) {
+	int rows, cols, frow, fcol, nrow, nbuf;
+
+	ptr = typeCalloc(FieldAttrs, (size_t) 1);
+	ptr->background = field_back(f);
+	if (field_info(f, &rows, &cols, &frow, &fcol, &nrow, &nbuf) == E_OK) {
+	    ptr->row_count = nrow;
+	    ptr->row_lengths = typeCalloc(int, (size_t) nrow + 1);
+	}
+    }
+    if (value == 0) {
+	value = empty;
+	*value = '\0';
+    }
+    set_field_userptr(f, (void *) ptr);
+    set_field_buffer(f, 0, value);	/* will be formatted */
+    set_field_buffer(f, 1, value);	/* will be unformatted */
+    set_buffer_length(f, (int) strlen(value));
+}
+
+int
+edit_field(FORM *form, int *result)
+{
+    int ch = wgetch(form_win(form));
+    int status;
+    FIELD *before;
+    unsigned n;
+    int length;
+    int before_row;
+    int before_col;
+    int before_off = offset_in_field(form);
+
+    form_getyx(form, before_row, before_col);
+    before = current_field(form);
+    set_field_back(before, A_NORMAL);
+    if (ch <= KEY_MAX) {
+	set_field_back(before, A_REVERSE);
+    } else if (ch <= MAX_FORM_COMMAND) {
+	inactive_field(before);
+    }
+
+    *result = ch;
+    for (n = 0; n < SIZEOF(commands); ++n) {
+	if (commands[n].code == ch) {
+	    *result = commands[n].result;
+	    break;
+	}
+    }
+
+    status = form_driver(form, *result);
+
+    if (status == E_OK) {
+	bool modified = TRUE;
+
+	length = buffer_length(before);
+	if (length < before_off)
+	    length = before_off;
+	switch (*result) {
+	case REQ_CLR_EOF:
+	    length = before_off;
+	    break;
+	case REQ_CLR_EOL:
+	    if ((int) (before_row + 1) == (int) (before->rows))
+		length = before_off;
+	    break;
+	case REQ_CLR_FIELD:
+	    length = 0;
+	    break;
+	case REQ_DEL_CHAR:
+	    if (length > before_off)
+		--length;
+	    break;
+	case REQ_DEL_PREV:
+	    if (length > 0) {
+		if (before_col > 0) {
+		    --length;
+		} else if (before_row > 0) {
+		    length -= (int) before->cols + before_col;
+		}
+	    }
+	    break;
+	case REQ_NEW_LINE:
+	    length += (int) before->cols;
+	    break;
+#if 0
+	    /* FIXME: finish these */
+	case REQ_DEL_LINE:	/* delete line */
+	case REQ_DEL_WORD:	/* delete word at cursor */
+	case REQ_INS_CHAR:	/* insert blank char at cursor */
+	case REQ_INS_LINE:	/* insert blank line at cursor */
+	case REQ_INS_MODE:	/* begin insert mode */
+	case REQ_OVL_MODE:	/* begin overlay mode */
+#endif
+	    /* ignore all of the motion commands */
+	case REQ_SCR_BCHAR:	/* FALLTHRU */
+	case REQ_SCR_BHPAGE:	/* FALLTHRU */
+	case REQ_SCR_BLINE:	/* FALLTHRU */
+	case REQ_SCR_BPAGE:	/* FALLTHRU */
+	case REQ_SCR_FCHAR:	/* FALLTHRU */
+	case REQ_SCR_FHPAGE:	/* FALLTHRU */
+	case REQ_SCR_FLINE:	/* FALLTHRU */
+	case REQ_SCR_FPAGE:	/* FALLTHRU */
+	case REQ_SCR_HBHALF:	/* FALLTHRU */
+	case REQ_SCR_HBLINE:	/* FALLTHRU */
+	case REQ_SCR_HFHALF:	/* FALLTHRU */
+	case REQ_SCR_HFLINE:	/* FALLTHRU */
+	case REQ_BEG_FIELD:	/* FALLTHRU */
+	case REQ_BEG_LINE:	/* FALLTHRU */
+	case REQ_DOWN_CHAR:	/* FALLTHRU */
+	case REQ_DOWN_FIELD:	/* FALLTHRU */
+	case REQ_END_FIELD:	/* FALLTHRU */
+	case REQ_END_LINE:	/* FALLTHRU */
+	case REQ_FIRST_FIELD:	/* FALLTHRU */
+	case REQ_FIRST_PAGE:	/* FALLTHRU */
+	case REQ_LAST_FIELD:	/* FALLTHRU */
+	case REQ_LAST_PAGE:	/* FALLTHRU */
+	case REQ_LEFT_CHAR:	/* FALLTHRU */
+	case REQ_LEFT_FIELD:	/* FALLTHRU */
+	case REQ_NEXT_CHAR:	/* FALLTHRU */
+	case REQ_NEXT_CHOICE:	/* FALLTHRU */
+	case REQ_NEXT_FIELD:	/* FALLTHRU */
+	case REQ_NEXT_LINE:	/* FALLTHRU */
+	case REQ_NEXT_PAGE:	/* FALLTHRU */
+	case REQ_NEXT_WORD:	/* FALLTHRU */
+	case REQ_PREV_CHAR:	/* FALLTHRU */
+	case REQ_PREV_CHOICE:	/* FALLTHRU */
+	case REQ_PREV_FIELD:	/* FALLTHRU */
+	case REQ_PREV_LINE:	/* FALLTHRU */
+	case REQ_PREV_PAGE:	/* FALLTHRU */
+	case REQ_PREV_WORD:	/* FALLTHRU */
+	case REQ_RIGHT_CHAR:	/* FALLTHRU */
+	case REQ_RIGHT_FIELD:	/* FALLTHRU */
+	case REQ_SFIRST_FIELD:	/* FALLTHRU */
+	case REQ_SLAST_FIELD:	/* FALLTHRU */
+	case REQ_SNEXT_FIELD:	/* FALLTHRU */
+	case REQ_SPREV_FIELD:	/* FALLTHRU */
+	case REQ_UP_CHAR:	/* FALLTHRU */
+	case REQ_UP_FIELD:	/* FALLTHRU */
+	case REQ_VALIDATION:	/* FALLTHRU */
+	    modified = FALSE;
+	    break;
+
+	default:
+	    modified = FALSE;
+	    if (ch >= MIN_FORM_COMMAND) {
+		beep();
+	    } else if (isprint(ch)) {
+		modified = TRUE;
+	    }
+	    break;
+	}
+
+	/*
+	 * If we do not force a re-validation, then field_buffer 0 will
+	 * be lagging by one character.
+	 */
+	if (modified && form_driver(form, REQ_VALIDATION) == E_OK && *result
+	    < MIN_FORM_COMMAND)
+	    ++length;
+
+	set_buffer_length(before, length);
+    }
+
+    if (current_field(form) != before)
+	inactive_field(before);
+    return status;
+}
+
+void
+free_edit_field(FIELD *f)
+{
+    FieldAttrs *ptr = field_attrs(f);
+    if (ptr != 0) {
+	free(ptr->row_lengths);
+	free(ptr);
+    }
+}
+#else
+
+extern void no_edit_field(void);
+
+void
+no_edit_field(void)
+{
+}
+
+#endif
diff --git a/test/edit_field.h b/test/edit_field.h
new file mode 100644
index 0000000..ad9e6a5
--- /dev/null
+++ b/test/edit_field.h
@@ -0,0 +1,59 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 2003-2013,2017 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: edit_field.h,v 1.11 2020/02/02 23:34:34 tom Exp $
+ *
+ * Interface of edit_field.c
+ */
+
+#ifndef EDIT_FORM_H_incl
+#define EDIT_FORM_H_incl 1
+
+#include <form.h>
+
+#define EDIT_FIELD(c) (MAX_FORM_COMMAND + c)
+
+#define MY_HELP		EDIT_FIELD('h')
+#define MY_QUIT		EDIT_FIELD('q')
+#define MY_EDT_MODE	EDIT_FIELD('e')
+#define MY_INS_MODE	EDIT_FIELD('t')
+
+typedef struct {
+    chtype background;
+    int row_count;
+    int *row_lengths;
+} FieldAttrs;
+
+extern FieldAttrs *field_attrs(FIELD *field);
+extern void init_edit_field(FIELD *field, char *value);
+extern void help_edit_field(void);
+extern int edit_field(FORM *form, int *result);
+extern void free_edit_field(FIELD *field);
+
+#endif /* EDIT_FORM_H_incl */
diff --git a/test/escherknot.xbm b/test/escherknot.xbm
new file mode 100644
index 0000000..80bc471
--- /dev/null
+++ b/test/escherknot.xbm
@@ -0,0 +1,473 @@
+#define escherknot_width 216
+#define escherknot_height 208
+
+static char escherknot_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfa, 0x5f,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x6f, 0xf6, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xc0, 0xff, 0x3a, 0x13, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x0d, 0x02, 0x51, 0x71, 0x0e, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x2f, 0x20, 0xd9, 0x88,
+ 0x9b, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x82,
+ 0xac, 0x44, 0x4e, 0x1c, 0xf3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x1e, 0x40, 0x02, 0x44, 0x60, 0xe2, 0xfc, 0x06, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x80, 0x25, 0x09, 0x90, 0x22, 0x13, 0xb7, 0x9a, 0x1e,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x40, 0x10, 0x89,
+ 0x18, 0xe3, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x04, 0x08,
+ 0x01, 0x10, 0xc8, 0xa8, 0xd5, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x83, 0x80, 0x20, 0x40, 0x82, 0x00, 0x66, 0x9c, 0xec, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x08, 0x08, 0x24, 0x12, 0x93, 0x5b,
+ 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x12, 0x80, 0x04, 0x01, 0x00, 0x80,
+ 0x19, 0x33, 0xfa, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x80, 0x80, 0x00,
+ 0x20, 0x08, 0x12, 0xc4, 0x68, 0x26, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x02, 0x04, 0x24, 0x00, 0x01, 0x40, 0x24, 0x8c, 0xcd, 0x3f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00,
+ 0x00, 0x80, 0x49, 0x10, 0x90, 0x00, 0x21, 0x20, 0x08, 0x11, 0x43, 0xd9,
+ 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8,
+ 0xff, 0xff, 0x0b, 0x00, 0x60, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x30, 0xb9, 0xf2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xc0, 0x97, 0x04, 0x08, 0xfe, 0x05, 0x30, 0x10, 0x12, 0x20, 0x20,
+ 0x04, 0x00, 0x80, 0x48, 0x0c, 0xa3, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x3e, 0x92, 0x20, 0x49, 0x40, 0x3e, 0x0e, 0x82,
+ 0x00, 0x84, 0x25, 0x01, 0x80, 0x00, 0x80, 0xc8, 0x34, 0xed, 0x03, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x25, 0x01, 0x04, 0x01, 0x08,
+ 0xd0, 0x17, 0x00, 0x80, 0x25, 0x01, 0xad, 0x04, 0x12, 0x20, 0x23, 0x4c,
+ 0x6a, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x02, 0x48,
+ 0x92, 0x20, 0x41, 0x92, 0x9e, 0x80, 0x24, 0x24, 0x29, 0x00, 0x04, 0x00,
+ 0x10, 0x98, 0xcc, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
+ 0x4f, 0x10, 0x01, 0x90, 0x24, 0x40, 0x12, 0xf0, 0x00, 0x24, 0x41, 0x0b,
+ 0xa9, 0x10, 0x00, 0x00, 0x04, 0xd9, 0x96, 0x0e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xe0, 0x00, 0x92, 0x48, 0x02, 0x04, 0x09, 0xc0, 0x84, 0x8f,
+ 0x29, 0x2d, 0xf8, 0xa9, 0x02, 0x00, 0x00, 0x20, 0x90, 0xf4, 0x1e, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x24, 0x91, 0x04, 0x50, 0x22, 0x24,
+ 0x1b, 0x12, 0x7a, 0x48, 0xca, 0x03, 0x21, 0x10, 0x00, 0x00, 0x48, 0x93,
+ 0xff, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9e, 0x24, 0x92, 0x20,
+ 0x81, 0xda, 0x24, 0xc8, 0x16, 0xd0, 0xe7, 0x50, 0xd2, 0xbf, 0x03, 0x00,
+ 0x80, 0x00, 0x30, 0x29, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03,
+ 0x20, 0x80, 0x24, 0x41, 0x12, 0x2a, 0x41, 0xb2, 0x80, 0x33, 0x0e, 0x7e,
+ 0x88, 0x1c, 0x01, 0x00, 0xa0, 0x24, 0x69, 0x75, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xe0, 0x82, 0x44, 0x11, 0x24, 0x09, 0x90, 0xa4, 0x4d, 0xd2, 0x92,
+ 0x9e, 0xd3, 0x83, 0x6b, 0x62, 0x00, 0x00, 0x10, 0x22, 0xff, 0x7f, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x30, 0x42, 0x04, 0x92, 0x24, 0x6b, 0x53, 0x32,
+ 0x59, 0x90, 0x16, 0xfa, 0xb4, 0xf4, 0xff, 0x0f, 0x01, 0x00, 0x90, 0x68,
+ 0x4a, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x90, 0x24, 0x11, 0x24,
+ 0x49, 0xda, 0x82, 0xc5, 0x92, 0xd2, 0xd0, 0x9e, 0x1e, 0x00, 0x78, 0x0a,
+ 0x00, 0x00, 0x05, 0xd2, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x02,
+ 0x44, 0xb2, 0x65, 0xea, 0x49, 0x9e, 0x2c, 0x4b, 0x1a, 0xd2, 0xeb, 0xe3,
+ 0xff, 0xc7, 0x09, 0x00, 0x20, 0x68, 0xff, 0xd6, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x0b, 0x90, 0x40, 0x92, 0x24, 0x09, 0x5f, 0xd2, 0x64, 0x59, 0x72,
+ 0x56, 0x7f, 0xfd, 0xdf, 0x1f, 0x12, 0x00, 0x20, 0x49, 0x92, 0xde, 0x01,
+ 0x00, 0x00, 0x00, 0x80, 0x41, 0x92, 0x4c, 0x92, 0x24, 0x25, 0xc9, 0x8b,
+ 0x2e, 0xcb, 0x92, 0x4b, 0x5a, 0x2f, 0x75, 0xf4, 0x04, 0x00, 0x00, 0x41,
+ 0xf6, 0x74, 0x01, 0x00, 0x00, 0x00, 0x40, 0x49, 0x02, 0x00, 0xba, 0xb6,
+ 0xfd, 0x49, 0xf8, 0x74, 0x6d, 0x4b, 0x72, 0xed, 0xdb, 0xff, 0xcf, 0x53,
+ 0x00, 0x00, 0x48, 0xb6, 0xd7, 0x03, 0x00, 0x00, 0x00, 0x60, 0x48, 0x10,
+ 0xc9, 0x93, 0x24, 0x00, 0x7b, 0xc3, 0xa6, 0x69, 0x58, 0x5a, 0xfb, 0xfa,
+ 0xa5, 0xbe, 0x16, 0x00, 0x00, 0x92, 0xa4, 0xfd, 0x03, 0x00, 0x00, 0x00,
+ 0x30, 0x01, 0x20, 0x5d, 0xa2, 0xfe, 0x7f, 0x01, 0x4f, 0x1a, 0xcd, 0x6b,
+ 0x6a, 0xa9, 0x5f, 0xff, 0xf3, 0x24, 0x01, 0x40, 0xc0, 0xb4, 0xf4, 0x03,
+ 0x00, 0x00, 0x00, 0x2c, 0x88, 0x84, 0x89, 0xb6, 0x00, 0x24, 0x7d, 0x69,
+ 0xf2, 0x34, 0xad, 0x99, 0x2d, 0xf7, 0xff, 0x9f, 0x4b, 0x00, 0x00, 0x92,
+ 0xa6, 0xad, 0x07, 0x00, 0x00, 0x00, 0x06, 0x91, 0x24, 0xe9, 0xa4, 0xfd,
+ 0xa5, 0xa9, 0x4b, 0x93, 0xe7, 0x34, 0x63, 0xf9, 0xfc, 0xd5, 0xef, 0x16,
+ 0x00, 0x40, 0x90, 0xb4, 0xbd, 0x07, 0x00, 0x00, 0x00, 0x6a, 0x80, 0x4c,
+ 0x96, 0xbe, 0x2d, 0xfd, 0x2f, 0x7c, 0x5e, 0x9c, 0x67, 0xad, 0xa5, 0xfd,
+ 0xff, 0xbf, 0x29, 0x00, 0x00, 0x92, 0x76, 0xed, 0x06, 0x00, 0x00, 0x00,
+ 0x05, 0x12, 0x48, 0x53, 0x25, 0x65, 0x25, 0xf4, 0xe5, 0xd3, 0x72, 0x9c,
+ 0x35, 0xdf, 0xf6, 0x7f, 0xf5, 0x56, 0x00, 0x00, 0x92, 0xa4, 0xed, 0x0f,
+ 0x00, 0x00, 0x80, 0x49, 0x20, 0x59, 0x38, 0xec, 0xff, 0xff, 0xad, 0x2f,
+ 0x5d, 0xd3, 0x33, 0xe6, 0x24, 0xed, 0xff, 0xdf, 0x2d, 0x01, 0x40, 0x80,
+ 0x24, 0xbd, 0x07, 0x00, 0x00, 0xc0, 0x48, 0x24, 0x49, 0x87, 0x37, 0x21,
+ 0xa0, 0xbd, 0xf4, 0x79, 0x4f, 0xc7, 0x9c, 0xde, 0xf6, 0xff, 0xff, 0x5b,
+ 0x08, 0x00, 0x92, 0xfc, 0xe9, 0x0e, 0x00, 0x00, 0x20, 0x89, 0x40, 0xd3,
+ 0xf4, 0x49, 0xff, 0xff, 0xe7, 0x2f, 0xcf, 0x79, 0x9c, 0x53, 0xb2, 0x35,
+ 0xff, 0xff, 0x37, 0x00, 0x40, 0x90, 0x24, 0xef, 0x0e, 0x00, 0x00, 0x30,
+ 0x91, 0x49, 0x32, 0x2d, 0xff, 0x6b, 0xb7, 0xbd, 0xbc, 0x3c, 0xef, 0x79,
+ 0xce, 0xde, 0xd6, 0xfd, 0xff, 0x9f, 0x00, 0x00, 0x92, 0xa6, 0xad, 0x0b,
+ 0x00, 0x00, 0x30, 0x11, 0x89, 0x8c, 0xcb, 0x5b, 0xba, 0xaf, 0xf6, 0xd7,
+ 0xe7, 0x35, 0xe7, 0x59, 0xb3, 0xfb, 0xff, 0xff, 0x7f, 0x04, 0x40, 0x80,
+ 0xe4, 0xb9, 0x1f, 0x00, 0x00, 0x48, 0x22, 0x91, 0x66, 0x79, 0xeb, 0xff,
+ 0xff, 0xdf, 0xbe, 0xbe, 0xe7, 0x8c, 0x75, 0x6b, 0x4a, 0xfa, 0xbf, 0x7f,
+ 0x00, 0x00, 0x82, 0x24, 0xef, 0x0e, 0x00, 0x00, 0x4c, 0x22, 0xb2, 0x79,
+ 0x5e, 0xfa, 0x5b, 0xa9, 0xfd, 0xeb, 0xf5, 0x9c, 0x3d, 0xc6, 0xcc, 0xee,
+ 0xed, 0x01, 0xf8, 0x00, 0x40, 0x82, 0xb6, 0xa9, 0x1b, 0x00, 0x00, 0x94,
+ 0x64, 0x66, 0x8e, 0xd3, 0x97, 0xfe, 0xff, 0xd7, 0xdf, 0x9f, 0x7b, 0xf3,
+ 0x3c, 0x35, 0x59, 0x6b, 0x00, 0x70, 0x00, 0x00, 0x40, 0xe4, 0xed, 0x1e,
+ 0x00, 0x00, 0x92, 0xc4, 0x34, 0xf3, 0xfc, 0xfd, 0x5f, 0xad, 0x7d, 0xfa,
+ 0x7a, 0xce, 0x8e, 0xb3, 0x76, 0x2f, 0xfd, 0x00, 0xe0, 0x04, 0x00, 0x9a,
+ 0x26, 0xaf, 0x1e, 0x00, 0x00, 0x13, 0x88, 0xcc, 0xb5, 0x3f, 0xbf, 0xff,
+ 0xff, 0xd7, 0xef, 0xef, 0xbd, 0x79, 0x6a, 0xde, 0xec, 0xab, 0x01, 0xc0,
+ 0x00, 0x00, 0x40, 0xb6, 0xbd, 0x1b, 0x00, 0x00, 0x05, 0x91, 0xeb, 0x5c,
+ 0xeb, 0xeb, 0xff, 0xff, 0xff, 0x7e, 0xef, 0x6b, 0xef, 0xcd, 0x99, 0xb3,
+ 0xe4, 0x07, 0x80, 0x00, 0x40, 0x49, 0xb2, 0xe5, 0x1a, 0x00, 0x80, 0x20,
+ 0x32, 0xb1, 0xe7, 0x79, 0x7f, 0xf7, 0xff, 0xfd, 0xeb, 0xbd, 0xfe, 0x2c,
+ 0x3d, 0x6b, 0xb6, 0xaf, 0x06, 0x80, 0x00, 0x00, 0x41, 0x96, 0xfe, 0x1e,
+ 0x00, 0x80, 0x44, 0xb2, 0x9b, 0xf9, 0xde, 0xff, 0xff, 0xff, 0x7f, 0xbf,
+ 0xf7, 0xbb, 0xb3, 0x77, 0xce, 0xce, 0xb6, 0x0d, 0x80, 0x01, 0x00, 0x49,
+ 0xf2, 0x94, 0x1f, 0x00, 0x40, 0x49, 0x44, 0xe6, 0x9e, 0x77, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xbf, 0xf7, 0x7e, 0xd6, 0xbc, 0xd9, 0xba, 0x3b, 0x80,
+ 0x00, 0x00, 0x64, 0x93, 0xf7, 0x1b, 0x00, 0x40, 0x89, 0xec, 0x7e, 0x67,
+ 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xce, 0xdb, 0x99, 0x33, 0x37,
+ 0xd3, 0x36, 0x80, 0x01, 0x80, 0x24, 0xda, 0xd6, 0x1e, 0x00, 0x20, 0x90,
+ 0x99, 0x99, 0x7b, 0xef, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xef, 0xbd, 0x37,
+ 0x63, 0xf3, 0x66, 0xdb, 0x7a, 0x80, 0x00, 0x00, 0x24, 0x59, 0xde, 0x1f,
+ 0x00, 0x60, 0x12, 0xb3, 0xf7, 0xdd, 0xfb, 0xfe, 0xff, 0xff, 0xff, 0xff,
+ 0xbf, 0xf7, 0xfe, 0x6e, 0xce, 0xdd, 0x6d, 0xd7, 0x80, 0x00, 0x80, 0x20,
+ 0xcb, 0xfb, 0x1f, 0x00, 0x10, 0x20, 0x6e, 0x66, 0x76, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xef, 0xde, 0xdb, 0x9b, 0x99, 0xb3, 0x5d, 0x6b, 0x81,
+ 0x00, 0x40, 0x96, 0x59, 0x6a, 0x1f, 0x00, 0x98, 0xc4, 0xe4, 0xdf, 0xff,
+ 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0x6f, 0x7b, 0x37, 0x7f,
+ 0xb3, 0xdd, 0x83, 0x00, 0x00, 0xb0, 0xed, 0xef, 0x1d, 0x00, 0x10, 0x88,
+ 0x9e, 0xdd, 0xcd, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xed,
+ 0x6c, 0xe6, 0xcc, 0x76, 0x6d, 0xc1, 0x00, 0x40, 0x91, 0x24, 0x7b, 0x1f,
+ 0x00, 0x08, 0xd1, 0xf1, 0x66, 0x76, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xdf, 0xbd, 0xbf, 0xd9, 0xdd, 0xdd, 0xb6, 0x47, 0x00, 0x00, 0xd8,
+ 0xb4, 0xad, 0x1f, 0x00, 0x24, 0x24, 0x6f, 0xf6, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0x7f, 0x7f, 0xb7, 0x9d, 0x33, 0xd9, 0x96, 0x4e,
+ 0x00, 0x20, 0x49, 0xf7, 0xfd, 0x1e, 0x00, 0x48, 0xe4, 0xac, 0xb9, 0xdd,
+ 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xdd, 0x76, 0xb6,
+ 0xb7, 0xfd, 0x7a, 0x00, 0x00, 0x44, 0x96, 0xb7, 0x1f, 0x00, 0x02, 0x9a,
+ 0xbe, 0x6f, 0x77, 0xff, 0xff, 0x7f, 0x61, 0xd9, 0xff, 0xff, 0xff, 0xfd,
+ 0xdd, 0x66, 0xed, 0x66, 0x5b, 0x37, 0x00, 0x90, 0x64, 0xb9, 0xf6, 0x1f,
+ 0x00, 0x02, 0xc9, 0xf3, 0xee, 0xfd, 0xff, 0xff, 0x2f, 0x24, 0x4f, 0xfe,
+ 0xff, 0xff, 0x7f, 0x37, 0xdb, 0xcd, 0x7c, 0xff, 0x3a, 0x00, 0x88, 0x24,
+ 0xdb, 0xde, 0x1a, 0x00, 0x13, 0x31, 0x6f, 0xbb, 0xdf, 0xff, 0xff, 0x21,
+ 0xa0, 0x64, 0xf3, 0xff, 0xff, 0xe7, 0xff, 0x96, 0xbb, 0x9b, 0xa5, 0x1d,
+ 0x00, 0x60, 0x32, 0xe9, 0xdb, 0x0f, 0x00, 0x65, 0xe6, 0x3c, 0xfb, 0xf6,
+ 0xff, 0x7f, 0x10, 0xa4, 0xb5, 0x9d, 0xfe, 0xdf, 0xdf, 0xdd, 0x6d, 0x32,
+ 0xb3, 0x7d, 0x0d, 0x00, 0x0b, 0x93, 0x7c, 0x7b, 0x0f, 0x00, 0x89, 0xdc,
+ 0xb3, 0xed, 0xfb, 0xff, 0x1f, 0x10, 0x90, 0x92, 0xd9, 0xfe, 0x7f, 0xff,
+ 0x77, 0xdb, 0xee, 0x6e, 0xdb, 0x0e, 0x00, 0x20, 0xdd, 0x66, 0x6f, 0x0f,
+ 0x80, 0x91, 0x5a, 0xfb, 0xbe, 0xef, 0xff, 0x0f, 0x10, 0xda, 0x92, 0xee,
+ 0xff, 0xff, 0xff, 0xf7, 0xb7, 0xcd, 0xee, 0xde, 0x07, 0x00, 0x24, 0x49,
+ 0xb6, 0xed, 0x0f, 0x00, 0x12, 0x6b, 0xcd, 0xf3, 0xbe, 0xff, 0x07, 0x08,
+ 0x48, 0xda, 0x76, 0xb7, 0xff, 0xff, 0xdd, 0x6e, 0xba, 0x99, 0x65, 0x03,
+ 0x40, 0x92, 0xe4, 0xba, 0xbd, 0x0e, 0x80, 0x62, 0xed, 0x7d, 0x5f, 0xf7,
+ 0xff, 0x01, 0x08, 0x28, 0xc9, 0x26, 0xbb, 0xff, 0xff, 0xff, 0x99, 0xb7,
+ 0xbb, 0x7d, 0x03, 0x00, 0x89, 0x64, 0xdb, 0xf6, 0x07, 0x40, 0x0c, 0x35,
+ 0xe7, 0x79, 0xdd, 0xff, 0x01, 0x84, 0xa5, 0x7d, 0xba, 0xdd, 0xfe, 0x7f,
+ 0xbf, 0xbf, 0x6d, 0x76, 0xdb, 0x01, 0x00, 0x48, 0x36, 0xdb, 0xd6, 0x07,
+ 0xc0, 0x88, 0xb4, 0xb6, 0xbf, 0xff, 0x7f, 0x00, 0x0c, 0x24, 0x44, 0xdb,
+ 0xed, 0xff, 0xdf, 0xef, 0x6e, 0xdb, 0x6e, 0xb7, 0x00, 0x80, 0x44, 0x93,
+ 0xed, 0x5b, 0x07, 0x40, 0x91, 0xd2, 0xfa, 0xfc, 0xf6, 0x7f, 0x00, 0x02,
+ 0xb4, 0x35, 0xd9, 0xef, 0xff, 0xff, 0xfb, 0xef, 0xb6, 0xc9, 0xe4, 0x00,
+ 0x10, 0x24, 0xd9, 0x6d, 0xfb, 0x03, 0x00, 0x27, 0xfe, 0xd3, 0xd6, 0xdb,
+ 0x3f, 0x00, 0xa2, 0x94, 0xb4, 0xdb, 0x7c, 0xff, 0xff, 0xbf, 0xd9, 0xad,
+ 0xdb, 0x7d, 0x00, 0x40, 0x32, 0xd9, 0xb6, 0xef, 0x03, 0x60, 0xe4, 0x5a,
+ 0x5f, 0x5f, 0xff, 0x1f, 0x00, 0x02, 0x52, 0x92, 0xec, 0xb6, 0xff, 0xff,
+ 0xef, 0xff, 0x6d, 0xb6, 0x3b, 0x00, 0x28, 0x90, 0xcc, 0xbe, 0xfd, 0x03,
+ 0xa0, 0x88, 0xeb, 0xf9, 0xfd, 0xf5, 0x1f, 0x00, 0x82, 0x53, 0xbb, 0x6d,
+ 0xf7, 0xff, 0xf9, 0xff, 0x6f, 0xdb, 0x6d, 0x1b, 0x00, 0x04, 0xc9, 0x66,
+ 0xdb, 0x57, 0x03, 0xa0, 0x52, 0xaf, 0xa7, 0x97, 0xff, 0x0f, 0x00, 0x51,
+ 0x48, 0xda, 0x66, 0xdb, 0xff, 0xf8, 0xdf, 0xed, 0xbe, 0xed, 0x0e, 0x00,
+ 0x92, 0x64, 0x32, 0xeb, 0xf6, 0x01, 0x20, 0x63, 0xbd, 0xbc, 0xfc, 0xfa,
+ 0x0f, 0x00, 0x09, 0x20, 0x89, 0x3e, 0xff, 0xff, 0xe0, 0x7f, 0xdf, 0x6f,
+ 0xdb, 0x07, 0x00, 0x01, 0x24, 0xbb, 0xed, 0xfe, 0x01, 0xa0, 0xce, 0xf5,
+ 0xf6, 0xdb, 0xdf, 0x07, 0x00, 0x41, 0xad, 0x5f, 0xf2, 0xed, 0xff, 0xc0,
+ 0xff, 0xbf, 0xdd, 0x92, 0x03, 0x00, 0x44, 0xb2, 0xd9, 0x7d, 0xfb, 0x01,
+ 0xe0, 0xaa, 0xdf, 0x9b, 0x7f, 0xfb, 0x07, 0x80, 0x28, 0x21, 0x64, 0xbb,
+ 0x7f, 0x7f, 0x80, 0xff, 0xf6, 0xbb, 0xee, 0x03, 0x80, 0x22, 0x99, 0xed,
+ 0xb6, 0xff, 0x00, 0x90, 0xb8, 0x5e, 0x5b, 0x6b, 0xed, 0x03, 0x00, 0x01,
+ 0xa6, 0x6d, 0xdb, 0xf6, 0x7f, 0x00, 0xff, 0xff, 0xf6, 0xcd, 0x00, 0x40,
+ 0x10, 0xc9, 0x6c, 0xff, 0xf7, 0x00, 0xa0, 0xe3, 0x72, 0xeb, 0xef, 0xff,
+ 0x03, 0x80, 0xe0, 0x90, 0x24, 0xdb, 0xbd, 0x3f, 0x00, 0xfe, 0xdb, 0x6f,
+ 0xfb, 0x00, 0x00, 0x89, 0x4c, 0xb6, 0xd9, 0x7e, 0x00, 0x70, 0xaf, 0xaf,
+ 0x6f, 0xb5, 0xde, 0x03, 0x80, 0x94, 0x92, 0xb6, 0xf9, 0xf6, 0x3f, 0x00,
+ 0xfc, 0xbf, 0xdd, 0x7b, 0x00, 0x10, 0x48, 0x26, 0xb3, 0xdf, 0x7f, 0x00,
+ 0x70, 0xd8, 0xae, 0xfd, 0xff, 0xf7, 0x03, 0x80, 0x00, 0xd2, 0x36, 0xcf,
+ 0xdf, 0x3f, 0x00, 0xb8, 0x6d, 0xdf, 0x16, 0x00, 0x48, 0x44, 0xb2, 0xfb,
+ 0x6c, 0x3f, 0x00, 0x50, 0x75, 0xfd, 0xa5, 0xd5, 0xfe, 0x01, 0x40, 0xd1,
+ 0x12, 0xa2, 0x7d, 0xfb, 0x1f, 0x00, 0xf0, 0xff, 0xbf, 0x0d, 0x00, 0x20,
+ 0x12, 0x9b, 0xcd, 0xf6, 0x3f, 0x00, 0x90, 0xd5, 0xa7, 0xfd, 0x77, 0xab,
+ 0x03, 0x40, 0x1c, 0xc8, 0xbe, 0x6d, 0xfb, 0x1f, 0x00, 0xe0, 0xff, 0xee,
+ 0x07, 0x00, 0x04, 0x91, 0xc9, 0x7e, 0xbf, 0x1f, 0x00, 0x30, 0x57, 0xbf,
+ 0xa6, 0xde, 0xfd, 0x01, 0x40, 0x40, 0x6b, 0xd3, 0x6e, 0xef, 0x0f, 0x00,
+ 0xc0, 0xeb, 0x7d, 0x03, 0x00, 0x90, 0xc8, 0x6c, 0x76, 0xfb, 0x0f, 0x00,
+ 0x70, 0x5c, 0xe5, 0xf7, 0xfa, 0xeb, 0x01, 0x40, 0x50, 0x49, 0x92, 0xf4,
+ 0xfd, 0x0f, 0x00, 0xc0, 0xff, 0xdb, 0x01, 0x80, 0x44, 0x44, 0x66, 0xbb,
+ 0x6f, 0x0f, 0x00, 0xd0, 0xf1, 0x95, 0xf6, 0x6f, 0xad, 0x01, 0x40, 0x08,
+ 0x78, 0xdb, 0xb6, 0xef, 0x0f, 0x00, 0x00, 0xdf, 0xd6, 0x00, 0x00, 0x20,
+ 0x32, 0xb3, 0xdb, 0xfd, 0x0f, 0x00, 0x10, 0xd7, 0xf7, 0xb6, 0xd8, 0xeb,
+ 0x03, 0x20, 0x43, 0x27, 0xd9, 0xb6, 0xfd, 0x0f, 0x00, 0x00, 0xff, 0x7e,
+ 0x00, 0x40, 0x12, 0x93, 0xd9, 0xec, 0xb6, 0x07, 0x00, 0x70, 0x55, 0xdd,
+ 0xf6, 0x6f, 0xbb, 0x01, 0x40, 0x28, 0xa1, 0x6f, 0xb6, 0xb7, 0x0f, 0x00,
+ 0x00, 0xde, 0x1f, 0x00, 0x80, 0x88, 0xd8, 0xcc, 0x66, 0xff, 0x03, 0x00,
+ 0x70, 0xf4, 0xf5, 0xdb, 0xaa, 0xee, 0x01, 0x60, 0x28, 0x2d, 0x49, 0xf7,
+ 0xf6, 0x07, 0x00, 0x00, 0x7c, 0x0f, 0x00, 0x08, 0x48, 0x66, 0x6e, 0xfb,
+ 0xef, 0x03, 0x00, 0xd0, 0xd5, 0xdf, 0x52, 0xff, 0xda, 0x03, 0x20, 0xa3,
+ 0xa5, 0xd9, 0xb2, 0xff, 0x07, 0x00, 0x00, 0xf8, 0x07, 0x00, 0x20, 0x22,
+ 0x33, 0x37, 0xbf, 0xfd, 0x01, 0x00, 0x70, 0x5f, 0xf7, 0xfe, 0xab, 0x6b,
+ 0x02, 0xa0, 0xa8, 0xb4, 0x6d, 0xdf, 0xf6, 0x07, 0x00, 0x00, 0xf8, 0x01,
+ 0x00, 0x12, 0x33, 0x11, 0xd9, 0xdd, 0xff, 0x01, 0x00, 0x70, 0x75, 0xd5,
+ 0x52, 0xea, 0x8a, 0x03, 0x20, 0x84, 0x36, 0x69, 0xba, 0xdb, 0x07, 0x00,
+ 0x00, 0xf0, 0x01, 0x00, 0x81, 0xc8, 0xcc, 0xdd, 0xed, 0xff, 0x00, 0x00,
+ 0x60, 0xd5, 0xdf, 0xf6, 0xae, 0x6b, 0x03, 0x00, 0xa1, 0xa4, 0x6d, 0xdf,
+ 0xfe, 0x07, 0x00, 0x00, 0x60, 0x00, 0x40, 0x44, 0xc6, 0xcc, 0x64, 0xb7,
+ 0xfd, 0x00, 0x00, 0xe0, 0x55, 0xf7, 0xd6, 0xea, 0xba, 0x07, 0x20, 0x94,
+ 0x94, 0x6d, 0xfb, 0xdb, 0x07, 0x00, 0x00, 0x20, 0x00, 0x20, 0x20, 0x32,
+ 0x76, 0x77, 0xff, 0x7f, 0x00, 0x00, 0x60, 0x7d, 0xd5, 0xb6, 0x3f, 0xaf,
+ 0x06, 0xa0, 0xa4, 0x95, 0x6c, 0x9b, 0xee, 0x07, 0x00, 0x00, 0x18, 0x00,
+ 0x10, 0x92, 0x15, 0x73, 0xbb, 0xd9, 0x3f, 0x00, 0x00, 0xe0, 0xf5, 0xff,
+ 0xf7, 0x6a, 0xa9, 0x06, 0x80, 0xa2, 0xb4, 0x6d, 0xfb, 0xfb, 0x07, 0x00,
+ 0x00, 0x04, 0x00, 0x84, 0x88, 0xc8, 0x99, 0xdd, 0xff, 0x3f, 0x00, 0x00,
+ 0xe0, 0x8b, 0xff, 0x96, 0x6a, 0xb6, 0x0a, 0xa0, 0x94, 0x96, 0x64, 0xdb,
+ 0xee, 0x07, 0x00, 0x00, 0x03, 0x08, 0x20, 0x60, 0x66, 0xec, 0xee, 0xb6,
+ 0x1d, 0x00, 0x00, 0xc0, 0x7e, 0xa5, 0xf4, 0xab, 0x55, 0x0d, 0x20, 0xe7,
+ 0xd4, 0x6d, 0xdb, 0xfb, 0x07, 0x00, 0x80, 0x00, 0x00, 0x09, 0x12, 0x33,
+ 0x67, 0x77, 0xff, 0x0f, 0x00, 0x00, 0xc0, 0xfa, 0xff, 0xb7, 0x7a, 0x55,
+ 0x19, 0x90, 0x91, 0xd4, 0x64, 0xdb, 0xee, 0x07, 0x00, 0x40, 0x00, 0x81,
+ 0x04, 0x88, 0x91, 0x3b, 0xbb, 0xfd, 0x0f, 0x00, 0x00, 0xc0, 0xab, 0xbf,
+ 0xed, 0x4e, 0xbb, 0x32, 0x20, 0x94, 0x96, 0x6c, 0xff, 0xfa, 0x03, 0x00,
+ 0x30, 0x40, 0x20, 0x20, 0x64, 0xcc, 0xdc, 0xdd, 0xff, 0x07, 0x00, 0x00,
+ 0xc0, 0xeb, 0xea, 0xfd, 0xd5, 0xaa, 0x2a, 0x20, 0xd7, 0xb0, 0x6d, 0x93,
+ 0xef, 0x07, 0x00, 0x08, 0x00, 0x08, 0x01, 0x23, 0xee, 0xee, 0xee, 0xfb,
+ 0x03, 0x00, 0x00, 0xc0, 0xfe, 0xff, 0x2d, 0xdd, 0x6a, 0x49, 0xd0, 0x90,
+ 0x9a, 0x64, 0xdf, 0xea, 0x07, 0x00, 0x03, 0x80, 0x40, 0x8c, 0x98, 0x33,
+ 0xb3, 0xbb, 0xff, 0x01, 0x00, 0x00, 0xc0, 0xa5, 0x7b, 0x6d, 0xa7, 0x56,
+ 0xc5, 0xa0, 0x94, 0x94, 0x6f, 0xd3, 0xbb, 0x07, 0x80, 0x10, 0x0c, 0x12,
+ 0x40, 0xc6, 0xb9, 0xdb, 0xfb, 0xfd, 0x01, 0x00, 0x00, 0x80, 0x97, 0xee,
+ 0xdf, 0xba, 0x54, 0x1a, 0xa1, 0xe5, 0xd2, 0x64, 0x7e, 0xee, 0x07, 0x60,
+ 0x02, 0x80, 0x00, 0x31, 0x62, 0xcc, 0xdc, 0xee, 0x7f, 0x00, 0x00, 0x00,
+ 0x80, 0xff, 0xff, 0xdb, 0xaa, 0xb5, 0x8a, 0x86, 0x98, 0x96, 0x6d, 0x9b,
+ 0xea, 0x07, 0x98, 0x00, 0x22, 0x44, 0x88, 0x39, 0x77, 0x77, 0xff, 0x7f,
+ 0x00, 0x00, 0x00, 0x80, 0x7d, 0x77, 0xba, 0x7b, 0x2d, 0x55, 0x3c, 0xa6,
+ 0xb4, 0x6c, 0xf6, 0xaf, 0x07, 0x07, 0x90, 0x88, 0x20, 0x42, 0x9c, 0xbb,
+ 0xbb, 0xbb, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x4b, 0xbd, 0xbf, 0x55, 0x53,
+ 0xa5, 0xb2, 0xa1, 0xb4, 0xc9, 0x9f, 0xda, 0xcf, 0x28, 0x24, 0x42, 0x08,
+ 0x31, 0xe6, 0xcc, 0xdd, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xff, 0xef,
+ 0xb7, 0xbd, 0xde, 0x12, 0xd1, 0xac, 0x95, 0x4d, 0xf2, 0x56, 0x9f, 0x88,
+ 0x80, 0x10, 0xc2, 0x9c, 0x73, 0x77, 0xef, 0xfe, 0x7f, 0x00, 0x00, 0x00,
+ 0x00, 0xbf, 0xfb, 0xed, 0xeb, 0x35, 0x95, 0x72, 0xa2, 0x35, 0xcd, 0xb6,
+ 0xd6, 0x2f, 0x21, 0x24, 0x04, 0x31, 0xc6, 0x98, 0x33, 0xf7, 0xff, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0xd6, 0x6a, 0x7f, 0x5b, 0xab, 0x2d, 0x28, 0x23,
+ 0x65, 0xd9, 0xb6, 0x55, 0x5f, 0x88, 0x08, 0x43, 0x0c, 0x61, 0xde, 0xdd,
+ 0xfb, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x76, 0xff, 0x4d, 0xd7, 0x4d,
+ 0x4a, 0xa5, 0x29, 0x2d, 0xdb, 0xbe, 0x55, 0x1f, 0x22, 0x42, 0x28, 0xc2,
+ 0x39, 0xe7, 0xee, 0xee, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x7f,
+ 0xfb, 0xb6, 0xb6, 0x95, 0x70, 0x2e, 0xa5, 0xd9, 0x24, 0x5d, 0x5f, 0x8a,
+ 0x28, 0x88, 0x31, 0x9e, 0x39, 0x73, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0xec, 0xb7, 0xdf, 0x6c, 0xb5, 0x65, 0x26, 0xa3, 0x39, 0x9b, 0xfc,
+ 0x85, 0x5d, 0x21, 0x04, 0x63, 0x1c, 0xe6, 0xdd, 0xbd, 0xfb, 0xff, 0xff,
+ 0x01, 0x00, 0x00, 0x00, 0xb8, 0xfa, 0xb6, 0x6f, 0x4d, 0x9a, 0x28, 0x59,
+ 0x4d, 0xd3, 0x2f, 0xf5, 0x3f, 0x8c, 0xd1, 0x18, 0xc6, 0x31, 0xf6, 0xdd,
+ 0xfe, 0xff, 0xfe, 0x01, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xef, 0xb9, 0xb6,
+ 0x25, 0xe1, 0x4d, 0x69, 0xba, 0x6c, 0xad, 0x3c, 0x41, 0x14, 0x84, 0xe9,
+ 0x9e, 0x37, 0xf7, 0xff, 0xff, 0xfb, 0x03, 0x00, 0x00, 0x00, 0x70, 0x5d,
+ 0x3d, 0x9f, 0x3d, 0x6d, 0x26, 0x52, 0x59, 0xb6, 0x6d, 0xab, 0x7f, 0x14,
+ 0x82, 0xe1, 0x39, 0xe6, 0xdd, 0xfb, 0xff, 0xbf, 0xff, 0x01, 0x00, 0x00,
+ 0x00, 0xf0, 0xf6, 0x6f, 0x77, 0xcd, 0x92, 0xd0, 0x52, 0x4b, 0xb3, 0x49,
+ 0x0b, 0x3a, 0x41, 0x61, 0x38, 0x9e, 0x73, 0xee, 0xdc, 0xff, 0xff, 0xfd,
+ 0x03, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xd7, 0x65, 0xda, 0x66, 0x63, 0x9d,
+ 0xf2, 0x36, 0x7b, 0x6a, 0x7f, 0x14, 0x18, 0x8e, 0xe7, 0xd9, 0x7b, 0xff,
+ 0xff, 0xef, 0xff, 0x03, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xdd, 0xb6,
+ 0xc9, 0x4c, 0x46, 0x9a, 0x64, 0xcb, 0x5b, 0xed, 0x06, 0xc6, 0xe3, 0x71,
+ 0xde, 0xbd, 0xff, 0xff, 0x7f, 0xff, 0x07, 0x00, 0x00, 0x00, 0xc0, 0x7f,
+ 0x7f, 0xff, 0x59, 0x37, 0x75, 0xbb, 0x96, 0x66, 0xdb, 0x56, 0xf7, 0xe0,
+ 0xf2, 0x74, 0x9e, 0x77, 0xef, 0xfd, 0xff, 0xeb, 0xed, 0x03, 0x00, 0x00,
+ 0x00, 0xc0, 0xea, 0xdf, 0xb3, 0xdb, 0xde, 0xc6, 0x81, 0xb0, 0x6c, 0xba,
+ 0xb4, 0xf6, 0x38, 0x18, 0x3c, 0xe7, 0x9c, 0xfb, 0xff, 0x7f, 0xff, 0xff,
+ 0x07, 0x00, 0x00, 0x00, 0x80, 0xff, 0xf7, 0x6e, 0x66, 0xd9, 0x99, 0xac,
+ 0xa4, 0xcd, 0x96, 0xa5, 0xea, 0x03, 0xa7, 0xcf, 0x79, 0xef, 0xfd, 0xff,
+ 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfd, 0xef, 0xdf,
+ 0x6f, 0xef, 0x72, 0x65, 0xd9, 0xb6, 0xad, 0xe8, 0xc1, 0xe1, 0xf1, 0xbe,
+ 0x7b, 0xef, 0xff, 0xdf, 0x7a, 0xfb, 0x07, 0x00, 0x00, 0x00, 0x00, 0xfe,
+ 0x5f, 0xdd, 0x9d, 0xac, 0x99, 0x84, 0x29, 0xcd, 0x3c, 0x4f, 0x9d, 0x7d,
+ 0x3c, 0x9e, 0xe7, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xef, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0xfe, 0xff, 0x77, 0x7b, 0x33, 0xe7, 0x5a, 0x49, 0x9b, 0x65,
+ 0x59, 0x75, 0x07, 0x97, 0xf7, 0xbb, 0xef, 0xff, 0xff, 0xdb, 0xfe, 0xff,
+ 0x07, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xf7, 0x3f, 0xe7, 0xcf, 0x9c, 0x51,
+ 0x4d, 0xb0, 0x6d, 0x4b, 0xc9, 0xd3, 0xf5, 0x79, 0xfe, 0xfb, 0xff, 0xff,
+ 0xdb, 0xda, 0xfe, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xef, 0xde,
+ 0xdd, 0xf3, 0x4d, 0x52, 0x36, 0xcb, 0xd2, 0x3a, 0x7e, 0x3c, 0xde, 0xe7,
+ 0xbe, 0xff, 0x7f, 0xda, 0xff, 0xdf, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf8,
+ 0xff, 0xfb, 0xdd, 0x73, 0x8f, 0xa5, 0x9a, 0xe6, 0xd9, 0xb6, 0xe2, 0x4e,
+ 0xc7, 0xf7, 0xfd, 0xff, 0xff, 0xff, 0xf7, 0xf6, 0xff, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0xe0, 0xff, 0xff, 0x7f, 0xee, 0x79, 0xb2, 0xb2, 0x2c, 0x9f,
+ 0xb6, 0x54, 0xfe, 0xfb, 0x79, 0xbf, 0xff, 0xff, 0x5f, 0xda, 0xff, 0xfa,
+ 0x0f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xf7, 0xbf, 0xe7, 0x4b,
+ 0xb4, 0x69, 0xd3, 0x2c, 0x25, 0xbd, 0xbc, 0xcf, 0xf7, 0xfd, 0xff, 0xd7,
+ 0xf6, 0xfe, 0xdf, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xbf, 0x9d,
+ 0xf1, 0x3e, 0x57, 0x25, 0xcb, 0xb6, 0x6d, 0xa9, 0xb5, 0xef, 0xfb, 0xff,
+ 0xff, 0xff, 0xd5, 0xda, 0xd6, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x80,
+ 0xff, 0xff, 0xfb, 0xcf, 0xf5, 0x25, 0x65, 0xd9, 0x66, 0x5b, 0x4a, 0xfa,
+ 0xf9, 0x7e, 0xff, 0xff, 0xff, 0xf6, 0xd6, 0xdf, 0xfa, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xfe, 0xff, 0xef, 0x3e, 0xf7, 0x9f, 0x5b, 0x92, 0x6c,
+ 0xdb, 0x52, 0xe5, 0xbe, 0xdf, 0xff, 0xff, 0xbf, 0x51, 0xda, 0xfa, 0x7f,
+ 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x7b, 0x9f, 0xe7,
+ 0x4c, 0xb3, 0x4d, 0xd3, 0x54, 0xd9, 0xe7, 0xfb, 0xff, 0xff, 0x5f, 0xdc,
+ 0xfa, 0xdf, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x7f,
+ 0xe7, 0xf9, 0x3a, 0xd3, 0xa6, 0xe9, 0xb6, 0xa5, 0xca, 0xf9, 0xfd, 0xff,
+ 0xff, 0x83, 0x42, 0xd2, 0xff, 0xfb, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0xff, 0xfd, 0xbf, 0xef, 0x4f, 0xd5, 0x64, 0xdb, 0x26, 0x4d, 0x30,
+ 0x7f, 0xff, 0xff, 0xff, 0x91, 0xda, 0xdb, 0xda, 0xdf, 0x1f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xe0, 0xff, 0xbf, 0xff, 0x7d, 0xbe, 0xb5, 0x6d, 0x97,
+ 0x6d, 0x93, 0x56, 0xdf, 0xff, 0xff, 0x7f, 0x81, 0x4a, 0xda, 0x7f, 0xff,
+ 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xef, 0xeb, 0xbb,
+ 0xa6, 0x4d, 0x73, 0xcd, 0x92, 0xaa, 0xfe, 0xff, 0xff, 0x1f, 0x01, 0x6a,
+ 0x5b, 0xfb, 0xfb, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
+ 0xfd, 0xbf, 0x5f, 0x3b, 0xdb, 0x36, 0xbb, 0x26, 0x4c, 0xf9, 0xff, 0xff,
+ 0x0f, 0xa3, 0x2a, 0xe9, 0x7f, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xee, 0xff, 0xff, 0xfe, 0xfe, 0xcc, 0x91, 0xec, 0x93, 0x6d, 0x93,
+ 0xf2, 0xff, 0xff, 0x03, 0x00, 0x6a, 0x6d, 0x6f, 0xff, 0x1f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xf7, 0x6f, 0x76, 0xb6, 0xcd,
+ 0x76, 0xc9, 0x2a, 0xe9, 0xff, 0xff, 0x00, 0x02, 0x24, 0xed, 0xf9, 0xed,
+ 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xdf, 0xff,
+ 0xd9, 0x66, 0x9b, 0x6c, 0x93, 0x54, 0xc5, 0xff, 0x3f, 0x00, 0x01, 0x95,
+ 0xb5, 0xaf, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff,
+ 0xff, 0xff, 0xfd, 0xae, 0x7d, 0xde, 0x6d, 0xf6, 0xa1, 0x8a, 0xff, 0x0f,
+ 0x00, 0x81, 0x90, 0xb4, 0xfd, 0xfd, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xcd, 0xb2, 0xdb, 0x2c, 0xcb,
+ 0x54, 0xfe, 0x01, 0x00, 0x01, 0xd2, 0xb6, 0xb7, 0xff, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0x39, 0xdb, 0x76,
+ 0xb3, 0x4b, 0xb6, 0x0a, 0xfe, 0x00, 0x00, 0x01, 0x48, 0xda, 0xfe, 0xff,
+ 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff,
+ 0xcf, 0xb9, 0x6d, 0xb6, 0xd9, 0xa5, 0x75, 0x1c, 0x00, 0x80, 0x80, 0x20,
+ 0xdb, 0xda, 0xbe, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0,
+ 0xff, 0xff, 0xff, 0x77, 0x96, 0xd9, 0x26, 0xb3, 0x4d, 0x82, 0x11, 0x00,
+ 0x80, 0x80, 0x24, 0x6d, 0xff, 0xf7, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xbb, 0x67, 0xdb, 0xdd, 0x36, 0xd9,
+ 0x54, 0x60, 0x00, 0xc0, 0x00, 0x92, 0x65, 0x6b, 0xff, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x4f, 0x7d, 0x96,
+ 0xd9, 0x6c, 0x36, 0xad, 0xc2, 0x00, 0x60, 0x00, 0xc8, 0xb6, 0x6d, 0xff,
+ 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff,
+ 0xff, 0xc8, 0x76, 0xbb, 0xcb, 0x64, 0x52, 0x02, 0x03, 0x10, 0x00, 0x64,
+ 0xda, 0xff, 0xfb, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0xff, 0xff, 0x5f, 0xd7, 0x4d, 0x33, 0x99, 0xdd, 0x96, 0x04, 0x2c,
+ 0x1c, 0x40, 0x22, 0xdb, 0xb6, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xdf, 0xb5, 0xed, 0xe6, 0x36, 0x9b,
+ 0x6c, 0x29, 0xf0, 0x03, 0x00, 0x99, 0x6c, 0xfb, 0xfd, 0x07, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x7f, 0x35, 0xbb,
+ 0xec, 0x76, 0x33, 0x91, 0x02, 0x00, 0x00, 0x00, 0x64, 0x67, 0xdf, 0xff,
+ 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc,
+ 0xbf, 0x6f, 0x9b, 0x9d, 0xc9, 0xce, 0x36, 0x49, 0x00, 0x00, 0x00, 0x93,
+ 0xb1, 0xdd, 0xfe, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x40, 0xff, 0x6a, 0x76, 0xbb, 0xdd, 0xd9, 0x64, 0x12, 0x01,
+ 0x00, 0x40, 0x98, 0xdd, 0x6d, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xdf, 0x66, 0x73, 0x33, 0xbb,
+ 0x9d, 0x4d, 0x00, 0x00, 0x00, 0x63, 0xe6, 0xf6, 0xff, 0x07, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xed, 0xfd,
+ 0xee, 0xee, 0x36, 0x73, 0x2b, 0x04, 0x00, 0xa0, 0x38, 0x75, 0xbf, 0xff,
+ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x7f, 0xd9, 0xec, 0xce, 0x66, 0x66, 0x66, 0x22, 0x04, 0x00, 0xc6,
+ 0x99, 0xbb, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x5e, 0xb3, 0xdb, 0xb9, 0xcd, 0xc9, 0x88, 0x89,
+ 0x00, 0x68, 0x31, 0xee, 0xdd, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0xbe, 0xbb, 0x9b, 0x3f,
+ 0xbb, 0x33, 0x23, 0x04, 0x00, 0x8c, 0xf3, 0xee, 0xff, 0x03, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbc, 0x67,
+ 0x76, 0x77, 0xb2, 0x66, 0xce, 0x0c, 0xd1, 0xd6, 0xe3, 0x79, 0xf7, 0xff,
+ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xf8, 0xfd, 0xef, 0xe6, 0xee, 0xce, 0x9c, 0x31, 0x16, 0x00, 0x3c,
+ 0x9e, 0xfb, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x78, 0x9f, 0xdb, 0xdc, 0x9d, 0x99, 0x33, 0xc6,
+ 0xc1, 0xff, 0x8f, 0xe7, 0xbb, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf7, 0xbd, 0xbb, 0x33,
+ 0x7b, 0xee, 0x18, 0x1e, 0x50, 0xf0, 0xf9, 0xfe, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x7b,
+ 0xf7, 0x77, 0xf7, 0xe6, 0x9c, 0xe3, 0xf0, 0x4d, 0xff, 0x7c, 0xef, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xc0, 0xdf, 0x76, 0x7f, 0xcf, 0x9e, 0x73, 0x8f, 0x07, 0xff, 0x0b,
+ 0xdf, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0xee, 0xcd, 0xdd, 0x9d, 0x7b, 0xf7, 0x7c,
+ 0x7a, 0x00, 0xf0, 0xe7, 0xfd, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7f, 0xbf, 0xdd, 0x7b,
+ 0x6b, 0x9e, 0xf3, 0xe1, 0xff, 0xff, 0x7d, 0xff, 0x7f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xee,
+ 0xb7, 0xbb, 0x7b, 0xee, 0x79, 0x8f, 0x0f, 0xfa, 0x2f, 0xff, 0xf7, 0x3f,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x7e, 0xff, 0x77, 0xef, 0xdd, 0x77, 0x7c, 0xfe, 0x02, 0xe8,
+ 0xcf, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xef, 0xee, 0xdd, 0xb3, 0xcf, 0xf3,
+ 0xf1, 0xff, 0xff, 0xf9, 0xfe, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xfb, 0xff, 0xbf,
+ 0xef, 0xbe, 0xcf, 0x8f, 0xfe, 0x5f, 0xfe, 0xff, 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0,
+ 0xbf, 0xbb, 0xf7, 0xde, 0x79, 0x3e, 0xff, 0x52, 0xd2, 0xdf, 0xff, 0x0f,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xe0, 0xef, 0xef, 0xef, 0x3c, 0xef, 0xf9, 0xf8, 0xff, 0xff,
+ 0xf7, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xee, 0xdc, 0xf7, 0xfe, 0xe7,
+ 0x97, 0xfe, 0xff, 0xfe, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xbf,
+ 0xef, 0xbf, 0x3e, 0xff, 0xda, 0xf6, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xfe, 0xbf, 0xf7, 0xfe, 0xf7, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xfe, 0xff, 0xde, 0xbd, 0xef, 0xfb, 0xd7, 0xff, 0xbf,
+ 0xfd, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xf7, 0x7d, 0xbf,
+ 0xff, 0xd2, 0xf6, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xbf,
+ 0xef, 0xfb, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xc0, 0xff, 0xef, 0xbe, 0xf7, 0xef, 0xef, 0xff, 0xff, 0xff, 0x3f, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfb, 0xdf, 0xbf, 0xff, 0xff, 0xff,
+ 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x7f, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff,
+ 0xfe, 0xff, 0xfb, 0xf7, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xf0, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xfd, 0xff, 0xff, 0x03, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xfc, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x07,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff,
+ 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ };
diff --git a/test/extended_color.c b/test/extended_color.c
new file mode 100644
index 0000000..746c035
--- /dev/null
+++ b/test/extended_color.c
@@ -0,0 +1,260 @@
+/****************************************************************************
+ * Copyright 2018-2020,2022 Thomas E. Dickey                                *
+ * Copyright 2017 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: extended_color.c,v 1.20 2022/12/10 22:28:50 tom Exp $
+ */
+
+#include <test.priv.h>
+
+#if USE_EXTENDED_COLOR
+
+#define SHOW(n) ((n) == ERR ? "ERR" : "OK")
+
+#if USE_SP_FUNCS
+static bool opt_s = FALSE;
+#define if_opt_s(a,b) (opt_s ? (a) : (b))
+#else
+#define if_opt_s(a,b) (b)
+#endif
+
+static void
+failed(const char *name)
+{
+    printw("...%s failed", name);
+    getch();
+    endwin();
+    ExitProgram(EXIT_FAILURE);
+}
+
+static void
+do_pair_content(SCREEN *sp, int pair)
+{
+    int i, f, b;
+
+    (void) sp;
+    i = if_opt_s(extended_pair_content_sp(sp, pair, &f, &b),
+		 extended_pair_content(0, &f, &b));
+    if (i != OK)
+	failed("pair_content");
+    printw("pair %d contains (%d,%d)\n", pair, f, b);
+    getch();
+}
+
+static void
+do_init_pair(SCREEN *sp, int pair, int fg, int bg)
+{
+    int i;
+
+    (void) sp;
+    i = if_opt_s(init_extended_pair_sp(sp, pair, fg, bg),
+		 init_extended_pair(pair, fg, bg));
+    if (i != OK)
+	failed("init_pair");
+}
+
+static void
+do_init_color(SCREEN *sp, int color, int adjust)
+{
+    int r, g, b;
+    int i;
+
+    (void) sp;
+    i = if_opt_s(extended_color_content_sp(sp, color, &r, &g, &b),
+		 extended_color_content(color, &r, &g, &b));
+    if (i != OK)
+	failed("color_content");
+
+    r = (adjust + 1000 + r) % 1000;
+    g = (adjust + 1000 + g) % 1000;
+    b = (adjust + 1000 + b) % 1000;
+
+    i = if_opt_s(init_extended_color_sp(sp, color, r, g, b),
+		 init_extended_color(color, r, g, b));
+    if (i != OK)
+	failed("init_color");
+}
+
+static void
+do_color_set(const char *expected, int pair)
+{
+    int i = color_set((short) pair, (void *) &pair);
+    printw("%s (%s)\n", expected, SHOW(i));
+    if (i != OK)
+	failed("color_set");
+    getch();
+}
+
+static void
+show_1_rgb(SCREEN *sp, const char *name, int color, int y, int x)
+{
+    int r, g, b;
+    int i;
+
+    (void) sp;
+    i = if_opt_s(extended_color_content_sp(sp, color, &r, &g, &b),
+		 extended_color_content(color, &r, &g, &b));
+    wmove(stdscr, y, x);
+    if (i == OK) {
+	printw("%-8s %3d/%3d/%3d", name, r, g, b);
+    } else {
+	printw("%-8s %s", name, SHOW(i));
+    }
+}
+
+static void
+show_rgb(SCREEN *sp)
+{
+    int y, x;
+    getyx(stdscr, y, x);
+    show_1_rgb(sp, "RED", COLOR_RED, y + 1, x);
+    show_1_rgb(sp, "GREEN", COLOR_GREEN, y + 2, x);
+    show_1_rgb(sp, "BLUE", COLOR_BLUE, y + 3, x);
+    wmove(stdscr, y, x);
+}
+
+static void
+usage(int ok)
+{
+    static const char *tbl[] =
+    {
+	"Usage: extended_color"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+	," -s       use sp-funcs"
+    };
+    size_t n;
+    for (n = 0; n < SIZEOF(tbl); ++n) {
+	fprintf(stderr, "%s\n", tbl[n]);
+    }
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+    int i;
+    SCREEN *sp;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "s")) != -1) {
+	switch (ch) {
+#if USE_SP_FUNCS
+	case 's':
+	    opt_s = TRUE;
+	    break;
+#endif
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+
+    setlocale(LC_ALL, "");
+    slk_init(1);
+    sp = newterm(NULL, stdout, stdin);
+    cbreak();
+    noecho();
+
+    if (!has_colors()) {
+	endwin();
+	fprintf(stderr, "This demo requires a color terminal\n");
+	ExitProgram(EXIT_FAILURE);
+    }
+
+    start_color();
+
+    do_pair_content(sp, 0);
+
+    printw("Initializing pair 1 to red/black\n");
+    do_init_pair(sp, 1, COLOR_RED, COLOR_BLACK);
+    do_color_set("RED/BLACK", 1);
+
+    printw("Initializing pair 2 to white/blue\n");
+    do_init_pair(sp, 2, COLOR_WHITE, COLOR_BLUE);
+    do_color_set("WHITE/BLUE", 2);
+
+    printw("Initializing pair 3 to green/black\n");
+    do_init_pair(sp, 3, COLOR_GREEN, COLOR_BLACK);
+    do_color_set("GREEN/BLACK", 3);
+
+    printw("Resetting colors to pair 0\n");
+    do_color_set("Default Colors", 0);
+
+    printw("Resetting colors to pair 1\n");
+    do_color_set("RED/BLACK", 1);
+
+    printw("Drawing soft-key tabs with pair 2\n");
+    slk_attrset(A_BOLD);	/* reverse-video is hard to see */
+    (void) if_opt_s(extended_slk_color_sp(sp, 2),
+		    extended_slk_color(2));
+    for (i = 1; i <= 8; ++i) {
+	char temp[80];
+	_nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) "(SLK-%d)", i);
+	slk_set(i, temp, 0);
+    }
+    slk_touch();
+    slk_noutrefresh();
+
+    i = if_opt_s(can_change_color_sp(sp),
+		 can_change_color());
+    if (i) {
+	do_color_set("Default Colors", 0);
+	printw("Press any key to stop...\n");
+	nodelay(stdscr, TRUE);
+	while (getch() == ERR) {
+	    show_rgb(sp);
+	    do_init_color(sp, COLOR_RED, 1);
+	    do_init_color(sp, COLOR_BLUE, -1);
+	    napms(50);
+	}
+	printw("...done");
+	nodelay(stdscr, FALSE);
+	getch();
+    }
+
+    endwin();
+
+    ExitProgram(EXIT_SUCCESS);
+}
+
+#else
+int
+main(void)
+{
+    printf("This program requires the ncurses extended color/pair functions\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif
diff --git a/test/filter.c b/test/filter.c
new file mode 100644
index 0000000..b744456
--- /dev/null
+++ b/test/filter.c
@@ -0,0 +1,435 @@
+/****************************************************************************
+ * Copyright 2019-2020,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/*
+ * Author:  Thomas E. Dickey 1998
+ *
+ * $Id: filter.c,v 1.38 2022/12/04 00:40:11 tom Exp $
+ *
+ * An example of the 'filter()' function in ncurses, this program prompts
+ * for commands and executes them (like a command shell).  It illustrates
+ * how ncurses can be used to implement programs that are not full-screen.
+ *
+ * Ncurses differs slightly from SVr4 curses.  The latter does not flush its
+ * state when exiting program mode, so the attributes on the command lines of
+ * this program 'bleed' onto the executed commands.  Rather than use the
+ * reset_shell_mode() and reset_prog_mode() functions, we could invoke endwin()
+ * and refresh(), but that does not work any better.
+ */
+#define NEED_KEY_EVENT
+#include <test.priv.h>
+
+#if HAVE_FILTER
+
+#include <time.h>
+
+static int
+show_prompt(int underline, bool clocked)
+{
+    int limit = COLS;
+
+    move(0, 0);
+    attrset(A_NORMAL);
+    clrtoeol();
+    attrset(A_BOLD);
+    addstr("Command: ");
+
+    limit -= getcurx(stdscr);
+
+    if (clocked) {
+	if (limit >= 3) {
+	    time_t now = time((time_t *) 0);
+	    struct tm *my = localtime(&now);
+	    char buffer[80];
+	    int skip, y, x;
+	    int margin;
+
+	    _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer)) "%02d:%02d:%02d",
+			my->tm_hour,
+			my->tm_min,
+			my->tm_sec);
+
+	    if (limit > 9) {
+		skip = 0;
+	    } else if (limit > 6) {
+		skip = 3;
+	    } else {
+		skip = 6;
+	    }
+	    /*
+	     * Write the clock message on the right-margin so we can show the
+	     * results of resizing the screen.
+	     */
+	    getyx(stdscr, y, x);
+	    margin = (int) strlen(buffer) - skip;
+	    limit -= margin;
+	    move(0, COLS - margin);
+	    addstr(buffer);
+	    move(y, x);
+	}
+    }
+    attron(underline);
+    return limit;
+}
+
+static int
+new_command(char *buffer, int length, int underline, bool clocked, bool polled)
+{
+    int code = OK;
+
+    if (polled) {
+	bool done = FALSE;
+	bool first = TRUE;
+	int y = 0, x = 0;
+	int n;
+	int mark = 0;
+	int used = 0;
+	const int gap = 2;
+
+	timeout(20);		/* no one types 50CPS... */
+	while (!done) {
+	    int limit;
+	    int ch = getch();
+
+	    buffer[used] = '\0';
+
+	    limit = show_prompt(underline, clocked);
+	    if (first) {
+		getyx(stdscr, y, x);
+		first = FALSE;
+	    } else {
+		int left = 0;
+
+		/*
+		 * if the screen is too narrow to show the whole buffer,
+		 * shift the editing point left/right as needed.
+		 */
+		move(y, x);
+		if ((used + gap) > limit) {
+		    while ((mark - left + gap) > limit) {
+			left += limit / 2;
+		    }
+		}
+		printw("%.*s", limit, buffer + left);
+		move(y, x + mark - left);
+	    }
+
+	    switch (ch) {
+	    case ERR:
+		continue;
+	    case '\004':
+		code = ERR;
+		done = TRUE;
+		break;
+	    case KEY_ENTER:
+	    case '\n':
+		done = TRUE;
+		break;
+	    case KEY_BACKSPACE:
+	    case '\b':
+		if (used) {
+		    if (mark < used) {
+			/* getnstr does not do this */
+			if (mark > 0) {
+			    --mark;
+			    for (n = mark; n < used; ++n) {
+				buffer[n] = buffer[n + 1];
+			    }
+			} else {
+			    flash();
+			}
+		    } else {
+			/* getnstr does this */
+			mark = --used;
+			buffer[used] = '\0';
+		    }
+		} else {
+		    flash();
+		}
+		break;
+		/*
+		 * Unlike getnstr, this function can move the cursor into the
+		 * middle of the buffer and insert/delete at that point.
+		 */
+	    case KEY_HOME:
+		mark = 0;
+		break;
+	    case KEY_END:
+		mark = used;
+		break;
+	    case KEY_LEFT:
+		if (mark > 0) {
+		    mark--;
+		} else {
+		    flash();
+		}
+		break;
+	    case KEY_RIGHT:
+		if (mark < used) {
+		    mark++;
+		} else {
+		    flash();
+		}
+		break;
+#ifdef KEY_EVENT
+	    case KEY_EVENT:
+		continue;
+#endif
+#ifdef KEY_RESIZE
+	    case KEY_RESIZE:
+		/*
+		 * Unlike getnstr, this function "knows" what the whole screen
+		 * is supposed to look like, and can handle resize events.
+		 */
+		continue;
+#endif
+	    case '\t':
+		ch = ' ';
+		/* FALLTHRU */
+	    default:
+		if (ch >= KEY_MIN) {
+		    flash();
+		    continue;
+		}
+		if (mark < used) {
+		    /* getnstr does not do this... */
+		    for (n = used + 1; n > mark; --n) {
+			buffer[n] = buffer[n - 1];
+		    }
+		    buffer[mark] = (char) ch;
+		    used++;
+		    mark++;
+		} else {
+		    /* getnstr does this part */
+		    buffer[used] = (char) ch;
+		    mark = ++used;
+		}
+		break;
+	    }
+	}
+    } else {
+	show_prompt(underline, clocked);
+
+	code = getnstr(buffer, length);
+	/*
+	 * If this returns anything except ERR/OK, it would be one of ncurses's
+	 * extensions.  Fill the buffer with something harmless that the shell
+	 * will execute as a comment.
+	 */
+#ifdef KEY_EVENT
+	if (code == KEY_EVENT)
+	    _nc_STRCPY(buffer, "# event!", length);
+#endif
+#ifdef KEY_RESIZE
+	if (code == KEY_RESIZE) {
+	    _nc_STRCPY(buffer, "# resize!", length);
+	    getch();
+	}
+#endif
+    }
+    attroff(underline);
+    attroff(A_BOLD);
+    refresh();
+
+    return code;
+}
+
+#ifdef NCURSES_VERSION
+/*
+ * Cancel xterm's alternate-screen mode (from dialog -TD)
+ */
+#define isprivate(s) ((s) != 0 && strstr(s, "\033[?") != 0)
+static void
+cancel_altscreen(void)
+{
+    if (isatty(fileno(stdout))
+	&& key_mouse != 0	/* xterm and kindred */
+	&& isprivate(enter_ca_mode)
+	&& isprivate(exit_ca_mode)) {
+	/*
+	 * initscr() or newterm() already wrote enter_ca_mode as a side effect
+	 * of initializing the screen.  It would be nice to not even do that,
+	 * but we do not really have access to the correct copy of the
+	 * terminfo description until those functions have been invoked.
+	 */
+	(void) refresh();
+	(void) putp(exit_ca_mode);
+	(void) fflush(stdout);
+	/*
+	 * Prevent ncurses from switching "back" to the normal screen when
+	 * exiting from this program.  That would move the cursor to the
+	 * original location saved in xterm.  Normally curses sets the cursor
+	 * position to the first line after the display, but the alternate
+	 * screen switching is done after that point.
+	 *
+	 * Cancelling the strings altogether also works around the buggy
+	 * implementation of alternate-screen in rxvt, etc., which clear more
+	 * of the display than they should.
+	 */
+	enter_ca_mode = 0;
+	exit_ca_mode = 0;
+    }
+}
+#endif
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: filter [options]"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+#ifdef NCURSES_VERSION
+	," -a       suppress xterm alternate-screen by amending smcup/rmcup"
+#endif
+	," -c       show current time on prompt line with \"Command\""
+#if HAVE_USE_DEFAULT_COLORS
+	," -d       invoke use_default_colors"
+#endif
+	," -i       use initscr() rather than newterm()"
+	," -p       poll for individual characters rather than using getnstr"
+    };
+    unsigned n;
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+    char buffer[80];
+    int underline;
+#ifdef NCURSES_VERSION
+    bool a_option = FALSE;
+#endif
+    bool c_option = FALSE;
+#if HAVE_USE_DEFAULT_COLORS
+    bool d_option = FALSE;
+#endif
+    bool i_option = FALSE;
+    bool p_option = FALSE;
+
+    setlocale(LC_ALL, "");
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "adcip")) != -1) {
+	switch (ch) {
+#ifdef NCURSES_VERSION
+	case 'a':
+	    a_option = TRUE;
+	    break;
+#endif
+	case 'c':
+	    c_option = TRUE;
+	    break;
+#if HAVE_USE_DEFAULT_COLORS
+	case 'd':
+	    d_option = TRUE;
+	    break;
+#endif
+	case 'i':
+	    i_option = TRUE;
+	    break;
+	case 'p':
+	    p_option = TRUE;
+	    break;
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+
+    printf("starting filter program using %s...\n",
+	   i_option ? "initscr" : "newterm");
+    filter();
+    if (i_option) {
+	initscr();
+    } else {
+	if (newterm((char *) 0, stdout, stdin) == 0) {
+	    fprintf(stderr, "cannot initialize terminal\n");
+	    ExitProgram(EXIT_FAILURE);
+	}
+    }
+#ifdef NCURSES_VERSION
+    if (a_option) {
+	cancel_altscreen();
+    }
+#endif
+    cbreak();
+    keypad(stdscr, TRUE);
+
+    if (has_colors()) {
+	int background = COLOR_BLACK;
+	start_color();
+#if HAVE_USE_DEFAULT_COLORS
+	if (d_option && (use_default_colors() != ERR))
+	    background = -1;
+#endif
+	init_pair(1, COLOR_CYAN, (short) background);
+	underline = COLOR_PAIR(1);
+    } else {
+	underline = A_UNDERLINE;
+    }
+
+    for (;;) {
+	int code = new_command(buffer, sizeof(buffer) - 1,
+			       underline, c_option, p_option);
+	if (code == ERR || *buffer == '\0')
+	    break;
+	reset_shell_mode();
+	printf("\n");
+	fflush(stdout);
+	IGNORE_RC(system(buffer));
+	reset_prog_mode();
+	touchwin(stdscr);
+	erase();
+	refresh();
+    }
+    clear();
+    refresh();
+    endwin();
+    ExitProgram(EXIT_SUCCESS);
+}
+#else
+int
+main(void)
+{
+    printf("This program requires the filter function\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif /* HAVE_FILTER */
diff --git a/test/firework.c b/test/firework.c
new file mode 100644
index 0000000..54e4036
--- /dev/null
+++ b/test/firework.c
@@ -0,0 +1,241 @@
+/****************************************************************************
+ * Copyright 2019-2020,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2014,2017 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: firework.c,v 1.40 2022/12/04 00:40:11 tom Exp $
+ */
+#include <test.priv.h>
+
+#include <time.h>
+
+static short my_bg = COLOR_BLACK;
+
+static void
+cleanup(void)
+{
+    stop_curses();
+}
+
+static void
+onsig(int n GCC_UNUSED)
+{
+    cleanup();
+    ExitProgram(EXIT_FAILURE);
+}
+
+static void
+showit(void)
+{
+    int ch;
+    napms(120);
+    if ((ch = getch()) != ERR) {
+#ifdef KEY_RESIZE
+	if (ch == KEY_RESIZE) {
+	    erase();
+	} else
+#endif
+	if (ch == 'q') {
+	    cleanup();
+	    ExitProgram(EXIT_SUCCESS);
+	} else if (ch == 's') {
+	    nodelay(stdscr, FALSE);
+	} else if (ch == ' ') {
+	    nodelay(stdscr, TRUE);
+	}
+    }
+}
+
+static short
+get_colour(chtype *bold)
+{
+    int attr;
+    attr = (rand() % 16) + 1;
+
+    *bold = A_NORMAL;
+    if (attr > 8) {
+	*bold = A_BOLD;
+	attr &= 7;
+    }
+    return (short) (attr);
+}
+
+static
+void
+explode(int row, int col)
+{
+    chtype bold;
+    erase();
+    MvPrintw(row, col, "-");
+    showit();
+
+    init_pair(1, get_colour(&bold), my_bg);
+    (void) attrset(AttrArg(COLOR_PAIR(1), bold));
+    MvPrintw(row - 1, col - 1, " - ");
+    MvPrintw(row + 0, col - 1, "-+-");
+    MvPrintw(row + 1, col - 1, " - ");
+    showit();
+
+    init_pair(1, get_colour(&bold), my_bg);
+    (void) attrset(AttrArg(COLOR_PAIR(1), bold));
+    MvPrintw(row - 2, col - 2, " --- ");
+    MvPrintw(row - 1, col - 2, "-+++-");
+    MvPrintw(row + 0, col - 2, "-+#+-");
+    MvPrintw(row + 1, col - 2, "-+++-");
+    MvPrintw(row + 2, col - 2, " --- ");
+    showit();
+
+    init_pair(1, get_colour(&bold), my_bg);
+    (void) attrset(AttrArg(COLOR_PAIR(1), bold));
+    MvPrintw(row - 2, col - 2, " +++ ");
+    MvPrintw(row - 1, col - 2, "++#++");
+    MvPrintw(row + 0, col - 2, "+# #+");
+    MvPrintw(row + 1, col - 2, "++#++");
+    MvPrintw(row + 2, col - 2, " +++ ");
+    showit();
+
+    init_pair(1, get_colour(&bold), my_bg);
+    (void) attrset(AttrArg(COLOR_PAIR(1), bold));
+    MvPrintw(row - 2, col - 2, "  #  ");
+    MvPrintw(row - 1, col - 2, "## ##");
+    MvPrintw(row + 0, col - 2, "#   #");
+    MvPrintw(row + 1, col - 2, "## ##");
+    MvPrintw(row + 2, col - 2, "  #  ");
+    showit();
+
+    init_pair(1, get_colour(&bold), my_bg);
+    (void) attrset(AttrArg(COLOR_PAIR(1), bold));
+    MvPrintw(row - 2, col - 2, " # # ");
+    MvPrintw(row - 1, col - 2, "#   #");
+    MvPrintw(row + 0, col - 2, "     ");
+    MvPrintw(row + 1, col - 2, "#   #");
+    MvPrintw(row + 2, col - 2, " # # ");
+    showit();
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: firework [options]"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+#if HAVE_USE_DEFAULT_COLORS
+	," -d       invoke use_default_colors, repeat to use in init_pair"
+#endif
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+    int start, end;
+    int row, diff;
+    int flag = 0;
+    int direction;
+    unsigned seed;
+#if HAVE_USE_DEFAULT_COLORS
+    bool d_option = FALSE;
+#endif
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "d")) != -1) {
+	switch (ch) {
+#if HAVE_USE_DEFAULT_COLORS
+	case 'd':
+	    d_option = TRUE;
+	    break;
+#endif
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind < argc)
+	usage(FALSE);
+
+    InitAndCatch(initscr(), onsig);
+    noecho();
+    cbreak();
+    keypad(stdscr, TRUE);
+    nodelay(stdscr, TRUE);
+
+    if (has_colors()) {
+	start_color();
+#if HAVE_USE_DEFAULT_COLORS
+	if (d_option && (use_default_colors() == OK))
+	    my_bg = -1;
+#endif
+    }
+    curs_set(0);
+
+    seed = (unsigned) time((time_t *) 0);
+    srand(seed);
+    for (;;) {
+	do {
+	    start = rand() % (COLS - 3);
+	    end = rand() % (COLS - 3);
+	    start = (start < 2) ? 2 : start;
+	    end = (end < 2) ? 2 : end;
+	    direction = (start > end) ? -1 : 1;
+	    diff = abs(start - end);
+	} while (diff < 2 || diff >= LINES - 2);
+	(void) attrset(AttrArg(0, A_NORMAL));
+	for (row = 1; row < diff; row++) {
+	    MvPrintw(LINES - row, start + (row * direction),
+		     (direction < 0) ? "\\" : "/");
+	    if (flag++) {
+		showit();
+		erase();
+		flag = 0;
+	    }
+	}
+	if (flag++) {
+	    showit();
+	    flag = 0;
+	}
+	seed = (unsigned) time((time_t *) 0);
+	srand(seed);
+	explode(LINES - row, start + (diff * direction));
+	erase();
+	showit();
+    }
+}
diff --git a/test/firstlast.c b/test/firstlast.c
new file mode 100644
index 0000000..c66c2b8
--- /dev/null
+++ b/test/firstlast.c
@@ -0,0 +1,173 @@
+/****************************************************************************
+ * Copyright 2020,2022 Thomas E. Dickey                                     *
+ * Copyright 1998-2010,2017 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.                                                           *
+ ****************************************************************************/
+/*
+ * This test was written by Alexander V. Lukyanov to demonstrate difference
+ * between ncurses 4.1 and SVR4 curses
+ *
+ * $Id: firstlast.c,v 1.10 2022/12/10 23:31:31 tom Exp $
+ */
+
+#include <test.priv.h>
+
+static void
+fill(WINDOW *w, const char *str)
+{
+    const char *s;
+    int x0 = -1, y0 = -1;
+    int x1, y1;
+    int maxx, maxy, limit;
+
+    getmaxyx(w, maxy, maxx);
+    wmove(w, 0, 0);
+    limit = maxy * maxx;
+
+    for (;;) {
+	for (s = str; *s; s++) {
+	    getyx(w, y1, x1);
+	    if (waddch(w, UChar(*s)) == ERR
+		|| (x1 == x0 && y1 == y0)) {
+		wmove(w, 0, 0);
+		return;
+	    }
+	    /* waddch() should return ERR at the lower-right corner */
+	    if (--limit < 0) {
+		beep();
+		if (*str == '?')
+		    return;
+		napms(500);
+		wmove(w, maxy - 1, 0);
+		str = "?";
+		limit = maxx + 1;
+	    }
+	    x0 = x1;
+	    y0 = y1;
+	}
+    }
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: firstlast [options]"
+	,""
+	,USAGE_COMMON
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    WINDOW *large, *small;
+    int ch;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) {
+	switch (ch) {
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind < argc)
+	usage(FALSE);
+
+    initscr();
+    noecho();
+
+    large = newwin(20, 60, 2, 10);
+    small = newwin(10, 30, 7, 25);
+
+    /* test 1 - addch */
+    fill(large, "LargeWindow");
+
+    refresh();
+    wrefresh(large);
+    wrefresh(small);
+
+    MvWAddStr(small, 5, 5, "   Test <place to change> String   ");
+    wrefresh(small);
+    getch();
+
+    touchwin(large);
+    wrefresh(large);
+
+    MvWAddStr(small, 5, 5, "   Test <***************> String   ");
+    wrefresh(small);
+
+    /* DIFFERENCE! */
+    getch();
+
+    /* test 2: erase */
+    erase();
+    refresh();
+    getch();
+
+    /* test 3: clrtoeol */
+    werase(small);
+    wrefresh(small);
+    touchwin(large);
+    wrefresh(large);
+    wmove(small, 5, 0);
+    waddstr(small, " clrtoeol>");
+    wclrtoeol(small);
+    wrefresh(small);
+
+    /* DIFFERENCE! */ ;
+    getch();
+
+    /* test 4: clrtobot */
+    werase(small);
+    wrefresh(small);
+    touchwin(large);
+    wrefresh(large);
+    wmove(small, 5, 3);
+    waddstr(small, " clrtobot>");
+    wclrtobot(small);
+    wrefresh(small);
+
+    /* DIFFERENCE! */
+    getch();
+
+    endwin();
+
+    ExitProgram(EXIT_SUCCESS);
+}
diff --git a/test/foldkeys.c b/test/foldkeys.c
new file mode 100644
index 0000000..9947171
--- /dev/null
+++ b/test/foldkeys.c
@@ -0,0 +1,298 @@
+/****************************************************************************
+ * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 2006-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/*
+ * Author: Thomas E. Dickey, 2006
+ *
+ * $Id: foldkeys.c,v 1.11 2022/12/10 23:31:31 tom Exp $
+ *
+ * Demonstrate a method for altering key definitions at runtime.
+ *
+ * This program reads the key definitions, merging those which have xterm-style
+ * modifiers into their equivalents which have no modifiers.  It does this
+ * merging only for the keys which are defined in the terminal description.
+ */
+
+#define NEED_TIME_H
+#include <test.priv.h>
+
+#if defined(NCURSES_VERSION) && NCURSES_EXT_FUNCS
+
+#define MY_LOGFILE "demo_foldkeys.log"
+#define MY_KEYS (KEY_MAX + 1)
+
+/*
+ * Log the most recently-written line to our logfile
+ */
+static void
+log_last_line(WINDOW *win)
+{
+    FILE *fp;
+
+    if ((fp = fopen(MY_LOGFILE, "a")) != 0) {
+	char temp[256];
+	int y, x, n;
+	int need = sizeof(temp) - 1;
+	if (need > COLS)
+	    need = COLS;
+	getyx(win, y, x);
+	wmove(win, y - 1, 0);
+	n = winnstr(win, temp, need);
+	while (n-- > 0) {
+	    if (isspace(UChar(temp[n])))
+		temp[n] = '\0';
+	    else
+		break;
+	}
+	wmove(win, y, x);
+	fprintf(fp, "%s\n", temp);
+	fclose(fp);
+    }
+}
+
+/*
+ * ncurses has no API for telling what the actual last key-code is.  That is
+ * a secret because the codes past KEY_MAX are computed at run-time and may
+ * differ depending on the previous calls to newterm(), etc.  It is unlikely
+ * that one could have more than a thousand key definitions...
+ */
+#define MAX_KEYS 2000
+
+typedef struct {
+    const char *name;
+    const char *value;
+    int code;
+    int state;
+} KeyInfo;
+
+static void
+demo_foldkeys(void)
+{
+    KeyInfo info[MAX_KEYS];
+    int info_len = 0;
+    int merged = 0;
+    int code;
+    int j, k;
+
+    /*
+     * Tell ncurses that we want to use function keys.  That will make it add
+     * any user-defined keys that appear in the terminfo.
+     */
+    keypad(stdscr, TRUE);
+
+    /*
+     * List the predefined keys using the strnames[] array.
+     */
+    for (code = 0; code < STRCOUNT; ++code) {
+	NCURSES_CONST char *name = strnames[code];
+	NCURSES_CONST char *value = tigetstr(name);
+	if (value != 0 && value != (NCURSES_CONST char *) -1) {
+	    info[info_len].name = strnames[code];
+	    info[info_len].code = key_defined(value);
+	    info[info_len].value = value;
+	    info[info_len].state = 0;
+	    if (info[info_len].code > 0)
+		++info_len;
+	}
+    }
+
+    /*
+     * We can get the names for user-defined keys from keyname().  It returns
+     * a name like KEY_foo for the predefined keys, which tigetstr() does not
+     * understand.
+     */
+    for (code = KEY_MAX; code < MAX_KEYS; ++code) {
+	NCURSES_CONST char *name = keyname(code);
+	if (name != 0) {
+	    info[info_len].name = name;
+	    info[info_len].code = code;
+	    info[info_len].value = tigetstr(name);
+	    info[info_len].state = 0;
+	    ++info_len;
+	}
+    }
+    printw("Initially %d key definitions\n", info_len);
+
+    /*
+     * Look for keys that have xterm-style modifiers.
+     */
+    for (j = 0; j < info_len; ++j) {
+	int first, second;
+	char final[2];
+	char *value;
+	size_t need;
+
+	if (info[j].state == 0
+	    && sscanf(info[j].value,
+		      "\033[%d;%d%c",
+		      &first,
+		      &second,
+		      final) == 3
+	    && *final != ';'
+	    && (need = strlen(info[j].value)) != 0
+	    && (value = strdup(info[j].value)) != 0) {
+	    (void) need;	/* _nc_SLIMIT is normally nothing  */
+	    _nc_SPRINTF(value, _nc_SLIMIT(need) "\033[%d%c", first, *final);
+	    for (k = 0; k < info_len; ++k) {
+		if (info[k].state == 0
+		    && !strcmp(info[k].value, value)) {
+		    info[j].state = 1;
+		    break;
+		}
+	    }
+	    if (info[j].state == 0) {
+		_nc_SPRINTF(value, _nc_SLIMIT(need) "\033O%c", *final);
+		for (k = 0; k < info_len; ++k) {
+		    if (info[k].state == 0
+			&& !strcmp(info[k].value, value)) {
+			info[j].state = 1;
+			break;
+		    }
+		}
+	    }
+	    if (info[j].state == 1) {
+		if ((define_key(info[j].value, info[k].code)) != ERR) {
+		    printw("map %s to %s\n", info[j].value, info[k].value);
+		    keyok(info[j].code, FALSE);
+		    ++merged;
+		} else {
+		    printw("? cannot define_key %d:%s\n", j, info[j].value);
+		}
+	    } else {
+		printw("? cannot merge %d:%s\n", j, info[j].value);
+	    }
+	    free(value);
+	}
+    }
+    printw("Merged to %d key definitions\n", info_len - merged);
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: foldkeys [options]"
+	,""
+	,USAGE_COMMON
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+#if HAVE_GETTIMEOFDAY
+    struct timeval previous;
+#endif
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) {
+	switch (ch) {
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind < argc)
+	usage(FALSE);
+
+    if (newterm(0, stdout, stdin) == 0) {
+	fprintf(stderr, "Cannot initialize terminal\n");
+	ExitProgram(EXIT_FAILURE);
+    }
+
+    unlink(MY_LOGFILE);
+
+    (void) cbreak();		/* take input chars one at a time, no wait for \n */
+    (void) noecho();		/* don't echo input */
+
+    scrollok(stdscr, TRUE);
+    keypad(stdscr, TRUE);
+    move(0, 0);
+
+    demo_foldkeys();
+
+#if HAVE_GETTIMEOFDAY
+    gettimeofday(&previous, 0);
+#endif
+
+    while ((ch = getch()) != ERR) {
+	bool escaped = (ch >= MY_KEYS);
+	const char *name = keyname(escaped ? (ch - MY_KEYS) : ch);
+
+#if HAVE_GETTIMEOFDAY
+	int secs, msecs;
+	struct timeval current;
+
+	gettimeofday(&current, 0);
+	secs = (int) (current.tv_sec - previous.tv_sec);
+	msecs = (int) ((current.tv_usec - previous.tv_usec) / 1000);
+	if (msecs < 0) {
+	    msecs += 1000;
+	    --secs;
+	}
+	if (msecs >= 1000) {
+	    secs += msecs / 1000;
+	    msecs %= 1000;
+	}
+	printw("%6d.%03d ", secs, msecs);
+	previous = current;
+#endif
+	printw("Keycode %d, name %s%s\n",
+	       ch,
+	       escaped ? "ESC-" : "",
+	       name != 0 ? name : "<null>");
+	log_last_line(stdscr);
+	clrtoeol();
+	if (ch == 'q')
+	    break;
+    }
+    endwin();
+    ExitProgram(EXIT_SUCCESS);
+}
+#else
+int
+main(void)
+{
+    printf("This program requires the ncurses library\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif
diff --git a/test/form_driver_w.c b/test/form_driver_w.c
new file mode 100644
index 0000000..544060d
--- /dev/null
+++ b/test/form_driver_w.c
@@ -0,0 +1,208 @@
+/****************************************************************************
+ * Copyright 2020,2022 Thomas E. Dickey                                     *
+ * Copyright 2013-2014,2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *   Author:  Gaute Hope, 2013                                              *
+ ****************************************************************************/
+
+/*
+ * $Id: form_driver_w.c,v 1.17 2022/12/10 23:31:31 tom Exp $
+ *
+ * Test form_driver_w (int, int, wchar_t), a wide char aware
+ * replacement of form_driver.
+ */
+
+#include <test.priv.h>
+#include <popup_msg.h>
+
+#if USE_WIDEC_SUPPORT && USE_LIBFORM && (defined(NCURSES_VERSION_PATCH) && NCURSES_VERSION_PATCH >= 20131207)
+
+#include <form.h>
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: form_driver_w [options]"
+	,""
+	,USAGE_COMMON
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    static const char *help[] =
+    {
+	"Commands:",
+	"  ^D,^Q,ESC           - quit program",
+	"  <Tab>,<Down>        - move to next field",
+	"  <BackTab>,<Up>      - move to previous field",
+	0
+    };
+
+#define NUM_FIELDS 3
+#define MyRow(n) (4 + (n) * 2)
+#define MyCol(n) 10
+    FIELD *field[NUM_FIELDS + 1];
+    FORM *my_form;
+    bool done = FALSE;
+    int n;
+    int ch;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) {
+	switch (ch) {
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind < argc)
+	usage(FALSE);
+
+    setlocale(LC_ALL, "");
+
+    /* Initialize curses */
+    initscr();
+    cbreak();
+    noecho();
+    keypad(stdscr, TRUE);
+
+    /* Initialize the fields */
+    for (n = 0; n < NUM_FIELDS; ++n) {
+	field[n] = new_field(1, 10, MyRow(n), 18, 0, 0);
+	set_field_back(field[n], A_UNDERLINE);
+	/* Print a line for the option  */
+	field_opts_off(field[n], O_AUTOSKIP);
+	/* Don't go to next field when this is filled */
+    }
+    field[n] = NULL;
+
+    /* Create the form and post it */
+    my_form = new_form(field);
+    post_form(my_form);
+    refresh();
+
+    for (n = 0; n < NUM_FIELDS; ++n) {
+	mvprintw(MyRow(n), MyCol(n), "Value %d:", n + 1);
+    }
+
+    /* Loop through to get user requests */
+    while (!done) {
+	wint_t c2;
+	int ret = get_wch(&c2);
+
+	mvprintw(MyRow(NUM_FIELDS),
+		 MyCol(NUM_FIELDS),
+		 "Got %d (%#x), type: %s",
+		 (int) c2,
+		 (int) c2,
+		 (ret == KEY_CODE_YES)
+		 ? "KEY_CODE_YES"
+		 : ((ret == OK)
+		    ? "OK"
+		    : ((ret == ERR)
+		       ? "ERR"
+		       : "?")));
+	clrtoeol();
+
+	switch (ret) {
+	case KEY_CODE_YES:
+	    switch (c2) {
+	    case KEY_DOWN:
+		/* Go to next field */
+		form_driver_w(my_form, KEY_CODE_YES, REQ_NEXT_FIELD);
+		/* Go to the end of the present buffer */
+		/* Leaves nicely at the last character */
+		form_driver_w(my_form, KEY_CODE_YES, REQ_END_LINE);
+		break;
+	    case KEY_BTAB:
+	    case KEY_UP:
+		/* Go to previous field */
+		form_driver_w(my_form, KEY_CODE_YES, REQ_PREV_FIELD);
+		form_driver_w(my_form, KEY_CODE_YES, REQ_END_LINE);
+		break;
+	    default:
+		break;
+	    }
+	    break;
+	case OK:
+	    switch (c2) {
+	    case CTRL('D'):
+	    case QUIT:
+	    case ESCAPE:
+		done = TRUE;
+		break;
+	    case '\t':
+		form_driver_w(my_form, KEY_CODE_YES, REQ_NEXT_FIELD);
+		form_driver_w(my_form, KEY_CODE_YES, REQ_END_LINE);
+		break;
+	    case HELP_KEY_1:
+		popup_msg(form_win(my_form), help);
+		break;
+	    default:
+		form_driver_w(my_form, OK, (wchar_t) c2);
+		break;
+	    }
+	    break;
+	}
+    }
+
+    /* Un post form and free the memory */
+    unpost_form(my_form);
+    free_form(my_form);
+    for (n = 0; n < NUM_FIELDS; ++n) {
+	free_field(field[n]);
+    }
+
+    endwin();
+    ExitProgram(EXIT_SUCCESS);
+}
+
+#else
+int
+main(void)
+{
+    printf("This program requires the wide-ncurses and forms library\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif /* USE_WIDEC_SUPPORT */
diff --git a/test/gdc.6 b/test/gdc.6
new file mode 100644
index 0000000..383aae5
--- /dev/null
+++ b/test/gdc.6
@@ -0,0 +1,68 @@
+.\"***************************************************************************
+.\" Copyright 2020 Thomas E. Dickey                                          *
+.\" Copyright 1998-2006,2017 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: gdc.6,v 1.5 2020/02/02 23:34:34 tom Exp $
+.TH GDC 6
+.SH NAME
+gdc \- grand digital clock (curses)
+.SH SYNOPSIS
+.B gdc \fP[\fIoptions\fP] [\fIn\fP]
+.SH DESCRIPTION
+.I Gdc
+runs a digital clock made of reverse-video blanks on a terminal screen.
+If the terminal supports color, the clock is drawn in red.
+You can make the clock stop, pause or resume by pressing a ``q'',
+``s'' or space, respectively.
+.SH OPTIONS
+.TP
+.B \-d
+use terminal's default colors for the background.
+.TP
+.B \-n
+redirects input to /dev/null, making it ignore the stop/pause commands.
+You can still stop it by pressing the interrupt key.
+.TP
+.B \-s
+makes digits scroll as they change.
+When running on a fast display, the program breaks up the scrolling into
+subsecond repaints, making the operation appear smooth.
+.TP
+.B \-t \fIhh:mm:ss\fP
+specify starting time (default is ``now'').
+.PP
+With an optional numeric argument
+.I num
+it stops after
+.I num
+seconds.
+Normally it runs "forever" (counting down from 2 billion seconds).
+.SH AUTHOR
+Amos Shapir, modified for curses by John Lupien.
+.br
+Improvements for ncurses by Thomas Dickey.
diff --git a/test/gdc.c b/test/gdc.c
new file mode 100644
index 0000000..7243c10
--- /dev/null
+++ b/test/gdc.c
@@ -0,0 +1,461 @@
+/****************************************************************************
+ * Copyright 2019-2020,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+/*
+ * Grand digital clock for curses compatible terminals
+ * Usage: gdc [-s] [-t hh:mm:ss] [n] -- run for n seconds (default infinity)
+ * Flags: -s: scroll
+ *
+ * modified 10-18-89 for curses (jrl)
+ * 10-18-89 added signal handling
+ *
+ * $Id: gdc.c,v 1.57 2022/12/04 00:40:11 tom Exp $
+ */
+
+#include <test.priv.h>
+
+#include <time.h>
+
+#define YBASE	10
+#define XBASE	10
+#define XLENGTH	54
+#define YDEPTH	5
+
+#define PAIR_DIGITS 1
+#define PAIR_OTHERS 2
+#define PAIR_FRAMES 3
+
+static short disp[11] =
+{
+    075557, 011111, 071747, 071717, 055711,
+    074717, 074757, 071111, 075757, 075717, 002020
+};
+static long older[6], next[6], newer[6], mask;
+
+static int sigtermed = 0;
+static bool redirected = FALSE;
+static bool hascolor = FALSE;
+
+static void
+sighndl(int signo)
+{
+    signal(signo, sighndl);
+    sigtermed = signo;
+    if (redirected) {
+	stop_curses();
+	ExitProgram(EXIT_FAILURE);
+    }
+}
+
+static void
+check_term(void)
+{
+    if (sigtermed) {
+	(void) standend();
+	stop_curses();
+	fprintf(stderr, "gdc terminated by signal %d\n", sigtermed);
+	ExitProgram(EXIT_FAILURE);
+    }
+}
+
+static void
+drawbox(bool scrolling)
+{
+    chtype bottom[XLENGTH + 1];
+
+    if (hascolor)
+	(void) attrset(AttrArg(COLOR_PAIR(PAIR_FRAMES), 0));
+
+    MvAddCh(YBASE - 1, XBASE - 1, ACS_ULCORNER);
+    hline(ACS_HLINE, XLENGTH);
+    MvAddCh(YBASE - 1, XBASE + XLENGTH, ACS_URCORNER);
+
+    MvAddCh(YBASE + YDEPTH, XBASE - 1, ACS_LLCORNER);
+    if ((mvinchnstr(YBASE + YDEPTH, XBASE, bottom, XLENGTH)) != ERR) {
+	int n;
+	for (n = 0; n < XLENGTH; n++) {
+	    if (!scrolling)
+		bottom[n] &= ~A_COLOR;
+	    bottom[n] = ACS_HLINE | (bottom[n] & (A_ATTRIBUTES | A_COLOR));
+	}
+	(void) mvaddchnstr(YBASE + YDEPTH, XBASE, bottom, XLENGTH);
+    }
+    MvAddCh(YBASE + YDEPTH, XBASE + XLENGTH, ACS_LRCORNER);
+
+    move(YBASE, XBASE - 1);
+    vline(ACS_VLINE, YDEPTH);
+
+    move(YBASE, XBASE + XLENGTH);
+    vline(ACS_VLINE, YDEPTH);
+
+    if (hascolor)
+	(void) attrset(AttrArg(COLOR_PAIR(PAIR_OTHERS), 0));
+}
+
+static void
+standt(int on)
+{
+    if (on) {
+	if (hascolor) {
+	    attron(COLOR_PAIR(PAIR_DIGITS));
+	} else {
+	    attron(A_STANDOUT);
+	}
+    } else {
+	if (hascolor) {
+	    attron(COLOR_PAIR(PAIR_OTHERS));
+	} else {
+	    attroff(A_STANDOUT);
+	}
+    }
+}
+
+static void
+set(int t, int n)
+{
+    int i, m;
+
+    m = 7 << n;
+    for (i = 0; i < 5; i++) {
+	next[i] |= ((disp[t] >> ((4 - i) * 3)) & 07) << n;
+	mask |= (next[i] ^ older[i]) & m;
+    }
+    if (mask & m)
+	mask |= m;
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: gdc [options] [count]"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+#if HAVE_USE_DEFAULT_COLORS
+	," -d       invoke use_default_colors"
+#endif
+	," -n       redirect input to /dev/null"
+	," -s       scroll each number into place, rather than flipping"
+	," -t TIME  specify starting time as hh:mm:ss (default is ``now'')"
+	,""
+	,"If you specify a count, gdc runs for that number of seconds"
+    };
+    unsigned j;
+    for (j = 0; j < SIZEOF(msg); j++)
+	fprintf(stderr, "%s\n", msg[j]);
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+
+static time_t
+parse_time(const char *value)
+{
+    int hh, mm, ss;
+    int check;
+    time_t result;
+    char c;
+    struct tm *tm;
+
+    if (sscanf(value, "%d:%d:%d%c", &hh, &mm, &ss, &c) != 3) {
+	if (sscanf(value, "%02d%02d%02d%c", &hh, &mm, &ss, &c) != 3) {
+	    usage(FALSE);
+	}
+    }
+
+    if ((hh < 0) || (hh >= 24) ||
+	(mm < 0) || (mm >= 60) ||
+	(ss < 0) || (ss >= 60)) {
+	usage(FALSE);
+    }
+
+    /* adjust so that the localtime in the main loop will give usable time */
+    result = (hh * 3600) + ((mm * 60) + ss);
+    for (check = 0; check < 24; ++check) {
+	tm = localtime(&result);
+	if (tm->tm_hour == hh)
+	    break;
+	result += 3600;
+    }
+
+    if (tm->tm_hour != hh) {
+	fprintf(stderr, "Cannot find local time for %s!\n", value);
+	usage(FALSE);
+    }
+    return result;
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    time_t now;
+    struct tm *tm;
+    long t, a;
+    int i, j, s, k, ch;
+    int count = 0;
+    FILE *ofp = stdout;
+    FILE *ifp = stdin;
+    bool smooth = FALSE;
+    bool stages = FALSE;
+    time_t starts = 0;
+#if HAVE_USE_DEFAULT_COLORS
+    bool d_option = FALSE;
+#endif
+
+    setlocale(LC_ALL, "");
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "dnst:")) != -1) {
+	switch (ch) {
+#if HAVE_USE_DEFAULT_COLORS
+	case 'd':
+	    d_option = TRUE;
+	    break;
+#endif
+	case 'n':
+	    ifp = fopen("/dev/null", "r");
+	    redirected = TRUE;
+	    break;
+	case 's':
+	    smooth = TRUE;
+	    break;
+	case 't':
+	    starts = parse_time(optarg);
+	    break;
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind < argc) {
+	count = atoi(argv[optind++]);
+	assert(count >= 0);
+	if (optind < argc)
+	    usage(FALSE);
+    }
+
+    InitAndCatch({
+	if (redirected) {
+	    char *name = getenv("TERM");
+	    if (name == 0
+		|| newterm(name, ofp, ifp) == 0) {
+		fprintf(stderr, "cannot open terminal\n");
+		ExitProgram(EXIT_FAILURE);
+	    }
+	} else {
+	    initscr();
+	}
+    }
+    ,sighndl);
+
+    cbreak();
+    noecho();
+    nodelay(stdscr, 1);
+    curs_set(0);
+
+    hascolor = has_colors();
+
+    if (hascolor) {
+	short bg = COLOR_BLACK;
+	start_color();
+#if HAVE_USE_DEFAULT_COLORS
+	if (d_option && (use_default_colors() == OK))
+	    bg = -1;
+#endif
+	init_pair(PAIR_DIGITS, COLOR_BLACK, COLOR_RED);
+	init_pair(PAIR_OTHERS, COLOR_RED, bg);
+	init_pair(PAIR_FRAMES, COLOR_WHITE, bg);
+	(void) attrset(AttrArg(COLOR_PAIR(PAIR_OTHERS), 0));
+    }
+
+  restart:
+    for (j = 0; j < 5; j++)
+	older[j] = newer[j] = next[j] = 0;
+
+    clear();
+    drawbox(FALSE);
+
+    do {
+	char buf[40];
+
+	if (starts != 0) {
+	    now = ++starts;
+	} else {
+	    time(&now);
+	}
+	tm = localtime(&now);
+
+	mask = 0;
+	set(tm->tm_sec % 10, 0);
+	set(tm->tm_sec / 10, 4);
+	set(tm->tm_min % 10, 10);
+	set(tm->tm_min / 10, 14);
+	set(tm->tm_hour % 10, 20);
+	set(tm->tm_hour / 10, 24);
+	set(10, 7);
+	set(10, 17);
+
+	for (k = 0; k < 6; k++) {
+	    if (smooth) {
+		for (i = 0; i < 5; i++)
+		    newer[i] = (newer[i] & ~mask) | (newer[i + 1] & mask);
+		newer[5] = (newer[5] & ~mask) | (next[k] & mask);
+	    } else {
+		newer[k] = (newer[k] & ~mask) | (next[k] & mask);
+	    }
+	    next[k] = 0;
+	    for (s = 1; s >= 0; s--) {
+		standt(s);
+		for (i = 0; i < 6; i++) {
+		    if ((a = (newer[i] ^ older[i]) & (s ? newer : older)[i])
+			!= 0) {
+			for (j = 0, t = 1 << 26; t; t >>= 1, j++) {
+			    if (a & t) {
+				if (!(a & (t << 1))) {
+				    move(YBASE + i, XBASE + 2 * j);
+				}
+				addstr("  ");
+			    }
+			}
+		    }
+		    if (!s) {
+			older[i] = newer[i];
+		    }
+		}
+		if (!s) {
+		    if (smooth)
+			drawbox(TRUE);
+		    refresh();
+		    /*
+		     * If we're scrolling, space out the refreshes to fake
+		     * movement.  That's 7 frames, or 6 intervals, which would
+		     * be 166 msec if we spread it out over a second.  It looks
+		     * better (but will work on a slow terminal, e.g., less
+		     * than 9600bd) to squeeze that into a half-second, and use
+		     * half of 170 msec to ensure that the program doesn't eat
+		     * a lot of time when asking what time it is, at the top of
+		     * this loop -T.Dickey
+		     */
+		    if (smooth)
+			napms(85);
+		    if (stages) {
+			stages = FALSE;
+			switch (wgetch(stdscr)) {
+			case 'q':
+			    count = 1;
+			    break;
+			case 'S':
+			    stages = TRUE;
+			    /* FALLTHRU */
+			case 's':
+			    nodelay(stdscr, FALSE);
+			    break;
+			case ' ':
+			    nodelay(stdscr, TRUE);
+			    break;
+#ifdef KEY_RESIZE
+			case KEY_RESIZE:
+#endif
+			case '?':
+			    goto restart;
+			case ERR:
+			    check_term();
+			    /* FALLTHRU */
+			default:
+			    continue;
+			}
+		    }
+		}
+	    }
+	}
+
+	/* this depends on the detailed format of ctime(3) */
+	_nc_STRNCPY(buf, ctime(&now), (size_t) 30);
+	{
+	    char *d2 = buf + 10;
+	    char *s2 = buf + 19;
+	    while ((*d2++ = *s2++) != '\0') ;
+	}
+	MvAddStr(16, 30, buf);
+
+	move(6, 0);
+	drawbox(FALSE);
+	refresh();
+
+	/*
+	 * If we're not smooth-scrolling, wait 1000 msec (1 sec).  Use napms()
+	 * rather than sleep() because the latter does odd things on some
+	 * systems, e.g., suspending output as well.
+	 */
+	if (smooth)
+	    napms(500);
+	else
+	    napms(1000);
+
+	/*
+	 * This is a safe way to check if we're interrupted - making the signal
+	 * handler set a flag that we can check.  Since we're running
+	 * nodelay(), the wgetch() call returns immediately, and in particular
+	 * will return an error if interrupted.  This works only if we can
+	 * read from the input, of course.
+	 */
+	stages = FALSE;
+	switch (wgetch(stdscr)) {
+	case 'q':
+	    count = 1;
+	    break;
+	case 'S':
+	    stages = TRUE;
+	    /* FALLTHRU */
+	case 's':
+	    nodelay(stdscr, FALSE);
+	    break;
+	case ' ':
+	    nodelay(stdscr, TRUE);
+	    break;
+#ifdef KEY_RESIZE
+	case KEY_RESIZE:
+#endif
+	case '?':
+	    goto restart;
+	case ERR:
+	    check_term();
+	    /* FALLTHRU */
+	default:
+	    continue;
+	}
+    } while (--count);
+    (void) standend();
+    stop_curses();
+    ExitProgram(EXIT_SUCCESS);
+}
diff --git a/test/hanoi.c b/test/hanoi.c
new file mode 100644
index 0000000..6d92332
--- /dev/null
+++ b/test/hanoi.c
@@ -0,0 +1,376 @@
+/****************************************************************************
+ * Copyright 2019-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2014,2017 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.                                                           *
+ ****************************************************************************/
+/*
+ *	Name: Towers of Hanoi.
+ *
+ *	Desc:
+ *		This is a playable copy of towers of hanoi.
+ *		Its sole purpose is to demonstrate my Amiga Curses package.
+ *		This program should compile on any system that has Curses.
+ *		'hanoi'		will give a manual game with 7 playing pieces.
+ *		'hanoi n'	will give a manual game with n playing pieces.
+ *		'hanoi n a' will give an auto solved game with n playing pieces.
+ *
+ *	Author: Simon J Raybould	(sie@fulcrum.bt.co.uk).
+ * 	(This version has been slightly modified by the ncurses maintainers.)
+ *
+ *	Date: 05.Nov.90
+ *
+ * $Id: hanoi.c,v 1.47 2022/12/04 00:40:11 tom Exp $
+ */
+
+#include <test.priv.h>
+#include <math.h>
+
+#define NPEGS			3	/* This is not configurable !! */
+#define MINTILES		3
+#define MAXTILES		9
+#define DEFAULTTILES		7
+#define TOPLINE			6
+#define BASELINE		16
+#define STATUSLINE		(LINES-3)
+#define LEFTPEG			19
+#define MIDPEG			39
+#define RIGHTPEG		59
+
+#define LENTOIND(x)		(((int)(x)-1)/2)
+#define OTHER(a,b)		(3-((a)+(b)))
+
+struct Peg {
+    size_t Length[MAXTILES];
+    int Count;
+};
+
+static struct Peg Pegs[NPEGS];
+static int PegPos[] =
+{
+    LEFTPEG,
+    MIDPEG,
+    RIGHTPEG
+};
+static short TileColour[] =
+{
+    COLOR_GREEN,		/* Length 3 */
+    COLOR_MAGENTA,		/* Length 5 */
+    COLOR_RED,			/* Length 7 */
+    COLOR_BLUE,			/* Length 9 */
+    COLOR_CYAN,			/* Length 11 */
+    COLOR_YELLOW,		/* Length 13 */
+    COLOR_GREEN,		/* Length 15 */
+    COLOR_MAGENTA,		/* Length 17 */
+    COLOR_RED,			/* Length 19 */
+};
+static int NTiles = 0;
+static int NMoves = 0;
+static bool AutoFlag = FALSE;
+
+static int
+InvalidMove(int From, int To)
+{
+    if (From >= NPEGS)
+	return TRUE;
+    if (From < 0)
+	return TRUE;
+    if (To >= NPEGS)
+	return TRUE;
+    if (To < 0)
+	return TRUE;
+    if (From == To)
+	return TRUE;
+    if (!Pegs[From].Count)
+	return TRUE;
+    if (Pegs[To].Count &&
+	Pegs[From].Length[Pegs[From].Count - 1] >
+	Pegs[To].Length[Pegs[To].Count - 1])
+	return TRUE;
+    return FALSE;
+}
+
+static void
+InitTiles(void)
+{
+    int Size, SlotNo;
+
+    for (Size = NTiles * 2 + 1, SlotNo = 0; Size >= 3; Size -= 2)
+	Pegs[0].Length[SlotNo++] = (size_t) Size;
+
+    Pegs[0].Count = NTiles;
+    Pegs[1].Count = 0;
+    Pegs[2].Count = 0;
+}
+
+static int
+two2n(int n)
+{
+    int result = 1;
+    while (n-- > 0)
+	result *= 2;
+    return result;
+}
+
+static void
+DisplayTiles(void)
+{
+    int Line, peg, SlotNo;
+    char TileBuf[BUFSIZ];
+
+    erase();
+    MvAddStr(1, 24, "T O W E R S   O F   H A N O I");
+    MvAddStr(3, 34, "SJR 1990");
+    MvPrintw(19, 5, "Moves : %d of %d", NMoves, two2n(NTiles) - 1);
+    (void) attrset(A_REVERSE);
+    MvAddStr(BASELINE, 8,
+	     "                                                               ");
+
+    for (Line = TOPLINE; Line < BASELINE; Line++) {
+	MvAddCh(Line, LEFTPEG, ' ');
+	MvAddCh(Line, MIDPEG, ' ');
+	MvAddCh(Line, RIGHTPEG, ' ');
+    }
+    MvAddCh(BASELINE, LEFTPEG, '1');
+    MvAddCh(BASELINE, MIDPEG, '2');
+    MvAddCh(BASELINE, RIGHTPEG, '3');
+    (void) attrset(A_NORMAL);
+
+    /* Draw tiles */
+    for (peg = 0; peg < NPEGS; peg++) {
+	for (SlotNo = 0; SlotNo < Pegs[peg].Count; SlotNo++) {
+	    size_t len = Pegs[peg].Length[SlotNo];
+	    if (len < sizeof(TileBuf) - 1 && len < (size_t) PegPos[peg]) {
+		memset(TileBuf, ' ', len);
+		TileBuf[len] = '\0';
+		if (has_colors())
+		    (void) attrset(AttrArg(COLOR_PAIR(LENTOIND(len)), 0));
+		else
+		    (void) attrset(A_REVERSE);
+		MvAddStr(BASELINE - (SlotNo + 1),
+			 (PegPos[peg] - (int) len / 2),
+			 TileBuf);
+	    }
+	}
+    }
+    (void) attrset(A_NORMAL);
+    refresh();
+}
+
+static int
+GetMove(int *From, int *To)
+{
+    MvAddStr(STATUSLINE, 0, "Next move ('q' to quit) from ");
+    clrtoeol();
+    refresh();
+    if ((*From = getch()) == 'q')
+	return TRUE;
+    *From -= ('0' + 1);
+    addstr(" to ");
+    clrtoeol();
+    refresh();
+
+    if ((*To = getch()) == 'q')
+	return TRUE;
+    *To -= ('0' + 1);
+    refresh();
+    if (!AutoFlag)
+	napms(500);
+
+    move(STATUSLINE, 0);
+    clrtoeol();
+    refresh();
+    return FALSE;
+}
+
+static void
+MakeMove(int From, int To)
+{
+    Pegs[From].Count--;
+    Pegs[To].Length[Pegs[To].Count] = Pegs[From].Length[Pegs[From].Count];
+    Pegs[To].Count++;
+    NMoves++;
+    DisplayTiles();
+}
+
+static void
+AutoMove(int From, int To, int Num)
+{
+    if (Num == 1) {
+	MakeMove(From, To);
+	napms(500);
+    } else {
+	AutoMove(From, OTHER(From, To), Num - 1);
+	MakeMove(From, To);
+	napms(500);
+	AutoMove(OTHER(From, To), To, Num - 1);
+    }
+}
+
+static int
+Solved(int NumTiles)
+{
+    int i;
+
+    for (i = 1; i < NPEGS; i++)
+	if (Pegs[i].Count == NumTiles)
+	    return TRUE;
+    return FALSE;
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: hanoi [options] [[<No Of Tiles>] [a]]"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+#if HAVE_USE_DEFAULT_COLORS
+	," -d       invoke use_default_colors"
+#endif
+	," -n NUM   set number of tiles (positional param is deprecated)"
+	," -X       solve automatically (positional \"a\" is deprecated)"
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char **argv)
+{
+    int ch, FromCol, ToCol;
+
+#if HAVE_USE_DEFAULT_COLORS
+    bool d_option = FALSE;
+#endif
+
+    NTiles = DEFAULTTILES;
+    while ((ch = getopt(argc, argv, OPTS_COMMON "dn:X")) != -1) {
+	switch (ch) {
+#if HAVE_USE_DEFAULT_COLORS
+	case 'd':
+	    d_option = TRUE;
+	    break;
+#endif
+	case 'n':
+	    NTiles = atoi(optarg);
+	    break;
+	case 'X':
+	    AutoFlag = TRUE;
+	    break;
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    setlocale(LC_ALL, "");
+
+    switch (argc - optind) {
+    case 2:
+	if (strcmp(argv[optind + 1], "a")) {
+	    usage(FALSE);
+	}
+	AutoFlag = TRUE;
+	/* FALLTHRU */
+    case 1:
+	NTiles = atoi(argv[optind]);
+	/* FALLTHRU */
+    case 0:
+	break;
+    default:
+	usage(FALSE);
+    }
+
+    if (NTiles > MAXTILES || NTiles < MINTILES) {
+	fprintf(stderr, "Range %d to %d\n", MINTILES, MAXTILES);
+	usage(FALSE);
+    }
+
+    initscr();
+    if (has_colors()) {
+	int i;
+	short bg = COLOR_BLACK;
+	start_color();
+#if HAVE_USE_DEFAULT_COLORS
+	if (d_option && (use_default_colors() == OK))
+	    bg = -1;
+#endif
+	for (i = 0; i < 9; i++)
+	    init_pair((short) (i + 1), bg, TileColour[i]);
+    }
+    cbreak();
+    if (LINES < 24) {
+	endwin();
+	fprintf(stderr, "Min screen length 24 lines\n");
+	ExitProgram(EXIT_FAILURE);
+    }
+    if (AutoFlag) {
+	curs_set(0);
+	leaveok(stdscr, TRUE);	/* Attempt to remove cursor */
+    }
+    InitTiles();
+    DisplayTiles();
+    if (AutoFlag) {
+	do {
+	    noecho();
+	    AutoMove(0, 2, NTiles);
+	} while (!Solved(NTiles));
+	sleep(2);
+    } else {
+	echo();
+	for (;;) {
+	    if (GetMove(&FromCol, &ToCol))
+		break;
+	    if (InvalidMove(FromCol, ToCol)) {
+		MvAddStr(STATUSLINE, 0, "Invalid Move !!");
+		refresh();
+		beep();
+		continue;
+	    }
+	    MakeMove(FromCol, ToCol);
+	    if (Solved(NTiles)) {
+		MvPrintw(STATUSLINE, 0,
+			 "Well Done !! You did it in %d moves", NMoves);
+		refresh();
+		sleep(5);
+		break;
+	    }
+	}
+    }
+    stop_curses();
+    ExitProgram(EXIT_SUCCESS);
+}
diff --git a/test/hashtest.c b/test/hashtest.c
new file mode 100644
index 0000000..be79c0e
--- /dev/null
+++ b/test/hashtest.c
@@ -0,0 +1,254 @@
+/****************************************************************************
+ * Copyright 2019-2020,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2013,2017 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.                                                           *
+ ****************************************************************************/
+/*
+ * hashtest.c -- test hash mapping
+ *
+ * Generate timing statistics for vertical-motion optimization.
+ *
+ * $Id: hashtest.c,v 1.39 2022/12/04 00:40:11 tom Exp $
+ */
+
+#include <test.priv.h>
+
+#define LO_CHAR ' '
+#define HI_CHAR '~'
+
+static bool continuous = FALSE;
+static bool reverse_loops = FALSE;
+static bool single_step = FALSE;
+static bool extend_corner = FALSE;
+static int foot_lines = 0;
+static int head_lines = 0;
+
+static void
+cleanup(void)
+{
+    move(LINES - 1, 0);
+    clrtoeol();
+    refresh();
+    endwin();
+}
+
+static void
+finish(int sig GCC_UNUSED)
+{
+    cleanup();
+    ExitProgram(EXIT_FAILURE);
+}
+
+static void
+genlines(int base)
+{
+    int i, j;
+
+#if USE_TRACE
+    if (base == 'a')
+	Trace(("Resetting screen"));
+    else
+	Trace(("Painting `%c' screen", base));
+#endif
+
+    /* Do this so writes to lower-right corner don't cause a spurious
+     * scrolling operation.  This _shouldn't_ break the scrolling
+     * optimization, since that's computed in the refresh() call.
+     */
+    scrollok(stdscr, FALSE);
+
+    move(0, 0);
+    for (i = 0; i < head_lines; i++)
+	for (j = 0; j < COLS; j++)
+	    AddCh(UChar((j % 8 == 0) ? ('A' + j / 8) : '-'));
+
+    move(head_lines, 0);
+    for (i = head_lines; i < LINES - foot_lines; i++) {
+	chtype c = (chtype) ((base - LO_CHAR + i) % (HI_CHAR - LO_CHAR + 1)
+			     + LO_CHAR);
+	int hi = (extend_corner || (i < LINES - 1)) ? COLS : COLS - 1;
+	for (j = 0; j < hi; j++)
+	    AddCh(c);
+    }
+
+    for (i = LINES - foot_lines; i < LINES; i++) {
+	move(i, 0);
+	for (j = 0; j < (extend_corner ? COLS : COLS - 1); j++)
+	    AddCh(UChar((j % 8 == 0) ? ('A' + j / 8) : '-'));
+    }
+
+    scrollok(stdscr, TRUE);
+    if (single_step) {
+	move(LINES - 1, 0);
+	getch();
+    } else
+	refresh();
+}
+
+static void
+one_cycle(int ch)
+{
+    if (continuous) {
+	genlines(ch);
+    } else if (ch != 'a') {
+	genlines('a');
+	genlines(ch);
+    }
+}
+
+static void
+run_test(bool optimized GCC_UNUSED)
+{
+    char ch;
+    int lo = continuous ? LO_CHAR : 'a' - LINES;
+    int hi = continuous ? HI_CHAR : 'a' + LINES;
+
+    if (lo < LO_CHAR)
+	lo = LO_CHAR;
+    if (hi > HI_CHAR)
+	hi = HI_CHAR;
+
+#if defined(TRACE) || defined(NCURSES_TEST)
+    if (optimized) {
+	Trace(("With hash mapping"));
+	_nc_optimize_enable |= OPTIMIZE_HASHMAP;
+    } else {
+	Trace(("Without hash mapping"));
+	_nc_optimize_enable &= ~OPTIMIZE_HASHMAP;
+    }
+#endif
+
+    if (reverse_loops)
+	for (ch = (char) hi; ch >= lo; ch--)
+	    one_cycle(ch);
+    else
+	for (ch = (char) lo; ch <= hi; ch++)
+	    one_cycle(ch);
+}
+
+static void
+usage(int ok)
+{
+    static const char *const tbl[] =
+    {
+	"Usage: hashtest [options]"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+	," -c       continuous (don't reset between refresh's)"
+	," -F num   leave 'num' lines constant for footer"
+	," -H num   leave 'num' lines constant for header"
+	," -l num   repeat test 'num' times"
+	," -n       test the normal optimizer"
+	," -o       test the hashed optimizer"
+	," -r       reverse the loops"
+	," -s       single-step"
+	," -x       assume lower-right corner extension"
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(tbl); n++)
+	fprintf(stderr, "%s\n", tbl[n]);
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+    int test_loops = 1;
+    int test_normal = FALSE;
+    int test_optimize = FALSE;
+
+    setlocale(LC_ALL, "");
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "cF:H:l:norsx")) != -1) {
+	switch (ch) {
+	case 'c':
+	    continuous = TRUE;
+	    break;
+	case 'F':
+	    foot_lines = atoi(optarg);
+	    break;
+	case 'H':
+	    head_lines = atoi(optarg);
+	    break;
+	case 'l':
+	    test_loops = atoi(optarg);
+	    assert(test_loops >= 0);
+	    break;
+	case 'n':
+	    test_normal = TRUE;
+	    break;
+	case 'o':
+	    test_optimize = TRUE;
+	    break;
+	case 'r':
+	    reverse_loops = TRUE;
+	    break;
+	case 's':
+	    single_step = TRUE;
+	    break;
+	case 'x':
+	    extend_corner = TRUE;
+	    break;
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (!test_normal && !test_optimize) {
+	test_normal = TRUE;
+	test_optimize = TRUE;
+    }
+#if USE_TRACE
+    curses_trace(TRACE_TIMES);
+#endif
+
+    InitAndCatch(initscr(), finish);
+    keypad(stdscr, TRUE);	/* enable keyboard mapping */
+    (void) nonl();		/* tell curses not to do NL->CR/NL on output */
+    (void) cbreak();		/* take input chars one at a time, no wait for \n */
+    (void) noecho();		/* don't echo input */
+    scrollok(stdscr, TRUE);
+
+    while (test_loops-- > 0) {
+	if (test_normal)
+	    run_test(FALSE);
+	if (test_optimize)
+	    run_test(TRUE);
+    }
+
+    cleanup();			/* we're done */
+    ExitProgram(EXIT_SUCCESS);
+}
+/* hashtest.c ends here */
diff --git a/test/inch_wide.c b/test/inch_wide.c
new file mode 100644
index 0000000..7b838d1
--- /dev/null
+++ b/test/inch_wide.c
@@ -0,0 +1,327 @@
+/****************************************************************************
+ * Copyright 2019-2020,2022 Thomas E. Dickey                                *
+ * Copyright 2007-2010,2017 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: inch_wide.c,v 1.13 2022/12/10 23:55:34 tom Exp $
+ */
+/*
+       int in_wch(cchar_t *wcval);
+       int mvin_wch(int y, int x, cchar_t *wcval);
+       int mvwin_wch(WINDOW *win, int y, int x, cchar_t *wcval);
+       int win_wch(WINDOW *win, cchar_t *wcval);
+       int in_wchstr(cchar_t *wchstr);
+       int in_wchnstr(cchar_t *wchstr, int n);
+       int win_wchstr(WINDOW *win, cchar_t *wchstr);
+       int win_wchnstr(WINDOW *win, cchar_t *wchstr, int n);
+       int mvin_wchstr(int y, int x, cchar_t *wchstr);
+       int mvin_wchnstr(int y, int x, cchar_t *wchstr, int n);
+       int mvwin_wchstr(WINDOW *win, int y, int x, cchar_t *wchstr);
+       int mvwin_wchnstr(WINDOW *win, int y, int x, cchar_t *wchstr, int n);
+*/
+
+#include <test.priv.h>
+#include <popup_msg.h>
+
+#if USE_WIDEC_SUPPORT
+
+#define BASE_Y 7
+#define MAX_COLS 1024
+
+static bool
+Quit(int ch)
+{
+    return (ch == ERR || ch == 'q' || ch == QUIT || ch == ESCAPE);
+}
+
+static int
+test_inchs(int level, char **argv, WINDOW *chrwin, WINDOW *strwin)
+{
+    static const char *help[] =
+    {
+	"Test input from screen using inch(), etc., in a moveable viewport.",
+	"",
+	"Commands:",
+	" ESC/^Q                   - quit",
+	" h,j,k,l (and arrow-keys) - move viewport",
+	" w                        - recur to new window",
+	"                            for next input file",
+	0
+    };
+
+    WINDOW *txtbox = 0;
+    WINDOW *txtwin = 0;
+    FILE *fp;
+    int j;
+    int txt_x = 0, txt_y = 0;
+    int base_y;
+    cchar_t ch;
+    cchar_t text[MAX_COLS];
+
+    if (argv[level] == 0) {
+	beep();
+	return FALSE;
+    }
+
+    if (level > 1) {
+	txtbox = newwin(LINES - BASE_Y, COLS - level, BASE_Y, level);
+	box(txtbox, 0, 0);
+	wnoutrefresh(txtbox);
+
+	txtwin = derwin(txtbox,
+			getmaxy(txtbox) - 2,
+			getmaxx(txtbox) - 2,
+			1, 1);
+	base_y = 0;
+    } else {
+	txtwin = stdscr;
+	base_y = BASE_Y;
+    }
+
+    keypad(txtwin, TRUE);	/* enable keyboard mapping */
+    (void) cbreak();		/* take input chars one at a time, no wait for \n */
+    (void) noecho();		/* don't echo input */
+
+    txt_y = base_y;
+    txt_x = 0;
+    wmove(txtwin, txt_y, txt_x);
+
+    if ((fp = fopen(argv[level], "r")) != 0) {
+	while ((j = fgetc(fp)) != EOF) {
+	    if (waddch(txtwin, UChar(j)) != OK) {
+		break;
+	    }
+	}
+	fclose(fp);
+    } else {
+	wprintw(txtwin, "Cannot open:\n%s", argv[1]);
+    }
+
+    while (!Quit(j = mvwgetch(txtwin, txt_y, txt_x))) {
+	int limit;
+
+	switch (j) {
+	case KEY_DOWN:
+	case 'j':
+	    if (txt_y < getmaxy(txtwin) - 1)
+		txt_y++;
+	    else
+		beep();
+	    break;
+	case KEY_UP:
+	case 'k':
+	    if (txt_y > base_y)
+		txt_y--;
+	    else
+		beep();
+	    break;
+	case KEY_LEFT:
+	case 'h':
+	    if (txt_x > 0)
+		txt_x--;
+	    else
+		beep();
+	    break;
+	case KEY_RIGHT:
+	case 'l':
+	    if (txt_x < getmaxx(txtwin) - 1)
+		txt_x++;
+	    else
+		beep();
+	    break;
+	case 'w':
+	    test_inchs(level + 1, argv, chrwin, strwin);
+	    if (txtbox != 0) {
+		touchwin(txtbox);
+		wnoutrefresh(txtbox);
+	    } else {
+		touchwin(txtwin);
+		wnoutrefresh(txtwin);
+	    }
+	    break;
+	case HELP_KEY_1:
+	    popup_msg(txtwin, help);
+	    break;
+	default:
+	    beep();
+	    break;
+	}
+
+	MvWPrintw(chrwin, 0, 0, "char:");
+	wclrtoeol(chrwin);
+
+	if (txtwin != stdscr) {
+	    wmove(txtwin, txt_y, txt_x);
+	    if (win_wch(txtwin, &ch) != ERR) {
+		if (wadd_wch(chrwin, &ch) != ERR) {
+		    for (j = txt_x + 1; j < getmaxx(txtwin); ++j) {
+			if (mvwin_wch(txtwin, txt_y, j, &ch) != ERR) {
+			    if (wadd_wch(chrwin, &ch) == ERR) {
+				break;
+			    }
+			} else {
+			    break;
+			}
+		    }
+		}
+	    }
+	} else {
+	    move(txt_y, txt_x);
+	    if (in_wch(&ch) != ERR) {
+		if (wadd_wch(chrwin, &ch) != ERR) {
+		    for (j = txt_x + 1; j < getmaxx(txtwin); ++j) {
+			if (mvin_wch(txt_y, j, &ch) != ERR) {
+			    if (wadd_wch(chrwin, &ch) == ERR) {
+				break;
+			    }
+			} else {
+			    break;
+			}
+		    }
+		}
+	    }
+	}
+	wnoutrefresh(chrwin);
+
+	MvWPrintw(strwin, 0, 0, "text:");
+	wclrtobot(strwin);
+
+	limit = getmaxx(strwin) - 5;
+
+	if (txtwin != stdscr) {
+	    wmove(txtwin, txt_y, txt_x);
+	    if (win_wchstr(txtwin, text) != ERR) {
+		(void) mvwadd_wchstr(strwin, 0, 5, text);
+	    }
+
+	    wmove(txtwin, txt_y, txt_x);
+	    if (win_wchnstr(txtwin, text, limit) != ERR) {
+		(void) mvwadd_wchstr(strwin, 1, 5, text);
+	    }
+
+	    if (mvwin_wchstr(txtwin, txt_y, txt_x, text) != ERR) {
+		(void) mvwadd_wchstr(strwin, 2, 5, text);
+	    }
+
+	    if (mvwin_wchnstr(txtwin, txt_y, txt_x, text, limit) != ERR) {
+		(void) mvwadd_wchstr(strwin, 3, 5, text);
+	    }
+	} else {
+	    move(txt_y, txt_x);
+	    if (in_wchstr(text) != ERR) {
+		(void) mvwadd_wchstr(strwin, 0, 5, text);
+	    }
+
+	    move(txt_y, txt_x);
+	    if (in_wchnstr(text, limit) != ERR) {
+		(void) mvwadd_wchstr(strwin, 1, 5, text);
+	    }
+
+	    if (mvin_wchstr(txt_y, txt_x, text) != ERR) {
+		(void) mvwadd_wchstr(strwin, 2, 5, text);
+	    }
+
+	    if (mvin_wchnstr(txt_y, txt_x, text, limit) != ERR) {
+		(void) mvwadd_wchstr(strwin, 3, 5, text);
+	    }
+	}
+
+	wnoutrefresh(strwin);
+    }
+    if (level > 1) {
+	delwin(txtwin);
+	delwin(txtbox);
+    }
+    return TRUE;
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: inch_wide [options] [file1 [...]]"
+	,""
+	,USAGE_COMMON
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    WINDOW *chrbox;
+    WINDOW *chrwin;
+    WINDOW *strwin;
+    int ch;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) {
+	switch (ch) {
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+
+    setlocale(LC_ALL, "");
+
+    if (optind + 1 > argc)
+	usage(FALSE);
+
+    initscr();
+
+    chrbox = derwin(stdscr, BASE_Y, COLS, 0, 0);
+    box(chrbox, 0, 0);
+    wnoutrefresh(chrbox);
+
+    chrwin = derwin(chrbox, 1, COLS - 2, 1, 1);
+    strwin = derwin(chrbox, 4, COLS - 2, 2, 1);
+
+    test_inchs(optind, argv, chrwin, strwin);
+
+    endwin();
+    ExitProgram(EXIT_SUCCESS);
+}
+#else
+int
+main(void)
+{
+    printf("This program requires the wide-ncurses library\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif
diff --git a/test/inchs.c b/test/inchs.c
new file mode 100644
index 0000000..b5922dd
--- /dev/null
+++ b/test/inchs.c
@@ -0,0 +1,331 @@
+/****************************************************************************
+ * Copyright 2019-2020,2022 Thomas E. Dickey                                *
+ * Copyright 2007-2012,2017 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: inchs.c,v 1.19 2022/12/11 00:01:39 tom Exp $
+ *
+ * Author: Thomas E Dickey
+ */
+/*
+       chtype inch(void);
+       chtype winch(WINDOW *win);
+       chtype mvinch(int y, int x);
+       chtype mvwinch(WINDOW *win, int y, int x);
+       int inchstr(chtype *chstr);
+       int inchnstr(chtype *chstr, int n);
+       int winchstr(WINDOW *win, chtype *chstr);
+       int winchnstr(WINDOW *win, chtype *chstr, int n);
+       int mvinchstr(int y, int x, chtype *chstr);
+       int mvinchnstr(int y, int x, chtype *chstr, int n);
+       int mvwinchstr(WINDOW *win, int y, int x, chtype *chstr);
+       int mvwinchnstr(WINDOW *win, int y, int x, chtype *chstr, int n);
+*/
+
+#include <test.priv.h>
+#include <popup_msg.h>
+
+#define BASE_Y 7
+#define MAX_COLS 1024
+
+static void
+failed(const char *s)
+{
+    int save = errno;
+    endwin();
+    errno = save;
+    perror(s);
+    ExitProgram(EXIT_FAILURE);
+}
+
+static bool
+Quit(int ch)
+{
+    return (ch == ERR || ch == 'q' || ch == QUIT || ch == ESCAPE);
+}
+
+static int
+test_inchs(int level, char **argv, WINDOW *chrwin, WINDOW *strwin)
+{
+    static const char *help[] =
+    {
+	"Test input from screen using inch(), etc., in a moveable viewport.",
+	"",
+	"Commands:",
+	" ESC/^Q                   - quit",
+	" h,j,k,l (and arrow-keys) - move viewport",
+	" w                        - recur to new window",
+	"                            for next input file",
+	0
+    };
+    WINDOW *txtbox = 0;
+    WINDOW *txtwin = 0;
+    FILE *fp;
+    int ch, j;
+    int txt_x = 0, txt_y = 0;
+    int base_y;
+    chtype text[MAX_COLS];
+
+    if (argv[level] == 0) {
+	beep();
+	return FALSE;
+    }
+
+    if (level > 1) {
+	txtbox = newwin(LINES - BASE_Y, COLS - level, BASE_Y, level);
+	box(txtbox, 0, 0);
+	wnoutrefresh(txtbox);
+
+	txtwin = derwin(txtbox,
+			getmaxy(txtbox) - 2,
+			getmaxx(txtbox) - 2,
+			1, 1);
+	base_y = 0;
+    } else {
+	txtwin = stdscr;
+	base_y = BASE_Y;
+    }
+    if (txtwin == 0)
+	failed("cannot create txtwin");
+
+    keypad(txtwin, TRUE);	/* enable keyboard mapping */
+    (void) cbreak();		/* take input chars one at a time, no wait for \n */
+    (void) noecho();		/* don't echo input */
+
+    txt_y = base_y;
+    txt_x = 0;
+    wmove(txtwin, txt_y, txt_x);
+
+    if ((fp = fopen(argv[level], "r")) != 0) {
+	while ((j = fgetc(fp)) != EOF) {
+	    if (waddch(txtwin, UChar(j)) != OK) {
+		break;
+	    }
+	}
+	fclose(fp);
+    } else {
+	wprintw(txtwin, "Cannot open:\n%s", argv[1]);
+    }
+
+    while (!Quit(j = mvwgetch(txtwin, txt_y, txt_x))) {
+	int limit;
+
+	switch (j) {
+	case KEY_DOWN:
+	case 'j':
+	    if (txt_y < getmaxy(txtwin) - 1)
+		txt_y++;
+	    else
+		beep();
+	    break;
+	case KEY_UP:
+	case 'k':
+	    if (txt_y > base_y)
+		txt_y--;
+	    else
+		beep();
+	    break;
+	case KEY_LEFT:
+	case 'h':
+	    if (txt_x > 0)
+		txt_x--;
+	    else
+		beep();
+	    break;
+	case KEY_RIGHT:
+	case 'l':
+	    if (txt_x < getmaxx(txtwin) - 1)
+		txt_x++;
+	    else
+		beep();
+	    break;
+	case 'w':
+	    test_inchs(level + 1, argv, chrwin, strwin);
+	    if (txtbox != 0) {
+		touchwin(txtbox);
+		wnoutrefresh(txtbox);
+	    } else {
+		touchwin(txtwin);
+		wnoutrefresh(txtwin);
+	    }
+	    break;
+	case HELP_KEY_1:
+	    popup_msg(txtwin, help);
+	    break;
+	default:
+	    beep();
+	    break;
+	}
+
+	MvWPrintw(chrwin, 0, 0, "char:");
+	wclrtoeol(chrwin);
+
+	if (txtwin != stdscr) {
+	    wmove(txtwin, txt_y, txt_x);
+
+	    if ((ch = (int) winch(txtwin)) != ERR) {
+		if (waddch(chrwin, (chtype) ch) != ERR) {
+		    for (j = txt_x + 1; j < getmaxx(txtwin); ++j) {
+			if ((ch = (int) mvwinch(txtwin, txt_y, j)) != ERR) {
+			    if (waddch(chrwin, (chtype) ch) == ERR) {
+				break;
+			    }
+			} else {
+			    break;
+			}
+		    }
+		}
+	    }
+	} else {
+	    move(txt_y, txt_x);
+
+	    if ((ch = (int) inch()) != ERR) {
+		if (waddch(chrwin, (chtype) ch) != ERR) {
+		    for (j = txt_x + 1; j < getmaxx(txtwin); ++j) {
+			if ((ch = (int) mvinch(txt_y, j)) != ERR) {
+			    if (waddch(chrwin, (chtype) ch) == ERR) {
+				break;
+			    }
+			} else {
+			    break;
+			}
+		    }
+		}
+	    }
+	}
+	wnoutrefresh(chrwin);
+
+	MvWPrintw(strwin, 0, 0, "text:");
+	wclrtobot(strwin);
+
+	limit = getmaxx(strwin) - 5;
+
+	if (txtwin != stdscr) {
+	    wmove(txtwin, txt_y, txt_x);
+	    if (winchstr(txtwin, text) != ERR) {
+		MvWAddChStr(strwin, 0, 5, text);
+	    }
+
+	    wmove(txtwin, txt_y, txt_x);
+	    if (winchnstr(txtwin, text, limit) != ERR) {
+		MvWAddChStr(strwin, 1, 5, text);
+	    }
+
+	    if (mvwinchstr(txtwin, txt_y, txt_x, text) != ERR) {
+		MvWAddChStr(strwin, 2, 5, text);
+	    }
+
+	    if (mvwinchnstr(txtwin, txt_y, txt_x, text, limit) != ERR) {
+		MvWAddChStr(strwin, 3, 5, text);
+	    }
+	} else {
+	    move(txt_y, txt_x);
+	    if (inchstr(text) != ERR) {
+		MvWAddChStr(strwin, 0, 5, text);
+	    }
+
+	    move(txt_y, txt_x);
+	    if (inchnstr(text, limit) != ERR) {
+		MvWAddChStr(strwin, 1, 5, text);
+	    }
+
+	    if (mvinchstr(txt_y, txt_x, text) != ERR) {
+		MvWAddChStr(strwin, 2, 5, text);
+	    }
+
+	    if (mvinchnstr(txt_y, txt_x, text, limit) != ERR) {
+		MvWAddChStr(strwin, 3, 5, text);
+	    }
+	}
+
+	wnoutrefresh(strwin);
+    }
+    if (level > 1) {
+	delwin(txtwin);
+	delwin(txtbox);
+    }
+    return TRUE;
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: inchs [options] file1 [file2 [...]]"
+	,""
+	,USAGE_COMMON
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    WINDOW *chrbox;
+    WINDOW *chrwin;
+    WINDOW *strwin;
+    int ch;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) {
+	switch (ch) {
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+
+    setlocale(LC_ALL, "");
+
+    if (optind + 1 > argc)
+	usage(FALSE);
+
+    initscr();
+
+    chrbox = derwin(stdscr, BASE_Y, COLS, 0, 0);
+    box(chrbox, 0, 0);
+    wnoutrefresh(chrbox);
+
+    chrwin = derwin(chrbox, 1, COLS - 2, 1, 1);
+    strwin = derwin(chrbox, 4, COLS - 2, 2, 1);
+
+    test_inchs(optind, argv, chrwin, strwin);
+
+    endwin();
+    ExitProgram(EXIT_SUCCESS);
+}
diff --git a/test/ins_wide.c b/test/ins_wide.c
new file mode 100644
index 0000000..a732449
--- /dev/null
+++ b/test/ins_wide.c
@@ -0,0 +1,525 @@
+/****************************************************************************
+ * Copyright 2020,2022 Thomas E. Dickey                                     *
+ * Copyright 2002-2016,2017 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: ins_wide.c,v 1.30 2022/12/10 22:28:50 tom Exp $
+ *
+ * Demonstrate the wins_wstr() and wins_wch functions.
+ * Thomas Dickey - 2002/11/23
+ *
+ * Note: to provide inputs for *ins_wch(), we use setcchar().  A quirk of the
+ * X/Open definition for that function is that the string contains no
+ * characters with negative width.  Any control character (such as tab) falls
+ * into that category.  So it follows that *ins_wch() cannot render a tab
+ * character because there is no legal way to construct a cchar_t containing
+ * one.  X/Open does not document this, and it would be logical to assume that
+ * *ins_wstr() has the same limitation, but it uses a wchar_t string directly,
+ * and does not document how tabs are handled.
+ */
+
+#include <test.priv.h>
+
+#if USE_WIDEC_SUPPORT
+
+#define WIDE_LINEDATA
+#include <linedata.h>
+
+/* definitions to make it simpler to compare with inserts.c */
+#define InsNStr    ins_nwstr
+#define InsStr     ins_wstr
+#define MvInsNStr  (void) mvins_nwstr
+#define MvInsStr   (void) mvins_wstr
+#define MvWInsNStr (void) mvwins_nwstr
+#define MvWInsStr  (void) mvwins_wstr
+#define WInsNStr   wins_nwstr
+#define WInsStr    wins_wstr
+
+#define MY_TABSIZE 8
+
+typedef enum {
+    oDefault = 0,
+    oMove = 1,
+    oWindow = 2,
+    oMoveWindow = 3
+} Options;
+
+static bool m_opt = FALSE;
+static bool w_opt = FALSE;
+static int n_opt = -1;
+
+static void
+legend(WINDOW *win, int level, Options state, wchar_t *buffer, int length)
+{
+    const char *showstate;
+
+    switch (state) {
+    default:
+    case oDefault:
+	showstate = "";
+	break;
+    case oMove:
+	showstate = " (mvXXX)";
+	break;
+    case oWindow:
+	showstate = " (winXXX)";
+	break;
+    case oMoveWindow:
+	showstate = " (mvwinXXX)";
+	break;
+    }
+
+    wmove(win, 0, 0);
+    wprintw(win,
+	    "The Strings/Chars displays should match.  Enter any characters, except:\n");
+    wprintw(win,
+	    "down-arrow or ^N to repeat on next line, ^W for inner window, ESC to exit.\n");
+    wclrtoeol(win);
+    wprintw(win, "Level %d,%s inserted %d characters <", level,
+	    showstate, length);
+    waddwstr(win, buffer);
+    waddstr(win, ">");
+}
+
+static int
+ColOf(const wchar_t *buffer, int length, int margin)
+{
+    int n;
+    int result;
+
+    for (n = 0, result = margin + 1; n < length; ++n) {
+	int ch = buffer[n];
+	switch (ch) {
+	case '\n':
+	    /* actually newline should clear the remainder of the line
+	     * and move to the next line - but that seems a little awkward
+	     * in this example.
+	     */
+	case '\r':
+	    result = 0;
+	    break;
+	case '\b':
+	    if (result > 0)
+		--result;
+	    break;
+	case '\t':
+	    result += (MY_TABSIZE - (result % MY_TABSIZE));
+	    break;
+	case '\177':
+	    result += 2;
+	    break;
+	default:
+	    result += wcwidth((wchar_t) ch);
+	    if (ch < 32)
+		++result;
+	    break;
+	}
+    }
+    return result;
+}
+
+static int
+ConvertCh(chtype source, cchar_t *target)
+{
+    wchar_t tmp_wchar[2];
+
+    tmp_wchar[0] = (wchar_t) source;
+    tmp_wchar[1] = 0;
+    if (setcchar(target, tmp_wchar, A_NORMAL, 0, (void *) 0) == ERR) {
+	beep();
+	return FALSE;
+    }
+    return TRUE;
+}
+
+static int
+MvWInsCh(WINDOW *win, int y, int x, chtype ch)
+{
+    int code;
+    cchar_t tmp_cchar;
+
+    if (ConvertCh(ch, &tmp_cchar)) {
+	code = mvwins_wch(win, y, x, &tmp_cchar);
+    } else {
+	code = mvwinsch(win, y, x, ch);
+    }
+    return code;
+}
+
+static int
+MvInsCh(int y, int x, chtype ch)
+{
+    int code;
+    cchar_t tmp_cchar;
+
+    if (ConvertCh(ch, &tmp_cchar)) {
+	code = mvins_wch(y, x, &tmp_cchar);
+    } else {
+	code = mvinsch(y, x, ch);
+    }
+    return code;
+}
+
+static int
+WInsCh(WINDOW *win, chtype ch)
+{
+    int code;
+    cchar_t tmp_cchar;
+
+    if (ConvertCh(ch, &tmp_cchar)) {
+	code = wins_wch(win, &tmp_cchar);
+    } else {
+	code = winsch(win, ch);
+    }
+    return code;
+}
+
+static int
+InsCh(chtype ch)
+{
+    int code;
+    cchar_t tmp_cchar;
+
+    if (ConvertCh(ch, &tmp_cchar)) {
+	code = ins_wch(&tmp_cchar);
+    } else {
+	code = insch(ch);
+    }
+    return code;
+}
+
+#define LEN(n) ((length - (n) > n_opt) ? n_opt : (length - (n)))
+static void
+test_inserts(int level)
+{
+    static bool first = TRUE;
+
+    int ch;
+    int limit;
+    int row = 1;
+    int col;
+    int row2, col2;
+    int length;
+    wchar_t buffer[BUFSIZ];
+    WINDOW *look = 0;
+    WINDOW *work = 0;
+    WINDOW *show = 0;
+    int margin = (2 * MY_TABSIZE) - 1;
+    Options option = (Options) ((int) (m_opt ? oMove : oDefault)
+				| (int) ((w_opt || (level > 0))
+					 ? oWindow : oDefault));
+
+    if (first) {
+	static char cmd[80];
+	setlocale(LC_ALL, "");
+
+	_nc_STRCPY(cmd, "TABSIZE=8", sizeof(cmd));
+	putenv(cmd);
+
+	initscr();
+	(void) cbreak();	/* take input chars one at a time, no wait for \n */
+	(void) noecho();	/* don't echo input */
+	keypad(stdscr, TRUE);
+
+	/*
+	 * Show the characters inserted in color, to distinguish from those
+	 * that are shifted.
+	 */
+	if (has_colors()) {
+	    start_color();
+	    init_pair(1, COLOR_WHITE, COLOR_BLUE);
+	}
+    }
+
+    limit = LINES - 5;
+    if (level > 0) {
+	look = newwin(limit, COLS - (2 * (level - 1)), 0, level - 1);
+	work = newwin(limit - 2, COLS - (2 * level), 1, level);
+	show = newwin(4, COLS, limit + 1, 0);
+	box(look, 0, 0);
+	wnoutrefresh(look);
+	limit -= 2;
+    } else {
+	work = stdscr;
+	show = derwin(stdscr, 4, COLS, limit + 1, 0);
+    }
+    keypad(work, TRUE);
+
+    for (col = margin + 1; col < COLS; col += MY_TABSIZE)
+	MvWVLine(work, row, col, '.', limit - 2);
+
+    MvWVLine(work, row, margin, ACS_VLINE, limit - 2);
+    MvWVLine(work, row, margin + 1, ACS_VLINE, limit - 2);
+    limit /= 2;
+
+    MvWAddStr(work, 1, 2, "String");
+    MvWAddStr(work, limit + 1, 2, "Chars");
+    wnoutrefresh(work);
+
+    buffer[length = 0] = '\0';
+    legend(show, level, option, buffer, length);
+    wnoutrefresh(show);
+
+    doupdate();
+
+    if (has_colors()) {
+	wbkgdset(work, (chtype) (COLOR_PAIR(1) | ' '));
+    }
+
+    while ((ch = read_linedata(work)) != ERR && !isQUIT(ch)) {
+	wmove(work, row, margin + 1);
+	switch (ch) {
+	case key_RECUR:
+	    test_inserts(level + 1);
+
+	    if (look)
+		touchwin(look);
+	    touchwin(work);
+	    touchwin(show);
+
+	    if (look)
+		wnoutrefresh(look);
+	    wnoutrefresh(work);
+	    wnoutrefresh(show);
+
+	    doupdate();
+	    break;
+	case key_NEWLINE:
+	    if (row < limit) {
+		++row;
+		/* put the whole string in, all at once */
+		col2 = margin + 1;
+		switch (option) {
+		case oDefault:
+		    if (n_opt > 1) {
+			for (col = 0; col < length; col += n_opt) {
+			    col2 = ColOf(buffer, col, margin);
+			    if (move(row, col2) != ERR) {
+				InsNStr(buffer + col, LEN(col));
+			    }
+			}
+		    } else {
+			if (move(row, col2) != ERR) {
+			    InsStr(buffer);
+			}
+		    }
+		    break;
+		case oMove:
+		    if (n_opt > 1) {
+			for (col = 0; col < length; col += n_opt) {
+			    col2 = ColOf(buffer, col, margin);
+			    MvInsNStr(row, col2, buffer + col, LEN(col));
+			}
+		    } else {
+			MvInsStr(row, col2, buffer);
+		    }
+		    break;
+		case oWindow:
+		    if (n_opt > 1) {
+			for (col = 0; col < length; col += n_opt) {
+			    col2 = ColOf(buffer, col, margin);
+			    if (wmove(work, row, col2) != ERR) {
+				WInsNStr(work, buffer + col, LEN(col));
+			    }
+			}
+		    } else {
+			if (wmove(work, row, col2) != ERR) {
+			    WInsStr(work, buffer);
+			}
+		    }
+		    break;
+		case oMoveWindow:
+		    if (n_opt > 1) {
+			for (col = 0; col < length; col += n_opt) {
+			    col2 = ColOf(buffer, col, margin);
+			    MvWInsNStr(work, row, col2, buffer + col, LEN(col));
+			}
+		    } else {
+			MvWInsStr(work, row, col2, buffer);
+		    }
+		    break;
+		}
+
+		/* do the corresponding single-character insertion */
+		row2 = limit + row;
+		for (col = 0; col < length; ++col) {
+		    col2 = ColOf(buffer, col, margin);
+		    switch (option) {
+		    case oDefault:
+			if (move(row2, col2) != ERR) {
+			    InsCh((chtype) buffer[col]);
+			}
+			break;
+		    case oMove:
+			MvInsCh(row2, col2, (chtype) buffer[col]);
+			break;
+		    case oWindow:
+			if (wmove(work, row2, col2) != ERR) {
+			    WInsCh(work, (chtype) buffer[col]);
+			}
+			break;
+		    case oMoveWindow:
+			MvWInsCh(work, row2, col2, (chtype) buffer[col]);
+			break;
+		    }
+		}
+	    } else {
+		beep();
+	    }
+	    break;
+	default:
+	    if (length >= BUFSIZ - 2)
+		break;
+	    buffer[length++] = (wchar_t) ch;
+	    buffer[length] = '\0';
+
+	    /* put the string in, one character at a time */
+	    col = ColOf(buffer, length - 1, margin);
+	    switch (option) {
+	    case oDefault:
+		if (move(row, col) != ERR) {
+		    InsStr(buffer + length - 1);
+		}
+		break;
+	    case oMove:
+		MvInsStr(row, col, buffer + length - 1);
+		break;
+	    case oWindow:
+		if (wmove(work, row, col) != ERR) {
+		    WInsStr(work, buffer + length - 1);
+		}
+		break;
+	    case oMoveWindow:
+		MvWInsStr(work, row, col, buffer + length - 1);
+		break;
+	    }
+
+	    /* do the corresponding single-character insertion */
+	    switch (option) {
+	    case oDefault:
+		if (move(limit + row, col) != ERR) {
+		    InsCh((chtype) ch);
+		}
+		break;
+	    case oMove:
+		MvInsCh(limit + row, col, (chtype) ch);
+		break;
+	    case oWindow:
+		if (wmove(work, limit + row, col) != ERR) {
+		    WInsCh(work, (chtype) ch);
+		}
+		break;
+	    case oMoveWindow:
+		MvWInsCh(work, limit + row, col, (chtype) ch);
+		break;
+	    }
+
+	    wnoutrefresh(work);
+
+	    legend(show, level, option, buffer, length);
+	    wnoutrefresh(show);
+
+	    doupdate();
+	    break;
+	}
+    }
+    if (level > 0) {
+	delwin(work);
+	delwin(look);
+    }
+    delwin(show);
+}
+
+static void
+usage(int ok)
+{
+    static const char *tbl[] =
+    {
+	"Usage: ins_wide [options]"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+	," -f FILE  read data from given file"
+	," -n NUM   limit string-inserts to NUM bytes on ^N replay"
+	," -m       perform wmove/move separately from insert-functions"
+	," -w       use window-parameter even when stdscr would be implied"
+    };
+    unsigned n;
+    for (n = 0; n < SIZEOF(tbl); ++n)
+	fprintf(stderr, "%s\n", tbl[n]);
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+
+    setlocale(LC_ALL, "");
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "f:mn:w")) != -1) {
+	switch (ch) {
+	case 'f':
+	    init_linedata(optarg);
+	    break;
+	case 'm':
+	    m_opt = TRUE;
+	    break;
+	case 'n':
+	    n_opt = atoi(optarg);
+	    if (n_opt == 0)
+		n_opt = -1;
+	    break;
+	case 'w':
+	    w_opt = TRUE;
+	    break;
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind < argc)
+	usage(FALSE);
+
+    test_inserts(0);
+    endwin();
+    ExitProgram(EXIT_SUCCESS);
+}
+#else
+int
+main(void)
+{
+    printf("This program requires the wide-ncurses library\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif
diff --git a/test/insdelln.c b/test/insdelln.c
new file mode 100644
index 0000000..52ccfb6
--- /dev/null
+++ b/test/insdelln.c
@@ -0,0 +1,429 @@
+/****************************************************************************
+ * Copyright 2019-2020,2022 Thomas E. Dickey                                *
+ * Copyright 2008-2014,2017 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: insdelln.c,v 1.15 2022/12/10 23:31:31 tom Exp $
+ *
+ * test-driver for deleteln, wdeleteln, insdelln, winsdelln, insertln, winsertln
+ */
+
+#include <test.priv.h>
+
+#if HAVE_WINSDELLN
+
+#include <popup_msg.h>
+
+#define SHOW(n) ((n) == ERR ? "ERR" : "OK")
+#define COLOR_DEFAULT (-1)
+
+typedef struct {
+    unsigned c;
+    unsigned v;
+    int pair;
+    unsigned attr;
+    int count;
+    int ch;
+    const char *c_msg;
+    const char *v_msg;
+    int y_val;
+    int x_val;
+    int y_beg, x_beg;
+    int y_max, x_max;
+} STATUS;
+
+static const char *
+color_params(unsigned state, int *pair)
+{
+    /* *INDENT-OFF* */
+    static struct {
+	short pair;
+	short fg, bg;
+	const char *msg;
+    } table[] = {
+	{ 0, COLOR_DEFAULT, COLOR_DEFAULT, "default" },
+	{ 1, COLOR_RED,     COLOR_BLACK,   "red/black" },
+	{ 2, COLOR_WHITE,   COLOR_BLUE,    "white/blue" },
+    };
+    /* *INDENT-ON* */
+
+    const char *result = 0;
+
+    if (has_colors()) {
+	static bool first = TRUE;
+	if (first) {
+	    unsigned n;
+
+	    start_color();
+	    for (n = 0; n < SIZEOF(table); ++n) {
+		init_pair(table[n].pair, table[n].fg, table[n].bg);
+	    }
+	}
+	if (state < SIZEOF(table)) {
+	    *pair = table[state].pair;
+	    result = table[state].msg;
+	}
+    }
+    return result;
+}
+
+static const char *
+video_params(unsigned state, unsigned *attr)
+{
+    /* *INDENT-OFF* */
+    static struct {
+	unsigned attr;
+	const char *msg;
+    } table[] = {
+	{ A_NORMAL,	"normal" },
+	{ A_BOLD,	"bold" },
+	{ A_REVERSE,	"reverse" },
+	{ A_UNDERLINE,	"underline" },
+	{ A_BLINK, 	"blink" },
+    };
+    /* *INDENT-ON* */
+
+    const char *result = 0;
+
+    if (state < SIZEOF(table)) {
+	*attr = table[state].attr;
+	result = table[state].msg;
+    }
+    return result;
+}
+
+/* fill the window with a test-pattern */
+static void
+fill_window(WINDOW *win)
+{
+    int y, x;
+    int y0 = -1, x0 = -1;
+
+    getyx(win, y, x);
+    wmove(win, 0, 0);
+    while (waddstr(win, "0123456789 abcdefghijklmnopqrstuvwxyz ") != ERR) {
+	int y1, x1;
+	getyx(win, y1, x1);
+	if (y1 == y0 && x1 == x0)
+	    break;
+	x0 = x1;
+	y0 = y1;
+    }
+    wmove(win, y, x);
+}
+
+static void
+show_status(WINDOW *win, STATUS * sp)
+{
+    int y, x;
+
+    getyx(win, y, x);
+    wmove(win, 0, 0);
+    wprintw(win, "Count %d", sp->count);
+    if (sp->v_msg != 0)
+	wprintw(win, " Video %s", sp->v_msg);
+    if (sp->c_msg != 0)
+	wprintw(win, " Color %s", sp->c_msg);
+    wclrtoeol(win);
+    wmove(win, y, x);
+}
+
+static void
+reshow_status(WINDOW *win, STATUS * sp)
+{
+    fill_window(win);
+    show_status(win, sp);
+}
+
+static void
+do_subwindow(WINDOW *win, STATUS * sp, void func(WINDOW *))
+{
+    WINDOW *win1 = newwin(sp->y_max - 2, sp->x_max - 2,
+			  sp->y_beg + 1, sp->x_beg + 1);
+
+    if (win1 != 0 && sp->y_max > 4 && sp->x_max > 4) {
+	WINDOW *win2 = derwin(win1, sp->y_max - 4, sp->x_max - 4, 1, 1);
+
+	if (win2 != 0) {
+	    box(win1, 0, 0);
+	    wrefresh(win1);
+	    func(win2);
+
+	    delwin(win2);
+	} else {
+	    beep();
+	}
+	delwin(win1);
+	touchwin(win);
+    } else {
+	if (win1)
+	    delwin(win1);
+	beep();
+    }
+}
+
+static void
+init_status(WINDOW *win, STATUS * sp)
+{
+    memset(sp, 0, sizeof(*sp));
+    sp->c = 99;
+    sp->v = 99;
+    sp->ch = ' ';
+
+    keypad(win, TRUE);
+    fill_window(win);
+
+    getbegyx(win, sp->y_beg, sp->x_beg);
+    getmaxyx(win, sp->y_max, sp->x_max);
+}
+
+static void
+show_help(WINDOW *win)
+{
+    static const char *table[] =
+    {
+	"Basic commands:"
+	,"Use h/j/k/l or arrow keys to move the cursor."
+	,"Set the count parameter for insert/delete by entering digits 0-9."
+	,""
+	,"Other commands:"
+	,"space toggles through the set of video attributes and colors."
+	,"t     touches (forces repaint) of the current line."
+	,"i     calls insertln at the current position with the given count."
+	,"d     calls deleteln at the window beginning with the given count."
+	,"I     calls insdelln at the window beginning with the given count."
+	,"D     calls insdelln at the window beginning with the given -count."
+	,"f     refills the window with test-pattern using current attributes."
+	,"w     recur to test windows other than stdscr"
+	,"q     quit"
+	,"=     resets count to zero."
+	,"?     shows this help-window"
+	,0
+    };
+
+    popup_msg(win, table);
+}
+
+static void
+update_status(WINDOW *win, STATUS * sp)
+{
+    switch (sp->ch) {
+    case ' ':			/* next test-iteration */
+	if (has_colors()) {
+	    if ((sp->c_msg = color_params(++(sp->c), &(sp->pair))) == 0) {
+		sp->c_msg = color_params(sp->c = 0, &(sp->pair));
+		if ((sp->v_msg = video_params(++(sp->v), &(sp->attr))) == 0) {
+		    sp->v_msg = video_params(sp->v = 0, &(sp->attr));
+		}
+	    }
+	} else {
+	    if ((sp->v_msg = video_params(++(sp->v), &(sp->attr))) == 0) {
+		sp->v_msg = video_params(sp->v = 0, &(sp->attr));
+	    }
+	}
+	sp->count = 0;
+	show_status(win, sp);
+	break;
+    case KEY_LEFT:
+    case 'h':
+	if (sp->x_val > 0)
+	    wmove(win, sp->y_val, --(sp->x_val));
+	break;
+    case KEY_DOWN:
+    case 'j':
+	if (sp->y_val < sp->y_max)
+	    wmove(win, ++(sp->y_val), sp->x_val);
+	break;
+    case KEY_UP:
+    case 'k':
+	if (sp->y_val > 0)
+	    wmove(win, --(sp->y_val), sp->x_val);
+	break;
+    case KEY_RIGHT:
+    case 'l':
+	if (sp->x_val < sp->x_max)
+	    wmove(win, sp->y_val, ++(sp->x_val));
+	break;
+    case 't':
+	touchline(win, sp->y_val, 1);
+	break;
+    case '=':
+	sp->count = 0;
+	show_status(win, sp);
+	break;
+    case HELP_KEY_1:
+	show_help(win);
+	break;
+    default:
+	if (isdigit(sp->ch)) {
+	    sp->count = (sp->count * 10) + (sp->ch - '0');
+	    show_status(win, sp);
+	} else {
+	    beep();
+	}
+	break;
+    }
+}
+
+static void
+test_winsdelln(WINDOW *win)
+{
+    STATUS st;
+    int n;
+
+    init_status(win, &st);
+
+    do {
+	(void) wattrset(win, AttrArg(COLOR_PAIR(st.pair), st.attr));
+	switch (st.ch) {
+	case 'i':
+	    for (n = 0; n < st.count; ++n)
+		winsertln(win);
+	    break;
+	case 'd':
+	    for (n = 0; n < st.count; ++n)
+		wdeleteln(win);
+	    break;
+	case 'I':
+	    winsdelln(win, st.count);
+	    break;
+	case 'D':
+	    winsdelln(win, -st.count);
+	    break;
+	case 'f':
+	    fill_window(win);
+	    reshow_status(win, &st);
+	    break;
+	case 'w':
+	    do_subwindow(win, &st, test_winsdelln);
+	    break;
+	case 'q':
+	    return;
+	default:
+	    update_status(win, &st);
+	    break;
+	}
+    } while ((st.ch = wgetch(win)) != ERR);
+}
+
+static void
+test_insdelln(void)
+{
+    STATUS st;
+    int n;
+
+    init_status(stdscr, &st);
+
+    do {
+	(void) attrset(AttrArg(COLOR_PAIR(st.pair), st.attr));
+	switch (st.ch) {
+	case 'i':
+	    for (n = 0; n < st.count; ++n)
+		insertln();
+	    break;
+	case 'd':
+	    for (n = 0; n < st.count; ++n)
+		deleteln();
+	    break;
+	case 'I':
+	    insdelln(st.count);
+	    break;
+	case 'D':
+	    insdelln(-st.count);
+	    break;
+	case 'f':
+	    fill_window(stdscr);
+	    reshow_status(stdscr, &st);
+	    break;
+	case 'w':
+	    do_subwindow(stdscr, &st, test_winsdelln);
+	    break;
+	case 'q':
+	    return;
+	default:
+	    update_status(stdscr, &st);
+	    break;
+	}
+    } while ((st.ch = getch()) != ERR);
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: insdelln [options]"
+	,""
+	,USAGE_COMMON
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) {
+	switch (ch) {
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind < argc)
+	usage(FALSE);
+
+    initscr();
+    cbreak();
+    noecho();
+
+    test_insdelln();
+    endwin();
+
+    ExitProgram(EXIT_SUCCESS);
+}
+
+#else
+int
+main(void)
+{
+    printf("This program requires the curses winsdelln function\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif
diff --git a/test/inserts.c b/test/inserts.c
new file mode 100644
index 0000000..b106ffc
--- /dev/null
+++ b/test/inserts.c
@@ -0,0 +1,454 @@
+/****************************************************************************
+ * Copyright 2020,2022 Thomas E. Dickey                                     *
+ * Copyright 2002-2016,2017 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: inserts.c,v 1.34 2022/12/10 22:28:50 tom Exp $
+ *
+ * Demonstrate the winsstr() and winsch functions.
+ * Thomas Dickey - 2002/10/19
+ */
+
+#include <test.priv.h>
+
+#if HAVE_WINSSTR
+
+#include <linedata.h>
+
+#define InsNStr    insnstr
+#define InsStr     insstr
+#define MvInsNStr  (void) mvinsnstr
+#define MvInsStr   (void) mvinsstr
+#define MvWInsNStr (void) mvwinsnstr
+#define MvWInsStr  (void) mvwinsstr
+#define WInsNStr   winsnstr
+#define WInsStr    winsstr
+
+#define InsCh      insch
+#define MvInsCh    (void) mvinsch
+#define MvWInsCh   (void) mvwinsch
+#define WInsCh     winsch
+
+#define MY_TABSIZE 8
+
+typedef enum {
+    oDefault = 0,
+    oMove = 1,
+    oWindow = 2,
+    oMoveWindow = 3
+} Options;
+
+static bool m_opt = FALSE;
+static bool w_opt = FALSE;
+static int n_opt = -1;
+
+static void
+legend(WINDOW *win, int level, Options state, char *buffer, int length)
+{
+    const char *showstate;
+
+    switch (state) {
+    default:
+    case oDefault:
+	showstate = "";
+	break;
+    case oMove:
+	showstate = " (mvXXX)";
+	break;
+    case oWindow:
+	showstate = " (winXXX)";
+	break;
+    case oMoveWindow:
+	showstate = " (mvwinXXX)";
+	break;
+    }
+
+    wmove(win, 0, 0);
+    wprintw(win,
+	    "The Strings/Chars displays should match.  Enter any characters, except:\n");
+    wprintw(win,
+	    "down-arrow or ^N to repeat on next line, ^W for inner window, ESC to exit.\n");
+    wclrtoeol(win);
+    wprintw(win, "Level %d,%s inserted %d characters <%s>", level,
+	    showstate, length, buffer);
+}
+
+static int
+ColOf(char *buffer, int length, int margin)
+{
+    int n;
+    int result;
+
+    for (n = 0, result = margin + 1; n < length; ++n) {
+	int ch = UChar(buffer[n]);
+	switch (ch) {
+	case '\n':
+	    /* actually newline should clear the remainder of the line
+	     * and move to the next line - but that seems a little awkward
+	     * in this example.
+	     */
+	case '\r':
+	    result = 0;
+	    break;
+	case '\b':
+	    if (result > 0)
+		--result;
+	    break;
+	case '\t':
+	    result += (MY_TABSIZE - (result % MY_TABSIZE));
+	    break;
+	case '\177':
+	    result += 2;
+	    break;
+	default:
+	    ++result;
+	    if (ch < 32)
+		++result;
+	    break;
+	}
+    }
+    return result;
+}
+
+#define LEN(n) ((length - (n) > n_opt) ? n_opt : (length - (n)))
+static void
+test_inserts(int level)
+{
+    static bool first = TRUE;
+
+    int ch;
+    int limit;
+    int row = 1;
+    int col;
+    int row2, col2;
+    int length;
+    char buffer[BUFSIZ];
+    WINDOW *look = 0;
+    WINDOW *work = 0;
+    WINDOW *show = 0;
+    int margin = (2 * MY_TABSIZE) - 1;
+    Options option = (Options) ((unsigned) (m_opt
+					    ? oMove
+					    : oDefault)
+				| (unsigned) ((w_opt || (level > 0))
+					      ? oWindow
+					      : oDefault));
+
+    if (first) {
+	static char cmd[80];
+	setlocale(LC_ALL, "");
+
+	_nc_STRCPY(cmd, "TABSIZE=8", sizeof(cmd));
+	putenv(cmd);
+
+	initscr();
+	(void) cbreak();	/* take input chars one at a time, no wait for \n */
+	(void) noecho();	/* don't echo input */
+	keypad(stdscr, TRUE);
+
+	/*
+	 * Show the characters inserted in color, to distinguish from those
+	 * that are shifted.
+	 */
+	if (has_colors()) {
+	    start_color();
+	    init_pair(1, COLOR_WHITE, COLOR_BLUE);
+	}
+    }
+
+    limit = LINES - 5;
+    if (level > 0) {
+	look = newwin(limit, COLS - (2 * (level - 1)), 0, level - 1);
+	work = newwin(limit - 2, COLS - (2 * level), 1, level);
+	show = newwin(4, COLS, limit + 1, 0);
+	box(look, 0, 0);
+	wnoutrefresh(look);
+	limit -= 2;
+    } else {
+	work = stdscr;
+	show = derwin(stdscr, 4, COLS, limit + 1, 0);
+    }
+    keypad(work, TRUE);
+
+    for (col = margin + 1; col < COLS; col += MY_TABSIZE)
+	MvWVLine(work, row, col, '.', limit - 2);
+
+    MvWVLine(work, row, margin, ACS_VLINE, limit - 2);
+    MvWVLine(work, row, margin + 1, ACS_VLINE, limit - 2);
+    limit /= 2;
+
+    MvWAddStr(work, 1, 2, "String");
+    MvWAddStr(work, limit + 1, 2, "Chars");
+    wnoutrefresh(work);
+
+    buffer[length = 0] = '\0';
+    legend(show, level, option, buffer, length);
+    wnoutrefresh(show);
+
+    doupdate();
+
+    if (has_colors()) {
+	wbkgdset(work, (chtype) (COLOR_PAIR(1) | ' '));
+    }
+
+    while ((ch = read_linedata(work)) != ERR && !isQUIT(ch)) {
+	wmove(work, row, margin + 1);
+	switch (ch) {
+	case key_RECUR:
+	    test_inserts(level + 1);
+
+	    if (look)
+		touchwin(look);
+	    touchwin(work);
+	    touchwin(show);
+
+	    if (look)
+		wnoutrefresh(look);
+	    wnoutrefresh(work);
+	    wnoutrefresh(show);
+
+	    doupdate();
+	    break;
+	case key_NEWLINE:
+	    if (row < limit) {
+		++row;
+		/* put the whole string in, all at once */
+		col2 = margin + 1;
+		switch (option) {
+		case oDefault:
+		    if (n_opt > 1) {
+			for (col = 0; col < length; col += n_opt) {
+			    col2 = ColOf(buffer, col, margin);
+			    if (move(row, col2) != ERR) {
+				InsNStr(buffer + col, LEN(col));
+			    }
+			}
+		    } else {
+			if (move(row, col2) != ERR) {
+			    InsStr(buffer);
+			}
+		    }
+		    break;
+		case oMove:
+		    if (n_opt > 1) {
+			for (col = 0; col < length; col += n_opt) {
+			    col2 = ColOf(buffer, col, margin);
+			    MvInsNStr(row, col2, buffer + col, LEN(col));
+			}
+		    } else {
+			MvInsStr(row, col2, buffer);
+		    }
+		    break;
+		case oWindow:
+		    if (n_opt > 1) {
+			for (col = 0; col < length; col += n_opt) {
+			    col2 = ColOf(buffer, col, margin);
+			    if (wmove(work, row, col2) != ERR) {
+				WInsNStr(work, buffer + col, LEN(col));
+			    }
+			}
+		    } else {
+			if (wmove(work, row, col2) != ERR) {
+			    WInsStr(work, buffer);
+			}
+		    }
+		    break;
+		case oMoveWindow:
+		    if (n_opt > 1) {
+			for (col = 0; col < length; col += n_opt) {
+			    col2 = ColOf(buffer, col, margin);
+			    MvWInsNStr(work, row, col2, buffer + col, LEN(col));
+			}
+		    } else {
+			MvWInsStr(work, row, col2, buffer);
+		    }
+		    break;
+		}
+
+		/* do the corresponding single-character insertion */
+		row2 = limit + row;
+		for (col = 0; col < length; ++col) {
+		    col2 = ColOf(buffer, col, margin);
+		    switch (option) {
+		    case oDefault:
+			if (move(row2, col2) != ERR) {
+			    InsCh(UChar(buffer[col]));
+			}
+			break;
+		    case oMove:
+			MvInsCh(row2, col2, UChar(buffer[col]));
+			break;
+		    case oWindow:
+			if (wmove(work, row2, col2) != ERR) {
+			    WInsCh(work, UChar(buffer[col]));
+			}
+			break;
+		    case oMoveWindow:
+			MvWInsCh(work, row2, col2, UChar(buffer[col]));
+			break;
+		    }
+		}
+	    } else {
+		beep();
+	    }
+	    break;
+	default:
+	    if (ch <= 0 || ch > 255) {
+		beep();
+		break;
+	    }
+	    if (length >= BUFSIZ - 2)
+		break;
+	    buffer[length++] = (char) ch;
+	    buffer[length] = '\0';
+
+	    /* put the string in, one character at a time */
+	    col = ColOf(buffer, length - 1, margin);
+	    switch (option) {
+	    case oDefault:
+		if (move(row, col) != ERR) {
+		    InsStr(buffer + length - 1);
+		}
+		break;
+	    case oMove:
+		MvInsStr(row, col, buffer + length - 1);
+		break;
+	    case oWindow:
+		if (wmove(work, row, col) != ERR) {
+		    WInsStr(work, buffer + length - 1);
+		}
+		break;
+	    case oMoveWindow:
+		MvWInsStr(work, row, col, buffer + length - 1);
+		break;
+	    }
+
+	    /* do the corresponding single-character insertion */
+	    switch (option) {
+	    case oDefault:
+		if (move(limit + row, col) != ERR) {
+		    InsCh(UChar(ch));
+		}
+		break;
+	    case oMove:
+		MvInsCh(limit + row, col, UChar(ch));
+		break;
+	    case oWindow:
+		if (wmove(work, limit + row, col) != ERR) {
+		    WInsCh(work, UChar(ch));
+		}
+		break;
+	    case oMoveWindow:
+		MvWInsCh(work, limit + row, col, UChar(ch));
+		break;
+	    }
+
+	    wnoutrefresh(work);
+
+	    legend(show, level, option, buffer, length);
+	    wnoutrefresh(show);
+
+	    doupdate();
+	    break;
+	}
+    }
+    if (level > 0) {
+	delwin(work);
+	delwin(look);
+    }
+    delwin(show);
+}
+
+static void
+usage(int ok)
+{
+    static const char *tbl[] =
+    {
+	"Usage: inserts [options]"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+	," -f FILE  read data from given file"
+	," -n NUM   limit string-inserts to NUM bytes on ^N replay"
+	," -m       perform wmove/move separately from insert-functions"
+	," -w       use window-parameter even when stdscr would be implied"
+    };
+    unsigned n;
+    for (n = 0; n < SIZEOF(tbl); ++n)
+	fprintf(stderr, "%s\n", tbl[n]);
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+
+    setlocale(LC_ALL, "");
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "f:mn:w")) != -1) {
+	switch (ch) {
+	case 'f':
+	    init_linedata(optarg);
+	    break;
+	case 'm':
+	    m_opt = TRUE;
+	    break;
+	case 'n':
+	    n_opt = atoi(optarg);
+	    if (n_opt == 0)
+		n_opt = -1;
+	    break;
+	case 'w':
+	    w_opt = TRUE;
+	    break;
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind < argc)
+	usage(FALSE);
+
+    test_inserts(0);
+    endwin();
+    ExitProgram(EXIT_SUCCESS);
+}
+#else
+int
+main(void)
+{
+    printf("This program requires the winsstr function\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif /* HAVE_WINSSTR */
diff --git a/test/key_names.c b/test/key_names.c
new file mode 100644
index 0000000..fa7fdba
--- /dev/null
+++ b/test/key_names.c
@@ -0,0 +1,115 @@
+/****************************************************************************
+ * Copyright 2020,2022 Thomas E. Dickey                                     *
+ * Copyright 2007-2014,2017 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: key_names.c,v 1.11 2022/12/04 00:40:11 tom Exp $
+ */
+
+#include <test.priv.h>
+
+#if USE_WIDEC_SUPPORT
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: key_names"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+	," -m       call meta(TRUE) in initialization"
+	," -s       call newterm, etc., to complete initialization"
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+    int n;
+
+    bool do_setup = FALSE;
+    bool do_meta = FALSE;
+
+    setlocale(LC_ALL, "");
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "ms")) != -1) {
+	switch (ch) {
+	case 'm':
+	    do_meta = TRUE;
+	    break;
+	case 's':
+	    do_setup = TRUE;
+	    break;
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+
+    if (do_setup) {
+	/*
+	 * Get the terminfo entry into memory, and tell ncurses that we want to
+	 * use function keys.  That will make it add any user-defined keys that
+	 * appear in the terminfo.
+	 */
+	newterm(getenv("TERM"), stderr, stdin);
+	keypad(stdscr, TRUE);
+	if (do_meta)
+	    meta(stdscr, TRUE);
+	endwin();
+    }
+    for (n = -1; n < KEY_MAX + 512; n++) {
+	int check = wcwidth((wchar_t) n);
+	const char *result = check >= 0 ? key_name((wchar_t) n) : "?";
+	if (result != 0)
+	    printf("%d(%5o):%s\n", n, n, result);
+    }
+    ExitProgram(EXIT_SUCCESS);
+}
+#else
+int
+main(void)
+{
+    printf("This program requires the wide-ncurses library\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif
diff --git a/test/keynames.c b/test/keynames.c
new file mode 100644
index 0000000..cae260f
--- /dev/null
+++ b/test/keynames.c
@@ -0,0 +1,104 @@
+/****************************************************************************
+ * Copyright 2020,2022 Thomas E. Dickey                                     *
+ * Copyright 1998-2006,2008 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: keynames.c,v 1.13 2022/12/04 00:40:11 tom Exp $
+ */
+
+#include <test.priv.h>
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: keynames"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+	," -m       call meta(TRUE) in initialization"
+	," -s       call newterm, etc., to complete initialization"
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+    int n;
+    bool do_setup = FALSE;
+    bool do_meta = FALSE;
+
+    setlocale(LC_ALL, "");
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "ms")) != -1) {
+	switch (ch) {
+	case 'm':
+	    do_meta = TRUE;
+	    break;
+	case 's':
+	    do_setup = TRUE;
+	    break;
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+
+    if (do_setup) {
+	/*
+	 * Get the terminfo entry into memory, and tell ncurses that we want to
+	 * use function keys.  That will make it add any user-defined keys that
+	 * appear in the terminfo.
+	 */
+	newterm(getenv("TERM"), stderr, stdin);
+	keypad(stdscr, TRUE);
+	if (do_meta)
+	    meta(stdscr, TRUE);
+	endwin();
+    }
+
+    for (n = -1; n < KEY_MAX + 512; n++) {
+	const char *result = keyname(n);
+	if (result != 0)
+	    printf("%d(%5o):%s\n", n, n, result);
+    }
+    ExitProgram(EXIT_SUCCESS);
+}
diff --git a/test/knight.c b/test/knight.c
new file mode 100644
index 0000000..b15c4d2
--- /dev/null
+++ b/test/knight.c
@@ -0,0 +1,963 @@
+/****************************************************************************
+ * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2013,2017 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.                                                           *
+ ****************************************************************************/
+/*
+ * Knight's Tour - a brain game
+ *
+ * The original of this game was anonymous.  It had an unbelievably bogus
+ * interface, you actually had to enter square coordinates!  Redesign by
+ * Eric S. Raymond <esr@snark.thyrsus.com> July 22 1995.  Mouse support
+ * added September 20th 1995.
+ *
+ * $Id: knight.c,v 1.52 2022/12/04 00:40:11 tom Exp $
+ */
+
+#include <test.priv.h>
+
+/* board size */
+#define YLIMIT		8
+#define XLIMIT		8
+#define MAXMOVES	(ylimit * xlimit)
+
+/* where to start the instructions */
+#define INSTRY		2
+#define INSTRX		35
+
+/* corner of board */
+#define BOARDY		2
+#define BOARDX		0
+
+/* notification line */
+#define NOTIFYY		21
+
+/* virtual color values */
+#define TRAIL_COLOR	1
+#define PLUS_COLOR	2
+#define MINUS_COLOR	3
+
+#define CX(x)		(2 + 4 * (x))
+#define CY(y)		(1 + 2 * (y))
+#define cellmove(y, x)	wmove(boardwin, CY(y), CX(x))
+#define CXINV(x)	(((x) - 1) / 4)
+#define CYINV(y)	(((y) - 2) / 2)
+
+typedef struct {
+    int x, y;
+} HISTORY;
+
+typedef int SQUARES[YLIMIT][XLIMIT];
+
+static WINDOW *boardwin;	/* the board window */
+static WINDOW *helpwin;		/* the help window */
+static WINDOW *msgwin;		/* the message window */
+
+#if HAVE_USE_DEFAULT_COLORS
+static bool d_option;
+#endif
+
+static chtype minus = '-';	/* possible-move character */
+static chtype oldch;
+static chtype plus = '+';	/* cursor hot-spot character */
+static chtype trail = '#';	/* trail character */
+
+static int ylimit = YLIMIT;
+static int xlimit = XLIMIT;
+static int maxmoves = (YLIMIT * XLIMIT);
+
+static int count_tries;		/* count of trials so far */
+static int test_test;		/* FIXME */
+/* *INDENT-OFF* */
+static const struct {
+    int y;
+    int x;
+} offsets[] = {
+    {  2,  1 },
+    {  1,  2 },
+    { -1,  2 },
+    { -2,  1 },
+    { -2, -1 },
+    { -1, -2 },
+    {  1, -2 },
+    {  2, -1 },
+};
+#define MAX_OFFSET	(unsigned)SIZEOF(offsets)
+/* *INDENT-ON* */
+
+static void
+init_program(void)
+{
+    setlocale(LC_ALL, "");
+
+    srand((unsigned) getpid());
+    initscr();
+    cbreak();			/* immediate char return */
+    noecho();			/* no immediate echo */
+
+    maxmoves = MAXMOVES;
+    boardwin = newwin(ylimit * 2 + 1, xlimit * 4 + 1, BOARDY, BOARDX);
+    helpwin = newwin(0, 0, INSTRY, INSTRX);
+    msgwin = newwin(1, INSTRX - 1, NOTIFYY, 0);
+
+    scrollok(msgwin, TRUE);
+    keypad(boardwin, TRUE);
+
+    if (has_colors()) {
+	int bg = COLOR_BLACK;
+
+	start_color();
+#if HAVE_USE_DEFAULT_COLORS
+	if (d_option && (use_default_colors() == OK))
+	    bg = -1;
+#endif
+
+	(void) init_pair(TRAIL_COLOR, (short) COLOR_CYAN, (short) bg);
+	(void) init_pair(PLUS_COLOR, (short) COLOR_RED, (short) bg);
+	(void) init_pair(MINUS_COLOR, (short) COLOR_GREEN, (short) bg);
+
+	trail |= (chtype) COLOR_PAIR(TRAIL_COLOR);
+	plus |= (chtype) COLOR_PAIR(PLUS_COLOR);
+	minus |= (chtype) COLOR_PAIR(MINUS_COLOR);
+    }
+#ifdef NCURSES_MOUSE_VERSION
+    (void) mousemask(BUTTON1_CLICKED, (mmask_t *) NULL);
+#endif /* NCURSES_MOUSE_VERSION */
+#if defined(PDCURSES)
+    mouse_set(BUTTON1_RELEASED);
+#endif
+
+    oldch = minus;
+}
+
+static void
+help1(void)
+/* game explanation -- initial help screen */
+{
+    (void) waddstr(helpwin, "Knight's move is a solitaire puzzle.  Your\n");
+    (void) waddstr(helpwin, "objective is to visit each square of the  \n");
+    (void) waddstr(helpwin, "chessboard exactly once by making knight's\n");
+    (void) waddstr(helpwin, "moves (one square right or left followed  \n");
+    (void) waddstr(helpwin, "by two squares up or down, or two squares \n");
+    (void) waddstr(helpwin, "right or left followed by one square up or\n");
+    (void) waddstr(helpwin, "down).  You may start anywhere.\n\n");
+
+    (void) waddstr(helpwin, "Use arrow keys to move the cursor around.\n");
+    (void) waddstr(helpwin, "When you want to move your knight to the \n");
+    (void) waddstr(helpwin, "cursor location, press <space> or Enter.\n");
+    (void) waddstr(helpwin, "Illegal moves will be rejected with an  \n");
+    (void) waddstr(helpwin, "audible beep.\n\n");
+    (void) waddstr(helpwin, "The program will detect if you solve the\n");
+    (void) waddstr(helpwin, "puzzle; also inform you when you run out\n");
+    (void) waddstr(helpwin, "of legal moves.\n\n");
+
+    MvWAddStr(helpwin, NOTIFYY - INSTRY, 0,
+	      "Press `?' to go to keystroke help.");
+}
+
+static void
+help2(void)
+/* keystroke help screen */
+{
+    (void) waddstr(helpwin, "Possible moves are shown with `-'.\n\n");
+
+    (void) waddstr(helpwin, "You can move around with the arrow keys or\n");
+    (void) waddstr(helpwin, "with the rogue/hack movement keys.  Other\n");
+    (void) waddstr(helpwin, "commands allow you to undo moves or redraw.\n");
+    (void) waddstr(helpwin, "Your mouse may work; try left-button to\n");
+    (void) waddstr(helpwin, "move to the square under the pointer.\n\n");
+
+    (void) waddstr(helpwin, "x,q -- exit             y k u    7 8 9\n");
+    (void) waddstr(helpwin, "r -- redraw screen       \\|/      \\|/ \n");
+    (void) waddstr(helpwin, "bksp -- undo move       h-+-l    4-+-6\n");
+    (void) waddstr(helpwin, "a -- autojump            /|\\      /|\\ \n");
+    if (ylimit <= 6) {
+	(void) waddstr(helpwin, "R -- solve (slow)       b j n    1 2 3\n");
+    } else {
+	(void) waddstr(helpwin, "                        b j n    1 2 3\n");
+    }
+
+    (void) waddstr(helpwin, "\nYou can place your knight on the selected\n");
+    (void) waddstr(helpwin, "square with spacebar, Enter, or the keypad\n");
+    (void) waddstr(helpwin, "center key.  Use F/B to review the path.\n");
+
+    MvWAddStr(helpwin, NOTIFYY - INSTRY, 0,
+	      "Press `?' to go to game explanation");
+}
+
+static void
+show_help(bool * keyhelp)
+{
+    werase(helpwin);
+    if (*keyhelp) {
+	help1();
+	*keyhelp = FALSE;
+    } else {
+	help2();
+	*keyhelp = TRUE;
+    }
+    wrefresh(helpwin);
+}
+
+static inline bool
+isValidYX(int y, int x)
+{
+    return (y >= 0 && y < ylimit && x >= 0 && x < xlimit) ? TRUE : FALSE;
+}
+
+static inline bool
+isUnusedYX(SQUARES squares, int y, int x)
+{
+    return (isValidYX(y, x) && (!squares[y][x]) ? TRUE : FALSE);
+}
+
+static bool
+boardIsFilled(SQUARES squares, int y, int x)
+{
+    unsigned n;
+
+    for (n = 0; n < MAX_OFFSET; n++) {
+	if (isUnusedYX(squares, y + offsets[n].y, x + offsets[n].x)) {
+	    return FALSE;
+	}
+    }
+    return TRUE;
+}
+
+static void
+drawBoard(void)
+{
+    int i, j;
+
+    MvAddStr(0, 20, "KNIGHT'S MOVE -- a logical solitaire");
+
+    move(BOARDY, BOARDX);
+    waddch(boardwin, ACS_ULCORNER);
+    for (j = 0; j < (ylimit - 1); j++) {
+	waddch(boardwin, ACS_HLINE);
+	waddch(boardwin, ACS_HLINE);
+	waddch(boardwin, ACS_HLINE);
+	waddch(boardwin, ACS_TTEE);
+    }
+    waddch(boardwin, ACS_HLINE);
+    waddch(boardwin, ACS_HLINE);
+    waddch(boardwin, ACS_HLINE);
+    waddch(boardwin, ACS_URCORNER);
+
+    for (i = 1; i < ylimit; i++) {
+	move(BOARDY + i * 2 - 1, BOARDX);
+	waddch(boardwin, ACS_VLINE);
+	for (j = 0; j < xlimit; j++) {
+	    waddch(boardwin, ' ');
+	    waddch(boardwin, ' ');
+	    waddch(boardwin, ' ');
+	    waddch(boardwin, ACS_VLINE);
+	}
+	move(BOARDY + i * 2, BOARDX);
+	waddch(boardwin, ACS_LTEE);
+	for (j = 0; j < xlimit - 1; j++) {
+	    waddch(boardwin, ACS_HLINE);
+	    waddch(boardwin, ACS_HLINE);
+	    waddch(boardwin, ACS_HLINE);
+	    waddch(boardwin, ACS_PLUS);
+	}
+	waddch(boardwin, ACS_HLINE);
+	waddch(boardwin, ACS_HLINE);
+	waddch(boardwin, ACS_HLINE);
+	waddch(boardwin, ACS_RTEE);
+    }
+
+    move(BOARDY + i * 2 - 1, BOARDX);
+    waddch(boardwin, ACS_VLINE);
+    for (j = 0; j < xlimit; j++) {
+	waddch(boardwin, ' ');
+	waddch(boardwin, ' ');
+	waddch(boardwin, ' ');
+	waddch(boardwin, ACS_VLINE);
+    }
+
+    move(BOARDY + i * 2, BOARDX);
+    waddch(boardwin, ACS_LLCORNER);
+    for (j = 0; j < xlimit - 1; j++) {
+	waddch(boardwin, ACS_HLINE);
+	waddch(boardwin, ACS_HLINE);
+	waddch(boardwin, ACS_HLINE);
+	waddch(boardwin, ACS_BTEE);
+    }
+    waddch(boardwin, ACS_HLINE);
+    waddch(boardwin, ACS_HLINE);
+    waddch(boardwin, ACS_HLINE);
+    waddch(boardwin, ACS_LRCORNER);
+}
+
+static void
+mark_possibles(SQUARES squares, int y, int x, chtype mark)
+{
+    unsigned n;
+
+    for (n = 0; n < MAX_OFFSET; n++) {
+	if (isUnusedYX(squares, y + offsets[n].y, x + offsets[n].x)) {
+	    cellmove(y + offsets[n].y, x + offsets[n].x);
+	    waddch(boardwin, mark);
+	}
+    }
+}
+
+static bool
+find_next_move(SQUARES squares, HISTORY * doneData, int doneSize, int *y, int *x)
+{
+    bool result = FALSE;
+
+    if (doneSize > 1) {
+	unsigned j;
+	int oldy = doneData[doneSize - 1].y;
+	int oldx = doneData[doneSize - 1].x;
+	int found = -1;
+	int first = -1;
+	int next = -1;
+
+	for (j = 0; j < MAX_OFFSET * 2; j++) {
+	    unsigned k = j % MAX_OFFSET;
+	    int newy = oldy + offsets[k].y;
+	    int newx = oldx + offsets[k].x;
+	    if (isUnusedYX(squares, newy, newx)) {
+		if (first < 0)
+		    first = (int) k;
+		if (newy == *y
+		    && newx == *x) {
+		    found = (int) k;
+		} else if (found >= 0) {
+		    next = (int) k;
+		    break;
+		}
+	    }
+	}
+	if (found < 0)
+	    next = first;
+	if (next >= 0) {
+	    *y = oldy + offsets[next].y;
+	    *x = oldx + offsets[next].x;
+	}
+	result = TRUE;
+    }
+    return result;
+}
+
+static void
+count_next_moves(SQUARES squares, int count_moves, int y, int x)
+{
+    int count = 0;
+    unsigned j;
+
+    wprintw(msgwin, "\nMove %d", count_moves);
+    for (j = 0; j < MAX_OFFSET; j++) {
+	int newy = y + offsets[j].y;
+	int newx = x + offsets[j].x;
+	if (isUnusedYX(squares, newy, newx)) {
+	    ++count;
+	}
+    }
+    wprintw(msgwin, ", gives %d choices", count);
+    wclrtoeol(msgwin);
+}
+
+static void
+unmarkcell(int row, int column)
+{
+    cellmove(row, column);
+    waddch(boardwin, '\b');
+    waddch(boardwin, ' ');
+    waddch(boardwin, minus);
+    waddch(boardwin, ' ');
+}
+
+static void
+markcell(chtype tchar, int row, int column)
+{
+    cellmove(row, column);
+    waddch(boardwin, '\b');
+    waddch(boardwin, tchar);
+    waddch(boardwin, tchar);
+    waddch(boardwin, tchar);
+}
+
+static void
+drawMove(SQUARES squares, int count_moves, chtype tchar, int oldy, int oldx, int
+	 row, int column)
+/* place the stars, update board & currents */
+{
+    if (count_moves <= 1) {
+	int i, j;
+
+	for (i = 0; i < ylimit; i++) {
+	    for (j = 0; j < xlimit; j++) {
+		if (count_moves == 0) {
+		    unmarkcell(i, j);
+		} else {
+		    cellmove(i, j);
+		    if (winch(boardwin) == minus)
+			waddch(boardwin, ' ');
+		}
+	    }
+	}
+    } else {
+	markcell(tchar, oldy, oldx);
+	mark_possibles(squares, oldy, oldx, ' ');
+    }
+
+    if (row >= 0 && column >= 0) {
+	markcell(trail, row, column);
+	mark_possibles(squares, row, column, minus);
+	squares[row][column] = TRUE;
+    }
+
+    wprintw(msgwin, "\nMove %d", count_moves);
+    if (count_tries != count_moves)
+	wprintw(msgwin, " (%d tries)", count_tries);
+    wclrtoeol(msgwin);
+}
+
+static int
+iabs(int num)
+{
+    if (num < 0)
+	return (-num);
+    else
+	return (num);
+}
+
+static bool
+evaluate_move(SQUARES squares, HISTORY * doneData, int doneSize, int row, int column)
+{
+    if (doneSize <= 1)
+	return (TRUE);
+    else if (squares[row][column] == TRUE) {
+	waddstr(msgwin, "\nYou've already been there.");
+	return (FALSE);
+    } else {
+	int rdif = iabs(row - doneData[doneSize - 1].y);
+	int cdif = iabs(column - doneData[doneSize - 1].x);
+
+	if (!((rdif == 1) && (cdif == 2)) && !((rdif == 2) && (cdif == 1))) {
+	    waddstr(msgwin, "\nThat's not a legal knight's move.");
+	    return (FALSE);
+	}
+    }
+
+    return (TRUE);
+}
+
+static int
+completed(SQUARES squares)
+{
+    int i, j, count = 0;
+
+    for (i = 0; i < ylimit; i++) {
+	for (j = 0; j < xlimit; j++) {
+	    if (squares[i][j] != 0) {
+		count += 1;
+	    }
+	}
+    }
+    return ((count == maxmoves) ? -1 : count);
+}
+
+static void
+no_previous_move(void)
+{
+    waddstr(msgwin, "\nNo previous move.");
+    beep();
+}
+
+/* Recursively try all possible moves, starting from (y,x) */
+static int
+recurBack(SQUARES squares, int y, int x, int total)
+{
+    int longest = total;
+    int best_x = x;
+    int best_y = y;
+    int result;
+
+    if (total < maxmoves) {
+	unsigned k;
+
+	for (k = 0; k < MAX_OFFSET; k++) {
+	    int try_x = x + offsets[k].x;
+	    int try_y = y + offsets[k].y;
+	    if (isUnusedYX(squares, try_y, try_x)) {
+		++test_test;
+		squares[try_y][try_x] = total + 1;
+		result = recurBack(squares, try_y, try_x, total + 1);
+		if (result > longest) {
+		    longest = result;
+		    best_x = try_x;
+		    best_y = try_y;
+		}
+		if (result >= maxmoves)
+		    break;
+		squares[try_y][try_x] = 0;	/* allow retry... */
+	    }
+	}
+    }
+
+    result = total;
+    if (longest > total) {
+	result = longest;
+	squares[best_y][best_x] = total + 1;
+	(void) recurBack(squares, best_y, best_x, total + 1);
+	if (result < maxmoves)
+	    squares[best_y][best_x] = 0;
+    }
+
+    return result;
+}
+
+/*
+ * Solve the Knight Tour problem using backtracking, returning the length of
+ * the resulting solution.  If this is invoked from a point where the remaining
+ * choices cannot complete the tour, the result will fall short.
+ */
+static int
+useBacktracking(SQUARES result, HISTORY * doneData, int doneSize)
+{
+    int y = 0, x = 0, n;
+    SQUARES squares;
+    int total;
+    int actual = doneSize - 1;
+
+    memset(squares, 0, sizeof(squares));
+    for (n = 1; n <= actual; ++n) {
+	y = doneData[n].y;
+	x = doneData[n].x;
+	squares[y][x] = n;
+    }
+
+    total = recurBack(squares, y, x, actual);
+    if (total > actual) {
+	for (y = 0; y < ylimit; ++y) {
+	    for (x = 0; x < xlimit; ++x) {
+		result[y][x] = squares[y][x];
+		if ((n = squares[y][x]) != 0) {
+		    doneData[n].y = y;
+		    doneData[n].x = x;
+		}
+	    }
+	}
+    }
+    return total;
+}
+
+static int
+reviewHistory(HISTORY * history, int count_moves, int review, int *ny, int *nx)
+{
+    if (review < 0) {
+	beep();
+	review = 0;
+    } else if (review > count_moves - 2) {
+	beep();
+	review = count_moves - 2;
+    } else {
+	*ny = history[count_moves - review - 1].y;
+	*nx = history[count_moves - review - 1].x;
+	wprintw(msgwin, "\nReview %d:%d.", count_moves - review - 1,
+		count_moves - 1);
+	wrefresh(msgwin);
+    }
+    return review;
+}
+
+static void
+play(void)
+/* play the game */
+{
+    bool keyhelp;		/* TRUE if keystroke help is up */
+    int i, j, count;
+    int lastcol;		/* last location visited */
+    int lastrow;
+    int ny = 0, nx = 0;
+    int review = 0;		/* review history */
+    int test_size;
+    int rw = 0, col = 0;	/* current row and column */
+
+    do {
+	SQUARES squares;
+	HISTORY history[(YLIMIT * XLIMIT) + 1];
+	int count_moves = 0;	/* count of moves so far */
+
+	/* clear screen and draw board */
+	werase(boardwin);
+	werase(helpwin);
+	werase(msgwin);
+	drawBoard();
+	help1();
+	wnoutrefresh(stdscr);
+	wnoutrefresh(helpwin);
+	wnoutrefresh(msgwin);
+	wnoutrefresh(boardwin);
+	doupdate();
+
+	for (i = 0; i < ylimit; i++) {
+	    for (j = 0; j < xlimit; j++) {
+		unmarkcell(i, j);
+	    }
+	}
+	memset(squares, 0, sizeof(squares));
+	memset(history, 0, sizeof(history));
+	history[0].y = history[0].x = -1;
+	history[1].y = history[1].x = -1;
+	lastrow = lastcol = -2;
+	count_moves = 1;
+	count_tries = 1;
+	keyhelp = FALSE;
+	show_help(&keyhelp);
+
+	for (;;) {
+	    if (rw != lastrow || col != lastcol) {
+		if (lastrow >= 0 && lastcol >= 0) {
+		    cellmove(lastrow, lastcol);
+		    if (squares[lastrow][lastcol])
+			waddch(boardwin, trail);
+		    else
+			waddch(boardwin, oldch);
+		}
+
+		cellmove(rw, col);
+		oldch = winch(boardwin);
+
+		lastrow = rw;
+		lastcol = col;
+	    }
+	    cellmove(rw, col);
+	    waddch(boardwin, plus);
+	    cellmove(rw, col);
+
+	    wrefresh(msgwin);
+
+	    switch (wgetch(boardwin)) {
+	    case 'k':
+	    case '8':
+	    case KEY_UP:
+		ny = rw + ylimit - 1;
+		nx = col;
+		break;
+	    case 'j':
+	    case '2':
+	    case KEY_DOWN:
+		ny = rw + 1;
+		nx = col;
+		break;
+	    case 'h':
+	    case '4':
+	    case KEY_LEFT:
+		ny = rw;
+		nx = col + xlimit - 1;
+		break;
+	    case 'l':
+	    case '6':
+	    case KEY_RIGHT:
+		ny = rw;
+		nx = col + 1;
+		break;
+	    case 'y':
+	    case '7':
+	    case KEY_A1:
+		ny = rw + ylimit - 1;
+		nx = col + xlimit - 1;
+		break;
+	    case 'b':
+	    case '1':
+	    case KEY_C1:
+		ny = rw + 1;
+		nx = col + xlimit - 1;
+		break;
+	    case 'u':
+	    case '9':
+	    case KEY_A3:
+		ny = rw + ylimit - 1;
+		nx = col + 1;
+		break;
+	    case 'n':
+	    case '3':
+	    case KEY_C3:
+		ny = rw + 1;
+		nx = col + 1;
+		break;
+
+#ifdef KEY_MOUSE
+	    case KEY_MOUSE:
+#ifdef NCURSES_MOUSE_VERSION
+		{
+		    MEVENT myevent;
+
+		    getmouse(&myevent);
+		    if (myevent.y >= CY(0) && myevent.y <= CY(ylimit)
+			&& myevent.x >= CX(0) && myevent.x <= CX(xlimit)) {
+			nx = CXINV(myevent.x);
+			ny = CYINV(myevent.y);
+			ungetch('\n');
+			break;
+		    } else {
+			beep();
+			continue;
+		    }
+		}
+#endif /* NCURSES_MOUSE_VERSION */
+#ifdef PDCURSES
+		{
+		    int test_y, test_x;
+		    request_mouse_pos();
+		    test_y = MOUSE_Y_POS + 0;
+		    test_x = MOUSE_X_POS + 1;
+		    if (test_y >= CY(0) && test_y <= CY(ylimit)
+			&& test_x >= CX(0) && test_x <= CX(xlimit)) {
+			ny = CYINV(test_y);
+			nx = CXINV(test_x);
+			wmove(helpwin, 0, 0);
+			wrefresh(helpwin);
+			ungetch('\n');
+		    }
+		    break;
+		}
+#endif /* PDCURSES */
+#endif /* KEY_MOUSE */
+
+	    case KEY_B2:
+	    case '\n':
+	    case ' ':
+		review = 0;
+		if (evaluate_move(squares, history, count_moves, rw, col)) {
+		    drawMove(squares,
+			     count_moves,
+			     trail,
+			     history[count_moves - 1].y,
+			     history[count_moves - 1].x,
+			     rw, col);
+		    history[count_moves].y = (short) rw;
+		    history[count_moves].x = (short) col;
+		    count_moves++;
+		    count_tries++;
+
+		    if (boardIsFilled(squares, rw, col)) {
+			if (completed(squares) < 0) {
+			    waddstr(msgwin, "\nYou won.");
+			} else {
+			    waddstr(msgwin,
+				    "\nNo further moves are possible.");
+			}
+		    }
+		} else {
+		    beep();
+		}
+		break;
+
+	    case KEY_UNDO:
+	    case KEY_BACKSPACE:
+	    case '\b':
+		review = 0;
+		if (count_moves <= 0) {
+		    no_previous_move();
+		} else if (count_moves <= 1) {
+		    ny = history[count_moves].y;
+		    nx = history[count_moves].x;
+		    if (nx < 0 || ny < 0) {
+			ny = (lastrow >= 0) ? lastrow : 0;
+			nx = (lastcol >= 0) ? lastcol : 0;
+		    }
+		    count_moves = 0;
+		    squares[ny][nx] = FALSE;
+		    oldch = minus;
+		    drawMove(squares, count_moves, ' ', ny, nx, -1, -1);
+		    count_moves = 1;
+		    count_tries = 1;
+		    no_previous_move();
+		} else {
+		    int oldy = history[count_moves - 1].y;
+		    int oldx = history[count_moves - 1].x;
+
+		    if (!squares[rw][col]) {
+			cellmove(rw, col);
+			waddch(boardwin, ' ');
+		    }
+
+		    squares[oldy][oldx] = FALSE;
+		    --count_moves;
+		    ny = history[count_moves - 1].y;
+		    nx = history[count_moves - 1].x;
+		    if (nx < 0 || ny < 0) {
+			ny = oldy;
+			nx = oldx;
+		    }
+		    drawMove(squares, count_moves, ' ', oldy, oldx, ny, nx);
+
+		    /* avoid problems if we just changed the current cell */
+		    cellmove(lastrow, lastcol);
+		    oldch = winch(boardwin);
+		}
+		break;
+
+	    case 'a':
+		nx = col;
+		ny = rw;
+		if (find_next_move(squares, history, count_moves, &ny, &nx))
+		    count_next_moves(squares, count_moves, ny, nx);
+		else
+		    beep();
+		break;
+
+	    case 'F':
+		review = reviewHistory(history, count_moves, review - 1,
+				       &ny, &nx);
+		break;
+
+	    case 'B':
+		review = reviewHistory(history, count_moves, review + 1,
+				       &ny, &nx);
+		break;
+
+	    case 'R':
+		if (ylimit <= 6) {
+		    wprintw(msgwin, "\nworking...");
+		    wrefresh(msgwin);
+		    test_test = 0;
+		    test_size = useBacktracking(squares, history, count_moves);
+		    wprintw(msgwin, "\nOk %d:%d (%d tests)",
+			    test_size, maxmoves, test_test);
+		    review = 0;
+		    while (count_moves <= test_size) {
+			markcell(trail,
+				 ny = history[count_moves].y,
+				 nx = history[count_moves].x);
+			count_moves++;
+		    }
+		} else {
+		    wprintw(msgwin, "\nBoard is too large.");
+		}
+		wrefresh(msgwin);
+		break;
+
+#if HAVE_CURSCR
+	    case KEY_REDO:
+	    case '\f':
+	    case 'r':
+		clearok(curscr, TRUE);
+		wnoutrefresh(stdscr);
+		wnoutrefresh(boardwin);
+		wnoutrefresh(msgwin);
+		wnoutrefresh(helpwin);
+		doupdate();
+		break;
+#endif
+
+	    case 'q':
+	    case 'x':
+		goto dropout;
+
+	    case HELP_KEY_1:
+		show_help(&keyhelp);
+		break;
+
+	    default:
+		beep();
+		break;
+	    }
+
+	    col = nx % xlimit;
+	    rw = ny % ylimit;
+	}
+
+      dropout:
+	if ((count = completed(squares)) < 0)
+	    wprintw(msgwin, "\nYou won.  Care to try again? ");
+	else
+	    wprintw(msgwin, "\n%d squares filled.  Try again? ", count);
+	wclrtoeol(msgwin);
+    } while
+	(tolower(wgetch(msgwin)) == 'y');
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: knight [options]"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+#if HAVE_USE_DEFAULT_COLORS
+	," -d       invoke use_default_colors"
+#endif
+	," -n NUM   set board-size to NUM*NUM (default 8x8)"
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "dn:")) != -1) {
+	switch (ch) {
+#if HAVE_USE_DEFAULT_COLORS
+	case 'd':
+	    d_option = TRUE;
+	    break;
+#endif
+	case 'n':
+	    ch = atoi(optarg);
+	    if (ch < 3 || ch > 8) {
+		fprintf(stderr, "board size %d is outside [3..8]\n", ch);
+		usage(FALSE);
+	    }
+	    xlimit = ylimit = ch;
+	    break;
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind < argc)
+	usage(FALSE);
+
+    init_program();
+
+    play();
+
+    endwin();
+    ExitProgram(EXIT_SUCCESS);
+}
diff --git a/test/linedata.h b/test/linedata.h
new file mode 100644
index 0000000..f042ab4
--- /dev/null
+++ b/test/linedata.h
@@ -0,0 +1,111 @@
+/****************************************************************************
+ * Copyright 2018,2020 Thomas E. Dickey                                     *
+ * Copyright 2009-2010,2012 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: linedata.h,v 1.8 2020/02/02 23:34:34 tom Exp $
+ *
+ * Utility functions for reading a line of text from a file.
+ */
+#ifndef LINEDATA_H_incl
+#define LINEDATA_H_incl 1
+
+#include <test.priv.h>
+
+#define isQUIT(c)     ((c) == QUIT || (c) == ESCAPE)
+
+#define key_RECUR     CTRL('W')
+#define key_NEWLINE   CTRL('N')
+#define key_BACKSPACE '\b'
+
+static FILE *linedata;
+
+static void
+failed(const char *s)
+{
+    perror(s);
+    ExitProgram(EXIT_FAILURE);
+}
+
+static void
+init_linedata(const char *name)
+{
+    if ((linedata = fopen(name, "r")) == 0) {
+	failed(name);
+    }
+}
+
+static int
+read_linedata(WINDOW *work)
+{
+    int result;
+    if (linedata != 0) {
+	result = fgetc(linedata);
+	if (result == EOF) {
+	    fclose(linedata);
+	    linedata = 0;
+	    result = read_linedata(work);
+	} else {
+	    wrefresh(work);
+	    if (result == '\n') {
+		result = key_NEWLINE;
+	    }
+	}
+    } else {
+#ifdef WIDE_LINEDATA
+	wint_t ch;
+	int code;
+
+	result = ERR;
+	while ((code = wget_wch(work, &ch)) != ERR) {
+
+	    if (code == KEY_CODE_YES) {
+		switch (ch) {
+		case KEY_DOWN:
+		    result = key_NEWLINE;
+		    break;
+		case KEY_BACKSPACE:
+		    result = key_BACKSPACE;
+		    break;
+		default:
+		    beep();
+		    continue;
+		}
+	    } else {
+		result = (int) ch;
+		break;
+	    }
+	}
+#else
+	result = wgetch(work);
+#endif
+    }
+    return result;
+}
+
+#endif /* LINEDATA_H_incl */
diff --git a/test/linux-color.dat b/test/linux-color.dat
new file mode 100644
index 0000000..ef922eb
--- /dev/null
+++ b/test/linux-color.dat
@@ -0,0 +1,49 @@
+##############################################################################
+# Copyright 2020 Thomas E. Dickey                                            #
+# Copyright 2004,2006 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: linux-color.dat,v 1.3 2020/02/08 21:38:22 tom Exp $
+# These values are derived from linux/drivers/char/vt.c (default_red[],
+# default_grn[] and default_blu[]), commented
+/* the default colour table, for VGA+ colour systems */
+scale:255
+0:	  0	  0	  0
+1:	170	  0	  0
+2:	  0	170	  0
+3:	170	 85	  0
+4:	  0	  0	170
+5:	170	  0	170
+6:	  0	170	170
+7:	170	170	170
+8:	 85	 85	 85
+9:	255	 85	 85
+10:	 85	255	 85
+11:	255	255	 85
+12:	 85	 85	255
+13:	255	 85	255
+14:	 85	255	255
+15:	255	255	255
diff --git a/test/list_keys.c b/test/list_keys.c
new file mode 100644
index 0000000..ee54b85
--- /dev/null
+++ b/test/list_keys.c
@@ -0,0 +1,520 @@
+/****************************************************************************
+ * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 2016,2017 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: list_keys.c,v 1.31 2022/12/10 23:23:27 tom Exp $
+ *
+ * Author: Thomas E Dickey
+ *
+ * List function keys for one or more terminals.
+ */
+
+#define USE_TINFO
+#include <test.priv.h>
+
+#if NCURSES_XNAMES
+#if HAVE_TERM_ENTRY_H
+#include <term_entry.h>
+#else
+#undef NCURSES_XNAMES
+#define NCURSES_XNAMES 0
+#endif
+#endif
+
+#if HAVE_TIGETSTR
+#if defined(HAVE_CURSES_DATA_BOOLNAMES) || defined(DECL_CURSES_DATA_BOOLNAMES)
+
+static bool f_opt = FALSE;
+static bool m_opt = FALSE;
+static bool t_opt = FALSE;
+static bool x_opt = FALSE;
+
+typedef enum {
+    ktCursor
+    ,ktFunction
+    ,ktOther
+#if HAVE_USE_EXTENDED_NAMES
+    ,ktExtended
+#endif
+} KEYTYPE;
+
+typedef struct {
+    KEYTYPE type;
+    const char *name;
+} KEYNAMES;
+
+#define Type(n) list[n].type
+#define Name(n) list[n].name
+
+static const char *
+full_name(const char *name)
+{
+    const char *result = name;
+    int n;
+    for (n = 0; strnames[n] != 0; ++n) {
+	if (!strcmp(name, strnames[n])) {
+	    result = strfnames[n];
+	    break;
+	}
+    }
+    return result;
+}
+
+static int
+show_key(const char *name, bool show)
+{
+    int width = 0;
+    NCURSES_CONST char *value = tigetstr((NCURSES_CONST char *) name);
+
+    if (show && t_opt)
+	fputc('"', stdout);
+
+    if (value != 0 && value != (char *) -1) {
+	while (*value != 0) {
+	    char buffer[10];
+	    int ch = UChar(*value++);
+	    switch (ch) {
+	    case '\177':
+		_nc_STRCPY(buffer, "^?", sizeof(buffer));
+		break;
+	    case '\033':
+		_nc_STRCPY(buffer, "\\E", sizeof(buffer));
+		break;
+	    case '\b':
+		_nc_STRCPY(buffer, "\\b", sizeof(buffer));
+		break;
+	    case '\f':
+		_nc_STRCPY(buffer, "\\f", sizeof(buffer));
+		break;
+	    case '\n':
+		_nc_STRCPY(buffer, "\\n", sizeof(buffer));
+		break;
+	    case '\r':
+		_nc_STRCPY(buffer, "\\r", sizeof(buffer));
+		break;
+	    case ' ':
+		_nc_STRCPY(buffer, "\\s", sizeof(buffer));
+		break;
+	    case '\t':
+		_nc_STRCPY(buffer, "\\t", sizeof(buffer));
+		break;
+	    case '^':
+		_nc_STRCPY(buffer, "\\^", sizeof(buffer));
+		break;
+	    case ':':
+		_nc_STRCPY(buffer, "\\072", sizeof(buffer));
+		break;
+	    case '\\':
+		_nc_STRCPY(buffer, "\\\\", sizeof(buffer));
+		break;
+	    default:
+		if (t_opt && ch == '"') {
+		    _nc_STRCPY(buffer, "\"\"", sizeof(buffer));
+		} else if (isgraph(ch)) {
+		    _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer))
+				"%c", ch);
+		} else if (ch < 32) {
+		    _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer))
+				"^%c", ch + '@');
+		} else {
+		    _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer))
+				"\\%03o", ch);
+		}
+		break;
+	    }
+	    width += (int) strlen(buffer);
+	    if (show)
+		fputs(buffer, stdout);
+	}
+    }
+
+    if (show && t_opt)
+	fputc('"', stdout);
+
+    return width;
+}
+
+static bool
+valid_key(const char *name, TERMINAL **terms, int count)
+{
+    bool result = FALSE;
+    if (*name == 'k') {
+	int k;
+	for (k = 0; k < count; ++k) {
+	    set_curterm(terms[k]);
+	    if (show_key(name, FALSE)) {
+		result = TRUE;
+		break;
+	    }
+	}
+    }
+    return result;
+}
+
+static int
+compare_keys(const void *a, const void *b)
+{
+    const KEYNAMES *p = (const KEYNAMES *) a;
+    const KEYNAMES *q = (const KEYNAMES *) b;
+    int result = (int) (p->type - q->type);
+    int pn, qn;
+    if (result == 0) {
+	if (p->type == ktFunction &&
+	    sscanf(p->name, "kf%d", &pn) == 1 &&
+	    sscanf(q->name, "kf%d", &qn) == 1) {
+	    result = (pn - qn);
+	} else {
+	    result = strcmp(p->name, q->name);
+	}
+    }
+    return result;
+}
+
+static void
+draw_line(int width)
+{
+    if (!t_opt) {
+	int j;
+	for (j = 0; j < width; ++j) {
+	    printf("-");
+	}
+	printf("\n");
+    }
+}
+
+static const char *
+modified_key(const char *name)
+{
+    static char result[100];
+    char buffer[sizeof(result) - 10];
+    int value;
+    char chr;
+    static const char *modifiers[][2] =
+    {
+	{"", ""},
+	{"s-", "shift-"},
+	{"a-", "alt-"},
+	{"as-", "alt-shift-"},
+	{"c-", "ctrl-"},
+	{"sc-", "ctrl-shift-"},
+	{"ac-", "alt-ctrl-"},
+	{"acs-" "alt-ctrl-shift-"},
+    };
+
+    if (strlen(name) > (sizeof(result) - 3)) {
+	*result = '\0';
+    } else if (sscanf(name, "kf%d%c", &value, &chr) == 1 &&
+	       value >= 1 &&
+	       value <= 63) {
+	/* map 1,2,3,4,5,6,7 to 1,2,5,... */
+	int map = ((value - 1) / 12);
+	int key = ((value - 1) % 12);
+	int bit1 = (map & 2);
+	int bit2 = (map & 4);
+	map &= ~6;
+	map |= (bit1 << 1) | (bit2 >> 1);
+	_nc_SPRINTF(result, _nc_SLIMIT(sizeof(result))
+		    "%sF%d", modifiers[map][(unsigned) f_opt], 1 + key);
+    } else if (sscanf(name, "k%80[A-Z]%d%c", buffer, &value, &chr) == 2 &&
+	       (value > 1 &&
+		value <= 8) &&
+	       (!strcmp(buffer, "UP") ||
+		!strcmp(buffer, "DN") ||
+		!strcmp(buffer, "LFT") ||
+		!strcmp(buffer, "RIT") ||
+		!strcmp(buffer, "IC") ||
+		!strcmp(buffer, "DC") ||
+		!strcmp(buffer, "HOM") ||
+		!strcmp(buffer, "END") ||
+		!strcmp(buffer, "NXT") ||
+		!strcmp(buffer, "PRV"))) {
+	_nc_SPRINTF(result, _nc_SLIMIT(sizeof(result))
+		    "%sk%s", modifiers[value - 1][(unsigned) f_opt], buffer);
+    } else if (sscanf(name, "k%80[A-Z]%c", buffer, &chr) == 1 &&
+	       (!strcmp(buffer, "UP") ||
+		!strcmp(buffer, "DN"))) {
+	_nc_SPRINTF(result, _nc_SLIMIT(sizeof(result))
+		    "%sk%s", modifiers[1][(unsigned) f_opt], buffer);
+    } else {
+	*result = '\0';
+    }
+    return result;
+}
+
+static void
+list_keys(TERMINAL **terms, int count)
+{
+    int j, k;
+    int widths0 = 0;
+    int widths1 = 0;
+    int widths2 = 0;
+    int widthsx;
+    int check;
+    size_t total = 0;
+    size_t actual = 0;
+    const char *name = f_opt ? "strfname" : "strname";
+    const char *modifier = "extended";
+    KEYNAMES *list;
+
+    for (total = 0; strnames[total]; ++total) {
+	;
+    }
+#if NCURSES_XNAMES
+    if (x_opt) {
+	for (k = 0; k < count; ++k) {
+	    TERMTYPE *term;
+	    set_curterm(terms[k]);
+	    term = (TERMTYPE *) cur_term;
+	    total += (size_t) (NUM_STRINGS(term) - STRCOUNT);
+	}
+    }
+#endif
+    list = typeCalloc(KEYNAMES, total + 1);
+    for (j = 0; strnames[j]; ++j) {
+	Type(j) = ktOther;
+	if (sscanf(strnames[j], "kf%d", &k) == 1) {
+	    Type(j) = ktFunction;
+	} else if (!(strncmp) (strnames[j], "kcu", 3)) {
+	    Type(j) = ktCursor;
+	}
+	Name(j) = strnames[j];
+    }
+#if NCURSES_XNAMES
+    if (x_opt) {
+	int m, n;
+
+	for (k = 0; k < count; ++k) {
+	    TERMTYPE *term;
+
+	    set_curterm(terms[k]);
+	    term = (TERMTYPE *) cur_term;
+	    for (n = STRCOUNT; n < NUM_STRINGS(term); ++n) {
+		bool found = FALSE;
+		const char *estr = ExtStrname(term, (int) n, strnames);
+		for (m = STRCOUNT; m < j; ++m) {
+		    if (!strcmp(estr, Name(m))) {
+			found = TRUE;
+			break;
+		    }
+		}
+		if (!found) {
+		    Type(j) = ktExtended;
+		    Name(j++) = estr;
+		}
+	    }
+	}
+    }
+#endif
+    actual = (size_t) j;
+    qsort(list, actual, sizeof(KEYNAMES), compare_keys);
+
+    widths0 = (int) strlen(name);
+    if (m_opt)
+	widths1 = (int) strlen(modifier);
+
+    for (k = 0; k < count; ++k) {
+	set_curterm(terms[k]);
+	check = (int) strlen(termname());
+	if (widths2 < check)
+	    widths2 = check;
+    }
+    for (j = 0; Name(j) != 0; ++j) {
+	if (valid_key(Name(j), terms, count)) {
+	    const char *label = f_opt ? full_name(Name(j)) : Name(j);
+	    check = (int) strlen(label);
+	    if (widths0 < check)
+		widths0 = check;
+	    for (k = 0; k < count; ++k) {
+		set_curterm(terms[k]);
+		check = show_key(Name(j), FALSE) + 1;
+		if (widths2 < check)
+		    widths2 = check;
+		if (m_opt) {
+		    check = (int) strlen(modified_key(Name(j)));
+		    if (widths1 < check)
+			widths1 = check;
+		}
+	    }
+	}
+    }
+
+    if (t_opt) {
+	printf("\"%s\"", name);
+	if (m_opt)
+	    printf(",\"%s\"", modifier);
+    } else {
+	printf("%-*s", widths0, name);
+	if (m_opt)
+	    printf(" %-*s", widths1, modifier);
+    }
+    for (k = 0; k < count; ++k) {
+	set_curterm(terms[k]);
+	if (t_opt) {
+	    printf(",\"%s\"", termname());
+	} else if (k + 1 >= count) {
+	    printf(" %s", termname());
+	} else {
+	    printf(" %-*s", widths2, termname());
+	}
+    }
+    printf("\n");
+
+    widthsx = widths0 + ((count + 1) * widths2);
+
+    for (j = 0; Name(j) != 0; ++j) {
+	if (j == 0 || (Type(j) != Type(j - 1)))
+	    draw_line(widthsx);
+	if (valid_key(Name(j), terms, count)) {
+	    const char *label = f_opt ? full_name(Name(j)) : Name(j);
+	    if (t_opt) {
+		printf("\"%s\"", label);
+		if (m_opt)
+		    printf(",\"%s\"", modified_key(Name(j)));
+	    } else {
+		printf("%-*s", widths0, label);
+		if (m_opt)
+		    printf(" %-*s", widths1, modified_key(Name(j)));
+	    }
+	    for (k = 0; k < count; ++k) {
+		printf(t_opt ? "," : " ");
+		set_curterm(terms[k]);
+		check = show_key(Name(j), TRUE);
+		if (!t_opt) {
+		    if (k + 1 < count) {
+			printf("%*s", widths2 - check, " ");
+		    }
+		}
+	    }
+	    printf("\n");
+	}
+    }
+    free(list);
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: list_keys [options] [terminal [terminal2 [...]]]"
+	,""
+	,"Print capabilities for terminal special keys."
+	,""
+	,USAGE_COMMON
+	,"Options:"
+	," -f       print full names"
+	," -m       print modifier-column for shift/control keys"
+	," -t       print result as CSV table"
+#ifdef NCURSES_VERSION
+	," -x       print extended capabilities"
+#endif
+    };
+    unsigned n;
+    for (n = 0; n < SIZEOF(msg); ++n) {
+	fprintf(stderr, "%s\n", msg[n]);
+    }
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+    TERMINAL **terms = typeCalloc(TERMINAL *, argc + 1);
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "fmtx")) != -1) {
+	switch (ch) {
+	case 'f':
+	    f_opt = TRUE;
+	    break;
+	case 'm':
+	    m_opt = TRUE;
+	    break;
+	case 't':
+	    t_opt = TRUE;
+	    break;
+#ifdef NCURSES_VERSION
+	case 'x':
+	    x_opt = TRUE;
+	    break;
+#endif
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+
+#if HAVE_USE_EXTENDED_NAMES
+    use_extended_names(x_opt);
+#endif
+
+    if (optind < argc) {
+	int found = 0;
+	int status;
+	int n;
+	for (n = optind; n < argc; ++n) {
+	    setupterm((NCURSES_CONST char *) argv[n], 1, &status);
+	    if (status > 0 && cur_term != 0) {
+		terms[found++] = cur_term;
+	    }
+	}
+	if (found)
+	    list_keys(terms, found);
+    } else {
+	setupterm(NULL, 1, (int *) 0);
+	terms[0] = cur_term;
+	list_keys(terms, 1);
+    }
+
+    free(terms);
+
+    ExitProgram(EXIT_SUCCESS);
+}
+
+#else
+int
+main(void)
+{
+    printf("This program requires the terminfo arrays\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif
+#else /* !HAVE_TIGETSTR */
+int
+main(void)
+{
+    printf("This program requires the terminfo functions such as tigetstr\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif /* HAVE_TIGETSTR */
diff --git a/test/listused.sh b/test/listused.sh
new file mode 100755
index 0000000..45653eb
--- /dev/null
+++ b/test/listused.sh
@@ -0,0 +1,186 @@
+#!/bin/sh
+##############################################################################
+# Copyright 2020-2021,2022 Thomas E. Dickey                                  #
+# Copyright 2003-2006,2010 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: listused.sh,v 1.12 2022/07/16 16:33:38 tom Exp $
+# A very simple script to list all entrypoints that are used by either a test
+# program, or within the libraries.  This relies on the output format of 'nm',
+# and assumes that the libraries are configured with TRACE defined, and using
+# these options:
+#	--disable-macros
+#	--enable-opaque-curses
+#	--enable-sp-funcs
+#	--enable-widec
+#	--without-gpm
+# Static libraries are used, to provide some filtering based on internal usage
+# of the different symbols.
+
+# keep the sorting independent of locale:
+if test "${LANGUAGE+set}"    = set; then LANGUAGE=C;    export LANGUAGE;    fi
+if test "${LANG+set}"        = set; then LANG=C;        export LANG;        fi
+if test "${LC_ALL+set}"      = set; then LC_ALL=C;      export LC_ALL;      fi
+if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+if test "${LC_CTYPE+set}"    = set; then LC_CTYPE=C;    export LC_CTYPE;    fi
+if test "${LC_COLLATE+set}"  = set; then LC_COLLATE=C;  export LC_COLLATE;  fi
+
+NM_OPTS=
+
+if test ! -d ../objects ; then
+	echo "? need objects to run this script"
+	exit 1
+elif test ! -d ../lib ; then
+	echo "? need libraries to run this script"
+	exit 1
+fi
+
+PROGS=
+for name in `(echo "test:";sort modules; echo "progs:";sort ../progs/modules) |sed -e 's/[ 	].*//' -e '/^[#@]/d'`
+do
+	case $name in
+	*:)
+		PROGS="$PROGS $name"
+		;;
+	*)
+		NAME=../objects/${name}.o
+		if test -f "$NAME"
+		then
+			PROGS="$PROGS $NAME"
+		fi
+		;;
+	esac
+done
+
+# For each library -
+for lib in ../lib/*.a
+do
+	LIB=`basename "$lib" .a`
+	case $LIB in
+	*_*|*+*)
+		continue
+		;;
+	esac
+
+	tmp=`echo "$LIB"|sed -e 's/w$//'`
+	echo
+	echo "${tmp}:"
+	echo "$tmp" |sed -e 's/./-/g'
+	# Construct a list of public externals provided by the library.
+	WANT=`nm $NM_OPTS "$lib" |\
+		sed	-e 's/^[^ ]*//' \
+			-e 's/^ *//' \
+			-e '/^[ a-z] /d' \
+			-e '/:$/d' \
+			-e '/^$/d' \
+			-e '/^U /d' \
+			-e 's/^[A-Z] //' \
+			-e '/^_/d' |\
+		sort -u`
+	# List programs which use that external.
+	for name in $WANT
+	do
+		HAVE=
+		tags=
+		last=
+		for prog in $PROGS
+		do
+			case $prog in
+			*:)
+				tags=$prog
+				;;
+			*)
+				TEST=`nm $NM_OPTS "$prog" |\
+					sed	-e 's/^[^ ]*//' \
+						-e 's/^ *//' \
+						-e '/^[ a-z] /d' \
+						-e '/:$/d' \
+						-e '/^$/d' \
+						-e 's/^[A-Z] //' \
+						-e '/^_/d' \
+						-e 's/^'${name}'$/_/' \
+						-e '/^[^_]/d'`
+				if test -n "$TEST"
+				then
+					have=`basename "$prog" .o`
+					if test -n "$HAVE"
+					then
+						if test "$last" = "$tags"
+						then
+							HAVE="$HAVE $have"
+						else
+							HAVE="$HAVE $tags $have"
+						fi
+					else
+						HAVE="$tags $have"
+					fi
+					last="$tags"
+				fi
+				;;
+			esac
+		done
+		# if we did not find a program using it directly, see if it
+		# is used within a library.
+		if test -z "$HAVE"
+		then
+			for tmp in ../lib/*.a
+			do
+				case $tmp in
+				*_*|*+*)
+					continue
+					;;
+				esac
+				TEST=`nm $NM_OPTS "$tmp" |\
+					sed	-e 's/^[^ ]*//' \
+						-e 's/^ *//' \
+						-e '/^[ a-z] /d' \
+						-e '/:$/d' \
+						-e '/^$/d' \
+						-e '/^[A-TV-Z] /d' \
+						-e 's/^[A-Z] //' \
+						-e '/^_/d' \
+						-e 's/^'${name}'$/_/' \
+						-e '/^[^_]/d'`
+				if test -n "$TEST"
+				then
+					tmp=`basename "$tmp" .a |sed -e 's/w$//'`
+					HAVE=`echo "$tmp" | sed -e 's/lib/lib: /'`
+					break
+				fi
+			done
+		fi
+		test -z "$HAVE" && HAVE="-"
+		lenn=`expr 39 - length "$name"`
+		lenn=`expr "$lenn" / 8`
+		tabs=
+		while test "$lenn" != 0
+		do
+			tabs="${tabs}	"
+			lenn=`expr "$lenn" - 1`
+		done
+		echo "${name}${tabs}${HAVE}"
+	done
+done
diff --git a/test/lrtest.c b/test/lrtest.c
new file mode 100644
index 0000000..0e609d0
--- /dev/null
+++ b/test/lrtest.c
@@ -0,0 +1,214 @@
+/****************************************************************************
+ * Copyright 2019-2020,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2010,2017 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.                                                           *
+ ****************************************************************************/
+/*
+ * Test lower-right-hand corner access
+ *
+ * originally by Eric S. Raymond <esr@thyrsus.com>, written for animation
+ * and resizing -T.Dickey
+ *
+ * This can't be part of the ncurses test-program, because ncurses rips off the
+ * bottom line to do labels.
+ *
+ * $Id: lrtest.c,v 1.29 2022/12/10 23:44:18 tom Exp $
+ */
+
+#include <test.priv.h>
+
+typedef struct {
+    int y, x, mode, dir, inc;
+    chtype value;
+} MARK;
+
+/*
+ * Make a couple of markers go 'round the border to demonstrate that we can
+ * really write to all positions properly.
+ */
+static void
+show(MARK *m)
+{
+    MvAddCh(m->y, m->x, m->value);
+    if (m->mode == 0) {		/* along the x-direction */
+	m->x += m->inc;
+	if (m->x >= COLS) {
+	    m->x = COLS - 1;
+	    m->inc = -m->dir * m->inc;
+	    m->y += m->inc;
+	    m->mode = 1;
+	} else if (m->x < 0) {
+	    m->x = 0;
+	    m->inc = -m->dir * m->inc;
+	    m->y += m->inc;
+	    m->mode = 1;
+	}
+    } else {			/* along the y-direction */
+	m->y += m->inc;
+	if (m->y >= LINES) {
+	    m->y = LINES - 1;
+	    m->inc = m->dir * m->inc;
+	    m->x += m->inc;
+	    m->mode = 0;
+	} else if (m->y < 0) {
+	    m->y = 0;
+	    m->inc = m->dir * m->inc;
+	    m->x += m->inc;
+	    m->mode = 0;
+	}
+    }
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: lrtest [options]"
+	,""
+	,USAGE_COMMON
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    static MARK marks[] =
+    {
+	{0, 0, 0, -1, 1, '+' | A_BOLD},
+	{0, 0, 1, 1, 2, 'X'},
+	{0, 0, 1, -1, 3, 'Y'},
+	{0, 8, 0, -1, 1, '+' | A_BOLD},
+	{0, 9, 0, -1, 1, '+' | A_BOLD},
+	{1, 0, 1, 1, 1, '*' | A_REVERSE},
+	{2, 0, 1, 1, 1, '*' | A_REVERSE}
+    };
+    int ch;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) {
+	switch (ch) {
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind < argc)
+	usage(FALSE);
+
+    setlocale(LC_ALL, "");
+
+    initscr();
+    noecho();
+    cbreak();
+    nodelay(stdscr, TRUE);
+    curs_set(0);
+
+#ifdef KEY_RESIZE
+    keypad(stdscr, TRUE);
+  restart:
+#endif
+    move(LINES / 2 - 1, 4);
+    if (!(has_ic()
+#if HAVE_SETUPTERM
+    /* see PutCharLR() */
+	  || auto_right_margin
+	  || (enter_am_mode && exit_am_mode)
+#endif
+	)) {
+	addstr("Your terminal lacks the capabilities needed to address the\n");
+	move(LINES / 2, 4);
+	addstr("lower-right-hand corner of the screen.\n");
+    } else {
+	addstr("This is a test of access to the lower right corner.\n");
+	move(LINES / 2, 4);
+	addstr("If the top of the box is missing, the test failed.\n");
+	move(LINES / 2 + 1, 4);
+	addstr("Please report this (with a copy of your terminfo entry).\n");
+	move(LINES / 2 + 2, 4);
+	addstr("to the ncurses maintainers, at bug-ncurses@gnu.org.\n");
+    }
+
+    for (;;) {
+	int c2;
+	unsigned n;
+
+	box(stdscr, 0, 0);
+	for (n = 0; n < SIZEOF(marks); n++) {
+	    show(&marks[n]);
+	}
+
+	if ((c2 = getch()) > 0) {
+	    if (c2 == 'q')
+		break;
+	    else if (c2 == 's')
+		nodelay(stdscr, FALSE);
+	    else if (c2 == ' ')
+		nodelay(stdscr, TRUE);
+#ifdef TRACE
+	    else if (c2 == 'T')
+		curses_trace(0);
+	    else if (c2 == 't')
+		curses_trace(TRACE_CALLS | TRACE_ICALLS | TRACE_UPDATE);
+#endif
+#ifdef KEY_RESIZE
+	    else if (c2 == KEY_RESIZE) {
+		for (n = 0; n < SIZEOF(marks); n++) {
+		    if (marks[n].mode == 0) {	/* moving along x-direction */
+			if (marks[n].y)
+			    marks[n].y = LINES - 1;
+		    } else {
+			if (marks[n].x)
+			    marks[n].x = COLS - 1;
+		    }
+		}
+		flash();
+		erase();
+		wrefresh(curscr);
+		goto restart;
+	    }
+#endif
+	}
+	napms(50);
+	refresh();
+    }
+
+    stop_curses();
+    ExitProgram(EXIT_SUCCESS);
+}
+
+/* lrtest.c ends here */
diff --git a/test/make-tar.sh b/test/make-tar.sh
new file mode 100755
index 0000000..df4b66a
--- /dev/null
+++ b/test/make-tar.sh
@@ -0,0 +1,163 @@
+#!/bin/sh
+# $Id: make-tar.sh,v 1.21 2022/11/05 19:41:33 tom Exp $
+##############################################################################
+# Copyright 2019-2021,2022 Thomas E. Dickey                                  #
+# Copyright 2010-2015,2017 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.                                                             #
+##############################################################################
+# Construct a tar-file containing only the test tree as well as its associated
+# scripts.  The reason for doing that is to simplify distributing the test
+# programs as a separate package.
+
+CDPATH=:
+export CDPATH
+
+TARGET=`pwd`
+
+: "${PKG_NAME:=ncurses-examples}"
+: "${ROOTNAME:=ncurses-test}"
+: "${DESTDIR:=$TARGET}"
+: "${TMPDIR:=/tmp}"
+
+# make timestamps of generated files predictable
+same_timestamp() {
+	[ -f ../NEWS ] || echo "OOPS $1"
+	touch -r ../NEWS "$1"
+}
+
+grep_assign() {
+	grep_assign=`grep -E "^$2\>" "$1" | sed -e "s/^$2[ 	]*=[ 	]*//" -e 's/"//g'`
+	eval "$2"=\""$grep_assign"\"
+}
+
+grep_patchdate() {
+	grep_assign ../dist.mk NCURSES_MAJOR
+	grep_assign ../dist.mk NCURSES_MINOR
+	grep_assign ../dist.mk NCURSES_PATCH
+}
+
+# The rpm spec-file in the ncurses tree is a template.  Fill in the version
+# information from dist.mk
+edit_specfile() {
+	sed \
+		-e "s/\\<MAJOR\\>/$NCURSES_MAJOR/g" \
+		-e "s/\\<MINOR\\>/$NCURSES_MINOR/g" \
+		-e "s/\\<YYYYMMDD\\>/$NCURSES_PATCH/g" "$1" >"$1.new"
+	chmod u+w "$1"
+	mv "$1.new" "$1"
+	same_timestamp "$1"
+}
+
+make_changelog() {
+	[ -f "$1" ] && chmod u+w "$1"
+	cat >"$1" <<EOF
+`echo $PKG_NAME|tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` ($NCURSES_MAJOR.$NCURSES_MINOR+$NCURSES_PATCH) unstable; urgency=low
+
+  * snapshot of ncurses subpackage for $PKG_NAME.
+
+ -- `head -n 1 "$HOME"/.signature`  `date -R`
+EOF
+	same_timestamp "$1"
+}
+
+# This can be run from either the subdirectory, or from the top-level
+# source directory.  We will put the tar file in the original directory.
+if [ -d ./test ]
+then
+	cd ./test || exit
+fi
+SOURCE=`cd ..;pwd`
+
+BUILD=$TMPDIR/make-tar$$
+trap "cd /; rm -rf $BUILD; exit 1" 1 2 3 15
+trap "cd /; rm -rf $BUILD; exit 0" 0
+
+umask 077
+if ! ( mkdir $BUILD )
+then
+	echo "? cannot make build directory $BUILD"
+fi
+
+umask 022
+mkdir $BUILD/$ROOTNAME
+
+cp -p -r ./* $BUILD/$ROOTNAME/ || exit
+
+# Add the config.* utility scripts from the top-level directory.
+for i in . ..
+do
+	for j in COPYING config.guess config.sub install-sh tar-copy.sh
+	do
+		[ -f $i/$j ] && cp -p $i/$j $BUILD/$ROOTNAME/
+	done
+done
+
+# Make rpm and dpkg scripts for test-builds
+grep_patchdate
+for spec in "$BUILD/$ROOTNAME"/package/*.spec
+do
+	edit_specfile "$spec"
+done
+for spec in "$BUILD/$ROOTNAME"/package/debian*
+do
+	make_changelog "$spec"/changelog
+done
+
+cp -p "$SOURCE/NEWS" "$BUILD/$ROOTNAME"
+
+# cleanup empty directories (an artifact of ncurses source archives)
+
+touch $BUILD/$ROOTNAME/MANIFEST
+( cd $BUILD/$ROOTNAME && find . -type f -print | "$SOURCE/misc/csort" >MANIFEST )
+same_timestamp $BUILD/$ROOTNAME/MANIFEST
+
+cd $BUILD || exit
+
+# Remove build-artifacts.
+find . -name RCS -exec rm -rf {} \;
+find $BUILD/$ROOTNAME -type d -exec rmdir {} \; 2>/dev/null
+find $BUILD/$ROOTNAME -type d -exec rmdir {} \; 2>/dev/null
+find $BUILD/$ROOTNAME -type d -exec rmdir {} \; 2>/dev/null
+
+# There is no need for this script in the tar file.
+rm -f $ROOTNAME/make-tar.sh
+
+# Remove build-artifacts.
+find . -name "*.gz" -exec rm -rf {} \;
+
+# Make the files writable...
+chmod -R u+w .
+
+# Cleanup timestamps
+[ -n "$TOUCH_DIRS" ] && "$TOUCH_DIRS" "$ROOTNAME"
+
+tar cf - $TAR_OPTIONS $ROOTNAME | gzip >"$DESTDIR/$ROOTNAME.tar.gz"
+cd "$DESTDIR" || exit
+
+pwd
+ls -l $ROOTNAME.tar.gz
+
+# vi:ts=4 sw=4
diff --git a/test/mensetmanus.xbm b/test/mensetmanus.xbm
new file mode 100644
index 0000000..095b8ec
--- /dev/null
+++ b/test/mensetmanus.xbm
@@ -0,0 +1,258 @@
+#define mensetmanus_width 161
+#define mensetmanus_height 145
+
+static char mensetmanus_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xc0, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x07, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x3f, 0xdb, 0x0f, 0x00, 0x00, 0x00, 0x80, 0x07,
+ 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xf7, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x80, 0x61, 0x00, 0x00, 0xc6,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc3, 0xff,
+ 0x1f, 0x00, 0x00, 0x00, 0xc0, 0xe1, 0xff, 0xff, 0x87, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc3, 0xf6, 0x1f, 0x00, 0x00,
+ 0x00, 0xc0, 0xc0, 0xff, 0xff, 0x87, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x80, 0x9f, 0x65, 0x1f, 0x00, 0x00, 0x00, 0xc0, 0x00,
+ 0x07, 0x80, 0x87, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x9f, 0x6d, 0x1f, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0xff, 0xc7,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x89, 0x6d,
+ 0x1b, 0x00, 0x00, 0x00, 0xc0, 0xe0, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x81, 0x6d, 0x1b, 0x00, 0x00,
+ 0x00, 0xc0, 0xe1, 0x5b, 0xdb, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xc0, 0x81, 0x6d, 0x1b, 0x00, 0x00, 0x00, 0x80, 0x83,
+ 0x5b, 0xdb, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xc0, 0x81, 0x6d, 0x1b, 0x00, 0x00, 0x00, 0x00, 0xcf, 0x5b, 0x1b, 0x0c,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x80, 0x6d,
+ 0x1b, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x5b, 0x1b, 0x0c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x80, 0x6d, 0x1b, 0x00, 0x00,
+ 0x00, 0x00, 0xf8, 0x5b, 0x0b, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xe0, 0x83, 0x6d, 0x19, 0x00, 0x00, 0x00, 0x00, 0x80,
+ 0x5b, 0x0b, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xe0, 0x83, 0x6d, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x80, 0x5b, 0x0f, 0x0e,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x6d,
+ 0x1b, 0x00, 0x00, 0x00, 0x00, 0x80, 0x4b, 0x0f, 0x07, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x79, 0x1b, 0x00, 0x00,
+ 0x00, 0x00, 0x80, 0x6b, 0xbf, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x03, 0xfb, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x80,
+ 0x6d, 0xb7, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x03, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xed, 0xf7, 0x07,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x07, 0xfe,
+ 0x7f, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xed, 0xd7, 0x07, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x7f, 0xf8, 0xff, 0x07, 0x00,
+ 0x00, 0x00, 0xe0, 0xfe, 0xd7, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x80, 0xff, 0x7f, 0xe0, 0xff, 0x3f, 0x00, 0x00, 0x00, 0xf0,
+ 0xff, 0xd6, 0xfe, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,
+ 0xbf, 0x73, 0x80, 0x3b, 0x7c, 0x00, 0x00, 0x00, 0xf8, 0xe7, 0xd6, 0xef,
+ 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xb9, 0x73, 0xc0,
+ 0x3b, 0xf0, 0x01, 0x00, 0x00, 0xff, 0xc3, 0xbf, 0xe7, 0x3f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0xb8, 0x7f, 0xe0, 0x3b, 0xc0, 0x03,
+ 0x00, 0xc0, 0xbf, 0xc7, 0xbf, 0xe7, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x1c, 0xb8, 0xff, 0xf8, 0x3b, 0x80, 0x07, 0x00, 0xe0, 0x61,
+ 0x87, 0xfd, 0xe7, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e,
+ 0xb8, 0xf3, 0xff, 0x3b, 0x00, 0x0f, 0x00, 0x78, 0x60, 0x8e, 0xf1, 0x67,
+ 0xc7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xb8, 0xc3, 0x8f,
+ 0x7b, 0x00, 0x0e, 0x00, 0x38, 0xe0, 0x8c, 0x03, 0x66, 0x87, 0x03, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x07, 0xb8, 0x03, 0x83, 0x7b, 0x00, 0x1e,
+ 0x00, 0x1c, 0xe0, 0x1d, 0x03, 0x76, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xc0, 0x07, 0xb8, 0xe3, 0x8f, 0xbb, 0x01, 0x39, 0x00, 0x1e, 0xe0,
+ 0x3b, 0x03, 0xf6, 0x87, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x0f,
+ 0xb8, 0xe3, 0x8f, 0x3b, 0xc6, 0x38, 0x00, 0x17, 0xe0, 0x73, 0x07, 0xfe,
+ 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x0b, 0xb8, 0xe7, 0x8e,
+ 0x3b, 0x38, 0x78, 0x00, 0x13, 0xe0, 0x77, 0x06, 0xfe, 0xff, 0xff, 0xff,
+ 0x0f, 0x00, 0x00, 0x00, 0xe0, 0x12, 0x3c, 0xff, 0xce, 0x3b, 0x00, 0x78,
+ 0x80, 0x13, 0x60, 0xef, 0x0e, 0xfe, 0x00, 0x00, 0x60, 0x08, 0x00, 0x00,
+ 0x00, 0x70, 0x22, 0x3e, 0xfc, 0xfe, 0x39, 0x00, 0xe8, 0x80, 0x61, 0x60,
+ 0xce, 0x0f, 0xfe, 0x00, 0x00, 0x60, 0xf8, 0x00, 0x00, 0x00, 0x70, 0xc2,
+ 0x39, 0xf8, 0x7e, 0x38, 0x00, 0xc8, 0xc0, 0x81, 0x71, 0xde, 0x0f, 0xfe,
+ 0x00, 0x00, 0x60, 0x88, 0x00, 0x00, 0x00, 0x70, 0x04, 0x38, 0xe0, 0x0e,
+ 0x38, 0x00, 0xc4, 0xc0, 0x01, 0x7e, 0xbc, 0x1f, 0xfe, 0x00, 0x00, 0x60,
+ 0x88, 0x00, 0x00, 0x00, 0x78, 0x04, 0x38, 0xe0, 0x0e, 0x38, 0x00, 0xc4,
+ 0xc1, 0x01, 0x60, 0x3c, 0x1f, 0xfe, 0x00, 0x00, 0x60, 0x84, 0x0f, 0x00,
+ 0x00, 0x78, 0x08, 0x38, 0xe0, 0x0f, 0x38, 0x00, 0x82, 0xe1, 0x01, 0x60,
+ 0x74, 0x3e, 0xfe, 0x00, 0x00, 0x60, 0x44, 0x08, 0x00, 0x00, 0xb8, 0x10,
+ 0x38, 0xe0, 0x0f, 0x38, 0x00, 0x81, 0xe1, 0x00, 0x60, 0xe4, 0x3e, 0xfe,
+ 0x00, 0x00, 0x60, 0x44, 0x08, 0x00, 0x00, 0x98, 0x20, 0x38, 0xf8, 0x3f,
+ 0x38, 0x80, 0x80, 0xe1, 0x01, 0x60, 0xc4, 0x3c, 0xfe, 0x00, 0x00, 0x60,
+ 0x24, 0x0c, 0x00, 0x00, 0x1c, 0xc1, 0x39, 0x3c, 0x78, 0x38, 0x40, 0x80,
+ 0x61, 0x01, 0x60, 0xc4, 0x79, 0xfe, 0x00, 0x00, 0x60, 0x22, 0x32, 0x00,
+ 0x00, 0x1c, 0x01, 0x3e, 0x1c, 0xf0, 0x38, 0xf0, 0x9f, 0x61, 0x01, 0x60,
+ 0x84, 0x7b, 0xee, 0x00, 0x00, 0x60, 0x12, 0x21, 0x00, 0x00, 0x1c, 0x02,
+ 0x38, 0x0e, 0xe7, 0xf8, 0x3f, 0xe0, 0x61, 0x00, 0x60, 0x04, 0xf7, 0xce,
+ 0x00, 0x00, 0x60, 0x92, 0x10, 0x00, 0x00, 0x1c, 0x04, 0x38, 0x06, 0xff,
+ 0x38, 0x40, 0x80, 0x61, 0x02, 0x60, 0x04, 0xe7, 0xcf, 0x00, 0x00, 0x60,
+ 0x8a, 0x18, 0x00, 0x00, 0x1c, 0x18, 0x38, 0x07, 0xf0, 0x38, 0x00, 0x81,
+ 0x61, 0x02, 0x60, 0x04, 0xee, 0xcf, 0xff, 0x03, 0x60, 0x49, 0xe4, 0x00,
+ 0x00, 0x1c, 0x70, 0x38, 0x07, 0xe7, 0x38, 0x00, 0x82, 0x61, 0x04, 0x60,
+ 0x04, 0xdc, 0xcf, 0x01, 0x04, 0x60, 0x25, 0x42, 0x00, 0x00, 0x1c, 0xfe,
+ 0x3f, 0x03, 0xff, 0x38, 0x00, 0x84, 0x61, 0x08, 0x60, 0x04, 0xfc, 0xcf,
+ 0xf8, 0xff, 0x60, 0x95, 0x31, 0x00, 0x00, 0xfc, 0x01, 0xff, 0x03, 0xf0,
+ 0xf8, 0x1f, 0x88, 0x61, 0x10, 0xe0, 0xff, 0xff, 0xff, 0x00, 0x00, 0xe1,
+ 0x53, 0x0c, 0x00, 0x00, 0x38, 0xf0, 0xff, 0x03, 0xef, 0xf8, 0x7f, 0x90,
+ 0x61, 0x40, 0xe0, 0xff, 0xff, 0xff, 0x00, 0xff, 0xe3, 0x2b, 0xfe, 0x00,
+ 0x00, 0x18, 0xf8, 0xff, 0x03, 0xff, 0x7c, 0xf0, 0x90, 0x61, 0x00, 0x3e,
+ 0x36, 0xe3, 0xe1, 0x00, 0x00, 0xe3, 0x9f, 0x60, 0x00, 0x00, 0x38, 0x3c,
+ 0x00, 0x03, 0xf0, 0x1f, 0xe0, 0xa0, 0xe1, 0x00, 0x30, 0x22, 0xe2, 0xc0,
+ 0x00, 0xff, 0xe3, 0x7f, 0x18, 0x00, 0x00, 0x38, 0x0e, 0x00, 0x07, 0xe7,
+ 0x07, 0xc0, 0xe1, 0xc1, 0x00, 0x18, 0x22, 0xe2, 0xc0, 0x00, 0x00, 0xe1,
+ 0x1f, 0x07, 0x00, 0x00, 0x38, 0x06, 0x00, 0x07, 0xef, 0x01, 0xc0, 0xc1,
+ 0xc1, 0x01, 0x16, 0x24, 0xe2, 0xc0, 0x01, 0xff, 0xe1, 0xff, 0x00, 0x00,
+ 0x00, 0x70, 0x07, 0x00, 0x0e, 0xf8, 0x00, 0x80, 0xc3, 0xc0, 0xf1, 0x11,
+ 0x24, 0xe4, 0xc0, 0x03, 0xe0, 0xe1, 0x7f, 0x00, 0x00, 0x00, 0x70, 0x07,
+ 0x00, 0x1e, 0x3c, 0x00, 0x80, 0xe3, 0x80, 0x0f, 0x10, 0x24, 0xe4, 0xc0,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0xe0, 0x03, 0x00, 0xfc, 0x0f,
+ 0x00, 0x00, 0x63, 0x80, 0x01, 0x08, 0x44, 0xe4, 0xc0, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0x01, 0x00, 0xe0, 0x03, 0x00, 0xf8, 0x07, 0x00, 0x00, 0x73,
+ 0x80, 0x03, 0x08, 0x44, 0xe4, 0xc0, 0xfc, 0x00, 0x07, 0x0e, 0x00, 0x00,
+ 0x00, 0xc0, 0x03, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x33, 0x00, 0x03, 0x08,
+ 0x44, 0xe4, 0xe0, 0xcc, 0x00, 0x07, 0x0e, 0x00, 0x00, 0x00, 0xc0, 0x03,
+ 0x00, 0x78, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x07, 0x04, 0x44, 0xe8, 0x70,
+ 0xcc, 0x01, 0x87, 0x0f, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0x3e, 0x00,
+ 0x00, 0x80, 0x1f, 0x00, 0x0e, 0x04, 0x44, 0xe8, 0x38, 0xcc, 0x81, 0xe7,
+ 0x03, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x00, 0x80, 0x0f,
+ 0x00, 0x1c, 0x02, 0x44, 0xf8, 0x1e, 0xcc, 0xe1, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0xc0, 0x23, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x38, 0x01,
+ 0x42, 0xfc, 0x0f, 0xcc, 0xf1, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e,
+ 0xf0, 0x39, 0x00, 0x00, 0xe0, 0x03, 0x00, 0xf0, 0x00, 0xc2, 0xff, 0x07,
+ 0xcc, 0x7f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x7c, 0x0e, 0x00,
+ 0x00, 0xf0, 0x01, 0x00, 0xe0, 0x03, 0xe2, 0xe7, 0x07, 0xcc, 0x1f, 0x07,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xbf, 0x23, 0xe0, 0xff, 0xff, 0x00,
+ 0x00, 0xc0, 0x1f, 0xff, 0x64, 0x06, 0xcc, 0x07, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf0, 0xff, 0x3c, 0xf0, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xff,
+ 0x7f, 0x64, 0x06, 0xcc, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70,
+ 0xf8, 0x1f, 0x78, 0x7c, 0x7f, 0x00, 0x00, 0x00, 0xfc, 0x20, 0x64, 0x06,
+ 0xcc, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xf8, 0x33, 0x1c,
+ 0x38, 0x66, 0x00, 0x00, 0x00, 0x0c, 0x20, 0x6c, 0x06, 0xcc, 0x03, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x78, 0x3e, 0x0e, 0x38, 0x76, 0x00,
+ 0x00, 0x00, 0x0c, 0x20, 0x68, 0x06, 0xcc, 0x03, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x38, 0xf8, 0x87, 0x0f, 0x38, 0x76, 0x00, 0x00, 0x00, 0x0c,
+ 0x20, 0x68, 0x06, 0xcc, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38,
+ 0x78, 0xf8, 0x0f, 0x38, 0x76, 0x00, 0x00, 0x00, 0x0c, 0x10, 0x68, 0x06,
+ 0xcc, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xf8, 0xff, 0x0f,
+ 0x38, 0x76, 0x00, 0x00, 0x00, 0x0c, 0x10, 0x68, 0x06, 0xcc, 0x07, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0xf8, 0xff, 0x0e, 0x38, 0x76, 0x00,
+ 0x00, 0x00, 0x0c, 0x10, 0x68, 0x06, 0xcc, 0x07, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x1c, 0xf8, 0xe1, 0x0e, 0x38, 0x3e, 0x00, 0x00, 0x00, 0x0c,
+ 0x08, 0x68, 0x06, 0xcc, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c,
+ 0x38, 0xe0, 0x0e, 0x38, 0x3e, 0x00, 0x00, 0x00, 0x0c, 0x08, 0x68, 0x06,
+ 0xcc, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x38, 0xe0, 0x0e,
+ 0x38, 0x3e, 0x00, 0x00, 0x00, 0x0c, 0x04, 0x68, 0x06, 0xcc, 0x0e, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x38, 0xe0, 0x0e, 0x38, 0x3e, 0x00,
+ 0x00, 0x00, 0x1c, 0x04, 0x68, 0x06, 0xcc, 0x0e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x06, 0x38, 0xe0, 0x0e, 0x38, 0x3e, 0x00, 0x00, 0x00, 0x1c,
+ 0x02, 0x68, 0x06, 0xcc, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,
+ 0x38, 0xe0, 0x0e, 0x38, 0x3e, 0x00, 0x00, 0x00, 0x1c, 0x02, 0x68, 0x06,
+ 0xcc, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x38, 0xe0, 0x0e,
+ 0x38, 0x3e, 0x00, 0x00, 0x00, 0x1c, 0x01, 0x68, 0x06, 0xcc, 0x1c, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x38, 0xe0, 0x0e, 0x38, 0x3e, 0x00,
+ 0x00, 0x00, 0x18, 0x01, 0x68, 0x06, 0xcc, 0x1c, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x03, 0x38, 0xe0, 0x0e, 0x38, 0x3e, 0x00, 0x00, 0x00, 0x98,
+ 0x00, 0x68, 0x06, 0xcc, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03,
+ 0x38, 0xe0, 0x0e, 0x38, 0x3e, 0x00, 0x00, 0x00, 0x98, 0x00, 0x68, 0x06,
+ 0xcc, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0x38, 0xe0, 0x0e,
+ 0x38, 0x1e, 0x00, 0x00, 0x00, 0x58, 0x00, 0x6c, 0x0e, 0xcc, 0x18, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x30, 0xe0, 0x0e, 0x38, 0x1e, 0x00,
+ 0x00, 0x00, 0x38, 0x00, 0x64, 0x0e, 0xcc, 0x18, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xc0, 0x01, 0x70, 0xe0, 0x0e, 0x1c, 0x1e, 0x00, 0x00, 0x00, 0x18,
+ 0x00, 0x64, 0x1e, 0xcc, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01,
+ 0xe0, 0xe1, 0x0e, 0x0f, 0x1e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x64, 0x3e,
+ 0xcc, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xc0, 0xef, 0xce,
+ 0x07, 0x1e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x64, 0x3e, 0xcc, 0x30, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0xff, 0xfe, 0x03, 0x1e, 0x00,
+ 0x00, 0x00, 0x18, 0x00, 0x64, 0x7e, 0xcc, 0x30, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xe0, 0x00, 0x00, 0xfc, 0xfe, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x18,
+ 0x00, 0x64, 0x66, 0xcc, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00,
+ 0x00, 0xe0, 0x1e, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x66, 0xe6,
+ 0xcc, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0xe0, 0x0e,
+ 0x00, 0x1e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x62, 0xc6, 0xcd, 0x70, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0xfe, 0xff, 0x0f, 0x1e, 0x00,
+ 0x00, 0x00, 0x18, 0x00, 0x62, 0xc6, 0xcd, 0x70, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x70, 0x00, 0xc0, 0xff, 0xff, 0x0f, 0x0e, 0x00, 0x00, 0x00, 0x38,
+ 0x00, 0x62, 0x86, 0xcf, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00,
+ 0xf0, 0xff, 0xff, 0x0f, 0x0e, 0x00, 0x00, 0x00, 0x38, 0x00, 0x61, 0x86,
+ 0xcf, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0xfc, 0x00, 0x00,
+ 0x0e, 0x0e, 0x00, 0x00, 0x00, 0x38, 0x00, 0x61, 0x8e, 0xcf, 0xe0, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x78, 0x00, 0x00, 0x0e, 0x0e, 0x00,
+ 0x00, 0x00, 0xf8, 0xff, 0x7f, 0xfe, 0xdf, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x18, 0x00, 0xf0, 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x00, 0x00, 0xf0,
+ 0xff, 0x3f, 0xff, 0xdf, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00,
+ 0xe0, 0x01, 0x00, 0x0e, 0x0e, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x8f, 0x07,
+ 0x9e, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0xe0, 0x07, 0x00,
+ 0x0e, 0x0f, 0x00, 0x00, 0x00, 0x30, 0x00, 0xc0, 0xff, 0x3f, 0xc0, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0xfe, 0xff, 0xff, 0xff, 0x0f, 0x00,
+ 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x1c, 0x00, 0xfe, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0xf0,
+ 0xff, 0xff, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff,
+ 0x3f, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x38, 0x00,
+ 0x38, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x7f, 0x00, 0x00,
+ 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x38, 0x00, 0x38, 0xe0, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x06, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x18, 0x00, 0x38, 0xe0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xe0, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00,
+ 0x06, 0x18, 0x00, 0x38, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00,
+ 0xdc, 0x01, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x1c, 0x00,
+ 0x38, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x9c, 0x03, 0x00,
+ 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x1c, 0x00, 0x18, 0x70, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x1c, 0x07, 0x00, 0x00, 0x06, 0x00,
+ 0x00, 0x00, 0x00, 0x07, 0x0c, 0x00, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xe0, 0x00, 0x1c, 0xfe, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00,
+ 0x07, 0x0c, 0x00, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00,
+ 0x1c, 0xfc, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0c, 0x00,
+ 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x1c, 0x1c, 0x00,
+ 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0e, 0x00, 0x18, 0x70, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x1c, 0x1c, 0x00, 0x80, 0x03, 0x00,
+ 0x00, 0x00, 0x00, 0x07, 0x0e, 0x00, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xe0, 0x00, 0x1c, 0x1c, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00,
+ 0x07, 0x0e, 0x00, 0x18, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00,
+ 0x1c, 0x1c, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0e, 0x00,
+ 0x18, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x1c, 0x1c, 0x00,
+ 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x07, 0x06, 0x00, 0x18, 0x38, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x07, 0x00,
+ 0x00, 0x00, 0x00, 0x07, 0x06, 0x00, 0x18, 0x38, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xe0, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00,
+ 0x07, 0x0e, 0x00, 0x18, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00,
+ 0x1c, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0e, 0x00,
+ 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x1c, 0x00, 0x00,
+ 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0e, 0x00, 0x18, 0x30, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x06, 0x00,
+ 0x00, 0x00, 0x00, 0x07, 0x0e, 0x00, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xe0, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00,
+ 0x07, 0x0e, 0x00, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00,
+ 0x1e, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0c, 0x00,
+ 0x38, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x1e, 0x00, 0x00,
+ 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x1c, 0x00, 0x38, 0x70, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x06, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x1c, 0x00, 0x38, 0xe0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xe0, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00,
+ 0x06, 0x18, 0x00, 0x38, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00,
+ 0x1e, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x18, 0x00,
+ 0x30, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x1e, 0x00, 0x00,
+ 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x38, 0x00, 0x30, 0xe0, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0xf0, 0x01, 0x1f, 0x00, 0x00, 0x00, 0x06, 0x00,
+ 0x00, 0x00, 0x00, 0x0c, 0x3c, 0x00, 0x30, 0xf0, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0xf8, 0x03, 0x1f, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00,
+ 0x0c, 0x7e, 0x00, 0x70, 0xf8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x0f,
+ 0x1f, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xe7, 0x00,
+ 0x70, 0xbc, 0x03, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x1e, 0x1f, 0x00, 0x00,
+ 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0xdc, 0xe3, 0x00, 0x60, 0x1e, 0x07,
+ 0x00, 0x00, 0x00, 0x00, 0x0f, 0xfc, 0x1f, 0x00, 0x00, 0x00, 0x06, 0x00,
+ 0x00, 0x00, 0x00, 0xfc, 0xc1, 0x01, 0xe0, 0x0f, 0x0f, 0x00, 0x00, 0x00,
+ 0x80, 0x07, 0xf0, 0x1f, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00,
+ 0xf8, 0x80, 0x03, 0xe0, 0x03, 0x1e, 0x00, 0x00, 0x00, 0xc0, 0x03, 0xe0,
+ 0x1b, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x78, 0x80, 0x07,
+ 0xe0, 0x01, 0x1c, 0x00, 0x00, 0x00, 0xe0, 0x01, 0xc0, 0x1b, 0x00, 0x00,
+ 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x0f, 0xe0, 0x01, 0x38,
+ 0x00, 0x00, 0x00, 0xf0, 0x00, 0xc0, 0x19, 0x00, 0x00, 0x00, 0x06, 0x00,
+ 0x00, 0x00, 0x00, 0x30, 0x0e, 0x1e, 0xc0, 0x71, 0xf8, 0x00, 0x00, 0x00,
+ 0x78, 0x00, 0xdc, 0x19, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00,
+ 0x30, 0x1f, 0x1e, 0xc0, 0xf9, 0xf8, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
diff --git a/test/mini.xterm_48x48.xpm b/test/mini.xterm_48x48.xpm
new file mode 100644
index 0000000..c4738f8
--- /dev/null
+++ b/test/mini.xterm_48x48.xpm
@@ -0,0 +1,264 @@
+/* XPM */
+static char * mini_xterm_48x48_xpm[] = {
+"48 48 213 2",
+"  	c None",
+". 	c #FF0000",
+"+ 	c #FF5300",
+"@ 	c #FF5E00",
+"# 	c #FF4800",
+"$ 	c #FF4200",
+"% 	c #FF4000",
+"& 	c #FF4B00",
+"* 	c #FF5200",
+"= 	c #FF5400",
+"- 	c #FF3500",
+"; 	c #FF5100",
+"> 	c #FF5C00",
+", 	c #FF3000",
+"' 	c #FF4500",
+") 	c #FF2000",
+"! 	c #FF0300",
+"~ 	c #FF1600",
+"{ 	c #FF5D00",
+"] 	c #FF3800",
+"^ 	c #FF0200",
+"/ 	c #FF0900",
+"( 	c #FF2B00",
+"_ 	c #FF3300",
+": 	c #FF1A00",
+"< 	c #FF1300",
+"[ 	c #FF1200",
+"} 	c #FF5700",
+"| 	c #4577BA",
+"1 	c #874E78",
+"2 	c #887577",
+"3 	c #887E77",
+"4 	c #887977",
+"5 	c #875078",
+"6 	c #566CA9",
+"7 	c #5E70A1",
+"8 	c #884E77",
+"9 	c #887677",
+"0 	c #7C5B83",
+"a 	c #795686",
+"b 	c #008DFE",
+"c 	c #0012F3",
+"d 	c #000BF2",
+"e 	c #008FFE",
+"f 	c #006CFA",
+"g 	c #0000F1",
+"h 	c #0001F1",
+"i 	c #0020F4",
+"j 	c #0040F6",
+"k 	c #0959F0",
+"l 	c #1158E8",
+"m 	c #1159E8",
+"n 	c #0058F9",
+"o 	c #001DF4",
+"p 	c #0023F4",
+"q 	c #005BFA",
+"r 	c #0060FA",
+"s 	c #0E58EB",
+"t 	c #0651F3",
+"u 	c #0033F5",
+"v 	c #000EF2",
+"w 	c #006EFA",
+"x 	c #0092FF",
+"y 	c #001FF4",
+"z 	c #000FF2",
+"A 	c #0C51EC",
+"B 	c #326AC9",
+"C 	c #7A6583",
+"D 	c #CA6234",
+"E 	c #FC5F03",
+"F 	c #FF5800",
+"G 	c #FF0800",
+"H 	c #F4060B",
+"I 	c #007CFB",
+"J 	c #0013F3",
+"K 	c #007EFB",
+"L 	c #FF1800",
+"M 	c #F3590C",
+"N 	c #AB6152",
+"O 	c #4F4EAD",
+"P 	c #175CE4",
+"Q 	c #0036F5",
+"R 	c #0022F4",
+"S 	c #0095FD",
+"T 	c #0084FD",
+"U 	c #0004F1",
+"V 	c #0051F8",
+"W 	c #345AC7",
+"X 	c #E61519",
+"Y 	c #FF5900",
+"Z 	c #FF4600",
+"` 	c #FF0100",
+" .	c #446EB9",
+"..	c #0034F6",
+"+.	c #0032F5",
+"@.	c #FF2200",
+"#.	c #006FFA",
+"$.	c #002DF5",
+"%.	c #0086FD",
+"&.	c #0046F7",
+"*.	c #0015F3",
+"=.	c #0076FC",
+"-.	c #FF0400",
+";.	c #FF2300",
+">.	c #FF2900",
+",.	c #9E3E61",
+"'.	c #0039F6",
+").	c #FF2A00",
+"!.	c #FF4300",
+"~.	c #0071FB",
+"{.	c #005EF9",
+"].	c #004DF7",
+"^.	c #008CFE",
+"/.	c #0008F2",
+"(.	c #001DF3",
+"_.	c #007DFB",
+":.	c #FF4100",
+"<.	c #FF5B00",
+"[.	c #A3425C",
+"}.	c #994C66",
+"|.	c #FF1100",
+"1.	c #0072FB",
+"2.	c #000AF2",
+"3.	c #006EFC",
+"4.	c #0017F3",
+"5.	c #007FFB",
+"6.	c #FF0600",
+"7.	c #FF5600",
+"8.	c #A56A5A",
+"9.	c #A53B5A",
+"0.	c #FF4F00",
+"a.	c #0076FB",
+"b.	c #0076FA",
+"c.	c #0093FF",
+"d.	c #007DFC",
+"e.	c #FF1C00",
+"f.	c #A5765A",
+"g.	c #A55D5A",
+"h.	c #006FFB",
+"i.	c #002CF5",
+"j.	c #008AFD",
+"k.	c #006BF9",
+"l.	c #FF3A00",
+"m.	c #FF5000",
+"n.	c #007BFB",
+"o.	c #008BFD",
+"p.	c #A5755A",
+"q.	c #9A5565",
+"r.	c #A43A5B",
+"s.	c #FF4D00",
+"t.	c #80507F",
+"u.	c #FF0F00",
+"v.	c #7A5485",
+"w.	c #A5555A",
+"x.	c #FF0A00",
+"y.	c #A53D5A",
+"z.	c #A4515B",
+"A.	c #A5685A",
+"B.	c #A5735A",
+"C.	c #FF0700",
+"D.	c #FF2E00",
+"E.	c #FF1500",
+"F.	c #A3705C",
+"G.	c #FF0500",
+"H.	c #9A4965",
+"I.	c #FF0E00",
+"J.	c #FF3B00",
+"K.	c #FF2D00",
+"L.	c #A13C5E",
+"M.	c #FF4C00",
+"N.	c #62649D",
+"O.	c #FF0B00",
+"P.	c #FF4700",
+"Q.	c #FF1D00",
+"R.	c #A56D5A",
+"S.	c #FF2C00",
+"T.	c #A4465B",
+"U.	c #FF1400",
+"V.	c #A03E61",
+"W.	c #FF3100",
+"X.	c #FF1B00",
+"Y.	c #FF1000",
+"Z.	c #0029F5",
+"`.	c #0027F4",
+" +	c #4571BA",
+".+	c #FF3900",
+"++	c #FF3200",
+"@+	c #008EFD",
+"#+	c #0019F3",
+"$+	c #0090FD",
+"%+	c #FF0D00",
+"&+	c #FF1E00",
+"*+	c #FF4E00",
+"=+	c #0088FC",
+"-+	c #0087FC",
+";+	c #FF1900",
+">+	c #0036F6",
+",+	c #FF2100",
+"'+	c #0073FB",
+")+	c #0062FA",
+"!+	c #001AF3",
+"~+	c #2463D8",
+"{+	c #3E58BE",
+"]+	c #2A7FD3",
+"^+	c #807B7F",
+"/+	c #008EFB",
+"(+	c #006AFA",
+"_+	c #004CF8",
+":+	c #717B8D",
+"<+	c #EE0B11",
+"[+	c #F73E08",
+"}+	c #FF1F00",
+"|+	c #FF5500",
+"                                                                                                ",
+"                                                                                                ",
+"    . . . . . . . . . . . . . . . . . .                 . . . . . . . . . . . . . . . .         ",
+"    . + @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ .                 . # @ @ @ @ @ @ @ @ @ @ @ @ $ .         ",
+"    . % & & & * @ @ @ @ @ = & & & & & .                 . - & & & & & ; @ > & & & & , .         ",
+"    . . . . . . * @ @ @ @ ; . . . . . .                 . . . . . . . ' @ ) . . . . . .         ",
+"              ! ~ { @ @ @ @ ] ^                                   / ( @ $ .                     ",
+"                ^ _ @ @ @ @ @ : !                               < [ > } ^ .                     ",
+"                | 1 2 3 3 3 3 4 5 6                           7 8 9 3 0 a                       ",
+"            b c d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d c e             ",
+"            f g g g g g g h i j k l m n o g g g g g g p q r s t u v g g g g g g g w             ",
+"          x y g g g g z A B C D E F G H I c g g g g J K   L / M N O P Q h g g g g R S           ",
+"          T g g g U V W X Y @ @ @ @ Z `  ...g g g g +.    ` ' @ @..     #.$.g g g g %.          ",
+"          &.g g *.=.    -.;.@ @ @ @ @ >.,.'.g g g g '.  / ).@ !..         ~.{.U g g ].          ",
+"        ^./.g (._.        ` :.@ @ @ @ <.[.'.g g g g '.}.|.<.} ^ .             1.2.g d e         ",
+"        3.g 4.5.            6.7.@ @ @ @ 8.'.g g g g '.9.0.@ [ .                 a./.g b.        ",
+"      c.R /.d.              -.e.@ @ @ @ f.'.g g g g '.g.@ - .                     h.h i.        ",
+"      j.k.%.                  ^ l.@ @ @ f.'.g g g g '.f.m.`                         n.f o.      ",
+"                                ! * @ @ f.'.g g g g '.p.G .                                     ",
+"                                ! ~ { @ f.'.g g g g '.q..                                       ",
+"                                  ^ _ @ f.'.g g g g '.r.                                        ",
+"                                    ^ s.f.'.g g g g '.t.                                        ",
+"                                    ^ u.p.'.g g g g '.v.                                        ",
+"                                      ^ w.'.g g g g '.r.                                        ",
+"                                      x.y.'.g g g g '.z.^                                       ",
+"                                      ` A.'.g g g g '.B.x..                                     ",
+"                                    C.D.f.'.g g g g '.f.# `                                     ",
+"                                  < E.{ F.'.g g g g '.f.@ ( ^                                   ",
+"                                : G.; @ H.'.g g g g '.f.@ <.I.^                                 ",
+"                                -.J.@ K.L.'.g g g g '.f.@ @ s.`                                 ",
+"                              I.) @ M.. N.'.g g g g '.f.@ @ @ _ ^                               ",
+"                            L O.F <.6..   '.g g g g '.f.@ @ @ { E.!                             ",
+"                            ^ P.@ Q..     '.g g g g '.R.@ @ @ @ * !                             ",
+"                          G S.@ % .       '.g g g g '.T.{ @ @ @ @ l.^                           ",
+"                        < U.> 7.^         ..g g g g u V.W.@ @ @ @ @ e.!                         ",
+"                      X.-.m.@ Y..         Z.g g g g `. +` M.@ @ @ @ 7.6.                        ",
+"                      -..+@ ++.         @+#+g g g g #+$+^ %+<.@ @ @ @ :.`                       ",
+"                    I.&+@ *+.           =+h g g g g h -+  ! >.@ @ @ @ @ ;.^                     ",
+"                  ;+x.} > C..           >+g g g g g g >+    ` Z @ @ @ @ Y / .                   ",
+"                  ` ' @ ,+.   %.1.'+)+!+g g g g g g g g #+)+~+{+]+^+@ @ @ P.`                   ",
+"                / ).@ !..   /+(+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+(+:+@ @ @ @ ).^                 ",
+"              I.[ > F . .                                       <+[+@ @ @ @ <.I.`               ",
+"    . . . . . . 0.@ }+. . . . . .                     . . . . . . . |+@ @ @ @ s.. . . . . .     ",
+"    O.@ @ @ @ @ @ @ @ @ @ @ @ @ ^                     ! $ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ $ .     ",
+"    . & & & & & & & & & & & & & .                     . , & & & & & & & & & & & & & & & , .     ",
+"    . . . . . . . . . . . . . . .                     . . . . . . . . . . . . . . . . . . .     ",
+"                                                                                                ",
+"                                                                                                "};
diff --git a/test/mk-test.awk b/test/mk-test.awk
new file mode 100644
index 0000000..a194a5d
--- /dev/null
+++ b/test/mk-test.awk
@@ -0,0 +1,190 @@
+# $Id: mk-test.awk,v 1.30 2021/12/19 16:54:36 tom Exp $
+##############################################################################
+# Copyright 2019-2020,2021 Thomas E. Dickey                                  #
+# Copyright 2006-2017,2018 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey
+#
+# generate Makefile for ncurses tests.
+BEGIN	{
+		first = 1;
+		count = 0;
+	}
+/^#/	{
+		next;
+	}
+/^$/	{
+		next;
+	}
+	{
+		if (first) {
+			print "# generated by mk-test.awk\n";
+			first = 0;
+		}
+		progs[count] = $1;
+		flags[count] = $2;
+		using[count] = $3;
+		files[count] = "";
+		for (n = 4; n <= NF; ++n) {
+			files[count] = sprintf("%s $(MODEL)/%s$o", files[count], $n);
+		}
+		count = count + 1;
+	}
+END	{
+	for (n = 0; n < count; ++n) {
+		if (n == 0) {
+			printf "TESTS\t= ";
+		} else {
+			printf "\t  ";
+		}
+		printf "$(destdir)%s$x", progs[n];
+		if (n < count - 1) {
+			printf " \\";
+		}
+		print "";
+	}
+	print	"SCRIPTS = \\"
+	print	"	$(srcdir)/savescreen.sh \\"
+	print	"	$(srcdir)/tput-colorcube \\"
+	print	"	$(srcdir)/tput-initc \\"
+	print	"	$(srcdir)/tracemunch"
+	print	"DATAFILES = \\"
+	print	"	$(srcdir)/*.x* \\"
+	print	"	$(srcdir)/*.dat"
+	print	""
+	print	"all:: $(TESTS)"
+	print	""
+	print	"sources:"
+	print	""
+	print	"check::"
+	print	"	@ echo The test-programs are interactive"
+	print	"tags:"
+	print	"	$(CTAGS) *.[ch]"
+	print	""
+	print	"# no libraries here"
+	print	"libs \\"
+	print	"install.libs \\"
+	print	"uninstall.libs:"
+	print	""
+	if (INSTALL == "yes") {
+		print	"# we might install the test-programs"
+		print	"$(PACKAGE) :"
+		print	"	@echo \"creating $(PACKAGE) script\""
+		print	"	@$(SHELL) -c '\\"
+		print	"	L=$(real_bindir);                            \\"
+		print	"	rm -f $@;                                    \\"
+		print	"	echo \"#!$(SHELL)\" >                     $@;\\"
+		print	"	echo \"PATH=\\\"$$L\\\":\\$$PATH\"      >>$@;\\"
+		print	"	echo \"export PATH\"                    >>$@;\\"
+		print	"	echo \"if test \\$$# != 0; then\"       >>$@;\\"
+		print	"	echo \"  exec \\\"\\$$@\\\"\"           >>$@;\\"
+		print	"	echo \"elif test -t 1; then\"           >>$@;\\"
+		print	"	echo \"  cd \\\"$$L\\\" || exit\"       >>$@;\\"
+		print	"	echo \"  ls -l | \\$${PAGER:-less}\"    >>$@;\\"
+		print	"	echo \"fi\"                             >>$@;\\"
+		print	"	echo \"echo \\\"usage: $@ [program]\\\"\" >>$@'"
+		print	""
+		print	"install \\"
+		print	"install.test: $(PACKAGE) $(BINDIR) $(REAL_BINDIR) $(DATADIR) $(TESTS)"
+
+		print	"	@echo \"installing $(PACKAGE) -> $(BINDIR)/\""
+		print	"	@$(INSTALL_SCRIPT) $(PACKAGE) $(BINDIR)"
+
+		print	"	@$(SHELL) -c 'for src in $(TESTS); do \\"
+		print	"	dst=`echo $$src | $(TRANSFORM)`; \\"
+		print	"	echo \"installing $$src -> $(REAL_BINDIR)/$$dst\"; \\"
+		print	"	$(INSTALL_PROG) $$src $(REAL_BINDIR)/$$dst; \\"
+		print	"	done'"
+
+		print	"	@$(SHELL) -c 'for src in $(SCRIPTS); do \\"
+		print	"	dst=`echo $$src | sed -e 's,^.*/,,' | $(TRANSFORM)`; \\"
+		print	"	echo \"installing $$src -> $(REAL_BINDIR)/$$dst\"; \\"
+		print	"	$(INSTALL_SCRIPT) $$src $(REAL_BINDIR)/$$dst; \\"
+		print	"	done'"
+
+		print	"	@$(SHELL) -c 'for src in $(DATAFILES); do \\"
+		print	"	dst=`echo $$src | sed -e 's,^.*/,,'`; \\"
+		print	"	echo \"installing $$src -> $(DATADIR)/$$dst\"; \\"
+		print	"	$(INSTALL_DATA) $$src $(DATADIR)/$$dst; \\"
+		print	"	done'"
+		print	""
+		print	"uninstall \\"
+		print	"uninstall.test:"
+
+		print	"	-rm -f $(BINDIR)/$(PACKAGE)"
+
+		print	"	@$(SHELL) -c 'for src in $(TESTS); do \\"
+		print	"	dst=`echo $$src | $(TRANSFORM)`; \\"
+		print	"	rm -f $(REAL_BINDIR)/$$dst; \\"
+		print	"	done'"
+
+		print	"	@$(SHELL) -c 'for src in $(SCRIPTS); do \\"
+		print	"	dst=`echo $$src | sed -e 's,^.*/,,' | $(TRANSFORM)`; \\"
+		print	"	rm -f $(REAL_BINDIR)/$$dst; \\"
+		print	"	done'"
+
+		print	"	@$(SHELL) -c 'for src in $(DATAFILES); do \\"
+		print	"	dst=`echo $$src | sed -e 's,^.*/,,'`; \\"
+		print	"	rm -f $(DATADIR)/$$dst; \\"
+		print	"	done'"
+	} else {
+		print	"install \\"
+		print	"install.test \\"
+		print	"uninstall \\"
+		print	"uninstall.test:"
+	}
+	print	""
+	print	"mostlyclean ::"
+	print	"	-rm -f core tags TAGS *~ *.bak *.i *.ln *.atac trace"
+	print	""
+	print	"clean :: mostlyclean"
+	print	"	-$(SHELL) -c \"if test -n '$x' ; then $(MAKE) clean x=''; fi\""
+	print	"	-rm -rf *$o screendump *.lis $(TESTS) .libs *.dSYM"
+	print	"	-rm -f $(PACKAGE)"
+	print	""
+	print	"distclean :: clean"
+	print	"	-rm -f Makefile ncurses_cfg.h config.status config.log"
+	print	""
+	print	"realclean :: distclean"
+	print	""
+	print	"lint:"
+	print	"	$(SHELL) -c 'for N in $(TESTS); do echo LINT:$$N; $(LINT) $(LINT_OPTS) $(CPPFLAGS) $(srcdir)/$$N.c $(LINT_LIBS); done'"
+	print	"$(BINDIR) $(REAL_BINDIR) $(DATADIR) :"
+	print	"	mkdir -p $@"
+
+
+	if (ECHO_LINK != "") {
+		ECHO_LINK="@ echo linking $@ ... ;"
+	}
+	for (n = 0; n < count; ++n) {
+		print "";
+		printf "$(destdir)%s$x:%s %s\n", progs[n], files[n], using[n];
+		printf "\t%s$(LINK) -o $@%s %s\n", ECHO_LINK, files[n], flags[n];
+	}
+
+	}
diff --git a/test/modules b/test/modules
new file mode 100644
index 0000000..7e3fcc2
--- /dev/null
+++ b/test/modules
@@ -0,0 +1,125 @@
+# $Id: modules,v 1.78 2022/08/13 20:53:43 tom Exp $
+##############################################################################
+# Copyright 2018-2021,2022 Thomas E. Dickey                                  #
+# Copyright 1998-2016,2017 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey	1997-on
+#
+# Test-Program modules
+
+@ base
+back_ground	progs		$(srcdir)	$(HEADER_DEPS)
+background	progs		$(srcdir)	$(HEADER_DEPS)
+blue		progs		$(srcdir)	$(HEADER_DEPS)
+bs		progs		$(srcdir)	$(HEADER_DEPS)
+cardfile	progs		$(srcdir)	$(HEADER_DEPS)	$(incdir)/panel.h $(incdir)/form.h
+chgat		progs		$(srcdir)	$(HEADER_DEPS)	$(srcdir)/popup_msg.h
+clip_printw	progs		$(srcdir)	$(HEADER_DEPS)	$(srcdir)/popup_msg.h
+color_content	progs		$(srcdir)	$(HEADER_DEPS)
+color_set	progs		$(srcdir)	$(HEADER_DEPS)
+combine		progs		$(srcdir)	$(HEADER_DEPS)
+demo_altkeys	progs		$(srcdir)	$(HEADER_DEPS)
+demo_defkey	progs		$(srcdir)	$(HEADER_DEPS)
+demo_forms	progs		$(srcdir)	$(HEADER_DEPS)	$(srcdir)/edit_field.h
+demo_keyok	progs		$(srcdir)	$(HEADER_DEPS)
+demo_menus	progs		$(srcdir)	$(HEADER_DEPS)	$(incdir)/menu.h
+demo_new_pair	progs		$(srcdir)	$(HEADER_DEPS)	$(srcdir)/popup_msg.h
+demo_panels	progs		$(srcdir)	$(HEADER_DEPS)	$(incdir)/panel.h
+demo_tabs	progs		$(srcdir)	$(HEADER_DEPS)
+demo_termcap	progs		$(srcdir)	$(HEADER_DEPS)
+demo_terminfo	progs		$(srcdir)	$(HEADER_DEPS)
+ditto		progs		$(srcdir)	$(HEADER_DEPS)
+dots		progs		$(srcdir)	$(HEADER_DEPS)
+dots_curses	progs		$(srcdir)	$(HEADER_DEPS)
+dots_mvcur	progs		$(srcdir)	$(HEADER_DEPS)
+dots_termcap	progs		$(srcdir)	$(HEADER_DEPS)
+dots_xcurses	progs		$(srcdir)	$(HEADER_DEPS)
+dump_window	progs		$(srcdir)	$(HEADER_DEPS)	$(srcdir)/dump_window.h
+dup_field	progs		$(srcdir)	$(HEADER_DEPS)	$(srcdir)/edit_field.h
+echochar	progs		$(srcdir)	$(HEADER_DEPS)
+edit_field	progs		$(srcdir)	$(HEADER_DEPS)	$(srcdir)/edit_field.h	$(srcdir)/popup_msg.h
+extended_color	progs		$(srcdir)	$(HEADER_DEPS)
+filter		progs		$(srcdir)	$(HEADER_DEPS)
+firework	progs		$(srcdir)	$(HEADER_DEPS)
+firstlast	progs		$(srcdir)	$(HEADER_DEPS)
+foldkeys	progs		$(srcdir)	$(HEADER_DEPS)
+form_driver_w	progs		$(srcdir)	$(HEADER_DEPS)	$(srcdir)/popup_msg.h
+gdc		progs		$(srcdir)	$(HEADER_DEPS)
+hanoi		progs		$(srcdir)	$(HEADER_DEPS)
+hashtest	progs		$(srcdir)	$(HEADER_DEPS)
+inch_wide	progs		$(srcdir)	$(HEADER_DEPS)	$(srcdir)/popup_msg.h
+inchs		progs		$(srcdir)	$(HEADER_DEPS)	$(srcdir)/popup_msg.h
+ins_wide	progs		$(srcdir)	$(HEADER_DEPS)	$(srcdir)/linedata.h
+insdelln	progs		$(srcdir)	$(HEADER_DEPS)	$(srcdir)/popup_msg.h
+inserts		progs		$(srcdir)	$(HEADER_DEPS)	$(srcdir)/linedata.h
+key_names	progs		$(srcdir)	$(HEADER_DEPS)
+keynames	progs		$(srcdir)	$(HEADER_DEPS)
+knight		progs		$(srcdir)	$(HEADER_DEPS)
+list_keys	progs		$(srcdir)	$(HEADER_DEPS)
+lrtest		progs		$(srcdir)	$(HEADER_DEPS)
+move_field	progs		$(srcdir)	$(HEADER_DEPS)	$(srcdir)/edit_field.h
+movewindow	progs		$(srcdir)	$(HEADER_DEPS)	$(srcdir)/popup_msg.h
+ncurses		progs		$(srcdir)	$(HEADER_DEPS)	$(incdir)/panel.h $(incdir)/menu.h $(incdir)/form.h
+newdemo		progs		$(srcdir)	$(HEADER_DEPS)
+padview		progs		$(srcdir)	$(HEADER_DEPS)	$(srcdir)/widechars.h	$(srcdir)/popup_msg.h
+pair_content	progs		$(srcdir)	$(HEADER_DEPS)
+picsmap		progs		$(srcdir)	$(HEADER_DEPS)
+popup_msg	progs		$(srcdir)	$(HEADER_DEPS)	$(srcdir)/popup_msg.h
+railroad	progs		$(srcdir)	$(HEADER_DEPS)
+rain		progs		$(srcdir)	$(HEADER_DEPS)	$(srcdir)/popup_msg.h
+redraw		progs		$(srcdir)	$(HEADER_DEPS)	$(srcdir)/popup_msg.h
+savescreen	progs		$(srcdir)	$(HEADER_DEPS)	$(srcdir)/popup_msg.h $(srcdir)/parse_rgb.h
+sp_tinfo	progs		$(srcdir)	$(HEADER_DEPS)
+tclock		progs		$(srcdir)	$(HEADER_DEPS)
+test_add_wchstr	progs		$(srcdir)	$(HEADER_DEPS)	$(srcdir)/linedata.h
+test_addchstr	progs		$(srcdir)	$(HEADER_DEPS)	$(srcdir)/linedata.h
+test_addstr	progs		$(srcdir)	$(HEADER_DEPS)	$(srcdir)/linedata.h
+test_addwstr	progs		$(srcdir)	$(HEADER_DEPS)	$(srcdir)/linedata.h
+test_arrays	progs		$(srcdir)	$(HEADER_DEPS)
+test_delwin	progs		$(srcdir)	$(HEADER_DEPS)
+test_get_wstr	progs		$(srcdir)	$(HEADER_DEPS)
+test_getstr	progs		$(srcdir)	$(HEADER_DEPS)
+test_instr	progs		$(srcdir)	$(HEADER_DEPS)
+test_inwstr	progs		$(srcdir)	$(HEADER_DEPS)
+test_mouse	progs		$(srcdir)	$(HEADER_DEPS)
+test_opaque	progs		$(srcdir)	$(HEADER_DEPS)
+test_setupterm	progs		$(srcdir)	$(HEADER_DEPS)
+test_sgr	progs		$(srcdir)	$(HEADER_DEPS)
+test_termattrs	progs		$(srcdir)	$(HEADER_DEPS)
+test_tparm	progs		$(srcdir)	$(HEADER_DEPS)
+test_unget_wch	progs		$(srcdir)	$(HEADER_DEPS)
+test_vid_puts	progs		$(srcdir)	$(HEADER_DEPS)
+test_vidputs	progs		$(srcdir)	$(HEADER_DEPS)
+testaddch	progs		$(srcdir)	$(HEADER_DEPS)
+testcurs	progs		$(srcdir)	$(HEADER_DEPS)
+testscanw	progs		$(srcdir)	$(HEADER_DEPS)
+view		progs		$(srcdir)	$(HEADER_DEPS)	$(srcdir)/widechars.h	$(srcdir)/popup_msg.h
+worm		progs		$(srcdir)	$(HEADER_DEPS)
+xmas		progs		$(srcdir)	$(HEADER_DEPS)
+
+# vile:makemode
diff --git a/test/move_field.c b/test/move_field.c
new file mode 100644
index 0000000..e337319
--- /dev/null
+++ b/test/move_field.c
@@ -0,0 +1,547 @@
+/****************************************************************************
+ * Copyright 2020-2021,2022 Thomas E. Dickey                                *
+ *                                                                          *
+ * 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: move_field.c,v 1.14 2022/12/10 23:31:31 tom Exp $
+ *
+ * Demonstrate move_field().
+ */
+
+#include <test.priv.h>
+
+#if USE_LIBFORM
+
+#include <edit_field.h>
+#include <popup_msg.h>
+
+#define DO_DEMO	CTRL('F')	/* actual key for toggling demo-mode */
+#define MY_DEMO	EDIT_FIELD('f')	/* internal request-code */
+
+static char empty[] = "";
+static FIELD *all_fields[100];
+/* *INDENT-OFF* */
+static struct {
+    int code;
+    int result;
+    const char *help;
+} commands[] = {
+    { CTRL('A'),     REQ_BEG_FIELD,   "go to beginning of field" },
+    { CTRL('D'),     REQ_DOWN_FIELD,  "move downward to field" },
+    { CTRL('E'),     REQ_END_FIELD,   "go to end of field" },
+    { CTRL('H'),     REQ_DEL_PREV,    "delete previous character" },
+    { CTRL('I'),     REQ_NEXT_FIELD,  "go to next field" },
+    { CTRL('K'),     REQ_CLR_EOF,     "clear to end of field" },
+    { CTRL('N'),     REQ_NEXT_FIELD,  "go to next field" },
+    { CTRL('P'),     REQ_PREV_FIELD,  "go to previous field" },
+    { CTRL('Q'),     MY_QUIT,         "exit form" },
+    { CTRL('U'),     REQ_UP_FIELD,    "move upward to field" },
+    { CTRL('W'),     REQ_NEXT_WORD,   "go to next word" },
+    { CTRL('X'),     REQ_CLR_FIELD,   "clear field" },
+    { CTRL('['),     MY_QUIT,         "exit form" },
+    { KEY_F(1),      MY_HELP,         "show this screen", },
+    { KEY_BACKSPACE, REQ_DEL_PREV,    "delete previous character" },
+    { KEY_BTAB,      REQ_PREV_FIELD,  "go to previous field" },
+    { KEY_DOWN,      REQ_DOWN_CHAR,   "move down 1 character" },
+    { KEY_END,       REQ_LAST_FIELD,  "go to last field" },
+    { KEY_HOME,      REQ_FIRST_FIELD, "go to first field" },
+    { KEY_LEFT,      REQ_LEFT_CHAR,   "move left 1 character" },
+    { KEY_NEXT,      REQ_NEXT_FIELD,  "go to next field" },
+    { KEY_PREVIOUS,  REQ_PREV_FIELD,  "go to previous field" },
+    { KEY_RIGHT,     REQ_RIGHT_CHAR,  "move right 1 character" },
+    { KEY_UP,        REQ_UP_CHAR,     "move up 1 character" },
+    { DO_DEMO,       MY_DEMO,         "move current field with cursor keys" }
+};
+/* *INDENT-ON* */
+
+static void
+my_help_edit_field(void)
+{
+    int used = 0;
+    unsigned n;
+    char **msgs = typeCalloc(char *, 3 + SIZEOF(commands));
+
+    msgs[used++] = strdup("Defined form edit/traversal keys:");
+    for (n = 0; n < SIZEOF(commands); ++n) {
+	char *msg;
+	const char *name;
+	const char *code = keyname(commands[n].code);
+	size_t need = 5;
+#ifdef NCURSES_VERSION
+	if ((name = form_request_name(commands[n].result)) == 0)
+#endif
+	    name = commands[n].help;
+	need = 5 + strlen(code) + strlen(name);
+	msg = typeMalloc(char, need);
+	_nc_SPRINTF(msg, _nc_SLIMIT(need) "%s -- %s", code, name);
+	msgs[used++] = msg;
+    }
+    msgs[used++] =
+	strdup("Arrow keys move within a field as you would expect.");
+    msgs[used] = 0;
+    popup_msg2(stdscr, msgs);
+    for (n = 0; msgs[n] != 0; ++n) {
+	free(msgs[n]);
+    }
+    free(msgs);
+}
+
+static FIELD *
+make_label(const char *label, int frow, int fcol)
+{
+    FIELD *f = new_field(1, (int) strlen(label), frow, fcol, 0, 0);
+
+    if (f) {
+	set_field_buffer(f, 0, label);
+	set_field_opts(f, (int) ((unsigned) field_opts(f) & ~O_ACTIVE));
+    }
+    return (f);
+}
+
+static FIELD *
+make_field(int frow, int fcol, int rows, int cols)
+{
+    FIELD *f = new_field(rows, cols, frow, fcol, 0, 1);
+
+    if (f) {
+	set_field_back(f, A_UNDERLINE);
+	init_edit_field(f, empty);
+    }
+    return (f);
+}
+
+static void
+erase_form(FORM *f)
+{
+    WINDOW *w = form_win(f);
+    WINDOW *s = form_sub(f);
+
+    unpost_form(f);
+    werase(w);
+    wrefresh(w);
+    delwin(s);
+}
+
+static FieldAttrs *
+my_field_attrs(FIELD *f)
+{
+    return (FieldAttrs *) field_userptr(f);
+}
+
+static int
+buffer_length(FIELD *f)
+{
+    return my_field_attrs(f)->row_lengths[0];
+}
+
+static void
+set_buffer_length(FIELD *f, int length)
+{
+    my_field_attrs(f)->row_lengths[0] = length;
+}
+
+static int
+offset_in_field(FORM *form)
+{
+    FIELD *field = current_field(form);
+    int currow, curcol;
+
+    form_getyx(form, currow, curcol);
+    return curcol + currow * (int) field->dcols;
+}
+
+static void
+inactive_field(FIELD *f)
+{
+    set_field_back(f, my_field_attrs(f)->background);
+}
+
+static int
+my_edit_field(FORM *form, int *result)
+{
+    int ch = wgetch(form_win(form));
+    int status;
+    FIELD *before;
+    unsigned n;
+    int before_row;
+    int before_col;
+    int before_off = offset_in_field(form);
+
+    form_getyx(form, before_row, before_col);
+    before = current_field(form);
+    set_field_back(before, A_NORMAL);
+    if (ch <= KEY_MAX) {
+	set_field_back(before, A_REVERSE);
+    } else if (ch <= MAX_FORM_COMMAND) {
+	inactive_field(before);
+    }
+
+    *result = ch;
+    for (n = 0; n < SIZEOF(commands); ++n) {
+	if (commands[n].code == ch) {
+	    *result = commands[n].result;
+	    break;
+	}
+    }
+
+    status = form_driver(form, *result);
+
+    if (status == E_OK) {
+	bool modified = TRUE;
+	int length = buffer_length(before);
+
+	if (length < before_off)
+	    length = before_off;
+	switch (*result) {
+	case REQ_CLR_EOF:
+	    length = before_off;
+	    break;
+	case REQ_CLR_EOL:
+	    if ((int) (before_row + 1) == (int) (before->rows))
+		length = before_off;
+	    break;
+	case REQ_CLR_FIELD:
+	    length = 0;
+	    break;
+	case REQ_DEL_CHAR:
+	    if (length > before_off)
+		--length;
+	    break;
+	case REQ_DEL_PREV:
+	    if (length > 0) {
+		if (before_col > 0) {
+		    --length;
+		} else if (before_row > 0) {
+		    length -= (int) before->cols + before_col;
+		}
+	    }
+	    break;
+	case REQ_NEW_LINE:
+	    length += (int) before->cols;
+	    break;
+
+	default:
+	    modified = (ch < MIN_FORM_COMMAND
+			&& isprint(ch));
+	    break;
+	}
+
+	/*
+	 * If we do not force a re-validation, then field_buffer 0 will
+	 * be lagging by one character.
+	 */
+	if (modified && form_driver(form, REQ_VALIDATION) == E_OK && *result
+	    < MIN_FORM_COMMAND)
+	    ++length;
+
+	set_buffer_length(before, length);
+    }
+
+    if (current_field(form) != before)
+	inactive_field(before);
+    return status;
+}
+
+static FIELD **
+copy_fields(FIELD **source, size_t length)
+{
+    FIELD **target = typeCalloc(FIELD *, length + 1);
+    memcpy(target, source, length * sizeof(FIELD *));
+    return target;
+}
+
+/* display a status message to show what's happening */
+static void
+show_status(FORM *form, FIELD *field)
+{
+    WINDOW *sub = form_sub(form);
+    int currow, curcol;
+
+    getyx(stdscr, currow, curcol);
+    mvprintw(LINES - 1, 0,
+	     "Field at [%d,%d].  Press %s to quit moving.",
+	     getbegy(sub) + form_field_row(field),
+	     getbegx(sub) + form_field_col(field),
+	     keyname(DO_DEMO));
+    clrtobot();
+    move(currow, curcol);
+    refresh();
+}
+
+/*
+ * Move the current label+field in response to cursor-keys (or h,j,k,l) until
+ * a control/F is read.
+ */
+static void
+do_demo(FORM *form)
+{
+    int count = field_count(form);
+    FIELD *my_field = current_field(form);
+    FIELD **old_fields = form_fields(form);
+
+    if (count > 0 && old_fields != NULL && my_field != NULL) {
+	size_t needed = (size_t) count;
+	FIELD **new_fields = copy_fields(old_fields, needed);
+
+	if (new_fields != NULL) {
+	    bool found = FALSE;
+	    int ch;
+
+	    /* TODO: move the label too, in parallel with the editing field */
+
+	    /* remove the current field from the newer list */
+	    for (ch = 0; ch <= count; ++ch) {
+		if (found) {
+		    new_fields[ch - 1] = new_fields[ch];
+		} else if (new_fields[ch] == my_field) {
+		    found = TRUE;
+		}
+	    }
+
+	    if (found) {
+		int currow, curcol;
+
+		getyx(stdscr, currow, curcol);
+
+		show_status(form, my_field);
+		while ((ch = wgetch(form_win(form))) != DO_DEMO) {
+		    int field_y = form_field_row(my_field);
+		    int field_x = form_field_col(my_field);
+
+		    switch (ch) {
+		    case 'h':
+		    case KEY_LEFT:
+			if (field_x > 0)
+			    field_x--;
+			break;
+		    case 'j':
+		    case KEY_DOWN:
+			field_y++;
+			break;
+		    case 'k':
+		    case KEY_UP:
+			if (field_y > 0)
+			    field_y--;
+			break;
+		    case 'l':
+		    case KEY_RIGHT:
+			field_x++;
+			break;
+		    case CTRL('Q'):
+		    case CTRL('['):
+			ch = DO_DEMO;
+			/* FALLTHRU */
+		    case DO_DEMO:
+			break;
+		    default:
+			continue;
+		    }
+
+		    if (ch == DO_DEMO)
+			break;
+
+		    /* alter connected fields temporarily to move the field */
+		    unpost_form(form);
+		    set_form_fields(form, new_fields);
+		    post_form(form);
+
+		    /* TODO: update screen position on success */
+		    move_field(my_field, field_y, field_x);
+
+		    /* restore the form's list of fields */
+		    unpost_form(form);
+		    set_form_fields(form, old_fields);
+		    post_form(form);
+
+		    show_status(form, my_field);
+		}
+
+		/* cleanup */
+		move(LINES - 1, 0);
+		clrtobot();
+		move(currow, curcol);
+		refresh();
+	    }
+	}
+	free(new_fields);
+    }
+}
+
+static int
+my_form_driver(FORM *form, int c)
+{
+    switch (c) {
+    case MY_QUIT:
+	if (form_driver(form, REQ_VALIDATION) == E_OK)
+	    return (TRUE);
+	break;
+    case MY_HELP:
+	my_help_edit_field();
+	break;
+    case MY_DEMO:
+	do_demo(form);
+	break;
+    default:
+	beep();
+	break;
+    }
+    return (FALSE);
+}
+
+static void
+demo_forms(void)
+{
+    FORM *form;
+    int c;
+    unsigned n = 0;
+    const char *fname;
+
+    /* describe the form */
+    all_fields[n++] = make_label("Sample Form", 0, 15);
+
+    fname = "Last Name";
+    all_fields[n++] = make_label(fname, 2, 0);
+    all_fields[n++] = make_field(3, 0, 1, 18);
+    set_field_type(all_fields[n - 1], TYPE_ALPHA, 1);
+
+    fname = "First Name";
+    all_fields[n++] = make_label(fname, 2, 20);
+    all_fields[n++] = make_field(3, 20, 1, 12);
+    set_field_type(all_fields[n - 1], TYPE_ALPHA, 1);
+
+    fname = "Middle Name";
+    all_fields[n++] = make_label(fname, 2, 34);
+    all_fields[n++] = make_field(3, 34, 1, 12);
+    set_field_type(all_fields[n - 1], TYPE_ALPHA, 1);
+
+    fname = "Comments";
+    all_fields[n++] = make_label(fname, 5, 0);
+    all_fields[n++] = make_field(6, 0, 4, 46);
+    init_edit_field(all_fields[n - 1], empty);
+
+    all_fields[n] = (FIELD *) 0;
+
+    if ((form = new_form(all_fields)) != 0) {
+	int finished = 0;
+
+	post_form(form);
+
+	while (!finished) {
+	    switch (my_edit_field(form, &c)) {
+	    case E_OK:
+		break;
+	    case E_UNKNOWN_COMMAND:
+		finished = my_form_driver(form, c);
+		break;
+	    default:
+		beep();
+		break;
+	    }
+	}
+
+	erase_form(form);
+
+	free_form(form);
+    }
+    for (c = 0; all_fields[c] != 0; c++) {
+	free_edit_field(all_fields[c]);
+	free_field(all_fields[c]);
+    }
+    noraw();
+    nl();
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: move_field [options]"
+	,""
+	,USAGE_COMMON
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) {
+	switch (ch) {
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind < argc)
+	usage(FALSE);
+
+    setlocale(LC_ALL, "");
+
+    initscr();
+    cbreak();
+    noecho();
+    raw();
+    nonl();			/* lets us read ^M's */
+    intrflush(stdscr, FALSE);
+    keypad(stdscr, TRUE);
+
+    if (has_colors()) {
+	start_color();
+	init_pair(1, COLOR_WHITE, COLOR_BLUE);
+	init_pair(2, COLOR_GREEN, COLOR_BLACK);
+	init_pair(3, COLOR_CYAN, COLOR_BLACK);
+	bkgd((chtype) COLOR_PAIR(1));
+	refresh();
+    }
+
+    demo_forms();
+
+    endwin();
+    ExitProgram(EXIT_SUCCESS);
+}
+
+#else
+int
+main(void)
+{
+    printf("This program requires the curses form library\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif
diff --git a/test/movewindow.c b/test/movewindow.c
new file mode 100644
index 0000000..7fe7329
--- /dev/null
+++ b/test/movewindow.c
@@ -0,0 +1,811 @@
+/****************************************************************************
+ * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 2006-2013,2017 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: movewindow.c,v 1.53 2022/12/10 23:31:31 tom Exp $
+ *
+ * Demonstrate move functions for windows and derived windows from the curses
+ * library.
+ *
+ * Author: Thomas E. Dickey
+ */
+/*
+derwin
+mvderwin
+subwin
+mvwin
+
+TODO:
+    add command to reset subwindow's origin to coincide with parent.
+    add command to delete subwindow (check if it has subwindows though)
+ */
+
+#include <test.priv.h>
+
+#if HAVE_MVDERWIN && HAVE_MVWIN
+
+#include <popup_msg.h>
+
+#ifdef HAVE_XCURSES
+#undef derwin
+#endif
+
+#undef LINE_MAX
+
+#define LINE_MIN	2
+#define LINE_MAX	(LINES - 2)
+#define COL_MIN		2
+#define COL_MAX		(COLS - 2)
+
+typedef struct {
+    int y, x;
+} PAIR;
+
+typedef struct {
+    WINDOW *parent;		/* need this since WINDOW->_parent is not portable */
+    WINDOW *child;		/* the actual value */
+} FRAME;
+
+static void head_line(CONST_FMT char *fmt, ...) GCC_PRINTFLIKE(1, 2);
+static void tail_line(CONST_FMT char *fmt, ...) GCC_PRINTFLIKE(1, 2);
+
+static unsigned num_windows;
+static FRAME *all_windows;
+
+static void
+failed(const char *s)
+{
+    perror(s);
+    endwin();
+    ExitProgram(EXIT_FAILURE);
+}
+
+static void
+message(int lineno, CONST_FMT char *fmt, va_list argp)
+{
+    int y, x;
+
+    getyx(stdscr, y, x);
+    move(lineno, 0);
+    clrtoeol();
+
+#ifdef HAVE_XCURSES
+    {
+	char buffer[1024];
+	vsprintf(buffer, fmt, argp);
+	addstr(buffer);
+    }
+#elif defined(HAVE_VW_PRINTW)
+    vw_printw(stdscr, fmt, argp);
+#else
+    vwprintw(stdscr, fmt, argp);
+#endif
+
+    move(y, x);
+    refresh();
+}
+
+static void
+head_line(CONST_FMT char *fmt, ...)
+{
+    va_list argp;
+
+    va_start(argp, fmt);
+    message(0, fmt, argp);
+    va_end(argp);
+}
+
+static void
+tail_line(CONST_FMT char *fmt, ...)
+{
+    va_list argp;
+
+    va_start(argp, fmt);
+    message(LINES - 1, fmt, argp);
+    va_end(argp);
+}
+
+/*
+ * Arrow keys move cursor, return location at current on non-arrow key.
+ */
+static PAIR *
+selectcell(WINDOW *parent,
+	   WINDOW *child,
+	   int uli, int ulj,
+	   int lri, int lrj,
+	   bool relative,
+	   bool * more)
+{
+    static PAIR res;		/* result cell */
+    int si = lri - uli + 1;	/* depth of the select area */
+    int sj = lrj - ulj + 1;	/* width of the select area */
+    int i = 0, j = 0;		/* offsets into the select area */
+
+    res.y = uli;
+    res.x = ulj;
+
+    if (child != 0) {
+	if (relative) {
+	    getparyx(child, i, j);
+	} else {
+	    getbegyx(child, i, j);
+	    i -= uli + getbegy(parent);
+	    j -= ulj + getbegx(parent);
+	}
+    }
+
+    if (more)
+	*more = FALSE;
+
+    for (;;) {
+	bool moved = FALSE;
+
+	tail_line("Upper left [%2d,%2d] Lower right [%2d,%2d] -> %d,%d -> %d,%d",
+		  uli, ulj,
+		  lri, lrj,
+		  i, j,
+		  uli + i, ulj + j);
+	wmove(parent, uli + i, ulj + j);
+
+	switch (wgetch(parent)) {
+	case KEY_UP:
+	    i += si - 1;
+	    moved = TRUE;
+	    break;
+	case KEY_DOWN:
+	    i++;
+	    moved = TRUE;
+	    break;
+	case KEY_LEFT:
+	    j += sj - 1;
+	    moved = TRUE;
+	    break;
+	case KEY_RIGHT:
+	    j++;
+	    moved = TRUE;
+	    break;
+	case QUIT:
+	    /* FALLTHRU */
+	case ESCAPE:
+	    return ((PAIR *) 0);
+#ifdef NCURSES_MOUSE_VERSION
+	case KEY_MOUSE:
+	    {
+		MEVENT event;
+
+		getmouse(&event);
+		if (event.y > uli && event.x > ulj) {
+		    if (parent != stdscr) {
+			i = event.y - getbegy(parent) - uli;
+			j = event.x - getbegx(parent) - ulj;
+		    } else {
+			i = event.y - uli;
+			j = event.x - ulj;
+		    }
+		} else {
+		    beep();
+		    break;
+		}
+	    }
+#endif
+	    /* FALLTHRU */
+	default:
+	    res.y = uli + i;
+	    res.x = ulj + j;
+	    return (&res);
+	}
+
+	if (si <= 0)
+	    i = 0;
+	else
+	    i %= si;
+
+	if (sj <= 0)
+	    j = 0;
+	else
+	    j %= sj;
+
+	/*
+	 * If the caller can handle continuous movement, return the result.
+	 */
+	if (moved && more) {
+	    *more = TRUE;
+	    res.y = uli + i;
+	    res.x = ulj + j;
+	    return (&res);
+	}
+    }
+}
+
+/*
+ * Ask user for a window definition.
+ */
+static bool
+getwindow(WINDOW *parent, PAIR * ul, PAIR * lr)
+{
+    int min_col = (parent == stdscr) ? COL_MIN : 0;
+    int max_col = (parent == stdscr) ? COL_MAX : getmaxx(parent);
+    int min_line = (parent == stdscr) ? LINE_MIN : 0;
+    int max_line = (parent == stdscr) ? LINE_MAX : getmaxy(parent);
+    PAIR *tmp;
+    bool result = FALSE;
+
+    head_line("Use arrows to move cursor, anything else to mark corner 1");
+    if ((tmp = selectcell(parent, 0,
+			  min_line, min_col,
+			  max_line, max_col,
+			  FALSE,
+			  (bool *) 0)) != 0) {
+	*ul = *tmp;
+	MvWAddCh(parent, ul->y, ul->x, '*');
+
+	head_line("Use arrows to move cursor, anything else to mark corner 2");
+	if ((tmp = selectcell(parent, 0,
+			      ul->y, ul->x,
+			      max_line, max_col,
+			      FALSE,
+			      (bool *) 0)) != 0) {
+	    *lr = *tmp;
+	    MvWAddCh(parent, lr->y, lr->x, '*');
+	    wmove(parent, lr->y, lr->x);
+	    wsyncdown(parent);
+	    wrefresh(parent);
+	    result = (lr->y != ul->y && lr->x != ul->x);
+	}
+    }
+    head_line("done");
+    return result;
+}
+
+/*
+ * Draw a box inside the given window.
+ */
+static void
+box_inside(WINDOW *win)
+{
+    int y0, x0;
+    int y1, x1;
+
+    getyx(win, y0, x0);
+    getmaxyx(win, y1, x1);
+
+    MvWHLine(win, 0, 0, ACS_HLINE, x1);
+    MvWHLine(win, y1 - 1, 0, ACS_HLINE, x1);
+
+    MvWVLine(win, 0, 0, ACS_VLINE, y1);
+    MvWVLine(win, 0, x1 - 1, ACS_VLINE, y1);
+
+    MvWAddCh(win, 0, 0, ACS_ULCORNER);
+    MvWAddCh(win, y1 - 1, 0, ACS_LLCORNER);
+    MvWAddCh(win, 0, x1 - 1, ACS_URCORNER);
+    MvWAddCh(win, y1 - 1, x1 - 1, ACS_LRCORNER);
+
+    wsyncdown(win);
+    wmove(win, y0, x0);
+    wrefresh(win);
+}
+
+/*
+ * Add a window to our list.
+ */
+static void
+add_window(WINDOW *parent, WINDOW *child)
+{
+    static unsigned have = 0;
+    unsigned need = ((num_windows + 1) | 31) + 1;
+
+    keypad(child, TRUE);
+    if (need > have) {
+	all_windows = typeRealloc(FRAME, need, all_windows);
+	if (!all_windows)
+	    failed("add_window");
+    }
+    all_windows[num_windows].parent = parent;
+    all_windows[num_windows].child = child;
+    num_windows++;
+}
+
+static int
+window2num(WINDOW *win)
+{
+    int n;
+    int result = -1;
+    for (n = 0; n < (int) num_windows; ++n) {
+	if (win == all_windows[n].child) {
+	    result = n;
+	    break;
+	}
+    }
+    return result;
+}
+
+static WINDOW *
+parent_of(WINDOW *win)
+{
+    WINDOW *result = 0;
+    int n = window2num(win);
+    if (n >= 0)
+	result = all_windows[n].parent;
+    return result;
+}
+
+static void
+repaint_one(WINDOW *win)
+{
+    touchwin(win);
+    wnoutrefresh(win);
+}
+
+static void
+refresh_all(WINDOW *win)
+{
+    unsigned n;
+
+    for (n = 0; n < num_windows; ++n) {
+	if (all_windows[n].child != win) {
+	    repaint_one(all_windows[n].child);
+	}
+    }
+
+    repaint_one(win);
+    doupdate();
+}
+
+static WINDOW *
+next_window(WINDOW *win)
+{
+    WINDOW *result = win;
+    int n = window2num(win);
+
+    if (n++ >= 0) {
+	result = all_windows[(unsigned) n % num_windows].child;
+	wmove(result, 0, 0);
+	wrefresh(result);
+    }
+    return result;
+}
+
+static WINDOW *
+prev_window(WINDOW *win)
+{
+    WINDOW *result = win;
+    int n = window2num(win);
+
+    if (n-- >= 0) {
+	if (n < 0)
+	    n = (int) (num_windows - 1);
+	result = all_windows[(unsigned) n % num_windows].child;
+	wmove(result, 0, 0);
+	wrefresh(result);
+    }
+    return result;
+}
+
+static void
+recur_move_window(WINDOW *parent, int dy, int dx)
+{
+    unsigned n;
+
+    for (n = 0; n < num_windows; ++n) {
+	if (all_windows[n].parent == parent) {
+	    mvwin(all_windows[n].child, dy, dx);
+	    recur_move_window(all_windows[n].child, dy, dx);
+	}
+    }
+}
+
+/*
+ * test mvwin().
+ */
+static bool
+move_window(WINDOW *win, bool recur)
+{
+    WINDOW *parent = parent_of(win);
+    bool result = FALSE;
+
+    if (parent != 0) {
+	bool top = (parent == stdscr);
+	int min_col = top ? COL_MIN : 0;
+	int max_col = top ? COL_MAX : getmaxx(parent);
+	int min_line = top ? LINE_MIN : 0;
+	int max_line = top ? LINE_MAX : getmaxy(parent);
+	PAIR *tmp;
+	bool more;
+
+	head_line("Select new position for %swindow", top ? "" : "sub");
+
+	while ((tmp = selectcell(parent,
+				 win,
+				 min_line, min_col,
+				 max_line, max_col,
+				 FALSE,
+				 &more)) != 0) {
+	    int y0, x0;
+	    getbegyx(parent, y0, x0);
+	    /*
+	     * Moving a subwindow has the effect of moving a viewport around
+	     * the screen.  The parent window retains the contents of the
+	     * subwindow in the original location, but the viewport will show
+	     * the contents (again) at the new location.  So it will look odd
+	     * when testing.
+	     */
+	    if (mvwin(win, y0 + tmp->y, x0 + tmp->x) != ERR) {
+		if (recur) {
+		    recur_move_window(win, tmp->y, tmp->x);
+		}
+		refresh_all(win);
+		doupdate();
+		result = TRUE;
+	    } else {
+		result = FALSE;
+	    }
+	    if (!more)
+		break;
+	}
+    }
+    head_line("done");
+    return result;
+}
+
+static void
+show_derwin(WINDOW *win)
+{
+    int pary, parx, maxy, maxx;
+
+    getmaxyx(win, maxy, maxx);
+    getparyx(win, pary, parx);
+
+    head_line("Select new position for derived window at %d,%d (%d,%d)",
+	      pary, parx, maxy, maxx);
+}
+
+/*
+ * test mvderwin().
+ */
+static bool
+move_derwin(WINDOW *win)
+{
+    WINDOW *parent = parent_of(win);
+    bool result = FALSE;
+
+    if (parent != 0) {
+	bool top = (parent == stdscr);
+	int min_col = top ? COL_MIN : 0;
+	int max_col = top ? COL_MAX : getmaxx(parent);
+	int min_line = top ? LINE_MIN : 0;
+	int max_line = top ? LINE_MAX : getmaxy(parent);
+	PAIR *tmp;
+	bool more;
+
+	show_derwin(win);
+	while ((tmp = selectcell(parent,
+				 win,
+				 min_line, min_col,
+				 max_line, max_col,
+				 TRUE,
+				 &more)) != 0) {
+	    if (mvderwin(win, tmp->y, tmp->x) != ERR) {
+		refresh_all(win);
+		doupdate();
+		repaint_one(win);
+		doupdate();
+		result = TRUE;
+		show_derwin(win);
+	    } else {
+		flash();
+	    }
+	    if (!more)
+		break;
+	}
+    }
+    head_line("done");
+    return result;
+}
+
+static void
+fill_window(WINDOW *win, chtype ch)
+{
+    int y, x;
+    int y0, x0;
+    int y1, x1;
+
+    getyx(win, y0, x0);
+    getmaxyx(win, y1, x1);
+    for (y = 0; y < y1; ++y) {
+	for (x = 0; x < x1; ++x) {
+	    MvWAddCh(win, y, x, ch);
+	}
+    }
+    wsyncdown(win);
+    wmove(win, y0, x0);
+    wrefresh(win);
+}
+
+static void
+fill_with_pattern(WINDOW *win)
+{
+    int y, x;
+    int y0, x0;
+    int y1, x1;
+    int ch = 'a';
+
+    getyx(win, y0, x0);
+    getmaxyx(win, y1, x1);
+    for (y = 0; y < y1; ++y) {
+	for (x = 0; x < x1; ++x) {
+	    MvWAddCh(win, y, x, (chtype) ch);
+	    if (++ch > 'z')
+		ch = 'a';
+	}
+    }
+    wsyncdown(win);
+    wmove(win, y0, x0);
+    wrefresh(win);
+}
+
+#define lines_of(ul,lr)	(lr.y - ul.y + 1)
+#define cols_of(ul,lr)	(lr.x - ul.x + 1)
+#define pair_of(ul)	ul.y, ul.x
+
+static WINDOW *
+create_my_window(WINDOW *current)
+{
+    PAIR ul, lr;
+    WINDOW *result = 0;
+
+    if (getwindow(stdscr, &ul, &lr)) {
+	result = newwin(lines_of(ul, lr), cols_of(ul, lr), pair_of(ul));
+	if (result != 0) {
+	    fill_window(result, 'c');
+	    add_window(stdscr, result);
+	}
+    }
+    if (result == 0)
+	result = current;
+    return result;
+}
+
+static WINDOW *
+create_my_derwin(WINDOW *parent)
+{
+    PAIR ul, lr;
+    WINDOW *result = 0;
+
+    if (getwindow(parent, &ul, &lr)) {
+	result = derwin(parent, lines_of(ul, lr), cols_of(ul, lr), pair_of(ul));
+	if (result != 0) {
+	    fill_window(result, 'd');
+	    add_window(parent, result);
+	}
+    }
+    if (result == 0)
+	result = parent;
+    return result;
+}
+
+static WINDOW *
+create_my_subwin(WINDOW *parent)
+{
+    PAIR ul, lr;
+    WINDOW *result = 0;
+
+    if (getwindow(parent, &ul, &lr)) {
+	result = subwin(parent,
+			lines_of(ul, lr),
+			cols_of(ul, lr),
+			ul.y + getbegy(parent),
+			ul.x + getbegx(parent));
+	if (result != 0) {
+	    fill_window(result, 's');
+	    add_window(parent, result);
+	}
+    }
+    if (result == 0)
+	result = parent;
+    return result;
+}
+
+static void
+show_help(WINDOW *current)
+{
+    /* *INDENT-OFF* */
+    static struct {
+	int	key;
+	CONST_FMT char * msg;
+    } help[] = {
+	{ HELP_KEY_1,	"Show this screen" },
+	{ 'b',		"Draw a box inside the current window" },
+	{ 'c',		"Create a new window" },
+	{ 'd',		"Create a new derived window" },
+	{ 'D',		"Move derived window (moves viewport)" },
+	{ 'f',		"Fill the current window with the next character" },
+	{ 'F',		"Fill the current window with a pattern" },
+	{ 'm',		"Move the current window" },
+	{ 'M',		"Move the current window (and its children)" },
+	{ 'q',		"Quit" },
+	{ 's',		"Create a new subwindow" },
+	{ CTRL('L'),	"Repaint all windows, doing current one last" },
+	{ CTRL('N'),	"Cursor to next window" },
+	{ CTRL('P'),	"Cursor to previous window" },
+    };
+    /* *INDENT-ON* */
+
+    char **msgs = typeCalloc(char *, SIZEOF(help) + 1);
+    size_t n;
+
+    for (n = 0; n < SIZEOF(help); ++n) {
+	size_t need = (21 + strlen(help[n].msg));
+	msgs[n] = typeMalloc(char, need);
+	_nc_SPRINTF(msgs[n], _nc_SLIMIT(need)
+		    "%-20s%s", keyname(help[n].key), help[n].msg);
+    }
+    popup_msg2(current, msgs);
+    for (n = 0; n < SIZEOF(help); ++n) {
+	free(msgs[n]);
+    }
+    free(msgs);
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: movewindow [options]"
+	,""
+	,USAGE_COMMON
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    WINDOW *current_win;
+    int ch;
+    bool done = FALSE;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) {
+	switch (ch) {
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind < argc)
+	usage(FALSE);
+
+    initscr();
+    cbreak();
+    noecho();
+    nonl();
+    intrflush(stdscr, FALSE);
+
+    add_window(0, current_win = stdscr);
+
+#ifdef NCURSES_MOUSE_VERSION
+    (void) mousemask(BUTTON1_CLICKED, (mmask_t *) NULL);
+#endif /* NCURSES_MOUSE_VERSION */
+
+    while (!done && (ch = wgetch(current_win)) != ERR) {
+	int y, x;
+
+	getyx(current_win, y, x);
+
+	switch (ch) {
+	case HELP_KEY_1:
+	    show_help(current_win);
+	    break;
+	case 'b':
+	    box_inside(current_win);
+	    break;
+	case 'c':
+	    current_win = create_my_window(current_win);
+	    break;
+	case 'd':
+	    current_win = create_my_derwin(current_win);
+	    break;
+	case 'D':
+	    if (!move_derwin(current_win)) {
+		tail_line("error");
+		continue;
+	    }
+	    break;
+	case 'f':
+	    fill_window(current_win, (chtype) wgetch(current_win));
+	    break;
+	case 'F':
+	    fill_with_pattern(current_win);
+	    break;
+	case 'm':
+	case 'M':
+	    if (!move_window(current_win, (ch == 'M'))) {
+		tail_line("error");
+		continue;
+	    }
+	    break;
+	case 'q':
+	    done = TRUE;
+	    break;
+	case 's':
+	    current_win = create_my_subwin(current_win);
+	    break;
+	case CTRL('L'):
+	    refresh_all(current_win);
+	    break;
+	case CTRL('N'):
+	    current_win = next_window(current_win);
+	    break;
+	case CTRL('P'):
+	    current_win = prev_window(current_win);
+	    break;
+#if 0
+	    /* want to allow cursor to move around the current window too */
+	    /* want to test the resizing of windows and subwindows too */
+	    /* want to allow deleting a window also */
+#endif
+	default:
+	    wmove(current_win, y, x);
+	    tail_line("unrecognized key (use '?' for help)");
+	    beep();
+	    continue;
+	}
+	tail_line("size [%d,%d] begin [%d,%d] parent [%d,%d]",
+		  getmaxy(current_win),
+		  getmaxx(current_win),
+		  getbegy(current_win),
+		  getbegx(current_win),
+		  getpary(current_win),
+		  getparx(current_win));
+	wmove(current_win, 0, 0);
+    }
+    endwin();
+#if NO_LEAKS
+    free(all_windows);
+#endif
+    ExitProgram(EXIT_SUCCESS);
+}
+#else
+int
+main(void)
+{
+    printf("This program requires the curses mvderwin and mvwin functions\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif
diff --git a/test/ncurses.c b/test/ncurses.c
new file mode 100644
index 0000000..afa631a
--- /dev/null
+++ b/test/ncurses.c
@@ -0,0 +1,8083 @@
+/****************************************************************************
+ * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+/****************************************************************************
+
+NAME
+   ncurses.c --- ncurses library exerciser
+
+SYNOPSIS
+   ncurses
+
+DESCRIPTION
+   An interactive test module for the ncurses library.
+
+AUTHOR
+   Author: Eric S. Raymond <esr@snark.thyrsus.com> 1993
+           Thomas E. Dickey (beginning revision 1.27 in 1996).
+
+$Id: ncurses.c,v 1.532 2022/12/04 00:40:11 tom Exp $
+
+***************************************************************************/
+
+#include <test.priv.h>
+
+#ifdef __hpux
+#undef mvwdelch			/* HPUX 11.23 macro will not compile */
+#endif
+
+#if HAVE_GETTIMEOFDAY
+#if HAVE_SYS_TIME_H && HAVE_SYS_TIME_SELECT
+#include <sys/time.h>
+#endif
+#if HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
+#endif
+
+#if USE_LIBPANEL
+#include <panel.h>
+#endif
+
+#if USE_LIBMENU
+#include <menu.h>
+#endif
+
+#if USE_LIBFORM
+#include <form.h>
+#endif
+
+#ifdef NCURSES_VERSION
+
+#define NCURSES_CONST_PARAM const void
+
+#ifdef TRACE
+static unsigned save_trace = TRACE_ORDINARY | TRACE_ICALLS | TRACE_CALLS;
+#endif
+
+#else
+
+#define NCURSES_CONST_PARAM char
+
+#define mmask_t chtype		/* not specified in XSI */
+
+#ifndef ACS_S3
+#ifdef CURSES_ACS_ARRAY
+#define ACS_S3          (CURSES_ACS_ARRAY['p'])		/* scan line 3 */
+#define ACS_S7          (CURSES_ACS_ARRAY['r'])		/* scan line 7 */
+#define ACS_LEQUAL      (CURSES_ACS_ARRAY['y'])		/* less/equal */
+#define ACS_GEQUAL      (CURSES_ACS_ARRAY['z'])		/* greater/equal */
+#define ACS_PI          (CURSES_ACS_ARRAY['{'])		/* Pi */
+#define ACS_NEQUAL      (CURSES_ACS_ARRAY['|'])		/* not equal */
+#define ACS_STERLING    (CURSES_ACS_ARRAY['}'])		/* UK pound sign */
+#else
+#define ACS_S3          (A_ALTCHARSET + 'p')	/* scan line 3 */
+#define ACS_S7          (A_ALTCHARSET + 'r')	/* scan line 7 */
+#define ACS_LEQUAL      (A_ALTCHARSET + 'y')	/* less/equal */
+#define ACS_GEQUAL      (A_ALTCHARSET + 'z')	/* greater/equal */
+#define ACS_PI          (A_ALTCHARSET + '{')	/* Pi */
+#define ACS_NEQUAL      (A_ALTCHARSET + '|')	/* not equal */
+#define ACS_STERLING    (A_ALTCHARSET + '}')	/* UK pound sign */
+#endif
+#endif /* ACS_S3 */
+
+#ifndef WACS_S3
+#ifdef CURSES_WACS_ARRAY
+#define WACS_S3         (&(CURSES_WACS_ARRAY['p']))	/* scan line 3 */
+#define WACS_S7         (&(CURSES_WACS_ARRAY['r']))	/* scan line 7 */
+#define WACS_LEQUAL     (&(CURSES_WACS_ARRAY['y']))	/* less/equal */
+#define WACS_GEQUAL     (&(CURSES_WACS_ARRAY['z']))	/* greater/equal */
+#define WACS_PI         (&(CURSES_WACS_ARRAY['{']))	/* Pi */
+#define WACS_NEQUAL     (&(CURSES_WACS_ARRAY['|']))	/* not equal */
+#define WACS_STERLING   (&(CURSES_WACS_ARRAY['}']))	/* UK pound sign */
+#endif
+#endif
+
+#endif
+
+#if HAVE_WCSRTOMBS
+#define count_wchars(src, len, state)      wcsrtombs(0,   &src, len, state)
+#define trans_wchars(dst, src, len, state) wcsrtombs(dst, &src, len, state)
+#define reset_wchars(state) init_mb(state)
+#elif HAVE_WCSTOMBS && HAVE_MBTOWC && HAVE_MBLEN
+#define count_wchars(src, len, state)      wcstombs(0,   src, len)
+#define trans_wchars(dst, src, len, state) wcstombs(dst, src, len)
+#define reset_wchars(state) IGNORE_RC(mblen(NULL, 0)), IGNORE_RC(mbtowc(NULL, NULL, 0))
+#define state_unused
+#endif
+
+#if HAVE_MBSRTOWCS
+#define count_mbytes(src, len, state)      mbsrtowcs(0,   &src, len, state)
+#define trans_mbytes(dst, src, len, state) mbsrtowcs(dst, &src, len, state)
+#define reset_mbytes(state) init_mb(state)
+#elif HAVE_MBSTOWCS && HAVE_MBTOWC && HAVE_MBLEN
+#define count_mbytes(src, len, state)      mbstowcs(0,   src, len)
+#define trans_mbytes(dst, src, len, state) mbstowcs(dst, src, len)
+#define reset_mbytes(state) IGNORE_RC(mblen(NULL, 0)), IGNORE_RC(mbtowc(NULL, NULL, 0))
+#define state_unused
+#endif
+
+#define ToggleAcs(temp,real) temp = ((temp == real) ? NULL : real)
+
+#define P(string)	printw("%s\n", string)
+
+#define BLANK		' '	/* this is the background character */
+
+static int MaxColors;		/* the actual number of colors we'll use */
+static int MinColors;		/* the minimum color code */
+static bool UseColors;		/* true if we use colors */
+
+#undef max_pairs
+static int max_pairs;		/* ...and the number of color pairs */
+
+#if HAVE_COLOR_CONTENT
+typedef struct {
+    NCURSES_COLOR_T red;
+    NCURSES_COLOR_T green;
+    NCURSES_COLOR_T blue;
+} RGB_DATA;
+
+static RGB_DATA *all_colors;
+#endif
+
+static void main_menu(bool);
+static GCC_NORETURN void failed(const char *s);
+
+static void
+failed(const char *s)
+{
+    perror(s);
+    endwin();
+    ExitProgram(EXIT_FAILURE);
+}
+
+static void
+Repaint(void)
+{
+    touchwin(stdscr);
+#if HAVE_CURSCR
+    touchwin(curscr);
+    wrefresh(curscr);
+#else
+    wrefresh(stdscr);
+#endif
+}
+
+static bool
+isQuit(int c, bool escape)
+{
+    return ((c) == QUIT || (escape && ((c) == ESCAPE)));
+}
+#define case_QUIT	QUIT: case ESCAPE
+
+/* Common function to allow ^T to toggle trace-mode in the middle of a test
+ * so that trace-files can be made smaller.
+ */
+static int
+wGetchar(WINDOW *win)
+{
+    int c;
+#ifdef TRACE
+    while ((c = wgetch(win)) == CTRL('T')) {
+	if (_nc_tracing) {
+	    save_trace = _nc_tracing;
+	    Trace(("TOGGLE-TRACING OFF"));
+	    _nc_tracing = 0;
+	} else {
+	    _nc_tracing = save_trace;
+	}
+	curses_trace(_nc_tracing);
+	if (_nc_tracing)
+	    Trace(("TOGGLE-TRACING ON"));
+    }
+#else
+    c = wgetch(win);
+#endif
+    return c;
+}
+#define Getchar() wGetchar(stdscr)
+
+#if USE_SOFTKEYS
+/* replaces wgetnstr(), since we want to be able to edit values */
+static void
+wGetstring(WINDOW *win, char *buffer, int limit)
+{
+    int y0, x0, x;
+    bool done = FALSE;
+
+    echo();
+    getyx(win, y0, x0);
+    (void) wattrset(win, A_REVERSE);
+
+    x = (int) strlen(buffer);
+    while (!done) {
+	int ch;
+	if (x > (int) strlen(buffer))
+	    x = (int) strlen(buffer);
+	wmove(win, y0, x0);
+	wprintw(win, "%-*s", limit, buffer);
+	wmove(win, y0, x0 + x);
+	switch (ch = wGetchar(win)) {
+	case '\n':
+	case KEY_ENTER:
+	    done = TRUE;
+	    break;
+	case CTRL('U'):
+	    *buffer = '\0';
+	    break;
+	case '\b':
+	case KEY_BACKSPACE:
+	case KEY_DC:
+	    if (x > 0) {
+		int j;
+		for (j = --x; (buffer[j] = buffer[j + 1]) != '\0'; ++j) {
+		    ;
+		}
+	    } else {
+		beep();
+	    }
+	    break;
+	case KEY_LEFT:
+	    if (x > 0) {
+		--x;
+	    } else {
+		flash();
+	    }
+	    break;
+	case KEY_RIGHT:
+	    ++x;
+	    break;
+	default:
+	    if (!isprint(ch) || ch >= KEY_MIN) {
+		beep();
+	    } else if ((int) strlen(buffer) < limit) {
+		int j;
+		for (j = (int) strlen(buffer) + 1; j > x; --j) {
+		    buffer[j] = buffer[j - 1];
+		}
+		buffer[x++] = (char) ch;
+	    } else {
+		flash();
+	    }
+	}
+    }
+
+    wattroff(win, A_REVERSE);
+    wmove(win, y0, x0);
+    noecho();
+}
+#endif
+
+#if USE_WIDEC_SUPPORT
+static wchar_t
+fullwidth_digit(int ch)
+{
+    return (wchar_t) (ch + 0xff10 - '0');
+}
+
+static void
+make_fullwidth_text(wchar_t *target, const char *source)
+{
+    int ch;
+    while ((ch = *source++) != 0) {
+	*target++ = fullwidth_digit(ch);
+    }
+    *target = 0;
+}
+
+static void
+make_narrow_text(wchar_t *target, const char *source)
+{
+    int ch;
+    while ((ch = *source++) != 0) {
+	*target++ = (wchar_t) ch;
+    }
+    *target = 0;
+}
+
+#if USE_LIBPANEL
+static void
+make_fullwidth_digit(cchar_t *target, int digit)
+{
+    wchar_t source[2];
+
+    source[0] = fullwidth_digit(digit + '0');
+    source[1] = 0;
+    setcchar(target, source, A_NORMAL, 0, 0);
+}
+#endif
+
+static int
+wGet_wchar(WINDOW *win, wint_t *result)
+{
+    int c;
+#ifdef TRACE
+    while ((c = wget_wch(win, result)) == CTRL('T')) {
+	if (_nc_tracing) {
+	    save_trace = _nc_tracing;
+	    Trace(("TOGGLE-TRACING OFF"));
+	    _nc_tracing = 0;
+	} else {
+	    _nc_tracing = save_trace;
+	}
+	curses_trace(_nc_tracing);
+	if (_nc_tracing)
+	    Trace(("TOGGLE-TRACING ON"));
+    }
+#else
+    c = wget_wch(win, result);
+#endif
+    return c;
+}
+#define Get_wchar(result) wGet_wchar(stdscr, result)
+
+/* replaces wgetn_wstr(), since we want to be able to edit values */
+#if USE_SOFTKEYS
+static void
+wGet_wstring(WINDOW *win, wchar_t *buffer, int limit)
+{
+    int y0, x0, x;
+    wint_t ch;
+    bool done = FALSE;
+    bool fkey = FALSE;
+
+    echo();
+    getyx(win, y0, x0);
+    (void) wattrset(win, A_REVERSE);
+
+    x = (int) wcslen(buffer);
+    while (!done) {
+	if (x > (int) wcslen(buffer))
+	    x = (int) wcslen(buffer);
+
+	/* clear the "window' */
+	wmove(win, y0, x0);
+	wprintw(win, "%*s", limit, " ");
+
+	/* write the existing buffer contents */
+	wmove(win, y0, x0);
+	waddnwstr(win, buffer, limit);
+
+	/* positions the cursor past character 'x' */
+	wmove(win, y0, x0);
+	waddnwstr(win, buffer, x);
+
+	switch (wGet_wchar(win, &ch)) {
+	case KEY_CODE_YES:
+	    fkey = TRUE;
+	    switch (ch) {
+	    case KEY_ENTER:
+		ch = '\n';
+		fkey = FALSE;
+		break;
+	    case KEY_BACKSPACE:
+	    case KEY_DC:
+		ch = '\b';
+		fkey = FALSE;
+		break;
+	    case KEY_LEFT:
+	    case KEY_RIGHT:
+		break;
+	    default:
+		ch = (wint_t) -1;
+		break;
+	    }
+	    break;
+	case OK:
+	    fkey = FALSE;
+	    break;
+	default:
+	    ch = (wint_t) -1;
+	    fkey = TRUE;
+	    break;
+	}
+
+	switch (ch) {
+	case '\n':
+	    done = TRUE;
+	    break;
+	case CTRL('U'):
+	    *buffer = '\0';
+	    break;
+	case '\b':
+	    if (x > 0) {
+		int j;
+		for (j = --x; (buffer[j] = buffer[j + 1]) != '\0'; ++j) {
+		    ;
+		}
+	    } else {
+		beep();
+	    }
+	    break;
+	case KEY_LEFT:
+	    if (x > 0) {
+		--x;
+	    } else {
+		beep();
+	    }
+	    break;
+	case KEY_RIGHT:
+	    ++x;
+	    break;
+	default:
+	    if (fkey) {
+		beep();
+	    } else if ((int) wcslen(buffer) < limit) {
+		int j;
+		for (j = (int) wcslen(buffer) + 1; j > x; --j) {
+		    buffer[j] = buffer[j - 1];
+		}
+		buffer[x++] = (wchar_t) ch;
+	    } else {
+		beep();
+	    }
+	}
+    }
+
+    wattroff(win, A_REVERSE);
+    wmove(win, y0, x0);
+    noecho();
+}
+#endif /* USE_SOFTKEYS */
+
+#endif /* USE_WIDEC_SUPPORT */
+
+static void
+Pause(void)
+{
+    move(LINES - 1, 0);
+    addstr("Press any key to continue... ");
+    (void) Getchar();
+}
+
+static void
+Cannot(const char *what)
+{
+    printw("\nThis %s terminal %s\n\n", getenv("TERM"), what);
+    Pause();
+    endwin();
+}
+
+static void
+ShellOut(bool message)
+{
+    if (message)
+	addstr("Shelling out...");
+    def_prog_mode();
+    endwin();
+#ifdef _NC_WINDOWS
+    system("cmd.exe");
+#else
+    IGNORE_RC(system("sh"));
+#endif
+    if (message)
+	addstr("returned from shellout.\n");
+    refresh();
+}
+
+#ifdef NCURSES_MOUSE_VERSION
+/*
+ * This function is the same as _tracemouse(), but we cannot count on that
+ * being available in the non-debug library.
+ */
+static const char *
+mouse_decode(MEVENT const *ep)
+{
+    static char buf[80 + (5 * 10) + (32 * 15)];
+
+    (void) _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf))
+		       "id %2d at (%2d, %2d, %d) state %4lx = {",
+		       ep->id, ep->x, ep->y, ep->z, (unsigned long) ep->bstate);
+
+#define SHOW(m, s) \
+	if ((ep->bstate & m)==m) { \
+		_nc_STRCAT(buf, s, sizeof(buf)); \
+		_nc_STRCAT(buf, ", ", sizeof(buf)); \
+	}
+
+    SHOW(BUTTON1_RELEASED, "release-1");
+    SHOW(BUTTON1_PRESSED, "press-1");
+    SHOW(BUTTON1_CLICKED, "click-1");
+    SHOW(BUTTON1_DOUBLE_CLICKED, "doubleclick-1");
+    SHOW(BUTTON1_TRIPLE_CLICKED, "tripleclick-1");
+#if NCURSES_MOUSE_VERSION == 1
+    SHOW(BUTTON1_RESERVED_EVENT, "reserved-1");
+#endif
+
+    SHOW(BUTTON2_RELEASED, "release-2");
+    SHOW(BUTTON2_PRESSED, "press-2");
+    SHOW(BUTTON2_CLICKED, "click-2");
+    SHOW(BUTTON2_DOUBLE_CLICKED, "doubleclick-2");
+    SHOW(BUTTON2_TRIPLE_CLICKED, "tripleclick-2");
+#if NCURSES_MOUSE_VERSION == 1
+    SHOW(BUTTON2_RESERVED_EVENT, "reserved-2");
+#endif
+
+    SHOW(BUTTON3_RELEASED, "release-3");
+    SHOW(BUTTON3_PRESSED, "press-3");
+    SHOW(BUTTON3_CLICKED, "click-3");
+    SHOW(BUTTON3_DOUBLE_CLICKED, "doubleclick-3");
+    SHOW(BUTTON3_TRIPLE_CLICKED, "tripleclick-3");
+#if NCURSES_MOUSE_VERSION == 1
+    SHOW(BUTTON3_RESERVED_EVENT, "reserved-3");
+#endif
+
+    SHOW(BUTTON4_RELEASED, "release-4");
+    SHOW(BUTTON4_PRESSED, "press-4");
+    SHOW(BUTTON4_CLICKED, "click-4");
+    SHOW(BUTTON4_DOUBLE_CLICKED, "doubleclick-4");
+    SHOW(BUTTON4_TRIPLE_CLICKED, "tripleclick-4");
+#if NCURSES_MOUSE_VERSION == 1
+    SHOW(BUTTON4_RESERVED_EVENT, "reserved-4");
+#endif
+
+#if NCURSES_MOUSE_VERSION == 2
+    SHOW(BUTTON5_RELEASED, "release-5");
+    SHOW(BUTTON5_PRESSED, "press-5");
+    SHOW(BUTTON5_CLICKED, "click-5");
+    SHOW(BUTTON5_DOUBLE_CLICKED, "doubleclick-5");
+    SHOW(BUTTON5_TRIPLE_CLICKED, "tripleclick-5");
+#endif
+
+    SHOW(BUTTON_CTRL, "ctrl");
+    SHOW(BUTTON_SHIFT, "shift");
+    SHOW(BUTTON_ALT, "alt");
+    SHOW(ALL_MOUSE_EVENTS, "all-events");
+    SHOW(REPORT_MOUSE_POSITION, "position");
+
+#undef SHOW
+
+    if (buf[strlen(buf) - 1] == ' ')
+	buf[strlen(buf) - 2] = '\0';
+    _nc_STRCAT(buf, "}", sizeof(buf));
+    return (buf);
+}
+
+static void
+show_mouse(WINDOW *win)
+{
+    MEVENT event;
+    bool outside;
+    bool show_loc;
+
+    getmouse(&event);
+    outside = !wenclose(win, event.y, event.x);
+
+    if (outside) {
+	(void) wstandout(win);
+	waddstr(win, "KEY_MOUSE");
+	(void) wstandend(win);
+    } else {
+	waddstr(win, "KEY_MOUSE");
+    }
+    wprintw(win, ", %s", mouse_decode(&event));
+
+    if (outside)
+	win = stdscr;
+
+    show_loc = wmouse_trafo(win, &event.y, &event.x, FALSE);
+
+    if (show_loc) {
+	int y, x;
+	getyx(win, y, x);
+	wmove(win, event.y, event.x);
+	waddch(win, '*');
+	wmove(win, y, x);
+    }
+
+    if (outside)
+	wnoutrefresh(win);
+}
+#endif /* NCURSES_MOUSE_VERSION */
+
+/****************************************************************************
+ *
+ * Character input test
+ *
+ ****************************************************************************/
+
+#define NUM_GETCH_FLAGS 256
+typedef bool GetchFlags[NUM_GETCH_FLAGS];
+
+static void
+setup_getch(WINDOW *win, GetchFlags flags)
+{
+    keypad(win, flags['k']);	/* should be redundant, but for testing */
+    meta(win, flags['m']);	/* force this to a known state */
+    if (flags['e'])
+	echo();
+    else
+	noecho();
+}
+
+static void
+init_getch(WINDOW *win, GetchFlags flags, int delay)
+{
+    memset(flags, FALSE, NUM_GETCH_FLAGS);
+    flags[UChar('k')] = (win == stdscr);
+    flags[UChar('m')] = TRUE;
+    flags[UChar('t')] = (delay != 0);
+
+    setup_getch(win, flags);
+}
+
+static bool
+blocking_getch(GetchFlags flags, int delay)
+{
+    return ((delay < 0) && flags['t']);
+}
+
+#define ExitOnEscape() (flags[UChar('k')] && flags[UChar('t')])
+
+static void
+wgetch_help(WINDOW *win, GetchFlags flags)
+{
+    static const char *help[] =
+    {
+	"e  -- toggle echo mode"
+	,"g  -- triggers a getstr test"
+	,"k  -- toggle keypad/literal mode"
+	,"m  -- toggle meta (7-bit/8-bit) mode"
+	,"^q -- quit"
+	,"s  -- shell out"
+	,"t  -- toggle timeout"
+	,"w  -- create a new window"
+#ifdef SIGTSTP
+	,"z  -- suspend this process"
+#endif
+    };
+    int y, x;
+    unsigned chk = ((SIZEOF(help) + 1) / 2);
+    unsigned n;
+
+    getyx(win, y, x);
+    move(0, 0);
+    printw("Type any key to see its %s value.  Also:\n",
+	   flags['k'] ? "keypad" : "literal");
+    for (n = 0; n < SIZEOF(help); ++n) {
+	const char *msg = help[n];
+	int row = 1 + (int) (n % chk);
+	int col = (n >= chk) ? COLS / 2 : 0;
+	int flg = ((strstr(msg, "toggle") != 0)
+		   && (flags[UChar(*msg)] != FALSE));
+	if (*msg == '^' && ExitOnEscape())
+	    msg = "^[,^q -- quit";
+	if (flg)
+	    (void) standout();
+	MvPrintw(row, col, "%s", msg);
+	if (col == 0)
+	    clrtoeol();
+	if (flg)
+	    (void) standend();
+    }
+    wrefresh(stdscr);
+    wmove(win, y, x);
+}
+
+static void
+wgetch_wrap(WINDOW *win, int first_y)
+{
+    int last_y = getmaxy(win) - 1;
+    int y = getcury(win) + 1;
+
+    if (y >= last_y)
+	y = first_y;
+    wmove(win, y, 0);
+    wclrtoeol(win);
+}
+
+#if defined(KEY_RESIZE) && HAVE_WRESIZE
+typedef struct {
+    WINDOW *text;
+    WINDOW *frame;
+} WINSTACK;
+
+static WINSTACK *winstack = 0;
+static unsigned len_winstack = 0;
+
+static void
+forget_boxes(void)
+{
+    if (winstack != 0) {
+	free(winstack);
+    }
+    winstack = 0;
+    len_winstack = 0;
+}
+
+static void
+remember_boxes(unsigned level, WINDOW *txt_win, WINDOW *box_win)
+{
+    unsigned need = (level + 1) * 2;
+
+    assert(level < (unsigned) COLS);
+
+    if (winstack == 0) {
+	len_winstack = 20;
+	winstack = typeMalloc(WINSTACK, len_winstack);
+    } else if (need >= len_winstack) {
+	len_winstack = need;
+	winstack = typeRealloc(WINSTACK, len_winstack, winstack);
+    }
+    if (!winstack)
+	failed("remember_boxes");
+    winstack[level].text = txt_win;
+    winstack[level].frame = box_win;
+}
+
+#if USE_SOFTKEYS && (defined(NCURSES_VERSION_PATCH) && NCURSES_VERSION_PATCH < 20071229) && NCURSES_EXT_FUNCS
+static void
+slk_repaint(void)
+{
+    /* this chunk is now done in resize_term() */
+    slk_touch();
+    slk_clear();
+    slk_noutrefresh();
+}
+
+#else
+#define slk_repaint()		/* nothing */
+#endif
+
+#if defined(NCURSES_VERSION) && defined(KEY_RESIZE) && HAVE_WRESIZE
+/*
+ * For wgetch_test(), we create pairs of windows - one for a box, one for text.
+ * Resize both and paint the box in the parent.
+ */
+static void
+resize_boxes(unsigned level, WINDOW *win)
+{
+    unsigned n;
+    int base = 5;
+    int high = LINES - base;
+    int wide = COLS;
+
+    touchwin(stdscr);
+    wnoutrefresh(stdscr);
+
+    slk_repaint();
+
+    for (n = 0; n < level; ++n) {
+	wresize(winstack[n].frame, high, wide);
+	wresize(winstack[n].text, high - 2, wide - 2);
+	high -= 2;
+	wide -= 2;
+	werase(winstack[n].text);
+	box(winstack[n].frame, 0, 0);
+	wnoutrefresh(winstack[n].frame);
+	wprintw(winstack[n].text,
+		"size %dx%d\n",
+		getmaxy(winstack[n].text),
+		getmaxx(winstack[n].text));
+	wnoutrefresh(winstack[n].text);
+	if (winstack[n].text == win)
+	    break;
+    }
+    doupdate();
+}
+#endif /* resize_boxes */
+#else
+#define forget_boxes()		/* nothing */
+#define remember_boxes(level,text,frame)	/* nothing */
+#endif
+
+/*
+ * Return-code is OK/ERR or a keyname.
+ */
+static const char *
+ok_keyname(int code)
+{
+    return ((code == OK) ? "OK" : ((code == ERR) ? "ERR" : keyname(code)));
+}
+
+static void
+wgetch_test(unsigned level, WINDOW *win, int delay)
+{
+    char buf[BUFSIZ];
+    int first_y, first_x;
+    int incount = 0;
+    GetchFlags flags;
+
+    init_getch(win, flags, delay);
+    notimeout(win, FALSE);
+    wtimeout(win, delay);
+    getyx(win, first_y, first_x);
+
+    wgetch_help(win, flags);
+    wsetscrreg(win, first_y, getmaxy(win) - 1);
+    scrollok(win, TRUE);
+
+    for (;;) {
+	int c;
+
+	while ((c = wGetchar(win)) == ERR) {
+	    incount++;
+	    if (blocking_getch(flags, delay)) {
+		(void) wprintw(win, "%05d: input error", incount);
+		break;
+	    } else {
+		(void) wprintw(win, "%05d: input timed out", incount);
+	    }
+	    wgetch_wrap(win, first_y);
+	}
+	if (c == ERR && blocking_getch(flags, delay)) {
+	    wprintw(win, "ERR");
+	    wgetch_wrap(win, first_y);
+	} else if (isQuit(c, ExitOnEscape())) {
+	    break;
+	} else if (c == 'e') {
+	    flags[UChar('e')] = !flags[UChar('e')];
+	    setup_getch(win, flags);
+	    wgetch_help(win, flags);
+	} else if (c == 'g') {
+	    waddstr(win, "wgetnstr test: ");
+	    echo();
+	    c = wgetnstr(win, buf, sizeof(buf) - 1);
+	    noecho();
+	    wprintw(win, "I saw %d characters:\n\t`%s' (%s).",
+		    (int) strlen(buf), buf,
+		    ok_keyname(c));
+	    wclrtoeol(win);
+	    wgetch_wrap(win, first_y);
+	} else if (c == 'k') {
+	    flags[UChar('k')] = !flags[UChar('k')];
+	    setup_getch(win, flags);
+	    wgetch_help(win, flags);
+	} else if (c == 'm') {
+	    flags[UChar('m')] = !flags[UChar('m')];
+	    setup_getch(win, flags);
+	    wgetch_help(win, flags);
+	} else if (c == 's') {
+	    ShellOut(TRUE);
+	} else if (c == 't') {
+	    notimeout(win, flags[UChar('t')]);
+	    flags[UChar('t')] = !flags[UChar('t')];
+	    wgetch_help(win, flags);
+	} else if (c == 'w') {
+	    int high = getmaxy(win) - 1 - first_y + 1;
+	    int wide = getmaxx(win) - first_x;
+	    int old_y, old_x;
+	    int new_y = first_y + getbegy(win);
+	    int new_x = first_x + getbegx(win);
+
+	    getyx(win, old_y, old_x);
+	    if (high > 2 && wide > 2) {
+		WINDOW *wb = newwin(high, wide, new_y, new_x);
+		WINDOW *wi = newwin(high - 2, wide - 2, new_y + 1, new_x + 1);
+
+		box(wb, 0, 0);
+		wrefresh(wb);
+		wmove(wi, 0, 0);
+		remember_boxes(level, wi, wb);
+		wgetch_test(level + 1, wi, delay);
+		delwin(wi);
+		delwin(wb);
+
+		wgetch_help(win, flags);
+		wmove(win, old_y, old_x);
+		touchwin(win);
+		wrefresh(win);
+		doupdate();
+	    }
+#ifdef SIGTSTP
+	} else if (c == 'z') {
+	    kill(getpid(), SIGTSTP);
+#endif
+	} else {
+	    wprintw(win, "Key pressed: %04o ", c);
+#ifdef NCURSES_MOUSE_VERSION
+	    if (c == KEY_MOUSE) {
+		show_mouse(win);
+	    } else
+#endif /* NCURSES_MOUSE_VERSION */
+	    if (c >= KEY_MIN) {
+#if defined(NCURSES_VERSION) && defined(KEY_RESIZE) && HAVE_WRESIZE
+		if (c == KEY_RESIZE) {
+		    resize_boxes(level, win);
+		}
+#endif
+		(void) waddstr(win, keyname(c));
+	    } else if (c >= 0x80) {
+		unsigned c2 = (unsigned) c;
+#if !(defined(NCURSES_VERSION) || defined(_XOPEN_CURSES))
+		/* at least Solaris SVR4 curses breaks unctrl(128), etc. */
+		c2 &= 0x7f;
+#endif
+		if (isprint(c))
+		    (void) wprintw(win, "%c", UChar(c));
+		else if (c2 != UChar(c))
+		    (void) wprintw(win, "M-%s", unctrl(c2));
+		else
+		    (void) wprintw(win, "%s", unctrl(c2));
+		waddstr(win, " (high-half character)");
+	    } else {
+		if (isprint(c))
+		    (void) wprintw(win, "%c (ASCII printable character)", c);
+		else
+		    (void) wprintw(win, "%s (ASCII control character)",
+				   unctrl(UChar(c)));
+	    }
+	    wgetch_wrap(win, first_y);
+	}
+    }
+
+    wtimeout(win, -1);
+
+    if (!level)
+	init_getch(win, flags, delay);
+}
+
+static int
+begin_getch_test(void)
+{
+    char buf[BUFSIZ];
+    int delay;
+
+    refresh();
+
+#ifdef NCURSES_MOUSE_VERSION
+    mousemask(ALL_MOUSE_EVENTS | REPORT_MOUSE_POSITION, (mmask_t *) 0);
+#endif
+
+    (void) printw("Delay in 10ths of a second (<CR> for blocking input)? ");
+    echo();
+    getnstr(buf, sizeof(buf) - 1);
+    noecho();
+    nonl();
+
+    if (isdigit(UChar(buf[0]))) {
+	delay = atoi(buf) * 100;
+    } else {
+	delay = -1;
+    }
+    raw();
+    move(6, 0);
+    return delay;
+}
+
+static void
+finish_getch_test(void)
+{
+#ifdef NCURSES_MOUSE_VERSION
+    mousemask(0, (mmask_t *) 0);
+#endif
+    erase();
+    noraw();
+    nl();
+    endwin();
+}
+
+static int
+getch_test(bool recur GCC_UNUSED)
+{
+    int delay = begin_getch_test();
+
+    slk_restore();
+    wgetch_test(0, stdscr, delay);
+    forget_boxes();
+    finish_getch_test();
+    slk_clear();
+    return OK;
+}
+
+#if USE_WIDEC_SUPPORT
+/*
+ * For wget_wch_test(), we create pairs of windows - one for a box, one for text.
+ * Resize both and paint the box in the parent.
+ */
+#if defined(KEY_RESIZE) && HAVE_WRESIZE
+static void
+resize_wide_boxes(unsigned level, WINDOW *win)
+{
+    unsigned n;
+    int base = 5;
+    int high = LINES - base;
+    int wide = COLS;
+
+    touchwin(stdscr);
+    wnoutrefresh(stdscr);
+
+    slk_repaint();
+
+    for (n = 0; n < level; ++n) {
+	wresize(winstack[n].frame, high, wide);
+	wresize(winstack[n].text, high - 2, wide - 2);
+	high -= 2;
+	wide -= 2;
+	werase(winstack[n].text);
+	box_set(winstack[n].frame, 0, 0);
+	wnoutrefresh(winstack[n].frame);
+	wprintw(winstack[n].text,
+		"size %dx%d\n",
+		getmaxy(winstack[n].text),
+		getmaxx(winstack[n].text));
+	wnoutrefresh(winstack[n].text);
+	if (winstack[n].text == win)
+	    break;
+    }
+    doupdate();
+}
+#endif /* KEY_RESIZE */
+
+static char *
+wcstos(const wchar_t *src)
+{
+    int need;
+    char *result = 0;
+    const wchar_t *tmp = src;
+#ifndef state_unused
+    mbstate_t state;
+#endif
+
+    reset_wchars(state);
+    if ((need = (int) count_wchars(tmp, 0, &state)) > 0) {
+	unsigned have = (unsigned) need;
+	if ((result = typeCalloc(char, have + 1)) != 0) {
+	    tmp = src;
+	    if (trans_wchars(result, tmp, have, &state) != have) {
+		free(result);
+		result = 0;
+	    }
+	} else {
+	    failed("wcstos");
+	}
+    }
+    return result;
+}
+
+static void
+wget_wch_test(unsigned level, WINDOW *win, int delay)
+{
+    wchar_t wchar_buf[BUFSIZ];
+    wint_t wint_buf[BUFSIZ];
+    int first_y, first_x;
+    wint_t c;
+    int incount = 0;
+    GetchFlags flags;
+    char *temp;
+
+    init_getch(win, flags, delay);
+    notimeout(win, FALSE);
+    wtimeout(win, delay);
+    getyx(win, first_y, first_x);
+
+    wgetch_help(win, flags);
+    wsetscrreg(win, first_y, getmaxy(win) - 1);
+    scrollok(win, TRUE);
+
+    for (;;) {
+	int code;
+
+	while ((code = wGet_wchar(win, &c)) == ERR) {
+	    incount++;
+	    if (blocking_getch(flags, delay)) {
+		(void) wprintw(win, "%05d: input error", incount);
+		break;
+	    } else {
+		(void) wprintw(win, "%05d: input timed out", incount);
+	    }
+	    wgetch_wrap(win, first_y);
+	}
+	if (code == ERR && blocking_getch(flags, delay)) {
+	    wprintw(win, "ERR");
+	    wgetch_wrap(win, first_y);
+	} else if (isQuit((int) c, ExitOnEscape())) {
+	    break;
+	} else if (c == 'e') {
+	    flags[UChar('e')] = !flags[UChar('e')];
+	    setup_getch(win, flags);
+	    wgetch_help(win, flags);
+	} else if (c == 'g') {
+	    waddstr(win, "wgetn_str test: ");
+	    echo();
+	    code = wgetn_wstr(win, wint_buf, BUFSIZ - 1);
+	    noecho();
+	    if (code == ERR) {
+		wprintw(win, "wgetn_wstr returns an error.");
+	    } else {
+		int n;
+		for (n = 0; (wchar_buf[n] = (wchar_t) wint_buf[n]) != 0; ++n) {
+		    ;
+		}
+		if ((temp = wcstos(wchar_buf)) != 0) {
+		    wprintw(win, "I saw %d characters:\n\t`%s'.",
+			    (int) wcslen(wchar_buf), temp);
+		    free(temp);
+		} else {
+		    wprintw(win, "I saw %d characters (cannot convert).",
+			    (int) wcslen(wchar_buf));
+		}
+	    }
+	    wclrtoeol(win);
+	    wgetch_wrap(win, first_y);
+	} else if (c == 'k') {
+	    flags[UChar('k')] = !flags[UChar('k')];
+	    setup_getch(win, flags);
+	    wgetch_help(win, flags);
+	} else if (c == 'm') {
+	    flags[UChar('m')] = !flags[UChar('m')];
+	    setup_getch(win, flags);
+	    wgetch_help(win, flags);
+	} else if (c == 's') {
+	    ShellOut(TRUE);
+	} else if (c == 't') {
+	    notimeout(win, flags[UChar('t')]);
+	    flags[UChar('t')] = !flags[UChar('t')];
+	    wgetch_help(win, flags);
+	} else if (c == 'w') {
+	    int high = getmaxy(win) - 1 - first_y + 1;
+	    int wide = getmaxx(win) - first_x;
+	    int old_y, old_x;
+	    int new_y = first_y + getbegy(win);
+	    int new_x = first_x + getbegx(win);
+
+	    getyx(win, old_y, old_x);
+	    if (high > 2 && wide > 2) {
+		WINDOW *wb = newwin(high, wide, new_y, new_x);
+		WINDOW *wi = newwin(high - 2, wide - 2, new_y + 1, new_x + 1);
+
+		box_set(wb, 0, 0);
+		wrefresh(wb);
+		wmove(wi, 0, 0);
+		remember_boxes(level, wi, wb);
+		wget_wch_test(level + 1, wi, delay);
+		delwin(wi);
+		delwin(wb);
+
+		wgetch_help(win, flags);
+		wmove(win, old_y, old_x);
+		touchwin(win);
+		wrefresh(win);
+	    }
+#ifdef SIGTSTP
+	} else if (c == 'z') {
+	    kill(getpid(), SIGTSTP);
+#endif
+	} else {
+	    wprintw(win, "Key pressed: %04o ", (int) c);
+#ifdef NCURSES_MOUSE_VERSION
+	    if (c == KEY_MOUSE) {
+		show_mouse(win);
+	    } else
+#endif /* NCURSES_MOUSE_VERSION */
+	    if (code == KEY_CODE_YES) {
+#if defined(KEY_RESIZE) && HAVE_WRESIZE
+		if (c == KEY_RESIZE) {
+		    resize_wide_boxes(level, win);
+		}
+#endif
+		(void) waddstr(win, keyname((wchar_t) c));
+	    } else {
+		(void) waddstr(win, key_name((wchar_t) c));
+		if (c < 256 && iscntrl(c)) {
+		    (void) wprintw(win, " (control character)");
+		} else {
+		    (void) wprintw(win, " = %#x (printable character)",
+				   (unsigned) c);
+		}
+	    }
+	    wgetch_wrap(win, first_y);
+	}
+    }
+
+    wtimeout(win, -1);
+
+    if (!level)
+	init_getch(win, flags, delay);
+}
+
+static int
+x_getch_test(bool recur GCC_UNUSED)
+{
+    int delay = begin_getch_test();
+
+    slk_restore();
+    wget_wch_test(0, stdscr, delay);
+    forget_boxes();
+    finish_getch_test();
+    slk_clear();
+    return OK;
+}
+#endif
+
+/****************************************************************************
+ *
+ * Character attributes test
+ *
+ ****************************************************************************/
+
+#if HAVE_SETUPTERM || HAVE_TGETENT
+#define get_ncv() TIGETNUM("ncv","NC")
+#define get_xmc() TIGETNUM("xmc","sg")
+#else
+#define get_ncv() -1
+#define get_xmc() -1
+#endif
+
+#if !HAVE_TERMATTRS
+static chtype
+my_termattrs(void)
+{
+    static int first = TRUE;
+    static chtype result = 0;
+
+    if (first) {
+#if !HAVE_TIGETSTR
+	char buffer[4096];
+	char parsed[4096];
+	char *area_pointer = parsed;
+
+	tgetent(buffer, getenv("TERM"));
+#endif
+
+	if (TIGETSTR("smso", "so"))
+	    result |= A_STANDOUT;
+	if (TIGETSTR("smul", "us"))
+	    result |= A_UNDERLINE;
+	if (TIGETSTR("rev", "mr"))
+	    result |= A_REVERSE;
+	if (TIGETSTR("blink", "mb"))
+	    result |= A_BLINK;
+	if (TIGETSTR("dim", "mh"))
+	    result |= A_DIM;
+	if (TIGETSTR("bold", "md"))
+	    result |= A_BOLD;
+	if (TIGETSTR("smacs", "ac"))
+	    result |= A_ALTCHARSET;
+
+	first = FALSE;
+    }
+    return result;
+}
+#define termattrs() my_termattrs()
+#endif
+
+#define ATTRSTRING_1ST 32	/* ' ' */
+#define ATTRSTRING_END 126	/* '~' */
+
+#define COLS_PRE_ATTRS 5
+#define COLS_AFT_ATTRS 15
+#define COL_ATTRSTRING (COLS_PRE_ATTRS + 17)
+#define LEN_ATTRSTRING (COLS - (COL_ATTRSTRING + COLS_AFT_ATTRS))
+#define MAX_ATTRSTRING (ATTRSTRING_END + 1 - ATTRSTRING_1ST)
+
+static char attr_test_string[MAX_ATTRSTRING + 1];
+
+static void
+attr_legend(WINDOW *helpwin)
+{
+    int row = 1;
+    int col = 1;
+
+    MvWPrintw(helpwin, row++, col,
+	      "ESC to exit.");
+    MvWPrintw(helpwin, row++, col,
+	      "^L repaints.");
+    ++row;
+    MvWPrintw(helpwin, row++, col,
+	      "Modify the test strings:");
+    MvWPrintw(helpwin, row++, col,
+	      "  A digit sets gaps on each side of displayed attributes");
+    MvWPrintw(helpwin, row++, col,
+	      "  </> shifts the text left/right. ");
+    ++row;
+    MvWPrintw(helpwin, row++, col,
+	      "Toggles:");
+    if (UseColors) {
+	MvWPrintw(helpwin, row++, col,
+		  "  f/F/b/B toggle foreground/background background color");
+	MvWPrintw(helpwin, row++, col,
+		  "  t/T     toggle text/background color attribute");
+    }
+    MvWPrintw(helpwin, row++, col,
+	      "  a/A     toggle ACS (alternate character set) mapping");
+    MvWPrintw(helpwin, row, col,
+	      "  v/V     toggle video attribute to combine with each line");
+#if USE_WIDEC_SUPPORT
+    MvWPrintw(helpwin, row, col,
+	      "  w/W     toggle normal/wide (double-width) test-characters");
+#endif
+}
+
+static void
+show_color_attr(int fg, int bg, int tx)
+{
+    if (UseColors) {
+	printw("  Colors (fg %d, bg %d", fg, bg);
+	if (tx >= 0)
+	    printw(", text %d", tx);
+	printw("),");
+    }
+}
+
+static bool
+cycle_color_attr(int ch, NCURSES_COLOR_T *fg, NCURSES_COLOR_T *bg, NCURSES_COLOR_T *tx)
+{
+    bool error = FALSE;
+
+    if (UseColors) {
+	switch (ch) {
+	case 'f':
+	    *fg = (NCURSES_COLOR_T) (*fg + 1);
+	    break;
+	case 'F':
+	    *fg = (NCURSES_COLOR_T) (*fg - 1);
+	    break;
+	case 'b':
+	    *bg = (NCURSES_COLOR_T) (*bg + 1);
+	    break;
+	case 'B':
+	    *bg = (NCURSES_COLOR_T) (*bg - 1);
+	    break;
+	case 't':
+	    *tx = (NCURSES_COLOR_T) (*tx + 1);
+	    break;
+	case 'T':
+	    *tx = (NCURSES_COLOR_T) (*tx - 1);
+	    break;
+	default:
+	    beep();
+	    error = TRUE;
+	    break;
+	}
+	if (*fg >= COLORS)
+	    *fg = (NCURSES_COLOR_T) MinColors;
+	if (*fg < MinColors)
+	    *fg = (NCURSES_COLOR_T) (COLORS - 1);
+	if (*bg >= COLORS)
+	    *bg = (NCURSES_COLOR_T) MinColors;
+	if (*bg < MinColors)
+	    *bg = (NCURSES_COLOR_T) (COLORS - 1);
+	if (*tx >= COLORS)
+	    *tx = -1;
+	if (*tx < -1)
+	    *tx = (NCURSES_COLOR_T) (COLORS - 1);
+    } else {
+	beep();
+	error = TRUE;
+    }
+    return error;
+}
+
+static void
+adjust_attr_string(int adjust)
+{
+    char save = attr_test_string[0];
+    int first = ((int) UChar(save)) + adjust;
+
+    if (first >= ATTRSTRING_1ST) {
+	int j, k;
+
+	for (j = 0, k = first; j < MAX_ATTRSTRING; ++j, ++k) {
+	    if (k > ATTRSTRING_END)
+		break;
+	    attr_test_string[j] = (char) k;
+	    if (((k + 1 - first) % 5) == 0) {
+		if (++j >= MAX_ATTRSTRING)
+		    break;
+		attr_test_string[j] = ' ';
+	    }
+	}
+	if ((LEN_ATTRSTRING - j) > 5) {
+	    attr_test_string[0] = save;
+	    adjust_attr_string(adjust - 1);
+	} else {
+	    while (j < MAX_ATTRSTRING)
+		attr_test_string[j++] = ' ';
+	    attr_test_string[j] = '\0';
+	}
+    }
+}
+
+/*
+ * Prefer the right-end of the string for starting, since that maps to the
+ * VT100 line-drawing.
+ */
+static int
+default_attr_string(void)
+{
+    int result = (ATTRSTRING_END - LEN_ATTRSTRING);
+    result += (LEN_ATTRSTRING / 5);
+    if (result < ATTRSTRING_1ST)
+	result = ATTRSTRING_1ST;
+    return result;
+}
+
+static void
+init_attr_string(void)
+{
+    attr_test_string[0] = (char) default_attr_string();
+    adjust_attr_string(0);
+}
+
+static int
+show_attr(WINDOW *win, int row, int skip, bool arrow, chtype attr, const char *name)
+{
+    int ncv = get_ncv();
+    chtype test = attr & (chtype) (~(A_ALTCHARSET | A_CHARTEXT));
+
+    if (arrow)
+	MvPrintw(row, COLS_PRE_ATTRS - 3, "-->");
+    MvPrintw(row, COLS_PRE_ATTRS, "%s mode:", name);
+    MvPrintw(row, COL_ATTRSTRING - 1, "|");
+    if (skip)
+	printw("%*s", skip, " ");
+    /*
+     * Just for testing, write text using the alternate character set one
+     * character at a time (to pass its rendition directly), and use the
+     * string operation for the other attributes.
+     */
+    wmove(win, 0, 0);
+    werase(win);
+    if (attr & A_ALTCHARSET) {
+	const char *s;
+
+	for (s = attr_test_string; *s != '\0'; ++s) {
+	    chtype ch = UChar(*s);
+	    (void) waddch(win, ch | attr);
+	}
+    } else {
+	(void) wattrset(win, AttrArg(attr, 0));
+	(void) waddstr(win, attr_test_string);
+	(void) wattroff(win, (int) attr);
+    }
+    if (skip)
+	printw("%*s", skip, " ");
+    MvPrintw(row, COL_ATTRSTRING + LEN_ATTRSTRING, "|");
+    if (test != A_NORMAL) {
+	if (!(termattrs() & test)) {
+	    printw(" (N/A)");
+	} else {
+	    if (ncv > 0 && stdscr && (getbkgd(stdscr) & A_COLOR)) {
+		static const chtype table[] =
+		{
+		    A_STANDOUT,
+		    A_UNDERLINE,
+		    A_REVERSE,
+		    A_BLINK,
+		    A_DIM,
+		    A_BOLD,
+#ifdef A_INVIS
+		    A_INVIS,
+#endif
+#ifdef A_ITALIC
+		    A_ITALIC,
+#endif
+		    A_PROTECT,
+		    A_ALTCHARSET
+		};
+		unsigned n;
+		bool found = FALSE;
+		for (n = 0; n < SIZEOF(table); n++) {
+		    if ((table[n] & attr) != 0
+			&& ((1 << n) & ncv) != 0) {
+			found = TRUE;
+			break;
+		    }
+		}
+		if (found)
+		    printw(" (NCV)");
+	    }
+	    if ((termattrs() & test) != test) {
+		printw(" (Part)");
+	    }
+	}
+    }
+    return row + 2;
+}
+
+typedef struct {
+    chtype attr;
+    NCURSES_CONST char *name;
+} ATTR_TBL;
+/* *INDENT-OFF* */
+static const ATTR_TBL attrs_to_test[] = {
+    { A_STANDOUT,	"STANDOUT" },
+    { A_REVERSE,	"REVERSE" },
+    { A_BOLD,		"BOLD" },
+    { A_UNDERLINE,	"UNDERLINE" },
+    { A_DIM,		"DIM" },
+    { A_BLINK,		"BLINK" },
+    { A_PROTECT,	"PROTECT" },
+#ifdef A_INVIS
+    { A_INVIS,		"INVISIBLE" },
+#endif
+#ifdef A_ITALIC
+    { A_ITALIC,		"ITALIC" },
+#endif
+    { A_NORMAL,		"NORMAL" },
+};
+/* *INDENT-ON* */
+
+static unsigned
+init_attr_list(ATTR_TBL * target, attr_t attrs)
+{
+    unsigned result = 0;
+    size_t n;
+
+    for (n = 0; n < SIZEOF(attrs_to_test); ++n) {
+	attr_t test = attrs_to_test[n].attr;
+	if (test == A_NORMAL || (test & attrs) != 0) {
+	    target[result++] = attrs_to_test[n];
+	}
+    }
+    return result;
+}
+
+#if USE_WIDEC_SUPPORT
+typedef struct {
+    attr_t attr;
+    NCURSES_CONST char *name;
+} W_ATTR_TBL;
+/* *INDENT-OFF* */
+static const W_ATTR_TBL w_attrs_to_test[] = {
+    { WA_STANDOUT,	"STANDOUT" },
+    { WA_REVERSE,	"REVERSE" },
+    { WA_BOLD,		"BOLD" },
+    { WA_UNDERLINE,	"UNDERLINE" },
+    { WA_DIM,		"DIM" },
+    { WA_BLINK,		"BLINK" },
+    { WA_PROTECT,	"PROTECT" },
+#ifdef WA_INVIS
+    { WA_INVIS,		"INVISIBLE" },
+#endif
+#ifdef WA_ITALIC
+    { WA_ITALIC,	"ITALIC" },
+#endif
+    { WA_NORMAL,	"NORMAL" },
+};
+/* *INDENT-ON* */
+
+static unsigned
+init_w_attr_list(W_ATTR_TBL * target, attr_t attrs)
+{
+    unsigned result = 0;
+    size_t n;
+
+    for (n = 0; n < SIZEOF(w_attrs_to_test); ++n) {
+	attr_t test = w_attrs_to_test[n].attr;
+	if (test == WA_NORMAL || (test & attrs) != 0) {
+	    target[result++] = w_attrs_to_test[n];
+	}
+    }
+    return result;
+}
+#endif
+
+static bool
+attr_getc(int *skip,
+	  NCURSES_COLOR_T *fg,
+	  NCURSES_COLOR_T *bg,
+	  NCURSES_COLOR_T *tx,
+	  int *ac,
+	  unsigned *kc,
+	  unsigned limit)
+{
+    bool result = TRUE;
+    bool error = FALSE;
+    WINDOW *helpwin;
+
+    do {
+	int ch = Getchar();
+
+	error = FALSE;
+	if (ch < 256 && isdigit(ch)) {
+	    *skip = (ch - '0');
+	} else {
+	    switch (ch) {
+	    case CTRL('L'):
+		Repaint();
+		break;
+	    case HELP_KEY_1:
+		if ((helpwin = newwin(LINES - 1, COLS - 2, 0, 0)) != 0) {
+		    box(helpwin, 0, 0);
+		    attr_legend(helpwin);
+		    wGetchar(helpwin);
+		    delwin(helpwin);
+		}
+		break;
+	    case 'a':
+		*ac = 0;
+		break;
+	    case 'A':
+		*ac = A_ALTCHARSET;
+		break;
+	    case 'v':
+		if (*kc == 0)
+		    *kc = limit - 1;
+		else
+		    *kc -= 1;
+		break;
+	    case 'V':
+		*kc += 1;
+		if (*kc >= limit)
+		    *kc = 0;
+		break;
+	    case '<':
+		adjust_attr_string(-1);
+		break;
+	    case '>':
+		adjust_attr_string(1);
+		break;
+	    case case_QUIT:
+		result = FALSE;
+		break;
+	    default:
+		error = cycle_color_attr(ch, fg, bg, tx);
+		break;
+	    }
+	}
+    } while (error);
+    return result;
+}
+
+static int
+attr_test(bool recur GCC_UNUSED)
+/* test text attributes */
+{
+    int n;
+    int skip = get_xmc();
+    NCURSES_COLOR_T fg = COLOR_BLACK;	/* color pair 0 is special */
+    NCURSES_COLOR_T bg = COLOR_BLACK;
+    NCURSES_COLOR_T tx = -1;
+    int ac = 0;
+    WINDOW *my_wins[SIZEOF(attrs_to_test)];
+    ATTR_TBL my_list[SIZEOF(attrs_to_test)];
+    unsigned my_size = init_attr_list(my_list, termattrs());
+
+    if (my_size > 1) {
+	unsigned j, k;
+
+	for (j = 0; j < my_size; ++j) {
+	    my_wins[j] = subwin(stdscr,
+				1, LEN_ATTRSTRING,
+				2 + (int) (2 * j), COL_ATTRSTRING);
+	    scrollok(my_wins[j], FALSE);
+	}
+
+	if (skip < 0)
+	    skip = 0;
+
+	n = skip;		/* make it easy */
+	k = my_size - 1;
+	init_attr_string();
+
+	do {
+	    int row = 2;
+	    chtype normal = A_NORMAL | BLANK;
+	    chtype extras = (chtype) ac;
+
+	    if (UseColors) {
+		NCURSES_PAIRS_T pair = 0;
+		if ((fg != COLOR_BLACK) || (bg != COLOR_BLACK)) {
+		    pair = 1;
+		    if (init_pair(pair, fg, bg) == ERR) {
+			beep();
+		    } else {
+			normal |= (chtype) COLOR_PAIR(pair);
+		    }
+		}
+		if (tx >= 0) {
+		    pair = 2;
+		    if (init_pair(pair, tx, bg) == ERR) {
+			beep();
+		    } else {
+			extras |= (chtype) COLOR_PAIR(pair);
+			normal &= ~A_COLOR;
+		    }
+		}
+	    }
+	    bkgd(normal);
+	    bkgdset(normal);
+	    erase();
+
+	    box(stdscr, 0, 0);
+	    MvAddStr(0, 20, "Character attribute test display");
+
+	    for (j = 0; j < my_size; ++j) {
+		bool arrow = (j == k);
+		row = show_attr(my_wins[j], row, n, arrow,
+				normal |
+				extras |
+				my_list[j].attr |
+				my_list[k].attr,
+				my_list[j].name);
+	    }
+
+	    MvPrintw(row, COLS_PRE_ATTRS,
+		     "This terminal does %shave the magic-cookie glitch",
+		     get_xmc() > -1 ? "" : "not ");
+	    MvPrintw(row + 1, COLS_PRE_ATTRS, "Enter '?' for help.");
+	    show_color_attr(fg, bg, tx);
+	    printw("  ACS (%d)", ac != 0);
+
+	    refresh();
+	} while (attr_getc(&n, &fg, &bg, &tx, &ac, &k, my_size));
+
+	bkgdset(A_NORMAL | BLANK);
+	erase();
+	endwin();
+	return OK;
+    } else {
+	Cannot("does not support video attributes.");
+	return ERR;
+    }
+}
+
+#if USE_WIDEC_SUPPORT
+static bool use_fullwidth;
+static wchar_t wide_attr_test_string[MAX_ATTRSTRING + 1];
+
+#define FULL_LO 0xff00
+#define FULL_HI 0xff5e
+#define HALF_LO 0x20
+
+#define isFullWidth(ch)   ((int)(ch) >= FULL_LO && (int)(ch) <= FULL_HI)
+#define ToNormalWidth(ch) (wchar_t) (((int)(ch) - FULL_LO) + HALF_LO)
+#define ToFullWidth(ch)   (wchar_t) (((int)(ch) - HALF_LO) + FULL_LO)
+
+/*
+ * Returns an ASCII code in [32..126]
+ */
+static wchar_t
+normal_wchar(int ch)
+{
+    wchar_t result = (wchar_t) ch;
+    if (isFullWidth(ch))
+	result = ToNormalWidth(ch);
+    return result;
+}
+
+/*
+ * Returns either an ASCII code in in [32..126] or full-width in
+ * [0xff00..0xff5e], according to use_fullwidth setting.
+ */
+static wchar_t
+target_wchar(int ch)
+{
+    wchar_t result = (wchar_t) ch;
+    if (use_fullwidth) {
+	if (!isFullWidth(ch))
+	    result = ToFullWidth(ch);
+    } else {
+	if (isFullWidth(ch))
+	    result = ToNormalWidth(ch);
+    }
+    return result;
+}
+
+static void
+wide_adjust_attr_string(int adjust)
+{
+    wchar_t save = wide_attr_test_string[0];
+    int first = ((int) normal_wchar(save)) + adjust;
+
+    if (first >= ATTRSTRING_1ST) {
+	int j, k;
+
+	for (j = 0, k = first; j < MAX_ATTRSTRING; ++j, ++k) {
+	    if (k > ATTRSTRING_END)
+		break;
+	    wide_attr_test_string[j] = target_wchar(k);
+	    if (((k + 1 - first) % 5) == 0) {
+		if (++j >= MAX_ATTRSTRING)
+		    break;
+		wide_attr_test_string[j] = ' ';
+	    }
+	}
+	if ((LEN_ATTRSTRING - j) > 5) {
+	    wide_attr_test_string[0] = save;
+	    wide_adjust_attr_string(adjust - 1);
+	} else {
+	    while (j < MAX_ATTRSTRING)
+		wide_attr_test_string[j++] = ' ';
+	    wide_attr_test_string[j] = '\0';
+	}
+    }
+}
+
+static void
+wide_init_attr_string(void)
+{
+    use_fullwidth = FALSE;
+    wide_attr_test_string[0] = (wchar_t) default_attr_string();
+    wide_adjust_attr_string(0);
+}
+
+static void
+set_wide_background(NCURSES_PAIRS_T pair)
+{
+    cchar_t normal;
+    wchar_t blank[2];
+
+    blank[0] = ' ';
+    blank[1] = 0;
+    setcchar(&normal, blank, A_NORMAL, pair, 0);
+    bkgrnd(&normal);
+    bkgrndset(&normal);
+}
+
+static attr_t
+get_wide_background(void)
+{
+    attr_t result = WA_NORMAL;
+    attr_t attr;
+    cchar_t ch;
+    NCURSES_PAIRS_T pair;
+
+    memset(&ch, 0, sizeof(ch));
+    if (getbkgrnd(&ch) != ERR) {
+	wchar_t wch[CCHARW_MAX];
+
+	if (getcchar(&ch, wch, &attr, &pair, 0) != ERR) {
+	    result = attr;
+	}
+    }
+    return result;
+}
+
+static int
+wide_show_attr(WINDOW *win,
+	       int row,
+	       int skip,
+	       bool arrow,
+	       attr_t attr,
+	       NCURSES_PAIRS_T pair,
+	       const char *name)
+{
+    int ncv = get_ncv();
+    attr_t test = attr & ~WA_ALTCHARSET;
+
+    if (arrow)
+	MvPrintw(row, COLS_PRE_ATTRS - 3, "-->");
+    MvPrintw(row, COLS_PRE_ATTRS, "%s mode:", name);
+    MvPrintw(row, COL_ATTRSTRING - 1, "|");
+    if (skip)
+	printw("%*s", skip, " ");
+
+    /*
+     * Just for testing, write text using the alternate character set one
+     * character at a time (to pass its rendition directly), and use the
+     * string operation for the other attributes.
+     */
+    wmove(win, 0, 0);
+    werase(win);
+    if (attr & WA_ALTCHARSET) {
+	const wchar_t *s;
+	cchar_t ch;
+
+	for (s = wide_attr_test_string; *s != L'\0'; ++s) {
+	    wchar_t fill[2];
+	    fill[0] = *s;
+	    fill[1] = L'\0';
+	    setcchar(&ch, fill, attr, pair, 0);
+	    (void) wadd_wch(win, &ch);
+	}
+    } else {
+	attr_t old_attr = 0;
+	NCURSES_PAIRS_T old_pair = 0;
+
+	(void) (wattr_get) (win, &old_attr, &old_pair, 0);
+	(void) wattr_set(win, attr, pair, 0);
+	(void) waddwstr(win, wide_attr_test_string);
+	(void) wattr_set(win, old_attr, old_pair, 0);
+    }
+    if (skip)
+	printw("%*s", skip, " ");
+    MvPrintw(row, COL_ATTRSTRING + LEN_ATTRSTRING, "|");
+    if (test != A_NORMAL) {
+	if (!(term_attrs() & test)) {
+	    printw(" (N/A)");
+	} else {
+	    if (ncv > 0 && (get_wide_background() & A_COLOR)) {
+		static const attr_t table[] =
+		{
+		    WA_STANDOUT,
+		    WA_UNDERLINE,
+		    WA_REVERSE,
+		    WA_BLINK,
+		    WA_DIM,
+		    WA_BOLD,
+		    WA_INVIS,
+		    WA_PROTECT,
+		    WA_ALTCHARSET
+		};
+		unsigned n;
+		bool found = FALSE;
+		for (n = 0; n < SIZEOF(table); n++) {
+		    if ((table[n] & attr) != 0
+			&& ((1 << n) & ncv) != 0) {
+			found = TRUE;
+			break;
+		    }
+		}
+		if (found)
+		    printw(" (NCV)");
+	    }
+	    if ((term_attrs() & test) != test) {
+		printw(" (Part)");
+	    }
+	}
+    }
+    return row + 2;
+}
+
+static bool
+wide_attr_getc(int *skip,
+	       NCURSES_COLOR_T *fg, NCURSES_COLOR_T *bg,
+	       NCURSES_COLOR_T *tx, int *ac,
+	       unsigned *kc, unsigned limit)
+{
+    bool result = TRUE;
+    bool error = FALSE;
+    WINDOW *helpwin;
+
+    do {
+	int ch = Getchar();
+
+	error = FALSE;
+	if (ch < 256 && isdigit(ch)) {
+	    *skip = (ch - '0');
+	} else {
+	    switch (ch) {
+	    case CTRL('L'):
+		Repaint();
+		break;
+	    case HELP_KEY_1:
+		if ((helpwin = newwin(LINES - 1, COLS - 2, 0, 0)) != 0) {
+		    box_set(helpwin, 0, 0);
+		    attr_legend(helpwin);
+		    wGetchar(helpwin);
+		    delwin(helpwin);
+		}
+		break;
+	    case 'a':
+		*ac = 0;
+		break;
+	    case 'A':
+		*ac = A_ALTCHARSET;
+		break;
+	    case 'v':
+		if (*kc == 0)
+		    *kc = limit - 1;
+		else
+		    *kc -= 1;
+		break;
+	    case 'V':
+		*kc += 1;
+		if (*kc >= limit)
+		    *kc = 0;
+		break;
+	    case 'w':
+		use_fullwidth = FALSE;
+		wide_adjust_attr_string(0);
+		break;
+	    case 'W':
+		use_fullwidth = TRUE;
+		wide_adjust_attr_string(0);
+		break;
+	    case '<':
+		wide_adjust_attr_string(-1);
+		break;
+	    case '>':
+		wide_adjust_attr_string(1);
+		break;
+	    case case_QUIT:
+		result = FALSE;
+		break;
+	    default:
+		error = cycle_color_attr(ch, fg, bg, tx);
+		break;
+	    }
+	}
+    } while (error);
+    return result;
+}
+
+static int
+x_attr_test(bool recur GCC_UNUSED)
+/* test text attributes using wide-character calls */
+{
+    int n;
+    int skip = get_xmc();
+    NCURSES_COLOR_T fg = COLOR_BLACK;	/* color pair 0 is special */
+    NCURSES_COLOR_T bg = COLOR_BLACK;
+    NCURSES_COLOR_T tx = -1;
+    int ac = 0;
+    W_ATTR_TBL my_list[SIZEOF(w_attrs_to_test)];
+    WINDOW *my_wins[SIZEOF(w_attrs_to_test)];
+    unsigned my_size = init_w_attr_list(my_list, term_attrs());
+
+    if (my_size > 1) {
+	unsigned j, k;
+
+	for (j = 0; j < my_size; ++j) {
+	    my_wins[j] = subwin(stdscr,
+				1, LEN_ATTRSTRING,
+				2 + (int) (2 * j), COL_ATTRSTRING);
+	    scrollok(my_wins[j], FALSE);
+	}
+
+	if (skip < 0)
+	    skip = 0;
+
+	n = skip;		/* make it easy */
+	k = my_size - 1;
+	wide_init_attr_string();
+
+	do {
+	    int row = 2;
+	    NCURSES_PAIRS_T pair = 0;
+	    NCURSES_PAIRS_T extras = 0;
+
+	    if (UseColors) {
+		pair = (NCURSES_PAIRS_T) (fg != COLOR_BLACK || bg != COLOR_BLACK);
+		if (pair != 0) {
+		    pair = 1;
+		    if (init_pair(pair, fg, bg) == ERR) {
+			beep();
+		    }
+		}
+		extras = pair;
+		if (tx >= 0) {
+		    extras = 2;
+		    if (init_pair(extras, tx, bg) == ERR) {
+			beep();
+		    }
+		}
+	    }
+	    set_wide_background(pair);
+	    erase();
+
+	    box_set(stdscr, 0, 0);
+	    MvAddStr(0, 20, "Character attribute test display");
+
+	    for (j = 0; j < my_size; ++j) {
+		row = wide_show_attr(my_wins[j], row, n, (j == k),
+				     ((attr_t) ac |
+				      my_list[j].attr |
+				      my_list[k].attr),
+				     extras,
+				     my_list[j].name);
+	    }
+
+	    MvPrintw(row, COLS_PRE_ATTRS,
+		     "This terminal does %shave the magic-cookie glitch",
+		     get_xmc() > -1 ? "" : "not ");
+	    MvPrintw(row + 1, COLS_PRE_ATTRS, "Enter '?' for help.");
+	    show_color_attr(fg, bg, tx);
+	    printw("  ACS (%d)", ac != 0);
+
+	    refresh();
+	} while (wide_attr_getc(&n, &fg, &bg, &tx, &ac, &k, my_size));
+
+	set_wide_background(0);
+	erase();
+	endwin();
+	return OK;
+    } else {
+	Cannot("does not support extended video attributes.");
+	return ERR;
+    }
+}
+#endif
+
+/****************************************************************************
+ *
+ * Color support tests
+ *
+ ****************************************************************************/
+
+static NCURSES_CONST char *the_color_names[] =
+{
+    "black",
+    "red",
+    "green",
+    "yellow",
+    "blue",
+    "magenta",
+    "cyan",
+    "white",
+    "BLACK",
+    "RED",
+    "GREEN",
+    "YELLOW",
+    "BLUE",
+    "MAGENTA",
+    "CYAN",
+    "WHITE"
+};
+
+static void
+show_color_name(int y, int x, int color, bool wide, int zoom)
+{
+    if (move(y, x) != ERR) {
+	char temp[80];
+	int width = 8;
+
+	if (wide || zoom) {
+	    _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp))
+			"%02d", color);
+	    if (wide)
+		width = 4;
+	    if ((int) strlen(temp) >= width) {
+		int pwr2 = 0;
+		while ((1 << pwr2) < color)
+		    ++pwr2;
+		_nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp))
+			    width > 4 ? "2^%d" : "^%d", pwr2);
+	    }
+	} else if (color >= 8) {
+	    _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp))
+			"[%02d]", color);
+	} else if (color < 0) {
+	    _nc_STRCPY(temp, "default", sizeof(temp));
+	} else {
+	    _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp))
+			"%.*s", 16, the_color_names[color]);
+	}
+	printw("%-*.*s", width, width, temp);
+    }
+}
+
+static void
+color_legend(WINDOW *helpwin, bool wide)
+{
+    int row = 1;
+    int col = 1;
+
+    MvWPrintw(helpwin, row++, col,
+	      "ESC to exit.");
+    ++row;
+    MvWPrintw(helpwin, row++, col,
+	      "Use up/down arrow to scroll through the display if it is");
+    MvWPrintw(helpwin, row++, col,
+	      "longer than one screen. Control/N and Control/P can be used");
+    MvWPrintw(helpwin, row++, col,
+	      "in place of up/down arrow.  Use pageup/pagedown to scroll a");
+    MvWPrintw(helpwin, row++, col,
+	      "full screen; control/B and control/F can be used here.");
+    ++row;
+    MvWPrintw(helpwin, row++, col,
+	      "Toggles:");
+    MvWPrintw(helpwin, row++, col,
+	      "  a/A     toggle altcharset off/on");
+    MvWPrintw(helpwin, row++, col,
+	      "  b/B     toggle bold off/on");
+    if (has_colors()) {
+	MvWPrintw(helpwin, row++, col,
+		  "  c/C     cycle used-colors through 8,16,...,COLORS");
+    }
+    MvWPrintw(helpwin, row++, col,
+	      "  n/N     toggle text/number on/off");
+    MvWPrintw(helpwin, row++, col,
+	      "  r/R     toggle reverse on/off");
+    MvWPrintw(helpwin, row++, col,
+	      "  w/W     switch width between 4/8 columns");
+    MvWPrintw(helpwin, row++, col,
+	      "  z/Z     zoom out (or in)");
+#if USE_WIDEC_SUPPORT
+    if (wide) {
+	MvWPrintw(helpwin, row++, col,
+		  "Wide characters:");
+	MvWPrintw(helpwin, row, col,
+		  "  x/X     toggle text between ASCII and wide-character");
+    }
+#else
+    (void) wide;
+#endif
+}
+
+#define set_color_test(name, value) if (name != value) { name = value; base_row = 0; }
+
+static int
+color_cycle(int current, int step)
+{
+    int result = current;
+    if (step < 0) {
+	if (current <= 8) {
+	    result = COLORS;
+	} else {
+	    result = 8;
+	    if ((result * 2) > COLORS) {
+		result = COLORS;
+	    } else {
+		while ((result * 2) < current) {
+		    result *= 2;
+		}
+	    }
+	}
+    } else {
+	if (current >= COLORS) {
+	    result = 8;
+	} else {
+	    result *= 2;
+	}
+	if (result > COLORS)
+	    result = COLORS;
+    }
+    return result;
+}
+
+/* generate a color test pattern */
+static int
+color_test(bool recur GCC_UNUSED)
+{
+    NCURSES_PAIRS_T i;
+    int top = 0, width;
+    int base_row = 0;
+    int grid_top = top + 3;
+    int page_size = (LINES - grid_top);
+    int pairs_max;
+    int colors_max = COLORS;
+    int col_limit;
+    int row_limit;
+    int per_row;
+    char *numbered = 0;
+    const char *hello;
+    bool done = FALSE;
+    bool opt_acsc = FALSE;
+    bool opt_bold = FALSE;
+    bool opt_revs = FALSE;
+    bool opt_nums = FALSE;
+    bool opt_wide = FALSE;
+    int opt_zoom = 0;
+    WINDOW *helpwin;
+
+    if (!UseColors) {
+	Cannot("does not support color.");
+	return ERR;
+    }
+
+    numbered = typeCalloc(char, COLS + 1);
+    done = ((COLS < 16) || (numbered == 0));
+
+    /*
+     * Because the number of colors is usually a power of two, we also use
+     * a power of two for the number of colors shown per line (to be tidy).
+     */
+    for (col_limit = 1; col_limit * 2 < COLS; col_limit *= 2) ;
+
+  reloop:
+    while (!done) {
+	int shown = 0;
+	int zoom_size = (1 << opt_zoom);
+	int colors_max1 = colors_max / zoom_size;
+	double colors_max2 = (double) colors_max1 * (double) colors_max1;
+
+	pairs_max = PAIR_NUMBER(A_COLOR) + 1;
+	if (colors_max2 <= COLOR_PAIRS) {
+	    int limit = (colors_max1 - MinColors) * (colors_max1 - MinColors);
+	    if (pairs_max > limit)
+		pairs_max = limit;
+	}
+	if (pairs_max > COLOR_PAIRS)
+	    pairs_max = COLOR_PAIRS;
+	if (pairs_max < colors_max1)
+	    pairs_max = colors_max1;
+
+	/* this assumes an 80-column line */
+	if (opt_wide) {
+	    width = 4;
+	    hello = "Test";
+	    per_row = (col_limit / ((colors_max1 > 8) ? width : 8));
+	} else {
+	    width = 8;
+	    hello = "Hello";
+	    per_row = (col_limit / width);
+	}
+	per_row -= MinColors;
+
+	row_limit = (pairs_max + per_row - 1) / per_row;
+
+	move(0, 0);
+	(void) printw("There are %d color pairs and %d colors",
+		      pairs_max, COLORS);
+	if (colors_max1 != COLORS)
+	    (void) printw(" (using %d colors)", colors_max1);
+	if (MinColors)
+	    (void) addstr(" besides 'default'");
+	if (opt_zoom)
+	    (void) printw(" zoom:%d", opt_zoom);
+
+	clrtobot();
+	MvPrintw(top + 1, 0,
+		 "%dx%d matrix of foreground/background colors, bold *%s*\n",
+		 row_limit,
+		 per_row,
+		 opt_bold ? "on" : "off");
+
+	/* show color names/numbers across the top */
+	for (i = 0; i < per_row; i++) {
+	    show_color_name(top + 2,
+			    (i + 1) * width,
+			    (int) i * zoom_size + MinColors,
+			    opt_wide,
+			    opt_zoom);
+	}
+
+	/* show a grid of colors, with color names/ numbers on the left */
+	for (i = (NCURSES_PAIRS_T) (base_row * per_row); i < pairs_max; i++) {
+	    int row = grid_top + (i / per_row) - base_row;
+	    int col = (i % per_row + 1) * width;
+	    NCURSES_PAIRS_T pair = i;
+
+	    if ((i / per_row) > row_limit)
+		break;
+
+#define InxToFG(i) (int)((((unsigned long)(i) * (unsigned long)zoom_size) % (unsigned long)(colors_max1 - MinColors)) + (unsigned long)MinColors)
+#define InxToBG(i) (int)((((unsigned long)(i) * (unsigned long)zoom_size) / (unsigned long)(colors_max1 - MinColors)) + (unsigned long)MinColors)
+	    if (row >= 0 && move(row, col) != ERR) {
+		NCURSES_COLOR_T fg = (NCURSES_COLOR_T) InxToFG(i);
+		NCURSES_COLOR_T bg = (NCURSES_COLOR_T) InxToBG(i);
+
+		init_pair(pair, fg, bg);
+		attron(COLOR_PAIR(pair));
+		if (opt_acsc)
+		    attron(A_ALTCHARSET);
+		if (opt_bold)
+		    attron(A_BOLD);
+		if (opt_revs)
+		    attron(A_REVERSE);
+
+		if (opt_nums) {
+		    _nc_SPRINTF(numbered, _nc_SLIMIT((size_t) (COLS + 1))
+				"{%02X}", (int) i);
+		    hello = numbered;
+		}
+		printw("%-*.*s", width, width, hello);
+		(void) attrset(A_NORMAL);
+
+		if ((i % per_row) == 0 && InxToFG(i) == MinColors) {
+		    show_color_name(row, 0,
+				    InxToBG(i),
+				    opt_wide,
+				    opt_zoom);
+		}
+		++shown;
+	    } else if (shown) {
+		break;
+	    }
+	}
+
+	switch (wGetchar(stdscr)) {
+	case 'a':
+	    opt_acsc = FALSE;
+	    break;
+	case 'A':
+	    opt_acsc = TRUE;
+	    break;
+	case 'b':
+	    opt_bold = FALSE;
+	    break;
+	case 'B':
+	    opt_bold = TRUE;
+	    break;
+	case 'c':
+	    colors_max = color_cycle(colors_max, -1);
+	    break;
+	case 'C':
+	    colors_max = color_cycle(colors_max, 1);
+	    break;
+	case 'n':
+	    opt_nums = FALSE;
+	    break;
+	case 'N':
+	    opt_nums = TRUE;
+	    break;
+	case 'r':
+	    opt_revs = FALSE;
+	    break;
+	case 'R':
+	    opt_revs = TRUE;
+	    break;
+	case case_QUIT:
+	    done = TRUE;
+	    continue;
+	case 'w':
+	    set_color_test(opt_wide, FALSE);
+	    break;
+	case 'W':
+	    set_color_test(opt_wide, TRUE);
+	    break;
+	case 'z':
+	    if (opt_zoom <= 0) {
+		beep();
+	    } else {
+		--opt_zoom;
+		goto reloop;
+	    }
+	    break;
+	case 'Z':
+	    if ((1 << opt_zoom) >= colors_max) {
+		beep();
+	    } else {
+		++opt_zoom;
+		goto reloop;
+	    }
+	    break;
+	case CTRL('p'):
+	case KEY_UP:
+	    if (base_row <= 0) {
+		beep();
+	    } else {
+		base_row -= 1;
+	    }
+	    break;
+	case CTRL('n'):
+	case KEY_DOWN:
+	    if (base_row + page_size >= row_limit) {
+		beep();
+	    } else {
+		base_row += 1;
+	    }
+	    break;
+	case CTRL('b'):
+	case KEY_PREVIOUS:
+	case KEY_PPAGE:
+	    if (base_row <= 0) {
+		beep();
+	    } else {
+		base_row -= (page_size - 1);
+		if (base_row < 0)
+		    base_row = 0;
+	    }
+	    break;
+	case CTRL('f'):
+	case KEY_NEXT:
+	case KEY_NPAGE:
+	    if (base_row + page_size >= row_limit) {
+		beep();
+	    } else {
+		base_row += page_size - 1;
+		if (base_row + page_size >= row_limit) {
+		    base_row = row_limit - page_size - 1;
+		}
+	    }
+	    break;
+	case HELP_KEY_1:
+	    if ((helpwin = newwin(LINES - 1, COLS - 2, 0, 0)) != 0) {
+		box(helpwin, 0, 0);
+		color_legend(helpwin, FALSE);
+		wGetchar(helpwin);
+		delwin(helpwin);
+	    }
+	    break;
+	default:
+	    beep();
+	    continue;
+	}
+    }
+
+    erase();
+    endwin();
+
+    free(numbered);
+    return OK;
+}
+
+#if USE_WIDEC_SUPPORT
+
+#if USE_EXTENDED_COLOR
+#define InitExtendedPair(p,f,g) init_extended_pair((p),(f),(g))
+#define ExtendedColorSet(p)     color_set((NCURSES_PAIRS_T) (p), &(p))
+#define EXTENDED_PAIRS_T int
+#else
+#define InitExtendedPair(p,f,g) init_pair((NCURSES_PAIRS_T) (p),(NCURSES_COLOR_T)(f),(NCURSES_COLOR_T)(g))
+#define ExtendedColorSet(p)     color_set((NCURSES_PAIRS_T) (p), NULL)
+#define EXTENDED_PAIRS_T NCURSES_PAIRS_T
+#endif
+
+/* generate a color test pattern */
+static int
+x_color_test(bool recur GCC_UNUSED)
+{
+    long i;
+    int top = 0, width;
+    int base_row = 0;
+    int grid_top = top + 3;
+    int page_size = (LINES - grid_top);
+    int pairs_max;
+    int colors_max = COLORS;
+    int col_limit;
+    int row_limit;
+    int per_row;
+    char *numbered = 0;
+    const char *hello;
+    bool done = FALSE;
+    bool opt_acsc = FALSE;
+    bool opt_bold = FALSE;
+    bool opt_revs = FALSE;
+    bool opt_wide = FALSE;
+    bool opt_nums = FALSE;
+    bool opt_xchr = FALSE;
+    int opt_zoom = 0;
+    wchar_t *buffer = 0;
+    WINDOW *helpwin;
+
+    if (!UseColors) {
+	Cannot("does not support color.");
+	return ERR;
+    }
+    numbered = typeCalloc(char, COLS + 1);
+    buffer = typeCalloc(wchar_t, COLS + 1);
+    done = ((COLS < 16) || (numbered == 0) || (buffer == 0));
+
+    /*
+     * Because the number of colors is usually a power of two, we also use
+     * a power of two for the number of colors shown per line (to be tidy).
+     */
+    for (col_limit = 1; col_limit * 2 < COLS; col_limit *= 2) ;
+
+  reloop:
+    while (!done) {
+	int shown = 0;
+	int zoom_size = (1 << opt_zoom);
+	int colors_max1 = colors_max / zoom_size;
+	double colors_max2 = (double) colors_max1 * (double) colors_max1;
+
+	pairs_max = ((unsigned) (-1)) / 2;
+	if (colors_max2 <= COLOR_PAIRS) {
+	    int limit = (colors_max1 - MinColors) * (colors_max1 - MinColors);
+	    if (pairs_max > limit)
+		pairs_max = limit;
+	}
+	if (pairs_max > COLOR_PAIRS)
+	    pairs_max = COLOR_PAIRS;
+	if (pairs_max < colors_max1)
+	    pairs_max = colors_max1;
+
+	if (opt_wide) {
+	    width = 4;
+	    hello = "Test";
+	    per_row = (col_limit / ((colors_max1 > 8) ? width : 8));
+	} else {
+	    width = 8;
+	    hello = "Hello";
+	    per_row = (col_limit / width);
+	}
+	per_row -= MinColors;
+
+	if (opt_xchr) {
+	    make_fullwidth_text(buffer, hello);
+	    width *= 2;
+	    per_row /= 2;
+	} else {
+	    make_narrow_text(buffer, hello);
+	}
+
+	row_limit = (pairs_max + per_row - 1) / per_row;
+
+	move(0, 0);
+	(void) printw("There are %d color pairs and %d colors",
+		      pairs_max, COLORS);
+	if (colors_max1 != COLORS)
+	    (void) printw(" (using %d colors)", colors_max1);
+	if (MinColors)
+	    (void) addstr(" besides 'default'");
+	if (opt_zoom)
+	    (void) printw(" zoom:%d", opt_zoom);
+
+	clrtobot();
+	MvPrintw(top + 1, 0,
+		 "%dx%d matrix of foreground/background colors, bold *%s*\n",
+		 row_limit,
+		 per_row,
+		 opt_bold ? "on" : "off");
+
+	/* show color names/numbers across the top */
+	for (i = 0; i < per_row; i++) {
+	    show_color_name(top + 2,
+			    ((int) i + 1) * width,
+			    (int) i * zoom_size + MinColors,
+			    opt_wide,
+			    opt_zoom);
+	}
+
+	/* show a grid of colors, with color names/ numbers on the left */
+	for (i = (base_row * per_row); i < pairs_max; i++) {
+	    int row = grid_top + ((int) i / per_row) - base_row;
+	    int col = ((int) i % per_row + 1) * width;
+	    int pair = (int) i;
+
+	    if ((i / per_row) > row_limit)
+		break;
+
+	    if (row >= 0 && move(row, col) != ERR) {
+		InitExtendedPair(pair, InxToFG(i), InxToBG(i));
+		(void) ExtendedColorSet(pair);
+		if (opt_acsc)
+		    attr_on(WA_ALTCHARSET, NULL);
+		if (opt_bold)
+		    attr_on(WA_BOLD, NULL);
+		if (opt_revs)
+		    attr_on(WA_REVERSE, NULL);
+
+		if (opt_nums) {
+		    _nc_SPRINTF(numbered,
+				_nc_SLIMIT((size_t) (COLS + 1) * sizeof(wchar_t))
+				"{%02X}", (unsigned) i);
+		    if (opt_xchr) {
+			make_fullwidth_text(buffer, numbered);
+		    } else {
+			make_narrow_text(buffer, numbered);
+		    }
+		}
+		addnwstr(buffer, width);
+		(void) attr_set(A_NORMAL, 0, NULL);
+
+		if ((i % per_row) == 0 && InxToFG(i) == MinColors) {
+		    show_color_name(row, 0,
+				    InxToBG(i),
+				    opt_wide,
+				    opt_zoom);
+		}
+		++shown;
+	    } else if (shown) {
+		break;
+	    }
+	}
+
+	switch (wGetchar(stdscr)) {
+	case 'a':
+	    opt_acsc = FALSE;
+	    break;
+	case 'A':
+	    opt_acsc = TRUE;
+	    break;
+	case 'b':
+	    opt_bold = FALSE;
+	    break;
+	case 'B':
+	    opt_bold = TRUE;
+	    break;
+	case 'c':
+	    colors_max = color_cycle(colors_max, -1);
+	    break;
+	case 'C':
+	    colors_max = color_cycle(colors_max, 1);
+	    break;
+	case 'n':
+	    opt_nums = FALSE;
+	    break;
+	case 'N':
+	    opt_nums = TRUE;
+	    break;
+	case 'r':
+	    opt_revs = FALSE;
+	    break;
+	case 'R':
+	    opt_revs = TRUE;
+	    break;
+	case case_QUIT:
+	    done = TRUE;
+	    continue;
+	case 'w':
+	    set_color_test(opt_wide, FALSE);
+	    break;
+	case 'W':
+	    set_color_test(opt_wide, TRUE);
+	    break;
+	case 'x':
+	    opt_xchr = FALSE;
+	    break;
+	case 'X':
+	    opt_xchr = TRUE;
+	    break;
+	case 'z':
+	    if (opt_zoom <= 0) {
+		beep();
+	    } else {
+		--opt_zoom;
+		goto reloop;
+	    }
+	    break;
+	case 'Z':
+	    if ((1 << opt_zoom) >= colors_max) {
+		beep();
+	    } else {
+		++opt_zoom;
+		goto reloop;
+	    }
+	    break;
+	case CTRL('p'):
+	case KEY_UP:
+	    if (base_row <= 0) {
+		beep();
+	    } else {
+		base_row -= 1;
+	    }
+	    break;
+	case CTRL('n'):
+	case KEY_DOWN:
+	    if (base_row + page_size >= row_limit) {
+		beep();
+	    } else {
+		base_row += 1;
+	    }
+	    break;
+	case CTRL('b'):
+	case KEY_PREVIOUS:
+	case KEY_PPAGE:
+	    if (base_row <= 0) {
+		beep();
+	    } else {
+		base_row -= (page_size - 1);
+		if (base_row < 0)
+		    base_row = 0;
+	    }
+	    break;
+	case CTRL('f'):
+	case KEY_NEXT:
+	case KEY_NPAGE:
+	    if (base_row + page_size >= row_limit) {
+		beep();
+	    } else {
+		base_row += page_size - 1;
+		if (base_row + page_size >= row_limit) {
+		    base_row = row_limit - page_size - 1;
+		}
+	    }
+	    break;
+	case HELP_KEY_1:
+	    if ((helpwin = newwin(LINES - 1, COLS - 2, 0, 0)) != 0) {
+		box(helpwin, 0, 0);
+		color_legend(helpwin, TRUE);
+		wGetchar(helpwin);
+		delwin(helpwin);
+	    }
+	    break;
+	default:
+	    beep();
+	    continue;
+	}
+    }
+
+    erase();
+    endwin();
+
+    free(numbered);
+    free(buffer);
+    return OK;
+}
+#endif /* USE_WIDEC_SUPPORT */
+
+#if HAVE_COLOR_CONTENT
+static void
+change_color(NCURSES_PAIRS_T current, int field, int value, int usebase)
+{
+    NCURSES_COLOR_T red, green, blue;
+
+    color_content(current, &red, &green, &blue);
+
+    switch (field) {
+    case 0:
+	red = (NCURSES_COLOR_T) (usebase ? (red + value) : value);
+	break;
+    case 1:
+	green = (NCURSES_COLOR_T) (usebase ? (green + value) : value);
+	break;
+    case 2:
+	blue = (NCURSES_COLOR_T) (usebase ? (blue + value) : value);
+	break;
+    }
+
+    if (init_color(current, red, green, blue) == ERR)
+	beep();
+}
+
+static void
+reset_all_colors(void)
+{
+    NCURSES_PAIRS_T c;
+
+    for (c = 0; c < COLORS; ++c)
+	init_color(c,
+		   all_colors[c].red,
+		   all_colors[c].green,
+		   all_colors[c].blue);
+}
+
+#define okCOLOR(n) ((n) >= 0 && (n) < MaxColors)
+#define okRGB(n)   ((n) >= 0 && (n) <= 1000)
+#define DecodeRGB(n) (NCURSES_COLOR_T) ((n * 1000) / 0xffff)
+
+static void
+init_all_colors(bool xterm_colors, char *palette_file)
+{
+    NCURSES_PAIRS_T cp;
+    all_colors = typeMalloc(RGB_DATA, (unsigned) MaxColors);
+    if (!all_colors)
+	failed("all_colors");
+    for (cp = 0; cp < MaxColors; ++cp) {
+	color_content(cp,
+		      &all_colors[cp].red,
+		      &all_colors[cp].green,
+		      &all_colors[cp].blue);
+    }
+    /* xterm and compatible terminals can read results of an OSC string
+     * asking for the current color palette.
+     */
+    if (xterm_colors) {
+	int n;
+	char result[BUFSIZ];
+	int check_n;
+	unsigned check_r, check_g, check_b;
+
+	raw();
+	noecho();
+
+	for (n = 0; n < MaxColors; ++n) {
+	    int got;
+
+	    fprintf(stderr, "\033]4;%d;?\007", n);
+	    got = (int) read(0, result, sizeof(result) - 1);
+	    if (got < 0)
+		break;
+	    result[got] = '\0';
+	    if (sscanf(result, "\033]4;%d;rgb:%x/%x/%x\007",
+		       &check_n,
+		       &check_r,
+		       &check_g,
+		       &check_b) == 4 &&
+		check_n == n) {
+		all_colors[n].red = DecodeRGB(check_r);
+		all_colors[n].green = DecodeRGB(check_g);
+		all_colors[n].blue = DecodeRGB(check_b);
+	    } else {
+		break;
+	    }
+	}
+	reset_prog_mode();
+    }
+    if (palette_file != 0) {
+	FILE *fp = fopen(palette_file, "r");
+	if (fp != 0) {
+	    char buffer[BUFSIZ];
+	    int red, green, blue;
+	    int scale = 1000;
+	    int c;
+	    while (fgets(buffer, sizeof(buffer), fp) != 0) {
+		if (sscanf(buffer, "scale:%d", &c) == 1) {
+		    scale = c;
+		    if (scale < 100)
+			scale = 100;
+		    if (scale > 1000)
+			scale = 1000;
+		} else if (sscanf(buffer, "%d:%d %d %d",
+				  &c,
+				  &red,
+				  &green,
+				  &blue) == 4
+			   && okCOLOR(c)
+			   && okRGB(red)
+			   && okRGB(green)
+			   && okRGB(blue)) {
+#define Scaled(n) (NCURSES_COLOR_T) (((n) * 1000) / scale)
+		    all_colors[c].red = Scaled(red);
+		    all_colors[c].green = Scaled(green);
+		    all_colors[c].blue = Scaled(blue);
+		}
+	    }
+	    fclose(fp);
+	}
+    }
+}
+
+#define scaled_rgb(n) ((255 * (n)) / 1000)
+
+static int
+color_edit(bool recur GCC_UNUSED)
+/* display the color test pattern, without trying to edit colors */
+{
+    int i;
+    int current;
+    int this_c, value, field;
+    int last_c;
+    int top_color;
+    int page_size;
+
+    if (!UseColors) {
+	Cannot("does not support color.");
+	return ERR;
+    } else if (!can_change_color()) {
+	Cannot("has hardwired color values.");
+	return ERR;
+    }
+
+    reset_all_colors();
+#ifdef KEY_RESIZE
+  retry:
+#endif
+    current = 0;
+    this_c = 0;
+    value = 0;
+    field = 0;
+    top_color = 0;
+    page_size = (LINES - 6);
+    erase();
+
+    for (i = 0; i < MaxColors; i++)
+	init_pair((NCURSES_PAIRS_T) i,
+		  (NCURSES_COLOR_T) COLOR_WHITE,
+		  (NCURSES_COLOR_T) i);
+
+    MvPrintw(LINES - 2, 0, "Number: %d", value);
+
+    do {
+	NCURSES_COLOR_T red, green, blue;
+
+	attron(A_BOLD);
+	MvAddStr(0, 20, "Color RGB Value Editing");
+	attroff(A_BOLD);
+
+	for (i = (NCURSES_COLOR_T) top_color;
+	     (i - top_color < page_size)
+	     && (i < MaxColors); i++) {
+	    char numeric[80];
+
+	    _nc_SPRINTF(numeric, _nc_SLIMIT(sizeof(numeric)) "[%d]", i);
+	    MvPrintw(2 + i - top_color, 0, "%c %-8s:",
+		     (i == current ? '>' : ' '),
+		     (i < (int) SIZEOF(the_color_names)
+		      ? the_color_names[i] : numeric));
+	    (void) attrset(AttrArg(COLOR_PAIR(i), 0));
+	    addstr("        ");
+	    (void) attrset(A_NORMAL);
+
+	    color_content((NCURSES_PAIRS_T) i, &red, &green, &blue);
+	    addstr("   R = ");
+	    if (current == i && field == 0)
+		attron(A_STANDOUT);
+	    printw("%04d", (int) red);
+	    if (current == i && field == 0)
+		(void) attrset(A_NORMAL);
+	    addstr(", G = ");
+	    if (current == i && field == 1)
+		attron(A_STANDOUT);
+	    printw("%04d", (int) green);
+	    if (current == i && field == 1)
+		(void) attrset(A_NORMAL);
+	    addstr(", B = ");
+	    if (current == i && field == 2)
+		attron(A_STANDOUT);
+	    printw("%04d", (int) blue);
+	    if (current == i && field == 2)
+		(void) attrset(A_NORMAL);
+	    (void) attrset(A_NORMAL);
+	    printw(" ( %3d %3d %3d )",
+		   (int) scaled_rgb(red),
+		   (int) scaled_rgb(green),
+		   (int) scaled_rgb(blue));
+	}
+
+	MvAddStr(LINES - 3, 0,
+		 "Use up/down to select a color, left/right to change fields.");
+	MvAddStr(LINES - 2, 0,
+		 "Modify field by typing nnn=, nnn-, or nnn+.  ? for help.");
+
+	move(2 + current - top_color, 0);
+
+	last_c = this_c;
+	this_c = Getchar();
+	if (this_c < 256 && isdigit(this_c) && !isdigit(last_c))
+	    value = 0;
+
+	switch (this_c) {
+#ifdef KEY_RESIZE
+	case KEY_RESIZE:
+	    move(0, 0);
+	    goto retry;
+#endif
+	case '!':
+	    ShellOut(FALSE);
+	    /* FALLTHRU */
+	case CTRL('r'):
+	    endwin();
+	    refresh();
+	    break;
+	case CTRL('l'):
+	    refresh();
+	    break;
+	case CTRL('b'):
+	case KEY_PPAGE:
+	    if (current > 0)
+		current -= (page_size - 1);
+	    else
+		beep();
+	    break;
+
+	case CTRL('f'):
+	case KEY_NPAGE:
+	    if (current < (MaxColors - 1))
+		current += (page_size - 1);
+	    else
+		beep();
+	    break;
+
+	case CTRL('p'):
+	case KEY_UP:
+	    current = (current == 0 ? (MaxColors - 1) : current - 1);
+	    break;
+
+	case CTRL('n'):
+	case KEY_DOWN:
+	    current = (current == (MaxColors - 1) ? 0 : current + 1);
+	    break;
+
+	case '\t':
+	case KEY_RIGHT:
+	    field = (field == 2 ? 0 : field + 1);
+	    break;
+
+	case KEY_BTAB:
+	case KEY_LEFT:
+	    field = (field == 0 ? 2 : field - 1);
+	    break;
+
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':
+	    value = value * 10 + (this_c - '0');
+	    break;
+
+	case '+':
+	    change_color((NCURSES_PAIRS_T) current, field, value, 1);
+	    break;
+
+	case '-':
+	    change_color((NCURSES_PAIRS_T) current, field, -value, 1);
+	    break;
+
+	case '=':
+	    change_color((NCURSES_PAIRS_T) current, field, value, 0);
+	    break;
+
+	case HELP_KEY_1:
+	    erase();
+	    P("                      RGB Value Editing Help");
+	    P("");
+	    P("You are in the RGB value editor.  Use the arrow keys to select one of");
+	    P("the fields in one of the RGB triples of the current colors; the one");
+	    P("currently selected will be reverse-video highlighted.");
+	    P("");
+	    P("To change a field, enter the digits of the new value; they are echoed");
+	    P("as entered.  Finish by typing `='.  The change will take effect instantly.");
+	    P("To increment or decrement a value, use the same procedure, but finish");
+	    P("with a `+' or `-'.");
+	    P("");
+	    P("Use `!' to shell-out, ^R or ^L to repaint the screen.");
+	    P("");
+	    P("Press 'm' to invoke the top-level menu with the current color settings.");
+	    P("To quit, do ESC");
+
+	    Pause();
+	    erase();
+	    break;
+
+	case 'm':
+	    endwin();
+	    main_menu(FALSE);
+	    for (i = 0; i < MaxColors; i++)
+		init_pair((NCURSES_PAIRS_T) i,
+			  (NCURSES_COLOR_T) COLOR_WHITE,
+			  (NCURSES_COLOR_T) i);
+	    refresh();
+	    break;
+
+	case case_QUIT:
+	    break;
+
+	default:
+	    beep();
+	    break;
+	}
+
+	if (current < 0)
+	    current = 0;
+	if (current >= MaxColors)
+	    current = MaxColors - 1;
+	if (current < top_color)
+	    top_color = current;
+	if (current - top_color >= page_size)
+	    top_color = current - (page_size - 1);
+
+	MvPrintw(LINES - 1, 0, "Number: %d", value);
+	clrtoeol();
+    } while
+	(!isQuit(this_c, TRUE));
+
+    erase();
+
+    /*
+     * ncurses does not reset each color individually when calling endwin().
+     */
+    reset_all_colors();
+
+    endwin();
+    return OK;
+}
+#endif /* HAVE_COLOR_CONTENT */
+
+/****************************************************************************
+ *
+ * Alternate character-set stuff
+ *
+ ****************************************************************************/
+static bool
+cycle_attr(int ch, unsigned *at_code, chtype *attr, ATTR_TBL * list, unsigned limit)
+{
+    bool result = TRUE;
+
+    switch (ch) {
+    case 'v':
+	if ((*at_code += 1) >= limit)
+	    *at_code = 0;
+	break;
+    case 'V':
+	if (*at_code == 0)
+	    *at_code = limit - 1;
+	else
+	    *at_code -= 1;
+	break;
+    default:
+	result = FALSE;
+	break;
+    }
+    if (result)
+	*attr = list[*at_code].attr;
+    return result;
+}
+
+#if USE_WIDEC_SUPPORT
+static bool
+cycle_w_attr(int ch, unsigned *at_code, attr_t *attr, W_ATTR_TBL * list, unsigned limit)
+{
+    bool result = TRUE;
+
+    switch (ch) {
+    case 'v':
+	if ((*at_code += 1) >= limit)
+	    *at_code = 0;
+	break;
+    case 'V':
+	if (*at_code == 0)
+	    *at_code = limit - 1;
+	else
+	    *at_code -= 1;
+	break;
+    default:
+	result = FALSE;
+	break;
+    }
+    if (result)
+	*attr = list[*at_code].attr;
+    return result;
+}
+#endif
+
+static bool
+cycle_colors(int ch, int *fg, int *bg, NCURSES_PAIRS_T *pair)
+{
+    bool result = FALSE;
+
+    if (UseColors) {
+	result = TRUE;
+	switch (ch) {
+	case 'F':
+	    if ((*fg -= 1) < 0)
+		*fg = COLORS - 1;
+	    break;
+	case 'f':
+	    if ((*fg += 1) >= COLORS)
+		*fg = 0;
+	    break;
+	case 'B':
+	    if ((*bg -= 1) < 0)
+		*bg = COLORS - 1;
+	    break;
+	case 'b':
+	    if ((*bg += 1) >= COLORS)
+		*bg = 0;
+	    break;
+	default:
+	    result = FALSE;
+	    break;
+	}
+	if (result) {
+	    *pair = (NCURSES_PAIRS_T) (*fg != COLOR_BLACK || *bg != COLOR_BLACK);
+	    if (*pair != 0) {
+		*pair = 1;
+		if (init_pair(*pair,
+			      (NCURSES_COLOR_T) *fg,
+			      (NCURSES_COLOR_T) *bg) == ERR) {
+		    result = FALSE;
+		}
+	    }
+	}
+    }
+    return result;
+}
+
+/****************************************************************************
+ *
+ * Soft-key label test
+ *
+ ****************************************************************************/
+
+#if USE_SOFTKEYS
+
+#define SLK_HELP 17
+#define SLK_WORK (SLK_HELP + 3)
+
+static void
+slk_help(void)
+{
+    static const char *table[] =
+    {
+	"Available commands are:"
+	,""
+	,"^L         -- repaint this message and activate soft keys"
+	,"a/d        -- activate/disable soft keys"
+	,"c          -- set centered format for labels"
+	,"l          -- set left-justified format for labels"
+	,"r          -- set right-justified format for labels"
+	,"[12345678] -- set label; labels are numbered 1 through 8"
+	,"e          -- erase stdscr (should not erase labels)"
+	,"s          -- test scrolling of shortened screen"
+	,"v/V        -- cycle through video attributes"
+#if HAVE_SLK_COLOR
+	,"F/f/B/b    -- cycle through foreground/background colors"
+#endif
+	,"ESC        -- return to main menu"
+	,""
+	,"Note: if activating the soft keys causes your terminal to scroll up"
+	,"one line, your terminal auto-scrolls when anything is written to the"
+	,"last screen position.  The ncurses code does not yet handle this"
+	,"gracefully."
+    };
+    unsigned j;
+
+    move(2, 0);
+    for (j = 0; j < SIZEOF(table); ++j) {
+	P(table[j]);
+    }
+    refresh();
+}
+
+#if HAVE_SLK_COLOR
+static void
+call_slk_color(int fg, int bg)
+{
+    init_pair(1, (NCURSES_COLOR_T) bg, (NCURSES_COLOR_T) fg);
+    slk_color(1);
+    MvPrintw(SLK_WORK, 0, "Colors %d/%d\n", fg, bg);
+    clrtoeol();
+    slk_touch();
+    slk_noutrefresh();
+    refresh();
+}
+#endif
+
+static int
+slk_test(bool recur GCC_UNUSED)
+/* exercise the soft keys */
+{
+    int c, fmt = 1;
+    char buf[9];
+    char *s;
+    chtype attr = A_NORMAL;
+    unsigned at_code = 0;
+#if HAVE_SLK_COLOR
+    int fg = COLOR_BLACK;
+    int bg = COLOR_WHITE;
+    NCURSES_PAIRS_T pair = 0;
+#endif
+    ATTR_TBL my_list[SIZEOF(attrs_to_test)];
+    unsigned my_size = init_attr_list(my_list, termattrs());
+
+    c = CTRL('l');
+#if HAVE_SLK_COLOR
+    if (UseColors) {
+	call_slk_color(fg, bg);
+    }
+#endif
+
+    do {
+	move(0, 0);
+	switch (c) {
+	case CTRL('l'):
+	    erase();
+	    attron(A_BOLD);
+	    MvAddStr(0, 20, "Soft Key Exerciser");
+	    attroff(A_BOLD);
+
+	    slk_help();
+	    /* fall through */
+
+	case 'a':
+	    slk_restore();
+	    break;
+
+	case 'e':
+	    wclear(stdscr);
+	    break;
+
+	case 's':
+	    MvPrintw(SLK_WORK, 0, "Press Q to stop the scrolling-test: ");
+	    while ((c = Getchar()) != 'Q' && (c != ERR))
+		AddCh(c);
+	    break;
+
+	case 'd':
+	    slk_clear();
+	    break;
+
+	case 'l':
+	    fmt = 0;
+	    break;
+
+	case 'c':
+	    fmt = 1;
+	    break;
+
+	case 'r':
+	    fmt = 2;
+	    break;
+
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	    MvAddStr(SLK_WORK, 0, "Please enter the label value: ");
+	    _nc_STRCPY(buf, "", sizeof(buf));
+	    if ((s = slk_label(c - '0')) != 0) {
+		_nc_STRNCPY(buf, s, (size_t) 8);
+	    }
+	    wGetstring(stdscr, buf, 8);
+	    slk_set((c - '0'), buf, fmt);
+	    slk_refresh();
+	    move(SLK_WORK, 0);
+	    clrtobot();
+	    break;
+
+	case case_QUIT:
+	    goto done;
+
+#if defined(NCURSES_VERSION) && defined(KEY_RESIZE) && HAVE_WRESIZE
+	case KEY_RESIZE:
+	    wnoutrefresh(stdscr);
+	    break;
+#endif
+
+	default:
+	    if (cycle_attr(c, &at_code, &attr, my_list, my_size)) {
+		slk_attrset(attr);
+		slk_touch();
+		slk_noutrefresh();
+		break;
+	    }
+#if HAVE_SLK_COLOR
+	    if (cycle_colors(c, &fg, &bg, &pair)) {
+		if (UseColors) {
+		    call_slk_color(fg, bg);
+		} else {
+		    beep();
+		}
+		break;
+	    }
+#endif
+	    beep();
+	    break;
+	}
+    } while (!isQuit(c = Getchar(), TRUE));
+
+  done:
+    slk_clear();
+    erase();
+    endwin();
+    return OK;
+}
+
+#if USE_WIDEC_SUPPORT
+#define SLKLEN 8
+static int
+x_slk_test(bool recur GCC_UNUSED)
+/* exercise the soft keys */
+{
+    int c, fmt = 1;
+    wchar_t buf[SLKLEN + 1];
+    char *s;
+    attr_t attr = WA_NORMAL;
+    unsigned at_code = 0;
+    int fg = COLOR_BLACK;
+    int bg = COLOR_WHITE;
+    NCURSES_PAIRS_T pair = 0;
+    W_ATTR_TBL my_list[SIZEOF(w_attrs_to_test)];
+    unsigned my_size = init_w_attr_list(my_list, term_attrs());
+
+    c = CTRL('l');
+    if (UseColors) {
+	call_slk_color(fg, bg);
+    }
+    do {
+	move(0, 0);
+	switch (c) {
+	case CTRL('l'):
+	    erase();
+	    attr_on(WA_BOLD, NULL);
+	    MvAddStr(0, 20, "Soft Key Exerciser");
+	    attr_off(WA_BOLD, NULL);
+
+	    slk_help();
+	    /* fall through */
+
+	case 'a':
+	    slk_restore();
+	    break;
+
+	case 'e':
+	    wclear(stdscr);
+	    break;
+
+	case 's':
+	    MvPrintw(SLK_WORK, 0, "Press Q to stop the scrolling-test: ");
+	    while ((c = Getchar()) != 'Q' && (c != ERR))
+		AddCh(c);
+	    break;
+
+	case 'd':
+	    slk_clear();
+	    break;
+
+	case 'l':
+	    fmt = 0;
+	    break;
+
+	case 'c':
+	    fmt = 1;
+	    break;
+
+	case 'r':
+	    fmt = 2;
+	    break;
+
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	    MvAddStr(SLK_WORK, 0, "Please enter the label value: ");
+	    *buf = 0;
+	    if ((s = slk_label(c - '0')) != 0) {
+		char *temp = strdup(s);
+		size_t used = strlen(temp);
+		size_t want = SLKLEN;
+#ifndef state_unused
+		mbstate_t state;
+#endif
+
+		buf[0] = L'\0';
+		while (want > 0 && used != 0) {
+		    size_t test;
+		    const char *base = s;
+
+		    reset_mbytes(state);
+		    test = count_mbytes(base, 0, &state);
+		    if (test == (size_t) -1) {
+			temp[--used] = 0;
+		    } else if (test > want) {
+			temp[--used] = 0;
+		    } else {
+			reset_mbytes(state);
+			trans_mbytes(buf, base, want, &state);
+			break;
+		    }
+		}
+		free(temp);
+	    }
+	    wGet_wstring(stdscr, buf, SLKLEN);
+	    slk_wset((c - '0'), buf, fmt);
+	    slk_refresh();
+	    move(SLK_WORK, 0);
+	    clrtobot();
+	    break;
+
+	case case_QUIT:
+	    goto done;
+
+	case 'F':
+	    if (UseColors) {
+		fg = (NCURSES_COLOR_T) ((fg + 1) % COLORS);
+		call_slk_color(fg, bg);
+	    }
+	    break;
+	case 'B':
+	    if (UseColors) {
+		bg = (NCURSES_COLOR_T) ((bg + 1) % COLORS);
+		call_slk_color(fg, bg);
+	    }
+	    break;
+#if defined(NCURSES_VERSION) && defined(KEY_RESIZE) && HAVE_WRESIZE
+	case KEY_RESIZE:
+	    wnoutrefresh(stdscr);
+	    break;
+#endif
+	default:
+	    if (cycle_w_attr(c, &at_code, &attr, my_list, my_size)) {
+		slk_attr_set(attr, (NCURSES_COLOR_T) (fg || bg), NULL);
+		slk_touch();
+		slk_noutrefresh();
+		break;
+	    }
+#if HAVE_SLK_COLOR
+	    if (cycle_colors(c, &fg, &bg, &pair)) {
+		if (UseColors) {
+		    call_slk_color(fg, bg);
+		} else {
+		    beep();
+		}
+		break;
+	    }
+#endif
+	    beep();
+	    break;
+	}
+    } while (!isQuit(c = Getchar(), TRUE));
+
+  done:
+    slk_clear();
+    erase();
+    endwin();
+    return OK;
+}
+#endif
+#endif /* SLK_INIT */
+
+static void
+show_256_chars(int repeat, attr_t attr, NCURSES_PAIRS_T pair)
+{
+    unsigned first = 0;
+    unsigned last = 255;
+    unsigned code;
+    int count;
+
+    erase();
+    attron(A_BOLD);
+    MvPrintw(0, 20, "Display of Character Codes %#0x to %#0x",
+	     first, last);
+    attroff(A_BOLD);
+    refresh();
+
+    for (code = first; code <= last; ++code) {
+	int row = (int) (2 + (code / 16));
+	int col = (int) (5 * (code % 16));
+	IGNORE_RC(mvaddch(row, col, colored_chtype(code, attr, pair)));
+	for (count = 1; count < repeat; ++count) {
+	    AddCh(colored_chtype(code, attr, pair));
+	}
+    }
+
+}
+
+/*
+ * Show a slice of 32 characters, allowing those to be repeated up to the
+ * screen's width.
+ *
+ * ISO 6429:  codes 0x80 to 0x9f may be control characters that cause the
+ * terminal to perform functions.  The remaining codes can be graphic.
+ */
+static void
+show_upper_chars(int base, int pagesize, int repeat, attr_t attr, NCURSES_PAIRS_T pair)
+{
+    unsigned code;
+    unsigned first = (unsigned) base;
+    unsigned last = first + (unsigned) pagesize - 2;
+    bool C1 = (first == 128);
+    int reply;
+
+    erase();
+    attron(A_BOLD);
+    MvPrintw(0, 20, "Display of %s Character Codes %d to %d",
+	     C1 ? "C1" : "GR", first, last);
+    attroff(A_BOLD);
+    refresh();
+
+    for (code = first; code <= last; code++) {
+	int count = repeat;
+	int row = 2 + ((int) (code - first) % (pagesize / 2));
+	int col = ((int) (code - first) / (pagesize / 2)) * COLS / 2;
+	char tmp[80];
+	_nc_SPRINTF(tmp, _nc_SLIMIT(sizeof(tmp)) "%3u (0x%x)", code, code);
+	MvPrintw(row, col, "%*s: ", COLS / 4, tmp);
+
+	do {
+	    if (C1)
+		nodelay(stdscr, TRUE);
+	    echochar(colored_chtype(code, attr, pair));
+	    if (C1) {
+		/* (yes, this _is_ crude) */
+		while ((reply = Getchar()) != ERR) {
+		    AddCh(UChar(reply));
+		    napms(10);
+		}
+		nodelay(stdscr, FALSE);
+	    }
+	} while (--count > 0);
+    }
+}
+
+#define PC_COLS 4
+
+static void
+show_pc_chars(int repeat, attr_t attr, NCURSES_PAIRS_T pair)
+{
+    unsigned code;
+
+    erase();
+    attron(A_BOLD);
+    MvPrintw(0, 20, "Display of PC Character Codes");
+    attroff(A_BOLD);
+    refresh();
+
+    for (code = 0; code < 16; ++code) {
+	MvPrintw(2, (int) code * PC_COLS + 8, "%X", code);
+    }
+    for (code = 0; code < 256; code++) {
+	int count = repeat;
+	int row = 3 + (int) (code / 16) + (code >= 128);
+	int col = 8 + (int) (code % 16) * PC_COLS;
+	if ((code % 16) == 0)
+	    MvPrintw(row, 0, "0x%02x:", code);
+	move(row, col);
+	do {
+	    switch (code) {
+	    case '\n':
+	    case '\r':
+	    case '\b':
+	    case '\f':
+	    case '\033':
+	    case 0x9b:
+		/*
+		 * Skip the ones that do not work.
+		 */
+		break;
+	    default:
+		AddCh(colored_chtype(code, A_ALTCHARSET | attr, pair));
+		break;
+	    }
+	} while (--count > 0);
+    }
+}
+
+static void
+show_box_chars(int repeat, attr_t attr, NCURSES_PAIRS_T pair)
+{
+    (void) repeat;
+
+    attr |= (attr_t) COLOR_PAIR(pair);
+
+    erase();
+    attron(A_BOLD);
+    MvAddStr(0, 20, "Display of the ACS Line-Drawing Set");
+    attroff(A_BOLD);
+    refresh();
+    /* *INDENT-OFF* */
+    wborder(stdscr,
+	    colored_chtype(ACS_VLINE,	 attr, pair),
+	    colored_chtype(ACS_VLINE,	 attr, pair),
+            colored_chtype(ACS_HLINE,    attr, pair),
+	    colored_chtype(ACS_HLINE,	 attr, pair),
+	    colored_chtype(ACS_ULCORNER, attr, pair),
+	    colored_chtype(ACS_URCORNER, attr, pair),
+            colored_chtype(ACS_LLCORNER, attr, pair),
+	    colored_chtype(ACS_LRCORNER, attr, pair));
+    MvHLine(LINES / 2, 0,        colored_chtype(ACS_HLINE, attr, pair), COLS);
+    MvVLine(0,         COLS / 2, colored_chtype(ACS_VLINE, attr, pair), LINES);
+    MvAddCh(0,         COLS / 2, colored_chtype(ACS_TTEE,  attr, pair));
+    MvAddCh(LINES / 2, COLS / 2, colored_chtype(ACS_PLUS,  attr, pair));
+    MvAddCh(LINES - 1, COLS / 2, colored_chtype(ACS_BTEE,  attr, pair));
+    MvAddCh(LINES / 2, 0,        colored_chtype(ACS_LTEE,  attr, pair));
+    MvAddCh(LINES / 2, COLS - 1, colored_chtype(ACS_RTEE,  attr, pair));
+    /* *INDENT-ON* */
+}
+
+static int
+show_1_acs(int n, int repeat, const char *name, chtype code)
+{
+    const int height = 16;
+    int row = 2 + (n % height);
+    int col = (n / height) * COLS / 2;
+
+    MvPrintw(row, col, "%*s : ", COLS / 4, name);
+    do {
+	AddCh(code);
+    } while (--repeat > 0);
+    return n + 1;
+}
+
+static void
+show_acs_chars(int repeat, attr_t attr, NCURSES_PAIRS_T pair)
+/* display the ACS character set */
+{
+    int n;
+
+#define BOTH(name) #name, colored_chtype(name, attr, (chtype) pair)
+
+    erase();
+    attron(A_BOLD);
+    MvAddStr(0, 20, "Display of the ACS Character Set");
+    attroff(A_BOLD);
+    refresh();
+
+    n = show_1_acs(0, repeat, BOTH(ACS_ULCORNER));
+    n = show_1_acs(n, repeat, BOTH(ACS_URCORNER));
+    n = show_1_acs(n, repeat, BOTH(ACS_LLCORNER));
+    n = show_1_acs(n, repeat, BOTH(ACS_LRCORNER));
+
+    n = show_1_acs(n, repeat, BOTH(ACS_LTEE));
+    n = show_1_acs(n, repeat, BOTH(ACS_RTEE));
+    n = show_1_acs(n, repeat, BOTH(ACS_TTEE));
+    n = show_1_acs(n, repeat, BOTH(ACS_BTEE));
+
+    n = show_1_acs(n, repeat, BOTH(ACS_HLINE));
+    n = show_1_acs(n, repeat, BOTH(ACS_VLINE));
+
+    /*
+     * HPUX's ACS definitions are broken here.  Just give up.
+     */
+#if !(defined(__hpux) && !defined(NCURSES_VERSION))
+    n = show_1_acs(n, repeat, BOTH(ACS_LARROW));
+    n = show_1_acs(n, repeat, BOTH(ACS_RARROW));
+    n = show_1_acs(n, repeat, BOTH(ACS_UARROW));
+    n = show_1_acs(n, repeat, BOTH(ACS_DARROW));
+
+    n = show_1_acs(n, repeat, BOTH(ACS_BLOCK));
+    n = show_1_acs(n, repeat, BOTH(ACS_BOARD));
+    n = show_1_acs(n, repeat, BOTH(ACS_LANTERN));
+    n = show_1_acs(n, repeat, BOTH(ACS_BULLET));
+    n = show_1_acs(n, repeat, BOTH(ACS_CKBOARD));
+    n = show_1_acs(n, repeat, BOTH(ACS_DEGREE));
+    n = show_1_acs(n, repeat, BOTH(ACS_DIAMOND));
+    n = show_1_acs(n, repeat, BOTH(ACS_PLMINUS));
+    n = show_1_acs(n, repeat, BOTH(ACS_PLUS));
+
+    n = show_1_acs(n, repeat, BOTH(ACS_GEQUAL));
+    n = show_1_acs(n, repeat, BOTH(ACS_NEQUAL));
+    n = show_1_acs(n, repeat, BOTH(ACS_LEQUAL));
+
+    n = show_1_acs(n, repeat, BOTH(ACS_STERLING));
+    n = show_1_acs(n, repeat, BOTH(ACS_PI));
+    n = show_1_acs(n, repeat, BOTH(ACS_S1));
+    n = show_1_acs(n, repeat, BOTH(ACS_S3));
+    n = show_1_acs(n, repeat, BOTH(ACS_S7));
+    (void) show_1_acs(n, repeat, BOTH(ACS_S9));
+#endif
+#undef BOTH
+}
+
+static int
+acs_test(bool recur GCC_UNUSED)
+{
+    int c = 'a';
+    int pagesize = 32;
+    char *term = getenv("TERM");
+    const char *pch_kludge = ((term != 0 && strstr(term, "linux"))
+			      ? "p=PC, "
+			      : "");
+    chtype attr = A_NORMAL;
+    int digit = 0;
+    int repeat = 1;
+    int fg = COLOR_BLACK;
+    int bg = COLOR_BLACK;
+    unsigned at_code = 0;
+    NCURSES_PAIRS_T pair = 0;
+    void (*last_show_acs) (int, attr_t, NCURSES_PAIRS_T) = 0;
+    ATTR_TBL my_list[SIZEOF(attrs_to_test)];
+    unsigned my_size = init_attr_list(my_list, termattrs());
+
+    do {
+	switch (c) {
+	case CTRL('L'):
+	    Repaint();
+	    break;
+	case 'a':
+	    ToggleAcs(last_show_acs, show_acs_chars);
+	    break;
+	case 'p':
+	    if (*pch_kludge)
+		ToggleAcs(last_show_acs, show_pc_chars);
+	    else
+		beep();
+	    break;
+	case 'w':
+	    if (pagesize == 32) {
+		pagesize = 256;
+	    } else {
+		pagesize = 32;
+	    }
+	    break;
+	case 'x':
+	    ToggleAcs(last_show_acs, show_box_chars);
+	    break;
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	    digit = (c - '0');
+	    last_show_acs = 0;
+	    break;
+	case '-':
+	    if (digit > 0) {
+		--digit;
+		last_show_acs = 0;
+	    } else {
+		beep();
+	    }
+	    break;
+	case '+':
+	    if (digit < 3) {
+		++digit;
+		last_show_acs = 0;
+	    } else {
+		beep();
+	    }
+	    break;
+	case '>':
+	    if (repeat < (COLS / 4))
+		++repeat;
+	    break;
+	case '<':
+	    if (repeat > 1)
+		--repeat;
+	    break;
+	default:
+	    if (cycle_attr(c, &at_code, &attr, my_list, my_size)
+		|| cycle_colors(c, &fg, &bg, &pair)) {
+		break;
+	    } else {
+		beep();
+	    }
+	    break;
+	}
+	if (pagesize != 32) {
+	    show_256_chars(repeat, attr, pair);
+	} else if (last_show_acs != 0) {
+	    last_show_acs(repeat, attr, pair);
+	} else {
+	    show_upper_chars(digit * pagesize + 128, pagesize, repeat, attr, pair);
+	}
+
+	MvPrintw(LINES - 3, 0,
+		 "Note: ANSI terminals may not display C1 characters.");
+	MvPrintw(LINES - 2, 0,
+		 "Select: a=ACS, w=all x=box, %s0=C1, 1-3,+/- non-ASCII, </> repeat, ESC=quit",
+		 pch_kludge);
+	if (UseColors) {
+	    MvPrintw(LINES - 1, 0,
+		     "v/V, f/F, b/B cycle through video attributes (%s) and color %d/%d.",
+		     my_list[at_code].name,
+		     fg, bg);
+	} else {
+	    MvPrintw(LINES - 1, 0,
+		     "v/V cycles through video attributes (%s).",
+		     my_list[at_code].name);
+	}
+	refresh();
+    } while (!isQuit(c = Getchar(), TRUE));
+
+    Pause();
+    erase();
+    endwin();
+    return OK;
+}
+
+#if USE_WIDEC_SUPPORT
+static cchar_t *
+merge_wide_attr(cchar_t *dst, const cchar_t *src, attr_t attr, NCURSES_PAIRS_T pair)
+{
+
+    *dst = *src;
+    do {
+	int count;
+	TEST_CCHAR(src, count, {
+	    attr |= (test_attrs & A_ALTCHARSET);
+	    setcchar(dst, test_wch, attr, pair, NULL);
+	}, {
+	    ;
+	});
+    } while (0);
+    return dst;
+}
+
+/*
+ * Header/legend take up no more than 8 lines, leaving 16 lines on a 24-line
+ * display.  If there are no repeats, we could normally display 16 lines of 64
+ * characters (1024 total).  However, taking repeats and double-width cells
+ * into account, use 256 characters for the page.
+ */
+static void
+show_paged_widechars(unsigned base,
+		     unsigned pagesize,
+		     int repeat,
+		     int space,
+		     attr_t attr,
+		     NCURSES_PAIRS_T pair)
+{
+    unsigned first = base * pagesize;
+    unsigned last = first + pagesize - 1;
+    int per_line = 16;
+    cchar_t temp;
+    wchar_t code;
+    wchar_t codes[10];
+
+    erase();
+    attron(A_BOLD);
+    MvPrintw(0, 20, "Display of Character Codes %#x to %#x", first, last);
+    attroff(A_BOLD);
+
+    for (code = (wchar_t) first; code <= (wchar_t) last; code++) {
+	int row = (2 + (int) (code - (wchar_t) first) / per_line);
+	int col = 5 * ((int) code % per_line);
+	int count;
+
+	memset(&codes, 0, sizeof(codes));
+	codes[0] = code;
+	setcchar(&temp, codes, attr, pair, 0);
+	move(row, col);
+	if (wcwidth(code) == 0 && code != 0) {
+	    AddCh((chtype) space |
+		  (A_REVERSE ^ attr) |
+		  (attr_t) COLOR_PAIR(pair));
+	}
+	add_wch(&temp);
+	for (count = 1; count < repeat; ++count) {
+	    add_wch(&temp);
+	}
+    }
+}
+
+static void
+show_upper_widechars(unsigned first, int repeat, int space, attr_t attr, NCURSES_PAIRS_T pair)
+{
+    cchar_t temp;
+    wchar_t code;
+    unsigned last = first + 31;
+
+    erase();
+    attron(A_BOLD);
+    MvPrintw(0, 20, "Display of Character Codes %d to %d", first, last);
+    attroff(A_BOLD);
+
+    for (code = (wchar_t) first; code <= (wchar_t) last; code++) {
+	int row = 2 + ((int) (code - (wchar_t) first) % 16);
+	int col = ((int) (code - (wchar_t) first) / 16) * COLS / 2;
+	wchar_t codes[10];
+	char tmp[80];
+	int count = repeat;
+
+	_nc_SPRINTF(tmp, _nc_SLIMIT(sizeof(tmp))
+		    "%3ld (0x%lx)", (long) code, (long) code);
+	MvPrintw(row, col, "%*s: ", COLS / 4, tmp);
+
+	memset(&codes, 0, sizeof(codes));
+	codes[0] = code;
+	setcchar(&temp, codes, attr, pair, 0);
+
+	do {
+	    int y, x;
+
+	    /*
+	     * Give non-spacing characters something to combine with.  If we
+	     * don't, they'll bunch up in a heap on the space after the ":".
+	     * Mark them with reverse-video to make them simpler to find on
+	     * the display.
+	     */
+	    if (wcwidth(code) == 0) {
+		AddCh((chtype) space |
+		      (A_REVERSE ^ attr) |
+		      (attr_t) COLOR_PAIR(pair));
+	    }
+	    /*
+	     * This uses echo_wchar(), for comparison with the normal 'f'
+	     * test (and to make a test-case for echo_wchar()).  The screen
+	     * may flicker because the erase() at the top of the function
+	     * is met by the builtin refresh() in echo_wchar().
+	     */
+	    echo_wchar(&temp);
+	    /*
+	     * The repeat-count may make text wrap - avoid that.
+	     */
+	    getyx(stdscr, y, x);
+	    (void) y;
+	    if (x >= col + (COLS / 2) - 2)
+		break;
+	} while (--count > 0);
+    }
+}
+
+static int
+show_1_wacs(int n, int repeat, const char *name, const cchar_t *code)
+{
+    const int height = 16;
+    int row = 2 + (n % height);
+    int col = (n / height) * COLS / 2;
+
+    MvPrintw(row, col, "%*s : ", COLS / 4, name);
+    while (--repeat >= 0) {
+	add_wch(code);
+    }
+    return n + 1;
+}
+
+#define MERGE_ATTR(wch) merge_wide_attr(&temp, wch, attr, pair)
+
+static void
+show_wacs_chars(int repeat, attr_t attr, NCURSES_PAIRS_T pair)
+/* display the wide-ACS character set */
+{
+    cchar_t temp;
+
+    int n;
+
+/*#define BOTH2(name) #name, &(name) */
+#define BOTH2(name) #name, MERGE_ATTR(name)
+
+    erase();
+    attron(A_BOLD);
+    MvAddStr(0, 20, "Display of the Wide-ACS Character Set");
+    attroff(A_BOLD);
+    refresh();
+
+    n = show_1_wacs(0, repeat, BOTH2(WACS_ULCORNER));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_URCORNER));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_LLCORNER));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_LRCORNER));
+
+    n = show_1_wacs(n, repeat, BOTH2(WACS_LTEE));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_RTEE));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_TTEE));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_BTEE));
+
+    n = show_1_wacs(n, repeat, BOTH2(WACS_HLINE));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_VLINE));
+
+    n = show_1_wacs(n, repeat, BOTH2(WACS_LARROW));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_RARROW));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_UARROW));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_DARROW));
+
+    n = show_1_wacs(n, repeat, BOTH2(WACS_BLOCK));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_BOARD));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_LANTERN));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_BULLET));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_CKBOARD));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_DEGREE));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_DIAMOND));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_PLMINUS));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_PLUS));
+
+#ifdef CURSES_WACS_ARRAY
+    n = show_1_wacs(n, repeat, BOTH2(WACS_GEQUAL));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_NEQUAL));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_LEQUAL));
+
+    n = show_1_wacs(n, repeat, BOTH2(WACS_STERLING));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_PI));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_S1));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_S3));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_S7));
+    (void) show_1_wacs(n, repeat, BOTH2(WACS_S9));
+#endif
+}
+
+#ifdef WACS_D_PLUS
+static void
+show_wacs_chars_double(int repeat, attr_t attr, NCURSES_PAIRS_T pair)
+/* display the wide-ACS character set */
+{
+    cchar_t temp;
+
+    int n;
+
+/*#define BOTH2(name) #name, &(name) */
+#define BOTH2(name) #name, MERGE_ATTR(name)
+
+    erase();
+    attron(A_BOLD);
+    MvAddStr(0, 20, "Display of the Wide-ACS Character Set");
+    attroff(A_BOLD);
+    refresh();
+
+    n = show_1_wacs(0, repeat, BOTH2(WACS_D_ULCORNER));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_D_URCORNER));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_D_LLCORNER));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_D_LRCORNER));
+
+    n = show_1_wacs(n, repeat, BOTH2(WACS_D_LTEE));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_D_RTEE));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_D_TTEE));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_D_BTEE));
+
+    n = show_1_wacs(n, repeat, BOTH2(WACS_D_HLINE));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_D_VLINE));
+
+    n = show_1_wacs(n, repeat, BOTH2(WACS_LARROW));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_RARROW));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_UARROW));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_DARROW));
+
+    n = show_1_wacs(n, repeat, BOTH2(WACS_BLOCK));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_BOARD));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_LANTERN));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_BULLET));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_CKBOARD));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_DEGREE));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_DIAMOND));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_PLMINUS));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_D_PLUS));
+
+#ifdef CURSES_WACS_ARRAY
+    n = show_1_wacs(n, repeat, BOTH2(WACS_GEQUAL));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_NEQUAL));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_LEQUAL));
+
+    n = show_1_wacs(n, repeat, BOTH2(WACS_STERLING));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_PI));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_S1));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_S3));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_S7));
+    (void) show_1_wacs(n, repeat, BOTH2(WACS_S9));
+#endif
+}
+#endif
+
+#ifdef WACS_T_PLUS
+static void
+show_wacs_chars_thick(int repeat, attr_t attr, NCURSES_PAIRS_T pair)
+/* display the wide-ACS character set */
+{
+    cchar_t temp;
+
+    int n;
+
+/*#define BOTH2(name) #name, &(name) */
+#define BOTH2(name) #name, MERGE_ATTR(name)
+
+    erase();
+    attron(A_BOLD);
+    MvAddStr(0, 20, "Display of the Wide-ACS Character Set");
+    attroff(A_BOLD);
+    refresh();
+
+    n = show_1_wacs(0, repeat, BOTH2(WACS_T_ULCORNER));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_T_URCORNER));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_T_LLCORNER));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_T_LRCORNER));
+
+    n = show_1_wacs(n, repeat, BOTH2(WACS_T_LTEE));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_T_RTEE));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_T_TTEE));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_T_BTEE));
+
+    n = show_1_wacs(n, repeat, BOTH2(WACS_T_HLINE));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_T_VLINE));
+
+    n = show_1_wacs(n, repeat, BOTH2(WACS_LARROW));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_RARROW));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_UARROW));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_DARROW));
+
+    n = show_1_wacs(n, repeat, BOTH2(WACS_BLOCK));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_BOARD));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_LANTERN));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_BULLET));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_CKBOARD));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_DEGREE));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_DIAMOND));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_PLMINUS));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_T_PLUS));
+
+#ifdef CURSES_WACS_ARRAY
+    n = show_1_wacs(n, repeat, BOTH2(WACS_GEQUAL));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_NEQUAL));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_LEQUAL));
+
+    n = show_1_wacs(n, repeat, BOTH2(WACS_STERLING));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_PI));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_S1));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_S3));
+    n = show_1_wacs(n, repeat, BOTH2(WACS_S7));
+    (void) show_1_wacs(n, repeat, BOTH2(WACS_S9));
+#endif
+}
+#endif
+
+#undef MERGE_ATTR
+
+#define MERGE_ATTR(n,wch) merge_wide_attr(&temp[n], wch, attr, pair)
+
+static void
+show_wbox_chars(int repeat, attr_t attr, NCURSES_PAIRS_T pair)
+{
+    cchar_t temp[8];
+
+    (void) repeat;
+    erase();
+    attron(A_BOLD);
+    MvAddStr(0, 20, "Display of the Wide-ACS Line-Drawing Set");
+    attroff(A_BOLD);
+    refresh();
+
+    wborder_set(stdscr,
+		MERGE_ATTR(0, WACS_VLINE),
+		MERGE_ATTR(1, WACS_VLINE),
+		MERGE_ATTR(2, WACS_HLINE),
+		MERGE_ATTR(3, WACS_HLINE),
+		MERGE_ATTR(4, WACS_ULCORNER),
+		MERGE_ATTR(5, WACS_URCORNER),
+		MERGE_ATTR(6, WACS_LLCORNER),
+		MERGE_ATTR(7, WACS_LRCORNER));
+    /* *INDENT-OFF* */
+    (void) mvhline_set(LINES / 2, 0,        MERGE_ATTR(0, WACS_HLINE), COLS);
+    (void) mvvline_set(0,         COLS / 2, MERGE_ATTR(0, WACS_VLINE), LINES);
+    (void) mvadd_wch(0,           COLS / 2, MERGE_ATTR(0, WACS_TTEE));
+    (void) mvadd_wch(LINES / 2,   COLS / 2, MERGE_ATTR(0, WACS_PLUS));
+    (void) mvadd_wch(LINES - 1,   COLS / 2, MERGE_ATTR(0, WACS_BTEE));
+    (void) mvadd_wch(LINES / 2,   0,        MERGE_ATTR(0, WACS_LTEE));
+    (void) mvadd_wch(LINES / 2,   COLS - 1, MERGE_ATTR(0, WACS_RTEE));
+    /* *INDENT-ON* */
+}
+
+#undef MERGE_ATTR
+
+static int
+show_2_wacs(int n, const char *name, const char *code, attr_t attr, NCURSES_PAIRS_T pair)
+{
+    const int height = 16;
+    int row = 2 + (n % height);
+    int col = (n / height) * COLS / 2;
+    char temp[80];
+
+    MvPrintw(row, col, "%*s : ", COLS / 4, name);
+    (void) attr_set(attr, pair, 0);
+    _nc_STRNCPY(temp, code, 20);
+    addstr(temp);
+    (void) attr_set(A_NORMAL, 0, 0);
+    return n + 1;
+}
+
+#define SHOW_UTF8(n, name, code) show_2_wacs(n, name, code, attr, pair)
+
+static void
+show_utf8_chars(int repeat, attr_t attr, NCURSES_PAIRS_T pair)
+{
+    int n;
+
+    (void) repeat;
+    erase();
+    attron(A_BOLD);
+    MvAddStr(0, 20, "Display of the Wide-ACS Character Set");
+    attroff(A_BOLD);
+    refresh();
+    /* *INDENT-OFF* */
+    n = SHOW_UTF8(0, "WACS_ULCORNER",	"\342\224\214");
+    n = SHOW_UTF8(n, "WACS_URCORNER",	"\342\224\220");
+    n = SHOW_UTF8(n, "WACS_LLCORNER",	"\342\224\224");
+    n = SHOW_UTF8(n, "WACS_LRCORNER",	"\342\224\230");
+
+    n = SHOW_UTF8(n, "WACS_LTEE",	"\342\224\234");
+    n = SHOW_UTF8(n, "WACS_RTEE",	"\342\224\244");
+    n = SHOW_UTF8(n, "WACS_TTEE",	"\342\224\254");
+    n = SHOW_UTF8(n, "WACS_BTEE",	"\342\224\264");
+
+    n = SHOW_UTF8(n, "WACS_HLINE",	"\342\224\200");
+    n = SHOW_UTF8(n, "WACS_VLINE",	"\342\224\202");
+
+    n = SHOW_UTF8(n, "WACS_LARROW",	"\342\206\220");
+    n = SHOW_UTF8(n, "WACS_RARROW",	"\342\206\222");
+    n = SHOW_UTF8(n, "WACS_UARROW",	"\342\206\221");
+    n = SHOW_UTF8(n, "WACS_DARROW",	"\342\206\223");
+
+    n = SHOW_UTF8(n, "WACS_BLOCK",	"\342\226\256");
+    n = SHOW_UTF8(n, "WACS_BOARD",	"\342\226\222");
+    n = SHOW_UTF8(n, "WACS_LANTERN",	"\342\230\203");
+    n = SHOW_UTF8(n, "WACS_BULLET",	"\302\267");
+    n = SHOW_UTF8(n, "WACS_CKBOARD",	"\342\226\222");
+    n = SHOW_UTF8(n, "WACS_DEGREE",	"\302\260");
+    n = SHOW_UTF8(n, "WACS_DIAMOND",	"\342\227\206");
+    n = SHOW_UTF8(n, "WACS_PLMINUS",	"\302\261");
+    n = SHOW_UTF8(n, "WACS_PLUS",	"\342\224\274");
+    n = SHOW_UTF8(n, "WACS_GEQUAL",	"\342\211\245");
+    n = SHOW_UTF8(n, "WACS_NEQUAL",	"\342\211\240");
+    n = SHOW_UTF8(n, "WACS_LEQUAL",	"\342\211\244");
+
+    n = SHOW_UTF8(n, "WACS_STERLING",	"\302\243");
+    n = SHOW_UTF8(n, "WACS_PI",		"\317\200");
+    n = SHOW_UTF8(n, "WACS_S1",		"\342\216\272");
+    n = SHOW_UTF8(n, "WACS_S3",		"\342\216\273");
+    n = SHOW_UTF8(n, "WACS_S7",		"\342\216\274");
+    (void) SHOW_UTF8(n, "WACS_S9",	"\342\216\275");
+    /* *INDENT-ON* */
+}
+
+/* display the wide-ACS character set */
+static int
+x_acs_test(bool recur GCC_UNUSED)
+{
+    int c = 'a';
+    unsigned digit = 0;
+    int repeat = 1;
+    int space = ' ';
+    unsigned pagesize = 32;
+    attr_t attr = WA_NORMAL;
+    int fg = COLOR_BLACK;
+    int bg = COLOR_BLACK;
+    unsigned at_code = 0;
+    NCURSES_PAIRS_T pair = 0;
+    void (*last_show_wacs) (int, attr_t, NCURSES_PAIRS_T) = 0;
+    W_ATTR_TBL my_list[SIZEOF(w_attrs_to_test)];
+    unsigned my_size = init_w_attr_list(my_list, term_attrs());
+    char at_page[20];
+    bool pending_code = FALSE;
+
+    at_page[0] = '\0';
+    do {
+	switch (c) {
+	case CTRL('L'):
+	    Repaint();
+	    break;
+	case 'a':
+	    ToggleAcs(last_show_wacs, show_wacs_chars);
+	    break;
+#ifdef WACS_D_PLUS
+	case 'd':
+	    ToggleAcs(last_show_wacs, show_wacs_chars_double);
+	    break;
+#endif
+#ifdef WACS_T_PLUS
+	case 't':
+	    ToggleAcs(last_show_wacs, show_wacs_chars_thick);
+	    break;
+#endif
+	case 'w':
+	    if (pagesize == 32) {
+		pagesize = 256;
+	    } else {
+		pagesize = 32;
+	    }
+	    break;
+	case 'x':
+	    ToggleAcs(last_show_wacs, show_wbox_chars);
+	    break;
+	case 'u':
+	    ToggleAcs(last_show_wacs, show_utf8_chars);
+	    break;
+	case '@':
+	    pending_code = !pending_code;
+	    if (pending_code) {
+		_nc_SPRINTF(at_page, _nc_SLIMIT(sizeof(at_page)) "%02x", digit);
+	    } else if (at_page[0] != '\0') {
+		sscanf(at_page, "%x", &digit);
+	    }
+	    break;
+	default:
+	    if (pending_code && isxdigit(c)) {
+		size_t len = strlen(at_page);
+		if (len && at_page[0] == '0') {
+		    memmove(at_page, at_page + 1, len--);
+		}
+		if (len < sizeof(at_page) - 1) {
+		    at_page[len++] = (char) c;
+		    at_page[len] = '\0';
+		}
+	    } else if (pending_code
+		       && (c == '\b' || c == KEY_BACKSPACE || c == KEY_DC)) {
+		size_t len = strlen(at_page);
+		if (len)
+		    at_page[--len] = '\0';
+	    } else if (c < 256 && isdigit(c)) {
+		digit = (unsigned) (c - '0');
+		last_show_wacs = 0;
+	    } else if (c == '+') {
+		++digit;
+		_nc_SPRINTF(at_page, _nc_SLIMIT(sizeof(at_page)) "%02x", digit);
+		last_show_wacs = 0;
+	    } else if (c == '-' && digit > 0) {
+		--digit;
+		_nc_SPRINTF(at_page, _nc_SLIMIT(sizeof(at_page)) "%02x",
+			    UChar(digit));
+		last_show_wacs = 0;
+	    } else if (c == '>' && repeat < (COLS / 4)) {
+		++repeat;
+	    } else if (c == '<' && repeat > 1) {
+		--repeat;
+	    } else if (c == '_') {
+		space = (space == ' ') ? '_' : ' ';
+		last_show_wacs = 0;
+	    } else if (cycle_w_attr(c, &at_code, &attr, my_list, my_size)
+		       || cycle_colors(c, &fg, &bg, &pair)) {
+		if (last_show_wacs != 0)
+		    break;
+	    } else {
+		beep();
+		break;
+	    }
+	    break;
+	}
+	if (pagesize != 32) {
+	    show_paged_widechars(digit, pagesize, repeat, space, attr, pair);
+	} else if (last_show_wacs != 0) {
+	    last_show_wacs(repeat, attr, pair);
+	} else {
+	    show_upper_widechars(digit * 32 + 128, repeat, space, attr, pair);
+	}
+
+	MvPrintw(LINES - 4, 0,
+		 "Select: a/d/t WACS, w=%d/page, @",
+		 pagesize);
+	printw("%s",
+	       pending_code ? at_page : "page");
+	addstr(", x=box, u UTF-8, ^L repaint");
+	MvPrintw(LINES - 3, 2,
+		 "0-9,+/- non-ASCII, </> repeat, _ space, ESC=quit");
+	if (UseColors) {
+	    MvPrintw(LINES - 2, 2,
+		     "v/V, f/F, b/B cycle through video attributes (%s) and color %d/%d.",
+		     my_list[at_code].name,
+		     fg, bg);
+	} else {
+	    MvPrintw(LINES - 2, 2,
+		     "v/V cycles through video attributes (%s).",
+		     my_list[at_code].name);
+	}
+	refresh();
+    } while (!isQuit(c = Getchar(), TRUE));
+
+    Pause();
+    erase();
+    endwin();
+    return OK;
+}
+
+#endif
+
+/*
+ * Graphic-rendition test (adapted from vttest)
+ */
+static int
+sgr_attr_test(bool recur GCC_UNUSED)
+{
+    int pass;
+
+    for (pass = 0; pass < 2; pass++) {
+	chtype normal = ((pass == 0 ? A_NORMAL : A_REVERSE)) | BLANK;
+
+	/* Use non-default colors if possible to exercise bce a little */
+	if (UseColors) {
+	    init_pair(1, COLOR_WHITE, COLOR_BLUE);
+	    normal |= (chtype) COLOR_PAIR(1);
+	}
+	bkgdset(normal);
+	erase();
+	MvPrintw(1, 20, "Graphic rendition test pattern:");
+
+	MvPrintw(4, 1, "vanilla");
+
+#define set_sgr(mask) bkgdset((normal^(mask)));
+	set_sgr(A_BOLD);
+	MvPrintw(4, 40, "bold");
+
+	set_sgr(A_UNDERLINE);
+	MvPrintw(6, 6, "underline");
+
+	set_sgr(A_BOLD | A_UNDERLINE);
+	MvPrintw(6, 45, "bold underline");
+
+	set_sgr(A_BLINK);
+	MvPrintw(8, 1, "blink");
+
+	set_sgr(A_BLINK | A_BOLD);
+	MvPrintw(8, 40, "bold blink");
+
+	set_sgr(A_UNDERLINE | A_BLINK);
+	MvPrintw(10, 6, "underline blink");
+
+	set_sgr(A_BOLD | A_UNDERLINE | A_BLINK);
+	MvPrintw(10, 45, "bold underline blink");
+
+	set_sgr(A_REVERSE);
+	MvPrintw(12, 1, "negative");
+
+	set_sgr(A_BOLD | A_REVERSE);
+	MvPrintw(12, 40, "bold negative");
+
+	set_sgr(A_UNDERLINE | A_REVERSE);
+	MvPrintw(14, 6, "underline negative");
+
+	set_sgr(A_BOLD | A_UNDERLINE | A_REVERSE);
+	MvPrintw(14, 45, "bold underline negative");
+
+	set_sgr(A_BLINK | A_REVERSE);
+	MvPrintw(16, 1, "blink negative");
+
+	set_sgr(A_BOLD | A_BLINK | A_REVERSE);
+	MvPrintw(16, 40, "bold blink negative");
+
+	set_sgr(A_UNDERLINE | A_BLINK | A_REVERSE);
+	MvPrintw(18, 6, "underline blink negative");
+
+	set_sgr(A_BOLD | A_UNDERLINE | A_BLINK | A_REVERSE);
+	MvPrintw(18, 45, "bold underline blink negative");
+
+	bkgdset(normal);
+	MvPrintw(LINES - 2, 1, "%s background. ", pass == 0 ? "Dark" :
+		 "Light");
+	clrtoeol();
+	Pause();
+    }
+
+    bkgdset(A_NORMAL | BLANK);
+    erase();
+    endwin();
+    return OK;
+}
+
+/****************************************************************************
+ *
+ * Windows and scrolling tester.
+ *
+ ****************************************************************************/
+
+#define BOTLINES	4	/* number of line stolen from screen bottom */
+
+typedef struct {
+    int y, x;
+} pair;
+
+#define FRAME struct frame
+FRAME
+{
+    FRAME *next, *last;
+    bool do_scroll;
+    bool do_keypad;
+    WINDOW *wind;
+};
+
+#if defined(NCURSES_VERSION) && NCURSES_EXT_FUNCS
+#if (NCURSES_VERSION_PATCH < 20070331)
+#define is_keypad(win)   (win)->_use_keypad
+#define is_scrollok(win) (win)->_scroll
+#endif
+#else
+#define is_keypad(win)   FALSE
+#define is_scrollok(win) FALSE
+#endif
+
+static WINDOW *
+frame_win(FRAME * curp)
+{
+    return (curp != 0) ? curp->wind : stdscr;
+}
+
+/* We need to know if these flags are actually set, so don't look in FRAME.
+ * These names are known to work with SVr4 curses as well as ncurses.  The
+ * _use_keypad name does not work with Solaris 8.
+ */
+static bool
+HaveKeypad(FRAME * curp)
+{
+    WINDOW *win = frame_win(curp);
+    (void) win;
+    return is_keypad(win);
+}
+
+static bool
+HaveScroll(FRAME * curp)
+{
+    WINDOW *win = frame_win(curp);
+    (void) win;
+    return is_scrollok(win);
+}
+
+static void
+newwin_legend(FRAME * curp)
+{
+#define DATA(num, name) { name, num }
+    static const struct {
+	const char *msg;
+	int code;
+    } legend[] = {
+	DATA(0, "^C = create window"),
+	    DATA(0, "^N = next window"),
+	    DATA(0, "^P = previous window"),
+	    DATA(0, "^F = scroll forward"),
+	    DATA(0, "^B = scroll backward"),
+	    DATA(1, "^K = keypad(%s)"),
+	    DATA(2, "^S = scrollok(%s)"),
+	    DATA(0, "^W = save window"),
+	    DATA(0, "^R = restore window"),
+#if HAVE_WRESIZE
+	    DATA(0, "^X = resize"),
+#endif
+	    DATA(3, "^Q%s = exit")
+    };
+#undef DATA
+    size_t n;
+    bool do_keypad = HaveKeypad(curp);
+    bool do_scroll = HaveScroll(curp);
+    char buf[BUFSIZ];
+
+    move(LINES - 4, 0);
+
+    for (n = 0; n < SIZEOF(legend); n++) {
+	int x;
+
+	switch (legend[n].code) {
+	default:
+	    _nc_STRCPY(buf, legend[n].msg, sizeof(buf));
+	    break;
+	case 1:
+	    _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf))
+			legend[n].msg, do_keypad ? "yes" : "no");
+	    break;
+	case 2:
+	    _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf))
+			legend[n].msg, do_scroll ? "yes" : "no");
+	    break;
+	case 3:
+	    _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf))
+			legend[n].msg, do_keypad ? "/ESC" : "");
+	    break;
+	}
+	x = getcurx(stdscr);
+	addstr((COLS < (x + 3 + (int) strlen(buf))) ? "\n" : (n ? ", " : ""));
+	addstr(buf);
+    }
+    clrtoeol();
+}
+
+static void
+transient(FRAME * curp, NCURSES_CONST char *msg)
+{
+    newwin_legend(curp);
+    if (msg) {
+	MvAddStr(LINES - 1, 0, msg);
+	refresh();
+	napms(1000);
+    }
+
+    move(LINES - 1, 0);
+    printw("%s characters are echoed, window should %sscroll.",
+	   HaveKeypad(curp) ? "Non-arrow" : "All other",
+	   HaveScroll(curp) ? "" : "not ");
+    clrtoeol();
+}
+
+static void
+newwin_report(FRAME * curp)
+/* report on the cursor's current position, then restore it */
+{
+    WINDOW *win = frame_win(curp);
+    int y, x;
+
+    if (win != stdscr)
+	transient(curp, (char *) 0);
+    getyx(win, y, x);
+    move(LINES - 1, COLS - 17);
+    printw("Y = %2d X = %2d", y, x);
+    if (win != stdscr)
+	refresh();
+    else
+	wmove(win, y, x);
+}
+
+static pair *
+selectcell(int uli, int ulj, int lri, int lrj)
+/* arrows keys move cursor, return location at current on non-arrow key */
+{
+    static pair res;		/* result cell */
+    int si = lri - uli + 1;	/* depth of the select area */
+    int sj = lrj - ulj + 1;	/* width of the select area */
+    int i = 0, j = 0;		/* offsets into the select area */
+
+    res.y = uli;
+    res.x = ulj;
+    for (;;) {
+	move(uli + i, ulj + j);
+	newwin_report((FRAME *) 0);
+
+	switch (Getchar()) {
+	case KEY_UP:
+	    i += si - 1;
+	    break;
+	case KEY_DOWN:
+	    i++;
+	    break;
+	case KEY_LEFT:
+	    j += sj - 1;
+	    break;
+	case KEY_RIGHT:
+	    j++;
+	    break;
+	case case_QUIT:
+	    return ((pair *) 0);
+#ifdef NCURSES_MOUSE_VERSION
+	case KEY_MOUSE:
+	    {
+		MEVENT event;
+
+		getmouse(&event);
+		if (event.y > uli && event.x > ulj) {
+		    i = event.y - uli;
+		    j = event.x - ulj;
+		} else {
+		    beep();
+		    break;
+		}
+	    }
+#endif
+	    /* FALLTHRU */
+	default:
+	    res.y = uli + i;
+	    res.x = ulj + j;
+	    return (&res);
+	}
+	i %= si;
+	j %= sj;
+    }
+}
+
+static void
+outerbox(pair ul, pair lr, bool onoff)
+/* draw or erase a box *outside* the given pair of corners */
+{
+    MvAddCh(ul.y - 1, lr.x - 1, onoff ? ACS_ULCORNER : ' ');
+    MvAddCh(ul.y - 1, lr.x + 1, onoff ? ACS_URCORNER : ' ');
+    MvAddCh(lr.y + 1, lr.x + 1, onoff ? ACS_LRCORNER : ' ');
+    MvAddCh(lr.y + 1, ul.x - 1, onoff ? ACS_LLCORNER : ' ');
+    move(ul.y - 1, ul.x);
+    hline(onoff ? ACS_HLINE : ' ', lr.x - ul.x + 1);
+    move(ul.y, ul.x - 1);
+    vline(onoff ? ACS_VLINE : ' ', lr.y - ul.y + 1);
+    move(lr.y + 1, ul.x);
+    hline(onoff ? ACS_HLINE : ' ', lr.x - ul.x + 1);
+    move(ul.y, lr.x + 1);
+    vline(onoff ? ACS_VLINE : ' ', lr.y - ul.y + 1);
+}
+
+static WINDOW *
+getwindow(void)
+/* Ask user for a window definition */
+{
+    WINDOW *rwindow;
+    pair ul, lr, *tmp;
+
+    move(0, 0);
+    clrtoeol();
+    addstr("Use arrows to move cursor, anything else to mark corner 1");
+    refresh();
+    if ((tmp = selectcell(2, 1, LINES - BOTLINES - 2, COLS - 2)) == (pair *) 0)
+	return ((WINDOW *) 0);
+    memcpy(&ul, tmp, sizeof(pair));
+    MvAddCh(ul.y - 1, ul.x - 1, ACS_ULCORNER);
+    move(0, 0);
+    clrtoeol();
+    addstr("Use arrows to move cursor, anything else to mark corner 2");
+    refresh();
+    if ((tmp = selectcell(ul.y, ul.x, LINES - BOTLINES - 2, COLS - 2)) ==
+	(pair *) 0)
+	return ((WINDOW *) 0);
+    memcpy(&lr, tmp, sizeof(pair));
+
+    rwindow = subwin(stdscr, lr.y - ul.y + 1, lr.x - ul.x + 1, ul.y, ul.x);
+
+    outerbox(ul, lr, TRUE);
+    refresh();
+
+    if (rwindow != 0)
+	wrefresh(rwindow);
+
+    move(0, 0);
+    clrtoeol();
+    return (rwindow);
+}
+
+static void
+newwin_move(FRAME * curp, int dy, int dx)
+{
+    WINDOW *win = frame_win(curp);
+    int cur_y, cur_x;
+    int max_y, max_x;
+
+    getyx(win, cur_y, cur_x);
+    getmaxyx(win, max_y, max_x);
+    if ((cur_x += dx) < 0)
+	cur_x = 0;
+    else if (cur_x >= max_x)
+	cur_x = max_x - 1;
+    if ((cur_y += dy) < 0)
+	cur_y = 0;
+    else if (cur_y >= max_y)
+	cur_y = max_y - 1;
+    wmove(win, cur_y, cur_x);
+}
+
+static FRAME *
+delete_framed(FRAME * fp, bool showit)
+{
+    FRAME *np = 0;
+
+    if (fp != 0) {
+	fp->last->next = fp->next;
+	fp->next->last = fp->last;
+
+	if (showit) {
+	    werase(fp->wind);
+	    wrefresh(fp->wind);
+	}
+	delwin(fp->wind);
+
+	np = (fp == fp->next) ? NULL : fp->next;
+	free(fp);
+    }
+    return np;
+}
+
+static int
+scroll_test(bool recur GCC_UNUSED)
+/* Demonstrate windows */
+{
+    int c;
+    FRAME *current = (FRAME *) 0, *neww;
+    WINDOW *usescr;
+#if HAVE_PUTWIN && HAVE_GETWIN
+    FILE *fp;
+#endif
+
+#define DUMPFILE	"screendump"
+
+#ifdef NCURSES_MOUSE_VERSION
+    mousemask(BUTTON1_CLICKED, (mmask_t *) 0);
+#endif
+    c = CTRL('C');
+    raw();
+    do {
+	transient((FRAME *) 0, (char *) 0);
+	switch (c) {
+	case CTRL('C'):
+	    if ((neww = typeCalloc(FRAME, (size_t) 1)) == 0) {
+		failed("scroll_test");
+		goto breakout;
+	    }
+	    if ((neww->wind = getwindow()) == (WINDOW *) 0) {
+		failed("scroll_test");
+		free(neww);
+		goto breakout;
+	    }
+
+	    if (current == 0) {	/* First element,  */
+		neww->next = neww;	/*   so point it at itself */
+		neww->last = neww;
+	    } else {
+		neww->next = current->next;
+		neww->last = current;
+		neww->last->next = neww;
+		neww->next->last = neww;
+	    }
+	    current = neww;
+	    /* SVr4 curses sets the keypad on all newly-created windows to
+	     * false.  Someone reported that PDCurses makes new windows inherit
+	     * this flag.  Remove the following 'keypad()' call to test this
+	     */
+	    keypad(current->wind, TRUE);
+	    current->do_keypad = HaveKeypad(current);
+	    current->do_scroll = HaveScroll(current);
+	    break;
+
+	case CTRL('N'):	/* go to next window */
+	    if (current)
+		current = current->next;
+	    break;
+
+	case CTRL('P'):	/* go to previous window */
+	    if (current)
+		current = current->last;
+	    break;
+
+	case CTRL('F'):	/* scroll current window forward */
+	    if (current)
+		wscrl(frame_win(current), 1);
+	    break;
+
+	case CTRL('B'):	/* scroll current window backwards */
+	    if (current)
+		wscrl(frame_win(current), -1);
+	    break;
+
+	case CTRL('K'):	/* toggle keypad mode for current */
+	    if (current) {
+		current->do_keypad = !current->do_keypad;
+		keypad(current->wind, current->do_keypad);
+	    }
+	    break;
+
+	case CTRL('S'):
+	    if (current) {
+		current->do_scroll = !current->do_scroll;
+		scrollok(current->wind, current->do_scroll);
+	    }
+	    break;
+
+#if HAVE_PUTWIN && HAVE_GETWIN
+	case CTRL('W'):	/* save and delete window */
+	    if ((current != 0) && (current == current->next)) {
+		transient(current, "Will not save/delete ONLY window");
+		break;
+	    } else if ((fp = fopen(DUMPFILE, "w")) == (FILE *) 0) {
+		transient(current, "Can't open screen dump file");
+	    } else {
+		int rc = putwin(frame_win(current), fp);
+		(void) fclose(fp);
+
+		if (rc == OK) {
+		    current = delete_framed(current, TRUE);
+		} else {
+		    transient(current, "Can't write screen dump file");
+		}
+	    }
+	    break;
+
+	case CTRL('R'):	/* restore window */
+	    if ((fp = fopen(DUMPFILE, "r")) == (FILE *) 0) {
+		transient(current, "Can't open screen dump file");
+	    } else {
+		if ((neww = typeCalloc(FRAME, (size_t) 1)) != 0) {
+
+		    neww->next = current ? current->next : 0;
+		    neww->last = current;
+		    if (neww->last != 0)
+			neww->last->next = neww;
+		    if (neww->next != 0)
+			neww->next->last = neww;
+
+		    neww->wind = getwin(fp);
+
+		    wrefresh(neww->wind);
+		} else {
+		    failed("scroll_test");
+		}
+		(void) fclose(fp);
+	    }
+	    break;
+#endif
+
+#if HAVE_WRESIZE
+	case CTRL('X'):	/* resize window */
+	    if (current) {
+		pair *tmp, ul, lr;
+		int mx, my;
+
+		move(0, 0);
+		clrtoeol();
+		addstr("Use arrows to move cursor, anything else to mark new corner");
+		refresh();
+
+		getbegyx(current->wind, ul.y, ul.x);
+
+		tmp = selectcell(ul.y, ul.x, LINES - BOTLINES - 2, COLS - 2);
+		if (tmp == (pair *) 0) {
+		    beep();
+		    break;
+		}
+
+		getmaxyx(current->wind, lr.y, lr.x);
+		lr.y += (ul.y - 1);
+		lr.x += (ul.x - 1);
+		outerbox(ul, lr, FALSE);
+		wnoutrefresh(stdscr);
+
+		/* strictly cosmetic hack for the test */
+		getmaxyx(current->wind, my, mx);
+		if (my > tmp->y - ul.y) {
+		    getyx(current->wind, lr.y, lr.x);
+		    wmove(current->wind, tmp->y - ul.y + 1, 0);
+		    wclrtobot(current->wind);
+		    wmove(current->wind, lr.y, lr.x);
+		}
+		if (mx > tmp->x - ul.x) {
+		    int i;
+		    for (i = 0; i < my; i++) {
+			wmove(current->wind, i, tmp->x - ul.x + 1);
+			wclrtoeol(current->wind);
+		    }
+		}
+		wnoutrefresh(current->wind);
+
+		memcpy(&lr, tmp, sizeof(pair));
+		(void) wresize(current->wind, lr.y - ul.y + 0, lr.x - ul.x + 0);
+
+		getbegyx(current->wind, ul.y, ul.x);
+		getmaxyx(current->wind, lr.y, lr.x);
+		lr.y += (ul.y - 1);
+		lr.x += (ul.x - 1);
+		outerbox(ul, lr, TRUE);
+		wnoutrefresh(stdscr);
+
+		wnoutrefresh(current->wind);
+		move(0, 0);
+		clrtoeol();
+		doupdate();
+	    }
+	    break;
+#endif /* HAVE_WRESIZE */
+
+	case KEY_UP:
+	    newwin_move(current, -1, 0);
+	    break;
+	case KEY_DOWN:
+	    newwin_move(current, 1, 0);
+	    break;
+	case KEY_LEFT:
+	    newwin_move(current, 0, -1);
+	    break;
+	case KEY_RIGHT:
+	    newwin_move(current, 0, 1);
+	    break;
+
+	case KEY_BACKSPACE:
+	    /* FALLTHROUGH */
+	case KEY_DC:
+	    {
+		int y, x;
+		getyx(frame_win(current), y, x);
+		if (--x < 0) {
+		    if (--y < 0)
+			break;
+		    x = getmaxx(frame_win(current)) - 1;
+		}
+		(void) mvwdelch(frame_win(current), y, x);
+	    }
+	    break;
+
+	case '\r':
+	    c = '\n';
+	    /* FALLTHROUGH */
+
+	default:
+	    if (current)
+		waddch(current->wind, (chtype) c);
+	    else
+		beep();
+	    break;
+	}
+	newwin_report(current);
+	usescr = frame_win(current);
+	wrefresh(usescr);
+    } while
+	(!isQuit(c = wGetchar(usescr), TRUE)
+	 && (c != ERR));
+
+  breakout:
+    while (current != 0)
+	current = delete_framed(current, FALSE);
+
+    scrollok(stdscr, TRUE);	/* reset to driver's default */
+#ifdef NCURSES_MOUSE_VERSION
+    mousemask(0, (mmask_t *) 0);
+#endif
+    noraw();
+    erase();
+    endwin();
+    return OK;
+}
+
+/****************************************************************************
+ *
+ * Panels tester
+ *
+ ****************************************************************************/
+
+#if USE_LIBPANEL
+static int nap_msec = 1;
+
+static NCURSES_CONST char *mod[] =
+{
+    "test ",
+    "TEST ",
+    "(**) ",
+    "*()* ",
+    "<--> ",
+    "LAST "
+};
+
+/*+-------------------------------------------------------------------------
+	wait_a_while(msec)
+--------------------------------------------------------------------------*/
+static void
+wait_a_while(int msec GCC_UNUSED)
+{
+#if HAVE_NAPMS
+    if (nap_msec == 1)
+	wGetchar(stdscr);
+    else
+	napms(nap_msec);
+#else
+    if (nap_msec == 1)
+	wGetchar(stdscr);
+    else if (msec > 1000)
+	sleep((unsigned) msec / 1000);
+    else
+	sleep(1);
+#endif
+}				/* end of wait_a_while */
+
+/*+-------------------------------------------------------------------------
+	saywhat(text)
+--------------------------------------------------------------------------*/
+static void
+saywhat(NCURSES_CONST char *text)
+{
+    wmove(stdscr, LINES - 1, 0);
+    wclrtoeol(stdscr);
+    if (text != 0 && *text != '\0') {
+	waddstr(stdscr, text);
+	waddstr(stdscr, "; ");
+    }
+    waddstr(stdscr, "press any key to continue");
+}				/* end of saywhat */
+
+/*+-------------------------------------------------------------------------
+	mkpanel(rows,cols,tly,tlx) - alloc a win and panel and associate them
+--------------------------------------------------------------------------*/
+static PANEL *
+mkpanel(NCURSES_COLOR_T color, int rows, int cols, int tly, int tlx)
+{
+    WINDOW *win;
+    PANEL *pan = 0;
+
+    if ((win = newwin(rows, cols, tly, tlx)) != 0) {
+	if ((pan = new_panel(win)) == 0) {
+	    delwin(win);
+	} else if (UseColors) {
+	    NCURSES_COLOR_T fg = (NCURSES_COLOR_T) ((color == COLOR_BLUE)
+						    ? COLOR_WHITE
+						    : COLOR_BLACK);
+	    NCURSES_COLOR_T bg = color;
+
+	    init_pair(color, fg, bg);
+	    wbkgdset(win, (attr_t) (COLOR_PAIR(color) | ' '));
+	} else {
+	    wbkgdset(win, A_BOLD | ' ');
+	}
+    }
+    return pan;
+}				/* end of mkpanel */
+
+/*+-------------------------------------------------------------------------
+	rmpanel(pan)
+--------------------------------------------------------------------------*/
+static void
+rmpanel(PANEL *pan)
+{
+    WINDOW *win = panel_window(pan);
+    del_panel(pan);
+    delwin(win);
+}				/* end of rmpanel */
+
+/*+-------------------------------------------------------------------------
+	pflush()
+--------------------------------------------------------------------------*/
+static void
+pflush(void)
+{
+    update_panels();
+    doupdate();
+}				/* end of pflush */
+
+/*+-------------------------------------------------------------------------
+	fill_panel(win)
+--------------------------------------------------------------------------*/
+static void
+init_panel(WINDOW *win)
+{
+    register int y, x;
+
+    for (y = 0; y < LINES - 1; y++) {
+	for (x = 0; x < COLS; x++)
+	    wprintw(win, "%d", (y + x) % 10);
+    }
+}
+
+static void
+fill_panel(PANEL *pan)
+{
+    WINDOW *win = panel_window(pan);
+    const char *userptr = (const char *) panel_userptr(pan);
+    int num = (userptr && *userptr) ? userptr[1] : '?';
+    int y, x;
+
+    wmove(win, 1, 1);
+    wprintw(win, "-pan%c-", num);
+    wclrtoeol(win);
+    box(win, 0, 0);
+    for (y = 2; y < getmaxy(win) - 1; y++) {
+	for (x = 1; x < getmaxx(win) - 1; x++) {
+	    wmove(win, y, x);
+	    waddch(win, UChar(num));
+	}
+    }
+}
+
+#if USE_WIDEC_SUPPORT
+static void
+init_wide_panel(WINDOW *win)
+{
+    int digit;
+    cchar_t temp[10];
+
+    for (digit = 0; digit < 10; ++digit)
+	make_fullwidth_digit(&temp[digit], digit);
+
+    do {
+	int y, x;
+	getyx(stdscr, y, x);
+	digit = (y + x / 2) % 10;
+    } while (wadd_wch(win, &temp[digit]) != ERR);
+}
+
+static void
+fill_wide_panel(PANEL *pan)
+{
+    WINDOW *win = panel_window(pan);
+    const char *userptr = (const char *) panel_userptr(pan);
+    int num = (userptr && *userptr) ? userptr[1] : '?';
+    int y, x;
+
+    wmove(win, 1, 1);
+    wprintw(win, "-pan%c-", num);
+    wclrtoeol(win);
+    box(win, 0, 0);
+    for (y = 2; y < getmaxy(win) - 1; y++) {
+	for (x = 1; x < getmaxx(win) - 1; x++) {
+	    wmove(win, y, x);
+	    waddch(win, UChar(num));
+	}
+    }
+}
+#endif
+
+#define MAX_PANELS 5
+
+static void
+canned_panel(PANEL *px[MAX_PANELS + 1], NCURSES_CONST char *cmd)
+{
+    int which = cmd[1] - '0';
+
+    saywhat(cmd);
+    switch (*cmd) {
+    case 'h':
+	hide_panel(px[which]);
+	break;
+    case 's':
+	show_panel(px[which]);
+	break;
+    case 't':
+	top_panel(px[which]);
+	break;
+    case 'b':
+	bottom_panel(px[which]);
+	break;
+    case 'd':
+	rmpanel(px[which]);
+	break;
+    }
+    pflush();
+    wait_a_while(nap_msec);
+}
+
+static int
+demo_panels(void (*InitPanel) (WINDOW *), void (*FillPanel) (PANEL *))
+{
+    int count;
+    int itmp;
+    PANEL *px[MAX_PANELS + 1];
+
+    scrollok(stdscr, FALSE);	/* we don't want stdscr to scroll! */
+    refresh();
+
+    InitPanel(stdscr);
+    for (count = 0; count < 5; count++) {
+	px[1] = mkpanel(COLOR_RED,
+			LINES / 2 - 2,
+			COLS / 8 + 1,
+			0,
+			0);
+	set_panel_userptr(px[1], (NCURSES_CONST void *) "p1");
+
+	px[2] = mkpanel(COLOR_GREEN,
+			LINES / 2 + 1,
+			COLS / 7,
+			LINES / 4,
+			COLS / 10);
+	set_panel_userptr(px[2], (NCURSES_CONST void *) "p2");
+
+	px[3] = mkpanel(COLOR_YELLOW,
+			LINES / 4,
+			COLS / 10,
+			LINES / 2,
+			COLS / 9);
+	set_panel_userptr(px[3], (NCURSES_CONST void *) "p3");
+
+	px[4] = mkpanel(COLOR_BLUE,
+			LINES / 2 - 2,
+			COLS / 8,
+			LINES / 2 - 2,
+			COLS / 3);
+	set_panel_userptr(px[4], (NCURSES_CONST void *) "p4");
+
+	px[5] = mkpanel(COLOR_MAGENTA,
+			LINES / 2 - 2,
+			COLS / 8,
+			LINES / 2,
+			COLS / 2 - 2);
+	set_panel_userptr(px[5], (NCURSES_CONST void *) "p5");
+
+	FillPanel(px[1]);
+	FillPanel(px[2]);
+	FillPanel(px[3]);
+	FillPanel(px[4]);
+	FillPanel(px[5]);
+
+	hide_panel(px[4]);
+	hide_panel(px[5]);
+	pflush();
+	saywhat("");
+	wait_a_while(nap_msec);
+
+	saywhat("h3 s1 s2 s4 s5");
+	move_panel(px[1], 0, 0);
+	hide_panel(px[3]);
+	show_panel(px[1]);
+	show_panel(px[2]);
+	show_panel(px[4]);
+	show_panel(px[5]);
+	pflush();
+	wait_a_while(nap_msec);
+
+	canned_panel(px, "s1");
+	canned_panel(px, "s2");
+
+	saywhat("m2");
+	move_panel(px[2], LINES / 3 + 1, COLS / 8);
+	pflush();
+	wait_a_while(nap_msec);
+
+	canned_panel(px, "s3");
+
+	saywhat("m3");
+	move_panel(px[3], LINES / 4 + 1, COLS / 15);
+	pflush();
+	wait_a_while(nap_msec);
+
+	canned_panel(px, "b3");
+	canned_panel(px, "s4");
+	canned_panel(px, "s5");
+	canned_panel(px, "t3");
+	canned_panel(px, "t1");
+	canned_panel(px, "t2");
+	canned_panel(px, "t3");
+	canned_panel(px, "t4");
+
+	for (itmp = 0; itmp < 6; itmp++) {
+	    WINDOW *w4 = panel_window(px[4]);
+	    WINDOW *w5 = panel_window(px[5]);
+
+	    saywhat("m4");
+	    wmove(w4, LINES / 8, 1);
+	    waddstr(w4, mod[itmp]);
+	    move_panel(px[4], LINES / 6, itmp * (COLS / 8));
+	    wmove(w5, LINES / 6, 1);
+	    waddstr(w5, mod[itmp]);
+	    pflush();
+	    wait_a_while(nap_msec);
+
+	    saywhat("m5");
+	    wmove(w4, LINES / 6, 1);
+	    waddstr(w4, mod[itmp]);
+	    move_panel(px[5], LINES / 3 - 1, (itmp * 10) + 6);
+	    wmove(w5, LINES / 8, 1);
+	    waddstr(w5, mod[itmp]);
+	    pflush();
+	    wait_a_while(nap_msec);
+	}
+
+	saywhat("m4");
+	move_panel(px[4], LINES / 6, itmp * (COLS / 8));
+	pflush();
+	wait_a_while(nap_msec);
+
+	canned_panel(px, "t5");
+	canned_panel(px, "t2");
+	canned_panel(px, "t1");
+	canned_panel(px, "d2");
+	canned_panel(px, "h3");
+	canned_panel(px, "d1");
+	canned_panel(px, "d4");
+	canned_panel(px, "d5");
+	canned_panel(px, "d3");
+
+	wait_a_while(nap_msec);
+	if (nap_msec == 1)
+	    break;
+	nap_msec = 100L;
+    }
+
+    erase();
+    endwin();
+    return OK;
+}
+
+#if USE_LIBPANEL
+static int
+panel_test(bool recur GCC_UNUSED)
+{
+    return demo_panels(init_panel, fill_panel);
+}
+#endif
+
+#if USE_WIDEC_SUPPORT && USE_LIBPANEL
+static int
+x_panel_test(bool recur GCC_UNUSED)
+{
+    return demo_panels(init_wide_panel, fill_wide_panel);
+}
+#endif
+#endif /* USE_LIBPANEL */
+
+/****************************************************************************
+ *
+ * Pad tester
+ *
+ ****************************************************************************/
+
+#if HAVE_NEWPAD
+
+/* The behavior of mvhline, mvvline for negative/zero length is unspecified,
+ * though we can rely on negative x/y values to stop the macro.
+ */
+static void
+do_h_line(int y, int x, chtype c, int to)
+{
+    if ((to) > (x))
+	MvHLine(y, x, c, (to) - (x));
+}
+
+static void
+do_v_line(int y, int x, chtype c, int to)
+{
+    if ((to) > (y))
+	MvVLine(y, x, c, (to) - (y));
+}
+
+#define GRIDSIZE	3
+
+static bool pending_pan = FALSE;
+static bool show_panner_legend = TRUE;
+
+static int
+panner_legend(int line)
+{
+    static const char *const legend[] =
+    {
+	"Use arrow keys (or U,D,L,R) to pan, ESC to quit, ! to shell-out.",
+	"Use +,- (or j,k) to grow/shrink the panner vertically.",
+	"Use <,> (or h,l) to grow/shrink the panner horizontally.",
+	"Number repeats.  Toggle legend:? filler:a timer:t scrollmark:s."
+    };
+    int n = ((int) SIZEOF(legend) - (LINES - line));
+    if (n >= 0 && n < (int) SIZEOF(legend)) {
+	if (move(line, 0) != ERR) {
+	    if (show_panner_legend)
+		printw("%s", legend[n]);
+	    clrtoeol();
+	    return show_panner_legend;
+	}
+    }
+    return FALSE;
+}
+
+static void
+panner_h_cleanup(int from_y, int from_x, int to_x)
+{
+    if (!panner_legend(from_y))
+	do_h_line(from_y, from_x, ' ', to_x);
+}
+
+static void
+panner_v_cleanup(int from_y, int from_x, int to_y)
+{
+    if (!panner_legend(from_y))
+	do_v_line(from_y, from_x, ' ', to_y);
+}
+
+static void
+fill_pad(WINDOW *panpad, bool pan_lines, bool colored)
+{
+    int y, x;
+    unsigned gridcount = 0;
+    chtype fill = 0;
+#ifdef A_COLOR
+    if (colored)
+	fill = (chtype) COLOR_PAIR(1);
+#endif
+
+    wmove(panpad, 0, 0);
+    for (y = 0; y < getmaxy(panpad); y++) {
+	for (x = 0; x < getmaxx(panpad); x++) {
+	    if (y % GRIDSIZE == 0 && x % GRIDSIZE == 0) {
+		if (y == 0 && x == 0)
+		    waddch(panpad, pan_lines ? ACS_ULCORNER : '+');
+		else if (y == 0)
+		    waddch(panpad, pan_lines ? ACS_TTEE : '+');
+		else if (y == 0 || x == 0)
+		    waddch(panpad, pan_lines ? ACS_LTEE : '+');
+		else
+		    waddch(panpad, (chtype) ((pan_lines ? 'a' : 'A') +
+					     (int) (gridcount++ % 26)) | fill);
+	    } else if (y % GRIDSIZE == 0)
+		waddch(panpad, pan_lines ? ACS_HLINE : '-');
+	    else if (x % GRIDSIZE == 0)
+		waddch(panpad, pan_lines ? ACS_VLINE : '|');
+	    else
+		waddch(panpad, ' ');
+	}
+    }
+}
+
+static void
+panner(WINDOW *pad,
+       int top_x, int top_y, int porty, int portx,
+       int (*pgetc) (WINDOW *),
+       bool colored)
+{
+#if HAVE_GETTIMEOFDAY
+    struct timeval before, after;
+    bool timing = TRUE;
+#endif
+    bool pan_lines = FALSE;
+    bool scrollers = TRUE;
+    int basex = 0;
+    int basey = 0;
+    int pxmax, pymax, lowend, highend, c;
+
+    getmaxyx(pad, pymax, pxmax);
+    scrollok(stdscr, FALSE);	/* we don't want stdscr to scroll! */
+
+    c = KEY_REFRESH;
+    do {
+#ifdef NCURSES_VERSION
+	/*
+	 * During shell-out, the user may have resized the window.  Adjust
+	 * the port size of the pad to accommodate this.  Ncurses automatically
+	 * resizes all of the normal windows to fit on the new screen.
+	 */
+	if (top_x > COLS)
+	    top_x = COLS;
+	if (portx > COLS)
+	    portx = COLS;
+	if (top_y > LINES)
+	    top_y = LINES;
+	if (porty > LINES)
+	    porty = LINES;
+#endif
+	switch (c) {
+	case KEY_REFRESH:
+	    erase();
+
+	    /* FALLTHRU */
+	case HELP_KEY_1:
+	    if (c == HELP_KEY_1)
+		show_panner_legend = !show_panner_legend;
+	    panner_legend(LINES - 4);
+	    panner_legend(LINES - 3);
+	    panner_legend(LINES - 2);
+	    panner_legend(LINES - 1);
+	    break;
+	case 'a':
+	    pan_lines = !pan_lines;
+	    fill_pad(pad, pan_lines, colored);
+	    pending_pan = FALSE;
+	    break;
+
+#if HAVE_GETTIMEOFDAY
+	case 't':
+	    timing = !timing;
+	    if (!timing)
+		panner_legend(LINES - 1);
+	    break;
+#endif
+	case 's':
+	    scrollers = !scrollers;
+	    break;
+
+	    /* Move the top-left corner of the pad, keeping the bottom-right
+	     * corner fixed.
+	     */
+	case 'h':		/* increase-columns: move left edge to left */
+	    if (top_x <= 0)
+		beep();
+	    else {
+		panner_v_cleanup(top_y, top_x, porty);
+		top_x--;
+	    }
+	    break;
+
+	case 'j':		/* decrease-lines: move top-edge down */
+	    if (top_y >= porty)
+		beep();
+	    else {
+		panner_h_cleanup(top_y - 1, top_x - (top_x > 0), portx);
+		top_y++;
+	    }
+	    break;
+
+	case 'k':		/* increase-lines: move top-edge up */
+	    if (top_y <= 0)
+		beep();
+	    else {
+		top_y--;
+		panner_h_cleanup(top_y, top_x, portx);
+	    }
+	    break;
+
+	case 'l':		/* decrease-columns: move left-edge to right */
+	    if (top_x >= portx)
+		beep();
+	    else {
+		panner_v_cleanup(top_y - (top_y > 0), top_x - 1, porty);
+		top_x++;
+	    }
+	    break;
+
+	    /* Move the bottom-right corner of the pad, keeping the top-left
+	     * corner fixed.
+	     */
+	case KEY_IC:		/* increase-columns: move right-edge to right */
+	    if (portx >= pxmax || portx >= COLS)
+		beep();
+	    else {
+		panner_v_cleanup(top_y - (top_y > 0), portx - 1, porty);
+		++portx;
+	    }
+	    break;
+
+	case KEY_IL:		/* increase-lines: move bottom-edge down */
+	    if (porty >= pymax || porty >= LINES)
+		beep();
+	    else {
+		panner_h_cleanup(porty - 1, top_x - (top_x > 0), portx);
+		++porty;
+	    }
+	    break;
+
+	case KEY_DC:		/* decrease-columns: move bottom edge up */
+	    if (portx <= top_x)
+		beep();
+	    else {
+		portx--;
+		panner_v_cleanup(top_y - (top_y > 0), portx, porty);
+	    }
+	    break;
+
+	case KEY_DL:		/* decrease-lines */
+	    if (porty <= top_y)
+		beep();
+	    else {
+		porty--;
+		panner_h_cleanup(porty, top_x - (top_x > 0), portx);
+	    }
+	    break;
+
+	case KEY_LEFT:		/* pan leftwards */
+	    if (basex > 0)
+		basex--;
+	    else
+		beep();
+	    break;
+
+	case KEY_RIGHT:	/* pan rightwards */
+	    if (basex + portx - (pymax > porty) < pxmax)
+		basex++;
+	    else
+		beep();
+	    break;
+
+	case KEY_UP:		/* pan upwards */
+	    if (basey > 0)
+		basey--;
+	    else
+		beep();
+	    break;
+
+	case KEY_DOWN:		/* pan downwards */
+	    if (basey + porty - (pxmax > portx) < pymax)
+		basey++;
+	    else
+		beep();
+	    break;
+
+	case 'H':
+	case KEY_HOME:
+	case KEY_FIND:
+	    basey = 0;
+	    break;
+
+	case 'E':
+	case KEY_END:
+	case KEY_SELECT:
+	    basey = pymax - porty;
+	    if (basey < 0)
+		basey = 0;
+	    break;
+
+	default:
+	    beep();
+	    break;
+	}
+
+	MvAddCh(top_y - 1, top_x - 1, ACS_ULCORNER);
+	do_v_line(top_y, top_x - 1, ACS_VLINE, porty);
+	do_h_line(top_y - 1, top_x, ACS_HLINE, portx);
+
+	if (scrollers && (pxmax > portx - 1)) {
+	    int length = (portx - top_x - 1);
+	    float ratio = ((float) length) / ((float) pxmax);
+
+	    lowend = (int) ((float) top_x + ((float) basex * ratio));
+	    highend = (int) ((float) top_x + ((float) (basex + length) * ratio));
+
+	    do_h_line(porty - 1, top_x, ACS_HLINE, lowend);
+	    if (highend < portx) {
+		attron(A_REVERSE);
+		do_h_line(porty - 1, lowend, ' ', highend + 1);
+		attroff(A_REVERSE);
+		do_h_line(porty - 1, highend + 1, ACS_HLINE, portx);
+	    }
+	} else
+	    do_h_line(porty - 1, top_x, ACS_HLINE, portx);
+
+	if (scrollers && (pymax > porty - 1)) {
+	    int length = (porty - top_y - 1);
+	    float ratio = ((float) length) / ((float) pymax);
+
+	    lowend = (int) ((float) top_y + ((float) basey * ratio));
+	    highend = (int) ((float) top_y + ((float) (basey + length) * ratio));
+
+	    do_v_line(top_y, portx - 1, ACS_VLINE, lowend);
+	    if (highend < porty) {
+		attron(A_REVERSE);
+		do_v_line(lowend, portx - 1, ' ', highend + 1);
+		attroff(A_REVERSE);
+		do_v_line(highend + 1, portx - 1, ACS_VLINE, porty);
+	    }
+	} else
+	    do_v_line(top_y, portx - 1, ACS_VLINE, porty);
+
+	MvAddCh(top_y - 1, portx - 1, ACS_URCORNER);
+	MvAddCh(porty - 1, top_x - 1, ACS_LLCORNER);
+	MvAddCh(porty - 1, portx - 1, ACS_LRCORNER);
+
+	if (!pending_pan) {
+#if HAVE_GETTIMEOFDAY
+	    gettimeofday(&before, 0);
+#endif
+	    wnoutrefresh(stdscr);
+
+	    pnoutrefresh(pad,
+			 basey, basex,
+			 top_y, top_x,
+			 porty - (pxmax > portx) - 1,
+			 portx - (pymax > porty) - 1);
+
+	    doupdate();
+#if HAVE_GETTIMEOFDAY
+#define TIMEVAL2S(data) ((double) data.tv_sec + ((double) data.tv_usec / 1.0e6))
+	    if (timing) {
+		double elapsed;
+		gettimeofday(&after, 0);
+		elapsed = (TIMEVAL2S(after) - TIMEVAL2S(before));
+		move(LINES - 1, COLS - 12);
+		printw("Secs: %2.03f", elapsed);
+		refresh();
+	    }
+#endif
+	}
+
+    } while
+	((c = pgetc(pad)) != KEY_EXIT);
+
+    scrollok(stdscr, TRUE);	/* reset to driver's default */
+}
+
+static int
+padgetch(WINDOW *win)
+{
+    static int count;
+    static int last;
+
+    if ((pending_pan = (count > 0)) != FALSE) {
+	count--;
+	pending_pan = (count != 0);
+    } else {
+	for (;;) {
+	    int c;
+	    switch (c = wGetchar(win)) {
+	    case '!':
+		ShellOut(FALSE);
+		/* FALLTHRU */
+	    case CTRL('r'):
+		endwin();
+		refresh();
+		c = KEY_REFRESH;
+		break;
+	    case CTRL('l'):
+		c = KEY_REFRESH;
+		break;
+	    case 'U':
+		c = KEY_UP;
+		break;
+	    case 'D':
+		c = KEY_DOWN;
+		break;
+	    case 'R':
+		c = KEY_RIGHT;
+		break;
+	    case 'L':
+		c = KEY_LEFT;
+		break;
+	    case '+':
+		c = KEY_IL;
+		break;
+	    case '-':
+		c = KEY_DL;
+		break;
+	    case '>':
+		c = KEY_IC;
+		break;
+	    case '<':
+		c = KEY_DC;
+		break;
+	    case ERR:		/* FALLTHRU */
+	    case case_QUIT:
+		count = 0;
+		c = KEY_EXIT;
+		break;
+	    default:
+		if (c >= '0' && c <= '9') {
+		    count = count * 10 + (c - '0');
+		    continue;
+		}
+		break;
+	    }
+	    last = c;
+	    break;
+	}
+	if (count > 0)
+	    count--;
+    }
+    return (last);
+}
+
+#define PAD_HIGH 200
+#define PAD_WIDE 200
+
+static int
+pad_test(bool recur GCC_UNUSED)
+/* Demonstrate pads. */
+{
+    WINDOW *panpad = newpad(PAD_HIGH, PAD_WIDE);
+
+    if (panpad == 0) {
+	Cannot("cannot create requested pad");
+	return ERR;
+    }
+#ifdef A_COLOR
+    if (UseColors) {
+	init_pair(1, COLOR_BLACK, COLOR_GREEN);
+	init_pair(2, COLOR_CYAN, COLOR_BLUE);
+	wbkgd(panpad, (chtype) (COLOR_PAIR(2) | ' '));
+    }
+#endif
+    fill_pad(panpad, FALSE, TRUE);
+
+    panner_legend(LINES - 4);
+    panner_legend(LINES - 3);
+    panner_legend(LINES - 2);
+    panner_legend(LINES - 1);
+
+    keypad(panpad, TRUE);
+
+    /* Make the pad (initially) narrow enough that a trace file won't wrap.
+     * We'll still be able to widen it during a test, since that's required
+     * for testing boundaries.
+     */
+    panner(panpad, 2, 2, LINES - 5, COLS - 15, padgetch, TRUE);
+
+    delwin(panpad);
+    endwin();
+    erase();
+    return OK;
+}
+#endif /* HAVE_NEWPAD */
+
+/****************************************************************************
+ *
+ * Tests from John Burnell's PDCurses tester
+ *
+ ****************************************************************************/
+
+static void
+Continue(WINDOW *win)
+{
+    noecho();
+    wmove(win, 10, 1);
+    MvWAddStr(win, 10, 1, " Press any key to continue");
+    wrefresh(win);
+    wGetchar(win);
+}
+
+static int
+flushinp_test(bool recur GCC_UNUSED)
+/* Input test, adapted from John Burnell's PDCurses tester */
+{
+    WINDOW *win = stdscr;
+    int w, h, bx, by, sw, sh, i;
+
+    WINDOW *subWin;
+    wclear(win);
+
+    getmaxyx(win, h, w);
+    getbegyx(win, by, bx);
+    sw = w / 3;
+    sh = h / 3;
+    if ((subWin = subwin(win, sh, sw, by + h - sh - 2, bx + w - sw - 2)) == 0)
+	return ERR;
+
+#ifdef A_COLOR
+    if (UseColors) {
+	init_pair(2, COLOR_CYAN, COLOR_BLUE);
+	wbkgd(subWin, (chtype) (COLOR_PAIR(2) | ' '));
+    }
+#endif
+    (void) wattrset(subWin, A_BOLD);
+    box(subWin, ACS_VLINE, ACS_HLINE);
+    MvWAddStr(subWin, 2, 1, "This is a subwindow");
+    wrefresh(win);
+
+    /*
+     * This used to set 'nocbreak()'.  However, Alexander Lukyanov says that
+     * it only happened to "work" on SVr4 because that implementation does not
+     * emulate nocbreak+noecho mode, whereas ncurses does.  To get the desired
+     * test behavior, we're using 'cbreak()', which will allow a single
+     * character to return without needing a newline. - T.Dickey 1997/10/11.
+     */
+    cbreak();
+    MvWAddStr(win, 0, 1, "This is a test of the flushinp() call.");
+
+    MvWAddStr(win, 2, 1, "Type random keys for 5 seconds.");
+    MvWAddStr(win, 3, 1,
+	      "These should be discarded (not echoed) after the subwindow goes away.");
+    wrefresh(win);
+
+    for (i = 0; i < 5; i++) {
+	MvWPrintw(subWin, 1, 1, "Time = %d", i);
+	wrefresh(subWin);
+	napms(1000);
+	flushinp();
+    }
+
+    delwin(subWin);
+    werase(win);
+    flash();
+    wrefresh(win);
+    napms(1000);
+
+    MvWAddStr(win, 2, 1,
+	      "If you were still typing when the window timer expired,");
+    MvWAddStr(win, 3, 1,
+	      "or else you typed nothing at all while it was running,");
+    MvWAddStr(win, 4, 1,
+	      "test was invalid.  You'll see garbage or nothing at all. ");
+    MvWAddStr(win, 6, 1, "Press a key");
+    wmove(win, 9, 10);
+    wrefresh(win);
+    echo();
+    wGetchar(win);
+    flushinp();
+    MvWAddStr(win, 12, 0,
+	      "If you see any key other than what you typed, flushinp() is broken.");
+    Continue(win);
+
+    wmove(win, 9, 10);
+    wdelch(win);
+    wrefresh(win);
+    wmove(win, 12, 0);
+    clrtoeol();
+    waddstr(win,
+	    "What you typed should now have been deleted; if not, wdelch() failed.");
+    Continue(win);
+
+    cbreak();
+    return OK;
+}
+
+/****************************************************************************
+ *
+ * Menu test
+ *
+ ****************************************************************************/
+
+#if USE_LIBMENU
+
+#define MENU_Y	8
+#define MENU_X	8
+
+static int
+menu_virtualize(int c)
+{
+    if (c == '\n' || c == KEY_EXIT)
+	return (MAX_COMMAND + 1);
+    else if (c == 'u')
+	return (REQ_SCR_ULINE);
+    else if (c == 'd')
+	return (REQ_SCR_DLINE);
+    else if (c == 'b' || c == KEY_NPAGE)
+	return (REQ_SCR_UPAGE);
+    else if (c == 'f' || c == KEY_PPAGE)
+	return (REQ_SCR_DPAGE);
+    else if (c == 'n' || c == KEY_DOWN)
+	return (REQ_NEXT_ITEM);
+    else if (c == 'p' || c == KEY_UP)
+	return (REQ_PREV_ITEM);
+    else if (c == ' ')
+	return (REQ_TOGGLE_ITEM);
+    else {
+	if (c != KEY_MOUSE)
+	    beep();
+	return (c);
+    }
+}
+
+static CONST_MENUS char *animals[] =
+{
+    "Lions",
+    "Tigers",
+    "Bears",
+    "(Oh my!)",
+    "Newts",
+    "Platypi",
+    "Lemurs",
+    "(Oh really?!)",
+    "Leopards",
+    "Panthers",
+    "Pumas",
+    "Lions, Tigers, Bears, (Oh my!), Newts, Platypi, Lemurs",
+    "Lions, Tigers, Bears, (Oh my!), Newts, Platypi, Lemurs, Lions, Tigers, Bears, (Oh my!), Newts, Platypi, Lemurs",
+    (char *) 0
+};
+
+static int
+menu_test(bool recur GCC_UNUSED)
+{
+    MENU *m;
+    ITEM *items[SIZEOF(animals)];
+    ITEM **ip = items;
+    CONST_MENUS char **ap;
+    int mrows, mcols, c;
+    WINDOW *menuwin;
+
+#ifdef NCURSES_MOUSE_VERSION
+    mousemask(ALL_MOUSE_EVENTS, (mmask_t *) 0);
+#endif
+    MvAddStr(0, 0, "This is the menu test:");
+    MvAddStr(2, 0, "  Use up and down arrow to move the select bar.");
+    MvAddStr(3, 0, "  'n' and 'p' act like arrows.");
+    MvAddStr(4, 0,
+	     "  'b' and 'f' scroll up/down (page), 'u' and 'd' (line).");
+    MvAddStr(5, 0, "  Press return to exit.");
+    refresh();
+
+    for (ap = animals; *ap; ap++) {
+	if ((*ip = new_item(*ap, "")) != 0)
+	    ++ip;
+    }
+    *ip = (ITEM *) 0;
+
+    m = new_menu(items);
+
+    set_menu_format(m, (SIZEOF(animals) + 1) / 2, 1);
+    scale_menu(m, &mrows, &mcols);
+
+    menuwin = newwin(mrows + 2, mcols + 2, MENU_Y, MENU_X);
+    set_menu_win(m, menuwin);
+    keypad(menuwin, TRUE);
+    box(menuwin, 0, 0);
+
+    set_menu_sub(m, derwin(menuwin, mrows, mcols, 1, 1));
+
+    post_menu(m);
+
+    while ((c = menu_driver(m, menu_virtualize(wGetchar(menuwin)))) != E_UNKNOWN_COMMAND) {
+	if (c == E_NOT_POSTED)
+	    break;
+	if (c == E_REQUEST_DENIED)
+	    beep();
+	continue;
+    }
+
+    MvPrintw(LINES - 2, 0,
+	     "You chose: %s\n", item_name(current_item(m)));
+    (void) addstr("Press any key to continue...");
+    wGetchar(stdscr);
+
+    unpost_menu(m);
+    delwin(menuwin);
+
+    free_menu(m);
+    for (ip = items; *ip; ip++)
+	free_item(*ip);
+#ifdef NCURSES_MOUSE_VERSION
+    mousemask(0, (mmask_t *) 0);
+#endif
+    return OK;
+}
+
+#ifdef TRACE
+#define T_TBL(name) { #name, name }
+static struct {
+    const char *name;
+    unsigned mask;
+} t_tbl[] = {
+
+    T_TBL(TRACE_DISABLE),
+	T_TBL(TRACE_TIMES),
+	T_TBL(TRACE_TPUTS),
+	T_TBL(TRACE_UPDATE),
+	T_TBL(TRACE_MOVE),
+	T_TBL(TRACE_CHARPUT),
+	T_TBL(TRACE_ORDINARY),
+	T_TBL(TRACE_CALLS),
+	T_TBL(TRACE_VIRTPUT),
+	T_TBL(TRACE_IEVENT),
+	T_TBL(TRACE_BITS),
+	T_TBL(TRACE_ICALLS),
+	T_TBL(TRACE_CCALLS),
+	T_TBL(TRACE_DATABASE),
+	T_TBL(TRACE_ATTRS),
+	T_TBL(TRACE_MAXIMUM),
+    {
+	(char *) 0, 0
+    }
+};
+
+static char *
+tracetrace(unsigned tlevel)
+{
+    static char *buf;
+    static size_t need = 12;
+    int n;
+
+    if (buf == 0) {
+	for (n = 0; t_tbl[n].name != 0; n++)
+	    need += strlen(t_tbl[n].name) + 2;
+	buf = typeMalloc(char, need);
+	if (!buf)
+	    failed("tracetrace");
+    }
+    _nc_SPRINTF(buf, _nc_SLIMIT(need) "0x%02x = {", tlevel);
+    if (tlevel == 0) {
+	_nc_STRCAT(buf, t_tbl[0].name ? t_tbl[0].name : "", need);
+	_nc_STRCAT(buf, ", ", need);
+    } else {
+	for (n = 1; t_tbl[n].name != 0; n++)
+	    if ((tlevel & t_tbl[n].mask) == t_tbl[n].mask) {
+		_nc_STRCAT(buf, t_tbl[n].name, need);
+		_nc_STRCAT(buf, ", ", need);
+	    }
+    }
+    if (buf[strlen(buf) - 2] == ',')
+	buf[strlen(buf) - 2] = '\0';
+    _nc_STRCAT(buf, "}", need);
+    return buf;
+}
+
+/* fake a dynamically reconfigurable menu using the 0th entry to deselect
+ * the others
+ */
+static int
+run_trace_menu(MENU * m)
+{
+    ITEM **items;
+    ITEM *i, **p;
+
+    for (;;) {
+	bool changed = FALSE;
+	switch (menu_driver(m, menu_virtualize(wGetchar(menu_win(m))))) {
+	case E_UNKNOWN_COMMAND:
+	    return FALSE;
+	default:
+	    items = menu_items(m);
+	    i = current_item(m);
+	    if (i == items[0]) {
+		if (item_value(i)) {
+		    for (p = items + 1; *p != 0; p++)
+			if (item_value(*p)) {
+			    set_item_value(*p, FALSE);
+			    changed = TRUE;
+			}
+		}
+	    } else {
+		for (p = items + 1; *p != 0; p++)
+		    if (item_value(*p)) {
+			set_item_value(items[0], FALSE);
+			changed = TRUE;
+			break;
+		    }
+	    }
+	    if (!changed)
+		return TRUE;
+	}
+    }
+}
+
+static int
+trace_set(bool recur GCC_UNUSED)
+/* interactively set the trace level */
+{
+    MENU *m;
+    ITEM *items[SIZEOF(t_tbl)];
+    ITEM **ip = items;
+    int mrows, mcols;
+    unsigned newtrace;
+    int n;
+    WINDOW *menuwin;
+
+    MvAddStr(0, 0, "Interactively set trace level:");
+    MvAddStr(2, 0, "  Press space bar to toggle a selection.");
+    MvAddStr(3, 0, "  Use up and down arrow to move the select bar.");
+    MvAddStr(4, 0, "  Press return to set the trace level.");
+    MvPrintw(6, 0, "(Current trace level is %s)", tracetrace(_nc_tracing));
+
+    refresh();
+
+    for (n = 0; t_tbl[n].name != 0; n++) {
+	if ((*ip = new_item(t_tbl[n].name, "")) != 0) {
+	    ++ip;
+	}
+    }
+    *ip = (ITEM *) 0;
+
+    m = new_menu(items);
+
+    set_menu_format(m, 0, 2);
+    scale_menu(m, &mrows, &mcols);
+
+    menu_opts_off(m, O_ONEVALUE);
+    menuwin = newwin(mrows + 2, mcols + 2, MENU_Y, MENU_X);
+    set_menu_win(m, menuwin);
+    keypad(menuwin, TRUE);
+    box(menuwin, 0, 0);
+
+    set_menu_sub(m, derwin(menuwin, mrows, mcols, 1, 1));
+
+    post_menu(m);
+
+    for (ip = menu_items(m); *ip; ip++) {
+	unsigned mask = t_tbl[item_index(*ip)].mask;
+	if (mask == 0)
+	    set_item_value(*ip, _nc_tracing == 0);
+	else if ((mask & _nc_tracing) == mask)
+	    set_item_value(*ip, TRUE);
+    }
+
+    while (run_trace_menu(m))
+	continue;
+
+    newtrace = 0;
+    for (ip = menu_items(m); *ip; ip++)
+	if (item_value(*ip))
+	    newtrace |= t_tbl[item_index(*ip)].mask;
+    curses_trace(newtrace);
+    Trace(("trace level interactively set to %s", tracetrace(_nc_tracing)));
+
+    MvPrintw(LINES - 2, 0,
+	     "Trace level is %s\n", tracetrace(_nc_tracing));
+    (void) addstr("Press any key to continue...");
+    wGetchar(stdscr);
+
+    unpost_menu(m);
+    delwin(menuwin);
+
+    free_menu(m);
+    for (ip = items; *ip; ip++)
+	free_item(*ip);
+
+    return OK;
+}
+#endif /* TRACE */
+#endif /* USE_LIBMENU */
+
+/****************************************************************************
+ *
+ * Forms test
+ *
+ ****************************************************************************/
+#if USE_LIBFORM
+static FIELD *
+make_label(int frow, int fcol, NCURSES_CONST char *label)
+{
+    FIELD *f = new_field(1, (int) strlen(label), frow, fcol, 0, 0);
+
+    if (f) {
+	set_field_buffer(f, 0, label);
+	set_field_opts(f, (int) ((unsigned) field_opts(f) & ~O_ACTIVE));
+    }
+    return (f);
+}
+
+static FIELD *
+make_field(int frow, int fcol, int rows, int cols, bool secure)
+{
+    FIELD *f = new_field(rows, cols, frow, fcol, 0, secure ? 1 : 0);
+
+    if (f) {
+	set_field_back(f, A_UNDERLINE);
+	set_field_userptr(f, (void *) 0);
+    }
+    return (f);
+}
+
+static void
+display_form(FORM *f)
+{
+    WINDOW *w;
+    int rows, cols;
+
+    scale_form(f, &rows, &cols);
+
+    if ((w = newwin(rows + 2, cols + 4, 0, 0)) != (WINDOW *) 0) {
+	set_form_win(f, w);
+	set_form_sub(f, derwin(w, rows, cols, 1, 2));
+	box(w, 0, 0);
+	keypad(w, TRUE);
+	if (post_form(f) != E_OK)
+	    wrefresh(w);
+    }
+}
+
+static void
+erase_form(FORM *f)
+{
+    WINDOW *w = form_win(f);
+    WINDOW *s = form_sub(f);
+
+    unpost_form(f);
+    werase(w);
+    wrefresh(w);
+    delwin(s);
+    delwin(w);
+}
+
+static int
+edit_secure(FIELD *me, int c)
+{
+    int rows, cols, frow, fcol, nrow, nbuf;
+
+    if (field_info(me, &rows, &cols, &frow, &fcol, &nrow, &nbuf) == E_OK
+	&& nbuf > 0) {
+	char *source = field_buffer(me, 1);
+	size_t have = (source ? strlen(source) : 0) + 1;
+	size_t need = 80 + have;
+	char *temp = malloc(need);
+
+	if (temp != 0) {
+	    size_t len;
+	    _nc_STRNCPY(temp, source ? source : "", have + 1);
+	    len = (size_t) (char *) field_userptr(me);
+	    if (c <= KEY_MAX) {
+		if (isgraph(c) && (len + 1) < sizeof(temp)) {
+		    temp[len++] = (char) c;
+		    temp[len] = 0;
+		    set_field_buffer(me, 1, temp);
+		    c = '*';
+		} else {
+		    c = 0;
+		}
+	    } else {
+		switch (c) {
+		case REQ_BEG_FIELD:
+		case REQ_CLR_EOF:
+		case REQ_CLR_EOL:
+		case REQ_DEL_LINE:
+		case REQ_DEL_WORD:
+		case REQ_DOWN_CHAR:
+		case REQ_END_FIELD:
+		case REQ_INS_CHAR:
+		case REQ_INS_LINE:
+		case REQ_LEFT_CHAR:
+		case REQ_NEW_LINE:
+		case REQ_NEXT_WORD:
+		case REQ_PREV_WORD:
+		case REQ_RIGHT_CHAR:
+		case REQ_UP_CHAR:
+		    c = 0;	/* we don't want to do inline editing */
+		    break;
+		case REQ_CLR_FIELD:
+		    if (len) {
+			temp[0] = 0;
+			set_field_buffer(me, 1, temp);
+		    }
+		    break;
+		case REQ_DEL_CHAR:
+		case REQ_DEL_PREV:
+		    if (len) {
+			temp[--len] = 0;
+			set_field_buffer(me, 1, temp);
+		    }
+		    break;
+		}
+	    }
+	    set_field_userptr(me, (void *) len);
+	    free(temp);
+	}
+    }
+    return c;
+}
+
+static int
+form_virtualize(FORM *f, WINDOW *w)
+{
+    /* *INDENT-OFF* */
+    static const struct {
+	int code;
+	int result;
+    } lookup[] = {
+	{ CTRL('A'),	REQ_NEXT_CHOICE },
+	{ CTRL('B'),	REQ_PREV_WORD },
+	{ CTRL('C'),	REQ_CLR_EOL },
+	{ CTRL('D'),	REQ_DOWN_FIELD },
+	{ CTRL('E'),	REQ_END_FIELD },
+	{ CTRL('F'),	REQ_NEXT_PAGE },
+	{ CTRL('G'),	REQ_DEL_WORD },
+	{ CTRL('H'),	REQ_DEL_PREV },
+	{ CTRL('I'),	REQ_INS_CHAR },
+	{ CTRL('K'),	REQ_CLR_EOF },
+	{ CTRL('L'),	REQ_LEFT_FIELD },
+	{ CTRL('M'),	REQ_NEW_LINE },
+	{ CTRL('N'),	REQ_NEXT_FIELD },
+	{ CTRL('O'),	REQ_INS_LINE },
+	{ CTRL('P'),	REQ_PREV_FIELD },
+	{ CTRL('R'),	REQ_RIGHT_FIELD },
+	{ CTRL('S'),	REQ_BEG_FIELD },
+	{ CTRL('U'),	REQ_UP_FIELD },
+	{ CTRL('V'),	REQ_DEL_CHAR },
+	{ CTRL('W'),	REQ_NEXT_WORD },
+	{ CTRL('X'),	REQ_CLR_FIELD },
+	{ CTRL('Y'),	REQ_DEL_LINE },
+	{ CTRL('Z'),	REQ_PREV_CHOICE },
+	{ ESCAPE,	MAX_FORM_COMMAND + 1 },
+	{ KEY_BACKSPACE, REQ_DEL_PREV },
+	{ KEY_DOWN,	REQ_DOWN_CHAR },
+	{ KEY_END,	REQ_LAST_FIELD },
+	{ KEY_HOME,	REQ_FIRST_FIELD },
+	{ KEY_LEFT,	REQ_LEFT_CHAR },
+	{ KEY_LL,	REQ_LAST_FIELD },
+	{ KEY_NEXT,	REQ_NEXT_FIELD },
+	{ KEY_NPAGE,	REQ_NEXT_PAGE },
+	{ KEY_PPAGE,	REQ_PREV_PAGE },
+	{ KEY_PREVIOUS, REQ_PREV_FIELD },
+	{ KEY_RIGHT,	REQ_RIGHT_CHAR },
+	{ KEY_UP,	REQ_UP_CHAR },
+	{ QUIT,		MAX_FORM_COMMAND + 1 }
+    };
+    /* *INDENT-ON* */
+
+    static int mode = REQ_INS_MODE;
+    int c = wGetchar(w);
+    FIELD *me = current_field(f);
+    bool current = TRUE;
+
+    if (c == CTRL(']')) {
+	if (mode == REQ_INS_MODE) {
+	    mode = REQ_OVL_MODE;
+	} else {
+	    mode = REQ_INS_MODE;
+	}
+	c = mode;
+    } else {
+	unsigned n;
+	for (n = 0; n < SIZEOF(lookup); n++) {
+	    if (lookup[n].code == c) {
+		c = lookup[n].result;
+		break;
+	    }
+	}
+    }
+    MvPrintw(0, COLS - 6, "(%s)", mode == REQ_INS_MODE ? "INS" : "OVL");
+
+    /*
+     * Force the field that the user is typing into to be in reverse video,
+     * while the other fields are shown underlined.
+     */
+    switch (c) {
+    case REQ_BEG_FIELD:
+    case REQ_CLR_EOF:
+    case REQ_CLR_EOL:
+    case REQ_CLR_FIELD:
+    case REQ_DEL_CHAR:
+    case REQ_DEL_LINE:
+    case REQ_DEL_PREV:
+    case REQ_DEL_WORD:
+    case REQ_END_FIELD:
+    case REQ_INS_CHAR:
+    case REQ_INS_LINE:
+    case REQ_LEFT_CHAR:
+    case REQ_LEFT_FIELD:
+    case REQ_NEXT_WORD:
+    case REQ_RIGHT_CHAR:
+	current = TRUE;
+	break;
+    default:
+	current = (c < KEY_MAX);
+	break;
+    }
+    if (current) {
+	c = edit_secure(me, c);
+	set_field_back(me, A_REVERSE);
+    } else {
+	c = edit_secure(me, c);
+	set_field_back(me, A_UNDERLINE);
+    }
+    return c;
+}
+
+static int
+my_form_driver(FORM *form, int c)
+{
+    if (c == (MAX_FORM_COMMAND + 1)
+	&& form_driver(form, REQ_VALIDATION) == E_OK)
+	return (TRUE);
+    else {
+	beep();
+	return (FALSE);
+    }
+}
+
+#ifdef NCURSES_VERSION
+#define FIELDCHECK_CB(func) bool func(FIELD * fld, const void * data GCC_UNUSED)
+#define CHAR_CHECK_CB(func) bool func(int ch, const void *data GCC_UNUSED)
+#else
+#define FIELDCHECK_CB(func) int func(FIELD * fld, char * data GCC_UNUSED)
+#define CHAR_CHECK_CB(func) int func(int ch, char *data GCC_UNUSED)
+#endif
+
+/*
+ * Allow a middle initial, optionally with a '.' to end it.
+ */
+static
+FIELDCHECK_CB(mi_field_check)
+{
+    char *s = field_buffer(fld, 0);
+    int state = 0;
+    int n;
+
+    for (n = 0; s[n] != '\0'; ++n) {
+	switch (state) {
+	case 0:
+	    if (s[n] == '.') {
+		if (n != 1)
+		    return FALSE;
+		state = 2;
+	    } else if (isspace(UChar(s[n]))) {
+		state = 2;
+	    }
+	    break;
+	case 2:
+	    if (!isspace(UChar(s[n])))
+		return FALSE;
+	    break;
+	}
+    }
+
+    /* force the form to display a leading capital */
+    if (islower(UChar(s[0]))) {
+	s[0] = (char) toupper(UChar(s[0]));
+	set_field_buffer(fld, 0, s);
+    }
+    return TRUE;
+}
+
+static
+CHAR_CHECK_CB(mi_char_check)
+{
+    return ((isalpha(ch) || ch == '.') ? TRUE : FALSE);
+}
+
+/*
+ * Passwords should be at least 6 characters.
+ */
+static
+FIELDCHECK_CB(pw_field_check)
+{
+    char *s = field_buffer(fld, 0);
+    int n;
+
+    for (n = 0; s[n] != '\0'; ++n) {
+	if (isspace(UChar(s[n]))) {
+	    if (n < 6)
+		return FALSE;
+	}
+    }
+    return TRUE;
+}
+
+static
+CHAR_CHECK_CB(pw_char_check)
+{
+    return (isgraph(ch) ? TRUE : FALSE);
+}
+
+static int
+form_test(bool recur GCC_UNUSED)
+{
+    FORM *form;
+    FIELD *f[12], *secure;
+    FIELDTYPE *fty_middle = new_fieldtype(mi_field_check, mi_char_check);
+    FIELDTYPE *fty_passwd = new_fieldtype(pw_field_check, pw_char_check);
+    int c;
+    unsigned n = 0;
+
+#ifdef NCURSES_MOUSE_VERSION
+    mousemask(ALL_MOUSE_EVENTS, (mmask_t *) 0);
+#endif
+
+    move(18, 0);
+    addstr("Defined edit/traversal keys:   ^Q/ESC- exit form\n");
+    addstr("^N   -- go to next field       ^P  -- go to previous field\n");
+    addstr("Home -- go to first field      End -- go to last field\n");
+    addstr("^L   -- go to field to left    ^R  -- go to field to right\n");
+    addstr("^U   -- move upward to field   ^D  -- move downward to field\n");
+    addstr("^W   -- go to next word        ^B  -- go to previous word\n");
+    addstr("^S   -- go to start of field   ^E  -- go to end of field\n");
+    addstr("^H   -- delete previous char   ^Y  -- delete line\n");
+    addstr("^G   -- delete current word    ^C  -- clear to end of line\n");
+    addstr("^K   -- clear to end of field  ^X  -- clear field\n");
+    addstr("Arrow keys move within a field as you would expect. ^] toggles overlay mode.");
+
+    MvAddStr(4, 57, "Forms Entry Test");
+
+    refresh();
+
+    /* describe the form */
+    memset(f, 0, sizeof(f));
+    f[n++] = make_label(0, 15, "Sample Form");
+
+    f[n++] = make_label(2, 0, "Last Name");
+    f[n++] = make_field(3, 0, 1, 18, FALSE);
+    set_field_type(f[n - 1], TYPE_ALPHA, 1);
+
+    f[n++] = make_label(2, 20, "First Name");
+    f[n++] = make_field(3, 20, 1, 12, FALSE);
+    set_field_type(f[n - 1], TYPE_ALPHA, 1);
+
+    f[n++] = make_label(2, 34, "Middle Name");
+    f[n++] = make_field(3, 34, 1, 12, FALSE);
+    set_field_type(f[n - 1], fty_middle);
+
+    f[n++] = make_label(5, 0, "Comments");
+    f[n++] = make_field(6, 0, 4, 46, FALSE);
+
+    f[n++] = make_label(5, 20, "Password:");
+    secure =
+	f[n++] = make_field(5, 30, 1, 9, TRUE);
+    set_field_type(f[n - 1], fty_passwd);
+    f[n] = (FIELD *) 0;
+
+    if ((form = new_form(f)) != 0) {
+	WINDOW *w;
+	int finished = 0;
+
+	display_form(form);
+
+	w = form_win(form);
+	raw();
+	nonl();			/* lets us read ^M's */
+	while (!finished) {
+	    switch (form_driver(form, c = form_virtualize(form, w))) {
+	    case E_OK:
+		MvAddStr(5, 57, field_buffer(secure, 1));
+		clrtoeol();
+		refresh();
+		break;
+	    case E_UNKNOWN_COMMAND:
+		finished = my_form_driver(form, c);
+		break;
+	    default:
+		beep();
+		break;
+	    }
+	}
+
+	erase_form(form);
+
+	free_form(form);
+    }
+    for (c = 0; f[c] != 0; c++)
+	free_field(f[c]);
+    free_fieldtype(fty_middle);
+    free_fieldtype(fty_passwd);
+    noraw();
+    nl();
+
+#ifdef NCURSES_MOUSE_VERSION
+    mousemask(ALL_MOUSE_EVENTS, (mmask_t *) 0);
+#endif
+    return OK;
+}
+#endif /* USE_LIBFORM */
+
+/****************************************************************************
+ *
+ * Overlap test
+ *
+ ****************************************************************************/
+
+#if HAVE_COPYWIN		/* ...and overlay, overwrite */
+
+static const int overlap_HEAD = 1;
+static const int overlap_FOOT = 6;
+
+static WINDOW *
+make_overlap(int n)
+{
+    WINDOW *result;
+    int y, x;
+
+    getmaxyx(stdscr, y, x);
+    if (y < 23 || x < 80) {
+	Cannot("The screen is too small for this test");
+	result = 0;
+    } else {
+	int ymax = y - (overlap_HEAD + overlap_FOOT);
+	int high = ymax / 5;	/* equal-sized parts for cross */
+	int xmax = x - 2;	/* margin */
+	int wide = (xmax / 5) & ~1;
+	int lmar, tmar;
+
+	if (high > 8)
+	    high = 8;
+
+	if (wide > 8)
+	    wide = 8;
+
+	tmar = (ymax - (5 * high)) / 2 + overlap_HEAD;
+	lmar = (xmax - (5 * wide)) / 2;
+
+	if (n == 0) {
+	    result = newwin(3 * high, 3 * wide, tmar, lmar);
+	} else {
+	    result = newwin(3 * high, 3 * wide, tmar + 2 * high, lmar + 2 * wide);
+	}
+    }
+    return result;
+}
+
+static void
+clear_overlap(void)
+{
+    int row;
+
+    for (row = overlap_HEAD; row < LINES - overlap_FOOT; ++row) {
+	move(row, 0);
+	clrtoeol();
+    }
+}
+
+static int
+move_overlap(int shift, WINDOW *win1)
+{
+    int ymax = getmaxy(stdscr) - (overlap_HEAD + overlap_FOOT);
+    int high = ymax / 5;	/* equal-sized parts for cross */
+    int tmar;
+    int xmax1 = getmaxx(win1) + 1;
+    int lmar1 = (COLS - (5 * (xmax1) / 3)) / 2;
+    int rc = ERR;
+
+    if (high > 8)
+	high = 8;
+    tmar = (ymax - (5 * high)) / 2 + overlap_HEAD;
+
+    rc = mvwin(win1, tmar, lmar1 + shift);
+    return rc;
+}
+
+static void
+fillwin(WINDOW *win, char ch)
+{
+    int y, x;
+    int y1, x1;
+
+    getmaxyx(win, y1, x1);
+    for (y = 0; y < y1; y++) {
+	wmove(win, y, 0);
+	for (x = 0; x < x1; x++)
+	    waddch(win, UChar(ch));
+    }
+}
+
+#define InCross(x,y, x1,y1) \
+	    (((x > (x1 - 1) / 3) && (x <= (2 * (x1 - 1)) / 3)) \
+		|| (((y > (y1 - 1) / 3) && (y <= (2 * (y1 - 1)) / 3))))
+
+static void
+crosswin(WINDOW *win, char ch)
+{
+    int y, x;
+    int y1, x1;
+    int xw = 1;
+
+    getmaxyx(win, y1, x1);
+    for (y = 0; y < y1; y++) {
+	for (x = 0; x < x1; x += xw) {
+	    if (InCross(x, y, x1, y1)) {
+		wmove(win, y, x);
+		waddch(win, UChar(ch));
+	    }
+	}
+    }
+}
+
+/*
+ * Match "crosswin()", but using line-drawing characters.  This could be done
+ * a little simpler using box(), but the reason for this example is to test
+ * hline/vline and addch with line-drawing vs the copy/overlay functions.
+ */
+static void
+crossbox(WINDOW *win)
+{
+    int y1, x1;
+    int ymax, xmax;
+
+    getmaxyx(win, y1, x1);
+
+    ymax = (y1 + 1);
+    xmax = (x1 + 1);
+
+    mvwhline(win, 0, (xmax / 3), ACS_HLINE, (xmax / 3));
+    mvwhline(win, ymax / 3, 0, ACS_HLINE, xmax);
+    mvwhline(win, ((2 * ymax) / 3) - 1, 0, ACS_HLINE, xmax);
+    mvwhline(win, y1 - 1, (xmax / 3), ACS_HLINE, (xmax / 3));
+
+    mvwvline(win, (ymax / 3), 0, ACS_VLINE, (ymax / 3));
+    mvwvline(win, 0, xmax / 3, ACS_VLINE, ymax);
+    mvwvline(win, 0, ((2 * xmax) / 3) - 1, ACS_VLINE, ymax);
+    mvwvline(win, (ymax / 3), x1 - 1, ACS_VLINE, (ymax / 3));
+
+    mvwaddch(win, 0, (xmax / 3), ACS_ULCORNER);
+    mvwaddch(win, 0, ((2 * xmax) / 3) - 1, ACS_URCORNER);
+    mvwaddch(win, y1 - 1, (xmax / 3), ACS_LLCORNER);
+    mvwaddch(win, y1 - 1, ((2 * xmax) / 3) - 1, ACS_LRCORNER);
+
+    mvwaddch(win, (ymax / 3), 0, ACS_ULCORNER);
+    mvwaddch(win, ((2 * ymax) / 3) - 1, 0, ACS_LLCORNER);
+    mvwaddch(win, (ymax / 3), x1 - 1, ACS_URCORNER);
+    mvwaddch(win, ((2 * ymax) / 3) - 1, x1 - 1, ACS_LRCORNER);
+
+    mvwaddch(win, (ymax / 3), (xmax / 3), ACS_PLUS);
+    mvwaddch(win, (ymax / 3), ((2 * xmax) / 3) - 1, ACS_PLUS);
+    mvwaddch(win, ((2 * ymax) / 3) - 1, ((2 * xmax) / 3) - 1, ACS_PLUS);
+    mvwaddch(win, ((2 * ymax) / 3) - 1, (xmax / 3), ACS_PLUS);
+}
+
+typedef enum {
+    otBASE_refresh = 0
+    ,otBASE_fill
+    ,otBASE_draw
+    ,otBASE_clear
+    ,otBASE_copy
+} otBASE;
+
+#define OVERLAP_FLAVORS 6
+
+typedef enum {
+    otFILL_normal = 0
+    ,otFILL_bold
+    ,otFILL_color
+    ,otFILL_bright
+} otFILL;
+
+#define LimitFILL() UseColors ? 4 : 2
+
+typedef enum {
+    otDRAW_text_cross = 0
+    ,otDRAW_line_box
+    ,otDRAW_line_cross
+    ,otDRAW_set_bg
+    ,otDRAW_reset_bg
+} otDRAW;
+
+#define LimitDRAW() UseColors ? 5 : 3
+
+typedef enum {
+    otCOPY_overwrite = 0
+    ,otCOPY_merge
+    ,otCOPY_force
+    ,otCOPY_overlay
+} otCOPY;
+
+#define LimitCOPY() 4
+
+static void
+overlap_helpitem(int state, int item, char *message)
+{
+    int row = (item / 2);
+    int col = ((item % 2) ? COLS / 2 : 0);
+
+    move(LINES - 6 + row, col);
+    printw("%c%c = %s", state == row ? '>' : ' ', 'a' + item, message);
+    clrtoeol();
+}
+
+static void
+overlap_test_1_attr(WINDOW *win, int flavor, int col)
+{
+    NCURSES_PAIRS_T cpair = (NCURSES_PAIRS_T) (1 + (flavor * 2) + col);
+
+    switch ((otFILL) flavor) {
+    case otFILL_normal:
+	(void) wattrset(win, A_NORMAL);
+	break;
+    case otFILL_bold:
+	(void) wattrset(win, A_BOLD);
+	break;
+    case otFILL_color:
+	init_pair(cpair, COLOR_BLUE, COLOR_WHITE);
+	(void) wattrset(win, AttrArg(COLOR_PAIR(cpair), A_NORMAL));
+	break;
+    case otFILL_bright:
+	init_pair(cpair, COLOR_WHITE, COLOR_BLUE);
+	(void) wattrset(win, AttrArg(COLOR_PAIR(cpair), A_BOLD));
+	break;
+    }
+}
+
+static void
+overlap_test_2_attr(WINDOW *win, int flavor, int col)
+{
+    NCURSES_PAIRS_T cpair = (NCURSES_PAIRS_T) (9 + (flavor * 2) + col);
+
+    switch ((otDRAW) flavor) {
+    case otDRAW_text_cross:
+	/* no effect */
+	break;
+    case otDRAW_line_box:
+	/* no effect */
+	break;
+    case otDRAW_line_cross:
+	/* no effect */
+	break;
+    case otDRAW_set_bg:
+	init_pair(cpair, COLOR_RED, COLOR_GREEN);
+	wbkgdset(win, colored_chtype(' ', A_BLINK, cpair));
+	break;
+    case otDRAW_reset_bg:
+	wbkgdset(win, ' ' | A_NORMAL);
+	break;
+    }
+}
+
+static int
+overlap_help(int state, int flavors[OVERLAP_FLAVORS])
+{
+    int item;
+    int limit[OVERLAP_FLAVORS];
+    char msg[80];
+
+    if (state < 0)
+	state += OVERLAP_FLAVORS;
+    state = state % OVERLAP_FLAVORS;
+    assert(state >= 0 && state < OVERLAP_FLAVORS);
+
+    for (item = 0; item < (2 * OVERLAP_FLAVORS); ++item) {
+	int row = item / 2;
+	int col = item % 2;
+	const char *ths = col ? "B" : "A";
+	const char *tht = col ? "A" : "B";
+
+	switch ((otBASE) row) {
+	case otBASE_refresh:
+	    limit[row] = 1;
+	    flavors[row] = 0;
+	    _nc_SPRINTF(msg, _nc_SLIMIT(sizeof(msg))
+			"refresh %s, then %s, then doupdate.", ths, tht);
+	    break;
+	case otBASE_fill:
+	    limit[row] = LimitFILL();
+	    flavors[row] %= limit[row];
+	    overlap_test_1_attr(stdscr, flavors[row], col);
+	    _nc_SPRINTF(msg, _nc_SLIMIT(sizeof(msg))
+			"fill window %s with letter %s.", ths, ths);
+	    break;
+	case otBASE_draw:
+	    limit[row] = LimitDRAW();
+	    flavors[row] %= limit[row];
+	    switch ((otDRAW) flavors[row]) {
+	    case otDRAW_text_cross:
+		_nc_SPRINTF(msg, _nc_SLIMIT(sizeof(msg))
+			    "cross text-pattern in window %s.", ths);
+		break;
+	    case otDRAW_line_box:
+		_nc_SPRINTF(msg, _nc_SLIMIT(sizeof(msg))
+			    "draw line-box in window %s.", ths);
+		break;
+	    case otDRAW_line_cross:
+		_nc_SPRINTF(msg, _nc_SLIMIT(sizeof(msg))
+			    "draw line-cross in window %s.", ths);
+		break;
+	    case otDRAW_set_bg:
+		_nc_SPRINTF(msg, _nc_SLIMIT(sizeof(msg))
+			    "set background of window %s.", ths);
+		break;
+	    case otDRAW_reset_bg:
+		_nc_SPRINTF(msg, _nc_SLIMIT(sizeof(msg))
+			    "reset background of window %s.", ths);
+		break;
+	    }
+	    break;
+	case otBASE_clear:
+	    limit[row] = 1;
+	    flavors[row] = 0;
+	    _nc_SPRINTF(msg, _nc_SLIMIT(sizeof(msg))
+			"clear window %s.", ths);
+	    break;
+	case otBASE_copy:
+	    limit[row] = LimitCOPY();
+	    flavors[row] %= limit[row];
+	    switch ((otCOPY) flavors[row]) {
+	    case otCOPY_overwrite:
+		_nc_SPRINTF(msg, _nc_SLIMIT(sizeof(msg))
+			    "overwrite %s onto %s.", ths, tht);
+		break;
+	    case otCOPY_merge:
+		_nc_SPRINTF(msg, _nc_SLIMIT(sizeof(msg))
+			    "copywin(FALSE) %s onto %s.", ths, tht);
+		break;
+	    case otCOPY_force:
+		_nc_SPRINTF(msg, _nc_SLIMIT(sizeof(msg))
+			    "copywin(TRUE) %s onto %s.", ths, tht);
+		break;
+	    case otCOPY_overlay:
+		_nc_SPRINTF(msg, _nc_SLIMIT(sizeof(msg))
+			    "overlay %s onto %s.", ths, tht);
+		break;
+	    }
+	    break;
+	}
+	overlap_helpitem(state, item, msg);
+	(void) wattrset(stdscr, A_NORMAL);
+	wbkgdset(stdscr, ' ' | A_NORMAL);
+    }
+    move(LINES - 1, 0);
+    printw("^Q/ESC = terminate test. </> shift. Up/down/space select (row %d",
+	   state + 1);
+    if (limit[state] > 1)
+	printw(" test %d:%d", 1 + flavors[state], limit[state]);
+    printw(").");
+    clrtoeol();
+
+    return state;
+}
+
+static void
+overlap_test_0(WINDOW *a, WINDOW *b)
+{
+    touchwin(a);
+    touchwin(b);
+    wnoutrefresh(a);
+    wnoutrefresh(b);
+    doupdate();
+}
+
+static void
+overlap_test_1(int flavor, int col, WINDOW *a, char fill)
+{
+    overlap_test_1_attr(a, flavor, col);
+    fillwin(a, fill);
+    (void) wattrset(a, A_NORMAL);
+}
+
+static void
+overlap_test_2(int flavor, int col, WINDOW *a, char fill)
+{
+    overlap_test_2_attr(a, flavor, col);
+    switch ((otDRAW) flavor) {
+    case otDRAW_text_cross:
+	crosswin(a, fill);
+	break;
+    case otDRAW_line_box:
+	box(a, 0, 0);
+	break;
+    case otDRAW_line_cross:
+	crossbox(a);
+	break;
+    case otDRAW_set_bg:
+	/* done in overlap_test_2_attr */
+	break;
+    case otDRAW_reset_bg:
+	/* done in overlap_test_2_attr */
+	break;
+    }
+}
+
+static void
+overlap_test_3(WINDOW *a)
+{
+    wclear(a);
+    wmove(a, 0, 0);
+}
+
+static void
+overlap_test_4(int flavor, WINDOW *a, WINDOW *b)
+{
+    switch ((otCOPY) flavor) {
+    case otCOPY_overwrite:
+	overwrite(a, b);
+	break;
+    case otCOPY_merge:
+	copywin(a, b, 0, 0, 0, 0, getmaxy(b), getmaxx(b), FALSE);
+	break;
+    case otCOPY_force:
+	copywin(a, b, 0, 0, 0, 0, getmaxy(b), getmaxx(b), TRUE);
+	break;
+    case otCOPY_overlay:
+	overlay(a, b);
+	break;
+    }
+}
+
+/* test effects of overlapping windows */
+static int
+overlap_test(bool recur GCC_UNUSED)
+{
+    WINDOW *win1, *win2;
+    int ch;
+    int shift = 0, last_refresh = -1;
+    int state, flavor[OVERLAP_FLAVORS];
+
+    if ((win1 = make_overlap(0)) == 0) {
+	return ERR;
+    } else if ((win2 = make_overlap(1)) == 0) {
+	delwin(win1);
+	return ERR;
+    }
+
+    curs_set(0);
+    raw();
+    refresh();
+    move(0, 0);
+    printw("Test wnoutrefresh() for two overlapping windows:");
+
+    memset(flavor, 0, sizeof(flavor));
+    state = overlap_help(0, flavor);
+
+    while (!isQuit(ch = Getchar(), TRUE)) {
+	switch (ch) {
+	case 'a':		/* refresh window A first, then B */
+	    overlap_test_0(win1, win2);
+	    break;
+
+	case 'b':		/* refresh window B first, then A */
+	    overlap_test_0(win2, win1);
+	    break;
+
+	case 'c':		/* fill window A so it is visible */
+	    overlap_test_1(flavor[otBASE_fill], 0, win1, 'A');
+	    break;
+
+	case 'd':		/* fill window B so it is visible */
+	    overlap_test_1(flavor[otBASE_fill], 1, win2, 'B');
+	    break;
+
+	case 'e':		/* cross test pattern in window A */
+	    overlap_test_2(flavor[otBASE_draw], 0, win1, 'A');
+	    break;
+
+	case 'f':		/* cross test pattern in window A */
+	    overlap_test_2(flavor[otBASE_draw], 1, win2, 'B');
+	    break;
+
+	case 'g':		/* clear window A */
+	    overlap_test_3(win1);
+	    break;
+
+	case 'h':		/* clear window B */
+	    overlap_test_3(win2);
+	    break;
+
+	case 'i':		/* overwrite A onto B */
+	    overlap_test_4(flavor[otBASE_copy], win1, win2);
+	    break;
+
+	case 'j':		/* overwrite B onto A */
+	    overlap_test_4(flavor[otBASE_copy], win2, win1);
+	    break;
+
+	case CTRL('n'):
+	case KEY_DOWN:
+	    state = overlap_help(state + 1, flavor);
+	    break;
+
+	case CTRL('p'):
+	case KEY_UP:
+	    state = overlap_help(state - 1, flavor);
+	    break;
+
+	case ' ':
+	    flavor[state] += 1;
+	    state = overlap_help(state, flavor);
+	    break;
+
+	case HELP_KEY_1:
+	    state = overlap_help(state, flavor);
+	    break;
+
+	case '<':
+	    /* FALLTHRU */
+	case '>':
+	    /* see below */
+	    break;
+
+	default:
+	    beep();
+	    break;
+	}
+
+	switch (ch) {
+	case 'a':
+	    /* FALLTHRU */
+	case 'b':
+	    last_refresh = ch;
+	    break;
+	case '<':
+	    shift -= 2;
+	    /* FALLTHRU */
+	case '>':
+	    shift += 1;
+	    if (move_overlap(shift, win1) != OK) {
+		flash();
+		shift += (ch == '>') ? -1 : 1;
+	    } else if (last_refresh > 0) {
+		clear_overlap();
+		wnoutrefresh(stdscr);
+		if (last_refresh == 'a')
+		    overlap_test_0(win1, win2);
+		else
+		    overlap_test_0(win2, win1);
+	    }
+	    break;
+	default:
+	    last_refresh = -1;
+	    break;
+	}
+    }
+
+    delwin(win2);
+    delwin(win1);
+    erase();
+    stop_curses();
+    return OK;
+}
+
+#if USE_WIDEC_SUPPORT
+static void
+x_fillwin(WINDOW *win, wchar_t ch)
+{
+    int y, x;
+    int y1, x1;
+
+    getmaxyx(win, y1, x1);
+    x1 /= 2;
+    for (y = 0; y < y1; y++) {
+	wmove(win, y, 0);
+	for (x = 0; x < x1; x++)
+	    waddnwstr(win, &ch, 1);
+    }
+}
+
+static void
+x_crosswin(WINDOW *win, wchar_t ch)
+{
+    int y, x;
+    int y1, x1;
+    int xw = 2;
+
+    getmaxyx(win, y1, x1);
+    for (y = 0; y < y1; y++) {
+	for (x = 0; x < x1; x += xw) {
+	    if (InCross(x, y, x1, y1)) {
+		wmove(win, y, x);
+		waddnwstr(win, &ch, 1);
+	    }
+	}
+    }
+}
+
+static void
+x_overlap_test_1(int flavor, int col, WINDOW *a, wchar_t fill)
+{
+    overlap_test_1_attr(a, flavor, col);
+    x_fillwin(a, fill);
+    (void) wattrset(a, A_NORMAL);
+}
+
+static void
+x_overlap_test_2(int flavor, int col, WINDOW *a, wchar_t fill)
+{
+    overlap_test_2_attr(a, flavor, col);
+    switch ((otDRAW) flavor) {
+    case otDRAW_text_cross:
+	x_crosswin(a, fill);
+	break;
+    case otDRAW_line_box:
+	box(a, 0, 0);
+	break;
+    case otDRAW_line_cross:
+	crossbox(a);
+	break;
+    case otDRAW_set_bg:
+	/* done in overlap_test_2_attr */
+	break;
+    case otDRAW_reset_bg:
+	/* done in overlap_test_2_attr */
+	break;
+    }
+}
+
+/* test effects of overlapping windows */
+static int
+x_overlap_test(bool recur GCC_UNUSED)
+{
+    const wchar_t WIDE_A = 0xff21;
+    const wchar_t WIDE_B = 0xff22;
+    WINDOW *win1, *win2;
+    int ch;
+    int shift = 0, last_refresh = -1;
+    int state, flavor[OVERLAP_FLAVORS];
+
+    if ((win1 = make_overlap(0)) == 0) {
+	return ERR;
+    } else if ((win2 = make_overlap(1)) == 0) {
+	delwin(win1);
+	return ERR;
+    }
+
+    curs_set(0);
+    raw();
+    refresh();
+    move(0, 0);
+    printw("Test wnoutrefresh() for overlapping windows with double-cell characters:");
+
+    memset(flavor, 0, sizeof(flavor));
+    state = overlap_help(0, flavor);
+
+    while (!isQuit(ch = Getchar(), TRUE)) {
+	switch (ch) {
+	case 'a':		/* refresh window A first, then B */
+	    overlap_test_0(win1, win2);
+	    break;
+
+	case 'b':		/* refresh window B first, then A */
+	    overlap_test_0(win2, win1);
+	    break;
+
+	case 'c':		/* fill window A so it is visible */
+	    x_overlap_test_1(flavor[otBASE_fill], 0, win1, WIDE_A);
+	    break;
+
+	case 'd':		/* fill window B so it is visible */
+	    x_overlap_test_1(flavor[otBASE_fill], 1, win2, WIDE_B);
+	    break;
+
+	case 'e':		/* cross test pattern in window A */
+	    x_overlap_test_2(flavor[otBASE_draw], 0, win1, WIDE_A);
+	    break;
+
+	case 'f':		/* cross test pattern in window A */
+	    x_overlap_test_2(flavor[otBASE_draw], 1, win2, WIDE_B);
+	    break;
+
+	case 'g':		/* clear window A */
+	    overlap_test_3(win1);
+	    break;
+
+	case 'h':		/* clear window B */
+	    overlap_test_3(win2);
+	    break;
+
+	case 'i':		/* overwrite A onto B */
+	    overlap_test_4(flavor[otBASE_copy], win1, win2);
+	    break;
+
+	case 'j':		/* overwrite B onto A */
+	    overlap_test_4(flavor[otBASE_copy], win2, win1);
+	    break;
+
+	case CTRL('n'):
+	case KEY_DOWN:
+	    state = overlap_help(state + 1, flavor);
+	    break;
+
+	case CTRL('p'):
+	case KEY_UP:
+	    state = overlap_help(state - 1, flavor);
+	    break;
+
+	case ' ':
+	    flavor[state] += 1;
+	    state = overlap_help(state, flavor);
+	    break;
+
+	case HELP_KEY_1:
+	    state = overlap_help(state, flavor);
+	    break;
+
+	case '<':
+	    /* FALLTHRU */
+	case '>':
+	    /* see below */
+	    break;
+
+	default:
+	    beep();
+	    break;
+	}
+
+	switch (ch) {
+	case 'a':
+	    /* FALLTHRU */
+	case 'b':
+	    last_refresh = ch;
+	    break;
+	case '<':
+	    shift -= 2;
+	    /* FALLTHRU */
+	case '>':
+	    shift += 1;
+	    if (move_overlap(shift, win1) != OK) {
+		flash();
+		shift += (ch == '>') ? -1 : 1;
+	    } else if (last_refresh > 0) {
+		clear_overlap();
+		wnoutrefresh(stdscr);
+		if (last_refresh == 'a')
+		    overlap_test_0(win1, win2);
+		else
+		    overlap_test_0(win2, win1);
+	    }
+	    break;
+	default:
+	    last_refresh = -1;
+	    break;
+	}
+    }
+
+    delwin(win2);
+    delwin(win1);
+    erase();
+    stop_curses();
+    return OK;
+}
+#endif /* USE_WIDEC_SUPPORT */
+
+#endif /* HAVE_COPYWIN */
+
+static void
+show_setting_name(const char *name)
+{
+    printw("%-25s ", name);
+}
+
+static void
+show_string_setting(const char *name, const char *value)
+{
+    show_setting_name(name);
+    if (value) {
+	printw("\"%s\"", value);
+    } else {
+	attron(A_REVERSE);
+	addstr("<NULL>");
+	attroff(A_REVERSE);
+    }
+    AddCh('\n');
+}
+
+static void
+show_number_setting(const char *name, int value)
+{
+    show_setting_name(name);
+    if (value >= 0) {
+	printw("%d", value);
+    } else {
+	attron(A_REVERSE);
+	printw("%d", value);
+	attroff(A_REVERSE);
+    }
+    AddCh('\n');
+}
+
+static void
+show_boolean_setting(const char *name, int value)
+{
+    show_setting_name(name);
+    if (value >= 0) {
+	printw("%s", value ? "TRUE" : "FALSE");
+    } else {
+	attron(A_REVERSE);
+	printw("%d", value);
+	attroff(A_REVERSE);
+    }
+    AddCh('\n');
+}
+
+static int
+settings_test(bool recur GCC_UNUSED)
+{
+#if USE_WIDEC_SUPPORT
+    wchar_t ch;
+#endif
+
+    move(0, 0);
+    show_string_setting("termname", termname());
+    show_string_setting("longname", longname());
+    show_number_setting("baudrate", baudrate());
+    if (erasechar() > 0) {
+	show_string_setting("unctrl(erasechar)", unctrl((chtype) erasechar()));
+	show_string_setting("keyname(erasechar)", keyname(erasechar()));
+    }
+    if (killchar() > 0) {
+	show_string_setting("unctrl(killchar)", unctrl((chtype) killchar()));
+	show_string_setting("keyname(killchar)", keyname(killchar()));
+    }
+#if USE_WIDEC_SUPPORT
+    if (erasewchar(&ch) == OK) {
+	show_string_setting("key_name(erasewchar)", key_name(ch));
+    }
+    if (killwchar(&ch) == OK) {
+	show_string_setting("key_name(killwchar)", key_name(ch));
+    }
+#endif
+    show_boolean_setting("has_ic", has_ic());
+    show_boolean_setting("has_il", has_il());
+    show_boolean_setting("has_colors", has_colors());
+#if HAVE_COLOR_CONTENT
+    show_boolean_setting("can_change_color", can_change_color());
+#endif
+    show_setting_name("LINES");
+    printw("%d\n", LINES);
+    show_setting_name("COLS");
+    printw("%d\n", COLS);
+    Pause();
+    erase();
+    stop_curses();
+    return OK;
+}
+
+/****************************************************************************
+ *
+ * Main sequence
+ *
+ ****************************************************************************/
+
+static void
+usage(int ok)
+{
+    static const char *const tbl[] =
+    {
+	"Usage: ncurses [options]"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+#ifdef NCURSES_VERSION
+	," -a f,b   set default-colors (assumed white-on-black)"
+	," -d       use default-colors if terminal supports them"
+#endif
+#if HAVE_USE_ENV
+	," -E       call use_env(FALSE) to ignore $LINES and $COLUMNS"
+#endif
+#if USE_SOFTKEYS
+	," -e fmt   specify format for soft-keys test (e)"
+#endif
+#if HAVE_RIPOFFLINE
+	," -F       rip-off footer line (can repeat)"
+	," -H       rip-off header line (can repeat)"
+#endif
+	," -m       do not use colors"
+#if HAVE_COLOR_CONTENT
+	," -p file  rgb values to use in 'd' rather than ncurses's builtin"
+#endif
+#if USE_LIBPANEL
+	," -s msec  specify nominal time for panel-demo (default: 1, to hold)"
+#endif
+#if defined(NCURSES_VERSION_PATCH) && (NCURSES_VERSION_PATCH >= 20120714) && !defined(_NC_WINDOWS)
+	," -T       call use_tioctl(TRUE) to allow SIGWINCH to override environment"
+#endif
+#ifdef TRACE
+	," -t mask  specify default trace-level (may toggle with ^T)"
+#endif
+#if HAVE_COLOR_CONTENT
+	," -x       use xterm-compatible control for reading color palette"
+#endif
+    };
+    size_t n;
+    for (n = 0; n < SIZEOF(tbl); n++)
+	fprintf(stderr, "%s\n", tbl[n]);
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+
+static void
+set_terminal_modes(void)
+{
+    noraw();
+    cbreak();
+    noecho();
+    scrollok(stdscr, TRUE);
+    idlok(stdscr, TRUE);
+    keypad(stdscr, TRUE);
+}
+
+#ifdef SIGUSR1
+static void
+announce_sig(int sig)
+{
+    (void) fprintf(stderr, "Handled signal %d\r\n", sig);
+}
+#endif
+
+#if HAVE_RIPOFFLINE
+static int
+rip_footer(WINDOW *win, int cols)
+{
+    wbkgd(win, A_REVERSE);
+    werase(win);
+    wmove(win, 0, 0);
+    wprintw(win, "footer: window %p, %d columns", (void *) win, cols);
+    wnoutrefresh(win);
+    return OK;
+}
+
+static int
+rip_header(WINDOW *win, int cols)
+{
+    wbkgd(win, A_REVERSE);
+    werase(win);
+    wmove(win, 0, 0);
+    wprintw(win, "header: window %p, %d columns", (void *) win, cols);
+    wnoutrefresh(win);
+    return OK;
+}
+#endif /* HAVE_RIPOFFLINE */
+
+static void
+main_menu(bool top)
+{
+#if USE_WIDEC_SUPPORT
+    typedef struct {
+	bool recur;
+	int (*narrow_func) (bool);
+	int (*wide_func) (bool);
+	int code;
+	const char *help;
+    } MyCmds;
+#define BOTH(a)   a, x_ ## a
+#define ONLY(a)   a, NULL
+#define CMDS(recur, funcs,code,help) { recur, funcs, code, help }
+#else
+    typedef struct {
+	bool recur;
+	int (*narrow_func) (bool);
+	int code;
+	const char *help;
+    } MyCmds;
+#define BOTH(a)   a
+#define ONLY(a)   a
+#define CMDS(recur, funcs,code,help) { recur, funcs, code, help }
+#endif
+    /* *INDENT-OFF* */
+    static MyCmds cmds[] =
+    {
+	CMDS(TRUE, BOTH(getch_test),	'a', "keyboard and mouse input test"),
+	CMDS(TRUE, BOTH(attr_test),	'b', "character attribute test"),
+	CMDS(TRUE, BOTH(color_test),	'c', "color test pattern"),
+#if HAVE_COLOR_CONTENT
+	CMDS(FALSE, ONLY(color_edit),	'd', "edit RGB color values"),
+#endif
+#if USE_SOFTKEYS
+	CMDS(TRUE, BOTH(slk_test),	'e', "exercise soft keys"),
+#endif
+	CMDS(TRUE, BOTH(acs_test),	'f', "display ACS characters"),
+	CMDS(TRUE, ONLY(scroll_test),   'g', "display windows and scrolling"),
+	CMDS(TRUE, ONLY(flushinp_test),	'i', "test flushinp()"),
+	CMDS(TRUE, ONLY(sgr_attr_test),	'k', "display character attributes"),
+#if USE_LIBMENU
+	CMDS(TRUE, ONLY(menu_test),	'm', "exercise menu library"),
+#endif
+#if USE_LIBPANEL
+	CMDS(TRUE, BOTH(panel_test),	'o', "exercise panel library"),
+#endif
+#if HAVE_NEWPAD
+	CMDS(TRUE, ONLY(pad_test),	'p', "exercise pad features"),
+#endif
+	CMDS(TRUE, ONLY(NULL),		'q', "quit"),
+#if USE_LIBMENU
+	CMDS(TRUE, ONLY(form_test),	'r', "exercise form library"),
+#endif
+#if HAVE_COPYWIN
+	CMDS(TRUE, BOTH(overlap_test),	's', "overlapping-refresh test"),
+#endif
+#if USE_LIBMENU && defined(TRACE)
+	CMDS(TRUE, ONLY(trace_set),	't', "set trace level"),
+#endif
+	CMDS(TRUE, ONLY(settings_test),	'v', "show terminal name and settings"),
+	CMDS(FALSE, ONLY(NULL),		'?', "repeat this command summary")
+    };
+    /* *INDENT-ON* */
+
+    int (*doit) (bool);
+    char command;
+    unsigned n;
+    do {
+	printf("This is the ncurses main menu (uppercase for wide-characters)\n");
+	for (n = 0; n < SIZEOF(cmds); ++n) {
+	    if (top || cmds[n].recur) {
+		putchar(' ');
+#if USE_WIDEC_SUPPORT
+		if (cmds[n].wide_func) {
+		    printf("%c,", toupper(cmds[n].code));
+		}
+#endif
+		printf("%c\t= %s\n", cmds[n].code, cmds[n].help);
+	    }
+	}
+
+	(void) fputs("> ", stdout);
+	(void) fflush(stdout);	/* necessary under SVr4 curses */
+
+	/*
+	 * This used to be an 'fgets()' call (until 1996/10).  However with
+	 * some runtime libraries, mixing stream I/O and 'read()' causes the
+	 * input stream to be flushed when switching between the two.
+	 */
+	command = 0;
+	for (;;) {
+	    char ch = '\0';
+	    if (read(fileno(stdin), &ch, (size_t) 1) <= 0) {
+		int save_err = errno;
+		perror("\nOOPS");
+		if (save_err == EINTR) {
+		    clearerr(stdin);
+		    continue;
+		} else if (command == 0) {
+		    command = 'q';
+		}
+		break;
+	    } else if (command == 0 && !isspace(UChar(ch))) {
+		command = ch;
+	    } else if (ch == '\n' || ch == '\r') {
+		if ((command == 'd') && !top) {
+		    (void) fputs("Do not nest test-d\n", stdout);
+		    command = 0;
+		}
+		if (command != 0)
+		    break;
+		(void) fputs("> ", stdout);
+		(void) fflush(stdout);
+	    }
+	}
+
+	doit = NULL;
+	for (n = 0; n < SIZEOF(cmds); ++n) {
+	    if (cmds[n].code == command) {
+		doit = cmds[n].narrow_func;
+		break;
+	    }
+#if USE_WIDEC_SUPPORT
+	    if (toupper(cmds[n].code) == command) {
+		doit = cmds[n].wide_func;
+		break;
+	    }
+#endif
+	}
+
+	if (doit != NULL && doit(FALSE) == OK) {
+	    /*
+	     * This may be overkill; it is intended to reset everything back
+	     * to the initial terminal modes so that tests don't get in
+	     * each other's way.
+	     */
+	    flushinp();
+	    set_terminal_modes();
+	    reset_prog_mode();
+	    clear();
+	    refresh();
+	    endwin();
+	    if (command == '?') {
+		(void) puts("This is the ncurses capability tester.");
+		(void)
+		    puts("You may select a test from the main menu by typing the");
+		(void)
+		    puts("key letter of the choice (the letter to left of the =)");
+		(void)
+		    puts("at the > prompt.  Type `q' to exit.");
+	    }
+	    continue;
+	}
+    } while
+	(command != 'q');
+}
+
+/*+-------------------------------------------------------------------------
+	main(argc,argv)
+--------------------------------------------------------------------------*/
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+    int my_e_param = 1;
+#ifdef NCURSES_VERSION_PATCH
+#if HAVE_USE_DEFAULT_COLORS
+    int default_fg = COLOR_WHITE;
+    int default_bg = COLOR_BLACK;
+    bool default_colors = FALSE;
+#if HAVE_ASSUME_DEFAULT_COLORS
+    bool assumed_colors = FALSE;
+#endif
+#endif
+#endif
+    bool monochrome = FALSE;
+#if HAVE_COLOR_CONTENT
+    bool xterm_colors = FALSE;
+    char *palette_file = 0;
+#endif
+
+    setlocale(LC_ALL, "");
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "a:dEe:FHmp:s:Tt:x")) != -1) {
+	switch (ch) {
+#ifdef NCURSES_VERSION_PATCH
+#if HAVE_USE_DEFAULT_COLORS
+#if HAVE_ASSUME_DEFAULT_COLORS
+	case 'a':
+	    assumed_colors = TRUE;
+	    switch (sscanf(optarg, "%d,%d", &default_fg, &default_bg)) {
+	    case 0:
+		default_fg = COLOR_WHITE;
+		/* FALLTHRU */
+	    case 1:
+		default_bg = COLOR_BLACK;
+		break;
+	    }
+	    break;
+#endif
+	case 'd':
+	    default_colors = TRUE;
+	    break;
+#endif
+#endif
+#if HAVE_USE_ENV
+	case 'E':
+	    use_env(FALSE);
+	    break;
+#endif
+	case 'e':
+	    my_e_param = atoi(optarg);
+#ifdef NCURSES_VERSION
+	    if (my_e_param > 3)	/* allow extended layouts */
+		usage(FALSE);
+#else
+	    if (my_e_param > 1)
+		usage(FALSE);
+#endif
+	    break;
+#if HAVE_RIPOFFLINE
+	case 'F':
+	    ripoffline(-1, rip_footer);
+	    break;
+	case 'H':
+	    ripoffline(1, rip_header);
+	    break;
+#endif /* HAVE_RIPOFFLINE */
+	case 'm':
+	    monochrome = TRUE;
+	    break;
+#if HAVE_COLOR_CONTENT
+	case 'p':
+	    palette_file = optarg;
+	    break;
+#endif
+#if USE_LIBPANEL
+	case 's':
+	    nap_msec = (int) atol(optarg);
+	    break;
+#endif
+#if defined(NCURSES_VERSION_PATCH) && (NCURSES_VERSION_PATCH >= 20120714) && !defined(_NC_WINDOWS)
+	case 'T':
+	    use_tioctl(TRUE);
+	    break;
+#endif
+#ifdef TRACE
+	case 't':
+	    save_trace = (unsigned) strtol(optarg, 0, 0);
+	    break;
+#endif
+#if HAVE_COLOR_CONTENT
+	case 'x':
+	    xterm_colors = TRUE;
+	    break;
+#endif
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+
+    /*
+     * If there's no menus (unlikely for ncurses!), then we'll have to set
+     * tracing on initially, just in case the user wants to test something that
+     * doesn't involve wGetchar.
+     */
+#ifdef TRACE
+    /* enable debugging */
+#if !USE_LIBMENU
+    curses_trace(save_trace);
+#else
+    if (!isatty(fileno(stdin)))
+	curses_trace(save_trace);
+#endif /* USE_LIBMENU */
+#endif /* TRACE */
+
+#if USE_SOFTKEYS
+    /* tell it we're going to play with soft keys */
+    slk_init(my_e_param);
+#endif
+
+#ifdef SIGUSR1
+    /* set up null signal catcher so we can see what interrupts to getch do */
+    signal(SIGUSR1, announce_sig);
+#endif
+
+    /* we must initialize the curses data structure only once */
+    initscr();
+    bkgdset(BLANK);
+
+    set_terminal_modes();
+    def_prog_mode();
+
+    /* tests, in general, will want these modes */
+    UseColors = (bool) (monochrome ? FALSE : has_colors());
+
+    if (UseColors) {
+	start_color();
+#ifdef NCURSES_VERSION_PATCH
+	MaxColors = COLORS;	/* was > 16 ? 16 : COLORS */
+#if HAVE_USE_DEFAULT_COLORS
+	if (default_colors) {
+	    use_default_colors();
+	    MinColors = -1;
+	}
+#if HAVE_ASSUME_DEFAULT_COLORS
+	if (assumed_colors)
+	    assume_default_colors(default_fg, default_bg);
+#endif
+#endif
+#else /* normal SVr4 curses */
+	MaxColors = COLORS;	/* was > 8 ? 8 : COLORS */
+#endif
+	max_pairs = COLOR_PAIRS;	/* was > 256 ? 256 : COLOR_PAIRS */
+
+#if HAVE_COLOR_CONTENT
+	if (can_change_color()) {
+	    init_all_colors(xterm_colors, palette_file);
+	}
+#endif
+    }
+
+    /*
+     * Return to terminal mode, so we're guaranteed of being able to
+     * select terminal commands even if the capabilities are wrong.
+     */
+    endwin();
+
+#if HAVE_CURSES_VERSION
+    (void) printf("Welcome to %s.  Press ? for help.\n", curses_version());
+#elif defined(NCURSES_VERSION_MAJOR) && defined(NCURSES_VERSION_MINOR) && defined(NCURSES_VERSION_PATCH)
+    (void) printf("Welcome to ncurses %d.%d.%d.  Press ? for help.\n",
+		  NCURSES_VERSION_MAJOR,
+		  NCURSES_VERSION_MINOR,
+		  NCURSES_VERSION_PATCH);
+#else
+    (void) puts("Welcome to ncurses.  Press ? for help.");
+#endif
+
+    main_menu(TRUE);
+
+    ExitProgram(EXIT_SUCCESS);
+}
+
+/* ncurses.c ends here */
diff --git a/test/ncurses_tst.hin b/test/ncurses_tst.hin
new file mode 100644
index 0000000..238fc22
--- /dev/null
+++ b/test/ncurses_tst.hin
@@ -0,0 +1,57 @@
+/****************************************************************************
+ * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 1998 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey <dickey@clark.net> 1998                        *
+ ****************************************************************************/
+/*
+ * $Id: ncurses_tst.hin,v 1.3 2020/02/02 23:34:34 tom Exp $
+ *
+ * This is a template-file used to generate the "ncurses_cfg.h" file.
+ *
+ * Rather than list every definition, the configuration script substitutes
+ * the definitions that it finds using 'sed'.  You need a patch (971222)
+ * to autoconf 2.12 to do this.
+ */
+#ifndef NC_CONFIG_H
+#define NC_CONFIG_H
+@DEFS@
+
+	/* The C compiler may not treat these properly but C++ has to */
+#ifdef __cplusplus
+#undef const
+#undef inline
+#else
+#if defined(lint) || defined(TRACE)
+#undef inline
+#define inline /* nothing */
+#endif
+#endif
+
+#endif /* NC_CONFIG_H */
diff --git a/test/newdemo.c b/test/newdemo.c
new file mode 100644
index 0000000..7876153
--- /dev/null
+++ b/test/newdemo.c
@@ -0,0 +1,401 @@
+/*
+ *  newdemo.c	-	A demo program using PDCurses. The program illustrate
+ *  	 		the use of colours for text output.
+ *
+ * $Id: newdemo.c,v 1.48 2022/12/10 23:36:05 tom Exp $
+ */
+
+#include <test.priv.h>
+
+#include <time.h>
+
+/*
+ *  The Australian map
+ */
+static CONST_MENUS char *AusMap[16] =
+{
+    "           A           A ",
+    "    N.T. AAAAA       AAAA ",
+    "     AAAAAAAAAAA  AAAAAAAA ",
+    "   AAAAAAAAAAAAAAAAAAAAAAAAA Qld.",
+    "AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ",
+    "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ",
+    " AAAAAAAAAAAAAAAAAAAAAAAAAAAA ",
+    "   AAAAAAAAAAAAAAAAAAAAAAAAA N.S.W.",
+    "W.A. AAAAAAAAA      AAAAAA Vic.",
+    "       AAA   S.A.     AA",
+    "                       A  Tas.",
+    ""
+};
+
+/*
+ *  Funny messages
+ */
+#define NMESSAGES   6
+
+static const char *messages[] =
+{
+    "Hello from the Land Down Under",
+    "The Land of crocs. and a big Red Rock",
+    "Where the sunflower runs along the highways",
+    "the dusty red roads lead one to loneliness",
+    "Blue sky in the morning and",
+    "freezing nights and twinkling stars",
+    ""
+};
+
+/*
+ *  Trap interrupt
+ */
+static void
+trap(int sig GCC_UNUSED)
+{
+    stop_curses();
+    ExitProgram(EXIT_FAILURE);
+}
+
+/*
+ *  Wait for user
+ */
+static int
+WaitForUser(WINDOW *win)
+{
+    time_t t;
+
+    nodelay(win, TRUE);
+    t = time((time_t *) 0);
+
+    while (1) {
+	chtype key;
+	if ((int) (key = (chtype) wgetch(win)) != ERR) {
+	    if (key == 'q' || key == 'Q')
+		return 1;
+	    else
+		return 0;
+	}
+	if (time((time_t *) 0) - t > 5)
+	    return 0;
+    }
+}
+
+static void
+set_colors(WINDOW *win, int pair, int foreground, int background)
+{
+    if (has_colors()) {
+	if (pair > COLOR_PAIRS)
+	    pair = COLOR_PAIRS;
+	init_pair((short) pair, (short) foreground, (short) background);
+	(void) wattrset(win, AttrArg(COLOR_PAIR(pair), 0));
+    }
+}
+
+static chtype
+use_colors(WINDOW *win, int pair, chtype attrs)
+{
+    if (has_colors()) {
+	if (pair > COLOR_PAIRS)
+	    pair = COLOR_PAIRS;
+	attrs |= (chtype) COLOR_PAIR(pair);
+    }
+    (void) wattrset(win, AttrArg(attrs, 0));
+    return attrs;
+}
+
+/*
+ * Test sub windows
+ */
+static int
+SubWinTest(WINDOW *win)
+{
+    int w, h, sw, sh, bx, by;
+    WINDOW *swin1, *swin2, *swin3;
+
+    getmaxyx(win, h, w);
+    getbegyx(win, by, bx);
+    sw = w / 3;
+    sh = h / 3;
+
+    if ((swin1 = subwin(win, sh, sw, by + 3, bx + 5)) == NULL) {
+	return 1;
+    }
+    if ((swin2 = subwin(win, sh, sw, by + 4, bx + 8)) == NULL) {
+	delwin(swin1);
+	return 1;
+    }
+    if ((swin3 = subwin(win, sh, sw, by + 5, bx + 11)) == NULL) {
+	delwin(swin1);
+	delwin(swin2);
+	return 1;
+    }
+
+    set_colors(swin1, 8, COLOR_RED, COLOR_BLUE);
+    werase(swin1);
+    MvWAddStr(swin1, 0, 3, "Sub-window 1");
+    wrefresh(swin1);
+
+    set_colors(swin2, 9, COLOR_CYAN, COLOR_MAGENTA);
+    werase(swin2);
+    MvWAddStr(swin2, 0, 3, "Sub-window 2");
+    wrefresh(swin2);
+
+    set_colors(swin3, 10, COLOR_YELLOW, COLOR_GREEN);
+    werase(swin3);
+    MvWAddStr(swin3, 0, 3, "Sub-window 3");
+    wrefresh(swin3);
+
+    delwin(swin1);
+    delwin(swin2);
+    delwin(swin3);
+    WaitForUser(win);
+    return 0;
+}
+
+static int
+bounce(int n, int *dir, int len)
+{
+    if (*dir > 0)
+	++n;
+    else
+	--n;
+    if (n <= 1 || n >= len - 2)
+	*dir = *dir ? 0 : 1;
+    return n;
+}
+
+/*
+ *  Bouncing balls
+ */
+static int
+BouncingBalls(WINDOW *win)
+{
+    int w, h;
+    int x1, y1, xd1, yd1;
+    int x2, y2, xd2, yd2;
+    int x3, y3, xd3, yd3;
+
+    getmaxyx(win, h, w);
+
+    x1 = 2 + rand() % (w - 4);
+    y1 = 2 + rand() % (h - 4);
+    x2 = 2 + rand() % (w - 4);
+    y2 = 2 + rand() % (h - 4);
+    x3 = 2 + rand() % (w - 4);
+    y3 = 2 + rand() % (h - 4);
+
+    xd1 = 1;
+    yd1 = 1;
+    xd2 = 1;
+    yd2 = 0;
+    xd3 = 0;
+    yd3 = 1;
+
+    nodelay(win, TRUE);
+
+    while (wgetch(win) == ERR) {
+	x1 = bounce(x1, &xd1, w);
+	y1 = bounce(y1, &yd1, h);
+	x2 = bounce(x2, &xd2, w);
+	y2 = bounce(y2, &yd2, h);
+	x3 = bounce(x3, &xd3, w);
+	y3 = bounce(y3, &yd3, h);
+
+	set_colors(win, 11, COLOR_RED, COLOR_BLUE);
+	MvWAddCh(win, y1, x1, 'O');
+
+	set_colors(win, 12, COLOR_BLUE, COLOR_RED);
+	MvWAddCh(win, y2, x2, '*');
+
+	set_colors(win, 13, COLOR_YELLOW, COLOR_WHITE);
+	MvWAddCh(win, y3, x3, '@');
+
+	wmove(win, 0, 0);
+	wrefresh(win);
+	delay_output(100);
+    }
+    return 0;
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: newdemo [options]"
+	,""
+	,USAGE_COMMON
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+/*
+ *  Main driver
+ */
+int
+main(int argc, char *argv[])
+{
+    WINDOW *win;
+    int x, y, i, k;
+    char buffer[SIZEOF(messages) * 80];
+    int width, height;
+    chtype save[80];
+    int ch;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) {
+	switch (ch) {
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind < argc)
+	usage(FALSE);
+
+    setlocale(LC_ALL, "");
+
+    InitAndCatch(initscr(), trap);
+    if (has_colors())
+	start_color();
+    cbreak();
+    curs_set(0);
+    width = 48;
+    height = 14;		/* Create a drawing window */
+    win = newwin(height, width, (LINES - height) / 2, (COLS - width) / 2);
+    if (win == NULL) {
+	stop_curses();
+	ExitProgram(EXIT_FAILURE);
+    }
+
+    while (1) {
+	int w;
+	int j;
+	chtype c;
+	const char *message;
+
+	set_colors(win, 1, COLOR_WHITE, COLOR_BLUE);
+	werase(win);
+
+	set_colors(win, 2, COLOR_RED, COLOR_RED);
+	box(win, ACS_VLINE, ACS_HLINE);
+	wrefresh(win);
+	/* Do ramdom output of a character */
+	use_colors(win, 1, A_NORMAL);
+	c = 'a';
+	for (i = 0; i < 5000; ++i) {
+	    x = rand() % (width - 2) + 1;
+	    y = rand() % (height - 2) + 1;
+	    MvWAddCh(win, y, x, c);
+	    wrefresh(win);
+	    nodelay(win, TRUE);
+	    if (wgetch(win) != ERR)
+		break;
+	    if (i == 2000) {
+		c = 'b';
+		set_colors(win, 3, COLOR_CYAN, COLOR_YELLOW);
+	    }
+	}
+
+	SubWinTest(win);
+	/* Erase and draw green window */
+	set_colors(win, 4, COLOR_YELLOW, COLOR_GREEN);
+	wbkgd(win, use_colors(win, 4, A_BOLD));
+	werase(win);
+	wrefresh(win);
+	/* Draw RED bounding box */
+	use_colors(win, 2, A_NORMAL);
+	box(win, ' ', ' ');
+	wrefresh(win);
+	/* Display Australia map */
+	use_colors(win, 4, A_BOLD);
+	i = 0;
+	while (*AusMap[i]) {
+	    MvWAddStr(win, i + 1, 8, AusMap[i]);
+	    wrefresh(win);
+	    delay_output(50);
+	    ++i;
+	}
+
+	set_colors(win, 5, COLOR_BLUE, COLOR_WHITE);
+	use_colors(win, 5, A_BLINK);
+	MvWAddStr(win, height - 2, 6, " PDCurses 2.1 for DOS, OS/2 and Unix");
+	wrefresh(win);
+
+	/* Draw running messages */
+	set_colors(win, 6, COLOR_YELLOW, COLOR_WHITE);
+	message = messages[j = 0];
+	i = 1;
+	w = width - 2;
+	_nc_STRCPY(buffer, message, sizeof(buffer));
+	while (j < NMESSAGES) {
+	    while ((int) strlen(buffer) < w) {
+		_nc_STRCAT(buffer, " ... ", sizeof(buffer));
+		_nc_STRCAT(buffer, messages[++j % NMESSAGES], sizeof(buffer));
+	    }
+
+	    if (i < w)
+		(void) mvwaddnstr(win, height / 2, w - i, buffer, i);
+	    else
+		(void) mvwaddnstr(win, height / 2, 1, buffer, w);
+
+	    wrefresh(win);
+	    nodelay(win, TRUE);
+	    if (wgetch(win) != ERR) {
+		flushinp();
+		break;
+	    }
+	    if (i++ >= w) {
+		for (k = 0; (buffer[k] = buffer[k + 1]) != '\0'; k++) ;
+	    }
+	    delay_output(100);
+	}
+
+	j = 0;
+	/*  Draw running As across in RED */
+	set_colors(win, 7, COLOR_RED, COLOR_GREEN);
+	memset(save, ' ', sizeof(save));
+	for (i = 2; i < width - 4; ++i) {
+	    k = (int) mvwinch(win, 4, i);
+	    if (k == ERR)
+		break;
+	    save[j++] = c = (chtype) k;
+	    c &= A_CHARTEXT;
+	    MvWAddCh(win, 4, i, c);
+	}
+	wrefresh(win);
+
+	/* Put a message up wait for a key */
+	i = height - 2;
+	use_colors(win, 5, A_NORMAL);
+	MvWAddStr(win, i, 5, " Type a key to continue or 'Q' to quit ");
+	wrefresh(win);
+
+	if (WaitForUser(win) == 1)
+	    break;
+
+	j = 0;			/* Restore the old line */
+	for (i = 2; i < width - 4; ++i)
+	    MvWAddCh(win, 4, i, save[j++]);
+	wrefresh(win);
+
+	BouncingBalls(win);
+	/* Put a message up wait for a key */
+	i = height - 2;
+	use_colors(win, 5, A_NORMAL);
+	MvWAddStr(win, i, 5, " Type a key to continue or 'Q' to quit ");
+	wrefresh(win);
+	if (WaitForUser(win) == 1)
+	    break;
+    }
+    stop_curses();
+    ExitProgram(EXIT_SUCCESS);
+}
diff --git a/test/package/debian-mingw/compat b/test/package/debian-mingw/compat
new file mode 100644
index 0000000..48082f7
--- /dev/null
+++ b/test/package/debian-mingw/compat
@@ -0,0 +1 @@
+12
diff --git a/test/package/debian-mingw/control b/test/package/debian-mingw/control
new file mode 100644
index 0000000..116103d
--- /dev/null
+++ b/test/package/debian-mingw/control
@@ -0,0 +1,18 @@
+Source: ncurses-examples
+Maintainer: Thomas E. Dickey <dickey@invisible-island.net>
+Section: misc
+Priority: optional
+Standards-Version: 4.6.1.0
+Build-Depends: debhelper (>= 5)
+Homepage: https://invisible-island.net/ncurses/ncurses-examples.html
+
+Package: mingw32-ncurses-examples
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}
+Description: example/test programs from ncurses
+ These are the example/test programs from the ncurses distribution.
+ .
+ This package is used for testing ABI 6 with the MinGW 32-bit port.
+ .
+ This package installs in "bin/ncurses-examples" to avoid conflict with other
+ packages.
diff --git a/test/package/debian-mingw/copyright b/test/package/debian-mingw/copyright
new file mode 100644
index 0000000..3363a7e
--- /dev/null
+++ b/test/package/debian-mingw/copyright
@@ -0,0 +1,79 @@
+Upstream source https://invisible-island.net/ncurses/ncurses-examples.html
+
+Current ncurses maintainer: Thomas Dickey <dickey@invisible-island.net>
+
+-------------------------------------------------------------------------------
+Files: *
+Copyright: 2017-2021,2022 Thomas E. Dickey
+Copyright: 1998-2016,2017 Free Software Foundation, Inc.
+License: X11
+
+Files: aclocal.m4 package
+Copyright: 2003-2020,2021 by Thomas E. Dickey
+License: X11
+
+    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.
+
+-------------------------------------------------------------------------------
+Files: install-sh
+Copyright:  1994 X Consortium
+License: X11
+
+    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, 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
+    X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+    AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+    TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+    Except as contained in this notice, the name of the X Consortium shall not
+    be used in advertising or otherwise to promote the sale, use or other deal-
+    ings in this Software without prior written authorization from the X Consor-
+    tium.
+
+    FSF changes to this file are in the public domain.
+
+    Calling this script install-sh is preferred over install.sh, to prevent
+    `make' implicit rules from creating a file called install from it
+    when there is no Makefile.
+
+    This script is compatible with the BSD install script, but was written
+    from scratch.  It can only install one file at a time, a restriction
+    shared with many OS's install programs.
+
+On Debian systems, the complete text of the GNU General
+Public License can be found in '/usr/share/common-licenses/GPL-2'
+
+-- vile: txtmode file-encoding=utf-8
diff --git a/test/package/debian-mingw/docs b/test/package/debian-mingw/docs
new file mode 100644
index 0000000..e845566
--- /dev/null
+++ b/test/package/debian-mingw/docs
@@ -0,0 +1 @@
+README
diff --git a/test/package/debian-mingw/rules b/test/package/debian-mingw/rules
new file mode 100755
index 0000000..152cd3c
--- /dev/null
+++ b/test/package/debian-mingw/rules
@@ -0,0 +1,101 @@
+#!/usr/bin/make -f
+# Made with the aid of dh_make, by Craig Small
+# Sample debian/rules that uses debhelper. GNU copyright 1997 by Joey Hess.
+# Some lines taken from debmake, by Cristoph Lameter.
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+# These are used for cross-compiling and for saving the configure script
+# from having to guess our platform (since we know it already)
+DEB_HOST_GNU_TYPE   ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
+DEB_BUILD_GNU_TYPE  ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
+
+CC_NORMAL = -Wall -Wstrict-prototypes -Wmissing-prototypes -Wshadow -Wconversion
+CC_STRICT = $(CC_NORMAL) -W -Wbad-function-cast -Wcast-align -Wcast-qual -Wmissing-declarations -Wnested-externs -Wpointer-arith -Wwrite-strings -ansi -pedantic
+
+NCURSES_PKG = ncurses-examples
+
+TARGET    = i686-w64-mingw32
+MINGW_BIN = /usr/bin
+MINGW_TOP = /usr/$(TARGET)
+MINGW_TMP = $(CURDIR)/debian/mingw32-ncurses-examples
+
+CFLAGS = $(CC_NORMAL)
+
+ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
+        CFLAGS += -O0
+else
+        CFLAGS += -O2
+endif
+ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS)))
+        INSTALL_PROGRAM += -s
+endif
+
+
+configure: configure-stamp
+configure-stamp:
+	dh_testdir
+
+	CFLAGS="$(CFLAGS)" ./configure \
+		--host=$(TARGET) \
+		--target=$(TARGET) \
+		--prefix=$(MINGW_TOP) \
+		--bindir=\$${prefix}/bin/$(NCURSES_PKG) \
+		--datadir=\$${prefix}/share/$(NCURSES_PKG) \
+		--with-screen=ncursesw6 \
+		--with-pkg-config-libdir=/usr/$(TARGET)/lib/pkgconfig
+
+	touch configure-stamp
+
+build: build-stamp
+build-stamp: configure-stamp
+	dh_testdir
+
+	$(MAKE)
+
+	touch build-stamp
+
+clean:
+	dh_testdir
+	dh_testroot
+
+	[ ! -f makefile ] || $(MAKE) distclean
+
+	rm -f configure-stamp build-stamp install-stamp
+
+	dh_clean
+
+install: install-stamp
+install-stamp: build-stamp
+	dh_testdir
+	dh_testroot
+	dh_prep
+	dh_installdirs
+
+	$(MAKE) install DESTDIR=$(MINGW_TMP)
+
+	touch install-stamp
+
+# Build architecture-independent files here.
+binary-indep: build install
+# No binary-indep target.
+
+# Build architecture-dependent files here.
+binary-arch: build install
+	dh_testdir
+	dh_testroot
+	dh_installdocs
+	dh_installexamples
+	dh_installchangelogs NEWS
+	dh_strip
+	dh_compress
+	dh_fixperms
+	dh_installdeb
+	dh_shlibdeps
+	dh_gencontrol
+	dh_md5sums
+	dh_builddeb
+
+binary: binary-indep binary-arch
+.PHONY: build clean binary-indep binary-arch binary install install-stamp
diff --git a/test/package/debian-mingw/source/format b/test/package/debian-mingw/source/format
new file mode 100644
index 0000000..89ae9db
--- /dev/null
+++ b/test/package/debian-mingw/source/format
@@ -0,0 +1 @@
+3.0 (native)
diff --git a/test/package/debian-mingw/watch b/test/package/debian-mingw/watch
new file mode 100644
index 0000000..ec075b1
--- /dev/null
+++ b/test/package/debian-mingw/watch
@@ -0,0 +1,4 @@
+version=3
+
+opts=passive ftp://ftp.invisible-island.net/ncurses-examples/ncurses-examples-([\d.]+)\.tgz \
+ debian  uupdate
diff --git a/test/package/debian-mingw64/compat b/test/package/debian-mingw64/compat
new file mode 100644
index 0000000..48082f7
--- /dev/null
+++ b/test/package/debian-mingw64/compat
@@ -0,0 +1 @@
+12
diff --git a/test/package/debian-mingw64/control b/test/package/debian-mingw64/control
new file mode 100644
index 0000000..df942b7
--- /dev/null
+++ b/test/package/debian-mingw64/control
@@ -0,0 +1,18 @@
+Source: ncurses-examples
+Maintainer: Thomas E. Dickey <dickey@invisible-island.net>
+Section: misc
+Priority: optional
+Standards-Version: 4.6.1.0
+Build-Depends: debhelper (>= 5)
+Homepage: https://invisible-island.net/ncurses/ncurses-examples.html
+
+Package: mingw64-ncurses-examples
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}
+Description: example/test programs from ncurses
+ These are the example/test programs from the ncurses distribution.
+ .
+ This package is used for testing ABI 6 with the MinGW 64-bit port.
+ .
+ This package installs in "bin/ncurses-examples" to avoid conflict with other
+ packages.
diff --git a/test/package/debian-mingw64/copyright b/test/package/debian-mingw64/copyright
new file mode 100644
index 0000000..3363a7e
--- /dev/null
+++ b/test/package/debian-mingw64/copyright
@@ -0,0 +1,79 @@
+Upstream source https://invisible-island.net/ncurses/ncurses-examples.html
+
+Current ncurses maintainer: Thomas Dickey <dickey@invisible-island.net>
+
+-------------------------------------------------------------------------------
+Files: *
+Copyright: 2017-2021,2022 Thomas E. Dickey
+Copyright: 1998-2016,2017 Free Software Foundation, Inc.
+License: X11
+
+Files: aclocal.m4 package
+Copyright: 2003-2020,2021 by Thomas E. Dickey
+License: X11
+
+    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.
+
+-------------------------------------------------------------------------------
+Files: install-sh
+Copyright:  1994 X Consortium
+License: X11
+
+    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, 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
+    X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+    AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+    TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+    Except as contained in this notice, the name of the X Consortium shall not
+    be used in advertising or otherwise to promote the sale, use or other deal-
+    ings in this Software without prior written authorization from the X Consor-
+    tium.
+
+    FSF changes to this file are in the public domain.
+
+    Calling this script install-sh is preferred over install.sh, to prevent
+    `make' implicit rules from creating a file called install from it
+    when there is no Makefile.
+
+    This script is compatible with the BSD install script, but was written
+    from scratch.  It can only install one file at a time, a restriction
+    shared with many OS's install programs.
+
+On Debian systems, the complete text of the GNU General
+Public License can be found in '/usr/share/common-licenses/GPL-2'
+
+-- vile: txtmode file-encoding=utf-8
diff --git a/test/package/debian-mingw64/docs b/test/package/debian-mingw64/docs
new file mode 100644
index 0000000..e845566
--- /dev/null
+++ b/test/package/debian-mingw64/docs
@@ -0,0 +1 @@
+README
diff --git a/test/package/debian-mingw64/rules b/test/package/debian-mingw64/rules
new file mode 100755
index 0000000..02175a6
--- /dev/null
+++ b/test/package/debian-mingw64/rules
@@ -0,0 +1,101 @@
+#!/usr/bin/make -f
+# Made with the aid of dh_make, by Craig Small
+# Sample debian/rules that uses debhelper. GNU copyright 1997 by Joey Hess.
+# Some lines taken from debmake, by Cristoph Lameter.
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+# These are used for cross-compiling and for saving the configure script
+# from having to guess our platform (since we know it already)
+DEB_HOST_GNU_TYPE   ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
+DEB_BUILD_GNU_TYPE  ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
+
+CC_NORMAL = -Wall -Wstrict-prototypes -Wmissing-prototypes -Wshadow -Wconversion
+CC_STRICT = $(CC_NORMAL) -W -Wbad-function-cast -Wcast-align -Wcast-qual -Wmissing-declarations -Wnested-externs -Wpointer-arith -Wwrite-strings -ansi -pedantic
+
+NCURSES_PKG = ncurses-examples
+
+TARGET    = x86_64-w64-mingw32
+MINGW_BIN = /usr/bin
+MINGW_TOP = /usr/$(TARGET)
+MINGW_TMP = $(CURDIR)/debian/mingw64-ncurses-examples
+
+CFLAGS = $(CC_NORMAL)
+
+ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
+        CFLAGS += -O0
+else
+        CFLAGS += -O2
+endif
+ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS)))
+        INSTALL_PROGRAM += -s
+endif
+
+
+configure: configure-stamp
+configure-stamp:
+	dh_testdir
+
+	CFLAGS="$(CFLAGS)" ./configure \
+		--host=$(TARGET) \
+		--target=$(TARGET) \
+		--prefix=$(MINGW_TOP) \
+		--bindir=\$${prefix}/bin/$(NCURSES_PKG) \
+		--datadir=\$${prefix}/share/$(NCURSES_PKG) \
+		--with-screen=ncursesw6 \
+		--with-pkg-config-libdir=/usr/$(TARGET)/lib/pkgconfig
+
+	touch configure-stamp
+
+build: build-stamp
+build-stamp: configure-stamp
+	dh_testdir
+
+	$(MAKE)
+
+	touch build-stamp
+
+clean:
+	dh_testdir
+	dh_testroot
+
+	[ ! -f makefile ] || $(MAKE) distclean
+
+	rm -f configure-stamp build-stamp install-stamp
+
+	dh_clean
+
+install: install-stamp
+install-stamp: build-stamp
+	dh_testdir
+	dh_testroot
+	dh_prep
+	dh_installdirs
+
+	$(MAKE) install DESTDIR=$(MINGW_TMP)
+
+	touch install-stamp
+
+# Build architecture-independent files here.
+binary-indep: build install
+# No binary-indep target.
+
+# Build architecture-dependent files here.
+binary-arch: build install
+	dh_testdir
+	dh_testroot
+	dh_installdocs
+	dh_installexamples
+	dh_installchangelogs NEWS
+	dh_strip
+	dh_compress
+	dh_fixperms
+	dh_installdeb
+	dh_shlibdeps
+	dh_gencontrol
+	dh_md5sums
+	dh_builddeb
+
+binary: binary-indep binary-arch
+.PHONY: build clean binary-indep binary-arch binary install install-stamp
diff --git a/test/package/debian-mingw64/source/format b/test/package/debian-mingw64/source/format
new file mode 100644
index 0000000..89ae9db
--- /dev/null
+++ b/test/package/debian-mingw64/source/format
@@ -0,0 +1 @@
+3.0 (native)
diff --git a/test/package/debian-mingw64/watch b/test/package/debian-mingw64/watch
new file mode 100644
index 0000000..ec075b1
--- /dev/null
+++ b/test/package/debian-mingw64/watch
@@ -0,0 +1,4 @@
+version=3
+
+opts=passive ftp://ftp.invisible-island.net/ncurses-examples/ncurses-examples-([\d.]+)\.tgz \
+ debian  uupdate
diff --git a/test/package/debian/compat b/test/package/debian/compat
new file mode 100644
index 0000000..48082f7
--- /dev/null
+++ b/test/package/debian/compat
@@ -0,0 +1 @@
+12
diff --git a/test/package/debian/control b/test/package/debian/control
new file mode 100644
index 0000000..89de1b8
--- /dev/null
+++ b/test/package/debian/control
@@ -0,0 +1,26 @@
+Source: ncurses-examples
+Maintainer: Thomas E. Dickey <dickey@invisible-island.net>
+Section: misc
+Priority: optional
+Standards-Version: 4.6.1.0
+Build-Depends: debhelper (>= 5)
+Homepage: https://invisible-island.net/ncurses/ncurses-examples.html
+
+Package: ncurses-examples
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}
+Description: example/test programs from ncurses
+ These are the example/test programs from the ncurses distribution.
+ .
+ This package installs in "bin/ncurses-examples" to avoid conflict with other
+ packages.
+
+Package: ncursest-examples
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}
+Description: example/test programs from ncurses
+ These are the example/test programs from the ncurses distribution, using
+ the thread configuration.
+ .
+ This package installs in "bin/ncursest-examples" to avoid conflict with other
+ packages.
diff --git a/test/package/debian/copyright b/test/package/debian/copyright
new file mode 100644
index 0000000..241c1ff
--- /dev/null
+++ b/test/package/debian/copyright
@@ -0,0 +1,79 @@
+Upstream source https://invisible-island.net/ncurses/ncurses-examples.html
+
+Current ncurses maintainer: Thomas Dickey <dickey@invisible-island.net>
+
+-------------------------------------------------------------------------------
+Files: *
+Copyright: 2017-2021,2022 Thomas E. Dickey
+Copyright: 1998-2016,2017 Free Software Foundation, Inc.
+License: X11
+
+Files: aclocal.m4 package
+Copyright: 2003-2019,2020 by Thomas E. Dickey
+License: X11
+
+    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.
+
+-------------------------------------------------------------------------------
+Files: install-sh
+Copyright:  1994 X Consortium
+License: X11
+
+    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, 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
+    X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+    AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+    TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+    Except as contained in this notice, the name of the X Consortium shall not
+    be used in advertising or otherwise to promote the sale, use or other deal-
+    ings in this Software without prior written authorization from the X Consor-
+    tium.
+
+    FSF changes to this file are in the public domain.
+
+    Calling this script install-sh is preferred over install.sh, to prevent
+    `make' implicit rules from creating a file called install from it
+    when there is no Makefile.
+
+    This script is compatible with the BSD install script, but was written
+    from scratch.  It can only install one file at a time, a restriction
+    shared with many OS's install programs.
+
+On Debian systems, the complete text of the GNU General
+Public License can be found in '/usr/share/common-licenses/GPL-2'
+
+-- vile: txtmode file-encoding=utf-8
diff --git a/test/package/debian/docs b/test/package/debian/docs
new file mode 100644
index 0000000..e845566
--- /dev/null
+++ b/test/package/debian/docs
@@ -0,0 +1 @@
+README
diff --git a/test/package/debian/rules b/test/package/debian/rules
new file mode 100755
index 0000000..2cc34f7
--- /dev/null
+++ b/test/package/debian/rules
@@ -0,0 +1,167 @@
+#!/usr/bin/make -f
+# Made with the aid of dh_make, by Craig Small
+# Sample debian/rules that uses debhelper. GNU copyright 1997 by Joey Hess.
+# Some lines taken from debmake, by Cristoph Lameter.
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+# packages
+NCURSES_PKG = ncurses-examples
+NCURSEST_PKG = ncursest-examples
+
+PACKAGES.indep = # ncurses-examples-docs
+PACKAGES.arch  = $(NCURSES_PKG) $(NCURSEST_PKG)
+
+# These are used for cross-compiling and for saving the configure script
+# from having to guess our platform (since we know it already)
+DEB_HOST_GNU_TYPE   ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
+DEB_BUILD_GNU_TYPE  ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
+
+CFLAGS   = $(shell dpkg-buildflags --get CFLAGS)
+CPPFLAGS = $(shell dpkg-buildflags --get CPPFLAGS)
+LDFLAGS  = $(shell dpkg-buildflags --get LDFLAGS)
+
+ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
+        CFLAGS += -O0
+else
+        CFLAGS += -O2
+endif
+ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS)))
+        INSTALL_PROGRAM += -s
+endif
+
+verbose = # -v
+
+configure = \
+	CFLAGS="$(CFLAGS)" \
+	CPPFLAGS="$(CPPFLAGS)" \
+	LDFLAGS="$(LDFLAGS)" ../../configure \
+		--host=$(DEB_HOST_GNU_TYPE) \
+		--build=$(DEB_BUILD_GNU_TYPE) \
+		--prefix=/usr \
+		--disable-rpath-hack
+
+.PHONY: all config build install binary clean config-indep config-arch \
+    build-indep build-arch install-indep install-arch binary-indep \
+    binary-arch
+
+all: build
+
+config: config-indep config-arch
+build: build-indep build-arch
+install: install-indep install-arch
+binary: binary-indep binary-arch
+clean:
+	dh_testdir
+	dh_testroot
+	dh_clean $(verbose)
+	rm -rf t
+
+config-indep: $(PACKAGES.indep:%=config-%-stamp)
+config-arch: $(PACKAGES.arch:%=config-%-stamp)
+
+build-indep: $(PACKAGES.indep:%=build-%-stamp)
+build-arch: $(PACKAGES.arch:%=build-%-stamp)
+
+install-indep: $(PACKAGES.indep:%=install-%-stamp)
+install-arch: $(PACKAGES.arch:%=install-%-stamp)
+
+config-$(NCURSES_PKG)-stamp:
+	dh_testdir
+
+	rm -rf t/ncurses6
+	mkdir -p t/ncurses6
+
+	cd t/ncurses6; $(configure) \
+		--datadir=\$${datarootdir}/$(NCURSES_PKG) \
+		--with-screen=ncursesw6
+
+	touch $@
+
+config-$(NCURSEST_PKG)-stamp:
+	dh_testdir
+
+	rm -rf t/ncursest6
+	mkdir -p t/ncursest6
+
+	cd t/ncursest6; $(configure) \
+		--datadir=\$${datarootdir}/$(NCURSEST_PKG) \
+		--with-screen=ncursestw6
+
+	touch $@
+
+build-$(NCURSES_PKG)-stamp: config-$(NCURSES_PKG)-stamp
+	dh_testdir
+
+	$(MAKE) -C t/ncurses6
+
+	touch $@
+
+build-$(NCURSEST_PKG)-stamp: config-$(NCURSEST_PKG)-stamp
+	dh_testdir
+
+	$(MAKE) -C t/ncursest6
+
+	touch $@
+
+install-$(NCURSES_PKG)-stamp: build-$(NCURSES_PKG)-stamp
+	dh_testdir
+	dh_testroot
+	dh_installdirs $(verbose)
+	dh_prep        $(verbose) -p$(NCURSES_PKG)
+
+	$(MAKE) -C t/ncurses6 install \
+		PACKAGE=$(NCURSES_PKG) \
+		DESTDIR=$(CURDIR)/debian/$(NCURSES_PKG)
+
+	touch $@
+
+install-$(NCURSEST_PKG)-stamp: build-$(NCURSEST_PKG)-stamp
+	dh_testdir
+	dh_testroot
+	dh_installdirs $(verbose)
+	dh_prep        $(verbose) -p$(NCURSEST_PKG)
+
+	$(MAKE) -C t/ncursest6 install \
+		PACKAGE=$(NCURSEST_PKG) \
+		DESTDIR=$(CURDIR)/debian/$(NCURSEST_PKG)
+
+	touch $@
+
+# Build architecture-independent files here.
+binary-indep: install-indep
+ifneq ($(PACKAGES.indep),)
+	rm -f $(PACKAGES.indep:%=install-%-stamp)
+	dh_testdir
+	dh_testroot
+	dh_installdocs       $(verbose) $(PACKAGES.indep:%=-p%)
+	dh_installman        $(verbose) $(PACKAGES.indep:%=-p%)
+	dh_installexamples   $(verbose) $(PACKAGES.indep:%=-p%)
+	dh_installchangelogs $(verbose) $(PACKAGES.indep:%=-p%) NEWS
+	dh_compress          $(verbose) $(PACKAGES.indep:%=-p%)
+	dh_fixperms          $(verbose) $(PACKAGES.indep:%=-p%)
+	dh_installdeb        $(verbose) $(PACKAGES.indep:%=-p%)
+	dh_gencontrol        $(verbose) $(PACKAGES.indep:%=-p%)
+	dh_md5sums           $(verbose) $(PACKAGES.indep:%=-p%)
+	dh_builddeb          $(verbose) $(PACKAGES.indep:%=-p%)
+endif
+
+# Build architecture-dependent files here.
+binary-arch: install-arch
+ifneq ($(PACKAGES.arch),)
+	rm -f $(PACKAGES.arch:%=install-%-stamp)
+	dh_testdir
+	dh_testroot
+	dh_installdocs       $(verbose) $(PACKAGES.arch:%=-p%)
+	dh_installchangelogs $(verbose) $(PACKAGES.arch:%=-p%)  NEWS
+	dh_strip             $(verbose) $(PACKAGES.arch:%=-p%)
+	dh_compress          $(verbose) $(PACKAGES.arch:%=-p%)
+	dh_fixperms          $(verbose) $(PACKAGES.arch:%=-p%)
+	dh_installdeb        $(verbose) $(PACKAGES.arch:%=-p%)
+	dh_makeshlibs        $(verbose) $(PACKAGES.arch:%=-p%)
+	dh_shlibdeps         $(verbose) $(PACKAGES.arch:%=-p%)
+	dh_gencontrol        $(verbose) $(PACKAGES.arch:%=-p%)
+	dh_md5sums           $(verbose) $(PACKAGES.arch:%=-p%)
+	dh_builddeb          $(verbose) $(PACKAGES.arch:%=-p%)
+endif
diff --git a/test/package/debian/source/format b/test/package/debian/source/format
new file mode 100644
index 0000000..89ae9db
--- /dev/null
+++ b/test/package/debian/source/format
@@ -0,0 +1 @@
+3.0 (native)
diff --git a/test/package/debian/watch b/test/package/debian/watch
new file mode 100644
index 0000000..ec075b1
--- /dev/null
+++ b/test/package/debian/watch
@@ -0,0 +1,4 @@
+version=3
+
+opts=passive ftp://ftp.invisible-island.net/ncurses-examples/ncurses-examples-([\d.]+)\.tgz \
+ debian  uupdate
diff --git a/test/package/mingw-ncurses-examples.spec b/test/package/mingw-ncurses-examples.spec
new file mode 100644
index 0000000..cad43d1
--- /dev/null
+++ b/test/package/mingw-ncurses-examples.spec
@@ -0,0 +1,123 @@
+Summary: ncurses-examples - example/test programs from ncurses
+%?mingw_package_header
+
+%global AppProgram ncurses-examples
+%global AppVersion MAJOR.MINOR
+%global AppRelease YYYYMMDD
+# $Id: mingw-ncurses-examples.spec,v 1.10 2021/06/17 21:11:12 tom Exp $
+Name: mingw32-ncurses6-examples
+Version: %{AppVersion}
+Release: %{AppRelease}
+License: X11
+Group: Development/Libraries
+Source: ncurses-examples-%{release}.tgz
+# URL: https://invisible-island.net/ncurses/
+
+BuildRequires:  mingw32-ncurses6
+
+BuildRequires:  mingw32-filesystem >= 95
+BuildRequires:  mingw32-gcc
+BuildRequires:  mingw32-binutils
+
+BuildRequires:  mingw64-ncurses6
+
+BuildRequires:  mingw64-filesystem >= 95
+BuildRequires:  mingw64-gcc
+BuildRequires:  mingw64-binutils
+
+%define CC_NORMAL -Wall -Wstrict-prototypes -Wmissing-prototypes -Wshadow -Wconversion
+%define CC_STRICT %{CC_NORMAL} -W -Wbad-function-cast -Wcast-align -Wcast-qual -Wmissing-declarations -Wnested-externs -Wpointer-arith -Wwrite-strings -ansi -pedantic
+
+%description -n mingw32-ncurses6-examples
+Cross-compiling support for ncurses to mingw32.
+
+The ncurses library routines are a terminal-independent method of
+updating character screens with reasonable optimization.
+
+This package is used for testing ABI 6 with cross-compiles to MinGW.
+
+%package -n mingw64-ncurses6-examples
+Summary:        Curses library for MinGW64
+
+%description -n mingw64-ncurses6-examples
+Cross-compiling support for ncurses to mingw64.
+
+The ncurses library routines are a terminal-independent method of
+updating character screens with reasonable optimization.
+
+This package is used for testing ABI 6 with cross-compiles to MinGW.
+
+%prep
+
+# override location of bindir, e.g., to avoid conflict with pdcurses
+%global mingw32_bindir %{mingw32_exec_prefix}/bin/%{AppProgram}
+%global mingw64_bindir %{mingw64_exec_prefix}/bin/%{AppProgram}
+
+%global mingw32_datadir %{mingw32_datadir}/%{AppProgram}
+%global mingw64_datadir %{mingw64_datadir}/%{AppProgram}
+
+%define CFG_OPTS \\\
+        --enable-echo \\\
+        --enable-warnings \\\
+        --verbose \\\
+        --with-screen=ncursesw6
+
+%define debug_package %{nil}
+%setup -q -n ncurses-examples-%{release}
+
+%build
+mkdir BUILD-W32
+pushd BUILD-W32
+CFLAGS="%{CC_NORMAL}" \
+CC=%{mingw32_cc} \
+NCURSES_CONFIG_SUFFIX=dev \
+%mingw32_configure %{CFG_OPTS} \
+        --datadir=%{mingw32_datadir}
+make
+popd
+
+mkdir BUILD-W64
+pushd BUILD-W64
+CFLAGS="%{CC_NORMAL}" \
+CC=%{mingw64_cc} \
+%mingw64_configure %{CFG_OPTS} \
+        --datadir=%{mingw32_datadir}
+make
+popd
+
+%install
+rm -rf $RPM_BUILD_ROOT
+
+pushd BUILD-W32
+%{mingw32_make} install DESTDIR=$RPM_BUILD_ROOT
+popd
+
+pushd BUILD-W64
+%{mingw64_make} install DESTDIR=$RPM_BUILD_ROOT
+popd
+
+%clean
+if rm -rf $RPM_BUILD_ROOT; then
+  echo OK
+else
+  find $RPM_BUILD_ROOT -type f | grep -F -v /.nfs && exit 1
+fi
+exit 0
+
+%defattr(-,root,root,-)
+
+%files -n mingw32-ncurses6-examples
+%{mingw32_bindir}/*
+%{mingw32_datadir}/*
+
+%files -n mingw64-ncurses6-examples
+%{mingw64_bindir}/*
+%{mingw64_datadir}/*
+
+%changelog
+
+* Sat Nov 16 2019 Thomas Dickey
+- modify clean-rule to work around Fedora NFS bugs.
+
+* Sat Oct 19 2013 Thomas E. Dickey
+- initial version
diff --git a/test/package/ncurses-examples.spec b/test/package/ncurses-examples.spec
new file mode 100644
index 0000000..1a045ed
--- /dev/null
+++ b/test/package/ncurses-examples.spec
@@ -0,0 +1,121 @@
+Summary: example/test programs from ncurses
+%global AppProgram ncurses-examples
+%global AltProgram ncursest-examples
+%global AppVersion MAJOR.MINOR
+%global AppRelease YYYYMMDD
+# $Id: ncurses-examples.spec,v 1.21 2021/12/19 00:13:46 tom Exp $
+Name: %{AppProgram}
+Version: %{AppVersion}
+Release: %{AppRelease}
+License: MIT
+Group: Applications/Development
+URL: ftp://ftp.invisible-island.net/pub/%{AppProgram}
+Source0: %{AppProgram}-%{AppRelease}.tgz
+Packager: Thomas Dickey <dickey@invisible-island.net>
+
+%description
+These are the example/test programs from the ncurses MAJOR.MINOR distribution,
+for patch-date YYYYMMDD.
+
+This package installs in "bin/%{AppProgram}" to avoid conflict with other
+packages.
+
+%package -n %{AltProgram}
+Summary:  examples/test programs from ncurses with POSIX thread support
+
+%description -n %{AltProgram}
+These are the example/test programs from the ncurses MAJOR.MINOR distribution,
+for patch-date YYYYMMDD, using the "ncurseswt" library to demonstrate the
+use of POSIX threads, e.g., in ditto, rain, and worm.
+
+This package installs in "bin/%{AltProgram}" to avoid conflict with other
+packages.
+
+%prep
+
+%setup -q -n %{AppProgram}-%{AppRelease}
+
+%define debug_package %{nil}
+
+%build
+
+%global _configure ../configure
+%define my_srcdir ..
+
+mkdir BUILD-%{AppProgram}
+pushd BUILD-%{AppProgram}
+INSTALL_PROGRAM='${INSTALL}' \
+NCURSES_CONFIG_SUFFIX=dev \
+CONFIGURE_TOP=%{my_srcdir} \
+%configure \
+	--target %{_target_platform} \
+	--prefix=%{_prefix} \
+	--datadir=%{_datarootdir}/%{AppProgram} \
+	--with-screen=ncursesw6dev \
+	--disable-rpath-hack
+
+make
+popd
+
+mkdir BUILD-%{AltProgram}
+pushd BUILD-%{AltProgram}
+INSTALL_PROGRAM='${INSTALL}' \
+NCURSES_CONFIG_SUFFIX=dev \
+CONFIGURE_TOP=%{my_srcdir} \
+%configure \
+	--target %{_target_platform} \
+	--prefix=%{_prefix} \
+	--datadir=%{_datarootdir}/%{AltProgram} \
+	--with-screen=ncursestw6dev \
+	--disable-rpath-hack
+
+make
+popd
+
+%install
+[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT
+
+pushd BUILD-%{AppProgram}
+make install PACKAGE=%{AppProgram} DESTDIR=$RPM_BUILD_ROOT
+popd
+
+pushd BUILD-%{AltProgram}
+make install PACKAGE=%{AltProgram} DESTDIR=$RPM_BUILD_ROOT
+popd
+
+%clean
+if rm -rf $RPM_BUILD_ROOT; then
+  echo OK
+else
+  find $RPM_BUILD_ROOT -type f | grep -F -v /.nfs && exit 1
+fi
+exit 0
+
+%files -n %{AppProgram}
+%defattr(-,root,root)
+%{_bindir}/%{AppProgram}
+%{_libexecdir}/%{AppProgram}/*
+%{_datarootdir}/%{AppProgram}/*
+
+%files -n %{AltProgram}
+%defattr(-,root,root)
+%{_bindir}/%{AltProgram}
+%{_libexecdir}/%{AltProgram}/*
+%{_datarootdir}/%{AltProgram}/*
+
+%changelog
+# each patch should add its ChangeLog entries here
+
+* Sat Dec 18 2021 Thomas Dickey
+- use libexecdir for programs rather than subdir of bindir
+
+* Sat Nov 16 2019 Thomas Dickey
+- modify clean-rule to work around Fedora NFS bugs.
+
+* Sat Nov 11 2017 Thomas Dickey
+- add example data-files
+- use rpm built-in "configure"
+- suppress debug-package
+
+* Thu Mar 25 2010 Thomas Dickey
+- initial version
diff --git a/test/padview.c b/test/padview.c
new file mode 100644
index 0000000..0defee3
--- /dev/null
+++ b/test/padview.c
@@ -0,0 +1,550 @@
+/****************************************************************************
+ * Copyright 2019-2021,2022 Thomas E. Dickey                                *
+ * Copyright 2017 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.                                                           *
+ ****************************************************************************/
+/*
+ * clone of view.c, using pads
+ *
+ * $Id: padview.c,v 1.22 2022/12/04 00:40:11 tom Exp $
+ */
+
+#include <test.priv.h>
+#include <widechars.h>
+#include <popup_msg.h>
+
+#include <sys/stat.h>
+#include <time.h>
+
+#if HAVE_NEWPAD
+
+static GCC_NORETURN void finish(int sig);
+
+#define my_pair 1
+
+static WINDOW *global_pad;
+static int shift = 0;
+static bool try_color = FALSE;
+
+static char *fname;
+static int num_lines;
+
+#if USE_WIDEC_SUPPORT
+static bool n_option = FALSE;
+#endif
+
+static void
+failed(const char *msg)
+{
+    endwin();
+    fprintf(stderr, "%s\n", msg);
+    ExitProgram(EXIT_FAILURE);
+}
+
+static void
+finish(int sig)
+{
+    endwin();
+    if (global_pad != NULL)
+	delwin(global_pad);
+    ExitProgram(sig != 0 ? EXIT_FAILURE : EXIT_SUCCESS);
+}
+
+static void
+show_all(const char *tag, WINDOW *my_pad, int my_row)
+{
+    int i;
+    int digits;
+    char temp[BUFSIZ];
+    time_t this_time;
+
+    for (digits = 1, i = num_lines; i > 0; i /= 10) {
+	++digits;
+    }
+
+    wattrset(stdscr, COLOR_PAIR(my_pair));
+    clear();
+
+    _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp))
+		"view %.*s", (int) strlen(tag), tag);
+    i = (int) strlen(temp);
+    _nc_SPRINTF(temp + i, _nc_SLIMIT(sizeof(temp) - (size_t) i)
+		" %.*s", (int) sizeof(temp) - i - 2, fname);
+    mvprintw(0, 0, "%.*s", COLS, temp);
+    this_time = time((time_t *) 0);
+    _nc_STRNCPY(temp, ctime(&this_time), (size_t) 30);
+    if ((i = (int) strlen(temp)) != 0) {
+	temp[--i] = 0;
+	mvprintw(0, COLS - i - 2, "  %s", temp);
+    }
+
+    for (i = 1; i < LINES; i++) {
+	int actual = my_row + i;
+	if (actual > num_lines) {
+	    break;
+	}
+	mvprintw(i, 0, "%*d:", digits, actual);
+    }
+    wnoutrefresh(stdscr);
+    pnoutrefresh(my_pad, my_row, shift, 1, digits + 1, LINES - 1, COLS - 1);
+    doupdate();
+}
+
+static WINDOW *
+read_file(const char *filename)
+{
+    FILE *fp;
+    int pass;
+    int k;
+    int height, width;
+    size_t j;
+    size_t len;
+    struct stat sb;
+    char *my_blob;
+    char **my_vec = 0;
+    WINDOW *my_pad;
+
+    if (stat(filename, &sb) != 0
+	|| (sb.st_mode & S_IFMT) != S_IFREG) {
+	failed("input is not a file");
+    }
+
+    if (sb.st_size == 0) {
+	failed("input is empty");
+    }
+
+    if ((fp = fopen(filename, "r")) == 0) {
+	failed("cannot open input-file");
+    }
+
+    if ((my_blob = malloc((size_t) sb.st_size + 1)) == 0) {
+	failed("cannot allocate memory for input-file");
+    }
+
+    len = fread(my_blob, sizeof(char), (size_t) sb.st_size, fp);
+    fclose(fp);
+
+    if (len > (size_t) sb.st_size)
+	len = (size_t) sb.st_size;
+    my_blob[len] = '\0';
+
+    for (pass = 0; pass < 2; ++pass) {
+	char *base = my_blob;
+	k = 0;
+	for (j = 0; j < len; ++j) {
+	    if (my_blob[j] == '\n') {
+		if (pass) {
+		    my_vec[k] = base;
+		    my_blob[j] = '\0';
+		}
+		base = my_blob + j + 1;
+		++k;
+	    }
+	}
+	if (base != (my_blob + j)) {
+	    if (pass)
+		my_vec[k] = base;
+	    ++k;
+	}
+	num_lines = k;
+	if (pass == 0) {
+	    if (((my_vec = typeCalloc(char *, (size_t) k + 2)) == 0)) {
+		failed("cannot allocate line-vector #1");
+	    }
+	} else {
+	    if (my_vec[0] == NULL)
+		my_vec[0] = my_blob;
+	}
+    }
+
+#if USE_WIDEC_SUPPORT
+    if (!memcmp("\357\273\277", my_blob, 3)) {
+	char *s = my_blob + 3;
+	char *d = my_blob;
+	Trace(("trim BOM"));
+	do {
+	} while ((*d++ = *s++) != '\0');
+    }
+#endif
+
+    height = num_lines;
+    width = (int) strlen(my_vec[0]);
+    for (k = 1; my_vec[k]; ++k) {
+	int check = (int) (my_vec[k] - my_vec[k - 1]);
+	if (width < check)
+	    width = check;
+    }
+    width = (width + 1) * 5;
+    my_pad = newpad(height, width);
+    if (my_pad == 0)
+	failed("cannot allocate pad workspace");
+    if (try_color) {
+	wattrset(my_pad, COLOR_PAIR(my_pair));
+	wbkgd(my_pad, (chtype) (' ' | COLOR_PAIR(my_pair)));
+    }
+
+    /*
+     * Use the curses library for rendering, including tab-conversion.
+     */
+    Trace(("slurp the file"));
+    for (k = 0; my_vec[k]; ++k) {
+	char *s;
+#if USE_WIDEC_SUPPORT
+	char *last = my_vec[k] + (int) strlen(my_vec[k]);
+	wchar_t wch[2];
+	size_t rc;
+#ifndef state_unused
+	mbstate_t state;
+#endif
+#endif /* USE_WIDEC_SUPPORT */
+
+	wmove(my_pad, k, 0);
+#if USE_WIDEC_SUPPORT
+	wch[1] = 0;
+	reset_mbytes(state);
+#endif
+	for (s = my_vec[k]; *s != '\0'; ++s) {
+#if USE_WIDEC_SUPPORT
+	    if (!n_option) {
+		rc = (size_t) check_mbytes(wch[0], s, (size_t) (last - s), state);
+		if ((long) rc == -1 || (long) rc == -2) {
+		    break;
+		}
+		s += rc - 1;
+		waddwstr(my_pad, wch);
+	    } else
+#endif
+		waddch(my_pad, *s & 0xff);
+	}
+    }
+
+    free(my_vec);
+    free(my_blob);
+
+    return my_pad;
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: view [options] file"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+	," -c       use color if terminal supports it"
+	," -i       ignore INT, QUIT, TERM signals"
+#if USE_WIDEC_SUPPORT
+	," -n       use waddch (bytes) rather then wadd_wch (wide-chars)"
+#endif
+	," -s       start in single-step mode, waiting for input"
+#ifdef TRACE
+	," -t       trace screen updates"
+	," -T NUM   specify trace mask"
+#endif
+    };
+    size_t n;
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    static const char *help[] =
+    {
+	"Commands:",
+	"  q,^Q,ESC       - quit this program",
+	"",
+	"  p,<Up>         - scroll the viewport up by one row",
+	"  n,<Down>       - scroll the viewport down by one row",
+	"  l,<Left>       - scroll the viewport left by one column",
+	"  r,<Right>      - scroll the viewport right by one column",
+	"  <,>            - scroll the viewport left/right by 8 columns",
+	"",
+	"  h,<Home>       - scroll the viewport to top of file",
+	"  ^F,<PageDn>    - scroll to the next page",
+	"  ^B,<PageUp>    - scroll to the previous page",
+	"  e,<End>        - scroll the viewport to end of file",
+	"",
+	"  ^L             - repaint using redrawwin()",
+	"",
+	"  0 through 9    - enter digits for count",
+	"  s              - use entered count for halfdelay() parameter",
+	"                 - if no entered count, stop nodelay()",
+	"  <space>        - begin nodelay()",
+	0
+    };
+
+    int ch;
+    int i;
+    int my_delay = 0;
+    WINDOW *my_pad;
+    int my_row = 0;
+    int value = 0;
+    bool done = FALSE;
+    bool got_number = FALSE;
+    bool ignore_sigs = FALSE;
+    bool single_step = FALSE;
+    const char *my_label = "Input";
+
+    setlocale(LC_ALL, "");
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "cinstT:")) != -1) {
+	switch (ch) {
+	case 'c':
+	    try_color = TRUE;
+	    break;
+	case 'i':
+	    ignore_sigs = TRUE;
+	    break;
+#if USE_WIDEC_SUPPORT
+	case 'n':
+	    n_option = TRUE;
+	    break;
+#endif
+	case 's':
+	    single_step = TRUE;
+	    break;
+#ifdef TRACE
+	case 'T':
+	    {
+		char *next = 0;
+		int tvalue = (int) strtol(optarg, &next, 0);
+		if (tvalue < 0 || (next != 0 && *next != 0))
+		    usage(FALSE);
+		curses_trace((unsigned) tvalue);
+	    }
+	    break;
+	case 't':
+	    curses_trace(TRACE_CALLS);
+	    break;
+#endif
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind + 1 != argc)
+	usage(FALSE);
+
+    InitAndCatch(initscr(), ignore_sigs ? SIG_IGN : finish);
+    keypad(stdscr, TRUE);	/* enable keyboard mapping */
+    (void) nonl();		/* tell curses not to do NL->CR/NL on output */
+    (void) cbreak();		/* take input chars one at a time, no wait for \n */
+    (void) noecho();		/* don't echo input */
+    if (!single_step)
+	nodelay(stdscr, TRUE);
+    idlok(stdscr, TRUE);	/* allow use of insert/delete line */
+
+    if (try_color) {
+	if (has_colors()) {
+	    start_color();
+	    init_pair(my_pair, COLOR_WHITE, COLOR_BLUE);
+	    bkgd((chtype) (' ' | COLOR_PAIR(my_pair)));
+	} else {
+	    try_color = FALSE;
+	}
+    }
+
+    /*
+     * Do this after starting color, otherwise the pad's background will be
+     * uncolored after the ncurses 6.1.20181208 fixes.
+     */
+    global_pad =
+	my_pad = read_file(fname = argv[optind]);
+
+    my_row = 0;
+    while (!done) {
+	int n, c;
+
+	if (!got_number)
+	    show_all(my_label, my_pad, my_row);
+
+	for (;;) {
+	    c = getch();
+	    if ((c < 127) && isdigit(c)) {
+		if (!got_number) {
+		    MvPrintw(0, 0, "Count: ");
+		    clrtoeol();
+		}
+		addch(UChar(c));
+		value = 10 * value + (c - '0');
+		got_number = TRUE;
+	    } else
+		break;
+	}
+	if (got_number && value) {
+	    n = value;
+	} else {
+	    n = 1;
+	}
+
+	if (c != ERR)
+	    my_label = keyname(c);
+	switch (c) {
+	case KEY_DOWN:
+	case 'n':
+	    for (i = 0; i < n; i++)
+		if (my_row < (num_lines - LINES + 1))
+		    my_row++;
+		else
+		    break;
+	    break;
+
+	case KEY_UP:
+	case 'p':
+	    for (i = 0; i < n; i++)
+		if (my_row > 0)
+		    my_row--;
+		else
+		    break;
+	    break;
+
+	case 'h':
+	    /* FALLTHRU */
+	case KEY_HOME:
+	    my_row = 0;
+	    break;
+
+	case '<':
+	    if ((shift -= 8) < 0)
+		shift = 0;
+	    break;
+	case '>':
+	    shift += 8;
+	    break;
+
+	case 'e':
+	    /* FALLTHRU */
+	case KEY_END:
+	    if (num_lines > LINES)
+		my_row = (num_lines - LINES + 1);
+	    else
+		my_row = (num_lines - 2);
+	    break;
+
+	case CTRL('F'):
+	    /* FALLTHRU */
+	case KEY_NPAGE:
+	    for (i = 0; i < n; i++) {
+		if (my_row < (num_lines - 5))
+		    my_row += (LINES - 1);
+		else
+		    my_row = (num_lines - 2);
+	    }
+	    break;
+
+	case CTRL('B'):
+	    /* FALLTHRU */
+	case KEY_PPAGE:
+	    for (i = 0; i < n; i++) {
+		if (my_row >= LINES)
+		    my_row -= (LINES - 1);
+		else
+		    my_row = 0;
+	    }
+	    break;
+
+	case 'r':
+	case KEY_RIGHT:
+	    shift += n;
+	    break;
+
+	case 'l':
+	case KEY_LEFT:
+	    shift -= n;
+	    if (shift < 0) {
+		shift = 0;
+		beep();
+	    }
+	    break;
+
+	case 'q':
+	case QUIT:
+	case ESCAPE:
+	    done = TRUE;
+	    break;
+
+#ifdef KEY_RESIZE
+	case KEY_RESIZE:	/* ignore this; ncurses will repaint */
+	    break;
+#endif
+	case 's':
+#if HAVE_HALFDELAY
+	    if (got_number) {
+		halfdelay(my_delay = n);
+	    } else {
+		nodelay(stdscr, FALSE);
+		my_delay = -1;
+	    }
+#else
+	    nodelay(stdscr, FALSE);
+	    my_delay = -1;
+#endif
+	    break;
+	case ' ':
+	    nodelay(stdscr, TRUE);
+	    my_delay = 0;
+	    break;
+	case CTRL('L'):
+	    redrawwin(stdscr);
+	    break;
+	case ERR:
+	    if (!my_delay)
+		napms(50);
+	    break;
+	case HELP_KEY_1:
+	    popup_msg(stdscr, help);
+	    break;
+	default:
+	    beep();
+	    break;
+	}
+	if (c >= KEY_MIN || (c > 0 && !isdigit(c))) {
+	    got_number = FALSE;
+	    value = 0;
+	}
+    }
+
+    finish(0);			/* we're done */
+}
+#else
+int
+main(void)
+{
+    printf("This program requires the curses pad functions\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif
diff --git a/test/pair_content.c b/test/pair_content.c
new file mode 100644
index 0000000..24cf568
--- /dev/null
+++ b/test/pair_content.c
@@ -0,0 +1,334 @@
+/****************************************************************************
+ * Copyright 2018-2020,2022 Thomas E. Dickey                                *
+ *                                                                          *
+ * 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: pair_content.c,v 1.21 2022/12/10 22:28:50 tom Exp $
+ */
+
+#define NEED_TIME_H
+#include <test.priv.h>
+
+#if USE_EXTENDED_COLOR
+typedef int my_color_t;
+#else
+typedef NCURSES_COLOR_T my_color_t;
+#endif
+
+typedef struct {
+    my_color_t fg;
+    my_color_t bg;
+} MYPAIR;
+
+static int f_opt;
+static int i_opt;
+static int l_opt;
+static int n_opt;
+static int p_opt;
+static int r_opt;
+static int s_opt;
+
+#if USE_EXTENDED_COLOR
+static int x_opt;
+#endif
+
+static MYPAIR *expected;
+
+#if HAVE_GETTIMEOFDAY
+static struct timeval initial_time;
+static struct timeval finish_time;
+#endif
+
+static GCC_NORETURN void
+finish(int code)
+{
+    free(expected);
+    ExitProgram(code);
+}
+
+static void
+failed(const char *msg)
+{
+    printw("%s", msg);
+    getch();
+    endwin();
+    finish(EXIT_FAILURE);
+}
+
+#if USE_EXTENDED_COLOR
+static int
+InitPair(int pair, int fg, int bg)
+{
+    int rc;
+    if (x_opt) {
+	rc = init_extended_pair(pair, fg, bg);
+    } else {
+	rc = init_pair((NCURSES_PAIRS_T) pair,
+		       (NCURSES_COLOR_T) fg,
+		       (NCURSES_COLOR_T) bg);
+    }
+    return rc;
+}
+
+static int
+PairContent(int pair, int *fgp, int *bgp)
+{
+    int rc;
+    if (x_opt) {
+	rc = extended_pair_content(pair, fgp, bgp);
+    } else {
+	short fg, bg;
+	if ((rc = pair_content((short) pair, &fg, &bg)) == OK) {
+	    *fgp = fg;
+	    *bgp = bg;
+	}
+    }
+    return rc;
+}
+#else
+#define InitPair(pair,fg,bg)      init_pair((NCURSES_COLOR_T)pair,(NCURSES_COLOR_T)fg,(NCURSES_COLOR_T)bg)
+#define PairContent(pair,fgp,bgp) pair_content((NCURSES_PAIRS_T)pair,fgp,bgp)
+#endif
+
+static my_color_t
+random_color(void)
+{
+    return (my_color_t) (rand() % COLORS);
+}
+
+static void
+setup_test(void)
+{
+    setlocale(LC_ALL, "");
+    initscr();
+    cbreak();
+    noecho();
+    scrollok(stdscr, TRUE);
+    if (has_colors()) {
+	start_color();
+
+	if (!f_opt)
+	    f_opt = 1;
+	if (!l_opt)
+	    l_opt = COLOR_PAIRS;
+	if (l_opt <= 1)
+	    failed("color-pair limit must be greater than one");
+
+	if (!n_opt) {
+	    int pair;
+	    size_t need = (size_t) ((l_opt > COLOR_PAIRS)
+				    ? l_opt
+				    : COLOR_PAIRS) + 1;
+
+	    expected = typeCalloc(MYPAIR, need);
+	    if (s_opt) {
+		my_color_t fg;
+		my_color_t bg;
+		pair = f_opt;
+		for (fg = 0; fg < COLORS; ++fg) {
+		    for (bg = 0; bg < COLORS; ++bg) {
+			if (pair < l_opt) {
+			    InitPair(pair, fg, bg);
+			    expected[pair].fg = (my_color_t) fg;
+			    expected[pair].bg = (my_color_t) bg;
+			    ++pair;
+			} else {
+			    break;
+			}
+		    }
+		}
+	    } else {
+		for (pair = f_opt; pair < l_opt; ++pair) {
+		    expected[pair].fg = random_color();
+		    expected[pair].bg = random_color();
+		    InitPair(pair, expected[pair].fg, expected[pair].bg);
+		}
+	    }
+	}
+    } else {
+	failed("This demo requires a color terminal");
+    }
+#if HAVE_GETTIMEOFDAY
+    gettimeofday(&initial_time, 0);
+#endif
+}
+
+static void
+run_test(void)
+{
+    int pair;
+    bool success = TRUE;
+    for (pair = 1; pair < l_opt; ++pair) {
+	my_color_t fg;
+	my_color_t bg;
+	if (PairContent(pair, &fg, &bg) == OK) {
+	    if (expected != 0) {
+		if (fg != expected[pair].fg)
+		    success = FALSE;
+		if (bg != expected[pair].bg)
+		    success = FALSE;
+	    }
+	}
+    }
+    if (i_opt) {
+	addch(success ? '.' : '?');
+	refresh();
+    }
+}
+
+static void
+finish_test(void)
+{
+    getch();
+    endwin();
+}
+
+#if HAVE_GETTIMEOFDAY
+static double
+seconds(struct timeval *mark)
+{
+    double result = (double) mark->tv_sec;
+    result += ((double) mark->tv_usec / 1e6);
+    return result;
+}
+#endif
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: pair_content [options]"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+	," -f PAIR  first color pair to test (default: 1)"
+	," -i       interactive, showing test-progress"
+	," -l PAIR  last color pair to test (default: max_pairs-1)"
+	," -n       do not initialize color pairs"
+	," -p       print data for color pairs instead of testing"
+	," -r COUNT repeat for given count"
+	," -s       initialize pairs sequentially rather than random"
+#if USE_EXTENDED_COLOR
+	," -x       use extended color pairs/values"
+#endif
+    };
+    size_t n;
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "f:il:npr:sx")) != -1) {
+	switch (ch) {
+	case 'f':
+	    if ((f_opt = atoi(optarg)) <= 0)
+		usage(FALSE);
+	    break;
+	case 'i':
+	    i_opt = 1;
+	    break;
+	case 'l':
+	    if ((l_opt = atoi(optarg)) <= 0)
+		usage(FALSE);
+	    break;
+	case 'n':
+	    n_opt = 1;
+	    break;
+	case 'p':
+	    p_opt = 1;
+	    break;
+	case 'r':
+	    if ((r_opt = atoi(optarg)) <= 0)
+		usage(FALSE);
+	    break;
+	case 's':
+	    s_opt = 1;
+	    break;
+#if USE_EXTENDED_COLOR
+	case 'x':
+	    x_opt = 1;
+	    break;
+#endif
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind < argc)
+	usage(FALSE);
+    if (r_opt <= 0)
+	r_opt = 1;
+
+    setup_test();
+    if (p_opt) {
+	int i;
+	endwin();
+	for (i = f_opt; i < l_opt; ++i) {
+	    my_color_t fg, bg;
+	    if (PairContent(i, &fg, &bg) == OK) {
+		printf("%d: %d %d\n", i, fg, bg);
+	    } else {
+		printf("%d: ? ?\n", i);
+	    }
+	}
+    } else {
+	int repeat;
+
+	for (repeat = 0; repeat < r_opt; ++repeat) {
+	    run_test();
+	    if (i_opt) {
+		addch('.');
+		refresh();
+	    }
+	}
+
+	if (i_opt) {
+	    addch('\n');
+	}
+	printw("DONE: ");
+#if HAVE_GETTIMEOFDAY
+	gettimeofday(&finish_time, 0);
+	printw("%.03f seconds",
+	       seconds(&finish_time)
+	       - seconds(&initial_time));
+#endif
+	finish_test();
+    }
+
+    finish(EXIT_SUCCESS);
+}
diff --git a/test/parse_rgb.h b/test/parse_rgb.h
new file mode 100644
index 0000000..df315b5
--- /dev/null
+++ b/test/parse_rgb.h
@@ -0,0 +1,98 @@
+/****************************************************************************
+ * Copyright 2018,2020 Thomas E. Dickey                                     *
+ *                                                                          *
+ * 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: parse_rgb.h,v 1.5 2020/02/02 23:34:34 tom Exp $
+ *
+ * Sample implementation of ncurses RGB extension from user_caps(5).
+ */
+#ifndef PARSE_RBG_H_incl
+#define PARSE_RBG_H_incl 1
+
+#include <test.priv.h>
+
+#if HAVE_TIGETSTR && USE_WIDEC_SUPPORT
+static int
+parse_rgb(int *r_max, int *g_max, int *b_max)
+{
+    int colors = tigetnum("colors");
+    int result = ERR;
+
+    *r_max = *g_max = *b_max = 0;
+
+    if (colors > 0) {
+	int max_bits;
+	int bits;
+	int pwr2;
+	int r = 0, g = 0, b = 0;
+	char *data;
+	char ch;
+
+	for (max_bits = 0, pwr2 = 1;
+	     pwr2 < colors;
+	     ++max_bits, pwr2 <<= 1) {
+	    ;
+	}
+
+	if (tigetflag("RGB") > 0) {
+	    result = OK;
+	    r = g = b = (max_bits + 2) / 3;
+	} else if ((bits = tigetnum("RGB")) > 0) {
+	    result = OK;
+	    r = g = b = bits;
+	} else if ((data = tigetstr("RGB")) != ABSENT_STRING
+		   && data != CANCELLED_STRING
+		   && sscanf(data, "%d/%d/%d%c", &r, &g, &b, &ch) == 3) {
+	    result = OK;
+	}
+
+	if ((r + g + b) < max_bits) {
+	    result = ERR;
+	} else if (result == 0) {
+	    if (r > max_bits) {
+		r = max_bits;
+		g = b = 0;
+	    }
+	    *r_max = r;
+	    if (g > (max_bits -= r)) {
+		g = max_bits;
+		b = 0;
+	    }
+	    *g_max = g;
+	    if (b > (max_bits -= g)) {
+		b = max_bits;
+	    }
+	    *b_max = b;
+	}
+    }
+    return result;
+}
+#else
+#define parse_rgb(r,g,b) (ERR)
+#endif
+
+#endif /* PARSE_RBG_H_incl */
diff --git a/test/picsmap.c b/test/picsmap.c
new file mode 100644
index 0000000..04bae98
--- /dev/null
+++ b/test/picsmap.c
@@ -0,0 +1,1842 @@
+/****************************************************************************
+ * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 2017,2018 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: picsmap.c,v 1.148 2022/12/04 00:40:11 tom Exp $
+ *
+ * Author: Thomas E. Dickey
+ *
+ * A little more interesting than "dots", read a simple image into memory and
+ * measure the time taken to paint it normally vs randomly.
+ *
+ * TODO improve use of rgb-names using tsearch.
+ *
+ * TODO add option to dump picture in non-optimized mode, e.g., like tput.
+ * TODO write cells/second to stderr (or log)
+ * TODO write picture left-to-right/top-to-bottom
+ * TODO write picture randomly
+ * TODO add one-shot option vs repeat-count before exiting
+ * TODO add option "-xc" for init_color vs init_extended_color
+ * TODO add option "-xa" for init_pair vs alloc_pair
+ * TODO use pad to allow pictures larger than screen
+ * TODO add option to just use convert (which can scale) vs builtin xbm/xpm.
+ * TODO add scr_dump and scr_restore calls
+ * TODO add option for assume_default_colors
+ */
+#include <test.priv.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#if HAVE_STDINT_H
+#include <stdint.h>
+#define my_intptr_t	intptr_t
+#else
+#define my_intptr_t	long
+#endif
+
+#if HAVE_TSEARCH
+#include <search.h>
+#endif
+
+#undef CUR			/* use only the curses interface */
+
+#define  L_BLOCK '['
+#define  R_BLOCK ']'
+
+#define  L_CURLY '{'
+#define  R_CURLY '}'
+
+#define MaxSCALE	1000	/* input curses ranges 0..1000 */
+#define MaxRGB		255	/* output color ranges 0..255 */
+#define okCOLOR(n)	((n) >= 0 && (n) < COLORS)
+#define okSCALE(n)	((n) >= 0 && (n) <= MaxSCALE)
+#define Scaled256(n)	(NCURSES_COLOR_T) (int)(((double)(n) * MaxSCALE) / 255)
+#define ScaledColor(n)	(NCURSES_COLOR_T) (int)(((double)(n) * MaxSCALE) / scale)
+
+#ifndef RGB_PATH
+#define RGB_PATH "/etc/X11/rgb.txt"
+#endif
+
+#include <picsmap.h>
+
+typedef struct {
+    size_t file;
+    size_t name;
+    size_t list;
+    size_t data;
+    size_t head;
+    size_t pair;
+    size_t cell;
+} HOW_MUCH;
+
+#undef MAX
+#define MAX(a,b) ((a)>(b)?(a):(b))
+
+/*
+ * tfind will return null on failure, so we map subscripts starting at one.
+ */
+#define P2I(n) (((int)(my_intptr_t)(n)) - 1)
+#define I2P(n) (void *)(my_intptr_t)((n) + 1)
+
+#define pause_curses() if (in_curses) stop_curses()
+
+#define debugmsg if (debugging) logmsg
+#define debugmsg2 if (debugging) logmsg2
+
+static GCC_NORETURN void cleanup(int);
+static void giveup(const char *fmt, ...) GCC_PRINTFLIKE(1, 2);
+static void logmsg(const char *fmt, ...) GCC_PRINTFLIKE(1, 2);
+static void logmsg2(const char *fmt, ...) GCC_PRINTFLIKE(1, 2);
+static void warning(const char *fmt, ...) GCC_PRINTFLIKE(1, 2);
+static int gather_c_values(int);
+
+static FILE *logfp = 0;
+static double aspect_ratio = 0.6;
+static bool in_curses = FALSE;
+static bool debugging = FALSE;
+static bool quiet = FALSE;
+static int slow_time = -1;
+static RGB_NAME *rgb_table;
+static RGB_DATA *all_colors;
+static HOW_MUCH how_much;
+
+static int reading_last;
+static int reading_size;
+static FG_NODE *reading_ncols;
+
+#if HAVE_TSEARCH
+static void *reading_ntree;
+#endif
+
+#if HAVE_ALLOC_PAIR && USE_EXTENDED_COLOR
+#define USE_EXTENDED_COLORS 1
+static bool use_extended_pairs = FALSE;
+static bool use_extended_colors = FALSE;
+#else
+#define USE_EXTENDED_COLORS 0
+#endif
+
+static void
+logmsg(const char *fmt, ...)
+{
+    if (logfp != 0) {
+	va_list ap;
+	va_start(ap, fmt);
+	vfprintf(logfp, fmt, ap);
+	va_end(ap);
+	fputc('\n', logfp);
+	fflush(logfp);
+    }
+}
+
+static void
+logmsg2(const char *fmt, ...)
+{
+    if (logfp != 0) {
+	va_list ap;
+	va_start(ap, fmt);
+	vfprintf(logfp, fmt, ap);
+	va_end(ap);
+	fflush(logfp);
+    }
+}
+
+static void
+close_log(void)
+{
+    if (logfp != 0) {
+	logmsg("Allocations:");
+	logmsg("%8ld file", (long) how_much.file);
+	logmsg("%8ld name", (long) how_much.name);
+	logmsg("%8ld list", (long) how_much.list);
+	logmsg("%8ld data", (long) how_much.data);
+	logmsg("%8ld head", (long) how_much.head);
+	logmsg("%8ld pair", (long) how_much.pair);
+	logmsg("%8ld cell", (long) how_much.cell);
+	logmsg("%8ld window", LINES * COLS * (long) sizeof(NCURSES_CH_T));
+	fclose(logfp);
+	logfp = 0;
+    }
+}
+
+static void
+cleanup(int code)
+{
+    pause_curses();
+    close_log();
+    ExitProgram(code);
+    /* NOTREACHED */
+}
+
+static void
+failed(const char *msg)
+{
+    int save = errno;
+    perror(msg);
+    logmsg("failed with %s", strerror(save));
+    cleanup(EXIT_FAILURE);
+}
+
+static void
+warning(const char *fmt, ...)
+{
+    if (logfp != 0) {
+	va_list ap;
+	va_start(ap, fmt);
+	vfprintf(logfp, fmt, ap);
+	va_end(ap);
+	fputc('\n', logfp);
+	fflush(logfp);
+    } else {
+	va_list ap;
+	va_start(ap, fmt);
+	vfprintf(stderr, fmt, ap);
+	va_end(ap);
+	fputc('\n', stderr);
+	cleanup(EXIT_FAILURE);
+    }
+}
+
+static void
+free_data(char **data)
+{
+    if (data != 0) {
+	free(data[0]);
+	free(data);
+    }
+}
+
+static PICS_HEAD *
+free_pics_head(PICS_HEAD * pics)
+{
+    if (pics != 0) {
+	free(pics->fgcol);
+	free(pics->cells);
+	free(pics->name);
+	free(pics);
+	pics = 0;
+    }
+    return pics;
+}
+
+static void
+begin_c_values(int size)
+{
+    reading_last = 0;
+    reading_size = size;
+    reading_ncols = typeCalloc(FG_NODE, size + 1);
+    how_much.pair += (sizeof(FG_NODE) * (size_t) size);
+    /* black is always the first slot, to work around P2I/I2P logic */
+    gather_c_values(0);
+}
+
+#if HAVE_TSEARCH
+static int
+compare_c_values(const void *p, const void *q)
+{
+    const int a = P2I(p);
+    const int b = P2I(q);
+    return (reading_ncols[a].fgcol - reading_ncols[b].fgcol);
+}
+
+#ifdef DEBUG_TSEARCH
+static void
+check_c_values(int ln)
+{
+    static int oops = 5;
+    FG_NODE **ft;
+    int n;
+    for (n = 0; n < reading_last; ++n) {
+	ft = tfind(I2P(n), &reading_ntree, compare_c_values);
+	if (ft != 0) {
+	    int q = P2I(*ft);
+	    if (reading_ncols[q].fgcol != reading_ncols[n].fgcol) {
+		logmsg("@%d, %d:%d (%d) %d %d fgcol %06X %06X", ln, n,
+		       reading_last - 1,
+		       reading_size,
+		       q, n,
+		       reading_ncols[n].fgcol,
+		       reading_ncols[q].fgcol);
+	    }
+	} else {
+	    logmsg("@%d, %d:%d (%d) ? %d null %06X", ln, n,
+		   reading_last - 1,
+		   reading_size,
+		   n,
+		   reading_ncols[n].fgcol);
+	    if (oops-- <= 0)
+		return;
+	}
+    }
+}
+#else
+#define check_c_values(n)	/* nothing */
+#endif
+#endif
+
+static int
+gather_c_values(int fg)
+{
+    int found = -1;
+#if HAVE_TSEARCH
+    FG_NODE **ft;
+    int next = reading_last;
+
+    reading_ncols[next].fgcol = fg;
+    reading_ncols[next].count = 0;
+
+    check_c_values(__LINE__);
+    if ((ft = tfind(I2P(next), &reading_ntree, compare_c_values)) != 0) {
+	found = P2I(*ft);
+    } else {
+	if (reading_last + 2 >= reading_size) {
+	    int more = ((MAX(reading_last, reading_size) + 2) * 3) / 2;
+	    int last = reading_last + 1;
+	    FG_NODE *p = typeRealloc(FG_NODE, more, reading_ncols);
+	    if (p == 0)
+		goto done;
+
+	    reading_size = more;
+	    reading_ncols = p;
+	    memset(reading_ncols + last, 0,
+		   sizeof(FG_NODE) * (size_t) (more - last));
+	    check_c_values(__LINE__);
+	}
+	++reading_last;
+	how_much.pair += sizeof(FG_NODE);
+	if ((ft = tsearch(I2P(next), &reading_ntree, compare_c_values)) != 0) {
+	    found = P2I(*ft);
+	    if (found != next)
+		logmsg("OOPS expected slot %d, got %d", next, found);
+	    debugmsg("allocated color #%d as #%06X", next, fg);
+	    check_c_values(__LINE__);
+	}
+    }
+#else
+    int n;
+
+    for (n = 0; n < reading_last; ++n) {
+	if (reading_ncols[n].fgcol == fg) {
+	    found = n;
+	    break;
+	}
+    }
+    if (found < 0) {
+	if (reading_last + 2 >= reading_size) {
+	    int more = ((reading_last + 2) * 3) / 2;
+	    FG_NODE *p = typeRealloc(FG_NODE, more, reading_ncols);
+	    if (p == 0)
+		goto done;
+
+	    how_much.pair -= (sizeof(FG_NODE) * (size_t) reading_size);
+	    how_much.pair += (sizeof(FG_NODE) * (size_t) more);
+	    reading_size = more;
+	    reading_ncols = p;
+	    memset(reading_ncols + reading_last, 0,
+		   sizeof(FG_NODE) * (size_t) (more - reading_last));
+	}
+	reading_ncols[reading_last].fgcol = fg;
+	found = reading_last++;
+    }
+#endif
+  done:
+    return found;
+}
+
+static void
+finish_c_values(PICS_HEAD * head)
+{
+    head->colors = reading_last;
+    head->fgcol = reading_ncols;
+
+    reading_last = 0;
+    reading_size = 0;
+    reading_ncols = 0;
+}
+
+static void
+dispose_c_values(void)
+{
+#if HAVE_TSEARCH
+    if (reading_ntree != 0) {
+	int n;
+	for (n = 0; n < reading_last; ++n) {
+	    tdelete(I2P(n), &reading_ntree, compare_c_values);
+	}
+	reading_ntree = 0;
+    }
+#endif
+    if (reading_ncols != 0) {
+	free(reading_ncols);
+	reading_ncols = 0;
+    }
+    reading_last = 0;
+    reading_size = 0;
+}
+
+static int
+is_file(const char *filename, struct stat *sb)
+{
+    int result = 0;
+    if (stat(filename, sb) == 0
+	&& (sb->st_mode & S_IFMT) == S_IFREG
+	&& sb->st_size != 0) {
+	result = 1;
+    }
+    debugmsg("is_file(%s) %d", filename, result);
+    return result;
+}
+
+/*
+ * Simplify reading xbm/xpm files by first making an array of lines.  Blank
+ * lines are filtered out.
+ */
+static char **
+read_file(const char *filename)
+{
+    char **result = 0;
+    struct stat sb;
+
+    if (!quiet) {
+	pause_curses();
+	printf("** %s\n", filename);
+    }
+
+    if (is_file(filename, &sb)) {
+	size_t size = (size_t) sb.st_size;
+	char *blob = typeCalloc(char, size + 1);
+	bool binary = FALSE;
+	unsigned k = 0;
+
+	result = typeCalloc(char *, size + 1);
+	how_much.file += ((size + 1) * 2);
+
+	if (blob != 0 && result != 0) {
+	    FILE *fp = fopen(filename, "r");
+	    if (fp != 0) {
+		logmsg("opened %s", filename);
+
+		if (fread(blob, sizeof(char), size, fp) == size) {
+		    bool had_line = TRUE;
+		    unsigned j;
+
+		    for (j = 0; (size_t) j < size; ++j) {
+			if (blob[j] == '\0' ||
+			    (UChar(blob[j]) < 32 &&
+			     !isspace(UChar(blob[j]))) ||
+			    (UChar(blob[j]) >= 128 && UChar(blob[j]) < 160)) {
+			    binary = TRUE;
+			}
+			if (blob[j] == '\n') {
+			    blob[j] = '\0';
+			    if (k && !binary) {
+				debugmsg2("[%5d] %s\n", k, result[k - 1]);
+			    }
+			    had_line = TRUE;
+			} else if (had_line) {
+			    had_line = FALSE;
+			    result[k++] = blob + j;
+			}
+		    }
+		    result[k] = 0;
+		    if (k && !binary) {
+			debugmsg2("[%5d] %s\n", k, result[k - 1]);
+		    }
+		}
+		fclose(fp);
+	    } else {
+		logmsg("cannot open %s", filename);
+	    }
+	}
+	if (k == 0) {
+	    debugmsg("...file is empty");
+	    free(blob);
+	    free(result);
+	    result = 0;
+	} else if (binary) {
+	    debugmsg("...file is non-text");
+	}
+    }
+    return result;
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: picsmap [options] [imagefile [...]]"
+	,"Read/display one or more xbm/xpm files (possibly use \"convert\")"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+	," -a ratio aspect-ratio correction for ImageMagick"
+#if HAVE_USE_DEFAULT_COLORS
+	," -d       invoke use_default_colors"
+#endif
+	," -L       add debugging information to logfile"
+	," -l FILE  write informational messages to FILE"
+	," -p FILE  color-palette file (default \"$TERM.dat\")"
+	," -q       less verbose"
+	," -r FILE  xpm uses X rgb color-names in FILE (default \"" RGB_PATH "\")"
+	," -s SECS  pause for SECS seconds after display vs getch"
+#if USE_EXTENDED_COLORS
+	," -x [pc]  use extension (p=extended-pairs, c=extended-colors)"
+	,"          Either/both extension may be given"
+#endif
+    };
+    size_t n;
+
+    pause_curses();
+
+    fflush(stdout);
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+    cleanup(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+
+static void
+giveup(const char *fmt, ...)
+{
+    va_list ap;
+
+    pause_curses();
+    fflush(stdout);
+
+    va_start(ap, fmt);
+    vfprintf(stderr, fmt, ap);
+    fputc('\n', stderr);
+    va_end(ap);
+
+    if (logfp) {
+	va_start(ap, fmt);
+	vfprintf(logfp, fmt, ap);
+	fputc('\n', logfp);
+	va_end(ap);
+	fflush(logfp);
+    }
+
+    usage(FALSE);
+}
+
+/*
+ * Palette files are named for $TERM values.  However, there are fewer palette
+ * files than $TERM's.  Although there are known problems (some cannot even get
+ * black and white correct), for the purpose of comparison, pretending that
+ * those map into "xterm" is useful.
+ */
+static char **
+read_palette(const char *filename)
+{
+    static const char *data_dir = DATA_DIR;
+    char **result = 0;
+    size_t last = strlen(filename);
+    size_t need = (strlen(data_dir) + 20 + last);
+    char *full_name = malloc(need);
+    char *s;
+    struct stat sb;
+
+    if (full_name != 0) {
+	int tries;
+	for (tries = 0; tries < 8; ++tries) {
+
+	    *(s = full_name) = '\0';
+	    if (tries & 1) {
+		if (strchr(filename, '/') == 0) {
+		    _nc_SPRINTF(full_name, _nc_SLIMIT(need) "%s/", data_dir);
+		} else {
+		    continue;
+		}
+	    }
+	    s += strlen(s);
+	    if (((size_t) (s - full_name) + last + 1) >= need)
+		continue;
+
+	    _nc_STRCAT(full_name, filename, need);
+	    if (tries & 4) {
+		char *t = s;
+		char *tc;
+		int num;
+		char chr;
+		int found = 0;
+		while (*t != '\0') {
+		    if (*t == '-') {
+			if (sscanf(t, "-%d%c", &num, &chr) == 2 &&
+			    chr == 'c' &&
+			    (tc = strchr(t, chr)) != 0 &&
+			    !(strncmp) (tc, "color", 5)) {
+			    found = 1;
+			}
+			break;
+		    }
+		    ++t;
+		}
+		if (found && (t != s)
+		    && (strncmp) (s, "xterm", (size_t) (t - s))) {
+		    _nc_SPRINTF(s, _nc_SLIMIT(need - (size_t) (s - full_name))
+				"xterm%s", filename + (t - s));
+		} else {
+		    continue;
+		}
+	    }
+
+	    if (tries & 2) {
+		int len = (int) strlen(filename);
+		if (len <= 4 || strcmp(filename + len - 4, ".dat")) {
+		    _nc_STRCAT(full_name, ".dat", need);
+		} else {
+		    continue;
+		}
+	    }
+	    if (is_file(full_name, &sb))
+		goto ok;
+	}
+	goto failed;
+      ok:
+	result = read_file(full_name);
+      failed:
+	free(full_name);
+    }
+    return result;
+}
+
+static void
+init_palette(const char *palette_file)
+{
+    if (palette_file != 0) {
+	char **data = read_palette(palette_file);
+
+	all_colors = typeMalloc(RGB_DATA, (unsigned) COLORS);
+	how_much.data += (sizeof(RGB_DATA) * (unsigned) COLORS);
+
+#if HAVE_COLOR_CONTENT
+	{
+	    int cp;
+	    for (cp = 0; cp < COLORS; ++cp) {
+		color_content((short) cp,
+			      &all_colors[cp].red,
+			      &all_colors[cp].green,
+			      &all_colors[cp].blue);
+	    }
+	}
+#else
+	memset(all_colors, 0, sizeof(RGB_DATA) * (size_t) COLORS);
+#endif
+	if (data != 0) {
+	    int n;
+	    int red, green, blue;
+	    int scale = MaxSCALE;
+	    int c;
+	    for (n = 0; data[n] != 0; ++n) {
+		if (sscanf(data[n], "scale:%d", &c) == 1) {
+		    scale = c;
+		} else if (sscanf(data[n], "%d:%d %d %d",
+				  &c,
+				  &red,
+				  &green,
+				  &blue) == 4
+			   && okCOLOR(c)
+			   && okSCALE(red)
+			   && okSCALE(green)
+			   && okSCALE(blue)) {
+		    /* *INDENT-EQLS* */
+		    all_colors[c].red   = ScaledColor(red);
+		    all_colors[c].green = ScaledColor(green);
+		    all_colors[c].blue  = ScaledColor(blue);
+		}
+	    }
+	}
+	free_data(data);
+	/* *INDENT-EQLS* */
+    } else if (COLORS > 1) {
+	int power2 = 1;
+	int shift = 0;
+
+	while (power2 < COLORS) {
+	    ++shift;
+	    power2 <<= 1;
+	}
+
+	if ((power2 != COLORS) || ((shift % 3) != 0)) {
+	    if (all_colors == 0) {
+		init_palette(getenv("TERM"));
+		if (all_colors == 0) {
+		    giveup("With %d colors, you need a palette-file", COLORS);
+		}
+	    }
+	}
+    }
+}
+
+/*
+ * Map the 24-bit RGB value to a color index if using a palette, otherwise to a
+ * direct color value.
+ */
+static int
+map_color(int value)
+{
+    int result = value;
+
+    if (result < 0) {
+	result = -1;
+    } else {
+	/* *INDENT-EQLS* */
+	int red   = (value & 0xff0000) >> 16;
+	int green = (value & 0x00ff00) >> 8;
+	int blue  = (value & 0x0000ff) >> 0;
+
+	if (all_colors != 0) {
+#define Diff2(n,m) ((m) - all_colors[n].m) * ((m) - all_colors[n].m)
+#define Diff2S(n) Diff2(n,red) + Diff2(n,green) + Diff2(n,blue)
+	    int d2 = Diff2S(0);
+	    int n;
+
+	    /* *INDENT-EQLS* */
+	    red   = Scaled256(red);
+	    green = Scaled256(green);
+	    blue  = Scaled256(blue);
+
+	    for (result = 0, n = 1; n < COLORS; ++n) {
+		int d = Diff2(n, red) + Diff2(n, green) + Diff2(n, blue);
+		if (d < d2) {
+		    d2 = d;
+		    result = n;
+		}
+	    }
+	} else {		/* direct color */
+	    int power2 = 1;
+	    int shifts = 8;
+
+	    while (power2 < COLORS) {
+		power2 <<= 3;
+		shifts--;
+	    }
+
+	    if (shifts > 0) {
+		/* TODO: round up */
+		red >>= shifts;
+		green >>= shifts;
+		blue >>= shifts;
+		result = ((red << (2 * (8 - shifts)))
+			  + (green << (8 - shifts))
+			  + blue);
+	    }
+	}
+    }
+    return result;
+}
+
+static int
+bytes_of(int value)
+{
+    if (value & 7) {
+	value |= 7;
+	value++;
+    }
+    return value;
+}
+
+static int match_c(const char *, const char *, ...) GCC_SCANFLIKE(2,3);
+
+static char *
+skip_s(char *s)
+{
+    while (isspace(UChar(*s)))
+	s++;
+    return s;
+}
+
+static const char *
+skip_cs(const char *s)
+{
+    while (isspace(UChar(*s)))
+	s++;
+    return s;
+}
+
+static char *
+skip_word(char *s)
+{
+    s = skip_s(s);
+    while (isgraph(UChar(*s)))
+	s++;
+    return s;
+}
+
+static int
+match_c(const char *source, const char *pattern, ...)
+{
+    int limit = (int) strlen(source);
+    const char *last_s = source + limit;
+    va_list ap;
+    int ch;
+    int *ip;
+    char *cp;
+    float *fp;
+    long lv;
+
+    va_start(ap, pattern);
+
+    limit = -1;
+    while (*pattern != '\0') {
+	ch = UChar(*pattern++);
+	/* blank in the pattern matches zero-or-more blanks in source */
+	if (isspace(ch)) {
+	    source = skip_cs(source);
+	    continue;
+	}
+	/* %c, %d, %s are like sscanf except for special treatment of blanks */
+	if (ch == '%' && *pattern != '\0' && strchr("%cdnfsx", *pattern)) {
+	    bool found = FALSE;
+	    ch = *pattern++;
+	    switch (ch) {
+	    case '%':
+		source++;
+		break;
+	    case 'c':
+		cp = va_arg(ap, char *);
+		do {
+		    *cp++ = *source++;
+		} while (--limit > 0);
+		break;
+	    case 'd':
+	    case 'x':
+		limit = -1;
+		ip = va_arg(ap, int *);
+		lv = strtol(source, &cp, ch == 'd' ? 10 : 16);
+		if (cp != 0 && cp != source) {
+		    *ip = (int) lv;
+		    source = cp;
+		} else {
+		    goto finish;
+		}
+		break;
+	    case 'f':
+		/* floating point for pixels... */
+		fp = va_arg(ap, float *);
+		lv = strtol(source, &cp, 10);
+		if (cp == 0 || cp == source)
+		    goto finish;
+		*fp = (float) lv;
+		source = cp;
+		if (*source == '.') {
+		    lv = strtol(++source, &cp, 10);
+		    if (cp == 0 || cp == source)
+			goto finish;
+		    {
+			float scale = 1.0f;
+			int digits = (int) (cp - source);
+			while (digits-- > 0) {
+			    scale *= 10.0f;
+			}
+			*fp += (float) lv / scale;
+		    }
+		    source = cp;
+		}
+		break;
+	    case 'n':
+		/* not really sscanf... */
+		limit = *va_arg(ap, int *);
+		break;
+	    case 's':
+		limit = -1;
+		cp = va_arg(ap, char *);
+		while (*source != '\0') {
+		    ch = UChar(*source);
+		    if (isspace(ch)) {
+			break;
+		    } else if (found && (ch == *skip_cs(pattern))) {
+			break;
+		    } else {
+			*cp++ = *source++;
+			found = TRUE;
+		    }
+		}
+		*cp = '\0';
+		break;
+	    }
+	    continue;
+	}
+	/* other characters are matched literally */
+	if (*source++ != ch) {
+	    break;
+	}
+    }
+  finish:
+
+    va_end(ap);
+    if (source > last_s)
+	source = last_s;
+    return (*source || *pattern) ? 0 : 1;
+}
+
+static int
+match_colors(const char *source, int cpp, char *arg1, char *arg2, char *arg3)
+{
+    int result = 0;
+
+    /* most files use a quasi-fixed format */
+    if (match_c(source, " \"%n%c %s %s \" , ", &cpp, arg1, arg2, arg3)) {
+	arg1[cpp] = '\0';
+	result = 1;
+    } else {
+	const char *s = skip_cs(source);
+	size_t have = strlen(source);
+
+	if (*s++ == '"' && have > ((size_t) cpp + 2)) {
+	    memcpy(arg1, s, (size_t) cpp);
+	    s += cpp;
+	    while (*s++ == '\t') {
+		char *t;
+		for (t = arg2; (*s != '\0') && strchr("\t\"", *s) == 0;) {
+		    if (*s == ' ') {
+			s = skip_cs(s);
+			break;
+		    }
+		    *t++ = *s++;
+		    *t = '\0';
+		}
+		for (t = arg3; (*s != '\0') && strchr("\t\"", *s) == 0;) {
+		    *t++ = *s++;
+		    *t = '\0';
+		}
+		if (!strcmp(arg2, "c")) {
+		    result = 1;
+		    break;
+		}
+	    }
+	}
+    }
+    return result;
+}
+
+static RGB_NAME *
+parse_rgb(char **data)
+{
+    char buf[BUFSIZ];
+    int n;
+    unsigned long r, g, b;
+    char *s, *t;
+    size_t item = 0;
+    size_t need;
+    RGB_NAME *result = 0;
+
+    for (need = 0; data[need] != 0; ++need) ;
+
+    result = typeCalloc(RGB_NAME, need + 2);
+    how_much.name += (sizeof(RGB_NAME) * (need + 2));
+
+    for (n = 0; data[n] != 0; ++n) {
+	if (strlen(t = data[n]) >= sizeof(buf) - 1)
+	    continue;
+	if (*(s = skip_s(t)) == '!')
+	    continue;
+
+	r = strtoul(s, &t, 10);
+	s = skip_s(t);
+	g = strtoul(s, &t, 10);
+	s = skip_s(t);
+	b = strtoul(s, &t, 10);
+	s = skip_s(t);
+
+	result[item].name = s;
+	t = s + strlen(s);
+	while (t-- != s && isspace(UChar(*t))) {
+	    *t = '\0';
+	}
+	result[item].value = (int) ((r & 0xff) << 16 |
+				    (g & 0xff) << 8 |
+				    (b & 0xff));
+	++item;
+    }
+
+    result[item].name = "none";
+    result[item].value = -1;
+
+    return result;
+}
+
+#define LOWERCASE(c) ((isalpha(UChar(c)) && isupper(UChar(c))) ? tolower(UChar(c)) : (c))
+
+static int
+CaselessCmp(const char *a, const char *b)
+{				/* strcasecmp isn't portable */
+    while (*a && *b) {
+	int cmp = LOWERCASE(*a) - LOWERCASE(*b);
+	if (cmp != 0)
+	    break;
+	a++, b++;
+    }
+    return LOWERCASE(*a) - LOWERCASE(*b);
+}
+
+static RGB_NAME *
+lookup_rgb(const char *name)
+{
+    RGB_NAME *result = 0;
+    if (rgb_table != 0) {
+	int n;
+	for (n = 0; rgb_table[n].name != 0; ++n) {
+	    if (!CaselessCmp(name, rgb_table[n].name)) {
+		result = &rgb_table[n];
+		break;
+	    }
+	}
+    }
+    return result;
+}
+
+static PICS_HEAD *
+parse_xbm(char **data)
+{
+    int n;
+    int state = 0;
+    char buf[2048];
+    int num;
+    char ch;
+    char *s;
+    char *t;
+    PICS_HEAD *result;
+    size_t which = 0;
+    size_t cells = 0;
+
+    debugmsg("called parse_xbm");
+
+    result = typeCalloc(PICS_HEAD, 1);
+    how_much.head += sizeof(PICS_HEAD);
+
+    begin_c_values(2);
+    gather_c_values(0);
+    gather_c_values(0xffffff);
+
+    for (n = 0; data[n] != 0; ++n) {
+	if (strlen(s = data[n]) >= sizeof(buf) - 1)
+	    continue;
+	switch (state) {
+	case 0:
+	case 1:
+	case 2:
+	    if (sscanf(s, "#define %1024s %d%c", buf, &num, &ch) >= 2) {
+		if ((t = strstr(buf, "_width")) != 0) {
+		    state |= 1;
+		    result->wide = (short) bytes_of(num);
+		} else if ((t = strstr(buf, "_height")) != 0) {
+		    state |= 2;
+		    result->high = (short) num;
+		} else {
+		    break;
+		}
+		*t = '\0';
+		if (result->name) {
+		    if (strcmp(result->name, buf)) {
+			goto finish;
+		    }
+		} else {
+		    result->name = strdup(buf);
+		}
+	    }
+	    break;
+	case 3:
+	    if (sscanf(s, "static char %1024[^_ ]_bits[]%c", buf, &ch) >= 1) {
+		if (strcmp(result->name, buf)) {
+		    goto finish;
+		}
+		state = 4;
+		cells = (size_t) (result->wide * result->high);
+
+		result->cells = typeCalloc(PICS_CELL, cells);
+		how_much.cell += (sizeof(PICS_CELL) * cells);
+
+		if ((s = strchr(s, L_CURLY)) == 0)
+		    break;
+		++s;
+	    } else {
+		break;
+	    }
+	case 4:
+	    while (*s != '\0') {
+		while (isspace(UChar(*s))) {
+		    ++s;
+		}
+		if (isdigit(UChar(*s))) {
+		    long value = strtol(s, &t, 0);
+		    int b;
+		    if (t != s || value > MaxRGB || value < 0) {
+			s = t;
+		    } else {
+			state = -1;
+			goto finish;
+		    }
+		    for (b = 0; b < 8; ++b) {
+			if (((1L << b) & value) != 0) {
+			    result->cells[which].ch = '*';
+			    result->cells[which].fg = 1;
+			    reading_ncols[1].count++;
+			} else {
+			    result->cells[which].ch = ' ';
+			    result->cells[which].fg = 0;
+			    reading_ncols[0].count++;
+			}
+			if (++which > cells) {
+			    state = -1;
+			    goto finish;
+			}
+		    }
+		}
+		if (*s == R_CURLY) {
+		    state = 5;
+		    goto finish;
+		} else if (*s == ',') {
+		    ++s;
+		}
+	    }
+	    break;
+	default:
+	    break;
+	}
+    }
+  finish:
+    if (state < 4) {
+	debugmsg("...state was only %d", state);
+	if (result) {
+	    result = free_pics_head(result);
+	}
+    } else {
+	finish_c_values(result);
+    }
+    return result;
+}
+
+static PICS_HEAD *
+parse_xpm(char **data)
+{
+    int state = 0;
+    PICS_HEAD *result;
+    RGB_NAME *by_name;
+    int n;
+    int cells = 0;
+    int cpp = 1;		/* chars per pixel */
+    int num[6];
+    int found;
+    int which = 0;
+    int num_colors = 0;
+    char ch;
+    const char *cs;
+    char *s;
+    char buf[BUFSIZ];
+    char arg1[BUFSIZ];
+    char arg2[BUFSIZ];
+    char arg3[BUFSIZ];
+    char **list = 0;
+
+    debugmsg("called parse_xpm");
+
+    result = typeCalloc(PICS_HEAD, 1);
+    how_much.head += sizeof(PICS_HEAD);
+
+    for (n = 0; data[n] != 0; ++n) {
+	if (strlen(s = data[n]) >= sizeof(buf) - 1)
+	    continue;
+	switch (state) {
+	case 0:
+	    if (match_c(s, " /* XPM */ ")) {
+		state = 1;
+	    }
+	    break;
+	case 1:
+	    if (match_c(s, " static char * %s [] = %c ", arg1, &ch) &&
+		ch == L_CURLY) {
+		result->name = strdup(arg1);
+		state = 2;
+	    }
+	    break;
+	case 2:
+	    if (match_c(s, " \" %d %d %d %d \" , ",
+			num + 0, num + 1, num + 2, num + 3) ||
+		match_c(s, " \" %d %d %d %d %d %d \" , ",
+			num + 0, num + 1, num + 2, num + 3, num + 4, num + 5)) {
+		result->wide = (short) num[0];
+		result->high = (short) num[1];
+		result->colors = num[2];
+
+		begin_c_values(num[2]);
+
+		cells = (result->wide * result->high);
+
+		result->cells = typeCalloc(PICS_CELL, cells);
+		how_much.cell += sizeof(PICS_CELL) * (size_t) cells;
+
+		list = typeCalloc(char *, result->colors + 1);
+		how_much.list += sizeof(char *) * (size_t) (result->colors + 1);
+
+		cpp = num[3];
+		state = 3;
+	    }
+	    break;
+	case 3:
+	    if (!match_colors(s, cpp, arg1, arg2, arg3)) {
+		break;
+	    }
+	    num_colors++;
+	    free(list[reading_last]);
+	    list[reading_last] = strdup(arg1);
+	    if ((by_name = lookup_rgb(arg3)) != 0) {
+		found = gather_c_values(by_name->value);
+	    } else if (*arg3 == '#') {
+		char *rgb = arg3 + 1;
+		unsigned long value = strtoul(rgb, &s, 16);
+		switch ((int) strlen(rgb)) {
+		case 6:
+		    break;
+		case 12:
+		    value = (((value >> 24) & 0xff0000L)
+			     | ((value >> 16) & 0xff00L)
+			     | ((value >> 8) & 0xffL));
+		    break;
+		default:
+		    warning("unexpected rgb value %s", rgb);
+		    break;
+		}
+		found = gather_c_values((int) value);
+	    } else {
+		found = gather_c_values(0);	/* actually an error */
+	    }
+	    debugmsg("  [%d:%d] %06X", num_colors, result->colors,
+		     reading_ncols[(found >= 0) ? found : 0].fgcol);
+	    if (num_colors >= result->colors) {
+		finish_c_values(result);
+		state = 4;
+		if (list[0] == 0)
+		    list[0] = strdup("\033");
+	    }
+	    break;
+	case 4:
+	    if (*(cs = skip_cs(s)) == '"') {
+		++cs;
+		while (*cs != '\0' && *cs != '"') {
+		    int c;
+
+		    /* FIXME - factor out */
+		    for (c = 0; c < result->colors; ++c) {
+			if (list[c] == 0) {
+			    /* should not happen... */
+			    continue;
+			}
+			if (!(strncmp) (cs, list[c], (size_t) cpp)) {
+			    result->cells[which].ch = list[c][0];
+			    result->cells[which].fg = c;
+			    result->fgcol[c].count++;
+			    break;
+			}
+		    }
+
+		    if (result->cells[which].ch == 0) {
+			result->cells[which].ch = '?';
+			result->cells[which].fg = 0;
+		    }
+
+		    if (++which >= cells) {
+			state = 5;
+			break;
+		    }
+		    for (c = cpp; c > 0; --c, ++cs) {
+			if (*cs == '\0')
+			    break;
+		    }
+		}
+	    }
+	    break;
+	}
+    }
+
+    if (result && list) {
+	for (n = 0; n < result->colors; ++n)
+	    free(list[n]);
+	free(list);
+    }
+
+    if (state < 5) {
+	debugmsg("...state was only %d", state);
+	result = free_pics_head(result);
+    }
+
+    if (result) {
+	debugmsg("...allocated %d colors", result->colors);
+    }
+
+    return result;
+}
+
+/*
+ * The obscurely-named "convert" is provided by ImageMagick
+ */
+static PICS_HEAD *
+parse_img(const char *filename)
+{
+    size_t need = strlen(filename) + 256;
+    char *cmd = malloc(need);
+    FILE *pp;
+    char buffer[BUFSIZ];
+    char dummy[BUFSIZ];
+    bool okay = TRUE;
+    PICS_HEAD *result;
+    int pic_x = 0;
+    int pic_y = 0;
+    int width = in_curses ? COLS : 80;
+
+    _nc_SPRINTF(cmd, _nc_SLIMIT(need) "identify \"%s\"", filename);
+    if (quiet)
+	_nc_STRCAT(cmd, " 2>/dev/null", need);
+
+    logmsg("...opening pipe to %s", cmd);
+
+    result = typeCalloc(PICS_HEAD, 1);
+    how_much.head += sizeof(PICS_HEAD);
+
+    if ((pp = popen(cmd, "r")) != 0) {
+	if (fgets(buffer, sizeof(buffer), pp) != 0) {
+	    size_t n = strlen(filename);
+	    debugmsg2("...read %s", buffer);
+	    if (strlen(buffer) > n &&
+		!(strncmp) (buffer, filename, n) &&
+		isspace(UChar(buffer[n])) &&
+		sscanf(skip_word(buffer + n), " %dx%d ", &pic_x, &pic_y) == 2) {
+		/* distort image to make it show normally on terminal */
+		pic_x = (int) ((double) pic_x / aspect_ratio);
+	    } else {
+		pic_x = pic_y = 0;
+	    }
+	}
+	pclose(pp);
+    }
+    if (pic_x <= 0 || pic_y <= 0)
+	goto finish;
+
+    _nc_SPRINTF(cmd, _nc_SLIMIT(need)
+		"convert " "-resize %dx%d\\! " "-thumbnail %dx \"%s\" "
+		"-define txt:compliance=SVG txt:-",
+		pic_x, pic_y, width, filename);
+    if (quiet)
+	_nc_STRCAT(cmd, " 2>/dev/null", need);
+
+    logmsg("...opening pipe to %s", cmd);
+    if ((pp = popen(cmd, "r")) != 0) {
+	int count = 0;
+	int col = 0;
+	int row = 0;
+	int len = 0;
+	while (fgets(buffer, sizeof(buffer), pp) != 0) {
+	    debugmsg2("[%5d] %s", count + 1, buffer);
+	    if (strlen(buffer) > 160) {		/* 80 columns would be enough */
+		okay = FALSE;
+		break;
+	    }
+	    if (count++ == 0) {
+		if (match_c(buffer,
+			    "# ImageMagick pixel enumeration: %d,%d,%d,%s ",
+			    &col, &row, &len, dummy)) {
+		    result->name = strdup(filename);
+		    result->wide = (short) col;
+		    result->high = (short) row;
+
+		    begin_c_values(256);
+
+		    result->cells = typeCalloc(PICS_CELL, (size_t) (col * row));
+		    how_much.cell += (sizeof(PICS_CELL) * (size_t) (col * row));
+		} else {
+		    okay = FALSE;
+		    break;
+		}
+	    } else {
+		/*
+		 * subsequent lines begin "col,row: (r,g,b,a) #RGB".
+		 * Those r/g/b could be integers (0..255) or float-percentages.
+		 */
+		int r, g, b, nocolor;
+		float rf, gf, bf;
+		unsigned check;
+		char *t;
+		char *s = t = strchr(buffer, '#');
+		bool matched = FALSE;
+
+		if (s != 0) {
+		    /* after the "#RGB", there are differences - just ignore */
+		    while (*s != '\0' && !isspace(UChar(*s)))
+			++s;
+		    *++s = '\0';
+		}
+
+		if (match_c(buffer,
+			    "%d,%d: (%d,%d,%d,%d) #%x ",
+			    &col, &row,
+			    &r, &g, &b, &nocolor,
+			    &check)) {
+		    matched = TRUE;
+		} else if (match_c(buffer,
+				   "%d,%d: (%f%%,%f%%,%f%%,%d) #%x ",
+				   &col, &row,
+				   &rf, &gf, &bf, &nocolor,
+				   &check) ||
+			   match_c(buffer,
+				   "%d,%d: (%f%%,%f%%,%f%%) #%x ",
+				   &col, &row,
+				   &rf, &gf, &bf,
+				   &check)) {
+		    matched = TRUE;
+
+#define fp_fix(n) (int) (MaxRGB * (((n) > 100.0 ? 100.0 : (n)) / 100.0))
+
+		    r = fp_fix(rf);
+		    g = fp_fix(gf);
+		    b = fp_fix(bf);
+		}
+		if ((s - t) > 8)	/* 6 hex digits vs 8 */
+		    check /= 256;
+		if (matched) {
+		    int which, c;
+		    int want_r = (check >> 16) & 0xff;
+		    int want_g = (check >> 8) & 0xff;
+		    int want_b = (check >> 0) & 0xff;
+
+#define fp_err(tst,ref) ((tst > MaxRGB) || ((tst - ref)*(tst - ref)) > 4)
+
+		    if (fp_err(r, want_r) ||
+			fp_err(g, want_g) ||
+			fp_err(b, want_b)) {
+			okay = FALSE;
+			break;
+		    }
+		    c = gather_c_values((int) check);
+		    which = col + (row * result->wide);
+		    result->cells[which].ch = ((in_curses ||
+						check == 0xffffff)
+					       ? ' '
+					       : '#');
+		    if (c >= 0 && c < reading_last) {
+			result->cells[which].fg = c;
+			reading_ncols[c].count++;
+		    } else {
+			result->cells[which].fg = -1;
+		    }
+		} else {
+		    okay = FALSE;
+		    break;
+		}
+	    }
+	}
+	finish_c_values(result);
+	pclose(pp);
+	if (okay) {
+	    /* FIXME - is this trimming needed? */
+	    for (len = result->colors; len > 3; len--) {
+		if (result->fgcol[len - 1].fgcol == 0) {
+		    result->colors = len - 1;
+		} else {
+		    break;
+		}
+	    }
+	}
+    }
+  finish:
+    free(cmd);
+
+    if (!okay) {
+	result = free_pics_head(result);
+    }
+
+    return result;
+}
+
+static PICS_HEAD *
+read_picture(const char *filename, char **data)
+{
+    PICS_HEAD *pics;
+    if ((pics = parse_xbm(data)) == 0) {
+	dispose_c_values();
+	if ((pics = parse_xpm(data)) == 0) {
+	    dispose_c_values();
+	    if ((pics = parse_img(filename)) == 0) {
+		dispose_c_values();
+		free_data(data);
+		warning("unexpected file-format for \"%s\"", filename);
+	    } else if (pics->high == 0 || pics->wide == 0) {
+		dispose_c_values();
+		free_data(data);
+		pics = free_pics_head(pics);
+		warning("no picture found in \"%s\"", filename);
+	    }
+	}
+    }
+    return pics;
+}
+
+#define fg_color(pics,n) (pics->fgcol[n].fgcol)
+
+static void
+dump_picture(PICS_HEAD * pics)
+{
+    int y, x;
+
+    printf("Name %s\n", pics->name);
+    printf("Size %dx%d\n", pics->high, pics->wide);
+    printf("Color\n");
+    for (y = 0; y < pics->colors; ++y) {
+	if (fg_color(pics, y) < 0) {
+	    printf(" %3d: %d\n", y, fg_color(pics, y));
+	} else {
+	    printf(" %3d: #%06x\n", y, fg_color(pics, y));
+	}
+    }
+    for (y = 0; y < pics->high; ++y) {
+	for (x = 0; x < pics->wide; ++x) {
+	    putchar(pics->cells[y * pics->wide + x].ch);
+	}
+	putchar('\n');
+    }
+}
+
+#ifndef USE_DISPLAY_DRIVER
+static void
+init_display(const char *palette_path, int opt_d)
+{
+    (void) opt_d;
+    if (isatty(fileno(stdout))) {
+	in_curses = TRUE;
+	setlocale(LC_ALL, "");
+	initscr();
+	cbreak();
+	noecho();
+	curs_set(0);
+	if (has_colors()) {
+	    start_color();
+#if HAVE_USE_DEFAULT_COLORS
+	    if (opt_d)
+		use_default_colors();
+#endif
+	    init_palette(palette_path);
+	}
+	scrollok(stdscr, FALSE);
+	stop_curses();
+    }
+}
+
+static void
+show_picture(PICS_HEAD * pics)
+{
+    int y, x;
+    int n;
+
+    debugmsg("called show_picture");
+    logmsg("...using %dx%d screen", LINES, COLS);
+#if HAVE_RESET_COLOR_PAIRS
+    reset_color_pairs();
+#elif HAVE_CURSCR
+    wclear(curscr);
+    clear();
+#endif
+    if (has_colors()) {
+	logmsg("...using %d colors", pics->colors);
+	for (n = 0; n < pics->colors; ++n) {
+	    int my_pair = (n + 1);
+	    int my_color = map_color(fg_color(pics, n));
+#if USE_EXTENDED_COLORS
+	    if (use_extended_pairs) {
+		init_extended_pair(my_pair, my_color, my_color);
+	    } else
+#endif
+	    {
+		my_pair &= 0x7fff;
+		my_color &= 0x7fff;
+		init_pair((short) my_pair, (short) my_color, (short) my_color);
+	    }
+	}
+	attrset(COLOR_PAIR(1));
+	erase();
+    }
+    for (y = 0; y < pics->high; ++y) {
+	if (y >= LINES)
+	    break;
+	move(y, 0);
+
+	for (x = 0; x < pics->wide; ++x) {
+	    int my_pair;
+
+	    if (x >= COLS)
+		break;
+	    n = (y * pics->wide + x);
+	    my_pair = pics->cells[n].fg + 1;
+#if USE_EXTENDED_COLORS
+	    if (use_extended_pairs) {
+		cchar_t temp;
+		wchar_t wch[2];
+		wch[0] = (wchar_t) pics->cells[n].ch;
+		wch[1] = 0;
+		setcchar(&temp, wch, A_NORMAL, (short) my_pair, &my_pair);
+		add_wch(&temp);
+	    } else
+#endif
+	    {
+		attrset(COLOR_PAIR(my_pair));
+		addch((chtype) pics->cells[n].ch);
+	    }
+	}
+    }
+    if (slow_time >= 0) {
+	refresh();
+	if (slow_time > 0) {
+#ifdef NCURSES_VERSION
+	    napms(1000 * slow_time);
+#else
+	    sleep((unsigned) slow_time);
+#endif
+	}
+    } else {
+	wmove(stdscr, 0, 0);
+	getch();
+    }
+    if (!quiet)
+	endwin();
+}
+#endif
+
+static int
+compare_fg_counts(const void *a, const void *b)
+{
+    const FG_NODE *p = (const FG_NODE *) a;
+    const FG_NODE *q = (const FG_NODE *) b;
+    return (q->count - p->count);
+}
+
+static void
+report_colors(PICS_HEAD * pics)
+{
+    int accum;
+    double level;
+    int j;
+    int shift;
+    int total;
+    char buffer[256];
+
+    if (logfp == 0)
+	return;
+
+    qsort(pics->fgcol, (size_t) pics->colors, sizeof(FG_NODE), compare_fg_counts);
+    /*
+     * For debugging, show a (short) list of the colors used.
+     */
+    if (debugging && (pics->colors < 1000)) {
+	int digits = 0;
+	int high;
+	int wide = 4;
+	for (j = pics->colors; j != 0; j /= 10) {
+	    ++digits;
+	    if (j < 10)
+		++digits;
+	}
+	if (digits > 8)
+	    digits = 8;
+	logmsg("These colors were used:");
+	high = (pics->colors + wide - 1) / wide;
+	for (j = 0; j < high && j < pics->colors; ++j) {
+	    int k;
+	    char *s = buffer;
+	    *s = '\0';
+	    for (k = 0; k < wide; ++k) {
+		int n = j + (k * high);
+		size_t want = (sizeof(buffer) - (size_t) (s - buffer));
+		if (want < 100 || want >= sizeof(buffer))
+		    break;
+		if (n >= pics->colors)
+		    break;
+		if (k) {
+		    *s++ = ' ';
+		    if (digits < 8) {
+			_nc_SPRINTF(s, _nc_SLIMIT(want) "%*s", 8 - digits,
+				    " ");
+			s += strlen(s);
+		    }
+		}
+		if (pics->fgcol[n].fgcol >= 0) {
+		    _nc_SPRINTF(s, _nc_SLIMIT(want) "%3d #%06X %*d", n,
+				pics->fgcol[n].fgcol,
+				digits, pics->fgcol[n].count);
+		} else {
+		    _nc_SPRINTF(s, _nc_SLIMIT(want) "%3d (empty) %*d", n,
+				digits, pics->fgcol[n].count);
+		}
+		s += strlen(s);
+		if ((s - buffer) > 100)
+		    break;
+	    }
+	    logmsg("%s", buffer);
+	}
+    }
+
+    /*
+     * Given the list of colors sorted by the number of times they are used,
+     * log a short report showing the number of colors for 90%, 99%, 99.9%,
+     * etc.
+     */
+    logmsg("Number of colors versus number of cells");
+    total = pics->high * pics->wide;
+    accum = 0;
+    level = 0.1;
+    shift = 1;
+    for (j = 0; j < pics->colors; ++j) {
+	accum += pics->fgcol[j].count;
+	if (accum >= (total * (1.0 - level))) {
+	    int after = (shift > 2) ? shift - 2 : 0;
+	    logmsg("%8d colors (%.1f%%) in %d cells (%.*f%%)",
+		   j + 1,
+		   (100.0 * (j + 1)) / pics->colors,
+		   accum,
+		   after, (100.0 * accum) / total);
+	    if (accum >= total)
+		break;
+	    level /= 10.0;
+	    shift++;
+	}
+    }
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+    int opt_d = FALSE;
+    char ignore_ch;
+    const char *palette_path = 0;
+    const char *rgb_path = RGB_PATH;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "a:dLl:p:qr:s:x:")) != -1) {
+	switch (ch) {
+	case 'a':
+	    if (sscanf(optarg, "%lf%c", &aspect_ratio, &ignore_ch) != 1
+		|| aspect_ratio < 0.1
+		|| aspect_ratio > 10.) {
+		fprintf(stderr, "Expected a number in [0.1 to 10.]: %s\n", optarg);
+		usage(FALSE);
+	    }
+	    break;
+#if HAVE_USE_DEFAULT_COLORS
+	case 'd':
+	    opt_d = TRUE;
+	    break;
+#endif
+	case 'L':
+	    debugging = TRUE;
+	    break;
+	case 'l':
+	    if ((logfp = fopen(optarg, "a")) == 0)
+		failed(optarg);
+	    break;
+	case 'p':
+	    palette_path = optarg;
+	    break;
+	case 'q':
+	    quiet = TRUE;
+	    break;
+	case 'r':
+	    rgb_path = optarg;
+	    break;
+	case 's':
+	    slow_time = atoi(optarg);
+	    break;
+#if USE_EXTENDED_COLORS
+	case 'x':
+	    {
+		char *s = optarg;
+		while (*s) {
+		    switch (*s++) {
+		    case 'p':
+			use_extended_pairs = TRUE;
+			break;
+		    case 'c':
+			use_extended_colors = TRUE;
+			break;
+		    default:
+			usage(FALSE);
+			break;
+		    }
+		}
+	    }
+	    break;
+#endif
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+
+    if (optind < argc) {
+	char **rgb_data = read_file(rgb_path);
+	int n;
+
+	if (rgb_data)
+	    rgb_table = parse_rgb(rgb_data);
+
+	init_display(palette_path, opt_d);
+	if (optind >= argc)
+	    giveup("expected at least one image filename");
+
+	for (n = optind; n < argc; ++n) {
+	    PICS_HEAD *pics;
+	    char **data = read_file(argv[n]);
+
+	    if (data == 0) {
+		warning("cannot read \"%s\"", argv[n]);
+		continue;
+	    }
+	    if ((pics = read_picture(argv[n], data)) != 0) {
+		if (in_curses) {
+		    show_picture(pics);
+		} else {
+		    dump_picture(pics);
+		}
+		report_colors(pics);
+		dispose_c_values();
+		free_data(data);
+		free_pics_head(pics);
+	    }
+	}
+	free_data(rgb_data);
+	free(rgb_table);
+	free(all_colors);
+    } else {
+	usage(FALSE);
+    }
+
+    cleanup(EXIT_SUCCESS);
+}
diff --git a/test/picsmap.h b/test/picsmap.h
new file mode 100644
index 0000000..fc790a9
--- /dev/null
+++ b/test/picsmap.h
@@ -0,0 +1,71 @@
+/****************************************************************************
+ * Copyright 2020,2021 Thomas E. Dickey                                     *
+ * Copyright 2017 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                                                *
+ ****************************************************************************/
+/* $Id: picsmap.h,v 1.5 2021/04/24 23:25:17 tom Exp $ */
+
+#ifndef PICSMAP_H_INCL
+#define PICSMAP_H_INCL 1
+
+typedef int NUM_COLOR;
+typedef unsigned short NUM_COUNT;
+
+typedef struct {
+    char ch;			/* nominal character to display */
+    NUM_COLOR fg;		/* foreground color */
+} PICS_CELL;
+
+typedef struct {
+    NUM_COLOR fgcol;
+    NUM_COUNT count;
+} FG_NODE;
+
+typedef struct {
+    char *name;
+    short high;
+    short wide;
+    int colors;
+    FG_NODE *fgcol;
+    PICS_CELL *cells;
+} PICS_HEAD;
+
+typedef struct {
+    const char *name;
+    int value;
+} RGB_NAME;
+
+typedef struct {
+    short red;
+    short green;
+    short blue;
+} RGB_DATA;
+
+#endif /* PICSMAP_H_INCL */
diff --git a/test/popup_msg.c b/test/popup_msg.c
new file mode 100644
index 0000000..09eff5e
--- /dev/null
+++ b/test/popup_msg.c
@@ -0,0 +1,184 @@
+/****************************************************************************
+ * Copyright 2018-2020,2021 Thomas E. Dickey                                *
+ * Copyright 2017 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: popup_msg.c,v 1.11 2021/12/18 21:19:19 tom Exp $
+ *
+ * Show a multi-line message in a window which may extend beyond the screen.
+ *
+ * Thomas Dickey - 2017/4/15.
+ */
+
+#include <test.priv.h>
+
+#include <popup_msg.h>
+
+#if HAVE_NEWPAD
+
+static WINDOW *old_window;
+
+static void
+begin_popup(void)
+{
+    doupdate();
+    old_window = dupwin(curscr);
+}
+
+static void
+end_popup(void)
+{
+    touchwin(old_window);
+    wnoutrefresh(old_window);
+    doupdate();
+    delwin(old_window);
+}
+
+/*
+ * Display a temporary window, e.g., to display a help-message.
+ */
+void
+popup_msg(WINDOW *parent, const char *const *msg)
+{
+    int x0 = 4;
+    int y0 = 2;
+    int y1 = 0;
+    int y2 = 0;
+    int wide = getmaxx(parent) - ((x0 + 1) * 2);
+    int high = getmaxy(parent) - ((y0 + 1) * 2);
+    WINDOW *help;
+    WINDOW *data;
+    int n;
+    int width = 0;
+    int length;
+    int last_y;
+    int ch = ERR;
+
+    for (n = 0; msg[n] != 0; ++n) {
+	int check = (int) strlen(msg[n]);
+	if (width < check)
+	    width = check;
+    }
+    length = n;
+
+    if ((help = newwin(high, wide, y0, x0)) == 0)
+	return;
+    if ((data = newpad(length + 1, width + 1)) == 0) {
+	delwin(help);
+	return;
+    }
+
+    begin_popup();
+
+    keypad(data, TRUE);
+
+    for (n = 0; n < length; ++n) {
+	waddstr(data, msg[n]);
+	if ((n + 1) < length) {
+	    waddch(data, '\n');
+	}
+    }
+    y2 = getcury(data);
+    last_y = (y2 - (high - 3));
+
+    do {
+	switch (ch) {
+	case KEY_HOME:
+	    y1 = 0;
+	    break;
+	case KEY_END:
+	    y1 = last_y;
+	    break;
+	case KEY_PREVIOUS:
+	case KEY_PPAGE:
+	    if (y1 > 0) {
+		y1 -= high / 2;
+		if (y1 < 0)
+		    y1 = 0;
+	    } else {
+		beep();
+	    }
+	    break;
+	case KEY_NEXT:
+	case KEY_NPAGE:
+	    if (y1 < last_y) {
+		y1 += high / 2;
+		if (y1 > last_y)
+		    y1 = last_y;
+	    } else {
+		beep();
+	    }
+	    break;
+	case CTRL('P'):
+	case KEY_UP:
+	    if (y1 > 0)
+		--y1;
+	    else
+		beep();
+	    break;
+	case CTRL('N'):
+	case KEY_DOWN:
+	    if (y1 < last_y)
+		++y1;
+	    else
+		beep();
+	    break;
+	default:
+	    beep();
+	    break;
+	case ERR:
+	    break;
+	}
+	werase(help);
+	box(help, 0, 0);
+	wnoutrefresh(help);
+	pnoutrefresh(data, y1, 0, y0 + 1, x0 + 1, high, wide);
+	doupdate();
+    } while ((ch = wgetch(data)) != ERR && ch != QUIT && ch != ESCAPE);
+    werase(help);
+    wrefresh(help);
+    delwin(help);
+    delwin(data);
+
+    end_popup();
+}
+
+void
+popup_msg2(WINDOW *parent, char **msg)
+{
+    popup_msg(parent, (const char *const *) msg);
+}
+
+#else
+void
+popup_msg(WINDOW *parent, const char *const *msg)
+{
+    (void) parent;
+    (void) msg;
+    beep();
+}
+#endif
diff --git a/test/popup_msg.h b/test/popup_msg.h
new file mode 100644
index 0000000..88dff73
--- /dev/null
+++ b/test/popup_msg.h
@@ -0,0 +1,43 @@
+/****************************************************************************
+ * Copyright 2018,2020 Thomas E. Dickey                                     *
+ * Copyright 2017 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: popup_msg.h,v 1.5 2020/02/02 23:34:34 tom Exp $
+ *
+ * Utility functions for a popup-message or help-screen.
+ */
+
+#ifndef POPUP_MSG_H_incl
+#define POPUP_MSG_H_incl 1
+
+#include <test.priv.h>
+
+extern void popup_msg(WINDOW *parent, const char *const *msg);
+extern void popup_msg2(WINDOW *parent, char **msg);
+
+#endif /* POPUP_MSG_H_incl */
diff --git a/test/programs b/test/programs
new file mode 100644
index 0000000..191a16d
--- /dev/null
+++ b/test/programs
@@ -0,0 +1,120 @@
+# $Id: programs,v 1.55 2022/08/13 23:37:10 tom Exp $
+##############################################################################
+# Copyright 2018-2021,2022 Thomas E. Dickey                                  #
+# Copyright 2006-2016,2017 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.                                                             #
+##############################################################################
+#
+# Author: Thomas E. Dickey
+#
+# programs used for ncurses tests
+back_ground	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	back_ground dump_window
+background	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	background dump_window
+blue		$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	blue
+bs		$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	bs
+cardfile	$(LDFLAGS_DEFAULT)	$(LOCAL_LIBS)	cardfile
+chgat		$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	chgat popup_msg
+clip_printw	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	clip_printw popup_msg
+color_content	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	color_content
+color_set	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	color_set
+combine		$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	combine dump_window popup_msg
+demo_altkeys	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	demo_altkeys
+demo_defkey	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	demo_defkey
+demo_forms	$(LDFLAGS_DEFAULT)	$(LOCAL_LIBS)	demo_forms edit_field popup_msg
+demo_keyok	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	demo_keyok
+demo_menus	$(LDFLAGS_DEFAULT)	$(LOCAL_LIBS)	demo_menus
+demo_new_pair	$(LDFLAGS_DEFAULT)	$(LOCAL_LIBS)	demo_new_pair popup_msg
+demo_panels	$(LDFLAGS_DEFAULT)	$(LOCAL_LIBS)	demo_panels
+demo_tabs	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	demo_tabs
+demo_termcap	$(LDFLAGS_TINFO)	$(LOCAL_LIBS)	demo_termcap
+demo_terminfo	$(LDFLAGS_TINFO)	$(LOCAL_LIBS)	demo_terminfo
+ditto		$(LDFLAGS_THREADS)	$(LOCAL_LIBS)	ditto
+dots		$(LDFLAGS_TINFO)	$(LOCAL_LIBS)	dots
+dots_curses	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	dots_curses
+dots_mvcur	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	dots_mvcur
+dots_termcap	$(LDFLAGS_TINFO)	$(LOCAL_LIBS)	dots_termcap
+dots_xcurses	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	dots_xcurses
+dup_field	$(LDFLAGS_DEFAULT)	$(LOCAL_LIBS)	dup_field edit_field popup_msg
+echochar	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	echochar
+extended_color	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	extended_color
+filter		$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	filter
+firework	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	firework
+firstlast	$(LDFLAGS_DEFAULT)	$(LOCAL_LIBS)	firstlast
+foldkeys	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	foldkeys
+form_driver_w	$(LDFLAGS_DEFAULT)	$(LOCAL_LIBS)	form_driver_w popup_msg
+gdc		$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	gdc
+hanoi		$(LDFLAGS_CURSES_M)	$(LOCAL_LIBS)	hanoi
+hashtest	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	hashtest
+inch_wide	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	inch_wide popup_msg
+inchs		$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	inchs popup_msg
+ins_wide	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	ins_wide
+insdelln	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	insdelln popup_msg
+inserts		$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	inserts
+key_names	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	key_names
+keynames	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	keynames
+knight		$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	knight
+list_keys	$(LDFLAGS_TINFO)	$(LOCAL_LIBS)	list_keys
+lrtest		$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	lrtest
+move_field	$(LDFLAGS_DEFAULT)	$(LOCAL_LIBS)	move_field edit_field popup_msg
+movewindow	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	movewindow popup_msg
+ncurses		$(LDFLAGS_DEFAULT)	$(LOCAL_LIBS)	ncurses
+newdemo		$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	newdemo
+padview		$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	padview popup_msg
+pair_content	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	pair_content
+picsmap		$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	picsmap
+railroad	$(LDFLAGS_TINFO)	$(LOCAL_LIBS)	railroad
+rain		$(LDFLAGS_THREADS)	$(LOCAL_LIBS)	rain popup_msg
+redraw		$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	redraw popup_msg
+savescreen	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	savescreen popup_msg
+sp_tinfo	$(LDFLAGS_TINFO)	$(LOCAL_LIBS)	sp_tinfo
+tclock		$(LDFLAGS_CURSES_M)	$(LOCAL_LIBS)	tclock
+test_add_wchstr	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	test_add_wchstr
+test_addchstr	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	test_addchstr
+test_addstr	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	test_addstr
+test_addwstr	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	test_addwstr
+test_arrays	$(LDFLAGS_TINFO)	$(LOCAL_LIBS)	test_arrays
+test_delwin	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	test_delwin
+test_get_wstr	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	test_get_wstr popup_msg
+test_getstr	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	test_getstr popup_msg
+test_instr	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	test_instr
+test_inwstr	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	test_inwstr
+test_mouse	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	test_mouse
+test_opaque	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	test_opaque
+test_setupterm	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	test_setupterm
+test_sgr	$(LDFLAGS_TINFO)	$(LOCAL_LIBS)	test_sgr
+test_termattrs	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	test_termattrs
+test_tparm	$(LDFLAGS_TINFO)	$(LOCAL_LIBS)	test_tparm
+test_unget_wch	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	test_unget_wch
+test_vid_puts	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	test_vid_puts
+test_vidputs	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	test_vidputs
+testaddch	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	testaddch
+testcurs	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	testcurs
+testscanw	$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	testscanw
+view		$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	view popup_msg
+worm		$(LDFLAGS_THREADS)	$(LOCAL_LIBS)	worm
+xmas		$(LDFLAGS_CURSES)	$(LOCAL_LIBS)	xmas
+
+# vile:makemode
diff --git a/test/railroad.c b/test/railroad.c
new file mode 100644
index 0000000..4d7c070
--- /dev/null
+++ b/test/railroad.c
@@ -0,0 +1,292 @@
+/****************************************************************************
+ * Copyright 2019-2020,2022 Thomas E. Dickey                                *
+ * Copyright 2000-2013,2017 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.                                                           *
+ ****************************************************************************/
+
+/*
+ * Author: Thomas E. Dickey - 2000
+ *
+ * $Id: railroad.c,v 1.26 2022/12/11 00:12:13 tom Exp $
+ *
+ * A simple demo of the termcap interface.
+ */
+#define USE_TINFO
+#include <test.priv.h>
+
+#if HAVE_TGETENT
+
+static char *wipeit;
+static char *moveit;
+static int length;
+static int height;
+
+static char *finisC;
+static char *finisS;
+static char *finisU;
+
+static char *startC;
+static char *startS;
+static char *startU;
+
+static char *backup;
+
+static bool interrupted = FALSE;
+
+static
+TPUTS_PROTO(outc, c)
+{
+    int rc = OK;
+
+    if (interrupted) {
+	char tmp = (char) c;
+	if (write(STDOUT_FILENO, &tmp, (size_t) 1) == -1)
+	    rc = ERR;
+    } else {
+	if (putc(c, stdout) == EOF)
+	    rc = ERR;
+    }
+    TPUTS_RETURN(rc);
+}
+
+static void
+PutChar(int ch)
+{
+    putchar(ch);
+    fflush(stdout);
+    napms(moveit ? 10 : 50);	/* not really termcap... */
+}
+
+static void
+Backup(void)
+{
+    tputs(backup != 0 ? backup : "\b", 1, outc);
+}
+
+static void
+MyShowCursor(int flag)
+{
+    if (startC != 0 && finisC != 0) {
+	tputs(flag ? startC : finisC, 1, outc);
+    }
+}
+
+static void
+StandOut(int flag)
+{
+    if (startS != 0 && finisS != 0) {
+	tputs(flag ? startS : finisS, 1, outc);
+    }
+}
+
+static void
+Underline(int flag)
+{
+    if (startU != 0 && finisU != 0) {
+	tputs(flag ? startU : finisU, 1, outc);
+    }
+}
+
+static void
+ShowSign(char *string)
+{
+    char *base = string;
+    int first, last;
+
+    if (moveit != 0) {
+	tputs(tgoto(moveit, 0, height - 1), 1, outc);
+	tputs(wipeit, 1, outc);
+    }
+
+    while (*string != 0) {
+	int ch = *string;
+	if (ch != ' ') {
+	    if (moveit != 0) {
+		for (first = length - 2; first >= (string - base); first--) {
+		    if (first < length - 1) {
+			tputs(tgoto(moveit, first + 1, height - 1), 1, outc);
+			PutChar(' ');
+		    }
+		    tputs(tgoto(moveit, first, height - 1), 1, outc);
+		    PutChar(ch);
+		}
+	    } else {
+		last = ch;
+		if (isalpha(ch)) {
+		    first = isupper(ch) ? 'A' : 'a';
+		} else if (isdigit(ch)) {
+		    first = '0';
+		} else {
+		    first = ch;
+		}
+		if (first < last) {
+		    Underline(1);
+		    while (first < last) {
+			PutChar(first);
+			Backup();
+			first++;
+		    }
+		    Underline(0);
+		}
+	    }
+	    if (moveit != 0)
+		Backup();
+	}
+	StandOut(1);
+	PutChar(ch);
+	StandOut(0);
+	fflush(stdout);
+	string++;
+    }
+    if (moveit != 0)
+	tputs(wipeit, 1, outc);
+    putchar('\n');
+}
+
+static void
+cleanup(void)
+{
+    Underline(0);
+    StandOut(0);
+    MyShowCursor(1);
+}
+
+static void
+onsig(int n GCC_UNUSED)
+{
+    interrupted = TRUE;
+    cleanup();
+    ExitProgram(EXIT_FAILURE);
+}
+
+static void
+railroad(char **args)
+{
+    NCURSES_CONST char *name = getenv("TERM");
+    char buffer[1024];
+    char area[1024], *ap = area;
+    int z;
+
+    if (name == 0)
+#ifdef EXP_WIN32_DRIVER
+	name = "ms-terminal";
+#else
+	name = "dumb";
+#endif
+
+    InitAndCatch(z = tgetent(buffer, name), onsig);
+    if (z >= 0) {
+
+	wipeit = tgetstr("ce", &ap);
+	height = tgetnum("li");
+	length = tgetnum("co");
+	moveit = tgetstr("cm", &ap);
+
+	if (wipeit == 0
+	    || moveit == 0
+	    || height <= 0
+	    || length <= 0) {
+	    wipeit = 0;
+	    moveit = 0;
+	    height = 0;
+	    length = 0;
+	}
+
+	startS = tgetstr("so", &ap);
+	finisS = tgetstr("se", &ap);
+
+	startU = tgetstr("us", &ap);
+	finisU = tgetstr("ue", &ap);
+
+	backup = tgetstr("le", &ap);
+
+	startC = tgetstr("ve", &ap);
+	finisC = tgetstr("vi", &ap);
+
+	MyShowCursor(0);
+
+	while (*args) {
+	    ShowSign(*args++);
+	}
+	MyShowCursor(1);
+    }
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: railroad [options]"
+	,""
+	,USAGE_COMMON
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) {
+	switch (ch) {
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+
+    if (optind < argc) {
+	railroad(argv + optind);
+    } else {
+	static char world[] = "Hello World";
+	static char *hello[] =
+	{world, 0};
+	railroad(hello);
+    }
+    ExitProgram(EXIT_SUCCESS);
+}
+
+#else
+int
+main(void)
+{
+    printf("This program requires termcap\n");
+    exit(EXIT_FAILURE);
+}
+#endif
diff --git a/test/rain.c b/test/rain.c
new file mode 100644
index 0000000..1b1d81a
--- /dev/null
+++ b/test/rain.c
@@ -0,0 +1,468 @@
+/****************************************************************************
+ * Copyright 2018-2020,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2014,2017 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: rain.c,v 1.57 2022/12/04 00:40:11 tom Exp $
+ */
+#include <test.priv.h>
+#include <popup_msg.h>
+
+/* rain 11/3/1980 EPS/CITHEP */
+
+#ifdef USE_PTHREADS
+#include <pthread.h>
+#endif
+
+WANT_USE_WINDOW();
+
+#define MAX_THREADS	10
+#define MAX_DROP	5
+
+struct DATA;
+
+typedef void (*DrawPart) (struct DATA *);
+
+typedef struct DATA {
+    int y, x;
+#ifdef USE_PTHREADS
+    DrawPart func;
+    int state;
+#endif
+} DATA;
+
+#ifdef USE_PTHREADS
+pthread_cond_t cond_next_drop;
+pthread_mutex_t mutex_drop_data;
+pthread_mutex_t mutex_next_drop;
+static int used_threads;
+
+typedef struct {
+    pthread_t myself;
+    long counter;
+} STATS;
+
+static STATS drop_threads[MAX_THREADS];
+#endif
+
+#if HAVE_USE_WINDOW
+static int
+safe_wgetch(WINDOW *w, void *data GCC_UNUSED)
+{
+    return wgetch(w);
+}
+#endif
+
+static void
+onsig(int n GCC_UNUSED)
+{
+    stop_curses();
+    ExitProgram(EXIT_FAILURE);
+}
+
+static double
+ranf(void)
+{
+    long r = (rand() & 077777);
+    return ((double) r / 32768.);
+}
+
+static int
+random_x(void)
+{
+    return (int) (((double) (COLS - 4) * ranf()) + 2);
+}
+
+static int
+random_y(void)
+{
+    return (int) (((double) (LINES - 4) * ranf()) + 2);
+}
+
+static int
+next_j(int j)
+{
+    if (j == 0)
+	j = MAX_DROP - 1;
+    else
+	--j;
+    if (has_colors()) {
+	int z = (int) (3 * ranf());
+	(void) attrset(AttrArg(COLOR_PAIR(z), (z ? A_BOLD : A_NORMAL)));
+    }
+    return j;
+}
+
+static void
+part1(DATA * drop)
+{
+    MvAddCh(drop->y, drop->x, '.');
+}
+
+static void
+part2(DATA * drop)
+{
+    MvAddCh(drop->y, drop->x, 'o');
+}
+
+static void
+part3(DATA * drop)
+{
+    MvAddCh(drop->y, drop->x, 'O');
+}
+
+static void
+part4(DATA * drop)
+{
+    MvAddCh(drop->y - 1, drop->x, '-');
+    MvAddStr(drop->y, drop->x - 1, "|.|");
+    MvAddCh(drop->y + 1, drop->x, '-');
+}
+
+static void
+part5(DATA * drop)
+{
+    MvAddCh(drop->y - 2, drop->x, '-');
+    MvAddStr(drop->y - 1, drop->x - 1, "/ \\");
+    MvAddStr(drop->y, drop->x - 2, "| O |");
+    MvAddStr(drop->y + 1, drop->x - 1, "\\ /");
+    MvAddCh(drop->y + 2, drop->x, '-');
+}
+
+static void
+part6(DATA * drop)
+{
+    MvAddCh(drop->y - 2, drop->x, ' ');
+    MvAddStr(drop->y - 1, drop->x - 1, "   ");
+    MvAddStr(drop->y, drop->x - 2, "     ");
+    MvAddStr(drop->y + 1, drop->x - 1, "   ");
+    MvAddCh(drop->y + 2, drop->x, ' ');
+}
+
+#ifdef USE_PTHREADS
+static void
+napsome(void)
+{
+    napms(60);
+}
+
+/*
+ * This runs inside the use_window() mutex.
+ */
+static int
+really_draw(WINDOW *win, void *arg)
+{
+    DATA *data = (DATA *) arg;
+
+    (void) win;
+    next_j(data->state);
+    data->func(data);
+    refresh();
+    return OK;
+}
+
+static void
+draw_part(void (*func) (DATA *), int state, DATA * data)
+{
+    data->func = func;
+    data->state = state;
+    use_window(stdscr, really_draw, (void *) data);
+    napsome();
+}
+
+/*
+ * Tell the threads that one of them can start work on a new raindrop.
+ * They may all be busy if we're sending requests too rapidly.
+ */
+static int
+put_next_drop(void)
+{
+    pthread_cond_broadcast(&cond_next_drop);
+    pthread_mutex_unlock(&mutex_next_drop);
+
+    return 0;
+}
+
+/*
+ * Wait until we're assigned the task of drawing a new raindrop.
+ */
+static int
+get_next_drop(void)
+{
+    pthread_mutex_lock(&mutex_next_drop);
+    pthread_cond_wait(&cond_next_drop, &mutex_next_drop);
+
+    return TRUE;
+}
+
+static void *
+draw_drop(void *arg)
+{
+    DATA mydata;
+    int mystats;
+
+    /*
+     * Find myself in the list of threads so we can count the number of loops.
+     */
+    for (mystats = 0; mystats < MAX_THREADS; ++mystats) {
+#if defined(_NC_WINDOWS) && !defined(__WINPTHREADS_VERSION)
+	if (drop_threads[mystats].myself.p == pthread_self().p)
+#else
+	if (drop_threads[mystats].myself == pthread_self())
+#endif
+	    break;
+    }
+
+    do {
+	if (mystats < MAX_THREADS)
+	    drop_threads[mystats].counter++;
+
+	/*
+	 * Make a copy of caller's data.  We're cheating for the cases after
+	 * the first loop since we still have a pointer into the main thread
+	 * to the data which it uses for setting up this thread (but it has
+	 * been modified to use different coordinates).
+	 */
+	pthread_mutex_lock(&mutex_drop_data);
+	mydata = *(DATA *) arg;
+	pthread_mutex_unlock(&mutex_drop_data);
+
+	draw_part(part1, 0, &mydata);
+	draw_part(part2, 1, &mydata);
+	draw_part(part3, 2, &mydata);
+	draw_part(part4, 3, &mydata);
+	draw_part(part5, 4, &mydata);
+	draw_part(part6, 0, &mydata);
+
+    } while (get_next_drop());
+
+    return NULL;
+}
+
+/*
+ * The description of pthread_create() is misleading, since it implies that
+ * threads will exit cleanly after their function returns.
+ *
+ * Since they do not (and the number of threads is limited by system
+ * resources), make a limited number of threads, and signal any that are
+ * waiting when we want a thread past that limit.
+ */
+static int
+start_drop(DATA * data)
+{
+    int rc;
+
+    if (!used_threads) {
+	/* mutex and condition for signalling thread */
+	pthread_mutex_init(&mutex_next_drop, NULL);
+	pthread_cond_init(&cond_next_drop, NULL);
+    }
+
+    if (used_threads < MAX_THREADS) {
+	rc = pthread_create(&(drop_threads[used_threads].myself),
+			    NULL,
+			    draw_drop,
+			    data);
+	++used_threads;
+    } else {
+	rc = put_next_drop();
+    }
+    return rc;
+}
+#endif
+
+static int
+get_input(void)
+{
+    return USING_WINDOW1(stdscr, wgetch, safe_wgetch);
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: rain [options]"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+#if HAVE_USE_DEFAULT_COLORS
+	," -d       invoke use_default_colors"
+#endif
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    static const char *help[] =
+    {
+	"Commands:",
+	" q/Q        exit the program",
+	" s          do single-step",
+	" <space>    undo single-step",
+	"",
+	0
+    };
+
+    bool done = FALSE;
+    DATA drop;
+#ifndef USE_PTHREADS
+    DATA last[MAX_DROP];
+#endif
+    int j = 0;
+    int ch;
+#if HAVE_USE_DEFAULT_COLORS
+    bool d_option = FALSE;
+#endif
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "d")) != -1) {
+	switch (ch) {
+#if HAVE_USE_DEFAULT_COLORS
+	case 'd':
+	    d_option = TRUE;
+	    break;
+#endif
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind < argc)
+	usage(FALSE);
+
+    setlocale(LC_ALL, "");
+
+    InitAndCatch(initscr(), onsig);
+    if (has_colors()) {
+	int bg = COLOR_BLACK;
+	start_color();
+#if HAVE_USE_DEFAULT_COLORS
+	if (d_option && (use_default_colors() == OK))
+	    bg = -1;
+#endif
+	init_pair(1, COLOR_BLUE, (short) bg);
+	init_pair(2, COLOR_CYAN, (short) bg);
+    }
+    nl();
+    noecho();
+    curs_set(0);
+    timeout(0);
+
+#ifdef USE_PTHREADS
+    pthread_mutex_init(&mutex_drop_data, NULL);
+#else /* !USE_PTHREADS */
+    for (j = MAX_DROP; --j >= 0;) {
+	last[j].x = random_x();
+	last[j].y = random_y();
+    }
+    j = 0;
+#endif
+
+    while (!done) {
+#ifdef USE_PTHREADS
+	pthread_mutex_lock(&mutex_drop_data);
+
+	drop.x = random_x();
+	drop.y = random_y();
+
+	if (start_drop(&drop) != 0) {
+	    beep();
+	}
+
+	pthread_mutex_unlock(&mutex_drop_data);
+#else
+	drop.x = random_x();
+	drop.y = random_y();
+
+	/*
+	 * The non-threaded code draws parts of each drop on each loop.
+	 */
+	part1(&drop);
+
+	part2(&last[j]);
+
+	j = next_j(j);
+	part3(&last[j]);
+
+	j = next_j(j);
+	part4(&last[j]);
+
+	j = next_j(j);
+	part5(&last[j]);
+
+	j = next_j(j);
+	part6(&last[j]);
+
+	last[j] = drop;
+#endif
+
+	switch (get_input()) {
+	case ('q'):
+	case ('Q'):
+	    done = TRUE;
+	    break;
+	case 's':
+	    nodelay(stdscr, FALSE);
+	    break;
+	case ' ':
+	    nodelay(stdscr, TRUE);
+	    break;
+#ifdef KEY_RESIZE
+	case (KEY_RESIZE):
+	    break;
+#endif
+	case HELP_KEY_1:
+	    popup_msg(stdscr, help);
+	    break;
+	case ERR:
+	    break;
+	default:
+	    beep();
+	}
+	napms(50);
+    }
+    stop_curses();
+#ifdef USE_PTHREADS
+    printf("Counts per thread:\n");
+    for (j = 0; j < MAX_THREADS; ++j)
+	printf("  %d:%ld\n", j, drop_threads[j].counter);
+#endif
+    ExitProgram(EXIT_SUCCESS);
+}
diff --git a/test/redraw.c b/test/redraw.c
new file mode 100644
index 0000000..749f790
--- /dev/null
+++ b/test/redraw.c
@@ -0,0 +1,249 @@
+/****************************************************************************
+ * Copyright 2020-2021,2022 Thomas E. Dickey                                *
+ * Copyright 2006-2012,2017 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: redraw.c,v 1.17 2022/12/10 22:28:50 tom Exp $
+ *
+ * Demonstrate the redrawwin() and wredrawln() functions.
+ * Thomas Dickey - 2006/11/4
+ */
+
+#include <test.priv.h>
+#include <popup_msg.h>
+
+static void
+trash(int beg_x, int max_x, int cur_x)
+{
+    int x;
+
+    for (x = cur_x; x > beg_x; --x) {
+	putchar('\b');
+    }
+    for (x = beg_x; x < max_x; ++x) {
+	if (x < cur_x)
+	    putchar('<');
+	else if (x == cur_x)
+	    putchar('=');
+	else if (x > cur_x)
+	    putchar('>');
+    }
+    for (x = max_x; x > cur_x; --x) {
+	putchar('\b');
+    }
+    fflush(stdout);
+}
+
+static void
+test_redraw(WINDOW *win)
+{
+    static const char *help[] =
+    {
+	"Commands:",
+	"  ^Q/ESC/q   - quit",
+	"  w          - recur in a new window",
+	"  !          - overwrite current line using stdio outside curses.",
+#ifdef NCURSES_VERSION
+	"  @          - run \"date\" command, to put its output on screen.",
+#endif
+	"  ^L         - call redrawwin() for current window.",
+	"  ^W         - call wredrawln() for current line/current window.",
+	"  arrow-keys - move cursor on the screen",
+	"",
+	"Other control characters are added to the screen in printable form.",
+	"Other printable characters are added to the screen as is.",
+	0
+    };
+
+    WINDOW *win1;
+    WINDOW *win2;
+    bool done = FALSE;
+    int max_y, max_x;
+    int beg_y, beg_x;
+
+    assert(win != 0);
+
+    scrollok(win, TRUE);
+    keypad(win, TRUE);
+    getmaxyx(win, max_y, max_x);
+    getbegyx(win, beg_y, beg_x);
+
+    while (!done) {
+	int ch = wgetch(win);
+	int y, x;
+
+	getyx(win, y, x);
+	switch (ch) {
+	case 'q':
+	    /* FALLTHRU */
+	case QUIT:
+	case ESCAPE:
+	    done = TRUE;
+	    break;
+	case 'w':
+	    win1 = newwin(max_y, max_x,
+			  beg_y, beg_x);
+	    win2 = newwin(max_y - 2, max_x - 2,
+			  beg_y + 1, beg_x + 1);
+	    box(win1, 0, 0);
+	    wrefresh(win1);
+
+	    test_redraw(win2);
+
+	    delwin(win2);
+	    delwin(win1);
+
+	    touchwin(win);
+	    break;
+
+	case '!':
+	    /*
+	     * redrawwin() and wredrawln() do not take into account the
+	     * possibility that the cursor may have moved.  That makes them
+	     * cumbersome for using with a shell command.  So we simply
+	     * trash the current line of the window using backspace/overwrite.
+	     */
+	    trash(beg_x, max_x, x + beg_x);
+	    break;
+
+#ifdef NCURSES_VERSION
+	case '@':
+	    /*
+	     * For a shell command, we can work around the problem noted above
+	     * using mvcur().  It is ifdef'd for NCURSES, since X/Open does
+	     * not define the case where the old location is unknown.
+	     */
+	    IGNORE_RC(system("date"));
+	    mvcur(-1, -1, y, x);
+	    break;
+#endif
+
+	case CTRL('W'):
+	    redrawwin(win);
+	    break;
+
+	case CTRL('L'):
+	    wredrawln(win, y, 1);
+	    break;
+
+	case KEY_UP:
+	    if (y > 0)
+		wmove(win, y - 1, x);
+	    break;
+
+	case KEY_DOWN:
+	    if (y < max_y)
+		wmove(win, y + 1, x);
+	    break;
+
+	case KEY_LEFT:
+	    if (x > 0)
+		wmove(win, y, x - 1);
+	    break;
+
+	case KEY_RIGHT:
+	    if (x < max_x)
+		wmove(win, y, x + 1);
+	    break;
+
+	case HELP_KEY_1:
+	    popup_msg(win, help);
+	    break;
+
+	default:
+	    if (ch > KEY_MIN) {
+		waddstr(win, keyname(ch));
+		waddch(win, '\n');
+	    } else {
+		waddstr(win, unctrl(UChar(ch)));
+	    }
+	    break;
+	}
+	wnoutrefresh(win);
+	doupdate();
+    }
+}
+
+static void
+usage(int ok)
+{
+    static const char *tbl[] =
+    {
+	"Usage: redraw [options]"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+	," -e       use stderr (default stdout)"
+	," -n       do not initialize terminal"
+    };
+    unsigned n;
+    for (n = 0; n < SIZEOF(tbl); ++n)
+	fprintf(stderr, "%s\n", tbl[n]);
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+    bool no_init = FALSE;
+    FILE *my_fp = stdout;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "en")) != -1) {
+	switch (ch) {
+	case 'e':
+	    my_fp = stderr;
+	    break;
+	case 'n':
+	    no_init = TRUE;
+	    break;
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind < argc)
+	usage(FALSE);
+
+    if (no_init) {
+	START_TRACE();
+    } else {
+	newterm((char *) 0, my_fp, stdin);
+    }
+
+    raw();
+    noecho();
+    test_redraw(stdscr);
+    endwin();
+    ExitProgram(EXIT_SUCCESS);
+}
diff --git a/test/savescreen.c b/test/savescreen.c
new file mode 100644
index 0000000..3ea6193
--- /dev/null
+++ b/test/savescreen.c
@@ -0,0 +1,663 @@
+/****************************************************************************
+ * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 2006-2017,2018 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: savescreen.c,v 1.62 2022/12/10 23:23:27 tom Exp $
+ *
+ * Demonstrate save/restore functions from the curses library.
+ * Thomas Dickey - 2007/7/14
+ */
+
+#define NEED_TIME_H
+#include <test.priv.h>
+#include <popup_msg.h>
+#include <parse_rgb.h>
+
+#if HAVE_SCR_DUMP
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#if defined(__hpux)
+#define MyMarker 'X'
+#else
+#define MyMarker ACS_DIAMOND
+#endif
+
+#define MAX_ANSI 8
+
+static bool use_init = FALSE;
+static bool keep_dumps = FALSE;
+
+#if USE_WIDEC_SUPPORT
+/* In HPUX curses, cchar_t is opaque; other implementations are not */
+static wchar_t
+BaseChar(cchar_t data)
+{
+    wchar_t my_wchar[CCHARW_MAX];
+    wchar_t result = 0;
+    attr_t my_attr;
+    short my_pair;
+    if (getcchar(&data, my_wchar, &my_attr, &my_pair, NULL) == OK)
+	result = my_wchar[0];
+    return result;
+}
+#endif
+
+static int
+fexists(const char *name)
+{
+    struct stat sb;
+    return (stat(name, &sb) == 0 && (sb.st_mode & S_IFMT) == S_IFREG);
+}
+
+static void
+setup_next(void)
+{
+    curs_set(1);
+    reset_shell_mode();
+}
+
+static void
+cleanup(char *files[])
+{
+    if (!keep_dumps) {
+	int n;
+
+	for (n = 0; files[n] != 0; ++n) {
+	    unlink(files[n]);
+	}
+    }
+}
+
+static int
+load_screen(char *filename)
+{
+    int result;
+
+    if (use_init) {
+	if ((result = scr_init(filename)) != ERR)
+	    result = scr_restore(filename);
+    } else {
+	result = scr_set(filename);
+    }
+    return result;
+}
+
+/*
+ * scr_restore() or scr_set() operates on curscr.  If we read a character using
+ * getch() that will refresh stdscr, wiping out the result.  To avoid that,
+ * copy the data back from curscr to stdscr.
+ */
+static void
+after_load(void)
+{
+    overwrite(curscr, stdscr);
+    doupdate();
+}
+
+static void
+show_what(int color, int which, int last)
+{
+    int y, x, n;
+    time_t now;
+    char *mytime;
+
+    getyx(stdscr, y, x);
+
+    move(0, 0);
+    printw("Color %d.  Saved %d of %d (? for help)", color, which, last + 1);
+
+    now = time((time_t *) 0);
+    mytime = ctime(&now);
+    for (n = (int) strlen(mytime) - 1; n >= 0; --n) {
+	if (isspace(UChar(mytime[n]))) {
+	    mytime[n] = '\0';
+	} else {
+	    break;
+	}
+    }
+    mvprintw(0, (COLS - n - 2), " %s", mytime);
+
+    move(y, x);
+
+    refresh();
+}
+
+static int
+get_command(int color, int which, int last)
+{
+    int ch;
+
+    timeout(50);
+
+    do {
+	show_what(color, which, last);
+	ch = getch();
+    } while (ch == ERR);
+
+    return ch;
+}
+
+static int
+dump_screen(char **files, int color, int which, int last, bool use_colors)
+{
+#if USE_WIDEC_SUPPORT
+    cchar_t mycc;
+#endif
+    char *filename = files[which];
+    bool dumped = FALSE;
+
+    if (filename != 0) {
+	dumped = TRUE;
+	show_what(color, ++which, last);
+	if (scr_dump(filename) == ERR) {
+	    endwin();
+	    printf("Cannot write screen-dump %s\n", filename);
+	    cleanup(files);
+	    ExitProgram(EXIT_SUCCESS);
+	}
+	if (use_colors) {
+	    int cx, cy;
+	    int pair = 1 + (which % MAX_ANSI);
+	    /*
+	     * Change the background color, to make it more obvious.  But that
+	     * changes the existing text-color.  Copy the old values from the
+	     * currently displayed screen.
+	     */
+	    bkgd((chtype) COLOR_PAIR(pair));
+	    for (cy = 1; cy < LINES; ++cy) {
+		for (cx = 0; cx < COLS; ++cx) {
+		    wmove(curscr, cy, cx);
+		    wmove(stdscr, cy, cx);
+#if USE_WIDEC_SUPPORT
+		    if (win_wch(curscr, &mycc) != ERR) {
+			int myxx = wcwidth(BaseChar(mycc));
+			if (myxx > 0) {
+			    wadd_wchnstr(stdscr, &mycc, 1);
+			    cx += (myxx - 1);
+			}
+		    }
+#else
+		    waddch(stdscr, winch(curscr));
+#endif
+		}
+	    }
+	}
+    }
+    return dumped;
+}
+
+static void
+editor_help(void)
+{
+    static const char *msgs[] =
+    {
+	"You are now in the screen-editor, which allows you to make some",
+	"lines on the screen, as well as save copies of the screen to a",
+	"temporary file",
+	"",
+	"Keys:",
+	"   q           quit",
+	"   n           run the screen-loader to show the saved screens",
+	"   <space>     dump a screen",
+	"",
+	"   a           toggle between '#' and graphic symbol for drawing",
+	"   c           change color drawn by line to next in palette",
+	"   h,j,k,l or arrows to move around the screen, drawing",
+	0
+    };
+    popup_msg(stdscr, msgs);
+}
+
+static void
+replay_help(void)
+{
+    static const char *msgs[] =
+    {
+	"You are now in the screen-loader, which allows you to view",
+	"the dumped/restored screens.",
+	"",
+	"Keys:",
+	"   q           quit",
+	"   <space>     load the next screen",
+	"   <backspace> load the previous screen",
+	0
+    };
+    popup_msg(stdscr, msgs);
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: savescreen [-r] files"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+	," -f file  fill/initialize screen using text from this file"
+	," -i       use scr_init/scr_restore rather than scr_set"
+	," -k       keep the restored dump-files rather than removing them"
+	," -r       replay the screen-dump files"
+    };
+    unsigned n;
+    for (n = 0; n < SIZEOF(msg); ++n) {
+	fprintf(stderr, "%s\n", msg[n]);
+    }
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+    int which = 0;
+    int last;
+    bool use_colors = FALSE;
+    bool replaying = FALSE;
+    bool done = FALSE;
+    char **files;
+    char *fill_by = 0;
+#if USE_WIDEC_SUPPORT
+    cchar_t mycc;
+    static const wchar_t mywc[2] =
+    {L'#', 0};
+#endif
+
+    setlocale(LC_ALL, "");
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "f:ikr")) != -1) {
+	switch (ch) {
+	case 'f':
+	    fill_by = optarg;
+	    break;
+	case 'i':
+	    use_init = TRUE;
+	    break;
+	case 'k':
+	    keep_dumps = TRUE;
+	    break;
+	case 'r':
+	    replaying = TRUE;
+	    break;
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+
+    files = argv + optind;
+    last = argc - optind - 1;
+
+    if (replaying) {
+	while (last >= 0 && !fexists(files[last]))
+	    --last;
+    }
+
+    initscr();
+    cbreak();
+    noecho();
+    keypad(stdscr, TRUE);
+    curs_set(0);
+
+    if (has_colors() && (start_color() == OK) && COLORS >= MAX_ANSI) {
+#if USE_WIDEC_SUPPORT
+	bool using_rgb = FALSE;
+#endif
+	static const struct {
+	    int fg, bg;
+	} table[MAX_ANSI] = {
+#define DATA(fg,bg) { COLOR_##fg, COLOR_##bg }
+	    DATA(RED, WHITE),
+		DATA(GREEN, WHITE),
+		DATA(YELLOW, BLACK),
+		DATA(BLUE, WHITE),
+		DATA(MAGENTA, WHITE),
+		DATA(MAGENTA, BLACK),
+		DATA(CYAN, WHITE),
+		DATA(CYAN, BLACK),
+#undef DATA
+	};
+	int n;
+	int pair = 1;
+
+	use_colors = TRUE;
+	/*
+	 * Discounting color-pair 0 (no color), make the next 8 color pairs
+	 * useful for leaving a visually distinct trail of characters on the
+	 * screen.
+	 */
+	for (n = 0; n < MAX_ANSI; ++n) {
+	    init_pair((short) pair++, (short) table[n].fg, (short) table[n].bg);
+	}
+	/*
+	 * After that, use color pairs for constructing a test-pattern, e.g.,
+	 * imitating xterm's scripts.
+	 */
+	if (fill_by == 0) {
+	    if (COLORS <= 256) {
+		for (n = 0; n < COLORS; ++n)
+		    init_pair((short) (n + MAX_ANSI), (short) n, (short) n);
+	    }
+#if HAVE_TIGETSTR && USE_WIDEC_SUPPORT
+	    else {
+		int r_max, g_max, b_max;
+
+		if (parse_rgb(&r_max, &g_max, &b_max) > 0) {
+		    int rows = LINES - 1;
+		    int cols = COLS - 1;
+		    int b_delta = (b_max / rows);
+		    int r_delta = (r_max / cols);
+		    int g_delta = (g_max / cols);
+		    int row = 0;
+		    int b = 0;
+
+		    using_rgb = TRUE;
+		    while (row++ < rows) {
+			int col = 0;
+			int r = 0;
+			int g = g_max;
+			while (col++ < cols) {
+			    int color = (((r * (g_max + 1)) + g) * (b_max + 1)
+					 + b + MAX_ANSI);
+#if USE_EXTENDED_COLOR
+			    init_extended_pair(pair, color, color);
+#else
+			    init_pair(pair, color, color);
+#endif
+			    pair++;
+			    r += r_delta;
+			    g -= g_delta;
+			}
+			b += b_delta;
+		    }
+		}
+	    }
+#endif
+	}
+	if ((fill_by == 0) && !replaying) {
+#if USE_WIDEC_SUPPORT
+	    int cube = 0;
+#endif
+	    /*
+	     * Originally (before wide-characters) ncurses supported 16 colors.
+	     */
+	    if (COLORS >= 16 && COLORS <= 256) {
+		mvprintw(2, 0, "System colors:\n");
+		for (n = 0; n < 16; ++n) {
+		    pair = n + MAX_ANSI;
+		    addch((chtype) (' ' | COLOR_PAIR(pair)));
+		    addch((chtype) (' ' | COLOR_PAIR(pair)));
+		    if (((n + 1) % 8) == 0)
+			addch('\n');
+		}
+	    }
+	    /*
+	     * Even with ncurses, you need wide-character support to have more
+	     * than 16 colors.
+	     */
+#if USE_WIDEC_SUPPORT
+	    if (COLORS == 88) {
+		cube = 4;
+	    } else if (COLORS == 256) {
+		cube = 6;
+	    }
+	    if (cube != 0) {
+		int r, g, b;
+		int cube0 = 16;
+		int cube1 = cube0 + (cube * cube * cube);
+
+		addch('\n');
+		printw("Color cube, %dx%dx%d:\n", cube, cube, cube);
+		for (g = 0; g < cube; g++) {
+		    for (r = 0; r < cube; r++) {
+			for (b = 0; b < cube; b++) {
+			    pair = MAX_ANSI
+				+ 16
+				+ (r * cube * cube) + (g * cube) + b;
+			    setcchar(&mycc, mywc, 0, (short) pair, NULL);
+			    add_wch(&mycc);
+			    add_wch(&mycc);
+			}
+			addch(' ');
+		    }
+		    addch('\n');
+		}
+		addch('\n');
+		printw("Grayscale ramp:\n");
+		for (n = cube1; n < COLORS; ++n) {
+		    pair = n + MAX_ANSI;
+		    setcchar(&mycc, mywc, 0, (short) pair, NULL);
+		    add_wch(&mycc);
+		    add_wch(&mycc);
+		}
+	    } else if ((COLORS > 256) && using_rgb) {
+		int rows = LINES - 1;
+		int cols = COLS - 1;
+		int row = 0;
+
+		pair = MAX_ANSI;
+		while (row++ < rows) {
+		    int col = 0;
+		    while (col++ < cols) {
+			setcchar(&mycc, mywc, 0, (short) pair, &pair);
+			add_wch(&mycc);
+			++pair;
+		    }
+		    addch('\n');
+		}
+		addch('\n');
+	    }
+#endif
+	}
+    }
+
+    if (fill_by != 0) {
+	FILE *fp = fopen(fill_by, "r");
+	if (fp != 0) {
+	    bool filled = FALSE;
+	    move(1, 0);
+	    while ((ch = fgetc(fp)) != EOF) {
+		if (addch(UChar(ch)) == ERR) {
+		    filled = TRUE;
+		    break;
+		}
+	    }
+	    fclose(fp);
+	    if (!filled) {
+		while (addch(' ') != ERR) {
+		    ;
+		}
+	    }
+	    move(0, 0);
+	} else {
+	    stop_curses();
+	    fprintf(stderr, "Cannot open \"%s\"\n", fill_by);
+	    ExitProgram(EXIT_FAILURE);
+	}
+    }
+
+    if (replaying) {
+
+	/*
+	 * Use the last file as the initial/current screen.
+	 */
+	if (last < 0) {
+	    stop_curses();
+	    printf("No screen-dumps given\n");
+	    ExitProgram(EXIT_FAILURE);
+	}
+
+	which = last;
+	if (load_screen(files[which]) == ERR) {
+	    stop_curses();
+	    printf("Cannot load screen-dump %s\n", files[which]);
+	    ExitProgram(EXIT_FAILURE);
+	}
+	after_load();
+
+	while (!done && (ch = getch()) != ERR) {
+	    switch (ch) {
+	    case 'n':
+		/*
+		 * If we got a "next" here, skip to the final screen before
+		 * moving to the next process.
+		 */
+		setup_next();
+		which = last;
+		done = TRUE;
+		break;
+	    case 'q':
+		cleanup(files);
+		done = TRUE;
+		break;
+	    case KEY_BACKSPACE:
+	    case '\b':
+		if (--which < 0)
+		    which = last;
+		break;
+	    case ' ':
+		if (++which > last)
+		    which = 0;
+		break;
+	    case HELP_KEY_1:
+		replay_help();
+		break;
+	    default:
+		beep();
+		continue;
+	    }
+
+	    if (ch == 'q') {
+		;
+	    } else if (scr_restore(files[which]) == ERR) {
+		endwin();
+		printf("Cannot load screen-dump %s\n", files[which]);
+		cleanup(files);
+		ExitProgram(EXIT_FAILURE);
+	    } else {
+		wrefresh(curscr);
+	    }
+	}
+	endwin();
+    } else {
+	int y = 0;
+	int x = 0;
+	int color = 0;
+	int altchars = 0;
+	bool dirty = use_colors || (fill_by != 0);
+
+	while (!done) {
+	    switch (get_command(color, which, last)) {
+	    case 'n':
+		if (dirty && files[which]) {
+		    dump_screen(files, color, which, last, use_colors);
+		}
+		setup_next();
+		done = TRUE;
+		break;
+	    case 'q':
+		cleanup(files);
+		done = TRUE;
+		break;
+	    case ' ':
+		if (dump_screen(files, color, which, last, use_colors)) {
+		    which = (which + 1) % MAX_ANSI;
+		    dirty = FALSE;
+		} else {
+		    setup_next();
+		    done = TRUE;
+		}
+		break;
+	    case KEY_LEFT:
+	    case 'h':
+		if (--x < 0)
+		    x = COLS - 1;
+		break;
+	    case KEY_DOWN:
+	    case 'j':
+		if (++y >= LINES)
+		    y = 1;
+		break;
+	    case KEY_UP:
+	    case 'k':
+		if (--y < 1)
+		    y = LINES - 1;
+		break;
+	    case KEY_RIGHT:
+	    case 'l':
+		if (++x >= COLS)
+		    x = 0;
+		break;
+	    case 'a':
+		altchars = !altchars;
+		break;
+	    case 'c':
+		if (use_colors) {
+		    color = (color + 1) % MAX_ANSI;
+		}
+		break;
+	    case HELP_KEY_1:
+		editor_help();
+		break;
+	    default:
+		beep();
+		continue;
+	    }
+	    if (!done) {
+		chtype attr = A_REVERSE;
+		chtype ch2 = (altchars ? MyMarker : '#');
+		if (use_colors) {
+		    attr |= (chtype) COLOR_PAIR(color);
+		}
+		move(y, x);
+		AddCh(ch2 | attr);
+		move(y, x);
+		dirty = TRUE;
+	    }
+	}
+	endwin();
+    }
+    ExitProgram(EXIT_SUCCESS);
+}
+
+#else
+int
+main(void)
+{
+    printf("This program requires the screen-dump functions\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif
diff --git a/test/savescreen.sh b/test/savescreen.sh
new file mode 100755
index 0000000..1ffab2f
--- /dev/null
+++ b/test/savescreen.sh
@@ -0,0 +1,67 @@
+#!/bin/sh
+##############################################################################
+# Copyright 2020,2022 Thomas E. Dickey                                       #
+# Copyright 2007-2009,2018 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: savescreen.sh,v 1.8 2022/07/16 16:34:34 tom Exp $
+#
+# Use this script to exercise "savescreen".
+# It starts by generating a series of temporary-filenames, which are passed
+# to the test-program.  Loop as long as the first file named exists.
+
+: "${TMPDIR:=/tmp}"
+
+# "mktemp -d" would be preferable, but is not standard.
+MY_DIR=$TMPDIR/savescreen$$
+trap "rm -rf $MY_DIR; exit 1" 1 2 3
+trap "rm -rf $MY_DIR" 0
+umask 077
+mkdir $MY_DIR || exit 1
+
+PARAMS=
+NFILES=4
+PREFIX=$MY_DIR/savescreen
+n=0
+BEGINS=$PREFIX-$n.tmp
+while test $n != $NFILES
+do
+	LATEST=$PREFIX-$n.tmp
+	PARAMS="$PARAMS $LATEST"
+	n=`expr $n + 1`
+done
+
+${0%.sh} $PARAMS
+if test -f $BEGINS
+then
+	while test -f $BEGINS
+	do
+		"${0%.sh}" -r $PARAMS
+		test $? != 0 && break
+	done
+else
+	echo "No screens were saved"
+fi
diff --git a/test/sp_tinfo.c b/test/sp_tinfo.c
new file mode 100644
index 0000000..d003dfa
--- /dev/null
+++ b/test/sp_tinfo.c
@@ -0,0 +1,355 @@
+/****************************************************************************
+ * Copyright 2019-2020,2022 Thomas E. Dickey                                *
+ * Copyright 2017 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: sp_tinfo.c,v 1.28 2022/12/10 23:23:27 tom Exp $
+ *
+ * TOTO: add option for non-sp-funcs interface
+ */
+
+#define USE_TINFO
+#include <test.priv.h>
+
+#if HAVE_TPUTS_SP
+/*
+ * The higher-level curses library stores a TERMINAL* inside SCREEN, but the
+ * latter is opaque.  This structure helps us keep the two associated.
+ */
+typedef struct {
+    const char *name;
+    FILE *fp;
+    SCREEN *sp;
+    TERMINAL *term;
+    int (*outc) (SCREEN *, int);
+} MYDATA;
+
+static bool opt_n = FALSE;	/* true to suppress new_prescr */
+static bool opt_t = FALSE;	/* true to use termcap */
+
+static int
+my_outc(SCREEN *sp, int ch)
+{
+    (void) sp;
+    return fputc(ch, stdout);
+}
+
+static int
+my_errc(SCREEN *sp, int ch)
+{
+    (void) sp;
+    return fputc(ch, stderr);
+}
+
+static MYDATA *
+initialize(const char *name, FILE *output)
+{
+    MYDATA *result = typeCalloc(MYDATA, 1);
+    int error;
+
+    result->fp = output;
+    result->name = name;
+    result->outc = (fileno(output) == 1) ? my_outc : my_errc;
+    result->sp = opt_n ? NULL : new_prescr();
+
+    if (opt_t) {
+	char *temp = strdup(name);
+	tgetent_sp(result->sp, temp, name);
+	free(temp);
+    } else {
+	setupterm((NCURSES_CONST char *) name, fileno(output), &error);
+    }
+    result->term = cur_term;
+
+    return result;
+}
+
+static void
+show_flag(MYDATA * data, const char *name, int value)
+{
+    if (value < 0) {
+	fprintf(data->fp, " %s = (unknown)\n", name);
+    } else if (value == 0) {
+	fprintf(data->fp, " %s = false\n", name);
+    } else {
+	fprintf(data->fp, " %s = true\n", name);
+    }
+}
+
+#define TC_PARMS data->sp, (NCURSES_CONST char *)tc
+#define TI_PARMS data->sp, (NCURSES_CONST char *)ti
+
+static void
+show_cap_flag(MYDATA * data, const char *ti, const char *tc)
+{
+    const char *name = (opt_t ? tc : ti);
+    show_flag(data, name, (opt_t
+			   ? tgetflag_sp(TC_PARMS)
+			   : tigetflag_sp(TI_PARMS)));
+}
+
+static void
+show_number(MYDATA * data, const char *name, int value)
+{
+    if (value <= -2) {
+	fprintf(data->fp, " %s = (unknown)\n", name);
+    } else if (value <= -1) {
+	fprintf(data->fp, " %s = (missing)\n", name);
+    } else {
+	fprintf(data->fp, " %s = %d\n", name, value);
+    }
+}
+
+static void
+show_cap_number(MYDATA * data, const char *ti, const char *tc)
+{
+    const char *name = (opt_t ? tc : ti);
+    show_number(data, name, (opt_t
+			     ? tgetnum_sp(TC_PARMS)
+			     : tigetnum_sp(TI_PARMS)));
+}
+
+static void
+show_string(MYDATA * data, const char *name, const char *value)
+{
+    fprintf(data->fp, " %s = ", name);
+    if (value == 0) {
+	fprintf(data->fp, "(missing)");
+    } else if (value == (char *) -1) {
+	fprintf(data->fp, "(canceled)");
+    } else {
+	int ch;
+	while ((ch = UChar(*value++)) != '\0') {
+	    if (ch < 32) {
+		fprintf(data->fp, "^%c", ch | '@');
+	    } else if (ch == 127) {
+		fprintf(data->fp, "^?");
+	    } else if (ch > 127) {
+		fprintf(data->fp, "\\%03o", ch);
+	    } else {
+		fprintf(data->fp, "%c", ch);
+	    }
+	}
+    }
+    fprintf(data->fp, "\n");
+}
+
+static void
+show_cap_string(MYDATA * data, const char *ti, const char *tc)
+{
+    const char *name = (opt_t ? tc : ti);
+    char tcapjunk[1024];
+    char *tcap_ptr = tcapjunk;
+    show_string(data, name, (opt_t
+			     ? tgetstr_sp(TC_PARMS, &tcap_ptr)
+			     : tigetstr_sp(TI_PARMS)));
+}
+
+static void
+show_char(MYDATA * data, const char *name, int value)
+{
+    if (value < 0) {
+	show_string(data, name, "(missing)");
+    } else {
+	char temp[2];
+	temp[0] = (char) value;
+	temp[1] = '\0';
+	show_string(data, name, temp);
+    }
+}
+
+static void
+do_stuff(MYDATA * data)
+{
+    SCREEN *sp = data->sp;
+#if NCURSES_EXT_FUNCS
+    char *s;
+    int my_code = 1234;
+    const char *my_text = "\033[?m";
+#endif
+
+    set_curterm_sp(sp, data->term);
+
+    /* putp always goes to standard output */
+    putp_sp(sp, "Hello ");
+    putp_sp(sp, data->name);
+    putp_sp(sp, "!\n");
+
+    fprintf(data->fp, "Term: %s\n", termname_sp(sp));
+    fprintf(data->fp, "Long: %s\n", longname_sp(sp));
+    show_cap_flag(data, "am", "am");
+    show_cap_number(data, "lines", "li");
+    show_cap_string(data, "clear", "cl");
+    show_cap_string(data, "tbc", "ct");
+    show_flag(data, "has_ic", has_ic_sp(sp));
+    show_flag(data, "has_il", has_il_sp(sp));
+    show_number(data, "baudrate", baudrate_sp(sp));
+    show_char(data, "erase ch", erasechar_sp(sp));
+    show_char(data, "kill ch", killchar_sp(sp));
+    show_string(data, "unctrl", unctrl_sp(sp, 033));
+    fflush(data->fp);
+
+#if NCURSES_EXT_FUNCS
+    define_key_sp(sp, my_text, my_code);
+    has_key_sp(sp, 0);
+    key_defined_sp(sp, my_text);
+    if ((s = keybound_sp(sp, my_code, 0)) != 0)
+	free(s);
+#endif
+    keyname_sp(sp, '?');
+#if NCURSES_EXT_FUNCS
+    keyok_sp(sp, my_code, FALSE);
+    keyok_sp(sp, my_code, TRUE);
+#endif
+
+    savetty_sp(sp);
+
+    def_shell_mode_sp(sp);
+
+    /*
+     * These functions are low-level settings for ncurses.
+     */
+#if NCURSES_EXT_FUNCS
+    set_tabsize_sp(sp, 5);	/* waddch */
+#endif
+    typeahead_sp(sp, FALSE);	/* waddch */
+    use_env_sp(sp, FALSE);	/* newterm */
+    use_tioctl_sp(sp, FALSE);	/* newterm */
+    intrflush_sp(sp, 0, 0);	/* wgetch */
+    flushinp_sp(sp);		/* waddch */
+    halfdelay_sp(sp, 5);	/* wgetch */
+
+    /*
+     * These manipulate the terminal modes, mainly for wgetch.
+     */
+    cbreak_sp(sp);
+    raw_sp(sp);
+    def_prog_mode_sp(sp);
+
+    delay_output_sp(sp, 200);
+
+    napms_sp(sp, 10);
+
+    nocbreak_sp(sp);
+    noqiflush_sp(sp);
+    noraw_sp(sp);
+    qiflush_sp(sp);
+
+    resetty_sp(sp);
+
+    tputs_sp(sp, "{reset-mode}\n", 0, data->outc);
+
+    reset_prog_mode_sp(sp);
+
+    curs_set_sp(sp, 0);
+    tputs_sp(sp, "{prog-mode}\n", 0, data->outc);
+
+    reset_shell_mode_sp(sp);
+
+    tputs_sp(sp, "{shell-mode}\n", 0, data->outc);
+}
+
+static void
+cleanup(MYDATA * data)
+{
+    set_curterm(data->term);
+    del_curterm(data->term);
+    free(data);
+}
+
+static void
+usage(int ok)
+{
+    static const char *tbl[] =
+    {
+	"Usage: sp_tinfo [output] [error]"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+	," -n       suppress call to new_prescr()"
+	," -t       use termcap functions rather than terminfo"
+    };
+    size_t n;
+    for (n = 0; n < SIZEOF(tbl); ++n) {
+	fprintf(stderr, "%s\n", tbl[n]);
+    }
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    MYDATA *my_out;
+    MYDATA *my_err;
+    int ch;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "nt")) != -1) {
+	switch (ch) {
+	case 'n':
+	    opt_n = TRUE;
+	    break;
+	case 't':
+	    opt_t = TRUE;
+	    break;
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    argv += (optind - 1);
+    argc -= (optind - 1);
+
+    if (argc > 3)
+	usage(FALSE);
+
+    my_out = initialize((argc > 1) ? argv[1] : "vt100", stdout);
+    my_err = initialize((argc > 2) ? argv[2] : "ansi", stderr);
+
+    do_stuff(my_out);
+    do_stuff(my_err);
+
+    cleanup(my_out);
+    cleanup(my_err);
+
+    ExitProgram(EXIT_SUCCESS);
+}
+#else
+int
+main(void)
+{
+    fprintf(stderr,
+	    "This program requires the low-level ncurses sp-funcs tputs_sp\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif
diff --git a/test/tclock.c b/test/tclock.c
new file mode 100644
index 0000000..75b6570
--- /dev/null
+++ b/test/tclock.c
@@ -0,0 +1,302 @@
+/* $Id: tclock.c,v 1.47 2022/12/10 23:23:27 tom Exp $ */
+
+#define NEED_TIME_H
+#include <test.priv.h>
+
+#if HAVE_MATH_H && HAVE_MATH_FUNCS
+
+#include <math.h>
+
+/*
+  tclock - analog/digital clock for curses.
+  If it gives you joy, then
+  (a) I'm glad
+  (b) you need to get out more :-)
+
+  This program is copyright Howard Jones, September 1994
+  (ha.jones@ic.ac.uk). It may be freely distributed as
+  long as this copyright message remains intact, and any
+  modifications are clearly marked as such. [In fact, if
+  you modify it, I wouldn't mind the modifications back,
+  especially if they add any nice features. A good one
+  would be a precalc table for the 60 hand positions, so
+  that the floating point stuff can be ditched. As I said,
+  it was a 20 hackup minute job.]
+
+  COMING SOON: tfishtank. Be the envy of your mac-owning
+  colleagues.
+*/
+
+/* To compile: cc -o tclock tclock.c -lcurses -lm */
+
+#ifndef PI
+#define PI 3.141592654
+#endif
+
+#define sign(_x) (_x<0?-1:1)
+
+#define ASPECT 2.2
+#define ROUND(value) ((int)((value) + 0.5))
+
+#define A2X(angle,radius) ROUND(ASPECT * radius * sin(angle))
+#define A2Y(angle,radius) ROUND(radius * cos(angle))
+
+/* Plot a point */
+static void
+plot(int x, int y, int col)
+{
+    MvAddCh(y, x, (chtype) col);
+}
+
+/* Draw a diagonal(arbitrary) line using Bresenham's algorithm. */
+static void
+dline(int pair, int from_x, int from_y, int x2, int y2, int ch)
+{
+    int dx, dy;
+    int ax, ay;
+    int sx, sy;
+    int x, y;
+    int d;
+
+    if (has_colors())
+	(void) attrset(AttrArg(COLOR_PAIR(pair), 0));
+
+    dx = x2 - from_x;
+    dy = y2 - from_y;
+
+    ax = abs(dx * 2);
+    ay = abs(dy * 2);
+
+    sx = sign(dx);
+    sy = sign(dy);
+
+    x = from_x;
+    y = from_y;
+
+    if (ax > ay) {
+	d = ay - (ax / 2);
+
+	while (1) {
+	    plot(x, y, ch);
+	    if (x == x2)
+		return;
+
+	    if (d >= 0) {
+		y += sy;
+		d -= ax;
+	    }
+	    x += sx;
+	    d += ay;
+	}
+    } else {
+	d = ax - (ay / 2);
+
+	while (1) {
+	    plot(x, y, ch);
+	    if (y == y2)
+		return;
+
+	    if (d >= 0) {
+		x += sx;
+		d -= ay;
+	    }
+	    y += sy;
+	    d += ax;
+	}
+    }
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: tclock [options]"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+#if HAVE_USE_DEFAULT_COLORS
+	," -d       invoke use_default_colors"
+#endif
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int i, cx, cy;
+    double cr, mradius, hradius, mangle, hangle;
+    double sangle, sradius, hours;
+    int hdx, hdy;
+    int mdx, mdy;
+    int sdx, sdy;
+    int ch;
+    int lastbeep = -1;
+    bool odd = FALSE;
+    time_t tim;
+    struct tm *t;
+    char szChar[20];
+    char *text;
+    short my_bg = COLOR_BLACK;
+#if HAVE_GETTIMEOFDAY
+    struct timeval current;
+#endif
+    double fraction = 0.0;
+#if HAVE_USE_DEFAULT_COLORS
+    bool d_option = FALSE;
+#endif
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "d")) != -1) {
+	switch (ch) {
+#if HAVE_USE_DEFAULT_COLORS
+	case 'd':
+	    d_option = TRUE;
+	    break;
+#endif
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind < argc)
+	usage(FALSE);
+
+    setlocale(LC_ALL, "");
+
+    initscr();
+    noecho();
+    cbreak();
+    nodelay(stdscr, TRUE);
+    curs_set(0);
+
+    if (has_colors()) {
+	start_color();
+#if HAVE_USE_DEFAULT_COLORS
+	if (d_option && (use_default_colors() == OK))
+	    my_bg = -1;
+#endif
+	init_pair(1, COLOR_RED, my_bg);
+	init_pair(2, COLOR_MAGENTA, my_bg);
+	init_pair(3, COLOR_GREEN, my_bg);
+	init_pair(4, COLOR_WHITE, COLOR_BLUE);
+    }
+#ifdef KEY_RESIZE
+    keypad(stdscr, TRUE);
+  restart:
+#endif
+    cx = (COLS - 1) / 2;	/* 39 */
+    cy = LINES / 2;		/* 12 */
+    if (cx / ASPECT < cy)
+	cr = cx / ASPECT;
+    else
+	cr = cy;
+    sradius = (5 * cr) / 6;	/* 10 */
+    mradius = (3 * cr) / 4;	/* 9 */
+    hradius = cr / 2;		/* 6 */
+
+    for (i = 0; i < 12; i++) {
+	sangle = (i + 1) * (2.0 * PI) / 12.0;
+	sdx = A2X(sangle, sradius);
+	sdy = A2Y(sangle, sradius);
+	_nc_SPRINTF(szChar, _nc_SLIMIT(sizeof(szChar)) "%d", i + 1);
+
+	MvAddStr(cy - sdy, cx + sdx, szChar);
+    }
+
+    MvAddStr(0, 0, "ASCII Clock by Howard Jones (ha.jones@ic.ac.uk),1994");
+
+    sradius = (4 * sradius) / 5;
+    for (;;) {
+	napms(100);
+
+	tim = time(0);
+	t = localtime(&tim);
+
+	hours = (t->tm_hour + (t->tm_min / 60.0));
+	if (hours > 12.0)
+	    hours -= 12.0;
+
+	mangle = ((t->tm_min + (t->tm_sec / 60.0)) * (2 * PI) / 60.0);
+	mdx = A2X(mangle, mradius);
+	mdy = A2Y(mangle, mradius);
+
+	hangle = ((hours) * (2.0 * PI) / 12.0);
+	hdx = A2X(hangle, hradius);
+	hdy = A2Y(hangle, hradius);
+
+#if HAVE_GETTIMEOFDAY
+	gettimeofday(&current, 0);
+	fraction = ((double) current.tv_usec / 1.0e6);
+#endif
+	sangle = ((t->tm_sec + fraction) * (2.0 * PI) / 60.0);
+	sdx = A2X(sangle, sradius);
+	sdy = A2Y(sangle, sradius);
+
+	dline(3, cx, cy, cx + mdx, cy - mdy, '#');
+
+	(void) attrset(A_REVERSE);
+	dline(2, cx, cy, cx + hdx, cy - hdy, '.');
+	attroff(A_REVERSE);
+
+	if (has_colors())
+	    (void) attrset(AttrArg(COLOR_PAIR(1), 0));
+
+	dline(1, cx, cy, cx + sdx, cy - sdy, 'O');
+
+	if (has_colors())
+	    (void) attrset(AttrArg(COLOR_PAIR(0), 0));
+
+	text = ctime(&tim);
+	MvPrintw(2, 0, "%.*s", (int) (strlen(text) - 1), text);
+	refresh();
+	if ((t->tm_sec % 5) == 0
+	    && t->tm_sec != lastbeep) {
+	    lastbeep = t->tm_sec;
+	    if (has_colors()) {
+		odd = !odd;
+		bkgd((chtype) (odd ? COLOR_PAIR(4) : COLOR_PAIR(0)));
+	    }
+	    beep();
+	}
+
+	if ((ch = getch()) != ERR) {
+#ifdef KEY_RESIZE
+	    if (ch == KEY_RESIZE) {
+		flash();
+		erase();
+		wrefresh(curscr);
+		goto restart;
+	    }
+#endif
+	    break;
+	}
+
+	dline(0, cx, cy, cx + hdx, cy - hdy, ' ');
+	dline(0, cx, cy, cx + mdx, cy - mdy, ' ');
+	dline(0, cx, cy, cx + sdx, cy - sdy, ' ');
+
+    }
+
+    stop_curses();
+    ExitProgram(EXIT_SUCCESS);
+}
+#else
+int
+main(void)
+{
+    printf("This program requires the header math.h and trignometric functions\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif
diff --git a/test/terminal.xbm b/test/terminal.xbm
new file mode 100644
index 0000000..b8d9204
--- /dev/null
+++ b/test/terminal.xbm
@@ -0,0 +1,52 @@
+/*****************************************************************************/
+/**       Copyright 1988 by Evans & Sutherland Computer Corporation,        **/
+/**                          Salt Lake City, Utah                           **/
+/**                                                                         **/
+/**                           All Rights Reserved                           **/
+/**                                                                         **/
+/**    Permission to use, copy, modify, and distribute this software and    **/
+/**    its documentation  for  any  purpose  and  without  fee is hereby    **/
+/**    granted, provided that the above copyright notice appear  in  all    **/
+/**    copies and that both  that  copyright  notice  and  this  permis-    **/
+/**    sion  notice appear in supporting  documentation,  and  that  the    **/
+/**    name  of Evans & Sutherland  not be used in advertising or publi-    **/
+/**    city pertaining to distribution  of the software without  specif-    **/
+/**    ic, written prior permission.                                        **/
+/**                                                                         **/
+/**    EVANS  & SUTHERLAND  DISCLAIMS  ALL  WARRANTIES  WITH  REGARD  TO    **/
+/**    THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILI-    **/
+/**    TY AND FITNESS, IN NO EVENT SHALL EVANS &  SUTHERLAND  BE  LIABLE    **/
+/**    FOR  ANY  SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY  DAM-    **/
+/**    AGES  WHATSOEVER RESULTING FROM  LOSS OF USE,  DATA  OR  PROFITS,    **/
+/**    WHETHER   IN  AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS    **/
+/**    ACTION, ARISING OUT OF OR IN  CONNECTION  WITH  THE  USE  OR PER-    **/
+/**    FORMANCE OF THIS SOFTWARE.                                           **/
+/*****************************************************************************/
+
+#define xterm_width 48
+#define xterm_height 48
+static char xterm_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0x20, 0x00, 0x00, 0x00, 0x00, 0x03, 0x20, 0xfe, 0xff, 0xff, 0x1f, 0x05,
+   0x20, 0x01, 0x00, 0x00, 0x20, 0x09, 0xa0, 0x00, 0x00, 0x00, 0x40, 0x11,
+   0xa0, 0xfc, 0xff, 0x00, 0x40, 0x21, 0xa0, 0x00, 0x00, 0x00, 0x40, 0x21,
+   0xa0, 0xfc, 0x01, 0x00, 0x40, 0x21, 0xa0, 0x00, 0x00, 0x00, 0x40, 0x21,
+   0xa0, 0xfc, 0xff, 0x3f, 0x40, 0x21, 0xa0, 0x00, 0x00, 0x00, 0x40, 0x21,
+   0xa0, 0xfc, 0x03, 0x00, 0x40, 0x21, 0xa0, 0x00, 0x00, 0x00, 0x40, 0x21,
+   0xa0, 0xfc, 0xff, 0x01, 0x40, 0x21, 0xa0, 0x00, 0x00, 0x00, 0x40, 0x21,
+   0xa0, 0xfc, 0x00, 0x00, 0x40, 0x21, 0xa0, 0x00, 0x00, 0x00, 0x40, 0x21,
+   0xa0, 0x00, 0x00, 0x00, 0x40, 0x21, 0xa0, 0x00, 0x00, 0x00, 0x40, 0x21,
+   0xa0, 0x00, 0x00, 0x00, 0x40, 0x21, 0xa0, 0x00, 0x00, 0x00, 0x40, 0x21,
+   0xa0, 0x00, 0x00, 0x00, 0x40, 0x21, 0xa0, 0x00, 0x00, 0x00, 0x40, 0x21,
+   0xa0, 0x00, 0x00, 0x00, 0x40, 0x21, 0xa0, 0x00, 0x00, 0x00, 0x40, 0x11,
+   0xa0, 0x00, 0x00, 0x00, 0x40, 0x11, 0xa0, 0x00, 0x00, 0x00, 0x40, 0x09,
+   0xa0, 0x00, 0x00, 0x00, 0x40, 0x09, 0xa0, 0x00, 0x00, 0x00, 0x40, 0x05,
+   0x20, 0x01, 0x00, 0x00, 0x20, 0x05, 0x20, 0xfe, 0xff, 0xff, 0x1f, 0x03,
+   0x20, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc0, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xc0, 0xff, 0xff, 0xff, 0xff, 0x03, 0x20, 0x00, 0x00, 0x00, 0x00, 0x03,
+   0xa0, 0xaa, 0xaa, 0xaa, 0x2a, 0x03, 0x10, 0x00, 0x00, 0x00, 0x80, 0x02,
+   0x50, 0x55, 0x55, 0x55, 0x95, 0x02, 0x08, 0x00, 0x00, 0x00, 0x40, 0x02,
+   0xa8, 0xaa, 0xaa, 0xaa, 0x4a, 0x02, 0x04, 0x00, 0x00, 0x00, 0x20, 0x01,
+   0xb4, 0xff, 0xff, 0xff, 0xad, 0x00, 0x02, 0x00, 0x00, 0x00, 0x50, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/test/test.priv.h b/test/test.priv.h
new file mode 100644
index 0000000..e94e574
--- /dev/null
+++ b/test/test.priv.h
@@ -0,0 +1,1303 @@
+/****************************************************************************
+ * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2017,2018 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.                                                           *
+ ****************************************************************************/
+
+/****************************************************************************
+ *  Author: Thomas E. Dickey                    1996-on                     *
+ ****************************************************************************/
+/* $Id: test.priv.h,v 1.206 2022/12/04 00:08:15 tom Exp $ */
+
+#ifndef __TEST_PRIV_H
+#define __TEST_PRIV_H 1
+
+#include <ncurses_cfg.h>
+
+/*
+ * Fix ifdef's that look for the form/menu/panel libraries, if we are building
+ * with wide-character ncurses.
+ */
+#ifdef  HAVE_LIBFORMW
+#define HAVE_LIBFORMW 1
+#define HAVE_LIBFORM 1
+#endif
+
+#ifdef  HAVE_LIBMENUW
+#define HAVE_LIBMENUW 1
+#define HAVE_LIBMENU 1
+#endif
+
+#ifdef  HAVE_LIBPANELW
+#define HAVE_LIBPANELW 1
+#define HAVE_LIBPANEL 1
+#endif
+
+/*
+ * Fallback definitions to accommodate broken compilers.
+ */
+#ifndef HAVE_ALLOC_PAIR
+#define HAVE_ALLOC_PAIR 0
+#endif
+
+#ifndef HAVE_ASSUME_DEFAULT_COLORS
+#define HAVE_ASSUME_DEFAULT_COLORS 0
+#endif
+
+#ifndef HAVE_CFMAKERAW
+#define HAVE_CFMAKERAW 0
+#endif
+
+#ifndef HAVE_CHGAT
+#define HAVE_CHGAT 0
+#endif
+
+#ifndef HAVE_COLOR_CONTENT
+#define HAVE_COLOR_CONTENT 0
+#endif
+
+#ifndef HAVE_COPYWIN
+#define HAVE_COPYWIN 0
+#endif
+
+#ifndef HAVE_COLOR_SET
+#define HAVE_COLOR_SET 0
+#endif
+
+#ifndef HAVE_BSD_STRING_H
+#define HAVE_BSD_STRING_H 0
+#endif
+
+#ifndef HAVE_CURSES_VERSION
+#define HAVE_CURSES_VERSION 0
+#endif
+
+#ifndef HAVE_CURSCR
+#define HAVE_CURSCR 0
+#endif
+
+#ifndef HAVE_DELSCREEN
+#define HAVE_DELSCREEN 0
+#endif
+
+#ifndef HAVE_DUPWIN
+#define HAVE_DUPWIN 0
+#endif
+
+#ifndef HAVE_FILTER
+#define HAVE_FILTER 0
+#endif
+
+#ifndef HAVE_FORM_H
+#define HAVE_FORM_H 0
+#endif
+
+#ifndef HAVE_GETBEGX
+#define HAVE_GETBEGX 0
+#endif
+
+#ifndef HAVE_GETCURX
+#define HAVE_GETCURX 0
+#endif
+
+#ifndef HAVE_GETMAXX
+#define HAVE_GETMAXX 0
+#endif
+
+#ifndef HAVE_GETTIMEOFDAY
+#define HAVE_GETTIMEOFDAY 0
+#endif
+
+#ifndef HAVE_GETOPT_H
+#define HAVE_GETOPT_H 0
+#endif
+
+#ifndef HAVE_GETPARX
+#define HAVE_GETPARX 0
+#endif
+
+#ifndef HAVE_GETWIN
+#define HAVE_GETWIN 0
+#endif
+
+#ifndef HAVE_HALFDELAY
+#define HAVE_HALFDELAY 0
+#endif
+
+#ifndef HAVE_INIT_EXTENDED_COLOR
+#define HAVE_INIT_EXTENDED_COLOR 0
+#endif
+
+#ifndef HAVE_LIBFORM
+#define HAVE_LIBFORM 0
+#endif
+
+#ifndef HAVE_LIBMENU
+#define HAVE_LIBMENU 0
+#endif
+
+#ifndef HAVE_LIBPANEL
+#define HAVE_LIBPANEL 0
+#endif
+
+#ifndef HAVE_LANGINFO_CODESET
+#define HAVE_LANGINFO_CODESET 0
+#endif
+
+#ifndef HAVE_LOCALE_H
+#define HAVE_LOCALE_H 0
+#endif
+
+#ifndef HAVE_MATH_FUNCS
+#define HAVE_MATH_FUNCS 0
+#endif
+
+#ifndef HAVE_MATH_H
+#define HAVE_MATH_H 0
+#endif
+
+#ifndef HAVE_MENU_H
+#define HAVE_MENU_H 0
+#endif
+
+#ifndef HAVE_MVDERWIN
+#define HAVE_MVDERWIN 0
+#endif
+
+#ifndef HAVE_MVVLINE
+#define HAVE_MVVLINE 0
+#endif
+
+#ifndef HAVE_MVWIN
+#define HAVE_MVWIN 0
+#endif
+
+#ifndef HAVE_MVWVLINE
+#define HAVE_MVWVLINE 0
+#endif
+
+#ifndef HAVE_NAPMS
+#define HAVE_NAPMS 1
+#endif
+
+#ifndef HAVE_NC_ALLOC_H
+#define HAVE_NC_ALLOC_H 0
+#endif
+
+#ifndef HAVE_NEWPAD
+#define HAVE_NEWPAD 0
+#endif
+
+#ifndef HAVE_PANEL_H
+#define HAVE_PANEL_H 0
+#endif
+
+#ifndef HAVE_PUTWIN
+#define HAVE_PUTWIN 0
+#endif
+
+#ifndef HAVE_RESET_COLOR_PAIRS
+#define HAVE_RESET_COLOR_PAIRS 0
+#endif
+
+#ifndef HAVE_RESIZE_TERM
+#define HAVE_RESIZE_TERM 0
+#endif
+
+#ifndef HAVE_RESTARTTERM
+#define HAVE_RESTARTTERM 0
+#endif
+
+#ifndef HAVE_RIPOFFLINE
+#define HAVE_RIPOFFLINE 0
+#endif
+
+#ifndef HAVE_SCR_DUMP
+#define HAVE_SCR_DUMP 0
+#endif
+
+#ifndef HAVE_SETUPTERM
+#define HAVE_SETUPTERM 0
+#endif
+
+#ifndef HAVE_SLK_COLOR
+#define HAVE_SLK_COLOR 0
+#endif
+
+#ifndef HAVE_SLK_INIT
+#define HAVE_SLK_INIT 0
+#endif
+
+#ifndef HAVE_STDINT_H
+#define HAVE_STDINT_H 0
+#endif
+
+#ifndef HAVE_STDNORETURN_H
+#define HAVE_STDNORETURN_H 0
+#endif
+
+#ifndef HAVE_STRSTR
+#define HAVE_STRSTR 0
+#endif
+
+#ifndef HAVE_SYS_IOCTL_H
+#define HAVE_SYS_IOCTL_H 0
+#endif
+
+#ifndef HAVE_SYS_SELECT_H
+#define HAVE_SYS_SELECT_H 0
+#endif
+
+#ifndef HAVE_TERMATTRS
+#define HAVE_TERMATTRS 0
+#endif
+
+#ifndef HAVE_TERMIOS_H
+#define HAVE_TERMIOS_H 0
+#endif
+
+#ifndef HAVE_TERMNAME
+#define HAVE_TERMNAME 0
+#endif
+
+#ifndef HAVE_TERM_ENTRY_H
+#define HAVE_TERM_ENTRY_H 0
+#endif
+
+#ifndef HAVE_TGETENT
+#define HAVE_TGETENT 0
+#endif
+
+#ifndef HAVE_TIGETNUM
+#define HAVE_TIGETNUM 0
+#endif
+
+#ifndef HAVE_TIGETSTR
+#define HAVE_TIGETSTR 0
+#endif
+
+#ifndef HAVE_TPUTS_SP
+#define HAVE_TPUTS_SP 0
+#endif
+
+#ifndef HAVE_TSEARCH
+#define HAVE_TSEARCH 0
+#endif
+
+#ifndef HAVE_TYPEAHEAD
+#define HAVE_TYPEAHEAD 0
+#endif
+
+#ifndef HAVE_WINSSTR
+#define HAVE_WINSSTR 0
+#endif
+
+#ifndef HAVE_UNGET_WCH
+#define HAVE_UNGET_WCH 0
+#endif
+
+#ifndef HAVE_USE_DEFAULT_COLORS
+#define HAVE_USE_DEFAULT_COLORS 0
+#endif
+
+#ifndef HAVE_USE_ENV
+#define HAVE_USE_ENV 0
+#endif
+
+#ifndef HAVE_USE_EXTENDED_NAMES
+#define HAVE_USE_EXTENDED_NAMES 0
+#endif
+
+#ifndef HAVE_USE_SCREEN
+#define HAVE_USE_SCREEN 0
+#endif
+
+#ifndef HAVE_USE_WINDOW
+#define HAVE_USE_WINDOW 0
+#endif
+
+#ifndef HAVE_VIDPUTS
+#define HAVE_VIDPUTS 0
+#endif
+
+#ifndef HAVE_VID_PUTS
+#define HAVE_VID_PUTS 0
+#endif
+
+#ifndef HAVE_WINSDELLN
+#define HAVE_WINSDELLN 0
+#endif
+
+#ifndef HAVE_WRESIZE
+#define HAVE_WRESIZE 0
+#endif
+
+#ifndef HAVE__TRACEF
+#define HAVE__TRACEF 0
+#endif
+
+#ifndef NCURSES_EXT_FUNCS
+#define NCURSES_EXT_FUNCS 0
+#endif
+
+#ifndef NEED_PTEM_H
+#define NEED_PTEM_H 0
+#endif
+
+#ifndef NEED_WCHAR_H
+#define NEED_WCHAR_H 0
+#endif
+
+#ifndef NO_LEAKS
+#define NO_LEAKS 0
+#endif
+
+/*
+ * Workaround for HPUX
+ */
+#if defined(__hpux) && !defined(NCURSES_VERSION)
+#define _ACS_COMPAT_CODE	/* needed for acs_map vs __acs_map */
+#endif
+
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <sys/types.h>
+#include <errno.h>
+
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include <signal.h>		/* include before curses.h to work around glibc bug */
+
+#if NEED_WCHAR_H
+#include <wchar.h>
+#ifdef HAVE_LIBUTF8_H
+#include <libutf8.h>
+#endif
+#endif
+
+#if defined(HAVE_XCURSES)
+#include <xcurses.h>
+#elif defined(HAVE_NCURSESW_NCURSES_H)
+#include <ncursesw/curses.h>
+#elif defined(HAVE_NCURSES_NCURSES_H)
+#include <ncurses/curses.h>
+#else
+#include <curses.h>
+#endif
+
+#if HAVE_STDNORETURN_H && !defined(NCURSES_VERSION)
+#include <stdnoreturn.h>
+#undef GCC_NORETURN
+#define GCC_NORETURN _Noreturn
+#endif
+
+#if !(defined(NCURSES_WGETCH_EVENTS) && defined(NEED_KEY_EVENT))
+#undef KEY_EVENT		/* reduce compiler-warnings with Visual C++ */
+#endif
+
+#if defined(HAVE_XCURSES) || defined(PDCURSES)
+/* no other headers */
+#undef  HAVE_SETUPTERM		/* nonfunctional */
+#define HAVE_SETUPTERM 0
+#undef  HAVE_TGETENT		/* nonfunctional */
+#define HAVE_TGETENT 0
+#undef  HAVE_TIGETSTR		/* nonfunctional */
+#define HAVE_TIGETSTR 0
+#elif defined(HAVE_NCURSESW_TERM_H)
+#include <ncursesw/term.h>
+#elif defined(HAVE_NCURSES_TERM_H)
+#include <ncurses/term.h>
+#elif defined(HAVE_TERM_H)
+#include <term.h>
+#endif
+
+/*
+ * Not all curses.h implementations include unctrl.h,
+ */
+#if defined(HAVE_NCURSESW_UNCTRL_H)
+#include <ncursesw/unctrl.h>
+#elif defined(HAVE_NCURSES_UNCTRL_H)
+#include <ncurses/unctrl.h>
+#elif defined(HAVE_UNCTRL_H)
+#include <unctrl.h>
+#endif
+
+#if HAVE_GETOPT_H
+#include <getopt.h>
+#elif !defined(HAVE_GETOPT_HEADER)
+/* 'getopt()' may be prototyped in <stdlib.h>, but declaring its variables
+ * doesn't hurt.
+ */
+extern char *optarg;
+extern int optind;
+#endif /* HAVE_GETOPT_H */
+
+#if HAVE_LOCALE_H
+#include <locale.h>
+#else
+#define setlocale(name,string)	/* nothing */
+#endif
+
+#include <assert.h>
+#include <ctype.h>
+
+#if defined(_MSC_VER)
+#undef popen
+#define popen(s,n) _popen(s,n)
+#undef pclose
+#define pclose(s) _pclose(s)
+#endif
+
+#ifndef GCC_NORETURN
+#define GCC_NORETURN		/* nothing */
+#endif
+#ifndef GCC_PRINTFLIKE
+#define GCC_PRINTFLIKE(a,b)	/* nothing */
+#endif
+#ifndef GCC_SCANFLIKE
+#define GCC_SCANFLIKE(a,b)	/* nothing */
+#endif
+#ifndef GCC_UNUSED
+#define GCC_UNUSED		/* nothing */
+#endif
+
+#ifndef HAVE_GETNSTR
+#define getnstr(s,n) getstr(s)
+#endif
+
+#if HAVE_INIT_EXTENDED_COLOR
+#define USE_EXTENDED_COLOR 1
+#else
+#define USE_EXTENDED_COLOR 0
+#endif
+
+#ifndef USE_SOFTKEYS
+#if HAVE_SLK_INIT
+#define USE_SOFTKEYS 1
+#else
+#define USE_SOFTKEYS 0
+#endif
+#endif
+
+#if !USE_SOFTKEYS
+#define slk_init()		/* nothing */
+#define slk_restore()		/* nothing */
+#define slk_clear()		/* nothing */
+#endif
+
+#ifndef HAVE_CURSES_DATA_TABSIZE
+#define HAVE_CURSES_DATA_TABSIZE 0
+#endif
+
+#if !NCURSES_EXT_FUNCS
+#if HAVE_CURSES_DATA_TABSIZE
+#define set_tabsize(n)	TABSIZE = (n)
+#else
+#define set_tabsize(n)		/* nothing */
+#endif
+#endif
+
+#if HAVE_TPUTS_SP
+#define USE_SP_FUNCS 1
+#else
+#define USE_SP_FUNCS 0
+#endif
+
+#ifndef HAVE_WSYNCDOWN
+#define wsyncdown(win)		/* nothing */
+#endif
+
+#ifndef USE_WIDEC_SUPPORT
+#if (defined(_XOPEN_SOURCE_EXTENDED) \
+  || (defined(_XOPEN_SOURCE) && (_XOPEN_SOURCE - 0 >= 500)) \
+  || (defined(NCURSES_WIDECHAR) && (NCURSES_WIDECHAR - 0 < 1))) \
+  && defined(WACS_ULCORNER)
+#define USE_WIDEC_SUPPORT 1
+#else
+#define USE_WIDEC_SUPPORT 0
+#endif
+#endif
+
+#if HAVE_PANEL_H && HAVE_LIBPANEL
+#define USE_LIBPANEL 1
+#else
+#define USE_LIBPANEL 0
+#endif
+
+#if HAVE_MENU_H && HAVE_LIBMENU
+#define USE_LIBMENU 1
+#else
+#define USE_LIBMENU 0
+#endif
+
+#if HAVE_FORM_H && HAVE_LIBFORM
+#define USE_LIBFORM 1
+#else
+#define USE_LIBFORM 0
+#endif
+
+/* workaround, to build against NetBSD's variant of the form library */
+#ifdef HAVE_NETBSD_FORM_H
+#define form_getyx(form, y, x) y = (int)current_field(form)->cursor_ypos, x = (int)current_field(form)->cursor_xpos
+#define form_field_row(field) (field)->form_row
+#define form_field_col(field) (field)->form_col
+#else /* e.g., SVr4, ncurses */
+#define form_getyx(form, y, x) y = (int)(form)->currow, x = (int)(form)->curcol
+#define form_field_row(field) (field)->frow
+#define form_field_col(field) (field)->fcol
+#endif
+
+/* workaround, to build against NetBSD's variant of the form library */
+#ifdef HAVE_NETBSD_MENU_H
+#define menu_itemwidth(menu) (menu)->max_item_width
+#else
+#define menu_itemwidth(menu) (menu)->itemlen
+#endif
+
+#ifndef HAVE_TYPE_ATTR_T
+#if !USE_WIDEC_SUPPORT && !defined(attr_t)
+#define attr_t chtype
+#endif
+#endif
+
+#undef NCURSES_CH_T
+#if !USE_WIDEC_SUPPORT
+#define NCURSES_CH_T chtype
+#else
+#define NCURSES_CH_T cchar_t
+#endif
+
+#ifndef NCURSES_COLOR_T
+#define NCURSES_COLOR_T short
+#endif
+
+#ifndef NCURSES_PAIRS_T
+#define NCURSES_PAIRS_T short
+#endif
+
+#ifndef CCHARW_MAX
+#define CCHARW_MAX 5
+#endif
+
+#if defined(NCURSES_VERSION) && defined(CURSES_WACS_ARRAY) && !defined(CURSES_WACS_SYMBOLS)
+#define CURSES_WACS_SYMBOLS
+#endif
+
+#if defined(CURSES_WACS_ARRAY) && !defined(CURSES_WACS_SYMBOLS)
+/* NetBSD 5.1 defines these incorrectly */
+#undef	WACS_RARROW
+#undef	WACS_LARROW
+#undef	WACS_UARROW
+#undef	WACS_DARROW
+#undef	WACS_BLOCK
+#undef	WACS_DIAMOND
+#undef	WACS_CKBOARD
+#undef	WACS_DEGREE
+#undef	WACS_PLMINUS
+#undef	WACS_BOARD
+#undef	WACS_LANTERN
+#undef	WACS_LRCORNER
+#undef	WACS_URCORNER
+#undef	WACS_ULCORNER
+#undef	WACS_LLCORNER
+#undef	WACS_PLUS
+#undef	WACS_HLINE
+#undef	WACS_S1
+#undef	WACS_S9
+#undef	WACS_LTEE
+#undef	WACS_RTEE
+#undef	WACS_BTEE
+#undef	WACS_TTEE
+#undef	WACS_VLINE
+#undef	WACS_BULLET
+#undef	WACS_S3
+#undef	WACS_S7
+#undef	WACS_LEQUAL
+#undef	WACS_GEQUAL
+#undef	WACS_PI
+#undef	WACS_NEQUAL
+#undef	WACS_STERLING
+
+#define WACS_RARROW     &(CURSES_WACS_ARRAY['+'])
+#define WACS_LARROW     &(CURSES_WACS_ARRAY[','])
+#define WACS_UARROW     &(CURSES_WACS_ARRAY['-'])
+#define WACS_DARROW     &(CURSES_WACS_ARRAY['.'])
+#define WACS_BLOCK      &(CURSES_WACS_ARRAY['0'])
+#define WACS_DIAMOND    &(CURSES_WACS_ARRAY['`'])
+#define WACS_CKBOARD    &(CURSES_WACS_ARRAY['a'])
+#define WACS_DEGREE     &(CURSES_WACS_ARRAY['f'])
+#define WACS_PLMINUS    &(CURSES_WACS_ARRAY['g'])
+#define WACS_BOARD      &(CURSES_WACS_ARRAY['h'])
+#define WACS_LANTERN    &(CURSES_WACS_ARRAY['i'])
+#define WACS_LRCORNER   &(CURSES_WACS_ARRAY['j'])
+#define WACS_URCORNER   &(CURSES_WACS_ARRAY['k'])
+#define WACS_ULCORNER   &(CURSES_WACS_ARRAY['l'])
+#define WACS_LLCORNER   &(CURSES_WACS_ARRAY['m'])
+#define WACS_PLUS       &(CURSES_WACS_ARRAY['n'])
+#define WACS_HLINE      &(CURSES_WACS_ARRAY['q'])
+#define WACS_S1         &(CURSES_WACS_ARRAY['o'])
+#define WACS_S9         &(CURSES_WACS_ARRAY['s'])
+#define WACS_LTEE       &(CURSES_WACS_ARRAY['t'])
+#define WACS_RTEE       &(CURSES_WACS_ARRAY['u'])
+#define WACS_BTEE       &(CURSES_WACS_ARRAY['v'])
+#define WACS_TTEE       &(CURSES_WACS_ARRAY['w'])
+#define WACS_VLINE      &(CURSES_WACS_ARRAY['x'])
+#define WACS_BULLET     &(CURSES_WACS_ARRAY['~'])
+#define WACS_S3         &(CURSES_WACS_ARRAY['p'])
+#define WACS_S7         &(CURSES_WACS_ARRAY['r'])
+#define WACS_LEQUAL     &(CURSES_WACS_ARRAY['y'])
+#define WACS_GEQUAL     &(CURSES_WACS_ARRAY['z'])
+#define WACS_PI         &(CURSES_WACS_ARRAY['{'])
+#define WACS_NEQUAL     &(CURSES_WACS_ARRAY['|'])
+#define WACS_STERLING   &(CURSES_WACS_ARRAY['}'])
+#endif
+
+#ifndef WA_NORMAL
+#define WA_NORMAL       A_NORMAL
+#endif
+#ifndef WA_BOLD
+#define WA_BOLD         A_BOLD
+#endif
+#ifndef WA_REVERSE
+#define WA_REVERSE      A_REVERSE
+#endif
+#ifndef WA_UNDERLINE
+#define WA_UNDERLINE    A_UNDERLINE
+#endif
+#ifndef WA_BLINK
+#define WA_BLINK        A_BLINK
+#endif
+
+#ifndef OK
+#define OK (0)
+#endif
+
+#ifndef ERR
+#define ERR (-1)
+#endif
+
+#undef CTRL
+#define CTRL(x)	((x) & 0x1f)
+
+#define QUIT		CTRL('Q')
+#define ESCAPE		CTRL('[')
+
+#ifndef KEY_MIN
+#define KEY_MIN 256		/* not defined in Solaris 8 */
+#endif
+
+#define HELP_KEY_1	'?'
+#define HELP_KEY_2	KEY_F(1)
+
+/* our "standard" options for getopt, needed for help2man */
+#define OPTS_USAGE	'h'
+#define OPTS_VERSION	'V'
+#define OPTS_COMMON	"hV"
+#define USAGE_COMMON	\
+ "Common options:"\
+," -h       show this message"\
+," -V       show version of curses"
+
+#if HAVE_CURSES_VERSION
+#define format_version(buffer) strcpy(buffer, curses_version())
+#elif defined(NCURSES_VERSION_MAJOR) && defined(NCURSES_VERSION_MINOR) && defined(NCURSES_VERSION_PATCH)
+#define format_version(buffer) sprintf(buffer, "ncurses %d.%d.%d", \
+	NCURSES_VERSION_MAJOR, \
+	NCURSES_VERSION_MINOR, \
+	NCURSES_VERSION_PATCH)
+#else
+#define format_version(buffer) strcpy(buffer, "ncurses-examples")
+#endif
+
+#define VERSION_COMMON() \
+static char *version_common(char **argv) { \
+	char *base = argv[0]; \
+	char *leaf = strrchr(base, '/'); \
+	char *result = malloc(strlen(base) + 80); \
+	if (leaf++ == NULL) leaf = base; \
+	sprintf(result, "%.20s: ", leaf); \
+	format_version(result + strlen(result)); \
+	return result; \
+} \
+static void show_version(char **argv) { \
+	char *value = version_common(argv); \
+	if (value != NULL) { \
+	    puts(value); \
+	    free(value); \
+	} \
+}
+
+/* from nc_string.h, to make this stand alone */
+#if HAVE_BSD_STRING_H
+#include <bsd/string.h>
+#endif
+
+#ifdef __cplusplus
+#define NCURSES_VOID		/* nothing */
+#else
+#define NCURSES_VOID (void)
+#endif
+
+#ifndef HAVE_STRLCAT
+#define HAVE_STRLCAT 0
+#endif
+
+#ifndef HAVE_STRLCPY
+#define HAVE_STRLCPY 0
+#endif
+
+#ifndef HAVE_SNPRINTF
+#define HAVE_SNPRINTF 0
+#endif
+
+#ifndef HAVE_STRDUP
+#define HAVE_STRDUP 0
+#endif
+
+#ifndef USE_STRING_HACKS
+#define USE_STRING_HACKS 0
+#endif
+
+#ifndef HAVE_STRSTR
+#define HAVE_STRSTR 0
+#endif
+
+#ifndef NCURSES_CAST
+#ifdef __cplusplus
+extern "C" {
+#define NCURSES_CAST(type,value) static_cast<type>(value)
+#else
+#define NCURSES_CAST(type,value) (type)(value)
+#endif
+#endif
+
+#if USE_STRING_HACKS && HAVE_STRLCAT
+#define _nc_STRCAT(d,s,n)	NCURSES_VOID strlcat((d),(s),NCURSES_CAST(size_t,n))
+#define _nc_STRNCAT(d,s,m,n)	NCURSES_VOID strlcat((d),(s),NCURSES_CAST(size_t,m))
+#else
+#define _nc_STRCAT(d,s,n)	NCURSES_VOID strcat((d),(s))
+#define _nc_STRNCAT(d,s,m,n)	NCURSES_VOID strncat((d),(s),(n))
+#endif
+
+#if USE_STRING_HACKS && HAVE_STRLCPY
+#define _nc_STRCPY(d,s,n)	NCURSES_VOID strlcpy((d),(s),NCURSES_CAST(size_t,n))
+#define _nc_STRNCPY(d,s,n)	NCURSES_VOID strlcpy((d),(s),NCURSES_CAST(size_t,n))
+#else
+#define _nc_STRCPY(d,s,n)	NCURSES_VOID strcpy((d),(s))
+#define _nc_STRNCPY(d,s,n)	NCURSES_VOID strncpy((d),(s),(n))
+#endif
+
+#if USE_STRING_HACKS && HAVE_SNPRINTF
+#define _nc_SPRINTF             NCURSES_VOID (snprintf)
+#define _nc_SLIMIT(n)           NCURSES_CAST(size_t,n),
+#else
+#define _nc_SPRINTF             NCURSES_VOID (sprintf)
+#define _nc_SLIMIT(n)		/* nothing */
+#endif
+
+/*
+ * X/Open Curses does not define the arrays of terminfo/termcap names as SVr4
+ * curses did, and some implementations provide them anyway, but undeclared.
+ */
+#ifdef DECL_CURSES_DATA_BOOLNAMES
+extern char *boolnames[], *boolcodes[], *boolfnames[];
+extern char *numnames[], *numcodes[], *numfnames[];
+extern char *strnames[], *strcodes[], *strfnames[];
+#endif
+
+/*
+ * Again, an SVr4 curses feature latent in the libraries but not in headers.
+ */
+#ifndef DECL_CURSES_DATA_TABSIZE
+#define DECL_CURSES_DATA_TABSIZE 0
+#endif
+
+#if DECL_CURSES_DATA_TABSIZE
+extern int TABSIZE;
+#undef  HAVE_CURSES_DATA_TABSIZE
+#define HAVE_CURSES_DATA_TABSIZE 1
+#endif
+
+#ifndef HAVE_CURSES_DATA_TABSIZE
+#define HAVE_CURSES_DATA_TABSIZE 0
+#endif
+
+/*
+ * X/Open Curses provides termname(), whose return value is analogous to the
+ * SVr4 curses variable ttytype[].
+ */
+#ifndef HAVE_CURSES_DATA_TTYTYPE
+#define HAVE_CURSES_DATA_TTYTYPE 0
+#endif
+
+#ifndef DECL_CURSES_DATA_TTYTYPE
+#define DECL_CURSES_DATA_TTYTYPE 0
+#endif
+
+#if !defined(ttytype) && (!HAVE_CURSES_DATA_TTYTYPE || DECL_CURSES_DATA_TTYTYPE)
+#define ttytype termname()
+#endif
+
+#define colored_chtype(ch, attr, pair) \
+	((chtype) (ch) | (chtype) (attr) | (chtype) COLOR_PAIR(pair))
+
+/*
+ * Workaround for HPUX
+ */
+#if defined(__hpux) && !defined(NCURSES_VERSION)
+#define getbegx(w) __getbegx(w)
+#define getbegy(w) __getbegy(w)
+#define getcurx(w) __getcurx(w)
+#define getcury(w) __getcury(w)
+#define getmaxx(w) __getmaxx(w)
+#define getmaxy(w) __getmaxy(w)
+#define getparx(w) __getparx(w)
+#define getpary(w) __getpary(w)
+#endif
+
+/*
+ * Workaround in case getcchar() returns a positive value when the source
+ * string produces only a L'\0'.
+ */
+#define TEST_CCHAR(s, count, then_stmt, else_stmt) \
+	if ((count = getcchar(s, NULL, NULL, NULL, NULL)) > 0) { \
+	    wchar_t test_wch[CCHARW_MAX + 2]; \
+	    attr_t test_attrs; \
+	    NCURSES_PAIRS_T test_pair; \
+	    \
+	    if (getcchar( s, test_wch, &test_attrs, &test_pair, NULL) == OK \
+		&& test_wch[0] != L'\0') { \
+		then_stmt \
+	    } else { \
+		else_stmt \
+	    } \
+	} else { \
+	    else_stmt \
+	}
+/*
+ * These usually are implemented as macros, but may be functions.
+ */
+#if !defined(getcurx) && !HAVE_GETCURX
+#define getcurx(win)            ((win) ? ((int)(win)->_curx) : ERR)
+#define getcury(win)            ((win) ? ((int)(win)->_cury) : ERR)
+#endif
+
+#if !defined(getbegx) && !HAVE_GETBEGX
+#define getbegx(win)            ((win) ? ((int)(win)->_begx) : ERR)
+#define getbegy(win)            ((win) ? ((int)(win)->_begy) : ERR)
+#endif
+
+#if !defined(getmaxx) && !HAVE_GETMAXX
+#define getmaxx(win)            ((win) ? ((int)(win)->_maxx + 1) : ERR)
+#define getmaxy(win)            ((win) ? ((int)(win)->_maxy + 1) : ERR)
+#endif
+
+/*
+ * Solaris 10 xpg4:
+#define	__m_getparx(w)		((w)->_parent == (WINDOW *) 0 ? -1 \
+				: (w)->_begx - (w)->_parent->_begx)
+ */
+#if !defined(getparx) && !HAVE_GETPARX
+#ifdef __m_getparx
+#define getparx(win)            __m_getparx(win)
+#define getpary(win)            __m_getpary(win)
+#else
+#define getparx(win)            ((win)?((win)->_parx + 1):ERR)
+#define getpary(win)            ((win)?((win)->_pary + 1):ERR)
+#endif
+#endif
+
+#if !defined(mvwvline) && !HAVE_MVWVLINE
+#define mvwvline(w,y,x,ch,n)    (move(y,x) == ERR ? ERR : wvline(w,ch,n))
+#define mvwhline(w,y,x,ch,n)    (move(y,x) == ERR ? ERR : whline(w,ch,n))
+#endif
+
+#if !defined(mvvline) && !HAVE_MVVLINE
+#define mvvline(y,x,ch,n)       (move(y,x) == ERR ? ERR : vline(ch,n))
+#define mvhline(y,x,ch,n)       (move(y,x) == ERR ? ERR : hline(ch,n))
+#endif
+
+/*
+ * Try to accommodate curses implementations that have no terminfo support.
+ */
+#if HAVE_TIGETNUM
+#define TIGETNUM(ti,tc) tigetnum(ti)
+#else
+#define TIGETNUM(ti,tc) tgetnum(tc)
+#endif
+
+#if HAVE_TIGETSTR
+#define TIGETSTR(ti,tc) tigetstr(ti)
+#else
+#define TIGETSTR(ti,tc) tgetstr(tc,&area_pointer)
+#endif
+
+/*
+ * So far (2013 - more than ten years), only ncurses implements
+ * use_extended_names().
+ */
+#if defined(NCURSES_XNAMES)
+#elif defined(NCURSES_VERSION) && defined(HAVE_TERM_ENTRY_H) && HAVE_TERM_ENTRY_H
+#define NCURSES_XNAMES 1
+#else
+#define NCURSES_XNAMES 0
+#endif
+
+/*
+ * ncurses restores the cursor in endwin().  Other libraries may not.
+ */
+#ifdef NCURSES_VERSION
+#define stop_curses() endwin()
+#else
+#define stop_curses() do { endwin(); curs_set(1); } while (0)
+#endif
+
+/* ncurses implements tparm() with varargs, X/Open with a fixed-parameter list
+ * (which is incompatible with legacy usage, doesn't solve any problems).
+ */
+#define tparm3(a,b,c) tparm(a,b,c,0,0,0,0,0,0,0)
+#define tparm2(a,b)   tparm(a,b,0,0,0,0,0,0,0,0)
+
+#define UChar(c)    ((unsigned char)(c))
+
+#define SIZEOF(table)	(sizeof(table)/sizeof(table[0]))
+
+#if defined(NCURSES_VERSION) && HAVE_NC_ALLOC_H
+#include <nc_alloc.h>
+#if HAVE_EXIT_TERMINFO && !defined(USE_CURSES) && (defined(USE_TERMINFO) || defined(USE_TINFO))
+#undef ExitProgram
+#define ExitProgram(code) exit_terminfo(code)
+#elif HAVE_EXIT_CURSES
+#undef ExitProgram
+#define ExitProgram(code) exit_curses(code)
+#endif
+#else /* not ncurses-tree */
+#define typeMalloc(type,n) (type *) malloc((size_t)(n) * sizeof(type))
+#define typeCalloc(type,elts) (type *) calloc((size_t)(elts), sizeof(type))
+#define typeRealloc(type,n,p) (type *) realloc(p, (size_t)(n) * sizeof(type))
+#endif
+
+#ifndef ExitProgram
+#define ExitProgram(code) exit(code)
+#endif
+
+#ifndef EXIT_SUCCESS
+#define EXIT_SUCCESS 0
+#endif
+#ifndef EXIT_FAILURE
+#define EXIT_FAILURE 1
+#endif
+
+#undef _NC_WINDOWS
+#if (defined(_WIN32) || defined(_WIN64))
+#define _NC_WINDOWS 1
+#endif
+
+#if defined(_NC_WINDOWS) || defined(USE_WIN32CON_DRIVER)
+
+#if defined(PDCURSES)
+#ifdef WINVER
+#  if WINVER < 0x0501
+#    error WINVER must at least be 0x0501
+#  endif
+#else
+#  define WINVER 0x0501
+#endif
+#include <windows.h>
+#include <sys/time.h>		/* for struct timeval */
+#undef sleep
+#define sleep(n) Sleep((n) * 1000)
+#define SIGHUP  1
+#define SIGKILL 9
+#define getlogin() "username"
+
+#elif defined(EXP_WIN32_DRIVER)
+
+#if defined(HAVE_NCURSESW_NCURSES_H)
+#include <ncursesw/nc_win32.h>
+#elif defined(HAVE_NCURSES_NCURSES_H)
+#include <ncurses/nc_win32.h>
+#else
+#include <nc_win32.h>
+#endif
+
+#else
+
+#if defined(HAVE_NCURSESW_NCURSES_H)
+#include <ncursesw/nc_mingw.h>
+#elif defined(HAVE_NCURSES_NCURSES_H)
+#include <ncurses/nc_mingw.h>
+#else
+#include <nc_mingw.h>
+#endif
+
+#endif
+
+/* conflicts in test/firstlast.c */
+#undef large
+#undef small
+
+#endif
+
+#ifdef NEED_TIME_H
+#if TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# if HAVE_SYS_TIME_H
+#  include <sys/time.h>
+# else
+#  include <time.h>
+# endif
+#endif
+#endif
+
+/*
+ * Ultrix 3.1
+ */
+#ifndef STDOUT_FILENO
+#define STDOUT_FILENO 1
+#endif
+
+#if !HAVE_STRSTR
+extern char *_nc_strstr(const char *, const char *);
+#define strstr(a,b) _nc_strstr((a),(b))
+#endif /* !HAVE_STRSTR */
+
+/* Use this to quiet gcc's -Wwrite-strings warnings, but accommodate SVr4
+ * curses which doesn't have const parameters declared (so far) in the places
+ * that XSI shows.
+ */
+#ifndef NCURSES_CONST
+#ifdef PDCURSES
+#define NCURSES_CONST		const	/* close enough */
+#else
+#define NCURSES_CONST		/* nothing */
+#endif
+#endif
+
+/* out-of-band values for representing absent capabilities */
+#define ABSENT_BOOLEAN		((signed char)-1)	/* 255 */
+#define ABSENT_NUMERIC		(-1)
+#define ABSENT_STRING		(char *)0
+
+/* out-of-band values for representing cancels */
+#define CANCELLED_BOOLEAN	((signed char)-2)	/* 254 */
+#define CANCELLED_NUMERIC	(-2)
+#define CANCELLED_STRING	(char *)(-1)
+
+#define VALID_BOOLEAN(s) ((unsigned char)(s) <= 1)	/* reject "-1" */
+#define VALID_NUMERIC(s) ((s) >= 0)
+#define VALID_STRING(s)  ((s) != CANCELLED_STRING && (s) != ABSENT_STRING)
+
+#define VT_ACSC "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~"
+
+#define CATCHALL(handler) do { \
+		int nsig; \
+		for (nsig = SIGHUP; nsig < SIGTERM; ++nsig) \
+		    if (nsig != SIGKILL) \
+			signal(nsig, handler); \
+	    } while(0)
+
+#ifdef NCURSES_VERSION
+#define InitAndCatch(init,handler) do { CATCHALL(handler); init; } while (0)
+#else
+#define InitAndCatch(init,handler) do { init; CATCHALL(handler); } while (0)
+#endif
+
+#if defined(_NC_WINDOWS) || defined(USE_WIN32CON_DRIVER)
+#define SetupAlarm(opt)	(void)opt
+#else
+#define SetupAlarm(opt)	if (opt) alarm((unsigned)opt)
+#endif
+
+/*
+ * Workaround for clean(er) compile with Solaris's legacy curses.
+ * The same would be needed for HPUX 10.20
+ */
+#ifndef TPUTS_ARG
+#define TPUTS_ARG int
+#endif
+
+#if defined(sun) && !defined(_XOPEN_CURSES) && !defined(NCURSES_VERSION_PATCH)
+#undef TPUTS_ARG
+#define TPUTS_ARG char
+extern char *tgoto(char *, int, int);	/* available, but not prototyped */
+#endif
+
+#ifndef TPUTS_PROTO
+#define TPUTS_PROTO(func,value) int func(TPUTS_ARG value)
+#endif
+
+#ifndef TPUTS_RETURN
+#define TPUTS_RETURN(value) return value
+#endif
+
+/*
+ * Workarounds for Solaris's X/Open curses
+ */
+#if !defined(KEY_MIN) && defined(__KEY_MIN)
+#define KEY_MIN __KEY_MIN
+#endif
+#if !defined(KEY_MAX) && defined(__KEY_MIN)
+#define KEY_MAX __KEY_MAX
+#endif
+
+/*
+ * Workaround to build with Sun's default SVr4 curses.
+ */
+#ifdef NCURSES_VERSION
+#ifndef HAVE_VW_PRINTW
+#define HAVE_VW_PRINTW 1
+#endif
+#endif
+
+/*
+ * ncurses provides arrays of capability names; X/Open discarded these SVr4
+ * features.  Some implementations continue to provide them (see the test
+ * configure script).
+ */
+#ifdef NCURSES_VERSION
+#ifndef HAVE_CURSES_DATA_BOOLNAMES
+#define HAVE_CURSES_DATA_BOOLNAMES 1
+#endif
+#endif
+
+/*
+ * ncurses provides a termcap interface; a few packagers replace or displace
+ * its header file with an incompatible one.  The demo_termcap program uses
+ * the ncurses file, if available.
+ */
+#ifdef NCURSES_VERSION
+#ifndef HAVE_NCURSES_TERMCAP_H
+#define HAVE_NCURSES_TERMCAP_H 0
+#endif
+#ifndef HAVE_TERMCAP_H
+#define HAVE_TERMCAP_H 0
+#endif
+#endif
+
+/*
+ * ncurses uses const in some places where X/Open does (or did) not allow.
+ */
+#if defined(NCURSES_CONST)
+#define CONST_MENUS NCURSES_CONST
+#elif defined(PDCURSES)
+#define CONST_MENUS const
+#else
+#define CONST_MENUS		/* nothing */
+#endif
+
+#if defined(NCURSES_CONST)
+#define CONST_FMT NCURSES_CONST
+#elif defined(PDCURSES)
+#define CONST_FMT const
+#else
+#define CONST_FMT		/* nothing */
+#endif
+
+/*
+ * Simplify setting up demo of threading with these macros.
+ */
+
+#if HAVE_USE_WINDOW
+#define USING_WINDOW(w,func) use_window(w, (NCURSES_WINDOW_CB) func, w)
+#define USING_WINDOW1(w,func,safe) use_window(w, (NCURSES_WINDOW_CB) safe, NULL)
+#define USING_WINDOW2(w,func,data) use_window(w, (NCURSES_WINDOW_CB) func, data)
+#define WANT_USE_WINDOW() extern void _nc_want_use_window(void)
+#else
+#define USING_WINDOW(w,func) func(w, NULL)
+#define USING_WINDOW1(w,func,safe) func(w)
+#define USING_WINDOW2(w,func,data) func(w,data)
+#define WANT_USE_WINDOW() extern void _nc_want_use_window(void)
+#endif
+
+#if HAVE_USE_WINDOW
+#define USING_SCREEN(s,func,data) use_screen(s, (NCURSES_SCREEN_CB) func, data)
+#define WANT_USE_SCREEN() extern void _nc_want_use_screen(void)
+#else
+#define USING_SCREEN(s,func,data) func(data)
+#define WANT_USE_SCREEN() extern void _nc_want_use_screen(void)
+#endif
+
+#if defined(TRACE) && HAVE__TRACEF && HAVE_CURSES_TRACE
+#define Trace(p) _tracef p
+#define USE_TRACE 1
+#define START_TRACE() \
+	if ((_nc_tracing & TRACE_MAXIMUM) == 0) { \
+	    int t = _nc_getenv_num("NCURSES_TRACE"); \
+	    if (t >= 0) \
+		curses_trace((unsigned) t); \
+	}
+extern unsigned _nc_tracing;
+extern int _nc_getenv_num(const char *);
+#else
+#undef TRACE
+#define Trace(p)		/* nothing */
+#define USE_TRACE 0
+#define START_TRACE()		/* nothing */
+#endif
+
+#define Trace2(p)		/* nothing */
+
+#define AddCh(c)		(void) addch((chtype)(c))
+#define WAddCh(w,c)		(void) waddch((w),(chtype)(c))
+#define MvAddCh(y,x,c)		(void) mvaddch((y),(x),(chtype)(c))
+#define MvWAddCh(w,y,x,c)	(void) mvwaddch((w),(y),(x),(chtype)(c))
+#define MvAddStr(y,x,s)		(void) mvaddstr((y),(x),(s))
+#define MvWAddStr(w,y,x,s)	(void) mvwaddstr((w),(y),(x),(s))
+#define MvWAddChStr(w,y,x,s)	(void) mvwaddchstr((w),(y),(x),(s))
+#define MvPrintw		(void) mvprintw
+#define MvWPrintw		(void) mvwprintw
+#define MvHLine			(void) mvhline
+#define MvWHLine		(void) mvwhline
+#define MvVLine			(void) mvvline
+#define MvWVLine		(void) mvwvline
+
+/*
+ * The macro likely uses unsigned values, while X/Open prototype uses int.
+ */
+#if defined(wattrset) || defined(PDCURSES)
+#define AttrArg(p,a)    (chtype) ((chtype)(p) | (chtype)(a))
+#else
+#define AttrArg(p,a)    (int) ((chtype)(p) | (chtype)(a))
+#endif
+
+/*
+ * Workaround for defective implementation of gcc attribute warn_unused_result
+ */
+#if defined(__GNUC__) && defined(_FORTIFY_SOURCE)
+#define IGNORE_RC(func) errno = func
+#else
+#define IGNORE_RC(func) (void) func
+#endif /* gcc workarounds */
+
+#define init_mb(state)	memset(&state, 0, sizeof(state))
+
+#endif /* __TEST_PRIV_H */
diff --git a/test/test_add_wchstr.c b/test/test_add_wchstr.c
new file mode 100644
index 0000000..f69e1dd
--- /dev/null
+++ b/test/test_add_wchstr.c
@@ -0,0 +1,619 @@
+/****************************************************************************
+ * Copyright 2020-2021,2022 Thomas E. Dickey                                *
+ * Copyright 2009-2016,2017 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: test_add_wchstr.c,v 1.34 2022/12/10 22:28:50 tom Exp $
+ *
+ * Demonstrate the waddwchstr() and wadd_wch functions.
+ * Thomas Dickey - 2009/9/12
+ *
+ * Note: to provide inputs for *add_wch(), we use setcchar().  A quirk of the
+ * X/Open definition for that function is that the string contains no
+ * characters with negative width.  Any control character (such as tab) falls
+ * into that category.  So it follows that *add_wch() cannot render a tab
+ * character because there is no legal way to construct a cchar_t containing
+ * one.  X/Open does not document this, and it would be logical to assume that
+ * *addwchstr() has the same limitation, but it uses a wchar_t string directly,
+ * and does not document how tabs are handled.
+ */
+
+#include <test.priv.h>
+
+#if USE_WIDEC_SUPPORT
+
+#define WIDE_LINEDATA
+#include <linedata.h>
+
+#undef AddCh
+#undef MvAddCh
+#undef MvAddStr
+#undef MvWAddCh
+#undef MvWAddChStr
+#undef MvWAddStr
+#undef WAddCh
+
+/*
+ * redefinitions to simplify comparison between test_*str programs
+ */
+#define AddNStr    add_wchnstr
+#define AddStr     add_wchstr
+#define MvAddNStr  (void) mvadd_wchnstr
+#define MvAddStr   (void) mvadd_wchstr
+#define MvWAddNStr (void) mvwadd_wchnstr
+#define MvWAddStr  (void) mvwadd_wchstr
+#define MvWAddChStr(w,y,x,s)	(void) mvwadd_wchstr((w),(y),(x),(s))
+#define WAddNStr   wadd_wchnstr
+#define WAddStr    wadd_wchstr
+
+#define MY_TABSIZE 8
+
+typedef enum {
+    oDefault = 0,
+    oMove = 1,
+    oWindow = 2,
+    oMoveWindow = 3
+} Options;
+
+static bool m_opt = FALSE;
+static bool pass_ctls = FALSE;
+static bool w_opt = FALSE;
+static int n_opt = -1;
+
+static cchar_t *temp_buffer;
+static size_t temp_length;
+
+#define TempBuffer(source_len, source_cast) \
+    if (source != 0) { \
+	const char *temp; \
+	size_t need = source_len + 1; \
+	wchar_t have[2]; \
+	int n = 0; \
+ \
+	if (need > temp_length) { \
+	    temp_length = need * 2; \
+	    temp_buffer = typeRealloc(cchar_t, temp_length, temp_buffer); \
+	    if (!temp_buffer) \
+		failed("TempBuffer"); \
+	} \
+	have[0] = 0; \
+	have[1] = 0; \
+	do { \
+	    have[0] = source_cast; \
+	    if (!pass_ctls \
+	     && have[0] != 0 \
+	     && have[0] < 256 \
+	     && (temp = unctrl((chtype) have[0])) != 0 \
+	     && strlen(temp) > 1) { \
+		while (*temp != '\0') { \
+		    have[0] = (wchar_t) *temp++; \
+		    setcchar(&temp_buffer[n++], have, A_NORMAL, 0, NULL); \
+		} \
+	    } else { \
+		setcchar(&temp_buffer[n++], have, A_NORMAL, 0, NULL); \
+	    } \
+	} while (have[0] != 0); \
+    } else if (temp_buffer != 0) { \
+	free(temp_buffer); \
+	temp_buffer = 0; \
+	temp_length = 0; \
+    } \
+    return temp_buffer;
+
+static size_t
+ChWLen(const wchar_t *source)
+{
+    size_t result = wcslen(source);
+
+    if (!pass_ctls) {
+	size_t adjust = 0;
+	size_t n;
+
+	for (n = 0; source[n] != 0; ++n) {
+	    const char *s;
+
+	    if ((source[n] < 256) && (s = unctrl((chtype) source[n])) != 0) {
+		adjust += (strlen(s) - 1);
+	    }
+	}
+	result += adjust;
+    }
+    return result;
+}
+
+static cchar_t *
+ChStr(const char *source)
+{
+    TempBuffer(strlen(source), UChar(*source++));
+}
+
+static cchar_t *
+ChWStr(const wchar_t *source)
+{
+    TempBuffer(ChWLen(source), *source++);
+}
+
+static void
+legend(WINDOW *win, int level, Options state, wchar_t *buffer, int length)
+{
+    const char *showstate;
+
+    switch (state) {
+    default:
+    case oDefault:
+	showstate = "";
+	break;
+    case oMove:
+	showstate = " (mvXXX)";
+	break;
+    case oWindow:
+	showstate = " (winXXX)";
+	break;
+    case oMoveWindow:
+	showstate = " (mvwinXXX)";
+	break;
+    }
+
+    wmove(win, 0, 0);
+    wprintw(win,
+	    "The Strings/Chars displays should match.  Enter any characters, except:\n");
+    wprintw(win,
+	    "down-arrow or ^N to repeat on next line, ^W for inner window, ESC to exit.\n");
+    wclrtoeol(win);
+    wprintw(win, "Level %d,%s added %d characters <", level,
+	    showstate, length);
+    waddwstr(win, buffer);
+    waddstr(win, ">");
+}
+
+static int
+ColOf(const wchar_t *buffer, int length, int margin)
+{
+    int n;
+    int result;
+
+    for (n = 0, result = margin + 1; n < length; ++n) {
+	int ch = buffer[n];
+	switch (ch) {
+	case '\n':
+	    /* actually newline should clear the remainder of the line
+	     * and move to the next line - but that seems a little awkward
+	     * in this example.
+	     */
+	case '\r':
+	    result = 0;
+	    break;
+	case '\b':
+	    if (result > 0)
+		--result;
+	    break;
+	case '\t':
+	    result += (MY_TABSIZE - (result % MY_TABSIZE));
+	    break;
+	case '\177':
+	    result += 2;
+	    break;
+	default:
+	    result += wcwidth((wchar_t) ch);
+	    if (ch < 32)
+		++result;
+	    break;
+	}
+    }
+    return result;
+}
+
+static int
+ConvertCh(chtype source, cchar_t *target)
+{
+    wchar_t tmp_wchar[2];
+
+    tmp_wchar[0] = (wchar_t) source;
+    tmp_wchar[1] = 0;
+    if (setcchar(target, tmp_wchar, A_NORMAL, 0, (void *) 0) == ERR) {
+	beep();
+	return FALSE;
+    }
+    return TRUE;
+}
+
+static int
+MvWAddCh(WINDOW *win, int y, int x, chtype ch)
+{
+    int code;
+    cchar_t tmp_cchar;
+
+    if (ConvertCh(ch, &tmp_cchar)) {
+	code = mvwadd_wch(win, y, x, &tmp_cchar);
+    } else {
+	code = mvwaddch(win, y, x, ch);
+    }
+    return code;
+}
+
+static int
+MvAddCh(int y, int x, chtype ch)
+{
+    int code;
+    cchar_t tmp_cchar;
+
+    if (ConvertCh(ch, &tmp_cchar)) {
+	code = mvadd_wch(y, x, &tmp_cchar);
+    } else {
+	code = mvaddch(y, x, ch);
+    }
+    return code;
+}
+
+static int
+WAddCh(WINDOW *win, chtype ch)
+{
+    int code;
+    cchar_t tmp_cchar;
+
+    if (ConvertCh(ch, &tmp_cchar)) {
+	code = wadd_wch(win, &tmp_cchar);
+    } else {
+	code = waddch(win, ch);
+    }
+    return code;
+}
+
+static int
+AddCh(chtype ch)
+{
+    int code;
+    cchar_t tmp_cchar;
+
+    if (ConvertCh(ch, &tmp_cchar)) {
+	code = add_wch(&tmp_cchar);
+    } else {
+	code = addch(ch);
+    }
+    return code;
+}
+
+#define LEN(n) ((length - (n) > n_opt) ? n_opt : (length - (n)))
+static void
+recursive_test(int level)
+{
+    static bool first = TRUE;
+
+    int ch;
+    int limit;
+    int row = 1;
+    int col;
+    int row2, col2;
+    int length;
+    wchar_t buffer[BUFSIZ];
+    WINDOW *look = 0;
+    WINDOW *work = 0;
+    WINDOW *show = 0;
+    int margin = (2 * MY_TABSIZE) - 1;
+    Options option = (Options) ((unsigned) (m_opt
+					    ? oMove
+					    : oDefault)
+				| (unsigned) ((w_opt || (level > 0))
+					      ? oWindow
+					      : oDefault));
+
+    if (first) {
+	static char cmd[80];
+	setlocale(LC_ALL, "");
+
+	_nc_STRCPY(cmd, "TABSIZE=8", sizeof(cmd));
+	putenv(cmd);
+
+	initscr();
+	(void) cbreak();	/* take input chars one at a time, no wait for \n */
+	(void) noecho();	/* don't echo input */
+	keypad(stdscr, TRUE);
+
+	/*
+	 * Show the characters added in color, to distinguish from those that
+	 * are shifted.
+	 */
+	if (has_colors()) {
+	    start_color();
+	    init_pair(1, COLOR_WHITE, COLOR_BLUE);
+	}
+    }
+
+    limit = LINES - 5;
+    if (level > 0) {
+	look = newwin(limit, COLS - (2 * (level - 1)), 0, level - 1);
+	work = newwin(limit - 2, COLS - (2 * level), 1, level);
+	show = newwin(4, COLS, limit + 1, 0);
+	box(look, 0, 0);
+	wnoutrefresh(look);
+	limit -= 2;
+    } else {
+	work = stdscr;
+	show = derwin(stdscr, 4, COLS, limit + 1, 0);
+    }
+    keypad(work, TRUE);
+
+    for (col = margin + 1; col < COLS; col += MY_TABSIZE)
+	MvWVLine(work, row, col, '.', limit - 2);
+
+    MvWVLine(work, row, margin, ACS_VLINE, limit - 2);
+    MvWVLine(work, row, margin + 1, ACS_VLINE, limit - 2);
+    limit /= 2;
+
+    MvWAddChStr(work, 1, 2, ChStr("String"));
+    MvWAddChStr(work, limit + 1, 2, ChStr("Chars"));
+    wnoutrefresh(work);
+
+    buffer[length = 0] = '\0';
+    legend(show, level, option, buffer, length);
+    wnoutrefresh(show);
+
+    doupdate();
+
+    if (has_colors()) {
+	wbkgdset(work, (chtype) (COLOR_PAIR(1) | ' '));
+    }
+
+    while ((ch = read_linedata(work)) != ERR && !isQUIT(ch)) {
+	wmove(work, row, margin + 1);
+	switch (ch) {
+	case key_RECUR:
+	    recursive_test(level + 1);
+
+	    if (look)
+		touchwin(look);
+	    touchwin(work);
+	    touchwin(show);
+
+	    if (look)
+		wnoutrefresh(look);
+	    wnoutrefresh(work);
+	    wnoutrefresh(show);
+
+	    doupdate();
+	    break;
+	case key_NEWLINE:
+	    if (row < limit) {
+		++row;
+		/* put the whole string in, all at once */
+		col2 = margin + 1;
+		switch (option) {
+		case oDefault:
+		    if (n_opt > 1) {
+			for (col = 0; col < length; col += n_opt) {
+			    col2 = ColOf(buffer, col, margin);
+			    if (move(row, col2) != ERR) {
+				AddNStr(ChWStr(buffer + col), LEN(col));
+			    }
+			}
+		    } else {
+			if (move(row, col2) != ERR) {
+			    AddStr(ChWStr(buffer));
+			}
+		    }
+		    break;
+		case oMove:
+		    if (n_opt > 1) {
+			for (col = 0; col < length; col += n_opt) {
+			    col2 = ColOf(buffer, col, margin);
+			    MvAddNStr(row, col2, ChWStr(buffer + col), LEN(col));
+			}
+		    } else {
+			MvAddStr(row, col2, ChWStr(buffer));
+		    }
+		    break;
+		case oWindow:
+		    if (n_opt > 1) {
+			for (col = 0; col < length; col += n_opt) {
+			    col2 = ColOf(buffer, col, margin);
+			    if (wmove(work, row, col2) != ERR) {
+				WAddNStr(work, ChWStr(buffer + col), LEN(col));
+			    }
+			}
+		    } else {
+			if (wmove(work, row, col2) != ERR) {
+			    WAddStr(work, ChWStr(buffer));
+			}
+		    }
+		    break;
+		case oMoveWindow:
+		    if (n_opt > 1) {
+			for (col = 0; col < length; col += n_opt) {
+			    col2 = ColOf(buffer, col, margin);
+			    MvWAddNStr(work, row, col2, ChWStr(buffer +
+							       col), LEN(col));
+			}
+		    } else {
+			MvWAddStr(work, row, col2, ChWStr(buffer));
+		    }
+		    break;
+		}
+
+		/* do the corresponding single-character add */
+		row2 = limit + row;
+		for (col = 0; col < length; ++col) {
+		    col2 = ColOf(buffer, col, margin);
+		    switch (option) {
+		    case oDefault:
+			if (move(row2, col2) != ERR) {
+			    AddCh((chtype) buffer[col]);
+			}
+			break;
+		    case oMove:
+			MvAddCh(row2, col2, (chtype) buffer[col]);
+			break;
+		    case oWindow:
+			if (wmove(work, row2, col2) != ERR) {
+			    WAddCh(work, (chtype) buffer[col]);
+			}
+			break;
+		    case oMoveWindow:
+			MvWAddCh(work, row2, col2, (chtype) buffer[col]);
+			break;
+		    }
+		}
+	    } else {
+		beep();
+	    }
+	    break;
+	default:
+	    buffer[length++] = (wchar_t) ch;
+	    buffer[length] = '\0';
+
+	    /* put the string in, one character at a time */
+	    col = ColOf(buffer, length - 1, margin);
+	    switch (option) {
+	    case oDefault:
+		if (move(row, col) != ERR) {
+		    AddStr(ChWStr(buffer + length - 1));
+		}
+		break;
+	    case oMove:
+		MvAddStr(row, col, ChWStr(buffer + length - 1));
+		break;
+	    case oWindow:
+		if (wmove(work, row, col) != ERR) {
+		    WAddStr(work, ChWStr(buffer + length - 1));
+		}
+		break;
+	    case oMoveWindow:
+		MvWAddStr(work, row, col, ChWStr(buffer + length - 1));
+		break;
+	    }
+
+	    /* do the corresponding single-character add */
+	    switch (option) {
+	    case oDefault:
+		if (move(limit + row, col) != ERR) {
+		    AddCh((chtype) ch);
+		}
+		break;
+	    case oMove:
+		MvAddCh(limit + row, col, (chtype) ch);
+		break;
+	    case oWindow:
+		if (wmove(work, limit + row, col) != ERR) {
+		    WAddCh(work, (chtype) ch);
+		}
+		break;
+	    case oMoveWindow:
+		MvWAddCh(work, limit + row, col, (chtype) ch);
+		break;
+	    }
+
+	    wnoutrefresh(work);
+
+	    legend(show, level, option, buffer, length);
+	    wnoutrefresh(show);
+
+	    doupdate();
+	    break;
+	}
+    }
+    delwin(show);
+    if (level > 0) {
+	delwin(work);
+	delwin(look);
+    }
+}
+
+static void
+usage(int ok)
+{
+    static const char *tbl[] =
+    {
+	"Usage: test_add_wchstr [options]"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+	," -f FILE  read data from given file"
+	," -n NUM   limit string-adds to NUM bytes on ^N replay"
+	," -m       perform wmove/move separately from add-functions"
+	," -p       pass-thru control characters without using unctrl()"
+	," -w       use window-parameter even when stdscr would be implied"
+    };
+    unsigned n;
+    for (n = 0; n < SIZEOF(tbl); ++n)
+	fprintf(stderr, "%s\n", tbl[n]);
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+
+    setlocale(LC_ALL, "");
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "f:mn:pw")) != -1) {
+	switch (ch) {
+	case 'f':
+	    init_linedata(optarg);
+	    break;
+	case 'm':
+	    m_opt = TRUE;
+	    break;
+	case 'n':
+	    n_opt = atoi(optarg);
+	    if (n_opt == 0)
+		n_opt = -1;
+	    break;
+	case 'p':
+	    pass_ctls = TRUE;
+	    break;
+	case 'w':
+	    w_opt = TRUE;
+	    break;
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind < argc)
+	usage(FALSE);
+
+    recursive_test(0);
+    endwin();
+#if NO_LEAKS
+    free(temp_buffer);
+#endif
+    ExitProgram(EXIT_SUCCESS);
+}
+#else
+int
+main(void)
+{
+    printf("This program requires the wide-ncurses library\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif
diff --git a/test/test_addchstr.c b/test/test_addchstr.c
new file mode 100644
index 0000000..cddc315
--- /dev/null
+++ b/test/test_addchstr.c
@@ -0,0 +1,529 @@
+/****************************************************************************
+ * Copyright 2020,2022 Thomas E. Dickey                                     *
+ * Copyright 2009-2016,2017 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: test_addchstr.c,v 1.29 2022/12/10 22:28:50 tom Exp $
+ *
+ * Demonstrate the waddchstr() and waddch functions.
+ * Thomas Dickey - 2009/9/12
+ */
+
+#include <test.priv.h>
+#include <linedata.h>
+
+/*
+ * redefinitions to simplify comparison between test_*str programs
+ */
+#undef MvAddStr
+#undef MvWAddStr
+
+#define AddNStr    addchnstr
+#define AddStr     addchstr
+#define MvAddNStr  (void) mvaddchnstr
+#define MvAddStr   (void) mvaddchstr
+#define MvWAddNStr (void) mvwaddchnstr
+#define MvWAddStr  (void) mvwaddchstr
+#define WAddNStr   waddchnstr
+#define WAddStr    waddchstr
+
+#define MY_TABSIZE 8
+
+typedef enum {
+    oDefault = 0,
+    oMove = 1,
+    oWindow = 2,
+    oMoveWindow = 3
+} Options;
+
+static bool m_opt = FALSE;
+static bool pass_ctls = FALSE;
+static bool w_opt = FALSE;
+static int n_opt = -1;
+
+static chtype show_attr;
+static chtype *temp_buffer;
+static size_t temp_length;
+
+#define TempBuffer(source_cast)
+
+static size_t
+ChLen(const char *source)
+{
+    size_t result = strlen(source);
+
+    if (!pass_ctls) {
+	size_t adjust = 0;
+	size_t n;
+
+	for (n = 0; n < result; ++n) {
+	    const char *s = unctrl(UChar(source[n]));
+	    if (s != 0) {
+		adjust += (strlen(s) - 1);
+	    }
+	}
+	result += adjust;
+    }
+    return result;
+}
+
+static chtype *
+ChStr(const char *source)
+{
+    if (source != 0) {
+	size_t need = ChLen(source) + 1;
+	int n = 0;
+
+	if (need > temp_length) {
+	    temp_length = need * 2;
+	    temp_buffer = typeRealloc(chtype, temp_length, temp_buffer);
+	    if (!temp_buffer)
+		failed("TempBuffer");
+	}
+	do {
+	    const char *s;
+	    chtype ch = UChar(*source++);
+	    if (!pass_ctls && (s = unctrl(ch)) != 0) {
+		while (*s != '\0') {
+		    temp_buffer[n++] = UChar(*s++);
+		}
+	    } else {
+		temp_buffer[n++] = ch;
+	    }
+	} while (source[0] != 0);
+	temp_buffer[n] = 0;
+    } else if (temp_buffer != 0) {
+	free(temp_buffer);
+	temp_buffer = 0;
+	temp_length = 0;
+    }
+    return temp_buffer;
+}
+
+/* color the strings drawn in the workspace */
+static chtype *
+ChStr2(const char *source)
+{
+    size_t len = ChLen(source);
+    size_t n;
+    chtype *result = ChStr(source);
+    for (n = 0; n < len; ++n) {
+	result[n] |= show_attr;
+    }
+    return result;
+}
+
+static void
+legend(WINDOW *win, int level, Options state, char *buffer, int length)
+{
+    const char *showstate;
+
+    switch (state) {
+    default:
+    case oDefault:
+	showstate = "";
+	break;
+    case oMove:
+	showstate = " (mvXXX)";
+	break;
+    case oWindow:
+	showstate = " (winXXX)";
+	break;
+    case oMoveWindow:
+	showstate = " (mvwinXXX)";
+	break;
+    }
+
+    wmove(win, 0, 0);
+    wprintw(win,
+	    "The Strings/Chars displays should match.  Enter any characters, except:\n");
+    wprintw(win,
+	    "down-arrow or ^N to repeat on next line, ^W for inner window, ESC to exit.\n");
+    wclrtoeol(win);
+    wprintw(win, "Level %d,%s added %d characters <%s>", level,
+	    showstate, length, buffer);
+}
+
+static int
+ColOf(char *buffer, int length, int margin)
+{
+    int n;
+    int result;
+
+    for (n = 0, result = margin + 1; n < length; ++n) {
+	int ch = UChar(buffer[n]);
+	switch (ch) {
+	case '\n':
+	    /* actually newline should clear the remainder of the line
+	     * and move to the next line - but that seems a little awkward
+	     * in this example.
+	     */
+	case '\r':
+	    result = 0;
+	    break;
+	case '\b':
+	    if (result > 0)
+		--result;
+	    break;
+	case '\t':
+	    result += (MY_TABSIZE - (result % MY_TABSIZE));
+	    break;
+	case '\177':
+	    result += 2;
+	    break;
+	default:
+	    ++result;
+	    if (ch < 32)
+		++result;
+	    break;
+	}
+    }
+    return result;
+}
+
+#define LEN(n) ((length - (n) > n_opt) ? n_opt : (length - (n)))
+static void
+recursive_test(int level)
+{
+    static bool first = TRUE;
+
+    int ch;
+    int limit;
+    int row = 1;
+    int col;
+    int row2, col2;
+    int length;
+    char buffer[BUFSIZ];
+    WINDOW *look = 0;
+    WINDOW *work = 0;
+    WINDOW *show = 0;
+    int margin = (2 * MY_TABSIZE) - 1;
+    Options option = (Options) ((unsigned) (m_opt
+					    ? oMove
+					    : oDefault)
+				| (unsigned) ((w_opt || (level > 0))
+					      ? oWindow
+					      : oDefault));
+
+    if (first) {
+	static char cmd[80];
+	setlocale(LC_ALL, "");
+
+	_nc_STRCPY(cmd, "TABSIZE=8", sizeof(cmd));
+	putenv(cmd);
+
+	initscr();
+	(void) cbreak();	/* take input chars one at a time, no wait for \n */
+	(void) noecho();	/* don't echo input */
+	keypad(stdscr, TRUE);
+
+	/*
+	 * Show the characters added in color, to distinguish from those that
+	 * are shifted.
+	 */
+	if (has_colors()) {
+	    start_color();
+	    init_pair(1, COLOR_WHITE, COLOR_BLUE);
+	}
+    }
+
+    limit = LINES - 5;
+    if (level > 0) {
+	look = newwin(limit, COLS - (2 * (level - 1)), 0, level - 1);
+	work = newwin(limit - 2, COLS - (2 * level), 1, level);
+	show = newwin(4, COLS, limit + 1, 0);
+	box(look, 0, 0);
+	wnoutrefresh(look);
+	limit -= 2;
+    } else {
+	work = stdscr;
+	show = derwin(stdscr, 4, COLS, limit + 1, 0);
+    }
+    keypad(work, TRUE);
+
+    for (col = margin + 1; col < COLS; col += MY_TABSIZE)
+	MvWVLine(work, row, col, '.', limit - 2);
+
+    MvWVLine(work, row, margin, ACS_VLINE, limit - 2);
+    MvWVLine(work, row, margin + 1, ACS_VLINE, limit - 2);
+    limit /= 2;
+
+    MvWAddChStr(work, 1, 2, ChStr("String"));
+    MvWAddChStr(work, limit + 1, 2, ChStr("Chars"));
+    wnoutrefresh(work);
+
+    buffer[length = 0] = '\0';
+    legend(show, level, option, buffer, length);
+    wnoutrefresh(show);
+
+    doupdate();
+
+    if (has_colors()) {
+	show_attr = (chtype) COLOR_PAIR(1);
+	wbkgdset(work, show_attr | ' ');
+    } else {
+	show_attr = A_STANDOUT;
+    }
+
+    while ((ch = read_linedata(work)) != ERR && !isQUIT(ch)) {
+	wmove(work, row, margin + 1);
+	switch (ch) {
+	case key_RECUR:
+	    recursive_test(level + 1);
+
+	    if (look)
+		touchwin(look);
+	    touchwin(work);
+	    touchwin(show);
+
+	    if (look)
+		wnoutrefresh(look);
+	    wnoutrefresh(work);
+	    wnoutrefresh(show);
+
+	    doupdate();
+	    break;
+	case key_NEWLINE:
+	    if (row < limit) {
+		++row;
+		/* put the whole string in, all at once */
+		col2 = margin + 1;
+		switch (option) {
+		case oDefault:
+		    if (n_opt > 1) {
+			for (col = 0; col < length; col += n_opt) {
+			    col2 = ColOf(buffer, col, margin);
+			    if (move(row, col2) != ERR) {
+				AddNStr(ChStr2(buffer + col), LEN(col));
+			    }
+			}
+		    } else {
+			if (move(row, col2) != ERR) {
+			    AddStr(ChStr2(buffer));
+			}
+		    }
+		    break;
+		case oMove:
+		    if (n_opt > 1) {
+			for (col = 0; col < length; col += n_opt) {
+			    col2 = ColOf(buffer, col, margin);
+			    MvAddNStr(row, col2, ChStr2(buffer + col), LEN(col));
+			}
+		    } else {
+			MvAddStr(row, col2, ChStr2(buffer));
+		    }
+		    break;
+		case oWindow:
+		    if (n_opt > 1) {
+			for (col = 0; col < length; col += n_opt) {
+			    col2 = ColOf(buffer, col, margin);
+			    if (wmove(work, row, col2) != ERR) {
+				WAddNStr(work, ChStr2(buffer + col), LEN(col));
+			    }
+			}
+		    } else {
+			if (wmove(work, row, col2) != ERR) {
+			    WAddStr(work, ChStr2(buffer));
+			}
+		    }
+		    break;
+		case oMoveWindow:
+		    if (n_opt > 1) {
+			for (col = 0; col < length; col += n_opt) {
+			    col2 = ColOf(buffer, col, margin);
+			    MvWAddNStr(work, row, col2, ChStr2(buffer + col),
+				       LEN(col));
+			}
+		    } else {
+			MvWAddStr(work, row, col2, ChStr2(buffer));
+		    }
+		    break;
+		}
+
+		/* do the corresponding single-character add */
+		row2 = limit + row;
+		for (col = 0; col < length; ++col) {
+		    col2 = ColOf(buffer, col, margin);
+		    switch (option) {
+		    case oDefault:
+			if (move(row2, col2) != ERR) {
+			    AddCh(UChar(buffer[col]));
+			}
+			break;
+		    case oMove:
+			MvAddCh(row2, col2, UChar(buffer[col]));
+			break;
+		    case oWindow:
+			if (wmove(work, row2, col2) != ERR) {
+			    WAddCh(work, UChar(buffer[col]));
+			}
+			break;
+		    case oMoveWindow:
+			MvWAddCh(work, row2, col2, UChar(buffer[col]));
+			break;
+		    }
+		}
+	    } else {
+		beep();
+	    }
+	    break;
+	case KEY_BACKSPACE:
+	    ch = '\b';
+	    /* FALLTHRU */
+	default:
+	    if (ch <= 0 || ch > 255) {
+		beep();
+		break;
+	    }
+	    buffer[length++] = (char) ch;
+	    buffer[length] = '\0';
+
+	    /* put the string in, one character at a time */
+	    col = ColOf(buffer, length - 1, margin);
+	    switch (option) {
+	    case oDefault:
+		if (move(row, col) != ERR) {
+		    AddStr(ChStr2(buffer + length - 1));
+		}
+		break;
+	    case oMove:
+		MvAddStr(row, col, ChStr2(buffer + length - 1));
+		break;
+	    case oWindow:
+		if (wmove(work, row, col) != ERR) {
+		    WAddStr(work, ChStr2(buffer + length - 1));
+		}
+		break;
+	    case oMoveWindow:
+		MvWAddStr(work, row, col, ChStr2(buffer + length - 1));
+		break;
+	    }
+
+	    /* do the corresponding single-character add */
+	    switch (option) {
+	    case oDefault:
+		if (move(limit + row, col) != ERR) {
+		    AddCh(UChar(ch));
+		}
+		break;
+	    case oMove:
+		MvAddCh(limit + row, col, UChar(ch));
+		break;
+	    case oWindow:
+		if (wmove(work, limit + row, col) != ERR) {
+		    WAddCh(work, UChar(ch));
+		}
+		break;
+	    case oMoveWindow:
+		MvWAddCh(work, limit + row, col, UChar(ch));
+		break;
+	    }
+
+	    wnoutrefresh(work);
+
+	    legend(show, level, option, buffer, length);
+	    wnoutrefresh(show);
+
+	    doupdate();
+	    break;
+	}
+    }
+    if (level > 0) {
+	delwin(work);
+	delwin(look);
+    }
+    delwin(show);
+}
+
+static void
+usage(int ok)
+{
+    static const char *tbl[] =
+    {
+	"Usage: test_addchstr [options]"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+	," -f FILE  read data from given file"
+	," -n NUM   limit string-adds to NUM bytes on ^N replay"
+	," -m       perform wmove/move separately from add-functions"
+	," -p       pass-thru control characters without using unctrl()"
+	," -w       use window-parameter even when stdscr would be implied"
+    };
+    unsigned n;
+    for (n = 0; n < SIZEOF(tbl); ++n)
+	fprintf(stderr, "%s\n", tbl[n]);
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+
+    setlocale(LC_ALL, "");
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "f:mn:pw")) != -1) {
+	switch (ch) {
+	case 'f':
+	    init_linedata(optarg);
+	    break;
+	case 'm':
+	    m_opt = TRUE;
+	    break;
+	case 'n':
+	    n_opt = atoi(optarg);
+	    if (n_opt == 0)
+		n_opt = -1;
+	    break;
+	case 'p':
+	    pass_ctls = TRUE;
+	    break;
+	case 'w':
+	    w_opt = TRUE;
+	    break;
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind < argc)
+	usage(FALSE);
+
+    recursive_test(0);
+    endwin();
+#if NO_LEAKS
+    free(temp_buffer);
+#endif
+    ExitProgram(EXIT_SUCCESS);
+}
diff --git a/test/test_addstr.c b/test/test_addstr.c
new file mode 100644
index 0000000..ba8a90e
--- /dev/null
+++ b/test/test_addstr.c
@@ -0,0 +1,437 @@
+/****************************************************************************
+ * Copyright 2020,2022 Thomas E. Dickey                                     *
+ * Copyright 2009-2016,2017 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: test_addstr.c,v 1.20 2022/12/10 22:28:50 tom Exp $
+ *
+ * Demonstrate the waddstr() and waddch functions.
+ * Thomas Dickey - 2009/9/12
+ */
+
+#include <test.priv.h>
+#include <linedata.h>
+
+/*
+ * redefinitions to simplify comparison between test_*str programs
+ */
+#define AddNStr    addnstr
+#define AddStr     addstr
+#define MvAddNStr  (void) mvaddnstr
+#define MvWAddNStr (void) mvwaddnstr
+#define WAddNStr   waddnstr
+#define WAddStr    waddstr
+
+#define MY_TABSIZE 8
+
+typedef enum {
+    oDefault = 0,
+    oMove = 1,
+    oWindow = 2,
+    oMoveWindow = 3
+} Options;
+
+static bool m_opt = FALSE;
+static bool w_opt = FALSE;
+static int n_opt = -1;
+
+static void
+legend(WINDOW *win, int level, Options state, char *buffer, int length)
+{
+    const char *showstate;
+
+    switch (state) {
+    default:
+    case oDefault:
+	showstate = "";
+	break;
+    case oMove:
+	showstate = " (mvXXX)";
+	break;
+    case oWindow:
+	showstate = " (winXXX)";
+	break;
+    case oMoveWindow:
+	showstate = " (mvwinXXX)";
+	break;
+    }
+
+    wmove(win, 0, 0);
+    wprintw(win,
+	    "The Strings/Chars displays should match.  Enter any characters, except:\n");
+    wprintw(win,
+	    "down-arrow or ^N to repeat on next line, ^W for inner window, ESC to exit.\n");
+    wclrtoeol(win);
+    wprintw(win, "Level %d,%s added %d characters <%s>", level,
+	    showstate, length, buffer);
+}
+
+static int
+ColOf(char *buffer, int length, int margin)
+{
+    int n;
+    int result;
+
+    for (n = 0, result = margin + 1; n < length; ++n) {
+	int ch = UChar(buffer[n]);
+	switch (ch) {
+	case '\n':
+	    /* actually newline should clear the remainder of the line
+	     * and move to the next line - but that seems a little awkward
+	     * in this example.
+	     */
+	case '\r':
+	    result = 0;
+	    break;
+	case '\b':
+	    if (result > 0)
+		--result;
+	    break;
+	case '\t':
+	    result += (MY_TABSIZE - (result % MY_TABSIZE));
+	    break;
+	case '\177':
+	    result += 2;
+	    break;
+	default:
+	    ++result;
+	    if (ch < 32)
+		++result;
+	    break;
+	}
+    }
+    return result;
+}
+
+#define LEN(n) ((length - (n) > n_opt) ? n_opt : (length - (n)))
+static void
+recursive_test(int level)
+{
+    static bool first = TRUE;
+
+    int ch;
+    int limit;
+    int row = 1;
+    int col;
+    int row2, col2;
+    int length;
+    char buffer[BUFSIZ];
+    WINDOW *look = 0;
+    WINDOW *work = 0;
+    WINDOW *show = 0;
+    int margin = (2 * MY_TABSIZE) - 1;
+    Options option = (Options) ((unsigned) (m_opt
+					    ? oMove
+					    : oDefault)
+				| (unsigned) ((w_opt || (level > 0))
+					      ? oWindow
+					      : oDefault));
+
+    if (first) {
+	static char cmd[80];
+	setlocale(LC_ALL, "");
+
+	_nc_STRCPY(cmd, "TABSIZE=8", sizeof(cmd));
+	putenv(cmd);
+
+	initscr();
+	(void) cbreak();	/* take input chars one at a time, no wait for \n */
+	(void) noecho();	/* don't echo input */
+	keypad(stdscr, TRUE);
+
+	/*
+	 * Show the characters added in color, to distinguish from those that
+	 * are shifted.
+	 */
+	if (has_colors()) {
+	    start_color();
+	    init_pair(1, COLOR_WHITE, COLOR_BLUE);
+	}
+    }
+
+    limit = LINES - 5;
+    if (level > 0) {
+	look = newwin(limit, COLS - (2 * (level - 1)), 0, level - 1);
+	work = newwin(limit - 2, COLS - (2 * level), 1, level);
+	show = newwin(4, COLS, limit + 1, 0);
+	box(look, 0, 0);
+	wnoutrefresh(look);
+	limit -= 2;
+    } else {
+	work = stdscr;
+	show = derwin(stdscr, 4, COLS, limit + 1, 0);
+    }
+    keypad(work, TRUE);
+
+    for (col = margin + 1; col < COLS; col += MY_TABSIZE)
+	MvWVLine(work, row, col, '.', limit - 2);
+
+    MvWVLine(work, row, margin, ACS_VLINE, limit - 2);
+    MvWVLine(work, row, margin + 1, ACS_VLINE, limit - 2);
+    limit /= 2;
+
+    MvWAddStr(work, 1, 2, "String");
+    MvWAddStr(work, limit + 1, 2, "Chars");
+    wnoutrefresh(work);
+
+    buffer[length = 0] = '\0';
+    legend(show, level, option, buffer, length);
+    wnoutrefresh(show);
+
+    doupdate();
+
+    if (has_colors()) {
+	wbkgdset(work, (chtype) (COLOR_PAIR(1) | ' '));
+    }
+
+    while ((ch = read_linedata(work)) != ERR && !isQUIT(ch)) {
+	wmove(work, row, margin + 1);
+	switch (ch) {
+	case key_RECUR:
+	    recursive_test(level + 1);
+
+	    if (look)
+		touchwin(look);
+	    touchwin(work);
+	    touchwin(show);
+
+	    if (look)
+		wnoutrefresh(look);
+	    wnoutrefresh(work);
+	    wnoutrefresh(show);
+
+	    doupdate();
+	    break;
+	case key_NEWLINE:
+	    if (row < limit) {
+		++row;
+		/* put the whole string in, all at once */
+		col2 = margin + 1;
+		switch (option) {
+		case oDefault:
+		    if (n_opt > 1) {
+			for (col = 0; col < length; col += n_opt) {
+			    col2 = ColOf(buffer, col, margin);
+			    if (move(row, col2) != ERR) {
+				AddNStr(buffer + col, LEN(col));
+			    }
+			}
+		    } else {
+			if (move(row, col2) != ERR) {
+			    AddStr(buffer);
+			}
+		    }
+		    break;
+		case oMove:
+		    if (n_opt > 1) {
+			for (col = 0; col < length; col += n_opt) {
+			    col2 = ColOf(buffer, col, margin);
+			    MvAddNStr(row, col2, buffer + col, LEN(col));
+			}
+		    } else {
+			MvAddStr(row, col2, buffer);
+		    }
+		    break;
+		case oWindow:
+		    if (n_opt > 1) {
+			for (col = 0; col < length; col += n_opt) {
+			    col2 = ColOf(buffer, col, margin);
+			    if (wmove(work, row, col2) != ERR) {
+				WAddNStr(work, buffer + col, LEN(col));
+			    }
+			}
+		    } else {
+			if (wmove(work, row, col2) != ERR) {
+			    WAddStr(work, buffer);
+			}
+		    }
+		    break;
+		case oMoveWindow:
+		    if (n_opt > 1) {
+			for (col = 0; col < length; col += n_opt) {
+			    col2 = ColOf(buffer, col, margin);
+			    MvWAddNStr(work, row, col2, buffer + col, LEN(col));
+			}
+		    } else {
+			MvWAddStr(work, row, col2, buffer);
+		    }
+		    break;
+		}
+
+		/* do the corresponding single-character add */
+		row2 = limit + row;
+		for (col = 0; col < length; ++col) {
+		    col2 = ColOf(buffer, col, margin);
+		    switch (option) {
+		    case oDefault:
+			if (move(row2, col2) != ERR) {
+			    AddCh(UChar(buffer[col]));
+			}
+			break;
+		    case oMove:
+			MvAddCh(row2, col2, UChar(buffer[col]));
+			break;
+		    case oWindow:
+			if (wmove(work, row2, col2) != ERR) {
+			    WAddCh(work, UChar(buffer[col]));
+			}
+			break;
+		    case oMoveWindow:
+			MvWAddCh(work, row2, col2, UChar(buffer[col]));
+			break;
+		    }
+		}
+	    } else {
+		beep();
+	    }
+	    break;
+	default:
+	    if (ch <= 0 || ch > 255) {
+		beep();
+		break;
+	    }
+	    buffer[length++] = (char) ch;
+	    buffer[length] = '\0';
+
+	    /* put the string in, one character at a time */
+	    col = ColOf(buffer, length - 1, margin);
+	    switch (option) {
+	    case oDefault:
+		if (move(row, col) != ERR) {
+		    AddStr(buffer + length - 1);
+		}
+		break;
+	    case oMove:
+		MvAddStr(row, col, buffer + length - 1);
+		break;
+	    case oWindow:
+		if (wmove(work, row, col) != ERR) {
+		    WAddStr(work, buffer + length - 1);
+		}
+		break;
+	    case oMoveWindow:
+		MvWAddStr(work, row, col, buffer + length - 1);
+		break;
+	    }
+
+	    /* do the corresponding single-character add */
+	    switch (option) {
+	    case oDefault:
+		if (move(limit + row, col) != ERR) {
+		    AddCh(UChar(ch));
+		}
+		break;
+	    case oMove:
+		MvAddCh(limit + row, col, UChar(ch));
+		break;
+	    case oWindow:
+		if (wmove(work, limit + row, col) != ERR) {
+		    WAddCh(work, UChar(ch));
+		}
+		break;
+	    case oMoveWindow:
+		MvWAddCh(work, limit + row, col, UChar(ch));
+		break;
+	    }
+
+	    wnoutrefresh(work);
+
+	    legend(show, level, option, buffer, length);
+	    wnoutrefresh(show);
+
+	    doupdate();
+	    break;
+	}
+    }
+    delwin(show);
+    if (level > 0) {
+	delwin(work);
+	delwin(look);
+    }
+}
+
+static void
+usage(int ok)
+{
+    static const char *tbl[] =
+    {
+	"Usage: test_addstr [options]"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+	," -f FILE  read data from given file"
+	," -n NUM   limit string-adds to NUM bytes on ^N replay"
+	," -m       perform wmove/move separately from add-functions"
+	," -w       use window-parameter even when stdscr would be implied"
+    };
+    unsigned n;
+    for (n = 0; n < SIZEOF(tbl); ++n)
+	fprintf(stderr, "%s\n", tbl[n]);
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+
+    setlocale(LC_ALL, "");
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "f:mn:w")) != -1) {
+	switch (ch) {
+	case 'f':
+	    init_linedata(optarg);
+	    break;
+	case 'm':
+	    m_opt = TRUE;
+	    break;
+	case 'n':
+	    n_opt = atoi(optarg);
+	    if (n_opt == 0)
+		n_opt = -1;
+	    break;
+	case 'w':
+	    w_opt = TRUE;
+	    break;
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind < argc)
+	usage(FALSE);
+
+    recursive_test(0);
+    endwin();
+    ExitProgram(EXIT_SUCCESS);
+}
diff --git a/test/test_addwstr.c b/test/test_addwstr.c
new file mode 100644
index 0000000..aa7bf85
--- /dev/null
+++ b/test/test_addwstr.c
@@ -0,0 +1,537 @@
+/****************************************************************************
+ * Copyright 2020,2022 Thomas E. Dickey                                     *
+ * Copyright 2009-2016,2017 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: test_addwstr.c,v 1.21 2022/12/10 22:28:50 tom Exp $
+ *
+ * Demonstrate the waddwstr() and wadd_wch functions.
+ * Thomas Dickey - 2009/9/12
+ *
+ * Note: to provide inputs for *add_wch(), we use setcchar().  A quirk of the
+ * X/Open definition for that function is that the string contains no
+ * characters with negative width.  Any control character (such as tab) falls
+ * into that category.  So it follows that *add_wch() cannot render a tab
+ * character because there is no legal way to construct a cchar_t containing
+ * one.  X/Open does not document this, and it would be logical to assume that
+ * *addwstr() has the same limitation, but it uses a wchar_t string directly,
+ * and does not document how tabs are handled.
+ */
+
+#include <test.priv.h>
+
+#if USE_WIDEC_SUPPORT
+
+#define WIDE_LINEDATA
+#include <linedata.h>
+
+#undef AddCh
+#undef MvAddCh
+#undef MvAddStr
+#undef MvWAddCh
+#undef MvWAddStr
+#undef WAddCh
+
+/*
+ * redefinitions to simplify comparison between test_*str programs
+ */
+#define AddNStr    addnwstr
+#define AddStr     addwstr
+#define MvAddNStr  (void) mvaddnwstr
+#define MvAddStr   (void) mvaddwstr
+#define MvWAddNStr (void) mvwaddnwstr
+#define MvWAddStr  (void) mvwaddwstr
+#define WAddNStr   waddnwstr
+#define WAddStr    waddwstr
+
+#define MY_TABSIZE 8
+
+typedef enum {
+    oDefault = 0,
+    oMove = 1,
+    oWindow = 2,
+    oMoveWindow = 3
+} Options;
+
+static bool m_opt = FALSE;
+static bool w_opt = FALSE;
+static int n_opt = -1;
+
+static void
+legend(WINDOW *win, int level, Options state, wchar_t *buffer, int length)
+{
+    const char *showstate;
+
+    switch (state) {
+    default:
+    case oDefault:
+	showstate = "";
+	break;
+    case oMove:
+	showstate = " (mvXXX)";
+	break;
+    case oWindow:
+	showstate = " (winXXX)";
+	break;
+    case oMoveWindow:
+	showstate = " (mvwinXXX)";
+	break;
+    }
+
+    wmove(win, 0, 0);
+    wprintw(win,
+	    "The Strings/Chars displays should match.  Enter any characters, except:\n");
+    wprintw(win,
+	    "down-arrow or ^N to repeat on next line, ^W for inner window, ESC to exit.\n");
+    wclrtoeol(win);
+    wprintw(win, "Level %d,%s added %d characters <", level, showstate, length);
+    waddwstr(win, buffer);
+    waddstr(win, ">");
+}
+
+static int
+ColOf(wchar_t *buffer, int length, int margin)
+{
+    int n;
+    int result;
+
+    for (n = 0, result = margin + 1; n < length; ++n) {
+	int ch = buffer[n];
+	switch (ch) {
+	case '\n':
+	    /* actually newline should clear the remainder of the line
+	     * and move to the next line - but that seems a little awkward
+	     * in this example.
+	     */
+	case '\r':
+	    result = 0;
+	    break;
+	case '\b':
+	    if (result > 0)
+		--result;
+	    break;
+	case '\t':
+	    result += (MY_TABSIZE - (result % MY_TABSIZE));
+	    break;
+	case '\177':
+	    result += 2;
+	    break;
+	default:
+	    result += wcwidth((wchar_t) ch);
+	    if (ch < 32)
+		++result;
+	    break;
+	}
+    }
+    return result;
+}
+
+static int
+ConvertCh(chtype source, cchar_t *target)
+{
+    wchar_t tmp_wchar[2];
+
+    tmp_wchar[0] = (wchar_t) source;
+    tmp_wchar[1] = 0;
+    if (setcchar(target, tmp_wchar, A_NORMAL, 0, (void *) 0) == ERR) {
+	beep();
+	return FALSE;
+    }
+    return TRUE;
+}
+
+static int
+MvWAddCh(WINDOW *win, int y, int x, chtype ch)
+{
+    int code;
+    cchar_t tmp_cchar;
+
+    if (ConvertCh(ch, &tmp_cchar)) {
+	code = mvwadd_wch(win, y, x, &tmp_cchar);
+    } else {
+	code = mvwaddch(win, y, x, ch);
+    }
+    return code;
+}
+
+static int
+MvAddCh(int y, int x, chtype ch)
+{
+    int code;
+    cchar_t tmp_cchar;
+
+    if (ConvertCh(ch, &tmp_cchar)) {
+	code = mvadd_wch(y, x, &tmp_cchar);
+    } else {
+	code = mvaddch(y, x, ch);
+    }
+    return code;
+}
+
+static int
+WAddCh(WINDOW *win, chtype ch)
+{
+    int code;
+    cchar_t tmp_cchar;
+
+    if (ConvertCh(ch, &tmp_cchar)) {
+	code = wadd_wch(win, &tmp_cchar);
+    } else {
+	code = waddch(win, ch);
+    }
+    return code;
+}
+
+static int
+AddCh(chtype ch)
+{
+    int code;
+    cchar_t tmp_cchar;
+
+    if (ConvertCh(ch, &tmp_cchar)) {
+	code = add_wch(&tmp_cchar);
+    } else {
+	code = addch(ch);
+    }
+    return code;
+}
+
+#define LEN(n) ((length - (n) > n_opt) ? n_opt : (length - (n)))
+static void
+recursive_test(int level)
+{
+    static bool first = TRUE;
+
+    int ch;
+    int limit;
+    int row = 1;
+    int col;
+    int row2, col2;
+    int length;
+    wchar_t buffer[BUFSIZ];
+    WINDOW *look = 0;
+    WINDOW *work = 0;
+    WINDOW *show = 0;
+    int margin = (2 * MY_TABSIZE) - 1;
+    Options option = (Options) ((unsigned) (m_opt
+					    ? oMove
+					    : oDefault)
+				| (unsigned) ((w_opt || (level > 0))
+					      ? oWindow
+					      : oDefault));
+
+    if (first) {
+	static char cmd[80];
+	setlocale(LC_ALL, "");
+
+	_nc_STRCPY(cmd, "TABSIZE=8", sizeof(cmd));
+	putenv(cmd);
+
+	initscr();
+	(void) cbreak();	/* take input chars one at a time, no wait for \n */
+	(void) noecho();	/* don't echo input */
+	keypad(stdscr, TRUE);
+
+	/*
+	 * Show the characters added in color, to distinguish from those that
+	 * are shifted.
+	 */
+	if (has_colors()) {
+	    start_color();
+	    init_pair(1, COLOR_WHITE, COLOR_BLUE);
+	}
+    }
+
+    limit = LINES - 5;
+    if (level > 0) {
+	look = newwin(limit, COLS - (2 * (level - 1)), 0, level - 1);
+	work = newwin(limit - 2, COLS - (2 * level), 1, level);
+	show = newwin(4, COLS, limit + 1, 0);
+	box(look, 0, 0);
+	wnoutrefresh(look);
+	limit -= 2;
+    } else {
+	work = stdscr;
+	show = derwin(stdscr, 4, COLS, limit + 1, 0);
+    }
+    keypad(work, TRUE);
+
+    for (col = margin + 1; col < COLS; col += MY_TABSIZE)
+	MvWVLine(work, row, col, '.', limit - 2);
+
+    MvWVLine(work, row, margin, ACS_VLINE, limit - 2);
+    MvWVLine(work, row, margin + 1, ACS_VLINE, limit - 2);
+    limit /= 2;
+
+    (void) mvwaddstr(work, 1, 2, "String");
+    (void) mvwaddstr(work, limit + 1, 2, "Chars");
+    wnoutrefresh(work);
+
+    buffer[length = 0] = '\0';
+    legend(show, level, option, buffer, length);
+    wnoutrefresh(show);
+
+    doupdate();
+
+    if (has_colors()) {
+	wbkgdset(work, (chtype) (COLOR_PAIR(1) | ' '));
+    }
+
+    while ((ch = read_linedata(work)) != ERR && !isQUIT(ch)) {
+	wmove(work, row, margin + 1);
+	switch (ch) {
+	case key_RECUR:
+	    recursive_test(level + 1);
+
+	    if (look)
+		touchwin(look);
+	    touchwin(work);
+	    touchwin(show);
+
+	    if (look)
+		wnoutrefresh(look);
+	    wnoutrefresh(work);
+	    wnoutrefresh(show);
+
+	    doupdate();
+	    break;
+	case key_NEWLINE:
+	    if (row < limit) {
+		++row;
+		/* put the whole string in, all at once */
+		col2 = margin + 1;
+		switch (option) {
+		case oDefault:
+		    if (n_opt > 1) {
+			for (col = 0; col < length; col += n_opt) {
+			    col2 = ColOf(buffer, col, margin);
+			    if (move(row, col2) != ERR) {
+				AddNStr(buffer + col, LEN(col));
+			    }
+			}
+		    } else {
+			if (move(row, col2) != ERR) {
+			    AddStr(buffer);
+			}
+		    }
+		    break;
+		case oMove:
+		    if (n_opt > 1) {
+			for (col = 0; col < length; col += n_opt) {
+			    col2 = ColOf(buffer, col, margin);
+			    MvAddNStr(row, col2, buffer + col, LEN(col));
+			}
+		    } else {
+			MvAddStr(row, col2, buffer);
+		    }
+		    break;
+		case oWindow:
+		    if (n_opt > 1) {
+			for (col = 0; col < length; col += n_opt) {
+			    col2 = ColOf(buffer, col, margin);
+			    if (wmove(work, row, col2) != ERR) {
+				WAddNStr(work, buffer + col, LEN(col));
+			    }
+			}
+		    } else {
+			if (wmove(work, row, col2) != ERR) {
+			    WAddStr(work, buffer);
+			}
+		    }
+		    break;
+		case oMoveWindow:
+		    if (n_opt > 1) {
+			for (col = 0; col < length; col += n_opt) {
+			    col2 = ColOf(buffer, col, margin);
+			    MvWAddNStr(work, row, col2, buffer + col, LEN(col));
+			}
+		    } else {
+			MvWAddStr(work, row, col2, buffer);
+		    }
+		    break;
+		}
+
+		/* do the corresponding single-character add */
+		row2 = limit + row;
+		for (col = 0; col < length; ++col) {
+		    col2 = ColOf(buffer, col, margin);
+		    switch (option) {
+		    case oDefault:
+			if (move(row2, col2) != ERR) {
+			    AddCh((chtype) buffer[col]);
+			}
+			break;
+		    case oMove:
+			MvAddCh(row2, col2, (chtype) buffer[col]);
+			break;
+		    case oWindow:
+			if (wmove(work, row2, col2) != ERR) {
+			    WAddCh(work, (chtype) buffer[col]);
+			}
+			break;
+		    case oMoveWindow:
+			MvWAddCh(work, row2, col2, (chtype) buffer[col]);
+			break;
+		    }
+		}
+	    } else {
+		beep();
+	    }
+	    break;
+	case KEY_BACKSPACE:
+	    ch = '\b';
+	    /* FALLTHRU */
+	default:
+	    buffer[length++] = (wchar_t) ch;
+	    buffer[length] = '\0';
+
+	    /* put the string in, one character at a time */
+	    col = ColOf(buffer, length - 1, margin);
+	    switch (option) {
+	    case oDefault:
+		if (move(row, col) != ERR) {
+		    AddStr(buffer + length - 1);
+		}
+		break;
+	    case oMove:
+		MvAddStr(row, col, buffer + length - 1);
+		break;
+	    case oWindow:
+		if (wmove(work, row, col) != ERR) {
+		    WAddStr(work, buffer + length - 1);
+		}
+		break;
+	    case oMoveWindow:
+		MvWAddStr(work, row, col, buffer + length - 1);
+		break;
+	    }
+
+	    /* do the corresponding single-character add */
+	    switch (option) {
+	    case oDefault:
+		if (move(limit + row, col) != ERR) {
+		    AddCh((chtype) ch);
+		}
+		break;
+	    case oMove:
+		MvAddCh(limit + row, col, (chtype) ch);
+		break;
+	    case oWindow:
+		if (wmove(work, limit + row, col) != ERR) {
+		    WAddCh(work, (chtype) ch);
+		}
+		break;
+	    case oMoveWindow:
+		MvWAddCh(work, limit + row, col, (chtype) ch);
+		break;
+	    }
+
+	    wnoutrefresh(work);
+
+	    legend(show, level, option, buffer, length);
+	    wnoutrefresh(show);
+
+	    doupdate();
+	    break;
+	}
+    }
+    delwin(show);
+    if (level > 0) {
+	delwin(work);
+	delwin(look);
+    }
+}
+
+static void
+usage(int ok)
+{
+    static const char *tbl[] =
+    {
+	"Usage: test_addwstr [options]"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+	," -f FILE  read data from given file"
+	," -n NUM   limit string-adds to NUM bytes on ^N replay"
+	," -m       perform wmove/move separately from add-functions"
+	," -w       use window-parameter even when stdscr would be implied"
+    };
+    unsigned n;
+    for (n = 0; n < SIZEOF(tbl); ++n)
+	fprintf(stderr, "%s\n", tbl[n]);
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+
+    setlocale(LC_ALL, "");
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "f:mn:w")) != -1) {
+	switch (ch) {
+	case 'f':
+	    init_linedata(optarg);
+	    break;
+	case 'm':
+	    m_opt = TRUE;
+	    break;
+	case 'n':
+	    n_opt = atoi(optarg);
+	    if (n_opt == 0)
+		n_opt = -1;
+	    break;
+	case 'w':
+	    w_opt = TRUE;
+	    break;
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind < argc)
+	usage(FALSE);
+
+    recursive_test(0);
+    endwin();
+    ExitProgram(EXIT_SUCCESS);
+}
+#else
+int
+main(void)
+{
+    printf("This program requires the wide-ncurses library\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif
diff --git a/test/test_arrays.c b/test/test_arrays.c
new file mode 100644
index 0000000..f89cb28
--- /dev/null
+++ b/test/test_arrays.c
@@ -0,0 +1,233 @@
+/****************************************************************************
+ * Copyright 2020,2022 Thomas E. Dickey                                     *
+ * Copyright 2007-2010,2017 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: test_arrays.c,v 1.13 2022/12/10 23:23:27 tom Exp $
+ *
+ * Author: Thomas E Dickey
+ *
+ * Demonstrate the public arrays from the terminfo library.
+
+extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) boolnames[];
+extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) boolcodes[];
+extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) boolfnames[];
+extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) numnames[];
+extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) numcodes[];
+extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) numfnames[];
+extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) strnames[];
+extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) strcodes[];
+extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) strfnames[];
+
+ */
+
+#define USE_TINFO
+#include <test.priv.h>
+
+#if HAVE_TIGETSTR
+#if defined(HAVE_CURSES_DATA_BOOLNAMES) || defined(DECL_CURSES_DATA_BOOLNAMES)
+
+static bool opt_C;
+static bool opt_T;
+static bool opt_c;
+static bool opt_f;
+static bool opt_n;
+static bool opt_t;
+
+#define PLAIN(opts, name) if (opts) dump_array(#name, name)
+
+static void
+dump_array(const char *name, NCURSES_CONST char *const *list)
+{
+    int n;
+
+    printf("%s:\n", name);
+    for (n = 0; list[n] != 0; ++n) {
+	printf("%5d:%s\n", n, list[n]);
+    }
+}
+
+static void
+dump_plain(void)
+{
+    PLAIN(opt_T && opt_n, boolnames);
+    PLAIN(opt_C && opt_c, boolcodes);
+    PLAIN(opt_T && opt_f, boolfnames);
+
+    PLAIN(opt_T && opt_n, numnames);
+    PLAIN(opt_C && opt_c, numcodes);
+    PLAIN(opt_T && opt_f, numfnames);
+
+    PLAIN(opt_T && opt_n, strnames);
+    PLAIN(opt_C && opt_c, strcodes);
+    PLAIN(opt_T && opt_f, strfnames);
+}
+
+#define STRING(opts, name) if (opts) { printf("%s\"%s\"", c++ ? "," : "", name); }
+#define NUMBER(opts, value) if (opts) { printf("%s%d", c++ ? "," : "", value); }
+
+static void
+dump_table(void)
+{
+    int c = 0;
+    int r;
+
+    STRING(opt_t, "Index");
+    STRING(opt_t, "Type");
+    STRING(opt_n, "Name");
+    STRING(opt_c, "Code");
+    STRING(opt_f, "FName");
+    printf("\n");
+
+    for (r = 0; boolnames[r]; ++r) {
+	c = 0;
+	NUMBER(opt_t, r);
+	STRING(opt_t, "bool");
+	STRING(opt_T && opt_n, boolnames[r]);
+	STRING(opt_C && opt_c, boolcodes[r]);
+	STRING(opt_T && opt_f, boolfnames[r]);
+	printf("\n");
+    }
+
+    for (r = 0; numnames[r]; ++r) {
+	c = 0;
+	NUMBER(opt_t, r);
+	STRING(opt_t, "num");
+	STRING(opt_T && opt_n, numnames[r]);
+	STRING(opt_C && opt_c, numcodes[r]);
+	STRING(opt_T && opt_f, numfnames[r]);
+	printf("\n");
+    }
+
+    for (r = 0; strnames[r]; ++r) {
+	c = 0;
+	NUMBER(opt_t, r);
+	STRING(opt_t, "str");
+	STRING(opt_T && opt_n, strnames[r]);
+	STRING(opt_C && opt_c, strcodes[r]);
+	STRING(opt_T && opt_f, strfnames[r]);
+	printf("\n");
+    }
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: test_arrays [options]"
+	,""
+	,"If no options are given, print all (boolean, numeric, string)"
+	,"capability names showing their index within the tables."
+	,""
+	,USAGE_COMMON
+	,"Options:"
+	," -C       print termcap names"
+	," -T       print terminfo names"
+	," -c       print termcap names"
+	," -f       print full terminfo names"
+	," -n       print short terminfo names"
+	," -t       print the result as CSV table"
+    };
+    unsigned n;
+    for (n = 0; n < SIZEOF(msg); ++n) {
+	fprintf(stderr, "%s\n", msg[n]);
+    }
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "CTcfnt")) != -1) {
+	switch (ch) {
+	case 'C':
+	    opt_C = TRUE;
+	    break;
+	case 'T':
+	    opt_T = TRUE;
+	    break;
+	case 'c':
+	    opt_c = TRUE;
+	    break;
+	case 'f':
+	    opt_f = TRUE;
+	    break;
+	case 'n':
+	    opt_n = TRUE;
+	    break;
+	case 't':
+	    opt_t = TRUE;
+	    break;
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind < argc)
+	usage(FALSE);
+
+    if (!(opt_T || opt_C)) {
+	opt_T = opt_C = TRUE;
+    }
+    if (!(opt_c || opt_f || opt_n)) {
+	opt_c = opt_f = opt_n = TRUE;
+    }
+
+    if (opt_t) {
+	dump_table();
+    } else {
+	dump_plain();
+    }
+
+    ExitProgram(EXIT_SUCCESS);
+}
+
+#else
+int
+main(void)
+{
+    printf("This program requires the terminfo arrays\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif
+#else /* !HAVE_TIGETSTR */
+int
+main(void)
+{
+    printf("This program requires the terminfo functions such as tigetstr\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif /* HAVE_TIGETSTR */
diff --git a/test/test_delwin.c b/test/test_delwin.c
new file mode 100644
index 0000000..7a87425
--- /dev/null
+++ b/test/test_delwin.c
@@ -0,0 +1,151 @@
+/****************************************************************************
+ * Copyright 2022 Thomas E. Dickey                                          *
+ *                                                                          *
+ * 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: test_delwin.c,v 1.4 2022/12/10 22:14:07 tom Exp $
+ */
+#include <test.priv.h>
+
+#define STATUS 10
+
+static SCREEN *my_screen;
+
+static void
+show_rc(const char *what, const char *explain, int rc)
+{
+    printw("%s : %d (%s)\n", what, rc, explain);
+}
+
+static void
+next_step(WINDOW *win)
+{
+    int ch = wgetch(win);
+    if (ch == QUIT || ch == ESCAPE) {
+	endwin();
+	/* use this to verify if delscreen frees all memory */
+	delscreen(my_screen);
+	exit(EXIT_FAILURE);
+    }
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: test_delwin [options]"
+	,""
+	,USAGE_COMMON
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char **argv)
+{
+    WINDOW *parent, *child1;
+    int rc;
+    int ch;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) {
+	switch (ch) {
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind < argc)
+	usage(FALSE);
+
+    if ((my_screen = newterm(NULL, stdout, stdin)) == NULL)
+	ExitProgram(EXIT_FAILURE);
+
+    noecho();
+    cbreak();
+
+    refresh();
+    wsetscrreg(stdscr, 0, STATUS - 1);
+    scrollok(stdscr, TRUE);
+
+    parent = newwin(0, 0, STATUS, 0);
+    box(parent, 0, 0);
+    wrefresh(parent);
+    next_step(parent);
+
+    printw("New window %p    %s\n", (void *) parent, "Top window");
+    mvwprintw(parent, 1, 1, "Top window");
+    wrefresh(parent);
+    next_step(stdscr);
+
+    child1 = derwin(parent, LINES - STATUS - 4, COLS - 4, 2, 2);
+    box(child1, 0, 0);
+    mvwprintw(child1, 1, 1, "Sub window");
+    wrefresh(child1);
+
+    printw("Sub window %p    %s\n", (void *) child1, "Hello world!");
+    next_step(stdscr);
+
+    show_rc("Deleted parent",
+	    "should fail, it still has a subwindow",
+	    rc = delwin(parent));
+    next_step(stdscr);
+    show_rc("Deleted child1",
+	    "should succeed",
+	    rc = delwin(child1));
+    next_step(stdscr);
+    if (rc == OK) {
+	wclrtobot(parent);
+	box(parent, 0, 0);
+	next_step(parent);
+    }
+    show_rc("Deleted parent",
+	    "should succeed, it has no subwindow now",
+	    rc = delwin(parent));
+    next_step(stdscr);
+    if (rc == OK) {
+	touchwin(stdscr);
+	next_step(stdscr);
+    }
+    show_rc("Deleted parent",
+	    "should fail, may dump core",
+	    delwin(parent));
+    next_step(stdscr);
+    endwin();
+    ExitProgram(EXIT_SUCCESS);
+}
diff --git a/test/test_get_wstr.c b/test/test_get_wstr.c
new file mode 100644
index 0000000..2a788fc
--- /dev/null
+++ b/test/test_get_wstr.c
@@ -0,0 +1,429 @@
+/****************************************************************************
+ * Copyright 2020,2022 Thomas E. Dickey                                     *
+ * Copyright 2007-2011,2017 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: test_get_wstr.c,v 1.14 2022/12/10 23:59:13 tom Exp $
+ *
+ * Author: Thomas E Dickey
+ *
+ * Demonstrate the get_wstr functions from the curses library.
+
+       int get_wstr(wint_t *wstr);
+       int getn_wstr(wint_t *wstr, int n);
+       int wget_wstr(WINDOW *win, wint_t *wstr);
+       int wgetn_wstr(WINDOW *win, wint_t *wstr, int n);
+       int mvget_wstr(int y, int x, wint_t *wstr);
+       int mvgetn_wstr(int y, int x, wint_t *wstr, int n);
+       int mvwget_wstr(WINDOW *win, int y, int x, wint_t *wstr);
+       int mvwgetn_wstr(WINDOW *win, int y, int x, wint_t *wstr, int n);
+ */
+
+#include <test.priv.h>
+#include <popup_msg.h>
+
+#if HAVE_CHGAT
+/* NetBSD curses wchgat */
+
+#if USE_WIDEC_SUPPORT
+
+#define BASE_Y 6
+#define MAX_COLS 1024
+
+typedef enum {
+    eGetStr = 0,
+    eGetNStr,
+    eMvGetStr,
+    eMvGetNStr,
+    eMaxFlavor
+} Flavors;
+
+static bool
+Quit(int ch)
+{
+    return (ch == ERR || ch == 'q' || ch == QUIT || ch == ESCAPE);
+}
+
+static int
+Remainder(WINDOW *txtwin)
+{
+    int result = getmaxx(txtwin) - getcurx(txtwin);
+    return (result > 0) ? result : 0;
+}
+
+/*
+ * Show a highlighted line in the place where input will happen.
+ */
+static void
+ShowPrompt(WINDOW *txtwin, int limit)
+{
+    wchgat(txtwin, limit, WA_REVERSE, 0, NULL);
+    wnoutrefresh(txtwin);
+}
+
+static void
+MovePrompt(WINDOW *txtwin, int limit, int y, int x)
+{
+    wchgat(txtwin, Remainder(txtwin), WA_NORMAL, 0, NULL);
+    wmove(txtwin, y, x);
+    ShowPrompt(txtwin, limit);
+}
+
+static int
+ShowFlavor(WINDOW *strwin, WINDOW *txtwin, int flavor, int limit)
+{
+    const char *name = "?";
+    bool limited = FALSE;
+    bool wins = (txtwin != stdscr);
+    int result;
+
+    switch (flavor) {
+    case eGetStr:
+	name = wins ? "wget_wstr" : "get_wstr";
+	break;
+    case eGetNStr:
+	limited = TRUE;
+	name = wins ? "wgetn_wstr" : "getn_wstr";
+	break;
+    case eMvGetStr:
+	name = wins ? "mvwget_wstr" : "mvget_wstr";
+	break;
+    case eMvGetNStr:
+	limited = TRUE;
+	name = wins ? "mvwgetn_wstr" : "mvgetn_wstr";
+	break;
+    case eMaxFlavor:
+	break;
+    }
+
+    wmove(strwin, 0, 0);
+    werase(strwin);
+
+    if (limited) {
+	wprintw(strwin, "%s(%d):", name, limit);
+    } else {
+	wprintw(strwin, "%s:", name);
+    }
+    result = limited ? limit : Remainder(txtwin);
+    ShowPrompt(txtwin, result);
+
+    wnoutrefresh(strwin);
+    return result;
+}
+
+static int
+recursive_test(int level, char **argv, WINDOW *strwin)
+{
+    static const char *help[] =
+    {
+	"Commands:",
+	"  q,^Q,ESC       - quit this program",
+	"  ^Q,ESC         - quit help-screen",
+	"",
+	"  p,<Up>         - move beginning of prompt one up row",
+	"  j,<Down>       - move beginning of prompt one down row",
+	"  h,<Left>       - move beginning of prompt one left column",
+	"  l,<Right>      - move beginning of prompt one right column",
+	"",
+	"  -              - reduce getnstr buffer-size one column",
+	"  +              - increase getnstr buffer-size one column",
+	"  :              - prompt for input-text",
+	"",
+	"  <              - scroll \"left\" through getstr-functions",
+	"  >              - scroll \"right\" through getstr-functions",
+	"",
+	"  w              - recur to subwindow",
+	"  ?,<F1>         - show help-screen",
+	0
+    };
+    WINDOW *txtbox = 0;
+    WINDOW *txtwin = 0;
+    FILE *fp;
+    int ch;
+    int rc;
+    int txt_x = 0, txt_y = 0;
+    int base_y;
+    int flavor = 0;
+    int limit = getmaxx(strwin) - 5;
+    int actual;
+    wint_t buffer[MAX_COLS];
+
+    if (argv[level] == 0) {
+	beep();
+	return FALSE;
+    }
+
+    if (level > 1) {
+	txtbox = newwin(LINES - BASE_Y, COLS - level, BASE_Y, level);
+	box(txtbox, 0, 0);
+	wnoutrefresh(txtbox);
+
+	txtwin = derwin(txtbox,
+			getmaxy(txtbox) - 2,
+			getmaxx(txtbox) - 2,
+			1, 1);
+	base_y = 0;
+    } else {
+	txtwin = stdscr;
+	base_y = BASE_Y;
+    }
+
+    keypad(txtwin, TRUE);	/* enable keyboard mapping */
+    (void) cbreak();		/* take input chars one at a time, no wait for \n */
+    (void) noecho();		/* don't echo input */
+
+    txt_y = base_y;
+    txt_x = 0;
+    wmove(txtwin, txt_y, txt_x);
+
+    if ((fp = fopen(argv[level], "r")) != 0) {
+	while ((ch = fgetc(fp)) != EOF) {
+	    if (waddch(txtwin, UChar(ch)) != OK) {
+		break;
+	    }
+	}
+	fclose(fp);
+    } else {
+	wprintw(txtwin, "Cannot open:\n%s", argv[1]);
+    }
+
+    wmove(txtwin, txt_y, txt_x);
+    actual = ShowFlavor(strwin, txtwin, flavor, limit);
+    while (!Quit(ch = mvwgetch(txtwin, txt_y, txt_x))) {
+	switch (ch) {
+	case KEY_DOWN:
+	case 'j':
+	    if (txt_y < getmaxy(txtwin) - 1) {
+		MovePrompt(txtwin, actual, ++txt_y, txt_x);
+	    } else {
+		beep();
+	    }
+	    break;
+	case KEY_UP:
+	case 'k':
+	    if (txt_y > base_y) {
+		MovePrompt(txtwin, actual, --txt_y, txt_x);
+	    } else {
+		beep();
+	    }
+	    break;
+	case KEY_LEFT:
+	case 'h':
+	    if (txt_x > 0) {
+		MovePrompt(txtwin, actual, txt_y, --txt_x);
+	    } else {
+		beep();
+	    }
+	    break;
+	case KEY_RIGHT:
+	case 'l':
+	    if (txt_x < getmaxx(txtwin) - 1) {
+		MovePrompt(txtwin, actual, txt_y, ++txt_x);
+	    } else {
+		beep();
+	    }
+	    break;
+
+	case 'w':
+	    recursive_test(level + 1, argv, strwin);
+	    if (txtbox != 0) {
+		touchwin(txtbox);
+		wnoutrefresh(txtbox);
+	    } else {
+		touchwin(txtwin);
+		wnoutrefresh(txtwin);
+	    }
+	    break;
+
+	case '-':
+	    if (limit > 0) {
+		actual = ShowFlavor(strwin, txtwin, flavor, --limit);
+		MovePrompt(txtwin, actual, txt_y, txt_x);
+	    } else {
+		beep();
+	    }
+	    break;
+
+	case '+':
+	    actual = ShowFlavor(strwin, txtwin, flavor, ++limit);
+	    MovePrompt(txtwin, actual, txt_y, txt_x);
+	    break;
+
+	case '<':
+	    if (flavor > 0) {
+		actual = ShowFlavor(strwin, txtwin, --flavor, limit);
+		MovePrompt(txtwin, actual, txt_y, txt_x);
+	    } else {
+		beep();
+	    }
+	    break;
+
+	case '>':
+	    if (flavor + 1 < eMaxFlavor) {
+		actual = ShowFlavor(strwin, txtwin, ++flavor, limit);
+		MovePrompt(txtwin, actual, txt_y, txt_x);
+	    } else {
+		beep();
+	    }
+	    break;
+
+	case ':':
+	    actual = ShowFlavor(strwin, txtwin, flavor, limit);
+	    *buffer = '\0';
+	    rc = ERR;
+	    echo();
+	    (void) wattrset(txtwin, A_REVERSE);
+	    switch (flavor) {
+	    case eGetStr:
+		if (txtwin != stdscr) {
+		    wmove(txtwin, txt_y, txt_x);
+		    rc = wget_wstr(txtwin, buffer);
+		} else {
+		    move(txt_y, txt_x);
+		    rc = get_wstr(buffer);
+		}
+		break;
+	    case eGetNStr:
+		if (txtwin != stdscr) {
+		    wmove(txtwin, txt_y, txt_x);
+		    rc = wgetn_wstr(txtwin, buffer, limit);
+		} else {
+		    move(txt_y, txt_x);
+		    rc = getn_wstr(buffer, limit);
+		}
+		break;
+	    case eMvGetStr:
+		if (txtwin != stdscr) {
+		    rc = mvwget_wstr(txtwin, txt_y, txt_x, buffer);
+		} else {
+		    rc = mvget_wstr(txt_y, txt_x, buffer);
+		}
+		break;
+	    case eMvGetNStr:
+		if (txtwin != stdscr) {
+		    rc = mvwgetn_wstr(txtwin, txt_y, txt_x, buffer, limit);
+		} else {
+		    rc = mvgetn_wstr(txt_y, txt_x, buffer, limit);
+		}
+		break;
+	    case eMaxFlavor:
+		break;
+	    }
+	    noecho();
+	    (void) wattrset(txtwin, A_NORMAL);
+	    wprintw(strwin, "%s:", (rc == OK) ? "OK" : "ERR");
+	    (void) waddwstr(strwin, (wchar_t *) buffer);
+	    wnoutrefresh(strwin);
+	    break;
+	case HELP_KEY_1:
+	    popup_msg(stdscr, help);
+	    break;
+	default:
+	    beep();
+	    break;
+	}
+	doupdate();
+    }
+    if (level > 1) {
+	delwin(txtwin);
+	delwin(txtbox);
+    }
+    return TRUE;
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: test_get_wstr [options] [file1 [...]]"
+	,""
+	,USAGE_COMMON
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    WINDOW *chrbox;
+    WINDOW *strwin;
+    int ch;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) {
+	switch (ch) {
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+
+    setlocale(LC_ALL, "");
+
+    if (optind + 1 > argc)
+	usage(FALSE);
+
+    initscr();
+
+    chrbox = derwin(stdscr, BASE_Y, COLS, 0, 0);
+    box(chrbox, 0, 0);
+    wnoutrefresh(chrbox);
+
+    strwin = derwin(chrbox, 4, COLS - 2, 1, 1);
+
+    recursive_test(optind, argv, strwin);
+
+    endwin();
+    ExitProgram(EXIT_SUCCESS);
+}
+#else
+int
+main(void)
+{
+    printf("This program requires the wide-ncurses library\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif
+#else
+int
+main(void)
+{
+    printf("This program requires the curses chgat function\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif
diff --git a/test/test_getstr.c b/test/test_getstr.c
new file mode 100644
index 0000000..dbc0a0a
--- /dev/null
+++ b/test/test_getstr.c
@@ -0,0 +1,429 @@
+/****************************************************************************
+ * Copyright 2020,2022 Thomas E. Dickey                                     *
+ * Copyright 2007-2012,2017 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: test_getstr.c,v 1.16 2022/12/10 23:58:37 tom Exp $
+ *
+ * Author: Thomas E Dickey
+ *
+ * Demonstrate the getstr functions from the curses library.
+
+       int getstr(char *str);
+       int getnstr(char *str, int n);
+       int wgetstr(WINDOW *win, char *str);
+       int wgetnstr(WINDOW *win, char *str, int n);
+       int mvgetstr(int y, int x, char *str);
+       int mvwgetstr(WINDOW *win, int y, int x, char *str);
+       int mvgetnstr(int y, int x, char *str, int n);
+       int mvwgetnstr(WINDOW *, int y, int x, char *str, int n);
+ */
+
+#include <test.priv.h>
+#include <popup_msg.h>
+
+#if HAVE_CHGAT
+/* Solaris SVr4 curses lacks wchgat, mvgetnstr, mvwgetnstr */
+
+#define BASE_Y 6
+#define MAX_COLS 1024
+
+typedef enum {
+    eGetStr = 0,
+    eGetNStr,
+    eMvGetStr,
+    eMvGetNStr,
+    eMaxFlavor
+} Flavors;
+
+/*
+ * Return-code is OK/ERR or a keyname.
+ */
+static const char *
+ok_keyname(int code)
+{
+    return ((code == OK) ? "OK" : ((code == ERR) ? "ERR" : keyname(code)));
+}
+
+static bool
+Quit(int ch)
+{
+    return (ch == ERR || ch == 'q' || ch == QUIT || ch == ESCAPE);
+}
+
+static int
+Remainder(WINDOW *txtwin)
+{
+    int result = getmaxx(txtwin) - getcurx(txtwin);
+    return (result > 0) ? result : 0;
+}
+
+/*
+ * Show a highlighted line in the place where input will happen.
+ */
+static void
+ShowPrompt(WINDOW *txtwin, int limit)
+{
+    wchgat(txtwin, limit, WA_REVERSE, 0, NULL);
+    wnoutrefresh(txtwin);
+}
+
+static void
+MovePrompt(WINDOW *txtwin, int limit, int y, int x)
+{
+    wchgat(txtwin, Remainder(txtwin), WA_NORMAL, 0, NULL);
+    wmove(txtwin, y, x);
+    ShowPrompt(txtwin, limit);
+}
+
+static int
+ShowFlavor(WINDOW *strwin, WINDOW *txtwin, int flavor, int limit)
+{
+    const char *name = "?";
+    bool limited = FALSE;
+    bool wins = (txtwin != stdscr);
+    int result;
+
+    switch (flavor) {
+    case eGetStr:
+	name = wins ? "wgetstr" : "getstr";
+	break;
+    case eGetNStr:
+	limited = TRUE;
+	name = wins ? "wgetnstr" : "getnstr";
+	break;
+    case eMvGetStr:
+	name = wins ? "mvwgetstr" : "mvgetstr";
+	break;
+    case eMvGetNStr:
+	limited = TRUE;
+	name = wins ? "mvwgetnstr" : "mvgetnstr";
+	break;
+    case eMaxFlavor:
+	break;
+    }
+
+    wmove(strwin, 0, 0);
+    werase(strwin);
+
+    if (limited) {
+	wprintw(strwin, "%s(%d):", name, limit);
+    } else {
+	wprintw(strwin, "%s:", name);
+    }
+    result = limited ? limit : Remainder(txtwin);
+    ShowPrompt(txtwin, result);
+
+    wnoutrefresh(strwin);
+    return result;
+}
+
+static int
+recursive_test(int level, char **argv, WINDOW *strwin)
+{
+    static const char *help[] =
+    {
+	"Commands:",
+	"  q,^Q,ESC       - quit this program",
+	"  ^Q,ESC         - quit help-screen",
+	"",
+	"  p,<Up>         - move beginning of prompt one up row",
+	"  j,<Down>       - move beginning of prompt one down row",
+	"  h,<Left>       - move beginning of prompt one left column",
+	"  l,<Right>      - move beginning of prompt one right column",
+	"",
+	"  -              - reduce getnstr buffer-size one column",
+	"  +              - increase getnstr buffer-size one column",
+	"  :              - prompt for input-text",
+	"",
+	"  <              - scroll \"left\" through getstr-functions",
+	"  >              - scroll \"right\" through getstr-functions",
+	"",
+	"  w              - recur to subwindow",
+	"  ?,<F1>         - show help-screen",
+	0
+    };
+    WINDOW *txtbox = 0;
+    WINDOW *txtwin = 0;
+    FILE *fp;
+    int ch;
+    int rc;
+    int txt_x = 0, txt_y = 0;
+    int base_y;
+    int flavor = 0;
+    int limit = getmaxx(strwin) - 5;
+    int actual;
+
+    char buffer[MAX_COLS];
+
+    if (argv[level] == 0) {
+	beep();
+	return FALSE;
+    }
+
+    if (level > 1) {
+	txtbox = newwin(LINES - BASE_Y, COLS - level, BASE_Y, level);
+	box(txtbox, 0, 0);
+	wnoutrefresh(txtbox);
+
+	txtwin = derwin(txtbox,
+			getmaxy(txtbox) - 2,
+			getmaxx(txtbox) - 2,
+			1, 1);
+	base_y = 0;
+    } else {
+	txtwin = stdscr;
+	base_y = BASE_Y;
+    }
+
+    keypad(txtwin, TRUE);	/* enable keyboard mapping */
+    (void) cbreak();		/* take input chars one at a time, no wait for \n */
+    (void) noecho();		/* don't echo input */
+
+    txt_y = base_y;
+    txt_x = 0;
+    wmove(txtwin, txt_y, txt_x);
+
+    if ((fp = fopen(argv[level], "r")) != 0) {
+	while ((ch = fgetc(fp)) != EOF) {
+	    if (waddch(txtwin, UChar(ch)) != OK) {
+		break;
+	    }
+	}
+	fclose(fp);
+    } else {
+	wprintw(txtwin, "Cannot open:\n%s", argv[1]);
+    }
+
+    wmove(txtwin, txt_y, txt_x);
+    actual = ShowFlavor(strwin, txtwin, flavor, limit);
+    while (!Quit(ch = mvwgetch(txtwin, txt_y, txt_x))) {
+	switch (ch) {
+	case KEY_DOWN:
+	case 'j':
+	    if (txt_y < getmaxy(txtwin) - 1) {
+		MovePrompt(txtwin, actual, ++txt_y, txt_x);
+	    } else {
+		beep();
+	    }
+	    break;
+	case KEY_UP:
+	case 'k':
+	    if (txt_y > base_y) {
+		MovePrompt(txtwin, actual, --txt_y, txt_x);
+	    } else {
+		beep();
+	    }
+	    break;
+	case KEY_LEFT:
+	case 'h':
+	    if (txt_x > 0) {
+		MovePrompt(txtwin, actual, txt_y, --txt_x);
+	    } else {
+		beep();
+	    }
+	    break;
+	case KEY_RIGHT:
+	case 'l':
+	    if (txt_x < getmaxx(txtwin) - 1) {
+		MovePrompt(txtwin, actual, txt_y, ++txt_x);
+	    } else {
+		beep();
+	    }
+	    break;
+
+	case 'w':
+	    recursive_test(level + 1, argv, strwin);
+	    if (txtbox != 0) {
+		touchwin(txtbox);
+		wnoutrefresh(txtbox);
+	    } else {
+		touchwin(txtwin);
+		wnoutrefresh(txtwin);
+	    }
+	    break;
+
+	case '-':
+	    if (limit > 0) {
+		actual = ShowFlavor(strwin, txtwin, flavor, --limit);
+		MovePrompt(txtwin, actual, txt_y, txt_x);
+	    } else {
+		beep();
+	    }
+	    break;
+
+	case '+':
+	    actual = ShowFlavor(strwin, txtwin, flavor, ++limit);
+	    MovePrompt(txtwin, actual, txt_y, txt_x);
+	    break;
+
+	case '<':
+	    if (flavor > 0) {
+		actual = ShowFlavor(strwin, txtwin, --flavor, limit);
+		MovePrompt(txtwin, actual, txt_y, txt_x);
+	    } else {
+		beep();
+	    }
+	    break;
+
+	case '>':
+	    if (flavor + 1 < eMaxFlavor) {
+		actual = ShowFlavor(strwin, txtwin, ++flavor, limit);
+		MovePrompt(txtwin, actual, txt_y, txt_x);
+	    } else {
+		beep();
+	    }
+	    break;
+
+	case ':':
+	    actual = ShowFlavor(strwin, txtwin, flavor, limit);
+	    *buffer = '\0';
+	    rc = ERR;
+	    echo();
+	    (void) wattrset(txtwin, A_REVERSE);
+	    switch (flavor) {
+	    case eGetStr:
+		if (txtwin != stdscr) {
+		    wmove(txtwin, txt_y, txt_x);
+		    rc = wgetstr(txtwin, buffer);
+		} else {
+		    move(txt_y, txt_x);
+		    rc = getstr(buffer);
+		}
+		break;
+	    case eGetNStr:
+		if (txtwin != stdscr) {
+		    wmove(txtwin, txt_y, txt_x);
+		    rc = wgetnstr(txtwin, buffer, limit);
+		} else {
+		    move(txt_y, txt_x);
+		    rc = getnstr(buffer, limit);
+		}
+		break;
+	    case eMvGetStr:
+		if (txtwin != stdscr) {
+		    rc = mvwgetstr(txtwin, txt_y, txt_x, buffer);
+		} else {
+		    rc = mvgetstr(txt_y, txt_x, buffer);
+		}
+		break;
+	    case eMvGetNStr:
+		if (txtwin != stdscr) {
+		    rc = mvwgetnstr(txtwin, txt_y, txt_x, buffer, limit);
+		} else {
+		    rc = mvgetnstr(txt_y, txt_x, buffer, limit);
+		}
+		break;
+	    case eMaxFlavor:
+		break;
+	    }
+	    noecho();
+	    (void) wattrset(txtwin, A_NORMAL);
+	    wprintw(strwin, "%s:%s", ok_keyname(rc), buffer);
+	    wnoutrefresh(strwin);
+	    break;
+	case HELP_KEY_1:
+	    popup_msg(stdscr, help);
+	    break;
+	default:
+	    beep();
+	    break;
+	}
+	doupdate();
+    }
+    if (level > 1) {
+	delwin(txtwin);
+	delwin(txtbox);
+    }
+    return TRUE;
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: test_getstr [options] [file1 [...]]"
+	,""
+	,USAGE_COMMON
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    WINDOW *chrbox;
+    WINDOW *strwin;
+    int ch;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) {
+	switch (ch) {
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+
+    setlocale(LC_ALL, "");
+
+    if (optind + 1 > argc)
+	usage(FALSE);
+
+    initscr();
+
+    chrbox = derwin(stdscr, BASE_Y, COLS, 0, 0);
+    box(chrbox, 0, 0);
+    wnoutrefresh(chrbox);
+
+    strwin = derwin(chrbox, 4, COLS - 2, 1, 1);
+
+    recursive_test(optind, argv, strwin);
+
+    endwin();
+    ExitProgram(EXIT_SUCCESS);
+}
+
+#else
+int
+main(void)
+{
+    printf("This program requires the curses chgat function\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif
diff --git a/test/test_instr.c b/test/test_instr.c
new file mode 100644
index 0000000..c87bdd7
--- /dev/null
+++ b/test/test_instr.c
@@ -0,0 +1,292 @@
+/****************************************************************************
+ * Copyright 2020,2022 Thomas E. Dickey                                     *
+ * Copyright 2007-2010,2017 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: test_instr.c,v 1.12 2022/12/10 23:58:01 tom Exp $
+ *
+ * Author: Thomas E Dickey
+ *
+ * Demonstrate the instr functions from the curses library.
+
+       int instr(char *str);
+       int innstr(char *str, int n);
+       int winstr(WINDOW *win, char *str);
+       int winnstr(WINDOW *win, char *str, int n);
+       int mvinstr(int y, int x, char *str);
+       int mvinnstr(int y, int x, char *str, int n);
+       int mvwinstr(WINDOW *win, int y, int x, char *str);
+       int mvwinnstr(WINDOW *win, int y, int x, char *str, int n);
+ */
+
+#include <test.priv.h>
+
+#define BASE_Y 6
+#define MAX_COLS 1024
+
+static bool
+Quit(int ch)
+{
+    return (ch == ERR || ch == 'q' || ch == QUIT || ch == ESCAPE);
+}
+
+static void
+show_1st(WINDOW *win, int line, char *buffer)
+{
+    MvWAddStr(win, line, 5, buffer);
+}
+
+static void
+showmore(WINDOW *win, int line, char *buffer)
+{
+    wmove(win, line, 0);
+    wclrtoeol(win);
+    show_1st(win, line, buffer);
+}
+
+static int
+recursive_test(int level, char **argv, WINDOW *chrwin, WINDOW *strwin)
+{
+    WINDOW *txtbox = 0;
+    WINDOW *txtwin = 0;
+    FILE *fp;
+    int ch;
+    int txt_x = 0, txt_y = 0;
+    int base_y;
+    int limit = getmaxx(strwin) - 5;
+
+    char buffer[MAX_COLS];
+
+    if (argv[level] == 0) {
+	beep();
+	return FALSE;
+    }
+
+    *buffer = '\0';
+    if (level > 1) {
+	txtbox = newwin(LINES - BASE_Y, COLS - level, BASE_Y, level);
+	box(txtbox, 0, 0);
+	wnoutrefresh(txtbox);
+
+	txtwin = derwin(txtbox,
+			getmaxy(txtbox) - 2,
+			getmaxx(txtbox) - 2,
+			1, 1);
+	base_y = 0;
+    } else {
+	txtwin = stdscr;
+	base_y = BASE_Y;
+    }
+
+    keypad(txtwin, TRUE);	/* enable keyboard mapping */
+    (void) cbreak();		/* take input chars one at a time, no wait for \n */
+    (void) noecho();		/* don't echo input */
+
+    txt_y = base_y;
+    txt_x = 0;
+    wmove(txtwin, txt_y, txt_x);
+
+    if ((fp = fopen(argv[level], "r")) != 0) {
+	while ((ch = fgetc(fp)) != EOF) {
+	    if (waddch(txtwin, UChar(ch)) != OK) {
+		break;
+	    }
+	}
+	fclose(fp);
+    } else {
+	wprintw(txtwin, "Cannot open:\n%s", argv[1]);
+    }
+
+    while (!Quit(ch = mvwgetch(txtwin, txt_y, txt_x))) {
+	switch (ch) {
+	case KEY_DOWN:
+	case 'j':
+	    if (txt_y < getmaxy(txtwin) - 1)
+		txt_y++;
+	    else
+		beep();
+	    break;
+	case KEY_UP:
+	case 'k':
+	    if (txt_y > base_y)
+		txt_y--;
+	    else
+		beep();
+	    break;
+	case KEY_LEFT:
+	case 'h':
+	    if (txt_x > 0)
+		txt_x--;
+	    else
+		beep();
+	    break;
+	case KEY_RIGHT:
+	case 'l':
+	    if (txt_x < getmaxx(txtwin) - 1)
+		txt_x++;
+	    else
+		beep();
+	    break;
+	case 'w':
+	    recursive_test(level + 1, argv, chrwin, strwin);
+	    if (txtbox != 0) {
+		touchwin(txtbox);
+		wnoutrefresh(txtbox);
+	    } else {
+		touchwin(txtwin);
+		wnoutrefresh(txtwin);
+	    }
+	    break;
+	case '-':
+	    if (limit > 0) {
+		--limit;
+	    } else {
+		beep();
+	    }
+	    break;
+	case '+':
+	    ++limit;
+	    break;
+	default:
+	    beep();
+	    break;
+	}
+
+	MvWPrintw(chrwin, 0, 0, "line:");
+	wclrtoeol(chrwin);
+
+	if (txtwin != stdscr) {
+	    wmove(txtwin, txt_y, txt_x);
+
+	    if (winstr(txtwin, buffer) != ERR) {
+		show_1st(chrwin, 0, buffer);
+	    }
+	    if (mvwinstr(txtwin, txt_y, txt_x, buffer) != ERR) {
+		showmore(chrwin, 1, buffer);
+	    }
+	} else {
+	    move(txt_y, txt_x);
+
+	    if (instr(buffer) != ERR) {
+		show_1st(chrwin, 0, buffer);
+	    }
+	    if (mvinstr(txt_y, txt_x, buffer) != ERR) {
+		showmore(chrwin, 1, buffer);
+	    }
+	}
+	wnoutrefresh(chrwin);
+
+	MvWPrintw(strwin, 0, 0, "%4d:", limit);
+	wclrtobot(strwin);
+
+	if (txtwin != stdscr) {
+	    wmove(txtwin, txt_y, txt_x);
+	    if (winnstr(txtwin, buffer, limit) != ERR) {
+		show_1st(strwin, 0, buffer);
+	    }
+
+	    if (mvwinnstr(txtwin, txt_y, txt_x, buffer, limit) != ERR) {
+		showmore(strwin, 1, buffer);
+	    }
+	} else {
+	    move(txt_y, txt_x);
+	    if (innstr(buffer, limit) != ERR) {
+		show_1st(strwin, 0, buffer);
+	    }
+
+	    if (mvinnstr(txt_y, txt_x, buffer, limit) != ERR) {
+		showmore(strwin, 1, buffer);
+	    }
+	}
+
+	wnoutrefresh(strwin);
+    }
+    if (level > 1) {
+	delwin(txtwin);
+	delwin(txtbox);
+    }
+    return TRUE;
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: test_instr [options] [file1 [...]]"
+	,""
+	,USAGE_COMMON
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    WINDOW *chrbox;
+    WINDOW *chrwin;
+    WINDOW *strwin;
+    int ch;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) {
+	switch (ch) {
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+
+    setlocale(LC_ALL, "");
+
+    if (optind + 1 > argc)
+	usage(FALSE);
+
+    initscr();
+
+    chrbox = derwin(stdscr, BASE_Y, COLS, 0, 0);
+    box(chrbox, 0, 0);
+    wnoutrefresh(chrbox);
+
+    chrwin = derwin(chrbox, 2, COLS - 2, 1, 1);
+    strwin = derwin(chrbox, 2, COLS - 2, 3, 1);
+
+    recursive_test(optind, argv, chrwin, strwin);
+
+    endwin();
+    ExitProgram(EXIT_SUCCESS);
+}
diff --git a/test/test_inwstr.c b/test/test_inwstr.c
new file mode 100644
index 0000000..c22add7
--- /dev/null
+++ b/test/test_inwstr.c
@@ -0,0 +1,300 @@
+/****************************************************************************
+ * Copyright 2020,2022 Thomas E. Dickey                                     *
+ * Copyright 2007-2010,2017 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: test_inwstr.c,v 1.8 2022/12/10 23:56:39 tom Exp $
+ *
+ * Author: Thomas E Dickey
+ *
+ * Demonstrate the inwstr functions from the curses library.
+
+       int inwstr(wchar_t *str);
+       int innwstr(wchar_t *str, int n);
+       int winwstr(WINDOW *win, wchar_t *str);
+       int winnwstr(WINDOW *win, wchar_t *str, int n);
+       int mvinwstr(int y, int x, wchar_t *str);
+       int mvinnwstr(int y, int x, wchar_t *str, int n);
+       int mvwinwstr(WINDOW *win, int y, int x, wchar_t *str);
+       int mvwinnwstr(WINDOW *win, int y, int x, wchar_t *str, int n);
+ */
+
+#include <test.priv.h>
+
+#if USE_WIDEC_SUPPORT
+
+#define BASE_Y 6
+#define MAX_COLS 1024
+
+static bool
+Quit(int ch)
+{
+    return (ch == ERR || ch == 'q' || ch == QUIT || ch == ESCAPE);
+}
+
+static void
+show_1st(WINDOW *win, int line, wchar_t *buffer)
+{
+    (void) mvwaddwstr(win, line, 5, buffer);
+}
+
+static void
+showmore(WINDOW *win, int line, wchar_t *buffer)
+{
+    wmove(win, line, 0);
+    wclrtoeol(win);
+    show_1st(win, line, buffer);
+}
+
+static int
+recursive_test(int level, char **argv, WINDOW *chrwin, WINDOW *strwin)
+{
+    WINDOW *txtbox = 0;
+    WINDOW *txtwin = 0;
+    FILE *fp;
+    int ch;
+    int txt_x = 0, txt_y = 0;
+    int base_y;
+    int limit = getmaxx(strwin) - 5;
+    wchar_t buffer[MAX_COLS];
+
+    if (argv[level] == 0) {
+	beep();
+	return FALSE;
+    }
+
+    if (level > 1) {
+	txtbox = newwin(LINES - BASE_Y, COLS - level, BASE_Y, level);
+	box(txtbox, 0, 0);
+	wnoutrefresh(txtbox);
+
+	txtwin = derwin(txtbox,
+			getmaxy(txtbox) - 2,
+			getmaxx(txtbox) - 2,
+			1, 1);
+	base_y = 0;
+    } else {
+	txtwin = stdscr;
+	base_y = BASE_Y;
+    }
+
+    keypad(txtwin, TRUE);	/* enable keyboard mapping */
+    (void) cbreak();		/* take input chars one at a time, no wait for \n */
+    (void) noecho();		/* don't echo input */
+
+    txt_y = base_y;
+    txt_x = 0;
+    wmove(txtwin, txt_y, txt_x);
+
+    if ((fp = fopen(argv[level], "r")) != 0) {
+	while ((ch = fgetc(fp)) != EOF) {
+	    if (waddch(txtwin, UChar(ch)) != OK) {
+		break;
+	    }
+	}
+	fclose(fp);
+    } else {
+	wprintw(txtwin, "Cannot open:\n%s", argv[1]);
+    }
+
+    while (!Quit(ch = mvwgetch(txtwin, txt_y, txt_x))) {
+	switch (ch) {
+	case KEY_DOWN:
+	case 'j':
+	    if (txt_y < getmaxy(txtwin) - 1)
+		txt_y++;
+	    else
+		beep();
+	    break;
+	case KEY_UP:
+	case 'k':
+	    if (txt_y > base_y)
+		txt_y--;
+	    else
+		beep();
+	    break;
+	case KEY_LEFT:
+	case 'h':
+	    if (txt_x > 0)
+		txt_x--;
+	    else
+		beep();
+	    break;
+	case KEY_RIGHT:
+	case 'l':
+	    if (txt_x < getmaxx(txtwin) - 1)
+		txt_x++;
+	    else
+		beep();
+	    break;
+	case 'w':
+	    recursive_test(level + 1, argv, chrwin, strwin);
+	    if (txtbox != 0) {
+		touchwin(txtbox);
+		wnoutrefresh(txtbox);
+	    } else {
+		touchwin(txtwin);
+		wnoutrefresh(txtwin);
+	    }
+	    break;
+	case '-':
+	    if (limit > 0) {
+		--limit;
+	    } else {
+		beep();
+	    }
+	    break;
+	case '+':
+	    ++limit;
+	    break;
+	default:
+	    beep();
+	    break;
+	}
+
+	MvWPrintw(chrwin, 0, 0, "line:");
+	wclrtoeol(chrwin);
+
+	if (txtwin != stdscr) {
+	    wmove(txtwin, txt_y, txt_x);
+
+	    if (winwstr(txtwin, buffer) != ERR) {
+		show_1st(chrwin, 0, buffer);
+	    }
+	    if (mvwinwstr(txtwin, txt_y, txt_x, buffer) != ERR) {
+		showmore(chrwin, 1, buffer);
+	    }
+	} else {
+	    move(txt_y, txt_x);
+
+	    if (inwstr(buffer) != ERR) {
+		show_1st(chrwin, 0, buffer);
+	    }
+	    if (mvinwstr(txt_y, txt_x, buffer) != ERR) {
+		showmore(chrwin, 1, buffer);
+	    }
+	}
+	wnoutrefresh(chrwin);
+
+	MvWPrintw(strwin, 0, 0, "%4d:", limit);
+	wclrtobot(strwin);
+
+	if (txtwin != stdscr) {
+	    wmove(txtwin, txt_y, txt_x);
+	    if (winnwstr(txtwin, buffer, limit) != ERR) {
+		show_1st(strwin, 0, buffer);
+	    }
+
+	    if (mvwinnwstr(txtwin, txt_y, txt_x, buffer, limit) != ERR) {
+		showmore(strwin, 1, buffer);
+	    }
+	} else {
+	    move(txt_y, txt_x);
+	    if (innwstr(buffer, limit) != ERR) {
+		show_1st(strwin, 0, buffer);
+	    }
+
+	    if (mvinnwstr(txt_y, txt_x, buffer, limit) != ERR) {
+		showmore(strwin, 1, buffer);
+	    }
+	}
+
+	wnoutrefresh(strwin);
+    }
+    if (level > 1) {
+	delwin(txtwin);
+	delwin(txtbox);
+    }
+    return TRUE;
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: test_inwstr [options] [file1 [...]]"
+	,""
+	,USAGE_COMMON
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    WINDOW *chrbox;
+    WINDOW *chrwin;
+    WINDOW *strwin;
+    int ch;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) {
+	switch (ch) {
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+
+    setlocale(LC_ALL, "");
+
+    if (optind + 1 > argc)
+	usage(FALSE);
+
+    initscr();
+
+    chrbox = derwin(stdscr, BASE_Y, COLS, 0, 0);
+    box(chrbox, 0, 0);
+    wnoutrefresh(chrbox);
+
+    chrwin = derwin(chrbox, 2, COLS - 2, 1, 1);
+    strwin = derwin(chrbox, 2, COLS - 2, 3, 1);
+
+    recursive_test(optind, argv, chrwin, strwin);
+
+    endwin();
+    ExitProgram(EXIT_SUCCESS);
+}
+#else
+int
+main(void)
+{
+    printf("This program requires the wide-ncurses library\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif
diff --git a/test/test_mouse.c b/test/test_mouse.c
new file mode 100644
index 0000000..06c72e3
--- /dev/null
+++ b/test/test_mouse.c
@@ -0,0 +1,289 @@
+/****************************************************************************
+ * Copyright 2022 Leonid S. Usov <leonid.s.usov at gmail.com>               *
+ * Copyright 2022 Thomas E. Dickey                                          *
+ *                                                                          *
+ * 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.                               *
+ ****************************************************************************/
+/*
+ * $Id: test_mouse.c,v 1.26 2022/12/04 00:40:11 tom Exp $
+ *
+ * Author: Leonid S Usov
+ *
+ * Observe mouse events in the raw terminal or parsed ncurses modes
+ */
+
+#include <test.priv.h>
+
+#if defined(NCURSES_MOUSE_VERSION) && !defined(_NC_WINDOWS)
+
+static int logoffset = 0;
+
+static int
+raw_loop(void)
+{
+    struct termios tty;
+    struct termios old;
+    char *xtermcap;
+
+    tcgetattr(0, &old);
+#if HAVE_CFMAKERAW
+    cfmakeraw(&tty);
+#else
+    tty = old;
+    tty.c_iflag &= (unsigned) (~(IGNBRK | BRKINT | PARMRK | ISTRIP
+				 | INLCR | IGNCR | ICRNL | IXON));
+    tty.c_oflag &= (unsigned) (~OPOST);
+    tty.c_lflag &= (unsigned) (~(ECHO | ECHONL | ICANON | ISIG | IEXTEN));
+    tty.c_cflag &= (unsigned) (~(CSIZE | PARENB));
+    tty.c_cflag |= CS8;
+    tcsetattr(0, TCSANOW, &tty);
+#endif
+
+    setupterm(NULL, 0, 0);
+    xtermcap = tigetstr("XM");
+    if (!VALID_STRING(xtermcap)) {
+	fprintf(stderr, "couldn't get XM terminfo");
+	return 1;
+    }
+
+    putp(tparm(xtermcap, 1));
+    fflush(stdout);
+
+    tcsetattr(0, TCSANOW, &tty);
+
+    while (1) {
+	int c = getc(stdin);
+	const char *pretty;
+
+	if (c == -1 || c == '\003') {
+	    break;
+	} else if (c == '\033') {
+	    printf("\r\n\\E");
+	} else if ((pretty = unctrl((chtype) c)) != NULL) {
+	    printf("%s", pretty);
+	} else if (isprint(c)) {
+	    printf("%c", c);
+	} else {
+	    printf("{%x}", UChar(c));
+	}
+    }
+
+    putp(tparm(xtermcap, 0));
+    fflush(stdout);
+    tcsetattr(0, TCSANOW, &old);
+    return 0;
+}
+
+static void logw(const char *fmt, ...) GCC_PRINTFLIKE(1, 2);
+
+static void
+logw(const char *fmt, ...)
+{
+    int row = getcury(stdscr);
+    va_list args;
+
+    va_start(args, fmt);
+    wmove(stdscr, row++, 0);
+    vw_printw(stdscr, fmt, args);
+    va_end(args);
+
+    clrtoeol();
+
+    row %= (getmaxy(stdscr) - logoffset);
+    if (row < logoffset) {
+	row = logoffset;
+    }
+
+    wmove(stdscr, row, 0);
+    wprintw(stdscr, ">");
+    clrtoeol();
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: test_mouse [options]"
+	,""
+	,"Test mouse events.  These examples for $TERM demonstrate xterm"
+	,"features:"
+	,"    xterm"
+	,"    xterm-1002"
+	,"    xterm-1003"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+	," -r       show raw input stream, injecting a new line before every ESC"
+	," -i n     set mouse interval to n; default is 0 (no double-clicks)"
+	," -T term  use terminal description other than $TERM"
+    };
+    unsigned n;
+    for (n = 0; n < sizeof(msg) / sizeof(char *); ++n) {
+	fprintf(stderr, "%s\n", msg[n]);
+    }
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    bool rawmode = FALSE;
+    int interval = 0;
+    int ch;
+    MEVENT event;
+    char *my_environ = NULL;
+    const char *term_format = "TERM=%s";
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "i:rT:")) != -1) {
+	switch (ch) {
+	case 'i':
+	    interval = atoi(optarg);
+	    break;
+	case 'r':
+	    rawmode = TRUE;
+	    break;
+	case 'T':
+	    my_environ = malloc(strlen(term_format) + strlen(optarg));
+	    sprintf(my_environ, term_format, optarg);
+	    putenv(my_environ);
+	    break;
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind < argc) {
+	usage(FALSE);
+	ExitProgram(EXIT_FAILURE);
+    }
+
+    if (rawmode) {
+	printf("Entering raw mode. Ctrl-c to quit.\n");
+	return raw_loop();
+    }
+
+    initscr();
+    noecho();
+    cbreak();			/* Line buffering disabled; pass everything */
+    nonl();
+    keypad(stdscr, TRUE);
+
+    /* Get all the mouse events */
+    mousemask(ALL_MOUSE_EVENTS | REPORT_MOUSE_POSITION, NULL);
+    mouseinterval(interval);
+
+    logw("Ctrl-c to quit");
+    logw("--------------");
+    if (my_environ)
+	logw("%s", my_environ);
+    logoffset = getcury(stdscr);
+
+    while (1) {
+	int c = getch();
+
+	switch (c) {
+	case KEY_MOUSE:
+	    if (getmouse(&event) == OK) {
+		unsigned btn;
+		mmask_t events;
+#if NCURSES_MOUSE_VERSION > 1
+		const unsigned max_btn = 5;
+#else
+		const unsigned max_btn = 4;
+#endif
+		const mmask_t btn_mask = (NCURSES_BUTTON_RELEASED |
+					  NCURSES_BUTTON_PRESSED |
+					  NCURSES_BUTTON_CLICKED |
+					  NCURSES_DOUBLE_CLICKED |
+					  NCURSES_TRIPLE_CLICKED);
+		bool found = FALSE;
+		for (btn = 1; btn <= max_btn; btn++) {
+		    events = (mmask_t) (event.bstate
+					& NCURSES_MOUSE_MASK(btn, btn_mask));
+		    if (events == 0)
+			continue;
+#define ShowQ(btn,name) \
+	(((event.bstate & NCURSES_MOUSE_MASK(btn, NCURSES_ ## name)) != 0) \
+	 ? (" " #name) \
+	 : "")
+#define ShowM(name) \
+	(((event.bstate & NCURSES_MOUSE_MASK(btn, BUTTON_ ## name)) != 0) \
+	 ? (" " #name) \
+	 : "")
+#define ShowP() \
+	 ((event.bstate & REPORT_MOUSE_POSITION) != 0 \
+	  ? " position" \
+	  : "")
+		    logw("[%08lX] button %d%s%s%s%s%s%s%s%s%s @ %d, %d",
+			 (unsigned long) events,
+			 btn,
+			 ShowQ(btn, BUTTON_RELEASED),
+			 ShowQ(btn, BUTTON_PRESSED),
+			 ShowQ(btn, BUTTON_CLICKED),
+			 ShowQ(btn, DOUBLE_CLICKED),
+			 ShowQ(btn, TRIPLE_CLICKED),
+			 ShowM(SHIFT),
+			 ShowM(CTRL),
+			 ShowM(ALT),
+			 ShowP(),
+			 event.y, event.x);
+		    found = TRUE;
+		}
+		/*
+		 * A position report need not have a button associated with it.
+		 * The modifiers probably are unused.
+		 */
+		if (!found && (event.bstate & REPORT_MOUSE_POSITION)) {
+		    logw("[%08lX]%s%s%s%s @ %d, %d",
+			 (unsigned long) events,
+			 ShowM(SHIFT),
+			 ShowM(CTRL),
+			 ShowM(ALT),
+			 ShowP(),
+			 event.y, event.x);
+		}
+	    }
+	    break;
+	case '\003':
+	    goto end;
+	default:
+	    logw("got another char: 0x%x", UChar(c));
+	}
+	refresh();
+    }
+  end:
+    endwin();
+    ExitProgram(EXIT_SUCCESS);
+}
+#else
+int
+main(void)
+{
+    printf("This program requires the ncurses library\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif
diff --git a/test/test_opaque.c b/test/test_opaque.c
new file mode 100644
index 0000000..09b98c0
--- /dev/null
+++ b/test/test_opaque.c
@@ -0,0 +1,524 @@
+/****************************************************************************
+ * Copyright 2020-2021,2022 Thomas E. Dickey                                *
+ * Copyright 2007-2008,2009 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: test_opaque.c,v 1.15 2022/12/11 00:03:10 tom Exp $
+ *
+ * Author: Thomas E Dickey
+ *
+ * Demonstrate the opaque functions from the curses library.
+
+       WINDOW * wgetparent (const WINDOW *);
+       bool is_cleared(const WINDOW *win);
+       bool is_idcok(const WINDOW *win);
+       bool is_idlok(const WINDOW *win);
+       bool is_immedok(const WINDOW *win);
+       bool is_keypad(const WINDOW *win);
+       bool is_leaveok(const WINDOW *win);
+       bool is_nodelay(const WINDOW *win);
+       bool is_notimeout(const WINDOW *win);
+       bool is_scrollok(const WINDOW *win);
+       bool is_syncok(const WINDOW *win);
+       int wgetscrreg (const WINDOW *, int *, int *);
+       bool is_pad(const WINDOW *win);
+       bool is_subwin(const WINDOW *win);
+       int wgetdelay(const WINDOW *win);
+ */
+
+#include <test.priv.h>
+
+#define BASE_Y 6
+#define MAX_COLS 1024
+
+#if defined(NCURSES_VERSION_PATCH) && (NCURSES_VERSION_PATCH >= 20090906) && NCURSES_EXT_FUNCS && NCURSES_OPAQUE
+
+static bool
+Quit(int ch)
+{
+    return (ch == 'q' || ch == QUIT || ch == ESCAPE);
+}
+
+typedef bool(*BoolOpaque) (WINDOW *, int);
+
+static bool
+test_opaque_cleared(WINDOW *win, int mode)
+{
+    if (mode >= 0) {
+	if (mode)
+	    wclear(win);
+    }
+    return is_cleared(win);
+}
+
+static bool
+test_opaque_idcok(WINDOW *win, int mode)
+{
+    if (mode >= 0) {
+	idcok(win, mode);
+    }
+    return is_idcok(win);
+}
+
+static bool
+test_opaque_idlok(WINDOW *win, int mode)
+{
+    if (mode >= 0) {
+	idlok(win, mode);
+    }
+    return is_idlok(win);
+}
+
+static bool
+test_opaque_immedok(WINDOW *win, int mode)
+{
+    if (mode >= 0) {
+	immedok(win, mode);
+    }
+    return is_immedok(win);
+}
+
+static bool
+test_opaque_keypad(WINDOW *win, int mode)
+{
+    if (mode >= 0) {
+	keypad(win, mode);
+    }
+    return is_keypad(win);
+}
+
+static bool
+test_opaque_leaveok(WINDOW *win, int mode)
+{
+    if (mode >= 0) {
+	leaveok(win, mode);
+    }
+    return is_leaveok(win);
+}
+
+static bool
+test_opaque_nodelay(WINDOW *win, int mode)
+{
+    if (mode >= 0) {
+	nodelay(win, mode);
+    }
+    return is_nodelay(win);
+}
+
+static bool
+test_opaque_notimeout(WINDOW *win, int mode)
+{
+    if (mode >= 0) {
+	notimeout(win, mode);
+    }
+    return is_notimeout(win);
+}
+
+static bool
+test_opaque_scrollok(WINDOW *win, int mode)
+{
+    if (mode >= 0) {
+	scrollok(win, mode);
+    }
+    return is_scrollok(win);
+}
+
+static bool
+test_opaque_syncok(WINDOW *win, int mode)
+{
+    if (mode >= 0) {
+	syncok(win, mode);
+    }
+    return is_syncok(win);
+}
+
+static int
+status_y(WINDOW *stswin, int cell)
+{
+    return (cell % getmaxy(stswin));
+}
+
+static int
+status_x(WINDOW *stswin, int cell)
+{
+    return (15 * (cell / getmaxy(stswin)));
+}
+
+static void
+to_keyword(WINDOW *stswin, int cell)
+{
+    wmove(stswin, status_y(stswin, cell), status_x(stswin, cell));
+}
+
+static void
+to_result(WINDOW *stswin, int cell, bool before)
+{
+    int y = status_y(stswin, cell);
+    int x = status_x(stswin, cell) + 11;
+    if (!before)
+	++x;
+    wmove(stswin, y, x);
+}
+
+static void
+show_keyword(WINDOW *stswin, int cell, int active, const char *name)
+{
+    to_keyword(stswin, cell);
+    if (active == cell)
+	(void) wstandout(stswin);
+    wprintw(stswin, "%s:", name);
+    if (active == cell)
+	(void) wstandend(stswin);
+}
+/* *INDENT-OFF* */
+static struct {
+    const char *name;
+    BoolOpaque func;
+} bool_funcs[] = {
+    { "cleared",   test_opaque_cleared },
+    { "idcok",     test_opaque_idcok },
+    { "idlok",     test_opaque_idlok },
+    { "immedok",   test_opaque_immedok },
+    { "keypad",    test_opaque_keypad },
+    { "leaveok",   test_opaque_leaveok },
+    { "nodelay",   test_opaque_nodelay },
+    { "notimeout", test_opaque_notimeout },
+    { "scrollok",  test_opaque_scrollok },
+    { "syncok",    test_opaque_syncok }
+};
+/* *INDENT-ON* */
+
+#define bool2c(c) ((c) ? 'T' : 'F')
+
+/*
+ * Display and/or allow update for the properties accessed in the opaque
+ * window.  Some may change state after refreshing the window, so we
+ * distinguish between them using the 'before' parameter.
+ */
+static int
+show_opaque(WINDOW *stswin, WINDOW *txtwin, bool before, int active)
+{
+    int n;
+    int top, bottom;
+
+    if (before) {
+	werase(stswin);
+    }
+    for (n = 0; n < (int) SIZEOF(bool_funcs); ++n) {
+	show_keyword(stswin, n, active, bool_funcs[n].name);
+
+	to_result(stswin, n, before);
+	wprintw(stswin, "%c", bool2c(bool_funcs[n].func(txtwin, -1)));
+    }
+
+    show_keyword(stswin, n, active, "is_pad");
+    to_result(stswin, n, TRUE);
+    wprintw(stswin, "%c", bool2c(is_pad(txtwin)));
+
+    ++n;
+    show_keyword(stswin, n, active, "is_subwin");
+    to_result(stswin, n, TRUE);
+    wprintw(stswin, "%c", bool2c(is_subwin(txtwin)));
+
+    ++n;
+    show_keyword(stswin, n, active, "wgetparent");
+    to_result(stswin, n, TRUE);
+    wprintw(stswin, "%p", (void *) wgetparent(txtwin));
+
+    ++n;
+    show_keyword(stswin, n, active, "wgetdelay");
+    to_result(stswin, n, TRUE);
+    wprintw(stswin, "%d", wgetdelay(txtwin));
+
+    ++n;
+    show_keyword(stswin, n, active, "wgetscrreg");
+    to_result(stswin, n, TRUE);
+    if (wgetscrreg(txtwin, &top, &bottom) == OK)
+	wprintw(stswin, "%d,%d", top, bottom);
+    else
+	wprintw(stswin, "none");
+
+    wnoutrefresh(stswin);
+    return active;
+}
+
+static int
+test_opaque(int level, char **argv, WINDOW *stswin)
+{
+    WINDOW *txtbox = 0;
+    WINDOW *txtwin = 0;
+    FILE *fp;
+    int ch;
+    int txt_x = 0, txt_y = 0;
+    int base_y;
+    bool in_status = FALSE;
+    int active = 0;
+
+    if (argv[level] == 0) {
+	beep();
+	return FALSE;
+    }
+
+    if (level > 1) {
+	txtbox = newwin(LINES - BASE_Y, COLS - level, BASE_Y, level);
+	box(txtbox, 0, 0);
+	wnoutrefresh(txtbox);
+
+	txtwin = derwin(txtbox,
+			getmaxy(txtbox) - 2,
+			getmaxx(txtbox) - 2,
+			1, 1);
+	base_y = 0;
+    } else {
+	txtwin = stdscr;
+	base_y = BASE_Y;
+    }
+
+    keypad(txtwin, TRUE);	/* enable keyboard mapping */
+    (void) cbreak();		/* take input chars one at a time, no wait for \n */
+    (void) noecho();		/* don't echo input */
+
+    txt_y = base_y;
+    txt_x = 0;
+    wmove(txtwin, txt_y, txt_x);
+
+    if ((fp = fopen(argv[level], "r")) != 0) {
+	while ((ch = fgetc(fp)) != EOF) {
+	    if (waddch(txtwin, UChar(ch)) != OK) {
+		break;
+	    }
+	}
+	fclose(fp);
+    } else {
+	wprintw(txtwin, "Cannot open:\n%s", argv[1]);
+    }
+
+    for (;;) {
+	if (in_status) {
+	    to_keyword(stswin, active);
+
+	    ch = wgetch(stswin);
+	    show_opaque(stswin, txtwin, TRUE, active);
+	    if (Quit(ch))
+		break;
+
+	    switch (ch) {
+	    case '\t':
+		in_status = FALSE;
+		break;
+	    case KEY_DOWN:
+	    case 'j':
+		if (active < (int) SIZEOF(bool_funcs) - 1)
+		    active++;
+		else
+		    beep();
+		break;
+	    case KEY_UP:
+	    case 'k':
+		if (active > 0)
+		    active--;
+		else
+		    beep();
+		break;
+	    case ' ':
+		bool_funcs[active].func(txtwin,
+					!bool_funcs[active].func(txtwin, -1));
+		break;
+	    default:
+		beep();
+		break;
+	    }
+	    show_opaque(stswin, txtwin, FALSE, in_status ? active : -1);
+	} else {
+	    ch = mvwgetch(txtwin, txt_y, txt_x);
+	    show_opaque(stswin, txtwin, TRUE, -1);
+	    if (Quit(ch))
+		break;
+
+	    switch (ch) {
+	    case '\t':
+		in_status = TRUE;
+		break;
+	    case KEY_DOWN:
+	    case 'j':
+		if (txt_y < getmaxy(txtwin) - 1)
+		    txt_y++;
+		else
+		    beep();
+		break;
+	    case KEY_UP:
+	    case 'k':
+		if (txt_y > base_y)
+		    txt_y--;
+		else
+		    beep();
+		break;
+	    case KEY_LEFT:
+	    case 'h':
+		if (txt_x > 0)
+		    txt_x--;
+		else
+		    beep();
+		break;
+	    case KEY_RIGHT:
+	    case 'l':
+		if (txt_x < getmaxx(txtwin) - 1)
+		    txt_x++;
+		else
+		    beep();
+		break;
+	    case 'w':
+		test_opaque(level + 1, argv, stswin);
+		if (txtbox != 0) {
+		    touchwin(txtbox);
+		    wnoutrefresh(txtbox);
+		} else {
+		    touchwin(txtwin);
+		    wnoutrefresh(txtwin);
+		}
+		break;
+	    default:
+		beep();
+		napms(100);
+		break;
+	    }
+
+	    show_opaque(stswin, txtwin, FALSE, -1);
+	}
+    }
+    if (level > 1) {
+	delwin(txtwin);
+	delwin(txtbox);
+    }
+    return TRUE;
+}
+
+static void
+test_set_escdelay(void)
+{
+    set_escdelay((100 + ESCDELAY) / 2);
+}
+
+static void
+test_set_tabsize(void)
+{
+    int y0, x0;
+    int y, x;
+    int save_tabsize = TABSIZE;
+
+    (void) cbreak();		/* take input chars one at a time, no wait for \n */
+    (void) noecho();		/* don't echo input */
+
+    for (y = 0; y < LINES; ++y) {
+	set_tabsize(y + 1);
+	if (move(y, 0) == ERR)
+	    break;
+	for (x = 0; x < COLS;) {
+	    addch('\t');
+	    if (addch('*') == ERR) {
+		break;
+	    }
+	    getyx(stdscr, y0, x0);
+	    if (y0 != y || x0 == x) {
+		break;
+	    }
+	}
+    }
+    getch();
+    erase();
+
+    set_tabsize(save_tabsize);
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: test_opaque [options] file1 [file2 [...]]"
+	,""
+	,USAGE_COMMON
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    WINDOW *stsbox;
+    WINDOW *stswin;
+    int ch;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) {
+	switch (ch) {
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+
+    setlocale(LC_ALL, "");
+
+    if (optind + 1 > argc)
+	usage(FALSE);
+
+    initscr();
+
+    test_set_escdelay();
+    test_set_tabsize();
+
+    stsbox = derwin(stdscr, BASE_Y, COLS, 0, 0);
+    box(stsbox, 0, 0);
+    wnoutrefresh(stsbox);
+
+    stswin = derwin(stsbox, BASE_Y - 2, COLS - 2, 1, 1);
+    keypad(stswin, TRUE);
+
+    test_opaque(optind, argv, stswin);
+
+    endwin();
+    ExitProgram(EXIT_SUCCESS);
+}
+#else
+int
+main(void)
+{
+    printf("This program requires the ncurses library\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif
diff --git a/test/test_setupterm.c b/test/test_setupterm.c
new file mode 100644
index 0000000..4e53c2e
--- /dev/null
+++ b/test/test_setupterm.c
@@ -0,0 +1,266 @@
+/****************************************************************************
+ * Copyright 2020,2022 Thomas E. Dickey                                     *
+ * Copyright 2015,2016 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.                                                           *
+ ****************************************************************************/
+
+/*
+ * Author: Thomas E. Dickey
+ *
+ * $Id: test_setupterm.c,v 1.16 2022/12/10 23:23:27 tom Exp $
+ *
+ * A simple demo of setupterm/restartterm.
+ */
+#include <test.priv.h>
+
+#if HAVE_TIGETSTR
+
+static bool a_opt = FALSE;
+static bool f_opt = FALSE;
+static bool n_opt = FALSE;
+static bool r_opt = FALSE;
+
+#if NO_LEAKS
+static TERMINAL **saved_terminals;
+static size_t num_saved;
+static size_t max_saved;
+
+static void
+finish(int code)
+{
+    size_t n;
+    for (n = 0; n < num_saved; ++n)
+	del_curterm(saved_terminals[n]);
+    free(saved_terminals);
+    ExitProgram(code);
+}
+
+static void
+save_curterm(void)
+{
+    size_t n;
+    bool found = FALSE;
+    for (n = 0; n < num_saved; ++n) {
+	if (saved_terminals[n] == cur_term) {
+	    found = TRUE;
+	    break;
+	}
+    }
+    if (!found) {
+	if (num_saved + 1 >= max_saved) {
+	    max_saved += 100;
+	    saved_terminals = typeRealloc(TERMINAL *, max_saved, saved_terminals);
+	}
+	saved_terminals[num_saved++] = cur_term;
+    }
+}
+
+#else
+#define finish(code) ExitProgram(code)
+#define save_curterm()		/* nothing */
+#endif
+
+static void
+test_rc(NCURSES_CONST char *name, int actual_rc, int actual_err)
+{
+    int expect_rc = -1;
+    int expect_err = -1;
+
+    if (name == 0)
+	name = getenv("TERM");
+    if (name == 0)
+	name = "?";
+
+    switch (*name) {
+    case 'v':			/* vt100 is normal */
+    case 'd':			/* dumb has no special flags */
+	expect_rc = 0;
+	expect_err = 1;
+	break;
+    case 'l':			/* lpr is hardcopy */
+	expect_err = 1;
+	break;
+    case 'u':			/* unknown is generic */
+	expect_err = 0;
+	break;
+    default:
+	break;
+    }
+    if (n_opt) {
+	expect_rc = -1;
+	expect_err = -1;
+    }
+    printf("%s",
+	   ((actual_rc == expect_rc && actual_err == expect_err)
+	    ? "OK"
+	    : "ERR"));
+    printf(" '%s'", name);
+    if (actual_rc == expect_rc) {
+	printf(" rc=%d", actual_rc);
+    } else {
+	printf(" rc=%d (%d)", actual_rc, expect_rc);
+    }
+    if (actual_err == expect_err) {
+	printf(" err=%d", actual_err);
+    } else {
+	printf(" err=%d (%d)", actual_err, expect_err);
+    }
+    printf("\n");
+}
+
+static void
+test_setupterm(NCURSES_CONST char *name)
+{
+    int rc;
+    int err = -99;
+
+#if HAVE_RESTARTTERM
+    if (r_opt)
+	rc = restartterm(name, 0, f_opt ? NULL : &err);
+    else
+#endif
+	rc = setupterm(name, 0, f_opt ? NULL : &err);
+    test_rc(name, rc, err);
+    save_curterm();
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: test_setupterm [options] [terminal]"
+	,""
+	,USAGE_COMMON
+	,"Demonstrate error-checking for setupterm and restartterm."
+	,""
+	,"Options:"
+	," -a       automatic test for each success/error code"
+	," -f       treat errors as fatal"
+	," -n       set environment to disable terminfo database, assuming"
+	,"          the compiled-in paths for database also fail"
+#if HAVE_RESTARTTERM
+	," -r       test restartterm rather than setupterm"
+#endif
+    };
+    unsigned n;
+    for (n = 0; n < SIZEOF(msg); ++n) {
+	fprintf(stderr, "%s\n", msg[n]);
+    }
+    finish(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+    int n;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "afnr")) != -1) {
+	switch (ch) {
+	case 'a':
+	    a_opt = TRUE;
+	    break;
+	case 'f':
+	    f_opt = TRUE;
+	    break;
+	case 'n':
+	    n_opt = TRUE;
+	    break;
+#if HAVE_RESTARTTERM
+	case 'r':
+	    r_opt = TRUE;
+	    break;
+#endif
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+
+    if (n_opt) {
+	static char none[][25] =
+	{
+	    "HOME=/GUI",
+	    "TERMINFO=/GUI",
+	    "TERMINFO_DIRS=/GUI"
+	};
+	/*
+	 * We can turn this off, but not on again, because ncurses caches the
+	 * directory locations.
+	 */
+	printf("** without database\n");
+	for (n = 0; n < 3; ++n)
+	    putenv(none[n]);
+    } else {
+	printf("** with database\n");
+    }
+
+    /*
+     * The restartterm relies on an existing screen, so we make one here.
+     */
+    if (r_opt) {
+	newterm("ansi", stdout, stdin);
+	reset_shell_mode();
+	save_curterm();
+    }
+
+    if (a_opt) {
+	static char predef[][9] =
+	{"vt100", "dumb", "lpr", "unknown", "none-such"};
+	if (optind < argc) {
+	    usage(FALSE);
+	}
+	for (n = 0; n < 4; ++n) {
+	    test_setupterm(predef[n]);
+	}
+    } else {
+	if (optind < argc) {
+	    for (n = optind; n < argc; ++n) {
+		test_setupterm(argv[n]);
+	    }
+	} else {
+	    test_setupterm(NULL);
+	}
+    }
+
+    finish(EXIT_SUCCESS);
+}
+
+#else /* !HAVE_TIGETSTR */
+int
+main(void)
+{
+    printf("This program requires the terminfo functions such as tigetstr\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif /* HAVE_TIGETSTR */
diff --git a/test/test_sgr.c b/test/test_sgr.c
new file mode 100644
index 0000000..dbd1caf
--- /dev/null
+++ b/test/test_sgr.c
@@ -0,0 +1,392 @@
+/****************************************************************************
+ * Copyright 2019-2021,2022 Thomas E. Dickey                                *
+ * Copyright 2015-2016,2017 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.                                                           *
+ ****************************************************************************/
+
+/*
+ * Author: Thomas E. Dickey
+ *
+ * $Id: test_sgr.c,v 1.21 2022/12/10 23:23:27 tom Exp $
+ *
+ * A simple demo of the sgr/sgr0 terminal capabilities.
+ */
+#define USE_TINFO
+#include <test.priv.h>
+
+#if !HAVE_TIGETSTR
+static GCC_NORETURN void failed(const char *);
+
+static void
+failed(const char *msg)
+{
+    fprintf(stderr, "%s\n", msg);
+    ExitProgram(EXIT_FAILURE);
+}
+#endif
+
+#if HAVE_TIGETSTR
+
+static bool no_init = FALSE;
+static bool q_opt = FALSE;
+
+static char *d_opt;
+static char *e_opt;
+static char **db_list;
+static int db_item;
+
+static long total_values;
+
+static char *
+make_dbitem(char *p, char *q)
+{
+    size_t need = strlen(e_opt) + 2 + (size_t) (p - q);
+    char *result = malloc(need);
+    _nc_SPRINTF(result, _nc_SLIMIT(need) "%s=%.*s", e_opt, (int) (p - q), q);
+    return result;
+}
+
+static void
+make_dblist(void)
+{
+    if (d_opt && e_opt) {
+	int pass;
+
+	for (pass = 0; pass < 2; ++pass) {
+	    char *p, *q;
+	    size_t count = 0;
+
+	    for (p = q = d_opt; *p != '\0'; ++p) {
+		if (*p == ':') {
+		    if (p != q + 1) {
+			if (pass) {
+			    db_list[count] = make_dbitem(p, q);
+			}
+			count++;
+		    }
+		    q = p + 1;
+		}
+	    }
+	    if (p != q + 1) {
+		if (pass) {
+		    db_list[count] = make_dbitem(p, q);
+		}
+		count++;
+	    }
+	    if (!pass) {
+		db_list = typeCalloc(char *, count + 1);
+	    }
+	}
+    }
+}
+
+static char *
+next_dbitem(void)
+{
+    char *result = 0;
+
+    if (db_list) {
+	if ((result = db_list[db_item]) == 0) {
+	    db_item = 0;
+	    result = db_list[0];
+	} else {
+	    db_item++;
+	}
+    }
+    printf("** %s\n", result ? result : "<null>");
+    return result;
+}
+
+#if NO_LEAKS
+static void
+free_dblist(void)
+{
+    if (db_list) {
+	int n;
+	for (n = 0; db_list[n]; ++n)
+	    free(db_list[n]);
+	free(db_list);
+	db_list = 0;
+    }
+}
+#endif
+
+#define MAXPAR    9
+#define MAXSGR    (1 << MAXPAR)
+#define BITS2P(n) (count & (1 << (n - 1)))
+#define MASK_SMSO (1 << 0)
+#define MASK_BOLD (1 << 5)
+#define MASK_REV  (1 << 2)
+
+static void
+dumpit(unsigned bits, unsigned ignore, const char *sgr, const char *sgr0)
+{
+    static const char sample[] = "abcdefghijklm";
+    static char params[] = "SURBDBIPA";
+    unsigned n;
+
+    printf("%4u ", bits);
+    bits &= ~ignore;
+    for (n = 0; n < MAXPAR; ++n) {
+	putchar((int) ((bits & (unsigned) (1 << n)) ? params[n] : '-'));
+    }
+    putchar(' ');
+    putp(sgr);
+    putp(sample);
+    putp(sgr0);
+    putchar('\n');
+}
+
+static bool
+one_bit(unsigned a, unsigned b)
+{
+    unsigned c = (a ^ b);
+    bool result = FALSE;
+    if (c) {
+	while (!(c & 1)) {
+	    c >>= 1;
+	}
+	result = (c == 1);
+    }
+    return result;
+}
+
+static void
+brute_force(const char *name)
+{
+    unsigned count;
+    char *my_sgr;
+    char *my_sgr0;
+    char *my_bold;
+    char *my_revs;
+    char *my_smso;
+    char *my_name = strdup(name);
+
+    if (db_list) {
+	putenv(next_dbitem());
+    }
+
+    if (!q_opt)
+	printf("Terminal type \"%s\"\n", my_name);
+
+    if (no_init) {
+	START_TRACE();
+    } else {
+	setupterm((NCURSES_CONST char *) my_name, 1, (int *) 0);
+    }
+
+    if (!q_opt) {
+	if (strcmp(my_name, ttytype))
+	    printf("... actual \"%s\"\n", ttytype);
+    }
+
+    my_sgr = tigetstr("sgr");
+    my_sgr0 = tigetstr("sgr0");
+    my_bold = tigetstr("bold");
+    my_revs = tigetstr("rev");
+    my_smso = tigetstr("smso");
+
+    if (!VALID_STRING(my_sgr)) {
+	fprintf(stderr, "no \"sgr\" capability found\n");
+    } else if (!VALID_STRING(my_sgr0)) {
+	fprintf(stderr, "no \"sgr0\" capability found\n");
+    } else {
+	char *values[MAXSGR + MAXPAR];
+	unsigned j;
+	unsigned ignore = 0;
+	unsigned reason = 0;
+	unsigned repeat = 0;
+	for (count = 0; count < MAXSGR; ++count) {
+	    values[count] = tparm(my_sgr,
+				  BITS2P(1),
+				  BITS2P(2),
+				  BITS2P(3),
+				  BITS2P(4),
+				  BITS2P(5),
+				  BITS2P(6),
+				  BITS2P(7),
+				  BITS2P(8),
+				  BITS2P(9));
+	    if (values[count] != 0) {
+		values[count] = strdup(values[count]);
+	    }
+	}
+	for (count = 0; count < MAXSGR; ++count) {
+	    if (values[count] != 0) {
+		for (j = count + 1; j < MAXSGR; ++j) {
+		    if (values[j] == 0)
+			continue;
+		    if (strcmp(values[count], values[j]))
+			continue;
+		    if (one_bit(count, j)) {
+			free(values[j]);
+			values[j] = 0;
+		    }
+		}
+	    }
+	}
+	for (j = 0; j < MAXPAR; ++j) {
+	    unsigned mask = (unsigned) (1 << j);
+	    for (count = 0; count < MAXSGR; ++count) {
+		if ((count & mask) != 0)
+		    continue;
+		if (values[count] != 0 && values[count + mask] != 0) {
+		    mask = 0;
+		    break;
+		}
+	    }
+	    ignore |= mask;
+	}
+	/* smso is tested first, but often duplicates bold or reverse. */
+	if (VALID_STRING(my_smso)) {
+	    if (VALID_STRING(my_bold) && !strcmp(my_bold, my_smso)) {
+		repeat |= MASK_SMSO;
+		reason = MASK_BOLD;
+	    }
+	    if (VALID_STRING(my_revs) && !strcmp(my_revs, my_smso)) {
+		repeat |= MASK_SMSO;
+		reason = MASK_REV;
+	    }
+	}
+	for (count = 0; count < MAXSGR; ++count) {
+	    if (values[count] != 0) {
+		bool found = FALSE;
+		if ((repeat & MASK_SMSO) != 0
+		    && (count & MASK_SMSO) != 0) {
+		    found = TRUE;
+		} else {
+		    for (j = 0; j < count; ++j) {
+			if (values[j] != 0 && !strcmp(values[j], values[count])) {
+			    if ((repeat & MASK_SMSO) != 0
+				&& (j & MASK_SMSO) != 0
+				&& (count & reason) != 0) {
+				continue;
+			    }
+			    found = TRUE;
+			    break;
+			}
+		    }
+		}
+		if (!found) {
+		    dumpit(count, ignore, values[count], my_sgr0);
+		    ++total_values;
+		}
+	    }
+	}
+	for (count = 0; count < MAXSGR; ++count) {
+	    free(values[count]);
+	}
+    }
+    free(my_name);
+    del_curterm(cur_term);
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: test_sgr [options] [terminal]"
+	,""
+	,"Print all distinct combinations of sgr capability."
+	,""
+	,USAGE_COMMON
+	,"Options:"
+	," -d LIST  colon-separated list of databases to use"
+	," -e NAME  environment variable to set with -d option"
+	," -n       do not initialize terminal, to test error-checking"
+	," -q       quiet (prints only counts)"
+    };
+    unsigned n;
+    for (n = 0; n < SIZEOF(msg); ++n) {
+	fprintf(stderr, "%s\n", msg[n]);
+    }
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+    char *name;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "d:e:nq")) != -1) {
+	switch (ch) {
+	case 'd':
+	    d_opt = optarg;
+	    break;
+	case 'e':
+	    e_opt = optarg;
+	    break;
+	case 'n':
+	    no_init = TRUE;
+	    break;
+	case 'q':
+	    q_opt = TRUE;
+	    break;
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+
+    make_dblist();
+
+    if (optind < argc) {
+	int n;
+	for (n = optind; n < argc; ++n) {
+	    brute_force(argv[n]);
+	}
+    } else if ((name = getenv("TERM")) != 0) {
+	brute_force(name);
+    } else {
+	static char dumb[] = "dumb";
+	brute_force(dumb);
+    }
+
+    printf("%ld distinct values\n", total_values);
+
+#if NO_LEAKS
+    free_dblist();
+#endif
+
+    ExitProgram(EXIT_SUCCESS);
+}
+
+#else /* !HAVE_TIGETSTR */
+int
+main(void)
+{
+    failed("This program requires the terminfo functions such as tigetstr");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif /* HAVE_TIGETSTR */
diff --git a/test/test_termattrs.c b/test/test_termattrs.c
new file mode 100644
index 0000000..ec44cc2
--- /dev/null
+++ b/test/test_termattrs.c
@@ -0,0 +1,207 @@
+/****************************************************************************
+ * Copyright 2020,2022 Thomas E. Dickey                                     *
+ * Copyright 2017 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: test_termattrs.c,v 1.8 2022/12/10 23:23:27 tom Exp $
+ *
+ * Demonstrate the termattrs and term_attrs functions.
+ */
+
+#define USE_CURSES
+#define USE_TINFO
+#include <test.priv.h>
+
+#if HAVE_SETUPTERM
+
+static FILE *my_fp;
+
+static void
+test_termattrs(unsigned long value)
+{
+#define DATA(name) { name, #name }
+    static struct {
+	unsigned long code;
+	const char *name;
+    } table[] = {
+#ifdef A_ATTRIBUTES
+	DATA(A_ATTRIBUTES),
+#endif
+#ifdef A_CHARTEXT
+	    DATA(A_CHARTEXT),
+#endif
+#ifdef A_COLOR
+	    DATA(A_COLOR),
+#endif
+#ifdef A_STANDOUT
+	    DATA(A_STANDOUT),
+#endif
+#ifdef A_UNDERLINE
+	    DATA(A_UNDERLINE),
+#endif
+#ifdef A_REVERSE
+	    DATA(A_REVERSE),
+#endif
+#ifdef A_BLINK
+	    DATA(A_BLINK),
+#endif
+#ifdef A_DIM
+	    DATA(A_DIM),
+#endif
+#ifdef A_BOLD
+	    DATA(A_BOLD),
+#endif
+#ifdef A_ALTCHARSET
+	    DATA(A_ALTCHARSET),
+#endif
+#ifdef A_INVIS
+	    DATA(A_INVIS),
+#endif
+#ifdef A_PROTECT
+	    DATA(A_PROTECT),
+#endif
+#ifdef A_HORIZONTAL
+	    DATA(A_HORIZONTAL),
+#endif
+#ifdef A_LEFT
+	    DATA(A_LEFT),
+#endif
+#ifdef A_LOW
+	    DATA(A_LOW),
+#endif
+#ifdef A_RIGHT
+	    DATA(A_RIGHT),
+#endif
+#ifdef A_TOP
+	    DATA(A_TOP),
+#endif
+#ifdef A_VERTICAL
+	    DATA(A_VERTICAL),
+#endif
+#ifdef A_ITALIC
+	    DATA(A_ITALIC),
+#endif
+    };
+    size_t n;
+    fprintf(my_fp, "Result: %08lX\r\n", value);
+    for (n = 0; n < SIZEOF(table); ++n) {
+	if ((value & table[n].code) != 0) {
+	    fprintf(my_fp, "%08lX %08lX %s\r\n",
+		    table[n].code, value & table[n].code, table[n].name);
+	}
+    };
+    fputs("\r\n", my_fp);
+}
+
+static void
+usage(int ok)
+{
+    static const char *tbl[] =
+    {
+	"Usage: test_termattrs [options]"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+	," -e       use stderr (default stdout)"
+	," -n       do not initialize terminal"
+	," -s       use setupterm rather than newterm"
+#if USE_WIDEC_SUPPORT
+	," -w       use term_attrs rather than termattrs"
+#endif
+    };
+    unsigned n;
+    for (n = 0; n < SIZEOF(tbl); ++n)
+	fprintf(stderr, "%s\n", tbl[n]);
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+    bool no_init = FALSE;
+    bool s_opt = FALSE;
+#if USE_WIDEC_SUPPORT
+    bool w_opt = FALSE;
+#endif
+
+    my_fp = stdout;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "ensw")) != -1) {
+	switch (ch) {
+	case 'e':
+	    my_fp = stderr;
+	    break;
+	case 'n':
+	    no_init = TRUE;
+	    break;
+	case 's':
+	    s_opt = TRUE;
+	    break;
+#if USE_WIDEC_SUPPORT
+	case 'w':
+	    w_opt = TRUE;
+	    break;
+#endif
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind < argc)
+	usage(FALSE);
+
+    if (no_init) {
+	START_TRACE();
+    } else if (s_opt) {
+	setupterm((char *) 0, fileno(my_fp), (int *) 0);
+    } else {
+	newterm((char *) 0, my_fp, stdin);
+    }
+#if USE_WIDEC_SUPPORT
+    if (w_opt)
+	test_termattrs((unsigned long) term_attrs());
+    else
+#endif
+	test_termattrs((unsigned long) termattrs());
+    ExitProgram(EXIT_SUCCESS);
+}
+
+#else
+int
+main(void)
+{
+    fprintf(stderr, "This program requires terminfo\n");
+    exit(EXIT_FAILURE);
+}
+#endif
diff --git a/test/test_tparm.c b/test/test_tparm.c
new file mode 100644
index 0000000..c242ff6
--- /dev/null
+++ b/test/test_tparm.c
@@ -0,0 +1,497 @@
+/****************************************************************************
+ * Copyright 2020-2021,2022 Thomas E. Dickey                                *
+ *                                                                          *
+ * 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.                                                           *
+ ****************************************************************************/
+
+/*
+ * Author: Thomas E. Dickey
+ *
+ * $Id: test_tparm.c,v 1.24 2022/12/10 23:23:27 tom Exp $
+ *
+ * Exercise tparm, either for all possible capabilities with fixed parameters,
+ * or one capability with all possible parameters.
+ *
+ * TODO: incorporate tic.h and _nc_tparm_analyze
+ * TODO: optionally test tiparm
+ * TODO: add checks/logic to handle "%s" in tparm
+ */
+#define USE_TINFO
+#include <test.priv.h>
+
+static GCC_NORETURN void failed(const char *);
+
+static void
+failed(const char *msg)
+{
+    fprintf(stderr, "%s\n", msg);
+    ExitProgram(EXIT_FAILURE);
+}
+
+#if HAVE_TIGETSTR
+
+static int a_opt;
+static int p_opt;
+static int v_opt;
+
+/*
+ * Total tests (and failures):
+ */
+static long total_tests;
+static long total_fails;
+
+/*
+ * Total characters formatted for tputs:
+ */
+static long total_nulls;
+static long total_ctrls;
+static long total_print;
+
+static int
+output_func(int ch)
+{
+    if (ch == 0) {
+	total_nulls++;
+    } else if (ch < 32 || (ch >= 127 && ch < 160)) {
+	total_ctrls++;
+    } else {
+	total_print++;
+    }
+    return ch;
+}
+
+static int
+isNumeric(char *source)
+{
+    char *next = 0;
+    long value = strtol(source, &next, 0);
+    int result = (next == 0 || next == source || *next != '\0') ? 0 : 1;
+    (void) value;
+    return result;
+}
+
+static int
+relevant(const char *name, const char *value)
+{
+    int code = 1;
+    if (VALID_STRING(value)) {
+	if (strstr(value, "%p") == 0
+	    && strstr(value, "%d") == 0
+	    && strstr(value, "%s") == 0
+	    && (!p_opt || strstr(value, "$<") == 0)) {
+	    if (v_opt > 2)
+		printf("? %s noparams\n", name);
+	    code = 0;
+	}
+    } else {
+	if (v_opt > 2) {
+	    printf("? %s %s\n",
+		   (value == ABSENT_STRING)
+		   ? "absent"
+		   : "cancel",
+		   name);
+	}
+	code = 0;
+    }
+    return code;
+}
+
+static int
+increment(int *all_parms, int *num_parms, int len_parms, int end_parms)
+{
+    int rc = 0;
+    int n;
+
+    if (len_parms > 9)
+	len_parms = 9;
+
+    if (end_parms < len_parms) {
+	if (all_parms[end_parms]++ >= num_parms[end_parms]) {
+	    all_parms[end_parms] = 0;
+	    increment(all_parms, num_parms, len_parms, end_parms + 1);
+	}
+    }
+    for (n = 0; n < len_parms; ++n) {
+	if (all_parms[n] != 0) {
+	    rc = 1;
+	    break;
+	}
+    }
+    /* return 1 until the vector resets to all 0's */
+    return rc;
+}
+
+static void
+test_tparm(const char *name, const char *format, int *number)
+{
+    char *result = tparm(format,
+			 number[0],
+			 number[1],
+			 number[2],
+			 number[3],
+			 number[4],
+			 number[5],
+			 number[6],
+			 number[7],
+			 number[8]);
+    total_tests++;
+    if (result != NULL) {
+	tputs(result, 1, output_func);
+    } else {
+	total_fails++;
+    }
+    if (v_opt > 1)
+	printf(".. %2d = %2d %2d %2d %2d %2d %2d %2d %2d %2d %s\n",
+	       result != 0 ? (int) strlen(result) : -1,
+	       number[0],
+	       number[1],
+	       number[2],
+	       number[3],
+	       number[4],
+	       number[5],
+	       number[6],
+	       number[7],
+	       number[8],
+	       name);
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: test_tparm [options] [capability] [value1 [value2 [...]]]"
+	,""
+	,"Use tparm/tputs for all distinct combinations of given capability."
+	,""
+	,USAGE_COMMON
+	,"Options:"
+	," -T TERM  override $TERM; this may be a comma-separated list or \"-\""
+	,"          to read a list from standard-input"
+	," -a       test all combinations of parameters"
+	,"          [value1...] forms a vector of maximum parameter-values."
+	," -p       test capabilities with no parameters but having padding"
+	," -r NUM   repeat tests NUM times"
+	," -v       show values and results"
+    };
+    unsigned n;
+    for (n = 0; n < SIZEOF(msg); ++n) {
+	fprintf(stderr, "%s\n", msg[n]);
+    }
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+
+#define PLURAL(n) n, (n != 1) ? "s" : ""
+#define COLONS(n) (n >= 1) ? ":" : ""
+
+#define NUMFORM "%10ld"
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+    int n;
+    int r_run, t_run, n_run;
+    char *old_term = getenv("TERM");
+    int r_opt = 1;
+    char *t_opt = 0;
+
+    int len_caps = 0;		/* cur # of items in all_caps[] */
+    int max_caps = 10;		/* max # of items in all_caps[] */
+    char **all_caps = typeCalloc(char *, max_caps);
+
+    int all_parms[10];		/* workspace for "-a" option */
+
+    int len_terms = 0;		/* cur # of items in all_terms[] */
+    int max_terms = 10;		/* max # of items in all_terms[] */
+    char **all_terms = typeCalloc(char *, max_terms);
+
+    int use_caps;
+    char **cap_name;
+    char **cap_data;
+
+    int len_parms = 0;		/* cur # of items in num_parms[], str_parms[] */
+    int max_parms = argc + 10;	/* max # of items in num_parms[], str_parms[] */
+    int *num_parms = typeCalloc(int, max_parms);
+    char **str_parms = typeCalloc(char *, max_parms);
+    long use_parms = 1;
+
+    if (all_caps == 0 || all_terms == 0 || num_parms == 0 || str_parms == 0)
+	failed("no memory");
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "T:apr:v")) != -1) {
+	switch (ch) {
+	case 'T':
+	    t_opt = optarg;
+	    break;
+	case 'a':
+	    ++a_opt;
+	    break;
+	case 'p':
+	    ++p_opt;
+	    break;
+	case 'r':
+	    r_opt = atoi(optarg);
+	    break;
+	case 'v':
+	    ++v_opt;
+	    break;
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+
+    /*
+     * If there is a nonnumeric parameter after the options, use that as the
+     * capability name.
+     */
+    if (optind < argc) {
+	if (!isNumeric(argv[optind])) {
+	    all_caps[len_caps++] = strdup(argv[optind++]);
+	}
+    }
+
+    /*
+     * Any remaining arguments must be possible parameter values.  If numeric,
+     * and "-a" is not set, use those as the actual values for which the
+     * capabilities are tested.
+     */
+    while (optind < argc) {
+	if (isNumeric(argv[optind])) {
+	    char *dummy = 0;
+	    long value = strtol(argv[optind], &dummy, 0);
+	    num_parms[len_parms] = (int) value;
+	}
+	str_parms[len_parms] = argv[optind];
+	++optind;
+	++len_parms;
+    }
+    for (n = len_parms; n < max_parms; ++n) {
+	static char dummy[1];
+	str_parms[n] = dummy;
+    }
+    if (v_opt) {
+	printf("%d parameter%s%s\n", PLURAL(len_parms), COLONS(len_parms));
+	if (v_opt > 3) {
+	    for (n = 0; n < len_parms; ++n) {
+		printf(" %d: %d (%s)\n", n + 1, num_parms[n], str_parms[n]);
+	    }
+	}
+    }
+
+    /*
+     * Make a list of values for $TERM.  Accept "-" for standard input to
+     * simplify scripting a check of the whole database.
+     */
+    old_term = strdup((old_term == 0) ? "unknown" : old_term);
+    if (t_opt != 0) {
+	if (!strcmp(t_opt, "-")) {
+	    char buffer[BUFSIZ];
+	    while (fgets(buffer, sizeof(buffer) - 1, stdin) != 0) {
+		char *s = buffer;
+		char *t;
+		while (isspace(UChar(s[0])))
+		    ++s;
+		t = s + strlen(s);
+		while (t != s && isspace(UChar(t[-1])))
+		    *--t = '\0';
+		s = strdup(s);
+		if (len_terms + 2 >= max_terms) {
+		    max_terms *= 2;
+		    all_terms = typeRealloc(char *, max_terms, all_terms);
+		    if (all_terms == 0)
+			failed("no memory: all_terms");
+		}
+		all_terms[len_terms++] = s;
+	    }
+	} else {
+	    char *s = t_opt;
+	    char *t;
+	    while ((t = strtok(s, ",")) != 0) {
+		s = 0;
+		if (len_terms + 2 >= max_terms) {
+		    max_terms *= 2;
+		    all_terms = typeRealloc(char *, max_terms, all_terms);
+		    if (all_terms == 0)
+			failed("no memory: all_terms");
+		}
+		all_terms[len_terms++] = strdup(t);
+	    }
+	}
+    } else {
+	all_terms[len_terms++] = strdup(old_term);
+    }
+    all_terms[len_terms] = 0;
+    if (v_opt) {
+	printf("%d term%s:\n", PLURAL(len_terms));
+	if (v_opt > 3) {
+	    for (n = 0; n < len_terms; ++n) {
+		printf(" %d: %s\n", n + 1, all_terms[n]);
+	    }
+	}
+    }
+
+    /*
+     * If no capability name was selected, use the predefined list of string
+     * capabilities.
+     *
+     * TODO: To address the "other" systems which do not follow SVr4,
+     * just use the output from infocmp on $TERM.
+     */
+    if (len_caps == 0) {
+#if defined(HAVE_CURSES_DATA_BOOLNAMES) || defined(DECL_CURSES_DATA_BOOLNAMES)
+	for (n = 0; strnames[n] != 0; ++n) {
+	    if (len_caps + 2 >= max_caps) {
+		max_caps *= 2;
+		all_caps = typeRealloc(char *, max_caps, all_caps);
+		if (all_caps == 0) {
+		    failed("no memory: all_caps");
+		}
+	    }
+	    all_caps[len_caps++] = strdup(strnames[n]);
+	}
+#else
+	all_caps[len_caps++] = strdup("cup");
+	all_caps[len_caps++] = strdup("sgr");
+#endif
+    }
+    all_caps[len_caps] = 0;
+    if (v_opt) {
+	printf("%d name%s%s\n", PLURAL(len_caps), COLONS(len_caps));
+	if (v_opt > 3) {
+	    for (n = 0; n < len_caps; ++n) {
+		printf(" %d: %s\n", n + 1, all_caps[n]);
+	    }
+	}
+    }
+
+    cap_name = typeMalloc(char *, len_caps);
+    cap_data = typeMalloc(char *, len_caps);
+
+    if (r_opt <= 0)
+	r_opt = 1;
+
+    if (a_opt) {
+	for (n = 0; n < max_parms; ++n)
+	    if (num_parms[n])
+		use_parms *= (num_parms[n] + 1);
+    }
+
+    for (r_run = 0; r_run < r_opt; ++r_run) {
+	for (t_run = 0; t_run < len_terms; ++t_run) {
+	    int errs;
+
+	    if (setupterm(all_terms[t_run], fileno(stdout), &errs) != OK) {
+		printf("** skipping %s (errs:%d)\n", all_terms[t_run], errs);
+	    }
+
+	    /*
+	     * Most of the capabilities have no parameters, e.g., they are
+	     * function-keys or simple operations such as clear-display.
+	     * Ignore those, since they do not really exercise tparm.
+	     */
+	    use_caps = 0;
+	    for (n = 0; n < len_caps; ++n) {
+		char *value = tigetstr(all_caps[n]);
+		if (relevant(all_caps[n], value)) {
+		    cap_name[use_caps] = all_caps[n];
+		    cap_data[use_caps] = value;
+		    use_caps++;
+		}
+	    }
+
+	    if (v_opt) {
+		printf("[%d:%d] %d cap%s * %ld param%s \"%s\"\n",
+		       r_run + 1, r_opt,
+		       PLURAL(use_caps),
+		       PLURAL(use_parms),
+		       all_terms[t_run]);
+	    }
+
+	    memset(all_parms, 0, sizeof(all_parms));
+	    if (a_opt) {
+		/* for each combination of values */
+		do {
+		    for (n_run = 0; n_run < use_caps; ++n_run) {
+			test_tparm(cap_name[n_run], cap_data[n_run], all_parms);
+		    }
+		}
+		while (increment(all_parms, num_parms, len_parms, 0));
+	    } else {
+		/* for the given values */
+		for (n_run = 0; n_run < use_caps; ++n_run) {
+		    test_tparm(cap_name[n_run], cap_data[n_run], all_parms);
+		}
+	    }
+	    if (cur_term != 0) {
+		del_curterm(cur_term);
+	    } else {
+		printf("? no cur_term\n");
+	    }
+	}
+    }
+
+    printf("Tests:\n");
+    printf(NUMFORM " total\n", total_tests);
+    if (total_fails)
+	printf(NUMFORM " failed\n", total_fails);
+    printf("Characters:\n");
+    printf(NUMFORM " nulls\n", total_nulls);
+    printf(NUMFORM " controls\n", total_ctrls);
+    printf(NUMFORM " printable\n", total_print);
+    printf(NUMFORM " total\n", total_nulls + total_ctrls + total_print);
+#if NO_LEAKS
+    for (n = 0; n < len_caps; ++n) {
+	free(all_caps[n]);
+    }
+    free(all_caps);
+    free(old_term);
+    for (n = 0; n < len_terms; ++n) {
+	free(all_terms[n]);
+    }
+    free(all_terms);
+    free(num_parms);
+    free(str_parms);
+    free(cap_name);
+    free(cap_data);
+#endif
+
+    ExitProgram(EXIT_SUCCESS);
+}
+
+#else /* !HAVE_TIGETSTR */
+int
+main(void)
+{
+    failed("This program requires the terminfo functions such as tigetstr");
+}
+#endif /* HAVE_TIGETSTR */
diff --git a/test/test_unget_wch.c b/test/test_unget_wch.c
new file mode 100644
index 0000000..5808530
--- /dev/null
+++ b/test/test_unget_wch.c
@@ -0,0 +1,116 @@
+/****************************************************************************
+ * Copyright 2022 Thomas E. Dickey                                          *
+ *                                                                          *
+ * 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: test_unget_wch.c,v 1.4 2022/12/10 23:31:31 tom Exp $
+ *
+ * Demonstrate the unget_wch and unget functions.
+ */
+
+#include <test.priv.h>
+
+#if USE_WIDEC_SUPPORT && HAVE_UNGET_WCH
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: test_unget_wch [options]"
+	,""
+	,USAGE_COMMON
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int step = 0;
+    int ch;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) {
+	switch (ch) {
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind < argc)
+	usage(FALSE);
+
+    setlocale(LC_ALL, "");
+    initscr();
+    keypad(stdscr, TRUE);
+    cbreak();
+    noecho();
+    scrollok(stdscr, TRUE);
+
+    for (;;) {
+	wint_t widechar;
+	int rc = get_wch(&widechar);
+	if (rc == KEY_CODE_YES) {
+	    printw("KEY[%d] %s\n", ++step, keyname((int) widechar));
+	    ungetch((int) widechar);
+	    printw("...[%d] %s\n", step, keyname(getch()));
+	} else if (widechar == QUIT || widechar == ESCAPE) {
+	    break;
+	} else {
+	    printw("CHR[%d] %s\n", ++step, key_name((wchar_t) widechar));
+	    unget_wch((wchar_t) widechar);
+	    rc = get_wch(&widechar);
+	    printw("%s[%d] %s\n",
+		   ((rc == KEY_CODE_YES)
+		    ? "???"
+		    : "..."),
+		   step, key_name((wchar_t) widechar));
+	}
+    }
+
+    endwin();
+
+    ExitProgram(EXIT_SUCCESS);
+}
+
+#else
+int
+main(void)
+{
+    printf("This program requires the wide-ncurses library\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif
diff --git a/test/test_vid_puts.c b/test/test_vid_puts.c
new file mode 100644
index 0000000..0d7d7ab
--- /dev/null
+++ b/test/test_vid_puts.c
@@ -0,0 +1,166 @@
+/****************************************************************************
+ * Copyright 2020-2021,2022 Thomas E. Dickey                                *
+ * Copyright 2013-2014,2017 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: test_vid_puts.c,v 1.17 2022/12/10 22:28:50 tom Exp $
+ *
+ * Demonstrate the vid_puts and vid_attr functions.
+ * Thomas Dickey - 2013/01/12
+ */
+
+#define USE_TINFO
+#include <test.priv.h>
+
+#if USE_WIDEC_SUPPORT && HAVE_SETUPTERM && HAVE_VID_PUTS
+
+static FILE *my_fp;
+static bool p_opt = FALSE;
+
+static
+TPUTS_PROTO(outc, c)
+{
+    int rc;
+
+    rc = putc(c, my_fp);
+    TPUTS_RETURN(rc);
+}
+
+static bool
+outs(const char *s)
+{
+    if (VALID_STRING(s)) {
+	tputs(s, 1, outc);
+	return TRUE;
+    }
+    return FALSE;
+}
+
+static void
+cleanup(void)
+{
+    if (cur_term != 0) {
+	outs(exit_attribute_mode);
+	if (!outs(orig_colors))
+	    outs(orig_pair);
+	outs(cursor_normal);
+    }
+}
+
+static void
+change_attr(chtype attr)
+{
+    if (p_opt) {
+	vid_puts(attr, (short) 0, (void *) 0, outc);
+    } else {
+	vid_attr(attr, (short) 0, (void *) 0);
+    }
+}
+
+static void
+test_vid_puts(void)
+{
+    fprintf(my_fp, "Name: ");
+    change_attr(A_BOLD);
+    fputs("Bold", my_fp);
+    change_attr(A_REVERSE);
+    fputs(" Reverse", my_fp);
+    change_attr(A_NORMAL);
+    fputs("\n", my_fp);
+}
+
+static void
+usage(int ok)
+{
+    static const char *tbl[] =
+    {
+	"Usage: test_vid_puts [options]"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+	," -e       use stderr (default stdout)"
+	," -n       do not initialize terminal"
+	," -p       use vid_puts (default vid_attr)"
+    };
+    unsigned n;
+    for (n = 0; n < SIZEOF(tbl); ++n)
+	fprintf(stderr, "%s\n", tbl[n]);
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+    bool no_init = FALSE;
+
+    my_fp = stdout;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "enp")) != -1) {
+	switch (ch) {
+	case 'e':
+	    my_fp = stderr;
+	    break;
+	case 'n':
+	    no_init = TRUE;
+	    break;
+	case 'p':
+	    p_opt = TRUE;
+	    break;
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind < argc)
+	usage(FALSE);
+
+    setlocale(LC_ALL, "");
+    if (no_init) {
+	START_TRACE();
+    } else {
+	setupterm((char *) 0, fileno(my_fp), (int *) 0);
+    }
+    test_vid_puts();
+    cleanup();
+    ExitProgram(EXIT_SUCCESS);
+}
+
+#else
+int
+main(void)
+{
+    printf("This program requires the wide-ncurses terminfo library\n");
+    ExitProgram(EXIT_FAILURE);
+}
+#endif
diff --git a/test/test_vidputs.c b/test/test_vidputs.c
new file mode 100644
index 0000000..31dc9da
--- /dev/null
+++ b/test/test_vidputs.c
@@ -0,0 +1,165 @@
+/****************************************************************************
+ * Copyright 2020-2021,2022 Thomas E. Dickey                                *
+ * Copyright 2013-2014,2017 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: test_vidputs.c,v 1.15 2022/12/10 23:23:27 tom Exp $
+ *
+ * Demonstrate the vidputs and vidattr functions.
+ * Thomas Dickey - 2013/01/12
+ */
+
+#define USE_TINFO
+#include <test.priv.h>
+
+#if HAVE_SETUPTERM && HAVE_VIDPUTS
+
+static FILE *my_fp;
+static bool p_opt = FALSE;
+
+static
+TPUTS_PROTO(outc, c)
+{
+    int rc;
+
+    rc = putc(c, my_fp);
+    TPUTS_RETURN(rc);
+}
+
+static bool
+outs(const char *s)
+{
+    if (VALID_STRING(s)) {
+	tputs(s, 1, outc);
+	return TRUE;
+    }
+    return FALSE;
+}
+
+static void
+cleanup(void)
+{
+    if (cur_term != 0) {
+	outs(exit_attribute_mode);
+	if (!outs(orig_colors))
+	    outs(orig_pair);
+	outs(cursor_normal);
+    }
+}
+
+static void
+change_attr(chtype attr)
+{
+    if (p_opt) {
+	vidputs(attr, outc);
+    } else {
+	vidattr(attr);
+    }
+}
+
+static void
+test_vidputs(void)
+{
+    fprintf(my_fp, "Name: ");
+    change_attr(A_BOLD);
+    fputs("Bold", my_fp);
+    change_attr(A_REVERSE);
+    fputs(" Reverse", my_fp);
+    change_attr(A_NORMAL);
+    fputs("\n", my_fp);
+}
+
+static void
+usage(int ok)
+{
+    static const char *tbl[] =
+    {
+	"Usage: test_vidputs [options]"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+	," -e       use stderr (default stdout)"
+	," -n       do not initialize terminal"
+	," -p       use vidputs (default vidattr)"
+    };
+    unsigned n;
+    for (n = 0; n < SIZEOF(tbl); ++n)
+	fprintf(stderr, "%s\n", tbl[n]);
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+    bool no_init = FALSE;
+
+    my_fp = stdout;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "enp")) != -1) {
+	switch (ch) {
+	case 'e':
+	    my_fp = stderr;
+	    break;
+	case 'n':
+	    no_init = TRUE;
+	    break;
+	case 'p':
+	    p_opt = TRUE;
+	    break;
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind < argc)
+	usage(FALSE);
+
+    if (no_init) {
+	START_TRACE();
+    } else {
+	setupterm((char *) 0, fileno(my_fp), (int *) 0);
+    }
+    test_vidputs();
+    cleanup();
+    ExitProgram(EXIT_SUCCESS);
+}
+
+#else
+int
+main(void)
+{
+    fprintf(stderr, "This program requires terminfo\n");
+    exit(EXIT_FAILURE);
+}
+#endif
diff --git a/test/testaddch.c b/test/testaddch.c
new file mode 100644
index 0000000..e393c3c
--- /dev/null
+++ b/test/testaddch.c
@@ -0,0 +1,121 @@
+/****************************************************************************
+ * Copyright 2020,2022 Thomas E. Dickey                                     *
+ * Copyright 1998-2013,2014 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.                                                           *
+ ****************************************************************************/
+/*
+ * This is an example written by Alexander V. Lukyanov <lav@yars.free.net>,
+ * to demonstrate an inconsistency between ncurses and SVr4 curses.
+ *
+ * $Id: testaddch.c,v 1.15 2022/12/10 23:44:18 tom Exp $
+ */
+#include <test.priv.h>
+
+static void
+attr_addstr(const char *s, chtype a)
+{
+    while (*s)
+	addch(((unsigned char) (*s++)) | a);
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: testaddch [options]"
+	,""
+	,USAGE_COMMON
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    unsigned i;
+    chtype back, set, attr;
+    int ch;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) {
+	switch (ch) {
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind < argc)
+	usage(FALSE);
+
+    setlocale(LC_ALL, "");
+
+    initscr();
+    start_color();
+    init_pair(1, COLOR_WHITE, COLOR_BLUE);
+    init_pair(2, COLOR_WHITE, COLOR_RED);
+    init_pair(3, COLOR_BLACK, COLOR_MAGENTA);
+    init_pair(4, COLOR_BLACK, COLOR_GREEN);
+    init_pair(5, COLOR_BLACK, COLOR_CYAN);
+    init_pair(6, COLOR_BLACK, COLOR_YELLOW);
+    init_pair(7, COLOR_BLACK, COLOR_WHITE);
+
+    for (i = 0; i < 8; i++) {
+	back = (i & 1) ? A_BOLD | 'B' : ' ';
+	set = (i & 2) ? A_REVERSE : 0;
+	attr = (chtype) ((i & 4) ? COLOR_PAIR(4) : 0);
+
+	bkgdset(back);
+	(void) attrset(AttrArg(set, 0));
+
+	attr_addstr("Test string with spaces ->   <-\n", attr);
+    }
+    addch('\n');
+    for (i = 0; i < 8; i++) {
+	back = (i & 1) ? (A_BOLD | 'B' | (chtype) COLOR_PAIR(1)) : ' ';
+	set = (i & 2) ? (A_REVERSE | (chtype) COLOR_PAIR(2)) : 0;
+	attr = (chtype) ((i & 4) ? (chtype) COLOR_PAIR(4) : 0);
+
+	bkgdset(back);
+	(void) attrset(AttrArg(set, 0));
+
+	attr_addstr("Test string with spaces ->   <-\n", attr);
+    }
+
+    getch();
+    endwin();
+    ExitProgram(EXIT_SUCCESS);
+}
diff --git a/test/testcurs.c b/test/testcurs.c
new file mode 100644
index 0000000..a1dc51a
--- /dev/null
+++ b/test/testcurs.c
@@ -0,0 +1,805 @@
+/*
+ * This is a test program for the PDCurses screen package for IBM PC type
+ * machines.
+ *
+ * This program was written by John Burnell (johnb@kea.am.dsir.govt.nz)
+ *  wrs(5/28/93) -- modified to be consistent (perform identically) with either
+ *                  PDCurses or under Unix System V, R4
+ *
+ * $Id: testcurs.c,v 1.57 2022/12/10 23:35:36 tom Exp $
+ */
+
+#include <test.priv.h>
+
+#if defined(XCURSES)
+const char *XCursesProgramName = "testcurs";
+#endif
+
+static int initTest(WINDOW **);
+static void display_menu(int, int);
+static void inputTest(WINDOW *);
+static void introTest(WINDOW *);
+static void outputTest(WINDOW *);
+#if HAVE_NEWPAD
+static void padTest(WINDOW *);
+#endif
+static void scrollTest(WINDOW *);
+#if defined(PDCURSES) && !defined(XCURSES)
+static void resizeTest(WINDOW *);
+#endif
+
+static int width, height;
+
+static void
+Continue(WINDOW *win)
+{
+    int y1 = getmaxy(win);
+    int x1 = getmaxx(win);
+    int y0 = y1 < 10 ? y1 : 10;
+    int x0 = 1;
+    chtype save;
+
+    save = mvwinch(win, y0, x1 - 1);
+
+    MvWAddStr(win, y0, x0, " Press any key to continue");
+    wclrtoeol(win);
+    getyx(win, y0, x0);
+
+    MvWAddCh(win, y0, x1 - 1, save);
+
+    wmove(win, y0, x0);
+    raw();
+    wgetch(win);
+}
+
+static int
+initTest(WINDOW **win)
+{
+#ifdef PDCDEBUG
+    PDC_debug("initTest called\n");
+#endif
+#ifdef TRACE
+    curses_trace(TRACE_MAXIMUM);
+#endif
+    initscr();
+#ifdef PDCDEBUG
+    PDC_debug("after initscr()\n");
+#endif
+#ifdef A_COLOR
+    if (has_colors())
+	start_color();
+#endif
+    width = 60;
+    height = 13;		/* Create a drawing window */
+    *win = newwin(height, width, (LINES - height) / 2, (COLS - width) / 2);
+    if (*win == NULL) {
+	stop_curses();
+	return 0;
+    }
+    return 1;
+}
+
+static void
+introTest(WINDOW *win)
+{
+    wmove(win, height / 2 - 5, width / 2);
+    wvline(win, ACS_VLINE, 10);
+    wmove(win, height / 2, width / 2 - 10);
+    whline(win, ACS_HLINE, 20);
+    Continue(win);
+
+    beep();
+    werase(win);
+
+    box(win, ACS_VLINE, ACS_HLINE);
+    wrefresh(win);
+    cbreak();
+    MvWAddStr(win, 1, 1,
+	      "You should have rectangle in the middle of the screen");
+    MvWAddStr(win, 2, 1, "You should have heard a beep");
+    Continue(win);
+    return;
+}
+
+static void
+scrollTest(WINDOW *win)
+{
+    int i;
+    int half;
+    int OldY;
+    NCURSES_CONST char *Message = "The window will now scroll slowly";
+
+    wclear(win);
+    OldY = getmaxy(win);
+    half = OldY / 2;
+    MvWAddStr(win, OldY - 2, 1, Message);
+    wrefresh(win);
+    scrollok(win, TRUE);
+    for (i = 1; i <= OldY; i++) {
+	napms(600);
+	scroll(win);
+	wrefresh(win);
+    }
+
+    werase(win);
+    for (i = 1; i < OldY; i++) {
+	MvWPrintw(win, i, 1, "Line %d", i);
+    }
+    MvWPrintw(win, OldY - 2, 1, "The top of the window will scroll");
+    wmove(win, 1, 1);
+    wsetscrreg(win, 0, half - 1);
+    box(win, ACS_VLINE, ACS_HLINE);
+    wrefresh(win);
+    for (i = 1; i <= half; i++) {
+	napms(600);
+	scroll(win);
+	box(win, ACS_VLINE, ACS_HLINE);
+	wrefresh(win);
+    }
+
+    werase(win);
+    for (i = 1; i < OldY; i++) {
+	MvWPrintw(win, i, 1, "Line %d", i);
+    }
+    MvWPrintw(win, 1, 1, "The bottom of the window will scroll");
+    wmove(win, OldY - 2, 1);
+    wsetscrreg(win, half, --OldY);
+    box(win, ACS_VLINE, ACS_HLINE);
+    wrefresh(win);
+    for (i = half; i <= OldY; i++) {
+	napms(600);
+	wscrl(win, -1);
+	box(win, ACS_VLINE, ACS_HLINE);
+	wrefresh(win);
+    }
+    wsetscrreg(win, 0, OldY);
+}
+
+static void
+inputTest(WINDOW *win)
+{
+    int answered;
+    int repeat;
+    int w, h, bx, by, sw, sh, i, num;
+    char buffer[80];
+    WINDOW *subWin;
+    wclear(win);
+
+    getmaxyx(win, h, w);
+    getbegyx(win, by, bx);
+    sw = w / 3;
+    sh = h / 3;
+    if ((subWin = subwin(win, sh, sw, by + h - sh - 2, bx + w - sw - 2)) == NULL)
+	return;
+
+#ifdef A_COLOR
+    if (has_colors()) {
+	init_pair(2, COLOR_WHITE, COLOR_RED);
+	wbkgd(subWin, (chtype) COLOR_PAIR(2) | A_BOLD);
+    } else
+	wbkgd(subWin, A_BOLD);
+#else
+    wbkgd(subWin, A_BOLD);
+#endif
+    box(subWin, ACS_VLINE, ACS_HLINE);
+    wrefresh(win);
+
+    nocbreak();
+    MvWAddStr(win, 2, 1, "Press some keys for 5 seconds");
+    MvWAddStr(win, 1, 1, "Pressing ^C should do nothing");
+    wrefresh(win);
+
+    werase(subWin);
+    box(subWin, ACS_VLINE, ACS_HLINE);
+    for (i = 0; i < 5; i++) {
+	MvWPrintw(subWin, 1, 1, "Time = %d", i);
+	wrefresh(subWin);
+	napms(1000);
+	flushinp();
+    }
+
+    delwin(subWin);
+    werase(win);
+    flash();
+    wrefresh(win);
+    napms(500);
+
+    MvWAddStr(win, 2, 1, "Press a key, followed by ENTER");
+    wmove(win, 9, 10);
+    wrefresh(win);
+    echo();
+    noraw();
+    wgetch(win);
+    flushinp();
+
+    wmove(win, 9, 10);
+    wdelch(win);
+    MvWAddStr(win, 4, 1, "The character should now have been deleted");
+    Continue(win);
+
+    wclear(win);
+    MvWAddStr(win, 1, 1, "Press keys (or mouse buttons) to show their names");
+    MvWAddStr(win, 2, 1, "Press spacebar to finish");
+    wrefresh(win);
+
+    keypad(win, TRUE);
+    raw();
+    noecho();
+
+#if HAVE_TYPEAHEAD
+    typeahead(-1);
+#endif
+
+#ifdef NCURSES_MOUSE_VERSION
+    mousemask(ALL_MOUSE_EVENTS, (mmask_t *) 0);
+#endif
+#if defined(PDCURSES)
+    mouse_set(ALL_MOUSE_EVENTS);
+#endif
+
+    for (;;) {
+	int c;
+
+	wmove(win, 3, 5);
+	c = wgetch(win);
+	wclrtobot(win);
+	if (c >= KEY_MIN)
+	    wprintw(win, "Key Pressed: %s", keyname(c));
+	else if (isprint(c))
+	    wprintw(win, "Key Pressed: %c", c);
+	else
+	    wprintw(win, "Key Pressed: %s", unctrl(UChar(c)));
+#ifdef KEY_MOUSE
+	if (c == KEY_MOUSE) {
+#if defined(NCURSES_MOUSE_VERSION)
+#define ButtonChanged(n) ((event.bstate) & NCURSES_MOUSE_MASK(1, 037))
+#define ButtonPressed(n) ((event.bstate) & NCURSES_MOUSE_MASK(1, NCURSES_BUTTON_PRESSED))
+#define ButtonDouble(n)  ((event.bstate) & NCURSES_MOUSE_MASK(1, NCURSES_DOUBLE_CLICKED))
+#define ButtonTriple(n)  ((event.bstate) & NCURSES_MOUSE_MASK(1, NCURSES_TRIPLE_CLICKED))
+#define ButtonRelease(n) ((event.bstate) & NCURSES_MOUSE_MASK(1, NCURSES_BUTTON_RELEASED))
+	    MEVENT event;
+	    int button = 0;
+
+	    getmouse(&event);
+	    if (ButtonChanged(1))
+		button = 1;
+	    else if (ButtonChanged(2))
+		button = 2;
+	    else if (ButtonChanged(3))
+		button = 3;
+	    else
+		button = 0;
+	    wmove(win, 4, 18);
+	    wprintw(win, "Button %d: ", button);
+	    if (ButtonPressed(button))
+		wprintw(win, "pressed: ");
+	    else if (ButtonDouble(button))
+		wprintw(win, "double: ");
+	    else if (ButtonTriple(button))
+		wprintw(win, "triple: ");
+	    else
+		wprintw(win, "released: ");
+	    wprintw(win, " Position: Y: %d X: %d", event.y, event.x);
+#elif defined(PDCURSES)
+	    int button = 0;
+	    request_mouse_pos();
+	    if (BUTTON_CHANGED(1))
+		button = 1;
+	    else if (BUTTON_CHANGED(2))
+		button = 2;
+	    else if (BUTTON_CHANGED(3))
+		button = 3;
+	    else
+		button = 0;
+	    wmove(win, 4, 18);
+	    wprintw(win, "Button %d: ", button);
+	    if (MOUSE_MOVED)
+		wprintw(win, "moved: ");
+	    else if ((BUTTON_STATUS(button) & BUTTON_ACTION_MASK) == BUTTON_PRESSED)
+		wprintw(win, "pressed: ");
+	    else if ((BUTTON_STATUS(button) & BUTTON_ACTION_MASK) == BUTTON_DOUBLE_CLICKED)
+		wprintw(win, "double: ");
+	    else
+		wprintw(win, "released: ");
+	    wprintw(win, " Position: Y: %d X: %d", MOUSE_Y_POS, MOUSE_X_POS);
+#endif /* NCURSES_VERSION vs PDCURSES */
+	}
+#endif /* KEY_MOUSE */
+	wrefresh(win);
+	if (c == ' ')
+	    break;
+    }
+#if 0
+    nodelay(win, TRUE);
+    wgetch(win);
+    nodelay(win, FALSE);
+#endif
+#if defined(PDCURSES)
+    mouse_set(0L);
+#endif
+    refresh();
+
+    repeat = 0;
+    do {
+	static const char *fmt[] =
+	{
+	    "%d %10s",
+	    "%d %[a-zA-Z]s",
+	    "%d %[][a-zA-Z]s",
+	    "%d %[^0-9]"
+	};
+	char *format = strdup(fmt[(unsigned) repeat % SIZEOF(fmt)]);
+
+	wclear(win);
+	MvWAddStr(win, 3, 2, "The window should have moved");
+	MvWAddStr(win, 4, 2,
+		  "This text should have appeared without you pressing a key");
+	MvWPrintw(win, 6, 2,
+		  "Scanning with format \"%s\"", format);
+	mvwin(win, 2 + 2 * (repeat % 4), 1 + 2 * (repeat % 4));
+	erase();
+	refresh();
+	wrefresh(win);
+	echo();
+	noraw();
+	num = 0;
+	*buffer = 0;
+	answered = mvwscanw(win, 7, 6, format, &num, buffer);
+	MvWPrintw(win, 8, 6,
+		  "String: %s Number: %d (%d values read)",
+		  buffer, num, answered);
+	Continue(win);
+	++repeat;
+	free(format);
+    } while (answered > 0);
+}
+
+static void
+outputTest(WINDOW *win)
+{
+    char Buffer[80];
+    chtype ch;
+    int by, bx;
+
+#if !HAVE_TIGETSTR
+#if HAVE_TGETENT
+    char tc_buffer[4096];
+    char tc_parsed[4096];
+    char *area_pointer = tc_parsed;
+    tgetent(tc_buffer, getenv("TERM"));
+#else
+#define tgetstr(a,b) 0
+#endif
+#endif /* !HAVE_TIGETSTR */
+
+    nl();
+    wclear(win);
+    MvWAddStr(win, 1, 1,
+	      "You should now have a screen in the upper left corner, and this text should have wrapped");
+    mvwin(win, 2, 1);
+    waddstr(win, "\nThis text should be down\n");
+    waddstr(win, "and broken into two here ^");
+    Continue(win);
+
+    wclear(win);
+    wattron(win, A_BOLD);
+    MvWAddStr(win, 1, 1, "A new window will appear with this text in it");
+    MvWAddStr(win, 8, 1, "Press any key to continue");
+    wrefresh(win);
+    wgetch(win);
+
+    getbegyx(win, by, bx);
+
+    if (LINES < 24 || COLS < 75) {
+	MvWAddStr(win, 5, 1,
+		  "Some tests have been skipped as they require a");
+	MvWAddStr(win, 6, 1, "display of at least 24 LINES by 75 COLUMNS");
+	Continue(win);
+    } else {
+	WINDOW *win1 = newwin(10, 50, 14, 25);
+	if (win1 == NULL) {
+	    endwin();
+	    return;
+	}
+#ifdef A_COLOR
+	if (has_colors()) {
+	    init_pair(3, COLOR_BLUE, COLOR_WHITE);
+	    wbkgd(win1, (chtype) COLOR_PAIR(3));
+	} else
+	    wbkgd(win1, A_NORMAL);
+#else
+	wbkgd(win1, A_NORMAL);
+#endif
+	wclear(win1);
+	MvWAddStr(win1, 5, 1,
+		  "This text should appear; using overlay option");
+	copywin(win, win1, 0, 0, 0, 0, 9, 49, TRUE);
+
+#if defined(PDCURSES) && !defined(XCURSES)
+	box(win1, 0xb3, 0xc4);
+#else
+	box(win1, ACS_VLINE, ACS_HLINE);
+#endif
+	wmove(win1, 8, 26);
+	wrefresh(win1);
+	wgetch(win1);
+
+	wclear(win1);
+	wattron(win1, A_BLINK);
+	MvWAddStr(win1, 4, 1,
+		  "This blinking text should appear in only the second window");
+	wattroff(win1, A_BLINK);
+	mvwin(win1, by, bx);
+	overlay(win, win1);
+	mvwin(win1, 14, 25);
+	wmove(win1, 8, 26);
+	wrefresh(win1);
+	wgetch(win1);
+	delwin(win1);
+    }
+
+    clear();
+    wclear(win);
+    wrefresh(win);
+    MvWAddStr(win, 6, 2, "This line shouldn't appear");
+    MvWAddStr(win, 4, 2, "Only half of the next line is visible");
+    MvWAddStr(win, 5, 2, "Only half of the next line is visible");
+    wmove(win, 6, 1);
+    wclrtobot(win);
+    wmove(win, 5, 20);
+    wclrtoeol(win);
+    MvWAddStr(win, 8, 2, "This line also shouldn't appear");
+    wmove(win, 8, 1);
+    wdeleteln(win);
+    Continue(win);
+
+    wmove(win, 5, 9);
+    ch = winch(win);
+
+    wclear(win);
+    wmove(win, 6, 2);
+    waddstr(win, "The next char should be l:  ");
+    winsch(win, ch);
+    Continue(win);
+
+#if HAVE_WINSSTR
+    (void) mvwinsstr(win, 6, 2, "A1B2C3D4E5");
+    Continue(win);
+#endif
+
+    wmove(win, 5, 1);
+    winsertln(win);
+    MvWAddStr(win, 5, 2, "The lines below should have moved down");
+    Continue(win);
+
+    wclear(win);
+    wmove(win, 2, 2);
+    wprintw(win, "This is a formatted string in a window: %d %s\n", 42,
+	    "is it");
+    MvWAddStr(win, 10, 1, "Enter a string: ");
+    wrefresh(win);
+    noraw();
+    echo();
+    *Buffer = 0;
+    wscanw(win, "%s", Buffer);
+
+    printw("This is a formatted string in stdscr: %d %s\n", 42, "is it");
+    MvAddStr(10, 1, "Enter a string: ");
+    *Buffer = 0;
+    scanw("%s", Buffer);
+
+    if (TIGETSTR("cvvis", "vs") != 0) {
+	wclear(win);
+	curs_set(2);
+	MvWAddStr(win, 1, 1, "The cursor should appear as a block (visible)");
+	Continue(win);
+    }
+
+    if (TIGETSTR("civis", "vi") != 0) {
+	wclear(win);
+	curs_set(0);
+	MvWAddStr(win, 1, 1,
+		  "The cursor should have disappeared (invisible)");
+	Continue(win);
+    }
+
+    if (TIGETSTR("cnorm", "ve") != 0) {
+	wclear(win);
+	curs_set(1);
+	MvWAddStr(win, 1, 1, "The cursor should be an underline (normal)");
+	Continue(win);
+    }
+#ifdef A_COLOR
+    if (has_colors()) {
+	wclear(win);
+	MvWAddStr(win, 1, 1, "Colors should change after you press a key");
+	Continue(win);
+	init_pair(1, COLOR_RED, COLOR_WHITE);
+	wrefresh(win);
+    }
+#endif
+
+    werase(win);
+
+#if HAVE_TERMNAME
+    MvWAddStr(win, 1, 1, "Information About Your Terminal");
+    MvWAddStr(win, 3, 1, termname());
+    MvWAddStr(win, 4, 1, longname());
+    if (termattrs() & A_BLINK)
+	MvWAddStr(win, 5, 1, "This terminal supports blinking.");
+    else
+	MvWAddStr(win, 5, 1, "This terminal does NOT support blinking.");
+#endif
+
+    (void) mvwaddnstr(win, 7, 5, "Have a nice day!ok", 16);
+    wrefresh(win);
+
+    (void) mvwinnstr(win, 7, 5, Buffer, 18);
+    MvAddStr(LINES - 2, 10, Buffer);
+    refresh();
+    Continue(win);
+}
+
+#if defined(PDCURSES) && !defined(XCURSES)
+static void
+resizeTest(WINDOW *dummy GCC_UNUSED)
+{
+    WINDOW *win1;
+
+    savetty();
+
+    clear();
+    refresh();
+#  if defined(OS2)
+    resize_term(50, 120);
+#  else
+    resize_term(50, 80);
+#  endif
+
+    win1 = newwin(10, 50, 14, 25);
+    if (win1 == NULL) {
+	stop_curses();
+	return;
+    }
+#ifdef A_COLOR
+    if (has_colors()) {
+	init_pair(3, COLOR_BLUE, COLOR_WHITE);
+	wattrset(win1, COLOR_PAIR(3));
+    }
+#endif
+    wclear(win1);
+
+    MvWAddStr(win1, 1, 1, "The screen may now have 50 lines");
+    Continue(win1);
+
+    wclear(win1);
+    resetty();
+
+    MvWAddStr(win1, 1, 1, "The screen should now be reset");
+    Continue(win1);
+
+    delwin(win1);
+
+    clear();
+    refresh();
+
+}
+#endif
+
+#if HAVE_NEWPAD
+static void
+padTest(WINDOW *dummy GCC_UNUSED)
+{
+    WINDOW *pad;
+
+    if ((pad = newpad(50, 100)) != 0) {
+	WINDOW *spad;
+
+	wattron(pad, A_REVERSE);
+	MvWAddStr(pad, 5, 2, "This is a new pad");
+	(void) wattrset(pad, A_NORMAL);
+	MvWAddStr(pad, 8, 0,
+		  "The end of this line should be truncated here:except  now");
+	MvWAddStr(pad, 11, 1, "This line should not appear.It will now");
+	wmove(pad, 10, 1);
+	wclrtoeol(pad);
+	MvWAddStr(pad, 10, 1, " Press any key to continue");
+	prefresh(pad, 0, 0, 0, 0, 10, 45);
+	keypad(pad, TRUE);
+	raw();
+	wgetch(pad);
+
+	if ((spad = subpad(pad, 12, 25, 6, 52)) != 0) {
+	    MvWAddStr(spad, 2, 2, "This is a new subpad");
+	    box(spad, 0, 0);
+	    delwin(spad);
+	}
+	prefresh(pad, 0, 0, 0, 0, 15, 75);
+	keypad(pad, TRUE);
+	raw();
+	wgetch(pad);
+
+	MvWAddStr(pad, 35, 2, "This is displayed at line 35 in the pad");
+	MvWAddStr(pad, 40, 1, " Press any key to continue");
+	prefresh(pad, 30, 0, 0, 0, 10, 45);
+	keypad(pad, TRUE);
+	raw();
+	wgetch(pad);
+
+	delwin(pad);
+    }
+}
+#endif /* HAVE_NEWPAD */
+
+struct commands {
+    NCURSES_CONST char *text;
+    void (*function) (WINDOW *);
+};
+typedef struct commands COMMAND;
+
+static const COMMAND command[] =
+{
+    {"General Test", introTest},
+#if HAVE_NEWPAD
+    {"Pad Test", padTest},
+#endif
+#if defined(PDCURSES) && !defined(XCURSES)
+    {"Resize Test", resizeTest},
+#endif
+    {"Scroll Test", scrollTest},
+    {"Input Test", inputTest},
+    {"Output Test", outputTest}
+};
+#define MAX_OPTIONS (int) SIZEOF(command)
+
+static void
+display_menu(int old_option, int new_option)
+{
+    int i;
+
+    assert((new_option >= 0) && (new_option < MAX_OPTIONS));
+
+    (void) attrset(A_NORMAL);
+    MvAddStr(3, 20, "PDCurses Test Program");
+
+    for (i = 0; i < (int) MAX_OPTIONS; i++)
+	MvAddStr(5 + i, 25, command[i].text);
+
+    if ((old_option >= 0) && (old_option < MAX_OPTIONS))
+	MvAddStr(5 + old_option, 25, command[old_option].text);
+
+    (void) attrset(A_REVERSE);
+    MvAddStr(5 + new_option, 25, command[new_option].text);
+    (void) attrset(A_NORMAL);
+    MvAddStr(13, 3,
+	     "Use Up and Down Arrows to select - Enter to run - Q to quit");
+    refresh();
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: testcurs [options]"
+	,""
+	,USAGE_COMMON
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    WINDOW *win;
+    int old_option = (-1);
+    int new_option = 0;
+    bool quit = FALSE;
+    int n;
+    int ch;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) {
+	switch (ch) {
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind < argc)
+	usage(FALSE);
+
+    setlocale(LC_ALL, "");
+
+#ifdef PDCDEBUG
+    PDC_debug("testcurs started\n");
+#endif
+    if (!initTest(&win))
+	ExitProgram(EXIT_FAILURE);
+
+    erase();
+    display_menu(old_option, new_option);
+
+    for (;;) {
+	int key;
+
+#ifdef A_COLOR
+	if (has_colors()) {
+	    init_pair(1, COLOR_WHITE, COLOR_BLUE);
+	    wbkgd(win, (chtype) COLOR_PAIR(1));
+	} else
+	    wbkgd(win, A_REVERSE);
+#else
+	wbkgd(win, A_REVERSE);
+#endif
+	werase(win);
+
+	noecho();
+	keypad(stdscr, TRUE);
+	raw();
+	key = getch();
+	if (key < KEY_MIN && key > 0 && isalpha(key)) {
+	    if (islower(key))
+		key = toupper(key);
+	    for (n = 0; n < MAX_OPTIONS; ++n) {
+		if (key == command[n].text[0]) {
+		    display_menu(old_option, new_option = n);
+		    key = ' ';
+		    break;
+		}
+	    }
+	}
+	switch (key) {
+	case 10:
+	case 13:
+	case KEY_ENTER:
+	    erase();
+	    refresh();
+	    (*command[new_option].function) (win);
+	    erase();
+	    display_menu(old_option, new_option);
+	    break;
+	case KEY_UP:
+	    new_option = ((new_option == 0)
+			  ? new_option
+			  : new_option - 1);
+	    display_menu(old_option, new_option);
+	    break;
+	case KEY_DOWN:
+	    new_option = ((new_option == (MAX_OPTIONS - 1))
+			  ? new_option
+			  : new_option + 1);
+	    display_menu(old_option, new_option);
+	    break;
+	case 'Q':
+	case 'q':
+	    quit = TRUE;
+	    break;
+	default:
+	    beep();
+	    break;
+	case ' ':
+	    break;
+	}
+	if (quit == TRUE)
+	    break;
+    }
+
+    delwin(win);
+
+    stop_curses();
+#ifdef XCURSES
+    XCursesExit();
+#endif
+    ExitProgram(EXIT_SUCCESS);
+}
diff --git a/test/testscanw.c b/test/testscanw.c
new file mode 100644
index 0000000..415250c
--- /dev/null
+++ b/test/testscanw.c
@@ -0,0 +1,104 @@
+/****************************************************************************
+ * Copyright 2019-2020,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2002,2006 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.                                                           *
+ ****************************************************************************/
+/* gleaned from a web-search, shows a bug combining scanw and implicit scroll.
+ * Date:  1997/03/17
+ * From:  bayern@morpheus.cis.yale.edu
+ *
+ * $Id: testscanw.c,v 1.15 2022/12/11 00:10:29 tom Exp $
+ */
+#include <test.priv.h>
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: testscanw [options] tokens"
+	,""
+	,"Tokens are integers (starting line-number) or k+, k- to turn keypad on/off."
+	,""
+	,USAGE_COMMON
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    long badanswer = 1;
+    long *response = &badanswer;
+    int ch;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) {
+	switch (ch) {
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+
+    setlocale(LC_ALL, "");
+
+    initscr();
+    scrollok(stdscr, TRUE);
+    idlok(stdscr, TRUE);
+    echo();
+
+#if 0
+    curses_trace(TRACE_UPDATE | TRACE_CALLS);
+#endif
+    while (optind < argc) {
+	char *token = argv[optind++];
+	if (isdigit(UChar(*token)))
+	    move(atoi(token), 0);
+	else if (!strcmp(token, "k+"))
+	    keypad(stdscr, TRUE);
+	else if (!strcmp(token, "k-"))
+	    keypad(stdscr, FALSE);
+    }
+
+    while (badanswer) {
+	printw("Enter a number (0 to quit):\n");
+	printw("--> ");
+	scanw("%20ld", response);	/* yes, it's a pointer */
+    }
+    endwin();
+    ExitProgram(EXIT_SUCCESS);
+}
diff --git a/test/tput-colorcube b/test/tput-colorcube
new file mode 100755
index 0000000..67a4997
--- /dev/null
+++ b/test/tput-colorcube
@@ -0,0 +1,131 @@
+#!/bin/sh
+##############################################################################
+# Copyright 2020 Thomas E. Dickey                                            #
+# Copyright 2016 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: tput-colorcube,v 1.2 2020/02/02 23:34:34 tom Exp $
+# Use this script to print an xterm-style color cube, e.g., as done in
+# the xterm 88colors2.pl and 256colors2.pl scripts.
+
+failed() {
+	printf "?? $*\n" >&2
+	exit 1
+}
+
+newline() {
+	tput op
+	printf "\n"
+}
+
+if [ $# = 1 ]
+then
+	myterm=$1
+elif [ $# = 0 ]
+then
+	myterm=$TERM
+else
+	failed "expected one parameter or none"
+fi
+
+colors=$(tput -T $myterm colors 2>/dev/null)
+if [ ${colors:-0} -le 0 ]
+then
+	myterm=${myterm%%-color}
+	colors=$(tput -T $myterm colors 2>/dev/null)
+fi
+if [ ${colors:-0} -le 0 ]
+then
+	failed "terminal $myterm does not support color"
+fi
+
+printf "System colors:\n"
+
+color=0
+inrow=$colors
+to_do=$colors
+[ $colors -gt 256 ] && colors=256
+[ $inrow  -gt   8 ] && inrow=8
+[ $to_do  -gt  16 ] && to_do=16
+while [ $color -lt $to_do ]
+do
+	[ $color = $inrow ] && newline
+	tput setab $color
+	printf '  '
+	color=$(expr $color + 1)
+done
+newline
+
+[ $colors -le 16 ] && exit
+
+if [ $colors = 256 ]
+then
+	cube=6
+	ramp=232
+elif [ $colors -ge 88 ]
+then
+	cube=4
+	ramp=80
+else
+	exit
+fi
+
+printf "\n"
+printf "Color cube, ${cube}x${cube}x${cube}:\n"
+g=0
+cube2=$(expr $cube \* $cube)
+while [ $g -lt $cube ]
+do
+	r=0
+	while [ $r -lt $cube ]
+	do
+		b=0
+		while [ $b -lt $cube ]
+		do
+			color=$(expr 16 + \( $r \* $cube2 \) + \( $g \* $cube \) + $b)
+			tput setab $color
+			printf '  '
+			b=$(expr $b + 1)
+		done
+		tput op
+		printf ' '
+		r=$(expr $r + 1)
+	done
+	newline
+	g=$(expr $g + 1)
+done
+
+printf "\n"
+printf "Grayscale ramp:\n"
+color=$ramp
+while [ $color -lt $colors ]
+do
+	tput setab $color
+	printf '  '
+	color=$(expr $color + 1)
+done
+newline
+# vi:ts=4 sw=4
diff --git a/test/tput-initc b/test/tput-initc
new file mode 100755
index 0000000..9d71c4f
--- /dev/null
+++ b/test/tput-initc
@@ -0,0 +1,156 @@
+#!/bin/sh
+##############################################################################
+# Copyright 2020 Thomas E. Dickey                                            #
+# Copyright 2016 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: tput-initc,v 1.6 2020/02/02 23:34:34 tom Exp $
+# Some of the ".dat" files in ncurses' test-directory give r/g/b numbers for
+# default palettes of xterm and Linux console.  This script reads the numbers
+# and (assuming the same or compatible terminal) uses tput to (re)initialize
+# the palette using those numbers.
+
+failed() {
+	printf "?? $*\n" >&2
+	exit 1
+}
+
+usage() {
+	cat >&2 <<-EOF
+	usage: $0 [-r] [-s] [palette-data]
+
+	Use this script with a palette data-file to (re)initialize colors with
+	tput.  This script assumes arrangements for 16-, 88- and 256-colors
+	like the xterm 88colors2.pl and 256colors2.pl scripts.
+
+	Options:
+	 -r	reverse palette
+	 -s	reverse system colors (first 16 if more than 16 colors)
+EOF
+	exit 1
+}
+
+opt_r=no
+opt_s=no
+
+while getopts "rs" option "$@"
+do
+	case $option in
+	(r)
+		opt_r=yes
+		;;
+	(s)
+		opt_s=yes
+		;;
+	(*)
+		usage
+		;;
+	esac
+done
+shift $(expr $OPTIND - 1)
+
+if [ $# = 1 ]
+then
+	file=$1
+elif [ $# = 0 ]
+then
+	file=$TERM.dat
+else
+	failed "expected one parameter or none"
+fi
+
+if [ ! -f "$file" ]
+then
+	if [ -f "$file.dat" ]
+	then
+		file="$file.dat"
+	else
+		failed "no such file: $file"
+	fi
+fi
+
+myterm=${file%%.dat}
+colors=$(tput -T $myterm colors 2>/dev/null)
+if [ ${colors:-0} -le 0 ]
+then
+	myterm=${myterm%%-color}
+	colors=$(tput -T $myterm colors 2>/dev/null)
+fi
+if [ ${colors:-0} -le 0 ]
+then
+	failed "terminal $myterm does not support color"
+fi
+
+cat $file |\
+awk	-v opt_r=$opt_r \
+	-v opt_s=$opt_s \
+	-v colors=$colors \
+	-v myterm=$myterm '
+BEGIN {
+	limit = 1000;
+	range = -1;
+	cramp = -1;
+	if ( colors == 88 ) {
+		cramp = 80;
+	} else if ( colors = 256 ) {
+		cramp = 232;
+	}
+}
+function scaled(n) {
+	return (n * 1000)/limit;
+}
+
+/^scale:[0-9]+/{
+	sub("^scale:","",$0);
+	limit = $0;
+}
+
+/^[0-9]+:/{
+	sub(":","",$1);
+	item = $1 + 0;
+	if (range < item) {
+		range = item;
+	}
+	params[$1] = sprintf ("%d %d %d", scaled($2),scaled($3),scaled($4));
+}
+END {
+	for (n = 0; n <= range; ++n) {
+		m = n;
+		if ( opt_r == "yes" ) {
+			if ( colors <= 16 ) {
+				m = range - n;
+			} else if ( ( opt_s == "yes" ) && ( n < 16 ) ) {
+				m = 15 - n;
+			} else if ( n >= cramp ) {
+				m = cramp + colors - 1 - n;
+			} else {
+				m = 16 + cramp - 1 - n;
+			}
+		}
+		printf "tput -T%s initc %d %s\n", myterm, m, params[n];
+	}
+}
+' |sh -
diff --git a/test/tracemunch b/test/tracemunch
new file mode 100755
index 0000000..b2d3b03
--- /dev/null
+++ b/test/tracemunch
@@ -0,0 +1,939 @@
+#!/usr/bin/env perl
+# $Id: tracemunch,v 1.41 2021/09/04 10:31:03 tom Exp $
+##############################################################################
+# Copyright 2018-2020,2021 Thomas E. Dickey                                  #
+# Copyright 1998-2005,2017 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.                                                             #
+##############################################################################
+# tracemunch -- compactify ncurses trace logs
+#
+# The error logs produced by ncurses with tracing enabled can be very tedious
+# to wade through.  This script helps by compacting runs of log lines that
+# can be conveniently expressed as higher-level operations.
+
+use strict;
+use warnings;
+
+$| = 1;
+
+our $putattr =
+    'PutAttrChar\(\{\{ ' . "'(.)'"
+  . ' = 0[0-7]+ \}\}\) at \(([0-9]+), ([0-9]+)\)';
+our $waddnstr =
+'^called \{waddnstr\((0x[[:xdigit:]]+|window\d+),"((\\.|[^\"]*))",[-]?[0-9]+\)';
+
+our %TR = qw(
+  DISABLE       0x0000
+  TIMES         0x0001
+  TPUTS         0x0002
+  UPDATE        0x0004
+  MOVE          0x0008
+  CHARPUT       0x0010
+  ORDINARY      0x001F
+  CALLS         0x0020
+  VIRTPUT       0x0040
+  IEVENT        0x0080
+  BITS          0x0100
+  ICALLS        0x0200
+  CCALLS        0x0400
+  DATABASE      0x0800
+  ATTRS         0x1000
+);
+
+our $tracelevel = 0;
+
+our $tSCREEN   = 1;    # SCREEN*
+our $tWINDOW   = 2;    # WINDOW*
+our $tTERMINAL = 3;    # TERMINAL*
+our $tPANEL    = 4;    # PANEL*
+our $tFIELD    = 5;    # FIELD*
+our $tFORM     = 5;    # FORM*
+our $tMENU     = 6;    # MENU*
+our $tITEM     = 7;    # ITEM*
+
+our %known_p1_types = (
+    $tSCREEN   => "SCREEN*",
+    $tWINDOW   => "WINDOW*",
+    $tTERMINAL => "TERMINAL*",
+    $tPANEL    => "PANEL*",
+    $tFORM     => "FORM*",
+    $tFIELD    => "FIELD*",
+    $tMENU     => "MENU*",
+    $tITEM     => "ITEM*",
+);
+
+# If the trace is complete, we can infer addresses using the return value from
+# newwin, etc.  But if it is incomplete, we can still check for special cases
+# such as SCREEN* and WINDOW* parameters.  In this table, the type for the
+# first parameter is encoded, relying upon an ncurses programming convention:
+our %known_p1 = (
+    TransformLine          => $tSCREEN,
+    _nc_console_read       => $tSCREEN,
+    _nc_freewin            => $tWINDOW,
+    _nc_initscr            => $tSCREEN,
+    _nc_makenew            => $tSCREEN,
+    _nc_mingw_console_read => $tSCREEN,
+    _nc_reset_colors       => $tSCREEN,
+    _nc_scroll_optimize    => $tSCREEN,
+    _nc_tinfo              => $tSCREEN,
+    _nc_tinfo_mvcur        => $tSCREEN,
+    _nc_wgetch             => $tWINDOW,
+    adjust_window          => $tWINDOW,
+    assume_default_colors  => $tSCREEN,
+    attr_get               => $tWINDOW,
+    baudrate               => $tSCREEN,
+    beep                   => $tSCREEN,
+    border_set             => $tWINDOW,
+    bottom_panel           => $tPANEL,
+    bottom_panel           => $tPANEL,
+    box                    => $tWINDOW,
+    box_set                => $tWINDOW,
+    can_change_color       => $tSCREEN,
+    cbreak                 => $tSCREEN,
+    ceiling_panel          => $tSCREEN,
+    clearok                => $tWINDOW,
+    color_content          => $tSCREEN,
+    copywin                => $tWINDOW,
+    current_item           => $tMENU,
+    curs_set               => $tSCREEN,
+    decrease_size          => $tSCREEN,
+    def_prog_mode          => $tSCREEN,
+    def_shell_mode         => $tSCREEN,
+    define_key             => $tSCREEN,
+    del_curterm            => $tSCREEN,
+    del_panel              => $tPANEL,
+    del_panel              => $tPANEL,
+    delay_output           => $tSCREEN,
+    delscreen              => $tSCREEN,
+    delwin                 => $tWINDOW,
+    derwin                 => $tWINDOW,
+    doupdate               => $tSCREEN,
+    dup_field              => $tFIELD,
+    dupwin                 => $tWINDOW,
+    echo                   => $tSCREEN,
+    endwin                 => $tSCREEN,
+    erasechar              => $tSCREEN,
+    field_opts_off         => $tFIELD,
+    field_opts_on          => $tFIELD,
+    filter                 => $tSCREEN,
+    flash                  => $tSCREEN,
+    flushinp               => $tSCREEN,
+    form_driver            => $tFORM,
+    form_driver_w          => $tFORM,
+    form_opts_off          => $tFORM,
+    form_opts_on           => $tFORM,
+    free_field             => $tFIELD,
+    free_form              => $tFORM,
+    free_item              => $tITEM,
+    free_menu              => $tMENU,
+    getattrs               => $tWINDOW,
+    getbegx                => $tWINDOW,
+    getbegy                => $tWINDOW,
+    getbkgd                => $tWINDOW,
+    getcurx                => $tWINDOW,
+    getcury                => $tWINDOW,
+    getmaxx                => $tWINDOW,
+    getmaxy                => $tWINDOW,
+    getmouse               => $tSCREEN,
+    getparx                => $tWINDOW,
+    getpary                => $tWINDOW,
+    ground_panel           => $tSCREEN,
+    halfdelay              => $tSCREEN,
+    has_ic                 => $tSCREEN,
+    has_il                 => $tSCREEN,
+    has_key                => $tSCREEN,
+    hide_panel             => $tPANEL,
+    hide_panel             => $tPANEL,
+    idcok                  => $tWINDOW,
+    idlok                  => $tWINDOW,
+    immedok                => $tWINDOW,
+    increase_size          => $tSCREEN,
+    init_color             => $tSCREEN,
+    init_pair              => $tSCREEN,
+    intrflush              => $tSCREEN,
+    is_cleared             => $tWINDOW,
+    is_idcok               => $tWINDOW,
+    is_idlok               => $tWINDOW,
+    is_immedok             => $tWINDOW,
+    is_keypad              => $tWINDOW,
+    is_leaveok             => $tWINDOW,
+    is_linetouched         => $tWINDOW,
+    is_nodelay             => $tWINDOW,
+    is_notimeout           => $tWINDOW,
+    is_pad                 => $tWINDOW,
+    is_scrollok            => $tWINDOW,
+    is_subwin              => $tWINDOW,
+    is_syncok              => $tWINDOW,
+    is_term_resized        => $tSCREEN,
+    is_wintouched          => $tWINDOW,
+    item_count             => $tMENU,
+    item_description       => $tITEM,
+    item_index             => $tITEM,
+    item_init              => $tMENU,
+    item_name              => $tITEM,
+    item_opts              => $tITEM,
+    item_opts_off          => $tITEM,
+    item_opts_on           => $tITEM,
+    item_term              => $tMENU,
+    item_userptr           => $tITEM,
+    item_value             => $tITEM,
+    item_visible           => $tITEM,
+    key_defined            => $tSCREEN,
+    keybound               => $tSCREEN,
+    keyok                  => $tSCREEN,
+    keypad                 => $tWINDOW,
+    killchar               => $tSCREEN,
+    leaveok                => $tWINDOW,
+    link_field             => $tFIELD,
+    longname               => $tSCREEN,
+    menu_back              => $tMENU,
+    menu_driver            => $tMENU,
+    menu_fore              => $tMENU,
+    menu_format            => $tMENU,
+    menu_grey              => $tMENU,
+    menu_init              => $tMENU,
+    menu_items             => $tMENU,
+    menu_mark              => $tMENU,
+    menu_opts              => $tMENU,
+    menu_opts_off          => $tMENU,
+    menu_opts_on           => $tMENU,
+    menu_pad               => $tMENU,
+    menu_pattern           => $tMENU,
+    menu_spacing           => $tMENU,
+    menu_sub               => $tMENU,
+    menu_term              => $tMENU,
+    menu_userptr           => $tMENU,
+    menu_win               => $tMENU,
+    meta                   => $tWINDOW,
+    mouseinterval          => $tSCREEN,
+    mousemask              => $tSCREEN,
+    move_field             => $tFIELD,
+    move_panel             => $tPANEL,
+    move_panel             => $tPANEL,
+    mvcur                  => $tSCREEN,
+    mvderwin               => $tWINDOW,
+    mvwadd_wch             => $tWINDOW,
+    mvwadd_wchnstr         => $tWINDOW,
+    mvwadd_wchstr          => $tWINDOW,
+    mvwaddch               => $tWINDOW,
+    mvwaddchnstr           => $tWINDOW,
+    mvwaddchstr            => $tWINDOW,
+    mvwaddnstr             => $tWINDOW,
+    mvwaddnwstr            => $tWINDOW,
+    mvwaddstr              => $tWINDOW,
+    mvwaddwstr             => $tWINDOW,
+    mvwchgat               => $tWINDOW,
+    mvwdelch               => $tWINDOW,
+    mvwget_wch             => $tWINDOW,
+    mvwget_wstr            => $tWINDOW,
+    mvwgetch               => $tWINDOW,
+    mvwgetn_wstr           => $tWINDOW,
+    mvwgetnstr             => $tWINDOW,
+    mvwgetstr              => $tWINDOW,
+    mvwhline               => $tWINDOW,
+    mvwhline_set           => $tWINDOW,
+    mvwin                  => $tWINDOW,
+    mvwin_wch              => $tWINDOW,
+    mvwin_wchnstr          => $tWINDOW,
+    mvwin_wchstr           => $tWINDOW,
+    mvwinch                => $tWINDOW,
+    mvwinchnstr            => $tWINDOW,
+    mvwinchstr             => $tWINDOW,
+    mvwins_nwstr           => $tWINDOW,
+    mvwins_wch             => $tWINDOW,
+    mvwins_wstr            => $tWINDOW,
+    mvwinsch               => $tWINDOW,
+    mvwinsnstr             => $tWINDOW,
+    mvwinsstr              => $tWINDOW,
+    mvwinstr               => $tWINDOW,
+    mvwinwstr              => $tWINDOW,
+    mvwvline               => $tWINDOW,
+    mvwvline_set           => $tWINDOW,
+    new_panel              => $tWINDOW,
+    new_panel              => $tWINDOW,
+    newpad                 => $tSCREEN,
+    newterm                => $tSCREEN,
+    newwin                 => $tSCREEN,
+    nl                     => $tSCREEN,
+    nocbreak               => $tSCREEN,
+    nodelay                => $tWINDOW,
+    noecho                 => $tSCREEN,
+    nofilter               => $tSCREEN,
+    nonl                   => $tSCREEN,
+    noqiflush              => $tSCREEN,
+    noraw                  => $tSCREEN,
+    notimeout              => $tWINDOW,
+    overlap                => $tWINDOW,
+    overlay                => $tWINDOW,
+    overwrite              => $tWINDOW,
+    pair_content           => $tSCREEN,
+    panel_above            => $tPANEL,
+    panel_above            => $tPANEL,
+    panel_below            => $tPANEL,
+    panel_below            => $tPANEL,
+    panel_hidden           => $tPANEL,
+    panel_hidden           => $tPANEL,
+    panel_userptr          => $tPANEL,
+    panel_userptr          => $tPANEL,
+    panel_window           => $tPANEL,
+    panel_window           => $tPANEL,
+    pecho_wchar            => $tWINDOW,
+    pechochar              => $tWINDOW,
+    pnoutrefresh           => $tWINDOW,
+    pos_form_cursor        => $tFORM,
+    pos_menu_cursor        => $tMENU,
+    post_form              => $tFORM,
+    post_menu              => $tMENU,
+    putwin                 => $tWINDOW,
+    qiflush                => $tSCREEN,
+    raw                    => $tSCREEN,
+    redrawwin              => $tWINDOW,
+    replace_panel          => $tPANEL,
+    replace_panel          => $tPANEL,
+    reset_prog_mode        => $tSCREEN,
+    reset_shell_mode       => $tSCREEN,
+    resetty                => $tSCREEN,
+    resize_term            => $tSCREEN,
+    resizeterm             => $tSCREEN,
+    restartterm            => $tSCREEN,
+    ripoffline             => $tSCREEN,
+    savetty                => $tSCREEN,
+    scale_menu             => $tMENU,
+    scr_init               => $tSCREEN,
+    scr_restore            => $tSCREEN,
+    scr_set                => $tSCREEN,
+    scroll                 => $tWINDOW,
+    scrollok               => $tWINDOW,
+    set_current_field      => $tFORM,
+    set_current_item       => $tMENU,
+    set_curterm            => $tTERMINAL,
+    set_field_back         => $tFIELD,
+    set_field_buffer       => $tFIELD,
+    set_field_fore         => $tFIELD,
+    set_field_init         => $tFORM,
+    set_field_just         => $tFIELD,
+    set_field_opts         => $tFIELD,
+    set_field_pad          => $tFIELD,
+    set_field_status       => $tFIELD,
+    set_field_term         => $tFORM,
+    set_field_type         => $tFIELD,
+    set_field_userptr      => $tFIELD,
+    set_form_fields        => $tFORM,
+    set_form_init          => $tFORM,
+    set_form_opts          => $tFORM,
+    set_form_page          => $tFORM,
+    set_form_sub           => $tFORM,
+    set_form_term          => $tFORM,
+    set_form_userptr       => $tFORM,
+    set_form_win           => $tFORM,
+    set_item_init          => $tMENU,
+    set_item_opts          => $tITEM,
+    set_item_term          => $tMENU,
+    set_item_userptr       => $tITEM,
+    set_item_value         => $tITEM,
+    set_menu_back          => $tMENU,
+    set_menu_fore          => $tMENU,
+    set_menu_format        => $tMENU,
+    set_menu_grey          => $tMENU,
+    set_menu_init          => $tMENU,
+    set_menu_items         => $tMENU,
+    set_menu_mark          => $tMENU,
+    set_menu_opts          => $tMENU,
+    set_menu_pad           => $tMENU,
+    set_menu_pattern       => $tMENU,
+    set_menu_spacing       => $tMENU,
+    set_menu_sub           => $tMENU,
+    set_menu_term          => $tMENU,
+    set_menu_userptr       => $tMENU,
+    set_menu_win           => $tMENU,
+    set_new_page           => $tFIELD,
+    set_panel_userptr      => $tPANEL,
+    set_panel_userptr      => $tPANEL,
+    set_term               => $tSCREEN,
+    set_top_row            => $tMENU,
+    show_panel             => $tPANEL,
+    show_panel             => $tPANEL,
+    slk_attr               => $tSCREEN,
+    slk_attr_set           => $tSCREEN,
+    slk_attroff            => $tSCREEN,
+    slk_attron             => $tSCREEN,
+    slk_attrset            => $tSCREEN,
+    slk_clear              => $tSCREEN,
+    slk_color              => $tSCREEN,
+    slk_init               => $tSCREEN,
+    slk_label              => $tSCREEN,
+    slk_noutrefresh        => $tSCREEN,
+    slk_refresh            => $tSCREEN,
+    slk_restore            => $tSCREEN,
+    slk_set                => $tSCREEN,
+    slk_touch              => $tSCREEN,
+    start_color            => $tSCREEN,
+    subwin                 => $tWINDOW,
+    syncok                 => $tWINDOW,
+    termattrs              => $tSCREEN,
+    termname               => $tSCREEN,
+    tgetflag               => $tSCREEN,
+    tgetnum                => $tSCREEN,
+    tigetflag              => $tSCREEN,
+    tigetnum               => $tSCREEN,
+    tigetstr               => $tSCREEN,
+    tinfo                  => $tSCREEN,
+    top_panel              => $tPANEL,
+    top_panel              => $tPANEL,
+    top_row                => $tMENU,
+    touchline              => $tWINDOW,
+    touchwin               => $tWINDOW,
+    typeahead              => $tSCREEN,
+    unfocus_current_field  => $tFORM,
+    unget_wch              => $tSCREEN,
+    ungetch                => $tSCREEN,
+    ungetmouse             => $tSCREEN,
+    unpost_form            => $tFORM,
+    unpost_menu            => $tMENU,
+    untouchwin             => $tWINDOW,
+    update_panels_sp       => $tSCREEN,
+    use_default_colors     => $tSCREEN,
+    use_env                => $tSCREEN,
+    use_legacy_coding      => $tSCREEN,
+    use_screen             => $tSCREEN,
+    use_tioctl             => $tSCREEN,
+    use_window             => $tWINDOW,
+    vidattr                => $tSCREEN,
+    vidputs                => $tSCREEN,
+    vw_printw              => $tWINDOW,
+    vwprintw               => $tWINDOW,
+    wadd_wch               => $tWINDOW,
+    wadd_wchnstr           => $tWINDOW,
+    wadd_wchstr            => $tWINDOW,
+    waddch                 => $tWINDOW,
+    waddchnstr             => $tWINDOW,
+    waddchstr              => $tWINDOW,
+    waddnstr               => $tWINDOW,
+    waddnwstr              => $tWINDOW,
+    waddstr                => $tWINDOW,
+    waddwstr               => $tWINDOW,
+    wattr_get              => $tWINDOW,
+    wattr_off              => $tWINDOW,
+    wattr_on               => $tWINDOW,
+    wattr_set              => $tWINDOW,
+    wattroff               => $tWINDOW,
+    wattron                => $tWINDOW,
+    wattrset               => $tWINDOW,
+    wbkgd                  => $tWINDOW,
+    wbkgdset               => $tWINDOW,
+    wborder                => $tWINDOW,
+    wborder_set            => $tWINDOW,
+    wchgat                 => $tWINDOW,
+    wclear                 => $tWINDOW,
+    wclrtobot              => $tWINDOW,
+    wclrtoeol              => $tWINDOW,
+    wcolor_set             => $tWINDOW,
+    wcursyncup             => $tWINDOW,
+    wdelch                 => $tWINDOW,
+    wdeleteln              => $tWINDOW,
+    wechochar              => $tWINDOW,
+    wenclose               => $tWINDOW,
+    werase                 => $tWINDOW,
+    wget_wch               => $tWINDOW,
+    wget_wstr              => $tWINDOW,
+    wgetbkgrnd             => $tWINDOW,
+    wgetch                 => $tWINDOW,
+    wgetch_events          => $tWINDOW,
+    wgetdelay              => $tWINDOW,
+    wgetn_wstr             => $tWINDOW,
+    wgetnstr               => $tWINDOW,
+    wgetparent             => $tWINDOW,
+    wgetscrreg             => $tWINDOW,
+    wgetstr                => $tWINDOW,
+    whline                 => $tWINDOW,
+    whline_set             => $tWINDOW,
+    win_wch                => $tWINDOW,
+    win_wchnstr            => $tWINDOW,
+    win_wchstr             => $tWINDOW,
+    winch                  => $tWINDOW,
+    winchnstr              => $tWINDOW,
+    winchstr               => $tWINDOW,
+    winnstr                => $tWINDOW,
+    winnwstr               => $tWINDOW,
+    wins_nwstr             => $tWINDOW,
+    wins_wch               => $tWINDOW,
+    wins_wstr              => $tWINDOW,
+    winsch                 => $tWINDOW,
+    winsdelln              => $tWINDOW,
+    winsertln              => $tWINDOW,
+    winsnstr               => $tWINDOW,
+    winsstr                => $tWINDOW,
+    winstr                 => $tWINDOW,
+    winwstr                => $tWINDOW,
+    wmouse_trafo           => $tWINDOW,
+    wmove                  => $tWINDOW,
+    wnoutrefresh           => $tWINDOW,
+    wprintw                => $tWINDOW,
+    wredrawln              => $tWINDOW,
+    wrefresh               => $tWINDOW,
+    wresize                => $tWINDOW,
+    wscrl                  => $tWINDOW,
+    wsetscrreg             => $tWINDOW,
+    wstandend              => $tWINDOW,
+    wstandout              => $tWINDOW,
+    wsyncdown              => $tWINDOW,
+    wsyncup                => $tWINDOW,
+    wtimeout               => $tWINDOW,
+    wtouchln               => $tWINDOW,
+    wvline                 => $tWINDOW,
+);
+
+our $fld_nums = 0;
+our $frm_nums = 0;
+our $itm_nums = 0;
+our $mnu_nums = 0;
+our $pan_nums = 0;
+our $scr_nums = 0;
+our $thr_nums = 0;
+our $trm_nums = 0;
+our $try_nums = 0;
+our $usr_nums = 0;
+our $win_nums = 0;
+
+our $curscr = "";
+our $newscr = "";
+our $stdscr = "";
+
+our %fld_addr;    # FIELD*
+our %frm_addr;    # FORM*
+our %itm_addr;    # ITEM*
+our %mnu_addr;    # MENU*
+our %pan_addr;    # PANEL*
+our %scr_addr;    # SCREEN*
+our %thr_addr;    # thread-id
+our %trm_addr;    # TERMINAL*
+our %try_addr;    # tries-number
+our %usr_addr;    # user-pointer
+our %win_addr;    # WINDOW*
+
+sub has_addr($) {
+    my $value  = shift;
+    my $result = 0;
+    $result = 1 if ( $value =~ /\b0x[[:xdigit:]]+\b/i );
+    return $result;
+}
+
+sub transaddr($) {
+    my $arg = shift;
+    my $n;
+
+    $arg =~ s/\b$curscr\b/curscr/g if ($curscr);
+    $arg =~ s/\b$newscr\b/newscr/g if ($newscr);
+    $arg =~ s/\b$stdscr\b/stdscr/g if ($stdscr);
+    if ( &has_addr($arg) ) {
+        foreach my $addr ( keys %fld_addr ) {
+            $n = $fld_addr{$addr};
+            $arg =~ s/\b$addr\b/field$n/g if ( defined $n );
+        }
+    }
+    if ( &has_addr($arg) ) {
+        foreach my $addr ( keys %frm_addr ) {
+            $n = $frm_addr{$addr};
+            $arg =~ s/\b$addr\b/form$n/g if ( defined $n );
+        }
+    }
+    if ( &has_addr($arg) ) {
+        foreach my $addr ( keys %itm_addr ) {
+            $n = $itm_addr{$addr};
+            $arg =~ s/\b$addr\b/item$n/g if ( defined $n );
+        }
+    }
+    if ( &has_addr($arg) ) {
+        foreach my $addr ( keys %mnu_addr ) {
+            $n = $mnu_addr{$addr};
+            $arg =~ s/\b$addr\b/menu$n/g if ( defined $n );
+        }
+    }
+    if ( &has_addr($arg) ) {
+        foreach my $addr ( keys %pan_addr ) {
+            $n = $pan_addr{$addr};
+            $arg =~ s/\b$addr\b/panel$n/g if ( defined $n );
+        }
+    }
+    if ( &has_addr($arg) ) {
+        foreach my $addr ( keys %scr_addr ) {
+            $n = $scr_addr{$addr};
+            $arg =~ s/\b$addr\b/screen$n/g if ( defined $n );
+        }
+    }
+    if ( &has_addr($arg) ) {
+        foreach my $addr ( keys %thr_addr ) {
+            $n = $thr_addr{$addr};
+            $arg =~ s/\b$addr\b/thread$n/g if ( defined $n );
+        }
+    }
+    if ( &has_addr($arg) ) {
+        foreach my $addr ( keys %trm_addr ) {
+            $n = $trm_addr{$addr};
+            $arg =~ s/\b$addr\b/terminal$n/g if ( defined $n );
+        }
+    }
+    if ( &has_addr($arg) ) {
+        foreach my $addr ( keys %try_addr ) {
+            $n = $try_addr{$addr};
+            $arg =~ s/\b$addr\b/tries_$n/g if ( defined $n );
+        }
+    }
+    if ( &has_addr($arg) ) {
+        foreach my $addr ( keys %usr_addr ) {
+            $n = $usr_addr{$addr};
+            $arg =~ s/\b$addr\b/user_ptr$n/g if ( defined $n );
+        }
+    }
+    if ( &has_addr($arg) ) {
+        foreach my $addr ( keys %win_addr ) {
+            $n = $win_addr{$addr};
+            $arg =~ s/\b$addr\b/window$n/g if ( defined $n );
+        }
+    }
+    if ( &has_addr($arg) ) {
+        if ( $arg =~ /add_wch\((window\d+,)?0x[[:xdigit:]]+\)/i ) {
+            $arg =~ s/(0x[[:xdigit:]]+)[)]/\&wch)/i;
+        }
+        elsif (
+            $arg =~ /color_content\((screen\d+,)?\d+(,0x[[:xdigit:]]+){3}/i )
+        {
+            $arg =~ s/(,0x[[:xdigit:]]+){3}[)]/,\&r,\&g,\&b)/i;
+        }
+        elsif ( $arg =~ /pair_content\((screen\d+,)?\d+(,0x[[:xdigit:]]+){2}/i )
+        {
+            $arg =~ s/(,0x[[:xdigit:]]+){2}[)]/,\&fg,\&bg)/i;
+        }
+    }
+    if ( &has_addr($arg) and $arg =~ /called\s+\{/ ) {
+        my $func = $arg;
+        chomp $func;
+        $func =~ s/^.*called\s+\{([[:alnum:]_]+)\(.*$/$1/;
+        if ( defined $known_p1{$func} ) {
+            my $addr = $arg;
+            my $type = $known_p1{$func};
+            chomp $addr;
+            $addr =~ s/^[^(]+\((0x[[:xdigit:]]+).*$/$1/i;
+            if ( $addr !~ /^0x[[:xdigit:]]+$/i ) {
+                if ( $type == $tSCREEN and $addr =~ /^[^(]+\(screen\d+[,)]/ ) {
+
+                    # ignore
+                }
+                elsif ( $type == $tWINDOW
+                    and $addr =~
+                    /^[^(]+\((stdscr|newscr|curscr|window\d+)[,)]/ )
+                {
+
+                    # ignore
+                }
+                elsif ( $type == $tTERMINAL
+                    and $addr =~ /^[^(]+\(terminal\d+[,)]/ )
+                {
+                    # ignore
+                }
+                elsif ( $type == $tPANEL and $addr =~ /^[^(]+\(panel\d+[,)]/ ) {
+
+                    # ignore
+                }
+                elsif ( $type == $tFIELD and $addr =~ /^[^(]+\(field\d+[,)]/ ) {
+
+                    # ignore
+                }
+                elsif ( $type == $tMENU and $addr =~ /^[^(]+\(menu\d+[,)]/ ) {
+
+                    # ignore
+                }
+                elsif ( $type == $tITEM and $addr =~ /^[^(]+\(item\d+[,)]/ ) {
+
+                    # ignore
+                }
+                else {
+                    printf "OOPS - expected type \"%s\", skipping\n>>$addr\n",
+                      $known_p1_types{$type};
+                }
+            }
+            elsif ( $type == $tSCREEN ) {
+                $scr_addr{$addr} = ++$scr_nums;
+                $arg = &transaddr($arg);
+            }
+            elsif ( $type == $tWINDOW ) {
+                $win_addr{$addr} = ++$win_nums;
+                $arg = &transaddr($arg);
+            }
+            elsif ( $type == $tTERMINAL ) {
+                $trm_addr{$addr} = ++$trm_nums;
+                $arg = &transaddr($arg);
+            }
+            elsif ( $type == $tPANEL ) {
+                $pan_addr{$addr} = ++$pan_nums;
+                $arg = &transaddr($arg);
+            }
+            elsif ( $type == $tFIELD ) {
+                $fld_addr{$addr} = ++$fld_nums;
+                $arg = &transaddr($arg);
+            }
+            elsif ( $type == $tFORM ) {
+                $frm_addr{$addr} = ++$frm_nums;
+                $arg = &transaddr($arg);
+            }
+            elsif ( $type == $tMENU ) {
+                $mnu_addr{$addr} = ++$mnu_nums;
+                $arg = &transaddr($arg);
+            }
+            elsif ( $type == $tITEM ) {
+                $itm_addr{$addr} = ++$itm_nums;
+                $arg = &transaddr($arg);
+            }
+        }
+    }
+
+    return $arg;
+}
+
+sub muncher($) {
+    my $STDIN = shift;
+
+    while (<$STDIN>) {
+        my $addr;
+        my $n;
+        my $awaiting = "";
+
+      CLASSIFY: {
+
+            next unless $_;
+
+            # just in case someone tries a file with cr/lf line-endings:
+            $_ =~ s/\r\n/\n/g;
+            $_ =~ s/\r/\n/g;
+
+            if ( $_ =~
+                /^TRACING NCURSES version.*\(tracelevel=(0x[[:xdigit:]]+)\)/ )
+            {
+                $tracelevel = hex $1;
+                print;
+                next;
+            }
+
+            my $thread = "";
+            if ( $_ =~ /^(0x[[:xdigit:]]+):/ ) {
+                $thr_addr{$1} = ++$thr_nums unless defined $thr_addr{$1};
+                $thread = "thread" . $thr_addr{$1} . ":";
+                $_ =~ s/^[^:]*://;
+            }
+
+            # Transform window pointer addresses to make it easier to compare logs
+            $awaiting = "curscr" if ( $_ =~ /creating curscr/ );
+            $awaiting = "newscr" if ( $_ =~ /creating newscr/ );
+            $awaiting = "stdscr" if ( $_ =~ /creating stdscr/ );
+            $awaiting = "screen" if ( $_ =~ /^(\+ )*called \{new_prescr\(\)/ );
+            if ( $_ =~ /^create :window 0x([[:xdigit:]]+)/ ) {
+                $addr = "0x$1";
+                if ( $awaiting eq "curscr" ) {
+                    $curscr = $addr;
+                }
+                elsif ( $awaiting eq "newscr" ) {
+                    $newscr = $addr;
+                }
+                elsif ( $awaiting eq "stdscr" ) {
+                    $stdscr = $addr;
+                }
+                else {
+                    $win_addr{$addr} = $win_nums++;
+                }
+                $awaiting = "";
+            }
+            elsif ( $_ =~ /^create :(root|new)_panel 0x([[:xdigit:]]+)/ ) {
+                $addr            = "0x$2";
+                $pan_addr{$addr} = $pan_nums++;
+                $_               = &transaddr($_);
+            }
+            elsif ( $_ =~ /^create :user_ptr 0x([[:xdigit:]]+)/ ) {
+                $addr            = "0x$1";
+                $usr_addr{$addr} = $usr_nums++;
+                $_               = &transaddr($_);
+            }
+            elsif ( $_ =~ /^create :field 0x([[:xdigit:]]+)/ ) {
+                $addr            = "0x$1";
+                $fld_addr{$addr} = $fld_nums++;
+                $_               = &transaddr($_);
+            }
+            elsif ( $_ =~ /^create :form 0x([[:xdigit:]]+)/ ) {
+                $addr            = "0x$1";
+                $frm_addr{$addr} = $frm_nums++;
+                $_               = &transaddr($_);
+            }
+            elsif ( $_ =~ /^create :menu 0x([[:xdigit:]]+)/ ) {
+                $addr            = "0x$1";
+                $mnu_addr{$addr} = $mnu_nums++;
+                $_               = &transaddr($_);
+            }
+            elsif ( $_ =~ /^create :item 0x([[:xdigit:]]+)/ ) {
+                $addr            = "0x$1";
+                $itm_addr{$addr} = $itm_nums++;
+                $_               = &transaddr($_);
+            }
+            elsif ( $_ =~ /^(\+ )*called \{set_curterm\((0x[[:xdigit:]]+)\)/ ) {
+                $trm_addr{$2} = ++$trm_nums unless defined $trm_addr{$2};
+            }
+            elsif ( $_ =~ /^(\+ )*called \{_nc_add_to_try\((0x[[:xdigit:]]+),/ )
+            {
+                $try_addr{$2} = ++$try_nums unless defined $try_addr{$2};
+            }
+            elsif ( $_ =~ /^(\+ )*_nc_alloc_screen_sp 0x([[:xdigit:]]+)/ ) {
+                $addr = "0x$2";
+                $scr_addr{$addr} = ++$scr_nums unless ( $scr_addr{$addr} );
+                $awaiting = "";
+            }
+            elsif ( $_ =~ /^(\+ )*return }0x([[:xdigit:]]+)/ ) {
+                $addr = "0x$2";
+                if ( $awaiting eq "screen" ) {
+                    $scr_addr{$addr} = ++$scr_nums unless ( $scr_addr{$addr} );
+                }
+            }
+            elsif ( $_ =~ /^\.\.\.deleted win=0x([[:xdigit:]]+)/ ) {
+                $addr = "0x$1";
+                $_    = &transaddr($_);
+                if ( $addr eq $curscr ) {
+                    $curscr = "";
+                }
+                elsif ( $addr eq $newscr ) {
+                    $newscr = "";
+                }
+                elsif ( $addr eq $stdscr ) {
+                    $stdscr = "";
+                }
+                else {
+                    undef $win_addr{$addr};
+                }
+            }
+            elsif ( $_ =~ /^\.\.\.deleted pan=\"0x([[:xdigit:]]+)\"/ ) {
+                $addr = "0x$1";
+                $_    = &transaddr($_);
+                undef $pan_addr{$addr};
+            }
+            elsif ( $_ =~ /^([+ ])*called \{free_field\(0x([[:xdigit:]]+)\)/ ) {
+                $addr = "0x$2";
+                $_    = &transaddr($_);
+                undef $fld_addr{$addr};
+            }
+            elsif ( $_ =~ /^([+ ])*called \{free_form\(0x([[:xdigit:]]+)\)/ ) {
+                $addr = "0x$2";
+                $_    = &transaddr($_);
+                undef $frm_addr{$addr};
+            }
+            elsif ( $_ =~ /^([+ ])*called \{free_menu\(0x([[:xdigit:]]+)\)/ ) {
+                $addr = "0x$2";
+                $_    = &transaddr($_);
+                undef $mnu_addr{$addr};
+            }
+            elsif ( $_ =~ /^([+ ])*called \{free_item\(0x([[:xdigit:]]+)\)/ ) {
+                $addr = "0x$2";
+                $_    = &transaddr($_);
+                undef $itm_addr{$addr};
+            }
+
+            # Compactify runs of PutAttrChar
+            if ( ( ( $tracelevel & $TR{CHARPUT} ) != 0 ) and $_ =~ /$putattr/ )
+            {
+                my $putattr_chars = $1;
+                my $starty        = $2;
+                my $startx        = $3;
+                while (<$STDIN>) {
+                    if ( $_ =~ /$putattr/ ) {
+                        $putattr_chars .= $1;
+                    }
+                    else {
+                        next if ( $_ =~ /^PUTC 0x[[:xdigit:]]+.*/ );
+                        next if ( $_ =~ /^\.\.\.skip.*/ );
+                        next if ( $_ =~ /^forced to blank.*/ );
+                        last;
+                    }
+                }
+                print "RUN of PutAttrChar()s:"
+                  . " \"$putattr_chars\" from ${starty}, ${startx}\n";
+                redo CLASSIFY;
+            }
+
+            # Compactify runs of waddnstr calls
+            if ( ( ( $tracelevel & $TR{CALLS} ) != 0 ) and $_ =~ /$waddnstr/ ) {
+                my $waddnstr_chars = $2;
+                my $winaddr        = $1;
+                while (<$STDIN>) {
+                    next if ( $_ =~ /^return \}0/ );
+                    if ( $_ =~ /$waddnstr/ && $1 eq $winaddr ) {
+                        $waddnstr_chars .= $2;
+                    }
+                    else {
+                        last;
+                    }
+                }
+                my $winaddstr = &transaddr($winaddr);
+                print "RUN of waddnstr()s:"
+                  . " $winaddstr, \"$waddnstr_chars\"\n";
+                redo CLASSIFY;
+            }
+
+            # More transformations can go here
+
+            # Repeated runs of anything
+            my $anyline     = &transaddr($_);
+            my $repeatcount = 1;
+            while (<$STDIN>) {
+                if ( &transaddr($_) eq $anyline ) {
+                    $repeatcount++;
+                }
+                else {
+                    last;
+                }
+            }
+            if ( $repeatcount > 1 ) {
+                print "${repeatcount} REPEATS OF $anyline";
+            }
+            else {
+                print $thread . $anyline;
+            }
+            redo CLASSIFY if $_;
+
+        }    # :CLASSIFY
+    }
+}
+
+for my $tr ( keys %TR ) {
+    $TR{$tr} = hex $TR{$tr};
+}
+
+if ( $#ARGV >= 0 ) {
+    while ( $#ARGV >= 0 ) {
+        my $file = shift @ARGV;
+        open my $ifh, "<", $file or die $!;
+        &muncher($ifh);
+    }
+}
+else {
+    &muncher( \*STDIN );
+}
+
+# tracemunch ends here
diff --git a/test/view.c b/test/view.c
new file mode 100644
index 0000000..72e0cfb
--- /dev/null
+++ b/test/view.c
@@ -0,0 +1,669 @@
+/****************************************************************************
+ * Copyright 2019-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+/*
+ * view.c -- a silly little viewer program
+ *
+ * written by Eric S. Raymond <esr@snark.thyrsus.com> December 1994
+ * to test the scrolling code in ncurses.
+ *
+ * modified by Thomas Dickey <dickey@clark.net> July 1995 to demonstrate
+ * the use of 'resizeterm()', and May 2000 to illustrate wide-character
+ * handling.  This program intentionally does not use pads, to allow testing
+ * with less-capable implementations of curses.
+ *
+ * Takes a filename argument.  It's a simple file-viewer with various
+ * scroll-up and scroll-down commands.
+ *
+ * n	-- scroll one line forward
+ * p	-- scroll one line back
+ *
+ * Either command accepts a numeric prefix interpreted as a repeat count.
+ * Thus, typing `5n' should scroll forward 5 lines in the file.
+ *
+ * The way you can tell this is working OK is that, in the trace file,
+ * there should be one scroll operation plus a small number of line
+ * updates, as opposed to a whole-page update.  This means the physical
+ * scroll operation worked, and the refresh() code only had to do a
+ * partial repaint.
+ *
+ * $Id: view.c,v 1.145 2022/12/04 00:40:11 tom Exp $
+ */
+
+#include <test.priv.h>
+#include <widechars.h>
+#include <popup_msg.h>
+
+#include <sys/stat.h>
+#include <time.h>
+
+static GCC_NORETURN void finish(int sig);
+
+#define my_pair 1
+
+static int shift = 0;
+static bool try_color = FALSE;
+
+static char *fname;
+static NCURSES_CH_T **vec_lines;
+static NCURSES_CH_T **lptr;
+static int num_lines;
+
+#if USE_WIDEC_SUPPORT
+static bool n_option = FALSE;
+#endif
+
+static GCC_NORETURN void
+failed(const char *msg)
+{
+    endwin();
+    fprintf(stderr, "%s\n", msg);
+    ExitProgram(EXIT_FAILURE);
+}
+
+static int
+ch_len(NCURSES_CH_T *src)
+{
+    int result = 0;
+
+#if USE_WIDEC_SUPPORT
+    for (;;) {
+	int count;
+	TEST_CCHAR(src, count, {
+	    int len = wcwidth(test_wch[0]);
+	    result += (len > 0) ? len : 1;
+	    ++src;
+	}
+	, {
+	    break;
+	})
+    }
+#else
+    while (*src++)
+	result++;
+#endif
+    return result;
+}
+
+static void
+finish(int sig)
+{
+    endwin();
+#if NO_LEAKS
+    if (vec_lines != 0) {
+	int n;
+	for (n = 0; n < num_lines; ++n) {
+	    free(vec_lines[n]);
+	}
+	free(vec_lines);
+    }
+#endif
+    ExitProgram(sig != 0 ? EXIT_FAILURE : EXIT_SUCCESS);
+}
+
+static void
+show_all(const char *tag)
+{
+    int i;
+    int digits;
+    char temp[BUFSIZ];
+    time_t this_time;
+
+    for (digits = 1, i = num_lines; i > 0; i /= 10) {
+	++digits;
+    }
+
+    _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp))
+		"view %.*s", (int) strlen(tag), tag);
+    i = (int) strlen(temp);
+    _nc_SPRINTF(temp + i, _nc_SLIMIT(sizeof(temp) - (size_t) i)
+		" %.*s", (int) sizeof(temp) - i - 2, fname);
+    move(0, 0);
+    printw("%.*s", COLS, temp);
+    clrtoeol();
+    this_time = time((time_t *) 0);
+    _nc_STRNCPY(temp, ctime(&this_time), (size_t) 30);
+    if ((i = (int) strlen(temp)) != 0) {
+	temp[--i] = 0;
+	if (move(0, COLS - i - 2) != ERR)
+	    printw("  %s", temp);
+    }
+
+    scrollok(stdscr, FALSE);	/* prevent screen from moving */
+    for (i = 1; i < LINES; i++) {
+	NCURSES_CH_T *s;
+	int len;
+	int actual = (int) (lptr + i - vec_lines);
+
+	if (actual > num_lines) {
+	    if (i < LINES - 1) {
+		int y, x;
+		getyx(stdscr, y, x);
+		move(i, 0);
+		clrtobot();
+		move(y, x);
+	    }
+	    break;
+	}
+	move(i, 0);
+	printw("%*d:", digits, actual);
+	clrtoeol();
+	if ((s = lptr[i - 1]) == 0) {
+	    continue;
+	}
+	len = ch_len(s);
+	if (len > shift) {
+#if USE_WIDEC_SUPPORT
+	    /*
+	     * An index into an array of cchar_t's is not necessarily the same
+	     * as the column-offset.  A pad would do this directly.  Here we
+	     * must translate (or compute a table of offsets).
+	     */
+	    {
+		int j;
+		int width = 1;
+
+		for (j = actual = 0; j < shift; ++j) {
+		    int count;
+
+		    TEST_CCHAR(s + j, count, {
+			width = wcwidth(test_wch[0]);
+		    }
+		    , {
+			width = 1;
+		    });
+		    actual += width;
+		    if (actual > shift) {
+			break;
+		    } else if (actual == shift) {
+			++j;
+			break;
+		    }
+		}
+		if (actual < len) {
+		    if (actual > shift)
+			addch('<');
+		    add_wchstr(s + j + (actual > shift));
+		}
+	    }
+#else
+	    addchstr(s + shift);
+#endif
+	}
+#if defined(NCURSES_VERSION) || defined(HAVE_WCHGAT)
+	if (try_color)
+	    wchgat(stdscr, -1, WA_NORMAL, my_pair, NULL);
+#endif
+    }
+    setscrreg(1, LINES - 1);
+    scrollok(stdscr, TRUE);
+    refresh();
+}
+
+static void
+read_file(const char *filename)
+{
+    FILE *fp;
+    int pass;
+    int k;
+    int width;
+    size_t j;
+    size_t len;
+    struct stat sb;
+    char *my_blob;
+    char **my_vec = 0;
+    WINDOW *my_win;
+
+    if (stat(filename, &sb) != 0
+	|| (sb.st_mode & S_IFMT) != S_IFREG) {
+	failed("input is not a file");
+    }
+
+    if (sb.st_size == 0) {
+	failed("input is empty");
+    }
+
+    if ((fp = fopen(filename, "r")) == 0) {
+	failed("cannot open input-file");
+    }
+
+    if ((my_blob = malloc((size_t) sb.st_size + 1)) == 0) {
+	failed("cannot allocate memory for input-file");
+    }
+
+    len = fread(my_blob, sizeof(char), (size_t) sb.st_size, fp);
+    fclose(fp);
+
+    if (len > (size_t) sb.st_size)
+	len = (size_t) sb.st_size;
+    my_blob[len] = '\0';
+
+    for (pass = 0; pass < 2; ++pass) {
+	char *base = my_blob;
+	k = 0;
+	for (j = 0; j < len; ++j) {
+	    if (my_blob[j] == '\n') {
+		if (pass) {
+		    my_vec[k] = base;
+		    my_blob[j] = '\0';
+		}
+		base = my_blob + j + 1;
+		++k;
+	    }
+	}
+	if (base != (my_blob + j)) {
+	    if (pass)
+		my_vec[k] = base;
+	    ++k;
+	}
+	num_lines = k;
+	if (pass == 0) {
+	    if (((my_vec = typeCalloc(char *, (size_t) k + 2)) == 0)) {
+		failed("cannot allocate line-vector #1");
+	    }
+	} else {
+	    if (my_vec[0] == NULL)
+		my_vec[0] = my_blob;
+	}
+    }
+
+#if USE_WIDEC_SUPPORT
+    if (!memcmp("\357\273\277", my_blob, 3)) {
+	char *s = my_blob + 3;
+	char *d = my_blob;
+	Trace(("trim BOM"));
+	do {
+	} while ((*d++ = *s++) != '\0');
+    }
+#endif
+
+    width = (int) strlen(my_vec[0]);
+    for (k = 1; my_vec[k]; ++k) {
+	int check = (int) (my_vec[k] - my_vec[k - 1]);
+	if (width < check)
+	    width = check;
+    }
+    width = (width + 1) * 5;
+    my_win = newwin(2, width, 0, 0);
+    if (my_win == 0) {
+	failed("cannot allocate temporary window");
+    }
+
+    if ((vec_lines = typeCalloc(NCURSES_CH_T *, (size_t) num_lines + 2)) == 0) {
+	failed("cannot allocate line-vector #2");
+    }
+
+    /*
+     * Use the curses library for rendering, including tab-conversion.  This
+     * will not make the resulting array's indices correspond to column for
+     * lines containing double-width cells because the "in_wch" functions will
+     * ignore the skipped cells.  Use pads for that sort of thing.
+     */
+    Trace(("slurp the file"));
+    for (k = 0; my_vec[k]; ++k) {
+	char *s;
+	int y, x;
+#if USE_WIDEC_SUPPORT
+	char *last = my_vec[k] + (int) strlen(my_vec[k]);
+	wchar_t wch[2];
+	size_t rc;
+#ifndef state_unused
+	mbstate_t state;
+#endif
+#endif /* USE_WIDEC_SUPPORT */
+
+	werase(my_win);
+	wmove(my_win, 0, 0);
+#if USE_WIDEC_SUPPORT
+	wch[1] = 0;
+	reset_mbytes(state);
+#endif
+	for (s = my_vec[k]; *s != '\0'; ++s) {
+#if USE_WIDEC_SUPPORT
+	    if (!n_option) {
+		rc = (size_t) check_mbytes(wch[0], s, (size_t) (last - s), state);
+		if ((long) rc == -1 || (long) rc == -2) {
+		    break;
+		}
+		s += rc - 1;
+		waddwstr(my_win, wch);
+	    } else
+#endif
+		waddch(my_win, *s & 0xff);
+	}
+	getyx(my_win, y, x);
+	if (y)
+	    x = width - 1;
+	wmove(my_win, 0, 0);
+	/* "x + 1" works with standard curses; some implementations are buggy */
+	if ((vec_lines[k] = typeCalloc(NCURSES_CH_T, x + width + 1)) == 0) {
+	    failed("cannot allocate line-vector #3");
+	}
+#if USE_WIDEC_SUPPORT
+	win_wchnstr(my_win, vec_lines[k], x);
+#else
+	winchnstr(my_win, vec_lines[k], x);
+#endif
+    }
+
+    delwin(my_win);
+    free(my_vec);
+    free(my_blob);
+}
+
+static GCC_NORETURN void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: view [options] file"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+	," -c       use color if terminal supports it"
+	," -i       ignore INT, QUIT, TERM signals"
+#if USE_WIDEC_SUPPORT
+	," -n       use waddch (bytes) rather then wadd_wch (wide-chars)"
+#endif
+	," -s       start in single-step mode, waiting for input"
+#ifdef TRACE
+	," -t       trace screen updates"
+	," -T NUM   specify trace mask"
+#endif
+    };
+    size_t n;
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    static const char *help[] =
+    {
+	"Commands:",
+	"  q,^Q,ESC       - quit this program",
+	"",
+	"  p,<Up>         - scroll the viewport up by one row",
+	"  n,<Down>       - scroll the viewport down by one row",
+	"  l,<Left>       - scroll the viewport left by one column",
+	"  r,<Right>      - scroll the viewport right by one column",
+	"  <,>            - scroll the viewport left/right by 8 columns",
+	"",
+	"  h,<Home>       - scroll the viewport to top of file",
+	"  ^F,<PageDn>    - scroll to the next page",
+	"  ^B,<PageUp>    - scroll to the previous page",
+	"  e,<End>        - scroll the viewport to end of file",
+	"",
+	"  ^L             - repaint using redrawwin()",
+	"",
+	"  0 through 9    - enter digits for count",
+	"  s              - use entered count for halfdelay() parameter",
+	"                 - if no entered count, stop nodelay()",
+	"  <space>        - begin nodelay()",
+	0
+    };
+
+    int ch;
+    int i;
+    int my_delay = 0;
+    NCURSES_CH_T **olptr;
+    int value = 0;
+    bool done = FALSE;
+    bool got_number = FALSE;
+    bool ignore_sigs = FALSE;
+    bool single_step = FALSE;
+    const char *my_label = "Input";
+
+    setlocale(LC_ALL, "");
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "cinstT:")) != -1) {
+	switch (ch) {
+	case 'c':
+	    try_color = TRUE;
+	    break;
+	case 'i':
+	    ignore_sigs = TRUE;
+	    break;
+#if USE_WIDEC_SUPPORT
+	case 'n':
+	    n_option = TRUE;
+	    break;
+#endif
+	case 's':
+	    single_step = TRUE;
+	    break;
+#ifdef TRACE
+	case 'T':
+	    {
+		char *next = 0;
+		int tvalue = (int) strtol(optarg, &next, 0);
+		if (tvalue < 0 || (next != 0 && *next != 0))
+		    usage(FALSE);
+		curses_trace((unsigned) tvalue);
+	    }
+	    break;
+	case 't':
+	    curses_trace(TRACE_CALLS);
+	    break;
+#endif
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind + 1 != argc)
+	usage(FALSE);
+
+    InitAndCatch(initscr(), ignore_sigs ? SIG_IGN : finish);
+    keypad(stdscr, TRUE);	/* enable keyboard mapping */
+    (void) nonl();		/* tell curses not to do NL->CR/NL on output */
+    (void) cbreak();		/* take input chars one at a time, no wait for \n */
+    (void) noecho();		/* don't echo input */
+    if (!single_step)
+	nodelay(stdscr, TRUE);
+    idlok(stdscr, TRUE);	/* allow use of insert/delete line */
+
+    read_file(fname = argv[optind]);
+
+    if (try_color) {
+	if (has_colors()) {
+	    start_color();
+	    init_pair(my_pair, COLOR_WHITE, COLOR_BLUE);
+	    bkgd((chtype) COLOR_PAIR(my_pair));
+	} else {
+	    try_color = FALSE;
+	}
+    }
+
+    lptr = vec_lines;
+    while (!done) {
+	int n, c;
+
+	if (!got_number)
+	    show_all(my_label);
+
+	for (;;) {
+	    c = getch();
+	    if ((c < 127) && isdigit(c)) {
+		if (!got_number) {
+		    MvPrintw(0, 0, "Count: ");
+		    clrtoeol();
+		}
+		addch(UChar(c));
+		value = 10 * value + (c - '0');
+		got_number = TRUE;
+	    } else
+		break;
+	}
+	if (got_number && value) {
+	    n = value;
+	} else {
+	    n = 1;
+	}
+
+	if (c != ERR)
+	    my_label = keyname(c);
+	switch (c) {
+	case KEY_DOWN:
+	case 'n':
+	    olptr = lptr;
+	    for (i = 0; i < n; i++)
+		if ((lptr - vec_lines) < (num_lines - LINES + 1))
+		    lptr++;
+		else
+		    break;
+	    scrl((int) (lptr - olptr));
+	    break;
+
+	case KEY_UP:
+	case 'p':
+	    olptr = lptr;
+	    for (i = 0; i < n; i++)
+		if (lptr > vec_lines)
+		    lptr--;
+		else
+		    break;
+	    scrl((int) (lptr - olptr));
+	    break;
+
+	case 'h':
+	    /* FALLTHRU */
+	case KEY_HOME:
+	    lptr = vec_lines;
+	    break;
+
+	case '<':
+	    if ((shift -= 8) < 0)
+		shift = 0;
+	    break;
+	case '>':
+	    shift += 8;
+	    break;
+
+	case 'e':
+	    /* FALLTHRU */
+	case KEY_END:
+	    if (num_lines > LINES)
+		lptr = (vec_lines + num_lines - LINES + 1);
+	    else
+		lptr = (vec_lines + (num_lines - 2));
+	    break;
+
+	case CTRL('F'):
+	    /* FALLTHRU */
+	case KEY_NPAGE:
+	    for (i = 0; i < n; i++) {
+		if ((lptr - vec_lines) < (num_lines - 5))
+		    lptr += (LINES - 1);
+		else
+		    lptr = (vec_lines + num_lines - 2);
+	    }
+	    break;
+
+	case CTRL('B'):
+	    /* FALLTHRU */
+	case KEY_PPAGE:
+	    for (i = 0; i < n; i++) {
+		if ((lptr - vec_lines) >= LINES)
+		    lptr -= (LINES - 1);
+		else
+		    lptr = vec_lines;
+	    }
+	    break;
+
+	case 'r':
+	case KEY_RIGHT:
+	    shift += n;
+	    break;
+
+	case 'l':
+	case KEY_LEFT:
+	    shift -= n;
+	    if (shift < 0) {
+		shift = 0;
+		beep();
+	    }
+	    break;
+
+	case 'q':
+	case QUIT:
+	case ESCAPE:
+	    done = TRUE;
+	    break;
+
+#ifdef KEY_RESIZE
+	case KEY_RESIZE:	/* ignore this; ncurses will repaint */
+	    break;
+#endif
+	case 's':
+#if HAVE_HALFDELAY
+	    if (got_number) {
+		halfdelay(my_delay = n);
+	    } else {
+		nodelay(stdscr, FALSE);
+		my_delay = -1;
+	    }
+#else
+	    nodelay(stdscr, FALSE);
+	    my_delay = -1;
+#endif
+	    break;
+	case ' ':
+	    nodelay(stdscr, TRUE);
+	    my_delay = 0;
+	    break;
+	case CTRL('L'):
+	    redrawwin(stdscr);
+	    break;
+	case ERR:
+	    if (!my_delay)
+		napms(50);
+	    break;
+	case HELP_KEY_1:
+	    popup_msg(stdscr, help);
+	    break;
+	default:
+	    beep();
+	    break;
+	}
+	if (c >= KEY_MIN || (c > 0 && !isdigit(c))) {
+	    got_number = FALSE;
+	    value = 0;
+	}
+    }
+
+    finish(0);			/* we're done */
+}
diff --git a/test/widechars-utf8-tabs.txt b/test/widechars-utf8-tabs.txt
new file mode 100644
index 0000000..ca605a1
--- /dev/null
+++ b/test/widechars-utf8-tabs.txt
@@ -0,0 +1,15 @@
+APPLE	-- It's an APPLE.
+DOG		-- No, that's not my DOG.
+ORANGE	-- Yeah, that's JUICY.
+CHICKEN	-- Normally not a PET.
+CAT		-- No, never put a DOG and a CAT together!
+FISH	-- Cats like FISH.
+LEMON	-- You KNOW how it TASTES.
+----+----1----+----2----+----3----+----4
+APPLE	-- It's an APPLE.
+ APPLE	-- It's an APPLE.
+  APPLE	-- It's an APPLE.
+   APPLE	-- It's an APPLE.
+    APPLE	-- It's an APPLE.
+     APPLE	-- It's an APPLE.
+----+----1----+----2----+----3----+----4
diff --git a/test/widechars-utf8.txt b/test/widechars-utf8.txt
new file mode 100644
index 0000000..43ecd0f
--- /dev/null
+++ b/test/widechars-utf8.txt
@@ -0,0 +1,7 @@
+APPLE     -- It's an APPLE.
+DOG         -- No, that's not my DOG.
+ORANGE   -- Yeah, that's JUICY.
+CHICKEN -- Normally not a PET.
+CAT         -- No, never put a DOG and a CAT together!
+FISH       -- Cats like FISH.
+LEMON     -- You KNOW how it TASTES.
diff --git a/test/widechars.h b/test/widechars.h
new file mode 100644
index 0000000..2578a92
--- /dev/null
+++ b/test/widechars.h
@@ -0,0 +1,72 @@
+/****************************************************************************
+ * Copyright 2018,2020 Thomas E. Dickey                                     *
+ * Copyright 2012 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.                                                           *
+ ****************************************************************************/
+
+#ifndef __WIDECHARS_H
+#define __WIDECHARS_H 1
+
+#include <test.priv.h>
+
+#if USE_WIDEC_SUPPORT
+
+#if defined(_NC_WINDOWS) && !defined(_MSC_VER) && !defined(EXP_WIN32_DRIVER)
+/*
+ * MinGW has wide-character functions, but they do not work correctly.
+ */
+
+extern int _nc_mbtowc(wchar_t *pwc, const char *s, size_t n);
+extern int __MINGW_NOTHROW _nc_mbtowc(wchar_t *pwc, const char *s, size_t n);
+#define mbtowc(pwc,s,n) _nc_mbtowc(pwc,s,n)
+
+extern int __MINGW_NOTHROW _nc_mblen(const char *, size_t);
+#define mblen(s,n) _nc_mblen(s, n)
+
+#endif /* _WIN32||_WIN64 */
+
+#if HAVE_MBTOWC && HAVE_MBLEN
+#define reset_mbytes(state) IGNORE_RC(mblen(NULL, 0)), IGNORE_RC(mbtowc(NULL, NULL, 0))
+#define count_mbytes(buffer,length,state) mblen(buffer,length)
+#define check_mbytes(wch,buffer,length,state) \
+	(int) mbtowc(&wch, buffer, length)
+#define state_unused
+#elif HAVE_MBRTOWC && HAVE_MBRLEN
+#define reset_mbytes(state) init_mb(state)
+#define count_mbytes(buffer,length,state) mbrlen(buffer,length,&state)
+#define check_mbytes(wch,buffer,length,state) \
+	(int) mbrtowc(&wch, buffer, length, &state)
+#else
+make an error
+#endif
+
+#else
+
+#endif /* USE_WIDEC_SUPPORT */
+
+extern void widechars_stub(void);
+
+#endif /* __WIDECHARS_H */
diff --git a/test/worm.c b/test/worm.c
new file mode 100644
index 0000000..7c4842e
--- /dev/null
+++ b/test/worm.c
@@ -0,0 +1,697 @@
+/****************************************************************************
+ * Copyright 2018-2020,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2016,2017 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.                                                           *
+ ****************************************************************************/
+/*
+
+	 @@@        @@@    @@@@@@@@@@     @@@@@@@@@@@    @@@@@@@@@@@@
+	 @@@        @@@   @@@@@@@@@@@@    @@@@@@@@@@@@   @@@@@@@@@@@@@
+	 @@@        @@@  @@@@      @@@@   @@@@           @@@@ @@@  @@@@
+	 @@@   @@   @@@  @@@        @@@   @@@            @@@  @@@   @@@
+	 @@@  @@@@  @@@  @@@        @@@   @@@            @@@  @@@   @@@
+	 @@@@ @@@@ @@@@  @@@        @@@   @@@            @@@  @@@   @@@
+	  @@@@@@@@@@@@   @@@@      @@@@   @@@            @@@  @@@   @@@
+	   @@@@  @@@@     @@@@@@@@@@@@    @@@            @@@  @@@   @@@
+	    @@    @@       @@@@@@@@@@     @@@            @@@  @@@   @@@
+
+				 Eric P. Scott
+			  Caltech High Energy Physics
+				 October, 1980
+
+		Hacks to turn this into a test frame for cursor movement:
+			Eric S. Raymond <esr@snark.thyrsus.com>
+				January, 1995
+
+		July 1995 (esr): worms is now in living color! :-)
+
+  This program makes a good torture-test for the ncurses cursor-optimization
+  code.  You can use -T to set the worm move interval over which movement
+  traces will be dumped.  The program stops and waits for one character of
+  input at the beginning and end of the interval.
+
+  $Id: worm.c,v 1.89 2022/12/24 20:46:49 tom Exp $
+*/
+
+#include <test.priv.h>
+
+#ifndef NCURSES_VERSION
+#undef TRACE
+#endif
+
+#ifdef USE_PTHREADS
+#include <pthread.h>
+#endif
+
+WANT_USE_WINDOW();
+
+#define MAX_WORMS	40
+#define MAX_LENGTH	1024
+
+static chtype flavor[] =
+{
+    'O', '*', '#', '$', '%', '0', '@',
+};
+static const int xinc[] =
+{
+    1, 1, 1, 0, -1, -1, -1, 0
+}, yinc[] =
+{
+    -1, 0, 1, 1, 1, 0, -1, -1
+};
+
+typedef struct worm {
+    int orientation;
+    int head;
+    int *xpos;
+    int *ypos;
+    chtype attrs;
+#ifdef USE_PTHREADS
+    pthread_t thread;
+#endif
+} WORM;
+
+static unsigned long sequence = 0;
+static bool quitting = FALSE;
+
+static WORM worm[MAX_WORMS];
+static int max_refs;
+static int **refs;
+static int last_x, last_y;
+
+static const char *field;
+static int length = 16, number = 3;
+static chtype trail = ' ';
+
+static unsigned pending;
+
+#ifdef USE_PTHREADS
+#define Locked(statement) { \
+	pthread_mutex_lock(&pending_mutex); \
+	statement; \
+	pthread_mutex_unlock(&pending_mutex); \
+    }
+pthread_mutex_t pending_mutex;
+#else
+#define Locked(statement) statement
+#endif
+
+#ifdef TRACE
+static int generation, trace_start, trace_end;
+#endif /* TRACE */
+/* *INDENT-OFF* */
+static const struct options {
+    int nopts;
+    int opts[3];
+} normal[8]={
+    { 3, { 7, 0, 1 } },
+    { 3, { 0, 1, 2 } },
+    { 3, { 1, 2, 3 } },
+    { 3, { 2, 3, 4 } },
+    { 3, { 3, 4, 5 } },
+    { 3, { 4, 5, 6 } },
+    { 3, { 5, 6, 7 } },
+    { 3, { 6, 7, 0 } }
+}, upper[8]={
+    { 1, { 1, 0, 0 } },
+    { 2, { 1, 2, 0 } },
+    { 0, { 0, 0, 0 } },
+    { 0, { 0, 0, 0 } },
+    { 0, { 0, 0, 0 } },
+    { 2, { 4, 5, 0 } },
+    { 1, { 5, 0, 0 } },
+    { 2, { 1, 5, 0 } }
+}, left[8]={
+    { 0, { 0, 0, 0 } },
+    { 0, { 0, 0, 0 } },
+    { 0, { 0, 0, 0 } },
+    { 2, { 2, 3, 0 } },
+    { 1, { 3, 0, 0 } },
+    { 2, { 3, 7, 0 } },
+    { 1, { 7, 0, 0 } },
+    { 2, { 7, 0, 0 } }
+}, right[8]={
+    { 1, { 7, 0, 0 } },
+    { 2, { 3, 7, 0 } },
+    { 1, { 3, 0, 0 } },
+    { 2, { 3, 4, 0 } },
+    { 0, { 0, 0, 0 } },
+    { 0, { 0, 0, 0 } },
+    { 0, { 0, 0, 0 } },
+    { 2, { 6, 7, 0 } }
+}, lower[8]={
+    { 0, { 0, 0, 0 } },
+    { 2, { 0, 1, 0 } },
+    { 1, { 1, 0, 0 } },
+    { 2, { 1, 5, 0 } },
+    { 1, { 5, 0, 0 } },
+    { 2, { 5, 6, 0 } },
+    { 0, { 0, 0, 0 } },
+    { 0, { 0, 0, 0 } }
+}, upleft[8]={
+    { 0, { 0, 0, 0 } },
+    { 0, { 0, 0, 0 } },
+    { 0, { 0, 0, 0 } },
+    { 0, { 0, 0, 0 } },
+    { 0, { 0, 0, 0 } },
+    { 1, { 3, 0, 0 } },
+    { 2, { 1, 3, 0 } },
+    { 1, { 1, 0, 0 } }
+}, upright[8]={
+    { 2, { 3, 5, 0 } },
+    { 1, { 3, 0, 0 } },
+    { 0, { 0, 0, 0 } },
+    { 0, { 0, 0, 0 } },
+    { 0, { 0, 0, 0 } },
+    { 0, { 0, 0, 0 } },
+    { 0, { 0, 0, 0 } },
+    { 1, { 5, 0, 0 } }
+}, lowleft[8]={
+    { 3, { 7, 0, 1 } },
+    { 0, { 0, 0, 0 } },
+    { 0, { 0, 0, 0 } },
+    { 1, { 1, 0, 0 } },
+    { 2, { 1, 7, 0 } },
+    { 1, { 7, 0, 0 } },
+    { 0, { 0, 0, 0 } },
+    { 0, { 0, 0, 0 } }
+}, lowright[8]={
+    { 0, { 0, 0, 0 } },
+    { 1, { 7, 0, 0 } },
+    { 2, { 5, 7, 0 } },
+    { 1, { 5, 0, 0 } },
+    { 0, { 0, 0, 0 } },
+    { 0, { 0, 0, 0 } },
+    { 0, { 0, 0, 0 } },
+    { 0, { 0, 0, 0 } }
+};
+/* *INDENT-ON* */
+
+#if HAVE_USE_WINDOW
+static int
+safe_wgetch(WINDOW *w, void *data GCC_UNUSED)
+{
+    return wgetch(w);
+}
+static int
+safe_wrefresh(WINDOW *w, void *data GCC_UNUSED)
+{
+    return wrefresh(w);
+}
+#endif
+
+#ifdef KEY_RESIZE
+static void
+failed(const char *s)
+{
+    perror(s);
+    stop_curses();
+    ExitProgram(EXIT_FAILURE);
+}
+#endif
+
+static void
+cleanup(void)
+{
+    USING_WINDOW1(stdscr, wrefresh, safe_wrefresh);
+    stop_curses();
+}
+
+static void
+onsig(int sig GCC_UNUSED)
+{
+    cleanup();
+    ExitProgram(EXIT_FAILURE);
+}
+
+static double
+ranf(void)
+{
+    long r = (rand() & 077777);
+    return ((double) r / 32768.);
+}
+
+static int
+draw_worm(WINDOW *win, void *data)
+{
+    WORM *w = (WORM *) data;
+    const struct options *op;
+    unsigned mask = (unsigned) (~(1 << (w - worm)));
+    chtype attrs;
+
+    int x;
+    int y;
+    int h;
+
+    bool done = FALSE;
+    bool is_pending;
+
+    Locked(is_pending = ((mask & pending) != 0));
+
+    attrs = w->attrs | (is_pending ? A_REVERSE : 0);
+
+    if ((x = w->xpos[h = w->head]) < 0) {
+	wmove(win, y = w->ypos[h] = last_y, x = w->xpos[h] = 0);
+	waddch(win, attrs);
+	refs[y][x]++;
+    } else {
+	y = w->ypos[h];
+    }
+
+    if (x > last_x)
+	x = last_x;
+    if (y > last_y)
+	y = last_y;
+
+    if (++h == length)
+	h = 0;
+
+    if (w->xpos[w->head = h] >= 0) {
+	int x1, y1;
+	x1 = w->xpos[h];
+	y1 = w->ypos[h];
+	if (y1 < LINES
+	    && x1 < COLS
+	    && --refs[y1][x1] == 0) {
+	    wmove(win, y1, x1);
+	    waddch(win, trail);
+	}
+    }
+
+    op = &(x == 0
+	   ? (y == 0
+	      ? upleft
+	      : (y == last_y
+		 ? lowleft
+		 : left))
+	   : (x == last_x
+	      ? (y == 0
+		 ? upright
+		 : (y == last_y
+		    ? lowright
+		    : right))
+	      : (y == 0
+		 ? upper
+		 : (y == last_y
+		    ? lower
+		    : normal))))[w->orientation];
+
+    switch (op->nopts) {
+    case 0:
+	done = TRUE;
+	Trace(("done - draw_worm"));
+	break;
+    case 1:
+	w->orientation = op->opts[0];
+	break;
+    default:
+	w->orientation = op->opts[(int) (ranf() * (double) op->nopts)];
+	break;
+    }
+
+    if (!done) {
+	x += xinc[w->orientation];
+	y += yinc[w->orientation];
+	wmove(win, y, x);
+
+	if (y < 0)
+	    y = 0;
+	waddch(win, attrs);
+
+	w->ypos[h] = y;
+	w->xpos[h] = x;
+	refs[y][x]++;
+    }
+
+    return done;
+}
+
+#ifdef USE_PTHREADS
+static bool
+quit_worm(int bitnum)
+{
+    Locked(pending = (pending | (unsigned) (1 << bitnum)));
+
+    napms(10);			/* let the other thread(s) have a chance */
+
+    Locked(pending = (pending & (unsigned) ~(1 << bitnum)));
+
+    return quitting;
+}
+
+static void *
+start_worm(void *arg)
+{
+    unsigned long compare = 0;
+    Trace(("start_worm"));
+    while (!quit_worm((int) (((struct worm *) arg) - worm))) {
+	for (;;) {
+	    bool done = FALSE;
+	    Locked(done = (compare >= sequence));
+	    if (done)
+		break;
+	    ++compare;
+	    USING_WINDOW2(stdscr, draw_worm, arg);
+	}
+    }
+    Trace(("...start_worm (done)"));
+    return NULL;
+}
+#endif
+
+static bool
+draw_all_worms(void)
+{
+    bool done = FALSE;
+    int n;
+    struct worm *w;
+
+#ifdef USE_PTHREADS
+    static bool first = TRUE;
+    if (first) {
+	first = FALSE;
+	for (n = 0, w = &worm[0]; n < number; n++, w++) {
+	    (void) pthread_create(&(w->thread), NULL, start_worm, w);
+	}
+    }
+#else
+    for (n = 0, w = &worm[0]; n < number; n++, w++) {
+	if (USING_WINDOW2(stdscr, draw_worm, w))
+	    done = TRUE;
+    }
+#endif
+    return done;
+}
+
+static int
+get_input(void)
+{
+    int ch;
+    ch = USING_WINDOW1(stdscr, wgetch, safe_wgetch);
+    return ch;
+}
+
+#ifdef KEY_RESIZE
+static int
+update_refs(WINDOW *win, void *data)
+{
+    int x, y;
+
+    (void) win;
+    (void) data;
+    if (last_x != COLS - 1) {
+	for (y = 0; y <= last_y; y++) {
+	    refs[y] = typeRealloc(int, (size_t) COLS, refs[y]);
+	    if (!refs[y])
+		failed("update_refs");
+	    for (x = last_x + 1; x < COLS; x++)
+		refs[y][x] = 0;
+	}
+	last_x = COLS - 1;
+    }
+    if (last_y != LINES - 1) {
+	for (y = LINES; y <= last_y; y++)
+	    free(refs[y]);
+	max_refs = LINES;
+	refs = typeRealloc(int *, (size_t) LINES, refs);
+	for (y = last_y + 1; y < LINES; y++) {
+	    refs[y] = typeMalloc(int, (size_t) COLS);
+	    if (!refs[y])
+		failed("update_refs");
+	    for (x = 0; x < COLS; x++)
+		refs[y][x] = 0;
+	}
+	last_y = LINES - 1;
+    }
+    return OK;
+}
+#endif
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: worm [options]"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+#if HAVE_USE_DEFAULT_COLORS
+	," -d       invoke use_default_colors"
+#endif
+	," -f       fill screen with copies of \"WORM\" at start"
+	," -l <n>   set length of worms"
+	," -n <n>   set number of worms"
+	," -t       leave trail of \".\""
+#ifdef TRACE
+	," -T <start>,<end> set trace interval"
+	," -N       suppress cursor-movement optimization"
+#endif
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+    int x, y;
+    int n;
+    struct worm *w;
+    int *ip;
+    bool done = FALSE;
+#if HAVE_USE_DEFAULT_COLORS
+    bool opt_d = FALSE;
+#endif
+
+    setlocale(LC_ALL, "");
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "dfl:n:tT:N")) != -1) {
+	switch (ch) {
+#if HAVE_USE_DEFAULT_COLORS
+	case 'd':
+	    opt_d = TRUE;
+	    break;
+#endif
+	case 'f':
+	    field = "WORM";
+	    break;
+	case 'l':
+	    if ((length = atoi(optarg)) < 2 || length > MAX_LENGTH) {
+		fprintf(stderr, "%s: Invalid length\n", *argv);
+		usage(FALSE);
+	    }
+	    break;
+	case 'n':
+	    if ((number = atoi(optarg)) < 1 || number > MAX_WORMS) {
+		fprintf(stderr, "%s: Invalid number of worms\n", *argv);
+		usage(FALSE);
+	    }
+	    break;
+	case 't':
+	    trail = '.';
+	    break;
+#ifdef TRACE
+	case 'T':
+	    if (sscanf(optarg, "%d,%d", &trace_start, &trace_end) != 2)
+		usage(FALSE);
+	    break;
+	case 'N':
+	    _nc_optimize_enable ^= OPTIMIZE_ALL;	/* declared by ncurses */
+	    break;
+#endif /* TRACE */
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    if (optind < argc)
+	usage(FALSE);
+
+    signal(SIGINT, onsig);
+    initscr();
+    noecho();
+    cbreak();
+    nonl();
+
+    curs_set(0);
+
+    last_y = LINES - 1;
+    last_x = COLS - 1;
+
+#ifdef A_COLOR
+    if (has_colors()) {
+	int bg = COLOR_BLACK;
+	start_color();
+#if HAVE_USE_DEFAULT_COLORS
+	if (opt_d && (use_default_colors() == OK))
+	    bg = -1;
+#endif
+
+#define SET_COLOR(num, fg) \
+	    init_pair(num+1, (short) fg, (short) bg); \
+	    flavor[num] |= (chtype) COLOR_PAIR(num+1) | A_BOLD
+
+	SET_COLOR(0, COLOR_GREEN);
+	SET_COLOR(1, COLOR_RED);
+	SET_COLOR(2, COLOR_CYAN);
+	SET_COLOR(3, COLOR_WHITE);
+	SET_COLOR(4, COLOR_MAGENTA);
+	SET_COLOR(5, COLOR_BLUE);
+	SET_COLOR(6, COLOR_YELLOW);
+    }
+#endif /* A_COLOR */
+
+    max_refs = LINES;
+    refs = typeMalloc(int *, (size_t) max_refs);
+    for (y = 0; y < max_refs; y++) {
+	refs[y] = typeMalloc(int, (size_t) COLS);
+	for (x = 0; x < COLS; x++) {
+	    refs[y][x] = 0;
+	}
+    }
+
+#ifdef BADCORNER
+    /* if addressing the lower right corner doesn't work in your curses */
+    refs[last_y][last_x] = 1;
+#endif /* BADCORNER */
+
+    for (n = number, w = &worm[0]; --n >= 0; w++) {
+	w->attrs = flavor[(unsigned) n % SIZEOF(flavor)];
+	w->orientation = 0;
+	w->head = 0;
+
+	if (!(ip = typeMalloc(int, (size_t) (length + 1)))) {
+	    fprintf(stderr, "%s: out of memory\n", *argv);
+	    ExitProgram(EXIT_FAILURE);
+	}
+	w->xpos = ip;
+	for (x = length; --x >= 0;)
+	    *ip++ = -1;
+	if (!(ip = typeMalloc(int, (size_t) (length + 1)))) {
+	    fprintf(stderr, "%s: out of memory\n", *argv);
+	    ExitProgram(EXIT_FAILURE);
+	}
+	w->ypos = ip;
+	for (y = length; --y >= 0;)
+	    *ip++ = -1;
+    }
+    if (field) {
+	const char *p;
+	p = field;
+	for (y = last_y; --y >= 0;) {
+	    for (x = COLS; --x >= 0;) {
+		addch((chtype) (*p++));
+		if (!*p)
+		    p = field;
+	    }
+	}
+    }
+    USING_WINDOW1(stdscr, wrefresh, safe_wrefresh);
+    nodelay(stdscr, TRUE);
+
+#ifdef USE_PTHREADS
+    pthread_mutex_init(&pending_mutex, NULL);
+#endif
+
+    while (!done) {
+	Locked(++sequence);
+	if ((ch = get_input()) > 0) {
+#ifdef TRACE
+	    if (trace_start || trace_end) {
+		if (generation == trace_start) {
+		    curses_trace(TRACE_CALLS);
+		    get_input();
+		} else if (generation == trace_end) {
+		    curses_trace(0);
+		    get_input();
+		}
+
+		generation++;
+	    }
+#endif
+
+#ifdef KEY_RESIZE
+	    if (ch == KEY_RESIZE) {
+		USING_WINDOW(stdscr, update_refs);
+	    }
+#endif
+
+	    /*
+	     * Make it simple to put this into single-step mode, or resume
+	     * normal operation -T.Dickey
+	     */
+	    if (ch == 'q') {
+		quitting = TRUE;
+		done = TRUE;
+		Trace(("done - quitting"));
+		continue;
+	    } else if (ch == 's') {
+		nodelay(stdscr, FALSE);
+	    } else if (ch == ' ') {
+		nodelay(stdscr, TRUE);
+	    }
+	}
+
+	done = draw_all_worms();
+	napms(10);
+	USING_WINDOW1(stdscr, wrefresh, safe_wrefresh);
+    }
+
+    Trace(("Cleanup"));
+    cleanup();
+#ifdef USE_PTHREADS
+    /*
+     * Do this just in case one of the threads did not really exit.
+     */
+    Trace(("join all threads"));
+    for (n = 0; n < number; n++) {
+	pthread_join(worm[n].thread, NULL);
+    }
+#endif
+#if NO_LEAKS
+    for (y = 0; y < max_refs; y++) {
+	free(refs[y]);
+    }
+    free(refs);
+    for (n = number, w = &worm[0]; --n >= 0; w++) {
+	free(w->xpos);
+	free(w->ypos);
+    }
+#endif
+    ExitProgram(EXIT_SUCCESS);
+}
diff --git a/test/xmas.c b/test/xmas.c
new file mode 100644
index 0000000..9ba3a26
--- /dev/null
+++ b/test/xmas.c
@@ -0,0 +1,1178 @@
+/******************************************************************************/
+/* asciixmas                                                                  */
+/* December 1989             Larry Bartz           Indianapolis, IN           */
+/*                                                                            */
+/*                                                                            */
+/* I'm dreaming of an ascii character-based monochrome Christmas,             */
+/* Just like the one's I used to know!                                        */
+/* Via a full duplex communications channel,                                  */
+/* At 9600 bits per second,                                                   */
+/* Even though it's kinda slow.                                               */
+/*                                                                            */
+/* I'm dreaming of an ascii character-based monochrome Christmas,             */
+/* With ev'ry C program I write!                                              */
+/* May your screen be merry and bright!                                       */
+/* And may all your Christmases be amber or green,                            */
+/* (for reduced eyestrain and improved visibility)!                           */
+/*                                                                            */
+/*                                                                            */
+/*                                                                            */
+/*                                                                            */
+/*                                                                            */
+/* IMPLEMENTATION                                                             */
+/*                                                                            */
+/* Feel free to modify the defined string FROMWHO to reflect you, your        */
+/* organization, your site, whatever.                                         */
+/*                                                                            */
+/* This really looks a lot better if you can turn off your cursor before      */
+/* execution. I wanted to do that here but very few termcap entries or        */
+/* terminfo definitions have the appropriate string defined. If you know      */
+/* the string(s) for the terminal(s) you use or which your site supports,     */
+/* you could call asciixmas from within a shell in which you issue the        */
+/* string to the terminal. The cursor is distracting but it doesn't really    */
+/* ruin the show.                                                             */
+/*                                                                            */
+/* At our site, we invoke this for our users just after login and the         */
+/* determination of terminal type.                                            */
+/*                                                                            */
+/*                                                                            */
+/* PORTABILITY                                                                */
+/*                                                                            */
+/* I wrote this using only the very simplest curses functions so that it      */
+/* might be the most portable. I was personally able to test on five          */
+/* different cpu/UNIX combinations.                                           */
+/*                                                                            */
+/*                                                                            */
+/* COMPILE                                                                    */
+/*                                                                            */
+/* usually this:                                                              */
+/*                                                                            */
+/* cc -O asciixmas.c -lcurses -o asciixmas -s                                 */
+/*                                                                            */
+/*                                                                            */
+/* Zilog S8000 models 11, 21, 31, etc with ZEUS variant of SYSTEM III         */
+/* maybe other SYSTEM III also:                                               */
+/*                                                                            */
+/* cc asciixmas.c -lcurses -ltermlib -o asciixmas -s                          */
+/*                                                                            */
+/* as above with optional "peephole optimizer" installed:                     */
+/*                                                                            */
+/* cc -O asciixmas.c -lcurses -ltermlib -o asciixmas -s                       */
+/*                                                                            */
+/*                                                                            */
+/* Zilog S8000 models 32, 130 with WE32100 chip and SYS V, REL2               */
+/* maybe 3B2 also?                                                            */
+/*                                                                            */
+/* cc -f -O -K sd asciixmas.c -lcurses -o asciixmas -s                        */
+/*                                                                            */
+/*                                                                            */
+/* Pyramid, Sequent, any other "dual universe" types compile and execute      */
+/* under either universe. The compile line for the ucb universe (as you       */
+/* might expect) is the same as for SYS III UNIX:                             */
+/*                                                                            */
+/* cc -O asciixmas.c -lcurses -ltermlib -o asciixmas -s                       */
+/*                                                                            */
+/* The above compile will also hold true for other BSD systems. (I hope)      */
+/*                                                                            */
+/*                                                                            */
+/*                                                                            */
+/*                                                                            */
+/* For the Scrooges out there among you who don't want this thing to loop     */
+/* forever (or until the user hits a key), insert this into your compile      */
+/* line just after "cc" :                                                     */
+/*                                                                            */
+/* -DNOLOOP                                                                   */
+/*                                                                            */
+/* like so:                                                                   */
+/*                                                                            */
+/* cc -DNOLOOP -O asciixmas.c -lcurses -o asciixmas -s                        */
+/*                                                                            */
+/*                                                                            */
+/*                                                                            */
+/******************************************************************************/
+
+/*
+ * $Id: xmas.c,v 1.39 2022/12/04 00:40:11 tom Exp $
+ */
+#include <test.priv.h>
+
+#define FROMWHO "Mark Hessling - (M.Hessling@gu.edu.au)"
+
+static int my_bg = COLOR_BLACK;
+static int y_pos, x_pos;
+
+static WINDOW *treescrn;
+static WINDOW *treescrn2;
+static WINDOW *treescrn3;
+static WINDOW *treescrn4;
+static WINDOW *treescrn5;
+static WINDOW *treescrn6;
+static WINDOW *treescrn7;
+static WINDOW *treescrn8;
+static WINDOW *dotdeer0;
+static WINDOW *stardeer0;
+static WINDOW *lildeer0;
+static WINDOW *lildeer1;
+static WINDOW *lildeer2;
+static WINDOW *lildeer3;
+static WINDOW *middeer0;
+static WINDOW *middeer1;
+static WINDOW *middeer2;
+static WINDOW *middeer3;
+static WINDOW *bigdeer0;
+static WINDOW *bigdeer1;
+static WINDOW *bigdeer2;
+static WINDOW *bigdeer3;
+static WINDOW *bigdeer4;
+static WINDOW *lookdeer0;
+static WINDOW *lookdeer1;
+static WINDOW *lookdeer2;
+static WINDOW *lookdeer3;
+static WINDOW *lookdeer4;
+static WINDOW *w_holiday;
+static WINDOW *w_del_msg;
+static bool *my_pairs;
+
+static GCC_NORETURN void done(int sig);
+
+static void
+set_color(WINDOW *win, chtype color)
+{
+    if (has_colors()) {
+	int n = (int) (color + 1);
+	if (my_pairs == 0)
+	    my_pairs = typeCalloc(bool, (size_t) (COLORS + 1));
+	if (!my_pairs[n]) {
+	    init_pair((short) n, (short) color, (short) my_bg);
+	    my_pairs[n] = TRUE;
+	}
+	wattroff(win, A_COLOR);
+	wattron(win, COLOR_PAIR(n));
+    }
+}
+
+static void
+unset_color(WINDOW *win)
+{
+    if (has_colors())
+	(void) wattrset(win, COLOR_PAIR(0));
+}
+
+static void
+look_out(int msecs)
+{
+    napms(msecs);
+    if (getch() != ERR) {
+	beep();
+	done(0);
+    }
+}
+
+static int
+boxit(void)
+{
+    int x = 0;
+
+    while (x < 20) {
+	MvAddCh(x, 7, '|');
+	++x;
+    }
+
+    x = 8;
+
+    while (x < 80) {
+	MvAddCh(19, x, '_');
+	++x;
+    }
+
+    x = 0;
+
+    while (x < 80) {
+	MvAddCh(22, x, '_');
+	++x;
+    }
+
+    return (0);
+}
+
+static int
+seas(void)
+{
+    MvAddCh(4, 1, 'S');
+    MvAddCh(6, 1, 'E');
+    MvAddCh(8, 1, 'A');
+    MvAddCh(10, 1, 'S');
+    MvAddCh(12, 1, 'O');
+    MvAddCh(14, 1, 'N');
+    MvAddCh(16, 1, '`');
+    MvAddCh(18, 1, 'S');
+
+    return (0);
+}
+
+static int
+greet(void)
+{
+    MvAddCh(3, 5, 'G');
+    MvAddCh(5, 5, 'R');
+    MvAddCh(7, 5, 'E');
+    MvAddCh(9, 5, 'E');
+    MvAddCh(11, 5, 'T');
+    MvAddCh(13, 5, 'I');
+    MvAddCh(15, 5, 'N');
+    MvAddCh(17, 5, 'G');
+    MvAddCh(19, 5, 'S');
+
+    return (0);
+}
+
+static int
+fromwho(void)
+{
+    MvAddStr(21, 13, FROMWHO);
+    return (0);
+}
+
+static int
+tree(void)
+{
+    set_color(treescrn, COLOR_GREEN);
+    MvWAddCh(treescrn, 1, 11, (chtype) '/');
+    MvWAddCh(treescrn, 2, 11, (chtype) '/');
+    MvWAddCh(treescrn, 3, 10, (chtype) '/');
+    MvWAddCh(treescrn, 4, 9, (chtype) '/');
+    MvWAddCh(treescrn, 5, 9, (chtype) '/');
+    MvWAddCh(treescrn, 6, 8, (chtype) '/');
+    MvWAddCh(treescrn, 7, 7, (chtype) '/');
+    MvWAddCh(treescrn, 8, 6, (chtype) '/');
+    MvWAddCh(treescrn, 9, 6, (chtype) '/');
+    MvWAddCh(treescrn, 10, 5, (chtype) '/');
+    MvWAddCh(treescrn, 11, 3, (chtype) '/');
+    MvWAddCh(treescrn, 12, 2, (chtype) '/');
+
+    MvWAddCh(treescrn, 1, 13, (chtype) '\\');
+    MvWAddCh(treescrn, 2, 13, (chtype) '\\');
+    MvWAddCh(treescrn, 3, 14, (chtype) '\\');
+    MvWAddCh(treescrn, 4, 15, (chtype) '\\');
+    MvWAddCh(treescrn, 5, 15, (chtype) '\\');
+    MvWAddCh(treescrn, 6, 16, (chtype) '\\');
+    MvWAddCh(treescrn, 7, 17, (chtype) '\\');
+    MvWAddCh(treescrn, 8, 18, (chtype) '\\');
+    MvWAddCh(treescrn, 9, 18, (chtype) '\\');
+    MvWAddCh(treescrn, 10, 19, (chtype) '\\');
+    MvWAddCh(treescrn, 11, 21, (chtype) '\\');
+    MvWAddCh(treescrn, 12, 22, (chtype) '\\');
+
+    MvWAddCh(treescrn, 4, 10, (chtype) '_');
+    MvWAddCh(treescrn, 4, 14, (chtype) '_');
+    MvWAddCh(treescrn, 8, 7, (chtype) '_');
+    MvWAddCh(treescrn, 8, 17, (chtype) '_');
+
+    MvWAddStr(treescrn, 13, 0, "//////////// \\\\\\\\\\\\\\\\\\\\\\\\");
+
+    MvWAddStr(treescrn, 14, 11, "| |");
+    MvWAddStr(treescrn, 15, 11, "|_|");
+
+    unset_color(treescrn);
+    wrefresh(treescrn);
+    wrefresh(w_del_msg);
+
+    return (0);
+}
+
+static int
+balls(void)
+{
+    overlay(treescrn, treescrn2);
+
+    set_color(treescrn2, COLOR_BLUE);
+    MvWAddCh(treescrn2, 3, 9, (chtype) '@');
+    MvWAddCh(treescrn2, 3, 15, (chtype) '@');
+    MvWAddCh(treescrn2, 4, 8, (chtype) '@');
+    MvWAddCh(treescrn2, 4, 16, (chtype) '@');
+    MvWAddCh(treescrn2, 5, 7, (chtype) '@');
+    MvWAddCh(treescrn2, 5, 17, (chtype) '@');
+    MvWAddCh(treescrn2, 7, 6, (chtype) '@');
+    MvWAddCh(treescrn2, 7, 18, (chtype) '@');
+    MvWAddCh(treescrn2, 8, 5, (chtype) '@');
+    MvWAddCh(treescrn2, 8, 19, (chtype) '@');
+    MvWAddCh(treescrn2, 10, 4, (chtype) '@');
+    MvWAddCh(treescrn2, 10, 20, (chtype) '@');
+    MvWAddCh(treescrn2, 11, 2, (chtype) '@');
+    MvWAddCh(treescrn2, 11, 22, (chtype) '@');
+    MvWAddCh(treescrn2, 12, 1, (chtype) '@');
+    MvWAddCh(treescrn2, 12, 23, (chtype) '@');
+
+    unset_color(treescrn2);
+    wrefresh(treescrn2);
+    wrefresh(w_del_msg);
+    return (0);
+}
+
+static int
+star(void)
+{
+    (void) wattrset(treescrn2, A_BOLD | A_BLINK);
+    set_color(treescrn2, COLOR_YELLOW);
+
+    MvWAddCh(treescrn2, 0, 12, (chtype) '*');
+    (void) wstandend(treescrn2);
+
+    unset_color(treescrn2);
+    wrefresh(treescrn2);
+    wrefresh(w_del_msg);
+    return (0);
+}
+
+static int
+strng1(void)
+{
+    (void) wattrset(treescrn2, A_BOLD | A_BLINK);
+    set_color(treescrn2, COLOR_WHITE);
+
+    MvWAddCh(treescrn2, 3, 13, (chtype) '\'');
+    MvWAddCh(treescrn2, 3, 12, (chtype) ':');
+    MvWAddCh(treescrn2, 3, 11, (chtype) '.');
+
+    wattroff(treescrn2, A_BOLD | A_BLINK);
+    unset_color(treescrn2);
+
+    wrefresh(treescrn2);
+    wrefresh(w_del_msg);
+    return (0);
+}
+
+static int
+strng2(void)
+{
+    (void) wattrset(treescrn2, A_BOLD | A_BLINK);
+    set_color(treescrn2, COLOR_WHITE);
+
+    MvWAddCh(treescrn2, 5, 14, (chtype) '\'');
+    MvWAddCh(treescrn2, 5, 13, (chtype) ':');
+    MvWAddCh(treescrn2, 5, 12, (chtype) '.');
+    MvWAddCh(treescrn2, 5, 11, (chtype) ',');
+    MvWAddCh(treescrn2, 6, 10, (chtype) '\'');
+    MvWAddCh(treescrn2, 6, 9, (chtype) ':');
+
+    wattroff(treescrn2, A_BOLD | A_BLINK);
+    unset_color(treescrn2);
+
+    wrefresh(treescrn2);
+    wrefresh(w_del_msg);
+    return (0);
+}
+
+static int
+strng3(void)
+{
+    (void) wattrset(treescrn2, A_BOLD | A_BLINK);
+    set_color(treescrn2, COLOR_WHITE);
+
+    MvWAddCh(treescrn2, 7, 16, (chtype) '\'');
+    MvWAddCh(treescrn2, 7, 15, (chtype) ':');
+    MvWAddCh(treescrn2, 7, 14, (chtype) '.');
+    MvWAddCh(treescrn2, 7, 13, (chtype) ',');
+    MvWAddCh(treescrn2, 8, 12, (chtype) '\'');
+    MvWAddCh(treescrn2, 8, 11, (chtype) ':');
+    MvWAddCh(treescrn2, 8, 10, (chtype) '.');
+    MvWAddCh(treescrn2, 8, 9, (chtype) ',');
+
+    wattroff(treescrn2, A_BOLD | A_BLINK);
+    unset_color(treescrn2);
+
+    wrefresh(treescrn2);
+    wrefresh(w_del_msg);
+    return (0);
+}
+
+static int
+strng4(void)
+{
+    (void) wattrset(treescrn2, A_BOLD | A_BLINK);
+    set_color(treescrn2, COLOR_WHITE);
+
+    MvWAddCh(treescrn2, 9, 17, (chtype) '\'');
+    MvWAddCh(treescrn2, 9, 16, (chtype) ':');
+    MvWAddCh(treescrn2, 9, 15, (chtype) '.');
+    MvWAddCh(treescrn2, 9, 14, (chtype) ',');
+    MvWAddCh(treescrn2, 10, 13, (chtype) '\'');
+    MvWAddCh(treescrn2, 10, 12, (chtype) ':');
+    MvWAddCh(treescrn2, 10, 11, (chtype) '.');
+    MvWAddCh(treescrn2, 10, 10, (chtype) ',');
+    MvWAddCh(treescrn2, 11, 9, (chtype) '\'');
+    MvWAddCh(treescrn2, 11, 8, (chtype) ':');
+    MvWAddCh(treescrn2, 11, 7, (chtype) '.');
+    MvWAddCh(treescrn2, 11, 6, (chtype) ',');
+    MvWAddCh(treescrn2, 12, 5, (chtype) '\'');
+
+    wattroff(treescrn2, A_BOLD | A_BLINK);
+    unset_color(treescrn2);
+
+    wrefresh(treescrn2);
+    wrefresh(w_del_msg);
+    return (0);
+}
+
+static int
+strng5(void)
+{
+    (void) wattrset(treescrn2, A_BOLD | A_BLINK);
+    set_color(treescrn2, COLOR_WHITE);
+
+    MvWAddCh(treescrn2, 11, 19, (chtype) '\'');
+    MvWAddCh(treescrn2, 11, 18, (chtype) ':');
+    MvWAddCh(treescrn2, 11, 17, (chtype) '.');
+    MvWAddCh(treescrn2, 11, 16, (chtype) ',');
+    MvWAddCh(treescrn2, 12, 15, (chtype) '\'');
+    MvWAddCh(treescrn2, 12, 14, (chtype) ':');
+    MvWAddCh(treescrn2, 12, 13, (chtype) '.');
+    MvWAddCh(treescrn2, 12, 12, (chtype) ',');
+
+    wattroff(treescrn2, A_BOLD | A_BLINK);
+    unset_color(treescrn2);
+
+    /* save a fully lit tree */
+    overlay(treescrn2, treescrn);
+
+    wrefresh(treescrn2);
+    wrefresh(w_del_msg);
+    return (0);
+}
+
+static int
+blinkit(void)
+{
+    static int cycle;
+
+    if (cycle > 4) {
+	cycle = 0;
+    }
+
+    touchwin(treescrn8);
+
+    switch (cycle) {
+    case 0:
+	overlay(treescrn3, treescrn8);
+	break;
+    case 1:
+	overlay(treescrn4, treescrn8);
+	break;
+    case 2:
+	overlay(treescrn5, treescrn8);
+	break;
+    case 3:
+	overlay(treescrn6, treescrn8);
+	break;
+    case 4:
+	overlay(treescrn7, treescrn8);
+	break;
+    }
+    touchwin(treescrn8);
+    wrefresh(treescrn8);
+    wrefresh(w_del_msg);
+    look_out(50);
+
+    /*ALL ON************************************************** */
+
+    overlay(treescrn, treescrn8);
+    wrefresh(treescrn8);
+    wrefresh(w_del_msg);
+    look_out(50);
+
+    ++cycle;
+    return (0);
+}
+
+static void
+deer_step(WINDOW *win, int y, int x)
+{
+    mvwin(win, y, x);
+    wrefresh(win);
+    wrefresh(w_del_msg);
+    look_out(5);
+}
+
+static int
+reindeer(void)
+{
+    int looper;
+    y_pos = 0;
+
+    for (x_pos = 70; x_pos > 62; x_pos--) {
+	for (looper = 0; looper < 4; looper++) {
+	    MvWAddCh(dotdeer0, y_pos, x_pos, (chtype) '.');
+	    wrefresh(dotdeer0);
+	    wrefresh(w_del_msg);
+	    werase(dotdeer0);
+	    wrefresh(dotdeer0);
+	    wrefresh(w_del_msg);
+	    look_out(50);
+	}
+    }
+
+    y_pos = 2;
+
+    for (; x_pos > 50; x_pos--) {
+	for (looper = 0; looper < 4; looper++) {
+
+	    if (x_pos < 56) {
+		y_pos = 3;
+
+		MvWAddCh(stardeer0, y_pos, x_pos, (chtype) '*');
+		wrefresh(stardeer0);
+		wrefresh(w_del_msg);
+		werase(stardeer0);
+		wrefresh(stardeer0);
+		wrefresh(w_del_msg);
+	    } else {
+		MvWAddCh(dotdeer0, y_pos, x_pos, (chtype) '*');
+		wrefresh(dotdeer0);
+		wrefresh(w_del_msg);
+		werase(dotdeer0);
+		wrefresh(dotdeer0);
+		wrefresh(w_del_msg);
+	    }
+	}
+    }
+
+    x_pos = 58;
+
+    for (y_pos = 2; y_pos < 5; y_pos++) {
+
+	touchwin(lildeer0);
+	wrefresh(lildeer0);
+	wrefresh(w_del_msg);
+
+	for (looper = 0; looper < 4; looper++) {
+	    deer_step(lildeer3, y_pos, x_pos);
+	    deer_step(lildeer2, y_pos, x_pos);
+	    deer_step(lildeer1, y_pos, x_pos);
+	    deer_step(lildeer2, y_pos, x_pos);
+	    deer_step(lildeer3, y_pos, x_pos);
+
+	    touchwin(lildeer0);
+	    wrefresh(lildeer0);
+	    wrefresh(w_del_msg);
+
+	    x_pos -= 2;
+	}
+    }
+
+    x_pos = 35;
+
+    for (y_pos = 5; y_pos < 10; y_pos++) {
+
+	touchwin(middeer0);
+	wrefresh(middeer0);
+	wrefresh(w_del_msg);
+
+	for (looper = 0; looper < 2; looper++) {
+	    deer_step(middeer3, y_pos, x_pos);
+	    deer_step(middeer2, y_pos, x_pos);
+	    deer_step(middeer1, y_pos, x_pos);
+	    deer_step(middeer2, y_pos, x_pos);
+	    deer_step(middeer3, y_pos, x_pos);
+
+	    touchwin(middeer0);
+	    wrefresh(middeer0);
+	    wrefresh(w_del_msg);
+
+	    x_pos -= 3;
+	}
+    }
+
+    look_out(300);
+
+    y_pos = 1;
+
+    for (x_pos = 8; x_pos < 16; x_pos++) {
+	deer_step(bigdeer4, y_pos, x_pos);
+	deer_step(bigdeer3, y_pos, x_pos);
+	deer_step(bigdeer2, y_pos, x_pos);
+	deer_step(bigdeer1, y_pos, x_pos);
+	deer_step(bigdeer2, y_pos, x_pos);
+	deer_step(bigdeer3, y_pos, x_pos);
+	deer_step(bigdeer4, y_pos, x_pos);
+	deer_step(bigdeer0, y_pos, x_pos);
+    }
+
+    --x_pos;
+
+    for (looper = 0; looper < 6; looper++) {
+	deer_step(lookdeer4, y_pos, x_pos);
+	deer_step(lookdeer3, y_pos, x_pos);
+	deer_step(lookdeer2, y_pos, x_pos);
+	deer_step(lookdeer1, y_pos, x_pos);
+	deer_step(lookdeer2, y_pos, x_pos);
+	deer_step(lookdeer3, y_pos, x_pos);
+	deer_step(lookdeer4, y_pos, x_pos);
+    }
+
+    deer_step(lookdeer0, y_pos, x_pos);
+
+    for (; y_pos < 10; y_pos++) {
+	for (looper = 0; looper < 2; looper++) {
+	    deer_step(bigdeer4, y_pos, x_pos);
+	    deer_step(bigdeer3, y_pos, x_pos);
+	    deer_step(bigdeer2, y_pos, x_pos);
+	    deer_step(bigdeer1, y_pos, x_pos);
+	    deer_step(bigdeer2, y_pos, x_pos);
+	    deer_step(bigdeer3, y_pos, x_pos);
+	    deer_step(bigdeer4, y_pos, x_pos);
+	}
+	deer_step(bigdeer0, y_pos, x_pos);
+    }
+
+    --y_pos;
+
+    deer_step(lookdeer3, y_pos, x_pos);
+    return (0);
+}
+
+static void
+done(int sig GCC_UNUSED)
+{
+    move(LINES - 1, 0);
+    refresh();
+    stop_curses();
+
+#if NO_LEAKS
+    if (my_pairs != 0)
+	free(my_pairs);
+#endif
+
+    ExitProgram(EXIT_SUCCESS);
+}
+
+static void
+usage(int ok)
+{
+    static const char *msg[] =
+    {
+	"Usage: xmas [options]"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+#if HAVE_USE_DEFAULT_COLORS
+	," -d       invoke use_default_colors"
+#endif
+	," -q       execute once, then quit"
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char *argv[])
+{
+    int ch;
+    int loopy;
+#if HAVE_USE_DEFAULT_COLORS
+    bool opt_d = FALSE;
+#endif
+    bool opt_q = FALSE;
+
+    while ((ch = getopt(argc, argv, OPTS_COMMON "dq")) != -1) {
+	switch (ch) {
+#if HAVE_USE_DEFAULT_COLORS
+	case 'd':
+	    opt_d = TRUE;
+	    break;
+#endif
+	case 'q':
+	    opt_q = TRUE;
+	    break;
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+
+    setlocale(LC_ALL, "");
+
+    InitAndCatch(initscr(), done);
+    noecho();
+    nonl();
+    refresh();
+
+    if (has_colors()) {
+	start_color();
+#if HAVE_USE_DEFAULT_COLORS
+	if (opt_d && (use_default_colors() == OK))
+	    my_bg = -1;
+#endif
+    }
+    curs_set(0);
+
+    if ((treescrn = newwin(16, 27, 3, 53)) == 0 ||
+	(treescrn2 = newwin(16, 27, 3, 53)) == 0 ||
+	(treescrn3 = newwin(16, 27, 3, 53)) == 0 ||
+	(treescrn4 = newwin(16, 27, 3, 53)) == 0 ||
+	(treescrn5 = newwin(16, 27, 3, 53)) == 0 ||
+	(treescrn6 = newwin(16, 27, 3, 53)) == 0 ||
+	(treescrn7 = newwin(16, 27, 3, 53)) == 0 ||
+	(treescrn8 = newwin(16, 27, 3, 53)) == 0 ||
+
+	(dotdeer0 = newwin(3, 71, 0, 8)) == 0 ||
+
+	(stardeer0 = newwin(4, 56, 0, 8)) == 0 ||
+
+	(lildeer0 = newwin(7, 53, 0, 8)) == 0 ||
+	(lildeer1 = newwin(2, 4, 0, 0)) == 0 ||
+	(lildeer2 = newwin(2, 4, 0, 0)) == 0 ||
+	(lildeer3 = newwin(2, 4, 0, 0)) == 0 ||
+
+	(middeer0 = newwin(15, 42, 0, 8)) == 0 ||
+	(middeer1 = newwin(3, 7, 0, 0)) == 0 ||
+	(middeer2 = newwin(3, 7, 0, 0)) == 0 ||
+	(middeer3 = newwin(3, 7, 0, 0)) == 0 ||
+
+	(bigdeer0 = newwin(10, 23, 0, 0)) == 0 ||
+	(bigdeer1 = newwin(10, 23, 0, 0)) == 0 ||
+	(bigdeer2 = newwin(10, 23, 0, 0)) == 0 ||
+	(bigdeer3 = newwin(10, 23, 0, 0)) == 0 ||
+	(bigdeer4 = newwin(10, 23, 0, 0)) == 0 ||
+
+	(lookdeer0 = newwin(10, 25, 0, 0)) == 0 ||
+	(lookdeer1 = newwin(10, 25, 0, 0)) == 0 ||
+	(lookdeer2 = newwin(10, 25, 0, 0)) == 0 ||
+	(lookdeer3 = newwin(10, 25, 0, 0)) == 0 ||
+	(lookdeer4 = newwin(10, 25, 0, 0)) == 0 ||
+
+	(w_holiday = newwin(1, 26, 3, 27)) == 0 ||
+
+	(w_del_msg = newwin(1, 19, 23, 60)) == 0) {
+	stop_curses();
+	fprintf(stderr, "Cannot create windows - screen too small\n");
+	ExitProgram(EXIT_FAILURE);
+    }
+
+    MvWAddStr(w_del_msg, 0, 0, "Hit any key to quit");
+
+    MvWAddStr(w_holiday, 0, 0, "H A P P Y  H O L I D A Y S");
+
+    /* set up the windows for our various reindeer */
+
+    /* lildeer1 */
+    MvWAddCh(lildeer1, 0, 0, (chtype) 'V');
+    MvWAddCh(lildeer1, 1, 0, (chtype) '@');
+    MvWAddCh(lildeer1, 1, 1, (chtype) '<');
+    MvWAddCh(lildeer1, 1, 2, (chtype) '>');
+    MvWAddCh(lildeer1, 1, 3, (chtype) '~');
+
+    /* lildeer2 */
+    MvWAddCh(lildeer2, 0, 0, (chtype) 'V');
+    MvWAddCh(lildeer2, 1, 0, (chtype) '@');
+    MvWAddCh(lildeer2, 1, 1, (chtype) '|');
+    MvWAddCh(lildeer2, 1, 2, (chtype) '|');
+    MvWAddCh(lildeer2, 1, 3, (chtype) '~');
+
+    /* lildeer3 */
+    MvWAddCh(lildeer3, 0, 0, (chtype) 'V');
+    MvWAddCh(lildeer3, 1, 0, (chtype) '@');
+    MvWAddCh(lildeer3, 1, 1, (chtype) '>');
+    MvWAddCh(lildeer3, 1, 2, (chtype) '<');
+    MvWAddCh(lildeer2, 1, 3, (chtype) '~');
+
+    /* middeer1 */
+    MvWAddCh(middeer1, 0, 2, (chtype) 'y');
+    MvWAddCh(middeer1, 0, 3, (chtype) 'y');
+    MvWAddCh(middeer1, 1, 2, (chtype) '0');
+    MvWAddCh(middeer1, 1, 3, (chtype) '(');
+    MvWAddCh(middeer1, 1, 4, (chtype) '=');
+    MvWAddCh(middeer1, 1, 5, (chtype) ')');
+    MvWAddCh(middeer1, 1, 6, (chtype) '~');
+    MvWAddCh(middeer1, 2, 3, (chtype) '\\');
+    MvWAddCh(middeer1, 2, 4, (chtype) '/');
+
+    /* middeer2 */
+    MvWAddCh(middeer2, 0, 2, (chtype) 'y');
+    MvWAddCh(middeer2, 0, 3, (chtype) 'y');
+    MvWAddCh(middeer2, 1, 2, (chtype) '0');
+    MvWAddCh(middeer2, 1, 3, (chtype) '(');
+    MvWAddCh(middeer2, 1, 4, (chtype) '=');
+    MvWAddCh(middeer2, 1, 5, (chtype) ')');
+    MvWAddCh(middeer2, 1, 6, (chtype) '~');
+    MvWAddCh(middeer2, 2, 3, (chtype) '|');
+    MvWAddCh(middeer2, 2, 5, (chtype) '|');
+
+    /* middeer3 */
+    MvWAddCh(middeer3, 0, 2, (chtype) 'y');
+    MvWAddCh(middeer3, 0, 3, (chtype) 'y');
+    MvWAddCh(middeer3, 1, 2, (chtype) '0');
+    MvWAddCh(middeer3, 1, 3, (chtype) '(');
+    MvWAddCh(middeer3, 1, 4, (chtype) '=');
+    MvWAddCh(middeer3, 1, 5, (chtype) ')');
+    MvWAddCh(middeer3, 1, 6, (chtype) '~');
+    MvWAddCh(middeer3, 2, 2, (chtype) '/');
+    MvWAddCh(middeer3, 2, 6, (chtype) '\\');
+
+    /* bigdeer1 */
+    MvWAddCh(bigdeer1, 0, 17, (chtype) '\\');
+    MvWAddCh(bigdeer1, 0, 18, (chtype) '/');
+    MvWAddCh(bigdeer1, 0, 20, (chtype) '\\');
+    MvWAddCh(bigdeer1, 0, 21, (chtype) '/');
+    MvWAddCh(bigdeer1, 1, 18, (chtype) '\\');
+    MvWAddCh(bigdeer1, 1, 20, (chtype) '/');
+    MvWAddCh(bigdeer1, 2, 19, (chtype) '|');
+    MvWAddCh(bigdeer1, 2, 20, (chtype) '_');
+    MvWAddCh(bigdeer1, 3, 18, (chtype) '/');
+    MvWAddCh(bigdeer1, 3, 19, (chtype) '^');
+    MvWAddCh(bigdeer1, 3, 20, (chtype) '0');
+    MvWAddCh(bigdeer1, 3, 21, (chtype) '\\');
+    MvWAddCh(bigdeer1, 4, 17, (chtype) '/');
+    MvWAddCh(bigdeer1, 4, 18, (chtype) '/');
+    MvWAddCh(bigdeer1, 4, 19, (chtype) '\\');
+    MvWAddCh(bigdeer1, 4, 22, (chtype) '\\');
+    MvWAddStr(bigdeer1, 5, 7, "^~~~~~~~~//  ~~U");
+    MvWAddStr(bigdeer1, 6, 7, "( \\_____( /");
+    MvWAddStr(bigdeer1, 7, 8, "( )    /");
+    MvWAddStr(bigdeer1, 8, 9, "\\\\   /");
+    MvWAddStr(bigdeer1, 9, 11, "\\>/>");
+
+    /* bigdeer2 */
+    MvWAddCh(bigdeer2, 0, 17, (chtype) '\\');
+    MvWAddCh(bigdeer2, 0, 18, (chtype) '/');
+    MvWAddCh(bigdeer2, 0, 20, (chtype) '\\');
+    MvWAddCh(bigdeer2, 0, 21, (chtype) '/');
+    MvWAddCh(bigdeer2, 1, 18, (chtype) '\\');
+    MvWAddCh(bigdeer2, 1, 20, (chtype) '/');
+    MvWAddCh(bigdeer2, 2, 19, (chtype) '|');
+    MvWAddCh(bigdeer2, 2, 20, (chtype) '_');
+    MvWAddCh(bigdeer2, 3, 18, (chtype) '/');
+    MvWAddCh(bigdeer2, 3, 19, (chtype) '^');
+    MvWAddCh(bigdeer2, 3, 20, (chtype) '0');
+    MvWAddCh(bigdeer2, 3, 21, (chtype) '\\');
+    MvWAddCh(bigdeer2, 4, 17, (chtype) '/');
+    MvWAddCh(bigdeer2, 4, 18, (chtype) '/');
+    MvWAddCh(bigdeer2, 4, 19, (chtype) '\\');
+    MvWAddCh(bigdeer2, 4, 22, (chtype) '\\');
+    MvWAddStr(bigdeer2, 5, 7, "^~~~~~~~~//  ~~U");
+    MvWAddStr(bigdeer2, 6, 7, "(( )____( /");
+    MvWAddStr(bigdeer2, 7, 7, "( /      |");
+    MvWAddStr(bigdeer2, 8, 8, "\\/      |");
+    MvWAddStr(bigdeer2, 9, 9, "|>     |>");
+
+    /* bigdeer3 */
+    MvWAddCh(bigdeer3, 0, 17, (chtype) '\\');
+    MvWAddCh(bigdeer3, 0, 18, (chtype) '/');
+    MvWAddCh(bigdeer3, 0, 20, (chtype) '\\');
+    MvWAddCh(bigdeer3, 0, 21, (chtype) '/');
+    MvWAddCh(bigdeer3, 1, 18, (chtype) '\\');
+    MvWAddCh(bigdeer3, 1, 20, (chtype) '/');
+    MvWAddCh(bigdeer3, 2, 19, (chtype) '|');
+    MvWAddCh(bigdeer3, 2, 20, (chtype) '_');
+    MvWAddCh(bigdeer3, 3, 18, (chtype) '/');
+    MvWAddCh(bigdeer3, 3, 19, (chtype) '^');
+    MvWAddCh(bigdeer3, 3, 20, (chtype) '0');
+    MvWAddCh(bigdeer3, 3, 21, (chtype) '\\');
+    MvWAddCh(bigdeer3, 4, 17, (chtype) '/');
+    MvWAddCh(bigdeer3, 4, 18, (chtype) '/');
+    MvWAddCh(bigdeer3, 4, 19, (chtype) '\\');
+    MvWAddCh(bigdeer3, 4, 22, (chtype) '\\');
+    MvWAddStr(bigdeer3, 5, 7, "^~~~~~~~~//  ~~U");
+    MvWAddStr(bigdeer3, 6, 6, "( ()_____( /");
+    MvWAddStr(bigdeer3, 7, 6, "/ /       /");
+    MvWAddStr(bigdeer3, 8, 5, "|/          \\");
+    MvWAddStr(bigdeer3, 9, 5, "/>           \\>");
+
+    /* bigdeer4 */
+    MvWAddCh(bigdeer4, 0, 17, (chtype) '\\');
+    MvWAddCh(bigdeer4, 0, 18, (chtype) '/');
+    MvWAddCh(bigdeer4, 0, 20, (chtype) '\\');
+    MvWAddCh(bigdeer4, 0, 21, (chtype) '/');
+    MvWAddCh(bigdeer4, 1, 18, (chtype) '\\');
+    MvWAddCh(bigdeer4, 1, 20, (chtype) '/');
+    MvWAddCh(bigdeer4, 2, 19, (chtype) '|');
+    MvWAddCh(bigdeer4, 2, 20, (chtype) '_');
+    MvWAddCh(bigdeer4, 3, 18, (chtype) '/');
+    MvWAddCh(bigdeer4, 3, 19, (chtype) '^');
+    MvWAddCh(bigdeer4, 3, 20, (chtype) '0');
+    MvWAddCh(bigdeer4, 3, 21, (chtype) '\\');
+    MvWAddCh(bigdeer4, 4, 17, (chtype) '/');
+    MvWAddCh(bigdeer4, 4, 18, (chtype) '/');
+    MvWAddCh(bigdeer4, 4, 19, (chtype) '\\');
+    MvWAddCh(bigdeer4, 4, 22, (chtype) '\\');
+    MvWAddStr(bigdeer4, 5, 7, "^~~~~~~~~//  ~~U");
+    MvWAddStr(bigdeer4, 6, 6, "( )______( /");
+    MvWAddStr(bigdeer4, 7, 5, "(/          \\");
+    MvWAddStr(bigdeer4, 8, 0, "v___=             ----^");
+
+    /* lookdeer1 */
+    MvWAddStr(lookdeer1, 0, 16, "\\/     \\/");
+    MvWAddStr(lookdeer1, 1, 17, "\\Y/ \\Y/");
+    MvWAddStr(lookdeer1, 2, 19, "\\=/");
+    MvWAddStr(lookdeer1, 3, 17, "^\\o o/^");
+    MvWAddStr(lookdeer1, 4, 17, "//( )");
+    MvWAddStr(lookdeer1, 5, 7, "^~~~~~~~~// \\O/");
+    MvWAddStr(lookdeer1, 6, 7, "( \\_____( /");
+    MvWAddStr(lookdeer1, 7, 8, "( )    /");
+    MvWAddStr(lookdeer1, 8, 9, "\\\\   /");
+    MvWAddStr(lookdeer1, 9, 11, "\\>/>");
+
+    /* lookdeer2 */
+    MvWAddStr(lookdeer2, 0, 16, "\\/     \\/");
+    MvWAddStr(lookdeer2, 1, 17, "\\Y/ \\Y/");
+    MvWAddStr(lookdeer2, 2, 19, "\\=/");
+    MvWAddStr(lookdeer2, 3, 17, "^\\o o/^");
+    MvWAddStr(lookdeer2, 4, 17, "//( )");
+    MvWAddStr(lookdeer2, 5, 7, "^~~~~~~~~// \\O/");
+    MvWAddStr(lookdeer2, 6, 7, "(( )____( /");
+    MvWAddStr(lookdeer2, 7, 7, "( /      |");
+    MvWAddStr(lookdeer2, 8, 8, "\\/      |");
+    MvWAddStr(lookdeer2, 9, 9, "|>     |>");
+
+    /* lookdeer3 */
+    MvWAddStr(lookdeer3, 0, 16, "\\/     \\/");
+    MvWAddStr(lookdeer3, 1, 17, "\\Y/ \\Y/");
+    MvWAddStr(lookdeer3, 2, 19, "\\=/");
+    MvWAddStr(lookdeer3, 3, 17, "^\\o o/^");
+    MvWAddStr(lookdeer3, 4, 17, "//( )");
+    MvWAddStr(lookdeer3, 5, 7, "^~~~~~~~~// \\O/");
+    MvWAddStr(lookdeer3, 6, 6, "( ()_____( /");
+    MvWAddStr(lookdeer3, 7, 6, "/ /       /");
+    MvWAddStr(lookdeer3, 8, 5, "|/          \\");
+    MvWAddStr(lookdeer3, 9, 5, "/>           \\>");
+
+    /* lookdeer4 */
+    MvWAddStr(lookdeer4, 0, 16, "\\/     \\/");
+    MvWAddStr(lookdeer4, 1, 17, "\\Y/ \\Y/");
+    MvWAddStr(lookdeer4, 2, 19, "\\=/");
+    MvWAddStr(lookdeer4, 3, 17, "^\\o o/^");
+    MvWAddStr(lookdeer4, 4, 17, "//( )");
+    MvWAddStr(lookdeer4, 5, 7, "^~~~~~~~~// \\O/");
+    MvWAddStr(lookdeer4, 6, 6, "( )______( /");
+    MvWAddStr(lookdeer4, 7, 5, "(/          \\");
+    MvWAddStr(lookdeer4, 8, 0, "v___=             ----^");
+
+	/***********************************************/
+    cbreak();
+    nodelay(stdscr, TRUE);
+    do {
+	clear();
+	werase(treescrn);
+	touchwin(w_del_msg);
+	touchwin(treescrn);
+	werase(treescrn2);
+	touchwin(treescrn2);
+	werase(treescrn8);
+	touchwin(treescrn8);
+	refresh();
+	look_out(150);
+	boxit();
+	refresh();
+	look_out(150);
+	seas();
+	refresh();
+	look_out(150);
+	greet();
+	refresh();
+	look_out(150);
+	fromwho();
+	refresh();
+	look_out(150);
+	tree();
+	look_out(150);
+	balls();
+	look_out(150);
+	star();
+	look_out(150);
+	strng1();
+	strng2();
+	strng3();
+	strng4();
+	strng5();
+
+	/* set up the windows for our blinking trees */
+	/* **************************************** */
+	/* treescrn3 */
+
+	overlay(treescrn, treescrn3);
+
+	/*balls */
+	MvWAddCh(treescrn3, 4, 18, ' ');
+	MvWAddCh(treescrn3, 7, 6, ' ');
+	MvWAddCh(treescrn3, 8, 19, ' ');
+	MvWAddCh(treescrn3, 11, 22, ' ');
+
+	/*star */
+	MvWAddCh(treescrn3, 0, 12, '*');
+
+	/*strng1 */
+	MvWAddCh(treescrn3, 3, 11, ' ');
+
+	/*strng2 */
+	MvWAddCh(treescrn3, 5, 13, ' ');
+	MvWAddCh(treescrn3, 6, 10, ' ');
+
+	/*strng3 */
+	MvWAddCh(treescrn3, 7, 16, ' ');
+	MvWAddCh(treescrn3, 7, 14, ' ');
+
+	/*strng4 */
+	MvWAddCh(treescrn3, 10, 13, ' ');
+	MvWAddCh(treescrn3, 10, 10, ' ');
+	MvWAddCh(treescrn3, 11, 8, ' ');
+
+	/*strng5 */
+	MvWAddCh(treescrn3, 11, 18, ' ');
+	MvWAddCh(treescrn3, 12, 13, ' ');
+
+	/* treescrn4 */
+
+	overlay(treescrn, treescrn4);
+
+	/*balls */
+	MvWAddCh(treescrn4, 3, 9, ' ');
+	MvWAddCh(treescrn4, 4, 16, ' ');
+	MvWAddCh(treescrn4, 7, 6, ' ');
+	MvWAddCh(treescrn4, 8, 19, ' ');
+	MvWAddCh(treescrn4, 11, 2, ' ');
+	MvWAddCh(treescrn4, 12, 23, ' ');
+
+	/*star */
+	(void) wstandout(treescrn4);
+	MvWAddCh(treescrn4, 0, 12, '*');
+	(void) wstandend(treescrn4);
+
+	/*strng1 */
+	MvWAddCh(treescrn4, 3, 13, ' ');
+
+	/*strng2 */
+
+	/*strng3 */
+	MvWAddCh(treescrn4, 7, 15, ' ');
+	MvWAddCh(treescrn4, 8, 11, ' ');
+
+	/*strng4 */
+	MvWAddCh(treescrn4, 9, 16, ' ');
+	MvWAddCh(treescrn4, 10, 12, ' ');
+	MvWAddCh(treescrn4, 11, 8, ' ');
+
+	/*strng5 */
+	MvWAddCh(treescrn4, 11, 18, ' ');
+	MvWAddCh(treescrn4, 12, 14, ' ');
+
+	/* treescrn5 */
+
+	overlay(treescrn, treescrn5);
+
+	/*balls */
+	MvWAddCh(treescrn5, 3, 15, ' ');
+	MvWAddCh(treescrn5, 10, 20, ' ');
+	MvWAddCh(treescrn5, 12, 1, ' ');
+
+	/*star */
+	MvWAddCh(treescrn5, 0, 12, '*');
+
+	/*strng1 */
+	MvWAddCh(treescrn5, 3, 11, ' ');
+
+	/*strng2 */
+	MvWAddCh(treescrn5, 5, 12, ' ');
+
+	/*strng3 */
+	MvWAddCh(treescrn5, 7, 14, ' ');
+	MvWAddCh(treescrn5, 8, 10, ' ');
+
+	/*strng4 */
+	MvWAddCh(treescrn5, 9, 15, ' ');
+	MvWAddCh(treescrn5, 10, 11, ' ');
+	MvWAddCh(treescrn5, 11, 7, ' ');
+
+	/*strng5 */
+	MvWAddCh(treescrn5, 11, 17, ' ');
+	MvWAddCh(treescrn5, 12, 13, ' ');
+
+	/* treescrn6 */
+
+	overlay(treescrn, treescrn6);
+
+	/*balls */
+	MvWAddCh(treescrn6, 6, 7, ' ');
+	MvWAddCh(treescrn6, 7, 18, ' ');
+	MvWAddCh(treescrn6, 10, 4, ' ');
+	MvWAddCh(treescrn6, 11, 23, ' ');
+
+	/*star */
+	(void) wstandout(treescrn6);
+	MvWAddCh(treescrn6, 0, 12, '*');
+	(void) wstandend(treescrn6);
+
+	/*strng1 */
+
+	/*strng2 */
+	MvWAddCh(treescrn6, 5, 11, ' ');
+
+	/*strng3 */
+	MvWAddCh(treescrn6, 7, 13, ' ');
+	MvWAddCh(treescrn6, 8, 9, ' ');
+
+	/*strng4 */
+	MvWAddCh(treescrn6, 9, 14, ' ');
+	MvWAddCh(treescrn6, 10, 10, ' ');
+	MvWAddCh(treescrn6, 11, 6, ' ');
+
+	/*strng5 */
+	MvWAddCh(treescrn6, 11, 16, ' ');
+	MvWAddCh(treescrn6, 12, 12, ' ');
+
+	/* treescrn7 */
+
+	overlay(treescrn, treescrn7);
+
+	/*balls */
+	MvWAddCh(treescrn7, 3, 15, ' ');
+	MvWAddCh(treescrn7, 6, 7, ' ');
+	MvWAddCh(treescrn7, 7, 18, ' ');
+	MvWAddCh(treescrn7, 10, 4, ' ');
+	MvWAddCh(treescrn7, 11, 22, ' ');
+
+	/*star */
+	MvWAddCh(treescrn7, 0, 12, '*');
+
+	/*strng1 */
+	MvWAddCh(treescrn7, 3, 12, ' ');
+
+	/*strng2 */
+	MvWAddCh(treescrn7, 5, 13, ' ');
+	MvWAddCh(treescrn7, 6, 9, ' ');
+
+	/*strng3 */
+	MvWAddCh(treescrn7, 7, 15, ' ');
+	MvWAddCh(treescrn7, 8, 11, ' ');
+
+	/*strng4 */
+	MvWAddCh(treescrn7, 9, 16, ' ');
+	MvWAddCh(treescrn7, 10, 12, ' ');
+	MvWAddCh(treescrn7, 11, 8, ' ');
+
+	/*strng5 */
+	MvWAddCh(treescrn7, 11, 18, ' ');
+	MvWAddCh(treescrn7, 12, 14, ' ');
+
+	look_out(150);
+	reindeer();
+
+	touchwin(w_holiday);
+	wrefresh(w_holiday);
+	wrefresh(w_del_msg);
+
+	look_out(500);
+	for (loopy = 0; loopy < 100; loopy++) {
+	    blinkit();
+	}
+    } while (!opt_q);
+    done(0);
+}
diff --git a/test/xterm-16color.dat b/test/xterm-16color.dat
new file mode 100644
index 0000000..075c44b
--- /dev/null
+++ b/test/xterm-16color.dat
@@ -0,0 +1,54 @@
+##############################################################################
+# Copyright 2020,2021 Thomas E. Dickey                                       #
+# Copyright 2004-2006,2016 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: xterm-16color.dat,v 1.5 2021/06/17 21:20:30 tom Exp $
+# This illustrates the predefined colors for XFree86 xterm's "xterm-16color".
+# If you set $TERM to "xterm-88color" (and have xterm compiled to support the
+# 88-color or 256-color feature), you can use the ncurses 'd' screen to
+# manipulate the colors shown in the screen.  The 'd' screen is limited to
+# the first 16 colors, and xterm happens to use the same first 16 colors in
+# the extended color models that support initc.
+#
+# The colors shown are for xterm patch #192.
+scale:255
+0:	  0   0   0		black
+1:	205   0	  0		red3
+2:	  0 205	  0		green3
+3:	205 205	  0		yellow3
+4:	  0   0 238		blue2
+5:	205   0 205		magenta3
+6:	  0 205 205		cyan3
+7:	229 229 229 		gray90
+8:	127 127 127 		gray50
+9:	255   0   0		red
+10:	  0 255   0		green
+11:	255 255   0		yellow
+12:	 92  92 255		customblue
+13:	255   0 255		magenta
+14:	  0 255 255		cyan
+15:	255 255 255		white
diff --git a/test/xterm-256color.dat b/test/xterm-256color.dat
new file mode 100644
index 0000000..28f518e
--- /dev/null
+++ b/test/xterm-256color.dat
@@ -0,0 +1,294 @@
+##############################################################################
+# Copyright 2020 Thomas E. Dickey                                            #
+# Copyright 2009,2016 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: xterm-256color.dat,v 1.3 2020/02/08 21:38:22 tom Exp $
+# This illustrates the predefined colors for xterm's "xterm-256color" feature.
+# If you set $TERM to "xterm-256color" (and have xterm compiled to support the
+# 256-color feature), you can use the ncurses 'd' screen to
+# manipulate the colors shown in the screen.  The 'd' screen is limited to
+# the first 16 colors, and xterm happens to use the same first 16 colors in
+# the extended color models that support initc.
+#
+# The colors shown are for xterm patch #192.
+scale:255
+0:	  0   0   0		black
+1:	205   0	  0		red3
+2:	  0 205	  0		green3
+3:	205 205	  0		yellow3
+4:	  0   0 238		blue2
+5:	205   0 205		magenta3
+6:	  0 205 205		cyan3
+7:	229 229 229 		gray90
+8:	127 127 127 		gray50
+9:	255   0   0		red
+10:	  0 255   0		green
+11:	255 255   0		yellow
+12:	 92  92 255		customblue
+13:	255   0 255		magenta
+14:	  0 255 255		cyan
+15:	255 255 255		white
+16:	  0   0   0
+17:	  0   0  95
+18:	  0   0 135
+19:	  0   0 175
+20:	  0   0 215
+21:	  0   0 255
+22:	  0  95   0
+23:	  0  95	 95
+24:	  0  95 135
+25:	  0  95 175
+26:	  0  95 215
+27:	  0  95 255
+28:	  0 135   0
+29:	  0 135  95
+30:	  0 135 135
+31:	  0 135 175
+32:	  0 135 215
+33:	  0 135 255
+34:	  0 175   0
+35:	  0 175  95
+36:	  0 175 135
+37:	  0 175 175
+38:	  0 175 215
+39:	  0 175 255
+40:	  0 215   0
+41:	  0 215  95
+42:	  0 215 135
+43:	  0 215 175
+44:	  0 215 215
+45:	  0 215 255
+46:	  0 255   0
+47:	  0 255  95
+48:	  0 255 135
+49:	  0 255 175
+50:	  0 255 215
+51:	  0 255 255
+52:	 95   0   0
+53:	 95   0  95
+54:	 95   0 135
+55:	 95   0 175
+56:	 95   0 215
+57:	 95   0 255
+58:	 95  95   0
+59:	 95  95  95
+60:	 95  95 135
+61:	 95  95 175
+62:	 95  95 215
+63:	 95  95 255
+64:	 95 135   0
+65:	 95 135  95
+66:	 95 135 135
+67:	 95 135 175
+68:	 95 135 215
+69:	 95 135 255
+70:	 95 175   0
+71:	 95 175  95
+72:	 95 175 135
+73:	 95 175 175
+74:	 95 175 215
+75:	 95 175 255
+76:	 95 215   0
+77:	 95 215  95
+78:	 95 215 135
+79:	 95 215 175
+80:	 95 215 215
+81:	 95 215 255
+82:	 95 255   0
+83:	 95 255  95
+84:	 95 255 135
+85:	 95 255 175
+86:	 95 255 215
+87:	 95 255 255
+88:	135   0   0
+89:	135   0  95
+90:	135   0 135
+91:	135   0 175
+92:	135   0 215
+93:	135   0 255
+94:	135  95   0
+95:	135  95  95
+96:	135  95 135
+97:	135  95 175
+98:	135  95 215
+99:	135  95 255
+100:	135 135   0
+101:	135 135  95
+102:	135 135 135
+103:	135 135 175
+104:	135 135 215
+105:	135 135 255
+106:	135 175   0
+107:	135 175  95
+108:	135 175 135
+109:	135 175 175
+110:	135 175 215
+111:	135 175 255
+112:	135 215   0
+113:	135 215  95
+114:	135 215 135
+115:	135 215 175
+116:	135 215 215
+117:	135 215 255
+118:	135 255   0
+119:	135 255  95
+120:	135 255 135
+121:	135 255 175
+122:	135 255 215
+123:	135 255 255
+124:	175   0   0
+125:	175   0  95
+126:	175   0 135
+127:	175   0 175
+128:	175   0 215
+129:	175   0 255
+130:	175  95   0
+131:	175  95  95
+132:	175  95 135
+133:	175  95 175
+134:	175  95 215
+135:	175  95 255
+136:	175 135   0
+137:	175 135  95
+138:	175 135 135
+139:	175 135 175
+140:	175 135 215
+141:	175 135 255
+142:	175 175   0
+143:	175 175  95
+144:	175 175 135
+145:	175 175 175
+146:	175 175 215
+147:	175 175 255
+148:	175 215   0
+149:	175 215  95
+150:	175 215 135
+151:	175 215 175
+152:	175 215 215
+153:	175 215 255
+154:	175 255   0
+155:	175 255  95
+156:	175 255 135
+157:	175 255 175
+158:	175 255 215
+159:	175 255 255
+160:	215   0   0
+161:	215   0  95
+162:	215   0 135
+163:	215   0 175
+164:	215   0 215
+165:	215   0 255
+166:	215  95   0
+167:	215  95  95
+168:	215  95 135
+169:	215  95 175
+170:	215  95 215
+171:	215  95 255
+172:	215 135   0
+173:	215 135  95
+174:	215 135 135
+175:	215 135 175
+176:	215 135 215
+177:	215 135 255
+178:	215 175   0
+179:	215 175  95
+180:	215 175 135
+181:	215 175 175
+182:	215 175 215
+183:	215 175 255
+184:	215 215   0
+185:	215 215  95
+186:	215 215 135
+187:	215 215 175
+188:	215 215 215
+189:	215 215 255
+190:	215 255   0
+191:	215 255  95
+192:	215 255 135
+193:	215 255 175
+194:	215 255 215
+195:	215 255 255
+196:	255   0   0
+197:	255   0  95
+198:	255   0 135
+199:	255   0 175
+200:	255   0 215
+201:	255   0 255
+202:	255  95   0
+203:	255  95  95
+204:	255  95 135
+205:	255  95 175
+206:	255  95 215
+207:	255  95 255
+208:	255 135   0
+209:	255 135  95
+210:	255 135 135
+211:	255 135 175
+212:	255 135 215
+213:	255 135 255
+214:	255 175   0
+215:	255 175  95
+216:	255 175 135
+217:	255 175 175
+218:	255 175 215
+219:	255 175 255
+220:	255 215   0
+221:	255 215  95
+222:	255 215 135
+223:	255 215 175
+224:	255 215 215
+225:	255 215 255
+226:	255 255   0
+227:	255 255  95
+228:	255 255 135
+229:	255 255 175
+230:	255 255 215
+231:	255 255 255
+232:	  8   8   8
+233:	 18  18  18
+234:	 28  28  28
+235:	 38  38  38
+236:	 48  48  48
+237:	 58  58  58
+238:	 68  68  68
+239:	 78  78  78
+240:	 88  88  88
+241:	 98  98  98
+242:	108 108 108
+243:	118 118 118
+244:	128 128 128
+245:	138 138 138
+246:	148 148 148
+247:	158 158 158
+248:	168 168 168
+249:	178 178 178
+250:	188 188 188
+251:	198 198 198
+252:	208 208 208
+253:	218 218 218
+254:	228 228 228
+255:	238 238 238
diff --git a/test/xterm-88color.dat b/test/xterm-88color.dat
new file mode 100644
index 0000000..48ee18b
--- /dev/null
+++ b/test/xterm-88color.dat
@@ -0,0 +1,126 @@
+##############################################################################
+# Copyright 2020 Thomas E. Dickey                                            #
+# Copyright 2005-2009,2016 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: xterm-88color.dat,v 1.5 2020/02/08 21:38:22 tom Exp $
+# This illustrates the predefined colors for xterm's "xterm-88color" feature.
+# If you set $TERM to "xterm-88color" (and have xterm compiled to support the
+# 88-color or 256-color feature), you can use the ncurses 'd' screen to
+# manipulate the colors shown in the screen.  The 'd' screen is limited to
+# the first 16 colors, and xterm happens to use the same first 16 colors in
+# the extended color models that support initc.
+#
+# The colors shown are for xterm patch #192.
+scale:255
+0:	  0   0   0		black
+1:	205   0	  0		red3
+2:	  0 205	  0		green3
+3:	205 205	  0		yellow3
+4:	  0   0 238		blue2
+5:	205   0 205		magenta3
+6:	  0 205 205		cyan3
+7:	229 229 229 		gray90
+8:	127 127 127 		gray50
+9:	255   0   0		red
+10:	  0 255   0		green
+11:	255 255   0		yellow
+12:	 92  92 255		customblue
+13:	255   0 255		magenta
+14:	  0 255 255		cyan
+15:	255 255 255		white
+16:	  0   0   0
+17:	  0   0 139
+18:	  0   0 205
+19:	  0   0 255
+20:	  0 139   0
+21:	  0 139 139
+22:	  0 139 205
+23:	  0 139 255
+24:	  0 205   0
+25:	  0 205 139
+26:	  0 205 205
+27:	  0 205 255
+28:	  0 255   0
+29:	  0 255 139
+30:	  0 255 205
+31:	  0 255 255
+32:	139   0   0
+33:	139   0 139
+34:	139   0 205
+35:	139   0 255
+36:	139 139   0
+37:	139 139 139
+38:	139 139 205
+39:	139 139 255
+40:	139 205   0
+41:	139 205 139
+42:	139 205 205
+43:	139 205 255
+44:	139 255   0
+45:	139 255 139
+46:	139 255 205
+47:	139 255 255
+48:	205   0   0
+49:	205   0 139
+50:	205   0 205
+51:	205   0 255
+52:	205 139   0
+53:	205 139 139
+54:	205 139 205
+55:	205 139 255
+56:	205 205   0
+57:	205 205 139
+58:	205 205 205
+59:	205 205 255
+60:	205 255   0
+61:	205 255 139
+62:	205 255 205
+63:	205 255 255
+64:	255   0   0
+65:	255   0 139
+66:	255   0 205
+67:	255   0 255
+68:	255 139   0
+69:	255 139 139
+70:	255 139 205
+71:	255 139 255
+72:	255 205   0
+73:	255 205 139
+74:	255 205 205
+75:	255 205 255
+76:	255 255   0
+77:	255 255 139
+78:	255 255 205
+79:	255 255 255
+80:	 46  46  46
+81:	 92  92  92
+82:	113 113 113
+83:	139 139 139
+84:	162 162 162
+85:	185 185 185
+86:	208 208 208
+87:	231 231 231
diff --git a/test/xterm-color_48x48.xpm b/test/xterm-color_48x48.xpm
new file mode 100644
index 0000000..d8a501f
--- /dev/null
+++ b/test/xterm-color_48x48.xpm
@@ -0,0 +1,61 @@
+/* XPM */
+static char * xterm_color_48x48_xpm[] = {
+"48 48 10 1",
+".	c None",
+" 	c #555500",
+"+	c #000000",
+"@	c #FFFFFF",
+"#	c #FF0000",
+"$	c #070700",
+"%	c #0B0B00",
+"&	c #FF8400",
+"*	c #49FF00",
+"=	c #60B7FF",
+"................................................",
+"......++++++++++++++++++++++++++++++++++........",
+".....+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++......",
+".....+@@@++++++++++++++++++++++++++++@@@+@+.....",
+".....+@@++++++++++++++++++++++++++++++@@+@@+....",
+".....+@++++++++++++++++++++++++++++++++@+@@@+...",
+".....+@++###++++###++++++++++++++++++++@+@@@@+..",
+".....+@+++##++++##+++++++++++++++++++++@+@@@@+..",
+".....+@++++##++##++++++++++++++++++++++@+@@@@+..",
+".....+@++++##++##++++++++++++++++++++++@+@@@@+..",
+".....+@+++++####+++++++++++++++++++++++@+@@@@+..",
+".....+@+++++####+++++++++++++++++++++++@+@@@@+..",
+".....+@++++++##++++++++++++++++++++++++@+@@@@+..",
+".....+@+++++####+++++++++++++++++++++++@+@@@@+..",
+".....+@+++++####+++++++++++++++++++++++@+@@@@+..",
+".....+@++++##++##++++++++++++++++++++++@+@@@@+..",
+".....+@++++##++##++++++++++++++++++++++@+@@@@+..",
+".....+@+++##++++##+++++++++++++++++++++@+@@@@+..",
+".....+@++###++++###++++++++++++++++++++@+@@@@+..",
+".....+@++++++++++++++++++++++++++++++++@+@@@@+..",
+".....+@$+++++++++++++++++++++++++++++++@+@@@@+..",
+".....+@%@@@@@@@+&&&&&++****+++==+++==++@+@@@@+..",
+".....+@++++@++++&++++++*+++*++==+++==++@+@@@@+..",
+".....+@++++@++++&++++++*+++*++=+=+=+=++@+@@@@+..",
+".....+@++++@++++&&&&+++****+++=+=+=+=++@+@@@@+..",
+".....+@++++@++++&++++++*+*++++=++=++=++@+@@@+...",
+".....+@++++@++++&++++++*++*+++=++=++=++@+@@@+...",
+".....+@++++@++++&&&&&++*+++*++=+++++=++@+@@+....",
+".....+@++++++++++++++++++++++++++++++++@+@@+....",
+".....+@++++++++++++++++++++++++++++++++@+@+.....",
+".....+@@++++++++++++++++++++++++++++++@@+@+.....",
+".....+@@@++++++++++++++++++++++++++++@@@++......",
+".....+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++......",
+"......++++++++++++++++++++++++++++++++++........",
+"................................................",
+"................................................",
+"......++++++++++++++++++++++++++++++++++++......",
+".....+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++......",
+".....+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@@++......",
+"....+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+@+......",
+"....+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@@+@+......",
+"...+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+@@+......",
+"...+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@@+@@+......",
+"..+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+@@+.......",
+"..+@++@++++++++++++++++++++++++++@++@+@+........",
+".+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+@+.........",
+".+++++++++++++++++++++++++++++++++++++..........",
+"................................................"};